From 10d255ed5142b45577a4ba8202a0ccaa41d690a1 Mon Sep 17 00:00:00 2001 From: CodeTempla Date: Wed, 20 May 2026 03:08:08 +0900 Subject: [PATCH] =?UTF-8?q?=EC=B5=9C=EC=A2=85=EC=99=84=EB=A3=8C=EB=B3=B4?= =?UTF-8?q?=EA=B3=A0=20=EB=B2=84=EC=A0=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 8 + ed780/hdtermd.cpp | 1857 + .../include/rapidjson/allocators.h | 284 + .../include/rapidjson/cursorstreamwrapper.h | 78 + .../include/rapidjson/document.h | 2646 + .../include/rapidjson/encodedstream.h | 299 + .../include/rapidjson/encodings.h | 716 + .../include/rapidjson/error/en.h | 74 + .../include/rapidjson/error/error.h | 161 + .../include/rapidjson/filereadstream.h | 99 + .../include/rapidjson/filewritestream.h | 104 + .../rapidjson-1.1.0/include/rapidjson/fwd.h | 151 + .../include/rapidjson/internal/biginteger.h | 290 + .../include/rapidjson/internal/diyfp.h | 271 + .../include/rapidjson/internal/dtoa.h | 245 + .../include/rapidjson/internal/ieee754.h | 78 + .../include/rapidjson/internal/itoa.h | 308 + .../include/rapidjson/internal/meta.h | 186 + .../include/rapidjson/internal/pow10.h | 55 + .../include/rapidjson/internal/regex.h | 732 + .../include/rapidjson/internal/stack.h | 231 + .../include/rapidjson/internal/strfunc.h | 69 + .../include/rapidjson/internal/strtod.h | 290 + .../include/rapidjson/internal/swap.h | 46 + .../include/rapidjson/istreamwrapper.h | 113 + .../include/rapidjson/memorybuffer.h | 70 + .../include/rapidjson/memorystream.h | 71 + .../include/rapidjson/msinttypes/inttypes.h | 316 + .../include/rapidjson/msinttypes/stdint.h | 300 + .../include/rapidjson/ostreamwrapper.h | 81 + .../include/rapidjson/pointer.h | 1357 + .../include/rapidjson/prettywriter.h | 277 + .../include/rapidjson/rapidjson.h | 654 + .../include/rapidjson/reader.h | 2230 + .../include/rapidjson/schema.h | 2494 + .../include/rapidjson/stream.h | 223 + .../include/rapidjson/stringbuffer.h | 121 + .../include/rapidjson/writer.h | 710 + .../include/atomic/gcc_builtins.h | 38 + .../include/atomic/generic-msvc.h | 115 + .../include/atomic/nolock.h | 48 + .../include/atomic/rwlock.h | 57 + .../include/atomic/x86-gcc.h | 69 + .../mysql-connector-c-6.0.2/include/base64.h | 49 + .../include/config-win.h | 392 + .../mysql-connector-c-6.0.2/include/decimal.h | 107 + .../mysql-connector-c-6.0.2/include/errmsg.h | 103 + .../mysql-connector-c-6.0.2/include/hash.h | 84 + .../include/keycache.h | 153 + .../mysql-connector-c-6.0.2/include/lf.h | 260 + .../mysql-connector-c-6.0.2/include/m_ctype.h | 654 + .../include/m_string.h | 393 + .../mysql-connector-c-6.0.2/include/my_aes.h | 65 + .../include/my_alarm.h | 58 + .../include/my_alloc.h | 51 + .../include/my_atomic.h | 254 + .../include/my_attribute.h | 63 + .../mysql-connector-c-6.0.2/include/my_base.h | 626 + .../mysql-connector-c-6.0.2/include/my_bit.h | 109 + .../include/my_bitmap.h | 182 + .../include/my_charsets.h | 57 + .../include/my_config.h | 295 + .../include/my_config.h.in | 295 + .../mysql-connector-c-6.0.2/include/my_dbug.h | 140 + .../mysql-connector-c-6.0.2/include/my_dir.h | 109 + .../include/my_getopt.h | 86 + .../include/my_global.h | 1616 + .../include/my_libwrap.h | 27 + .../mysql-connector-c-6.0.2/include/my_list.h | 45 + .../mysql-connector-c-6.0.2/include/my_md5.h | 54 + .../mysql-connector-c-6.0.2/include/my_net.h | 114 + .../include/my_no_pthread.h | 50 + .../include/my_nosys.h | 52 + .../include/my_pthread.h | 734 + .../include/my_stacktrace.h | 66 + .../mysql-connector-c-6.0.2/include/my_sys.h | 1082 + .../mysql-connector-c-6.0.2/include/my_time.h | 172 + .../mysql-connector-c-6.0.2/include/my_tree.h | 96 + .../mysql-connector-c-6.0.2/include/my_trie.h | 141 + .../include/my_uctype.h | 1479 + .../mysql-connector-c-6.0.2/include/my_vle.h | 38 + .../mysql-connector-c-6.0.2/include/my_xml.h | 89 + .../include/myisampack.h | 238 + .../mysql-connector-c-6.0.2/include/mysql.h | 755 + .../include/mysql.h.pp | 617 + .../include/mysql_com.h | 543 + .../include/mysql_time.h | 55 + .../include/mysql_version.h | 26 + .../include/mysql_version.h.in | 26 + .../include/mysqld_error.h | 730 + .../include/mysys/rijndael.h | 41 + .../include/mysys_err.h | 90 + .../mysql-connector-c-6.0.2/include/queues.h | 72 + .../include/service_versions.h | 24 + .../mysql-connector-c-6.0.2/include/sha1.h | 66 + .../mysql-connector-c-6.0.2/include/sha2.h | 72 + .../include/sql_common.h | 50 + .../include/sslopt-case.h | 28 + .../include/sslopt-longopts.h | 45 + .../include/sslopt-vars.h | 31 + .../mysql-connector-c-6.0.2/include/t_ctype.h | 254 + .../include/thr_alarm.h | 110 + .../include/thr_lock.h | 181 + .../mysql-connector-c-6.0.2/include/typelib.h | 39 + .../mysql-connector-c-6.0.2/include/violite.h | 222 + .../include/waiting_threads.h | 130 + .../mysql-connector-c-6.0.2/include/wqueue.h | 27 + .../linux/mysql-connector-c-6.0.2/libmysql.so | Bin 0 -> 2645352 bytes .../mysql-connector-c-6.0.2/libmysqlclient.a | Bin 0 -> 3424360 bytes .../openssl-1.0.2j/include/openssl/aes.h | 149 + .../openssl-1.0.2j/include/openssl/asn1.h | 1419 + .../openssl-1.0.2j/include/openssl/asn1_mac.h | 579 + .../openssl-1.0.2j/include/openssl/asn1t.h | 973 + .../openssl-1.0.2j/include/openssl/bio.h | 883 + .../openssl-1.0.2j/include/openssl/blowfish.h | 130 + .../linux/openssl-1.0.2j/include/openssl/bn.h | 951 + .../openssl-1.0.2j/include/openssl/buffer.h | 125 + .../openssl-1.0.2j/include/openssl/camellia.h | 132 + .../openssl-1.0.2j/include/openssl/cast.h | 107 + .../openssl-1.0.2j/include/openssl/cmac.h | 82 + .../openssl-1.0.2j/include/openssl/cms.h | 555 + .../openssl-1.0.2j/include/openssl/comp.h | 83 + .../openssl-1.0.2j/include/openssl/conf.h | 267 + .../openssl-1.0.2j/include/openssl/conf_api.h | 89 + .../openssl-1.0.2j/include/openssl/crypto.h | 661 + .../openssl-1.0.2j/include/openssl/des.h | 257 + .../openssl-1.0.2j/include/openssl/des_old.h | 497 + .../linux/openssl-1.0.2j/include/openssl/dh.h | 393 + .../openssl-1.0.2j/include/openssl/dsa.h | 332 + .../openssl-1.0.2j/include/openssl/dso.h | 451 + .../openssl-1.0.2j/include/openssl/dtls1.h | 272 + .../openssl-1.0.2j/include/openssl/e_os2.h | 328 + .../openssl-1.0.2j/include/openssl/ebcdic.h | 26 + .../linux/openssl-1.0.2j/include/openssl/ec.h | 1282 + .../openssl-1.0.2j/include/openssl/ecdh.h | 134 + .../openssl-1.0.2j/include/openssl/ecdsa.h | 335 + .../openssl-1.0.2j/include/openssl/engine.h | 960 + .../openssl-1.0.2j/include/openssl/err.h | 389 + .../openssl-1.0.2j/include/openssl/evp.h | 1534 + .../openssl-1.0.2j/include/openssl/hmac.h | 109 + .../openssl-1.0.2j/include/openssl/idea.h | 105 + .../openssl-1.0.2j/include/openssl/krb5_asn.h | 240 + .../openssl-1.0.2j/include/openssl/kssl.h | 197 + .../openssl-1.0.2j/include/openssl/lhash.h | 240 + .../openssl-1.0.2j/include/openssl/md4.h | 119 + .../openssl-1.0.2j/include/openssl/md5.h | 119 + .../openssl-1.0.2j/include/openssl/mdc2.h | 94 + .../openssl-1.0.2j/include/openssl/modes.h | 163 + .../openssl-1.0.2j/include/openssl/obj_mac.h | 4194 + .../openssl-1.0.2j/include/openssl/objects.h | 1143 + .../openssl-1.0.2j/include/openssl/ocsp.h | 637 + .../include/openssl/opensslconf.h | 270 + .../openssl-1.0.2j/include/openssl/opensslv.h | 97 + .../openssl-1.0.2j/include/openssl/ossl_typ.h | 213 + .../openssl-1.0.2j/include/openssl/pem.h | 617 + .../openssl-1.0.2j/include/openssl/pem2.h | 70 + .../openssl-1.0.2j/include/openssl/pkcs12.h | 342 + .../openssl-1.0.2j/include/openssl/pkcs7.h | 481 + .../openssl-1.0.2j/include/openssl/pqueue.h | 99 + .../openssl-1.0.2j/include/openssl/rand.h | 150 + .../openssl-1.0.2j/include/openssl/rc2.h | 103 + .../openssl-1.0.2j/include/openssl/rc4.h | 88 + .../openssl-1.0.2j/include/openssl/ripemd.h | 105 + .../openssl-1.0.2j/include/openssl/rsa.h | 664 + .../include/openssl/safestack.h | 2672 + .../openssl-1.0.2j/include/openssl/seed.h | 149 + .../openssl-1.0.2j/include/openssl/sha.h | 214 + .../openssl-1.0.2j/include/openssl/srp.h | 179 + .../openssl-1.0.2j/include/openssl/srtp.h | 147 + .../openssl-1.0.2j/include/openssl/ssl.h | 3163 + .../openssl-1.0.2j/include/openssl/ssl2.h | 265 + .../openssl-1.0.2j/include/openssl/ssl23.h | 84 + .../openssl-1.0.2j/include/openssl/ssl3.h | 774 + .../openssl-1.0.2j/include/openssl/stack.h | 107 + .../openssl-1.0.2j/include/openssl/symhacks.h | 516 + .../openssl-1.0.2j/include/openssl/tls1.h | 810 + .../linux/openssl-1.0.2j/include/openssl/ts.h | 865 + .../openssl-1.0.2j/include/openssl/txt_db.h | 112 + .../linux/openssl-1.0.2j/include/openssl/ui.h | 415 + .../include/openssl/ui_compat.h | 88 + .../openssl-1.0.2j/include/openssl/whrlpool.h | 41 + .../openssl-1.0.2j/include/openssl/x509.h | 1330 + .../openssl-1.0.2j/include/openssl/x509_vfy.h | 652 + .../openssl-1.0.2j/include/openssl/x509v3.h | 1055 + .../external/linux/openssl-1.0.2j/libcrypto.a | Bin 0 -> 4795236 bytes hdssd/external/linux/openssl-1.0.2j/libssl.a | Bin 0 -> 761286 bytes .../external/linux/sqlite-3.22.0/libsqlite3.a | Bin 0 -> 4805660 bytes hdssd/external/linux/sqlite-3.22.0/sqlite3.h | 10827 + .../external/linux/sqlite-3.22.0/sqlite3ext.h | 585 + hdssd/external/linux/zlib-1.2.11/crc32.h | 441 + hdssd/external/linux/zlib-1.2.11/deflate.h | 349 + hdssd/external/linux/zlib-1.2.11/gzguts.h | 218 + hdssd/external/linux/zlib-1.2.11/inffast.h | 11 + hdssd/external/linux/zlib-1.2.11/inffixed.h | 94 + hdssd/external/linux/zlib-1.2.11/inflate.h | 125 + hdssd/external/linux/zlib-1.2.11/inftrees.h | 62 + hdssd/external/linux/zlib-1.2.11/libz.a | Bin 0 -> 135146 bytes hdssd/external/linux/zlib-1.2.11/trees.h | 128 + hdssd/external/linux/zlib-1.2.11/zconf.h | 534 + hdssd/external/linux/zlib-1.2.11/zlib.h | 1912 + hdssd/external/linux/zlib-1.2.11/zutil.h | 271 + .../openssl-1.0.2j/include/openssl/aes.h | 149 + .../openssl-1.0.2j/include/openssl/asn1.h | 1419 + .../openssl-1.0.2j/include/openssl/asn1_mac.h | 579 + .../openssl-1.0.2j/include/openssl/asn1t.h | 973 + .../openssl-1.0.2j/include/openssl/bio.h | 883 + .../openssl-1.0.2j/include/openssl/blowfish.h | 130 + .../openssl-1.0.2j/include/openssl/bn.h | 951 + .../openssl-1.0.2j/include/openssl/buffer.h | 125 + .../openssl-1.0.2j/include/openssl/camellia.h | 132 + .../openssl-1.0.2j/include/openssl/cast.h | 107 + .../openssl-1.0.2j/include/openssl/cmac.h | 82 + .../openssl-1.0.2j/include/openssl/cms.h | 555 + .../openssl-1.0.2j/include/openssl/comp.h | 83 + .../openssl-1.0.2j/include/openssl/conf.h | 267 + .../openssl-1.0.2j/include/openssl/conf_api.h | 89 + .../openssl-1.0.2j/include/openssl/crypto.h | 661 + .../openssl-1.0.2j/include/openssl/des.h | 257 + .../openssl-1.0.2j/include/openssl/des_old.h | 497 + .../openssl-1.0.2j/include/openssl/dh.h | 393 + .../openssl-1.0.2j/include/openssl/dsa.h | 332 + .../openssl-1.0.2j/include/openssl/dso.h | 451 + .../openssl-1.0.2j/include/openssl/dtls1.h | 272 + .../openssl-1.0.2j/include/openssl/e_os2.h | 328 + .../openssl-1.0.2j/include/openssl/ebcdic.h | 26 + .../openssl-1.0.2j/include/openssl/ec.h | 1282 + .../openssl-1.0.2j/include/openssl/ecdh.h | 134 + .../openssl-1.0.2j/include/openssl/ecdsa.h | 335 + .../openssl-1.0.2j/include/openssl/engine.h | 960 + .../openssl-1.0.2j/include/openssl/err.h | 389 + .../openssl-1.0.2j/include/openssl/evp.h | 1534 + .../openssl-1.0.2j/include/openssl/hmac.h | 109 + .../openssl-1.0.2j/include/openssl/idea.h | 105 + .../openssl-1.0.2j/include/openssl/krb5_asn.h | 240 + .../openssl-1.0.2j/include/openssl/kssl.h | 197 + .../openssl-1.0.2j/include/openssl/lhash.h | 240 + .../openssl-1.0.2j/include/openssl/md4.h | 119 + .../openssl-1.0.2j/include/openssl/md5.h | 119 + .../openssl-1.0.2j/include/openssl/mdc2.h | 94 + .../openssl-1.0.2j/include/openssl/modes.h | 163 + .../openssl-1.0.2j/include/openssl/obj_mac.h | 4194 + .../openssl-1.0.2j/include/openssl/objects.h | 1143 + .../openssl-1.0.2j/include/openssl/ocsp.h | 637 + .../include/openssl/opensslconf.h | 273 + .../openssl-1.0.2j/include/openssl/opensslv.h | 97 + .../openssl-1.0.2j/include/openssl/ossl_typ.h | 213 + .../openssl-1.0.2j/include/openssl/pem.h | 617 + .../openssl-1.0.2j/include/openssl/pem2.h | 70 + .../openssl-1.0.2j/include/openssl/pkcs12.h | 342 + .../openssl-1.0.2j/include/openssl/pkcs7.h | 481 + .../openssl-1.0.2j/include/openssl/pqueue.h | 99 + .../openssl-1.0.2j/include/openssl/rand.h | 150 + .../openssl-1.0.2j/include/openssl/rc2.h | 103 + .../openssl-1.0.2j/include/openssl/rc4.h | 88 + .../openssl-1.0.2j/include/openssl/ripemd.h | 105 + .../openssl-1.0.2j/include/openssl/rsa.h | 664 + .../include/openssl/safestack.h | 2672 + .../openssl-1.0.2j/include/openssl/seed.h | 149 + .../openssl-1.0.2j/include/openssl/sha.h | 214 + .../openssl-1.0.2j/include/openssl/srp.h | 179 + .../openssl-1.0.2j/include/openssl/srtp.h | 147 + .../openssl-1.0.2j/include/openssl/ssl.h | 3163 + .../openssl-1.0.2j/include/openssl/ssl2.h | 265 + .../openssl-1.0.2j/include/openssl/ssl23.h | 84 + .../openssl-1.0.2j/include/openssl/ssl3.h | 774 + .../openssl-1.0.2j/include/openssl/stack.h | 107 + .../openssl-1.0.2j/include/openssl/symhacks.h | 516 + .../openssl-1.0.2j/include/openssl/tls1.h | 810 + .../openssl-1.0.2j/include/openssl/ts.h | 865 + .../openssl-1.0.2j/include/openssl/txt_db.h | 112 + .../openssl-1.0.2j/include/openssl/ui.h | 415 + .../include/openssl/ui_compat.h | 88 + .../openssl-1.0.2j/include/openssl/whrlpool.h | 41 + .../openssl-1.0.2j/include/openssl/x509.h | 1330 + .../openssl-1.0.2j/include/openssl/x509_vfy.h | 652 + .../openssl-1.0.2j/include/openssl/x509v3.h | 1055 + .../solaris/openssl-1.0.2j/libcrypto.a | Bin 0 -> 3135244 bytes .../external/solaris/openssl-1.0.2j/libssl.a | Bin 0 -> 532660 bytes .../solaris/sqlite-3.22.0/libsqlite3.a | Bin 0 -> 2307928 bytes .../external/solaris/sqlite-3.22.0/sqlite3.h | 10827 + .../solaris/sqlite-3.22.0/sqlite3ext.h | 585 + hdssd/external/solaris/zlib-1.2.11/crc32.h | 441 + hdssd/external/solaris/zlib-1.2.11/deflate.h | 349 + hdssd/external/solaris/zlib-1.2.11/gzguts.h | 218 + hdssd/external/solaris/zlib-1.2.11/inffast.h | 11 + hdssd/external/solaris/zlib-1.2.11/inffixed.h | 94 + hdssd/external/solaris/zlib-1.2.11/inflate.h | 125 + hdssd/external/solaris/zlib-1.2.11/inftrees.h | 62 + hdssd/external/solaris/zlib-1.2.11/libz.a | Bin 0 -> 109120 bytes hdssd/external/solaris/zlib-1.2.11/trees.h | 128 + hdssd/external/solaris/zlib-1.2.11/zconf.h | 534 + hdssd/external/solaris/zlib-1.2.11/zlib.h | 1912 + hdssd/external/solaris/zlib-1.2.11/zutil.h | 271 + .../include/atomic/gcc_builtins.h | 38 + .../include/atomic/generic-msvc.h | 115 + .../include/atomic/nolock.h | 48 + .../include/atomic/rwlock.h | 57 + .../include/atomic/x86-gcc.h | 69 + .../mysql-connector-c-6.0.2/include/base64.h | 49 + .../include/config-win.h | 392 + .../mysql-connector-c-6.0.2/include/decimal.h | 107 + .../mysql-connector-c-6.0.2/include/errmsg.h | 103 + .../mysql-connector-c-6.0.2/include/hash.h | 84 + .../include/keycache.h | 153 + .../win/mysql-connector-c-6.0.2/include/lf.h | 260 + .../mysql-connector-c-6.0.2/include/m_ctype.h | 654 + .../include/m_string.h | 393 + .../mysql-connector-c-6.0.2/include/my_aes.h | 65 + .../include/my_alarm.h | 58 + .../include/my_alloc.h | 51 + .../include/my_atomic.h | 254 + .../include/my_attribute.h | 63 + .../mysql-connector-c-6.0.2/include/my_base.h | 626 + .../mysql-connector-c-6.0.2/include/my_bit.h | 109 + .../include/my_bitmap.h | 182 + .../include/my_charsets.h | 57 + .../include/my_config.h | 295 + .../include/my_config.h.in | 295 + .../mysql-connector-c-6.0.2/include/my_dbug.h | 140 + .../mysql-connector-c-6.0.2/include/my_dir.h | 109 + .../include/my_getopt.h | 86 + .../include/my_global.h | 1616 + .../include/my_libwrap.h | 27 + .../mysql-connector-c-6.0.2/include/my_list.h | 45 + .../mysql-connector-c-6.0.2/include/my_md5.h | 54 + .../mysql-connector-c-6.0.2/include/my_net.h | 114 + .../include/my_no_pthread.h | 50 + .../include/my_nosys.h | 52 + .../include/my_pthread.h | 734 + .../include/my_stacktrace.h | 66 + .../mysql-connector-c-6.0.2/include/my_sys.h | 1082 + .../mysql-connector-c-6.0.2/include/my_time.h | 172 + .../mysql-connector-c-6.0.2/include/my_tree.h | 96 + .../mysql-connector-c-6.0.2/include/my_trie.h | 141 + .../include/my_uctype.h | 1479 + .../mysql-connector-c-6.0.2/include/my_vle.h | 38 + .../mysql-connector-c-6.0.2/include/my_xml.h | 89 + .../include/myisampack.h | 238 + .../mysql-connector-c-6.0.2/include/mysql.h | 755 + .../include/mysql.h.pp | 617 + .../include/mysql_com.h | 543 + .../include/mysql_time.h | 55 + .../include/mysql_version.h | 26 + .../include/mysql_version.h.in | 26 + .../include/mysqld_error.h | 730 + .../include/mysys/rijndael.h | 41 + .../include/mysys_err.h | 90 + .../mysql-connector-c-6.0.2/include/queues.h | 72 + .../include/service_versions.h | 24 + .../mysql-connector-c-6.0.2/include/sha1.h | 66 + .../mysql-connector-c-6.0.2/include/sha2.h | 72 + .../include/sql_common.h | 50 + .../include/sslopt-case.h | 28 + .../include/sslopt-longopts.h | 45 + .../include/sslopt-vars.h | 31 + .../mysql-connector-c-6.0.2/include/t_ctype.h | 254 + .../include/thr_alarm.h | 110 + .../include/thr_lock.h | 181 + .../mysql-connector-c-6.0.2/include/typelib.h | 39 + .../mysql-connector-c-6.0.2/include/violite.h | 222 + .../include/waiting_threads.h | 130 + .../mysql-connector-c-6.0.2/include/wqueue.h | 27 + .../win/mysql-connector-c-6.0.2/libmysql.dll | Bin 0 -> 2060288 bytes .../win/mysql-connector-c-6.0.2/libmysql.lib | Bin 0 -> 25594 bytes .../win/openssl/include/openssl/aes.h | 149 + .../win/openssl/include/openssl/asn1.h | 1419 + .../win/openssl/include/openssl/asn1_mac.h | 579 + .../win/openssl/include/openssl/asn1t.h | 973 + .../win/openssl/include/openssl/bio.h | 883 + .../win/openssl/include/openssl/blowfish.h | 130 + .../external/win/openssl/include/openssl/bn.h | 949 + .../win/openssl/include/openssl/buffer.h | 125 + .../win/openssl/include/openssl/camellia.h | 132 + .../win/openssl/include/openssl/cast.h | 107 + .../win/openssl/include/openssl/cmac.h | 82 + .../win/openssl/include/openssl/cms.h | 555 + .../win/openssl/include/openssl/comp.h | 79 + .../win/openssl/include/openssl/conf.h | 267 + .../win/openssl/include/openssl/conf_api.h | 89 + .../win/openssl/include/openssl/crypto.h | 661 + .../win/openssl/include/openssl/des.h | 257 + .../win/openssl/include/openssl/des_old.h | 497 + .../external/win/openssl/include/openssl/dh.h | 393 + .../win/openssl/include/openssl/dsa.h | 332 + .../win/openssl/include/openssl/dso.h | 451 + .../win/openssl/include/openssl/dtls1.h | 272 + .../win/openssl/include/openssl/e_os2.h | 328 + .../win/openssl/include/openssl/ebcdic.h | 26 + .../external/win/openssl/include/openssl/ec.h | 1282 + .../win/openssl/include/openssl/ecdh.h | 134 + .../win/openssl/include/openssl/ecdsa.h | 335 + .../win/openssl/include/openssl/engine.h | 960 + .../win/openssl/include/openssl/err.h | 389 + .../win/openssl/include/openssl/evp.h | 1534 + .../win/openssl/include/openssl/hmac.h | 109 + .../win/openssl/include/openssl/idea.h | 105 + .../win/openssl/include/openssl/krb5_asn.h | 240 + .../win/openssl/include/openssl/kssl.h | 197 + .../win/openssl/include/openssl/lhash.h | 240 + .../win/openssl/include/openssl/md4.h | 119 + .../win/openssl/include/openssl/md5.h | 119 + .../win/openssl/include/openssl/mdc2.h | 94 + .../win/openssl/include/openssl/modes.h | 163 + .../win/openssl/include/openssl/obj_mac.h | 4194 + .../win/openssl/include/openssl/objects.h | 1143 + .../win/openssl/include/openssl/ocsp.h | 637 + .../win/openssl/include/openssl/opensslconf.h | 271 + .../win/openssl/include/openssl/opensslv.h | 97 + .../win/openssl/include/openssl/ossl_typ.h | 211 + .../win/openssl/include/openssl/pem.h | 615 + .../win/openssl/include/openssl/pem2.h | 70 + .../win/openssl/include/openssl/pkcs12.h | 342 + .../win/openssl/include/openssl/pkcs7.h | 481 + .../win/openssl/include/openssl/pqueue.h | 99 + .../win/openssl/include/openssl/rand.h | 150 + .../win/openssl/include/openssl/rc2.h | 103 + .../win/openssl/include/openssl/rc4.h | 88 + .../win/openssl/include/openssl/ripemd.h | 105 + .../win/openssl/include/openssl/rsa.h | 664 + .../win/openssl/include/openssl/safestack.h | 2672 + .../win/openssl/include/openssl/seed.h | 149 + .../win/openssl/include/openssl/sha.h | 214 + .../win/openssl/include/openssl/srp.h | 179 + .../win/openssl/include/openssl/srtp.h | 147 + .../win/openssl/include/openssl/ssl.h | 3169 + .../win/openssl/include/openssl/ssl2.h | 265 + .../win/openssl/include/openssl/ssl23.h | 84 + .../win/openssl/include/openssl/ssl3.h | 774 + .../win/openssl/include/openssl/stack.h | 107 + .../win/openssl/include/openssl/symhacks.h | 516 + .../win/openssl/include/openssl/tls1.h | 810 + .../external/win/openssl/include/openssl/ts.h | 862 + .../win/openssl/include/openssl/txt_db.h | 112 + .../external/win/openssl/include/openssl/ui.h | 415 + .../win/openssl/include/openssl/ui_compat.h | 88 + .../win/openssl/include/openssl/whrlpool.h | 41 + .../win/openssl/include/openssl/x509.h | 1327 + .../win/openssl/include/openssl/x509_vfy.h | 647 + .../win/openssl/include/openssl/x509v3.h | 1055 + hdssd/external/win/openssl/lib/libeay32.lib | Bin 0 -> 12788624 bytes hdssd/external/win/openssl/lib/ssleay32.lib | Bin 0 -> 2012700 bytes hdssd/external/win/sqlite/sqlite.lib | Bin 0 -> 2699114 bytes hdssd/external/win/sqlite/sqlite.sln | 20 + hdssd/external/win/sqlite/sqlite.vcproj | 179 + hdssd/external/win/sqlite/sqlite3.c | 199522 +++++++++++++++ hdssd/external/win/sqlite/sqlite3.h | 10371 + hdssd/external/win/sqlite/sqlite3ext.h | 560 + hdssd/external/win/zlib/adler32.c | 186 + hdssd/external/win/zlib/compress.c | 86 + hdssd/external/win/zlib/crc32.c | 442 + hdssd/external/win/zlib/crc32.h | 441 + hdssd/external/win/zlib/deflate.c | 2163 + hdssd/external/win/zlib/deflate.h | 349 + hdssd/external/win/zlib/gzclose.c | 25 + hdssd/external/win/zlib/gzguts.h | 218 + hdssd/external/win/zlib/gzlib.c | 637 + hdssd/external/win/zlib/gzread.c | 654 + hdssd/external/win/zlib/gzwrite.c | 665 + hdssd/external/win/zlib/infback.c | 640 + hdssd/external/win/zlib/inffast.c | 323 + hdssd/external/win/zlib/inffast.h | 11 + hdssd/external/win/zlib/inffixed.h | 94 + hdssd/external/win/zlib/inflate.c | 1561 + hdssd/external/win/zlib/inflate.h | 125 + hdssd/external/win/zlib/inftrees.c | 304 + hdssd/external/win/zlib/inftrees.h | 62 + hdssd/external/win/zlib/trees.c | 1203 + hdssd/external/win/zlib/trees.h | 128 + hdssd/external/win/zlib/uncompr.c | 93 + hdssd/external/win/zlib/zconf.h | 534 + hdssd/external/win/zlib/zlib.h | 1912 + hdssd/external/win/zlib/zlib.lib | Bin 0 -> 379192 bytes hdssd/external/win/zlib/zlib.sln | 20 + hdssd/external/win/zlib/zlib.vcproj | 270 + hdssd/external/win/zlib/zutil.c | 325 + hdssd/external/win/zlib/zutil.h | 271 + hdssd/huslib/BailBuffer.h | 48 + hdssd/huslib/BlockListBuffer.h | 397 + hdssd/huslib/Common.cpp | 109 + hdssd/huslib/Common.h | 372 + hdssd/huslib/Config.cpp | 69 + hdssd/huslib/Config.h | 36 + hdssd/huslib/DataStruct.h | 111 + hdssd/huslib/Defines.h | 17 + hdssd/huslib/EmailSender.h | 180 + hdssd/huslib/File.h | 130 + hdssd/huslib/Global.cpp | 25 + hdssd/huslib/Global.h | 21 + hdssd/huslib/HttpHandler.cpp | 550 + hdssd/huslib/HttpHandler.h | 58 + hdssd/huslib/HusApp.cpp | 111 + hdssd/huslib/HusApp.h | 21 + hdssd/huslib/Logger.cpp | 535 + hdssd/huslib/Logger.h | 389 + hdssd/huslib/Makefile | 125 + hdssd/huslib/MultiplexSocket.cpp | 765 + hdssd/huslib/MultiplexSocket.h | 486 + hdssd/huslib/MultiplexSslSocket.cpp | 627 + hdssd/huslib/MultiplexSslSocket.h | 72 + hdssd/huslib/MultiplexTransport.h | 511 + hdssd/huslib/NetUtil.cpp | 592 + hdssd/huslib/NetUtil.h | 35 + hdssd/huslib/Object.h | 16 + hdssd/huslib/ProtocolHandler.h | 93 + hdssd/huslib/Router.h | 16 + hdssd/huslib/Socket.h | 537 + hdssd/huslib/SohHandler.cpp | 118 + hdssd/huslib/SohHandler.h | 53 + hdssd/huslib/StreamBuffer.h | 130 + hdssd/huslib/String.h | 983 + hdssd/huslib/TelnetHandler.cpp | 106 + hdssd/huslib/TelnetHandler.h | 70 + hdssd/huslib/TelnetServer.cpp | 12 + hdssd/huslib/TelnetServer.h | 20 + hdssd/huslib/Thread.h | 453 + hdssd/huslib/Timer.cpp | 200 + hdssd/huslib/Timer.h | 74 + hdssd/huslib/VspHandler.cpp | 182 + hdssd/huslib/VspHandler.h | 59 + hdssd/huslib/WebServer.cpp | 206 + hdssd/huslib/WebServer.h | 54 + hdssd/huslib/Zlibex.h | 65 + hdssd/huslib/hsparser.cpp | 551 + hdssd/huslib/hsparser.h | 117 + hdssd/huslib/huslib.h | 66 + hdssd/huslib/huslibex.h | 62 + hdssd/huslib/inifile.cpp | 716 + hdssd/huslib/inifile.h | 90 + hdssd/huslib/libhuslib.a | Bin 0 -> 3275154 bytes hdssd/huslib/stringex.cpp | 811 + hdssd/huslib/stringex.h | 235 + hdssd/huslib/windows/DebugAssist.h | 114 + hdssd/huslib/windows/WinService.cpp | 645 + hdssd/huslib/windows/WinService.h | 120 + hdssd/workspace/hdssd/ClientChannel.cpp | 468 + hdssd/workspace/hdssd/ClientChannel.h | 38 + hdssd/workspace/hdssd/HttpChannel.cpp | 282 + hdssd/workspace/hdssd/HttpChannel.h | 39 + hdssd/workspace/hdssd/MainConfig.cpp | 96 + hdssd/workspace/hdssd/MainConfig.h | 58 + hdssd/workspace/hdssd/Makefile | 16 + hdssd/workspace/hdssd/bin/hdssd | Bin 0 -> 1520104 bytes hdssd/workspace/hdssd/bin/hdssd.exe | Bin 0 -> 1863680 bytes hdssd/workspace/hdssd/bin/hdssd.ini | 9 + hdssd/workspace/hdssd/hdssd.Makefile | 145 + hdssd/workspace/hdssd/hdssd.cpp | 296 + hdssd/workspace/hdssd/hdssd.sln | 19 + hdssd/workspace/hdssd/hdssd.vcproj | 464 + 548 files changed, 435582 insertions(+) create mode 100644 .gitignore create mode 100644 ed780/hdtermd.cpp create mode 100644 hdssd/external/common/rapidjson-1.1.0/include/rapidjson/allocators.h create mode 100644 hdssd/external/common/rapidjson-1.1.0/include/rapidjson/cursorstreamwrapper.h create mode 100644 hdssd/external/common/rapidjson-1.1.0/include/rapidjson/document.h create mode 100644 hdssd/external/common/rapidjson-1.1.0/include/rapidjson/encodedstream.h create mode 100644 hdssd/external/common/rapidjson-1.1.0/include/rapidjson/encodings.h create mode 100644 hdssd/external/common/rapidjson-1.1.0/include/rapidjson/error/en.h create mode 100644 hdssd/external/common/rapidjson-1.1.0/include/rapidjson/error/error.h create mode 100644 hdssd/external/common/rapidjson-1.1.0/include/rapidjson/filereadstream.h create mode 100644 hdssd/external/common/rapidjson-1.1.0/include/rapidjson/filewritestream.h create mode 100644 hdssd/external/common/rapidjson-1.1.0/include/rapidjson/fwd.h create mode 100644 hdssd/external/common/rapidjson-1.1.0/include/rapidjson/internal/biginteger.h create mode 100644 hdssd/external/common/rapidjson-1.1.0/include/rapidjson/internal/diyfp.h create mode 100644 hdssd/external/common/rapidjson-1.1.0/include/rapidjson/internal/dtoa.h create mode 100644 hdssd/external/common/rapidjson-1.1.0/include/rapidjson/internal/ieee754.h create mode 100644 hdssd/external/common/rapidjson-1.1.0/include/rapidjson/internal/itoa.h create mode 100644 hdssd/external/common/rapidjson-1.1.0/include/rapidjson/internal/meta.h create mode 100644 hdssd/external/common/rapidjson-1.1.0/include/rapidjson/internal/pow10.h create mode 100644 hdssd/external/common/rapidjson-1.1.0/include/rapidjson/internal/regex.h create mode 100644 hdssd/external/common/rapidjson-1.1.0/include/rapidjson/internal/stack.h create mode 100644 hdssd/external/common/rapidjson-1.1.0/include/rapidjson/internal/strfunc.h create mode 100644 hdssd/external/common/rapidjson-1.1.0/include/rapidjson/internal/strtod.h create mode 100644 hdssd/external/common/rapidjson-1.1.0/include/rapidjson/internal/swap.h create mode 100644 hdssd/external/common/rapidjson-1.1.0/include/rapidjson/istreamwrapper.h create mode 100644 hdssd/external/common/rapidjson-1.1.0/include/rapidjson/memorybuffer.h create mode 100644 hdssd/external/common/rapidjson-1.1.0/include/rapidjson/memorystream.h create mode 100644 hdssd/external/common/rapidjson-1.1.0/include/rapidjson/msinttypes/inttypes.h create mode 100644 hdssd/external/common/rapidjson-1.1.0/include/rapidjson/msinttypes/stdint.h create mode 100644 hdssd/external/common/rapidjson-1.1.0/include/rapidjson/ostreamwrapper.h create mode 100644 hdssd/external/common/rapidjson-1.1.0/include/rapidjson/pointer.h create mode 100644 hdssd/external/common/rapidjson-1.1.0/include/rapidjson/prettywriter.h create mode 100644 hdssd/external/common/rapidjson-1.1.0/include/rapidjson/rapidjson.h create mode 100644 hdssd/external/common/rapidjson-1.1.0/include/rapidjson/reader.h create mode 100644 hdssd/external/common/rapidjson-1.1.0/include/rapidjson/schema.h create mode 100644 hdssd/external/common/rapidjson-1.1.0/include/rapidjson/stream.h create mode 100644 hdssd/external/common/rapidjson-1.1.0/include/rapidjson/stringbuffer.h create mode 100644 hdssd/external/common/rapidjson-1.1.0/include/rapidjson/writer.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/atomic/gcc_builtins.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/atomic/generic-msvc.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/atomic/nolock.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/atomic/rwlock.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/atomic/x86-gcc.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/base64.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/config-win.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/decimal.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/errmsg.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/hash.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/keycache.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/lf.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/m_ctype.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/m_string.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/my_aes.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/my_alarm.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/my_alloc.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/my_atomic.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/my_attribute.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/my_base.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/my_bit.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/my_bitmap.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/my_charsets.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/my_config.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/my_config.h.in create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/my_dbug.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/my_dir.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/my_getopt.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/my_global.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/my_libwrap.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/my_list.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/my_md5.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/my_net.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/my_no_pthread.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/my_nosys.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/my_pthread.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/my_stacktrace.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/my_sys.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/my_time.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/my_tree.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/my_trie.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/my_uctype.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/my_vle.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/my_xml.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/myisampack.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/mysql.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/mysql.h.pp create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/mysql_com.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/mysql_time.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/mysql_version.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/mysql_version.h.in create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/mysqld_error.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/mysys/rijndael.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/mysys_err.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/queues.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/service_versions.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/sha1.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/sha2.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/sql_common.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/sslopt-case.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/sslopt-longopts.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/sslopt-vars.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/t_ctype.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/thr_alarm.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/thr_lock.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/typelib.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/violite.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/waiting_threads.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/include/wqueue.h create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/libmysql.so create mode 100644 hdssd/external/linux/mysql-connector-c-6.0.2/libmysqlclient.a create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/aes.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/asn1.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/asn1_mac.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/asn1t.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/bio.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/blowfish.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/bn.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/buffer.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/camellia.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/cast.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/cmac.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/cms.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/comp.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/conf.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/conf_api.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/crypto.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/des.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/des_old.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/dh.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/dsa.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/dso.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/dtls1.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/e_os2.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/ebcdic.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/ec.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/ecdh.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/ecdsa.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/engine.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/err.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/evp.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/hmac.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/idea.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/krb5_asn.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/kssl.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/lhash.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/md4.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/md5.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/mdc2.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/modes.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/obj_mac.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/objects.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/ocsp.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/opensslconf.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/opensslv.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/ossl_typ.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/pem.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/pem2.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/pkcs12.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/pkcs7.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/pqueue.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/rand.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/rc2.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/rc4.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/ripemd.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/rsa.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/safestack.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/seed.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/sha.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/srp.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/srtp.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/ssl.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/ssl2.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/ssl23.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/ssl3.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/stack.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/symhacks.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/tls1.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/ts.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/txt_db.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/ui.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/ui_compat.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/whrlpool.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/x509.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/x509_vfy.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/include/openssl/x509v3.h create mode 100644 hdssd/external/linux/openssl-1.0.2j/libcrypto.a create mode 100644 hdssd/external/linux/openssl-1.0.2j/libssl.a create mode 100644 hdssd/external/linux/sqlite-3.22.0/libsqlite3.a create mode 100644 hdssd/external/linux/sqlite-3.22.0/sqlite3.h create mode 100644 hdssd/external/linux/sqlite-3.22.0/sqlite3ext.h create mode 100644 hdssd/external/linux/zlib-1.2.11/crc32.h create mode 100644 hdssd/external/linux/zlib-1.2.11/deflate.h create mode 100644 hdssd/external/linux/zlib-1.2.11/gzguts.h create mode 100644 hdssd/external/linux/zlib-1.2.11/inffast.h create mode 100644 hdssd/external/linux/zlib-1.2.11/inffixed.h create mode 100644 hdssd/external/linux/zlib-1.2.11/inflate.h create mode 100644 hdssd/external/linux/zlib-1.2.11/inftrees.h create mode 100644 hdssd/external/linux/zlib-1.2.11/libz.a create mode 100644 hdssd/external/linux/zlib-1.2.11/trees.h create mode 100644 hdssd/external/linux/zlib-1.2.11/zconf.h create mode 100644 hdssd/external/linux/zlib-1.2.11/zlib.h create mode 100644 hdssd/external/linux/zlib-1.2.11/zutil.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/aes.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/asn1.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/asn1_mac.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/asn1t.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/bio.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/blowfish.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/bn.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/buffer.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/camellia.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/cast.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/cmac.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/cms.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/comp.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/conf.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/conf_api.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/crypto.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/des.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/des_old.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/dh.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/dsa.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/dso.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/dtls1.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/e_os2.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/ebcdic.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/ec.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/ecdh.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/ecdsa.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/engine.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/err.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/evp.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/hmac.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/idea.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/krb5_asn.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/kssl.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/lhash.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/md4.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/md5.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/mdc2.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/modes.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/obj_mac.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/objects.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/ocsp.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/opensslconf.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/opensslv.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/ossl_typ.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/pem.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/pem2.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/pkcs12.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/pkcs7.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/pqueue.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/rand.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/rc2.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/rc4.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/ripemd.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/rsa.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/safestack.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/seed.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/sha.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/srp.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/srtp.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/ssl.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/ssl2.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/ssl23.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/ssl3.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/stack.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/symhacks.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/tls1.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/ts.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/txt_db.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/ui.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/ui_compat.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/whrlpool.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/x509.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/x509_vfy.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/include/openssl/x509v3.h create mode 100644 hdssd/external/solaris/openssl-1.0.2j/libcrypto.a create mode 100644 hdssd/external/solaris/openssl-1.0.2j/libssl.a create mode 100644 hdssd/external/solaris/sqlite-3.22.0/libsqlite3.a create mode 100644 hdssd/external/solaris/sqlite-3.22.0/sqlite3.h create mode 100644 hdssd/external/solaris/sqlite-3.22.0/sqlite3ext.h create mode 100644 hdssd/external/solaris/zlib-1.2.11/crc32.h create mode 100644 hdssd/external/solaris/zlib-1.2.11/deflate.h create mode 100644 hdssd/external/solaris/zlib-1.2.11/gzguts.h create mode 100644 hdssd/external/solaris/zlib-1.2.11/inffast.h create mode 100644 hdssd/external/solaris/zlib-1.2.11/inffixed.h create mode 100644 hdssd/external/solaris/zlib-1.2.11/inflate.h create mode 100644 hdssd/external/solaris/zlib-1.2.11/inftrees.h create mode 100644 hdssd/external/solaris/zlib-1.2.11/libz.a create mode 100644 hdssd/external/solaris/zlib-1.2.11/trees.h create mode 100644 hdssd/external/solaris/zlib-1.2.11/zconf.h create mode 100644 hdssd/external/solaris/zlib-1.2.11/zlib.h create mode 100644 hdssd/external/solaris/zlib-1.2.11/zutil.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/atomic/gcc_builtins.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/atomic/generic-msvc.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/atomic/nolock.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/atomic/rwlock.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/atomic/x86-gcc.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/base64.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/config-win.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/decimal.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/errmsg.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/hash.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/keycache.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/lf.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/m_ctype.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/m_string.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/my_aes.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/my_alarm.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/my_alloc.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/my_atomic.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/my_attribute.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/my_base.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/my_bit.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/my_bitmap.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/my_charsets.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/my_config.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/my_config.h.in create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/my_dbug.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/my_dir.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/my_getopt.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/my_global.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/my_libwrap.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/my_list.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/my_md5.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/my_net.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/my_no_pthread.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/my_nosys.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/my_pthread.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/my_stacktrace.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/my_sys.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/my_time.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/my_tree.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/my_trie.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/my_uctype.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/my_vle.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/my_xml.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/myisampack.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/mysql.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/mysql.h.pp create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/mysql_com.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/mysql_time.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/mysql_version.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/mysql_version.h.in create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/mysqld_error.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/mysys/rijndael.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/mysys_err.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/queues.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/service_versions.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/sha1.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/sha2.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/sql_common.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/sslopt-case.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/sslopt-longopts.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/sslopt-vars.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/t_ctype.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/thr_alarm.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/thr_lock.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/typelib.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/violite.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/waiting_threads.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/include/wqueue.h create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/libmysql.dll create mode 100644 hdssd/external/win/mysql-connector-c-6.0.2/libmysql.lib create mode 100644 hdssd/external/win/openssl/include/openssl/aes.h create mode 100644 hdssd/external/win/openssl/include/openssl/asn1.h create mode 100644 hdssd/external/win/openssl/include/openssl/asn1_mac.h create mode 100644 hdssd/external/win/openssl/include/openssl/asn1t.h create mode 100644 hdssd/external/win/openssl/include/openssl/bio.h create mode 100644 hdssd/external/win/openssl/include/openssl/blowfish.h create mode 100644 hdssd/external/win/openssl/include/openssl/bn.h create mode 100644 hdssd/external/win/openssl/include/openssl/buffer.h create mode 100644 hdssd/external/win/openssl/include/openssl/camellia.h create mode 100644 hdssd/external/win/openssl/include/openssl/cast.h create mode 100644 hdssd/external/win/openssl/include/openssl/cmac.h create mode 100644 hdssd/external/win/openssl/include/openssl/cms.h create mode 100644 hdssd/external/win/openssl/include/openssl/comp.h create mode 100644 hdssd/external/win/openssl/include/openssl/conf.h create mode 100644 hdssd/external/win/openssl/include/openssl/conf_api.h create mode 100644 hdssd/external/win/openssl/include/openssl/crypto.h create mode 100644 hdssd/external/win/openssl/include/openssl/des.h create mode 100644 hdssd/external/win/openssl/include/openssl/des_old.h create mode 100644 hdssd/external/win/openssl/include/openssl/dh.h create mode 100644 hdssd/external/win/openssl/include/openssl/dsa.h create mode 100644 hdssd/external/win/openssl/include/openssl/dso.h create mode 100644 hdssd/external/win/openssl/include/openssl/dtls1.h create mode 100644 hdssd/external/win/openssl/include/openssl/e_os2.h create mode 100644 hdssd/external/win/openssl/include/openssl/ebcdic.h create mode 100644 hdssd/external/win/openssl/include/openssl/ec.h create mode 100644 hdssd/external/win/openssl/include/openssl/ecdh.h create mode 100644 hdssd/external/win/openssl/include/openssl/ecdsa.h create mode 100644 hdssd/external/win/openssl/include/openssl/engine.h create mode 100644 hdssd/external/win/openssl/include/openssl/err.h create mode 100644 hdssd/external/win/openssl/include/openssl/evp.h create mode 100644 hdssd/external/win/openssl/include/openssl/hmac.h create mode 100644 hdssd/external/win/openssl/include/openssl/idea.h create mode 100644 hdssd/external/win/openssl/include/openssl/krb5_asn.h create mode 100644 hdssd/external/win/openssl/include/openssl/kssl.h create mode 100644 hdssd/external/win/openssl/include/openssl/lhash.h create mode 100644 hdssd/external/win/openssl/include/openssl/md4.h create mode 100644 hdssd/external/win/openssl/include/openssl/md5.h create mode 100644 hdssd/external/win/openssl/include/openssl/mdc2.h create mode 100644 hdssd/external/win/openssl/include/openssl/modes.h create mode 100644 hdssd/external/win/openssl/include/openssl/obj_mac.h create mode 100644 hdssd/external/win/openssl/include/openssl/objects.h create mode 100644 hdssd/external/win/openssl/include/openssl/ocsp.h create mode 100644 hdssd/external/win/openssl/include/openssl/opensslconf.h create mode 100644 hdssd/external/win/openssl/include/openssl/opensslv.h create mode 100644 hdssd/external/win/openssl/include/openssl/ossl_typ.h create mode 100644 hdssd/external/win/openssl/include/openssl/pem.h create mode 100644 hdssd/external/win/openssl/include/openssl/pem2.h create mode 100644 hdssd/external/win/openssl/include/openssl/pkcs12.h create mode 100644 hdssd/external/win/openssl/include/openssl/pkcs7.h create mode 100644 hdssd/external/win/openssl/include/openssl/pqueue.h create mode 100644 hdssd/external/win/openssl/include/openssl/rand.h create mode 100644 hdssd/external/win/openssl/include/openssl/rc2.h create mode 100644 hdssd/external/win/openssl/include/openssl/rc4.h create mode 100644 hdssd/external/win/openssl/include/openssl/ripemd.h create mode 100644 hdssd/external/win/openssl/include/openssl/rsa.h create mode 100644 hdssd/external/win/openssl/include/openssl/safestack.h create mode 100644 hdssd/external/win/openssl/include/openssl/seed.h create mode 100644 hdssd/external/win/openssl/include/openssl/sha.h create mode 100644 hdssd/external/win/openssl/include/openssl/srp.h create mode 100644 hdssd/external/win/openssl/include/openssl/srtp.h create mode 100644 hdssd/external/win/openssl/include/openssl/ssl.h create mode 100644 hdssd/external/win/openssl/include/openssl/ssl2.h create mode 100644 hdssd/external/win/openssl/include/openssl/ssl23.h create mode 100644 hdssd/external/win/openssl/include/openssl/ssl3.h create mode 100644 hdssd/external/win/openssl/include/openssl/stack.h create mode 100644 hdssd/external/win/openssl/include/openssl/symhacks.h create mode 100644 hdssd/external/win/openssl/include/openssl/tls1.h create mode 100644 hdssd/external/win/openssl/include/openssl/ts.h create mode 100644 hdssd/external/win/openssl/include/openssl/txt_db.h create mode 100644 hdssd/external/win/openssl/include/openssl/ui.h create mode 100644 hdssd/external/win/openssl/include/openssl/ui_compat.h create mode 100644 hdssd/external/win/openssl/include/openssl/whrlpool.h create mode 100644 hdssd/external/win/openssl/include/openssl/x509.h create mode 100644 hdssd/external/win/openssl/include/openssl/x509_vfy.h create mode 100644 hdssd/external/win/openssl/include/openssl/x509v3.h create mode 100644 hdssd/external/win/openssl/lib/libeay32.lib create mode 100644 hdssd/external/win/openssl/lib/ssleay32.lib create mode 100644 hdssd/external/win/sqlite/sqlite.lib create mode 100644 hdssd/external/win/sqlite/sqlite.sln create mode 100644 hdssd/external/win/sqlite/sqlite.vcproj create mode 100644 hdssd/external/win/sqlite/sqlite3.c create mode 100644 hdssd/external/win/sqlite/sqlite3.h create mode 100644 hdssd/external/win/sqlite/sqlite3ext.h create mode 100644 hdssd/external/win/zlib/adler32.c create mode 100644 hdssd/external/win/zlib/compress.c create mode 100644 hdssd/external/win/zlib/crc32.c create mode 100644 hdssd/external/win/zlib/crc32.h create mode 100644 hdssd/external/win/zlib/deflate.c create mode 100644 hdssd/external/win/zlib/deflate.h create mode 100644 hdssd/external/win/zlib/gzclose.c create mode 100644 hdssd/external/win/zlib/gzguts.h create mode 100644 hdssd/external/win/zlib/gzlib.c create mode 100644 hdssd/external/win/zlib/gzread.c create mode 100644 hdssd/external/win/zlib/gzwrite.c create mode 100644 hdssd/external/win/zlib/infback.c create mode 100644 hdssd/external/win/zlib/inffast.c create mode 100644 hdssd/external/win/zlib/inffast.h create mode 100644 hdssd/external/win/zlib/inffixed.h create mode 100644 hdssd/external/win/zlib/inflate.c create mode 100644 hdssd/external/win/zlib/inflate.h create mode 100644 hdssd/external/win/zlib/inftrees.c create mode 100644 hdssd/external/win/zlib/inftrees.h create mode 100644 hdssd/external/win/zlib/trees.c create mode 100644 hdssd/external/win/zlib/trees.h create mode 100644 hdssd/external/win/zlib/uncompr.c create mode 100644 hdssd/external/win/zlib/zconf.h create mode 100644 hdssd/external/win/zlib/zlib.h create mode 100644 hdssd/external/win/zlib/zlib.lib create mode 100644 hdssd/external/win/zlib/zlib.sln create mode 100644 hdssd/external/win/zlib/zlib.vcproj create mode 100644 hdssd/external/win/zlib/zutil.c create mode 100644 hdssd/external/win/zlib/zutil.h create mode 100644 hdssd/huslib/BailBuffer.h create mode 100644 hdssd/huslib/BlockListBuffer.h create mode 100644 hdssd/huslib/Common.cpp create mode 100644 hdssd/huslib/Common.h create mode 100644 hdssd/huslib/Config.cpp create mode 100644 hdssd/huslib/Config.h create mode 100644 hdssd/huslib/DataStruct.h create mode 100644 hdssd/huslib/Defines.h create mode 100644 hdssd/huslib/EmailSender.h create mode 100644 hdssd/huslib/File.h create mode 100644 hdssd/huslib/Global.cpp create mode 100644 hdssd/huslib/Global.h create mode 100644 hdssd/huslib/HttpHandler.cpp create mode 100644 hdssd/huslib/HttpHandler.h create mode 100644 hdssd/huslib/HusApp.cpp create mode 100644 hdssd/huslib/HusApp.h create mode 100644 hdssd/huslib/Logger.cpp create mode 100644 hdssd/huslib/Logger.h create mode 100644 hdssd/huslib/Makefile create mode 100644 hdssd/huslib/MultiplexSocket.cpp create mode 100644 hdssd/huslib/MultiplexSocket.h create mode 100644 hdssd/huslib/MultiplexSslSocket.cpp create mode 100644 hdssd/huslib/MultiplexSslSocket.h create mode 100644 hdssd/huslib/MultiplexTransport.h create mode 100644 hdssd/huslib/NetUtil.cpp create mode 100644 hdssd/huslib/NetUtil.h create mode 100644 hdssd/huslib/Object.h create mode 100644 hdssd/huslib/ProtocolHandler.h create mode 100644 hdssd/huslib/Router.h create mode 100644 hdssd/huslib/Socket.h create mode 100644 hdssd/huslib/SohHandler.cpp create mode 100644 hdssd/huslib/SohHandler.h create mode 100644 hdssd/huslib/StreamBuffer.h create mode 100644 hdssd/huslib/String.h create mode 100644 hdssd/huslib/TelnetHandler.cpp create mode 100644 hdssd/huslib/TelnetHandler.h create mode 100644 hdssd/huslib/TelnetServer.cpp create mode 100644 hdssd/huslib/TelnetServer.h create mode 100644 hdssd/huslib/Thread.h create mode 100644 hdssd/huslib/Timer.cpp create mode 100644 hdssd/huslib/Timer.h create mode 100644 hdssd/huslib/VspHandler.cpp create mode 100644 hdssd/huslib/VspHandler.h create mode 100644 hdssd/huslib/WebServer.cpp create mode 100644 hdssd/huslib/WebServer.h create mode 100644 hdssd/huslib/Zlibex.h create mode 100644 hdssd/huslib/hsparser.cpp create mode 100644 hdssd/huslib/hsparser.h create mode 100644 hdssd/huslib/huslib.h create mode 100644 hdssd/huslib/huslibex.h create mode 100644 hdssd/huslib/inifile.cpp create mode 100644 hdssd/huslib/inifile.h create mode 100644 hdssd/huslib/libhuslib.a create mode 100644 hdssd/huslib/stringex.cpp create mode 100644 hdssd/huslib/stringex.h create mode 100644 hdssd/huslib/windows/DebugAssist.h create mode 100644 hdssd/huslib/windows/WinService.cpp create mode 100644 hdssd/huslib/windows/WinService.h create mode 100644 hdssd/workspace/hdssd/ClientChannel.cpp create mode 100644 hdssd/workspace/hdssd/ClientChannel.h create mode 100644 hdssd/workspace/hdssd/HttpChannel.cpp create mode 100644 hdssd/workspace/hdssd/HttpChannel.h create mode 100644 hdssd/workspace/hdssd/MainConfig.cpp create mode 100644 hdssd/workspace/hdssd/MainConfig.h create mode 100644 hdssd/workspace/hdssd/Makefile create mode 100644 hdssd/workspace/hdssd/bin/hdssd create mode 100644 hdssd/workspace/hdssd/bin/hdssd.exe create mode 100644 hdssd/workspace/hdssd/bin/hdssd.ini create mode 100644 hdssd/workspace/hdssd/hdssd.Makefile create mode 100644 hdssd/workspace/hdssd/hdssd.cpp create mode 100644 hdssd/workspace/hdssd/hdssd.sln create mode 100644 hdssd/workspace/hdssd/hdssd.vcproj diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6479b59 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +hdssd/tmp +hdssd/workspace/hdssd/hdssd.ncb +hdssd/workspace/hdssd/hdssd.suo +*.user +hdssd/workspace/hdssd/Debug +*.log +hdssd/workspace/hdssd/bin/hdssd.ilk +*.pdb diff --git a/ed780/hdtermd.cpp b/ed780/hdtermd.cpp new file mode 100644 index 0000000..d7c7822 --- /dev/null +++ b/ed780/hdtermd.cpp @@ -0,0 +1,1857 @@ +#ifdef _WIN32 + +#define _CRT_SECURE_NO_WARNINGS + +#include +#include +#include +#pragma comment(lib, "ws2_32.lib") +#pragma comment(lib, "winmm.lib") + +#else + +#include +#include +#include // sockaddr_in +#include // inet_ntoa() +#include // close() +#include // gethostbyname() +#include // F_GETFL, O_NONBLOCK +#include // TCP_NODELAY +#include +#include +#include +//#include +#include + + +typedef int BOOL; +#define TRUE 1 +#define FALSE 0 + +#define INVALID_SOCKET (SOCKET)(~0) +#define SOCKET_ERROR (-1) + +#define SD_RECEIVE SHUT_RD +#define SD_SEND SHUT_WR +#define SD_BOTH SHUT_RDWR + +typedef int SOCKET; + +#define closesocket close + + +inline unsigned int timeGetTime() +{ +#if 0 + struct timeval tv; + gettimeofday(&tv, NULL); // obsolescent at 2008 + + return (tv.tv_sec * 1000) + (tv.tv_usec / 1000); +#else + //struct timespec ts; + //clock_gettime(CLOCK_MONOTONIC, &ts); + + //return (ts.tv_sec * 1000) + (ts.tv_nsec / 1000000); + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + + uint64_t ms = (uint64_t)ts.tv_sec * 1000ULL + + (uint64_t)ts.tv_nsec / 1000000ULL; + + return (unsigned int)ms; // 32bit wrap intentionally +#endif +} +#define GetTickCount timeGetTime + +inline void Sleep(unsigned int nTime) +{ +#if 0 + struct timeval tv; + + tv.tv_sec = nTime / 1000; + tv.tv_usec = (nTime % 1000) * 1000; // msec + + select(0, NULL, NULL, NULL, &tv); +#else + struct timespec ts; + + ts.tv_sec = nTime / 1000; + ts.tv_nsec = (nTime % 1000) * 1000000; // nsec + + nanosleep(&ts, NULL); +#endif +} + + +#endif + +#include +#include +#include +#include +#include + +#ifdef _DEBUG +#include +#endif + +#include + + +////////////////////////////////////////////////////////////////////////////// + +inline int GetSockError() +{ +#ifdef _WIN32 + return WSAGetLastError(); +#else + return errno; +#endif +} + +int GetSockOptError(SOCKET sock) +{ + int nOptVal; + socklen_t nOptLen = sizeof(int); + if (getsockopt(sock, SOL_SOCKET, SO_ERROR, (char *)(&nOptVal), &nOptLen) < 0) + return GetSockError(); + + return nOptVal; +} + +#ifdef _WIN32 +VOID WINAPI FlsBufferFree(PVOID lpFlsData) +{ + if (lpFlsData != NULL) + { + fprintf(stdout, "DEBUG, FlsBufferFree, lpFlsData = 0x%p\n", lpFlsData); + LocalFree(lpFlsData); + } +} + +char * GetLocalStorageBuffer(DWORD nFlsIdx, size_t nSize) +{ + char * pszBuffer = (char *)FlsGetValue(nFlsIdx); + if (pszBuffer == NULL) + { + pszBuffer = (char *)LocalAlloc(LPTR, nSize); + if (pszBuffer == NULL) + return NULL; + + FlsSetValue(nFlsIdx, pszBuffer); + } + + return pszBuffer; +} +#endif + + +const char * GetErrorStr(int nError) +{ +#ifdef _WIN32 + static DWORD nFlsIdx = FLS_OUT_OF_INDEXES; + if (nFlsIdx == FLS_OUT_OF_INDEXES) + nFlsIdx = FlsAlloc(FlsBufferFree); + + char * pszBuffer = (char *)GetLocalStorageBuffer(nFlsIdx, 512); + if (pszBuffer == NULL) + return "[SystemError], Failed to LocalAlloc"; + + if (FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, + nError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), pszBuffer, 512, NULL) == 0) + { + sprintf(pszBuffer, "Unknown Error", nError); + } + + return pszBuffer; +#else + return strerror(nError); +#endif +} + +inline unsigned int TimeDiff(unsigned int nTimePrev, unsigned int nTimeCurr) +{ + if (nTimePrev <= nTimeCurr) + return nTimeCurr - nTimePrev; + + return nTimeCurr + (0xFFFFFFFFU - nTimePrev) + 1U; +} + +// file ////////////////////////////////////////////////////////////////////// +class CtFile +{ +public: + enum + { + FMODE_CREATE = 0x0001, + FMODE_RDONLY = 0x0002, + FMODE_WRONLY = 0x0004, + FMODE_RW = 0x0008 + }; + + static off_t GetSize(const char * pszFileName) + { + struct stat statTemp; + stat(pszFileName, &statTemp); + + return statTemp.st_size; + } + + //// + + CtFile() + { + m_nFile = -1; + } + + ~CtFile() + { + Close(); + } + + int GetFile() { return m_nFile; } + + bool Open(const char * pszFileName, int nMode, bool bIsBinary = true, bool bIsContinue = true) + { + int oflag = 0; + + if ((nMode & FMODE_CREATE) == FMODE_CREATE) + oflag = O_CREAT; + + if ((nMode & FMODE_RDONLY) == FMODE_RDONLY) + oflag |= O_RDONLY; + else if ((nMode & FMODE_WRONLY) == FMODE_WRONLY) + oflag |= O_WRONLY; + else + oflag |= O_RDWR; + + if (bIsContinue == FALSE && ((nMode & FMODE_WRONLY) == FMODE_WRONLY || (nMode & FMODE_RW) == FMODE_RW)) + oflag |= O_TRUNC; + +#ifdef _WIN32 + if (bIsBinary) + oflag |= O_BINARY; + else + oflag |= O_TEXT; + + m_nFile = open(pszFileName, oflag, S_IREAD | S_IWRITE); +#else + m_nFile = open(pszFileName, oflag, S_IREAD | S_IWRITE | S_IRGRP | S_IROTH); +#endif + + if (m_nFile == -1) + return false; + + if (bIsContinue && ((nMode & FMODE_WRONLY) == FMODE_WRONLY || (nMode & FMODE_RW) == FMODE_RW)) + lseek(m_nFile, 0L, SEEK_END); + + return true; + } + + void Close() + { + if (m_nFile != -1) + { + close(m_nFile); + m_nFile = -1; + } + } + + int Read(void * buffer, unsigned int count) + { + return read(m_nFile, buffer, count); + } + + int Write(const void * buffer, unsigned int count) + { + return write(m_nFile, buffer, count); + } + +private: + int m_nFile; +}; +////////////////////////////////////////////////////////////////////////////// + + +class IompObject +{ +public: + enum { + IOMP_DISABLE = 0, + IOMP_READY = 1, + IOMP_CONNECTING = 2, + IOMP_RECONNECTING = 3, + IOMP_LISTENING = 4, + IOMP_CLOSING = 5, + IOMP_REMOVE = 6 + }; + + SOCKET m_sock; + int m_nState; + struct sockaddr_in m_sai; // remote or listen + unsigned int m_nPrevTick; // prev setted time + unsigned int m_nConnectTimeOut; // for connect timeout + unsigned int m_nAutoReconnectInterval; // 0: no reconnect, 1~ : msec, reconnect interval time + + + IompObject() + { + m_nState = IOMP_DISABLE; + memset(&m_sai, 0, sizeof(struct sockaddr_in)); // remote or listen + m_nPrevTick = 0; + m_nConnectTimeOut = 0; + m_nAutoReconnectInterval = 0; + } + + int Create() + { + // create socket + m_sock = socket(AF_INET, SOCK_STREAM, 0); + if (m_sock == INVALID_SOCKET) + { + fprintf(stderr, "[ERROR], Failed to socket()\n"); + return -1; + } + + // Set non blocking mode +#ifdef _WIN32 + ULONG nNonBlock = 1; + if (ioctlsocket(m_sock, FIONBIO, &nNonBlock) == SOCKET_ERROR) +#else + int nFlags = fcntl(m_sock, F_GETFL, 0); + if (fcntl(m_sock, F_SETFL, nFlags | O_NONBLOCK) == -1) +#endif + { + int nSockError = GetSockError(); + fprintf(stderr, "[ERROR], Failed to ioctlsocket. socket = %d, error = %s(%d)\n", m_sock, GetErrorStr(nSockError), nSockError); + closesocket(m_sock); + return -1; + } + + int nBuffSize = 1024 * 1024 * 4; // 4Mbyte + if (setsockopt(m_sock, SOL_SOCKET, SO_SNDBUF, (const char *)&nBuffSize, sizeof(nBuffSize)) == SOCKET_ERROR) + fprintf(stderr, "[WARN], Failed to setsockopt SO_SNDBUF, socket = %d\n", m_sock); + + if (setsockopt(m_sock, SOL_SOCKET, SO_RCVBUF, (const char *)&nBuffSize, sizeof(nBuffSize)) == SOCKET_ERROR) + fprintf(stderr, "[WARN], Failed to setsockopt SO_RCVBUF, socket = %d\n", m_sock); + + return 0; + } + + int Bind(const char * pszIp, unsigned short nPort) + { +#define REUSEADDR_ +#ifdef REUSEADDR_ + int nOptVal = 1; + setsockopt(m_sock, SOL_SOCKET, SO_REUSEADDR, (const char *)&nOptVal, sizeof(nOptVal)); // for multiple ip in UNIX +#endif + if (pszIp == NULL || pszIp[0] == '\0') + m_sai.sin_addr.s_addr = htonl(INADDR_ANY); + else + m_sai.sin_addr.s_addr = inet_addr(pszIp); + + m_sai.sin_family = AF_INET; + m_sai.sin_port = htons(nPort); + + if (bind(m_sock, (struct sockaddr *)&m_sai, sizeof(struct sockaddr)) == -1) + { + int nSockError = GetSockError(); + fprintf(stderr, "[ERROR], Failed to bind.(%s:%d) socket = %d, error = %s(%d)\n", inet_ntoa(m_sai.sin_addr), ntohs(m_sai.sin_port), + m_sock, GetErrorStr(nSockError), nSockError); + closesocket(m_sock); + return -1; + } + fprintf(stdout, "INFO, Succeeded to bind.(%s:%d), socket = %d\n", inet_ntoa(m_sai.sin_addr), ntohs(m_sai.sin_port), m_sock); // listen ip:port + + return 0; + } + + int Listen(int nBackLog) + { + if (listen(m_sock, nBackLog) == -1) + { + int nSockError = GetSockError(); + fprintf(stderr, "[ERROR], Failed to listen. socket = %d, error = %s(%d)\n", m_sock, GetErrorStr(nSockError), nSockError); + closesocket(m_sock); + return -1; + } + fprintf(stdout, "INFO, Succeeded to listen.(%s:%d), socket = %d\n", inet_ntoa(m_sai.sin_addr), ntohs(m_sai.sin_port), m_sock); // listen ip:port + + m_nState = IOMP_LISTENING; + return 0; + } + + int ConnectProc(unsigned int nCurrTick) + { + int nResult = connect(m_sock, (struct sockaddr *)&m_sai, sizeof(struct sockaddr)); + + #ifdef _WIN32 + if (nResult == SOCKET_ERROR && GetSockError() != WSAEWOULDBLOCK) + #else + if (nResult == SOCKET_ERROR && errno != EWOULDBLOCK && errno != EINPROGRESS) + #endif + { + int nSockError = GetSockError(); + fprintf(stderr, "[ERROR], Failed to connect. socket = %d, error = %s(%d)\n", m_sock, GetErrorStr(nSockError), nSockError); + closesocket(m_sock); + m_sock = INVALID_SOCKET; + return -1; + } + + m_nPrevTick = nCurrTick; + m_nState = IOMP_CONNECTING; + fprintf(stdout, "INFO, TCP connecting... to %s:%d, socket = %d\n", inet_ntoa(m_sai.sin_addr), ntohs(m_sai.sin_port), m_sock); + + return 0; + } + + int Connect(const char * pszIp, unsigned short nPort, unsigned int nTimeout, unsigned int nCurrTick = 0, unsigned int nAutoReconnectInterval = 0) + { + if (m_sock == INVALID_SOCKET) + { + fprintf(stderr, "[ERROR], This socket did not created.\n"); + return -1; + } + + m_sai.sin_addr.s_addr = inet_addr(pszIp); + m_sai.sin_family = AF_INET; + m_sai.sin_port = htons(nPort); + + m_nConnectTimeOut = nTimeout; + m_nAutoReconnectInterval = nAutoReconnectInterval; + + return ConnectProc(nCurrTick); + } + + int Disconnect() + { + return shutdown(m_sock, SD_SEND); + } + + bool IsConnectTimeout(unsigned int nCurrTick) + { + //fprintf(stdout, "DEBUG, m_nPrevTick = %d, nCurrTick = %d\n", m_nPrevTick, nCurrTick); + + if (m_nPrevTick == 0) + { + m_nPrevTick = nCurrTick; + return false; + } + + if (m_nConnectTimeOut <= 0) + return false; + + if (m_nConnectTimeOut <= TimeDiff(m_nPrevTick, nCurrTick)) + return true; + + return false; + } + + int TcpCompleteSend(const char * pPacket, int nPacketSize) + { + off_t nSentSize; + const char * pszPacketOffset = pPacket; + while (nPacketSize > 0) + { + nSentSize = send(m_sock, pszPacketOffset, nPacketSize, 0); + if (nSentSize <= 0) + { + int nSockError = GetSockError(); + fprintf(stderr, "[ERROR], Failed to send, sock = %d, error = %s(%d)\n", m_sock, GetErrorStr(nSockError), nSockError); + return -1; + } + + nPacketSize -= nSentSize; + pszPacketOffset += nSentSize; + } + + return 0; + } + + int Receive(char * pBuffer, int nMaxSize) + { + int nReceived = recv(m_sock, pBuffer, nMaxSize, 0); + if (nReceived == -1) + { + int nSockError = GetSockError(); + fprintf(stdout, "INFO, The virtual circuit was reset by the remote side executing a \"hard\" or \"abortive\" close, socket = %d, error = %s(%d)\n", m_sock, GetErrorStr(nSockError), nSockError); + shutdown(m_sock, SD_BOTH); + return -1; + } + else if (nReceived == 0) + { + fprintf(stdout, "INFO, The virtual circuit was reset by the remote side executing a \"gracefull\" shutdown, socket = %d\n", m_sock); + shutdown(m_sock, SD_SEND); + return -1; + } + + return nReceived; + } +}; + +template +class IompDispatcher +{ +public: + IompDispatcher() + { + //m_nDispachInterval = 500; //msec, set timer + //m_nDispachInterval = 200; //msec, set timer + m_nDispachInterval = 0; //msec, set timer + m_bTerminate = false; + } + + virtual ~IompDispatcher() + { + } + + _T * AddSocket(_T & t) + { + m_listIomp.push_front(t); + return &m_listIomp.front(); + } + + int Dispatch() + { + fprintf(stdout, "INFO, IompDispatcher.Dispatch() started.\n"); + + fd_set fsRead, fsWrite, fsError; + int nSelectResult, nFdMax, nFdCount; + typename std::list<_T>::iterator iter; + struct timeval tvWait; + unsigned int nCurrTick = 0, nPrevTimerTick = 0; + + while (m_bTerminate == false) + { +//#define TEST_TERMINATE_ +#ifdef TEST_TERMINATE_ //TestCode + //static int nTestCount = 2000; + static int nTestCount = 1000; + if (nTestCount-- < 0) + break; +#endif + nCurrTick = GetTickCount(); + + if (m_nDispachInterval > 0 && m_nDispachInterval <= TimeDiff(nPrevTimerTick, nCurrTick)) + { + OnDispatchTimer(nCurrTick); + nPrevTimerTick = nCurrTick; + } + + FD_ZERO(&fsRead); + FD_ZERO(&fsWrite); + FD_ZERO(&fsError); + + nFdMax = 0; + nFdCount = 0; + + for (iter = m_listIomp.begin(); iter != m_listIomp.end(); iter++) + { + if (iter->m_nState == IompObject::IOMP_REMOVE) + { + OnIompDelete(&*iter, nCurrTick); + iter = m_listIomp.erase(iter); + if (m_listIomp.empty() || iter == m_listIomp.end()) + break; + } + else if (iter->m_nState == IompObject::IOMP_CLOSING) + { + int nResult = OnIompClose(&*iter, nCurrTick); + iter->m_nPrevTick = nCurrTick; + closesocket(iter->m_sock); + + if (iter->m_nAutoReconnectInterval > 0) + { + iter->m_sock = INVALID_SOCKET; + iter->m_nState = IompObject::IOMP_RECONNECTING; + } + else if (nResult == 0) + { + iter->m_nState = IompObject::IOMP_REMOVE; + } + else + { + iter->m_sock = INVALID_SOCKET; + iter->m_nState = IompObject::IOMP_DISABLE; + } + } + else if (iter->m_nState == IompObject::IOMP_RECONNECTING) + { + if (iter->m_nAutoReconnectInterval <= TimeDiff(iter->m_nPrevTick, nCurrTick)) + { + if ((iter->Create()) == -1) + iter->m_nState = IompObject::IOMP_REMOVE; + else if (iter->ConnectProc(nCurrTick) == -1) + iter->m_nState = IompObject::IOMP_REMOVE; + } + } + else if (iter->m_nState == IompObject::IOMP_READY || iter->m_nState == IompObject::IOMP_LISTENING) + { + if (iter->m_nState == INVALID_SOCKET) + fprintf(stderr, "[ERROR_DEBUG], Invalid logic. socket = %d\n", iter->m_nState, iter->m_sock); + + FD_SET(iter->m_sock, &fsRead); + //FD_SET(iter->m_sock, &fsError); + nFdCount++; +#ifndef _WIN32 + if (nFdMax < iter->m_sock) + nFdMax = iter->m_sock; +#endif + } + else if (iter->m_nState == IompObject::IOMP_CONNECTING) + { + if (iter->IsConnectTimeout(nCurrTick)) + { + fprintf(stdout, "[WARN], Failed to connect because of timeout. socket = %d\n", iter->m_sock); + OnIompConnect(&*iter, false, nCurrTick); + shutdown(iter->m_sock, SD_BOTH); + iter->m_nState = IompObject::IOMP_CLOSING; + } + else + { + if (iter->m_nState == INVALID_SOCKET) + fprintf(stderr, "[ERROR_DEBUG], Invalid logic. socket = %d\n", iter->m_nState, iter->m_sock); + + FD_SET(iter->m_sock, &fsWrite); + nFdCount++; +#ifndef _WIN32 + if (nFdMax < iter->m_sock) + nFdMax = iter->m_sock; +#endif + } + } + +#if 0 // send buffer version + if (iter->m_nState != IompObject::IOMP_DISABLE && iter->m_nState != IompObject::IOMP_CLOSING && iter->m_nState != IompObject::IOMP_REMOVE && + pSocket->GetSendBuffer()->empty() == false) + { + if (iter->m_nState == INVALID_SOCKET) + fprintf(stderr, "[ERROR_DEBUG], Invalid logic. socket = %d\n", iter->m_nState, iter->m_sock); + + FD_SET(iter->m_sock, &fsWrite); + nFdCount++; +#ifndef _WIN32 + if (nFdMax < iter->m_sock) + nFdMax = iter->m_sock; +#endif + } +#endif + } + + if (m_listIomp.empty() || nFdCount == 0) + { + Sleep(5); + continue; + } +//#define TEST_INTERVAL_ +#ifdef TEST_INTERVAL_ + tvWait.tv_sec = 3; //TestCode + tvWait.tv_usec = 0; +#else + tvWait.tv_sec = 0; + tvWait.tv_usec = 50000; // 50 msec +#endif + //nSelectResult = select(nFdMax + 1, &fsRead, &fsWrite, &fsError, &tvWait); + nSelectResult = select(nFdMax + 1, &fsRead, &fsWrite, NULL, &tvWait); + //fprintf(stdout, "DEBUG, nSelectResult = %d\n", nSelectResult); + + if (nSelectResult == 0) + { + continue; // timeout + } + else if (nSelectResult == -1) + { + int nSockError = GetSockError(); + fprintf(stdout, "[WARN], Failed to select. error = %s(%d)\n", GetErrorStr(nSockError), nSockError); + Sleep(5); + continue; + } + + for (iter = m_listIomp.begin(); iter != m_listIomp.end(); iter++) + { + if (iter->m_sock == INVALID_SOCKET || + iter->m_nState == IompObject::IOMP_DISABLE || iter->m_nState == IompObject::IOMP_CLOSING || iter->m_nState == IompObject::IOMP_REMOVE) + continue; + + if (FD_ISSET(iter->m_sock, &fsRead) != 0) + { + if (iter->m_nState == IompObject::IOMP_LISTENING) + { + _T iompSocket; + + socklen_t len = sizeof(struct sockaddr); + if ((iompSocket.m_sock = accept(iter->m_sock, (struct sockaddr *)&iompSocket.m_sai, &len)) == INVALID_SOCKET) + { + int nSockError = GetSockError(); + fprintf(stderr, "[ERROR], Failed to accept. socket = %d, error = %s(%d)\n", iter->m_sock, GetErrorStr(nSockError), nSockError); + } + else + { + fprintf(stdout, "INFO, Succeeded to accept.(%s:%d), socket = %d\n", inet_ntoa(iter->m_sai.sin_addr), ntohs(iter->m_sai.sin_port), iter->m_sock); // listen ip:port + fprintf(stdout, "INFO, Accepted src address (%s:%d), socket = %d\n", inet_ntoa(iompSocket.m_sai.sin_addr), ntohs(iompSocket.m_sai.sin_port), iompSocket.m_sock); // remote ip:port + + if (OnIompAccept(&iompSocket, nCurrTick) != -1) + { + // Set non blocking mode +#ifdef _WIN32 + ULONG nNonBlock = 1; + if (ioctlsocket(iompSocket.m_sock, FIONBIO, &nNonBlock) == SOCKET_ERROR) +#else + int nFlags = fcntl(iompSocket.m_sock, F_GETFL, 0); + if (fcntl(iompSocket.m_sock, F_SETFL, nFlags | O_NONBLOCK) == -1) +#endif + { + int nSockError = GetSockError(); + fprintf(stderr, "[ERROR], Failed to ioctlsocket. socket = %d, error = %s(%d)\n", iompSocket.m_sock, GetErrorStr(nSockError), nSockError); + closesocket(iompSocket.m_sock); + } + else + { + iompSocket.m_nState = IompObject::IOMP_READY; + iompSocket.m_nPrevTick = nCurrTick; + m_listIomp.push_front(iompSocket); + } + } + else + { + closesocket(iompSocket.m_sock); + } + } + } + else if (iter->m_nState == IompObject::IOMP_READY) + { + if (OnIompReceive(&*iter, nCurrTick) == -1) + { + shutdown(iter->m_sock, SD_SEND); + iter->m_nState = IompObject::IOMP_CLOSING; + } + + iter->m_nPrevTick = nCurrTick; + } + + FD_CLR(iter->m_sock, &fsRead); + + if (--nSelectResult <= 0) + break; + } + + if (FD_ISSET(iter->m_sock, &fsWrite) != 0) + { + if (iter->m_nState == IompObject::IOMP_CONNECTING) + { + int nSocketOptError = GetSockOptError(iter->m_sock); + if (nSocketOptError != 0) + { + fprintf(stderr, "[ERROR], Failed to connect.(%s:%d) socket = %d, error = %s(%d)\n", + inet_ntoa(iter->m_sai.sin_addr), ntohs(iter->m_sai.sin_port), iter->m_sock, GetErrorStr(nSocketOptError), nSocketOptError); + OnIompConnect(&*iter, false, nCurrTick); + shutdown(iter->m_sock, SD_BOTH); + iter->m_nState = IompObject::IOMP_CLOSING; + } + else + { + fprintf(stdout, "INFO, Succeeded to connect.(%s:%d) socket = %d\n", + inet_ntoa(iter->m_sai.sin_addr), ntohs(iter->m_sai.sin_port), iter->m_sock); + OnIompConnect(&*iter, true, nCurrTick); + iter->m_nState = IompObject::IOMP_READY; + } + iter->m_nPrevTick = nCurrTick; + } + //else if (iter->m_nState == IompObject::IOMP_READY) + //{ + // if (pSocket->OnSendRetry() < 0) // remain packet send + // { + // HLOGF(15, "[TRACE], MpsDisp, Failed to OnSendRetry socket = %d\n", pSocket->GetSocket()); + // pSocket->FinishTcp(); + // } + //} + + FD_CLR(iter->m_sock, &fsWrite); + + if (--nSelectResult <= 0) + break; + } + } + } + + return false; + } + +protected: + virtual int OnIompConnect(_T * pIomp, bool bIsSuccess, unsigned int nCurrTick) { return 0; } + virtual int OnIompReceive(_T * pIomp, unsigned int nCurrTick) { return 0; } + virtual int OnIompAccept(_T * pIomp, unsigned int nCurrTick) { return 0; } + virtual int OnIompClose(_T * pIomp, unsigned int nCurrTick) { return 0; } + virtual int OnIompDelete(_T * pIomp, unsigned int nCurrTick) { return 0; } + virtual void OnDispatchTimer(unsigned int nCurrTick) {} + +protected: + unsigned int m_nDispachInterval; //msec + bool m_bTerminate; + std::list<_T> m_listIomp; +}; +////////////////////////////////////////////////////////////////////////////// + +void get_crc(unsigned char* data, int length, unsigned short* crc) +{ + int i; + //unsigned temp; + unsigned short temp; + unsigned short SEED = 0x8005; + *crc = 0xffff; + do { + temp = *data++ & 0xff; + for (i = 0; i < 8; i++) { + if ((*crc & 0x0001) ^ (temp & 0x01)) + *crc = (*crc >> 1) ^ SEED; + else + *crc >>= 1; + temp >>= 1; + } + } while (--length); + *crc = ~*crc; + temp = *crc; + *crc = (*crc << 8) | ((temp >> 8) & 0xff); + return; +} + +int SendToKicc(IompObject * pIomp, unsigned short cmd, const char * pData, size_t nDataSize) +{ + volatile unsigned char pPacket[8192]; + memset((void *)pPacket, 0, 8192); + + volatile unsigned char * ptr = pPacket; + *ptr++ = 0x02; + + volatile unsigned char * LEN = ptr; + unsigned short nLen = htons(6 + nDataSize); + memcpy((void *)ptr, (void *)&nLen, sizeof(unsigned short)); + +#if 0 + unsigned short tmpLen; + memcpy((void *)&tmpLen, (void *)ptr, sizeof(unsigned short)); + printf("tmpLen = %d, %d\n", tmpLen, ntohs(tmpLen)); +#endif + + ptr += 2; + + *ptr++ = 0; + + *ptr++ = 0xFB; + *ptr++ = 0x14; + *ptr++ = cmd; + + if (nDataSize > 0) + { + memcpy((void *)ptr, pData, nDataSize); + ptr += nDataSize; + } + + *ptr++ = 0x03; + + unsigned short * cic = (unsigned short *)ptr; + get_crc((unsigned char *)LEN, 7 + nDataSize, cic); + *cic = htons(*cic); + + printf("DEBUG, SendToKicc, send = %d\n", 10 + nDataSize); + if (pIomp->TcpCompleteSend((char *)pPacket, 10 + nDataSize) == -1) + return -1; + + return 0; +} + + +/// - log part //////////////////////////////////////////// +extern inline FILE * CtLogFilePtr(FILE * pNewFile = NULL) +{ + static FILE * pFile = stdout; + if (pNewFile) + pFile = pNewFile; + + return pFile; +} + +extern inline void CtLog(int nLevel, const char *fmt, ...) +//void CtLog(int nLevel, const char * pszLog) +{ + char szLogString[1024]; + va_list vaList; + va_start(vaList, fmt); + +#if defined(__ANDROID__) || defined(ANDROID) + if (vsnprintf(szLogString, 1023, fmt, vaList) > 1023) + szLogString[1023] = '\0'; + va_end(vaList); + + __android_log_print(ANDROID_LOG_ERROR, "CtSense", "%s", szLogString); +#else + time_t t = time(NULL); + struct tm * st = localtime(&t); + sprintf(szLogString, "%04d-%02d-%02d %02d:%02d:%02d ", 1900 + st->tm_year, + st->tm_mon + 1, st->tm_mday, st->tm_hour, st->tm_min, st->tm_sec); + fputs(szLogString, CtLogFilePtr()); + + if (vsnprintf(szLogString, 1023, fmt, vaList) > 1023) + szLogString[1023] = '\0'; + + va_end(vaList); + + fputs(szLogString, CtLogFilePtr()); +#endif +} +/// - log part //////////////////////////////////////////// + + +///BeginHeader- protocol part ///////////////////////////////////////////////// +struct CtProtocolRecvCallBack +{ + virtual int OnRecvProtocol() = 0; +}; + + +class CtProtocol +{ +public: + enum + { + CP_STATE_EMPTY = 0, + CP_STATE_INVALID_PACKET = 1, + CP_STATE_HEADER_REMAIN = 2, + CP_STATE_BODY_REMAIN = 3, + CP_STATE_COMPLETE = 4, + CP_STATE_JOINED = 5, + }; + +public: + inline CtProtocol(); + virtual inline ~CtProtocol(); + + inline int GetPacketSize() { return m_nPakcetSize; } + inline int GetBodySize() { return m_nBodySize; } + inline const unsigned char * GetPacketPtr() { return m_pBufPtr; } + inline const unsigned char * GetBodyPtr() { return m_pBodyPtr; } + + inline unsigned char * GetBufRecvPtr() { return m_pBufRecvPtr; } + inline const int GetBufRemainSize() { return m_nBufRemainSize; } + inline const int MoveBufRecvPtr(int nSize); + + inline int OnReceive(size_t nSize, CtProtocolRecvCallBack * pCallBack); + + virtual void Clear() = 0; + virtual int Parse(const char * pPacket, int nSize) = 0; + virtual int MoveNext() = 0; + +protected: + int m_nState; + + int m_nPakcetSize; + int m_nBodySize; + unsigned char * m_pBodyPtr; + unsigned char * m_pBufPtr; + //int m_nNextSendPos; + + int m_nBufRemainSize; + unsigned char * m_pBufRecvPtr; +}; +///EndHeader- protocol part /////////////////////////////////////////////// + + + + +///BeginSource- protocol part ///////////////////////////////////////////////// +inline CtProtocol::CtProtocol() +{ + m_nState = CP_STATE_EMPTY; + m_nPakcetSize = 0; + m_nBodySize = 0; + m_pBodyPtr = NULL; + m_pBufPtr = NULL; + m_nBufRemainSize = 0; + m_pBufRecvPtr = NULL; +} + +inline CtProtocol::~CtProtocol() +{ +} + +inline const int CtProtocol::MoveBufRecvPtr(int nSize) { + if (m_nBufRemainSize < nSize) + return -1; + + m_pBufRecvPtr += nSize; + m_nPakcetSize += nSize; + m_nBufRemainSize -= nSize; + + return 0; +} + +inline int CtProtocol::OnReceive(size_t nSize, CtProtocolRecvCallBack * pCallBack) +{ + CtLog(15, "CtProtocol::OnReceive, nSize = %d\n", nSize); + CtLog(15, "CtProtocol::OnReceive, %x %x %x %x %x %x\n", m_pBufRecvPtr[0], m_pBufRecvPtr[1], m_pBufRecvPtr[2], m_pBufRecvPtr[3], m_pBufRecvPtr[4], m_pBufRecvPtr[5]); + + if (MoveBufRecvPtr((int)nSize) < 0) + { + CtLog(1, "[ERROR], CtProtocol::MoveBufRecvPtr, Not enough buffer.\n"); + return -1; // disconnect + } + + for (;;) + { +#ifdef USE_COPY_BUFFER + int nState = Parse(m_pRecvBuf, nSize); +#else + int nState = Parse(NULL, 0); +#endif + if (nState == CP_STATE_COMPLETE || nState == CP_STATE_JOINED) + { + if (pCallBack->OnRecvProtocol() < 0) + return -1; // disconnect + + if (nState == CP_STATE_COMPLETE) + { + Clear(); + } + else if (nState == CP_STATE_JOINED) + { + MoveNext(); + continue; + } + } + + break; + } + Clear(); + + //return -1; //TestCode disconnect + return 0; +} +///EndSource- protocol part /////////////////////////////////////////////////// + + +class KiccProtocol : public CtProtocol +{ + // STX: 1byte, 0x02 : Start of Transmission + // LEN: 2byte, Àü¼Û ÆÐŶ ±æÀÌ(LENºÎÅÍ DATA±îÁö) + // CNT: 1byte, ÆÐŶ Counter. ÆÐŶÀÌ ¼Û¼ö½Å µÉ ¶§¸¶´Ù 1¾¿ Áõ°¡Çϸç, 1ºÎÅÍ 255±îÁö °¡´É. ³ÑÀ¸¸é 1·Î ResetµÊ. + // CMD: 1byte, ±âº» ÄÚµå + // GCD: 1byte, ±×·ì ÄÚµå ( ¾÷¹«º° ±×·ì ÄÚµå ) + // JCD: 1byte, ¾÷¹« ÄÚµå ( »ó¼¼ ¾÷¹« ÄÚµå ) + // DATA: LEN byte, Àü¹® ³»¿ë. ¾÷¹« ÄÚµå ±â´ÉÀ» ¼öÇàÇϱâ À§ÇØ ÇÊ¿äÇÑ µ¥ÀÌÅÍ Çʵå. µ¥ÀÌÅÍ °íÀ¯ÀÇ TypeÀ¸·Î Àü¼ÛµÇ¸ç, ASCII·Î º¯?µÇÁö ¾ÊÀ½. + // ETX: 1byte, End of Transmission + // CRC: 2byte, LENºÎÅÍ ETX±îÁöÀÇ Check Code +public: + enum + { + CP_MAX_PACKET_SIZE = 8192, + CP_HEADER_SIZE = 3, // STX + LEN + CP_MAX_BODY_SIZE = CP_MAX_PACKET_SIZE - CP_HEADER_SIZE, + }; + +public: + inline KiccProtocol(); + virtual inline ~KiccProtocol(); + + inline void Clear(); + + inline void Append(const char * pData, size_t nSize); + inline void SetHeader(unsigned short nBodySize); + inline void BuildHeader(); + + inline int Parse(const char * pPacket, int nSize); + inline int MoveNext(); + +protected: + unsigned char m_buffer[CP_MAX_PACKET_SIZE]; +}; + + +inline KiccProtocol::KiccProtocol() +{ + Clear(); +} + +inline KiccProtocol::~KiccProtocol() +{ +} + +inline void KiccProtocol::Clear() +{ + m_nState = CP_STATE_EMPTY; + m_nPakcetSize = 0; + m_nBodySize = 0; + m_pBodyPtr = m_buffer + CP_HEADER_SIZE; + m_pBufPtr = m_buffer; + m_nBufRemainSize = CP_MAX_PACKET_SIZE; + m_pBufRecvPtr = m_buffer; +} + +inline void KiccProtocol::Append(const char * pData, size_t nSize) +{ + memcpy(m_pBodyPtr + m_nBodySize, pData, nSize); + m_nBodySize += (int)nSize; +} + +inline void KiccProtocol::SetHeader(unsigned short nBodySize) +{ +// memcpy(m_buffer, ProtocolNamePtr(), 4); + unsigned short * pnBodySize = (unsigned short *)(m_buffer + 4); + *pnBodySize = htons(nBodySize); + m_nBodySize = nBodySize; + m_nPakcetSize = m_nBodySize + CP_HEADER_SIZE; +} + +inline void KiccProtocol::BuildHeader() +{ +// memcpy(m_buffer, ProtocolNamePtr(), 4); + unsigned short * pnBodySize = (unsigned short *)(m_buffer + 4); + *pnBodySize = htons(m_nBodySize); + m_nPakcetSize = m_nBodySize + CP_HEADER_SIZE; + m_nState = CP_STATE_COMPLETE; +} + +inline int KiccProtocol::Parse(const char * pPacket, int nSize) +{ + if (m_nState == CP_STATE_JOINED) + { + m_nState = CP_STATE_EMPTY; + } + else + { + if (pPacket != NULL && nSize != 0) + { + memcpy(m_buffer + m_nPakcetSize, pPacket, nSize); + m_nPakcetSize += nSize; + } + } + + //fprintf(stdout, "DEBUG, Parse 1, %d, %d, %d, %d\n", nSize, m_nState, m_nPakcetSize, m_nBodySize); + + if (m_nState == CP_STATE_EMPTY) + { + if (m_nPakcetSize < CP_HEADER_SIZE) + { + m_nState = CP_STATE_HEADER_REMAIN; + return m_nState; + } + } + else if (m_nState == CP_STATE_HEADER_REMAIN) + { + if (m_nPakcetSize < CP_HEADER_SIZE) + return m_nState; + } + else if (m_nState == CP_STATE_BODY_REMAIN) + { + if (m_nPakcetSize < CP_HEADER_SIZE + m_nBodySize) + return m_nState; + + return CP_STATE_COMPLETE; + } + + //fprintf(stdout, "DEBUG, Parse 2, %x, %x, %x\n", m_pBufPtr[0], m_pBufPtr[1], m_pBufPtr[2]); + +// if (memcmp(m_pBufPtr, KiccProtocol::ProtocolNamePtr(), 4) != 0) + if (m_pBufPtr[0] != 0x02 && m_pBufPtr[0] != 0x06 && m_pBufPtr[0] != 0x14) + return CP_STATE_INVALID_PACKET; + else if (m_pBufPtr[0] == 0x06 && m_pBufPtr[1] == 0x06 && m_pBufPtr[2] == 0x06) + { + m_nBodySize = 0; + return CP_STATE_COMPLETE; //ACK + } + else if (m_pBufPtr[0] == 0x15 && m_pBufPtr[1] == 0x15 && m_pBufPtr[2] == 0x15) + { + m_nBodySize = 0; + return CP_STATE_COMPLETE; //NACK + } + + //m_nBodySize = ntohs(*((unsigned short *)(m_pBufPtr + 4))); + unsigned short nBodySize; + memcpy(&nBodySize, m_pBufPtr + 1, sizeof(unsigned short)); + m_nBodySize = ntohs(nBodySize); + + if (m_nBodySize == 0) + { + m_nBodySize = 7; // CNT(1) + CMD(1) + GCD(1) + JCD(1) + ETX(1) + CRC(2) + + if ((m_nBodySize - 7) > m_nPakcetSize - CP_HEADER_SIZE) + { + m_nState = CP_STATE_BODY_REMAIN; + return m_nState; + } + else if ((m_nBodySize - 7) < m_nPakcetSize - CP_HEADER_SIZE) + { + m_nState = CP_STATE_JOINED; + return m_nState; + } + } + else + { + m_nBodySize++; // - LEN(2) + ETX(1) + CRC(2) + + if ((m_nBodySize - 1) > m_nPakcetSize - CP_HEADER_SIZE) + { + m_nState = CP_STATE_BODY_REMAIN; + return m_nState; + } + else if ((m_nBodySize - 1) < m_nPakcetSize - CP_HEADER_SIZE) + { + m_nState = CP_STATE_JOINED; + return m_nState; + } + } + + return CP_STATE_COMPLETE; +} + +inline int KiccProtocol::MoveNext() +{ + if (m_nState != CP_STATE_JOINED) + return -1; + + m_pBufPtr += CP_HEADER_SIZE + m_nBodySize; + m_pBodyPtr = m_pBufPtr + CP_HEADER_SIZE; + m_nPakcetSize -= CP_HEADER_SIZE + m_nBodySize; + + return 0; +} +//////////////////////////////////////////////////////////////////////////////// +///BeginHeader- size only protocol part ///////////////////////////////////////////////// +class CtSizeOnlyProtocol : public CtProtocol +{ +public: + enum + { + CP_MAX_PACKET_SIZE = 8192, + CP_HEADER_SIZE = 4, // PROTOCOL_NAME + BODY_SIZE(2byte) + CP_MAX_BODY_SIZE = CP_MAX_PACKET_SIZE - CP_HEADER_SIZE, + }; + +public: + inline CtSizeOnlyProtocol(); + virtual inline ~CtSizeOnlyProtocol(); + + inline void Clear(); + + inline void Append(const char * pData, size_t nSize); + inline void SetHeader(u_short nBodySize); + inline void BuildHeader(); + + inline int Parse(const char * pPacket, int nSize); + inline int MoveNext(); + +protected: + unsigned char m_buffer[CP_MAX_PACKET_SIZE]; +}; +///EndHeader- size only protocol part /////////////////////////////////////////////// + + + + +///BeginSource- size only protocol part ///////////////////////////////////////////////// +inline CtSizeOnlyProtocol::CtSizeOnlyProtocol() +{ + Clear(); +} + +inline CtSizeOnlyProtocol::~CtSizeOnlyProtocol() +{ +} + +inline void CtSizeOnlyProtocol::Clear() +{ + m_nState = CP_STATE_EMPTY; + m_nPakcetSize = 0; + m_nBodySize = 0; + m_pBodyPtr = m_buffer + CP_HEADER_SIZE; + m_pBufPtr = m_buffer; + m_nBufRemainSize = CP_MAX_PACKET_SIZE; + m_pBufRecvPtr = m_buffer; +} + +inline void CtSizeOnlyProtocol::Append(const char * pData, size_t nSize) +{ + memcpy(m_pBodyPtr + m_nBodySize, pData, nSize); + m_nBodySize += (int)nSize; +} + +inline void CtSizeOnlyProtocol::SetHeader(u_short nBodySize) +{ + //memcpy(m_buffer, ProtocolNamePtr(), 4); + unsigned short * pnBodySize = (unsigned short *)(m_buffer + 4); + *pnBodySize = htons(nBodySize); + m_nBodySize = nBodySize; + m_nPakcetSize = m_nBodySize + CP_HEADER_SIZE; +} + +inline void CtSizeOnlyProtocol::BuildHeader() +{ + //memcpy(m_buffer, ProtocolNamePtr(), 4); + unsigned short * pnBodySize = (unsigned short *)(m_buffer + 4); + *pnBodySize = htons(m_nBodySize); + m_nPakcetSize = m_nBodySize + CP_HEADER_SIZE; + m_nState = CP_STATE_COMPLETE; +} + +inline int CtSizeOnlyProtocol::Parse(const char * pPacket, int nSize) +{ + if (m_nState == CP_STATE_JOINED) + { + m_nState = CP_STATE_EMPTY; + } + else + { + if (pPacket != NULL && nSize != 0) + { + memcpy(m_buffer + m_nPakcetSize, pPacket, nSize); + m_nPakcetSize += nSize; + } + } + + if (m_nState == CP_STATE_EMPTY) + { + if (m_nPakcetSize < CP_HEADER_SIZE) + { + m_nState = CP_STATE_HEADER_REMAIN; + return m_nState; + } + } + else if (m_nState == CP_STATE_HEADER_REMAIN) + { + if (m_nPakcetSize < CP_HEADER_SIZE) + return m_nState; + } + else if (m_nState == CP_STATE_BODY_REMAIN) + { + if (m_nPakcetSize < CP_HEADER_SIZE + m_nBodySize) + return m_nState; + + return CP_STATE_COMPLETE; + } + + //if (memcmp(m_pBufPtr, CtSizeOnlyProtocol::ProtocolNamePtr(), 4) != 0) + // return CP_STATE_INVALID_PACKET; + + //m_nBodySize = ntohs(*((u_short *)(m_pBufPtr + 4))); + unsigned short nBodySize; + memcpy(&nBodySize, m_pBufPtr + 2, sizeof(unsigned short)); + m_nBodySize = ntohs(nBodySize); + + if (m_nBodySize > m_nPakcetSize - CP_HEADER_SIZE) + { + m_nState = CP_STATE_BODY_REMAIN; + return m_nState; + } + else if (m_nBodySize < m_nPakcetSize - CP_HEADER_SIZE) + { + m_nState = CP_STATE_JOINED; + return m_nState; + } + + return CP_STATE_COMPLETE; +} + +inline int CtSizeOnlyProtocol::MoveNext() +{ + if (m_nState != CP_STATE_JOINED) + return -1; + + m_pBufPtr += CP_HEADER_SIZE + m_nBodySize; + m_nPakcetSize -= CP_HEADER_SIZE + m_nBodySize; + + return 0; +} +/////////////////////////////////////////////////////////////////////////// + + + +class KiccDispatcher; + + +class KiccRecvCallBack : public CtProtocolRecvCallBack +{ +public: + KiccRecvCallBack() {} + virtual ~KiccRecvCallBack() {} + + void SetDepends(KiccProtocol * pKiccProtocol, KiccDispatcher * pKiccDispatcher) + { + m_pKiccProtocol = pKiccProtocol; + m_pKiccDispatcher = pKiccDispatcher; + } + + virtual int OnRecvProtocol(); + +protected: + KiccProtocol * m_pKiccProtocol; + KiccDispatcher * m_pKiccDispatcher; +}; + +class RemoteRecvCallBack : public CtProtocolRecvCallBack +{ +public: + RemoteRecvCallBack() {} + virtual ~RemoteRecvCallBack() {} + + void SetDepends(CtSizeOnlyProtocol * pSoProtocol, KiccDispatcher * pKiccDispatcher) + { + m_pSoProtocol = pSoProtocol; + m_pKiccDispatcher = pKiccDispatcher; + } + + virtual int OnRecvProtocol(); + +protected: + CtSizeOnlyProtocol * m_pSoProtocol; + KiccDispatcher * m_pKiccDispatcher; +}; +////////////////////////////////////////////////////////////////////////////// + +class KiccIompObject: public IompObject +{ +public: + //KiccIompObject * m_pPair; + +public: + KiccIompObject() + { + //m_pPair = NULL; + } + + ~KiccIompObject() {} +}; + +#if 0 +typedef struct TTerminalInfo +{ + unsigned char nRespCode; + char arrModelCode[4]; + char arrModelVer[4]; + char arrSerialNo[12]; + char arrCertNo[16]; + char arrTid[10]; + char arrTerminalNo[3]; + char arrTerminalIpPort[30]; + char * pSpecialInfo; +} TTerminalInfo; +#endif + +class KiccDispatcher : public IompDispatcher +{ +public: + enum + { + KD_KICC_STATE_STARTED = 0, + KD_KICC_STATE_WAIT_CONNECT = 1, + KD_KICC_STATE_CONNECTED = 2 + }; + + enum + { + KD_REMOTE_STATE_STARTED = 0, + KD_REMOTE_STATE_WAIT_CONNECT = 1, + KD_REMOTE_STATE_WAIT_LOGIN_OK = 2, + KD_REMOTE_STATE_LOGGED_IN = 3, + }; + +protected: + //int m_nState; + int m_nKiccState; + int m_nRemoteState; + char m_szTid[16]; + + KiccIompObject * m_pKiccIompObject; + KiccIompObject * m_pRemoteIompObject; + + KiccProtocol m_kiccProtocol; + KiccRecvCallBack m_kiccRecvCallBack; + + CtSizeOnlyProtocol m_remoteProtocol; + RemoteRecvCallBack m_remoteRecvCallBack; + +public: + KiccDispatcher() + { + m_nKiccState = KD_KICC_STATE_STARTED; + m_nRemoteState = KD_REMOTE_STATE_STARTED; + m_szTid[0] = '\0'; + } + + virtual ~KiccDispatcher() + { + } + + void SetTimer(unsigned int nIntervalTime) //msec + { + m_nDispachInterval = nIntervalTime; + } + + void KillTimer() + { + m_nDispachInterval = 0; + } + + void SendToRemote(int nType, const char * pData, int nDataSize) + { + char packet[8192]; + char * ptrBodySize = (char *)packet + 2; + char * ptrBody = ptrBodySize + 2; + + ptrBody[0] = nType; // 1: Command Protocol, 2: KICC protocol + + unsigned short nBodySize = nDataSize; + memcpy(ptrBody + 1, pData, nBodySize); + nBodySize += 1; + + unsigned short nTemp = htons(nBodySize); + memcpy(ptrBodySize, &nTemp, sizeof(unsigned short)); + + fprintf(stdout, "DEBUG, SendToRemote, size = %d, \n", nBodySize + 4); + m_pRemoteIompObject->TcpCompleteSend(packet, nBodySize + 4); // send kicc protocol to server + } + + void SendTest1ToRemote(int nType) + { + char szFileName[128]; + sprintf(szFileName, "pay%.2d.raw", nType); + + CtFile file; + if (file.Open(szFileName, CtFile::FMODE_RDONLY) == false) + return; + + char buffer[8192]; + size_t nRecvSize = file.Read(buffer, 8192); + if (nRecvSize <= 0) + return; + + SendToRemote(2, buffer, nRecvSize); + } + + int OnRecvKiccProtocol() // m_nKiccState == KD_KICC_STATE_CONNECTED + { + if ((m_kiccProtocol.GetPacketPtr()[0] == 0x06 && m_kiccProtocol.GetPacketPtr()[1] == 0x06 && m_kiccProtocol.GetPacketPtr()[2] == 0x06) || + m_kiccProtocol.GetPacketPtr()[0] == 0x15 && m_kiccProtocol.GetPacketPtr()[1] == 0x15 && m_kiccProtocol.GetPacketPtr()[2] == 0x15) // ACK + { + fprintf(stdout, "DEBUG, OnRecvKiccProtocol, ACK/NACK, 0x%x, size = %d\n", m_kiccProtocol.GetPacketPtr()[0], m_kiccProtocol.GetPacketSize()); + + if (m_nRemoteState == KD_REMOTE_STATE_LOGGED_IN) + { + SendToRemote(2, (const char *)m_kiccProtocol.GetPacketPtr(), m_kiccProtocol.GetPacketSize()); + } + + return 0; + } + + fprintf(stdout, "DEBUG, OnRecvKiccProtocol, body size = %d, 0x%.2d, 0x%.2d, 0x%.2d\n", m_kiccProtocol.GetBodySize(), m_kiccProtocol.GetBodyPtr()[0], m_kiccProtocol.GetBodyPtr()[1], m_kiccProtocol.GetBodyPtr()[2]); + + unsigned char ack[4]; + ack[0] = 0x06; + ack[1] = 0x06; + ack[2] = 0x06; + m_pKiccIompObject->TcpCompleteSend((const char *)ack, 3); // response ack + + if (m_nRemoteState == KD_REMOTE_STATE_STARTED) + { + const char * ptrTid = (const char *)m_kiccProtocol.GetBodyPtr() + 41; + int j = 0; + for (int i = 0; i < 10; i++) // front trim + { + if (ptrTid[i] == ' ') + continue; + + m_szTid[j++] = ptrTid[i]; + } + m_szTid[j] = '\0'; + + fprintf(stdout, "DEBUG, OnRecvKiccProtocol, Tid = %s\n", m_szTid); + + if (m_szTid[0] == '\0') + { + //... + SendToKicc(m_pKiccIompObject, 0x02, NULL, 0); // get info + return 0; + } + + + KiccIompObject iompObject; + if (iompObject.Create() == -1) + return 0; + + //if (iompObject.Connect("192.168.219.150", 17856, 7000, 0, 5000) == -1) + if (iompObject.Connect("43.201.46.125", 17856, 7000, 0, 5000) == -1) + return 0; + + m_remoteRecvCallBack.SetDepends(&m_remoteProtocol, this); + m_pRemoteIompObject = AddSocket(iompObject); + + m_nRemoteState = KD_REMOTE_STATE_WAIT_CONNECT; + + return 0; + } + else if (m_nRemoteState == KD_REMOTE_STATE_WAIT_CONNECT) + { + //... + } + else if (m_nRemoteState == KD_REMOTE_STATE_WAIT_LOGIN_OK) + { + //... + } + else if (m_nRemoteState == KD_REMOTE_STATE_LOGGED_IN) + { + SendToRemote(2, (const char *)m_kiccProtocol.GetPacketPtr(), m_kiccProtocol.GetPacketSize()); + } + + return 0; + } + + int OnRecvRemoteProtocol() // m_nRemoteState == KD_REMOTE_STATE_WAIT_LOGIN_OK or KD_REMOTE_STATE_LOGGED_IN + { + fprintf(stdout, "DEBUG, OnRecvRemoteProtocol, body size = %d, 0x%.2d, 0x%.2d\n", m_remoteProtocol.GetBodySize(), m_remoteProtocol.GetBodyPtr()[0], m_remoteProtocol.GetBodyPtr()[1]); + const unsigned char * pPacket = m_remoteProtocol.GetPacketPtr(); + + fprintf(stdout, "DEBUG, %x %x %x %x %x\n", pPacket[0], pPacket[1], pPacket[2], pPacket[3], pPacket[4], pPacket[5]); + + if (m_nRemoteState == KD_REMOTE_STATE_WAIT_LOGIN_OK) + { + if (m_remoteProtocol.GetBodyPtr()[0] == 1 && // smart service protocol + m_remoteProtocol.GetBodyPtr()[1] == 1) // login ok + { + fprintf(stdout, "DEBUG, OnRecvRemoteProtocol, login success\n"); + m_nRemoteState = KD_REMOTE_STATE_LOGGED_IN; + return 0; + } + + //login failed + return -1; // disconnect + } + + if (m_nKiccState == KD_KICC_STATE_WAIT_CONNECT) + { + //... + return 0; + } + else if (m_nKiccState == KD_KICC_STATE_CONNECTED) + { + if (m_remoteProtocol.GetBodyPtr()[0] == 1) // remote server protocol + { + if (m_remoteProtocol.GetBodyPtr()[1] == 2) // keep-alive + { + fprintf(stdout, "DEBUG, OnRecvRemoteProtocol, keep-alive\n"); + SendToRemote(1, "3", 1); // keep-alive ack + } + else if (m_remoteProtocol.GetBodyPtr()[1] == 99) // test packet + { + SendTest1ToRemote(m_remoteProtocol.GetBodyPtr()[2]); + } + + return 0; + } + else if (m_remoteProtocol.GetBodyPtr()[0] == 2) // kicc protocol + { + const char * pBody = (const char *)m_remoteProtocol.GetBodyPtr(); + m_pKiccIompObject->TcpCompleteSend(pBody + 1, m_remoteProtocol.GetBodySize() - 1); // remove protocol type + return 0; + } + + return 0; // disconnect + } + + return -1; // disconnect + } + +protected: + int OnIompConnect(KiccIompObject * pIomp, bool bIsSuccess, unsigned int nCurrTick) + { + fprintf(stdout, "DEBUG, OnIompConnect, %s, state = %d, sock = %d\n", bIsSuccess ? "true" : "false", m_nKiccState, m_nRemoteState, pIomp->m_sock); + if (bIsSuccess == false) + return 0; + + if (m_pKiccIompObject == pIomp) + { + if (m_szTid[0] == '\0') + { + SendToKicc(pIomp, 0x02, NULL, 0); // get info + } + + m_nKiccState = KD_KICC_STATE_CONNECTED; + } + else if (m_pRemoteIompObject == pIomp) + { + // + char packet[8192]; + char * ptrBodySize = (char *)packet + 2; + char * ptrBody = ptrBodySize + 2; + + ptrBody[0] = 1; // 1: Command Protocol, 2: KICC protocol + ptrBody[1] = 1; // 1: Login + + //int nBodySize = sprintf(ptrBody + 2, "%s", m_szTid); + unsigned int nBodySize = strlen(m_szTid); + memcpy(ptrBody + 2, m_szTid, nBodySize); + + nBodySize += 2; + unsigned short nTemp = htons(nBodySize); + memcpy(ptrBodySize, &nTemp, sizeof(unsigned short)); + + fprintf(stdout, "DEBUG, Send, size = %d, \n", nBodySize + 4); + m_pRemoteIompObject->TcpCompleteSend(packet, nBodySize + 4); // send login + // + + m_nRemoteState = KD_REMOTE_STATE_WAIT_LOGIN_OK; + } + + return 0; + } + + int OnIompReceive(KiccIompObject * pIomp, unsigned int nCurrTick) + { + if (m_pKiccIompObject == pIomp) + { + int nReceived = pIomp->Receive((char *)m_kiccProtocol.GetBufRecvPtr(), m_kiccProtocol.GetBufRemainSize()); + if (nReceived == -1) + return -1; + + return m_kiccProtocol.OnReceive(nReceived, &m_kiccRecvCallBack); + } + else if (m_pRemoteIompObject == pIomp) + { + int nReceived = pIomp->Receive((char *)m_remoteProtocol.GetBufRecvPtr(), m_remoteProtocol.GetBufRemainSize()); + if (nReceived == -1) + return -1; + + return m_remoteProtocol.OnReceive(nReceived, &m_remoteRecvCallBack); + } + + return -1; // disconnect + } + + int OnIompAccept(KiccIompObject * pIomp, unsigned int nCurrTick) + { + fprintf(stdout, "DEBUG, OnIompAccept, sock = %d\n", pIomp->m_sock); + + return 0; + } + + int OnIompClose(KiccIompObject * pIomp, unsigned int nCurrTick) + { + fprintf(stdout, "DEBUG, OnIompClose, sock = %d\n", pIomp->m_sock); + + if (m_pKiccIompObject == pIomp) + { + m_kiccProtocol.Clear(); + m_nKiccState = KD_KICC_STATE_WAIT_CONNECT; + } + else if (m_pRemoteIompObject == pIomp) + { + m_remoteProtocol.Clear(); + m_nRemoteState = KD_REMOTE_STATE_WAIT_CONNECT; + } + + return 0; //default, remove from dispatch list + //return -1; //!!! no remove from dispatch list + } + + int OnIompDelete(KiccIompObject * pIomp, unsigned int nCurrTick) + { + fprintf(stdout, "DEBUG, OnIompDelete, sock = %d\n", pIomp->m_sock); + + return 0; + } + + void OnDispatchTimer(unsigned int nCurrTick) + { + fprintf(stdout, "DEBUG, %u, OnDispatchTimer, m_listIomp.size() = %ld\n", nCurrTick, m_listIomp.size()); + + if (m_nKiccState == KD_KICC_STATE_STARTED) + { + KiccIompObject iompObject; + if (iompObject.Create() == -1) + return; + + if (iompObject.Connect("127.0.0.1", 13189, 7000, nCurrTick, 5000) == -1) + //if (iompObject.Connect("192.168.219.150", 13189, 7000, 5000) == -1) + return; + + m_kiccRecvCallBack.SetDepends(&m_kiccProtocol, this); + m_pKiccIompObject = AddSocket(iompObject); + + m_nKiccState = KD_KICC_STATE_WAIT_CONNECT; // local connecting... + KillTimer(); + } + } +}; + + +int KiccRecvCallBack::OnRecvProtocol() +{ + return m_pKiccDispatcher->OnRecvKiccProtocol(); +} + +int RemoteRecvCallBack::OnRecvProtocol() +{ + return m_pKiccDispatcher->OnRecvRemoteProtocol(); +} + + + +int main (int argc, char * argv[]) +{ + //if (argc < 3) + //{ + // printf("Usage: hdtermd [IP] [Port]\n" + // "ex) hdtermd 192.168.1.4 7788\n"); + // return 0; + //} + +#if defined(_WIN32) && defined(_DEBUG) + _CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF | _CRTDBG_ALLOC_MEM_DF); + //_CrtSetBreakAlloc(631); +#endif // _DEBUG + +#ifdef _WIN32 + WSADATA wsaData; + WORD wVersionRequested = MAKEWORD(2, 2); + if (WSAStartup(wVersionRequested, &wsaData) != 0) + { + printf("[ERROR], Windows sockets initialization failed., WSAGetLastError = %d\n", WSAGetLastError()); + return -1; + } + + if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) + { + printf("[ERROR], Could not find a usable WinSock DLL.\n"); + WSACleanup(); + return -1; + } +#endif // _WIN32 + + fprintf(stdout, "hdtermd version 1.0.2\n"); + + // verify date + for (;;) + { + time_t now; + struct tm *local; + + time(&now); + local = localtime(&now); + + int year = local->tm_year + 1900; + + if (year < 2026) + { + fprintf(stderr, "[ERROR], Invalid date, = %ld\n", year); + Sleep(5000); + continue; + } + + break; + } + // + + KiccDispatcher iompDispatcher; + iompDispatcher.SetTimer(2000); + iompDispatcher.Dispatch(); // loop + + return 0; +} diff --git a/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/allocators.h b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/allocators.h new file mode 100644 index 0000000..06b3420 --- /dev/null +++ b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/allocators.h @@ -0,0 +1,284 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_ALLOCATORS_H_ +#define RAPIDJSON_ALLOCATORS_H_ + +#include "rapidjson.h" + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// Allocator + +/*! \class rapidjson::Allocator + \brief Concept for allocating, resizing and freeing memory block. + + Note that Malloc() and Realloc() are non-static but Free() is static. + + So if an allocator need to support Free(), it needs to put its pointer in + the header of memory block. + +\code +concept Allocator { + static const bool kNeedFree; //!< Whether this allocator needs to call Free(). + + // Allocate a memory block. + // \param size of the memory block in bytes. + // \returns pointer to the memory block. + void* Malloc(size_t size); + + // Resize a memory block. + // \param originalPtr The pointer to current memory block. Null pointer is permitted. + // \param originalSize The current size in bytes. (Design issue: since some allocator may not book-keep this, explicitly pass to it can save memory.) + // \param newSize the new size in bytes. + void* Realloc(void* originalPtr, size_t originalSize, size_t newSize); + + // Free a memory block. + // \param pointer to the memory block. Null pointer is permitted. + static void Free(void *ptr); +}; +\endcode +*/ + + +/*! \def RAPIDJSON_ALLOCATOR_DEFUALT_CHUNK_CAPACITY + \ingroup RAPIDJSON_CONFIG + \brief User-defined kDefaultChunkCapacity definition. + + User can define this as any \c size that is a power of 2. +*/ + +#ifndef RAPIDJSON_ALLOCATOR_DEFAULT_CHUNK_CAPACITY +#define RAPIDJSON_ALLOCATOR_DEFAULT_CHUNK_CAPACITY (64 * 1024) +#endif + + +/////////////////////////////////////////////////////////////////////////////// +// CrtAllocator + +//! C-runtime library allocator. +/*! This class is just wrapper for standard C library memory routines. + \note implements Allocator concept +*/ +class CrtAllocator { +public: + static const bool kNeedFree = true; + void* Malloc(size_t size) { + if (size) // behavior of malloc(0) is implementation defined. + return std::malloc(size); + else + return NULL; // standardize to returning NULL. + } + void* Realloc(void* originalPtr, size_t originalSize, size_t newSize) { + (void)originalSize; + if (newSize == 0) { + std::free(originalPtr); + return NULL; + } + return std::realloc(originalPtr, newSize); + } + static void Free(void *ptr) { std::free(ptr); } +}; + +/////////////////////////////////////////////////////////////////////////////// +// MemoryPoolAllocator + +//! Default memory allocator used by the parser and DOM. +/*! This allocator allocate memory blocks from pre-allocated memory chunks. + + It does not free memory blocks. And Realloc() only allocate new memory. + + The memory chunks are allocated by BaseAllocator, which is CrtAllocator by default. + + User may also supply a buffer as the first chunk. + + If the user-buffer is full then additional chunks are allocated by BaseAllocator. + + The user-buffer is not deallocated by this allocator. + + \tparam BaseAllocator the allocator type for allocating memory chunks. Default is CrtAllocator. + \note implements Allocator concept +*/ +template +class MemoryPoolAllocator { +public: + static const bool kNeedFree = false; //!< Tell users that no need to call Free() with this allocator. (concept Allocator) + + //! Constructor with chunkSize. + /*! \param chunkSize The size of memory chunk. The default is kDefaultChunkSize. + \param baseAllocator The allocator for allocating memory chunks. + */ + MemoryPoolAllocator(size_t chunkSize = kDefaultChunkCapacity, BaseAllocator* baseAllocator = 0) : + chunkHead_(0), chunk_capacity_(chunkSize), userBuffer_(0), baseAllocator_(baseAllocator), ownBaseAllocator_(0) + { + } + + //! Constructor with user-supplied buffer. + /*! The user buffer will be used firstly. When it is full, memory pool allocates new chunk with chunk size. + + The user buffer will not be deallocated when this allocator is destructed. + + \param buffer User supplied buffer. + \param size Size of the buffer in bytes. It must at least larger than sizeof(ChunkHeader). + \param chunkSize The size of memory chunk. The default is kDefaultChunkSize. + \param baseAllocator The allocator for allocating memory chunks. + */ + MemoryPoolAllocator(void *buffer, size_t size, size_t chunkSize = kDefaultChunkCapacity, BaseAllocator* baseAllocator = 0) : + chunkHead_(0), chunk_capacity_(chunkSize), userBuffer_(buffer), baseAllocator_(baseAllocator), ownBaseAllocator_(0) + { + RAPIDJSON_ASSERT(buffer != 0); + RAPIDJSON_ASSERT(size > sizeof(ChunkHeader)); + chunkHead_ = reinterpret_cast(buffer); + chunkHead_->capacity = size - sizeof(ChunkHeader); + chunkHead_->size = 0; + chunkHead_->next = 0; + } + + //! Destructor. + /*! This deallocates all memory chunks, excluding the user-supplied buffer. + */ + ~MemoryPoolAllocator() { + Clear(); + RAPIDJSON_DELETE(ownBaseAllocator_); + } + + //! Deallocates all memory chunks, excluding the user-supplied buffer. + void Clear() { + while (chunkHead_ && chunkHead_ != userBuffer_) { + ChunkHeader* next = chunkHead_->next; + baseAllocator_->Free(chunkHead_); + chunkHead_ = next; + } + if (chunkHead_ && chunkHead_ == userBuffer_) + chunkHead_->size = 0; // Clear user buffer + } + + //! Computes the total capacity of allocated memory chunks. + /*! \return total capacity in bytes. + */ + size_t Capacity() const { + size_t capacity = 0; + for (ChunkHeader* c = chunkHead_; c != 0; c = c->next) + capacity += c->capacity; + return capacity; + } + + //! Computes the memory blocks allocated. + /*! \return total used bytes. + */ + size_t Size() const { + size_t size = 0; + for (ChunkHeader* c = chunkHead_; c != 0; c = c->next) + size += c->size; + return size; + } + + //! Allocates a memory block. (concept Allocator) + void* Malloc(size_t size) { + if (!size) + return NULL; + + size = RAPIDJSON_ALIGN(size); + if (chunkHead_ == 0 || chunkHead_->size + size > chunkHead_->capacity) + if (!AddChunk(chunk_capacity_ > size ? chunk_capacity_ : size)) + return NULL; + + void *buffer = reinterpret_cast(chunkHead_) + RAPIDJSON_ALIGN(sizeof(ChunkHeader)) + chunkHead_->size; + chunkHead_->size += size; + return buffer; + } + + //! Resizes a memory block (concept Allocator) + void* Realloc(void* originalPtr, size_t originalSize, size_t newSize) { + if (originalPtr == 0) + return Malloc(newSize); + + if (newSize == 0) + return NULL; + + originalSize = RAPIDJSON_ALIGN(originalSize); + newSize = RAPIDJSON_ALIGN(newSize); + + // Do not shrink if new size is smaller than original + if (originalSize >= newSize) + return originalPtr; + + // Simply expand it if it is the last allocation and there is sufficient space + if (originalPtr == reinterpret_cast(chunkHead_) + RAPIDJSON_ALIGN(sizeof(ChunkHeader)) + chunkHead_->size - originalSize) { + size_t increment = static_cast(newSize - originalSize); + if (chunkHead_->size + increment <= chunkHead_->capacity) { + chunkHead_->size += increment; + return originalPtr; + } + } + + // Realloc process: allocate and copy memory, do not free original buffer. + if (void* newBuffer = Malloc(newSize)) { + if (originalSize) + std::memcpy(newBuffer, originalPtr, originalSize); + return newBuffer; + } + else + return NULL; + } + + //! Frees a memory block (concept Allocator) + static void Free(void *ptr) { (void)ptr; } // Do nothing + +private: + //! Copy constructor is not permitted. + MemoryPoolAllocator(const MemoryPoolAllocator& rhs) /* = delete */; + //! Copy assignment operator is not permitted. + MemoryPoolAllocator& operator=(const MemoryPoolAllocator& rhs) /* = delete */; + + //! Creates a new chunk. + /*! \param capacity Capacity of the chunk in bytes. + \return true if success. + */ + bool AddChunk(size_t capacity) { + if (!baseAllocator_) + ownBaseAllocator_ = baseAllocator_ = RAPIDJSON_NEW(BaseAllocator)(); + if (ChunkHeader* chunk = reinterpret_cast(baseAllocator_->Malloc(RAPIDJSON_ALIGN(sizeof(ChunkHeader)) + capacity))) { + chunk->capacity = capacity; + chunk->size = 0; + chunk->next = chunkHead_; + chunkHead_ = chunk; + return true; + } + else + return false; + } + + static const int kDefaultChunkCapacity = RAPIDJSON_ALLOCATOR_DEFAULT_CHUNK_CAPACITY; //!< Default chunk capacity. + + //! Chunk header for perpending to each chunk. + /*! Chunks are stored as a singly linked list. + */ + struct ChunkHeader { + size_t capacity; //!< Capacity of the chunk in bytes (excluding the header itself). + size_t size; //!< Current size of allocated memory in bytes. + ChunkHeader *next; //!< Next chunk in the linked list. + }; + + ChunkHeader *chunkHead_; //!< Head of the chunk linked-list. Only the head chunk serves allocation. + size_t chunk_capacity_; //!< The minimum capacity of chunk when they are allocated. + void *userBuffer_; //!< User supplied buffer. + BaseAllocator* baseAllocator_; //!< base allocator for allocating memory chunks. + BaseAllocator* ownBaseAllocator_; //!< base allocator created by this object. +}; + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_ENCODINGS_H_ diff --git a/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/cursorstreamwrapper.h b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/cursorstreamwrapper.h new file mode 100644 index 0000000..52c11a7 --- /dev/null +++ b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/cursorstreamwrapper.h @@ -0,0 +1,78 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_CURSORSTREAMWRAPPER_H_ +#define RAPIDJSON_CURSORSTREAMWRAPPER_H_ + +#include "stream.h" + +#if defined(__GNUC__) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif + +#if defined(_MSC_VER) && _MSC_VER <= 1800 +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4702) // unreachable code +RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated +#endif + +RAPIDJSON_NAMESPACE_BEGIN + + +//! Cursor stream wrapper for counting line and column number if error exists. +/*! + \tparam InputStream Any stream that implements Stream Concept +*/ +template > +class CursorStreamWrapper : public GenericStreamWrapper { +public: + typedef typename Encoding::Ch Ch; + + CursorStreamWrapper(InputStream& is): + GenericStreamWrapper(is), line_(1), col_(0) {} + + // counting line and column number + Ch Take() { + Ch ch = this->is_.Take(); + if(ch == '\n') { + line_ ++; + col_ = 0; + } else { + col_ ++; + } + return ch; + } + + //! Get the error line number, if error exists. + size_t GetLine() const { return line_; } + //! Get the error column number, if error exists. + size_t GetColumn() const { return col_; } + +private: + size_t line_; //!< Current Line + size_t col_; //!< Current Column +}; + +#if defined(_MSC_VER) && _MSC_VER <= 1800 +RAPIDJSON_DIAG_POP +#endif + +#if defined(__GNUC__) +RAPIDJSON_DIAG_POP +#endif + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_CURSORSTREAMWRAPPER_H_ diff --git a/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/document.h b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/document.h new file mode 100644 index 0000000..5e83803 --- /dev/null +++ b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/document.h @@ -0,0 +1,2646 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_DOCUMENT_H_ +#define RAPIDJSON_DOCUMENT_H_ + +/*! \file document.h */ + +#include "reader.h" +#include "internal/meta.h" +#include "internal/strfunc.h" +#include "memorystream.h" +#include "encodedstream.h" +#include // placement new +#include + +RAPIDJSON_DIAG_PUSH +#ifdef __clang__ +RAPIDJSON_DIAG_OFF(padded) +RAPIDJSON_DIAG_OFF(switch-enum) +RAPIDJSON_DIAG_OFF(c++98-compat) +#elif defined(_MSC_VER) +RAPIDJSON_DIAG_OFF(4127) // conditional expression is constant +RAPIDJSON_DIAG_OFF(4244) // conversion from kXxxFlags to 'uint16_t', possible loss of data +#endif + +#ifdef __GNUC__ +RAPIDJSON_DIAG_OFF(effc++) +#endif // __GNUC__ + +#ifndef RAPIDJSON_NOMEMBERITERATORCLASS +#include // std::random_access_iterator_tag +#endif + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS +#include // std::move +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +// Forward declaration. +template +class GenericValue; + +template +class GenericDocument; + +//! Name-value pair in a JSON object value. +/*! + This class was internal to GenericValue. It used to be a inner struct. + But a compiler (IBM XL C/C++ for AIX) have reported to have problem with that so it moved as a namespace scope struct. + https://code.google.com/p/rapidjson/issues/detail?id=64 +*/ +template +struct GenericMember { + GenericValue name; //!< name of member (must be a string) + GenericValue value; //!< value of member. +}; + +/////////////////////////////////////////////////////////////////////////////// +// GenericMemberIterator + +#ifndef RAPIDJSON_NOMEMBERITERATORCLASS + +//! (Constant) member iterator for a JSON object value +/*! + \tparam Const Is this a constant iterator? + \tparam Encoding Encoding of the value. (Even non-string values need to have the same encoding in a document) + \tparam Allocator Allocator type for allocating memory of object, array and string. + + This class implements a Random Access Iterator for GenericMember elements + of a GenericValue, see ISO/IEC 14882:2003(E) C++ standard, 24.1 [lib.iterator.requirements]. + + \note This iterator implementation is mainly intended to avoid implicit + conversions from iterator values to \c NULL, + e.g. from GenericValue::FindMember. + + \note Define \c RAPIDJSON_NOMEMBERITERATORCLASS to fall back to a + pointer-based implementation, if your platform doesn't provide + the C++ header. + + \see GenericMember, GenericValue::MemberIterator, GenericValue::ConstMemberIterator + */ +template +class GenericMemberIterator { + + friend class GenericValue; + template friend class GenericMemberIterator; + + typedef GenericMember PlainType; + typedef typename internal::MaybeAddConst::Type ValueType; + +public: + //! Iterator type itself + typedef GenericMemberIterator Iterator; + //! Constant iterator type + typedef GenericMemberIterator ConstIterator; + //! Non-constant iterator type + typedef GenericMemberIterator NonConstIterator; + + /** \name std::iterator_traits support */ + //@{ + typedef ValueType value_type; + typedef ValueType * pointer; + typedef ValueType & reference; + typedef std::ptrdiff_t difference_type; + typedef std::random_access_iterator_tag iterator_category; + //@} + + //! Pointer to (const) GenericMember + typedef pointer Pointer; + //! Reference to (const) GenericMember + typedef reference Reference; + //! Signed integer type (e.g. \c ptrdiff_t) + typedef difference_type DifferenceType; + + //! Default constructor (singular value) + /*! Creates an iterator pointing to no element. + \note All operations, except for comparisons, are undefined on such values. + */ + GenericMemberIterator() : ptr_() {} + + //! Iterator conversions to more const + /*! + \param it (Non-const) iterator to copy from + + Allows the creation of an iterator from another GenericMemberIterator + that is "less const". Especially, creating a non-constant iterator + from a constant iterator are disabled: + \li const -> non-const (not ok) + \li const -> const (ok) + \li non-const -> const (ok) + \li non-const -> non-const (ok) + + \note If the \c Const template parameter is already \c false, this + constructor effectively defines a regular copy-constructor. + Otherwise, the copy constructor is implicitly defined. + */ + GenericMemberIterator(const NonConstIterator & it) : ptr_(it.ptr_) {} + Iterator& operator=(const NonConstIterator & it) { ptr_ = it.ptr_; return *this; } + + //! @name stepping + //@{ + Iterator& operator++(){ ++ptr_; return *this; } + Iterator& operator--(){ --ptr_; return *this; } + Iterator operator++(int){ Iterator old(*this); ++ptr_; return old; } + Iterator operator--(int){ Iterator old(*this); --ptr_; return old; } + //@} + + //! @name increment/decrement + //@{ + Iterator operator+(DifferenceType n) const { return Iterator(ptr_+n); } + Iterator operator-(DifferenceType n) const { return Iterator(ptr_-n); } + + Iterator& operator+=(DifferenceType n) { ptr_+=n; return *this; } + Iterator& operator-=(DifferenceType n) { ptr_-=n; return *this; } + //@} + + //! @name relations + //@{ + bool operator==(ConstIterator that) const { return ptr_ == that.ptr_; } + bool operator!=(ConstIterator that) const { return ptr_ != that.ptr_; } + bool operator<=(ConstIterator that) const { return ptr_ <= that.ptr_; } + bool operator>=(ConstIterator that) const { return ptr_ >= that.ptr_; } + bool operator< (ConstIterator that) const { return ptr_ < that.ptr_; } + bool operator> (ConstIterator that) const { return ptr_ > that.ptr_; } + //@} + + //! @name dereference + //@{ + Reference operator*() const { return *ptr_; } + Pointer operator->() const { return ptr_; } + Reference operator[](DifferenceType n) const { return ptr_[n]; } + //@} + + //! Distance + DifferenceType operator-(ConstIterator that) const { return ptr_-that.ptr_; } + +private: + //! Internal constructor from plain pointer + explicit GenericMemberIterator(Pointer p) : ptr_(p) {} + + Pointer ptr_; //!< raw pointer +}; + +#else // RAPIDJSON_NOMEMBERITERATORCLASS + +// class-based member iterator implementation disabled, use plain pointers + +template +struct GenericMemberIterator; + +//! non-const GenericMemberIterator +template +struct GenericMemberIterator { + //! use plain pointer as iterator type + typedef GenericMember* Iterator; +}; +//! const GenericMemberIterator +template +struct GenericMemberIterator { + //! use plain const pointer as iterator type + typedef const GenericMember* Iterator; +}; + +#endif // RAPIDJSON_NOMEMBERITERATORCLASS + +/////////////////////////////////////////////////////////////////////////////// +// GenericStringRef + +//! Reference to a constant string (not taking a copy) +/*! + \tparam CharType character type of the string + + This helper class is used to automatically infer constant string + references for string literals, especially from \c const \b (!) + character arrays. + + The main use is for creating JSON string values without copying the + source string via an \ref Allocator. This requires that the referenced + string pointers have a sufficient lifetime, which exceeds the lifetime + of the associated GenericValue. + + \b Example + \code + Value v("foo"); // ok, no need to copy & calculate length + const char foo[] = "foo"; + v.SetString(foo); // ok + + const char* bar = foo; + // Value x(bar); // not ok, can't rely on bar's lifetime + Value x(StringRef(bar)); // lifetime explicitly guaranteed by user + Value y(StringRef(bar, 3)); // ok, explicitly pass length + \endcode + + \see StringRef, GenericValue::SetString +*/ +template +struct GenericStringRef { + typedef CharType Ch; //!< character type of the string + + //! Create string reference from \c const character array +#ifndef __clang__ // -Wdocumentation + /*! + This constructor implicitly creates a constant string reference from + a \c const character array. It has better performance than + \ref StringRef(const CharType*) by inferring the string \ref length + from the array length, and also supports strings containing null + characters. + + \tparam N length of the string, automatically inferred + + \param str Constant character array, lifetime assumed to be longer + than the use of the string in e.g. a GenericValue + + \post \ref s == str + + \note Constant complexity. + \note There is a hidden, private overload to disallow references to + non-const character arrays to be created via this constructor. + By this, e.g. function-scope arrays used to be filled via + \c snprintf are excluded from consideration. + In such cases, the referenced string should be \b copied to the + GenericValue instead. + */ +#endif + template + GenericStringRef(const CharType (&str)[N]) RAPIDJSON_NOEXCEPT + : s(str), length(N-1) {} + + //! Explicitly create string reference from \c const character pointer +#ifndef __clang__ // -Wdocumentation + /*! + This constructor can be used to \b explicitly create a reference to + a constant string pointer. + + \see StringRef(const CharType*) + + \param str Constant character pointer, lifetime assumed to be longer + than the use of the string in e.g. a GenericValue + + \post \ref s == str + + \note There is a hidden, private overload to disallow references to + non-const character arrays to be created via this constructor. + By this, e.g. function-scope arrays used to be filled via + \c snprintf are excluded from consideration. + In such cases, the referenced string should be \b copied to the + GenericValue instead. + */ +#endif + explicit GenericStringRef(const CharType* str) + : s(str), length(NotNullStrLen(str)) {} + + //! Create constant string reference from pointer and length +#ifndef __clang__ // -Wdocumentation + /*! \param str constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue + \param len length of the string, excluding the trailing NULL terminator + + \post \ref s == str && \ref length == len + \note Constant complexity. + */ +#endif + GenericStringRef(const CharType* str, SizeType len) + : s(RAPIDJSON_LIKELY(str) ? str : emptyString), length(len) { RAPIDJSON_ASSERT(str != 0 || len == 0u); } + + GenericStringRef(const GenericStringRef& rhs) : s(rhs.s), length(rhs.length) {} + + //! implicit conversion to plain CharType pointer + operator const Ch *() const { return s; } + + const Ch* const s; //!< plain CharType pointer + const SizeType length; //!< length of the string (excluding the trailing NULL terminator) + +private: + SizeType NotNullStrLen(const CharType* str) { + RAPIDJSON_ASSERT(str != 0); + return internal::StrLen(str); + } + + /// Empty string - used when passing in a NULL pointer + static const Ch emptyString[]; + + //! Disallow construction from non-const array + template + GenericStringRef(CharType (&str)[N]) /* = delete */; + //! Copy assignment operator not permitted - immutable type + GenericStringRef& operator=(const GenericStringRef& rhs) /* = delete */; +}; + +template +const CharType GenericStringRef::emptyString[] = { CharType() }; + +//! Mark a character pointer as constant string +/*! Mark a plain character pointer as a "string literal". This function + can be used to avoid copying a character string to be referenced as a + value in a JSON GenericValue object, if the string's lifetime is known + to be valid long enough. + \tparam CharType Character type of the string + \param str Constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue + \return GenericStringRef string reference object + \relatesalso GenericStringRef + + \see GenericValue::GenericValue(StringRefType), GenericValue::operator=(StringRefType), GenericValue::SetString(StringRefType), GenericValue::PushBack(StringRefType, Allocator&), GenericValue::AddMember +*/ +template +inline GenericStringRef StringRef(const CharType* str) { + return GenericStringRef(str); +} + +//! Mark a character pointer as constant string +/*! Mark a plain character pointer as a "string literal". This function + can be used to avoid copying a character string to be referenced as a + value in a JSON GenericValue object, if the string's lifetime is known + to be valid long enough. + + This version has better performance with supplied length, and also + supports string containing null characters. + + \tparam CharType character type of the string + \param str Constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue + \param length The length of source string. + \return GenericStringRef string reference object + \relatesalso GenericStringRef +*/ +template +inline GenericStringRef StringRef(const CharType* str, size_t length) { + return GenericStringRef(str, SizeType(length)); +} + +#if RAPIDJSON_HAS_STDSTRING +//! Mark a string object as constant string +/*! Mark a string object (e.g. \c std::string) as a "string literal". + This function can be used to avoid copying a string to be referenced as a + value in a JSON GenericValue object, if the string's lifetime is known + to be valid long enough. + + \tparam CharType character type of the string + \param str Constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue + \return GenericStringRef string reference object + \relatesalso GenericStringRef + \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING. +*/ +template +inline GenericStringRef StringRef(const std::basic_string& str) { + return GenericStringRef(str.data(), SizeType(str.size())); +} +#endif + +/////////////////////////////////////////////////////////////////////////////// +// GenericValue type traits +namespace internal { + +template +struct IsGenericValueImpl : FalseType {}; + +// select candidates according to nested encoding and allocator types +template struct IsGenericValueImpl::Type, typename Void::Type> + : IsBaseOf, T>::Type {}; + +// helper to match arbitrary GenericValue instantiations, including derived classes +template struct IsGenericValue : IsGenericValueImpl::Type {}; + +} // namespace internal + +/////////////////////////////////////////////////////////////////////////////// +// TypeHelper + +namespace internal { + +template +struct TypeHelper {}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsBool(); } + static bool Get(const ValueType& v) { return v.GetBool(); } + static ValueType& Set(ValueType& v, bool data) { return v.SetBool(data); } + static ValueType& Set(ValueType& v, bool data, typename ValueType::AllocatorType&) { return v.SetBool(data); } +}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsInt(); } + static int Get(const ValueType& v) { return v.GetInt(); } + static ValueType& Set(ValueType& v, int data) { return v.SetInt(data); } + static ValueType& Set(ValueType& v, int data, typename ValueType::AllocatorType&) { return v.SetInt(data); } +}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsUint(); } + static unsigned Get(const ValueType& v) { return v.GetUint(); } + static ValueType& Set(ValueType& v, unsigned data) { return v.SetUint(data); } + static ValueType& Set(ValueType& v, unsigned data, typename ValueType::AllocatorType&) { return v.SetUint(data); } +}; + +#ifdef _MSC_VER +RAPIDJSON_STATIC_ASSERT(sizeof(long) == sizeof(int)); +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsInt(); } + static long Get(const ValueType& v) { return v.GetInt(); } + static ValueType& Set(ValueType& v, long data) { return v.SetInt(data); } + static ValueType& Set(ValueType& v, long data, typename ValueType::AllocatorType&) { return v.SetInt(data); } +}; + +RAPIDJSON_STATIC_ASSERT(sizeof(unsigned long) == sizeof(unsigned)); +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsUint(); } + static unsigned long Get(const ValueType& v) { return v.GetUint(); } + static ValueType& Set(ValueType& v, unsigned long data) { return v.SetUint(data); } + static ValueType& Set(ValueType& v, unsigned long data, typename ValueType::AllocatorType&) { return v.SetUint(data); } +}; +#endif + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsInt64(); } + static int64_t Get(const ValueType& v) { return v.GetInt64(); } + static ValueType& Set(ValueType& v, int64_t data) { return v.SetInt64(data); } + static ValueType& Set(ValueType& v, int64_t data, typename ValueType::AllocatorType&) { return v.SetInt64(data); } +}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsUint64(); } + static uint64_t Get(const ValueType& v) { return v.GetUint64(); } + static ValueType& Set(ValueType& v, uint64_t data) { return v.SetUint64(data); } + static ValueType& Set(ValueType& v, uint64_t data, typename ValueType::AllocatorType&) { return v.SetUint64(data); } +}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsDouble(); } + static double Get(const ValueType& v) { return v.GetDouble(); } + static ValueType& Set(ValueType& v, double data) { return v.SetDouble(data); } + static ValueType& Set(ValueType& v, double data, typename ValueType::AllocatorType&) { return v.SetDouble(data); } +}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsFloat(); } + static float Get(const ValueType& v) { return v.GetFloat(); } + static ValueType& Set(ValueType& v, float data) { return v.SetFloat(data); } + static ValueType& Set(ValueType& v, float data, typename ValueType::AllocatorType&) { return v.SetFloat(data); } +}; + +template +struct TypeHelper { + typedef const typename ValueType::Ch* StringType; + static bool Is(const ValueType& v) { return v.IsString(); } + static StringType Get(const ValueType& v) { return v.GetString(); } + static ValueType& Set(ValueType& v, const StringType data) { return v.SetString(typename ValueType::StringRefType(data)); } + static ValueType& Set(ValueType& v, const StringType data, typename ValueType::AllocatorType& a) { return v.SetString(data, a); } +}; + +#if RAPIDJSON_HAS_STDSTRING +template +struct TypeHelper > { + typedef std::basic_string StringType; + static bool Is(const ValueType& v) { return v.IsString(); } + static StringType Get(const ValueType& v) { return StringType(v.GetString(), v.GetStringLength()); } + static ValueType& Set(ValueType& v, const StringType& data, typename ValueType::AllocatorType& a) { return v.SetString(data, a); } +}; +#endif + +template +struct TypeHelper { + typedef typename ValueType::Array ArrayType; + static bool Is(const ValueType& v) { return v.IsArray(); } + static ArrayType Get(ValueType& v) { return v.GetArray(); } + static ValueType& Set(ValueType& v, ArrayType data) { return v = data; } + static ValueType& Set(ValueType& v, ArrayType data, typename ValueType::AllocatorType&) { return v = data; } +}; + +template +struct TypeHelper { + typedef typename ValueType::ConstArray ArrayType; + static bool Is(const ValueType& v) { return v.IsArray(); } + static ArrayType Get(const ValueType& v) { return v.GetArray(); } +}; + +template +struct TypeHelper { + typedef typename ValueType::Object ObjectType; + static bool Is(const ValueType& v) { return v.IsObject(); } + static ObjectType Get(ValueType& v) { return v.GetObject(); } + static ValueType& Set(ValueType& v, ObjectType data) { return v = data; } + static ValueType& Set(ValueType& v, ObjectType data, typename ValueType::AllocatorType&) { return v = data; } +}; + +template +struct TypeHelper { + typedef typename ValueType::ConstObject ObjectType; + static bool Is(const ValueType& v) { return v.IsObject(); } + static ObjectType Get(const ValueType& v) { return v.GetObject(); } +}; + +} // namespace internal + +// Forward declarations +template class GenericArray; +template class GenericObject; + +/////////////////////////////////////////////////////////////////////////////// +// GenericValue + +//! Represents a JSON value. Use Value for UTF8 encoding and default allocator. +/*! + A JSON value can be one of 7 types. This class is a variant type supporting + these types. + + Use the Value if UTF8 and default allocator + + \tparam Encoding Encoding of the value. (Even non-string values need to have the same encoding in a document) + \tparam Allocator Allocator type for allocating memory of object, array and string. +*/ +template > +class GenericValue { +public: + //! Name-value pair in an object. + typedef GenericMember Member; + typedef Encoding EncodingType; //!< Encoding type from template parameter. + typedef Allocator AllocatorType; //!< Allocator type from template parameter. + typedef typename Encoding::Ch Ch; //!< Character type derived from Encoding. + typedef GenericStringRef StringRefType; //!< Reference to a constant string + typedef typename GenericMemberIterator::Iterator MemberIterator; //!< Member iterator for iterating in object. + typedef typename GenericMemberIterator::Iterator ConstMemberIterator; //!< Constant member iterator for iterating in object. + typedef GenericValue* ValueIterator; //!< Value iterator for iterating in array. + typedef const GenericValue* ConstValueIterator; //!< Constant value iterator for iterating in array. + typedef GenericValue ValueType; //!< Value type of itself. + typedef GenericArray Array; + typedef GenericArray ConstArray; + typedef GenericObject Object; + typedef GenericObject ConstObject; + + //!@name Constructors and destructor. + //@{ + + //! Default constructor creates a null value. + GenericValue() RAPIDJSON_NOEXCEPT : data_() { data_.f.flags = kNullFlag; } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Move constructor in C++11 + GenericValue(GenericValue&& rhs) RAPIDJSON_NOEXCEPT : data_(rhs.data_) { + rhs.data_.f.flags = kNullFlag; // give up contents + } +#endif + +private: + //! Copy constructor is not permitted. + GenericValue(const GenericValue& rhs); + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Moving from a GenericDocument is not permitted. + template + GenericValue(GenericDocument&& rhs); + + //! Move assignment from a GenericDocument is not permitted. + template + GenericValue& operator=(GenericDocument&& rhs); +#endif + +public: + + //! Constructor with JSON value type. + /*! This creates a Value of specified type with default content. + \param type Type of the value. + \note Default content for number is zero. + */ + explicit GenericValue(Type type) RAPIDJSON_NOEXCEPT : data_() { + static const uint16_t defaultFlags[] = { + kNullFlag, kFalseFlag, kTrueFlag, kObjectFlag, kArrayFlag, kShortStringFlag, + kNumberAnyFlag + }; + RAPIDJSON_NOEXCEPT_ASSERT(type >= kNullType && type <= kNumberType); + data_.f.flags = defaultFlags[type]; + + // Use ShortString to store empty string. + if (type == kStringType) + data_.ss.SetLength(0); + } + + //! Explicit copy constructor (with allocator) + /*! Creates a copy of a Value by using the given Allocator + \tparam SourceAllocator allocator of \c rhs + \param rhs Value to copy from (read-only) + \param allocator Allocator for allocating copied elements and buffers. Commonly use GenericDocument::GetAllocator(). + \param copyConstStrings Force copying of constant strings (e.g. referencing an in-situ buffer) + \see CopyFrom() + */ + template + GenericValue(const GenericValue& rhs, Allocator& allocator, bool copyConstStrings = false) { + switch (rhs.GetType()) { + case kObjectType: { + SizeType count = rhs.data_.o.size; + Member* lm = reinterpret_cast(allocator.Malloc(count * sizeof(Member))); + const typename GenericValue::Member* rm = rhs.GetMembersPointer(); + for (SizeType i = 0; i < count; i++) { + new (&lm[i].name) GenericValue(rm[i].name, allocator, copyConstStrings); + new (&lm[i].value) GenericValue(rm[i].value, allocator, copyConstStrings); + } + data_.f.flags = kObjectFlag; + data_.o.size = data_.o.capacity = count; + SetMembersPointer(lm); + } + break; + case kArrayType: { + SizeType count = rhs.data_.a.size; + GenericValue* le = reinterpret_cast(allocator.Malloc(count * sizeof(GenericValue))); + const GenericValue* re = rhs.GetElementsPointer(); + for (SizeType i = 0; i < count; i++) + new (&le[i]) GenericValue(re[i], allocator, copyConstStrings); + data_.f.flags = kArrayFlag; + data_.a.size = data_.a.capacity = count; + SetElementsPointer(le); + } + break; + case kStringType: + if (rhs.data_.f.flags == kConstStringFlag && !copyConstStrings) { + data_.f.flags = rhs.data_.f.flags; + data_ = *reinterpret_cast(&rhs.data_); + } + else + SetStringRaw(StringRef(rhs.GetString(), rhs.GetStringLength()), allocator); + break; + default: + data_.f.flags = rhs.data_.f.flags; + data_ = *reinterpret_cast(&rhs.data_); + break; + } + } + + //! Constructor for boolean value. + /*! \param b Boolean value + \note This constructor is limited to \em real boolean values and rejects + implicitly converted types like arbitrary pointers. Use an explicit cast + to \c bool, if you want to construct a boolean JSON value in such cases. + */ +#ifndef RAPIDJSON_DOXYGEN_RUNNING // hide SFINAE from Doxygen + template + explicit GenericValue(T b, RAPIDJSON_ENABLEIF((internal::IsSame))) RAPIDJSON_NOEXCEPT // See #472 +#else + explicit GenericValue(bool b) RAPIDJSON_NOEXCEPT +#endif + : data_() { + // safe-guard against failing SFINAE + RAPIDJSON_STATIC_ASSERT((internal::IsSame::Value)); + data_.f.flags = b ? kTrueFlag : kFalseFlag; + } + + //! Constructor for int value. + explicit GenericValue(int i) RAPIDJSON_NOEXCEPT : data_() { + data_.n.i64 = i; + data_.f.flags = (i >= 0) ? (kNumberIntFlag | kUintFlag | kUint64Flag) : kNumberIntFlag; + } + + //! Constructor for unsigned value. + explicit GenericValue(unsigned u) RAPIDJSON_NOEXCEPT : data_() { + data_.n.u64 = u; + data_.f.flags = (u & 0x80000000) ? kNumberUintFlag : (kNumberUintFlag | kIntFlag | kInt64Flag); + } + + //! Constructor for int64_t value. + explicit GenericValue(int64_t i64) RAPIDJSON_NOEXCEPT : data_() { + data_.n.i64 = i64; + data_.f.flags = kNumberInt64Flag; + if (i64 >= 0) { + data_.f.flags |= kNumberUint64Flag; + if (!(static_cast(i64) & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x00000000))) + data_.f.flags |= kUintFlag; + if (!(static_cast(i64) & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x80000000))) + data_.f.flags |= kIntFlag; + } + else if (i64 >= static_cast(RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x80000000))) + data_.f.flags |= kIntFlag; + } + + //! Constructor for uint64_t value. + explicit GenericValue(uint64_t u64) RAPIDJSON_NOEXCEPT : data_() { + data_.n.u64 = u64; + data_.f.flags = kNumberUint64Flag; + if (!(u64 & RAPIDJSON_UINT64_C2(0x80000000, 0x00000000))) + data_.f.flags |= kInt64Flag; + if (!(u64 & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x00000000))) + data_.f.flags |= kUintFlag; + if (!(u64 & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x80000000))) + data_.f.flags |= kIntFlag; + } + + //! Constructor for double value. + explicit GenericValue(double d) RAPIDJSON_NOEXCEPT : data_() { data_.n.d = d; data_.f.flags = kNumberDoubleFlag; } + + //! Constructor for float value. + explicit GenericValue(float f) RAPIDJSON_NOEXCEPT : data_() { data_.n.d = static_cast(f); data_.f.flags = kNumberDoubleFlag; } + + //! Constructor for constant string (i.e. do not make a copy of string) + GenericValue(const Ch* s, SizeType length) RAPIDJSON_NOEXCEPT : data_() { SetStringRaw(StringRef(s, length)); } + + //! Constructor for constant string (i.e. do not make a copy of string) + explicit GenericValue(StringRefType s) RAPIDJSON_NOEXCEPT : data_() { SetStringRaw(s); } + + //! Constructor for copy-string (i.e. do make a copy of string) + GenericValue(const Ch* s, SizeType length, Allocator& allocator) : data_() { SetStringRaw(StringRef(s, length), allocator); } + + //! Constructor for copy-string (i.e. do make a copy of string) + GenericValue(const Ch*s, Allocator& allocator) : data_() { SetStringRaw(StringRef(s), allocator); } + +#if RAPIDJSON_HAS_STDSTRING + //! Constructor for copy-string from a string object (i.e. do make a copy of string) + /*! \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING. + */ + GenericValue(const std::basic_string& s, Allocator& allocator) : data_() { SetStringRaw(StringRef(s), allocator); } +#endif + + //! Constructor for Array. + /*! + \param a An array obtained by \c GetArray(). + \note \c Array is always pass-by-value. + \note the source array is moved into this value and the sourec array becomes empty. + */ + GenericValue(Array a) RAPIDJSON_NOEXCEPT : data_(a.value_.data_) { + a.value_.data_ = Data(); + a.value_.data_.f.flags = kArrayFlag; + } + + //! Constructor for Object. + /*! + \param o An object obtained by \c GetObject(). + \note \c Object is always pass-by-value. + \note the source object is moved into this value and the sourec object becomes empty. + */ + GenericValue(Object o) RAPIDJSON_NOEXCEPT : data_(o.value_.data_) { + o.value_.data_ = Data(); + o.value_.data_.f.flags = kObjectFlag; + } + + //! Destructor. + /*! Need to destruct elements of array, members of object, or copy-string. + */ + ~GenericValue() { + if (Allocator::kNeedFree) { // Shortcut by Allocator's trait + switch(data_.f.flags) { + case kArrayFlag: + { + GenericValue* e = GetElementsPointer(); + for (GenericValue* v = e; v != e + data_.a.size; ++v) + v->~GenericValue(); + Allocator::Free(e); + } + break; + + case kObjectFlag: + for (MemberIterator m = MemberBegin(); m != MemberEnd(); ++m) + m->~Member(); + Allocator::Free(GetMembersPointer()); + break; + + case kCopyStringFlag: + Allocator::Free(const_cast(GetStringPointer())); + break; + + default: + break; // Do nothing for other types. + } + } + } + + //@} + + //!@name Assignment operators + //@{ + + //! Assignment with move semantics. + /*! \param rhs Source of the assignment. It will become a null value after assignment. + */ + GenericValue& operator=(GenericValue& rhs) RAPIDJSON_NOEXCEPT { + if (RAPIDJSON_LIKELY(this != &rhs)) { + this->~GenericValue(); + RawAssign(rhs); + } + return *this; + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Move assignment in C++11 + GenericValue& operator=(GenericValue&& rhs) RAPIDJSON_NOEXCEPT { + return *this = rhs.Move(); + } +#endif + + //! Assignment of constant string reference (no copy) + /*! \param str Constant string reference to be assigned + \note This overload is needed to avoid clashes with the generic primitive type assignment overload below. + \see GenericStringRef, operator=(T) + */ + GenericValue& operator=(StringRefType str) RAPIDJSON_NOEXCEPT { + GenericValue s(str); + return *this = s; + } + + //! Assignment with primitive types. + /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t + \param value The value to be assigned. + + \note The source type \c T explicitly disallows all pointer types, + especially (\c const) \ref Ch*. This helps avoiding implicitly + referencing character strings with insufficient lifetime, use + \ref SetString(const Ch*, Allocator&) (for copying) or + \ref StringRef() (to explicitly mark the pointer as constant) instead. + All other pointer types would implicitly convert to \c bool, + use \ref SetBool() instead. + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::IsPointer), (GenericValue&)) + operator=(T value) { + GenericValue v(value); + return *this = v; + } + + //! Deep-copy assignment from Value + /*! Assigns a \b copy of the Value to the current Value object + \tparam SourceAllocator Allocator type of \c rhs + \param rhs Value to copy from (read-only) + \param allocator Allocator to use for copying + \param copyConstStrings Force copying of constant strings (e.g. referencing an in-situ buffer) + */ + template + GenericValue& CopyFrom(const GenericValue& rhs, Allocator& allocator, bool copyConstStrings = false) { + RAPIDJSON_ASSERT(static_cast(this) != static_cast(&rhs)); + this->~GenericValue(); + new (this) GenericValue(rhs, allocator, copyConstStrings); + return *this; + } + + //! Exchange the contents of this value with those of other. + /*! + \param other Another value. + \note Constant complexity. + */ + GenericValue& Swap(GenericValue& other) RAPIDJSON_NOEXCEPT { + GenericValue temp; + temp.RawAssign(*this); + RawAssign(other); + other.RawAssign(temp); + return *this; + } + + //! free-standing swap function helper + /*! + Helper function to enable support for common swap implementation pattern based on \c std::swap: + \code + void swap(MyClass& a, MyClass& b) { + using std::swap; + swap(a.value, b.value); + // ... + } + \endcode + \see Swap() + */ + friend inline void swap(GenericValue& a, GenericValue& b) RAPIDJSON_NOEXCEPT { a.Swap(b); } + + //! Prepare Value for move semantics + /*! \return *this */ + GenericValue& Move() RAPIDJSON_NOEXCEPT { return *this; } + //@} + + //!@name Equal-to and not-equal-to operators + //@{ + //! Equal-to operator + /*! + \note If an object contains duplicated named member, comparing equality with any object is always \c false. + \note Linear time complexity (number of all values in the subtree and total lengths of all strings). + */ + template + bool operator==(const GenericValue& rhs) const { + typedef GenericValue RhsType; + if (GetType() != rhs.GetType()) + return false; + + switch (GetType()) { + case kObjectType: // Warning: O(n^2) inner-loop + if (data_.o.size != rhs.data_.o.size) + return false; + for (ConstMemberIterator lhsMemberItr = MemberBegin(); lhsMemberItr != MemberEnd(); ++lhsMemberItr) { + typename RhsType::ConstMemberIterator rhsMemberItr = rhs.FindMember(lhsMemberItr->name); + if (rhsMemberItr == rhs.MemberEnd() || lhsMemberItr->value != rhsMemberItr->value) + return false; + } + return true; + + case kArrayType: + if (data_.a.size != rhs.data_.a.size) + return false; + for (SizeType i = 0; i < data_.a.size; i++) + if ((*this)[i] != rhs[i]) + return false; + return true; + + case kStringType: + return StringEqual(rhs); + + case kNumberType: + if (IsDouble() || rhs.IsDouble()) { + double a = GetDouble(); // May convert from integer to double. + double b = rhs.GetDouble(); // Ditto + return a >= b && a <= b; // Prevent -Wfloat-equal + } + else + return data_.n.u64 == rhs.data_.n.u64; + + default: + return true; + } + } + + //! Equal-to operator with const C-string pointer + bool operator==(const Ch* rhs) const { return *this == GenericValue(StringRef(rhs)); } + +#if RAPIDJSON_HAS_STDSTRING + //! Equal-to operator with string object + /*! \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING. + */ + bool operator==(const std::basic_string& rhs) const { return *this == GenericValue(StringRef(rhs)); } +#endif + + //! Equal-to operator with primitive types + /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c double, \c true, \c false + */ + template RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr,internal::IsGenericValue >), (bool)) operator==(const T& rhs) const { return *this == GenericValue(rhs); } + + //! Not-equal-to operator + /*! \return !(*this == rhs) + */ + template + bool operator!=(const GenericValue& rhs) const { return !(*this == rhs); } + + //! Not-equal-to operator with const C-string pointer + bool operator!=(const Ch* rhs) const { return !(*this == rhs); } + + //! Not-equal-to operator with arbitrary types + /*! \return !(*this == rhs) + */ + template RAPIDJSON_DISABLEIF_RETURN((internal::IsGenericValue), (bool)) operator!=(const T& rhs) const { return !(*this == rhs); } + + //! Equal-to operator with arbitrary types (symmetric version) + /*! \return (rhs == lhs) + */ + template friend RAPIDJSON_DISABLEIF_RETURN((internal::IsGenericValue), (bool)) operator==(const T& lhs, const GenericValue& rhs) { return rhs == lhs; } + + //! Not-Equal-to operator with arbitrary types (symmetric version) + /*! \return !(rhs == lhs) + */ + template friend RAPIDJSON_DISABLEIF_RETURN((internal::IsGenericValue), (bool)) operator!=(const T& lhs, const GenericValue& rhs) { return !(rhs == lhs); } + //@} + + //!@name Type + //@{ + + Type GetType() const { return static_cast(data_.f.flags & kTypeMask); } + bool IsNull() const { return data_.f.flags == kNullFlag; } + bool IsFalse() const { return data_.f.flags == kFalseFlag; } + bool IsTrue() const { return data_.f.flags == kTrueFlag; } + bool IsBool() const { return (data_.f.flags & kBoolFlag) != 0; } + bool IsObject() const { return data_.f.flags == kObjectFlag; } + bool IsArray() const { return data_.f.flags == kArrayFlag; } + bool IsNumber() const { return (data_.f.flags & kNumberFlag) != 0; } + bool IsInt() const { return (data_.f.flags & kIntFlag) != 0; } + bool IsUint() const { return (data_.f.flags & kUintFlag) != 0; } + bool IsInt64() const { return (data_.f.flags & kInt64Flag) != 0; } + bool IsUint64() const { return (data_.f.flags & kUint64Flag) != 0; } + bool IsDouble() const { return (data_.f.flags & kDoubleFlag) != 0; } + bool IsString() const { return (data_.f.flags & kStringFlag) != 0; } + + // Checks whether a number can be losslessly converted to a double. + bool IsLosslessDouble() const { + if (!IsNumber()) return false; + if (IsUint64()) { + uint64_t u = GetUint64(); + volatile double d = static_cast(u); + return (d >= 0.0) + && (d < static_cast((std::numeric_limits::max)())) + && (u == static_cast(d)); + } + if (IsInt64()) { + int64_t i = GetInt64(); + volatile double d = static_cast(i); + return (d >= static_cast((std::numeric_limits::min)())) + && (d < static_cast((std::numeric_limits::max)())) + && (i == static_cast(d)); + } + return true; // double, int, uint are always lossless + } + + // Checks whether a number is a float (possible lossy). + bool IsFloat() const { + if ((data_.f.flags & kDoubleFlag) == 0) + return false; + double d = GetDouble(); + return d >= -3.4028234e38 && d <= 3.4028234e38; + } + // Checks whether a number can be losslessly converted to a float. + bool IsLosslessFloat() const { + if (!IsNumber()) return false; + double a = GetDouble(); + if (a < static_cast(-(std::numeric_limits::max)()) + || a > static_cast((std::numeric_limits::max)())) + return false; + double b = static_cast(static_cast(a)); + return a >= b && a <= b; // Prevent -Wfloat-equal + } + + //@} + + //!@name Null + //@{ + + GenericValue& SetNull() { this->~GenericValue(); new (this) GenericValue(); return *this; } + + //@} + + //!@name Bool + //@{ + + bool GetBool() const { RAPIDJSON_ASSERT(IsBool()); return data_.f.flags == kTrueFlag; } + //!< Set boolean value + /*! \post IsBool() == true */ + GenericValue& SetBool(bool b) { this->~GenericValue(); new (this) GenericValue(b); return *this; } + + //@} + + //!@name Object + //@{ + + //! Set this value as an empty object. + /*! \post IsObject() == true */ + GenericValue& SetObject() { this->~GenericValue(); new (this) GenericValue(kObjectType); return *this; } + + //! Get the number of members in the object. + SizeType MemberCount() const { RAPIDJSON_ASSERT(IsObject()); return data_.o.size; } + + //! Get the capacity of object. + SizeType MemberCapacity() const { RAPIDJSON_ASSERT(IsObject()); return data_.o.capacity; } + + //! Check whether the object is empty. + bool ObjectEmpty() const { RAPIDJSON_ASSERT(IsObject()); return data_.o.size == 0; } + + //! Get a value from an object associated with the name. + /*! \pre IsObject() == true + \tparam T Either \c Ch or \c const \c Ch (template used for disambiguation with \ref operator[](SizeType)) + \note In version 0.1x, if the member is not found, this function returns a null value. This makes issue 7. + Since 0.2, if the name is not correct, it will assert. + If user is unsure whether a member exists, user should use HasMember() first. + A better approach is to use FindMember(). + \note Linear time complexity. + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::NotExpr::Type, Ch> >),(GenericValue&)) operator[](T* name) { + GenericValue n(StringRef(name)); + return (*this)[n]; + } + template + RAPIDJSON_DISABLEIF_RETURN((internal::NotExpr::Type, Ch> >),(const GenericValue&)) operator[](T* name) const { return const_cast(*this)[name]; } + + //! Get a value from an object associated with the name. + /*! \pre IsObject() == true + \tparam SourceAllocator Allocator of the \c name value + + \note Compared to \ref operator[](T*), this version is faster because it does not need a StrLen(). + And it can also handle strings with embedded null characters. + + \note Linear time complexity. + */ + template + GenericValue& operator[](const GenericValue& name) { + MemberIterator member = FindMember(name); + if (member != MemberEnd()) + return member->value; + else { + RAPIDJSON_ASSERT(false); // see above note + + // This will generate -Wexit-time-destructors in clang + // static GenericValue NullValue; + // return NullValue; + + // Use static buffer and placement-new to prevent destruction + static char buffer[sizeof(GenericValue)]; + return *new (buffer) GenericValue(); + } + } + template + const GenericValue& operator[](const GenericValue& name) const { return const_cast(*this)[name]; } + +#if RAPIDJSON_HAS_STDSTRING + //! Get a value from an object associated with name (string object). + GenericValue& operator[](const std::basic_string& name) { return (*this)[GenericValue(StringRef(name))]; } + const GenericValue& operator[](const std::basic_string& name) const { return (*this)[GenericValue(StringRef(name))]; } +#endif + + //! Const member iterator + /*! \pre IsObject() == true */ + ConstMemberIterator MemberBegin() const { RAPIDJSON_ASSERT(IsObject()); return ConstMemberIterator(GetMembersPointer()); } + //! Const \em past-the-end member iterator + /*! \pre IsObject() == true */ + ConstMemberIterator MemberEnd() const { RAPIDJSON_ASSERT(IsObject()); return ConstMemberIterator(GetMembersPointer() + data_.o.size); } + //! Member iterator + /*! \pre IsObject() == true */ + MemberIterator MemberBegin() { RAPIDJSON_ASSERT(IsObject()); return MemberIterator(GetMembersPointer()); } + //! \em Past-the-end member iterator + /*! \pre IsObject() == true */ + MemberIterator MemberEnd() { RAPIDJSON_ASSERT(IsObject()); return MemberIterator(GetMembersPointer() + data_.o.size); } + + //! Request the object to have enough capacity to store members. + /*! \param newCapacity The capacity that the object at least need to have. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \note Linear time complexity. + */ + GenericValue& MemberReserve(SizeType newCapacity, Allocator &allocator) { + RAPIDJSON_ASSERT(IsObject()); + if (newCapacity > data_.o.capacity) { + SetMembersPointer(reinterpret_cast(allocator.Realloc(GetMembersPointer(), data_.o.capacity * sizeof(Member), newCapacity * sizeof(Member)))); + data_.o.capacity = newCapacity; + } + return *this; + } + + //! Check whether a member exists in the object. + /*! + \param name Member name to be searched. + \pre IsObject() == true + \return Whether a member with that name exists. + \note It is better to use FindMember() directly if you need the obtain the value as well. + \note Linear time complexity. + */ + bool HasMember(const Ch* name) const { return FindMember(name) != MemberEnd(); } + +#if RAPIDJSON_HAS_STDSTRING + //! Check whether a member exists in the object with string object. + /*! + \param name Member name to be searched. + \pre IsObject() == true + \return Whether a member with that name exists. + \note It is better to use FindMember() directly if you need the obtain the value as well. + \note Linear time complexity. + */ + bool HasMember(const std::basic_string& name) const { return FindMember(name) != MemberEnd(); } +#endif + + //! Check whether a member exists in the object with GenericValue name. + /*! + This version is faster because it does not need a StrLen(). It can also handle string with null character. + \param name Member name to be searched. + \pre IsObject() == true + \return Whether a member with that name exists. + \note It is better to use FindMember() directly if you need the obtain the value as well. + \note Linear time complexity. + */ + template + bool HasMember(const GenericValue& name) const { return FindMember(name) != MemberEnd(); } + + //! Find member by name. + /*! + \param name Member name to be searched. + \pre IsObject() == true + \return Iterator to member, if it exists. + Otherwise returns \ref MemberEnd(). + + \note Earlier versions of Rapidjson returned a \c NULL pointer, in case + the requested member doesn't exist. For consistency with e.g. + \c std::map, this has been changed to MemberEnd() now. + \note Linear time complexity. + */ + MemberIterator FindMember(const Ch* name) { + GenericValue n(StringRef(name)); + return FindMember(n); + } + + ConstMemberIterator FindMember(const Ch* name) const { return const_cast(*this).FindMember(name); } + + //! Find member by name. + /*! + This version is faster because it does not need a StrLen(). It can also handle string with null character. + \param name Member name to be searched. + \pre IsObject() == true + \return Iterator to member, if it exists. + Otherwise returns \ref MemberEnd(). + + \note Earlier versions of Rapidjson returned a \c NULL pointer, in case + the requested member doesn't exist. For consistency with e.g. + \c std::map, this has been changed to MemberEnd() now. + \note Linear time complexity. + */ + template + MemberIterator FindMember(const GenericValue& name) { + RAPIDJSON_ASSERT(IsObject()); + RAPIDJSON_ASSERT(name.IsString()); + MemberIterator member = MemberBegin(); + for ( ; member != MemberEnd(); ++member) + if (name.StringEqual(member->name)) + break; + return member; + } + template ConstMemberIterator FindMember(const GenericValue& name) const { return const_cast(*this).FindMember(name); } + +#if RAPIDJSON_HAS_STDSTRING + //! Find member by string object name. + /*! + \param name Member name to be searched. + \pre IsObject() == true + \return Iterator to member, if it exists. + Otherwise returns \ref MemberEnd(). + */ + MemberIterator FindMember(const std::basic_string& name) { return FindMember(GenericValue(StringRef(name))); } + ConstMemberIterator FindMember(const std::basic_string& name) const { return FindMember(GenericValue(StringRef(name))); } +#endif + + //! Add a member (name-value pair) to the object. + /*! \param name A string value as name of member. + \param value Value of any type. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \note The ownership of \c name and \c value will be transferred to this object on success. + \pre IsObject() && name.IsString() + \post name.IsNull() && value.IsNull() + \note Amortized Constant time complexity. + */ + GenericValue& AddMember(GenericValue& name, GenericValue& value, Allocator& allocator) { + RAPIDJSON_ASSERT(IsObject()); + RAPIDJSON_ASSERT(name.IsString()); + + ObjectData& o = data_.o; + if (o.size >= o.capacity) + MemberReserve(o.capacity == 0 ? kDefaultObjectCapacity : (o.capacity + (o.capacity + 1) / 2), allocator); + Member* members = GetMembersPointer(); + members[o.size].name.RawAssign(name); + members[o.size].value.RawAssign(value); + o.size++; + return *this; + } + + //! Add a constant string value as member (name-value pair) to the object. + /*! \param name A string value as name of member. + \param value constant string reference as value of member. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \pre IsObject() + \note This overload is needed to avoid clashes with the generic primitive type AddMember(GenericValue&,T,Allocator&) overload below. + \note Amortized Constant time complexity. + */ + GenericValue& AddMember(GenericValue& name, StringRefType value, Allocator& allocator) { + GenericValue v(value); + return AddMember(name, v, allocator); + } + +#if RAPIDJSON_HAS_STDSTRING + //! Add a string object as member (name-value pair) to the object. + /*! \param name A string value as name of member. + \param value constant string reference as value of member. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \pre IsObject() + \note This overload is needed to avoid clashes with the generic primitive type AddMember(GenericValue&,T,Allocator&) overload below. + \note Amortized Constant time complexity. + */ + GenericValue& AddMember(GenericValue& name, std::basic_string& value, Allocator& allocator) { + GenericValue v(value, allocator); + return AddMember(name, v, allocator); + } +#endif + + //! Add any primitive value as member (name-value pair) to the object. + /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t + \param name A string value as name of member. + \param value Value of primitive type \c T as value of member + \param allocator Allocator for reallocating memory. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \pre IsObject() + + \note The source type \c T explicitly disallows all pointer types, + especially (\c const) \ref Ch*. This helps avoiding implicitly + referencing character strings with insufficient lifetime, use + \ref AddMember(StringRefType, GenericValue&, Allocator&) or \ref + AddMember(StringRefType, StringRefType, Allocator&). + All other pointer types would implicitly convert to \c bool, + use an explicit cast instead, if needed. + \note Amortized Constant time complexity. + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (GenericValue&)) + AddMember(GenericValue& name, T value, Allocator& allocator) { + GenericValue v(value); + return AddMember(name, v, allocator); + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericValue& AddMember(GenericValue&& name, GenericValue&& value, Allocator& allocator) { + return AddMember(name, value, allocator); + } + GenericValue& AddMember(GenericValue&& name, GenericValue& value, Allocator& allocator) { + return AddMember(name, value, allocator); + } + GenericValue& AddMember(GenericValue& name, GenericValue&& value, Allocator& allocator) { + return AddMember(name, value, allocator); + } + GenericValue& AddMember(StringRefType name, GenericValue&& value, Allocator& allocator) { + GenericValue n(name); + return AddMember(n, value, allocator); + } +#endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS + + + //! Add a member (name-value pair) to the object. + /*! \param name A constant string reference as name of member. + \param value Value of any type. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \note The ownership of \c value will be transferred to this object on success. + \pre IsObject() + \post value.IsNull() + \note Amortized Constant time complexity. + */ + GenericValue& AddMember(StringRefType name, GenericValue& value, Allocator& allocator) { + GenericValue n(name); + return AddMember(n, value, allocator); + } + + //! Add a constant string value as member (name-value pair) to the object. + /*! \param name A constant string reference as name of member. + \param value constant string reference as value of member. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \pre IsObject() + \note This overload is needed to avoid clashes with the generic primitive type AddMember(StringRefType,T,Allocator&) overload below. + \note Amortized Constant time complexity. + */ + GenericValue& AddMember(StringRefType name, StringRefType value, Allocator& allocator) { + GenericValue v(value); + return AddMember(name, v, allocator); + } + + //! Add any primitive value as member (name-value pair) to the object. + /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t + \param name A constant string reference as name of member. + \param value Value of primitive type \c T as value of member + \param allocator Allocator for reallocating memory. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \pre IsObject() + + \note The source type \c T explicitly disallows all pointer types, + especially (\c const) \ref Ch*. This helps avoiding implicitly + referencing character strings with insufficient lifetime, use + \ref AddMember(StringRefType, GenericValue&, Allocator&) or \ref + AddMember(StringRefType, StringRefType, Allocator&). + All other pointer types would implicitly convert to \c bool, + use an explicit cast instead, if needed. + \note Amortized Constant time complexity. + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (GenericValue&)) + AddMember(StringRefType name, T value, Allocator& allocator) { + GenericValue n(name); + return AddMember(n, value, allocator); + } + + //! Remove all members in the object. + /*! This function do not deallocate memory in the object, i.e. the capacity is unchanged. + \note Linear time complexity. + */ + void RemoveAllMembers() { + RAPIDJSON_ASSERT(IsObject()); + for (MemberIterator m = MemberBegin(); m != MemberEnd(); ++m) + m->~Member(); + data_.o.size = 0; + } + + //! Remove a member in object by its name. + /*! \param name Name of member to be removed. + \return Whether the member existed. + \note This function may reorder the object members. Use \ref + EraseMember(ConstMemberIterator) if you need to preserve the + relative order of the remaining members. + \note Linear time complexity. + */ + bool RemoveMember(const Ch* name) { + GenericValue n(StringRef(name)); + return RemoveMember(n); + } + +#if RAPIDJSON_HAS_STDSTRING + bool RemoveMember(const std::basic_string& name) { return RemoveMember(GenericValue(StringRef(name))); } +#endif + + template + bool RemoveMember(const GenericValue& name) { + MemberIterator m = FindMember(name); + if (m != MemberEnd()) { + RemoveMember(m); + return true; + } + else + return false; + } + + //! Remove a member in object by iterator. + /*! \param m member iterator (obtained by FindMember() or MemberBegin()). + \return the new iterator after removal. + \note This function may reorder the object members. Use \ref + EraseMember(ConstMemberIterator) if you need to preserve the + relative order of the remaining members. + \note Constant time complexity. + */ + MemberIterator RemoveMember(MemberIterator m) { + RAPIDJSON_ASSERT(IsObject()); + RAPIDJSON_ASSERT(data_.o.size > 0); + RAPIDJSON_ASSERT(GetMembersPointer() != 0); + RAPIDJSON_ASSERT(m >= MemberBegin() && m < MemberEnd()); + + MemberIterator last(GetMembersPointer() + (data_.o.size - 1)); + if (data_.o.size > 1 && m != last) + *m = *last; // Move the last one to this place + else + m->~Member(); // Only one left, just destroy + --data_.o.size; + return m; + } + + //! Remove a member from an object by iterator. + /*! \param pos iterator to the member to remove + \pre IsObject() == true && \ref MemberBegin() <= \c pos < \ref MemberEnd() + \return Iterator following the removed element. + If the iterator \c pos refers to the last element, the \ref MemberEnd() iterator is returned. + \note This function preserves the relative order of the remaining object + members. If you do not need this, use the more efficient \ref RemoveMember(MemberIterator). + \note Linear time complexity. + */ + MemberIterator EraseMember(ConstMemberIterator pos) { + return EraseMember(pos, pos +1); + } + + //! Remove members in the range [first, last) from an object. + /*! \param first iterator to the first member to remove + \param last iterator following the last member to remove + \pre IsObject() == true && \ref MemberBegin() <= \c first <= \c last <= \ref MemberEnd() + \return Iterator following the last removed element. + \note This function preserves the relative order of the remaining object + members. + \note Linear time complexity. + */ + MemberIterator EraseMember(ConstMemberIterator first, ConstMemberIterator last) { + RAPIDJSON_ASSERT(IsObject()); + RAPIDJSON_ASSERT(data_.o.size > 0); + RAPIDJSON_ASSERT(GetMembersPointer() != 0); + RAPIDJSON_ASSERT(first >= MemberBegin()); + RAPIDJSON_ASSERT(first <= last); + RAPIDJSON_ASSERT(last <= MemberEnd()); + + MemberIterator pos = MemberBegin() + (first - MemberBegin()); + for (MemberIterator itr = pos; itr != last; ++itr) + itr->~Member(); + std::memmove(static_cast(&*pos), &*last, static_cast(MemberEnd() - last) * sizeof(Member)); + data_.o.size -= static_cast(last - first); + return pos; + } + + //! Erase a member in object by its name. + /*! \param name Name of member to be removed. + \return Whether the member existed. + \note Linear time complexity. + */ + bool EraseMember(const Ch* name) { + GenericValue n(StringRef(name)); + return EraseMember(n); + } + +#if RAPIDJSON_HAS_STDSTRING + bool EraseMember(const std::basic_string& name) { return EraseMember(GenericValue(StringRef(name))); } +#endif + + template + bool EraseMember(const GenericValue& name) { + MemberIterator m = FindMember(name); + if (m != MemberEnd()) { + EraseMember(m); + return true; + } + else + return false; + } + + Object GetObject() { RAPIDJSON_ASSERT(IsObject()); return Object(*this); } + ConstObject GetObject() const { RAPIDJSON_ASSERT(IsObject()); return ConstObject(*this); } + + //@} + + //!@name Array + //@{ + + //! Set this value as an empty array. + /*! \post IsArray == true */ + GenericValue& SetArray() { this->~GenericValue(); new (this) GenericValue(kArrayType); return *this; } + + //! Get the number of elements in array. + SizeType Size() const { RAPIDJSON_ASSERT(IsArray()); return data_.a.size; } + + //! Get the capacity of array. + SizeType Capacity() const { RAPIDJSON_ASSERT(IsArray()); return data_.a.capacity; } + + //! Check whether the array is empty. + bool Empty() const { RAPIDJSON_ASSERT(IsArray()); return data_.a.size == 0; } + + //! Remove all elements in the array. + /*! This function do not deallocate memory in the array, i.e. the capacity is unchanged. + \note Linear time complexity. + */ + void Clear() { + RAPIDJSON_ASSERT(IsArray()); + GenericValue* e = GetElementsPointer(); + for (GenericValue* v = e; v != e + data_.a.size; ++v) + v->~GenericValue(); + data_.a.size = 0; + } + + //! Get an element from array by index. + /*! \pre IsArray() == true + \param index Zero-based index of element. + \see operator[](T*) + */ + GenericValue& operator[](SizeType index) { + RAPIDJSON_ASSERT(IsArray()); + RAPIDJSON_ASSERT(index < data_.a.size); + return GetElementsPointer()[index]; + } + const GenericValue& operator[](SizeType index) const { return const_cast(*this)[index]; } + + //! Element iterator + /*! \pre IsArray() == true */ + ValueIterator Begin() { RAPIDJSON_ASSERT(IsArray()); return GetElementsPointer(); } + //! \em Past-the-end element iterator + /*! \pre IsArray() == true */ + ValueIterator End() { RAPIDJSON_ASSERT(IsArray()); return GetElementsPointer() + data_.a.size; } + //! Constant element iterator + /*! \pre IsArray() == true */ + ConstValueIterator Begin() const { return const_cast(*this).Begin(); } + //! Constant \em past-the-end element iterator + /*! \pre IsArray() == true */ + ConstValueIterator End() const { return const_cast(*this).End(); } + + //! Request the array to have enough capacity to store elements. + /*! \param newCapacity The capacity that the array at least need to have. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \note Linear time complexity. + */ + GenericValue& Reserve(SizeType newCapacity, Allocator &allocator) { + RAPIDJSON_ASSERT(IsArray()); + if (newCapacity > data_.a.capacity) { + SetElementsPointer(reinterpret_cast(allocator.Realloc(GetElementsPointer(), data_.a.capacity * sizeof(GenericValue), newCapacity * sizeof(GenericValue)))); + data_.a.capacity = newCapacity; + } + return *this; + } + + //! Append a GenericValue at the end of the array. + /*! \param value Value to be appended. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \pre IsArray() == true + \post value.IsNull() == true + \return The value itself for fluent API. + \note The ownership of \c value will be transferred to this array on success. + \note If the number of elements to be appended is known, calls Reserve() once first may be more efficient. + \note Amortized constant time complexity. + */ + GenericValue& PushBack(GenericValue& value, Allocator& allocator) { + RAPIDJSON_ASSERT(IsArray()); + if (data_.a.size >= data_.a.capacity) + Reserve(data_.a.capacity == 0 ? kDefaultArrayCapacity : (data_.a.capacity + (data_.a.capacity + 1) / 2), allocator); + GetElementsPointer()[data_.a.size++].RawAssign(value); + return *this; + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericValue& PushBack(GenericValue&& value, Allocator& allocator) { + return PushBack(value, allocator); + } +#endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS + + //! Append a constant string reference at the end of the array. + /*! \param value Constant string reference to be appended. + \param allocator Allocator for reallocating memory. It must be the same one used previously. Commonly use GenericDocument::GetAllocator(). + \pre IsArray() == true + \return The value itself for fluent API. + \note If the number of elements to be appended is known, calls Reserve() once first may be more efficient. + \note Amortized constant time complexity. + \see GenericStringRef + */ + GenericValue& PushBack(StringRefType value, Allocator& allocator) { + return (*this).template PushBack(value, allocator); + } + + //! Append a primitive value at the end of the array. + /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t + \param value Value of primitive type T to be appended. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \pre IsArray() == true + \return The value itself for fluent API. + \note If the number of elements to be appended is known, calls Reserve() once first may be more efficient. + + \note The source type \c T explicitly disallows all pointer types, + especially (\c const) \ref Ch*. This helps avoiding implicitly + referencing character strings with insufficient lifetime, use + \ref PushBack(GenericValue&, Allocator&) or \ref + PushBack(StringRefType, Allocator&). + All other pointer types would implicitly convert to \c bool, + use an explicit cast instead, if needed. + \note Amortized constant time complexity. + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (GenericValue&)) + PushBack(T value, Allocator& allocator) { + GenericValue v(value); + return PushBack(v, allocator); + } + + //! Remove the last element in the array. + /*! + \note Constant time complexity. + */ + GenericValue& PopBack() { + RAPIDJSON_ASSERT(IsArray()); + RAPIDJSON_ASSERT(!Empty()); + GetElementsPointer()[--data_.a.size].~GenericValue(); + return *this; + } + + //! Remove an element of array by iterator. + /*! + \param pos iterator to the element to remove + \pre IsArray() == true && \ref Begin() <= \c pos < \ref End() + \return Iterator following the removed element. If the iterator pos refers to the last element, the End() iterator is returned. + \note Linear time complexity. + */ + ValueIterator Erase(ConstValueIterator pos) { + return Erase(pos, pos + 1); + } + + //! Remove elements in the range [first, last) of the array. + /*! + \param first iterator to the first element to remove + \param last iterator following the last element to remove + \pre IsArray() == true && \ref Begin() <= \c first <= \c last <= \ref End() + \return Iterator following the last removed element. + \note Linear time complexity. + */ + ValueIterator Erase(ConstValueIterator first, ConstValueIterator last) { + RAPIDJSON_ASSERT(IsArray()); + RAPIDJSON_ASSERT(data_.a.size > 0); + RAPIDJSON_ASSERT(GetElementsPointer() != 0); + RAPIDJSON_ASSERT(first >= Begin()); + RAPIDJSON_ASSERT(first <= last); + RAPIDJSON_ASSERT(last <= End()); + ValueIterator pos = Begin() + (first - Begin()); + for (ValueIterator itr = pos; itr != last; ++itr) + itr->~GenericValue(); + std::memmove(static_cast(pos), last, static_cast(End() - last) * sizeof(GenericValue)); + data_.a.size -= static_cast(last - first); + return pos; + } + + Array GetArray() { RAPIDJSON_ASSERT(IsArray()); return Array(*this); } + ConstArray GetArray() const { RAPIDJSON_ASSERT(IsArray()); return ConstArray(*this); } + + //@} + + //!@name Number + //@{ + + int GetInt() const { RAPIDJSON_ASSERT(data_.f.flags & kIntFlag); return data_.n.i.i; } + unsigned GetUint() const { RAPIDJSON_ASSERT(data_.f.flags & kUintFlag); return data_.n.u.u; } + int64_t GetInt64() const { RAPIDJSON_ASSERT(data_.f.flags & kInt64Flag); return data_.n.i64; } + uint64_t GetUint64() const { RAPIDJSON_ASSERT(data_.f.flags & kUint64Flag); return data_.n.u64; } + + //! Get the value as double type. + /*! \note If the value is 64-bit integer type, it may lose precision. Use \c IsLosslessDouble() to check whether the converison is lossless. + */ + double GetDouble() const { + RAPIDJSON_ASSERT(IsNumber()); + if ((data_.f.flags & kDoubleFlag) != 0) return data_.n.d; // exact type, no conversion. + if ((data_.f.flags & kIntFlag) != 0) return data_.n.i.i; // int -> double + if ((data_.f.flags & kUintFlag) != 0) return data_.n.u.u; // unsigned -> double + if ((data_.f.flags & kInt64Flag) != 0) return static_cast(data_.n.i64); // int64_t -> double (may lose precision) + RAPIDJSON_ASSERT((data_.f.flags & kUint64Flag) != 0); return static_cast(data_.n.u64); // uint64_t -> double (may lose precision) + } + + //! Get the value as float type. + /*! \note If the value is 64-bit integer type, it may lose precision. Use \c IsLosslessFloat() to check whether the converison is lossless. + */ + float GetFloat() const { + return static_cast(GetDouble()); + } + + GenericValue& SetInt(int i) { this->~GenericValue(); new (this) GenericValue(i); return *this; } + GenericValue& SetUint(unsigned u) { this->~GenericValue(); new (this) GenericValue(u); return *this; } + GenericValue& SetInt64(int64_t i64) { this->~GenericValue(); new (this) GenericValue(i64); return *this; } + GenericValue& SetUint64(uint64_t u64) { this->~GenericValue(); new (this) GenericValue(u64); return *this; } + GenericValue& SetDouble(double d) { this->~GenericValue(); new (this) GenericValue(d); return *this; } + GenericValue& SetFloat(float f) { this->~GenericValue(); new (this) GenericValue(static_cast(f)); return *this; } + + //@} + + //!@name String + //@{ + + const Ch* GetString() const { RAPIDJSON_ASSERT(IsString()); return (data_.f.flags & kInlineStrFlag) ? data_.ss.str : GetStringPointer(); } + + //! Get the length of string. + /*! Since rapidjson permits "\\u0000" in the json string, strlen(v.GetString()) may not equal to v.GetStringLength(). + */ + SizeType GetStringLength() const { RAPIDJSON_ASSERT(IsString()); return ((data_.f.flags & kInlineStrFlag) ? (data_.ss.GetLength()) : data_.s.length); } + + //! Set this value as a string without copying source string. + /*! This version has better performance with supplied length, and also support string containing null character. + \param s source string pointer. + \param length The length of source string, excluding the trailing null terminator. + \return The value itself for fluent API. + \post IsString() == true && GetString() == s && GetStringLength() == length + \see SetString(StringRefType) + */ + GenericValue& SetString(const Ch* s, SizeType length) { return SetString(StringRef(s, length)); } + + //! Set this value as a string without copying source string. + /*! \param s source string reference + \return The value itself for fluent API. + \post IsString() == true && GetString() == s && GetStringLength() == s.length + */ + GenericValue& SetString(StringRefType s) { this->~GenericValue(); SetStringRaw(s); return *this; } + + //! Set this value as a string by copying from source string. + /*! This version has better performance with supplied length, and also support string containing null character. + \param s source string. + \param length The length of source string, excluding the trailing null terminator. + \param allocator Allocator for allocating copied buffer. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \post IsString() == true && GetString() != s && strcmp(GetString(),s) == 0 && GetStringLength() == length + */ + GenericValue& SetString(const Ch* s, SizeType length, Allocator& allocator) { return SetString(StringRef(s, length), allocator); } + + //! Set this value as a string by copying from source string. + /*! \param s source string. + \param allocator Allocator for allocating copied buffer. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \post IsString() == true && GetString() != s && strcmp(GetString(),s) == 0 && GetStringLength() == length + */ + GenericValue& SetString(const Ch* s, Allocator& allocator) { return SetString(StringRef(s), allocator); } + + //! Set this value as a string by copying from source string. + /*! \param s source string reference + \param allocator Allocator for allocating copied buffer. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \post IsString() == true && GetString() != s.s && strcmp(GetString(),s) == 0 && GetStringLength() == length + */ + GenericValue& SetString(StringRefType s, Allocator& allocator) { this->~GenericValue(); SetStringRaw(s, allocator); return *this; } + +#if RAPIDJSON_HAS_STDSTRING + //! Set this value as a string by copying from source string. + /*! \param s source string. + \param allocator Allocator for allocating copied buffer. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \post IsString() == true && GetString() != s.data() && strcmp(GetString(),s.data() == 0 && GetStringLength() == s.size() + \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING. + */ + GenericValue& SetString(const std::basic_string& s, Allocator& allocator) { return SetString(StringRef(s), allocator); } +#endif + + //@} + + //!@name Array + //@{ + + //! Templated version for checking whether this value is type T. + /*! + \tparam T Either \c bool, \c int, \c unsigned, \c int64_t, \c uint64_t, \c double, \c float, \c const \c char*, \c std::basic_string + */ + template + bool Is() const { return internal::TypeHelper::Is(*this); } + + template + T Get() const { return internal::TypeHelper::Get(*this); } + + template + T Get() { return internal::TypeHelper::Get(*this); } + + template + ValueType& Set(const T& data) { return internal::TypeHelper::Set(*this, data); } + + template + ValueType& Set(const T& data, AllocatorType& allocator) { return internal::TypeHelper::Set(*this, data, allocator); } + + //@} + + //! Generate events of this value to a Handler. + /*! This function adopts the GoF visitor pattern. + Typical usage is to output this JSON value as JSON text via Writer, which is a Handler. + It can also be used to deep clone this value via GenericDocument, which is also a Handler. + \tparam Handler type of handler. + \param handler An object implementing concept Handler. + */ + template + bool Accept(Handler& handler) const { + switch(GetType()) { + case kNullType: return handler.Null(); + case kFalseType: return handler.Bool(false); + case kTrueType: return handler.Bool(true); + + case kObjectType: + if (RAPIDJSON_UNLIKELY(!handler.StartObject())) + return false; + for (ConstMemberIterator m = MemberBegin(); m != MemberEnd(); ++m) { + RAPIDJSON_ASSERT(m->name.IsString()); // User may change the type of name by MemberIterator. + if (RAPIDJSON_UNLIKELY(!handler.Key(m->name.GetString(), m->name.GetStringLength(), (m->name.data_.f.flags & kCopyFlag) != 0))) + return false; + if (RAPIDJSON_UNLIKELY(!m->value.Accept(handler))) + return false; + } + return handler.EndObject(data_.o.size); + + case kArrayType: + if (RAPIDJSON_UNLIKELY(!handler.StartArray())) + return false; + for (const GenericValue* v = Begin(); v != End(); ++v) + if (RAPIDJSON_UNLIKELY(!v->Accept(handler))) + return false; + return handler.EndArray(data_.a.size); + + case kStringType: + return handler.String(GetString(), GetStringLength(), (data_.f.flags & kCopyFlag) != 0); + + default: + RAPIDJSON_ASSERT(GetType() == kNumberType); + if (IsDouble()) return handler.Double(data_.n.d); + else if (IsInt()) return handler.Int(data_.n.i.i); + else if (IsUint()) return handler.Uint(data_.n.u.u); + else if (IsInt64()) return handler.Int64(data_.n.i64); + else return handler.Uint64(data_.n.u64); + } + } + +private: + template friend class GenericValue; + template friend class GenericDocument; + + enum { + kBoolFlag = 0x0008, + kNumberFlag = 0x0010, + kIntFlag = 0x0020, + kUintFlag = 0x0040, + kInt64Flag = 0x0080, + kUint64Flag = 0x0100, + kDoubleFlag = 0x0200, + kStringFlag = 0x0400, + kCopyFlag = 0x0800, + kInlineStrFlag = 0x1000, + + // Initial flags of different types. + kNullFlag = kNullType, + kTrueFlag = kTrueType | kBoolFlag, + kFalseFlag = kFalseType | kBoolFlag, + kNumberIntFlag = kNumberType | kNumberFlag | kIntFlag | kInt64Flag, + kNumberUintFlag = kNumberType | kNumberFlag | kUintFlag | kUint64Flag | kInt64Flag, + kNumberInt64Flag = kNumberType | kNumberFlag | kInt64Flag, + kNumberUint64Flag = kNumberType | kNumberFlag | kUint64Flag, + kNumberDoubleFlag = kNumberType | kNumberFlag | kDoubleFlag, + kNumberAnyFlag = kNumberType | kNumberFlag | kIntFlag | kInt64Flag | kUintFlag | kUint64Flag | kDoubleFlag, + kConstStringFlag = kStringType | kStringFlag, + kCopyStringFlag = kStringType | kStringFlag | kCopyFlag, + kShortStringFlag = kStringType | kStringFlag | kCopyFlag | kInlineStrFlag, + kObjectFlag = kObjectType, + kArrayFlag = kArrayType, + + kTypeMask = 0x07 + }; + + static const SizeType kDefaultArrayCapacity = 16; + static const SizeType kDefaultObjectCapacity = 16; + + struct Flag { +#if RAPIDJSON_48BITPOINTER_OPTIMIZATION + char payload[sizeof(SizeType) * 2 + 6]; // 2 x SizeType + lower 48-bit pointer +#elif RAPIDJSON_64BIT + char payload[sizeof(SizeType) * 2 + sizeof(void*) + 6]; // 6 padding bytes +#else + char payload[sizeof(SizeType) * 2 + sizeof(void*) + 2]; // 2 padding bytes +#endif + uint16_t flags; + }; + + struct String { + SizeType length; + SizeType hashcode; //!< reserved + const Ch* str; + }; // 12 bytes in 32-bit mode, 16 bytes in 64-bit mode + + // implementation detail: ShortString can represent zero-terminated strings up to MaxSize chars + // (excluding the terminating zero) and store a value to determine the length of the contained + // string in the last character str[LenPos] by storing "MaxSize - length" there. If the string + // to store has the maximal length of MaxSize then str[LenPos] will be 0 and therefore act as + // the string terminator as well. For getting the string length back from that value just use + // "MaxSize - str[LenPos]". + // This allows to store 13-chars strings in 32-bit mode, 21-chars strings in 64-bit mode, + // 13-chars strings for RAPIDJSON_48BITPOINTER_OPTIMIZATION=1 inline (for `UTF8`-encoded strings). + struct ShortString { + enum { MaxChars = sizeof(static_cast(0)->payload) / sizeof(Ch), MaxSize = MaxChars - 1, LenPos = MaxSize }; + Ch str[MaxChars]; + + inline static bool Usable(SizeType len) { return (MaxSize >= len); } + inline void SetLength(SizeType len) { str[LenPos] = static_cast(MaxSize - len); } + inline SizeType GetLength() const { return static_cast(MaxSize - str[LenPos]); } + }; // at most as many bytes as "String" above => 12 bytes in 32-bit mode, 16 bytes in 64-bit mode + + // By using proper binary layout, retrieval of different integer types do not need conversions. + union Number { +#if RAPIDJSON_ENDIAN == RAPIDJSON_LITTLEENDIAN + struct I { + int i; + char padding[4]; + }i; + struct U { + unsigned u; + char padding2[4]; + }u; +#else + struct I { + char padding[4]; + int i; + }i; + struct U { + char padding2[4]; + unsigned u; + }u; +#endif + int64_t i64; + uint64_t u64; + double d; + }; // 8 bytes + + struct ObjectData { + SizeType size; + SizeType capacity; + Member* members; + }; // 12 bytes in 32-bit mode, 16 bytes in 64-bit mode + + struct ArrayData { + SizeType size; + SizeType capacity; + GenericValue* elements; + }; // 12 bytes in 32-bit mode, 16 bytes in 64-bit mode + + union Data { + String s; + ShortString ss; + Number n; + ObjectData o; + ArrayData a; + Flag f; + }; // 16 bytes in 32-bit mode, 24 bytes in 64-bit mode, 16 bytes in 64-bit with RAPIDJSON_48BITPOINTER_OPTIMIZATION + + RAPIDJSON_FORCEINLINE const Ch* GetStringPointer() const { return RAPIDJSON_GETPOINTER(Ch, data_.s.str); } + RAPIDJSON_FORCEINLINE const Ch* SetStringPointer(const Ch* str) { return RAPIDJSON_SETPOINTER(Ch, data_.s.str, str); } + RAPIDJSON_FORCEINLINE GenericValue* GetElementsPointer() const { return RAPIDJSON_GETPOINTER(GenericValue, data_.a.elements); } + RAPIDJSON_FORCEINLINE GenericValue* SetElementsPointer(GenericValue* elements) { return RAPIDJSON_SETPOINTER(GenericValue, data_.a.elements, elements); } + RAPIDJSON_FORCEINLINE Member* GetMembersPointer() const { return RAPIDJSON_GETPOINTER(Member, data_.o.members); } + RAPIDJSON_FORCEINLINE Member* SetMembersPointer(Member* members) { return RAPIDJSON_SETPOINTER(Member, data_.o.members, members); } + + // Initialize this value as array with initial data, without calling destructor. + void SetArrayRaw(GenericValue* values, SizeType count, Allocator& allocator) { + data_.f.flags = kArrayFlag; + if (count) { + GenericValue* e = static_cast(allocator.Malloc(count * sizeof(GenericValue))); + SetElementsPointer(e); + std::memcpy(static_cast(e), values, count * sizeof(GenericValue)); + } + else + SetElementsPointer(0); + data_.a.size = data_.a.capacity = count; + } + + //! Initialize this value as object with initial data, without calling destructor. + void SetObjectRaw(Member* members, SizeType count, Allocator& allocator) { + data_.f.flags = kObjectFlag; + if (count) { + Member* m = static_cast(allocator.Malloc(count * sizeof(Member))); + SetMembersPointer(m); + std::memcpy(static_cast(m), members, count * sizeof(Member)); + } + else + SetMembersPointer(0); + data_.o.size = data_.o.capacity = count; + } + + //! Initialize this value as constant string, without calling destructor. + void SetStringRaw(StringRefType s) RAPIDJSON_NOEXCEPT { + data_.f.flags = kConstStringFlag; + SetStringPointer(s); + data_.s.length = s.length; + } + + //! Initialize this value as copy string with initial data, without calling destructor. + void SetStringRaw(StringRefType s, Allocator& allocator) { + Ch* str = 0; + if (ShortString::Usable(s.length)) { + data_.f.flags = kShortStringFlag; + data_.ss.SetLength(s.length); + str = data_.ss.str; + } else { + data_.f.flags = kCopyStringFlag; + data_.s.length = s.length; + str = static_cast(allocator.Malloc((s.length + 1) * sizeof(Ch))); + SetStringPointer(str); + } + std::memcpy(str, s, s.length * sizeof(Ch)); + str[s.length] = '\0'; + } + + //! Assignment without calling destructor + void RawAssign(GenericValue& rhs) RAPIDJSON_NOEXCEPT { + data_ = rhs.data_; + // data_.f.flags = rhs.data_.f.flags; + rhs.data_.f.flags = kNullFlag; + } + + template + bool StringEqual(const GenericValue& rhs) const { + RAPIDJSON_ASSERT(IsString()); + RAPIDJSON_ASSERT(rhs.IsString()); + + const SizeType len1 = GetStringLength(); + const SizeType len2 = rhs.GetStringLength(); + if(len1 != len2) { return false; } + + const Ch* const str1 = GetString(); + const Ch* const str2 = rhs.GetString(); + if(str1 == str2) { return true; } // fast path for constant string + + return (std::memcmp(str1, str2, sizeof(Ch) * len1) == 0); + } + + Data data_; +}; + +//! GenericValue with UTF8 encoding +typedef GenericValue > Value; + +/////////////////////////////////////////////////////////////////////////////// +// GenericDocument + +//! A document for parsing JSON text as DOM. +/*! + \note implements Handler concept + \tparam Encoding Encoding for both parsing and string storage. + \tparam Allocator Allocator for allocating memory for the DOM + \tparam StackAllocator Allocator for allocating memory for stack during parsing. + \warning Although GenericDocument inherits from GenericValue, the API does \b not provide any virtual functions, especially no virtual destructor. To avoid memory leaks, do not \c delete a GenericDocument object via a pointer to a GenericValue. +*/ +template , typename StackAllocator = CrtAllocator> +class GenericDocument : public GenericValue { +public: + typedef typename Encoding::Ch Ch; //!< Character type derived from Encoding. + typedef GenericValue ValueType; //!< Value type of the document. + typedef Allocator AllocatorType; //!< Allocator type from template parameter. + + //! Constructor + /*! Creates an empty document of specified type. + \param type Mandatory type of object to create. + \param allocator Optional allocator for allocating memory. + \param stackCapacity Optional initial capacity of stack in bytes. + \param stackAllocator Optional allocator for allocating memory for stack. + */ + explicit GenericDocument(Type type, Allocator* allocator = 0, size_t stackCapacity = kDefaultStackCapacity, StackAllocator* stackAllocator = 0) : + GenericValue(type), allocator_(allocator), ownAllocator_(0), stack_(stackAllocator, stackCapacity), parseResult_() + { + if (!allocator_) + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator)(); + } + + //! Constructor + /*! Creates an empty document which type is Null. + \param allocator Optional allocator for allocating memory. + \param stackCapacity Optional initial capacity of stack in bytes. + \param stackAllocator Optional allocator for allocating memory for stack. + */ + GenericDocument(Allocator* allocator = 0, size_t stackCapacity = kDefaultStackCapacity, StackAllocator* stackAllocator = 0) : + allocator_(allocator), ownAllocator_(0), stack_(stackAllocator, stackCapacity), parseResult_() + { + if (!allocator_) + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator)(); + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Move constructor in C++11 + GenericDocument(GenericDocument&& rhs) RAPIDJSON_NOEXCEPT + : ValueType(std::forward(rhs)), // explicit cast to avoid prohibited move from Document + allocator_(rhs.allocator_), + ownAllocator_(rhs.ownAllocator_), + stack_(std::move(rhs.stack_)), + parseResult_(rhs.parseResult_) + { + rhs.allocator_ = 0; + rhs.ownAllocator_ = 0; + rhs.parseResult_ = ParseResult(); + } +#endif + + ~GenericDocument() { + Destroy(); + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Move assignment in C++11 + GenericDocument& operator=(GenericDocument&& rhs) RAPIDJSON_NOEXCEPT + { + // The cast to ValueType is necessary here, because otherwise it would + // attempt to call GenericValue's templated assignment operator. + ValueType::operator=(std::forward(rhs)); + + // Calling the destructor here would prematurely call stack_'s destructor + Destroy(); + + allocator_ = rhs.allocator_; + ownAllocator_ = rhs.ownAllocator_; + stack_ = std::move(rhs.stack_); + parseResult_ = rhs.parseResult_; + + rhs.allocator_ = 0; + rhs.ownAllocator_ = 0; + rhs.parseResult_ = ParseResult(); + + return *this; + } +#endif + + //! Exchange the contents of this document with those of another. + /*! + \param rhs Another document. + \note Constant complexity. + \see GenericValue::Swap + */ + GenericDocument& Swap(GenericDocument& rhs) RAPIDJSON_NOEXCEPT { + ValueType::Swap(rhs); + stack_.Swap(rhs.stack_); + internal::Swap(allocator_, rhs.allocator_); + internal::Swap(ownAllocator_, rhs.ownAllocator_); + internal::Swap(parseResult_, rhs.parseResult_); + return *this; + } + + // Allow Swap with ValueType. + // Refer to Effective C++ 3rd Edition/Item 33: Avoid hiding inherited names. + using ValueType::Swap; + + //! free-standing swap function helper + /*! + Helper function to enable support for common swap implementation pattern based on \c std::swap: + \code + void swap(MyClass& a, MyClass& b) { + using std::swap; + swap(a.doc, b.doc); + // ... + } + \endcode + \see Swap() + */ + friend inline void swap(GenericDocument& a, GenericDocument& b) RAPIDJSON_NOEXCEPT { a.Swap(b); } + + //! Populate this document by a generator which produces SAX events. + /*! \tparam Generator A functor with bool f(Handler) prototype. + \param g Generator functor which sends SAX events to the parameter. + \return The document itself for fluent API. + */ + template + GenericDocument& Populate(Generator& g) { + ClearStackOnExit scope(*this); + if (g(*this)) { + RAPIDJSON_ASSERT(stack_.GetSize() == sizeof(ValueType)); // Got one and only one root object + ValueType::operator=(*stack_.template Pop(1));// Move value from stack to document + } + return *this; + } + + //!@name Parse from stream + //!@{ + + //! Parse JSON text from an input stream (with Encoding conversion) + /*! \tparam parseFlags Combination of \ref ParseFlag. + \tparam SourceEncoding Encoding of input stream + \tparam InputStream Type of input stream, implementing Stream concept + \param is Input stream to be parsed. + \return The document itself for fluent API. + */ + template + GenericDocument& ParseStream(InputStream& is) { + GenericReader reader( + stack_.HasAllocator() ? &stack_.GetAllocator() : 0); + ClearStackOnExit scope(*this); + parseResult_ = reader.template Parse(is, *this); + if (parseResult_) { + RAPIDJSON_ASSERT(stack_.GetSize() == sizeof(ValueType)); // Got one and only one root object + ValueType::operator=(*stack_.template Pop(1));// Move value from stack to document + } + return *this; + } + + //! Parse JSON text from an input stream + /*! \tparam parseFlags Combination of \ref ParseFlag. + \tparam InputStream Type of input stream, implementing Stream concept + \param is Input stream to be parsed. + \return The document itself for fluent API. + */ + template + GenericDocument& ParseStream(InputStream& is) { + return ParseStream(is); + } + + //! Parse JSON text from an input stream (with \ref kParseDefaultFlags) + /*! \tparam InputStream Type of input stream, implementing Stream concept + \param is Input stream to be parsed. + \return The document itself for fluent API. + */ + template + GenericDocument& ParseStream(InputStream& is) { + return ParseStream(is); + } + //!@} + + //!@name Parse in-place from mutable string + //!@{ + + //! Parse JSON text from a mutable string + /*! \tparam parseFlags Combination of \ref ParseFlag. + \param str Mutable zero-terminated string to be parsed. + \return The document itself for fluent API. + */ + template + GenericDocument& ParseInsitu(Ch* str) { + GenericInsituStringStream s(str); + return ParseStream(s); + } + + //! Parse JSON text from a mutable string (with \ref kParseDefaultFlags) + /*! \param str Mutable zero-terminated string to be parsed. + \return The document itself for fluent API. + */ + GenericDocument& ParseInsitu(Ch* str) { + return ParseInsitu(str); + } + //!@} + + //!@name Parse from read-only string + //!@{ + + //! Parse JSON text from a read-only string (with Encoding conversion) + /*! \tparam parseFlags Combination of \ref ParseFlag (must not contain \ref kParseInsituFlag). + \tparam SourceEncoding Transcoding from input Encoding + \param str Read-only zero-terminated string to be parsed. + */ + template + GenericDocument& Parse(const typename SourceEncoding::Ch* str) { + RAPIDJSON_ASSERT(!(parseFlags & kParseInsituFlag)); + GenericStringStream s(str); + return ParseStream(s); + } + + //! Parse JSON text from a read-only string + /*! \tparam parseFlags Combination of \ref ParseFlag (must not contain \ref kParseInsituFlag). + \param str Read-only zero-terminated string to be parsed. + */ + template + GenericDocument& Parse(const Ch* str) { + return Parse(str); + } + + //! Parse JSON text from a read-only string (with \ref kParseDefaultFlags) + /*! \param str Read-only zero-terminated string to be parsed. + */ + GenericDocument& Parse(const Ch* str) { + return Parse(str); + } + + template + GenericDocument& Parse(const typename SourceEncoding::Ch* str, size_t length) { + RAPIDJSON_ASSERT(!(parseFlags & kParseInsituFlag)); + MemoryStream ms(reinterpret_cast(str), length * sizeof(typename SourceEncoding::Ch)); + EncodedInputStream is(ms); + ParseStream(is); + return *this; + } + + template + GenericDocument& Parse(const Ch* str, size_t length) { + return Parse(str, length); + } + + GenericDocument& Parse(const Ch* str, size_t length) { + return Parse(str, length); + } + +#if RAPIDJSON_HAS_STDSTRING + template + GenericDocument& Parse(const std::basic_string& str) { + // c_str() is constant complexity according to standard. Should be faster than Parse(const char*, size_t) + return Parse(str.c_str()); + } + + template + GenericDocument& Parse(const std::basic_string& str) { + return Parse(str.c_str()); + } + + GenericDocument& Parse(const std::basic_string& str) { + return Parse(str); + } +#endif // RAPIDJSON_HAS_STDSTRING + + //!@} + + //!@name Handling parse errors + //!@{ + + //! Whether a parse error has occurred in the last parsing. + bool HasParseError() const { return parseResult_.IsError(); } + + //! Get the \ref ParseErrorCode of last parsing. + ParseErrorCode GetParseError() const { return parseResult_.Code(); } + + //! Get the position of last parsing error in input, 0 otherwise. + size_t GetErrorOffset() const { return parseResult_.Offset(); } + + //! Implicit conversion to get the last parse result +#ifndef __clang // -Wdocumentation + /*! \return \ref ParseResult of the last parse operation + + \code + Document doc; + ParseResult ok = doc.Parse(json); + if (!ok) + printf( "JSON parse error: %s (%u)\n", GetParseError_En(ok.Code()), ok.Offset()); + \endcode + */ +#endif + operator ParseResult() const { return parseResult_; } + //!@} + + //! Get the allocator of this document. + Allocator& GetAllocator() { + RAPIDJSON_ASSERT(allocator_); + return *allocator_; + } + + //! Get the capacity of stack in bytes. + size_t GetStackCapacity() const { return stack_.GetCapacity(); } + +private: + // clear stack on any exit from ParseStream, e.g. due to exception + struct ClearStackOnExit { + explicit ClearStackOnExit(GenericDocument& d) : d_(d) {} + ~ClearStackOnExit() { d_.ClearStack(); } + private: + ClearStackOnExit(const ClearStackOnExit&); + ClearStackOnExit& operator=(const ClearStackOnExit&); + GenericDocument& d_; + }; + + // callers of the following private Handler functions + // template friend class GenericReader; // for parsing + template friend class GenericValue; // for deep copying + +public: + // Implementation of Handler + bool Null() { new (stack_.template Push()) ValueType(); return true; } + bool Bool(bool b) { new (stack_.template Push()) ValueType(b); return true; } + bool Int(int i) { new (stack_.template Push()) ValueType(i); return true; } + bool Uint(unsigned i) { new (stack_.template Push()) ValueType(i); return true; } + bool Int64(int64_t i) { new (stack_.template Push()) ValueType(i); return true; } + bool Uint64(uint64_t i) { new (stack_.template Push()) ValueType(i); return true; } + bool Double(double d) { new (stack_.template Push()) ValueType(d); return true; } + + bool RawNumber(const Ch* str, SizeType length, bool copy) { + if (copy) + new (stack_.template Push()) ValueType(str, length, GetAllocator()); + else + new (stack_.template Push()) ValueType(str, length); + return true; + } + + bool String(const Ch* str, SizeType length, bool copy) { + if (copy) + new (stack_.template Push()) ValueType(str, length, GetAllocator()); + else + new (stack_.template Push()) ValueType(str, length); + return true; + } + + bool StartObject() { new (stack_.template Push()) ValueType(kObjectType); return true; } + + bool Key(const Ch* str, SizeType length, bool copy) { return String(str, length, copy); } + + bool EndObject(SizeType memberCount) { + typename ValueType::Member* members = stack_.template Pop(memberCount); + stack_.template Top()->SetObjectRaw(members, memberCount, GetAllocator()); + return true; + } + + bool StartArray() { new (stack_.template Push()) ValueType(kArrayType); return true; } + + bool EndArray(SizeType elementCount) { + ValueType* elements = stack_.template Pop(elementCount); + stack_.template Top()->SetArrayRaw(elements, elementCount, GetAllocator()); + return true; + } + +private: + //! Prohibit copying + GenericDocument(const GenericDocument&); + //! Prohibit assignment + GenericDocument& operator=(const GenericDocument&); + + void ClearStack() { + if (Allocator::kNeedFree) + while (stack_.GetSize() > 0) // Here assumes all elements in stack array are GenericValue (Member is actually 2 GenericValue objects) + (stack_.template Pop(1))->~ValueType(); + else + stack_.Clear(); + stack_.ShrinkToFit(); + } + + void Destroy() { + RAPIDJSON_DELETE(ownAllocator_); + } + + static const size_t kDefaultStackCapacity = 1024; + Allocator* allocator_; + Allocator* ownAllocator_; + internal::Stack stack_; + ParseResult parseResult_; +}; + +//! GenericDocument with UTF8 encoding +typedef GenericDocument > Document; + +//! Helper class for accessing Value of array type. +/*! + Instance of this helper class is obtained by \c GenericValue::GetArray(). + In addition to all APIs for array type, it provides range-based for loop if \c RAPIDJSON_HAS_CXX11_RANGE_FOR=1. +*/ +template +class GenericArray { +public: + typedef GenericArray ConstArray; + typedef GenericArray Array; + typedef ValueT PlainType; + typedef typename internal::MaybeAddConst::Type ValueType; + typedef ValueType* ValueIterator; // This may be const or non-const iterator + typedef const ValueT* ConstValueIterator; + typedef typename ValueType::AllocatorType AllocatorType; + typedef typename ValueType::StringRefType StringRefType; + + template + friend class GenericValue; + + GenericArray(const GenericArray& rhs) : value_(rhs.value_) {} + GenericArray& operator=(const GenericArray& rhs) { value_ = rhs.value_; return *this; } + ~GenericArray() {} + + SizeType Size() const { return value_.Size(); } + SizeType Capacity() const { return value_.Capacity(); } + bool Empty() const { return value_.Empty(); } + void Clear() const { value_.Clear(); } + ValueType& operator[](SizeType index) const { return value_[index]; } + ValueIterator Begin() const { return value_.Begin(); } + ValueIterator End() const { return value_.End(); } + GenericArray Reserve(SizeType newCapacity, AllocatorType &allocator) const { value_.Reserve(newCapacity, allocator); return *this; } + GenericArray PushBack(ValueType& value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; } +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericArray PushBack(ValueType&& value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; } +#endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericArray PushBack(StringRefType value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; } + template RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (const GenericArray&)) PushBack(T value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; } + GenericArray PopBack() const { value_.PopBack(); return *this; } + ValueIterator Erase(ConstValueIterator pos) const { return value_.Erase(pos); } + ValueIterator Erase(ConstValueIterator first, ConstValueIterator last) const { return value_.Erase(first, last); } + +#if RAPIDJSON_HAS_CXX11_RANGE_FOR + ValueIterator begin() const { return value_.Begin(); } + ValueIterator end() const { return value_.End(); } +#endif + +private: + GenericArray(); + GenericArray(ValueType& value) : value_(value) {} + ValueType& value_; +}; + +//! Helper class for accessing Value of object type. +/*! + Instance of this helper class is obtained by \c GenericValue::GetObject(). + In addition to all APIs for array type, it provides range-based for loop if \c RAPIDJSON_HAS_CXX11_RANGE_FOR=1. +*/ +template +class GenericObject { +public: + typedef GenericObject ConstObject; + typedef GenericObject Object; + typedef ValueT PlainType; + typedef typename internal::MaybeAddConst::Type ValueType; + typedef GenericMemberIterator MemberIterator; // This may be const or non-const iterator + typedef GenericMemberIterator ConstMemberIterator; + typedef typename ValueType::AllocatorType AllocatorType; + typedef typename ValueType::StringRefType StringRefType; + typedef typename ValueType::EncodingType EncodingType; + typedef typename ValueType::Ch Ch; + + template + friend class GenericValue; + + GenericObject(const GenericObject& rhs) : value_(rhs.value_) {} + GenericObject& operator=(const GenericObject& rhs) { value_ = rhs.value_; return *this; } + ~GenericObject() {} + + SizeType MemberCount() const { return value_.MemberCount(); } + SizeType MemberCapacity() const { return value_.MemberCapacity(); } + bool ObjectEmpty() const { return value_.ObjectEmpty(); } + template ValueType& operator[](T* name) const { return value_[name]; } + template ValueType& operator[](const GenericValue& name) const { return value_[name]; } +#if RAPIDJSON_HAS_STDSTRING + ValueType& operator[](const std::basic_string& name) const { return value_[name]; } +#endif + MemberIterator MemberBegin() const { return value_.MemberBegin(); } + MemberIterator MemberEnd() const { return value_.MemberEnd(); } + GenericObject MemberReserve(SizeType newCapacity, AllocatorType &allocator) const { value_.MemberReserve(newCapacity, allocator); return *this; } + bool HasMember(const Ch* name) const { return value_.HasMember(name); } +#if RAPIDJSON_HAS_STDSTRING + bool HasMember(const std::basic_string& name) const { return value_.HasMember(name); } +#endif + template bool HasMember(const GenericValue& name) const { return value_.HasMember(name); } + MemberIterator FindMember(const Ch* name) const { return value_.FindMember(name); } + template MemberIterator FindMember(const GenericValue& name) const { return value_.FindMember(name); } +#if RAPIDJSON_HAS_STDSTRING + MemberIterator FindMember(const std::basic_string& name) const { return value_.FindMember(name); } +#endif + GenericObject AddMember(ValueType& name, ValueType& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + GenericObject AddMember(ValueType& name, StringRefType value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } +#if RAPIDJSON_HAS_STDSTRING + GenericObject AddMember(ValueType& name, std::basic_string& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } +#endif + template RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (ValueType&)) AddMember(ValueType& name, T value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericObject AddMember(ValueType&& name, ValueType&& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + GenericObject AddMember(ValueType&& name, ValueType& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + GenericObject AddMember(ValueType& name, ValueType&& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + GenericObject AddMember(StringRefType name, ValueType&& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } +#endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericObject AddMember(StringRefType name, ValueType& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + GenericObject AddMember(StringRefType name, StringRefType value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + template RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (GenericObject)) AddMember(StringRefType name, T value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + void RemoveAllMembers() { value_.RemoveAllMembers(); } + bool RemoveMember(const Ch* name) const { return value_.RemoveMember(name); } +#if RAPIDJSON_HAS_STDSTRING + bool RemoveMember(const std::basic_string& name) const { return value_.RemoveMember(name); } +#endif + template bool RemoveMember(const GenericValue& name) const { return value_.RemoveMember(name); } + MemberIterator RemoveMember(MemberIterator m) const { return value_.RemoveMember(m); } + MemberIterator EraseMember(ConstMemberIterator pos) const { return value_.EraseMember(pos); } + MemberIterator EraseMember(ConstMemberIterator first, ConstMemberIterator last) const { return value_.EraseMember(first, last); } + bool EraseMember(const Ch* name) const { return value_.EraseMember(name); } +#if RAPIDJSON_HAS_STDSTRING + bool EraseMember(const std::basic_string& name) const { return EraseMember(ValueType(StringRef(name))); } +#endif + template bool EraseMember(const GenericValue& name) const { return value_.EraseMember(name); } + +#if RAPIDJSON_HAS_CXX11_RANGE_FOR + MemberIterator begin() const { return value_.MemberBegin(); } + MemberIterator end() const { return value_.MemberEnd(); } +#endif + +private: + GenericObject(); + GenericObject(ValueType& value) : value_(value) {} + ValueType& value_; +}; + +RAPIDJSON_NAMESPACE_END +RAPIDJSON_DIAG_POP + +#endif // RAPIDJSON_DOCUMENT_H_ diff --git a/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/encodedstream.h b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/encodedstream.h new file mode 100644 index 0000000..223601c --- /dev/null +++ b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/encodedstream.h @@ -0,0 +1,299 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_ENCODEDSTREAM_H_ +#define RAPIDJSON_ENCODEDSTREAM_H_ + +#include "stream.h" +#include "memorystream.h" + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Input byte stream wrapper with a statically bound encoding. +/*! + \tparam Encoding The interpretation of encoding of the stream. Either UTF8, UTF16LE, UTF16BE, UTF32LE, UTF32BE. + \tparam InputByteStream Type of input byte stream. For example, FileReadStream. +*/ +template +class EncodedInputStream { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); +public: + typedef typename Encoding::Ch Ch; + + EncodedInputStream(InputByteStream& is) : is_(is) { + current_ = Encoding::TakeBOM(is_); + } + + Ch Peek() const { return current_; } + Ch Take() { Ch c = current_; current_ = Encoding::Take(is_); return c; } + size_t Tell() const { return is_.Tell(); } + + // Not implemented + void Put(Ch) { RAPIDJSON_ASSERT(false); } + void Flush() { RAPIDJSON_ASSERT(false); } + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + +private: + EncodedInputStream(const EncodedInputStream&); + EncodedInputStream& operator=(const EncodedInputStream&); + + InputByteStream& is_; + Ch current_; +}; + +//! Specialized for UTF8 MemoryStream. +template <> +class EncodedInputStream, MemoryStream> { +public: + typedef UTF8<>::Ch Ch; + + EncodedInputStream(MemoryStream& is) : is_(is) { + if (static_cast(is_.Peek()) == 0xEFu) is_.Take(); + if (static_cast(is_.Peek()) == 0xBBu) is_.Take(); + if (static_cast(is_.Peek()) == 0xBFu) is_.Take(); + } + Ch Peek() const { return is_.Peek(); } + Ch Take() { return is_.Take(); } + size_t Tell() const { return is_.Tell(); } + + // Not implemented + void Put(Ch) {} + void Flush() {} + Ch* PutBegin() { return 0; } + size_t PutEnd(Ch*) { return 0; } + + MemoryStream& is_; + +private: + EncodedInputStream(const EncodedInputStream&); + EncodedInputStream& operator=(const EncodedInputStream&); +}; + +//! Output byte stream wrapper with statically bound encoding. +/*! + \tparam Encoding The interpretation of encoding of the stream. Either UTF8, UTF16LE, UTF16BE, UTF32LE, UTF32BE. + \tparam OutputByteStream Type of input byte stream. For example, FileWriteStream. +*/ +template +class EncodedOutputStream { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); +public: + typedef typename Encoding::Ch Ch; + + EncodedOutputStream(OutputByteStream& os, bool putBOM = true) : os_(os) { + if (putBOM) + Encoding::PutBOM(os_); + } + + void Put(Ch c) { Encoding::Put(os_, c); } + void Flush() { os_.Flush(); } + + // Not implemented + Ch Peek() const { RAPIDJSON_ASSERT(false); return 0;} + Ch Take() { RAPIDJSON_ASSERT(false); return 0;} + size_t Tell() const { RAPIDJSON_ASSERT(false); return 0; } + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + +private: + EncodedOutputStream(const EncodedOutputStream&); + EncodedOutputStream& operator=(const EncodedOutputStream&); + + OutputByteStream& os_; +}; + +#define RAPIDJSON_ENCODINGS_FUNC(x) UTF8::x, UTF16LE::x, UTF16BE::x, UTF32LE::x, UTF32BE::x + +//! Input stream wrapper with dynamically bound encoding and automatic encoding detection. +/*! + \tparam CharType Type of character for reading. + \tparam InputByteStream type of input byte stream to be wrapped. +*/ +template +class AutoUTFInputStream { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); +public: + typedef CharType Ch; + + //! Constructor. + /*! + \param is input stream to be wrapped. + \param type UTF encoding type if it is not detected from the stream. + */ + AutoUTFInputStream(InputByteStream& is, UTFType type = kUTF8) : is_(&is), type_(type), hasBOM_(false) { + RAPIDJSON_ASSERT(type >= kUTF8 && type <= kUTF32BE); + DetectType(); + static const TakeFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Take) }; + takeFunc_ = f[type_]; + current_ = takeFunc_(*is_); + } + + UTFType GetType() const { return type_; } + bool HasBOM() const { return hasBOM_; } + + Ch Peek() const { return current_; } + Ch Take() { Ch c = current_; current_ = takeFunc_(*is_); return c; } + size_t Tell() const { return is_->Tell(); } + + // Not implemented + void Put(Ch) { RAPIDJSON_ASSERT(false); } + void Flush() { RAPIDJSON_ASSERT(false); } + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + +private: + AutoUTFInputStream(const AutoUTFInputStream&); + AutoUTFInputStream& operator=(const AutoUTFInputStream&); + + // Detect encoding type with BOM or RFC 4627 + void DetectType() { + // BOM (Byte Order Mark): + // 00 00 FE FF UTF-32BE + // FF FE 00 00 UTF-32LE + // FE FF UTF-16BE + // FF FE UTF-16LE + // EF BB BF UTF-8 + + const unsigned char* c = reinterpret_cast(is_->Peek4()); + if (!c) + return; + + unsigned bom = static_cast(c[0] | (c[1] << 8) | (c[2] << 16) | (c[3] << 24)); + hasBOM_ = false; + if (bom == 0xFFFE0000) { type_ = kUTF32BE; hasBOM_ = true; is_->Take(); is_->Take(); is_->Take(); is_->Take(); } + else if (bom == 0x0000FEFF) { type_ = kUTF32LE; hasBOM_ = true; is_->Take(); is_->Take(); is_->Take(); is_->Take(); } + else if ((bom & 0xFFFF) == 0xFFFE) { type_ = kUTF16BE; hasBOM_ = true; is_->Take(); is_->Take(); } + else if ((bom & 0xFFFF) == 0xFEFF) { type_ = kUTF16LE; hasBOM_ = true; is_->Take(); is_->Take(); } + else if ((bom & 0xFFFFFF) == 0xBFBBEF) { type_ = kUTF8; hasBOM_ = true; is_->Take(); is_->Take(); is_->Take(); } + + // RFC 4627: Section 3 + // "Since the first two characters of a JSON text will always be ASCII + // characters [RFC0020], it is possible to determine whether an octet + // stream is UTF-8, UTF-16 (BE or LE), or UTF-32 (BE or LE) by looking + // at the pattern of nulls in the first four octets." + // 00 00 00 xx UTF-32BE + // 00 xx 00 xx UTF-16BE + // xx 00 00 00 UTF-32LE + // xx 00 xx 00 UTF-16LE + // xx xx xx xx UTF-8 + + if (!hasBOM_) { + int pattern = (c[0] ? 1 : 0) | (c[1] ? 2 : 0) | (c[2] ? 4 : 0) | (c[3] ? 8 : 0); + switch (pattern) { + case 0x08: type_ = kUTF32BE; break; + case 0x0A: type_ = kUTF16BE; break; + case 0x01: type_ = kUTF32LE; break; + case 0x05: type_ = kUTF16LE; break; + case 0x0F: type_ = kUTF8; break; + default: break; // Use type defined by user. + } + } + + // Runtime check whether the size of character type is sufficient. It only perform checks with assertion. + if (type_ == kUTF16LE || type_ == kUTF16BE) RAPIDJSON_ASSERT(sizeof(Ch) >= 2); + if (type_ == kUTF32LE || type_ == kUTF32BE) RAPIDJSON_ASSERT(sizeof(Ch) >= 4); + } + + typedef Ch (*TakeFunc)(InputByteStream& is); + InputByteStream* is_; + UTFType type_; + Ch current_; + TakeFunc takeFunc_; + bool hasBOM_; +}; + +//! Output stream wrapper with dynamically bound encoding and automatic encoding detection. +/*! + \tparam CharType Type of character for writing. + \tparam OutputByteStream type of output byte stream to be wrapped. +*/ +template +class AutoUTFOutputStream { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); +public: + typedef CharType Ch; + + //! Constructor. + /*! + \param os output stream to be wrapped. + \param type UTF encoding type. + \param putBOM Whether to write BOM at the beginning of the stream. + */ + AutoUTFOutputStream(OutputByteStream& os, UTFType type, bool putBOM) : os_(&os), type_(type) { + RAPIDJSON_ASSERT(type >= kUTF8 && type <= kUTF32BE); + + // Runtime check whether the size of character type is sufficient. It only perform checks with assertion. + if (type_ == kUTF16LE || type_ == kUTF16BE) RAPIDJSON_ASSERT(sizeof(Ch) >= 2); + if (type_ == kUTF32LE || type_ == kUTF32BE) RAPIDJSON_ASSERT(sizeof(Ch) >= 4); + + static const PutFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Put) }; + putFunc_ = f[type_]; + + if (putBOM) + PutBOM(); + } + + UTFType GetType() const { return type_; } + + void Put(Ch c) { putFunc_(*os_, c); } + void Flush() { os_->Flush(); } + + // Not implemented + Ch Peek() const { RAPIDJSON_ASSERT(false); return 0;} + Ch Take() { RAPIDJSON_ASSERT(false); return 0;} + size_t Tell() const { RAPIDJSON_ASSERT(false); return 0; } + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + +private: + AutoUTFOutputStream(const AutoUTFOutputStream&); + AutoUTFOutputStream& operator=(const AutoUTFOutputStream&); + + void PutBOM() { + typedef void (*PutBOMFunc)(OutputByteStream&); + static const PutBOMFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(PutBOM) }; + f[type_](*os_); + } + + typedef void (*PutFunc)(OutputByteStream&, Ch); + + OutputByteStream* os_; + UTFType type_; + PutFunc putFunc_; +}; + +#undef RAPIDJSON_ENCODINGS_FUNC + +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#ifdef __GNUC__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_FILESTREAM_H_ diff --git a/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/encodings.h b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/encodings.h new file mode 100644 index 0000000..0b24467 --- /dev/null +++ b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/encodings.h @@ -0,0 +1,716 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_ENCODINGS_H_ +#define RAPIDJSON_ENCODINGS_H_ + +#include "rapidjson.h" + +#if defined(_MSC_VER) && !defined(__clang__) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4244) // conversion from 'type1' to 'type2', possible loss of data +RAPIDJSON_DIAG_OFF(4702) // unreachable code +#elif defined(__GNUC__) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +RAPIDJSON_DIAG_OFF(overflow) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// Encoding + +/*! \class rapidjson::Encoding + \brief Concept for encoding of Unicode characters. + +\code +concept Encoding { + typename Ch; //! Type of character. A "character" is actually a code unit in unicode's definition. + + enum { supportUnicode = 1 }; // or 0 if not supporting unicode + + //! \brief Encode a Unicode codepoint to an output stream. + //! \param os Output stream. + //! \param codepoint An unicode codepoint, ranging from 0x0 to 0x10FFFF inclusively. + template + static void Encode(OutputStream& os, unsigned codepoint); + + //! \brief Decode a Unicode codepoint from an input stream. + //! \param is Input stream. + //! \param codepoint Output of the unicode codepoint. + //! \return true if a valid codepoint can be decoded from the stream. + template + static bool Decode(InputStream& is, unsigned* codepoint); + + //! \brief Validate one Unicode codepoint from an encoded stream. + //! \param is Input stream to obtain codepoint. + //! \param os Output for copying one codepoint. + //! \return true if it is valid. + //! \note This function just validating and copying the codepoint without actually decode it. + template + static bool Validate(InputStream& is, OutputStream& os); + + // The following functions are deal with byte streams. + + //! Take a character from input byte stream, skip BOM if exist. + template + static CharType TakeBOM(InputByteStream& is); + + //! Take a character from input byte stream. + template + static Ch Take(InputByteStream& is); + + //! Put BOM to output byte stream. + template + static void PutBOM(OutputByteStream& os); + + //! Put a character to output byte stream. + template + static void Put(OutputByteStream& os, Ch c); +}; +\endcode +*/ + +/////////////////////////////////////////////////////////////////////////////// +// UTF8 + +//! UTF-8 encoding. +/*! http://en.wikipedia.org/wiki/UTF-8 + http://tools.ietf.org/html/rfc3629 + \tparam CharType Code unit for storing 8-bit UTF-8 data. Default is char. + \note implements Encoding concept +*/ +template +struct UTF8 { + typedef CharType Ch; + + enum { supportUnicode = 1 }; + + template + static void Encode(OutputStream& os, unsigned codepoint) { + if (codepoint <= 0x7F) + os.Put(static_cast(codepoint & 0xFF)); + else if (codepoint <= 0x7FF) { + os.Put(static_cast(0xC0 | ((codepoint >> 6) & 0xFF))); + os.Put(static_cast(0x80 | ((codepoint & 0x3F)))); + } + else if (codepoint <= 0xFFFF) { + os.Put(static_cast(0xE0 | ((codepoint >> 12) & 0xFF))); + os.Put(static_cast(0x80 | ((codepoint >> 6) & 0x3F))); + os.Put(static_cast(0x80 | (codepoint & 0x3F))); + } + else { + RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + os.Put(static_cast(0xF0 | ((codepoint >> 18) & 0xFF))); + os.Put(static_cast(0x80 | ((codepoint >> 12) & 0x3F))); + os.Put(static_cast(0x80 | ((codepoint >> 6) & 0x3F))); + os.Put(static_cast(0x80 | (codepoint & 0x3F))); + } + } + + template + static void EncodeUnsafe(OutputStream& os, unsigned codepoint) { + if (codepoint <= 0x7F) + PutUnsafe(os, static_cast(codepoint & 0xFF)); + else if (codepoint <= 0x7FF) { + PutUnsafe(os, static_cast(0xC0 | ((codepoint >> 6) & 0xFF))); + PutUnsafe(os, static_cast(0x80 | ((codepoint & 0x3F)))); + } + else if (codepoint <= 0xFFFF) { + PutUnsafe(os, static_cast(0xE0 | ((codepoint >> 12) & 0xFF))); + PutUnsafe(os, static_cast(0x80 | ((codepoint >> 6) & 0x3F))); + PutUnsafe(os, static_cast(0x80 | (codepoint & 0x3F))); + } + else { + RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + PutUnsafe(os, static_cast(0xF0 | ((codepoint >> 18) & 0xFF))); + PutUnsafe(os, static_cast(0x80 | ((codepoint >> 12) & 0x3F))); + PutUnsafe(os, static_cast(0x80 | ((codepoint >> 6) & 0x3F))); + PutUnsafe(os, static_cast(0x80 | (codepoint & 0x3F))); + } + } + + template + static bool Decode(InputStream& is, unsigned* codepoint) { +#define RAPIDJSON_COPY() c = is.Take(); *codepoint = (*codepoint << 6) | (static_cast(c) & 0x3Fu) +#define RAPIDJSON_TRANS(mask) result &= ((GetRange(static_cast(c)) & mask) != 0) +#define RAPIDJSON_TAIL() RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x70) + typename InputStream::Ch c = is.Take(); + if (!(c & 0x80)) { + *codepoint = static_cast(c); + return true; + } + + unsigned char type = GetRange(static_cast(c)); + if (type >= 32) { + *codepoint = 0; + } else { + *codepoint = (0xFFu >> type) & static_cast(c); + } + bool result = true; + switch (type) { + case 2: RAPIDJSON_TAIL(); return result; + case 3: RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); return result; + case 4: RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x50); RAPIDJSON_TAIL(); return result; + case 5: RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x10); RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); return result; + case 6: RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); return result; + case 10: RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x20); RAPIDJSON_TAIL(); return result; + case 11: RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x60); RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); return result; + default: return false; + } +#undef RAPIDJSON_COPY +#undef RAPIDJSON_TRANS +#undef RAPIDJSON_TAIL + } + + template + static bool Validate(InputStream& is, OutputStream& os) { +#define RAPIDJSON_COPY() os.Put(c = is.Take()) +#define RAPIDJSON_TRANS(mask) result &= ((GetRange(static_cast(c)) & mask) != 0) +#define RAPIDJSON_TAIL() RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x70) + Ch c; + RAPIDJSON_COPY(); + if (!(c & 0x80)) + return true; + + bool result = true; + switch (GetRange(static_cast(c))) { + case 2: RAPIDJSON_TAIL(); return result; + case 3: RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); return result; + case 4: RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x50); RAPIDJSON_TAIL(); return result; + case 5: RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x10); RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); return result; + case 6: RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); return result; + case 10: RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x20); RAPIDJSON_TAIL(); return result; + case 11: RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x60); RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); return result; + default: return false; + } +#undef RAPIDJSON_COPY +#undef RAPIDJSON_TRANS +#undef RAPIDJSON_TAIL + } + + static unsigned char GetRange(unsigned char c) { + // Referring to DFA of http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ + // With new mapping 1 -> 0x10, 7 -> 0x20, 9 -> 0x40, such that AND operation can test multiple types. + static const unsigned char type[] = { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, + 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 8,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 10,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3, 11,6,6,6,5,8,8,8,8,8,8,8,8,8,8,8, + }; + return type[c]; + } + + template + static CharType TakeBOM(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + typename InputByteStream::Ch c = Take(is); + if (static_cast(c) != 0xEFu) return c; + c = is.Take(); + if (static_cast(c) != 0xBBu) return c; + c = is.Take(); + if (static_cast(c) != 0xBFu) return c; + c = is.Take(); + return c; + } + + template + static Ch Take(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + return static_cast(is.Take()); + } + + template + static void PutBOM(OutputByteStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(0xEFu)); + os.Put(static_cast(0xBBu)); + os.Put(static_cast(0xBFu)); + } + + template + static void Put(OutputByteStream& os, Ch c) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(c)); + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// UTF16 + +//! UTF-16 encoding. +/*! http://en.wikipedia.org/wiki/UTF-16 + http://tools.ietf.org/html/rfc2781 + \tparam CharType Type for storing 16-bit UTF-16 data. Default is wchar_t. C++11 may use char16_t instead. + \note implements Encoding concept + + \note For in-memory access, no need to concern endianness. The code units and code points are represented by CPU's endianness. + For streaming, use UTF16LE and UTF16BE, which handle endianness. +*/ +template +struct UTF16 { + typedef CharType Ch; + RAPIDJSON_STATIC_ASSERT(sizeof(Ch) >= 2); + + enum { supportUnicode = 1 }; + + template + static void Encode(OutputStream& os, unsigned codepoint) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 2); + if (codepoint <= 0xFFFF) { + RAPIDJSON_ASSERT(codepoint < 0xD800 || codepoint > 0xDFFF); // Code point itself cannot be surrogate pair + os.Put(static_cast(codepoint)); + } + else { + RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + unsigned v = codepoint - 0x10000; + os.Put(static_cast((v >> 10) | 0xD800)); + os.Put(static_cast((v & 0x3FF) | 0xDC00)); + } + } + + + template + static void EncodeUnsafe(OutputStream& os, unsigned codepoint) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 2); + if (codepoint <= 0xFFFF) { + RAPIDJSON_ASSERT(codepoint < 0xD800 || codepoint > 0xDFFF); // Code point itself cannot be surrogate pair + PutUnsafe(os, static_cast(codepoint)); + } + else { + RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + unsigned v = codepoint - 0x10000; + PutUnsafe(os, static_cast((v >> 10) | 0xD800)); + PutUnsafe(os, static_cast((v & 0x3FF) | 0xDC00)); + } + } + + template + static bool Decode(InputStream& is, unsigned* codepoint) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputStream::Ch) >= 2); + typename InputStream::Ch c = is.Take(); + if (c < 0xD800 || c > 0xDFFF) { + *codepoint = static_cast(c); + return true; + } + else if (c <= 0xDBFF) { + *codepoint = (static_cast(c) & 0x3FF) << 10; + c = is.Take(); + *codepoint |= (static_cast(c) & 0x3FF); + *codepoint += 0x10000; + return c >= 0xDC00 && c <= 0xDFFF; + } + return false; + } + + template + static bool Validate(InputStream& is, OutputStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputStream::Ch) >= 2); + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 2); + typename InputStream::Ch c; + os.Put(static_cast(c = is.Take())); + if (c < 0xD800 || c > 0xDFFF) + return true; + else if (c <= 0xDBFF) { + os.Put(c = is.Take()); + return c >= 0xDC00 && c <= 0xDFFF; + } + return false; + } +}; + +//! UTF-16 little endian encoding. +template +struct UTF16LE : UTF16 { + template + static CharType TakeBOM(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + CharType c = Take(is); + return static_cast(c) == 0xFEFFu ? Take(is) : c; + } + + template + static CharType Take(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + unsigned c = static_cast(is.Take()); + c |= static_cast(static_cast(is.Take())) << 8; + return static_cast(c); + } + + template + static void PutBOM(OutputByteStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(0xFFu)); + os.Put(static_cast(0xFEu)); + } + + template + static void Put(OutputByteStream& os, CharType c) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(static_cast(c) & 0xFFu)); + os.Put(static_cast((static_cast(c) >> 8) & 0xFFu)); + } +}; + +//! UTF-16 big endian encoding. +template +struct UTF16BE : UTF16 { + template + static CharType TakeBOM(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + CharType c = Take(is); + return static_cast(c) == 0xFEFFu ? Take(is) : c; + } + + template + static CharType Take(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + unsigned c = static_cast(static_cast(is.Take())) << 8; + c |= static_cast(static_cast(is.Take())); + return static_cast(c); + } + + template + static void PutBOM(OutputByteStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(0xFEu)); + os.Put(static_cast(0xFFu)); + } + + template + static void Put(OutputByteStream& os, CharType c) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast((static_cast(c) >> 8) & 0xFFu)); + os.Put(static_cast(static_cast(c) & 0xFFu)); + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// UTF32 + +//! UTF-32 encoding. +/*! http://en.wikipedia.org/wiki/UTF-32 + \tparam CharType Type for storing 32-bit UTF-32 data. Default is unsigned. C++11 may use char32_t instead. + \note implements Encoding concept + + \note For in-memory access, no need to concern endianness. The code units and code points are represented by CPU's endianness. + For streaming, use UTF32LE and UTF32BE, which handle endianness. +*/ +template +struct UTF32 { + typedef CharType Ch; + RAPIDJSON_STATIC_ASSERT(sizeof(Ch) >= 4); + + enum { supportUnicode = 1 }; + + template + static void Encode(OutputStream& os, unsigned codepoint) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 4); + RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + os.Put(codepoint); + } + + template + static void EncodeUnsafe(OutputStream& os, unsigned codepoint) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 4); + RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + PutUnsafe(os, codepoint); + } + + template + static bool Decode(InputStream& is, unsigned* codepoint) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputStream::Ch) >= 4); + Ch c = is.Take(); + *codepoint = c; + return c <= 0x10FFFF; + } + + template + static bool Validate(InputStream& is, OutputStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputStream::Ch) >= 4); + Ch c; + os.Put(c = is.Take()); + return c <= 0x10FFFF; + } +}; + +//! UTF-32 little endian enocoding. +template +struct UTF32LE : UTF32 { + template + static CharType TakeBOM(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + CharType c = Take(is); + return static_cast(c) == 0x0000FEFFu ? Take(is) : c; + } + + template + static CharType Take(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + unsigned c = static_cast(is.Take()); + c |= static_cast(static_cast(is.Take())) << 8; + c |= static_cast(static_cast(is.Take())) << 16; + c |= static_cast(static_cast(is.Take())) << 24; + return static_cast(c); + } + + template + static void PutBOM(OutputByteStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(0xFFu)); + os.Put(static_cast(0xFEu)); + os.Put(static_cast(0x00u)); + os.Put(static_cast(0x00u)); + } + + template + static void Put(OutputByteStream& os, CharType c) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(c & 0xFFu)); + os.Put(static_cast((c >> 8) & 0xFFu)); + os.Put(static_cast((c >> 16) & 0xFFu)); + os.Put(static_cast((c >> 24) & 0xFFu)); + } +}; + +//! UTF-32 big endian encoding. +template +struct UTF32BE : UTF32 { + template + static CharType TakeBOM(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + CharType c = Take(is); + return static_cast(c) == 0x0000FEFFu ? Take(is) : c; + } + + template + static CharType Take(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + unsigned c = static_cast(static_cast(is.Take())) << 24; + c |= static_cast(static_cast(is.Take())) << 16; + c |= static_cast(static_cast(is.Take())) << 8; + c |= static_cast(static_cast(is.Take())); + return static_cast(c); + } + + template + static void PutBOM(OutputByteStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(0x00u)); + os.Put(static_cast(0x00u)); + os.Put(static_cast(0xFEu)); + os.Put(static_cast(0xFFu)); + } + + template + static void Put(OutputByteStream& os, CharType c) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast((c >> 24) & 0xFFu)); + os.Put(static_cast((c >> 16) & 0xFFu)); + os.Put(static_cast((c >> 8) & 0xFFu)); + os.Put(static_cast(c & 0xFFu)); + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// ASCII + +//! ASCII encoding. +/*! http://en.wikipedia.org/wiki/ASCII + \tparam CharType Code unit for storing 7-bit ASCII data. Default is char. + \note implements Encoding concept +*/ +template +struct ASCII { + typedef CharType Ch; + + enum { supportUnicode = 0 }; + + template + static void Encode(OutputStream& os, unsigned codepoint) { + RAPIDJSON_ASSERT(codepoint <= 0x7F); + os.Put(static_cast(codepoint & 0xFF)); + } + + template + static void EncodeUnsafe(OutputStream& os, unsigned codepoint) { + RAPIDJSON_ASSERT(codepoint <= 0x7F); + PutUnsafe(os, static_cast(codepoint & 0xFF)); + } + + template + static bool Decode(InputStream& is, unsigned* codepoint) { + uint8_t c = static_cast(is.Take()); + *codepoint = c; + return c <= 0X7F; + } + + template + static bool Validate(InputStream& is, OutputStream& os) { + uint8_t c = static_cast(is.Take()); + os.Put(static_cast(c)); + return c <= 0x7F; + } + + template + static CharType TakeBOM(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + uint8_t c = static_cast(Take(is)); + return static_cast(c); + } + + template + static Ch Take(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + return static_cast(is.Take()); + } + + template + static void PutBOM(OutputByteStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + (void)os; + } + + template + static void Put(OutputByteStream& os, Ch c) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(c)); + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// AutoUTF + +//! Runtime-specified UTF encoding type of a stream. +enum UTFType { + kUTF8 = 0, //!< UTF-8. + kUTF16LE = 1, //!< UTF-16 little endian. + kUTF16BE = 2, //!< UTF-16 big endian. + kUTF32LE = 3, //!< UTF-32 little endian. + kUTF32BE = 4 //!< UTF-32 big endian. +}; + +//! Dynamically select encoding according to stream's runtime-specified UTF encoding type. +/*! \note This class can be used with AutoUTFInputtStream and AutoUTFOutputStream, which provides GetType(). +*/ +template +struct AutoUTF { + typedef CharType Ch; + + enum { supportUnicode = 1 }; + +#define RAPIDJSON_ENCODINGS_FUNC(x) UTF8::x, UTF16LE::x, UTF16BE::x, UTF32LE::x, UTF32BE::x + + template + static RAPIDJSON_FORCEINLINE void Encode(OutputStream& os, unsigned codepoint) { + typedef void (*EncodeFunc)(OutputStream&, unsigned); + static const EncodeFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Encode) }; + (*f[os.GetType()])(os, codepoint); + } + + template + static RAPIDJSON_FORCEINLINE void EncodeUnsafe(OutputStream& os, unsigned codepoint) { + typedef void (*EncodeFunc)(OutputStream&, unsigned); + static const EncodeFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(EncodeUnsafe) }; + (*f[os.GetType()])(os, codepoint); + } + + template + static RAPIDJSON_FORCEINLINE bool Decode(InputStream& is, unsigned* codepoint) { + typedef bool (*DecodeFunc)(InputStream&, unsigned*); + static const DecodeFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Decode) }; + return (*f[is.GetType()])(is, codepoint); + } + + template + static RAPIDJSON_FORCEINLINE bool Validate(InputStream& is, OutputStream& os) { + typedef bool (*ValidateFunc)(InputStream&, OutputStream&); + static const ValidateFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Validate) }; + return (*f[is.GetType()])(is, os); + } + +#undef RAPIDJSON_ENCODINGS_FUNC +}; + +/////////////////////////////////////////////////////////////////////////////// +// Transcoder + +//! Encoding conversion. +template +struct Transcoder { + //! Take one Unicode codepoint from source encoding, convert it to target encoding and put it to the output stream. + template + static RAPIDJSON_FORCEINLINE bool Transcode(InputStream& is, OutputStream& os) { + unsigned codepoint; + if (!SourceEncoding::Decode(is, &codepoint)) + return false; + TargetEncoding::Encode(os, codepoint); + return true; + } + + template + static RAPIDJSON_FORCEINLINE bool TranscodeUnsafe(InputStream& is, OutputStream& os) { + unsigned codepoint; + if (!SourceEncoding::Decode(is, &codepoint)) + return false; + TargetEncoding::EncodeUnsafe(os, codepoint); + return true; + } + + //! Validate one Unicode codepoint from an encoded stream. + template + static RAPIDJSON_FORCEINLINE bool Validate(InputStream& is, OutputStream& os) { + return Transcode(is, os); // Since source/target encoding is different, must transcode. + } +}; + +// Forward declaration. +template +inline void PutUnsafe(Stream& stream, typename Stream::Ch c); + +//! Specialization of Transcoder with same source and target encoding. +template +struct Transcoder { + template + static RAPIDJSON_FORCEINLINE bool Transcode(InputStream& is, OutputStream& os) { + os.Put(is.Take()); // Just copy one code unit. This semantic is different from primary template class. + return true; + } + + template + static RAPIDJSON_FORCEINLINE bool TranscodeUnsafe(InputStream& is, OutputStream& os) { + PutUnsafe(os, is.Take()); // Just copy one code unit. This semantic is different from primary template class. + return true; + } + + template + static RAPIDJSON_FORCEINLINE bool Validate(InputStream& is, OutputStream& os) { + return Encoding::Validate(is, os); // source/target encoding are the same + } +}; + +RAPIDJSON_NAMESPACE_END + +#if defined(__GNUC__) || (defined(_MSC_VER) && !defined(__clang__)) +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_ENCODINGS_H_ diff --git a/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/error/en.h b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/error/en.h new file mode 100644 index 0000000..2db838b --- /dev/null +++ b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/error/en.h @@ -0,0 +1,74 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_ERROR_EN_H_ +#define RAPIDJSON_ERROR_EN_H_ + +#include "error.h" + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(switch-enum) +RAPIDJSON_DIAG_OFF(covered-switch-default) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Maps error code of parsing into error message. +/*! + \ingroup RAPIDJSON_ERRORS + \param parseErrorCode Error code obtained in parsing. + \return the error message. + \note User can make a copy of this function for localization. + Using switch-case is safer for future modification of error codes. +*/ +inline const RAPIDJSON_ERROR_CHARTYPE* GetParseError_En(ParseErrorCode parseErrorCode) { + switch (parseErrorCode) { + case kParseErrorNone: return RAPIDJSON_ERROR_STRING("No error."); + + case kParseErrorDocumentEmpty: return RAPIDJSON_ERROR_STRING("The document is empty."); + case kParseErrorDocumentRootNotSingular: return RAPIDJSON_ERROR_STRING("The document root must not be followed by other values."); + + case kParseErrorValueInvalid: return RAPIDJSON_ERROR_STRING("Invalid value."); + + case kParseErrorObjectMissName: return RAPIDJSON_ERROR_STRING("Missing a name for object member."); + case kParseErrorObjectMissColon: return RAPIDJSON_ERROR_STRING("Missing a colon after a name of object member."); + case kParseErrorObjectMissCommaOrCurlyBracket: return RAPIDJSON_ERROR_STRING("Missing a comma or '}' after an object member."); + + case kParseErrorArrayMissCommaOrSquareBracket: return RAPIDJSON_ERROR_STRING("Missing a comma or ']' after an array element."); + + case kParseErrorStringUnicodeEscapeInvalidHex: return RAPIDJSON_ERROR_STRING("Incorrect hex digit after \\u escape in string."); + case kParseErrorStringUnicodeSurrogateInvalid: return RAPIDJSON_ERROR_STRING("The surrogate pair in string is invalid."); + case kParseErrorStringEscapeInvalid: return RAPIDJSON_ERROR_STRING("Invalid escape character in string."); + case kParseErrorStringMissQuotationMark: return RAPIDJSON_ERROR_STRING("Missing a closing quotation mark in string."); + case kParseErrorStringInvalidEncoding: return RAPIDJSON_ERROR_STRING("Invalid encoding in string."); + + case kParseErrorNumberTooBig: return RAPIDJSON_ERROR_STRING("Number too big to be stored in double."); + case kParseErrorNumberMissFraction: return RAPIDJSON_ERROR_STRING("Miss fraction part in number."); + case kParseErrorNumberMissExponent: return RAPIDJSON_ERROR_STRING("Miss exponent in number."); + + case kParseErrorTermination: return RAPIDJSON_ERROR_STRING("Terminate parsing due to Handler error."); + case kParseErrorUnspecificSyntaxError: return RAPIDJSON_ERROR_STRING("Unspecific syntax error."); + + default: return RAPIDJSON_ERROR_STRING("Unknown error."); + } +} + +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_ERROR_EN_H_ diff --git a/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/error/error.h b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/error/error.h new file mode 100644 index 0000000..9311d2f --- /dev/null +++ b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/error/error.h @@ -0,0 +1,161 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_ERROR_ERROR_H_ +#define RAPIDJSON_ERROR_ERROR_H_ + +#include "../rapidjson.h" + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +#endif + +/*! \file error.h */ + +/*! \defgroup RAPIDJSON_ERRORS RapidJSON error handling */ + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_ERROR_CHARTYPE + +//! Character type of error messages. +/*! \ingroup RAPIDJSON_ERRORS + The default character type is \c char. + On Windows, user can define this macro as \c TCHAR for supporting both + unicode/non-unicode settings. +*/ +#ifndef RAPIDJSON_ERROR_CHARTYPE +#define RAPIDJSON_ERROR_CHARTYPE char +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_ERROR_STRING + +//! Macro for converting string literial to \ref RAPIDJSON_ERROR_CHARTYPE[]. +/*! \ingroup RAPIDJSON_ERRORS + By default this conversion macro does nothing. + On Windows, user can define this macro as \c _T(x) for supporting both + unicode/non-unicode settings. +*/ +#ifndef RAPIDJSON_ERROR_STRING +#define RAPIDJSON_ERROR_STRING(x) x +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// ParseErrorCode + +//! Error code of parsing. +/*! \ingroup RAPIDJSON_ERRORS + \see GenericReader::Parse, GenericReader::GetParseErrorCode +*/ +enum ParseErrorCode { + kParseErrorNone = 0, //!< No error. + + kParseErrorDocumentEmpty, //!< The document is empty. + kParseErrorDocumentRootNotSingular, //!< The document root must not follow by other values. + + kParseErrorValueInvalid, //!< Invalid value. + + kParseErrorObjectMissName, //!< Missing a name for object member. + kParseErrorObjectMissColon, //!< Missing a colon after a name of object member. + kParseErrorObjectMissCommaOrCurlyBracket, //!< Missing a comma or '}' after an object member. + + kParseErrorArrayMissCommaOrSquareBracket, //!< Missing a comma or ']' after an array element. + + kParseErrorStringUnicodeEscapeInvalidHex, //!< Incorrect hex digit after \\u escape in string. + kParseErrorStringUnicodeSurrogateInvalid, //!< The surrogate pair in string is invalid. + kParseErrorStringEscapeInvalid, //!< Invalid escape character in string. + kParseErrorStringMissQuotationMark, //!< Missing a closing quotation mark in string. + kParseErrorStringInvalidEncoding, //!< Invalid encoding in string. + + kParseErrorNumberTooBig, //!< Number too big to be stored in double. + kParseErrorNumberMissFraction, //!< Miss fraction part in number. + kParseErrorNumberMissExponent, //!< Miss exponent in number. + + kParseErrorTermination, //!< Parsing was terminated. + kParseErrorUnspecificSyntaxError //!< Unspecific syntax error. +}; + +//! Result of parsing (wraps ParseErrorCode) +/*! + \ingroup RAPIDJSON_ERRORS + \code + Document doc; + ParseResult ok = doc.Parse("[42]"); + if (!ok) { + fprintf(stderr, "JSON parse error: %s (%u)", + GetParseError_En(ok.Code()), ok.Offset()); + exit(EXIT_FAILURE); + } + \endcode + \see GenericReader::Parse, GenericDocument::Parse +*/ +struct ParseResult { + //!! Unspecified boolean type + typedef bool (ParseResult::*BooleanType)() const; +public: + //! Default constructor, no error. + ParseResult() : code_(kParseErrorNone), offset_(0) {} + //! Constructor to set an error. + ParseResult(ParseErrorCode code, size_t offset) : code_(code), offset_(offset) {} + + //! Get the error code. + ParseErrorCode Code() const { return code_; } + //! Get the error offset, if \ref IsError(), 0 otherwise. + size_t Offset() const { return offset_; } + + //! Explicit conversion to \c bool, returns \c true, iff !\ref IsError(). + operator BooleanType() const { return !IsError() ? &ParseResult::IsError : NULL; } + //! Whether the result is an error. + bool IsError() const { return code_ != kParseErrorNone; } + + bool operator==(const ParseResult& that) const { return code_ == that.code_; } + bool operator==(ParseErrorCode code) const { return code_ == code; } + friend bool operator==(ParseErrorCode code, const ParseResult & err) { return code == err.code_; } + + bool operator!=(const ParseResult& that) const { return !(*this == that); } + bool operator!=(ParseErrorCode code) const { return !(*this == code); } + friend bool operator!=(ParseErrorCode code, const ParseResult & err) { return err != code; } + + //! Reset error code. + void Clear() { Set(kParseErrorNone); } + //! Update error code and offset. + void Set(ParseErrorCode code, size_t offset = 0) { code_ = code; offset_ = offset; } + +private: + ParseErrorCode code_; + size_t offset_; +}; + +//! Function pointer type of GetParseError(). +/*! \ingroup RAPIDJSON_ERRORS + + This is the prototype for \c GetParseError_X(), where \c X is a locale. + User can dynamically change locale in runtime, e.g.: +\code + GetParseErrorFunc GetParseError = GetParseError_En; // or whatever + const RAPIDJSON_ERROR_CHARTYPE* s = GetParseError(document.GetParseErrorCode()); +\endcode +*/ +typedef const RAPIDJSON_ERROR_CHARTYPE* (*GetParseErrorFunc)(ParseErrorCode); + +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_ERROR_ERROR_H_ diff --git a/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/filereadstream.h b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/filereadstream.h new file mode 100644 index 0000000..f1bfb7d --- /dev/null +++ b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/filereadstream.h @@ -0,0 +1,99 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_FILEREADSTREAM_H_ +#define RAPIDJSON_FILEREADSTREAM_H_ + +#include "stream.h" +#include + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +RAPIDJSON_DIAG_OFF(unreachable-code) +RAPIDJSON_DIAG_OFF(missing-noreturn) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! File byte stream for input using fread(). +/*! + \note implements Stream concept +*/ +class FileReadStream { +public: + typedef char Ch; //!< Character type (byte). + + //! Constructor. + /*! + \param fp File pointer opened for read. + \param buffer user-supplied buffer. + \param bufferSize size of buffer in bytes. Must >=4 bytes. + */ + FileReadStream(std::FILE* fp, char* buffer, size_t bufferSize) : fp_(fp), buffer_(buffer), bufferSize_(bufferSize), bufferLast_(0), current_(buffer_), readCount_(0), count_(0), eof_(false) { + RAPIDJSON_ASSERT(fp_ != 0); + RAPIDJSON_ASSERT(bufferSize >= 4); + Read(); + } + + Ch Peek() const { return *current_; } + Ch Take() { Ch c = *current_; Read(); return c; } + size_t Tell() const { return count_ + static_cast(current_ - buffer_); } + + // Not implemented + void Put(Ch) { RAPIDJSON_ASSERT(false); } + void Flush() { RAPIDJSON_ASSERT(false); } + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + + // For encoding detection only. + const Ch* Peek4() const { + return (current_ + 4 <= bufferLast_) ? current_ : 0; + } + +private: + void Read() { + if (current_ < bufferLast_) + ++current_; + else if (!eof_) { + count_ += readCount_; + readCount_ = std::fread(buffer_, 1, bufferSize_, fp_); + bufferLast_ = buffer_ + readCount_ - 1; + current_ = buffer_; + + if (readCount_ < bufferSize_) { + buffer_[readCount_] = '\0'; + ++bufferLast_; + eof_ = true; + } + } + } + + std::FILE* fp_; + Ch *buffer_; + size_t bufferSize_; + Ch *bufferLast_; + Ch *current_; + size_t readCount_; + size_t count_; //!< Number of characters read + bool eof_; +}; + +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_FILESTREAM_H_ diff --git a/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/filewritestream.h b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/filewritestream.h new file mode 100644 index 0000000..8b48fee --- /dev/null +++ b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/filewritestream.h @@ -0,0 +1,104 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_FILEWRITESTREAM_H_ +#define RAPIDJSON_FILEWRITESTREAM_H_ + +#include "stream.h" +#include + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(unreachable-code) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Wrapper of C file stream for output using fwrite(). +/*! + \note implements Stream concept +*/ +class FileWriteStream { +public: + typedef char Ch; //!< Character type. Only support char. + + FileWriteStream(std::FILE* fp, char* buffer, size_t bufferSize) : fp_(fp), buffer_(buffer), bufferEnd_(buffer + bufferSize), current_(buffer_) { + RAPIDJSON_ASSERT(fp_ != 0); + } + + void Put(char c) { + if (current_ >= bufferEnd_) + Flush(); + + *current_++ = c; + } + + void PutN(char c, size_t n) { + size_t avail = static_cast(bufferEnd_ - current_); + while (n > avail) { + std::memset(current_, c, avail); + current_ += avail; + Flush(); + n -= avail; + avail = static_cast(bufferEnd_ - current_); + } + + if (n > 0) { + std::memset(current_, c, n); + current_ += n; + } + } + + void Flush() { + if (current_ != buffer_) { + size_t result = std::fwrite(buffer_, 1, static_cast(current_ - buffer_), fp_); + if (result < static_cast(current_ - buffer_)) { + // failure deliberately ignored at this time + // added to avoid warn_unused_result build errors + } + current_ = buffer_; + } + } + + // Not implemented + char Peek() const { RAPIDJSON_ASSERT(false); return 0; } + char Take() { RAPIDJSON_ASSERT(false); return 0; } + size_t Tell() const { RAPIDJSON_ASSERT(false); return 0; } + char* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(char*) { RAPIDJSON_ASSERT(false); return 0; } + +private: + // Prohibit copy constructor & assignment operator. + FileWriteStream(const FileWriteStream&); + FileWriteStream& operator=(const FileWriteStream&); + + std::FILE* fp_; + char *buffer_; + char *bufferEnd_; + char *current_; +}; + +//! Implement specialized version of PutN() with memset() for better performance. +template<> +inline void PutN(FileWriteStream& stream, char c, size_t n) { + stream.PutN(c, n); +} + +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_FILESTREAM_H_ diff --git a/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/fwd.h b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/fwd.h new file mode 100644 index 0000000..e8104e8 --- /dev/null +++ b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/fwd.h @@ -0,0 +1,151 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_FWD_H_ +#define RAPIDJSON_FWD_H_ + +#include "rapidjson.h" + +RAPIDJSON_NAMESPACE_BEGIN + +// encodings.h + +template struct UTF8; +template struct UTF16; +template struct UTF16BE; +template struct UTF16LE; +template struct UTF32; +template struct UTF32BE; +template struct UTF32LE; +template struct ASCII; +template struct AutoUTF; + +template +struct Transcoder; + +// allocators.h + +class CrtAllocator; + +template +class MemoryPoolAllocator; + +// stream.h + +template +struct GenericStringStream; + +typedef GenericStringStream > StringStream; + +template +struct GenericInsituStringStream; + +typedef GenericInsituStringStream > InsituStringStream; + +// stringbuffer.h + +template +class GenericStringBuffer; + +typedef GenericStringBuffer, CrtAllocator> StringBuffer; + +// filereadstream.h + +class FileReadStream; + +// filewritestream.h + +class FileWriteStream; + +// memorybuffer.h + +template +struct GenericMemoryBuffer; + +typedef GenericMemoryBuffer MemoryBuffer; + +// memorystream.h + +struct MemoryStream; + +// reader.h + +template +struct BaseReaderHandler; + +template +class GenericReader; + +typedef GenericReader, UTF8, CrtAllocator> Reader; + +// writer.h + +template +class Writer; + +// prettywriter.h + +template +class PrettyWriter; + +// document.h + +template +struct GenericMember; + +template +class GenericMemberIterator; + +template +struct GenericStringRef; + +template +class GenericValue; + +typedef GenericValue, MemoryPoolAllocator > Value; + +template +class GenericDocument; + +typedef GenericDocument, MemoryPoolAllocator, CrtAllocator> Document; + +// pointer.h + +template +class GenericPointer; + +typedef GenericPointer Pointer; + +// schema.h + +template +class IGenericRemoteSchemaDocumentProvider; + +template +class GenericSchemaDocument; + +typedef GenericSchemaDocument SchemaDocument; +typedef IGenericRemoteSchemaDocumentProvider IRemoteSchemaDocumentProvider; + +template < + typename SchemaDocumentType, + typename OutputHandler, + typename StateAllocator> +class GenericSchemaValidator; + +typedef GenericSchemaValidator, void>, CrtAllocator> SchemaValidator; + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_RAPIDJSONFWD_H_ diff --git a/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/internal/biginteger.h b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/internal/biginteger.h new file mode 100644 index 0000000..a31c8a8 --- /dev/null +++ b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/internal/biginteger.h @@ -0,0 +1,290 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_BIGINTEGER_H_ +#define RAPIDJSON_BIGINTEGER_H_ + +#include "../rapidjson.h" + +#if defined(_MSC_VER) && !__INTEL_COMPILER && defined(_M_AMD64) +#include // for _umul128 +#pragma intrinsic(_umul128) +#endif + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +class BigInteger { +public: + typedef uint64_t Type; + + BigInteger(const BigInteger& rhs) : count_(rhs.count_) { + std::memcpy(digits_, rhs.digits_, count_ * sizeof(Type)); + } + + explicit BigInteger(uint64_t u) : count_(1) { + digits_[0] = u; + } + + BigInteger(const char* decimals, size_t length) : count_(1) { + RAPIDJSON_ASSERT(length > 0); + digits_[0] = 0; + size_t i = 0; + const size_t kMaxDigitPerIteration = 19; // 2^64 = 18446744073709551616 > 10^19 + while (length >= kMaxDigitPerIteration) { + AppendDecimal64(decimals + i, decimals + i + kMaxDigitPerIteration); + length -= kMaxDigitPerIteration; + i += kMaxDigitPerIteration; + } + + if (length > 0) + AppendDecimal64(decimals + i, decimals + i + length); + } + + BigInteger& operator=(const BigInteger &rhs) + { + if (this != &rhs) { + count_ = rhs.count_; + std::memcpy(digits_, rhs.digits_, count_ * sizeof(Type)); + } + return *this; + } + + BigInteger& operator=(uint64_t u) { + digits_[0] = u; + count_ = 1; + return *this; + } + + BigInteger& operator+=(uint64_t u) { + Type backup = digits_[0]; + digits_[0] += u; + for (size_t i = 0; i < count_ - 1; i++) { + if (digits_[i] >= backup) + return *this; // no carry + backup = digits_[i + 1]; + digits_[i + 1] += 1; + } + + // Last carry + if (digits_[count_ - 1] < backup) + PushBack(1); + + return *this; + } + + BigInteger& operator*=(uint64_t u) { + if (u == 0) return *this = 0; + if (u == 1) return *this; + if (*this == 1) return *this = u; + + uint64_t k = 0; + for (size_t i = 0; i < count_; i++) { + uint64_t hi; + digits_[i] = MulAdd64(digits_[i], u, k, &hi); + k = hi; + } + + if (k > 0) + PushBack(k); + + return *this; + } + + BigInteger& operator*=(uint32_t u) { + if (u == 0) return *this = 0; + if (u == 1) return *this; + if (*this == 1) return *this = u; + + uint64_t k = 0; + for (size_t i = 0; i < count_; i++) { + const uint64_t c = digits_[i] >> 32; + const uint64_t d = digits_[i] & 0xFFFFFFFF; + const uint64_t uc = u * c; + const uint64_t ud = u * d; + const uint64_t p0 = ud + k; + const uint64_t p1 = uc + (p0 >> 32); + digits_[i] = (p0 & 0xFFFFFFFF) | (p1 << 32); + k = p1 >> 32; + } + + if (k > 0) + PushBack(k); + + return *this; + } + + BigInteger& operator<<=(size_t shift) { + if (IsZero() || shift == 0) return *this; + + size_t offset = shift / kTypeBit; + size_t interShift = shift % kTypeBit; + RAPIDJSON_ASSERT(count_ + offset <= kCapacity); + + if (interShift == 0) { + std::memmove(digits_ + offset, digits_, count_ * sizeof(Type)); + count_ += offset; + } + else { + digits_[count_] = 0; + for (size_t i = count_; i > 0; i--) + digits_[i + offset] = (digits_[i] << interShift) | (digits_[i - 1] >> (kTypeBit - interShift)); + digits_[offset] = digits_[0] << interShift; + count_ += offset; + if (digits_[count_]) + count_++; + } + + std::memset(digits_, 0, offset * sizeof(Type)); + + return *this; + } + + bool operator==(const BigInteger& rhs) const { + return count_ == rhs.count_ && std::memcmp(digits_, rhs.digits_, count_ * sizeof(Type)) == 0; + } + + bool operator==(const Type rhs) const { + return count_ == 1 && digits_[0] == rhs; + } + + BigInteger& MultiplyPow5(unsigned exp) { + static const uint32_t kPow5[12] = { + 5, + 5 * 5, + 5 * 5 * 5, + 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 + }; + if (exp == 0) return *this; + for (; exp >= 27; exp -= 27) *this *= RAPIDJSON_UINT64_C2(0X6765C793, 0XFA10079D); // 5^27 + for (; exp >= 13; exp -= 13) *this *= static_cast(1220703125u); // 5^13 + if (exp > 0) *this *= kPow5[exp - 1]; + return *this; + } + + // Compute absolute difference of this and rhs. + // Assume this != rhs + bool Difference(const BigInteger& rhs, BigInteger* out) const { + int cmp = Compare(rhs); + RAPIDJSON_ASSERT(cmp != 0); + const BigInteger *a, *b; // Makes a > b + bool ret; + if (cmp < 0) { a = &rhs; b = this; ret = true; } + else { a = this; b = &rhs; ret = false; } + + Type borrow = 0; + for (size_t i = 0; i < a->count_; i++) { + Type d = a->digits_[i] - borrow; + if (i < b->count_) + d -= b->digits_[i]; + borrow = (d > a->digits_[i]) ? 1 : 0; + out->digits_[i] = d; + if (d != 0) + out->count_ = i + 1; + } + + return ret; + } + + int Compare(const BigInteger& rhs) const { + if (count_ != rhs.count_) + return count_ < rhs.count_ ? -1 : 1; + + for (size_t i = count_; i-- > 0;) + if (digits_[i] != rhs.digits_[i]) + return digits_[i] < rhs.digits_[i] ? -1 : 1; + + return 0; + } + + size_t GetCount() const { return count_; } + Type GetDigit(size_t index) const { RAPIDJSON_ASSERT(index < count_); return digits_[index]; } + bool IsZero() const { return count_ == 1 && digits_[0] == 0; } + +private: + void AppendDecimal64(const char* begin, const char* end) { + uint64_t u = ParseUint64(begin, end); + if (IsZero()) + *this = u; + else { + unsigned exp = static_cast(end - begin); + (MultiplyPow5(exp) <<= exp) += u; // *this = *this * 10^exp + u + } + } + + void PushBack(Type digit) { + RAPIDJSON_ASSERT(count_ < kCapacity); + digits_[count_++] = digit; + } + + static uint64_t ParseUint64(const char* begin, const char* end) { + uint64_t r = 0; + for (const char* p = begin; p != end; ++p) { + RAPIDJSON_ASSERT(*p >= '0' && *p <= '9'); + r = r * 10u + static_cast(*p - '0'); + } + return r; + } + + // Assume a * b + k < 2^128 + static uint64_t MulAdd64(uint64_t a, uint64_t b, uint64_t k, uint64_t* outHigh) { +#if defined(_MSC_VER) && defined(_M_AMD64) + uint64_t low = _umul128(a, b, outHigh) + k; + if (low < k) + (*outHigh)++; + return low; +#elif (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && defined(__x86_64__) + __extension__ typedef unsigned __int128 uint128; + uint128 p = static_cast(a) * static_cast(b); + p += k; + *outHigh = static_cast(p >> 64); + return static_cast(p); +#else + const uint64_t a0 = a & 0xFFFFFFFF, a1 = a >> 32, b0 = b & 0xFFFFFFFF, b1 = b >> 32; + uint64_t x0 = a0 * b0, x1 = a0 * b1, x2 = a1 * b0, x3 = a1 * b1; + x1 += (x0 >> 32); // can't give carry + x1 += x2; + if (x1 < x2) + x3 += (static_cast(1) << 32); + uint64_t lo = (x1 << 32) + (x0 & 0xFFFFFFFF); + uint64_t hi = x3 + (x1 >> 32); + + lo += k; + if (lo < k) + hi++; + *outHigh = hi; + return lo; +#endif + } + + static const size_t kBitCount = 3328; // 64bit * 54 > 10^1000 + static const size_t kCapacity = kBitCount / sizeof(Type); + static const size_t kTypeBit = sizeof(Type) * 8; + + Type digits_[kCapacity]; + size_t count_; +}; + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_BIGINTEGER_H_ diff --git a/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/internal/diyfp.h b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/internal/diyfp.h new file mode 100644 index 0000000..b6c2cf5 --- /dev/null +++ b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/internal/diyfp.h @@ -0,0 +1,271 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +// This is a C++ header-only implementation of Grisu2 algorithm from the publication: +// Loitsch, Florian. "Printing floating-point numbers quickly and accurately with +// integers." ACM Sigplan Notices 45.6 (2010): 233-243. + +#ifndef RAPIDJSON_DIYFP_H_ +#define RAPIDJSON_DIYFP_H_ + +#include "../rapidjson.h" +#include + +#if defined(_MSC_VER) && defined(_M_AMD64) && !defined(__INTEL_COMPILER) +#include +#pragma intrinsic(_BitScanReverse64) +#pragma intrinsic(_umul128) +#endif + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +#endif + +struct DiyFp { + DiyFp() : f(), e() {} + + DiyFp(uint64_t fp, int exp) : f(fp), e(exp) {} + + explicit DiyFp(double d) { + union { + double d; + uint64_t u64; + } u = { d }; + + int biased_e = static_cast((u.u64 & kDpExponentMask) >> kDpSignificandSize); + uint64_t significand = (u.u64 & kDpSignificandMask); + if (biased_e != 0) { + f = significand + kDpHiddenBit; + e = biased_e - kDpExponentBias; + } + else { + f = significand; + e = kDpMinExponent + 1; + } + } + + DiyFp operator-(const DiyFp& rhs) const { + return DiyFp(f - rhs.f, e); + } + + DiyFp operator*(const DiyFp& rhs) const { +#if defined(_MSC_VER) && defined(_M_AMD64) + uint64_t h; + uint64_t l = _umul128(f, rhs.f, &h); + if (l & (uint64_t(1) << 63)) // rounding + h++; + return DiyFp(h, e + rhs.e + 64); +#elif (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && defined(__x86_64__) + __extension__ typedef unsigned __int128 uint128; + uint128 p = static_cast(f) * static_cast(rhs.f); + uint64_t h = static_cast(p >> 64); + uint64_t l = static_cast(p); + if (l & (uint64_t(1) << 63)) // rounding + h++; + return DiyFp(h, e + rhs.e + 64); +#else + const uint64_t M32 = 0xFFFFFFFF; + const uint64_t a = f >> 32; + const uint64_t b = f & M32; + const uint64_t c = rhs.f >> 32; + const uint64_t d = rhs.f & M32; + const uint64_t ac = a * c; + const uint64_t bc = b * c; + const uint64_t ad = a * d; + const uint64_t bd = b * d; + uint64_t tmp = (bd >> 32) + (ad & M32) + (bc & M32); + tmp += 1U << 31; /// mult_round + return DiyFp(ac + (ad >> 32) + (bc >> 32) + (tmp >> 32), e + rhs.e + 64); +#endif + } + + DiyFp Normalize() const { + RAPIDJSON_ASSERT(f != 0); // https://stackoverflow.com/a/26809183/291737 +#if defined(_MSC_VER) && defined(_M_AMD64) + unsigned long index; + _BitScanReverse64(&index, f); + return DiyFp(f << (63 - index), e - (63 - index)); +#elif defined(__GNUC__) && __GNUC__ >= 4 + int s = __builtin_clzll(f); + return DiyFp(f << s, e - s); +#else + DiyFp res = *this; + while (!(res.f & (static_cast(1) << 63))) { + res.f <<= 1; + res.e--; + } + return res; +#endif + } + + DiyFp NormalizeBoundary() const { + DiyFp res = *this; + while (!(res.f & (kDpHiddenBit << 1))) { + res.f <<= 1; + res.e--; + } + res.f <<= (kDiySignificandSize - kDpSignificandSize - 2); + res.e = res.e - (kDiySignificandSize - kDpSignificandSize - 2); + return res; + } + + void NormalizedBoundaries(DiyFp* minus, DiyFp* plus) const { + DiyFp pl = DiyFp((f << 1) + 1, e - 1).NormalizeBoundary(); + DiyFp mi = (f == kDpHiddenBit) ? DiyFp((f << 2) - 1, e - 2) : DiyFp((f << 1) - 1, e - 1); + mi.f <<= mi.e - pl.e; + mi.e = pl.e; + *plus = pl; + *minus = mi; + } + + double ToDouble() const { + union { + double d; + uint64_t u64; + }u; + RAPIDJSON_ASSERT(f <= kDpHiddenBit + kDpSignificandMask); + if (e < kDpDenormalExponent) { + // Underflow. + return 0.0; + } + if (e >= kDpMaxExponent) { + // Overflow. + return std::numeric_limits::infinity(); + } + const uint64_t be = (e == kDpDenormalExponent && (f & kDpHiddenBit) == 0) ? 0 : + static_cast(e + kDpExponentBias); + u.u64 = (f & kDpSignificandMask) | (be << kDpSignificandSize); + return u.d; + } + + static const int kDiySignificandSize = 64; + static const int kDpSignificandSize = 52; + static const int kDpExponentBias = 0x3FF + kDpSignificandSize; + static const int kDpMaxExponent = 0x7FF - kDpExponentBias; + static const int kDpMinExponent = -kDpExponentBias; + static const int kDpDenormalExponent = -kDpExponentBias + 1; + static const uint64_t kDpExponentMask = RAPIDJSON_UINT64_C2(0x7FF00000, 0x00000000); + static const uint64_t kDpSignificandMask = RAPIDJSON_UINT64_C2(0x000FFFFF, 0xFFFFFFFF); + static const uint64_t kDpHiddenBit = RAPIDJSON_UINT64_C2(0x00100000, 0x00000000); + + uint64_t f; + int e; +}; + +inline DiyFp GetCachedPowerByIndex(size_t index) { + // 10^-348, 10^-340, ..., 10^340 + static const uint64_t kCachedPowers_F[] = { + RAPIDJSON_UINT64_C2(0xfa8fd5a0, 0x081c0288), RAPIDJSON_UINT64_C2(0xbaaee17f, 0xa23ebf76), + RAPIDJSON_UINT64_C2(0x8b16fb20, 0x3055ac76), RAPIDJSON_UINT64_C2(0xcf42894a, 0x5dce35ea), + RAPIDJSON_UINT64_C2(0x9a6bb0aa, 0x55653b2d), RAPIDJSON_UINT64_C2(0xe61acf03, 0x3d1a45df), + RAPIDJSON_UINT64_C2(0xab70fe17, 0xc79ac6ca), RAPIDJSON_UINT64_C2(0xff77b1fc, 0xbebcdc4f), + RAPIDJSON_UINT64_C2(0xbe5691ef, 0x416bd60c), RAPIDJSON_UINT64_C2(0x8dd01fad, 0x907ffc3c), + RAPIDJSON_UINT64_C2(0xd3515c28, 0x31559a83), RAPIDJSON_UINT64_C2(0x9d71ac8f, 0xada6c9b5), + RAPIDJSON_UINT64_C2(0xea9c2277, 0x23ee8bcb), RAPIDJSON_UINT64_C2(0xaecc4991, 0x4078536d), + RAPIDJSON_UINT64_C2(0x823c1279, 0x5db6ce57), RAPIDJSON_UINT64_C2(0xc2109436, 0x4dfb5637), + RAPIDJSON_UINT64_C2(0x9096ea6f, 0x3848984f), RAPIDJSON_UINT64_C2(0xd77485cb, 0x25823ac7), + RAPIDJSON_UINT64_C2(0xa086cfcd, 0x97bf97f4), RAPIDJSON_UINT64_C2(0xef340a98, 0x172aace5), + RAPIDJSON_UINT64_C2(0xb23867fb, 0x2a35b28e), RAPIDJSON_UINT64_C2(0x84c8d4df, 0xd2c63f3b), + RAPIDJSON_UINT64_C2(0xc5dd4427, 0x1ad3cdba), RAPIDJSON_UINT64_C2(0x936b9fce, 0xbb25c996), + RAPIDJSON_UINT64_C2(0xdbac6c24, 0x7d62a584), RAPIDJSON_UINT64_C2(0xa3ab6658, 0x0d5fdaf6), + RAPIDJSON_UINT64_C2(0xf3e2f893, 0xdec3f126), RAPIDJSON_UINT64_C2(0xb5b5ada8, 0xaaff80b8), + RAPIDJSON_UINT64_C2(0x87625f05, 0x6c7c4a8b), RAPIDJSON_UINT64_C2(0xc9bcff60, 0x34c13053), + RAPIDJSON_UINT64_C2(0x964e858c, 0x91ba2655), RAPIDJSON_UINT64_C2(0xdff97724, 0x70297ebd), + RAPIDJSON_UINT64_C2(0xa6dfbd9f, 0xb8e5b88f), RAPIDJSON_UINT64_C2(0xf8a95fcf, 0x88747d94), + RAPIDJSON_UINT64_C2(0xb9447093, 0x8fa89bcf), RAPIDJSON_UINT64_C2(0x8a08f0f8, 0xbf0f156b), + RAPIDJSON_UINT64_C2(0xcdb02555, 0x653131b6), RAPIDJSON_UINT64_C2(0x993fe2c6, 0xd07b7fac), + RAPIDJSON_UINT64_C2(0xe45c10c4, 0x2a2b3b06), RAPIDJSON_UINT64_C2(0xaa242499, 0x697392d3), + RAPIDJSON_UINT64_C2(0xfd87b5f2, 0x8300ca0e), RAPIDJSON_UINT64_C2(0xbce50864, 0x92111aeb), + RAPIDJSON_UINT64_C2(0x8cbccc09, 0x6f5088cc), RAPIDJSON_UINT64_C2(0xd1b71758, 0xe219652c), + RAPIDJSON_UINT64_C2(0x9c400000, 0x00000000), RAPIDJSON_UINT64_C2(0xe8d4a510, 0x00000000), + RAPIDJSON_UINT64_C2(0xad78ebc5, 0xac620000), RAPIDJSON_UINT64_C2(0x813f3978, 0xf8940984), + RAPIDJSON_UINT64_C2(0xc097ce7b, 0xc90715b3), RAPIDJSON_UINT64_C2(0x8f7e32ce, 0x7bea5c70), + RAPIDJSON_UINT64_C2(0xd5d238a4, 0xabe98068), RAPIDJSON_UINT64_C2(0x9f4f2726, 0x179a2245), + RAPIDJSON_UINT64_C2(0xed63a231, 0xd4c4fb27), RAPIDJSON_UINT64_C2(0xb0de6538, 0x8cc8ada8), + RAPIDJSON_UINT64_C2(0x83c7088e, 0x1aab65db), RAPIDJSON_UINT64_C2(0xc45d1df9, 0x42711d9a), + RAPIDJSON_UINT64_C2(0x924d692c, 0xa61be758), RAPIDJSON_UINT64_C2(0xda01ee64, 0x1a708dea), + RAPIDJSON_UINT64_C2(0xa26da399, 0x9aef774a), RAPIDJSON_UINT64_C2(0xf209787b, 0xb47d6b85), + RAPIDJSON_UINT64_C2(0xb454e4a1, 0x79dd1877), RAPIDJSON_UINT64_C2(0x865b8692, 0x5b9bc5c2), + RAPIDJSON_UINT64_C2(0xc83553c5, 0xc8965d3d), RAPIDJSON_UINT64_C2(0x952ab45c, 0xfa97a0b3), + RAPIDJSON_UINT64_C2(0xde469fbd, 0x99a05fe3), RAPIDJSON_UINT64_C2(0xa59bc234, 0xdb398c25), + RAPIDJSON_UINT64_C2(0xf6c69a72, 0xa3989f5c), RAPIDJSON_UINT64_C2(0xb7dcbf53, 0x54e9bece), + RAPIDJSON_UINT64_C2(0x88fcf317, 0xf22241e2), RAPIDJSON_UINT64_C2(0xcc20ce9b, 0xd35c78a5), + RAPIDJSON_UINT64_C2(0x98165af3, 0x7b2153df), RAPIDJSON_UINT64_C2(0xe2a0b5dc, 0x971f303a), + RAPIDJSON_UINT64_C2(0xa8d9d153, 0x5ce3b396), RAPIDJSON_UINT64_C2(0xfb9b7cd9, 0xa4a7443c), + RAPIDJSON_UINT64_C2(0xbb764c4c, 0xa7a44410), RAPIDJSON_UINT64_C2(0x8bab8eef, 0xb6409c1a), + RAPIDJSON_UINT64_C2(0xd01fef10, 0xa657842c), RAPIDJSON_UINT64_C2(0x9b10a4e5, 0xe9913129), + RAPIDJSON_UINT64_C2(0xe7109bfb, 0xa19c0c9d), RAPIDJSON_UINT64_C2(0xac2820d9, 0x623bf429), + RAPIDJSON_UINT64_C2(0x80444b5e, 0x7aa7cf85), RAPIDJSON_UINT64_C2(0xbf21e440, 0x03acdd2d), + RAPIDJSON_UINT64_C2(0x8e679c2f, 0x5e44ff8f), RAPIDJSON_UINT64_C2(0xd433179d, 0x9c8cb841), + RAPIDJSON_UINT64_C2(0x9e19db92, 0xb4e31ba9), RAPIDJSON_UINT64_C2(0xeb96bf6e, 0xbadf77d9), + RAPIDJSON_UINT64_C2(0xaf87023b, 0x9bf0ee6b) + }; + static const int16_t kCachedPowers_E[] = { + -1220, -1193, -1166, -1140, -1113, -1087, -1060, -1034, -1007, -980, + -954, -927, -901, -874, -847, -821, -794, -768, -741, -715, + -688, -661, -635, -608, -582, -555, -529, -502, -475, -449, + -422, -396, -369, -343, -316, -289, -263, -236, -210, -183, + -157, -130, -103, -77, -50, -24, 3, 30, 56, 83, + 109, 136, 162, 189, 216, 242, 269, 295, 322, 348, + 375, 402, 428, 455, 481, 508, 534, 561, 588, 614, + 641, 667, 694, 720, 747, 774, 800, 827, 853, 880, + 907, 933, 960, 986, 1013, 1039, 1066 + }; + RAPIDJSON_ASSERT(index < 87); + return DiyFp(kCachedPowers_F[index], kCachedPowers_E[index]); +} + +inline DiyFp GetCachedPower(int e, int* K) { + + //int k = static_cast(ceil((-61 - e) * 0.30102999566398114)) + 374; + double dk = (-61 - e) * 0.30102999566398114 + 347; // dk must be positive, so can do ceiling in positive + int k = static_cast(dk); + if (dk - k > 0.0) + k++; + + unsigned index = static_cast((k >> 3) + 1); + *K = -(-348 + static_cast(index << 3)); // decimal exponent no need lookup table + + return GetCachedPowerByIndex(index); +} + +inline DiyFp GetCachedPower10(int exp, int *outExp) { + RAPIDJSON_ASSERT(exp >= -348); + unsigned index = static_cast(exp + 348) / 8u; + *outExp = -348 + static_cast(index) * 8; + return GetCachedPowerByIndex(index); +} + +#ifdef __GNUC__ +RAPIDJSON_DIAG_POP +#endif + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +RAPIDJSON_DIAG_OFF(padded) +#endif + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_DIYFP_H_ diff --git a/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/internal/dtoa.h b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/internal/dtoa.h new file mode 100644 index 0000000..bf2e9b2 --- /dev/null +++ b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/internal/dtoa.h @@ -0,0 +1,245 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +// This is a C++ header-only implementation of Grisu2 algorithm from the publication: +// Loitsch, Florian. "Printing floating-point numbers quickly and accurately with +// integers." ACM Sigplan Notices 45.6 (2010): 233-243. + +#ifndef RAPIDJSON_DTOA_ +#define RAPIDJSON_DTOA_ + +#include "itoa.h" // GetDigitsLut() +#include "diyfp.h" +#include "ieee754.h" + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +RAPIDJSON_DIAG_OFF(array-bounds) // some gcc versions generate wrong warnings https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59124 +#endif + +inline void GrisuRound(char* buffer, int len, uint64_t delta, uint64_t rest, uint64_t ten_kappa, uint64_t wp_w) { + while (rest < wp_w && delta - rest >= ten_kappa && + (rest + ten_kappa < wp_w || /// closer + wp_w - rest > rest + ten_kappa - wp_w)) { + buffer[len - 1]--; + rest += ten_kappa; + } +} + +inline int CountDecimalDigit32(uint32_t n) { + // Simple pure C++ implementation was faster than __builtin_clz version in this situation. + if (n < 10) return 1; + if (n < 100) return 2; + if (n < 1000) return 3; + if (n < 10000) return 4; + if (n < 100000) return 5; + if (n < 1000000) return 6; + if (n < 10000000) return 7; + if (n < 100000000) return 8; + // Will not reach 10 digits in DigitGen() + //if (n < 1000000000) return 9; + //return 10; + return 9; +} + +inline void DigitGen(const DiyFp& W, const DiyFp& Mp, uint64_t delta, char* buffer, int* len, int* K) { + static const uint32_t kPow10[] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 }; + const DiyFp one(uint64_t(1) << -Mp.e, Mp.e); + const DiyFp wp_w = Mp - W; + uint32_t p1 = static_cast(Mp.f >> -one.e); + uint64_t p2 = Mp.f & (one.f - 1); + int kappa = CountDecimalDigit32(p1); // kappa in [0, 9] + *len = 0; + + while (kappa > 0) { + uint32_t d = 0; + switch (kappa) { + case 9: d = p1 / 100000000; p1 %= 100000000; break; + case 8: d = p1 / 10000000; p1 %= 10000000; break; + case 7: d = p1 / 1000000; p1 %= 1000000; break; + case 6: d = p1 / 100000; p1 %= 100000; break; + case 5: d = p1 / 10000; p1 %= 10000; break; + case 4: d = p1 / 1000; p1 %= 1000; break; + case 3: d = p1 / 100; p1 %= 100; break; + case 2: d = p1 / 10; p1 %= 10; break; + case 1: d = p1; p1 = 0; break; + default:; + } + if (d || *len) + buffer[(*len)++] = static_cast('0' + static_cast(d)); + kappa--; + uint64_t tmp = (static_cast(p1) << -one.e) + p2; + if (tmp <= delta) { + *K += kappa; + GrisuRound(buffer, *len, delta, tmp, static_cast(kPow10[kappa]) << -one.e, wp_w.f); + return; + } + } + + // kappa = 0 + for (;;) { + p2 *= 10; + delta *= 10; + char d = static_cast(p2 >> -one.e); + if (d || *len) + buffer[(*len)++] = static_cast('0' + d); + p2 &= one.f - 1; + kappa--; + if (p2 < delta) { + *K += kappa; + int index = -kappa; + GrisuRound(buffer, *len, delta, p2, one.f, wp_w.f * (index < 9 ? kPow10[index] : 0)); + return; + } + } +} + +inline void Grisu2(double value, char* buffer, int* length, int* K) { + const DiyFp v(value); + DiyFp w_m, w_p; + v.NormalizedBoundaries(&w_m, &w_p); + + const DiyFp c_mk = GetCachedPower(w_p.e, K); + const DiyFp W = v.Normalize() * c_mk; + DiyFp Wp = w_p * c_mk; + DiyFp Wm = w_m * c_mk; + Wm.f++; + Wp.f--; + DigitGen(W, Wp, Wp.f - Wm.f, buffer, length, K); +} + +inline char* WriteExponent(int K, char* buffer) { + if (K < 0) { + *buffer++ = '-'; + K = -K; + } + + if (K >= 100) { + *buffer++ = static_cast('0' + static_cast(K / 100)); + K %= 100; + const char* d = GetDigitsLut() + K * 2; + *buffer++ = d[0]; + *buffer++ = d[1]; + } + else if (K >= 10) { + const char* d = GetDigitsLut() + K * 2; + *buffer++ = d[0]; + *buffer++ = d[1]; + } + else + *buffer++ = static_cast('0' + static_cast(K)); + + return buffer; +} + +inline char* Prettify(char* buffer, int length, int k, int maxDecimalPlaces) { + const int kk = length + k; // 10^(kk-1) <= v < 10^kk + + if (0 <= k && kk <= 21) { + // 1234e7 -> 12340000000 + for (int i = length; i < kk; i++) + buffer[i] = '0'; + buffer[kk] = '.'; + buffer[kk + 1] = '0'; + return &buffer[kk + 2]; + } + else if (0 < kk && kk <= 21) { + // 1234e-2 -> 12.34 + std::memmove(&buffer[kk + 1], &buffer[kk], static_cast(length - kk)); + buffer[kk] = '.'; + if (0 > k + maxDecimalPlaces) { + // When maxDecimalPlaces = 2, 1.2345 -> 1.23, 1.102 -> 1.1 + // Remove extra trailing zeros (at least one) after truncation. + for (int i = kk + maxDecimalPlaces; i > kk + 1; i--) + if (buffer[i] != '0') + return &buffer[i + 1]; + return &buffer[kk + 2]; // Reserve one zero + } + else + return &buffer[length + 1]; + } + else if (-6 < kk && kk <= 0) { + // 1234e-6 -> 0.001234 + const int offset = 2 - kk; + std::memmove(&buffer[offset], &buffer[0], static_cast(length)); + buffer[0] = '0'; + buffer[1] = '.'; + for (int i = 2; i < offset; i++) + buffer[i] = '0'; + if (length - kk > maxDecimalPlaces) { + // When maxDecimalPlaces = 2, 0.123 -> 0.12, 0.102 -> 0.1 + // Remove extra trailing zeros (at least one) after truncation. + for (int i = maxDecimalPlaces + 1; i > 2; i--) + if (buffer[i] != '0') + return &buffer[i + 1]; + return &buffer[3]; // Reserve one zero + } + else + return &buffer[length + offset]; + } + else if (kk < -maxDecimalPlaces) { + // Truncate to zero + buffer[0] = '0'; + buffer[1] = '.'; + buffer[2] = '0'; + return &buffer[3]; + } + else if (length == 1) { + // 1e30 + buffer[1] = 'e'; + return WriteExponent(kk - 1, &buffer[2]); + } + else { + // 1234e30 -> 1.234e33 + std::memmove(&buffer[2], &buffer[1], static_cast(length - 1)); + buffer[1] = '.'; + buffer[length + 1] = 'e'; + return WriteExponent(kk - 1, &buffer[0 + length + 2]); + } +} + +inline char* dtoa(double value, char* buffer, int maxDecimalPlaces = 324) { + RAPIDJSON_ASSERT(maxDecimalPlaces >= 1); + Double d(value); + if (d.IsZero()) { + if (d.Sign()) + *buffer++ = '-'; // -0.0, Issue #289 + buffer[0] = '0'; + buffer[1] = '.'; + buffer[2] = '0'; + return &buffer[3]; + } + else { + if (value < 0) { + *buffer++ = '-'; + value = -value; + } + int length, K; + Grisu2(value, buffer, &length, &K); + return Prettify(buffer, length, K, maxDecimalPlaces); + } +} + +#ifdef __GNUC__ +RAPIDJSON_DIAG_POP +#endif + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_DTOA_ diff --git a/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/internal/ieee754.h b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/internal/ieee754.h new file mode 100644 index 0000000..c2684ba --- /dev/null +++ b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/internal/ieee754.h @@ -0,0 +1,78 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_IEEE754_ +#define RAPIDJSON_IEEE754_ + +#include "../rapidjson.h" + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +class Double { +public: + Double() {} + Double(double d) : d_(d) {} + Double(uint64_t u) : u_(u) {} + + double Value() const { return d_; } + uint64_t Uint64Value() const { return u_; } + + double NextPositiveDouble() const { + RAPIDJSON_ASSERT(!Sign()); + return Double(u_ + 1).Value(); + } + + bool Sign() const { return (u_ & kSignMask) != 0; } + uint64_t Significand() const { return u_ & kSignificandMask; } + int Exponent() const { return static_cast(((u_ & kExponentMask) >> kSignificandSize) - kExponentBias); } + + bool IsNan() const { return (u_ & kExponentMask) == kExponentMask && Significand() != 0; } + bool IsInf() const { return (u_ & kExponentMask) == kExponentMask && Significand() == 0; } + bool IsNanOrInf() const { return (u_ & kExponentMask) == kExponentMask; } + bool IsNormal() const { return (u_ & kExponentMask) != 0 || Significand() == 0; } + bool IsZero() const { return (u_ & (kExponentMask | kSignificandMask)) == 0; } + + uint64_t IntegerSignificand() const { return IsNormal() ? Significand() | kHiddenBit : Significand(); } + int IntegerExponent() const { return (IsNormal() ? Exponent() : kDenormalExponent) - kSignificandSize; } + uint64_t ToBias() const { return (u_ & kSignMask) ? ~u_ + 1 : u_ | kSignMask; } + + static int EffectiveSignificandSize(int order) { + if (order >= -1021) + return 53; + else if (order <= -1074) + return 0; + else + return order + 1074; + } + +private: + static const int kSignificandSize = 52; + static const int kExponentBias = 0x3FF; + static const int kDenormalExponent = 1 - kExponentBias; + static const uint64_t kSignMask = RAPIDJSON_UINT64_C2(0x80000000, 0x00000000); + static const uint64_t kExponentMask = RAPIDJSON_UINT64_C2(0x7FF00000, 0x00000000); + static const uint64_t kSignificandMask = RAPIDJSON_UINT64_C2(0x000FFFFF, 0xFFFFFFFF); + static const uint64_t kHiddenBit = RAPIDJSON_UINT64_C2(0x00100000, 0x00000000); + + union { + double d_; + uint64_t u_; + }; +}; + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_IEEE754_ diff --git a/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/internal/itoa.h b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/internal/itoa.h new file mode 100644 index 0000000..9b1c45c --- /dev/null +++ b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/internal/itoa.h @@ -0,0 +1,308 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_ITOA_ +#define RAPIDJSON_ITOA_ + +#include "../rapidjson.h" + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +inline const char* GetDigitsLut() { + static const char cDigitsLut[200] = { + '0','0','0','1','0','2','0','3','0','4','0','5','0','6','0','7','0','8','0','9', + '1','0','1','1','1','2','1','3','1','4','1','5','1','6','1','7','1','8','1','9', + '2','0','2','1','2','2','2','3','2','4','2','5','2','6','2','7','2','8','2','9', + '3','0','3','1','3','2','3','3','3','4','3','5','3','6','3','7','3','8','3','9', + '4','0','4','1','4','2','4','3','4','4','4','5','4','6','4','7','4','8','4','9', + '5','0','5','1','5','2','5','3','5','4','5','5','5','6','5','7','5','8','5','9', + '6','0','6','1','6','2','6','3','6','4','6','5','6','6','6','7','6','8','6','9', + '7','0','7','1','7','2','7','3','7','4','7','5','7','6','7','7','7','8','7','9', + '8','0','8','1','8','2','8','3','8','4','8','5','8','6','8','7','8','8','8','9', + '9','0','9','1','9','2','9','3','9','4','9','5','9','6','9','7','9','8','9','9' + }; + return cDigitsLut; +} + +inline char* u32toa(uint32_t value, char* buffer) { + RAPIDJSON_ASSERT(buffer != 0); + + const char* cDigitsLut = GetDigitsLut(); + + if (value < 10000) { + const uint32_t d1 = (value / 100) << 1; + const uint32_t d2 = (value % 100) << 1; + + if (value >= 1000) + *buffer++ = cDigitsLut[d1]; + if (value >= 100) + *buffer++ = cDigitsLut[d1 + 1]; + if (value >= 10) + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + } + else if (value < 100000000) { + // value = bbbbcccc + const uint32_t b = value / 10000; + const uint32_t c = value % 10000; + + const uint32_t d1 = (b / 100) << 1; + const uint32_t d2 = (b % 100) << 1; + + const uint32_t d3 = (c / 100) << 1; + const uint32_t d4 = (c % 100) << 1; + + if (value >= 10000000) + *buffer++ = cDigitsLut[d1]; + if (value >= 1000000) + *buffer++ = cDigitsLut[d1 + 1]; + if (value >= 100000) + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + + *buffer++ = cDigitsLut[d3]; + *buffer++ = cDigitsLut[d3 + 1]; + *buffer++ = cDigitsLut[d4]; + *buffer++ = cDigitsLut[d4 + 1]; + } + else { + // value = aabbbbcccc in decimal + + const uint32_t a = value / 100000000; // 1 to 42 + value %= 100000000; + + if (a >= 10) { + const unsigned i = a << 1; + *buffer++ = cDigitsLut[i]; + *buffer++ = cDigitsLut[i + 1]; + } + else + *buffer++ = static_cast('0' + static_cast(a)); + + const uint32_t b = value / 10000; // 0 to 9999 + const uint32_t c = value % 10000; // 0 to 9999 + + const uint32_t d1 = (b / 100) << 1; + const uint32_t d2 = (b % 100) << 1; + + const uint32_t d3 = (c / 100) << 1; + const uint32_t d4 = (c % 100) << 1; + + *buffer++ = cDigitsLut[d1]; + *buffer++ = cDigitsLut[d1 + 1]; + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + *buffer++ = cDigitsLut[d3]; + *buffer++ = cDigitsLut[d3 + 1]; + *buffer++ = cDigitsLut[d4]; + *buffer++ = cDigitsLut[d4 + 1]; + } + return buffer; +} + +inline char* i32toa(int32_t value, char* buffer) { + RAPIDJSON_ASSERT(buffer != 0); + uint32_t u = static_cast(value); + if (value < 0) { + *buffer++ = '-'; + u = ~u + 1; + } + + return u32toa(u, buffer); +} + +inline char* u64toa(uint64_t value, char* buffer) { + RAPIDJSON_ASSERT(buffer != 0); + const char* cDigitsLut = GetDigitsLut(); + const uint64_t kTen8 = 100000000; + const uint64_t kTen9 = kTen8 * 10; + const uint64_t kTen10 = kTen8 * 100; + const uint64_t kTen11 = kTen8 * 1000; + const uint64_t kTen12 = kTen8 * 10000; + const uint64_t kTen13 = kTen8 * 100000; + const uint64_t kTen14 = kTen8 * 1000000; + const uint64_t kTen15 = kTen8 * 10000000; + const uint64_t kTen16 = kTen8 * kTen8; + + if (value < kTen8) { + uint32_t v = static_cast(value); + if (v < 10000) { + const uint32_t d1 = (v / 100) << 1; + const uint32_t d2 = (v % 100) << 1; + + if (v >= 1000) + *buffer++ = cDigitsLut[d1]; + if (v >= 100) + *buffer++ = cDigitsLut[d1 + 1]; + if (v >= 10) + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + } + else { + // value = bbbbcccc + const uint32_t b = v / 10000; + const uint32_t c = v % 10000; + + const uint32_t d1 = (b / 100) << 1; + const uint32_t d2 = (b % 100) << 1; + + const uint32_t d3 = (c / 100) << 1; + const uint32_t d4 = (c % 100) << 1; + + if (value >= 10000000) + *buffer++ = cDigitsLut[d1]; + if (value >= 1000000) + *buffer++ = cDigitsLut[d1 + 1]; + if (value >= 100000) + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + + *buffer++ = cDigitsLut[d3]; + *buffer++ = cDigitsLut[d3 + 1]; + *buffer++ = cDigitsLut[d4]; + *buffer++ = cDigitsLut[d4 + 1]; + } + } + else if (value < kTen16) { + const uint32_t v0 = static_cast(value / kTen8); + const uint32_t v1 = static_cast(value % kTen8); + + const uint32_t b0 = v0 / 10000; + const uint32_t c0 = v0 % 10000; + + const uint32_t d1 = (b0 / 100) << 1; + const uint32_t d2 = (b0 % 100) << 1; + + const uint32_t d3 = (c0 / 100) << 1; + const uint32_t d4 = (c0 % 100) << 1; + + const uint32_t b1 = v1 / 10000; + const uint32_t c1 = v1 % 10000; + + const uint32_t d5 = (b1 / 100) << 1; + const uint32_t d6 = (b1 % 100) << 1; + + const uint32_t d7 = (c1 / 100) << 1; + const uint32_t d8 = (c1 % 100) << 1; + + if (value >= kTen15) + *buffer++ = cDigitsLut[d1]; + if (value >= kTen14) + *buffer++ = cDigitsLut[d1 + 1]; + if (value >= kTen13) + *buffer++ = cDigitsLut[d2]; + if (value >= kTen12) + *buffer++ = cDigitsLut[d2 + 1]; + if (value >= kTen11) + *buffer++ = cDigitsLut[d3]; + if (value >= kTen10) + *buffer++ = cDigitsLut[d3 + 1]; + if (value >= kTen9) + *buffer++ = cDigitsLut[d4]; + + *buffer++ = cDigitsLut[d4 + 1]; + *buffer++ = cDigitsLut[d5]; + *buffer++ = cDigitsLut[d5 + 1]; + *buffer++ = cDigitsLut[d6]; + *buffer++ = cDigitsLut[d6 + 1]; + *buffer++ = cDigitsLut[d7]; + *buffer++ = cDigitsLut[d7 + 1]; + *buffer++ = cDigitsLut[d8]; + *buffer++ = cDigitsLut[d8 + 1]; + } + else { + const uint32_t a = static_cast(value / kTen16); // 1 to 1844 + value %= kTen16; + + if (a < 10) + *buffer++ = static_cast('0' + static_cast(a)); + else if (a < 100) { + const uint32_t i = a << 1; + *buffer++ = cDigitsLut[i]; + *buffer++ = cDigitsLut[i + 1]; + } + else if (a < 1000) { + *buffer++ = static_cast('0' + static_cast(a / 100)); + + const uint32_t i = (a % 100) << 1; + *buffer++ = cDigitsLut[i]; + *buffer++ = cDigitsLut[i + 1]; + } + else { + const uint32_t i = (a / 100) << 1; + const uint32_t j = (a % 100) << 1; + *buffer++ = cDigitsLut[i]; + *buffer++ = cDigitsLut[i + 1]; + *buffer++ = cDigitsLut[j]; + *buffer++ = cDigitsLut[j + 1]; + } + + const uint32_t v0 = static_cast(value / kTen8); + const uint32_t v1 = static_cast(value % kTen8); + + const uint32_t b0 = v0 / 10000; + const uint32_t c0 = v0 % 10000; + + const uint32_t d1 = (b0 / 100) << 1; + const uint32_t d2 = (b0 % 100) << 1; + + const uint32_t d3 = (c0 / 100) << 1; + const uint32_t d4 = (c0 % 100) << 1; + + const uint32_t b1 = v1 / 10000; + const uint32_t c1 = v1 % 10000; + + const uint32_t d5 = (b1 / 100) << 1; + const uint32_t d6 = (b1 % 100) << 1; + + const uint32_t d7 = (c1 / 100) << 1; + const uint32_t d8 = (c1 % 100) << 1; + + *buffer++ = cDigitsLut[d1]; + *buffer++ = cDigitsLut[d1 + 1]; + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + *buffer++ = cDigitsLut[d3]; + *buffer++ = cDigitsLut[d3 + 1]; + *buffer++ = cDigitsLut[d4]; + *buffer++ = cDigitsLut[d4 + 1]; + *buffer++ = cDigitsLut[d5]; + *buffer++ = cDigitsLut[d5 + 1]; + *buffer++ = cDigitsLut[d6]; + *buffer++ = cDigitsLut[d6 + 1]; + *buffer++ = cDigitsLut[d7]; + *buffer++ = cDigitsLut[d7 + 1]; + *buffer++ = cDigitsLut[d8]; + *buffer++ = cDigitsLut[d8 + 1]; + } + + return buffer; +} + +inline char* i64toa(int64_t value, char* buffer) { + RAPIDJSON_ASSERT(buffer != 0); + uint64_t u = static_cast(value); + if (value < 0) { + *buffer++ = '-'; + u = ~u + 1; + } + + return u64toa(u, buffer); +} + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_ITOA_ diff --git a/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/internal/meta.h b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/internal/meta.h new file mode 100644 index 0000000..d401edf --- /dev/null +++ b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/internal/meta.h @@ -0,0 +1,186 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_INTERNAL_META_H_ +#define RAPIDJSON_INTERNAL_META_H_ + +#include "../rapidjson.h" + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif + +#if defined(_MSC_VER) && !defined(__clang__) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(6334) +#endif + +#if RAPIDJSON_HAS_CXX11_TYPETRAITS +#include +#endif + +//@cond RAPIDJSON_INTERNAL +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +// Helper to wrap/convert arbitrary types to void, useful for arbitrary type matching +template struct Void { typedef void Type; }; + +/////////////////////////////////////////////////////////////////////////////// +// BoolType, TrueType, FalseType +// +template struct BoolType { + static const bool Value = Cond; + typedef BoolType Type; +}; +typedef BoolType TrueType; +typedef BoolType FalseType; + + +/////////////////////////////////////////////////////////////////////////////// +// SelectIf, BoolExpr, NotExpr, AndExpr, OrExpr +// + +template struct SelectIfImpl { template struct Apply { typedef T1 Type; }; }; +template <> struct SelectIfImpl { template struct Apply { typedef T2 Type; }; }; +template struct SelectIfCond : SelectIfImpl::template Apply {}; +template struct SelectIf : SelectIfCond {}; + +template struct AndExprCond : FalseType {}; +template <> struct AndExprCond : TrueType {}; +template struct OrExprCond : TrueType {}; +template <> struct OrExprCond : FalseType {}; + +template struct BoolExpr : SelectIf::Type {}; +template struct NotExpr : SelectIf::Type {}; +template struct AndExpr : AndExprCond::Type {}; +template struct OrExpr : OrExprCond::Type {}; + + +/////////////////////////////////////////////////////////////////////////////// +// AddConst, MaybeAddConst, RemoveConst +template struct AddConst { typedef const T Type; }; +template struct MaybeAddConst : SelectIfCond {}; +template struct RemoveConst { typedef T Type; }; +template struct RemoveConst { typedef T Type; }; + + +/////////////////////////////////////////////////////////////////////////////// +// IsSame, IsConst, IsMoreConst, IsPointer +// +template struct IsSame : FalseType {}; +template struct IsSame : TrueType {}; + +template struct IsConst : FalseType {}; +template struct IsConst : TrueType {}; + +template +struct IsMoreConst + : AndExpr::Type, typename RemoveConst::Type>, + BoolType::Value >= IsConst::Value> >::Type {}; + +template struct IsPointer : FalseType {}; +template struct IsPointer : TrueType {}; + +/////////////////////////////////////////////////////////////////////////////// +// IsBaseOf +// +#if RAPIDJSON_HAS_CXX11_TYPETRAITS + +template struct IsBaseOf + : BoolType< ::std::is_base_of::value> {}; + +#else // simplified version adopted from Boost + +template struct IsBaseOfImpl { + RAPIDJSON_STATIC_ASSERT(sizeof(B) != 0); + RAPIDJSON_STATIC_ASSERT(sizeof(D) != 0); + + typedef char (&Yes)[1]; + typedef char (&No) [2]; + + template + static Yes Check(const D*, T); + static No Check(const B*, int); + + struct Host { + operator const B*() const; + operator const D*(); + }; + + enum { Value = (sizeof(Check(Host(), 0)) == sizeof(Yes)) }; +}; + +template struct IsBaseOf + : OrExpr, BoolExpr > >::Type {}; + +#endif // RAPIDJSON_HAS_CXX11_TYPETRAITS + + +////////////////////////////////////////////////////////////////////////// +// EnableIf / DisableIf +// +template struct EnableIfCond { typedef T Type; }; +template struct EnableIfCond { /* empty */ }; + +template struct DisableIfCond { typedef T Type; }; +template struct DisableIfCond { /* empty */ }; + +template +struct EnableIf : EnableIfCond {}; + +template +struct DisableIf : DisableIfCond {}; + +// SFINAE helpers +struct SfinaeTag {}; +template struct RemoveSfinaeTag; +template struct RemoveSfinaeTag { typedef T Type; }; + +#define RAPIDJSON_REMOVEFPTR_(type) \ + typename ::RAPIDJSON_NAMESPACE::internal::RemoveSfinaeTag \ + < ::RAPIDJSON_NAMESPACE::internal::SfinaeTag&(*) type>::Type + +#define RAPIDJSON_ENABLEIF(cond) \ + typename ::RAPIDJSON_NAMESPACE::internal::EnableIf \ + ::Type * = NULL + +#define RAPIDJSON_DISABLEIF(cond) \ + typename ::RAPIDJSON_NAMESPACE::internal::DisableIf \ + ::Type * = NULL + +#define RAPIDJSON_ENABLEIF_RETURN(cond,returntype) \ + typename ::RAPIDJSON_NAMESPACE::internal::EnableIf \ + ::Type + +#define RAPIDJSON_DISABLEIF_RETURN(cond,returntype) \ + typename ::RAPIDJSON_NAMESPACE::internal::DisableIf \ + ::Type + +} // namespace internal +RAPIDJSON_NAMESPACE_END +//@endcond + +#if defined(_MSC_VER) && !defined(__clang__) +RAPIDJSON_DIAG_POP +#endif + +#ifdef __GNUC__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_INTERNAL_META_H_ diff --git a/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/internal/pow10.h b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/internal/pow10.h new file mode 100644 index 0000000..02f475d --- /dev/null +++ b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/internal/pow10.h @@ -0,0 +1,55 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_POW10_ +#define RAPIDJSON_POW10_ + +#include "../rapidjson.h" + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +//! Computes integer powers of 10 in double (10.0^n). +/*! This function uses lookup table for fast and accurate results. + \param n non-negative exponent. Must <= 308. + \return 10.0^n +*/ +inline double Pow10(int n) { + static const double e[] = { // 1e-0...1e308: 309 * 8 bytes = 2472 bytes + 1e+0, + 1e+1, 1e+2, 1e+3, 1e+4, 1e+5, 1e+6, 1e+7, 1e+8, 1e+9, 1e+10, 1e+11, 1e+12, 1e+13, 1e+14, 1e+15, 1e+16, 1e+17, 1e+18, 1e+19, 1e+20, + 1e+21, 1e+22, 1e+23, 1e+24, 1e+25, 1e+26, 1e+27, 1e+28, 1e+29, 1e+30, 1e+31, 1e+32, 1e+33, 1e+34, 1e+35, 1e+36, 1e+37, 1e+38, 1e+39, 1e+40, + 1e+41, 1e+42, 1e+43, 1e+44, 1e+45, 1e+46, 1e+47, 1e+48, 1e+49, 1e+50, 1e+51, 1e+52, 1e+53, 1e+54, 1e+55, 1e+56, 1e+57, 1e+58, 1e+59, 1e+60, + 1e+61, 1e+62, 1e+63, 1e+64, 1e+65, 1e+66, 1e+67, 1e+68, 1e+69, 1e+70, 1e+71, 1e+72, 1e+73, 1e+74, 1e+75, 1e+76, 1e+77, 1e+78, 1e+79, 1e+80, + 1e+81, 1e+82, 1e+83, 1e+84, 1e+85, 1e+86, 1e+87, 1e+88, 1e+89, 1e+90, 1e+91, 1e+92, 1e+93, 1e+94, 1e+95, 1e+96, 1e+97, 1e+98, 1e+99, 1e+100, + 1e+101,1e+102,1e+103,1e+104,1e+105,1e+106,1e+107,1e+108,1e+109,1e+110,1e+111,1e+112,1e+113,1e+114,1e+115,1e+116,1e+117,1e+118,1e+119,1e+120, + 1e+121,1e+122,1e+123,1e+124,1e+125,1e+126,1e+127,1e+128,1e+129,1e+130,1e+131,1e+132,1e+133,1e+134,1e+135,1e+136,1e+137,1e+138,1e+139,1e+140, + 1e+141,1e+142,1e+143,1e+144,1e+145,1e+146,1e+147,1e+148,1e+149,1e+150,1e+151,1e+152,1e+153,1e+154,1e+155,1e+156,1e+157,1e+158,1e+159,1e+160, + 1e+161,1e+162,1e+163,1e+164,1e+165,1e+166,1e+167,1e+168,1e+169,1e+170,1e+171,1e+172,1e+173,1e+174,1e+175,1e+176,1e+177,1e+178,1e+179,1e+180, + 1e+181,1e+182,1e+183,1e+184,1e+185,1e+186,1e+187,1e+188,1e+189,1e+190,1e+191,1e+192,1e+193,1e+194,1e+195,1e+196,1e+197,1e+198,1e+199,1e+200, + 1e+201,1e+202,1e+203,1e+204,1e+205,1e+206,1e+207,1e+208,1e+209,1e+210,1e+211,1e+212,1e+213,1e+214,1e+215,1e+216,1e+217,1e+218,1e+219,1e+220, + 1e+221,1e+222,1e+223,1e+224,1e+225,1e+226,1e+227,1e+228,1e+229,1e+230,1e+231,1e+232,1e+233,1e+234,1e+235,1e+236,1e+237,1e+238,1e+239,1e+240, + 1e+241,1e+242,1e+243,1e+244,1e+245,1e+246,1e+247,1e+248,1e+249,1e+250,1e+251,1e+252,1e+253,1e+254,1e+255,1e+256,1e+257,1e+258,1e+259,1e+260, + 1e+261,1e+262,1e+263,1e+264,1e+265,1e+266,1e+267,1e+268,1e+269,1e+270,1e+271,1e+272,1e+273,1e+274,1e+275,1e+276,1e+277,1e+278,1e+279,1e+280, + 1e+281,1e+282,1e+283,1e+284,1e+285,1e+286,1e+287,1e+288,1e+289,1e+290,1e+291,1e+292,1e+293,1e+294,1e+295,1e+296,1e+297,1e+298,1e+299,1e+300, + 1e+301,1e+302,1e+303,1e+304,1e+305,1e+306,1e+307,1e+308 + }; + RAPIDJSON_ASSERT(n >= 0 && n <= 308); + return e[n]; +} + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_POW10_ diff --git a/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/internal/regex.h b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/internal/regex.h new file mode 100644 index 0000000..de06718 --- /dev/null +++ b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/internal/regex.h @@ -0,0 +1,732 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_INTERNAL_REGEX_H_ +#define RAPIDJSON_INTERNAL_REGEX_H_ + +#include "../allocators.h" +#include "../stream.h" +#include "stack.h" + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +RAPIDJSON_DIAG_OFF(switch-enum) +RAPIDJSON_DIAG_OFF(implicit-fallthrough) +#elif defined(_MSC_VER) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated +#endif + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#if __GNUC__ >= 7 +RAPIDJSON_DIAG_OFF(implicit-fallthrough) +#endif +#endif + +#ifndef RAPIDJSON_REGEX_VERBOSE +#define RAPIDJSON_REGEX_VERBOSE 0 +#endif + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +/////////////////////////////////////////////////////////////////////////////// +// DecodedStream + +template +class DecodedStream { +public: + DecodedStream(SourceStream& ss) : ss_(ss), codepoint_() { Decode(); } + unsigned Peek() { return codepoint_; } + unsigned Take() { + unsigned c = codepoint_; + if (c) // No further decoding when '\0' + Decode(); + return c; + } + +private: + void Decode() { + if (!Encoding::Decode(ss_, &codepoint_)) + codepoint_ = 0; + } + + SourceStream& ss_; + unsigned codepoint_; +}; + +/////////////////////////////////////////////////////////////////////////////// +// GenericRegex + +static const SizeType kRegexInvalidState = ~SizeType(0); //!< Represents an invalid index in GenericRegex::State::out, out1 +static const SizeType kRegexInvalidRange = ~SizeType(0); + +template +class GenericRegexSearch; + +//! Regular expression engine with subset of ECMAscript grammar. +/*! + Supported regular expression syntax: + - \c ab Concatenation + - \c a|b Alternation + - \c a? Zero or one + - \c a* Zero or more + - \c a+ One or more + - \c a{3} Exactly 3 times + - \c a{3,} At least 3 times + - \c a{3,5} 3 to 5 times + - \c (ab) Grouping + - \c ^a At the beginning + - \c a$ At the end + - \c . Any character + - \c [abc] Character classes + - \c [a-c] Character class range + - \c [a-z0-9_] Character class combination + - \c [^abc] Negated character classes + - \c [^a-c] Negated character class range + - \c [\b] Backspace (U+0008) + - \c \\| \\\\ ... Escape characters + - \c \\f Form feed (U+000C) + - \c \\n Line feed (U+000A) + - \c \\r Carriage return (U+000D) + - \c \\t Tab (U+0009) + - \c \\v Vertical tab (U+000B) + + \note This is a Thompson NFA engine, implemented with reference to + Cox, Russ. "Regular Expression Matching Can Be Simple And Fast (but is slow in Java, Perl, PHP, Python, Ruby,...).", + https://swtch.com/~rsc/regexp/regexp1.html +*/ +template +class GenericRegex { +public: + typedef Encoding EncodingType; + typedef typename Encoding::Ch Ch; + template friend class GenericRegexSearch; + + GenericRegex(const Ch* source, Allocator* allocator = 0) : + states_(allocator, 256), ranges_(allocator, 256), root_(kRegexInvalidState), stateCount_(), rangeCount_(), + anchorBegin_(), anchorEnd_() + { + GenericStringStream ss(source); + DecodedStream, Encoding> ds(ss); + Parse(ds); + } + + ~GenericRegex() {} + + bool IsValid() const { + return root_ != kRegexInvalidState; + } + +private: + enum Operator { + kZeroOrOne, + kZeroOrMore, + kOneOrMore, + kConcatenation, + kAlternation, + kLeftParenthesis + }; + + static const unsigned kAnyCharacterClass = 0xFFFFFFFF; //!< For '.' + static const unsigned kRangeCharacterClass = 0xFFFFFFFE; + static const unsigned kRangeNegationFlag = 0x80000000; + + struct Range { + unsigned start; // + unsigned end; + SizeType next; + }; + + struct State { + SizeType out; //!< Equals to kInvalid for matching state + SizeType out1; //!< Equals to non-kInvalid for split + SizeType rangeStart; + unsigned codepoint; + }; + + struct Frag { + Frag(SizeType s, SizeType o, SizeType m) : start(s), out(o), minIndex(m) {} + SizeType start; + SizeType out; //!< link-list of all output states + SizeType minIndex; + }; + + State& GetState(SizeType index) { + RAPIDJSON_ASSERT(index < stateCount_); + return states_.template Bottom()[index]; + } + + const State& GetState(SizeType index) const { + RAPIDJSON_ASSERT(index < stateCount_); + return states_.template Bottom()[index]; + } + + Range& GetRange(SizeType index) { + RAPIDJSON_ASSERT(index < rangeCount_); + return ranges_.template Bottom()[index]; + } + + const Range& GetRange(SizeType index) const { + RAPIDJSON_ASSERT(index < rangeCount_); + return ranges_.template Bottom()[index]; + } + + template + void Parse(DecodedStream& ds) { + Allocator allocator; + Stack operandStack(&allocator, 256); // Frag + Stack operatorStack(&allocator, 256); // Operator + Stack atomCountStack(&allocator, 256); // unsigned (Atom per parenthesis) + + *atomCountStack.template Push() = 0; + + unsigned codepoint; + while (ds.Peek() != 0) { + switch (codepoint = ds.Take()) { + case '^': + anchorBegin_ = true; + break; + + case '$': + anchorEnd_ = true; + break; + + case '|': + while (!operatorStack.Empty() && *operatorStack.template Top() < kAlternation) + if (!Eval(operandStack, *operatorStack.template Pop(1))) + return; + *operatorStack.template Push() = kAlternation; + *atomCountStack.template Top() = 0; + break; + + case '(': + *operatorStack.template Push() = kLeftParenthesis; + *atomCountStack.template Push() = 0; + break; + + case ')': + while (!operatorStack.Empty() && *operatorStack.template Top() != kLeftParenthesis) + if (!Eval(operandStack, *operatorStack.template Pop(1))) + return; + if (operatorStack.Empty()) + return; + operatorStack.template Pop(1); + atomCountStack.template Pop(1); + ImplicitConcatenation(atomCountStack, operatorStack); + break; + + case '?': + if (!Eval(operandStack, kZeroOrOne)) + return; + break; + + case '*': + if (!Eval(operandStack, kZeroOrMore)) + return; + break; + + case '+': + if (!Eval(operandStack, kOneOrMore)) + return; + break; + + case '{': + { + unsigned n, m; + if (!ParseUnsigned(ds, &n)) + return; + + if (ds.Peek() == ',') { + ds.Take(); + if (ds.Peek() == '}') + m = kInfinityQuantifier; + else if (!ParseUnsigned(ds, &m) || m < n) + return; + } + else + m = n; + + if (!EvalQuantifier(operandStack, n, m) || ds.Peek() != '}') + return; + ds.Take(); + } + break; + + case '.': + PushOperand(operandStack, kAnyCharacterClass); + ImplicitConcatenation(atomCountStack, operatorStack); + break; + + case '[': + { + SizeType range; + if (!ParseRange(ds, &range)) + return; + SizeType s = NewState(kRegexInvalidState, kRegexInvalidState, kRangeCharacterClass); + GetState(s).rangeStart = range; + *operandStack.template Push() = Frag(s, s, s); + } + ImplicitConcatenation(atomCountStack, operatorStack); + break; + + case '\\': // Escape character + if (!CharacterEscape(ds, &codepoint)) + return; // Unsupported escape character + // fall through to default + + default: // Pattern character + PushOperand(operandStack, codepoint); + ImplicitConcatenation(atomCountStack, operatorStack); + } + } + + while (!operatorStack.Empty()) + if (!Eval(operandStack, *operatorStack.template Pop(1))) + return; + + // Link the operand to matching state. + if (operandStack.GetSize() == sizeof(Frag)) { + Frag* e = operandStack.template Pop(1); + Patch(e->out, NewState(kRegexInvalidState, kRegexInvalidState, 0)); + root_ = e->start; + +#if RAPIDJSON_REGEX_VERBOSE + printf("root: %d\n", root_); + for (SizeType i = 0; i < stateCount_ ; i++) { + State& s = GetState(i); + printf("[%2d] out: %2d out1: %2d c: '%c'\n", i, s.out, s.out1, (char)s.codepoint); + } + printf("\n"); +#endif + } + } + + SizeType NewState(SizeType out, SizeType out1, unsigned codepoint) { + State* s = states_.template Push(); + s->out = out; + s->out1 = out1; + s->codepoint = codepoint; + s->rangeStart = kRegexInvalidRange; + return stateCount_++; + } + + void PushOperand(Stack& operandStack, unsigned codepoint) { + SizeType s = NewState(kRegexInvalidState, kRegexInvalidState, codepoint); + *operandStack.template Push() = Frag(s, s, s); + } + + void ImplicitConcatenation(Stack& atomCountStack, Stack& operatorStack) { + if (*atomCountStack.template Top()) + *operatorStack.template Push() = kConcatenation; + (*atomCountStack.template Top())++; + } + + SizeType Append(SizeType l1, SizeType l2) { + SizeType old = l1; + while (GetState(l1).out != kRegexInvalidState) + l1 = GetState(l1).out; + GetState(l1).out = l2; + return old; + } + + void Patch(SizeType l, SizeType s) { + for (SizeType next; l != kRegexInvalidState; l = next) { + next = GetState(l).out; + GetState(l).out = s; + } + } + + bool Eval(Stack& operandStack, Operator op) { + switch (op) { + case kConcatenation: + RAPIDJSON_ASSERT(operandStack.GetSize() >= sizeof(Frag) * 2); + { + Frag e2 = *operandStack.template Pop(1); + Frag e1 = *operandStack.template Pop(1); + Patch(e1.out, e2.start); + *operandStack.template Push() = Frag(e1.start, e2.out, Min(e1.minIndex, e2.minIndex)); + } + return true; + + case kAlternation: + if (operandStack.GetSize() >= sizeof(Frag) * 2) { + Frag e2 = *operandStack.template Pop(1); + Frag e1 = *operandStack.template Pop(1); + SizeType s = NewState(e1.start, e2.start, 0); + *operandStack.template Push() = Frag(s, Append(e1.out, e2.out), Min(e1.minIndex, e2.minIndex)); + return true; + } + return false; + + case kZeroOrOne: + if (operandStack.GetSize() >= sizeof(Frag)) { + Frag e = *operandStack.template Pop(1); + SizeType s = NewState(kRegexInvalidState, e.start, 0); + *operandStack.template Push() = Frag(s, Append(e.out, s), e.minIndex); + return true; + } + return false; + + case kZeroOrMore: + if (operandStack.GetSize() >= sizeof(Frag)) { + Frag e = *operandStack.template Pop(1); + SizeType s = NewState(kRegexInvalidState, e.start, 0); + Patch(e.out, s); + *operandStack.template Push() = Frag(s, s, e.minIndex); + return true; + } + return false; + + default: + RAPIDJSON_ASSERT(op == kOneOrMore); + if (operandStack.GetSize() >= sizeof(Frag)) { + Frag e = *operandStack.template Pop(1); + SizeType s = NewState(kRegexInvalidState, e.start, 0); + Patch(e.out, s); + *operandStack.template Push() = Frag(e.start, s, e.minIndex); + return true; + } + return false; + } + } + + bool EvalQuantifier(Stack& operandStack, unsigned n, unsigned m) { + RAPIDJSON_ASSERT(n <= m); + RAPIDJSON_ASSERT(operandStack.GetSize() >= sizeof(Frag)); + + if (n == 0) { + if (m == 0) // a{0} not support + return false; + else if (m == kInfinityQuantifier) + Eval(operandStack, kZeroOrMore); // a{0,} -> a* + else { + Eval(operandStack, kZeroOrOne); // a{0,5} -> a? + for (unsigned i = 0; i < m - 1; i++) + CloneTopOperand(operandStack); // a{0,5} -> a? a? a? a? a? + for (unsigned i = 0; i < m - 1; i++) + Eval(operandStack, kConcatenation); // a{0,5} -> a?a?a?a?a? + } + return true; + } + + for (unsigned i = 0; i < n - 1; i++) // a{3} -> a a a + CloneTopOperand(operandStack); + + if (m == kInfinityQuantifier) + Eval(operandStack, kOneOrMore); // a{3,} -> a a a+ + else if (m > n) { + CloneTopOperand(operandStack); // a{3,5} -> a a a a + Eval(operandStack, kZeroOrOne); // a{3,5} -> a a a a? + for (unsigned i = n; i < m - 1; i++) + CloneTopOperand(operandStack); // a{3,5} -> a a a a? a? + for (unsigned i = n; i < m; i++) + Eval(operandStack, kConcatenation); // a{3,5} -> a a aa?a? + } + + for (unsigned i = 0; i < n - 1; i++) + Eval(operandStack, kConcatenation); // a{3} -> aaa, a{3,} -> aaa+, a{3.5} -> aaaa?a? + + return true; + } + + static SizeType Min(SizeType a, SizeType b) { return a < b ? a : b; } + + void CloneTopOperand(Stack& operandStack) { + const Frag src = *operandStack.template Top(); // Copy constructor to prevent invalidation + SizeType count = stateCount_ - src.minIndex; // Assumes top operand contains states in [src->minIndex, stateCount_) + State* s = states_.template Push(count); + memcpy(s, &GetState(src.minIndex), count * sizeof(State)); + for (SizeType j = 0; j < count; j++) { + if (s[j].out != kRegexInvalidState) + s[j].out += count; + if (s[j].out1 != kRegexInvalidState) + s[j].out1 += count; + } + *operandStack.template Push() = Frag(src.start + count, src.out + count, src.minIndex + count); + stateCount_ += count; + } + + template + bool ParseUnsigned(DecodedStream& ds, unsigned* u) { + unsigned r = 0; + if (ds.Peek() < '0' || ds.Peek() > '9') + return false; + while (ds.Peek() >= '0' && ds.Peek() <= '9') { + if (r >= 429496729 && ds.Peek() > '5') // 2^32 - 1 = 4294967295 + return false; // overflow + r = r * 10 + (ds.Take() - '0'); + } + *u = r; + return true; + } + + template + bool ParseRange(DecodedStream& ds, SizeType* range) { + bool isBegin = true; + bool negate = false; + int step = 0; + SizeType start = kRegexInvalidRange; + SizeType current = kRegexInvalidRange; + unsigned codepoint; + while ((codepoint = ds.Take()) != 0) { + if (isBegin) { + isBegin = false; + if (codepoint == '^') { + negate = true; + continue; + } + } + + switch (codepoint) { + case ']': + if (start == kRegexInvalidRange) + return false; // Error: nothing inside [] + if (step == 2) { // Add trailing '-' + SizeType r = NewRange('-'); + RAPIDJSON_ASSERT(current != kRegexInvalidRange); + GetRange(current).next = r; + } + if (negate) + GetRange(start).start |= kRangeNegationFlag; + *range = start; + return true; + + case '\\': + if (ds.Peek() == 'b') { + ds.Take(); + codepoint = 0x0008; // Escape backspace character + } + else if (!CharacterEscape(ds, &codepoint)) + return false; + // fall through to default + + default: + switch (step) { + case 1: + if (codepoint == '-') { + step++; + break; + } + // fall through to step 0 for other characters + + case 0: + { + SizeType r = NewRange(codepoint); + if (current != kRegexInvalidRange) + GetRange(current).next = r; + if (start == kRegexInvalidRange) + start = r; + current = r; + } + step = 1; + break; + + default: + RAPIDJSON_ASSERT(step == 2); + GetRange(current).end = codepoint; + step = 0; + } + } + } + return false; + } + + SizeType NewRange(unsigned codepoint) { + Range* r = ranges_.template Push(); + r->start = r->end = codepoint; + r->next = kRegexInvalidRange; + return rangeCount_++; + } + + template + bool CharacterEscape(DecodedStream& ds, unsigned* escapedCodepoint) { + unsigned codepoint; + switch (codepoint = ds.Take()) { + case '^': + case '$': + case '|': + case '(': + case ')': + case '?': + case '*': + case '+': + case '.': + case '[': + case ']': + case '{': + case '}': + case '\\': + *escapedCodepoint = codepoint; return true; + case 'f': *escapedCodepoint = 0x000C; return true; + case 'n': *escapedCodepoint = 0x000A; return true; + case 'r': *escapedCodepoint = 0x000D; return true; + case 't': *escapedCodepoint = 0x0009; return true; + case 'v': *escapedCodepoint = 0x000B; return true; + default: + return false; // Unsupported escape character + } + } + + Stack states_; + Stack ranges_; + SizeType root_; + SizeType stateCount_; + SizeType rangeCount_; + + static const unsigned kInfinityQuantifier = ~0u; + + // For SearchWithAnchoring() + bool anchorBegin_; + bool anchorEnd_; +}; + +template +class GenericRegexSearch { +public: + typedef typename RegexType::EncodingType Encoding; + typedef typename Encoding::Ch Ch; + + GenericRegexSearch(const RegexType& regex, Allocator* allocator = 0) : + regex_(regex), allocator_(allocator), ownAllocator_(0), + state0_(allocator, 0), state1_(allocator, 0), stateSet_() + { + RAPIDJSON_ASSERT(regex_.IsValid()); + if (!allocator_) + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator)(); + stateSet_ = static_cast(allocator_->Malloc(GetStateSetSize())); + state0_.template Reserve(regex_.stateCount_); + state1_.template Reserve(regex_.stateCount_); + } + + ~GenericRegexSearch() { + Allocator::Free(stateSet_); + RAPIDJSON_DELETE(ownAllocator_); + } + + template + bool Match(InputStream& is) { + return SearchWithAnchoring(is, true, true); + } + + bool Match(const Ch* s) { + GenericStringStream is(s); + return Match(is); + } + + template + bool Search(InputStream& is) { + return SearchWithAnchoring(is, regex_.anchorBegin_, regex_.anchorEnd_); + } + + bool Search(const Ch* s) { + GenericStringStream is(s); + return Search(is); + } + +private: + typedef typename RegexType::State State; + typedef typename RegexType::Range Range; + + template + bool SearchWithAnchoring(InputStream& is, bool anchorBegin, bool anchorEnd) { + DecodedStream ds(is); + + state0_.Clear(); + Stack *current = &state0_, *next = &state1_; + const size_t stateSetSize = GetStateSetSize(); + std::memset(stateSet_, 0, stateSetSize); + + bool matched = AddState(*current, regex_.root_); + unsigned codepoint; + while (!current->Empty() && (codepoint = ds.Take()) != 0) { + std::memset(stateSet_, 0, stateSetSize); + next->Clear(); + matched = false; + for (const SizeType* s = current->template Bottom(); s != current->template End(); ++s) { + const State& sr = regex_.GetState(*s); + if (sr.codepoint == codepoint || + sr.codepoint == RegexType::kAnyCharacterClass || + (sr.codepoint == RegexType::kRangeCharacterClass && MatchRange(sr.rangeStart, codepoint))) + { + matched = AddState(*next, sr.out) || matched; + if (!anchorEnd && matched) + return true; + } + if (!anchorBegin) + AddState(*next, regex_.root_); + } + internal::Swap(current, next); + } + + return matched; + } + + size_t GetStateSetSize() const { + return (regex_.stateCount_ + 31) / 32 * 4; + } + + // Return whether the added states is a match state + bool AddState(Stack& l, SizeType index) { + RAPIDJSON_ASSERT(index != kRegexInvalidState); + + const State& s = regex_.GetState(index); + if (s.out1 != kRegexInvalidState) { // Split + bool matched = AddState(l, s.out); + return AddState(l, s.out1) || matched; + } + else if (!(stateSet_[index >> 5] & (1u << (index & 31)))) { + stateSet_[index >> 5] |= (1u << (index & 31)); + *l.template PushUnsafe() = index; + } + return s.out == kRegexInvalidState; // by using PushUnsafe() above, we can ensure s is not validated due to reallocation. + } + + bool MatchRange(SizeType rangeIndex, unsigned codepoint) const { + bool yes = (regex_.GetRange(rangeIndex).start & RegexType::kRangeNegationFlag) == 0; + while (rangeIndex != kRegexInvalidRange) { + const Range& r = regex_.GetRange(rangeIndex); + if (codepoint >= (r.start & ~RegexType::kRangeNegationFlag) && codepoint <= r.end) + return yes; + rangeIndex = r.next; + } + return !yes; + } + + const RegexType& regex_; + Allocator* allocator_; + Allocator* ownAllocator_; + Stack state0_; + Stack state1_; + uint32_t* stateSet_; +}; + +typedef GenericRegex > Regex; +typedef GenericRegexSearch RegexSearch; + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#ifdef __GNUC__ +RAPIDJSON_DIAG_POP +#endif + +#if defined(__clang__) || defined(_MSC_VER) +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_INTERNAL_REGEX_H_ diff --git a/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/internal/stack.h b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/internal/stack.h new file mode 100644 index 0000000..89558d0 --- /dev/null +++ b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/internal/stack.h @@ -0,0 +1,231 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_INTERNAL_STACK_H_ +#define RAPIDJSON_INTERNAL_STACK_H_ + +#include "../allocators.h" +#include "swap.h" + +#if defined(__clang__) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(c++98-compat) +#endif + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +/////////////////////////////////////////////////////////////////////////////// +// Stack + +//! A type-unsafe stack for storing different types of data. +/*! \tparam Allocator Allocator for allocating stack memory. +*/ +template +class Stack { +public: + // Optimization note: Do not allocate memory for stack_ in constructor. + // Do it lazily when first Push() -> Expand() -> Resize(). + Stack(Allocator* allocator, size_t stackCapacity) : allocator_(allocator), ownAllocator_(0), stack_(0), stackTop_(0), stackEnd_(0), initialCapacity_(stackCapacity) { + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + Stack(Stack&& rhs) + : allocator_(rhs.allocator_), + ownAllocator_(rhs.ownAllocator_), + stack_(rhs.stack_), + stackTop_(rhs.stackTop_), + stackEnd_(rhs.stackEnd_), + initialCapacity_(rhs.initialCapacity_) + { + rhs.allocator_ = 0; + rhs.ownAllocator_ = 0; + rhs.stack_ = 0; + rhs.stackTop_ = 0; + rhs.stackEnd_ = 0; + rhs.initialCapacity_ = 0; + } +#endif + + ~Stack() { + Destroy(); + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + Stack& operator=(Stack&& rhs) { + if (&rhs != this) + { + Destroy(); + + allocator_ = rhs.allocator_; + ownAllocator_ = rhs.ownAllocator_; + stack_ = rhs.stack_; + stackTop_ = rhs.stackTop_; + stackEnd_ = rhs.stackEnd_; + initialCapacity_ = rhs.initialCapacity_; + + rhs.allocator_ = 0; + rhs.ownAllocator_ = 0; + rhs.stack_ = 0; + rhs.stackTop_ = 0; + rhs.stackEnd_ = 0; + rhs.initialCapacity_ = 0; + } + return *this; + } +#endif + + void Swap(Stack& rhs) RAPIDJSON_NOEXCEPT { + internal::Swap(allocator_, rhs.allocator_); + internal::Swap(ownAllocator_, rhs.ownAllocator_); + internal::Swap(stack_, rhs.stack_); + internal::Swap(stackTop_, rhs.stackTop_); + internal::Swap(stackEnd_, rhs.stackEnd_); + internal::Swap(initialCapacity_, rhs.initialCapacity_); + } + + void Clear() { stackTop_ = stack_; } + + void ShrinkToFit() { + if (Empty()) { + // If the stack is empty, completely deallocate the memory. + Allocator::Free(stack_); // NOLINT (+clang-analyzer-unix.Malloc) + stack_ = 0; + stackTop_ = 0; + stackEnd_ = 0; + } + else + Resize(GetSize()); + } + + // Optimization note: try to minimize the size of this function for force inline. + // Expansion is run very infrequently, so it is moved to another (probably non-inline) function. + template + RAPIDJSON_FORCEINLINE void Reserve(size_t count = 1) { + // Expand the stack if needed + if (RAPIDJSON_UNLIKELY(stackTop_ + sizeof(T) * count > stackEnd_)) + Expand(count); + } + + template + RAPIDJSON_FORCEINLINE T* Push(size_t count = 1) { + Reserve(count); + return PushUnsafe(count); + } + + template + RAPIDJSON_FORCEINLINE T* PushUnsafe(size_t count = 1) { + RAPIDJSON_ASSERT(stackTop_); + RAPIDJSON_ASSERT(stackTop_ + sizeof(T) * count <= stackEnd_); + T* ret = reinterpret_cast(stackTop_); + stackTop_ += sizeof(T) * count; + return ret; + } + + template + T* Pop(size_t count) { + RAPIDJSON_ASSERT(GetSize() >= count * sizeof(T)); + stackTop_ -= count * sizeof(T); + return reinterpret_cast(stackTop_); + } + + template + T* Top() { + RAPIDJSON_ASSERT(GetSize() >= sizeof(T)); + return reinterpret_cast(stackTop_ - sizeof(T)); + } + + template + const T* Top() const { + RAPIDJSON_ASSERT(GetSize() >= sizeof(T)); + return reinterpret_cast(stackTop_ - sizeof(T)); + } + + template + T* End() { return reinterpret_cast(stackTop_); } + + template + const T* End() const { return reinterpret_cast(stackTop_); } + + template + T* Bottom() { return reinterpret_cast(stack_); } + + template + const T* Bottom() const { return reinterpret_cast(stack_); } + + bool HasAllocator() const { + return allocator_ != 0; + } + + Allocator& GetAllocator() { + RAPIDJSON_ASSERT(allocator_); + return *allocator_; + } + + bool Empty() const { return stackTop_ == stack_; } + size_t GetSize() const { return static_cast(stackTop_ - stack_); } + size_t GetCapacity() const { return static_cast(stackEnd_ - stack_); } + +private: + template + void Expand(size_t count) { + // Only expand the capacity if the current stack exists. Otherwise just create a stack with initial capacity. + size_t newCapacity; + if (stack_ == 0) { + if (!allocator_) + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator)(); + newCapacity = initialCapacity_; + } else { + newCapacity = GetCapacity(); + newCapacity += (newCapacity + 1) / 2; + } + size_t newSize = GetSize() + sizeof(T) * count; + if (newCapacity < newSize) + newCapacity = newSize; + + Resize(newCapacity); + } + + void Resize(size_t newCapacity) { + const size_t size = GetSize(); // Backup the current size + stack_ = static_cast(allocator_->Realloc(stack_, GetCapacity(), newCapacity)); + stackTop_ = stack_ + size; + stackEnd_ = stack_ + newCapacity; + } + + void Destroy() { + Allocator::Free(stack_); + RAPIDJSON_DELETE(ownAllocator_); // Only delete if it is owned by the stack + } + + // Prohibit copy constructor & assignment operator. + Stack(const Stack&); + Stack& operator=(const Stack&); + + Allocator* allocator_; + Allocator* ownAllocator_; + char *stack_; + char *stackTop_; + char *stackEnd_; + size_t initialCapacity_; +}; + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#if defined(__clang__) +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_STACK_H_ diff --git a/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/internal/strfunc.h b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/internal/strfunc.h new file mode 100644 index 0000000..226439a --- /dev/null +++ b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/internal/strfunc.h @@ -0,0 +1,69 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_INTERNAL_STRFUNC_H_ +#define RAPIDJSON_INTERNAL_STRFUNC_H_ + +#include "../stream.h" +#include + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +//! Custom strlen() which works on different character types. +/*! \tparam Ch Character type (e.g. char, wchar_t, short) + \param s Null-terminated input string. + \return Number of characters in the string. + \note This has the same semantics as strlen(), the return value is not number of Unicode codepoints. +*/ +template +inline SizeType StrLen(const Ch* s) { + RAPIDJSON_ASSERT(s != 0); + const Ch* p = s; + while (*p) ++p; + return SizeType(p - s); +} + +template <> +inline SizeType StrLen(const char* s) { + return SizeType(std::strlen(s)); +} + +template <> +inline SizeType StrLen(const wchar_t* s) { + return SizeType(std::wcslen(s)); +} + +//! Returns number of code points in a encoded string. +template +bool CountStringCodePoint(const typename Encoding::Ch* s, SizeType length, SizeType* outCount) { + RAPIDJSON_ASSERT(s != 0); + RAPIDJSON_ASSERT(outCount != 0); + GenericStringStream is(s); + const typename Encoding::Ch* end = s + length; + SizeType count = 0; + while (is.src_ < end) { + unsigned codepoint; + if (!Encoding::Decode(is, &codepoint)) + return false; + count++; + } + *outCount = count; + return true; +} + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_INTERNAL_STRFUNC_H_ diff --git a/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/internal/strtod.h b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/internal/strtod.h new file mode 100644 index 0000000..dfca22b --- /dev/null +++ b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/internal/strtod.h @@ -0,0 +1,290 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_STRTOD_ +#define RAPIDJSON_STRTOD_ + +#include "ieee754.h" +#include "biginteger.h" +#include "diyfp.h" +#include "pow10.h" +#include +#include + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +inline double FastPath(double significand, int exp) { + if (exp < -308) + return 0.0; + else if (exp >= 0) + return significand * internal::Pow10(exp); + else + return significand / internal::Pow10(-exp); +} + +inline double StrtodNormalPrecision(double d, int p) { + if (p < -308) { + // Prevent expSum < -308, making Pow10(p) = 0 + d = FastPath(d, -308); + d = FastPath(d, p + 308); + } + else + d = FastPath(d, p); + return d; +} + +template +inline T Min3(T a, T b, T c) { + T m = a; + if (m > b) m = b; + if (m > c) m = c; + return m; +} + +inline int CheckWithinHalfULP(double b, const BigInteger& d, int dExp) { + const Double db(b); + const uint64_t bInt = db.IntegerSignificand(); + const int bExp = db.IntegerExponent(); + const int hExp = bExp - 1; + + int dS_Exp2 = 0, dS_Exp5 = 0, bS_Exp2 = 0, bS_Exp5 = 0, hS_Exp2 = 0, hS_Exp5 = 0; + + // Adjust for decimal exponent + if (dExp >= 0) { + dS_Exp2 += dExp; + dS_Exp5 += dExp; + } + else { + bS_Exp2 -= dExp; + bS_Exp5 -= dExp; + hS_Exp2 -= dExp; + hS_Exp5 -= dExp; + } + + // Adjust for binary exponent + if (bExp >= 0) + bS_Exp2 += bExp; + else { + dS_Exp2 -= bExp; + hS_Exp2 -= bExp; + } + + // Adjust for half ulp exponent + if (hExp >= 0) + hS_Exp2 += hExp; + else { + dS_Exp2 -= hExp; + bS_Exp2 -= hExp; + } + + // Remove common power of two factor from all three scaled values + int common_Exp2 = Min3(dS_Exp2, bS_Exp2, hS_Exp2); + dS_Exp2 -= common_Exp2; + bS_Exp2 -= common_Exp2; + hS_Exp2 -= common_Exp2; + + BigInteger dS = d; + dS.MultiplyPow5(static_cast(dS_Exp5)) <<= static_cast(dS_Exp2); + + BigInteger bS(bInt); + bS.MultiplyPow5(static_cast(bS_Exp5)) <<= static_cast(bS_Exp2); + + BigInteger hS(1); + hS.MultiplyPow5(static_cast(hS_Exp5)) <<= static_cast(hS_Exp2); + + BigInteger delta(0); + dS.Difference(bS, &delta); + + return delta.Compare(hS); +} + +inline bool StrtodFast(double d, int p, double* result) { + // Use fast path for string-to-double conversion if possible + // see http://www.exploringbinary.com/fast-path-decimal-to-floating-point-conversion/ + if (p > 22 && p < 22 + 16) { + // Fast Path Cases In Disguise + d *= internal::Pow10(p - 22); + p = 22; + } + + if (p >= -22 && p <= 22 && d <= 9007199254740991.0) { // 2^53 - 1 + *result = FastPath(d, p); + return true; + } + else + return false; +} + +// Compute an approximation and see if it is within 1/2 ULP +inline bool StrtodDiyFp(const char* decimals, int dLen, int dExp, double* result) { + uint64_t significand = 0; + int i = 0; // 2^64 - 1 = 18446744073709551615, 1844674407370955161 = 0x1999999999999999 + for (; i < dLen; i++) { + if (significand > RAPIDJSON_UINT64_C2(0x19999999, 0x99999999) || + (significand == RAPIDJSON_UINT64_C2(0x19999999, 0x99999999) && decimals[i] > '5')) + break; + significand = significand * 10u + static_cast(decimals[i] - '0'); + } + + if (i < dLen && decimals[i] >= '5') // Rounding + significand++; + + int remaining = dLen - i; + const int kUlpShift = 3; + const int kUlp = 1 << kUlpShift; + int64_t error = (remaining == 0) ? 0 : kUlp / 2; + + DiyFp v(significand, 0); + v = v.Normalize(); + error <<= -v.e; + + dExp += remaining; + + int actualExp; + DiyFp cachedPower = GetCachedPower10(dExp, &actualExp); + if (actualExp != dExp) { + static const DiyFp kPow10[] = { + DiyFp(RAPIDJSON_UINT64_C2(0xa0000000, 0x00000000), -60), // 10^1 + DiyFp(RAPIDJSON_UINT64_C2(0xc8000000, 0x00000000), -57), // 10^2 + DiyFp(RAPIDJSON_UINT64_C2(0xfa000000, 0x00000000), -54), // 10^3 + DiyFp(RAPIDJSON_UINT64_C2(0x9c400000, 0x00000000), -50), // 10^4 + DiyFp(RAPIDJSON_UINT64_C2(0xc3500000, 0x00000000), -47), // 10^5 + DiyFp(RAPIDJSON_UINT64_C2(0xf4240000, 0x00000000), -44), // 10^6 + DiyFp(RAPIDJSON_UINT64_C2(0x98968000, 0x00000000), -40) // 10^7 + }; + int adjustment = dExp - actualExp; + RAPIDJSON_ASSERT(adjustment >= 1 && adjustment < 8); + v = v * kPow10[adjustment - 1]; + if (dLen + adjustment > 19) // has more digits than decimal digits in 64-bit + error += kUlp / 2; + } + + v = v * cachedPower; + + error += kUlp + (error == 0 ? 0 : 1); + + const int oldExp = v.e; + v = v.Normalize(); + error <<= oldExp - v.e; + + const int effectiveSignificandSize = Double::EffectiveSignificandSize(64 + v.e); + int precisionSize = 64 - effectiveSignificandSize; + if (precisionSize + kUlpShift >= 64) { + int scaleExp = (precisionSize + kUlpShift) - 63; + v.f >>= scaleExp; + v.e += scaleExp; + error = (error >> scaleExp) + 1 + kUlp; + precisionSize -= scaleExp; + } + + DiyFp rounded(v.f >> precisionSize, v.e + precisionSize); + const uint64_t precisionBits = (v.f & ((uint64_t(1) << precisionSize) - 1)) * kUlp; + const uint64_t halfWay = (uint64_t(1) << (precisionSize - 1)) * kUlp; + if (precisionBits >= halfWay + static_cast(error)) { + rounded.f++; + if (rounded.f & (DiyFp::kDpHiddenBit << 1)) { // rounding overflows mantissa (issue #340) + rounded.f >>= 1; + rounded.e++; + } + } + + *result = rounded.ToDouble(); + + return halfWay - static_cast(error) >= precisionBits || precisionBits >= halfWay + static_cast(error); +} + +inline double StrtodBigInteger(double approx, const char* decimals, int dLen, int dExp) { + RAPIDJSON_ASSERT(dLen >= 0); + const BigInteger dInt(decimals, static_cast(dLen)); + Double a(approx); + int cmp = CheckWithinHalfULP(a.Value(), dInt, dExp); + if (cmp < 0) + return a.Value(); // within half ULP + else if (cmp == 0) { + // Round towards even + if (a.Significand() & 1) + return a.NextPositiveDouble(); + else + return a.Value(); + } + else // adjustment + return a.NextPositiveDouble(); +} + +inline double StrtodFullPrecision(double d, int p, const char* decimals, size_t length, size_t decimalPosition, int exp) { + RAPIDJSON_ASSERT(d >= 0.0); + RAPIDJSON_ASSERT(length >= 1); + + double result = 0.0; + if (StrtodFast(d, p, &result)) + return result; + + RAPIDJSON_ASSERT(length <= INT_MAX); + int dLen = static_cast(length); + + RAPIDJSON_ASSERT(length >= decimalPosition); + RAPIDJSON_ASSERT(length - decimalPosition <= INT_MAX); + int dExpAdjust = static_cast(length - decimalPosition); + + RAPIDJSON_ASSERT(exp >= INT_MIN + dExpAdjust); + int dExp = exp - dExpAdjust; + + // Make sure length+dExp does not overflow + RAPIDJSON_ASSERT(dExp <= INT_MAX - dLen); + + // Trim leading zeros + while (dLen > 0 && *decimals == '0') { + dLen--; + decimals++; + } + + // Trim trailing zeros + while (dLen > 0 && decimals[dLen - 1] == '0') { + dLen--; + dExp++; + } + + if (dLen == 0) { // Buffer only contains zeros. + return 0.0; + } + + // Trim right-most digits + const int kMaxDecimalDigit = 767 + 1; + if (dLen > kMaxDecimalDigit) { + dExp += dLen - kMaxDecimalDigit; + dLen = kMaxDecimalDigit; + } + + // If too small, underflow to zero. + // Any x <= 10^-324 is interpreted as zero. + if (dLen + dExp <= -324) + return 0.0; + + // If too large, overflow to infinity. + // Any x >= 10^309 is interpreted as +infinity. + if (dLen + dExp > 309) + return std::numeric_limits::infinity(); + + if (StrtodDiyFp(decimals, dLen, dExp, &result)) + return result; + + // Use approximation from StrtodDiyFp and make adjustment with BigInteger comparison + return StrtodBigInteger(result, decimals, dLen, dExp); +} + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_STRTOD_ diff --git a/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/internal/swap.h b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/internal/swap.h new file mode 100644 index 0000000..666e49f --- /dev/null +++ b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/internal/swap.h @@ -0,0 +1,46 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_INTERNAL_SWAP_H_ +#define RAPIDJSON_INTERNAL_SWAP_H_ + +#include "../rapidjson.h" + +#if defined(__clang__) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(c++98-compat) +#endif + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +//! Custom swap() to avoid dependency on C++ header +/*! \tparam T Type of the arguments to swap, should be instantiated with primitive C++ types only. + \note This has the same semantics as std::swap(). +*/ +template +inline void Swap(T& a, T& b) RAPIDJSON_NOEXCEPT { + T tmp = a; + a = b; + b = tmp; +} + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#if defined(__clang__) +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_INTERNAL_SWAP_H_ diff --git a/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/istreamwrapper.h b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/istreamwrapper.h new file mode 100644 index 0000000..5f81698 --- /dev/null +++ b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/istreamwrapper.h @@ -0,0 +1,113 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_ISTREAMWRAPPER_H_ +#define RAPIDJSON_ISTREAMWRAPPER_H_ + +#include "stream.h" +#include + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +#elif defined(_MSC_VER) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4351) // new behavior: elements of array 'array' will be default initialized +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Wrapper of \c std::basic_istream into RapidJSON's Stream concept. +/*! + The classes can be wrapped including but not limited to: + + - \c std::istringstream + - \c std::stringstream + - \c std::wistringstream + - \c std::wstringstream + - \c std::ifstream + - \c std::fstream + - \c std::wifstream + - \c std::wfstream + + \tparam StreamType Class derived from \c std::basic_istream. +*/ + +template +class BasicIStreamWrapper { +public: + typedef typename StreamType::char_type Ch; + BasicIStreamWrapper(StreamType& stream) : stream_(stream), count_(), peekBuffer_() {} + + Ch Peek() const { + typename StreamType::int_type c = stream_.peek(); + return RAPIDJSON_LIKELY(c != StreamType::traits_type::eof()) ? static_cast(c) : static_cast('\0'); + } + + Ch Take() { + typename StreamType::int_type c = stream_.get(); + if (RAPIDJSON_LIKELY(c != StreamType::traits_type::eof())) { + count_++; + return static_cast(c); + } + else + return '\0'; + } + + // tellg() may return -1 when failed. So we count by ourself. + size_t Tell() const { return count_; } + + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + void Put(Ch) { RAPIDJSON_ASSERT(false); } + void Flush() { RAPIDJSON_ASSERT(false); } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + + // For encoding detection only. + const Ch* Peek4() const { + RAPIDJSON_ASSERT(sizeof(Ch) == 1); // Only usable for byte stream. + int i; + bool hasError = false; + for (i = 0; i < 4; ++i) { + typename StreamType::int_type c = stream_.get(); + if (c == StreamType::traits_type::eof()) { + hasError = true; + stream_.clear(); + break; + } + peekBuffer_[i] = static_cast(c); + } + for (--i; i >= 0; --i) + stream_.putback(peekBuffer_[i]); + return !hasError ? peekBuffer_ : 0; + } + +private: + BasicIStreamWrapper(const BasicIStreamWrapper&); + BasicIStreamWrapper& operator=(const BasicIStreamWrapper&); + + StreamType& stream_; + size_t count_; //!< Number of characters read. Note: + mutable Ch peekBuffer_[4]; +}; + +typedef BasicIStreamWrapper IStreamWrapper; +typedef BasicIStreamWrapper WIStreamWrapper; + +#if defined(__clang__) || defined(_MSC_VER) +RAPIDJSON_DIAG_POP +#endif + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_ISTREAMWRAPPER_H_ diff --git a/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/memorybuffer.h b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/memorybuffer.h new file mode 100644 index 0000000..39bee1d --- /dev/null +++ b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/memorybuffer.h @@ -0,0 +1,70 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_MEMORYBUFFER_H_ +#define RAPIDJSON_MEMORYBUFFER_H_ + +#include "stream.h" +#include "internal/stack.h" + +RAPIDJSON_NAMESPACE_BEGIN + +//! Represents an in-memory output byte stream. +/*! + This class is mainly for being wrapped by EncodedOutputStream or AutoUTFOutputStream. + + It is similar to FileWriteBuffer but the destination is an in-memory buffer instead of a file. + + Differences between MemoryBuffer and StringBuffer: + 1. StringBuffer has Encoding but MemoryBuffer is only a byte buffer. + 2. StringBuffer::GetString() returns a null-terminated string. MemoryBuffer::GetBuffer() returns a buffer without terminator. + + \tparam Allocator type for allocating memory buffer. + \note implements Stream concept +*/ +template +struct GenericMemoryBuffer { + typedef char Ch; // byte + + GenericMemoryBuffer(Allocator* allocator = 0, size_t capacity = kDefaultCapacity) : stack_(allocator, capacity) {} + + void Put(Ch c) { *stack_.template Push() = c; } + void Flush() {} + + void Clear() { stack_.Clear(); } + void ShrinkToFit() { stack_.ShrinkToFit(); } + Ch* Push(size_t count) { return stack_.template Push(count); } + void Pop(size_t count) { stack_.template Pop(count); } + + const Ch* GetBuffer() const { + return stack_.template Bottom(); + } + + size_t GetSize() const { return stack_.GetSize(); } + + static const size_t kDefaultCapacity = 256; + mutable internal::Stack stack_; +}; + +typedef GenericMemoryBuffer<> MemoryBuffer; + +//! Implement specialized version of PutN() with memset() for better performance. +template<> +inline void PutN(MemoryBuffer& memoryBuffer, char c, size_t n) { + std::memset(memoryBuffer.stack_.Push(n), c, n * sizeof(c)); +} + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_MEMORYBUFFER_H_ diff --git a/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/memorystream.h b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/memorystream.h new file mode 100644 index 0000000..1d71d8a --- /dev/null +++ b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/memorystream.h @@ -0,0 +1,71 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_MEMORYSTREAM_H_ +#define RAPIDJSON_MEMORYSTREAM_H_ + +#include "stream.h" + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(unreachable-code) +RAPIDJSON_DIAG_OFF(missing-noreturn) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Represents an in-memory input byte stream. +/*! + This class is mainly for being wrapped by EncodedInputStream or AutoUTFInputStream. + + It is similar to FileReadBuffer but the source is an in-memory buffer instead of a file. + + Differences between MemoryStream and StringStream: + 1. StringStream has encoding but MemoryStream is a byte stream. + 2. MemoryStream needs size of the source buffer and the buffer don't need to be null terminated. StringStream assume null-terminated string as source. + 3. MemoryStream supports Peek4() for encoding detection. StringStream is specified with an encoding so it should not have Peek4(). + \note implements Stream concept +*/ +struct MemoryStream { + typedef char Ch; // byte + + MemoryStream(const Ch *src, size_t size) : src_(src), begin_(src), end_(src + size), size_(size) {} + + Ch Peek() const { return RAPIDJSON_UNLIKELY(src_ == end_) ? '\0' : *src_; } + Ch Take() { return RAPIDJSON_UNLIKELY(src_ == end_) ? '\0' : *src_++; } + size_t Tell() const { return static_cast(src_ - begin_); } + + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + void Put(Ch) { RAPIDJSON_ASSERT(false); } + void Flush() { RAPIDJSON_ASSERT(false); } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + + // For encoding detection only. + const Ch* Peek4() const { + return Tell() + 4 <= size_ ? src_ : 0; + } + + const Ch* src_; //!< Current read position. + const Ch* begin_; //!< Original head of the string. + const Ch* end_; //!< End of stream. + size_t size_; //!< Size of the stream. +}; + +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_MEMORYBUFFER_H_ diff --git a/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/msinttypes/inttypes.h b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/msinttypes/inttypes.h new file mode 100644 index 0000000..1811128 --- /dev/null +++ b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/msinttypes/inttypes.h @@ -0,0 +1,316 @@ +// ISO C9x compliant inttypes.h for Microsoft Visual Studio +// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 +// +// Copyright (c) 2006-2013 Alexander Chemeris +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. 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. +// +// 3. Neither the name of the product nor the names of its contributors may +// be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////////// + +// The above software in this distribution may have been modified by +// THL A29 Limited ("Tencent Modifications"). +// All Tencent Modifications are Copyright (C) 2015 THL A29 Limited. + +#ifndef _MSC_VER // [ +#error "Use this header only with Microsoft Visual C++ compilers!" +#endif // _MSC_VER ] + +#ifndef _MSC_INTTYPES_H_ // [ +#define _MSC_INTTYPES_H_ + +#if _MSC_VER > 1000 +#pragma once +#endif + +#include "stdint.h" + +// miloyip: VC supports inttypes.h since VC2013 +#if _MSC_VER >= 1800 +#include +#else + +// 7.8 Format conversion of integer types + +typedef struct { + intmax_t quot; + intmax_t rem; +} imaxdiv_t; + +// 7.8.1 Macros for format specifiers + +#if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS) // [ See footnote 185 at page 198 + +// The fprintf macros for signed integers are: +#define PRId8 "d" +#define PRIi8 "i" +#define PRIdLEAST8 "d" +#define PRIiLEAST8 "i" +#define PRIdFAST8 "d" +#define PRIiFAST8 "i" + +#define PRId16 "hd" +#define PRIi16 "hi" +#define PRIdLEAST16 "hd" +#define PRIiLEAST16 "hi" +#define PRIdFAST16 "hd" +#define PRIiFAST16 "hi" + +#define PRId32 "I32d" +#define PRIi32 "I32i" +#define PRIdLEAST32 "I32d" +#define PRIiLEAST32 "I32i" +#define PRIdFAST32 "I32d" +#define PRIiFAST32 "I32i" + +#define PRId64 "I64d" +#define PRIi64 "I64i" +#define PRIdLEAST64 "I64d" +#define PRIiLEAST64 "I64i" +#define PRIdFAST64 "I64d" +#define PRIiFAST64 "I64i" + +#define PRIdMAX "I64d" +#define PRIiMAX "I64i" + +#define PRIdPTR "Id" +#define PRIiPTR "Ii" + +// The fprintf macros for unsigned integers are: +#define PRIo8 "o" +#define PRIu8 "u" +#define PRIx8 "x" +#define PRIX8 "X" +#define PRIoLEAST8 "o" +#define PRIuLEAST8 "u" +#define PRIxLEAST8 "x" +#define PRIXLEAST8 "X" +#define PRIoFAST8 "o" +#define PRIuFAST8 "u" +#define PRIxFAST8 "x" +#define PRIXFAST8 "X" + +#define PRIo16 "ho" +#define PRIu16 "hu" +#define PRIx16 "hx" +#define PRIX16 "hX" +#define PRIoLEAST16 "ho" +#define PRIuLEAST16 "hu" +#define PRIxLEAST16 "hx" +#define PRIXLEAST16 "hX" +#define PRIoFAST16 "ho" +#define PRIuFAST16 "hu" +#define PRIxFAST16 "hx" +#define PRIXFAST16 "hX" + +#define PRIo32 "I32o" +#define PRIu32 "I32u" +#define PRIx32 "I32x" +#define PRIX32 "I32X" +#define PRIoLEAST32 "I32o" +#define PRIuLEAST32 "I32u" +#define PRIxLEAST32 "I32x" +#define PRIXLEAST32 "I32X" +#define PRIoFAST32 "I32o" +#define PRIuFAST32 "I32u" +#define PRIxFAST32 "I32x" +#define PRIXFAST32 "I32X" + +#define PRIo64 "I64o" +#define PRIu64 "I64u" +#define PRIx64 "I64x" +#define PRIX64 "I64X" +#define PRIoLEAST64 "I64o" +#define PRIuLEAST64 "I64u" +#define PRIxLEAST64 "I64x" +#define PRIXLEAST64 "I64X" +#define PRIoFAST64 "I64o" +#define PRIuFAST64 "I64u" +#define PRIxFAST64 "I64x" +#define PRIXFAST64 "I64X" + +#define PRIoMAX "I64o" +#define PRIuMAX "I64u" +#define PRIxMAX "I64x" +#define PRIXMAX "I64X" + +#define PRIoPTR "Io" +#define PRIuPTR "Iu" +#define PRIxPTR "Ix" +#define PRIXPTR "IX" + +// The fscanf macros for signed integers are: +#define SCNd8 "d" +#define SCNi8 "i" +#define SCNdLEAST8 "d" +#define SCNiLEAST8 "i" +#define SCNdFAST8 "d" +#define SCNiFAST8 "i" + +#define SCNd16 "hd" +#define SCNi16 "hi" +#define SCNdLEAST16 "hd" +#define SCNiLEAST16 "hi" +#define SCNdFAST16 "hd" +#define SCNiFAST16 "hi" + +#define SCNd32 "ld" +#define SCNi32 "li" +#define SCNdLEAST32 "ld" +#define SCNiLEAST32 "li" +#define SCNdFAST32 "ld" +#define SCNiFAST32 "li" + +#define SCNd64 "I64d" +#define SCNi64 "I64i" +#define SCNdLEAST64 "I64d" +#define SCNiLEAST64 "I64i" +#define SCNdFAST64 "I64d" +#define SCNiFAST64 "I64i" + +#define SCNdMAX "I64d" +#define SCNiMAX "I64i" + +#ifdef _WIN64 // [ +# define SCNdPTR "I64d" +# define SCNiPTR "I64i" +#else // _WIN64 ][ +# define SCNdPTR "ld" +# define SCNiPTR "li" +#endif // _WIN64 ] + +// The fscanf macros for unsigned integers are: +#define SCNo8 "o" +#define SCNu8 "u" +#define SCNx8 "x" +#define SCNX8 "X" +#define SCNoLEAST8 "o" +#define SCNuLEAST8 "u" +#define SCNxLEAST8 "x" +#define SCNXLEAST8 "X" +#define SCNoFAST8 "o" +#define SCNuFAST8 "u" +#define SCNxFAST8 "x" +#define SCNXFAST8 "X" + +#define SCNo16 "ho" +#define SCNu16 "hu" +#define SCNx16 "hx" +#define SCNX16 "hX" +#define SCNoLEAST16 "ho" +#define SCNuLEAST16 "hu" +#define SCNxLEAST16 "hx" +#define SCNXLEAST16 "hX" +#define SCNoFAST16 "ho" +#define SCNuFAST16 "hu" +#define SCNxFAST16 "hx" +#define SCNXFAST16 "hX" + +#define SCNo32 "lo" +#define SCNu32 "lu" +#define SCNx32 "lx" +#define SCNX32 "lX" +#define SCNoLEAST32 "lo" +#define SCNuLEAST32 "lu" +#define SCNxLEAST32 "lx" +#define SCNXLEAST32 "lX" +#define SCNoFAST32 "lo" +#define SCNuFAST32 "lu" +#define SCNxFAST32 "lx" +#define SCNXFAST32 "lX" + +#define SCNo64 "I64o" +#define SCNu64 "I64u" +#define SCNx64 "I64x" +#define SCNX64 "I64X" +#define SCNoLEAST64 "I64o" +#define SCNuLEAST64 "I64u" +#define SCNxLEAST64 "I64x" +#define SCNXLEAST64 "I64X" +#define SCNoFAST64 "I64o" +#define SCNuFAST64 "I64u" +#define SCNxFAST64 "I64x" +#define SCNXFAST64 "I64X" + +#define SCNoMAX "I64o" +#define SCNuMAX "I64u" +#define SCNxMAX "I64x" +#define SCNXMAX "I64X" + +#ifdef _WIN64 // [ +# define SCNoPTR "I64o" +# define SCNuPTR "I64u" +# define SCNxPTR "I64x" +# define SCNXPTR "I64X" +#else // _WIN64 ][ +# define SCNoPTR "lo" +# define SCNuPTR "lu" +# define SCNxPTR "lx" +# define SCNXPTR "lX" +#endif // _WIN64 ] + +#endif // __STDC_FORMAT_MACROS ] + +// 7.8.2 Functions for greatest-width integer types + +// 7.8.2.1 The imaxabs function +#define imaxabs _abs64 + +// 7.8.2.2 The imaxdiv function + +// This is modified version of div() function from Microsoft's div.c found +// in %MSVC.NET%\crt\src\div.c +#ifdef STATIC_IMAXDIV // [ +static +#else // STATIC_IMAXDIV ][ +_inline +#endif // STATIC_IMAXDIV ] +imaxdiv_t __cdecl imaxdiv(intmax_t numer, intmax_t denom) +{ + imaxdiv_t result; + + result.quot = numer / denom; + result.rem = numer % denom; + + if (numer < 0 && result.rem > 0) { + // did division wrong; must fix up + ++result.quot; + result.rem -= denom; + } + + return result; +} + +// 7.8.2.3 The strtoimax and strtoumax functions +#define strtoimax _strtoi64 +#define strtoumax _strtoui64 + +// 7.8.2.4 The wcstoimax and wcstoumax functions +#define wcstoimax _wcstoi64 +#define wcstoumax _wcstoui64 + +#endif // _MSC_VER >= 1800 + +#endif // _MSC_INTTYPES_H_ ] diff --git a/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/msinttypes/stdint.h b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/msinttypes/stdint.h new file mode 100644 index 0000000..3d4477b --- /dev/null +++ b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/msinttypes/stdint.h @@ -0,0 +1,300 @@ +// ISO C9x compliant stdint.h for Microsoft Visual Studio +// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 +// +// Copyright (c) 2006-2013 Alexander Chemeris +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. 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. +// +// 3. Neither the name of the product nor the names of its contributors may +// be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////////// + +// The above software in this distribution may have been modified by +// THL A29 Limited ("Tencent Modifications"). +// All Tencent Modifications are Copyright (C) 2015 THL A29 Limited. + +#ifndef _MSC_VER // [ +#error "Use this header only with Microsoft Visual C++ compilers!" +#endif // _MSC_VER ] + +#ifndef _MSC_STDINT_H_ // [ +#define _MSC_STDINT_H_ + +#if _MSC_VER > 1000 +#pragma once +#endif + +// miloyip: Originally Visual Studio 2010 uses its own stdint.h. However it generates warning with INT64_C(), so change to use this file for vs2010. +#if _MSC_VER >= 1600 // [ +#include + +#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 + +#undef INT8_C +#undef INT16_C +#undef INT32_C +#undef INT64_C +#undef UINT8_C +#undef UINT16_C +#undef UINT32_C +#undef UINT64_C + +// 7.18.4.1 Macros for minimum-width integer constants + +#define INT8_C(val) val##i8 +#define INT16_C(val) val##i16 +#define INT32_C(val) val##i32 +#define INT64_C(val) val##i64 + +#define UINT8_C(val) val##ui8 +#define UINT16_C(val) val##ui16 +#define UINT32_C(val) val##ui32 +#define UINT64_C(val) val##ui64 + +// 7.18.4.2 Macros for greatest-width integer constants +// These #ifndef's are needed to prevent collisions with . +// Check out Issue 9 for the details. +#ifndef INTMAX_C // [ +# define INTMAX_C INT64_C +#endif // INTMAX_C ] +#ifndef UINTMAX_C // [ +# define UINTMAX_C UINT64_C +#endif // UINTMAX_C ] + +#endif // __STDC_CONSTANT_MACROS ] + +#else // ] _MSC_VER >= 1700 [ + +#include + +// For Visual Studio 6 in C++ mode and for many Visual Studio versions when +// compiling for ARM we have to wrap include with 'extern "C++" {}' +// or compiler would give many errors like this: +// error C2733: second C linkage of overloaded function 'wmemchr' not allowed +#if defined(__cplusplus) && !defined(_M_ARM) +extern "C" { +#endif +# include +#if defined(__cplusplus) && !defined(_M_ARM) +} +#endif + +// Define _W64 macros to mark types changing their size, like intptr_t. +#ifndef _W64 +# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 +# define _W64 __w64 +# else +# define _W64 +# endif +#endif + + +// 7.18.1 Integer types + +// 7.18.1.1 Exact-width integer types + +// Visual Studio 6 and Embedded Visual C++ 4 doesn't +// realize that, e.g. char has the same size as __int8 +// so we give up on __intX for them. +#if (_MSC_VER < 1300) + typedef signed char int8_t; + typedef signed short int16_t; + typedef signed int int32_t; + typedef unsigned char uint8_t; + typedef unsigned short uint16_t; + typedef unsigned int uint32_t; +#else + typedef signed __int8 int8_t; + typedef signed __int16 int16_t; + typedef signed __int32 int32_t; + typedef unsigned __int8 uint8_t; + typedef unsigned __int16 uint16_t; + typedef unsigned __int32 uint32_t; +#endif +typedef signed __int64 int64_t; +typedef unsigned __int64 uint64_t; + + +// 7.18.1.2 Minimum-width integer types +typedef int8_t int_least8_t; +typedef int16_t int_least16_t; +typedef int32_t int_least32_t; +typedef int64_t int_least64_t; +typedef uint8_t uint_least8_t; +typedef uint16_t uint_least16_t; +typedef uint32_t uint_least32_t; +typedef uint64_t uint_least64_t; + +// 7.18.1.3 Fastest minimum-width integer types +typedef int8_t int_fast8_t; +typedef int16_t int_fast16_t; +typedef int32_t int_fast32_t; +typedef int64_t int_fast64_t; +typedef uint8_t uint_fast8_t; +typedef uint16_t uint_fast16_t; +typedef uint32_t uint_fast32_t; +typedef uint64_t uint_fast64_t; + +// 7.18.1.4 Integer types capable of holding object pointers +#ifdef _WIN64 // [ + typedef signed __int64 intptr_t; + typedef unsigned __int64 uintptr_t; +#else // _WIN64 ][ + typedef _W64 signed int intptr_t; + typedef _W64 unsigned int uintptr_t; +#endif // _WIN64 ] + +// 7.18.1.5 Greatest-width integer types +typedef int64_t intmax_t; +typedef uint64_t uintmax_t; + + +// 7.18.2 Limits of specified-width integer types + +#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259 + +// 7.18.2.1 Limits of exact-width integer types +#define INT8_MIN ((int8_t)_I8_MIN) +#define INT8_MAX _I8_MAX +#define INT16_MIN ((int16_t)_I16_MIN) +#define INT16_MAX _I16_MAX +#define INT32_MIN ((int32_t)_I32_MIN) +#define INT32_MAX _I32_MAX +#define INT64_MIN ((int64_t)_I64_MIN) +#define INT64_MAX _I64_MAX +#define UINT8_MAX _UI8_MAX +#define UINT16_MAX _UI16_MAX +#define UINT32_MAX _UI32_MAX +#define UINT64_MAX _UI64_MAX + +// 7.18.2.2 Limits of minimum-width integer types +#define INT_LEAST8_MIN INT8_MIN +#define INT_LEAST8_MAX INT8_MAX +#define INT_LEAST16_MIN INT16_MIN +#define INT_LEAST16_MAX INT16_MAX +#define INT_LEAST32_MIN INT32_MIN +#define INT_LEAST32_MAX INT32_MAX +#define INT_LEAST64_MIN INT64_MIN +#define INT_LEAST64_MAX INT64_MAX +#define UINT_LEAST8_MAX UINT8_MAX +#define UINT_LEAST16_MAX UINT16_MAX +#define UINT_LEAST32_MAX UINT32_MAX +#define UINT_LEAST64_MAX UINT64_MAX + +// 7.18.2.3 Limits of fastest minimum-width integer types +#define INT_FAST8_MIN INT8_MIN +#define INT_FAST8_MAX INT8_MAX +#define INT_FAST16_MIN INT16_MIN +#define INT_FAST16_MAX INT16_MAX +#define INT_FAST32_MIN INT32_MIN +#define INT_FAST32_MAX INT32_MAX +#define INT_FAST64_MIN INT64_MIN +#define INT_FAST64_MAX INT64_MAX +#define UINT_FAST8_MAX UINT8_MAX +#define UINT_FAST16_MAX UINT16_MAX +#define UINT_FAST32_MAX UINT32_MAX +#define UINT_FAST64_MAX UINT64_MAX + +// 7.18.2.4 Limits of integer types capable of holding object pointers +#ifdef _WIN64 // [ +# define INTPTR_MIN INT64_MIN +# define INTPTR_MAX INT64_MAX +# define UINTPTR_MAX UINT64_MAX +#else // _WIN64 ][ +# define INTPTR_MIN INT32_MIN +# define INTPTR_MAX INT32_MAX +# define UINTPTR_MAX UINT32_MAX +#endif // _WIN64 ] + +// 7.18.2.5 Limits of greatest-width integer types +#define INTMAX_MIN INT64_MIN +#define INTMAX_MAX INT64_MAX +#define UINTMAX_MAX UINT64_MAX + +// 7.18.3 Limits of other integer types + +#ifdef _WIN64 // [ +# define PTRDIFF_MIN _I64_MIN +# define PTRDIFF_MAX _I64_MAX +#else // _WIN64 ][ +# define PTRDIFF_MIN _I32_MIN +# define PTRDIFF_MAX _I32_MAX +#endif // _WIN64 ] + +#define SIG_ATOMIC_MIN INT_MIN +#define SIG_ATOMIC_MAX INT_MAX + +#ifndef SIZE_MAX // [ +# ifdef _WIN64 // [ +# define SIZE_MAX _UI64_MAX +# else // _WIN64 ][ +# define SIZE_MAX _UI32_MAX +# endif // _WIN64 ] +#endif // SIZE_MAX ] + +// WCHAR_MIN and WCHAR_MAX are also defined in +#ifndef WCHAR_MIN // [ +# define WCHAR_MIN 0 +#endif // WCHAR_MIN ] +#ifndef WCHAR_MAX // [ +# define WCHAR_MAX _UI16_MAX +#endif // WCHAR_MAX ] + +#define WINT_MIN 0 +#define WINT_MAX _UI16_MAX + +#endif // __STDC_LIMIT_MACROS ] + + +// 7.18.4 Limits of other integer types + +#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 + +// 7.18.4.1 Macros for minimum-width integer constants + +#define INT8_C(val) val##i8 +#define INT16_C(val) val##i16 +#define INT32_C(val) val##i32 +#define INT64_C(val) val##i64 + +#define UINT8_C(val) val##ui8 +#define UINT16_C(val) val##ui16 +#define UINT32_C(val) val##ui32 +#define UINT64_C(val) val##ui64 + +// 7.18.4.2 Macros for greatest-width integer constants +// These #ifndef's are needed to prevent collisions with . +// Check out Issue 9 for the details. +#ifndef INTMAX_C // [ +# define INTMAX_C INT64_C +#endif // INTMAX_C ] +#ifndef UINTMAX_C // [ +# define UINTMAX_C UINT64_C +#endif // UINTMAX_C ] + +#endif // __STDC_CONSTANT_MACROS ] + +#endif // _MSC_VER >= 1600 ] + +#endif // _MSC_STDINT_H_ ] diff --git a/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/ostreamwrapper.h b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/ostreamwrapper.h new file mode 100644 index 0000000..6f4667c --- /dev/null +++ b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/ostreamwrapper.h @@ -0,0 +1,81 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_OSTREAMWRAPPER_H_ +#define RAPIDJSON_OSTREAMWRAPPER_H_ + +#include "stream.h" +#include + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Wrapper of \c std::basic_ostream into RapidJSON's Stream concept. +/*! + The classes can be wrapped including but not limited to: + + - \c std::ostringstream + - \c std::stringstream + - \c std::wpstringstream + - \c std::wstringstream + - \c std::ifstream + - \c std::fstream + - \c std::wofstream + - \c std::wfstream + + \tparam StreamType Class derived from \c std::basic_ostream. +*/ + +template +class BasicOStreamWrapper { +public: + typedef typename StreamType::char_type Ch; + BasicOStreamWrapper(StreamType& stream) : stream_(stream) {} + + void Put(Ch c) { + stream_.put(c); + } + + void Flush() { + stream_.flush(); + } + + // Not implemented + char Peek() const { RAPIDJSON_ASSERT(false); return 0; } + char Take() { RAPIDJSON_ASSERT(false); return 0; } + size_t Tell() const { RAPIDJSON_ASSERT(false); return 0; } + char* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(char*) { RAPIDJSON_ASSERT(false); return 0; } + +private: + BasicOStreamWrapper(const BasicOStreamWrapper&); + BasicOStreamWrapper& operator=(const BasicOStreamWrapper&); + + StreamType& stream_; +}; + +typedef BasicOStreamWrapper OStreamWrapper; +typedef BasicOStreamWrapper WOStreamWrapper; + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_OSTREAMWRAPPER_H_ diff --git a/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/pointer.h b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/pointer.h new file mode 100644 index 0000000..3d339f2 --- /dev/null +++ b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/pointer.h @@ -0,0 +1,1357 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_POINTER_H_ +#define RAPIDJSON_POINTER_H_ + +#include "document.h" +#include "internal/itoa.h" + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(switch-enum) +#elif defined(_MSC_VER) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +static const SizeType kPointerInvalidIndex = ~SizeType(0); //!< Represents an invalid index in GenericPointer::Token + +//! Error code of parsing. +/*! \ingroup RAPIDJSON_ERRORS + \see GenericPointer::GenericPointer, GenericPointer::GetParseErrorCode +*/ +enum PointerParseErrorCode { + kPointerParseErrorNone = 0, //!< The parse is successful + + kPointerParseErrorTokenMustBeginWithSolidus, //!< A token must begin with a '/' + kPointerParseErrorInvalidEscape, //!< Invalid escape + kPointerParseErrorInvalidPercentEncoding, //!< Invalid percent encoding in URI fragment + kPointerParseErrorCharacterMustPercentEncode //!< A character must percent encoded in URI fragment +}; + +/////////////////////////////////////////////////////////////////////////////// +// GenericPointer + +//! Represents a JSON Pointer. Use Pointer for UTF8 encoding and default allocator. +/*! + This class implements RFC 6901 "JavaScript Object Notation (JSON) Pointer" + (https://tools.ietf.org/html/rfc6901). + + A JSON pointer is for identifying a specific value in a JSON document + (GenericDocument). It can simplify coding of DOM tree manipulation, because it + can access multiple-level depth of DOM tree with single API call. + + After it parses a string representation (e.g. "/foo/0" or URI fragment + representation (e.g. "#/foo/0") into its internal representation (tokens), + it can be used to resolve a specific value in multiple documents, or sub-tree + of documents. + + Contrary to GenericValue, Pointer can be copy constructed and copy assigned. + Apart from assignment, a Pointer cannot be modified after construction. + + Although Pointer is very convenient, please aware that constructing Pointer + involves parsing and dynamic memory allocation. A special constructor with user- + supplied tokens eliminates these. + + GenericPointer depends on GenericDocument and GenericValue. + + \tparam ValueType The value type of the DOM tree. E.g. GenericValue > + \tparam Allocator The allocator type for allocating memory for internal representation. + + \note GenericPointer uses same encoding of ValueType. + However, Allocator of GenericPointer is independent of Allocator of Value. +*/ +template +class GenericPointer { +public: + typedef typename ValueType::EncodingType EncodingType; //!< Encoding type from Value + typedef typename ValueType::Ch Ch; //!< Character type from Value + + //! A token is the basic units of internal representation. + /*! + A JSON pointer string representation "/foo/123" is parsed to two tokens: + "foo" and 123. 123 will be represented in both numeric form and string form. + They are resolved according to the actual value type (object or array). + + For token that are not numbers, or the numeric value is out of bound + (greater than limits of SizeType), they are only treated as string form + (i.e. the token's index will be equal to kPointerInvalidIndex). + + This struct is public so that user can create a Pointer without parsing and + allocation, using a special constructor. + */ + struct Token { + const Ch* name; //!< Name of the token. It has null character at the end but it can contain null character. + SizeType length; //!< Length of the name. + SizeType index; //!< A valid array index, if it is not equal to kPointerInvalidIndex. + }; + + //!@name Constructors and destructor. + //@{ + + //! Default constructor. + GenericPointer(Allocator* allocator = 0) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) {} + + //! Constructor that parses a string or URI fragment representation. + /*! + \param source A null-terminated, string or URI fragment representation of JSON pointer. + \param allocator User supplied allocator for this pointer. If no allocator is provided, it creates a self-owned one. + */ + explicit GenericPointer(const Ch* source, Allocator* allocator = 0) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) { + Parse(source, internal::StrLen(source)); + } + +#if RAPIDJSON_HAS_STDSTRING + //! Constructor that parses a string or URI fragment representation. + /*! + \param source A string or URI fragment representation of JSON pointer. + \param allocator User supplied allocator for this pointer. If no allocator is provided, it creates a self-owned one. + \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING. + */ + explicit GenericPointer(const std::basic_string& source, Allocator* allocator = 0) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) { + Parse(source.c_str(), source.size()); + } +#endif + + //! Constructor that parses a string or URI fragment representation, with length of the source string. + /*! + \param source A string or URI fragment representation of JSON pointer. + \param length Length of source. + \param allocator User supplied allocator for this pointer. If no allocator is provided, it creates a self-owned one. + \note Slightly faster than the overload without length. + */ + GenericPointer(const Ch* source, size_t length, Allocator* allocator = 0) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) { + Parse(source, length); + } + + //! Constructor with user-supplied tokens. + /*! + This constructor let user supplies const array of tokens. + This prevents the parsing process and eliminates allocation. + This is preferred for memory constrained environments. + + \param tokens An constant array of tokens representing the JSON pointer. + \param tokenCount Number of tokens. + + \b Example + \code + #define NAME(s) { s, sizeof(s) / sizeof(s[0]) - 1, kPointerInvalidIndex } + #define INDEX(i) { #i, sizeof(#i) - 1, i } + + static const Pointer::Token kTokens[] = { NAME("foo"), INDEX(123) }; + static const Pointer p(kTokens, sizeof(kTokens) / sizeof(kTokens[0])); + // Equivalent to static const Pointer p("/foo/123"); + + #undef NAME + #undef INDEX + \endcode + */ + GenericPointer(const Token* tokens, size_t tokenCount) : allocator_(), ownAllocator_(), nameBuffer_(), tokens_(const_cast(tokens)), tokenCount_(tokenCount), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) {} + + //! Copy constructor. + GenericPointer(const GenericPointer& rhs) : allocator_(rhs.allocator_), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) { + *this = rhs; + } + + //! Copy constructor. + GenericPointer(const GenericPointer& rhs, Allocator* allocator) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) { + *this = rhs; + } + + //! Destructor. + ~GenericPointer() { + if (nameBuffer_) // If user-supplied tokens constructor is used, nameBuffer_ is nullptr and tokens_ are not deallocated. + Allocator::Free(tokens_); + RAPIDJSON_DELETE(ownAllocator_); + } + + //! Assignment operator. + GenericPointer& operator=(const GenericPointer& rhs) { + if (this != &rhs) { + // Do not delete ownAllcator + if (nameBuffer_) + Allocator::Free(tokens_); + + tokenCount_ = rhs.tokenCount_; + parseErrorOffset_ = rhs.parseErrorOffset_; + parseErrorCode_ = rhs.parseErrorCode_; + + if (rhs.nameBuffer_) + CopyFromRaw(rhs); // Normally parsed tokens. + else { + tokens_ = rhs.tokens_; // User supplied const tokens. + nameBuffer_ = 0; + } + } + return *this; + } + + //@} + + //!@name Append token + //@{ + + //! Append a token and return a new Pointer + /*! + \param token Token to be appended. + \param allocator Allocator for the newly return Pointer. + \return A new Pointer with appended token. + */ + GenericPointer Append(const Token& token, Allocator* allocator = 0) const { + GenericPointer r; + r.allocator_ = allocator; + Ch *p = r.CopyFromRaw(*this, 1, token.length + 1); + std::memcpy(p, token.name, (token.length + 1) * sizeof(Ch)); + r.tokens_[tokenCount_].name = p; + r.tokens_[tokenCount_].length = token.length; + r.tokens_[tokenCount_].index = token.index; + return r; + } + + //! Append a name token with length, and return a new Pointer + /*! + \param name Name to be appended. + \param length Length of name. + \param allocator Allocator for the newly return Pointer. + \return A new Pointer with appended token. + */ + GenericPointer Append(const Ch* name, SizeType length, Allocator* allocator = 0) const { + Token token = { name, length, kPointerInvalidIndex }; + return Append(token, allocator); + } + + //! Append a name token without length, and return a new Pointer + /*! + \param name Name (const Ch*) to be appended. + \param allocator Allocator for the newly return Pointer. + \return A new Pointer with appended token. + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::NotExpr::Type, Ch> >), (GenericPointer)) + Append(T* name, Allocator* allocator = 0) const { + return Append(name, internal::StrLen(name), allocator); + } + +#if RAPIDJSON_HAS_STDSTRING + //! Append a name token, and return a new Pointer + /*! + \param name Name to be appended. + \param allocator Allocator for the newly return Pointer. + \return A new Pointer with appended token. + */ + GenericPointer Append(const std::basic_string& name, Allocator* allocator = 0) const { + return Append(name.c_str(), static_cast(name.size()), allocator); + } +#endif + + //! Append a index token, and return a new Pointer + /*! + \param index Index to be appended. + \param allocator Allocator for the newly return Pointer. + \return A new Pointer with appended token. + */ + GenericPointer Append(SizeType index, Allocator* allocator = 0) const { + char buffer[21]; + char* end = sizeof(SizeType) == 4 ? internal::u32toa(index, buffer) : internal::u64toa(index, buffer); + SizeType length = static_cast(end - buffer); + buffer[length] = '\0'; + + if (sizeof(Ch) == 1) { + Token token = { reinterpret_cast(buffer), length, index }; + return Append(token, allocator); + } + else { + Ch name[21]; + for (size_t i = 0; i <= length; i++) + name[i] = static_cast(buffer[i]); + Token token = { name, length, index }; + return Append(token, allocator); + } + } + + //! Append a token by value, and return a new Pointer + /*! + \param token token to be appended. + \param allocator Allocator for the newly return Pointer. + \return A new Pointer with appended token. + */ + GenericPointer Append(const ValueType& token, Allocator* allocator = 0) const { + if (token.IsString()) + return Append(token.GetString(), token.GetStringLength(), allocator); + else { + RAPIDJSON_ASSERT(token.IsUint64()); + RAPIDJSON_ASSERT(token.GetUint64() <= SizeType(~0)); + return Append(static_cast(token.GetUint64()), allocator); + } + } + + //!@name Handling Parse Error + //@{ + + //! Check whether this is a valid pointer. + bool IsValid() const { return parseErrorCode_ == kPointerParseErrorNone; } + + //! Get the parsing error offset in code unit. + size_t GetParseErrorOffset() const { return parseErrorOffset_; } + + //! Get the parsing error code. + PointerParseErrorCode GetParseErrorCode() const { return parseErrorCode_; } + + //@} + + //! Get the allocator of this pointer. + Allocator& GetAllocator() { return *allocator_; } + + //!@name Tokens + //@{ + + //! Get the token array (const version only). + const Token* GetTokens() const { return tokens_; } + + //! Get the number of tokens. + size_t GetTokenCount() const { return tokenCount_; } + + //@} + + //!@name Equality/inequality operators + //@{ + + //! Equality operator. + /*! + \note When any pointers are invalid, always returns false. + */ + bool operator==(const GenericPointer& rhs) const { + if (!IsValid() || !rhs.IsValid() || tokenCount_ != rhs.tokenCount_) + return false; + + for (size_t i = 0; i < tokenCount_; i++) { + if (tokens_[i].index != rhs.tokens_[i].index || + tokens_[i].length != rhs.tokens_[i].length || + (tokens_[i].length != 0 && std::memcmp(tokens_[i].name, rhs.tokens_[i].name, sizeof(Ch)* tokens_[i].length) != 0)) + { + return false; + } + } + + return true; + } + + //! Inequality operator. + /*! + \note When any pointers are invalid, always returns true. + */ + bool operator!=(const GenericPointer& rhs) const { return !(*this == rhs); } + + //@} + + //!@name Stringify + //@{ + + //! Stringify the pointer into string representation. + /*! + \tparam OutputStream Type of output stream. + \param os The output stream. + */ + template + bool Stringify(OutputStream& os) const { + return Stringify(os); + } + + //! Stringify the pointer into URI fragment representation. + /*! + \tparam OutputStream Type of output stream. + \param os The output stream. + */ + template + bool StringifyUriFragment(OutputStream& os) const { + return Stringify(os); + } + + //@} + + //!@name Create value + //@{ + + //! Create a value in a subtree. + /*! + If the value is not exist, it creates all parent values and a JSON Null value. + So it always succeed and return the newly created or existing value. + + Remind that it may change types of parents according to tokens, so it + potentially removes previously stored values. For example, if a document + was an array, and "/foo" is used to create a value, then the document + will be changed to an object, and all existing array elements are lost. + + \param root Root value of a DOM subtree to be resolved. It can be any value other than document root. + \param allocator Allocator for creating the values if the specified value or its parents are not exist. + \param alreadyExist If non-null, it stores whether the resolved value is already exist. + \return The resolved newly created (a JSON Null value), or already exists value. + */ + ValueType& Create(ValueType& root, typename ValueType::AllocatorType& allocator, bool* alreadyExist = 0) const { + RAPIDJSON_ASSERT(IsValid()); + ValueType* v = &root; + bool exist = true; + for (const Token *t = tokens_; t != tokens_ + tokenCount_; ++t) { + if (v->IsArray() && t->name[0] == '-' && t->length == 1) { + v->PushBack(ValueType().Move(), allocator); + v = &((*v)[v->Size() - 1]); + exist = false; + } + else { + if (t->index == kPointerInvalidIndex) { // must be object name + if (!v->IsObject()) + v->SetObject(); // Change to Object + } + else { // object name or array index + if (!v->IsArray() && !v->IsObject()) + v->SetArray(); // Change to Array + } + + if (v->IsArray()) { + if (t->index >= v->Size()) { + v->Reserve(t->index + 1, allocator); + while (t->index >= v->Size()) + v->PushBack(ValueType().Move(), allocator); + exist = false; + } + v = &((*v)[t->index]); + } + else { + typename ValueType::MemberIterator m = v->FindMember(GenericStringRef(t->name, t->length)); + if (m == v->MemberEnd()) { + v->AddMember(ValueType(t->name, t->length, allocator).Move(), ValueType().Move(), allocator); + v = &(--v->MemberEnd())->value; // Assumes AddMember() appends at the end + exist = false; + } + else + v = &m->value; + } + } + } + + if (alreadyExist) + *alreadyExist = exist; + + return *v; + } + + //! Creates a value in a document. + /*! + \param document A document to be resolved. + \param alreadyExist If non-null, it stores whether the resolved value is already exist. + \return The resolved newly created, or already exists value. + */ + template + ValueType& Create(GenericDocument& document, bool* alreadyExist = 0) const { + return Create(document, document.GetAllocator(), alreadyExist); + } + + //@} + + //!@name Query value + //@{ + + //! Query a value in a subtree. + /*! + \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. + \param unresolvedTokenIndex If the pointer cannot resolve a token in the pointer, this parameter can obtain the index of unresolved token. + \return Pointer to the value if it can be resolved. Otherwise null. + + \note + There are only 3 situations when a value cannot be resolved: + 1. A value in the path is not an array nor object. + 2. An object value does not contain the token. + 3. A token is out of range of an array value. + + Use unresolvedTokenIndex to retrieve the token index. + */ + ValueType* Get(ValueType& root, size_t* unresolvedTokenIndex = 0) const { + RAPIDJSON_ASSERT(IsValid()); + ValueType* v = &root; + for (const Token *t = tokens_; t != tokens_ + tokenCount_; ++t) { + switch (v->GetType()) { + case kObjectType: + { + typename ValueType::MemberIterator m = v->FindMember(GenericStringRef(t->name, t->length)); + if (m == v->MemberEnd()) + break; + v = &m->value; + } + continue; + case kArrayType: + if (t->index == kPointerInvalidIndex || t->index >= v->Size()) + break; + v = &((*v)[t->index]); + continue; + default: + break; + } + + // Error: unresolved token + if (unresolvedTokenIndex) + *unresolvedTokenIndex = static_cast(t - tokens_); + return 0; + } + return v; + } + + //! Query a const value in a const subtree. + /*! + \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. + \return Pointer to the value if it can be resolved. Otherwise null. + */ + const ValueType* Get(const ValueType& root, size_t* unresolvedTokenIndex = 0) const { + return Get(const_cast(root), unresolvedTokenIndex); + } + + //@} + + //!@name Query a value with default + //@{ + + //! Query a value in a subtree with default value. + /*! + Similar to Get(), but if the specified value do not exists, it creates all parents and clone the default value. + So that this function always succeed. + + \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. + \param defaultValue Default value to be cloned if the value was not exists. + \param allocator Allocator for creating the values if the specified value or its parents are not exist. + \see Create() + */ + ValueType& GetWithDefault(ValueType& root, const ValueType& defaultValue, typename ValueType::AllocatorType& allocator) const { + bool alreadyExist; + ValueType& v = Create(root, allocator, &alreadyExist); + return alreadyExist ? v : v.CopyFrom(defaultValue, allocator); + } + + //! Query a value in a subtree with default null-terminated string. + ValueType& GetWithDefault(ValueType& root, const Ch* defaultValue, typename ValueType::AllocatorType& allocator) const { + bool alreadyExist; + ValueType& v = Create(root, allocator, &alreadyExist); + return alreadyExist ? v : v.SetString(defaultValue, allocator); + } + +#if RAPIDJSON_HAS_STDSTRING + //! Query a value in a subtree with default std::basic_string. + ValueType& GetWithDefault(ValueType& root, const std::basic_string& defaultValue, typename ValueType::AllocatorType& allocator) const { + bool alreadyExist; + ValueType& v = Create(root, allocator, &alreadyExist); + return alreadyExist ? v : v.SetString(defaultValue, allocator); + } +#endif + + //! Query a value in a subtree with default primitive value. + /*! + \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c bool + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (ValueType&)) + GetWithDefault(ValueType& root, T defaultValue, typename ValueType::AllocatorType& allocator) const { + return GetWithDefault(root, ValueType(defaultValue).Move(), allocator); + } + + //! Query a value in a document with default value. + template + ValueType& GetWithDefault(GenericDocument& document, const ValueType& defaultValue) const { + return GetWithDefault(document, defaultValue, document.GetAllocator()); + } + + //! Query a value in a document with default null-terminated string. + template + ValueType& GetWithDefault(GenericDocument& document, const Ch* defaultValue) const { + return GetWithDefault(document, defaultValue, document.GetAllocator()); + } + +#if RAPIDJSON_HAS_STDSTRING + //! Query a value in a document with default std::basic_string. + template + ValueType& GetWithDefault(GenericDocument& document, const std::basic_string& defaultValue) const { + return GetWithDefault(document, defaultValue, document.GetAllocator()); + } +#endif + + //! Query a value in a document with default primitive value. + /*! + \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c bool + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (ValueType&)) + GetWithDefault(GenericDocument& document, T defaultValue) const { + return GetWithDefault(document, defaultValue, document.GetAllocator()); + } + + //@} + + //!@name Set a value + //@{ + + //! Set a value in a subtree, with move semantics. + /*! + It creates all parents if they are not exist or types are different to the tokens. + So this function always succeeds but potentially remove existing values. + + \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. + \param value Value to be set. + \param allocator Allocator for creating the values if the specified value or its parents are not exist. + \see Create() + */ + ValueType& Set(ValueType& root, ValueType& value, typename ValueType::AllocatorType& allocator) const { + return Create(root, allocator) = value; + } + + //! Set a value in a subtree, with copy semantics. + ValueType& Set(ValueType& root, const ValueType& value, typename ValueType::AllocatorType& allocator) const { + return Create(root, allocator).CopyFrom(value, allocator); + } + + //! Set a null-terminated string in a subtree. + ValueType& Set(ValueType& root, const Ch* value, typename ValueType::AllocatorType& allocator) const { + return Create(root, allocator) = ValueType(value, allocator).Move(); + } + +#if RAPIDJSON_HAS_STDSTRING + //! Set a std::basic_string in a subtree. + ValueType& Set(ValueType& root, const std::basic_string& value, typename ValueType::AllocatorType& allocator) const { + return Create(root, allocator) = ValueType(value, allocator).Move(); + } +#endif + + //! Set a primitive value in a subtree. + /*! + \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c bool + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (ValueType&)) + Set(ValueType& root, T value, typename ValueType::AllocatorType& allocator) const { + return Create(root, allocator) = ValueType(value).Move(); + } + + //! Set a value in a document, with move semantics. + template + ValueType& Set(GenericDocument& document, ValueType& value) const { + return Create(document) = value; + } + + //! Set a value in a document, with copy semantics. + template + ValueType& Set(GenericDocument& document, const ValueType& value) const { + return Create(document).CopyFrom(value, document.GetAllocator()); + } + + //! Set a null-terminated string in a document. + template + ValueType& Set(GenericDocument& document, const Ch* value) const { + return Create(document) = ValueType(value, document.GetAllocator()).Move(); + } + +#if RAPIDJSON_HAS_STDSTRING + //! Sets a std::basic_string in a document. + template + ValueType& Set(GenericDocument& document, const std::basic_string& value) const { + return Create(document) = ValueType(value, document.GetAllocator()).Move(); + } +#endif + + //! Set a primitive value in a document. + /*! + \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c bool + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (ValueType&)) + Set(GenericDocument& document, T value) const { + return Create(document) = value; + } + + //@} + + //!@name Swap a value + //@{ + + //! Swap a value with a value in a subtree. + /*! + It creates all parents if they are not exist or types are different to the tokens. + So this function always succeeds but potentially remove existing values. + + \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. + \param value Value to be swapped. + \param allocator Allocator for creating the values if the specified value or its parents are not exist. + \see Create() + */ + ValueType& Swap(ValueType& root, ValueType& value, typename ValueType::AllocatorType& allocator) const { + return Create(root, allocator).Swap(value); + } + + //! Swap a value with a value in a document. + template + ValueType& Swap(GenericDocument& document, ValueType& value) const { + return Create(document).Swap(value); + } + + //@} + + //! Erase a value in a subtree. + /*! + \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. + \return Whether the resolved value is found and erased. + + \note Erasing with an empty pointer \c Pointer(""), i.e. the root, always fail and return false. + */ + bool Erase(ValueType& root) const { + RAPIDJSON_ASSERT(IsValid()); + if (tokenCount_ == 0) // Cannot erase the root + return false; + + ValueType* v = &root; + const Token* last = tokens_ + (tokenCount_ - 1); + for (const Token *t = tokens_; t != last; ++t) { + switch (v->GetType()) { + case kObjectType: + { + typename ValueType::MemberIterator m = v->FindMember(GenericStringRef(t->name, t->length)); + if (m == v->MemberEnd()) + return false; + v = &m->value; + } + break; + case kArrayType: + if (t->index == kPointerInvalidIndex || t->index >= v->Size()) + return false; + v = &((*v)[t->index]); + break; + default: + return false; + } + } + + switch (v->GetType()) { + case kObjectType: + return v->EraseMember(GenericStringRef(last->name, last->length)); + case kArrayType: + if (last->index == kPointerInvalidIndex || last->index >= v->Size()) + return false; + v->Erase(v->Begin() + last->index); + return true; + default: + return false; + } + } + +private: + //! Clone the content from rhs to this. + /*! + \param rhs Source pointer. + \param extraToken Extra tokens to be allocated. + \param extraNameBufferSize Extra name buffer size (in number of Ch) to be allocated. + \return Start of non-occupied name buffer, for storing extra names. + */ + Ch* CopyFromRaw(const GenericPointer& rhs, size_t extraToken = 0, size_t extraNameBufferSize = 0) { + if (!allocator_) // allocator is independently owned. + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator)(); + + size_t nameBufferSize = rhs.tokenCount_; // null terminators for tokens + for (Token *t = rhs.tokens_; t != rhs.tokens_ + rhs.tokenCount_; ++t) + nameBufferSize += t->length; + + tokenCount_ = rhs.tokenCount_ + extraToken; + tokens_ = static_cast(allocator_->Malloc(tokenCount_ * sizeof(Token) + (nameBufferSize + extraNameBufferSize) * sizeof(Ch))); + nameBuffer_ = reinterpret_cast(tokens_ + tokenCount_); + if (rhs.tokenCount_ > 0) { + std::memcpy(tokens_, rhs.tokens_, rhs.tokenCount_ * sizeof(Token)); + } + if (nameBufferSize > 0) { + std::memcpy(nameBuffer_, rhs.nameBuffer_, nameBufferSize * sizeof(Ch)); + } + + // Adjust pointers to name buffer + std::ptrdiff_t diff = nameBuffer_ - rhs.nameBuffer_; + for (Token *t = tokens_; t != tokens_ + rhs.tokenCount_; ++t) + t->name += diff; + + return nameBuffer_ + nameBufferSize; + } + + //! Check whether a character should be percent-encoded. + /*! + According to RFC 3986 2.3 Unreserved Characters. + \param c The character (code unit) to be tested. + */ + bool NeedPercentEncode(Ch c) const { + return !((c >= '0' && c <= '9') || (c >= 'A' && c <='Z') || (c >= 'a' && c <= 'z') || c == '-' || c == '.' || c == '_' || c =='~'); + } + + //! Parse a JSON String or its URI fragment representation into tokens. +#ifndef __clang__ // -Wdocumentation + /*! + \param source Either a JSON Pointer string, or its URI fragment representation. Not need to be null terminated. + \param length Length of the source string. + \note Source cannot be JSON String Representation of JSON Pointer, e.g. In "/\u0000", \u0000 will not be unescaped. + */ +#endif + void Parse(const Ch* source, size_t length) { + RAPIDJSON_ASSERT(source != NULL); + RAPIDJSON_ASSERT(nameBuffer_ == 0); + RAPIDJSON_ASSERT(tokens_ == 0); + + // Create own allocator if user did not supply. + if (!allocator_) + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator)(); + + // Count number of '/' as tokenCount + tokenCount_ = 0; + for (const Ch* s = source; s != source + length; s++) + if (*s == '/') + tokenCount_++; + + Token* token = tokens_ = static_cast(allocator_->Malloc(tokenCount_ * sizeof(Token) + length * sizeof(Ch))); + Ch* name = nameBuffer_ = reinterpret_cast(tokens_ + tokenCount_); + size_t i = 0; + + // Detect if it is a URI fragment + bool uriFragment = false; + if (source[i] == '#') { + uriFragment = true; + i++; + } + + if (i != length && source[i] != '/') { + parseErrorCode_ = kPointerParseErrorTokenMustBeginWithSolidus; + goto error; + } + + while (i < length) { + RAPIDJSON_ASSERT(source[i] == '/'); + i++; // consumes '/' + + token->name = name; + bool isNumber = true; + + while (i < length && source[i] != '/') { + Ch c = source[i]; + if (uriFragment) { + // Decoding percent-encoding for URI fragment + if (c == '%') { + PercentDecodeStream is(&source[i], source + length); + GenericInsituStringStream os(name); + Ch* begin = os.PutBegin(); + if (!Transcoder, EncodingType>().Validate(is, os) || !is.IsValid()) { + parseErrorCode_ = kPointerParseErrorInvalidPercentEncoding; + goto error; + } + size_t len = os.PutEnd(begin); + i += is.Tell() - 1; + if (len == 1) + c = *name; + else { + name += len; + isNumber = false; + i++; + continue; + } + } + else if (NeedPercentEncode(c)) { + parseErrorCode_ = kPointerParseErrorCharacterMustPercentEncode; + goto error; + } + } + + i++; + + // Escaping "~0" -> '~', "~1" -> '/' + if (c == '~') { + if (i < length) { + c = source[i]; + if (c == '0') c = '~'; + else if (c == '1') c = '/'; + else { + parseErrorCode_ = kPointerParseErrorInvalidEscape; + goto error; + } + i++; + } + else { + parseErrorCode_ = kPointerParseErrorInvalidEscape; + goto error; + } + } + + // First check for index: all of characters are digit + if (c < '0' || c > '9') + isNumber = false; + + *name++ = c; + } + token->length = static_cast(name - token->name); + if (token->length == 0) + isNumber = false; + *name++ = '\0'; // Null terminator + + // Second check for index: more than one digit cannot have leading zero + if (isNumber && token->length > 1 && token->name[0] == '0') + isNumber = false; + + // String to SizeType conversion + SizeType n = 0; + if (isNumber) { + for (size_t j = 0; j < token->length; j++) { + SizeType m = n * 10 + static_cast(token->name[j] - '0'); + if (m < n) { // overflow detection + isNumber = false; + break; + } + n = m; + } + } + + token->index = isNumber ? n : kPointerInvalidIndex; + token++; + } + + RAPIDJSON_ASSERT(name <= nameBuffer_ + length); // Should not overflow buffer + parseErrorCode_ = kPointerParseErrorNone; + return; + + error: + Allocator::Free(tokens_); + nameBuffer_ = 0; + tokens_ = 0; + tokenCount_ = 0; + parseErrorOffset_ = i; + return; + } + + //! Stringify to string or URI fragment representation. + /*! + \tparam uriFragment True for stringifying to URI fragment representation. False for string representation. + \tparam OutputStream type of output stream. + \param os The output stream. + */ + template + bool Stringify(OutputStream& os) const { + RAPIDJSON_ASSERT(IsValid()); + + if (uriFragment) + os.Put('#'); + + for (Token *t = tokens_; t != tokens_ + tokenCount_; ++t) { + os.Put('/'); + for (size_t j = 0; j < t->length; j++) { + Ch c = t->name[j]; + if (c == '~') { + os.Put('~'); + os.Put('0'); + } + else if (c == '/') { + os.Put('~'); + os.Put('1'); + } + else if (uriFragment && NeedPercentEncode(c)) { + // Transcode to UTF8 sequence + GenericStringStream source(&t->name[j]); + PercentEncodeStream target(os); + if (!Transcoder >().Validate(source, target)) + return false; + j += source.Tell() - 1; + } + else + os.Put(c); + } + } + return true; + } + + //! A helper stream for decoding a percent-encoded sequence into code unit. + /*! + This stream decodes %XY triplet into code unit (0-255). + If it encounters invalid characters, it sets output code unit as 0 and + mark invalid, and to be checked by IsValid(). + */ + class PercentDecodeStream { + public: + typedef typename ValueType::Ch Ch; + + //! Constructor + /*! + \param source Start of the stream + \param end Past-the-end of the stream. + */ + PercentDecodeStream(const Ch* source, const Ch* end) : src_(source), head_(source), end_(end), valid_(true) {} + + Ch Take() { + if (*src_ != '%' || src_ + 3 > end_) { // %XY triplet + valid_ = false; + return 0; + } + src_++; + Ch c = 0; + for (int j = 0; j < 2; j++) { + c = static_cast(c << 4); + Ch h = *src_; + if (h >= '0' && h <= '9') c = static_cast(c + h - '0'); + else if (h >= 'A' && h <= 'F') c = static_cast(c + h - 'A' + 10); + else if (h >= 'a' && h <= 'f') c = static_cast(c + h - 'a' + 10); + else { + valid_ = false; + return 0; + } + src_++; + } + return c; + } + + size_t Tell() const { return static_cast(src_ - head_); } + bool IsValid() const { return valid_; } + + private: + const Ch* src_; //!< Current read position. + const Ch* head_; //!< Original head of the string. + const Ch* end_; //!< Past-the-end position. + bool valid_; //!< Whether the parsing is valid. + }; + + //! A helper stream to encode character (UTF-8 code unit) into percent-encoded sequence. + template + class PercentEncodeStream { + public: + PercentEncodeStream(OutputStream& os) : os_(os) {} + void Put(char c) { // UTF-8 must be byte + unsigned char u = static_cast(c); + static const char hexDigits[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + os_.Put('%'); + os_.Put(static_cast(hexDigits[u >> 4])); + os_.Put(static_cast(hexDigits[u & 15])); + } + private: + OutputStream& os_; + }; + + Allocator* allocator_; //!< The current allocator. It is either user-supplied or equal to ownAllocator_. + Allocator* ownAllocator_; //!< Allocator owned by this Pointer. + Ch* nameBuffer_; //!< A buffer containing all names in tokens. + Token* tokens_; //!< A list of tokens. + size_t tokenCount_; //!< Number of tokens in tokens_. + size_t parseErrorOffset_; //!< Offset in code unit when parsing fail. + PointerParseErrorCode parseErrorCode_; //!< Parsing error code. +}; + +//! GenericPointer for Value (UTF-8, default allocator). +typedef GenericPointer Pointer; + +//!@name Helper functions for GenericPointer +//@{ + +////////////////////////////////////////////////////////////////////////////// + +template +typename T::ValueType& CreateValueByPointer(T& root, const GenericPointer& pointer, typename T::AllocatorType& a) { + return pointer.Create(root, a); +} + +template +typename T::ValueType& CreateValueByPointer(T& root, const CharType(&source)[N], typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Create(root, a); +} + +// No allocator parameter + +template +typename DocumentType::ValueType& CreateValueByPointer(DocumentType& document, const GenericPointer& pointer) { + return pointer.Create(document); +} + +template +typename DocumentType::ValueType& CreateValueByPointer(DocumentType& document, const CharType(&source)[N]) { + return GenericPointer(source, N - 1).Create(document); +} + +////////////////////////////////////////////////////////////////////////////// + +template +typename T::ValueType* GetValueByPointer(T& root, const GenericPointer& pointer, size_t* unresolvedTokenIndex = 0) { + return pointer.Get(root, unresolvedTokenIndex); +} + +template +const typename T::ValueType* GetValueByPointer(const T& root, const GenericPointer& pointer, size_t* unresolvedTokenIndex = 0) { + return pointer.Get(root, unresolvedTokenIndex); +} + +template +typename T::ValueType* GetValueByPointer(T& root, const CharType (&source)[N], size_t* unresolvedTokenIndex = 0) { + return GenericPointer(source, N - 1).Get(root, unresolvedTokenIndex); +} + +template +const typename T::ValueType* GetValueByPointer(const T& root, const CharType(&source)[N], size_t* unresolvedTokenIndex = 0) { + return GenericPointer(source, N - 1).Get(root, unresolvedTokenIndex); +} + +////////////////////////////////////////////////////////////////////////////// + +template +typename T::ValueType& GetValueByPointerWithDefault(T& root, const GenericPointer& pointer, const typename T::ValueType& defaultValue, typename T::AllocatorType& a) { + return pointer.GetWithDefault(root, defaultValue, a); +} + +template +typename T::ValueType& GetValueByPointerWithDefault(T& root, const GenericPointer& pointer, const typename T::Ch* defaultValue, typename T::AllocatorType& a) { + return pointer.GetWithDefault(root, defaultValue, a); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename T::ValueType& GetValueByPointerWithDefault(T& root, const GenericPointer& pointer, const std::basic_string& defaultValue, typename T::AllocatorType& a) { + return pointer.GetWithDefault(root, defaultValue, a); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename T::ValueType&)) +GetValueByPointerWithDefault(T& root, const GenericPointer& pointer, T2 defaultValue, typename T::AllocatorType& a) { + return pointer.GetWithDefault(root, defaultValue, a); +} + +template +typename T::ValueType& GetValueByPointerWithDefault(T& root, const CharType(&source)[N], const typename T::ValueType& defaultValue, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).GetWithDefault(root, defaultValue, a); +} + +template +typename T::ValueType& GetValueByPointerWithDefault(T& root, const CharType(&source)[N], const typename T::Ch* defaultValue, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).GetWithDefault(root, defaultValue, a); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename T::ValueType& GetValueByPointerWithDefault(T& root, const CharType(&source)[N], const std::basic_string& defaultValue, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).GetWithDefault(root, defaultValue, a); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename T::ValueType&)) +GetValueByPointerWithDefault(T& root, const CharType(&source)[N], T2 defaultValue, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).GetWithDefault(root, defaultValue, a); +} + +// No allocator parameter + +template +typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const GenericPointer& pointer, const typename DocumentType::ValueType& defaultValue) { + return pointer.GetWithDefault(document, defaultValue); +} + +template +typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const GenericPointer& pointer, const typename DocumentType::Ch* defaultValue) { + return pointer.GetWithDefault(document, defaultValue); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const GenericPointer& pointer, const std::basic_string& defaultValue) { + return pointer.GetWithDefault(document, defaultValue); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename DocumentType::ValueType&)) +GetValueByPointerWithDefault(DocumentType& document, const GenericPointer& pointer, T2 defaultValue) { + return pointer.GetWithDefault(document, defaultValue); +} + +template +typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const CharType(&source)[N], const typename DocumentType::ValueType& defaultValue) { + return GenericPointer(source, N - 1).GetWithDefault(document, defaultValue); +} + +template +typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const CharType(&source)[N], const typename DocumentType::Ch* defaultValue) { + return GenericPointer(source, N - 1).GetWithDefault(document, defaultValue); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const CharType(&source)[N], const std::basic_string& defaultValue) { + return GenericPointer(source, N - 1).GetWithDefault(document, defaultValue); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename DocumentType::ValueType&)) +GetValueByPointerWithDefault(DocumentType& document, const CharType(&source)[N], T2 defaultValue) { + return GenericPointer(source, N - 1).GetWithDefault(document, defaultValue); +} + +////////////////////////////////////////////////////////////////////////////// + +template +typename T::ValueType& SetValueByPointer(T& root, const GenericPointer& pointer, typename T::ValueType& value, typename T::AllocatorType& a) { + return pointer.Set(root, value, a); +} + +template +typename T::ValueType& SetValueByPointer(T& root, const GenericPointer& pointer, const typename T::ValueType& value, typename T::AllocatorType& a) { + return pointer.Set(root, value, a); +} + +template +typename T::ValueType& SetValueByPointer(T& root, const GenericPointer& pointer, const typename T::Ch* value, typename T::AllocatorType& a) { + return pointer.Set(root, value, a); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename T::ValueType& SetValueByPointer(T& root, const GenericPointer& pointer, const std::basic_string& value, typename T::AllocatorType& a) { + return pointer.Set(root, value, a); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename T::ValueType&)) +SetValueByPointer(T& root, const GenericPointer& pointer, T2 value, typename T::AllocatorType& a) { + return pointer.Set(root, value, a); +} + +template +typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], typename T::ValueType& value, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Set(root, value, a); +} + +template +typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], const typename T::ValueType& value, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Set(root, value, a); +} + +template +typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], const typename T::Ch* value, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Set(root, value, a); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], const std::basic_string& value, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Set(root, value, a); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename T::ValueType&)) +SetValueByPointer(T& root, const CharType(&source)[N], T2 value, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Set(root, value, a); +} + +// No allocator parameter + +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const GenericPointer& pointer, typename DocumentType::ValueType& value) { + return pointer.Set(document, value); +} + +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const GenericPointer& pointer, const typename DocumentType::ValueType& value) { + return pointer.Set(document, value); +} + +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const GenericPointer& pointer, const typename DocumentType::Ch* value) { + return pointer.Set(document, value); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const GenericPointer& pointer, const std::basic_string& value) { + return pointer.Set(document, value); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename DocumentType::ValueType&)) +SetValueByPointer(DocumentType& document, const GenericPointer& pointer, T2 value) { + return pointer.Set(document, value); +} + +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const CharType(&source)[N], typename DocumentType::ValueType& value) { + return GenericPointer(source, N - 1).Set(document, value); +} + +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const CharType(&source)[N], const typename DocumentType::ValueType& value) { + return GenericPointer(source, N - 1).Set(document, value); +} + +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const CharType(&source)[N], const typename DocumentType::Ch* value) { + return GenericPointer(source, N - 1).Set(document, value); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const CharType(&source)[N], const std::basic_string& value) { + return GenericPointer(source, N - 1).Set(document, value); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename DocumentType::ValueType&)) +SetValueByPointer(DocumentType& document, const CharType(&source)[N], T2 value) { + return GenericPointer(source, N - 1).Set(document, value); +} + +////////////////////////////////////////////////////////////////////////////// + +template +typename T::ValueType& SwapValueByPointer(T& root, const GenericPointer& pointer, typename T::ValueType& value, typename T::AllocatorType& a) { + return pointer.Swap(root, value, a); +} + +template +typename T::ValueType& SwapValueByPointer(T& root, const CharType(&source)[N], typename T::ValueType& value, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Swap(root, value, a); +} + +template +typename DocumentType::ValueType& SwapValueByPointer(DocumentType& document, const GenericPointer& pointer, typename DocumentType::ValueType& value) { + return pointer.Swap(document, value); +} + +template +typename DocumentType::ValueType& SwapValueByPointer(DocumentType& document, const CharType(&source)[N], typename DocumentType::ValueType& value) { + return GenericPointer(source, N - 1).Swap(document, value); +} + +////////////////////////////////////////////////////////////////////////////// + +template +bool EraseValueByPointer(T& root, const GenericPointer& pointer) { + return pointer.Erase(root); +} + +template +bool EraseValueByPointer(T& root, const CharType(&source)[N]) { + return GenericPointer(source, N - 1).Erase(root); +} + +//@} + +RAPIDJSON_NAMESPACE_END + +#if defined(__clang__) || defined(_MSC_VER) +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_POINTER_H_ diff --git a/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/prettywriter.h b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/prettywriter.h new file mode 100644 index 0000000..45afb69 --- /dev/null +++ b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/prettywriter.h @@ -0,0 +1,277 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_PRETTYWRITER_H_ +#define RAPIDJSON_PRETTYWRITER_H_ + +#include "writer.h" + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif + +#if defined(__clang__) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(c++98-compat) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Combination of PrettyWriter format flags. +/*! \see PrettyWriter::SetFormatOptions + */ +enum PrettyFormatOptions { + kFormatDefault = 0, //!< Default pretty formatting. + kFormatSingleLineArray = 1 //!< Format arrays on a single line. +}; + +//! Writer with indentation and spacing. +/*! + \tparam OutputStream Type of output os. + \tparam SourceEncoding Encoding of source string. + \tparam TargetEncoding Encoding of output stream. + \tparam StackAllocator Type of allocator for allocating memory of stack. +*/ +template, typename TargetEncoding = UTF8<>, typename StackAllocator = CrtAllocator, unsigned writeFlags = kWriteDefaultFlags> +class PrettyWriter : public Writer { +public: + typedef Writer Base; + typedef typename Base::Ch Ch; + + //! Constructor + /*! \param os Output stream. + \param allocator User supplied allocator. If it is null, it will create a private one. + \param levelDepth Initial capacity of stack. + */ + explicit PrettyWriter(OutputStream& os, StackAllocator* allocator = 0, size_t levelDepth = Base::kDefaultLevelDepth) : + Base(os, allocator, levelDepth), indentChar_(' '), indentCharCount_(4), formatOptions_(kFormatDefault) {} + + + explicit PrettyWriter(StackAllocator* allocator = 0, size_t levelDepth = Base::kDefaultLevelDepth) : + Base(allocator, levelDepth), indentChar_(' '), indentCharCount_(4) {} + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + PrettyWriter(PrettyWriter&& rhs) : + Base(std::forward(rhs)), indentChar_(rhs.indentChar_), indentCharCount_(rhs.indentCharCount_), formatOptions_(rhs.formatOptions_) {} +#endif + + //! Set custom indentation. + /*! \param indentChar Character for indentation. Must be whitespace character (' ', '\\t', '\\n', '\\r'). + \param indentCharCount Number of indent characters for each indentation level. + \note The default indentation is 4 spaces. + */ + PrettyWriter& SetIndent(Ch indentChar, unsigned indentCharCount) { + RAPIDJSON_ASSERT(indentChar == ' ' || indentChar == '\t' || indentChar == '\n' || indentChar == '\r'); + indentChar_ = indentChar; + indentCharCount_ = indentCharCount; + return *this; + } + + //! Set pretty writer formatting options. + /*! \param options Formatting options. + */ + PrettyWriter& SetFormatOptions(PrettyFormatOptions options) { + formatOptions_ = options; + return *this; + } + + /*! @name Implementation of Handler + \see Handler + */ + //@{ + + bool Null() { PrettyPrefix(kNullType); return Base::EndValue(Base::WriteNull()); } + bool Bool(bool b) { PrettyPrefix(b ? kTrueType : kFalseType); return Base::EndValue(Base::WriteBool(b)); } + bool Int(int i) { PrettyPrefix(kNumberType); return Base::EndValue(Base::WriteInt(i)); } + bool Uint(unsigned u) { PrettyPrefix(kNumberType); return Base::EndValue(Base::WriteUint(u)); } + bool Int64(int64_t i64) { PrettyPrefix(kNumberType); return Base::EndValue(Base::WriteInt64(i64)); } + bool Uint64(uint64_t u64) { PrettyPrefix(kNumberType); return Base::EndValue(Base::WriteUint64(u64)); } + bool Double(double d) { PrettyPrefix(kNumberType); return Base::EndValue(Base::WriteDouble(d)); } + + bool RawNumber(const Ch* str, SizeType length, bool copy = false) { + RAPIDJSON_ASSERT(str != 0); + (void)copy; + PrettyPrefix(kNumberType); + return Base::EndValue(Base::WriteString(str, length)); + } + + bool String(const Ch* str, SizeType length, bool copy = false) { + RAPIDJSON_ASSERT(str != 0); + (void)copy; + PrettyPrefix(kStringType); + return Base::EndValue(Base::WriteString(str, length)); + } + +#if RAPIDJSON_HAS_STDSTRING + bool String(const std::basic_string& str) { + return String(str.data(), SizeType(str.size())); + } +#endif + + bool StartObject() { + PrettyPrefix(kObjectType); + new (Base::level_stack_.template Push()) typename Base::Level(false); + return Base::WriteStartObject(); + } + + bool Key(const Ch* str, SizeType length, bool copy = false) { return String(str, length, copy); } + +#if RAPIDJSON_HAS_STDSTRING + bool Key(const std::basic_string& str) { + return Key(str.data(), SizeType(str.size())); + } +#endif + + bool EndObject(SizeType memberCount = 0) { + (void)memberCount; + RAPIDJSON_ASSERT(Base::level_stack_.GetSize() >= sizeof(typename Base::Level)); // not inside an Object + RAPIDJSON_ASSERT(!Base::level_stack_.template Top()->inArray); // currently inside an Array, not Object + RAPIDJSON_ASSERT(0 == Base::level_stack_.template Top()->valueCount % 2); // Object has a Key without a Value + + bool empty = Base::level_stack_.template Pop(1)->valueCount == 0; + + if (!empty) { + Base::os_->Put('\n'); + WriteIndent(); + } + bool ret = Base::EndValue(Base::WriteEndObject()); + (void)ret; + RAPIDJSON_ASSERT(ret == true); + if (Base::level_stack_.Empty()) // end of json text + Base::Flush(); + return true; + } + + bool StartArray() { + PrettyPrefix(kArrayType); + new (Base::level_stack_.template Push()) typename Base::Level(true); + return Base::WriteStartArray(); + } + + bool EndArray(SizeType memberCount = 0) { + (void)memberCount; + RAPIDJSON_ASSERT(Base::level_stack_.GetSize() >= sizeof(typename Base::Level)); + RAPIDJSON_ASSERT(Base::level_stack_.template Top()->inArray); + bool empty = Base::level_stack_.template Pop(1)->valueCount == 0; + + if (!empty && !(formatOptions_ & kFormatSingleLineArray)) { + Base::os_->Put('\n'); + WriteIndent(); + } + bool ret = Base::EndValue(Base::WriteEndArray()); + (void)ret; + RAPIDJSON_ASSERT(ret == true); + if (Base::level_stack_.Empty()) // end of json text + Base::Flush(); + return true; + } + + //@} + + /*! @name Convenience extensions */ + //@{ + + //! Simpler but slower overload. + bool String(const Ch* str) { return String(str, internal::StrLen(str)); } + bool Key(const Ch* str) { return Key(str, internal::StrLen(str)); } + + //@} + + //! Write a raw JSON value. + /*! + For user to write a stringified JSON as a value. + + \param json A well-formed JSON value. It should not contain null character within [0, length - 1] range. + \param length Length of the json. + \param type Type of the root of json. + \note When using PrettyWriter::RawValue(), the result json may not be indented correctly. + */ + bool RawValue(const Ch* json, size_t length, Type type) { + RAPIDJSON_ASSERT(json != 0); + PrettyPrefix(type); + return Base::EndValue(Base::WriteRawValue(json, length)); + } + +protected: + void PrettyPrefix(Type type) { + (void)type; + if (Base::level_stack_.GetSize() != 0) { // this value is not at root + typename Base::Level* level = Base::level_stack_.template Top(); + + if (level->inArray) { + if (level->valueCount > 0) { + Base::os_->Put(','); // add comma if it is not the first element in array + if (formatOptions_ & kFormatSingleLineArray) + Base::os_->Put(' '); + } + + if (!(formatOptions_ & kFormatSingleLineArray)) { + Base::os_->Put('\n'); + WriteIndent(); + } + } + else { // in object + if (level->valueCount > 0) { + if (level->valueCount % 2 == 0) { + Base::os_->Put(','); + Base::os_->Put('\n'); + } + else { + Base::os_->Put(':'); + Base::os_->Put(' '); + } + } + else + Base::os_->Put('\n'); + + if (level->valueCount % 2 == 0) + WriteIndent(); + } + if (!level->inArray && level->valueCount % 2 == 0) + RAPIDJSON_ASSERT(type == kStringType); // if it's in object, then even number should be a name + level->valueCount++; + } + else { + RAPIDJSON_ASSERT(!Base::hasRoot_); // Should only has one and only one root. + Base::hasRoot_ = true; + } + } + + void WriteIndent() { + size_t count = (Base::level_stack_.GetSize() / sizeof(typename Base::Level)) * indentCharCount_; + PutN(*Base::os_, static_cast(indentChar_), count); + } + + Ch indentChar_; + unsigned indentCharCount_; + PrettyFormatOptions formatOptions_; + +private: + // Prohibit copy constructor & assignment operator. + PrettyWriter(const PrettyWriter&); + PrettyWriter& operator=(const PrettyWriter&); +}; + +RAPIDJSON_NAMESPACE_END + +#if defined(__clang__) +RAPIDJSON_DIAG_POP +#endif + +#ifdef __GNUC__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_RAPIDJSON_H_ diff --git a/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/rapidjson.h b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/rapidjson.h new file mode 100644 index 0000000..065c8bb --- /dev/null +++ b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/rapidjson.h @@ -0,0 +1,654 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_RAPIDJSON_H_ +#define RAPIDJSON_RAPIDJSON_H_ + +/*!\file rapidjson.h + \brief common definitions and configuration + + \see RAPIDJSON_CONFIG + */ + +/*! \defgroup RAPIDJSON_CONFIG RapidJSON configuration + \brief Configuration macros for library features + + Some RapidJSON features are configurable to adapt the library to a wide + variety of platforms, environments and usage scenarios. Most of the + features can be configured in terms of overridden or predefined + preprocessor macros at compile-time. + + Some additional customization is available in the \ref RAPIDJSON_ERRORS APIs. + + \note These macros should be given on the compiler command-line + (where applicable) to avoid inconsistent values when compiling + different translation units of a single application. + */ + +#include // malloc(), realloc(), free(), size_t +#include // memset(), memcpy(), memmove(), memcmp() + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_VERSION_STRING +// +// ALWAYS synchronize the following 3 macros with corresponding variables in /CMakeLists.txt. +// + +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +// token stringification +#define RAPIDJSON_STRINGIFY(x) RAPIDJSON_DO_STRINGIFY(x) +#define RAPIDJSON_DO_STRINGIFY(x) #x + +// token concatenation +#define RAPIDJSON_JOIN(X, Y) RAPIDJSON_DO_JOIN(X, Y) +#define RAPIDJSON_DO_JOIN(X, Y) RAPIDJSON_DO_JOIN2(X, Y) +#define RAPIDJSON_DO_JOIN2(X, Y) X##Y +//!@endcond + +/*! \def RAPIDJSON_MAJOR_VERSION + \ingroup RAPIDJSON_CONFIG + \brief Major version of RapidJSON in integer. +*/ +/*! \def RAPIDJSON_MINOR_VERSION + \ingroup RAPIDJSON_CONFIG + \brief Minor version of RapidJSON in integer. +*/ +/*! \def RAPIDJSON_PATCH_VERSION + \ingroup RAPIDJSON_CONFIG + \brief Patch version of RapidJSON in integer. +*/ +/*! \def RAPIDJSON_VERSION_STRING + \ingroup RAPIDJSON_CONFIG + \brief Version of RapidJSON in ".." string format. +*/ +#define RAPIDJSON_MAJOR_VERSION 1 +#define RAPIDJSON_MINOR_VERSION 1 +#define RAPIDJSON_PATCH_VERSION 0 +#define RAPIDJSON_VERSION_STRING \ + RAPIDJSON_STRINGIFY(RAPIDJSON_MAJOR_VERSION.RAPIDJSON_MINOR_VERSION.RAPIDJSON_PATCH_VERSION) + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_NAMESPACE_(BEGIN|END) +/*! \def RAPIDJSON_NAMESPACE + \ingroup RAPIDJSON_CONFIG + \brief provide custom rapidjson namespace + + In order to avoid symbol clashes and/or "One Definition Rule" errors + between multiple inclusions of (different versions of) RapidJSON in + a single binary, users can customize the name of the main RapidJSON + namespace. + + In case of a single nesting level, defining \c RAPIDJSON_NAMESPACE + to a custom name (e.g. \c MyRapidJSON) is sufficient. If multiple + levels are needed, both \ref RAPIDJSON_NAMESPACE_BEGIN and \ref + RAPIDJSON_NAMESPACE_END need to be defined as well: + + \code + // in some .cpp file + #define RAPIDJSON_NAMESPACE my::rapidjson + #define RAPIDJSON_NAMESPACE_BEGIN namespace my { namespace rapidjson { + #define RAPIDJSON_NAMESPACE_END } } + #include "rapidjson/..." + \endcode + + \see rapidjson + */ +/*! \def RAPIDJSON_NAMESPACE_BEGIN + \ingroup RAPIDJSON_CONFIG + \brief provide custom rapidjson namespace (opening expression) + \see RAPIDJSON_NAMESPACE +*/ +/*! \def RAPIDJSON_NAMESPACE_END + \ingroup RAPIDJSON_CONFIG + \brief provide custom rapidjson namespace (closing expression) + \see RAPIDJSON_NAMESPACE +*/ +#ifndef RAPIDJSON_NAMESPACE +#define RAPIDJSON_NAMESPACE rapidjson +#endif +#ifndef RAPIDJSON_NAMESPACE_BEGIN +#define RAPIDJSON_NAMESPACE_BEGIN namespace RAPIDJSON_NAMESPACE { +#endif +#ifndef RAPIDJSON_NAMESPACE_END +#define RAPIDJSON_NAMESPACE_END } +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_HAS_STDSTRING + +#ifndef RAPIDJSON_HAS_STDSTRING +#ifdef RAPIDJSON_DOXYGEN_RUNNING +#define RAPIDJSON_HAS_STDSTRING 1 // force generation of documentation +#else +#define RAPIDJSON_HAS_STDSTRING 0 // no std::string support by default +#endif +/*! \def RAPIDJSON_HAS_STDSTRING + \ingroup RAPIDJSON_CONFIG + \brief Enable RapidJSON support for \c std::string + + By defining this preprocessor symbol to \c 1, several convenience functions for using + \ref rapidjson::GenericValue with \c std::string are enabled, especially + for construction and comparison. + + \hideinitializer +*/ +#endif // !defined(RAPIDJSON_HAS_STDSTRING) + +#if RAPIDJSON_HAS_STDSTRING +#include +#endif // RAPIDJSON_HAS_STDSTRING + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_NO_INT64DEFINE + +/*! \def RAPIDJSON_NO_INT64DEFINE + \ingroup RAPIDJSON_CONFIG + \brief Use external 64-bit integer types. + + RapidJSON requires the 64-bit integer types \c int64_t and \c uint64_t types + to be available at global scope. + + If users have their own definition, define RAPIDJSON_NO_INT64DEFINE to + prevent RapidJSON from defining its own types. +*/ +#ifndef RAPIDJSON_NO_INT64DEFINE +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +#if defined(_MSC_VER) && (_MSC_VER < 1800) // Visual Studio 2013 +#include "msinttypes/stdint.h" +#include "msinttypes/inttypes.h" +#else +// Other compilers should have this. +#include +#include +#endif +//!@endcond +#ifdef RAPIDJSON_DOXYGEN_RUNNING +#define RAPIDJSON_NO_INT64DEFINE +#endif +#endif // RAPIDJSON_NO_INT64TYPEDEF + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_FORCEINLINE + +#ifndef RAPIDJSON_FORCEINLINE +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +#if defined(_MSC_VER) && defined(NDEBUG) +#define RAPIDJSON_FORCEINLINE __forceinline +#elif defined(__GNUC__) && __GNUC__ >= 4 && defined(NDEBUG) +#define RAPIDJSON_FORCEINLINE __attribute__((always_inline)) +#else +#define RAPIDJSON_FORCEINLINE +#endif +//!@endcond +#endif // RAPIDJSON_FORCEINLINE + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_ENDIAN +#define RAPIDJSON_LITTLEENDIAN 0 //!< Little endian machine +#define RAPIDJSON_BIGENDIAN 1 //!< Big endian machine + +//! Endianness of the machine. +/*! + \def RAPIDJSON_ENDIAN + \ingroup RAPIDJSON_CONFIG + + GCC 4.6 provided macro for detecting endianness of the target machine. But other + compilers may not have this. User can define RAPIDJSON_ENDIAN to either + \ref RAPIDJSON_LITTLEENDIAN or \ref RAPIDJSON_BIGENDIAN. + + Default detection implemented with reference to + \li https://gcc.gnu.org/onlinedocs/gcc-4.6.0/cpp/Common-Predefined-Macros.html + \li http://www.boost.org/doc/libs/1_42_0/boost/detail/endian.hpp +*/ +#ifndef RAPIDJSON_ENDIAN +// Detect with GCC 4.6's macro +# ifdef __BYTE_ORDER__ +# if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ +# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN +# elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ +# define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN +# else +# error Unknown machine endianness detected. User needs to define RAPIDJSON_ENDIAN. +# endif // __BYTE_ORDER__ +// Detect with GLIBC's endian.h +# elif defined(__GLIBC__) +# include +# if (__BYTE_ORDER == __LITTLE_ENDIAN) +# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN +# elif (__BYTE_ORDER == __BIG_ENDIAN) +# define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN +# else +# error Unknown machine endianness detected. User needs to define RAPIDJSON_ENDIAN. +# endif // __GLIBC__ +// Detect with _LITTLE_ENDIAN and _BIG_ENDIAN macro +# elif defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN) +# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN +# elif defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN) +# define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN +// Detect with architecture macros +# elif defined(__sparc) || defined(__sparc__) || defined(_POWER) || defined(__powerpc__) || defined(__ppc__) || defined(__hpux) || defined(__hppa) || defined(_MIPSEB) || defined(_POWER) || defined(__s390__) +# define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN +# elif defined(__i386__) || defined(__alpha__) || defined(__ia64) || defined(__ia64__) || defined(_M_IX86) || defined(_M_IA64) || defined(_M_ALPHA) || defined(__amd64) || defined(__amd64__) || defined(_M_AMD64) || defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || defined(__bfin__) +# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN +# elif defined(_MSC_VER) && (defined(_M_ARM) || defined(_M_ARM64)) +# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN +# elif defined(RAPIDJSON_DOXYGEN_RUNNING) +# define RAPIDJSON_ENDIAN +# else +# error Unknown machine endianness detected. User needs to define RAPIDJSON_ENDIAN. +# endif +#endif // RAPIDJSON_ENDIAN + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_64BIT + +//! Whether using 64-bit architecture +#ifndef RAPIDJSON_64BIT +#if defined(__LP64__) || (defined(__x86_64__) && defined(__ILP32__)) || defined(_WIN64) || defined(__EMSCRIPTEN__) +#define RAPIDJSON_64BIT 1 +#else +#define RAPIDJSON_64BIT 0 +#endif +#endif // RAPIDJSON_64BIT + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_ALIGN + +//! Data alignment of the machine. +/*! \ingroup RAPIDJSON_CONFIG + \param x pointer to align + + Some machines require strict data alignment. The default is 8 bytes. + User can customize by defining the RAPIDJSON_ALIGN function macro. +*/ +#ifndef RAPIDJSON_ALIGN +#define RAPIDJSON_ALIGN(x) (((x) + static_cast(7u)) & ~static_cast(7u)) +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_UINT64_C2 + +//! Construct a 64-bit literal by a pair of 32-bit integer. +/*! + 64-bit literal with or without ULL suffix is prone to compiler warnings. + UINT64_C() is C macro which cause compilation problems. + Use this macro to define 64-bit constants by a pair of 32-bit integer. +*/ +#ifndef RAPIDJSON_UINT64_C2 +#define RAPIDJSON_UINT64_C2(high32, low32) ((static_cast(high32) << 32) | static_cast(low32)) +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_48BITPOINTER_OPTIMIZATION + +//! Use only lower 48-bit address for some pointers. +/*! + \ingroup RAPIDJSON_CONFIG + + This optimization uses the fact that current X86-64 architecture only implement lower 48-bit virtual address. + The higher 16-bit can be used for storing other data. + \c GenericValue uses this optimization to reduce its size form 24 bytes to 16 bytes in 64-bit architecture. +*/ +#ifndef RAPIDJSON_48BITPOINTER_OPTIMIZATION +#if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) || defined(_M_X64) || defined(_M_AMD64) +#define RAPIDJSON_48BITPOINTER_OPTIMIZATION 1 +#else +#define RAPIDJSON_48BITPOINTER_OPTIMIZATION 0 +#endif +#endif // RAPIDJSON_48BITPOINTER_OPTIMIZATION + +#if RAPIDJSON_48BITPOINTER_OPTIMIZATION == 1 +#if RAPIDJSON_64BIT != 1 +#error RAPIDJSON_48BITPOINTER_OPTIMIZATION can only be set to 1 when RAPIDJSON_64BIT=1 +#endif +#define RAPIDJSON_SETPOINTER(type, p, x) (p = reinterpret_cast((reinterpret_cast(p) & static_cast(RAPIDJSON_UINT64_C2(0xFFFF0000, 0x00000000))) | reinterpret_cast(reinterpret_cast(x)))) +#define RAPIDJSON_GETPOINTER(type, p) (reinterpret_cast(reinterpret_cast(p) & static_cast(RAPIDJSON_UINT64_C2(0x0000FFFF, 0xFFFFFFFF)))) +#else +#define RAPIDJSON_SETPOINTER(type, p, x) (p = (x)) +#define RAPIDJSON_GETPOINTER(type, p) (p) +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_SSE2/RAPIDJSON_SSE42/RAPIDJSON_NEON/RAPIDJSON_SIMD + +/*! \def RAPIDJSON_SIMD + \ingroup RAPIDJSON_CONFIG + \brief Enable SSE2/SSE4.2/Neon optimization. + + RapidJSON supports optimized implementations for some parsing operations + based on the SSE2, SSE4.2 or NEon SIMD extensions on modern Intel + or ARM compatible processors. + + To enable these optimizations, three different symbols can be defined; + \code + // Enable SSE2 optimization. + #define RAPIDJSON_SSE2 + + // Enable SSE4.2 optimization. + #define RAPIDJSON_SSE42 + \endcode + + // Enable ARM Neon optimization. + #define RAPIDJSON_NEON + \endcode + + \c RAPIDJSON_SSE42 takes precedence over SSE2, if both are defined. + + If any of these symbols is defined, RapidJSON defines the macro + \c RAPIDJSON_SIMD to indicate the availability of the optimized code. +*/ +#if defined(RAPIDJSON_SSE2) || defined(RAPIDJSON_SSE42) \ + || defined(RAPIDJSON_NEON) || defined(RAPIDJSON_DOXYGEN_RUNNING) +#define RAPIDJSON_SIMD +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_NO_SIZETYPEDEFINE + +#ifndef RAPIDJSON_NO_SIZETYPEDEFINE +/*! \def RAPIDJSON_NO_SIZETYPEDEFINE + \ingroup RAPIDJSON_CONFIG + \brief User-provided \c SizeType definition. + + In order to avoid using 32-bit size types for indexing strings and arrays, + define this preprocessor symbol and provide the type rapidjson::SizeType + before including RapidJSON: + \code + #define RAPIDJSON_NO_SIZETYPEDEFINE + namespace rapidjson { typedef ::std::size_t SizeType; } + #include "rapidjson/..." + \endcode + + \see rapidjson::SizeType +*/ +#ifdef RAPIDJSON_DOXYGEN_RUNNING +#define RAPIDJSON_NO_SIZETYPEDEFINE +#endif +RAPIDJSON_NAMESPACE_BEGIN +//! Size type (for string lengths, array sizes, etc.) +/*! RapidJSON uses 32-bit array/string indices even on 64-bit platforms, + instead of using \c size_t. Users may override the SizeType by defining + \ref RAPIDJSON_NO_SIZETYPEDEFINE. +*/ +typedef unsigned SizeType; +RAPIDJSON_NAMESPACE_END +#endif + +// always import std::size_t to rapidjson namespace +RAPIDJSON_NAMESPACE_BEGIN +using std::size_t; +RAPIDJSON_NAMESPACE_END + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_ASSERT + +//! Assertion. +/*! \ingroup RAPIDJSON_CONFIG + By default, rapidjson uses C \c assert() for internal assertions. + User can override it by defining RAPIDJSON_ASSERT(x) macro. + + \note Parsing errors are handled and can be customized by the + \ref RAPIDJSON_ERRORS APIs. +*/ +#ifndef RAPIDJSON_ASSERT +#include +#define RAPIDJSON_ASSERT(x) assert(x) +#endif // RAPIDJSON_ASSERT + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_STATIC_ASSERT + +// Prefer C++11 static_assert, if available +#ifndef RAPIDJSON_STATIC_ASSERT +#if __cplusplus >= 201103L || ( defined(_MSC_VER) && _MSC_VER >= 1800 ) +#define RAPIDJSON_STATIC_ASSERT(x) \ + static_assert(x, RAPIDJSON_STRINGIFY(x)) +#endif // C++11 +#endif // RAPIDJSON_STATIC_ASSERT + +// Adopt C++03 implementation from boost +#ifndef RAPIDJSON_STATIC_ASSERT +#ifndef __clang__ +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +#endif +RAPIDJSON_NAMESPACE_BEGIN +template struct STATIC_ASSERTION_FAILURE; +template <> struct STATIC_ASSERTION_FAILURE { enum { value = 1 }; }; +template struct StaticAssertTest {}; +RAPIDJSON_NAMESPACE_END + +#if defined(__GNUC__) || defined(__clang__) +#define RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE __attribute__((unused)) +#else +#define RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE +#endif +#ifndef __clang__ +//!@endcond +#endif + +/*! \def RAPIDJSON_STATIC_ASSERT + \brief (Internal) macro to check for conditions at compile-time + \param x compile-time condition + \hideinitializer + */ +#define RAPIDJSON_STATIC_ASSERT(x) \ + typedef ::RAPIDJSON_NAMESPACE::StaticAssertTest< \ + sizeof(::RAPIDJSON_NAMESPACE::STATIC_ASSERTION_FAILURE)> \ + RAPIDJSON_JOIN(StaticAssertTypedef, __LINE__) RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE +#endif // RAPIDJSON_STATIC_ASSERT + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_LIKELY, RAPIDJSON_UNLIKELY + +//! Compiler branching hint for expression with high probability to be true. +/*! + \ingroup RAPIDJSON_CONFIG + \param x Boolean expression likely to be true. +*/ +#ifndef RAPIDJSON_LIKELY +#if defined(__GNUC__) || defined(__clang__) +#define RAPIDJSON_LIKELY(x) __builtin_expect(!!(x), 1) +#else +#define RAPIDJSON_LIKELY(x) (x) +#endif +#endif + +//! Compiler branching hint for expression with low probability to be true. +/*! + \ingroup RAPIDJSON_CONFIG + \param x Boolean expression unlikely to be true. +*/ +#ifndef RAPIDJSON_UNLIKELY +#if defined(__GNUC__) || defined(__clang__) +#define RAPIDJSON_UNLIKELY(x) __builtin_expect(!!(x), 0) +#else +#define RAPIDJSON_UNLIKELY(x) (x) +#endif +#endif + +/////////////////////////////////////////////////////////////////////////////// +// Helpers + +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN + +#define RAPIDJSON_MULTILINEMACRO_BEGIN do { +#define RAPIDJSON_MULTILINEMACRO_END \ +} while((void)0, 0) + +// adopted from Boost +#define RAPIDJSON_VERSION_CODE(x,y,z) \ + (((x)*100000) + ((y)*100) + (z)) + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_DIAG_PUSH/POP, RAPIDJSON_DIAG_OFF + +#if defined(__GNUC__) +#define RAPIDJSON_GNUC \ + RAPIDJSON_VERSION_CODE(__GNUC__,__GNUC_MINOR__,__GNUC_PATCHLEVEL__) +#endif + +#if defined(__clang__) || (defined(RAPIDJSON_GNUC) && RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,2,0)) + +#define RAPIDJSON_PRAGMA(x) _Pragma(RAPIDJSON_STRINGIFY(x)) +#define RAPIDJSON_DIAG_PRAGMA(x) RAPIDJSON_PRAGMA(GCC diagnostic x) +#define RAPIDJSON_DIAG_OFF(x) \ + RAPIDJSON_DIAG_PRAGMA(ignored RAPIDJSON_STRINGIFY(RAPIDJSON_JOIN(-W,x))) + +// push/pop support in Clang and GCC>=4.6 +#if defined(__clang__) || (defined(RAPIDJSON_GNUC) && RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,6,0)) +#define RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_PRAGMA(push) +#define RAPIDJSON_DIAG_POP RAPIDJSON_DIAG_PRAGMA(pop) +#else // GCC >= 4.2, < 4.6 +#define RAPIDJSON_DIAG_PUSH /* ignored */ +#define RAPIDJSON_DIAG_POP /* ignored */ +#endif + +#elif defined(_MSC_VER) + +// pragma (MSVC specific) +#define RAPIDJSON_PRAGMA(x) __pragma(x) +#define RAPIDJSON_DIAG_PRAGMA(x) RAPIDJSON_PRAGMA(warning(x)) + +#define RAPIDJSON_DIAG_OFF(x) RAPIDJSON_DIAG_PRAGMA(disable: x) +#define RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_PRAGMA(push) +#define RAPIDJSON_DIAG_POP RAPIDJSON_DIAG_PRAGMA(pop) + +#else + +#define RAPIDJSON_DIAG_OFF(x) /* ignored */ +#define RAPIDJSON_DIAG_PUSH /* ignored */ +#define RAPIDJSON_DIAG_POP /* ignored */ + +#endif // RAPIDJSON_DIAG_* + +/////////////////////////////////////////////////////////////////////////////// +// C++11 features + +#ifndef RAPIDJSON_HAS_CXX11_RVALUE_REFS +#if defined(__clang__) +#if __has_feature(cxx_rvalue_references) && \ + (defined(_MSC_VER) || defined(_LIBCPP_VERSION) || defined(__GLIBCXX__) && __GLIBCXX__ >= 20080306) +#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 1 +#else +#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 0 +#endif +#elif (defined(RAPIDJSON_GNUC) && (RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,3,0)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) || \ + (defined(_MSC_VER) && _MSC_VER >= 1600) || \ + (defined(__SUNPRO_CC) && __SUNPRO_CC >= 0x5140 && defined(__GXX_EXPERIMENTAL_CXX0X__)) + +#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 1 +#else +#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 0 +#endif +#endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS + +#ifndef RAPIDJSON_HAS_CXX11_NOEXCEPT +#if defined(__clang__) +#define RAPIDJSON_HAS_CXX11_NOEXCEPT __has_feature(cxx_noexcept) +#elif (defined(RAPIDJSON_GNUC) && (RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,6,0)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) || \ + (defined(_MSC_VER) && _MSC_VER >= 1900) || \ + (defined(__SUNPRO_CC) && __SUNPRO_CC >= 0x5140 && defined(__GXX_EXPERIMENTAL_CXX0X__)) +#define RAPIDJSON_HAS_CXX11_NOEXCEPT 1 +#else +#define RAPIDJSON_HAS_CXX11_NOEXCEPT 0 +#endif +#endif +#if RAPIDJSON_HAS_CXX11_NOEXCEPT +#define RAPIDJSON_NOEXCEPT noexcept +#else +#define RAPIDJSON_NOEXCEPT /* noexcept */ +#endif // RAPIDJSON_HAS_CXX11_NOEXCEPT + +// no automatic detection, yet +#ifndef RAPIDJSON_HAS_CXX11_TYPETRAITS +#if (defined(_MSC_VER) && _MSC_VER >= 1700) +#define RAPIDJSON_HAS_CXX11_TYPETRAITS 1 +#else +#define RAPIDJSON_HAS_CXX11_TYPETRAITS 0 +#endif +#endif + +#ifndef RAPIDJSON_HAS_CXX11_RANGE_FOR +#if defined(__clang__) +#define RAPIDJSON_HAS_CXX11_RANGE_FOR __has_feature(cxx_range_for) +#elif (defined(RAPIDJSON_GNUC) && (RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,6,0)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) || \ + (defined(_MSC_VER) && _MSC_VER >= 1700) || \ + (defined(__SUNPRO_CC) && __SUNPRO_CC >= 0x5140 && defined(__GXX_EXPERIMENTAL_CXX0X__)) +#define RAPIDJSON_HAS_CXX11_RANGE_FOR 1 +#else +#define RAPIDJSON_HAS_CXX11_RANGE_FOR 0 +#endif +#endif // RAPIDJSON_HAS_CXX11_RANGE_FOR + +//!@endcond + +//! Assertion (in non-throwing contexts). + /*! \ingroup RAPIDJSON_CONFIG + Some functions provide a \c noexcept guarantee, if the compiler supports it. + In these cases, the \ref RAPIDJSON_ASSERT macro cannot be overridden to + throw an exception. This macro adds a separate customization point for + such cases. + + Defaults to C \c assert() (as \ref RAPIDJSON_ASSERT), if \c noexcept is + supported, and to \ref RAPIDJSON_ASSERT otherwise. + */ + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_NOEXCEPT_ASSERT + +#ifdef RAPIDJSON_ASSERT_THROWS +#if RAPIDJSON_HAS_CXX11_NOEXCEPT +#define RAPIDJSON_NOEXCEPT_ASSERT(x) +#else +#define RAPIDJSON_NOEXCEPT_ASSERT(x) RAPIDJSON_ASSERT(x) +#endif // RAPIDJSON_HAS_CXX11_NOEXCEPT +#else +#define RAPIDJSON_NOEXCEPT_ASSERT(x) RAPIDJSON_ASSERT(x) +#endif // RAPIDJSON_ASSERT_THROWS + +/////////////////////////////////////////////////////////////////////////////// +// new/delete + +#ifndef RAPIDJSON_NEW +///! customization point for global \c new +#define RAPIDJSON_NEW(TypeName) new TypeName +#endif +#ifndef RAPIDJSON_DELETE +///! customization point for global \c delete +#define RAPIDJSON_DELETE(x) delete x +#endif + +/////////////////////////////////////////////////////////////////////////////// +// Type + +/*! \namespace rapidjson + \brief main RapidJSON namespace + \see RAPIDJSON_NAMESPACE +*/ +RAPIDJSON_NAMESPACE_BEGIN + +//! Type of JSON value +enum Type { + kNullType = 0, //!< null + kFalseType = 1, //!< false + kTrueType = 2, //!< true + kObjectType = 3, //!< object + kArrayType = 4, //!< array + kStringType = 5, //!< string + kNumberType = 6 //!< number +}; + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_RAPIDJSON_H_ diff --git a/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/reader.h b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/reader.h new file mode 100644 index 0000000..44a6bcd --- /dev/null +++ b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/reader.h @@ -0,0 +1,2230 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_READER_H_ +#define RAPIDJSON_READER_H_ + +/*! \file reader.h */ + +#include "allocators.h" +#include "stream.h" +#include "encodedstream.h" +#include "internal/meta.h" +#include "internal/stack.h" +#include "internal/strtod.h" +#include + +#if defined(RAPIDJSON_SIMD) && defined(_MSC_VER) +#include +#pragma intrinsic(_BitScanForward) +#endif +#ifdef RAPIDJSON_SSE42 +#include +#elif defined(RAPIDJSON_SSE2) +#include +#elif defined(RAPIDJSON_NEON) +#include +#endif + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(old-style-cast) +RAPIDJSON_DIAG_OFF(padded) +RAPIDJSON_DIAG_OFF(switch-enum) +#elif defined(_MSC_VER) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4127) // conditional expression is constant +RAPIDJSON_DIAG_OFF(4702) // unreachable code +#endif + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif + +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +#define RAPIDJSON_NOTHING /* deliberately empty */ +#ifndef RAPIDJSON_PARSE_ERROR_EARLY_RETURN +#define RAPIDJSON_PARSE_ERROR_EARLY_RETURN(value) \ + RAPIDJSON_MULTILINEMACRO_BEGIN \ + if (RAPIDJSON_UNLIKELY(HasParseError())) { return value; } \ + RAPIDJSON_MULTILINEMACRO_END +#endif +#define RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID \ + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING) +//!@endcond + +/*! \def RAPIDJSON_PARSE_ERROR_NORETURN + \ingroup RAPIDJSON_ERRORS + \brief Macro to indicate a parse error. + \param parseErrorCode \ref rapidjson::ParseErrorCode of the error + \param offset position of the error in JSON input (\c size_t) + + This macros can be used as a customization point for the internal + error handling mechanism of RapidJSON. + + A common usage model is to throw an exception instead of requiring the + caller to explicitly check the \ref rapidjson::GenericReader::Parse's + return value: + + \code + #define RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode,offset) \ + throw ParseException(parseErrorCode, #parseErrorCode, offset) + + #include // std::runtime_error + #include "rapidjson/error/error.h" // rapidjson::ParseResult + + struct ParseException : std::runtime_error, rapidjson::ParseResult { + ParseException(rapidjson::ParseErrorCode code, const char* msg, size_t offset) + : std::runtime_error(msg), ParseResult(code, offset) {} + }; + + #include "rapidjson/reader.h" + \endcode + + \see RAPIDJSON_PARSE_ERROR, rapidjson::GenericReader::Parse + */ +#ifndef RAPIDJSON_PARSE_ERROR_NORETURN +#define RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset) \ + RAPIDJSON_MULTILINEMACRO_BEGIN \ + RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \ + SetParseError(parseErrorCode, offset); \ + RAPIDJSON_MULTILINEMACRO_END +#endif + +/*! \def RAPIDJSON_PARSE_ERROR + \ingroup RAPIDJSON_ERRORS + \brief (Internal) macro to indicate and handle a parse error. + \param parseErrorCode \ref rapidjson::ParseErrorCode of the error + \param offset position of the error in JSON input (\c size_t) + + Invokes RAPIDJSON_PARSE_ERROR_NORETURN and stops the parsing. + + \see RAPIDJSON_PARSE_ERROR_NORETURN + \hideinitializer + */ +#ifndef RAPIDJSON_PARSE_ERROR +#define RAPIDJSON_PARSE_ERROR(parseErrorCode, offset) \ + RAPIDJSON_MULTILINEMACRO_BEGIN \ + RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \ + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \ + RAPIDJSON_MULTILINEMACRO_END +#endif + +#include "error/error.h" // ParseErrorCode, ParseResult + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// ParseFlag + +/*! \def RAPIDJSON_PARSE_DEFAULT_FLAGS + \ingroup RAPIDJSON_CONFIG + \brief User-defined kParseDefaultFlags definition. + + User can define this as any \c ParseFlag combinations. +*/ +#ifndef RAPIDJSON_PARSE_DEFAULT_FLAGS +#define RAPIDJSON_PARSE_DEFAULT_FLAGS kParseNoFlags +#endif + +//! Combination of parseFlags +/*! \see Reader::Parse, Document::Parse, Document::ParseInsitu, Document::ParseStream + */ +enum ParseFlag { + kParseNoFlags = 0, //!< No flags are set. + kParseInsituFlag = 1, //!< In-situ(destructive) parsing. + kParseValidateEncodingFlag = 2, //!< Validate encoding of JSON strings. + kParseIterativeFlag = 4, //!< Iterative(constant complexity in terms of function call stack size) parsing. + kParseStopWhenDoneFlag = 8, //!< After parsing a complete JSON root from stream, stop further processing the rest of stream. When this flag is used, parser will not generate kParseErrorDocumentRootNotSingular error. + kParseFullPrecisionFlag = 16, //!< Parse number in full precision (but slower). + kParseCommentsFlag = 32, //!< Allow one-line (//) and multi-line (/**/) comments. + kParseNumbersAsStringsFlag = 64, //!< Parse all numbers (ints/doubles) as strings. + kParseTrailingCommasFlag = 128, //!< Allow trailing commas at the end of objects and arrays. + kParseNanAndInfFlag = 256, //!< Allow parsing NaN, Inf, Infinity, -Inf and -Infinity as doubles. + kParseDefaultFlags = RAPIDJSON_PARSE_DEFAULT_FLAGS //!< Default parse flags. Can be customized by defining RAPIDJSON_PARSE_DEFAULT_FLAGS +}; + +/////////////////////////////////////////////////////////////////////////////// +// Handler + +/*! \class rapidjson::Handler + \brief Concept for receiving events from GenericReader upon parsing. + The functions return true if no error occurs. If they return false, + the event publisher should terminate the process. +\code +concept Handler { + typename Ch; + + bool Null(); + bool Bool(bool b); + bool Int(int i); + bool Uint(unsigned i); + bool Int64(int64_t i); + bool Uint64(uint64_t i); + bool Double(double d); + /// enabled via kParseNumbersAsStringsFlag, string is not null-terminated (use length) + bool RawNumber(const Ch* str, SizeType length, bool copy); + bool String(const Ch* str, SizeType length, bool copy); + bool StartObject(); + bool Key(const Ch* str, SizeType length, bool copy); + bool EndObject(SizeType memberCount); + bool StartArray(); + bool EndArray(SizeType elementCount); +}; +\endcode +*/ +/////////////////////////////////////////////////////////////////////////////// +// BaseReaderHandler + +//! Default implementation of Handler. +/*! This can be used as base class of any reader handler. + \note implements Handler concept +*/ +template, typename Derived = void> +struct BaseReaderHandler { + typedef typename Encoding::Ch Ch; + + typedef typename internal::SelectIf, BaseReaderHandler, Derived>::Type Override; + + bool Default() { return true; } + bool Null() { return static_cast(*this).Default(); } + bool Bool(bool) { return static_cast(*this).Default(); } + bool Int(int) { return static_cast(*this).Default(); } + bool Uint(unsigned) { return static_cast(*this).Default(); } + bool Int64(int64_t) { return static_cast(*this).Default(); } + bool Uint64(uint64_t) { return static_cast(*this).Default(); } + bool Double(double) { return static_cast(*this).Default(); } + /// enabled via kParseNumbersAsStringsFlag, string is not null-terminated (use length) + bool RawNumber(const Ch* str, SizeType len, bool copy) { return static_cast(*this).String(str, len, copy); } + bool String(const Ch*, SizeType, bool) { return static_cast(*this).Default(); } + bool StartObject() { return static_cast(*this).Default(); } + bool Key(const Ch* str, SizeType len, bool copy) { return static_cast(*this).String(str, len, copy); } + bool EndObject(SizeType) { return static_cast(*this).Default(); } + bool StartArray() { return static_cast(*this).Default(); } + bool EndArray(SizeType) { return static_cast(*this).Default(); } +}; + +/////////////////////////////////////////////////////////////////////////////// +// StreamLocalCopy + +namespace internal { + +template::copyOptimization> +class StreamLocalCopy; + +//! Do copy optimization. +template +class StreamLocalCopy { +public: + StreamLocalCopy(Stream& original) : s(original), original_(original) {} + ~StreamLocalCopy() { original_ = s; } + + Stream s; + +private: + StreamLocalCopy& operator=(const StreamLocalCopy&) /* = delete */; + + Stream& original_; +}; + +//! Keep reference. +template +class StreamLocalCopy { +public: + StreamLocalCopy(Stream& original) : s(original) {} + + Stream& s; + +private: + StreamLocalCopy& operator=(const StreamLocalCopy&) /* = delete */; +}; + +} // namespace internal + +/////////////////////////////////////////////////////////////////////////////// +// SkipWhitespace + +//! Skip the JSON white spaces in a stream. +/*! \param is A input stream for skipping white spaces. + \note This function has SSE2/SSE4.2 specialization. +*/ +template +void SkipWhitespace(InputStream& is) { + internal::StreamLocalCopy copy(is); + InputStream& s(copy.s); + + typename InputStream::Ch c; + while ((c = s.Peek()) == ' ' || c == '\n' || c == '\r' || c == '\t') + s.Take(); +} + +inline const char* SkipWhitespace(const char* p, const char* end) { + while (p != end && (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t')) + ++p; + return p; +} + +#ifdef RAPIDJSON_SSE42 +//! Skip whitespace with SSE 4.2 pcmpistrm instruction, testing 16 8-byte characters at once. +inline const char *SkipWhitespace_SIMD(const char* p) { + // Fast return for single non-whitespace + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') + ++p; + else + return p; + + // 16-byte align to the next boundary + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + while (p != nextAligned) + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') + ++p; + else + return p; + + // The rest of string using SIMD + static const char whitespace[16] = " \n\r\t"; + const __m128i w = _mm_loadu_si128(reinterpret_cast(&whitespace[0])); + + for (;; p += 16) { + const __m128i s = _mm_load_si128(reinterpret_cast(p)); + const int r = _mm_cmpistri(w, s, _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_LEAST_SIGNIFICANT | _SIDD_NEGATIVE_POLARITY); + if (r != 16) // some of characters is non-whitespace + return p + r; + } +} + +inline const char *SkipWhitespace_SIMD(const char* p, const char* end) { + // Fast return for single non-whitespace + if (p != end && (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t')) + ++p; + else + return p; + + // The middle of string using SIMD + static const char whitespace[16] = " \n\r\t"; + const __m128i w = _mm_loadu_si128(reinterpret_cast(&whitespace[0])); + + for (; p <= end - 16; p += 16) { + const __m128i s = _mm_loadu_si128(reinterpret_cast(p)); + const int r = _mm_cmpistri(w, s, _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_LEAST_SIGNIFICANT | _SIDD_NEGATIVE_POLARITY); + if (r != 16) // some of characters is non-whitespace + return p + r; + } + + return SkipWhitespace(p, end); +} + +#elif defined(RAPIDJSON_SSE2) + +//! Skip whitespace with SSE2 instructions, testing 16 8-byte characters at once. +inline const char *SkipWhitespace_SIMD(const char* p) { + // Fast return for single non-whitespace + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') + ++p; + else + return p; + + // 16-byte align to the next boundary + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + while (p != nextAligned) + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') + ++p; + else + return p; + + // The rest of string + #define C16(c) { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c } + static const char whitespaces[4][16] = { C16(' '), C16('\n'), C16('\r'), C16('\t') }; + #undef C16 + + const __m128i w0 = _mm_loadu_si128(reinterpret_cast(&whitespaces[0][0])); + const __m128i w1 = _mm_loadu_si128(reinterpret_cast(&whitespaces[1][0])); + const __m128i w2 = _mm_loadu_si128(reinterpret_cast(&whitespaces[2][0])); + const __m128i w3 = _mm_loadu_si128(reinterpret_cast(&whitespaces[3][0])); + + for (;; p += 16) { + const __m128i s = _mm_load_si128(reinterpret_cast(p)); + __m128i x = _mm_cmpeq_epi8(s, w0); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w1)); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w2)); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w3)); + unsigned short r = static_cast(~_mm_movemask_epi8(x)); + if (r != 0) { // some of characters may be non-whitespace +#ifdef _MSC_VER // Find the index of first non-whitespace + unsigned long offset; + _BitScanForward(&offset, r); + return p + offset; +#else + return p + __builtin_ffs(r) - 1; +#endif + } + } +} + +inline const char *SkipWhitespace_SIMD(const char* p, const char* end) { + // Fast return for single non-whitespace + if (p != end && (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t')) + ++p; + else + return p; + + // The rest of string + #define C16(c) { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c } + static const char whitespaces[4][16] = { C16(' '), C16('\n'), C16('\r'), C16('\t') }; + #undef C16 + + const __m128i w0 = _mm_loadu_si128(reinterpret_cast(&whitespaces[0][0])); + const __m128i w1 = _mm_loadu_si128(reinterpret_cast(&whitespaces[1][0])); + const __m128i w2 = _mm_loadu_si128(reinterpret_cast(&whitespaces[2][0])); + const __m128i w3 = _mm_loadu_si128(reinterpret_cast(&whitespaces[3][0])); + + for (; p <= end - 16; p += 16) { + const __m128i s = _mm_loadu_si128(reinterpret_cast(p)); + __m128i x = _mm_cmpeq_epi8(s, w0); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w1)); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w2)); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w3)); + unsigned short r = static_cast(~_mm_movemask_epi8(x)); + if (r != 0) { // some of characters may be non-whitespace +#ifdef _MSC_VER // Find the index of first non-whitespace + unsigned long offset; + _BitScanForward(&offset, r); + return p + offset; +#else + return p + __builtin_ffs(r) - 1; +#endif + } + } + + return SkipWhitespace(p, end); +} + +#elif defined(RAPIDJSON_NEON) + +//! Skip whitespace with ARM Neon instructions, testing 16 8-byte characters at once. +inline const char *SkipWhitespace_SIMD(const char* p) { + // Fast return for single non-whitespace + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') + ++p; + else + return p; + + // 16-byte align to the next boundary + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + while (p != nextAligned) + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') + ++p; + else + return p; + + const uint8x16_t w0 = vmovq_n_u8(' '); + const uint8x16_t w1 = vmovq_n_u8('\n'); + const uint8x16_t w2 = vmovq_n_u8('\r'); + const uint8x16_t w3 = vmovq_n_u8('\t'); + + for (;; p += 16) { + const uint8x16_t s = vld1q_u8(reinterpret_cast(p)); + uint8x16_t x = vceqq_u8(s, w0); + x = vorrq_u8(x, vceqq_u8(s, w1)); + x = vorrq_u8(x, vceqq_u8(s, w2)); + x = vorrq_u8(x, vceqq_u8(s, w3)); + + x = vmvnq_u8(x); // Negate + x = vrev64q_u8(x); // Rev in 64 + uint64_t low = vgetq_lane_u64(reinterpret_cast(x), 0); // extract + uint64_t high = vgetq_lane_u64(reinterpret_cast(x), 1); // extract + + if (low == 0) { + if (high != 0) { + int lz =__builtin_clzll(high);; + return p + 8 + (lz >> 3); + } + } else { + int lz = __builtin_clzll(low);; + return p + (lz >> 3); + } + } +} + +inline const char *SkipWhitespace_SIMD(const char* p, const char* end) { + // Fast return for single non-whitespace + if (p != end && (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t')) + ++p; + else + return p; + + const uint8x16_t w0 = vmovq_n_u8(' '); + const uint8x16_t w1 = vmovq_n_u8('\n'); + const uint8x16_t w2 = vmovq_n_u8('\r'); + const uint8x16_t w3 = vmovq_n_u8('\t'); + + for (; p <= end - 16; p += 16) { + const uint8x16_t s = vld1q_u8(reinterpret_cast(p)); + uint8x16_t x = vceqq_u8(s, w0); + x = vorrq_u8(x, vceqq_u8(s, w1)); + x = vorrq_u8(x, vceqq_u8(s, w2)); + x = vorrq_u8(x, vceqq_u8(s, w3)); + + x = vmvnq_u8(x); // Negate + x = vrev64q_u8(x); // Rev in 64 + uint64_t low = vgetq_lane_u64(reinterpret_cast(x), 0); // extract + uint64_t high = vgetq_lane_u64(reinterpret_cast(x), 1); // extract + + if (low == 0) { + if (high != 0) { + int lz = __builtin_clzll(high); + return p + 8 + (lz >> 3); + } + } else { + int lz = __builtin_clzll(low); + return p + (lz >> 3); + } + } + + return SkipWhitespace(p, end); +} + +#endif // RAPIDJSON_NEON + +#ifdef RAPIDJSON_SIMD +//! Template function specialization for InsituStringStream +template<> inline void SkipWhitespace(InsituStringStream& is) { + is.src_ = const_cast(SkipWhitespace_SIMD(is.src_)); +} + +//! Template function specialization for StringStream +template<> inline void SkipWhitespace(StringStream& is) { + is.src_ = SkipWhitespace_SIMD(is.src_); +} + +template<> inline void SkipWhitespace(EncodedInputStream, MemoryStream>& is) { + is.is_.src_ = SkipWhitespace_SIMD(is.is_.src_, is.is_.end_); +} +#endif // RAPIDJSON_SIMD + +/////////////////////////////////////////////////////////////////////////////// +// GenericReader + +//! SAX-style JSON parser. Use \ref Reader for UTF8 encoding and default allocator. +/*! GenericReader parses JSON text from a stream, and send events synchronously to an + object implementing Handler concept. + + It needs to allocate a stack for storing a single decoded string during + non-destructive parsing. + + For in-situ parsing, the decoded string is directly written to the source + text string, no temporary buffer is required. + + A GenericReader object can be reused for parsing multiple JSON text. + + \tparam SourceEncoding Encoding of the input stream. + \tparam TargetEncoding Encoding of the parse output. + \tparam StackAllocator Allocator type for stack. +*/ +template +class GenericReader { +public: + typedef typename SourceEncoding::Ch Ch; //!< SourceEncoding character type + + //! Constructor. + /*! \param stackAllocator Optional allocator for allocating stack memory. (Only use for non-destructive parsing) + \param stackCapacity stack capacity in bytes for storing a single decoded string. (Only use for non-destructive parsing) + */ + GenericReader(StackAllocator* stackAllocator = 0, size_t stackCapacity = kDefaultStackCapacity) : + stack_(stackAllocator, stackCapacity), parseResult_(), state_(IterativeParsingStartState) {} + + //! Parse JSON text. + /*! \tparam parseFlags Combination of \ref ParseFlag. + \tparam InputStream Type of input stream, implementing Stream concept. + \tparam Handler Type of handler, implementing Handler concept. + \param is Input stream to be parsed. + \param handler The handler to receive events. + \return Whether the parsing is successful. + */ + template + ParseResult Parse(InputStream& is, Handler& handler) { + if (parseFlags & kParseIterativeFlag) + return IterativeParse(is, handler); + + parseResult_.Clear(); + + ClearStackOnExit scope(*this); + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + + if (RAPIDJSON_UNLIKELY(is.Peek() == '\0')) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorDocumentEmpty, is.Tell()); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + } + else { + ParseValue(is, handler); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + + if (!(parseFlags & kParseStopWhenDoneFlag)) { + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + + if (RAPIDJSON_UNLIKELY(is.Peek() != '\0')) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorDocumentRootNotSingular, is.Tell()); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + } + } + } + + return parseResult_; + } + + //! Parse JSON text (with \ref kParseDefaultFlags) + /*! \tparam InputStream Type of input stream, implementing Stream concept + \tparam Handler Type of handler, implementing Handler concept. + \param is Input stream to be parsed. + \param handler The handler to receive events. + \return Whether the parsing is successful. + */ + template + ParseResult Parse(InputStream& is, Handler& handler) { + return Parse(is, handler); + } + + //! Initialize JSON text token-by-token parsing + /*! + */ + void IterativeParseInit() { + parseResult_.Clear(); + state_ = IterativeParsingStartState; + } + + //! Parse one token from JSON text + /*! \tparam InputStream Type of input stream, implementing Stream concept + \tparam Handler Type of handler, implementing Handler concept. + \param is Input stream to be parsed. + \param handler The handler to receive events. + \return Whether the parsing is successful. + */ + template + bool IterativeParseNext(InputStream& is, Handler& handler) { + while (RAPIDJSON_LIKELY(is.Peek() != '\0')) { + SkipWhitespaceAndComments(is); + + Token t = Tokenize(is.Peek()); + IterativeParsingState n = Predict(state_, t); + IterativeParsingState d = Transit(state_, t, n, is, handler); + + // If we've finished or hit an error... + if (RAPIDJSON_UNLIKELY(IsIterativeParsingCompleteState(d))) { + // Report errors. + if (d == IterativeParsingErrorState) { + HandleError(state_, is); + return false; + } + + // Transition to the finish state. + RAPIDJSON_ASSERT(d == IterativeParsingFinishState); + state_ = d; + + // If StopWhenDone is not set... + if (!(parseFlags & kParseStopWhenDoneFlag)) { + // ... and extra non-whitespace data is found... + SkipWhitespaceAndComments(is); + if (is.Peek() != '\0') { + // ... this is considered an error. + HandleError(state_, is); + return false; + } + } + + // Success! We are done! + return true; + } + + // Transition to the new state. + state_ = d; + + // If we parsed anything other than a delimiter, we invoked the handler, so we can return true now. + if (!IsIterativeParsingDelimiterState(n)) + return true; + } + + // We reached the end of file. + stack_.Clear(); + + if (state_ != IterativeParsingFinishState) { + HandleError(state_, is); + return false; + } + + return true; + } + + //! Check if token-by-token parsing JSON text is complete + /*! \return Whether the JSON has been fully decoded. + */ + RAPIDJSON_FORCEINLINE bool IterativeParseComplete() const { + return IsIterativeParsingCompleteState(state_); + } + + //! Whether a parse error has occurred in the last parsing. + bool HasParseError() const { return parseResult_.IsError(); } + + //! Get the \ref ParseErrorCode of last parsing. + ParseErrorCode GetParseErrorCode() const { return parseResult_.Code(); } + + //! Get the position of last parsing error in input, 0 otherwise. + size_t GetErrorOffset() const { return parseResult_.Offset(); } + +protected: + void SetParseError(ParseErrorCode code, size_t offset) { parseResult_.Set(code, offset); } + +private: + // Prohibit copy constructor & assignment operator. + GenericReader(const GenericReader&); + GenericReader& operator=(const GenericReader&); + + void ClearStack() { stack_.Clear(); } + + // clear stack on any exit from ParseStream, e.g. due to exception + struct ClearStackOnExit { + explicit ClearStackOnExit(GenericReader& r) : r_(r) {} + ~ClearStackOnExit() { r_.ClearStack(); } + private: + GenericReader& r_; + ClearStackOnExit(const ClearStackOnExit&); + ClearStackOnExit& operator=(const ClearStackOnExit&); + }; + + template + void SkipWhitespaceAndComments(InputStream& is) { + SkipWhitespace(is); + + if (parseFlags & kParseCommentsFlag) { + while (RAPIDJSON_UNLIKELY(Consume(is, '/'))) { + if (Consume(is, '*')) { + while (true) { + if (RAPIDJSON_UNLIKELY(is.Peek() == '\0')) + RAPIDJSON_PARSE_ERROR(kParseErrorUnspecificSyntaxError, is.Tell()); + else if (Consume(is, '*')) { + if (Consume(is, '/')) + break; + } + else + is.Take(); + } + } + else if (RAPIDJSON_LIKELY(Consume(is, '/'))) + while (is.Peek() != '\0' && is.Take() != '\n') {} + else + RAPIDJSON_PARSE_ERROR(kParseErrorUnspecificSyntaxError, is.Tell()); + + SkipWhitespace(is); + } + } + } + + // Parse object: { string : value, ... } + template + void ParseObject(InputStream& is, Handler& handler) { + RAPIDJSON_ASSERT(is.Peek() == '{'); + is.Take(); // Skip '{' + + if (RAPIDJSON_UNLIKELY(!handler.StartObject())) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + if (Consume(is, '}')) { + if (RAPIDJSON_UNLIKELY(!handler.EndObject(0))) // empty object + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + return; + } + + for (SizeType memberCount = 0;;) { + if (RAPIDJSON_UNLIKELY(is.Peek() != '"')) + RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissName, is.Tell()); + + ParseString(is, handler, true); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + if (RAPIDJSON_UNLIKELY(!Consume(is, ':'))) + RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissColon, is.Tell()); + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + ParseValue(is, handler); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + ++memberCount; + + switch (is.Peek()) { + case ',': + is.Take(); + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + break; + case '}': + is.Take(); + if (RAPIDJSON_UNLIKELY(!handler.EndObject(memberCount))) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + return; + default: + RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissCommaOrCurlyBracket, is.Tell()); break; // This useless break is only for making warning and coverage happy + } + + if (parseFlags & kParseTrailingCommasFlag) { + if (is.Peek() == '}') { + if (RAPIDJSON_UNLIKELY(!handler.EndObject(memberCount))) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + is.Take(); + return; + } + } + } + } + + // Parse array: [ value, ... ] + template + void ParseArray(InputStream& is, Handler& handler) { + RAPIDJSON_ASSERT(is.Peek() == '['); + is.Take(); // Skip '[' + + if (RAPIDJSON_UNLIKELY(!handler.StartArray())) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + if (Consume(is, ']')) { + if (RAPIDJSON_UNLIKELY(!handler.EndArray(0))) // empty array + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + return; + } + + for (SizeType elementCount = 0;;) { + ParseValue(is, handler); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + ++elementCount; + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + if (Consume(is, ',')) { + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + } + else if (Consume(is, ']')) { + if (RAPIDJSON_UNLIKELY(!handler.EndArray(elementCount))) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + return; + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorArrayMissCommaOrSquareBracket, is.Tell()); + + if (parseFlags & kParseTrailingCommasFlag) { + if (is.Peek() == ']') { + if (RAPIDJSON_UNLIKELY(!handler.EndArray(elementCount))) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + is.Take(); + return; + } + } + } + } + + template + void ParseNull(InputStream& is, Handler& handler) { + RAPIDJSON_ASSERT(is.Peek() == 'n'); + is.Take(); + + if (RAPIDJSON_LIKELY(Consume(is, 'u') && Consume(is, 'l') && Consume(is, 'l'))) { + if (RAPIDJSON_UNLIKELY(!handler.Null())) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell()); + } + + template + void ParseTrue(InputStream& is, Handler& handler) { + RAPIDJSON_ASSERT(is.Peek() == 't'); + is.Take(); + + if (RAPIDJSON_LIKELY(Consume(is, 'r') && Consume(is, 'u') && Consume(is, 'e'))) { + if (RAPIDJSON_UNLIKELY(!handler.Bool(true))) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell()); + } + + template + void ParseFalse(InputStream& is, Handler& handler) { + RAPIDJSON_ASSERT(is.Peek() == 'f'); + is.Take(); + + if (RAPIDJSON_LIKELY(Consume(is, 'a') && Consume(is, 'l') && Consume(is, 's') && Consume(is, 'e'))) { + if (RAPIDJSON_UNLIKELY(!handler.Bool(false))) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell()); + } + + template + RAPIDJSON_FORCEINLINE static bool Consume(InputStream& is, typename InputStream::Ch expect) { + if (RAPIDJSON_LIKELY(is.Peek() == expect)) { + is.Take(); + return true; + } + else + return false; + } + + // Helper function to parse four hexadecimal digits in \uXXXX in ParseString(). + template + unsigned ParseHex4(InputStream& is, size_t escapeOffset) { + unsigned codepoint = 0; + for (int i = 0; i < 4; i++) { + Ch c = is.Peek(); + codepoint <<= 4; + codepoint += static_cast(c); + if (c >= '0' && c <= '9') + codepoint -= '0'; + else if (c >= 'A' && c <= 'F') + codepoint -= 'A' - 10; + else if (c >= 'a' && c <= 'f') + codepoint -= 'a' - 10; + else { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorStringUnicodeEscapeInvalidHex, escapeOffset); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(0); + } + is.Take(); + } + return codepoint; + } + + template + class StackStream { + public: + typedef CharType Ch; + + StackStream(internal::Stack& stack) : stack_(stack), length_(0) {} + RAPIDJSON_FORCEINLINE void Put(Ch c) { + *stack_.template Push() = c; + ++length_; + } + + RAPIDJSON_FORCEINLINE void* Push(SizeType count) { + length_ += count; + return stack_.template Push(count); + } + + size_t Length() const { return length_; } + + Ch* Pop() { + return stack_.template Pop(length_); + } + + private: + StackStream(const StackStream&); + StackStream& operator=(const StackStream&); + + internal::Stack& stack_; + SizeType length_; + }; + + // Parse string and generate String event. Different code paths for kParseInsituFlag. + template + void ParseString(InputStream& is, Handler& handler, bool isKey = false) { + internal::StreamLocalCopy copy(is); + InputStream& s(copy.s); + + RAPIDJSON_ASSERT(s.Peek() == '\"'); + s.Take(); // Skip '\"' + + bool success = false; + if (parseFlags & kParseInsituFlag) { + typename InputStream::Ch *head = s.PutBegin(); + ParseStringToStream(s, s); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + size_t length = s.PutEnd(head) - 1; + RAPIDJSON_ASSERT(length <= 0xFFFFFFFF); + const typename TargetEncoding::Ch* const str = reinterpret_cast(head); + success = (isKey ? handler.Key(str, SizeType(length), false) : handler.String(str, SizeType(length), false)); + } + else { + StackStream stackStream(stack_); + ParseStringToStream(s, stackStream); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + SizeType length = static_cast(stackStream.Length()) - 1; + const typename TargetEncoding::Ch* const str = stackStream.Pop(); + success = (isKey ? handler.Key(str, length, true) : handler.String(str, length, true)); + } + if (RAPIDJSON_UNLIKELY(!success)) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, s.Tell()); + } + + // Parse string to an output is + // This function handles the prefix/suffix double quotes, escaping, and optional encoding validation. + template + RAPIDJSON_FORCEINLINE void ParseStringToStream(InputStream& is, OutputStream& os) { +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +#define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + static const char escape[256] = { + Z16, Z16, 0, 0,'\"', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,'/', + Z16, Z16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,'\\', 0, 0, 0, + 0, 0,'\b', 0, 0, 0,'\f', 0, 0, 0, 0, 0, 0, 0,'\n', 0, + 0, 0,'\r', 0,'\t', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16 + }; +#undef Z16 +//!@endcond + + for (;;) { + // Scan and copy string before "\\\"" or < 0x20. This is an optional optimzation. + if (!(parseFlags & kParseValidateEncodingFlag)) + ScanCopyUnescapedString(is, os); + + Ch c = is.Peek(); + if (RAPIDJSON_UNLIKELY(c == '\\')) { // Escape + size_t escapeOffset = is.Tell(); // For invalid escaping, report the initial '\\' as error offset + is.Take(); + Ch e = is.Peek(); + if ((sizeof(Ch) == 1 || unsigned(e) < 256) && RAPIDJSON_LIKELY(escape[static_cast(e)])) { + is.Take(); + os.Put(static_cast(escape[static_cast(e)])); + } + else if (RAPIDJSON_LIKELY(e == 'u')) { // Unicode + is.Take(); + unsigned codepoint = ParseHex4(is, escapeOffset); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + if (RAPIDJSON_UNLIKELY(codepoint >= 0xD800 && codepoint <= 0xDBFF)) { + // Handle UTF-16 surrogate pair + if (RAPIDJSON_UNLIKELY(!Consume(is, '\\') || !Consume(is, 'u'))) + RAPIDJSON_PARSE_ERROR(kParseErrorStringUnicodeSurrogateInvalid, escapeOffset); + unsigned codepoint2 = ParseHex4(is, escapeOffset); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + if (RAPIDJSON_UNLIKELY(codepoint2 < 0xDC00 || codepoint2 > 0xDFFF)) + RAPIDJSON_PARSE_ERROR(kParseErrorStringUnicodeSurrogateInvalid, escapeOffset); + codepoint = (((codepoint - 0xD800) << 10) | (codepoint2 - 0xDC00)) + 0x10000; + } + TEncoding::Encode(os, codepoint); + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorStringEscapeInvalid, escapeOffset); + } + else if (RAPIDJSON_UNLIKELY(c == '"')) { // Closing double quote + is.Take(); + os.Put('\0'); // null-terminate the string + return; + } + else if (RAPIDJSON_UNLIKELY(static_cast(c) < 0x20)) { // RFC 4627: unescaped = %x20-21 / %x23-5B / %x5D-10FFFF + if (c == '\0') + RAPIDJSON_PARSE_ERROR(kParseErrorStringMissQuotationMark, is.Tell()); + else + RAPIDJSON_PARSE_ERROR(kParseErrorStringInvalidEncoding, is.Tell()); + } + else { + size_t offset = is.Tell(); + if (RAPIDJSON_UNLIKELY((parseFlags & kParseValidateEncodingFlag ? + !Transcoder::Validate(is, os) : + !Transcoder::Transcode(is, os)))) + RAPIDJSON_PARSE_ERROR(kParseErrorStringInvalidEncoding, offset); + } + } + } + + template + static RAPIDJSON_FORCEINLINE void ScanCopyUnescapedString(InputStream&, OutputStream&) { + // Do nothing for generic version + } + +#if defined(RAPIDJSON_SSE2) || defined(RAPIDJSON_SSE42) + // StringStream -> StackStream + static RAPIDJSON_FORCEINLINE void ScanCopyUnescapedString(StringStream& is, StackStream& os) { + const char* p = is.src_; + + // Scan one by one until alignment (unaligned load may cross page boundary and cause crash) + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + while (p != nextAligned) + if (RAPIDJSON_UNLIKELY(*p == '\"') || RAPIDJSON_UNLIKELY(*p == '\\') || RAPIDJSON_UNLIKELY(static_cast(*p) < 0x20)) { + is.src_ = p; + return; + } + else + os.Put(*p++); + + // The rest of string using SIMD + static const char dquote[16] = { '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"' }; + static const char bslash[16] = { '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\' }; + static const char space[16] = { 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F }; + const __m128i dq = _mm_loadu_si128(reinterpret_cast(&dquote[0])); + const __m128i bs = _mm_loadu_si128(reinterpret_cast(&bslash[0])); + const __m128i sp = _mm_loadu_si128(reinterpret_cast(&space[0])); + + for (;; p += 16) { + const __m128i s = _mm_load_si128(reinterpret_cast(p)); + const __m128i t1 = _mm_cmpeq_epi8(s, dq); + const __m128i t2 = _mm_cmpeq_epi8(s, bs); + const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp); // s < 0x20 <=> max(s, 0x1F) == 0x1F + const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3); + unsigned short r = static_cast(_mm_movemask_epi8(x)); + if (RAPIDJSON_UNLIKELY(r != 0)) { // some of characters is escaped + SizeType length; + #ifdef _MSC_VER // Find the index of first escaped + unsigned long offset; + _BitScanForward(&offset, r); + length = offset; + #else + length = static_cast(__builtin_ffs(r) - 1); + #endif + if (length != 0) { + char* q = reinterpret_cast(os.Push(length)); + for (size_t i = 0; i < length; i++) + q[i] = p[i]; + + p += length; + } + break; + } + _mm_storeu_si128(reinterpret_cast<__m128i *>(os.Push(16)), s); + } + + is.src_ = p; + } + + // InsituStringStream -> InsituStringStream + static RAPIDJSON_FORCEINLINE void ScanCopyUnescapedString(InsituStringStream& is, InsituStringStream& os) { + RAPIDJSON_ASSERT(&is == &os); + (void)os; + + if (is.src_ == is.dst_) { + SkipUnescapedString(is); + return; + } + + char* p = is.src_; + char *q = is.dst_; + + // Scan one by one until alignment (unaligned load may cross page boundary and cause crash) + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + while (p != nextAligned) + if (RAPIDJSON_UNLIKELY(*p == '\"') || RAPIDJSON_UNLIKELY(*p == '\\') || RAPIDJSON_UNLIKELY(static_cast(*p) < 0x20)) { + is.src_ = p; + is.dst_ = q; + return; + } + else + *q++ = *p++; + + // The rest of string using SIMD + static const char dquote[16] = { '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"' }; + static const char bslash[16] = { '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\' }; + static const char space[16] = { 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F }; + const __m128i dq = _mm_loadu_si128(reinterpret_cast(&dquote[0])); + const __m128i bs = _mm_loadu_si128(reinterpret_cast(&bslash[0])); + const __m128i sp = _mm_loadu_si128(reinterpret_cast(&space[0])); + + for (;; p += 16, q += 16) { + const __m128i s = _mm_load_si128(reinterpret_cast(p)); + const __m128i t1 = _mm_cmpeq_epi8(s, dq); + const __m128i t2 = _mm_cmpeq_epi8(s, bs); + const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp); // s < 0x20 <=> max(s, 0x1F) == 0x1F + const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3); + unsigned short r = static_cast(_mm_movemask_epi8(x)); + if (RAPIDJSON_UNLIKELY(r != 0)) { // some of characters is escaped + size_t length; +#ifdef _MSC_VER // Find the index of first escaped + unsigned long offset; + _BitScanForward(&offset, r); + length = offset; +#else + length = static_cast(__builtin_ffs(r) - 1); +#endif + for (const char* pend = p + length; p != pend; ) + *q++ = *p++; + break; + } + _mm_storeu_si128(reinterpret_cast<__m128i *>(q), s); + } + + is.src_ = p; + is.dst_ = q; + } + + // When read/write pointers are the same for insitu stream, just skip unescaped characters + static RAPIDJSON_FORCEINLINE void SkipUnescapedString(InsituStringStream& is) { + RAPIDJSON_ASSERT(is.src_ == is.dst_); + char* p = is.src_; + + // Scan one by one until alignment (unaligned load may cross page boundary and cause crash) + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + for (; p != nextAligned; p++) + if (RAPIDJSON_UNLIKELY(*p == '\"') || RAPIDJSON_UNLIKELY(*p == '\\') || RAPIDJSON_UNLIKELY(static_cast(*p) < 0x20)) { + is.src_ = is.dst_ = p; + return; + } + + // The rest of string using SIMD + static const char dquote[16] = { '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"' }; + static const char bslash[16] = { '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\' }; + static const char space[16] = { 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F }; + const __m128i dq = _mm_loadu_si128(reinterpret_cast(&dquote[0])); + const __m128i bs = _mm_loadu_si128(reinterpret_cast(&bslash[0])); + const __m128i sp = _mm_loadu_si128(reinterpret_cast(&space[0])); + + for (;; p += 16) { + const __m128i s = _mm_load_si128(reinterpret_cast(p)); + const __m128i t1 = _mm_cmpeq_epi8(s, dq); + const __m128i t2 = _mm_cmpeq_epi8(s, bs); + const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp); // s < 0x20 <=> max(s, 0x1F) == 0x1F + const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3); + unsigned short r = static_cast(_mm_movemask_epi8(x)); + if (RAPIDJSON_UNLIKELY(r != 0)) { // some of characters is escaped + size_t length; +#ifdef _MSC_VER // Find the index of first escaped + unsigned long offset; + _BitScanForward(&offset, r); + length = offset; +#else + length = static_cast(__builtin_ffs(r) - 1); +#endif + p += length; + break; + } + } + + is.src_ = is.dst_ = p; + } +#elif defined(RAPIDJSON_NEON) + // StringStream -> StackStream + static RAPIDJSON_FORCEINLINE void ScanCopyUnescapedString(StringStream& is, StackStream& os) { + const char* p = is.src_; + + // Scan one by one until alignment (unaligned load may cross page boundary and cause crash) + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + while (p != nextAligned) + if (RAPIDJSON_UNLIKELY(*p == '\"') || RAPIDJSON_UNLIKELY(*p == '\\') || RAPIDJSON_UNLIKELY(static_cast(*p) < 0x20)) { + is.src_ = p; + return; + } + else + os.Put(*p++); + + // The rest of string using SIMD + const uint8x16_t s0 = vmovq_n_u8('"'); + const uint8x16_t s1 = vmovq_n_u8('\\'); + const uint8x16_t s2 = vmovq_n_u8('\b'); + const uint8x16_t s3 = vmovq_n_u8(32); + + for (;; p += 16) { + const uint8x16_t s = vld1q_u8(reinterpret_cast(p)); + uint8x16_t x = vceqq_u8(s, s0); + x = vorrq_u8(x, vceqq_u8(s, s1)); + x = vorrq_u8(x, vceqq_u8(s, s2)); + x = vorrq_u8(x, vcltq_u8(s, s3)); + + x = vrev64q_u8(x); // Rev in 64 + uint64_t low = vgetq_lane_u64(reinterpret_cast(x), 0); // extract + uint64_t high = vgetq_lane_u64(reinterpret_cast(x), 1); // extract + + SizeType length = 0; + bool escaped = false; + if (low == 0) { + if (high != 0) { + unsigned lz = (unsigned)__builtin_clzll(high);; + length = 8 + (lz >> 3); + escaped = true; + } + } else { + unsigned lz = (unsigned)__builtin_clzll(low);; + length = lz >> 3; + escaped = true; + } + if (RAPIDJSON_UNLIKELY(escaped)) { // some of characters is escaped + if (length != 0) { + char* q = reinterpret_cast(os.Push(length)); + for (size_t i = 0; i < length; i++) + q[i] = p[i]; + + p += length; + } + break; + } + vst1q_u8(reinterpret_cast(os.Push(16)), s); + } + + is.src_ = p; + } + + // InsituStringStream -> InsituStringStream + static RAPIDJSON_FORCEINLINE void ScanCopyUnescapedString(InsituStringStream& is, InsituStringStream& os) { + RAPIDJSON_ASSERT(&is == &os); + (void)os; + + if (is.src_ == is.dst_) { + SkipUnescapedString(is); + return; + } + + char* p = is.src_; + char *q = is.dst_; + + // Scan one by one until alignment (unaligned load may cross page boundary and cause crash) + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + while (p != nextAligned) + if (RAPIDJSON_UNLIKELY(*p == '\"') || RAPIDJSON_UNLIKELY(*p == '\\') || RAPIDJSON_UNLIKELY(static_cast(*p) < 0x20)) { + is.src_ = p; + is.dst_ = q; + return; + } + else + *q++ = *p++; + + // The rest of string using SIMD + const uint8x16_t s0 = vmovq_n_u8('"'); + const uint8x16_t s1 = vmovq_n_u8('\\'); + const uint8x16_t s2 = vmovq_n_u8('\b'); + const uint8x16_t s3 = vmovq_n_u8(32); + + for (;; p += 16, q += 16) { + const uint8x16_t s = vld1q_u8(reinterpret_cast(p)); + uint8x16_t x = vceqq_u8(s, s0); + x = vorrq_u8(x, vceqq_u8(s, s1)); + x = vorrq_u8(x, vceqq_u8(s, s2)); + x = vorrq_u8(x, vcltq_u8(s, s3)); + + x = vrev64q_u8(x); // Rev in 64 + uint64_t low = vgetq_lane_u64(reinterpret_cast(x), 0); // extract + uint64_t high = vgetq_lane_u64(reinterpret_cast(x), 1); // extract + + SizeType length = 0; + bool escaped = false; + if (low == 0) { + if (high != 0) { + unsigned lz = (unsigned)__builtin_clzll(high); + length = 8 + (lz >> 3); + escaped = true; + } + } else { + unsigned lz = (unsigned)__builtin_clzll(low); + length = lz >> 3; + escaped = true; + } + if (RAPIDJSON_UNLIKELY(escaped)) { // some of characters is escaped + for (const char* pend = p + length; p != pend; ) { + *q++ = *p++; + } + break; + } + vst1q_u8(reinterpret_cast(q), s); + } + + is.src_ = p; + is.dst_ = q; + } + + // When read/write pointers are the same for insitu stream, just skip unescaped characters + static RAPIDJSON_FORCEINLINE void SkipUnescapedString(InsituStringStream& is) { + RAPIDJSON_ASSERT(is.src_ == is.dst_); + char* p = is.src_; + + // Scan one by one until alignment (unaligned load may cross page boundary and cause crash) + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + for (; p != nextAligned; p++) + if (RAPIDJSON_UNLIKELY(*p == '\"') || RAPIDJSON_UNLIKELY(*p == '\\') || RAPIDJSON_UNLIKELY(static_cast(*p) < 0x20)) { + is.src_ = is.dst_ = p; + return; + } + + // The rest of string using SIMD + const uint8x16_t s0 = vmovq_n_u8('"'); + const uint8x16_t s1 = vmovq_n_u8('\\'); + const uint8x16_t s2 = vmovq_n_u8('\b'); + const uint8x16_t s3 = vmovq_n_u8(32); + + for (;; p += 16) { + const uint8x16_t s = vld1q_u8(reinterpret_cast(p)); + uint8x16_t x = vceqq_u8(s, s0); + x = vorrq_u8(x, vceqq_u8(s, s1)); + x = vorrq_u8(x, vceqq_u8(s, s2)); + x = vorrq_u8(x, vcltq_u8(s, s3)); + + x = vrev64q_u8(x); // Rev in 64 + uint64_t low = vgetq_lane_u64(reinterpret_cast(x), 0); // extract + uint64_t high = vgetq_lane_u64(reinterpret_cast(x), 1); // extract + + if (low == 0) { + if (high != 0) { + int lz = __builtin_clzll(high); + p += 8 + (lz >> 3); + break; + } + } else { + int lz = __builtin_clzll(low); + p += lz >> 3; + break; + } + } + + is.src_ = is.dst_ = p; + } +#endif // RAPIDJSON_NEON + + template + class NumberStream; + + template + class NumberStream { + public: + typedef typename InputStream::Ch Ch; + + NumberStream(GenericReader& reader, InputStream& s) : is(s) { (void)reader; } + + RAPIDJSON_FORCEINLINE Ch Peek() const { return is.Peek(); } + RAPIDJSON_FORCEINLINE Ch TakePush() { return is.Take(); } + RAPIDJSON_FORCEINLINE Ch Take() { return is.Take(); } + RAPIDJSON_FORCEINLINE void Push(char) {} + + size_t Tell() { return is.Tell(); } + size_t Length() { return 0; } + const char* Pop() { return 0; } + + protected: + NumberStream& operator=(const NumberStream&); + + InputStream& is; + }; + + template + class NumberStream : public NumberStream { + typedef NumberStream Base; + public: + NumberStream(GenericReader& reader, InputStream& is) : Base(reader, is), stackStream(reader.stack_) {} + + RAPIDJSON_FORCEINLINE Ch TakePush() { + stackStream.Put(static_cast(Base::is.Peek())); + return Base::is.Take(); + } + + RAPIDJSON_FORCEINLINE void Push(char c) { + stackStream.Put(c); + } + + size_t Length() { return stackStream.Length(); } + + const char* Pop() { + stackStream.Put('\0'); + return stackStream.Pop(); + } + + private: + StackStream stackStream; + }; + + template + class NumberStream : public NumberStream { + typedef NumberStream Base; + public: + NumberStream(GenericReader& reader, InputStream& is) : Base(reader, is) {} + + RAPIDJSON_FORCEINLINE Ch Take() { return Base::TakePush(); } + }; + + template + void ParseNumber(InputStream& is, Handler& handler) { + internal::StreamLocalCopy copy(is); + NumberStream s(*this, copy.s); + + size_t startOffset = s.Tell(); + double d = 0.0; + bool useNanOrInf = false; + + // Parse minus + bool minus = Consume(s, '-'); + + // Parse int: zero / ( digit1-9 *DIGIT ) + unsigned i = 0; + uint64_t i64 = 0; + bool use64bit = false; + int significandDigit = 0; + if (RAPIDJSON_UNLIKELY(s.Peek() == '0')) { + i = 0; + s.TakePush(); + } + else if (RAPIDJSON_LIKELY(s.Peek() >= '1' && s.Peek() <= '9')) { + i = static_cast(s.TakePush() - '0'); + + if (minus) + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (RAPIDJSON_UNLIKELY(i >= 214748364)) { // 2^31 = 2147483648 + if (RAPIDJSON_LIKELY(i != 214748364 || s.Peek() > '8')) { + i64 = i; + use64bit = true; + break; + } + } + i = i * 10 + static_cast(s.TakePush() - '0'); + significandDigit++; + } + else + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (RAPIDJSON_UNLIKELY(i >= 429496729)) { // 2^32 - 1 = 4294967295 + if (RAPIDJSON_LIKELY(i != 429496729 || s.Peek() > '5')) { + i64 = i; + use64bit = true; + break; + } + } + i = i * 10 + static_cast(s.TakePush() - '0'); + significandDigit++; + } + } + // Parse NaN or Infinity here + else if ((parseFlags & kParseNanAndInfFlag) && RAPIDJSON_LIKELY((s.Peek() == 'I' || s.Peek() == 'N'))) { + if (Consume(s, 'N')) { + if (Consume(s, 'a') && Consume(s, 'N')) { + d = std::numeric_limits::quiet_NaN(); + useNanOrInf = true; + } + } + else if (RAPIDJSON_LIKELY(Consume(s, 'I'))) { + if (Consume(s, 'n') && Consume(s, 'f')) { + d = (minus ? -std::numeric_limits::infinity() : std::numeric_limits::infinity()); + useNanOrInf = true; + + if (RAPIDJSON_UNLIKELY(s.Peek() == 'i' && !(Consume(s, 'i') && Consume(s, 'n') + && Consume(s, 'i') && Consume(s, 't') && Consume(s, 'y')))) { + RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell()); + } + } + } + + if (RAPIDJSON_UNLIKELY(!useNanOrInf)) { + RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell()); + } + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell()); + + // Parse 64bit int + bool useDouble = false; + if (use64bit) { + if (minus) + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (RAPIDJSON_UNLIKELY(i64 >= RAPIDJSON_UINT64_C2(0x0CCCCCCC, 0xCCCCCCCC))) // 2^63 = 9223372036854775808 + if (RAPIDJSON_LIKELY(i64 != RAPIDJSON_UINT64_C2(0x0CCCCCCC, 0xCCCCCCCC) || s.Peek() > '8')) { + d = static_cast(i64); + useDouble = true; + break; + } + i64 = i64 * 10 + static_cast(s.TakePush() - '0'); + significandDigit++; + } + else + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (RAPIDJSON_UNLIKELY(i64 >= RAPIDJSON_UINT64_C2(0x19999999, 0x99999999))) // 2^64 - 1 = 18446744073709551615 + if (RAPIDJSON_LIKELY(i64 != RAPIDJSON_UINT64_C2(0x19999999, 0x99999999) || s.Peek() > '5')) { + d = static_cast(i64); + useDouble = true; + break; + } + i64 = i64 * 10 + static_cast(s.TakePush() - '0'); + significandDigit++; + } + } + + // Force double for big integer + if (useDouble) { + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + d = d * 10 + (s.TakePush() - '0'); + } + } + + // Parse frac = decimal-point 1*DIGIT + int expFrac = 0; + size_t decimalPosition; + if (Consume(s, '.')) { + decimalPosition = s.Length(); + + if (RAPIDJSON_UNLIKELY(!(s.Peek() >= '0' && s.Peek() <= '9'))) + RAPIDJSON_PARSE_ERROR(kParseErrorNumberMissFraction, s.Tell()); + + if (!useDouble) { +#if RAPIDJSON_64BIT + // Use i64 to store significand in 64-bit architecture + if (!use64bit) + i64 = i; + + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (i64 > RAPIDJSON_UINT64_C2(0x1FFFFF, 0xFFFFFFFF)) // 2^53 - 1 for fast path + break; + else { + i64 = i64 * 10 + static_cast(s.TakePush() - '0'); + --expFrac; + if (i64 != 0) + significandDigit++; + } + } + + d = static_cast(i64); +#else + // Use double to store significand in 32-bit architecture + d = static_cast(use64bit ? i64 : i); +#endif + useDouble = true; + } + + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (significandDigit < 17) { + d = d * 10.0 + (s.TakePush() - '0'); + --expFrac; + if (RAPIDJSON_LIKELY(d > 0.0)) + significandDigit++; + } + else + s.TakePush(); + } + } + else + decimalPosition = s.Length(); // decimal position at the end of integer. + + // Parse exp = e [ minus / plus ] 1*DIGIT + int exp = 0; + if (Consume(s, 'e') || Consume(s, 'E')) { + if (!useDouble) { + d = static_cast(use64bit ? i64 : i); + useDouble = true; + } + + bool expMinus = false; + if (Consume(s, '+')) + ; + else if (Consume(s, '-')) + expMinus = true; + + if (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + exp = static_cast(s.Take() - '0'); + if (expMinus) { + // (exp + expFrac) must not underflow int => we're detecting when -exp gets + // dangerously close to INT_MIN (a pessimistic next digit 9 would push it into + // underflow territory): + // + // -(exp * 10 + 9) + expFrac >= INT_MIN + // <=> exp <= (expFrac - INT_MIN - 9) / 10 + RAPIDJSON_ASSERT(expFrac <= 0); + int maxExp = (expFrac + 2147483639) / 10; + + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + exp = exp * 10 + static_cast(s.Take() - '0'); + if (RAPIDJSON_UNLIKELY(exp > maxExp)) { + while (RAPIDJSON_UNLIKELY(s.Peek() >= '0' && s.Peek() <= '9')) // Consume the rest of exponent + s.Take(); + } + } + } + else { // positive exp + int maxExp = 308 - expFrac; + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + exp = exp * 10 + static_cast(s.Take() - '0'); + if (RAPIDJSON_UNLIKELY(exp > maxExp)) + RAPIDJSON_PARSE_ERROR(kParseErrorNumberTooBig, startOffset); + } + } + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorNumberMissExponent, s.Tell()); + + if (expMinus) + exp = -exp; + } + + // Finish parsing, call event according to the type of number. + bool cont = true; + + if (parseFlags & kParseNumbersAsStringsFlag) { + if (parseFlags & kParseInsituFlag) { + s.Pop(); // Pop stack no matter if it will be used or not. + typename InputStream::Ch* head = is.PutBegin(); + const size_t length = s.Tell() - startOffset; + RAPIDJSON_ASSERT(length <= 0xFFFFFFFF); + // unable to insert the \0 character here, it will erase the comma after this number + const typename TargetEncoding::Ch* const str = reinterpret_cast(head); + cont = handler.RawNumber(str, SizeType(length), false); + } + else { + SizeType numCharsToCopy = static_cast(s.Length()); + StringStream srcStream(s.Pop()); + StackStream dstStream(stack_); + while (numCharsToCopy--) { + Transcoder, TargetEncoding>::Transcode(srcStream, dstStream); + } + dstStream.Put('\0'); + const typename TargetEncoding::Ch* str = dstStream.Pop(); + const SizeType length = static_cast(dstStream.Length()) - 1; + cont = handler.RawNumber(str, SizeType(length), true); + } + } + else { + size_t length = s.Length(); + const char* decimal = s.Pop(); // Pop stack no matter if it will be used or not. + + if (useDouble) { + int p = exp + expFrac; + if (parseFlags & kParseFullPrecisionFlag) + d = internal::StrtodFullPrecision(d, p, decimal, length, decimalPosition, exp); + else + d = internal::StrtodNormalPrecision(d, p); + + // Use > max, instead of == inf, to fix bogus warning -Wfloat-equal + if (d > (std::numeric_limits::max)()) { + // Overflow + // TODO: internal::StrtodX should report overflow (or underflow) + RAPIDJSON_PARSE_ERROR(kParseErrorNumberTooBig, startOffset); + } + + cont = handler.Double(minus ? -d : d); + } + else if (useNanOrInf) { + cont = handler.Double(d); + } + else { + if (use64bit) { + if (minus) + cont = handler.Int64(static_cast(~i64 + 1)); + else + cont = handler.Uint64(i64); + } + else { + if (minus) + cont = handler.Int(static_cast(~i + 1)); + else + cont = handler.Uint(i); + } + } + } + if (RAPIDJSON_UNLIKELY(!cont)) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, startOffset); + } + + // Parse any JSON value + template + void ParseValue(InputStream& is, Handler& handler) { + switch (is.Peek()) { + case 'n': ParseNull (is, handler); break; + case 't': ParseTrue (is, handler); break; + case 'f': ParseFalse (is, handler); break; + case '"': ParseString(is, handler); break; + case '{': ParseObject(is, handler); break; + case '[': ParseArray (is, handler); break; + default : + ParseNumber(is, handler); + break; + + } + } + + // Iterative Parsing + + // States + enum IterativeParsingState { + IterativeParsingFinishState = 0, // sink states at top + IterativeParsingErrorState, // sink states at top + IterativeParsingStartState, + + // Object states + IterativeParsingObjectInitialState, + IterativeParsingMemberKeyState, + IterativeParsingMemberValueState, + IterativeParsingObjectFinishState, + + // Array states + IterativeParsingArrayInitialState, + IterativeParsingElementState, + IterativeParsingArrayFinishState, + + // Single value state + IterativeParsingValueState, + + // Delimiter states (at bottom) + IterativeParsingElementDelimiterState, + IterativeParsingMemberDelimiterState, + IterativeParsingKeyValueDelimiterState, + + cIterativeParsingStateCount + }; + + // Tokens + enum Token { + LeftBracketToken = 0, + RightBracketToken, + + LeftCurlyBracketToken, + RightCurlyBracketToken, + + CommaToken, + ColonToken, + + StringToken, + FalseToken, + TrueToken, + NullToken, + NumberToken, + + kTokenCount + }; + + RAPIDJSON_FORCEINLINE Token Tokenize(Ch c) const { + +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +#define N NumberToken +#define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N + // Maps from ASCII to Token + static const unsigned char tokenMap[256] = { + N16, // 00~0F + N16, // 10~1F + N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F + N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F + N16, // 40~4F + N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F + N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F + N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F + N16, N16, N16, N16, N16, N16, N16, N16 // 80~FF + }; +#undef N +#undef N16 +//!@endcond + + if (sizeof(Ch) == 1 || static_cast(c) < 256) + return static_cast(tokenMap[static_cast(c)]); + else + return NumberToken; + } + + RAPIDJSON_FORCEINLINE IterativeParsingState Predict(IterativeParsingState state, Token token) const { + // current state x one lookahead token -> new state + static const char G[cIterativeParsingStateCount][kTokenCount] = { + // Finish(sink state) + { + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState + }, + // Error(sink state) + { + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState + }, + // Start + { + IterativeParsingArrayInitialState, // Left bracket + IterativeParsingErrorState, // Right bracket + IterativeParsingObjectInitialState, // Left curly bracket + IterativeParsingErrorState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingValueState, // String + IterativeParsingValueState, // False + IterativeParsingValueState, // True + IterativeParsingValueState, // Null + IterativeParsingValueState // Number + }, + // ObjectInitial + { + IterativeParsingErrorState, // Left bracket + IterativeParsingErrorState, // Right bracket + IterativeParsingErrorState, // Left curly bracket + IterativeParsingObjectFinishState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingMemberKeyState, // String + IterativeParsingErrorState, // False + IterativeParsingErrorState, // True + IterativeParsingErrorState, // Null + IterativeParsingErrorState // Number + }, + // MemberKey + { + IterativeParsingErrorState, // Left bracket + IterativeParsingErrorState, // Right bracket + IterativeParsingErrorState, // Left curly bracket + IterativeParsingErrorState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingKeyValueDelimiterState, // Colon + IterativeParsingErrorState, // String + IterativeParsingErrorState, // False + IterativeParsingErrorState, // True + IterativeParsingErrorState, // Null + IterativeParsingErrorState // Number + }, + // MemberValue + { + IterativeParsingErrorState, // Left bracket + IterativeParsingErrorState, // Right bracket + IterativeParsingErrorState, // Left curly bracket + IterativeParsingObjectFinishState, // Right curly bracket + IterativeParsingMemberDelimiterState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingErrorState, // String + IterativeParsingErrorState, // False + IterativeParsingErrorState, // True + IterativeParsingErrorState, // Null + IterativeParsingErrorState // Number + }, + // ObjectFinish(sink state) + { + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState + }, + // ArrayInitial + { + IterativeParsingArrayInitialState, // Left bracket(push Element state) + IterativeParsingArrayFinishState, // Right bracket + IterativeParsingObjectInitialState, // Left curly bracket(push Element state) + IterativeParsingErrorState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingElementState, // String + IterativeParsingElementState, // False + IterativeParsingElementState, // True + IterativeParsingElementState, // Null + IterativeParsingElementState // Number + }, + // Element + { + IterativeParsingErrorState, // Left bracket + IterativeParsingArrayFinishState, // Right bracket + IterativeParsingErrorState, // Left curly bracket + IterativeParsingErrorState, // Right curly bracket + IterativeParsingElementDelimiterState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingErrorState, // String + IterativeParsingErrorState, // False + IterativeParsingErrorState, // True + IterativeParsingErrorState, // Null + IterativeParsingErrorState // Number + }, + // ArrayFinish(sink state) + { + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState + }, + // Single Value (sink state) + { + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState + }, + // ElementDelimiter + { + IterativeParsingArrayInitialState, // Left bracket(push Element state) + IterativeParsingArrayFinishState, // Right bracket + IterativeParsingObjectInitialState, // Left curly bracket(push Element state) + IterativeParsingErrorState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingElementState, // String + IterativeParsingElementState, // False + IterativeParsingElementState, // True + IterativeParsingElementState, // Null + IterativeParsingElementState // Number + }, + // MemberDelimiter + { + IterativeParsingErrorState, // Left bracket + IterativeParsingErrorState, // Right bracket + IterativeParsingErrorState, // Left curly bracket + IterativeParsingObjectFinishState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingMemberKeyState, // String + IterativeParsingErrorState, // False + IterativeParsingErrorState, // True + IterativeParsingErrorState, // Null + IterativeParsingErrorState // Number + }, + // KeyValueDelimiter + { + IterativeParsingArrayInitialState, // Left bracket(push MemberValue state) + IterativeParsingErrorState, // Right bracket + IterativeParsingObjectInitialState, // Left curly bracket(push MemberValue state) + IterativeParsingErrorState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingMemberValueState, // String + IterativeParsingMemberValueState, // False + IterativeParsingMemberValueState, // True + IterativeParsingMemberValueState, // Null + IterativeParsingMemberValueState // Number + }, + }; // End of G + + return static_cast(G[state][token]); + } + + // Make an advance in the token stream and state based on the candidate destination state which was returned by Transit(). + // May return a new state on state pop. + template + RAPIDJSON_FORCEINLINE IterativeParsingState Transit(IterativeParsingState src, Token token, IterativeParsingState dst, InputStream& is, Handler& handler) { + (void)token; + + switch (dst) { + case IterativeParsingErrorState: + return dst; + + case IterativeParsingObjectInitialState: + case IterativeParsingArrayInitialState: + { + // Push the state(Element or MemeberValue) if we are nested in another array or value of member. + // In this way we can get the correct state on ObjectFinish or ArrayFinish by frame pop. + IterativeParsingState n = src; + if (src == IterativeParsingArrayInitialState || src == IterativeParsingElementDelimiterState) + n = IterativeParsingElementState; + else if (src == IterativeParsingKeyValueDelimiterState) + n = IterativeParsingMemberValueState; + // Push current state. + *stack_.template Push(1) = n; + // Initialize and push the member/element count. + *stack_.template Push(1) = 0; + // Call handler + bool hr = (dst == IterativeParsingObjectInitialState) ? handler.StartObject() : handler.StartArray(); + // On handler short circuits the parsing. + if (!hr) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorTermination, is.Tell()); + return IterativeParsingErrorState; + } + else { + is.Take(); + return dst; + } + } + + case IterativeParsingMemberKeyState: + ParseString(is, handler, true); + if (HasParseError()) + return IterativeParsingErrorState; + else + return dst; + + case IterativeParsingKeyValueDelimiterState: + RAPIDJSON_ASSERT(token == ColonToken); + is.Take(); + return dst; + + case IterativeParsingMemberValueState: + // Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state. + ParseValue(is, handler); + if (HasParseError()) { + return IterativeParsingErrorState; + } + return dst; + + case IterativeParsingElementState: + // Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state. + ParseValue(is, handler); + if (HasParseError()) { + return IterativeParsingErrorState; + } + return dst; + + case IterativeParsingMemberDelimiterState: + case IterativeParsingElementDelimiterState: + is.Take(); + // Update member/element count. + *stack_.template Top() = *stack_.template Top() + 1; + return dst; + + case IterativeParsingObjectFinishState: + { + // Transit from delimiter is only allowed when trailing commas are enabled + if (!(parseFlags & kParseTrailingCommasFlag) && src == IterativeParsingMemberDelimiterState) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorObjectMissName, is.Tell()); + return IterativeParsingErrorState; + } + // Get member count. + SizeType c = *stack_.template Pop(1); + // If the object is not empty, count the last member. + if (src == IterativeParsingMemberValueState) + ++c; + // Restore the state. + IterativeParsingState n = static_cast(*stack_.template Pop(1)); + // Transit to Finish state if this is the topmost scope. + if (n == IterativeParsingStartState) + n = IterativeParsingFinishState; + // Call handler + bool hr = handler.EndObject(c); + // On handler short circuits the parsing. + if (!hr) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorTermination, is.Tell()); + return IterativeParsingErrorState; + } + else { + is.Take(); + return n; + } + } + + case IterativeParsingArrayFinishState: + { + // Transit from delimiter is only allowed when trailing commas are enabled + if (!(parseFlags & kParseTrailingCommasFlag) && src == IterativeParsingElementDelimiterState) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorValueInvalid, is.Tell()); + return IterativeParsingErrorState; + } + // Get element count. + SizeType c = *stack_.template Pop(1); + // If the array is not empty, count the last element. + if (src == IterativeParsingElementState) + ++c; + // Restore the state. + IterativeParsingState n = static_cast(*stack_.template Pop(1)); + // Transit to Finish state if this is the topmost scope. + if (n == IterativeParsingStartState) + n = IterativeParsingFinishState; + // Call handler + bool hr = handler.EndArray(c); + // On handler short circuits the parsing. + if (!hr) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorTermination, is.Tell()); + return IterativeParsingErrorState; + } + else { + is.Take(); + return n; + } + } + + default: + // This branch is for IterativeParsingValueState actually. + // Use `default:` rather than + // `case IterativeParsingValueState:` is for code coverage. + + // The IterativeParsingStartState is not enumerated in this switch-case. + // It is impossible for that case. And it can be caught by following assertion. + + // The IterativeParsingFinishState is not enumerated in this switch-case either. + // It is a "derivative" state which cannot triggered from Predict() directly. + // Therefore it cannot happen here. And it can be caught by following assertion. + RAPIDJSON_ASSERT(dst == IterativeParsingValueState); + + // Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state. + ParseValue(is, handler); + if (HasParseError()) { + return IterativeParsingErrorState; + } + return IterativeParsingFinishState; + } + } + + template + void HandleError(IterativeParsingState src, InputStream& is) { + if (HasParseError()) { + // Error flag has been set. + return; + } + + switch (src) { + case IterativeParsingStartState: RAPIDJSON_PARSE_ERROR(kParseErrorDocumentEmpty, is.Tell()); return; + case IterativeParsingFinishState: RAPIDJSON_PARSE_ERROR(kParseErrorDocumentRootNotSingular, is.Tell()); return; + case IterativeParsingObjectInitialState: + case IterativeParsingMemberDelimiterState: RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissName, is.Tell()); return; + case IterativeParsingMemberKeyState: RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissColon, is.Tell()); return; + case IterativeParsingMemberValueState: RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissCommaOrCurlyBracket, is.Tell()); return; + case IterativeParsingKeyValueDelimiterState: + case IterativeParsingArrayInitialState: + case IterativeParsingElementDelimiterState: RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell()); return; + default: RAPIDJSON_ASSERT(src == IterativeParsingElementState); RAPIDJSON_PARSE_ERROR(kParseErrorArrayMissCommaOrSquareBracket, is.Tell()); return; + } + } + + RAPIDJSON_FORCEINLINE bool IsIterativeParsingDelimiterState(IterativeParsingState s) const { + return s >= IterativeParsingElementDelimiterState; + } + + RAPIDJSON_FORCEINLINE bool IsIterativeParsingCompleteState(IterativeParsingState s) const { + return s <= IterativeParsingErrorState; + } + + template + ParseResult IterativeParse(InputStream& is, Handler& handler) { + parseResult_.Clear(); + ClearStackOnExit scope(*this); + IterativeParsingState state = IterativeParsingStartState; + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + while (is.Peek() != '\0') { + Token t = Tokenize(is.Peek()); + IterativeParsingState n = Predict(state, t); + IterativeParsingState d = Transit(state, t, n, is, handler); + + if (d == IterativeParsingErrorState) { + HandleError(state, is); + break; + } + + state = d; + + // Do not further consume streams if a root JSON has been parsed. + if ((parseFlags & kParseStopWhenDoneFlag) && state == IterativeParsingFinishState) + break; + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + } + + // Handle the end of file. + if (state != IterativeParsingFinishState) + HandleError(state, is); + + return parseResult_; + } + + static const size_t kDefaultStackCapacity = 256; //!< Default stack capacity in bytes for storing a single decoded string. + internal::Stack stack_; //!< A stack for storing decoded string temporarily during non-destructive parsing. + ParseResult parseResult_; + IterativeParsingState state_; +}; // class GenericReader + +//! Reader with UTF8 encoding and default allocator. +typedef GenericReader, UTF8<> > Reader; + +RAPIDJSON_NAMESPACE_END + +#if defined(__clang__) || defined(_MSC_VER) +RAPIDJSON_DIAG_POP +#endif + + +#ifdef __GNUC__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_READER_H_ diff --git a/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/schema.h b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/schema.h new file mode 100644 index 0000000..fa0d696 --- /dev/null +++ b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/schema.h @@ -0,0 +1,2494 @@ +// Tencent is pleased to support the open source community by making RapidJSON available-> +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip-> All rights reserved-> +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License-> You may obtain a copy of the License at +// +// http://opensource->org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied-> See the License for the +// specific language governing permissions and limitations under the License-> + +#ifndef RAPIDJSON_SCHEMA_H_ +#define RAPIDJSON_SCHEMA_H_ + +#include "document.h" +#include "pointer.h" +#include "stringbuffer.h" +#include // abs, floor + +#if !defined(RAPIDJSON_SCHEMA_USE_INTERNALREGEX) +#define RAPIDJSON_SCHEMA_USE_INTERNALREGEX 1 +#else +#define RAPIDJSON_SCHEMA_USE_INTERNALREGEX 0 +#endif + +#if !RAPIDJSON_SCHEMA_USE_INTERNALREGEX && defined(RAPIDJSON_SCHEMA_USE_STDREGEX) && (__cplusplus >=201103L || (defined(_MSC_VER) && _MSC_VER >= 1800)) +#define RAPIDJSON_SCHEMA_USE_STDREGEX 1 +#else +#define RAPIDJSON_SCHEMA_USE_STDREGEX 0 +#endif + +#if RAPIDJSON_SCHEMA_USE_INTERNALREGEX +#include "internal/regex.h" +#elif RAPIDJSON_SCHEMA_USE_STDREGEX +#include +#endif + +#if RAPIDJSON_SCHEMA_USE_INTERNALREGEX || RAPIDJSON_SCHEMA_USE_STDREGEX +#define RAPIDJSON_SCHEMA_HAS_REGEX 1 +#else +#define RAPIDJSON_SCHEMA_HAS_REGEX 0 +#endif + +#ifndef RAPIDJSON_SCHEMA_VERBOSE +#define RAPIDJSON_SCHEMA_VERBOSE 0 +#endif + +#if RAPIDJSON_SCHEMA_VERBOSE +#include "stringbuffer.h" +#endif + +RAPIDJSON_DIAG_PUSH + +#if defined(__GNUC__) +RAPIDJSON_DIAG_OFF(effc++) +#endif + +#ifdef __clang__ +RAPIDJSON_DIAG_OFF(weak-vtables) +RAPIDJSON_DIAG_OFF(exit-time-destructors) +RAPIDJSON_DIAG_OFF(c++98-compat-pedantic) +RAPIDJSON_DIAG_OFF(variadic-macros) +#elif defined(_MSC_VER) +RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// Verbose Utilities + +#if RAPIDJSON_SCHEMA_VERBOSE + +namespace internal { + +inline void PrintInvalidKeyword(const char* keyword) { + printf("Fail keyword: %s\n", keyword); +} + +inline void PrintInvalidKeyword(const wchar_t* keyword) { + wprintf(L"Fail keyword: %ls\n", keyword); +} + +inline void PrintInvalidDocument(const char* document) { + printf("Fail document: %s\n\n", document); +} + +inline void PrintInvalidDocument(const wchar_t* document) { + wprintf(L"Fail document: %ls\n\n", document); +} + +inline void PrintValidatorPointers(unsigned depth, const char* s, const char* d) { + printf("S: %*s%s\nD: %*s%s\n\n", depth * 4, " ", s, depth * 4, " ", d); +} + +inline void PrintValidatorPointers(unsigned depth, const wchar_t* s, const wchar_t* d) { + wprintf(L"S: %*ls%ls\nD: %*ls%ls\n\n", depth * 4, L" ", s, depth * 4, L" ", d); +} + +} // namespace internal + +#endif // RAPIDJSON_SCHEMA_VERBOSE + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_INVALID_KEYWORD_RETURN + +#if RAPIDJSON_SCHEMA_VERBOSE +#define RAPIDJSON_INVALID_KEYWORD_VERBOSE(keyword) internal::PrintInvalidKeyword(keyword) +#else +#define RAPIDJSON_INVALID_KEYWORD_VERBOSE(keyword) +#endif + +#define RAPIDJSON_INVALID_KEYWORD_RETURN(keyword)\ +RAPIDJSON_MULTILINEMACRO_BEGIN\ + context.invalidKeyword = keyword.GetString();\ + RAPIDJSON_INVALID_KEYWORD_VERBOSE(keyword.GetString());\ + return false;\ +RAPIDJSON_MULTILINEMACRO_END + +/////////////////////////////////////////////////////////////////////////////// +// Forward declarations + +template +class GenericSchemaDocument; + +namespace internal { + +template +class Schema; + +/////////////////////////////////////////////////////////////////////////////// +// ISchemaValidator + +class ISchemaValidator { +public: + virtual ~ISchemaValidator() {} + virtual bool IsValid() const = 0; +}; + +/////////////////////////////////////////////////////////////////////////////// +// ISchemaStateFactory + +template +class ISchemaStateFactory { +public: + virtual ~ISchemaStateFactory() {} + virtual ISchemaValidator* CreateSchemaValidator(const SchemaType&) = 0; + virtual void DestroySchemaValidator(ISchemaValidator* validator) = 0; + virtual void* CreateHasher() = 0; + virtual uint64_t GetHashCode(void* hasher) = 0; + virtual void DestroryHasher(void* hasher) = 0; + virtual void* MallocState(size_t size) = 0; + virtual void FreeState(void* p) = 0; +}; + +/////////////////////////////////////////////////////////////////////////////// +// IValidationErrorHandler + +template +class IValidationErrorHandler { +public: + typedef typename SchemaType::Ch Ch; + typedef typename SchemaType::SValue SValue; + + virtual ~IValidationErrorHandler() {} + + virtual void NotMultipleOf(int64_t actual, const SValue& expected) = 0; + virtual void NotMultipleOf(uint64_t actual, const SValue& expected) = 0; + virtual void NotMultipleOf(double actual, const SValue& expected) = 0; + virtual void AboveMaximum(int64_t actual, const SValue& expected, bool exclusive) = 0; + virtual void AboveMaximum(uint64_t actual, const SValue& expected, bool exclusive) = 0; + virtual void AboveMaximum(double actual, const SValue& expected, bool exclusive) = 0; + virtual void BelowMinimum(int64_t actual, const SValue& expected, bool exclusive) = 0; + virtual void BelowMinimum(uint64_t actual, const SValue& expected, bool exclusive) = 0; + virtual void BelowMinimum(double actual, const SValue& expected, bool exclusive) = 0; + + virtual void TooLong(const Ch* str, SizeType length, SizeType expected) = 0; + virtual void TooShort(const Ch* str, SizeType length, SizeType expected) = 0; + virtual void DoesNotMatch(const Ch* str, SizeType length) = 0; + + virtual void DisallowedItem(SizeType index) = 0; + virtual void TooFewItems(SizeType actualCount, SizeType expectedCount) = 0; + virtual void TooManyItems(SizeType actualCount, SizeType expectedCount) = 0; + virtual void DuplicateItems(SizeType index1, SizeType index2) = 0; + + virtual void TooManyProperties(SizeType actualCount, SizeType expectedCount) = 0; + virtual void TooFewProperties(SizeType actualCount, SizeType expectedCount) = 0; + virtual void StartMissingProperties() = 0; + virtual void AddMissingProperty(const SValue& name) = 0; + virtual bool EndMissingProperties() = 0; + virtual void PropertyViolations(ISchemaValidator** subvalidators, SizeType count) = 0; + virtual void DisallowedProperty(const Ch* name, SizeType length) = 0; + + virtual void StartDependencyErrors() = 0; + virtual void StartMissingDependentProperties() = 0; + virtual void AddMissingDependentProperty(const SValue& targetName) = 0; + virtual void EndMissingDependentProperties(const SValue& sourceName) = 0; + virtual void AddDependencySchemaError(const SValue& souceName, ISchemaValidator* subvalidator) = 0; + virtual bool EndDependencyErrors() = 0; + + virtual void DisallowedValue() = 0; + virtual void StartDisallowedType() = 0; + virtual void AddExpectedType(const typename SchemaType::ValueType& expectedType) = 0; + virtual void EndDisallowedType(const typename SchemaType::ValueType& actualType) = 0; + virtual void NotAllOf(ISchemaValidator** subvalidators, SizeType count) = 0; + virtual void NoneOf(ISchemaValidator** subvalidators, SizeType count) = 0; + virtual void NotOneOf(ISchemaValidator** subvalidators, SizeType count) = 0; + virtual void Disallowed() = 0; +}; + + +/////////////////////////////////////////////////////////////////////////////// +// Hasher + +// For comparison of compound value +template +class Hasher { +public: + typedef typename Encoding::Ch Ch; + + Hasher(Allocator* allocator = 0, size_t stackCapacity = kDefaultSize) : stack_(allocator, stackCapacity) {} + + bool Null() { return WriteType(kNullType); } + bool Bool(bool b) { return WriteType(b ? kTrueType : kFalseType); } + bool Int(int i) { Number n; n.u.i = i; n.d = static_cast(i); return WriteNumber(n); } + bool Uint(unsigned u) { Number n; n.u.u = u; n.d = static_cast(u); return WriteNumber(n); } + bool Int64(int64_t i) { Number n; n.u.i = i; n.d = static_cast(i); return WriteNumber(n); } + bool Uint64(uint64_t u) { Number n; n.u.u = u; n.d = static_cast(u); return WriteNumber(n); } + bool Double(double d) { + Number n; + if (d < 0) n.u.i = static_cast(d); + else n.u.u = static_cast(d); + n.d = d; + return WriteNumber(n); + } + + bool RawNumber(const Ch* str, SizeType len, bool) { + WriteBuffer(kNumberType, str, len * sizeof(Ch)); + return true; + } + + bool String(const Ch* str, SizeType len, bool) { + WriteBuffer(kStringType, str, len * sizeof(Ch)); + return true; + } + + bool StartObject() { return true; } + bool Key(const Ch* str, SizeType len, bool copy) { return String(str, len, copy); } + bool EndObject(SizeType memberCount) { + uint64_t h = Hash(0, kObjectType); + uint64_t* kv = stack_.template Pop(memberCount * 2); + for (SizeType i = 0; i < memberCount; i++) + h ^= Hash(kv[i * 2], kv[i * 2 + 1]); // Use xor to achieve member order insensitive + *stack_.template Push() = h; + return true; + } + + bool StartArray() { return true; } + bool EndArray(SizeType elementCount) { + uint64_t h = Hash(0, kArrayType); + uint64_t* e = stack_.template Pop(elementCount); + for (SizeType i = 0; i < elementCount; i++) + h = Hash(h, e[i]); // Use hash to achieve element order sensitive + *stack_.template Push() = h; + return true; + } + + bool IsValid() const { return stack_.GetSize() == sizeof(uint64_t); } + + uint64_t GetHashCode() const { + RAPIDJSON_ASSERT(IsValid()); + return *stack_.template Top(); + } + +private: + static const size_t kDefaultSize = 256; + struct Number { + union U { + uint64_t u; + int64_t i; + }u; + double d; + }; + + bool WriteType(Type type) { return WriteBuffer(type, 0, 0); } + + bool WriteNumber(const Number& n) { return WriteBuffer(kNumberType, &n, sizeof(n)); } + + bool WriteBuffer(Type type, const void* data, size_t len) { + // FNV-1a from http://isthe.com/chongo/tech/comp/fnv/ + uint64_t h = Hash(RAPIDJSON_UINT64_C2(0x84222325, 0xcbf29ce4), type); + const unsigned char* d = static_cast(data); + for (size_t i = 0; i < len; i++) + h = Hash(h, d[i]); + *stack_.template Push() = h; + return true; + } + + static uint64_t Hash(uint64_t h, uint64_t d) { + static const uint64_t kPrime = RAPIDJSON_UINT64_C2(0x00000100, 0x000001b3); + h ^= d; + h *= kPrime; + return h; + } + + Stack stack_; +}; + +/////////////////////////////////////////////////////////////////////////////// +// SchemaValidationContext + +template +struct SchemaValidationContext { + typedef Schema SchemaType; + typedef ISchemaStateFactory SchemaValidatorFactoryType; + typedef IValidationErrorHandler ErrorHandlerType; + typedef typename SchemaType::ValueType ValueType; + typedef typename ValueType::Ch Ch; + + enum PatternValidatorType { + kPatternValidatorOnly, + kPatternValidatorWithProperty, + kPatternValidatorWithAdditionalProperty + }; + + SchemaValidationContext(SchemaValidatorFactoryType& f, ErrorHandlerType& eh, const SchemaType* s) : + factory(f), + error_handler(eh), + schema(s), + valueSchema(), + invalidKeyword(), + hasher(), + arrayElementHashCodes(), + validators(), + validatorCount(), + patternPropertiesValidators(), + patternPropertiesValidatorCount(), + patternPropertiesSchemas(), + patternPropertiesSchemaCount(), + valuePatternValidatorType(kPatternValidatorOnly), + propertyExist(), + inArray(false), + valueUniqueness(false), + arrayUniqueness(false) + { + } + + ~SchemaValidationContext() { + if (hasher) + factory.DestroryHasher(hasher); + if (validators) { + for (SizeType i = 0; i < validatorCount; i++) + factory.DestroySchemaValidator(validators[i]); + factory.FreeState(validators); + } + if (patternPropertiesValidators) { + for (SizeType i = 0; i < patternPropertiesValidatorCount; i++) + factory.DestroySchemaValidator(patternPropertiesValidators[i]); + factory.FreeState(patternPropertiesValidators); + } + if (patternPropertiesSchemas) + factory.FreeState(patternPropertiesSchemas); + if (propertyExist) + factory.FreeState(propertyExist); + } + + SchemaValidatorFactoryType& factory; + ErrorHandlerType& error_handler; + const SchemaType* schema; + const SchemaType* valueSchema; + const Ch* invalidKeyword; + void* hasher; // Only validator access + void* arrayElementHashCodes; // Only validator access this + ISchemaValidator** validators; + SizeType validatorCount; + ISchemaValidator** patternPropertiesValidators; + SizeType patternPropertiesValidatorCount; + const SchemaType** patternPropertiesSchemas; + SizeType patternPropertiesSchemaCount; + PatternValidatorType valuePatternValidatorType; + PatternValidatorType objectPatternValidatorType; + SizeType arrayElementIndex; + bool* propertyExist; + bool inArray; + bool valueUniqueness; + bool arrayUniqueness; +}; + +/////////////////////////////////////////////////////////////////////////////// +// Schema + +template +class Schema { +public: + typedef typename SchemaDocumentType::ValueType ValueType; + typedef typename SchemaDocumentType::AllocatorType AllocatorType; + typedef typename SchemaDocumentType::PointerType PointerType; + typedef typename ValueType::EncodingType EncodingType; + typedef typename EncodingType::Ch Ch; + typedef SchemaValidationContext Context; + typedef Schema SchemaType; + typedef GenericValue SValue; + typedef IValidationErrorHandler ErrorHandler; + friend class GenericSchemaDocument; + + Schema(SchemaDocumentType* schemaDocument, const PointerType& p, const ValueType& value, const ValueType& document, AllocatorType* allocator) : + allocator_(allocator), + uri_(schemaDocument->GetURI(), *allocator), + pointer_(p), + typeless_(schemaDocument->GetTypeless()), + enum_(), + enumCount_(), + not_(), + type_((1 << kTotalSchemaType) - 1), // typeless + validatorCount_(), + notValidatorIndex_(), + properties_(), + additionalPropertiesSchema_(), + patternProperties_(), + patternPropertyCount_(), + propertyCount_(), + minProperties_(), + maxProperties_(SizeType(~0)), + additionalProperties_(true), + hasDependencies_(), + hasRequired_(), + hasSchemaDependencies_(), + additionalItemsSchema_(), + itemsList_(), + itemsTuple_(), + itemsTupleCount_(), + minItems_(), + maxItems_(SizeType(~0)), + additionalItems_(true), + uniqueItems_(false), + pattern_(), + minLength_(0), + maxLength_(~SizeType(0)), + exclusiveMinimum_(false), + exclusiveMaximum_(false), + defaultValueLength_(0) + { + typedef typename SchemaDocumentType::ValueType ValueType; + typedef typename ValueType::ConstValueIterator ConstValueIterator; + typedef typename ValueType::ConstMemberIterator ConstMemberIterator; + + if (!value.IsObject()) + return; + + if (const ValueType* v = GetMember(value, GetTypeString())) { + type_ = 0; + if (v->IsString()) + AddType(*v); + else if (v->IsArray()) + for (ConstValueIterator itr = v->Begin(); itr != v->End(); ++itr) + AddType(*itr); + } + + if (const ValueType* v = GetMember(value, GetEnumString())) + if (v->IsArray() && v->Size() > 0) { + enum_ = static_cast(allocator_->Malloc(sizeof(uint64_t) * v->Size())); + for (ConstValueIterator itr = v->Begin(); itr != v->End(); ++itr) { + typedef Hasher > EnumHasherType; + char buffer[256u + 24]; + MemoryPoolAllocator<> hasherAllocator(buffer, sizeof(buffer)); + EnumHasherType h(&hasherAllocator, 256); + itr->Accept(h); + enum_[enumCount_++] = h.GetHashCode(); + } + } + + if (schemaDocument) { + AssignIfExist(allOf_, *schemaDocument, p, value, GetAllOfString(), document); + AssignIfExist(anyOf_, *schemaDocument, p, value, GetAnyOfString(), document); + AssignIfExist(oneOf_, *schemaDocument, p, value, GetOneOfString(), document); + } + + if (const ValueType* v = GetMember(value, GetNotString())) { + schemaDocument->CreateSchema(¬_, p.Append(GetNotString(), allocator_), *v, document); + notValidatorIndex_ = validatorCount_; + validatorCount_++; + } + + // Object + + const ValueType* properties = GetMember(value, GetPropertiesString()); + const ValueType* required = GetMember(value, GetRequiredString()); + const ValueType* dependencies = GetMember(value, GetDependenciesString()); + { + // Gather properties from properties/required/dependencies + SValue allProperties(kArrayType); + + if (properties && properties->IsObject()) + for (ConstMemberIterator itr = properties->MemberBegin(); itr != properties->MemberEnd(); ++itr) + AddUniqueElement(allProperties, itr->name); + + if (required && required->IsArray()) + for (ConstValueIterator itr = required->Begin(); itr != required->End(); ++itr) + if (itr->IsString()) + AddUniqueElement(allProperties, *itr); + + if (dependencies && dependencies->IsObject()) + for (ConstMemberIterator itr = dependencies->MemberBegin(); itr != dependencies->MemberEnd(); ++itr) { + AddUniqueElement(allProperties, itr->name); + if (itr->value.IsArray()) + for (ConstValueIterator i = itr->value.Begin(); i != itr->value.End(); ++i) + if (i->IsString()) + AddUniqueElement(allProperties, *i); + } + + if (allProperties.Size() > 0) { + propertyCount_ = allProperties.Size(); + properties_ = static_cast(allocator_->Malloc(sizeof(Property) * propertyCount_)); + for (SizeType i = 0; i < propertyCount_; i++) { + new (&properties_[i]) Property(); + properties_[i].name = allProperties[i]; + properties_[i].schema = typeless_; + } + } + } + + if (properties && properties->IsObject()) { + PointerType q = p.Append(GetPropertiesString(), allocator_); + for (ConstMemberIterator itr = properties->MemberBegin(); itr != properties->MemberEnd(); ++itr) { + SizeType index; + if (FindPropertyIndex(itr->name, &index)) + schemaDocument->CreateSchema(&properties_[index].schema, q.Append(itr->name, allocator_), itr->value, document); + } + } + + if (const ValueType* v = GetMember(value, GetPatternPropertiesString())) { + PointerType q = p.Append(GetPatternPropertiesString(), allocator_); + patternProperties_ = static_cast(allocator_->Malloc(sizeof(PatternProperty) * v->MemberCount())); + patternPropertyCount_ = 0; + + for (ConstMemberIterator itr = v->MemberBegin(); itr != v->MemberEnd(); ++itr) { + new (&patternProperties_[patternPropertyCount_]) PatternProperty(); + patternProperties_[patternPropertyCount_].pattern = CreatePattern(itr->name); + schemaDocument->CreateSchema(&patternProperties_[patternPropertyCount_].schema, q.Append(itr->name, allocator_), itr->value, document); + patternPropertyCount_++; + } + } + + if (required && required->IsArray()) + for (ConstValueIterator itr = required->Begin(); itr != required->End(); ++itr) + if (itr->IsString()) { + SizeType index; + if (FindPropertyIndex(*itr, &index)) { + properties_[index].required = true; + hasRequired_ = true; + } + } + + if (dependencies && dependencies->IsObject()) { + PointerType q = p.Append(GetDependenciesString(), allocator_); + hasDependencies_ = true; + for (ConstMemberIterator itr = dependencies->MemberBegin(); itr != dependencies->MemberEnd(); ++itr) { + SizeType sourceIndex; + if (FindPropertyIndex(itr->name, &sourceIndex)) { + if (itr->value.IsArray()) { + properties_[sourceIndex].dependencies = static_cast(allocator_->Malloc(sizeof(bool) * propertyCount_)); + std::memset(properties_[sourceIndex].dependencies, 0, sizeof(bool)* propertyCount_); + for (ConstValueIterator targetItr = itr->value.Begin(); targetItr != itr->value.End(); ++targetItr) { + SizeType targetIndex; + if (FindPropertyIndex(*targetItr, &targetIndex)) + properties_[sourceIndex].dependencies[targetIndex] = true; + } + } + else if (itr->value.IsObject()) { + hasSchemaDependencies_ = true; + schemaDocument->CreateSchema(&properties_[sourceIndex].dependenciesSchema, q.Append(itr->name, allocator_), itr->value, document); + properties_[sourceIndex].dependenciesValidatorIndex = validatorCount_; + validatorCount_++; + } + } + } + } + + if (const ValueType* v = GetMember(value, GetAdditionalPropertiesString())) { + if (v->IsBool()) + additionalProperties_ = v->GetBool(); + else if (v->IsObject()) + schemaDocument->CreateSchema(&additionalPropertiesSchema_, p.Append(GetAdditionalPropertiesString(), allocator_), *v, document); + } + + AssignIfExist(minProperties_, value, GetMinPropertiesString()); + AssignIfExist(maxProperties_, value, GetMaxPropertiesString()); + + // Array + if (const ValueType* v = GetMember(value, GetItemsString())) { + PointerType q = p.Append(GetItemsString(), allocator_); + if (v->IsObject()) // List validation + schemaDocument->CreateSchema(&itemsList_, q, *v, document); + else if (v->IsArray()) { // Tuple validation + itemsTuple_ = static_cast(allocator_->Malloc(sizeof(const Schema*) * v->Size())); + SizeType index = 0; + for (ConstValueIterator itr = v->Begin(); itr != v->End(); ++itr, index++) + schemaDocument->CreateSchema(&itemsTuple_[itemsTupleCount_++], q.Append(index, allocator_), *itr, document); + } + } + + AssignIfExist(minItems_, value, GetMinItemsString()); + AssignIfExist(maxItems_, value, GetMaxItemsString()); + + if (const ValueType* v = GetMember(value, GetAdditionalItemsString())) { + if (v->IsBool()) + additionalItems_ = v->GetBool(); + else if (v->IsObject()) + schemaDocument->CreateSchema(&additionalItemsSchema_, p.Append(GetAdditionalItemsString(), allocator_), *v, document); + } + + AssignIfExist(uniqueItems_, value, GetUniqueItemsString()); + + // String + AssignIfExist(minLength_, value, GetMinLengthString()); + AssignIfExist(maxLength_, value, GetMaxLengthString()); + + if (const ValueType* v = GetMember(value, GetPatternString())) + pattern_ = CreatePattern(*v); + + // Number + if (const ValueType* v = GetMember(value, GetMinimumString())) + if (v->IsNumber()) + minimum_.CopyFrom(*v, *allocator_); + + if (const ValueType* v = GetMember(value, GetMaximumString())) + if (v->IsNumber()) + maximum_.CopyFrom(*v, *allocator_); + + AssignIfExist(exclusiveMinimum_, value, GetExclusiveMinimumString()); + AssignIfExist(exclusiveMaximum_, value, GetExclusiveMaximumString()); + + if (const ValueType* v = GetMember(value, GetMultipleOfString())) + if (v->IsNumber() && v->GetDouble() > 0.0) + multipleOf_.CopyFrom(*v, *allocator_); + + // Default + if (const ValueType* v = GetMember(value, GetDefaultValueString())) + if (v->IsString()) + defaultValueLength_ = v->GetStringLength(); + + } + + ~Schema() { + AllocatorType::Free(enum_); + if (properties_) { + for (SizeType i = 0; i < propertyCount_; i++) + properties_[i].~Property(); + AllocatorType::Free(properties_); + } + if (patternProperties_) { + for (SizeType i = 0; i < patternPropertyCount_; i++) + patternProperties_[i].~PatternProperty(); + AllocatorType::Free(patternProperties_); + } + AllocatorType::Free(itemsTuple_); +#if RAPIDJSON_SCHEMA_HAS_REGEX + if (pattern_) { + pattern_->~RegexType(); + AllocatorType::Free(pattern_); + } +#endif + } + + const SValue& GetURI() const { + return uri_; + } + + const PointerType& GetPointer() const { + return pointer_; + } + + bool BeginValue(Context& context) const { + if (context.inArray) { + if (uniqueItems_) + context.valueUniqueness = true; + + if (itemsList_) + context.valueSchema = itemsList_; + else if (itemsTuple_) { + if (context.arrayElementIndex < itemsTupleCount_) + context.valueSchema = itemsTuple_[context.arrayElementIndex]; + else if (additionalItemsSchema_) + context.valueSchema = additionalItemsSchema_; + else if (additionalItems_) + context.valueSchema = typeless_; + else { + context.error_handler.DisallowedItem(context.arrayElementIndex); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetItemsString()); + } + } + else + context.valueSchema = typeless_; + + context.arrayElementIndex++; + } + return true; + } + + RAPIDJSON_FORCEINLINE bool EndValue(Context& context) const { + if (context.patternPropertiesValidatorCount > 0) { + bool otherValid = false; + SizeType count = context.patternPropertiesValidatorCount; + if (context.objectPatternValidatorType != Context::kPatternValidatorOnly) + otherValid = context.patternPropertiesValidators[--count]->IsValid(); + + bool patternValid = true; + for (SizeType i = 0; i < count; i++) + if (!context.patternPropertiesValidators[i]->IsValid()) { + patternValid = false; + break; + } + + if (context.objectPatternValidatorType == Context::kPatternValidatorOnly) { + if (!patternValid) { + context.error_handler.PropertyViolations(context.patternPropertiesValidators, count); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetPatternPropertiesString()); + } + } + else if (context.objectPatternValidatorType == Context::kPatternValidatorWithProperty) { + if (!patternValid || !otherValid) { + context.error_handler.PropertyViolations(context.patternPropertiesValidators, count + 1); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetPatternPropertiesString()); + } + } + else if (!patternValid && !otherValid) { // kPatternValidatorWithAdditionalProperty) + context.error_handler.PropertyViolations(context.patternPropertiesValidators, count + 1); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetPatternPropertiesString()); + } + } + + if (enum_) { + const uint64_t h = context.factory.GetHashCode(context.hasher); + for (SizeType i = 0; i < enumCount_; i++) + if (enum_[i] == h) + goto foundEnum; + context.error_handler.DisallowedValue(); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetEnumString()); + foundEnum:; + } + + if (allOf_.schemas) + for (SizeType i = allOf_.begin; i < allOf_.begin + allOf_.count; i++) + if (!context.validators[i]->IsValid()) { + context.error_handler.NotAllOf(&context.validators[allOf_.begin], allOf_.count); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetAllOfString()); + } + + if (anyOf_.schemas) { + for (SizeType i = anyOf_.begin; i < anyOf_.begin + anyOf_.count; i++) + if (context.validators[i]->IsValid()) + goto foundAny; + context.error_handler.NoneOf(&context.validators[anyOf_.begin], anyOf_.count); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetAnyOfString()); + foundAny:; + } + + if (oneOf_.schemas) { + bool oneValid = false; + for (SizeType i = oneOf_.begin; i < oneOf_.begin + oneOf_.count; i++) + if (context.validators[i]->IsValid()) { + if (oneValid) { + context.error_handler.NotOneOf(&context.validators[oneOf_.begin], oneOf_.count); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetOneOfString()); + } else + oneValid = true; + } + if (!oneValid) { + context.error_handler.NotOneOf(&context.validators[oneOf_.begin], oneOf_.count); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetOneOfString()); + } + } + + if (not_ && context.validators[notValidatorIndex_]->IsValid()) { + context.error_handler.Disallowed(); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetNotString()); + } + + return true; + } + + bool Null(Context& context) const { + if (!(type_ & (1 << kNullSchemaType))) { + DisallowedType(context, GetNullString()); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + } + return CreateParallelValidator(context); + } + + bool Bool(Context& context, bool) const { + if (!(type_ & (1 << kBooleanSchemaType))) { + DisallowedType(context, GetBooleanString()); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + } + return CreateParallelValidator(context); + } + + bool Int(Context& context, int i) const { + if (!CheckInt(context, i)) + return false; + return CreateParallelValidator(context); + } + + bool Uint(Context& context, unsigned u) const { + if (!CheckUint(context, u)) + return false; + return CreateParallelValidator(context); + } + + bool Int64(Context& context, int64_t i) const { + if (!CheckInt(context, i)) + return false; + return CreateParallelValidator(context); + } + + bool Uint64(Context& context, uint64_t u) const { + if (!CheckUint(context, u)) + return false; + return CreateParallelValidator(context); + } + + bool Double(Context& context, double d) const { + if (!(type_ & (1 << kNumberSchemaType))) { + DisallowedType(context, GetNumberString()); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + } + + if (!minimum_.IsNull() && !CheckDoubleMinimum(context, d)) + return false; + + if (!maximum_.IsNull() && !CheckDoubleMaximum(context, d)) + return false; + + if (!multipleOf_.IsNull() && !CheckDoubleMultipleOf(context, d)) + return false; + + return CreateParallelValidator(context); + } + + bool String(Context& context, const Ch* str, SizeType length, bool) const { + if (!(type_ & (1 << kStringSchemaType))) { + DisallowedType(context, GetStringString()); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + } + + if (minLength_ != 0 || maxLength_ != SizeType(~0)) { + SizeType count; + if (internal::CountStringCodePoint(str, length, &count)) { + if (count < minLength_) { + context.error_handler.TooShort(str, length, minLength_); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinLengthString()); + } + if (count > maxLength_) { + context.error_handler.TooLong(str, length, maxLength_); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaxLengthString()); + } + } + } + + if (pattern_ && !IsPatternMatch(pattern_, str, length)) { + context.error_handler.DoesNotMatch(str, length); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetPatternString()); + } + + return CreateParallelValidator(context); + } + + bool StartObject(Context& context) const { + if (!(type_ & (1 << kObjectSchemaType))) { + DisallowedType(context, GetObjectString()); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + } + + if (hasDependencies_ || hasRequired_) { + context.propertyExist = static_cast(context.factory.MallocState(sizeof(bool) * propertyCount_)); + std::memset(context.propertyExist, 0, sizeof(bool) * propertyCount_); + } + + if (patternProperties_) { // pre-allocate schema array + SizeType count = patternPropertyCount_ + 1; // extra for valuePatternValidatorType + context.patternPropertiesSchemas = static_cast(context.factory.MallocState(sizeof(const SchemaType*) * count)); + context.patternPropertiesSchemaCount = 0; + std::memset(context.patternPropertiesSchemas, 0, sizeof(SchemaType*) * count); + } + + return CreateParallelValidator(context); + } + + bool Key(Context& context, const Ch* str, SizeType len, bool) const { + if (patternProperties_) { + context.patternPropertiesSchemaCount = 0; + for (SizeType i = 0; i < patternPropertyCount_; i++) + if (patternProperties_[i].pattern && IsPatternMatch(patternProperties_[i].pattern, str, len)) { + context.patternPropertiesSchemas[context.patternPropertiesSchemaCount++] = patternProperties_[i].schema; + context.valueSchema = typeless_; + } + } + + SizeType index; + if (FindPropertyIndex(ValueType(str, len).Move(), &index)) { + if (context.patternPropertiesSchemaCount > 0) { + context.patternPropertiesSchemas[context.patternPropertiesSchemaCount++] = properties_[index].schema; + context.valueSchema = typeless_; + context.valuePatternValidatorType = Context::kPatternValidatorWithProperty; + } + else + context.valueSchema = properties_[index].schema; + + if (context.propertyExist) + context.propertyExist[index] = true; + + return true; + } + + if (additionalPropertiesSchema_) { + if (additionalPropertiesSchema_ && context.patternPropertiesSchemaCount > 0) { + context.patternPropertiesSchemas[context.patternPropertiesSchemaCount++] = additionalPropertiesSchema_; + context.valueSchema = typeless_; + context.valuePatternValidatorType = Context::kPatternValidatorWithAdditionalProperty; + } + else + context.valueSchema = additionalPropertiesSchema_; + return true; + } + else if (additionalProperties_) { + context.valueSchema = typeless_; + return true; + } + + if (context.patternPropertiesSchemaCount == 0) { // patternProperties are not additional properties + context.error_handler.DisallowedProperty(str, len); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetAdditionalPropertiesString()); + } + + return true; + } + + bool EndObject(Context& context, SizeType memberCount) const { + if (hasRequired_) { + context.error_handler.StartMissingProperties(); + for (SizeType index = 0; index < propertyCount_; index++) + if (properties_[index].required && !context.propertyExist[index]) + if (properties_[index].schema->defaultValueLength_ == 0 ) + context.error_handler.AddMissingProperty(properties_[index].name); + if (context.error_handler.EndMissingProperties()) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetRequiredString()); + } + + if (memberCount < minProperties_) { + context.error_handler.TooFewProperties(memberCount, minProperties_); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinPropertiesString()); + } + + if (memberCount > maxProperties_) { + context.error_handler.TooManyProperties(memberCount, maxProperties_); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaxPropertiesString()); + } + + if (hasDependencies_) { + context.error_handler.StartDependencyErrors(); + for (SizeType sourceIndex = 0; sourceIndex < propertyCount_; sourceIndex++) { + const Property& source = properties_[sourceIndex]; + if (context.propertyExist[sourceIndex]) { + if (source.dependencies) { + context.error_handler.StartMissingDependentProperties(); + for (SizeType targetIndex = 0; targetIndex < propertyCount_; targetIndex++) + if (source.dependencies[targetIndex] && !context.propertyExist[targetIndex]) + context.error_handler.AddMissingDependentProperty(properties_[targetIndex].name); + context.error_handler.EndMissingDependentProperties(source.name); + } + else if (source.dependenciesSchema) { + ISchemaValidator* dependenciesValidator = context.validators[source.dependenciesValidatorIndex]; + if (!dependenciesValidator->IsValid()) + context.error_handler.AddDependencySchemaError(source.name, dependenciesValidator); + } + } + } + if (context.error_handler.EndDependencyErrors()) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetDependenciesString()); + } + + return true; + } + + bool StartArray(Context& context) const { + if (!(type_ & (1 << kArraySchemaType))) { + DisallowedType(context, GetArrayString()); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + } + + context.arrayElementIndex = 0; + context.inArray = true; + + return CreateParallelValidator(context); + } + + bool EndArray(Context& context, SizeType elementCount) const { + context.inArray = false; + + if (elementCount < minItems_) { + context.error_handler.TooFewItems(elementCount, minItems_); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinItemsString()); + } + + if (elementCount > maxItems_) { + context.error_handler.TooManyItems(elementCount, maxItems_); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaxItemsString()); + } + + return true; + } + + // Generate functions for string literal according to Ch +#define RAPIDJSON_STRING_(name, ...) \ + static const ValueType& Get##name##String() {\ + static const Ch s[] = { __VA_ARGS__, '\0' };\ + static const ValueType v(s, static_cast(sizeof(s) / sizeof(Ch) - 1));\ + return v;\ + } + + RAPIDJSON_STRING_(Null, 'n', 'u', 'l', 'l') + RAPIDJSON_STRING_(Boolean, 'b', 'o', 'o', 'l', 'e', 'a', 'n') + RAPIDJSON_STRING_(Object, 'o', 'b', 'j', 'e', 'c', 't') + RAPIDJSON_STRING_(Array, 'a', 'r', 'r', 'a', 'y') + RAPIDJSON_STRING_(String, 's', 't', 'r', 'i', 'n', 'g') + RAPIDJSON_STRING_(Number, 'n', 'u', 'm', 'b', 'e', 'r') + RAPIDJSON_STRING_(Integer, 'i', 'n', 't', 'e', 'g', 'e', 'r') + RAPIDJSON_STRING_(Type, 't', 'y', 'p', 'e') + RAPIDJSON_STRING_(Enum, 'e', 'n', 'u', 'm') + RAPIDJSON_STRING_(AllOf, 'a', 'l', 'l', 'O', 'f') + RAPIDJSON_STRING_(AnyOf, 'a', 'n', 'y', 'O', 'f') + RAPIDJSON_STRING_(OneOf, 'o', 'n', 'e', 'O', 'f') + RAPIDJSON_STRING_(Not, 'n', 'o', 't') + RAPIDJSON_STRING_(Properties, 'p', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's') + RAPIDJSON_STRING_(Required, 'r', 'e', 'q', 'u', 'i', 'r', 'e', 'd') + RAPIDJSON_STRING_(Dependencies, 'd', 'e', 'p', 'e', 'n', 'd', 'e', 'n', 'c', 'i', 'e', 's') + RAPIDJSON_STRING_(PatternProperties, 'p', 'a', 't', 't', 'e', 'r', 'n', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's') + RAPIDJSON_STRING_(AdditionalProperties, 'a', 'd', 'd', 'i', 't', 'i', 'o', 'n', 'a', 'l', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's') + RAPIDJSON_STRING_(MinProperties, 'm', 'i', 'n', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's') + RAPIDJSON_STRING_(MaxProperties, 'm', 'a', 'x', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's') + RAPIDJSON_STRING_(Items, 'i', 't', 'e', 'm', 's') + RAPIDJSON_STRING_(MinItems, 'm', 'i', 'n', 'I', 't', 'e', 'm', 's') + RAPIDJSON_STRING_(MaxItems, 'm', 'a', 'x', 'I', 't', 'e', 'm', 's') + RAPIDJSON_STRING_(AdditionalItems, 'a', 'd', 'd', 'i', 't', 'i', 'o', 'n', 'a', 'l', 'I', 't', 'e', 'm', 's') + RAPIDJSON_STRING_(UniqueItems, 'u', 'n', 'i', 'q', 'u', 'e', 'I', 't', 'e', 'm', 's') + RAPIDJSON_STRING_(MinLength, 'm', 'i', 'n', 'L', 'e', 'n', 'g', 't', 'h') + RAPIDJSON_STRING_(MaxLength, 'm', 'a', 'x', 'L', 'e', 'n', 'g', 't', 'h') + RAPIDJSON_STRING_(Pattern, 'p', 'a', 't', 't', 'e', 'r', 'n') + RAPIDJSON_STRING_(Minimum, 'm', 'i', 'n', 'i', 'm', 'u', 'm') + RAPIDJSON_STRING_(Maximum, 'm', 'a', 'x', 'i', 'm', 'u', 'm') + RAPIDJSON_STRING_(ExclusiveMinimum, 'e', 'x', 'c', 'l', 'u', 's', 'i', 'v', 'e', 'M', 'i', 'n', 'i', 'm', 'u', 'm') + RAPIDJSON_STRING_(ExclusiveMaximum, 'e', 'x', 'c', 'l', 'u', 's', 'i', 'v', 'e', 'M', 'a', 'x', 'i', 'm', 'u', 'm') + RAPIDJSON_STRING_(MultipleOf, 'm', 'u', 'l', 't', 'i', 'p', 'l', 'e', 'O', 'f') + RAPIDJSON_STRING_(DefaultValue, 'd', 'e', 'f', 'a', 'u', 'l', 't') + +#undef RAPIDJSON_STRING_ + +private: + enum SchemaValueType { + kNullSchemaType, + kBooleanSchemaType, + kObjectSchemaType, + kArraySchemaType, + kStringSchemaType, + kNumberSchemaType, + kIntegerSchemaType, + kTotalSchemaType + }; + +#if RAPIDJSON_SCHEMA_USE_INTERNALREGEX + typedef internal::GenericRegex RegexType; +#elif RAPIDJSON_SCHEMA_USE_STDREGEX + typedef std::basic_regex RegexType; +#else + typedef char RegexType; +#endif + + struct SchemaArray { + SchemaArray() : schemas(), count() {} + ~SchemaArray() { AllocatorType::Free(schemas); } + const SchemaType** schemas; + SizeType begin; // begin index of context.validators + SizeType count; + }; + + template + void AddUniqueElement(V1& a, const V2& v) { + for (typename V1::ConstValueIterator itr = a.Begin(); itr != a.End(); ++itr) + if (*itr == v) + return; + V1 c(v, *allocator_); + a.PushBack(c, *allocator_); + } + + static const ValueType* GetMember(const ValueType& value, const ValueType& name) { + typename ValueType::ConstMemberIterator itr = value.FindMember(name); + return itr != value.MemberEnd() ? &(itr->value) : 0; + } + + static void AssignIfExist(bool& out, const ValueType& value, const ValueType& name) { + if (const ValueType* v = GetMember(value, name)) + if (v->IsBool()) + out = v->GetBool(); + } + + static void AssignIfExist(SizeType& out, const ValueType& value, const ValueType& name) { + if (const ValueType* v = GetMember(value, name)) + if (v->IsUint64() && v->GetUint64() <= SizeType(~0)) + out = static_cast(v->GetUint64()); + } + + void AssignIfExist(SchemaArray& out, SchemaDocumentType& schemaDocument, const PointerType& p, const ValueType& value, const ValueType& name, const ValueType& document) { + if (const ValueType* v = GetMember(value, name)) { + if (v->IsArray() && v->Size() > 0) { + PointerType q = p.Append(name, allocator_); + out.count = v->Size(); + out.schemas = static_cast(allocator_->Malloc(out.count * sizeof(const Schema*))); + memset(out.schemas, 0, sizeof(Schema*)* out.count); + for (SizeType i = 0; i < out.count; i++) + schemaDocument.CreateSchema(&out.schemas[i], q.Append(i, allocator_), (*v)[i], document); + out.begin = validatorCount_; + validatorCount_ += out.count; + } + } + } + +#if RAPIDJSON_SCHEMA_USE_INTERNALREGEX + template + RegexType* CreatePattern(const ValueType& value) { + if (value.IsString()) { + RegexType* r = new (allocator_->Malloc(sizeof(RegexType))) RegexType(value.GetString(), allocator_); + if (!r->IsValid()) { + r->~RegexType(); + AllocatorType::Free(r); + r = 0; + } + return r; + } + return 0; + } + + static bool IsPatternMatch(const RegexType* pattern, const Ch *str, SizeType) { + GenericRegexSearch rs(*pattern); + return rs.Search(str); + } +#elif RAPIDJSON_SCHEMA_USE_STDREGEX + template + RegexType* CreatePattern(const ValueType& value) { + if (value.IsString()) + try { + return new (allocator_->Malloc(sizeof(RegexType))) RegexType(value.GetString(), std::size_t(value.GetStringLength()), std::regex_constants::ECMAScript); + } + catch (const std::regex_error&) { + } + return 0; + } + + static bool IsPatternMatch(const RegexType* pattern, const Ch *str, SizeType length) { + std::match_results r; + return std::regex_search(str, str + length, r, *pattern); + } +#else + template + RegexType* CreatePattern(const ValueType&) { return 0; } + + static bool IsPatternMatch(const RegexType*, const Ch *, SizeType) { return true; } +#endif // RAPIDJSON_SCHEMA_USE_STDREGEX + + void AddType(const ValueType& type) { + if (type == GetNullString() ) type_ |= 1 << kNullSchemaType; + else if (type == GetBooleanString()) type_ |= 1 << kBooleanSchemaType; + else if (type == GetObjectString() ) type_ |= 1 << kObjectSchemaType; + else if (type == GetArrayString() ) type_ |= 1 << kArraySchemaType; + else if (type == GetStringString() ) type_ |= 1 << kStringSchemaType; + else if (type == GetIntegerString()) type_ |= 1 << kIntegerSchemaType; + else if (type == GetNumberString() ) type_ |= (1 << kNumberSchemaType) | (1 << kIntegerSchemaType); + } + + bool CreateParallelValidator(Context& context) const { + if (enum_ || context.arrayUniqueness) + context.hasher = context.factory.CreateHasher(); + + if (validatorCount_) { + RAPIDJSON_ASSERT(context.validators == 0); + context.validators = static_cast(context.factory.MallocState(sizeof(ISchemaValidator*) * validatorCount_)); + context.validatorCount = validatorCount_; + + if (allOf_.schemas) + CreateSchemaValidators(context, allOf_); + + if (anyOf_.schemas) + CreateSchemaValidators(context, anyOf_); + + if (oneOf_.schemas) + CreateSchemaValidators(context, oneOf_); + + if (not_) + context.validators[notValidatorIndex_] = context.factory.CreateSchemaValidator(*not_); + + if (hasSchemaDependencies_) { + for (SizeType i = 0; i < propertyCount_; i++) + if (properties_[i].dependenciesSchema) + context.validators[properties_[i].dependenciesValidatorIndex] = context.factory.CreateSchemaValidator(*properties_[i].dependenciesSchema); + } + } + + return true; + } + + void CreateSchemaValidators(Context& context, const SchemaArray& schemas) const { + for (SizeType i = 0; i < schemas.count; i++) + context.validators[schemas.begin + i] = context.factory.CreateSchemaValidator(*schemas.schemas[i]); + } + + // O(n) + bool FindPropertyIndex(const ValueType& name, SizeType* outIndex) const { + SizeType len = name.GetStringLength(); + const Ch* str = name.GetString(); + for (SizeType index = 0; index < propertyCount_; index++) + if (properties_[index].name.GetStringLength() == len && + (std::memcmp(properties_[index].name.GetString(), str, sizeof(Ch) * len) == 0)) + { + *outIndex = index; + return true; + } + return false; + } + + bool CheckInt(Context& context, int64_t i) const { + if (!(type_ & ((1 << kIntegerSchemaType) | (1 << kNumberSchemaType)))) { + DisallowedType(context, GetIntegerString()); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + } + + if (!minimum_.IsNull()) { + if (minimum_.IsInt64()) { + if (exclusiveMinimum_ ? i <= minimum_.GetInt64() : i < minimum_.GetInt64()) { + context.error_handler.BelowMinimum(i, minimum_, exclusiveMinimum_); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinimumString()); + } + } + else if (minimum_.IsUint64()) { + context.error_handler.BelowMinimum(i, minimum_, exclusiveMinimum_); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinimumString()); // i <= max(int64_t) < minimum.GetUint64() + } + else if (!CheckDoubleMinimum(context, static_cast(i))) + return false; + } + + if (!maximum_.IsNull()) { + if (maximum_.IsInt64()) { + if (exclusiveMaximum_ ? i >= maximum_.GetInt64() : i > maximum_.GetInt64()) { + context.error_handler.AboveMaximum(i, maximum_, exclusiveMaximum_); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaximumString()); + } + } + else if (maximum_.IsUint64()) { } + /* do nothing */ // i <= max(int64_t) < maximum_.GetUint64() + else if (!CheckDoubleMaximum(context, static_cast(i))) + return false; + } + + if (!multipleOf_.IsNull()) { + if (multipleOf_.IsUint64()) { + if (static_cast(i >= 0 ? i : -i) % multipleOf_.GetUint64() != 0) { + context.error_handler.NotMultipleOf(i, multipleOf_); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMultipleOfString()); + } + } + else if (!CheckDoubleMultipleOf(context, static_cast(i))) + return false; + } + + return true; + } + + bool CheckUint(Context& context, uint64_t i) const { + if (!(type_ & ((1 << kIntegerSchemaType) | (1 << kNumberSchemaType)))) { + DisallowedType(context, GetIntegerString()); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + } + + if (!minimum_.IsNull()) { + if (minimum_.IsUint64()) { + if (exclusiveMinimum_ ? i <= minimum_.GetUint64() : i < minimum_.GetUint64()) { + context.error_handler.BelowMinimum(i, minimum_, exclusiveMinimum_); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinimumString()); + } + } + else if (minimum_.IsInt64()) + /* do nothing */; // i >= 0 > minimum.Getint64() + else if (!CheckDoubleMinimum(context, static_cast(i))) + return false; + } + + if (!maximum_.IsNull()) { + if (maximum_.IsUint64()) { + if (exclusiveMaximum_ ? i >= maximum_.GetUint64() : i > maximum_.GetUint64()) { + context.error_handler.AboveMaximum(i, maximum_, exclusiveMaximum_); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaximumString()); + } + } + else if (maximum_.IsInt64()) { + context.error_handler.AboveMaximum(i, maximum_, exclusiveMaximum_); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaximumString()); // i >= 0 > maximum_ + } + else if (!CheckDoubleMaximum(context, static_cast(i))) + return false; + } + + if (!multipleOf_.IsNull()) { + if (multipleOf_.IsUint64()) { + if (i % multipleOf_.GetUint64() != 0) { + context.error_handler.NotMultipleOf(i, multipleOf_); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMultipleOfString()); + } + } + else if (!CheckDoubleMultipleOf(context, static_cast(i))) + return false; + } + + return true; + } + + bool CheckDoubleMinimum(Context& context, double d) const { + if (exclusiveMinimum_ ? d <= minimum_.GetDouble() : d < minimum_.GetDouble()) { + context.error_handler.BelowMinimum(d, minimum_, exclusiveMinimum_); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinimumString()); + } + return true; + } + + bool CheckDoubleMaximum(Context& context, double d) const { + if (exclusiveMaximum_ ? d >= maximum_.GetDouble() : d > maximum_.GetDouble()) { + context.error_handler.AboveMaximum(d, maximum_, exclusiveMaximum_); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaximumString()); + } + return true; + } + + bool CheckDoubleMultipleOf(Context& context, double d) const { + double a = std::abs(d), b = std::abs(multipleOf_.GetDouble()); + double q = std::floor(a / b); + double r = a - q * b; + if (r > 0.0) { + context.error_handler.NotMultipleOf(d, multipleOf_); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMultipleOfString()); + } + return true; + } + + void DisallowedType(Context& context, const ValueType& actualType) const { + ErrorHandler& eh = context.error_handler; + eh.StartDisallowedType(); + + if (type_ & (1 << kNullSchemaType)) eh.AddExpectedType(GetNullString()); + if (type_ & (1 << kBooleanSchemaType)) eh.AddExpectedType(GetBooleanString()); + if (type_ & (1 << kObjectSchemaType)) eh.AddExpectedType(GetObjectString()); + if (type_ & (1 << kArraySchemaType)) eh.AddExpectedType(GetArrayString()); + if (type_ & (1 << kStringSchemaType)) eh.AddExpectedType(GetStringString()); + + if (type_ & (1 << kNumberSchemaType)) eh.AddExpectedType(GetNumberString()); + else if (type_ & (1 << kIntegerSchemaType)) eh.AddExpectedType(GetIntegerString()); + + eh.EndDisallowedType(actualType); + } + + struct Property { + Property() : schema(), dependenciesSchema(), dependenciesValidatorIndex(), dependencies(), required(false) {} + ~Property() { AllocatorType::Free(dependencies); } + SValue name; + const SchemaType* schema; + const SchemaType* dependenciesSchema; + SizeType dependenciesValidatorIndex; + bool* dependencies; + bool required; + }; + + struct PatternProperty { + PatternProperty() : schema(), pattern() {} + ~PatternProperty() { + if (pattern) { + pattern->~RegexType(); + AllocatorType::Free(pattern); + } + } + const SchemaType* schema; + RegexType* pattern; + }; + + AllocatorType* allocator_; + SValue uri_; + PointerType pointer_; + const SchemaType* typeless_; + uint64_t* enum_; + SizeType enumCount_; + SchemaArray allOf_; + SchemaArray anyOf_; + SchemaArray oneOf_; + const SchemaType* not_; + unsigned type_; // bitmask of kSchemaType + SizeType validatorCount_; + SizeType notValidatorIndex_; + + Property* properties_; + const SchemaType* additionalPropertiesSchema_; + PatternProperty* patternProperties_; + SizeType patternPropertyCount_; + SizeType propertyCount_; + SizeType minProperties_; + SizeType maxProperties_; + bool additionalProperties_; + bool hasDependencies_; + bool hasRequired_; + bool hasSchemaDependencies_; + + const SchemaType* additionalItemsSchema_; + const SchemaType* itemsList_; + const SchemaType** itemsTuple_; + SizeType itemsTupleCount_; + SizeType minItems_; + SizeType maxItems_; + bool additionalItems_; + bool uniqueItems_; + + RegexType* pattern_; + SizeType minLength_; + SizeType maxLength_; + + SValue minimum_; + SValue maximum_; + SValue multipleOf_; + bool exclusiveMinimum_; + bool exclusiveMaximum_; + + SizeType defaultValueLength_; +}; + +template +struct TokenHelper { + RAPIDJSON_FORCEINLINE static void AppendIndexToken(Stack& documentStack, SizeType index) { + *documentStack.template Push() = '/'; + char buffer[21]; + size_t length = static_cast((sizeof(SizeType) == 4 ? u32toa(index, buffer) : u64toa(index, buffer)) - buffer); + for (size_t i = 0; i < length; i++) + *documentStack.template Push() = static_cast(buffer[i]); + } +}; + +// Partial specialized version for char to prevent buffer copying. +template +struct TokenHelper { + RAPIDJSON_FORCEINLINE static void AppendIndexToken(Stack& documentStack, SizeType index) { + if (sizeof(SizeType) == 4) { + char *buffer = documentStack.template Push(1 + 10); // '/' + uint + *buffer++ = '/'; + const char* end = internal::u32toa(index, buffer); + documentStack.template Pop(static_cast(10 - (end - buffer))); + } + else { + char *buffer = documentStack.template Push(1 + 20); // '/' + uint64 + *buffer++ = '/'; + const char* end = internal::u64toa(index, buffer); + documentStack.template Pop(static_cast(20 - (end - buffer))); + } + } +}; + +} // namespace internal + +/////////////////////////////////////////////////////////////////////////////// +// IGenericRemoteSchemaDocumentProvider + +template +class IGenericRemoteSchemaDocumentProvider { +public: + typedef typename SchemaDocumentType::Ch Ch; + + virtual ~IGenericRemoteSchemaDocumentProvider() {} + virtual const SchemaDocumentType* GetRemoteDocument(const Ch* uri, SizeType length) = 0; +}; + +/////////////////////////////////////////////////////////////////////////////// +// GenericSchemaDocument + +//! JSON schema document. +/*! + A JSON schema document is a compiled version of a JSON schema. + It is basically a tree of internal::Schema. + + \note This is an immutable class (i.e. its instance cannot be modified after construction). + \tparam ValueT Type of JSON value (e.g. \c Value ), which also determine the encoding. + \tparam Allocator Allocator type for allocating memory of this document. +*/ +template +class GenericSchemaDocument { +public: + typedef ValueT ValueType; + typedef IGenericRemoteSchemaDocumentProvider IRemoteSchemaDocumentProviderType; + typedef Allocator AllocatorType; + typedef typename ValueType::EncodingType EncodingType; + typedef typename EncodingType::Ch Ch; + typedef internal::Schema SchemaType; + typedef GenericPointer PointerType; + typedef GenericValue URIType; + friend class internal::Schema; + template + friend class GenericSchemaValidator; + + //! Constructor. + /*! + Compile a JSON document into schema document. + + \param document A JSON document as source. + \param uri The base URI of this schema document for purposes of violation reporting. + \param uriLength Length of \c name, in code points. + \param remoteProvider An optional remote schema document provider for resolving remote reference. Can be null. + \param allocator An optional allocator instance for allocating memory. Can be null. + */ + explicit GenericSchemaDocument(const ValueType& document, const Ch* uri = 0, SizeType uriLength = 0, + IRemoteSchemaDocumentProviderType* remoteProvider = 0, Allocator* allocator = 0) : + remoteProvider_(remoteProvider), + allocator_(allocator), + ownAllocator_(), + root_(), + typeless_(), + schemaMap_(allocator, kInitialSchemaMapSize), + schemaRef_(allocator, kInitialSchemaRefSize) + { + if (!allocator_) + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator)(); + + Ch noUri[1] = {0}; + uri_.SetString(uri ? uri : noUri, uriLength, *allocator_); + + typeless_ = static_cast(allocator_->Malloc(sizeof(SchemaType))); + new (typeless_) SchemaType(this, PointerType(), ValueType(kObjectType).Move(), ValueType(kObjectType).Move(), allocator_); + + // Generate root schema, it will call CreateSchema() to create sub-schemas, + // And call AddRefSchema() if there are $ref. + CreateSchemaRecursive(&root_, PointerType(), document, document); + + // Resolve $ref + while (!schemaRef_.Empty()) { + SchemaRefEntry* refEntry = schemaRef_.template Pop(1); + if (const SchemaType* s = GetSchema(refEntry->target)) { + if (refEntry->schema) + *refEntry->schema = s; + + // Create entry in map if not exist + if (!GetSchema(refEntry->source)) { + new (schemaMap_.template Push()) SchemaEntry(refEntry->source, const_cast(s), false, allocator_); + } + } + else if (refEntry->schema) + *refEntry->schema = typeless_; + + refEntry->~SchemaRefEntry(); + } + + RAPIDJSON_ASSERT(root_ != 0); + + schemaRef_.ShrinkToFit(); // Deallocate all memory for ref + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Move constructor in C++11 + GenericSchemaDocument(GenericSchemaDocument&& rhs) RAPIDJSON_NOEXCEPT : + remoteProvider_(rhs.remoteProvider_), + allocator_(rhs.allocator_), + ownAllocator_(rhs.ownAllocator_), + root_(rhs.root_), + typeless_(rhs.typeless_), + schemaMap_(std::move(rhs.schemaMap_)), + schemaRef_(std::move(rhs.schemaRef_)), + uri_(std::move(rhs.uri_)) + { + rhs.remoteProvider_ = 0; + rhs.allocator_ = 0; + rhs.ownAllocator_ = 0; + rhs.typeless_ = 0; + } +#endif + + //! Destructor + ~GenericSchemaDocument() { + while (!schemaMap_.Empty()) + schemaMap_.template Pop(1)->~SchemaEntry(); + + if (typeless_) { + typeless_->~SchemaType(); + Allocator::Free(typeless_); + } + + RAPIDJSON_DELETE(ownAllocator_); + } + + const URIType& GetURI() const { return uri_; } + + //! Get the root schema. + const SchemaType& GetRoot() const { return *root_; } + +private: + //! Prohibit copying + GenericSchemaDocument(const GenericSchemaDocument&); + //! Prohibit assignment + GenericSchemaDocument& operator=(const GenericSchemaDocument&); + + struct SchemaRefEntry { + SchemaRefEntry(const PointerType& s, const PointerType& t, const SchemaType** outSchema, Allocator *allocator) : source(s, allocator), target(t, allocator), schema(outSchema) {} + PointerType source; + PointerType target; + const SchemaType** schema; + }; + + struct SchemaEntry { + SchemaEntry(const PointerType& p, SchemaType* s, bool o, Allocator* allocator) : pointer(p, allocator), schema(s), owned(o) {} + ~SchemaEntry() { + if (owned) { + schema->~SchemaType(); + Allocator::Free(schema); + } + } + PointerType pointer; + SchemaType* schema; + bool owned; + }; + + void CreateSchemaRecursive(const SchemaType** schema, const PointerType& pointer, const ValueType& v, const ValueType& document) { + if (schema) + *schema = typeless_; + + if (v.GetType() == kObjectType) { + const SchemaType* s = GetSchema(pointer); + if (!s) + CreateSchema(schema, pointer, v, document); + + for (typename ValueType::ConstMemberIterator itr = v.MemberBegin(); itr != v.MemberEnd(); ++itr) + CreateSchemaRecursive(0, pointer.Append(itr->name, allocator_), itr->value, document); + } + else if (v.GetType() == kArrayType) + for (SizeType i = 0; i < v.Size(); i++) + CreateSchemaRecursive(0, pointer.Append(i, allocator_), v[i], document); + } + + void CreateSchema(const SchemaType** schema, const PointerType& pointer, const ValueType& v, const ValueType& document) { + RAPIDJSON_ASSERT(pointer.IsValid()); + if (v.IsObject()) { + if (!HandleRefSchema(pointer, schema, v, document)) { + SchemaType* s = new (allocator_->Malloc(sizeof(SchemaType))) SchemaType(this, pointer, v, document, allocator_); + new (schemaMap_.template Push()) SchemaEntry(pointer, s, true, allocator_); + if (schema) + *schema = s; + } + } + } + + bool HandleRefSchema(const PointerType& source, const SchemaType** schema, const ValueType& v, const ValueType& document) { + static const Ch kRefString[] = { '$', 'r', 'e', 'f', '\0' }; + static const ValueType kRefValue(kRefString, 4); + + typename ValueType::ConstMemberIterator itr = v.FindMember(kRefValue); + if (itr == v.MemberEnd()) + return false; + + if (itr->value.IsString()) { + SizeType len = itr->value.GetStringLength(); + if (len > 0) { + const Ch* s = itr->value.GetString(); + SizeType i = 0; + while (i < len && s[i] != '#') // Find the first # + i++; + + if (i > 0) { // Remote reference, resolve immediately + if (remoteProvider_) { + if (const GenericSchemaDocument* remoteDocument = remoteProvider_->GetRemoteDocument(s, i)) { + PointerType pointer(&s[i], len - i, allocator_); + if (pointer.IsValid()) { + if (const SchemaType* sc = remoteDocument->GetSchema(pointer)) { + if (schema) + *schema = sc; + new (schemaMap_.template Push()) SchemaEntry(source, const_cast(sc), false, allocator_); + return true; + } + } + } + } + } + else if (s[i] == '#') { // Local reference, defer resolution + PointerType pointer(&s[i], len - i, allocator_); + if (pointer.IsValid()) { + if (const ValueType* nv = pointer.Get(document)) + if (HandleRefSchema(source, schema, *nv, document)) + return true; + + new (schemaRef_.template Push()) SchemaRefEntry(source, pointer, schema, allocator_); + return true; + } + } + } + } + return false; + } + + const SchemaType* GetSchema(const PointerType& pointer) const { + for (const SchemaEntry* target = schemaMap_.template Bottom(); target != schemaMap_.template End(); ++target) + if (pointer == target->pointer) + return target->schema; + return 0; + } + + PointerType GetPointer(const SchemaType* schema) const { + for (const SchemaEntry* target = schemaMap_.template Bottom(); target != schemaMap_.template End(); ++target) + if (schema == target->schema) + return target->pointer; + return PointerType(); + } + + const SchemaType* GetTypeless() const { return typeless_; } + + static const size_t kInitialSchemaMapSize = 64; + static const size_t kInitialSchemaRefSize = 64; + + IRemoteSchemaDocumentProviderType* remoteProvider_; + Allocator *allocator_; + Allocator *ownAllocator_; + const SchemaType* root_; //!< Root schema. + SchemaType* typeless_; + internal::Stack schemaMap_; // Stores created Pointer -> Schemas + internal::Stack schemaRef_; // Stores Pointer from $ref and schema which holds the $ref + URIType uri_; +}; + +//! GenericSchemaDocument using Value type. +typedef GenericSchemaDocument SchemaDocument; +//! IGenericRemoteSchemaDocumentProvider using SchemaDocument. +typedef IGenericRemoteSchemaDocumentProvider IRemoteSchemaDocumentProvider; + +/////////////////////////////////////////////////////////////////////////////// +// GenericSchemaValidator + +//! JSON Schema Validator. +/*! + A SAX style JSON schema validator. + It uses a \c GenericSchemaDocument to validate SAX events. + It delegates the incoming SAX events to an output handler. + The default output handler does nothing. + It can be reused multiple times by calling \c Reset(). + + \tparam SchemaDocumentType Type of schema document. + \tparam OutputHandler Type of output handler. Default handler does nothing. + \tparam StateAllocator Allocator for storing the internal validation states. +*/ +template < + typename SchemaDocumentType, + typename OutputHandler = BaseReaderHandler, + typename StateAllocator = CrtAllocator> +class GenericSchemaValidator : + public internal::ISchemaStateFactory, + public internal::ISchemaValidator, + public internal::IValidationErrorHandler +{ +public: + typedef typename SchemaDocumentType::SchemaType SchemaType; + typedef typename SchemaDocumentType::PointerType PointerType; + typedef typename SchemaType::EncodingType EncodingType; + typedef typename SchemaType::SValue SValue; + typedef typename EncodingType::Ch Ch; + typedef GenericStringRef StringRefType; + typedef GenericValue ValueType; + + //! Constructor without output handler. + /*! + \param schemaDocument The schema document to conform to. + \param allocator Optional allocator for storing internal validation states. + \param schemaStackCapacity Optional initial capacity of schema path stack. + \param documentStackCapacity Optional initial capacity of document path stack. + */ + GenericSchemaValidator( + const SchemaDocumentType& schemaDocument, + StateAllocator* allocator = 0, + size_t schemaStackCapacity = kDefaultSchemaStackCapacity, + size_t documentStackCapacity = kDefaultDocumentStackCapacity) + : + schemaDocument_(&schemaDocument), + root_(schemaDocument.GetRoot()), + stateAllocator_(allocator), + ownStateAllocator_(0), + schemaStack_(allocator, schemaStackCapacity), + documentStack_(allocator, documentStackCapacity), + outputHandler_(0), + error_(kObjectType), + currentError_(), + missingDependents_(), + valid_(true) +#if RAPIDJSON_SCHEMA_VERBOSE + , depth_(0) +#endif + { + } + + //! Constructor with output handler. + /*! + \param schemaDocument The schema document to conform to. + \param allocator Optional allocator for storing internal validation states. + \param schemaStackCapacity Optional initial capacity of schema path stack. + \param documentStackCapacity Optional initial capacity of document path stack. + */ + GenericSchemaValidator( + const SchemaDocumentType& schemaDocument, + OutputHandler& outputHandler, + StateAllocator* allocator = 0, + size_t schemaStackCapacity = kDefaultSchemaStackCapacity, + size_t documentStackCapacity = kDefaultDocumentStackCapacity) + : + schemaDocument_(&schemaDocument), + root_(schemaDocument.GetRoot()), + stateAllocator_(allocator), + ownStateAllocator_(0), + schemaStack_(allocator, schemaStackCapacity), + documentStack_(allocator, documentStackCapacity), + outputHandler_(&outputHandler), + error_(kObjectType), + currentError_(), + missingDependents_(), + valid_(true) +#if RAPIDJSON_SCHEMA_VERBOSE + , depth_(0) +#endif + { + } + + //! Destructor. + ~GenericSchemaValidator() { + Reset(); + RAPIDJSON_DELETE(ownStateAllocator_); + } + + //! Reset the internal states. + void Reset() { + while (!schemaStack_.Empty()) + PopSchema(); + documentStack_.Clear(); + error_.SetObject(); + currentError_.SetNull(); + missingDependents_.SetNull(); + valid_ = true; + } + + //! Checks whether the current state is valid. + // Implementation of ISchemaValidator + virtual bool IsValid() const { return valid_; } + + //! Gets the error object. + ValueType& GetError() { return error_; } + const ValueType& GetError() const { return error_; } + + //! Gets the JSON pointer pointed to the invalid schema. + PointerType GetInvalidSchemaPointer() const { + return schemaStack_.Empty() ? PointerType() : CurrentSchema().GetPointer(); + } + + //! Gets the keyword of invalid schema. + const Ch* GetInvalidSchemaKeyword() const { + return schemaStack_.Empty() ? 0 : CurrentContext().invalidKeyword; + } + + //! Gets the JSON pointer pointed to the invalid value. + PointerType GetInvalidDocumentPointer() const { + if (documentStack_.Empty()) { + return PointerType(); + } + else { + return PointerType(documentStack_.template Bottom(), documentStack_.GetSize() / sizeof(Ch)); + } + } + + void NotMultipleOf(int64_t actual, const SValue& expected) { + AddNumberError(SchemaType::GetMultipleOfString(), ValueType(actual).Move(), expected); + } + void NotMultipleOf(uint64_t actual, const SValue& expected) { + AddNumberError(SchemaType::GetMultipleOfString(), ValueType(actual).Move(), expected); + } + void NotMultipleOf(double actual, const SValue& expected) { + AddNumberError(SchemaType::GetMultipleOfString(), ValueType(actual).Move(), expected); + } + void AboveMaximum(int64_t actual, const SValue& expected, bool exclusive) { + AddNumberError(SchemaType::GetMaximumString(), ValueType(actual).Move(), expected, + exclusive ? &SchemaType::GetExclusiveMaximumString : 0); + } + void AboveMaximum(uint64_t actual, const SValue& expected, bool exclusive) { + AddNumberError(SchemaType::GetMaximumString(), ValueType(actual).Move(), expected, + exclusive ? &SchemaType::GetExclusiveMaximumString : 0); + } + void AboveMaximum(double actual, const SValue& expected, bool exclusive) { + AddNumberError(SchemaType::GetMaximumString(), ValueType(actual).Move(), expected, + exclusive ? &SchemaType::GetExclusiveMaximumString : 0); + } + void BelowMinimum(int64_t actual, const SValue& expected, bool exclusive) { + AddNumberError(SchemaType::GetMinimumString(), ValueType(actual).Move(), expected, + exclusive ? &SchemaType::GetExclusiveMinimumString : 0); + } + void BelowMinimum(uint64_t actual, const SValue& expected, bool exclusive) { + AddNumberError(SchemaType::GetMinimumString(), ValueType(actual).Move(), expected, + exclusive ? &SchemaType::GetExclusiveMinimumString : 0); + } + void BelowMinimum(double actual, const SValue& expected, bool exclusive) { + AddNumberError(SchemaType::GetMinimumString(), ValueType(actual).Move(), expected, + exclusive ? &SchemaType::GetExclusiveMinimumString : 0); + } + + void TooLong(const Ch* str, SizeType length, SizeType expected) { + AddNumberError(SchemaType::GetMaxLengthString(), + ValueType(str, length, GetStateAllocator()).Move(), SValue(expected).Move()); + } + void TooShort(const Ch* str, SizeType length, SizeType expected) { + AddNumberError(SchemaType::GetMinLengthString(), + ValueType(str, length, GetStateAllocator()).Move(), SValue(expected).Move()); + } + void DoesNotMatch(const Ch* str, SizeType length) { + currentError_.SetObject(); + currentError_.AddMember(GetActualString(), ValueType(str, length, GetStateAllocator()).Move(), GetStateAllocator()); + AddCurrentError(SchemaType::GetPatternString()); + } + + void DisallowedItem(SizeType index) { + currentError_.SetObject(); + currentError_.AddMember(GetDisallowedString(), ValueType(index).Move(), GetStateAllocator()); + AddCurrentError(SchemaType::GetAdditionalItemsString(), true); + } + void TooFewItems(SizeType actualCount, SizeType expectedCount) { + AddNumberError(SchemaType::GetMinItemsString(), + ValueType(actualCount).Move(), SValue(expectedCount).Move()); + } + void TooManyItems(SizeType actualCount, SizeType expectedCount) { + AddNumberError(SchemaType::GetMaxItemsString(), + ValueType(actualCount).Move(), SValue(expectedCount).Move()); + } + void DuplicateItems(SizeType index1, SizeType index2) { + ValueType duplicates(kArrayType); + duplicates.PushBack(index1, GetStateAllocator()); + duplicates.PushBack(index2, GetStateAllocator()); + currentError_.SetObject(); + currentError_.AddMember(GetDuplicatesString(), duplicates, GetStateAllocator()); + AddCurrentError(SchemaType::GetUniqueItemsString(), true); + } + + void TooManyProperties(SizeType actualCount, SizeType expectedCount) { + AddNumberError(SchemaType::GetMaxPropertiesString(), + ValueType(actualCount).Move(), SValue(expectedCount).Move()); + } + void TooFewProperties(SizeType actualCount, SizeType expectedCount) { + AddNumberError(SchemaType::GetMinPropertiesString(), + ValueType(actualCount).Move(), SValue(expectedCount).Move()); + } + void StartMissingProperties() { + currentError_.SetArray(); + } + void AddMissingProperty(const SValue& name) { + currentError_.PushBack(ValueType(name, GetStateAllocator()).Move(), GetStateAllocator()); + } + bool EndMissingProperties() { + if (currentError_.Empty()) + return false; + ValueType error(kObjectType); + error.AddMember(GetMissingString(), currentError_, GetStateAllocator()); + currentError_ = error; + AddCurrentError(SchemaType::GetRequiredString()); + return true; + } + void PropertyViolations(ISchemaValidator** subvalidators, SizeType count) { + for (SizeType i = 0; i < count; ++i) + MergeError(static_cast(subvalidators[i])->GetError()); + } + void DisallowedProperty(const Ch* name, SizeType length) { + currentError_.SetObject(); + currentError_.AddMember(GetDisallowedString(), ValueType(name, length, GetStateAllocator()).Move(), GetStateAllocator()); + AddCurrentError(SchemaType::GetAdditionalPropertiesString(), true); + } + + void StartDependencyErrors() { + currentError_.SetObject(); + } + void StartMissingDependentProperties() { + missingDependents_.SetArray(); + } + void AddMissingDependentProperty(const SValue& targetName) { + missingDependents_.PushBack(ValueType(targetName, GetStateAllocator()).Move(), GetStateAllocator()); + } + void EndMissingDependentProperties(const SValue& sourceName) { + if (!missingDependents_.Empty()) + currentError_.AddMember(ValueType(sourceName, GetStateAllocator()).Move(), + missingDependents_, GetStateAllocator()); + } + void AddDependencySchemaError(const SValue& sourceName, ISchemaValidator* subvalidator) { + currentError_.AddMember(ValueType(sourceName, GetStateAllocator()).Move(), + static_cast(subvalidator)->GetError(), GetStateAllocator()); + } + bool EndDependencyErrors() { + if (currentError_.ObjectEmpty()) + return false; + ValueType error(kObjectType); + error.AddMember(GetErrorsString(), currentError_, GetStateAllocator()); + currentError_ = error; + AddCurrentError(SchemaType::GetDependenciesString()); + return true; + } + + void DisallowedValue() { + currentError_.SetObject(); + AddCurrentError(SchemaType::GetEnumString()); + } + void StartDisallowedType() { + currentError_.SetArray(); + } + void AddExpectedType(const typename SchemaType::ValueType& expectedType) { + currentError_.PushBack(ValueType(expectedType, GetStateAllocator()).Move(), GetStateAllocator()); + } + void EndDisallowedType(const typename SchemaType::ValueType& actualType) { + ValueType error(kObjectType); + error.AddMember(GetExpectedString(), currentError_, GetStateAllocator()); + error.AddMember(GetActualString(), ValueType(actualType, GetStateAllocator()).Move(), GetStateAllocator()); + currentError_ = error; + AddCurrentError(SchemaType::GetTypeString()); + } + void NotAllOf(ISchemaValidator** subvalidators, SizeType count) { + for (SizeType i = 0; i < count; ++i) { + MergeError(static_cast(subvalidators[i])->GetError()); + } + } + void NoneOf(ISchemaValidator** subvalidators, SizeType count) { + AddErrorArray(SchemaType::GetAnyOfString(), subvalidators, count); + } + void NotOneOf(ISchemaValidator** subvalidators, SizeType count) { + AddErrorArray(SchemaType::GetOneOfString(), subvalidators, count); + } + void Disallowed() { + currentError_.SetObject(); + AddCurrentError(SchemaType::GetNotString()); + } + +#define RAPIDJSON_STRING_(name, ...) \ + static const StringRefType& Get##name##String() {\ + static const Ch s[] = { __VA_ARGS__, '\0' };\ + static const StringRefType v(s, static_cast(sizeof(s) / sizeof(Ch) - 1)); \ + return v;\ + } + + RAPIDJSON_STRING_(InstanceRef, 'i', 'n', 's', 't', 'a', 'n', 'c', 'e', 'R', 'e', 'f') + RAPIDJSON_STRING_(SchemaRef, 's', 'c', 'h', 'e', 'm', 'a', 'R', 'e', 'f') + RAPIDJSON_STRING_(Expected, 'e', 'x', 'p', 'e', 'c', 't', 'e', 'd') + RAPIDJSON_STRING_(Actual, 'a', 'c', 't', 'u', 'a', 'l') + RAPIDJSON_STRING_(Disallowed, 'd', 'i', 's', 'a', 'l', 'l', 'o', 'w', 'e', 'd') + RAPIDJSON_STRING_(Missing, 'm', 'i', 's', 's', 'i', 'n', 'g') + RAPIDJSON_STRING_(Errors, 'e', 'r', 'r', 'o', 'r', 's') + RAPIDJSON_STRING_(Duplicates, 'd', 'u', 'p', 'l', 'i', 'c', 'a', 't', 'e', 's') + +#undef RAPIDJSON_STRING_ + +#if RAPIDJSON_SCHEMA_VERBOSE +#define RAPIDJSON_SCHEMA_HANDLE_BEGIN_VERBOSE_() \ +RAPIDJSON_MULTILINEMACRO_BEGIN\ + *documentStack_.template Push() = '\0';\ + documentStack_.template Pop(1);\ + internal::PrintInvalidDocument(documentStack_.template Bottom());\ +RAPIDJSON_MULTILINEMACRO_END +#else +#define RAPIDJSON_SCHEMA_HANDLE_BEGIN_VERBOSE_() +#endif + +#define RAPIDJSON_SCHEMA_HANDLE_BEGIN_(method, arg1)\ + if (!valid_) return false; \ + if (!BeginValue() || !CurrentSchema().method arg1) {\ + RAPIDJSON_SCHEMA_HANDLE_BEGIN_VERBOSE_();\ + return valid_ = false;\ + } + +#define RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(method, arg2)\ + for (Context* context = schemaStack_.template Bottom(); context != schemaStack_.template End(); context++) {\ + if (context->hasher)\ + static_cast(context->hasher)->method arg2;\ + if (context->validators)\ + for (SizeType i_ = 0; i_ < context->validatorCount; i_++)\ + static_cast(context->validators[i_])->method arg2;\ + if (context->patternPropertiesValidators)\ + for (SizeType i_ = 0; i_ < context->patternPropertiesValidatorCount; i_++)\ + static_cast(context->patternPropertiesValidators[i_])->method arg2;\ + } + +#define RAPIDJSON_SCHEMA_HANDLE_END_(method, arg2)\ + return valid_ = EndValue() && (!outputHandler_ || outputHandler_->method arg2) + +#define RAPIDJSON_SCHEMA_HANDLE_VALUE_(method, arg1, arg2) \ + RAPIDJSON_SCHEMA_HANDLE_BEGIN_ (method, arg1);\ + RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(method, arg2);\ + RAPIDJSON_SCHEMA_HANDLE_END_ (method, arg2) + + bool Null() { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Null, (CurrentContext()), ( )); } + bool Bool(bool b) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Bool, (CurrentContext(), b), (b)); } + bool Int(int i) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Int, (CurrentContext(), i), (i)); } + bool Uint(unsigned u) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Uint, (CurrentContext(), u), (u)); } + bool Int64(int64_t i) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Int64, (CurrentContext(), i), (i)); } + bool Uint64(uint64_t u) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Uint64, (CurrentContext(), u), (u)); } + bool Double(double d) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Double, (CurrentContext(), d), (d)); } + bool RawNumber(const Ch* str, SizeType length, bool copy) + { RAPIDJSON_SCHEMA_HANDLE_VALUE_(String, (CurrentContext(), str, length, copy), (str, length, copy)); } + bool String(const Ch* str, SizeType length, bool copy) + { RAPIDJSON_SCHEMA_HANDLE_VALUE_(String, (CurrentContext(), str, length, copy), (str, length, copy)); } + + bool StartObject() { + RAPIDJSON_SCHEMA_HANDLE_BEGIN_(StartObject, (CurrentContext())); + RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(StartObject, ()); + return valid_ = !outputHandler_ || outputHandler_->StartObject(); + } + + bool Key(const Ch* str, SizeType len, bool copy) { + if (!valid_) return false; + AppendToken(str, len); + if (!CurrentSchema().Key(CurrentContext(), str, len, copy)) return valid_ = false; + RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(Key, (str, len, copy)); + return valid_ = !outputHandler_ || outputHandler_->Key(str, len, copy); + } + + bool EndObject(SizeType memberCount) { + if (!valid_) return false; + RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(EndObject, (memberCount)); + if (!CurrentSchema().EndObject(CurrentContext(), memberCount)) return valid_ = false; + RAPIDJSON_SCHEMA_HANDLE_END_(EndObject, (memberCount)); + } + + bool StartArray() { + RAPIDJSON_SCHEMA_HANDLE_BEGIN_(StartArray, (CurrentContext())); + RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(StartArray, ()); + return valid_ = !outputHandler_ || outputHandler_->StartArray(); + } + + bool EndArray(SizeType elementCount) { + if (!valid_) return false; + RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(EndArray, (elementCount)); + if (!CurrentSchema().EndArray(CurrentContext(), elementCount)) return valid_ = false; + RAPIDJSON_SCHEMA_HANDLE_END_(EndArray, (elementCount)); + } + +#undef RAPIDJSON_SCHEMA_HANDLE_BEGIN_VERBOSE_ +#undef RAPIDJSON_SCHEMA_HANDLE_BEGIN_ +#undef RAPIDJSON_SCHEMA_HANDLE_PARALLEL_ +#undef RAPIDJSON_SCHEMA_HANDLE_VALUE_ + + // Implementation of ISchemaStateFactory + virtual ISchemaValidator* CreateSchemaValidator(const SchemaType& root) { + return new (GetStateAllocator().Malloc(sizeof(GenericSchemaValidator))) GenericSchemaValidator(*schemaDocument_, root, documentStack_.template Bottom(), documentStack_.GetSize(), +#if RAPIDJSON_SCHEMA_VERBOSE + depth_ + 1, +#endif + &GetStateAllocator()); + } + + virtual void DestroySchemaValidator(ISchemaValidator* validator) { + GenericSchemaValidator* v = static_cast(validator); + v->~GenericSchemaValidator(); + StateAllocator::Free(v); + } + + virtual void* CreateHasher() { + return new (GetStateAllocator().Malloc(sizeof(HasherType))) HasherType(&GetStateAllocator()); + } + + virtual uint64_t GetHashCode(void* hasher) { + return static_cast(hasher)->GetHashCode(); + } + + virtual void DestroryHasher(void* hasher) { + HasherType* h = static_cast(hasher); + h->~HasherType(); + StateAllocator::Free(h); + } + + virtual void* MallocState(size_t size) { + return GetStateAllocator().Malloc(size); + } + + virtual void FreeState(void* p) { + StateAllocator::Free(p); + } + +private: + typedef typename SchemaType::Context Context; + typedef GenericValue, StateAllocator> HashCodeArray; + typedef internal::Hasher HasherType; + + GenericSchemaValidator( + const SchemaDocumentType& schemaDocument, + const SchemaType& root, + const char* basePath, size_t basePathSize, +#if RAPIDJSON_SCHEMA_VERBOSE + unsigned depth, +#endif + StateAllocator* allocator = 0, + size_t schemaStackCapacity = kDefaultSchemaStackCapacity, + size_t documentStackCapacity = kDefaultDocumentStackCapacity) + : + schemaDocument_(&schemaDocument), + root_(root), + stateAllocator_(allocator), + ownStateAllocator_(0), + schemaStack_(allocator, schemaStackCapacity), + documentStack_(allocator, documentStackCapacity), + outputHandler_(0), + error_(kObjectType), + currentError_(), + missingDependents_(), + valid_(true) +#if RAPIDJSON_SCHEMA_VERBOSE + , depth_(depth) +#endif + { + if (basePath && basePathSize) + memcpy(documentStack_.template Push(basePathSize), basePath, basePathSize); + } + + StateAllocator& GetStateAllocator() { + if (!stateAllocator_) + stateAllocator_ = ownStateAllocator_ = RAPIDJSON_NEW(StateAllocator)(); + return *stateAllocator_; + } + + bool BeginValue() { + if (schemaStack_.Empty()) + PushSchema(root_); + else { + if (CurrentContext().inArray) + internal::TokenHelper, Ch>::AppendIndexToken(documentStack_, CurrentContext().arrayElementIndex); + + if (!CurrentSchema().BeginValue(CurrentContext())) + return false; + + SizeType count = CurrentContext().patternPropertiesSchemaCount; + const SchemaType** sa = CurrentContext().patternPropertiesSchemas; + typename Context::PatternValidatorType patternValidatorType = CurrentContext().valuePatternValidatorType; + bool valueUniqueness = CurrentContext().valueUniqueness; + RAPIDJSON_ASSERT(CurrentContext().valueSchema); + PushSchema(*CurrentContext().valueSchema); + + if (count > 0) { + CurrentContext().objectPatternValidatorType = patternValidatorType; + ISchemaValidator**& va = CurrentContext().patternPropertiesValidators; + SizeType& validatorCount = CurrentContext().patternPropertiesValidatorCount; + va = static_cast(MallocState(sizeof(ISchemaValidator*) * count)); + for (SizeType i = 0; i < count; i++) + va[validatorCount++] = CreateSchemaValidator(*sa[i]); + } + + CurrentContext().arrayUniqueness = valueUniqueness; + } + return true; + } + + bool EndValue() { + if (!CurrentSchema().EndValue(CurrentContext())) + return false; + +#if RAPIDJSON_SCHEMA_VERBOSE + GenericStringBuffer sb; + schemaDocument_->GetPointer(&CurrentSchema()).Stringify(sb); + + *documentStack_.template Push() = '\0'; + documentStack_.template Pop(1); + internal::PrintValidatorPointers(depth_, sb.GetString(), documentStack_.template Bottom()); +#endif + + uint64_t h = CurrentContext().arrayUniqueness ? static_cast(CurrentContext().hasher)->GetHashCode() : 0; + + PopSchema(); + + if (!schemaStack_.Empty()) { + Context& context = CurrentContext(); + if (context.valueUniqueness) { + HashCodeArray* a = static_cast(context.arrayElementHashCodes); + if (!a) + CurrentContext().arrayElementHashCodes = a = new (GetStateAllocator().Malloc(sizeof(HashCodeArray))) HashCodeArray(kArrayType); + for (typename HashCodeArray::ConstValueIterator itr = a->Begin(); itr != a->End(); ++itr) + if (itr->GetUint64() == h) { + DuplicateItems(static_cast(itr - a->Begin()), a->Size()); + RAPIDJSON_INVALID_KEYWORD_RETURN(SchemaType::GetUniqueItemsString()); + } + a->PushBack(h, GetStateAllocator()); + } + } + + // Remove the last token of document pointer + while (!documentStack_.Empty() && *documentStack_.template Pop(1) != '/') + ; + + return true; + } + + void AppendToken(const Ch* str, SizeType len) { + documentStack_.template Reserve(1 + len * 2); // worst case all characters are escaped as two characters + *documentStack_.template PushUnsafe() = '/'; + for (SizeType i = 0; i < len; i++) { + if (str[i] == '~') { + *documentStack_.template PushUnsafe() = '~'; + *documentStack_.template PushUnsafe() = '0'; + } + else if (str[i] == '/') { + *documentStack_.template PushUnsafe() = '~'; + *documentStack_.template PushUnsafe() = '1'; + } + else + *documentStack_.template PushUnsafe() = str[i]; + } + } + + RAPIDJSON_FORCEINLINE void PushSchema(const SchemaType& schema) { new (schemaStack_.template Push()) Context(*this, *this, &schema); } + + RAPIDJSON_FORCEINLINE void PopSchema() { + Context* c = schemaStack_.template Pop(1); + if (HashCodeArray* a = static_cast(c->arrayElementHashCodes)) { + a->~HashCodeArray(); + StateAllocator::Free(a); + } + c->~Context(); + } + + void AddErrorLocation(ValueType& result, bool parent) { + GenericStringBuffer sb; + PointerType instancePointer = GetInvalidDocumentPointer(); + ((parent && instancePointer.GetTokenCount() > 0) + ? PointerType(instancePointer.GetTokens(), instancePointer.GetTokenCount() - 1) + : instancePointer).StringifyUriFragment(sb); + ValueType instanceRef(sb.GetString(), static_cast(sb.GetSize() / sizeof(Ch)), + GetStateAllocator()); + result.AddMember(GetInstanceRefString(), instanceRef, GetStateAllocator()); + sb.Clear(); + memcpy(sb.Push(CurrentSchema().GetURI().GetStringLength()), + CurrentSchema().GetURI().GetString(), + CurrentSchema().GetURI().GetStringLength() * sizeof(Ch)); + GetInvalidSchemaPointer().StringifyUriFragment(sb); + ValueType schemaRef(sb.GetString(), static_cast(sb.GetSize() / sizeof(Ch)), + GetStateAllocator()); + result.AddMember(GetSchemaRefString(), schemaRef, GetStateAllocator()); + } + + void AddError(ValueType& keyword, ValueType& error) { + typename ValueType::MemberIterator member = error_.FindMember(keyword); + if (member == error_.MemberEnd()) + error_.AddMember(keyword, error, GetStateAllocator()); + else { + if (member->value.IsObject()) { + ValueType errors(kArrayType); + errors.PushBack(member->value, GetStateAllocator()); + member->value = errors; + } + member->value.PushBack(error, GetStateAllocator()); + } + } + + void AddCurrentError(const typename SchemaType::ValueType& keyword, bool parent = false) { + AddErrorLocation(currentError_, parent); + AddError(ValueType(keyword, GetStateAllocator(), false).Move(), currentError_); + } + + void MergeError(ValueType& other) { + for (typename ValueType::MemberIterator it = other.MemberBegin(), end = other.MemberEnd(); it != end; ++it) { + AddError(it->name, it->value); + } + } + + void AddNumberError(const typename SchemaType::ValueType& keyword, ValueType& actual, const SValue& expected, + const typename SchemaType::ValueType& (*exclusive)() = 0) { + currentError_.SetObject(); + currentError_.AddMember(GetActualString(), actual, GetStateAllocator()); + currentError_.AddMember(GetExpectedString(), ValueType(expected, GetStateAllocator()).Move(), GetStateAllocator()); + if (exclusive) + currentError_.AddMember(ValueType(exclusive(), GetStateAllocator()).Move(), true, GetStateAllocator()); + AddCurrentError(keyword); + } + + void AddErrorArray(const typename SchemaType::ValueType& keyword, + ISchemaValidator** subvalidators, SizeType count) { + ValueType errors(kArrayType); + for (SizeType i = 0; i < count; ++i) + errors.PushBack(static_cast(subvalidators[i])->GetError(), GetStateAllocator()); + currentError_.SetObject(); + currentError_.AddMember(GetErrorsString(), errors, GetStateAllocator()); + AddCurrentError(keyword); + } + + const SchemaType& CurrentSchema() const { return *schemaStack_.template Top()->schema; } + Context& CurrentContext() { return *schemaStack_.template Top(); } + const Context& CurrentContext() const { return *schemaStack_.template Top(); } + + static const size_t kDefaultSchemaStackCapacity = 1024; + static const size_t kDefaultDocumentStackCapacity = 256; + const SchemaDocumentType* schemaDocument_; + const SchemaType& root_; + StateAllocator* stateAllocator_; + StateAllocator* ownStateAllocator_; + internal::Stack schemaStack_; //!< stack to store the current path of schema (BaseSchemaType *) + internal::Stack documentStack_; //!< stack to store the current path of validating document (Ch) + OutputHandler* outputHandler_; + ValueType error_; + ValueType currentError_; + ValueType missingDependents_; + bool valid_; +#if RAPIDJSON_SCHEMA_VERBOSE + unsigned depth_; +#endif +}; + +typedef GenericSchemaValidator SchemaValidator; + +/////////////////////////////////////////////////////////////////////////////// +// SchemaValidatingReader + +//! A helper class for parsing with validation. +/*! + This helper class is a functor, designed as a parameter of \ref GenericDocument::Populate(). + + \tparam parseFlags Combination of \ref ParseFlag. + \tparam InputStream Type of input stream, implementing Stream concept. + \tparam SourceEncoding Encoding of the input stream. + \tparam SchemaDocumentType Type of schema document. + \tparam StackAllocator Allocator type for stack. +*/ +template < + unsigned parseFlags, + typename InputStream, + typename SourceEncoding, + typename SchemaDocumentType = SchemaDocument, + typename StackAllocator = CrtAllocator> +class SchemaValidatingReader { +public: + typedef typename SchemaDocumentType::PointerType PointerType; + typedef typename InputStream::Ch Ch; + typedef GenericValue ValueType; + + //! Constructor + /*! + \param is Input stream. + \param sd Schema document. + */ + SchemaValidatingReader(InputStream& is, const SchemaDocumentType& sd) : is_(is), sd_(sd), invalidSchemaKeyword_(), error_(kObjectType), isValid_(true) {} + + template + bool operator()(Handler& handler) { + GenericReader reader; + GenericSchemaValidator validator(sd_, handler); + parseResult_ = reader.template Parse(is_, validator); + + isValid_ = validator.IsValid(); + if (isValid_) { + invalidSchemaPointer_ = PointerType(); + invalidSchemaKeyword_ = 0; + invalidDocumentPointer_ = PointerType(); + error_.SetObject(); + } + else { + invalidSchemaPointer_ = validator.GetInvalidSchemaPointer(); + invalidSchemaKeyword_ = validator.GetInvalidSchemaKeyword(); + invalidDocumentPointer_ = validator.GetInvalidDocumentPointer(); + error_.CopyFrom(validator.GetError(), allocator_); + } + + return parseResult_; + } + + const ParseResult& GetParseResult() const { return parseResult_; } + bool IsValid() const { return isValid_; } + const PointerType& GetInvalidSchemaPointer() const { return invalidSchemaPointer_; } + const Ch* GetInvalidSchemaKeyword() const { return invalidSchemaKeyword_; } + const PointerType& GetInvalidDocumentPointer() const { return invalidDocumentPointer_; } + const ValueType& GetError() const { return error_; } + +private: + InputStream& is_; + const SchemaDocumentType& sd_; + + ParseResult parseResult_; + PointerType invalidSchemaPointer_; + const Ch* invalidSchemaKeyword_; + PointerType invalidDocumentPointer_; + StackAllocator allocator_; + ValueType error_; + bool isValid_; +}; + +RAPIDJSON_NAMESPACE_END +RAPIDJSON_DIAG_POP + +#endif // RAPIDJSON_SCHEMA_H_ diff --git a/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/stream.h b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/stream.h new file mode 100644 index 0000000..7f2643e --- /dev/null +++ b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/stream.h @@ -0,0 +1,223 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#include "rapidjson.h" + +#ifndef RAPIDJSON_STREAM_H_ +#define RAPIDJSON_STREAM_H_ + +#include "encodings.h" + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// Stream + +/*! \class rapidjson::Stream + \brief Concept for reading and writing characters. + + For read-only stream, no need to implement PutBegin(), Put(), Flush() and PutEnd(). + + For write-only stream, only need to implement Put() and Flush(). + +\code +concept Stream { + typename Ch; //!< Character type of the stream. + + //! Read the current character from stream without moving the read cursor. + Ch Peek() const; + + //! Read the current character from stream and moving the read cursor to next character. + Ch Take(); + + //! Get the current read cursor. + //! \return Number of characters read from start. + size_t Tell(); + + //! Begin writing operation at the current read pointer. + //! \return The begin writer pointer. + Ch* PutBegin(); + + //! Write a character. + void Put(Ch c); + + //! Flush the buffer. + void Flush(); + + //! End the writing operation. + //! \param begin The begin write pointer returned by PutBegin(). + //! \return Number of characters written. + size_t PutEnd(Ch* begin); +} +\endcode +*/ + +//! Provides additional information for stream. +/*! + By using traits pattern, this type provides a default configuration for stream. + For custom stream, this type can be specialized for other configuration. + See TEST(Reader, CustomStringStream) in readertest.cpp for example. +*/ +template +struct StreamTraits { + //! Whether to make local copy of stream for optimization during parsing. + /*! + By default, for safety, streams do not use local copy optimization. + Stream that can be copied fast should specialize this, like StreamTraits. + */ + enum { copyOptimization = 0 }; +}; + +//! Reserve n characters for writing to a stream. +template +inline void PutReserve(Stream& stream, size_t count) { + (void)stream; + (void)count; +} + +//! Write character to a stream, presuming buffer is reserved. +template +inline void PutUnsafe(Stream& stream, typename Stream::Ch c) { + stream.Put(c); +} + +//! Put N copies of a character to a stream. +template +inline void PutN(Stream& stream, Ch c, size_t n) { + PutReserve(stream, n); + for (size_t i = 0; i < n; i++) + PutUnsafe(stream, c); +} + +/////////////////////////////////////////////////////////////////////////////// +// GenericStreamWrapper + +//! A Stream Wrapper +/*! \tThis string stream is a wrapper for any stream by just forwarding any + \treceived message to the origin stream. + \note implements Stream concept +*/ + +#if defined(_MSC_VER) && _MSC_VER <= 1800 +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4702) // unreachable code +RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated +#endif + +template > +class GenericStreamWrapper { +public: + typedef typename Encoding::Ch Ch; + GenericStreamWrapper(InputStream& is): is_(is) {} + + Ch Peek() const { return is_.Peek(); } + Ch Take() { return is_.Take(); } + size_t Tell() { return is_.Tell(); } + Ch* PutBegin() { return is_.PutBegin(); } + void Put(Ch ch) { is_.Put(ch); } + void Flush() { is_.Flush(); } + size_t PutEnd(Ch* ch) { return is_.PutEnd(ch); } + + // wrapper for MemoryStream + const Ch* Peek4() const { return is_.Peek4(); } + + // wrapper for AutoUTFInputStream + UTFType GetType() const { return is_.GetType(); } + bool HasBOM() const { return is_.HasBOM(); } + +protected: + InputStream& is_; +}; + +#if defined(_MSC_VER) && _MSC_VER <= 1800 +RAPIDJSON_DIAG_POP +#endif + +/////////////////////////////////////////////////////////////////////////////// +// StringStream + +//! Read-only string stream. +/*! \note implements Stream concept +*/ +template +struct GenericStringStream { + typedef typename Encoding::Ch Ch; + + GenericStringStream(const Ch *src) : src_(src), head_(src) {} + + Ch Peek() const { return *src_; } + Ch Take() { return *src_++; } + size_t Tell() const { return static_cast(src_ - head_); } + + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + void Put(Ch) { RAPIDJSON_ASSERT(false); } + void Flush() { RAPIDJSON_ASSERT(false); } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + + const Ch* src_; //!< Current read position. + const Ch* head_; //!< Original head of the string. +}; + +template +struct StreamTraits > { + enum { copyOptimization = 1 }; +}; + +//! String stream with UTF8 encoding. +typedef GenericStringStream > StringStream; + +/////////////////////////////////////////////////////////////////////////////// +// InsituStringStream + +//! A read-write string stream. +/*! This string stream is particularly designed for in-situ parsing. + \note implements Stream concept +*/ +template +struct GenericInsituStringStream { + typedef typename Encoding::Ch Ch; + + GenericInsituStringStream(Ch *src) : src_(src), dst_(0), head_(src) {} + + // Read + Ch Peek() { return *src_; } + Ch Take() { return *src_++; } + size_t Tell() { return static_cast(src_ - head_); } + + // Write + void Put(Ch c) { RAPIDJSON_ASSERT(dst_ != 0); *dst_++ = c; } + + Ch* PutBegin() { return dst_ = src_; } + size_t PutEnd(Ch* begin) { return static_cast(dst_ - begin); } + void Flush() {} + + Ch* Push(size_t count) { Ch* begin = dst_; dst_ += count; return begin; } + void Pop(size_t count) { dst_ -= count; } + + Ch* src_; + Ch* dst_; + Ch* head_; +}; + +template +struct StreamTraits > { + enum { copyOptimization = 1 }; +}; + +//! Insitu string stream with UTF8 encoding. +typedef GenericInsituStringStream > InsituStringStream; + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_STREAM_H_ diff --git a/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/stringbuffer.h b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/stringbuffer.h new file mode 100644 index 0000000..4e38b82 --- /dev/null +++ b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/stringbuffer.h @@ -0,0 +1,121 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_STRINGBUFFER_H_ +#define RAPIDJSON_STRINGBUFFER_H_ + +#include "stream.h" +#include "internal/stack.h" + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS +#include // std::move +#endif + +#include "internal/stack.h" + +#if defined(__clang__) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(c++98-compat) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Represents an in-memory output stream. +/*! + \tparam Encoding Encoding of the stream. + \tparam Allocator type for allocating memory buffer. + \note implements Stream concept +*/ +template +class GenericStringBuffer { +public: + typedef typename Encoding::Ch Ch; + + GenericStringBuffer(Allocator* allocator = 0, size_t capacity = kDefaultCapacity) : stack_(allocator, capacity) {} + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericStringBuffer(GenericStringBuffer&& rhs) : stack_(std::move(rhs.stack_)) {} + GenericStringBuffer& operator=(GenericStringBuffer&& rhs) { + if (&rhs != this) + stack_ = std::move(rhs.stack_); + return *this; + } +#endif + + void Put(Ch c) { *stack_.template Push() = c; } + void PutUnsafe(Ch c) { *stack_.template PushUnsafe() = c; } + void Flush() {} + + void Clear() { stack_.Clear(); } + void ShrinkToFit() { + // Push and pop a null terminator. This is safe. + *stack_.template Push() = '\0'; + stack_.ShrinkToFit(); + stack_.template Pop(1); + } + + void Reserve(size_t count) { stack_.template Reserve(count); } + Ch* Push(size_t count) { return stack_.template Push(count); } + Ch* PushUnsafe(size_t count) { return stack_.template PushUnsafe(count); } + void Pop(size_t count) { stack_.template Pop(count); } + + const Ch* GetString() const { + // Push and pop a null terminator. This is safe. + *stack_.template Push() = '\0'; + stack_.template Pop(1); + + return stack_.template Bottom(); + } + + //! Get the size of string in bytes in the string buffer. + size_t GetSize() const { return stack_.GetSize(); } + + //! Get the length of string in Ch in the string buffer. + size_t GetLength() const { return stack_.GetSize() / sizeof(Ch); } + + static const size_t kDefaultCapacity = 256; + mutable internal::Stack stack_; + +private: + // Prohibit copy constructor & assignment operator. + GenericStringBuffer(const GenericStringBuffer&); + GenericStringBuffer& operator=(const GenericStringBuffer&); +}; + +//! String buffer with UTF8 encoding +typedef GenericStringBuffer > StringBuffer; + +template +inline void PutReserve(GenericStringBuffer& stream, size_t count) { + stream.Reserve(count); +} + +template +inline void PutUnsafe(GenericStringBuffer& stream, typename Encoding::Ch c) { + stream.PutUnsafe(c); +} + +//! Implement specialized version of PutN() with memset() for better performance. +template<> +inline void PutN(GenericStringBuffer >& stream, char c, size_t n) { + std::memset(stream.stack_.Push(n), c, n * sizeof(c)); +} + +RAPIDJSON_NAMESPACE_END + +#if defined(__clang__) +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_STRINGBUFFER_H_ diff --git a/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/writer.h b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/writer.h new file mode 100644 index 0000000..49cc0fb --- /dev/null +++ b/hdssd/external/common/rapidjson-1.1.0/include/rapidjson/writer.h @@ -0,0 +1,710 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_WRITER_H_ +#define RAPIDJSON_WRITER_H_ + +#include "stream.h" +#include "internal/meta.h" +#include "internal/stack.h" +#include "internal/strfunc.h" +#include "internal/dtoa.h" +#include "internal/itoa.h" +#include "stringbuffer.h" +#include // placement new + +#if defined(RAPIDJSON_SIMD) && defined(_MSC_VER) +#include +#pragma intrinsic(_BitScanForward) +#endif +#ifdef RAPIDJSON_SSE42 +#include +#elif defined(RAPIDJSON_SSE2) +#include +#elif defined(RAPIDJSON_NEON) +#include +#endif + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +RAPIDJSON_DIAG_OFF(unreachable-code) +RAPIDJSON_DIAG_OFF(c++98-compat) +#elif defined(_MSC_VER) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4127) // conditional expression is constant +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// WriteFlag + +/*! \def RAPIDJSON_WRITE_DEFAULT_FLAGS + \ingroup RAPIDJSON_CONFIG + \brief User-defined kWriteDefaultFlags definition. + + User can define this as any \c WriteFlag combinations. +*/ +#ifndef RAPIDJSON_WRITE_DEFAULT_FLAGS +#define RAPIDJSON_WRITE_DEFAULT_FLAGS kWriteNoFlags +#endif + +//! Combination of writeFlags +enum WriteFlag { + kWriteNoFlags = 0, //!< No flags are set. + kWriteValidateEncodingFlag = 1, //!< Validate encoding of JSON strings. + kWriteNanAndInfFlag = 2, //!< Allow writing of Infinity, -Infinity and NaN. + kWriteDefaultFlags = RAPIDJSON_WRITE_DEFAULT_FLAGS //!< Default write flags. Can be customized by defining RAPIDJSON_WRITE_DEFAULT_FLAGS +}; + +//! JSON writer +/*! Writer implements the concept Handler. + It generates JSON text by events to an output os. + + User may programmatically calls the functions of a writer to generate JSON text. + + On the other side, a writer can also be passed to objects that generates events, + + for example Reader::Parse() and Document::Accept(). + + \tparam OutputStream Type of output stream. + \tparam SourceEncoding Encoding of source string. + \tparam TargetEncoding Encoding of output stream. + \tparam StackAllocator Type of allocator for allocating memory of stack. + \note implements Handler concept +*/ +template, typename TargetEncoding = UTF8<>, typename StackAllocator = CrtAllocator, unsigned writeFlags = kWriteDefaultFlags> +class Writer { +public: + typedef typename SourceEncoding::Ch Ch; + + static const int kDefaultMaxDecimalPlaces = 324; + + //! Constructor + /*! \param os Output stream. + \param stackAllocator User supplied allocator. If it is null, it will create a private one. + \param levelDepth Initial capacity of stack. + */ + explicit + Writer(OutputStream& os, StackAllocator* stackAllocator = 0, size_t levelDepth = kDefaultLevelDepth) : + os_(&os), level_stack_(stackAllocator, levelDepth * sizeof(Level)), maxDecimalPlaces_(kDefaultMaxDecimalPlaces), hasRoot_(false) {} + + explicit + Writer(StackAllocator* allocator = 0, size_t levelDepth = kDefaultLevelDepth) : + os_(0), level_stack_(allocator, levelDepth * sizeof(Level)), maxDecimalPlaces_(kDefaultMaxDecimalPlaces), hasRoot_(false) {} + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + Writer(Writer&& rhs) : + os_(rhs.os_), level_stack_(std::move(rhs.level_stack_)), maxDecimalPlaces_(rhs.maxDecimalPlaces_), hasRoot_(rhs.hasRoot_) { + rhs.os_ = 0; + } +#endif + + //! Reset the writer with a new stream. + /*! + This function reset the writer with a new stream and default settings, + in order to make a Writer object reusable for output multiple JSONs. + + \param os New output stream. + \code + Writer writer(os1); + writer.StartObject(); + // ... + writer.EndObject(); + + writer.Reset(os2); + writer.StartObject(); + // ... + writer.EndObject(); + \endcode + */ + void Reset(OutputStream& os) { + os_ = &os; + hasRoot_ = false; + level_stack_.Clear(); + } + + //! Checks whether the output is a complete JSON. + /*! + A complete JSON has a complete root object or array. + */ + bool IsComplete() const { + return hasRoot_ && level_stack_.Empty(); + } + + int GetMaxDecimalPlaces() const { + return maxDecimalPlaces_; + } + + //! Sets the maximum number of decimal places for double output. + /*! + This setting truncates the output with specified number of decimal places. + + For example, + + \code + writer.SetMaxDecimalPlaces(3); + writer.StartArray(); + writer.Double(0.12345); // "0.123" + writer.Double(0.0001); // "0.0" + writer.Double(1.234567890123456e30); // "1.234567890123456e30" (do not truncate significand for positive exponent) + writer.Double(1.23e-4); // "0.0" (do truncate significand for negative exponent) + writer.EndArray(); + \endcode + + The default setting does not truncate any decimal places. You can restore to this setting by calling + \code + writer.SetMaxDecimalPlaces(Writer::kDefaultMaxDecimalPlaces); + \endcode + */ + void SetMaxDecimalPlaces(int maxDecimalPlaces) { + maxDecimalPlaces_ = maxDecimalPlaces; + } + + /*!@name Implementation of Handler + \see Handler + */ + //@{ + + bool Null() { Prefix(kNullType); return EndValue(WriteNull()); } + bool Bool(bool b) { Prefix(b ? kTrueType : kFalseType); return EndValue(WriteBool(b)); } + bool Int(int i) { Prefix(kNumberType); return EndValue(WriteInt(i)); } + bool Uint(unsigned u) { Prefix(kNumberType); return EndValue(WriteUint(u)); } + bool Int64(int64_t i64) { Prefix(kNumberType); return EndValue(WriteInt64(i64)); } + bool Uint64(uint64_t u64) { Prefix(kNumberType); return EndValue(WriteUint64(u64)); } + + //! Writes the given \c double value to the stream + /*! + \param d The value to be written. + \return Whether it is succeed. + */ + bool Double(double d) { Prefix(kNumberType); return EndValue(WriteDouble(d)); } + + bool RawNumber(const Ch* str, SizeType length, bool copy = false) { + RAPIDJSON_ASSERT(str != 0); + (void)copy; + Prefix(kNumberType); + return EndValue(WriteString(str, length)); + } + + bool String(const Ch* str, SizeType length, bool copy = false) { + RAPIDJSON_ASSERT(str != 0); + (void)copy; + Prefix(kStringType); + return EndValue(WriteString(str, length)); + } + +#if RAPIDJSON_HAS_STDSTRING + bool String(const std::basic_string& str) { + return String(str.data(), SizeType(str.size())); + } +#endif + + bool StartObject() { + Prefix(kObjectType); + new (level_stack_.template Push()) Level(false); + return WriteStartObject(); + } + + bool Key(const Ch* str, SizeType length, bool copy = false) { return String(str, length, copy); } + +#if RAPIDJSON_HAS_STDSTRING + bool Key(const std::basic_string& str) + { + return Key(str.data(), SizeType(str.size())); + } +#endif + + bool EndObject(SizeType memberCount = 0) { + (void)memberCount; + RAPIDJSON_ASSERT(level_stack_.GetSize() >= sizeof(Level)); // not inside an Object + RAPIDJSON_ASSERT(!level_stack_.template Top()->inArray); // currently inside an Array, not Object + RAPIDJSON_ASSERT(0 == level_stack_.template Top()->valueCount % 2); // Object has a Key without a Value + level_stack_.template Pop(1); + return EndValue(WriteEndObject()); + } + + bool StartArray() { + Prefix(kArrayType); + new (level_stack_.template Push()) Level(true); + return WriteStartArray(); + } + + bool EndArray(SizeType elementCount = 0) { + (void)elementCount; + RAPIDJSON_ASSERT(level_stack_.GetSize() >= sizeof(Level)); + RAPIDJSON_ASSERT(level_stack_.template Top()->inArray); + level_stack_.template Pop(1); + return EndValue(WriteEndArray()); + } + //@} + + /*! @name Convenience extensions */ + //@{ + + //! Simpler but slower overload. + bool String(const Ch* const& str) { return String(str, internal::StrLen(str)); } + bool Key(const Ch* const& str) { return Key(str, internal::StrLen(str)); } + + //@} + + //! Write a raw JSON value. + /*! + For user to write a stringified JSON as a value. + + \param json A well-formed JSON value. It should not contain null character within [0, length - 1] range. + \param length Length of the json. + \param type Type of the root of json. + */ + bool RawValue(const Ch* json, size_t length, Type type) { + RAPIDJSON_ASSERT(json != 0); + Prefix(type); + return EndValue(WriteRawValue(json, length)); + } + + //! Flush the output stream. + /*! + Allows the user to flush the output stream immediately. + */ + void Flush() { + os_->Flush(); + } + +protected: + //! Information for each nested level + struct Level { + Level(bool inArray_) : valueCount(0), inArray(inArray_) {} + size_t valueCount; //!< number of values in this level + bool inArray; //!< true if in array, otherwise in object + }; + + static const size_t kDefaultLevelDepth = 32; + + bool WriteNull() { + PutReserve(*os_, 4); + PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'u'); PutUnsafe(*os_, 'l'); PutUnsafe(*os_, 'l'); return true; + } + + bool WriteBool(bool b) { + if (b) { + PutReserve(*os_, 4); + PutUnsafe(*os_, 't'); PutUnsafe(*os_, 'r'); PutUnsafe(*os_, 'u'); PutUnsafe(*os_, 'e'); + } + else { + PutReserve(*os_, 5); + PutUnsafe(*os_, 'f'); PutUnsafe(*os_, 'a'); PutUnsafe(*os_, 'l'); PutUnsafe(*os_, 's'); PutUnsafe(*os_, 'e'); + } + return true; + } + + bool WriteInt(int i) { + char buffer[11]; + const char* end = internal::i32toa(i, buffer); + PutReserve(*os_, static_cast(end - buffer)); + for (const char* p = buffer; p != end; ++p) + PutUnsafe(*os_, static_cast(*p)); + return true; + } + + bool WriteUint(unsigned u) { + char buffer[10]; + const char* end = internal::u32toa(u, buffer); + PutReserve(*os_, static_cast(end - buffer)); + for (const char* p = buffer; p != end; ++p) + PutUnsafe(*os_, static_cast(*p)); + return true; + } + + bool WriteInt64(int64_t i64) { + char buffer[21]; + const char* end = internal::i64toa(i64, buffer); + PutReserve(*os_, static_cast(end - buffer)); + for (const char* p = buffer; p != end; ++p) + PutUnsafe(*os_, static_cast(*p)); + return true; + } + + bool WriteUint64(uint64_t u64) { + char buffer[20]; + char* end = internal::u64toa(u64, buffer); + PutReserve(*os_, static_cast(end - buffer)); + for (char* p = buffer; p != end; ++p) + PutUnsafe(*os_, static_cast(*p)); + return true; + } + + bool WriteDouble(double d) { + if (internal::Double(d).IsNanOrInf()) { + if (!(writeFlags & kWriteNanAndInfFlag)) + return false; + if (internal::Double(d).IsNan()) { + PutReserve(*os_, 3); + PutUnsafe(*os_, 'N'); PutUnsafe(*os_, 'a'); PutUnsafe(*os_, 'N'); + return true; + } + if (internal::Double(d).Sign()) { + PutReserve(*os_, 9); + PutUnsafe(*os_, '-'); + } + else + PutReserve(*os_, 8); + PutUnsafe(*os_, 'I'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'f'); + PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 't'); PutUnsafe(*os_, 'y'); + return true; + } + + char buffer[25]; + char* end = internal::dtoa(d, buffer, maxDecimalPlaces_); + PutReserve(*os_, static_cast(end - buffer)); + for (char* p = buffer; p != end; ++p) + PutUnsafe(*os_, static_cast(*p)); + return true; + } + + bool WriteString(const Ch* str, SizeType length) { + static const typename OutputStream::Ch hexDigits[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + static const char escape[256] = { +#define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + //0 1 2 3 4 5 6 7 8 9 A B C D E F + 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'b', 't', 'n', 'u', 'f', 'r', 'u', 'u', // 00 + 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', // 10 + 0, 0, '"', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 20 + Z16, Z16, // 30~4F + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,'\\', 0, 0, 0, // 50 + Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16 // 60~FF +#undef Z16 + }; + + if (TargetEncoding::supportUnicode) + PutReserve(*os_, 2 + length * 6); // "\uxxxx..." + else + PutReserve(*os_, 2 + length * 12); // "\uxxxx\uyyyy..." + + PutUnsafe(*os_, '\"'); + GenericStringStream is(str); + while (ScanWriteUnescapedString(is, length)) { + const Ch c = is.Peek(); + if (!TargetEncoding::supportUnicode && static_cast(c) >= 0x80) { + // Unicode escaping + unsigned codepoint; + if (RAPIDJSON_UNLIKELY(!SourceEncoding::Decode(is, &codepoint))) + return false; + PutUnsafe(*os_, '\\'); + PutUnsafe(*os_, 'u'); + if (codepoint <= 0xD7FF || (codepoint >= 0xE000 && codepoint <= 0xFFFF)) { + PutUnsafe(*os_, hexDigits[(codepoint >> 12) & 15]); + PutUnsafe(*os_, hexDigits[(codepoint >> 8) & 15]); + PutUnsafe(*os_, hexDigits[(codepoint >> 4) & 15]); + PutUnsafe(*os_, hexDigits[(codepoint ) & 15]); + } + else { + RAPIDJSON_ASSERT(codepoint >= 0x010000 && codepoint <= 0x10FFFF); + // Surrogate pair + unsigned s = codepoint - 0x010000; + unsigned lead = (s >> 10) + 0xD800; + unsigned trail = (s & 0x3FF) + 0xDC00; + PutUnsafe(*os_, hexDigits[(lead >> 12) & 15]); + PutUnsafe(*os_, hexDigits[(lead >> 8) & 15]); + PutUnsafe(*os_, hexDigits[(lead >> 4) & 15]); + PutUnsafe(*os_, hexDigits[(lead ) & 15]); + PutUnsafe(*os_, '\\'); + PutUnsafe(*os_, 'u'); + PutUnsafe(*os_, hexDigits[(trail >> 12) & 15]); + PutUnsafe(*os_, hexDigits[(trail >> 8) & 15]); + PutUnsafe(*os_, hexDigits[(trail >> 4) & 15]); + PutUnsafe(*os_, hexDigits[(trail ) & 15]); + } + } + else if ((sizeof(Ch) == 1 || static_cast(c) < 256) && RAPIDJSON_UNLIKELY(escape[static_cast(c)])) { + is.Take(); + PutUnsafe(*os_, '\\'); + PutUnsafe(*os_, static_cast(escape[static_cast(c)])); + if (escape[static_cast(c)] == 'u') { + PutUnsafe(*os_, '0'); + PutUnsafe(*os_, '0'); + PutUnsafe(*os_, hexDigits[static_cast(c) >> 4]); + PutUnsafe(*os_, hexDigits[static_cast(c) & 0xF]); + } + } + else if (RAPIDJSON_UNLIKELY(!(writeFlags & kWriteValidateEncodingFlag ? + Transcoder::Validate(is, *os_) : + Transcoder::TranscodeUnsafe(is, *os_)))) + return false; + } + PutUnsafe(*os_, '\"'); + return true; + } + + bool ScanWriteUnescapedString(GenericStringStream& is, size_t length) { + return RAPIDJSON_LIKELY(is.Tell() < length); + } + + bool WriteStartObject() { os_->Put('{'); return true; } + bool WriteEndObject() { os_->Put('}'); return true; } + bool WriteStartArray() { os_->Put('['); return true; } + bool WriteEndArray() { os_->Put(']'); return true; } + + bool WriteRawValue(const Ch* json, size_t length) { + PutReserve(*os_, length); + GenericStringStream is(json); + while (RAPIDJSON_LIKELY(is.Tell() < length)) { + const Ch c = is.Peek(); + RAPIDJSON_ASSERT(c != '\0'); + if (RAPIDJSON_UNLIKELY(!(writeFlags & kWriteValidateEncodingFlag ? + Transcoder::Validate(is, *os_) : + Transcoder::TranscodeUnsafe(is, *os_)))) + return false; + } + return true; + } + + void Prefix(Type type) { + (void)type; + if (RAPIDJSON_LIKELY(level_stack_.GetSize() != 0)) { // this value is not at root + Level* level = level_stack_.template Top(); + if (level->valueCount > 0) { + if (level->inArray) + os_->Put(','); // add comma if it is not the first element in array + else // in object + os_->Put((level->valueCount % 2 == 0) ? ',' : ':'); + } + if (!level->inArray && level->valueCount % 2 == 0) + RAPIDJSON_ASSERT(type == kStringType); // if it's in object, then even number should be a name + level->valueCount++; + } + else { + RAPIDJSON_ASSERT(!hasRoot_); // Should only has one and only one root. + hasRoot_ = true; + } + } + + // Flush the value if it is the top level one. + bool EndValue(bool ret) { + if (RAPIDJSON_UNLIKELY(level_stack_.Empty())) // end of json text + Flush(); + return ret; + } + + OutputStream* os_; + internal::Stack level_stack_; + int maxDecimalPlaces_; + bool hasRoot_; + +private: + // Prohibit copy constructor & assignment operator. + Writer(const Writer&); + Writer& operator=(const Writer&); +}; + +// Full specialization for StringStream to prevent memory copying + +template<> +inline bool Writer::WriteInt(int i) { + char *buffer = os_->Push(11); + const char* end = internal::i32toa(i, buffer); + os_->Pop(static_cast(11 - (end - buffer))); + return true; +} + +template<> +inline bool Writer::WriteUint(unsigned u) { + char *buffer = os_->Push(10); + const char* end = internal::u32toa(u, buffer); + os_->Pop(static_cast(10 - (end - buffer))); + return true; +} + +template<> +inline bool Writer::WriteInt64(int64_t i64) { + char *buffer = os_->Push(21); + const char* end = internal::i64toa(i64, buffer); + os_->Pop(static_cast(21 - (end - buffer))); + return true; +} + +template<> +inline bool Writer::WriteUint64(uint64_t u) { + char *buffer = os_->Push(20); + const char* end = internal::u64toa(u, buffer); + os_->Pop(static_cast(20 - (end - buffer))); + return true; +} + +template<> +inline bool Writer::WriteDouble(double d) { + if (internal::Double(d).IsNanOrInf()) { + // Note: This code path can only be reached if (RAPIDJSON_WRITE_DEFAULT_FLAGS & kWriteNanAndInfFlag). + if (!(kWriteDefaultFlags & kWriteNanAndInfFlag)) + return false; + if (internal::Double(d).IsNan()) { + PutReserve(*os_, 3); + PutUnsafe(*os_, 'N'); PutUnsafe(*os_, 'a'); PutUnsafe(*os_, 'N'); + return true; + } + if (internal::Double(d).Sign()) { + PutReserve(*os_, 9); + PutUnsafe(*os_, '-'); + } + else + PutReserve(*os_, 8); + PutUnsafe(*os_, 'I'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'f'); + PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 't'); PutUnsafe(*os_, 'y'); + return true; + } + + char *buffer = os_->Push(25); + char* end = internal::dtoa(d, buffer, maxDecimalPlaces_); + os_->Pop(static_cast(25 - (end - buffer))); + return true; +} + +#if defined(RAPIDJSON_SSE2) || defined(RAPIDJSON_SSE42) +template<> +inline bool Writer::ScanWriteUnescapedString(StringStream& is, size_t length) { + if (length < 16) + return RAPIDJSON_LIKELY(is.Tell() < length); + + if (!RAPIDJSON_LIKELY(is.Tell() < length)) + return false; + + const char* p = is.src_; + const char* end = is.head_ + length; + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + const char* endAligned = reinterpret_cast(reinterpret_cast(end) & static_cast(~15)); + if (nextAligned > end) + return true; + + while (p != nextAligned) + if (*p < 0x20 || *p == '\"' || *p == '\\') { + is.src_ = p; + return RAPIDJSON_LIKELY(is.Tell() < length); + } + else + os_->PutUnsafe(*p++); + + // The rest of string using SIMD + static const char dquote[16] = { '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"' }; + static const char bslash[16] = { '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\' }; + static const char space[16] = { 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F }; + const __m128i dq = _mm_loadu_si128(reinterpret_cast(&dquote[0])); + const __m128i bs = _mm_loadu_si128(reinterpret_cast(&bslash[0])); + const __m128i sp = _mm_loadu_si128(reinterpret_cast(&space[0])); + + for (; p != endAligned; p += 16) { + const __m128i s = _mm_load_si128(reinterpret_cast(p)); + const __m128i t1 = _mm_cmpeq_epi8(s, dq); + const __m128i t2 = _mm_cmpeq_epi8(s, bs); + const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp); // s < 0x20 <=> max(s, 0x1F) == 0x1F + const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3); + unsigned short r = static_cast(_mm_movemask_epi8(x)); + if (RAPIDJSON_UNLIKELY(r != 0)) { // some of characters is escaped + SizeType len; +#ifdef _MSC_VER // Find the index of first escaped + unsigned long offset; + _BitScanForward(&offset, r); + len = offset; +#else + len = static_cast(__builtin_ffs(r) - 1); +#endif + char* q = reinterpret_cast(os_->PushUnsafe(len)); + for (size_t i = 0; i < len; i++) + q[i] = p[i]; + + p += len; + break; + } + _mm_storeu_si128(reinterpret_cast<__m128i *>(os_->PushUnsafe(16)), s); + } + + is.src_ = p; + return RAPIDJSON_LIKELY(is.Tell() < length); +} +#elif defined(RAPIDJSON_NEON) +template<> +inline bool Writer::ScanWriteUnescapedString(StringStream& is, size_t length) { + if (length < 16) + return RAPIDJSON_LIKELY(is.Tell() < length); + + if (!RAPIDJSON_LIKELY(is.Tell() < length)) + return false; + + const char* p = is.src_; + const char* end = is.head_ + length; + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + const char* endAligned = reinterpret_cast(reinterpret_cast(end) & static_cast(~15)); + if (nextAligned > end) + return true; + + while (p != nextAligned) + if (*p < 0x20 || *p == '\"' || *p == '\\') { + is.src_ = p; + return RAPIDJSON_LIKELY(is.Tell() < length); + } + else + os_->PutUnsafe(*p++); + + // The rest of string using SIMD + const uint8x16_t s0 = vmovq_n_u8('"'); + const uint8x16_t s1 = vmovq_n_u8('\\'); + const uint8x16_t s2 = vmovq_n_u8('\b'); + const uint8x16_t s3 = vmovq_n_u8(32); + + for (; p != endAligned; p += 16) { + const uint8x16_t s = vld1q_u8(reinterpret_cast(p)); + uint8x16_t x = vceqq_u8(s, s0); + x = vorrq_u8(x, vceqq_u8(s, s1)); + x = vorrq_u8(x, vceqq_u8(s, s2)); + x = vorrq_u8(x, vcltq_u8(s, s3)); + + x = vrev64q_u8(x); // Rev in 64 + uint64_t low = vgetq_lane_u64(reinterpret_cast(x), 0); // extract + uint64_t high = vgetq_lane_u64(reinterpret_cast(x), 1); // extract + + SizeType len = 0; + bool escaped = false; + if (low == 0) { + if (high != 0) { + unsigned lz = (unsigned)__builtin_clzll(high); + len = 8 + (lz >> 3); + escaped = true; + } + } else { + unsigned lz = (unsigned)__builtin_clzll(low); + len = lz >> 3; + escaped = true; + } + if (RAPIDJSON_UNLIKELY(escaped)) { // some of characters is escaped + char* q = reinterpret_cast(os_->PushUnsafe(len)); + for (size_t i = 0; i < len; i++) + q[i] = p[i]; + + p += len; + break; + } + vst1q_u8(reinterpret_cast(os_->PushUnsafe(16)), s); + } + + is.src_ = p; + return RAPIDJSON_LIKELY(is.Tell() < length); +} +#endif // RAPIDJSON_NEON + +RAPIDJSON_NAMESPACE_END + +#if defined(_MSC_VER) || defined(__clang__) +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_RAPIDJSON_H_ diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/atomic/gcc_builtins.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/atomic/gcc_builtins.h new file mode 100644 index 0000000..4600a0e --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/atomic/gcc_builtins.h @@ -0,0 +1,38 @@ +/* Copyright (C) 2008 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#define MY_ATOMIC_MODE "atomic_builtins" + +#define make_atomic_add_body(S) \ + v= __sync_fetch_and_add(a, v); +#define make_atomic_swap_body(S) \ + v= __sync_lock_test_and_set(a, v); +#define make_atomic_cas_body(S) \ + int ## S sav; \ + sav= __sync_val_compare_and_swap(a, *cmp, set); \ + if (!(ret= (sav == *cmp))) *cmp= sav; + +#ifdef MY_ATOMIC_MODE_DUMMY +#define make_atomic_load_body(S) ret= *a +#define make_atomic_store_body(S) *a= v +#define MY_ATOMIC_MODE "gcc-builtins-up" + +#else +#define MY_ATOMIC_MODE "gcc-builtins-smp" +#define make_atomic_load_body(S) \ + ret= __sync_fetch_and_or(a, 0); +#define make_atomic_store_body(S) \ + (void) __sync_lock_test_and_set(a, v); +#endif diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/atomic/generic-msvc.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/atomic/generic-msvc.h new file mode 100644 index 0000000..a8601e9 --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/atomic/generic-msvc.h @@ -0,0 +1,115 @@ +/* Copyright (C) 2006-2008 MySQL AB, 2008-2009 Sun Microsystems, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef _atomic_h_cleanup_ +#define _atomic_h_cleanup_ "atomic/generic-msvc.h" + +/* + We don't implement anything specific for MY_ATOMIC_MODE_DUMMY, always use + intrinsics. + 8 and 16-bit atomics are not implemented, but it can be done if necessary. +*/ + +/* + x86 compilers (both VS2003 or VS2005) never use instrinsics, but generate + function calls to kernel32 instead, even in the optimized build. + We force intrinsics as described in MSDN documentation for + _InterlockedCompareExchange. +*/ +#ifdef _M_IX86 + +#if (_MSC_VER >= 1500) +#include +#else +C_MODE_START +/*Visual Studio 2003 and earlier do not have prototypes for atomic intrinsics*/ +LONG _InterlockedExchange (LONG volatile *Target,LONG Value); +LONG _InterlockedCompareExchange (LONG volatile *Target, LONG Value, LONG Comp); +LONG _InterlockedExchangeAdd (LONG volatile *Addend, LONG Value); +C_MODE_END + +#pragma intrinsic(_InterlockedExchangeAdd) +#pragma intrinsic(_InterlockedCompareExchange) +#pragma intrinsic(_InterlockedExchange) +#endif + +#define InterlockedExchange _InterlockedExchange +#define InterlockedExchangeAdd _InterlockedExchangeAdd +#define InterlockedCompareExchange _InterlockedCompareExchange +/* + No need to do something special for InterlockedCompareExchangePointer + as it is a #define to InterlockedCompareExchange. The same applies to + InterlockedExchangePointer. +*/ +#endif /*_M_IX86*/ + +#define MY_ATOMIC_MODE "msvc-intrinsics" +#define IL_EXCHG_ADD32(X,Y) InterlockedExchangeAdd((volatile LONG *)(X),(Y)) +#define IL_COMP_EXCHG32(X,Y,Z) InterlockedCompareExchange((volatile LONG *)(X),(Y),(Z)) +#define IL_COMP_EXCHGptr InterlockedCompareExchangePointer +#define IL_EXCHG32(X,Y) InterlockedExchange((volatile LONG *)(X),(Y)) +#define IL_EXCHGptr InterlockedExchangePointer +#define make_atomic_add_body(S) \ + v= IL_EXCHG_ADD ## S (a, v) +#define make_atomic_cas_body(S) \ + int ## S initial_cmp= *cmp; \ + int ## S initial_a= IL_COMP_EXCHG ## S (a, set, initial_cmp); \ + if (!(ret= (initial_a == initial_cmp))) *cmp= initial_a; +#define make_atomic_swap_body(S) \ + v= IL_EXCHG ## S (a, v) +#define make_atomic_load_body(S) \ + ret= 0; /* avoid compiler warning */ \ + ret= IL_COMP_EXCHG ## S (a, ret, ret); + +/* + my_yield_processor (equivalent of x86 PAUSE instruction) should be used + to improve performance on hyperthreaded CPUs. Intel recommends to use it in + spin loops also on non-HT machines to reduce power consumption (see e.g + http://softwarecommunity.intel.com/articles/eng/2004.htm) + + Running benchmarks for spinlocks implemented with InterlockedCompareExchange + and YieldProcessor shows that much better performance is achieved by calling + YieldProcessor in a loop - that is, yielding longer. On Intel boxes setting + loop count in the range 200-300 brought best results. + */ +#ifndef YIELD_LOOPS +#define YIELD_LOOPS 200 +#endif + +static __inline int my_yield_processor() +{ + int i; + for(i=0; irw) +#define my_atomic_rwlock_init(name) pthread_mutex_init(& (name)->rw, 0) +#define my_atomic_rwlock_rdlock(name) pthread_mutex_lock(& (name)->rw) +#define my_atomic_rwlock_wrlock(name) pthread_mutex_lock(& (name)->rw) +#define my_atomic_rwlock_rdunlock(name) pthread_mutex_unlock(& (name)->rw) +#define my_atomic_rwlock_wrunlock(name) pthread_mutex_unlock(& (name)->rw) +#define MY_ATOMIC_MODE "mutex" +#ifndef MY_ATOMIC_MODE_RWLOCKS +#define MY_ATOMIC_MODE_RWLOCKS 1 +#endif +#endif + +#define make_atomic_add_body(S) int ## S sav; sav= *a; *a+= v; v=sav; +#define make_atomic_fas_body(S) int ## S sav; sav= *a; *a= v; v=sav; +#define make_atomic_cas_body(S) if ((ret= (*a == *cmp))) *a= set; else *cmp=*a; +#define make_atomic_load_body(S) ret= *a; +#define make_atomic_store_body(S) *a= v; + diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/atomic/x86-gcc.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/atomic/x86-gcc.h new file mode 100644 index 0000000..5a34bc2 --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/atomic/x86-gcc.h @@ -0,0 +1,69 @@ +/* Copyright (C) 2006 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* + XXX 64-bit atomic operations can be implemented using + cmpxchg8b, if necessary. Though I've heard that not all 64-bit + architectures support double-word (128-bit) cas. +*/ + +#ifdef __x86_64__ +# ifdef MY_ATOMIC_NO_XADD +# define MY_ATOMIC_MODE "gcc-amd64" LOCK_prefix "-no-xadd" +# else +# define MY_ATOMIC_MODE "gcc-amd64" LOCK_prefix +# endif +#else +# ifdef MY_ATOMIC_NO_XADD +# define MY_ATOMIC_MODE "gcc-x86" LOCK_prefix "-no-xadd" +# else +# define MY_ATOMIC_MODE "gcc-x86" LOCK_prefix +# endif +#endif + +/* fix -ansi errors while maintaining readability */ +#ifndef asm +#define asm __asm__ +#endif + +#ifndef MY_ATOMIC_NO_XADD +#define make_atomic_add_body(S) \ + asm volatile (LOCK_prefix "; xadd %0, %1;" : "+r" (v) , "+m" (*a)) +#endif +#define make_atomic_fas_body(S) \ + asm volatile ("xchg %0, %1;" : "+r" (v) , "+m" (*a)) +#define make_atomic_cas_body(S) \ + asm volatile (LOCK_prefix "; cmpxchg %3, %0; setz %2;" \ + : "+m" (*a), "+a" (*cmp), "=q" (ret): "r" (set)) + +#ifdef MY_ATOMIC_MODE_DUMMY +#define make_atomic_load_body(S) ret=*a +#define make_atomic_store_body(S) *a=v +#else +/* + Actually 32-bit reads/writes are always atomic on x86 + But we add LOCK_prefix here anyway to force memory barriers +*/ +#define make_atomic_load_body(S) \ + ret=0; \ + asm volatile (LOCK_prefix "; cmpxchg %2, %0" \ + : "+m" (*a), "+a" (ret): "r" (ret)) +#define make_atomic_store_body(S) \ + asm volatile ("; xchg %0, %1;" : "+m" (*a), "+r" (v)) +#endif + +/* TODO test on intel whether the below helps. on AMD it makes no difference */ +//#define LF_BACKOFF ({asm volatile ("rep; nop"); 1; }) + diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/base64.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/base64.h new file mode 100644 index 0000000..155d669 --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/base64.h @@ -0,0 +1,49 @@ +/* Copyright (C) 2003 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __BASE64_H_INCLUDED__ +#define __BASE64_H_INCLUDED__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + Calculate how much memory needed for dst of base64_encode() +*/ +int my_base64_needed_encoded_length(int length_of_data); + +/* + Calculate how much memory needed for dst of base64_decode() +*/ +int my_base64_needed_decoded_length(int length_of_encoded_data); + + +/* + Encode data as a base64 string +*/ +int my_base64_encode(const void *src, size_t src_len, char *dst); + +/* + Decode a base64 string into data +*/ +int my_base64_decode(const char *src, size_t src_len, + void *dst, const char **end_ptr); + + +#ifdef __cplusplus +} +#endif +#endif /* !__BASE64_H_INCLUDED__ */ diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/config-win.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/config-win.h new file mode 100644 index 0000000..9457721 --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/config-win.h @@ -0,0 +1,392 @@ +/* Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* Defines for Win32 to make it compatible for MySQL */ + +#define BIG_TABLES + +/* + Minimal version of Windows we should be able to run on. + Currently Windows 2000 +*/ +#define _WIN32_WINNT 0x0500 + + +#if defined(_MSC_VER) && _MSC_VER >= 1400 +/* Avoid endless warnings about sprintf() etc. being unsafe. */ +#define _CRT_SECURE_NO_DEPRECATE 1 +#endif + +#include +#include /* chmod() constants*/ +#include +#include +#include +#include +#include +#include +#include /* getpid()*/ + +#define HAVE_SMEM 1 + +#if defined(_WIN64) || defined(WIN64) +#define SYSTEM_TYPE "Win64" +#elif defined(_WIN32) || defined(WIN32) +#define SYSTEM_TYPE "Win32" +#else +#define SYSTEM_TYPE "Windows" +#endif + +#if defined(_M_IA64) +#define MACHINE_TYPE "ia64" +#elif defined(_M_IX86) +#define MACHINE_TYPE "ia32" +#elif defined(_M_ALPHA) +#define MACHINE_TYPE "axp" +#else +#define MACHINE_TYPE "unknown" /* Define to machine type name */ +#endif + +#if !(defined(_WIN64) || defined(WIN64)) +#ifndef _WIN32 +#define _WIN32 /* Compatible with old source */ +#endif +#ifndef __WIN32__ +#define __WIN32__ +#endif +#endif /* _WIN64 */ +#ifndef __WIN__ +#define __WIN__ /* To make it easier in VC++ */ +#endif + +#ifndef MAX_INDEXES +#define MAX_INDEXES 64 +#endif + +/* File and lock constants */ +#ifdef __BORLANDC__ +#define F_RDLCK LK_NBLCK /* read lock */ +#define F_WRLCK LK_NBRLCK /* write lock */ +#define F_UNLCK LK_UNLCK /* remove lock(s) */ +#else +#define F_RDLCK _LK_NBLCK /* read lock */ +#define F_WRLCK _LK_NBRLCK /* write lock */ +#define F_UNLCK _LK_UNLCK /* remove lock(s) */ +#endif + +#define F_EXCLUSIVE 1 /* We have only exclusive locking */ +#define F_TO_EOF (INT_MAX32/2) /* size for lock of all file */ +#define F_OK 0 /* parameter to access() */ +#define W_OK 2 + +#define S_IROTH S_IREAD /* for my_lib */ + +/* for MY_S_ISFIFO() macro from my_lib */ +#if defined (_S_IFIFO) && !defined (S_IFIFO) +#define S_IFIFO _S_IFIFO +#endif + +/* Winsock2 constant (Vista SDK and later)*/ +#define IPPROTO_IPV6 41 +#ifndef IPV6_V6ONLY +#define IPV6_V6ONLY 27 +#endif + +/* + Constants used by chmod. Note, that group/others is ignored + - because unsupported by Windows due to different access control model. +*/ +#define S_IRWXU S_IREAD|S_IWRITE +#define S_IRWXG 0 +#define S_IRWXO 0 +typedef int mode_t; + +#ifdef __BORLANDC__ +#define FILE_BINARY O_BINARY /* my_fopen in binary mode */ +#define O_TEMPORARY 0 +#define O_SHORT_LIVED 0 +#define SH_DENYNO _SH_DENYNO +#else +#define O_BINARY _O_BINARY /* compability with older style names */ +#define FILE_BINARY _O_BINARY /* my_fopen in binary mode */ +#define O_TEMPORARY _O_TEMPORARY +#define O_SHORT_LIVED _O_SHORT_LIVED +#define SH_DENYNO _SH_DENYNO +#endif +#define NO_OPEN_3 /* For my_create() */ + +#define SIGQUIT SIGTERM /* No SIGQUIT */ + +#undef _REENTRANT /* Crashes something for win32 */ +#undef SAFE_MUTEX /* Can't be used on windows */ + +#define LONGLONG_MIN 0x8000000000000000LL +#define LONGLONG_MAX 0x7FFFFFFFFFFFFFFFLL +#define ULONGLONG_MAX 0xFFFFFFFFFFFFFFFFULL + +/* Type information */ + +#if !defined(HAVE_UINT) +#undef HAVE_UINT +#define HAVE_UINT +typedef unsigned short ushort; +typedef unsigned int uint; +#endif /* !defined(HAVE_UINT) */ + +typedef unsigned __int64 ulonglong; /* Microsofts 64 bit types */ +typedef __int64 longlong; +#ifndef HAVE_SIGSET_T +typedef int sigset_t; +#endif +#define longlong_defined +/* + off_t should not be __int64 because of conflicts in header files; + Use my_off_t or os_off_t instead +*/ +#ifndef HAVE_OFF_T +typedef long off_t; +#endif +typedef __int64 os_off_t; +#ifdef _WIN64 +typedef UINT_PTR rf_SetTimer; +#else +typedef uint rf_SetTimer; +#endif + +#ifndef HAVE_SIZE_T +#ifndef _SIZE_T_DEFINED +typedef SIZE_T size_t; +#define _SIZE_T_DEFINED +#endif +#endif + +#ifndef HAVE_SSIZE_T +#ifndef _SSIZE_T_DEFINED +typedef SSIZE_T ssize_t; +#define _SSIZE_T_DEFINED +#endif +#endif + +#define Socket_defined +#define my_socket SOCKET +#define SIGPIPE SIGINT +#define RETQSORTTYPE void +#define QSORT_TYPE_IS_VOID +#define SOCKET_SIZE_TYPE int +#define my_socket_defined +#define byte_defined +#define HUGE_PTR +#define STDCALL __stdcall /* Used by libmysql.dll */ +#define isnan(X) _isnan(X) +#define finite(X) _finite(X) + +#ifndef UNDEF_THREAD_HACK +#define THREAD +#endif +#define VOID_SIGHANDLER +#define SIZEOF_CHAR 1 +#define SIZEOF_INT 4 +#define SIZEOF_LONG 4 +#define SIZEOF_LONG_LONG 8 +#define SIZEOF_OFF_T 8 +#ifdef _WIN64 +#define SIZEOF_CHARP 8 +#else +#define SIZEOF_CHARP 4 +#endif +#define HAVE_BROKEN_NETINET_INCLUDES +#ifdef _WIN32 +#define HAVE_NAMED_PIPE /* We can only create pipes on NT */ +#endif + +/* ERROR is defined in wingdi.h */ +#undef ERROR + +/* We need to close files to break connections on shutdown */ +#ifndef SIGNAL_WITH_VIO_CLOSE +#define SIGNAL_WITH_VIO_CLOSE +#endif + +/* All windows servers should support .sym files */ +#undef USE_SYMDIR +#define USE_SYMDIR + +/* If LOAD DATA LOCAL INFILE should be enabled by default */ +#define ENABLED_LOCAL_INFILE 1 + +/* If query profiling should be enabled by default */ +#define ENABLED_PROFILING 1 + +/* Convert some simple functions to Posix */ + +#define my_sigset(A,B) signal((A),(B)) +#define finite(A) _finite(A) +#define sleep(A) Sleep((A)*1000) +#define popen(A,B) _popen((A),(B)) +#define pclose(A) _pclose(A) + +#ifndef __BORLANDC__ +#define access(A,B) _access(A,B) +#endif + +#if !defined(__cplusplus) +#define inline __inline +#endif /* __cplusplus */ + +#ifdef _WIN64 +#define ulonglong2double(A) ((double) (ulonglong) (A)) +#define my_off_t2double(A) ((double) (my_off_t) (A)) + +#else +inline double ulonglong2double(ulonglong value) +{ + longlong nr=(longlong) value; + if (nr >= 0) + return (double) nr; + return (18446744073709551616.0 + (double) nr); +} +#define my_off_t2double(A) ulonglong2double(A) +#endif /* _WIN64 */ + +inline ulonglong double2ulonglong(double d) +{ + double t= d - (double) 0x8000000000000000ULL; + + if (t >= 0) + return ((ulonglong) t) + 0x8000000000000000ULL; + return (ulonglong) d; +} + +#if SIZEOF_OFF_T > 4 +#define lseek(A,B,C) _lseeki64((A),(longlong) (B),(C)) +#define tell(A) _telli64(A) +#endif + +#define STACK_DIRECTION -1 + +/* Difference between GetSystemTimeAsFileTime() and now() */ +#define OFFSET_TO_EPOCH 116444736000000000ULL + +#define HAVE_PERROR +#define HAVE_VFPRINT +#define HAVE_RENAME /* Have rename() as function */ +#define HAVE_BINARY_STREAMS /* Have "b" flag in streams */ +#define HAVE_LONG_JMP /* Have long jump function */ +#define HAVE_LOCKING /* have locking() call */ +#define HAVE_ERRNO_AS_DEFINE /* errno is a define */ +#define HAVE_STDLIB /* everything is include in this file */ +#define HAVE_MEMCPY +#define HAVE_MEMMOVE +#define HAVE_GETCWD +#define HAVE_TELL +#define HAVE_TZNAME +#define HAVE_PUTENV +#define HAVE_SELECT +#define HAVE_SETLOCALE +#define HAVE_SOCKET /* Giangi */ +#define HAVE_FLOAT_H +#define HAVE_LIMITS_H +#define HAVE_STDDEF_H +#define NO_FCNTL_NONBLOCK /* No FCNTL */ +#define HAVE_ALLOCA +#define HAVE_STRPBRK +#define HAVE_STRSTR +#define HAVE_COMPRESS +#define HAVE_CREATESEMAPHORE +#define HAVE_ISNAN +#define HAVE_FINITE +#define HAVE_QUERY_CACHE +#define SPRINTF_RETURNS_INT +#define HAVE_SETFILEPOINTER +#define HAVE_VIO_READ_BUFF +#if defined(_MSC_VER) && _MSC_VER >= 1400 +/* strnlen() appeared in Studio 2005 */ +#define HAVE_STRNLEN +#endif +#define HAVE_WINSOCK2 + +#define strcasecmp stricmp +#define strncasecmp strnicmp + +#ifndef _WIN32 +#undef FILE_SHARE_DELETE +#define FILE_SHARE_DELETE 0 /* Not implemented on Win 98/ME */ +#endif + +#ifdef NOT_USED +#define HAVE_SNPRINTF /* Gave link error */ +#define _snprintf snprintf +#endif + +#ifdef _MSC_VER +#define HAVE_LDIV /* The optimizer breaks in zortech for ldiv */ +#define HAVE_ANSI_INCLUDE +#define HAVE_SYS_UTIME_H +#define HAVE_STRTOUL +#endif +#define my_reinterpret_cast(A) reinterpret_cast +#define my_const_cast(A) const_cast + + +/* MYSQL OPTIONS */ + +#ifdef _CUSTOMCONFIG_ +#include +#else +#define DEFAULT_MYSQL_HOME "c:\\mysql" +#define DATADIR "c:\\mysql\\data" +#define PACKAGE "mysql" +#define DEFAULT_BASEDIR "C:\\" +#define SHAREDIR "share" +#define DEFAULT_CHARSET_HOME "C:/mysql/" +#endif +#ifndef DEFAULT_HOME_ENV +#define DEFAULT_HOME_ENV MYSQL_HOME +#endif +#ifndef DEFAULT_GROUP_SUFFIX_ENV +#define DEFAULT_GROUP_SUFFIX_ENV MYSQL_GROUP_SUFFIX +#endif + +/* File name handling */ + +#define FN_LIBCHAR '\\' +#define FN_ROOTDIR "\\" +#define FN_DEVCHAR ':' +#define FN_NETWORK_DRIVES /* Uses \\ to indicate network drives */ +#define FN_NO_CASE_SENCE /* Files are not case-sensitive */ +#define OS_FILE_LIMIT UINT_MAX /* No limit*/ + +#define DO_NOT_REMOVE_THREAD_WRAPPERS +#define thread_safe_increment(V,L) InterlockedIncrement((long*) &(V)) +#define thread_safe_decrement(V,L) InterlockedDecrement((long*) &(V)) +/* The following is only used for statistics, so it should be good enough */ +#ifdef _WIN32 /* This should also work on Win98 but .. */ +#define thread_safe_add(V,C,L) InterlockedExchangeAdd((long*) &(V),(C)) +#define thread_safe_sub(V,C,L) InterlockedExchangeAdd((long*) &(V),-(long) (C)) +#endif + +#define shared_memory_buffer_length 16000 +#define default_shared_memory_base_name "MYSQL" + +#define HAVE_SPATIAL 1 +#define HAVE_RTREE_KEYS 1 + +#define HAVE_OPENSSL 1 +#define HAVE_YASSL 1 + +#define COMMUNITY_SERVER 1 +#define ENABLED_PROFILING 1 + +#define HAVE_BOOL 1 diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/decimal.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/decimal.h new file mode 100644 index 0000000..530ed9e --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/decimal.h @@ -0,0 +1,107 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef _decimal_h +#define _decimal_h + +typedef enum +{TRUNCATE=0, HALF_EVEN, HALF_UP, CEILING, FLOOR} + decimal_round_mode; +typedef int32 decimal_digit_t; + +typedef struct st_decimal_t { + int intg, frac, len; + my_bool sign; + decimal_digit_t *buf; +} decimal_t; + +int internal_str2dec(const char *from, decimal_t *to, char **end, + my_bool fixed); +int decimal2string(decimal_t *from, char *to, int *to_len, + int fixed_precision, int fixed_decimals, + char filler); +int decimal2ulonglong(decimal_t *from, ulonglong *to); +int ulonglong2decimal(ulonglong from, decimal_t *to); +int decimal2longlong(decimal_t *from, longlong *to); +int longlong2decimal(longlong from, decimal_t *to); +int decimal2double(decimal_t *from, double *to); +int double2decimal(double from, decimal_t *to); +int decimal_actual_fraction(decimal_t *from); +int decimal2bin(decimal_t *from, uchar *to, int precision, int scale); +int bin2decimal(const uchar *from, decimal_t *to, int precision, int scale); + +int decimal_size(int precision, int scale); +int decimal_bin_size(int precision, int scale); +int decimal_result_size(decimal_t *from1, decimal_t *from2, char op, + int param); + +int decimal_intg(decimal_t *from); +int decimal_add(decimal_t *from1, decimal_t *from2, decimal_t *to); +int decimal_sub(decimal_t *from1, decimal_t *from2, decimal_t *to); +int decimal_cmp(decimal_t *from1, decimal_t *from2); +int decimal_mul(decimal_t *from1, decimal_t *from2, decimal_t *to); +int decimal_div(decimal_t *from1, decimal_t *from2, decimal_t *to, + int scale_incr); +int decimal_mod(decimal_t *from1, decimal_t *from2, decimal_t *to); +int decimal_round(decimal_t *from, decimal_t *to, int new_scale, + decimal_round_mode mode); +int decimal_is_zero(decimal_t *from); +void max_decimal(int precision, int frac, decimal_t *to); + +#define string2decimal(A,B,C) internal_str2dec((A), (B), (C), 0) +#define string2decimal_fixed(A,B,C) internal_str2dec((A), (B), (C), 1) + +/* set a decimal_t to zero */ + +#define decimal_make_zero(dec) do { \ + (dec)->buf[0]=0; \ + (dec)->intg=1; \ + (dec)->frac=0; \ + (dec)->sign=0; \ + } while(0) + +/* + returns the length of the buffer to hold string representation + of the decimal (including decimal dot, possible sign and \0) +*/ + +#define decimal_string_size(dec) (((dec)->intg ? (dec)->intg : 1) + \ + (dec)->frac + ((dec)->frac > 0) + 2) + +/* negate a decimal */ +#define decimal_neg(dec) do { (dec)->sign^=1; } while(0) + +/* + conventions: + + decimal_smth() == 0 -- everything's ok + decimal_smth() <= 1 -- result is usable, but precision loss is possible + decimal_smth() <= 2 -- result can be unusable, most significant digits + could've been lost + decimal_smth() > 2 -- no result was generated +*/ + +#define E_DEC_OK 0 +#define E_DEC_TRUNCATED 1 +#define E_DEC_OVERFLOW 2 +#define E_DEC_DIV_ZERO 4 +#define E_DEC_BAD_NUM 8 +#define E_DEC_OOM 16 + +#define E_DEC_ERROR 31 +#define E_DEC_FATAL_ERROR 30 + +#endif + diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/errmsg.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/errmsg.h new file mode 100644 index 0000000..92d70ab --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/errmsg.h @@ -0,0 +1,103 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* Error messages for MySQL clients */ +/* (Error messages for the daemon are in sql/share/errmsg.txt) */ + +#ifdef __cplusplus +extern "C" { +#endif +void init_client_errs(void); +void finish_client_errs(void); +extern const char *client_errors[]; /* Error messages */ +#ifdef __cplusplus +} +#endif + +#define CR_MIN_ERROR 2000 /* For easier client code */ +#define CR_MAX_ERROR 2999 +#if !defined(ER) +#define ER(X) client_errors[(X)-CR_MIN_ERROR] +#endif +#define CLIENT_ERRMAP 2 /* Errormap used by my_error() */ + +/* Do not add error numbers before CR_ERROR_FIRST. */ +/* If necessary to add lower numbers, change CR_ERROR_FIRST accordingly. */ +#define CR_ERROR_FIRST 2000 /*Copy first error nr.*/ +#define CR_UNKNOWN_ERROR 2000 +#define CR_SOCKET_CREATE_ERROR 2001 +#define CR_CONNECTION_ERROR 2002 +#define CR_CONN_HOST_ERROR 2003 +#define CR_IPSOCK_ERROR 2004 +#define CR_UNKNOWN_HOST 2005 +#define CR_SERVER_GONE_ERROR 2006 +#define CR_VERSION_ERROR 2007 +#define CR_OUT_OF_MEMORY 2008 +#define CR_WRONG_HOST_INFO 2009 +#define CR_LOCALHOST_CONNECTION 2010 +#define CR_TCP_CONNECTION 2011 +#define CR_SERVER_HANDSHAKE_ERR 2012 +#define CR_SERVER_LOST 2013 +#define CR_COMMANDS_OUT_OF_SYNC 2014 +#define CR_NAMEDPIPE_CONNECTION 2015 +#define CR_NAMEDPIPEWAIT_ERROR 2016 +#define CR_NAMEDPIPEOPEN_ERROR 2017 +#define CR_NAMEDPIPESETSTATE_ERROR 2018 +#define CR_CANT_READ_CHARSET 2019 +#define CR_NET_PACKET_TOO_LARGE 2020 +#define CR_EMBEDDED_CONNECTION 2021 +#define CR_PROBE_SLAVE_STATUS 2022 +#define CR_PROBE_SLAVE_HOSTS 2023 +#define CR_PROBE_SLAVE_CONNECT 2024 +#define CR_PROBE_MASTER_CONNECT 2025 +#define CR_SSL_CONNECTION_ERROR 2026 +#define CR_MALFORMED_PACKET 2027 +#define CR_WRONG_LICENSE 2028 + +/* new 4.1 error codes */ +#define CR_NULL_POINTER 2029 +#define CR_NO_PREPARE_STMT 2030 +#define CR_PARAMS_NOT_BOUND 2031 +#define CR_DATA_TRUNCATED 2032 +#define CR_NO_PARAMETERS_EXISTS 2033 +#define CR_INVALID_PARAMETER_NO 2034 +#define CR_INVALID_BUFFER_USE 2035 +#define CR_UNSUPPORTED_PARAM_TYPE 2036 + +#define CR_SHARED_MEMORY_CONNECTION 2037 +#define CR_SHARED_MEMORY_CONNECT_REQUEST_ERROR 2038 +#define CR_SHARED_MEMORY_CONNECT_ANSWER_ERROR 2039 +#define CR_SHARED_MEMORY_CONNECT_FILE_MAP_ERROR 2040 +#define CR_SHARED_MEMORY_CONNECT_MAP_ERROR 2041 +#define CR_SHARED_MEMORY_FILE_MAP_ERROR 2042 +#define CR_SHARED_MEMORY_MAP_ERROR 2043 +#define CR_SHARED_MEMORY_EVENT_ERROR 2044 +#define CR_SHARED_MEMORY_CONNECT_ABANDONED_ERROR 2045 +#define CR_SHARED_MEMORY_CONNECT_SET_ERROR 2046 +#define CR_CONN_UNKNOW_PROTOCOL 2047 +#define CR_INVALID_CONN_HANDLE 2048 +#define CR_SECURE_AUTH 2049 +#define CR_FETCH_CANCELED 2050 +#define CR_NO_DATA 2051 +#define CR_NO_STMT_METADATA 2052 +#define CR_NO_RESULT_SET 2053 +#define CR_NOT_IMPLEMENTED 2054 +#define CR_SERVER_LOST_EXTENDED 2055 +#define CR_STMT_CLOSED 2056 +#define CR_NEW_STMT_METADATA 2057 +#define CR_ALREADY_CONNECTED 2058 +#define CR_ERROR_LAST /*Copy last error nr:*/ 2058 +/* Add error numbers before CR_ERROR_LAST and change it accordingly. */ + diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/hash.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/hash.h new file mode 100644 index 0000000..c1797c8 --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/hash.h @@ -0,0 +1,84 @@ +/* Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* Dynamic hashing of record with different key-length */ + +#ifndef _hash_h +#define _hash_h +#ifdef __cplusplus +extern "C" { +#endif + +/* + Overhead to store an element in hash + Can be used to approximate memory consumption for a hash + */ +#define HASH_OVERHEAD (sizeof(char*)*2) + +/* flags for hash_init */ +#define HASH_UNIQUE 1 /* hash_insert fails on duplicate key */ + +typedef uchar *(*my_hash_get_key)(const uchar *,size_t*,my_bool); +typedef void (*my_hash_free_key)(void *); +typedef my_bool (*my_hash_walk_action)(void *,void *); + +typedef struct st_hash { + size_t key_offset,key_length; /* Length of key if const length */ + size_t blength; + ulong records; + uint flags; + DYNAMIC_ARRAY array; /* Place for hash_keys */ + my_hash_get_key get_key; + void (*free)(void *); + CHARSET_INFO *charset; +} HASH; + +/* A search iterator state */ +typedef uint HASH_SEARCH_STATE; + +#define my_hash_init(A,B,C,D,E,F,G,H) \ + _my_hash_init(A,0,B,C,D,E,F,G,H CALLER_INFO) +#define my_hash_init2(A,B,C,D,E,F,G,H,I) \ + _my_hash_init(A,B,C,D,E,F,G,H,I CALLER_INFO) +my_bool _my_hash_init(HASH *hash, uint growth_size, CHARSET_INFO *charset, + ulong default_array_elements, size_t key_offset, + size_t key_length, my_hash_get_key get_key, + void (*free_element)(void*), + uint flags CALLER_INFO_PROTO); +void my_hash_free(HASH *tree); +void my_hash_reset(HASH *hash); +uchar *my_hash_element(HASH *hash, ulong idx); +uchar *my_hash_search(const HASH *info, const uchar *key, size_t length); +uchar *my_hash_first(const HASH *info, const uchar *key, size_t length, + HASH_SEARCH_STATE *state); +uchar *my_hash_next(const HASH *info, const uchar *key, size_t length, + HASH_SEARCH_STATE *state); +my_bool my_hash_insert(HASH *info, const uchar *data); +my_bool my_hash_delete(HASH *hash, uchar *record); +my_bool my_hash_update(HASH *hash, uchar *record, uchar *old_key, + size_t old_key_length); +void my_hash_replace(HASH *hash, HASH_SEARCH_STATE *state, uchar *new_row); +my_bool my_hash_check(HASH *hash); /* Only in debug library */ +my_bool my_hash_iterate(HASH *hash, my_hash_walk_action action, void *argument); + +#define my_hash_clear(H) bzero((char*) (H), sizeof(*(H))) +#define my_hash_inited(H) ((H)->array.buffer != 0) +#define my_hash_init_opt(A,B,C,D,E,F,G,H) \ + (!my_hash_inited(A) && _my_hash_init(A,0,B,C,D,E,F,G, H CALLER_INFO)) + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/keycache.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/keycache.h new file mode 100644 index 0000000..0375d10 --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/keycache.h @@ -0,0 +1,153 @@ +/* Copyright (C) 2003 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/** + @file + Key cache API +*/ + +#ifndef _keycache_h +#define _keycache_h +C_MODE_START + +/* declare structures that is used by st_key_cache */ + +struct st_block_link; +typedef struct st_block_link BLOCK_LINK; +struct st_keycache_page; +typedef struct st_keycache_page KEYCACHE_PAGE; +struct st_hash_link; +typedef struct st_hash_link HASH_LINK; + +/* info about requests in a waiting queue */ +typedef struct st_keycache_wqueue +{ + struct st_my_thread_var *last_thread; /* circular list of waiting threads */ +} KEYCACHE_WQUEUE; + +/** Callback called when any block is flushed */ +typedef int (*KEYCACHE_POST_WRITE_CALLBACK)(void *arg, const uchar *buffert, + uint length, my_off_t filepos); + +#define CHANGED_BLOCKS_HASH 128 /* must be power of 2 */ + +/* + The key cache structure + It also contains read-only statistics parameters. +*/ + +typedef struct st_key_cache +{ + my_bool key_cache_inited; + my_bool in_resize; /* true during resize operation */ + my_bool resize_in_flush; /* true during flush of resize operation */ + my_bool can_be_used; /* usage of cache for read/write is allowed */ + size_t key_cache_mem_size; /* specified size of the cache memory */ + uint key_cache_block_size; /* size of the page buffer of a cache block */ + ulong min_warm_blocks; /* min number of warm blocks; */ + ulong age_threshold; /* age threshold for hot blocks */ + ulonglong keycache_time; /* total number of block link operations */ + uint hash_entries; /* max number of entries in the hash table */ + int hash_links; /* max number of hash links */ + int hash_links_used; /* number of hash links currently used */ + int disk_blocks; /* max number of blocks in the cache */ + ulong blocks_used; /* maximum number of concurrently used blocks */ + ulong blocks_unused; /* number of currently unused blocks */ + ulong blocks_changed; /* number of currently dirty blocks */ + ulong warm_blocks; /* number of blocks in warm sub-chain */ + ulong cnt_for_resize_op; /* counter to block resize operation */ + long blocks_available; /* number of blocks available in the LRU chain */ + HASH_LINK **hash_root; /* arr. of entries into hash table buckets */ + HASH_LINK *hash_link_root; /* memory for hash table links */ + HASH_LINK *free_hash_list; /* list of free hash links */ + BLOCK_LINK *free_block_list; /* list of free blocks */ + BLOCK_LINK *block_root; /* memory for block links */ + uchar HUGE_PTR *block_mem; /* memory for block buffers */ + BLOCK_LINK *used_last; /* ptr to the last block of the LRU chain */ + BLOCK_LINK *used_ins; /* ptr to the insertion block in LRU chain */ + pthread_mutex_t cache_lock; /* to lock access to the cache structure */ + KEYCACHE_WQUEUE resize_queue; /* threads waiting during resize operation */ + /* + Waiting for a zero resize count. Using a queue for symmetry though + only one thread can wait here. + */ + KEYCACHE_WQUEUE waiting_for_resize_cnt; + KEYCACHE_WQUEUE waiting_for_hash_link; /* waiting for a free hash link */ + KEYCACHE_WQUEUE waiting_for_block; /* requests waiting for a free block */ + BLOCK_LINK *changed_blocks[CHANGED_BLOCKS_HASH]; /* hash for dirty file bl.*/ + BLOCK_LINK *file_blocks[CHANGED_BLOCKS_HASH]; /* hash for other file bl.*/ + KEYCACHE_POST_WRITE_CALLBACK post_write;/**< Called when flushing any block*/ + + /* + The following variables are and variables used to hold parameters for + initializing the key cache. + */ + + ulonglong param_buff_size; /* size the memory allocated for the cache */ + ulong param_block_size; /* size of the blocks in the key cache */ + ulong param_division_limit; /* min. percentage of warm blocks */ + ulong param_age_threshold; /* determines when hot block is downgraded */ + + /* Statistics variables. These are reset in reset_key_cache_counters(). */ + ulong global_blocks_changed; /* number of currently dirty blocks */ + ulonglong global_cache_w_requests;/* number of write requests (write hits) */ + ulonglong global_cache_write; /* number of writes from cache to files */ + ulonglong global_cache_r_requests;/* number of read requests (read hits) */ + ulonglong global_cache_read; /* number of reads from files to cache */ + + int blocks; /* max number of blocks in the cache */ + my_bool in_init; /* Set to 1 in MySQL during init/resize */ +} KEY_CACHE; + +/* The default key cache */ +extern KEY_CACHE dflt_key_cache_var, *dflt_key_cache; + +extern int init_key_cache(KEY_CACHE *keycache, uint key_cache_block_size, + size_t use_mem, uint division_limit, + uint age_threshold); +extern int resize_key_cache(KEY_CACHE *keycache, uint key_cache_block_size, + size_t use_mem, uint division_limit, + uint age_threshold); +extern void change_key_cache_param(KEY_CACHE *keycache, uint division_limit, + uint age_threshold); +extern uchar *key_cache_read(KEY_CACHE *keycache, + File file, my_off_t filepos, int level, + uchar *buff, uint length, + uint block_length,int return_buffer); +extern int key_cache_insert(KEY_CACHE *keycache, + File file, my_off_t filepos, int level, + uchar *buff, uint length); +extern int key_cache_write(KEY_CACHE *keycache, + File file, my_off_t filepos, int level, + uchar *buff, uint length, + uint block_length, int force_write, + void *post_write_arg); +extern int flush_key_blocks(KEY_CACHE *keycache, + int file, enum flush_type type); +extern void end_key_cache(KEY_CACHE *keycache, my_bool cleanup); + +/* Functions to handle multiple key caches */ +extern my_bool multi_keycache_init(void); +extern void multi_keycache_free(void); +extern KEY_CACHE *multi_key_cache_search(uchar *key, uint length, + KEY_CACHE *def); +extern my_bool multi_key_cache_set(const uchar *key, uint length, + KEY_CACHE *key_cache); +extern void multi_key_cache_change(KEY_CACHE *old_data, + KEY_CACHE *new_data); +extern int reset_key_cache_counters(const char *name, + KEY_CACHE *key_cache); +C_MODE_END +#endif /* _keycache_h */ diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/lf.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/lf.h new file mode 100644 index 0000000..83358aa --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/lf.h @@ -0,0 +1,260 @@ +/* Copyright (C) 2007-2008 MySQL AB, 2008-2009 Sun Microsystems, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef _lf_h +#define _lf_h + +#include + +/* + Helpers to define both func() and _func(), where + func() is a _func() protected by my_atomic_rwlock_wrlock() +*/ + +#define lock_wrap(f, t, proto_args, args, lock) \ +t _ ## f proto_args; \ +static inline t f proto_args \ +{ \ + t ret; \ + my_atomic_rwlock_wrlock(lock); \ + ret= _ ## f args; \ + my_atomic_rwlock_wrunlock(lock); \ + return ret; \ +} + +#define lock_wrap_void(f, proto_args, args, lock) \ +void _ ## f proto_args; \ +static inline void f proto_args \ +{ \ + my_atomic_rwlock_wrlock(lock); \ + _ ## f args; \ + my_atomic_rwlock_wrunlock(lock); \ +} + +#define nolock_wrap(f, t, proto_args, args) \ +t _ ## f proto_args; \ +static inline t f proto_args \ +{ \ + return _ ## f args; \ +} + +#define nolock_wrap_void(f, proto_args, args) \ +void _ ## f proto_args; \ +static inline void f proto_args \ +{ \ + _ ## f args; \ +} + +/* + wait-free dynamic array, see lf_dynarray.c + + 4 levels of 256 elements each mean 4311810304 elements in an array - it + should be enough for a while +*/ +#define LF_DYNARRAY_LEVEL_LENGTH 256 +#define LF_DYNARRAY_LEVELS 4 + +typedef struct { + void * volatile level[LF_DYNARRAY_LEVELS]; + uint size_of_element; + my_atomic_rwlock_t lock; +} LF_DYNARRAY; + +typedef int (*lf_dynarray_func)(void *, void *); + +void lf_dynarray_init(LF_DYNARRAY *array, uint element_size); +void lf_dynarray_destroy(LF_DYNARRAY *array); + +nolock_wrap(lf_dynarray_value, void *, + (LF_DYNARRAY *array, uint idx), + (array, idx)) +lock_wrap(lf_dynarray_lvalue, void *, + (LF_DYNARRAY *array, uint idx), + (array, idx), + &array->lock) +nolock_wrap(lf_dynarray_iterate, int, + (LF_DYNARRAY *array, lf_dynarray_func func, void *arg), + (array, func, arg)) + +/* + pin manager for memory allocator, lf_alloc-pin.c +*/ + +#define LF_PINBOX_PINS 4 +#define LF_PURGATORY_SIZE 10 + +typedef void lf_pinbox_free_func(void *, void *, void*); + +typedef struct { + LF_DYNARRAY pinarray; + lf_pinbox_free_func *free_func; + void *free_func_arg; + uint free_ptr_offset; + uint32 volatile pinstack_top_ver; /* this is a versioned pointer */ + uint32 volatile pins_in_array; /* number of elements in array */ +} LF_PINBOX; + +typedef struct { + void * volatile pin[LF_PINBOX_PINS]; + LF_PINBOX *pinbox; + void **stack_ends_here; + void *purgatory; + uint32 purgatory_count; + uint32 volatile link; +/* we want sizeof(LF_PINS) to be 64 to avoid false sharing */ +#if SIZEOF_INT*2+SIZEOF_CHARP*(LF_PINBOX_PINS+3) != 64 + char pad[64-sizeof(uint32)*2-sizeof(void*)*(LF_PINBOX_PINS+3)]; +#endif +} LF_PINS; + +/* + shortcut macros to do an atomic_wrlock on a structure that uses pins + (e.g. lf_hash). +*/ +#define lf_rwlock_by_pins(PINS) \ + my_atomic_rwlock_wrlock(&(PINS)->pinbox->pinarray.lock) +#define lf_rwunlock_by_pins(PINS) \ + my_atomic_rwlock_wrunlock(&(PINS)->pinbox->pinarray.lock) + +/* + compile-time assert, to require "no less than N" pins + it's enough if it'll fail on at least one compiler, so + we'll enable it on GCC only, which supports zero-length arrays. +*/ +#if defined(__GNUC__) && defined(MY_LF_EXTRA_DEBUG) +#define LF_REQUIRE_PINS(N) \ + static const char require_pins[LF_PINBOX_PINS-N] \ + __attribute__ ((unused)); \ + static const int LF_NUM_PINS_IN_THIS_FILE= N; +#define _lf_pin(PINS, PIN, ADDR) \ + ( \ + assert(PIN < LF_NUM_PINS_IN_THIS_FILE), \ + my_atomic_storeptr(&(PINS)->pin[PIN], (ADDR)) \ + ) +#else +#define LF_REQUIRE_PINS(N) +#define _lf_pin(PINS, PIN, ADDR) my_atomic_storeptr(&(PINS)->pin[PIN], (ADDR)) +#endif + +#define _lf_unpin(PINS, PIN) _lf_pin(PINS, PIN, NULL) +#define lf_pin(PINS, PIN, ADDR) \ + do { \ + lf_rwlock_by_pins(PINS); \ + _lf_pin(PINS, PIN, ADDR); \ + lf_rwunlock_by_pins(PINS); \ + } while (0) +#define lf_unpin(PINS, PIN) lf_pin(PINS, PIN, NULL) +#define _lf_assert_pin(PINS, PIN) assert((PINS)->pin[PIN] != 0) +#define _lf_assert_unpin(PINS, PIN) assert((PINS)->pin[PIN] == 0) + +void lf_pinbox_init(LF_PINBOX *pinbox, uint free_ptr_offset, + lf_pinbox_free_func *free_func, void * free_func_arg); +void lf_pinbox_destroy(LF_PINBOX *pinbox); + +lock_wrap(lf_pinbox_get_pins, LF_PINS *, + (LF_PINBOX *pinbox), + (pinbox), + &pinbox->pinarray.lock) +lock_wrap_void(lf_pinbox_put_pins, + (LF_PINS *pins), + (pins), + &pins->pinbox->pinarray.lock) +lock_wrap_void(lf_pinbox_free, + (LF_PINS *pins, void *addr), + (pins, addr), + &pins->pinbox->pinarray.lock) + +/* + memory allocator, lf_alloc-pin.c +*/ + +typedef struct st_lf_allocator { + LF_PINBOX pinbox; + uchar * volatile top; + uint element_size; + uint32 volatile mallocs; + void (*constructor)(uchar *); /* called, when an object is malloc()'ed */ + void (*destructor)(uchar *); /* called, when an object is free()'d */ +} LF_ALLOCATOR; + +void lf_alloc_init(LF_ALLOCATOR *allocator, uint size, uint free_ptr_offset); +void lf_alloc_destroy(LF_ALLOCATOR *allocator); +uint lf_alloc_pool_count(LF_ALLOCATOR *allocator); +/* + shortcut macros to access underlying pinbox functions from an LF_ALLOCATOR + see _lf_pinbox_get_pins() and _lf_pinbox_put_pins() +*/ +#define _lf_alloc_free(PINS, PTR) _lf_pinbox_free((PINS), (PTR)) +#define lf_alloc_free(PINS, PTR) lf_pinbox_free((PINS), (PTR)) +#define _lf_alloc_get_pins(A) _lf_pinbox_get_pins(&(A)->pinbox) +#define lf_alloc_get_pins(A) lf_pinbox_get_pins(&(A)->pinbox) +#define _lf_alloc_put_pins(PINS) _lf_pinbox_put_pins(PINS) +#define lf_alloc_put_pins(PINS) lf_pinbox_put_pins(PINS) +#define lf_alloc_direct_free(ALLOC, ADDR) my_free((uchar*)(ADDR), MYF(0)) + +lock_wrap(lf_alloc_new, void *, + (LF_PINS *pins), + (pins), + &pins->pinbox->pinarray.lock) + +/* + extendible hash, lf_hash.c +*/ +#include + +#define LF_HASH_UNIQUE 1 + +/* lf_hash overhead per element (that is, sizeof(LF_SLIST) */ +extern const int LF_HASH_OVERHEAD; + +typedef struct { + LF_DYNARRAY array; /* hash itself */ + LF_ALLOCATOR alloc; /* allocator for elements */ + my_hash_get_key get_key; /* see HASH */ + CHARSET_INFO *charset; /* see HASH */ + uint key_offset, key_length; /* see HASH */ + uint element_size; /* size of memcpy'ed area on insert */ + uint flags; /* LF_HASH_UNIQUE, etc */ + int32 volatile size; /* size of array */ + int32 volatile count; /* number of elements in the hash */ +} LF_HASH; + +void lf_hash_init(LF_HASH *hash, uint element_size, uint flags, + uint key_offset, uint key_length, my_hash_get_key get_key, + CHARSET_INFO *charset); +void lf_hash_destroy(LF_HASH *hash); +int lf_hash_insert(LF_HASH *hash, LF_PINS *pins, const void *data); +void *lf_hash_search(LF_HASH *hash, LF_PINS *pins, const void *key, uint keylen); +int lf_hash_delete(LF_HASH *hash, LF_PINS *pins, const void *key, uint keylen); +/* + shortcut macros to access underlying pinbox functions from an LF_HASH + see _lf_pinbox_get_pins() and _lf_pinbox_put_pins() +*/ +#define _lf_hash_get_pins(HASH) _lf_alloc_get_pins(&(HASH)->alloc) +#define lf_hash_get_pins(HASH) lf_alloc_get_pins(&(HASH)->alloc) +#define _lf_hash_put_pins(PINS) _lf_pinbox_put_pins(PINS) +#define lf_hash_put_pins(PINS) lf_pinbox_put_pins(PINS) +#define lf_hash_search_unpin(PINS) lf_unpin((PINS), 2) +/* + cleanup +*/ + +#undef lock_wrap_void +#undef lock_wrap +#undef nolock_wrap_void +#undef nolock_wrap + +#endif + diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/m_ctype.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/m_ctype.h new file mode 100644 index 0000000..33229a3 --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/m_ctype.h @@ -0,0 +1,654 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* + A better inplementation of the UNIX ctype(3) library. + Notes: my_global.h should be included before ctype.h +*/ + +#ifndef _m_ctype_h +#define _m_ctype_h + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define MY_CS_NAME_SIZE 32 +#define MY_CS_CTYPE_TABLE_SIZE 257 +#define MY_CS_TO_LOWER_TABLE_SIZE 256 +#define MY_CS_TO_UPPER_TABLE_SIZE 256 +#define MY_CS_SORT_ORDER_TABLE_SIZE 256 +#define MY_CS_TO_UNI_TABLE_SIZE 256 + +#define CHARSET_DIR "charsets/" + +#define my_wc_t ulong + +typedef struct unicase_info_st +{ + uint16 toupper; + uint16 tolower; + uint16 sort; +} MY_UNICASE_INFO; + + +extern MY_UNICASE_INFO *my_unicase_default[256]; +extern MY_UNICASE_INFO *my_unicase_turkish[256]; + +typedef struct uni_ctype_st +{ + uchar pctype; + uchar *ctype; +} MY_UNI_CTYPE; + +extern MY_UNI_CTYPE my_uni_ctype[256]; + +/* wm_wc and wc_mb return codes */ +#define MY_CS_ILSEQ 0 /* Wrong by sequence: wb_wc */ +#define MY_CS_ILUNI 0 /* Cannot encode Unicode to charset: wc_mb */ +#define MY_CS_TOOSMALL -101 /* Need at least one byte: wc_mb and mb_wc */ +#define MY_CS_TOOSMALL2 -102 /* Need at least two bytes: wc_mb and mb_wc */ +#define MY_CS_TOOSMALL3 -103 /* Need at least three bytes: wc_mb and mb_wc */ +/* These following three are currently not really used */ +#define MY_CS_TOOSMALL4 -104 /* Need at least 4 bytes: wc_mb and mb_wc */ +#define MY_CS_TOOSMALL5 -105 /* Need at least 5 bytes: wc_mb and mb_wc */ +#define MY_CS_TOOSMALL6 -106 /* Need at least 6 bytes: wc_mb and mb_wc */ +/* A helper macros for "need at least n bytes" */ +#define MY_CS_TOOSMALLN(n) (-100-(n)) + +#define MY_SEQ_INTTAIL 1 +#define MY_SEQ_SPACES 2 + + /* My charsets_list flags */ +#define MY_CS_COMPILED 1 /* compiled-in sets */ +#define MY_CS_CONFIG 2 /* sets that have a *.conf file */ +#define MY_CS_INDEX 4 /* sets listed in the Index file */ +#define MY_CS_LOADED 8 /* sets that are currently loaded */ +#define MY_CS_BINSORT 16 /* if binary sort order */ +#define MY_CS_PRIMARY 32 /* if primary collation */ +#define MY_CS_STRNXFRM 64 /* if strnxfrm is used for sort */ +#define MY_CS_UNICODE 128 /* is a charset is full unicode */ +#define MY_CS_READY 256 /* if a charset is initialized */ +#define MY_CS_AVAILABLE 512 /* If either compiled-in or loaded*/ +#define MY_CS_CSSORT 1024 /* if case sensitive sort order */ +#define MY_CS_HIDDEN 2048 /* don't display in SHOW */ +#define MY_CS_PUREASCII 4096 /* if a charset is pure ascii */ +#define MY_CS_NONASCII 8192 /* if not ASCII-compatible */ +#define MY_CHARSET_UNDEFINED 0 + +/* Character repertoire flags */ +#define MY_REPERTOIRE_ASCII 1 /* Pure ASCII U+0000..U+007F */ +#define MY_REPERTOIRE_EXTENDED 2 /* Extended characters: U+0080..U+FFFF */ +#define MY_REPERTOIRE_UNICODE30 3 /* ASCII | EXTENDED: U+0000..U+FFFF */ + +/* Flags for strxfrm */ +#define MY_STRXFRM_LEVEL1 0x00000001 /* for primary weights */ +#define MY_STRXFRM_LEVEL2 0x00000002 /* for secondary weights */ +#define MY_STRXFRM_LEVEL3 0x00000004 /* for tertiary weights */ +#define MY_STRXFRM_LEVEL4 0x00000008 /* fourth level weights */ +#define MY_STRXFRM_LEVEL5 0x00000010 /* fifth level weights */ +#define MY_STRXFRM_LEVEL6 0x00000020 /* sixth level weights */ +#define MY_STRXFRM_LEVEL_ALL 0x0000003F /* Bit OR for the above six */ +#define MY_STRXFRM_NLEVELS 6 /* Number of possible levels*/ + +#define MY_STRXFRM_PAD_WITH_SPACE 0x00000040 /* if pad result with spaces */ +#define MY_STRXFRM_PAD_TO_MAXLEN 0x00000080 /* if pad tail(for filesort) */ + +#define MY_STRXFRM_DESC_LEVEL1 0x00000100 /* if desc order for level1 */ +#define MY_STRXFRM_DESC_LEVEL2 0x00000200 /* if desc order for level2 */ +#define MY_STRXFRM_DESC_LEVEL3 0x00000300 /* if desc order for level3 */ +#define MY_STRXFRM_DESC_LEVEL4 0x00000800 /* if desc order for level4 */ +#define MY_STRXFRM_DESC_LEVEL5 0x00001000 /* if desc order for level5 */ +#define MY_STRXFRM_DESC_LEVEL6 0x00002000 /* if desc order for level6 */ +#define MY_STRXFRM_DESC_SHIFT 8 + +#define MY_STRXFRM_UNUSED_00004000 0x00004000 /* for future extensions */ +#define MY_STRXFRM_UNUSED_00008000 0x00008000 /* for future extensions */ + +#define MY_STRXFRM_REVERSE_LEVEL1 0x00010000 /* if reverse order for level1 */ +#define MY_STRXFRM_REVERSE_LEVEL2 0x00020000 /* if reverse order for level2 */ +#define MY_STRXFRM_REVERSE_LEVEL3 0x00040000 /* if reverse order for level3 */ +#define MY_STRXFRM_REVERSE_LEVEL4 0x00080000 /* if reverse order for level4 */ +#define MY_STRXFRM_REVERSE_LEVEL5 0x00100000 /* if reverse order for level5 */ +#define MY_STRXFRM_REVERSE_LEVEL6 0x00200000 /* if reverse order for level6 */ +#define MY_STRXFRM_REVERSE_SHIFT 16 + + +typedef struct my_uni_idx_st +{ + uint16 from; + uint16 to; + uchar *tab; +} MY_UNI_IDX; + +typedef struct +{ + uint beg; + uint end; + uint mb_len; +} my_match_t; + +enum my_lex_states +{ + MY_LEX_START, MY_LEX_CHAR, MY_LEX_IDENT, + MY_LEX_IDENT_SEP, MY_LEX_IDENT_START, + MY_LEX_REAL, MY_LEX_HEX_NUMBER, MY_LEX_BIN_NUMBER, + MY_LEX_CMP_OP, MY_LEX_LONG_CMP_OP, MY_LEX_STRING, MY_LEX_COMMENT, MY_LEX_END, + MY_LEX_OPERATOR_OR_IDENT, MY_LEX_NUMBER_IDENT, MY_LEX_INT_OR_REAL, + MY_LEX_REAL_OR_POINT, MY_LEX_BOOL, MY_LEX_EOL, MY_LEX_ESCAPE, + MY_LEX_LONG_COMMENT, MY_LEX_END_LONG_COMMENT, MY_LEX_SEMICOLON, + MY_LEX_SET_VAR, MY_LEX_USER_END, MY_LEX_HOSTNAME, MY_LEX_SKIP, + MY_LEX_USER_VARIABLE_DELIMITER, MY_LEX_SYSTEM_VAR, + MY_LEX_IDENT_OR_KEYWORD, + MY_LEX_IDENT_OR_HEX, MY_LEX_IDENT_OR_BIN, MY_LEX_IDENT_OR_NCHAR, + MY_LEX_STRING_OR_DELIMITER +}; + +struct charset_info_st; + + +/* See strings/CHARSET_INFO.txt for information about this structure */ +typedef struct my_collation_handler_st +{ + my_bool (*init)(struct charset_info_st *, void *(*alloc)(size_t)); + /* Collation routines */ + int (*strnncoll)(struct charset_info_st *, + const uchar *, size_t, const uchar *, size_t, my_bool); + int (*strnncollsp)(struct charset_info_st *, + const uchar *, size_t, const uchar *, size_t, + my_bool diff_if_only_endspace_difference); + size_t (*strnxfrm)(struct charset_info_st *, + uchar *dst, size_t dstlen, uint nweights, + const uchar *src, size_t srclen, uint flags); + size_t (*strnxfrmlen)(struct charset_info_st *, size_t); + my_bool (*like_range)(struct charset_info_st *, + const char *s, size_t s_length, + pchar w_prefix, pchar w_one, pchar w_many, + size_t res_length, + char *min_str, char *max_str, + size_t *min_len, size_t *max_len); + int (*wildcmp)(struct charset_info_st *, + const char *str,const char *str_end, + const char *wildstr,const char *wildend, + int escape,int w_one, int w_many); + + int (*strcasecmp)(struct charset_info_st *, const char *, const char *); + + uint (*instr)(struct charset_info_st *, + const char *b, size_t b_length, + const char *s, size_t s_length, + my_match_t *match, uint nmatch); + + /* Hash calculation */ + void (*hash_sort)(struct charset_info_st *cs, const uchar *key, size_t len, + ulong *nr1, ulong *nr2); + my_bool (*propagate)(struct charset_info_st *cs, const uchar *str, size_t len); +} MY_COLLATION_HANDLER; + +extern MY_COLLATION_HANDLER my_collation_mb_bin_handler; +extern MY_COLLATION_HANDLER my_collation_8bit_bin_handler; +extern MY_COLLATION_HANDLER my_collation_8bit_simple_ci_handler; +extern MY_COLLATION_HANDLER my_collation_ucs2_uca_handler; + +/* Some typedef to make it easy for C++ to make function pointers */ +typedef int (*my_charset_conv_mb_wc)(struct charset_info_st *, my_wc_t *, + const uchar *, const uchar *); +typedef int (*my_charset_conv_wc_mb)(struct charset_info_st *, my_wc_t, + uchar *, uchar *); +typedef size_t (*my_charset_conv_case)(struct charset_info_st *, + char *, size_t, char *, size_t); + + +/* See strings/CHARSET_INFO.txt about information on this structure */ +typedef struct my_charset_handler_st +{ + my_bool (*init)(struct charset_info_st *, void *(*alloc)(size_t)); + /* Multibyte routines */ + uint (*ismbchar)(struct charset_info_st *, const char *, const char *); + uint (*mbcharlen)(struct charset_info_st *, uint c); + size_t (*numchars)(struct charset_info_st *, const char *b, const char *e); + size_t (*charpos)(struct charset_info_st *, const char *b, const char *e, + size_t pos); + size_t (*well_formed_len)(struct charset_info_st *, + const char *b,const char *e, + size_t nchars, int *error); + size_t (*lengthsp)(struct charset_info_st *, const char *ptr, size_t length); + size_t (*numcells)(struct charset_info_st *, const char *b, const char *e); + + /* Unicode conversion */ + my_charset_conv_mb_wc mb_wc; + my_charset_conv_wc_mb wc_mb; + + /* CTYPE scanner */ + int (*ctype)(struct charset_info_st *cs, int *ctype, + const uchar *s, const uchar *e); + + /* Functions for case and sort conversion */ + size_t (*caseup_str)(struct charset_info_st *, char *); + size_t (*casedn_str)(struct charset_info_st *, char *); + + my_charset_conv_case caseup; + my_charset_conv_case casedn; + + /* Charset dependant snprintf() */ + size_t (*snprintf)(struct charset_info_st *, char *to, size_t n, + const char *fmt, + ...) ATTRIBUTE_FORMAT_FPTR(printf, 4, 5); + size_t (*long10_to_str)(struct charset_info_st *, char *to, size_t n, + int radix, long int val); + size_t (*longlong10_to_str)(struct charset_info_st *, char *to, size_t n, + int radix, longlong val); + + void (*fill)(struct charset_info_st *, char *to, size_t len, int fill); + + /* String-to-number conversion routines */ + long (*strntol)(struct charset_info_st *, const char *s, size_t l, + int base, char **e, int *err); + ulong (*strntoul)(struct charset_info_st *, const char *s, size_t l, + int base, char **e, int *err); + longlong (*strntoll)(struct charset_info_st *, const char *s, size_t l, + int base, char **e, int *err); + ulonglong (*strntoull)(struct charset_info_st *, const char *s, size_t l, + int base, char **e, int *err); + double (*strntod)(struct charset_info_st *, char *s, size_t l, char **e, + int *err); + longlong (*strtoll10)(struct charset_info_st *cs, + const char *nptr, char **endptr, int *error); + ulonglong (*strntoull10rnd)(struct charset_info_st *cs, + const char *str, size_t length, + int unsigned_fl, + char **endptr, int *error); + size_t (*scan)(struct charset_info_st *, const char *b, const char *e, + int sq); +} MY_CHARSET_HANDLER; + +extern MY_CHARSET_HANDLER my_charset_8bit_handler; +extern MY_CHARSET_HANDLER my_charset_ucs2_handler; + + +/* See strings/CHARSET_INFO.txt about information on this structure */ +typedef struct charset_info_st +{ + uint number; + uint primary_number; + uint binary_number; + uint state; + const char *csname; + const char *name; + const char *comment; + const char *tailoring; + uchar *ctype; + uchar *to_lower; + uchar *to_upper; + uchar *sort_order; + uint16 *contractions; + uint16 **sort_order_big; + uint16 *tab_to_uni; + MY_UNI_IDX *tab_from_uni; + MY_UNICASE_INFO **caseinfo; + uchar *state_map; + uchar *ident_map; + uint strxfrm_multiply; + uchar caseup_multiply; + uchar casedn_multiply; + uint mbminlen; + uint mbmaxlen; + uint16 min_sort_char; + uint16 max_sort_char; /* For LIKE optimization */ + uchar pad_char; + my_bool escape_with_backslash_is_dangerous; + uchar levels_for_compare; + uchar levels_for_order; + + MY_CHARSET_HANDLER *cset; + MY_COLLATION_HANDLER *coll; + +} CHARSET_INFO; +#define ILLEGAL_CHARSET_INFO_NUMBER (~0U) + + +extern MYSQL_PLUGIN_IMPORT CHARSET_INFO my_charset_bin; +extern CHARSET_INFO my_charset_big5_chinese_ci; +extern CHARSET_INFO my_charset_big5_bin; +extern CHARSET_INFO my_charset_cp932_japanese_ci; +extern CHARSET_INFO my_charset_cp932_bin; +extern CHARSET_INFO my_charset_cp1250_czech_ci; +extern CHARSET_INFO my_charset_eucjpms_japanese_ci; +extern CHARSET_INFO my_charset_eucjpms_bin; +extern CHARSET_INFO my_charset_euckr_korean_ci; +extern CHARSET_INFO my_charset_euckr_bin; +extern MYSQL_PLUGIN_IMPORT CHARSET_INFO my_charset_filename; +extern CHARSET_INFO my_charset_gb2312_chinese_ci; +extern CHARSET_INFO my_charset_gb2312_bin; +extern CHARSET_INFO my_charset_gbk_chinese_ci; +extern CHARSET_INFO my_charset_gbk_bin; +extern MYSQL_PLUGIN_IMPORT CHARSET_INFO my_charset_latin1; +extern CHARSET_INFO my_charset_latin1_german2_ci; +extern CHARSET_INFO my_charset_latin1_bin; +extern CHARSET_INFO my_charset_latin2_czech_ci; +extern CHARSET_INFO my_charset_sjis_japanese_ci; +extern CHARSET_INFO my_charset_sjis_bin; +extern CHARSET_INFO my_charset_tis620_thai_ci; +extern CHARSET_INFO my_charset_tis620_bin; +extern CHARSET_INFO my_charset_ucs2_general_ci; +extern CHARSET_INFO my_charset_ucs2_bin; +extern CHARSET_INFO my_charset_ucs2_unicode_ci; +extern CHARSET_INFO my_charset_ujis_japanese_ci; +extern CHARSET_INFO my_charset_ujis_bin; +extern CHARSET_INFO my_charset_utf16_bin; +extern CHARSET_INFO my_charset_utf16_general_ci; +extern CHARSET_INFO my_charset_utf16_unicode_ci; +extern CHARSET_INFO my_charset_utf32_bin; +extern CHARSET_INFO my_charset_utf32_general_ci; +extern CHARSET_INFO my_charset_utf32_unicode_ci; +extern CHARSET_INFO my_charset_utf8mb3_bin; +extern CHARSET_INFO my_charset_utf8mb3_general_ci; +extern CHARSET_INFO my_charset_utf8mb3_unicode_ci; +extern CHARSET_INFO my_charset_utf8mb4_bin; +extern MYSQL_PLUGIN_IMPORT CHARSET_INFO my_charset_utf8mb4_general_ci; +extern CHARSET_INFO my_charset_utf8mb4_unicode_ci; + +#define MY_UTF8MB3 "utf8mb3" +#define MY_UTF8MB4 "utf8" +#define my_charset_utf8_general_ci my_charset_utf8mb4_general_ci +#define my_charset_utf8_bin my_charset_utf8mb4_bin + + +/* declarations for simple charsets */ +extern size_t my_strnxfrm_simple(CHARSET_INFO *, + uchar *dst, size_t dstlen, uint nweights, + const uchar *src, size_t srclen, uint flags); +size_t my_strnxfrmlen_simple(CHARSET_INFO *, size_t); +extern int my_strnncoll_simple(CHARSET_INFO *, const uchar *, size_t, + const uchar *, size_t, my_bool); + +extern int my_strnncollsp_simple(CHARSET_INFO *, const uchar *, size_t, + const uchar *, size_t, + my_bool diff_if_only_endspace_difference); + +extern void my_hash_sort_simple(CHARSET_INFO *cs, + const uchar *key, size_t len, + ulong *nr1, ulong *nr2); + +extern size_t my_lengthsp_8bit(CHARSET_INFO *cs, const char *ptr, size_t length); + +extern uint my_instr_simple(struct charset_info_st *, + const char *b, size_t b_length, + const char *s, size_t s_length, + my_match_t *match, uint nmatch); + + +/* Functions for 8bit */ +extern size_t my_caseup_str_8bit(CHARSET_INFO *, char *); +extern size_t my_casedn_str_8bit(CHARSET_INFO *, char *); +extern size_t my_caseup_8bit(CHARSET_INFO *, char *src, size_t srclen, + char *dst, size_t dstlen); +extern size_t my_casedn_8bit(CHARSET_INFO *, char *src, size_t srclen, + char *dst, size_t dstlen); + +extern int my_strcasecmp_8bit(CHARSET_INFO * cs, const char *, const char *); + +int my_mb_wc_8bit(CHARSET_INFO *cs,my_wc_t *wc, const uchar *s,const uchar *e); +int my_wc_mb_8bit(CHARSET_INFO *cs,my_wc_t wc, uchar *s, uchar *e); + +int my_mb_ctype_8bit(CHARSET_INFO *,int *, const uchar *,const uchar *); +int my_mb_ctype_mb(CHARSET_INFO *,int *, const uchar *,const uchar *); + +size_t my_scan_8bit(CHARSET_INFO *cs, const char *b, const char *e, int sq); + +size_t my_snprintf_8bit(struct charset_info_st *, char *to, size_t n, + const char *fmt, ...) + ATTRIBUTE_FORMAT(printf, 4, 5); + +long my_strntol_8bit(CHARSET_INFO *, const char *s, size_t l, int base, + char **e, int *err); +ulong my_strntoul_8bit(CHARSET_INFO *, const char *s, size_t l, int base, + char **e, int *err); +longlong my_strntoll_8bit(CHARSET_INFO *, const char *s, size_t l, int base, + char **e, int *err); +ulonglong my_strntoull_8bit(CHARSET_INFO *, const char *s, size_t l, int base, + char **e, int *err); +double my_strntod_8bit(CHARSET_INFO *, char *s, size_t l,char **e, + int *err); +size_t my_long10_to_str_8bit(CHARSET_INFO *, char *to, size_t l, int radix, + long int val); +size_t my_longlong10_to_str_8bit(CHARSET_INFO *, char *to, size_t l, int radix, + longlong val); + +longlong my_strtoll10_8bit(CHARSET_INFO *cs, + const char *nptr, char **endptr, int *error); +longlong my_strtoll10_ucs2(CHARSET_INFO *cs, + const char *nptr, char **endptr, int *error); + +ulonglong my_strntoull10rnd_8bit(CHARSET_INFO *cs, + const char *str, size_t length, int + unsigned_fl, char **endptr, int *error); +ulonglong my_strntoull10rnd_ucs2(CHARSET_INFO *cs, + const char *str, size_t length, + int unsigned_fl, char **endptr, int *error); + +void my_fill_8bit(CHARSET_INFO *cs, char* to, size_t l, int fill); + +my_bool my_like_range_simple(CHARSET_INFO *cs, + const char *ptr, size_t ptr_length, + pbool escape, pbool w_one, pbool w_many, + size_t res_length, + char *min_str, char *max_str, + size_t *min_length, size_t *max_length); + +my_bool my_like_range_mb(CHARSET_INFO *cs, + const char *ptr, size_t ptr_length, + pbool escape, pbool w_one, pbool w_many, + size_t res_length, + char *min_str, char *max_str, + size_t *min_length, size_t *max_length); + +my_bool my_like_range_ucs2(CHARSET_INFO *cs, + const char *ptr, size_t ptr_length, + pbool escape, pbool w_one, pbool w_many, + size_t res_length, + char *min_str, char *max_str, + size_t *min_length, size_t *max_length); + +my_bool my_like_range_utf16(CHARSET_INFO *cs, + const char *ptr, size_t ptr_length, + pbool escape, pbool w_one, pbool w_many, + size_t res_length, + char *min_str, char *max_str, + size_t *min_length, size_t *max_length); + +my_bool my_like_range_utf32(CHARSET_INFO *cs, + const char *ptr, size_t ptr_length, + pbool escape, pbool w_one, pbool w_many, + size_t res_length, + char *min_str, char *max_str, + size_t *min_length, size_t *max_length); + + +int my_wildcmp_8bit(CHARSET_INFO *, + const char *str,const char *str_end, + const char *wildstr,const char *wildend, + int escape, int w_one, int w_many); + +int my_wildcmp_bin(CHARSET_INFO *, + const char *str,const char *str_end, + const char *wildstr,const char *wildend, + int escape, int w_one, int w_many); + +size_t my_numchars_8bit(CHARSET_INFO *, const char *b, const char *e); +size_t my_numcells_8bit(CHARSET_INFO *, const char *b, const char *e); +size_t my_charpos_8bit(CHARSET_INFO *, const char *b, const char *e, size_t pos); +size_t my_well_formed_len_8bit(CHARSET_INFO *, const char *b, const char *e, + size_t pos, int *error); +uint my_mbcharlen_8bit(CHARSET_INFO *, uint c); + + +/* Functions for multibyte charsets */ +extern size_t my_caseup_str_mb(CHARSET_INFO *, char *); +extern size_t my_casedn_str_mb(CHARSET_INFO *, char *); +extern size_t my_caseup_mb(CHARSET_INFO *, char *src, size_t srclen, + char *dst, size_t dstlen); +extern size_t my_casedn_mb(CHARSET_INFO *, char *src, size_t srclen, + char *dst, size_t dstlen); +extern int my_strcasecmp_mb(CHARSET_INFO * cs,const char *, const char *); + +int my_wildcmp_mb(CHARSET_INFO *, + const char *str,const char *str_end, + const char *wildstr,const char *wildend, + int escape, int w_one, int w_many); +size_t my_numchars_mb(CHARSET_INFO *, const char *b, const char *e); +size_t my_numcells_mb(CHARSET_INFO *, const char *b, const char *e); +size_t my_charpos_mb(CHARSET_INFO *, const char *b, const char *e, size_t pos); +size_t my_well_formed_len_mb(CHARSET_INFO *, const char *b, const char *e, + size_t pos, int *error); +uint my_instr_mb(struct charset_info_st *, + const char *b, size_t b_length, + const char *s, size_t s_length, + my_match_t *match, uint nmatch); + +int my_strnncoll_mb_bin(CHARSET_INFO * cs, + const uchar *s, size_t slen, + const uchar *t, size_t tlen, + my_bool t_is_prefix); + +int my_strnncollsp_mb_bin(CHARSET_INFO *cs, + const uchar *a, size_t a_length, + const uchar *b, size_t b_length, + my_bool diff_if_only_endspace_difference); + +int my_wildcmp_mb_bin(CHARSET_INFO *cs, + const char *str,const char *str_end, + const char *wildstr,const char *wildend, + int escape, int w_one, int w_many); + +int my_strcasecmp_mb_bin(CHARSET_INFO * cs __attribute__((unused)), + const char *s, const char *t); + +void my_hash_sort_mb_bin(CHARSET_INFO *cs __attribute__((unused)), + const uchar *key, size_t len,ulong *nr1, ulong *nr2); + +size_t my_strnxfrm_mb(CHARSET_INFO *, + uchar *dst, size_t dstlen, uint nweights, + const uchar *src, size_t srclen, uint flags); + +size_t my_strnxfrm_unicode(CHARSET_INFO *, + uchar *dst, size_t dstlen, uint nweights, + const uchar *src, size_t srclen, uint flags); + +int my_wildcmp_unicode(CHARSET_INFO *cs, + const char *str, const char *str_end, + const char *wildstr, const char *wildend, + int escape, int w_one, int w_many, + MY_UNICASE_INFO **weights); + +extern my_bool my_parse_charset_xml(const char *bug, size_t len, + int (*add)(CHARSET_INFO *cs)); +extern char *my_strchr(CHARSET_INFO *cs, const char *str, const char *end, + pchar c); + +my_bool my_propagate_simple(CHARSET_INFO *cs, const uchar *str, size_t len); +my_bool my_propagate_complex(CHARSET_INFO *cs, const uchar *str, size_t len); + + +uint my_string_repertoire(CHARSET_INFO *cs, const char *str, ulong len); +my_bool my_charset_is_ascii_based(CHARSET_INFO *cs); +my_bool my_charset_is_8bit_pure_ascii(CHARSET_INFO *cs); +uint my_charset_repertoire(CHARSET_INFO *cs); + + +uint my_strxfrm_flag_normalize(uint flags, uint nlevels); +void my_strxfrm_desc_and_reverse(uchar *str, uchar *strend, + uint flags, uint level); +size_t my_strxfrm_pad_desc_and_reverse(CHARSET_INFO *cs, + uchar *str, uchar *frmend, uchar *strend, + uint nweights, uint flags, uint level); + +my_bool my_charset_is_ascii_compatible(CHARSET_INFO *cs); + +#define _MY_U 01 /* Upper case */ +#define _MY_L 02 /* Lower case */ +#define _MY_NMR 04 /* Numeral (digit) */ +#define _MY_SPC 010 /* Spacing character */ +#define _MY_PNT 020 /* Punctuation */ +#define _MY_CTR 040 /* Control character */ +#define _MY_B 0100 /* Blank */ +#define _MY_X 0200 /* heXadecimal digit */ + + +#define my_isascii(c) (!((c) & ~0177)) +#define my_toascii(c) ((c) & 0177) +#define my_tocntrl(c) ((c) & 31) +#define my_toprint(c) ((c) | 64) +#define my_toupper(s,c) (char) ((s)->to_upper[(uchar) (c)]) +#define my_tolower(s,c) (char) ((s)->to_lower[(uchar) (c)]) +#define my_isalpha(s, c) (((s)->ctype+1)[(uchar) (c)] & (_MY_U | _MY_L)) +#define my_isupper(s, c) (((s)->ctype+1)[(uchar) (c)] & _MY_U) +#define my_islower(s, c) (((s)->ctype+1)[(uchar) (c)] & _MY_L) +#define my_isdigit(s, c) (((s)->ctype+1)[(uchar) (c)] & _MY_NMR) +#define my_isxdigit(s, c) (((s)->ctype+1)[(uchar) (c)] & _MY_X) +#define my_isalnum(s, c) (((s)->ctype+1)[(uchar) (c)] & (_MY_U | _MY_L | _MY_NMR)) +#define my_isspace(s, c) (((s)->ctype+1)[(uchar) (c)] & _MY_SPC) +#define my_ispunct(s, c) (((s)->ctype+1)[(uchar) (c)] & _MY_PNT) +#define my_isprint(s, c) (((s)->ctype+1)[(uchar) (c)] & (_MY_PNT | _MY_U | _MY_L | _MY_NMR | _MY_B)) +#define my_isgraph(s, c) (((s)->ctype+1)[(uchar) (c)] & (_MY_PNT | _MY_U | _MY_L | _MY_NMR)) +#define my_iscntrl(s, c) (((s)->ctype+1)[(uchar) (c)] & _MY_CTR) + +/* Some macros that should be cleaned up a little */ +#define my_isvar(s,c) (my_isalnum(s,c) || (c) == '_') +#define my_isvar_start(s,c) (my_isalpha(s,c) || (c) == '_') + +#define my_binary_compare(s) ((s)->state & MY_CS_BINSORT) +#define use_strnxfrm(s) ((s)->state & MY_CS_STRNXFRM) +#define my_strnxfrm(cs, d, dl, s, sl) \ + ((cs)->coll->strnxfrm((cs), (d), (dl), (dl), (s), (sl), MY_STRXFRM_PAD_WITH_SPACE)) +#define my_strnncoll(s, a, b, c, d) ((s)->coll->strnncoll((s), (a), (b), (c), (d), 0)) +#define my_like_range(s, a, b, c, d, e, f, g, h, i, j) \ + ((s)->coll->like_range((s), (a), (b), (c), (d), (e), (f), (g), (h), (i), (j))) +#define my_wildcmp(cs,s,se,w,we,e,o,m) ((cs)->coll->wildcmp((cs),(s),(se),(w),(we),(e),(o),(m))) +#define my_strcasecmp(s, a, b) ((s)->coll->strcasecmp((s), (a), (b))) +#define my_charpos(cs, b, e, num) (cs)->cset->charpos((cs), (const char*) (b), (const char *)(e), (num)) + + +#define use_mb(s) ((s)->cset->ismbchar != NULL) +#define my_ismbchar(s, a, b) ((s)->cset->ismbchar((s), (a), (b))) +#ifdef USE_MB +#define my_mbcharlen(s, a) ((s)->cset->mbcharlen((s),(a))) +#else +#define my_mbcharlen(s, a) 1 +#endif + +#define my_caseup_str(s, a) ((s)->cset->caseup_str((s), (a))) +#define my_casedn_str(s, a) ((s)->cset->casedn_str((s), (a))) +#define my_strntol(s, a, b, c, d, e) ((s)->cset->strntol((s),(a),(b),(c),(d),(e))) +#define my_strntoul(s, a, b, c, d, e) ((s)->cset->strntoul((s),(a),(b),(c),(d),(e))) +#define my_strntoll(s, a, b, c, d, e) ((s)->cset->strntoll((s),(a),(b),(c),(d),(e))) +#define my_strntoull(s, a, b, c,d, e) ((s)->cset->strntoull((s),(a),(b),(c),(d),(e))) +#define my_strntod(s, a, b, c, d) ((s)->cset->strntod((s),(a),(b),(c),(d))) + + +/* XXX: still need to take care of this one */ +#ifdef MY_CHARSET_TIS620 +#error The TIS620 charset is broken at the moment. Tell tim to fix it. +#define USE_TIS620 +#include "t_ctype.h" +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* _m_ctype_h */ diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/m_string.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/m_string.h new file mode 100644 index 0000000..bb8bad4 --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/m_string.h @@ -0,0 +1,393 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* There may be prolems include all of theese. Try to test in + configure with ones are needed? */ + +/* This is needed for the definitions of strchr... on solaris */ + +#ifndef _m_string_h +#define _m_string_h +#ifndef __USE_GNU +#define __USE_GNU /* We want to use stpcpy */ +#endif +#if defined(HAVE_STRINGS_H) +#include +#endif +#if defined(HAVE_STRING_H) +#include +#endif + +/* need by my_vsnprintf */ +#include + +#ifdef _AIX +#undef HAVE_BCMP +#endif + +/* This is needed for the definitions of bzero... on solaris */ +#if defined(HAVE_STRINGS_H) +#include +#endif + +/* This is needed for the definitions of memcpy... on solaris */ +#if defined(HAVE_MEMORY_H) && !defined(__cplusplus) +#include +#endif + +#if !defined(HAVE_MEMCPY) && !defined(HAVE_MEMMOVE) +# define memcpy(d, s, n) bcopy ((s), (d), (n)) +# define memset(A,C,B) bfill((A),(B),(C)) +# define memmove(d, s, n) bmove ((d), (s), (n)) +#elif defined(HAVE_MEMMOVE) +# define bmove(d, s, n) memmove((d), (s), (n)) +#else +# define memmove(d, s, n) bmove((d), (s), (n)) /* our bmove */ +#endif + +/* Unixware 7 */ +#if !defined(HAVE_BFILL) +# define bfill(A,B,C) memset((A),(C),(B)) +# define bmove_align(A,B,C) memcpy((A),(B),(C)) +#endif + +#if !defined(HAVE_BCMP) +# define bcopy(s, d, n) memcpy((d), (s), (n)) +# define bcmp(A,B,C) memcmp((A),(B),(C)) +# define bzero(A,B) memset((A),0,(B)) +# define bmove_align(A,B,C) memcpy((A),(B),(C)) +#endif + +#if defined(__cplusplus) +extern "C" { +#endif + +/* + my_str_malloc() and my_str_free() are assigned to implementations in + strings/alloc.c, but can be overridden in the calling program. + */ +extern void *(*my_str_malloc)(size_t); +extern void (*my_str_free)(void *); + +#if defined(HAVE_STPCPY) +#define strmov(A,B) stpcpy((A),(B)) +#ifndef stpcpy +extern char *stpcpy(char *, const char *); /* For AIX with gcc 2.95.3 */ +#endif +#endif + +/* Declared in int2str() */ +extern char NEAR _dig_vec_upper[]; +extern char NEAR _dig_vec_lower[]; + +#ifdef BAD_STRING_COMPILER +#define strmov(A,B) (memccpy(A,B,0,INT_MAX)-1) +#else +#define strmov_overlapp(A,B) strmov(A,B) +#define strmake_overlapp(A,B,C) strmake(A,B,C) +#endif + +#ifdef BAD_MEMCPY /* Problem with gcc on Alpha */ +#define memcpy_fixed(A,B,C) bmove((A),(B),(C)) +#else +#define memcpy_fixed(A,B,C) memcpy((A),(B),(C)) +#endif + +#if (!defined(USE_BMOVE512) || defined(HAVE_purify)) && !defined(bmove512) +#define bmove512(A,B,C) memcpy(A,B,C) +#endif + + /* Prototypes for string functions */ + +#if !defined(bfill) && !defined(HAVE_BFILL) +extern void bfill(uchar *dst,size_t len,pchar fill); +#endif + +#if !defined(bzero) && !defined(HAVE_BZERO) +extern void bzero(uchar * dst,size_t len); +#endif + +#if !defined(bcmp) && !defined(HAVE_BCMP) +extern size_t bcmp(const uchar *s1,const uchar *s2,size_t len); +#endif +#ifdef HAVE_purify +extern size_t my_bcmp(const uchar *s1,const uchar *s2,size_t len); +#undef bcmp +#define bcmp(A,B,C) my_bcmp((A),(B),(C)) +#define bzero_if_purify(A,B) bzero(A,B) +#else +#define bzero_if_purify(A,B) +#endif /* HAVE_purify */ + +#if defined(_lint) || defined(FORCE_INIT_OF_VARS) +#define LINT_INIT_STRUCT(var) bzero(&var, sizeof(var)) /* No uninitialize-warning */ +#else +#define LINT_INIT_STRUCT(var) +#endif + +#ifndef bmove512 +extern void bmove512(uchar *dst,const uchar *src,size_t len); +#endif + +#if !defined(HAVE_BMOVE) && !defined(bmove) +extern void bmove(uuchar *dst, const uchar *src,size_t len); +#endif + +extern void bmove_upp(uchar *dst,const uchar *src,size_t len); +extern void bchange(uchar *dst,size_t old_len,const uchar *src, + size_t new_len,size_t tot_len); +extern void strappend(char *s,size_t len,pchar fill); +extern char *strend(const char *s); +extern char *strcend(const char *, pchar); +extern char *strfield(char *src,int fields,int chars,int blanks, + int tabch); +extern char *strfill(char * s,size_t len,pchar fill); +extern size_t strinstr(const char *str,const char *search); +extern size_t r_strinstr(const char *str, size_t from, const char *search); +extern char *strkey(char *dst,char *head,char *tail,char *flags); +extern char *strmake(char *dst,const char *src,size_t length); +#ifndef strmake_overlapp +extern char *strmake_overlapp(char *dst,const char *src, size_t length); +#endif + +#ifndef strmov +extern char *strmov(char *dst,const char *src); +#endif +extern char *strnmov(char *dst,const char *src,size_t n); +extern char *strsuff(const char *src,const char *suffix); +extern char *strcont(const char *src,const char *set); +extern char *strxcat _VARARGS((char *dst,const char *src, ...)); +extern char *strxmov _VARARGS((char *dst,const char *src, ...)); +extern char *strxcpy _VARARGS((char *dst,const char *src, ...)); +extern char *strxncat _VARARGS((char *dst,size_t len, const char *src, ...)); +extern char *strxnmov _VARARGS((char *dst,size_t len, const char *src, ...)); +extern char *strxncpy _VARARGS((char *dst,size_t len, const char *src, ...)); + +/* Prototypes of normal stringfunctions (with may ours) */ + +#ifdef WANT_STRING_PROTOTYPES +extern char *strcat(char *, const char *); +extern char *strchr(const char *, pchar); +extern char *strrchr(const char *, pchar); +extern char *strcpy(char *, const char *); +extern int strcmp(const char *, const char *); +#ifndef __GNUC__ +extern size_t strlen(const char *); +#endif +#endif +#ifndef HAVE_STRNLEN +extern size_t strnlen(const char *s, size_t n); +#endif + +#if !defined(__cplusplus) +#ifndef HAVE_STRPBRK +extern char *strpbrk(const char *, const char *); +#endif +#ifndef HAVE_STRSTR +extern char *strstr(const char *, const char *); +#endif +#endif +extern int is_prefix(const char *, const char *); + +/* Conversion routines */ +typedef enum { + MY_GCVT_ARG_FLOAT, + MY_GCVT_ARG_DOUBLE +} my_gcvt_arg_type; + +double my_strtod(const char *str, char **end, int *error); +double my_atof(const char *nptr); +size_t my_fcvt(double x, int precision, char *to, my_bool *error); +size_t my_gcvt(double x, my_gcvt_arg_type type, int width, char *to, + my_bool *error); + +#define NOT_FIXED_DEC 31 + +/* + The longest string my_fcvt can return is 311 + "precision" bytes. + Here we assume that we never cal my_fcvt() with precision >= NOT_FIXED_DEC + (+ 1 byte for the terminating '\0'). +*/ +#define FLOATING_POINT_BUFFER (311 + NOT_FIXED_DEC) + +/* + We want to use the 'e' format in some cases even if we have enough space + for the 'f' one just to mimic sprintf("%.15g") behavior for large integers, + and to improve it for numbers < 10^(-4). + That is, for |x| < 1 we require |x| >= 10^(-15), and for |x| > 1 we require + it to be integer and be <= 10^DBL_DIG for the 'f' format to be used. + We don't lose precision, but make cases like "1e200" or "0.00001" look nicer. +*/ +#define MAX_DECPT_FOR_F_FORMAT DBL_DIG + +/* + The maximum possible field width for my_gcvt() conversion. + (DBL_DIG + 2) significant digits + sign + "." + ("e-NNN" or + MAX_DECPT_FOR_F_FORMAT zeros for cases when |x|<1 and the 'f' format is used). +*/ +#define MY_GCVT_MAX_FIELD_WIDTH (DBL_DIG + 4 + max(5, MAX_DECPT_FOR_F_FORMAT)) + + +extern char *llstr(longlong value,char *buff); +extern char *ullstr(longlong value,char *buff); +#ifndef HAVE_STRTOUL +extern long strtol(const char *str, char **ptr, int base); +extern ulong strtoul(const char *str, char **ptr, int base); +#endif + +extern char *int2str(long val, char *dst, int radix, int upcase); +extern char *int10_to_str(long val,char *dst,int radix); +extern char *str2int(const char *src,int radix,long lower,long upper, + long *val); +longlong my_strtoll10(const char *nptr, char **endptr, int *error); +#if SIZEOF_LONG == SIZEOF_LONG_LONG +#define ll2str(A,B,C,D) int2str((A),(B),(C),(D)) +#define longlong2str(A,B,C) int2str((A),(B),(C),1) +#define longlong10_to_str(A,B,C) int10_to_str((A),(B),(C)) +#undef strtoll +#define strtoll(A,B,C) strtol((A),(B),(C)) +#define strtoull(A,B,C) strtoul((A),(B),(C)) +#ifndef HAVE_STRTOULL +#define HAVE_STRTOULL +#endif +#ifndef HAVE_STRTOLL +#define HAVE_STRTOLL +#endif +#else +#ifdef HAVE_LONG_LONG +extern char *ll2str(longlong val,char *dst,int radix, int upcase); +#define longlong2str(A,B,C) ll2str((A),(B),(C),1) +extern char *longlong10_to_str(longlong val,char *dst,int radix); +#if (!defined(HAVE_STRTOULL) || defined(NO_STRTOLL_PROTO)) +extern longlong strtoll(const char *str, char **ptr, int base); +extern ulonglong strtoull(const char *str, char **ptr, int base); +#endif +#endif +#endif + +/* my_vsnprintf.c */ + +extern size_t my_vsnprintf(char *str, size_t n, + const char *format, va_list ap); +extern size_t my_snprintf(char *to, size_t n, const char *fmt, ...) + ATTRIBUTE_FORMAT(printf, 3, 4); + +#if defined(__cplusplus) +} +#endif + +/* + LEX_STRING -- a pair of a C-string and its length. + (it's part of the plugin API as a MYSQL_LEX_STRING) +*/ + +typedef struct st_mysql_lex_string LEX_STRING; + +#define STRING_WITH_LEN(X) (X), ((size_t) (sizeof(X) - 1)) +#define USTRING_WITH_LEN(X) ((uchar*) X), ((size_t) (sizeof(X) - 1)) +#define C_STRING_WITH_LEN(X) ((char *) (X)), ((size_t) (sizeof(X) - 1)) + +/* A variant with const */ +struct st_mysql_const_lex_string +{ + const char *str; + size_t length; +}; +typedef struct st_mysql_const_lex_string LEX_CSTRING; + +/* A variant with const and unsigned */ +struct st_mysql_const_unsigned_lex_string +{ + const uchar *str; + size_t length; +}; +typedef struct st_mysql_const_unsigned_lex_string LEX_CUSTRING; + +/* SPACE_INT is a word that contains only spaces */ +#if SIZEOF_INT == 4 +#define SPACE_INT 0x20202020 +#elif SIZEOF_INT == 8 +#define SPACE_INT 0x2020202020202020 +#else +#error define the appropriate constant for a word full of spaces +#endif + +/** + Skip trailing space. + + On most systems reading memory in larger chunks (ideally equal to the size of + the chinks that the machine physically reads from memory) causes fewer memory + access loops and hence increased performance. + This is why the 'int' type is used : it's closest to that (according to how + it's defined in C). + So when we determine the amount of whitespace at the end of a string we do + the following : + 1. We divide the string into 3 zones : + a) from the start of the string (__start) to the first multiple + of sizeof(int) (__start_words) + b) from the end of the string (__end) to the last multiple of sizeof(int) + (__end_words) + c) a zone that is aligned to sizeof(int) and can be safely accessed + through an int * + 2. We start comparing backwards from (c) char-by-char. If all we find is + space then we continue + 3. If there are elements in zone (b) we compare them as unsigned ints to a + int mask (SPACE_INT) consisting of all spaces + 4. Finally we compare the remaining part (a) of the string char by char. + This covers for the last non-space unsigned int from 3. (if any) + + This algorithm works well for relatively larger strings, but it will slow + the things down for smaller strings (because of the additional calculations + and checks compared to the naive method). Thus the barrier of length 20 + is added. + + @param ptr pointer to the input string + @param len the length of the string + @return the last non-space character +*/ + +static inline const uchar *skip_trailing_space(const uchar *ptr,size_t len) +{ + const uchar *end= ptr + len; + + if (len > 20) + { + const uchar *end_words= (const uchar *)(intptr) + (((ulonglong)(intptr)end) / SIZEOF_INT * SIZEOF_INT); + const uchar *start_words= (const uchar *)(intptr) + ((((ulonglong)(intptr)ptr) + SIZEOF_INT - 1) / SIZEOF_INT * SIZEOF_INT); + + DBUG_ASSERT(((ulonglong)(intptr)ptr) >= SIZEOF_INT); + if (end_words > ptr) + { + while (end > end_words && end[-1] == 0x20) + end--; + if (end[-1] == 0x20 && start_words < end_words) + while (end > start_words && ((unsigned *)end)[-1] == SPACE_INT) + end -= SIZEOF_INT; + } + } + while (end > ptr && end[-1] == 0x20) + end--; + return (end); +} + +#ifdef SAFEMALLOC +#define TRASH(A,B) bfill(A, B, 0x8F) +#else +#define TRASH(A,B) /* nothing */ +#endif /* SAFEMALLOC */ + +#endif /* _m_string_h */ diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_aes.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_aes.h new file mode 100644 index 0000000..8ea128c --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_aes.h @@ -0,0 +1,65 @@ +/* Copyright (C) 2002 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + + +/* Header file for my_aes.c */ +/* Wrapper to give simple interface for MySQL to AES standard encryption */ + +#include "mysys/rijndael.h" + +C_MODE_START + +#define AES_KEY_LENGTH 128 /* Must be 128 192 or 256 */ + +/* + my_aes_encrypt - Crypt buffer with AES encryption algorithm. + source - Pointer to data for encryption + source_length - size of encryption data + dest - buffer to place encrypted data (must be large enough) + key - Key to be used for encryption + kel_length - Length of the key. Will handle keys of any length + + returns - size of encrypted data, or negative in case of error. +*/ + +int my_aes_encrypt(const char *source, int source_length, char *dest, + const char *key, int key_length); + +/* + my_aes_decrypt - DeCrypt buffer with AES encryption algorithm. + source - Pointer to data for decryption + source_length - size of encrypted data + dest - buffer to place decrypted data (must be large enough) + key - Key to be used for decryption + kel_length - Length of the key. Will handle keys of any length + + returns - size of original data, or negative in case of error. +*/ + + +int my_aes_decrypt(const char *source, int source_length, char *dest, + const char *key, int key_length); + +/* + my_aes_get_size - get size of buffer which will be large enough for encrypted + data + source_length - length of data to be encrypted + + returns - size of buffer required to store encrypted data +*/ + +int my_aes_get_size(int source_length); + +C_MODE_END diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_alarm.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_alarm.h new file mode 100644 index 0000000..dd2d564 --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_alarm.h @@ -0,0 +1,58 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* + File to include when we want to use alarm or a loop_counter to display + some information when a program is running +*/ +#ifndef _my_alarm_h +#define _my_alarm_h +#ifdef __cplusplus +extern "C" { +#endif + +extern int volatile my_have_got_alarm; +extern ulong my_time_to_wait_for_lock; + +#if defined(HAVE_ALARM) && !defined(NO_ALARM_LOOP) +#include +#define ALARM_VARIABLES uint alarm_old=0; \ + sig_return alarm_signal=0 +#define ALARM_INIT my_have_got_alarm=0 ; \ + alarm_old=(uint) alarm(MY_HOW_OFTEN_TO_ALARM); \ + alarm_signal=signal(SIGALRM,my_set_alarm_variable); +#define ALARM_END (void) signal(SIGALRM,alarm_signal); \ + (void) alarm(alarm_old); +#define ALARM_TEST my_have_got_alarm +#ifdef DONT_REMEMBER_SIGNAL +#define ALARM_REINIT (void) alarm(MY_HOW_OFTEN_TO_ALARM); \ + (void) signal(SIGALRM,my_set_alarm_variable);\ + my_have_got_alarm=0; +#else +#define ALARM_REINIT (void) alarm((uint) MY_HOW_OFTEN_TO_ALARM); \ + my_have_got_alarm=0; +#endif /* DONT_REMEMBER_SIGNAL */ +#else +#define ALARM_VARIABLES long alarm_pos=0,alarm_end_pos=MY_HOW_OFTEN_TO_WRITE-1 +#define ALARM_INIT +#define ALARM_END +#define ALARM_TEST (alarm_pos++ >= alarm_end_pos) +#define ALARM_REINIT alarm_end_pos+=MY_HOW_OFTEN_TO_WRITE +#endif /* HAVE_ALARM */ + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_alloc.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_alloc.h new file mode 100644 index 0000000..6ade4d0 --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_alloc.h @@ -0,0 +1,51 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* + Data structures for mysys/my_alloc.c (root memory allocator) +*/ + +#ifndef _my_alloc_h +#define _my_alloc_h + +#define ALLOC_MAX_BLOCK_TO_DROP 4096 +#define ALLOC_MAX_BLOCK_USAGE_BEFORE_DROP 10 + +typedef struct st_used_mem +{ /* struct for once_alloc (block) */ + struct st_used_mem *next; /* Next block in use */ + size_t left; /* memory left in block */ + size_t size; /* size of block */ +} USED_MEM; + + +typedef struct st_mem_root +{ + USED_MEM *free; /* blocks with free memory in it */ + USED_MEM *used; /* blocks almost without free memory */ + USED_MEM *pre_alloc; /* preallocated block */ + /* if block have less memory it will be put in 'used' list */ + size_t min_malloc; + size_t block_size; /* initial block size */ + unsigned int block_num; /* allocated blocks counter */ + /* + first free block in queue test counter (if it exceed + MAX_BLOCK_USAGE_BEFORE_DROP block will be dropped in 'used' list) + */ + unsigned int first_block_usage; + + void (*error_handler)(void); +} MEM_ROOT; +#endif diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_atomic.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_atomic.h new file mode 100644 index 0000000..40b8895 --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_atomic.h @@ -0,0 +1,254 @@ +/* Copyright (C) 2006 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* + This header defines five atomic operations: + + my_atomic_add#(&var, what) + add 'what' to *var, and return the old value of *var + + my_atomic_fas#(&var, what) + 'Fetch And Store' + store 'what' in *var, and return the old value of *var + + my_atomic_cas#(&var, &old, new) + 'Compare And Swap' + if *var is equal to *old, then store 'new' in *var, and return TRUE + otherwise store *var in *old, and return FALSE + + my_atomic_load#(&var) + return *var + + my_atomic_store#(&var, what) + store 'what' in *var + + '#' is substituted by a size suffix - 8, 16, 32, or ptr + (e.g. my_atomic_add8, my_atomic_fas32, my_atomic_casptr). + + NOTE This operations are not always atomic, so they always must be + enclosed in my_atomic_rwlock_rdlock(lock)/my_atomic_rwlock_rdunlock(lock) + or my_atomic_rwlock_wrlock(lock)/my_atomic_rwlock_wrunlock(lock). + Hint: if a code block makes intensive use of atomic ops, it make sense + to take/release rwlock once for the whole block, not for every statement. + + On architectures where these operations are really atomic, rwlocks will + be optimized away. + 8- and 16-bit atomics aren't implemented for windows (see generic-msvc.h), + but can be added, if necessary. +*/ + +#ifndef my_atomic_rwlock_init + +#define intptr void * + +#ifndef MY_ATOMIC_MODE_RWLOCKS +#include "atomic/nolock.h" +#endif + +#ifndef make_atomic_cas_body +/* nolock.h was not able to generate even a CAS function, fall back */ +#include "atomic/rwlock.h" +#else +/* define missing functions by using the already generated ones */ +#ifndef make_atomic_add_body +#define make_atomic_add_body(S) \ + int ## S tmp=*a; \ + while (!my_atomic_cas ## S(a, &tmp, tmp+v)); \ + v=tmp; +#endif +#ifndef make_atomic_fas_body +#define make_atomic_fas_body(S) \ + int ## S tmp=*a; \ + while (!my_atomic_cas ## S(a, &tmp, v)); \ + v=tmp; +#endif +#ifndef make_atomic_load_body +#define make_atomic_load_body(S) \ + ret= 0; /* avoid compiler warning */ \ + (void)(my_atomic_cas ## S(a, &ret, ret)); +#endif +#ifndef make_atomic_store_body +#define make_atomic_store_body(S) \ + (void)(my_atomic_fas ## S (a, v)); +#endif +#endif + +/* + transparent_union doesn't work in g++ + Bug ? + + Darwin's gcc doesn't want to put pointers in a transparent_union + when built with -arch ppc64. Complains: + warning: 'transparent_union' attribute ignored +*/ +#if defined(__GNUC__) && !defined(__cplusplus) && \ + ! (defined(__APPLE__) && defined(_ARCH_PPC64)) +/* + we want to be able to use my_atomic_xxx functions with + both signed and unsigned integers. But gcc will issue a warning + "passing arg N of `my_atomic_XXX' as [un]signed due to prototype" + if the signedness of the argument doesn't match the prototype, or + "pointer targets in passing argument N of my_atomic_XXX differ in signedness" + if int* is used where uint* is expected (or vice versa). + Let's shut these warnings up +*/ +#define make_transparent_unions(S) \ + typedef union { \ + int ## S i; \ + uint ## S u; \ + } U_ ## S __attribute__ ((transparent_union)); \ + typedef union { \ + int ## S volatile *i; \ + uint ## S volatile *u; \ + } Uv_ ## S __attribute__ ((transparent_union)); +#define uintptr intptr +make_transparent_unions(8) +make_transparent_unions(16) +make_transparent_unions(32) +make_transparent_unions(ptr) +#undef uintptr +#undef make_transparent_unions +#define a U_a.i +#define cmp U_cmp.i +#define v U_v.i +#define set U_set.i +#else +#define U_32 int32 +#define U_ptr intptr +#define Uv_32 int32 +#define Uv_ptr intptr +#define U_a volatile *a +#define U_cmp *cmp +#define U_v v +#define U_set set +#endif /* __GCC__ transparent_union magic */ + +#ifdef HAVE_INLINE + +#define make_atomic_cas(S) \ +STATIC_INLINE int my_atomic_cas ## S(Uv_ ## S U_a, \ + Uv_ ## S U_cmp, U_ ## S U_set) \ +{ \ + int8 ret; \ + make_atomic_cas_body(S); \ + return ret; \ +} + +#define make_atomic_add(S) \ +STATIC_INLINE int ## S my_atomic_add ## S( \ + Uv_ ## S U_a, U_ ## S U_v) \ +{ \ + make_atomic_add_body(S); \ + return v; \ +} + +#define make_atomic_fas(S) \ +STATIC_INLINE int ## S my_atomic_fas ## S( \ + Uv_ ## S U_a, U_ ## S U_v) \ +{ \ + make_atomic_fas_body(S); \ + return v; \ +} + +#define make_atomic_load(S) \ +STATIC_INLINE int ## S my_atomic_load ## S(Uv_ ## S U_a) \ +{ \ + int ## S ret; \ + make_atomic_load_body(S); \ + return ret; \ +} + +#define make_atomic_store(S) \ +STATIC_INLINE void my_atomic_store ## S( \ + Uv_ ## S U_a, U_ ## S U_v) \ +{ \ + make_atomic_store_body(S); \ +} + +#else /* no inline functions */ + +#define make_atomic_add(S) \ +extern int ## S my_atomic_add ## S(Uv_ ## S U_a, U_ ## S U_v); + +#define make_atomic_fas(S) \ +extern int ## S my_atomic_fas ## S(Uv_ ## S U_a, U_ ## S U_v); + +#define make_atomic_cas(S) \ +extern int my_atomic_cas ## S(Uv_ ## S U_a, Uv_ ## S U_cmp, U_ ## S U_set); + +#define make_atomic_load(S) \ +extern int ## S my_atomic_load ## S(Uv_ ## S U_a); + +#define make_atomic_store(S) \ +extern void my_atomic_store ## S(Uv_ ## S U_a, U_ ## S U_v); + +#endif + +make_atomic_cas(32) +make_atomic_cas(ptr) + +make_atomic_add(32) + +make_atomic_load(32) +make_atomic_load(ptr) + +make_atomic_fas(32) +make_atomic_fas(ptr) + +make_atomic_store(32) +make_atomic_store(ptr) + +#ifdef _atomic_h_cleanup_ +#include _atomic_h_cleanup_ +#undef _atomic_h_cleanup_ +#endif + +#undef U_32 +#undef U_ptr +#undef a +#undef cmp +#undef v +#undef set +#undef U_a +#undef U_cmp +#undef U_v +#undef U_set +#undef make_atomic_add +#undef make_atomic_cas +#undef make_atomic_load +#undef make_atomic_store +#undef make_atomic_fas +#undef make_atomic_add_body +#undef make_atomic_cas_body +#undef make_atomic_load_body +#undef make_atomic_store_body +#undef make_atomic_fas_body +#undef intptr + +/* + the macro below defines (as an expression) the code that + will be run in spin-loops. Intel manuals recummend to have PAUSE there. + It is expected to be defined in include/atomic/ *.h files +*/ +#ifndef LF_BACKOFF +#define LF_BACKOFF (1) +#endif + +#define MY_ATOMIC_OK 0 +#define MY_ATOMIC_NOT_1CPU 1 +extern int my_atomic_initialize(); + +#endif + diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_attribute.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_attribute.h new file mode 100644 index 0000000..8309d85 --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_attribute.h @@ -0,0 +1,63 @@ +/* Copyright (C) 2000-2003 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* + Helper macros used for setting different __attributes__ + on functions in a portable fashion +*/ + +#ifndef _my_attribute_h +#define _my_attribute_h + +/* + Disable __attribute__() on gcc < 2.7, g++ < 3.4, and non-gcc compilers. + Some forms of __attribute__ are actually supported in earlier versions of + g++, but we just disable them all because we only use them to generate + compilation warnings. +*/ +#ifndef __attribute__ +# if !defined(__GNUC__) +# define __attribute__(A) +# elif GCC_VERSION < 2008 +# define __attribute__(A) +# elif defined(__cplusplus) && GCC_VERSION < 3004 +# define __attribute__(A) +# endif +#endif + +/* + __attribute__((format(...))) is only supported in gcc >= 2.8 and g++ >= 3.4 + But that's already covered by the __attribute__ tests above, so this is + just a convenience macro. +*/ +#ifndef ATTRIBUTE_FORMAT +# define ATTRIBUTE_FORMAT(style, m, n) __attribute__((format(style, m, n))) +#endif + +/* + + __attribute__((format(...))) on a function pointer is not supported + until gcc 3.1 +*/ +#ifndef ATTRIBUTE_FORMAT_FPTR +# if (GCC_VERSION >= 3001) +# define ATTRIBUTE_FORMAT_FPTR(style, m, n) ATTRIBUTE_FORMAT(style, m, n) +# else +# define ATTRIBUTE_FORMAT_FPTR(style, m, n) +# endif /* GNUC >= 3.1 */ +#endif + + +#endif diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_base.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_base.h new file mode 100644 index 0000000..e228b39 --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_base.h @@ -0,0 +1,626 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* This file includes constants used with all databases */ + +#ifndef _my_base_h +#define _my_base_h + +#ifndef stdin /* Included first in handler */ +#define CHSIZE_USED +#include +#include /* This includes types */ +#include +#include +#include + +#ifndef EOVERFLOW +#define EOVERFLOW 84 +#endif + +#if !defined(USE_MY_FUNC) && !defined(THREAD) +#include /* For faster code, after test */ +#endif /* USE_MY_FUNC */ +#endif /* stdin */ +#include + +/* The following is bits in the flag parameter to ha_open() */ + +#define HA_OPEN_ABORT_IF_LOCKED 0 /* default */ +#define HA_OPEN_WAIT_IF_LOCKED 1 +#define HA_OPEN_IGNORE_IF_LOCKED 2 +#define HA_OPEN_TMP_TABLE 4 /* Table is a temp table */ +#define HA_OPEN_DELAY_KEY_WRITE 8 /* Don't update index */ +#define HA_OPEN_ABORT_IF_CRASHED 16 +#define HA_OPEN_FOR_REPAIR 32 /* open even if crashed */ +#define HA_OPEN_FROM_SQL_LAYER 64 +#define HA_OPEN_MMAP 128 /* open memory mapped */ +#define HA_OPEN_COPY 256 /* Open copy (for repair) */ +/* Internal temp table, used for temporary results */ +#define HA_OPEN_INTERNAL_TABLE 512 + +/* The following is parameter to ha_rkey() how to use key */ + +/* + We define a complete-field prefix of a key value as a prefix where + the last included field in the prefix contains the full field, not + just some bytes from the start of the field. A partial-field prefix + is allowed to contain only a few first bytes from the last included + field. + + Below HA_READ_KEY_EXACT, ..., HA_READ_BEFORE_KEY can take a + complete-field prefix of a key value as the search + key. HA_READ_PREFIX and HA_READ_PREFIX_LAST could also take a + partial-field prefix, but currently (4.0.10) they are only used with + complete-field prefixes. MySQL uses a padding trick to implement + LIKE 'abc%' queries. + + NOTE that in InnoDB HA_READ_PREFIX_LAST will NOT work with a + partial-field prefix because InnoDB currently strips spaces from the + end of varchar fields! +*/ + +enum ha_rkey_function { + HA_READ_KEY_EXACT, /* Find first record else error */ + HA_READ_KEY_OR_NEXT, /* Record or next record */ + HA_READ_KEY_OR_PREV, /* Record or previous */ + HA_READ_AFTER_KEY, /* Find next rec. after key-record */ + HA_READ_BEFORE_KEY, /* Find next rec. before key-record */ + HA_READ_PREFIX, /* Key which as same prefix */ + HA_READ_PREFIX_LAST, /* Last key with the same prefix */ + HA_READ_PREFIX_LAST_OR_PREV, /* Last or prev key with the same prefix */ + HA_READ_MBR_CONTAIN, + HA_READ_MBR_INTERSECT, + HA_READ_MBR_WITHIN, + HA_READ_MBR_DISJOINT, + HA_READ_MBR_EQUAL +}; + + /* Key algorithm types */ + +enum ha_key_alg { + HA_KEY_ALG_UNDEF= 0, /* Not specified (old file) */ + HA_KEY_ALG_BTREE= 1, /* B-tree, default one */ + HA_KEY_ALG_RTREE= 2, /* R-tree, for spatial searches */ + HA_KEY_ALG_HASH= 3, /* HASH keys (HEAP tables) */ + HA_KEY_ALG_FULLTEXT= 4 /* FULLTEXT (MyISAM tables) */ +}; + + /* Index and table build methods */ + +enum ha_build_method { + HA_BUILD_DEFAULT, + HA_BUILD_ONLINE, + HA_BUILD_OFFLINE +}; + + /* Storage media types */ + +enum ha_storage_media { + HA_SM_DEFAULT= 0, /* Not specified (engine default) */ + HA_SM_DISK= 1, /* DISK storage */ + HA_SM_MEMORY= 2 /* MAIN MEMORY storage */ +}; + + /* The following is parameter to ha_extra() */ + +enum ha_extra_function { + HA_EXTRA_NORMAL=0, /* Optimize for space (def) */ + HA_EXTRA_QUICK=1, /* Optimize for speed */ + HA_EXTRA_NOT_USED=2, + HA_EXTRA_CACHE=3, /* Cache record in HA_rrnd() */ + HA_EXTRA_NO_CACHE=4, /* End caching of records (def) */ + HA_EXTRA_NO_READCHECK=5, /* No readcheck on update */ + HA_EXTRA_READCHECK=6, /* Use readcheck (def) */ + HA_EXTRA_KEYREAD=7, /* Read only key to database */ + HA_EXTRA_NO_KEYREAD=8, /* Normal read of records (def) */ + HA_EXTRA_NO_USER_CHANGE=9, /* No user is allowed to write */ + HA_EXTRA_KEY_CACHE=10, + HA_EXTRA_NO_KEY_CACHE=11, + HA_EXTRA_WAIT_LOCK=12, /* Wait until file is avalably (def) */ + HA_EXTRA_NO_WAIT_LOCK=13, /* If file is locked, return quickly */ + HA_EXTRA_WRITE_CACHE=14, /* Use write cache in ha_write() */ + HA_EXTRA_FLUSH_CACHE=15, /* flush write_record_cache */ + HA_EXTRA_NO_KEYS=16, /* Remove all update of keys */ + HA_EXTRA_KEYREAD_CHANGE_POS=17, /* Keyread, but change pos */ + /* xxxxchk -r must be used */ + HA_EXTRA_REMEMBER_POS=18, /* Remember pos for next/prev */ + HA_EXTRA_RESTORE_POS=19, + HA_EXTRA_REINIT_CACHE=20, /* init cache from current record */ + HA_EXTRA_FORCE_REOPEN=21, /* Datafile have changed on disk */ + HA_EXTRA_FLUSH, /* Flush tables to disk */ + HA_EXTRA_NO_ROWS, /* Don't write rows */ + HA_EXTRA_RESET_STATE, /* Reset positions */ + HA_EXTRA_IGNORE_DUP_KEY, /* Dup keys don't rollback everything*/ + HA_EXTRA_NO_IGNORE_DUP_KEY, + HA_EXTRA_PREPARE_FOR_DROP, + HA_EXTRA_PREPARE_FOR_UPDATE, /* Remove read cache if problems */ + HA_EXTRA_PRELOAD_BUFFER_SIZE, /* Set buffer size for preloading */ + /* + On-the-fly switching between unique and non-unique key inserting. + */ + HA_EXTRA_CHANGE_KEY_TO_UNIQUE, + HA_EXTRA_CHANGE_KEY_TO_DUP, + /* + When using HA_EXTRA_KEYREAD, overwrite only key member fields and keep + other fields intact. When this is off (by default) InnoDB will use memcpy + to overwrite entire row. + */ + HA_EXTRA_KEYREAD_PRESERVE_FIELDS, + HA_EXTRA_MMAP, + /* + Ignore if the a tuple is not found, continue processing the + transaction and ignore that 'row'. Needed for idempotency + handling on the slave + + Currently only used by NDB storage engine. Partition handler ignores flag. + */ + HA_EXTRA_IGNORE_NO_KEY, + HA_EXTRA_NO_IGNORE_NO_KEY, + /* + Mark the table as a log table. For some handlers (e.g. CSV) this results + in a special locking for the table. + */ + HA_EXTRA_MARK_AS_LOG_TABLE, + /* + Informs handler that write_row() which tries to insert new row into the + table and encounters some already existing row with same primary/unique + key can replace old row with new row instead of reporting error (basically + it informs handler that we do REPLACE instead of simple INSERT). + Off by default. + */ + HA_EXTRA_WRITE_CAN_REPLACE, + HA_EXTRA_WRITE_CANNOT_REPLACE, + /* + Inform handler that delete_row()/update_row() cannot batch deletes/updates + and should perform them immediately. This may be needed when table has + AFTER DELETE/UPDATE triggers which access to subject table. + These flags are reset by the handler::extra(HA_EXTRA_RESET) call. + */ + HA_EXTRA_DELETE_CANNOT_BATCH, + HA_EXTRA_UPDATE_CANNOT_BATCH, + /* + Inform handler that an "INSERT...ON DUPLICATE KEY UPDATE" will be + executed. This condition is unset by HA_EXTRA_NO_IGNORE_DUP_KEY. + */ + HA_EXTRA_INSERT_WITH_UPDATE, + /* Inform handler that we will do a rename */ + HA_EXTRA_PREPARE_FOR_RENAME, + /* + Special actions for MERGE tables. + */ + HA_EXTRA_ADD_CHILDREN_LIST, + HA_EXTRA_ATTACH_CHILDREN, + HA_EXTRA_IS_ATTACHED_CHILDREN, + HA_EXTRA_DETACH_CHILDREN, + HA_EXTRA_ORDERBY_LIMIT, + HA_EXTRA_NO_ORDERBY_LIMIT, + /* Inform handler we will force a close as part of flush */ + HA_EXTRA_PREPARE_FOR_FORCED_CLOSE, + HA_EXTRA_ALLOW_LOG_DELETE +}; + +/* Compatible option, to be deleted in 6.0 */ +#define HA_EXTRA_PREPARE_FOR_DELETE HA_EXTRA_PREPARE_FOR_DROP + + /* The following is parameter to ha_panic() */ + +enum ha_panic_function { + HA_PANIC_CLOSE, /* Close all databases */ + HA_PANIC_WRITE, /* Unlock and write status */ + HA_PANIC_READ /* Lock and read keyinfo */ +}; + + /* The following is parameter to ha_create(); keytypes */ + +enum ha_base_keytype { + HA_KEYTYPE_END=0, + HA_KEYTYPE_TEXT=1, /* Key is sorted as letters */ + HA_KEYTYPE_BINARY=2, /* Key is sorted as unsigned chars */ + HA_KEYTYPE_SHORT_INT=3, + HA_KEYTYPE_LONG_INT=4, + HA_KEYTYPE_FLOAT=5, + HA_KEYTYPE_DOUBLE=6, + HA_KEYTYPE_NUM=7, /* Not packed num with pre-space */ + HA_KEYTYPE_USHORT_INT=8, + HA_KEYTYPE_ULONG_INT=9, + HA_KEYTYPE_LONGLONG=10, + HA_KEYTYPE_ULONGLONG=11, + HA_KEYTYPE_INT24=12, + HA_KEYTYPE_UINT24=13, + HA_KEYTYPE_INT8=14, + /* Varchar (0-255 bytes) with length packed with 1 byte */ + HA_KEYTYPE_VARTEXT1=15, /* Key is sorted as letters */ + HA_KEYTYPE_VARBINARY1=16, /* Key is sorted as unsigned chars */ + /* Varchar (0-65535 bytes) with length packed with 2 bytes */ + HA_KEYTYPE_VARTEXT2=17, /* Key is sorted as letters */ + HA_KEYTYPE_VARBINARY2=18, /* Key is sorted as unsigned chars */ + HA_KEYTYPE_BIT=19 +}; + +#define HA_MAX_KEYTYPE 31 /* Must be log2-1 */ + +/* + These flags kan be OR:ed to key-flag + Note that these can only be up to 16 bits! +*/ + +#define HA_NOSAME 1 /* Set if not dupplicated records */ +#define HA_PACK_KEY 2 /* Pack string key to previous key */ +#define HA_AUTO_KEY 16 +#define HA_BINARY_PACK_KEY 32 /* Packing of all keys to prev key */ +#define HA_FULLTEXT 128 /* For full-text search */ +#define HA_UNIQUE_CHECK 256 /* Check the key for uniqueness */ +#define HA_SPATIAL 1024 /* For spatial search */ +#define HA_NULL_ARE_EQUAL 2048 /* NULL in key are cmp as equal */ +#define HA_GENERATED_KEY 8192 /* Automaticly generated key */ +#define HA_RTREE_INDEX 16384 /* For RTREE search */ + + /* The combination of the above can be used for key type comparison. */ +#define HA_KEYFLAG_MASK (HA_NOSAME | HA_PACK_KEY | HA_AUTO_KEY | \ + HA_BINARY_PACK_KEY | HA_FULLTEXT | HA_UNIQUE_CHECK | \ + HA_SPATIAL | HA_NULL_ARE_EQUAL | HA_GENERATED_KEY | \ + HA_RTREE_INDEX) + +#define HA_KEY_HAS_PART_KEY_SEG 65536 /* Key contains partial segments */ + + /* Automatic bits in key-flag */ + +#define HA_SPACE_PACK_USED 4 /* Test for if SPACE_PACK used */ +#define HA_VAR_LENGTH_KEY 8 +#define HA_NULL_PART_KEY 64 +#define HA_USES_COMMENT 4096 +#define HA_USES_PARSER 16384 /* Fulltext index uses [pre]parser */ +#define HA_USES_BLOCK_SIZE ((uint) 32768) +#define HA_SORT_ALLOWS_SAME 512 /* Intern bit when sorting records */ +#if MYSQL_VERSION_ID < 0x50200 +/* + Key has a part that can have end space. If this is an unique key + we have to handle it differently from other unique keys as we can find + many matching rows for one key (because end space are not compared) +*/ +#define HA_END_SPACE_KEY 0 /* was: 4096 */ +#else +#error HA_END_SPACE_KEY is obsolete, please remove it +#endif + + + /* These flags can be added to key-seg-flag */ + +#define HA_SPACE_PACK 1 /* Pack space in key-seg */ +#define HA_PART_KEY_SEG 4 /* Used by MySQL for part-key-cols */ +#define HA_VAR_LENGTH_PART 8 +#define HA_NULL_PART 16 +#define HA_BLOB_PART 32 +#define HA_SWAP_KEY 64 +#define HA_REVERSE_SORT 128 /* Sort key in reverse order */ +#define HA_NO_SORT 256 /* do not bother sorting on this keyseg */ +/* + End space in unique/varchar are considered equal. (Like 'a' and 'a ') + Only needed for internal temporary tables. +*/ +#define HA_END_SPACE_ARE_EQUAL 512 +#define HA_BIT_PART 1024 + + /* optionbits for database */ +#define HA_OPTION_PACK_RECORD 1 +#define HA_OPTION_PACK_KEYS 2 +#define HA_OPTION_COMPRESS_RECORD 4 +#define HA_OPTION_LONG_BLOB_PTR 8 /* new ISAM format */ +#define HA_OPTION_TMP_TABLE 16 +#define HA_OPTION_CHECKSUM 32 +#define HA_OPTION_DELAY_KEY_WRITE 64 +#define HA_OPTION_NO_PACK_KEYS 128 /* Reserved for MySQL */ +#define HA_OPTION_CREATE_FROM_ENGINE 256 +#define HA_OPTION_RELIES_ON_SQL_LAYER 512 +#define HA_OPTION_NULL_FIELDS 1024 +#define HA_OPTION_PAGE_CHECKSUM 2048 +#define HA_OPTION_TEMP_COMPRESS_RECORD (1L << 15) /* set by isamchk */ +#define HA_OPTION_READ_ONLY_DATA (1L << 16) /* Set by isamchk */ +#define HA_OPTION_NO_CHECKSUM (1L << 17) +#define HA_OPTION_NO_DELAY_KEY_WRITE (1L << 18) + + /* Bits in flag to create() */ + +#define HA_DONT_TOUCH_DATA 1 /* Don't empty datafile (isamchk) */ +#define HA_PACK_RECORD 2 /* Request packed record format */ +#define HA_CREATE_TMP_TABLE 4 +#define HA_CREATE_CHECKSUM 8 +#define HA_CREATE_KEEP_FILES 16 /* don't overwrite .MYD and MYI */ +#define HA_CREATE_PAGE_CHECKSUM 32 +#define HA_CREATE_DELAY_KEY_WRITE 64 +#define HA_CREATE_RELIES_ON_SQL_LAYER 128 + +/* + The following flags (OR-ed) are passed to handler::info() method. + The method copies misc handler information out of the storage engine + to data structures accessible from MySQL + + Same flags are also passed down to mi_status, myrg_status, etc. +*/ + +/* this one is not used */ +#define HA_STATUS_POS 1 +/* + assuming the table keeps shared actual copy of the 'info' and + local, possibly outdated copy, the following flag means that + it should not try to get the actual data (locking the shared structure) + slightly outdated version will suffice +*/ +#define HA_STATUS_NO_LOCK 2 +/* update the time of the last modification (in handler::update_time) */ +#define HA_STATUS_TIME 4 +/* + update the 'constant' part of the info: + handler::max_data_file_length, max_index_file_length, create_time + sortkey, ref_length, block_size, data_file_name, index_file_name. + handler::table->s->keys_in_use, keys_for_keyread, rec_per_key +*/ +#define HA_STATUS_CONST 8 +/* + update the 'variable' part of the info: + handler::records, deleted, data_file_length, index_file_length, + delete_length, check_time, mean_rec_length +*/ +#define HA_STATUS_VARIABLE 16 +/* + get the information about the key that caused last duplicate value error + update handler::errkey and handler::dupp_ref + see handler::get_dup_key() +*/ +#define HA_STATUS_ERRKEY 32 +/* + update handler::auto_increment_value +*/ +#define HA_STATUS_AUTO 64 + +/* + Errorcodes given by handler functions + + opt_sum_query() assumes these codes are > 1 + Do not add error numbers before HA_ERR_FIRST. + If necessary to add lower numbers, change HA_ERR_FIRST accordingly. +*/ +#define HA_ERR_FIRST 120 /* Copy of first error nr.*/ + +#define HA_ERR_KEY_NOT_FOUND 120 /* Didn't find key on read or update */ +#define HA_ERR_FOUND_DUPP_KEY 121 /* Dupplicate key on write */ +#define HA_ERR_INTERNAL_ERROR 122 /* Internal error */ +#define HA_ERR_RECORD_CHANGED 123 /* Uppdate with is recoverable */ +#define HA_ERR_WRONG_INDEX 124 /* Wrong index given to function */ +#define HA_ERR_CRASHED 126 /* Indexfile is crashed */ +#define HA_ERR_WRONG_IN_RECORD 127 /* Record-file is crashed */ +#define HA_ERR_OUT_OF_MEM 128 /* Record-file is crashed */ +#define HA_ERR_NOT_A_TABLE 130 /* not a MYI file - no signature */ +#define HA_ERR_WRONG_COMMAND 131 /* Command not supported */ +#define HA_ERR_OLD_FILE 132 /* old databasfile */ +#define HA_ERR_NO_ACTIVE_RECORD 133 /* No record read in update() */ +#define HA_ERR_RECORD_DELETED 134 /* A record is not there */ +#define HA_ERR_RECORD_FILE_FULL 135 /* No more room in file */ +#define HA_ERR_INDEX_FILE_FULL 136 /* No more room in file */ +#define HA_ERR_END_OF_FILE 137 /* end in next/prev/first/last */ +#define HA_ERR_UNSUPPORTED 138 /* unsupported extension used */ +#define HA_ERR_TO_BIG_ROW 139 /* Too big row */ +#define HA_WRONG_CREATE_OPTION 140 /* Wrong create option */ +#define HA_ERR_FOUND_DUPP_UNIQUE 141 /* Dupplicate unique on write */ +#define HA_ERR_UNKNOWN_CHARSET 142 /* Can't open charset */ +#define HA_ERR_WRONG_MRG_TABLE_DEF 143 /* conflicting tables in MERGE */ +#define HA_ERR_CRASHED_ON_REPAIR 144 /* Last (automatic?) repair failed */ +#define HA_ERR_CRASHED_ON_USAGE 145 /* Table must be repaired */ +#define HA_ERR_LOCK_WAIT_TIMEOUT 146 +#define HA_ERR_LOCK_TABLE_FULL 147 +#define HA_ERR_READ_ONLY_TRANSACTION 148 /* Updates not allowed */ +#define HA_ERR_LOCK_DEADLOCK 149 +#define HA_ERR_CANNOT_ADD_FOREIGN 150 /* Cannot add a foreign key constr. */ +#define HA_ERR_NO_REFERENCED_ROW 151 /* Cannot add a child row */ +#define HA_ERR_ROW_IS_REFERENCED 152 /* Cannot delete a parent row */ +#define HA_ERR_NO_SAVEPOINT 153 /* No savepoint with that name */ +#define HA_ERR_NON_UNIQUE_BLOCK_SIZE 154 /* Non unique key block size */ +#define HA_ERR_NO_SUCH_TABLE 155 /* The table does not exist in engine */ +#define HA_ERR_TABLE_EXIST 156 /* The table existed in storage engine */ +#define HA_ERR_NO_CONNECTION 157 /* Could not connect to storage engine */ +/* NULLs are not supported in spatial index */ +#define HA_ERR_NULL_IN_SPATIAL 158 +#define HA_ERR_TABLE_DEF_CHANGED 159 /* The table changed in storage engine */ +/* There's no partition in table for given value */ +#define HA_ERR_NO_PARTITION_FOUND 160 +#define HA_ERR_RBR_LOGGING_FAILED 161 /* Row-based binlogging of row failed */ +#define HA_ERR_DROP_INDEX_FK 162 /* Index needed in foreign key constr */ +/* + Upholding foreign key constraints would lead to a duplicate key error + in some other table. +*/ +#define HA_ERR_FOREIGN_DUPLICATE_KEY 163 +/* The table changed in storage engine */ +#define HA_ERR_TABLE_NEEDS_UPGRADE 164 +#define HA_ERR_TABLE_READONLY 165 /* The table is not writable */ + +#define HA_ERR_AUTOINC_READ_FAILED 166 /* Failed to get next autoinc value */ +#define HA_ERR_AUTOINC_ERANGE 167 /* Failed to set row autoinc value */ +#define HA_ERR_GENERIC 168 /* Generic error */ +/* row not actually updated: new values same as the old values */ +#define HA_ERR_RECORD_IS_THE_SAME 169 +/* It is not possible to log this statement */ +#define HA_ERR_LOGGING_IMPOSSIBLE 170 +#define HA_ERR_TABLESPACE_EXIST 171 +/* The event was corrupt, leading to illegal data being read */ +#define HA_ERR_CORRUPT_EVENT 172 +#define HA_ERR_NEW_FILE 173 /* New file format */ +/* The event could not be processed no other handler error happened */ +#define HA_ERR_ROWS_EVENT_APPLY 174 +#define HA_ERR_INITIALIZATION 175 /* Error during initialization */ +#define HA_ERR_FILE_TOO_SHORT 176 /* File too short */ +#define HA_ERR_WRONG_CRC 177 /* Wrong CRC on page */ +#define HA_ERR_LOCK_OR_ACTIVE_TRANSACTION 178 +#define HA_ERR_NO_SUCH_TABLESPACE 179 +#define HA_ERR_TABLESPACE_NOT_EMPTY 180 +#define HA_ERR_TABLESPACE_DATAFILE_EXIST 181 +#define HA_ERR_ROW_NOT_VISIBLE 182 +#define HA_ERR_LAST 182 /* Copy of last error nr */ + +/* Number of different errors */ +#define HA_ERR_ERRORS (HA_ERR_LAST - HA_ERR_FIRST + 1) + + /* Other constants */ + +#define HA_NAMELEN 64 /* Max length of saved filename */ +#define NO_SUCH_KEY (~(uint)0) /* used as a key no. */ + +typedef ulong key_part_map; +#define HA_WHOLE_KEY (~(key_part_map)0) + + /* Intern constants in databases */ + + /* bits in _search */ +#define SEARCH_FIND 1 +#define SEARCH_NO_FIND 2 +#define SEARCH_SAME 4 +#define SEARCH_BIGGER 8 +#define SEARCH_SMALLER 16 +#define SEARCH_SAVE_BUFF 32 +#define SEARCH_UPDATE 64 +#define SEARCH_PREFIX 128 +#define SEARCH_LAST 256 +#define MBR_CONTAIN 512 +#define MBR_INTERSECT 1024 +#define MBR_WITHIN 2048 +#define MBR_DISJOINT 4096 +#define MBR_EQUAL 8192 +#define MBR_DATA 16384 +#define SEARCH_NULL_ARE_EQUAL 32768 /* NULL in keys are equal */ +#define SEARCH_NULL_ARE_NOT_EQUAL 65536 /* NULL in keys are not equal */ +/* Use this when inserting a key in position order */ +#define SEARCH_INSERT SEARCH_NULL_ARE_NOT_EQUAL*2 +/* Only part of the key is specified while reading */ +#define SEARCH_PART_KEY SEARCH_INSERT*2 +/* Used when user key (key 2) contains transaction id's */ +#define SEARCH_USER_KEY_HAS_TRANSID SEARCH_PART_KEY*2 +/* Used when page key (key 1) contains transaction id's */ +#define SEARCH_PAGE_KEY_HAS_TRANSID SEARCH_USER_KEY_HAS_TRANSID*2 + + /* bits in opt_flag */ +#define QUICK_USED 1 +#define READ_CACHE_USED 2 +#define READ_CHECK_USED 4 +#define KEY_READ_USED 8 +#define WRITE_CACHE_USED 16 +#define OPT_NO_ROWS 32 + + /* bits in update */ +#define HA_STATE_CHANGED 1 /* Database has changed */ +#define HA_STATE_AKTIV 2 /* Has a current record */ +#define HA_STATE_WRITTEN 4 /* Record is written */ +#define HA_STATE_DELETED 8 +#define HA_STATE_NEXT_FOUND 16 /* Next found record (record before) */ +#define HA_STATE_PREV_FOUND 32 /* Prev found record (record after) */ +#define HA_STATE_NO_KEY 64 /* Last read didn't find record */ +#define HA_STATE_KEY_CHANGED 128 +#define HA_STATE_WRITE_AT_END 256 /* set in _ps_find_writepos */ +#define HA_STATE_BUFF_SAVED 512 /* If current keybuff is info->buff */ +#define HA_STATE_ROW_CHANGED 1024 /* To invalide ROW cache */ +#define HA_STATE_EXTEND_BLOCK 2048 +#define HA_STATE_RNEXT_SAME 4096 /* rnext_same occupied lastkey2 */ + +/* myisampack expects no more than 32 field types. */ +enum en_fieldtype { + FIELD_LAST=-1,FIELD_NORMAL,FIELD_SKIP_ENDSPACE,FIELD_SKIP_PRESPACE, + FIELD_SKIP_ZERO,FIELD_BLOB,FIELD_CONSTANT,FIELD_INTERVALL,FIELD_ZERO, + FIELD_VARCHAR,FIELD_CHECK, + FIELD_enum_val_count +}; + +enum data_file_type { + STATIC_RECORD, DYNAMIC_RECORD, COMPRESSED_RECORD, BLOCK_RECORD +}; + +/* For key ranges */ + +/* from -inf */ +#define NO_MIN_RANGE 1 + +/* to +inf */ +#define NO_MAX_RANGE 2 + +/* X < key, i.e. not including the left endpoint */ +#define NEAR_MIN 4 + +/* X > key, i.e. not including the right endpoint */ +#define NEAR_MAX 8 + +/* + This flag means that index is a unique index, and the interval is + equivalent to "AND(keypart_i = const_i)", where all of const_i are not NULLs. +*/ +#define UNIQUE_RANGE 16 + +/* + This flag means that the interval is equivalent to + "AND(keypart_i = const_i)", where not all key parts may be used but all of + const_i are not NULLs. +*/ +#define EQ_RANGE 32 + +/* + This flag has the same meaning as UNIQUE_RANGE, except that for at least + one keypart the condition is "keypart IS NULL". +*/ +#define NULL_RANGE 64 + +#define GEOM_FLAG 128 + +#define SKIP_RANGE 256 +#define EMPTY_RANGE 512 + +typedef struct st_key_range +{ + const uchar *key; + uint length; + key_part_map keypart_map; + enum ha_rkey_function flag; +} key_range; + +typedef struct st_key_multi_range +{ + key_range start_key; + key_range end_key; + char *ptr; /* Free to use by caller (ptr to row etc) */ + uint range_flag; /* key range flags see above */ +} KEY_MULTI_RANGE; + + +/* For number of records */ +#ifdef BIG_TABLES +#define rows2double(A) ulonglong2double(A) +typedef my_off_t ha_rows; +#else +#define rows2double(A) (double) (A) +typedef ulong ha_rows; +#endif + +#define HA_POS_ERROR (~ (ha_rows) 0) +#define HA_OFFSET_ERROR (~ (my_off_t) 0) + +#if SYSTEM_SIZEOF_OFF_T == 4 +#define MAX_FILE_SIZE INT_MAX32 +#else +#define MAX_FILE_SIZE LONGLONG_MAX +#endif + +#define HA_VARCHAR_PACKLENGTH(field_length) ((field_length) < 256 ? 1 :2) + +/* invalidator function reference for Query Cache */ +typedef void (* invalidator_by_filename)(const char * filename); + +#endif /* _my_base_h */ diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_bit.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_bit.h new file mode 100644 index 0000000..2e464e8 --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_bit.h @@ -0,0 +1,109 @@ +/* + Some useful bit functions +*/ + +C_MODE_START +#ifdef HAVE_INLINE + +extern const char _my_bits_nbits[256]; +extern const uchar _my_bits_reverse_table[256]; + +/* + Find smallest X in 2^X >= value + This can be used to divide a number with value by doing a shift instead +*/ + +STATIC_INLINE uint my_bit_log2(ulong value) +{ + uint bit; + for (bit=0 ; value > 1 ; value>>=1, bit++) ; + return bit; +} + +STATIC_INLINE uint my_count_bits(ulonglong v) +{ +#if SIZEOF_LONG_LONG > 4 + /* The following code is a bit faster on 16 bit machines than if we would + only shift v */ + ulong v2=(ulong) (v >> 32); + return (uint) (uchar) (_my_bits_nbits[(uchar) v] + + _my_bits_nbits[(uchar) (v >> 8)] + + _my_bits_nbits[(uchar) (v >> 16)] + + _my_bits_nbits[(uchar) (v >> 24)] + + _my_bits_nbits[(uchar) (v2)] + + _my_bits_nbits[(uchar) (v2 >> 8)] + + _my_bits_nbits[(uchar) (v2 >> 16)] + + _my_bits_nbits[(uchar) (v2 >> 24)]); +#else + return (uint) (uchar) (_my_bits_nbits[(uchar) v] + + _my_bits_nbits[(uchar) (v >> 8)] + + _my_bits_nbits[(uchar) (v >> 16)] + + _my_bits_nbits[(uchar) (v >> 24)]); +#endif +} + +STATIC_INLINE uint my_count_bits_ushort(ushort v) +{ + return _my_bits_nbits[v]; +} + + +/* + Next highest power of two + + SYNOPSIS + my_round_up_to_next_power() + v Value to check + + RETURN + Next or equal power of 2 + Note: 0 will return 0 + + NOTES + Algorithm by Sean Anderson, according to: + http://graphics.stanford.edu/~seander/bithacks.html + (Orignal code public domain) + + Comments shows how this works with 01100000000000000000000000001011 +*/ + +STATIC_INLINE uint32 my_round_up_to_next_power(uint32 v) +{ + v--; /* 01100000000000000000000000001010 */ + v|= v >> 1; /* 01110000000000000000000000001111 */ + v|= v >> 2; /* 01111100000000000000000000001111 */ + v|= v >> 4; /* 01111111110000000000000000001111 */ + v|= v >> 8; /* 01111111111111111100000000001111 */ + v|= v >> 16; /* 01111111111111111111111111111111 */ + return v+1; /* 10000000000000000000000000000000 */ +} + +STATIC_INLINE uint32 my_clear_highest_bit(uint32 v) +{ + uint32 w=v >> 1; + w|= w >> 1; + w|= w >> 2; + w|= w >> 4; + w|= w >> 8; + w|= w >> 16; + return v & w; +} + +STATIC_INLINE uint32 my_reverse_bits(uint32 key) +{ + return + (_my_bits_reverse_table[ key & 255] << 24) | + (_my_bits_reverse_table[(key>> 8) & 255] << 16) | + (_my_bits_reverse_table[(key>>16) & 255] << 8) | + _my_bits_reverse_table[(key>>24) ]; +} + +#else /* HAVE_INLINE */ +extern uint my_bit_log2(ulong value); +extern uint32 my_round_up_to_next_power(uint32 v); +uint32 my_clear_highest_bit(uint32 v); +uint32 my_reverse_bits(uint32 key); +extern uint my_count_bits(ulonglong v); +extern uint my_count_bits_ushort(ushort v); +#endif /* HAVE_INLINE */ +C_MODE_END diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_bitmap.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_bitmap.h new file mode 100644 index 0000000..d8c9a0c --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_bitmap.h @@ -0,0 +1,182 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef _my_bitmap_h_ +#define _my_bitmap_h_ + +#define MY_BIT_NONE (~(uint) 0) + +#include + +typedef uint32 my_bitmap_map; + +typedef struct st_bitmap +{ + my_bitmap_map *bitmap; + uint n_bits; /* number of bits occupied by the above */ + my_bitmap_map last_word_mask; + my_bitmap_map *last_word_ptr; + /* + mutex will be acquired for the duration of each bitmap operation if + thread_safe flag in bitmap_init was set. Otherwise, we optimize by not + acquiring the mutex + */ +#ifdef THREAD + pthread_mutex_t *mutex; +#endif +} MY_BITMAP; + +#ifdef __cplusplus +extern "C" { +#endif +extern void create_last_word_mask(MY_BITMAP *map); +extern my_bool bitmap_init(MY_BITMAP *map, my_bitmap_map *buf, uint n_bits, + my_bool thread_safe); +extern my_bool bitmap_is_clear_all(const MY_BITMAP *map); +extern my_bool bitmap_is_prefix(const MY_BITMAP *map, uint prefix_size); +extern my_bool bitmap_is_set_all(const MY_BITMAP *map); +extern my_bool bitmap_is_subset(const MY_BITMAP *map1, const MY_BITMAP *map2); +extern my_bool bitmap_is_overlapping(const MY_BITMAP *map1, + const MY_BITMAP *map2); +extern my_bool bitmap_test_and_set(MY_BITMAP *map, uint bitmap_bit); +extern my_bool bitmap_test_and_clear(MY_BITMAP *map, uint bitmap_bit); +extern my_bool bitmap_fast_test_and_set(MY_BITMAP *map, uint bitmap_bit); +extern uint bitmap_set_next(MY_BITMAP *map); +extern uint bitmap_get_first(const MY_BITMAP *map); +extern uint bitmap_get_first_set(const MY_BITMAP *map); +extern uint bitmap_bits_set(const MY_BITMAP *map); +extern void bitmap_free(MY_BITMAP *map); +extern void bitmap_set_above(MY_BITMAP *map, uint from_byte, uint use_bit); +extern void bitmap_set_prefix(MY_BITMAP *map, uint prefix_size); +extern void bitmap_intersect(MY_BITMAP *map, const MY_BITMAP *map2); +extern void bitmap_subtract(MY_BITMAP *map, const MY_BITMAP *map2); +extern void bitmap_union(MY_BITMAP *map, const MY_BITMAP *map2); +extern void bitmap_xor(MY_BITMAP *map, const MY_BITMAP *map2); +extern void bitmap_invert(MY_BITMAP *map); +extern void bitmap_copy(MY_BITMAP *map, const MY_BITMAP *map2); + +extern uint bitmap_lock_set_next(MY_BITMAP *map); +extern void bitmap_lock_clear_bit(MY_BITMAP *map, uint bitmap_bit); +#ifdef NOT_USED +extern uint bitmap_lock_bits_set(const MY_BITMAP *map); +extern my_bool bitmap_lock_is_set_all(const MY_BITMAP *map); +extern uint bitmap_lock_get_first(const MY_BITMAP *map); +extern uint bitmap_lock_get_first_set(const MY_BITMAP *map); +extern my_bool bitmap_lock_is_subset(const MY_BITMAP *map1, + const MY_BITMAP *map2); +extern my_bool bitmap_lock_is_prefix(const MY_BITMAP *map, uint prefix_size); +extern my_bool bitmap_lock_is_set(const MY_BITMAP *map, uint bitmap_bit); +extern my_bool bitmap_lock_is_clear_all(const MY_BITMAP *map); +extern my_bool bitmap_lock_cmp(const MY_BITMAP *map1, const MY_BITMAP *map2); +extern void bitmap_lock_set_all(MY_BITMAP *map); +extern void bitmap_lock_clear_all(MY_BITMAP *map); +extern void bitmap_lock_set_bit(MY_BITMAP *map, uint bitmap_bit); +extern void bitmap_lock_flip_bit(MY_BITMAP *map, uint bitmap_bit); +extern void bitmap_lock_set_prefix(MY_BITMAP *map, uint prefix_size); +extern void bitmap_lock_intersect(MY_BITMAP *map, const MY_BITMAP *map2); +extern void bitmap_lock_subtract(MY_BITMAP *map, const MY_BITMAP *map2); +extern void bitmap_lock_union(MY_BITMAP *map, const MY_BITMAP *map2); +extern void bitmap_lock_xor(MY_BITMAP *map, const MY_BITMAP *map2); +extern void bitmap_lock_invert(MY_BITMAP *map); +#endif +/* Fast, not thread safe, bitmap functions */ +#define bitmap_buffer_size(bits) (((bits)+31)/32)*4 +#define no_bytes_in_map(map) (((map)->n_bits + 7)/8) +#define no_words_in_map(map) (((map)->n_bits + 31)/32) +#define bytes_word_aligned(bytes) (4*((bytes + 3)/4)) +#define _bitmap_set_bit(MAP, BIT) (((uchar*)(MAP)->bitmap)[(BIT) / 8] \ + |= (1 << ((BIT) & 7))) +#define _bitmap_flip_bit(MAP, BIT) (((uchar*)(MAP)->bitmap)[(BIT) / 8] \ + ^= (1 << ((BIT) & 7))) +#define _bitmap_clear_bit(MAP, BIT) (((uchar*)(MAP)->bitmap)[(BIT) / 8] \ + &= ~ (1 << ((BIT) & 7))) +#define _bitmap_is_set(MAP, BIT) (uint) (((uchar*)(MAP)->bitmap)[(BIT) / 8] \ + & (1 << ((BIT) & 7))) +/* + WARNING! + + The below symbols are inline functions in DEBUG builds and macros in + non-DEBUG builds. The latter evaluate their 'bit' argument twice. + + NEVER use an increment/decrement operator with the 'bit' argument. + It would work with DEBUG builds, but fails later in production builds! + + FORBIDDEN: bitmap_set_bit($my_bitmap, (field++)->field_index); +*/ +#ifndef DBUG_OFF +static inline void +bitmap_set_bit(MY_BITMAP *map,uint bit) +{ + DBUG_ASSERT(bit < (map)->n_bits); + _bitmap_set_bit(map,bit); +} +static inline void +bitmap_flip_bit(MY_BITMAP *map,uint bit) +{ + DBUG_ASSERT(bit < (map)->n_bits); + _bitmap_flip_bit(map,bit); +} +static inline void +bitmap_clear_bit(MY_BITMAP *map,uint bit) +{ + DBUG_ASSERT(bit < (map)->n_bits); + _bitmap_clear_bit(map,bit); +} +static inline uint +bitmap_is_set(const MY_BITMAP *map,uint bit) +{ + DBUG_ASSERT(bit < (map)->n_bits); + return _bitmap_is_set(map,bit); +} +#else +#define bitmap_set_bit(MAP, BIT) _bitmap_set_bit(MAP, BIT) +#define bitmap_flip_bit(MAP, BIT) _bitmap_flip_bit(MAP, BIT) +#define bitmap_clear_bit(MAP, BIT) _bitmap_clear_bit(MAP, BIT) +#define bitmap_is_set(MAP, BIT) _bitmap_is_set(MAP, BIT) +#endif + +static inline my_bool bitmap_cmp(const MY_BITMAP *map1, const MY_BITMAP *map2) +{ + *(map1)->last_word_ptr|= (map1)->last_word_mask; + *(map2)->last_word_ptr|= (map2)->last_word_mask; + return memcmp((map1)->bitmap, (map2)->bitmap, 4*no_words_in_map((map1)))==0; +} + +#define bitmap_clear_all(MAP) \ + { memset((MAP)->bitmap, 0, 4*no_words_in_map((MAP))); } +#define bitmap_set_all(MAP) \ + (memset((MAP)->bitmap, 0xFF, 4*no_words_in_map((MAP)))) + +/** + check, set and clear a bit of interest of an integer. + + If the bit is out of range @retval -1. Otherwise + bit_is_set @return 0 or 1 reflecting the bit is set or not; + bit_do_set @return 1 (bit is set 1) + bit_do_clear @return 0 (bit is cleared to 0) +*/ + +#define bit_is_set(I,B) (sizeof(I) * CHAR_BIT > (B) ? \ + (((I) & (1ULL << (B))) == 0 ? 0 : 1) : -1) +#define bit_do_set(I,B) (sizeof(I) * CHAR_BIT > (B) ? \ + ((I) |= (1ULL << (B)), 1) : -1) +#define bit_do_clear(I,B) (sizeof(I) * CHAR_BIT > (B) ? \ + ((I) &= ~(1ULL << (B)), 0) : -1) + +#ifdef __cplusplus +} +#endif + +#endif /* _my_bitmap_h_ */ diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_charsets.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_charsets.h new file mode 100644 index 0000000..ecb0de9 --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_charsets.h @@ -0,0 +1,57 @@ +/* Copyright (C) 2008 Sun Microsystems, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* Character set configuration (hard-coded) */ +#define HAVE_CHARSET_armscii8 1 +#define HAVE_CHARSET_ascii 1 +#define HAVE_CHARSET_big5 1 +#define HAVE_CHARSET_cp1250 1 +#define HAVE_CHARSET_cp1251 1 +#define HAVE_CHARSET_cp1256 1 +#define HAVE_CHARSET_cp1257 1 +#define HAVE_CHARSET_cp850 1 +#define HAVE_CHARSET_cp852 1 +#define HAVE_CHARSET_cp866 1 +#define HAVE_CHARSET_cp932 1 +#define HAVE_CHARSET_dec8 1 +#define HAVE_CHARSET_eucjpms 1 +#define HAVE_CHARSET_euckr 1 +#define HAVE_CHARSET_gb2312 1 +#define HAVE_CHARSET_gbk 1 +#define HAVE_CHARSET_greek 1 +#define HAVE_CHARSET_hebrew 1 +#define HAVE_CHARSET_hp8 1 +#define HAVE_CHARSET_keybcs2 1 +#define HAVE_CHARSET_koi8r 1 +#define HAVE_CHARSET_koi8u 1 +#define HAVE_CHARSET_latin1 1 +#define HAVE_CHARSET_latin2 1 +#define HAVE_CHARSET_latin5 1 +#define HAVE_CHARSET_latin7 1 +#define HAVE_CHARSET_macce 1 +#define HAVE_CHARSET_macroman 1 +#define HAVE_CHARSET_sjis 1 +#define HAVE_CHARSET_swe7 1 +#define HAVE_CHARSET_tis620 1 +#define HAVE_CHARSET_ucs2 1 +#define HAVE_CHARSET_ujis 1 +#define HAVE_CHARSET_utf16 1 +#define HAVE_CHARSET_utf32 1 +#define HAVE_CHARSET_utf8mb3 1 +#define HAVE_CHARSET_utf8mb4 1 +#define HAVE_UCA_COLLATIONS 1 +#define MYSQL_DEFAULT_CHARSET_NAME "latin1" +#define MYSQL_DEFAULT_COLLATION_NAME "latin1_swedish_ci" +#define USE_MB 1 diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_config.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_config.h new file mode 100644 index 0000000..c3bab0e --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_config.h @@ -0,0 +1,295 @@ + +/* Headers we may want to use. */ +#define HAVE_ALLOCA_H 1 +#define HAVE_ARPA_INET_H 1 +#define HAVE_CRYPT_H 1 +#define HAVE_DIRENT_H 1 +#define HAVE_EXECINFO_H 1 +#define HAVE_FCNTL_H 1 +#define HAVE_FENV_H 1 +#define HAVE_FLOAT_H 1 +/* #undef HAVE_FPU_CONTROL_H */ +#define HAVE_GRP_H 1 +/* #undef HAVE_IEEEFP_H */ +#define HAVE_LIMITS_H 1 +#define HAVE_MALLOC_H 1 +#define HAVE_MEMORY_H 1 +#define HAVE_NETINET_IN_H 1 +#define HAVE_PATHS_H 1 +#define HAVE_PWD_H 1 +#define HAVE_SCHED_H 1 +/* #undef HAVE_SELECT_H */ +#define HAVE_STDDEF_H 1 +#define HAVE_STDLIB_H 1 +#define HAVE_STRINGS_H 1 +#define HAVE_STRING_H 1 +/* #undef HAVE_SYNCH_H */ +/* #undef HAVE_SYSENT_H */ +/* #undef HAVE_SYS_FPU_H */ +#define HAVE_SYS_IOCTL_H 1 +#define HAVE_SYS_IPC_H 1 +#define HAVE_SYS_MMAN_H 1 +#define HAVE_SYS_PRCTL_H 1 +#define HAVE_SYS_SELECT_H 1 +#define HAVE_SYS_SHM_H 1 +#define HAVE_SYS_SOCKET_H 1 +#define HAVE_SYS_STAT_H 1 +/* #undef HAVE_SYS_STREAM_H */ +#define HAVE_SYS_TIMEB_H 1 +#define HAVE_SYS_TYPES_H 1 +#define HAVE_SYS_UN_H 1 +#define HAVE_TERMIOS_H 1 +#define HAVE_TERMIO_H 1 +#define HAVE_UNISTD_H 1 +#define HAVE_UTIME_H 1 + +/* Functions we may want to use. */ +#define HAVE_ACCESS 1 +/* #undef HAVE_AIOWAIT */ +#define HAVE_ALARM 1 +/* #undef HAVE_ALLOCA */ +#define HAVE_BCMP 1 +/* #undef HAVE_BFILL */ +/* #undef HAVE_BMOVE */ +#define HAVE_BZERO 1 +#define HAVE_CLOCK_GETTIME 1 +/* #undef HAVE_COMPRESS */ +/* #undef HAVE_CRYPT */ +/* #undef HAVE_DLERROR */ +/* #undef HAVE_DLOPEN */ +#define HAVE_FCHMOD 1 +#define HAVE_FCNTL 1 +/* #undef HAVE_FCONVERT */ +#define HAVE_FDATASYNC 1 +/* #undef HAVE_FESETROUND */ +#define HAVE_FINITE 1 +/* #undef HAVE_FP_EXCEPT */ +#define HAVE_FSEEKO 1 +#define HAVE_FSYNC 1 +#define HAVE_GETADDRINFO 1 +#define HAVE_GETCWD 1 +#define HAVE_GETHOSTBYADDR_R 1 +#define HAVE_GETHOSTBYNAME_R 1 +/* #undef HAVE_GETHRTIME */ +#define HAVE_GETNAMEINFO 1 +#define HAVE_GETPAGESIZE 1 +#define HAVE_GETPASS 1 +/* #undef HAVE_GETPASSPHRASE */ +#define HAVE_GETPWNAM 1 +#define HAVE_GETPWUID 1 +#define HAVE_GETRLIMIT 1 +#define HAVE_GETRUSAGE 1 +#define HAVE_GETWD 1 +#define HAVE_GMTIME_R 1 +#define HAVE_INITGROUPS 1 +#define HAVE_ISNAN 1 +#define HAVE_LDIV 1 +#define HAVE_LOCALTIME_R 1 +/* #undef HAVE_LOG2 */ +#define HAVE_LONGJMP 1 +#define HAVE_LSTAT 1 +#define HAVE_MADVISE 1 +#define HAVE_DECL_MADVISE 1 +#define HAVE_MALLINFO 1 +#define HAVE_MEMCPY 1 +#define HAVE_MEMCPY 1 +#define HAVE_MEMMOVE 1 +#define HAVE_MEMMOVE 1 +#define HAVE_MKSTEMP 1 +#define HAVE_MLOCK 1 +#define HAVE_MLOCKALL 1 +#define HAVE_MMAP 1 +#define HAVE_MMAP64 1 +#define HAVE_PERROR 1 +#define HAVE_POLL 1 +#define HAVE_PREAD 1 +/* #undef HAVE_PTHREAD_ATTR_CREATE */ +/* #undef HAVE_PTHREAD_ATTR_GETSTACKSIZE */ +/* #undef HAVE_PTHREAD_ATTR_SETPRIO */ +#define HAVE_PTHREAD_ATTR_SETSCHEDPARAM 1 +#define HAVE_PTHREAD_ATTR_SETSCOPE 1 +/* #undef HAVE_PTHREAD_ATTR_SETSTACKSIZE */ +/* #undef HAVE_PTHREAD_CONDATTR_CREATE */ +/* #undef HAVE_PTHREAD_INIT */ +/* #undef HAVE_PTHREAD_KEY_DELETE */ +/* #undef HAVE_PTHREAD_KEY_DELETE */ +/* #undef HAVE_PTHREAD_KILL */ +/* #undef HAVE_PTHREAD_RWLOCK_RDLOCK */ +/* #undef HAVE_PTHREAD_SETPRIO_NP */ +#define HAVE_PTHREAD_SETSCHEDPARAM 1 +/* #undef HAVE_PTHREAD_SIGMASK */ +/* #undef HAVE_PTHREAD_THREADMASK */ +/* #undef HAVE_PTHREAD_YIELD_NP */ +#define HAVE_READDIR_R 1 +#define HAVE_READLINK 1 +#define HAVE_REALPATH 1 +#define HAVE_RENAME 1 +#define HAVE_RINT 1 +#define HAVE_SCHED_YIELD 1 +#define HAVE_SELECT 1 +/* #undef HAVE_SETFD */ +/* #undef HAVE_SETFILEPOINTER */ +#define HAVE_SIGACTION 1 +/* #undef HAVE_SIGTHREADMASK */ +#define HAVE_SIGWAIT 1 +#define HAVE_SLEEP 1 +#define HAVE_SNPRINTF 1 +#define HAVE_STPCPY 1 +#define HAVE_STRERROR 1 +/* #undef HAVE_STRLCPY */ +#define HAVE_STRNLEN 1 +#define HAVE_STRPBRK 1 +#define HAVE_STRSEP 1 +#define HAVE_STRSTR 1 +#define HAVE_STRTOK_R 1 +#define HAVE_STRTOK_R 1 +#define HAVE_STRTOL 1 +#define HAVE_STRTOLL 1 +#define HAVE_STRTOUL 1 +#define HAVE_STRTOULL 1 +/* #undef HAVE_TELL */ +/* #undef HAVE_THR_SETCONCURRENCY */ +/* #undef HAVE_THR_YIELD */ +#define HAVE_VASPRINTF 1 +#define HAVE_VSNPRINTF 1 + +/* Symbols we may use */ +#define HAVE_SYS_ERRLIST 1 +/* used by stacktrace functions */ +/* #undef HAVE_BSS_START */ + +/* Does "struct timespec" have a "sec" and "nsec" field? */ +/* #undef HAVE_TIMESPEC_TS_SEC */ + +/* Types we may use */ +#define SIZEOF_CHAR 1 +#if SIZEOF_CHAR +# define HAVE_CHAR 1 +#endif + +#define SIZEOF_CHARP 8 +#if SIZEOF_CHARP +# define HAVE_CHARP 1 +#endif + +#define SIZEOF_SHORT 2 +#if SIZEOF_SHORT +# define HAVE_SHORT 1 +#endif + +#define SIZEOF_INT 4 +#if SIZEOF_INT +# define HAVE_INT 1 +#endif + +#define SIZEOF_LONG 8 +#if SIZEOF_LONG +# define HAVE_LONG 1 +#endif + +#define SIZEOF_LONG_LONG 8 +#if SIZEOF_LONG_LONG +# define HAVE_LONG_LONG 1 +#endif + +#define SIZEOF_OFF_T 8 +#if SIZEOF_OFF_T +# define HAVE_OFF_T 1 +#endif + +#define SIZEOF_SIGSET_T 128 +#if SIZEOF_SIGSET_T +# define HAVE_SIGSET_T 1 +#endif + +#define SIZEOF_SIZE_T 8 +#if SIZEOF_SIZE_T +# define HAVE_SIZE_T 1 +#endif + +/* #undef SIZEOF_UCHAR */ +#if SIZEOF_UCHAR +# define HAVE_UCHAR 1 +#endif + +#define SIZEOF_UINT 4 +#if SIZEOF_UINT +# define HAVE_UINT 1 +#endif + +#define SIZEOF_ULONG 8 +#if SIZEOF_ULONG +# define HAVE_ULONG 1 +#endif + +/* #undef SIZEOF_INT8 */ +#if SIZEOF_INT8 +# define HAVE_INT8 1 +#endif +/* #undef SIZEOF_UINT8 */ +#if SIZEOF_UINT8 +# define HAVE_UINT8 1 +#endif + +/* #undef SIZEOF_INT16 */ +#if SIZEOF_INT16 +# define HAVE_INT16 1 +#endif +/* #undef SIZEOF_UINT16 */ +#if SIZEOF_UINT16 +# define HAVE_UINT16 1 +#endif + +/* #undef SIZEOF_INT32 */ +#if SIZEOF_INT32 +# define HAVE_INT32 1 +#endif +/* #undef SIZEOF_UINT32 */ +#if SIZEOF_UINT32 +# define HAVE_UINT32 1 +#endif +/* #undef SIZEOF_U_INT32_T */ +#if SIZEOF_U_INT32_T +# define HAVE_U_INT32_T 1 +#endif + +/* #undef SIZEOF_INT64 */ +#if SIZEOF_INT64 +# define HAVE_INT64 1 +#endif +/* #undef SIZEOF_UINT64 */ +#if SIZEOF_UINT64 +# define HAVE_UINT64 1 +#endif + +#define SIZEOF_SOCKLEN_T 4 +#if SIZEOF_SOCKLEN_T +# define HAVE_SOCKLEN_T 1 +#endif + +/* XXX mysql_client_test uses this -- rip it out, please! */ +#define MAX_INDEXES 64 + +#define QSORT_TYPE_IS_VOID 1 +#define RETQSORTTYPE void + +#define SIGNAL_RETURN_TYPE_IS_VOID 1 +#define RETSIGTYPE void + +/* #undef WORDS_BIGENDIAN */ + +/* Define to `__inline__' or `__inline' if that's what the C compiler calls + it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +# define inline inline +#endif + +#define TIME_WITH_SYS_TIME 1 + +#define STACK_DIRECTION -1 + +#define SHAREDIR "/usr/local/share/mysql" +#define THREAD 1 +#define THREAD_SAFE_CLIENT 1 + +#define DEFAULT_CHARSET_HOME "/usr/local" diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_config.h.in b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_config.h.in new file mode 100644 index 0000000..58282d2 --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_config.h.in @@ -0,0 +1,295 @@ + +/* Headers we may want to use. */ +#cmakedefine HAVE_ALLOCA_H 1 +#cmakedefine HAVE_ARPA_INET_H 1 +#cmakedefine HAVE_CRYPT_H 1 +#cmakedefine HAVE_DIRENT_H 1 +#cmakedefine HAVE_EXECINFO_H 1 +#cmakedefine HAVE_FCNTL_H 1 +#cmakedefine HAVE_FENV_H 1 +#cmakedefine HAVE_FLOAT_H 1 +#cmakedefine HAVE_FPU_CONTROL_H 1 +#cmakedefine HAVE_GRP_H 1 +#cmakedefine HAVE_IEEEFP_H 1 +#cmakedefine HAVE_LIMITS_H 1 +#cmakedefine HAVE_MALLOC_H 1 +#cmakedefine HAVE_MEMORY_H 1 +#cmakedefine HAVE_NETINET_IN_H 1 +#cmakedefine HAVE_PATHS_H 1 +#cmakedefine HAVE_PWD_H 1 +#cmakedefine HAVE_SCHED_H 1 +#cmakedefine HAVE_SELECT_H 1 +#cmakedefine HAVE_STDDEF_H 1 +#cmakedefine HAVE_STDLIB_H 1 +#cmakedefine HAVE_STRINGS_H 1 +#cmakedefine HAVE_STRING_H 1 +#cmakedefine HAVE_SYNCH_H 1 +#cmakedefine HAVE_SYSENT_H 1 +#cmakedefine HAVE_SYS_FPU_H 1 +#cmakedefine HAVE_SYS_IOCTL_H 1 +#cmakedefine HAVE_SYS_IPC_H 1 +#cmakedefine HAVE_SYS_MMAN_H 1 +#cmakedefine HAVE_SYS_PRCTL_H 1 +#cmakedefine HAVE_SYS_SELECT_H 1 +#cmakedefine HAVE_SYS_SHM_H 1 +#cmakedefine HAVE_SYS_SOCKET_H 1 +#cmakedefine HAVE_SYS_STAT_H 1 +#cmakedefine HAVE_SYS_STREAM_H 1 +#cmakedefine HAVE_SYS_TIMEB_H 1 +#cmakedefine HAVE_SYS_TYPES_H 1 +#cmakedefine HAVE_SYS_UN_H 1 +#cmakedefine HAVE_TERMIOS_H 1 +#cmakedefine HAVE_TERMIO_H 1 +#cmakedefine HAVE_UNISTD_H 1 +#cmakedefine HAVE_UTIME_H 1 + +/* Functions we may want to use. */ +#cmakedefine HAVE_ACCESS 1 +#cmakedefine HAVE_AIOWAIT 1 +#cmakedefine HAVE_ALARM 1 +#cmakedefine HAVE_ALLOCA 1 +#cmakedefine HAVE_BCMP 1 +#cmakedefine HAVE_BFILL 1 +#cmakedefine HAVE_BMOVE 1 +#cmakedefine HAVE_BZERO 1 +#cmakedefine HAVE_CLOCK_GETTIME 1 +#cmakedefine HAVE_COMPRESS 1 +#cmakedefine HAVE_CRYPT 1 +#cmakedefine HAVE_DLERROR 1 +#cmakedefine HAVE_DLOPEN 1 +#cmakedefine HAVE_FCHMOD 1 +#cmakedefine HAVE_FCNTL 1 +#cmakedefine HAVE_FCONVERT 1 +#cmakedefine HAVE_FDATASYNC 1 +#cmakedefine HAVE_FESETROUND 1 +#cmakedefine HAVE_FINITE 1 +#cmakedefine HAVE_FP_EXCEPT 1 +#cmakedefine HAVE_FSEEKO 1 +#cmakedefine HAVE_FSYNC 1 +#cmakedefine HAVE_GETADDRINFO 1 +#cmakedefine HAVE_GETCWD 1 +#cmakedefine HAVE_GETHOSTBYADDR_R 1 +#cmakedefine HAVE_GETHOSTBYNAME_R 1 +#cmakedefine HAVE_GETHRTIME 1 +#cmakedefine HAVE_GETNAMEINFO 1 +#cmakedefine HAVE_GETPAGESIZE 1 +#cmakedefine HAVE_GETPASS 1 +#cmakedefine HAVE_GETPASSPHRASE 1 +#cmakedefine HAVE_GETPWNAM 1 +#cmakedefine HAVE_GETPWUID 1 +#cmakedefine HAVE_GETRLIMIT 1 +#cmakedefine HAVE_GETRUSAGE 1 +#cmakedefine HAVE_GETWD 1 +#cmakedefine HAVE_GMTIME_R 1 +#cmakedefine HAVE_INITGROUPS 1 +#cmakedefine HAVE_ISNAN 1 +#cmakedefine HAVE_LDIV 1 +#cmakedefine HAVE_LOCALTIME_R 1 +#cmakedefine HAVE_LOG2 1 +#cmakedefine HAVE_LONGJMP 1 +#cmakedefine HAVE_LSTAT 1 +#cmakedefine HAVE_MADVISE 1 +#cmakedefine HAVE_DECL_MADVISE 1 +#cmakedefine HAVE_MALLINFO 1 +#cmakedefine HAVE_MEMCPY 1 +#cmakedefine HAVE_MEMCPY 1 +#cmakedefine HAVE_MEMMOVE 1 +#cmakedefine HAVE_MEMMOVE 1 +#cmakedefine HAVE_MKSTEMP 1 +#cmakedefine HAVE_MLOCK 1 +#cmakedefine HAVE_MLOCKALL 1 +#cmakedefine HAVE_MMAP 1 +#cmakedefine HAVE_MMAP64 1 +#cmakedefine HAVE_PERROR 1 +#cmakedefine HAVE_POLL 1 +#cmakedefine HAVE_PREAD 1 +#cmakedefine HAVE_PTHREAD_ATTR_CREATE 1 +#cmakedefine HAVE_PTHREAD_ATTR_GETSTACKSIZE 1 +#cmakedefine HAVE_PTHREAD_ATTR_SETPRIO 1 +#cmakedefine HAVE_PTHREAD_ATTR_SETSCHEDPARAM 1 +#cmakedefine HAVE_PTHREAD_ATTR_SETSCOPE 1 +#cmakedefine HAVE_PTHREAD_ATTR_SETSTACKSIZE 1 +#cmakedefine HAVE_PTHREAD_CONDATTR_CREATE 1 +#cmakedefine HAVE_PTHREAD_INIT 1 +#cmakedefine HAVE_PTHREAD_KEY_DELETE 1 +#cmakedefine HAVE_PTHREAD_KEY_DELETE 1 +#cmakedefine HAVE_PTHREAD_KILL 1 +#cmakedefine HAVE_PTHREAD_RWLOCK_RDLOCK 1 +#cmakedefine HAVE_PTHREAD_SETPRIO_NP 1 +#cmakedefine HAVE_PTHREAD_SETSCHEDPARAM 1 +#cmakedefine HAVE_PTHREAD_SIGMASK 1 +#cmakedefine HAVE_PTHREAD_THREADMASK 1 +#cmakedefine HAVE_PTHREAD_YIELD_NP 1 +#cmakedefine HAVE_READDIR_R 1 +#cmakedefine HAVE_READLINK 1 +#cmakedefine HAVE_REALPATH 1 +#cmakedefine HAVE_RENAME 1 +#cmakedefine HAVE_RINT 1 +#cmakedefine HAVE_SCHED_YIELD 1 +#cmakedefine HAVE_SELECT 1 +#cmakedefine HAVE_SETFD 1 +#cmakedefine HAVE_SETFILEPOINTER 1 +#cmakedefine HAVE_SIGACTION 1 +#cmakedefine HAVE_SIGTHREADMASK 1 +#cmakedefine HAVE_SIGWAIT 1 +#cmakedefine HAVE_SLEEP 1 +#cmakedefine HAVE_SNPRINTF 1 +#cmakedefine HAVE_STPCPY 1 +#cmakedefine HAVE_STRERROR 1 +#cmakedefine HAVE_STRLCPY 1 +#cmakedefine HAVE_STRNLEN 1 +#cmakedefine HAVE_STRPBRK 1 +#cmakedefine HAVE_STRSEP 1 +#cmakedefine HAVE_STRSTR 1 +#cmakedefine HAVE_STRTOK_R 1 +#cmakedefine HAVE_STRTOK_R 1 +#cmakedefine HAVE_STRTOL 1 +#cmakedefine HAVE_STRTOLL 1 +#cmakedefine HAVE_STRTOUL 1 +#cmakedefine HAVE_STRTOULL 1 +#cmakedefine HAVE_TELL 1 +#cmakedefine HAVE_THR_SETCONCURRENCY 1 +#cmakedefine HAVE_THR_YIELD 1 +#cmakedefine HAVE_VASPRINTF 1 +#cmakedefine HAVE_VSNPRINTF 1 + +/* Symbols we may use */ +#cmakedefine HAVE_SYS_ERRLIST 1 +/* used by stacktrace functions */ +#cmakedefine HAVE_BSS_START 1 + +/* Does "struct timespec" have a "sec" and "nsec" field? */ +#cmakedefine HAVE_TIMESPEC_TS_SEC 1 + +/* Types we may use */ +#cmakedefine SIZEOF_CHAR @SIZEOF_CHAR@ +#if SIZEOF_CHAR +# define HAVE_CHAR 1 +#endif + +#cmakedefine SIZEOF_CHARP @SIZEOF_CHARP@ +#if SIZEOF_CHARP +# define HAVE_CHARP 1 +#endif + +#cmakedefine SIZEOF_SHORT @SIZEOF_SHORT@ +#if SIZEOF_SHORT +# define HAVE_SHORT 1 +#endif + +#cmakedefine SIZEOF_INT @SIZEOF_INT@ +#if SIZEOF_INT +# define HAVE_INT 1 +#endif + +#cmakedefine SIZEOF_LONG @SIZEOF_LONG@ +#if SIZEOF_LONG +# define HAVE_LONG 1 +#endif + +#cmakedefine SIZEOF_LONG_LONG @SIZEOF_LONG_LONG@ +#if SIZEOF_LONG_LONG +# define HAVE_LONG_LONG 1 +#endif + +#cmakedefine SIZEOF_OFF_T @SIZEOF_OFF_T@ +#if SIZEOF_OFF_T +# define HAVE_OFF_T 1 +#endif + +#cmakedefine SIZEOF_SIGSET_T @SIZEOF_SIGSET_T@ +#if SIZEOF_SIGSET_T +# define HAVE_SIGSET_T 1 +#endif + +#cmakedefine SIZEOF_SIZE_T @SIZEOF_SIZE_T@ +#if SIZEOF_SIZE_T +# define HAVE_SIZE_T 1 +#endif + +#cmakedefine SIZEOF_UCHAR @SIZEOF_UCHAR@ +#if SIZEOF_UCHAR +# define HAVE_UCHAR 1 +#endif + +#cmakedefine SIZEOF_UINT @SIZEOF_UINT@ +#if SIZEOF_UINT +# define HAVE_UINT 1 +#endif + +#cmakedefine SIZEOF_ULONG @SIZEOF_ULONG@ +#if SIZEOF_ULONG +# define HAVE_ULONG 1 +#endif + +#cmakedefine SIZEOF_INT8 @SIZEOF_INT8@ +#if SIZEOF_INT8 +# define HAVE_INT8 1 +#endif +#cmakedefine SIZEOF_UINT8 @SIZEOF_UINT8@ +#if SIZEOF_UINT8 +# define HAVE_UINT8 1 +#endif + +#cmakedefine SIZEOF_INT16 @SIZEOF_INT16@ +#if SIZEOF_INT16 +# define HAVE_INT16 1 +#endif +#cmakedefine SIZEOF_UINT16 @SIZEOF_UINT16@ +#if SIZEOF_UINT16 +# define HAVE_UINT16 1 +#endif + +#cmakedefine SIZEOF_INT32 @SIZEOF_INT32@ +#if SIZEOF_INT32 +# define HAVE_INT32 1 +#endif +#cmakedefine SIZEOF_UINT32 @SIZEOF_UINT32@ +#if SIZEOF_UINT32 +# define HAVE_UINT32 1 +#endif +#cmakedefine SIZEOF_U_INT32_T @SIZEOF_U_INT32_T@ +#if SIZEOF_U_INT32_T +# define HAVE_U_INT32_T 1 +#endif + +#cmakedefine SIZEOF_INT64 @SIZEOF_INT64@ +#if SIZEOF_INT64 +# define HAVE_INT64 1 +#endif +#cmakedefine SIZEOF_UINT64 @SIZEOF_UINT64@ +#if SIZEOF_UINT64 +# define HAVE_UINT64 1 +#endif + +#cmakedefine SIZEOF_SOCKLEN_T @SIZEOF_SOCKLEN_T@ +#if SIZEOF_SOCKLEN_T +# define HAVE_SOCKLEN_T 1 +#endif + +/* XXX mysql_client_test uses this -- rip it out, please! */ +#define MAX_INDEXES 64 + +#cmakedefine QSORT_TYPE_IS_VOID 1 +#define RETQSORTTYPE @RETQSORTTYPE@ + +#cmakedefine SIGNAL_RETURN_TYPE_IS_VOID 1 +#define RETSIGTYPE @RETSIGTYPE@ + +#cmakedefine WORDS_BIGENDIAN 1 + +/* Define to `__inline__' or `__inline' if that's what the C compiler calls + it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +# define inline @C_INLINE@ +#endif + +#define TIME_WITH_SYS_TIME 1 + +#define STACK_DIRECTION -1 + +#define SHAREDIR "@SHAREDIR@" +#define THREAD 1 +#define THREAD_SAFE_CLIENT 1 + +#define DEFAULT_CHARSET_HOME "@DEFAULT_CHARSET_HOME@" diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_dbug.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_dbug.h new file mode 100644 index 0000000..c4a2f88 --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_dbug.h @@ -0,0 +1,140 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef _dbug_h +#define _dbug_h + +#ifdef __cplusplus +extern "C" { +#endif +#if !defined(DBUG_OFF) && !defined(_lint) + +struct _db_stack_frame_ { + const char *func; /* function name of the previous stack frame */ + const char *file; /* filename of the function of previous frame */ + uint level; /* this nesting level, highest bit enables tracing */ + struct _db_stack_frame_ *prev; /* pointer to the previous frame */ +}; + +struct _db_code_state_; +extern my_bool _dbug_on_; +extern my_bool _db_keyword_(struct _db_code_state_ *, const char *, int); +extern int _db_explain_(struct _db_code_state_ *cs, char *buf, size_t len); +extern int _db_explain_init_(char *buf, size_t len); +extern int _db_is_pushed_(void); +extern void _db_setjmp_(void); +extern void _db_longjmp_(void); +extern void _db_process_(const char *name); +extern void _db_push_(const char *control); +extern void _db_pop_(void); +extern void _db_set_(const char *control); +extern void _db_set_init_(const char *control); +extern void _db_enter_(const char *_func_, const char *_file_, uint _line_, + struct _db_stack_frame_ *_stack_frame_); +extern void _db_return_(uint _line_, struct _db_stack_frame_ *_stack_frame_); +extern void _db_pargs_(uint _line_,const char *keyword); +extern void _db_doprnt_ _VARARGS((const char *format,...)) + ATTRIBUTE_FORMAT(printf, 1, 2); +extern void _db_dump_(uint _line_,const char *keyword, + const unsigned char *memory, size_t length); +extern void _db_end_(void); +extern void _db_lock_file_(void); +extern void _db_unlock_file_(void); +extern FILE *_db_fp_(void); +extern void _db_flush_(); + +#define DBUG_ENTER(a) struct _db_stack_frame_ _db_stack_frame_; \ + _db_enter_ (a,__FILE__,__LINE__,&_db_stack_frame_) +#define DBUG_LEAVE _db_return_ (__LINE__, &_db_stack_frame_) +#define DBUG_RETURN(a1) do {DBUG_LEAVE; return(a1);} while(0) +#define DBUG_VOID_RETURN do {DBUG_LEAVE; return;} while(0) +#define DBUG_EXECUTE(keyword,a1) \ + do {if (_db_keyword_(0, (keyword), 0)) { a1 }} while(0) +#define DBUG_EXECUTE_IF(keyword,a1) \ + do {if (_db_keyword_(0, (keyword), 1)) { a1 }} while(0) +#define DBUG_EVALUATE(keyword,a1,a2) \ + (_db_keyword_(0,(keyword), 0) ? (a1) : (a2)) +#define DBUG_EVALUATE_IF(keyword,a1,a2) \ + (_db_keyword_(0,(keyword), 1) ? (a1) : (a2)) +#define DBUG_PRINT(keyword,arglist) \ + do {_db_pargs_(__LINE__,keyword); _db_doprnt_ arglist;} while(0) +#define DBUG_PUSH(a1) _db_push_ (a1) +#define DBUG_POP() _db_pop_ () +#define DBUG_SET(a1) _db_set_ (a1) +#define DBUG_SET_INITIAL(a1) _db_set_init_ (a1) +#define DBUG_PROCESS(a1) _db_process_(a1) +#define DBUG_FILE _db_fp_() +#define DBUG_SETJMP(a1) (_db_setjmp_ (), setjmp (a1)) +#define DBUG_LONGJMP(a1,a2) (_db_longjmp_ (), longjmp (a1, a2)) +#define DBUG_DUMP(keyword,a1,a2) _db_dump_(__LINE__,keyword,a1,a2) +#define DBUG_END() _db_end_ () +#define DBUG_LOCK_FILE _db_lock_file_() +#define DBUG_UNLOCK_FILE _db_unlock_file_() +#define DBUG_ASSERT(A) assert(A) +#define DBUG_EXPLAIN(buf,len) _db_explain_(0, (buf),(len)) +#define DBUG_EXPLAIN_INITIAL(buf,len) _db_explain_init_((buf),(len)) +#define DEBUGGER_OFF do { _dbug_on_= 0; } while(0) +#define DEBUGGER_ON do { _dbug_on_= 1; } while(0) +#define IF_DBUG(A) A +#ifndef __WIN__ +#define DBUG_ABORT() (_db_flush_(), abort()) +#else +/* + Avoid popup with abort/retry/ignore buttons. When BUG#31745 is fixed we can + call abort() instead of _exit(3) (now it would cause a "test signal" popup). +*/ +#include +#define DBUG_ABORT() (_db_flush_(),\ + (void)_CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE),\ + (void)_CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDERR),\ + _exit(3)) +#endif + +#else /* No debugger */ + +#define DBUG_ENTER(a1) +#define DBUG_LEAVE +#define DBUG_RETURN(a1) do { return(a1); } while(0) +#define DBUG_VOID_RETURN do { return; } while(0) +#define DBUG_EXECUTE(keyword,a1) do { } while(0) +#define DBUG_EXECUTE_IF(keyword,a1) do { } while(0) +#define DBUG_EVALUATE(keyword,a1,a2) (a2) +#define DBUG_EVALUATE_IF(keyword,a1,a2) (a2) +#define DBUG_PRINT(keyword,arglist) do { } while(0) +#define DBUG_PUSH(a1) do { } while(0) +#define DBUG_SET(a1) do { } while(0) +#define DBUG_SET_INITIAL(a1) do { } while(0) +#define DBUG_POP() do { } while(0) +#define DBUG_PROCESS(a1) do { } while(0) +#define DBUG_SETJMP(a1) setjmp(a1) +#define DBUG_LONGJMP(a1) longjmp(a1) +#define DBUG_DUMP(keyword,a1,a2) do { } while(0) +#define DBUG_END() do { } while(0) +#define DBUG_ASSERT(A) do { } while(0) +#define DBUG_LOCK_FILE do { } while(0) +#define DBUG_FILE (stderr) +#define DBUG_UNLOCK_FILE do { } while(0) +#define DBUG_EXPLAIN(buf,len) +#define DBUG_EXPLAIN_INITIAL(buf,len) +#define DEBUGGER_OFF do { } while(0) +#define DEBUGGER_ON do { } while(0) +#define IF_DBUG(A) +#define DBUG_ABORT() abort() + +#endif +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_dir.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_dir.h new file mode 100644 index 0000000..90d708a --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_dir.h @@ -0,0 +1,109 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef _my_dir_h +#define _my_dir_h +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef MY_DIR_H +#define MY_DIR_H + +#include + + /* Defines for my_dir and my_stat */ + +#define MY_S_IFMT S_IFMT /* type of file */ +#define MY_S_IFDIR S_IFDIR /* directory */ +#define MY_S_IFCHR S_IFCHR /* character special */ +#define MY_S_IFBLK S_IFBLK /* block special */ +#define MY_S_IFREG S_IFREG /* regular */ +#define MY_S_IFIFO S_IFIFO /* fifo */ +#define MY_S_ISUID S_ISUID /* set user id on execution */ +#define MY_S_ISGID S_ISGID /* set group id on execution */ +#define MY_S_ISVTX S_ISVTX /* save swapped text even after use */ +#define MY_S_IREAD S_IREAD /* read permission, owner */ +#define MY_S_IWRITE S_IWRITE /* write permission, owner */ +#define MY_S_IEXEC S_IEXEC /* execute/search permission, owner */ + +#define MY_S_ISDIR(m) (((m) & MY_S_IFMT) == MY_S_IFDIR) +#define MY_S_ISCHR(m) (((m) & MY_S_IFMT) == MY_S_IFCHR) +#define MY_S_ISBLK(m) (((m) & MY_S_IFMT) == MY_S_IFBLK) +#define MY_S_ISREG(m) (((m) & MY_S_IFMT) == MY_S_IFREG) +#define MY_S_ISFIFO(m) (((m) & MY_S_IFMT) == MY_S_IFIFO) + +#define MY_DONT_SORT 512 /* my_lib; Don't sort files */ +#define MY_WANT_STAT 1024 /* my_lib; stat files */ + + /* typedefs for my_dir & my_stat */ + +#ifdef USE_MY_STAT_STRUCT + +typedef struct my_stat +{ + dev_t st_dev; /* major & minor device numbers */ + ino_t st_ino; /* inode number */ + ushort st_mode; /* file permissons (& suid sgid .. bits) */ + short st_nlink; /* number of links to file */ + ushort st_uid; /* user id */ + ushort st_gid; /* group id */ + dev_t st_rdev; /* more major & minor device numbers (???) */ + off_t st_size; /* size of file */ + time_t st_atime; /* time for last read */ + time_t st_mtime; /* time for last contens modify */ + time_t st_ctime; /* time for last inode or contents modify */ +} MY_STAT; + +#else + +#if(_MSC_VER) +#define MY_STAT struct _stati64 /* 64 bit file size */ +#else +#define MY_STAT struct stat /* Orginal struct have what we need */ +#endif + +#endif /* USE_MY_STAT_STRUCT */ + +/* Struct describing one file returned from my_dir */ +typedef struct fileinfo +{ + char *name; + MY_STAT *mystat; +} FILEINFO; + +typedef struct st_my_dir /* Struct returned from my_dir */ +{ + /* + These members are just copies of parts of DYNAMIC_ARRAY structure, + which is allocated right after the end of MY_DIR structure (MEM_ROOT + for storing names is also resides there). We've left them here because + we don't want to change code that uses my_dir. + */ + struct fileinfo *dir_entry; + uint number_off_files; +} MY_DIR; + +extern MY_DIR *my_dir(const char *path,myf MyFlags); +extern void my_dirend(MY_DIR *buffer); +extern MY_STAT *my_stat(const char *path, MY_STAT *stat_area, myf my_flags); +extern int my_fstat(int filenr, MY_STAT *stat_area, myf MyFlags); + +#endif /* MY_DIR_H */ + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_getopt.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_getopt.h new file mode 100644 index 0000000..7cbad60 --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_getopt.h @@ -0,0 +1,86 @@ +/* Copyright (C) 2002-2004 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef _my_getopt_h +#define _my_getopt_h + +C_MODE_START + +#define GET_NO_ARG 1 +#define GET_BOOL 2 +#define GET_INT 3 +#define GET_UINT 4 +#define GET_LONG 5 +#define GET_ULONG 6 +#define GET_LL 7 +#define GET_ULL 8 +#define GET_STR 9 +#define GET_STR_ALLOC 10 +#define GET_DISABLED 11 +#define GET_ENUM 12 +#define GET_SET 13 +#define GET_DOUBLE 14 + +#define GET_ASK_ADDR 128 +#define GET_TYPE_MASK 127 + +enum get_opt_arg_type { NO_ARG, OPT_ARG, REQUIRED_ARG }; + +struct st_typelib; + +struct my_option +{ + const char *name; /* Name of the option */ + int id; /* unique id or short option */ + const char *comment; /* option comment, for autom. --help */ + uchar **value; /* The variable value */ + uchar **u_max_value; /* The user def. max variable value */ + struct st_typelib *typelib; /* Pointer to possible values */ + ulong var_type; + enum get_opt_arg_type arg_type; + longlong def_value; /* Default value */ + longlong min_value; /* Min allowed value */ + longlong max_value; /* Max allowed value */ + longlong sub_size; /* Subtract this from given value */ + long block_size; /* Value should be a mult. of this */ + void *app_type; /* To be used by an application */ +}; + +typedef my_bool (* my_get_one_option) (int, const struct my_option *, char * ); +typedef void (* my_error_reporter) (enum loglevel level, const char *format, ... ); + +extern char *disabled_my_option; +extern my_bool my_getopt_print_errors; +extern my_bool my_getopt_skip_unknown; +extern my_error_reporter my_getopt_error_reporter; + +extern int handle_options (int *argc, char ***argv, + const struct my_option *longopts, my_get_one_option); +extern void my_cleanup_options(const struct my_option *options); +extern void my_print_help(const struct my_option *options); +extern void my_print_variables(const struct my_option *options); +extern void my_getopt_register_get_addr(uchar ** (*func_addr)(const char *, uint, + const struct my_option *, int *)); + +ulonglong getopt_ull_limit_value(ulonglong num, const struct my_option *optp, + my_bool *fix); +longlong getopt_ll_limit_value(longlong, const struct my_option *, + my_bool *fix); +my_bool getopt_compare_strings(const char *s, const char *t, uint length); + +C_MODE_END + +#endif /* _my_getopt_h */ + diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_global.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_global.h new file mode 100644 index 0000000..131507c --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_global.h @@ -0,0 +1,1616 @@ +/* Copyright (C) 2000-2003 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* This is the include file that should be included 'first' in every C file. */ + +#ifndef _global_h +#define _global_h + +/* + InnoDB depends on some MySQL internals which other plugins should not + need. This is because of InnoDB's foreign key support, "safe" binlog + truncation, and other similar legacy features. + + We define accessors for these internals unconditionally, but do not + expose them in mysql/plugin.h. They are declared in ha_innodb.h for + InnoDB's use. +*/ +#define INNODB_COMPATIBILITY_HOOKS + +#ifdef __CYGWIN__ +/* We use a Unix API, so pretend it's not Windows */ +#undef WIN +#undef WIN32 +#undef _WIN +#undef _WIN32 +#undef _WIN64 +#undef __WIN__ +#undef __WIN32__ +#define HAVE_ERRNO_AS_DEFINE +#endif /* __CYGWIN__ */ + +#if defined(__QNXNTO__) && !defined(FD_SETSIZE) +#define FD_SETSIZE 1024 /* Max number of file descriptor bits in + fd_set, used when calling 'select' + Must be defined before including + "sys/select.h" and "sys/time.h" + */ +#endif + + +/* to make command line shorter we'll define USE_PRAGMA_INTERFACE here */ +#ifdef USE_PRAGMA_IMPLEMENTATION +#define USE_PRAGMA_INTERFACE +#endif + +#if defined(i386) && !defined(__i386__) +#define __i386__ +#endif + +/* Macros to make switching between C and C++ mode easier */ +#ifdef __cplusplus +#define C_MODE_START extern "C" { +#define C_MODE_END } +#define STATIC_CAST(TYPE) static_cast +#else +#define C_MODE_START +#define C_MODE_END +#define STATIC_CAST(TYPE) (TYPE) +#endif + +#if defined(_WIN32) || defined(_WIN64) || defined(__WIN32__) || defined(WIN32) +#include +#else +#include +#if defined(__cplusplus) && defined(inline) +#undef inline /* fix configure problem */ +#endif +#endif /* _WIN32... */ + +#include + +/* Make it easier to add conditional code for windows */ +#ifdef __WIN__ +#define IF_WIN(A,B) (A) +#else +#define IF_WIN(A,B) (B) +#endif + +#ifndef EMBEDDED_LIBRARY +#ifdef WITH_NDB_BINLOG +#define HAVE_NDB_BINLOG 1 +#endif +#endif /* !EMBEDDED_LIBRARY */ + +#ifndef EMBEDDED_LIBRARY +#define HAVE_REPLICATION +#define HAVE_EXTERNAL_CLIENT +#endif + +/* Some defines to avoid ifdefs in the code */ +#ifndef NETWARE_YIELD +#define NETWARE_YIELD +#define NETWARE_SET_SCREEN_MODE(A) +#endif + +/* Workaround for _LARGE_FILES and _LARGE_FILE_API incompatibility on AIX */ +#if defined(_AIX) && defined(_LARGE_FILE_API) +#undef _LARGE_FILE_API +#endif + +/* + The macros below are used to allow build of Universal/fat binaries of + MySQL and MySQL applications under darwin. +*/ +#if defined(__APPLE__) && defined(__MACH__) +# undef SIZEOF_CHARP +# undef SIZEOF_SHORT +# undef SIZEOF_INT +# undef SIZEOF_LONG +# undef SIZEOF_LONG_LONG +# undef SIZEOF_OFF_T +# undef WORDS_BIGENDIAN +# define SIZEOF_SHORT 2 +# define SIZEOF_INT 4 +# define SIZEOF_LONG_LONG 8 +# define SIZEOF_OFF_T 8 +# if defined(__i386__) || defined(__ppc__) +# define SIZEOF_CHARP 4 +# define SIZEOF_LONG 4 +# elif defined(__x86_64__) || defined(__ppc64__) +# define SIZEOF_CHARP 8 +# define SIZEOF_LONG 8 +# else +# error Building FAT binary for an unknown architecture. +# endif +# if defined(__ppc__) || defined(__ppc64__) +# define WORDS_BIGENDIAN +# endif +#endif /* defined(__APPLE__) && defined(__MACH__) */ + + +/* + The macros below are borrowed from include/linux/compiler.h in the + Linux kernel. Use them to indicate the likelyhood of the truthfulness + of a condition. This serves two purposes - newer versions of gcc will be + able to optimize for branch predication, which could yield siginficant + performance gains in frequently executed sections of the code, and the + other reason to use them is for documentation +*/ + +#if !defined(__GNUC__) || (__GNUC__ == 2 && __GNUC_MINOR__ < 96) +#define __builtin_expect(x, expected_value) (x) +#endif + +/** + The semantics of builtin_expect() are that + 1) its two arguments are long + 2) it's likely that they are == + Those of our likely(x) are that x can be bool/int/longlong/pointer. +*/ +#define likely(x) __builtin_expect(((x) != 0),1) +#define unlikely(x) __builtin_expect(((x) != 0),0) + +/* + The macros below are useful in optimising places where it has been + discovered that cache misses stall the process and where a prefetch + of the cache line can improve matters. This is available in GCC 3.1.1 + and later versions. + PREFETCH_READ says that addr is going to be used for reading and that + it is to be kept in caches if possible for a while + PREFETCH_WRITE also says that the item to be cached is likely to be + updated. + The *LOCALITY scripts are also available for experimentation purposes + mostly and should only be used if they are verified to improve matters. + For more input see GCC manual (available in GCC 3.1.1 and later) +*/ + +#if (__GNUC__ > 3) || (__GNUC__ == 3 && __GNUC_MINOR > 10) +#define PREFETCH_READ(addr) __builtin_prefetch(addr, 0, 3) +#define PREFETCH_WRITE(addr) \ + __builtin_prefetch(addr, 1, 3) +#define PREFETCH_READ_LOCALITY(addr, locality) \ + __builtin_prefetch(addr, 0, locality) +#define PREFETCH_WRITE_LOCALITY(addr, locality) \ + __builtin_prefetch(addr, 1, locality) +#else +#define PREFETCH_READ(addr) +#define PREFETCH_READ_LOCALITY(addr, locality) +#define PREFETCH_WRITE(addr) +#define PREFETCH_WRITE_LOCALITY(addr, locality) +#endif + +/* + The following macro is used to ensure that code often used in most + SQL statements and definitely for parts of the SQL processing are + kept in a code segment by itself. This has the advantage that the + risk of common code being overlapping in caches of the CPU is less. + This can be a cause of big performance problems. + Routines should be put in this category with care and when they are + put there one should also strive to make as much of the error handling + as possible (or uncommon code of the routine) to execute in a + separate method to avoid moving to much code to this code segment. + + It is very easy to use, simply add HOT_METHOD at the end of the + function declaration. + For more input see GCC manual (available in GCC 2.95 and later) +*/ + +#if (__GNUC__ > 2) || (__GNUC__ == 2 && __GNUC_MINOR > 94) +#define HOT_METHOD \ + __attribute__ ((section ("hot_code_section"))) +#else +#define HOT_METHOD +#endif + +/* + The following macro is used to ensure that popular global variables + are located next to each other to avoid that they contend for the + same cache lines. + + It is very easy to use, simply add HOT_DATA at the end of the declaration + of the variable, the variable must be initialised because of the way + that linker works so a declaration using HOT_DATA should look like: + uint global_hot_data HOT_DATA = 0; + For more input see GCC manual (available in GCC 2.95 and later) +*/ + +#if (__GNUC__ > 2) || (__GNUC__ == 2 && __GNUC_MINOR > 94) +#define HOT_DATA \ + __attribute__ ((section ("hot_data_section"))) +#else +#define HOT_DATA +#endif + +/* + now let's figure out if inline functions are supported + autoconf defines 'inline' to be empty, if not +*/ +#define inline_test_1(X) X ## 1 +#define inline_test_2(X) inline_test_1(X) +#if inline_test_2(inline) != 1 +#define HAVE_INLINE +#endif +#undef inline_test_2 +#undef inline_test_1 +/* helper macro for "instantiating" inline functions */ +#define STATIC_INLINE static inline + +/* + The following macros are used to control inlining a bit more than + usual. These macros are used to ensure that inlining always or + never occurs (independent of compilation mode). + For more input see GCC manual (available in GCC 3.1.1 and later) +*/ + +#if (__GNUC__ > 3) || (__GNUC__ == 3 && __GNUC_MINOR > 10) +#define ALWAYS_INLINE __attribute__ ((always_inline)) +#define NEVER_INLINE __attribute__ ((noinline)) +#else +#define ALWAYS_INLINE +#define NEVER_INLINE +#endif + + +/* Fix problem with S_ISLNK() on Linux */ +#if defined(TARGET_OS_LINUX) || defined(__GLIBC__) +#undef _GNU_SOURCE +#define _GNU_SOURCE 1 +#endif + +/* + Temporary solution to solve bug#7156. Include "sys/types.h" before + the thread headers, else the function madvise() will not be defined +*/ +#if defined(HAVE_SYS_TYPES_H) && ( defined(sun) || defined(__sun) ) +#include +#endif + +/* The client defines this to avoid all thread code */ +#if defined(UNDEF_THREADS_HACK) +#undef THREAD +#undef HAVE_LINUXTHREADS +#undef HAVE_NPTL +#endif + +#ifdef HAVE_THREADS_WITHOUT_SOCKETS +/* MIT pthreads does not work with unix sockets */ +#undef HAVE_SYS_UN_H +#endif + +#define __EXTENSIONS__ 1 /* We want some extension */ +#ifndef __STDC_EXT__ +#define __STDC_EXT__ 1 /* To get large file support on hpux */ +#endif + +/* + Solaris 9 include file refers to X/Open document + + System Interfaces and Headers, Issue 5 + + saying we should define _XOPEN_SOURCE=500 to get POSIX.1c prototypes, + but apparently other systems (namely FreeBSD) don't agree. + + On a newer Solaris 10, the above file recognizes also _XOPEN_SOURCE=600. + Furthermore, it tests that if a program requires older standard + (_XOPEN_SOURCE<600 or _POSIX_C_SOURCE<200112L) it cannot be + run on a new compiler (that defines _STDC_C99) and issues an #error. + It's also an #error if a program requires new standard (_XOPEN_SOURCE=600 + or _POSIX_C_SOURCE=200112L) and a compiler does not define _STDC_C99. + + To add more to this mess, Sun Studio C compiler defines _STDC_C99 while + C++ compiler does not! + + So, in a desperate attempt to get correct prototypes for both + C and C++ code, we define either _XOPEN_SOURCE=600 or _XOPEN_SOURCE=500 + depending on the compiler's announced C standard support. + + Cleaner solutions are welcome. +*/ +#ifdef __sun +#if __STDC_VERSION__ - 0 >= 199901L +#define _XOPEN_SOURCE 600 +#else +#define _XOPEN_SOURCE 500 +#endif +#endif + +#if defined(THREAD) && !defined(__WIN__) +#ifndef _POSIX_PTHREAD_SEMANTICS +#define _POSIX_PTHREAD_SEMANTICS /* We want posix threads */ +#endif + +#if !defined(SCO) +#define _REENTRANT 1 /* Some thread libraries require this */ +#endif +#if !defined(_THREAD_SAFE) && !defined(_AIX) +#define _THREAD_SAFE /* Required for OSF1 */ +#endif +#if defined(HPUX10) || defined(HPUX11) +C_MODE_START /* HPUX needs this, signal.h bug */ +#include +C_MODE_END +#else +#include /* AIX must have this included first */ +#endif +#if !defined(SCO) && !defined(_REENTRANT) +#define _REENTRANT 1 /* Threads requires reentrant code */ +#endif +#endif /* THREAD */ + +/* Go around some bugs in different OS and compilers */ +#ifdef _AIX /* By soren@t.dk */ +#define _H_STRINGS +#define _SYS_STREAM_H +/* #define _AIX32_CURSES */ /* XXX: this breaks AIX 4.3.3 (others?). */ +#define ulonglong2double(A) my_ulonglong2double(A) +#define my_off_t2double(A) my_ulonglong2double(A) +C_MODE_START +double my_ulonglong2double(unsigned long long A); +C_MODE_END +#endif /* _AIX */ + +#ifdef HAVE_BROKEN_SNPRINTF /* HPUX 10.20 don't have this defined */ +#undef HAVE_SNPRINTF +#endif +#ifdef HAVE_BROKEN_PREAD +/* + pread()/pwrite() are not 64 bit safe on HP-UX 11.0 without + installing the kernel patch PHKL_20349 or greater +*/ +#undef HAVE_PREAD +#undef HAVE_PWRITE +#endif +#if defined(HAVE_BROKEN_INLINE) && !defined(__cplusplus) +#undef inline +#define inline +#endif + +#ifdef UNDEF_HAVE_GETHOSTBYNAME_R /* For OSF4.x */ +#undef HAVE_GETHOSTBYNAME_R +#endif +#ifdef UNDEF_HAVE_INITGROUPS /* For AIX 4.3 */ +#undef HAVE_INITGROUPS +#endif + +/* gcc/egcs issues */ + +#if defined(__GNUC) && defined(__EXCEPTIONS) +#error "Please add -fno-exceptions to CXXFLAGS and reconfigure/recompile" +#endif + + +/* Fix a bug in gcc 2.8.0 on IRIX 6.2 */ +#if SIZEOF_LONG == 4 && defined(__LONG_MAX__) && (__GNUC__ == 2 && __GNUC_MINOR__ == 8) +#undef __LONG_MAX__ /* Is a longlong value in gcc 2.8.0 ??? */ +#define __LONG_MAX__ 2147483647 +#endif + +/* egcs 1.1.2 has a problem with memcpy on Alpha */ +#if defined(__GNUC__) && defined(__alpha__) && ! (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)) +#define BAD_MEMCPY +#endif + +#if defined(_lint) && !defined(lint) +#define lint +#endif +#if SIZEOF_LONG_LONG > 4 && !defined(_LONG_LONG) +#define _LONG_LONG 1 /* For AIX string library */ +#endif + +#ifndef stdin +#include +#endif +#include +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STDDEF_H +#include +#endif + +#include +#ifdef HAVE_LIMITS_H +#include +#endif +#ifdef HAVE_FLOAT_H +#include +#endif +#ifdef HAVE_FENV_H +#include /* For fesetround() */ +#endif + +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_FCNTL_H +#include +#endif +#ifdef HAVE_SYS_STAT_H +#include +#endif +#ifdef HAVE_SYS_TIMEB_H +#include /* Avoid warnings on SCO */ +#endif +#if TIME_WITH_SYS_TIME +# include +# include +#else +# if HAVE_SYS_TIME_H +# include +# else +# include +# endif +#endif /* TIME_WITH_SYS_TIME */ +#ifdef HAVE_UNISTD_H +#include +#endif +#if defined(__cplusplus) && defined(NO_CPLUSPLUS_ALLOCA) +#undef HAVE_ALLOCA +#undef HAVE_ALLOCA_H +#endif +#ifdef HAVE_ALLOCA_H +#include +#endif + +#include /* Recommended by debian */ +/* We need the following to go around a problem with openssl on solaris */ +#if defined(HAVE_CRYPT_H) +#include +#endif + +/* + A lot of our programs uses asserts, so better to always include it + This also fixes a problem when people uses DBUG_ASSERT without including + assert.h +*/ +#include + +/* an assert that works at compile-time. only for constant expression */ +#ifdef _some_old_compiler_that_does_not_understand_the_construct_below_ +#define compile_time_assert(X) do { } while(0) +#else +#define compile_time_assert(X) \ + do \ + { \ + typedef char compile_time_assert[(X) ? 1 : -1]; \ + } while(0) +#endif + +/* Go around some bugs in different OS and compilers */ +#if defined (HPUX11) && defined(_LARGEFILE_SOURCE) +#define _LARGEFILE64_SOURCE +#endif +#if defined(_HPUX_SOURCE) && defined(HAVE_SYS_STREAM_H) +#include /* HPUX 10.20 defines ulong here. UGLY !!! */ +#define HAVE_ULONG +#endif +#if defined(HPUX10) && defined(_LARGEFILE64_SOURCE) && defined(THREAD) +/* Fix bug in setrlimit */ +#undef setrlimit +#define setrlimit cma_setrlimit64 +#endif +/* Declare madvise where it is not declared for C++, like Solaris */ +#if HAVE_MADVISE && !HAVE_DECL_MADVISE && defined(__cplusplus) +extern "C" int madvise(void *addr, size_t len, int behav); +#endif + +#ifdef __QNXNTO__ +/* This has to be after include limits.h */ +#define HAVE_ERRNO_AS_DEFINE +#define HAVE_FCNTL_LOCK +#undef HAVE_FINITE +#undef LONGLONG_MIN /* These get wrongly defined in QNX 6.2 */ +#undef LONGLONG_MAX /* standard system library 'limits.h' */ +#endif + +/* We can not live without the following defines */ + +#define USE_MYFUNC 1 /* Must use syscall indirection */ +#define MASTER 1 /* Compile without unireg */ +#define ENGLISH 1 /* Messages in English */ +#define POSIX_MISTAKE 1 /* regexp: Fix stupid spec error */ +#define USE_REGEX 1 /* We want the use the regex library */ +/* Do not define for ultra sparcs */ +#define USE_BMOVE512 1 /* Use this unless system bmove is faster */ + +#define QUOTE_ARG(x) #x /* Quote argument (before cpp) */ +#define STRINGIFY_ARG(x) QUOTE_ARG(x) /* Quote argument, after cpp */ + +/* Paranoid settings. Define I_AM_PARANOID if you are paranoid */ +#ifdef I_AM_PARANOID +#define DONT_ALLOW_USER_CHANGE 1 +#define DONT_USE_MYSQL_PWD 1 +#endif + +/* Does the system remember a signal handler after a signal ? */ +#ifndef HAVE_BSD_SIGNALS +#define DONT_REMEMBER_SIGNAL +#endif + +#if defined(_lint) || defined(FORCE_INIT_OF_VARS) +#define LINT_INIT(var) var=0 /* No uninitialize-warning */ +#else +#define LINT_INIT(var) +#endif + +#if defined(_lint) || defined(FORCE_INIT_OF_VARS) || defined(HAVE_purify) +#define PURIFY_OR_LINT_INIT(var) var=0 +#else +#define PURIFY_OR_LINT_INIT(var) +#endif + +#if !defined(HAVE_UINT) +#undef HAVE_UINT +#define HAVE_UINT +typedef unsigned int uint; +typedef unsigned short ushort; +#endif + +#define CMP_NUM(a,b) (((a) < (b)) ? -1 : ((a) == (b)) ? 0 : 1) +#define sgn(a) (((a) < 0) ? -1 : ((a) > 0) ? 1 : 0) +#define swap_variables(t, a, b) { t swap_dummy; swap_dummy= a; a= b; b= swap_dummy; } +#define test(a) ((a) ? 1 : 0) +#define set_if_bigger(a,b) do { if ((a) < (b)) (a)=(b); } while(0) +#define set_if_smaller(a,b) do { if ((a) > (b)) (a)=(b); } while(0) +#define test_all_bits(a,b) (((a) & (b)) == (b)) +#define set_bits(type, bit_count) (sizeof(type)*8 <= (bit_count) ? ~(type) 0 : ((((type) 1) << (bit_count)) - (type) 1)) +#define array_elements(A) ((uint) (sizeof(A)/sizeof(A[0]))) + +/* Define some general constants */ +#ifndef TRUE +#define TRUE (1) /* Logical true */ +#define FALSE (0) /* Logical false */ +#endif + +#if defined(__GNUC__) +#define function_volatile volatile +#define my_reinterpret_cast(A) reinterpret_cast +#define my_const_cast(A) const_cast +# ifndef GCC_VERSION +# define GCC_VERSION (__GNUC__ * 1000 + __GNUC_MINOR__) +# endif +#elif !defined(my_reinterpret_cast) +#define my_reinterpret_cast(A) (A) +#define my_const_cast(A) (A) +#endif + +#include + +/* + Wen using the embedded library, users might run into link problems, + duplicate declaration of __cxa_pure_virtual, solved by declaring it a + weak symbol. +*/ +#if defined(USE_MYSYS_NEW) && ! defined(DONT_DECLARE_CXA_PURE_VIRTUAL) +C_MODE_START +int __cxa_pure_virtual () __attribute__ ((weak)); +C_MODE_END +#endif + +/* From old s-system.h */ + +/* + Support macros for non ansi & other old compilers. Since such + things are no longer supported we do nothing. We keep then since + some of our code may still be needed to upgrade old customers. +*/ +#define _VARARGS(X) X +#define _STATIC_VARARGS(X) X + +/* The DBUG_ON flag always takes precedence over default DBUG_OFF */ +#if defined(DBUG_ON) && defined(DBUG_OFF) +#undef DBUG_OFF +#endif + +/* We might be forced to turn debug off, if not turned off already */ +#if (defined(FORCE_DBUG_OFF) || defined(_lint)) && !defined(DBUG_OFF) +# define DBUG_OFF +# ifdef DBUG_ON +# undef DBUG_ON +# endif +#endif + +typedef char my_bool; /* Small bool */ +#include + +#define MIN_ARRAY_SIZE 0 /* Zero or One. Gcc allows zero*/ +#define ASCII_BITS_USED 8 /* Bit char used */ +#define NEAR_F /* No near function handling */ + +/* Some types that is different between systems */ + +typedef int File; /* File descriptor */ +#ifndef Socket_defined +typedef int my_socket; /* File descriptor for sockets */ +#define INVALID_SOCKET -1 +#endif +/* Type for fuctions that handles signals */ +#define sig_handler void +C_MODE_START +typedef void (*sig_return)();/* Returns type from signal */ +C_MODE_END +#if defined(__GNUC__) && !defined(_lint) +typedef char pchar; /* Mixed prototypes can take char */ +typedef char puchar; /* Mixed prototypes can take char */ +typedef char pbool; /* Mixed prototypes can take char */ +typedef short pshort; /* Mixed prototypes can take short int */ +typedef float pfloat; /* Mixed prototypes can take float */ +#else +typedef int pchar; /* Mixed prototypes can't take char */ +typedef uint puchar; /* Mixed prototypes can't take char */ +typedef int pbool; /* Mixed prototypes can't take char */ +typedef int pshort; /* Mixed prototypes can't take short int */ +typedef double pfloat; /* Mixed prototypes can't take float */ +#endif +C_MODE_START +typedef int (*qsort_cmp)(const void *,const void *); +typedef int (*qsort_cmp2)(void*, const void *,const void *); +C_MODE_END +#define qsort_t RETQSORTTYPE /* Broken GCC cant handle typedef !!!! */ +#ifdef HAVE_SYS_SOCKET_H +#include +#endif + +/* file create flags */ + +#ifndef O_SHARE /* Probably not windows */ +#define O_SHARE 0 /* Flag to my_open for shared files */ +#ifndef O_BINARY +#define O_BINARY 0 /* Flag to my_open for binary files */ +#endif +#ifndef FILE_BINARY +#define FILE_BINARY O_BINARY /* Flag to my_fopen for binary streams */ +#endif +#ifdef HAVE_FCNTL +#define HAVE_FCNTL_LOCK +#define F_TO_EOF 0L /* Param to lockf() to lock rest of file */ +#endif +#endif /* O_SHARE */ + +#ifndef O_TEMPORARY +#define O_TEMPORARY 0 +#endif +#ifndef O_SHORT_LIVED +#define O_SHORT_LIVED 0 +#endif +#ifndef O_NOFOLLOW +#define O_NOFOLLOW 0 +#endif + +/* additional file share flags for win32 */ +#ifdef __WIN__ +#define _SH_DENYRWD 0x110 /* deny read/write mode & delete */ +#define _SH_DENYWRD 0x120 /* deny write mode & delete */ +#define _SH_DENYRDD 0x130 /* deny read mode & delete */ +#define _SH_DENYDEL 0x140 /* deny delete only */ +#endif /* __WIN__ */ + + +/* #define USE_RECORD_LOCK */ + + /* Unsigned types supported by the compiler */ +#define UNSINT8 /* unsigned int8 (char) */ +#define UNSINT16 /* unsigned int16 */ +#define UNSINT32 /* unsigned int32 */ + + /* General constants */ +#define FN_LEN 256 /* Max file name len */ +#define FN_HEADLEN 253 /* Max length of filepart of file name */ +#define FN_EXTLEN 20 /* Max length of extension (part of FN_LEN) */ +#define FN_REFLEN 512 /* Max length of full path-name */ +#define FN_EXTCHAR '.' +#define FN_HOMELIB '~' /* ~/ is used as abbrev for home dir */ +#define FN_CURLIB '.' /* ./ is used as abbrev for current dir */ +#define FN_PARENTDIR ".." /* Parent directory; Must be a string */ + +#ifndef FN_LIBCHAR +#define FN_LIBCHAR '/' +#define FN_ROOTDIR "/" +#endif + +/* + MY_FILE_MIN is Windows speciality and is used to quickly detect + the mismatch of CRT and mysys file IO usage on Windows at runtime. + CRT file descriptors can be in the range 0-2047, whereas descriptors returned + by my_open() will start with 2048. If a file descriptor with value less then + MY_FILE_MIN is passed to mysys IO function, chances are it stemms from + open()/fileno() and not my_open()/my_fileno. + + For Posix, mysys functions are light wrappers around libc, and MY_FILE_MIN + is logically 0. +*/ + +#ifdef _WIN32 +#define MY_FILE_MIN 2048 +#else +#define MY_FILE_MIN 0 +#endif + +/* + MY_NFILE is the default size of my_file_info array. + + It is larger on Windows, because it all file handles are stored in my_file_info + Default size is 16384 and this should be enough for most cases.If it is not + enough, --max-open-files with larger value can be used. + + For Posix , my_file_info array is only used to store filenames for + error reporting and its size is not a limitation for number of open files. +*/ +#ifdef _WIN32 +#define MY_NFILE (16384 + MY_FILE_MIN) +#else +#define MY_NFILE 64 +#endif + +#ifndef OS_FILE_LIMIT +#define OS_FILE_LIMIT 65535 +#endif + +/* #define EXT_IN_LIBNAME */ +/* #define FN_NO_CASE_SENCE */ +/* #define FN_UPPER_CASE TRUE */ + +/* + Io buffer size; Must be a power of 2 and a multiple of 512. May be + smaller what the disk page size. This influences the speed of the + isam btree library. eg to big to slow. +*/ +#define IO_SIZE 4096 +/* + How much overhead does malloc have. The code often allocates + something like 1024-MALLOC_OVERHEAD bytes +*/ +#ifdef SAFEMALLOC +#define MALLOC_OVERHEAD (8+24+4) +#else +#define MALLOC_OVERHEAD 8 +#endif + /* get memory in huncs */ +#define ONCE_ALLOC_INIT (uint) (4096-MALLOC_OVERHEAD) + /* Typical record cash */ +#define RECORD_CACHE_SIZE (uint) (64*1024-MALLOC_OVERHEAD) + /* Typical key cash */ +#define KEY_CACHE_SIZE (uint) (8*1024*1024-MALLOC_OVERHEAD) + /* Default size of a key cache block */ +#define KEY_CACHE_BLOCK_SIZE (uint) 1024 + + + /* Some things that this system doesn't have */ + +#define NO_HASH /* Not needed anymore */ +#ifdef _WIN32 +#define NO_DIR_LIBRARY /* Not standard dir-library */ +#endif + +/* Some defines of functions for portability */ + +#undef remove /* Crashes MySQL on SCO 5.0.0 */ +#ifndef __WIN__ +#define closesocket(A) close(A) +#ifndef ulonglong2double +#define ulonglong2double(A) ((double) (ulonglong) (A)) +#define my_off_t2double(A) ((double) (my_off_t) (A)) +#endif +#ifndef double2ulonglong +#define double2ulonglong(A) ((ulonglong) (double) (A)) +#endif +#endif + +#ifndef offsetof +#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) +#endif +#define ulong_to_double(X) ((double) (ulong) (X)) +#define SET_STACK_SIZE(X) /* Not needed on real machines */ + +#ifndef STACK_DIRECTION +#error "please add -DSTACK_DIRECTION=1 or -1 to your CPPFLAGS" +#endif + +#if !defined(HAVE_STRTOK_R) +inline char *strtok_r(char *str, const char *delim, char **saveptr) +{ + return strtok(str,delim); +} +#endif + +/* This is from the old m-machine.h file */ + +#if SIZEOF_LONG_LONG > 4 +#define HAVE_LONG_LONG 1 +#endif + +/* + Some pre-ANSI-C99 systems like AIX 5.1 and Linux/GCC 2.95 define + ULONGLONG_MAX, LONGLONG_MIN, LONGLONG_MAX; we use them if they're defined. + Also on Windows we define these constants by hand in config-win.h. +*/ + +#if defined(HAVE_LONG_LONG) && !defined(LONGLONG_MIN) +#define LONGLONG_MIN ((long long) 0x8000000000000000LL) +#define LONGLONG_MAX ((long long) 0x7FFFFFFFFFFFFFFFLL) +#endif + +#if defined(HAVE_LONG_LONG) && !defined(ULONGLONG_MAX) +/* First check for ANSI C99 definition: */ +#ifdef ULLONG_MAX +#define ULONGLONG_MAX ULLONG_MAX +#else +#define ULONGLONG_MAX ((unsigned long long)(~0ULL)) +#endif +#endif /* defined (HAVE_LONG_LONG) && !defined(ULONGLONG_MAX)*/ + +#define INT_MIN32 (~0x7FFFFFFFL) +#define INT_MAX32 0x7FFFFFFFL +#define UINT_MAX32 0xFFFFFFFFL +#define INT_MIN24 (~0x007FFFFF) +#define INT_MAX24 0x007FFFFF +#define UINT_MAX24 0x00FFFFFF +#define INT_MIN16 (~0x7FFF) +#define INT_MAX16 0x7FFF +#define UINT_MAX16 0xFFFF +#define INT_MIN8 (~0x7F) +#define INT_MAX8 0x7F +#define UINT_MAX8 0xFF + +/* From limits.h instead */ +#ifndef DBL_MIN +#define DBL_MIN 4.94065645841246544e-324 +#define FLT_MIN ((float)1.40129846432481707e-45) +#endif +#ifndef DBL_MAX +#define DBL_MAX 1.79769313486231470e+308 +#define FLT_MAX ((float)3.40282346638528860e+38) +#endif +#ifndef SIZE_T_MAX +#define SIZE_T_MAX ~((size_t) 0) +#endif + +#ifndef isfinite +#ifdef HAVE_FINITE +#define isfinite(x) finite(x) +#else +#define finite(x) (1.0 / fabs(x) > 0.0) +#endif /* HAVE_FINITE */ +#endif /* isfinite */ + +#ifndef HAVE_ISNAN +#define isnan(x) ((x) != (x)) +#endif + +#ifdef HAVE_ISINF +/* Check if C compiler is affected by GCC bug #39228 */ +#if !defined(__cplusplus) && defined(HAVE_BROKEN_ISINF) +/* Force store/reload of the argument to/from a 64-bit double */ +static inline double my_isinf(double x) +{ + volatile double t= x; + return isinf(t); +} +#else +/* System-provided isinf() is available and safe to use */ +#define my_isinf(X) isinf(X) +#endif +#else /* !HAVE_ISINF */ +#define my_isinf(X) (!finite(X) && !isnan(X)) +#endif + +/* Define missing math constants. */ +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif +#ifndef M_E +#define M_E 2.7182818284590452354 +#endif +#ifndef M_LN2 +#define M_LN2 0.69314718055994530942 +#endif + +/* + Max size that must be added to a so that we know Size to make + adressable obj. +*/ +#if SIZEOF_CHARP == 4 +typedef long my_ptrdiff_t; +#else +typedef long long my_ptrdiff_t; +#endif + +#define MY_ALIGN(A,L) (((A) + (L) - 1) & ~((L) - 1)) +#define ALIGN_SIZE(A) MY_ALIGN((A),sizeof(double)) +/* Size to make adressable obj. */ +#define ALIGN_PTR(A, t) ((t*) MY_ALIGN((A),sizeof(t))) + /* Offset of field f in structure t */ +#define OFFSET(t, f) ((size_t)(char *)&((t *)0)->f) +#define ADD_TO_PTR(ptr,size,type) (type) ((uchar*) (ptr)+size) +#define PTR_BYTE_DIFF(A,B) (my_ptrdiff_t) ((uchar*) (A) - (uchar*) (B)) + +#define MY_DIV_UP(A, B) (((A) + (B) - 1) / (B)) +#define MY_ALIGNED_BYTE_ARRAY(N, S, T) T N[MY_DIV_UP(S, sizeof(T))] + +/* + Custom version of standard offsetof() macro which can be used to get + offsets of members in class for non-POD types (according to the current + version of C++ standard offsetof() macro can't be used in such cases and + attempt to do so causes warnings to be emitted, OTOH in many cases it is + still OK to assume that all instances of the class has the same offsets + for the same members). + + This is temporary solution which should be removed once File_parser class + and related routines are refactored. +*/ + +#define my_offsetof(TYPE, MEMBER) \ + ((size_t)((char *)&(((TYPE *)0x10)->MEMBER) - (char*)0x10)) + +#define NullS STATIC_CAST(char *)(0) +/* Nowdays we do not support MessyDos */ +#ifndef NEAR +#define NEAR /* Who needs segments ? */ +#define FAR /* On a good machine */ +#ifndef HUGE_PTR +#define HUGE_PTR +#endif +#endif +#if defined(__IBMC__) || defined(__IBMCPP__) +/* This was _System _Export but caused a lot of warnings on _AIX43 */ +#define STDCALL +#elif !defined( STDCALL) +#define STDCALL +#endif + +/* Typdefs for easyier portability */ + +#ifndef HAVE_UCHAR +typedef unsigned char uchar; /* Short for unsigned char */ +#endif + +#ifndef HAVE_INT8 +typedef signed char int8; /* Signed integer >= 8 bits */ +#endif +#ifndef HAVE_UINT8 +typedef unsigned char uint8; /* Unsigned integer >= 8 bits */ +#endif +#ifndef HAVE_INT16 +typedef short int16; +#endif +#ifndef HAVE_UINT16 +typedef unsigned short uint16; +#endif +#if SIZEOF_INT == 4 +#ifndef HAVE_INT32 +typedef int int32; +#endif +#ifndef HAVE_UINT32 +typedef unsigned int uint32; +#endif +#elif SIZEOF_LONG == 4 +#ifndef HAVE_INT32 +typedef long int32; +#endif +#ifndef HAVE_UINT32 +typedef unsigned long uint32; +#endif +#else +#error Neither int or long is of 4 bytes width +#endif + +#if !defined(HAVE_ULONG) && !defined(__USE_MISC) +typedef unsigned long ulong; /* Short for unsigned long */ +#endif +#ifndef longlong_defined +/* + Using [unsigned] long long is preferable as [u]longlong because we use + [unsigned] long long unconditionally in many places, + for example in constants with [U]LL suffix. +*/ +#if defined(HAVE_LONG_LONG) && SIZEOF_LONG_LONG == 8 +typedef unsigned long long int ulonglong; /* ulong or unsigned long long */ +typedef long long int longlong; +#else +typedef unsigned long ulonglong; /* ulong or unsigned long long */ +typedef long longlong; +#endif +#endif +#ifndef HAVE_INT64 +typedef longlong int64; +#endif +#ifndef HAVE_UINT64 +typedef ulonglong uint64; +#endif + +#if defined(NO_CLIENT_LONG_LONG) +typedef unsigned long my_ulonglong; +#elif defined (__WIN__) +typedef unsigned __int64 my_ulonglong; +#else +typedef unsigned long long my_ulonglong; +#endif + +#if SIZEOF_CHARP == SIZEOF_INT +typedef int intptr; +#elif SIZEOF_CHARP == SIZEOF_LONG +typedef long intptr; +#elif SIZEOF_CHARP == SIZEOF_LONG_LONG +typedef long long intptr; +#else +#error sizeof(void *) is neither sizeof(int) nor sizeof(long) nor sizeof(long long) +#endif + +#define MY_ERRPTR ((void*)(intptr)1) + +#ifdef USE_RAID +/* + The following is done with a if to not get problems with pre-processors + with late define evaluation +*/ +#if SIZEOF_OFF_T == 4 +#define SYSTEM_SIZEOF_OFF_T 4 +#else +#define SYSTEM_SIZEOF_OFF_T 8 +#endif +#undef SIZEOF_OFF_T +#define SIZEOF_OFF_T 8 +#else +#define SYSTEM_SIZEOF_OFF_T SIZEOF_OFF_T +#endif /* USE_RAID */ + +#if SIZEOF_OFF_T > 4 +typedef ulonglong my_off_t; +#else +typedef unsigned long my_off_t; +#endif +#define MY_FILEPOS_ERROR (~STATIC_CAST(my_off_t)(0)) +#if !defined(__WIN__) +typedef off_t os_off_t; +#endif + +#if defined(__WIN__) +#define socket_errno WSAGetLastError() +#define SOCKET_EINTR WSAEINTR +#define SOCKET_EAGAIN WSAEINPROGRESS +#define SOCKET_ETIMEDOUT WSAETIMEDOUT +#define SOCKET_EWOULDBLOCK WSAEWOULDBLOCK +#define SOCKET_EADDRINUSE WSAEADDRINUSE +#define SOCKET_ENFILE ENFILE +#define SOCKET_EMFILE EMFILE +#else /* Unix */ +#define socket_errno errno +#define closesocket(A) close(A) +#define SOCKET_EINTR EINTR +#define SOCKET_EAGAIN EAGAIN +#define SOCKET_ETIMEDOUT SOCKET_EINTR +#define SOCKET_EWOULDBLOCK EWOULDBLOCK +#define SOCKET_EADDRINUSE EADDRINUSE +#define SOCKET_ENFILE ENFILE +#define SOCKET_EMFILE EMFILE +#endif + +typedef uint8 int7; /* Most effective integer 0 <= x <= 127 */ +typedef short int15; /* Most effective integer 0 <= x <= 32767 */ +typedef int myf; /* Type of MyFlags in my_funcs */ + /* Macros for converting *constants* to the right type */ +#define INT8(v) (int8) (v) +#define INT16(v) (int16) (v) +#define INT32(v) (int32) (v) +#define MYF(v) STATIC_CAST(myf)(v) + +/* + Defines to make it possible to prioritize register assignments. No + longer that important with modern compilers. +*/ +#ifndef USING_X +#define reg1 register +#define reg2 register +#define reg3 register +#define reg4 register +#define reg5 register +#define reg6 register +#define reg7 register +#define reg8 register +#define reg9 register +#define reg10 register +#define reg11 register +#define reg12 register +#define reg13 register +#define reg14 register +#define reg15 register +#define reg16 register +#endif + +/* + Sometimes we want to make sure that the variable is not put into + a register in debugging mode so we can see its value in the core +*/ + +#ifndef DBUG_OFF +#define dbug_volatile volatile +#else +#define dbug_volatile +#endif + +/* Some helper macros */ +#define YESNO(X) ((X) ? "yes" : "no") + +/* Defines for time function */ +#define SCALE_SEC 100 +#define SCALE_USEC 10000 +#define MY_HOW_OFTEN_TO_ALARM 2 /* How often we want info on screen */ +#define MY_HOW_OFTEN_TO_WRITE 10000 /* How often we want info on screen */ + +/* + Define-funktions for reading and storing in machine independent format + (low byte first) +*/ + +/* Optimized store functions for Intel x86 */ +#if defined(__i386__) || defined(_WIN32) +#define sint2korr(A) (*((const int16 *) (A))) +#define sint3korr(A) ((int32) ((((uchar) (A)[2]) & 128) ? \ + (((uint32) 255L << 24) | \ + (((uint32) (uchar) (A)[2]) << 16) |\ + (((uint32) (uchar) (A)[1]) << 8) | \ + ((uint32) (uchar) (A)[0])) : \ + (((uint32) (uchar) (A)[2]) << 16) |\ + (((uint32) (uchar) (A)[1]) << 8) | \ + ((uint32) (uchar) (A)[0]))) +#define sint4korr(A) (*((const long *) (A))) +#define uint2korr(A) (*((const uint16 *) (A))) +#if defined(HAVE_purify) && !defined(_WIN32) +#define uint3korr(A) (uint32) (((uint32) ((uchar) (A)[0])) +\ + (((uint32) ((uchar) (A)[1])) << 8) +\ + (((uint32) ((uchar) (A)[2])) << 16)) +#else +/* + ATTENTION ! + + Please, note, uint3korr reads 4 bytes (not 3) ! + It means, that you have to provide enough allocated space ! +*/ +#define uint3korr(A) (long) (*((const unsigned int *) (A)) & 0xFFFFFF) +#endif /* HAVE_purify && !_WIN32 */ +#define uint4korr(A) (*((const uint32 *) (A))) +#define uint5korr(A) ((ulonglong)(((uint32) ((uchar) (A)[0])) +\ + (((uint32) ((uchar) (A)[1])) << 8) +\ + (((uint32) ((uchar) (A)[2])) << 16) +\ + (((uint32) ((uchar) (A)[3])) << 24)) +\ + (((ulonglong) ((uchar) (A)[4])) << 32)) +#define uint6korr(A) ((ulonglong)(((uint32) ((uchar) (A)[0])) + \ + (((uint32) ((uchar) (A)[1])) << 8) + \ + (((uint32) ((uchar) (A)[2])) << 16) + \ + (((uint32) ((uchar) (A)[3])) << 24)) + \ + (((ulonglong) ((uchar) (A)[4])) << 32) + \ + (((ulonglong) ((uchar) (A)[5])) << 40)) +#define uint8korr(A) (*((const ulonglong *) (A))) +#define sint8korr(A) (*((const longlong *) (A))) +#define int2store(T,A) *((uint16*) (T))= (uint16) (A) +#define int3store(T,A) do { *(T)= (uchar) ((A));\ + *(T+1)=(uchar) (((uint) (A) >> 8));\ + *(T+2)=(uchar) (((A) >> 16)); } while (0) +#define int4store(T,A) *((long *) (T))= (long) (A) +#define int5store(T,A) do { *(T)= (uchar)((A));\ + *((T)+1)=(uchar) (((A) >> 8));\ + *((T)+2)=(uchar) (((A) >> 16));\ + *((T)+3)=(uchar) (((A) >> 24)); \ + *((T)+4)=(uchar) (((A) >> 32)); } while(0) +#define int6store(T,A) do { *(T)= (uchar)((A)); \ + *((T)+1)=(uchar) (((A) >> 8)); \ + *((T)+2)=(uchar) (((A) >> 16)); \ + *((T)+3)=(uchar) (((A) >> 24)); \ + *((T)+4)=(uchar) (((A) >> 32)); \ + *((T)+5)=(uchar) (((A) >> 40)); } while(0) +#define int8store(T,A) *((ulonglong *) (T))= (ulonglong) (A) + +typedef union { + double v; + long m[2]; +} doubleget_union; +#define doubleget(V,M) \ +do { doubleget_union _tmp; \ + _tmp.m[0] = *((const long*)(M)); \ + _tmp.m[1] = *(((const long*) (M))+1); \ + (V) = _tmp.v; } while(0) +#define doublestore(T,V) do { *((long *) T) = ((const doubleget_union *)&V)->m[0]; \ + *(((long *) T)+1) = ((const doubleget_union *)&V)->m[1]; \ + } while (0) +#define float4get(V,M) do { *((float *) &(V)) = *((const float*) (M)); } while(0) +#define float8get(V,M) doubleget((V),(M)) +#define float4store(V,M) memcpy((uchar*) V,(const uchar*) (&M),sizeof(float)) +#define floatstore(T,V) memcpy((uchar*)(T), (const uchar*)(&V),sizeof(float)) +#define floatget(V,M) memcpy((uchar*) &V,(const uchar*) (M),sizeof(float)) +#define float8store(V,M) doublestore((V),(M)) +#else + +/* + We're here if it's not a IA-32 architecture (Win32 and UNIX IA-32 defines + were done before) +*/ +#define sint2korr(A) (int16) (((int16) ((uchar) (A)[0])) +\ + ((int16) ((int16) (A)[1]) << 8)) +#define sint3korr(A) ((int32) ((((uchar) (A)[2]) & 128) ? \ + (((uint32) 255L << 24) | \ + (((uint32) (uchar) (A)[2]) << 16) |\ + (((uint32) (uchar) (A)[1]) << 8) | \ + ((uint32) (uchar) (A)[0])) : \ + (((uint32) (uchar) (A)[2]) << 16) |\ + (((uint32) (uchar) (A)[1]) << 8) | \ + ((uint32) (uchar) (A)[0]))) +#define sint4korr(A) (int32) (((int32) ((uchar) (A)[0])) +\ + (((int32) ((uchar) (A)[1]) << 8)) +\ + (((int32) ((uchar) (A)[2]) << 16)) +\ + (((int32) ((int16) (A)[3]) << 24))) +#define sint8korr(A) (longlong) uint8korr(A) +#define uint2korr(A) (uint16) (((uint16) ((uchar) (A)[0])) +\ + ((uint16) ((uchar) (A)[1]) << 8)) +#define uint3korr(A) (uint32) (((uint32) ((uchar) (A)[0])) +\ + (((uint32) ((uchar) (A)[1])) << 8) +\ + (((uint32) ((uchar) (A)[2])) << 16)) +#define uint4korr(A) (uint32) (((uint32) ((uchar) (A)[0])) +\ + (((uint32) ((uchar) (A)[1])) << 8) +\ + (((uint32) ((uchar) (A)[2])) << 16) +\ + (((uint32) ((uchar) (A)[3])) << 24)) +#define uint5korr(A) ((ulonglong)(((uint32) ((uchar) (A)[0])) +\ + (((uint32) ((uchar) (A)[1])) << 8) +\ + (((uint32) ((uchar) (A)[2])) << 16) +\ + (((uint32) ((uchar) (A)[3])) << 24)) +\ + (((ulonglong) ((uchar) (A)[4])) << 32)) +#define uint6korr(A) ((ulonglong)(((uint32) ((uchar) (A)[0])) + \ + (((uint32) ((uchar) (A)[1])) << 8) + \ + (((uint32) ((uchar) (A)[2])) << 16) + \ + (((uint32) ((uchar) (A)[3])) << 24)) + \ + (((ulonglong) ((uchar) (A)[4])) << 32) + \ + (((ulonglong) ((uchar) (A)[5])) << 40)) +#define uint8korr(A) ((ulonglong)(((uint32) ((uchar) (A)[0])) +\ + (((uint32) ((uchar) (A)[1])) << 8) +\ + (((uint32) ((uchar) (A)[2])) << 16) +\ + (((uint32) ((uchar) (A)[3])) << 24)) +\ + (((ulonglong) (((uint32) ((uchar) (A)[4])) +\ + (((uint32) ((uchar) (A)[5])) << 8) +\ + (((uint32) ((uchar) (A)[6])) << 16) +\ + (((uint32) ((uchar) (A)[7])) << 24))) <<\ + 32)) +#define int2store(T,A) do { uint def_temp= (uint) (A) ;\ + *((uchar*) (T))= (uchar)(def_temp); \ + *((uchar*) (T)+1)=(uchar)((def_temp >> 8)); \ + } while(0) +#define int3store(T,A) do { /*lint -save -e734 */\ + *((uchar*)(T))=(uchar) ((A));\ + *((uchar*) (T)+1)=(uchar) (((A) >> 8));\ + *((uchar*)(T)+2)=(uchar) (((A) >> 16)); \ + /*lint -restore */} while(0) +#define int4store(T,A) do { *((char *)(T))=(char) ((A));\ + *(((char *)(T))+1)=(char) (((A) >> 8));\ + *(((char *)(T))+2)=(char) (((A) >> 16));\ + *(((char *)(T))+3)=(char) (((A) >> 24)); } while(0) +#define int5store(T,A) do { *((char *)(T))= (char)((A)); \ + *(((char *)(T))+1)= (char)(((A) >> 8)); \ + *(((char *)(T))+2)= (char)(((A) >> 16)); \ + *(((char *)(T))+3)= (char)(((A) >> 24)); \ + *(((char *)(T))+4)= (char)(((A) >> 32)); \ + } while(0) +#define int6store(T,A) do { *((char *)(T))= (char)((A)); \ + *(((char *)(T))+1)= (char)(((A) >> 8)); \ + *(((char *)(T))+2)= (char)(((A) >> 16)); \ + *(((char *)(T))+3)= (char)(((A) >> 24)); \ + *(((char *)(T))+4)= (char)(((A) >> 32)); \ + *(((char *)(T))+5)= (char)(((A) >> 40)); \ + } while(0) +#define int8store(T,A) do { uint def_temp= (uint) (A), def_temp2= (uint) ((A) >> 32); \ + int4store((T),def_temp); \ + int4store((T+4),def_temp2); } while(0) +#ifdef WORDS_BIGENDIAN +#define float4store(T,A) do { *(T)= ((uchar *) &A)[3];\ + *((T)+1)=(char) ((uchar *) &A)[2];\ + *((T)+2)=(char) ((uchar *) &A)[1];\ + *((T)+3)=(char) ((uchar *) &A)[0]; } while(0) + +#define float4get(V,M) do { float def_temp;\ + ((uchar*) &def_temp)[0]=(M)[3];\ + ((uchar*) &def_temp)[1]=(M)[2];\ + ((uchar*) &def_temp)[2]=(M)[1];\ + ((uchar*) &def_temp)[3]=(M)[0];\ + (V)=def_temp; } while(0) +#define float8store(T,V) do { *(T)= ((uchar *) &V)[7];\ + *((T)+1)=(char) ((uchar *) &V)[6];\ + *((T)+2)=(char) ((uchar *) &V)[5];\ + *((T)+3)=(char) ((uchar *) &V)[4];\ + *((T)+4)=(char) ((uchar *) &V)[3];\ + *((T)+5)=(char) ((uchar *) &V)[2];\ + *((T)+6)=(char) ((uchar *) &V)[1];\ + *((T)+7)=(char) ((uchar *) &V)[0]; } while(0) + +#define float8get(V,M) do { double def_temp;\ + ((uchar*) &def_temp)[0]=(M)[7];\ + ((uchar*) &def_temp)[1]=(M)[6];\ + ((uchar*) &def_temp)[2]=(M)[5];\ + ((uchar*) &def_temp)[3]=(M)[4];\ + ((uchar*) &def_temp)[4]=(M)[3];\ + ((uchar*) &def_temp)[5]=(M)[2];\ + ((uchar*) &def_temp)[6]=(M)[1];\ + ((uchar*) &def_temp)[7]=(M)[0];\ + (V) = def_temp; } while(0) +#else +#define float4get(V,M) memcpy_fixed((uchar*) &V,(uchar*) (M),sizeof(float)) +#define float4store(V,M) memcpy_fixed((uchar*) V,(uchar*) (&M),sizeof(float)) + +#if defined(__FLOAT_WORD_ORDER) && (__FLOAT_WORD_ORDER == __BIG_ENDIAN) +#define doublestore(T,V) do { *(((char*)T)+0)=(char) ((uchar *) &V)[4];\ + *(((char*)T)+1)=(char) ((uchar *) &V)[5];\ + *(((char*)T)+2)=(char) ((uchar *) &V)[6];\ + *(((char*)T)+3)=(char) ((uchar *) &V)[7];\ + *(((char*)T)+4)=(char) ((uchar *) &V)[0];\ + *(((char*)T)+5)=(char) ((uchar *) &V)[1];\ + *(((char*)T)+6)=(char) ((uchar *) &V)[2];\ + *(((char*)T)+7)=(char) ((uchar *) &V)[3]; }\ + while(0) +#define doubleget(V,M) do { double def_temp;\ + ((uchar*) &def_temp)[0]=(M)[4];\ + ((uchar*) &def_temp)[1]=(M)[5];\ + ((uchar*) &def_temp)[2]=(M)[6];\ + ((uchar*) &def_temp)[3]=(M)[7];\ + ((uchar*) &def_temp)[4]=(M)[0];\ + ((uchar*) &def_temp)[5]=(M)[1];\ + ((uchar*) &def_temp)[6]=(M)[2];\ + ((uchar*) &def_temp)[7]=(M)[3];\ + (V) = def_temp; } while(0) +#endif /* __FLOAT_WORD_ORDER */ + +#define float8get(V,M) doubleget((V),(M)) +#define float8store(V,M) doublestore((V),(M)) +#endif /* WORDS_BIGENDIAN */ + +#endif /* __i386__ OR _WIN32 */ + +/* + Macro for reading 32-bit integer from network byte order (big-endian) + from unaligned memory location. +*/ +#define int4net(A) (int32) (((uint32) ((uchar) (A)[3])) |\ + (((uint32) ((uchar) (A)[2])) << 8) |\ + (((uint32) ((uchar) (A)[1])) << 16) |\ + (((uint32) ((uchar) (A)[0])) << 24)) +/* + Define-funktions for reading and storing in machine format from/to + short/long to/from some place in memory V should be a (not + register) variable, M is a pointer to byte +*/ + +#ifdef WORDS_BIGENDIAN + +#define ushortget(V,M) do { V = (uint16) (((uint16) ((uchar) (M)[1]))+\ + ((uint16) ((uint16) (M)[0]) << 8)); } while(0) +#define shortget(V,M) do { V = (short) (((short) ((uchar) (M)[1]))+\ + ((short) ((short) (M)[0]) << 8)); } while(0) +#define longget(V,M) do { int32 def_temp;\ + ((uchar*) &def_temp)[0]=(M)[0];\ + ((uchar*) &def_temp)[1]=(M)[1];\ + ((uchar*) &def_temp)[2]=(M)[2];\ + ((uchar*) &def_temp)[3]=(M)[3];\ + (V)=def_temp; } while(0) +#define ulongget(V,M) do { uint32 def_temp;\ + ((uchar*) &def_temp)[0]=(M)[0];\ + ((uchar*) &def_temp)[1]=(M)[1];\ + ((uchar*) &def_temp)[2]=(M)[2];\ + ((uchar*) &def_temp)[3]=(M)[3];\ + (V)=def_temp; } while(0) +#define shortstore(T,A) do { uint def_temp=(uint) (A) ;\ + *(((char*)T)+1)=(char)(def_temp); \ + *(((char*)T)+0)=(char)(def_temp >> 8); } while(0) +#define longstore(T,A) do { *(((char*)T)+3)=((A));\ + *(((char*)T)+2)=(((A) >> 8));\ + *(((char*)T)+1)=(((A) >> 16));\ + *(((char*)T)+0)=(((A) >> 24)); } while(0) + +#define floatget(V,M) memcpy_fixed((uchar*) &V,(uchar*) (M),sizeof(float)) +#define floatstore(T,V) memcpy_fixed((uchar*) (T),(uchar*)(&V),sizeof(float)) +#define doubleget(V,M) memcpy_fixed((uchar*) &V,(uchar*) (M),sizeof(double)) +#define doublestore(T,V) memcpy_fixed((uchar*) (T),(uchar*) &V,sizeof(double)) +#define longlongget(V,M) memcpy_fixed((uchar*) &V,(uchar*) (M),sizeof(ulonglong)) +#define longlongstore(T,V) memcpy_fixed((uchar*) (T),(uchar*) &V,sizeof(ulonglong)) + +#else + +#define ushortget(V,M) do { V = uint2korr(M); } while(0) +#define shortget(V,M) do { V = sint2korr(M); } while(0) +#define longget(V,M) do { V = sint4korr(M); } while(0) +#define ulongget(V,M) do { V = uint4korr(M); } while(0) +#define shortstore(T,V) int2store(T,V) +#define longstore(T,V) int4store(T,V) +#ifndef floatstore +#define floatstore(T,V) memcpy_fixed((uchar*) (T),(uchar*) (&V),sizeof(float)) +#define floatget(V,M) memcpy_fixed((uchar*) &V, (uchar*) (M), sizeof(float)) +#endif +#ifndef doubleget +#define doubleget(V,M) memcpy_fixed((uchar*) &V,(uchar*) (M),sizeof(double)) +#define doublestore(T,V) memcpy_fixed((uchar*) (T),(uchar*) &V,sizeof(double)) +#endif /* doubleget */ +#define longlongget(V,M) memcpy_fixed((uchar*) &V,(uchar*) (M),sizeof(ulonglong)) +#define longlongstore(T,V) memcpy_fixed((uchar*) (T),(uchar*) &V,sizeof(ulonglong)) + +#endif /* WORDS_BIGENDIAN */ + +/* sprintf does not always return the number of bytes :- */ +#ifdef SPRINTF_RETURNS_INT +#define my_sprintf(buff,args) sprintf args +#else +#ifdef SPRINTF_RETURNS_PTR +#define my_sprintf(buff,args) ((int)(sprintf args - buff)) +#else +#define my_sprintf(buff,args) ((ulong) sprintf args, (ulong) strlen(buff)) +#endif +#endif + +#ifndef THREAD +#define thread_safe_increment(V,L) (V)++ +#define thread_safe_decrement(V,L) (V)-- +#define thread_safe_add(V,C,L) (V)+=(C) +#define thread_safe_sub(V,C,L) (V)-=(C) +#define statistic_increment(V,L) (V)++ +#define statistic_decrement(V,L) (V)-- +#define statistic_add(V,C,L) (V)+=(C) +#define statistic_sub(V,C,L) (V)-=(C) +#endif + +#if defined(HAVE_CHARSET_utf8mb3) || defined(HAVE_CHARSET_utf8mb4) +#define MYSQL_UNIVERSAL_CLIENT_CHARSET "utf8" +#else +#define MYSQL_UNIVERSAL_CLIENT_CHARSET MYSQL_DEFAULT_CHARSET_NAME +#endif + +#if defined(EMBEDDED_LIBRARY) && !defined(HAVE_EMBEDDED_PRIVILEGE_CONTROL) +#define NO_EMBEDDED_ACCESS_CHECKS +#endif + +#ifdef HAVE_DLOPEN +#if defined(__WIN__) +#define dlsym(lib, name) GetProcAddress((HMODULE)lib, name) +#define dlopen(libname, unused) LoadLibraryEx(libname, NULL, 0) +#define dlclose(lib) FreeLibrary((HMODULE)lib) +#elif defined(HAVE_DLFCN_H) +#include +#endif +#endif + +/* FreeBSD 2.2.2 does not define RTLD_NOW) */ +#ifndef RTLD_NOW +#define RTLD_NOW 1 +#endif + +#ifndef HAVE_DLERROR +#define dlerror() "" +#endif + + +#ifndef __NETWARE__ +/* + * Include standard definitions of operator new and delete. + */ +#ifdef __cplusplus +#include +#endif +#else +/* + * Define placement versions of operator new and operator delete since + * we don't have when building for Netware. + */ +#ifdef __cplusplus +inline void *operator new(size_t, void *ptr) { return ptr; } +inline void *operator new[](size_t, void *ptr) { return ptr; } +inline void operator delete(void*, void*) { /* Do nothing */ } +inline void operator delete[](void*, void*) { /* Do nothing */ } +#endif +#endif + +/* Length of decimal number represented by INT32. */ +#define MY_INT32_NUM_DECIMAL_DIGITS 11 + +/* Length of decimal number represented by INT64. */ +#define MY_INT64_NUM_DECIMAL_DIGITS 21 + +/* Define some useful general macros (should be done after all headers). */ +#if !defined(max) +#define max(a, b) ((a) > (b) ? (a) : (b)) +#define min(a, b) ((a) < (b) ? (a) : (b)) +#endif +/* + Only Linux is known to need an explicit sync of the directory to make sure a + file creation/deletion/renaming in(from,to) this directory durable. +*/ +#ifdef TARGET_OS_LINUX +#define NEED_EXPLICIT_SYNC_DIR 1 +#else +/* + On linux default rwlock scheduling policy is good enough for + waiting_threads.c, on other systems use our special implementation + (which is slower). + + QQ perhaps this should be tested in configure ? how ? +*/ +#define WT_RWLOCKS_USE_MUTEXES 1 +#endif + +#if !defined(__cplusplus) && !defined(bool) +#define bool In_C_you_should_use_my_bool_instead() +#endif + +/* Provide __func__ macro definition for platforms that miss it. */ +#if __STDC_VERSION__ < 199901L +# if __GNUC__ >= 2 +# define __func__ __FUNCTION__ +# else +# define __func__ "" +# endif +#elif defined(_MSC_VER) +# if _MSC_VER < 1300 +# define __func__ "" +# else +# define __func__ __FUNCTION__ +# endif +#elif defined(__BORLANDC__) +# define __func__ __FUNC__ +#else +# define __func__ "" +#endif + +#ifndef HAVE_RINT +/** + All integers up to this number can be represented exactly as double precision + values (DBL_MANT_DIG == 53 for IEEE 754 hardware). +*/ +#define MAX_EXACT_INTEGER ((1LL << DBL_MANT_DIG) - 1) + +/** + rint(3) implementation for platforms that do not have it. + Always rounds to the nearest integer with ties being rounded to the nearest + even integer to mimic glibc's rint() behavior in the "round-to-nearest" + FPU mode. Hardware-specific optimizations are possible (frndint on x86). + Unlike this implementation, hardware will also honor the FPU rounding mode. +*/ + +static inline double rint(double x) +{ + double f, i; + f = modf(x, &i); + + /* + All doubles with absolute values > MAX_EXACT_INTEGER are even anyway, + no need to check it. + */ + if (x > 0.0) + i += (double) ((f > 0.5) || (f == 0.5 && + i <= (double) MAX_EXACT_INTEGER && + (longlong) i % 2)); + else + i -= (double) ((f < -0.5) || (f == -0.5 && + i >= (double) -MAX_EXACT_INTEGER && + (longlong) i % 2)); + return i; +} +#endif /* HAVE_RINT */ + +/* + MYSQL_PLUGIN_IMPORT macro is used to export mysqld data + (i.e variables) for usage in storage engine loadable plugins. + Outside of Windows, it is dummy. +*/ +#ifndef MYSQL_PLUGIN_IMPORT +#if (defined(_WIN32) && defined(MYSQL_DYNAMIC_PLUGIN)) +#define MYSQL_PLUGIN_IMPORT __declspec(dllimport) +#else +#define MYSQL_PLUGIN_IMPORT +#endif +#endif + +#endif /* my_global_h */ diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_libwrap.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_libwrap.h new file mode 100644 index 0000000..9a85794 --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_libwrap.h @@ -0,0 +1,27 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifdef HAVE_LIBWRAP +#include +#include +#ifdef NEED_SYS_SYSLOG_H +#include +#endif /* NEED_SYS_SYSLOG_H */ + +extern void my_fromhost(struct request_info *req); +extern int my_hosts_access(struct request_info *req); +extern char *my_eval_client(struct request_info *req); + +#endif /* HAVE_LIBWRAP */ diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_list.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_list.h new file mode 100644 index 0000000..775b565 --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_list.h @@ -0,0 +1,45 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef _list_h_ +#define _list_h_ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct st_list { + struct st_list *prev,*next; + void *data; +} LIST; + +typedef int (*list_walk_action)(void *,void *); + +extern LIST *list_add(LIST *root,LIST *element); +extern LIST *list_delete(LIST *root,LIST *element); +extern LIST *list_cons(void *data,LIST *root); +extern LIST *list_reverse(LIST *root); +extern void list_free(LIST *root,unsigned int free_data); +extern unsigned int list_length(LIST *); +extern int list_walk(LIST *,list_walk_action action,unsigned char * argument); + +#define list_rest(a) ((a)->next) +#define list_push(a,b) (a)=list_cons((b),(a)) +#define list_pop(A) {LIST *old=(A); (A)=list_delete(old,old) ; my_free((unsigned char *) old,MYF(MY_FAE)); } + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_md5.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_md5.h new file mode 100644 index 0000000..6458f27 --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_md5.h @@ -0,0 +1,54 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* See md5.c for explanation and copyright information. */ + +/* + * $FreeBSD: src/contrib/cvs/lib/md5.h,v 1.2 1999/12/11 15:10:02 peter Exp $ + */ + +/* Unlike previous versions of this code, uint32 need not be exactly + 32 bits, merely 32 bits or more. Choosing a data type which is 32 + bits instead of 64 is not important; speed is considerably more + important. ANSI guarantees that "unsigned long" will be big enough, + and always using it seems to have few disadvantages. */ +typedef uint32 cvs_uint32; + +typedef struct { + cvs_uint32 buf[4]; + cvs_uint32 bits[2]; + unsigned char in[64]; +} my_MD5Context; + +#ifdef __cplusplus +extern "C" { +#endif +void my_MD5Init (my_MD5Context *context); +void my_MD5Update (my_MD5Context *context, + unsigned char const *buf, unsigned len); +void my_MD5Final (unsigned char digest[16], + my_MD5Context *context); + +#ifdef __cplusplus +} +#endif + +#define MY_MD5_HASH(digest,buf,len) \ +do { \ + my_MD5Context ctx; \ + my_MD5Init (&ctx); \ + my_MD5Update (&ctx, buf, len); \ + my_MD5Final (digest, &ctx); \ +} while (0) diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_net.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_net.h new file mode 100644 index 0000000..18fb3db --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_net.h @@ -0,0 +1,114 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* + thread safe version of some common functions: + my_inet_ntoa + + This file is also used to make handling of sockets and ioctl() + portable accross systems. + +*/ + +#ifndef _my_net_h +#define _my_net_h +C_MODE_START + +#include +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_ARPA_INET_H +#include +#endif +#ifdef HAVE_POLL +#include +#endif +#ifdef HAVE_SYS_IOCTL_H +#include +#endif + +#if !defined(__WIN__) && !defined(HAVE_BROKEN_NETINET_INCLUDES) && !defined(__NETWARE__) +#include +#include +#include +#if !defined(alpha_linux_port) +#include +#endif +#endif + +#if defined(__WIN__) +#define O_NONBLOCK 1 /* For emulation of fcntl() */ + +/* + SHUT_RDWR is called SD_BOTH in windows and + is defined to 2 in winsock2.h + #define SD_BOTH 0x02 +*/ +#define SHUT_RDWR 0x02 + +#endif + +/* + On OSes which don't have the in_addr_t, we guess that using uint32 is the best + possible choice. We guess this from the fact that on HP-UX64bit & FreeBSD64bit + & Solaris64bit, in_addr_t is equivalent to uint32. And on Linux32bit too. +*/ +#ifndef HAVE_IN_ADDR_T +#define in_addr_t uint32 +#endif + +/* Thread safe or portable version of some functions */ + +void my_inet_ntoa(struct in_addr in, char *buf); + +/* + Handling of gethostbyname_r() +*/ + +#if !defined(HAVE_GETHOSTBYNAME_R) +struct hostent *my_gethostbyname_r(const char *name, + struct hostent *result, char *buffer, + int buflen, int *h_errnop); +void my_gethostbyname_r_free(); +#elif defined(HAVE_PTHREAD_ATTR_CREATE) || defined(_AIX) || defined(HAVE_GETHOSTBYNAME_R_GLIBC2_STYLE) +struct hostent *my_gethostbyname_r(const char *name, + struct hostent *result, char *buffer, + int buflen, int *h_errnop); +#define my_gethostbyname_r_free() +#if !defined(HAVE_GETHOSTBYNAME_R_GLIBC2_STYLE) && !defined(HPUX10) +#define GETHOSTBYNAME_BUFF_SIZE sizeof(struct hostent_data) +#endif /* !defined(HAVE_GETHOSTBYNAME_R_GLIBC2_STYLE) */ + +#elif defined(HAVE_GETHOSTBYNAME_R_RETURN_INT) +#define GETHOSTBYNAME_BUFF_SIZE sizeof(struct hostent_data) +struct hostent *my_gethostbyname_r(const char *name, + struct hostent *result, char *buffer, + int buflen, int *h_errnop); +#define my_gethostbyname_r_free() +#else +#define my_gethostbyname_r(A,B,C,D,E) gethostbyname_r((A),(B),(C),(D),(E)) +#define my_gethostbyname_r_free() +#endif /* !defined(HAVE_GETHOSTBYNAME_R) */ + +#ifndef GETHOSTBYNAME_BUFF_SIZE +#define GETHOSTBYNAME_BUFF_SIZE 2048 +#endif + +C_MODE_END +#endif diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_no_pthread.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_no_pthread.h new file mode 100644 index 0000000..b11dbff --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_no_pthread.h @@ -0,0 +1,50 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + + +#if !defined(_my_no_pthread_h) && !defined(THREAD) +#define _my_no_pthread_h + + +/* + This block is to access some thread-related type definitions + even in builds which do not need thread functions, + as some variables (based on these types) are declared + even in non-threaded builds. + Case in point: 'mf_keycache.c' +*/ +#if defined(__WIN__) +#else /* Normal threads */ +#include + +#endif /* defined(__WIN__) */ + + +/* + This undefs some pthread mutex locks when one isn't using threads + to make thread safe code, that should also work in single thread + environment, easier to use. +*/ +#define pthread_mutex_init(A,B) +#define pthread_mutex_lock(A) +#define pthread_mutex_unlock(A) +#define pthread_mutex_destroy(A) +#define my_rwlock_init(A,B) +#define rw_rdlock(A) +#define rw_wrlock(A) +#define rw_unlock(A) +#define rwlock_destroy(A) + +#endif diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_nosys.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_nosys.h new file mode 100644 index 0000000..df5639b --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_nosys.h @@ -0,0 +1,52 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* + Header to remove use of my_functions in functions where we need speed and + where calls to posix functions should work +*/ +#ifndef _my_nosys_h +#define _my_nosys_h +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef __MY_NOSYS__ +#define __MY_NOSYS__ + +#ifndef HAVE_STDLIB_H +#include +#endif + +#undef my_read /* Can be predefined in raid.h */ +#undef my_write +#undef my_seek +#define my_read(a,b,c,d) my_quick_read(a,b,c,d) +#define my_write(a,b,c,d) my_quick_write(a,b,c) +extern size_t my_quick_read(File Filedes,uchar *Buffer,size_t Count, + myf myFlags); +extern size_t my_quick_write(File Filedes,const uchar *Buffer,size_t Count); + +#if !defined(SAFEMALLOC) && defined(USE_HALLOC) +#define my_malloc(a,b) halloc(a,1) +#define my_no_flags_free(a) hfree(a) +#endif + +#endif /* __MY_NOSYS__ */ + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_pthread.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_pthread.h new file mode 100644 index 0000000..ab26860 --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_pthread.h @@ -0,0 +1,734 @@ +/* Copyright (C) 2000-2008 MySQL AB, 2008-2009 Sun Microsystems, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* Defines to make different thread packages compatible */ + +#ifndef _my_pthread_h +#define _my_pthread_h + +#ifndef ETIME +#define ETIME ETIMEDOUT /* For FreeBSD */ +#endif + +#ifdef __cplusplus +#define EXTERNC extern "C" +extern "C" { +#else +#define EXTERNC +#endif /* __cplusplus */ + +#if defined(__WIN__) +typedef CRITICAL_SECTION pthread_mutex_t; +typedef DWORD pthread_t; +typedef struct thread_attr { + DWORD dwStackSize ; + DWORD dwCreatingFlag ; +} pthread_attr_t ; + +typedef struct { int dummy; } pthread_condattr_t; + +/* Implementation of posix conditions */ + +typedef struct st_pthread_link { + DWORD thread_id; + struct st_pthread_link *next; +} pthread_link; + +typedef struct { + uint32 waiting; + CRITICAL_SECTION lock_waiting; + + enum { + SIGNAL= 0, + BROADCAST= 1, + MAX_EVENTS= 2 + } EVENTS; + + HANDLE events[MAX_EVENTS]; + HANDLE broadcast_block_event; + +} pthread_cond_t; + + +typedef int pthread_mutexattr_t; +#define pthread_self() GetCurrentThreadId() +#define pthread_handler_t EXTERNC void * __cdecl +typedef void * (__cdecl *pthread_handler)(void *); + +/* + Struct and macros to be used in combination with the + windows implementation of pthread_cond_timedwait +*/ + +/* + Declare a union to make sure FILETIME is properly aligned + so it can be used directly as a 64 bit value. The value + stored is in 100ns units. + */ +union ft64 { + FILETIME ft; + __int64 i64; +}; + +struct timespec { + union ft64 tv; + /* The max timeout value in millisecond for pthread_cond_timedwait */ + long max_timeout_msec; +}; + +#define set_timespec_time_nsec(ABSTIME,TIME,NSEC) do { \ + (ABSTIME).tv.i64= (TIME)+(__int64)(NSEC)/100; \ + (ABSTIME).max_timeout_msec= (long)((NSEC)/1000000); \ +} while(0) + +#define set_timespec_nsec(ABSTIME,NSEC) do { \ + union ft64 tv; \ + GetSystemTimeAsFileTime(&tv.ft); \ + set_timespec_time_nsec((ABSTIME), tv.i64, (NSEC)); \ +} while(0) + +int win_pthread_mutex_trylock(pthread_mutex_t *mutex); +int pthread_create(pthread_t *,pthread_attr_t *,pthread_handler,void *); +int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr); +int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex); +int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, + struct timespec *abstime); +int pthread_cond_signal(pthread_cond_t *cond); +int pthread_cond_broadcast(pthread_cond_t *cond); +int pthread_cond_destroy(pthread_cond_t *cond); +int pthread_attr_init(pthread_attr_t *connect_att); +int pthread_attr_setstacksize(pthread_attr_t *connect_att,DWORD stack); +int pthread_attr_destroy(pthread_attr_t *connect_att); +struct tm *localtime_r(const time_t *timep,struct tm *tmp); +struct tm *gmtime_r(const time_t *timep,struct tm *tmp); + +void pthread_exit(void *a); +int pthread_join(pthread_t thread, void **value_ptr); + + +#define ETIMEDOUT 145 /* Win32 doesn't have this */ +#define HAVE_LOCALTIME_R 1 +#define _REENTRANT 1 +#define HAVE_PTHREAD_ATTR_SETSTACKSIZE 1 + + +#undef SAFE_MUTEX /* This will cause conflicts */ +#define pthread_key(T,V) DWORD V +#define pthread_key_create(A,B) ((*A=TlsAlloc())==0xFFFFFFFF) +#define pthread_key_delete(A) TlsFree(A) +#define my_pthread_setspecific_ptr(T,V) (!TlsSetValue((T),(V))) +#define pthread_setspecific(A,B) (!TlsSetValue((A),(B))) +#define pthread_getspecific(A) (TlsGetValue(A)) +#define my_pthread_getspecific(T,A) ((T) TlsGetValue(A)) +#define my_pthread_getspecific_ptr(T,V) ((T) TlsGetValue(V)) + +#define pthread_equal(A,B) ((A) == (B)) +#define pthread_mutex_init(A,B) (InitializeCriticalSection(A),0) +#define pthread_mutex_lock(A) (EnterCriticalSection(A),0) +#define pthread_mutex_trylock(A) win_pthread_mutex_trylock((A)) +#define pthread_mutex_unlock(A) (LeaveCriticalSection(A),0) +#define pthread_mutex_destroy(A) DeleteCriticalSection(A) +#define pthread_kill(A,B) pthread_dummy((A) ? 0 : ESRCH) + + +/* Dummy defines for easier code */ +#define pthread_attr_setdetachstate(A,B) pthread_dummy(0) +#define pthread_attr_setscope(A,B) +#define pthread_detach_this_thread() +#define pthread_condattr_init(A) +#define pthread_condattr_destroy(A) +#define pthread_yield() SwitchToThread() + + +#else /* Normal threads */ + +#ifdef HAVE_rts_threads +#define sigwait org_sigwait +#include +#undef sigwait +#endif +#include +#ifndef _REENTRANT +#define _REENTRANT +#endif +#ifdef HAVE_THR_SETCONCURRENCY +#include /* Probably solaris */ +#endif +#ifdef HAVE_SCHED_H +#include +#endif +#ifdef HAVE_SYNCH_H +#include +#endif + +#ifdef __NETWARE__ +void my_pthread_exit(void *status); +#define pthread_exit(A) my_pthread_exit(A) +#endif + +#define pthread_key(T,V) pthread_key_t V +#define my_pthread_getspecific_ptr(T,V) my_pthread_getspecific(T,(V)) +#define my_pthread_setspecific_ptr(T,V) pthread_setspecific(T,(void*) (V)) +#define pthread_detach_this_thread() +#define pthread_handler_t EXTERNC void * +typedef void *(* pthread_handler)(void *); + +/* Test first for RTS or FSU threads */ + +#if defined(PTHREAD_SCOPE_GLOBAL) && !defined(PTHREAD_SCOPE_SYSTEM) +#define HAVE_rts_threads +extern int my_pthread_create_detached; +#define pthread_sigmask(A,B,C) sigprocmask((A),(B),(C)) +#define PTHREAD_CREATE_DETACHED &my_pthread_create_detached +#define PTHREAD_SCOPE_SYSTEM PTHREAD_SCOPE_GLOBAL +#define PTHREAD_SCOPE_PROCESS PTHREAD_SCOPE_LOCAL +#define USE_ALARM_THREAD +#endif /* defined(PTHREAD_SCOPE_GLOBAL) && !defined(PTHREAD_SCOPE_SYSTEM) */ + +#if defined(_BSDI_VERSION) && _BSDI_VERSION < 199910 +int sigwait(sigset_t *set, int *sig); +#endif + +#ifndef HAVE_NONPOSIX_SIGWAIT +#define my_sigwait(A,B) sigwait((A),(B)) +#else +int my_sigwait(const sigset_t *set,int *sig); +#endif + +#ifdef HAVE_NONPOSIX_PTHREAD_MUTEX_INIT +#ifndef SAFE_MUTEX +#define pthread_mutex_init(a,b) my_pthread_mutex_noposix_init((a),(b)) +extern int my_pthread_mutex_noposix_init(pthread_mutex_t *mp, + const pthread_mutexattr_t *attr); +#endif /* SAFE_MUTEX */ +#define pthread_cond_init(a,b) my_pthread_cond_noposix_init((a),(b)) +extern int my_pthread_cond_noposix_init(pthread_cond_t *mp, + const pthread_condattr_t *attr); +#endif /* HAVE_NONPOSIX_PTHREAD_MUTEX_INIT */ + +#if defined(HAVE_SIGTHREADMASK) && !defined(HAVE_PTHREAD_SIGMASK) +#define pthread_sigmask(A,B,C) sigthreadmask((A),(B),(C)) +#endif + +#if !defined(HAVE_SIGWAIT) && !defined(HAVE_rts_threads) && !defined(sigwait) && !defined(alpha_linux_port) && !defined(HAVE_NONPOSIX_SIGWAIT) && !defined(HAVE_DEC_3_2_THREADS) && !defined(_AIX) +int sigwait(sigset_t *setp, int *sigp); /* Use our implemention */ +#endif + + +/* + We define my_sigset() and use that instead of the system sigset() so that + we can favor an implementation based on sigaction(). On some systems, such + as Mac OS X, sigset() results in flags such as SA_RESTART being set, and + we want to make sure that no such flags are set. +*/ +#if defined(HAVE_SIGACTION) && !defined(my_sigset) +#define my_sigset(A,B) do { struct sigaction l_s; sigset_t l_set; int l_rc; \ + DBUG_ASSERT((A) != 0); \ + sigemptyset(&l_set); \ + l_s.sa_handler = (B); \ + l_s.sa_mask = l_set; \ + l_s.sa_flags = 0; \ + l_rc= sigaction((A), &l_s, (struct sigaction *) NULL);\ + DBUG_ASSERT(l_rc == 0); \ + } while (0) +#elif defined(HAVE_SIGSET) && !defined(my_sigset) +#define my_sigset(A,B) sigset((A),(B)) +#elif !defined(my_sigset) +#define my_sigset(A,B) signal((A),(B)) +#endif + +#if !defined(HAVE_PTHREAD_ATTR_SETSCOPE) || defined(HAVE_DEC_3_2_THREADS) +#define pthread_attr_setscope(A,B) +#undef HAVE_GETHOSTBYADDR_R /* No definition */ +#endif + +#if defined(HAVE_BROKEN_PTHREAD_COND_TIMEDWAIT) && !defined(SAFE_MUTEX) +extern int my_pthread_cond_timedwait(pthread_cond_t *cond, + pthread_mutex_t *mutex, + struct timespec *abstime); +#define pthread_cond_timedwait(A,B,C) my_pthread_cond_timedwait((A),(B),(C)) +#endif + +#if !defined( HAVE_NONPOSIX_PTHREAD_GETSPECIFIC) +#define my_pthread_getspecific(A,B) ((A) pthread_getspecific(B)) +#else +#define my_pthread_getspecific(A,B) ((A) my_pthread_getspecific_imp(B)) +void *my_pthread_getspecific_imp(pthread_key_t key); +#endif + +#ifndef HAVE_LOCALTIME_R +struct tm *localtime_r(const time_t *clock, struct tm *res); +#endif + +#ifndef HAVE_GMTIME_R +struct tm *gmtime_r(const time_t *clock, struct tm *res); +#endif + +#ifdef HAVE_PTHREAD_CONDATTR_CREATE +/* DCE threads on HPUX 10.20 */ +#define pthread_condattr_init pthread_condattr_create +#define pthread_condattr_destroy pthread_condattr_delete +#endif + +/* FSU THREADS */ +#if !defined(HAVE_PTHREAD_KEY_DELETE) && !defined(pthread_key_delete) +#define pthread_key_delete(A) pthread_dummy(0) +#endif + +#if ((defined(HAVE_PTHREAD_ATTR_CREATE) && !defined(HAVE_SIGWAIT)) || defined(HAVE_DEC_3_2_THREADS)) +/* This is set on AIX_3_2 and Siemens unix (and DEC OSF/1 3.2 too) */ +#define pthread_key_create(A,B) \ + pthread_keycreate(A,(B) ?\ + (pthread_destructor_t) (B) :\ + (pthread_destructor_t) pthread_dummy) +#define pthread_attr_init(A) pthread_attr_create(A) +#define pthread_attr_destroy(A) pthread_attr_delete(A) +#define pthread_attr_setdetachstate(A,B) pthread_dummy(0) +#define pthread_create(A,B,C,D) pthread_create((A),*(B),(C),(D)) +#ifndef pthread_sigmask +#define pthread_sigmask(A,B,C) sigprocmask((A),(B),(C)) +#endif +#define pthread_kill(A,B) pthread_dummy((A) ? 0 : ESRCH) +#undef pthread_detach_this_thread +#define pthread_detach_this_thread() { pthread_t tmp=pthread_self() ; pthread_detach(&tmp); } +#elif !defined(__NETWARE__) /* HAVE_PTHREAD_ATTR_CREATE && !HAVE_SIGWAIT */ +#ifndef HAVE_PTHREAD_KILL +# define HAVE_PTHREAD_KILL +#endif +#endif + +#endif /* defined(__WIN__) */ + +#if defined(HPUX10) && !defined(DONT_REMAP_PTHREAD_FUNCTIONS) +#undef pthread_cond_timedwait +#define pthread_cond_timedwait(a,b,c) my_pthread_cond_timedwait((a),(b),(c)) +int my_pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, + struct timespec *abstime); +#endif + +#if defined(HPUX10) +#define pthread_attr_getstacksize(A,B) my_pthread_attr_getstacksize(A,B) +void my_pthread_attr_getstacksize(pthread_attr_t *attrib, size_t *size); +#endif + +#if defined(HAVE_POSIX1003_4a_MUTEX) && !defined(DONT_REMAP_PTHREAD_FUNCTIONS) +#undef pthread_mutex_trylock +#define pthread_mutex_trylock(a) my_pthread_mutex_trylock((a)) +int my_pthread_mutex_trylock(pthread_mutex_t *mutex); +#endif + +#if !defined(HAVE_PTHREAD_YIELD_ONE_ARG) && !defined(HAVE_PTHREAD_YIELD_ZERO_ARG) +/* no pthread_yield() available */ +#ifdef HAVE_SCHED_YIELD +#define pthread_yield() sched_yield() +#elif defined(HAVE_PTHREAD_YIELD_NP) /* can be Mac OS X */ +#define pthread_yield() pthread_yield_np() +#elif defined(HAVE_THR_YIELD) +#define pthread_yield() thr_yield() +#endif +#endif + +/* + The defines set_timespec and set_timespec_nsec should be used + for calculating an absolute time at which + pthread_cond_timedwait should timeout +*/ + +#define set_timespec(ABSTIME,SEC) set_timespec_nsec((ABSTIME),(SEC)*1000000000ULL) + +#ifndef set_timespec_nsec +#define set_timespec_nsec(ABSTIME,NSEC) \ + set_timespec_time_nsec((ABSTIME),my_getsystime(),(NSEC)) +#endif /* !set_timespec_nsec */ + +/* adapt for two different flavors of struct timespec */ +#ifdef HAVE_TIMESPEC_TS_SEC +#define MY_tv_sec ts_sec +#define MY_tv_nsec ts_nsec +#else +#define MY_tv_sec tv_sec +#define MY_tv_nsec tv_nsec +#endif /* HAVE_TIMESPEC_TS_SEC */ + +#ifndef set_timespec_time_nsec +#define set_timespec_time_nsec(ABSTIME,TIME,NSEC) do { \ + ulonglong nsec= (NSEC); \ + ulonglong now= (TIME) + (nsec/100); \ + (ABSTIME).MY_tv_sec= (now / 10000000ULL); \ + (ABSTIME).MY_tv_nsec= (now % 10000000ULL * 100 + (nsec % 100)); \ +} while(0) +#endif /* !set_timespec_time_nsec */ + +/* safe_mutex adds checking to mutex for easier debugging */ + +#if defined(__NETWARE__) && !defined(SAFE_MUTEX_DETECT_DESTROY) +#define SAFE_MUTEX_DETECT_DESTROY +#endif +struct st_hash; + +typedef struct st_safe_mutex_t +{ + pthread_mutex_t global,mutex; + const char *file, *name; + uint line,count; + myf create_flags, active_flags; + ulong id; + pthread_t thread; + struct st_hash *locked_mutex, *used_mutex; + struct st_safe_mutex_t *prev, *next; +#ifdef SAFE_MUTEX_DETECT_DESTROY + struct st_safe_mutex_info_t *info; /* to track destroying of mutexes */ +#endif +} safe_mutex_t; + +typedef struct st_safe_mutex_deadlock_t +{ + const char *file, *name; + safe_mutex_t *mutex; + uint line; + ulong count; + ulong id; + my_bool warning_only; +} safe_mutex_deadlock_t; + +#ifdef SAFE_MUTEX_DETECT_DESTROY +/* + Used to track the destroying of mutexes. This needs to be a seperate + structure because the safe_mutex_t structure could be freed before + the mutexes are destroyed. +*/ + +typedef struct st_safe_mutex_info_t +{ + struct st_safe_mutex_info_t *next; + struct st_safe_mutex_info_t *prev; + const char *init_file; + uint32 init_line; +} safe_mutex_info_t; +#endif /* SAFE_MUTEX_DETECT_DESTROY */ + +int safe_mutex_init(safe_mutex_t *mp, const pthread_mutexattr_t *attr, + const char *name, myf my_flags, + const char *file, uint line); +int safe_mutex_lock(safe_mutex_t *mp, myf my_flags, const char *file, + uint line); +int safe_mutex_unlock(safe_mutex_t *mp,const char *file, uint line); +int safe_mutex_destroy(safe_mutex_t *mp,const char *file, uint line); +int safe_cond_wait(pthread_cond_t *cond, safe_mutex_t *mp,const char *file, + uint line); +int safe_cond_timedwait(pthread_cond_t *cond, safe_mutex_t *mp, + struct timespec *abstime, const char *file, uint line); +void safe_mutex_global_init(void); +void safe_mutex_end(FILE *file); +void safe_mutex_free_deadlock_data(safe_mutex_t *mp); + + /* Wrappers if safe mutex is actually used */ +#define MYF_TRY_LOCK 1 +#define MYF_NO_DEADLOCK_DETECTION 2 + +#ifdef SAFE_MUTEX +#undef pthread_mutex_init +#undef pthread_mutex_lock +#undef pthread_mutex_unlock +#undef pthread_mutex_destroy +#undef pthread_mutex_wait +#undef pthread_mutex_timedwait +#undef pthread_mutex_t +#undef pthread_cond_wait +#undef pthread_cond_timedwait +#undef pthread_mutex_trylock +#define my_pthread_mutex_init(A,B,C,D) safe_mutex_init((A),(B),(C),(D),__FILE__,__LINE__) +#define pthread_mutex_init(A,B) safe_mutex_init((A),(B),#A,0,__FILE__,__LINE__) +#define pthread_mutex_lock(A) safe_mutex_lock((A), 0, __FILE__, __LINE__) +#define my_pthread_mutex_lock(A,B) safe_mutex_lock((A), (B), __FILE__, __LINE__) +#define pthread_mutex_unlock(A) safe_mutex_unlock((A),__FILE__,__LINE__) +#define pthread_mutex_destroy(A) safe_mutex_destroy((A),__FILE__,__LINE__) +#define pthread_cond_wait(A,B) safe_cond_wait((A),(B),__FILE__,__LINE__) +#define pthread_cond_timedwait(A,B,C) safe_cond_timedwait((A),(B),(C),__FILE__,__LINE__) +#define pthread_mutex_trylock(A) safe_mutex_lock((A), MYF_TRY_LOCK, __FILE__, __LINE__) +#define pthread_mutex_t safe_mutex_t +#define safe_mutex_assert_owner(mp) \ + DBUG_ASSERT((mp)->count > 0 && \ + pthread_equal(pthread_self(), (mp)->thread)) +#define safe_mutex_assert_not_owner(mp) \ + DBUG_ASSERT(! (mp)->count || \ + ! pthread_equal(pthread_self(), (mp)->thread)) +#else +#define my_pthread_mutex_init(A,B,C,D) pthread_mutex_init((A),(B)) +#define my_pthread_mutex_lock(A,B) pthread_mutex_lock(A) +#define safe_mutex_assert_owner(mp) +#define safe_mutex_assert_not_owner(mp) +#endif /* SAFE_MUTEX */ + +#if defined(MY_PTHREAD_FASTMUTEX) && !defined(SAFE_MUTEX) +typedef struct st_my_pthread_fastmutex_t +{ + pthread_mutex_t mutex; + uint spins; + uint rng_state; +} my_pthread_fastmutex_t; +void fastmutex_global_init(void); + +int my_pthread_fastmutex_init(my_pthread_fastmutex_t *mp, + const pthread_mutexattr_t *attr); +int my_pthread_fastmutex_lock(my_pthread_fastmutex_t *mp); + +#undef pthread_mutex_init +#undef pthread_mutex_lock +#undef pthread_mutex_unlock +#undef pthread_mutex_destroy +#undef pthread_mutex_wait +#undef pthread_mutex_timedwait +#undef pthread_mutex_t +#undef pthread_cond_wait +#undef pthread_cond_timedwait +#undef pthread_mutex_trylock +#define pthread_mutex_init(A,B) my_pthread_fastmutex_init((A),(B)) +#define pthread_mutex_lock(A) my_pthread_fastmutex_lock(A) +#define pthread_mutex_unlock(A) pthread_mutex_unlock(&(A)->mutex) +#define pthread_mutex_destroy(A) pthread_mutex_destroy(&(A)->mutex) +#define pthread_cond_wait(A,B) pthread_cond_wait((A),&(B)->mutex) +#define pthread_cond_timedwait(A,B,C) pthread_cond_timedwait((A),&(B)->mutex,(C)) +#define pthread_mutex_trylock(A) pthread_mutex_trylock(&(A)->mutex) +#define pthread_mutex_t my_pthread_fastmutex_t +#endif /* defined(MY_PTHREAD_FASTMUTEX) && !defined(SAFE_MUTEX) */ + + /* READ-WRITE thread locking */ + +#ifdef HAVE_BROKEN_RWLOCK /* For OpenUnix */ +#undef HAVE_PTHREAD_RWLOCK_RDLOCK +#undef HAVE_RWLOCK_INIT +#undef HAVE_RWLOCK_T +#endif + +#if defined(USE_MUTEX_INSTEAD_OF_RW_LOCKS) +/* use these defs for simple mutex locking */ +#define rw_lock_t pthread_mutex_t +#define my_rwlock_init(A,B) pthread_mutex_init((A),(B)) +#define rw_rdlock(A) pthread_mutex_lock((A)) +#define rw_wrlock(A) pthread_mutex_lock((A)) +#define rw_tryrdlock(A) pthread_mutex_trylock((A)) +#define rw_trywrlock(A) pthread_mutex_trylock((A)) +#define rw_unlock(A) pthread_mutex_unlock((A)) +#define rwlock_destroy(A) pthread_mutex_destroy((A)) +#elif defined(HAVE_PTHREAD_RWLOCK_RDLOCK) +#define rw_lock_t pthread_rwlock_t +#define my_rwlock_init(A,B) pthread_rwlock_init((A),(B)) +#define rw_rdlock(A) pthread_rwlock_rdlock(A) +#define rw_wrlock(A) pthread_rwlock_wrlock(A) +#define rw_tryrdlock(A) pthread_rwlock_tryrdlock((A)) +#define rw_trywrlock(A) pthread_rwlock_trywrlock((A)) +#define rw_unlock(A) pthread_rwlock_unlock(A) +#define rwlock_destroy(A) pthread_rwlock_destroy(A) +#elif defined(HAVE_RWLOCK_INIT) +#ifdef HAVE_RWLOCK_T /* For example Solaris 2.6-> */ +#define rw_lock_t rwlock_t +#endif +#define my_rwlock_init(A,B) rwlock_init((A),USYNC_THREAD,0) +#else +/* Use our own version of read/write locks */ +typedef struct _my_rw_lock_t { + pthread_mutex_t lock; /* lock for structure */ + pthread_cond_t readers; /* waiting readers */ + pthread_cond_t writers; /* waiting writers */ + int state; /* -1:writer,0:free,>0:readers */ + int waiters; /* number of waiting writers */ +} my_rw_lock_t; + +#define rw_lock_t my_rw_lock_t +#define rw_rdlock(A) my_rw_rdlock((A)) +#define rw_wrlock(A) my_rw_wrlock((A)) +#define rw_tryrdlock(A) my_rw_tryrdlock((A)) +#define rw_trywrlock(A) my_rw_trywrlock((A)) +#define rw_unlock(A) my_rw_unlock((A)) +#define rwlock_destroy(A) my_rwlock_destroy((A)) + +extern int my_rwlock_init(my_rw_lock_t *, void *); +extern int my_rwlock_destroy(my_rw_lock_t *); +extern int my_rw_rdlock(my_rw_lock_t *); +extern int my_rw_wrlock(my_rw_lock_t *); +extern int my_rw_unlock(my_rw_lock_t *); +extern int my_rw_tryrdlock(my_rw_lock_t *); +extern int my_rw_trywrlock(my_rw_lock_t *); +#endif /* USE_MUTEX_INSTEAD_OF_RW_LOCKS */ + +#define GETHOSTBYADDR_BUFF_SIZE 2048 + +#ifndef HAVE_THR_SETCONCURRENCY +#define thr_setconcurrency(A) pthread_dummy(0) +#endif +#if !defined(HAVE_PTHREAD_ATTR_SETSTACKSIZE) && ! defined(pthread_attr_setstacksize) +#define pthread_attr_setstacksize(A,B) pthread_dummy(0) +#endif + +/* Define mutex types, see my_thr_init.c */ +#define MY_MUTEX_INIT_SLOW NULL +#ifdef PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP +extern pthread_mutexattr_t my_fast_mutexattr; +#define MY_MUTEX_INIT_FAST &my_fast_mutexattr +#else +#define MY_MUTEX_INIT_FAST NULL +#endif +#ifdef PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP +extern pthread_mutexattr_t my_errorcheck_mutexattr; +#define MY_MUTEX_INIT_ERRCHK &my_errorcheck_mutexattr +#else +#define MY_MUTEX_INIT_ERRCHK NULL +#endif + +#ifndef ESRCH +/* Define it to something */ +#define ESRCH 1 +#endif + +typedef ulong my_thread_id; + +extern void my_threadattr_global_init(void); +extern my_bool my_thread_global_init(void); +extern void my_thread_global_end(void); +extern my_bool my_thread_init(void); +extern void my_thread_end(void); +extern const char *my_thread_name(void); +extern my_thread_id my_thread_dbug_id(void); +extern int pthread_dummy(int); + +/* All thread specific variables are in the following struct */ + +#define THREAD_NAME_SIZE 10 +#ifndef DEFAULT_THREAD_STACK +#if SIZEOF_CHARP > 4 +/* + MySQL can survive with 32K, but some glibc libraries require > 128K stack + To resolve hostnames. Also recursive stored procedures needs stack. +*/ +#define DEFAULT_THREAD_STACK (256*1024L) +#else +#define DEFAULT_THREAD_STACK (195*1024) +#endif +#endif + +#define MY_PTHREAD_LOCK_READ 0 +#define MY_PTHREAD_LOCK_WRITE 1 + +struct st_my_thread_var +{ + int thr_errno; + pthread_cond_t suspend; + pthread_mutex_t mutex; + pthread_mutex_t * volatile current_mutex; + pthread_cond_t * volatile current_cond; + pthread_t pthread_self; + my_thread_id id; + int cmp_length; + int volatile abort; + my_bool init; + struct st_my_thread_var *next,**prev; + void *opt_info; + uint lock_type; /* used by conditional release the queue */ + void *stack_ends_here; + safe_mutex_t *mutex_in_use; +#ifndef DBUG_OFF + void *dbug; + char name[THREAD_NAME_SIZE+1]; +#endif +}; + +extern struct st_my_thread_var *_my_thread_var(void) __attribute__ ((const)); +extern void **my_thread_var_dbug(); +extern safe_mutex_t **my_thread_var_mutex_in_use(); +extern uint my_thread_end_wait_time; +extern my_bool safe_mutex_deadlock_detector; +#define my_thread_var (_my_thread_var()) +#define my_errno my_thread_var->thr_errno +/* + Keep track of shutdown,signal, and main threads so that my_end() will not + report errors with them +*/ + +/* Which kind of thread library is in use */ + +#define THD_LIB_OTHER 1 +#define THD_LIB_NPTL 2 +#define THD_LIB_LT 4 + +extern uint thd_lib_detected; + +/* + thread_safe_xxx functions are for critical statistic or counters. + The implementation is guaranteed to be thread safe, on all platforms. + Note that the calling code should *not* assume the counter is protected + by the mutex given, as the implementation of these helpers may change + to use my_atomic operations instead. +*/ + +/* + Warning: + When compiling without threads, this file is not included. + See the *other* declarations of thread_safe_xxx in include/my_global.h + + Second warning: + See include/config-win.h, for yet another implementation. +*/ +#ifdef THREAD +#ifndef thread_safe_increment +#define thread_safe_increment(V,L) \ + (pthread_mutex_lock((L)), (V)++, pthread_mutex_unlock((L))) +#define thread_safe_decrement(V,L) \ + (pthread_mutex_lock((L)), (V)--, pthread_mutex_unlock((L))) +#endif + +#ifndef thread_safe_add +#define thread_safe_add(V,C,L) \ + (pthread_mutex_lock((L)), (V)+=(C), pthread_mutex_unlock((L))) +#define thread_safe_sub(V,C,L) \ + (pthread_mutex_lock((L)), (V)-=(C), pthread_mutex_unlock((L))) +#endif +#endif + +/* + statistics_xxx functions are for non critical statistic, + maintained in global variables. + When compiling with SAFE_STATISTICS: + - race conditions can not occur. + - some locking occurs, which may cause performance degradation. + + When compiling without SAFE_STATISTICS: + - race conditions can occur, making the result slightly inaccurate. + - the lock given is not honored. +*/ +#ifdef SAFE_STATISTICS +#define statistic_increment(V,L) thread_safe_increment((V),(L)) +#define statistic_decrement(V,L) thread_safe_decrement((V),(L)) +#define statistic_add(V,C,L) thread_safe_add((V),(C),(L)) +#define statistic_sub(V,C,L) thread_safe_sub((V),(C),(L)) +#else +#define statistic_decrement(V,L) (V)-- +#define statistic_increment(V,L) (V)++ +#define statistic_add(V,C,L) (V)+=(C) +#define statistic_sub(V,C,L) (V)-=(C) +#endif /* SAFE_STATISTICS */ + +/* + No locking needed, the counter is owned by the thread +*/ +#define status_var_increment(V) (V)++ +#define status_var_decrement(V) (V)-- +#define status_var_add(V,C) (V)+=(C) +#define status_var_sub(V,C) (V)-=(C) + +#ifdef __cplusplus +} +#endif +#endif /* _my_ptread_h */ diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_stacktrace.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_stacktrace.h new file mode 100644 index 0000000..e7ce42c --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_stacktrace.h @@ -0,0 +1,66 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef _my_stacktrace_h_ +#define _my_stacktrace_h_ + +#include + +#ifdef TARGET_OS_LINUX +#if defined (__x86_64__) || defined (__i386__) || \ + (defined(__alpha__) && defined(__GNUC__)) +#define HAVE_STACKTRACE 1 +#endif +#elif defined(__WIN__) +#define HAVE_STACKTRACE 1 +#endif + +#if HAVE_BACKTRACE && (HAVE_BACKTRACE_SYMBOLS || HAVE_BACKTRACE_SYMBOLS_FD) +#undef HAVE_STACKTRACE +#define HAVE_STACKTRACE 1 +#endif + +#if !defined(__NETWARE__) +#define HAVE_WRITE_CORE +#endif + +#if HAVE_BACKTRACE && HAVE_BACKTRACE_SYMBOLS && \ + HAVE_CXXABI_H && HAVE_ABI_CXA_DEMANGLE && \ + HAVE_WEAK_SYMBOL +#define BACKTRACE_DEMANGLE 1 +#endif + +C_MODE_START + +#if defined(HAVE_STACKTRACE) || defined(HAVE_BACKTRACE) +void my_init_stacktrace(); +void my_print_stacktrace(uchar* stack_bottom, ulong thread_stack); +void my_safe_print_str(const char* name, const char* val, int max_len); +void my_write_core(int sig); +#if BACKTRACE_DEMANGLE +char *my_demangle(const char *mangled_name, int *status); +#endif +#ifdef __WIN__ +void my_set_exception_pointers(EXCEPTION_POINTERS *ep); +#endif +#endif + +#ifdef HAVE_WRITE_CORE +void my_write_core(int sig); +#endif + +C_MODE_END + +#endif /* _my_stacktrace_h_ */ diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_sys.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_sys.h new file mode 100644 index 0000000..c8ec791 --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_sys.h @@ -0,0 +1,1082 @@ +/* Copyright (C) 2000-2003 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/** + @file + mysys library API +*/ + +#ifndef _my_sys_h +#define _my_sys_h +C_MODE_START + +#ifdef HAVE_AIOWAIT +#include /* Used by record-cache */ +typedef struct my_aio_result { + aio_result_t result; + int pending; +} my_aio_result; +#endif + +#ifndef THREAD +extern int NEAR my_errno; /* Last error in mysys */ +#else +#include +#endif + +#include /* for CHARSET_INFO */ +#include +#include + +#define MYSYS_PROGRAM_DONT_USE_CURSES() { error_handler_hook = my_message_no_curses; mysys_uses_curses=0;} +#define MY_INIT(name); { my_progname= name; my_init(); } + +/** + Max length of an error message generated by mysys utilities. + Some mysys functions produce error messages. These mostly go + to stderr. + This constant defines the size of the buffer used to format + the message. It should be kept in sync with MYSQL_ERRMSG_SIZE, + since sometimes mysys errors are stored in the server diagnostics + area, and we would like to avoid unexpected truncation. +*/ +#define MYSYS_ERRMSG_SIZE (512) + +#define MY_FILE_ERROR ((size_t) -1) + + /* General bitmaps for my_func's */ +#define MY_FFNF 1 /* Fatal if file not found */ +#define MY_FNABP 2 /* Fatal if not all bytes read/writen */ +#define MY_NABP 4 /* Error if not all bytes read/writen */ +#define MY_FAE 8 /* Fatal if any error */ +#define MY_WME 16 /* Write message on error */ +#define MY_WAIT_IF_FULL 32 /* Wait and try again if disk full error */ +#define MY_IGNORE_BADFD 32 /* my_sync: ignore 'bad descriptor' errors */ +#define MY_SYNC_DIR 1024 /* my_create/delete/rename: sync directory */ +#define MY_RAID 64 /* Support for RAID */ +#define MY_FULL_IO 512 /* For my_read - loop intil I/O is complete */ +#define MY_DONT_CHECK_FILESIZE 128 /* Option to init_io_cache() */ +#define MY_LINK_WARNING 32 /* my_redel() gives warning if links */ +#define MY_COPYTIME 64 /* my_redel() copys time */ +#define MY_DELETE_OLD 256 /* my_create_with_symlink() */ +#define MY_RESOLVE_LINK 128 /* my_realpath(); Only resolve links */ +#define MY_HOLD_ORIGINAL_MODES 128 /* my_copy() holds to file modes */ +#define MY_REDEL_MAKE_BACKUP 256 +#define MY_SEEK_NOT_DONE 32 /* my_lock may have to do a seek */ +#define MY_SHORT_WAIT 64 /* my_lock() don't wait if can't lock */ +#define MY_FORCE_LOCK 128 /* use my_lock() even if disable_locking */ +#define MY_NO_WAIT 256 /* my_lock() don't wait at all */ +#define MY_ZEROFILL 32 /* my_malloc(), fill array with zero */ +#define MY_ALLOW_ZERO_PTR 64 /* my_realloc() ; zero ptr -> malloc */ +#define MY_FREE_ON_ERROR 128 /* my_realloc() ; Free old ptr on error */ +#define MY_HOLD_ON_ERROR 256 /* my_realloc() ; Return old ptr on error */ +#define MY_DONT_OVERWRITE_FILE 2048 /* my_copy: Don't overwrite file */ +#define MY_THREADSAFE 2048 /* my_seek(): lock fd mutex */ + +#define MY_CHECK_ERROR 1 /* Params to my_end; Check open-close */ +#define MY_GIVE_INFO 2 /* Give time info about process*/ +#define MY_DONT_FREE_DBUG 4 /* Do not call DBUG_END() in my_end() */ + +#define MY_REMOVE_NONE 0 /* Params for modify_defaults_file */ +#define MY_REMOVE_OPTION 1 +#define MY_REMOVE_SECTION 2 + +#define ME_HIGHBYTE 8 /* Shift for colours */ +#define ME_NOCUR 1 /* Don't use curses message */ +#define ME_OLDWIN 2 /* Use old window */ +#define ME_BELL 4 /* Ring bell then printing message */ +#define ME_HOLDTANG 8 /* Don't delete last keys */ +#define ME_WAITTOT 16 /* Wait for errtime secs of for a action */ +#define ME_WAITTANG 32 /* Wait for a user action */ +#define ME_NOREFRESH 64 /* Dont refresh screen */ +#define ME_NOINPUT 128 /* Dont use the input libary */ +#define ME_COLOUR1 ((1 << ME_HIGHBYTE)) /* Possibly error-colours */ +#define ME_COLOUR2 ((2 << ME_HIGHBYTE)) +#define ME_COLOUR3 ((3 << ME_HIGHBYTE)) +#define ME_FATALERROR 1024 /* Fatal statement error */ +#define ME_JUST_INFO 8192 /**< not error but just info */ +#define ME_JUST_WARNING 16384 /**< not error but just warning */ + + /* Bits in last argument to fn_format */ +#define MY_REPLACE_DIR 1 /* replace dir in name with 'dir' */ +#define MY_REPLACE_EXT 2 /* replace extension with 'ext' */ +#define MY_UNPACK_FILENAME 4 /* Unpack name (~ -> home) */ +#define MY_PACK_FILENAME 8 /* Pack name (home -> ~) */ +#define MY_RESOLVE_SYMLINKS 16 /* Resolve all symbolic links */ +#define MY_RETURN_REAL_PATH 32 /* return full path for file */ +#define MY_SAFE_PATH 64 /* Return NULL if too long path */ +#define MY_RELATIVE_PATH 128 /* name is relative to 'dir' */ +#define MY_APPEND_EXT 256 /* add 'ext' as additional extension*/ + + + /* My seek flags */ +#define MY_SEEK_SET 0 +#define MY_SEEK_CUR 1 +#define MY_SEEK_END 2 + + /* Some constants */ +#define MY_WAIT_FOR_USER_TO_FIX_PANIC 60 /* in seconds */ +#define MY_WAIT_GIVE_USER_A_MESSAGE 10 /* Every 10 times of prev */ +#define MIN_COMPRESS_LENGTH 50 /* Don't compress small bl. */ +#define DFLT_INIT_HITS 3 + + /* root_alloc flags */ +#define MY_KEEP_PREALLOC 1 +#define MY_MARK_BLOCKS_FREE 2 /* move used to free list and reuse them */ + + /* Internal error numbers (for assembler functions) */ +#define MY_ERRNO_EDOM 33 +#define MY_ERRNO_ERANGE 34 + + /* Bits for get_date timeflag */ +#define GETDATE_DATE_TIME 1 +#define GETDATE_SHORT_DATE 2 +#define GETDATE_HHMMSSTIME 4 +#define GETDATE_GMT 8 +#define GETDATE_FIXEDLENGTH 16 + + /* defines when allocating data */ +#ifdef SAFEMALLOC +#define my_malloc(SZ,FLAG) _mymalloc((SZ), __FILE__, __LINE__, FLAG ) +#define my_malloc_ci(SZ,FLAG) _mymalloc((SZ), sFile, uLine, FLAG ) +#define my_realloc(PTR,SZ,FLAG) _myrealloc((PTR), (SZ), __FILE__, __LINE__, FLAG ) +#define my_checkmalloc() _sanity( __FILE__, __LINE__ ) +#define my_free(PTR,FLAG) _myfree((PTR), __FILE__, __LINE__,FLAG) +#define my_memdup(A,B,C) _my_memdup((A),(B), __FILE__,__LINE__,C) +#define my_strdup(A,C) _my_strdup((A), __FILE__,__LINE__,C) +#define my_strndup(A,B,C) _my_strndup((A),(B),__FILE__,__LINE__,C) +#define QUICK_SAFEMALLOC sf_malloc_quick=1 +#define NORMAL_SAFEMALLOC sf_malloc_quick=0 +extern uint sf_malloc_prehunc,sf_malloc_endhunc,sf_malloc_quick; +extern ulonglong sf_malloc_mem_limit; + +#define CALLER_INFO_PROTO , const char *sFile, uint uLine +#define CALLER_INFO , __FILE__, __LINE__ +#define ORIG_CALLER_INFO , sFile, uLine +#else +#define my_checkmalloc() +#undef TERMINATE +#define TERMINATE(A,B) {} +#define QUICK_SAFEMALLOC +#define NORMAL_SAFEMALLOC +extern void *my_malloc(size_t Size,myf MyFlags); +#define my_malloc_ci(SZ,FLAG) my_malloc( SZ, FLAG ) +extern void *my_realloc(void *oldpoint, size_t Size, myf MyFlags); +extern void my_no_flags_free(void *ptr); +extern void *my_memdup(const void *from,size_t length,myf MyFlags); +extern char *my_strdup(const char *from,myf MyFlags); +extern char *my_strndup(const char *from, size_t length, + myf MyFlags); +/* we do use FG (as a no-op) in below so that a typo on FG is caught */ +#define my_free(PTR,FG) ((void)FG,my_no_flags_free(PTR)) +#define CALLER_INFO_PROTO /* nothing */ +#define CALLER_INFO /* nothing */ +#define ORIG_CALLER_INFO /* nothing */ +#endif + +/* + ERROR INJECTION: Non-thread-safe global variable to request error inject. + Set this variable to non-zero to request the next my_malloc() to fail. + This works with my_malloc.c:my_malloc() and safemalloc.c:_mymalloc(). + If using this in tests, note that the error messages produced by + my_malloc and safemalloc are different. You may need to modify the + results with --replace_regex. You may find examples in + client/backup_stream.c and backup_client_coverage.test. + The global variable is defined in my_static.c. +*/ +IF_DBUG(extern int my_malloc_error_inject); + +#ifdef HAVE_LARGE_PAGES +extern uint my_get_large_page_size(void); +extern uchar * my_large_malloc(size_t size, myf my_flags); +extern void my_large_free(uchar * ptr, myf my_flags); +#else +#define my_get_large_page_size() (0) +#define my_large_malloc(A,B) my_malloc_lock((A),(B)) +#define my_large_free(A,B) my_free_lock((A),(B)) +#endif /* HAVE_LARGE_PAGES */ + +#ifdef HAVE_ALLOCA +#if defined(_AIX) && !defined(__GNUC__) && !defined(_AIX43) +#pragma alloca +#endif /* _AIX */ +#if defined(__MWERKS__) +#undef alloca +#define alloca _alloca +#endif /* __MWERKS__ */ +#if defined(__GNUC__) && !defined(HAVE_ALLOCA_H) && ! defined(alloca) +#define alloca __builtin_alloca +#endif /* GNUC */ +#define my_alloca(SZ) alloca((size_t) (SZ)) +#define my_afree(PTR) {} +#else +#define my_alloca(SZ) my_malloc(SZ,MYF(0)) +#define my_afree(PTR) my_free(PTR,MYF(MY_WME)) +#endif /* HAVE_ALLOCA */ + +#ifndef errno /* did we already get it? */ +#ifdef HAVE_ERRNO_AS_DEFINE +#include /* errno is a define */ +#else +extern int errno; /* declare errno */ +#endif +#endif /* #ifndef errno */ +extern char *home_dir; /* Home directory for user */ +extern const char *my_progname; /* program-name (printed in errors) */ +extern const char *my_progname_short; /* like above but without directory */ +extern char NEAR curr_dir[]; /* Current directory for user */ +extern void (*error_handler_hook)(uint my_err, const char *str,myf MyFlags); +extern void (*fatal_error_handler_hook)(uint my_err, const char *str, + myf MyFlags); +extern uint my_file_limit; +extern ulong my_thread_stack_size; + +extern const char *(*proc_info_hook)(void *, const char *, const char *, + const char *, const unsigned int); + +#if defined(ENABLED_DEBUG_SYNC) +extern void (*debug_sync_C_callback_ptr)(const char *, size_t); +#define DEBUG_SYNC_C(_sync_point_name_) do { \ + if (debug_sync_C_callback_ptr != NULL) \ + (*debug_sync_C_callback_ptr)(STRING_WITH_LEN(_sync_point_name_)); } \ + while(0) +#else +#define DEBUG_SYNC_C(_sync_point_name_) +#endif /* defined(ENABLED_DEBUG_SYNC) */ + +#ifdef HAVE_LARGE_PAGES +extern my_bool my_use_large_pages; +extern uint my_large_page_size; +#endif + +/* charsets */ +#define MY_ALL_CHARSETS_SIZE 2048 +extern MYSQL_PLUGIN_IMPORT CHARSET_INFO *default_charset_info; +extern MYSQL_PLUGIN_IMPORT CHARSET_INFO *all_charsets[MY_ALL_CHARSETS_SIZE]; +extern CHARSET_INFO compiled_charsets[]; + +/* statistics */ +extern ulong my_file_opened,my_stream_opened, my_tmp_file_created; +extern ulong my_file_total_opened; +extern uint mysys_usage_id; +extern my_bool my_init_done; + + /* Point to current my_message() */ +extern void (*my_sigtstp_cleanup)(void), + /* Executed before jump to shell */ + (*my_sigtstp_restart)(void), + (*my_abort_hook)(int); + /* Executed when comming from shell */ +extern MYSQL_PLUGIN_IMPORT int NEAR my_umask; /* Default creation mask */ +extern int NEAR my_umask_dir, + NEAR my_recived_signals, /* Signals we have got */ + NEAR my_safe_to_handle_signal, /* Set when allowed to SIGTSTP */ + NEAR my_dont_interrupt; /* call remember_intr when set */ +extern my_bool NEAR mysys_uses_curses, my_use_symdir; +extern size_t sf_malloc_cur_memory, sf_malloc_max_memory; + +extern ulong my_default_record_cache_size; +extern my_bool NEAR my_disable_locking,NEAR my_disable_async_io, + NEAR my_disable_flush_key_blocks, NEAR my_disable_symlinks; +extern char wild_many,wild_one,wild_prefix; +extern const char *charsets_dir; +/* from default.c */ +extern char *my_defaults_extra_file; +extern const char *my_defaults_group_suffix; +extern const char *my_defaults_file; + +extern my_bool timed_mutexes; + +typedef struct wild_file_pack /* Struct to hold info when selecting files */ +{ + uint wilds; /* How many wildcards */ + uint not_pos; /* Start of not-theese-files */ + char * *wild; /* Pointer to wildcards */ +} WF_PACK; + +enum loglevel { + ERROR_LEVEL, + WARNING_LEVEL, + INFORMATION_LEVEL +}; + +enum cache_type +{ + TYPE_NOT_SET= 0, READ_CACHE, WRITE_CACHE, + SEQ_READ_APPEND /* sequential read or append */, + READ_FIFO, READ_NET,WRITE_NET}; + +enum flush_type +{ + FLUSH_KEEP, /* flush block and keep it in the cache */ + FLUSH_RELEASE, /* flush block and remove it from the cache */ + FLUSH_IGNORE_CHANGED, /* remove block from the cache */ + /* + As my_disable_flush_pagecache_blocks is always 0, the following option + is strictly equivalent to FLUSH_KEEP + */ + FLUSH_FORCE_WRITE, + /** + @brief like FLUSH_KEEP but return immediately if file is already being + flushed (even partially) by another thread; only for page cache, + forbidden for key cache. + */ + FLUSH_KEEP_LAZY +}; + +typedef struct st_record_cache /* Used when cacheing records */ +{ + File file; + int rc_seek,error,inited; + uint rc_length,read_length,reclength; + my_off_t rc_record_pos,end_of_file; + uchar *rc_buff,*rc_buff2,*rc_pos,*rc_end,*rc_request_pos; +#ifdef HAVE_AIOWAIT + int use_async_io; + my_aio_result aio_result; +#endif + enum cache_type type; +} RECORD_CACHE; + +enum file_type +{ + UNOPEN = 0, FILE_BY_OPEN, FILE_BY_CREATE, STREAM_BY_FOPEN, STREAM_BY_FDOPEN, + FILE_BY_MKSTEMP, FILE_BY_DUP +}; + +struct st_my_file_info +{ + char *name; +#ifdef _WIN32 + HANDLE fhandle; /* win32 file handle */ + int oflag; /* open flags, e.g O_APPEND */ +#endif + enum file_type type; +#if defined(THREAD) && !defined(HAVE_PREAD) && !defined(_WIN32) + pthread_mutex_t mutex; +#endif +}; + +extern struct st_my_file_info *my_file_info; + +typedef struct st_dynamic_array +{ + uchar *buffer; + uint elements,max_element; + uint alloc_increment; + uint size_of_element; +} DYNAMIC_ARRAY; + +typedef struct st_my_tmpdir +{ + DYNAMIC_ARRAY full_list; + char **list; + uint cur, max; +#ifdef THREAD + pthread_mutex_t mutex; +#endif +} MY_TMPDIR; + +typedef struct st_dynamic_string +{ + char *str; + size_t length,max_length,alloc_increment; +} DYNAMIC_STRING; + +struct st_io_cache; +/** Function called when certain events happen to an IO_CACHE */ +typedef int (*IO_CACHE_CALLBACK)(struct st_io_cache *cache, + const uchar *buffert, uint length, + my_off_t filepos); + +#ifdef THREAD +typedef struct st_io_cache_share +{ + pthread_mutex_t mutex; /* To sync on reads into buffer. */ + pthread_cond_t cond; /* To wait for signals. */ + pthread_cond_t cond_writer; /* For a synchronized writer. */ + /* Offset in file corresponding to the first byte of buffer. */ + my_off_t pos_in_file; + /* If a synchronized write cache is the source of the data. */ + struct st_io_cache *source_cache; + uchar *buffer; /* The read buffer. */ + uchar *read_end; /* Behind last valid byte of buffer. */ + int running_threads; /* threads not in lock. */ + int total_threads; /* threads sharing the cache. */ + int error; /* Last error. */ +#ifdef NOT_YET_IMPLEMENTED + /* whether the structure should be free'd */ + my_bool alloced; +#endif +} IO_CACHE_SHARE; +#endif + +typedef struct st_io_cache /* Used when cacheing files */ +{ + /* Offset in file corresponding to the first byte of uchar* buffer. */ + my_off_t pos_in_file; + /* + The offset of end of file for READ_CACHE and WRITE_CACHE. + For SEQ_READ_APPEND it the maximum of the actual end of file and + the position represented by read_end. + */ + my_off_t end_of_file; + /* Points to current read position in the buffer */ + uchar *read_pos; + /* the non-inclusive boundary in the buffer for the currently valid read */ + uchar *read_end; + uchar *buffer; /* The read buffer */ + /* Used in ASYNC_IO */ + uchar *request_pos; + + /* Only used in WRITE caches and in SEQ_READ_APPEND to buffer writes */ + uchar *write_buffer; + /* + Only used in SEQ_READ_APPEND, and points to the current read position + in the write buffer. Note that reads in SEQ_READ_APPEND caches can + happen from both read buffer (uchar* buffer) and write buffer + (uchar* write_buffer). + */ + uchar *append_read_pos; + /* Points to current write position in the write buffer */ + uchar *write_pos; + /* The non-inclusive boundary of the valid write area */ + uchar *write_end; + + /* + Current_pos and current_end are convenience variables used by + my_b_tell() and other routines that need to know the current offset + current_pos points to &write_pos, and current_end to &write_end in a + WRITE_CACHE, and &read_pos and &read_end respectively otherwise + */ + uchar **current_pos, **current_end; +#ifdef THREAD + /* + The lock is for append buffer used in SEQ_READ_APPEND cache + need mutex copying from append buffer to read buffer. + */ + pthread_mutex_t append_buffer_lock; + /* + The following is used when several threads are reading the + same file in parallel. They are synchronized on disk + accesses reading the cached part of the file asynchronously. + It should be set to NULL to disable the feature. Only + READ_CACHE mode is supported. + */ + IO_CACHE_SHARE *share; +#endif + /* + A caller will use my_b_read() macro to read from the cache + if the data is already in cache, it will be simply copied with + memcpy() and internal variables will be accordinging updated with + no functions invoked. However, if the data is not fully in the cache, + my_b_read() will call read_function to fetch the data. read_function + must never be invoked directly. + */ + int (*read_function)(struct st_io_cache *,uchar *,size_t); + /* + Same idea as in the case of read_function, except my_b_write() needs to + be replaced with my_b_append() for a SEQ_READ_APPEND cache + */ + int (*write_function)(struct st_io_cache *,const uchar *,size_t); + /* + Specifies the type of the cache. Depending on the type of the cache + certain operations might not be available and yield unpredicatable + results. Details to be documented later + */ + enum cache_type type; + /* + Callbacks were added and are currently used for binary logging of LOAD + DATA INFILE - when a block is read from the file, we create a block + create/append event, and when IO_CACHE is closed, we create an end event; + also used to write the MyISAM WRITE_CACHE blocks to the MyISAM physical + log. These functions could, of course be used for other things. Note: some + callbacks share the same argument ("arg"). + */ + IO_CACHE_CALLBACK pre_read; /**< called before reading from disk */ + IO_CACHE_CALLBACK post_read; /**< called after reading from disk */ + IO_CACHE_CALLBACK pre_close; /**< called before ending the cache */ + /** Called _after_ writing to disk; not honoured by SEQ_READ_APPEND */ + IO_CACHE_CALLBACK post_write; + /* + Counts the number of times, when we were forced to use disk. We use it to + increase the binlog_cache_disk_use status variable. + */ + ulong disk_writes; + void *arg; /**< used by pre/post_read,post_write */ + char *file_name; /* if used with 'open_cached_file' */ + char *dir,*prefix; + File file; /* file descriptor */ + /* + seek_not_done is set by my_b_seek() to inform the upcoming read/write + operation that a seek needs to be preformed prior to the actual I/O + error is 0 if the cache operation was successful, -1 if there was a + "hard" error, and the actual number of I/O-ed bytes if the read/write was + partial. + */ + int seek_not_done,error; + /** + Cumulative 'error' since last [re]init_io_cache(). Useful if cache's user + polls for errors only once in a while. + */ + int hard_write_error_in_the_past; + /* buffer_length is memory size allocated for buffer or write_buffer */ + size_t buffer_length; + /* read_length is the same as buffer_length except when we use async io */ + size_t read_length; + myf myflags; /* Flags used to my_read/my_write */ + /* + alloced_buffer is 1 if the buffer was allocated by init_io_cache() and + 0 if it was supplied by the user. + Currently READ_NET is the only one that will use a buffer allocated + somewhere else + */ + my_bool alloced_buffer; +#ifdef HAVE_AIOWAIT + /* + As inidicated by ifdef, this is for async I/O, which is not currently + used (because it's not reliable on all systems) + */ + uint inited; + my_off_t aio_read_pos; + my_aio_result aio_result; +#endif +} IO_CACHE; + +typedef int (*qsort2_cmp)(const void *, const void *, const void *); + + /* defines for mf_iocache */ + + /* Test if buffer is inited */ +#define my_b_clear(info) (info)->buffer=0 +#define my_b_inited(info) (info)->buffer +#define my_b_EOF INT_MIN + +#define my_b_read(info,Buffer,Count) \ + ((info)->read_pos + (Count) <= (info)->read_end ?\ + (memcpy(Buffer,(info)->read_pos,(size_t) (Count)), \ + ((info)->read_pos+=(Count)),0) :\ + (*(info)->read_function)((info),Buffer,Count)) + +#define my_b_write(info,Buffer,Count) \ + ((info)->write_pos + (Count) <=(info)->write_end ?\ + (memcpy((info)->write_pos, (Buffer), (size_t)(Count)),\ + ((info)->write_pos+=(Count)),0) : \ + (*(info)->write_function)((info),(Buffer),(Count))) + +#define my_b_get(info) \ + ((info)->read_pos != (info)->read_end ?\ + ((info)->read_pos++, (int) (uchar) (info)->read_pos[-1]) :\ + _my_b_get(info)) + + /* my_b_write_byte dosn't have any err-check */ +#define my_b_write_byte(info,chr) \ + (((info)->write_pos < (info)->write_end) ?\ + ((*(info)->write_pos++)=(chr)) :\ + (_my_b_write(info,0,0) , ((*(info)->write_pos++)=(chr)))) + +#define my_b_fill_cache(info) \ + (((info)->read_end=(info)->read_pos),(*(info)->read_function)(info,0,0)) + +#define my_b_tell(info) ((info)->pos_in_file + \ + (size_t) (*(info)->current_pos - (info)->request_pos)) + +#define my_b_get_buffer_start(info) (info)->request_pos +#define my_b_get_bytes_in_buffer(info) (char*) (info)->read_end - \ + (char*) my_b_get_buffer_start(info) +#define my_b_get_pos_in_file(info) (info)->pos_in_file + +/* tell write offset in the SEQ_APPEND cache */ +int my_b_copy_to_file(IO_CACHE *cache, FILE *file); +my_off_t my_b_append_tell(IO_CACHE* info); +my_off_t my_b_safe_tell(IO_CACHE* info); /* picks the correct tell() */ + +#define my_b_bytes_in_cache(info) (size_t) (*(info)->current_end - \ + *(info)->current_pos) + +typedef uint32 ha_checksum; +extern ha_checksum my_crc_dbug_check; + +/* Define the type of function to be passed to process_default_option_files */ +typedef int (*Process_option_func)(void *ctx, const char *group_name, + const char *option); + +#include + + + /* Prototypes for mysys and my_func functions */ + +extern int my_copy(const char *from,const char *to,myf MyFlags); +extern int my_append(const char *from,const char *to,myf MyFlags); +extern int my_delete(const char *name,myf MyFlags); +extern int my_getwd(char * buf,size_t size,myf MyFlags); +extern int my_setwd(const char *dir,myf MyFlags); +extern int my_lock(File fd,int op,my_off_t start, my_off_t length,myf MyFlags); +extern void *my_once_alloc(size_t Size,myf MyFlags); +extern void my_once_free(void); +extern char *my_once_strdup(const char *src,myf myflags); +extern void *my_once_memdup(const void *src, size_t len, myf myflags); +extern File my_open(const char *FileName,int Flags,myf MyFlags); +extern File my_register_filename(File fd, const char *FileName, + enum file_type type_of_file, + uint error_message_number, myf MyFlags); +extern File my_create(const char *FileName,int CreateFlags, + int AccessFlags, myf MyFlags); +extern int my_close(File Filedes,myf MyFlags); +extern File my_dup(File file, myf MyFlags); +extern int my_mkdir(const char *dir, int Flags, myf MyFlags); +extern int my_readlink(char *to, const char *filename, myf MyFlags); +extern int my_is_symlink(const char *filename); +extern int my_realpath(char *to, const char *filename, myf MyFlags); +extern File my_create_with_symlink(const char *linkname, const char *filename, + int createflags, int access_flags, + myf MyFlags); +extern int my_delete_with_symlink(const char *name, myf MyFlags); +extern int my_rename_with_symlink(const char *from,const char *to,myf MyFlags); +extern int my_symlink(const char *content, const char *linkname, myf MyFlags); +extern size_t my_read(File Filedes,uchar *Buffer,size_t Count,myf MyFlags); +extern size_t my_pread(File Filedes,uchar *Buffer,size_t Count,my_off_t offset, + myf MyFlags); +extern int my_rename(const char *from,const char *to,myf MyFlags); +extern my_off_t my_seek(File fd,my_off_t pos,int whence,myf MyFlags); +extern my_off_t my_tell(File fd,myf MyFlags); +extern size_t my_write(File Filedes,const uchar *Buffer,size_t Count, + myf MyFlags); +extern size_t my_pwrite(File Filedes,const uchar *Buffer,size_t Count, + my_off_t offset,myf MyFlags); +extern size_t my_fread(FILE *stream,uchar *Buffer,size_t Count,myf MyFlags); +extern size_t my_fwrite(FILE *stream,const uchar *Buffer,size_t Count, + myf MyFlags); +extern my_off_t my_fseek(FILE *stream,my_off_t pos,int whence,myf MyFlags); +extern my_off_t my_ftell(FILE *stream,myf MyFlags); +extern void *_mymalloc(size_t uSize,const char *sFile, + uint uLine, myf MyFlag); +extern void *_myrealloc(void *pPtr,size_t uSize,const char *sFile, + uint uLine, myf MyFlag); +extern void * my_multi_malloc _VARARGS((myf MyFlags, ...)); +extern void _myfree(void *pPtr,const char *sFile,uint uLine, myf MyFlag); +extern int _sanity(const char *sFile, uint uLine); +extern void *_my_memdup(const void *from, size_t length, + const char *sFile, uint uLine,myf MyFlag); +extern char * _my_strdup(const char *from, const char *sFile, uint uLine, + myf MyFlag); +extern char *_my_strndup(const char *from, size_t length, + const char *sFile, uint uLine, + myf MyFlag); + +/* implemented in my_memmem.c */ +extern void *my_memmem(const void *haystack, size_t haystacklen, + const void *needle, size_t needlelen); + + +#ifdef _WIN32 +extern int my_access(const char *path, int amode); +#else +#define my_access access +#endif + +extern int check_if_legal_filename(const char *path); +extern int check_if_legal_tablename(const char *path); + +#ifdef _WIN32 +extern int nt_share_delete(const char *name,myf MyFlags); +#define my_delete_allow_opened(fname,flags) nt_share_delete((fname),(flags)) +#else +#define my_delete_allow_opened(fname,flags) my_delete((fname),(flags)) +#endif + +#ifdef _WIN32 +/* Windows-only functions (CRT equivalents)*/ +extern File my_sopen(const char *path, int oflag, int shflag, int pmode); +extern HANDLE my_get_osfhandle(File fd); +extern void my_osmaperr(unsigned long last_error); +#endif + +#ifndef TERMINATE +extern void TERMINATE(FILE *file, uint flag); +#endif +extern void init_glob_errs(void); +extern void wait_for_free_space(const char *filename, int errors); +extern FILE *my_fopen(const char *FileName,int Flags,myf MyFlags); +extern FILE *my_fdopen(File Filedes,const char *name, int Flags,myf MyFlags); +extern int my_fclose(FILE *fd,myf MyFlags); +extern File my_fileno(FILE *fd); +extern int my_chsize(File fd,my_off_t newlength, int filler, myf MyFlags); +extern int my_chmod(const char *name, mode_t mode, myf my_flags); +extern int my_sync(File fd, myf my_flags); +extern int my_sync_dir(const char *dir_name, myf my_flags); +extern int my_sync_dir_by_file(const char *file_name, myf my_flags); +extern void my_error _VARARGS((int nr,myf MyFlags, ...)); +extern void my_printf_error _VARARGS((uint my_err, const char *format, + myf MyFlags, ...)) + ATTRIBUTE_FORMAT(printf, 2, 4); +extern void my_printv_error(uint error, const char *format, myf MyFlags, + va_list ap); +extern int my_error_register(const char **errmsgs, int first, int last); +extern const char **my_error_unregister(int first, int last); +extern void my_message(uint my_err, const char *str,myf MyFlags); +extern void my_message_no_curses(uint my_err, const char *str,myf MyFlags); +extern my_bool my_init(void); +extern void my_end(int infoflag); +extern int my_redel(const char *from, const char *to, int MyFlags); +extern int my_copystat(const char *from, const char *to, int MyFlags); +extern char * my_filename(File fd); + +#ifndef THREAD +extern void dont_break(void); +extern void allow_break(void); +#else +#define dont_break() +#define allow_break() +#endif + +#ifdef EXTRA_DEBUG +void my_print_open_files(void); +#else +#define my_print_open_files() +#endif + +extern my_bool init_tmpdir(MY_TMPDIR *tmpdir, const char *pathlist); +extern char *my_tmpdir(MY_TMPDIR *tmpdir); +extern void free_tmpdir(MY_TMPDIR *tmpdir); + +extern void my_remember_signal(int signal_number,sig_handler (*func)(int)); +extern size_t dirname_part(char * to,const char *name, size_t *to_res_length); +extern size_t dirname_length(const char *name); +#define base_name(A) (A+dirname_length(A)) +extern int test_if_hard_path(const char *dir_name); +extern my_bool has_path(const char *name); +extern char *convert_dirname(char *to, const char *from, const char *from_end); +extern void to_unix_path(char * name); +extern char * fn_ext(const char *name); +extern char * fn_same(char * toname,const char *name,int flag); +extern char * fn_format(char * to,const char *name,const char *dir, + const char *form, uint flag); +extern size_t strlength(const char *str); +extern void pack_dirname(char * to,const char *from); +extern size_t normalize_dirname(char * to, const char *from); +extern size_t unpack_dirname(char * to,const char *from); +extern size_t cleanup_dirname(char * to,const char *from); +extern size_t system_filename(char * to,const char *from); +extern size_t unpack_filename(char * to,const char *from); +extern char * intern_filename(char * to,const char *from); +extern char * directory_file_name(char * dst, const char *src); +extern int pack_filename(char * to, const char *name, size_t max_length); +extern char * my_path(char * to,const char *progname, + const char *own_pathname_part); +extern char * my_load_path(char * to, const char *path, + const char *own_path_prefix); +extern int wild_compare(const char *str,const char *wildstr, + pbool str_is_pattern); +extern WF_PACK *wf_comp(char * str); +extern int wf_test(struct wild_file_pack *wf_pack,const char *name); +extern void wf_end(struct wild_file_pack *buffer); +extern size_t strip_sp(char * str); +extern my_bool array_append_string_unique(const char *str, + const char **array, size_t size); +extern void get_date(char * to,int timeflag,time_t use_time); +extern void soundex(CHARSET_INFO *, char * out_pntr, char * in_pntr, + pbool remove_garbage); +extern int init_record_cache(RECORD_CACHE *info,size_t cachesize,File file, + size_t reclength,enum cache_type type, + pbool use_async_io); +extern int read_cache_record(RECORD_CACHE *info,uchar *to); +extern int end_record_cache(RECORD_CACHE *info); +extern int write_cache_record(RECORD_CACHE *info,my_off_t filepos, + const uchar *record,size_t length); +extern int flush_write_cache(RECORD_CACHE *info); +extern long my_clock(void); +extern sig_handler sigtstp_handler(int signal_number); +extern void handle_recived_signals(void); + +extern sig_handler my_set_alarm_variable(int signo); +extern void my_string_ptr_sort(uchar *base,uint items,size_t size); +extern void radixsort_for_str_ptr(uchar* base[], uint number_of_elements, + size_t size_of_element,uchar *buffer[]); +extern qsort_t my_qsort(void *base_ptr, size_t total_elems, size_t size, + qsort_cmp cmp); +extern qsort_t my_qsort2(void *base_ptr, size_t total_elems, size_t size, + qsort2_cmp cmp, void *cmp_argument); +extern qsort2_cmp get_ptr_compare(size_t); +void my_store_ptr(uchar *buff, size_t pack_length, my_off_t pos); +my_off_t my_get_ptr(uchar *ptr, size_t pack_length); +extern int init_io_cache(IO_CACHE *info,File file,size_t cachesize, + enum cache_type type,my_off_t seek_offset, + pbool use_async_io, myf cache_myflags); +extern my_bool reinit_io_cache(IO_CACHE *info,enum cache_type type, + my_off_t seek_offset,pbool use_async_io, + pbool clear_cache); +extern void setup_io_cache(IO_CACHE* info); +extern int _my_b_read(IO_CACHE *info,uchar *Buffer,size_t Count); +#ifdef THREAD +extern int _my_b_read_r(IO_CACHE *info,uchar *Buffer,size_t Count); +extern void init_io_cache_share(IO_CACHE *read_cache, IO_CACHE_SHARE *cshare, + IO_CACHE *write_cache, uint num_threads); +extern void remove_io_thread(IO_CACHE *info); +#endif +extern int _my_b_seq_read(IO_CACHE *info,uchar *Buffer,size_t Count); +extern int _my_b_net_read(IO_CACHE *info,uchar *Buffer,size_t Count); +extern int _my_b_get(IO_CACHE *info); +extern int _my_b_async_read(IO_CACHE *info,uchar *Buffer,size_t Count); +extern int _my_b_write(IO_CACHE *info,const uchar *Buffer,size_t Count); +extern int my_b_append(IO_CACHE *info,const uchar *Buffer,size_t Count); +extern int my_b_safe_write(IO_CACHE *info,const uchar *Buffer,size_t Count); + +extern int my_block_write(IO_CACHE *info, const uchar *Buffer, + size_t Count, my_off_t pos); +extern int my_b_flush_io_cache(IO_CACHE *info, int need_append_buffer_lock); + +#define flush_io_cache(info) my_b_flush_io_cache((info),1) + +extern int end_io_cache(IO_CACHE *info); +extern size_t my_b_fill(IO_CACHE *info); +extern void my_b_seek(IO_CACHE *info,my_off_t pos); +extern size_t my_b_gets(IO_CACHE *info, char *to, size_t max_length); +extern my_off_t my_b_filelength(IO_CACHE *info); +extern size_t my_b_printf(IO_CACHE *info, const char* fmt, ...); +extern size_t my_b_vprintf(IO_CACHE *info, const char* fmt, va_list ap); +extern my_bool open_cached_file(IO_CACHE *cache,const char *dir, + const char *prefix, size_t cache_size, + myf cache_myflags); +extern my_bool real_open_cached_file(IO_CACHE *cache); +extern void close_cached_file(IO_CACHE *cache); +File create_temp_file(char *to, const char *dir, const char *pfx, + int mode, myf MyFlags); +#define my_init_dynamic_array(A,B,C,D) init_dynamic_array2(A,B,NULL,C,D CALLER_INFO) +#define my_init_dynamic_array_ci(A,B,C,D) init_dynamic_array2(A,B,NULL,C,D ORIG_CALLER_INFO) +#define my_init_dynamic_array2(A,B,C,D,E) init_dynamic_array2(A,B,C,D,E CALLER_INFO) +#define my_init_dynamic_array2_ci(A,B,C,D,E) init_dynamic_array2(A,B,C,D,E ORIG_CALLER_INFO) +extern my_bool init_dynamic_array2(DYNAMIC_ARRAY *array,uint element_size, + void *init_buffer, uint init_alloc, + uint alloc_increment + CALLER_INFO_PROTO); +/* init_dynamic_array() function is deprecated */ +extern my_bool init_dynamic_array(DYNAMIC_ARRAY *array,uint element_size, + uint init_alloc,uint alloc_increment + CALLER_INFO_PROTO); +extern my_bool insert_dynamic(DYNAMIC_ARRAY *array, const uchar * element); +extern uchar *alloc_dynamic(DYNAMIC_ARRAY *array); +extern uchar *pop_dynamic(DYNAMIC_ARRAY*); +extern my_bool set_dynamic(DYNAMIC_ARRAY *array,uchar * element,uint array_index); +extern my_bool allocate_dynamic(DYNAMIC_ARRAY *array, uint max_elements); +extern void get_dynamic(DYNAMIC_ARRAY *array,uchar * element,uint array_index); +extern void delete_dynamic(DYNAMIC_ARRAY *array); +extern void delete_dynamic_element(DYNAMIC_ARRAY *array, uint array_index); +extern void freeze_size(DYNAMIC_ARRAY *array); +extern int get_index_dynamic(DYNAMIC_ARRAY *array, uchar * element); +#define dynamic_array_ptr(array,array_index) ((array)->buffer+(array_index)*(array)->size_of_element) +#define dynamic_element(array,array_index,type) ((type)((array)->buffer) +(array_index)) +#define push_dynamic(A,B) insert_dynamic((A),(B)) +#define reset_dynamic(array) ((array)->elements= 0) +#define sort_dynamic(A,cmp) my_qsort((A)->buffer, (A)->elements, (A)->size_of_element, (cmp)) + +extern my_bool init_dynamic_string(DYNAMIC_STRING *str, const char *init_str, + size_t init_alloc,size_t alloc_increment); +extern my_bool dynstr_append(DYNAMIC_STRING *str, const char *append); +my_bool dynstr_append_mem(DYNAMIC_STRING *str, const char *append, + size_t length); +extern my_bool dynstr_append_os_quoted(DYNAMIC_STRING *str, const char *append, + ...); +extern my_bool dynstr_set(DYNAMIC_STRING *str, const char *init_str); +extern my_bool dynstr_realloc(DYNAMIC_STRING *str, size_t additional_size); +extern my_bool dynstr_trunc(DYNAMIC_STRING *str, size_t n); +extern void dynstr_free(DYNAMIC_STRING *str); +#ifdef HAVE_MLOCK +extern void *my_malloc_lock(size_t length,myf flags); +extern void my_free_lock(void *ptr,myf flags); +#else +#define my_malloc_lock(A,B) my_malloc((A),(B)) +#define my_free_lock(A,B) my_free((A),(B)) +#endif +#define alloc_root_inited(A) ((A)->min_malloc != 0) +#define ALLOC_ROOT_MIN_BLOCK_SIZE (MALLOC_OVERHEAD + sizeof(USED_MEM) + 8) +#define clear_alloc_root(A) do { (A)->free= (A)->used= (A)->pre_alloc= 0; (A)->min_malloc=0;} while(0) +extern void init_alloc_root(MEM_ROOT *mem_root, size_t block_size, + size_t pre_alloc_size); +extern void *alloc_root(MEM_ROOT *mem_root, size_t Size); +extern void *multi_alloc_root(MEM_ROOT *mem_root, ...); +extern void free_root(MEM_ROOT *root, myf MyFLAGS); +extern void set_prealloc_root(MEM_ROOT *root, char *ptr); +extern void reset_root_defaults(MEM_ROOT *mem_root, size_t block_size, + size_t prealloc_size); +extern char *strdup_root(MEM_ROOT *root,const char *str); +extern char *strmake_root(MEM_ROOT *root,const char *str,size_t len); +extern void *memdup_root(MEM_ROOT *root,const void *str, size_t len); +extern int get_defaults_options(int argc, char **argv, + char **defaults, char **extra_defaults, + char **group_suffix); +extern const char *args_separator; +extern int my_load_defaults(const char *conf_file, const char **groups, + int *argc, char ***argv, const char ***); +extern int load_defaults(const char *conf_file, const char **groups, + int *argc, char ***argv); +extern int modify_defaults_file(const char *file_location, const char *option, + const char *option_value, + const char *section_name, int remove_option); +extern int my_search_option_files(const char *conf_file, int *argc, + char ***argv, uint *args_used, + Process_option_func func, void *func_ctx, + const char **default_directories); +extern void free_defaults(char **argv); +extern void my_print_default_files(const char *conf_file); +extern void print_defaults(const char *conf_file, const char **groups); +extern my_bool my_compress(uchar *, size_t *, size_t *); +extern my_bool my_uncompress(uchar *, size_t , size_t *); +extern uchar *my_compress_alloc(const uchar *packet, size_t *len, + size_t *complen); +extern int packfrm(uchar *, size_t, uchar **, size_t *); +extern int unpackfrm(uchar **, size_t *, const uchar *); + +extern ha_checksum my_checksum(ha_checksum crc, const uchar *mem, + size_t count); +#ifndef DBUG_OFF +extern void my_debug_put_break_here(void); +#else +#define my_debug_put_break_here() do {} while(0) +#endif + +extern void my_sleep(ulong m_seconds); +extern ulong crc32(ulong crc, const uchar *buf, uint len); +extern uint my_set_max_open_files(uint files); +void my_free_open_file_info(void); + +extern time_t my_time(myf flags); +extern ulonglong my_getsystime(void); +extern ulonglong my_micro_time(); +extern ulonglong my_micro_time_and_time(time_t *time_arg); +time_t my_time_possible_from_micro(ulonglong microtime); +extern my_bool my_gethwaddr(uchar *to); +extern int my_getncpus(); + +#ifdef HAVE_SYS_MMAN_H +#include + +#ifndef MAP_NOSYNC +#define MAP_NOSYNC 0 +#endif +#ifndef MAP_NORESERVE +#define MAP_NORESERVE 0 /* For irix and AIX */ +#endif + +#ifdef HAVE_MMAP64 +#define my_mmap(a,b,c,d,e,f) mmap64(a,b,c,d,e,f) +#else +#define my_mmap(a,b,c,d,e,f) mmap(a,b,c,d,e,f) +#endif +#define my_munmap(a,b) munmap((a),(b)) + +#else +/* not a complete set of mmap() flags, but only those that nesessary */ +#define PROT_READ 1 +#define PROT_WRITE 2 +#define MAP_NORESERVE 0 +#define MAP_SHARED 0x0001 +#define MAP_PRIVATE 0x0002 +#define MAP_NOSYNC 0x0800 +#define MAP_FAILED ((void *)-1) +#define MS_SYNC 0x0000 + +#ifndef __NETWARE__ +#define HAVE_MMAP +#endif + +void *my_mmap(void *, size_t, int, int, int, my_off_t); +int my_munmap(void *, size_t); +#endif + +/* my_getpagesize */ +#ifdef HAVE_GETPAGESIZE +#define my_getpagesize() getpagesize() +#else +int my_getpagesize(void); +#endif + +int my_msync(int, void *, size_t, int); + +#define MY_UUID_SIZE 16 +#define MY_UUID_STRING_LENGTH (8+1+4+1+4+1+4+1+12) + +void my_uuid_init(ulong seed1, ulong seed2); +void my_uuid(uchar *guid); +void my_uuid2str(const uchar *guid, char *s); +void my_uuid_end(); + +struct my_rnd_struct { + unsigned long seed1,seed2,max_value; + double max_value_dbl; +}; + +void my_rnd_init(struct my_rnd_struct *rand_st, ulong seed1, ulong seed2); +double my_rnd(struct my_rnd_struct *rand_st); + +/* character sets */ +extern uint get_charset_number(const char *cs_name, uint cs_flags); +extern uint get_collation_number(const char *name); +extern const char *get_charset_name(uint cs_number); + +extern CHARSET_INFO *get_charset(uint cs_number, myf flags); +extern CHARSET_INFO *get_charset_by_name(const char *cs_name, myf flags); +extern CHARSET_INFO *get_charset_by_csname(const char *cs_name, + uint cs_flags, myf my_flags); + +extern my_bool resolve_charset(const char *cs_name, + CHARSET_INFO *default_cs, + CHARSET_INFO **cs); +extern my_bool resolve_collation(const char *cl_name, + CHARSET_INFO *default_cl, + CHARSET_INFO **cl); + +extern void free_charsets(void); +extern char *get_charsets_dir(char *buf); +extern my_bool my_charset_same(CHARSET_INFO *cs1, CHARSET_INFO *cs2); +extern my_bool init_compiled_charsets(myf flags); +extern void add_compiled_collation(CHARSET_INFO *cs); +extern size_t escape_string_for_mysql(CHARSET_INFO *charset_info, + char *to, size_t to_length, + const char *from, size_t length); +#ifdef __WIN__ +#define BACKSLASH_MBTAIL +/* File system character set */ +extern CHARSET_INFO *fs_character_set(void); +#endif +extern size_t escape_quotes_for_mysql(CHARSET_INFO *charset_info, + char *to, size_t to_length, + const char *from, size_t length); + +extern void thd_increment_bytes_sent(ulong length); +extern void thd_increment_bytes_received(ulong length); +extern void thd_increment_net_big_packet_count(ulong length); + +#ifdef __WIN__ +extern my_bool have_tcpip; /* Is set if tcpip is used */ + +/* implemented in my_windac.c */ + +int my_security_attr_create(SECURITY_ATTRIBUTES **psa, const char **perror, + DWORD owner_rights, DWORD everybody_rights); + +void my_security_attr_free(SECURITY_ATTRIBUTES *sa); + +/* implemented in my_conio.c */ +char* my_cgets(char *string, size_t clen, size_t* plen); + +#endif +#ifdef __NETWARE__ +void netware_reg_user(const char *ip, const char *user, + const char *application); +#endif + +C_MODE_END +#endif /* _my_sys_h */ diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_time.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_time.h new file mode 100644 index 0000000..58995f1 --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_time.h @@ -0,0 +1,172 @@ +/* Copyright (C) 2004-2005 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* + This is a private header of sql-common library, containing + declarations for my_time.c +*/ + +#ifndef _my_time_h_ +#define _my_time_h_ +#include "my_global.h" +#include "mysql_time.h" + +C_MODE_START + +extern ulonglong log_10_int[20]; +extern uchar days_in_month[]; + +/* + Portable time_t replacement. + Should be signed and hold seconds for 1902 -- 2038-01-19 range + i.e at least a 32bit variable + + Using the system built in time_t is not an option as + we rely on the above requirements in the time functions + + For example QNX has an unsigned time_t type +*/ +typedef long my_time_t; + +#define MY_TIME_T_MAX LONG_MAX +#define MY_TIME_T_MIN LONG_MIN + +/* Time handling defaults */ +#define TIMESTAMP_MAX_YEAR 2038 +#define TIMESTAMP_MIN_YEAR (1900 + YY_PART_YEAR - 1) +#define TIMESTAMP_MAX_VALUE INT_MAX32 +#define TIMESTAMP_MIN_VALUE 1 + +/* two-digit years < this are 20..; >= this are 19.. */ +#define YY_PART_YEAR 70 + +/* Flags to str_to_datetime */ +#define TIME_FUZZY_DATE 1 +#define TIME_DATETIME_ONLY 2 +/* Must be same as MODE_NO_ZERO_IN_DATE */ +#define TIME_NO_ZERO_IN_DATE (65536L*2*2*2*2*2*2*2) +/* Must be same as MODE_NO_ZERO_DATE */ +#define TIME_NO_ZERO_DATE (TIME_NO_ZERO_IN_DATE*2) +#define TIME_INVALID_DATES (TIME_NO_ZERO_DATE*2) + +#define MYSQL_TIME_WARN_TRUNCATED 1 +#define MYSQL_TIME_WARN_OUT_OF_RANGE 2 + +/* Limits for the TIME data type */ +#define TIME_MAX_HOUR 838 +#define TIME_MAX_MINUTE 59 +#define TIME_MAX_SECOND 59 +#define TIME_MAX_VALUE (TIME_MAX_HOUR*10000 + TIME_MAX_MINUTE*100 + \ + TIME_MAX_SECOND) +#define TIME_MAX_VALUE_SECONDS (TIME_MAX_HOUR * 3600L + \ + TIME_MAX_MINUTE * 60L + TIME_MAX_SECOND) + +my_bool check_date(const MYSQL_TIME *ltime, my_bool not_zero_date, + ulong flags, int *was_cut); +enum enum_mysql_timestamp_type +str_to_datetime(const char *str, uint length, MYSQL_TIME *l_time, + uint flags, int *was_cut); +longlong number_to_datetime(longlong nr, MYSQL_TIME *time_res, + uint flags, int *was_cut); +ulonglong TIME_to_ulonglong_datetime(const MYSQL_TIME *); +ulonglong TIME_to_ulonglong_date(const MYSQL_TIME *); +ulonglong TIME_to_ulonglong_time(const MYSQL_TIME *); +ulonglong TIME_to_ulonglong(const MYSQL_TIME *); + + +my_bool str_to_time(const char *str,uint length, MYSQL_TIME *l_time, + int *warning); + +int check_time_range(struct st_mysql_time *, int *warning); + +long calc_daynr(uint year,uint month,uint day); +uint calc_days_in_year(uint year); +uint year_2000_handling(uint year); + +void my_init_time(void); + + +/* + Function to check sanity of a TIMESTAMP value + + DESCRIPTION + Check if a given MYSQL_TIME value fits in TIMESTAMP range. + This function doesn't make precise check, but rather a rough + estimate. + + RETURN VALUES + FALSE The value seems sane + TRUE The MYSQL_TIME value is definitely out of range +*/ + +static inline my_bool validate_timestamp_range(const MYSQL_TIME *t) +{ + if ((t->year > TIMESTAMP_MAX_YEAR || t->year < TIMESTAMP_MIN_YEAR) || + (t->year == TIMESTAMP_MAX_YEAR && (t->month > 1 || t->day > 19)) || + (t->year == TIMESTAMP_MIN_YEAR && (t->month < 12 || t->day < 31))) + return FALSE; + + return TRUE; +} + +my_time_t +my_system_gmt_sec(const MYSQL_TIME *t, long *my_timezone, + my_bool *in_dst_time_gap); + +void set_zero_time(MYSQL_TIME *tm, enum enum_mysql_timestamp_type time_type); + +/* + Required buffer length for my_time_to_str, my_date_to_str, + my_datetime_to_str and TIME_to_string functions. Note, that the + caller is still responsible to check that given TIME structure + has values in valid ranges, otherwise size of the buffer could + be not enough. We also rely on the fact that even wrong values + sent using binary protocol fit in this buffer. +*/ +#define MAX_DATE_STRING_REP_LENGTH 30 + +int my_time_to_str(const MYSQL_TIME *l_time, char *to); +int my_date_to_str(const MYSQL_TIME *l_time, char *to); +int my_datetime_to_str(const MYSQL_TIME *l_time, char *to); +int my_TIME_to_str(const MYSQL_TIME *l_time, char *to); + +/* + Available interval types used in any statement. + + 'interval_type' must be sorted so that simple intervals comes first, + ie year, quarter, month, week, day, hour, etc. The order based on + interval size is also important and the intervals should be kept in a + large to smaller order. (get_interval_value() depends on this) + + Note: If you change the order of elements in this enum you should fix + order of elements in 'interval_type_to_name' and 'interval_names' + arrays + + See also interval_type_to_name, get_interval_value, interval_names +*/ + +enum interval_type +{ + INTERVAL_YEAR, INTERVAL_QUARTER, INTERVAL_MONTH, INTERVAL_WEEK, INTERVAL_DAY, + INTERVAL_HOUR, INTERVAL_MINUTE, INTERVAL_SECOND, INTERVAL_MICROSECOND, + INTERVAL_YEAR_MONTH, INTERVAL_DAY_HOUR, INTERVAL_DAY_MINUTE, + INTERVAL_DAY_SECOND, INTERVAL_HOUR_MINUTE, INTERVAL_HOUR_SECOND, + INTERVAL_MINUTE_SECOND, INTERVAL_DAY_MICROSECOND, INTERVAL_HOUR_MICROSECOND, + INTERVAL_MINUTE_MICROSECOND, INTERVAL_SECOND_MICROSECOND, INTERVAL_LAST +}; + +C_MODE_END + +#endif /* _my_time_h_ */ diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_tree.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_tree.h new file mode 100644 index 0000000..e387b25 --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_tree.h @@ -0,0 +1,96 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef _tree_h +#define _tree_h +#ifdef __cplusplus +extern "C" { +#endif + +#include "my_base.h" /* get 'enum ha_rkey_function' */ + +/* Worst case tree is half full. This gives use 2^(MAX_TREE_HEIGHT/2) leafs */ +#define MAX_TREE_HEIGHT 64 + +#define ELEMENT_KEY(tree,element)\ +(tree->offset_to_key ? (void*)((uchar*) element+tree->offset_to_key) :\ + *((void**) (element+1))) + +#define tree_set_pointer(element,ptr) *((uchar **) (element+1))=((uchar*) (ptr)) + +#define TREE_NO_DUPS 1 + +typedef enum { left_root_right, right_root_left } TREE_WALK; +typedef uint32 element_count; +typedef int (*tree_walk_action)(void *,element_count,void *); + +typedef enum { free_init, free_free, free_end } TREE_FREE; +typedef void (*tree_element_free)(void*, TREE_FREE, void *); + +typedef struct st_tree_element { + struct st_tree_element *left,*right; + uint32 count:31, + colour:1; /* black is marked as 1 */ +} TREE_ELEMENT; + +#define ELEMENT_CHILD(element, offs) (*(TREE_ELEMENT**)((char*)element + offs)) + +typedef struct st_tree { + TREE_ELEMENT *root,null_element; + TREE_ELEMENT **parents[MAX_TREE_HEIGHT]; + uint offset_to_key,elements_in_tree,size_of_element; + ulong memory_limit, allocated; + qsort_cmp2 compare; + void *custom_arg; + MEM_ROOT mem_root; + my_bool with_delete; + tree_element_free free; + uint flag; +} TREE; + + /* Functions on whole tree */ +void init_tree(TREE *tree, ulong default_alloc_size, ulong memory_limit, + int size, qsort_cmp2 compare, my_bool with_delete, + tree_element_free free_element, void *custom_arg); +void delete_tree(TREE*); +void reset_tree(TREE*); + + /* similar to delete tree, except we do not my_free() blocks in mem_root */ +#define is_tree_inited(tree) ((tree)->root != 0) + + /* Functions on leafs */ +TREE_ELEMENT *tree_insert(TREE *tree,void *key, uint key_size, + void *custom_arg); +void *tree_search(TREE *tree, void *key, void *custom_arg); +int tree_walk(TREE *tree,tree_walk_action action, + void *argument, TREE_WALK visit); +int tree_delete(TREE *tree, void *key, uint key_size, void *custom_arg); +void *tree_search_key(TREE *tree, const void *key, + TREE_ELEMENT **parents, TREE_ELEMENT ***last_pos, + enum ha_rkey_function flag, void *custom_arg); +void *tree_search_edge(TREE *tree, TREE_ELEMENT **parents, + TREE_ELEMENT ***last_pos, int child_offs); +void *tree_search_next(TREE *tree, TREE_ELEMENT ***last_pos, int l_offs, + int r_offs); +ha_rows tree_record_pos(TREE *tree, const void *key, + enum ha_rkey_function search_flag, void *custom_arg); +#define reset_free_element(tree) (tree)->free= 0 + +#define TREE_ELEMENT_EXTRA_SIZE (sizeof(TREE_ELEMENT) + sizeof(void*)) + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_trie.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_trie.h new file mode 100644 index 0000000..72dd485 --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_trie.h @@ -0,0 +1,141 @@ +/* Copyright (C) 2005 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef _trie_h +#define _trie_h +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct st_trie_node +{ + uint16 leaf; /* Depth from root node if match, 0 else */ + uchar c; /* Label on this edge */ + struct st_trie_node *next; /* Next label */ + struct st_trie_node *links; /* Array of edges leaving this node */ + struct st_trie_node *fail; /* AC failure function */ +} TRIE_NODE; + +typedef struct st_trie +{ + TRIE_NODE root; + MEM_ROOT mem_root; + CHARSET_INFO *charset; + uint32 nnodes; + uint32 nwords; +} TRIE; + +typedef struct st_ac_trie_state +{ + TRIE *trie; + TRIE_NODE *node; +} AC_TRIE_STATE; + +extern TRIE *trie_init (TRIE *trie, CHARSET_INFO *charset); +extern void trie_free (TRIE *trie); +extern my_bool trie_insert (TRIE *trie, const uchar *key, uint keylen); +extern my_bool ac_trie_prepare (TRIE *trie); +extern void ac_trie_init (TRIE *trie, AC_TRIE_STATE *state); + + +/* `trie_goto' is internal function and shouldn't be used. */ + +static inline TRIE_NODE *trie_goto (TRIE_NODE *root, TRIE_NODE *node, uchar c) +{ + TRIE_NODE *next; + DBUG_ENTER("trie_goto"); + for (next= node->links; next; next= next->next) + if (next->c == c) + DBUG_RETURN(next); + if (root == node) + DBUG_RETURN(root); + DBUG_RETURN(NULL); +} + + +/* + SYNOPSIS + int ac_trie_next (AC_TRIE_STATE *state, uchar *c); + state - valid pointer to `AC_TRIE_STATE' + c - character to lookup + + DESCRIPTION + Implementation of search using Aho-Corasick automaton. + Performs char-by-char search. + + RETURN VALUE + `ac_trie_next' returns length of matched word or 0. +*/ + +static inline int ac_trie_next (AC_TRIE_STATE *state, uchar *c) +{ + TRIE_NODE *root, *node; + DBUG_ENTER("ac_trie_next"); + DBUG_ASSERT(state && c); + root= &state->trie->root; + node= state->node; + while (! (state->node= trie_goto(root, node, *c))) + node= node->fail; + DBUG_RETURN(state->node->leaf); +} + + +/* + SYNOPSIS + my_bool trie_search (TRIE *trie, const uchar *key, uint keylen); + trie - valid pointer to `TRIE' + key - valid pointer to key to insert + keylen - non-0 key length + + DESCRIPTION + Performs key lookup in trie. + + RETURN VALUE + `trie_search' returns `true' if key is in `trie'. Otherwise, + `false' is returned. + + NOTES + Consecutive search here is "best by test". arrays are very short, so + binary search or hashing would add too much complexity that would + overweight speed gain. Especially because compiler can optimize simple + consecutive loop better (tested) +*/ + +static inline my_bool trie_search (TRIE *trie, const uchar *key, uint keylen) +{ + TRIE_NODE *node; + uint k; + DBUG_ENTER("trie_search"); + DBUG_ASSERT(trie && key && keylen); + node= &trie->root; + + for (k= 0; k < keylen; k++) + { + uchar p; + if (! (node= node->links)) + DBUG_RETURN(FALSE); + p= key[k]; + while (p != node->c) + if (! (node= node->next)) + DBUG_RETURN(FALSE); + } + + DBUG_RETURN(node->leaf > 0); +} + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_uctype.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_uctype.h new file mode 100644 index 0000000..9aaf478 --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_uctype.h @@ -0,0 +1,1479 @@ +/* Copyright (C) 2006 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ + +/* + Unicode ctype data + Generated from UnicodeData-5.0.0d9.txt +*/ +static unsigned char uctype_page00[256]= +{ + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 8, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 16, 16, 16, 16, 16, 16, + 16, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, + 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 16, 16, 16, 16, 16, + 16, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 16, 16, 16, 16, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 8, 16, 16, 16, 16, 16, 16, 16, 16, 16, 2, 16, 16, 32, 16, 16, + 16, 16, 20, 20, 16, 2, 16, 16, 16, 20, 2, 16, 20, 20, 20, 16, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 16, 1, 1, 1, 1, 1, 1, 1, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 16, 2, 2, 2, 2, 2, 2, 2, 2 +}; + +static unsigned char uctype_page01[256]= +{ + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, + 2, 1, 2, 1, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, + 2, 1, 1, 2, 1, 2, 1, 1, 2, 1, 1, 1, 2, 2, 1, 1, + 1, 1, 2, 1, 1, 2, 1, 1, 1, 2, 2, 2, 1, 1, 2, 1, + 1, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, + 2, 1, 1, 1, 2, 1, 2, 1, 1, 2, 2, 2, 1, 2, 2, 2, + 2, 2, 2, 2, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 1, + 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 2, 1, 1, 2, 1, 2, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2 +}; + +static unsigned char uctype_page02[256]= +{ + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 2, 1, 1, 2, + 2, 1, 2, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 16, 16, 16, 16, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 2, 2, 2, 2, 2, 16, 16, 16, 16, 16, 16, 16, 16, 16, 2, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16 +}; + +static unsigned char uctype_page03[256]= +{ + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 0, 0, 0, 0, 16, 16, 0, 0, 0, 0, 2, 2, 2, 2, 16, 0, + 0, 0, 0, 0, 16, 16, 1, 16, 1, 1, 1, 0, 1, 0, 1, 1, + 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, + 2, 2, 1, 1, 1, 2, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 2, 2, 2, 2, 1, 2, 16, 1, 2, 1, 1, 2, 2, 1, 1, 1 +}; + +static unsigned char uctype_page04[256]= +{ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 16, 18, 18, 18, 18, 0, 18, 18, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2 +}; + +static unsigned char uctype_page05[256]= +{ + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 2, 16, 16, 16, 16, 16, 16, + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 0, 16, 16, 0, 0, 0, 0, 0, + 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 16, 18, + 16, 18, 18, 16, 18, 18, 16, 18, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, + 2, 2, 2, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_page06[256]= +{ + 32, 32, 32, 32, 0, 0, 0, 0, 0, 0, 0, 16, 16, 16, 16, 16, + 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 16, 0, 0, 16, 16, + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 16, 16, 16, 16, 2, 2, + 18, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 16, 2, 18, 18, 18, 18, 18, 18, 18, 32, 18, 18, + 18, 18, 18, 18, 18, 2, 2, 18, 18, 16, 18, 18, 18, 18, 2, 2, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 16, 16, 2 +}; + +static unsigned char uctype_page07[256]= +{ + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 32, + 2, 18, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 2, 2, 16, 16, 16, 16, 2, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_page09[256]= +{ + 0, 18, 18, 18, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 18, 2, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, + 2, 18, 18, 18, 18, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 18, 18, 16, 16, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, + 0, 18, 18, 18, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, + 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, + 2, 0, 2, 0, 0, 0, 2, 2, 2, 2, 0, 0, 18, 2, 18, 18, + 18, 18, 18, 18, 18, 0, 0, 18, 18, 0, 0, 18, 18, 18, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 2, 2, 0, 2, + 2, 2, 18, 18, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 2, 2, 16, 16, 20, 20, 20, 20, 20, 20, 16, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_page0A[256]= +{ + 0, 18, 18, 18, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 2, + 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, + 2, 0, 2, 2, 0, 2, 2, 0, 2, 2, 0, 0, 18, 0, 18, 18, + 18, 18, 18, 0, 0, 0, 0, 18, 18, 0, 0, 18, 18, 18, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 2, 0, + 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 18, 18, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 18, 18, 18, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, + 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, + 2, 0, 2, 2, 0, 2, 2, 2, 2, 2, 0, 0, 18, 2, 18, 18, + 18, 18, 18, 18, 18, 18, 0, 18, 18, 18, 0, 18, 18, 18, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 18, 18, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_page0B[256]= +{ + 0, 18, 18, 18, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, + 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, + 2, 0, 2, 2, 0, 2, 2, 2, 2, 2, 0, 0, 18, 2, 18, 18, + 18, 18, 18, 18, 0, 0, 0, 18, 18, 0, 0, 18, 18, 18, 0, 0, + 0, 0, 0, 0, 0, 0, 18, 18, 0, 0, 0, 0, 2, 2, 0, 2, + 2, 2, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 16, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 18, 2, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, + 2, 0, 2, 2, 2, 2, 0, 0, 0, 2, 2, 0, 2, 0, 2, 2, + 0, 0, 0, 2, 2, 0, 0, 0, 2, 2, 2, 0, 0, 0, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 18, 18, + 18, 18, 18, 0, 0, 0, 18, 18, 18, 0, 18, 18, 18, 18, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 20, 20, 20, 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_page0C[256]= +{ + 0, 18, 18, 18, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, + 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 18, 18, + 18, 18, 18, 18, 18, 0, 18, 18, 18, 0, 18, 18, 18, 18, 0, 0, + 0, 0, 0, 0, 0, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 18, 18, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, + 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 0, 0, 18, 2, 18, 18, + 18, 18, 18, 18, 18, 0, 18, 18, 18, 0, 18, 18, 18, 18, 0, 0, + 0, 0, 0, 0, 0, 18, 18, 0, 0, 0, 0, 0, 0, 0, 2, 0, + 2, 2, 18, 18, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 0, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_page0D[256]= +{ + 0, 0, 18, 18, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, + 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 18, 18, + 18, 18, 18, 18, 0, 0, 18, 18, 18, 0, 18, 18, 18, 18, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 18, 18, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 18, 0, 0, 0, 0, 18, + 18, 18, 18, 18, 18, 0, 18, 0, 18, 18, 18, 18, 18, 18, 18, 18, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 18, 18, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_page0E[256]= +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 18, 2, 2, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 16, + 2, 2, 2, 2, 2, 2, 2, 18, 18, 18, 18, 18, 18, 18, 18, 16, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 16, 16, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 2, 0, 2, 0, 0, 2, 2, 0, 2, 0, 0, 2, 0, 0, + 0, 0, 0, 0, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, + 0, 2, 2, 2, 0, 2, 0, 2, 0, 0, 2, 2, 0, 2, 2, 2, + 2, 18, 2, 2, 18, 18, 18, 18, 18, 18, 0, 18, 18, 2, 0, 0, + 2, 2, 2, 2, 2, 0, 2, 0, 18, 18, 18, 18, 18, 18, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 2, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_page0F[256]= +{ + 2, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 18, 18, 16, 16, 16, 16, 16, 16, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 16, 18, 16, 18, 16, 18, 16, 16, 16, 16, 18, 18, + 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, + 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 16, 18, 18, 2, 2, 2, 2, 0, 0, 0, 0, + 18, 18, 18, 18, 18, 18, 18, 18, 0, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 16, 16, + 16, 16, 16, 16, 16, 16, 18, 16, 16, 16, 16, 16, 16, 0, 0, 16, + 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_page10[256]= +{ + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 0, 2, 2, 2, 2, 2, 0, 2, 2, 0, 18, 18, 18, 18, + 18, 18, 18, 0, 0, 0, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 16, 16, 16, 16, 16, 16, + 2, 2, 2, 2, 2, 2, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 2, 0, 0, 0 +}; + +static unsigned char uctype_page11[256]= +{ + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_page12[256]= +{ + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 0, 2, 0, 2, 2, 2, 2, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 0, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, + 2, 0, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 +}; + +static unsigned char uctype_page13[256]= +{ + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 0, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 18, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_page14[256]= +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 +}; + +static unsigned char uctype_page16[256]= +{ + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 16, 2, + 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 16, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 16, 16, 7, 7, + 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_page17[256]= +{ + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, + 2, 2, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 18, 18, 18, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, + 2, 0, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 32, 32, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 16, 16, 16, 2, 16, 16, 16, 16, 2, 18, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_page18[256]= +{ + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 18, 18, 18, 8, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 18, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_page19[256]= +{ + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, + 16, 0, 0, 0, 16, 16, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, + 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 2, 2, 2, 2, 2, 2, 2, 18, 18, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16 +}; + +static unsigned char uctype_page1A[256]= +{ + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 18, 18, 18, 18, 18, 0, 0, 16, 16, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_page1B[256]= +{ + 18, 18, 18, 18, 18, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_page1D[256]= +{ + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18 +}; + +static unsigned char uctype_page1E[256]= +{ + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_page1F[256]= +{ + 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 0, 1, 0, 1, 0, 1, 0, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 0, 2, 2, 1, 1, 1, 1, 1, 16, 2, 16, + 16, 16, 2, 2, 2, 0, 2, 2, 1, 1, 1, 1, 1, 16, 16, 16, + 2, 2, 2, 2, 0, 0, 2, 2, 1, 1, 1, 1, 0, 16, 16, 16, + 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 16, 16, 16, + 0, 0, 2, 2, 2, 0, 2, 2, 1, 1, 1, 1, 1, 16, 16, 0 +}; + +static unsigned char uctype_page20[256]= +{ + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 32, 32, 32, 32, 32, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 8, 8, 32, 32, 32, 32, 32, 8, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 8, + 32, 32, 32, 32, 0, 0, 0, 0, 0, 0, 32, 32, 32, 32, 32, 32, + 20, 2, 0, 0, 20, 20, 20, 20, 20, 20, 16, 16, 16, 16, 16, 2, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 16, 16, 16, 16, 16, 0, + 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_page21[256]= +{ + 16, 16, 1, 16, 16, 16, 16, 1, 16, 16, 2, 1, 1, 1, 2, 2, + 1, 1, 1, 2, 16, 1, 16, 16, 16, 1, 1, 1, 1, 1, 16, 16, + 16, 16, 16, 16, 1, 16, 1, 16, 1, 16, 1, 1, 1, 1, 16, 2, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 16, 16, 2, 2, 1, 1, + 16, 16, 16, 16, 16, 1, 2, 2, 2, 2, 16, 16, 16, 16, 2, 0, + 0, 0, 0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16 +}; + +static unsigned char uctype_page23[256]= +{ + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_page24[256]= +{ + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20 +}; + +static unsigned char uctype_page26[256]= +{ + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_page27[256]= +{ + 0, 16, 16, 16, 16, 0, 16, 16, 16, 16, 0, 0, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 0, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 16, 0, 16, + 16, 16, 16, 0, 0, 0, 16, 0, 16, 16, 16, 16, 16, 16, 16, 0, + 0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 16, 0, 0, 0, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16 +}; + +static unsigned char uctype_page2B[256]= +{ + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, + 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_page2C[256]= +{ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, + 1, 2, 1, 1, 1, 2, 2, 1, 2, 1, 2, 1, 2, 0, 0, 0, + 0, 0, 0, 0, 2, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 2, 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 16, 16, 16, 20, 16, 16 +}; + +static unsigned char uctype_page2D[256]= +{ + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 0, + 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 0, + 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 0, + 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_page2E[256]= +{ + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 16, 16, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_page2F[256]= +{ + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 0 +}; + +static unsigned char uctype_page30[256]= +{ + 8, 16, 16, 16, 16, 2, 2, 7, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 7, 7, 7, 7, 7, 7, 7, 7, 7, 18, 18, 18, 18, 18, 18, + 16, 2, 2, 2, 2, 2, 16, 16, 7, 7, 7, 2, 2, 16, 16, 16, + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 0, 0, 18, 18, 16, 16, 2, 2, 2, + 16, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 2, 2, 2, 2 +}; + +static unsigned char uctype_page31[256]= +{ + 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, + 16, 16, 20, 20, 20, 20, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 +}; + +static unsigned char uctype_page32[256]= +{ + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 16, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0 +}; + +static unsigned char uctype_page4D[256]= +{ + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16 +}; + +static unsigned char uctype_page9F[256]= +{ + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_pageA4[256]= +{ + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_pageA7[256]= +{ + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 2, 2, 2, 2, 0, 0, 0, 0, 0, + 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_pageA8[256]= +{ + 2, 2, 18, 2, 2, 2, 18, 2, 2, 2, 2, 18, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 18, 18, 18, 18, 18, 16, 16, 16, 16, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_pageD7[256]= +{ + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_pageD8[256]= +{ + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_pageDB[256]= +{ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32 +}; + +static unsigned char uctype_pageDC[256]= +{ + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_pageDF[256]= +{ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32 +}; + +static unsigned char uctype_pageE0[256]= +{ + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_pageF8[256]= +{ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32 +}; + +static unsigned char uctype_pageFA[256]= +{ + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_pageFB[256]= +{ + 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 18, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 0, 2, 0, + 2, 2, 0, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 +}; + +static unsigned char uctype_pageFD[256]= +{ + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 16, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 16, 0, 0 +}; + +static unsigned char uctype_pageFE[256]= +{ + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, + 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 0, 16, 16, 16, 16, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 32 +}; + +static unsigned char uctype_pageFF[256]= +{ + 0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 16, 16, 16, 16, 16, 16, + 16, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 16, 16, 16, 16, + 16, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, + 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, + 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 0, 0, 0, + 16, 16, 16, 16, 16, 16, 16, 0, 16, 16, 16, 16, 16, 16, 16, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 32, 32, 16, 16, 0, 0 +}; + +MY_UNI_CTYPE my_uni_ctype[256]={ + {0,uctype_page00}, + {0,uctype_page01}, + {0,uctype_page02}, + {0,uctype_page03}, + {0,uctype_page04}, + {0,uctype_page05}, + {0,uctype_page06}, + {0,uctype_page07}, + {0,NULL}, + {0,uctype_page09}, + {0,uctype_page0A}, + {0,uctype_page0B}, + {0,uctype_page0C}, + {0,uctype_page0D}, + {0,uctype_page0E}, + {0,uctype_page0F}, + {0,uctype_page10}, + {0,uctype_page11}, + {0,uctype_page12}, + {0,uctype_page13}, + {0,uctype_page14}, + {2,NULL}, + {0,uctype_page16}, + {0,uctype_page17}, + {0,uctype_page18}, + {0,uctype_page19}, + {0,uctype_page1A}, + {0,uctype_page1B}, + {0,NULL}, + {0,uctype_page1D}, + {0,uctype_page1E}, + {0,uctype_page1F}, + {0,uctype_page20}, + {0,uctype_page21}, + {16,NULL}, + {0,uctype_page23}, + {0,uctype_page24}, + {16,NULL}, + {0,uctype_page26}, + {0,uctype_page27}, + {16,NULL}, + {16,NULL}, + {16,NULL}, + {0,uctype_page2B}, + {0,uctype_page2C}, + {0,uctype_page2D}, + {0,uctype_page2E}, + {0,uctype_page2F}, + {0,uctype_page30}, + {0,uctype_page31}, + {0,uctype_page32}, + {16,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {0,uctype_page4D}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {0,uctype_page9F}, + {2,NULL}, + {2,NULL}, + {2,NULL}, + {2,NULL}, + {0,uctype_pageA4}, + {0,NULL}, + {0,NULL}, + {0,uctype_pageA7}, + {0,uctype_pageA8}, + {0,NULL}, + {0,NULL}, + {0,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {0,uctype_pageD7}, + {0,uctype_pageD8}, + {0,NULL}, + {0,NULL}, + {0,uctype_pageDB}, + {0,uctype_pageDC}, + {0,NULL}, + {0,NULL}, + {0,uctype_pageDF}, + {0,uctype_pageE0}, + {0,NULL}, + {0,NULL}, + {0,NULL}, + {0,NULL}, + {0,NULL}, + {0,NULL}, + {0,NULL}, + {0,NULL}, + {0,NULL}, + {0,NULL}, + {0,NULL}, + {0,NULL}, + {0,NULL}, + {0,NULL}, + {0,NULL}, + {0,NULL}, + {0,NULL}, + {0,NULL}, + {0,NULL}, + {0,NULL}, + {0,NULL}, + {0,NULL}, + {0,NULL}, + {0,uctype_pageF8}, + {2,NULL}, + {0,uctype_pageFA}, + {0,uctype_pageFB}, + {2,NULL}, + {0,uctype_pageFD}, + {0,uctype_pageFE}, + {0,uctype_pageFF} +}; + + diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_vle.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_vle.h new file mode 100644 index 0000000..c09f822 --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_vle.h @@ -0,0 +1,38 @@ +/* Copyright (C) 2005 MySQL AB + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef VLE_H +#define VLE_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "my_global.h" + +/* + The size (in bytes) required to store the object ITEM, which can be + either an expression or a type (since sizeof() is used on the item). +*/ +#define my_vle_sizeof(ITEM) (((sizeof(ITEM) * CHAR_BIT) + 6) / 7) + +uchar *my_vle_encode(uchar *vle, size_t max, ulong value); +uchar const *my_vle_decode(ulong *value_ptr, uchar const *vle); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_xml.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_xml.h new file mode 100644 index 0000000..6a453ee --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/my_xml.h @@ -0,0 +1,89 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + + +#ifndef _my_xml_h +#define _my_xml_h + +#ifdef __cplusplus +extern "C" { +#endif + + +#define MY_XML_OK 0 +#define MY_XML_ERROR 1 + +/* + A flag whether to use absolute tag names in call-back functions, + like "a", "a.b" and "a.b.c" (used in character set file parser), + or relative names like "a", "b" and "c". +*/ +#define MY_XML_FLAG_RELATIVE_NAMES 1 + +/* + A flag whether to skip normilization of text values before calling + call-back functions: i.e. skip leading/trailing spaces, + \r, \n, \t characters. +*/ +#define MY_XML_FLAG_SKIP_TEXT_NORMALIZATION 2 + +enum my_xml_node_type +{ + MY_XML_NODE_TAG, /* can have TAG, ATTR and TEXT children */ + MY_XML_NODE_ATTR, /* can have TEXT children */ + MY_XML_NODE_TEXT /* cannot have children */ +}; + +typedef struct xml_stack_st +{ + int flags; + enum my_xml_node_type current_node_type; + char errstr[128]; + char attr[128]; + char *attrend; + const char *beg; + const char *cur; + const char *end; + void *user_data; + int (*enter)(struct xml_stack_st *st,const char *val, size_t len); + int (*value)(struct xml_stack_st *st,const char *val, size_t len); + int (*leave_xml)(struct xml_stack_st *st,const char *val, size_t len); +} MY_XML_PARSER; + +void my_xml_parser_create(MY_XML_PARSER *st); +void my_xml_parser_free(MY_XML_PARSER *st); +int my_xml_parse(MY_XML_PARSER *st,const char *str, size_t len); + +void my_xml_set_value_handler(MY_XML_PARSER *st, int (*)(MY_XML_PARSER *, + const char *, + size_t len)); +void my_xml_set_enter_handler(MY_XML_PARSER *st, int (*)(MY_XML_PARSER *, + const char *, + size_t len)); +void my_xml_set_leave_handler(MY_XML_PARSER *st, int (*)(MY_XML_PARSER *, + const char *, + size_t len)); +void my_xml_set_user_data(MY_XML_PARSER *st, void *); + +size_t my_xml_error_pos(MY_XML_PARSER *st); +uint my_xml_error_lineno(MY_XML_PARSER *st); + +const char *my_xml_error_string(MY_XML_PARSER *st); + +#ifdef __cplusplus +} +#endif + +#endif /* _my_xml_h */ diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/myisampack.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/myisampack.h new file mode 100644 index 0000000..34a085e --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/myisampack.h @@ -0,0 +1,238 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* + Storing of values in high byte first order. + + integer keys and file pointers are stored with high byte first to get + better compression +*/ + +/* these two are for uniformity */ +#define mi_sint1korr(A) ((int8)(*A)) +#define mi_uint1korr(A) ((uint8)(*A)) + +#define mi_sint2korr(A) ((int16) (((int16) (((const uchar*) (A))[1])) +\ + ((int16) ((int16) ((const char*) (A))[0]) << 8))) +#define mi_sint3korr(A) ((int32) (((((const uchar*) (A))[0]) & 128) ? \ + (((uint32) 255L << 24) | \ + (((uint32) ((const uchar*) (A))[0]) << 16) |\ + (((uint32) ((const uchar*) (A))[1]) << 8) | \ + ((uint32) ((const uchar*) (A))[2])) : \ + (((uint32) ((const uchar*) (A))[0]) << 16) |\ + (((uint32) ((const uchar*) (A))[1]) << 8) | \ + ((uint32) ((const uchar*) (A))[2]))) +#define mi_sint4korr(A) ((int32) (((int32) (((const uchar*) (A))[3])) +\ + ((int32) (((const uchar*) (A))[2]) << 8) +\ + ((int32) (((const uchar*) (A))[1]) << 16) +\ + ((int32) ((int16) ((const char*) (A))[0]) << 24))) +#define mi_sint8korr(A) ((longlong) mi_uint8korr(A)) +#define mi_uint2korr(A) ((uint16) (((uint16) (((const uchar*) (A))[1])) +\ + ((uint16) (((const uchar*) (A))[0]) << 8))) +#define mi_uint3korr(A) ((uint32) (((uint32) (((const uchar*) (A))[2])) +\ + (((uint32) (((const uchar*) (A))[1])) << 8) +\ + (((uint32) (((const uchar*) (A))[0])) << 16))) +#define mi_uint4korr(A) ((uint32) (((uint32) (((const uchar*) (A))[3])) +\ + (((uint32) (((const uchar*) (A))[2])) << 8) +\ + (((uint32) (((const uchar*) (A))[1])) << 16) +\ + (((uint32) (((const uchar*) (A))[0])) << 24))) +#define mi_uint5korr(A) ((ulonglong)(((uint32) (((const uchar*) (A))[4])) +\ + (((uint32) (((const uchar*) (A))[3])) << 8) +\ + (((uint32) (((const uchar*) (A))[2])) << 16) +\ + (((uint32) (((const uchar*) (A))[1])) << 24)) +\ + (((ulonglong) (((const uchar*) (A))[0])) << 32)) +#define mi_uint6korr(A) ((ulonglong)(((uint32) (((const uchar*) (A))[5])) +\ + (((uint32) (((const uchar*) (A))[4])) << 8) +\ + (((uint32) (((const uchar*) (A))[3])) << 16) +\ + (((uint32) (((const uchar*) (A))[2])) << 24)) +\ + (((ulonglong) (((uint32) (((const uchar*) (A))[1])) +\ + (((uint32) (((const uchar*) (A))[0]) << 8)))) <<\ + 32)) +#define mi_uint7korr(A) ((ulonglong)(((uint32) (((const uchar*) (A))[6])) +\ + (((uint32) (((const uchar*) (A))[5])) << 8) +\ + (((uint32) (((const uchar*) (A))[4])) << 16) +\ + (((uint32) (((const uchar*) (A))[3])) << 24)) +\ + (((ulonglong) (((uint32) (((const uchar*) (A))[2])) +\ + (((uint32) (((const uchar*) (A))[1])) << 8) +\ + (((uint32) (((const uchar*) (A))[0])) << 16))) <<\ + 32)) +#define mi_uint8korr(A) ((ulonglong)(((uint32) (((const uchar*) (A))[7])) +\ + (((uint32) (((const uchar*) (A))[6])) << 8) +\ + (((uint32) (((const uchar*) (A))[5])) << 16) +\ + (((uint32) (((const uchar*) (A))[4])) << 24)) +\ + (((ulonglong) (((uint32) (((const uchar*) (A))[3])) +\ + (((uint32) (((const uchar*) (A))[2])) << 8) +\ + (((uint32) (((const uchar*) (A))[1])) << 16) +\ + (((uint32) (((const uchar*) (A))[0])) << 24))) <<\ + 32)) + +/* This one is for uniformity */ +#define mi_int1store(T,A) *((uchar*)(T))= (uchar) (A) + +#define mi_int2store(T,A) { uint def_temp= (uint) (A) ;\ + ((uchar*) (T))[1]= (uchar) (def_temp);\ + ((uchar*) (T))[0]= (uchar) (def_temp >> 8); } +#define mi_int3store(T,A) { /*lint -save -e734 */\ + ulong def_temp= (ulong) (A);\ + ((uchar*) (T))[2]= (uchar) (def_temp);\ + ((uchar*) (T))[1]= (uchar) (def_temp >> 8);\ + ((uchar*) (T))[0]= (uchar) (def_temp >> 16);\ + /*lint -restore */} +#define mi_int4store(T,A) { ulong def_temp= (ulong) (A);\ + ((uchar*) (T))[3]= (uchar) (def_temp);\ + ((uchar*) (T))[2]= (uchar) (def_temp >> 8);\ + ((uchar*) (T))[1]= (uchar) (def_temp >> 16);\ + ((uchar*) (T))[0]= (uchar) (def_temp >> 24); } +#define mi_int5store(T,A) { ulong def_temp= (ulong) (A),\ + def_temp2= (ulong) ((A) >> 32);\ + ((uchar*) (T))[4]= (uchar) (def_temp);\ + ((uchar*) (T))[3]= (uchar) (def_temp >> 8);\ + ((uchar*) (T))[2]= (uchar) (def_temp >> 16);\ + ((uchar*) (T))[1]= (uchar) (def_temp >> 24);\ + ((uchar*) (T))[0]= (uchar) (def_temp2); } +#define mi_int6store(T,A) { ulong def_temp= (ulong) (A),\ + def_temp2= (ulong) ((A) >> 32);\ + ((uchar*) (T))[5]= (uchar) (def_temp);\ + ((uchar*) (T))[4]= (uchar) (def_temp >> 8);\ + ((uchar*) (T))[3]= (uchar) (def_temp >> 16);\ + ((uchar*) (T))[2]= (uchar) (def_temp >> 24);\ + ((uchar*) (T))[1]= (uchar) (def_temp2);\ + ((uchar*) (T))[0]= (uchar) (def_temp2 >> 8); } +#define mi_int7store(T,A) { ulong def_temp= (ulong) (A),\ + def_temp2= (ulong) ((A) >> 32);\ + ((uchar*) (T))[6]= (uchar) (def_temp);\ + ((uchar*) (T))[5]= (uchar) (def_temp >> 8);\ + ((uchar*) (T))[4]= (uchar) (def_temp >> 16);\ + ((uchar*) (T))[3]= (uchar) (def_temp >> 24);\ + ((uchar*) (T))[2]= (uchar) (def_temp2);\ + ((uchar*) (T))[1]= (uchar) (def_temp2 >> 8);\ + ((uchar*) (T))[0]= (uchar) (def_temp2 >> 16); } +#define mi_int8store(T,A) { ulong def_temp3= (ulong) (A),\ + def_temp4= (ulong) ((A) >> 32);\ + mi_int4store((uchar*) (T) + 0, def_temp4);\ + mi_int4store((uchar*) (T) + 4, def_temp3); } + +#ifdef WORDS_BIGENDIAN + +#define mi_float4store(T,A) { ((uchar*) (T))[0]= ((uchar*) &A)[0];\ + ((uchar*) (T))[1]= ((uchar*) &A)[1];\ + ((uchar*) (T))[2]= ((uchar*) &A)[2];\ + ((uchar*) (T))[3]= ((uchar*) &A)[3]; } + +#define mi_float4get(V,M) { float def_temp;\ + ((uchar*) &def_temp)[0]= ((const uchar*) (M))[0];\ + ((uchar*) &def_temp)[1]= ((const uchar*) (M))[1]; \ + ((uchar*) &def_temp)[2]= ((const uchar*) (M))[2];\ + ((uchar*) &def_temp)[3]= ((const uchar*) (M))[3];\ + (V)= def_temp; } + +#define mi_float8store(T,V) { ((uchar*) (T))[0]= ((const uchar*) &V)[0];\ + ((uchar*) (T))[1]= ((const uchar*) &V)[1];\ + ((uchar*) (T))[2]= ((const uchar*) &V)[2];\ + ((uchar*) (T))[3]= ((const uchar*) &V)[3];\ + ((uchar*) (T))[4]= ((const uchar*) &V)[4];\ + ((uchar*) (T))[5]= ((const uchar*) &V)[5];\ + ((uchar*) (T))[6]= ((const uchar*) &V)[6];\ + ((uchar*) (T))[7]= ((const uchar*) &V)[7]; } + +#define mi_float8get(V,M) { double def_temp;\ + ((uchar*) &def_temp)[0]= ((const uchar*) (M))[0];\ + ((uchar*) &def_temp)[1]= ((const uchar*) (M))[1];\ + ((uchar*) &def_temp)[2]= ((const uchar*) (M))[2];\ + ((uchar*) &def_temp)[3]= ((const uchar*) (M))[3];\ + ((uchar*) &def_temp)[4]= ((const uchar*) (M))[4];\ + ((uchar*) &def_temp)[5]= ((const uchar*) (M))[5];\ + ((uchar*) &def_temp)[6]= ((const uchar*) (M))[6];\ + ((uchar*) &def_temp)[7]= ((const uchar*) (M))[7]; \ + (V)= def_temp; } +#else + +#define mi_float4store(T,A) { ((uchar*) (T))[0]= ((const uchar*) &A)[3];\ + ((uchar*) (T))[1]= ((const uchar*) &A)[2];\ + ((uchar*) (T))[2]= ((const uchar*) &A)[1];\ + ((uchar*) (T))[3]= ((const uchar*) &A)[0]; } + +#define mi_float4get(V,M) { float def_temp;\ + ((uchar*) &def_temp)[0]= ((const uchar*) (M))[3];\ + ((uchar*) &def_temp)[1]= ((const uchar*) (M))[2];\ + ((uchar*) &def_temp)[2]= ((const uchar*) (M))[1];\ + ((uchar*) &def_temp)[3]= ((const uchar*) (M))[0];\ + (V)= def_temp; } + +#if defined(__FLOAT_WORD_ORDER) && (__FLOAT_WORD_ORDER == __BIG_ENDIAN) +#define mi_float8store(T,V) { ((uchar*) (T))[0]= ((const uchar*) &V)[3];\ + ((uchar*) (T))[1]= ((const uchar*) &V)[2];\ + ((uchar*) (T))[2]= ((const uchar*) &V)[1];\ + ((uchar*) (T))[3]= ((const uchar*) &V)[0];\ + ((uchar*) (T))[4]= ((const uchar*) &V)[7];\ + ((uchar*) (T))[5]= ((const uchar*) &V)[6];\ + ((uchar*) (T))[6]= ((const uchar*) &V)[5];\ + ((uchar*) (T))[7]= ((const uchar*) &V)[4];} + +#define mi_float8get(V,M) { double def_temp;\ + ((uchar*) &def_temp)[0]= ((const uchar*) (M))[3];\ + ((uchar*) &def_temp)[1]= ((const uchar*) (M))[2];\ + ((uchar*) &def_temp)[2]= ((const uchar*) (M))[1];\ + ((uchar*) &def_temp)[3]= ((const uchar*) (M))[0];\ + ((uchar*) &def_temp)[4]= ((const uchar*) (M))[7];\ + ((uchar*) &def_temp)[5]= ((const uchar*) (M))[6];\ + ((uchar*) &def_temp)[6]= ((const uchar*) (M))[5];\ + ((uchar*) &def_temp)[7]= ((const uchar*) (M))[4];\ + (V)= def_temp; } + +#else +#define mi_float8store(T,V) { ((uchar*) (T))[0]= ((const uchar*) &V)[7];\ + ((uchar*) (T))[1]= ((const uchar*) &V)[6];\ + ((uchar*) (T))[2]= ((const uchar*) &V)[5];\ + ((uchar*) (T))[3]= ((const uchar*) &V)[4];\ + ((uchar*) (T))[4]= ((const uchar*) &V)[3];\ + ((uchar*) (T))[5]= ((const uchar*) &V)[2];\ + ((uchar*) (T))[6]= ((const uchar*) &V)[1];\ + ((uchar*) (T))[7]= ((const uchar*) &V)[0];} + +#define mi_float8get(V,M) { double def_temp;\ + ((uchar*) &def_temp)[0]= ((const uchar*) (M))[7];\ + ((uchar*) &def_temp)[1]= ((const uchar*) (M))[6];\ + ((uchar*) &def_temp)[2]= ((const uchar*) (M))[5];\ + ((uchar*) &def_temp)[3]= ((const uchar*) (M))[4];\ + ((uchar*) &def_temp)[4]= ((const uchar*) (M))[3];\ + ((uchar*) &def_temp)[5]= ((const uchar*) (M))[2];\ + ((uchar*) &def_temp)[6]= ((const uchar*) (M))[1];\ + ((uchar*) &def_temp)[7]= ((const uchar*) (M))[0];\ + (V)= def_temp; } +#endif /* __FLOAT_WORD_ORDER */ +#endif /* WORDS_BIGENDIAN */ + +/* Fix to avoid warnings when sizeof(ha_rows) == sizeof(long) */ + +#ifdef BIG_TABLES +#define mi_rowstore(T,A) mi_int8store(T, A) +#define mi_rowkorr(T) mi_uint8korr(T) +#else +#define mi_rowstore(T,A) { mi_int4store(T, 0);\ + mi_int4store(((uchar*) (T) + 4), A); } +#define mi_rowkorr(T) mi_uint4korr((const uchar*) (T) + 4) +#endif + +#if SIZEOF_OFF_T > 4 +#define mi_sizestore(T,A) mi_int8store(T, A) +#define mi_sizekorr(T) mi_uint8korr(T) +#else +#define mi_sizestore(T,A) { if ((A) == HA_OFFSET_ERROR)\ + bfill((char*) (T), 8, 255);\ + else { mi_int4store((T), 0);\ + mi_int4store(((T) + 4), A); }} +#define mi_sizekorr(T) mi_uint4korr((const uchar*) (T) + 4) +#endif diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/mysql.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/mysql.h new file mode 100644 index 0000000..88333c4 --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/mysql.h @@ -0,0 +1,755 @@ +/* Copyright (C) 2000-2003 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* + This file defines the client API to MySQL and also the ABI of the + dynamically linked libmysqlclient. + + The ABI should never be changed in a released product of MySQL + thus you need to take great care when changing the file. In case + the file is changed so the ABI is broken, you must also + update the SHAREDLIB_MAJOR_VERSION in configure.in . + +*/ + +#ifndef _mysql_h +#define _mysql_h + +#ifdef _AIX /* large-file support will break without this */ +#include +#endif + +#ifdef __CYGWIN__ /* CYGWIN implements a UNIX API */ +#undef WIN +#undef _WIN +#undef _WIN32 +#undef _WIN64 +#undef __WIN__ +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef _global_h /* If not standard header */ +#include +#ifdef __LCC__ +#include /* For windows */ +#endif +typedef char my_bool; +#if (defined(_WIN32) || defined(_WIN64)) && !defined(__WIN__) +#define __WIN__ +#endif +#if !defined(__WIN__) +#define STDCALL +#else +#define STDCALL __stdcall +#endif + +#ifndef my_socket_defined +#ifdef __WIN__ +#define my_socket SOCKET +#else +typedef int my_socket; +#endif /* __WIN__ */ +#endif /* my_socket_defined */ +#endif /* _global_h */ + +#include "mysql_version.h" +#include "mysql_com.h" +#include "mysql_time.h" + +#include "my_list.h" /* for LISTs used in 'MYSQL' and 'MYSQL_STMT' */ + +extern unsigned int mysql_port; +extern char *mysql_unix_port; + +#define CLIENT_NET_READ_TIMEOUT 365*24*3600 /* Timeout on read */ +#define CLIENT_NET_WRITE_TIMEOUT 365*24*3600 /* Timeout on write */ + +#ifdef __NETWARE__ +#pragma pack(push, 8) /* 8 byte alignment */ +#endif + +#define IS_PRI_KEY(n) ((n) & PRI_KEY_FLAG) +#define IS_NOT_NULL(n) ((n) & NOT_NULL_FLAG) +#define IS_BLOB(n) ((n) & BLOB_FLAG) +#define IS_NUM(t) ((t) <= MYSQL_TYPE_INT24 || (t) == MYSQL_TYPE_YEAR || (t) == MYSQL_TYPE_NEWDECIMAL) +#define IS_NUM_FIELD(f) ((f)->flags & NUM_FLAG) +#define INTERNAL_NUM_FIELD(f) (((f)->type <= MYSQL_TYPE_INT24 && ((f)->type != MYSQL_TYPE_TIMESTAMP || (f)->length == 14 || (f)->length == 8)) || (f)->type == MYSQL_TYPE_YEAR) +#define IS_LONGDATA(t) ((t) >= MYSQL_TYPE_TINY_BLOB && (t) <= MYSQL_TYPE_STRING) + + +typedef struct st_mysql_field { + char *name; /* Name of column */ + char *org_name; /* Original column name, if an alias */ + char *table; /* Table of column if column was a field */ + char *org_table; /* Org table name, if table was an alias */ + char *db; /* Database for table */ + char *catalog; /* Catalog for table */ + char *def; /* Default value (set by mysql_list_fields) */ + unsigned long length; /* Width of column (create length) */ + unsigned long max_length; /* Max width for selected set */ + unsigned int name_length; + unsigned int org_name_length; + unsigned int table_length; + unsigned int org_table_length; + unsigned int db_length; + unsigned int catalog_length; + unsigned int def_length; + unsigned int flags; /* Div flags */ + unsigned int decimals; /* Number of decimals in field */ + unsigned int charsetnr; /* Character set */ + enum enum_field_types type; /* Type of field. See mysql_com.h for types */ + void *extension; +} MYSQL_FIELD; + +typedef char **MYSQL_ROW; /* return data as array of strings */ +typedef unsigned int MYSQL_FIELD_OFFSET; /* offset to current field */ + +#ifndef _global_h +#if defined(NO_CLIENT_LONG_LONG) +typedef unsigned long my_ulonglong; +#elif defined (__WIN__) +typedef unsigned __int64 my_ulonglong; +#else +typedef unsigned long long my_ulonglong; +#endif +#endif + +#include "typelib.h" + +#define MYSQL_COUNT_ERROR (~(my_ulonglong) 0) + +/* backward compatibility define - to be removed eventually */ +#define ER_WARN_DATA_TRUNCATED WARN_DATA_TRUNCATED + +typedef struct st_mysql_rows { + struct st_mysql_rows *next; /* list of rows */ + MYSQL_ROW data; + unsigned long length; +} MYSQL_ROWS; + +typedef MYSQL_ROWS *MYSQL_ROW_OFFSET; /* offset to current row */ + +#include "my_alloc.h" + +typedef struct embedded_query_result EMBEDDED_QUERY_RESULT; +typedef struct st_mysql_data { + MYSQL_ROWS *data; + struct embedded_query_result *embedded_info; + MEM_ROOT alloc; + my_ulonglong rows; + unsigned int fields; + /* extra info for embedded library */ + void *extension; +} MYSQL_DATA; + +enum mysql_option +{ + MYSQL_OPT_CONNECT_TIMEOUT, MYSQL_OPT_COMPRESS, MYSQL_OPT_NAMED_PIPE, + MYSQL_INIT_COMMAND, MYSQL_READ_DEFAULT_FILE, MYSQL_READ_DEFAULT_GROUP, + MYSQL_SET_CHARSET_DIR, MYSQL_SET_CHARSET_NAME, MYSQL_OPT_LOCAL_INFILE, + MYSQL_OPT_PROTOCOL, MYSQL_SHARED_MEMORY_BASE_NAME, MYSQL_OPT_READ_TIMEOUT, + MYSQL_OPT_WRITE_TIMEOUT, MYSQL_OPT_USE_RESULT, + MYSQL_OPT_USE_REMOTE_CONNECTION, MYSQL_OPT_USE_EMBEDDED_CONNECTION, + MYSQL_OPT_GUESS_CONNECTION, MYSQL_SET_CLIENT_IP, MYSQL_SECURE_AUTH, + MYSQL_REPORT_DATA_TRUNCATION, MYSQL_OPT_RECONNECT, + MYSQL_OPT_SSL_VERIFY_SERVER_CERT +}; + +struct st_mysql_options { + unsigned int connect_timeout, read_timeout, write_timeout; + unsigned int port, protocol; + unsigned long client_flag; + char *host,*user,*password,*unix_socket,*db; + struct st_dynamic_array *init_commands; + char *my_cnf_file,*my_cnf_group, *charset_dir, *charset_name; + char *ssl_key; /* PEM key file */ + char *ssl_cert; /* PEM cert file */ + char *ssl_ca; /* PEM CA file */ + char *ssl_capath; /* PEM directory of CA-s? */ + char *ssl_cipher; /* cipher to use */ + char *shared_memory_base_name; + unsigned long max_allowed_packet; + my_bool use_ssl; /* if to use SSL or not */ + my_bool compress,named_pipe; + my_bool unused1; + my_bool unused2; + my_bool unused3; + my_bool unused4; + enum mysql_option methods_to_use; + char *client_ip; + /* Refuse client connecting to server if it uses old (pre-4.1.1) protocol */ + my_bool secure_auth; + /* 0 - never report, 1 - always report (default) */ + my_bool report_data_truncation; + + /* function pointers for local infile support */ + int (*local_infile_init)(void **, const char *, void *); + int (*local_infile_read)(void *, char *, unsigned int); + void (*local_infile_end)(void *); + int (*local_infile_error)(void *, char *, unsigned int); + void *local_infile_userdata; + void *extension; +}; + +enum mysql_status +{ + MYSQL_STATUS_READY,MYSQL_STATUS_GET_RESULT,MYSQL_STATUS_USE_RESULT +}; + +enum mysql_protocol_type +{ + MYSQL_PROTOCOL_DEFAULT, MYSQL_PROTOCOL_TCP, MYSQL_PROTOCOL_SOCKET, + MYSQL_PROTOCOL_PIPE, MYSQL_PROTOCOL_MEMORY +}; + +typedef struct character_set +{ + unsigned int number; /* character set number */ + unsigned int state; /* character set state */ + const char *csname; /* collation name */ + const char *name; /* character set name */ + const char *comment; /* comment */ + const char *dir; /* character set directory */ + unsigned int mbminlen; /* min. length for multibyte strings */ + unsigned int mbmaxlen; /* max. length for multibyte strings */ +} MY_CHARSET_INFO; + +struct st_mysql_methods; +struct st_mysql_stmt; + +typedef struct st_mysql +{ + NET net; /* Communication parameters */ + unsigned char *connector_fd; /* ConnectorFd for SSL */ + char *host,*user,*passwd,*unix_socket,*server_version,*host_info; + char *info, *db; + struct charset_info_st *charset; + MYSQL_FIELD *fields; + MEM_ROOT field_alloc; + my_ulonglong affected_rows; + my_ulonglong insert_id; /* id if insert on table with NEXTNR */ + my_ulonglong extra_info; /* Not used */ + unsigned long thread_id; /* Id for connection in server */ + unsigned long packet_length; + unsigned int port; + unsigned long client_flag,server_capabilities; + unsigned int protocol_version; + unsigned int field_count; + unsigned int server_status; + unsigned int server_language; + unsigned int warning_count; + struct st_mysql_options options; + enum mysql_status status; + my_bool free_me; /* If free in mysql_close */ + my_bool reconnect; /* set to 1 if automatic reconnect */ + + /* session-wide random string */ + char scramble[SCRAMBLE_LENGTH+1]; + my_bool unused1; + void *unused2, *unused3, *unused4, *unused5; + + LIST *stmts; /* list of all statements */ + const struct st_mysql_methods *methods; + void *thd; + /* + Points to boolean flag in MYSQL_RES or MYSQL_STMT. We set this flag + from mysql_stmt_close if close had to cancel result set of this object. + */ + my_bool *unbuffered_fetch_owner; + /* needed for embedded server - no net buffer to store the 'info' */ + char *info_buffer; + void *extension; +} MYSQL; + + +typedef struct st_mysql_res { + my_ulonglong row_count; + MYSQL_FIELD *fields; + MYSQL_DATA *data; + MYSQL_ROWS *data_cursor; + unsigned long *lengths; /* column lengths of current row */ + MYSQL *handle; /* for unbuffered reads */ + const struct st_mysql_methods *methods; + MYSQL_ROW row; /* If unbuffered read */ + MYSQL_ROW current_row; /* buffer to current row */ + MEM_ROOT field_alloc; + unsigned int field_count, current_field; + my_bool eof; /* Used by mysql_fetch_row */ + /* mysql_stmt_close() had to cancel this result */ + my_bool unbuffered_fetch_cancelled; + void *extension; +} MYSQL_RES; + + +#if !defined(MYSQL_SERVER) && !defined(MYSQL_CLIENT) +#define MYSQL_CLIENT +#endif + + +typedef struct st_mysql_parameters +{ + unsigned long *p_max_allowed_packet; + unsigned long *p_net_buffer_length; + void *extension; +} MYSQL_PARAMETERS; + +#if !defined(MYSQL_SERVER) && !defined(EMBEDDED_LIBRARY) +#define max_allowed_packet (*mysql_get_parameters()->p_max_allowed_packet) +#define net_buffer_length (*mysql_get_parameters()->p_net_buffer_length) +#endif + +/* + Set up and bring down the server; to ensure that applications will + work when linked against either the standard client library or the + embedded server library, these functions should be called. +*/ +int STDCALL mysql_server_init(int argc, char **argv, char **groups); +void STDCALL mysql_server_end(void); + +/* + mysql_server_init/end need to be called when using libmysqld or + libmysqlclient (exactly, mysql_server_init() is called by mysql_init() so + you don't need to call it explicitely; but you need to call + mysql_server_end() to free memory). The names are a bit misleading + (mysql_SERVER* to be used when using libmysqlCLIENT). So we add more general + names which suit well whether you're using libmysqld or libmysqlclient. We + intend to promote these aliases over the mysql_server* ones. +*/ +#define mysql_library_init mysql_server_init +#define mysql_library_end mysql_server_end + +MYSQL_PARAMETERS *STDCALL mysql_get_parameters(void); + +/* + Set up and bring down a thread; these function should be called + for each thread in an application which opens at least one MySQL + connection. All uses of the connection(s) should be between these + function calls. +*/ +my_bool STDCALL mysql_thread_init(void); +void STDCALL mysql_thread_end(void); + +/* + Functions to get information from the MYSQL and MYSQL_RES structures + Should definitely be used if one uses shared libraries. +*/ + +my_ulonglong STDCALL mysql_num_rows(MYSQL_RES *res); +unsigned int STDCALL mysql_num_fields(MYSQL_RES *res); +my_bool STDCALL mysql_eof(MYSQL_RES *res); +MYSQL_FIELD *STDCALL mysql_fetch_field_direct(MYSQL_RES *res, + unsigned int fieldnr); +MYSQL_FIELD * STDCALL mysql_fetch_fields(MYSQL_RES *res); +MYSQL_ROW_OFFSET STDCALL mysql_row_tell(MYSQL_RES *res); +MYSQL_FIELD_OFFSET STDCALL mysql_field_tell(MYSQL_RES *res); + +unsigned int STDCALL mysql_field_count(MYSQL *mysql); +my_ulonglong STDCALL mysql_affected_rows(MYSQL *mysql); +my_ulonglong STDCALL mysql_insert_id(MYSQL *mysql); +unsigned int STDCALL mysql_errno(MYSQL *mysql); +const char * STDCALL mysql_error(MYSQL *mysql); +const char *STDCALL mysql_sqlstate(MYSQL *mysql); +unsigned int STDCALL mysql_warning_count(MYSQL *mysql); +const char * STDCALL mysql_info(MYSQL *mysql); +unsigned long STDCALL mysql_thread_id(MYSQL *mysql); +const char * STDCALL mysql_character_set_name(MYSQL *mysql); +int STDCALL mysql_set_character_set(MYSQL *mysql, const char *csname); + +MYSQL * STDCALL mysql_init(MYSQL *mysql); +my_bool STDCALL mysql_ssl_set(MYSQL *mysql, const char *key, + const char *cert, const char *ca, + const char *capath, const char *cipher); +const char * STDCALL mysql_get_ssl_cipher(MYSQL *mysql); +my_bool STDCALL mysql_change_user(MYSQL *mysql, const char *user, + const char *passwd, const char *db); +MYSQL * STDCALL mysql_real_connect(MYSQL *mysql, const char *host, + const char *user, + const char *passwd, + const char *db, + unsigned int port, + const char *unix_socket, + unsigned long clientflag); +int STDCALL mysql_select_db(MYSQL *mysql, const char *db); +int STDCALL mysql_query(MYSQL *mysql, const char *q); +int STDCALL mysql_send_query(MYSQL *mysql, const char *q, + unsigned long length); +int STDCALL mysql_real_query(MYSQL *mysql, const char *q, + unsigned long length); +MYSQL_RES * STDCALL mysql_store_result(MYSQL *mysql); +MYSQL_RES * STDCALL mysql_use_result(MYSQL *mysql); + +void STDCALL mysql_get_character_set_info(MYSQL *mysql, + MY_CHARSET_INFO *charset); + +/* local infile support */ + +#define LOCAL_INFILE_ERROR_LEN 512 + +void +mysql_set_local_infile_handler(MYSQL *mysql, + int (*local_infile_init)(void **, const char *, + void *), + int (*local_infile_read)(void *, char *, + unsigned int), + void (*local_infile_end)(void *), + int (*local_infile_error)(void *, char*, + unsigned int), + void *); + +void +mysql_set_local_infile_default(MYSQL *mysql); + +int STDCALL mysql_shutdown(MYSQL *mysql, + enum mysql_enum_shutdown_level + shutdown_level); +int STDCALL mysql_dump_debug_info(MYSQL *mysql); +int STDCALL mysql_refresh(MYSQL *mysql, + unsigned int refresh_options); +int STDCALL mysql_kill(MYSQL *mysql,unsigned long pid); +int STDCALL mysql_set_server_option(MYSQL *mysql, + enum enum_mysql_set_option + option); +int STDCALL mysql_ping(MYSQL *mysql); +const char * STDCALL mysql_stat(MYSQL *mysql); +const char * STDCALL mysql_get_server_info(MYSQL *mysql); +const char * STDCALL mysql_get_client_info(void); +unsigned long STDCALL mysql_get_client_version(void); +const char * STDCALL mysql_get_host_info(MYSQL *mysql); +unsigned long STDCALL mysql_get_server_version(MYSQL *mysql); +unsigned int STDCALL mysql_get_proto_info(MYSQL *mysql); +MYSQL_RES * STDCALL mysql_list_dbs(MYSQL *mysql,const char *wild); +MYSQL_RES * STDCALL mysql_list_tables(MYSQL *mysql,const char *wild); +MYSQL_RES * STDCALL mysql_list_processes(MYSQL *mysql); +int STDCALL mysql_options(MYSQL *mysql,enum mysql_option option, + const void *arg); +void STDCALL mysql_free_result(MYSQL_RES *result); +void STDCALL mysql_data_seek(MYSQL_RES *result, + my_ulonglong offset); +MYSQL_ROW_OFFSET STDCALL mysql_row_seek(MYSQL_RES *result, + MYSQL_ROW_OFFSET offset); +MYSQL_FIELD_OFFSET STDCALL mysql_field_seek(MYSQL_RES *result, + MYSQL_FIELD_OFFSET offset); +MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result); +unsigned long * STDCALL mysql_fetch_lengths(MYSQL_RES *result); +MYSQL_FIELD * STDCALL mysql_fetch_field(MYSQL_RES *result); +MYSQL_RES * STDCALL mysql_list_fields(MYSQL *mysql, const char *table, + const char *wild); +unsigned long STDCALL mysql_escape_string(char *to,const char *from, + unsigned long from_length); +unsigned long STDCALL mysql_hex_string(char *to,const char *from, + unsigned long from_length); +unsigned long STDCALL mysql_real_escape_string(MYSQL *mysql, + char *to,const char *from, + unsigned long length); +void STDCALL mysql_debug(const char *debug); +void STDCALL myodbc_remove_escape(MYSQL *mysql,char *name); +unsigned int STDCALL mysql_thread_safe(void); +my_bool STDCALL mysql_embedded(void); +my_bool STDCALL mysql_read_query_result(MYSQL *mysql); + + +/* + The following definitions are added for the enhanced + client-server protocol +*/ + +/* statement state */ +enum enum_mysql_stmt_state +{ + MYSQL_STMT_INIT_DONE= 1, MYSQL_STMT_PREPARE_DONE, MYSQL_STMT_EXECUTE_DONE, + MYSQL_STMT_FETCH_DONE +}; + + +/* + This structure is used to define bind information, and + internally by the client library. + Public members with their descriptions are listed below + (conventionally `On input' refers to the binds given to + mysql_stmt_bind_param, `On output' refers to the binds given + to mysql_stmt_bind_result): + + buffer_type - One of the MYSQL_* types, used to describe + the host language type of buffer. + On output: if column type is different from + buffer_type, column value is automatically converted + to buffer_type before it is stored in the buffer. + buffer - On input: points to the buffer with input data. + On output: points to the buffer capable to store + output data. + The type of memory pointed by buffer must correspond + to buffer_type. See the correspondence table in + the comment to mysql_stmt_bind_param. + + The two above members are mandatory for any kind of bind. + + buffer_length - the length of the buffer. You don't have to set + it for any fixed length buffer: float, double, + int, etc. It must be set however for variable-length + types, such as BLOBs or STRINGs. + + length - On input: in case when lengths of input values + are different for each execute, you can set this to + point at a variable containining value length. This + way the value length can be different in each execute. + If length is not NULL, buffer_length is not used. + Note, length can even point at buffer_length if + you keep bind structures around while fetching: + this way you can change buffer_length before + each execution, everything will work ok. + On output: if length is set, mysql_stmt_fetch will + write column length into it. + + is_null - On input: points to a boolean variable that should + be set to TRUE for NULL values. + This member is useful only if your data may be + NULL in some but not all cases. + If your data is never NULL, is_null should be set to 0. + If your data is always NULL, set buffer_type + to MYSQL_TYPE_NULL, and is_null will not be used. + + is_unsigned - On input: used to signify that values provided for one + of numeric types are unsigned. + On output describes signedness of the output buffer. + If, taking into account is_unsigned flag, column data + is out of range of the output buffer, data for this column + is regarded truncated. Note that this has no correspondence + to the sign of result set column, if you need to find it out + use mysql_stmt_result_metadata. + error - where to write a truncation error if it is present. + possible error value is: + 0 no truncation + 1 value is out of range or buffer is too small + + Please note that MYSQL_BIND also has internals members. +*/ + +typedef struct st_mysql_bind +{ + unsigned long *length; /* output length pointer */ + my_bool *is_null; /* Pointer to null indicator */ + void *buffer; /* buffer to get/put data */ + /* set this if you want to track data truncations happened during fetch */ + my_bool *error; + unsigned char *row_ptr; /* for the current data position */ + void (*store_param_func)(NET *net, struct st_mysql_bind *param); + void (*fetch_result)(struct st_mysql_bind *, MYSQL_FIELD *, + unsigned char **row); + void (*skip_result)(struct st_mysql_bind *, MYSQL_FIELD *, + unsigned char **row); + /* output buffer length, must be set when fetching str/binary */ + unsigned long buffer_length; + unsigned long offset; /* offset position for char/binary fetch */ + unsigned long length_value; /* Used if length is 0 */ + unsigned int param_number; /* For null count and error messages */ + unsigned int pack_length; /* Internal length for packed data */ + enum enum_field_types buffer_type; /* buffer type */ + my_bool error_value; /* used if error is 0 */ + my_bool is_unsigned; /* set if integer type is unsigned */ + my_bool long_data_used; /* If used with mysql_send_long_data */ + my_bool is_null_value; /* Used if is_null is 0 */ + void *extension; +} MYSQL_BIND; + + +/* statement handler */ +typedef struct st_mysql_stmt +{ + MEM_ROOT mem_root; /* root allocations */ + LIST list; /* list to keep track of all stmts */ + MYSQL *mysql; /* connection handle */ + MYSQL_BIND *params; /* input parameters */ + MYSQL_BIND *bind; /* output parameters */ + MYSQL_FIELD *fields; /* result set metadata */ + MYSQL_DATA result; /* cached result set */ + MYSQL_ROWS *data_cursor; /* current row in cached result */ + /* + mysql_stmt_fetch() calls this function to fetch one row (it's different + for buffered, unbuffered and cursor fetch). + */ + int (*read_row_func)(struct st_mysql_stmt *stmt, + unsigned char **row); + /* copy of mysql->affected_rows after statement execution */ + my_ulonglong affected_rows; + my_ulonglong insert_id; /* copy of mysql->insert_id */ + unsigned long stmt_id; /* Id for prepared statement */ + unsigned long flags; /* i.e. type of cursor to open */ + unsigned long prefetch_rows; /* number of rows per one COM_FETCH */ + /* + Copied from mysql->server_status after execute/fetch to know + server-side cursor status for this statement. + */ + unsigned int server_status; + unsigned int last_errno; /* error code */ + unsigned int param_count; /* input parameter count */ + unsigned int field_count; /* number of columns in result set */ + enum enum_mysql_stmt_state state; /* statement state */ + char last_error[MYSQL_ERRMSG_SIZE]; /* error message */ + char sqlstate[SQLSTATE_LENGTH+1]; + /* Types of input parameters should be sent to server */ + my_bool send_types_to_server; + my_bool bind_param_done; /* input buffers were supplied */ + unsigned char bind_result_done; /* output buffers were supplied */ + /* mysql_stmt_close() had to cancel this result */ + my_bool unbuffered_fetch_cancelled; + /* + Is set to true if we need to calculate field->max_length for + metadata fields when doing mysql_stmt_store_result. + */ + my_bool update_max_length; + void *extension; +} MYSQL_STMT; + +enum enum_stmt_attr_type +{ + /* + When doing mysql_stmt_store_result calculate max_length attribute + of statement metadata. This is to be consistent with the old API, + where this was done automatically. + In the new API we do that only by request because it slows down + mysql_stmt_store_result sufficiently. + */ + STMT_ATTR_UPDATE_MAX_LENGTH, + /* + unsigned long with combination of cursor flags (read only, for update, + etc) + */ + STMT_ATTR_CURSOR_TYPE, + /* + Amount of rows to retrieve from server per one fetch if using cursors. + Accepts unsigned long attribute in the range 1 - ulong_max + */ + STMT_ATTR_PREFETCH_ROWS +}; + + +typedef struct st_mysql_methods +{ + my_bool (*read_query_result)(MYSQL *mysql); + my_bool (*advanced_command)(MYSQL *mysql, + enum enum_server_command command, + const unsigned char *header, + unsigned long header_length, + const unsigned char *arg, + unsigned long arg_length, + my_bool skip_check, + MYSQL_STMT *stmt); + MYSQL_DATA *(*read_rows)(MYSQL *mysql,MYSQL_FIELD *mysql_fields, + unsigned int fields); + MYSQL_RES * (*use_result)(MYSQL *mysql); + void (*fetch_lengths)(unsigned long *to, + MYSQL_ROW column, unsigned int field_count); + void (*flush_use_result)(MYSQL *mysql, my_bool flush_all_results); +#if !defined(MYSQL_SERVER) || defined(EMBEDDED_LIBRARY) + MYSQL_FIELD * (*list_fields)(MYSQL *mysql); + my_bool (*read_prepare_result)(MYSQL *mysql, MYSQL_STMT *stmt); + int (*stmt_execute)(MYSQL_STMT *stmt); + int (*read_binary_rows)(MYSQL_STMT *stmt); + int (*unbuffered_fetch)(MYSQL *mysql, char **row); + void (*free_embedded_thd)(MYSQL *mysql); + const char *(*read_statistics)(MYSQL *mysql); + my_bool (*next_result)(MYSQL *mysql); + int (*read_change_user_result)(MYSQL *mysql, char *buff, const char *passwd); + int (*read_rows_from_cursor)(MYSQL_STMT *stmt); +#endif +} MYSQL_METHODS; + + +MYSQL_STMT * STDCALL mysql_stmt_init(MYSQL *mysql); +int STDCALL mysql_stmt_prepare(MYSQL_STMT *stmt, const char *query, + unsigned long length); +int STDCALL mysql_stmt_execute(MYSQL_STMT *stmt); +int STDCALL mysql_stmt_fetch(MYSQL_STMT *stmt); +int STDCALL mysql_stmt_fetch_column(MYSQL_STMT *stmt, MYSQL_BIND *bind_arg, + unsigned int column, + unsigned long offset); +int STDCALL mysql_stmt_store_result(MYSQL_STMT *stmt); +unsigned long STDCALL mysql_stmt_param_count(MYSQL_STMT * stmt); +my_bool STDCALL mysql_stmt_attr_set(MYSQL_STMT *stmt, + enum enum_stmt_attr_type attr_type, + const void *attr); +my_bool STDCALL mysql_stmt_attr_get(MYSQL_STMT *stmt, + enum enum_stmt_attr_type attr_type, + void *attr); +my_bool STDCALL mysql_stmt_bind_param(MYSQL_STMT * stmt, MYSQL_BIND * bnd); +my_bool STDCALL mysql_stmt_bind_result(MYSQL_STMT * stmt, MYSQL_BIND * bnd); +my_bool STDCALL mysql_stmt_close(MYSQL_STMT * stmt); +my_bool STDCALL mysql_stmt_reset(MYSQL_STMT * stmt); +my_bool STDCALL mysql_stmt_free_result(MYSQL_STMT *stmt); +my_bool STDCALL mysql_stmt_send_long_data(MYSQL_STMT *stmt, + unsigned int param_number, + const char *data, + unsigned long length); +MYSQL_RES *STDCALL mysql_stmt_result_metadata(MYSQL_STMT *stmt); +MYSQL_RES *STDCALL mysql_stmt_param_metadata(MYSQL_STMT *stmt); +unsigned int STDCALL mysql_stmt_errno(MYSQL_STMT * stmt); +const char *STDCALL mysql_stmt_error(MYSQL_STMT * stmt); +const char *STDCALL mysql_stmt_sqlstate(MYSQL_STMT * stmt); +MYSQL_ROW_OFFSET STDCALL mysql_stmt_row_seek(MYSQL_STMT *stmt, + MYSQL_ROW_OFFSET offset); +MYSQL_ROW_OFFSET STDCALL mysql_stmt_row_tell(MYSQL_STMT *stmt); +void STDCALL mysql_stmt_data_seek(MYSQL_STMT *stmt, my_ulonglong offset); +my_ulonglong STDCALL mysql_stmt_num_rows(MYSQL_STMT *stmt); +my_ulonglong STDCALL mysql_stmt_affected_rows(MYSQL_STMT *stmt); +my_ulonglong STDCALL mysql_stmt_insert_id(MYSQL_STMT *stmt); +unsigned int STDCALL mysql_stmt_field_count(MYSQL_STMT *stmt); + +my_bool STDCALL mysql_commit(MYSQL * mysql); +my_bool STDCALL mysql_rollback(MYSQL * mysql); +my_bool STDCALL mysql_autocommit(MYSQL * mysql, my_bool auto_mode); +my_bool STDCALL mysql_more_results(MYSQL *mysql); +int STDCALL mysql_next_result(MYSQL *mysql); +int STDCALL mysql_stmt_next_result(MYSQL_STMT *stmt); +void STDCALL mysql_close(MYSQL *sock); + + +/* status return codes */ +#define MYSQL_NO_DATA 100 +#define MYSQL_DATA_TRUNCATED 101 + +#define mysql_reload(mysql) mysql_refresh((mysql),REFRESH_GRANT) + +#ifdef USE_OLD_FUNCTIONS +MYSQL * STDCALL mysql_connect(MYSQL *mysql, const char *host, + const char *user, const char *passwd); +int STDCALL mysql_create_db(MYSQL *mysql, const char *DB); +int STDCALL mysql_drop_db(MYSQL *mysql, const char *DB); +#endif +#define HAVE_MYSQL_REAL_CONNECT + +/* + The following functions are mainly exported because of mysqlbinlog; + They are not for general usage +*/ + +#define simple_command(mysql, command, arg, length, skip_check) \ + (*(mysql)->methods->advanced_command)(mysql, command, 0, \ + 0, arg, length, skip_check, NULL) +#define stmt_command(mysql, command, arg, length, stmt) \ + (*(mysql)->methods->advanced_command)(mysql, command, 0, \ + 0, arg, length, 1, stmt) + +#ifdef __NETWARE__ +#pragma pack(pop) /* restore alignment */ +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* _mysql_h */ diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/mysql.h.pp b/hdssd/external/linux/mysql-connector-c-6.0.2/include/mysql.h.pp new file mode 100644 index 0000000..a8d854b --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/mysql.h.pp @@ -0,0 +1,617 @@ +#include +typedef char my_bool; +typedef int my_socket; +#include "mysql_version.h" +#include "mysql_com.h" +enum enum_server_command +{ + COM_SLEEP, 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, COM_DELAYED_INSERT, COM_CHANGE_USER, COM_BINLOG_DUMP, + COM_TABLE_DUMP, COM_CONNECT_OUT, COM_REGISTER_SLAVE, + COM_STMT_PREPARE, COM_STMT_EXECUTE, COM_STMT_SEND_LONG_DATA, COM_STMT_CLOSE, + COM_STMT_RESET, COM_SET_OPTION, COM_STMT_FETCH, COM_DAEMON, + COM_END +}; +struct st_vio; +typedef struct st_vio Vio; +typedef struct st_net { + Vio *vio; + unsigned char *buff,*buff_end,*write_pos,*read_pos; + my_socket fd; + unsigned long remain_in_buf,length, buf_length, where_b; + unsigned long max_packet,max_packet_size; + unsigned int pkt_nr,compress_pkt_nr; + unsigned int write_timeout, read_timeout, retry_count; + int fcntl; + unsigned int *return_status; + unsigned char reading_or_writing; + char save_char; + my_bool unused1; + my_bool unused2; + my_bool compress; + my_bool unused3; + unsigned char *unused; + unsigned int last_errno; + unsigned char error; + my_bool unused4; + my_bool unused5; + char last_error[512]; + char sqlstate[5 +1]; + void *extension; +} NET; +enum enum_field_types { MYSQL_TYPE_DECIMAL, MYSQL_TYPE_TINY, + MYSQL_TYPE_SHORT, MYSQL_TYPE_LONG, + MYSQL_TYPE_FLOAT, MYSQL_TYPE_DOUBLE, + MYSQL_TYPE_NULL, MYSQL_TYPE_TIMESTAMP, + MYSQL_TYPE_LONGLONG,MYSQL_TYPE_INT24, + MYSQL_TYPE_DATE, MYSQL_TYPE_TIME, + MYSQL_TYPE_DATETIME, MYSQL_TYPE_YEAR, + MYSQL_TYPE_NEWDATE, MYSQL_TYPE_VARCHAR, + MYSQL_TYPE_BIT, + MYSQL_TYPE_NEWDECIMAL=246, + MYSQL_TYPE_ENUM=247, + MYSQL_TYPE_SET=248, + MYSQL_TYPE_TINY_BLOB=249, + MYSQL_TYPE_MEDIUM_BLOB=250, + MYSQL_TYPE_LONG_BLOB=251, + MYSQL_TYPE_BLOB=252, + MYSQL_TYPE_VAR_STRING=253, + MYSQL_TYPE_STRING=254, + MYSQL_TYPE_GEOMETRY=255, + MAX_NO_FIELD_TYPES +}; +enum mysql_enum_shutdown_level { + SHUTDOWN_DEFAULT = 0, + SHUTDOWN_WAIT_CONNECTIONS= (unsigned char)(1 << 0), + SHUTDOWN_WAIT_TRANSACTIONS= (unsigned char)(1 << 1), + SHUTDOWN_WAIT_UPDATES= (unsigned char)(1 << 3), + SHUTDOWN_WAIT_ALL_BUFFERS= ((unsigned char)(1 << 3) << 1), + SHUTDOWN_WAIT_CRITICAL_BUFFERS= ((unsigned char)(1 << 3) << 1) + 1, + KILL_QUERY= 254, + KILL_CONNECTION= 255 +}; +enum enum_cursor_type +{ + CURSOR_TYPE_NO_CURSOR= 0, + CURSOR_TYPE_READ_ONLY= 1, + CURSOR_TYPE_FOR_UPDATE= 2, + CURSOR_TYPE_SCROLLABLE= 4 +}; +enum enum_mysql_set_option +{ + MYSQL_OPTION_MULTI_STATEMENTS_ON, + MYSQL_OPTION_MULTI_STATEMENTS_OFF +}; +my_bool my_net_init(NET *net, Vio* vio); +void my_net_local_init(NET *net); +void net_end(NET *net); + void net_clear(NET *net, my_bool clear_buffer); +my_bool net_realloc(NET *net, size_t length); +my_bool net_flush(NET *net); +my_bool my_net_write(NET *net,const unsigned char *packet, size_t len); +my_bool net_write_command(NET *net,unsigned char command, + const unsigned char *header, size_t head_len, + const unsigned char *packet, size_t len); +int net_real_write(NET *net,const unsigned char *packet, size_t len); +unsigned long my_net_read(NET *net); +struct sockaddr; +int my_connect(my_socket s, const struct sockaddr *name, unsigned int namelen, + unsigned int timeout); +struct my_rnd_struct; +enum Item_result +{ + STRING_RESULT=0, REAL_RESULT, INT_RESULT, ROW_RESULT, DECIMAL_RESULT +}; +typedef struct st_udf_args +{ + unsigned int arg_count; + enum Item_result *arg_type; + char **args; + unsigned long *lengths; + char *maybe_null; + char **attributes; + unsigned long *attribute_lengths; + void *extension; +} UDF_ARGS; +typedef struct st_udf_init +{ + my_bool maybe_null; + unsigned int decimals; + unsigned long max_length; + char *ptr; + my_bool const_item; + void *extension; +} UDF_INIT; +void create_random_string(char *to, unsigned int length, + struct my_rnd_struct *rand_st); +void hash_password(unsigned long *to, const char *password, unsigned int password_len); +void make_scrambled_password_323(char *to, const char *password); +void scramble_323(char *to, const char *message, const char *password); +my_bool check_scramble_323(const char *, const char *message, + unsigned long *salt); +void get_salt_from_password_323(unsigned long *res, const char *password); +void make_password_from_salt_323(char *to, const unsigned long *salt); +void make_scrambled_password(char *to, const char *password); +void scramble(char *to, const char *message, const char *password); +my_bool check_scramble(const char *reply, const char *message, + const unsigned char *hash_stage2); +void get_salt_from_password(unsigned char *res, const char *password); +void make_password_from_salt(char *to, const unsigned char *hash_stage2); +char *octet2hex(char *to, const char *str, unsigned int len); +char *get_tty_password(const char *opt_message); +const char *mysql_errno_to_sqlstate(unsigned int mysql_errno); +my_bool my_thread_init(void); +void my_thread_end(void); +#include "mysql_time.h" +enum enum_mysql_timestamp_type +{ + MYSQL_TIMESTAMP_NONE= -2, MYSQL_TIMESTAMP_ERROR= -1, + MYSQL_TIMESTAMP_DATE= 0, MYSQL_TIMESTAMP_DATETIME= 1, MYSQL_TIMESTAMP_TIME= 2 +}; +typedef struct st_mysql_time +{ + unsigned int year, month, day, hour, minute, second; + unsigned long second_part; + my_bool neg; + enum enum_mysql_timestamp_type time_type; +} MYSQL_TIME; +#include "my_list.h" +typedef struct st_list { + struct st_list *prev,*next; + void *data; +} LIST; +typedef int (*list_walk_action)(void *,void *); +extern LIST *list_add(LIST *root,LIST *element); +extern LIST *list_delete(LIST *root,LIST *element); +extern LIST *list_cons(void *data,LIST *root); +extern LIST *list_reverse(LIST *root); +extern void list_free(LIST *root,unsigned int free_data); +extern unsigned int list_length(LIST *); +extern int list_walk(LIST *,list_walk_action action,unsigned char * argument); +extern unsigned int mysql_port; +extern char *mysql_unix_port; +typedef struct st_mysql_field { + char *name; + char *org_name; + char *table; + char *org_table; + char *db; + char *catalog; + char *def; + unsigned long length; + unsigned long max_length; + unsigned int name_length; + unsigned int org_name_length; + unsigned int table_length; + unsigned int org_table_length; + unsigned int db_length; + unsigned int catalog_length; + unsigned int def_length; + unsigned int flags; + unsigned int decimals; + unsigned int charsetnr; + enum enum_field_types type; + void *extension; +} MYSQL_FIELD; +typedef char **MYSQL_ROW; +typedef unsigned int MYSQL_FIELD_OFFSET; +typedef unsigned long long my_ulonglong; +#include "typelib.h" +#include "my_alloc.h" +typedef struct st_used_mem +{ + struct st_used_mem *next; + size_t left; + size_t size; +} USED_MEM; +typedef struct st_mem_root +{ + USED_MEM *free; + USED_MEM *used; + USED_MEM *pre_alloc; + size_t min_malloc; + size_t block_size; + unsigned int block_num; + unsigned int first_block_usage; + void (*error_handler)(void); +} MEM_ROOT; +typedef struct st_typelib { + unsigned int count; + const char *name; + const char **type_names; + unsigned int *type_lengths; +} TYPELIB; +extern my_ulonglong find_typeset(char *x, TYPELIB *typelib,int *error_position); +extern int find_type_or_exit(const char *x, TYPELIB *typelib, + const char *option); +extern int find_type(char *x, const TYPELIB *typelib, unsigned int full_name); +extern void make_type(char *to,unsigned int nr,TYPELIB *typelib); +extern const char *get_type(TYPELIB *typelib,unsigned int nr); +extern TYPELIB *copy_typelib(MEM_ROOT *root, TYPELIB *from); +extern TYPELIB sql_protocol_typelib; +typedef struct st_mysql_rows { + struct st_mysql_rows *next; + MYSQL_ROW data; + unsigned long length; +} MYSQL_ROWS; +typedef MYSQL_ROWS *MYSQL_ROW_OFFSET; +#include "my_alloc.h" +typedef struct embedded_query_result EMBEDDED_QUERY_RESULT; +typedef struct st_mysql_data { + MYSQL_ROWS *data; + struct embedded_query_result *embedded_info; + MEM_ROOT alloc; + my_ulonglong rows; + unsigned int fields; + void *extension; +} MYSQL_DATA; +enum mysql_option +{ + MYSQL_OPT_CONNECT_TIMEOUT, MYSQL_OPT_COMPRESS, MYSQL_OPT_NAMED_PIPE, + MYSQL_INIT_COMMAND, MYSQL_READ_DEFAULT_FILE, MYSQL_READ_DEFAULT_GROUP, + MYSQL_SET_CHARSET_DIR, MYSQL_SET_CHARSET_NAME, MYSQL_OPT_LOCAL_INFILE, + MYSQL_OPT_PROTOCOL, MYSQL_SHARED_MEMORY_BASE_NAME, MYSQL_OPT_READ_TIMEOUT, + MYSQL_OPT_WRITE_TIMEOUT, MYSQL_OPT_USE_RESULT, + MYSQL_OPT_USE_REMOTE_CONNECTION, MYSQL_OPT_USE_EMBEDDED_CONNECTION, + MYSQL_OPT_GUESS_CONNECTION, MYSQL_SET_CLIENT_IP, MYSQL_SECURE_AUTH, + MYSQL_REPORT_DATA_TRUNCATION, MYSQL_OPT_RECONNECT, + MYSQL_OPT_SSL_VERIFY_SERVER_CERT +}; +struct st_mysql_options { + unsigned int connect_timeout, read_timeout, write_timeout; + unsigned int port, protocol; + unsigned long client_flag; + char *host,*user,*password,*unix_socket,*db; + struct st_dynamic_array *init_commands; + char *my_cnf_file,*my_cnf_group, *charset_dir, *charset_name; + char *ssl_key; + char *ssl_cert; + char *ssl_ca; + char *ssl_capath; + char *ssl_cipher; + char *shared_memory_base_name; + unsigned long max_allowed_packet; + my_bool use_ssl; + my_bool compress,named_pipe; + my_bool unused1; + my_bool unused2; + my_bool unused3; + my_bool unused4; + enum mysql_option methods_to_use; + char *client_ip; + my_bool secure_auth; + my_bool report_data_truncation; + int (*local_infile_init)(void **, const char *, void *); + int (*local_infile_read)(void *, char *, unsigned int); + void (*local_infile_end)(void *); + int (*local_infile_error)(void *, char *, unsigned int); + void *local_infile_userdata; + void *extension; +}; +enum mysql_status +{ + MYSQL_STATUS_READY,MYSQL_STATUS_GET_RESULT,MYSQL_STATUS_USE_RESULT +}; +enum mysql_protocol_type +{ + MYSQL_PROTOCOL_DEFAULT, MYSQL_PROTOCOL_TCP, MYSQL_PROTOCOL_SOCKET, + MYSQL_PROTOCOL_PIPE, MYSQL_PROTOCOL_MEMORY +}; +typedef struct character_set +{ + unsigned int number; + unsigned int state; + const char *csname; + const char *name; + const char *comment; + const char *dir; + unsigned int mbminlen; + unsigned int mbmaxlen; +} MY_CHARSET_INFO; +struct st_mysql_methods; +struct st_mysql_stmt; +typedef struct st_mysql +{ + NET net; + unsigned char *connector_fd; + char *host,*user,*passwd,*unix_socket,*server_version,*host_info; + char *info, *db; + struct charset_info_st *charset; + MYSQL_FIELD *fields; + MEM_ROOT field_alloc; + my_ulonglong affected_rows; + my_ulonglong insert_id; + my_ulonglong extra_info; + unsigned long thread_id; + unsigned long packet_length; + unsigned int port; + unsigned long client_flag,server_capabilities; + unsigned int protocol_version; + unsigned int field_count; + unsigned int server_status; + unsigned int server_language; + unsigned int warning_count; + struct st_mysql_options options; + enum mysql_status status; + my_bool free_me; + my_bool reconnect; + char scramble[20 +1]; + my_bool unused1; + void *unused2, *unused3, *unused4, *unused5; + LIST *stmts; + const struct st_mysql_methods *methods; + void *thd; + my_bool *unbuffered_fetch_owner; + char *info_buffer; + void *extension; +} MYSQL; +typedef struct st_mysql_res { + my_ulonglong row_count; + MYSQL_FIELD *fields; + MYSQL_DATA *data; + MYSQL_ROWS *data_cursor; + unsigned long *lengths; + MYSQL *handle; + const struct st_mysql_methods *methods; + MYSQL_ROW row; + MYSQL_ROW current_row; + MEM_ROOT field_alloc; + unsigned int field_count, current_field; + my_bool eof; + my_bool unbuffered_fetch_cancelled; + void *extension; +} MYSQL_RES; +typedef struct st_mysql_parameters +{ + unsigned long *p_max_allowed_packet; + unsigned long *p_net_buffer_length; + void *extension; +} MYSQL_PARAMETERS; +int mysql_server_init(int argc, char **argv, char **groups); +void mysql_server_end(void); +MYSQL_PARAMETERS * mysql_get_parameters(void); +my_bool mysql_thread_init(void); +void mysql_thread_end(void); +my_ulonglong mysql_num_rows(MYSQL_RES *res); +unsigned int mysql_num_fields(MYSQL_RES *res); +my_bool mysql_eof(MYSQL_RES *res); +MYSQL_FIELD * mysql_fetch_field_direct(MYSQL_RES *res, + unsigned int fieldnr); +MYSQL_FIELD * mysql_fetch_fields(MYSQL_RES *res); +MYSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES *res); +MYSQL_FIELD_OFFSET mysql_field_tell(MYSQL_RES *res); +unsigned int mysql_field_count(MYSQL *mysql); +my_ulonglong mysql_affected_rows(MYSQL *mysql); +my_ulonglong mysql_insert_id(MYSQL *mysql); +unsigned int mysql_errno(MYSQL *mysql); +const char * mysql_error(MYSQL *mysql); +const char * mysql_sqlstate(MYSQL *mysql); +unsigned int mysql_warning_count(MYSQL *mysql); +const char * mysql_info(MYSQL *mysql); +unsigned long mysql_thread_id(MYSQL *mysql); +const char * mysql_character_set_name(MYSQL *mysql); +int mysql_set_character_set(MYSQL *mysql, const char *csname); +MYSQL * mysql_init(MYSQL *mysql); +my_bool mysql_ssl_set(MYSQL *mysql, const char *key, + const char *cert, const char *ca, + const char *capath, const char *cipher); +const char * mysql_get_ssl_cipher(MYSQL *mysql); +my_bool mysql_change_user(MYSQL *mysql, const char *user, + const char *passwd, const char *db); +MYSQL * mysql_real_connect(MYSQL *mysql, const char *host, + const char *user, + const char *passwd, + const char *db, + unsigned int port, + const char *unix_socket, + unsigned long clientflag); +int mysql_select_db(MYSQL *mysql, const char *db); +int mysql_query(MYSQL *mysql, const char *q); +int mysql_send_query(MYSQL *mysql, const char *q, + unsigned long length); +int mysql_real_query(MYSQL *mysql, const char *q, + unsigned long length); +MYSQL_RES * mysql_store_result(MYSQL *mysql); +MYSQL_RES * mysql_use_result(MYSQL *mysql); +void mysql_get_character_set_info(MYSQL *mysql, + MY_CHARSET_INFO *charset); +void +mysql_set_local_infile_handler(MYSQL *mysql, + int (*local_infile_init)(void **, const char *, + void *), + int (*local_infile_read)(void *, char *, + unsigned int), + void (*local_infile_end)(void *), + int (*local_infile_error)(void *, char*, + unsigned int), + void *); +void +mysql_set_local_infile_default(MYSQL *mysql); +int mysql_shutdown(MYSQL *mysql, + enum mysql_enum_shutdown_level + shutdown_level); +int mysql_dump_debug_info(MYSQL *mysql); +int mysql_refresh(MYSQL *mysql, + unsigned int refresh_options); +int mysql_kill(MYSQL *mysql,unsigned long pid); +int mysql_set_server_option(MYSQL *mysql, + enum enum_mysql_set_option + option); +int mysql_ping(MYSQL *mysql); +const char * mysql_stat(MYSQL *mysql); +const char * mysql_get_server_info(MYSQL *mysql); +const char * mysql_get_client_info(void); +unsigned long mysql_get_client_version(void); +const char * mysql_get_host_info(MYSQL *mysql); +unsigned long mysql_get_server_version(MYSQL *mysql); +unsigned int mysql_get_proto_info(MYSQL *mysql); +MYSQL_RES * mysql_list_dbs(MYSQL *mysql,const char *wild); +MYSQL_RES * mysql_list_tables(MYSQL *mysql,const char *wild); +MYSQL_RES * mysql_list_processes(MYSQL *mysql); +int mysql_options(MYSQL *mysql,enum mysql_option option, + const void *arg); +void mysql_free_result(MYSQL_RES *result); +void mysql_data_seek(MYSQL_RES *result, + my_ulonglong offset); +MYSQL_ROW_OFFSET mysql_row_seek(MYSQL_RES *result, + MYSQL_ROW_OFFSET offset); +MYSQL_FIELD_OFFSET mysql_field_seek(MYSQL_RES *result, + MYSQL_FIELD_OFFSET offset); +MYSQL_ROW mysql_fetch_row(MYSQL_RES *result); +unsigned long * mysql_fetch_lengths(MYSQL_RES *result); +MYSQL_FIELD * mysql_fetch_field(MYSQL_RES *result); +MYSQL_RES * mysql_list_fields(MYSQL *mysql, const char *table, + const char *wild); +unsigned long mysql_escape_string(char *to,const char *from, + unsigned long from_length); +unsigned long mysql_hex_string(char *to,const char *from, + unsigned long from_length); +unsigned long mysql_real_escape_string(MYSQL *mysql, + char *to,const char *from, + unsigned long length); +void mysql_debug(const char *debug); +void myodbc_remove_escape(MYSQL *mysql,char *name); +unsigned int mysql_thread_safe(void); +my_bool mysql_embedded(void); +my_bool mysql_read_query_result(MYSQL *mysql); +enum enum_mysql_stmt_state +{ + MYSQL_STMT_INIT_DONE= 1, MYSQL_STMT_PREPARE_DONE, MYSQL_STMT_EXECUTE_DONE, + MYSQL_STMT_FETCH_DONE +}; +typedef struct st_mysql_bind +{ + unsigned long *length; + my_bool *is_null; + void *buffer; + my_bool *error; + unsigned char *row_ptr; + void (*store_param_func)(NET *net, struct st_mysql_bind *param); + void (*fetch_result)(struct st_mysql_bind *, MYSQL_FIELD *, + unsigned char **row); + void (*skip_result)(struct st_mysql_bind *, MYSQL_FIELD *, + unsigned char **row); + unsigned long buffer_length; + unsigned long offset; + unsigned long length_value; + unsigned int param_number; + unsigned int pack_length; + enum enum_field_types buffer_type; + my_bool error_value; + my_bool is_unsigned; + my_bool long_data_used; + my_bool is_null_value; + void *extension; +} MYSQL_BIND; +typedef struct st_mysql_stmt +{ + MEM_ROOT mem_root; + LIST list; + MYSQL *mysql; + MYSQL_BIND *params; + MYSQL_BIND *bind; + MYSQL_FIELD *fields; + MYSQL_DATA result; + MYSQL_ROWS *data_cursor; + int (*read_row_func)(struct st_mysql_stmt *stmt, + unsigned char **row); + my_ulonglong affected_rows; + my_ulonglong insert_id; + unsigned long stmt_id; + unsigned long flags; + unsigned long prefetch_rows; + unsigned int server_status; + unsigned int last_errno; + unsigned int param_count; + unsigned int field_count; + enum enum_mysql_stmt_state state; + char last_error[512]; + char sqlstate[5 +1]; + my_bool send_types_to_server; + my_bool bind_param_done; + unsigned char bind_result_done; + my_bool unbuffered_fetch_cancelled; + my_bool update_max_length; + void *extension; +} MYSQL_STMT; +enum enum_stmt_attr_type +{ + STMT_ATTR_UPDATE_MAX_LENGTH, + STMT_ATTR_CURSOR_TYPE, + STMT_ATTR_PREFETCH_ROWS +}; +typedef struct st_mysql_methods +{ + my_bool (*read_query_result)(MYSQL *mysql); + my_bool (*advanced_command)(MYSQL *mysql, + enum enum_server_command command, + const unsigned char *header, + unsigned long header_length, + const unsigned char *arg, + unsigned long arg_length, + my_bool skip_check, + MYSQL_STMT *stmt); + MYSQL_DATA *(*read_rows)(MYSQL *mysql,MYSQL_FIELD *mysql_fields, + unsigned int fields); + MYSQL_RES * (*use_result)(MYSQL *mysql); + void (*fetch_lengths)(unsigned long *to, + MYSQL_ROW column, unsigned int field_count); + void (*flush_use_result)(MYSQL *mysql, my_bool flush_all_results); + MYSQL_FIELD * (*list_fields)(MYSQL *mysql); + my_bool (*read_prepare_result)(MYSQL *mysql, MYSQL_STMT *stmt); + int (*stmt_execute)(MYSQL_STMT *stmt); + int (*read_binary_rows)(MYSQL_STMT *stmt); + int (*unbuffered_fetch)(MYSQL *mysql, char **row); + void (*free_embedded_thd)(MYSQL *mysql); + const char *(*read_statistics)(MYSQL *mysql); + my_bool (*next_result)(MYSQL *mysql); + int (*read_change_user_result)(MYSQL *mysql, char *buff, const char *passwd); + int (*read_rows_from_cursor)(MYSQL_STMT *stmt); +} MYSQL_METHODS; +MYSQL_STMT * mysql_stmt_init(MYSQL *mysql); +int mysql_stmt_prepare(MYSQL_STMT *stmt, const char *query, + unsigned long length); +int mysql_stmt_execute(MYSQL_STMT *stmt); +int mysql_stmt_fetch(MYSQL_STMT *stmt); +int mysql_stmt_fetch_column(MYSQL_STMT *stmt, MYSQL_BIND *bind_arg, + unsigned int column, + unsigned long offset); +int mysql_stmt_store_result(MYSQL_STMT *stmt); +unsigned long mysql_stmt_param_count(MYSQL_STMT * stmt); +my_bool mysql_stmt_attr_set(MYSQL_STMT *stmt, + enum enum_stmt_attr_type attr_type, + const void *attr); +my_bool mysql_stmt_attr_get(MYSQL_STMT *stmt, + enum enum_stmt_attr_type attr_type, + void *attr); +my_bool mysql_stmt_bind_param(MYSQL_STMT * stmt, MYSQL_BIND * bnd); +my_bool mysql_stmt_bind_result(MYSQL_STMT * stmt, MYSQL_BIND * bnd); +my_bool mysql_stmt_close(MYSQL_STMT * stmt); +my_bool mysql_stmt_reset(MYSQL_STMT * stmt); +my_bool mysql_stmt_free_result(MYSQL_STMT *stmt); +my_bool mysql_stmt_send_long_data(MYSQL_STMT *stmt, + unsigned int param_number, + const char *data, + unsigned long length); +MYSQL_RES * mysql_stmt_result_metadata(MYSQL_STMT *stmt); +MYSQL_RES * mysql_stmt_param_metadata(MYSQL_STMT *stmt); +unsigned int mysql_stmt_errno(MYSQL_STMT * stmt); +const char * mysql_stmt_error(MYSQL_STMT * stmt); +const char * mysql_stmt_sqlstate(MYSQL_STMT * stmt); +MYSQL_ROW_OFFSET mysql_stmt_row_seek(MYSQL_STMT *stmt, + MYSQL_ROW_OFFSET offset); +MYSQL_ROW_OFFSET mysql_stmt_row_tell(MYSQL_STMT *stmt); +void mysql_stmt_data_seek(MYSQL_STMT *stmt, my_ulonglong offset); +my_ulonglong mysql_stmt_num_rows(MYSQL_STMT *stmt); +my_ulonglong mysql_stmt_affected_rows(MYSQL_STMT *stmt); +my_ulonglong mysql_stmt_insert_id(MYSQL_STMT *stmt); +unsigned int mysql_stmt_field_count(MYSQL_STMT *stmt); +my_bool mysql_commit(MYSQL * mysql); +my_bool mysql_rollback(MYSQL * mysql); +my_bool mysql_autocommit(MYSQL * mysql, my_bool auto_mode); +my_bool mysql_more_results(MYSQL *mysql); +int mysql_next_result(MYSQL *mysql); +int mysql_stmt_next_result(MYSQL_STMT *stmt); +void mysql_close(MYSQL *sock); diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/mysql_com.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/mysql_com.h new file mode 100644 index 0000000..8b16fd2 --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/mysql_com.h @@ -0,0 +1,543 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* +** Common definition between mysql server & client +*/ + +#ifndef _mysql_com_h +#define _mysql_com_h + +#define HOSTNAME_LENGTH 60 +#define SYSTEM_CHARSET_MBMAXLEN 4 +#define NAME_CHAR_LEN 64 /* Field/table name length */ +#define USERNAME_CHAR_LENGTH 16 +#define NAME_LEN (NAME_CHAR_LEN*SYSTEM_CHARSET_MBMAXLEN) +#define USERNAME_LENGTH (USERNAME_CHAR_LENGTH*SYSTEM_CHARSET_MBMAXLEN) + +#define SERVER_VERSION_LENGTH 60 +#define SQLSTATE_LENGTH 5 + +/* + Maximum length of comments +*/ +#define TABLE_COMMENT_INLINE_MAXLEN 180 /* pre 6.0: 60 (3-byte) characters */ +#define TABLE_COMMENT_MAXLEN 2048 +#define COLUMN_COMMENT_MAXLEN 1024 +#define INDEX_COMMENT_MAXLEN 1024 + + +/* + USER_HOST_BUFF_SIZE -- length of string buffer, that is enough to contain + username and hostname parts of the user identifier with trailing zero in + MySQL standard format: + user_name_part@host_name_part\0 +*/ +#define USER_HOST_BUFF_SIZE HOSTNAME_LENGTH + USERNAME_LENGTH + 2 + +#define LOCAL_HOST "localhost" +#define LOCAL_HOST_NAMEDPIPE "." + + +#if defined(__WIN__) && !defined( _CUSTOMCONFIG_) +#define MYSQL_NAMEDPIPE "MySQL" +#define MYSQL_SERVICENAME "MySQL" +#endif /* __WIN__ */ + +/* + You should add new commands to the end of this list, otherwise old + servers won't be able to handle them as 'unsupported'. +*/ + +enum enum_server_command +{ + COM_SLEEP, 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, COM_DELAYED_INSERT, COM_CHANGE_USER, COM_BINLOG_DUMP, + COM_TABLE_DUMP, COM_CONNECT_OUT, COM_REGISTER_SLAVE, + COM_STMT_PREPARE, COM_STMT_EXECUTE, COM_STMT_SEND_LONG_DATA, COM_STMT_CLOSE, + COM_STMT_RESET, COM_SET_OPTION, COM_STMT_FETCH, COM_DAEMON, + /* don't forget to update const char *command_name[] in sql_parse.cc */ + + /* Must be last */ + COM_END +}; + + +/* + Length of random string sent by server on handshake; this is also length of + obfuscated password, recieved from client +*/ +#define SCRAMBLE_LENGTH 20 +#define SCRAMBLE_LENGTH_323 8 +/* length of password stored in the db: new passwords are preceeded with '*' */ +#define SCRAMBLED_PASSWORD_CHAR_LENGTH (SCRAMBLE_LENGTH*2+1) +#define SCRAMBLED_PASSWORD_CHAR_LENGTH_323 (SCRAMBLE_LENGTH_323*2) + + +#define NOT_NULL_FLAG 1 /* Field can't be NULL */ +#define PRI_KEY_FLAG 2 /* Field is part of a primary key */ +#define UNIQUE_KEY_FLAG 4 /* Field is part of a unique key */ +#define MULTIPLE_KEY_FLAG 8 /* Field is part of a key */ +#define BLOB_FLAG 16 /* Field is a blob */ +#define UNSIGNED_FLAG 32 /* Field is unsigned */ +#define ZEROFILL_FLAG 64 /* Field is zerofill */ +#define BINARY_FLAG 128 /* Field is binary */ + +/* The following are only sent to new clients */ +#define ENUM_FLAG 256 /* field is an enum */ +#define AUTO_INCREMENT_FLAG 512 /* field is a autoincrement field */ +#define TIMESTAMP_FLAG 1024 /* Field is a timestamp */ +#define SET_FLAG 2048 /* field is a set */ +#define NO_DEFAULT_VALUE_FLAG 4096 /* Field doesn't have default value */ +#define ON_UPDATE_NOW_FLAG 8192 /* Field is set to NOW on UPDATE */ +#define NUM_FLAG 32768 /* Field is num (for clients) */ +#define PART_KEY_FLAG 16384 /* Intern; Part of some key */ +#define GROUP_FLAG 32768 /* Intern: Group field */ +#define UNIQUE_FLAG 65536 /* Intern: Used by sql_yacc */ +#define BINCMP_FLAG 131072 /* Intern: Used by sql_yacc */ +#define GET_FIXED_FIELDS_FLAG (1 << 18) /* Used to get fields in item tree */ +#define FIELD_IN_PART_FUNC_FLAG (1 << 19)/* Field part of partition func */ +#define FIELD_IN_ADD_INDEX (1<< 20) /* Intern: Field used in ADD INDEX */ +#define FIELD_IS_RENAMED (1<< 21) /* Intern: Field is being renamed */ +#define FIELD_STORAGE_FLAGS 22 /* Storage type: bit 22, 23 and 24 */ +#define COLUMN_FORMAT_FLAGS 25 /* Column format: bit 25, 26 and 27 */ + +#define REFRESH_GRANT 1 /* Refresh grant tables */ +#define REFRESH_LOG 2 /* Start on new log file */ +#define REFRESH_TABLES 4 /* close all tables */ +#define REFRESH_HOSTS 8 /* Flush host cache */ +#define REFRESH_STATUS 16 /* Flush status variables */ +#define REFRESH_THREADS 32 /* Flush thread cache */ +#define REFRESH_SLAVE 64 /* Reset master info and restart slave + thread */ +#define REFRESH_MASTER 128 /* Remove all bin logs in the index + and truncate the index */ + +/* The following can't be set with mysql_refresh() */ +#define REFRESH_READ_LOCK 16384 /* Lock tables for read */ +#define REFRESH_FAST 32768 /* Intern flag */ + +/* RESET (remove all queries) from query cache */ +#define REFRESH_QUERY_CACHE 65536 +#define REFRESH_QUERY_CACHE_FREE 0x20000L /* pack query cache */ +#define REFRESH_DES_KEY_FILE 0x40000L +#define REFRESH_USER_RESOURCES 0x80000L +#define REFRESH_BACKUP_LOG 0x200000L + +#define CLIENT_LONG_PASSWORD 1 /* new more secure passwords */ +#define CLIENT_FOUND_ROWS 2 /* Found instead of affected rows */ +#define CLIENT_LONG_FLAG 4 /* Get all column flags */ +#define CLIENT_CONNECT_WITH_DB 8 /* One can specify db on connect */ +#define CLIENT_NO_SCHEMA 16 /* Don't allow database.table.column */ +#define CLIENT_COMPRESS 32 /* Can use compression protocol */ +#define CLIENT_ODBC 64 /* Odbc client */ +#define CLIENT_LOCAL_FILES 128 /* Can use LOAD DATA LOCAL */ +#define CLIENT_IGNORE_SPACE 256 /* Ignore spaces before '(' */ +#define CLIENT_PROTOCOL_41 512 /* New 4.1 protocol */ +#define CLIENT_INTERACTIVE 1024 /* This is an interactive client */ +#define CLIENT_SSL 2048 /* Switch to SSL after handshake */ +#define CLIENT_IGNORE_SIGPIPE 4096 /* IGNORE sigpipes */ +#define CLIENT_TRANSACTIONS 8192 /* Client knows about transactions */ +#define CLIENT_RESERVED 16384 /* Old flag for 4.1 protocol */ +#define CLIENT_SECURE_CONNECTION 32768 /* New 4.1 authentication */ +#define CLIENT_MULTI_STATEMENTS (1UL << 16) /* Enable/disable multi-stmt support */ +#define CLIENT_MULTI_RESULTS (1UL << 17) /* Enable/disable multi-results */ +#define CLIENT_PS_MULTI_RESULTS (1UL << 18) /* Multi-results in PS-protocol */ + +#define CLIENT_SSL_VERIFY_SERVER_CERT (1UL << 30) +#define CLIENT_REMEMBER_OPTIONS (1UL << 31) + +/* Gather all possible capabilites (flags) supported by the server */ +#define CLIENT_ALL_FLAGS (CLIENT_LONG_PASSWORD | \ + CLIENT_FOUND_ROWS | \ + CLIENT_LONG_FLAG | \ + CLIENT_CONNECT_WITH_DB | \ + CLIENT_NO_SCHEMA | \ + CLIENT_COMPRESS | \ + CLIENT_ODBC | \ + CLIENT_LOCAL_FILES | \ + CLIENT_IGNORE_SPACE | \ + CLIENT_PROTOCOL_41 | \ + CLIENT_INTERACTIVE | \ + CLIENT_SSL | \ + CLIENT_IGNORE_SIGPIPE | \ + CLIENT_TRANSACTIONS | \ + CLIENT_RESERVED | \ + CLIENT_SECURE_CONNECTION | \ + CLIENT_MULTI_STATEMENTS | \ + CLIENT_MULTI_RESULTS | \ + CLIENT_PS_MULTI_RESULTS | \ + CLIENT_SSL_VERIFY_SERVER_CERT | \ + CLIENT_REMEMBER_OPTIONS) + +/* + Switch off the flags that are optional and depending on build flags + If any of the optional flags is supported by the build it will be switched + on before sending to the client during the connection handshake. +*/ +#define CLIENT_BASIC_FLAGS (((CLIENT_ALL_FLAGS & ~CLIENT_SSL) \ + & ~CLIENT_COMPRESS) \ + & ~CLIENT_SSL_VERIFY_SERVER_CERT) + +#define SERVER_STATUS_IN_TRANS 1 /* Transaction has started */ +#define SERVER_STATUS_AUTOCOMMIT 2 /* Server in auto_commit mode */ +#define SERVER_MORE_RESULTS_EXISTS 8 /* Multi query - next query exists */ +#define SERVER_QUERY_NO_GOOD_INDEX_USED 16 +#define SERVER_QUERY_NO_INDEX_USED 32 +/** + The server was able to fulfill the clients request and opened a + read-only non-scrollable cursor for a query. This flag comes + in reply to COM_STMT_EXECUTE and COM_STMT_FETCH commands. +*/ +#define SERVER_STATUS_CURSOR_EXISTS 64 +/** + This flag is sent when a read-only cursor is exhausted, in reply to + COM_STMT_FETCH command. +*/ +#define SERVER_STATUS_LAST_ROW_SENT 128 +#define SERVER_STATUS_DB_DROPPED 256 /* A database was dropped */ +#define SERVER_STATUS_NO_BACKSLASH_ESCAPES 512 +/** + Sent to the client if after a prepared statement reprepare + we discovered that the new statement returns a different + number of result set columns. +*/ +#define SERVER_STATUS_METADATA_CHANGED 1024 +/* + Tell clients that this query was logged to the slow query log. + Not yet set in the server, but interface is defined for applications + to use. See WorkLog 4098. +*/ +#define SERVER_QUERY_WAS_SLOW 2048 + +/** + To mark ResultSet containing output parameter values. +*/ +#define SERVER_PS_OUT_PARAMS 4096 + +/** + Server status flags that must be cleared when starting + execution of a new SQL statement. + Flags from this set are only added to the + current server status by the execution engine, but + never removed -- the execution engine expects them + to disappear automagically by the next command. +*/ +#define SERVER_STATUS_CLEAR_SET (SERVER_QUERY_NO_GOOD_INDEX_USED| \ + SERVER_QUERY_NO_INDEX_USED|\ + SERVER_MORE_RESULTS_EXISTS|\ + SERVER_STATUS_METADATA_CHANGED) + +#define MYSQL_ERRMSG_SIZE 512 +#define NET_READ_TIMEOUT 30 /* Timeout on read */ +#define NET_WRITE_TIMEOUT 60 /* Timeout on write */ +#define NET_WAIT_TIMEOUT 8*60*60 /* Wait for new query */ + +#define ONLY_KILL_QUERY 1 + + +struct st_vio; /* Only C */ +typedef struct st_vio Vio; + +#define MAX_TINYINT_WIDTH 3 /* Max width for a TINY w.o. sign */ +#define MAX_SMALLINT_WIDTH 5 /* Max width for a SHORT w.o. sign */ +#define MAX_MEDIUMINT_WIDTH 8 /* Max width for a INT24 w.o. sign */ +#define MAX_INT_WIDTH 10 /* Max width for a LONG w.o. sign */ +#define MAX_BIGINT_WIDTH 20 /* Max width for a LONGLONG */ +#define MAX_CHAR_WIDTH 255 /* Max length for a CHAR colum */ +#define MAX_BLOB_WIDTH 16777216 /* Default width for blob */ + +typedef struct st_net { +#if !defined(CHECK_EMBEDDED_DIFFERENCES) || !defined(EMBEDDED_LIBRARY) + Vio *vio; + unsigned char *buff,*buff_end,*write_pos,*read_pos; + my_socket fd; /* For Perl DBI/dbd */ + /* + The following variable is set if we are doing several queries in one + command ( as in LOAD TABLE ... FROM MASTER ), + and do not want to confuse the client with OK at the wrong time + */ + unsigned long remain_in_buf,length, buf_length, where_b; + unsigned long max_packet,max_packet_size; + unsigned int pkt_nr,compress_pkt_nr; + unsigned int write_timeout, read_timeout, retry_count; + int fcntl; + unsigned int *return_status; + unsigned char reading_or_writing; + char save_char; + my_bool unused1; /* Please remove with the next incompatible ABI change. */ + my_bool unused2; /* Please remove with the next incompatible ABI change */ + my_bool compress; + my_bool unused3; /* Please remove with the next incompatible ABI change. */ + /* + Pointer to query object in query cache, do not equal NULL (0) for + queries in cache that have not stored its results yet + */ +#endif + /* + Unused, please remove with the next incompatible ABI change. + */ + unsigned char *unused; + unsigned int last_errno; + unsigned char error; + my_bool unused4; /* Please remove with the next incompatible ABI change. */ + my_bool unused5; /* Please remove with the next incompatible ABI change. */ + /** Client library error message buffer. Actually belongs to struct MYSQL. */ + char last_error[MYSQL_ERRMSG_SIZE]; + /** Client library sqlstate buffer. Set along with the error message. */ + char sqlstate[SQLSTATE_LENGTH+1]; + void *extension; +} NET; + + +#define packet_error (~(unsigned long) 0) + +enum enum_field_types { MYSQL_TYPE_DECIMAL, MYSQL_TYPE_TINY, + MYSQL_TYPE_SHORT, MYSQL_TYPE_LONG, + MYSQL_TYPE_FLOAT, MYSQL_TYPE_DOUBLE, + MYSQL_TYPE_NULL, MYSQL_TYPE_TIMESTAMP, + MYSQL_TYPE_LONGLONG,MYSQL_TYPE_INT24, + MYSQL_TYPE_DATE, MYSQL_TYPE_TIME, + MYSQL_TYPE_DATETIME, MYSQL_TYPE_YEAR, + MYSQL_TYPE_NEWDATE, MYSQL_TYPE_VARCHAR, + MYSQL_TYPE_BIT, + MYSQL_TYPE_NEWDECIMAL=246, + MYSQL_TYPE_ENUM=247, + MYSQL_TYPE_SET=248, + MYSQL_TYPE_TINY_BLOB=249, + MYSQL_TYPE_MEDIUM_BLOB=250, + MYSQL_TYPE_LONG_BLOB=251, + MYSQL_TYPE_BLOB=252, + MYSQL_TYPE_VAR_STRING=253, + MYSQL_TYPE_STRING=254, + MYSQL_TYPE_GEOMETRY=255, + MAX_NO_FIELD_TYPES /* Should always be last */ +}; + +/* For backward compatibility */ +#define CLIENT_MULTI_QUERIES CLIENT_MULTI_STATEMENTS +#define FIELD_TYPE_DECIMAL MYSQL_TYPE_DECIMAL +#define FIELD_TYPE_NEWDECIMAL MYSQL_TYPE_NEWDECIMAL +#define FIELD_TYPE_TINY MYSQL_TYPE_TINY +#define FIELD_TYPE_SHORT MYSQL_TYPE_SHORT +#define FIELD_TYPE_LONG MYSQL_TYPE_LONG +#define FIELD_TYPE_FLOAT MYSQL_TYPE_FLOAT +#define FIELD_TYPE_DOUBLE MYSQL_TYPE_DOUBLE +#define FIELD_TYPE_NULL MYSQL_TYPE_NULL +#define FIELD_TYPE_TIMESTAMP MYSQL_TYPE_TIMESTAMP +#define FIELD_TYPE_LONGLONG MYSQL_TYPE_LONGLONG +#define FIELD_TYPE_INT24 MYSQL_TYPE_INT24 +#define FIELD_TYPE_DATE MYSQL_TYPE_DATE +#define FIELD_TYPE_TIME MYSQL_TYPE_TIME +#define FIELD_TYPE_DATETIME MYSQL_TYPE_DATETIME +#define FIELD_TYPE_YEAR MYSQL_TYPE_YEAR +#define FIELD_TYPE_NEWDATE MYSQL_TYPE_NEWDATE +#define FIELD_TYPE_ENUM MYSQL_TYPE_ENUM +#define FIELD_TYPE_SET MYSQL_TYPE_SET +#define FIELD_TYPE_TINY_BLOB MYSQL_TYPE_TINY_BLOB +#define FIELD_TYPE_MEDIUM_BLOB MYSQL_TYPE_MEDIUM_BLOB +#define FIELD_TYPE_LONG_BLOB MYSQL_TYPE_LONG_BLOB +#define FIELD_TYPE_BLOB MYSQL_TYPE_BLOB +#define FIELD_TYPE_VAR_STRING MYSQL_TYPE_VAR_STRING +#define FIELD_TYPE_STRING MYSQL_TYPE_STRING +#define FIELD_TYPE_CHAR MYSQL_TYPE_TINY +#define FIELD_TYPE_INTERVAL MYSQL_TYPE_ENUM +#define FIELD_TYPE_GEOMETRY MYSQL_TYPE_GEOMETRY +#define FIELD_TYPE_BIT MYSQL_TYPE_BIT + + +/* Shutdown/kill enums and constants */ + +/* Bits for THD::killable. */ +#define MYSQL_SHUTDOWN_KILLABLE_CONNECT (unsigned char)(1 << 0) +#define MYSQL_SHUTDOWN_KILLABLE_TRANS (unsigned char)(1 << 1) +#define MYSQL_SHUTDOWN_KILLABLE_LOCK_TABLE (unsigned char)(1 << 2) +#define MYSQL_SHUTDOWN_KILLABLE_UPDATE (unsigned char)(1 << 3) + +enum mysql_enum_shutdown_level { + /* + We want levels to be in growing order of hardness (because we use number + comparisons). Note that DEFAULT does not respect the growing property, but + it's ok. + */ + SHUTDOWN_DEFAULT = 0, + /* wait for existing connections to finish */ + SHUTDOWN_WAIT_CONNECTIONS= MYSQL_SHUTDOWN_KILLABLE_CONNECT, + /* wait for existing trans to finish */ + SHUTDOWN_WAIT_TRANSACTIONS= MYSQL_SHUTDOWN_KILLABLE_TRANS, + /* wait for existing updates to finish (=> no partial MyISAM update) */ + SHUTDOWN_WAIT_UPDATES= MYSQL_SHUTDOWN_KILLABLE_UPDATE, + /* flush InnoDB buffers and other storage engines' buffers*/ + SHUTDOWN_WAIT_ALL_BUFFERS= (MYSQL_SHUTDOWN_KILLABLE_UPDATE << 1), + /* don't flush InnoDB buffers, flush other storage engines' buffers*/ + SHUTDOWN_WAIT_CRITICAL_BUFFERS= (MYSQL_SHUTDOWN_KILLABLE_UPDATE << 1) + 1, + /* Now the 2 levels of the KILL command */ +#if MYSQL_VERSION_ID >= 50000 + KILL_QUERY= 254, +#endif + KILL_CONNECTION= 255 +}; + + +enum enum_cursor_type +{ + CURSOR_TYPE_NO_CURSOR= 0, + CURSOR_TYPE_READ_ONLY= 1, + CURSOR_TYPE_FOR_UPDATE= 2, + CURSOR_TYPE_SCROLLABLE= 4 +}; + + +/* options for mysql_set_option */ +enum enum_mysql_set_option +{ + MYSQL_OPTION_MULTI_STATEMENTS_ON, + MYSQL_OPTION_MULTI_STATEMENTS_OFF +}; + +#define net_new_transaction(net) ((net)->pkt_nr=0) + +#ifdef __cplusplus +extern "C" { +#endif + +my_bool my_net_init(NET *net, Vio* vio); +void my_net_local_init(NET *net); +void net_end(NET *net); + void net_clear(NET *net, my_bool clear_buffer); +my_bool net_realloc(NET *net, size_t length); +my_bool net_flush(NET *net); +my_bool my_net_write(NET *net,const unsigned char *packet, size_t len); +my_bool net_write_command(NET *net,unsigned char command, + const unsigned char *header, size_t head_len, + const unsigned char *packet, size_t len); +int net_real_write(NET *net,const unsigned char *packet, size_t len); +unsigned long my_net_read(NET *net); + +#ifdef _global_h +void my_net_set_write_timeout(NET *net, uint timeout); +void my_net_set_read_timeout(NET *net, uint timeout); +#endif + +struct sockaddr; +int my_connect(my_socket s, const struct sockaddr *name, unsigned int namelen, + unsigned int timeout); +struct my_rnd_struct; + +#ifdef __cplusplus +} +#endif + + /* The following is for user defined functions */ + +enum Item_result +{ + STRING_RESULT=0, REAL_RESULT, INT_RESULT, ROW_RESULT, DECIMAL_RESULT +#ifdef MYSQL_SERVER + ,IMPOSSIBLE_RESULT /* Yes, we know this is ugly, don't tell us */ + ,MAX_NO_ITEM_RESULTS = IMPOSSIBLE_RESULT /* Should always be last */ +#endif +}; + +typedef struct st_udf_args +{ + unsigned int arg_count; /* Number of arguments */ + enum Item_result *arg_type; /* Pointer to item_results */ + char **args; /* Pointer to argument */ + unsigned long *lengths; /* Length of string arguments */ + char *maybe_null; /* Set to 1 for all maybe_null args */ + char **attributes; /* Pointer to attribute name */ + unsigned long *attribute_lengths; /* Length of attribute arguments */ + void *extension; +} UDF_ARGS; + + /* This holds information about the result */ + +typedef struct st_udf_init +{ + my_bool maybe_null; /* 1 if function can return NULL */ + unsigned int decimals; /* for real functions */ + unsigned long max_length; /* For string functions */ + char *ptr; /* free pointer for function data */ + my_bool const_item; /* 1 if function always returns the same value */ + void *extension; +} UDF_INIT; +/* + TODO: add a notion for determinism of the UDF. + See Item_udf_func::update_used_tables () +*/ + + /* Constants when using compression */ +#define NET_HEADER_SIZE 4 /* standard header size */ +#define COMP_HEADER_SIZE 3 /* compression header extra size */ + + /* Prototypes to password functions */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + These functions are used for authentication by client and server and + implemented in sql/password.c +*/ + +void create_random_string(char *to, unsigned int length, + struct my_rnd_struct *rand_st); + +void hash_password(unsigned long *to, const char *password, unsigned int password_len); +void make_scrambled_password_323(char *to, const char *password); +void scramble_323(char *to, const char *message, const char *password); +my_bool check_scramble_323(const char *, const char *message, + unsigned long *salt); +void get_salt_from_password_323(unsigned long *res, const char *password); +void make_password_from_salt_323(char *to, const unsigned long *salt); + +void make_scrambled_password(char *to, const char *password); +void scramble(char *to, const char *message, const char *password); +my_bool check_scramble(const char *reply, const char *message, + const unsigned char *hash_stage2); +void get_salt_from_password(unsigned char *res, const char *password); +void make_password_from_salt(char *to, const unsigned char *hash_stage2); +char *octet2hex(char *to, const char *str, unsigned int len); + +/* end of password.c */ + +char *get_tty_password(const char *opt_message); +const char *mysql_errno_to_sqlstate(unsigned int mysql_errno); + +/* Some other useful functions */ + +my_bool my_thread_init(void); +void my_thread_end(void); + +#ifdef _global_h +ulong STDCALL net_field_length(uchar **packet); +my_ulonglong net_field_length_ll(uchar **packet); +uchar *net_store_length(uchar *pkg, ulonglong length); +#endif + +#ifdef __cplusplus +} +#endif + +#define NULL_LENGTH ((unsigned long) ~0) /* For net_store_length */ +#define MYSQL_STMT_HEADER 4 +#define MYSQL_LONG_DATA_HEADER 6 + +#define NOT_FIXED_DEC 31 +#endif diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/mysql_time.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/mysql_time.h new file mode 100644 index 0000000..0a3f17a --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/mysql_time.h @@ -0,0 +1,55 @@ +/* Copyright (C) 2004 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef _mysql_time_h_ +#define _mysql_time_h_ + +/* + Time declarations shared between the server and client API: + you should not add anything to this header unless it's used + (and hence should be visible) in mysql.h. + If you're looking for a place to add new time-related declaration, + it's most likely my_time.h. See also "C API Handling of Date + and Time Values" chapter in documentation. +*/ + +enum enum_mysql_timestamp_type +{ + MYSQL_TIMESTAMP_NONE= -2, MYSQL_TIMESTAMP_ERROR= -1, + MYSQL_TIMESTAMP_DATE= 0, MYSQL_TIMESTAMP_DATETIME= 1, MYSQL_TIMESTAMP_TIME= 2 +}; + + +/* + Structure which is used to represent datetime values inside MySQL. + + We assume that values in this structure are normalized, i.e. year <= 9999, + month <= 12, day <= 31, hour <= 23, hour <= 59, hour <= 59. Many functions + in server such as my_system_gmt_sec() or make_time() family of functions + rely on this (actually now usage of make_*() family relies on a bit weaker + restriction). Also functions that produce MYSQL_TIME as result ensure this. + There is one exception to this rule though if this structure holds time + value (time_type == MYSQL_TIMESTAMP_TIME) days and hour member can hold + bigger values. +*/ +typedef struct st_mysql_time +{ + unsigned int year, month, day, hour, minute, second; + unsigned long second_part; + my_bool neg; + enum enum_mysql_timestamp_type time_type; +} MYSQL_TIME; + +#endif /* _mysql_time_h_ */ diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/mysql_version.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/mysql_version.h new file mode 100644 index 0000000..3f052b8 --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/mysql_version.h @@ -0,0 +1,26 @@ +/* Copyright Abandoned 1996, 1999, 2001 MySQL AB + This file is public domain and comes with NO WARRANTY of any kind */ + +/* Version numbers for protocol & mysqld */ + +#ifndef _mysql_version_h +#define _mysql_version_h + +#ifdef _CUSTOMCONFIG_ +# include +#else +# define PROTOCOL_VERSION 10 +# define MYSQL_SERVER_VERSION "6.0.0" +# define MYSQL_VERSION_ID 60000 +# define MYSQL_PORT 3306 +# define MYSQL_PORT_DEFAULT 0 +# define MYSQL_UNIX_ADDR "/tmp/mysql.sock" +# define MYSQL_CONFIG_NAME "my" +# define MYSQL_COMPILATION_COMMENT "Source distribution" +#endif /* _CUSTOMCONFIG_ */ + +#ifndef LICENSE +# define LICENSE GPL +#endif /* LICENSE */ + +#endif /* _mysql_version_h */ diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/mysql_version.h.in b/hdssd/external/linux/mysql-connector-c-6.0.2/include/mysql_version.h.in new file mode 100644 index 0000000..a707c67 --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/mysql_version.h.in @@ -0,0 +1,26 @@ +/* Copyright Abandoned 1996, 1999, 2001 MySQL AB + This file is public domain and comes with NO WARRANTY of any kind */ + +/* Version numbers for protocol & mysqld */ + +#ifndef _mysql_version_h +#define _mysql_version_h + +#ifdef _CUSTOMCONFIG_ +# include +#else +# define PROTOCOL_VERSION @PROTOCOL_VERSION@ +# define MYSQL_SERVER_VERSION "@MYSQL_SERVER_VERSION@" +# define MYSQL_VERSION_ID @MYSQL_VERSION_ID@ +# define MYSQL_PORT @MYSQL_TCP_PORT@ +# define MYSQL_PORT_DEFAULT @MYSQL_TCP_PORT_DEFAULT@ +# define MYSQL_UNIX_ADDR "@MYSQL_UNIX_ADDR@" +# define MYSQL_CONFIG_NAME "my" +# define MYSQL_COMPILATION_COMMENT "@COMPILATION_COMMENT@" +#endif /* _CUSTOMCONFIG_ */ + +#ifndef LICENSE +# define LICENSE GPL +#endif /* LICENSE */ + +#endif /* _mysql_version_h */ diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/mysqld_error.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/mysqld_error.h new file mode 100644 index 0000000..653e583 --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/mysqld_error.h @@ -0,0 +1,730 @@ +/* Autogenerated file, please don't edit */ + +#define ER_ERROR_FIRST 1000 +#define ER_HASHCHK 1000 +#define ER_NISAMCHK 1001 +#define ER_NO 1002 +#define ER_YES 1003 +#define ER_CANT_CREATE_FILE 1004 +#define ER_CANT_CREATE_TABLE 1005 +#define ER_CANT_CREATE_DB 1006 +#define ER_DB_CREATE_EXISTS 1007 +#define ER_DB_DROP_EXISTS 1008 +#define ER_DB_DROP_DELETE 1009 +#define ER_DB_DROP_RMDIR 1010 +#define ER_CANT_DELETE_FILE 1011 +#define ER_CANT_FIND_SYSTEM_REC 1012 +#define ER_CANT_GET_STAT 1013 +#define ER_CANT_GET_WD 1014 +#define ER_CANT_LOCK 1015 +#define ER_CANT_OPEN_FILE 1016 +#define ER_FILE_NOT_FOUND 1017 +#define ER_CANT_READ_DIR 1018 +#define ER_CANT_SET_WD 1019 +#define ER_CHECKREAD 1020 +#define ER_DISK_FULL 1021 +#define ER_DUP_KEY 1022 +#define ER_ERROR_ON_CLOSE 1023 +#define ER_ERROR_ON_READ 1024 +#define ER_ERROR_ON_RENAME 1025 +#define ER_ERROR_ON_WRITE 1026 +#define ER_FILE_USED 1027 +#define ER_FILSORT_ABORT 1028 +#define ER_FORM_NOT_FOUND 1029 +#define ER_GET_ERRNO 1030 +#define ER_ILLEGAL_HA 1031 +#define ER_KEY_NOT_FOUND 1032 +#define ER_NOT_FORM_FILE 1033 +#define ER_NOT_KEYFILE 1034 +#define ER_OLD_KEYFILE 1035 +#define ER_OPEN_AS_READONLY 1036 +#define ER_OUTOFMEMORY 1037 +#define ER_OUT_OF_SORTMEMORY 1038 +#define ER_UNEXPECTED_EOF 1039 +#define ER_CON_COUNT_ERROR 1040 +#define ER_OUT_OF_RESOURCES 1041 +#define ER_BAD_HOST_ERROR 1042 +#define ER_HANDSHAKE_ERROR 1043 +#define ER_DBACCESS_DENIED_ERROR 1044 +#define ER_ACCESS_DENIED_ERROR 1045 +#define ER_NO_DB_ERROR 1046 +#define ER_UNKNOWN_COM_ERROR 1047 +#define ER_BAD_NULL_ERROR 1048 +#define ER_BAD_DB_ERROR 1049 +#define ER_TABLE_EXISTS_ERROR 1050 +#define ER_BAD_TABLE_ERROR 1051 +#define ER_NON_UNIQ_ERROR 1052 +#define ER_SERVER_SHUTDOWN 1053 +#define ER_BAD_FIELD_ERROR 1054 +#define ER_WRONG_FIELD_WITH_GROUP 1055 +#define ER_WRONG_GROUP_FIELD 1056 +#define ER_WRONG_SUM_SELECT 1057 +#define ER_WRONG_VALUE_COUNT 1058 +#define ER_TOO_LONG_IDENT 1059 +#define ER_DUP_FIELDNAME 1060 +#define ER_DUP_KEYNAME 1061 +#define ER_DUP_ENTRY 1062 +#define ER_WRONG_FIELD_SPEC 1063 +#define ER_PARSE_ERROR 1064 +#define ER_EMPTY_QUERY 1065 +#define ER_NONUNIQ_TABLE 1066 +#define ER_INVALID_DEFAULT 1067 +#define ER_MULTIPLE_PRI_KEY 1068 +#define ER_TOO_MANY_KEYS 1069 +#define ER_TOO_MANY_KEY_PARTS 1070 +#define ER_TOO_LONG_KEY 1071 +#define ER_KEY_COLUMN_DOES_NOT_EXITS 1072 +#define ER_BLOB_USED_AS_KEY 1073 +#define ER_TOO_BIG_FIELDLENGTH 1074 +#define ER_WRONG_AUTO_KEY 1075 +#define ER_READY 1076 +#define ER_NORMAL_SHUTDOWN 1077 +#define ER_GOT_SIGNAL 1078 +#define ER_SHUTDOWN_COMPLETE 1079 +#define ER_FORCING_CLOSE 1080 +#define ER_IPSOCK_ERROR 1081 +#define ER_NO_SUCH_INDEX 1082 +#define ER_WRONG_FIELD_TERMINATORS 1083 +#define ER_BLOBS_AND_NO_TERMINATED 1084 +#define ER_TEXTFILE_NOT_READABLE 1085 +#define ER_FILE_EXISTS_ERROR 1086 +#define ER_LOAD_INFO 1087 +#define ER_ALTER_INFO 1088 +#define ER_WRONG_SUB_KEY 1089 +#define ER_CANT_REMOVE_ALL_FIELDS 1090 +#define ER_CANT_DROP_FIELD_OR_KEY 1091 +#define ER_INSERT_INFO 1092 +#define ER_UPDATE_TABLE_USED 1093 +#define ER_NO_SUCH_THREAD 1094 +#define ER_KILL_DENIED_ERROR 1095 +#define ER_NO_TABLES_USED 1096 +#define ER_TOO_BIG_SET 1097 +#define ER_NO_UNIQUE_LOGFILE 1098 +#define ER_TABLE_NOT_LOCKED_FOR_WRITE 1099 +#define ER_TABLE_NOT_LOCKED 1100 +#define ER_BLOB_CANT_HAVE_DEFAULT 1101 +#define ER_WRONG_DB_NAME 1102 +#define ER_WRONG_TABLE_NAME 1103 +#define ER_TOO_BIG_SELECT 1104 +#define ER_UNKNOWN_ERROR 1105 +#define ER_UNKNOWN_PROCEDURE 1106 +#define ER_WRONG_PARAMCOUNT_TO_PROCEDURE 1107 +#define ER_WRONG_PARAMETERS_TO_PROCEDURE 1108 +#define ER_UNKNOWN_TABLE 1109 +#define ER_FIELD_SPECIFIED_TWICE 1110 +#define ER_INVALID_GROUP_FUNC_USE 1111 +#define ER_UNSUPPORTED_EXTENSION 1112 +#define ER_TABLE_MUST_HAVE_COLUMNS 1113 +#define ER_RECORD_FILE_FULL 1114 +#define ER_UNKNOWN_CHARACTER_SET 1115 +#define ER_TOO_MANY_TABLES 1116 +#define ER_TOO_MANY_FIELDS 1117 +#define ER_TOO_BIG_ROWSIZE 1118 +#define ER_STACK_OVERRUN 1119 +#define ER_WRONG_OUTER_JOIN 1120 +#define ER_NULL_COLUMN_IN_INDEX 1121 +#define ER_CANT_FIND_UDF 1122 +#define ER_CANT_INITIALIZE_UDF 1123 +#define ER_UDF_NO_PATHS 1124 +#define ER_UDF_EXISTS 1125 +#define ER_CANT_OPEN_LIBRARY 1126 +#define ER_CANT_FIND_DL_ENTRY 1127 +#define ER_FUNCTION_NOT_DEFINED 1128 +#define ER_HOST_IS_BLOCKED 1129 +#define ER_HOST_NOT_PRIVILEGED 1130 +#define ER_PASSWORD_ANONYMOUS_USER 1131 +#define ER_PASSWORD_NOT_ALLOWED 1132 +#define ER_PASSWORD_NO_MATCH 1133 +#define ER_UPDATE_INFO 1134 +#define ER_CANT_CREATE_THREAD 1135 +#define ER_WRONG_VALUE_COUNT_ON_ROW 1136 +#define ER_CANT_REOPEN_TABLE 1137 +#define ER_INVALID_USE_OF_NULL 1138 +#define ER_REGEXP_ERROR 1139 +#define ER_MIX_OF_GROUP_FUNC_AND_FIELDS 1140 +#define ER_NONEXISTING_GRANT 1141 +#define ER_TABLEACCESS_DENIED_ERROR 1142 +#define ER_COLUMNACCESS_DENIED_ERROR 1143 +#define ER_ILLEGAL_GRANT_FOR_TABLE 1144 +#define ER_GRANT_WRONG_HOST_OR_USER 1145 +#define ER_NO_SUCH_TABLE 1146 +#define ER_NONEXISTING_TABLE_GRANT 1147 +#define ER_NOT_ALLOWED_COMMAND 1148 +#define ER_SYNTAX_ERROR 1149 +#define ER_DELAYED_CANT_CHANGE_LOCK 1150 +#define ER_TOO_MANY_DELAYED_THREADS 1151 +#define ER_ABORTING_CONNECTION 1152 +#define ER_NET_PACKET_TOO_LARGE 1153 +#define ER_NET_READ_ERROR_FROM_PIPE 1154 +#define ER_NET_FCNTL_ERROR 1155 +#define ER_NET_PACKETS_OUT_OF_ORDER 1156 +#define ER_NET_UNCOMPRESS_ERROR 1157 +#define ER_NET_READ_ERROR 1158 +#define ER_NET_READ_INTERRUPTED 1159 +#define ER_NET_ERROR_ON_WRITE 1160 +#define ER_NET_WRITE_INTERRUPTED 1161 +#define ER_TOO_LONG_STRING 1162 +#define ER_TABLE_CANT_HANDLE_BLOB 1163 +#define ER_TABLE_CANT_HANDLE_AUTO_INCREMENT 1164 +#define ER_DELAYED_INSERT_TABLE_LOCKED 1165 +#define ER_WRONG_COLUMN_NAME 1166 +#define ER_WRONG_KEY_COLUMN 1167 +#define ER_WRONG_MRG_TABLE 1168 +#define ER_DUP_UNIQUE 1169 +#define ER_BLOB_KEY_WITHOUT_LENGTH 1170 +#define ER_PRIMARY_CANT_HAVE_NULL 1171 +#define ER_TOO_MANY_ROWS 1172 +#define ER_REQUIRES_PRIMARY_KEY 1173 +#define ER_NO_RAID_COMPILED 1174 +#define ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE 1175 +#define ER_KEY_DOES_NOT_EXITS 1176 +#define ER_CHECK_NO_SUCH_TABLE 1177 +#define ER_CHECK_NOT_IMPLEMENTED 1178 +#define ER_CANT_DO_THIS_DURING_AN_TRANSACTION 1179 +#define ER_ERROR_DURING_COMMIT 1180 +#define ER_ERROR_DURING_ROLLBACK 1181 +#define ER_ERROR_DURING_FLUSH_LOGS 1182 +#define ER_ERROR_DURING_CHECKPOINT 1183 +#define ER_NEW_ABORTING_CONNECTION 1184 +#define ER_DUMP_NOT_IMPLEMENTED 1185 +#define ER_FLUSH_MASTER_BINLOG_CLOSED 1186 +#define ER_INDEX_REBUILD 1187 +#define ER_MASTER 1188 +#define ER_MASTER_NET_READ 1189 +#define ER_MASTER_NET_WRITE 1190 +#define ER_FT_MATCHING_KEY_NOT_FOUND 1191 +#define ER_LOCK_OR_ACTIVE_TRANSACTION 1192 +#define ER_UNKNOWN_SYSTEM_VARIABLE 1193 +#define ER_CRASHED_ON_USAGE 1194 +#define ER_CRASHED_ON_REPAIR 1195 +#define ER_WARNING_NOT_COMPLETE_ROLLBACK 1196 +#define ER_TRANS_CACHE_FULL 1197 +#define ER_SLAVE_MUST_STOP 1198 +#define ER_SLAVE_NOT_RUNNING 1199 +#define ER_BAD_SLAVE 1200 +#define ER_MASTER_INFO 1201 +#define ER_SLAVE_THREAD 1202 +#define ER_TOO_MANY_USER_CONNECTIONS 1203 +#define ER_SET_CONSTANTS_ONLY 1204 +#define ER_LOCK_WAIT_TIMEOUT 1205 +#define ER_LOCK_TABLE_FULL 1206 +#define ER_READ_ONLY_TRANSACTION 1207 +#define ER_DROP_DB_WITH_READ_LOCK 1208 +#define ER_CREATE_DB_WITH_READ_LOCK 1209 +#define ER_WRONG_ARGUMENTS 1210 +#define ER_NO_PERMISSION_TO_CREATE_USER 1211 +#define ER_UNION_TABLES_IN_DIFFERENT_DIR 1212 +#define ER_LOCK_DEADLOCK 1213 +#define ER_TABLE_CANT_HANDLE_FT 1214 +#define ER_CANNOT_ADD_FOREIGN 1215 +#define ER_NO_REFERENCED_ROW 1216 +#define ER_ROW_IS_REFERENCED 1217 +#define ER_CONNECT_TO_MASTER 1218 +#define ER_QUERY_ON_MASTER 1219 +#define ER_ERROR_WHEN_EXECUTING_COMMAND 1220 +#define ER_WRONG_USAGE 1221 +#define ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT 1222 +#define ER_CANT_UPDATE_WITH_READLOCK 1223 +#define ER_MIXING_NOT_ALLOWED 1224 +#define ER_DUP_ARGUMENT 1225 +#define ER_USER_LIMIT_REACHED 1226 +#define ER_SPECIFIC_ACCESS_DENIED_ERROR 1227 +#define ER_LOCAL_VARIABLE 1228 +#define ER_GLOBAL_VARIABLE 1229 +#define ER_NO_DEFAULT 1230 +#define ER_WRONG_VALUE_FOR_VAR 1231 +#define ER_WRONG_TYPE_FOR_VAR 1232 +#define ER_VAR_CANT_BE_READ 1233 +#define ER_CANT_USE_OPTION_HERE 1234 +#define ER_NOT_SUPPORTED_YET 1235 +#define ER_MASTER_FATAL_ERROR_READING_BINLOG 1236 +#define ER_SLAVE_IGNORED_TABLE 1237 +#define ER_INCORRECT_GLOBAL_LOCAL_VAR 1238 +#define ER_WRONG_FK_DEF 1239 +#define ER_KEY_REF_DO_NOT_MATCH_TABLE_REF 1240 +#define ER_OPERAND_COLUMNS 1241 +#define ER_SUBQUERY_NO_1_ROW 1242 +#define ER_UNKNOWN_STMT_HANDLER 1243 +#define ER_CORRUPT_HELP_DB 1244 +#define ER_CYCLIC_REFERENCE 1245 +#define ER_AUTO_CONVERT 1246 +#define ER_ILLEGAL_REFERENCE 1247 +#define ER_DERIVED_MUST_HAVE_ALIAS 1248 +#define ER_SELECT_REDUCED 1249 +#define ER_TABLENAME_NOT_ALLOWED_HERE 1250 +#define ER_NOT_SUPPORTED_AUTH_MODE 1251 +#define ER_SPATIAL_CANT_HAVE_NULL 1252 +#define ER_COLLATION_CHARSET_MISMATCH 1253 +#define ER_SLAVE_WAS_RUNNING 1254 +#define ER_SLAVE_WAS_NOT_RUNNING 1255 +#define ER_TOO_BIG_FOR_UNCOMPRESS 1256 +#define ER_ZLIB_Z_MEM_ERROR 1257 +#define ER_ZLIB_Z_BUF_ERROR 1258 +#define ER_ZLIB_Z_DATA_ERROR 1259 +#define ER_CUT_VALUE_GROUP_CONCAT 1260 +#define ER_WARN_TOO_FEW_RECORDS 1261 +#define ER_WARN_TOO_MANY_RECORDS 1262 +#define ER_WARN_NULL_TO_NOTNULL 1263 +#define ER_WARN_DATA_OUT_OF_RANGE 1264 +#define WARN_DATA_TRUNCATED 1265 +#define ER_WARN_USING_OTHER_HANDLER 1266 +#define ER_CANT_AGGREGATE_2COLLATIONS 1267 +#define ER_DROP_USER 1268 +#define ER_REVOKE_GRANTS 1269 +#define ER_CANT_AGGREGATE_3COLLATIONS 1270 +#define ER_CANT_AGGREGATE_NCOLLATIONS 1271 +#define ER_VARIABLE_IS_NOT_STRUCT 1272 +#define ER_UNKNOWN_COLLATION 1273 +#define ER_SLAVE_IGNORED_SSL_PARAMS 1274 +#define ER_SERVER_IS_IN_SECURE_AUTH_MODE 1275 +#define ER_WARN_FIELD_RESOLVED 1276 +#define ER_BAD_SLAVE_UNTIL_COND 1277 +#define ER_MISSING_SKIP_SLAVE 1278 +#define ER_UNTIL_COND_IGNORED 1279 +#define ER_WRONG_NAME_FOR_INDEX 1280 +#define ER_WRONG_NAME_FOR_CATALOG 1281 +#define ER_WARN_QC_RESIZE 1282 +#define ER_BAD_FT_COLUMN 1283 +#define ER_UNKNOWN_KEY_CACHE 1284 +#define ER_WARN_HOSTNAME_WONT_WORK 1285 +#define ER_UNKNOWN_STORAGE_ENGINE 1286 +#define ER_WARN_DEPRECATED_SYNTAX 1287 +#define ER_NON_UPDATABLE_TABLE 1288 +#define ER_FEATURE_DISABLED 1289 +#define ER_OPTION_PREVENTS_STATEMENT 1290 +#define ER_DUPLICATED_VALUE_IN_TYPE 1291 +#define ER_TRUNCATED_WRONG_VALUE 1292 +#define ER_TOO_MUCH_AUTO_TIMESTAMP_COLS 1293 +#define ER_INVALID_ON_UPDATE 1294 +#define ER_UNSUPPORTED_PS 1295 +#define ER_GET_ERRMSG 1296 +#define ER_GET_TEMPORARY_ERRMSG 1297 +#define ER_UNKNOWN_TIME_ZONE 1298 +#define ER_WARN_INVALID_TIMESTAMP 1299 +#define ER_INVALID_CHARACTER_STRING 1300 +#define ER_WARN_ALLOWED_PACKET_OVERFLOWED 1301 +#define ER_CONFLICTING_DECLARATIONS 1302 +#define ER_SP_NO_RECURSIVE_CREATE 1303 +#define ER_SP_ALREADY_EXISTS 1304 +#define ER_SP_DOES_NOT_EXIST 1305 +#define ER_SP_DROP_FAILED 1306 +#define ER_SP_STORE_FAILED 1307 +#define ER_SP_LILABEL_MISMATCH 1308 +#define ER_SP_LABEL_REDEFINE 1309 +#define ER_SP_LABEL_MISMATCH 1310 +#define ER_SP_UNINIT_VAR 1311 +#define ER_SP_BADSELECT 1312 +#define ER_SP_BADRETURN 1313 +#define ER_SP_BADSTATEMENT 1314 +#define ER_UPDATE_LOG_DEPRECATED_IGNORED 1315 +#define ER_UPDATE_LOG_DEPRECATED_TRANSLATED 1316 +#define ER_QUERY_INTERRUPTED 1317 +#define ER_SP_WRONG_NO_OF_ARGS 1318 +#define ER_SP_COND_MISMATCH 1319 +#define ER_SP_NORETURN 1320 +#define ER_SP_NORETURNEND 1321 +#define ER_SP_BAD_CURSOR_QUERY 1322 +#define ER_SP_BAD_CURSOR_SELECT 1323 +#define ER_SP_CURSOR_MISMATCH 1324 +#define ER_SP_CURSOR_ALREADY_OPEN 1325 +#define ER_SP_CURSOR_NOT_OPEN 1326 +#define ER_SP_UNDECLARED_VAR 1327 +#define ER_SP_WRONG_NO_OF_FETCH_ARGS 1328 +#define ER_SP_FETCH_NO_DATA 1329 +#define ER_SP_DUP_PARAM 1330 +#define ER_SP_DUP_VAR 1331 +#define ER_SP_DUP_COND 1332 +#define ER_SP_DUP_CURS 1333 +#define ER_SP_CANT_ALTER 1334 +#define ER_SP_SUBSELECT_NYI 1335 +#define ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG 1336 +#define ER_SP_VARCOND_AFTER_CURSHNDLR 1337 +#define ER_SP_CURSOR_AFTER_HANDLER 1338 +#define ER_SP_CASE_NOT_FOUND 1339 +#define ER_FPARSER_TOO_BIG_FILE 1340 +#define ER_FPARSER_BAD_HEADER 1341 +#define ER_FPARSER_EOF_IN_COMMENT 1342 +#define ER_FPARSER_ERROR_IN_PARAMETER 1343 +#define ER_FPARSER_EOF_IN_UNKNOWN_PARAMETER 1344 +#define ER_VIEW_NO_EXPLAIN 1345 +#define ER_FRM_UNKNOWN_TYPE 1346 +#define ER_WRONG_OBJECT 1347 +#define ER_NONUPDATEABLE_COLUMN 1348 +#define ER_VIEW_SELECT_DERIVED 1349 +#define ER_VIEW_SELECT_CLAUSE 1350 +#define ER_VIEW_SELECT_VARIABLE 1351 +#define ER_VIEW_SELECT_TMPTABLE 1352 +#define ER_VIEW_WRONG_LIST 1353 +#define ER_WARN_VIEW_MERGE 1354 +#define ER_WARN_VIEW_WITHOUT_KEY 1355 +#define ER_VIEW_INVALID 1356 +#define ER_SP_NO_DROP_SP 1357 +#define ER_SP_GOTO_IN_HNDLR 1358 +#define ER_TRG_ALREADY_EXISTS 1359 +#define ER_TRG_DOES_NOT_EXIST 1360 +#define ER_TRG_ON_VIEW_OR_TEMP_TABLE 1361 +#define ER_TRG_CANT_CHANGE_ROW 1362 +#define ER_TRG_NO_SUCH_ROW_IN_TRG 1363 +#define ER_NO_DEFAULT_FOR_FIELD 1364 +#define ER_DIVISION_BY_ZERO 1365 +#define ER_TRUNCATED_WRONG_VALUE_FOR_FIELD 1366 +#define ER_ILLEGAL_VALUE_FOR_TYPE 1367 +#define ER_VIEW_NONUPD_CHECK 1368 +#define ER_VIEW_CHECK_FAILED 1369 +#define ER_PROCACCESS_DENIED_ERROR 1370 +#define ER_RELAY_LOG_FAIL 1371 +#define ER_PASSWD_LENGTH 1372 +#define ER_UNKNOWN_TARGET_BINLOG 1373 +#define ER_IO_ERR_LOG_INDEX_READ 1374 +#define ER_BINLOG_PURGE_PROHIBITED 1375 +#define ER_FSEEK_FAIL 1376 +#define ER_BINLOG_PURGE_FATAL_ERR 1377 +#define ER_LOG_IN_USE 1378 +#define ER_LOG_PURGE_UNKNOWN_ERR 1379 +#define ER_RELAY_LOG_INIT 1380 +#define ER_NO_BINARY_LOGGING 1381 +#define ER_RESERVED_SYNTAX 1382 +#define ER_WSAS_FAILED 1383 +#define ER_DIFF_GROUPS_PROC 1384 +#define ER_NO_GROUP_FOR_PROC 1385 +#define ER_ORDER_WITH_PROC 1386 +#define ER_LOGGING_PROHIBIT_CHANGING_OF 1387 +#define ER_NO_FILE_MAPPING 1388 +#define ER_WRONG_MAGIC 1389 +#define ER_PS_MANY_PARAM 1390 +#define ER_KEY_PART_0 1391 +#define ER_VIEW_CHECKSUM 1392 +#define ER_VIEW_MULTIUPDATE 1393 +#define ER_VIEW_NO_INSERT_FIELD_LIST 1394 +#define ER_VIEW_DELETE_MERGE_VIEW 1395 +#define ER_CANNOT_USER 1396 +#define ER_XAER_NOTA 1397 +#define ER_XAER_INVAL 1398 +#define ER_XAER_RMFAIL 1399 +#define ER_XAER_OUTSIDE 1400 +#define ER_XAER_RMERR 1401 +#define ER_XA_RBROLLBACK 1402 +#define ER_NONEXISTING_PROC_GRANT 1403 +#define ER_PROC_AUTO_GRANT_FAIL 1404 +#define ER_PROC_AUTO_REVOKE_FAIL 1405 +#define ER_DATA_TOO_LONG 1406 +#define ER_SP_BAD_SQLSTATE 1407 +#define ER_STARTUP 1408 +#define ER_LOAD_FROM_FIXED_SIZE_ROWS_TO_VAR 1409 +#define ER_CANT_CREATE_USER_WITH_GRANT 1410 +#define ER_WRONG_VALUE_FOR_TYPE 1411 +#define ER_TABLE_DEF_CHANGED 1412 +#define ER_SP_DUP_HANDLER 1413 +#define ER_SP_NOT_VAR_ARG 1414 +#define ER_SP_NO_RETSET 1415 +#define ER_CANT_CREATE_GEOMETRY_OBJECT 1416 +#define ER_FAILED_ROUTINE_BREAK_BINLOG 1417 +#define ER_BINLOG_UNSAFE_ROUTINE 1418 +#define ER_BINLOG_CREATE_ROUTINE_NEED_SUPER 1419 +#define ER_EXEC_STMT_WITH_OPEN_CURSOR 1420 +#define ER_STMT_HAS_NO_OPEN_CURSOR 1421 +#define ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG 1422 +#define ER_NO_DEFAULT_FOR_VIEW_FIELD 1423 +#define ER_SP_NO_RECURSION 1424 +#define ER_TOO_BIG_SCALE 1425 +#define ER_TOO_BIG_PRECISION 1426 +#define ER_M_BIGGER_THAN_D 1427 +#define ER_WRONG_LOCK_OF_SYSTEM_TABLE 1428 +#define ER_CONNECT_TO_FOREIGN_DATA_SOURCE 1429 +#define ER_QUERY_ON_FOREIGN_DATA_SOURCE 1430 +#define ER_FOREIGN_DATA_SOURCE_DOESNT_EXIST 1431 +#define ER_FOREIGN_DATA_STRING_INVALID_CANT_CREATE 1432 +#define ER_FOREIGN_DATA_STRING_INVALID 1433 +#define ER_CANT_CREATE_FEDERATED_TABLE 1434 +#define ER_TRG_IN_WRONG_SCHEMA 1435 +#define ER_STACK_OVERRUN_NEED_MORE 1436 +#define ER_TOO_LONG_BODY 1437 +#define ER_WARN_CANT_DROP_DEFAULT_KEYCACHE 1438 +#define ER_TOO_BIG_DISPLAYWIDTH 1439 +#define ER_XAER_DUPID 1440 +#define ER_DATETIME_FUNCTION_OVERFLOW 1441 +#define ER_CANT_UPDATE_USED_TABLE_IN_SF_OR_TRG 1442 +#define ER_VIEW_PREVENT_UPDATE 1443 +#define ER_PS_NO_RECURSION 1444 +#define ER_SP_CANT_SET_AUTOCOMMIT 1445 +#define ER_MALFORMED_DEFINER 1446 +#define ER_VIEW_FRM_NO_USER 1447 +#define ER_VIEW_OTHER_USER 1448 +#define ER_NO_SUCH_USER 1449 +#define ER_FORBID_SCHEMA_CHANGE 1450 +#define ER_ROW_IS_REFERENCED_2 1451 +#define ER_NO_REFERENCED_ROW_2 1452 +#define ER_SP_BAD_VAR_SHADOW 1453 +#define ER_TRG_NO_DEFINER 1454 +#define ER_OLD_FILE_FORMAT 1455 +#define ER_SP_RECURSION_LIMIT 1456 +#define ER_SP_PROC_TABLE_CORRUPT 1457 +#define ER_SP_WRONG_NAME 1458 +#define ER_TABLE_NEEDS_UPGRADE 1459 +#define ER_SP_NO_AGGREGATE 1460 +#define ER_MAX_PREPARED_STMT_COUNT_REACHED 1461 +#define ER_VIEW_RECURSIVE 1462 +#define ER_NON_GROUPING_FIELD_USED 1463 +#define ER_TABLE_CANT_HANDLE_SPKEYS 1464 +#define ER_NO_TRIGGERS_ON_SYSTEM_SCHEMA 1465 +#define ER_REMOVED_SPACES 1466 +#define ER_AUTOINC_READ_FAILED 1467 +#define ER_USERNAME 1468 +#define ER_HOSTNAME 1469 +#define ER_WRONG_STRING_LENGTH 1470 +#define ER_NON_INSERTABLE_TABLE 1471 +#define ER_ADMIN_WRONG_MRG_TABLE 1472 +#define ER_TOO_HIGH_LEVEL_OF_NESTING_FOR_SELECT 1473 +#define ER_NAME_BECOMES_EMPTY 1474 +#define ER_AMBIGUOUS_FIELD_TERM 1475 +#define ER_FOREIGN_SERVER_EXISTS 1476 +#define ER_FOREIGN_SERVER_DOESNT_EXIST 1477 +#define ER_ILLEGAL_HA_CREATE_OPTION 1478 +#define ER_PARTITION_REQUIRES_VALUES_ERROR 1479 +#define ER_PARTITION_WRONG_VALUES_ERROR 1480 +#define ER_PARTITION_MAXVALUE_ERROR 1481 +#define ER_PARTITION_SUBPARTITION_ERROR 1482 +#define ER_PARTITION_SUBPART_MIX_ERROR 1483 +#define ER_PARTITION_WRONG_NO_PART_ERROR 1484 +#define ER_PARTITION_WRONG_NO_SUBPART_ERROR 1485 +#define ER_CONST_EXPR_IN_PARTITION_FUNC_ERROR 1486 +#define ER_NO_CONST_EXPR_IN_RANGE_OR_LIST_ERROR 1487 +#define ER_FIELD_NOT_FOUND_PART_ERROR 1488 +#define ER_LIST_OF_FIELDS_ONLY_IN_HASH_ERROR 1489 +#define ER_INCONSISTENT_PARTITION_INFO_ERROR 1490 +#define ER_PARTITION_FUNC_NOT_ALLOWED_ERROR 1491 +#define ER_PARTITIONS_MUST_BE_DEFINED_ERROR 1492 +#define ER_RANGE_NOT_INCREASING_ERROR 1493 +#define ER_INCONSISTENT_TYPE_OF_FUNCTIONS_ERROR 1494 +#define ER_MULTIPLE_DEF_CONST_IN_LIST_PART_ERROR 1495 +#define ER_PARTITION_ENTRY_ERROR 1496 +#define ER_MIX_HANDLER_ERROR 1497 +#define ER_PARTITION_NOT_DEFINED_ERROR 1498 +#define ER_TOO_MANY_PARTITIONS_ERROR 1499 +#define ER_SUBPARTITION_ERROR 1500 +#define ER_CANT_CREATE_HANDLER_FILE 1501 +#define ER_BLOB_FIELD_IN_PART_FUNC_ERROR 1502 +#define ER_UNIQUE_KEY_NEED_ALL_FIELDS_IN_PF 1503 +#define ER_NO_PARTS_ERROR 1504 +#define ER_PARTITION_MGMT_ON_NONPARTITIONED 1505 +#define ER_FOREIGN_KEY_ON_PARTITIONED 1506 +#define ER_DROP_PARTITION_NON_EXISTENT 1507 +#define ER_DROP_LAST_PARTITION 1508 +#define ER_COALESCE_ONLY_ON_HASH_PARTITION 1509 +#define ER_REORG_HASH_ONLY_ON_SAME_NO 1510 +#define ER_REORG_NO_PARAM_ERROR 1511 +#define ER_ONLY_ON_RANGE_LIST_PARTITION 1512 +#define ER_ADD_PARTITION_SUBPART_ERROR 1513 +#define ER_ADD_PARTITION_NO_NEW_PARTITION 1514 +#define ER_COALESCE_PARTITION_NO_PARTITION 1515 +#define ER_REORG_PARTITION_NOT_EXIST 1516 +#define ER_SAME_NAME_PARTITION 1517 +#define ER_NO_BINLOG_ERROR 1518 +#define ER_CONSECUTIVE_REORG_PARTITIONS 1519 +#define ER_REORG_OUTSIDE_RANGE 1520 +#define ER_PARTITION_FUNCTION_FAILURE 1521 +#define ER_PART_STATE_ERROR 1522 +#define ER_LIMITED_PART_RANGE 1523 +#define ER_PLUGIN_IS_NOT_LOADED 1524 +#define ER_WRONG_VALUE 1525 +#define ER_NO_PARTITION_FOR_GIVEN_VALUE 1526 +#define ER_FILEGROUP_OPTION_ONLY_ONCE 1527 +#define ER_CREATE_FILEGROUP_FAILED 1528 +#define ER_DROP_FILEGROUP_FAILED 1529 +#define ER_TABLESPACE_AUTO_EXTEND_ERROR 1530 +#define ER_WRONG_SIZE_NUMBER 1531 +#define ER_SIZE_OVERFLOW_ERROR 1532 +#define ER_ALTER_FILEGROUP_FAILED 1533 +#define ER_BINLOG_ROW_LOGGING_FAILED 1534 +#define ER_BINLOG_ROW_WRONG_TABLE_DEF 1535 +#define ER_BINLOG_ROW_RBR_TO_SBR 1536 +#define ER_EVENT_ALREADY_EXISTS 1537 +#define ER_EVENT_STORE_FAILED 1538 +#define ER_EVENT_DOES_NOT_EXIST 1539 +#define ER_EVENT_CANT_ALTER 1540 +#define ER_EVENT_DROP_FAILED 1541 +#define ER_EVENT_INTERVAL_NOT_POSITIVE_OR_TOO_BIG 1542 +#define ER_EVENT_ENDS_BEFORE_STARTS 1543 +#define ER_EVENT_EXEC_TIME_IN_THE_PAST 1544 +#define ER_EVENT_OPEN_TABLE_FAILED 1545 +#define ER_EVENT_NEITHER_M_EXPR_NOR_M_AT 1546 +#define ER_COL_COUNT_DOESNT_MATCH_CORRUPTED 1547 +#define ER_CANNOT_LOAD_FROM_TABLE 1548 +#define ER_EVENT_CANNOT_DELETE 1549 +#define ER_EVENT_COMPILE_ERROR 1550 +#define ER_EVENT_SAME_NAME 1551 +#define ER_EVENT_DATA_TOO_LONG 1552 +#define ER_DROP_INDEX_FK 1553 +#define ER_WARN_DEPRECATED_SYNTAX_WITH_VER 1554 +#define ER_CANT_WRITE_LOCK_LOG_TABLE 1555 +#define ER_CANT_LOCK_LOG_TABLE 1556 +#define ER_FOREIGN_DUPLICATE_KEY 1557 +#define ER_COL_COUNT_DOESNT_MATCH_PLEASE_UPDATE 1558 +#define ER_TEMP_TABLE_PREVENTS_SWITCH_OUT_OF_RBR 1559 +#define ER_STORED_FUNCTION_PREVENTS_SWITCH_BINLOG_FORMAT 1560 +#define ER_NDB_CANT_SWITCH_BINLOG_FORMAT 1561 +#define ER_PARTITION_NO_TEMPORARY 1562 +#define ER_PARTITION_CONST_DOMAIN_ERROR 1563 +#define ER_PARTITION_FUNCTION_IS_NOT_ALLOWED 1564 +#define ER_DDL_LOG_ERROR 1565 +#define ER_NULL_IN_VALUES_LESS_THAN 1566 +#define ER_WRONG_PARTITION_NAME 1567 +#define ER_CANT_CHANGE_TX_ISOLATION 1568 +#define ER_DUP_ENTRY_AUTOINCREMENT_CASE 1569 +#define ER_EVENT_MODIFY_QUEUE_ERROR 1570 +#define ER_EVENT_SET_VAR_ERROR 1571 +#define ER_PARTITION_MERGE_ERROR 1572 +#define ER_CANT_ACTIVATE_LOG 1573 +#define ER_RBR_NOT_AVAILABLE 1574 +#define ER_BASE64_DECODE_ERROR 1575 +#define ER_EVENT_RECURSION_FORBIDDEN 1576 +#define ER_EVENTS_DB_ERROR 1577 +#define ER_ONLY_INTEGERS_ALLOWED 1578 +#define ER_UNSUPORTED_LOG_ENGINE 1579 +#define ER_BAD_LOG_STATEMENT 1580 +#define ER_CANT_RENAME_LOG_TABLE 1581 +#define ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT 1582 +#define ER_WRONG_PARAMETERS_TO_NATIVE_FCT 1583 +#define ER_WRONG_PARAMETERS_TO_STORED_FCT 1584 +#define ER_NATIVE_FCT_NAME_COLLISION 1585 +#define ER_DUP_ENTRY_WITH_KEY_NAME 1586 +#define ER_BINLOG_PURGE_EMFILE 1587 +#define ER_EVENT_CANNOT_CREATE_IN_THE_PAST 1588 +#define ER_EVENT_CANNOT_ALTER_IN_THE_PAST 1589 +#define ER_SLAVE_INCIDENT 1590 +#define ER_NO_PARTITION_FOR_GIVEN_VALUE_SILENT 1591 +#define ER_BINLOG_UNSAFE_STATEMENT 1592 +#define ER_SLAVE_FATAL_ERROR 1593 +#define ER_SLAVE_RELAY_LOG_READ_FAILURE 1594 +#define ER_SLAVE_RELAY_LOG_WRITE_FAILURE 1595 +#define ER_SLAVE_CREATE_EVENT_FAILURE 1596 +#define ER_SLAVE_MASTER_COM_FAILURE 1597 +#define ER_BINLOG_LOGGING_IMPOSSIBLE 1598 +#define ER_VIEW_NO_CREATION_CTX 1599 +#define ER_VIEW_INVALID_CREATION_CTX 1600 +#define ER_SR_INVALID_CREATION_CTX 1601 +#define ER_TRG_CORRUPTED_FILE 1602 +#define ER_TRG_NO_CREATION_CTX 1603 +#define ER_TRG_INVALID_CREATION_CTX 1604 +#define ER_EVENT_INVALID_CREATION_CTX 1605 +#define ER_TRG_CANT_OPEN_TABLE 1606 +#define ER_CANT_CREATE_SROUTINE 1607 +#define ER_SLAVE_AMBIGOUS_EXEC_MODE 1608 +#define ER_NO_FORMAT_DESCRIPTION_EVENT_BEFORE_BINLOG_STATEMENT 1609 +#define ER_SLAVE_CORRUPT_EVENT 1610 +#define ER_LOAD_DATA_INVALID_COLUMN 1611 +#define ER_LOG_PURGE_NO_FILE 1612 +#define ER_NEED_REPREPARE 1613 +#define ER_DELAYED_NOT_SUPPORTED 1614 +#define ER_WARN_AUTO_CONVERT_LOCK 1615 +#define ER_NO_AUTO_CONVERT_LOCK_STRICT 1616 +#define ER_NO_AUTO_CONVERT_LOCK_TRANSACTION 1617 +#define ER_NO_STORAGE_ENGINE 1618 +#define ER_BACKUP_BACKUP_START 1619 +#define ER_BACKUP_BACKUP_DONE 1620 +#define ER_BACKUP_RESTORE_START 1621 +#define ER_BACKUP_RESTORE_DONE 1622 +#define ER_BACKUP_NOTHING_TO_BACKUP 1623 +#define ER_BACKUP_CANNOT_INCLUDE_DB 1624 +#define ER_BACKUP_BACKUP 1625 +#define ER_BACKUP_RESTORE 1626 +#define ER_BACKUP_RUNNING 1627 +#define ER_BACKUP_BACKUP_PREPARE 1628 +#define ER_BACKUP_RESTORE_PREPARE 1629 +#define ER_BACKUP_INVALID_LOC 1630 +#define ER_BACKUP_READ_LOC 1631 +#define ER_BACKUP_WRITE_LOC 1632 +#define ER_BACKUP_LIST_DBS 1633 +#define ER_BACKUP_LIST_TABLES 1634 +#define ER_BACKUP_LIST_DB_TABLES 1635 +#define ER_BACKUP_SKIP_VIEW 1636 +#define ER_BACKUP_NO_ENGINE 1637 +#define ER_BACKUP_TABLE_OPEN 1638 +#define ER_BACKUP_READ_HEADER 1639 +#define ER_BACKUP_WRITE_HEADER 1640 +#define ER_BACKUP_NO_BACKUP_DRIVER 1641 +#define ER_BACKUP_NOT_ACCEPTED 1642 +#define ER_BACKUP_CREATE_BACKUP_DRIVER 1643 +#define ER_BACKUP_CREATE_RESTORE_DRIVER 1644 +#define ER_BACKUP_TOO_MANY_IMAGES 1645 +#define ER_BACKUP_WRITE_META 1646 +#define ER_BACKUP_READ_META 1647 +#define ER_BACKUP_CREATE_META 1648 +#define ER_BACKUP_GET_BUF 1649 +#define ER_BACKUP_WRITE_DATA 1650 +#define ER_BACKUP_READ_DATA 1651 +#define ER_BACKUP_NEXT_CHUNK 1652 +#define ER_BACKUP_INIT_BACKUP_DRIVER 1653 +#define ER_BACKUP_INIT_RESTORE_DRIVER 1654 +#define ER_BACKUP_STOP_BACKUP_DRIVER 1655 +#define ER_BACKUP_STOP_RESTORE_DRIVERS 1656 +#define ER_BACKUP_PREPARE_DRIVER 1657 +#define ER_BACKUP_CREATE_VP 1658 +#define ER_BACKUP_UNLOCK_DRIVER 1659 +#define ER_BACKUP_CANCEL_BACKUP 1660 +#define ER_BACKUP_CANCEL_RESTORE 1661 +#define ER_BACKUP_GET_DATA 1662 +#define ER_BACKUP_SEND_DATA 1663 +#define ER_BACKUP_SEND_DATA_RETRY 1664 +#define ER_BACKUP_OPEN_TABLES 1665 +#define ER_BACKUP_THREAD_INIT 1666 +#define ER_BACKUP_PROGRESS_TABLES 1667 +#define ER_TABLESPACE_EXIST 1668 +#define ER_NO_SUCH_TABLESPACE 1669 +#define ER_SLAVE_HEARTBEAT_FAILURE 1670 +#define ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE 1671 +#define ER_BACKUP_CANT_FIND_SE 1672 +#define ER_BACKUP_NO_NATIVE_BE 1673 +#define ER_BACKUP_UNKNOWN_BE 1674 +#define ER_BACKUP_WRONG_TABLE_BE 1675 +#define ER_BACKUP_CANT_RESTORE_DB 1676 +#define ER_BACKUP_CANT_RESTORE_TABLE 1677 +#define ER_BACKUP_CANT_RESTORE_VIEW 1678 +#define ER_BACKUP_CANT_RESTORE_SROUT 1679 +#define ER_BACKUP_CANT_RESTORE_EVENT 1680 +#define ER_BACKUP_CANT_RESTORE_TRIGGER 1681 +#define ER_BACKUP_CATALOG_ADD_DB 1682 +#define ER_BACKUP_CATALOG_ADD_TABLE 1683 +#define ER_BACKUP_CATALOG_ADD_VIEW 1684 +#define ER_BACKUP_CATALOG_ADD_SROUT 1685 +#define ER_BACKUP_CATALOG_ADD_EVENT 1686 +#define ER_BACKUP_CATALOG_ADD_TRIGGER 1687 +#define ER_BACKUP_UNKNOWN_OBJECT 1688 +#define ER_BACKUP_UNKNOWN_OBJECT_TYPE 1689 +#define ER_BACKUP_OPEN_WR 1690 +#define ER_BACKUP_OPEN_RD 1691 +#define ER_BACKUP_BAD_MAGIC 1692 +#define ER_BACKUP_CONTEXT_CREATE 1693 +#define ER_BACKUP_CONTEXT_REMOVE 1694 +#define ER_BAD_PATH 1695 +#define ER_DDL_BLOCK 1696 +#define ER_BACKUP_LOGGER_INIT 1697 +#define ER_BACKUP_WRITE_SUMMARY 1698 +#define ER_BACKUP_READ_SUMMARY 1699 +#define ER_BACKUP_GET_META_DB 1700 +#define ER_BACKUP_GET_META_TABLE 1701 +#define ER_BACKUP_GET_META_VIEW 1702 +#define ER_BACKUP_GET_META_SROUT 1703 +#define ER_BACKUP_GET_META_EVENT 1704 +#define ER_BACKUP_GET_META_TRIGGER 1705 +#define ER_BACKUP_CREATE_BE 1706 +#define ER_BACKUP_LIST_PERDB 1707 +#define ER_BACKUP_LIST_DB_VIEWS 1708 +#define ER_BACKUP_LIST_DB_SROUT 1709 +#define ER_BACKUP_LIST_DB_EVENTS 1710 +#define ER_BACKUP_LIST_DB_TRIGGERS 1711 +#define ER_BACKUP_LOG_WRITE_ERROR 1712 +#define ER_TABLESPACE_NOT_EMPTY 1713 +#define ER_BACKUP_CAT_ENUM 1714 +#define ER_BACKUP_CANT_RESTORE_TS 1715 +#define ER_BACKUP_TS_CHANGE 1716 +#define ER_BACKUP_GET_META_TS 1717 +#define ER_TABLESPACE_DATAFILE_EXIST 1718 +#define ER_BACKUP_CATALOG_ADD_TS 1719 +#define ER_DEBUG_SYNC_TIMEOUT 1720 +#define ER_DEBUG_SYNC_HIT_LIMIT 1721 +#define ER_BACKUP_FAILED_TO_INIT_COMPRESSION 1722 +#define ER_BACKUP_OBTAIN_NAME_LOCK_FAILED 1723 +#define ER_BACKUP_RELEASE_NAME_LOCK_FAILED 1724 +#define ER_BACKUP_BACKUPDIR 1725 +#define ER_ERROR_LAST 1725 diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/mysys/rijndael.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/mysys/rijndael.h new file mode 100644 index 0000000..89963a8 --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/mysys/rijndael.h @@ -0,0 +1,41 @@ +/* Copyright (C) 2002 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + + +/* + rijndael-alg-fst.h + + @version 3.0 (December 2000) + Optimised ANSI C code for the Rijndael cipher (now AES) + @author Vincent Rijmen + @author Antoon Bosselaers + @author Paulo Barreto + + This code is hereby placed in the public domain. + Modified by Peter Zaitsev to fit MySQL coding style. + */ + +#define AES_MAXKC (256/32) +#define AES_MAXKB (256/8) +#define AES_MAXNR 14 + +int rijndaelKeySetupEnc(uint32 rk[/*4*(Nr + 1)*/], const uint8 cipherKey[], + int keyBits); +int rijndaelKeySetupDec(uint32 rk[/*4*(Nr + 1)*/], const uint8 cipherKey[], + int keyBits); +void rijndaelEncrypt(const uint32 rk[/*4*(Nr + 1)*/], int Nr, + const uint8 pt[16], uint8 ct[16]); +void rijndaelDecrypt(const uint32 rk[/*4*(Nr + 1)*/], int Nr, + const uint8 ct[16], uint8 pt[16]); diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/mysys_err.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/mysys_err.h new file mode 100644 index 0000000..7167395 --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/mysys_err.h @@ -0,0 +1,90 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef _mysys_err_h +#define _mysys_err_h +#ifdef __cplusplus +extern "C" { +#endif + +#define GLOBERRS (EE_ERROR_LAST - EE_ERROR_FIRST + 1) /* Nr of global errors */ +#define EE(X) (globerrs[(X) - EE_ERROR_FIRST]) + +extern const char * NEAR globerrs[]; /* my_error_messages is here */ + +/* Error message numbers in global map */ +/* + Do not add error numbers before EE_ERROR_FIRST. + If necessary to add lower numbers, change EE_ERROR_FIRST accordingly. + + We start with error 1 to not confuse peoples with 'error 0' +*/ + +#define EE_ERROR_FIRST 1 /*Copy first error nr.*/ +#define EE_CANTCREATEFILE 1 +#define EE_READ 2 +#define EE_WRITE 3 +#define EE_BADCLOSE 4 +#define EE_OUTOFMEMORY 5 +#define EE_DELETE 6 +#define EE_LINK 7 +#define EE_EOFERR 9 +#define EE_CANTLOCK 10 +#define EE_CANTUNLOCK 11 +#define EE_DIR 12 +#define EE_STAT 13 +#define EE_CANT_CHSIZE 14 +#define EE_CANT_OPEN_STREAM 15 +#define EE_GETWD 16 +#define EE_SETWD 17 +#define EE_LINK_WARNING 18 +#define EE_OPEN_WARNING 19 +#define EE_DISK_FULL 20 +#define EE_CANT_MKDIR 21 +#define EE_UNKNOWN_CHARSET 22 +#define EE_OUT_OF_FILERESOURCES 23 +#define EE_CANT_READLINK 24 +#define EE_CANT_SYMLINK 25 +#define EE_REALPATH 26 +#define EE_SYNC 27 +#define EE_UNKNOWN_COLLATION 28 +#define EE_FILENOTFOUND 29 +#define EE_FILE_NOT_CLOSED 30 +#define EE_CANT_CHMOD 31 +#define EE_ERROR_LAST 31 /* Copy last error nr */ +/* Add error numbers before EE_ERROR_LAST and change it accordingly. */ + + /* exit codes for all MySQL programs */ + +#define EXIT_UNSPECIFIED_ERROR 1 +#define EXIT_UNKNOWN_OPTION 2 +#define EXIT_AMBIGUOUS_OPTION 3 +#define EXIT_NO_ARGUMENT_ALLOWED 4 +#define EXIT_ARGUMENT_REQUIRED 5 +#define EXIT_VAR_PREFIX_NOT_UNIQUE 6 +#define EXIT_UNKNOWN_VARIABLE 7 +#define EXIT_OUT_OF_MEMORY 8 +#define EXIT_UNKNOWN_SUFFIX 9 +#define EXIT_NO_PTR_TO_VARIABLE 10 +#define EXIT_CANNOT_CONNECT_TO_SERVICE 11 +#define EXIT_OPTION_DISABLED 12 +#define EXIT_ARGUMENT_INVALID 13 + + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/queues.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/queues.h new file mode 100644 index 0000000..d01b73b --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/queues.h @@ -0,0 +1,72 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* + Code for generell handling of priority Queues. + Implemention of queues from "Algoritms in C" by Robert Sedgewick. + Copyright Monty Program KB. + By monty. +*/ + +#ifndef _queues_h +#define _queues_h +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct st_queue { + uchar **root; + void *first_cmp_arg; + uint elements; + uint max_elements; + uint offset_to_key; /* compare is done on element+offset */ + int max_at_top; /* Normally 1, set to -1 if queue_top gives max */ + int (*compare)(void *, uchar *,uchar *); + uint auto_extent; +} QUEUE; + +#define queue_top(queue) ((queue)->root[1]) +#define queue_element(queue,index) ((queue)->root[index+1]) +#define queue_end(queue) ((queue)->root[(queue)->elements]) +#define queue_replaced(queue) _downheap(queue,1) +#define queue_set_cmp_arg(queue, set_arg) (queue)->first_cmp_arg= set_arg +#define queue_set_max_at_top(queue, set_arg) \ + (queue)->max_at_top= set_arg ? -1 : 1 +typedef int (*queue_compare)(void *,uchar *, uchar *); + +int init_queue(QUEUE *queue,uint max_elements,uint offset_to_key, + pbool max_at_top, queue_compare compare, + void *first_cmp_arg); +int init_queue_ex(QUEUE *queue,uint max_elements,uint offset_to_key, + pbool max_at_top, queue_compare compare, + void *first_cmp_arg, uint auto_extent); +int reinit_queue(QUEUE *queue,uint max_elements,uint offset_to_key, + pbool max_at_top, queue_compare compare, + void *first_cmp_arg); +int resize_queue(QUEUE *queue, uint max_elements); +void delete_queue(QUEUE *queue); +void queue_insert(QUEUE *queue,uchar *element); +int queue_insert_safe(QUEUE *queue, uchar *element); +uchar *queue_remove(QUEUE *queue,uint idx); +#define queue_remove_all(queue) { (queue)->elements= 0; } +#define queue_is_full(queue) (queue->elements == queue->max_elements) +void _downheap(QUEUE *queue,uint idx); +void queue_fix(QUEUE *queue); +#define is_queue_inited(queue) ((queue)->root != 0) + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/service_versions.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/service_versions.h new file mode 100644 index 0000000..114957c --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/service_versions.h @@ -0,0 +1,24 @@ +/* Copyright (C) 2009 Sun Microsystems, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifdef _WIN32 +#define SERVICE_VERSION __declspec(dllexport) void * +#else +#define SERVICE_VERSION void * +#endif + +#define VERSION_my_snprintf 0x0100 +#define VERSION_thd_alloc 0x0100 + diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/sha1.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/sha1.h new file mode 100644 index 0000000..e476456 --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/sha1.h @@ -0,0 +1,66 @@ +/* Copyright (C) 2002, 2006 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* + This is the header file for code which implements the Secure + Hashing Algorithm 1 as defined in FIPS PUB 180-1 published + April 17, 1995. + + Many of the variable names in this code, especially the + single character names, were used because those were the names + used in the publication. + + Please read the file sha1.c for more information. + + Modified 2002 by Peter Zaitsev to better follow MySQL standards +*/ + + +enum sha_result_codes +{ + SHA_SUCCESS = 0, + SHA_NULL, /* Null pointer parameter */ + SHA_INPUT_TOO_LONG, /* input data too long */ + SHA_STATE_ERROR /* called Input after Result */ +}; + +#define SHA1_HASH_SIZE 20 /* Hash size in bytes */ + +/* + This structure will hold context information for the SHA-1 + hashing operation +*/ + +typedef struct SHA1_CONTEXT +{ + ulonglong Length; /* Message length in bits */ + uint32 Intermediate_Hash[SHA1_HASH_SIZE/4]; /* Message Digest */ + int Computed; /* Is the digest computed? */ + int Corrupted; /* Is the message digest corrupted? */ + int16 Message_Block_Index; /* Index into message block array */ + uint8 Message_Block[64]; /* 512-bit message blocks */ +} SHA1_CONTEXT; + +/* + Function Prototypes +*/ + +C_MODE_START + +int mysql_sha1_reset(SHA1_CONTEXT*); +int mysql_sha1_input(SHA1_CONTEXT*, const uint8 *, unsigned int); +int mysql_sha1_result(SHA1_CONTEXT* , uint8 Message_Digest[SHA1_HASH_SIZE]); + +C_MODE_END diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/sha2.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/sha2.h new file mode 100644 index 0000000..49dbac5 --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/sha2.h @@ -0,0 +1,72 @@ +/* Copyright (C) 2007 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef included_sha2_h +#define included_sha2_h + +#include + +#if defined(HAVE_YASSL) || defined(HAVE_OPENSSL) + +# ifdef HAVE_STDDEF_H +# include +# endif + +# ifndef HAVE_YASSL +# include + +# else + +#include "../extra/yassl/taocrypt/include/sha.hpp" + +# ifdef __cplusplus +extern "C" { +# endif + +#ifndef SHA512_DIGEST_LENGTH +#define SHA512_DIGEST_LENGTH TaoCrypt::SHA512::DIGEST_SIZE +#endif + +#ifndef SHA384_DIGEST_LENGTH +#define SHA384_DIGEST_LENGTH TaoCrypt::SHA384::DIGEST_SIZE +#endif + +#ifndef SHA256_DIGEST_LENGTH +#define SHA256_DIGEST_LENGTH TaoCrypt::SHA256::DIGEST_SIZE +#endif + +#ifndef SHA224_DIGEST_LENGTH +#define SHA224_DIGEST_LENGTH TaoCrypt::SHA224::DIGEST_SIZE +#endif + +#define GEN_YASSL_SHA2_BRIDGE(size) \ +unsigned char* SHA##size(const unsigned char *input_ptr, size_t input_length, \ + char unsigned *output_ptr); + +GEN_YASSL_SHA2_BRIDGE(512); +GEN_YASSL_SHA2_BRIDGE(384); +GEN_YASSL_SHA2_BRIDGE(256); +GEN_YASSL_SHA2_BRIDGE(224); + +#undef GEN_YASSL_SHA2_BRIDGE + +# ifdef __cplusplus +} +# endif + +# endif /* HAVE_YASSL */ + +#endif /* HAVE_OPENSSL || HAVE_YASSL */ +#endif /* included_sha2_h */ diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/sql_common.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/sql_common.h new file mode 100644 index 0000000..9e43d07 --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/sql_common.h @@ -0,0 +1,50 @@ +/* Copyright (C) 2003-2004, 2006 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + + +extern const char *unknown_sqlstate; +extern const char *cant_connect_sqlstate; +extern const char *not_error_sqlstate; + +#ifdef __cplusplus +extern "C" { +#endif + +extern CHARSET_INFO *default_client_charset_info; +MYSQL_FIELD *unpack_fields(MYSQL_DATA *data,MEM_ROOT *alloc,uint fields, + my_bool default_value, uint server_capabilities); +void free_rows(MYSQL_DATA *cur); +void free_old_query(MYSQL *mysql); +void end_server(MYSQL *mysql); +my_bool mysql_reconnect(MYSQL *mysql); +void mysql_read_default_options(struct st_mysql_options *options, + const char *filename,const char *group); +my_bool +cli_advanced_command(MYSQL *mysql, enum enum_server_command command, + const unsigned char *header, ulong header_length, + const unsigned char *arg, ulong arg_length, + my_bool skip_check, MYSQL_STMT *stmt); +unsigned long cli_safe_read(MYSQL *mysql); +void net_clear_error(NET *net); +void set_stmt_errmsg(MYSQL_STMT *stmt, NET *net); +void set_stmt_error(MYSQL_STMT *stmt, int errcode, const char *sqlstate, + const char *err); +void set_mysql_error(MYSQL *mysql, int errcode, const char *sqlstate); +#ifdef __cplusplus +} +#endif + +#define protocol_41(A) ((A)->server_capabilities & CLIENT_PROTOCOL_41) + diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/sslopt-case.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/sslopt-case.h new file mode 100644 index 0000000..ee6c83c --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/sslopt-case.h @@ -0,0 +1,28 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#if defined(HAVE_OPENSSL) && !defined(EMBEDDED_LIBRARY) + case OPT_SSL_KEY: + case OPT_SSL_CERT: + case OPT_SSL_CA: + case OPT_SSL_CAPATH: + case OPT_SSL_CIPHER: + /* + Enable use of SSL if we are using any ssl option + One can disable SSL later by using --skip-ssl or --ssl=0 + */ + opt_use_ssl= 1; + break; +#endif diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/sslopt-longopts.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/sslopt-longopts.h new file mode 100644 index 0000000..06422e5 --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/sslopt-longopts.h @@ -0,0 +1,45 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#if defined(HAVE_OPENSSL) && !defined(EMBEDDED_LIBRARY) + + {"ssl", OPT_SSL_SSL, + "Enable SSL for connection (automatically enabled with other flags). Disable with --skip-ssl.", + (uchar **) &opt_use_ssl, (uchar **) &opt_use_ssl, 0, GET_BOOL, NO_ARG, 0, 0, 0, + 0, 0, 0}, + {"ssl-ca", OPT_SSL_CA, + "CA file in PEM format (check OpenSSL docs, implies --ssl).", + (uchar **) &opt_ssl_ca, (uchar **) &opt_ssl_ca, 0, GET_STR, REQUIRED_ARG, + 0, 0, 0, 0, 0, 0}, + {"ssl-capath", OPT_SSL_CAPATH, + "CA directory (check OpenSSL docs, implies --ssl).", + (uchar **) &opt_ssl_capath, (uchar **) &opt_ssl_capath, 0, GET_STR, REQUIRED_ARG, + 0, 0, 0, 0, 0, 0}, + {"ssl-cert", OPT_SSL_CERT, "X509 cert in PEM format (implies --ssl).", + (uchar **) &opt_ssl_cert, (uchar **) &opt_ssl_cert, 0, GET_STR, REQUIRED_ARG, + 0, 0, 0, 0, 0, 0}, + {"ssl-cipher", OPT_SSL_CIPHER, "SSL cipher to use (implies --ssl).", + (uchar **) &opt_ssl_cipher, (uchar **) &opt_ssl_cipher, 0, GET_STR, REQUIRED_ARG, + 0, 0, 0, 0, 0, 0}, + {"ssl-key", OPT_SSL_KEY, "X509 key in PEM format (implies --ssl).", + (uchar **) &opt_ssl_key, (uchar **) &opt_ssl_key, 0, GET_STR, REQUIRED_ARG, + 0, 0, 0, 0, 0, 0}, +#ifdef MYSQL_CLIENT + {"ssl-verify-server-cert", OPT_SSL_VERIFY_SERVER_CERT, + "Verify server's \"Common Name\" in its cert against hostname used when connecting. This option is disabled by default.", + (uchar **) &opt_ssl_verify_server_cert, (uchar **) &opt_ssl_verify_server_cert, + 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, +#endif +#endif /* HAVE_OPENSSL */ diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/sslopt-vars.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/sslopt-vars.h new file mode 100644 index 0000000..9d25c33 --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/sslopt-vars.h @@ -0,0 +1,31 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#if defined(HAVE_OPENSSL) && !defined(EMBEDDED_LIBRARY) +#ifdef SSL_VARS_NOT_STATIC +#define SSL_STATIC +#else +#define SSL_STATIC static +#endif +SSL_STATIC my_bool opt_use_ssl = 0; +SSL_STATIC char *opt_ssl_ca = 0; +SSL_STATIC char *opt_ssl_capath = 0; +SSL_STATIC char *opt_ssl_cert = 0; +SSL_STATIC char *opt_ssl_cipher = 0; +SSL_STATIC char *opt_ssl_key = 0; +#ifdef MYSQL_CLIENT +SSL_STATIC my_bool opt_ssl_verify_server_cert= 0; +#endif +#endif diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/t_ctype.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/t_ctype.h new file mode 100644 index 0000000..1560001 --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/t_ctype.h @@ -0,0 +1,254 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* + Copyright (C) 1998, 1999 by Pruet Boonma, all rights reserved. + Copyright (C) 1998 by Theppitak Karoonboonyanan, all rights reserved. + Permission to use, copy, modify, distribute and sell this software + and its documentation for any purpose is hereby granted without fee, + provided that the above copyright notice appear in all copies. + Smaphan Raruenrom and Pruet Boonma makes no representations about + the suitability of this software for any purpose. It is provided + "as is" without express or implied warranty. +*/ + +/* LC_COLLATE category + Level information */ + +#ifndef _t_ctype_h +#define _t_ctype_h + +#define TOT_LEVELS 5 +#define LAST_LEVEL 4 /* TOT_LEVELS - 1 */ + +#define IGNORE 0 + + +/* level 1 symbols & order */ +enum l1_symbols { + L1_08 = TOT_LEVELS, + L1_18, + L1_28, + L1_38, + L1_48, + L1_58, + L1_68, + L1_78, + L1_88, + L1_98, + L1_A8, + L1_B8, + L1_C8, + L1_D8, + L1_E8, + L1_F8, + L1_G8, + L1_H8, + L1_I8, + L1_J8, + L1_K8, + L1_L8, + L1_M8, + L1_N8, + L1_O8, + L1_P8, + L1_Q8, + L1_R8, + L1_S8, + L1_T8, + L1_U8, + L1_V8, + L1_W8, + L1_X8, + L1_Y8, + L1_Z8, + L1_KO_KAI, + L1_KHO_KHAI, + L1_KHO_KHUAT, + L1_KHO_KHWAI, + L1_KHO_KHON, + L1_KHO_RAKHANG, + L1_NGO_NGU, + L1_CHO_CHAN, + L1_CHO_CHING, + L1_CHO_CHANG, + L1_SO_SO, + L1_CHO_CHOE, + L1_YO_YING, + L1_DO_CHADA, + L1_TO_PATAK, + L1_THO_THAN, + L1_THO_NANGMONTHO, + L1_THO_PHUTHAO, + L1_NO_NEN, + L1_DO_DEK, + L1_TO_TAO, + L1_THO_THUNG, + L1_THO_THAHAN, + L1_THO_THONG, + L1_NO_NU, + L1_BO_BAIMAI, + L1_PO_PLA, + L1_PHO_PHUNG, + L1_FO_FA, + L1_PHO_PHAN, + L1_FO_FAN, + L1_PHO_SAMPHAO, + L1_MO_MA, + L1_YO_YAK, + L1_RO_RUA, + L1_RU, + L1_LO_LING, + L1_LU, + L1_WO_WAEN, + L1_SO_SALA, + L1_SO_RUSI, + L1_SO_SUA, + L1_HO_HIP, + L1_LO_CHULA, + L1_O_ANG, + L1_HO_NOKHUK, + L1_NKHIT, + L1_SARA_A, + L1_MAI_HAN_AKAT, + L1_SARA_AA, + L1_SARA_AM, + L1_SARA_I, + L1_SARA_II, + L1_SARA_UE, + L1_SARA_UEE, + L1_SARA_U, + L1_SARA_UU, + L1_SARA_E, + L1_SARA_AE, + L1_SARA_O, + L1_SARA_AI_MAIMUAN, + L1_SARA_AI_MAIMALAI +}; + +/* level 2 symbols & order */ +enum l2_symbols { + L2_BLANK = TOT_LEVELS, + L2_THAII, + L2_YAMAK, + L2_PINTHU, + L2_GARAN, + L2_TYKHU, + L2_TONE1, + L2_TONE2, + L2_TONE3, + L2_TONE4 +}; + +/* level 3 symbols & order */ +enum l3_symbols { + L3_BLANK = TOT_LEVELS, + L3_SPACE, + L3_NB_SACE, + L3_LOW_LINE, + L3_HYPHEN, + L3_COMMA, + L3_SEMICOLON, + L3_COLON, + L3_EXCLAMATION, + L3_QUESTION, + L3_SOLIDUS, + L3_FULL_STOP, + L3_PAIYAN_NOI, + L3_MAI_YAMOK, + L3_GRAVE, + L3_CIRCUMFLEX, + L3_TILDE, + L3_APOSTROPHE, + L3_QUOTATION, + L3_L_PARANTHESIS, + L3_L_BRACKET, + L3_L_BRACE, + L3_R_BRACE, + L3_R_BRACKET, + L3_R_PARENTHESIS, + L3_AT, + L3_BAHT, + L3_DOLLAR, + L3_FONGMAN, + L3_ANGKHANKHU, + L3_KHOMUT, + L3_ASTERISK, + L3_BK_SOLIDUS, + L3_AMPERSAND, + L3_NUMBER, + L3_PERCENT, + L3_PLUS, + L3_LESS_THAN, + L3_EQUAL, + L3_GREATER_THAN, + L3_V_LINE +}; + +/* level 4 symbols & order */ +enum l4_symbols { + L4_BLANK = TOT_LEVELS, + L4_MIN, + L4_CAP, + L4_EXT +}; + +enum level_symbols { + L_UPRUPR = TOT_LEVELS, + L_UPPER, + L_MIDDLE, + L_LOWER +}; + +#define _is(c) (t_ctype[(c)][LAST_LEVEL]) +#define _level 8 +#define _consnt 16 +#define _ldvowel 32 +#define _fllwvowel 64 +#define _uprvowel 128 +#define _lwrvowel 256 +#define _tone 512 +#define _diacrt1 1024 +#define _diacrt2 2048 +#define _combine 4096 +#define _stone 8192 +#define _tdig 16384 +#define _rearvowel (_fllwvowel | _uprvowel | _lwrvowel) +#define _diacrt (_diacrt1 | _diacrt2) +#define levelof(c) ( _is(c) & _level ) +#define isthai(c) ( (c) >= 128 ) +#define istalpha(c) ( _is(c) & (_consnt|_ldvowel|_rearvowel|\ + _tone|_diacrt1|_diacrt2) ) +#define isconsnt(c) ( _is(c) & _consnt ) +#define isldvowel(c) ( _is(c) & _ldvowel ) +#define isfllwvowel(c) ( _is(c) & _fllwvowel ) +#define ismidvowel(c) ( _is(c) & (_ldvowel|_fllwvowel) ) +#define isuprvowel(c) ( _is(c) & _uprvowel ) +#define islwrvowel(c) ( _is(c) & _lwrvowel ) +#define isuprlwrvowel(c) ( _is(c) & (_lwrvowel | _uprvowel)) +#define isrearvowel(c) ( _is(c) & _rearvowel ) +#define isvowel(c) ( _is(c) & (_ldvowel|_rearvowel) ) +#define istone(c) ( _is(c) & _tone ) +#define isunldable(c) ( _is(c) & (_rearvowel|_tone|_diacrt1|_diacrt2) ) +#define iscombinable(c) ( _is(c) & _combine ) +#define istdigit(c) ( _is(c) & _tdig ) +#define isstone(c) ( _is(c) & _stone ) +#define isdiacrt1(c) ( _is(c) & _diacrt1) +#define isdiacrt2(c) ( _is(c) & _diacrt2) +#define isdiacrt(c) ( _is(c) & _diacrt) + +/* Function prototype called by sql/field.cc */ +void ThNormalize(uchar* ptr, uint field_length, const uchar* from, uint length); + +#endif diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/thr_alarm.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/thr_alarm.h new file mode 100644 index 0000000..fb90603 --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/thr_alarm.h @@ -0,0 +1,110 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* Prototypes when using thr_alarm library functions */ + +#ifndef _thr_alarm_h +#define _thr_alarm_h +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef USE_ALARM_THREAD +#define USE_ONE_SIGNAL_HAND /* One must call process_alarm */ +#endif +#ifdef HAVE_rts_threads +#undef USE_ONE_SIGNAL_HAND +#define USE_ALARM_THREAD +#define THR_SERVER_ALARM SIGUSR1 +#else +#define THR_SERVER_ALARM SIGALRM +#endif + +typedef struct st_alarm_info +{ + ulong next_alarm_time; + uint active_alarms; + uint max_used_alarms; +} ALARM_INFO; + +void thr_alarm_info(ALARM_INFO *info); + +#if defined(DONT_USE_THR_ALARM) || !defined(THREAD) + +#define USE_ALARM_THREAD +#undef USE_ONE_SIGNAL_HAND + +typedef my_bool thr_alarm_t; +typedef my_bool ALARM; + +#define thr_alarm_init(A) (*(A))=0 +#define thr_alarm_in_use(A) (*(A) != 0) +#define thr_end_alarm(A) +#define thr_alarm(A,B,C) ((*(A)=1)-1) +/* The following should maybe be (*(A)) */ +#define thr_got_alarm(A) 0 +#define init_thr_alarm(A) +#define thr_alarm_kill(A) +#define resize_thr_alarm(N) +#define end_thr_alarm(A) + +#else +#if defined(__WIN__) +typedef struct st_thr_alarm_entry +{ + rf_SetTimer crono; +} thr_alarm_entry; + +#else /* System with posix threads */ + +typedef int thr_alarm_entry; + +#define thr_got_alarm(thr_alarm) (**(thr_alarm)) + +#endif /* __WIN__ */ + +typedef thr_alarm_entry* thr_alarm_t; + +typedef struct st_alarm { + ulong expire_time; + thr_alarm_entry alarmed; /* set when alarm is due */ + pthread_t thread; + my_thread_id thread_id; + my_bool malloced; +} ALARM; + +extern uint thr_client_alarm; +extern pthread_t alarm_thread; + +#define thr_alarm_init(A) (*(A))=0 +#define thr_alarm_in_use(A) (*(A)!= 0) +void init_thr_alarm(uint max_alarm); +void resize_thr_alarm(uint max_alarms); +my_bool thr_alarm(thr_alarm_t *alarmed, uint sec, ALARM *buff); +void thr_alarm_kill(my_thread_id thread_id); +void thr_end_alarm(thr_alarm_t *alarmed); +void end_thr_alarm(my_bool free_structures); +sig_handler process_alarm(int); +#ifndef thr_got_alarm +my_bool thr_got_alarm(thr_alarm_t *alrm); +#endif + + +#endif /* DONT_USE_THR_ALARM */ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ +#endif /* _thr_alarm_h */ diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/thr_lock.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/thr_lock.h new file mode 100644 index 0000000..38f0478 --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/thr_lock.h @@ -0,0 +1,181 @@ +/* Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* For use with thr_lock:s */ + +#ifndef _thr_lock_h +#define _thr_lock_h +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +struct st_thr_lock; +extern ulong locks_immediate,locks_waited ; + +/** + Lock types are used to request a lock on a table. Changes in this enumeration + might affect transactional locks as well. + Important: if a new lock type is added, a matching lock description + must be added to sql_test.cc's lock_descriptions array. + @see set_handler_table_locks + @see read_lock_type_for_table +*/ +enum thr_lock_type { TL_IGNORE=-1, + TL_UNLOCK, /* UNLOCK ANY LOCK */ + /* + Parser only! At open_tables() becomes TL_READ or + TL_READ_NO_INSERT depending on the binary log format + (SBR/RBR) and on the table category (log table). + Used for tables that are read by statements which + modify tables. + */ + TL_READ_DEFAULT, + TL_READ, /* Read lock */ + TL_READ_WITH_SHARED_LOCKS, + /* High prior. than TL_WRITE. Allow concurrent insert */ + TL_READ_HIGH_PRIORITY, + /* READ, Don't allow concurrent insert */ + TL_READ_NO_INSERT, + /* + Write lock, but allow other threads to read / write. + Used by BDB tables in MySQL to mark that someone is + reading/writing to the table. + */ + TL_WRITE_ALLOW_WRITE, + /* + Write lock, but allow other threads to read. + Used by ALTER TABLE in MySQL to allow readers + to use the table until ALTER TABLE is finished. + */ + TL_WRITE_ALLOW_READ, + /* + WRITE lock used by concurrent insert. Will allow + READ, if one could use concurrent insert on table. + */ + TL_WRITE_CONCURRENT_INSERT, + /* Write used by INSERT DELAYED. Allows READ locks */ + TL_WRITE_DELAYED, + /* + parser only! Late bound low_priority flag. + At open_tables() becomes thd->update_lock_default. + */ + TL_WRITE_DEFAULT, + /* WRITE lock that has lower priority than TL_READ */ + TL_WRITE_LOW_PRIORITY, + /* Normal WRITE lock */ + TL_WRITE, + /* Abort new lock request with an error */ + TL_WRITE_ONLY}; + +enum enum_thr_lock_result { THR_LOCK_SUCCESS= 0, THR_LOCK_ABORTED= 1, + THR_LOCK_WAIT_TIMEOUT= 2, THR_LOCK_DEADLOCK= 3 }; + + +extern ulong max_write_lock_count; +extern ulong table_lock_wait_timeout; +extern my_bool thr_lock_inited; +extern enum thr_lock_type thr_upgraded_concurrent_insert_lock; + +/* + A description of the thread which owns the lock. The address + of an instance of this structure is used to uniquely identify the thread. +*/ + +typedef struct st_thr_lock_info +{ + pthread_t thread; + my_thread_id thread_id; + ulong n_cursors; +} THR_LOCK_INFO; + +/* + Lock owner identifier. Globally identifies the lock owner within the + thread and among all the threads. The address of an instance of this + structure is used as id. +*/ + +typedef struct st_thr_lock_owner +{ + THR_LOCK_INFO *info; +} THR_LOCK_OWNER; + + +typedef struct st_thr_lock_data { + THR_LOCK_OWNER *owner; + struct st_thr_lock_data *next,**prev; + struct st_thr_lock *lock; + pthread_cond_t *cond; + enum thr_lock_type type; + void *status_param; /* Param to status functions */ + void *debug_print_param; +} THR_LOCK_DATA; + +struct st_lock_list { + THR_LOCK_DATA *data,**last; +}; + +typedef struct st_thr_lock { + LIST list; + pthread_mutex_t mutex; + struct st_lock_list read_wait; + struct st_lock_list read; + struct st_lock_list write_wait; + struct st_lock_list write; + /* write_lock_count is incremented for write locks and reset on read locks */ + ulong write_lock_count; + uint read_no_write_count; + void (*get_status)(void*, my_bool); /* When one gets a lock */ + void (*copy_status)(void*,void*); + void (*update_status)(void*); /* Before release of write */ + void (*restore_status)(void*); /* Before release of read */ + my_bool (*check_status)(void *); + my_bool allow_multiple_concurrent_insert; +} THR_LOCK; + + +extern LIST *thr_lock_thread_list; +extern pthread_mutex_t THR_LOCK_lock; + +my_bool init_thr_lock(void); /* Must be called once/thread */ +#define thr_lock_owner_init(owner, info_arg) (owner)->info= (info_arg) +void thr_lock_info_init(THR_LOCK_INFO *info); +void thr_lock_init(THR_LOCK *lock); +void thr_lock_delete(THR_LOCK *lock); +void thr_lock_data_init(THR_LOCK *lock,THR_LOCK_DATA *data, + void *status_param); +enum enum_thr_lock_result thr_lock(THR_LOCK_DATA *data, + THR_LOCK_OWNER *owner, + enum thr_lock_type lock_type); +void thr_unlock(THR_LOCK_DATA *data); +enum enum_thr_lock_result thr_multi_lock(THR_LOCK_DATA **data, + uint count, THR_LOCK_OWNER *owner); +void thr_multi_unlock(THR_LOCK_DATA **data,uint count); +void +thr_lock_merge_status(THR_LOCK_DATA **data, uint count); +void thr_abort_locks(THR_LOCK *lock, my_bool upgrade_lock); +my_bool thr_abort_locks_for_thread(THR_LOCK *lock, my_thread_id thread); +void thr_print_locks(void); /* For debugging */ +my_bool thr_upgrade_write_delay_lock(THR_LOCK_DATA *data, + enum thr_lock_type new_lock_type); +void thr_downgrade_write_lock(THR_LOCK_DATA *data, + enum thr_lock_type new_lock_type); +my_bool thr_reschedule_write_lock(THR_LOCK_DATA *data); +#ifdef __cplusplus +} +#endif +#endif /* _thr_lock_h */ diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/typelib.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/typelib.h new file mode 100644 index 0000000..46106d1 --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/typelib.h @@ -0,0 +1,39 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + + +#ifndef _typelib_h +#define _typelib_h + +#include "my_alloc.h" + +typedef struct st_typelib { /* Different types saved here */ + unsigned int count; /* How many types */ + const char *name; /* Name of typelib */ + const char **type_names; + unsigned int *type_lengths; +} TYPELIB; + +extern my_ulonglong find_typeset(char *x, TYPELIB *typelib,int *error_position); +extern int find_type_or_exit(const char *x, TYPELIB *typelib, + const char *option); +extern int find_type(char *x, const TYPELIB *typelib, unsigned int full_name); +extern void make_type(char *to,unsigned int nr,TYPELIB *typelib); +extern const char *get_type(TYPELIB *typelib,unsigned int nr); +extern TYPELIB *copy_typelib(MEM_ROOT *root, TYPELIB *from); + +extern TYPELIB sql_protocol_typelib; + +#endif /* _typelib_h */ diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/violite.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/violite.h new file mode 100644 index 0000000..2720047 --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/violite.h @@ -0,0 +1,222 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* + * Vio Lite. + * Purpose: include file for Vio that will work with C and C++ + */ + +#ifndef vio_violite_h_ +#define vio_violite_h_ + +#include "my_net.h" /* needed because of struct in_addr */ + + +/* Simple vio interface in C; The functions are implemented in violite.c */ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +enum enum_vio_type +{ + VIO_CLOSED, VIO_TYPE_TCPIP, VIO_TYPE_SOCKET, VIO_TYPE_NAMEDPIPE, + VIO_TYPE_SSL, VIO_TYPE_SHARED_MEMORY +}; + + +#define VIO_LOCALHOST 1 /* a localhost connection */ +#define VIO_BUFFERED_READ 2 /* use buffered read */ +#define VIO_READ_BUFFER_SIZE 16384 /* size of read buffer */ + +Vio* vio_new(my_socket sd, enum enum_vio_type type, uint flags); +#ifdef __WIN__ +Vio* vio_new_win32pipe(HANDLE hPipe); +Vio* vio_new_win32shared_memory(NET *net,HANDLE handle_file_map, + HANDLE handle_map, + HANDLE event_server_wrote, + HANDLE event_server_read, + HANDLE event_client_wrote, + HANDLE event_client_read, + HANDLE event_conn_closed); +size_t vio_read_pipe(Vio *vio, uchar * buf, size_t size); +size_t vio_write_pipe(Vio *vio, const uchar * buf, size_t size); +int vio_close_pipe(Vio * vio); +#else +#define HANDLE void * +#endif /* __WIN__ */ + +void vio_delete(Vio* vio); +int vio_close(Vio* vio); +void vio_reset(Vio* vio, enum enum_vio_type type, + my_socket sd, HANDLE hPipe, uint flags); +size_t vio_read(Vio *vio, uchar * buf, size_t size); +size_t vio_read_buff(Vio *vio, uchar * buf, size_t size); +size_t vio_write(Vio *vio, const uchar * buf, size_t size); +int vio_blocking(Vio *vio, my_bool onoff, my_bool *old_mode); +my_bool vio_is_blocking(Vio *vio); +/* setsockopt TCP_NODELAY at IPPROTO_TCP level, when possible */ +int vio_fastsend(Vio *vio); +/* setsockopt SO_KEEPALIVE at SOL_SOCKET level, when possible */ +int vio_keepalive(Vio *vio, my_bool onoff); +/* Whenever we should retry the last read/write operation. */ +my_bool vio_should_retry(Vio *vio); +/* Check that operation was timed out */ +my_bool vio_was_interrupted(Vio *vio); +/* Short text description of the socket for those, who are curious.. */ +const char* vio_description(Vio *vio); +/* Return the type of the connection */ +enum enum_vio_type vio_type(Vio* vio); +/* Return last error number */ +int vio_errno(Vio*vio); +/* Get socket number */ +my_socket vio_fd(Vio*vio); +/* Remote peer's address and name in text form */ +my_bool vio_peer_addr(Vio *vio, char *buf, uint16 *port, size_t buflen); +my_bool vio_poll_read(Vio *vio,uint timeout); +my_bool vio_peek_read(Vio *vio, uint *bytes); +ssize_t vio_pending(Vio *vio); + +#ifdef HAVE_OPENSSL +#include +#if OPENSSL_VERSION_NUMBER < 0x0090700f +#define DES_cblock des_cblock +#define DES_key_schedule des_key_schedule +#define DES_set_key_unchecked(k,ks) des_set_key_unchecked((k),*(ks)) +#define DES_ede3_cbc_encrypt(i,o,l,k1,k2,k3,iv,e) des_ede3_cbc_encrypt((i),(o),(l),*(k1),*(k2),*(k3),(iv),(e)) +#endif + +#define HEADER_DES_LOCL_H dummy_something +#define YASSL_MYSQL_COMPATIBLE +#ifndef YASSL_PREFIX +#define YASSL_PREFIX +#endif +/* Set yaSSL to use same type as MySQL do for socket handles */ +typedef my_socket YASSL_SOCKET_T; +#define YASSL_SOCKET_T_DEFINED +#include +#include + +#ifndef EMBEDDED_LIBRARY + +struct st_VioSSLFd +{ + SSL_CTX *ssl_context; +}; + +int sslaccept(struct st_VioSSLFd*, Vio *, long timeout); +int sslconnect(struct st_VioSSLFd*, Vio *, long timeout); + +struct st_VioSSLFd +*new_VioSSLConnectorFd(const char *key_file, const char *cert_file, + const char *ca_file, const char *ca_path, + const char *cipher); +struct st_VioSSLFd +*new_VioSSLAcceptorFd(const char *key_file, const char *cert_file, + const char *ca_file,const char *ca_path, + const char *cipher); +void free_vio_ssl_acceptor_fd(struct st_VioSSLFd *fd); +#endif /* ! EMBEDDED_LIBRARY */ +#endif /* HAVE_OPENSSL */ + +#ifdef HAVE_SMEM +size_t vio_read_shared_memory(Vio *vio, uchar * buf, size_t size); +size_t vio_write_shared_memory(Vio *vio, const uchar * buf, size_t size); +int vio_close_shared_memory(Vio * vio); +#endif + +void vio_end(void); + +#ifdef __cplusplus +} +#endif + +#if !defined(DONT_MAP_VIO) +#define vio_delete(vio) (vio)->viodelete(vio) +#define vio_errno(vio) (vio)->vioerrno(vio) +#define vio_read(vio, buf, size) ((vio)->read)(vio,buf,size) +#define vio_write(vio, buf, size) ((vio)->write)(vio, buf, size) +#define vio_blocking(vio, set_blocking_mode, old_mode)\ + (vio)->vioblocking(vio, set_blocking_mode, old_mode) +#define vio_is_blocking(vio) (vio)->is_blocking(vio) +#define vio_fastsend(vio) (vio)->fastsend(vio) +#define vio_keepalive(vio, set_keep_alive) (vio)->viokeepalive(vio, set_keep_alive) +#define vio_should_retry(vio) (vio)->should_retry(vio) +#define vio_was_interrupted(vio) (vio)->was_interrupted(vio) +#define vio_close(vio) ((vio)->vioclose)(vio) +#define vio_peer_addr(vio, buf, prt, buflen) (vio)->peer_addr(vio, buf, prt, buflen) +#define vio_timeout(vio, which, seconds) (vio)->timeout(vio, which, seconds) +#endif /* !defined(DONT_MAP_VIO) */ + +/* This enumerator is used in parser - should be always visible */ +enum SSL_type +{ + SSL_TYPE_NOT_SPECIFIED= -1, + SSL_TYPE_NONE, + SSL_TYPE_ANY, + SSL_TYPE_X509, + SSL_TYPE_SPECIFIED +}; + + +/* HFTODO - hide this if we don't want client in embedded server */ +/* This structure is for every connection on both sides */ +struct st_vio +{ + my_socket sd; /* my_socket - real or imaginary */ + HANDLE hPipe; + my_bool localhost; /* Are we from localhost? */ + int fcntl_mode; /* Buffered fcntl(sd,F_GETFL) */ + struct sockaddr_storage local; /* Local internet address */ + struct sockaddr_storage remote; /* Remote internet address */ + int addrLen; /* Length of remote address */ + enum enum_vio_type type; /* Type of connection */ + char desc[30]; /* String description */ + char *read_buffer; /* buffer for vio_read_buff */ + char *read_pos; /* start of unfetched data in the + read buffer */ + char *read_end; /* end of unfetched data */ + /* function pointers. They are similar for socket/SSL/whatever */ + void (*viodelete)(Vio*); + int (*vioerrno)(Vio*); + size_t (*read)(Vio*, uchar *, size_t); + size_t (*write)(Vio*, const uchar *, size_t); + int (*vioblocking)(Vio*, my_bool, my_bool *); + my_bool (*is_blocking)(Vio*); + int (*viokeepalive)(Vio*, my_bool); + int (*fastsend)(Vio*); + my_bool (*peer_addr)(Vio*, char *, uint16*, size_t); + void (*in_addr)(Vio*, struct sockaddr_storage*); + my_bool (*should_retry)(Vio*); + my_bool (*was_interrupted)(Vio*); + int (*vioclose)(Vio*); + void (*timeout)(Vio*, unsigned int which, unsigned int timeout); +#ifdef HAVE_OPENSSL + void *ssl_arg; +#endif +#ifdef HAVE_SMEM + HANDLE handle_file_map; + char *handle_map; + HANDLE event_server_wrote; + HANDLE event_server_read; + HANDLE event_client_wrote; + HANDLE event_client_read; + HANDLE event_conn_closed; + size_t shared_memory_remain; + char *shared_memory_pos; + NET *net; +#endif /* HAVE_SMEM */ +}; +#endif /* vio_violite_h_ */ diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/waiting_threads.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/waiting_threads.h new file mode 100644 index 0000000..1e58052 --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/waiting_threads.h @@ -0,0 +1,130 @@ +/* Copyright (C) 2008 MySQL AB, 2008-2009 Sun Microsystems, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef _waiting_threads_h +#define _waiting_threads_h + +#include +#include + +#include + +C_MODE_START + +typedef struct st_wt_resource_id WT_RESOURCE_ID; +typedef struct st_wt_resource WT_RESOURCE; + +typedef struct st_wt_resource_type { + my_bool (*compare)(const void *a, const void *b); + const void *(*make_key)(const WT_RESOURCE_ID *id, uint *len); /* not used */ +} WT_RESOURCE_TYPE; + +struct st_wt_resource_id { + ulonglong value; + const WT_RESOURCE_TYPE *type; +}; +/* the below differs from sizeof(WT_RESOURCE_ID) by the amount of padding */ +#define sizeof_WT_RESOURCE_ID (sizeof(ulonglong)+sizeof(void*)) + +#define WT_WAIT_STATS 24 +#define WT_CYCLE_STATS 32 +extern ulonglong wt_wait_table[WT_WAIT_STATS]; +extern uint32 wt_wait_stats[WT_WAIT_STATS+1]; +extern uint32 wt_cycle_stats[2][WT_CYCLE_STATS+1]; +extern uint32 wt_success_stats; + +typedef struct st_wt_thd { + /* + XXX + there's no protection (mutex) against concurrent access of the + dynarray below. it is assumed that a caller will have it anyway + (not to protect this array but to protect its own - caller's - + data structures), and we'll get it for free. A caller needs to + ensure that a blocker won't release a resource before a blocked + thread starts waiting, which is usually done with a mutex. + + If the above assumption is wrong, we'll need to add a mutex here. + */ + DYNAMIC_ARRAY my_resources; + /* + 'waiting_for' is modified under waiting_for->lock, and only by thd itself + 'waiting_for' is read lock-free (using pinning protocol), but a thd object + can read its own 'waiting_for' without any locks or tricks. + */ + WT_RESOURCE *waiting_for; + LF_PINS *pins; + + /* pointers to values */ + const ulong *timeout_short; + const ulong *deadlock_search_depth_short; + const ulong *timeout_long; + const ulong *deadlock_search_depth_long; + + /* + weight relates to the desirability of a transaction being killed if it's + part of a deadlock. In a deadlock situation transactions with lower weights + are killed first. + + Examples of using the weight to implement different selection strategies: + + 1. Latest + Keep all weights equal. + 2. Random + Assight weights at random. + (variant: modify a weight randomly before every lock request) + 3. Youngest + Set weight to -NOW() + 4. Minimum locks + count locks granted in your lock manager, store the value as a weight + 5. Minimum work + depends on the definition of "work". For example, store the number + of rows modifies in this transaction (or a length of REDO log for a + transaction) as a weight. + + It is only statistically relevant and is not protected by any locks. + */ + ulong volatile weight; + /* + 'killed' is indirectly protected by waiting_for->lock because + a killed thread needs to clear its 'waiting_for' and thus needs a lock. + That is a thread needs an exclusive lock to read 'killed' reliably. + But other threads may change 'killed' from 0 to 1, a shared + lock is enough for that. + */ + my_bool killed; +#ifndef DBUG_OFF + const char *name; +#endif +} WT_THD; + +#define WT_TIMEOUT ETIMEDOUT +#define WT_OK 0 +#define WT_DEADLOCK -1 +#define WT_DEPTH_EXCEEDED -2 +#define WT_FREE_TO_GO -3 + +void wt_init(void); +void wt_end(void); +void wt_thd_lazy_init(WT_THD *, const ulong *, const ulong *, const ulong *, const ulong *); +void wt_thd_destroy(WT_THD *); +int wt_thd_will_wait_for(WT_THD *, WT_THD *, const WT_RESOURCE_ID *); +int wt_thd_cond_timedwait(WT_THD *, pthread_mutex_t *); +void wt_thd_release(WT_THD *, const WT_RESOURCE_ID *); +#define wt_thd_release_all(THD) wt_thd_release((THD), 0) +my_bool wt_resource_id_memcmp(const void *, const void *); + +C_MODE_END + +#endif diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/include/wqueue.h b/hdssd/external/linux/mysql-connector-c-6.0.2/include/wqueue.h new file mode 100644 index 0000000..658f3d6 --- /dev/null +++ b/hdssd/external/linux/mysql-connector-c-6.0.2/include/wqueue.h @@ -0,0 +1,27 @@ + +#ifndef _wqueue_h +#define _wqueue_h + +#include +#include + +/* info about requests in a waiting queue */ +typedef struct st_pagecache_wqueue +{ + struct st_my_thread_var *last_thread; /* circular list of waiting + threads */ +} WQUEUE; + +#ifdef THREAD +void wqueue_link_into_queue(WQUEUE *wqueue, struct st_my_thread_var *thread); +void wqueue_unlink_from_queue(WQUEUE *wqueue, struct st_my_thread_var *thread); +void wqueue_add_to_queue(WQUEUE *wqueue, struct st_my_thread_var *thread); +void wqueue_add_and_wait(WQUEUE *wqueue, + struct st_my_thread_var *thread, + pthread_mutex_t *lock); +void wqueue_release_queue(WQUEUE *wqueue); +void wqueue_release_one_locktype_from_queue(WQUEUE *wqueue); + +#endif + +#endif diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/libmysql.so b/hdssd/external/linux/mysql-connector-c-6.0.2/libmysql.so new file mode 100644 index 0000000000000000000000000000000000000000..fafb0347091c6f23603078f5a3d6475af0a820ce GIT binary patch literal 2645352 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

$+6Jyub^`+@N>8qqh6H!J#C;!zi_^q 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

F`{_ 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
  • Upc?gfW!U&$i-&5-UvGNo^ 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%0A8XW5puulLpI<_4-vza-%AKR-xCd`LI`Cb}^f=!~ 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

    `=#J4NoszH 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 z

    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%0DX`?L?5P)&`0TG^l|zGeUd&!pQg{yXX$hF zdHMo1*_L`UZWIzD3`r@6dPYd-Q$!0sWAEL_emV&`;@Sv`#;#U(he< zP+ChO-q{GW7afs~M0?Yb=_qtmIvO3FjzPzyW6?geFCCkXL&v54=#S`+=}+iS>3H;K z^yl;!bbLAi?N2A91L#C_Vmb+(lukw`r&G`==~Q%TIt`tcPDiJwGte37Omt>C3!RnD zMrWsU&^hT`bZ$Bi{Ux234$+6s62}q4=;83L7~);nP4A)i();NB^a1)HeTY6xAEA%Z z$LQnq3Hl^`iat%Bq0iFi==1ai`XYUazD!@CuhQ4(>+}u!CVh*(P2ZvK()Z~5^aJ`K z{fK@{KcSz}&uE=~PQRdE(xEhOnxRFADVCTQ9g&Vihv=KRRJYJu>236OdI!Ce-bL@G z_t1Okee{0%0DX`?L?5P)&`0TG^l|zGeUd&!pQg{yXX$hFdHMo1*_L z`UZWIzD3`r@6dPYd-Q$!0sWAEL_emV&`;@Sv`#;#U(heq#8uo|oZYe6sw0qekeumNlYo4{tU1#AV|z;>_$>;${OZmbOd1?RwdZ~6a~dVaZmz$ z4N8Jipfo50%7SvBJg5LFf=Zw=r~;~jYM?r(0cwI;pf;!j>VkTpK4<_Mf<~Y*Xabso zW}rD}0a}7qpfzX%+JbhVJ?H>Bf=-|_=mNTeZ$LNjE%**}2R%Sf&kPifcAdnvv00luIP#6>eML{u89FzcGgOZ>WC=JShvY;F&4=R9) zpc1GIs(`AX8mJCxfSRBds153Xx}YAY4;p}mpb=;cnt-OD8E6h#fR>;YXbswcwxAto z4?2L3pcCi}x`3|W8_*4W3%�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≪R>$l6_cTF9?&gpnhN5^$F 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

    9cAKSK&JTLtSfqSD`|Ek;Md7Ih%=LV-MR;P7 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

    iz6~IHWBnd)v6OqK8GJv>Pj530CPT z=;PGl^P2_h4YDq9o63;DTDIbIXwB1M?P>SfxTPS0&nlI_SiOiQGCdG)j6?xSAm2Ra zEAtAZ%M9~*;>z*r2%RdN1Z-OqwlP~pC>2J^Ck;B%x<+Xyqq%ch0C8anb5_Mna$J+0 zM*!C_cgwTGY}K%LfzSm2N0C6P1ynv(l=h-1nT+<;dqJ2( zb@tF30U#AxUAsUJD2kAUda&fd_ceuF-MDCqktqH9g)@divzgIpPL7|eaV)`WGvFGM zV5f$3Zj!L$^dB~ym*om9x>gSUY1@_bjJuP&?5^p7)cLckb3hVWcy0x&4Z$MCU~Bf( z8ru)RSgCAAPjf5q7(RS{_8P|@*|c`UvIW@ zvczacP#oO-a^a}kI=jKdK{z- z>&wS1r*qV;vYrwyJ7F_SSY;39=JE+UbXG^&eMUG~fbhpYn!ls7H7CQQ5)9CB?m!=Z zXIWRYDAkrVcQa+u_OKF~u?sDmKHv=>pb@TC6BD?cN^de7kGr5NN19K(k1;E#ZWm$1 zck{Z2{DC=ect~!6yq))65f6$UejNg2vIY`tX-gYlr%VhNuJJ)H-W|OBXp@-z^YA$* zFO}=GtCH}$TZ<(G5Z2MgZ08LA7x)gC>GZ3G!#3sEbBH6ylzdlryF64=sl>c8n2A4J@V+0@dMbZ32p@AhtUr-CG-hr21;`T4fA?oFeyG)1ZIRQ@P0+X zE%oX{G|kxGeRS~RlQnEYY!6Chx%&nZ%C!x1=I@aT?%9<{NwQO7A(scm0OYpmKJoyn7Cacw8o}D38g`0v2ZEnk6y@k?7Lvqe^uFyzCVtXGoKo8Boi?g1A zn#s)RW>z4xxy@=&WV-$Q=3`WFJ-I^7>v#JLaCG4=L!;6fX{BXSXJ1I6BZvY6wS%tk zV4wIl;kS-Ukyv#Ec;f`*g{GRR&4q|RwdnBls*9KXqc^ktg^^$%ql*dFytZ(mk&Ves zToGMW&}0Nrf^K5p!_-?f)6lG(U4P3V37SSRjuzJhV`g_1E{NOIQabVOE#6c;CIxB# zL<15h^YmToF9YfIj%J>!0Vf@G=TFqPzz#Qq!mC|VEmcy21i8DS@UbP4izU+&=Edt7 ze|xZt0D^hNi+sR+o`2*R;SFr)734k=HBI=jiiv_AxM|2lPRnGA*pyvqfrBLDK_|jD zKxc==5-H7O&b0#UIMKiue>2(um*?PHOs~kRczms45Nf^yr|XfjE@1^6LM40(1ERMr za@2~@Z?kWWmArQfyr#ouCO~6>f%aDdF0$H;{LDKUIEr|eQU(@su-Z*E*R<3;Y> zseimGXudRH55+_5CzC2aUOEtXE1`Gog~_J&0%iy=__k`ncodm@_4{@JeeHQxFEns& zK5U(vFq*7V7tV2(rf3y>m4?wcqiHl-jyR2Cot*&jyljIZ!AiCj#$KxDMw0YbNa8qrg#PHTO!cQXf}YP(zRace^4`%kk6?(QA9LPtojdvbLFMJ-{f3jQG* zMj>75dDzqFH3B9MZ9=gkoK8n*qI!Ku>lQQ<3}56K^5>zIM%237P56)tc58_OlZ;~8 z!nf&nICZ8nwT3+c@O5Bklus2~r*^BI!6^5mYG?Y*v^QLLZtF ziV|~~v<}Q7ZInTI5n3=!YAgTURZ}x*xA4P_UNYWUiF8ykEWy5X8=wDXxuiDxc`{ae zuGMH((wpX7wY$AR(=AL0(g(3@IG?ZXz#@QK#)=Q9v4hXk*;8-c#pl2j!TL>cdT==1 zyuI2`N^iTqokGJDHDFKiQs0Pm3}hei==K)FI%&8IbB8gFCCR1=uCuz7ji)SL4%qyCJ zVi@L&5sXHOfEx!<=I1a|<=8inWHYl_ZhW!>Rtm!tk1mgXS2=e*pY8P#sJK@n5iQAJE;*fZ`5 z2uAU6R2jom2f)mqN1L%`A;s&TZpzzh`XjZ2MF4Q*b%Z8m2Fr#qdd%;5BwLHna9{n- z540xX@%?bwoE>sEv2JhHz5w^#ec5^iGOL)cYR{`euoeuJ<5M4ORT(pnK3d{jaEE!* zI?7bT9XrT0KEoTUlYE>rw3uW0d=#>a?{zvxhAR$3H{95N(|ZEq%{q_3a7e>HJiLQz z#c^{>#+Gm_4%g>y;fzN;+WO~{?NGy+o!#FFnU0nOXbW*qFiCD}JLlX1i+aCBFn;JOF<=Z8;rSzyk*WCV?K7J84G84wlFNl}IT_DXySBzG@8@AL~M zqFmgdcSH1KFbIXPl=^Zt=+3bC;d?9ST;}nDr8tsc7NEB^(HZ2%_P|aF`c{*_38%60 z2r)WT$dTIeR1;~h)hBqZ+G^?EG}!XVGgyQ3i<^fO@Dp!mQ(4atZx^LJ;UrV!a@~UK6H#vInv{@mdYf8Ifc66Rwh5G43u;vPb446RYWP_MMyG5SfstVmVJiC8H&CtO z>-kn6hAbXhz>-ikPoUul;&i*d=G0m-y58APjpD#!Z7X@S%pVxF@ zXUT#4fpiY~6g+XPPBrreL=500_>7fg1PG%WD_|D1-3(1aENVbn7SaxFKh5tLdAztl ziVr{rmJn(^m~zhuPAfylD$ilrFf?pZI@UL@&#pnRdVPr)Tv?lqz5S;MbPF5dylQT7 z(-gz7n>K86u)(Y^9Zz>mIns{}yD2q=z&qgUi*E%FhHa|r8-`TD9A&vp^mI4@2ddHo z!^&NroM+Myr~%x}ibu2u38io5{cg*&w0mvy8sXOZ#JI<}l7=`|c&eRq%qh>s+bb`b zYb-X8@~UVsKQZhVTR}IWeO$n?`6qHkFkjwM7<#{J1<)(?m6aOIpRnxsdgk488PirW zC(gMewSa~pIhed5^i8vLInj|x|-Jp@3Xo7%=iMG_paX3HcCNU5E^m+%t z^9k(1QzA6@AnT^ugE8AID9ZcTuF#JgsY)@u$Gpcz7%Meqx6Jy$cyj17m8Po@0ZLVF zj1m7}MWL$ZvJn5xJrr^+5X?#~?UIrKCmMq-BG^!yg4e;5*)2KeYH~_BgI3D{ZQagT z+^Et76vFLKFR`lvdN4i!u6qNx(ld2TxE@51tjq_Ux5C&7JOdY(LNDdRtH}wIhYptC zpKuEgiB3|zSal=q2n9CD8PZl-?ef+myfw!+hUX!TX#P^L*~u4C>O3U^gn#rQ?vgi{4X&nyf^C znNMZfIk}8qvV!L#vPWDQf+jYRWr=DDmndbhTnuT(aR^M2H+bv$41IZIj02feZOv@Y zwV6y*C^QTEVMgGte`=K;QYAH2oIMZ1av<81$U_}?CAQHs0sy3585Ft92*vg(jL-{q zqb=|(VSqyA?>|D@$udnNysK~o-I7Rr%gUx()jqe#VfHBVKRXnpq}D-+O{S%F8Jgy7 zIj4!m8lDjG;Bmdf?^JUYdyht^M{YoF%GbG%2{3suLglRllA9oJw1EJSum{y~g<)qs zL(2ymsJZrUeRc@Kj7$uk$6yT++#B}H0>$R)0zDnzW60gRyEMlfWa;C@?IDZHQkYZ> zZhrIb5*5I%${@s64gQGh@h+W}ct;frLm4iJ1E@5jLCAb)Ys=-C!>Vmy0IAPQ*+aRG zahO0WUC>|Wg1G#FB2{{I)e8mYMHze0d}8=vpSA_?SL1IdUjU=Q6!DHZs?{+;!h|3q z9AV0%Z()gI@^A|1P^t@5^;c`wGXQFn5u3*6-aedc!*AbZ5zZ8ujQ$5^g{9Lhqh)z_ z*iru+kVo9=pVnX$-CjGSb^QuOgDQU{kTUGjT-OG`c*|iJtB6GDH(GB?`lKHKa}@?R zqhQ=4^GwB3LF!agy?^8K%?JkLfL3cXrzqC^0p1_GnH+qV999-U=Sj27aFaxTyzEfk z!qq5Vy-GNb*T^HXdC4xaG-XlLs2Ta8HE9IbTn>wwdsy!bYEX+Jdf*H{QxRqUWO=|m zv8?K_JnEWNv*q0-%ezoc%5_1fYD2m?tAom1HcO33K}IK+hjlSpCxPXDUdcV2DTG-b zJLw?W^@B5lI`d2PRk%rV0HeS$qZF{oY!3!c`n_;t%s6iRuGAY^mfVnox#ywj^*YPk zx45RJ%C*@LJE*fzFa>O_g(7LHD(jKAhOx|P_j?H-^<0+KdWF*7k|;sUn7>XFBTmj8 z;(!w3gfRBL`KEn)xjkFkMJ!#i2?M)Q78#@}<6~Xus$C&4t4~YzvJG(}hw4wZWKFB| zUk(b1>EhrW;PtaRrjQaRNgS?=I_&*+}hMz0#w z(xL^*^R%39C@8Z>aUJAdU@PatM$DK&4x=p!RUAU`BxTbQkd@Yi!!Qmxf8Ayad8jj) zCL1sBkhgn$jQpp`j2J>IRaQ3g8kr)c(7VaNYSL_}rL{@qrvPW1<@V$dn&-=2WzDcXs3tA+n<+bD< z_Hs+mV^7YMU}tq9gZs0?Cw+{tE(rgts#ipup(%98=}O@a^}B;~y+QkgM5~G0NDfAp ze{d`8M*=&;J~R2o8_bfSu;w{50)S(0WU_qE1Zg;mBN9LCuFli7umX&f!8kEt0EBR# zp3hIjwP!pRs4}rg+?VhS)Zz`Ts@g4`JY*J))6tsdGrk#yeR+RoJow`$wXvVGy#4vr z5|(?FxRbw%wTz-XMjO^74 zxm;{(uondZ&}J0p9Fdf@!^K%ghlEN5G~7}w)^T!V7s1-ZW_?o@=tE{I(6_qQ80=$q z$>h>{*(g7Us4|2{!=8Z%sE@5JB~=O}T9Xi6j-a9thJ{(l8{twy&xYbz156+SDeK8A zn`}z68Nh9*lZ^IAAj@TR2vhD#bv#3hFnaZ1Sww_>5JS4$&^ekETpM?BfCQ*D&R6BPk~wFlfjR61LXX;lDW z-Y`&HsyIyj&G}-{_42~R4*^oT!Uo}+EnPUW){J2c{AdygbJZqxG*la*I|l1LGQ^8u zAJ#=)o4ML#(&S_sS|c`V>w1lqTK1iIcLz2fC8u42CW(n3b!yT9TzNW4mrND1Bg&_t zvIU#1l#>wb7|5*w8rlUq&E!Ri^n``b@@P*HH)w|C?gve@@E>!LN5JKD(eL}vPWlh6 zHBYQG%HUjp*!a0-sWqZJ3mxtZh1pPvdUc%7jvlc&3p58F;QT}2icWM%LQuB{d@QVf zXuDLKtW>hv@~@wm2xkGo^W`~v8#^l9rI6MvbpU2PD#}dO`6^gpGfKLH>H+f~n(PO? zTJwnMbc8q2I-I8#s+k>rK8Jop`+DGM?aZb~#&oo$mMw9};?@=dEEC*->h>gyywOHP zqFebS;rodlTS7G;RkTTm04`uvtT9%t8)Vqf)apZFlljY6oj}Y$)>9Hq-2`cv zlq0m4yt^uW43YwB8MQ8UM+>i2KV=b56`0OYYMMQL(^kEiPN_%MAG5yi3UUS+xjfi! z7fu{Sl(14(6S++(6ltV#lY-AktjA5~mv=bp!GTxfq#H=+>>VqO<)t;9TLZ140%`>}?6+J8}#X%d_kk160v zS0oVzQO%^sk7ges;z2!pyTpI1wl~tVn$##-mVg>%7B*W;!rzuBH&JtlhaS2aVKjgf zyA5Pl`P&fGS!v2nT9O&2_%R{yoP@2%r;EeaTWX=fs?ha{Y&_n7Y1%BTc%-n?bh7`t zgN=eRc=b@c-NvVB8+^BVMFucUSh>ugu$C5bh6ww`dpAS&)2SkWnhe#I$Z7JLzOJQ# zN9uF~KR-Tumq-#lv2!$f#RsALWXZaNK;JF2oS{}`+B%RuJ#YchJn)nY)IbyNF)pu}XM-)T5<*$Kq&};Vcf2I+gPMv}L!j@iPs$s?lAjLQ z=Qblw$8BUWOKy1s1TVO?=9(3gkFrtMs!~)RtO}=Z!hr37*Ho0#4OqUYDvVZ|VRe3R zb&C!;IRC8V8TMz}t3~;hgX+09Sp!Q2*sdj2DCej|q%8VaJGJ;2FvH~y!p~4Ts#l(h zrOg;BBv_%07urHgQ=eU*0$dO+0&i|azrr(jF`6L9Z2_5VqXNV% zb$~0JtH{+0bEzW(c}-H^}aXX5&=*~iv?314~dxc(de&ORSsKYrl@ z^3S*bT3dUDpZ~NP|C`^lJH^+3^;hk}7=Jt`zJ7{d|50`Q&;ODACcb{pE??vLd5;*s z|9I^P-^9D|XW#eh|!%>$%ab5i6pW&PO`XAo@W&J9?{<-*|f9=QrFa7#h&oBM@`1+&2^_QAE ze7*VC+S;?dw#ut{k8wbw<~{Q{o*J85#MlxAs;{b z^?#^e{pi>Kw!ZeC@BjT@@F~t%T>oRg{>Sfm{cqx0jxetOEx-P^-t+qZ-d+EtU;m|F z|K&fx2dY0`ufFHE{}X>HyYc+r_#J!y-}oJS|IkA*@A3X2NB-^O+E_4m8$zx>)S>4Go6_H}*z-fzap z_0Ki?seRA?{{jB;Uh)3l{p~0G@!EHP`xo`~`@gC$`MY}V?7jFIzy9EV+4z6>KkSOXfuDUF3mx+o c`j7j2?D?nv;qUS`Yyb5>w@+;UwYK*E0HfGdCIA2c literal 0 HcmV?d00001 diff --git a/hdssd/external/linux/mysql-connector-c-6.0.2/libmysqlclient.a b/hdssd/external/linux/mysql-connector-c-6.0.2/libmysqlclient.a new file mode 100644 index 0000000000000000000000000000000000000000..2c845560f45e2d00b26959c767caaacaa547f8f1 GIT binary patch literal 3424360 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

    ;?pM=uOgg#-bb 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

    8dB%&>|_4acvU&xO%LX+$EX

      &Ckmv5ZU*O4avqB%5=E?RQLU8|o9Argoj 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%0D#@HFB&$ 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�pn2I9I#|UL|4$tQedtVgs)du|if1 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

      VFXEI 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 z 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⁡mqozy+9j( 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%0AJ;v&2Pw*tXE|QEZ@f5r|(omR+*F@6rbi6i_ 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�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

      %b?$;}AatJRUp&JP|wzbb~{|lfhHKVc@CY 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�r+-o|&Hr$)# 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 literal 0 HcmV?d00001 diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/aes.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/aes.h new file mode 100644 index 0000000..faa66c4 --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/aes.h @@ -0,0 +1,149 @@ +/* crypto/aes/aes.h */ +/* ==================================================================== + * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + */ + +#ifndef HEADER_AES_H +# define HEADER_AES_H + +# include + +# ifdef OPENSSL_NO_AES +# error AES is disabled. +# endif + +# include + +# define AES_ENCRYPT 1 +# define AES_DECRYPT 0 + +/* + * Because array size can't be a const in C, the following two are macros. + * Both sizes are in bytes. + */ +# define AES_MAXNR 14 +# define AES_BLOCK_SIZE 16 + +#ifdef __cplusplus +extern "C" { +#endif + +/* This should be a hidden type, but EVP requires that the size be known */ +struct aes_key_st { +# ifdef AES_LONG + unsigned long rd_key[4 * (AES_MAXNR + 1)]; +# else + unsigned int rd_key[4 * (AES_MAXNR + 1)]; +# endif + int rounds; +}; +typedef struct aes_key_st AES_KEY; + +const char *AES_options(void); + +int AES_set_encrypt_key(const unsigned char *userKey, const int bits, + AES_KEY *key); +int AES_set_decrypt_key(const unsigned char *userKey, const int bits, + AES_KEY *key); + +int private_AES_set_encrypt_key(const unsigned char *userKey, const int bits, + AES_KEY *key); +int private_AES_set_decrypt_key(const unsigned char *userKey, const int bits, + AES_KEY *key); + +void AES_encrypt(const unsigned char *in, unsigned char *out, + const AES_KEY *key); +void AES_decrypt(const unsigned char *in, unsigned char *out, + const AES_KEY *key); + +void AES_ecb_encrypt(const unsigned char *in, unsigned char *out, + const AES_KEY *key, const int enc); +void AES_cbc_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const AES_KEY *key, + unsigned char *ivec, const int enc); +void AES_cfb128_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const AES_KEY *key, + unsigned char *ivec, int *num, const int enc); +void AES_cfb1_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const AES_KEY *key, + unsigned char *ivec, int *num, const int enc); +void AES_cfb8_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const AES_KEY *key, + unsigned char *ivec, int *num, const int enc); +void AES_ofb128_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const AES_KEY *key, + unsigned char *ivec, int *num); +void AES_ctr128_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const AES_KEY *key, + unsigned char ivec[AES_BLOCK_SIZE], + unsigned char ecount_buf[AES_BLOCK_SIZE], + unsigned int *num); +/* NB: the IV is _two_ blocks long */ +void AES_ige_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const AES_KEY *key, + unsigned char *ivec, const int enc); +/* NB: the IV is _four_ blocks long */ +void AES_bi_ige_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const AES_KEY *key, + const AES_KEY *key2, const unsigned char *ivec, + const int enc); + +int AES_wrap_key(AES_KEY *key, const unsigned char *iv, + unsigned char *out, + const unsigned char *in, unsigned int inlen); +int AES_unwrap_key(AES_KEY *key, const unsigned char *iv, + unsigned char *out, + const unsigned char *in, unsigned int inlen); + + +#ifdef __cplusplus +} +#endif + +#endif /* !HEADER_AES_H */ diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/asn1.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/asn1.h new file mode 100644 index 0000000..68e791f --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/asn1.h @@ -0,0 +1,1419 @@ +/* crypto/asn1/asn1.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_ASN1_H +# define HEADER_ASN1_H + +# include +# include +# ifndef OPENSSL_NO_BIO +# include +# endif +# include +# include + +# include + +# include +# ifndef OPENSSL_NO_DEPRECATED +# include +# endif + +# ifdef OPENSSL_BUILD_SHLIBCRYPTO +# undef OPENSSL_EXTERN +# define OPENSSL_EXTERN OPENSSL_EXPORT +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +# define V_ASN1_UNIVERSAL 0x00 +# define V_ASN1_APPLICATION 0x40 +# define V_ASN1_CONTEXT_SPECIFIC 0x80 +# define V_ASN1_PRIVATE 0xc0 + +# define V_ASN1_CONSTRUCTED 0x20 +# define V_ASN1_PRIMITIVE_TAG 0x1f +# define V_ASN1_PRIMATIVE_TAG 0x1f + +# define V_ASN1_APP_CHOOSE -2/* let the recipient choose */ +# define V_ASN1_OTHER -3/* used in ASN1_TYPE */ +# define V_ASN1_ANY -4/* used in ASN1 template code */ + +# define V_ASN1_NEG 0x100/* negative flag */ + +# define V_ASN1_UNDEF -1 +# define V_ASN1_EOC 0 +# define V_ASN1_BOOLEAN 1 /**/ +# define V_ASN1_INTEGER 2 +# define V_ASN1_NEG_INTEGER (2 | V_ASN1_NEG) +# define V_ASN1_BIT_STRING 3 +# define V_ASN1_OCTET_STRING 4 +# define V_ASN1_NULL 5 +# define V_ASN1_OBJECT 6 +# define V_ASN1_OBJECT_DESCRIPTOR 7 +# define V_ASN1_EXTERNAL 8 +# define V_ASN1_REAL 9 +# define V_ASN1_ENUMERATED 10 +# define V_ASN1_NEG_ENUMERATED (10 | V_ASN1_NEG) +# define V_ASN1_UTF8STRING 12 +# define V_ASN1_SEQUENCE 16 +# define V_ASN1_SET 17 +# define V_ASN1_NUMERICSTRING 18 /**/ +# define V_ASN1_PRINTABLESTRING 19 +# define V_ASN1_T61STRING 20 +# define V_ASN1_TELETEXSTRING 20/* alias */ +# define V_ASN1_VIDEOTEXSTRING 21 /**/ +# define V_ASN1_IA5STRING 22 +# define V_ASN1_UTCTIME 23 +# define V_ASN1_GENERALIZEDTIME 24 /**/ +# define V_ASN1_GRAPHICSTRING 25 /**/ +# define V_ASN1_ISO64STRING 26 /**/ +# define V_ASN1_VISIBLESTRING 26/* alias */ +# define V_ASN1_GENERALSTRING 27 /**/ +# define V_ASN1_UNIVERSALSTRING 28 /**/ +# define V_ASN1_BMPSTRING 30 +/* For use with d2i_ASN1_type_bytes() */ +# define B_ASN1_NUMERICSTRING 0x0001 +# define B_ASN1_PRINTABLESTRING 0x0002 +# define B_ASN1_T61STRING 0x0004 +# define B_ASN1_TELETEXSTRING 0x0004 +# define B_ASN1_VIDEOTEXSTRING 0x0008 +# define B_ASN1_IA5STRING 0x0010 +# define B_ASN1_GRAPHICSTRING 0x0020 +# define B_ASN1_ISO64STRING 0x0040 +# define B_ASN1_VISIBLESTRING 0x0040 +# define B_ASN1_GENERALSTRING 0x0080 +# define B_ASN1_UNIVERSALSTRING 0x0100 +# define B_ASN1_OCTET_STRING 0x0200 +# define B_ASN1_BIT_STRING 0x0400 +# define B_ASN1_BMPSTRING 0x0800 +# define B_ASN1_UNKNOWN 0x1000 +# define B_ASN1_UTF8STRING 0x2000 +# define B_ASN1_UTCTIME 0x4000 +# define B_ASN1_GENERALIZEDTIME 0x8000 +# define B_ASN1_SEQUENCE 0x10000 +/* For use with ASN1_mbstring_copy() */ +# define MBSTRING_FLAG 0x1000 +# define MBSTRING_UTF8 (MBSTRING_FLAG) +# define MBSTRING_ASC (MBSTRING_FLAG|1) +# define MBSTRING_BMP (MBSTRING_FLAG|2) +# define MBSTRING_UNIV (MBSTRING_FLAG|4) +# define SMIME_OLDMIME 0x400 +# define SMIME_CRLFEOL 0x800 +# define SMIME_STREAM 0x1000 + struct X509_algor_st; +DECLARE_STACK_OF(X509_ALGOR) + +# define DECLARE_ASN1_SET_OF(type)/* filled in by mkstack.pl */ +# define IMPLEMENT_ASN1_SET_OF(type)/* nothing, no longer needed */ + +/* + * We MUST make sure that, except for constness, asn1_ctx_st and + * asn1_const_ctx are exactly the same. Fortunately, as soon as the old ASN1 + * parsing macros are gone, we can throw this away as well... + */ +typedef struct asn1_ctx_st { + unsigned char *p; /* work char pointer */ + int eos; /* end of sequence read for indefinite + * encoding */ + int error; /* error code to use when returning an error */ + int inf; /* constructed if 0x20, indefinite is 0x21 */ + int tag; /* tag from last 'get object' */ + int xclass; /* class from last 'get object' */ + long slen; /* length of last 'get object' */ + unsigned char *max; /* largest value of p allowed */ + unsigned char *q; /* temporary variable */ + unsigned char **pp; /* variable */ + int line; /* used in error processing */ +} ASN1_CTX; + +typedef struct asn1_const_ctx_st { + const unsigned char *p; /* work char pointer */ + int eos; /* end of sequence read for indefinite + * encoding */ + int error; /* error code to use when returning an error */ + int inf; /* constructed if 0x20, indefinite is 0x21 */ + int tag; /* tag from last 'get object' */ + int xclass; /* class from last 'get object' */ + long slen; /* length of last 'get object' */ + const unsigned char *max; /* largest value of p allowed */ + const unsigned char *q; /* temporary variable */ + const unsigned char **pp; /* variable */ + int line; /* used in error processing */ +} ASN1_const_CTX; + +/* + * These are used internally in the ASN1_OBJECT to keep track of whether the + * names and data need to be free()ed + */ +# define ASN1_OBJECT_FLAG_DYNAMIC 0x01/* internal use */ +# define ASN1_OBJECT_FLAG_CRITICAL 0x02/* critical x509v3 object id */ +# define ASN1_OBJECT_FLAG_DYNAMIC_STRINGS 0x04/* internal use */ +# define ASN1_OBJECT_FLAG_DYNAMIC_DATA 0x08/* internal use */ +struct asn1_object_st { + const char *sn, *ln; + int nid; + int length; + const unsigned char *data; /* data remains const after init */ + int flags; /* Should we free this one */ +}; + +# define ASN1_STRING_FLAG_BITS_LEFT 0x08/* Set if 0x07 has bits left value */ +/* + * This indicates that the ASN1_STRING is not a real value but just a place + * holder for the location where indefinite length constructed data should be + * inserted in the memory buffer + */ +# define ASN1_STRING_FLAG_NDEF 0x010 + +/* + * This flag is used by the CMS code to indicate that a string is not + * complete and is a place holder for content when it had all been accessed. + * The flag will be reset when content has been written to it. + */ + +# define ASN1_STRING_FLAG_CONT 0x020 +/* + * This flag is used by ASN1 code to indicate an ASN1_STRING is an MSTRING + * type. + */ +# define ASN1_STRING_FLAG_MSTRING 0x040 +/* This is the base type that holds just about everything :-) */ +struct asn1_string_st { + int length; + int type; + unsigned char *data; + /* + * The value of the following field depends on the type being held. It + * is mostly being used for BIT_STRING so if the input data has a + * non-zero 'unused bits' value, it will be handled correctly + */ + long flags; +}; + +/* + * ASN1_ENCODING structure: this is used to save the received encoding of an + * ASN1 type. This is useful to get round problems with invalid encodings + * which can break signatures. + */ + +typedef struct ASN1_ENCODING_st { + unsigned char *enc; /* DER encoding */ + long len; /* Length of encoding */ + int modified; /* set to 1 if 'enc' is invalid */ +} ASN1_ENCODING; + +/* Used with ASN1 LONG type: if a long is set to this it is omitted */ +# define ASN1_LONG_UNDEF 0x7fffffffL + +# define STABLE_FLAGS_MALLOC 0x01 +# define STABLE_NO_MASK 0x02 +# define DIRSTRING_TYPE \ + (B_ASN1_PRINTABLESTRING|B_ASN1_T61STRING|B_ASN1_BMPSTRING|B_ASN1_UTF8STRING) +# define PKCS9STRING_TYPE (DIRSTRING_TYPE|B_ASN1_IA5STRING) + +typedef struct asn1_string_table_st { + int nid; + long minsize; + long maxsize; + unsigned long mask; + unsigned long flags; +} ASN1_STRING_TABLE; + +DECLARE_STACK_OF(ASN1_STRING_TABLE) + +/* size limits: this stuff is taken straight from RFC2459 */ + +# define ub_name 32768 +# define ub_common_name 64 +# define ub_locality_name 128 +# define ub_state_name 128 +# define ub_organization_name 64 +# define ub_organization_unit_name 64 +# define ub_title 64 +# define ub_email_address 128 + +/* + * Declarations for template structures: for full definitions see asn1t.h + */ +typedef struct ASN1_TEMPLATE_st ASN1_TEMPLATE; +typedef struct ASN1_TLC_st ASN1_TLC; +/* This is just an opaque pointer */ +typedef struct ASN1_VALUE_st ASN1_VALUE; + +/* Declare ASN1 functions: the implement macro in in asn1t.h */ + +# define DECLARE_ASN1_FUNCTIONS(type) DECLARE_ASN1_FUNCTIONS_name(type, type) + +# define DECLARE_ASN1_ALLOC_FUNCTIONS(type) \ + DECLARE_ASN1_ALLOC_FUNCTIONS_name(type, type) + +# define DECLARE_ASN1_FUNCTIONS_name(type, name) \ + DECLARE_ASN1_ALLOC_FUNCTIONS_name(type, name) \ + DECLARE_ASN1_ENCODE_FUNCTIONS(type, name, name) + +# define DECLARE_ASN1_FUNCTIONS_fname(type, itname, name) \ + DECLARE_ASN1_ALLOC_FUNCTIONS_name(type, name) \ + DECLARE_ASN1_ENCODE_FUNCTIONS(type, itname, name) + +# define DECLARE_ASN1_ENCODE_FUNCTIONS(type, itname, name) \ + type *d2i_##name(type **a, const unsigned char **in, long len); \ + int i2d_##name(type *a, unsigned char **out); \ + DECLARE_ASN1_ITEM(itname) + +# define DECLARE_ASN1_ENCODE_FUNCTIONS_const(type, name) \ + type *d2i_##name(type **a, const unsigned char **in, long len); \ + int i2d_##name(const type *a, unsigned char **out); \ + DECLARE_ASN1_ITEM(name) + +# define DECLARE_ASN1_NDEF_FUNCTION(name) \ + int i2d_##name##_NDEF(name *a, unsigned char **out); + +# define DECLARE_ASN1_FUNCTIONS_const(name) \ + DECLARE_ASN1_ALLOC_FUNCTIONS(name) \ + DECLARE_ASN1_ENCODE_FUNCTIONS_const(name, name) + +# define DECLARE_ASN1_ALLOC_FUNCTIONS_name(type, name) \ + type *name##_new(void); \ + void name##_free(type *a); + +# define DECLARE_ASN1_PRINT_FUNCTION(stname) \ + DECLARE_ASN1_PRINT_FUNCTION_fname(stname, stname) + +# define DECLARE_ASN1_PRINT_FUNCTION_fname(stname, fname) \ + int fname##_print_ctx(BIO *out, stname *x, int indent, \ + const ASN1_PCTX *pctx); + +# define D2I_OF(type) type *(*)(type **,const unsigned char **,long) +# define I2D_OF(type) int (*)(type *,unsigned char **) +# define I2D_OF_const(type) int (*)(const type *,unsigned char **) + +# define CHECKED_D2I_OF(type, d2i) \ + ((d2i_of_void*) (1 ? d2i : ((D2I_OF(type))0))) +# define CHECKED_I2D_OF(type, i2d) \ + ((i2d_of_void*) (1 ? i2d : ((I2D_OF(type))0))) +# define CHECKED_NEW_OF(type, xnew) \ + ((void *(*)(void)) (1 ? xnew : ((type *(*)(void))0))) +# define CHECKED_PTR_OF(type, p) \ + ((void*) (1 ? p : (type*)0)) +# define CHECKED_PPTR_OF(type, p) \ + ((void**) (1 ? p : (type**)0)) + +# define TYPEDEF_D2I_OF(type) typedef type *d2i_of_##type(type **,const unsigned char **,long) +# define TYPEDEF_I2D_OF(type) typedef int i2d_of_##type(type *,unsigned char **) +# define TYPEDEF_D2I2D_OF(type) TYPEDEF_D2I_OF(type); TYPEDEF_I2D_OF(type) + +TYPEDEF_D2I2D_OF(void); + +/*- + * The following macros and typedefs allow an ASN1_ITEM + * to be embedded in a structure and referenced. Since + * the ASN1_ITEM pointers need to be globally accessible + * (possibly from shared libraries) they may exist in + * different forms. On platforms that support it the + * ASN1_ITEM structure itself will be globally exported. + * Other platforms will export a function that returns + * an ASN1_ITEM pointer. + * + * To handle both cases transparently the macros below + * should be used instead of hard coding an ASN1_ITEM + * pointer in a structure. + * + * The structure will look like this: + * + * typedef struct SOMETHING_st { + * ... + * ASN1_ITEM_EXP *iptr; + * ... + * } SOMETHING; + * + * It would be initialised as e.g.: + * + * SOMETHING somevar = {...,ASN1_ITEM_ref(X509),...}; + * + * and the actual pointer extracted with: + * + * const ASN1_ITEM *it = ASN1_ITEM_ptr(somevar.iptr); + * + * Finally an ASN1_ITEM pointer can be extracted from an + * appropriate reference with: ASN1_ITEM_rptr(X509). This + * would be used when a function takes an ASN1_ITEM * argument. + * + */ + +# ifndef OPENSSL_EXPORT_VAR_AS_FUNCTION + +/* ASN1_ITEM pointer exported type */ +typedef const ASN1_ITEM ASN1_ITEM_EXP; + +/* Macro to obtain ASN1_ITEM pointer from exported type */ +# define ASN1_ITEM_ptr(iptr) (iptr) + +/* Macro to include ASN1_ITEM pointer from base type */ +# define ASN1_ITEM_ref(iptr) (&(iptr##_it)) + +# define ASN1_ITEM_rptr(ref) (&(ref##_it)) + +# define DECLARE_ASN1_ITEM(name) \ + OPENSSL_EXTERN const ASN1_ITEM name##_it; + +# else + +/* + * Platforms that can't easily handle shared global variables are declared as + * functions returning ASN1_ITEM pointers. + */ + +/* ASN1_ITEM pointer exported type */ +typedef const ASN1_ITEM *ASN1_ITEM_EXP (void); + +/* Macro to obtain ASN1_ITEM pointer from exported type */ +# define ASN1_ITEM_ptr(iptr) (iptr()) + +/* Macro to include ASN1_ITEM pointer from base type */ +# define ASN1_ITEM_ref(iptr) (iptr##_it) + +# define ASN1_ITEM_rptr(ref) (ref##_it()) + +# define DECLARE_ASN1_ITEM(name) \ + const ASN1_ITEM * name##_it(void); + +# endif + +/* Parameters used by ASN1_STRING_print_ex() */ + +/* + * These determine which characters to escape: RFC2253 special characters, + * control characters and MSB set characters + */ + +# define ASN1_STRFLGS_ESC_2253 1 +# define ASN1_STRFLGS_ESC_CTRL 2 +# define ASN1_STRFLGS_ESC_MSB 4 + +/* + * This flag determines how we do escaping: normally RC2253 backslash only, + * set this to use backslash and quote. + */ + +# define ASN1_STRFLGS_ESC_QUOTE 8 + +/* These three flags are internal use only. */ + +/* Character is a valid PrintableString character */ +# define CHARTYPE_PRINTABLESTRING 0x10 +/* Character needs escaping if it is the first character */ +# define CHARTYPE_FIRST_ESC_2253 0x20 +/* Character needs escaping if it is the last character */ +# define CHARTYPE_LAST_ESC_2253 0x40 + +/* + * NB the internal flags are safely reused below by flags handled at the top + * level. + */ + +/* + * If this is set we convert all character strings to UTF8 first + */ + +# define ASN1_STRFLGS_UTF8_CONVERT 0x10 + +/* + * If this is set we don't attempt to interpret content: just assume all + * strings are 1 byte per character. This will produce some pretty odd + * looking output! + */ + +# define ASN1_STRFLGS_IGNORE_TYPE 0x20 + +/* If this is set we include the string type in the output */ +# define ASN1_STRFLGS_SHOW_TYPE 0x40 + +/* + * This determines which strings to display and which to 'dump' (hex dump of + * content octets or DER encoding). We can only dump non character strings or + * everything. If we don't dump 'unknown' they are interpreted as character + * strings with 1 octet per character and are subject to the usual escaping + * options. + */ + +# define ASN1_STRFLGS_DUMP_ALL 0x80 +# define ASN1_STRFLGS_DUMP_UNKNOWN 0x100 + +/* + * These determine what 'dumping' does, we can dump the content octets or the + * DER encoding: both use the RFC2253 #XXXXX notation. + */ + +# define ASN1_STRFLGS_DUMP_DER 0x200 + +/* + * All the string flags consistent with RFC2253, escaping control characters + * isn't essential in RFC2253 but it is advisable anyway. + */ + +# define ASN1_STRFLGS_RFC2253 (ASN1_STRFLGS_ESC_2253 | \ + ASN1_STRFLGS_ESC_CTRL | \ + ASN1_STRFLGS_ESC_MSB | \ + ASN1_STRFLGS_UTF8_CONVERT | \ + ASN1_STRFLGS_DUMP_UNKNOWN | \ + ASN1_STRFLGS_DUMP_DER) + +DECLARE_STACK_OF(ASN1_INTEGER) +DECLARE_ASN1_SET_OF(ASN1_INTEGER) + +DECLARE_STACK_OF(ASN1_GENERALSTRING) + +typedef struct asn1_type_st { + int type; + union { + char *ptr; + ASN1_BOOLEAN boolean; + ASN1_STRING *asn1_string; + ASN1_OBJECT *object; + ASN1_INTEGER *integer; + ASN1_ENUMERATED *enumerated; + ASN1_BIT_STRING *bit_string; + ASN1_OCTET_STRING *octet_string; + ASN1_PRINTABLESTRING *printablestring; + ASN1_T61STRING *t61string; + ASN1_IA5STRING *ia5string; + ASN1_GENERALSTRING *generalstring; + ASN1_BMPSTRING *bmpstring; + ASN1_UNIVERSALSTRING *universalstring; + ASN1_UTCTIME *utctime; + ASN1_GENERALIZEDTIME *generalizedtime; + ASN1_VISIBLESTRING *visiblestring; + ASN1_UTF8STRING *utf8string; + /* + * set and sequence are left complete and still contain the set or + * sequence bytes + */ + ASN1_STRING *set; + ASN1_STRING *sequence; + ASN1_VALUE *asn1_value; + } value; +} ASN1_TYPE; + +DECLARE_STACK_OF(ASN1_TYPE) +DECLARE_ASN1_SET_OF(ASN1_TYPE) + +typedef STACK_OF(ASN1_TYPE) ASN1_SEQUENCE_ANY; + +DECLARE_ASN1_ENCODE_FUNCTIONS_const(ASN1_SEQUENCE_ANY, ASN1_SEQUENCE_ANY) +DECLARE_ASN1_ENCODE_FUNCTIONS_const(ASN1_SEQUENCE_ANY, ASN1_SET_ANY) + +typedef struct NETSCAPE_X509_st { + ASN1_OCTET_STRING *header; + X509 *cert; +} NETSCAPE_X509; + +/* This is used to contain a list of bit names */ +typedef struct BIT_STRING_BITNAME_st { + int bitnum; + const char *lname; + const char *sname; +} BIT_STRING_BITNAME; + +# define M_ASN1_STRING_length(x) ((x)->length) +# define M_ASN1_STRING_length_set(x, n) ((x)->length = (n)) +# define M_ASN1_STRING_type(x) ((x)->type) +# define M_ASN1_STRING_data(x) ((x)->data) + +/* Macros for string operations */ +# define M_ASN1_BIT_STRING_new() (ASN1_BIT_STRING *)\ + ASN1_STRING_type_new(V_ASN1_BIT_STRING) +# define M_ASN1_BIT_STRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_ASN1_BIT_STRING_dup(a) (ASN1_BIT_STRING *)\ + ASN1_STRING_dup((const ASN1_STRING *)a) +# define M_ASN1_BIT_STRING_cmp(a,b) ASN1_STRING_cmp(\ + (const ASN1_STRING *)a,(const ASN1_STRING *)b) +# define M_ASN1_BIT_STRING_set(a,b,c) ASN1_STRING_set((ASN1_STRING *)a,b,c) + +# define M_ASN1_INTEGER_new() (ASN1_INTEGER *)\ + ASN1_STRING_type_new(V_ASN1_INTEGER) +# define M_ASN1_INTEGER_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_ASN1_INTEGER_dup(a) (ASN1_INTEGER *)\ + ASN1_STRING_dup((const ASN1_STRING *)a) +# define M_ASN1_INTEGER_cmp(a,b) ASN1_STRING_cmp(\ + (const ASN1_STRING *)a,(const ASN1_STRING *)b) + +# define M_ASN1_ENUMERATED_new() (ASN1_ENUMERATED *)\ + ASN1_STRING_type_new(V_ASN1_ENUMERATED) +# define M_ASN1_ENUMERATED_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_ASN1_ENUMERATED_dup(a) (ASN1_ENUMERATED *)\ + ASN1_STRING_dup((const ASN1_STRING *)a) +# define M_ASN1_ENUMERATED_cmp(a,b) ASN1_STRING_cmp(\ + (const ASN1_STRING *)a,(const ASN1_STRING *)b) + +# define M_ASN1_OCTET_STRING_new() (ASN1_OCTET_STRING *)\ + ASN1_STRING_type_new(V_ASN1_OCTET_STRING) +# define M_ASN1_OCTET_STRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_ASN1_OCTET_STRING_dup(a) (ASN1_OCTET_STRING *)\ + ASN1_STRING_dup((const ASN1_STRING *)a) +# define M_ASN1_OCTET_STRING_cmp(a,b) ASN1_STRING_cmp(\ + (const ASN1_STRING *)a,(const ASN1_STRING *)b) +# define M_ASN1_OCTET_STRING_set(a,b,c) ASN1_STRING_set((ASN1_STRING *)a,b,c) +# define M_ASN1_OCTET_STRING_print(a,b) ASN1_STRING_print(a,(ASN1_STRING *)b) +# define M_i2d_ASN1_OCTET_STRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_OCTET_STRING,\ + V_ASN1_UNIVERSAL) + +# define B_ASN1_TIME \ + B_ASN1_UTCTIME | \ + B_ASN1_GENERALIZEDTIME + +# define B_ASN1_PRINTABLE \ + B_ASN1_NUMERICSTRING| \ + B_ASN1_PRINTABLESTRING| \ + B_ASN1_T61STRING| \ + B_ASN1_IA5STRING| \ + B_ASN1_BIT_STRING| \ + B_ASN1_UNIVERSALSTRING|\ + B_ASN1_BMPSTRING|\ + B_ASN1_UTF8STRING|\ + B_ASN1_SEQUENCE|\ + B_ASN1_UNKNOWN + +# define B_ASN1_DIRECTORYSTRING \ + B_ASN1_PRINTABLESTRING| \ + B_ASN1_TELETEXSTRING|\ + B_ASN1_BMPSTRING|\ + B_ASN1_UNIVERSALSTRING|\ + B_ASN1_UTF8STRING + +# define B_ASN1_DISPLAYTEXT \ + B_ASN1_IA5STRING| \ + B_ASN1_VISIBLESTRING| \ + B_ASN1_BMPSTRING|\ + B_ASN1_UTF8STRING + +# define M_ASN1_PRINTABLE_new() ASN1_STRING_type_new(V_ASN1_T61STRING) +# define M_ASN1_PRINTABLE_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_i2d_ASN1_PRINTABLE(a,pp) i2d_ASN1_bytes((ASN1_STRING *)a,\ + pp,a->type,V_ASN1_UNIVERSAL) +# define M_d2i_ASN1_PRINTABLE(a,pp,l) \ + d2i_ASN1_type_bytes((ASN1_STRING **)a,pp,l, \ + B_ASN1_PRINTABLE) + +# define M_DIRECTORYSTRING_new() ASN1_STRING_type_new(V_ASN1_PRINTABLESTRING) +# define M_DIRECTORYSTRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_i2d_DIRECTORYSTRING(a,pp) i2d_ASN1_bytes((ASN1_STRING *)a,\ + pp,a->type,V_ASN1_UNIVERSAL) +# define M_d2i_DIRECTORYSTRING(a,pp,l) \ + d2i_ASN1_type_bytes((ASN1_STRING **)a,pp,l, \ + B_ASN1_DIRECTORYSTRING) + +# define M_DISPLAYTEXT_new() ASN1_STRING_type_new(V_ASN1_VISIBLESTRING) +# define M_DISPLAYTEXT_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_i2d_DISPLAYTEXT(a,pp) i2d_ASN1_bytes((ASN1_STRING *)a,\ + pp,a->type,V_ASN1_UNIVERSAL) +# define M_d2i_DISPLAYTEXT(a,pp,l) \ + d2i_ASN1_type_bytes((ASN1_STRING **)a,pp,l, \ + B_ASN1_DISPLAYTEXT) + +# define M_ASN1_PRINTABLESTRING_new() (ASN1_PRINTABLESTRING *)\ + ASN1_STRING_type_new(V_ASN1_PRINTABLESTRING) +# define M_ASN1_PRINTABLESTRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_i2d_ASN1_PRINTABLESTRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_PRINTABLESTRING,\ + V_ASN1_UNIVERSAL) +# define M_d2i_ASN1_PRINTABLESTRING(a,pp,l) \ + (ASN1_PRINTABLESTRING *)d2i_ASN1_type_bytes\ + ((ASN1_STRING **)a,pp,l,B_ASN1_PRINTABLESTRING) + +# define M_ASN1_T61STRING_new() (ASN1_T61STRING *)\ + ASN1_STRING_type_new(V_ASN1_T61STRING) +# define M_ASN1_T61STRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_i2d_ASN1_T61STRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_T61STRING,\ + V_ASN1_UNIVERSAL) +# define M_d2i_ASN1_T61STRING(a,pp,l) \ + (ASN1_T61STRING *)d2i_ASN1_type_bytes\ + ((ASN1_STRING **)a,pp,l,B_ASN1_T61STRING) + +# define M_ASN1_IA5STRING_new() (ASN1_IA5STRING *)\ + ASN1_STRING_type_new(V_ASN1_IA5STRING) +# define M_ASN1_IA5STRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_ASN1_IA5STRING_dup(a) \ + (ASN1_IA5STRING *)ASN1_STRING_dup((const ASN1_STRING *)a) +# define M_i2d_ASN1_IA5STRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_IA5STRING,\ + V_ASN1_UNIVERSAL) +# define M_d2i_ASN1_IA5STRING(a,pp,l) \ + (ASN1_IA5STRING *)d2i_ASN1_type_bytes((ASN1_STRING **)a,pp,l,\ + B_ASN1_IA5STRING) + +# define M_ASN1_UTCTIME_new() (ASN1_UTCTIME *)\ + ASN1_STRING_type_new(V_ASN1_UTCTIME) +# define M_ASN1_UTCTIME_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_ASN1_UTCTIME_dup(a) (ASN1_UTCTIME *)\ + ASN1_STRING_dup((const ASN1_STRING *)a) + +# define M_ASN1_GENERALIZEDTIME_new() (ASN1_GENERALIZEDTIME *)\ + ASN1_STRING_type_new(V_ASN1_GENERALIZEDTIME) +# define M_ASN1_GENERALIZEDTIME_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_ASN1_GENERALIZEDTIME_dup(a) (ASN1_GENERALIZEDTIME *)ASN1_STRING_dup(\ + (const ASN1_STRING *)a) + +# define M_ASN1_TIME_new() (ASN1_TIME *)\ + ASN1_STRING_type_new(V_ASN1_UTCTIME) +# define M_ASN1_TIME_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_ASN1_TIME_dup(a) (ASN1_TIME *)\ + ASN1_STRING_dup((const ASN1_STRING *)a) + +# define M_ASN1_GENERALSTRING_new() (ASN1_GENERALSTRING *)\ + ASN1_STRING_type_new(V_ASN1_GENERALSTRING) +# define M_ASN1_GENERALSTRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_i2d_ASN1_GENERALSTRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_GENERALSTRING,\ + V_ASN1_UNIVERSAL) +# define M_d2i_ASN1_GENERALSTRING(a,pp,l) \ + (ASN1_GENERALSTRING *)d2i_ASN1_type_bytes\ + ((ASN1_STRING **)a,pp,l,B_ASN1_GENERALSTRING) + +# define M_ASN1_UNIVERSALSTRING_new() (ASN1_UNIVERSALSTRING *)\ + ASN1_STRING_type_new(V_ASN1_UNIVERSALSTRING) +# define M_ASN1_UNIVERSALSTRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_i2d_ASN1_UNIVERSALSTRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_UNIVERSALSTRING,\ + V_ASN1_UNIVERSAL) +# define M_d2i_ASN1_UNIVERSALSTRING(a,pp,l) \ + (ASN1_UNIVERSALSTRING *)d2i_ASN1_type_bytes\ + ((ASN1_STRING **)a,pp,l,B_ASN1_UNIVERSALSTRING) + +# define M_ASN1_BMPSTRING_new() (ASN1_BMPSTRING *)\ + ASN1_STRING_type_new(V_ASN1_BMPSTRING) +# define M_ASN1_BMPSTRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_i2d_ASN1_BMPSTRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_BMPSTRING,\ + V_ASN1_UNIVERSAL) +# define M_d2i_ASN1_BMPSTRING(a,pp,l) \ + (ASN1_BMPSTRING *)d2i_ASN1_type_bytes\ + ((ASN1_STRING **)a,pp,l,B_ASN1_BMPSTRING) + +# define M_ASN1_VISIBLESTRING_new() (ASN1_VISIBLESTRING *)\ + ASN1_STRING_type_new(V_ASN1_VISIBLESTRING) +# define M_ASN1_VISIBLESTRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_i2d_ASN1_VISIBLESTRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_VISIBLESTRING,\ + V_ASN1_UNIVERSAL) +# define M_d2i_ASN1_VISIBLESTRING(a,pp,l) \ + (ASN1_VISIBLESTRING *)d2i_ASN1_type_bytes\ + ((ASN1_STRING **)a,pp,l,B_ASN1_VISIBLESTRING) + +# define M_ASN1_UTF8STRING_new() (ASN1_UTF8STRING *)\ + ASN1_STRING_type_new(V_ASN1_UTF8STRING) +# define M_ASN1_UTF8STRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_i2d_ASN1_UTF8STRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_UTF8STRING,\ + V_ASN1_UNIVERSAL) +# define M_d2i_ASN1_UTF8STRING(a,pp,l) \ + (ASN1_UTF8STRING *)d2i_ASN1_type_bytes\ + ((ASN1_STRING **)a,pp,l,B_ASN1_UTF8STRING) + + /* for the is_set parameter to i2d_ASN1_SET */ +# define IS_SEQUENCE 0 +# define IS_SET 1 + +DECLARE_ASN1_FUNCTIONS_fname(ASN1_TYPE, ASN1_ANY, ASN1_TYPE) + +int ASN1_TYPE_get(ASN1_TYPE *a); +void ASN1_TYPE_set(ASN1_TYPE *a, int type, void *value); +int ASN1_TYPE_set1(ASN1_TYPE *a, int type, const void *value); +int ASN1_TYPE_cmp(const ASN1_TYPE *a, const ASN1_TYPE *b); + +ASN1_OBJECT *ASN1_OBJECT_new(void); +void ASN1_OBJECT_free(ASN1_OBJECT *a); +int i2d_ASN1_OBJECT(ASN1_OBJECT *a, unsigned char **pp); +ASN1_OBJECT *c2i_ASN1_OBJECT(ASN1_OBJECT **a, const unsigned char **pp, + long length); +ASN1_OBJECT *d2i_ASN1_OBJECT(ASN1_OBJECT **a, const unsigned char **pp, + long length); + +DECLARE_ASN1_ITEM(ASN1_OBJECT) + +DECLARE_STACK_OF(ASN1_OBJECT) +DECLARE_ASN1_SET_OF(ASN1_OBJECT) + +ASN1_STRING *ASN1_STRING_new(void); +void ASN1_STRING_free(ASN1_STRING *a); +void ASN1_STRING_clear_free(ASN1_STRING *a); +int ASN1_STRING_copy(ASN1_STRING *dst, const ASN1_STRING *str); +ASN1_STRING *ASN1_STRING_dup(const ASN1_STRING *a); +ASN1_STRING *ASN1_STRING_type_new(int type); +int ASN1_STRING_cmp(const ASN1_STRING *a, const ASN1_STRING *b); + /* + * Since this is used to store all sorts of things, via macros, for now, + * make its data void * + */ +int ASN1_STRING_set(ASN1_STRING *str, const void *data, int len); +void ASN1_STRING_set0(ASN1_STRING *str, void *data, int len); +int ASN1_STRING_length(const ASN1_STRING *x); +void ASN1_STRING_length_set(ASN1_STRING *x, int n); +int ASN1_STRING_type(ASN1_STRING *x); +unsigned char *ASN1_STRING_data(ASN1_STRING *x); + +DECLARE_ASN1_FUNCTIONS(ASN1_BIT_STRING) +int i2c_ASN1_BIT_STRING(ASN1_BIT_STRING *a, unsigned char **pp); +ASN1_BIT_STRING *c2i_ASN1_BIT_STRING(ASN1_BIT_STRING **a, + const unsigned char **pp, long length); +int ASN1_BIT_STRING_set(ASN1_BIT_STRING *a, unsigned char *d, int length); +int ASN1_BIT_STRING_set_bit(ASN1_BIT_STRING *a, int n, int value); +int ASN1_BIT_STRING_get_bit(ASN1_BIT_STRING *a, int n); +int ASN1_BIT_STRING_check(ASN1_BIT_STRING *a, + unsigned char *flags, int flags_len); + +# ifndef OPENSSL_NO_BIO +int ASN1_BIT_STRING_name_print(BIO *out, ASN1_BIT_STRING *bs, + BIT_STRING_BITNAME *tbl, int indent); +# endif +int ASN1_BIT_STRING_num_asc(char *name, BIT_STRING_BITNAME *tbl); +int ASN1_BIT_STRING_set_asc(ASN1_BIT_STRING *bs, char *name, int value, + BIT_STRING_BITNAME *tbl); + +int i2d_ASN1_BOOLEAN(int a, unsigned char **pp); +int d2i_ASN1_BOOLEAN(int *a, const unsigned char **pp, long length); + +DECLARE_ASN1_FUNCTIONS(ASN1_INTEGER) +int i2c_ASN1_INTEGER(ASN1_INTEGER *a, unsigned char **pp); +ASN1_INTEGER *c2i_ASN1_INTEGER(ASN1_INTEGER **a, const unsigned char **pp, + long length); +ASN1_INTEGER *d2i_ASN1_UINTEGER(ASN1_INTEGER **a, const unsigned char **pp, + long length); +ASN1_INTEGER *ASN1_INTEGER_dup(const ASN1_INTEGER *x); +int ASN1_INTEGER_cmp(const ASN1_INTEGER *x, const ASN1_INTEGER *y); + +DECLARE_ASN1_FUNCTIONS(ASN1_ENUMERATED) + +int ASN1_UTCTIME_check(const ASN1_UTCTIME *a); +ASN1_UTCTIME *ASN1_UTCTIME_set(ASN1_UTCTIME *s, time_t t); +ASN1_UTCTIME *ASN1_UTCTIME_adj(ASN1_UTCTIME *s, time_t t, + int offset_day, long offset_sec); +int ASN1_UTCTIME_set_string(ASN1_UTCTIME *s, const char *str); +int ASN1_UTCTIME_cmp_time_t(const ASN1_UTCTIME *s, time_t t); +# if 0 +time_t ASN1_UTCTIME_get(const ASN1_UTCTIME *s); +# endif + +int ASN1_GENERALIZEDTIME_check(const ASN1_GENERALIZEDTIME *a); +ASN1_GENERALIZEDTIME *ASN1_GENERALIZEDTIME_set(ASN1_GENERALIZEDTIME *s, + time_t t); +ASN1_GENERALIZEDTIME *ASN1_GENERALIZEDTIME_adj(ASN1_GENERALIZEDTIME *s, + time_t t, int offset_day, + long offset_sec); +int ASN1_GENERALIZEDTIME_set_string(ASN1_GENERALIZEDTIME *s, const char *str); +int ASN1_TIME_diff(int *pday, int *psec, + const ASN1_TIME *from, const ASN1_TIME *to); + +DECLARE_ASN1_FUNCTIONS(ASN1_OCTET_STRING) +ASN1_OCTET_STRING *ASN1_OCTET_STRING_dup(const ASN1_OCTET_STRING *a); +int ASN1_OCTET_STRING_cmp(const ASN1_OCTET_STRING *a, + const ASN1_OCTET_STRING *b); +int ASN1_OCTET_STRING_set(ASN1_OCTET_STRING *str, const unsigned char *data, + int len); + +DECLARE_ASN1_FUNCTIONS(ASN1_VISIBLESTRING) +DECLARE_ASN1_FUNCTIONS(ASN1_UNIVERSALSTRING) +DECLARE_ASN1_FUNCTIONS(ASN1_UTF8STRING) +DECLARE_ASN1_FUNCTIONS(ASN1_NULL) +DECLARE_ASN1_FUNCTIONS(ASN1_BMPSTRING) + +int UTF8_getc(const unsigned char *str, int len, unsigned long *val); +int UTF8_putc(unsigned char *str, int len, unsigned long value); + +DECLARE_ASN1_FUNCTIONS_name(ASN1_STRING, ASN1_PRINTABLE) + +DECLARE_ASN1_FUNCTIONS_name(ASN1_STRING, DIRECTORYSTRING) +DECLARE_ASN1_FUNCTIONS_name(ASN1_STRING, DISPLAYTEXT) +DECLARE_ASN1_FUNCTIONS(ASN1_PRINTABLESTRING) +DECLARE_ASN1_FUNCTIONS(ASN1_T61STRING) +DECLARE_ASN1_FUNCTIONS(ASN1_IA5STRING) +DECLARE_ASN1_FUNCTIONS(ASN1_GENERALSTRING) +DECLARE_ASN1_FUNCTIONS(ASN1_UTCTIME) +DECLARE_ASN1_FUNCTIONS(ASN1_GENERALIZEDTIME) +DECLARE_ASN1_FUNCTIONS(ASN1_TIME) + +DECLARE_ASN1_ITEM(ASN1_OCTET_STRING_NDEF) + +ASN1_TIME *ASN1_TIME_set(ASN1_TIME *s, time_t t); +ASN1_TIME *ASN1_TIME_adj(ASN1_TIME *s, time_t t, + int offset_day, long offset_sec); +int ASN1_TIME_check(ASN1_TIME *t); +ASN1_GENERALIZEDTIME *ASN1_TIME_to_generalizedtime(ASN1_TIME *t, ASN1_GENERALIZEDTIME + **out); +int ASN1_TIME_set_string(ASN1_TIME *s, const char *str); + +int i2d_ASN1_SET(STACK_OF(OPENSSL_BLOCK) *a, unsigned char **pp, + i2d_of_void *i2d, int ex_tag, int ex_class, int is_set); +STACK_OF(OPENSSL_BLOCK) *d2i_ASN1_SET(STACK_OF(OPENSSL_BLOCK) **a, + const unsigned char **pp, + long length, d2i_of_void *d2i, + void (*free_func) (OPENSSL_BLOCK), + int ex_tag, int ex_class); + +# ifndef OPENSSL_NO_BIO +int i2a_ASN1_INTEGER(BIO *bp, ASN1_INTEGER *a); +int a2i_ASN1_INTEGER(BIO *bp, ASN1_INTEGER *bs, char *buf, int size); +int i2a_ASN1_ENUMERATED(BIO *bp, ASN1_ENUMERATED *a); +int a2i_ASN1_ENUMERATED(BIO *bp, ASN1_ENUMERATED *bs, char *buf, int size); +int i2a_ASN1_OBJECT(BIO *bp, ASN1_OBJECT *a); +int a2i_ASN1_STRING(BIO *bp, ASN1_STRING *bs, char *buf, int size); +int i2a_ASN1_STRING(BIO *bp, ASN1_STRING *a, int type); +# endif +int i2t_ASN1_OBJECT(char *buf, int buf_len, ASN1_OBJECT *a); + +int a2d_ASN1_OBJECT(unsigned char *out, int olen, const char *buf, int num); +ASN1_OBJECT *ASN1_OBJECT_create(int nid, unsigned char *data, int len, + const char *sn, const char *ln); + +int ASN1_INTEGER_set(ASN1_INTEGER *a, long v); +long ASN1_INTEGER_get(const ASN1_INTEGER *a); +ASN1_INTEGER *BN_to_ASN1_INTEGER(const BIGNUM *bn, ASN1_INTEGER *ai); +BIGNUM *ASN1_INTEGER_to_BN(const ASN1_INTEGER *ai, BIGNUM *bn); + +int ASN1_ENUMERATED_set(ASN1_ENUMERATED *a, long v); +long ASN1_ENUMERATED_get(ASN1_ENUMERATED *a); +ASN1_ENUMERATED *BN_to_ASN1_ENUMERATED(BIGNUM *bn, ASN1_ENUMERATED *ai); +BIGNUM *ASN1_ENUMERATED_to_BN(ASN1_ENUMERATED *ai, BIGNUM *bn); + +/* General */ +/* given a string, return the correct type, max is the maximum length */ +int ASN1_PRINTABLE_type(const unsigned char *s, int max); + +int i2d_ASN1_bytes(ASN1_STRING *a, unsigned char **pp, int tag, int xclass); +ASN1_STRING *d2i_ASN1_bytes(ASN1_STRING **a, const unsigned char **pp, + long length, int Ptag, int Pclass); +unsigned long ASN1_tag2bit(int tag); +/* type is one or more of the B_ASN1_ values. */ +ASN1_STRING *d2i_ASN1_type_bytes(ASN1_STRING **a, const unsigned char **pp, + long length, int type); + +/* PARSING */ +int asn1_Finish(ASN1_CTX *c); +int asn1_const_Finish(ASN1_const_CTX *c); + +/* SPECIALS */ +int ASN1_get_object(const unsigned char **pp, long *plength, int *ptag, + int *pclass, long omax); +int ASN1_check_infinite_end(unsigned char **p, long len); +int ASN1_const_check_infinite_end(const unsigned char **p, long len); +void ASN1_put_object(unsigned char **pp, int constructed, int length, + int tag, int xclass); +int ASN1_put_eoc(unsigned char **pp); +int ASN1_object_size(int constructed, int length, int tag); + +/* Used to implement other functions */ +void *ASN1_dup(i2d_of_void *i2d, d2i_of_void *d2i, void *x); + +# define ASN1_dup_of(type,i2d,d2i,x) \ + ((type*)ASN1_dup(CHECKED_I2D_OF(type, i2d), \ + CHECKED_D2I_OF(type, d2i), \ + CHECKED_PTR_OF(type, x))) + +# define ASN1_dup_of_const(type,i2d,d2i,x) \ + ((type*)ASN1_dup(CHECKED_I2D_OF(const type, i2d), \ + CHECKED_D2I_OF(type, d2i), \ + CHECKED_PTR_OF(const type, x))) + +void *ASN1_item_dup(const ASN1_ITEM *it, void *x); + +/* ASN1 alloc/free macros for when a type is only used internally */ + +# define M_ASN1_new_of(type) (type *)ASN1_item_new(ASN1_ITEM_rptr(type)) +# define M_ASN1_free_of(x, type) \ + ASN1_item_free(CHECKED_PTR_OF(type, x), ASN1_ITEM_rptr(type)) + +# ifndef OPENSSL_NO_FP_API +void *ASN1_d2i_fp(void *(*xnew) (void), d2i_of_void *d2i, FILE *in, void **x); + +# define ASN1_d2i_fp_of(type,xnew,d2i,in,x) \ + ((type*)ASN1_d2i_fp(CHECKED_NEW_OF(type, xnew), \ + CHECKED_D2I_OF(type, d2i), \ + in, \ + CHECKED_PPTR_OF(type, x))) + +void *ASN1_item_d2i_fp(const ASN1_ITEM *it, FILE *in, void *x); +int ASN1_i2d_fp(i2d_of_void *i2d, FILE *out, void *x); + +# define ASN1_i2d_fp_of(type,i2d,out,x) \ + (ASN1_i2d_fp(CHECKED_I2D_OF(type, i2d), \ + out, \ + CHECKED_PTR_OF(type, x))) + +# define ASN1_i2d_fp_of_const(type,i2d,out,x) \ + (ASN1_i2d_fp(CHECKED_I2D_OF(const type, i2d), \ + out, \ + CHECKED_PTR_OF(const type, x))) + +int ASN1_item_i2d_fp(const ASN1_ITEM *it, FILE *out, void *x); +int ASN1_STRING_print_ex_fp(FILE *fp, ASN1_STRING *str, unsigned long flags); +# endif + +int ASN1_STRING_to_UTF8(unsigned char **out, ASN1_STRING *in); + +# ifndef OPENSSL_NO_BIO +void *ASN1_d2i_bio(void *(*xnew) (void), d2i_of_void *d2i, BIO *in, void **x); + +# define ASN1_d2i_bio_of(type,xnew,d2i,in,x) \ + ((type*)ASN1_d2i_bio( CHECKED_NEW_OF(type, xnew), \ + CHECKED_D2I_OF(type, d2i), \ + in, \ + CHECKED_PPTR_OF(type, x))) + +void *ASN1_item_d2i_bio(const ASN1_ITEM *it, BIO *in, void *x); +int ASN1_i2d_bio(i2d_of_void *i2d, BIO *out, unsigned char *x); + +# define ASN1_i2d_bio_of(type,i2d,out,x) \ + (ASN1_i2d_bio(CHECKED_I2D_OF(type, i2d), \ + out, \ + CHECKED_PTR_OF(type, x))) + +# define ASN1_i2d_bio_of_const(type,i2d,out,x) \ + (ASN1_i2d_bio(CHECKED_I2D_OF(const type, i2d), \ + out, \ + CHECKED_PTR_OF(const type, x))) + +int ASN1_item_i2d_bio(const ASN1_ITEM *it, BIO *out, void *x); +int ASN1_UTCTIME_print(BIO *fp, const ASN1_UTCTIME *a); +int ASN1_GENERALIZEDTIME_print(BIO *fp, const ASN1_GENERALIZEDTIME *a); +int ASN1_TIME_print(BIO *fp, const ASN1_TIME *a); +int ASN1_STRING_print(BIO *bp, const ASN1_STRING *v); +int ASN1_STRING_print_ex(BIO *out, ASN1_STRING *str, unsigned long flags); +int ASN1_bn_print(BIO *bp, const char *number, const BIGNUM *num, + unsigned char *buf, int off); +int ASN1_parse(BIO *bp, const unsigned char *pp, long len, int indent); +int ASN1_parse_dump(BIO *bp, const unsigned char *pp, long len, int indent, + int dump); +# endif +const char *ASN1_tag2str(int tag); + +/* Used to load and write netscape format cert */ + +DECLARE_ASN1_FUNCTIONS(NETSCAPE_X509) + +int ASN1_UNIVERSALSTRING_to_string(ASN1_UNIVERSALSTRING *s); + +int ASN1_TYPE_set_octetstring(ASN1_TYPE *a, unsigned char *data, int len); +int ASN1_TYPE_get_octetstring(ASN1_TYPE *a, unsigned char *data, int max_len); +int ASN1_TYPE_set_int_octetstring(ASN1_TYPE *a, long num, + unsigned char *data, int len); +int ASN1_TYPE_get_int_octetstring(ASN1_TYPE *a, long *num, + unsigned char *data, int max_len); + +STACK_OF(OPENSSL_BLOCK) *ASN1_seq_unpack(const unsigned char *buf, int len, + d2i_of_void *d2i, + void (*free_func) (OPENSSL_BLOCK)); +unsigned char *ASN1_seq_pack(STACK_OF(OPENSSL_BLOCK) *safes, i2d_of_void *i2d, + unsigned char **buf, int *len); +void *ASN1_unpack_string(ASN1_STRING *oct, d2i_of_void *d2i); +void *ASN1_item_unpack(ASN1_STRING *oct, const ASN1_ITEM *it); +ASN1_STRING *ASN1_pack_string(void *obj, i2d_of_void *i2d, + ASN1_OCTET_STRING **oct); + +# define ASN1_pack_string_of(type,obj,i2d,oct) \ + (ASN1_pack_string(CHECKED_PTR_OF(type, obj), \ + CHECKED_I2D_OF(type, i2d), \ + oct)) + +ASN1_STRING *ASN1_item_pack(void *obj, const ASN1_ITEM *it, + ASN1_OCTET_STRING **oct); + +void ASN1_STRING_set_default_mask(unsigned long mask); +int ASN1_STRING_set_default_mask_asc(const char *p); +unsigned long ASN1_STRING_get_default_mask(void); +int ASN1_mbstring_copy(ASN1_STRING **out, const unsigned char *in, int len, + int inform, unsigned long mask); +int ASN1_mbstring_ncopy(ASN1_STRING **out, const unsigned char *in, int len, + int inform, unsigned long mask, + long minsize, long maxsize); + +ASN1_STRING *ASN1_STRING_set_by_NID(ASN1_STRING **out, + const unsigned char *in, int inlen, + int inform, int nid); +ASN1_STRING_TABLE *ASN1_STRING_TABLE_get(int nid); +int ASN1_STRING_TABLE_add(int, long, long, unsigned long, unsigned long); +void ASN1_STRING_TABLE_cleanup(void); + +/* ASN1 template functions */ + +/* Old API compatible functions */ +ASN1_VALUE *ASN1_item_new(const ASN1_ITEM *it); +void ASN1_item_free(ASN1_VALUE *val, const ASN1_ITEM *it); +ASN1_VALUE *ASN1_item_d2i(ASN1_VALUE **val, const unsigned char **in, + long len, const ASN1_ITEM *it); +int ASN1_item_i2d(ASN1_VALUE *val, unsigned char **out, const ASN1_ITEM *it); +int ASN1_item_ndef_i2d(ASN1_VALUE *val, unsigned char **out, + const ASN1_ITEM *it); + +void ASN1_add_oid_module(void); + +ASN1_TYPE *ASN1_generate_nconf(char *str, CONF *nconf); +ASN1_TYPE *ASN1_generate_v3(char *str, X509V3_CTX *cnf); + +/* ASN1 Print flags */ + +/* Indicate missing OPTIONAL fields */ +# define ASN1_PCTX_FLAGS_SHOW_ABSENT 0x001 +/* Mark start and end of SEQUENCE */ +# define ASN1_PCTX_FLAGS_SHOW_SEQUENCE 0x002 +/* Mark start and end of SEQUENCE/SET OF */ +# define ASN1_PCTX_FLAGS_SHOW_SSOF 0x004 +/* Show the ASN1 type of primitives */ +# define ASN1_PCTX_FLAGS_SHOW_TYPE 0x008 +/* Don't show ASN1 type of ANY */ +# define ASN1_PCTX_FLAGS_NO_ANY_TYPE 0x010 +/* Don't show ASN1 type of MSTRINGs */ +# define ASN1_PCTX_FLAGS_NO_MSTRING_TYPE 0x020 +/* Don't show field names in SEQUENCE */ +# define ASN1_PCTX_FLAGS_NO_FIELD_NAME 0x040 +/* Show structure names of each SEQUENCE field */ +# define ASN1_PCTX_FLAGS_SHOW_FIELD_STRUCT_NAME 0x080 +/* Don't show structure name even at top level */ +# define ASN1_PCTX_FLAGS_NO_STRUCT_NAME 0x100 + +int ASN1_item_print(BIO *out, ASN1_VALUE *ifld, int indent, + const ASN1_ITEM *it, const ASN1_PCTX *pctx); +ASN1_PCTX *ASN1_PCTX_new(void); +void ASN1_PCTX_free(ASN1_PCTX *p); +unsigned long ASN1_PCTX_get_flags(ASN1_PCTX *p); +void ASN1_PCTX_set_flags(ASN1_PCTX *p, unsigned long flags); +unsigned long ASN1_PCTX_get_nm_flags(ASN1_PCTX *p); +void ASN1_PCTX_set_nm_flags(ASN1_PCTX *p, unsigned long flags); +unsigned long ASN1_PCTX_get_cert_flags(ASN1_PCTX *p); +void ASN1_PCTX_set_cert_flags(ASN1_PCTX *p, unsigned long flags); +unsigned long ASN1_PCTX_get_oid_flags(ASN1_PCTX *p); +void ASN1_PCTX_set_oid_flags(ASN1_PCTX *p, unsigned long flags); +unsigned long ASN1_PCTX_get_str_flags(ASN1_PCTX *p); +void ASN1_PCTX_set_str_flags(ASN1_PCTX *p, unsigned long flags); + +BIO_METHOD *BIO_f_asn1(void); + +BIO *BIO_new_NDEF(BIO *out, ASN1_VALUE *val, const ASN1_ITEM *it); + +int i2d_ASN1_bio_stream(BIO *out, ASN1_VALUE *val, BIO *in, int flags, + const ASN1_ITEM *it); +int PEM_write_bio_ASN1_stream(BIO *out, ASN1_VALUE *val, BIO *in, int flags, + const char *hdr, const ASN1_ITEM *it); +int SMIME_write_ASN1(BIO *bio, ASN1_VALUE *val, BIO *data, int flags, + int ctype_nid, int econt_nid, + STACK_OF(X509_ALGOR) *mdalgs, const ASN1_ITEM *it); +ASN1_VALUE *SMIME_read_ASN1(BIO *bio, BIO **bcont, const ASN1_ITEM *it); +int SMIME_crlf_copy(BIO *in, BIO *out, int flags); +int SMIME_text(BIO *in, BIO *out); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_ASN1_strings(void); + +/* Error codes for the ASN1 functions. */ + +/* Function codes. */ +# define ASN1_F_A2D_ASN1_OBJECT 100 +# define ASN1_F_A2I_ASN1_ENUMERATED 101 +# define ASN1_F_A2I_ASN1_INTEGER 102 +# define ASN1_F_A2I_ASN1_STRING 103 +# define ASN1_F_APPEND_EXP 176 +# define ASN1_F_ASN1_BIT_STRING_SET_BIT 183 +# define ASN1_F_ASN1_CB 177 +# define ASN1_F_ASN1_CHECK_TLEN 104 +# define ASN1_F_ASN1_COLLATE_PRIMITIVE 105 +# define ASN1_F_ASN1_COLLECT 106 +# define ASN1_F_ASN1_D2I_EX_PRIMITIVE 108 +# define ASN1_F_ASN1_D2I_FP 109 +# define ASN1_F_ASN1_D2I_READ_BIO 107 +# define ASN1_F_ASN1_DIGEST 184 +# define ASN1_F_ASN1_DO_ADB 110 +# define ASN1_F_ASN1_DUP 111 +# define ASN1_F_ASN1_ENUMERATED_SET 112 +# define ASN1_F_ASN1_ENUMERATED_TO_BN 113 +# define ASN1_F_ASN1_EX_C2I 204 +# define ASN1_F_ASN1_FIND_END 190 +# define ASN1_F_ASN1_GENERALIZEDTIME_ADJ 216 +# define ASN1_F_ASN1_GENERALIZEDTIME_SET 185 +# define ASN1_F_ASN1_GENERATE_V3 178 +# define ASN1_F_ASN1_GET_OBJECT 114 +# define ASN1_F_ASN1_HEADER_NEW 115 +# define ASN1_F_ASN1_I2D_BIO 116 +# define ASN1_F_ASN1_I2D_FP 117 +# define ASN1_F_ASN1_INTEGER_SET 118 +# define ASN1_F_ASN1_INTEGER_TO_BN 119 +# define ASN1_F_ASN1_ITEM_D2I_FP 206 +# define ASN1_F_ASN1_ITEM_DUP 191 +# define ASN1_F_ASN1_ITEM_EX_COMBINE_NEW 121 +# define ASN1_F_ASN1_ITEM_EX_D2I 120 +# define ASN1_F_ASN1_ITEM_I2D_BIO 192 +# define ASN1_F_ASN1_ITEM_I2D_FP 193 +# define ASN1_F_ASN1_ITEM_PACK 198 +# define ASN1_F_ASN1_ITEM_SIGN 195 +# define ASN1_F_ASN1_ITEM_SIGN_CTX 220 +# define ASN1_F_ASN1_ITEM_UNPACK 199 +# define ASN1_F_ASN1_ITEM_VERIFY 197 +# define ASN1_F_ASN1_MBSTRING_NCOPY 122 +# define ASN1_F_ASN1_OBJECT_NEW 123 +# define ASN1_F_ASN1_OUTPUT_DATA 214 +# define ASN1_F_ASN1_PACK_STRING 124 +# define ASN1_F_ASN1_PCTX_NEW 205 +# define ASN1_F_ASN1_PKCS5_PBE_SET 125 +# define ASN1_F_ASN1_SEQ_PACK 126 +# define ASN1_F_ASN1_SEQ_UNPACK 127 +# define ASN1_F_ASN1_SIGN 128 +# define ASN1_F_ASN1_STR2TYPE 179 +# define ASN1_F_ASN1_STRING_SET 186 +# define ASN1_F_ASN1_STRING_TABLE_ADD 129 +# define ASN1_F_ASN1_STRING_TYPE_NEW 130 +# define ASN1_F_ASN1_TEMPLATE_EX_D2I 132 +# define ASN1_F_ASN1_TEMPLATE_NEW 133 +# define ASN1_F_ASN1_TEMPLATE_NOEXP_D2I 131 +# define ASN1_F_ASN1_TIME_ADJ 217 +# define ASN1_F_ASN1_TIME_SET 175 +# define ASN1_F_ASN1_TYPE_GET_INT_OCTETSTRING 134 +# define ASN1_F_ASN1_TYPE_GET_OCTETSTRING 135 +# define ASN1_F_ASN1_UNPACK_STRING 136 +# define ASN1_F_ASN1_UTCTIME_ADJ 218 +# define ASN1_F_ASN1_UTCTIME_SET 187 +# define ASN1_F_ASN1_VERIFY 137 +# define ASN1_F_B64_READ_ASN1 209 +# define ASN1_F_B64_WRITE_ASN1 210 +# define ASN1_F_BIO_NEW_NDEF 208 +# define ASN1_F_BITSTR_CB 180 +# define ASN1_F_BN_TO_ASN1_ENUMERATED 138 +# define ASN1_F_BN_TO_ASN1_INTEGER 139 +# define ASN1_F_C2I_ASN1_BIT_STRING 189 +# define ASN1_F_C2I_ASN1_INTEGER 194 +# define ASN1_F_C2I_ASN1_OBJECT 196 +# define ASN1_F_COLLECT_DATA 140 +# define ASN1_F_D2I_ASN1_BIT_STRING 141 +# define ASN1_F_D2I_ASN1_BOOLEAN 142 +# define ASN1_F_D2I_ASN1_BYTES 143 +# define ASN1_F_D2I_ASN1_GENERALIZEDTIME 144 +# define ASN1_F_D2I_ASN1_HEADER 145 +# define ASN1_F_D2I_ASN1_INTEGER 146 +# define ASN1_F_D2I_ASN1_OBJECT 147 +# define ASN1_F_D2I_ASN1_SET 148 +# define ASN1_F_D2I_ASN1_TYPE_BYTES 149 +# define ASN1_F_D2I_ASN1_UINTEGER 150 +# define ASN1_F_D2I_ASN1_UTCTIME 151 +# define ASN1_F_D2I_AUTOPRIVATEKEY 207 +# define ASN1_F_D2I_NETSCAPE_RSA 152 +# define ASN1_F_D2I_NETSCAPE_RSA_2 153 +# define ASN1_F_D2I_PRIVATEKEY 154 +# define ASN1_F_D2I_PUBLICKEY 155 +# define ASN1_F_D2I_RSA_NET 200 +# define ASN1_F_D2I_RSA_NET_2 201 +# define ASN1_F_D2I_X509 156 +# define ASN1_F_D2I_X509_CINF 157 +# define ASN1_F_D2I_X509_PKEY 159 +# define ASN1_F_I2D_ASN1_BIO_STREAM 211 +# define ASN1_F_I2D_ASN1_SET 188 +# define ASN1_F_I2D_ASN1_TIME 160 +# define ASN1_F_I2D_DSA_PUBKEY 161 +# define ASN1_F_I2D_EC_PUBKEY 181 +# define ASN1_F_I2D_PRIVATEKEY 163 +# define ASN1_F_I2D_PUBLICKEY 164 +# define ASN1_F_I2D_RSA_NET 162 +# define ASN1_F_I2D_RSA_PUBKEY 165 +# define ASN1_F_LONG_C2I 166 +# define ASN1_F_OID_MODULE_INIT 174 +# define ASN1_F_PARSE_TAGGING 182 +# define ASN1_F_PKCS5_PBE2_SET_IV 167 +# define ASN1_F_PKCS5_PBE_SET 202 +# define ASN1_F_PKCS5_PBE_SET0_ALGOR 215 +# define ASN1_F_PKCS5_PBKDF2_SET 219 +# define ASN1_F_SMIME_READ_ASN1 212 +# define ASN1_F_SMIME_TEXT 213 +# define ASN1_F_X509_CINF_NEW 168 +# define ASN1_F_X509_CRL_ADD0_REVOKED 169 +# define ASN1_F_X509_INFO_NEW 170 +# define ASN1_F_X509_NAME_ENCODE 203 +# define ASN1_F_X509_NAME_EX_D2I 158 +# define ASN1_F_X509_NAME_EX_NEW 171 +# define ASN1_F_X509_NEW 172 +# define ASN1_F_X509_PKEY_NEW 173 + +/* Reason codes. */ +# define ASN1_R_ADDING_OBJECT 171 +# define ASN1_R_ASN1_PARSE_ERROR 203 +# define ASN1_R_ASN1_SIG_PARSE_ERROR 204 +# define ASN1_R_AUX_ERROR 100 +# define ASN1_R_BAD_CLASS 101 +# define ASN1_R_BAD_OBJECT_HEADER 102 +# define ASN1_R_BAD_PASSWORD_READ 103 +# define ASN1_R_BAD_TAG 104 +# define ASN1_R_BMPSTRING_IS_WRONG_LENGTH 214 +# define ASN1_R_BN_LIB 105 +# define ASN1_R_BOOLEAN_IS_WRONG_LENGTH 106 +# define ASN1_R_BUFFER_TOO_SMALL 107 +# define ASN1_R_CIPHER_HAS_NO_OBJECT_IDENTIFIER 108 +# define ASN1_R_CONTEXT_NOT_INITIALISED 217 +# define ASN1_R_DATA_IS_WRONG 109 +# define ASN1_R_DECODE_ERROR 110 +# define ASN1_R_DECODING_ERROR 111 +# define ASN1_R_DEPTH_EXCEEDED 174 +# define ASN1_R_DIGEST_AND_KEY_TYPE_NOT_SUPPORTED 198 +# define ASN1_R_ENCODE_ERROR 112 +# define ASN1_R_ERROR_GETTING_TIME 173 +# define ASN1_R_ERROR_LOADING_SECTION 172 +# define ASN1_R_ERROR_PARSING_SET_ELEMENT 113 +# define ASN1_R_ERROR_SETTING_CIPHER_PARAMS 114 +# define ASN1_R_EXPECTING_AN_INTEGER 115 +# define ASN1_R_EXPECTING_AN_OBJECT 116 +# define ASN1_R_EXPECTING_A_BOOLEAN 117 +# define ASN1_R_EXPECTING_A_TIME 118 +# define ASN1_R_EXPLICIT_LENGTH_MISMATCH 119 +# define ASN1_R_EXPLICIT_TAG_NOT_CONSTRUCTED 120 +# define ASN1_R_FIELD_MISSING 121 +# define ASN1_R_FIRST_NUM_TOO_LARGE 122 +# define ASN1_R_HEADER_TOO_LONG 123 +# define ASN1_R_ILLEGAL_BITSTRING_FORMAT 175 +# define ASN1_R_ILLEGAL_BOOLEAN 176 +# define ASN1_R_ILLEGAL_CHARACTERS 124 +# define ASN1_R_ILLEGAL_FORMAT 177 +# define ASN1_R_ILLEGAL_HEX 178 +# define ASN1_R_ILLEGAL_IMPLICIT_TAG 179 +# define ASN1_R_ILLEGAL_INTEGER 180 +# define ASN1_R_ILLEGAL_NESTED_TAGGING 181 +# define ASN1_R_ILLEGAL_NULL 125 +# define ASN1_R_ILLEGAL_NULL_VALUE 182 +# define ASN1_R_ILLEGAL_OBJECT 183 +# define ASN1_R_ILLEGAL_OPTIONAL_ANY 126 +# define ASN1_R_ILLEGAL_OPTIONS_ON_ITEM_TEMPLATE 170 +# define ASN1_R_ILLEGAL_TAGGED_ANY 127 +# define ASN1_R_ILLEGAL_TIME_VALUE 184 +# define ASN1_R_INTEGER_NOT_ASCII_FORMAT 185 +# define ASN1_R_INTEGER_TOO_LARGE_FOR_LONG 128 +# define ASN1_R_INVALID_BIT_STRING_BITS_LEFT 220 +# define ASN1_R_INVALID_BMPSTRING_LENGTH 129 +# define ASN1_R_INVALID_DIGIT 130 +# define ASN1_R_INVALID_MIME_TYPE 205 +# define ASN1_R_INVALID_MODIFIER 186 +# define ASN1_R_INVALID_NUMBER 187 +# define ASN1_R_INVALID_OBJECT_ENCODING 216 +# define ASN1_R_INVALID_SEPARATOR 131 +# define ASN1_R_INVALID_TIME_FORMAT 132 +# define ASN1_R_INVALID_UNIVERSALSTRING_LENGTH 133 +# define ASN1_R_INVALID_UTF8STRING 134 +# define ASN1_R_IV_TOO_LARGE 135 +# define ASN1_R_LENGTH_ERROR 136 +# define ASN1_R_LIST_ERROR 188 +# define ASN1_R_MIME_NO_CONTENT_TYPE 206 +# define ASN1_R_MIME_PARSE_ERROR 207 +# define ASN1_R_MIME_SIG_PARSE_ERROR 208 +# define ASN1_R_MISSING_EOC 137 +# define ASN1_R_MISSING_SECOND_NUMBER 138 +# define ASN1_R_MISSING_VALUE 189 +# define ASN1_R_MSTRING_NOT_UNIVERSAL 139 +# define ASN1_R_MSTRING_WRONG_TAG 140 +# define ASN1_R_NESTED_ASN1_STRING 197 +# define ASN1_R_NON_HEX_CHARACTERS 141 +# define ASN1_R_NOT_ASCII_FORMAT 190 +# define ASN1_R_NOT_ENOUGH_DATA 142 +# define ASN1_R_NO_CONTENT_TYPE 209 +# define ASN1_R_NO_DEFAULT_DIGEST 201 +# define ASN1_R_NO_MATCHING_CHOICE_TYPE 143 +# define ASN1_R_NO_MULTIPART_BODY_FAILURE 210 +# define ASN1_R_NO_MULTIPART_BOUNDARY 211 +# define ASN1_R_NO_SIG_CONTENT_TYPE 212 +# define ASN1_R_NULL_IS_WRONG_LENGTH 144 +# define ASN1_R_OBJECT_NOT_ASCII_FORMAT 191 +# define ASN1_R_ODD_NUMBER_OF_CHARS 145 +# define ASN1_R_PRIVATE_KEY_HEADER_MISSING 146 +# define ASN1_R_SECOND_NUMBER_TOO_LARGE 147 +# define ASN1_R_SEQUENCE_LENGTH_MISMATCH 148 +# define ASN1_R_SEQUENCE_NOT_CONSTRUCTED 149 +# define ASN1_R_SEQUENCE_OR_SET_NEEDS_CONFIG 192 +# define ASN1_R_SHORT_LINE 150 +# define ASN1_R_SIG_INVALID_MIME_TYPE 213 +# define ASN1_R_STREAMING_NOT_SUPPORTED 202 +# define ASN1_R_STRING_TOO_LONG 151 +# define ASN1_R_STRING_TOO_SHORT 152 +# define ASN1_R_TAG_VALUE_TOO_HIGH 153 +# define ASN1_R_THE_ASN1_OBJECT_IDENTIFIER_IS_NOT_KNOWN_FOR_THIS_MD 154 +# define ASN1_R_TIME_NOT_ASCII_FORMAT 193 +# define ASN1_R_TOO_LONG 155 +# define ASN1_R_TYPE_NOT_CONSTRUCTED 156 +# define ASN1_R_TYPE_NOT_PRIMITIVE 218 +# define ASN1_R_UNABLE_TO_DECODE_RSA_KEY 157 +# define ASN1_R_UNABLE_TO_DECODE_RSA_PRIVATE_KEY 158 +# define ASN1_R_UNEXPECTED_EOC 159 +# define ASN1_R_UNIVERSALSTRING_IS_WRONG_LENGTH 215 +# define ASN1_R_UNKNOWN_FORMAT 160 +# define ASN1_R_UNKNOWN_MESSAGE_DIGEST_ALGORITHM 161 +# define ASN1_R_UNKNOWN_OBJECT_TYPE 162 +# define ASN1_R_UNKNOWN_PUBLIC_KEY_TYPE 163 +# define ASN1_R_UNKNOWN_SIGNATURE_ALGORITHM 199 +# define ASN1_R_UNKNOWN_TAG 194 +# define ASN1_R_UNKOWN_FORMAT 195 +# define ASN1_R_UNSUPPORTED_ANY_DEFINED_BY_TYPE 164 +# define ASN1_R_UNSUPPORTED_CIPHER 165 +# define ASN1_R_UNSUPPORTED_ENCRYPTION_ALGORITHM 166 +# define ASN1_R_UNSUPPORTED_PUBLIC_KEY_TYPE 167 +# define ASN1_R_UNSUPPORTED_TYPE 196 +# define ASN1_R_WRONG_PUBLIC_KEY_TYPE 200 +# define ASN1_R_WRONG_TAG 168 +# define ASN1_R_WRONG_TYPE 169 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/asn1_mac.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/asn1_mac.h new file mode 100644 index 0000000..abc6dc3 --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/asn1_mac.h @@ -0,0 +1,579 @@ +/* crypto/asn1/asn1_mac.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_ASN1_MAC_H +# define HEADER_ASN1_MAC_H + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# ifndef ASN1_MAC_ERR_LIB +# define ASN1_MAC_ERR_LIB ERR_LIB_ASN1 +# endif + +# define ASN1_MAC_H_err(f,r,line) \ + ERR_PUT_error(ASN1_MAC_ERR_LIB,(f),(r),__FILE__,(line)) + +# define M_ASN1_D2I_vars(a,type,func) \ + ASN1_const_CTX c; \ + type ret=NULL; \ + \ + c.pp=(const unsigned char **)pp; \ + c.q= *(const unsigned char **)pp; \ + c.error=ERR_R_NESTED_ASN1_ERROR; \ + if ((a == NULL) || ((*a) == NULL)) \ + { if ((ret=(type)func()) == NULL) \ + { c.line=__LINE__; goto err; } } \ + else ret=(*a); + +# define M_ASN1_D2I_Init() \ + c.p= *(const unsigned char **)pp; \ + c.max=(length == 0)?0:(c.p+length); + +# define M_ASN1_D2I_Finish_2(a) \ + if (!asn1_const_Finish(&c)) \ + { c.line=__LINE__; goto err; } \ + *(const unsigned char **)pp=c.p; \ + if (a != NULL) (*a)=ret; \ + return(ret); + +# define M_ASN1_D2I_Finish(a,func,e) \ + M_ASN1_D2I_Finish_2(a); \ +err:\ + ASN1_MAC_H_err((e),c.error,c.line); \ + asn1_add_error(*(const unsigned char **)pp,(int)(c.q- *pp)); \ + if ((ret != NULL) && ((a == NULL) || (*a != ret))) func(ret); \ + return(NULL) + +# define M_ASN1_D2I_start_sequence() \ + if (!asn1_GetSequence(&c,&length)) \ + { c.line=__LINE__; goto err; } +/* Begin reading ASN1 without a surrounding sequence */ +# define M_ASN1_D2I_begin() \ + c.slen = length; + +/* End reading ASN1 with no check on length */ +# define M_ASN1_D2I_Finish_nolen(a, func, e) \ + *pp=c.p; \ + if (a != NULL) (*a)=ret; \ + return(ret); \ +err:\ + ASN1_MAC_H_err((e),c.error,c.line); \ + asn1_add_error(*pp,(int)(c.q- *pp)); \ + if ((ret != NULL) && ((a == NULL) || (*a != ret))) func(ret); \ + return(NULL) + +# define M_ASN1_D2I_end_sequence() \ + (((c.inf&1) == 0)?(c.slen <= 0): \ + (c.eos=ASN1_const_check_infinite_end(&c.p,c.slen))) + +/* Don't use this with d2i_ASN1_BOOLEAN() */ +# define M_ASN1_D2I_get(b, func) \ + c.q=c.p; \ + if (func(&(b),&c.p,c.slen) == NULL) \ + {c.line=__LINE__; goto err; } \ + c.slen-=(c.p-c.q); + +/* Don't use this with d2i_ASN1_BOOLEAN() */ +# define M_ASN1_D2I_get_x(type,b,func) \ + c.q=c.p; \ + if (((D2I_OF(type))func)(&(b),&c.p,c.slen) == NULL) \ + {c.line=__LINE__; goto err; } \ + c.slen-=(c.p-c.q); + +/* use this instead () */ +# define M_ASN1_D2I_get_int(b,func) \ + c.q=c.p; \ + if (func(&(b),&c.p,c.slen) < 0) \ + {c.line=__LINE__; goto err; } \ + c.slen-=(c.p-c.q); + +# define M_ASN1_D2I_get_opt(b,func,type) \ + if ((c.slen != 0) && ((M_ASN1_next & (~V_ASN1_CONSTRUCTED)) \ + == (V_ASN1_UNIVERSAL|(type)))) \ + { \ + M_ASN1_D2I_get(b,func); \ + } + +# define M_ASN1_D2I_get_int_opt(b,func,type) \ + if ((c.slen != 0) && ((M_ASN1_next & (~V_ASN1_CONSTRUCTED)) \ + == (V_ASN1_UNIVERSAL|(type)))) \ + { \ + M_ASN1_D2I_get_int(b,func); \ + } + +# define M_ASN1_D2I_get_imp(b,func, type) \ + M_ASN1_next=(_tmp& V_ASN1_CONSTRUCTED)|type; \ + c.q=c.p; \ + if (func(&(b),&c.p,c.slen) == NULL) \ + {c.line=__LINE__; M_ASN1_next_prev = _tmp; goto err; } \ + c.slen-=(c.p-c.q);\ + M_ASN1_next_prev=_tmp; + +# define M_ASN1_D2I_get_IMP_opt(b,func,tag,type) \ + if ((c.slen != 0) && ((M_ASN1_next & (~V_ASN1_CONSTRUCTED)) == \ + (V_ASN1_CONTEXT_SPECIFIC|(tag)))) \ + { \ + unsigned char _tmp = M_ASN1_next; \ + M_ASN1_D2I_get_imp(b,func, type);\ + } + +# define M_ASN1_D2I_get_set(r,func,free_func) \ + M_ASN1_D2I_get_imp_set(r,func,free_func, \ + V_ASN1_SET,V_ASN1_UNIVERSAL); + +# define M_ASN1_D2I_get_set_type(type,r,func,free_func) \ + M_ASN1_D2I_get_imp_set_type(type,r,func,free_func, \ + V_ASN1_SET,V_ASN1_UNIVERSAL); + +# define M_ASN1_D2I_get_set_opt(r,func,free_func) \ + if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \ + V_ASN1_CONSTRUCTED|V_ASN1_SET)))\ + { M_ASN1_D2I_get_set(r,func,free_func); } + +# define M_ASN1_D2I_get_set_opt_type(type,r,func,free_func) \ + if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \ + V_ASN1_CONSTRUCTED|V_ASN1_SET)))\ + { M_ASN1_D2I_get_set_type(type,r,func,free_func); } + +# define M_ASN1_I2D_len_SET_opt(a,f) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + M_ASN1_I2D_len_SET(a,f); + +# define M_ASN1_I2D_put_SET_opt(a,f) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + M_ASN1_I2D_put_SET(a,f); + +# define M_ASN1_I2D_put_SEQUENCE_opt(a,f) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + M_ASN1_I2D_put_SEQUENCE(a,f); + +# define M_ASN1_I2D_put_SEQUENCE_opt_type(type,a,f) \ + if ((a != NULL) && (sk_##type##_num(a) != 0)) \ + M_ASN1_I2D_put_SEQUENCE_type(type,a,f); + +# define M_ASN1_D2I_get_IMP_set_opt(b,func,free_func,tag) \ + if ((c.slen != 0) && \ + (M_ASN1_next == \ + (V_ASN1_CONTEXT_SPECIFIC|V_ASN1_CONSTRUCTED|(tag))))\ + { \ + M_ASN1_D2I_get_imp_set(b,func,free_func,\ + tag,V_ASN1_CONTEXT_SPECIFIC); \ + } + +# define M_ASN1_D2I_get_IMP_set_opt_type(type,b,func,free_func,tag) \ + if ((c.slen != 0) && \ + (M_ASN1_next == \ + (V_ASN1_CONTEXT_SPECIFIC|V_ASN1_CONSTRUCTED|(tag))))\ + { \ + M_ASN1_D2I_get_imp_set_type(type,b,func,free_func,\ + tag,V_ASN1_CONTEXT_SPECIFIC); \ + } + +# define M_ASN1_D2I_get_seq(r,func,free_func) \ + M_ASN1_D2I_get_imp_set(r,func,free_func,\ + V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL); + +# define M_ASN1_D2I_get_seq_type(type,r,func,free_func) \ + M_ASN1_D2I_get_imp_set_type(type,r,func,free_func,\ + V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL) + +# define M_ASN1_D2I_get_seq_opt(r,func,free_func) \ + if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \ + V_ASN1_CONSTRUCTED|V_ASN1_SEQUENCE)))\ + { M_ASN1_D2I_get_seq(r,func,free_func); } + +# define M_ASN1_D2I_get_seq_opt_type(type,r,func,free_func) \ + if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \ + V_ASN1_CONSTRUCTED|V_ASN1_SEQUENCE)))\ + { M_ASN1_D2I_get_seq_type(type,r,func,free_func); } + +# define M_ASN1_D2I_get_IMP_set(r,func,free_func,x) \ + M_ASN1_D2I_get_imp_set(r,func,free_func,\ + x,V_ASN1_CONTEXT_SPECIFIC); + +# define M_ASN1_D2I_get_IMP_set_type(type,r,func,free_func,x) \ + M_ASN1_D2I_get_imp_set_type(type,r,func,free_func,\ + x,V_ASN1_CONTEXT_SPECIFIC); + +# define M_ASN1_D2I_get_imp_set(r,func,free_func,a,b) \ + c.q=c.p; \ + if (d2i_ASN1_SET(&(r),&c.p,c.slen,(char *(*)())func,\ + (void (*)())free_func,a,b) == NULL) \ + { c.line=__LINE__; goto err; } \ + c.slen-=(c.p-c.q); + +# define M_ASN1_D2I_get_imp_set_type(type,r,func,free_func,a,b) \ + c.q=c.p; \ + if (d2i_ASN1_SET_OF_##type(&(r),&c.p,c.slen,func,\ + free_func,a,b) == NULL) \ + { c.line=__LINE__; goto err; } \ + c.slen-=(c.p-c.q); + +# define M_ASN1_D2I_get_set_strings(r,func,a,b) \ + c.q=c.p; \ + if (d2i_ASN1_STRING_SET(&(r),&c.p,c.slen,a,b) == NULL) \ + { c.line=__LINE__; goto err; } \ + c.slen-=(c.p-c.q); + +# define M_ASN1_D2I_get_EXP_opt(r,func,tag) \ + if ((c.slen != 0L) && (M_ASN1_next == \ + (V_ASN1_CONSTRUCTED|V_ASN1_CONTEXT_SPECIFIC|tag))) \ + { \ + int Tinf,Ttag,Tclass; \ + long Tlen; \ + \ + c.q=c.p; \ + Tinf=ASN1_get_object(&c.p,&Tlen,&Ttag,&Tclass,c.slen); \ + if (Tinf & 0x80) \ + { c.error=ERR_R_BAD_ASN1_OBJECT_HEADER; \ + c.line=__LINE__; goto err; } \ + if (Tinf == (V_ASN1_CONSTRUCTED+1)) \ + Tlen = c.slen - (c.p - c.q) - 2; \ + if (func(&(r),&c.p,Tlen) == NULL) \ + { c.line=__LINE__; goto err; } \ + if (Tinf == (V_ASN1_CONSTRUCTED+1)) { \ + Tlen = c.slen - (c.p - c.q); \ + if(!ASN1_const_check_infinite_end(&c.p, Tlen)) \ + { c.error=ERR_R_MISSING_ASN1_EOS; \ + c.line=__LINE__; goto err; } \ + }\ + c.slen-=(c.p-c.q); \ + } + +# define M_ASN1_D2I_get_EXP_set_opt(r,func,free_func,tag,b) \ + if ((c.slen != 0) && (M_ASN1_next == \ + (V_ASN1_CONSTRUCTED|V_ASN1_CONTEXT_SPECIFIC|tag))) \ + { \ + int Tinf,Ttag,Tclass; \ + long Tlen; \ + \ + c.q=c.p; \ + Tinf=ASN1_get_object(&c.p,&Tlen,&Ttag,&Tclass,c.slen); \ + if (Tinf & 0x80) \ + { c.error=ERR_R_BAD_ASN1_OBJECT_HEADER; \ + c.line=__LINE__; goto err; } \ + if (Tinf == (V_ASN1_CONSTRUCTED+1)) \ + Tlen = c.slen - (c.p - c.q) - 2; \ + if (d2i_ASN1_SET(&(r),&c.p,Tlen,(char *(*)())func, \ + (void (*)())free_func, \ + b,V_ASN1_UNIVERSAL) == NULL) \ + { c.line=__LINE__; goto err; } \ + if (Tinf == (V_ASN1_CONSTRUCTED+1)) { \ + Tlen = c.slen - (c.p - c.q); \ + if(!ASN1_check_infinite_end(&c.p, Tlen)) \ + { c.error=ERR_R_MISSING_ASN1_EOS; \ + c.line=__LINE__; goto err; } \ + }\ + c.slen-=(c.p-c.q); \ + } + +# define M_ASN1_D2I_get_EXP_set_opt_type(type,r,func,free_func,tag,b) \ + if ((c.slen != 0) && (M_ASN1_next == \ + (V_ASN1_CONSTRUCTED|V_ASN1_CONTEXT_SPECIFIC|tag))) \ + { \ + int Tinf,Ttag,Tclass; \ + long Tlen; \ + \ + c.q=c.p; \ + Tinf=ASN1_get_object(&c.p,&Tlen,&Ttag,&Tclass,c.slen); \ + if (Tinf & 0x80) \ + { c.error=ERR_R_BAD_ASN1_OBJECT_HEADER; \ + c.line=__LINE__; goto err; } \ + if (Tinf == (V_ASN1_CONSTRUCTED+1)) \ + Tlen = c.slen - (c.p - c.q) - 2; \ + if (d2i_ASN1_SET_OF_##type(&(r),&c.p,Tlen,func, \ + free_func,b,V_ASN1_UNIVERSAL) == NULL) \ + { c.line=__LINE__; goto err; } \ + if (Tinf == (V_ASN1_CONSTRUCTED+1)) { \ + Tlen = c.slen - (c.p - c.q); \ + if(!ASN1_check_infinite_end(&c.p, Tlen)) \ + { c.error=ERR_R_MISSING_ASN1_EOS; \ + c.line=__LINE__; goto err; } \ + }\ + c.slen-=(c.p-c.q); \ + } + +/* New macros */ +# define M_ASN1_New_Malloc(ret,type) \ + if ((ret=(type *)OPENSSL_malloc(sizeof(type))) == NULL) \ + { c.line=__LINE__; goto err2; } + +# define M_ASN1_New(arg,func) \ + if (((arg)=func()) == NULL) return(NULL) + +# define M_ASN1_New_Error(a) \ +/*- err: ASN1_MAC_H_err((a),ERR_R_NESTED_ASN1_ERROR,c.line); \ + return(NULL);*/ \ + err2: ASN1_MAC_H_err((a),ERR_R_MALLOC_FAILURE,c.line); \ + return(NULL) + +/* + * BIG UGLY WARNING! This is so damn ugly I wanna puke. Unfortunately, some + * macros that use ASN1_const_CTX still insist on writing in the input + * stream. ARGH! ARGH! ARGH! Let's get rid of this macro package. Please? -- + * Richard Levitte + */ +# define M_ASN1_next (*((unsigned char *)(c.p))) +# define M_ASN1_next_prev (*((unsigned char *)(c.q))) + +/*************************************************/ + +# define M_ASN1_I2D_vars(a) int r=0,ret=0; \ + unsigned char *p; \ + if (a == NULL) return(0) + +/* Length Macros */ +# define M_ASN1_I2D_len(a,f) ret+=f(a,NULL) +# define M_ASN1_I2D_len_IMP_opt(a,f) if (a != NULL) M_ASN1_I2D_len(a,f) + +# define M_ASN1_I2D_len_SET(a,f) \ + ret+=i2d_ASN1_SET(a,NULL,f,V_ASN1_SET,V_ASN1_UNIVERSAL,IS_SET); + +# define M_ASN1_I2D_len_SET_type(type,a,f) \ + ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,V_ASN1_SET, \ + V_ASN1_UNIVERSAL,IS_SET); + +# define M_ASN1_I2D_len_SEQUENCE(a,f) \ + ret+=i2d_ASN1_SET(a,NULL,f,V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL, \ + IS_SEQUENCE); + +# define M_ASN1_I2D_len_SEQUENCE_type(type,a,f) \ + ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,V_ASN1_SEQUENCE, \ + V_ASN1_UNIVERSAL,IS_SEQUENCE) + +# define M_ASN1_I2D_len_SEQUENCE_opt(a,f) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + M_ASN1_I2D_len_SEQUENCE(a,f); + +# define M_ASN1_I2D_len_SEQUENCE_opt_type(type,a,f) \ + if ((a != NULL) && (sk_##type##_num(a) != 0)) \ + M_ASN1_I2D_len_SEQUENCE_type(type,a,f); + +# define M_ASN1_I2D_len_IMP_SET(a,f,x) \ + ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC,IS_SET); + +# define M_ASN1_I2D_len_IMP_SET_type(type,a,f,x) \ + ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,x, \ + V_ASN1_CONTEXT_SPECIFIC,IS_SET); + +# define M_ASN1_I2D_len_IMP_SET_opt(a,f,x) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC, \ + IS_SET); + +# define M_ASN1_I2D_len_IMP_SET_opt_type(type,a,f,x) \ + if ((a != NULL) && (sk_##type##_num(a) != 0)) \ + ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,x, \ + V_ASN1_CONTEXT_SPECIFIC,IS_SET); + +# define M_ASN1_I2D_len_IMP_SEQUENCE(a,f,x) \ + ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC, \ + IS_SEQUENCE); + +# define M_ASN1_I2D_len_IMP_SEQUENCE_opt(a,f,x) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC, \ + IS_SEQUENCE); + +# define M_ASN1_I2D_len_IMP_SEQUENCE_opt_type(type,a,f,x) \ + if ((a != NULL) && (sk_##type##_num(a) != 0)) \ + ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,x, \ + V_ASN1_CONTEXT_SPECIFIC, \ + IS_SEQUENCE); + +# define M_ASN1_I2D_len_EXP_opt(a,f,mtag,v) \ + if (a != NULL)\ + { \ + v=f(a,NULL); \ + ret+=ASN1_object_size(1,v,mtag); \ + } + +# define M_ASN1_I2D_len_EXP_SET_opt(a,f,mtag,tag,v) \ + if ((a != NULL) && (sk_num(a) != 0))\ + { \ + v=i2d_ASN1_SET(a,NULL,f,tag,V_ASN1_UNIVERSAL,IS_SET); \ + ret+=ASN1_object_size(1,v,mtag); \ + } + +# define M_ASN1_I2D_len_EXP_SEQUENCE_opt(a,f,mtag,tag,v) \ + if ((a != NULL) && (sk_num(a) != 0))\ + { \ + v=i2d_ASN1_SET(a,NULL,f,tag,V_ASN1_UNIVERSAL, \ + IS_SEQUENCE); \ + ret+=ASN1_object_size(1,v,mtag); \ + } + +# define M_ASN1_I2D_len_EXP_SEQUENCE_opt_type(type,a,f,mtag,tag,v) \ + if ((a != NULL) && (sk_##type##_num(a) != 0))\ + { \ + v=i2d_ASN1_SET_OF_##type(a,NULL,f,tag, \ + V_ASN1_UNIVERSAL, \ + IS_SEQUENCE); \ + ret+=ASN1_object_size(1,v,mtag); \ + } + +/* Put Macros */ +# define M_ASN1_I2D_put(a,f) f(a,&p) + +# define M_ASN1_I2D_put_IMP_opt(a,f,t) \ + if (a != NULL) \ + { \ + unsigned char *q=p; \ + f(a,&p); \ + *q=(V_ASN1_CONTEXT_SPECIFIC|t|(*q&V_ASN1_CONSTRUCTED));\ + } + +# define M_ASN1_I2D_put_SET(a,f) i2d_ASN1_SET(a,&p,f,V_ASN1_SET,\ + V_ASN1_UNIVERSAL,IS_SET) +# define M_ASN1_I2D_put_SET_type(type,a,f) \ + i2d_ASN1_SET_OF_##type(a,&p,f,V_ASN1_SET,V_ASN1_UNIVERSAL,IS_SET) +# define M_ASN1_I2D_put_IMP_SET(a,f,x) i2d_ASN1_SET(a,&p,f,x,\ + V_ASN1_CONTEXT_SPECIFIC,IS_SET) +# define M_ASN1_I2D_put_IMP_SET_type(type,a,f,x) \ + i2d_ASN1_SET_OF_##type(a,&p,f,x,V_ASN1_CONTEXT_SPECIFIC,IS_SET) +# define M_ASN1_I2D_put_IMP_SEQUENCE(a,f,x) i2d_ASN1_SET(a,&p,f,x,\ + V_ASN1_CONTEXT_SPECIFIC,IS_SEQUENCE) + +# define M_ASN1_I2D_put_SEQUENCE(a,f) i2d_ASN1_SET(a,&p,f,V_ASN1_SEQUENCE,\ + V_ASN1_UNIVERSAL,IS_SEQUENCE) + +# define M_ASN1_I2D_put_SEQUENCE_type(type,a,f) \ + i2d_ASN1_SET_OF_##type(a,&p,f,V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL, \ + IS_SEQUENCE) + +# define M_ASN1_I2D_put_SEQUENCE_opt(a,f) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + M_ASN1_I2D_put_SEQUENCE(a,f); + +# define M_ASN1_I2D_put_IMP_SET_opt(a,f,x) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + { i2d_ASN1_SET(a,&p,f,x,V_ASN1_CONTEXT_SPECIFIC, \ + IS_SET); } + +# define M_ASN1_I2D_put_IMP_SET_opt_type(type,a,f,x) \ + if ((a != NULL) && (sk_##type##_num(a) != 0)) \ + { i2d_ASN1_SET_OF_##type(a,&p,f,x, \ + V_ASN1_CONTEXT_SPECIFIC, \ + IS_SET); } + +# define M_ASN1_I2D_put_IMP_SEQUENCE_opt(a,f,x) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + { i2d_ASN1_SET(a,&p,f,x,V_ASN1_CONTEXT_SPECIFIC, \ + IS_SEQUENCE); } + +# define M_ASN1_I2D_put_IMP_SEQUENCE_opt_type(type,a,f,x) \ + if ((a != NULL) && (sk_##type##_num(a) != 0)) \ + { i2d_ASN1_SET_OF_##type(a,&p,f,x, \ + V_ASN1_CONTEXT_SPECIFIC, \ + IS_SEQUENCE); } + +# define M_ASN1_I2D_put_EXP_opt(a,f,tag,v) \ + if (a != NULL) \ + { \ + ASN1_put_object(&p,1,v,tag,V_ASN1_CONTEXT_SPECIFIC); \ + f(a,&p); \ + } + +# define M_ASN1_I2D_put_EXP_SET_opt(a,f,mtag,tag,v) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + { \ + ASN1_put_object(&p,1,v,mtag,V_ASN1_CONTEXT_SPECIFIC); \ + i2d_ASN1_SET(a,&p,f,tag,V_ASN1_UNIVERSAL,IS_SET); \ + } + +# define M_ASN1_I2D_put_EXP_SEQUENCE_opt(a,f,mtag,tag,v) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + { \ + ASN1_put_object(&p,1,v,mtag,V_ASN1_CONTEXT_SPECIFIC); \ + i2d_ASN1_SET(a,&p,f,tag,V_ASN1_UNIVERSAL,IS_SEQUENCE); \ + } + +# define M_ASN1_I2D_put_EXP_SEQUENCE_opt_type(type,a,f,mtag,tag,v) \ + if ((a != NULL) && (sk_##type##_num(a) != 0)) \ + { \ + ASN1_put_object(&p,1,v,mtag,V_ASN1_CONTEXT_SPECIFIC); \ + i2d_ASN1_SET_OF_##type(a,&p,f,tag,V_ASN1_UNIVERSAL, \ + IS_SEQUENCE); \ + } + +# define M_ASN1_I2D_seq_total() \ + r=ASN1_object_size(1,ret,V_ASN1_SEQUENCE); \ + if (pp == NULL) return(r); \ + p= *pp; \ + ASN1_put_object(&p,1,ret,V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL) + +# define M_ASN1_I2D_INF_seq_start(tag,ctx) \ + *(p++)=(V_ASN1_CONSTRUCTED|(tag)|(ctx)); \ + *(p++)=0x80 + +# define M_ASN1_I2D_INF_seq_end() *(p++)=0x00; *(p++)=0x00 + +# define M_ASN1_I2D_finish() *pp=p; \ + return(r); + +int asn1_GetSequence(ASN1_const_CTX *c, long *length); +void asn1_add_error(const unsigned char *address, int offset); +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/asn1t.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/asn1t.h new file mode 100644 index 0000000..99bc0ee --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/asn1t.h @@ -0,0 +1,973 @@ +/* asn1t.h */ +/* + * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project + * 2000. + */ +/* ==================================================================== + * Copyright (c) 2000-2005 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +#ifndef HEADER_ASN1T_H +# define HEADER_ASN1T_H + +# include +# include +# include + +# ifdef OPENSSL_BUILD_SHLIBCRYPTO +# undef OPENSSL_EXTERN +# define OPENSSL_EXTERN OPENSSL_EXPORT +# endif + +/* ASN1 template defines, structures and functions */ + +#ifdef __cplusplus +extern "C" { +#endif + +# ifndef OPENSSL_EXPORT_VAR_AS_FUNCTION + +/* Macro to obtain ASN1_ADB pointer from a type (only used internally) */ +# define ASN1_ADB_ptr(iptr) ((const ASN1_ADB *)(iptr)) + +/* Macros for start and end of ASN1_ITEM definition */ + +# define ASN1_ITEM_start(itname) \ + OPENSSL_GLOBAL const ASN1_ITEM itname##_it = { + +# define ASN1_ITEM_end(itname) \ + }; + +# else + +/* Macro to obtain ASN1_ADB pointer from a type (only used internally) */ +# define ASN1_ADB_ptr(iptr) ((const ASN1_ADB *)(iptr())) + +/* Macros for start and end of ASN1_ITEM definition */ + +# define ASN1_ITEM_start(itname) \ + const ASN1_ITEM * itname##_it(void) \ + { \ + static const ASN1_ITEM local_it = { + +# define ASN1_ITEM_end(itname) \ + }; \ + return &local_it; \ + } + +# endif + +/* Macros to aid ASN1 template writing */ + +# define ASN1_ITEM_TEMPLATE(tname) \ + static const ASN1_TEMPLATE tname##_item_tt + +# define ASN1_ITEM_TEMPLATE_END(tname) \ + ;\ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_PRIMITIVE,\ + -1,\ + &tname##_item_tt,\ + 0,\ + NULL,\ + 0,\ + #tname \ + ASN1_ITEM_end(tname) + +/* This is a ASN1 type which just embeds a template */ + +/*- + * This pair helps declare a SEQUENCE. We can do: + * + * ASN1_SEQUENCE(stname) = { + * ... SEQUENCE components ... + * } ASN1_SEQUENCE_END(stname) + * + * This will produce an ASN1_ITEM called stname_it + * for a structure called stname. + * + * If you want the same structure but a different + * name then use: + * + * ASN1_SEQUENCE(itname) = { + * ... SEQUENCE components ... + * } ASN1_SEQUENCE_END_name(stname, itname) + * + * This will create an item called itname_it using + * a structure called stname. + */ + +# define ASN1_SEQUENCE(tname) \ + static const ASN1_TEMPLATE tname##_seq_tt[] + +# define ASN1_SEQUENCE_END(stname) ASN1_SEQUENCE_END_name(stname, stname) + +# define ASN1_SEQUENCE_END_name(stname, tname) \ + ;\ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_SEQUENCE,\ + V_ASN1_SEQUENCE,\ + tname##_seq_tt,\ + sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ + NULL,\ + sizeof(stname),\ + #stname \ + ASN1_ITEM_end(tname) + +# define ASN1_NDEF_SEQUENCE(tname) \ + ASN1_SEQUENCE(tname) + +# define ASN1_NDEF_SEQUENCE_cb(tname, cb) \ + ASN1_SEQUENCE_cb(tname, cb) + +# define ASN1_SEQUENCE_cb(tname, cb) \ + static const ASN1_AUX tname##_aux = {NULL, 0, 0, 0, cb, 0}; \ + ASN1_SEQUENCE(tname) + +# define ASN1_BROKEN_SEQUENCE(tname) \ + static const ASN1_AUX tname##_aux = {NULL, ASN1_AFLG_BROKEN, 0, 0, 0, 0}; \ + ASN1_SEQUENCE(tname) + +# define ASN1_SEQUENCE_ref(tname, cb, lck) \ + static const ASN1_AUX tname##_aux = {NULL, ASN1_AFLG_REFCOUNT, offsetof(tname, references), lck, cb, 0}; \ + ASN1_SEQUENCE(tname) + +# define ASN1_SEQUENCE_enc(tname, enc, cb) \ + static const ASN1_AUX tname##_aux = {NULL, ASN1_AFLG_ENCODING, 0, 0, cb, offsetof(tname, enc)}; \ + ASN1_SEQUENCE(tname) + +# define ASN1_NDEF_SEQUENCE_END(tname) \ + ;\ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_NDEF_SEQUENCE,\ + V_ASN1_SEQUENCE,\ + tname##_seq_tt,\ + sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ + NULL,\ + sizeof(tname),\ + #tname \ + ASN1_ITEM_end(tname) + +# define ASN1_BROKEN_SEQUENCE_END(stname) ASN1_SEQUENCE_END_ref(stname, stname) + +# define ASN1_SEQUENCE_END_enc(stname, tname) ASN1_SEQUENCE_END_ref(stname, tname) + +# define ASN1_SEQUENCE_END_cb(stname, tname) ASN1_SEQUENCE_END_ref(stname, tname) + +# define ASN1_SEQUENCE_END_ref(stname, tname) \ + ;\ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_SEQUENCE,\ + V_ASN1_SEQUENCE,\ + tname##_seq_tt,\ + sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ + &tname##_aux,\ + sizeof(stname),\ + #stname \ + ASN1_ITEM_end(tname) + +# define ASN1_NDEF_SEQUENCE_END_cb(stname, tname) \ + ;\ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_NDEF_SEQUENCE,\ + V_ASN1_SEQUENCE,\ + tname##_seq_tt,\ + sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ + &tname##_aux,\ + sizeof(stname),\ + #stname \ + ASN1_ITEM_end(tname) + +/*- + * This pair helps declare a CHOICE type. We can do: + * + * ASN1_CHOICE(chname) = { + * ... CHOICE options ... + * ASN1_CHOICE_END(chname) + * + * This will produce an ASN1_ITEM called chname_it + * for a structure called chname. The structure + * definition must look like this: + * typedef struct { + * int type; + * union { + * ASN1_SOMETHING *opt1; + * ASN1_SOMEOTHER *opt2; + * } value; + * } chname; + * + * the name of the selector must be 'type'. + * to use an alternative selector name use the + * ASN1_CHOICE_END_selector() version. + */ + +# define ASN1_CHOICE(tname) \ + static const ASN1_TEMPLATE tname##_ch_tt[] + +# define ASN1_CHOICE_cb(tname, cb) \ + static const ASN1_AUX tname##_aux = {NULL, 0, 0, 0, cb, 0}; \ + ASN1_CHOICE(tname) + +# define ASN1_CHOICE_END(stname) ASN1_CHOICE_END_name(stname, stname) + +# define ASN1_CHOICE_END_name(stname, tname) ASN1_CHOICE_END_selector(stname, tname, type) + +# define ASN1_CHOICE_END_selector(stname, tname, selname) \ + ;\ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_CHOICE,\ + offsetof(stname,selname) ,\ + tname##_ch_tt,\ + sizeof(tname##_ch_tt) / sizeof(ASN1_TEMPLATE),\ + NULL,\ + sizeof(stname),\ + #stname \ + ASN1_ITEM_end(tname) + +# define ASN1_CHOICE_END_cb(stname, tname, selname) \ + ;\ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_CHOICE,\ + offsetof(stname,selname) ,\ + tname##_ch_tt,\ + sizeof(tname##_ch_tt) / sizeof(ASN1_TEMPLATE),\ + &tname##_aux,\ + sizeof(stname),\ + #stname \ + ASN1_ITEM_end(tname) + +/* This helps with the template wrapper form of ASN1_ITEM */ + +# define ASN1_EX_TEMPLATE_TYPE(flags, tag, name, type) { \ + (flags), (tag), 0,\ + #name, ASN1_ITEM_ref(type) } + +/* These help with SEQUENCE or CHOICE components */ + +/* used to declare other types */ + +# define ASN1_EX_TYPE(flags, tag, stname, field, type) { \ + (flags), (tag), offsetof(stname, field),\ + #field, ASN1_ITEM_ref(type) } + +/* used when the structure is combined with the parent */ + +# define ASN1_EX_COMBINE(flags, tag, type) { \ + (flags)|ASN1_TFLG_COMBINE, (tag), 0, NULL, ASN1_ITEM_ref(type) } + +/* implicit and explicit helper macros */ + +# define ASN1_IMP_EX(stname, field, type, tag, ex) \ + ASN1_EX_TYPE(ASN1_TFLG_IMPLICIT | ex, tag, stname, field, type) + +# define ASN1_EXP_EX(stname, field, type, tag, ex) \ + ASN1_EX_TYPE(ASN1_TFLG_EXPLICIT | ex, tag, stname, field, type) + +/* Any defined by macros: the field used is in the table itself */ + +# ifndef OPENSSL_EXPORT_VAR_AS_FUNCTION +# define ASN1_ADB_OBJECT(tblname) { ASN1_TFLG_ADB_OID, -1, 0, #tblname, (const ASN1_ITEM *)&(tblname##_adb) } +# define ASN1_ADB_INTEGER(tblname) { ASN1_TFLG_ADB_INT, -1, 0, #tblname, (const ASN1_ITEM *)&(tblname##_adb) } +# else +# define ASN1_ADB_OBJECT(tblname) { ASN1_TFLG_ADB_OID, -1, 0, #tblname, tblname##_adb } +# define ASN1_ADB_INTEGER(tblname) { ASN1_TFLG_ADB_INT, -1, 0, #tblname, tblname##_adb } +# endif +/* Plain simple type */ +# define ASN1_SIMPLE(stname, field, type) ASN1_EX_TYPE(0,0, stname, field, type) + +/* OPTIONAL simple type */ +# define ASN1_OPT(stname, field, type) ASN1_EX_TYPE(ASN1_TFLG_OPTIONAL, 0, stname, field, type) + +/* IMPLICIT tagged simple type */ +# define ASN1_IMP(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, 0) + +/* IMPLICIT tagged OPTIONAL simple type */ +# define ASN1_IMP_OPT(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL) + +/* Same as above but EXPLICIT */ + +# define ASN1_EXP(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, 0) +# define ASN1_EXP_OPT(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL) + +/* SEQUENCE OF type */ +# define ASN1_SEQUENCE_OF(stname, field, type) \ + ASN1_EX_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, stname, field, type) + +/* OPTIONAL SEQUENCE OF */ +# define ASN1_SEQUENCE_OF_OPT(stname, field, type) \ + ASN1_EX_TYPE(ASN1_TFLG_SEQUENCE_OF|ASN1_TFLG_OPTIONAL, 0, stname, field, type) + +/* Same as above but for SET OF */ + +# define ASN1_SET_OF(stname, field, type) \ + ASN1_EX_TYPE(ASN1_TFLG_SET_OF, 0, stname, field, type) + +# define ASN1_SET_OF_OPT(stname, field, type) \ + ASN1_EX_TYPE(ASN1_TFLG_SET_OF|ASN1_TFLG_OPTIONAL, 0, stname, field, type) + +/* Finally compound types of SEQUENCE, SET, IMPLICIT, EXPLICIT and OPTIONAL */ + +# define ASN1_IMP_SET_OF(stname, field, type, tag) \ + ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF) + +# define ASN1_EXP_SET_OF(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF) + +# define ASN1_IMP_SET_OF_OPT(stname, field, type, tag) \ + ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF|ASN1_TFLG_OPTIONAL) + +# define ASN1_EXP_SET_OF_OPT(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF|ASN1_TFLG_OPTIONAL) + +# define ASN1_IMP_SEQUENCE_OF(stname, field, type, tag) \ + ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF) + +# define ASN1_IMP_SEQUENCE_OF_OPT(stname, field, type, tag) \ + ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF|ASN1_TFLG_OPTIONAL) + +# define ASN1_EXP_SEQUENCE_OF(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF) + +# define ASN1_EXP_SEQUENCE_OF_OPT(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF|ASN1_TFLG_OPTIONAL) + +/* EXPLICIT using indefinite length constructed form */ +# define ASN1_NDEF_EXP(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_NDEF) + +/* EXPLICIT OPTIONAL using indefinite length constructed form */ +# define ASN1_NDEF_EXP_OPT(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL|ASN1_TFLG_NDEF) + +/* Macros for the ASN1_ADB structure */ + +# define ASN1_ADB(name) \ + static const ASN1_ADB_TABLE name##_adbtbl[] + +# ifndef OPENSSL_EXPORT_VAR_AS_FUNCTION + +# define ASN1_ADB_END(name, flags, field, app_table, def, none) \ + ;\ + static const ASN1_ADB name##_adb = {\ + flags,\ + offsetof(name, field),\ + app_table,\ + name##_adbtbl,\ + sizeof(name##_adbtbl) / sizeof(ASN1_ADB_TABLE),\ + def,\ + none\ + } + +# else + +# define ASN1_ADB_END(name, flags, field, app_table, def, none) \ + ;\ + static const ASN1_ITEM *name##_adb(void) \ + { \ + static const ASN1_ADB internal_adb = \ + {\ + flags,\ + offsetof(name, field),\ + app_table,\ + name##_adbtbl,\ + sizeof(name##_adbtbl) / sizeof(ASN1_ADB_TABLE),\ + def,\ + none\ + }; \ + return (const ASN1_ITEM *) &internal_adb; \ + } \ + void dummy_function(void) + +# endif + +# define ADB_ENTRY(val, template) {val, template} + +# define ASN1_ADB_TEMPLATE(name) \ + static const ASN1_TEMPLATE name##_tt + +/* + * This is the ASN1 template structure that defines a wrapper round the + * actual type. It determines the actual position of the field in the value + * structure, various flags such as OPTIONAL and the field name. + */ + +struct ASN1_TEMPLATE_st { + unsigned long flags; /* Various flags */ + long tag; /* tag, not used if no tagging */ + unsigned long offset; /* Offset of this field in structure */ +# ifndef NO_ASN1_FIELD_NAMES + const char *field_name; /* Field name */ +# endif + ASN1_ITEM_EXP *item; /* Relevant ASN1_ITEM or ASN1_ADB */ +}; + +/* Macro to extract ASN1_ITEM and ASN1_ADB pointer from ASN1_TEMPLATE */ + +# define ASN1_TEMPLATE_item(t) (t->item_ptr) +# define ASN1_TEMPLATE_adb(t) (t->item_ptr) + +typedef struct ASN1_ADB_TABLE_st ASN1_ADB_TABLE; +typedef struct ASN1_ADB_st ASN1_ADB; + +struct ASN1_ADB_st { + unsigned long flags; /* Various flags */ + unsigned long offset; /* Offset of selector field */ + STACK_OF(ASN1_ADB_TABLE) **app_items; /* Application defined items */ + const ASN1_ADB_TABLE *tbl; /* Table of possible types */ + long tblcount; /* Number of entries in tbl */ + const ASN1_TEMPLATE *default_tt; /* Type to use if no match */ + const ASN1_TEMPLATE *null_tt; /* Type to use if selector is NULL */ +}; + +struct ASN1_ADB_TABLE_st { + long value; /* NID for an object or value for an int */ + const ASN1_TEMPLATE tt; /* item for this value */ +}; + +/* template flags */ + +/* Field is optional */ +# define ASN1_TFLG_OPTIONAL (0x1) + +/* Field is a SET OF */ +# define ASN1_TFLG_SET_OF (0x1 << 1) + +/* Field is a SEQUENCE OF */ +# define ASN1_TFLG_SEQUENCE_OF (0x2 << 1) + +/* + * Special case: this refers to a SET OF that will be sorted into DER order + * when encoded *and* the corresponding STACK will be modified to match the + * new order. + */ +# define ASN1_TFLG_SET_ORDER (0x3 << 1) + +/* Mask for SET OF or SEQUENCE OF */ +# define ASN1_TFLG_SK_MASK (0x3 << 1) + +/* + * These flags mean the tag should be taken from the tag field. If EXPLICIT + * then the underlying type is used for the inner tag. + */ + +/* IMPLICIT tagging */ +# define ASN1_TFLG_IMPTAG (0x1 << 3) + +/* EXPLICIT tagging, inner tag from underlying type */ +# define ASN1_TFLG_EXPTAG (0x2 << 3) + +# define ASN1_TFLG_TAG_MASK (0x3 << 3) + +/* context specific IMPLICIT */ +# define ASN1_TFLG_IMPLICIT ASN1_TFLG_IMPTAG|ASN1_TFLG_CONTEXT + +/* context specific EXPLICIT */ +# define ASN1_TFLG_EXPLICIT ASN1_TFLG_EXPTAG|ASN1_TFLG_CONTEXT + +/* + * If tagging is in force these determine the type of tag to use. Otherwise + * the tag is determined by the underlying type. These values reflect the + * actual octet format. + */ + +/* Universal tag */ +# define ASN1_TFLG_UNIVERSAL (0x0<<6) +/* Application tag */ +# define ASN1_TFLG_APPLICATION (0x1<<6) +/* Context specific tag */ +# define ASN1_TFLG_CONTEXT (0x2<<6) +/* Private tag */ +# define ASN1_TFLG_PRIVATE (0x3<<6) + +# define ASN1_TFLG_TAG_CLASS (0x3<<6) + +/* + * These are for ANY DEFINED BY type. In this case the 'item' field points to + * an ASN1_ADB structure which contains a table of values to decode the + * relevant type + */ + +# define ASN1_TFLG_ADB_MASK (0x3<<8) + +# define ASN1_TFLG_ADB_OID (0x1<<8) + +# define ASN1_TFLG_ADB_INT (0x1<<9) + +/* + * This flag means a parent structure is passed instead of the field: this is + * useful is a SEQUENCE is being combined with a CHOICE for example. Since + * this means the structure and item name will differ we need to use the + * ASN1_CHOICE_END_name() macro for example. + */ + +# define ASN1_TFLG_COMBINE (0x1<<10) + +/* + * This flag when present in a SEQUENCE OF, SET OF or EXPLICIT causes + * indefinite length constructed encoding to be used if required. + */ + +# define ASN1_TFLG_NDEF (0x1<<11) + +/* This is the actual ASN1 item itself */ + +struct ASN1_ITEM_st { + char itype; /* The item type, primitive, SEQUENCE, CHOICE + * or extern */ + long utype; /* underlying type */ + const ASN1_TEMPLATE *templates; /* If SEQUENCE or CHOICE this contains + * the contents */ + long tcount; /* Number of templates if SEQUENCE or CHOICE */ + const void *funcs; /* functions that handle this type */ + long size; /* Structure size (usually) */ +# ifndef NO_ASN1_FIELD_NAMES + const char *sname; /* Structure name */ +# endif +}; + +/*- + * These are values for the itype field and + * determine how the type is interpreted. + * + * For PRIMITIVE types the underlying type + * determines the behaviour if items is NULL. + * + * Otherwise templates must contain a single + * template and the type is treated in the + * same way as the type specified in the template. + * + * For SEQUENCE types the templates field points + * to the members, the size field is the + * structure size. + * + * For CHOICE types the templates field points + * to each possible member (typically a union) + * and the 'size' field is the offset of the + * selector. + * + * The 'funcs' field is used for application + * specific functions. + * + * For COMPAT types the funcs field gives a + * set of functions that handle this type, this + * supports the old d2i, i2d convention. + * + * The EXTERN type uses a new style d2i/i2d. + * The new style should be used where possible + * because it avoids things like the d2i IMPLICIT + * hack. + * + * MSTRING is a multiple string type, it is used + * for a CHOICE of character strings where the + * actual strings all occupy an ASN1_STRING + * structure. In this case the 'utype' field + * has a special meaning, it is used as a mask + * of acceptable types using the B_ASN1 constants. + * + * NDEF_SEQUENCE is the same as SEQUENCE except + * that it will use indefinite length constructed + * encoding if requested. + * + */ + +# define ASN1_ITYPE_PRIMITIVE 0x0 + +# define ASN1_ITYPE_SEQUENCE 0x1 + +# define ASN1_ITYPE_CHOICE 0x2 + +# define ASN1_ITYPE_COMPAT 0x3 + +# define ASN1_ITYPE_EXTERN 0x4 + +# define ASN1_ITYPE_MSTRING 0x5 + +# define ASN1_ITYPE_NDEF_SEQUENCE 0x6 + +/* + * Cache for ASN1 tag and length, so we don't keep re-reading it for things + * like CHOICE + */ + +struct ASN1_TLC_st { + char valid; /* Values below are valid */ + int ret; /* return value */ + long plen; /* length */ + int ptag; /* class value */ + int pclass; /* class value */ + int hdrlen; /* header length */ +}; + +/* Typedefs for ASN1 function pointers */ + +typedef ASN1_VALUE *ASN1_new_func(void); +typedef void ASN1_free_func(ASN1_VALUE *a); +typedef ASN1_VALUE *ASN1_d2i_func(ASN1_VALUE **a, const unsigned char **in, + long length); +typedef int ASN1_i2d_func(ASN1_VALUE *a, unsigned char **in); + +typedef int ASN1_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, + const ASN1_ITEM *it, int tag, int aclass, char opt, + ASN1_TLC *ctx); + +typedef int ASN1_ex_i2d(ASN1_VALUE **pval, unsigned char **out, + const ASN1_ITEM *it, int tag, int aclass); +typedef int ASN1_ex_new_func(ASN1_VALUE **pval, const ASN1_ITEM *it); +typedef void ASN1_ex_free_func(ASN1_VALUE **pval, const ASN1_ITEM *it); + +typedef int ASN1_ex_print_func(BIO *out, ASN1_VALUE **pval, + int indent, const char *fname, + const ASN1_PCTX *pctx); + +typedef int ASN1_primitive_i2c(ASN1_VALUE **pval, unsigned char *cont, + int *putype, const ASN1_ITEM *it); +typedef int ASN1_primitive_c2i(ASN1_VALUE **pval, const unsigned char *cont, + int len, int utype, char *free_cont, + const ASN1_ITEM *it); +typedef int ASN1_primitive_print(BIO *out, ASN1_VALUE **pval, + const ASN1_ITEM *it, int indent, + const ASN1_PCTX *pctx); + +typedef struct ASN1_COMPAT_FUNCS_st { + ASN1_new_func *asn1_new; + ASN1_free_func *asn1_free; + ASN1_d2i_func *asn1_d2i; + ASN1_i2d_func *asn1_i2d; +} ASN1_COMPAT_FUNCS; + +typedef struct ASN1_EXTERN_FUNCS_st { + void *app_data; + ASN1_ex_new_func *asn1_ex_new; + ASN1_ex_free_func *asn1_ex_free; + ASN1_ex_free_func *asn1_ex_clear; + ASN1_ex_d2i *asn1_ex_d2i; + ASN1_ex_i2d *asn1_ex_i2d; + ASN1_ex_print_func *asn1_ex_print; +} ASN1_EXTERN_FUNCS; + +typedef struct ASN1_PRIMITIVE_FUNCS_st { + void *app_data; + unsigned long flags; + ASN1_ex_new_func *prim_new; + ASN1_ex_free_func *prim_free; + ASN1_ex_free_func *prim_clear; + ASN1_primitive_c2i *prim_c2i; + ASN1_primitive_i2c *prim_i2c; + ASN1_primitive_print *prim_print; +} ASN1_PRIMITIVE_FUNCS; + +/* + * This is the ASN1_AUX structure: it handles various miscellaneous + * requirements. For example the use of reference counts and an informational + * callback. The "informational callback" is called at various points during + * the ASN1 encoding and decoding. It can be used to provide minor + * customisation of the structures used. This is most useful where the + * supplied routines *almost* do the right thing but need some extra help at + * a few points. If the callback returns zero then it is assumed a fatal + * error has occurred and the main operation should be abandoned. If major + * changes in the default behaviour are required then an external type is + * more appropriate. + */ + +typedef int ASN1_aux_cb(int operation, ASN1_VALUE **in, const ASN1_ITEM *it, + void *exarg); + +typedef struct ASN1_AUX_st { + void *app_data; + int flags; + int ref_offset; /* Offset of reference value */ + int ref_lock; /* Lock type to use */ + ASN1_aux_cb *asn1_cb; + int enc_offset; /* Offset of ASN1_ENCODING structure */ +} ASN1_AUX; + +/* For print related callbacks exarg points to this structure */ +typedef struct ASN1_PRINT_ARG_st { + BIO *out; + int indent; + const ASN1_PCTX *pctx; +} ASN1_PRINT_ARG; + +/* For streaming related callbacks exarg points to this structure */ +typedef struct ASN1_STREAM_ARG_st { + /* BIO to stream through */ + BIO *out; + /* BIO with filters appended */ + BIO *ndef_bio; + /* Streaming I/O boundary */ + unsigned char **boundary; +} ASN1_STREAM_ARG; + +/* Flags in ASN1_AUX */ + +/* Use a reference count */ +# define ASN1_AFLG_REFCOUNT 1 +/* Save the encoding of structure (useful for signatures) */ +# define ASN1_AFLG_ENCODING 2 +/* The Sequence length is invalid */ +# define ASN1_AFLG_BROKEN 4 + +/* operation values for asn1_cb */ + +# define ASN1_OP_NEW_PRE 0 +# define ASN1_OP_NEW_POST 1 +# define ASN1_OP_FREE_PRE 2 +# define ASN1_OP_FREE_POST 3 +# define ASN1_OP_D2I_PRE 4 +# define ASN1_OP_D2I_POST 5 +# define ASN1_OP_I2D_PRE 6 +# define ASN1_OP_I2D_POST 7 +# define ASN1_OP_PRINT_PRE 8 +# define ASN1_OP_PRINT_POST 9 +# define ASN1_OP_STREAM_PRE 10 +# define ASN1_OP_STREAM_POST 11 +# define ASN1_OP_DETACHED_PRE 12 +# define ASN1_OP_DETACHED_POST 13 + +/* Macro to implement a primitive type */ +# define IMPLEMENT_ASN1_TYPE(stname) IMPLEMENT_ASN1_TYPE_ex(stname, stname, 0) +# define IMPLEMENT_ASN1_TYPE_ex(itname, vname, ex) \ + ASN1_ITEM_start(itname) \ + ASN1_ITYPE_PRIMITIVE, V_##vname, NULL, 0, NULL, ex, #itname \ + ASN1_ITEM_end(itname) + +/* Macro to implement a multi string type */ +# define IMPLEMENT_ASN1_MSTRING(itname, mask) \ + ASN1_ITEM_start(itname) \ + ASN1_ITYPE_MSTRING, mask, NULL, 0, NULL, sizeof(ASN1_STRING), #itname \ + ASN1_ITEM_end(itname) + +/* Macro to implement an ASN1_ITEM in terms of old style funcs */ + +# define IMPLEMENT_COMPAT_ASN1(sname) IMPLEMENT_COMPAT_ASN1_type(sname, V_ASN1_SEQUENCE) + +# define IMPLEMENT_COMPAT_ASN1_type(sname, tag) \ + static const ASN1_COMPAT_FUNCS sname##_ff = { \ + (ASN1_new_func *)sname##_new, \ + (ASN1_free_func *)sname##_free, \ + (ASN1_d2i_func *)d2i_##sname, \ + (ASN1_i2d_func *)i2d_##sname, \ + }; \ + ASN1_ITEM_start(sname) \ + ASN1_ITYPE_COMPAT, \ + tag, \ + NULL, \ + 0, \ + &sname##_ff, \ + 0, \ + #sname \ + ASN1_ITEM_end(sname) + +# define IMPLEMENT_EXTERN_ASN1(sname, tag, fptrs) \ + ASN1_ITEM_start(sname) \ + ASN1_ITYPE_EXTERN, \ + tag, \ + NULL, \ + 0, \ + &fptrs, \ + 0, \ + #sname \ + ASN1_ITEM_end(sname) + +/* Macro to implement standard functions in terms of ASN1_ITEM structures */ + +# define IMPLEMENT_ASN1_FUNCTIONS(stname) IMPLEMENT_ASN1_FUNCTIONS_fname(stname, stname, stname) + +# define IMPLEMENT_ASN1_FUNCTIONS_name(stname, itname) IMPLEMENT_ASN1_FUNCTIONS_fname(stname, itname, itname) + +# define IMPLEMENT_ASN1_FUNCTIONS_ENCODE_name(stname, itname) \ + IMPLEMENT_ASN1_FUNCTIONS_ENCODE_fname(stname, itname, itname) + +# define IMPLEMENT_STATIC_ASN1_ALLOC_FUNCTIONS(stname) \ + IMPLEMENT_ASN1_ALLOC_FUNCTIONS_pfname(static, stname, stname, stname) + +# define IMPLEMENT_ASN1_ALLOC_FUNCTIONS(stname) \ + IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, stname, stname) + +# define IMPLEMENT_ASN1_ALLOC_FUNCTIONS_pfname(pre, stname, itname, fname) \ + pre stname *fname##_new(void) \ + { \ + return (stname *)ASN1_item_new(ASN1_ITEM_rptr(itname)); \ + } \ + pre void fname##_free(stname *a) \ + { \ + ASN1_item_free((ASN1_VALUE *)a, ASN1_ITEM_rptr(itname)); \ + } + +# define IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname) \ + stname *fname##_new(void) \ + { \ + return (stname *)ASN1_item_new(ASN1_ITEM_rptr(itname)); \ + } \ + void fname##_free(stname *a) \ + { \ + ASN1_item_free((ASN1_VALUE *)a, ASN1_ITEM_rptr(itname)); \ + } + +# define IMPLEMENT_ASN1_FUNCTIONS_fname(stname, itname, fname) \ + IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(stname, itname, fname) \ + IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname) + +# define IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(stname, itname, fname) \ + stname *d2i_##fname(stname **a, const unsigned char **in, long len) \ + { \ + return (stname *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, ASN1_ITEM_rptr(itname));\ + } \ + int i2d_##fname(stname *a, unsigned char **out) \ + { \ + return ASN1_item_i2d((ASN1_VALUE *)a, out, ASN1_ITEM_rptr(itname));\ + } + +# define IMPLEMENT_ASN1_NDEF_FUNCTION(stname) \ + int i2d_##stname##_NDEF(stname *a, unsigned char **out) \ + { \ + return ASN1_item_ndef_i2d((ASN1_VALUE *)a, out, ASN1_ITEM_rptr(stname));\ + } + +/* + * This includes evil casts to remove const: they will go away when full ASN1 + * constification is done. + */ +# define IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(stname, itname, fname) \ + stname *d2i_##fname(stname **a, const unsigned char **in, long len) \ + { \ + return (stname *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, ASN1_ITEM_rptr(itname));\ + } \ + int i2d_##fname(const stname *a, unsigned char **out) \ + { \ + return ASN1_item_i2d((ASN1_VALUE *)a, out, ASN1_ITEM_rptr(itname));\ + } + +# define IMPLEMENT_ASN1_DUP_FUNCTION(stname) \ + stname * stname##_dup(stname *x) \ + { \ + return ASN1_item_dup(ASN1_ITEM_rptr(stname), x); \ + } + +# define IMPLEMENT_ASN1_PRINT_FUNCTION(stname) \ + IMPLEMENT_ASN1_PRINT_FUNCTION_fname(stname, stname, stname) + +# define IMPLEMENT_ASN1_PRINT_FUNCTION_fname(stname, itname, fname) \ + int fname##_print_ctx(BIO *out, stname *x, int indent, \ + const ASN1_PCTX *pctx) \ + { \ + return ASN1_item_print(out, (ASN1_VALUE *)x, indent, \ + ASN1_ITEM_rptr(itname), pctx); \ + } + +# define IMPLEMENT_ASN1_FUNCTIONS_const(name) \ + IMPLEMENT_ASN1_FUNCTIONS_const_fname(name, name, name) + +# define IMPLEMENT_ASN1_FUNCTIONS_const_fname(stname, itname, fname) \ + IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(stname, itname, fname) \ + IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname) + +/* external definitions for primitive types */ + +DECLARE_ASN1_ITEM(ASN1_BOOLEAN) +DECLARE_ASN1_ITEM(ASN1_TBOOLEAN) +DECLARE_ASN1_ITEM(ASN1_FBOOLEAN) +DECLARE_ASN1_ITEM(ASN1_SEQUENCE) +DECLARE_ASN1_ITEM(CBIGNUM) +DECLARE_ASN1_ITEM(BIGNUM) +DECLARE_ASN1_ITEM(LONG) +DECLARE_ASN1_ITEM(ZLONG) + +DECLARE_STACK_OF(ASN1_VALUE) + +/* Functions used internally by the ASN1 code */ + +int ASN1_item_ex_new(ASN1_VALUE **pval, const ASN1_ITEM *it); +void ASN1_item_ex_free(ASN1_VALUE **pval, const ASN1_ITEM *it); +int ASN1_template_new(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt); +int ASN1_primitive_new(ASN1_VALUE **pval, const ASN1_ITEM *it); + +void ASN1_template_free(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt); +int ASN1_template_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, + const ASN1_TEMPLATE *tt); +int ASN1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, + const ASN1_ITEM *it, int tag, int aclass, char opt, + ASN1_TLC *ctx); + +int ASN1_item_ex_i2d(ASN1_VALUE **pval, unsigned char **out, + const ASN1_ITEM *it, int tag, int aclass); +int ASN1_template_i2d(ASN1_VALUE **pval, unsigned char **out, + const ASN1_TEMPLATE *tt); +void ASN1_primitive_free(ASN1_VALUE **pval, const ASN1_ITEM *it); + +int asn1_ex_i2c(ASN1_VALUE **pval, unsigned char *cont, int *putype, + const ASN1_ITEM *it); +int asn1_ex_c2i(ASN1_VALUE **pval, const unsigned char *cont, int len, + int utype, char *free_cont, const ASN1_ITEM *it); + +int asn1_get_choice_selector(ASN1_VALUE **pval, const ASN1_ITEM *it); +int asn1_set_choice_selector(ASN1_VALUE **pval, int value, + const ASN1_ITEM *it); + +ASN1_VALUE **asn1_get_field_ptr(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt); + +const ASN1_TEMPLATE *asn1_do_adb(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt, + int nullerr); + +int asn1_do_lock(ASN1_VALUE **pval, int op, const ASN1_ITEM *it); + +void asn1_enc_init(ASN1_VALUE **pval, const ASN1_ITEM *it); +void asn1_enc_free(ASN1_VALUE **pval, const ASN1_ITEM *it); +int asn1_enc_restore(int *len, unsigned char **out, ASN1_VALUE **pval, + const ASN1_ITEM *it); +int asn1_enc_save(ASN1_VALUE **pval, const unsigned char *in, int inlen, + const ASN1_ITEM *it); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/bio.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/bio.h new file mode 100644 index 0000000..8f2438c --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/bio.h @@ -0,0 +1,883 @@ +/* crypto/bio/bio.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_BIO_H +# define HEADER_BIO_H + +# include + +# ifndef OPENSSL_NO_FP_API +# include +# endif +# include + +# include + +# ifndef OPENSSL_NO_SCTP +# ifndef OPENSSL_SYS_VMS +# include +# else +# include +# endif +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* These are the 'types' of BIOs */ +# define BIO_TYPE_NONE 0 +# define BIO_TYPE_MEM (1|0x0400) +# define BIO_TYPE_FILE (2|0x0400) + +# define BIO_TYPE_FD (4|0x0400|0x0100) +# define BIO_TYPE_SOCKET (5|0x0400|0x0100) +# define BIO_TYPE_NULL (6|0x0400) +# define BIO_TYPE_SSL (7|0x0200) +# define BIO_TYPE_MD (8|0x0200)/* passive filter */ +# define BIO_TYPE_BUFFER (9|0x0200)/* filter */ +# define BIO_TYPE_CIPHER (10|0x0200)/* filter */ +# define BIO_TYPE_BASE64 (11|0x0200)/* filter */ +# define BIO_TYPE_CONNECT (12|0x0400|0x0100)/* socket - connect */ +# define BIO_TYPE_ACCEPT (13|0x0400|0x0100)/* socket for accept */ +# define BIO_TYPE_PROXY_CLIENT (14|0x0200)/* client proxy BIO */ +# define BIO_TYPE_PROXY_SERVER (15|0x0200)/* server proxy BIO */ +# define BIO_TYPE_NBIO_TEST (16|0x0200)/* server proxy BIO */ +# define BIO_TYPE_NULL_FILTER (17|0x0200) +# define BIO_TYPE_BER (18|0x0200)/* BER -> bin filter */ +# define BIO_TYPE_BIO (19|0x0400)/* (half a) BIO pair */ +# define BIO_TYPE_LINEBUFFER (20|0x0200)/* filter */ +# define BIO_TYPE_DGRAM (21|0x0400|0x0100) +# ifndef OPENSSL_NO_SCTP +# define BIO_TYPE_DGRAM_SCTP (24|0x0400|0x0100) +# endif +# define BIO_TYPE_ASN1 (22|0x0200)/* filter */ +# define BIO_TYPE_COMP (23|0x0200)/* filter */ + +# define BIO_TYPE_DESCRIPTOR 0x0100/* socket, fd, connect or accept */ +# define BIO_TYPE_FILTER 0x0200 +# define BIO_TYPE_SOURCE_SINK 0x0400 + +/* + * BIO_FILENAME_READ|BIO_CLOSE to open or close on free. + * BIO_set_fp(in,stdin,BIO_NOCLOSE); + */ +# define BIO_NOCLOSE 0x00 +# define BIO_CLOSE 0x01 + +/* + * These are used in the following macros and are passed to BIO_ctrl() + */ +# define BIO_CTRL_RESET 1/* opt - rewind/zero etc */ +# define BIO_CTRL_EOF 2/* opt - are we at the eof */ +# define BIO_CTRL_INFO 3/* opt - extra tit-bits */ +# define BIO_CTRL_SET 4/* man - set the 'IO' type */ +# define BIO_CTRL_GET 5/* man - get the 'IO' type */ +# define BIO_CTRL_PUSH 6/* opt - internal, used to signify change */ +# define BIO_CTRL_POP 7/* opt - internal, used to signify change */ +# define BIO_CTRL_GET_CLOSE 8/* man - set the 'close' on free */ +# define BIO_CTRL_SET_CLOSE 9/* man - set the 'close' on free */ +# define BIO_CTRL_PENDING 10/* opt - is their more data buffered */ +# define BIO_CTRL_FLUSH 11/* opt - 'flush' buffered output */ +# define BIO_CTRL_DUP 12/* man - extra stuff for 'duped' BIO */ +# define BIO_CTRL_WPENDING 13/* opt - number of bytes still to write */ +/* callback is int cb(BIO *bio,state,ret); */ +# define BIO_CTRL_SET_CALLBACK 14/* opt - set callback function */ +# define BIO_CTRL_GET_CALLBACK 15/* opt - set callback function */ + +# define BIO_CTRL_SET_FILENAME 30/* BIO_s_file special */ + +/* dgram BIO stuff */ +# define BIO_CTRL_DGRAM_CONNECT 31/* BIO dgram special */ +# define BIO_CTRL_DGRAM_SET_CONNECTED 32/* allow for an externally connected + * socket to be passed in */ +# define BIO_CTRL_DGRAM_SET_RECV_TIMEOUT 33/* setsockopt, essentially */ +# define BIO_CTRL_DGRAM_GET_RECV_TIMEOUT 34/* getsockopt, essentially */ +# define BIO_CTRL_DGRAM_SET_SEND_TIMEOUT 35/* setsockopt, essentially */ +# define BIO_CTRL_DGRAM_GET_SEND_TIMEOUT 36/* getsockopt, essentially */ + +# define BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP 37/* flag whether the last */ +# define BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP 38/* I/O operation tiemd out */ + +/* #ifdef IP_MTU_DISCOVER */ +# define BIO_CTRL_DGRAM_MTU_DISCOVER 39/* set DF bit on egress packets */ +/* #endif */ + +# define BIO_CTRL_DGRAM_QUERY_MTU 40/* as kernel for current MTU */ +# define BIO_CTRL_DGRAM_GET_FALLBACK_MTU 47 +# define BIO_CTRL_DGRAM_GET_MTU 41/* get cached value for MTU */ +# define BIO_CTRL_DGRAM_SET_MTU 42/* set cached value for MTU. + * want to use this if asking + * the kernel fails */ + +# define BIO_CTRL_DGRAM_MTU_EXCEEDED 43/* check whether the MTU was + * exceed in the previous write + * operation */ + +# define BIO_CTRL_DGRAM_GET_PEER 46 +# define BIO_CTRL_DGRAM_SET_PEER 44/* Destination for the data */ + +# define BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT 45/* Next DTLS handshake timeout + * to adjust socket timeouts */ +# define BIO_CTRL_DGRAM_SET_DONT_FRAG 48 + +# define BIO_CTRL_DGRAM_GET_MTU_OVERHEAD 49 + +# ifndef OPENSSL_NO_SCTP +/* SCTP stuff */ +# define BIO_CTRL_DGRAM_SCTP_SET_IN_HANDSHAKE 50 +# define BIO_CTRL_DGRAM_SCTP_ADD_AUTH_KEY 51 +# define BIO_CTRL_DGRAM_SCTP_NEXT_AUTH_KEY 52 +# define BIO_CTRL_DGRAM_SCTP_AUTH_CCS_RCVD 53 +# define BIO_CTRL_DGRAM_SCTP_GET_SNDINFO 60 +# define BIO_CTRL_DGRAM_SCTP_SET_SNDINFO 61 +# define BIO_CTRL_DGRAM_SCTP_GET_RCVINFO 62 +# define BIO_CTRL_DGRAM_SCTP_SET_RCVINFO 63 +# define BIO_CTRL_DGRAM_SCTP_GET_PRINFO 64 +# define BIO_CTRL_DGRAM_SCTP_SET_PRINFO 65 +# define BIO_CTRL_DGRAM_SCTP_SAVE_SHUTDOWN 70 +# endif + +/* modifiers */ +# define BIO_FP_READ 0x02 +# define BIO_FP_WRITE 0x04 +# define BIO_FP_APPEND 0x08 +# define BIO_FP_TEXT 0x10 + +# define BIO_FLAGS_READ 0x01 +# define BIO_FLAGS_WRITE 0x02 +# define BIO_FLAGS_IO_SPECIAL 0x04 +# define BIO_FLAGS_RWS (BIO_FLAGS_READ|BIO_FLAGS_WRITE|BIO_FLAGS_IO_SPECIAL) +# define BIO_FLAGS_SHOULD_RETRY 0x08 +# ifndef BIO_FLAGS_UPLINK +/* + * "UPLINK" flag denotes file descriptors provided by application. It + * defaults to 0, as most platforms don't require UPLINK interface. + */ +# define BIO_FLAGS_UPLINK 0 +# endif + +/* Used in BIO_gethostbyname() */ +# define BIO_GHBN_CTRL_HITS 1 +# define BIO_GHBN_CTRL_MISSES 2 +# define BIO_GHBN_CTRL_CACHE_SIZE 3 +# define BIO_GHBN_CTRL_GET_ENTRY 4 +# define BIO_GHBN_CTRL_FLUSH 5 + +/* Mostly used in the SSL BIO */ +/*- + * Not used anymore + * #define BIO_FLAGS_PROTOCOL_DELAYED_READ 0x10 + * #define BIO_FLAGS_PROTOCOL_DELAYED_WRITE 0x20 + * #define BIO_FLAGS_PROTOCOL_STARTUP 0x40 + */ + +# define BIO_FLAGS_BASE64_NO_NL 0x100 + +/* + * This is used with memory BIOs: it means we shouldn't free up or change the + * data in any way. + */ +# define BIO_FLAGS_MEM_RDONLY 0x200 + +typedef struct bio_st BIO; + +void BIO_set_flags(BIO *b, int flags); +int BIO_test_flags(const BIO *b, int flags); +void BIO_clear_flags(BIO *b, int flags); + +# define BIO_get_flags(b) BIO_test_flags(b, ~(0x0)) +# define BIO_set_retry_special(b) \ + BIO_set_flags(b, (BIO_FLAGS_IO_SPECIAL|BIO_FLAGS_SHOULD_RETRY)) +# define BIO_set_retry_read(b) \ + BIO_set_flags(b, (BIO_FLAGS_READ|BIO_FLAGS_SHOULD_RETRY)) +# define BIO_set_retry_write(b) \ + BIO_set_flags(b, (BIO_FLAGS_WRITE|BIO_FLAGS_SHOULD_RETRY)) + +/* These are normally used internally in BIOs */ +# define BIO_clear_retry_flags(b) \ + BIO_clear_flags(b, (BIO_FLAGS_RWS|BIO_FLAGS_SHOULD_RETRY)) +# define BIO_get_retry_flags(b) \ + BIO_test_flags(b, (BIO_FLAGS_RWS|BIO_FLAGS_SHOULD_RETRY)) + +/* These should be used by the application to tell why we should retry */ +# define BIO_should_read(a) BIO_test_flags(a, BIO_FLAGS_READ) +# define BIO_should_write(a) BIO_test_flags(a, BIO_FLAGS_WRITE) +# define BIO_should_io_special(a) BIO_test_flags(a, BIO_FLAGS_IO_SPECIAL) +# define BIO_retry_type(a) BIO_test_flags(a, BIO_FLAGS_RWS) +# define BIO_should_retry(a) BIO_test_flags(a, BIO_FLAGS_SHOULD_RETRY) + +/* + * The next three are used in conjunction with the BIO_should_io_special() + * condition. After this returns true, BIO *BIO_get_retry_BIO(BIO *bio, int + * *reason); will walk the BIO stack and return the 'reason' for the special + * and the offending BIO. Given a BIO, BIO_get_retry_reason(bio) will return + * the code. + */ +/* + * Returned from the SSL bio when the certificate retrieval code had an error + */ +# define BIO_RR_SSL_X509_LOOKUP 0x01 +/* Returned from the connect BIO when a connect would have blocked */ +# define BIO_RR_CONNECT 0x02 +/* Returned from the accept BIO when an accept would have blocked */ +# define BIO_RR_ACCEPT 0x03 + +/* These are passed by the BIO callback */ +# define BIO_CB_FREE 0x01 +# define BIO_CB_READ 0x02 +# define BIO_CB_WRITE 0x03 +# define BIO_CB_PUTS 0x04 +# define BIO_CB_GETS 0x05 +# define BIO_CB_CTRL 0x06 + +/* + * The callback is called before and after the underling operation, The + * BIO_CB_RETURN flag indicates if it is after the call + */ +# define BIO_CB_RETURN 0x80 +# define BIO_CB_return(a) ((a)|BIO_CB_RETURN) +# define BIO_cb_pre(a) (!((a)&BIO_CB_RETURN)) +# define BIO_cb_post(a) ((a)&BIO_CB_RETURN) + +long (*BIO_get_callback(const BIO *b)) (struct bio_st *, int, const char *, + int, long, long); +void BIO_set_callback(BIO *b, + long (*callback) (struct bio_st *, int, const char *, + int, long, long)); +char *BIO_get_callback_arg(const BIO *b); +void BIO_set_callback_arg(BIO *b, char *arg); + +const char *BIO_method_name(const BIO *b); +int BIO_method_type(const BIO *b); + +typedef void bio_info_cb (struct bio_st *, int, const char *, int, long, + long); + +typedef struct bio_method_st { + int type; + const char *name; + int (*bwrite) (BIO *, const char *, int); + int (*bread) (BIO *, char *, int); + int (*bputs) (BIO *, const char *); + int (*bgets) (BIO *, char *, int); + long (*ctrl) (BIO *, int, long, void *); + int (*create) (BIO *); + int (*destroy) (BIO *); + long (*callback_ctrl) (BIO *, int, bio_info_cb *); +} BIO_METHOD; + +struct bio_st { + BIO_METHOD *method; + /* bio, mode, argp, argi, argl, ret */ + long (*callback) (struct bio_st *, int, const char *, int, long, long); + char *cb_arg; /* first argument for the callback */ + int init; + int shutdown; + int flags; /* extra storage */ + int retry_reason; + int num; + void *ptr; + struct bio_st *next_bio; /* used by filter BIOs */ + struct bio_st *prev_bio; /* used by filter BIOs */ + int references; + unsigned long num_read; + unsigned long num_write; + CRYPTO_EX_DATA ex_data; +}; + +DECLARE_STACK_OF(BIO) + +typedef struct bio_f_buffer_ctx_struct { + /*- + * Buffers are setup like this: + * + * <---------------------- size -----------------------> + * +---------------------------------------------------+ + * | consumed | remaining | free space | + * +---------------------------------------------------+ + * <-- off --><------- len -------> + */ + /*- BIO *bio; *//* + * this is now in the BIO struct + */ + int ibuf_size; /* how big is the input buffer */ + int obuf_size; /* how big is the output buffer */ + char *ibuf; /* the char array */ + int ibuf_len; /* how many bytes are in it */ + int ibuf_off; /* write/read offset */ + char *obuf; /* the char array */ + int obuf_len; /* how many bytes are in it */ + int obuf_off; /* write/read offset */ +} BIO_F_BUFFER_CTX; + +/* Prefix and suffix callback in ASN1 BIO */ +typedef int asn1_ps_func (BIO *b, unsigned char **pbuf, int *plen, + void *parg); + +# ifndef OPENSSL_NO_SCTP +/* SCTP parameter structs */ +struct bio_dgram_sctp_sndinfo { + uint16_t snd_sid; + uint16_t snd_flags; + uint32_t snd_ppid; + uint32_t snd_context; +}; + +struct bio_dgram_sctp_rcvinfo { + uint16_t rcv_sid; + uint16_t rcv_ssn; + uint16_t rcv_flags; + uint32_t rcv_ppid; + uint32_t rcv_tsn; + uint32_t rcv_cumtsn; + uint32_t rcv_context; +}; + +struct bio_dgram_sctp_prinfo { + uint16_t pr_policy; + uint32_t pr_value; +}; +# endif + +/* connect BIO stuff */ +# define BIO_CONN_S_BEFORE 1 +# define BIO_CONN_S_GET_IP 2 +# define BIO_CONN_S_GET_PORT 3 +# define BIO_CONN_S_CREATE_SOCKET 4 +# define BIO_CONN_S_CONNECT 5 +# define BIO_CONN_S_OK 6 +# define BIO_CONN_S_BLOCKED_CONNECT 7 +# define BIO_CONN_S_NBIO 8 +/* + * #define BIO_CONN_get_param_hostname BIO_ctrl + */ + +# define BIO_C_SET_CONNECT 100 +# define BIO_C_DO_STATE_MACHINE 101 +# define BIO_C_SET_NBIO 102 +# define BIO_C_SET_PROXY_PARAM 103 +# define BIO_C_SET_FD 104 +# define BIO_C_GET_FD 105 +# define BIO_C_SET_FILE_PTR 106 +# define BIO_C_GET_FILE_PTR 107 +# define BIO_C_SET_FILENAME 108 +# define BIO_C_SET_SSL 109 +# define BIO_C_GET_SSL 110 +# define BIO_C_SET_MD 111 +# define BIO_C_GET_MD 112 +# define BIO_C_GET_CIPHER_STATUS 113 +# define BIO_C_SET_BUF_MEM 114 +# define BIO_C_GET_BUF_MEM_PTR 115 +# define BIO_C_GET_BUFF_NUM_LINES 116 +# define BIO_C_SET_BUFF_SIZE 117 +# define BIO_C_SET_ACCEPT 118 +# define BIO_C_SSL_MODE 119 +# define BIO_C_GET_MD_CTX 120 +# define BIO_C_GET_PROXY_PARAM 121 +# define BIO_C_SET_BUFF_READ_DATA 122/* data to read first */ +# define BIO_C_GET_CONNECT 123 +# define BIO_C_GET_ACCEPT 124 +# define BIO_C_SET_SSL_RENEGOTIATE_BYTES 125 +# define BIO_C_GET_SSL_NUM_RENEGOTIATES 126 +# define BIO_C_SET_SSL_RENEGOTIATE_TIMEOUT 127 +# define BIO_C_FILE_SEEK 128 +# define BIO_C_GET_CIPHER_CTX 129 +# define BIO_C_SET_BUF_MEM_EOF_RETURN 130/* return end of input + * value */ +# define BIO_C_SET_BIND_MODE 131 +# define BIO_C_GET_BIND_MODE 132 +# define BIO_C_FILE_TELL 133 +# define BIO_C_GET_SOCKS 134 +# define BIO_C_SET_SOCKS 135 + +# define BIO_C_SET_WRITE_BUF_SIZE 136/* for BIO_s_bio */ +# define BIO_C_GET_WRITE_BUF_SIZE 137 +# define BIO_C_MAKE_BIO_PAIR 138 +# define BIO_C_DESTROY_BIO_PAIR 139 +# define BIO_C_GET_WRITE_GUARANTEE 140 +# define BIO_C_GET_READ_REQUEST 141 +# define BIO_C_SHUTDOWN_WR 142 +# define BIO_C_NREAD0 143 +# define BIO_C_NREAD 144 +# define BIO_C_NWRITE0 145 +# define BIO_C_NWRITE 146 +# define BIO_C_RESET_READ_REQUEST 147 +# define BIO_C_SET_MD_CTX 148 + +# define BIO_C_SET_PREFIX 149 +# define BIO_C_GET_PREFIX 150 +# define BIO_C_SET_SUFFIX 151 +# define BIO_C_GET_SUFFIX 152 + +# define BIO_C_SET_EX_ARG 153 +# define BIO_C_GET_EX_ARG 154 + +# define BIO_set_app_data(s,arg) BIO_set_ex_data(s,0,arg) +# define BIO_get_app_data(s) BIO_get_ex_data(s,0) + +/* BIO_s_connect() and BIO_s_socks4a_connect() */ +# define BIO_set_conn_hostname(b,name) BIO_ctrl(b,BIO_C_SET_CONNECT,0,(char *)name) +# define BIO_set_conn_port(b,port) BIO_ctrl(b,BIO_C_SET_CONNECT,1,(char *)port) +# define BIO_set_conn_ip(b,ip) BIO_ctrl(b,BIO_C_SET_CONNECT,2,(char *)ip) +# define BIO_set_conn_int_port(b,port) BIO_ctrl(b,BIO_C_SET_CONNECT,3,(char *)port) +# define BIO_get_conn_hostname(b) BIO_ptr_ctrl(b,BIO_C_GET_CONNECT,0) +# define BIO_get_conn_port(b) BIO_ptr_ctrl(b,BIO_C_GET_CONNECT,1) +# define BIO_get_conn_ip(b) BIO_ptr_ctrl(b,BIO_C_GET_CONNECT,2) +# define BIO_get_conn_int_port(b) BIO_ctrl(b,BIO_C_GET_CONNECT,3,NULL) + +# define BIO_set_nbio(b,n) BIO_ctrl(b,BIO_C_SET_NBIO,(n),NULL) + +/* BIO_s_accept() */ +# define BIO_set_accept_port(b,name) BIO_ctrl(b,BIO_C_SET_ACCEPT,0,(char *)name) +# define BIO_get_accept_port(b) BIO_ptr_ctrl(b,BIO_C_GET_ACCEPT,0) +/* #define BIO_set_nbio(b,n) BIO_ctrl(b,BIO_C_SET_NBIO,(n),NULL) */ +# define BIO_set_nbio_accept(b,n) BIO_ctrl(b,BIO_C_SET_ACCEPT,1,(n)?(void *)"a":NULL) +# define BIO_set_accept_bios(b,bio) BIO_ctrl(b,BIO_C_SET_ACCEPT,2,(char *)bio) + +# define BIO_BIND_NORMAL 0 +# define BIO_BIND_REUSEADDR_IF_UNUSED 1 +# define BIO_BIND_REUSEADDR 2 +# define BIO_set_bind_mode(b,mode) BIO_ctrl(b,BIO_C_SET_BIND_MODE,mode,NULL) +# define BIO_get_bind_mode(b,mode) BIO_ctrl(b,BIO_C_GET_BIND_MODE,0,NULL) + +/* BIO_s_accept() and BIO_s_connect() */ +# define BIO_do_connect(b) BIO_do_handshake(b) +# define BIO_do_accept(b) BIO_do_handshake(b) +# define BIO_do_handshake(b) BIO_ctrl(b,BIO_C_DO_STATE_MACHINE,0,NULL) + +/* BIO_s_proxy_client() */ +# define BIO_set_url(b,url) BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,0,(char *)(url)) +# define BIO_set_proxies(b,p) BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,1,(char *)(p)) +/* BIO_set_nbio(b,n) */ +# define BIO_set_filter_bio(b,s) BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,2,(char *)(s)) +/* BIO *BIO_get_filter_bio(BIO *bio); */ +# define BIO_set_proxy_cb(b,cb) BIO_callback_ctrl(b,BIO_C_SET_PROXY_PARAM,3,(void *(*cb)())) +# define BIO_set_proxy_header(b,sk) BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,4,(char *)sk) +# define BIO_set_no_connect_return(b,bool) BIO_int_ctrl(b,BIO_C_SET_PROXY_PARAM,5,bool) + +# define BIO_get_proxy_header(b,skp) BIO_ctrl(b,BIO_C_GET_PROXY_PARAM,0,(char *)skp) +# define BIO_get_proxies(b,pxy_p) BIO_ctrl(b,BIO_C_GET_PROXY_PARAM,1,(char *)(pxy_p)) +# define BIO_get_url(b,url) BIO_ctrl(b,BIO_C_GET_PROXY_PARAM,2,(char *)(url)) +# define BIO_get_no_connect_return(b) BIO_ctrl(b,BIO_C_GET_PROXY_PARAM,5,NULL) + +/* BIO_s_datagram(), BIO_s_fd(), BIO_s_socket(), BIO_s_accept() and BIO_s_connect() */ +# define BIO_set_fd(b,fd,c) BIO_int_ctrl(b,BIO_C_SET_FD,c,fd) +# define BIO_get_fd(b,c) BIO_ctrl(b,BIO_C_GET_FD,0,(char *)c) + +/* BIO_s_file() */ +# define BIO_set_fp(b,fp,c) BIO_ctrl(b,BIO_C_SET_FILE_PTR,c,(char *)fp) +# define BIO_get_fp(b,fpp) BIO_ctrl(b,BIO_C_GET_FILE_PTR,0,(char *)fpp) + +/* BIO_s_fd() and BIO_s_file() */ +# define BIO_seek(b,ofs) (int)BIO_ctrl(b,BIO_C_FILE_SEEK,ofs,NULL) +# define BIO_tell(b) (int)BIO_ctrl(b,BIO_C_FILE_TELL,0,NULL) + +/* + * name is cast to lose const, but might be better to route through a + * function so we can do it safely + */ +# ifdef CONST_STRICT +/* + * If you are wondering why this isn't defined, its because CONST_STRICT is + * purely a compile-time kludge to allow const to be checked. + */ +int BIO_read_filename(BIO *b, const char *name); +# else +# define BIO_read_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \ + BIO_CLOSE|BIO_FP_READ,(char *)name) +# endif +# define BIO_write_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \ + BIO_CLOSE|BIO_FP_WRITE,name) +# define BIO_append_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \ + BIO_CLOSE|BIO_FP_APPEND,name) +# define BIO_rw_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \ + BIO_CLOSE|BIO_FP_READ|BIO_FP_WRITE,name) + +/* + * WARNING WARNING, this ups the reference count on the read bio of the SSL + * structure. This is because the ssl read BIO is now pointed to by the + * next_bio field in the bio. So when you free the BIO, make sure you are + * doing a BIO_free_all() to catch the underlying BIO. + */ +# define BIO_set_ssl(b,ssl,c) BIO_ctrl(b,BIO_C_SET_SSL,c,(char *)ssl) +# define BIO_get_ssl(b,sslp) BIO_ctrl(b,BIO_C_GET_SSL,0,(char *)sslp) +# define BIO_set_ssl_mode(b,client) BIO_ctrl(b,BIO_C_SSL_MODE,client,NULL) +# define BIO_set_ssl_renegotiate_bytes(b,num) \ + BIO_ctrl(b,BIO_C_SET_SSL_RENEGOTIATE_BYTES,num,NULL) +# define BIO_get_num_renegotiates(b) \ + BIO_ctrl(b,BIO_C_GET_SSL_NUM_RENEGOTIATES,0,NULL) +# define BIO_set_ssl_renegotiate_timeout(b,seconds) \ + BIO_ctrl(b,BIO_C_SET_SSL_RENEGOTIATE_TIMEOUT,seconds,NULL) + +/* defined in evp.h */ +/* #define BIO_set_md(b,md) BIO_ctrl(b,BIO_C_SET_MD,1,(char *)md) */ + +# define BIO_get_mem_data(b,pp) BIO_ctrl(b,BIO_CTRL_INFO,0,(char *)pp) +# define BIO_set_mem_buf(b,bm,c) BIO_ctrl(b,BIO_C_SET_BUF_MEM,c,(char *)bm) +# define BIO_get_mem_ptr(b,pp) BIO_ctrl(b,BIO_C_GET_BUF_MEM_PTR,0,(char *)pp) +# define BIO_set_mem_eof_return(b,v) \ + BIO_ctrl(b,BIO_C_SET_BUF_MEM_EOF_RETURN,v,NULL) + +/* For the BIO_f_buffer() type */ +# define BIO_get_buffer_num_lines(b) BIO_ctrl(b,BIO_C_GET_BUFF_NUM_LINES,0,NULL) +# define BIO_set_buffer_size(b,size) BIO_ctrl(b,BIO_C_SET_BUFF_SIZE,size,NULL) +# define BIO_set_read_buffer_size(b,size) BIO_int_ctrl(b,BIO_C_SET_BUFF_SIZE,size,0) +# define BIO_set_write_buffer_size(b,size) BIO_int_ctrl(b,BIO_C_SET_BUFF_SIZE,size,1) +# define BIO_set_buffer_read_data(b,buf,num) BIO_ctrl(b,BIO_C_SET_BUFF_READ_DATA,num,buf) + +/* Don't use the next one unless you know what you are doing :-) */ +# define BIO_dup_state(b,ret) BIO_ctrl(b,BIO_CTRL_DUP,0,(char *)(ret)) + +# define BIO_reset(b) (int)BIO_ctrl(b,BIO_CTRL_RESET,0,NULL) +# define BIO_eof(b) (int)BIO_ctrl(b,BIO_CTRL_EOF,0,NULL) +# define BIO_set_close(b,c) (int)BIO_ctrl(b,BIO_CTRL_SET_CLOSE,(c),NULL) +# define BIO_get_close(b) (int)BIO_ctrl(b,BIO_CTRL_GET_CLOSE,0,NULL) +# define BIO_pending(b) (int)BIO_ctrl(b,BIO_CTRL_PENDING,0,NULL) +# define BIO_wpending(b) (int)BIO_ctrl(b,BIO_CTRL_WPENDING,0,NULL) +/* ...pending macros have inappropriate return type */ +size_t BIO_ctrl_pending(BIO *b); +size_t BIO_ctrl_wpending(BIO *b); +# define BIO_flush(b) (int)BIO_ctrl(b,BIO_CTRL_FLUSH,0,NULL) +# define BIO_get_info_callback(b,cbp) (int)BIO_ctrl(b,BIO_CTRL_GET_CALLBACK,0, \ + cbp) +# define BIO_set_info_callback(b,cb) (int)BIO_callback_ctrl(b,BIO_CTRL_SET_CALLBACK,cb) + +/* For the BIO_f_buffer() type */ +# define BIO_buffer_get_num_lines(b) BIO_ctrl(b,BIO_CTRL_GET,0,NULL) + +/* For BIO_s_bio() */ +# define BIO_set_write_buf_size(b,size) (int)BIO_ctrl(b,BIO_C_SET_WRITE_BUF_SIZE,size,NULL) +# define BIO_get_write_buf_size(b,size) (size_t)BIO_ctrl(b,BIO_C_GET_WRITE_BUF_SIZE,size,NULL) +# define BIO_make_bio_pair(b1,b2) (int)BIO_ctrl(b1,BIO_C_MAKE_BIO_PAIR,0,b2) +# define BIO_destroy_bio_pair(b) (int)BIO_ctrl(b,BIO_C_DESTROY_BIO_PAIR,0,NULL) +# define BIO_shutdown_wr(b) (int)BIO_ctrl(b, BIO_C_SHUTDOWN_WR, 0, NULL) +/* macros with inappropriate type -- but ...pending macros use int too: */ +# define BIO_get_write_guarantee(b) (int)BIO_ctrl(b,BIO_C_GET_WRITE_GUARANTEE,0,NULL) +# define BIO_get_read_request(b) (int)BIO_ctrl(b,BIO_C_GET_READ_REQUEST,0,NULL) +size_t BIO_ctrl_get_write_guarantee(BIO *b); +size_t BIO_ctrl_get_read_request(BIO *b); +int BIO_ctrl_reset_read_request(BIO *b); + +/* ctrl macros for dgram */ +# define BIO_ctrl_dgram_connect(b,peer) \ + (int)BIO_ctrl(b,BIO_CTRL_DGRAM_CONNECT,0, (char *)peer) +# define BIO_ctrl_set_connected(b, state, peer) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_SET_CONNECTED, state, (char *)peer) +# define BIO_dgram_recv_timedout(b) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP, 0, NULL) +# define BIO_dgram_send_timedout(b) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP, 0, NULL) +# define BIO_dgram_get_peer(b,peer) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_GET_PEER, 0, (char *)peer) +# define BIO_dgram_set_peer(b,peer) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_SET_PEER, 0, (char *)peer) +# define BIO_dgram_get_mtu_overhead(b) \ + (unsigned int)BIO_ctrl((b), BIO_CTRL_DGRAM_GET_MTU_OVERHEAD, 0, NULL) + +/* These two aren't currently implemented */ +/* int BIO_get_ex_num(BIO *bio); */ +/* void BIO_set_ex_free_func(BIO *bio,int idx,void (*cb)()); */ +int BIO_set_ex_data(BIO *bio, int idx, void *data); +void *BIO_get_ex_data(BIO *bio, int idx); +int BIO_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); +unsigned long BIO_number_read(BIO *bio); +unsigned long BIO_number_written(BIO *bio); + +/* For BIO_f_asn1() */ +int BIO_asn1_set_prefix(BIO *b, asn1_ps_func *prefix, + asn1_ps_func *prefix_free); +int BIO_asn1_get_prefix(BIO *b, asn1_ps_func **pprefix, + asn1_ps_func **pprefix_free); +int BIO_asn1_set_suffix(BIO *b, asn1_ps_func *suffix, + asn1_ps_func *suffix_free); +int BIO_asn1_get_suffix(BIO *b, asn1_ps_func **psuffix, + asn1_ps_func **psuffix_free); + +# ifndef OPENSSL_NO_FP_API +BIO_METHOD *BIO_s_file(void); +BIO *BIO_new_file(const char *filename, const char *mode); +BIO *BIO_new_fp(FILE *stream, int close_flag); +# define BIO_s_file_internal BIO_s_file +# endif +BIO *BIO_new(BIO_METHOD *type); +int BIO_set(BIO *a, BIO_METHOD *type); +int BIO_free(BIO *a); +void BIO_vfree(BIO *a); +int BIO_read(BIO *b, void *data, int len); +int BIO_gets(BIO *bp, char *buf, int size); +int BIO_write(BIO *b, const void *data, int len); +int BIO_puts(BIO *bp, const char *buf); +int BIO_indent(BIO *b, int indent, int max); +long BIO_ctrl(BIO *bp, int cmd, long larg, void *parg); +long BIO_callback_ctrl(BIO *b, int cmd, + void (*fp) (struct bio_st *, int, const char *, int, + long, long)); +char *BIO_ptr_ctrl(BIO *bp, int cmd, long larg); +long BIO_int_ctrl(BIO *bp, int cmd, long larg, int iarg); +BIO *BIO_push(BIO *b, BIO *append); +BIO *BIO_pop(BIO *b); +void BIO_free_all(BIO *a); +BIO *BIO_find_type(BIO *b, int bio_type); +BIO *BIO_next(BIO *b); +BIO *BIO_get_retry_BIO(BIO *bio, int *reason); +int BIO_get_retry_reason(BIO *bio); +BIO *BIO_dup_chain(BIO *in); + +int BIO_nread0(BIO *bio, char **buf); +int BIO_nread(BIO *bio, char **buf, int num); +int BIO_nwrite0(BIO *bio, char **buf); +int BIO_nwrite(BIO *bio, char **buf, int num); + +long BIO_debug_callback(BIO *bio, int cmd, const char *argp, int argi, + long argl, long ret); + +BIO_METHOD *BIO_s_mem(void); +BIO *BIO_new_mem_buf(const void *buf, int len); +BIO_METHOD *BIO_s_socket(void); +BIO_METHOD *BIO_s_connect(void); +BIO_METHOD *BIO_s_accept(void); +BIO_METHOD *BIO_s_fd(void); +# ifndef OPENSSL_SYS_OS2 +BIO_METHOD *BIO_s_log(void); +# endif +BIO_METHOD *BIO_s_bio(void); +BIO_METHOD *BIO_s_null(void); +BIO_METHOD *BIO_f_null(void); +BIO_METHOD *BIO_f_buffer(void); +# ifdef OPENSSL_SYS_VMS +BIO_METHOD *BIO_f_linebuffer(void); +# endif +BIO_METHOD *BIO_f_nbio_test(void); +# ifndef OPENSSL_NO_DGRAM +BIO_METHOD *BIO_s_datagram(void); +# ifndef OPENSSL_NO_SCTP +BIO_METHOD *BIO_s_datagram_sctp(void); +# endif +# endif + +/* BIO_METHOD *BIO_f_ber(void); */ + +int BIO_sock_should_retry(int i); +int BIO_sock_non_fatal_error(int error); +int BIO_dgram_non_fatal_error(int error); + +int BIO_fd_should_retry(int i); +int BIO_fd_non_fatal_error(int error); +int BIO_dump_cb(int (*cb) (const void *data, size_t len, void *u), + void *u, const char *s, int len); +int BIO_dump_indent_cb(int (*cb) (const void *data, size_t len, void *u), + void *u, const char *s, int len, int indent); +int BIO_dump(BIO *b, const char *bytes, int len); +int BIO_dump_indent(BIO *b, const char *bytes, int len, int indent); +# ifndef OPENSSL_NO_FP_API +int BIO_dump_fp(FILE *fp, const char *s, int len); +int BIO_dump_indent_fp(FILE *fp, const char *s, int len, int indent); +# endif +int BIO_hex_string(BIO *out, int indent, int width, unsigned char *data, + int datalen); + +struct hostent *BIO_gethostbyname(const char *name); +/*- + * We might want a thread-safe interface too: + * struct hostent *BIO_gethostbyname_r(const char *name, + * struct hostent *result, void *buffer, size_t buflen); + * or something similar (caller allocates a struct hostent, + * pointed to by "result", and additional buffer space for the various + * substructures; if the buffer does not suffice, NULL is returned + * and an appropriate error code is set). + */ +int BIO_sock_error(int sock); +int BIO_socket_ioctl(int fd, long type, void *arg); +int BIO_socket_nbio(int fd, int mode); +int BIO_get_port(const char *str, unsigned short *port_ptr); +int BIO_get_host_ip(const char *str, unsigned char *ip); +int BIO_get_accept_socket(char *host_port, int mode); +int BIO_accept(int sock, char **ip_port); +int BIO_sock_init(void); +void BIO_sock_cleanup(void); +int BIO_set_tcp_ndelay(int sock, int turn_on); + +BIO *BIO_new_socket(int sock, int close_flag); +BIO *BIO_new_dgram(int fd, int close_flag); +# ifndef OPENSSL_NO_SCTP +BIO *BIO_new_dgram_sctp(int fd, int close_flag); +int BIO_dgram_is_sctp(BIO *bio); +int BIO_dgram_sctp_notification_cb(BIO *b, + void (*handle_notifications) (BIO *bio, + void + *context, + void *buf), + void *context); +int BIO_dgram_sctp_wait_for_dry(BIO *b); +int BIO_dgram_sctp_msg_waiting(BIO *b); +# endif +BIO *BIO_new_fd(int fd, int close_flag); +BIO *BIO_new_connect(const char *host_port); +BIO *BIO_new_accept(const char *host_port); + +int BIO_new_bio_pair(BIO **bio1, size_t writebuf1, + BIO **bio2, size_t writebuf2); +/* + * If successful, returns 1 and in *bio1, *bio2 two BIO pair endpoints. + * Otherwise returns 0 and sets *bio1 and *bio2 to NULL. Size 0 uses default + * value. + */ + +void BIO_copy_next_retry(BIO *b); + +/* + * long BIO_ghbn_ctrl(int cmd,int iarg,char *parg); + */ + +# ifdef __GNUC__ +# define __bio_h__attr__ __attribute__ +# else +# define __bio_h__attr__(x) +# endif +int BIO_printf(BIO *bio, const char *format, ...) +__bio_h__attr__((__format__(__printf__, 2, 3))); +int BIO_vprintf(BIO *bio, const char *format, va_list args) +__bio_h__attr__((__format__(__printf__, 2, 0))); +int BIO_snprintf(char *buf, size_t n, const char *format, ...) +__bio_h__attr__((__format__(__printf__, 3, 4))); +int BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args) +__bio_h__attr__((__format__(__printf__, 3, 0))); +# undef __bio_h__attr__ + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_BIO_strings(void); + +/* Error codes for the BIO functions. */ + +/* Function codes. */ +# define BIO_F_ACPT_STATE 100 +# define BIO_F_BIO_ACCEPT 101 +# define BIO_F_BIO_BER_GET_HEADER 102 +# define BIO_F_BIO_CALLBACK_CTRL 131 +# define BIO_F_BIO_CTRL 103 +# define BIO_F_BIO_GETHOSTBYNAME 120 +# define BIO_F_BIO_GETS 104 +# define BIO_F_BIO_GET_ACCEPT_SOCKET 105 +# define BIO_F_BIO_GET_HOST_IP 106 +# define BIO_F_BIO_GET_PORT 107 +# define BIO_F_BIO_MAKE_PAIR 121 +# define BIO_F_BIO_NEW 108 +# define BIO_F_BIO_NEW_FILE 109 +# define BIO_F_BIO_NEW_MEM_BUF 126 +# define BIO_F_BIO_NREAD 123 +# define BIO_F_BIO_NREAD0 124 +# define BIO_F_BIO_NWRITE 125 +# define BIO_F_BIO_NWRITE0 122 +# define BIO_F_BIO_PUTS 110 +# define BIO_F_BIO_READ 111 +# define BIO_F_BIO_SOCK_INIT 112 +# define BIO_F_BIO_WRITE 113 +# define BIO_F_BUFFER_CTRL 114 +# define BIO_F_CONN_CTRL 127 +# define BIO_F_CONN_STATE 115 +# define BIO_F_DGRAM_SCTP_READ 132 +# define BIO_F_DGRAM_SCTP_WRITE 133 +# define BIO_F_FILE_CTRL 116 +# define BIO_F_FILE_READ 130 +# define BIO_F_LINEBUFFER_CTRL 129 +# define BIO_F_MEM_READ 128 +# define BIO_F_MEM_WRITE 117 +# define BIO_F_SSL_NEW 118 +# define BIO_F_WSASTARTUP 119 + +/* Reason codes. */ +# define BIO_R_ACCEPT_ERROR 100 +# define BIO_R_BAD_FOPEN_MODE 101 +# define BIO_R_BAD_HOSTNAME_LOOKUP 102 +# define BIO_R_BROKEN_PIPE 124 +# define BIO_R_CONNECT_ERROR 103 +# define BIO_R_EOF_ON_MEMORY_BIO 127 +# define BIO_R_ERROR_SETTING_NBIO 104 +# define BIO_R_ERROR_SETTING_NBIO_ON_ACCEPTED_SOCKET 105 +# define BIO_R_ERROR_SETTING_NBIO_ON_ACCEPT_SOCKET 106 +# define BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET 107 +# define BIO_R_INVALID_ARGUMENT 125 +# define BIO_R_INVALID_IP_ADDRESS 108 +# define BIO_R_IN_USE 123 +# define BIO_R_KEEPALIVE 109 +# define BIO_R_NBIO_CONNECT_ERROR 110 +# define BIO_R_NO_ACCEPT_PORT_SPECIFIED 111 +# define BIO_R_NO_HOSTNAME_SPECIFIED 112 +# define BIO_R_NO_PORT_DEFINED 113 +# define BIO_R_NO_PORT_SPECIFIED 114 +# define BIO_R_NO_SUCH_FILE 128 +# define BIO_R_NULL_PARAMETER 115 +# define BIO_R_TAG_MISMATCH 116 +# define BIO_R_UNABLE_TO_BIND_SOCKET 117 +# define BIO_R_UNABLE_TO_CREATE_SOCKET 118 +# define BIO_R_UNABLE_TO_LISTEN_SOCKET 119 +# define BIO_R_UNINITIALIZED 120 +# define BIO_R_UNSUPPORTED_METHOD 121 +# define BIO_R_WRITE_TO_READ_ONLY_BIO 126 +# define BIO_R_WSASTARTUP 122 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/blowfish.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/blowfish.h new file mode 100644 index 0000000..8329302 --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/blowfish.h @@ -0,0 +1,130 @@ +/* crypto/bf/blowfish.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_BLOWFISH_H +# define HEADER_BLOWFISH_H + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# ifdef OPENSSL_NO_BF +# error BF is disabled. +# endif + +# define BF_ENCRYPT 1 +# define BF_DECRYPT 0 + +/*- + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + * ! BF_LONG has to be at least 32 bits wide. If it's wider, then ! + * ! BF_LONG_LOG2 has to be defined along. ! + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + */ + +# if defined(__LP32__) +# define BF_LONG unsigned long +# elif defined(OPENSSL_SYS_CRAY) || defined(__ILP64__) +# define BF_LONG unsigned long +# define BF_LONG_LOG2 3 +/* + * _CRAY note. I could declare short, but I have no idea what impact + * does it have on performance on none-T3E machines. I could declare + * int, but at least on C90 sizeof(int) can be chosen at compile time. + * So I've chosen long... + * + */ +# else +# define BF_LONG unsigned int +# endif + +# define BF_ROUNDS 16 +# define BF_BLOCK 8 + +typedef struct bf_key_st { + BF_LONG P[BF_ROUNDS + 2]; + BF_LONG S[4 * 256]; +} BF_KEY; + +# ifdef OPENSSL_FIPS +void private_BF_set_key(BF_KEY *key, int len, const unsigned char *data); +# endif +void BF_set_key(BF_KEY *key, int len, const unsigned char *data); + +void BF_encrypt(BF_LONG *data, const BF_KEY *key); +void BF_decrypt(BF_LONG *data, const BF_KEY *key); + +void BF_ecb_encrypt(const unsigned char *in, unsigned char *out, + const BF_KEY *key, int enc); +void BF_cbc_encrypt(const unsigned char *in, unsigned char *out, long length, + const BF_KEY *schedule, unsigned char *ivec, int enc); +void BF_cfb64_encrypt(const unsigned char *in, unsigned char *out, + long length, const BF_KEY *schedule, + unsigned char *ivec, int *num, int enc); +void BF_ofb64_encrypt(const unsigned char *in, unsigned char *out, + long length, const BF_KEY *schedule, + unsigned char *ivec, int *num); +const char *BF_options(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/bn.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/bn.h new file mode 100644 index 0000000..633d1b1 --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/bn.h @@ -0,0 +1,951 @@ +/* crypto/bn/bn.h */ +/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ +/* ==================================================================== + * Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * + * Portions of the attached software ("Contribution") are developed by + * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project. + * + * The Contribution is licensed pursuant to the Eric Young open source + * license provided above. + * + * The binary polynomial arithmetic software is originally written by + * Sheueling Chang Shantz and Douglas Stebila of Sun Microsystems Laboratories. + * + */ + +#ifndef HEADER_BN_H +# define HEADER_BN_H + +# include +# include +# ifndef OPENSSL_NO_FP_API +# include /* FILE */ +# endif +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * These preprocessor symbols control various aspects of the bignum headers + * and library code. They're not defined by any "normal" configuration, as + * they are intended for development and testing purposes. NB: defining all + * three can be useful for debugging application code as well as openssl + * itself. BN_DEBUG - turn on various debugging alterations to the bignum + * code BN_DEBUG_RAND - uses random poisoning of unused words to trip up + * mismanagement of bignum internals. You must also define BN_DEBUG. + */ +/* #define BN_DEBUG */ +/* #define BN_DEBUG_RAND */ + +# ifndef OPENSSL_SMALL_FOOTPRINT +# define BN_MUL_COMBA +# define BN_SQR_COMBA +# define BN_RECURSION +# endif + +/* + * This next option uses the C libraries (2 word)/(1 word) function. If it is + * not defined, I use my C version (which is slower). The reason for this + * flag is that when the particular C compiler library routine is used, and + * the library is linked with a different compiler, the library is missing. + * This mostly happens when the library is built with gcc and then linked + * using normal cc. This would be a common occurrence because gcc normally + * produces code that is 2 times faster than system compilers for the big + * number stuff. For machines with only one compiler (or shared libraries), + * this should be on. Again this in only really a problem on machines using + * "long long's", are 32bit, and are not using my assembler code. + */ +# if defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_WINDOWS) || \ + defined(OPENSSL_SYS_WIN32) || defined(linux) +# ifndef BN_DIV2W +# define BN_DIV2W +# endif +# endif + +/* + * assuming long is 64bit - this is the DEC Alpha unsigned long long is only + * 64 bits :-(, don't define BN_LLONG for the DEC Alpha + */ +# ifdef SIXTY_FOUR_BIT_LONG +# define BN_ULLONG unsigned long long +# define BN_ULONG unsigned long +# define BN_LONG long +# define BN_BITS 128 +# define BN_BYTES 8 +# define BN_BITS2 64 +# define BN_BITS4 32 +# define BN_MASK (0xffffffffffffffffffffffffffffffffLL) +# define BN_MASK2 (0xffffffffffffffffL) +# define BN_MASK2l (0xffffffffL) +# define BN_MASK2h (0xffffffff00000000L) +# define BN_MASK2h1 (0xffffffff80000000L) +# define BN_TBIT (0x8000000000000000L) +# define BN_DEC_CONV (10000000000000000000UL) +# define BN_DEC_FMT1 "%lu" +# define BN_DEC_FMT2 "%019lu" +# define BN_DEC_NUM 19 +# define BN_HEX_FMT1 "%lX" +# define BN_HEX_FMT2 "%016lX" +# endif + +/* + * This is where the long long data type is 64 bits, but long is 32. For + * machines where there are 64bit registers, this is the mode to use. IRIX, + * on R4000 and above should use this mode, along with the relevant assembler + * code :-). Do NOT define BN_LLONG. + */ +# ifdef SIXTY_FOUR_BIT +# undef BN_LLONG +# undef BN_ULLONG +# define BN_ULONG unsigned long long +# define BN_LONG long long +# define BN_BITS 128 +# define BN_BYTES 8 +# define BN_BITS2 64 +# define BN_BITS4 32 +# define BN_MASK2 (0xffffffffffffffffLL) +# define BN_MASK2l (0xffffffffL) +# define BN_MASK2h (0xffffffff00000000LL) +# define BN_MASK2h1 (0xffffffff80000000LL) +# define BN_TBIT (0x8000000000000000LL) +# define BN_DEC_CONV (10000000000000000000ULL) +# define BN_DEC_FMT1 "%llu" +# define BN_DEC_FMT2 "%019llu" +# define BN_DEC_NUM 19 +# define BN_HEX_FMT1 "%llX" +# define BN_HEX_FMT2 "%016llX" +# endif + +# ifdef THIRTY_TWO_BIT +# ifdef BN_LLONG +# if defined(_WIN32) && !defined(__GNUC__) +# define BN_ULLONG unsigned __int64 +# define BN_MASK (0xffffffffffffffffI64) +# else +# define BN_ULLONG unsigned long long +# define BN_MASK (0xffffffffffffffffLL) +# endif +# endif +# define BN_ULONG unsigned int +# define BN_LONG int +# define BN_BITS 64 +# define BN_BYTES 4 +# define BN_BITS2 32 +# define BN_BITS4 16 +# define BN_MASK2 (0xffffffffL) +# define BN_MASK2l (0xffff) +# define BN_MASK2h1 (0xffff8000L) +# define BN_MASK2h (0xffff0000L) +# define BN_TBIT (0x80000000L) +# define BN_DEC_CONV (1000000000L) +# define BN_DEC_FMT1 "%u" +# define BN_DEC_FMT2 "%09u" +# define BN_DEC_NUM 9 +# define BN_HEX_FMT1 "%X" +# define BN_HEX_FMT2 "%08X" +# endif + +# define BN_DEFAULT_BITS 1280 + +# define BN_FLG_MALLOCED 0x01 +# define BN_FLG_STATIC_DATA 0x02 + +/* + * avoid leaking exponent information through timing, + * BN_mod_exp_mont() will call BN_mod_exp_mont_consttime, + * BN_div() will call BN_div_no_branch, + * BN_mod_inverse() will call BN_mod_inverse_no_branch. + */ +# define BN_FLG_CONSTTIME 0x04 + +# ifdef OPENSSL_NO_DEPRECATED +/* deprecated name for the flag */ +# define BN_FLG_EXP_CONSTTIME BN_FLG_CONSTTIME +/* + * avoid leaking exponent information through timings + * (BN_mod_exp_mont() will call BN_mod_exp_mont_consttime) + */ +# endif + +# ifndef OPENSSL_NO_DEPRECATED +# define BN_FLG_FREE 0x8000 + /* used for debuging */ +# endif +# define BN_set_flags(b,n) ((b)->flags|=(n)) +# define BN_get_flags(b,n) ((b)->flags&(n)) + +/* + * get a clone of a BIGNUM with changed flags, for *temporary* use only (the + * two BIGNUMs cannot not be used in parallel!) + */ +# define BN_with_flags(dest,b,n) ((dest)->d=(b)->d, \ + (dest)->top=(b)->top, \ + (dest)->dmax=(b)->dmax, \ + (dest)->neg=(b)->neg, \ + (dest)->flags=(((dest)->flags & BN_FLG_MALLOCED) \ + | ((b)->flags & ~BN_FLG_MALLOCED) \ + | BN_FLG_STATIC_DATA \ + | (n))) + +/* Already declared in ossl_typ.h */ +# if 0 +typedef struct bignum_st BIGNUM; +/* Used for temp variables (declaration hidden in bn_lcl.h) */ +typedef struct bignum_ctx BN_CTX; +typedef struct bn_blinding_st BN_BLINDING; +typedef struct bn_mont_ctx_st BN_MONT_CTX; +typedef struct bn_recp_ctx_st BN_RECP_CTX; +typedef struct bn_gencb_st BN_GENCB; +# endif + +struct bignum_st { + BN_ULONG *d; /* Pointer to an array of 'BN_BITS2' bit + * chunks. */ + int top; /* Index of last used d +1. */ + /* The next are internal book keeping for bn_expand. */ + int dmax; /* Size of the d array. */ + int neg; /* one if the number is negative */ + int flags; +}; + +/* Used for montgomery multiplication */ +struct bn_mont_ctx_st { + int ri; /* number of bits in R */ + BIGNUM RR; /* used to convert to montgomery form */ + BIGNUM N; /* The modulus */ + BIGNUM Ni; /* R*(1/R mod N) - N*Ni = 1 (Ni is only + * stored for bignum algorithm) */ + BN_ULONG n0[2]; /* least significant word(s) of Ni; (type + * changed with 0.9.9, was "BN_ULONG n0;" + * before) */ + int flags; +}; + +/* + * Used for reciprocal division/mod functions It cannot be shared between + * threads + */ +struct bn_recp_ctx_st { + BIGNUM N; /* the divisor */ + BIGNUM Nr; /* the reciprocal */ + int num_bits; + int shift; + int flags; +}; + +/* Used for slow "generation" functions. */ +struct bn_gencb_st { + unsigned int ver; /* To handle binary (in)compatibility */ + void *arg; /* callback-specific data */ + union { + /* if(ver==1) - handles old style callbacks */ + void (*cb_1) (int, int, void *); + /* if(ver==2) - new callback style */ + int (*cb_2) (int, int, BN_GENCB *); + } cb; +}; +/* Wrapper function to make using BN_GENCB easier, */ +int BN_GENCB_call(BN_GENCB *cb, int a, int b); +/* Macro to populate a BN_GENCB structure with an "old"-style callback */ +# define BN_GENCB_set_old(gencb, callback, cb_arg) { \ + BN_GENCB *tmp_gencb = (gencb); \ + tmp_gencb->ver = 1; \ + tmp_gencb->arg = (cb_arg); \ + tmp_gencb->cb.cb_1 = (callback); } +/* Macro to populate a BN_GENCB structure with a "new"-style callback */ +# define BN_GENCB_set(gencb, callback, cb_arg) { \ + BN_GENCB *tmp_gencb = (gencb); \ + tmp_gencb->ver = 2; \ + tmp_gencb->arg = (cb_arg); \ + tmp_gencb->cb.cb_2 = (callback); } + +# define BN_prime_checks 0 /* default: select number of iterations based + * on the size of the number */ + +/* + * number of Miller-Rabin iterations for an error rate of less than 2^-80 for + * random 'b'-bit input, b >= 100 (taken from table 4.4 in the Handbook of + * Applied Cryptography [Menezes, van Oorschot, Vanstone; CRC Press 1996]; + * original paper: Damgaard, Landrock, Pomerance: Average case error + * estimates for the strong probable prime test. -- Math. Comp. 61 (1993) + * 177-194) + */ +# define BN_prime_checks_for_size(b) ((b) >= 1300 ? 2 : \ + (b) >= 850 ? 3 : \ + (b) >= 650 ? 4 : \ + (b) >= 550 ? 5 : \ + (b) >= 450 ? 6 : \ + (b) >= 400 ? 7 : \ + (b) >= 350 ? 8 : \ + (b) >= 300 ? 9 : \ + (b) >= 250 ? 12 : \ + (b) >= 200 ? 15 : \ + (b) >= 150 ? 18 : \ + /* b >= 100 */ 27) + +# define BN_num_bytes(a) ((BN_num_bits(a)+7)/8) + +/* Note that BN_abs_is_word didn't work reliably for w == 0 until 0.9.8 */ +# define BN_abs_is_word(a,w) ((((a)->top == 1) && ((a)->d[0] == (BN_ULONG)(w))) || \ + (((w) == 0) && ((a)->top == 0))) +# define BN_is_zero(a) ((a)->top == 0) +# define BN_is_one(a) (BN_abs_is_word((a),1) && !(a)->neg) +# define BN_is_word(a,w) (BN_abs_is_word((a),(w)) && (!(w) || !(a)->neg)) +# define BN_is_odd(a) (((a)->top > 0) && ((a)->d[0] & 1)) + +# define BN_one(a) (BN_set_word((a),1)) +# define BN_zero_ex(a) \ + do { \ + BIGNUM *_tmp_bn = (a); \ + _tmp_bn->top = 0; \ + _tmp_bn->neg = 0; \ + } while(0) +# ifdef OPENSSL_NO_DEPRECATED +# define BN_zero(a) BN_zero_ex(a) +# else +# define BN_zero(a) (BN_set_word((a),0)) +# endif + +const BIGNUM *BN_value_one(void); +char *BN_options(void); +BN_CTX *BN_CTX_new(void); +# ifndef OPENSSL_NO_DEPRECATED +void BN_CTX_init(BN_CTX *c); +# endif +void BN_CTX_free(BN_CTX *c); +void BN_CTX_start(BN_CTX *ctx); +BIGNUM *BN_CTX_get(BN_CTX *ctx); +void BN_CTX_end(BN_CTX *ctx); +int BN_rand(BIGNUM *rnd, int bits, int top, int bottom); +int BN_pseudo_rand(BIGNUM *rnd, int bits, int top, int bottom); +int BN_rand_range(BIGNUM *rnd, const BIGNUM *range); +int BN_pseudo_rand_range(BIGNUM *rnd, const BIGNUM *range); +int BN_num_bits(const BIGNUM *a); +int BN_num_bits_word(BN_ULONG); +BIGNUM *BN_new(void); +void BN_init(BIGNUM *); +void BN_clear_free(BIGNUM *a); +BIGNUM *BN_copy(BIGNUM *a, const BIGNUM *b); +void BN_swap(BIGNUM *a, BIGNUM *b); +BIGNUM *BN_bin2bn(const unsigned char *s, int len, BIGNUM *ret); +int BN_bn2bin(const BIGNUM *a, unsigned char *to); +BIGNUM *BN_mpi2bn(const unsigned char *s, int len, BIGNUM *ret); +int BN_bn2mpi(const BIGNUM *a, unsigned char *to); +int BN_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); +int BN_usub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); +int BN_uadd(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); +int BN_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); +int BN_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx); +int BN_sqr(BIGNUM *r, const BIGNUM *a, BN_CTX *ctx); +/** BN_set_negative sets sign of a BIGNUM + * \param b pointer to the BIGNUM object + * \param n 0 if the BIGNUM b should be positive and a value != 0 otherwise + */ +void BN_set_negative(BIGNUM *b, int n); +/** BN_is_negative returns 1 if the BIGNUM is negative + * \param a pointer to the BIGNUM object + * \return 1 if a < 0 and 0 otherwise + */ +# define BN_is_negative(a) ((a)->neg != 0) + +int BN_div(BIGNUM *dv, BIGNUM *rem, const BIGNUM *m, const BIGNUM *d, + BN_CTX *ctx); +# define BN_mod(rem,m,d,ctx) BN_div(NULL,(rem),(m),(d),(ctx)) +int BN_nnmod(BIGNUM *r, const BIGNUM *m, const BIGNUM *d, BN_CTX *ctx); +int BN_mod_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, + BN_CTX *ctx); +int BN_mod_add_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const BIGNUM *m); +int BN_mod_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, + BN_CTX *ctx); +int BN_mod_sub_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const BIGNUM *m); +int BN_mod_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, + BN_CTX *ctx); +int BN_mod_sqr(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx); +int BN_mod_lshift1(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx); +int BN_mod_lshift1_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *m); +int BN_mod_lshift(BIGNUM *r, const BIGNUM *a, int n, const BIGNUM *m, + BN_CTX *ctx); +int BN_mod_lshift_quick(BIGNUM *r, const BIGNUM *a, int n, const BIGNUM *m); + +BN_ULONG BN_mod_word(const BIGNUM *a, BN_ULONG w); +BN_ULONG BN_div_word(BIGNUM *a, BN_ULONG w); +int BN_mul_word(BIGNUM *a, BN_ULONG w); +int BN_add_word(BIGNUM *a, BN_ULONG w); +int BN_sub_word(BIGNUM *a, BN_ULONG w); +int BN_set_word(BIGNUM *a, BN_ULONG w); +BN_ULONG BN_get_word(const BIGNUM *a); + +int BN_cmp(const BIGNUM *a, const BIGNUM *b); +void BN_free(BIGNUM *a); +int BN_is_bit_set(const BIGNUM *a, int n); +int BN_lshift(BIGNUM *r, const BIGNUM *a, int n); +int BN_lshift1(BIGNUM *r, const BIGNUM *a); +int BN_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); + +int BN_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx); +int BN_mod_exp_mont(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx); +int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx, + BN_MONT_CTX *in_mont); +int BN_mod_exp_mont_word(BIGNUM *r, BN_ULONG a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx); +int BN_mod_exp2_mont(BIGNUM *r, const BIGNUM *a1, const BIGNUM *p1, + const BIGNUM *a2, const BIGNUM *p2, const BIGNUM *m, + BN_CTX *ctx, BN_MONT_CTX *m_ctx); +int BN_mod_exp_simple(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx); + +int BN_mask_bits(BIGNUM *a, int n); +# ifndef OPENSSL_NO_FP_API +int BN_print_fp(FILE *fp, const BIGNUM *a); +# endif +# ifdef HEADER_BIO_H +int BN_print(BIO *fp, const BIGNUM *a); +# else +int BN_print(void *fp, const BIGNUM *a); +# endif +int BN_reciprocal(BIGNUM *r, const BIGNUM *m, int len, BN_CTX *ctx); +int BN_rshift(BIGNUM *r, const BIGNUM *a, int n); +int BN_rshift1(BIGNUM *r, const BIGNUM *a); +void BN_clear(BIGNUM *a); +BIGNUM *BN_dup(const BIGNUM *a); +int BN_ucmp(const BIGNUM *a, const BIGNUM *b); +int BN_set_bit(BIGNUM *a, int n); +int BN_clear_bit(BIGNUM *a, int n); +char *BN_bn2hex(const BIGNUM *a); +char *BN_bn2dec(const BIGNUM *a); +int BN_hex2bn(BIGNUM **a, const char *str); +int BN_dec2bn(BIGNUM **a, const char *str); +int BN_asc2bn(BIGNUM **a, const char *str); +int BN_gcd(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx); +int BN_kronecker(const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx); /* returns + * -2 for + * error */ +BIGNUM *BN_mod_inverse(BIGNUM *ret, + const BIGNUM *a, const BIGNUM *n, BN_CTX *ctx); +BIGNUM *BN_mod_sqrt(BIGNUM *ret, + const BIGNUM *a, const BIGNUM *n, BN_CTX *ctx); + +void BN_consttime_swap(BN_ULONG swap, BIGNUM *a, BIGNUM *b, int nwords); + +/* Deprecated versions */ +# ifndef OPENSSL_NO_DEPRECATED +BIGNUM *BN_generate_prime(BIGNUM *ret, int bits, int safe, + const BIGNUM *add, const BIGNUM *rem, + void (*callback) (int, int, void *), void *cb_arg); +int BN_is_prime(const BIGNUM *p, int nchecks, + void (*callback) (int, int, void *), + BN_CTX *ctx, void *cb_arg); +int BN_is_prime_fasttest(const BIGNUM *p, int nchecks, + void (*callback) (int, int, void *), BN_CTX *ctx, + void *cb_arg, int do_trial_division); +# endif /* !defined(OPENSSL_NO_DEPRECATED) */ + +/* Newer versions */ +int BN_generate_prime_ex(BIGNUM *ret, int bits, int safe, const BIGNUM *add, + const BIGNUM *rem, BN_GENCB *cb); +int BN_is_prime_ex(const BIGNUM *p, int nchecks, BN_CTX *ctx, BN_GENCB *cb); +int BN_is_prime_fasttest_ex(const BIGNUM *p, int nchecks, BN_CTX *ctx, + int do_trial_division, BN_GENCB *cb); + +int BN_X931_generate_Xpq(BIGNUM *Xp, BIGNUM *Xq, int nbits, BN_CTX *ctx); + +int BN_X931_derive_prime_ex(BIGNUM *p, BIGNUM *p1, BIGNUM *p2, + const BIGNUM *Xp, const BIGNUM *Xp1, + const BIGNUM *Xp2, const BIGNUM *e, BN_CTX *ctx, + BN_GENCB *cb); +int BN_X931_generate_prime_ex(BIGNUM *p, BIGNUM *p1, BIGNUM *p2, BIGNUM *Xp1, + BIGNUM *Xp2, const BIGNUM *Xp, const BIGNUM *e, + BN_CTX *ctx, BN_GENCB *cb); + +BN_MONT_CTX *BN_MONT_CTX_new(void); +void BN_MONT_CTX_init(BN_MONT_CTX *ctx); +int BN_mod_mul_montgomery(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + BN_MONT_CTX *mont, BN_CTX *ctx); +# define BN_to_montgomery(r,a,mont,ctx) BN_mod_mul_montgomery(\ + (r),(a),&((mont)->RR),(mont),(ctx)) +int BN_from_montgomery(BIGNUM *r, const BIGNUM *a, + BN_MONT_CTX *mont, BN_CTX *ctx); +void BN_MONT_CTX_free(BN_MONT_CTX *mont); +int BN_MONT_CTX_set(BN_MONT_CTX *mont, const BIGNUM *mod, BN_CTX *ctx); +BN_MONT_CTX *BN_MONT_CTX_copy(BN_MONT_CTX *to, BN_MONT_CTX *from); +BN_MONT_CTX *BN_MONT_CTX_set_locked(BN_MONT_CTX **pmont, int lock, + const BIGNUM *mod, BN_CTX *ctx); + +/* BN_BLINDING flags */ +# define BN_BLINDING_NO_UPDATE 0x00000001 +# define BN_BLINDING_NO_RECREATE 0x00000002 + +BN_BLINDING *BN_BLINDING_new(const BIGNUM *A, const BIGNUM *Ai, BIGNUM *mod); +void BN_BLINDING_free(BN_BLINDING *b); +int BN_BLINDING_update(BN_BLINDING *b, BN_CTX *ctx); +int BN_BLINDING_convert(BIGNUM *n, BN_BLINDING *b, BN_CTX *ctx); +int BN_BLINDING_invert(BIGNUM *n, BN_BLINDING *b, BN_CTX *ctx); +int BN_BLINDING_convert_ex(BIGNUM *n, BIGNUM *r, BN_BLINDING *b, BN_CTX *); +int BN_BLINDING_invert_ex(BIGNUM *n, const BIGNUM *r, BN_BLINDING *b, + BN_CTX *); +# ifndef OPENSSL_NO_DEPRECATED +unsigned long BN_BLINDING_get_thread_id(const BN_BLINDING *); +void BN_BLINDING_set_thread_id(BN_BLINDING *, unsigned long); +# endif +CRYPTO_THREADID *BN_BLINDING_thread_id(BN_BLINDING *); +unsigned long BN_BLINDING_get_flags(const BN_BLINDING *); +void BN_BLINDING_set_flags(BN_BLINDING *, unsigned long); +BN_BLINDING *BN_BLINDING_create_param(BN_BLINDING *b, + const BIGNUM *e, BIGNUM *m, BN_CTX *ctx, + int (*bn_mod_exp) (BIGNUM *r, + const BIGNUM *a, + const BIGNUM *p, + const BIGNUM *m, + BN_CTX *ctx, + BN_MONT_CTX *m_ctx), + BN_MONT_CTX *m_ctx); + +# ifndef OPENSSL_NO_DEPRECATED +void BN_set_params(int mul, int high, int low, int mont); +int BN_get_params(int which); /* 0, mul, 1 high, 2 low, 3 mont */ +# endif + +void BN_RECP_CTX_init(BN_RECP_CTX *recp); +BN_RECP_CTX *BN_RECP_CTX_new(void); +void BN_RECP_CTX_free(BN_RECP_CTX *recp); +int BN_RECP_CTX_set(BN_RECP_CTX *recp, const BIGNUM *rdiv, BN_CTX *ctx); +int BN_mod_mul_reciprocal(BIGNUM *r, const BIGNUM *x, const BIGNUM *y, + BN_RECP_CTX *recp, BN_CTX *ctx); +int BN_mod_exp_recp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx); +int BN_div_recp(BIGNUM *dv, BIGNUM *rem, const BIGNUM *m, + BN_RECP_CTX *recp, BN_CTX *ctx); + +# ifndef OPENSSL_NO_EC2M + +/* + * Functions for arithmetic over binary polynomials represented by BIGNUMs. + * The BIGNUM::neg property of BIGNUMs representing binary polynomials is + * ignored. Note that input arguments are not const so that their bit arrays + * can be expanded to the appropriate size if needed. + */ + +/* + * r = a + b + */ +int BN_GF2m_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); +# define BN_GF2m_sub(r, a, b) BN_GF2m_add(r, a, b) +/* + * r=a mod p + */ +int BN_GF2m_mod(BIGNUM *r, const BIGNUM *a, const BIGNUM *p); +/* r = (a * b) mod p */ +int BN_GF2m_mod_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const BIGNUM *p, BN_CTX *ctx); +/* r = (a * a) mod p */ +int BN_GF2m_mod_sqr(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); +/* r = (1 / b) mod p */ +int BN_GF2m_mod_inv(BIGNUM *r, const BIGNUM *b, const BIGNUM *p, BN_CTX *ctx); +/* r = (a / b) mod p */ +int BN_GF2m_mod_div(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const BIGNUM *p, BN_CTX *ctx); +/* r = (a ^ b) mod p */ +int BN_GF2m_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const BIGNUM *p, BN_CTX *ctx); +/* r = sqrt(a) mod p */ +int BN_GF2m_mod_sqrt(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + BN_CTX *ctx); +/* r^2 + r = a mod p */ +int BN_GF2m_mod_solve_quad(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + BN_CTX *ctx); +# define BN_GF2m_cmp(a, b) BN_ucmp((a), (b)) +/*- + * Some functions allow for representation of the irreducible polynomials + * as an unsigned int[], say p. The irreducible f(t) is then of the form: + * t^p[0] + t^p[1] + ... + t^p[k] + * where m = p[0] > p[1] > ... > p[k] = 0. + */ +/* r = a mod p */ +int BN_GF2m_mod_arr(BIGNUM *r, const BIGNUM *a, const int p[]); +/* r = (a * b) mod p */ +int BN_GF2m_mod_mul_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const int p[], BN_CTX *ctx); +/* r = (a * a) mod p */ +int BN_GF2m_mod_sqr_arr(BIGNUM *r, const BIGNUM *a, const int p[], + BN_CTX *ctx); +/* r = (1 / b) mod p */ +int BN_GF2m_mod_inv_arr(BIGNUM *r, const BIGNUM *b, const int p[], + BN_CTX *ctx); +/* r = (a / b) mod p */ +int BN_GF2m_mod_div_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const int p[], BN_CTX *ctx); +/* r = (a ^ b) mod p */ +int BN_GF2m_mod_exp_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const int p[], BN_CTX *ctx); +/* r = sqrt(a) mod p */ +int BN_GF2m_mod_sqrt_arr(BIGNUM *r, const BIGNUM *a, + const int p[], BN_CTX *ctx); +/* r^2 + r = a mod p */ +int BN_GF2m_mod_solve_quad_arr(BIGNUM *r, const BIGNUM *a, + const int p[], BN_CTX *ctx); +int BN_GF2m_poly2arr(const BIGNUM *a, int p[], int max); +int BN_GF2m_arr2poly(const int p[], BIGNUM *a); + +# endif + +/* + * faster mod functions for the 'NIST primes' 0 <= a < p^2 + */ +int BN_nist_mod_192(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); +int BN_nist_mod_224(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); +int BN_nist_mod_256(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); +int BN_nist_mod_384(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); +int BN_nist_mod_521(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); + +const BIGNUM *BN_get0_nist_prime_192(void); +const BIGNUM *BN_get0_nist_prime_224(void); +const BIGNUM *BN_get0_nist_prime_256(void); +const BIGNUM *BN_get0_nist_prime_384(void); +const BIGNUM *BN_get0_nist_prime_521(void); + +/* library internal functions */ + +# define bn_expand(a,bits) \ + ( \ + bits > (INT_MAX - BN_BITS2 + 1) ? \ + NULL \ + : \ + (((bits+BN_BITS2-1)/BN_BITS2) <= (a)->dmax) ? \ + (a) \ + : \ + bn_expand2((a),(bits+BN_BITS2-1)/BN_BITS2) \ + ) + +# define bn_wexpand(a,words) (((words) <= (a)->dmax)?(a):bn_expand2((a),(words))) +BIGNUM *bn_expand2(BIGNUM *a, int words); +# ifndef OPENSSL_NO_DEPRECATED +BIGNUM *bn_dup_expand(const BIGNUM *a, int words); /* unused */ +# endif + +/*- + * Bignum consistency macros + * There is one "API" macro, bn_fix_top(), for stripping leading zeroes from + * bignum data after direct manipulations on the data. There is also an + * "internal" macro, bn_check_top(), for verifying that there are no leading + * zeroes. Unfortunately, some auditing is required due to the fact that + * bn_fix_top() has become an overabused duct-tape because bignum data is + * occasionally passed around in an inconsistent state. So the following + * changes have been made to sort this out; + * - bn_fix_top()s implementation has been moved to bn_correct_top() + * - if BN_DEBUG isn't defined, bn_fix_top() maps to bn_correct_top(), and + * bn_check_top() is as before. + * - if BN_DEBUG *is* defined; + * - bn_check_top() tries to pollute unused words even if the bignum 'top' is + * consistent. (ed: only if BN_DEBUG_RAND is defined) + * - bn_fix_top() maps to bn_check_top() rather than "fixing" anything. + * The idea is to have debug builds flag up inconsistent bignums when they + * occur. If that occurs in a bn_fix_top(), we examine the code in question; if + * the use of bn_fix_top() was appropriate (ie. it follows directly after code + * that manipulates the bignum) it is converted to bn_correct_top(), and if it + * was not appropriate, we convert it permanently to bn_check_top() and track + * down the cause of the bug. Eventually, no internal code should be using the + * bn_fix_top() macro. External applications and libraries should try this with + * their own code too, both in terms of building against the openssl headers + * with BN_DEBUG defined *and* linking with a version of OpenSSL built with it + * defined. This not only improves external code, it provides more test + * coverage for openssl's own code. + */ + +# ifdef BN_DEBUG + +/* We only need assert() when debugging */ +# include + +# ifdef BN_DEBUG_RAND +/* To avoid "make update" cvs wars due to BN_DEBUG, use some tricks */ +# ifndef RAND_pseudo_bytes +int RAND_pseudo_bytes(unsigned char *buf, int num); +# define BN_DEBUG_TRIX +# endif +# define bn_pollute(a) \ + do { \ + const BIGNUM *_bnum1 = (a); \ + if(_bnum1->top < _bnum1->dmax) { \ + unsigned char _tmp_char; \ + /* We cast away const without the compiler knowing, any \ + * *genuinely* constant variables that aren't mutable \ + * wouldn't be constructed with top!=dmax. */ \ + BN_ULONG *_not_const; \ + memcpy(&_not_const, &_bnum1->d, sizeof(BN_ULONG*)); \ + /* Debug only - safe to ignore error return */ \ + RAND_pseudo_bytes(&_tmp_char, 1); \ + memset((unsigned char *)(_not_const + _bnum1->top), _tmp_char, \ + (_bnum1->dmax - _bnum1->top) * sizeof(BN_ULONG)); \ + } \ + } while(0) +# ifdef BN_DEBUG_TRIX +# undef RAND_pseudo_bytes +# endif +# else +# define bn_pollute(a) +# endif +# define bn_check_top(a) \ + do { \ + const BIGNUM *_bnum2 = (a); \ + if (_bnum2 != NULL) { \ + assert((_bnum2->top == 0) || \ + (_bnum2->d[_bnum2->top - 1] != 0)); \ + bn_pollute(_bnum2); \ + } \ + } while(0) + +# define bn_fix_top(a) bn_check_top(a) + +# define bn_check_size(bn, bits) bn_wcheck_size(bn, ((bits+BN_BITS2-1))/BN_BITS2) +# define bn_wcheck_size(bn, words) \ + do { \ + const BIGNUM *_bnum2 = (bn); \ + assert((words) <= (_bnum2)->dmax && (words) >= (_bnum2)->top); \ + /* avoid unused variable warning with NDEBUG */ \ + (void)(_bnum2); \ + } while(0) + +# else /* !BN_DEBUG */ + +# define bn_pollute(a) +# define bn_check_top(a) +# define bn_fix_top(a) bn_correct_top(a) +# define bn_check_size(bn, bits) +# define bn_wcheck_size(bn, words) + +# endif + +# define bn_correct_top(a) \ + { \ + BN_ULONG *ftl; \ + int tmp_top = (a)->top; \ + if (tmp_top > 0) \ + { \ + for (ftl= &((a)->d[tmp_top-1]); tmp_top > 0; tmp_top--) \ + if (*(ftl--)) break; \ + (a)->top = tmp_top; \ + } \ + if ((a)->top == 0) \ + (a)->neg = 0; \ + bn_pollute(a); \ + } + +BN_ULONG bn_mul_add_words(BN_ULONG *rp, const BN_ULONG *ap, int num, + BN_ULONG w); +BN_ULONG bn_mul_words(BN_ULONG *rp, const BN_ULONG *ap, int num, BN_ULONG w); +void bn_sqr_words(BN_ULONG *rp, const BN_ULONG *ap, int num); +BN_ULONG bn_div_words(BN_ULONG h, BN_ULONG l, BN_ULONG d); +BN_ULONG bn_add_words(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp, + int num); +BN_ULONG bn_sub_words(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp, + int num); + +/* Primes from RFC 2409 */ +BIGNUM *get_rfc2409_prime_768(BIGNUM *bn); +BIGNUM *get_rfc2409_prime_1024(BIGNUM *bn); + +/* Primes from RFC 3526 */ +BIGNUM *get_rfc3526_prime_1536(BIGNUM *bn); +BIGNUM *get_rfc3526_prime_2048(BIGNUM *bn); +BIGNUM *get_rfc3526_prime_3072(BIGNUM *bn); +BIGNUM *get_rfc3526_prime_4096(BIGNUM *bn); +BIGNUM *get_rfc3526_prime_6144(BIGNUM *bn); +BIGNUM *get_rfc3526_prime_8192(BIGNUM *bn); + +int BN_bntest_rand(BIGNUM *rnd, int bits, int top, int bottom); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_BN_strings(void); + +/* Error codes for the BN functions. */ + +/* Function codes. */ +# define BN_F_BNRAND 127 +# define BN_F_BN_BLINDING_CONVERT_EX 100 +# define BN_F_BN_BLINDING_CREATE_PARAM 128 +# define BN_F_BN_BLINDING_INVERT_EX 101 +# define BN_F_BN_BLINDING_NEW 102 +# define BN_F_BN_BLINDING_UPDATE 103 +# define BN_F_BN_BN2DEC 104 +# define BN_F_BN_BN2HEX 105 +# define BN_F_BN_CTX_GET 116 +# define BN_F_BN_CTX_NEW 106 +# define BN_F_BN_CTX_START 129 +# define BN_F_BN_DIV 107 +# define BN_F_BN_DIV_NO_BRANCH 138 +# define BN_F_BN_DIV_RECP 130 +# define BN_F_BN_EXP 123 +# define BN_F_BN_EXPAND2 108 +# define BN_F_BN_EXPAND_INTERNAL 120 +# define BN_F_BN_GF2M_MOD 131 +# define BN_F_BN_GF2M_MOD_EXP 132 +# define BN_F_BN_GF2M_MOD_MUL 133 +# define BN_F_BN_GF2M_MOD_SOLVE_QUAD 134 +# define BN_F_BN_GF2M_MOD_SOLVE_QUAD_ARR 135 +# define BN_F_BN_GF2M_MOD_SQR 136 +# define BN_F_BN_GF2M_MOD_SQRT 137 +# define BN_F_BN_LSHIFT 145 +# define BN_F_BN_MOD_EXP2_MONT 118 +# define BN_F_BN_MOD_EXP_MONT 109 +# define BN_F_BN_MOD_EXP_MONT_CONSTTIME 124 +# define BN_F_BN_MOD_EXP_MONT_WORD 117 +# define BN_F_BN_MOD_EXP_RECP 125 +# define BN_F_BN_MOD_EXP_SIMPLE 126 +# define BN_F_BN_MOD_INVERSE 110 +# define BN_F_BN_MOD_INVERSE_NO_BRANCH 139 +# define BN_F_BN_MOD_LSHIFT_QUICK 119 +# define BN_F_BN_MOD_MUL_RECIPROCAL 111 +# define BN_F_BN_MOD_SQRT 121 +# define BN_F_BN_MPI2BN 112 +# define BN_F_BN_NEW 113 +# define BN_F_BN_RAND 114 +# define BN_F_BN_RAND_RANGE 122 +# define BN_F_BN_RSHIFT 146 +# define BN_F_BN_USUB 115 + +/* Reason codes. */ +# define BN_R_ARG2_LT_ARG3 100 +# define BN_R_BAD_RECIPROCAL 101 +# define BN_R_BIGNUM_TOO_LONG 114 +# define BN_R_BITS_TOO_SMALL 118 +# define BN_R_CALLED_WITH_EVEN_MODULUS 102 +# define BN_R_DIV_BY_ZERO 103 +# define BN_R_ENCODING_ERROR 104 +# define BN_R_EXPAND_ON_STATIC_BIGNUM_DATA 105 +# define BN_R_INPUT_NOT_REDUCED 110 +# define BN_R_INVALID_LENGTH 106 +# define BN_R_INVALID_RANGE 115 +# define BN_R_INVALID_SHIFT 119 +# define BN_R_NOT_A_SQUARE 111 +# define BN_R_NOT_INITIALIZED 107 +# define BN_R_NO_INVERSE 108 +# define BN_R_NO_SOLUTION 116 +# define BN_R_P_IS_NOT_PRIME 112 +# define BN_R_TOO_MANY_ITERATIONS 113 +# define BN_R_TOO_MANY_TEMPORARY_VARIABLES 109 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/buffer.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/buffer.h new file mode 100644 index 0000000..efd240a --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/buffer.h @@ -0,0 +1,125 @@ +/* crypto/buffer/buffer.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_BUFFER_H +# define HEADER_BUFFER_H + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# include + +# if !defined(NO_SYS_TYPES_H) +# include +# endif + +/* Already declared in ossl_typ.h */ +/* typedef struct buf_mem_st BUF_MEM; */ + +struct buf_mem_st { + size_t length; /* current number of bytes */ + char *data; + size_t max; /* size of buffer */ +}; + +BUF_MEM *BUF_MEM_new(void); +void BUF_MEM_free(BUF_MEM *a); +int BUF_MEM_grow(BUF_MEM *str, size_t len); +int BUF_MEM_grow_clean(BUF_MEM *str, size_t len); +size_t BUF_strnlen(const char *str, size_t maxlen); +char *BUF_strdup(const char *str); + +/* + * Like strndup, but in addition, explicitly guarantees to never read past the + * first |siz| bytes of |str|. + */ +char *BUF_strndup(const char *str, size_t siz); + +void *BUF_memdup(const void *data, size_t siz); +void BUF_reverse(unsigned char *out, const unsigned char *in, size_t siz); + +/* safe string functions */ +size_t BUF_strlcpy(char *dst, const char *src, size_t siz); +size_t BUF_strlcat(char *dst, const char *src, size_t siz); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_BUF_strings(void); + +/* Error codes for the BUF functions. */ + +/* Function codes. */ +# define BUF_F_BUF_MEMDUP 103 +# define BUF_F_BUF_MEM_GROW 100 +# define BUF_F_BUF_MEM_GROW_CLEAN 105 +# define BUF_F_BUF_MEM_NEW 101 +# define BUF_F_BUF_STRDUP 102 +# define BUF_F_BUF_STRNDUP 104 + +/* Reason codes. */ + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/camellia.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/camellia.h new file mode 100644 index 0000000..45e8d25 --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/camellia.h @@ -0,0 +1,132 @@ +/* crypto/camellia/camellia.h */ +/* ==================================================================== + * Copyright (c) 2006 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + */ + +#ifndef HEADER_CAMELLIA_H +# define HEADER_CAMELLIA_H + +# include + +# ifdef OPENSSL_NO_CAMELLIA +# error CAMELLIA is disabled. +# endif + +# include + +# define CAMELLIA_ENCRYPT 1 +# define CAMELLIA_DECRYPT 0 + +/* + * Because array size can't be a const in C, the following two are macros. + * Both sizes are in bytes. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* This should be a hidden type, but EVP requires that the size be known */ + +# define CAMELLIA_BLOCK_SIZE 16 +# define CAMELLIA_TABLE_BYTE_LEN 272 +# define CAMELLIA_TABLE_WORD_LEN (CAMELLIA_TABLE_BYTE_LEN / 4) + +typedef unsigned int KEY_TABLE_TYPE[CAMELLIA_TABLE_WORD_LEN]; /* to match + * with WORD */ + +struct camellia_key_st { + union { + double d; /* ensures 64-bit align */ + KEY_TABLE_TYPE rd_key; + } u; + int grand_rounds; +}; +typedef struct camellia_key_st CAMELLIA_KEY; + +# ifdef OPENSSL_FIPS +int private_Camellia_set_key(const unsigned char *userKey, const int bits, + CAMELLIA_KEY *key); +# endif +int Camellia_set_key(const unsigned char *userKey, const int bits, + CAMELLIA_KEY *key); + +void Camellia_encrypt(const unsigned char *in, unsigned char *out, + const CAMELLIA_KEY *key); +void Camellia_decrypt(const unsigned char *in, unsigned char *out, + const CAMELLIA_KEY *key); + +void Camellia_ecb_encrypt(const unsigned char *in, unsigned char *out, + const CAMELLIA_KEY *key, const int enc); +void Camellia_cbc_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const CAMELLIA_KEY *key, + unsigned char *ivec, const int enc); +void Camellia_cfb128_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const CAMELLIA_KEY *key, + unsigned char *ivec, int *num, const int enc); +void Camellia_cfb1_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const CAMELLIA_KEY *key, + unsigned char *ivec, int *num, const int enc); +void Camellia_cfb8_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const CAMELLIA_KEY *key, + unsigned char *ivec, int *num, const int enc); +void Camellia_ofb128_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const CAMELLIA_KEY *key, + unsigned char *ivec, int *num); +void Camellia_ctr128_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const CAMELLIA_KEY *key, + unsigned char ivec[CAMELLIA_BLOCK_SIZE], + unsigned char ecount_buf[CAMELLIA_BLOCK_SIZE], + unsigned int *num); + +#ifdef __cplusplus +} +#endif + +#endif /* !HEADER_Camellia_H */ diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/cast.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/cast.h new file mode 100644 index 0000000..0003ec9 --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/cast.h @@ -0,0 +1,107 @@ +/* crypto/cast/cast.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_CAST_H +# define HEADER_CAST_H + +#ifdef __cplusplus +extern "C" { +#endif + +# include + +# ifdef OPENSSL_NO_CAST +# error CAST is disabled. +# endif + +# define CAST_ENCRYPT 1 +# define CAST_DECRYPT 0 + +# define CAST_LONG unsigned int + +# define CAST_BLOCK 8 +# define CAST_KEY_LENGTH 16 + +typedef struct cast_key_st { + CAST_LONG data[32]; + int short_key; /* Use reduced rounds for short key */ +} CAST_KEY; + +# ifdef OPENSSL_FIPS +void private_CAST_set_key(CAST_KEY *key, int len, const unsigned char *data); +# endif +void CAST_set_key(CAST_KEY *key, int len, const unsigned char *data); +void CAST_ecb_encrypt(const unsigned char *in, unsigned char *out, + const CAST_KEY *key, int enc); +void CAST_encrypt(CAST_LONG *data, const CAST_KEY *key); +void CAST_decrypt(CAST_LONG *data, const CAST_KEY *key); +void CAST_cbc_encrypt(const unsigned char *in, unsigned char *out, + long length, const CAST_KEY *ks, unsigned char *iv, + int enc); +void CAST_cfb64_encrypt(const unsigned char *in, unsigned char *out, + long length, const CAST_KEY *schedule, + unsigned char *ivec, int *num, int enc); +void CAST_ofb64_encrypt(const unsigned char *in, unsigned char *out, + long length, const CAST_KEY *schedule, + unsigned char *ivec, int *num); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/cmac.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/cmac.h new file mode 100644 index 0000000..175be83 --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/cmac.h @@ -0,0 +1,82 @@ +/* crypto/cmac/cmac.h */ +/* + * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL + * project. + */ +/* ==================================================================== + * Copyright (c) 2010 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + */ + +#ifndef HEADER_CMAC_H +# define HEADER_CMAC_H + +#ifdef __cplusplus +extern "C" { +#endif + +# include + +/* Opaque */ +typedef struct CMAC_CTX_st CMAC_CTX; + +CMAC_CTX *CMAC_CTX_new(void); +void CMAC_CTX_cleanup(CMAC_CTX *ctx); +void CMAC_CTX_free(CMAC_CTX *ctx); +EVP_CIPHER_CTX *CMAC_CTX_get0_cipher_ctx(CMAC_CTX *ctx); +int CMAC_CTX_copy(CMAC_CTX *out, const CMAC_CTX *in); + +int CMAC_Init(CMAC_CTX *ctx, const void *key, size_t keylen, + const EVP_CIPHER *cipher, ENGINE *impl); +int CMAC_Update(CMAC_CTX *ctx, const void *data, size_t dlen); +int CMAC_Final(CMAC_CTX *ctx, unsigned char *out, size_t *poutlen); +int CMAC_resume(CMAC_CTX *ctx); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/cms.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/cms.h new file mode 100644 index 0000000..e6c7f96 --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/cms.h @@ -0,0 +1,555 @@ +/* crypto/cms/cms.h */ +/* + * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL + * project. + */ +/* ==================================================================== + * Copyright (c) 2008 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + */ + +#ifndef HEADER_CMS_H +# define HEADER_CMS_H + +# include + +# ifdef OPENSSL_NO_CMS +# error CMS is disabled. +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct CMS_ContentInfo_st CMS_ContentInfo; +typedef struct CMS_SignerInfo_st CMS_SignerInfo; +typedef struct CMS_CertificateChoices CMS_CertificateChoices; +typedef struct CMS_RevocationInfoChoice_st CMS_RevocationInfoChoice; +typedef struct CMS_RecipientInfo_st CMS_RecipientInfo; +typedef struct CMS_ReceiptRequest_st CMS_ReceiptRequest; +typedef struct CMS_Receipt_st CMS_Receipt; +typedef struct CMS_RecipientEncryptedKey_st CMS_RecipientEncryptedKey; +typedef struct CMS_OtherKeyAttribute_st CMS_OtherKeyAttribute; + +DECLARE_STACK_OF(CMS_SignerInfo) +DECLARE_STACK_OF(GENERAL_NAMES) +DECLARE_STACK_OF(CMS_RecipientEncryptedKey) +DECLARE_ASN1_FUNCTIONS(CMS_ContentInfo) +DECLARE_ASN1_FUNCTIONS(CMS_ReceiptRequest) +DECLARE_ASN1_PRINT_FUNCTION(CMS_ContentInfo) + +# define CMS_SIGNERINFO_ISSUER_SERIAL 0 +# define CMS_SIGNERINFO_KEYIDENTIFIER 1 + +# define CMS_RECIPINFO_NONE -1 +# define CMS_RECIPINFO_TRANS 0 +# define CMS_RECIPINFO_AGREE 1 +# define CMS_RECIPINFO_KEK 2 +# define CMS_RECIPINFO_PASS 3 +# define CMS_RECIPINFO_OTHER 4 + +/* S/MIME related flags */ + +# define CMS_TEXT 0x1 +# define CMS_NOCERTS 0x2 +# define CMS_NO_CONTENT_VERIFY 0x4 +# define CMS_NO_ATTR_VERIFY 0x8 +# define CMS_NOSIGS \ + (CMS_NO_CONTENT_VERIFY|CMS_NO_ATTR_VERIFY) +# define CMS_NOINTERN 0x10 +# define CMS_NO_SIGNER_CERT_VERIFY 0x20 +# define CMS_NOVERIFY 0x20 +# define CMS_DETACHED 0x40 +# define CMS_BINARY 0x80 +# define CMS_NOATTR 0x100 +# define CMS_NOSMIMECAP 0x200 +# define CMS_NOOLDMIMETYPE 0x400 +# define CMS_CRLFEOL 0x800 +# define CMS_STREAM 0x1000 +# define CMS_NOCRL 0x2000 +# define CMS_PARTIAL 0x4000 +# define CMS_REUSE_DIGEST 0x8000 +# define CMS_USE_KEYID 0x10000 +# define CMS_DEBUG_DECRYPT 0x20000 +# define CMS_KEY_PARAM 0x40000 + +const ASN1_OBJECT *CMS_get0_type(CMS_ContentInfo *cms); + +BIO *CMS_dataInit(CMS_ContentInfo *cms, BIO *icont); +int CMS_dataFinal(CMS_ContentInfo *cms, BIO *bio); + +ASN1_OCTET_STRING **CMS_get0_content(CMS_ContentInfo *cms); +int CMS_is_detached(CMS_ContentInfo *cms); +int CMS_set_detached(CMS_ContentInfo *cms, int detached); + +# ifdef HEADER_PEM_H +DECLARE_PEM_rw_const(CMS, CMS_ContentInfo) +# endif +int CMS_stream(unsigned char ***boundary, CMS_ContentInfo *cms); +CMS_ContentInfo *d2i_CMS_bio(BIO *bp, CMS_ContentInfo **cms); +int i2d_CMS_bio(BIO *bp, CMS_ContentInfo *cms); + +BIO *BIO_new_CMS(BIO *out, CMS_ContentInfo *cms); +int i2d_CMS_bio_stream(BIO *out, CMS_ContentInfo *cms, BIO *in, int flags); +int PEM_write_bio_CMS_stream(BIO *out, CMS_ContentInfo *cms, BIO *in, + int flags); +CMS_ContentInfo *SMIME_read_CMS(BIO *bio, BIO **bcont); +int SMIME_write_CMS(BIO *bio, CMS_ContentInfo *cms, BIO *data, int flags); + +int CMS_final(CMS_ContentInfo *cms, BIO *data, BIO *dcont, + unsigned int flags); + +CMS_ContentInfo *CMS_sign(X509 *signcert, EVP_PKEY *pkey, + STACK_OF(X509) *certs, BIO *data, + unsigned int flags); + +CMS_ContentInfo *CMS_sign_receipt(CMS_SignerInfo *si, + X509 *signcert, EVP_PKEY *pkey, + STACK_OF(X509) *certs, unsigned int flags); + +int CMS_data(CMS_ContentInfo *cms, BIO *out, unsigned int flags); +CMS_ContentInfo *CMS_data_create(BIO *in, unsigned int flags); + +int CMS_digest_verify(CMS_ContentInfo *cms, BIO *dcont, BIO *out, + unsigned int flags); +CMS_ContentInfo *CMS_digest_create(BIO *in, const EVP_MD *md, + unsigned int flags); + +int CMS_EncryptedData_decrypt(CMS_ContentInfo *cms, + const unsigned char *key, size_t keylen, + BIO *dcont, BIO *out, unsigned int flags); + +CMS_ContentInfo *CMS_EncryptedData_encrypt(BIO *in, const EVP_CIPHER *cipher, + const unsigned char *key, + size_t keylen, unsigned int flags); + +int CMS_EncryptedData_set1_key(CMS_ContentInfo *cms, const EVP_CIPHER *ciph, + const unsigned char *key, size_t keylen); + +int CMS_verify(CMS_ContentInfo *cms, STACK_OF(X509) *certs, + X509_STORE *store, BIO *dcont, BIO *out, unsigned int flags); + +int CMS_verify_receipt(CMS_ContentInfo *rcms, CMS_ContentInfo *ocms, + STACK_OF(X509) *certs, + X509_STORE *store, unsigned int flags); + +STACK_OF(X509) *CMS_get0_signers(CMS_ContentInfo *cms); + +CMS_ContentInfo *CMS_encrypt(STACK_OF(X509) *certs, BIO *in, + const EVP_CIPHER *cipher, unsigned int flags); + +int CMS_decrypt(CMS_ContentInfo *cms, EVP_PKEY *pkey, X509 *cert, + BIO *dcont, BIO *out, unsigned int flags); + +int CMS_decrypt_set1_pkey(CMS_ContentInfo *cms, EVP_PKEY *pk, X509 *cert); +int CMS_decrypt_set1_key(CMS_ContentInfo *cms, + unsigned char *key, size_t keylen, + unsigned char *id, size_t idlen); +int CMS_decrypt_set1_password(CMS_ContentInfo *cms, + unsigned char *pass, ossl_ssize_t passlen); + +STACK_OF(CMS_RecipientInfo) *CMS_get0_RecipientInfos(CMS_ContentInfo *cms); +int CMS_RecipientInfo_type(CMS_RecipientInfo *ri); +EVP_PKEY_CTX *CMS_RecipientInfo_get0_pkey_ctx(CMS_RecipientInfo *ri); +CMS_ContentInfo *CMS_EnvelopedData_create(const EVP_CIPHER *cipher); +CMS_RecipientInfo *CMS_add1_recipient_cert(CMS_ContentInfo *cms, + X509 *recip, unsigned int flags); +int CMS_RecipientInfo_set0_pkey(CMS_RecipientInfo *ri, EVP_PKEY *pkey); +int CMS_RecipientInfo_ktri_cert_cmp(CMS_RecipientInfo *ri, X509 *cert); +int CMS_RecipientInfo_ktri_get0_algs(CMS_RecipientInfo *ri, + EVP_PKEY **pk, X509 **recip, + X509_ALGOR **palg); +int CMS_RecipientInfo_ktri_get0_signer_id(CMS_RecipientInfo *ri, + ASN1_OCTET_STRING **keyid, + X509_NAME **issuer, + ASN1_INTEGER **sno); + +CMS_RecipientInfo *CMS_add0_recipient_key(CMS_ContentInfo *cms, int nid, + unsigned char *key, size_t keylen, + unsigned char *id, size_t idlen, + ASN1_GENERALIZEDTIME *date, + ASN1_OBJECT *otherTypeId, + ASN1_TYPE *otherType); + +int CMS_RecipientInfo_kekri_get0_id(CMS_RecipientInfo *ri, + X509_ALGOR **palg, + ASN1_OCTET_STRING **pid, + ASN1_GENERALIZEDTIME **pdate, + ASN1_OBJECT **potherid, + ASN1_TYPE **pothertype); + +int CMS_RecipientInfo_set0_key(CMS_RecipientInfo *ri, + unsigned char *key, size_t keylen); + +int CMS_RecipientInfo_kekri_id_cmp(CMS_RecipientInfo *ri, + const unsigned char *id, size_t idlen); + +int CMS_RecipientInfo_set0_password(CMS_RecipientInfo *ri, + unsigned char *pass, + ossl_ssize_t passlen); + +CMS_RecipientInfo *CMS_add0_recipient_password(CMS_ContentInfo *cms, + int iter, int wrap_nid, + int pbe_nid, + unsigned char *pass, + ossl_ssize_t passlen, + const EVP_CIPHER *kekciph); + +int CMS_RecipientInfo_decrypt(CMS_ContentInfo *cms, CMS_RecipientInfo *ri); +int CMS_RecipientInfo_encrypt(CMS_ContentInfo *cms, CMS_RecipientInfo *ri); + +int CMS_uncompress(CMS_ContentInfo *cms, BIO *dcont, BIO *out, + unsigned int flags); +CMS_ContentInfo *CMS_compress(BIO *in, int comp_nid, unsigned int flags); + +int CMS_set1_eContentType(CMS_ContentInfo *cms, const ASN1_OBJECT *oid); +const ASN1_OBJECT *CMS_get0_eContentType(CMS_ContentInfo *cms); + +CMS_CertificateChoices *CMS_add0_CertificateChoices(CMS_ContentInfo *cms); +int CMS_add0_cert(CMS_ContentInfo *cms, X509 *cert); +int CMS_add1_cert(CMS_ContentInfo *cms, X509 *cert); +STACK_OF(X509) *CMS_get1_certs(CMS_ContentInfo *cms); + +CMS_RevocationInfoChoice *CMS_add0_RevocationInfoChoice(CMS_ContentInfo *cms); +int CMS_add0_crl(CMS_ContentInfo *cms, X509_CRL *crl); +int CMS_add1_crl(CMS_ContentInfo *cms, X509_CRL *crl); +STACK_OF(X509_CRL) *CMS_get1_crls(CMS_ContentInfo *cms); + +int CMS_SignedData_init(CMS_ContentInfo *cms); +CMS_SignerInfo *CMS_add1_signer(CMS_ContentInfo *cms, + X509 *signer, EVP_PKEY *pk, const EVP_MD *md, + unsigned int flags); +EVP_PKEY_CTX *CMS_SignerInfo_get0_pkey_ctx(CMS_SignerInfo *si); +EVP_MD_CTX *CMS_SignerInfo_get0_md_ctx(CMS_SignerInfo *si); +STACK_OF(CMS_SignerInfo) *CMS_get0_SignerInfos(CMS_ContentInfo *cms); + +void CMS_SignerInfo_set1_signer_cert(CMS_SignerInfo *si, X509 *signer); +int CMS_SignerInfo_get0_signer_id(CMS_SignerInfo *si, + ASN1_OCTET_STRING **keyid, + X509_NAME **issuer, ASN1_INTEGER **sno); +int CMS_SignerInfo_cert_cmp(CMS_SignerInfo *si, X509 *cert); +int CMS_set1_signers_certs(CMS_ContentInfo *cms, STACK_OF(X509) *certs, + unsigned int flags); +void CMS_SignerInfo_get0_algs(CMS_SignerInfo *si, EVP_PKEY **pk, + X509 **signer, X509_ALGOR **pdig, + X509_ALGOR **psig); +ASN1_OCTET_STRING *CMS_SignerInfo_get0_signature(CMS_SignerInfo *si); +int CMS_SignerInfo_sign(CMS_SignerInfo *si); +int CMS_SignerInfo_verify(CMS_SignerInfo *si); +int CMS_SignerInfo_verify_content(CMS_SignerInfo *si, BIO *chain); + +int CMS_add_smimecap(CMS_SignerInfo *si, STACK_OF(X509_ALGOR) *algs); +int CMS_add_simple_smimecap(STACK_OF(X509_ALGOR) **algs, + int algnid, int keysize); +int CMS_add_standard_smimecap(STACK_OF(X509_ALGOR) **smcap); + +int CMS_signed_get_attr_count(const CMS_SignerInfo *si); +int CMS_signed_get_attr_by_NID(const CMS_SignerInfo *si, int nid, + int lastpos); +int CMS_signed_get_attr_by_OBJ(const CMS_SignerInfo *si, ASN1_OBJECT *obj, + int lastpos); +X509_ATTRIBUTE *CMS_signed_get_attr(const CMS_SignerInfo *si, int loc); +X509_ATTRIBUTE *CMS_signed_delete_attr(CMS_SignerInfo *si, int loc); +int CMS_signed_add1_attr(CMS_SignerInfo *si, X509_ATTRIBUTE *attr); +int CMS_signed_add1_attr_by_OBJ(CMS_SignerInfo *si, + const ASN1_OBJECT *obj, int type, + const void *bytes, int len); +int CMS_signed_add1_attr_by_NID(CMS_SignerInfo *si, + int nid, int type, + const void *bytes, int len); +int CMS_signed_add1_attr_by_txt(CMS_SignerInfo *si, + const char *attrname, int type, + const void *bytes, int len); +void *CMS_signed_get0_data_by_OBJ(CMS_SignerInfo *si, ASN1_OBJECT *oid, + int lastpos, int type); + +int CMS_unsigned_get_attr_count(const CMS_SignerInfo *si); +int CMS_unsigned_get_attr_by_NID(const CMS_SignerInfo *si, int nid, + int lastpos); +int CMS_unsigned_get_attr_by_OBJ(const CMS_SignerInfo *si, ASN1_OBJECT *obj, + int lastpos); +X509_ATTRIBUTE *CMS_unsigned_get_attr(const CMS_SignerInfo *si, int loc); +X509_ATTRIBUTE *CMS_unsigned_delete_attr(CMS_SignerInfo *si, int loc); +int CMS_unsigned_add1_attr(CMS_SignerInfo *si, X509_ATTRIBUTE *attr); +int CMS_unsigned_add1_attr_by_OBJ(CMS_SignerInfo *si, + const ASN1_OBJECT *obj, int type, + const void *bytes, int len); +int CMS_unsigned_add1_attr_by_NID(CMS_SignerInfo *si, + int nid, int type, + const void *bytes, int len); +int CMS_unsigned_add1_attr_by_txt(CMS_SignerInfo *si, + const char *attrname, int type, + const void *bytes, int len); +void *CMS_unsigned_get0_data_by_OBJ(CMS_SignerInfo *si, ASN1_OBJECT *oid, + int lastpos, int type); + +# ifdef HEADER_X509V3_H + +int CMS_get1_ReceiptRequest(CMS_SignerInfo *si, CMS_ReceiptRequest **prr); +CMS_ReceiptRequest *CMS_ReceiptRequest_create0(unsigned char *id, int idlen, + int allorfirst, + STACK_OF(GENERAL_NAMES) + *receiptList, STACK_OF(GENERAL_NAMES) + *receiptsTo); +int CMS_add1_ReceiptRequest(CMS_SignerInfo *si, CMS_ReceiptRequest *rr); +void CMS_ReceiptRequest_get0_values(CMS_ReceiptRequest *rr, + ASN1_STRING **pcid, + int *pallorfirst, + STACK_OF(GENERAL_NAMES) **plist, + STACK_OF(GENERAL_NAMES) **prto); +# endif +int CMS_RecipientInfo_kari_get0_alg(CMS_RecipientInfo *ri, + X509_ALGOR **palg, + ASN1_OCTET_STRING **pukm); +STACK_OF(CMS_RecipientEncryptedKey) +*CMS_RecipientInfo_kari_get0_reks(CMS_RecipientInfo *ri); + +int CMS_RecipientInfo_kari_get0_orig_id(CMS_RecipientInfo *ri, + X509_ALGOR **pubalg, + ASN1_BIT_STRING **pubkey, + ASN1_OCTET_STRING **keyid, + X509_NAME **issuer, + ASN1_INTEGER **sno); + +int CMS_RecipientInfo_kari_orig_id_cmp(CMS_RecipientInfo *ri, X509 *cert); + +int CMS_RecipientEncryptedKey_get0_id(CMS_RecipientEncryptedKey *rek, + ASN1_OCTET_STRING **keyid, + ASN1_GENERALIZEDTIME **tm, + CMS_OtherKeyAttribute **other, + X509_NAME **issuer, ASN1_INTEGER **sno); +int CMS_RecipientEncryptedKey_cert_cmp(CMS_RecipientEncryptedKey *rek, + X509 *cert); +int CMS_RecipientInfo_kari_set0_pkey(CMS_RecipientInfo *ri, EVP_PKEY *pk); +EVP_CIPHER_CTX *CMS_RecipientInfo_kari_get0_ctx(CMS_RecipientInfo *ri); +int CMS_RecipientInfo_kari_decrypt(CMS_ContentInfo *cms, + CMS_RecipientInfo *ri, + CMS_RecipientEncryptedKey *rek); + +int CMS_SharedInfo_encode(unsigned char **pder, X509_ALGOR *kekalg, + ASN1_OCTET_STRING *ukm, int keylen); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_CMS_strings(void); + +/* Error codes for the CMS functions. */ + +/* Function codes. */ +# define CMS_F_CHECK_CONTENT 99 +# define CMS_F_CMS_ADD0_CERT 164 +# define CMS_F_CMS_ADD0_RECIPIENT_KEY 100 +# define CMS_F_CMS_ADD0_RECIPIENT_PASSWORD 165 +# define CMS_F_CMS_ADD1_RECEIPTREQUEST 158 +# define CMS_F_CMS_ADD1_RECIPIENT_CERT 101 +# define CMS_F_CMS_ADD1_SIGNER 102 +# define CMS_F_CMS_ADD1_SIGNINGTIME 103 +# define CMS_F_CMS_COMPRESS 104 +# define CMS_F_CMS_COMPRESSEDDATA_CREATE 105 +# define CMS_F_CMS_COMPRESSEDDATA_INIT_BIO 106 +# define CMS_F_CMS_COPY_CONTENT 107 +# define CMS_F_CMS_COPY_MESSAGEDIGEST 108 +# define CMS_F_CMS_DATA 109 +# define CMS_F_CMS_DATAFINAL 110 +# define CMS_F_CMS_DATAINIT 111 +# define CMS_F_CMS_DECRYPT 112 +# define CMS_F_CMS_DECRYPT_SET1_KEY 113 +# define CMS_F_CMS_DECRYPT_SET1_PASSWORD 166 +# define CMS_F_CMS_DECRYPT_SET1_PKEY 114 +# define CMS_F_CMS_DIGESTALGORITHM_FIND_CTX 115 +# define CMS_F_CMS_DIGESTALGORITHM_INIT_BIO 116 +# define CMS_F_CMS_DIGESTEDDATA_DO_FINAL 117 +# define CMS_F_CMS_DIGEST_VERIFY 118 +# define CMS_F_CMS_ENCODE_RECEIPT 161 +# define CMS_F_CMS_ENCRYPT 119 +# define CMS_F_CMS_ENCRYPTEDCONTENT_INIT_BIO 120 +# define CMS_F_CMS_ENCRYPTEDDATA_DECRYPT 121 +# define CMS_F_CMS_ENCRYPTEDDATA_ENCRYPT 122 +# define CMS_F_CMS_ENCRYPTEDDATA_SET1_KEY 123 +# define CMS_F_CMS_ENVELOPEDDATA_CREATE 124 +# define CMS_F_CMS_ENVELOPEDDATA_INIT_BIO 125 +# define CMS_F_CMS_ENVELOPED_DATA_INIT 126 +# define CMS_F_CMS_ENV_ASN1_CTRL 171 +# define CMS_F_CMS_FINAL 127 +# define CMS_F_CMS_GET0_CERTIFICATE_CHOICES 128 +# define CMS_F_CMS_GET0_CONTENT 129 +# define CMS_F_CMS_GET0_ECONTENT_TYPE 130 +# define CMS_F_CMS_GET0_ENVELOPED 131 +# define CMS_F_CMS_GET0_REVOCATION_CHOICES 132 +# define CMS_F_CMS_GET0_SIGNED 133 +# define CMS_F_CMS_MSGSIGDIGEST_ADD1 162 +# define CMS_F_CMS_RECEIPTREQUEST_CREATE0 159 +# define CMS_F_CMS_RECEIPT_VERIFY 160 +# define CMS_F_CMS_RECIPIENTINFO_DECRYPT 134 +# define CMS_F_CMS_RECIPIENTINFO_ENCRYPT 169 +# define CMS_F_CMS_RECIPIENTINFO_KARI_ENCRYPT 178 +# define CMS_F_CMS_RECIPIENTINFO_KARI_GET0_ALG 175 +# define CMS_F_CMS_RECIPIENTINFO_KARI_GET0_ORIG_ID 173 +# define CMS_F_CMS_RECIPIENTINFO_KARI_GET0_REKS 172 +# define CMS_F_CMS_RECIPIENTINFO_KARI_ORIG_ID_CMP 174 +# define CMS_F_CMS_RECIPIENTINFO_KEKRI_DECRYPT 135 +# define CMS_F_CMS_RECIPIENTINFO_KEKRI_ENCRYPT 136 +# define CMS_F_CMS_RECIPIENTINFO_KEKRI_GET0_ID 137 +# define CMS_F_CMS_RECIPIENTINFO_KEKRI_ID_CMP 138 +# define CMS_F_CMS_RECIPIENTINFO_KTRI_CERT_CMP 139 +# define CMS_F_CMS_RECIPIENTINFO_KTRI_DECRYPT 140 +# define CMS_F_CMS_RECIPIENTINFO_KTRI_ENCRYPT 141 +# define CMS_F_CMS_RECIPIENTINFO_KTRI_GET0_ALGS 142 +# define CMS_F_CMS_RECIPIENTINFO_KTRI_GET0_SIGNER_ID 143 +# define CMS_F_CMS_RECIPIENTINFO_PWRI_CRYPT 167 +# define CMS_F_CMS_RECIPIENTINFO_SET0_KEY 144 +# define CMS_F_CMS_RECIPIENTINFO_SET0_PASSWORD 168 +# define CMS_F_CMS_RECIPIENTINFO_SET0_PKEY 145 +# define CMS_F_CMS_SD_ASN1_CTRL 170 +# define CMS_F_CMS_SET1_IAS 176 +# define CMS_F_CMS_SET1_KEYID 177 +# define CMS_F_CMS_SET1_SIGNERIDENTIFIER 146 +# define CMS_F_CMS_SET_DETACHED 147 +# define CMS_F_CMS_SIGN 148 +# define CMS_F_CMS_SIGNED_DATA_INIT 149 +# define CMS_F_CMS_SIGNERINFO_CONTENT_SIGN 150 +# define CMS_F_CMS_SIGNERINFO_SIGN 151 +# define CMS_F_CMS_SIGNERINFO_VERIFY 152 +# define CMS_F_CMS_SIGNERINFO_VERIFY_CERT 153 +# define CMS_F_CMS_SIGNERINFO_VERIFY_CONTENT 154 +# define CMS_F_CMS_SIGN_RECEIPT 163 +# define CMS_F_CMS_STREAM 155 +# define CMS_F_CMS_UNCOMPRESS 156 +# define CMS_F_CMS_VERIFY 157 + +/* Reason codes. */ +# define CMS_R_ADD_SIGNER_ERROR 99 +# define CMS_R_CERTIFICATE_ALREADY_PRESENT 175 +# define CMS_R_CERTIFICATE_HAS_NO_KEYID 160 +# define CMS_R_CERTIFICATE_VERIFY_ERROR 100 +# define CMS_R_CIPHER_INITIALISATION_ERROR 101 +# define CMS_R_CIPHER_PARAMETER_INITIALISATION_ERROR 102 +# define CMS_R_CMS_DATAFINAL_ERROR 103 +# define CMS_R_CMS_LIB 104 +# define CMS_R_CONTENTIDENTIFIER_MISMATCH 170 +# define CMS_R_CONTENT_NOT_FOUND 105 +# define CMS_R_CONTENT_TYPE_MISMATCH 171 +# define CMS_R_CONTENT_TYPE_NOT_COMPRESSED_DATA 106 +# define CMS_R_CONTENT_TYPE_NOT_ENVELOPED_DATA 107 +# define CMS_R_CONTENT_TYPE_NOT_SIGNED_DATA 108 +# define CMS_R_CONTENT_VERIFY_ERROR 109 +# define CMS_R_CTRL_ERROR 110 +# define CMS_R_CTRL_FAILURE 111 +# define CMS_R_DECRYPT_ERROR 112 +# define CMS_R_DIGEST_ERROR 161 +# define CMS_R_ERROR_GETTING_PUBLIC_KEY 113 +# define CMS_R_ERROR_READING_MESSAGEDIGEST_ATTRIBUTE 114 +# define CMS_R_ERROR_SETTING_KEY 115 +# define CMS_R_ERROR_SETTING_RECIPIENTINFO 116 +# define CMS_R_INVALID_ENCRYPTED_KEY_LENGTH 117 +# define CMS_R_INVALID_KEY_ENCRYPTION_PARAMETER 176 +# define CMS_R_INVALID_KEY_LENGTH 118 +# define CMS_R_MD_BIO_INIT_ERROR 119 +# define CMS_R_MESSAGEDIGEST_ATTRIBUTE_WRONG_LENGTH 120 +# define CMS_R_MESSAGEDIGEST_WRONG_LENGTH 121 +# define CMS_R_MSGSIGDIGEST_ERROR 172 +# define CMS_R_MSGSIGDIGEST_VERIFICATION_FAILURE 162 +# define CMS_R_MSGSIGDIGEST_WRONG_LENGTH 163 +# define CMS_R_NEED_ONE_SIGNER 164 +# define CMS_R_NOT_A_SIGNED_RECEIPT 165 +# define CMS_R_NOT_ENCRYPTED_DATA 122 +# define CMS_R_NOT_KEK 123 +# define CMS_R_NOT_KEY_AGREEMENT 181 +# define CMS_R_NOT_KEY_TRANSPORT 124 +# define CMS_R_NOT_PWRI 177 +# define CMS_R_NOT_SUPPORTED_FOR_THIS_KEY_TYPE 125 +# define CMS_R_NO_CIPHER 126 +# define CMS_R_NO_CONTENT 127 +# define CMS_R_NO_CONTENT_TYPE 173 +# define CMS_R_NO_DEFAULT_DIGEST 128 +# define CMS_R_NO_DIGEST_SET 129 +# define CMS_R_NO_KEY 130 +# define CMS_R_NO_KEY_OR_CERT 174 +# define CMS_R_NO_MATCHING_DIGEST 131 +# define CMS_R_NO_MATCHING_RECIPIENT 132 +# define CMS_R_NO_MATCHING_SIGNATURE 166 +# define CMS_R_NO_MSGSIGDIGEST 167 +# define CMS_R_NO_PASSWORD 178 +# define CMS_R_NO_PRIVATE_KEY 133 +# define CMS_R_NO_PUBLIC_KEY 134 +# define CMS_R_NO_RECEIPT_REQUEST 168 +# define CMS_R_NO_SIGNERS 135 +# define CMS_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE 136 +# define CMS_R_RECEIPT_DECODE_ERROR 169 +# define CMS_R_RECIPIENT_ERROR 137 +# define CMS_R_SIGNER_CERTIFICATE_NOT_FOUND 138 +# define CMS_R_SIGNFINAL_ERROR 139 +# define CMS_R_SMIME_TEXT_ERROR 140 +# define CMS_R_STORE_INIT_ERROR 141 +# define CMS_R_TYPE_NOT_COMPRESSED_DATA 142 +# define CMS_R_TYPE_NOT_DATA 143 +# define CMS_R_TYPE_NOT_DIGESTED_DATA 144 +# define CMS_R_TYPE_NOT_ENCRYPTED_DATA 145 +# define CMS_R_TYPE_NOT_ENVELOPED_DATA 146 +# define CMS_R_UNABLE_TO_FINALIZE_CONTEXT 147 +# define CMS_R_UNKNOWN_CIPHER 148 +# define CMS_R_UNKNOWN_DIGEST_ALGORIHM 149 +# define CMS_R_UNKNOWN_ID 150 +# define CMS_R_UNSUPPORTED_COMPRESSION_ALGORITHM 151 +# define CMS_R_UNSUPPORTED_CONTENT_TYPE 152 +# define CMS_R_UNSUPPORTED_KEK_ALGORITHM 153 +# define CMS_R_UNSUPPORTED_KEY_ENCRYPTION_ALGORITHM 179 +# define CMS_R_UNSUPPORTED_RECIPIENT_TYPE 154 +# define CMS_R_UNSUPPORTED_RECPIENTINFO_TYPE 155 +# define CMS_R_UNSUPPORTED_TYPE 156 +# define CMS_R_UNWRAP_ERROR 157 +# define CMS_R_UNWRAP_FAILURE 180 +# define CMS_R_VERIFICATION_FAILURE 158 +# define CMS_R_WRAP_ERROR 159 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/comp.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/comp.h new file mode 100644 index 0000000..df599ba --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/comp.h @@ -0,0 +1,83 @@ + +#ifndef HEADER_COMP_H +# define HEADER_COMP_H + +# include + +# ifdef OPENSSL_NO_COMP +# error COMP is disabled. +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct comp_ctx_st COMP_CTX; + +struct comp_method_st { + int type; /* NID for compression library */ + const char *name; /* A text string to identify the library */ + int (*init) (COMP_CTX *ctx); + void (*finish) (COMP_CTX *ctx); + int (*compress) (COMP_CTX *ctx, + unsigned char *out, unsigned int olen, + unsigned char *in, unsigned int ilen); + int (*expand) (COMP_CTX *ctx, + unsigned char *out, unsigned int olen, + unsigned char *in, unsigned int ilen); + /* + * The following two do NOTHING, but are kept for backward compatibility + */ + long (*ctrl) (void); + long (*callback_ctrl) (void); +}; + +struct comp_ctx_st { + COMP_METHOD *meth; + unsigned long compress_in; + unsigned long compress_out; + unsigned long expand_in; + unsigned long expand_out; + CRYPTO_EX_DATA ex_data; +}; + +COMP_CTX *COMP_CTX_new(COMP_METHOD *meth); +void COMP_CTX_free(COMP_CTX *ctx); +int COMP_compress_block(COMP_CTX *ctx, unsigned char *out, int olen, + unsigned char *in, int ilen); +int COMP_expand_block(COMP_CTX *ctx, unsigned char *out, int olen, + unsigned char *in, int ilen); +COMP_METHOD *COMP_rle(void); +COMP_METHOD *COMP_zlib(void); +void COMP_zlib_cleanup(void); + +# ifdef HEADER_BIO_H +# ifdef ZLIB +BIO_METHOD *BIO_f_zlib(void); +# endif +# endif + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_COMP_strings(void); + +/* Error codes for the COMP functions. */ + +/* Function codes. */ +# define COMP_F_BIO_ZLIB_FLUSH 99 +# define COMP_F_BIO_ZLIB_NEW 100 +# define COMP_F_BIO_ZLIB_READ 101 +# define COMP_F_BIO_ZLIB_WRITE 102 + +/* Reason codes. */ +# define COMP_R_ZLIB_DEFLATE_ERROR 99 +# define COMP_R_ZLIB_INFLATE_ERROR 100 +# define COMP_R_ZLIB_NOT_SUPPORTED 101 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/conf.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/conf.h new file mode 100644 index 0000000..8d926d5 --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/conf.h @@ -0,0 +1,267 @@ +/* crypto/conf/conf.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_CONF_H +# define HEADER_CONF_H + +# include +# include +# include +# include +# include + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + char *section; + char *name; + char *value; +} CONF_VALUE; + +DECLARE_STACK_OF(CONF_VALUE) +DECLARE_LHASH_OF(CONF_VALUE); + +struct conf_st; +struct conf_method_st; +typedef struct conf_method_st CONF_METHOD; + +struct conf_method_st { + const char *name; + CONF *(*create) (CONF_METHOD *meth); + int (*init) (CONF *conf); + int (*destroy) (CONF *conf); + int (*destroy_data) (CONF *conf); + int (*load_bio) (CONF *conf, BIO *bp, long *eline); + int (*dump) (const CONF *conf, BIO *bp); + int (*is_number) (const CONF *conf, char c); + int (*to_int) (const CONF *conf, char c); + int (*load) (CONF *conf, const char *name, long *eline); +}; + +/* Module definitions */ + +typedef struct conf_imodule_st CONF_IMODULE; +typedef struct conf_module_st CONF_MODULE; + +DECLARE_STACK_OF(CONF_MODULE) +DECLARE_STACK_OF(CONF_IMODULE) + +/* DSO module function typedefs */ +typedef int conf_init_func (CONF_IMODULE *md, const CONF *cnf); +typedef void conf_finish_func (CONF_IMODULE *md); + +# define CONF_MFLAGS_IGNORE_ERRORS 0x1 +# define CONF_MFLAGS_IGNORE_RETURN_CODES 0x2 +# define CONF_MFLAGS_SILENT 0x4 +# define CONF_MFLAGS_NO_DSO 0x8 +# define CONF_MFLAGS_IGNORE_MISSING_FILE 0x10 +# define CONF_MFLAGS_DEFAULT_SECTION 0x20 + +int CONF_set_default_method(CONF_METHOD *meth); +void CONF_set_nconf(CONF *conf, LHASH_OF(CONF_VALUE) *hash); +LHASH_OF(CONF_VALUE) *CONF_load(LHASH_OF(CONF_VALUE) *conf, const char *file, + long *eline); +# ifndef OPENSSL_NO_FP_API +LHASH_OF(CONF_VALUE) *CONF_load_fp(LHASH_OF(CONF_VALUE) *conf, FILE *fp, + long *eline); +# endif +LHASH_OF(CONF_VALUE) *CONF_load_bio(LHASH_OF(CONF_VALUE) *conf, BIO *bp, + long *eline); +STACK_OF(CONF_VALUE) *CONF_get_section(LHASH_OF(CONF_VALUE) *conf, + const char *section); +char *CONF_get_string(LHASH_OF(CONF_VALUE) *conf, const char *group, + const char *name); +long CONF_get_number(LHASH_OF(CONF_VALUE) *conf, const char *group, + const char *name); +void CONF_free(LHASH_OF(CONF_VALUE) *conf); +int CONF_dump_fp(LHASH_OF(CONF_VALUE) *conf, FILE *out); +int CONF_dump_bio(LHASH_OF(CONF_VALUE) *conf, BIO *out); + +void OPENSSL_config(const char *config_name); +void OPENSSL_no_config(void); + +/* + * New conf code. The semantics are different from the functions above. If + * that wasn't the case, the above functions would have been replaced + */ + +struct conf_st { + CONF_METHOD *meth; + void *meth_data; + LHASH_OF(CONF_VALUE) *data; +}; + +CONF *NCONF_new(CONF_METHOD *meth); +CONF_METHOD *NCONF_default(void); +CONF_METHOD *NCONF_WIN32(void); +# if 0 /* Just to give you an idea of what I have in + * mind */ +CONF_METHOD *NCONF_XML(void); +# endif +void NCONF_free(CONF *conf); +void NCONF_free_data(CONF *conf); + +int NCONF_load(CONF *conf, const char *file, long *eline); +# ifndef OPENSSL_NO_FP_API +int NCONF_load_fp(CONF *conf, FILE *fp, long *eline); +# endif +int NCONF_load_bio(CONF *conf, BIO *bp, long *eline); +STACK_OF(CONF_VALUE) *NCONF_get_section(const CONF *conf, + const char *section); +char *NCONF_get_string(const CONF *conf, const char *group, const char *name); +int NCONF_get_number_e(const CONF *conf, const char *group, const char *name, + long *result); +int NCONF_dump_fp(const CONF *conf, FILE *out); +int NCONF_dump_bio(const CONF *conf, BIO *out); + +# if 0 /* The following function has no error + * checking, and should therefore be avoided */ +long NCONF_get_number(CONF *conf, char *group, char *name); +# else +# define NCONF_get_number(c,g,n,r) NCONF_get_number_e(c,g,n,r) +# endif + +/* Module functions */ + +int CONF_modules_load(const CONF *cnf, const char *appname, + unsigned long flags); +int CONF_modules_load_file(const char *filename, const char *appname, + unsigned long flags); +void CONF_modules_unload(int all); +void CONF_modules_finish(void); +void CONF_modules_free(void); +int CONF_module_add(const char *name, conf_init_func *ifunc, + conf_finish_func *ffunc); + +const char *CONF_imodule_get_name(const CONF_IMODULE *md); +const char *CONF_imodule_get_value(const CONF_IMODULE *md); +void *CONF_imodule_get_usr_data(const CONF_IMODULE *md); +void CONF_imodule_set_usr_data(CONF_IMODULE *md, void *usr_data); +CONF_MODULE *CONF_imodule_get_module(const CONF_IMODULE *md); +unsigned long CONF_imodule_get_flags(const CONF_IMODULE *md); +void CONF_imodule_set_flags(CONF_IMODULE *md, unsigned long flags); +void *CONF_module_get_usr_data(CONF_MODULE *pmod); +void CONF_module_set_usr_data(CONF_MODULE *pmod, void *usr_data); + +char *CONF_get1_default_config_file(void); + +int CONF_parse_list(const char *list, int sep, int nospc, + int (*list_cb) (const char *elem, int len, void *usr), + void *arg); + +void OPENSSL_load_builtin_modules(void); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_CONF_strings(void); + +/* Error codes for the CONF functions. */ + +/* Function codes. */ +# define CONF_F_CONF_DUMP_FP 104 +# define CONF_F_CONF_LOAD 100 +# define CONF_F_CONF_LOAD_BIO 102 +# define CONF_F_CONF_LOAD_FP 103 +# define CONF_F_CONF_MODULES_LOAD 116 +# define CONF_F_CONF_PARSE_LIST 119 +# define CONF_F_DEF_LOAD 120 +# define CONF_F_DEF_LOAD_BIO 121 +# define CONF_F_MODULE_INIT 115 +# define CONF_F_MODULE_LOAD_DSO 117 +# define CONF_F_MODULE_RUN 118 +# define CONF_F_NCONF_DUMP_BIO 105 +# define CONF_F_NCONF_DUMP_FP 106 +# define CONF_F_NCONF_GET_NUMBER 107 +# define CONF_F_NCONF_GET_NUMBER_E 112 +# define CONF_F_NCONF_GET_SECTION 108 +# define CONF_F_NCONF_GET_STRING 109 +# define CONF_F_NCONF_LOAD 113 +# define CONF_F_NCONF_LOAD_BIO 110 +# define CONF_F_NCONF_LOAD_FP 114 +# define CONF_F_NCONF_NEW 111 +# define CONF_F_STR_COPY 101 + +/* Reason codes. */ +# define CONF_R_ERROR_LOADING_DSO 110 +# define CONF_R_LIST_CANNOT_BE_NULL 115 +# define CONF_R_MISSING_CLOSE_SQUARE_BRACKET 100 +# define CONF_R_MISSING_EQUAL_SIGN 101 +# define CONF_R_MISSING_FINISH_FUNCTION 111 +# define CONF_R_MISSING_INIT_FUNCTION 112 +# define CONF_R_MODULE_INITIALIZATION_ERROR 109 +# define CONF_R_NO_CLOSE_BRACE 102 +# define CONF_R_NO_CONF 105 +# define CONF_R_NO_CONF_OR_ENVIRONMENT_VARIABLE 106 +# define CONF_R_NO_SECTION 107 +# define CONF_R_NO_SUCH_FILE 114 +# define CONF_R_NO_VALUE 108 +# define CONF_R_UNABLE_TO_CREATE_NEW_SECTION 103 +# define CONF_R_UNKNOWN_MODULE_NAME 113 +# define CONF_R_VARIABLE_HAS_NO_VALUE 104 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/conf_api.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/conf_api.h new file mode 100644 index 0000000..e478f7d --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/conf_api.h @@ -0,0 +1,89 @@ +/* conf_api.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_CONF_API_H +# define HEADER_CONF_API_H + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Up until OpenSSL 0.9.5a, this was new_section */ +CONF_VALUE *_CONF_new_section(CONF *conf, const char *section); +/* Up until OpenSSL 0.9.5a, this was get_section */ +CONF_VALUE *_CONF_get_section(const CONF *conf, const char *section); +/* Up until OpenSSL 0.9.5a, this was CONF_get_section */ +STACK_OF(CONF_VALUE) *_CONF_get_section_values(const CONF *conf, + const char *section); + +int _CONF_add_string(CONF *conf, CONF_VALUE *section, CONF_VALUE *value); +char *_CONF_get_string(const CONF *conf, const char *section, + const char *name); +long _CONF_get_number(const CONF *conf, const char *section, + const char *name); + +int _CONF_new_data(CONF *conf); +void _CONF_free_data(CONF *conf); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/crypto.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/crypto.h new file mode 100644 index 0000000..6c644ce --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/crypto.h @@ -0,0 +1,661 @@ +/* crypto/crypto.h */ +/* ==================================================================== + * Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * ECDH support in OpenSSL originally developed by + * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project. + */ + +#ifndef HEADER_CRYPTO_H +# define HEADER_CRYPTO_H + +# include + +# include + +# ifndef OPENSSL_NO_FP_API +# include +# endif + +# include +# include +# include +# include + +# ifdef CHARSET_EBCDIC +# include +# endif + +/* + * Resolve problems on some operating systems with symbol names that clash + * one way or another + */ +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Backward compatibility to SSLeay */ +/* + * This is more to be used to check the correct DLL is being used in the MS + * world. + */ +# define SSLEAY_VERSION_NUMBER OPENSSL_VERSION_NUMBER +# define SSLEAY_VERSION 0 +/* #define SSLEAY_OPTIONS 1 no longer supported */ +# define SSLEAY_CFLAGS 2 +# define SSLEAY_BUILT_ON 3 +# define SSLEAY_PLATFORM 4 +# define SSLEAY_DIR 5 + +/* Already declared in ossl_typ.h */ +# if 0 +typedef struct crypto_ex_data_st CRYPTO_EX_DATA; +/* Called when a new object is created */ +typedef int CRYPTO_EX_new (void *parent, void *ptr, CRYPTO_EX_DATA *ad, + int idx, long argl, void *argp); +/* Called when an object is free()ed */ +typedef void CRYPTO_EX_free (void *parent, void *ptr, CRYPTO_EX_DATA *ad, + int idx, long argl, void *argp); +/* Called when we need to dup an object */ +typedef int CRYPTO_EX_dup (CRYPTO_EX_DATA *to, CRYPTO_EX_DATA *from, + void *from_d, int idx, long argl, void *argp); +# endif + +/* A generic structure to pass assorted data in a expandable way */ +typedef struct openssl_item_st { + int code; + void *value; /* Not used for flag attributes */ + size_t value_size; /* Max size of value for output, length for + * input */ + size_t *value_length; /* Returned length of value for output */ +} OPENSSL_ITEM; + +/* + * When changing the CRYPTO_LOCK_* list, be sure to maintin the text lock + * names in cryptlib.c + */ + +# define CRYPTO_LOCK_ERR 1 +# define CRYPTO_LOCK_EX_DATA 2 +# define CRYPTO_LOCK_X509 3 +# define CRYPTO_LOCK_X509_INFO 4 +# define CRYPTO_LOCK_X509_PKEY 5 +# define CRYPTO_LOCK_X509_CRL 6 +# define CRYPTO_LOCK_X509_REQ 7 +# define CRYPTO_LOCK_DSA 8 +# define CRYPTO_LOCK_RSA 9 +# define CRYPTO_LOCK_EVP_PKEY 10 +# define CRYPTO_LOCK_X509_STORE 11 +# define CRYPTO_LOCK_SSL_CTX 12 +# define CRYPTO_LOCK_SSL_CERT 13 +# define CRYPTO_LOCK_SSL_SESSION 14 +# define CRYPTO_LOCK_SSL_SESS_CERT 15 +# define CRYPTO_LOCK_SSL 16 +# define CRYPTO_LOCK_SSL_METHOD 17 +# define CRYPTO_LOCK_RAND 18 +# define CRYPTO_LOCK_RAND2 19 +# define CRYPTO_LOCK_MALLOC 20 +# define CRYPTO_LOCK_BIO 21 +# define CRYPTO_LOCK_GETHOSTBYNAME 22 +# define CRYPTO_LOCK_GETSERVBYNAME 23 +# define CRYPTO_LOCK_READDIR 24 +# define CRYPTO_LOCK_RSA_BLINDING 25 +# define CRYPTO_LOCK_DH 26 +# define CRYPTO_LOCK_MALLOC2 27 +# define CRYPTO_LOCK_DSO 28 +# define CRYPTO_LOCK_DYNLOCK 29 +# define CRYPTO_LOCK_ENGINE 30 +# define CRYPTO_LOCK_UI 31 +# define CRYPTO_LOCK_ECDSA 32 +# define CRYPTO_LOCK_EC 33 +# define CRYPTO_LOCK_ECDH 34 +# define CRYPTO_LOCK_BN 35 +# define CRYPTO_LOCK_EC_PRE_COMP 36 +# define CRYPTO_LOCK_STORE 37 +# define CRYPTO_LOCK_COMP 38 +# define CRYPTO_LOCK_FIPS 39 +# define CRYPTO_LOCK_FIPS2 40 +# define CRYPTO_NUM_LOCKS 41 + +# define CRYPTO_LOCK 1 +# define CRYPTO_UNLOCK 2 +# define CRYPTO_READ 4 +# define CRYPTO_WRITE 8 + +# ifndef OPENSSL_NO_LOCKING +# ifndef CRYPTO_w_lock +# define CRYPTO_w_lock(type) \ + CRYPTO_lock(CRYPTO_LOCK|CRYPTO_WRITE,type,__FILE__,__LINE__) +# define CRYPTO_w_unlock(type) \ + CRYPTO_lock(CRYPTO_UNLOCK|CRYPTO_WRITE,type,__FILE__,__LINE__) +# define CRYPTO_r_lock(type) \ + CRYPTO_lock(CRYPTO_LOCK|CRYPTO_READ,type,__FILE__,__LINE__) +# define CRYPTO_r_unlock(type) \ + CRYPTO_lock(CRYPTO_UNLOCK|CRYPTO_READ,type,__FILE__,__LINE__) +# define CRYPTO_add(addr,amount,type) \ + CRYPTO_add_lock(addr,amount,type,__FILE__,__LINE__) +# endif +# else +# define CRYPTO_w_lock(a) +# define CRYPTO_w_unlock(a) +# define CRYPTO_r_lock(a) +# define CRYPTO_r_unlock(a) +# define CRYPTO_add(a,b,c) ((*(a))+=(b)) +# endif + +/* + * Some applications as well as some parts of OpenSSL need to allocate and + * deallocate locks in a dynamic fashion. The following typedef makes this + * possible in a type-safe manner. + */ +/* struct CRYPTO_dynlock_value has to be defined by the application. */ +typedef struct { + int references; + struct CRYPTO_dynlock_value *data; +} CRYPTO_dynlock; + +/* + * The following can be used to detect memory leaks in the SSLeay library. It + * used, it turns on malloc checking + */ + +# define CRYPTO_MEM_CHECK_OFF 0x0/* an enume */ +# define CRYPTO_MEM_CHECK_ON 0x1/* a bit */ +# define CRYPTO_MEM_CHECK_ENABLE 0x2/* a bit */ +# define CRYPTO_MEM_CHECK_DISABLE 0x3/* an enume */ + +/* + * The following are bit values to turn on or off options connected to the + * malloc checking functionality + */ + +/* Adds time to the memory checking information */ +# define V_CRYPTO_MDEBUG_TIME 0x1/* a bit */ +/* Adds thread number to the memory checking information */ +# define V_CRYPTO_MDEBUG_THREAD 0x2/* a bit */ + +# define V_CRYPTO_MDEBUG_ALL (V_CRYPTO_MDEBUG_TIME | V_CRYPTO_MDEBUG_THREAD) + +/* predec of the BIO type */ +typedef struct bio_st BIO_dummy; + +struct crypto_ex_data_st { + STACK_OF(void) *sk; + /* gcc is screwing up this data structure :-( */ + int dummy; +}; +DECLARE_STACK_OF(void) + +/* + * This stuff is basically class callback functions The current classes are + * SSL_CTX, SSL, SSL_SESSION, and a few more + */ + +typedef struct crypto_ex_data_func_st { + long argl; /* Arbitary long */ + void *argp; /* Arbitary void * */ + CRYPTO_EX_new *new_func; + CRYPTO_EX_free *free_func; + CRYPTO_EX_dup *dup_func; +} CRYPTO_EX_DATA_FUNCS; + +DECLARE_STACK_OF(CRYPTO_EX_DATA_FUNCS) + +/* + * Per class, we have a STACK of CRYPTO_EX_DATA_FUNCS for each CRYPTO_EX_DATA + * entry. + */ + +# define CRYPTO_EX_INDEX_BIO 0 +# define CRYPTO_EX_INDEX_SSL 1 +# define CRYPTO_EX_INDEX_SSL_CTX 2 +# define CRYPTO_EX_INDEX_SSL_SESSION 3 +# define CRYPTO_EX_INDEX_X509_STORE 4 +# define CRYPTO_EX_INDEX_X509_STORE_CTX 5 +# define CRYPTO_EX_INDEX_RSA 6 +# define CRYPTO_EX_INDEX_DSA 7 +# define CRYPTO_EX_INDEX_DH 8 +# define CRYPTO_EX_INDEX_ENGINE 9 +# define CRYPTO_EX_INDEX_X509 10 +# define CRYPTO_EX_INDEX_UI 11 +# define CRYPTO_EX_INDEX_ECDSA 12 +# define CRYPTO_EX_INDEX_ECDH 13 +# define CRYPTO_EX_INDEX_COMP 14 +# define CRYPTO_EX_INDEX_STORE 15 + +/* + * Dynamically assigned indexes start from this value (don't use directly, + * use via CRYPTO_ex_data_new_class). + */ +# define CRYPTO_EX_INDEX_USER 100 + +/* + * This is the default callbacks, but we can have others as well: this is + * needed in Win32 where the application malloc and the library malloc may + * not be the same. + */ +# define CRYPTO_malloc_init() CRYPTO_set_mem_functions(\ + malloc, realloc, free) + +# if defined CRYPTO_MDEBUG_ALL || defined CRYPTO_MDEBUG_TIME || defined CRYPTO_MDEBUG_THREAD +# ifndef CRYPTO_MDEBUG /* avoid duplicate #define */ +# define CRYPTO_MDEBUG +# endif +# endif + +/* + * Set standard debugging functions (not done by default unless CRYPTO_MDEBUG + * is defined) + */ +# define CRYPTO_malloc_debug_init() do {\ + CRYPTO_set_mem_debug_functions(\ + CRYPTO_dbg_malloc,\ + CRYPTO_dbg_realloc,\ + CRYPTO_dbg_free,\ + CRYPTO_dbg_set_options,\ + CRYPTO_dbg_get_options);\ + } while(0) + +int CRYPTO_mem_ctrl(int mode); +int CRYPTO_is_mem_check_on(void); + +/* for applications */ +# define MemCheck_start() CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON) +# define MemCheck_stop() CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_OFF) + +/* for library-internal use */ +# define MemCheck_on() CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ENABLE) +# define MemCheck_off() CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_DISABLE) +# define is_MemCheck_on() CRYPTO_is_mem_check_on() + +# define OPENSSL_malloc(num) CRYPTO_malloc((int)num,__FILE__,__LINE__) +# define OPENSSL_strdup(str) CRYPTO_strdup((str),__FILE__,__LINE__) +# define OPENSSL_realloc(addr,num) \ + CRYPTO_realloc((char *)addr,(int)num,__FILE__,__LINE__) +# define OPENSSL_realloc_clean(addr,old_num,num) \ + CRYPTO_realloc_clean(addr,old_num,num,__FILE__,__LINE__) +# define OPENSSL_remalloc(addr,num) \ + CRYPTO_remalloc((char **)addr,(int)num,__FILE__,__LINE__) +# define OPENSSL_freeFunc CRYPTO_free +# define OPENSSL_free(addr) CRYPTO_free(addr) + +# define OPENSSL_malloc_locked(num) \ + CRYPTO_malloc_locked((int)num,__FILE__,__LINE__) +# define OPENSSL_free_locked(addr) CRYPTO_free_locked(addr) + +const char *SSLeay_version(int type); +unsigned long SSLeay(void); + +int OPENSSL_issetugid(void); + +/* An opaque type representing an implementation of "ex_data" support */ +typedef struct st_CRYPTO_EX_DATA_IMPL CRYPTO_EX_DATA_IMPL; +/* Return an opaque pointer to the current "ex_data" implementation */ +const CRYPTO_EX_DATA_IMPL *CRYPTO_get_ex_data_implementation(void); +/* Sets the "ex_data" implementation to be used (if it's not too late) */ +int CRYPTO_set_ex_data_implementation(const CRYPTO_EX_DATA_IMPL *i); +/* Get a new "ex_data" class, and return the corresponding "class_index" */ +int CRYPTO_ex_data_new_class(void); +/* Within a given class, get/register a new index */ +int CRYPTO_get_ex_new_index(int class_index, long argl, void *argp, + CRYPTO_EX_new *new_func, CRYPTO_EX_dup *dup_func, + CRYPTO_EX_free *free_func); +/* + * Initialise/duplicate/free CRYPTO_EX_DATA variables corresponding to a + * given class (invokes whatever per-class callbacks are applicable) + */ +int CRYPTO_new_ex_data(int class_index, void *obj, CRYPTO_EX_DATA *ad); +int CRYPTO_dup_ex_data(int class_index, CRYPTO_EX_DATA *to, + CRYPTO_EX_DATA *from); +void CRYPTO_free_ex_data(int class_index, void *obj, CRYPTO_EX_DATA *ad); +/* + * Get/set data in a CRYPTO_EX_DATA variable corresponding to a particular + * index (relative to the class type involved) + */ +int CRYPTO_set_ex_data(CRYPTO_EX_DATA *ad, int idx, void *val); +void *CRYPTO_get_ex_data(const CRYPTO_EX_DATA *ad, int idx); +/* + * This function cleans up all "ex_data" state. It mustn't be called under + * potential race-conditions. + */ +void CRYPTO_cleanup_all_ex_data(void); + +int CRYPTO_get_new_lockid(char *name); + +int CRYPTO_num_locks(void); /* return CRYPTO_NUM_LOCKS (shared libs!) */ +void CRYPTO_lock(int mode, int type, const char *file, int line); +void CRYPTO_set_locking_callback(void (*func) (int mode, int type, + const char *file, int line)); +void (*CRYPTO_get_locking_callback(void)) (int mode, int type, + const char *file, int line); +void CRYPTO_set_add_lock_callback(int (*func) + (int *num, int mount, int type, + const char *file, int line)); +int (*CRYPTO_get_add_lock_callback(void)) (int *num, int mount, int type, + const char *file, int line); + +/* Don't use this structure directly. */ +typedef struct crypto_threadid_st { + void *ptr; + unsigned long val; +} CRYPTO_THREADID; +/* Only use CRYPTO_THREADID_set_[numeric|pointer]() within callbacks */ +void CRYPTO_THREADID_set_numeric(CRYPTO_THREADID *id, unsigned long val); +void CRYPTO_THREADID_set_pointer(CRYPTO_THREADID *id, void *ptr); +int CRYPTO_THREADID_set_callback(void (*threadid_func) (CRYPTO_THREADID *)); +void (*CRYPTO_THREADID_get_callback(void)) (CRYPTO_THREADID *); +void CRYPTO_THREADID_current(CRYPTO_THREADID *id); +int CRYPTO_THREADID_cmp(const CRYPTO_THREADID *a, const CRYPTO_THREADID *b); +void CRYPTO_THREADID_cpy(CRYPTO_THREADID *dest, const CRYPTO_THREADID *src); +unsigned long CRYPTO_THREADID_hash(const CRYPTO_THREADID *id); +# ifndef OPENSSL_NO_DEPRECATED +void CRYPTO_set_id_callback(unsigned long (*func) (void)); +unsigned long (*CRYPTO_get_id_callback(void)) (void); +unsigned long CRYPTO_thread_id(void); +# endif + +const char *CRYPTO_get_lock_name(int type); +int CRYPTO_add_lock(int *pointer, int amount, int type, const char *file, + int line); + +int CRYPTO_get_new_dynlockid(void); +void CRYPTO_destroy_dynlockid(int i); +struct CRYPTO_dynlock_value *CRYPTO_get_dynlock_value(int i); +void CRYPTO_set_dynlock_create_callback(struct CRYPTO_dynlock_value + *(*dyn_create_function) (const char + *file, + int line)); +void CRYPTO_set_dynlock_lock_callback(void (*dyn_lock_function) + (int mode, + struct CRYPTO_dynlock_value *l, + const char *file, int line)); +void CRYPTO_set_dynlock_destroy_callback(void (*dyn_destroy_function) + (struct CRYPTO_dynlock_value *l, + const char *file, int line)); +struct CRYPTO_dynlock_value +*(*CRYPTO_get_dynlock_create_callback(void)) (const char *file, int line); +void (*CRYPTO_get_dynlock_lock_callback(void)) (int mode, + struct CRYPTO_dynlock_value + *l, const char *file, + int line); +void (*CRYPTO_get_dynlock_destroy_callback(void)) (struct CRYPTO_dynlock_value + *l, const char *file, + int line); + +/* + * CRYPTO_set_mem_functions includes CRYPTO_set_locked_mem_functions -- call + * the latter last if you need different functions + */ +int CRYPTO_set_mem_functions(void *(*m) (size_t), void *(*r) (void *, size_t), + void (*f) (void *)); +int CRYPTO_set_locked_mem_functions(void *(*m) (size_t), + void (*free_func) (void *)); +int CRYPTO_set_mem_ex_functions(void *(*m) (size_t, const char *, int), + void *(*r) (void *, size_t, const char *, + int), void (*f) (void *)); +int CRYPTO_set_locked_mem_ex_functions(void *(*m) (size_t, const char *, int), + void (*free_func) (void *)); +int CRYPTO_set_mem_debug_functions(void (*m) + (void *, int, const char *, int, int), + void (*r) (void *, void *, int, + const char *, int, int), + void (*f) (void *, int), void (*so) (long), + long (*go) (void)); +void CRYPTO_get_mem_functions(void *(**m) (size_t), + void *(**r) (void *, size_t), + void (**f) (void *)); +void CRYPTO_get_locked_mem_functions(void *(**m) (size_t), + void (**f) (void *)); +void CRYPTO_get_mem_ex_functions(void *(**m) (size_t, const char *, int), + void *(**r) (void *, size_t, const char *, + int), void (**f) (void *)); +void CRYPTO_get_locked_mem_ex_functions(void + *(**m) (size_t, const char *, int), + void (**f) (void *)); +void CRYPTO_get_mem_debug_functions(void (**m) + (void *, int, const char *, int, int), + void (**r) (void *, void *, int, + const char *, int, int), + void (**f) (void *, int), + void (**so) (long), long (**go) (void)); + +void *CRYPTO_malloc_locked(int num, const char *file, int line); +void CRYPTO_free_locked(void *ptr); +void *CRYPTO_malloc(int num, const char *file, int line); +char *CRYPTO_strdup(const char *str, const char *file, int line); +void CRYPTO_free(void *ptr); +void *CRYPTO_realloc(void *addr, int num, const char *file, int line); +void *CRYPTO_realloc_clean(void *addr, int old_num, int num, const char *file, + int line); +void *CRYPTO_remalloc(void *addr, int num, const char *file, int line); + +void OPENSSL_cleanse(void *ptr, size_t len); + +void CRYPTO_set_mem_debug_options(long bits); +long CRYPTO_get_mem_debug_options(void); + +# define CRYPTO_push_info(info) \ + CRYPTO_push_info_(info, __FILE__, __LINE__); +int CRYPTO_push_info_(const char *info, const char *file, int line); +int CRYPTO_pop_info(void); +int CRYPTO_remove_all_info(void); + +/* + * Default debugging functions (enabled by CRYPTO_malloc_debug_init() macro; + * used as default in CRYPTO_MDEBUG compilations): + */ +/*- + * The last argument has the following significance: + * + * 0: called before the actual memory allocation has taken place + * 1: called after the actual memory allocation has taken place + */ +void CRYPTO_dbg_malloc(void *addr, int num, const char *file, int line, + int before_p); +void CRYPTO_dbg_realloc(void *addr1, void *addr2, int num, const char *file, + int line, int before_p); +void CRYPTO_dbg_free(void *addr, int before_p); +/*- + * Tell the debugging code about options. By default, the following values + * apply: + * + * 0: Clear all options. + * V_CRYPTO_MDEBUG_TIME (1): Set the "Show Time" option. + * V_CRYPTO_MDEBUG_THREAD (2): Set the "Show Thread Number" option. + * V_CRYPTO_MDEBUG_ALL (3): 1 + 2 + */ +void CRYPTO_dbg_set_options(long bits); +long CRYPTO_dbg_get_options(void); + +# ifndef OPENSSL_NO_FP_API +void CRYPTO_mem_leaks_fp(FILE *); +# endif +void CRYPTO_mem_leaks(struct bio_st *bio); +/* unsigned long order, char *file, int line, int num_bytes, char *addr */ +typedef void *CRYPTO_MEM_LEAK_CB (unsigned long, const char *, int, int, + void *); +void CRYPTO_mem_leaks_cb(CRYPTO_MEM_LEAK_CB *cb); + +/* die if we have to */ +void OpenSSLDie(const char *file, int line, const char *assertion); +# define OPENSSL_assert(e) (void)((e) ? 0 : (OpenSSLDie(__FILE__, __LINE__, #e),1)) + +unsigned long *OPENSSL_ia32cap_loc(void); +# define OPENSSL_ia32cap (*(OPENSSL_ia32cap_loc())) +int OPENSSL_isservice(void); + +int FIPS_mode(void); +int FIPS_mode_set(int r); + +void OPENSSL_init(void); + +# define fips_md_init(alg) fips_md_init_ctx(alg, alg) + +# ifdef OPENSSL_FIPS +# define fips_md_init_ctx(alg, cx) \ + int alg##_Init(cx##_CTX *c) \ + { \ + if (FIPS_mode()) OpenSSLDie(__FILE__, __LINE__, \ + "Low level API call to digest " #alg " forbidden in FIPS mode!"); \ + return private_##alg##_Init(c); \ + } \ + int private_##alg##_Init(cx##_CTX *c) + +# define fips_cipher_abort(alg) \ + if (FIPS_mode()) OpenSSLDie(__FILE__, __LINE__, \ + "Low level API call to cipher " #alg " forbidden in FIPS mode!") + +# else +# define fips_md_init_ctx(alg, cx) \ + int alg##_Init(cx##_CTX *c) +# define fips_cipher_abort(alg) while(0) +# endif + +/* + * CRYPTO_memcmp returns zero iff the |len| bytes at |a| and |b| are equal. + * It takes an amount of time dependent on |len|, but independent of the + * contents of |a| and |b|. Unlike memcmp, it cannot be used to put elements + * into a defined order as the return value when a != b is undefined, other + * than to be non-zero. + */ +int CRYPTO_memcmp(const volatile void *a, const volatile void *b, size_t len); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_CRYPTO_strings(void); + +/* Error codes for the CRYPTO functions. */ + +/* Function codes. */ +# define CRYPTO_F_CRYPTO_GET_EX_NEW_INDEX 100 +# define CRYPTO_F_CRYPTO_GET_NEW_DYNLOCKID 103 +# define CRYPTO_F_CRYPTO_GET_NEW_LOCKID 101 +# define CRYPTO_F_CRYPTO_SET_EX_DATA 102 +# define CRYPTO_F_DEF_ADD_INDEX 104 +# define CRYPTO_F_DEF_GET_CLASS 105 +# define CRYPTO_F_FIPS_MODE_SET 109 +# define CRYPTO_F_INT_DUP_EX_DATA 106 +# define CRYPTO_F_INT_FREE_EX_DATA 107 +# define CRYPTO_F_INT_NEW_EX_DATA 108 + +/* Reason codes. */ +# define CRYPTO_R_FIPS_MODE_NOT_SUPPORTED 101 +# define CRYPTO_R_NO_DYNLOCK_CREATE_CALLBACK 100 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/des.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/des.h new file mode 100644 index 0000000..1b40144 --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/des.h @@ -0,0 +1,257 @@ +/* crypto/des/des.h */ +/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_NEW_DES_H +# define HEADER_NEW_DES_H + +# include /* OPENSSL_EXTERN, OPENSSL_NO_DES, DES_LONG + * (via openssl/opensslconf.h */ + +# ifdef OPENSSL_NO_DES +# error DES is disabled. +# endif + +# ifdef OPENSSL_BUILD_SHLIBCRYPTO +# undef OPENSSL_EXTERN +# define OPENSSL_EXTERN OPENSSL_EXPORT +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef unsigned char DES_cblock[8]; +typedef /* const */ unsigned char const_DES_cblock[8]; +/* + * With "const", gcc 2.8.1 on Solaris thinks that DES_cblock * and + * const_DES_cblock * are incompatible pointer types. + */ + +typedef struct DES_ks { + union { + DES_cblock cblock; + /* + * make sure things are correct size on machines with 8 byte longs + */ + DES_LONG deslong[2]; + } ks[16]; +} DES_key_schedule; + +# ifndef OPENSSL_DISABLE_OLD_DES_SUPPORT +# ifndef OPENSSL_ENABLE_OLD_DES_SUPPORT +# define OPENSSL_ENABLE_OLD_DES_SUPPORT +# endif +# endif + +# ifdef OPENSSL_ENABLE_OLD_DES_SUPPORT +# include +# endif + +# define DES_KEY_SZ (sizeof(DES_cblock)) +# define DES_SCHEDULE_SZ (sizeof(DES_key_schedule)) + +# define DES_ENCRYPT 1 +# define DES_DECRYPT 0 + +# define DES_CBC_MODE 0 +# define DES_PCBC_MODE 1 + +# define DES_ecb2_encrypt(i,o,k1,k2,e) \ + DES_ecb3_encrypt((i),(o),(k1),(k2),(k1),(e)) + +# define DES_ede2_cbc_encrypt(i,o,l,k1,k2,iv,e) \ + DES_ede3_cbc_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(e)) + +# define DES_ede2_cfb64_encrypt(i,o,l,k1,k2,iv,n,e) \ + DES_ede3_cfb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n),(e)) + +# define DES_ede2_ofb64_encrypt(i,o,l,k1,k2,iv,n) \ + DES_ede3_ofb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n)) + +OPENSSL_DECLARE_GLOBAL(int, DES_check_key); /* defaults to false */ +# define DES_check_key OPENSSL_GLOBAL_REF(DES_check_key) +OPENSSL_DECLARE_GLOBAL(int, DES_rw_mode); /* defaults to DES_PCBC_MODE */ +# define DES_rw_mode OPENSSL_GLOBAL_REF(DES_rw_mode) + +const char *DES_options(void); +void DES_ecb3_encrypt(const_DES_cblock *input, DES_cblock *output, + DES_key_schedule *ks1, DES_key_schedule *ks2, + DES_key_schedule *ks3, int enc); +DES_LONG DES_cbc_cksum(const unsigned char *input, DES_cblock *output, + long length, DES_key_schedule *schedule, + const_DES_cblock *ivec); +/* DES_cbc_encrypt does not update the IV! Use DES_ncbc_encrypt instead. */ +void DES_cbc_encrypt(const unsigned char *input, unsigned char *output, + long length, DES_key_schedule *schedule, + DES_cblock *ivec, int enc); +void DES_ncbc_encrypt(const unsigned char *input, unsigned char *output, + long length, DES_key_schedule *schedule, + DES_cblock *ivec, int enc); +void DES_xcbc_encrypt(const unsigned char *input, unsigned char *output, + long length, DES_key_schedule *schedule, + DES_cblock *ivec, const_DES_cblock *inw, + const_DES_cblock *outw, int enc); +void DES_cfb_encrypt(const unsigned char *in, unsigned char *out, int numbits, + long length, DES_key_schedule *schedule, + DES_cblock *ivec, int enc); +void DES_ecb_encrypt(const_DES_cblock *input, DES_cblock *output, + DES_key_schedule *ks, int enc); + +/* + * This is the DES encryption function that gets called by just about every + * other DES routine in the library. You should not use this function except + * to implement 'modes' of DES. I say this because the functions that call + * this routine do the conversion from 'char *' to long, and this needs to be + * done to make sure 'non-aligned' memory access do not occur. The + * characters are loaded 'little endian'. Data is a pointer to 2 unsigned + * long's and ks is the DES_key_schedule to use. enc, is non zero specifies + * encryption, zero if decryption. + */ +void DES_encrypt1(DES_LONG *data, DES_key_schedule *ks, int enc); + +/* + * This functions is the same as DES_encrypt1() except that the DES initial + * permutation (IP) and final permutation (FP) have been left out. As for + * DES_encrypt1(), you should not use this function. It is used by the + * routines in the library that implement triple DES. IP() DES_encrypt2() + * DES_encrypt2() DES_encrypt2() FP() is the same as DES_encrypt1() + * DES_encrypt1() DES_encrypt1() except faster :-). + */ +void DES_encrypt2(DES_LONG *data, DES_key_schedule *ks, int enc); + +void DES_encrypt3(DES_LONG *data, DES_key_schedule *ks1, + DES_key_schedule *ks2, DES_key_schedule *ks3); +void DES_decrypt3(DES_LONG *data, DES_key_schedule *ks1, + DES_key_schedule *ks2, DES_key_schedule *ks3); +void DES_ede3_cbc_encrypt(const unsigned char *input, unsigned char *output, + long length, + DES_key_schedule *ks1, DES_key_schedule *ks2, + DES_key_schedule *ks3, DES_cblock *ivec, int enc); +void DES_ede3_cbcm_encrypt(const unsigned char *in, unsigned char *out, + long length, + DES_key_schedule *ks1, DES_key_schedule *ks2, + DES_key_schedule *ks3, + DES_cblock *ivec1, DES_cblock *ivec2, int enc); +void DES_ede3_cfb64_encrypt(const unsigned char *in, unsigned char *out, + long length, DES_key_schedule *ks1, + DES_key_schedule *ks2, DES_key_schedule *ks3, + DES_cblock *ivec, int *num, int enc); +void DES_ede3_cfb_encrypt(const unsigned char *in, unsigned char *out, + int numbits, long length, DES_key_schedule *ks1, + DES_key_schedule *ks2, DES_key_schedule *ks3, + DES_cblock *ivec, int enc); +void DES_ede3_ofb64_encrypt(const unsigned char *in, unsigned char *out, + long length, DES_key_schedule *ks1, + DES_key_schedule *ks2, DES_key_schedule *ks3, + DES_cblock *ivec, int *num); +# if 0 +void DES_xwhite_in2out(const_DES_cblock *DES_key, const_DES_cblock *in_white, + DES_cblock *out_white); +# endif + +int DES_enc_read(int fd, void *buf, int len, DES_key_schedule *sched, + DES_cblock *iv); +int DES_enc_write(int fd, const void *buf, int len, DES_key_schedule *sched, + DES_cblock *iv); +char *DES_fcrypt(const char *buf, const char *salt, char *ret); +char *DES_crypt(const char *buf, const char *salt); +void DES_ofb_encrypt(const unsigned char *in, unsigned char *out, int numbits, + long length, DES_key_schedule *schedule, + DES_cblock *ivec); +void DES_pcbc_encrypt(const unsigned char *input, unsigned char *output, + long length, DES_key_schedule *schedule, + DES_cblock *ivec, int enc); +DES_LONG DES_quad_cksum(const unsigned char *input, DES_cblock output[], + long length, int out_count, DES_cblock *seed); +int DES_random_key(DES_cblock *ret); +void DES_set_odd_parity(DES_cblock *key); +int DES_check_key_parity(const_DES_cblock *key); +int DES_is_weak_key(const_DES_cblock *key); +/* + * DES_set_key (= set_key = DES_key_sched = key_sched) calls + * DES_set_key_checked if global variable DES_check_key is set, + * DES_set_key_unchecked otherwise. + */ +int DES_set_key(const_DES_cblock *key, DES_key_schedule *schedule); +int DES_key_sched(const_DES_cblock *key, DES_key_schedule *schedule); +int DES_set_key_checked(const_DES_cblock *key, DES_key_schedule *schedule); +void DES_set_key_unchecked(const_DES_cblock *key, DES_key_schedule *schedule); +# ifdef OPENSSL_FIPS +void private_DES_set_key_unchecked(const_DES_cblock *key, + DES_key_schedule *schedule); +# endif +void DES_string_to_key(const char *str, DES_cblock *key); +void DES_string_to_2keys(const char *str, DES_cblock *key1, DES_cblock *key2); +void DES_cfb64_encrypt(const unsigned char *in, unsigned char *out, + long length, DES_key_schedule *schedule, + DES_cblock *ivec, int *num, int enc); +void DES_ofb64_encrypt(const unsigned char *in, unsigned char *out, + long length, DES_key_schedule *schedule, + DES_cblock *ivec, int *num); + +int DES_read_password(DES_cblock *key, const char *prompt, int verify); +int DES_read_2passwords(DES_cblock *key1, DES_cblock *key2, + const char *prompt, int verify); + +# define DES_fixup_key_parity DES_set_odd_parity + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/des_old.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/des_old.h new file mode 100644 index 0000000..ee7607a --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/des_old.h @@ -0,0 +1,497 @@ +/* crypto/des/des_old.h */ + +/*- + * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING + * + * The function names in here are deprecated and are only present to + * provide an interface compatible with openssl 0.9.6 and older as + * well as libdes. OpenSSL now provides functions where "des_" has + * been replaced with "DES_" in the names, to make it possible to + * make incompatible changes that are needed for C type security and + * other stuff. + * + * This include files has two compatibility modes: + * + * - If OPENSSL_DES_LIBDES_COMPATIBILITY is defined, you get an API + * that is compatible with libdes and SSLeay. + * - If OPENSSL_DES_LIBDES_COMPATIBILITY isn't defined, you get an + * API that is compatible with OpenSSL 0.9.5x to 0.9.6x. + * + * Note that these modes break earlier snapshots of OpenSSL, where + * libdes compatibility was the only available mode or (later on) the + * prefered compatibility mode. However, after much consideration + * (and more or less violent discussions with external parties), it + * was concluded that OpenSSL should be compatible with earlier versions + * of itself before anything else. Also, in all honesty, libdes is + * an old beast that shouldn't really be used any more. + * + * Please consider starting to use the DES_ functions rather than the + * des_ ones. The des_ functions will disappear completely before + * OpenSSL 1.0! + * + * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING + */ + +/* + * Written by Richard Levitte (richard@levitte.org) for the OpenSSL project + * 2001. + */ +/* ==================================================================== + * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_DES_H +# define HEADER_DES_H + +# include /* OPENSSL_EXTERN, OPENSSL_NO_DES, DES_LONG */ + +# ifdef OPENSSL_NO_DES +# error DES is disabled. +# endif + +# ifndef HEADER_NEW_DES_H +# error You must include des.h, not des_old.h directly. +# endif + +# ifdef _KERBEROS_DES_H +# error replaces . +# endif + +# include + +# ifdef OPENSSL_BUILD_SHLIBCRYPTO +# undef OPENSSL_EXTERN +# define OPENSSL_EXTERN OPENSSL_EXPORT +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +# ifdef _ +# undef _ +# endif + +typedef unsigned char _ossl_old_des_cblock[8]; +typedef struct _ossl_old_des_ks_struct { + union { + _ossl_old_des_cblock _; + /* + * make sure things are correct size on machines with 8 byte longs + */ + DES_LONG pad[2]; + } ks; +} _ossl_old_des_key_schedule[16]; + +# ifndef OPENSSL_DES_LIBDES_COMPATIBILITY +# define des_cblock DES_cblock +# define const_des_cblock const_DES_cblock +# define des_key_schedule DES_key_schedule +# define des_ecb3_encrypt(i,o,k1,k2,k3,e)\ + DES_ecb3_encrypt((i),(o),&(k1),&(k2),&(k3),(e)) +# define des_ede3_cbc_encrypt(i,o,l,k1,k2,k3,iv,e)\ + DES_ede3_cbc_encrypt((i),(o),(l),&(k1),&(k2),&(k3),(iv),(e)) +# define des_ede3_cbcm_encrypt(i,o,l,k1,k2,k3,iv1,iv2,e)\ + DES_ede3_cbcm_encrypt((i),(o),(l),&(k1),&(k2),&(k3),(iv1),(iv2),(e)) +# define des_ede3_cfb64_encrypt(i,o,l,k1,k2,k3,iv,n,e)\ + DES_ede3_cfb64_encrypt((i),(o),(l),&(k1),&(k2),&(k3),(iv),(n),(e)) +# define des_ede3_ofb64_encrypt(i,o,l,k1,k2,k3,iv,n)\ + DES_ede3_ofb64_encrypt((i),(o),(l),&(k1),&(k2),&(k3),(iv),(n)) +# define des_options()\ + DES_options() +# define des_cbc_cksum(i,o,l,k,iv)\ + DES_cbc_cksum((i),(o),(l),&(k),(iv)) +# define des_cbc_encrypt(i,o,l,k,iv,e)\ + DES_cbc_encrypt((i),(o),(l),&(k),(iv),(e)) +# define des_ncbc_encrypt(i,o,l,k,iv,e)\ + DES_ncbc_encrypt((i),(o),(l),&(k),(iv),(e)) +# define des_xcbc_encrypt(i,o,l,k,iv,inw,outw,e)\ + DES_xcbc_encrypt((i),(o),(l),&(k),(iv),(inw),(outw),(e)) +# define des_cfb_encrypt(i,o,n,l,k,iv,e)\ + DES_cfb_encrypt((i),(o),(n),(l),&(k),(iv),(e)) +# define des_ecb_encrypt(i,o,k,e)\ + DES_ecb_encrypt((i),(o),&(k),(e)) +# define des_encrypt1(d,k,e)\ + DES_encrypt1((d),&(k),(e)) +# define des_encrypt2(d,k,e)\ + DES_encrypt2((d),&(k),(e)) +# define des_encrypt3(d,k1,k2,k3)\ + DES_encrypt3((d),&(k1),&(k2),&(k3)) +# define des_decrypt3(d,k1,k2,k3)\ + DES_decrypt3((d),&(k1),&(k2),&(k3)) +# define des_xwhite_in2out(k,i,o)\ + DES_xwhite_in2out((k),(i),(o)) +# define des_enc_read(f,b,l,k,iv)\ + DES_enc_read((f),(b),(l),&(k),(iv)) +# define des_enc_write(f,b,l,k,iv)\ + DES_enc_write((f),(b),(l),&(k),(iv)) +# define des_fcrypt(b,s,r)\ + DES_fcrypt((b),(s),(r)) +# if 0 +# define des_crypt(b,s)\ + DES_crypt((b),(s)) +# if !defined(PERL5) && !defined(__FreeBSD__) && !defined(NeXT) && !defined(__OpenBSD__) +# define crypt(b,s)\ + DES_crypt((b),(s)) +# endif +# endif +# define des_ofb_encrypt(i,o,n,l,k,iv)\ + DES_ofb_encrypt((i),(o),(n),(l),&(k),(iv)) +# define des_pcbc_encrypt(i,o,l,k,iv,e)\ + DES_pcbc_encrypt((i),(o),(l),&(k),(iv),(e)) +# define des_quad_cksum(i,o,l,c,s)\ + DES_quad_cksum((i),(o),(l),(c),(s)) +# define des_random_seed(k)\ + _ossl_096_des_random_seed((k)) +# define des_random_key(r)\ + DES_random_key((r)) +# define des_read_password(k,p,v) \ + DES_read_password((k),(p),(v)) +# define des_read_2passwords(k1,k2,p,v) \ + DES_read_2passwords((k1),(k2),(p),(v)) +# define des_set_odd_parity(k)\ + DES_set_odd_parity((k)) +# define des_check_key_parity(k)\ + DES_check_key_parity((k)) +# define des_is_weak_key(k)\ + DES_is_weak_key((k)) +# define des_set_key(k,ks)\ + DES_set_key((k),&(ks)) +# define des_key_sched(k,ks)\ + DES_key_sched((k),&(ks)) +# define des_set_key_checked(k,ks)\ + DES_set_key_checked((k),&(ks)) +# define des_set_key_unchecked(k,ks)\ + DES_set_key_unchecked((k),&(ks)) +# define des_string_to_key(s,k)\ + DES_string_to_key((s),(k)) +# define des_string_to_2keys(s,k1,k2)\ + DES_string_to_2keys((s),(k1),(k2)) +# define des_cfb64_encrypt(i,o,l,ks,iv,n,e)\ + DES_cfb64_encrypt((i),(o),(l),&(ks),(iv),(n),(e)) +# define des_ofb64_encrypt(i,o,l,ks,iv,n)\ + DES_ofb64_encrypt((i),(o),(l),&(ks),(iv),(n)) + +# define des_ecb2_encrypt(i,o,k1,k2,e) \ + des_ecb3_encrypt((i),(o),(k1),(k2),(k1),(e)) + +# define des_ede2_cbc_encrypt(i,o,l,k1,k2,iv,e) \ + des_ede3_cbc_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(e)) + +# define des_ede2_cfb64_encrypt(i,o,l,k1,k2,iv,n,e) \ + des_ede3_cfb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n),(e)) + +# define des_ede2_ofb64_encrypt(i,o,l,k1,k2,iv,n) \ + des_ede3_ofb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n)) + +# define des_check_key DES_check_key +# define des_rw_mode DES_rw_mode +# else /* libdes compatibility */ +/* + * Map all symbol names to _ossl_old_des_* form, so we avoid all clashes with + * libdes + */ +# define des_cblock _ossl_old_des_cblock +# define des_key_schedule _ossl_old_des_key_schedule +# define des_ecb3_encrypt(i,o,k1,k2,k3,e)\ + _ossl_old_des_ecb3_encrypt((i),(o),(k1),(k2),(k3),(e)) +# define des_ede3_cbc_encrypt(i,o,l,k1,k2,k3,iv,e)\ + _ossl_old_des_ede3_cbc_encrypt((i),(o),(l),(k1),(k2),(k3),(iv),(e)) +# define des_ede3_cfb64_encrypt(i,o,l,k1,k2,k3,iv,n,e)\ + _ossl_old_des_ede3_cfb64_encrypt((i),(o),(l),(k1),(k2),(k3),(iv),(n),(e)) +# define des_ede3_ofb64_encrypt(i,o,l,k1,k2,k3,iv,n)\ + _ossl_old_des_ede3_ofb64_encrypt((i),(o),(l),(k1),(k2),(k3),(iv),(n)) +# define des_options()\ + _ossl_old_des_options() +# define des_cbc_cksum(i,o,l,k,iv)\ + _ossl_old_des_cbc_cksum((i),(o),(l),(k),(iv)) +# define des_cbc_encrypt(i,o,l,k,iv,e)\ + _ossl_old_des_cbc_encrypt((i),(o),(l),(k),(iv),(e)) +# define des_ncbc_encrypt(i,o,l,k,iv,e)\ + _ossl_old_des_ncbc_encrypt((i),(o),(l),(k),(iv),(e)) +# define des_xcbc_encrypt(i,o,l,k,iv,inw,outw,e)\ + _ossl_old_des_xcbc_encrypt((i),(o),(l),(k),(iv),(inw),(outw),(e)) +# define des_cfb_encrypt(i,o,n,l,k,iv,e)\ + _ossl_old_des_cfb_encrypt((i),(o),(n),(l),(k),(iv),(e)) +# define des_ecb_encrypt(i,o,k,e)\ + _ossl_old_des_ecb_encrypt((i),(o),(k),(e)) +# define des_encrypt(d,k,e)\ + _ossl_old_des_encrypt((d),(k),(e)) +# define des_encrypt2(d,k,e)\ + _ossl_old_des_encrypt2((d),(k),(e)) +# define des_encrypt3(d,k1,k2,k3)\ + _ossl_old_des_encrypt3((d),(k1),(k2),(k3)) +# define des_decrypt3(d,k1,k2,k3)\ + _ossl_old_des_decrypt3((d),(k1),(k2),(k3)) +# define des_xwhite_in2out(k,i,o)\ + _ossl_old_des_xwhite_in2out((k),(i),(o)) +# define des_enc_read(f,b,l,k,iv)\ + _ossl_old_des_enc_read((f),(b),(l),(k),(iv)) +# define des_enc_write(f,b,l,k,iv)\ + _ossl_old_des_enc_write((f),(b),(l),(k),(iv)) +# define des_fcrypt(b,s,r)\ + _ossl_old_des_fcrypt((b),(s),(r)) +# define des_crypt(b,s)\ + _ossl_old_des_crypt((b),(s)) +# if 0 +# define crypt(b,s)\ + _ossl_old_crypt((b),(s)) +# endif +# define des_ofb_encrypt(i,o,n,l,k,iv)\ + _ossl_old_des_ofb_encrypt((i),(o),(n),(l),(k),(iv)) +# define des_pcbc_encrypt(i,o,l,k,iv,e)\ + _ossl_old_des_pcbc_encrypt((i),(o),(l),(k),(iv),(e)) +# define des_quad_cksum(i,o,l,c,s)\ + _ossl_old_des_quad_cksum((i),(o),(l),(c),(s)) +# define des_random_seed(k)\ + _ossl_old_des_random_seed((k)) +# define des_random_key(r)\ + _ossl_old_des_random_key((r)) +# define des_read_password(k,p,v) \ + _ossl_old_des_read_password((k),(p),(v)) +# define des_read_2passwords(k1,k2,p,v) \ + _ossl_old_des_read_2passwords((k1),(k2),(p),(v)) +# define des_set_odd_parity(k)\ + _ossl_old_des_set_odd_parity((k)) +# define des_is_weak_key(k)\ + _ossl_old_des_is_weak_key((k)) +# define des_set_key(k,ks)\ + _ossl_old_des_set_key((k),(ks)) +# define des_key_sched(k,ks)\ + _ossl_old_des_key_sched((k),(ks)) +# define des_string_to_key(s,k)\ + _ossl_old_des_string_to_key((s),(k)) +# define des_string_to_2keys(s,k1,k2)\ + _ossl_old_des_string_to_2keys((s),(k1),(k2)) +# define des_cfb64_encrypt(i,o,l,ks,iv,n,e)\ + _ossl_old_des_cfb64_encrypt((i),(o),(l),(ks),(iv),(n),(e)) +# define des_ofb64_encrypt(i,o,l,ks,iv,n)\ + _ossl_old_des_ofb64_encrypt((i),(o),(l),(ks),(iv),(n)) + +# define des_ecb2_encrypt(i,o,k1,k2,e) \ + des_ecb3_encrypt((i),(o),(k1),(k2),(k1),(e)) + +# define des_ede2_cbc_encrypt(i,o,l,k1,k2,iv,e) \ + des_ede3_cbc_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(e)) + +# define des_ede2_cfb64_encrypt(i,o,l,k1,k2,iv,n,e) \ + des_ede3_cfb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n),(e)) + +# define des_ede2_ofb64_encrypt(i,o,l,k1,k2,iv,n) \ + des_ede3_ofb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n)) + +# define des_check_key DES_check_key +# define des_rw_mode DES_rw_mode +# endif + +const char *_ossl_old_des_options(void); +void _ossl_old_des_ecb3_encrypt(_ossl_old_des_cblock *input, + _ossl_old_des_cblock *output, + _ossl_old_des_key_schedule ks1, + _ossl_old_des_key_schedule ks2, + _ossl_old_des_key_schedule ks3, int enc); +DES_LONG _ossl_old_des_cbc_cksum(_ossl_old_des_cblock *input, + _ossl_old_des_cblock *output, long length, + _ossl_old_des_key_schedule schedule, + _ossl_old_des_cblock *ivec); +void _ossl_old_des_cbc_encrypt(_ossl_old_des_cblock *input, + _ossl_old_des_cblock *output, long length, + _ossl_old_des_key_schedule schedule, + _ossl_old_des_cblock *ivec, int enc); +void _ossl_old_des_ncbc_encrypt(_ossl_old_des_cblock *input, + _ossl_old_des_cblock *output, long length, + _ossl_old_des_key_schedule schedule, + _ossl_old_des_cblock *ivec, int enc); +void _ossl_old_des_xcbc_encrypt(_ossl_old_des_cblock *input, + _ossl_old_des_cblock *output, long length, + _ossl_old_des_key_schedule schedule, + _ossl_old_des_cblock *ivec, + _ossl_old_des_cblock *inw, + _ossl_old_des_cblock *outw, int enc); +void _ossl_old_des_cfb_encrypt(unsigned char *in, unsigned char *out, + int numbits, long length, + _ossl_old_des_key_schedule schedule, + _ossl_old_des_cblock *ivec, int enc); +void _ossl_old_des_ecb_encrypt(_ossl_old_des_cblock *input, + _ossl_old_des_cblock *output, + _ossl_old_des_key_schedule ks, int enc); +void _ossl_old_des_encrypt(DES_LONG *data, _ossl_old_des_key_schedule ks, + int enc); +void _ossl_old_des_encrypt2(DES_LONG *data, _ossl_old_des_key_schedule ks, + int enc); +void _ossl_old_des_encrypt3(DES_LONG *data, _ossl_old_des_key_schedule ks1, + _ossl_old_des_key_schedule ks2, + _ossl_old_des_key_schedule ks3); +void _ossl_old_des_decrypt3(DES_LONG *data, _ossl_old_des_key_schedule ks1, + _ossl_old_des_key_schedule ks2, + _ossl_old_des_key_schedule ks3); +void _ossl_old_des_ede3_cbc_encrypt(_ossl_old_des_cblock *input, + _ossl_old_des_cblock *output, long length, + _ossl_old_des_key_schedule ks1, + _ossl_old_des_key_schedule ks2, + _ossl_old_des_key_schedule ks3, + _ossl_old_des_cblock *ivec, int enc); +void _ossl_old_des_ede3_cfb64_encrypt(unsigned char *in, unsigned char *out, + long length, + _ossl_old_des_key_schedule ks1, + _ossl_old_des_key_schedule ks2, + _ossl_old_des_key_schedule ks3, + _ossl_old_des_cblock *ivec, int *num, + int enc); +void _ossl_old_des_ede3_ofb64_encrypt(unsigned char *in, unsigned char *out, + long length, + _ossl_old_des_key_schedule ks1, + _ossl_old_des_key_schedule ks2, + _ossl_old_des_key_schedule ks3, + _ossl_old_des_cblock *ivec, int *num); +# if 0 +void _ossl_old_des_xwhite_in2out(_ossl_old_des_cblock (*des_key), + _ossl_old_des_cblock (*in_white), + _ossl_old_des_cblock (*out_white)); +# endif + +int _ossl_old_des_enc_read(int fd, char *buf, int len, + _ossl_old_des_key_schedule sched, + _ossl_old_des_cblock *iv); +int _ossl_old_des_enc_write(int fd, char *buf, int len, + _ossl_old_des_key_schedule sched, + _ossl_old_des_cblock *iv); +char *_ossl_old_des_fcrypt(const char *buf, const char *salt, char *ret); +char *_ossl_old_des_crypt(const char *buf, const char *salt); +# if !defined(PERL5) && !defined(NeXT) +char *_ossl_old_crypt(const char *buf, const char *salt); +# endif +void _ossl_old_des_ofb_encrypt(unsigned char *in, unsigned char *out, + int numbits, long length, + _ossl_old_des_key_schedule schedule, + _ossl_old_des_cblock *ivec); +void _ossl_old_des_pcbc_encrypt(_ossl_old_des_cblock *input, + _ossl_old_des_cblock *output, long length, + _ossl_old_des_key_schedule schedule, + _ossl_old_des_cblock *ivec, int enc); +DES_LONG _ossl_old_des_quad_cksum(_ossl_old_des_cblock *input, + _ossl_old_des_cblock *output, long length, + int out_count, _ossl_old_des_cblock *seed); +void _ossl_old_des_random_seed(_ossl_old_des_cblock key); +void _ossl_old_des_random_key(_ossl_old_des_cblock ret); +int _ossl_old_des_read_password(_ossl_old_des_cblock *key, const char *prompt, + int verify); +int _ossl_old_des_read_2passwords(_ossl_old_des_cblock *key1, + _ossl_old_des_cblock *key2, + const char *prompt, int verify); +void _ossl_old_des_set_odd_parity(_ossl_old_des_cblock *key); +int _ossl_old_des_is_weak_key(_ossl_old_des_cblock *key); +int _ossl_old_des_set_key(_ossl_old_des_cblock *key, + _ossl_old_des_key_schedule schedule); +int _ossl_old_des_key_sched(_ossl_old_des_cblock *key, + _ossl_old_des_key_schedule schedule); +void _ossl_old_des_string_to_key(char *str, _ossl_old_des_cblock *key); +void _ossl_old_des_string_to_2keys(char *str, _ossl_old_des_cblock *key1, + _ossl_old_des_cblock *key2); +void _ossl_old_des_cfb64_encrypt(unsigned char *in, unsigned char *out, + long length, + _ossl_old_des_key_schedule schedule, + _ossl_old_des_cblock *ivec, int *num, + int enc); +void _ossl_old_des_ofb64_encrypt(unsigned char *in, unsigned char *out, + long length, + _ossl_old_des_key_schedule schedule, + _ossl_old_des_cblock *ivec, int *num); + +void _ossl_096_des_random_seed(des_cblock *key); + +/* + * The following definitions provide compatibility with the MIT Kerberos + * library. The _ossl_old_des_key_schedule structure is not binary + * compatible. + */ + +# define _KERBEROS_DES_H + +# define KRBDES_ENCRYPT DES_ENCRYPT +# define KRBDES_DECRYPT DES_DECRYPT + +# ifdef KERBEROS +# define ENCRYPT DES_ENCRYPT +# define DECRYPT DES_DECRYPT +# endif + +# ifndef NCOMPAT +# define C_Block des_cblock +# define Key_schedule des_key_schedule +# define KEY_SZ DES_KEY_SZ +# define string_to_key des_string_to_key +# define read_pw_string des_read_pw_string +# define random_key des_random_key +# define pcbc_encrypt des_pcbc_encrypt +# define set_key des_set_key +# define key_sched des_key_sched +# define ecb_encrypt des_ecb_encrypt +# define cbc_encrypt des_cbc_encrypt +# define ncbc_encrypt des_ncbc_encrypt +# define xcbc_encrypt des_xcbc_encrypt +# define cbc_cksum des_cbc_cksum +# define quad_cksum des_quad_cksum +# define check_parity des_check_key_parity +# endif + +# define des_fixup_key_parity DES_fixup_key_parity + +#ifdef __cplusplus +} +#endif + +/* for DES_read_pw_string et al */ +# include + +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/dh.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/dh.h new file mode 100644 index 0000000..a5bd901 --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/dh.h @@ -0,0 +1,393 @@ +/* crypto/dh/dh.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_DH_H +# define HEADER_DH_H + +# include + +# ifdef OPENSSL_NO_DH +# error DH is disabled. +# endif + +# ifndef OPENSSL_NO_BIO +# include +# endif +# include +# ifndef OPENSSL_NO_DEPRECATED +# include +# endif + +# ifndef OPENSSL_DH_MAX_MODULUS_BITS +# define OPENSSL_DH_MAX_MODULUS_BITS 10000 +# endif + +# define DH_FLAG_CACHE_MONT_P 0x01 + +/* + * new with 0.9.7h; the built-in DH + * implementation now uses constant time + * modular exponentiation for secret exponents + * by default. This flag causes the + * faster variable sliding window method to + * be used for all exponents. + */ +# define DH_FLAG_NO_EXP_CONSTTIME 0x02 + +/* + * If this flag is set the DH method is FIPS compliant and can be used in + * FIPS mode. This is set in the validated module method. If an application + * sets this flag in its own methods it is its reposibility to ensure the + * result is compliant. + */ + +# define DH_FLAG_FIPS_METHOD 0x0400 + +/* + * If this flag is set the operations normally disabled in FIPS mode are + * permitted it is then the applications responsibility to ensure that the + * usage is compliant. + */ + +# define DH_FLAG_NON_FIPS_ALLOW 0x0400 + +#ifdef __cplusplus +extern "C" { +#endif + +/* Already defined in ossl_typ.h */ +/* typedef struct dh_st DH; */ +/* typedef struct dh_method DH_METHOD; */ + +struct dh_method { + const char *name; + /* Methods here */ + int (*generate_key) (DH *dh); + int (*compute_key) (unsigned char *key, const BIGNUM *pub_key, DH *dh); + /* Can be null */ + int (*bn_mod_exp) (const DH *dh, BIGNUM *r, const BIGNUM *a, + const BIGNUM *p, const BIGNUM *m, BN_CTX *ctx, + BN_MONT_CTX *m_ctx); + int (*init) (DH *dh); + int (*finish) (DH *dh); + int flags; + char *app_data; + /* If this is non-NULL, it will be used to generate parameters */ + int (*generate_params) (DH *dh, int prime_len, int generator, + BN_GENCB *cb); +}; + +struct dh_st { + /* + * This first argument is used to pick up errors when a DH is passed + * instead of a EVP_PKEY + */ + int pad; + int version; + BIGNUM *p; + BIGNUM *g; + long length; /* optional */ + BIGNUM *pub_key; /* g^x % p */ + BIGNUM *priv_key; /* x */ + int flags; + BN_MONT_CTX *method_mont_p; + /* Place holders if we want to do X9.42 DH */ + BIGNUM *q; + BIGNUM *j; + unsigned char *seed; + int seedlen; + BIGNUM *counter; + int references; + CRYPTO_EX_DATA ex_data; + const DH_METHOD *meth; + ENGINE *engine; +}; + +# define DH_GENERATOR_2 2 +/* #define DH_GENERATOR_3 3 */ +# define DH_GENERATOR_5 5 + +/* DH_check error codes */ +# define DH_CHECK_P_NOT_PRIME 0x01 +# define DH_CHECK_P_NOT_SAFE_PRIME 0x02 +# define DH_UNABLE_TO_CHECK_GENERATOR 0x04 +# define DH_NOT_SUITABLE_GENERATOR 0x08 +# define DH_CHECK_Q_NOT_PRIME 0x10 +# define DH_CHECK_INVALID_Q_VALUE 0x20 +# define DH_CHECK_INVALID_J_VALUE 0x40 + +/* DH_check_pub_key error codes */ +# define DH_CHECK_PUBKEY_TOO_SMALL 0x01 +# define DH_CHECK_PUBKEY_TOO_LARGE 0x02 +# define DH_CHECK_PUBKEY_INVALID 0x04 + +/* + * primes p where (p-1)/2 is prime too are called "safe"; we define this for + * backward compatibility: + */ +# define DH_CHECK_P_NOT_STRONG_PRIME DH_CHECK_P_NOT_SAFE_PRIME + +# define d2i_DHparams_fp(fp,x) (DH *)ASN1_d2i_fp((char *(*)())DH_new, \ + (char *(*)())d2i_DHparams,(fp),(unsigned char **)(x)) +# define i2d_DHparams_fp(fp,x) ASN1_i2d_fp(i2d_DHparams,(fp), \ + (unsigned char *)(x)) +# define d2i_DHparams_bio(bp,x) ASN1_d2i_bio_of(DH,DH_new,d2i_DHparams,bp,x) +# define i2d_DHparams_bio(bp,x) ASN1_i2d_bio_of_const(DH,i2d_DHparams,bp,x) + +DH *DHparams_dup(DH *); + +const DH_METHOD *DH_OpenSSL(void); + +void DH_set_default_method(const DH_METHOD *meth); +const DH_METHOD *DH_get_default_method(void); +int DH_set_method(DH *dh, const DH_METHOD *meth); +DH *DH_new_method(ENGINE *engine); + +DH *DH_new(void); +void DH_free(DH *dh); +int DH_up_ref(DH *dh); +int DH_size(const DH *dh); +int DH_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); +int DH_set_ex_data(DH *d, int idx, void *arg); +void *DH_get_ex_data(DH *d, int idx); + +/* Deprecated version */ +# ifndef OPENSSL_NO_DEPRECATED +DH *DH_generate_parameters(int prime_len, int generator, + void (*callback) (int, int, void *), void *cb_arg); +# endif /* !defined(OPENSSL_NO_DEPRECATED) */ + +/* New version */ +int DH_generate_parameters_ex(DH *dh, int prime_len, int generator, + BN_GENCB *cb); + +int DH_check(const DH *dh, int *codes); +int DH_check_pub_key(const DH *dh, const BIGNUM *pub_key, int *codes); +int DH_generate_key(DH *dh); +int DH_compute_key(unsigned char *key, const BIGNUM *pub_key, DH *dh); +int DH_compute_key_padded(unsigned char *key, const BIGNUM *pub_key, DH *dh); +DH *d2i_DHparams(DH **a, const unsigned char **pp, long length); +int i2d_DHparams(const DH *a, unsigned char **pp); +DH *d2i_DHxparams(DH **a, const unsigned char **pp, long length); +int i2d_DHxparams(const DH *a, unsigned char **pp); +# ifndef OPENSSL_NO_FP_API +int DHparams_print_fp(FILE *fp, const DH *x); +# endif +# ifndef OPENSSL_NO_BIO +int DHparams_print(BIO *bp, const DH *x); +# else +int DHparams_print(char *bp, const DH *x); +# endif + +/* RFC 5114 parameters */ +DH *DH_get_1024_160(void); +DH *DH_get_2048_224(void); +DH *DH_get_2048_256(void); + +/* RFC2631 KDF */ +int DH_KDF_X9_42(unsigned char *out, size_t outlen, + const unsigned char *Z, size_t Zlen, + ASN1_OBJECT *key_oid, + const unsigned char *ukm, size_t ukmlen, const EVP_MD *md); + +# define EVP_PKEY_CTX_set_dh_paramgen_prime_len(ctx, len) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DH, EVP_PKEY_OP_PARAMGEN, \ + EVP_PKEY_CTRL_DH_PARAMGEN_PRIME_LEN, len, NULL) + +# define EVP_PKEY_CTX_set_dh_paramgen_subprime_len(ctx, len) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DH, EVP_PKEY_OP_PARAMGEN, \ + EVP_PKEY_CTRL_DH_PARAMGEN_SUBPRIME_LEN, len, NULL) + +# define EVP_PKEY_CTX_set_dh_paramgen_type(ctx, typ) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DH, EVP_PKEY_OP_PARAMGEN, \ + EVP_PKEY_CTRL_DH_PARAMGEN_TYPE, typ, NULL) + +# define EVP_PKEY_CTX_set_dh_paramgen_generator(ctx, gen) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DH, EVP_PKEY_OP_PARAMGEN, \ + EVP_PKEY_CTRL_DH_PARAMGEN_GENERATOR, gen, NULL) + +# define EVP_PKEY_CTX_set_dh_rfc5114(ctx, gen) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, EVP_PKEY_OP_PARAMGEN, \ + EVP_PKEY_CTRL_DH_RFC5114, gen, NULL) + +# define EVP_PKEY_CTX_set_dhx_rfc5114(ctx, gen) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, EVP_PKEY_OP_PARAMGEN, \ + EVP_PKEY_CTRL_DH_RFC5114, gen, NULL) + +# define EVP_PKEY_CTX_set_dh_kdf_type(ctx, kdf) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_DH_KDF_TYPE, kdf, NULL) + +# define EVP_PKEY_CTX_get_dh_kdf_type(ctx) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_DH_KDF_TYPE, -2, NULL) + +# define EVP_PKEY_CTX_set0_dh_kdf_oid(ctx, oid) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_DH_KDF_OID, 0, (void *)oid) + +# define EVP_PKEY_CTX_get0_dh_kdf_oid(ctx, poid) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_GET_DH_KDF_OID, 0, (void *)poid) + +# define EVP_PKEY_CTX_set_dh_kdf_md(ctx, md) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_DH_KDF_MD, 0, (void *)md) + +# define EVP_PKEY_CTX_get_dh_kdf_md(ctx, pmd) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_GET_DH_KDF_MD, 0, (void *)pmd) + +# define EVP_PKEY_CTX_set_dh_kdf_outlen(ctx, len) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_DH_KDF_OUTLEN, len, NULL) + +# define EVP_PKEY_CTX_get_dh_kdf_outlen(ctx, plen) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_GET_DH_KDF_OUTLEN, 0, (void *)plen) + +# define EVP_PKEY_CTX_set0_dh_kdf_ukm(ctx, p, plen) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_DH_KDF_UKM, plen, (void *)p) + +# define EVP_PKEY_CTX_get0_dh_kdf_ukm(ctx, p) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_GET_DH_KDF_UKM, 0, (void *)p) + +# define EVP_PKEY_CTRL_DH_PARAMGEN_PRIME_LEN (EVP_PKEY_ALG_CTRL + 1) +# define EVP_PKEY_CTRL_DH_PARAMGEN_GENERATOR (EVP_PKEY_ALG_CTRL + 2) +# define EVP_PKEY_CTRL_DH_RFC5114 (EVP_PKEY_ALG_CTRL + 3) +# define EVP_PKEY_CTRL_DH_PARAMGEN_SUBPRIME_LEN (EVP_PKEY_ALG_CTRL + 4) +# define EVP_PKEY_CTRL_DH_PARAMGEN_TYPE (EVP_PKEY_ALG_CTRL + 5) +# define EVP_PKEY_CTRL_DH_KDF_TYPE (EVP_PKEY_ALG_CTRL + 6) +# define EVP_PKEY_CTRL_DH_KDF_MD (EVP_PKEY_ALG_CTRL + 7) +# define EVP_PKEY_CTRL_GET_DH_KDF_MD (EVP_PKEY_ALG_CTRL + 8) +# define EVP_PKEY_CTRL_DH_KDF_OUTLEN (EVP_PKEY_ALG_CTRL + 9) +# define EVP_PKEY_CTRL_GET_DH_KDF_OUTLEN (EVP_PKEY_ALG_CTRL + 10) +# define EVP_PKEY_CTRL_DH_KDF_UKM (EVP_PKEY_ALG_CTRL + 11) +# define EVP_PKEY_CTRL_GET_DH_KDF_UKM (EVP_PKEY_ALG_CTRL + 12) +# define EVP_PKEY_CTRL_DH_KDF_OID (EVP_PKEY_ALG_CTRL + 13) +# define EVP_PKEY_CTRL_GET_DH_KDF_OID (EVP_PKEY_ALG_CTRL + 14) + +/* KDF types */ +# define EVP_PKEY_DH_KDF_NONE 1 +# define EVP_PKEY_DH_KDF_X9_42 2 + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_DH_strings(void); + +/* Error codes for the DH functions. */ + +/* Function codes. */ +# define DH_F_COMPUTE_KEY 102 +# define DH_F_DHPARAMS_PRINT_FP 101 +# define DH_F_DH_BUILTIN_GENPARAMS 106 +# define DH_F_DH_CMS_DECRYPT 117 +# define DH_F_DH_CMS_SET_PEERKEY 118 +# define DH_F_DH_CMS_SET_SHARED_INFO 119 +# define DH_F_DH_COMPUTE_KEY 114 +# define DH_F_DH_GENERATE_KEY 115 +# define DH_F_DH_GENERATE_PARAMETERS_EX 116 +# define DH_F_DH_NEW_METHOD 105 +# define DH_F_DH_PARAM_DECODE 107 +# define DH_F_DH_PRIV_DECODE 110 +# define DH_F_DH_PRIV_ENCODE 111 +# define DH_F_DH_PUB_DECODE 108 +# define DH_F_DH_PUB_ENCODE 109 +# define DH_F_DO_DH_PRINT 100 +# define DH_F_GENERATE_KEY 103 +# define DH_F_GENERATE_PARAMETERS 104 +# define DH_F_PKEY_DH_DERIVE 112 +# define DH_F_PKEY_DH_KEYGEN 113 + +/* Reason codes. */ +# define DH_R_BAD_GENERATOR 101 +# define DH_R_BN_DECODE_ERROR 109 +# define DH_R_BN_ERROR 106 +# define DH_R_DECODE_ERROR 104 +# define DH_R_INVALID_PUBKEY 102 +# define DH_R_KDF_PARAMETER_ERROR 112 +# define DH_R_KEYS_NOT_SET 108 +# define DH_R_KEY_SIZE_TOO_SMALL 110 +# define DH_R_MODULUS_TOO_LARGE 103 +# define DH_R_NON_FIPS_METHOD 111 +# define DH_R_NO_PARAMETERS_SET 107 +# define DH_R_NO_PRIVATE_VALUE 100 +# define DH_R_PARAMETER_ENCODING_ERROR 105 +# define DH_R_PEER_KEY_ERROR 113 +# define DH_R_SHARED_INFO_ERROR 114 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/dsa.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/dsa.h new file mode 100644 index 0000000..545358f --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/dsa.h @@ -0,0 +1,332 @@ +/* crypto/dsa/dsa.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +/* + * The DSS routines are based on patches supplied by + * Steven Schoch . He basically did the + * work and I have just tweaked them a little to fit into my + * stylistic vision for SSLeay :-) */ + +#ifndef HEADER_DSA_H +# define HEADER_DSA_H + +# include + +# ifdef OPENSSL_NO_DSA +# error DSA is disabled. +# endif + +# ifndef OPENSSL_NO_BIO +# include +# endif +# include +# include + +# ifndef OPENSSL_NO_DEPRECATED +# include +# ifndef OPENSSL_NO_DH +# include +# endif +# endif + +# ifndef OPENSSL_DSA_MAX_MODULUS_BITS +# define OPENSSL_DSA_MAX_MODULUS_BITS 10000 +# endif + +# define DSA_FLAG_CACHE_MONT_P 0x01 +/* + * new with 0.9.7h; the built-in DSA implementation now uses constant time + * modular exponentiation for secret exponents by default. This flag causes + * the faster variable sliding window method to be used for all exponents. + */ +# define DSA_FLAG_NO_EXP_CONSTTIME 0x02 + +/* + * If this flag is set the DSA method is FIPS compliant and can be used in + * FIPS mode. This is set in the validated module method. If an application + * sets this flag in its own methods it is its reposibility to ensure the + * result is compliant. + */ + +# define DSA_FLAG_FIPS_METHOD 0x0400 + +/* + * If this flag is set the operations normally disabled in FIPS mode are + * permitted it is then the applications responsibility to ensure that the + * usage is compliant. + */ + +# define DSA_FLAG_NON_FIPS_ALLOW 0x0400 + +#ifdef __cplusplus +extern "C" { +#endif + +/* Already defined in ossl_typ.h */ +/* typedef struct dsa_st DSA; */ +/* typedef struct dsa_method DSA_METHOD; */ + +typedef struct DSA_SIG_st { + BIGNUM *r; + BIGNUM *s; +} DSA_SIG; + +struct dsa_method { + const char *name; + DSA_SIG *(*dsa_do_sign) (const unsigned char *dgst, int dlen, DSA *dsa); + int (*dsa_sign_setup) (DSA *dsa, BN_CTX *ctx_in, BIGNUM **kinvp, + BIGNUM **rp); + int (*dsa_do_verify) (const unsigned char *dgst, int dgst_len, + DSA_SIG *sig, DSA *dsa); + int (*dsa_mod_exp) (DSA *dsa, BIGNUM *rr, BIGNUM *a1, BIGNUM *p1, + BIGNUM *a2, BIGNUM *p2, BIGNUM *m, BN_CTX *ctx, + BN_MONT_CTX *in_mont); + /* Can be null */ + int (*bn_mod_exp) (DSA *dsa, BIGNUM *r, BIGNUM *a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx); + int (*init) (DSA *dsa); + int (*finish) (DSA *dsa); + int flags; + char *app_data; + /* If this is non-NULL, it is used to generate DSA parameters */ + int (*dsa_paramgen) (DSA *dsa, int bits, + const unsigned char *seed, int seed_len, + int *counter_ret, unsigned long *h_ret, + BN_GENCB *cb); + /* If this is non-NULL, it is used to generate DSA keys */ + int (*dsa_keygen) (DSA *dsa); +}; + +struct dsa_st { + /* + * This first variable is used to pick up errors where a DSA is passed + * instead of of a EVP_PKEY + */ + int pad; + long version; + int write_params; + BIGNUM *p; + BIGNUM *q; /* == 20 */ + BIGNUM *g; + BIGNUM *pub_key; /* y public key */ + BIGNUM *priv_key; /* x private key */ + BIGNUM *kinv; /* Signing pre-calc */ + BIGNUM *r; /* Signing pre-calc */ + int flags; + /* Normally used to cache montgomery values */ + BN_MONT_CTX *method_mont_p; + int references; + CRYPTO_EX_DATA ex_data; + const DSA_METHOD *meth; + /* functional reference if 'meth' is ENGINE-provided */ + ENGINE *engine; +}; + +# define d2i_DSAparams_fp(fp,x) (DSA *)ASN1_d2i_fp((char *(*)())DSA_new, \ + (char *(*)())d2i_DSAparams,(fp),(unsigned char **)(x)) +# define i2d_DSAparams_fp(fp,x) ASN1_i2d_fp(i2d_DSAparams,(fp), \ + (unsigned char *)(x)) +# define d2i_DSAparams_bio(bp,x) ASN1_d2i_bio_of(DSA,DSA_new,d2i_DSAparams,bp,x) +# define i2d_DSAparams_bio(bp,x) ASN1_i2d_bio_of_const(DSA,i2d_DSAparams,bp,x) + +DSA *DSAparams_dup(DSA *x); +DSA_SIG *DSA_SIG_new(void); +void DSA_SIG_free(DSA_SIG *a); +int i2d_DSA_SIG(const DSA_SIG *a, unsigned char **pp); +DSA_SIG *d2i_DSA_SIG(DSA_SIG **v, const unsigned char **pp, long length); + +DSA_SIG *DSA_do_sign(const unsigned char *dgst, int dlen, DSA *dsa); +int DSA_do_verify(const unsigned char *dgst, int dgst_len, + DSA_SIG *sig, DSA *dsa); + +const DSA_METHOD *DSA_OpenSSL(void); + +void DSA_set_default_method(const DSA_METHOD *); +const DSA_METHOD *DSA_get_default_method(void); +int DSA_set_method(DSA *dsa, const DSA_METHOD *); + +DSA *DSA_new(void); +DSA *DSA_new_method(ENGINE *engine); +void DSA_free(DSA *r); +/* "up" the DSA object's reference count */ +int DSA_up_ref(DSA *r); +int DSA_size(const DSA *); + /* next 4 return -1 on error */ +int DSA_sign_setup(DSA *dsa, BN_CTX *ctx_in, BIGNUM **kinvp, BIGNUM **rp); +int DSA_sign(int type, const unsigned char *dgst, int dlen, + unsigned char *sig, unsigned int *siglen, DSA *dsa); +int DSA_verify(int type, const unsigned char *dgst, int dgst_len, + const unsigned char *sigbuf, int siglen, DSA *dsa); +int DSA_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); +int DSA_set_ex_data(DSA *d, int idx, void *arg); +void *DSA_get_ex_data(DSA *d, int idx); + +DSA *d2i_DSAPublicKey(DSA **a, const unsigned char **pp, long length); +DSA *d2i_DSAPrivateKey(DSA **a, const unsigned char **pp, long length); +DSA *d2i_DSAparams(DSA **a, const unsigned char **pp, long length); + +/* Deprecated version */ +# ifndef OPENSSL_NO_DEPRECATED +DSA *DSA_generate_parameters(int bits, + unsigned char *seed, int seed_len, + int *counter_ret, unsigned long *h_ret, void + (*callback) (int, int, void *), void *cb_arg); +# endif /* !defined(OPENSSL_NO_DEPRECATED) */ + +/* New version */ +int DSA_generate_parameters_ex(DSA *dsa, int bits, + const unsigned char *seed, int seed_len, + int *counter_ret, unsigned long *h_ret, + BN_GENCB *cb); + +int DSA_generate_key(DSA *a); +int i2d_DSAPublicKey(const DSA *a, unsigned char **pp); +int i2d_DSAPrivateKey(const DSA *a, unsigned char **pp); +int i2d_DSAparams(const DSA *a, unsigned char **pp); + +# ifndef OPENSSL_NO_BIO +int DSAparams_print(BIO *bp, const DSA *x); +int DSA_print(BIO *bp, const DSA *x, int off); +# endif +# ifndef OPENSSL_NO_FP_API +int DSAparams_print_fp(FILE *fp, const DSA *x); +int DSA_print_fp(FILE *bp, const DSA *x, int off); +# endif + +# define DSS_prime_checks 50 +/* + * Primality test according to FIPS PUB 186[-1], Appendix 2.1: 50 rounds of + * Rabin-Miller + */ +# define DSA_is_prime(n, callback, cb_arg) \ + BN_is_prime(n, DSS_prime_checks, callback, NULL, cb_arg) + +# ifndef OPENSSL_NO_DH +/* + * Convert DSA structure (key or just parameters) into DH structure (be + * careful to avoid small subgroup attacks when using this!) + */ +DH *DSA_dup_DH(const DSA *r); +# endif + +# define EVP_PKEY_CTX_set_dsa_paramgen_bits(ctx, nbits) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DSA, EVP_PKEY_OP_PARAMGEN, \ + EVP_PKEY_CTRL_DSA_PARAMGEN_BITS, nbits, NULL) + +# define EVP_PKEY_CTRL_DSA_PARAMGEN_BITS (EVP_PKEY_ALG_CTRL + 1) +# define EVP_PKEY_CTRL_DSA_PARAMGEN_Q_BITS (EVP_PKEY_ALG_CTRL + 2) +# define EVP_PKEY_CTRL_DSA_PARAMGEN_MD (EVP_PKEY_ALG_CTRL + 3) + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_DSA_strings(void); + +/* Error codes for the DSA functions. */ + +/* Function codes. */ +# define DSA_F_D2I_DSA_SIG 110 +# define DSA_F_DO_DSA_PRINT 104 +# define DSA_F_DSAPARAMS_PRINT 100 +# define DSA_F_DSAPARAMS_PRINT_FP 101 +# define DSA_F_DSA_BUILTIN_PARAMGEN2 126 +# define DSA_F_DSA_DO_SIGN 112 +# define DSA_F_DSA_DO_VERIFY 113 +# define DSA_F_DSA_GENERATE_KEY 124 +# define DSA_F_DSA_GENERATE_PARAMETERS_EX 123 +# define DSA_F_DSA_NEW_METHOD 103 +# define DSA_F_DSA_PARAM_DECODE 119 +# define DSA_F_DSA_PRINT_FP 105 +# define DSA_F_DSA_PRIV_DECODE 115 +# define DSA_F_DSA_PRIV_ENCODE 116 +# define DSA_F_DSA_PUB_DECODE 117 +# define DSA_F_DSA_PUB_ENCODE 118 +# define DSA_F_DSA_SIGN 106 +# define DSA_F_DSA_SIGN_SETUP 107 +# define DSA_F_DSA_SIG_NEW 109 +# define DSA_F_DSA_SIG_PRINT 125 +# define DSA_F_DSA_VERIFY 108 +# define DSA_F_I2D_DSA_SIG 111 +# define DSA_F_OLD_DSA_PRIV_DECODE 122 +# define DSA_F_PKEY_DSA_CTRL 120 +# define DSA_F_PKEY_DSA_KEYGEN 121 +# define DSA_F_SIG_CB 114 + +/* Reason codes. */ +# define DSA_R_BAD_Q_VALUE 102 +# define DSA_R_BN_DECODE_ERROR 108 +# define DSA_R_BN_ERROR 109 +# define DSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE 100 +# define DSA_R_DECODE_ERROR 104 +# define DSA_R_INVALID_DIGEST_TYPE 106 +# define DSA_R_INVALID_PARAMETERS 112 +# define DSA_R_MISSING_PARAMETERS 101 +# define DSA_R_MODULUS_TOO_LARGE 103 +# define DSA_R_NEED_NEW_SETUP_VALUES 110 +# define DSA_R_NON_FIPS_DSA_METHOD 111 +# define DSA_R_NO_PARAMETERS_SET 107 +# define DSA_R_PARAMETER_ENCODING_ERROR 105 +# define DSA_R_Q_NOT_PRIME 113 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/dso.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/dso.h new file mode 100644 index 0000000..c9013f5 --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/dso.h @@ -0,0 +1,451 @@ +/* dso.h */ +/* + * Written by Geoff Thorpe (geoff@geoffthorpe.net) for the OpenSSL project + * 2000. + */ +/* ==================================================================== + * Copyright (c) 2000 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_DSO_H +# define HEADER_DSO_H + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* These values are used as commands to DSO_ctrl() */ +# define DSO_CTRL_GET_FLAGS 1 +# define DSO_CTRL_SET_FLAGS 2 +# define DSO_CTRL_OR_FLAGS 3 + +/* + * By default, DSO_load() will translate the provided filename into a form + * typical for the platform (more specifically the DSO_METHOD) using the + * dso_name_converter function of the method. Eg. win32 will transform "blah" + * into "blah.dll", and dlfcn will transform it into "libblah.so". The + * behaviour can be overriden by setting the name_converter callback in the + * DSO object (using DSO_set_name_converter()). This callback could even + * utilise the DSO_METHOD's converter too if it only wants to override + * behaviour for one or two possible DSO methods. However, the following flag + * can be set in a DSO to prevent *any* native name-translation at all - eg. + * if the caller has prompted the user for a path to a driver library so the + * filename should be interpreted as-is. + */ +# define DSO_FLAG_NO_NAME_TRANSLATION 0x01 +/* + * An extra flag to give if only the extension should be added as + * translation. This is obviously only of importance on Unix and other + * operating systems where the translation also may prefix the name with + * something, like 'lib', and ignored everywhere else. This flag is also + * ignored if DSO_FLAG_NO_NAME_TRANSLATION is used at the same time. + */ +# define DSO_FLAG_NAME_TRANSLATION_EXT_ONLY 0x02 + +/* + * The following flag controls the translation of symbol names to upper case. + * This is currently only being implemented for OpenVMS. + */ +# define DSO_FLAG_UPCASE_SYMBOL 0x10 + +/* + * This flag loads the library with public symbols. Meaning: The exported + * symbols of this library are public to all libraries loaded after this + * library. At the moment only implemented in unix. + */ +# define DSO_FLAG_GLOBAL_SYMBOLS 0x20 + +typedef void (*DSO_FUNC_TYPE) (void); + +typedef struct dso_st DSO; + +/* + * The function prototype used for method functions (or caller-provided + * callbacks) that transform filenames. They are passed a DSO structure + * pointer (or NULL if they are to be used independantly of a DSO object) and + * a filename to transform. They should either return NULL (if there is an + * error condition) or a newly allocated string containing the transformed + * form that the caller will need to free with OPENSSL_free() when done. + */ +typedef char *(*DSO_NAME_CONVERTER_FUNC)(DSO *, const char *); +/* + * The function prototype used for method functions (or caller-provided + * callbacks) that merge two file specifications. They are passed a DSO + * structure pointer (or NULL if they are to be used independantly of a DSO + * object) and two file specifications to merge. They should either return + * NULL (if there is an error condition) or a newly allocated string + * containing the result of merging that the caller will need to free with + * OPENSSL_free() when done. Here, merging means that bits and pieces are + * taken from each of the file specifications and added together in whatever + * fashion that is sensible for the DSO method in question. The only rule + * that really applies is that if the two specification contain pieces of the + * same type, the copy from the first string takes priority. One could see + * it as the first specification is the one given by the user and the second + * being a bunch of defaults to add on if they're missing in the first. + */ +typedef char *(*DSO_MERGER_FUNC)(DSO *, const char *, const char *); + +typedef struct dso_meth_st { + const char *name; + /* + * Loads a shared library, NB: new DSO_METHODs must ensure that a + * successful load populates the loaded_filename field, and likewise a + * successful unload OPENSSL_frees and NULLs it out. + */ + int (*dso_load) (DSO *dso); + /* Unloads a shared library */ + int (*dso_unload) (DSO *dso); + /* Binds a variable */ + void *(*dso_bind_var) (DSO *dso, const char *symname); + /* + * Binds a function - assumes a return type of DSO_FUNC_TYPE. This should + * be cast to the real function prototype by the caller. Platforms that + * don't have compatible representations for different prototypes (this + * is possible within ANSI C) are highly unlikely to have shared + * libraries at all, let alone a DSO_METHOD implemented for them. + */ + DSO_FUNC_TYPE (*dso_bind_func) (DSO *dso, const char *symname); +/* I don't think this would actually be used in any circumstances. */ +# if 0 + /* Unbinds a variable */ + int (*dso_unbind_var) (DSO *dso, char *symname, void *symptr); + /* Unbinds a function */ + int (*dso_unbind_func) (DSO *dso, char *symname, DSO_FUNC_TYPE symptr); +# endif + /* + * The generic (yuck) "ctrl()" function. NB: Negative return values + * (rather than zero) indicate errors. + */ + long (*dso_ctrl) (DSO *dso, int cmd, long larg, void *parg); + /* + * The default DSO_METHOD-specific function for converting filenames to a + * canonical native form. + */ + DSO_NAME_CONVERTER_FUNC dso_name_converter; + /* + * The default DSO_METHOD-specific function for converting filenames to a + * canonical native form. + */ + DSO_MERGER_FUNC dso_merger; + /* [De]Initialisation handlers. */ + int (*init) (DSO *dso); + int (*finish) (DSO *dso); + /* Return pathname of the module containing location */ + int (*pathbyaddr) (void *addr, char *path, int sz); + /* Perform global symbol lookup, i.e. among *all* modules */ + void *(*globallookup) (const char *symname); +} DSO_METHOD; + +/**********************************************************************/ +/* The low-level handle type used to refer to a loaded shared library */ + +struct dso_st { + DSO_METHOD *meth; + /* + * Standard dlopen uses a (void *). Win32 uses a HANDLE. VMS doesn't use + * anything but will need to cache the filename for use in the dso_bind + * handler. All in all, let each method control its own destiny. + * "Handles" and such go in a STACK. + */ + STACK_OF(void) *meth_data; + int references; + int flags; + /* + * For use by applications etc ... use this for your bits'n'pieces, don't + * touch meth_data! + */ + CRYPTO_EX_DATA ex_data; + /* + * If this callback function pointer is set to non-NULL, then it will be + * used in DSO_load() in place of meth->dso_name_converter. NB: This + * should normally set using DSO_set_name_converter(). + */ + DSO_NAME_CONVERTER_FUNC name_converter; + /* + * If this callback function pointer is set to non-NULL, then it will be + * used in DSO_load() in place of meth->dso_merger. NB: This should + * normally set using DSO_set_merger(). + */ + DSO_MERGER_FUNC merger; + /* + * This is populated with (a copy of) the platform-independant filename + * used for this DSO. + */ + char *filename; + /* + * This is populated with (a copy of) the translated filename by which + * the DSO was actually loaded. It is NULL iff the DSO is not currently + * loaded. NB: This is here because the filename translation process may + * involve a callback being invoked more than once not only to convert to + * a platform-specific form, but also to try different filenames in the + * process of trying to perform a load. As such, this variable can be + * used to indicate (a) whether this DSO structure corresponds to a + * loaded library or not, and (b) the filename with which it was actually + * loaded. + */ + char *loaded_filename; +}; + +DSO *DSO_new(void); +DSO *DSO_new_method(DSO_METHOD *method); +int DSO_free(DSO *dso); +int DSO_flags(DSO *dso); +int DSO_up_ref(DSO *dso); +long DSO_ctrl(DSO *dso, int cmd, long larg, void *parg); + +/* + * This function sets the DSO's name_converter callback. If it is non-NULL, + * then it will be used instead of the associated DSO_METHOD's function. If + * oldcb is non-NULL then it is set to the function pointer value being + * replaced. Return value is non-zero for success. + */ +int DSO_set_name_converter(DSO *dso, DSO_NAME_CONVERTER_FUNC cb, + DSO_NAME_CONVERTER_FUNC *oldcb); +/* + * These functions can be used to get/set the platform-independant filename + * used for a DSO. NB: set will fail if the DSO is already loaded. + */ +const char *DSO_get_filename(DSO *dso); +int DSO_set_filename(DSO *dso, const char *filename); +/* + * This function will invoke the DSO's name_converter callback to translate a + * filename, or if the callback isn't set it will instead use the DSO_METHOD's + * converter. If "filename" is NULL, the "filename" in the DSO itself will be + * used. If the DSO_FLAG_NO_NAME_TRANSLATION flag is set, then the filename is + * simply duplicated. NB: This function is usually called from within a + * DSO_METHOD during the processing of a DSO_load() call, and is exposed so + * that caller-created DSO_METHODs can do the same thing. A non-NULL return + * value will need to be OPENSSL_free()'d. + */ +char *DSO_convert_filename(DSO *dso, const char *filename); +/* + * This function will invoke the DSO's merger callback to merge two file + * specifications, or if the callback isn't set it will instead use the + * DSO_METHOD's merger. A non-NULL return value will need to be + * OPENSSL_free()'d. + */ +char *DSO_merge(DSO *dso, const char *filespec1, const char *filespec2); +/* + * If the DSO is currently loaded, this returns the filename that it was + * loaded under, otherwise it returns NULL. So it is also useful as a test as + * to whether the DSO is currently loaded. NB: This will not necessarily + * return the same value as DSO_convert_filename(dso, dso->filename), because + * the DSO_METHOD's load function may have tried a variety of filenames (with + * and/or without the aid of the converters) before settling on the one it + * actually loaded. + */ +const char *DSO_get_loaded_filename(DSO *dso); + +void DSO_set_default_method(DSO_METHOD *meth); +DSO_METHOD *DSO_get_default_method(void); +DSO_METHOD *DSO_get_method(DSO *dso); +DSO_METHOD *DSO_set_method(DSO *dso, DSO_METHOD *meth); + +/* + * The all-singing all-dancing load function, you normally pass NULL for the + * first and third parameters. Use DSO_up and DSO_free for subsequent + * reference count handling. Any flags passed in will be set in the + * constructed DSO after its init() function but before the load operation. + * If 'dso' is non-NULL, 'flags' is ignored. + */ +DSO *DSO_load(DSO *dso, const char *filename, DSO_METHOD *meth, int flags); + +/* This function binds to a variable inside a shared library. */ +void *DSO_bind_var(DSO *dso, const char *symname); + +/* This function binds to a function inside a shared library. */ +DSO_FUNC_TYPE DSO_bind_func(DSO *dso, const char *symname); + +/* + * This method is the default, but will beg, borrow, or steal whatever method + * should be the default on any particular platform (including + * DSO_METH_null() if necessary). + */ +DSO_METHOD *DSO_METHOD_openssl(void); + +/* + * This method is defined for all platforms - if a platform has no DSO + * support then this will be the only method! + */ +DSO_METHOD *DSO_METHOD_null(void); + +/* + * If DSO_DLFCN is defined, the standard dlfcn.h-style functions (dlopen, + * dlclose, dlsym, etc) will be used and incorporated into this method. If + * not, this method will return NULL. + */ +DSO_METHOD *DSO_METHOD_dlfcn(void); + +/* + * If DSO_DL is defined, the standard dl.h-style functions (shl_load, + * shl_unload, shl_findsym, etc) will be used and incorporated into this + * method. If not, this method will return NULL. + */ +DSO_METHOD *DSO_METHOD_dl(void); + +/* If WIN32 is defined, use DLLs. If not, return NULL. */ +DSO_METHOD *DSO_METHOD_win32(void); + +/* If VMS is defined, use shared images. If not, return NULL. */ +DSO_METHOD *DSO_METHOD_vms(void); + +/* + * This function writes null-terminated pathname of DSO module containing + * 'addr' into 'sz' large caller-provided 'path' and returns the number of + * characters [including trailing zero] written to it. If 'sz' is 0 or + * negative, 'path' is ignored and required amount of charachers [including + * trailing zero] to accomodate pathname is returned. If 'addr' is NULL, then + * pathname of cryptolib itself is returned. Negative or zero return value + * denotes error. + */ +int DSO_pathbyaddr(void *addr, char *path, int sz); + +/* + * This function should be used with caution! It looks up symbols in *all* + * loaded modules and if module gets unloaded by somebody else attempt to + * dereference the pointer is doomed to have fatal consequences. Primary + * usage for this function is to probe *core* system functionality, e.g. + * check if getnameinfo(3) is available at run-time without bothering about + * OS-specific details such as libc.so.versioning or where does it actually + * reside: in libc itself or libsocket. + */ +void *DSO_global_lookup(const char *name); + +/* If BeOS is defined, use shared images. If not, return NULL. */ +DSO_METHOD *DSO_METHOD_beos(void); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_DSO_strings(void); + +/* Error codes for the DSO functions. */ + +/* Function codes. */ +# define DSO_F_BEOS_BIND_FUNC 144 +# define DSO_F_BEOS_BIND_VAR 145 +# define DSO_F_BEOS_LOAD 146 +# define DSO_F_BEOS_NAME_CONVERTER 147 +# define DSO_F_BEOS_UNLOAD 148 +# define DSO_F_DLFCN_BIND_FUNC 100 +# define DSO_F_DLFCN_BIND_VAR 101 +# define DSO_F_DLFCN_LOAD 102 +# define DSO_F_DLFCN_MERGER 130 +# define DSO_F_DLFCN_NAME_CONVERTER 123 +# define DSO_F_DLFCN_UNLOAD 103 +# define DSO_F_DL_BIND_FUNC 104 +# define DSO_F_DL_BIND_VAR 105 +# define DSO_F_DL_LOAD 106 +# define DSO_F_DL_MERGER 131 +# define DSO_F_DL_NAME_CONVERTER 124 +# define DSO_F_DL_UNLOAD 107 +# define DSO_F_DSO_BIND_FUNC 108 +# define DSO_F_DSO_BIND_VAR 109 +# define DSO_F_DSO_CONVERT_FILENAME 126 +# define DSO_F_DSO_CTRL 110 +# define DSO_F_DSO_FREE 111 +# define DSO_F_DSO_GET_FILENAME 127 +# define DSO_F_DSO_GET_LOADED_FILENAME 128 +# define DSO_F_DSO_GLOBAL_LOOKUP 139 +# define DSO_F_DSO_LOAD 112 +# define DSO_F_DSO_MERGE 132 +# define DSO_F_DSO_NEW_METHOD 113 +# define DSO_F_DSO_PATHBYADDR 140 +# define DSO_F_DSO_SET_FILENAME 129 +# define DSO_F_DSO_SET_NAME_CONVERTER 122 +# define DSO_F_DSO_UP_REF 114 +# define DSO_F_GLOBAL_LOOKUP_FUNC 138 +# define DSO_F_PATHBYADDR 137 +# define DSO_F_VMS_BIND_SYM 115 +# define DSO_F_VMS_LOAD 116 +# define DSO_F_VMS_MERGER 133 +# define DSO_F_VMS_UNLOAD 117 +# define DSO_F_WIN32_BIND_FUNC 118 +# define DSO_F_WIN32_BIND_VAR 119 +# define DSO_F_WIN32_GLOBALLOOKUP 142 +# define DSO_F_WIN32_GLOBALLOOKUP_FUNC 143 +# define DSO_F_WIN32_JOINER 135 +# define DSO_F_WIN32_LOAD 120 +# define DSO_F_WIN32_MERGER 134 +# define DSO_F_WIN32_NAME_CONVERTER 125 +# define DSO_F_WIN32_PATHBYADDR 141 +# define DSO_F_WIN32_SPLITTER 136 +# define DSO_F_WIN32_UNLOAD 121 + +/* Reason codes. */ +# define DSO_R_CTRL_FAILED 100 +# define DSO_R_DSO_ALREADY_LOADED 110 +# define DSO_R_EMPTY_FILE_STRUCTURE 113 +# define DSO_R_FAILURE 114 +# define DSO_R_FILENAME_TOO_BIG 101 +# define DSO_R_FINISH_FAILED 102 +# define DSO_R_INCORRECT_FILE_SYNTAX 115 +# define DSO_R_LOAD_FAILED 103 +# define DSO_R_NAME_TRANSLATION_FAILED 109 +# define DSO_R_NO_FILENAME 111 +# define DSO_R_NO_FILE_SPECIFICATION 116 +# define DSO_R_NULL_HANDLE 104 +# define DSO_R_SET_FILENAME_FAILED 112 +# define DSO_R_STACK_ERROR 105 +# define DSO_R_SYM_FAILURE 106 +# define DSO_R_UNLOAD_FAILED 107 +# define DSO_R_UNSUPPORTED 108 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/dtls1.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/dtls1.h new file mode 100644 index 0000000..30bbcf2 --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/dtls1.h @@ -0,0 +1,272 @@ +/* ssl/dtls1.h */ +/* + * DTLS implementation written by Nagendra Modadugu + * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. + */ +/* ==================================================================== + * Copyright (c) 1999-2005 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_DTLS1_H +# define HEADER_DTLS1_H + +# include +# include +# ifdef OPENSSL_SYS_VMS +# include +# include +# endif +# ifdef OPENSSL_SYS_WIN32 +/* Needed for struct timeval */ +# include +# elif defined(OPENSSL_SYS_NETWARE) && !defined(_WINSOCK2API_) +# include +# else +# if defined(OPENSSL_SYS_VXWORKS) +# include +# else +# include +# endif +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +# define DTLS1_VERSION 0xFEFF +# define DTLS1_2_VERSION 0xFEFD +# define DTLS_MAX_VERSION DTLS1_2_VERSION +# define DTLS1_VERSION_MAJOR 0xFE + +# define DTLS1_BAD_VER 0x0100 + +/* Special value for method supporting multiple versions */ +# define DTLS_ANY_VERSION 0x1FFFF + +# if 0 +/* this alert description is not specified anywhere... */ +# define DTLS1_AD_MISSING_HANDSHAKE_MESSAGE 110 +# endif + +/* lengths of messages */ +# define DTLS1_COOKIE_LENGTH 256 + +# define DTLS1_RT_HEADER_LENGTH 13 + +# define DTLS1_HM_HEADER_LENGTH 12 + +# define DTLS1_HM_BAD_FRAGMENT -2 +# define DTLS1_HM_FRAGMENT_RETRY -3 + +# define DTLS1_CCS_HEADER_LENGTH 1 + +# ifdef DTLS1_AD_MISSING_HANDSHAKE_MESSAGE +# define DTLS1_AL_HEADER_LENGTH 7 +# else +# define DTLS1_AL_HEADER_LENGTH 2 +# endif + +# ifndef OPENSSL_NO_SSL_INTERN + +# ifndef OPENSSL_NO_SCTP +# define DTLS1_SCTP_AUTH_LABEL "EXPORTER_DTLS_OVER_SCTP" +# endif + +/* Max MTU overhead we know about so far is 40 for IPv6 + 8 for UDP */ +# define DTLS1_MAX_MTU_OVERHEAD 48 + +typedef struct dtls1_bitmap_st { + unsigned long map; /* track 32 packets on 32-bit systems and 64 + * - on 64-bit systems */ + unsigned char max_seq_num[8]; /* max record number seen so far, 64-bit + * value in big-endian encoding */ +} DTLS1_BITMAP; + +struct dtls1_retransmit_state { + EVP_CIPHER_CTX *enc_write_ctx; /* cryptographic state */ + EVP_MD_CTX *write_hash; /* used for mac generation */ +# ifndef OPENSSL_NO_COMP + COMP_CTX *compress; /* compression */ +# else + char *compress; +# endif + SSL_SESSION *session; + unsigned short epoch; +}; + +struct hm_header_st { + unsigned char type; + unsigned long msg_len; + unsigned short seq; + unsigned long frag_off; + unsigned long frag_len; + unsigned int is_ccs; + struct dtls1_retransmit_state saved_retransmit_state; +}; + +struct ccs_header_st { + unsigned char type; + unsigned short seq; +}; + +struct dtls1_timeout_st { + /* Number of read timeouts so far */ + unsigned int read_timeouts; + /* Number of write timeouts so far */ + unsigned int write_timeouts; + /* Number of alerts received so far */ + unsigned int num_alerts; +}; + +typedef struct record_pqueue_st { + unsigned short epoch; + pqueue q; +} record_pqueue; + +typedef struct hm_fragment_st { + struct hm_header_st msg_header; + unsigned char *fragment; + unsigned char *reassembly; +} hm_fragment; + +typedef struct dtls1_state_st { + unsigned int send_cookie; + unsigned char cookie[DTLS1_COOKIE_LENGTH]; + unsigned char rcvd_cookie[DTLS1_COOKIE_LENGTH]; + unsigned int cookie_len; + /* + * The current data and handshake epoch. This is initially + * undefined, and starts at zero once the initial handshake is + * completed + */ + unsigned short r_epoch; + unsigned short w_epoch; + /* records being received in the current epoch */ + DTLS1_BITMAP bitmap; + /* renegotiation starts a new set of sequence numbers */ + DTLS1_BITMAP next_bitmap; + /* handshake message numbers */ + unsigned short handshake_write_seq; + unsigned short next_handshake_write_seq; + unsigned short handshake_read_seq; + /* save last sequence number for retransmissions */ + unsigned char last_write_sequence[8]; + /* Received handshake records (processed and unprocessed) */ + record_pqueue unprocessed_rcds; + record_pqueue processed_rcds; + /* Buffered handshake messages */ + pqueue buffered_messages; + /* Buffered (sent) handshake records */ + pqueue sent_messages; + /* + * Buffered application records. Only for records between CCS and + * Finished to prevent either protocol violation or unnecessary message + * loss. + */ + record_pqueue buffered_app_data; + /* Is set when listening for new connections with dtls1_listen() */ + unsigned int listen; + unsigned int link_mtu; /* max on-the-wire DTLS packet size */ + unsigned int mtu; /* max DTLS packet size */ + struct hm_header_st w_msg_hdr; + struct hm_header_st r_msg_hdr; + struct dtls1_timeout_st timeout; + /* + * Indicates when the last handshake msg or heartbeat sent will timeout + */ + struct timeval next_timeout; + /* Timeout duration */ + unsigned short timeout_duration; + /* + * storage for Alert/Handshake protocol data received but not yet + * processed by ssl3_read_bytes: + */ + unsigned char alert_fragment[DTLS1_AL_HEADER_LENGTH]; + unsigned int alert_fragment_len; + unsigned char handshake_fragment[DTLS1_HM_HEADER_LENGTH]; + unsigned int handshake_fragment_len; + unsigned int retransmitting; + /* + * Set when the handshake is ready to process peer's ChangeCipherSpec message. + * Cleared after the message has been processed. + */ + unsigned int change_cipher_spec_ok; +# ifndef OPENSSL_NO_SCTP + /* used when SSL_ST_XX_FLUSH is entered */ + int next_state; + int shutdown_received; +# endif +} DTLS1_STATE; + +typedef struct dtls1_record_data_st { + unsigned char *packet; + unsigned int packet_length; + SSL3_BUFFER rbuf; + SSL3_RECORD rrec; +# ifndef OPENSSL_NO_SCTP + struct bio_dgram_sctp_rcvinfo recordinfo; +# endif +} DTLS1_RECORD_DATA; + +# endif + +/* Timeout multipliers (timeout slice is defined in apps/timeouts.h */ +# define DTLS1_TMO_READ_COUNT 2 +# define DTLS1_TMO_WRITE_COUNT 2 + +# define DTLS1_TMO_ALERT_COUNT 12 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/e_os2.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/e_os2.h new file mode 100644 index 0000000..7be9989 --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/e_os2.h @@ -0,0 +1,328 @@ +/* e_os2.h */ +/* ==================================================================== + * Copyright (c) 1998-2000 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#include + +#ifndef HEADER_E_OS2_H +# define HEADER_E_OS2_H + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************************************************** + * Detect operating systems. This probably needs completing. + * The result is that at least one OPENSSL_SYS_os macro should be defined. + * However, if none is defined, Unix is assumed. + **/ + +# define OPENSSL_SYS_UNIX + +/* ---------------------- Macintosh, before MacOS X ----------------------- */ +# if defined(__MWERKS__) && defined(macintosh) || defined(OPENSSL_SYSNAME_MAC) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_MACINTOSH_CLASSIC +# endif + +/* ---------------------- NetWare ----------------------------------------- */ +# if defined(NETWARE) || defined(OPENSSL_SYSNAME_NETWARE) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_NETWARE +# endif + +/* --------------------- Microsoft operating systems ---------------------- */ + +/* + * Note that MSDOS actually denotes 32-bit environments running on top of + * MS-DOS, such as DJGPP one. + */ +# if defined(OPENSSL_SYSNAME_MSDOS) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_MSDOS +# endif + +/* + * For 32 bit environment, there seems to be the CygWin environment and then + * all the others that try to do the same thing Microsoft does... + */ +# if defined(OPENSSL_SYSNAME_UWIN) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_WIN32_UWIN +# else +# if defined(__CYGWIN__) || defined(OPENSSL_SYSNAME_CYGWIN) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_WIN32_CYGWIN +# else +# if defined(_WIN32) || defined(OPENSSL_SYSNAME_WIN32) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_WIN32 +# endif +# if defined(_WIN64) || defined(OPENSSL_SYSNAME_WIN64) +# undef OPENSSL_SYS_UNIX +# if !defined(OPENSSL_SYS_WIN64) +# define OPENSSL_SYS_WIN64 +# endif +# endif +# if defined(OPENSSL_SYSNAME_WINNT) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_WINNT +# endif +# if defined(OPENSSL_SYSNAME_WINCE) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_WINCE +# endif +# endif +# endif + +/* Anything that tries to look like Microsoft is "Windows" */ +# if defined(OPENSSL_SYS_WIN32) || defined(OPENSSL_SYS_WIN64) || defined(OPENSSL_SYS_WINNT) || defined(OPENSSL_SYS_WINCE) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_WINDOWS +# ifndef OPENSSL_SYS_MSDOS +# define OPENSSL_SYS_MSDOS +# endif +# endif + +/* + * DLL settings. This part is a bit tough, because it's up to the + * application implementor how he or she will link the application, so it + * requires some macro to be used. + */ +# ifdef OPENSSL_SYS_WINDOWS +# ifndef OPENSSL_OPT_WINDLL +# if defined(_WINDLL) /* This is used when building OpenSSL to + * indicate that DLL linkage should be used */ +# define OPENSSL_OPT_WINDLL +# endif +# endif +# endif + +/* ------------------------------- OpenVMS -------------------------------- */ +# if defined(__VMS) || defined(VMS) || defined(OPENSSL_SYSNAME_VMS) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_VMS +# if defined(__DECC) +# define OPENSSL_SYS_VMS_DECC +# elif defined(__DECCXX) +# define OPENSSL_SYS_VMS_DECC +# define OPENSSL_SYS_VMS_DECCXX +# else +# define OPENSSL_SYS_VMS_NODECC +# endif +# endif + +/* -------------------------------- OS/2 ---------------------------------- */ +# if defined(__EMX__) || defined(__OS2__) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_OS2 +# endif + +/* -------------------------------- Unix ---------------------------------- */ +# ifdef OPENSSL_SYS_UNIX +# if defined(linux) || defined(__linux__) || defined(OPENSSL_SYSNAME_LINUX) +# define OPENSSL_SYS_LINUX +# endif +# ifdef OPENSSL_SYSNAME_MPE +# define OPENSSL_SYS_MPE +# endif +# ifdef OPENSSL_SYSNAME_SNI +# define OPENSSL_SYS_SNI +# endif +# ifdef OPENSSL_SYSNAME_ULTRASPARC +# define OPENSSL_SYS_ULTRASPARC +# endif +# ifdef OPENSSL_SYSNAME_NEWS4 +# define OPENSSL_SYS_NEWS4 +# endif +# ifdef OPENSSL_SYSNAME_MACOSX +# define OPENSSL_SYS_MACOSX +# endif +# ifdef OPENSSL_SYSNAME_MACOSX_RHAPSODY +# define OPENSSL_SYS_MACOSX_RHAPSODY +# define OPENSSL_SYS_MACOSX +# endif +# ifdef OPENSSL_SYSNAME_SUNOS +# define OPENSSL_SYS_SUNOS +# endif +# if defined(_CRAY) || defined(OPENSSL_SYSNAME_CRAY) +# define OPENSSL_SYS_CRAY +# endif +# if defined(_AIX) || defined(OPENSSL_SYSNAME_AIX) +# define OPENSSL_SYS_AIX +# endif +# endif + +/* -------------------------------- VOS ----------------------------------- */ +# if defined(__VOS__) || defined(OPENSSL_SYSNAME_VOS) +# define OPENSSL_SYS_VOS +# ifdef __HPPA__ +# define OPENSSL_SYS_VOS_HPPA +# endif +# ifdef __IA32__ +# define OPENSSL_SYS_VOS_IA32 +# endif +# endif + +/* ------------------------------ VxWorks --------------------------------- */ +# ifdef OPENSSL_SYSNAME_VXWORKS +# define OPENSSL_SYS_VXWORKS +# endif + +/* -------------------------------- BeOS ---------------------------------- */ +# if defined(__BEOS__) +# define OPENSSL_SYS_BEOS +# include +# if defined(BONE_VERSION) +# define OPENSSL_SYS_BEOS_BONE +# else +# define OPENSSL_SYS_BEOS_R5 +# endif +# endif + +/** + * That's it for OS-specific stuff + *****************************************************************************/ + +/* Specials for I/O an exit */ +# ifdef OPENSSL_SYS_MSDOS +# define OPENSSL_UNISTD_IO +# define OPENSSL_DECLARE_EXIT extern void exit(int); +# else +# define OPENSSL_UNISTD_IO OPENSSL_UNISTD +# define OPENSSL_DECLARE_EXIT /* declared in unistd.h */ +# endif + +/*- + * Definitions of OPENSSL_GLOBAL and OPENSSL_EXTERN, to define and declare + * certain global symbols that, with some compilers under VMS, have to be + * defined and declared explicitely with globaldef and globalref. + * Definitions of OPENSSL_EXPORT and OPENSSL_IMPORT, to define and declare + * DLL exports and imports for compilers under Win32. These are a little + * more complicated to use. Basically, for any library that exports some + * global variables, the following code must be present in the header file + * that declares them, before OPENSSL_EXTERN is used: + * + * #ifdef SOME_BUILD_FLAG_MACRO + * # undef OPENSSL_EXTERN + * # define OPENSSL_EXTERN OPENSSL_EXPORT + * #endif + * + * The default is to have OPENSSL_EXPORT, OPENSSL_IMPORT and OPENSSL_GLOBAL + * have some generally sensible values, and for OPENSSL_EXTERN to have the + * value OPENSSL_IMPORT. + */ + +# if defined(OPENSSL_SYS_VMS_NODECC) +# define OPENSSL_EXPORT globalref +# define OPENSSL_IMPORT globalref +# define OPENSSL_GLOBAL globaldef +# elif defined(OPENSSL_SYS_WINDOWS) && defined(OPENSSL_OPT_WINDLL) +# define OPENSSL_EXPORT extern __declspec(dllexport) +# define OPENSSL_IMPORT extern __declspec(dllimport) +# define OPENSSL_GLOBAL +# else +# define OPENSSL_EXPORT extern +# define OPENSSL_IMPORT extern +# define OPENSSL_GLOBAL +# endif +# define OPENSSL_EXTERN OPENSSL_IMPORT + +/*- + * Macros to allow global variables to be reached through function calls when + * required (if a shared library version requires it, for example. + * The way it's done allows definitions like this: + * + * // in foobar.c + * OPENSSL_IMPLEMENT_GLOBAL(int,foobar,0) + * // in foobar.h + * OPENSSL_DECLARE_GLOBAL(int,foobar); + * #define foobar OPENSSL_GLOBAL_REF(foobar) + */ +# ifdef OPENSSL_EXPORT_VAR_AS_FUNCTION +# define OPENSSL_IMPLEMENT_GLOBAL(type,name,value) \ + type *_shadow_##name(void) \ + { static type _hide_##name=value; return &_hide_##name; } +# define OPENSSL_DECLARE_GLOBAL(type,name) type *_shadow_##name(void) +# define OPENSSL_GLOBAL_REF(name) (*(_shadow_##name())) +# else +# define OPENSSL_IMPLEMENT_GLOBAL(type,name,value) OPENSSL_GLOBAL type _shadow_##name=value; +# define OPENSSL_DECLARE_GLOBAL(type,name) OPENSSL_EXPORT type _shadow_##name +# define OPENSSL_GLOBAL_REF(name) _shadow_##name +# endif + +# if defined(OPENSSL_SYS_MACINTOSH_CLASSIC) && macintosh==1 && !defined(MAC_OS_GUSI_SOURCE) +# define ossl_ssize_t long +# endif + +# ifdef OPENSSL_SYS_MSDOS +# define ossl_ssize_t long +# endif + +# if defined(NeXT) || defined(OPENSSL_SYS_NEWS4) || defined(OPENSSL_SYS_SUNOS) +# define ssize_t int +# endif + +# if defined(__ultrix) && !defined(ssize_t) +# define ossl_ssize_t int +# endif + +# ifndef ossl_ssize_t +# define ossl_ssize_t ssize_t +# endif + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/ebcdic.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/ebcdic.h new file mode 100644 index 0000000..4cbdfeb --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/ebcdic.h @@ -0,0 +1,26 @@ +/* crypto/ebcdic.h */ + +#ifndef HEADER_EBCDIC_H +# define HEADER_EBCDIC_H + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Avoid name clashes with other applications */ +# define os_toascii _openssl_os_toascii +# define os_toebcdic _openssl_os_toebcdic +# define ebcdic2ascii _openssl_ebcdic2ascii +# define ascii2ebcdic _openssl_ascii2ebcdic + +extern const unsigned char os_toascii[256]; +extern const unsigned char os_toebcdic[256]; +void *ebcdic2ascii(void *dest, const void *srce, size_t count); +void *ascii2ebcdic(void *dest, const void *srce, size_t count); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/ec.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/ec.h new file mode 100644 index 0000000..81e6faf --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/ec.h @@ -0,0 +1,1282 @@ +/* crypto/ec/ec.h */ +/* + * Originally written by Bodo Moeller for the OpenSSL project. + */ +/** + * \file crypto/ec/ec.h Include file for the OpenSSL EC functions + * \author Originally written by Bodo Moeller for the OpenSSL project + */ +/* ==================================================================== + * Copyright (c) 1998-2005 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * + * Portions of the attached software ("Contribution") are developed by + * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project. + * + * The Contribution is licensed pursuant to the OpenSSL open source + * license provided above. + * + * The elliptic curve binary polynomial software is originally written by + * Sheueling Chang Shantz and Douglas Stebila of Sun Microsystems Laboratories. + * + */ + +#ifndef HEADER_EC_H +# define HEADER_EC_H + +# include + +# ifdef OPENSSL_NO_EC +# error EC is disabled. +# endif + +# include +# include +# ifndef OPENSSL_NO_DEPRECATED +# include +# endif + +# ifdef __cplusplus +extern "C" { +# elif defined(__SUNPRO_C) +# if __SUNPRO_C >= 0x520 +# pragma error_messages (off,E_ARRAY_OF_INCOMPLETE_NONAME,E_ARRAY_OF_INCOMPLETE) +# endif +# endif + +# ifndef OPENSSL_ECC_MAX_FIELD_BITS +# define OPENSSL_ECC_MAX_FIELD_BITS 661 +# endif + +/** Enum for the point conversion form as defined in X9.62 (ECDSA) + * for the encoding of a elliptic curve point (x,y) */ +typedef enum { + /** the point is encoded as z||x, where the octet z specifies + * which solution of the quadratic equation y is */ + POINT_CONVERSION_COMPRESSED = 2, + /** the point is encoded as z||x||y, where z is the octet 0x04 */ + POINT_CONVERSION_UNCOMPRESSED = 4, + /** the point is encoded as z||x||y, where the octet z specifies + * which solution of the quadratic equation y is */ + POINT_CONVERSION_HYBRID = 6 +} point_conversion_form_t; + +typedef struct ec_method_st EC_METHOD; + +typedef struct ec_group_st + /*- + EC_METHOD *meth; + -- field definition + -- curve coefficients + -- optional generator with associated information (order, cofactor) + -- optional extra data (precomputed table for fast computation of multiples of generator) + -- ASN1 stuff + */ + EC_GROUP; + +typedef struct ec_point_st EC_POINT; + +/********************************************************************/ +/* EC_METHODs for curves over GF(p) */ +/********************************************************************/ + +/** Returns the basic GFp ec methods which provides the basis for the + * optimized methods. + * \return EC_METHOD object + */ +const EC_METHOD *EC_GFp_simple_method(void); + +/** Returns GFp methods using montgomery multiplication. + * \return EC_METHOD object + */ +const EC_METHOD *EC_GFp_mont_method(void); + +/** Returns GFp methods using optimized methods for NIST recommended curves + * \return EC_METHOD object + */ +const EC_METHOD *EC_GFp_nist_method(void); + +# ifndef OPENSSL_NO_EC_NISTP_64_GCC_128 +/** Returns 64-bit optimized methods for nistp224 + * \return EC_METHOD object + */ +const EC_METHOD *EC_GFp_nistp224_method(void); + +/** Returns 64-bit optimized methods for nistp256 + * \return EC_METHOD object + */ +const EC_METHOD *EC_GFp_nistp256_method(void); + +/** Returns 64-bit optimized methods for nistp521 + * \return EC_METHOD object + */ +const EC_METHOD *EC_GFp_nistp521_method(void); +# endif + +# ifndef OPENSSL_NO_EC2M +/********************************************************************/ +/* EC_METHOD for curves over GF(2^m) */ +/********************************************************************/ + +/** Returns the basic GF2m ec method + * \return EC_METHOD object + */ +const EC_METHOD *EC_GF2m_simple_method(void); + +# endif + +/********************************************************************/ +/* EC_GROUP functions */ +/********************************************************************/ + +/** Creates a new EC_GROUP object + * \param meth EC_METHOD to use + * \return newly created EC_GROUP object or NULL in case of an error. + */ +EC_GROUP *EC_GROUP_new(const EC_METHOD *meth); + +/** Frees a EC_GROUP object + * \param group EC_GROUP object to be freed. + */ +void EC_GROUP_free(EC_GROUP *group); + +/** Clears and frees a EC_GROUP object + * \param group EC_GROUP object to be cleared and freed. + */ +void EC_GROUP_clear_free(EC_GROUP *group); + +/** Copies EC_GROUP objects. Note: both EC_GROUPs must use the same EC_METHOD. + * \param dst destination EC_GROUP object + * \param src source EC_GROUP object + * \return 1 on success and 0 if an error occurred. + */ +int EC_GROUP_copy(EC_GROUP *dst, const EC_GROUP *src); + +/** Creates a new EC_GROUP object and copies the copies the content + * form src to the newly created EC_KEY object + * \param src source EC_GROUP object + * \return newly created EC_GROUP object or NULL in case of an error. + */ +EC_GROUP *EC_GROUP_dup(const EC_GROUP *src); + +/** Returns the EC_METHOD of the EC_GROUP object. + * \param group EC_GROUP object + * \return EC_METHOD used in this EC_GROUP object. + */ +const EC_METHOD *EC_GROUP_method_of(const EC_GROUP *group); + +/** Returns the field type of the EC_METHOD. + * \param meth EC_METHOD object + * \return NID of the underlying field type OID. + */ +int EC_METHOD_get_field_type(const EC_METHOD *meth); + +/** Sets the generator and it's order/cofactor of a EC_GROUP object. + * \param group EC_GROUP object + * \param generator EC_POINT object with the generator. + * \param order the order of the group generated by the generator. + * \param cofactor the index of the sub-group generated by the generator + * in the group of all points on the elliptic curve. + * \return 1 on success and 0 if an error occured + */ +int EC_GROUP_set_generator(EC_GROUP *group, const EC_POINT *generator, + const BIGNUM *order, const BIGNUM *cofactor); + +/** Returns the generator of a EC_GROUP object. + * \param group EC_GROUP object + * \return the currently used generator (possibly NULL). + */ +const EC_POINT *EC_GROUP_get0_generator(const EC_GROUP *group); + +/** Returns the montgomery data for order(Generator) + * \param group EC_GROUP object + * \return the currently used generator (possibly NULL). +*/ +BN_MONT_CTX *EC_GROUP_get_mont_data(const EC_GROUP *group); + +/** Gets the order of a EC_GROUP + * \param group EC_GROUP object + * \param order BIGNUM to which the order is copied + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_GROUP_get_order(const EC_GROUP *group, BIGNUM *order, BN_CTX *ctx); + +/** Gets the cofactor of a EC_GROUP + * \param group EC_GROUP object + * \param cofactor BIGNUM to which the cofactor is copied + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_GROUP_get_cofactor(const EC_GROUP *group, BIGNUM *cofactor, + BN_CTX *ctx); + +/** Sets the name of a EC_GROUP object + * \param group EC_GROUP object + * \param nid NID of the curve name OID + */ +void EC_GROUP_set_curve_name(EC_GROUP *group, int nid); + +/** Returns the curve name of a EC_GROUP object + * \param group EC_GROUP object + * \return NID of the curve name OID or 0 if not set. + */ +int EC_GROUP_get_curve_name(const EC_GROUP *group); + +void EC_GROUP_set_asn1_flag(EC_GROUP *group, int flag); +int EC_GROUP_get_asn1_flag(const EC_GROUP *group); + +void EC_GROUP_set_point_conversion_form(EC_GROUP *group, + point_conversion_form_t form); +point_conversion_form_t EC_GROUP_get_point_conversion_form(const EC_GROUP *); + +unsigned char *EC_GROUP_get0_seed(const EC_GROUP *x); +size_t EC_GROUP_get_seed_len(const EC_GROUP *); +size_t EC_GROUP_set_seed(EC_GROUP *, const unsigned char *, size_t len); + +/** Sets the parameter of a ec over GFp defined by y^2 = x^3 + a*x + b + * \param group EC_GROUP object + * \param p BIGNUM with the prime number + * \param a BIGNUM with parameter a of the equation + * \param b BIGNUM with parameter b of the equation + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_GROUP_set_curve_GFp(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a, + const BIGNUM *b, BN_CTX *ctx); + +/** Gets the parameter of the ec over GFp defined by y^2 = x^3 + a*x + b + * \param group EC_GROUP object + * \param p BIGNUM for the prime number + * \param a BIGNUM for parameter a of the equation + * \param b BIGNUM for parameter b of the equation + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_GROUP_get_curve_GFp(const EC_GROUP *group, BIGNUM *p, BIGNUM *a, + BIGNUM *b, BN_CTX *ctx); + +# ifndef OPENSSL_NO_EC2M +/** Sets the parameter of a ec over GF2m defined by y^2 + x*y = x^3 + a*x^2 + b + * \param group EC_GROUP object + * \param p BIGNUM with the polynomial defining the underlying field + * \param a BIGNUM with parameter a of the equation + * \param b BIGNUM with parameter b of the equation + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_GROUP_set_curve_GF2m(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a, + const BIGNUM *b, BN_CTX *ctx); + +/** Gets the parameter of the ec over GF2m defined by y^2 + x*y = x^3 + a*x^2 + b + * \param group EC_GROUP object + * \param p BIGNUM for the polynomial defining the underlying field + * \param a BIGNUM for parameter a of the equation + * \param b BIGNUM for parameter b of the equation + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_GROUP_get_curve_GF2m(const EC_GROUP *group, BIGNUM *p, BIGNUM *a, + BIGNUM *b, BN_CTX *ctx); +# endif +/** Returns the number of bits needed to represent a field element + * \param group EC_GROUP object + * \return number of bits needed to represent a field element + */ +int EC_GROUP_get_degree(const EC_GROUP *group); + +/** Checks whether the parameter in the EC_GROUP define a valid ec group + * \param group EC_GROUP object + * \param ctx BN_CTX object (optional) + * \return 1 if group is a valid ec group and 0 otherwise + */ +int EC_GROUP_check(const EC_GROUP *group, BN_CTX *ctx); + +/** Checks whether the discriminant of the elliptic curve is zero or not + * \param group EC_GROUP object + * \param ctx BN_CTX object (optional) + * \return 1 if the discriminant is not zero and 0 otherwise + */ +int EC_GROUP_check_discriminant(const EC_GROUP *group, BN_CTX *ctx); + +/** Compares two EC_GROUP objects + * \param a first EC_GROUP object + * \param b second EC_GROUP object + * \param ctx BN_CTX object (optional) + * \return 0 if both groups are equal and 1 otherwise + */ +int EC_GROUP_cmp(const EC_GROUP *a, const EC_GROUP *b, BN_CTX *ctx); + +/* + * EC_GROUP_new_GF*() calls EC_GROUP_new() and EC_GROUP_set_GF*() after + * choosing an appropriate EC_METHOD + */ + +/** Creates a new EC_GROUP object with the specified parameters defined + * over GFp (defined by the equation y^2 = x^3 + a*x + b) + * \param p BIGNUM with the prime number + * \param a BIGNUM with the parameter a of the equation + * \param b BIGNUM with the parameter b of the equation + * \param ctx BN_CTX object (optional) + * \return newly created EC_GROUP object with the specified parameters + */ +EC_GROUP *EC_GROUP_new_curve_GFp(const BIGNUM *p, const BIGNUM *a, + const BIGNUM *b, BN_CTX *ctx); +# ifndef OPENSSL_NO_EC2M +/** Creates a new EC_GROUP object with the specified parameters defined + * over GF2m (defined by the equation y^2 + x*y = x^3 + a*x^2 + b) + * \param p BIGNUM with the polynomial defining the underlying field + * \param a BIGNUM with the parameter a of the equation + * \param b BIGNUM with the parameter b of the equation + * \param ctx BN_CTX object (optional) + * \return newly created EC_GROUP object with the specified parameters + */ +EC_GROUP *EC_GROUP_new_curve_GF2m(const BIGNUM *p, const BIGNUM *a, + const BIGNUM *b, BN_CTX *ctx); +# endif +/** Creates a EC_GROUP object with a curve specified by a NID + * \param nid NID of the OID of the curve name + * \return newly created EC_GROUP object with specified curve or NULL + * if an error occurred + */ +EC_GROUP *EC_GROUP_new_by_curve_name(int nid); + +/********************************************************************/ +/* handling of internal curves */ +/********************************************************************/ + +typedef struct { + int nid; + const char *comment; +} EC_builtin_curve; + +/* + * EC_builtin_curves(EC_builtin_curve *r, size_t size) returns number of all + * available curves or zero if a error occurred. In case r ist not zero + * nitems EC_builtin_curve structures are filled with the data of the first + * nitems internal groups + */ +size_t EC_get_builtin_curves(EC_builtin_curve *r, size_t nitems); + +const char *EC_curve_nid2nist(int nid); +int EC_curve_nist2nid(const char *name); + +/********************************************************************/ +/* EC_POINT functions */ +/********************************************************************/ + +/** Creates a new EC_POINT object for the specified EC_GROUP + * \param group EC_GROUP the underlying EC_GROUP object + * \return newly created EC_POINT object or NULL if an error occurred + */ +EC_POINT *EC_POINT_new(const EC_GROUP *group); + +/** Frees a EC_POINT object + * \param point EC_POINT object to be freed + */ +void EC_POINT_free(EC_POINT *point); + +/** Clears and frees a EC_POINT object + * \param point EC_POINT object to be cleared and freed + */ +void EC_POINT_clear_free(EC_POINT *point); + +/** Copies EC_POINT object + * \param dst destination EC_POINT object + * \param src source EC_POINT object + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_copy(EC_POINT *dst, const EC_POINT *src); + +/** Creates a new EC_POINT object and copies the content of the supplied + * EC_POINT + * \param src source EC_POINT object + * \param group underlying the EC_GROUP object + * \return newly created EC_POINT object or NULL if an error occurred + */ +EC_POINT *EC_POINT_dup(const EC_POINT *src, const EC_GROUP *group); + +/** Returns the EC_METHOD used in EC_POINT object + * \param point EC_POINT object + * \return the EC_METHOD used + */ +const EC_METHOD *EC_POINT_method_of(const EC_POINT *point); + +/** Sets a point to infinity (neutral element) + * \param group underlying EC_GROUP object + * \param point EC_POINT to set to infinity + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_set_to_infinity(const EC_GROUP *group, EC_POINT *point); + +/** Sets the jacobian projective coordinates of a EC_POINT over GFp + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param x BIGNUM with the x-coordinate + * \param y BIGNUM with the y-coordinate + * \param z BIGNUM with the z-coordinate + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_set_Jprojective_coordinates_GFp(const EC_GROUP *group, + EC_POINT *p, const BIGNUM *x, + const BIGNUM *y, const BIGNUM *z, + BN_CTX *ctx); + +/** Gets the jacobian projective coordinates of a EC_POINT over GFp + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param x BIGNUM for the x-coordinate + * \param y BIGNUM for the y-coordinate + * \param z BIGNUM for the z-coordinate + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_get_Jprojective_coordinates_GFp(const EC_GROUP *group, + const EC_POINT *p, BIGNUM *x, + BIGNUM *y, BIGNUM *z, + BN_CTX *ctx); + +/** Sets the affine coordinates of a EC_POINT over GFp + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param x BIGNUM with the x-coordinate + * \param y BIGNUM with the y-coordinate + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_set_affine_coordinates_GFp(const EC_GROUP *group, EC_POINT *p, + const BIGNUM *x, const BIGNUM *y, + BN_CTX *ctx); + +/** Gets the affine coordinates of a EC_POINT over GFp + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param x BIGNUM for the x-coordinate + * \param y BIGNUM for the y-coordinate + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_get_affine_coordinates_GFp(const EC_GROUP *group, + const EC_POINT *p, BIGNUM *x, + BIGNUM *y, BN_CTX *ctx); + +/** Sets the x9.62 compressed coordinates of a EC_POINT over GFp + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param x BIGNUM with x-coordinate + * \param y_bit integer with the y-Bit (either 0 or 1) + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_set_compressed_coordinates_GFp(const EC_GROUP *group, + EC_POINT *p, const BIGNUM *x, + int y_bit, BN_CTX *ctx); +# ifndef OPENSSL_NO_EC2M +/** Sets the affine coordinates of a EC_POINT over GF2m + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param x BIGNUM with the x-coordinate + * \param y BIGNUM with the y-coordinate + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_set_affine_coordinates_GF2m(const EC_GROUP *group, EC_POINT *p, + const BIGNUM *x, const BIGNUM *y, + BN_CTX *ctx); + +/** Gets the affine coordinates of a EC_POINT over GF2m + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param x BIGNUM for the x-coordinate + * \param y BIGNUM for the y-coordinate + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_get_affine_coordinates_GF2m(const EC_GROUP *group, + const EC_POINT *p, BIGNUM *x, + BIGNUM *y, BN_CTX *ctx); + +/** Sets the x9.62 compressed coordinates of a EC_POINT over GF2m + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param x BIGNUM with x-coordinate + * \param y_bit integer with the y-Bit (either 0 or 1) + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_set_compressed_coordinates_GF2m(const EC_GROUP *group, + EC_POINT *p, const BIGNUM *x, + int y_bit, BN_CTX *ctx); +# endif +/** Encodes a EC_POINT object to a octet string + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param form point conversion form + * \param buf memory buffer for the result. If NULL the function returns + * required buffer size. + * \param len length of the memory buffer + * \param ctx BN_CTX object (optional) + * \return the length of the encoded octet string or 0 if an error occurred + */ +size_t EC_POINT_point2oct(const EC_GROUP *group, const EC_POINT *p, + point_conversion_form_t form, + unsigned char *buf, size_t len, BN_CTX *ctx); + +/** Decodes a EC_POINT from a octet string + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param buf memory buffer with the encoded ec point + * \param len length of the encoded ec point + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_oct2point(const EC_GROUP *group, EC_POINT *p, + const unsigned char *buf, size_t len, BN_CTX *ctx); + +/* other interfaces to point2oct/oct2point: */ +BIGNUM *EC_POINT_point2bn(const EC_GROUP *, const EC_POINT *, + point_conversion_form_t form, BIGNUM *, BN_CTX *); +EC_POINT *EC_POINT_bn2point(const EC_GROUP *, const BIGNUM *, + EC_POINT *, BN_CTX *); +char *EC_POINT_point2hex(const EC_GROUP *, const EC_POINT *, + point_conversion_form_t form, BN_CTX *); +EC_POINT *EC_POINT_hex2point(const EC_GROUP *, const char *, + EC_POINT *, BN_CTX *); + +/********************************************************************/ +/* functions for doing EC_POINT arithmetic */ +/********************************************************************/ + +/** Computes the sum of two EC_POINT + * \param group underlying EC_GROUP object + * \param r EC_POINT object for the result (r = a + b) + * \param a EC_POINT object with the first summand + * \param b EC_POINT object with the second summand + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, + const EC_POINT *b, BN_CTX *ctx); + +/** Computes the double of a EC_POINT + * \param group underlying EC_GROUP object + * \param r EC_POINT object for the result (r = 2 * a) + * \param a EC_POINT object + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_dbl(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, + BN_CTX *ctx); + +/** Computes the inverse of a EC_POINT + * \param group underlying EC_GROUP object + * \param a EC_POINT object to be inverted (it's used for the result as well) + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_invert(const EC_GROUP *group, EC_POINT *a, BN_CTX *ctx); + +/** Checks whether the point is the neutral element of the group + * \param group the underlying EC_GROUP object + * \param p EC_POINT object + * \return 1 if the point is the neutral element and 0 otherwise + */ +int EC_POINT_is_at_infinity(const EC_GROUP *group, const EC_POINT *p); + +/** Checks whether the point is on the curve + * \param group underlying EC_GROUP object + * \param point EC_POINT object to check + * \param ctx BN_CTX object (optional) + * \return 1 if point if on the curve and 0 otherwise + */ +int EC_POINT_is_on_curve(const EC_GROUP *group, const EC_POINT *point, + BN_CTX *ctx); + +/** Compares two EC_POINTs + * \param group underlying EC_GROUP object + * \param a first EC_POINT object + * \param b second EC_POINT object + * \param ctx BN_CTX object (optional) + * \return 0 if both points are equal and a value != 0 otherwise + */ +int EC_POINT_cmp(const EC_GROUP *group, const EC_POINT *a, const EC_POINT *b, + BN_CTX *ctx); + +int EC_POINT_make_affine(const EC_GROUP *group, EC_POINT *point, BN_CTX *ctx); +int EC_POINTs_make_affine(const EC_GROUP *group, size_t num, + EC_POINT *points[], BN_CTX *ctx); + +/** Computes r = generator * n sum_{i=0}^{num-1} p[i] * m[i] + * \param group underlying EC_GROUP object + * \param r EC_POINT object for the result + * \param n BIGNUM with the multiplier for the group generator (optional) + * \param num number futher summands + * \param p array of size num of EC_POINT objects + * \param m array of size num of BIGNUM objects + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINTs_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *n, + size_t num, const EC_POINT *p[], const BIGNUM *m[], + BN_CTX *ctx); + +/** Computes r = generator * n + q * m + * \param group underlying EC_GROUP object + * \param r EC_POINT object for the result + * \param n BIGNUM with the multiplier for the group generator (optional) + * \param q EC_POINT object with the first factor of the second summand + * \param m BIGNUM with the second factor of the second summand + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *n, + const EC_POINT *q, const BIGNUM *m, BN_CTX *ctx); + +/** Stores multiples of generator for faster point multiplication + * \param group EC_GROUP object + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_GROUP_precompute_mult(EC_GROUP *group, BN_CTX *ctx); + +/** Reports whether a precomputation has been done + * \param group EC_GROUP object + * \return 1 if a pre-computation has been done and 0 otherwise + */ +int EC_GROUP_have_precompute_mult(const EC_GROUP *group); + +/********************************************************************/ +/* ASN1 stuff */ +/********************************************************************/ + +/* + * EC_GROUP_get_basis_type() returns the NID of the basis type used to + * represent the field elements + */ +int EC_GROUP_get_basis_type(const EC_GROUP *); +# ifndef OPENSSL_NO_EC2M +int EC_GROUP_get_trinomial_basis(const EC_GROUP *, unsigned int *k); +int EC_GROUP_get_pentanomial_basis(const EC_GROUP *, unsigned int *k1, + unsigned int *k2, unsigned int *k3); +# endif + +# define OPENSSL_EC_NAMED_CURVE 0x001 + +typedef struct ecpk_parameters_st ECPKPARAMETERS; + +EC_GROUP *d2i_ECPKParameters(EC_GROUP **, const unsigned char **in, long len); +int i2d_ECPKParameters(const EC_GROUP *, unsigned char **out); + +# define d2i_ECPKParameters_bio(bp,x) ASN1_d2i_bio_of(EC_GROUP,NULL,d2i_ECPKParameters,bp,x) +# define i2d_ECPKParameters_bio(bp,x) ASN1_i2d_bio_of_const(EC_GROUP,i2d_ECPKParameters,bp,x) +# define d2i_ECPKParameters_fp(fp,x) (EC_GROUP *)ASN1_d2i_fp(NULL, \ + (char *(*)())d2i_ECPKParameters,(fp),(unsigned char **)(x)) +# define i2d_ECPKParameters_fp(fp,x) ASN1_i2d_fp(i2d_ECPKParameters,(fp), \ + (unsigned char *)(x)) + +# ifndef OPENSSL_NO_BIO +int ECPKParameters_print(BIO *bp, const EC_GROUP *x, int off); +# endif +# ifndef OPENSSL_NO_FP_API +int ECPKParameters_print_fp(FILE *fp, const EC_GROUP *x, int off); +# endif + +/********************************************************************/ +/* EC_KEY functions */ +/********************************************************************/ + +typedef struct ec_key_st EC_KEY; + +/* some values for the encoding_flag */ +# define EC_PKEY_NO_PARAMETERS 0x001 +# define EC_PKEY_NO_PUBKEY 0x002 + +/* some values for the flags field */ +# define EC_FLAG_NON_FIPS_ALLOW 0x1 +# define EC_FLAG_FIPS_CHECKED 0x2 + +/** Creates a new EC_KEY object. + * \return EC_KEY object or NULL if an error occurred. + */ +EC_KEY *EC_KEY_new(void); + +int EC_KEY_get_flags(const EC_KEY *key); + +void EC_KEY_set_flags(EC_KEY *key, int flags); + +void EC_KEY_clear_flags(EC_KEY *key, int flags); + +/** Creates a new EC_KEY object using a named curve as underlying + * EC_GROUP object. + * \param nid NID of the named curve. + * \return EC_KEY object or NULL if an error occurred. + */ +EC_KEY *EC_KEY_new_by_curve_name(int nid); + +/** Frees a EC_KEY object. + * \param key EC_KEY object to be freed. + */ +void EC_KEY_free(EC_KEY *key); + +/** Copies a EC_KEY object. + * \param dst destination EC_KEY object + * \param src src EC_KEY object + * \return dst or NULL if an error occurred. + */ +EC_KEY *EC_KEY_copy(EC_KEY *dst, const EC_KEY *src); + +/** Creates a new EC_KEY object and copies the content from src to it. + * \param src the source EC_KEY object + * \return newly created EC_KEY object or NULL if an error occurred. + */ +EC_KEY *EC_KEY_dup(const EC_KEY *src); + +/** Increases the internal reference count of a EC_KEY object. + * \param key EC_KEY object + * \return 1 on success and 0 if an error occurred. + */ +int EC_KEY_up_ref(EC_KEY *key); + +/** Returns the EC_GROUP object of a EC_KEY object + * \param key EC_KEY object + * \return the EC_GROUP object (possibly NULL). + */ +const EC_GROUP *EC_KEY_get0_group(const EC_KEY *key); + +/** Sets the EC_GROUP of a EC_KEY object. + * \param key EC_KEY object + * \param group EC_GROUP to use in the EC_KEY object (note: the EC_KEY + * object will use an own copy of the EC_GROUP). + * \return 1 on success and 0 if an error occurred. + */ +int EC_KEY_set_group(EC_KEY *key, const EC_GROUP *group); + +/** Returns the private key of a EC_KEY object. + * \param key EC_KEY object + * \return a BIGNUM with the private key (possibly NULL). + */ +const BIGNUM *EC_KEY_get0_private_key(const EC_KEY *key); + +/** Sets the private key of a EC_KEY object. + * \param key EC_KEY object + * \param prv BIGNUM with the private key (note: the EC_KEY object + * will use an own copy of the BIGNUM). + * \return 1 on success and 0 if an error occurred. + */ +int EC_KEY_set_private_key(EC_KEY *key, const BIGNUM *prv); + +/** Returns the public key of a EC_KEY object. + * \param key the EC_KEY object + * \return a EC_POINT object with the public key (possibly NULL) + */ +const EC_POINT *EC_KEY_get0_public_key(const EC_KEY *key); + +/** Sets the public key of a EC_KEY object. + * \param key EC_KEY object + * \param pub EC_POINT object with the public key (note: the EC_KEY object + * will use an own copy of the EC_POINT object). + * \return 1 on success and 0 if an error occurred. + */ +int EC_KEY_set_public_key(EC_KEY *key, const EC_POINT *pub); + +unsigned EC_KEY_get_enc_flags(const EC_KEY *key); +void EC_KEY_set_enc_flags(EC_KEY *eckey, unsigned int flags); +point_conversion_form_t EC_KEY_get_conv_form(const EC_KEY *key); +void EC_KEY_set_conv_form(EC_KEY *eckey, point_conversion_form_t cform); +/* functions to set/get method specific data */ +void *EC_KEY_get_key_method_data(EC_KEY *key, + void *(*dup_func) (void *), + void (*free_func) (void *), + void (*clear_free_func) (void *)); +/** Sets the key method data of an EC_KEY object, if none has yet been set. + * \param key EC_KEY object + * \param data opaque data to install. + * \param dup_func a function that duplicates |data|. + * \param free_func a function that frees |data|. + * \param clear_free_func a function that wipes and frees |data|. + * \return the previously set data pointer, or NULL if |data| was inserted. + */ +void *EC_KEY_insert_key_method_data(EC_KEY *key, void *data, + void *(*dup_func) (void *), + void (*free_func) (void *), + void (*clear_free_func) (void *)); +/* wrapper functions for the underlying EC_GROUP object */ +void EC_KEY_set_asn1_flag(EC_KEY *eckey, int asn1_flag); + +/** Creates a table of pre-computed multiples of the generator to + * accelerate further EC_KEY operations. + * \param key EC_KEY object + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occurred. + */ +int EC_KEY_precompute_mult(EC_KEY *key, BN_CTX *ctx); + +/** Creates a new ec private (and optional a new public) key. + * \param key EC_KEY object + * \return 1 on success and 0 if an error occurred. + */ +int EC_KEY_generate_key(EC_KEY *key); + +/** Verifies that a private and/or public key is valid. + * \param key the EC_KEY object + * \return 1 on success and 0 otherwise. + */ +int EC_KEY_check_key(const EC_KEY *key); + +/** Sets a public key from affine coordindates performing + * neccessary NIST PKV tests. + * \param key the EC_KEY object + * \param x public key x coordinate + * \param y public key y coordinate + * \return 1 on success and 0 otherwise. + */ +int EC_KEY_set_public_key_affine_coordinates(EC_KEY *key, BIGNUM *x, + BIGNUM *y); + +/********************************************************************/ +/* de- and encoding functions for SEC1 ECPrivateKey */ +/********************************************************************/ + +/** Decodes a private key from a memory buffer. + * \param key a pointer to a EC_KEY object which should be used (or NULL) + * \param in pointer to memory with the DER encoded private key + * \param len length of the DER encoded private key + * \return the decoded private key or NULL if an error occurred. + */ +EC_KEY *d2i_ECPrivateKey(EC_KEY **key, const unsigned char **in, long len); + +/** Encodes a private key object and stores the result in a buffer. + * \param key the EC_KEY object to encode + * \param out the buffer for the result (if NULL the function returns number + * of bytes needed). + * \return 1 on success and 0 if an error occurred. + */ +int i2d_ECPrivateKey(EC_KEY *key, unsigned char **out); + +/********************************************************************/ +/* de- and encoding functions for EC parameters */ +/********************************************************************/ + +/** Decodes ec parameter from a memory buffer. + * \param key a pointer to a EC_KEY object which should be used (or NULL) + * \param in pointer to memory with the DER encoded ec parameters + * \param len length of the DER encoded ec parameters + * \return a EC_KEY object with the decoded parameters or NULL if an error + * occurred. + */ +EC_KEY *d2i_ECParameters(EC_KEY **key, const unsigned char **in, long len); + +/** Encodes ec parameter and stores the result in a buffer. + * \param key the EC_KEY object with ec paramters to encode + * \param out the buffer for the result (if NULL the function returns number + * of bytes needed). + * \return 1 on success and 0 if an error occurred. + */ +int i2d_ECParameters(EC_KEY *key, unsigned char **out); + +/********************************************************************/ +/* de- and encoding functions for EC public key */ +/* (octet string, not DER -- hence 'o2i' and 'i2o') */ +/********************************************************************/ + +/** Decodes a ec public key from a octet string. + * \param key a pointer to a EC_KEY object which should be used + * \param in memory buffer with the encoded public key + * \param len length of the encoded public key + * \return EC_KEY object with decoded public key or NULL if an error + * occurred. + */ +EC_KEY *o2i_ECPublicKey(EC_KEY **key, const unsigned char **in, long len); + +/** Encodes a ec public key in an octet string. + * \param key the EC_KEY object with the public key + * \param out the buffer for the result (if NULL the function returns number + * of bytes needed). + * \return 1 on success and 0 if an error occurred + */ +int i2o_ECPublicKey(EC_KEY *key, unsigned char **out); + +# ifndef OPENSSL_NO_BIO +/** Prints out the ec parameters on human readable form. + * \param bp BIO object to which the information is printed + * \param key EC_KEY object + * \return 1 on success and 0 if an error occurred + */ +int ECParameters_print(BIO *bp, const EC_KEY *key); + +/** Prints out the contents of a EC_KEY object + * \param bp BIO object to which the information is printed + * \param key EC_KEY object + * \param off line offset + * \return 1 on success and 0 if an error occurred + */ +int EC_KEY_print(BIO *bp, const EC_KEY *key, int off); + +# endif +# ifndef OPENSSL_NO_FP_API +/** Prints out the ec parameters on human readable form. + * \param fp file descriptor to which the information is printed + * \param key EC_KEY object + * \return 1 on success and 0 if an error occurred + */ +int ECParameters_print_fp(FILE *fp, const EC_KEY *key); + +/** Prints out the contents of a EC_KEY object + * \param fp file descriptor to which the information is printed + * \param key EC_KEY object + * \param off line offset + * \return 1 on success and 0 if an error occurred + */ +int EC_KEY_print_fp(FILE *fp, const EC_KEY *key, int off); + +# endif + +# define ECParameters_dup(x) ASN1_dup_of(EC_KEY,i2d_ECParameters,d2i_ECParameters,x) + +# ifndef __cplusplus +# if defined(__SUNPRO_C) +# if __SUNPRO_C >= 0x520 +# pragma error_messages (default,E_ARRAY_OF_INCOMPLETE_NONAME,E_ARRAY_OF_INCOMPLETE) +# endif +# endif +# endif + +# define EVP_PKEY_CTX_set_ec_paramgen_curve_nid(ctx, nid) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_PARAMGEN|EVP_PKEY_OP_KEYGEN, \ + EVP_PKEY_CTRL_EC_PARAMGEN_CURVE_NID, nid, NULL) + +# define EVP_PKEY_CTX_set_ec_param_enc(ctx, flag) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_PARAMGEN|EVP_PKEY_OP_KEYGEN, \ + EVP_PKEY_CTRL_EC_PARAM_ENC, flag, NULL) + +# define EVP_PKEY_CTX_set_ecdh_cofactor_mode(ctx, flag) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_EC_ECDH_COFACTOR, flag, NULL) + +# define EVP_PKEY_CTX_get_ecdh_cofactor_mode(ctx) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_EC_ECDH_COFACTOR, -2, NULL) + +# define EVP_PKEY_CTX_set_ecdh_kdf_type(ctx, kdf) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_EC_KDF_TYPE, kdf, NULL) + +# define EVP_PKEY_CTX_get_ecdh_kdf_type(ctx) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_EC_KDF_TYPE, -2, NULL) + +# define EVP_PKEY_CTX_set_ecdh_kdf_md(ctx, md) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_EC_KDF_MD, 0, (void *)md) + +# define EVP_PKEY_CTX_get_ecdh_kdf_md(ctx, pmd) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_GET_EC_KDF_MD, 0, (void *)pmd) + +# define EVP_PKEY_CTX_set_ecdh_kdf_outlen(ctx, len) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_EC_KDF_OUTLEN, len, NULL) + +# define EVP_PKEY_CTX_get_ecdh_kdf_outlen(ctx, plen) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_GET_EC_KDF_OUTLEN, 0, (void *)plen) + +# define EVP_PKEY_CTX_set0_ecdh_kdf_ukm(ctx, p, plen) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_EC_KDF_UKM, plen, (void *)p) + +# define EVP_PKEY_CTX_get0_ecdh_kdf_ukm(ctx, p) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_GET_EC_KDF_UKM, 0, (void *)p) + +# define EVP_PKEY_CTRL_EC_PARAMGEN_CURVE_NID (EVP_PKEY_ALG_CTRL + 1) +# define EVP_PKEY_CTRL_EC_PARAM_ENC (EVP_PKEY_ALG_CTRL + 2) +# define EVP_PKEY_CTRL_EC_ECDH_COFACTOR (EVP_PKEY_ALG_CTRL + 3) +# define EVP_PKEY_CTRL_EC_KDF_TYPE (EVP_PKEY_ALG_CTRL + 4) +# define EVP_PKEY_CTRL_EC_KDF_MD (EVP_PKEY_ALG_CTRL + 5) +# define EVP_PKEY_CTRL_GET_EC_KDF_MD (EVP_PKEY_ALG_CTRL + 6) +# define EVP_PKEY_CTRL_EC_KDF_OUTLEN (EVP_PKEY_ALG_CTRL + 7) +# define EVP_PKEY_CTRL_GET_EC_KDF_OUTLEN (EVP_PKEY_ALG_CTRL + 8) +# define EVP_PKEY_CTRL_EC_KDF_UKM (EVP_PKEY_ALG_CTRL + 9) +# define EVP_PKEY_CTRL_GET_EC_KDF_UKM (EVP_PKEY_ALG_CTRL + 10) +/* KDF types */ +# define EVP_PKEY_ECDH_KDF_NONE 1 +# define EVP_PKEY_ECDH_KDF_X9_62 2 + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_EC_strings(void); + +/* Error codes for the EC functions. */ + +/* Function codes. */ +# define EC_F_BN_TO_FELEM 224 +# define EC_F_COMPUTE_WNAF 143 +# define EC_F_D2I_ECPARAMETERS 144 +# define EC_F_D2I_ECPKPARAMETERS 145 +# define EC_F_D2I_ECPRIVATEKEY 146 +# define EC_F_DO_EC_KEY_PRINT 221 +# define EC_F_ECDH_CMS_DECRYPT 238 +# define EC_F_ECDH_CMS_SET_SHARED_INFO 239 +# define EC_F_ECKEY_PARAM2TYPE 223 +# define EC_F_ECKEY_PARAM_DECODE 212 +# define EC_F_ECKEY_PRIV_DECODE 213 +# define EC_F_ECKEY_PRIV_ENCODE 214 +# define EC_F_ECKEY_PUB_DECODE 215 +# define EC_F_ECKEY_PUB_ENCODE 216 +# define EC_F_ECKEY_TYPE2PARAM 220 +# define EC_F_ECPARAMETERS_PRINT 147 +# define EC_F_ECPARAMETERS_PRINT_FP 148 +# define EC_F_ECPKPARAMETERS_PRINT 149 +# define EC_F_ECPKPARAMETERS_PRINT_FP 150 +# define EC_F_ECP_NISTZ256_GET_AFFINE 240 +# define EC_F_ECP_NISTZ256_MULT_PRECOMPUTE 243 +# define EC_F_ECP_NISTZ256_POINTS_MUL 241 +# define EC_F_ECP_NISTZ256_PRE_COMP_NEW 244 +# define EC_F_ECP_NISTZ256_SET_WORDS 245 +# define EC_F_ECP_NISTZ256_WINDOWED_MUL 242 +# define EC_F_ECP_NIST_MOD_192 203 +# define EC_F_ECP_NIST_MOD_224 204 +# define EC_F_ECP_NIST_MOD_256 205 +# define EC_F_ECP_NIST_MOD_521 206 +# define EC_F_EC_ASN1_GROUP2CURVE 153 +# define EC_F_EC_ASN1_GROUP2FIELDID 154 +# define EC_F_EC_ASN1_GROUP2PARAMETERS 155 +# define EC_F_EC_ASN1_GROUP2PKPARAMETERS 156 +# define EC_F_EC_ASN1_PARAMETERS2GROUP 157 +# define EC_F_EC_ASN1_PKPARAMETERS2GROUP 158 +# define EC_F_EC_EX_DATA_SET_DATA 211 +# define EC_F_EC_GF2M_MONTGOMERY_POINT_MULTIPLY 208 +# define EC_F_EC_GF2M_SIMPLE_GROUP_CHECK_DISCRIMINANT 159 +# define EC_F_EC_GF2M_SIMPLE_GROUP_SET_CURVE 195 +# define EC_F_EC_GF2M_SIMPLE_OCT2POINT 160 +# define EC_F_EC_GF2M_SIMPLE_POINT2OCT 161 +# define EC_F_EC_GF2M_SIMPLE_POINT_GET_AFFINE_COORDINATES 162 +# define EC_F_EC_GF2M_SIMPLE_POINT_SET_AFFINE_COORDINATES 163 +# define EC_F_EC_GF2M_SIMPLE_SET_COMPRESSED_COORDINATES 164 +# define EC_F_EC_GFP_MONT_FIELD_DECODE 133 +# define EC_F_EC_GFP_MONT_FIELD_ENCODE 134 +# define EC_F_EC_GFP_MONT_FIELD_MUL 131 +# define EC_F_EC_GFP_MONT_FIELD_SET_TO_ONE 209 +# define EC_F_EC_GFP_MONT_FIELD_SQR 132 +# define EC_F_EC_GFP_MONT_GROUP_SET_CURVE 189 +# define EC_F_EC_GFP_MONT_GROUP_SET_CURVE_GFP 135 +# define EC_F_EC_GFP_NISTP224_GROUP_SET_CURVE 225 +# define EC_F_EC_GFP_NISTP224_POINTS_MUL 228 +# define EC_F_EC_GFP_NISTP224_POINT_GET_AFFINE_COORDINATES 226 +# define EC_F_EC_GFP_NISTP256_GROUP_SET_CURVE 230 +# define EC_F_EC_GFP_NISTP256_POINTS_MUL 231 +# define EC_F_EC_GFP_NISTP256_POINT_GET_AFFINE_COORDINATES 232 +# define EC_F_EC_GFP_NISTP521_GROUP_SET_CURVE 233 +# define EC_F_EC_GFP_NISTP521_POINTS_MUL 234 +# define EC_F_EC_GFP_NISTP521_POINT_GET_AFFINE_COORDINATES 235 +# define EC_F_EC_GFP_NIST_FIELD_MUL 200 +# define EC_F_EC_GFP_NIST_FIELD_SQR 201 +# define EC_F_EC_GFP_NIST_GROUP_SET_CURVE 202 +# define EC_F_EC_GFP_SIMPLE_GROUP_CHECK_DISCRIMINANT 165 +# define EC_F_EC_GFP_SIMPLE_GROUP_SET_CURVE 166 +# define EC_F_EC_GFP_SIMPLE_GROUP_SET_CURVE_GFP 100 +# define EC_F_EC_GFP_SIMPLE_GROUP_SET_GENERATOR 101 +# define EC_F_EC_GFP_SIMPLE_MAKE_AFFINE 102 +# define EC_F_EC_GFP_SIMPLE_OCT2POINT 103 +# define EC_F_EC_GFP_SIMPLE_POINT2OCT 104 +# define EC_F_EC_GFP_SIMPLE_POINTS_MAKE_AFFINE 137 +# define EC_F_EC_GFP_SIMPLE_POINT_GET_AFFINE_COORDINATES 167 +# define EC_F_EC_GFP_SIMPLE_POINT_GET_AFFINE_COORDINATES_GFP 105 +# define EC_F_EC_GFP_SIMPLE_POINT_SET_AFFINE_COORDINATES 168 +# define EC_F_EC_GFP_SIMPLE_POINT_SET_AFFINE_COORDINATES_GFP 128 +# define EC_F_EC_GFP_SIMPLE_SET_COMPRESSED_COORDINATES 169 +# define EC_F_EC_GFP_SIMPLE_SET_COMPRESSED_COORDINATES_GFP 129 +# define EC_F_EC_GROUP_CHECK 170 +# define EC_F_EC_GROUP_CHECK_DISCRIMINANT 171 +# define EC_F_EC_GROUP_COPY 106 +# define EC_F_EC_GROUP_GET0_GENERATOR 139 +# define EC_F_EC_GROUP_GET_COFACTOR 140 +# define EC_F_EC_GROUP_GET_CURVE_GF2M 172 +# define EC_F_EC_GROUP_GET_CURVE_GFP 130 +# define EC_F_EC_GROUP_GET_DEGREE 173 +# define EC_F_EC_GROUP_GET_ORDER 141 +# define EC_F_EC_GROUP_GET_PENTANOMIAL_BASIS 193 +# define EC_F_EC_GROUP_GET_TRINOMIAL_BASIS 194 +# define EC_F_EC_GROUP_NEW 108 +# define EC_F_EC_GROUP_NEW_BY_CURVE_NAME 174 +# define EC_F_EC_GROUP_NEW_FROM_DATA 175 +# define EC_F_EC_GROUP_PRECOMPUTE_MULT 142 +# define EC_F_EC_GROUP_SET_CURVE_GF2M 176 +# define EC_F_EC_GROUP_SET_CURVE_GFP 109 +# define EC_F_EC_GROUP_SET_EXTRA_DATA 110 +# define EC_F_EC_GROUP_SET_GENERATOR 111 +# define EC_F_EC_KEY_CHECK_KEY 177 +# define EC_F_EC_KEY_COPY 178 +# define EC_F_EC_KEY_GENERATE_KEY 179 +# define EC_F_EC_KEY_NEW 182 +# define EC_F_EC_KEY_PRINT 180 +# define EC_F_EC_KEY_PRINT_FP 181 +# define EC_F_EC_KEY_SET_PUBLIC_KEY_AFFINE_COORDINATES 229 +# define EC_F_EC_POINTS_MAKE_AFFINE 136 +# define EC_F_EC_POINT_ADD 112 +# define EC_F_EC_POINT_CMP 113 +# define EC_F_EC_POINT_COPY 114 +# define EC_F_EC_POINT_DBL 115 +# define EC_F_EC_POINT_GET_AFFINE_COORDINATES_GF2M 183 +# define EC_F_EC_POINT_GET_AFFINE_COORDINATES_GFP 116 +# define EC_F_EC_POINT_GET_JPROJECTIVE_COORDINATES_GFP 117 +# define EC_F_EC_POINT_INVERT 210 +# define EC_F_EC_POINT_IS_AT_INFINITY 118 +# define EC_F_EC_POINT_IS_ON_CURVE 119 +# define EC_F_EC_POINT_MAKE_AFFINE 120 +# define EC_F_EC_POINT_MUL 184 +# define EC_F_EC_POINT_NEW 121 +# define EC_F_EC_POINT_OCT2POINT 122 +# define EC_F_EC_POINT_POINT2OCT 123 +# define EC_F_EC_POINT_SET_AFFINE_COORDINATES_GF2M 185 +# define EC_F_EC_POINT_SET_AFFINE_COORDINATES_GFP 124 +# define EC_F_EC_POINT_SET_COMPRESSED_COORDINATES_GF2M 186 +# define EC_F_EC_POINT_SET_COMPRESSED_COORDINATES_GFP 125 +# define EC_F_EC_POINT_SET_JPROJECTIVE_COORDINATES_GFP 126 +# define EC_F_EC_POINT_SET_TO_INFINITY 127 +# define EC_F_EC_PRE_COMP_DUP 207 +# define EC_F_EC_PRE_COMP_NEW 196 +# define EC_F_EC_WNAF_MUL 187 +# define EC_F_EC_WNAF_PRECOMPUTE_MULT 188 +# define EC_F_I2D_ECPARAMETERS 190 +# define EC_F_I2D_ECPKPARAMETERS 191 +# define EC_F_I2D_ECPRIVATEKEY 192 +# define EC_F_I2O_ECPUBLICKEY 151 +# define EC_F_NISTP224_PRE_COMP_NEW 227 +# define EC_F_NISTP256_PRE_COMP_NEW 236 +# define EC_F_NISTP521_PRE_COMP_NEW 237 +# define EC_F_O2I_ECPUBLICKEY 152 +# define EC_F_OLD_EC_PRIV_DECODE 222 +# define EC_F_PKEY_EC_CTRL 197 +# define EC_F_PKEY_EC_CTRL_STR 198 +# define EC_F_PKEY_EC_DERIVE 217 +# define EC_F_PKEY_EC_KEYGEN 199 +# define EC_F_PKEY_EC_PARAMGEN 219 +# define EC_F_PKEY_EC_SIGN 218 + +/* Reason codes. */ +# define EC_R_ASN1_ERROR 115 +# define EC_R_ASN1_UNKNOWN_FIELD 116 +# define EC_R_BIGNUM_OUT_OF_RANGE 144 +# define EC_R_BUFFER_TOO_SMALL 100 +# define EC_R_COORDINATES_OUT_OF_RANGE 146 +# define EC_R_D2I_ECPKPARAMETERS_FAILURE 117 +# define EC_R_DECODE_ERROR 142 +# define EC_R_DISCRIMINANT_IS_ZERO 118 +# define EC_R_EC_GROUP_NEW_BY_NAME_FAILURE 119 +# define EC_R_FIELD_TOO_LARGE 143 +# define EC_R_GF2M_NOT_SUPPORTED 147 +# define EC_R_GROUP2PKPARAMETERS_FAILURE 120 +# define EC_R_I2D_ECPKPARAMETERS_FAILURE 121 +# define EC_R_INCOMPATIBLE_OBJECTS 101 +# define EC_R_INVALID_ARGUMENT 112 +# define EC_R_INVALID_COMPRESSED_POINT 110 +# define EC_R_INVALID_COMPRESSION_BIT 109 +# define EC_R_INVALID_CURVE 141 +# define EC_R_INVALID_DIGEST 151 +# define EC_R_INVALID_DIGEST_TYPE 138 +# define EC_R_INVALID_ENCODING 102 +# define EC_R_INVALID_FIELD 103 +# define EC_R_INVALID_FORM 104 +# define EC_R_INVALID_GROUP_ORDER 122 +# define EC_R_INVALID_PENTANOMIAL_BASIS 132 +# define EC_R_INVALID_PRIVATE_KEY 123 +# define EC_R_INVALID_TRINOMIAL_BASIS 137 +# define EC_R_KDF_PARAMETER_ERROR 148 +# define EC_R_KEYS_NOT_SET 140 +# define EC_R_MISSING_PARAMETERS 124 +# define EC_R_MISSING_PRIVATE_KEY 125 +# define EC_R_NOT_A_NIST_PRIME 135 +# define EC_R_NOT_A_SUPPORTED_NIST_PRIME 136 +# define EC_R_NOT_IMPLEMENTED 126 +# define EC_R_NOT_INITIALIZED 111 +# define EC_R_NO_FIELD_MOD 133 +# define EC_R_NO_PARAMETERS_SET 139 +# define EC_R_PASSED_NULL_PARAMETER 134 +# define EC_R_PEER_KEY_ERROR 149 +# define EC_R_PKPARAMETERS2GROUP_FAILURE 127 +# define EC_R_POINT_AT_INFINITY 106 +# define EC_R_POINT_IS_NOT_ON_CURVE 107 +# define EC_R_SHARED_INFO_ERROR 150 +# define EC_R_SLOT_FULL 108 +# define EC_R_UNDEFINED_GENERATOR 113 +# define EC_R_UNDEFINED_ORDER 128 +# define EC_R_UNKNOWN_GROUP 129 +# define EC_R_UNKNOWN_ORDER 114 +# define EC_R_UNSUPPORTED_FIELD 131 +# define EC_R_WRONG_CURVE_PARAMETERS 145 +# define EC_R_WRONG_ORDER 130 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/ecdh.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/ecdh.h new file mode 100644 index 0000000..25348b3 --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/ecdh.h @@ -0,0 +1,134 @@ +/* crypto/ecdh/ecdh.h */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * + * The Elliptic Curve Public-Key Crypto Library (ECC Code) included + * herein is developed by SUN MICROSYSTEMS, INC., and is contributed + * to the OpenSSL project. + * + * The ECC Code is licensed pursuant to the OpenSSL open source + * license provided below. + * + * The ECDH software is originally written by Douglas Stebila of + * Sun Microsystems Laboratories. + * + */ +/* ==================================================================== + * Copyright (c) 2000-2002 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +#ifndef HEADER_ECDH_H +# define HEADER_ECDH_H + +# include + +# ifdef OPENSSL_NO_ECDH +# error ECDH is disabled. +# endif + +# include +# include +# ifndef OPENSSL_NO_DEPRECATED +# include +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +# define EC_FLAG_COFACTOR_ECDH 0x1000 + +const ECDH_METHOD *ECDH_OpenSSL(void); + +void ECDH_set_default_method(const ECDH_METHOD *); +const ECDH_METHOD *ECDH_get_default_method(void); +int ECDH_set_method(EC_KEY *, const ECDH_METHOD *); + +int ECDH_compute_key(void *out, size_t outlen, const EC_POINT *pub_key, + EC_KEY *ecdh, void *(*KDF) (const void *in, size_t inlen, + void *out, size_t *outlen)); + +int ECDH_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new + *new_func, CRYPTO_EX_dup *dup_func, + CRYPTO_EX_free *free_func); +int ECDH_set_ex_data(EC_KEY *d, int idx, void *arg); +void *ECDH_get_ex_data(EC_KEY *d, int idx); + +int ECDH_KDF_X9_62(unsigned char *out, size_t outlen, + const unsigned char *Z, size_t Zlen, + const unsigned char *sinfo, size_t sinfolen, + const EVP_MD *md); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_ECDH_strings(void); + +/* Error codes for the ECDH functions. */ + +/* Function codes. */ +# define ECDH_F_ECDH_CHECK 102 +# define ECDH_F_ECDH_COMPUTE_KEY 100 +# define ECDH_F_ECDH_DATA_NEW_METHOD 101 + +/* Reason codes. */ +# define ECDH_R_KDF_FAILED 102 +# define ECDH_R_NON_FIPS_METHOD 103 +# define ECDH_R_NO_PRIVATE_VALUE 100 +# define ECDH_R_POINT_ARITHMETIC_FAILURE 101 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/ecdsa.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/ecdsa.h new file mode 100644 index 0000000..a6f0930 --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/ecdsa.h @@ -0,0 +1,335 @@ +/* crypto/ecdsa/ecdsa.h */ +/** + * \file crypto/ecdsa/ecdsa.h Include file for the OpenSSL ECDSA functions + * \author Written by Nils Larsch for the OpenSSL project + */ +/* ==================================================================== + * Copyright (c) 2000-2005 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +#ifndef HEADER_ECDSA_H +# define HEADER_ECDSA_H + +# include + +# ifdef OPENSSL_NO_ECDSA +# error ECDSA is disabled. +# endif + +# include +# include +# ifndef OPENSSL_NO_DEPRECATED +# include +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct ECDSA_SIG_st { + BIGNUM *r; + BIGNUM *s; +} ECDSA_SIG; + +/** Allocates and initialize a ECDSA_SIG structure + * \return pointer to a ECDSA_SIG structure or NULL if an error occurred + */ +ECDSA_SIG *ECDSA_SIG_new(void); + +/** frees a ECDSA_SIG structure + * \param sig pointer to the ECDSA_SIG structure + */ +void ECDSA_SIG_free(ECDSA_SIG *sig); + +/** DER encode content of ECDSA_SIG object (note: this function modifies *pp + * (*pp += length of the DER encoded signature)). + * \param sig pointer to the ECDSA_SIG object + * \param pp pointer to a unsigned char pointer for the output or NULL + * \return the length of the DER encoded ECDSA_SIG object or 0 + */ +int i2d_ECDSA_SIG(const ECDSA_SIG *sig, unsigned char **pp); + +/** Decodes a DER encoded ECDSA signature (note: this function changes *pp + * (*pp += len)). + * \param sig pointer to ECDSA_SIG pointer (may be NULL) + * \param pp memory buffer with the DER encoded signature + * \param len length of the buffer + * \return pointer to the decoded ECDSA_SIG structure (or NULL) + */ +ECDSA_SIG *d2i_ECDSA_SIG(ECDSA_SIG **sig, const unsigned char **pp, long len); + +/** Computes the ECDSA signature of the given hash value using + * the supplied private key and returns the created signature. + * \param dgst pointer to the hash value + * \param dgst_len length of the hash value + * \param eckey EC_KEY object containing a private EC key + * \return pointer to a ECDSA_SIG structure or NULL if an error occurred + */ +ECDSA_SIG *ECDSA_do_sign(const unsigned char *dgst, int dgst_len, + EC_KEY *eckey); + +/** Computes ECDSA signature of a given hash value using the supplied + * private key (note: sig must point to ECDSA_size(eckey) bytes of memory). + * \param dgst pointer to the hash value to sign + * \param dgstlen length of the hash value + * \param kinv BIGNUM with a pre-computed inverse k (optional) + * \param rp BIGNUM with a pre-computed rp value (optioanl), + * see ECDSA_sign_setup + * \param eckey EC_KEY object containing a private EC key + * \return pointer to a ECDSA_SIG structure or NULL if an error occurred + */ +ECDSA_SIG *ECDSA_do_sign_ex(const unsigned char *dgst, int dgstlen, + const BIGNUM *kinv, const BIGNUM *rp, + EC_KEY *eckey); + +/** Verifies that the supplied signature is a valid ECDSA + * signature of the supplied hash value using the supplied public key. + * \param dgst pointer to the hash value + * \param dgst_len length of the hash value + * \param sig ECDSA_SIG structure + * \param eckey EC_KEY object containing a public EC key + * \return 1 if the signature is valid, 0 if the signature is invalid + * and -1 on error + */ +int ECDSA_do_verify(const unsigned char *dgst, int dgst_len, + const ECDSA_SIG *sig, EC_KEY *eckey); + +const ECDSA_METHOD *ECDSA_OpenSSL(void); + +/** Sets the default ECDSA method + * \param meth new default ECDSA_METHOD + */ +void ECDSA_set_default_method(const ECDSA_METHOD *meth); + +/** Returns the default ECDSA method + * \return pointer to ECDSA_METHOD structure containing the default method + */ +const ECDSA_METHOD *ECDSA_get_default_method(void); + +/** Sets method to be used for the ECDSA operations + * \param eckey EC_KEY object + * \param meth new method + * \return 1 on success and 0 otherwise + */ +int ECDSA_set_method(EC_KEY *eckey, const ECDSA_METHOD *meth); + +/** Returns the maximum length of the DER encoded signature + * \param eckey EC_KEY object + * \return numbers of bytes required for the DER encoded signature + */ +int ECDSA_size(const EC_KEY *eckey); + +/** Precompute parts of the signing operation + * \param eckey EC_KEY object containing a private EC key + * \param ctx BN_CTX object (optional) + * \param kinv BIGNUM pointer for the inverse of k + * \param rp BIGNUM pointer for x coordinate of k * generator + * \return 1 on success and 0 otherwise + */ +int ECDSA_sign_setup(EC_KEY *eckey, BN_CTX *ctx, BIGNUM **kinv, BIGNUM **rp); + +/** Computes ECDSA signature of a given hash value using the supplied + * private key (note: sig must point to ECDSA_size(eckey) bytes of memory). + * \param type this parameter is ignored + * \param dgst pointer to the hash value to sign + * \param dgstlen length of the hash value + * \param sig memory for the DER encoded created signature + * \param siglen pointer to the length of the returned signature + * \param eckey EC_KEY object containing a private EC key + * \return 1 on success and 0 otherwise + */ +int ECDSA_sign(int type, const unsigned char *dgst, int dgstlen, + unsigned char *sig, unsigned int *siglen, EC_KEY *eckey); + +/** Computes ECDSA signature of a given hash value using the supplied + * private key (note: sig must point to ECDSA_size(eckey) bytes of memory). + * \param type this parameter is ignored + * \param dgst pointer to the hash value to sign + * \param dgstlen length of the hash value + * \param sig buffer to hold the DER encoded signature + * \param siglen pointer to the length of the returned signature + * \param kinv BIGNUM with a pre-computed inverse k (optional) + * \param rp BIGNUM with a pre-computed rp value (optioanl), + * see ECDSA_sign_setup + * \param eckey EC_KEY object containing a private EC key + * \return 1 on success and 0 otherwise + */ +int ECDSA_sign_ex(int type, const unsigned char *dgst, int dgstlen, + unsigned char *sig, unsigned int *siglen, + const BIGNUM *kinv, const BIGNUM *rp, EC_KEY *eckey); + +/** Verifies that the given signature is valid ECDSA signature + * of the supplied hash value using the specified public key. + * \param type this parameter is ignored + * \param dgst pointer to the hash value + * \param dgstlen length of the hash value + * \param sig pointer to the DER encoded signature + * \param siglen length of the DER encoded signature + * \param eckey EC_KEY object containing a public EC key + * \return 1 if the signature is valid, 0 if the signature is invalid + * and -1 on error + */ +int ECDSA_verify(int type, const unsigned char *dgst, int dgstlen, + const unsigned char *sig, int siglen, EC_KEY *eckey); + +/* the standard ex_data functions */ +int ECDSA_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new + *new_func, CRYPTO_EX_dup *dup_func, + CRYPTO_EX_free *free_func); +int ECDSA_set_ex_data(EC_KEY *d, int idx, void *arg); +void *ECDSA_get_ex_data(EC_KEY *d, int idx); + +/** Allocates and initialize a ECDSA_METHOD structure + * \param ecdsa_method pointer to ECDSA_METHOD to copy. (May be NULL) + * \return pointer to a ECDSA_METHOD structure or NULL if an error occurred + */ + +ECDSA_METHOD *ECDSA_METHOD_new(const ECDSA_METHOD *ecdsa_method); + +/** frees a ECDSA_METHOD structure + * \param ecdsa_method pointer to the ECDSA_METHOD structure + */ +void ECDSA_METHOD_free(ECDSA_METHOD *ecdsa_method); + +/** Sets application specific data in the ECDSA_METHOD + * \param ecdsa_method pointer to existing ECDSA_METHOD + * \param app application specific data to set + */ + +void ECDSA_METHOD_set_app_data(ECDSA_METHOD *ecdsa_method, void *app); + +/** Returns application specific data from a ECDSA_METHOD structure + * \param ecdsa_method pointer to ECDSA_METHOD structure + * \return pointer to application specific data. + */ + +void *ECDSA_METHOD_get_app_data(ECDSA_METHOD *ecdsa_method); + +/** Set the ECDSA_do_sign function in the ECDSA_METHOD + * \param ecdsa_method pointer to existing ECDSA_METHOD + * \param ecdsa_do_sign a funtion of type ECDSA_do_sign + */ + +void ECDSA_METHOD_set_sign(ECDSA_METHOD *ecdsa_method, + ECDSA_SIG *(*ecdsa_do_sign) (const unsigned char + *dgst, int dgst_len, + const BIGNUM *inv, + const BIGNUM *rp, + EC_KEY *eckey)); + +/** Set the ECDSA_sign_setup function in the ECDSA_METHOD + * \param ecdsa_method pointer to existing ECDSA_METHOD + * \param ecdsa_sign_setup a funtion of type ECDSA_sign_setup + */ + +void ECDSA_METHOD_set_sign_setup(ECDSA_METHOD *ecdsa_method, + int (*ecdsa_sign_setup) (EC_KEY *eckey, + BN_CTX *ctx, + BIGNUM **kinv, + BIGNUM **r)); + +/** Set the ECDSA_do_verify function in the ECDSA_METHOD + * \param ecdsa_method pointer to existing ECDSA_METHOD + * \param ecdsa_do_verify a funtion of type ECDSA_do_verify + */ + +void ECDSA_METHOD_set_verify(ECDSA_METHOD *ecdsa_method, + int (*ecdsa_do_verify) (const unsigned char + *dgst, int dgst_len, + const ECDSA_SIG *sig, + EC_KEY *eckey)); + +void ECDSA_METHOD_set_flags(ECDSA_METHOD *ecdsa_method, int flags); + +/** Set the flags field in the ECDSA_METHOD + * \param ecdsa_method pointer to existing ECDSA_METHOD + * \param flags flags value to set + */ + +void ECDSA_METHOD_set_name(ECDSA_METHOD *ecdsa_method, char *name); + +/** Set the name field in the ECDSA_METHOD + * \param ecdsa_method pointer to existing ECDSA_METHOD + * \param name name to set + */ + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_ECDSA_strings(void); + +/* Error codes for the ECDSA functions. */ + +/* Function codes. */ +# define ECDSA_F_ECDSA_CHECK 104 +# define ECDSA_F_ECDSA_DATA_NEW_METHOD 100 +# define ECDSA_F_ECDSA_DO_SIGN 101 +# define ECDSA_F_ECDSA_DO_VERIFY 102 +# define ECDSA_F_ECDSA_METHOD_NEW 105 +# define ECDSA_F_ECDSA_SIGN_SETUP 103 + +/* Reason codes. */ +# define ECDSA_R_BAD_SIGNATURE 100 +# define ECDSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE 101 +# define ECDSA_R_ERR_EC_LIB 102 +# define ECDSA_R_MISSING_PARAMETERS 103 +# define ECDSA_R_NEED_NEW_SETUP_VALUES 106 +# define ECDSA_R_NON_FIPS_METHOD 107 +# define ECDSA_R_RANDOM_NUMBER_GENERATION_FAILED 104 +# define ECDSA_R_SIGNATURE_MALLOC_FAILED 105 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/engine.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/engine.h new file mode 100644 index 0000000..bd7b591 --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/engine.h @@ -0,0 +1,960 @@ +/* openssl/engine.h */ +/* + * Written by Geoff Thorpe (geoff@geoffthorpe.net) for the OpenSSL project + * 2000. + */ +/* ==================================================================== + * Copyright (c) 1999-2004 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * ECDH support in OpenSSL originally developed by + * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project. + */ + +#ifndef HEADER_ENGINE_H +# define HEADER_ENGINE_H + +# include + +# ifdef OPENSSL_NO_ENGINE +# error ENGINE is disabled. +# endif + +# ifndef OPENSSL_NO_DEPRECATED +# include +# ifndef OPENSSL_NO_RSA +# include +# endif +# ifndef OPENSSL_NO_DSA +# include +# endif +# ifndef OPENSSL_NO_DH +# include +# endif +# ifndef OPENSSL_NO_ECDH +# include +# endif +# ifndef OPENSSL_NO_ECDSA +# include +# endif +# include +# include +# include +# endif + +# include +# include + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * These flags are used to control combinations of algorithm (methods) by + * bitwise "OR"ing. + */ +# define ENGINE_METHOD_RSA (unsigned int)0x0001 +# define ENGINE_METHOD_DSA (unsigned int)0x0002 +# define ENGINE_METHOD_DH (unsigned int)0x0004 +# define ENGINE_METHOD_RAND (unsigned int)0x0008 +# define ENGINE_METHOD_ECDH (unsigned int)0x0010 +# define ENGINE_METHOD_ECDSA (unsigned int)0x0020 +# define ENGINE_METHOD_CIPHERS (unsigned int)0x0040 +# define ENGINE_METHOD_DIGESTS (unsigned int)0x0080 +# define ENGINE_METHOD_STORE (unsigned int)0x0100 +# define ENGINE_METHOD_PKEY_METHS (unsigned int)0x0200 +# define ENGINE_METHOD_PKEY_ASN1_METHS (unsigned int)0x0400 +/* Obvious all-or-nothing cases. */ +# define ENGINE_METHOD_ALL (unsigned int)0xFFFF +# define ENGINE_METHOD_NONE (unsigned int)0x0000 + +/* + * This(ese) flag(s) controls behaviour of the ENGINE_TABLE mechanism used + * internally to control registration of ENGINE implementations, and can be + * set by ENGINE_set_table_flags(). The "NOINIT" flag prevents attempts to + * initialise registered ENGINEs if they are not already initialised. + */ +# define ENGINE_TABLE_FLAG_NOINIT (unsigned int)0x0001 + +/* ENGINE flags that can be set by ENGINE_set_flags(). */ +/* Not used */ +/* #define ENGINE_FLAGS_MALLOCED 0x0001 */ + +/* + * This flag is for ENGINEs that wish to handle the various 'CMD'-related + * control commands on their own. Without this flag, ENGINE_ctrl() handles + * these control commands on behalf of the ENGINE using their "cmd_defns" + * data. + */ +# define ENGINE_FLAGS_MANUAL_CMD_CTRL (int)0x0002 + +/* + * This flag is for ENGINEs who return new duplicate structures when found + * via "ENGINE_by_id()". When an ENGINE must store state (eg. if + * ENGINE_ctrl() commands are called in sequence as part of some stateful + * process like key-generation setup and execution), it can set this flag - + * then each attempt to obtain the ENGINE will result in it being copied into + * a new structure. Normally, ENGINEs don't declare this flag so + * ENGINE_by_id() just increments the existing ENGINE's structural reference + * count. + */ +# define ENGINE_FLAGS_BY_ID_COPY (int)0x0004 + +/* + * This flag if for an ENGINE that does not want its methods registered as + * part of ENGINE_register_all_complete() for example if the methods are not + * usable as default methods. + */ + +# define ENGINE_FLAGS_NO_REGISTER_ALL (int)0x0008 + +/* + * ENGINEs can support their own command types, and these flags are used in + * ENGINE_CTRL_GET_CMD_FLAGS to indicate to the caller what kind of input + * each command expects. Currently only numeric and string input is + * supported. If a control command supports none of the _NUMERIC, _STRING, or + * _NO_INPUT options, then it is regarded as an "internal" control command - + * and not for use in config setting situations. As such, they're not + * available to the ENGINE_ctrl_cmd_string() function, only raw ENGINE_ctrl() + * access. Changes to this list of 'command types' should be reflected + * carefully in ENGINE_cmd_is_executable() and ENGINE_ctrl_cmd_string(). + */ + +/* accepts a 'long' input value (3rd parameter to ENGINE_ctrl) */ +# define ENGINE_CMD_FLAG_NUMERIC (unsigned int)0x0001 +/* + * accepts string input (cast from 'void*' to 'const char *', 4th parameter + * to ENGINE_ctrl) + */ +# define ENGINE_CMD_FLAG_STRING (unsigned int)0x0002 +/* + * Indicates that the control command takes *no* input. Ie. the control + * command is unparameterised. + */ +# define ENGINE_CMD_FLAG_NO_INPUT (unsigned int)0x0004 +/* + * Indicates that the control command is internal. This control command won't + * be shown in any output, and is only usable through the ENGINE_ctrl_cmd() + * function. + */ +# define ENGINE_CMD_FLAG_INTERNAL (unsigned int)0x0008 + +/* + * NB: These 3 control commands are deprecated and should not be used. + * ENGINEs relying on these commands should compile conditional support for + * compatibility (eg. if these symbols are defined) but should also migrate + * the same functionality to their own ENGINE-specific control functions that + * can be "discovered" by calling applications. The fact these control + * commands wouldn't be "executable" (ie. usable by text-based config) + * doesn't change the fact that application code can find and use them + * without requiring per-ENGINE hacking. + */ + +/* + * These flags are used to tell the ctrl function what should be done. All + * command numbers are shared between all engines, even if some don't make + * sense to some engines. In such a case, they do nothing but return the + * error ENGINE_R_CTRL_COMMAND_NOT_IMPLEMENTED. + */ +# define ENGINE_CTRL_SET_LOGSTREAM 1 +# define ENGINE_CTRL_SET_PASSWORD_CALLBACK 2 +# define ENGINE_CTRL_HUP 3/* Close and reinitialise + * any handles/connections + * etc. */ +# define ENGINE_CTRL_SET_USER_INTERFACE 4/* Alternative to callback */ +# define ENGINE_CTRL_SET_CALLBACK_DATA 5/* User-specific data, used + * when calling the password + * callback and the user + * interface */ +# define ENGINE_CTRL_LOAD_CONFIGURATION 6/* Load a configuration, + * given a string that + * represents a file name + * or so */ +# define ENGINE_CTRL_LOAD_SECTION 7/* Load data from a given + * section in the already + * loaded configuration */ + +/* + * These control commands allow an application to deal with an arbitrary + * engine in a dynamic way. Warn: Negative return values indicate errors FOR + * THESE COMMANDS because zero is used to indicate 'end-of-list'. Other + * commands, including ENGINE-specific command types, return zero for an + * error. An ENGINE can choose to implement these ctrl functions, and can + * internally manage things however it chooses - it does so by setting the + * ENGINE_FLAGS_MANUAL_CMD_CTRL flag (using ENGINE_set_flags()). Otherwise + * the ENGINE_ctrl() code handles this on the ENGINE's behalf using the + * cmd_defns data (set using ENGINE_set_cmd_defns()). This means an ENGINE's + * ctrl() handler need only implement its own commands - the above "meta" + * commands will be taken care of. + */ + +/* + * Returns non-zero if the supplied ENGINE has a ctrl() handler. If "not", + * then all the remaining control commands will return failure, so it is + * worth checking this first if the caller is trying to "discover" the + * engine's capabilities and doesn't want errors generated unnecessarily. + */ +# define ENGINE_CTRL_HAS_CTRL_FUNCTION 10 +/* + * Returns a positive command number for the first command supported by the + * engine. Returns zero if no ctrl commands are supported. + */ +# define ENGINE_CTRL_GET_FIRST_CMD_TYPE 11 +/* + * The 'long' argument specifies a command implemented by the engine, and the + * return value is the next command supported, or zero if there are no more. + */ +# define ENGINE_CTRL_GET_NEXT_CMD_TYPE 12 +/* + * The 'void*' argument is a command name (cast from 'const char *'), and the + * return value is the command that corresponds to it. + */ +# define ENGINE_CTRL_GET_CMD_FROM_NAME 13 +/* + * The next two allow a command to be converted into its corresponding string + * form. In each case, the 'long' argument supplies the command. In the + * NAME_LEN case, the return value is the length of the command name (not + * counting a trailing EOL). In the NAME case, the 'void*' argument must be a + * string buffer large enough, and it will be populated with the name of the + * command (WITH a trailing EOL). + */ +# define ENGINE_CTRL_GET_NAME_LEN_FROM_CMD 14 +# define ENGINE_CTRL_GET_NAME_FROM_CMD 15 +/* The next two are similar but give a "short description" of a command. */ +# define ENGINE_CTRL_GET_DESC_LEN_FROM_CMD 16 +# define ENGINE_CTRL_GET_DESC_FROM_CMD 17 +/* + * With this command, the return value is the OR'd combination of + * ENGINE_CMD_FLAG_*** values that indicate what kind of input a given + * engine-specific ctrl command expects. + */ +# define ENGINE_CTRL_GET_CMD_FLAGS 18 + +/* + * ENGINE implementations should start the numbering of their own control + * commands from this value. (ie. ENGINE_CMD_BASE, ENGINE_CMD_BASE + 1, etc). + */ +# define ENGINE_CMD_BASE 200 + +/* + * NB: These 2 nCipher "chil" control commands are deprecated, and their + * functionality is now available through ENGINE-specific control commands + * (exposed through the above-mentioned 'CMD'-handling). Code using these 2 + * commands should be migrated to the more general command handling before + * these are removed. + */ + +/* Flags specific to the nCipher "chil" engine */ +# define ENGINE_CTRL_CHIL_SET_FORKCHECK 100 + /* + * Depending on the value of the (long)i argument, this sets or + * unsets the SimpleForkCheck flag in the CHIL API to enable or + * disable checking and workarounds for applications that fork(). + */ +# define ENGINE_CTRL_CHIL_NO_LOCKING 101 + /* + * This prevents the initialisation function from providing mutex + * callbacks to the nCipher library. + */ + +/* + * If an ENGINE supports its own specific control commands and wishes the + * framework to handle the above 'ENGINE_CMD_***'-manipulation commands on + * its behalf, it should supply a null-terminated array of ENGINE_CMD_DEFN + * entries to ENGINE_set_cmd_defns(). It should also implement a ctrl() + * handler that supports the stated commands (ie. the "cmd_num" entries as + * described by the array). NB: The array must be ordered in increasing order + * of cmd_num. "null-terminated" means that the last ENGINE_CMD_DEFN element + * has cmd_num set to zero and/or cmd_name set to NULL. + */ +typedef struct ENGINE_CMD_DEFN_st { + unsigned int cmd_num; /* The command number */ + const char *cmd_name; /* The command name itself */ + const char *cmd_desc; /* A short description of the command */ + unsigned int cmd_flags; /* The input the command expects */ +} ENGINE_CMD_DEFN; + +/* Generic function pointer */ +typedef int (*ENGINE_GEN_FUNC_PTR) (void); +/* Generic function pointer taking no arguments */ +typedef int (*ENGINE_GEN_INT_FUNC_PTR) (ENGINE *); +/* Specific control function pointer */ +typedef int (*ENGINE_CTRL_FUNC_PTR) (ENGINE *, int, long, void *, + void (*f) (void)); +/* Generic load_key function pointer */ +typedef EVP_PKEY *(*ENGINE_LOAD_KEY_PTR)(ENGINE *, const char *, + UI_METHOD *ui_method, + void *callback_data); +typedef int (*ENGINE_SSL_CLIENT_CERT_PTR) (ENGINE *, SSL *ssl, + STACK_OF(X509_NAME) *ca_dn, + X509 **pcert, EVP_PKEY **pkey, + STACK_OF(X509) **pother, + UI_METHOD *ui_method, + void *callback_data); +/*- + * These callback types are for an ENGINE's handler for cipher and digest logic. + * These handlers have these prototypes; + * int foo(ENGINE *e, const EVP_CIPHER **cipher, const int **nids, int nid); + * int foo(ENGINE *e, const EVP_MD **digest, const int **nids, int nid); + * Looking at how to implement these handlers in the case of cipher support, if + * the framework wants the EVP_CIPHER for 'nid', it will call; + * foo(e, &p_evp_cipher, NULL, nid); (return zero for failure) + * If the framework wants a list of supported 'nid's, it will call; + * foo(e, NULL, &p_nids, 0); (returns number of 'nids' or -1 for error) + */ +/* + * Returns to a pointer to the array of supported cipher 'nid's. If the + * second parameter is non-NULL it is set to the size of the returned array. + */ +typedef int (*ENGINE_CIPHERS_PTR) (ENGINE *, const EVP_CIPHER **, + const int **, int); +typedef int (*ENGINE_DIGESTS_PTR) (ENGINE *, const EVP_MD **, const int **, + int); +typedef int (*ENGINE_PKEY_METHS_PTR) (ENGINE *, EVP_PKEY_METHOD **, + const int **, int); +typedef int (*ENGINE_PKEY_ASN1_METHS_PTR) (ENGINE *, EVP_PKEY_ASN1_METHOD **, + const int **, int); +/* + * STRUCTURE functions ... all of these functions deal with pointers to + * ENGINE structures where the pointers have a "structural reference". This + * means that their reference is to allowed access to the structure but it + * does not imply that the structure is functional. To simply increment or + * decrement the structural reference count, use ENGINE_by_id and + * ENGINE_free. NB: This is not required when iterating using ENGINE_get_next + * as it will automatically decrement the structural reference count of the + * "current" ENGINE and increment the structural reference count of the + * ENGINE it returns (unless it is NULL). + */ + +/* Get the first/last "ENGINE" type available. */ +ENGINE *ENGINE_get_first(void); +ENGINE *ENGINE_get_last(void); +/* Iterate to the next/previous "ENGINE" type (NULL = end of the list). */ +ENGINE *ENGINE_get_next(ENGINE *e); +ENGINE *ENGINE_get_prev(ENGINE *e); +/* Add another "ENGINE" type into the array. */ +int ENGINE_add(ENGINE *e); +/* Remove an existing "ENGINE" type from the array. */ +int ENGINE_remove(ENGINE *e); +/* Retrieve an engine from the list by its unique "id" value. */ +ENGINE *ENGINE_by_id(const char *id); +/* Add all the built-in engines. */ +void ENGINE_load_openssl(void); +void ENGINE_load_dynamic(void); +# ifndef OPENSSL_NO_STATIC_ENGINE +void ENGINE_load_4758cca(void); +void ENGINE_load_aep(void); +void ENGINE_load_atalla(void); +void ENGINE_load_chil(void); +void ENGINE_load_cswift(void); +void ENGINE_load_nuron(void); +void ENGINE_load_sureware(void); +void ENGINE_load_ubsec(void); +void ENGINE_load_padlock(void); +void ENGINE_load_capi(void); +# ifndef OPENSSL_NO_GMP +void ENGINE_load_gmp(void); +# endif +# ifndef OPENSSL_NO_GOST +void ENGINE_load_gost(void); +# endif +# endif +void ENGINE_load_cryptodev(void); +void ENGINE_load_rdrand(void); +void ENGINE_load_builtin_engines(void); + +/* + * Get and set global flags (ENGINE_TABLE_FLAG_***) for the implementation + * "registry" handling. + */ +unsigned int ENGINE_get_table_flags(void); +void ENGINE_set_table_flags(unsigned int flags); + +/*- Manage registration of ENGINEs per "table". For each type, there are 3 + * functions; + * ENGINE_register_***(e) - registers the implementation from 'e' (if it has one) + * ENGINE_unregister_***(e) - unregister the implementation from 'e' + * ENGINE_register_all_***() - call ENGINE_register_***() for each 'e' in the list + * Cleanup is automatically registered from each table when required, so + * ENGINE_cleanup() will reverse any "register" operations. + */ + +int ENGINE_register_RSA(ENGINE *e); +void ENGINE_unregister_RSA(ENGINE *e); +void ENGINE_register_all_RSA(void); + +int ENGINE_register_DSA(ENGINE *e); +void ENGINE_unregister_DSA(ENGINE *e); +void ENGINE_register_all_DSA(void); + +int ENGINE_register_ECDH(ENGINE *e); +void ENGINE_unregister_ECDH(ENGINE *e); +void ENGINE_register_all_ECDH(void); + +int ENGINE_register_ECDSA(ENGINE *e); +void ENGINE_unregister_ECDSA(ENGINE *e); +void ENGINE_register_all_ECDSA(void); + +int ENGINE_register_DH(ENGINE *e); +void ENGINE_unregister_DH(ENGINE *e); +void ENGINE_register_all_DH(void); + +int ENGINE_register_RAND(ENGINE *e); +void ENGINE_unregister_RAND(ENGINE *e); +void ENGINE_register_all_RAND(void); + +int ENGINE_register_STORE(ENGINE *e); +void ENGINE_unregister_STORE(ENGINE *e); +void ENGINE_register_all_STORE(void); + +int ENGINE_register_ciphers(ENGINE *e); +void ENGINE_unregister_ciphers(ENGINE *e); +void ENGINE_register_all_ciphers(void); + +int ENGINE_register_digests(ENGINE *e); +void ENGINE_unregister_digests(ENGINE *e); +void ENGINE_register_all_digests(void); + +int ENGINE_register_pkey_meths(ENGINE *e); +void ENGINE_unregister_pkey_meths(ENGINE *e); +void ENGINE_register_all_pkey_meths(void); + +int ENGINE_register_pkey_asn1_meths(ENGINE *e); +void ENGINE_unregister_pkey_asn1_meths(ENGINE *e); +void ENGINE_register_all_pkey_asn1_meths(void); + +/* + * These functions register all support from the above categories. Note, use + * of these functions can result in static linkage of code your application + * may not need. If you only need a subset of functionality, consider using + * more selective initialisation. + */ +int ENGINE_register_complete(ENGINE *e); +int ENGINE_register_all_complete(void); + +/* + * Send parametrised control commands to the engine. The possibilities to + * send down an integer, a pointer to data or a function pointer are + * provided. Any of the parameters may or may not be NULL, depending on the + * command number. In actuality, this function only requires a structural + * (rather than functional) reference to an engine, but many control commands + * may require the engine be functional. The caller should be aware of trying + * commands that require an operational ENGINE, and only use functional + * references in such situations. + */ +int ENGINE_ctrl(ENGINE *e, int cmd, long i, void *p, void (*f) (void)); + +/* + * This function tests if an ENGINE-specific command is usable as a + * "setting". Eg. in an application's config file that gets processed through + * ENGINE_ctrl_cmd_string(). If this returns zero, it is not available to + * ENGINE_ctrl_cmd_string(), only ENGINE_ctrl(). + */ +int ENGINE_cmd_is_executable(ENGINE *e, int cmd); + +/* + * This function works like ENGINE_ctrl() with the exception of taking a + * command name instead of a command number, and can handle optional + * commands. See the comment on ENGINE_ctrl_cmd_string() for an explanation + * on how to use the cmd_name and cmd_optional. + */ +int ENGINE_ctrl_cmd(ENGINE *e, const char *cmd_name, + long i, void *p, void (*f) (void), int cmd_optional); + +/* + * This function passes a command-name and argument to an ENGINE. The + * cmd_name is converted to a command number and the control command is + * called using 'arg' as an argument (unless the ENGINE doesn't support such + * a command, in which case no control command is called). The command is + * checked for input flags, and if necessary the argument will be converted + * to a numeric value. If cmd_optional is non-zero, then if the ENGINE + * doesn't support the given cmd_name the return value will be success + * anyway. This function is intended for applications to use so that users + * (or config files) can supply engine-specific config data to the ENGINE at + * run-time to control behaviour of specific engines. As such, it shouldn't + * be used for calling ENGINE_ctrl() functions that return data, deal with + * binary data, or that are otherwise supposed to be used directly through + * ENGINE_ctrl() in application code. Any "return" data from an ENGINE_ctrl() + * operation in this function will be lost - the return value is interpreted + * as failure if the return value is zero, success otherwise, and this + * function returns a boolean value as a result. In other words, vendors of + * 'ENGINE'-enabled devices should write ENGINE implementations with + * parameterisations that work in this scheme, so that compliant ENGINE-based + * applications can work consistently with the same configuration for the + * same ENGINE-enabled devices, across applications. + */ +int ENGINE_ctrl_cmd_string(ENGINE *e, const char *cmd_name, const char *arg, + int cmd_optional); + +/* + * These functions are useful for manufacturing new ENGINE structures. They + * don't address reference counting at all - one uses them to populate an + * ENGINE structure with personalised implementations of things prior to + * using it directly or adding it to the builtin ENGINE list in OpenSSL. + * These are also here so that the ENGINE structure doesn't have to be + * exposed and break binary compatibility! + */ +ENGINE *ENGINE_new(void); +int ENGINE_free(ENGINE *e); +int ENGINE_up_ref(ENGINE *e); +int ENGINE_set_id(ENGINE *e, const char *id); +int ENGINE_set_name(ENGINE *e, const char *name); +int ENGINE_set_RSA(ENGINE *e, const RSA_METHOD *rsa_meth); +int ENGINE_set_DSA(ENGINE *e, const DSA_METHOD *dsa_meth); +int ENGINE_set_ECDH(ENGINE *e, const ECDH_METHOD *ecdh_meth); +int ENGINE_set_ECDSA(ENGINE *e, const ECDSA_METHOD *ecdsa_meth); +int ENGINE_set_DH(ENGINE *e, const DH_METHOD *dh_meth); +int ENGINE_set_RAND(ENGINE *e, const RAND_METHOD *rand_meth); +int ENGINE_set_STORE(ENGINE *e, const STORE_METHOD *store_meth); +int ENGINE_set_destroy_function(ENGINE *e, ENGINE_GEN_INT_FUNC_PTR destroy_f); +int ENGINE_set_init_function(ENGINE *e, ENGINE_GEN_INT_FUNC_PTR init_f); +int ENGINE_set_finish_function(ENGINE *e, ENGINE_GEN_INT_FUNC_PTR finish_f); +int ENGINE_set_ctrl_function(ENGINE *e, ENGINE_CTRL_FUNC_PTR ctrl_f); +int ENGINE_set_load_privkey_function(ENGINE *e, + ENGINE_LOAD_KEY_PTR loadpriv_f); +int ENGINE_set_load_pubkey_function(ENGINE *e, ENGINE_LOAD_KEY_PTR loadpub_f); +int ENGINE_set_load_ssl_client_cert_function(ENGINE *e, + ENGINE_SSL_CLIENT_CERT_PTR + loadssl_f); +int ENGINE_set_ciphers(ENGINE *e, ENGINE_CIPHERS_PTR f); +int ENGINE_set_digests(ENGINE *e, ENGINE_DIGESTS_PTR f); +int ENGINE_set_pkey_meths(ENGINE *e, ENGINE_PKEY_METHS_PTR f); +int ENGINE_set_pkey_asn1_meths(ENGINE *e, ENGINE_PKEY_ASN1_METHS_PTR f); +int ENGINE_set_flags(ENGINE *e, int flags); +int ENGINE_set_cmd_defns(ENGINE *e, const ENGINE_CMD_DEFN *defns); +/* These functions allow control over any per-structure ENGINE data. */ +int ENGINE_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, + CRYPTO_EX_free *free_func); +int ENGINE_set_ex_data(ENGINE *e, int idx, void *arg); +void *ENGINE_get_ex_data(const ENGINE *e, int idx); + +/* + * This function cleans up anything that needs it. Eg. the ENGINE_add() + * function automatically ensures the list cleanup function is registered to + * be called from ENGINE_cleanup(). Similarly, all ENGINE_register_*** + * functions ensure ENGINE_cleanup() will clean up after them. + */ +void ENGINE_cleanup(void); + +/* + * These return values from within the ENGINE structure. These can be useful + * with functional references as well as structural references - it depends + * which you obtained. Using the result for functional purposes if you only + * obtained a structural reference may be problematic! + */ +const char *ENGINE_get_id(const ENGINE *e); +const char *ENGINE_get_name(const ENGINE *e); +const RSA_METHOD *ENGINE_get_RSA(const ENGINE *e); +const DSA_METHOD *ENGINE_get_DSA(const ENGINE *e); +const ECDH_METHOD *ENGINE_get_ECDH(const ENGINE *e); +const ECDSA_METHOD *ENGINE_get_ECDSA(const ENGINE *e); +const DH_METHOD *ENGINE_get_DH(const ENGINE *e); +const RAND_METHOD *ENGINE_get_RAND(const ENGINE *e); +const STORE_METHOD *ENGINE_get_STORE(const ENGINE *e); +ENGINE_GEN_INT_FUNC_PTR ENGINE_get_destroy_function(const ENGINE *e); +ENGINE_GEN_INT_FUNC_PTR ENGINE_get_init_function(const ENGINE *e); +ENGINE_GEN_INT_FUNC_PTR ENGINE_get_finish_function(const ENGINE *e); +ENGINE_CTRL_FUNC_PTR ENGINE_get_ctrl_function(const ENGINE *e); +ENGINE_LOAD_KEY_PTR ENGINE_get_load_privkey_function(const ENGINE *e); +ENGINE_LOAD_KEY_PTR ENGINE_get_load_pubkey_function(const ENGINE *e); +ENGINE_SSL_CLIENT_CERT_PTR ENGINE_get_ssl_client_cert_function(const ENGINE + *e); +ENGINE_CIPHERS_PTR ENGINE_get_ciphers(const ENGINE *e); +ENGINE_DIGESTS_PTR ENGINE_get_digests(const ENGINE *e); +ENGINE_PKEY_METHS_PTR ENGINE_get_pkey_meths(const ENGINE *e); +ENGINE_PKEY_ASN1_METHS_PTR ENGINE_get_pkey_asn1_meths(const ENGINE *e); +const EVP_CIPHER *ENGINE_get_cipher(ENGINE *e, int nid); +const EVP_MD *ENGINE_get_digest(ENGINE *e, int nid); +const EVP_PKEY_METHOD *ENGINE_get_pkey_meth(ENGINE *e, int nid); +const EVP_PKEY_ASN1_METHOD *ENGINE_get_pkey_asn1_meth(ENGINE *e, int nid); +const EVP_PKEY_ASN1_METHOD *ENGINE_get_pkey_asn1_meth_str(ENGINE *e, + const char *str, + int len); +const EVP_PKEY_ASN1_METHOD *ENGINE_pkey_asn1_find_str(ENGINE **pe, + const char *str, + int len); +const ENGINE_CMD_DEFN *ENGINE_get_cmd_defns(const ENGINE *e); +int ENGINE_get_flags(const ENGINE *e); + +/* + * FUNCTIONAL functions. These functions deal with ENGINE structures that + * have (or will) be initialised for use. Broadly speaking, the structural + * functions are useful for iterating the list of available engine types, + * creating new engine types, and other "list" operations. These functions + * actually deal with ENGINEs that are to be used. As such these functions + * can fail (if applicable) when particular engines are unavailable - eg. if + * a hardware accelerator is not attached or not functioning correctly. Each + * ENGINE has 2 reference counts; structural and functional. Every time a + * functional reference is obtained or released, a corresponding structural + * reference is automatically obtained or released too. + */ + +/* + * Initialise a engine type for use (or up its reference count if it's + * already in use). This will fail if the engine is not currently operational + * and cannot initialise. + */ +int ENGINE_init(ENGINE *e); +/* + * Free a functional reference to a engine type. This does not require a + * corresponding call to ENGINE_free as it also releases a structural + * reference. + */ +int ENGINE_finish(ENGINE *e); + +/* + * The following functions handle keys that are stored in some secondary + * location, handled by the engine. The storage may be on a card or + * whatever. + */ +EVP_PKEY *ENGINE_load_private_key(ENGINE *e, const char *key_id, + UI_METHOD *ui_method, void *callback_data); +EVP_PKEY *ENGINE_load_public_key(ENGINE *e, const char *key_id, + UI_METHOD *ui_method, void *callback_data); +int ENGINE_load_ssl_client_cert(ENGINE *e, SSL *s, + STACK_OF(X509_NAME) *ca_dn, X509 **pcert, + EVP_PKEY **ppkey, STACK_OF(X509) **pother, + UI_METHOD *ui_method, void *callback_data); + +/* + * This returns a pointer for the current ENGINE structure that is (by + * default) performing any RSA operations. The value returned is an + * incremented reference, so it should be free'd (ENGINE_finish) before it is + * discarded. + */ +ENGINE *ENGINE_get_default_RSA(void); +/* Same for the other "methods" */ +ENGINE *ENGINE_get_default_DSA(void); +ENGINE *ENGINE_get_default_ECDH(void); +ENGINE *ENGINE_get_default_ECDSA(void); +ENGINE *ENGINE_get_default_DH(void); +ENGINE *ENGINE_get_default_RAND(void); +/* + * These functions can be used to get a functional reference to perform + * ciphering or digesting corresponding to "nid". + */ +ENGINE *ENGINE_get_cipher_engine(int nid); +ENGINE *ENGINE_get_digest_engine(int nid); +ENGINE *ENGINE_get_pkey_meth_engine(int nid); +ENGINE *ENGINE_get_pkey_asn1_meth_engine(int nid); + +/* + * This sets a new default ENGINE structure for performing RSA operations. If + * the result is non-zero (success) then the ENGINE structure will have had + * its reference count up'd so the caller should still free their own + * reference 'e'. + */ +int ENGINE_set_default_RSA(ENGINE *e); +int ENGINE_set_default_string(ENGINE *e, const char *def_list); +/* Same for the other "methods" */ +int ENGINE_set_default_DSA(ENGINE *e); +int ENGINE_set_default_ECDH(ENGINE *e); +int ENGINE_set_default_ECDSA(ENGINE *e); +int ENGINE_set_default_DH(ENGINE *e); +int ENGINE_set_default_RAND(ENGINE *e); +int ENGINE_set_default_ciphers(ENGINE *e); +int ENGINE_set_default_digests(ENGINE *e); +int ENGINE_set_default_pkey_meths(ENGINE *e); +int ENGINE_set_default_pkey_asn1_meths(ENGINE *e); + +/* + * The combination "set" - the flags are bitwise "OR"d from the + * ENGINE_METHOD_*** defines above. As with the "ENGINE_register_complete()" + * function, this function can result in unnecessary static linkage. If your + * application requires only specific functionality, consider using more + * selective functions. + */ +int ENGINE_set_default(ENGINE *e, unsigned int flags); + +void ENGINE_add_conf_module(void); + +/* Deprecated functions ... */ +/* int ENGINE_clear_defaults(void); */ + +/**************************/ +/* DYNAMIC ENGINE SUPPORT */ +/**************************/ + +/* Binary/behaviour compatibility levels */ +# define OSSL_DYNAMIC_VERSION (unsigned long)0x00020000 +/* + * Binary versions older than this are too old for us (whether we're a loader + * or a loadee) + */ +# define OSSL_DYNAMIC_OLDEST (unsigned long)0x00020000 + +/* + * When compiling an ENGINE entirely as an external shared library, loadable + * by the "dynamic" ENGINE, these types are needed. The 'dynamic_fns' + * structure type provides the calling application's (or library's) error + * functionality and memory management function pointers to the loaded + * library. These should be used/set in the loaded library code so that the + * loading application's 'state' will be used/changed in all operations. The + * 'static_state' pointer allows the loaded library to know if it shares the + * same static data as the calling application (or library), and thus whether + * these callbacks need to be set or not. + */ +typedef void *(*dyn_MEM_malloc_cb) (size_t); +typedef void *(*dyn_MEM_realloc_cb) (void *, size_t); +typedef void (*dyn_MEM_free_cb) (void *); +typedef struct st_dynamic_MEM_fns { + dyn_MEM_malloc_cb malloc_cb; + dyn_MEM_realloc_cb realloc_cb; + dyn_MEM_free_cb free_cb; +} dynamic_MEM_fns; +/* + * FIXME: Perhaps the memory and locking code (crypto.h) should declare and + * use these types so we (and any other dependant code) can simplify a bit?? + */ +typedef void (*dyn_lock_locking_cb) (int, int, const char *, int); +typedef int (*dyn_lock_add_lock_cb) (int *, int, int, const char *, int); +typedef struct CRYPTO_dynlock_value *(*dyn_dynlock_create_cb) (const char *, + int); +typedef void (*dyn_dynlock_lock_cb) (int, struct CRYPTO_dynlock_value *, + const char *, int); +typedef void (*dyn_dynlock_destroy_cb) (struct CRYPTO_dynlock_value *, + const char *, int); +typedef struct st_dynamic_LOCK_fns { + dyn_lock_locking_cb lock_locking_cb; + dyn_lock_add_lock_cb lock_add_lock_cb; + dyn_dynlock_create_cb dynlock_create_cb; + dyn_dynlock_lock_cb dynlock_lock_cb; + dyn_dynlock_destroy_cb dynlock_destroy_cb; +} dynamic_LOCK_fns; +/* The top-level structure */ +typedef struct st_dynamic_fns { + void *static_state; + const ERR_FNS *err_fns; + const CRYPTO_EX_DATA_IMPL *ex_data_fns; + dynamic_MEM_fns mem_fns; + dynamic_LOCK_fns lock_fns; +} dynamic_fns; + +/* + * The version checking function should be of this prototype. NB: The + * ossl_version value passed in is the OSSL_DYNAMIC_VERSION of the loading + * code. If this function returns zero, it indicates a (potential) version + * incompatibility and the loaded library doesn't believe it can proceed. + * Otherwise, the returned value is the (latest) version supported by the + * loading library. The loader may still decide that the loaded code's + * version is unsatisfactory and could veto the load. The function is + * expected to be implemented with the symbol name "v_check", and a default + * implementation can be fully instantiated with + * IMPLEMENT_DYNAMIC_CHECK_FN(). + */ +typedef unsigned long (*dynamic_v_check_fn) (unsigned long ossl_version); +# define IMPLEMENT_DYNAMIC_CHECK_FN() \ + OPENSSL_EXPORT unsigned long v_check(unsigned long v); \ + OPENSSL_EXPORT unsigned long v_check(unsigned long v) { \ + if(v >= OSSL_DYNAMIC_OLDEST) return OSSL_DYNAMIC_VERSION; \ + return 0; } + +/* + * This function is passed the ENGINE structure to initialise with its own + * function and command settings. It should not adjust the structural or + * functional reference counts. If this function returns zero, (a) the load + * will be aborted, (b) the previous ENGINE state will be memcpy'd back onto + * the structure, and (c) the shared library will be unloaded. So + * implementations should do their own internal cleanup in failure + * circumstances otherwise they could leak. The 'id' parameter, if non-NULL, + * represents the ENGINE id that the loader is looking for. If this is NULL, + * the shared library can choose to return failure or to initialise a + * 'default' ENGINE. If non-NULL, the shared library must initialise only an + * ENGINE matching the passed 'id'. The function is expected to be + * implemented with the symbol name "bind_engine". A standard implementation + * can be instantiated with IMPLEMENT_DYNAMIC_BIND_FN(fn) where the parameter + * 'fn' is a callback function that populates the ENGINE structure and + * returns an int value (zero for failure). 'fn' should have prototype; + * [static] int fn(ENGINE *e, const char *id); + */ +typedef int (*dynamic_bind_engine) (ENGINE *e, const char *id, + const dynamic_fns *fns); +# define IMPLEMENT_DYNAMIC_BIND_FN(fn) \ + OPENSSL_EXPORT \ + int bind_engine(ENGINE *e, const char *id, const dynamic_fns *fns); \ + OPENSSL_EXPORT \ + int bind_engine(ENGINE *e, const char *id, const dynamic_fns *fns) { \ + if(ENGINE_get_static_state() == fns->static_state) goto skip_cbs; \ + if(!CRYPTO_set_mem_functions(fns->mem_fns.malloc_cb, \ + fns->mem_fns.realloc_cb, fns->mem_fns.free_cb)) \ + return 0; \ + CRYPTO_set_locking_callback(fns->lock_fns.lock_locking_cb); \ + CRYPTO_set_add_lock_callback(fns->lock_fns.lock_add_lock_cb); \ + CRYPTO_set_dynlock_create_callback(fns->lock_fns.dynlock_create_cb); \ + CRYPTO_set_dynlock_lock_callback(fns->lock_fns.dynlock_lock_cb); \ + CRYPTO_set_dynlock_destroy_callback(fns->lock_fns.dynlock_destroy_cb); \ + if(!CRYPTO_set_ex_data_implementation(fns->ex_data_fns)) \ + return 0; \ + if(!ERR_set_implementation(fns->err_fns)) return 0; \ + skip_cbs: \ + if(!fn(e,id)) return 0; \ + return 1; } + +/* + * If the loading application (or library) and the loaded ENGINE library + * share the same static data (eg. they're both dynamically linked to the + * same libcrypto.so) we need a way to avoid trying to set system callbacks - + * this would fail, and for the same reason that it's unnecessary to try. If + * the loaded ENGINE has (or gets from through the loader) its own copy of + * the libcrypto static data, we will need to set the callbacks. The easiest + * way to detect this is to have a function that returns a pointer to some + * static data and let the loading application and loaded ENGINE compare + * their respective values. + */ +void *ENGINE_get_static_state(void); + +# if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(HAVE_CRYPTODEV) +void ENGINE_setup_bsd_cryptodev(void); +# endif + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_ENGINE_strings(void); + +/* Error codes for the ENGINE functions. */ + +/* Function codes. */ +# define ENGINE_F_DYNAMIC_CTRL 180 +# define ENGINE_F_DYNAMIC_GET_DATA_CTX 181 +# define ENGINE_F_DYNAMIC_LOAD 182 +# define ENGINE_F_DYNAMIC_SET_DATA_CTX 183 +# define ENGINE_F_ENGINE_ADD 105 +# define ENGINE_F_ENGINE_BY_ID 106 +# define ENGINE_F_ENGINE_CMD_IS_EXECUTABLE 170 +# define ENGINE_F_ENGINE_CTRL 142 +# define ENGINE_F_ENGINE_CTRL_CMD 178 +# define ENGINE_F_ENGINE_CTRL_CMD_STRING 171 +# define ENGINE_F_ENGINE_FINISH 107 +# define ENGINE_F_ENGINE_FREE_UTIL 108 +# define ENGINE_F_ENGINE_GET_CIPHER 185 +# define ENGINE_F_ENGINE_GET_DEFAULT_TYPE 177 +# define ENGINE_F_ENGINE_GET_DIGEST 186 +# define ENGINE_F_ENGINE_GET_NEXT 115 +# define ENGINE_F_ENGINE_GET_PKEY_ASN1_METH 193 +# define ENGINE_F_ENGINE_GET_PKEY_METH 192 +# define ENGINE_F_ENGINE_GET_PREV 116 +# define ENGINE_F_ENGINE_INIT 119 +# define ENGINE_F_ENGINE_LIST_ADD 120 +# define ENGINE_F_ENGINE_LIST_REMOVE 121 +# define ENGINE_F_ENGINE_LOAD_PRIVATE_KEY 150 +# define ENGINE_F_ENGINE_LOAD_PUBLIC_KEY 151 +# define ENGINE_F_ENGINE_LOAD_SSL_CLIENT_CERT 194 +# define ENGINE_F_ENGINE_NEW 122 +# define ENGINE_F_ENGINE_REMOVE 123 +# define ENGINE_F_ENGINE_SET_DEFAULT_STRING 189 +# define ENGINE_F_ENGINE_SET_DEFAULT_TYPE 126 +# define ENGINE_F_ENGINE_SET_ID 129 +# define ENGINE_F_ENGINE_SET_NAME 130 +# define ENGINE_F_ENGINE_TABLE_REGISTER 184 +# define ENGINE_F_ENGINE_UNLOAD_KEY 152 +# define ENGINE_F_ENGINE_UNLOCKED_FINISH 191 +# define ENGINE_F_ENGINE_UP_REF 190 +# define ENGINE_F_INT_CTRL_HELPER 172 +# define ENGINE_F_INT_ENGINE_CONFIGURE 188 +# define ENGINE_F_INT_ENGINE_MODULE_INIT 187 +# define ENGINE_F_LOG_MESSAGE 141 + +/* Reason codes. */ +# define ENGINE_R_ALREADY_LOADED 100 +# define ENGINE_R_ARGUMENT_IS_NOT_A_NUMBER 133 +# define ENGINE_R_CMD_NOT_EXECUTABLE 134 +# define ENGINE_R_COMMAND_TAKES_INPUT 135 +# define ENGINE_R_COMMAND_TAKES_NO_INPUT 136 +# define ENGINE_R_CONFLICTING_ENGINE_ID 103 +# define ENGINE_R_CTRL_COMMAND_NOT_IMPLEMENTED 119 +# define ENGINE_R_DH_NOT_IMPLEMENTED 139 +# define ENGINE_R_DSA_NOT_IMPLEMENTED 140 +# define ENGINE_R_DSO_FAILURE 104 +# define ENGINE_R_DSO_NOT_FOUND 132 +# define ENGINE_R_ENGINES_SECTION_ERROR 148 +# define ENGINE_R_ENGINE_CONFIGURATION_ERROR 102 +# define ENGINE_R_ENGINE_IS_NOT_IN_LIST 105 +# define ENGINE_R_ENGINE_SECTION_ERROR 149 +# define ENGINE_R_FAILED_LOADING_PRIVATE_KEY 128 +# define ENGINE_R_FAILED_LOADING_PUBLIC_KEY 129 +# define ENGINE_R_FINISH_FAILED 106 +# define ENGINE_R_GET_HANDLE_FAILED 107 +# define ENGINE_R_ID_OR_NAME_MISSING 108 +# define ENGINE_R_INIT_FAILED 109 +# define ENGINE_R_INTERNAL_LIST_ERROR 110 +# define ENGINE_R_INVALID_ARGUMENT 143 +# define ENGINE_R_INVALID_CMD_NAME 137 +# define ENGINE_R_INVALID_CMD_NUMBER 138 +# define ENGINE_R_INVALID_INIT_VALUE 151 +# define ENGINE_R_INVALID_STRING 150 +# define ENGINE_R_NOT_INITIALISED 117 +# define ENGINE_R_NOT_LOADED 112 +# define ENGINE_R_NO_CONTROL_FUNCTION 120 +# define ENGINE_R_NO_INDEX 144 +# define ENGINE_R_NO_LOAD_FUNCTION 125 +# define ENGINE_R_NO_REFERENCE 130 +# define ENGINE_R_NO_SUCH_ENGINE 116 +# define ENGINE_R_NO_UNLOAD_FUNCTION 126 +# define ENGINE_R_PROVIDE_PARAMETERS 113 +# define ENGINE_R_RSA_NOT_IMPLEMENTED 141 +# define ENGINE_R_UNIMPLEMENTED_CIPHER 146 +# define ENGINE_R_UNIMPLEMENTED_DIGEST 147 +# define ENGINE_R_UNIMPLEMENTED_PUBLIC_KEY_METHOD 101 +# define ENGINE_R_VERSION_INCOMPATIBILITY 145 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/err.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/err.h new file mode 100644 index 0000000..585aa8b --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/err.h @@ -0,0 +1,389 @@ +/* crypto/err/err.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ +/* ==================================================================== + * Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_ERR_H +# define HEADER_ERR_H + +# include + +# ifndef OPENSSL_NO_FP_API +# include +# include +# endif + +# include +# ifndef OPENSSL_NO_BIO +# include +# endif +# ifndef OPENSSL_NO_LHASH +# include +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +# ifndef OPENSSL_NO_ERR +# define ERR_PUT_error(a,b,c,d,e) ERR_put_error(a,b,c,d,e) +# else +# define ERR_PUT_error(a,b,c,d,e) ERR_put_error(a,b,c,NULL,0) +# endif + +# include + +# define ERR_TXT_MALLOCED 0x01 +# define ERR_TXT_STRING 0x02 + +# define ERR_FLAG_MARK 0x01 + +# define ERR_NUM_ERRORS 16 +typedef struct err_state_st { + CRYPTO_THREADID tid; + int err_flags[ERR_NUM_ERRORS]; + unsigned long err_buffer[ERR_NUM_ERRORS]; + char *err_data[ERR_NUM_ERRORS]; + int err_data_flags[ERR_NUM_ERRORS]; + const char *err_file[ERR_NUM_ERRORS]; + int err_line[ERR_NUM_ERRORS]; + int top, bottom; +} ERR_STATE; + +/* library */ +# define ERR_LIB_NONE 1 +# define ERR_LIB_SYS 2 +# define ERR_LIB_BN 3 +# define ERR_LIB_RSA 4 +# define ERR_LIB_DH 5 +# define ERR_LIB_EVP 6 +# define ERR_LIB_BUF 7 +# define ERR_LIB_OBJ 8 +# define ERR_LIB_PEM 9 +# define ERR_LIB_DSA 10 +# define ERR_LIB_X509 11 +/* #define ERR_LIB_METH 12 */ +# define ERR_LIB_ASN1 13 +# define ERR_LIB_CONF 14 +# define ERR_LIB_CRYPTO 15 +# define ERR_LIB_EC 16 +# define ERR_LIB_SSL 20 +/* #define ERR_LIB_SSL23 21 */ +/* #define ERR_LIB_SSL2 22 */ +/* #define ERR_LIB_SSL3 23 */ +/* #define ERR_LIB_RSAREF 30 */ +/* #define ERR_LIB_PROXY 31 */ +# define ERR_LIB_BIO 32 +# define ERR_LIB_PKCS7 33 +# define ERR_LIB_X509V3 34 +# define ERR_LIB_PKCS12 35 +# define ERR_LIB_RAND 36 +# define ERR_LIB_DSO 37 +# define ERR_LIB_ENGINE 38 +# define ERR_LIB_OCSP 39 +# define ERR_LIB_UI 40 +# define ERR_LIB_COMP 41 +# define ERR_LIB_ECDSA 42 +# define ERR_LIB_ECDH 43 +# define ERR_LIB_STORE 44 +# define ERR_LIB_FIPS 45 +# define ERR_LIB_CMS 46 +# define ERR_LIB_TS 47 +# define ERR_LIB_HMAC 48 +# define ERR_LIB_JPAKE 49 + +# define ERR_LIB_USER 128 + +# define SYSerr(f,r) ERR_PUT_error(ERR_LIB_SYS,(f),(r),__FILE__,__LINE__) +# define BNerr(f,r) ERR_PUT_error(ERR_LIB_BN,(f),(r),__FILE__,__LINE__) +# define RSAerr(f,r) ERR_PUT_error(ERR_LIB_RSA,(f),(r),__FILE__,__LINE__) +# define DHerr(f,r) ERR_PUT_error(ERR_LIB_DH,(f),(r),__FILE__,__LINE__) +# define EVPerr(f,r) ERR_PUT_error(ERR_LIB_EVP,(f),(r),__FILE__,__LINE__) +# define BUFerr(f,r) ERR_PUT_error(ERR_LIB_BUF,(f),(r),__FILE__,__LINE__) +# define OBJerr(f,r) ERR_PUT_error(ERR_LIB_OBJ,(f),(r),__FILE__,__LINE__) +# define PEMerr(f,r) ERR_PUT_error(ERR_LIB_PEM,(f),(r),__FILE__,__LINE__) +# define DSAerr(f,r) ERR_PUT_error(ERR_LIB_DSA,(f),(r),__FILE__,__LINE__) +# define X509err(f,r) ERR_PUT_error(ERR_LIB_X509,(f),(r),__FILE__,__LINE__) +# define ASN1err(f,r) ERR_PUT_error(ERR_LIB_ASN1,(f),(r),__FILE__,__LINE__) +# define CONFerr(f,r) ERR_PUT_error(ERR_LIB_CONF,(f),(r),__FILE__,__LINE__) +# define CRYPTOerr(f,r) ERR_PUT_error(ERR_LIB_CRYPTO,(f),(r),__FILE__,__LINE__) +# define ECerr(f,r) ERR_PUT_error(ERR_LIB_EC,(f),(r),__FILE__,__LINE__) +# define SSLerr(f,r) ERR_PUT_error(ERR_LIB_SSL,(f),(r),__FILE__,__LINE__) +# define BIOerr(f,r) ERR_PUT_error(ERR_LIB_BIO,(f),(r),__FILE__,__LINE__) +# define PKCS7err(f,r) ERR_PUT_error(ERR_LIB_PKCS7,(f),(r),__FILE__,__LINE__) +# define X509V3err(f,r) ERR_PUT_error(ERR_LIB_X509V3,(f),(r),__FILE__,__LINE__) +# define PKCS12err(f,r) ERR_PUT_error(ERR_LIB_PKCS12,(f),(r),__FILE__,__LINE__) +# define RANDerr(f,r) ERR_PUT_error(ERR_LIB_RAND,(f),(r),__FILE__,__LINE__) +# define DSOerr(f,r) ERR_PUT_error(ERR_LIB_DSO,(f),(r),__FILE__,__LINE__) +# define ENGINEerr(f,r) ERR_PUT_error(ERR_LIB_ENGINE,(f),(r),__FILE__,__LINE__) +# define OCSPerr(f,r) ERR_PUT_error(ERR_LIB_OCSP,(f),(r),__FILE__,__LINE__) +# define UIerr(f,r) ERR_PUT_error(ERR_LIB_UI,(f),(r),__FILE__,__LINE__) +# define COMPerr(f,r) ERR_PUT_error(ERR_LIB_COMP,(f),(r),__FILE__,__LINE__) +# define ECDSAerr(f,r) ERR_PUT_error(ERR_LIB_ECDSA,(f),(r),__FILE__,__LINE__) +# define ECDHerr(f,r) ERR_PUT_error(ERR_LIB_ECDH,(f),(r),__FILE__,__LINE__) +# define STOREerr(f,r) ERR_PUT_error(ERR_LIB_STORE,(f),(r),__FILE__,__LINE__) +# define FIPSerr(f,r) ERR_PUT_error(ERR_LIB_FIPS,(f),(r),__FILE__,__LINE__) +# define CMSerr(f,r) ERR_PUT_error(ERR_LIB_CMS,(f),(r),__FILE__,__LINE__) +# define TSerr(f,r) ERR_PUT_error(ERR_LIB_TS,(f),(r),__FILE__,__LINE__) +# define HMACerr(f,r) ERR_PUT_error(ERR_LIB_HMAC,(f),(r),__FILE__,__LINE__) +# define JPAKEerr(f,r) ERR_PUT_error(ERR_LIB_JPAKE,(f),(r),__FILE__,__LINE__) + +/* + * Borland C seems too stupid to be able to shift and do longs in the + * pre-processor :-( + */ +# define ERR_PACK(l,f,r) (((((unsigned long)l)&0xffL)*0x1000000)| \ + ((((unsigned long)f)&0xfffL)*0x1000)| \ + ((((unsigned long)r)&0xfffL))) +# define ERR_GET_LIB(l) (int)((((unsigned long)l)>>24L)&0xffL) +# define ERR_GET_FUNC(l) (int)((((unsigned long)l)>>12L)&0xfffL) +# define ERR_GET_REASON(l) (int)((l)&0xfffL) +# define ERR_FATAL_ERROR(l) (int)((l)&ERR_R_FATAL) + +/* OS functions */ +# define SYS_F_FOPEN 1 +# define SYS_F_CONNECT 2 +# define SYS_F_GETSERVBYNAME 3 +# define SYS_F_SOCKET 4 +# define SYS_F_IOCTLSOCKET 5 +# define SYS_F_BIND 6 +# define SYS_F_LISTEN 7 +# define SYS_F_ACCEPT 8 +# define SYS_F_WSASTARTUP 9/* Winsock stuff */ +# define SYS_F_OPENDIR 10 +# define SYS_F_FREAD 11 + +/* reasons */ +# define ERR_R_SYS_LIB ERR_LIB_SYS/* 2 */ +# define ERR_R_BN_LIB ERR_LIB_BN/* 3 */ +# define ERR_R_RSA_LIB ERR_LIB_RSA/* 4 */ +# define ERR_R_DH_LIB ERR_LIB_DH/* 5 */ +# define ERR_R_EVP_LIB ERR_LIB_EVP/* 6 */ +# define ERR_R_BUF_LIB ERR_LIB_BUF/* 7 */ +# define ERR_R_OBJ_LIB ERR_LIB_OBJ/* 8 */ +# define ERR_R_PEM_LIB ERR_LIB_PEM/* 9 */ +# define ERR_R_DSA_LIB ERR_LIB_DSA/* 10 */ +# define ERR_R_X509_LIB ERR_LIB_X509/* 11 */ +# define ERR_R_ASN1_LIB ERR_LIB_ASN1/* 13 */ +# define ERR_R_CONF_LIB ERR_LIB_CONF/* 14 */ +# define ERR_R_CRYPTO_LIB ERR_LIB_CRYPTO/* 15 */ +# define ERR_R_EC_LIB ERR_LIB_EC/* 16 */ +# define ERR_R_SSL_LIB ERR_LIB_SSL/* 20 */ +# define ERR_R_BIO_LIB ERR_LIB_BIO/* 32 */ +# define ERR_R_PKCS7_LIB ERR_LIB_PKCS7/* 33 */ +# define ERR_R_X509V3_LIB ERR_LIB_X509V3/* 34 */ +# define ERR_R_PKCS12_LIB ERR_LIB_PKCS12/* 35 */ +# define ERR_R_RAND_LIB ERR_LIB_RAND/* 36 */ +# define ERR_R_DSO_LIB ERR_LIB_DSO/* 37 */ +# define ERR_R_ENGINE_LIB ERR_LIB_ENGINE/* 38 */ +# define ERR_R_OCSP_LIB ERR_LIB_OCSP/* 39 */ +# define ERR_R_UI_LIB ERR_LIB_UI/* 40 */ +# define ERR_R_COMP_LIB ERR_LIB_COMP/* 41 */ +# define ERR_R_ECDSA_LIB ERR_LIB_ECDSA/* 42 */ +# define ERR_R_ECDH_LIB ERR_LIB_ECDH/* 43 */ +# define ERR_R_STORE_LIB ERR_LIB_STORE/* 44 */ +# define ERR_R_TS_LIB ERR_LIB_TS/* 45 */ + +# define ERR_R_NESTED_ASN1_ERROR 58 +# define ERR_R_BAD_ASN1_OBJECT_HEADER 59 +# define ERR_R_BAD_GET_ASN1_OBJECT_CALL 60 +# define ERR_R_EXPECTING_AN_ASN1_SEQUENCE 61 +# define ERR_R_ASN1_LENGTH_MISMATCH 62 +# define ERR_R_MISSING_ASN1_EOS 63 + +/* fatal error */ +# define ERR_R_FATAL 64 +# define ERR_R_MALLOC_FAILURE (1|ERR_R_FATAL) +# define ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED (2|ERR_R_FATAL) +# define ERR_R_PASSED_NULL_PARAMETER (3|ERR_R_FATAL) +# define ERR_R_INTERNAL_ERROR (4|ERR_R_FATAL) +# define ERR_R_DISABLED (5|ERR_R_FATAL) + +/* + * 99 is the maximum possible ERR_R_... code, higher values are reserved for + * the individual libraries + */ + +typedef struct ERR_string_data_st { + unsigned long error; + const char *string; +} ERR_STRING_DATA; + +void ERR_put_error(int lib, int func, int reason, const char *file, int line); +void ERR_set_error_data(char *data, int flags); + +unsigned long ERR_get_error(void); +unsigned long ERR_get_error_line(const char **file, int *line); +unsigned long ERR_get_error_line_data(const char **file, int *line, + const char **data, int *flags); +unsigned long ERR_peek_error(void); +unsigned long ERR_peek_error_line(const char **file, int *line); +unsigned long ERR_peek_error_line_data(const char **file, int *line, + const char **data, int *flags); +unsigned long ERR_peek_last_error(void); +unsigned long ERR_peek_last_error_line(const char **file, int *line); +unsigned long ERR_peek_last_error_line_data(const char **file, int *line, + const char **data, int *flags); +void ERR_clear_error(void); +char *ERR_error_string(unsigned long e, char *buf); +void ERR_error_string_n(unsigned long e, char *buf, size_t len); +const char *ERR_lib_error_string(unsigned long e); +const char *ERR_func_error_string(unsigned long e); +const char *ERR_reason_error_string(unsigned long e); +void ERR_print_errors_cb(int (*cb) (const char *str, size_t len, void *u), + void *u); +# ifndef OPENSSL_NO_FP_API +void ERR_print_errors_fp(FILE *fp); +# endif +# ifndef OPENSSL_NO_BIO +void ERR_print_errors(BIO *bp); +# endif +void ERR_add_error_data(int num, ...); +void ERR_add_error_vdata(int num, va_list args); +void ERR_load_strings(int lib, ERR_STRING_DATA str[]); +void ERR_unload_strings(int lib, ERR_STRING_DATA str[]); +void ERR_load_ERR_strings(void); +void ERR_load_crypto_strings(void); +void ERR_free_strings(void); + +void ERR_remove_thread_state(const CRYPTO_THREADID *tid); +# ifndef OPENSSL_NO_DEPRECATED +void ERR_remove_state(unsigned long pid); /* if zero we look it up */ +# endif +ERR_STATE *ERR_get_state(void); + +# ifndef OPENSSL_NO_LHASH +LHASH_OF(ERR_STRING_DATA) *ERR_get_string_table(void); +LHASH_OF(ERR_STATE) *ERR_get_err_state_table(void); +void ERR_release_err_state_table(LHASH_OF(ERR_STATE) **hash); +# endif + +int ERR_get_next_error_library(void); + +int ERR_set_mark(void); +int ERR_pop_to_mark(void); + +/* Already defined in ossl_typ.h */ +/* typedef struct st_ERR_FNS ERR_FNS; */ +/* + * An application can use this function and provide the return value to + * loaded modules that should use the application's ERR state/functionality + */ +const ERR_FNS *ERR_get_implementation(void); +/* + * A loaded module should call this function prior to any ERR operations + * using the application's "ERR_FNS". + */ +int ERR_set_implementation(const ERR_FNS *fns); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/evp.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/evp.h new file mode 100644 index 0000000..39ab793 --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/evp.h @@ -0,0 +1,1534 @@ +/* crypto/evp/evp.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_ENVELOPE_H +# define HEADER_ENVELOPE_H + +# ifdef OPENSSL_ALGORITHM_DEFINES +# include +# else +# define OPENSSL_ALGORITHM_DEFINES +# include +# undef OPENSSL_ALGORITHM_DEFINES +# endif + +# include + +# include + +# ifndef OPENSSL_NO_BIO +# include +# endif + +/*- +#define EVP_RC2_KEY_SIZE 16 +#define EVP_RC4_KEY_SIZE 16 +#define EVP_BLOWFISH_KEY_SIZE 16 +#define EVP_CAST5_KEY_SIZE 16 +#define EVP_RC5_32_12_16_KEY_SIZE 16 +*/ +# define EVP_MAX_MD_SIZE 64/* longest known is SHA512 */ +# define EVP_MAX_KEY_LENGTH 64 +# define EVP_MAX_IV_LENGTH 16 +# define EVP_MAX_BLOCK_LENGTH 32 + +# define PKCS5_SALT_LEN 8 +/* Default PKCS#5 iteration count */ +# define PKCS5_DEFAULT_ITER 2048 + +# include + +# define EVP_PK_RSA 0x0001 +# define EVP_PK_DSA 0x0002 +# define EVP_PK_DH 0x0004 +# define EVP_PK_EC 0x0008 +# define EVP_PKT_SIGN 0x0010 +# define EVP_PKT_ENC 0x0020 +# define EVP_PKT_EXCH 0x0040 +# define EVP_PKS_RSA 0x0100 +# define EVP_PKS_DSA 0x0200 +# define EVP_PKS_EC 0x0400 + +# define EVP_PKEY_NONE NID_undef +# define EVP_PKEY_RSA NID_rsaEncryption +# define EVP_PKEY_RSA2 NID_rsa +# define EVP_PKEY_DSA NID_dsa +# define EVP_PKEY_DSA1 NID_dsa_2 +# define EVP_PKEY_DSA2 NID_dsaWithSHA +# define EVP_PKEY_DSA3 NID_dsaWithSHA1 +# define EVP_PKEY_DSA4 NID_dsaWithSHA1_2 +# define EVP_PKEY_DH NID_dhKeyAgreement +# define EVP_PKEY_DHX NID_dhpublicnumber +# define EVP_PKEY_EC NID_X9_62_id_ecPublicKey +# define EVP_PKEY_HMAC NID_hmac +# define EVP_PKEY_CMAC NID_cmac + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Type needs to be a bit field Sub-type needs to be for variations on the + * method, as in, can it do arbitrary encryption.... + */ +struct evp_pkey_st { + int type; + int save_type; + int references; + const EVP_PKEY_ASN1_METHOD *ameth; + ENGINE *engine; + union { + char *ptr; +# ifndef OPENSSL_NO_RSA + struct rsa_st *rsa; /* RSA */ +# endif +# ifndef OPENSSL_NO_DSA + struct dsa_st *dsa; /* DSA */ +# endif +# ifndef OPENSSL_NO_DH + struct dh_st *dh; /* DH */ +# endif +# ifndef OPENSSL_NO_EC + struct ec_key_st *ec; /* ECC */ +# endif + } pkey; + int save_parameters; + STACK_OF(X509_ATTRIBUTE) *attributes; /* [ 0 ] */ +} /* EVP_PKEY */ ; + +# define EVP_PKEY_MO_SIGN 0x0001 +# define EVP_PKEY_MO_VERIFY 0x0002 +# define EVP_PKEY_MO_ENCRYPT 0x0004 +# define EVP_PKEY_MO_DECRYPT 0x0008 + +# ifndef EVP_MD +struct env_md_st { + int type; + int pkey_type; + int md_size; + unsigned long flags; + int (*init) (EVP_MD_CTX *ctx); + int (*update) (EVP_MD_CTX *ctx, const void *data, size_t count); + int (*final) (EVP_MD_CTX *ctx, unsigned char *md); + int (*copy) (EVP_MD_CTX *to, const EVP_MD_CTX *from); + int (*cleanup) (EVP_MD_CTX *ctx); + /* FIXME: prototype these some day */ + int (*sign) (int type, const unsigned char *m, unsigned int m_length, + unsigned char *sigret, unsigned int *siglen, void *key); + int (*verify) (int type, const unsigned char *m, unsigned int m_length, + const unsigned char *sigbuf, unsigned int siglen, + void *key); + int required_pkey_type[5]; /* EVP_PKEY_xxx */ + int block_size; + int ctx_size; /* how big does the ctx->md_data need to be */ + /* control function */ + int (*md_ctrl) (EVP_MD_CTX *ctx, int cmd, int p1, void *p2); +} /* EVP_MD */ ; + +typedef int evp_sign_method(int type, const unsigned char *m, + unsigned int m_length, unsigned char *sigret, + unsigned int *siglen, void *key); +typedef int evp_verify_method(int type, const unsigned char *m, + unsigned int m_length, + const unsigned char *sigbuf, + unsigned int siglen, void *key); + +/* digest can only handle a single block */ +# define EVP_MD_FLAG_ONESHOT 0x0001 + +/* + * digest is a "clone" digest used + * which is a copy of an existing + * one for a specific public key type. + * EVP_dss1() etc + */ +# define EVP_MD_FLAG_PKEY_DIGEST 0x0002 + +/* Digest uses EVP_PKEY_METHOD for signing instead of MD specific signing */ + +# define EVP_MD_FLAG_PKEY_METHOD_SIGNATURE 0x0004 + +/* DigestAlgorithmIdentifier flags... */ + +# define EVP_MD_FLAG_DIGALGID_MASK 0x0018 + +/* NULL or absent parameter accepted. Use NULL */ + +# define EVP_MD_FLAG_DIGALGID_NULL 0x0000 + +/* NULL or absent parameter accepted. Use NULL for PKCS#1 otherwise absent */ + +# define EVP_MD_FLAG_DIGALGID_ABSENT 0x0008 + +/* Custom handling via ctrl */ + +# define EVP_MD_FLAG_DIGALGID_CUSTOM 0x0018 + +/* Note if suitable for use in FIPS mode */ +# define EVP_MD_FLAG_FIPS 0x0400 + +/* Digest ctrls */ + +# define EVP_MD_CTRL_DIGALGID 0x1 +# define EVP_MD_CTRL_MICALG 0x2 + +/* Minimum Algorithm specific ctrl value */ + +# define EVP_MD_CTRL_ALG_CTRL 0x1000 + +# define EVP_PKEY_NULL_method NULL,NULL,{0,0,0,0} + +# ifndef OPENSSL_NO_DSA +# define EVP_PKEY_DSA_method (evp_sign_method *)DSA_sign, \ + (evp_verify_method *)DSA_verify, \ + {EVP_PKEY_DSA,EVP_PKEY_DSA2,EVP_PKEY_DSA3, \ + EVP_PKEY_DSA4,0} +# else +# define EVP_PKEY_DSA_method EVP_PKEY_NULL_method +# endif + +# ifndef OPENSSL_NO_ECDSA +# define EVP_PKEY_ECDSA_method (evp_sign_method *)ECDSA_sign, \ + (evp_verify_method *)ECDSA_verify, \ + {EVP_PKEY_EC,0,0,0} +# else +# define EVP_PKEY_ECDSA_method EVP_PKEY_NULL_method +# endif + +# ifndef OPENSSL_NO_RSA +# define EVP_PKEY_RSA_method (evp_sign_method *)RSA_sign, \ + (evp_verify_method *)RSA_verify, \ + {EVP_PKEY_RSA,EVP_PKEY_RSA2,0,0} +# define EVP_PKEY_RSA_ASN1_OCTET_STRING_method \ + (evp_sign_method *)RSA_sign_ASN1_OCTET_STRING, \ + (evp_verify_method *)RSA_verify_ASN1_OCTET_STRING, \ + {EVP_PKEY_RSA,EVP_PKEY_RSA2,0,0} +# else +# define EVP_PKEY_RSA_method EVP_PKEY_NULL_method +# define EVP_PKEY_RSA_ASN1_OCTET_STRING_method EVP_PKEY_NULL_method +# endif + +# endif /* !EVP_MD */ + +struct env_md_ctx_st { + const EVP_MD *digest; + ENGINE *engine; /* functional reference if 'digest' is + * ENGINE-provided */ + unsigned long flags; + void *md_data; + /* Public key context for sign/verify */ + EVP_PKEY_CTX *pctx; + /* Update function: usually copied from EVP_MD */ + int (*update) (EVP_MD_CTX *ctx, const void *data, size_t count); +} /* EVP_MD_CTX */ ; + +/* values for EVP_MD_CTX flags */ + +# define EVP_MD_CTX_FLAG_ONESHOT 0x0001/* digest update will be + * called once only */ +# define EVP_MD_CTX_FLAG_CLEANED 0x0002/* context has already been + * cleaned */ +# define EVP_MD_CTX_FLAG_REUSE 0x0004/* Don't free up ctx->md_data + * in EVP_MD_CTX_cleanup */ +/* + * FIPS and pad options are ignored in 1.0.0, definitions are here so we + * don't accidentally reuse the values for other purposes. + */ + +# define EVP_MD_CTX_FLAG_NON_FIPS_ALLOW 0x0008/* Allow use of non FIPS + * digest in FIPS mode */ + +/* + * The following PAD options are also currently ignored in 1.0.0, digest + * parameters are handled through EVP_DigestSign*() and EVP_DigestVerify*() + * instead. + */ +# define EVP_MD_CTX_FLAG_PAD_MASK 0xF0/* RSA mode to use */ +# define EVP_MD_CTX_FLAG_PAD_PKCS1 0x00/* PKCS#1 v1.5 mode */ +# define EVP_MD_CTX_FLAG_PAD_X931 0x10/* X9.31 mode */ +# define EVP_MD_CTX_FLAG_PAD_PSS 0x20/* PSS mode */ + +# define EVP_MD_CTX_FLAG_NO_INIT 0x0100/* Don't initialize md_data */ + +struct evp_cipher_st { + int nid; + int block_size; + /* Default value for variable length ciphers */ + int key_len; + int iv_len; + /* Various flags */ + unsigned long flags; + /* init key */ + int (*init) (EVP_CIPHER_CTX *ctx, const unsigned char *key, + const unsigned char *iv, int enc); + /* encrypt/decrypt data */ + int (*do_cipher) (EVP_CIPHER_CTX *ctx, unsigned char *out, + const unsigned char *in, size_t inl); + /* cleanup ctx */ + int (*cleanup) (EVP_CIPHER_CTX *); + /* how big ctx->cipher_data needs to be */ + int ctx_size; + /* Populate a ASN1_TYPE with parameters */ + int (*set_asn1_parameters) (EVP_CIPHER_CTX *, ASN1_TYPE *); + /* Get parameters from a ASN1_TYPE */ + int (*get_asn1_parameters) (EVP_CIPHER_CTX *, ASN1_TYPE *); + /* Miscellaneous operations */ + int (*ctrl) (EVP_CIPHER_CTX *, int type, int arg, void *ptr); + /* Application data */ + void *app_data; +} /* EVP_CIPHER */ ; + +/* Values for cipher flags */ + +/* Modes for ciphers */ + +# define EVP_CIPH_STREAM_CIPHER 0x0 +# define EVP_CIPH_ECB_MODE 0x1 +# define EVP_CIPH_CBC_MODE 0x2 +# define EVP_CIPH_CFB_MODE 0x3 +# define EVP_CIPH_OFB_MODE 0x4 +# define EVP_CIPH_CTR_MODE 0x5 +# define EVP_CIPH_GCM_MODE 0x6 +# define EVP_CIPH_CCM_MODE 0x7 +# define EVP_CIPH_XTS_MODE 0x10001 +# define EVP_CIPH_WRAP_MODE 0x10002 +# define EVP_CIPH_MODE 0xF0007 +/* Set if variable length cipher */ +# define EVP_CIPH_VARIABLE_LENGTH 0x8 +/* Set if the iv handling should be done by the cipher itself */ +# define EVP_CIPH_CUSTOM_IV 0x10 +/* Set if the cipher's init() function should be called if key is NULL */ +# define EVP_CIPH_ALWAYS_CALL_INIT 0x20 +/* Call ctrl() to init cipher parameters */ +# define EVP_CIPH_CTRL_INIT 0x40 +/* Don't use standard key length function */ +# define EVP_CIPH_CUSTOM_KEY_LENGTH 0x80 +/* Don't use standard block padding */ +# define EVP_CIPH_NO_PADDING 0x100 +/* cipher handles random key generation */ +# define EVP_CIPH_RAND_KEY 0x200 +/* cipher has its own additional copying logic */ +# define EVP_CIPH_CUSTOM_COPY 0x400 +/* Allow use default ASN1 get/set iv */ +# define EVP_CIPH_FLAG_DEFAULT_ASN1 0x1000 +/* Buffer length in bits not bytes: CFB1 mode only */ +# define EVP_CIPH_FLAG_LENGTH_BITS 0x2000 +/* Note if suitable for use in FIPS mode */ +# define EVP_CIPH_FLAG_FIPS 0x4000 +/* Allow non FIPS cipher in FIPS mode */ +# define EVP_CIPH_FLAG_NON_FIPS_ALLOW 0x8000 +/* + * Cipher handles any and all padding logic as well as finalisation. + */ +# define EVP_CIPH_FLAG_CUSTOM_CIPHER 0x100000 +# define EVP_CIPH_FLAG_AEAD_CIPHER 0x200000 +# define EVP_CIPH_FLAG_TLS1_1_MULTIBLOCK 0x400000 + +/* + * Cipher context flag to indicate we can handle wrap mode: if allowed in + * older applications it could overflow buffers. + */ + +# define EVP_CIPHER_CTX_FLAG_WRAP_ALLOW 0x1 + +/* ctrl() values */ + +# define EVP_CTRL_INIT 0x0 +# define EVP_CTRL_SET_KEY_LENGTH 0x1 +# define EVP_CTRL_GET_RC2_KEY_BITS 0x2 +# define EVP_CTRL_SET_RC2_KEY_BITS 0x3 +# define EVP_CTRL_GET_RC5_ROUNDS 0x4 +# define EVP_CTRL_SET_RC5_ROUNDS 0x5 +# define EVP_CTRL_RAND_KEY 0x6 +# define EVP_CTRL_PBE_PRF_NID 0x7 +# define EVP_CTRL_COPY 0x8 +# define EVP_CTRL_GCM_SET_IVLEN 0x9 +# define EVP_CTRL_GCM_GET_TAG 0x10 +# define EVP_CTRL_GCM_SET_TAG 0x11 +# define EVP_CTRL_GCM_SET_IV_FIXED 0x12 +# define EVP_CTRL_GCM_IV_GEN 0x13 +# define EVP_CTRL_CCM_SET_IVLEN EVP_CTRL_GCM_SET_IVLEN +# define EVP_CTRL_CCM_GET_TAG EVP_CTRL_GCM_GET_TAG +# define EVP_CTRL_CCM_SET_TAG EVP_CTRL_GCM_SET_TAG +# define EVP_CTRL_CCM_SET_L 0x14 +# define EVP_CTRL_CCM_SET_MSGLEN 0x15 +/* + * AEAD cipher deduces payload length and returns number of bytes required to + * store MAC and eventual padding. Subsequent call to EVP_Cipher even + * appends/verifies MAC. + */ +# define EVP_CTRL_AEAD_TLS1_AAD 0x16 +/* Used by composite AEAD ciphers, no-op in GCM, CCM... */ +# define EVP_CTRL_AEAD_SET_MAC_KEY 0x17 +/* Set the GCM invocation field, decrypt only */ +# define EVP_CTRL_GCM_SET_IV_INV 0x18 + +# define EVP_CTRL_TLS1_1_MULTIBLOCK_AAD 0x19 +# define EVP_CTRL_TLS1_1_MULTIBLOCK_ENCRYPT 0x1a +# define EVP_CTRL_TLS1_1_MULTIBLOCK_DECRYPT 0x1b +# define EVP_CTRL_TLS1_1_MULTIBLOCK_MAX_BUFSIZE 0x1c + +/* RFC 5246 defines additional data to be 13 bytes in length */ +# define EVP_AEAD_TLS1_AAD_LEN 13 + +typedef struct { + unsigned char *out; + const unsigned char *inp; + size_t len; + unsigned int interleave; +} EVP_CTRL_TLS1_1_MULTIBLOCK_PARAM; + +/* GCM TLS constants */ +/* Length of fixed part of IV derived from PRF */ +# define EVP_GCM_TLS_FIXED_IV_LEN 4 +/* Length of explicit part of IV part of TLS records */ +# define EVP_GCM_TLS_EXPLICIT_IV_LEN 8 +/* Length of tag for TLS */ +# define EVP_GCM_TLS_TAG_LEN 16 + +typedef struct evp_cipher_info_st { + const EVP_CIPHER *cipher; + unsigned char iv[EVP_MAX_IV_LENGTH]; +} EVP_CIPHER_INFO; + +struct evp_cipher_ctx_st { + const EVP_CIPHER *cipher; + ENGINE *engine; /* functional reference if 'cipher' is + * ENGINE-provided */ + int encrypt; /* encrypt or decrypt */ + int buf_len; /* number we have left */ + unsigned char oiv[EVP_MAX_IV_LENGTH]; /* original iv */ + unsigned char iv[EVP_MAX_IV_LENGTH]; /* working iv */ + unsigned char buf[EVP_MAX_BLOCK_LENGTH]; /* saved partial block */ + int num; /* used by cfb/ofb/ctr mode */ + void *app_data; /* application stuff */ + int key_len; /* May change for variable length cipher */ + unsigned long flags; /* Various flags */ + void *cipher_data; /* per EVP data */ + int final_used; + int block_mask; + unsigned char final[EVP_MAX_BLOCK_LENGTH]; /* possible final block */ +} /* EVP_CIPHER_CTX */ ; + +typedef struct evp_Encode_Ctx_st { + /* number saved in a partial encode/decode */ + int num; + /* + * The length is either the output line length (in input bytes) or the + * shortest input line length that is ok. Once decoding begins, the + * length is adjusted up each time a longer line is decoded + */ + int length; + /* data to encode */ + unsigned char enc_data[80]; + /* number read on current line */ + int line_num; + int expect_nl; +} EVP_ENCODE_CTX; + +/* Password based encryption function */ +typedef int (EVP_PBE_KEYGEN) (EVP_CIPHER_CTX *ctx, const char *pass, + int passlen, ASN1_TYPE *param, + const EVP_CIPHER *cipher, const EVP_MD *md, + int en_de); + +# ifndef OPENSSL_NO_RSA +# define EVP_PKEY_assign_RSA(pkey,rsa) EVP_PKEY_assign((pkey),EVP_PKEY_RSA,\ + (char *)(rsa)) +# endif + +# ifndef OPENSSL_NO_DSA +# define EVP_PKEY_assign_DSA(pkey,dsa) EVP_PKEY_assign((pkey),EVP_PKEY_DSA,\ + (char *)(dsa)) +# endif + +# ifndef OPENSSL_NO_DH +# define EVP_PKEY_assign_DH(pkey,dh) EVP_PKEY_assign((pkey),EVP_PKEY_DH,\ + (char *)(dh)) +# endif + +# ifndef OPENSSL_NO_EC +# define EVP_PKEY_assign_EC_KEY(pkey,eckey) EVP_PKEY_assign((pkey),EVP_PKEY_EC,\ + (char *)(eckey)) +# endif + +/* Add some extra combinations */ +# define EVP_get_digestbynid(a) EVP_get_digestbyname(OBJ_nid2sn(a)) +# define EVP_get_digestbyobj(a) EVP_get_digestbynid(OBJ_obj2nid(a)) +# define EVP_get_cipherbynid(a) EVP_get_cipherbyname(OBJ_nid2sn(a)) +# define EVP_get_cipherbyobj(a) EVP_get_cipherbynid(OBJ_obj2nid(a)) + +int EVP_MD_type(const EVP_MD *md); +# define EVP_MD_nid(e) EVP_MD_type(e) +# define EVP_MD_name(e) OBJ_nid2sn(EVP_MD_nid(e)) +int EVP_MD_pkey_type(const EVP_MD *md); +int EVP_MD_size(const EVP_MD *md); +int EVP_MD_block_size(const EVP_MD *md); +unsigned long EVP_MD_flags(const EVP_MD *md); + +const EVP_MD *EVP_MD_CTX_md(const EVP_MD_CTX *ctx); +# define EVP_MD_CTX_size(e) EVP_MD_size(EVP_MD_CTX_md(e)) +# define EVP_MD_CTX_block_size(e) EVP_MD_block_size(EVP_MD_CTX_md(e)) +# define EVP_MD_CTX_type(e) EVP_MD_type(EVP_MD_CTX_md(e)) + +int EVP_CIPHER_nid(const EVP_CIPHER *cipher); +# define EVP_CIPHER_name(e) OBJ_nid2sn(EVP_CIPHER_nid(e)) +int EVP_CIPHER_block_size(const EVP_CIPHER *cipher); +int EVP_CIPHER_key_length(const EVP_CIPHER *cipher); +int EVP_CIPHER_iv_length(const EVP_CIPHER *cipher); +unsigned long EVP_CIPHER_flags(const EVP_CIPHER *cipher); +# define EVP_CIPHER_mode(e) (EVP_CIPHER_flags(e) & EVP_CIPH_MODE) + +const EVP_CIPHER *EVP_CIPHER_CTX_cipher(const EVP_CIPHER_CTX *ctx); +int EVP_CIPHER_CTX_nid(const EVP_CIPHER_CTX *ctx); +int EVP_CIPHER_CTX_block_size(const EVP_CIPHER_CTX *ctx); +int EVP_CIPHER_CTX_key_length(const EVP_CIPHER_CTX *ctx); +int EVP_CIPHER_CTX_iv_length(const EVP_CIPHER_CTX *ctx); +int EVP_CIPHER_CTX_copy(EVP_CIPHER_CTX *out, const EVP_CIPHER_CTX *in); +void *EVP_CIPHER_CTX_get_app_data(const EVP_CIPHER_CTX *ctx); +void EVP_CIPHER_CTX_set_app_data(EVP_CIPHER_CTX *ctx, void *data); +# define EVP_CIPHER_CTX_type(c) EVP_CIPHER_type(EVP_CIPHER_CTX_cipher(c)) +unsigned long EVP_CIPHER_CTX_flags(const EVP_CIPHER_CTX *ctx); +# define EVP_CIPHER_CTX_mode(e) (EVP_CIPHER_CTX_flags(e) & EVP_CIPH_MODE) + +# define EVP_ENCODE_LENGTH(l) (((l+2)/3*4)+(l/48+1)*2+80) +# define EVP_DECODE_LENGTH(l) ((l+3)/4*3+80) + +# define EVP_SignInit_ex(a,b,c) EVP_DigestInit_ex(a,b,c) +# define EVP_SignInit(a,b) EVP_DigestInit(a,b) +# define EVP_SignUpdate(a,b,c) EVP_DigestUpdate(a,b,c) +# define EVP_VerifyInit_ex(a,b,c) EVP_DigestInit_ex(a,b,c) +# define EVP_VerifyInit(a,b) EVP_DigestInit(a,b) +# define EVP_VerifyUpdate(a,b,c) EVP_DigestUpdate(a,b,c) +# define EVP_OpenUpdate(a,b,c,d,e) EVP_DecryptUpdate(a,b,c,d,e) +# define EVP_SealUpdate(a,b,c,d,e) EVP_EncryptUpdate(a,b,c,d,e) +# define EVP_DigestSignUpdate(a,b,c) EVP_DigestUpdate(a,b,c) +# define EVP_DigestVerifyUpdate(a,b,c) EVP_DigestUpdate(a,b,c) + +# ifdef CONST_STRICT +void BIO_set_md(BIO *, const EVP_MD *md); +# else +# define BIO_set_md(b,md) BIO_ctrl(b,BIO_C_SET_MD,0,(char *)md) +# endif +# define BIO_get_md(b,mdp) BIO_ctrl(b,BIO_C_GET_MD,0,(char *)mdp) +# define BIO_get_md_ctx(b,mdcp) BIO_ctrl(b,BIO_C_GET_MD_CTX,0,(char *)mdcp) +# define BIO_set_md_ctx(b,mdcp) BIO_ctrl(b,BIO_C_SET_MD_CTX,0,(char *)mdcp) +# define BIO_get_cipher_status(b) BIO_ctrl(b,BIO_C_GET_CIPHER_STATUS,0,NULL) +# define BIO_get_cipher_ctx(b,c_pp) BIO_ctrl(b,BIO_C_GET_CIPHER_CTX,0,(char *)c_pp) + +int EVP_Cipher(EVP_CIPHER_CTX *c, + unsigned char *out, const unsigned char *in, unsigned int inl); + +# define EVP_add_cipher_alias(n,alias) \ + OBJ_NAME_add((alias),OBJ_NAME_TYPE_CIPHER_METH|OBJ_NAME_ALIAS,(n)) +# define EVP_add_digest_alias(n,alias) \ + OBJ_NAME_add((alias),OBJ_NAME_TYPE_MD_METH|OBJ_NAME_ALIAS,(n)) +# define EVP_delete_cipher_alias(alias) \ + OBJ_NAME_remove(alias,OBJ_NAME_TYPE_CIPHER_METH|OBJ_NAME_ALIAS); +# define EVP_delete_digest_alias(alias) \ + OBJ_NAME_remove(alias,OBJ_NAME_TYPE_MD_METH|OBJ_NAME_ALIAS); + +void EVP_MD_CTX_init(EVP_MD_CTX *ctx); +int EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx); +EVP_MD_CTX *EVP_MD_CTX_create(void); +void EVP_MD_CTX_destroy(EVP_MD_CTX *ctx); +int EVP_MD_CTX_copy_ex(EVP_MD_CTX *out, const EVP_MD_CTX *in); +void EVP_MD_CTX_set_flags(EVP_MD_CTX *ctx, int flags); +void EVP_MD_CTX_clear_flags(EVP_MD_CTX *ctx, int flags); +int EVP_MD_CTX_test_flags(const EVP_MD_CTX *ctx, int flags); +int EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl); +int EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *d, size_t cnt); +int EVP_DigestFinal_ex(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *s); +int EVP_Digest(const void *data, size_t count, + unsigned char *md, unsigned int *size, const EVP_MD *type, + ENGINE *impl); + +int EVP_MD_CTX_copy(EVP_MD_CTX *out, const EVP_MD_CTX *in); +int EVP_DigestInit(EVP_MD_CTX *ctx, const EVP_MD *type); +int EVP_DigestFinal(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *s); + +int EVP_read_pw_string(char *buf, int length, const char *prompt, int verify); +int EVP_read_pw_string_min(char *buf, int minlen, int maxlen, + const char *prompt, int verify); +void EVP_set_pw_prompt(const char *prompt); +char *EVP_get_pw_prompt(void); + +int EVP_BytesToKey(const EVP_CIPHER *type, const EVP_MD *md, + const unsigned char *salt, const unsigned char *data, + int datal, int count, unsigned char *key, + unsigned char *iv); + +void EVP_CIPHER_CTX_set_flags(EVP_CIPHER_CTX *ctx, int flags); +void EVP_CIPHER_CTX_clear_flags(EVP_CIPHER_CTX *ctx, int flags); +int EVP_CIPHER_CTX_test_flags(const EVP_CIPHER_CTX *ctx, int flags); + +int EVP_EncryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, + const unsigned char *key, const unsigned char *iv); +int EVP_EncryptInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, + ENGINE *impl, const unsigned char *key, + const unsigned char *iv); +int EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, + const unsigned char *in, int inl); +int EVP_EncryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl); +int EVP_EncryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl); + +int EVP_DecryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, + const unsigned char *key, const unsigned char *iv); +int EVP_DecryptInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, + ENGINE *impl, const unsigned char *key, + const unsigned char *iv); +int EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, + const unsigned char *in, int inl); +int EVP_DecryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *outm, int *outl); +int EVP_DecryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *outm, int *outl); + +int EVP_CipherInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, + const unsigned char *key, const unsigned char *iv, + int enc); +int EVP_CipherInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, + ENGINE *impl, const unsigned char *key, + const unsigned char *iv, int enc); +int EVP_CipherUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, + const unsigned char *in, int inl); +int EVP_CipherFinal(EVP_CIPHER_CTX *ctx, unsigned char *outm, int *outl); +int EVP_CipherFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *outm, int *outl); + +int EVP_SignFinal(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *s, + EVP_PKEY *pkey); + +int EVP_VerifyFinal(EVP_MD_CTX *ctx, const unsigned char *sigbuf, + unsigned int siglen, EVP_PKEY *pkey); + +int EVP_DigestSignInit(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx, + const EVP_MD *type, ENGINE *e, EVP_PKEY *pkey); +int EVP_DigestSignFinal(EVP_MD_CTX *ctx, + unsigned char *sigret, size_t *siglen); + +int EVP_DigestVerifyInit(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx, + const EVP_MD *type, ENGINE *e, EVP_PKEY *pkey); +int EVP_DigestVerifyFinal(EVP_MD_CTX *ctx, + const unsigned char *sig, size_t siglen); + +int EVP_OpenInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type, + const unsigned char *ek, int ekl, const unsigned char *iv, + EVP_PKEY *priv); +int EVP_OpenFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl); + +int EVP_SealInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type, + unsigned char **ek, int *ekl, unsigned char *iv, + EVP_PKEY **pubk, int npubk); +int EVP_SealFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl); + +void EVP_EncodeInit(EVP_ENCODE_CTX *ctx); +void EVP_EncodeUpdate(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl, + const unsigned char *in, int inl); +void EVP_EncodeFinal(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl); +int EVP_EncodeBlock(unsigned char *t, const unsigned char *f, int n); + +void EVP_DecodeInit(EVP_ENCODE_CTX *ctx); +int EVP_DecodeUpdate(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl, + const unsigned char *in, int inl); +int EVP_DecodeFinal(EVP_ENCODE_CTX *ctx, unsigned + char *out, int *outl); +int EVP_DecodeBlock(unsigned char *t, const unsigned char *f, int n); + +void EVP_CIPHER_CTX_init(EVP_CIPHER_CTX *a); +int EVP_CIPHER_CTX_cleanup(EVP_CIPHER_CTX *a); +EVP_CIPHER_CTX *EVP_CIPHER_CTX_new(void); +void EVP_CIPHER_CTX_free(EVP_CIPHER_CTX *a); +int EVP_CIPHER_CTX_set_key_length(EVP_CIPHER_CTX *x, int keylen); +int EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX *c, int pad); +int EVP_CIPHER_CTX_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr); +int EVP_CIPHER_CTX_rand_key(EVP_CIPHER_CTX *ctx, unsigned char *key); + +# ifndef OPENSSL_NO_BIO +BIO_METHOD *BIO_f_md(void); +BIO_METHOD *BIO_f_base64(void); +BIO_METHOD *BIO_f_cipher(void); +BIO_METHOD *BIO_f_reliable(void); +void BIO_set_cipher(BIO *b, const EVP_CIPHER *c, const unsigned char *k, + const unsigned char *i, int enc); +# endif + +const EVP_MD *EVP_md_null(void); +# ifndef OPENSSL_NO_MD2 +const EVP_MD *EVP_md2(void); +# endif +# ifndef OPENSSL_NO_MD4 +const EVP_MD *EVP_md4(void); +# endif +# ifndef OPENSSL_NO_MD5 +const EVP_MD *EVP_md5(void); +# endif +# ifndef OPENSSL_NO_SHA +const EVP_MD *EVP_sha(void); +const EVP_MD *EVP_sha1(void); +const EVP_MD *EVP_dss(void); +const EVP_MD *EVP_dss1(void); +const EVP_MD *EVP_ecdsa(void); +# endif +# ifndef OPENSSL_NO_SHA256 +const EVP_MD *EVP_sha224(void); +const EVP_MD *EVP_sha256(void); +# endif +# ifndef OPENSSL_NO_SHA512 +const EVP_MD *EVP_sha384(void); +const EVP_MD *EVP_sha512(void); +# endif +# ifndef OPENSSL_NO_MDC2 +const EVP_MD *EVP_mdc2(void); +# endif +# ifndef OPENSSL_NO_RIPEMD +const EVP_MD *EVP_ripemd160(void); +# endif +# ifndef OPENSSL_NO_WHIRLPOOL +const EVP_MD *EVP_whirlpool(void); +# endif +const EVP_CIPHER *EVP_enc_null(void); /* does nothing :-) */ +# ifndef OPENSSL_NO_DES +const EVP_CIPHER *EVP_des_ecb(void); +const EVP_CIPHER *EVP_des_ede(void); +const EVP_CIPHER *EVP_des_ede3(void); +const EVP_CIPHER *EVP_des_ede_ecb(void); +const EVP_CIPHER *EVP_des_ede3_ecb(void); +const EVP_CIPHER *EVP_des_cfb64(void); +# define EVP_des_cfb EVP_des_cfb64 +const EVP_CIPHER *EVP_des_cfb1(void); +const EVP_CIPHER *EVP_des_cfb8(void); +const EVP_CIPHER *EVP_des_ede_cfb64(void); +# define EVP_des_ede_cfb EVP_des_ede_cfb64 +# if 0 +const EVP_CIPHER *EVP_des_ede_cfb1(void); +const EVP_CIPHER *EVP_des_ede_cfb8(void); +# endif +const EVP_CIPHER *EVP_des_ede3_cfb64(void); +# define EVP_des_ede3_cfb EVP_des_ede3_cfb64 +const EVP_CIPHER *EVP_des_ede3_cfb1(void); +const EVP_CIPHER *EVP_des_ede3_cfb8(void); +const EVP_CIPHER *EVP_des_ofb(void); +const EVP_CIPHER *EVP_des_ede_ofb(void); +const EVP_CIPHER *EVP_des_ede3_ofb(void); +const EVP_CIPHER *EVP_des_cbc(void); +const EVP_CIPHER *EVP_des_ede_cbc(void); +const EVP_CIPHER *EVP_des_ede3_cbc(void); +const EVP_CIPHER *EVP_desx_cbc(void); +const EVP_CIPHER *EVP_des_ede3_wrap(void); +/* + * This should now be supported through the dev_crypto ENGINE. But also, why + * are rc4 and md5 declarations made here inside a "NO_DES" precompiler + * branch? + */ +# if 0 +# ifdef OPENSSL_OPENBSD_DEV_CRYPTO +const EVP_CIPHER *EVP_dev_crypto_des_ede3_cbc(void); +const EVP_CIPHER *EVP_dev_crypto_rc4(void); +const EVP_MD *EVP_dev_crypto_md5(void); +# endif +# endif +# endif +# ifndef OPENSSL_NO_RC4 +const EVP_CIPHER *EVP_rc4(void); +const EVP_CIPHER *EVP_rc4_40(void); +# ifndef OPENSSL_NO_MD5 +const EVP_CIPHER *EVP_rc4_hmac_md5(void); +# endif +# endif +# ifndef OPENSSL_NO_IDEA +const EVP_CIPHER *EVP_idea_ecb(void); +const EVP_CIPHER *EVP_idea_cfb64(void); +# define EVP_idea_cfb EVP_idea_cfb64 +const EVP_CIPHER *EVP_idea_ofb(void); +const EVP_CIPHER *EVP_idea_cbc(void); +# endif +# ifndef OPENSSL_NO_RC2 +const EVP_CIPHER *EVP_rc2_ecb(void); +const EVP_CIPHER *EVP_rc2_cbc(void); +const EVP_CIPHER *EVP_rc2_40_cbc(void); +const EVP_CIPHER *EVP_rc2_64_cbc(void); +const EVP_CIPHER *EVP_rc2_cfb64(void); +# define EVP_rc2_cfb EVP_rc2_cfb64 +const EVP_CIPHER *EVP_rc2_ofb(void); +# endif +# ifndef OPENSSL_NO_BF +const EVP_CIPHER *EVP_bf_ecb(void); +const EVP_CIPHER *EVP_bf_cbc(void); +const EVP_CIPHER *EVP_bf_cfb64(void); +# define EVP_bf_cfb EVP_bf_cfb64 +const EVP_CIPHER *EVP_bf_ofb(void); +# endif +# ifndef OPENSSL_NO_CAST +const EVP_CIPHER *EVP_cast5_ecb(void); +const EVP_CIPHER *EVP_cast5_cbc(void); +const EVP_CIPHER *EVP_cast5_cfb64(void); +# define EVP_cast5_cfb EVP_cast5_cfb64 +const EVP_CIPHER *EVP_cast5_ofb(void); +# endif +# ifndef OPENSSL_NO_RC5 +const EVP_CIPHER *EVP_rc5_32_12_16_cbc(void); +const EVP_CIPHER *EVP_rc5_32_12_16_ecb(void); +const EVP_CIPHER *EVP_rc5_32_12_16_cfb64(void); +# define EVP_rc5_32_12_16_cfb EVP_rc5_32_12_16_cfb64 +const EVP_CIPHER *EVP_rc5_32_12_16_ofb(void); +# endif +# ifndef OPENSSL_NO_AES +const EVP_CIPHER *EVP_aes_128_ecb(void); +const EVP_CIPHER *EVP_aes_128_cbc(void); +const EVP_CIPHER *EVP_aes_128_cfb1(void); +const EVP_CIPHER *EVP_aes_128_cfb8(void); +const EVP_CIPHER *EVP_aes_128_cfb128(void); +# define EVP_aes_128_cfb EVP_aes_128_cfb128 +const EVP_CIPHER *EVP_aes_128_ofb(void); +const EVP_CIPHER *EVP_aes_128_ctr(void); +const EVP_CIPHER *EVP_aes_128_ccm(void); +const EVP_CIPHER *EVP_aes_128_gcm(void); +const EVP_CIPHER *EVP_aes_128_xts(void); +const EVP_CIPHER *EVP_aes_128_wrap(void); +const EVP_CIPHER *EVP_aes_192_ecb(void); +const EVP_CIPHER *EVP_aes_192_cbc(void); +const EVP_CIPHER *EVP_aes_192_cfb1(void); +const EVP_CIPHER *EVP_aes_192_cfb8(void); +const EVP_CIPHER *EVP_aes_192_cfb128(void); +# define EVP_aes_192_cfb EVP_aes_192_cfb128 +const EVP_CIPHER *EVP_aes_192_ofb(void); +const EVP_CIPHER *EVP_aes_192_ctr(void); +const EVP_CIPHER *EVP_aes_192_ccm(void); +const EVP_CIPHER *EVP_aes_192_gcm(void); +const EVP_CIPHER *EVP_aes_192_wrap(void); +const EVP_CIPHER *EVP_aes_256_ecb(void); +const EVP_CIPHER *EVP_aes_256_cbc(void); +const EVP_CIPHER *EVP_aes_256_cfb1(void); +const EVP_CIPHER *EVP_aes_256_cfb8(void); +const EVP_CIPHER *EVP_aes_256_cfb128(void); +# define EVP_aes_256_cfb EVP_aes_256_cfb128 +const EVP_CIPHER *EVP_aes_256_ofb(void); +const EVP_CIPHER *EVP_aes_256_ctr(void); +const EVP_CIPHER *EVP_aes_256_ccm(void); +const EVP_CIPHER *EVP_aes_256_gcm(void); +const EVP_CIPHER *EVP_aes_256_xts(void); +const EVP_CIPHER *EVP_aes_256_wrap(void); +# if !defined(OPENSSL_NO_SHA) && !defined(OPENSSL_NO_SHA1) +const EVP_CIPHER *EVP_aes_128_cbc_hmac_sha1(void); +const EVP_CIPHER *EVP_aes_256_cbc_hmac_sha1(void); +# endif +# ifndef OPENSSL_NO_SHA256 +const EVP_CIPHER *EVP_aes_128_cbc_hmac_sha256(void); +const EVP_CIPHER *EVP_aes_256_cbc_hmac_sha256(void); +# endif +# endif +# ifndef OPENSSL_NO_CAMELLIA +const EVP_CIPHER *EVP_camellia_128_ecb(void); +const EVP_CIPHER *EVP_camellia_128_cbc(void); +const EVP_CIPHER *EVP_camellia_128_cfb1(void); +const EVP_CIPHER *EVP_camellia_128_cfb8(void); +const EVP_CIPHER *EVP_camellia_128_cfb128(void); +# define EVP_camellia_128_cfb EVP_camellia_128_cfb128 +const EVP_CIPHER *EVP_camellia_128_ofb(void); +const EVP_CIPHER *EVP_camellia_192_ecb(void); +const EVP_CIPHER *EVP_camellia_192_cbc(void); +const EVP_CIPHER *EVP_camellia_192_cfb1(void); +const EVP_CIPHER *EVP_camellia_192_cfb8(void); +const EVP_CIPHER *EVP_camellia_192_cfb128(void); +# define EVP_camellia_192_cfb EVP_camellia_192_cfb128 +const EVP_CIPHER *EVP_camellia_192_ofb(void); +const EVP_CIPHER *EVP_camellia_256_ecb(void); +const EVP_CIPHER *EVP_camellia_256_cbc(void); +const EVP_CIPHER *EVP_camellia_256_cfb1(void); +const EVP_CIPHER *EVP_camellia_256_cfb8(void); +const EVP_CIPHER *EVP_camellia_256_cfb128(void); +# define EVP_camellia_256_cfb EVP_camellia_256_cfb128 +const EVP_CIPHER *EVP_camellia_256_ofb(void); +# endif + +# ifndef OPENSSL_NO_SEED +const EVP_CIPHER *EVP_seed_ecb(void); +const EVP_CIPHER *EVP_seed_cbc(void); +const EVP_CIPHER *EVP_seed_cfb128(void); +# define EVP_seed_cfb EVP_seed_cfb128 +const EVP_CIPHER *EVP_seed_ofb(void); +# endif + +void OPENSSL_add_all_algorithms_noconf(void); +void OPENSSL_add_all_algorithms_conf(void); + +# ifdef OPENSSL_LOAD_CONF +# define OpenSSL_add_all_algorithms() \ + OPENSSL_add_all_algorithms_conf() +# else +# define OpenSSL_add_all_algorithms() \ + OPENSSL_add_all_algorithms_noconf() +# endif + +void OpenSSL_add_all_ciphers(void); +void OpenSSL_add_all_digests(void); +# define SSLeay_add_all_algorithms() OpenSSL_add_all_algorithms() +# define SSLeay_add_all_ciphers() OpenSSL_add_all_ciphers() +# define SSLeay_add_all_digests() OpenSSL_add_all_digests() + +int EVP_add_cipher(const EVP_CIPHER *cipher); +int EVP_add_digest(const EVP_MD *digest); + +const EVP_CIPHER *EVP_get_cipherbyname(const char *name); +const EVP_MD *EVP_get_digestbyname(const char *name); +void EVP_cleanup(void); + +void EVP_CIPHER_do_all(void (*fn) (const EVP_CIPHER *ciph, + const char *from, const char *to, void *x), + void *arg); +void EVP_CIPHER_do_all_sorted(void (*fn) + (const EVP_CIPHER *ciph, const char *from, + const char *to, void *x), void *arg); + +void EVP_MD_do_all(void (*fn) (const EVP_MD *ciph, + const char *from, const char *to, void *x), + void *arg); +void EVP_MD_do_all_sorted(void (*fn) + (const EVP_MD *ciph, const char *from, + const char *to, void *x), void *arg); + +int EVP_PKEY_decrypt_old(unsigned char *dec_key, + const unsigned char *enc_key, int enc_key_len, + EVP_PKEY *private_key); +int EVP_PKEY_encrypt_old(unsigned char *enc_key, + const unsigned char *key, int key_len, + EVP_PKEY *pub_key); +int EVP_PKEY_type(int type); +int EVP_PKEY_id(const EVP_PKEY *pkey); +int EVP_PKEY_base_id(const EVP_PKEY *pkey); +int EVP_PKEY_bits(EVP_PKEY *pkey); +int EVP_PKEY_size(EVP_PKEY *pkey); +int EVP_PKEY_set_type(EVP_PKEY *pkey, int type); +int EVP_PKEY_set_type_str(EVP_PKEY *pkey, const char *str, int len); +int EVP_PKEY_assign(EVP_PKEY *pkey, int type, void *key); +void *EVP_PKEY_get0(EVP_PKEY *pkey); + +# ifndef OPENSSL_NO_RSA +struct rsa_st; +int EVP_PKEY_set1_RSA(EVP_PKEY *pkey, struct rsa_st *key); +struct rsa_st *EVP_PKEY_get1_RSA(EVP_PKEY *pkey); +# endif +# ifndef OPENSSL_NO_DSA +struct dsa_st; +int EVP_PKEY_set1_DSA(EVP_PKEY *pkey, struct dsa_st *key); +struct dsa_st *EVP_PKEY_get1_DSA(EVP_PKEY *pkey); +# endif +# ifndef OPENSSL_NO_DH +struct dh_st; +int EVP_PKEY_set1_DH(EVP_PKEY *pkey, struct dh_st *key); +struct dh_st *EVP_PKEY_get1_DH(EVP_PKEY *pkey); +# endif +# ifndef OPENSSL_NO_EC +struct ec_key_st; +int EVP_PKEY_set1_EC_KEY(EVP_PKEY *pkey, struct ec_key_st *key); +struct ec_key_st *EVP_PKEY_get1_EC_KEY(EVP_PKEY *pkey); +# endif + +EVP_PKEY *EVP_PKEY_new(void); +void EVP_PKEY_free(EVP_PKEY *pkey); + +EVP_PKEY *d2i_PublicKey(int type, EVP_PKEY **a, const unsigned char **pp, + long length); +int i2d_PublicKey(EVP_PKEY *a, unsigned char **pp); + +EVP_PKEY *d2i_PrivateKey(int type, EVP_PKEY **a, const unsigned char **pp, + long length); +EVP_PKEY *d2i_AutoPrivateKey(EVP_PKEY **a, const unsigned char **pp, + long length); +int i2d_PrivateKey(EVP_PKEY *a, unsigned char **pp); + +int EVP_PKEY_copy_parameters(EVP_PKEY *to, const EVP_PKEY *from); +int EVP_PKEY_missing_parameters(const EVP_PKEY *pkey); +int EVP_PKEY_save_parameters(EVP_PKEY *pkey, int mode); +int EVP_PKEY_cmp_parameters(const EVP_PKEY *a, const EVP_PKEY *b); + +int EVP_PKEY_cmp(const EVP_PKEY *a, const EVP_PKEY *b); + +int EVP_PKEY_print_public(BIO *out, const EVP_PKEY *pkey, + int indent, ASN1_PCTX *pctx); +int EVP_PKEY_print_private(BIO *out, const EVP_PKEY *pkey, + int indent, ASN1_PCTX *pctx); +int EVP_PKEY_print_params(BIO *out, const EVP_PKEY *pkey, + int indent, ASN1_PCTX *pctx); + +int EVP_PKEY_get_default_digest_nid(EVP_PKEY *pkey, int *pnid); + +int EVP_CIPHER_type(const EVP_CIPHER *ctx); + +/* calls methods */ +int EVP_CIPHER_param_to_asn1(EVP_CIPHER_CTX *c, ASN1_TYPE *type); +int EVP_CIPHER_asn1_to_param(EVP_CIPHER_CTX *c, ASN1_TYPE *type); + +/* These are used by EVP_CIPHER methods */ +int EVP_CIPHER_set_asn1_iv(EVP_CIPHER_CTX *c, ASN1_TYPE *type); +int EVP_CIPHER_get_asn1_iv(EVP_CIPHER_CTX *c, ASN1_TYPE *type); + +/* PKCS5 password based encryption */ +int PKCS5_PBE_keyivgen(EVP_CIPHER_CTX *ctx, const char *pass, int passlen, + ASN1_TYPE *param, const EVP_CIPHER *cipher, + const EVP_MD *md, int en_de); +int PKCS5_PBKDF2_HMAC_SHA1(const char *pass, int passlen, + const unsigned char *salt, int saltlen, int iter, + int keylen, unsigned char *out); +int PKCS5_PBKDF2_HMAC(const char *pass, int passlen, + const unsigned char *salt, int saltlen, int iter, + const EVP_MD *digest, int keylen, unsigned char *out); +int PKCS5_v2_PBE_keyivgen(EVP_CIPHER_CTX *ctx, const char *pass, int passlen, + ASN1_TYPE *param, const EVP_CIPHER *cipher, + const EVP_MD *md, int en_de); + +void PKCS5_PBE_add(void); + +int EVP_PBE_CipherInit(ASN1_OBJECT *pbe_obj, const char *pass, int passlen, + ASN1_TYPE *param, EVP_CIPHER_CTX *ctx, int en_de); + +/* PBE type */ + +/* Can appear as the outermost AlgorithmIdentifier */ +# define EVP_PBE_TYPE_OUTER 0x0 +/* Is an PRF type OID */ +# define EVP_PBE_TYPE_PRF 0x1 + +int EVP_PBE_alg_add_type(int pbe_type, int pbe_nid, int cipher_nid, + int md_nid, EVP_PBE_KEYGEN *keygen); +int EVP_PBE_alg_add(int nid, const EVP_CIPHER *cipher, const EVP_MD *md, + EVP_PBE_KEYGEN *keygen); +int EVP_PBE_find(int type, int pbe_nid, int *pcnid, int *pmnid, + EVP_PBE_KEYGEN **pkeygen); +void EVP_PBE_cleanup(void); + +# define ASN1_PKEY_ALIAS 0x1 +# define ASN1_PKEY_DYNAMIC 0x2 +# define ASN1_PKEY_SIGPARAM_NULL 0x4 + +# define ASN1_PKEY_CTRL_PKCS7_SIGN 0x1 +# define ASN1_PKEY_CTRL_PKCS7_ENCRYPT 0x2 +# define ASN1_PKEY_CTRL_DEFAULT_MD_NID 0x3 +# define ASN1_PKEY_CTRL_CMS_SIGN 0x5 +# define ASN1_PKEY_CTRL_CMS_ENVELOPE 0x7 +# define ASN1_PKEY_CTRL_CMS_RI_TYPE 0x8 + +int EVP_PKEY_asn1_get_count(void); +const EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_get0(int idx); +const EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_find(ENGINE **pe, int type); +const EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_find_str(ENGINE **pe, + const char *str, int len); +int EVP_PKEY_asn1_add0(const EVP_PKEY_ASN1_METHOD *ameth); +int EVP_PKEY_asn1_add_alias(int to, int from); +int EVP_PKEY_asn1_get0_info(int *ppkey_id, int *pkey_base_id, + int *ppkey_flags, const char **pinfo, + const char **ppem_str, + const EVP_PKEY_ASN1_METHOD *ameth); + +const EVP_PKEY_ASN1_METHOD *EVP_PKEY_get0_asn1(EVP_PKEY *pkey); +EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_new(int id, int flags, + const char *pem_str, + const char *info); +void EVP_PKEY_asn1_copy(EVP_PKEY_ASN1_METHOD *dst, + const EVP_PKEY_ASN1_METHOD *src); +void EVP_PKEY_asn1_free(EVP_PKEY_ASN1_METHOD *ameth); +void EVP_PKEY_asn1_set_public(EVP_PKEY_ASN1_METHOD *ameth, + int (*pub_decode) (EVP_PKEY *pk, + X509_PUBKEY *pub), + int (*pub_encode) (X509_PUBKEY *pub, + const EVP_PKEY *pk), + int (*pub_cmp) (const EVP_PKEY *a, + const EVP_PKEY *b), + int (*pub_print) (BIO *out, + const EVP_PKEY *pkey, + int indent, ASN1_PCTX *pctx), + int (*pkey_size) (const EVP_PKEY *pk), + int (*pkey_bits) (const EVP_PKEY *pk)); +void EVP_PKEY_asn1_set_private(EVP_PKEY_ASN1_METHOD *ameth, + int (*priv_decode) (EVP_PKEY *pk, + PKCS8_PRIV_KEY_INFO + *p8inf), + int (*priv_encode) (PKCS8_PRIV_KEY_INFO *p8, + const EVP_PKEY *pk), + int (*priv_print) (BIO *out, + const EVP_PKEY *pkey, + int indent, + ASN1_PCTX *pctx)); +void EVP_PKEY_asn1_set_param(EVP_PKEY_ASN1_METHOD *ameth, + int (*param_decode) (EVP_PKEY *pkey, + const unsigned char **pder, + int derlen), + int (*param_encode) (const EVP_PKEY *pkey, + unsigned char **pder), + int (*param_missing) (const EVP_PKEY *pk), + int (*param_copy) (EVP_PKEY *to, + const EVP_PKEY *from), + int (*param_cmp) (const EVP_PKEY *a, + const EVP_PKEY *b), + int (*param_print) (BIO *out, + const EVP_PKEY *pkey, + int indent, + ASN1_PCTX *pctx)); + +void EVP_PKEY_asn1_set_free(EVP_PKEY_ASN1_METHOD *ameth, + void (*pkey_free) (EVP_PKEY *pkey)); +void EVP_PKEY_asn1_set_ctrl(EVP_PKEY_ASN1_METHOD *ameth, + int (*pkey_ctrl) (EVP_PKEY *pkey, int op, + long arg1, void *arg2)); +void EVP_PKEY_asn1_set_item(EVP_PKEY_ASN1_METHOD *ameth, + int (*item_verify) (EVP_MD_CTX *ctx, + const ASN1_ITEM *it, + void *asn, + X509_ALGOR *a, + ASN1_BIT_STRING *sig, + EVP_PKEY *pkey), + int (*item_sign) (EVP_MD_CTX *ctx, + const ASN1_ITEM *it, + void *asn, + X509_ALGOR *alg1, + X509_ALGOR *alg2, + ASN1_BIT_STRING *sig)); + +# define EVP_PKEY_OP_UNDEFINED 0 +# define EVP_PKEY_OP_PARAMGEN (1<<1) +# define EVP_PKEY_OP_KEYGEN (1<<2) +# define EVP_PKEY_OP_SIGN (1<<3) +# define EVP_PKEY_OP_VERIFY (1<<4) +# define EVP_PKEY_OP_VERIFYRECOVER (1<<5) +# define EVP_PKEY_OP_SIGNCTX (1<<6) +# define EVP_PKEY_OP_VERIFYCTX (1<<7) +# define EVP_PKEY_OP_ENCRYPT (1<<8) +# define EVP_PKEY_OP_DECRYPT (1<<9) +# define EVP_PKEY_OP_DERIVE (1<<10) + +# define EVP_PKEY_OP_TYPE_SIG \ + (EVP_PKEY_OP_SIGN | EVP_PKEY_OP_VERIFY | EVP_PKEY_OP_VERIFYRECOVER \ + | EVP_PKEY_OP_SIGNCTX | EVP_PKEY_OP_VERIFYCTX) + +# define EVP_PKEY_OP_TYPE_CRYPT \ + (EVP_PKEY_OP_ENCRYPT | EVP_PKEY_OP_DECRYPT) + +# define EVP_PKEY_OP_TYPE_NOGEN \ + (EVP_PKEY_OP_SIG | EVP_PKEY_OP_CRYPT | EVP_PKEY_OP_DERIVE) + +# define EVP_PKEY_OP_TYPE_GEN \ + (EVP_PKEY_OP_PARAMGEN | EVP_PKEY_OP_KEYGEN) + +# define EVP_PKEY_CTX_set_signature_md(ctx, md) \ + EVP_PKEY_CTX_ctrl(ctx, -1, EVP_PKEY_OP_TYPE_SIG, \ + EVP_PKEY_CTRL_MD, 0, (void *)md) + +# define EVP_PKEY_CTX_get_signature_md(ctx, pmd) \ + EVP_PKEY_CTX_ctrl(ctx, -1, EVP_PKEY_OP_TYPE_SIG, \ + EVP_PKEY_CTRL_GET_MD, 0, (void *)pmd) + +# define EVP_PKEY_CTRL_MD 1 +# define EVP_PKEY_CTRL_PEER_KEY 2 + +# define EVP_PKEY_CTRL_PKCS7_ENCRYPT 3 +# define EVP_PKEY_CTRL_PKCS7_DECRYPT 4 + +# define EVP_PKEY_CTRL_PKCS7_SIGN 5 + +# define EVP_PKEY_CTRL_SET_MAC_KEY 6 + +# define EVP_PKEY_CTRL_DIGESTINIT 7 + +/* Used by GOST key encryption in TLS */ +# define EVP_PKEY_CTRL_SET_IV 8 + +# define EVP_PKEY_CTRL_CMS_ENCRYPT 9 +# define EVP_PKEY_CTRL_CMS_DECRYPT 10 +# define EVP_PKEY_CTRL_CMS_SIGN 11 + +# define EVP_PKEY_CTRL_CIPHER 12 + +# define EVP_PKEY_CTRL_GET_MD 13 + +# define EVP_PKEY_ALG_CTRL 0x1000 + +# define EVP_PKEY_FLAG_AUTOARGLEN 2 +/* + * Method handles all operations: don't assume any digest related defaults. + */ +# define EVP_PKEY_FLAG_SIGCTX_CUSTOM 4 + +const EVP_PKEY_METHOD *EVP_PKEY_meth_find(int type); +EVP_PKEY_METHOD *EVP_PKEY_meth_new(int id, int flags); +void EVP_PKEY_meth_get0_info(int *ppkey_id, int *pflags, + const EVP_PKEY_METHOD *meth); +void EVP_PKEY_meth_copy(EVP_PKEY_METHOD *dst, const EVP_PKEY_METHOD *src); +void EVP_PKEY_meth_free(EVP_PKEY_METHOD *pmeth); +int EVP_PKEY_meth_add0(const EVP_PKEY_METHOD *pmeth); + +EVP_PKEY_CTX *EVP_PKEY_CTX_new(EVP_PKEY *pkey, ENGINE *e); +EVP_PKEY_CTX *EVP_PKEY_CTX_new_id(int id, ENGINE *e); +EVP_PKEY_CTX *EVP_PKEY_CTX_dup(EVP_PKEY_CTX *ctx); +void EVP_PKEY_CTX_free(EVP_PKEY_CTX *ctx); + +int EVP_PKEY_CTX_ctrl(EVP_PKEY_CTX *ctx, int keytype, int optype, + int cmd, int p1, void *p2); +int EVP_PKEY_CTX_ctrl_str(EVP_PKEY_CTX *ctx, const char *type, + const char *value); + +int EVP_PKEY_CTX_get_operation(EVP_PKEY_CTX *ctx); +void EVP_PKEY_CTX_set0_keygen_info(EVP_PKEY_CTX *ctx, int *dat, int datlen); + +EVP_PKEY *EVP_PKEY_new_mac_key(int type, ENGINE *e, + const unsigned char *key, int keylen); + +void EVP_PKEY_CTX_set_data(EVP_PKEY_CTX *ctx, void *data); +void *EVP_PKEY_CTX_get_data(EVP_PKEY_CTX *ctx); +EVP_PKEY *EVP_PKEY_CTX_get0_pkey(EVP_PKEY_CTX *ctx); + +EVP_PKEY *EVP_PKEY_CTX_get0_peerkey(EVP_PKEY_CTX *ctx); + +void EVP_PKEY_CTX_set_app_data(EVP_PKEY_CTX *ctx, void *data); +void *EVP_PKEY_CTX_get_app_data(EVP_PKEY_CTX *ctx); + +int EVP_PKEY_sign_init(EVP_PKEY_CTX *ctx); +int EVP_PKEY_sign(EVP_PKEY_CTX *ctx, + unsigned char *sig, size_t *siglen, + const unsigned char *tbs, size_t tbslen); +int EVP_PKEY_verify_init(EVP_PKEY_CTX *ctx); +int EVP_PKEY_verify(EVP_PKEY_CTX *ctx, + const unsigned char *sig, size_t siglen, + const unsigned char *tbs, size_t tbslen); +int EVP_PKEY_verify_recover_init(EVP_PKEY_CTX *ctx); +int EVP_PKEY_verify_recover(EVP_PKEY_CTX *ctx, + unsigned char *rout, size_t *routlen, + const unsigned char *sig, size_t siglen); +int EVP_PKEY_encrypt_init(EVP_PKEY_CTX *ctx); +int EVP_PKEY_encrypt(EVP_PKEY_CTX *ctx, + unsigned char *out, size_t *outlen, + const unsigned char *in, size_t inlen); +int EVP_PKEY_decrypt_init(EVP_PKEY_CTX *ctx); +int EVP_PKEY_decrypt(EVP_PKEY_CTX *ctx, + unsigned char *out, size_t *outlen, + const unsigned char *in, size_t inlen); + +int EVP_PKEY_derive_init(EVP_PKEY_CTX *ctx); +int EVP_PKEY_derive_set_peer(EVP_PKEY_CTX *ctx, EVP_PKEY *peer); +int EVP_PKEY_derive(EVP_PKEY_CTX *ctx, unsigned char *key, size_t *keylen); + +typedef int EVP_PKEY_gen_cb (EVP_PKEY_CTX *ctx); + +int EVP_PKEY_paramgen_init(EVP_PKEY_CTX *ctx); +int EVP_PKEY_paramgen(EVP_PKEY_CTX *ctx, EVP_PKEY **ppkey); +int EVP_PKEY_keygen_init(EVP_PKEY_CTX *ctx); +int EVP_PKEY_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY **ppkey); + +void EVP_PKEY_CTX_set_cb(EVP_PKEY_CTX *ctx, EVP_PKEY_gen_cb *cb); +EVP_PKEY_gen_cb *EVP_PKEY_CTX_get_cb(EVP_PKEY_CTX *ctx); + +int EVP_PKEY_CTX_get_keygen_info(EVP_PKEY_CTX *ctx, int idx); + +void EVP_PKEY_meth_set_init(EVP_PKEY_METHOD *pmeth, + int (*init) (EVP_PKEY_CTX *ctx)); + +void EVP_PKEY_meth_set_copy(EVP_PKEY_METHOD *pmeth, + int (*copy) (EVP_PKEY_CTX *dst, + EVP_PKEY_CTX *src)); + +void EVP_PKEY_meth_set_cleanup(EVP_PKEY_METHOD *pmeth, + void (*cleanup) (EVP_PKEY_CTX *ctx)); + +void EVP_PKEY_meth_set_paramgen(EVP_PKEY_METHOD *pmeth, + int (*paramgen_init) (EVP_PKEY_CTX *ctx), + int (*paramgen) (EVP_PKEY_CTX *ctx, + EVP_PKEY *pkey)); + +void EVP_PKEY_meth_set_keygen(EVP_PKEY_METHOD *pmeth, + int (*keygen_init) (EVP_PKEY_CTX *ctx), + int (*keygen) (EVP_PKEY_CTX *ctx, + EVP_PKEY *pkey)); + +void EVP_PKEY_meth_set_sign(EVP_PKEY_METHOD *pmeth, + int (*sign_init) (EVP_PKEY_CTX *ctx), + int (*sign) (EVP_PKEY_CTX *ctx, + unsigned char *sig, size_t *siglen, + const unsigned char *tbs, + size_t tbslen)); + +void EVP_PKEY_meth_set_verify(EVP_PKEY_METHOD *pmeth, + int (*verify_init) (EVP_PKEY_CTX *ctx), + int (*verify) (EVP_PKEY_CTX *ctx, + const unsigned char *sig, + size_t siglen, + const unsigned char *tbs, + size_t tbslen)); + +void EVP_PKEY_meth_set_verify_recover(EVP_PKEY_METHOD *pmeth, + int (*verify_recover_init) (EVP_PKEY_CTX + *ctx), + int (*verify_recover) (EVP_PKEY_CTX + *ctx, + unsigned char + *sig, + size_t *siglen, + const unsigned + char *tbs, + size_t tbslen)); + +void EVP_PKEY_meth_set_signctx(EVP_PKEY_METHOD *pmeth, + int (*signctx_init) (EVP_PKEY_CTX *ctx, + EVP_MD_CTX *mctx), + int (*signctx) (EVP_PKEY_CTX *ctx, + unsigned char *sig, + size_t *siglen, + EVP_MD_CTX *mctx)); + +void EVP_PKEY_meth_set_verifyctx(EVP_PKEY_METHOD *pmeth, + int (*verifyctx_init) (EVP_PKEY_CTX *ctx, + EVP_MD_CTX *mctx), + int (*verifyctx) (EVP_PKEY_CTX *ctx, + const unsigned char *sig, + int siglen, + EVP_MD_CTX *mctx)); + +void EVP_PKEY_meth_set_encrypt(EVP_PKEY_METHOD *pmeth, + int (*encrypt_init) (EVP_PKEY_CTX *ctx), + int (*encryptfn) (EVP_PKEY_CTX *ctx, + unsigned char *out, + size_t *outlen, + const unsigned char *in, + size_t inlen)); + +void EVP_PKEY_meth_set_decrypt(EVP_PKEY_METHOD *pmeth, + int (*decrypt_init) (EVP_PKEY_CTX *ctx), + int (*decrypt) (EVP_PKEY_CTX *ctx, + unsigned char *out, + size_t *outlen, + const unsigned char *in, + size_t inlen)); + +void EVP_PKEY_meth_set_derive(EVP_PKEY_METHOD *pmeth, + int (*derive_init) (EVP_PKEY_CTX *ctx), + int (*derive) (EVP_PKEY_CTX *ctx, + unsigned char *key, + size_t *keylen)); + +void EVP_PKEY_meth_set_ctrl(EVP_PKEY_METHOD *pmeth, + int (*ctrl) (EVP_PKEY_CTX *ctx, int type, int p1, + void *p2), + int (*ctrl_str) (EVP_PKEY_CTX *ctx, + const char *type, + const char *value)); + +void EVP_add_alg_module(void); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_EVP_strings(void); + +/* Error codes for the EVP functions. */ + +/* Function codes. */ +# define EVP_F_AESNI_INIT_KEY 165 +# define EVP_F_AESNI_XTS_CIPHER 176 +# define EVP_F_AES_INIT_KEY 133 +# define EVP_F_AES_T4_INIT_KEY 178 +# define EVP_F_AES_XTS 172 +# define EVP_F_AES_XTS_CIPHER 175 +# define EVP_F_ALG_MODULE_INIT 177 +# define EVP_F_CAMELLIA_INIT_KEY 159 +# define EVP_F_CMAC_INIT 173 +# define EVP_F_CMLL_T4_INIT_KEY 179 +# define EVP_F_D2I_PKEY 100 +# define EVP_F_DO_SIGVER_INIT 161 +# define EVP_F_DSAPKEY2PKCS8 134 +# define EVP_F_DSA_PKEY2PKCS8 135 +# define EVP_F_ECDSA_PKEY2PKCS8 129 +# define EVP_F_ECKEY_PKEY2PKCS8 132 +# define EVP_F_EVP_CIPHERINIT_EX 123 +# define EVP_F_EVP_CIPHER_CTX_COPY 163 +# define EVP_F_EVP_CIPHER_CTX_CTRL 124 +# define EVP_F_EVP_CIPHER_CTX_SET_KEY_LENGTH 122 +# define EVP_F_EVP_DECRYPTFINAL_EX 101 +# define EVP_F_EVP_DIGESTINIT_EX 128 +# define EVP_F_EVP_ENCRYPTFINAL_EX 127 +# define EVP_F_EVP_MD_CTX_COPY_EX 110 +# define EVP_F_EVP_MD_SIZE 162 +# define EVP_F_EVP_OPENINIT 102 +# define EVP_F_EVP_PBE_ALG_ADD 115 +# define EVP_F_EVP_PBE_ALG_ADD_TYPE 160 +# define EVP_F_EVP_PBE_CIPHERINIT 116 +# define EVP_F_EVP_PKCS82PKEY 111 +# define EVP_F_EVP_PKCS82PKEY_BROKEN 136 +# define EVP_F_EVP_PKEY2PKCS8_BROKEN 113 +# define EVP_F_EVP_PKEY_COPY_PARAMETERS 103 +# define EVP_F_EVP_PKEY_CTX_CTRL 137 +# define EVP_F_EVP_PKEY_CTX_CTRL_STR 150 +# define EVP_F_EVP_PKEY_CTX_DUP 156 +# define EVP_F_EVP_PKEY_DECRYPT 104 +# define EVP_F_EVP_PKEY_DECRYPT_INIT 138 +# define EVP_F_EVP_PKEY_DECRYPT_OLD 151 +# define EVP_F_EVP_PKEY_DERIVE 153 +# define EVP_F_EVP_PKEY_DERIVE_INIT 154 +# define EVP_F_EVP_PKEY_DERIVE_SET_PEER 155 +# define EVP_F_EVP_PKEY_ENCRYPT 105 +# define EVP_F_EVP_PKEY_ENCRYPT_INIT 139 +# define EVP_F_EVP_PKEY_ENCRYPT_OLD 152 +# define EVP_F_EVP_PKEY_GET1_DH 119 +# define EVP_F_EVP_PKEY_GET1_DSA 120 +# define EVP_F_EVP_PKEY_GET1_ECDSA 130 +# define EVP_F_EVP_PKEY_GET1_EC_KEY 131 +# define EVP_F_EVP_PKEY_GET1_RSA 121 +# define EVP_F_EVP_PKEY_KEYGEN 146 +# define EVP_F_EVP_PKEY_KEYGEN_INIT 147 +# define EVP_F_EVP_PKEY_NEW 106 +# define EVP_F_EVP_PKEY_PARAMGEN 148 +# define EVP_F_EVP_PKEY_PARAMGEN_INIT 149 +# define EVP_F_EVP_PKEY_SIGN 140 +# define EVP_F_EVP_PKEY_SIGN_INIT 141 +# define EVP_F_EVP_PKEY_VERIFY 142 +# define EVP_F_EVP_PKEY_VERIFY_INIT 143 +# define EVP_F_EVP_PKEY_VERIFY_RECOVER 144 +# define EVP_F_EVP_PKEY_VERIFY_RECOVER_INIT 145 +# define EVP_F_EVP_RIJNDAEL 126 +# define EVP_F_EVP_SIGNFINAL 107 +# define EVP_F_EVP_VERIFYFINAL 108 +# define EVP_F_FIPS_CIPHERINIT 166 +# define EVP_F_FIPS_CIPHER_CTX_COPY 170 +# define EVP_F_FIPS_CIPHER_CTX_CTRL 167 +# define EVP_F_FIPS_CIPHER_CTX_SET_KEY_LENGTH 171 +# define EVP_F_FIPS_DIGESTINIT 168 +# define EVP_F_FIPS_MD_CTX_COPY 169 +# define EVP_F_HMAC_INIT_EX 174 +# define EVP_F_INT_CTX_NEW 157 +# define EVP_F_PKCS5_PBE_KEYIVGEN 117 +# define EVP_F_PKCS5_V2_PBE_KEYIVGEN 118 +# define EVP_F_PKCS5_V2_PBKDF2_KEYIVGEN 164 +# define EVP_F_PKCS8_SET_BROKEN 112 +# define EVP_F_PKEY_SET_TYPE 158 +# define EVP_F_RC2_MAGIC_TO_METH 109 +# define EVP_F_RC5_CTRL 125 + +/* Reason codes. */ +# define EVP_R_AES_IV_SETUP_FAILED 162 +# define EVP_R_AES_KEY_SETUP_FAILED 143 +# define EVP_R_ASN1_LIB 140 +# define EVP_R_BAD_BLOCK_LENGTH 136 +# define EVP_R_BAD_DECRYPT 100 +# define EVP_R_BAD_KEY_LENGTH 137 +# define EVP_R_BN_DECODE_ERROR 112 +# define EVP_R_BN_PUBKEY_ERROR 113 +# define EVP_R_BUFFER_TOO_SMALL 155 +# define EVP_R_CAMELLIA_KEY_SETUP_FAILED 157 +# define EVP_R_CIPHER_PARAMETER_ERROR 122 +# define EVP_R_COMMAND_NOT_SUPPORTED 147 +# define EVP_R_CTRL_NOT_IMPLEMENTED 132 +# define EVP_R_CTRL_OPERATION_NOT_IMPLEMENTED 133 +# define EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH 138 +# define EVP_R_DECODE_ERROR 114 +# define EVP_R_DIFFERENT_KEY_TYPES 101 +# define EVP_R_DIFFERENT_PARAMETERS 153 +# define EVP_R_DISABLED_FOR_FIPS 163 +# define EVP_R_ENCODE_ERROR 115 +# define EVP_R_ERROR_LOADING_SECTION 165 +# define EVP_R_ERROR_SETTING_FIPS_MODE 166 +# define EVP_R_EVP_PBE_CIPHERINIT_ERROR 119 +# define EVP_R_EXPECTING_AN_RSA_KEY 127 +# define EVP_R_EXPECTING_A_DH_KEY 128 +# define EVP_R_EXPECTING_A_DSA_KEY 129 +# define EVP_R_EXPECTING_A_ECDSA_KEY 141 +# define EVP_R_EXPECTING_A_EC_KEY 142 +# define EVP_R_FIPS_MODE_NOT_SUPPORTED 167 +# define EVP_R_INITIALIZATION_ERROR 134 +# define EVP_R_INPUT_NOT_INITIALIZED 111 +# define EVP_R_INVALID_DIGEST 152 +# define EVP_R_INVALID_FIPS_MODE 168 +# define EVP_R_INVALID_KEY_LENGTH 130 +# define EVP_R_INVALID_OPERATION 148 +# define EVP_R_IV_TOO_LARGE 102 +# define EVP_R_KEYGEN_FAILURE 120 +# define EVP_R_MESSAGE_DIGEST_IS_NULL 159 +# define EVP_R_METHOD_NOT_SUPPORTED 144 +# define EVP_R_MISSING_PARAMETERS 103 +# define EVP_R_NO_CIPHER_SET 131 +# define EVP_R_NO_DEFAULT_DIGEST 158 +# define EVP_R_NO_DIGEST_SET 139 +# define EVP_R_NO_DSA_PARAMETERS 116 +# define EVP_R_NO_KEY_SET 154 +# define EVP_R_NO_OPERATION_SET 149 +# define EVP_R_NO_SIGN_FUNCTION_CONFIGURED 104 +# define EVP_R_NO_VERIFY_FUNCTION_CONFIGURED 105 +# define EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE 150 +# define EVP_R_OPERATON_NOT_INITIALIZED 151 +# define EVP_R_PKCS8_UNKNOWN_BROKEN_TYPE 117 +# define EVP_R_PRIVATE_KEY_DECODE_ERROR 145 +# define EVP_R_PRIVATE_KEY_ENCODE_ERROR 146 +# define EVP_R_PUBLIC_KEY_NOT_RSA 106 +# define EVP_R_TOO_LARGE 164 +# define EVP_R_UNKNOWN_CIPHER 160 +# define EVP_R_UNKNOWN_DIGEST 161 +# define EVP_R_UNKNOWN_OPTION 169 +# define EVP_R_UNKNOWN_PBE_ALGORITHM 121 +# define EVP_R_UNSUPORTED_NUMBER_OF_ROUNDS 135 +# define EVP_R_UNSUPPORTED_ALGORITHM 156 +# define EVP_R_UNSUPPORTED_CIPHER 107 +# define EVP_R_UNSUPPORTED_KEYLENGTH 123 +# define EVP_R_UNSUPPORTED_KEY_DERIVATION_FUNCTION 124 +# define EVP_R_UNSUPPORTED_KEY_SIZE 108 +# define EVP_R_UNSUPPORTED_PRF 125 +# define EVP_R_UNSUPPORTED_PRIVATE_KEY_ALGORITHM 118 +# define EVP_R_UNSUPPORTED_SALT_TYPE 126 +# define EVP_R_WRAP_MODE_NOT_ALLOWED 170 +# define EVP_R_WRONG_FINAL_BLOCK_LENGTH 109 +# define EVP_R_WRONG_PUBLIC_KEY_TYPE 110 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/hmac.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/hmac.h new file mode 100644 index 0000000..b8b55cd --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/hmac.h @@ -0,0 +1,109 @@ +/* crypto/hmac/hmac.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ +#ifndef HEADER_HMAC_H +# define HEADER_HMAC_H + +# include + +# ifdef OPENSSL_NO_HMAC +# error HMAC is disabled. +# endif + +# include + +# define HMAC_MAX_MD_CBLOCK 128/* largest known is SHA512 */ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct hmac_ctx_st { + const EVP_MD *md; + EVP_MD_CTX md_ctx; + EVP_MD_CTX i_ctx; + EVP_MD_CTX o_ctx; + unsigned int key_length; + unsigned char key[HMAC_MAX_MD_CBLOCK]; +} HMAC_CTX; + +# define HMAC_size(e) (EVP_MD_size((e)->md)) + +void HMAC_CTX_init(HMAC_CTX *ctx); +void HMAC_CTX_cleanup(HMAC_CTX *ctx); + +/* deprecated */ +# define HMAC_cleanup(ctx) HMAC_CTX_cleanup(ctx) + +/* deprecated */ +int HMAC_Init(HMAC_CTX *ctx, const void *key, int len, const EVP_MD *md); +int HMAC_Init_ex(HMAC_CTX *ctx, const void *key, int len, + const EVP_MD *md, ENGINE *impl); +int HMAC_Update(HMAC_CTX *ctx, const unsigned char *data, size_t len); +int HMAC_Final(HMAC_CTX *ctx, unsigned char *md, unsigned int *len); +unsigned char *HMAC(const EVP_MD *evp_md, const void *key, int key_len, + const unsigned char *d, size_t n, unsigned char *md, + unsigned int *md_len); +int HMAC_CTX_copy(HMAC_CTX *dctx, HMAC_CTX *sctx); + +void HMAC_CTX_set_flags(HMAC_CTX *ctx, unsigned long flags); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/idea.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/idea.h new file mode 100644 index 0000000..6075984 --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/idea.h @@ -0,0 +1,105 @@ +/* crypto/idea/idea.h */ +/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_IDEA_H +# define HEADER_IDEA_H + +# include /* IDEA_INT, OPENSSL_NO_IDEA */ + +# ifdef OPENSSL_NO_IDEA +# error IDEA is disabled. +# endif + +# define IDEA_ENCRYPT 1 +# define IDEA_DECRYPT 0 + +# define IDEA_BLOCK 8 +# define IDEA_KEY_LENGTH 16 + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct idea_key_st { + IDEA_INT data[9][6]; +} IDEA_KEY_SCHEDULE; + +const char *idea_options(void); +void idea_ecb_encrypt(const unsigned char *in, unsigned char *out, + IDEA_KEY_SCHEDULE *ks); +# ifdef OPENSSL_FIPS +void private_idea_set_encrypt_key(const unsigned char *key, + IDEA_KEY_SCHEDULE *ks); +# endif +void idea_set_encrypt_key(const unsigned char *key, IDEA_KEY_SCHEDULE *ks); +void idea_set_decrypt_key(IDEA_KEY_SCHEDULE *ek, IDEA_KEY_SCHEDULE *dk); +void idea_cbc_encrypt(const unsigned char *in, unsigned char *out, + long length, IDEA_KEY_SCHEDULE *ks, unsigned char *iv, + int enc); +void idea_cfb64_encrypt(const unsigned char *in, unsigned char *out, + long length, IDEA_KEY_SCHEDULE *ks, unsigned char *iv, + int *num, int enc); +void idea_ofb64_encrypt(const unsigned char *in, unsigned char *out, + long length, IDEA_KEY_SCHEDULE *ks, unsigned char *iv, + int *num); +void idea_encrypt(unsigned long *in, IDEA_KEY_SCHEDULE *ks); +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/krb5_asn.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/krb5_asn.h new file mode 100644 index 0000000..9cf5a26 --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/krb5_asn.h @@ -0,0 +1,240 @@ +/* krb5_asn.h */ +/* + * Written by Vern Staats for the OpenSSL project, ** + * using ocsp/{*.h,*asn*.c} as a starting point + */ + +/* ==================================================================== + * Copyright (c) 1998-2000 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_KRB5_ASN_H +# define HEADER_KRB5_ASN_H + +/* + * #include + */ +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * ASN.1 from Kerberos RFC 1510 + */ + +/*- EncryptedData ::= SEQUENCE { + * etype[0] INTEGER, -- EncryptionType + * kvno[1] INTEGER OPTIONAL, + * cipher[2] OCTET STRING -- ciphertext + * } + */ +typedef struct krb5_encdata_st { + ASN1_INTEGER *etype; + ASN1_INTEGER *kvno; + ASN1_OCTET_STRING *cipher; +} KRB5_ENCDATA; + +DECLARE_STACK_OF(KRB5_ENCDATA) + +/*- PrincipalName ::= SEQUENCE { + * name-type[0] INTEGER, + * name-string[1] SEQUENCE OF GeneralString + * } + */ +typedef struct krb5_princname_st { + ASN1_INTEGER *nametype; + STACK_OF(ASN1_GENERALSTRING) *namestring; +} KRB5_PRINCNAME; + +DECLARE_STACK_OF(KRB5_PRINCNAME) + +/*- Ticket ::= [APPLICATION 1] SEQUENCE { + * tkt-vno[0] INTEGER, + * realm[1] Realm, + * sname[2] PrincipalName, + * enc-part[3] EncryptedData + * } + */ +typedef struct krb5_tktbody_st { + ASN1_INTEGER *tktvno; + ASN1_GENERALSTRING *realm; + KRB5_PRINCNAME *sname; + KRB5_ENCDATA *encdata; +} KRB5_TKTBODY; + +typedef STACK_OF(KRB5_TKTBODY) KRB5_TICKET; +DECLARE_STACK_OF(KRB5_TKTBODY) + +/*- AP-REQ ::= [APPLICATION 14] SEQUENCE { + * pvno[0] INTEGER, + * msg-type[1] INTEGER, + * ap-options[2] APOptions, + * ticket[3] Ticket, + * authenticator[4] EncryptedData + * } + * + * APOptions ::= BIT STRING { + * reserved(0), use-session-key(1), mutual-required(2) } + */ +typedef struct krb5_ap_req_st { + ASN1_INTEGER *pvno; + ASN1_INTEGER *msgtype; + ASN1_BIT_STRING *apoptions; + KRB5_TICKET *ticket; + KRB5_ENCDATA *authenticator; +} KRB5_APREQBODY; + +typedef STACK_OF(KRB5_APREQBODY) KRB5_APREQ; +DECLARE_STACK_OF(KRB5_APREQBODY) + +/* Authenticator Stuff */ + +/*- Checksum ::= SEQUENCE { + * cksumtype[0] INTEGER, + * checksum[1] OCTET STRING + * } + */ +typedef struct krb5_checksum_st { + ASN1_INTEGER *ctype; + ASN1_OCTET_STRING *checksum; +} KRB5_CHECKSUM; + +DECLARE_STACK_OF(KRB5_CHECKSUM) + +/*- EncryptionKey ::= SEQUENCE { + * keytype[0] INTEGER, + * keyvalue[1] OCTET STRING + * } + */ +typedef struct krb5_encryptionkey_st { + ASN1_INTEGER *ktype; + ASN1_OCTET_STRING *keyvalue; +} KRB5_ENCKEY; + +DECLARE_STACK_OF(KRB5_ENCKEY) + +/*- AuthorizationData ::= SEQUENCE OF SEQUENCE { + * ad-type[0] INTEGER, + * ad-data[1] OCTET STRING + * } + */ +typedef struct krb5_authorization_st { + ASN1_INTEGER *adtype; + ASN1_OCTET_STRING *addata; +} KRB5_AUTHDATA; + +DECLARE_STACK_OF(KRB5_AUTHDATA) + +/*- -- Unencrypted authenticator + * Authenticator ::= [APPLICATION 2] SEQUENCE { + * authenticator-vno[0] INTEGER, + * crealm[1] Realm, + * cname[2] PrincipalName, + * cksum[3] Checksum OPTIONAL, + * cusec[4] INTEGER, + * ctime[5] KerberosTime, + * subkey[6] EncryptionKey OPTIONAL, + * seq-number[7] INTEGER OPTIONAL, + * authorization-data[8] AuthorizationData OPTIONAL + * } + */ +typedef struct krb5_authenticator_st { + ASN1_INTEGER *avno; + ASN1_GENERALSTRING *crealm; + KRB5_PRINCNAME *cname; + KRB5_CHECKSUM *cksum; + ASN1_INTEGER *cusec; + ASN1_GENERALIZEDTIME *ctime; + KRB5_ENCKEY *subkey; + ASN1_INTEGER *seqnum; + KRB5_AUTHDATA *authorization; +} KRB5_AUTHENTBODY; + +typedef STACK_OF(KRB5_AUTHENTBODY) KRB5_AUTHENT; +DECLARE_STACK_OF(KRB5_AUTHENTBODY) + +/*- DECLARE_ASN1_FUNCTIONS(type) = DECLARE_ASN1_FUNCTIONS_name(type, type) = + * type *name##_new(void); + * void name##_free(type *a); + * DECLARE_ASN1_ENCODE_FUNCTIONS(type, name, name) = + * DECLARE_ASN1_ENCODE_FUNCTIONS(type, itname, name) = + * type *d2i_##name(type **a, const unsigned char **in, long len); + * int i2d_##name(type *a, unsigned char **out); + * DECLARE_ASN1_ITEM(itname) = OPENSSL_EXTERN const ASN1_ITEM itname##_it + */ + +DECLARE_ASN1_FUNCTIONS(KRB5_ENCDATA) +DECLARE_ASN1_FUNCTIONS(KRB5_PRINCNAME) +DECLARE_ASN1_FUNCTIONS(KRB5_TKTBODY) +DECLARE_ASN1_FUNCTIONS(KRB5_APREQBODY) +DECLARE_ASN1_FUNCTIONS(KRB5_TICKET) +DECLARE_ASN1_FUNCTIONS(KRB5_APREQ) + +DECLARE_ASN1_FUNCTIONS(KRB5_CHECKSUM) +DECLARE_ASN1_FUNCTIONS(KRB5_ENCKEY) +DECLARE_ASN1_FUNCTIONS(KRB5_AUTHDATA) +DECLARE_ASN1_FUNCTIONS(KRB5_AUTHENTBODY) +DECLARE_ASN1_FUNCTIONS(KRB5_AUTHENT) + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/kssl.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/kssl.h new file mode 100644 index 0000000..ae8a51f --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/kssl.h @@ -0,0 +1,197 @@ +/* ssl/kssl.h */ +/* + * Written by Vern Staats for the OpenSSL project + * 2000. project 2000. + */ +/* ==================================================================== + * Copyright (c) 2000 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +/* + ** 19990701 VRS Started. + */ + +#ifndef KSSL_H +# define KSSL_H + +# include + +# ifndef OPENSSL_NO_KRB5 + +# include +# include +# include +# ifdef OPENSSL_SYS_WIN32 +/* + * These can sometimes get redefined indirectly by krb5 header files after + * they get undefed in ossl_typ.h + */ +# undef X509_NAME +# undef X509_EXTENSIONS +# undef OCSP_REQUEST +# undef OCSP_RESPONSE +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Depending on which KRB5 implementation used, some types from + * the other may be missing. Resolve that here and now + */ +# ifdef KRB5_HEIMDAL +typedef unsigned char krb5_octet; +# define FAR +# else + +# ifndef FAR +# define FAR +# endif + +# endif + +/*- + * Uncomment this to debug kssl problems or + * to trace usage of the Kerberos session key + * + * #define KSSL_DEBUG + */ + +# ifndef KRB5SVC +# define KRB5SVC "host" +# endif + +# ifndef KRB5KEYTAB +# define KRB5KEYTAB "/etc/krb5.keytab" +# endif + +# ifndef KRB5SENDAUTH +# define KRB5SENDAUTH 1 +# endif + +# ifndef KRB5CHECKAUTH +# define KRB5CHECKAUTH 1 +# endif + +# ifndef KSSL_CLOCKSKEW +# define KSSL_CLOCKSKEW 300; +# endif + +# define KSSL_ERR_MAX 255 +typedef struct kssl_err_st { + int reason; + char text[KSSL_ERR_MAX + 1]; +} KSSL_ERR; + +/*- Context for passing + * (1) Kerberos session key to SSL, and + * (2) Config data between application and SSL lib + */ +typedef struct kssl_ctx_st { + /* used by: disposition: */ + char *service_name; /* C,S default ok (kssl) */ + char *service_host; /* C input, REQUIRED */ + char *client_princ; /* S output from krb5 ticket */ + char *keytab_file; /* S NULL (/etc/krb5.keytab) */ + char *cred_cache; /* C NULL (default) */ + krb5_enctype enctype; + int length; + krb5_octet FAR *key; +} KSSL_CTX; + +# define KSSL_CLIENT 1 +# define KSSL_SERVER 2 +# define KSSL_SERVICE 3 +# define KSSL_KEYTAB 4 + +# define KSSL_CTX_OK 0 +# define KSSL_CTX_ERR 1 +# define KSSL_NOMEM 2 + +/* Public (for use by applications that use OpenSSL with Kerberos 5 support */ +krb5_error_code kssl_ctx_setstring(KSSL_CTX *kssl_ctx, int which, char *text); +KSSL_CTX *kssl_ctx_new(void); +KSSL_CTX *kssl_ctx_free(KSSL_CTX *kssl_ctx); +void kssl_ctx_show(KSSL_CTX *kssl_ctx); +krb5_error_code kssl_ctx_setprinc(KSSL_CTX *kssl_ctx, int which, + krb5_data *realm, krb5_data *entity, + int nentities); +krb5_error_code kssl_cget_tkt(KSSL_CTX *kssl_ctx, krb5_data **enc_tktp, + krb5_data *authenp, KSSL_ERR *kssl_err); +krb5_error_code kssl_sget_tkt(KSSL_CTX *kssl_ctx, krb5_data *indata, + krb5_ticket_times *ttimes, KSSL_ERR *kssl_err); +krb5_error_code kssl_ctx_setkey(KSSL_CTX *kssl_ctx, krb5_keyblock *session); +void kssl_err_set(KSSL_ERR *kssl_err, int reason, char *text); +void kssl_krb5_free_data_contents(krb5_context context, krb5_data *data); +krb5_error_code kssl_build_principal_2(krb5_context context, + krb5_principal *princ, int rlen, + const char *realm, int slen, + const char *svc, int hlen, + const char *host); +krb5_error_code kssl_validate_times(krb5_timestamp atime, + krb5_ticket_times *ttimes); +krb5_error_code kssl_check_authent(KSSL_CTX *kssl_ctx, krb5_data *authentp, + krb5_timestamp *atimep, + KSSL_ERR *kssl_err); +unsigned char *kssl_skip_confound(krb5_enctype enctype, unsigned char *authn); + +void SSL_set0_kssl_ctx(SSL *s, KSSL_CTX *kctx); +KSSL_CTX *SSL_get0_kssl_ctx(SSL *s); +char *kssl_ctx_get0_client_princ(KSSL_CTX *kctx); + +#ifdef __cplusplus +} +#endif +# endif /* OPENSSL_NO_KRB5 */ +#endif /* KSSL_H */ diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/lhash.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/lhash.h new file mode 100644 index 0000000..b6c328b --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/lhash.h @@ -0,0 +1,240 @@ +/* crypto/lhash/lhash.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +/* + * Header for dynamic hash table routines Author - Eric Young + */ + +#ifndef HEADER_LHASH_H +# define HEADER_LHASH_H + +# include +# ifndef OPENSSL_NO_FP_API +# include +# endif + +# ifndef OPENSSL_NO_BIO +# include +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct lhash_node_st { + void *data; + struct lhash_node_st *next; +# ifndef OPENSSL_NO_HASH_COMP + unsigned long hash; +# endif +} LHASH_NODE; + +typedef int (*LHASH_COMP_FN_TYPE) (const void *, const void *); +typedef unsigned long (*LHASH_HASH_FN_TYPE) (const void *); +typedef void (*LHASH_DOALL_FN_TYPE) (void *); +typedef void (*LHASH_DOALL_ARG_FN_TYPE) (void *, void *); + +/* + * Macros for declaring and implementing type-safe wrappers for LHASH + * callbacks. This way, callbacks can be provided to LHASH structures without + * function pointer casting and the macro-defined callbacks provide + * per-variable casting before deferring to the underlying type-specific + * callbacks. NB: It is possible to place a "static" in front of both the + * DECLARE and IMPLEMENT macros if the functions are strictly internal. + */ + +/* First: "hash" functions */ +# define DECLARE_LHASH_HASH_FN(name, o_type) \ + unsigned long name##_LHASH_HASH(const void *); +# define IMPLEMENT_LHASH_HASH_FN(name, o_type) \ + unsigned long name##_LHASH_HASH(const void *arg) { \ + const o_type *a = arg; \ + return name##_hash(a); } +# define LHASH_HASH_FN(name) name##_LHASH_HASH + +/* Second: "compare" functions */ +# define DECLARE_LHASH_COMP_FN(name, o_type) \ + int name##_LHASH_COMP(const void *, const void *); +# define IMPLEMENT_LHASH_COMP_FN(name, o_type) \ + int name##_LHASH_COMP(const void *arg1, const void *arg2) { \ + const o_type *a = arg1; \ + const o_type *b = arg2; \ + return name##_cmp(a,b); } +# define LHASH_COMP_FN(name) name##_LHASH_COMP + +/* Third: "doall" functions */ +# define DECLARE_LHASH_DOALL_FN(name, o_type) \ + void name##_LHASH_DOALL(void *); +# define IMPLEMENT_LHASH_DOALL_FN(name, o_type) \ + void name##_LHASH_DOALL(void *arg) { \ + o_type *a = arg; \ + name##_doall(a); } +# define LHASH_DOALL_FN(name) name##_LHASH_DOALL + +/* Fourth: "doall_arg" functions */ +# define DECLARE_LHASH_DOALL_ARG_FN(name, o_type, a_type) \ + void name##_LHASH_DOALL_ARG(void *, void *); +# define IMPLEMENT_LHASH_DOALL_ARG_FN(name, o_type, a_type) \ + void name##_LHASH_DOALL_ARG(void *arg1, void *arg2) { \ + o_type *a = arg1; \ + a_type *b = arg2; \ + name##_doall_arg(a, b); } +# define LHASH_DOALL_ARG_FN(name) name##_LHASH_DOALL_ARG + +typedef struct lhash_st { + LHASH_NODE **b; + LHASH_COMP_FN_TYPE comp; + LHASH_HASH_FN_TYPE hash; + unsigned int num_nodes; + unsigned int num_alloc_nodes; + unsigned int p; + unsigned int pmax; + unsigned long up_load; /* load times 256 */ + unsigned long down_load; /* load times 256 */ + unsigned long num_items; + unsigned long num_expands; + unsigned long num_expand_reallocs; + unsigned long num_contracts; + unsigned long num_contract_reallocs; + unsigned long num_hash_calls; + unsigned long num_comp_calls; + unsigned long num_insert; + unsigned long num_replace; + unsigned long num_delete; + unsigned long num_no_delete; + unsigned long num_retrieve; + unsigned long num_retrieve_miss; + unsigned long num_hash_comps; + int error; +} _LHASH; /* Do not use _LHASH directly, use LHASH_OF + * and friends */ + +# define LH_LOAD_MULT 256 + +/* + * Indicates a malloc() error in the last call, this is only bad in + * lh_insert(). + */ +# define lh_error(lh) ((lh)->error) + +_LHASH *lh_new(LHASH_HASH_FN_TYPE h, LHASH_COMP_FN_TYPE c); +void lh_free(_LHASH *lh); +void *lh_insert(_LHASH *lh, void *data); +void *lh_delete(_LHASH *lh, const void *data); +void *lh_retrieve(_LHASH *lh, const void *data); +void lh_doall(_LHASH *lh, LHASH_DOALL_FN_TYPE func); +void lh_doall_arg(_LHASH *lh, LHASH_DOALL_ARG_FN_TYPE func, void *arg); +unsigned long lh_strhash(const char *c); +unsigned long lh_num_items(const _LHASH *lh); + +# ifndef OPENSSL_NO_FP_API +void lh_stats(const _LHASH *lh, FILE *out); +void lh_node_stats(const _LHASH *lh, FILE *out); +void lh_node_usage_stats(const _LHASH *lh, FILE *out); +# endif + +# ifndef OPENSSL_NO_BIO +void lh_stats_bio(const _LHASH *lh, BIO *out); +void lh_node_stats_bio(const _LHASH *lh, BIO *out); +void lh_node_usage_stats_bio(const _LHASH *lh, BIO *out); +# endif + +/* Type checking... */ + +# define LHASH_OF(type) struct lhash_st_##type + +# define DECLARE_LHASH_OF(type) LHASH_OF(type) { int dummy; } + +# define CHECKED_LHASH_OF(type,lh) \ + ((_LHASH *)CHECKED_PTR_OF(LHASH_OF(type),lh)) + +/* Define wrapper functions. */ +# define LHM_lh_new(type, name) \ + ((LHASH_OF(type) *)lh_new(LHASH_HASH_FN(name), LHASH_COMP_FN(name))) +# define LHM_lh_error(type, lh) \ + lh_error(CHECKED_LHASH_OF(type,lh)) +# define LHM_lh_insert(type, lh, inst) \ + ((type *)lh_insert(CHECKED_LHASH_OF(type, lh), \ + CHECKED_PTR_OF(type, inst))) +# define LHM_lh_retrieve(type, lh, inst) \ + ((type *)lh_retrieve(CHECKED_LHASH_OF(type, lh), \ + CHECKED_PTR_OF(type, inst))) +# define LHM_lh_delete(type, lh, inst) \ + ((type *)lh_delete(CHECKED_LHASH_OF(type, lh), \ + CHECKED_PTR_OF(type, inst))) +# define LHM_lh_doall(type, lh,fn) lh_doall(CHECKED_LHASH_OF(type, lh), fn) +# define LHM_lh_doall_arg(type, lh, fn, arg_type, arg) \ + lh_doall_arg(CHECKED_LHASH_OF(type, lh), fn, CHECKED_PTR_OF(arg_type, arg)) +# define LHM_lh_num_items(type, lh) lh_num_items(CHECKED_LHASH_OF(type, lh)) +# define LHM_lh_down_load(type, lh) (CHECKED_LHASH_OF(type, lh)->down_load) +# define LHM_lh_node_stats_bio(type, lh, out) \ + lh_node_stats_bio(CHECKED_LHASH_OF(type, lh), out) +# define LHM_lh_node_usage_stats_bio(type, lh, out) \ + lh_node_usage_stats_bio(CHECKED_LHASH_OF(type, lh), out) +# define LHM_lh_stats_bio(type, lh, out) \ + lh_stats_bio(CHECKED_LHASH_OF(type, lh), out) +# define LHM_lh_free(type, lh) lh_free(CHECKED_LHASH_OF(type, lh)) + +DECLARE_LHASH_OF(OPENSSL_STRING); +DECLARE_LHASH_OF(OPENSSL_CSTRING); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/md4.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/md4.h new file mode 100644 index 0000000..11fd712 --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/md4.h @@ -0,0 +1,119 @@ +/* crypto/md4/md4.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_MD4_H +# define HEADER_MD4_H + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# ifdef OPENSSL_NO_MD4 +# error MD4 is disabled. +# endif + +/*- + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + * ! MD4_LONG has to be at least 32 bits wide. If it's wider, then ! + * ! MD4_LONG_LOG2 has to be defined along. ! + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + */ + +# if defined(__LP32__) +# define MD4_LONG unsigned long +# elif defined(OPENSSL_SYS_CRAY) || defined(__ILP64__) +# define MD4_LONG unsigned long +# define MD4_LONG_LOG2 3 +/* + * _CRAY note. I could declare short, but I have no idea what impact + * does it have on performance on none-T3E machines. I could declare + * int, but at least on C90 sizeof(int) can be chosen at compile time. + * So I've chosen long... + * + */ +# else +# define MD4_LONG unsigned int +# endif + +# define MD4_CBLOCK 64 +# define MD4_LBLOCK (MD4_CBLOCK/4) +# define MD4_DIGEST_LENGTH 16 + +typedef struct MD4state_st { + MD4_LONG A, B, C, D; + MD4_LONG Nl, Nh; + MD4_LONG data[MD4_LBLOCK]; + unsigned int num; +} MD4_CTX; + +# ifdef OPENSSL_FIPS +int private_MD4_Init(MD4_CTX *c); +# endif +int MD4_Init(MD4_CTX *c); +int MD4_Update(MD4_CTX *c, const void *data, size_t len); +int MD4_Final(unsigned char *md, MD4_CTX *c); +unsigned char *MD4(const unsigned char *d, size_t n, unsigned char *md); +void MD4_Transform(MD4_CTX *c, const unsigned char *b); +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/md5.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/md5.h new file mode 100644 index 0000000..2659038 --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/md5.h @@ -0,0 +1,119 @@ +/* crypto/md5/md5.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_MD5_H +# define HEADER_MD5_H + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# ifdef OPENSSL_NO_MD5 +# error MD5 is disabled. +# endif + +/* + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + * ! MD5_LONG has to be at least 32 bits wide. If it's wider, then ! + * ! MD5_LONG_LOG2 has to be defined along. ! + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + */ + +# if defined(__LP32__) +# define MD5_LONG unsigned long +# elif defined(OPENSSL_SYS_CRAY) || defined(__ILP64__) +# define MD5_LONG unsigned long +# define MD5_LONG_LOG2 3 +/* + * _CRAY note. I could declare short, but I have no idea what impact + * does it have on performance on none-T3E machines. I could declare + * int, but at least on C90 sizeof(int) can be chosen at compile time. + * So I've chosen long... + * + */ +# else +# define MD5_LONG unsigned int +# endif + +# define MD5_CBLOCK 64 +# define MD5_LBLOCK (MD5_CBLOCK/4) +# define MD5_DIGEST_LENGTH 16 + +typedef struct MD5state_st { + MD5_LONG A, B, C, D; + MD5_LONG Nl, Nh; + MD5_LONG data[MD5_LBLOCK]; + unsigned int num; +} MD5_CTX; + +# ifdef OPENSSL_FIPS +int private_MD5_Init(MD5_CTX *c); +# endif +int MD5_Init(MD5_CTX *c); +int MD5_Update(MD5_CTX *c, const void *data, size_t len); +int MD5_Final(unsigned char *md, MD5_CTX *c); +unsigned char *MD5(const unsigned char *d, size_t n, unsigned char *md); +void MD5_Transform(MD5_CTX *c, const unsigned char *b); +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/mdc2.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/mdc2.h new file mode 100644 index 0000000..7efe53b --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/mdc2.h @@ -0,0 +1,94 @@ +/* crypto/mdc2/mdc2.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_MDC2_H +# define HEADER_MDC2_H + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# ifdef OPENSSL_NO_MDC2 +# error MDC2 is disabled. +# endif + +# define MDC2_BLOCK 8 +# define MDC2_DIGEST_LENGTH 16 + +typedef struct mdc2_ctx_st { + unsigned int num; + unsigned char data[MDC2_BLOCK]; + DES_cblock h, hh; + int pad_type; /* either 1 or 2, default 1 */ +} MDC2_CTX; + +# ifdef OPENSSL_FIPS +int private_MDC2_Init(MDC2_CTX *c); +# endif +int MDC2_Init(MDC2_CTX *c); +int MDC2_Update(MDC2_CTX *c, const unsigned char *data, size_t len); +int MDC2_Final(unsigned char *md, MDC2_CTX *c); +unsigned char *MDC2(const unsigned char *d, size_t n, unsigned char *md); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/modes.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/modes.h new file mode 100644 index 0000000..fd48849 --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/modes.h @@ -0,0 +1,163 @@ +/* ==================================================================== + * Copyright (c) 2008 The OpenSSL Project. All rights reserved. + * + * Rights for redistribution and usage in source and binary + * forms are granted according to the OpenSSL license. + */ + +#include + +#ifdef __cplusplus +extern "C" { +#endif +typedef void (*block128_f) (const unsigned char in[16], + unsigned char out[16], const void *key); + +typedef void (*cbc128_f) (const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], int enc); + +typedef void (*ctr128_f) (const unsigned char *in, unsigned char *out, + size_t blocks, const void *key, + const unsigned char ivec[16]); + +typedef void (*ccm128_f) (const unsigned char *in, unsigned char *out, + size_t blocks, const void *key, + const unsigned char ivec[16], + unsigned char cmac[16]); + +void CRYPTO_cbc128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], block128_f block); +void CRYPTO_cbc128_decrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], block128_f block); + +void CRYPTO_ctr128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], + unsigned char ecount_buf[16], unsigned int *num, + block128_f block); + +void CRYPTO_ctr128_encrypt_ctr32(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], + unsigned char ecount_buf[16], + unsigned int *num, ctr128_f ctr); + +void CRYPTO_ofb128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], int *num, + block128_f block); + +void CRYPTO_cfb128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], int *num, + int enc, block128_f block); +void CRYPTO_cfb128_8_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const void *key, + unsigned char ivec[16], int *num, + int enc, block128_f block); +void CRYPTO_cfb128_1_encrypt(const unsigned char *in, unsigned char *out, + size_t bits, const void *key, + unsigned char ivec[16], int *num, + int enc, block128_f block); + +size_t CRYPTO_cts128_encrypt_block(const unsigned char *in, + unsigned char *out, size_t len, + const void *key, unsigned char ivec[16], + block128_f block); +size_t CRYPTO_cts128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], cbc128_f cbc); +size_t CRYPTO_cts128_decrypt_block(const unsigned char *in, + unsigned char *out, size_t len, + const void *key, unsigned char ivec[16], + block128_f block); +size_t CRYPTO_cts128_decrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], cbc128_f cbc); + +size_t CRYPTO_nistcts128_encrypt_block(const unsigned char *in, + unsigned char *out, size_t len, + const void *key, + unsigned char ivec[16], + block128_f block); +size_t CRYPTO_nistcts128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], cbc128_f cbc); +size_t CRYPTO_nistcts128_decrypt_block(const unsigned char *in, + unsigned char *out, size_t len, + const void *key, + unsigned char ivec[16], + block128_f block); +size_t CRYPTO_nistcts128_decrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], cbc128_f cbc); + +typedef struct gcm128_context GCM128_CONTEXT; + +GCM128_CONTEXT *CRYPTO_gcm128_new(void *key, block128_f block); +void CRYPTO_gcm128_init(GCM128_CONTEXT *ctx, void *key, block128_f block); +void CRYPTO_gcm128_setiv(GCM128_CONTEXT *ctx, const unsigned char *iv, + size_t len); +int CRYPTO_gcm128_aad(GCM128_CONTEXT *ctx, const unsigned char *aad, + size_t len); +int CRYPTO_gcm128_encrypt(GCM128_CONTEXT *ctx, + const unsigned char *in, unsigned char *out, + size_t len); +int CRYPTO_gcm128_decrypt(GCM128_CONTEXT *ctx, + const unsigned char *in, unsigned char *out, + size_t len); +int CRYPTO_gcm128_encrypt_ctr32(GCM128_CONTEXT *ctx, + const unsigned char *in, unsigned char *out, + size_t len, ctr128_f stream); +int CRYPTO_gcm128_decrypt_ctr32(GCM128_CONTEXT *ctx, + const unsigned char *in, unsigned char *out, + size_t len, ctr128_f stream); +int CRYPTO_gcm128_finish(GCM128_CONTEXT *ctx, const unsigned char *tag, + size_t len); +void CRYPTO_gcm128_tag(GCM128_CONTEXT *ctx, unsigned char *tag, size_t len); +void CRYPTO_gcm128_release(GCM128_CONTEXT *ctx); + +typedef struct ccm128_context CCM128_CONTEXT; + +void CRYPTO_ccm128_init(CCM128_CONTEXT *ctx, + unsigned int M, unsigned int L, void *key, + block128_f block); +int CRYPTO_ccm128_setiv(CCM128_CONTEXT *ctx, const unsigned char *nonce, + size_t nlen, size_t mlen); +void CRYPTO_ccm128_aad(CCM128_CONTEXT *ctx, const unsigned char *aad, + size_t alen); +int CRYPTO_ccm128_encrypt(CCM128_CONTEXT *ctx, const unsigned char *inp, + unsigned char *out, size_t len); +int CRYPTO_ccm128_decrypt(CCM128_CONTEXT *ctx, const unsigned char *inp, + unsigned char *out, size_t len); +int CRYPTO_ccm128_encrypt_ccm64(CCM128_CONTEXT *ctx, const unsigned char *inp, + unsigned char *out, size_t len, + ccm128_f stream); +int CRYPTO_ccm128_decrypt_ccm64(CCM128_CONTEXT *ctx, const unsigned char *inp, + unsigned char *out, size_t len, + ccm128_f stream); +size_t CRYPTO_ccm128_tag(CCM128_CONTEXT *ctx, unsigned char *tag, size_t len); + +typedef struct xts128_context XTS128_CONTEXT; + +int CRYPTO_xts128_encrypt(const XTS128_CONTEXT *ctx, + const unsigned char iv[16], + const unsigned char *inp, unsigned char *out, + size_t len, int enc); + +size_t CRYPTO_128_wrap(void *key, const unsigned char *iv, + unsigned char *out, + const unsigned char *in, size_t inlen, + block128_f block); + +size_t CRYPTO_128_unwrap(void *key, const unsigned char *iv, + unsigned char *out, + const unsigned char *in, size_t inlen, + block128_f block); + +#ifdef __cplusplus +} +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/obj_mac.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/obj_mac.h new file mode 100644 index 0000000..779c309 --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/obj_mac.h @@ -0,0 +1,4194 @@ +/* crypto/objects/obj_mac.h */ + +/* + * THIS FILE IS GENERATED FROM objects.txt by objects.pl via the following + * command: perl objects.pl objects.txt obj_mac.num obj_mac.h + */ + +/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#define SN_undef "UNDEF" +#define LN_undef "undefined" +#define NID_undef 0 +#define OBJ_undef 0L + +#define SN_itu_t "ITU-T" +#define LN_itu_t "itu-t" +#define NID_itu_t 645 +#define OBJ_itu_t 0L + +#define NID_ccitt 404 +#define OBJ_ccitt OBJ_itu_t + +#define SN_iso "ISO" +#define LN_iso "iso" +#define NID_iso 181 +#define OBJ_iso 1L + +#define SN_joint_iso_itu_t "JOINT-ISO-ITU-T" +#define LN_joint_iso_itu_t "joint-iso-itu-t" +#define NID_joint_iso_itu_t 646 +#define OBJ_joint_iso_itu_t 2L + +#define NID_joint_iso_ccitt 393 +#define OBJ_joint_iso_ccitt OBJ_joint_iso_itu_t + +#define SN_member_body "member-body" +#define LN_member_body "ISO Member Body" +#define NID_member_body 182 +#define OBJ_member_body OBJ_iso,2L + +#define SN_identified_organization "identified-organization" +#define NID_identified_organization 676 +#define OBJ_identified_organization OBJ_iso,3L + +#define SN_hmac_md5 "HMAC-MD5" +#define LN_hmac_md5 "hmac-md5" +#define NID_hmac_md5 780 +#define OBJ_hmac_md5 OBJ_identified_organization,6L,1L,5L,5L,8L,1L,1L + +#define SN_hmac_sha1 "HMAC-SHA1" +#define LN_hmac_sha1 "hmac-sha1" +#define NID_hmac_sha1 781 +#define OBJ_hmac_sha1 OBJ_identified_organization,6L,1L,5L,5L,8L,1L,2L + +#define SN_certicom_arc "certicom-arc" +#define NID_certicom_arc 677 +#define OBJ_certicom_arc OBJ_identified_organization,132L + +#define SN_international_organizations "international-organizations" +#define LN_international_organizations "International Organizations" +#define NID_international_organizations 647 +#define OBJ_international_organizations OBJ_joint_iso_itu_t,23L + +#define SN_wap "wap" +#define NID_wap 678 +#define OBJ_wap OBJ_international_organizations,43L + +#define SN_wap_wsg "wap-wsg" +#define NID_wap_wsg 679 +#define OBJ_wap_wsg OBJ_wap,1L + +#define SN_selected_attribute_types "selected-attribute-types" +#define LN_selected_attribute_types "Selected Attribute Types" +#define NID_selected_attribute_types 394 +#define OBJ_selected_attribute_types OBJ_joint_iso_itu_t,5L,1L,5L + +#define SN_clearance "clearance" +#define NID_clearance 395 +#define OBJ_clearance OBJ_selected_attribute_types,55L + +#define SN_ISO_US "ISO-US" +#define LN_ISO_US "ISO US Member Body" +#define NID_ISO_US 183 +#define OBJ_ISO_US OBJ_member_body,840L + +#define SN_X9_57 "X9-57" +#define LN_X9_57 "X9.57" +#define NID_X9_57 184 +#define OBJ_X9_57 OBJ_ISO_US,10040L + +#define SN_X9cm "X9cm" +#define LN_X9cm "X9.57 CM ?" +#define NID_X9cm 185 +#define OBJ_X9cm OBJ_X9_57,4L + +#define SN_dsa "DSA" +#define LN_dsa "dsaEncryption" +#define NID_dsa 116 +#define OBJ_dsa OBJ_X9cm,1L + +#define SN_dsaWithSHA1 "DSA-SHA1" +#define LN_dsaWithSHA1 "dsaWithSHA1" +#define NID_dsaWithSHA1 113 +#define OBJ_dsaWithSHA1 OBJ_X9cm,3L + +#define SN_ansi_X9_62 "ansi-X9-62" +#define LN_ansi_X9_62 "ANSI X9.62" +#define NID_ansi_X9_62 405 +#define OBJ_ansi_X9_62 OBJ_ISO_US,10045L + +#define OBJ_X9_62_id_fieldType OBJ_ansi_X9_62,1L + +#define SN_X9_62_prime_field "prime-field" +#define NID_X9_62_prime_field 406 +#define OBJ_X9_62_prime_field OBJ_X9_62_id_fieldType,1L + +#define SN_X9_62_characteristic_two_field "characteristic-two-field" +#define NID_X9_62_characteristic_two_field 407 +#define OBJ_X9_62_characteristic_two_field OBJ_X9_62_id_fieldType,2L + +#define SN_X9_62_id_characteristic_two_basis "id-characteristic-two-basis" +#define NID_X9_62_id_characteristic_two_basis 680 +#define OBJ_X9_62_id_characteristic_two_basis OBJ_X9_62_characteristic_two_field,3L + +#define SN_X9_62_onBasis "onBasis" +#define NID_X9_62_onBasis 681 +#define OBJ_X9_62_onBasis OBJ_X9_62_id_characteristic_two_basis,1L + +#define SN_X9_62_tpBasis "tpBasis" +#define NID_X9_62_tpBasis 682 +#define OBJ_X9_62_tpBasis OBJ_X9_62_id_characteristic_two_basis,2L + +#define SN_X9_62_ppBasis "ppBasis" +#define NID_X9_62_ppBasis 683 +#define OBJ_X9_62_ppBasis OBJ_X9_62_id_characteristic_two_basis,3L + +#define OBJ_X9_62_id_publicKeyType OBJ_ansi_X9_62,2L + +#define SN_X9_62_id_ecPublicKey "id-ecPublicKey" +#define NID_X9_62_id_ecPublicKey 408 +#define OBJ_X9_62_id_ecPublicKey OBJ_X9_62_id_publicKeyType,1L + +#define OBJ_X9_62_ellipticCurve OBJ_ansi_X9_62,3L + +#define OBJ_X9_62_c_TwoCurve OBJ_X9_62_ellipticCurve,0L + +#define SN_X9_62_c2pnb163v1 "c2pnb163v1" +#define NID_X9_62_c2pnb163v1 684 +#define OBJ_X9_62_c2pnb163v1 OBJ_X9_62_c_TwoCurve,1L + +#define SN_X9_62_c2pnb163v2 "c2pnb163v2" +#define NID_X9_62_c2pnb163v2 685 +#define OBJ_X9_62_c2pnb163v2 OBJ_X9_62_c_TwoCurve,2L + +#define SN_X9_62_c2pnb163v3 "c2pnb163v3" +#define NID_X9_62_c2pnb163v3 686 +#define OBJ_X9_62_c2pnb163v3 OBJ_X9_62_c_TwoCurve,3L + +#define SN_X9_62_c2pnb176v1 "c2pnb176v1" +#define NID_X9_62_c2pnb176v1 687 +#define OBJ_X9_62_c2pnb176v1 OBJ_X9_62_c_TwoCurve,4L + +#define SN_X9_62_c2tnb191v1 "c2tnb191v1" +#define NID_X9_62_c2tnb191v1 688 +#define OBJ_X9_62_c2tnb191v1 OBJ_X9_62_c_TwoCurve,5L + +#define SN_X9_62_c2tnb191v2 "c2tnb191v2" +#define NID_X9_62_c2tnb191v2 689 +#define OBJ_X9_62_c2tnb191v2 OBJ_X9_62_c_TwoCurve,6L + +#define SN_X9_62_c2tnb191v3 "c2tnb191v3" +#define NID_X9_62_c2tnb191v3 690 +#define OBJ_X9_62_c2tnb191v3 OBJ_X9_62_c_TwoCurve,7L + +#define SN_X9_62_c2onb191v4 "c2onb191v4" +#define NID_X9_62_c2onb191v4 691 +#define OBJ_X9_62_c2onb191v4 OBJ_X9_62_c_TwoCurve,8L + +#define SN_X9_62_c2onb191v5 "c2onb191v5" +#define NID_X9_62_c2onb191v5 692 +#define OBJ_X9_62_c2onb191v5 OBJ_X9_62_c_TwoCurve,9L + +#define SN_X9_62_c2pnb208w1 "c2pnb208w1" +#define NID_X9_62_c2pnb208w1 693 +#define OBJ_X9_62_c2pnb208w1 OBJ_X9_62_c_TwoCurve,10L + +#define SN_X9_62_c2tnb239v1 "c2tnb239v1" +#define NID_X9_62_c2tnb239v1 694 +#define OBJ_X9_62_c2tnb239v1 OBJ_X9_62_c_TwoCurve,11L + +#define SN_X9_62_c2tnb239v2 "c2tnb239v2" +#define NID_X9_62_c2tnb239v2 695 +#define OBJ_X9_62_c2tnb239v2 OBJ_X9_62_c_TwoCurve,12L + +#define SN_X9_62_c2tnb239v3 "c2tnb239v3" +#define NID_X9_62_c2tnb239v3 696 +#define OBJ_X9_62_c2tnb239v3 OBJ_X9_62_c_TwoCurve,13L + +#define SN_X9_62_c2onb239v4 "c2onb239v4" +#define NID_X9_62_c2onb239v4 697 +#define OBJ_X9_62_c2onb239v4 OBJ_X9_62_c_TwoCurve,14L + +#define SN_X9_62_c2onb239v5 "c2onb239v5" +#define NID_X9_62_c2onb239v5 698 +#define OBJ_X9_62_c2onb239v5 OBJ_X9_62_c_TwoCurve,15L + +#define SN_X9_62_c2pnb272w1 "c2pnb272w1" +#define NID_X9_62_c2pnb272w1 699 +#define OBJ_X9_62_c2pnb272w1 OBJ_X9_62_c_TwoCurve,16L + +#define SN_X9_62_c2pnb304w1 "c2pnb304w1" +#define NID_X9_62_c2pnb304w1 700 +#define OBJ_X9_62_c2pnb304w1 OBJ_X9_62_c_TwoCurve,17L + +#define SN_X9_62_c2tnb359v1 "c2tnb359v1" +#define NID_X9_62_c2tnb359v1 701 +#define OBJ_X9_62_c2tnb359v1 OBJ_X9_62_c_TwoCurve,18L + +#define SN_X9_62_c2pnb368w1 "c2pnb368w1" +#define NID_X9_62_c2pnb368w1 702 +#define OBJ_X9_62_c2pnb368w1 OBJ_X9_62_c_TwoCurve,19L + +#define SN_X9_62_c2tnb431r1 "c2tnb431r1" +#define NID_X9_62_c2tnb431r1 703 +#define OBJ_X9_62_c2tnb431r1 OBJ_X9_62_c_TwoCurve,20L + +#define OBJ_X9_62_primeCurve OBJ_X9_62_ellipticCurve,1L + +#define SN_X9_62_prime192v1 "prime192v1" +#define NID_X9_62_prime192v1 409 +#define OBJ_X9_62_prime192v1 OBJ_X9_62_primeCurve,1L + +#define SN_X9_62_prime192v2 "prime192v2" +#define NID_X9_62_prime192v2 410 +#define OBJ_X9_62_prime192v2 OBJ_X9_62_primeCurve,2L + +#define SN_X9_62_prime192v3 "prime192v3" +#define NID_X9_62_prime192v3 411 +#define OBJ_X9_62_prime192v3 OBJ_X9_62_primeCurve,3L + +#define SN_X9_62_prime239v1 "prime239v1" +#define NID_X9_62_prime239v1 412 +#define OBJ_X9_62_prime239v1 OBJ_X9_62_primeCurve,4L + +#define SN_X9_62_prime239v2 "prime239v2" +#define NID_X9_62_prime239v2 413 +#define OBJ_X9_62_prime239v2 OBJ_X9_62_primeCurve,5L + +#define SN_X9_62_prime239v3 "prime239v3" +#define NID_X9_62_prime239v3 414 +#define OBJ_X9_62_prime239v3 OBJ_X9_62_primeCurve,6L + +#define SN_X9_62_prime256v1 "prime256v1" +#define NID_X9_62_prime256v1 415 +#define OBJ_X9_62_prime256v1 OBJ_X9_62_primeCurve,7L + +#define OBJ_X9_62_id_ecSigType OBJ_ansi_X9_62,4L + +#define SN_ecdsa_with_SHA1 "ecdsa-with-SHA1" +#define NID_ecdsa_with_SHA1 416 +#define OBJ_ecdsa_with_SHA1 OBJ_X9_62_id_ecSigType,1L + +#define SN_ecdsa_with_Recommended "ecdsa-with-Recommended" +#define NID_ecdsa_with_Recommended 791 +#define OBJ_ecdsa_with_Recommended OBJ_X9_62_id_ecSigType,2L + +#define SN_ecdsa_with_Specified "ecdsa-with-Specified" +#define NID_ecdsa_with_Specified 792 +#define OBJ_ecdsa_with_Specified OBJ_X9_62_id_ecSigType,3L + +#define SN_ecdsa_with_SHA224 "ecdsa-with-SHA224" +#define NID_ecdsa_with_SHA224 793 +#define OBJ_ecdsa_with_SHA224 OBJ_ecdsa_with_Specified,1L + +#define SN_ecdsa_with_SHA256 "ecdsa-with-SHA256" +#define NID_ecdsa_with_SHA256 794 +#define OBJ_ecdsa_with_SHA256 OBJ_ecdsa_with_Specified,2L + +#define SN_ecdsa_with_SHA384 "ecdsa-with-SHA384" +#define NID_ecdsa_with_SHA384 795 +#define OBJ_ecdsa_with_SHA384 OBJ_ecdsa_with_Specified,3L + +#define SN_ecdsa_with_SHA512 "ecdsa-with-SHA512" +#define NID_ecdsa_with_SHA512 796 +#define OBJ_ecdsa_with_SHA512 OBJ_ecdsa_with_Specified,4L + +#define OBJ_secg_ellipticCurve OBJ_certicom_arc,0L + +#define SN_secp112r1 "secp112r1" +#define NID_secp112r1 704 +#define OBJ_secp112r1 OBJ_secg_ellipticCurve,6L + +#define SN_secp112r2 "secp112r2" +#define NID_secp112r2 705 +#define OBJ_secp112r2 OBJ_secg_ellipticCurve,7L + +#define SN_secp128r1 "secp128r1" +#define NID_secp128r1 706 +#define OBJ_secp128r1 OBJ_secg_ellipticCurve,28L + +#define SN_secp128r2 "secp128r2" +#define NID_secp128r2 707 +#define OBJ_secp128r2 OBJ_secg_ellipticCurve,29L + +#define SN_secp160k1 "secp160k1" +#define NID_secp160k1 708 +#define OBJ_secp160k1 OBJ_secg_ellipticCurve,9L + +#define SN_secp160r1 "secp160r1" +#define NID_secp160r1 709 +#define OBJ_secp160r1 OBJ_secg_ellipticCurve,8L + +#define SN_secp160r2 "secp160r2" +#define NID_secp160r2 710 +#define OBJ_secp160r2 OBJ_secg_ellipticCurve,30L + +#define SN_secp192k1 "secp192k1" +#define NID_secp192k1 711 +#define OBJ_secp192k1 OBJ_secg_ellipticCurve,31L + +#define SN_secp224k1 "secp224k1" +#define NID_secp224k1 712 +#define OBJ_secp224k1 OBJ_secg_ellipticCurve,32L + +#define SN_secp224r1 "secp224r1" +#define NID_secp224r1 713 +#define OBJ_secp224r1 OBJ_secg_ellipticCurve,33L + +#define SN_secp256k1 "secp256k1" +#define NID_secp256k1 714 +#define OBJ_secp256k1 OBJ_secg_ellipticCurve,10L + +#define SN_secp384r1 "secp384r1" +#define NID_secp384r1 715 +#define OBJ_secp384r1 OBJ_secg_ellipticCurve,34L + +#define SN_secp521r1 "secp521r1" +#define NID_secp521r1 716 +#define OBJ_secp521r1 OBJ_secg_ellipticCurve,35L + +#define SN_sect113r1 "sect113r1" +#define NID_sect113r1 717 +#define OBJ_sect113r1 OBJ_secg_ellipticCurve,4L + +#define SN_sect113r2 "sect113r2" +#define NID_sect113r2 718 +#define OBJ_sect113r2 OBJ_secg_ellipticCurve,5L + +#define SN_sect131r1 "sect131r1" +#define NID_sect131r1 719 +#define OBJ_sect131r1 OBJ_secg_ellipticCurve,22L + +#define SN_sect131r2 "sect131r2" +#define NID_sect131r2 720 +#define OBJ_sect131r2 OBJ_secg_ellipticCurve,23L + +#define SN_sect163k1 "sect163k1" +#define NID_sect163k1 721 +#define OBJ_sect163k1 OBJ_secg_ellipticCurve,1L + +#define SN_sect163r1 "sect163r1" +#define NID_sect163r1 722 +#define OBJ_sect163r1 OBJ_secg_ellipticCurve,2L + +#define SN_sect163r2 "sect163r2" +#define NID_sect163r2 723 +#define OBJ_sect163r2 OBJ_secg_ellipticCurve,15L + +#define SN_sect193r1 "sect193r1" +#define NID_sect193r1 724 +#define OBJ_sect193r1 OBJ_secg_ellipticCurve,24L + +#define SN_sect193r2 "sect193r2" +#define NID_sect193r2 725 +#define OBJ_sect193r2 OBJ_secg_ellipticCurve,25L + +#define SN_sect233k1 "sect233k1" +#define NID_sect233k1 726 +#define OBJ_sect233k1 OBJ_secg_ellipticCurve,26L + +#define SN_sect233r1 "sect233r1" +#define NID_sect233r1 727 +#define OBJ_sect233r1 OBJ_secg_ellipticCurve,27L + +#define SN_sect239k1 "sect239k1" +#define NID_sect239k1 728 +#define OBJ_sect239k1 OBJ_secg_ellipticCurve,3L + +#define SN_sect283k1 "sect283k1" +#define NID_sect283k1 729 +#define OBJ_sect283k1 OBJ_secg_ellipticCurve,16L + +#define SN_sect283r1 "sect283r1" +#define NID_sect283r1 730 +#define OBJ_sect283r1 OBJ_secg_ellipticCurve,17L + +#define SN_sect409k1 "sect409k1" +#define NID_sect409k1 731 +#define OBJ_sect409k1 OBJ_secg_ellipticCurve,36L + +#define SN_sect409r1 "sect409r1" +#define NID_sect409r1 732 +#define OBJ_sect409r1 OBJ_secg_ellipticCurve,37L + +#define SN_sect571k1 "sect571k1" +#define NID_sect571k1 733 +#define OBJ_sect571k1 OBJ_secg_ellipticCurve,38L + +#define SN_sect571r1 "sect571r1" +#define NID_sect571r1 734 +#define OBJ_sect571r1 OBJ_secg_ellipticCurve,39L + +#define OBJ_wap_wsg_idm_ecid OBJ_wap_wsg,4L + +#define SN_wap_wsg_idm_ecid_wtls1 "wap-wsg-idm-ecid-wtls1" +#define NID_wap_wsg_idm_ecid_wtls1 735 +#define OBJ_wap_wsg_idm_ecid_wtls1 OBJ_wap_wsg_idm_ecid,1L + +#define SN_wap_wsg_idm_ecid_wtls3 "wap-wsg-idm-ecid-wtls3" +#define NID_wap_wsg_idm_ecid_wtls3 736 +#define OBJ_wap_wsg_idm_ecid_wtls3 OBJ_wap_wsg_idm_ecid,3L + +#define SN_wap_wsg_idm_ecid_wtls4 "wap-wsg-idm-ecid-wtls4" +#define NID_wap_wsg_idm_ecid_wtls4 737 +#define OBJ_wap_wsg_idm_ecid_wtls4 OBJ_wap_wsg_idm_ecid,4L + +#define SN_wap_wsg_idm_ecid_wtls5 "wap-wsg-idm-ecid-wtls5" +#define NID_wap_wsg_idm_ecid_wtls5 738 +#define OBJ_wap_wsg_idm_ecid_wtls5 OBJ_wap_wsg_idm_ecid,5L + +#define SN_wap_wsg_idm_ecid_wtls6 "wap-wsg-idm-ecid-wtls6" +#define NID_wap_wsg_idm_ecid_wtls6 739 +#define OBJ_wap_wsg_idm_ecid_wtls6 OBJ_wap_wsg_idm_ecid,6L + +#define SN_wap_wsg_idm_ecid_wtls7 "wap-wsg-idm-ecid-wtls7" +#define NID_wap_wsg_idm_ecid_wtls7 740 +#define OBJ_wap_wsg_idm_ecid_wtls7 OBJ_wap_wsg_idm_ecid,7L + +#define SN_wap_wsg_idm_ecid_wtls8 "wap-wsg-idm-ecid-wtls8" +#define NID_wap_wsg_idm_ecid_wtls8 741 +#define OBJ_wap_wsg_idm_ecid_wtls8 OBJ_wap_wsg_idm_ecid,8L + +#define SN_wap_wsg_idm_ecid_wtls9 "wap-wsg-idm-ecid-wtls9" +#define NID_wap_wsg_idm_ecid_wtls9 742 +#define OBJ_wap_wsg_idm_ecid_wtls9 OBJ_wap_wsg_idm_ecid,9L + +#define SN_wap_wsg_idm_ecid_wtls10 "wap-wsg-idm-ecid-wtls10" +#define NID_wap_wsg_idm_ecid_wtls10 743 +#define OBJ_wap_wsg_idm_ecid_wtls10 OBJ_wap_wsg_idm_ecid,10L + +#define SN_wap_wsg_idm_ecid_wtls11 "wap-wsg-idm-ecid-wtls11" +#define NID_wap_wsg_idm_ecid_wtls11 744 +#define OBJ_wap_wsg_idm_ecid_wtls11 OBJ_wap_wsg_idm_ecid,11L + +#define SN_wap_wsg_idm_ecid_wtls12 "wap-wsg-idm-ecid-wtls12" +#define NID_wap_wsg_idm_ecid_wtls12 745 +#define OBJ_wap_wsg_idm_ecid_wtls12 OBJ_wap_wsg_idm_ecid,12L + +#define SN_cast5_cbc "CAST5-CBC" +#define LN_cast5_cbc "cast5-cbc" +#define NID_cast5_cbc 108 +#define OBJ_cast5_cbc OBJ_ISO_US,113533L,7L,66L,10L + +#define SN_cast5_ecb "CAST5-ECB" +#define LN_cast5_ecb "cast5-ecb" +#define NID_cast5_ecb 109 + +#define SN_cast5_cfb64 "CAST5-CFB" +#define LN_cast5_cfb64 "cast5-cfb" +#define NID_cast5_cfb64 110 + +#define SN_cast5_ofb64 "CAST5-OFB" +#define LN_cast5_ofb64 "cast5-ofb" +#define NID_cast5_ofb64 111 + +#define LN_pbeWithMD5AndCast5_CBC "pbeWithMD5AndCast5CBC" +#define NID_pbeWithMD5AndCast5_CBC 112 +#define OBJ_pbeWithMD5AndCast5_CBC OBJ_ISO_US,113533L,7L,66L,12L + +#define SN_id_PasswordBasedMAC "id-PasswordBasedMAC" +#define LN_id_PasswordBasedMAC "password based MAC" +#define NID_id_PasswordBasedMAC 782 +#define OBJ_id_PasswordBasedMAC OBJ_ISO_US,113533L,7L,66L,13L + +#define SN_id_DHBasedMac "id-DHBasedMac" +#define LN_id_DHBasedMac "Diffie-Hellman based MAC" +#define NID_id_DHBasedMac 783 +#define OBJ_id_DHBasedMac OBJ_ISO_US,113533L,7L,66L,30L + +#define SN_rsadsi "rsadsi" +#define LN_rsadsi "RSA Data Security, Inc." +#define NID_rsadsi 1 +#define OBJ_rsadsi OBJ_ISO_US,113549L + +#define SN_pkcs "pkcs" +#define LN_pkcs "RSA Data Security, Inc. PKCS" +#define NID_pkcs 2 +#define OBJ_pkcs OBJ_rsadsi,1L + +#define SN_pkcs1 "pkcs1" +#define NID_pkcs1 186 +#define OBJ_pkcs1 OBJ_pkcs,1L + +#define LN_rsaEncryption "rsaEncryption" +#define NID_rsaEncryption 6 +#define OBJ_rsaEncryption OBJ_pkcs1,1L + +#define SN_md2WithRSAEncryption "RSA-MD2" +#define LN_md2WithRSAEncryption "md2WithRSAEncryption" +#define NID_md2WithRSAEncryption 7 +#define OBJ_md2WithRSAEncryption OBJ_pkcs1,2L + +#define SN_md4WithRSAEncryption "RSA-MD4" +#define LN_md4WithRSAEncryption "md4WithRSAEncryption" +#define NID_md4WithRSAEncryption 396 +#define OBJ_md4WithRSAEncryption OBJ_pkcs1,3L + +#define SN_md5WithRSAEncryption "RSA-MD5" +#define LN_md5WithRSAEncryption "md5WithRSAEncryption" +#define NID_md5WithRSAEncryption 8 +#define OBJ_md5WithRSAEncryption OBJ_pkcs1,4L + +#define SN_sha1WithRSAEncryption "RSA-SHA1" +#define LN_sha1WithRSAEncryption "sha1WithRSAEncryption" +#define NID_sha1WithRSAEncryption 65 +#define OBJ_sha1WithRSAEncryption OBJ_pkcs1,5L + +#define SN_rsaesOaep "RSAES-OAEP" +#define LN_rsaesOaep "rsaesOaep" +#define NID_rsaesOaep 919 +#define OBJ_rsaesOaep OBJ_pkcs1,7L + +#define SN_mgf1 "MGF1" +#define LN_mgf1 "mgf1" +#define NID_mgf1 911 +#define OBJ_mgf1 OBJ_pkcs1,8L + +#define SN_pSpecified "PSPECIFIED" +#define LN_pSpecified "pSpecified" +#define NID_pSpecified 935 +#define OBJ_pSpecified OBJ_pkcs1,9L + +#define SN_rsassaPss "RSASSA-PSS" +#define LN_rsassaPss "rsassaPss" +#define NID_rsassaPss 912 +#define OBJ_rsassaPss OBJ_pkcs1,10L + +#define SN_sha256WithRSAEncryption "RSA-SHA256" +#define LN_sha256WithRSAEncryption "sha256WithRSAEncryption" +#define NID_sha256WithRSAEncryption 668 +#define OBJ_sha256WithRSAEncryption OBJ_pkcs1,11L + +#define SN_sha384WithRSAEncryption "RSA-SHA384" +#define LN_sha384WithRSAEncryption "sha384WithRSAEncryption" +#define NID_sha384WithRSAEncryption 669 +#define OBJ_sha384WithRSAEncryption OBJ_pkcs1,12L + +#define SN_sha512WithRSAEncryption "RSA-SHA512" +#define LN_sha512WithRSAEncryption "sha512WithRSAEncryption" +#define NID_sha512WithRSAEncryption 670 +#define OBJ_sha512WithRSAEncryption OBJ_pkcs1,13L + +#define SN_sha224WithRSAEncryption "RSA-SHA224" +#define LN_sha224WithRSAEncryption "sha224WithRSAEncryption" +#define NID_sha224WithRSAEncryption 671 +#define OBJ_sha224WithRSAEncryption OBJ_pkcs1,14L + +#define SN_pkcs3 "pkcs3" +#define NID_pkcs3 27 +#define OBJ_pkcs3 OBJ_pkcs,3L + +#define LN_dhKeyAgreement "dhKeyAgreement" +#define NID_dhKeyAgreement 28 +#define OBJ_dhKeyAgreement OBJ_pkcs3,1L + +#define SN_pkcs5 "pkcs5" +#define NID_pkcs5 187 +#define OBJ_pkcs5 OBJ_pkcs,5L + +#define SN_pbeWithMD2AndDES_CBC "PBE-MD2-DES" +#define LN_pbeWithMD2AndDES_CBC "pbeWithMD2AndDES-CBC" +#define NID_pbeWithMD2AndDES_CBC 9 +#define OBJ_pbeWithMD2AndDES_CBC OBJ_pkcs5,1L + +#define SN_pbeWithMD5AndDES_CBC "PBE-MD5-DES" +#define LN_pbeWithMD5AndDES_CBC "pbeWithMD5AndDES-CBC" +#define NID_pbeWithMD5AndDES_CBC 10 +#define OBJ_pbeWithMD5AndDES_CBC OBJ_pkcs5,3L + +#define SN_pbeWithMD2AndRC2_CBC "PBE-MD2-RC2-64" +#define LN_pbeWithMD2AndRC2_CBC "pbeWithMD2AndRC2-CBC" +#define NID_pbeWithMD2AndRC2_CBC 168 +#define OBJ_pbeWithMD2AndRC2_CBC OBJ_pkcs5,4L + +#define SN_pbeWithMD5AndRC2_CBC "PBE-MD5-RC2-64" +#define LN_pbeWithMD5AndRC2_CBC "pbeWithMD5AndRC2-CBC" +#define NID_pbeWithMD5AndRC2_CBC 169 +#define OBJ_pbeWithMD5AndRC2_CBC OBJ_pkcs5,6L + +#define SN_pbeWithSHA1AndDES_CBC "PBE-SHA1-DES" +#define LN_pbeWithSHA1AndDES_CBC "pbeWithSHA1AndDES-CBC" +#define NID_pbeWithSHA1AndDES_CBC 170 +#define OBJ_pbeWithSHA1AndDES_CBC OBJ_pkcs5,10L + +#define SN_pbeWithSHA1AndRC2_CBC "PBE-SHA1-RC2-64" +#define LN_pbeWithSHA1AndRC2_CBC "pbeWithSHA1AndRC2-CBC" +#define NID_pbeWithSHA1AndRC2_CBC 68 +#define OBJ_pbeWithSHA1AndRC2_CBC OBJ_pkcs5,11L + +#define LN_id_pbkdf2 "PBKDF2" +#define NID_id_pbkdf2 69 +#define OBJ_id_pbkdf2 OBJ_pkcs5,12L + +#define LN_pbes2 "PBES2" +#define NID_pbes2 161 +#define OBJ_pbes2 OBJ_pkcs5,13L + +#define LN_pbmac1 "PBMAC1" +#define NID_pbmac1 162 +#define OBJ_pbmac1 OBJ_pkcs5,14L + +#define SN_pkcs7 "pkcs7" +#define NID_pkcs7 20 +#define OBJ_pkcs7 OBJ_pkcs,7L + +#define LN_pkcs7_data "pkcs7-data" +#define NID_pkcs7_data 21 +#define OBJ_pkcs7_data OBJ_pkcs7,1L + +#define LN_pkcs7_signed "pkcs7-signedData" +#define NID_pkcs7_signed 22 +#define OBJ_pkcs7_signed OBJ_pkcs7,2L + +#define LN_pkcs7_enveloped "pkcs7-envelopedData" +#define NID_pkcs7_enveloped 23 +#define OBJ_pkcs7_enveloped OBJ_pkcs7,3L + +#define LN_pkcs7_signedAndEnveloped "pkcs7-signedAndEnvelopedData" +#define NID_pkcs7_signedAndEnveloped 24 +#define OBJ_pkcs7_signedAndEnveloped OBJ_pkcs7,4L + +#define LN_pkcs7_digest "pkcs7-digestData" +#define NID_pkcs7_digest 25 +#define OBJ_pkcs7_digest OBJ_pkcs7,5L + +#define LN_pkcs7_encrypted "pkcs7-encryptedData" +#define NID_pkcs7_encrypted 26 +#define OBJ_pkcs7_encrypted OBJ_pkcs7,6L + +#define SN_pkcs9 "pkcs9" +#define NID_pkcs9 47 +#define OBJ_pkcs9 OBJ_pkcs,9L + +#define LN_pkcs9_emailAddress "emailAddress" +#define NID_pkcs9_emailAddress 48 +#define OBJ_pkcs9_emailAddress OBJ_pkcs9,1L + +#define LN_pkcs9_unstructuredName "unstructuredName" +#define NID_pkcs9_unstructuredName 49 +#define OBJ_pkcs9_unstructuredName OBJ_pkcs9,2L + +#define LN_pkcs9_contentType "contentType" +#define NID_pkcs9_contentType 50 +#define OBJ_pkcs9_contentType OBJ_pkcs9,3L + +#define LN_pkcs9_messageDigest "messageDigest" +#define NID_pkcs9_messageDigest 51 +#define OBJ_pkcs9_messageDigest OBJ_pkcs9,4L + +#define LN_pkcs9_signingTime "signingTime" +#define NID_pkcs9_signingTime 52 +#define OBJ_pkcs9_signingTime OBJ_pkcs9,5L + +#define LN_pkcs9_countersignature "countersignature" +#define NID_pkcs9_countersignature 53 +#define OBJ_pkcs9_countersignature OBJ_pkcs9,6L + +#define LN_pkcs9_challengePassword "challengePassword" +#define NID_pkcs9_challengePassword 54 +#define OBJ_pkcs9_challengePassword OBJ_pkcs9,7L + +#define LN_pkcs9_unstructuredAddress "unstructuredAddress" +#define NID_pkcs9_unstructuredAddress 55 +#define OBJ_pkcs9_unstructuredAddress OBJ_pkcs9,8L + +#define LN_pkcs9_extCertAttributes "extendedCertificateAttributes" +#define NID_pkcs9_extCertAttributes 56 +#define OBJ_pkcs9_extCertAttributes OBJ_pkcs9,9L + +#define SN_ext_req "extReq" +#define LN_ext_req "Extension Request" +#define NID_ext_req 172 +#define OBJ_ext_req OBJ_pkcs9,14L + +#define SN_SMIMECapabilities "SMIME-CAPS" +#define LN_SMIMECapabilities "S/MIME Capabilities" +#define NID_SMIMECapabilities 167 +#define OBJ_SMIMECapabilities OBJ_pkcs9,15L + +#define SN_SMIME "SMIME" +#define LN_SMIME "S/MIME" +#define NID_SMIME 188 +#define OBJ_SMIME OBJ_pkcs9,16L + +#define SN_id_smime_mod "id-smime-mod" +#define NID_id_smime_mod 189 +#define OBJ_id_smime_mod OBJ_SMIME,0L + +#define SN_id_smime_ct "id-smime-ct" +#define NID_id_smime_ct 190 +#define OBJ_id_smime_ct OBJ_SMIME,1L + +#define SN_id_smime_aa "id-smime-aa" +#define NID_id_smime_aa 191 +#define OBJ_id_smime_aa OBJ_SMIME,2L + +#define SN_id_smime_alg "id-smime-alg" +#define NID_id_smime_alg 192 +#define OBJ_id_smime_alg OBJ_SMIME,3L + +#define SN_id_smime_cd "id-smime-cd" +#define NID_id_smime_cd 193 +#define OBJ_id_smime_cd OBJ_SMIME,4L + +#define SN_id_smime_spq "id-smime-spq" +#define NID_id_smime_spq 194 +#define OBJ_id_smime_spq OBJ_SMIME,5L + +#define SN_id_smime_cti "id-smime-cti" +#define NID_id_smime_cti 195 +#define OBJ_id_smime_cti OBJ_SMIME,6L + +#define SN_id_smime_mod_cms "id-smime-mod-cms" +#define NID_id_smime_mod_cms 196 +#define OBJ_id_smime_mod_cms OBJ_id_smime_mod,1L + +#define SN_id_smime_mod_ess "id-smime-mod-ess" +#define NID_id_smime_mod_ess 197 +#define OBJ_id_smime_mod_ess OBJ_id_smime_mod,2L + +#define SN_id_smime_mod_oid "id-smime-mod-oid" +#define NID_id_smime_mod_oid 198 +#define OBJ_id_smime_mod_oid OBJ_id_smime_mod,3L + +#define SN_id_smime_mod_msg_v3 "id-smime-mod-msg-v3" +#define NID_id_smime_mod_msg_v3 199 +#define OBJ_id_smime_mod_msg_v3 OBJ_id_smime_mod,4L + +#define SN_id_smime_mod_ets_eSignature_88 "id-smime-mod-ets-eSignature-88" +#define NID_id_smime_mod_ets_eSignature_88 200 +#define OBJ_id_smime_mod_ets_eSignature_88 OBJ_id_smime_mod,5L + +#define SN_id_smime_mod_ets_eSignature_97 "id-smime-mod-ets-eSignature-97" +#define NID_id_smime_mod_ets_eSignature_97 201 +#define OBJ_id_smime_mod_ets_eSignature_97 OBJ_id_smime_mod,6L + +#define SN_id_smime_mod_ets_eSigPolicy_88 "id-smime-mod-ets-eSigPolicy-88" +#define NID_id_smime_mod_ets_eSigPolicy_88 202 +#define OBJ_id_smime_mod_ets_eSigPolicy_88 OBJ_id_smime_mod,7L + +#define SN_id_smime_mod_ets_eSigPolicy_97 "id-smime-mod-ets-eSigPolicy-97" +#define NID_id_smime_mod_ets_eSigPolicy_97 203 +#define OBJ_id_smime_mod_ets_eSigPolicy_97 OBJ_id_smime_mod,8L + +#define SN_id_smime_ct_receipt "id-smime-ct-receipt" +#define NID_id_smime_ct_receipt 204 +#define OBJ_id_smime_ct_receipt OBJ_id_smime_ct,1L + +#define SN_id_smime_ct_authData "id-smime-ct-authData" +#define NID_id_smime_ct_authData 205 +#define OBJ_id_smime_ct_authData OBJ_id_smime_ct,2L + +#define SN_id_smime_ct_publishCert "id-smime-ct-publishCert" +#define NID_id_smime_ct_publishCert 206 +#define OBJ_id_smime_ct_publishCert OBJ_id_smime_ct,3L + +#define SN_id_smime_ct_TSTInfo "id-smime-ct-TSTInfo" +#define NID_id_smime_ct_TSTInfo 207 +#define OBJ_id_smime_ct_TSTInfo OBJ_id_smime_ct,4L + +#define SN_id_smime_ct_TDTInfo "id-smime-ct-TDTInfo" +#define NID_id_smime_ct_TDTInfo 208 +#define OBJ_id_smime_ct_TDTInfo OBJ_id_smime_ct,5L + +#define SN_id_smime_ct_contentInfo "id-smime-ct-contentInfo" +#define NID_id_smime_ct_contentInfo 209 +#define OBJ_id_smime_ct_contentInfo OBJ_id_smime_ct,6L + +#define SN_id_smime_ct_DVCSRequestData "id-smime-ct-DVCSRequestData" +#define NID_id_smime_ct_DVCSRequestData 210 +#define OBJ_id_smime_ct_DVCSRequestData OBJ_id_smime_ct,7L + +#define SN_id_smime_ct_DVCSResponseData "id-smime-ct-DVCSResponseData" +#define NID_id_smime_ct_DVCSResponseData 211 +#define OBJ_id_smime_ct_DVCSResponseData OBJ_id_smime_ct,8L + +#define SN_id_smime_ct_compressedData "id-smime-ct-compressedData" +#define NID_id_smime_ct_compressedData 786 +#define OBJ_id_smime_ct_compressedData OBJ_id_smime_ct,9L + +#define SN_id_ct_asciiTextWithCRLF "id-ct-asciiTextWithCRLF" +#define NID_id_ct_asciiTextWithCRLF 787 +#define OBJ_id_ct_asciiTextWithCRLF OBJ_id_smime_ct,27L + +#define SN_id_smime_aa_receiptRequest "id-smime-aa-receiptRequest" +#define NID_id_smime_aa_receiptRequest 212 +#define OBJ_id_smime_aa_receiptRequest OBJ_id_smime_aa,1L + +#define SN_id_smime_aa_securityLabel "id-smime-aa-securityLabel" +#define NID_id_smime_aa_securityLabel 213 +#define OBJ_id_smime_aa_securityLabel OBJ_id_smime_aa,2L + +#define SN_id_smime_aa_mlExpandHistory "id-smime-aa-mlExpandHistory" +#define NID_id_smime_aa_mlExpandHistory 214 +#define OBJ_id_smime_aa_mlExpandHistory OBJ_id_smime_aa,3L + +#define SN_id_smime_aa_contentHint "id-smime-aa-contentHint" +#define NID_id_smime_aa_contentHint 215 +#define OBJ_id_smime_aa_contentHint OBJ_id_smime_aa,4L + +#define SN_id_smime_aa_msgSigDigest "id-smime-aa-msgSigDigest" +#define NID_id_smime_aa_msgSigDigest 216 +#define OBJ_id_smime_aa_msgSigDigest OBJ_id_smime_aa,5L + +#define SN_id_smime_aa_encapContentType "id-smime-aa-encapContentType" +#define NID_id_smime_aa_encapContentType 217 +#define OBJ_id_smime_aa_encapContentType OBJ_id_smime_aa,6L + +#define SN_id_smime_aa_contentIdentifier "id-smime-aa-contentIdentifier" +#define NID_id_smime_aa_contentIdentifier 218 +#define OBJ_id_smime_aa_contentIdentifier OBJ_id_smime_aa,7L + +#define SN_id_smime_aa_macValue "id-smime-aa-macValue" +#define NID_id_smime_aa_macValue 219 +#define OBJ_id_smime_aa_macValue OBJ_id_smime_aa,8L + +#define SN_id_smime_aa_equivalentLabels "id-smime-aa-equivalentLabels" +#define NID_id_smime_aa_equivalentLabels 220 +#define OBJ_id_smime_aa_equivalentLabels OBJ_id_smime_aa,9L + +#define SN_id_smime_aa_contentReference "id-smime-aa-contentReference" +#define NID_id_smime_aa_contentReference 221 +#define OBJ_id_smime_aa_contentReference OBJ_id_smime_aa,10L + +#define SN_id_smime_aa_encrypKeyPref "id-smime-aa-encrypKeyPref" +#define NID_id_smime_aa_encrypKeyPref 222 +#define OBJ_id_smime_aa_encrypKeyPref OBJ_id_smime_aa,11L + +#define SN_id_smime_aa_signingCertificate "id-smime-aa-signingCertificate" +#define NID_id_smime_aa_signingCertificate 223 +#define OBJ_id_smime_aa_signingCertificate OBJ_id_smime_aa,12L + +#define SN_id_smime_aa_smimeEncryptCerts "id-smime-aa-smimeEncryptCerts" +#define NID_id_smime_aa_smimeEncryptCerts 224 +#define OBJ_id_smime_aa_smimeEncryptCerts OBJ_id_smime_aa,13L + +#define SN_id_smime_aa_timeStampToken "id-smime-aa-timeStampToken" +#define NID_id_smime_aa_timeStampToken 225 +#define OBJ_id_smime_aa_timeStampToken OBJ_id_smime_aa,14L + +#define SN_id_smime_aa_ets_sigPolicyId "id-smime-aa-ets-sigPolicyId" +#define NID_id_smime_aa_ets_sigPolicyId 226 +#define OBJ_id_smime_aa_ets_sigPolicyId OBJ_id_smime_aa,15L + +#define SN_id_smime_aa_ets_commitmentType "id-smime-aa-ets-commitmentType" +#define NID_id_smime_aa_ets_commitmentType 227 +#define OBJ_id_smime_aa_ets_commitmentType OBJ_id_smime_aa,16L + +#define SN_id_smime_aa_ets_signerLocation "id-smime-aa-ets-signerLocation" +#define NID_id_smime_aa_ets_signerLocation 228 +#define OBJ_id_smime_aa_ets_signerLocation OBJ_id_smime_aa,17L + +#define SN_id_smime_aa_ets_signerAttr "id-smime-aa-ets-signerAttr" +#define NID_id_smime_aa_ets_signerAttr 229 +#define OBJ_id_smime_aa_ets_signerAttr OBJ_id_smime_aa,18L + +#define SN_id_smime_aa_ets_otherSigCert "id-smime-aa-ets-otherSigCert" +#define NID_id_smime_aa_ets_otherSigCert 230 +#define OBJ_id_smime_aa_ets_otherSigCert OBJ_id_smime_aa,19L + +#define SN_id_smime_aa_ets_contentTimestamp "id-smime-aa-ets-contentTimestamp" +#define NID_id_smime_aa_ets_contentTimestamp 231 +#define OBJ_id_smime_aa_ets_contentTimestamp OBJ_id_smime_aa,20L + +#define SN_id_smime_aa_ets_CertificateRefs "id-smime-aa-ets-CertificateRefs" +#define NID_id_smime_aa_ets_CertificateRefs 232 +#define OBJ_id_smime_aa_ets_CertificateRefs OBJ_id_smime_aa,21L + +#define SN_id_smime_aa_ets_RevocationRefs "id-smime-aa-ets-RevocationRefs" +#define NID_id_smime_aa_ets_RevocationRefs 233 +#define OBJ_id_smime_aa_ets_RevocationRefs OBJ_id_smime_aa,22L + +#define SN_id_smime_aa_ets_certValues "id-smime-aa-ets-certValues" +#define NID_id_smime_aa_ets_certValues 234 +#define OBJ_id_smime_aa_ets_certValues OBJ_id_smime_aa,23L + +#define SN_id_smime_aa_ets_revocationValues "id-smime-aa-ets-revocationValues" +#define NID_id_smime_aa_ets_revocationValues 235 +#define OBJ_id_smime_aa_ets_revocationValues OBJ_id_smime_aa,24L + +#define SN_id_smime_aa_ets_escTimeStamp "id-smime-aa-ets-escTimeStamp" +#define NID_id_smime_aa_ets_escTimeStamp 236 +#define OBJ_id_smime_aa_ets_escTimeStamp OBJ_id_smime_aa,25L + +#define SN_id_smime_aa_ets_certCRLTimestamp "id-smime-aa-ets-certCRLTimestamp" +#define NID_id_smime_aa_ets_certCRLTimestamp 237 +#define OBJ_id_smime_aa_ets_certCRLTimestamp OBJ_id_smime_aa,26L + +#define SN_id_smime_aa_ets_archiveTimeStamp "id-smime-aa-ets-archiveTimeStamp" +#define NID_id_smime_aa_ets_archiveTimeStamp 238 +#define OBJ_id_smime_aa_ets_archiveTimeStamp OBJ_id_smime_aa,27L + +#define SN_id_smime_aa_signatureType "id-smime-aa-signatureType" +#define NID_id_smime_aa_signatureType 239 +#define OBJ_id_smime_aa_signatureType OBJ_id_smime_aa,28L + +#define SN_id_smime_aa_dvcs_dvc "id-smime-aa-dvcs-dvc" +#define NID_id_smime_aa_dvcs_dvc 240 +#define OBJ_id_smime_aa_dvcs_dvc OBJ_id_smime_aa,29L + +#define SN_id_smime_alg_ESDHwith3DES "id-smime-alg-ESDHwith3DES" +#define NID_id_smime_alg_ESDHwith3DES 241 +#define OBJ_id_smime_alg_ESDHwith3DES OBJ_id_smime_alg,1L + +#define SN_id_smime_alg_ESDHwithRC2 "id-smime-alg-ESDHwithRC2" +#define NID_id_smime_alg_ESDHwithRC2 242 +#define OBJ_id_smime_alg_ESDHwithRC2 OBJ_id_smime_alg,2L + +#define SN_id_smime_alg_3DESwrap "id-smime-alg-3DESwrap" +#define NID_id_smime_alg_3DESwrap 243 +#define OBJ_id_smime_alg_3DESwrap OBJ_id_smime_alg,3L + +#define SN_id_smime_alg_RC2wrap "id-smime-alg-RC2wrap" +#define NID_id_smime_alg_RC2wrap 244 +#define OBJ_id_smime_alg_RC2wrap OBJ_id_smime_alg,4L + +#define SN_id_smime_alg_ESDH "id-smime-alg-ESDH" +#define NID_id_smime_alg_ESDH 245 +#define OBJ_id_smime_alg_ESDH OBJ_id_smime_alg,5L + +#define SN_id_smime_alg_CMS3DESwrap "id-smime-alg-CMS3DESwrap" +#define NID_id_smime_alg_CMS3DESwrap 246 +#define OBJ_id_smime_alg_CMS3DESwrap OBJ_id_smime_alg,6L + +#define SN_id_smime_alg_CMSRC2wrap "id-smime-alg-CMSRC2wrap" +#define NID_id_smime_alg_CMSRC2wrap 247 +#define OBJ_id_smime_alg_CMSRC2wrap OBJ_id_smime_alg,7L + +#define SN_id_alg_PWRI_KEK "id-alg-PWRI-KEK" +#define NID_id_alg_PWRI_KEK 893 +#define OBJ_id_alg_PWRI_KEK OBJ_id_smime_alg,9L + +#define SN_id_smime_cd_ldap "id-smime-cd-ldap" +#define NID_id_smime_cd_ldap 248 +#define OBJ_id_smime_cd_ldap OBJ_id_smime_cd,1L + +#define SN_id_smime_spq_ets_sqt_uri "id-smime-spq-ets-sqt-uri" +#define NID_id_smime_spq_ets_sqt_uri 249 +#define OBJ_id_smime_spq_ets_sqt_uri OBJ_id_smime_spq,1L + +#define SN_id_smime_spq_ets_sqt_unotice "id-smime-spq-ets-sqt-unotice" +#define NID_id_smime_spq_ets_sqt_unotice 250 +#define OBJ_id_smime_spq_ets_sqt_unotice OBJ_id_smime_spq,2L + +#define SN_id_smime_cti_ets_proofOfOrigin "id-smime-cti-ets-proofOfOrigin" +#define NID_id_smime_cti_ets_proofOfOrigin 251 +#define OBJ_id_smime_cti_ets_proofOfOrigin OBJ_id_smime_cti,1L + +#define SN_id_smime_cti_ets_proofOfReceipt "id-smime-cti-ets-proofOfReceipt" +#define NID_id_smime_cti_ets_proofOfReceipt 252 +#define OBJ_id_smime_cti_ets_proofOfReceipt OBJ_id_smime_cti,2L + +#define SN_id_smime_cti_ets_proofOfDelivery "id-smime-cti-ets-proofOfDelivery" +#define NID_id_smime_cti_ets_proofOfDelivery 253 +#define OBJ_id_smime_cti_ets_proofOfDelivery OBJ_id_smime_cti,3L + +#define SN_id_smime_cti_ets_proofOfSender "id-smime-cti-ets-proofOfSender" +#define NID_id_smime_cti_ets_proofOfSender 254 +#define OBJ_id_smime_cti_ets_proofOfSender OBJ_id_smime_cti,4L + +#define SN_id_smime_cti_ets_proofOfApproval "id-smime-cti-ets-proofOfApproval" +#define NID_id_smime_cti_ets_proofOfApproval 255 +#define OBJ_id_smime_cti_ets_proofOfApproval OBJ_id_smime_cti,5L + +#define SN_id_smime_cti_ets_proofOfCreation "id-smime-cti-ets-proofOfCreation" +#define NID_id_smime_cti_ets_proofOfCreation 256 +#define OBJ_id_smime_cti_ets_proofOfCreation OBJ_id_smime_cti,6L + +#define LN_friendlyName "friendlyName" +#define NID_friendlyName 156 +#define OBJ_friendlyName OBJ_pkcs9,20L + +#define LN_localKeyID "localKeyID" +#define NID_localKeyID 157 +#define OBJ_localKeyID OBJ_pkcs9,21L + +#define SN_ms_csp_name "CSPName" +#define LN_ms_csp_name "Microsoft CSP Name" +#define NID_ms_csp_name 417 +#define OBJ_ms_csp_name 1L,3L,6L,1L,4L,1L,311L,17L,1L + +#define SN_LocalKeySet "LocalKeySet" +#define LN_LocalKeySet "Microsoft Local Key set" +#define NID_LocalKeySet 856 +#define OBJ_LocalKeySet 1L,3L,6L,1L,4L,1L,311L,17L,2L + +#define OBJ_certTypes OBJ_pkcs9,22L + +#define LN_x509Certificate "x509Certificate" +#define NID_x509Certificate 158 +#define OBJ_x509Certificate OBJ_certTypes,1L + +#define LN_sdsiCertificate "sdsiCertificate" +#define NID_sdsiCertificate 159 +#define OBJ_sdsiCertificate OBJ_certTypes,2L + +#define OBJ_crlTypes OBJ_pkcs9,23L + +#define LN_x509Crl "x509Crl" +#define NID_x509Crl 160 +#define OBJ_x509Crl OBJ_crlTypes,1L + +#define OBJ_pkcs12 OBJ_pkcs,12L + +#define OBJ_pkcs12_pbeids OBJ_pkcs12,1L + +#define SN_pbe_WithSHA1And128BitRC4 "PBE-SHA1-RC4-128" +#define LN_pbe_WithSHA1And128BitRC4 "pbeWithSHA1And128BitRC4" +#define NID_pbe_WithSHA1And128BitRC4 144 +#define OBJ_pbe_WithSHA1And128BitRC4 OBJ_pkcs12_pbeids,1L + +#define SN_pbe_WithSHA1And40BitRC4 "PBE-SHA1-RC4-40" +#define LN_pbe_WithSHA1And40BitRC4 "pbeWithSHA1And40BitRC4" +#define NID_pbe_WithSHA1And40BitRC4 145 +#define OBJ_pbe_WithSHA1And40BitRC4 OBJ_pkcs12_pbeids,2L + +#define SN_pbe_WithSHA1And3_Key_TripleDES_CBC "PBE-SHA1-3DES" +#define LN_pbe_WithSHA1And3_Key_TripleDES_CBC "pbeWithSHA1And3-KeyTripleDES-CBC" +#define NID_pbe_WithSHA1And3_Key_TripleDES_CBC 146 +#define OBJ_pbe_WithSHA1And3_Key_TripleDES_CBC OBJ_pkcs12_pbeids,3L + +#define SN_pbe_WithSHA1And2_Key_TripleDES_CBC "PBE-SHA1-2DES" +#define LN_pbe_WithSHA1And2_Key_TripleDES_CBC "pbeWithSHA1And2-KeyTripleDES-CBC" +#define NID_pbe_WithSHA1And2_Key_TripleDES_CBC 147 +#define OBJ_pbe_WithSHA1And2_Key_TripleDES_CBC OBJ_pkcs12_pbeids,4L + +#define SN_pbe_WithSHA1And128BitRC2_CBC "PBE-SHA1-RC2-128" +#define LN_pbe_WithSHA1And128BitRC2_CBC "pbeWithSHA1And128BitRC2-CBC" +#define NID_pbe_WithSHA1And128BitRC2_CBC 148 +#define OBJ_pbe_WithSHA1And128BitRC2_CBC OBJ_pkcs12_pbeids,5L + +#define SN_pbe_WithSHA1And40BitRC2_CBC "PBE-SHA1-RC2-40" +#define LN_pbe_WithSHA1And40BitRC2_CBC "pbeWithSHA1And40BitRC2-CBC" +#define NID_pbe_WithSHA1And40BitRC2_CBC 149 +#define OBJ_pbe_WithSHA1And40BitRC2_CBC OBJ_pkcs12_pbeids,6L + +#define OBJ_pkcs12_Version1 OBJ_pkcs12,10L + +#define OBJ_pkcs12_BagIds OBJ_pkcs12_Version1,1L + +#define LN_keyBag "keyBag" +#define NID_keyBag 150 +#define OBJ_keyBag OBJ_pkcs12_BagIds,1L + +#define LN_pkcs8ShroudedKeyBag "pkcs8ShroudedKeyBag" +#define NID_pkcs8ShroudedKeyBag 151 +#define OBJ_pkcs8ShroudedKeyBag OBJ_pkcs12_BagIds,2L + +#define LN_certBag "certBag" +#define NID_certBag 152 +#define OBJ_certBag OBJ_pkcs12_BagIds,3L + +#define LN_crlBag "crlBag" +#define NID_crlBag 153 +#define OBJ_crlBag OBJ_pkcs12_BagIds,4L + +#define LN_secretBag "secretBag" +#define NID_secretBag 154 +#define OBJ_secretBag OBJ_pkcs12_BagIds,5L + +#define LN_safeContentsBag "safeContentsBag" +#define NID_safeContentsBag 155 +#define OBJ_safeContentsBag OBJ_pkcs12_BagIds,6L + +#define SN_md2 "MD2" +#define LN_md2 "md2" +#define NID_md2 3 +#define OBJ_md2 OBJ_rsadsi,2L,2L + +#define SN_md4 "MD4" +#define LN_md4 "md4" +#define NID_md4 257 +#define OBJ_md4 OBJ_rsadsi,2L,4L + +#define SN_md5 "MD5" +#define LN_md5 "md5" +#define NID_md5 4 +#define OBJ_md5 OBJ_rsadsi,2L,5L + +#define SN_md5_sha1 "MD5-SHA1" +#define LN_md5_sha1 "md5-sha1" +#define NID_md5_sha1 114 + +#define LN_hmacWithMD5 "hmacWithMD5" +#define NID_hmacWithMD5 797 +#define OBJ_hmacWithMD5 OBJ_rsadsi,2L,6L + +#define LN_hmacWithSHA1 "hmacWithSHA1" +#define NID_hmacWithSHA1 163 +#define OBJ_hmacWithSHA1 OBJ_rsadsi,2L,7L + +#define LN_hmacWithSHA224 "hmacWithSHA224" +#define NID_hmacWithSHA224 798 +#define OBJ_hmacWithSHA224 OBJ_rsadsi,2L,8L + +#define LN_hmacWithSHA256 "hmacWithSHA256" +#define NID_hmacWithSHA256 799 +#define OBJ_hmacWithSHA256 OBJ_rsadsi,2L,9L + +#define LN_hmacWithSHA384 "hmacWithSHA384" +#define NID_hmacWithSHA384 800 +#define OBJ_hmacWithSHA384 OBJ_rsadsi,2L,10L + +#define LN_hmacWithSHA512 "hmacWithSHA512" +#define NID_hmacWithSHA512 801 +#define OBJ_hmacWithSHA512 OBJ_rsadsi,2L,11L + +#define SN_rc2_cbc "RC2-CBC" +#define LN_rc2_cbc "rc2-cbc" +#define NID_rc2_cbc 37 +#define OBJ_rc2_cbc OBJ_rsadsi,3L,2L + +#define SN_rc2_ecb "RC2-ECB" +#define LN_rc2_ecb "rc2-ecb" +#define NID_rc2_ecb 38 + +#define SN_rc2_cfb64 "RC2-CFB" +#define LN_rc2_cfb64 "rc2-cfb" +#define NID_rc2_cfb64 39 + +#define SN_rc2_ofb64 "RC2-OFB" +#define LN_rc2_ofb64 "rc2-ofb" +#define NID_rc2_ofb64 40 + +#define SN_rc2_40_cbc "RC2-40-CBC" +#define LN_rc2_40_cbc "rc2-40-cbc" +#define NID_rc2_40_cbc 98 + +#define SN_rc2_64_cbc "RC2-64-CBC" +#define LN_rc2_64_cbc "rc2-64-cbc" +#define NID_rc2_64_cbc 166 + +#define SN_rc4 "RC4" +#define LN_rc4 "rc4" +#define NID_rc4 5 +#define OBJ_rc4 OBJ_rsadsi,3L,4L + +#define SN_rc4_40 "RC4-40" +#define LN_rc4_40 "rc4-40" +#define NID_rc4_40 97 + +#define SN_des_ede3_cbc "DES-EDE3-CBC" +#define LN_des_ede3_cbc "des-ede3-cbc" +#define NID_des_ede3_cbc 44 +#define OBJ_des_ede3_cbc OBJ_rsadsi,3L,7L + +#define SN_rc5_cbc "RC5-CBC" +#define LN_rc5_cbc "rc5-cbc" +#define NID_rc5_cbc 120 +#define OBJ_rc5_cbc OBJ_rsadsi,3L,8L + +#define SN_rc5_ecb "RC5-ECB" +#define LN_rc5_ecb "rc5-ecb" +#define NID_rc5_ecb 121 + +#define SN_rc5_cfb64 "RC5-CFB" +#define LN_rc5_cfb64 "rc5-cfb" +#define NID_rc5_cfb64 122 + +#define SN_rc5_ofb64 "RC5-OFB" +#define LN_rc5_ofb64 "rc5-ofb" +#define NID_rc5_ofb64 123 + +#define SN_ms_ext_req "msExtReq" +#define LN_ms_ext_req "Microsoft Extension Request" +#define NID_ms_ext_req 171 +#define OBJ_ms_ext_req 1L,3L,6L,1L,4L,1L,311L,2L,1L,14L + +#define SN_ms_code_ind "msCodeInd" +#define LN_ms_code_ind "Microsoft Individual Code Signing" +#define NID_ms_code_ind 134 +#define OBJ_ms_code_ind 1L,3L,6L,1L,4L,1L,311L,2L,1L,21L + +#define SN_ms_code_com "msCodeCom" +#define LN_ms_code_com "Microsoft Commercial Code Signing" +#define NID_ms_code_com 135 +#define OBJ_ms_code_com 1L,3L,6L,1L,4L,1L,311L,2L,1L,22L + +#define SN_ms_ctl_sign "msCTLSign" +#define LN_ms_ctl_sign "Microsoft Trust List Signing" +#define NID_ms_ctl_sign 136 +#define OBJ_ms_ctl_sign 1L,3L,6L,1L,4L,1L,311L,10L,3L,1L + +#define SN_ms_sgc "msSGC" +#define LN_ms_sgc "Microsoft Server Gated Crypto" +#define NID_ms_sgc 137 +#define OBJ_ms_sgc 1L,3L,6L,1L,4L,1L,311L,10L,3L,3L + +#define SN_ms_efs "msEFS" +#define LN_ms_efs "Microsoft Encrypted File System" +#define NID_ms_efs 138 +#define OBJ_ms_efs 1L,3L,6L,1L,4L,1L,311L,10L,3L,4L + +#define SN_ms_smartcard_login "msSmartcardLogin" +#define LN_ms_smartcard_login "Microsoft Smartcardlogin" +#define NID_ms_smartcard_login 648 +#define OBJ_ms_smartcard_login 1L,3L,6L,1L,4L,1L,311L,20L,2L,2L + +#define SN_ms_upn "msUPN" +#define LN_ms_upn "Microsoft Universal Principal Name" +#define NID_ms_upn 649 +#define OBJ_ms_upn 1L,3L,6L,1L,4L,1L,311L,20L,2L,3L + +#define SN_idea_cbc "IDEA-CBC" +#define LN_idea_cbc "idea-cbc" +#define NID_idea_cbc 34 +#define OBJ_idea_cbc 1L,3L,6L,1L,4L,1L,188L,7L,1L,1L,2L + +#define SN_idea_ecb "IDEA-ECB" +#define LN_idea_ecb "idea-ecb" +#define NID_idea_ecb 36 + +#define SN_idea_cfb64 "IDEA-CFB" +#define LN_idea_cfb64 "idea-cfb" +#define NID_idea_cfb64 35 + +#define SN_idea_ofb64 "IDEA-OFB" +#define LN_idea_ofb64 "idea-ofb" +#define NID_idea_ofb64 46 + +#define SN_bf_cbc "BF-CBC" +#define LN_bf_cbc "bf-cbc" +#define NID_bf_cbc 91 +#define OBJ_bf_cbc 1L,3L,6L,1L,4L,1L,3029L,1L,2L + +#define SN_bf_ecb "BF-ECB" +#define LN_bf_ecb "bf-ecb" +#define NID_bf_ecb 92 + +#define SN_bf_cfb64 "BF-CFB" +#define LN_bf_cfb64 "bf-cfb" +#define NID_bf_cfb64 93 + +#define SN_bf_ofb64 "BF-OFB" +#define LN_bf_ofb64 "bf-ofb" +#define NID_bf_ofb64 94 + +#define SN_id_pkix "PKIX" +#define NID_id_pkix 127 +#define OBJ_id_pkix 1L,3L,6L,1L,5L,5L,7L + +#define SN_id_pkix_mod "id-pkix-mod" +#define NID_id_pkix_mod 258 +#define OBJ_id_pkix_mod OBJ_id_pkix,0L + +#define SN_id_pe "id-pe" +#define NID_id_pe 175 +#define OBJ_id_pe OBJ_id_pkix,1L + +#define SN_id_qt "id-qt" +#define NID_id_qt 259 +#define OBJ_id_qt OBJ_id_pkix,2L + +#define SN_id_kp "id-kp" +#define NID_id_kp 128 +#define OBJ_id_kp OBJ_id_pkix,3L + +#define SN_id_it "id-it" +#define NID_id_it 260 +#define OBJ_id_it OBJ_id_pkix,4L + +#define SN_id_pkip "id-pkip" +#define NID_id_pkip 261 +#define OBJ_id_pkip OBJ_id_pkix,5L + +#define SN_id_alg "id-alg" +#define NID_id_alg 262 +#define OBJ_id_alg OBJ_id_pkix,6L + +#define SN_id_cmc "id-cmc" +#define NID_id_cmc 263 +#define OBJ_id_cmc OBJ_id_pkix,7L + +#define SN_id_on "id-on" +#define NID_id_on 264 +#define OBJ_id_on OBJ_id_pkix,8L + +#define SN_id_pda "id-pda" +#define NID_id_pda 265 +#define OBJ_id_pda OBJ_id_pkix,9L + +#define SN_id_aca "id-aca" +#define NID_id_aca 266 +#define OBJ_id_aca OBJ_id_pkix,10L + +#define SN_id_qcs "id-qcs" +#define NID_id_qcs 267 +#define OBJ_id_qcs OBJ_id_pkix,11L + +#define SN_id_cct "id-cct" +#define NID_id_cct 268 +#define OBJ_id_cct OBJ_id_pkix,12L + +#define SN_id_ppl "id-ppl" +#define NID_id_ppl 662 +#define OBJ_id_ppl OBJ_id_pkix,21L + +#define SN_id_ad "id-ad" +#define NID_id_ad 176 +#define OBJ_id_ad OBJ_id_pkix,48L + +#define SN_id_pkix1_explicit_88 "id-pkix1-explicit-88" +#define NID_id_pkix1_explicit_88 269 +#define OBJ_id_pkix1_explicit_88 OBJ_id_pkix_mod,1L + +#define SN_id_pkix1_implicit_88 "id-pkix1-implicit-88" +#define NID_id_pkix1_implicit_88 270 +#define OBJ_id_pkix1_implicit_88 OBJ_id_pkix_mod,2L + +#define SN_id_pkix1_explicit_93 "id-pkix1-explicit-93" +#define NID_id_pkix1_explicit_93 271 +#define OBJ_id_pkix1_explicit_93 OBJ_id_pkix_mod,3L + +#define SN_id_pkix1_implicit_93 "id-pkix1-implicit-93" +#define NID_id_pkix1_implicit_93 272 +#define OBJ_id_pkix1_implicit_93 OBJ_id_pkix_mod,4L + +#define SN_id_mod_crmf "id-mod-crmf" +#define NID_id_mod_crmf 273 +#define OBJ_id_mod_crmf OBJ_id_pkix_mod,5L + +#define SN_id_mod_cmc "id-mod-cmc" +#define NID_id_mod_cmc 274 +#define OBJ_id_mod_cmc OBJ_id_pkix_mod,6L + +#define SN_id_mod_kea_profile_88 "id-mod-kea-profile-88" +#define NID_id_mod_kea_profile_88 275 +#define OBJ_id_mod_kea_profile_88 OBJ_id_pkix_mod,7L + +#define SN_id_mod_kea_profile_93 "id-mod-kea-profile-93" +#define NID_id_mod_kea_profile_93 276 +#define OBJ_id_mod_kea_profile_93 OBJ_id_pkix_mod,8L + +#define SN_id_mod_cmp "id-mod-cmp" +#define NID_id_mod_cmp 277 +#define OBJ_id_mod_cmp OBJ_id_pkix_mod,9L + +#define SN_id_mod_qualified_cert_88 "id-mod-qualified-cert-88" +#define NID_id_mod_qualified_cert_88 278 +#define OBJ_id_mod_qualified_cert_88 OBJ_id_pkix_mod,10L + +#define SN_id_mod_qualified_cert_93 "id-mod-qualified-cert-93" +#define NID_id_mod_qualified_cert_93 279 +#define OBJ_id_mod_qualified_cert_93 OBJ_id_pkix_mod,11L + +#define SN_id_mod_attribute_cert "id-mod-attribute-cert" +#define NID_id_mod_attribute_cert 280 +#define OBJ_id_mod_attribute_cert OBJ_id_pkix_mod,12L + +#define SN_id_mod_timestamp_protocol "id-mod-timestamp-protocol" +#define NID_id_mod_timestamp_protocol 281 +#define OBJ_id_mod_timestamp_protocol OBJ_id_pkix_mod,13L + +#define SN_id_mod_ocsp "id-mod-ocsp" +#define NID_id_mod_ocsp 282 +#define OBJ_id_mod_ocsp OBJ_id_pkix_mod,14L + +#define SN_id_mod_dvcs "id-mod-dvcs" +#define NID_id_mod_dvcs 283 +#define OBJ_id_mod_dvcs OBJ_id_pkix_mod,15L + +#define SN_id_mod_cmp2000 "id-mod-cmp2000" +#define NID_id_mod_cmp2000 284 +#define OBJ_id_mod_cmp2000 OBJ_id_pkix_mod,16L + +#define SN_info_access "authorityInfoAccess" +#define LN_info_access "Authority Information Access" +#define NID_info_access 177 +#define OBJ_info_access OBJ_id_pe,1L + +#define SN_biometricInfo "biometricInfo" +#define LN_biometricInfo "Biometric Info" +#define NID_biometricInfo 285 +#define OBJ_biometricInfo OBJ_id_pe,2L + +#define SN_qcStatements "qcStatements" +#define NID_qcStatements 286 +#define OBJ_qcStatements OBJ_id_pe,3L + +#define SN_ac_auditEntity "ac-auditEntity" +#define NID_ac_auditEntity 287 +#define OBJ_ac_auditEntity OBJ_id_pe,4L + +#define SN_ac_targeting "ac-targeting" +#define NID_ac_targeting 288 +#define OBJ_ac_targeting OBJ_id_pe,5L + +#define SN_aaControls "aaControls" +#define NID_aaControls 289 +#define OBJ_aaControls OBJ_id_pe,6L + +#define SN_sbgp_ipAddrBlock "sbgp-ipAddrBlock" +#define NID_sbgp_ipAddrBlock 290 +#define OBJ_sbgp_ipAddrBlock OBJ_id_pe,7L + +#define SN_sbgp_autonomousSysNum "sbgp-autonomousSysNum" +#define NID_sbgp_autonomousSysNum 291 +#define OBJ_sbgp_autonomousSysNum OBJ_id_pe,8L + +#define SN_sbgp_routerIdentifier "sbgp-routerIdentifier" +#define NID_sbgp_routerIdentifier 292 +#define OBJ_sbgp_routerIdentifier OBJ_id_pe,9L + +#define SN_ac_proxying "ac-proxying" +#define NID_ac_proxying 397 +#define OBJ_ac_proxying OBJ_id_pe,10L + +#define SN_sinfo_access "subjectInfoAccess" +#define LN_sinfo_access "Subject Information Access" +#define NID_sinfo_access 398 +#define OBJ_sinfo_access OBJ_id_pe,11L + +#define SN_proxyCertInfo "proxyCertInfo" +#define LN_proxyCertInfo "Proxy Certificate Information" +#define NID_proxyCertInfo 663 +#define OBJ_proxyCertInfo OBJ_id_pe,14L + +#define SN_id_qt_cps "id-qt-cps" +#define LN_id_qt_cps "Policy Qualifier CPS" +#define NID_id_qt_cps 164 +#define OBJ_id_qt_cps OBJ_id_qt,1L + +#define SN_id_qt_unotice "id-qt-unotice" +#define LN_id_qt_unotice "Policy Qualifier User Notice" +#define NID_id_qt_unotice 165 +#define OBJ_id_qt_unotice OBJ_id_qt,2L + +#define SN_textNotice "textNotice" +#define NID_textNotice 293 +#define OBJ_textNotice OBJ_id_qt,3L + +#define SN_server_auth "serverAuth" +#define LN_server_auth "TLS Web Server Authentication" +#define NID_server_auth 129 +#define OBJ_server_auth OBJ_id_kp,1L + +#define SN_client_auth "clientAuth" +#define LN_client_auth "TLS Web Client Authentication" +#define NID_client_auth 130 +#define OBJ_client_auth OBJ_id_kp,2L + +#define SN_code_sign "codeSigning" +#define LN_code_sign "Code Signing" +#define NID_code_sign 131 +#define OBJ_code_sign OBJ_id_kp,3L + +#define SN_email_protect "emailProtection" +#define LN_email_protect "E-mail Protection" +#define NID_email_protect 132 +#define OBJ_email_protect OBJ_id_kp,4L + +#define SN_ipsecEndSystem "ipsecEndSystem" +#define LN_ipsecEndSystem "IPSec End System" +#define NID_ipsecEndSystem 294 +#define OBJ_ipsecEndSystem OBJ_id_kp,5L + +#define SN_ipsecTunnel "ipsecTunnel" +#define LN_ipsecTunnel "IPSec Tunnel" +#define NID_ipsecTunnel 295 +#define OBJ_ipsecTunnel OBJ_id_kp,6L + +#define SN_ipsecUser "ipsecUser" +#define LN_ipsecUser "IPSec User" +#define NID_ipsecUser 296 +#define OBJ_ipsecUser OBJ_id_kp,7L + +#define SN_time_stamp "timeStamping" +#define LN_time_stamp "Time Stamping" +#define NID_time_stamp 133 +#define OBJ_time_stamp OBJ_id_kp,8L + +#define SN_OCSP_sign "OCSPSigning" +#define LN_OCSP_sign "OCSP Signing" +#define NID_OCSP_sign 180 +#define OBJ_OCSP_sign OBJ_id_kp,9L + +#define SN_dvcs "DVCS" +#define LN_dvcs "dvcs" +#define NID_dvcs 297 +#define OBJ_dvcs OBJ_id_kp,10L + +#define SN_id_it_caProtEncCert "id-it-caProtEncCert" +#define NID_id_it_caProtEncCert 298 +#define OBJ_id_it_caProtEncCert OBJ_id_it,1L + +#define SN_id_it_signKeyPairTypes "id-it-signKeyPairTypes" +#define NID_id_it_signKeyPairTypes 299 +#define OBJ_id_it_signKeyPairTypes OBJ_id_it,2L + +#define SN_id_it_encKeyPairTypes "id-it-encKeyPairTypes" +#define NID_id_it_encKeyPairTypes 300 +#define OBJ_id_it_encKeyPairTypes OBJ_id_it,3L + +#define SN_id_it_preferredSymmAlg "id-it-preferredSymmAlg" +#define NID_id_it_preferredSymmAlg 301 +#define OBJ_id_it_preferredSymmAlg OBJ_id_it,4L + +#define SN_id_it_caKeyUpdateInfo "id-it-caKeyUpdateInfo" +#define NID_id_it_caKeyUpdateInfo 302 +#define OBJ_id_it_caKeyUpdateInfo OBJ_id_it,5L + +#define SN_id_it_currentCRL "id-it-currentCRL" +#define NID_id_it_currentCRL 303 +#define OBJ_id_it_currentCRL OBJ_id_it,6L + +#define SN_id_it_unsupportedOIDs "id-it-unsupportedOIDs" +#define NID_id_it_unsupportedOIDs 304 +#define OBJ_id_it_unsupportedOIDs OBJ_id_it,7L + +#define SN_id_it_subscriptionRequest "id-it-subscriptionRequest" +#define NID_id_it_subscriptionRequest 305 +#define OBJ_id_it_subscriptionRequest OBJ_id_it,8L + +#define SN_id_it_subscriptionResponse "id-it-subscriptionResponse" +#define NID_id_it_subscriptionResponse 306 +#define OBJ_id_it_subscriptionResponse OBJ_id_it,9L + +#define SN_id_it_keyPairParamReq "id-it-keyPairParamReq" +#define NID_id_it_keyPairParamReq 307 +#define OBJ_id_it_keyPairParamReq OBJ_id_it,10L + +#define SN_id_it_keyPairParamRep "id-it-keyPairParamRep" +#define NID_id_it_keyPairParamRep 308 +#define OBJ_id_it_keyPairParamRep OBJ_id_it,11L + +#define SN_id_it_revPassphrase "id-it-revPassphrase" +#define NID_id_it_revPassphrase 309 +#define OBJ_id_it_revPassphrase OBJ_id_it,12L + +#define SN_id_it_implicitConfirm "id-it-implicitConfirm" +#define NID_id_it_implicitConfirm 310 +#define OBJ_id_it_implicitConfirm OBJ_id_it,13L + +#define SN_id_it_confirmWaitTime "id-it-confirmWaitTime" +#define NID_id_it_confirmWaitTime 311 +#define OBJ_id_it_confirmWaitTime OBJ_id_it,14L + +#define SN_id_it_origPKIMessage "id-it-origPKIMessage" +#define NID_id_it_origPKIMessage 312 +#define OBJ_id_it_origPKIMessage OBJ_id_it,15L + +#define SN_id_it_suppLangTags "id-it-suppLangTags" +#define NID_id_it_suppLangTags 784 +#define OBJ_id_it_suppLangTags OBJ_id_it,16L + +#define SN_id_regCtrl "id-regCtrl" +#define NID_id_regCtrl 313 +#define OBJ_id_regCtrl OBJ_id_pkip,1L + +#define SN_id_regInfo "id-regInfo" +#define NID_id_regInfo 314 +#define OBJ_id_regInfo OBJ_id_pkip,2L + +#define SN_id_regCtrl_regToken "id-regCtrl-regToken" +#define NID_id_regCtrl_regToken 315 +#define OBJ_id_regCtrl_regToken OBJ_id_regCtrl,1L + +#define SN_id_regCtrl_authenticator "id-regCtrl-authenticator" +#define NID_id_regCtrl_authenticator 316 +#define OBJ_id_regCtrl_authenticator OBJ_id_regCtrl,2L + +#define SN_id_regCtrl_pkiPublicationInfo "id-regCtrl-pkiPublicationInfo" +#define NID_id_regCtrl_pkiPublicationInfo 317 +#define OBJ_id_regCtrl_pkiPublicationInfo OBJ_id_regCtrl,3L + +#define SN_id_regCtrl_pkiArchiveOptions "id-regCtrl-pkiArchiveOptions" +#define NID_id_regCtrl_pkiArchiveOptions 318 +#define OBJ_id_regCtrl_pkiArchiveOptions OBJ_id_regCtrl,4L + +#define SN_id_regCtrl_oldCertID "id-regCtrl-oldCertID" +#define NID_id_regCtrl_oldCertID 319 +#define OBJ_id_regCtrl_oldCertID OBJ_id_regCtrl,5L + +#define SN_id_regCtrl_protocolEncrKey "id-regCtrl-protocolEncrKey" +#define NID_id_regCtrl_protocolEncrKey 320 +#define OBJ_id_regCtrl_protocolEncrKey OBJ_id_regCtrl,6L + +#define SN_id_regInfo_utf8Pairs "id-regInfo-utf8Pairs" +#define NID_id_regInfo_utf8Pairs 321 +#define OBJ_id_regInfo_utf8Pairs OBJ_id_regInfo,1L + +#define SN_id_regInfo_certReq "id-regInfo-certReq" +#define NID_id_regInfo_certReq 322 +#define OBJ_id_regInfo_certReq OBJ_id_regInfo,2L + +#define SN_id_alg_des40 "id-alg-des40" +#define NID_id_alg_des40 323 +#define OBJ_id_alg_des40 OBJ_id_alg,1L + +#define SN_id_alg_noSignature "id-alg-noSignature" +#define NID_id_alg_noSignature 324 +#define OBJ_id_alg_noSignature OBJ_id_alg,2L + +#define SN_id_alg_dh_sig_hmac_sha1 "id-alg-dh-sig-hmac-sha1" +#define NID_id_alg_dh_sig_hmac_sha1 325 +#define OBJ_id_alg_dh_sig_hmac_sha1 OBJ_id_alg,3L + +#define SN_id_alg_dh_pop "id-alg-dh-pop" +#define NID_id_alg_dh_pop 326 +#define OBJ_id_alg_dh_pop OBJ_id_alg,4L + +#define SN_id_cmc_statusInfo "id-cmc-statusInfo" +#define NID_id_cmc_statusInfo 327 +#define OBJ_id_cmc_statusInfo OBJ_id_cmc,1L + +#define SN_id_cmc_identification "id-cmc-identification" +#define NID_id_cmc_identification 328 +#define OBJ_id_cmc_identification OBJ_id_cmc,2L + +#define SN_id_cmc_identityProof "id-cmc-identityProof" +#define NID_id_cmc_identityProof 329 +#define OBJ_id_cmc_identityProof OBJ_id_cmc,3L + +#define SN_id_cmc_dataReturn "id-cmc-dataReturn" +#define NID_id_cmc_dataReturn 330 +#define OBJ_id_cmc_dataReturn OBJ_id_cmc,4L + +#define SN_id_cmc_transactionId "id-cmc-transactionId" +#define NID_id_cmc_transactionId 331 +#define OBJ_id_cmc_transactionId OBJ_id_cmc,5L + +#define SN_id_cmc_senderNonce "id-cmc-senderNonce" +#define NID_id_cmc_senderNonce 332 +#define OBJ_id_cmc_senderNonce OBJ_id_cmc,6L + +#define SN_id_cmc_recipientNonce "id-cmc-recipientNonce" +#define NID_id_cmc_recipientNonce 333 +#define OBJ_id_cmc_recipientNonce OBJ_id_cmc,7L + +#define SN_id_cmc_addExtensions "id-cmc-addExtensions" +#define NID_id_cmc_addExtensions 334 +#define OBJ_id_cmc_addExtensions OBJ_id_cmc,8L + +#define SN_id_cmc_encryptedPOP "id-cmc-encryptedPOP" +#define NID_id_cmc_encryptedPOP 335 +#define OBJ_id_cmc_encryptedPOP OBJ_id_cmc,9L + +#define SN_id_cmc_decryptedPOP "id-cmc-decryptedPOP" +#define NID_id_cmc_decryptedPOP 336 +#define OBJ_id_cmc_decryptedPOP OBJ_id_cmc,10L + +#define SN_id_cmc_lraPOPWitness "id-cmc-lraPOPWitness" +#define NID_id_cmc_lraPOPWitness 337 +#define OBJ_id_cmc_lraPOPWitness OBJ_id_cmc,11L + +#define SN_id_cmc_getCert "id-cmc-getCert" +#define NID_id_cmc_getCert 338 +#define OBJ_id_cmc_getCert OBJ_id_cmc,15L + +#define SN_id_cmc_getCRL "id-cmc-getCRL" +#define NID_id_cmc_getCRL 339 +#define OBJ_id_cmc_getCRL OBJ_id_cmc,16L + +#define SN_id_cmc_revokeRequest "id-cmc-revokeRequest" +#define NID_id_cmc_revokeRequest 340 +#define OBJ_id_cmc_revokeRequest OBJ_id_cmc,17L + +#define SN_id_cmc_regInfo "id-cmc-regInfo" +#define NID_id_cmc_regInfo 341 +#define OBJ_id_cmc_regInfo OBJ_id_cmc,18L + +#define SN_id_cmc_responseInfo "id-cmc-responseInfo" +#define NID_id_cmc_responseInfo 342 +#define OBJ_id_cmc_responseInfo OBJ_id_cmc,19L + +#define SN_id_cmc_queryPending "id-cmc-queryPending" +#define NID_id_cmc_queryPending 343 +#define OBJ_id_cmc_queryPending OBJ_id_cmc,21L + +#define SN_id_cmc_popLinkRandom "id-cmc-popLinkRandom" +#define NID_id_cmc_popLinkRandom 344 +#define OBJ_id_cmc_popLinkRandom OBJ_id_cmc,22L + +#define SN_id_cmc_popLinkWitness "id-cmc-popLinkWitness" +#define NID_id_cmc_popLinkWitness 345 +#define OBJ_id_cmc_popLinkWitness OBJ_id_cmc,23L + +#define SN_id_cmc_confirmCertAcceptance "id-cmc-confirmCertAcceptance" +#define NID_id_cmc_confirmCertAcceptance 346 +#define OBJ_id_cmc_confirmCertAcceptance OBJ_id_cmc,24L + +#define SN_id_on_personalData "id-on-personalData" +#define NID_id_on_personalData 347 +#define OBJ_id_on_personalData OBJ_id_on,1L + +#define SN_id_on_permanentIdentifier "id-on-permanentIdentifier" +#define LN_id_on_permanentIdentifier "Permanent Identifier" +#define NID_id_on_permanentIdentifier 858 +#define OBJ_id_on_permanentIdentifier OBJ_id_on,3L + +#define SN_id_pda_dateOfBirth "id-pda-dateOfBirth" +#define NID_id_pda_dateOfBirth 348 +#define OBJ_id_pda_dateOfBirth OBJ_id_pda,1L + +#define SN_id_pda_placeOfBirth "id-pda-placeOfBirth" +#define NID_id_pda_placeOfBirth 349 +#define OBJ_id_pda_placeOfBirth OBJ_id_pda,2L + +#define SN_id_pda_gender "id-pda-gender" +#define NID_id_pda_gender 351 +#define OBJ_id_pda_gender OBJ_id_pda,3L + +#define SN_id_pda_countryOfCitizenship "id-pda-countryOfCitizenship" +#define NID_id_pda_countryOfCitizenship 352 +#define OBJ_id_pda_countryOfCitizenship OBJ_id_pda,4L + +#define SN_id_pda_countryOfResidence "id-pda-countryOfResidence" +#define NID_id_pda_countryOfResidence 353 +#define OBJ_id_pda_countryOfResidence OBJ_id_pda,5L + +#define SN_id_aca_authenticationInfo "id-aca-authenticationInfo" +#define NID_id_aca_authenticationInfo 354 +#define OBJ_id_aca_authenticationInfo OBJ_id_aca,1L + +#define SN_id_aca_accessIdentity "id-aca-accessIdentity" +#define NID_id_aca_accessIdentity 355 +#define OBJ_id_aca_accessIdentity OBJ_id_aca,2L + +#define SN_id_aca_chargingIdentity "id-aca-chargingIdentity" +#define NID_id_aca_chargingIdentity 356 +#define OBJ_id_aca_chargingIdentity OBJ_id_aca,3L + +#define SN_id_aca_group "id-aca-group" +#define NID_id_aca_group 357 +#define OBJ_id_aca_group OBJ_id_aca,4L + +#define SN_id_aca_role "id-aca-role" +#define NID_id_aca_role 358 +#define OBJ_id_aca_role OBJ_id_aca,5L + +#define SN_id_aca_encAttrs "id-aca-encAttrs" +#define NID_id_aca_encAttrs 399 +#define OBJ_id_aca_encAttrs OBJ_id_aca,6L + +#define SN_id_qcs_pkixQCSyntax_v1 "id-qcs-pkixQCSyntax-v1" +#define NID_id_qcs_pkixQCSyntax_v1 359 +#define OBJ_id_qcs_pkixQCSyntax_v1 OBJ_id_qcs,1L + +#define SN_id_cct_crs "id-cct-crs" +#define NID_id_cct_crs 360 +#define OBJ_id_cct_crs OBJ_id_cct,1L + +#define SN_id_cct_PKIData "id-cct-PKIData" +#define NID_id_cct_PKIData 361 +#define OBJ_id_cct_PKIData OBJ_id_cct,2L + +#define SN_id_cct_PKIResponse "id-cct-PKIResponse" +#define NID_id_cct_PKIResponse 362 +#define OBJ_id_cct_PKIResponse OBJ_id_cct,3L + +#define SN_id_ppl_anyLanguage "id-ppl-anyLanguage" +#define LN_id_ppl_anyLanguage "Any language" +#define NID_id_ppl_anyLanguage 664 +#define OBJ_id_ppl_anyLanguage OBJ_id_ppl,0L + +#define SN_id_ppl_inheritAll "id-ppl-inheritAll" +#define LN_id_ppl_inheritAll "Inherit all" +#define NID_id_ppl_inheritAll 665 +#define OBJ_id_ppl_inheritAll OBJ_id_ppl,1L + +#define SN_Independent "id-ppl-independent" +#define LN_Independent "Independent" +#define NID_Independent 667 +#define OBJ_Independent OBJ_id_ppl,2L + +#define SN_ad_OCSP "OCSP" +#define LN_ad_OCSP "OCSP" +#define NID_ad_OCSP 178 +#define OBJ_ad_OCSP OBJ_id_ad,1L + +#define SN_ad_ca_issuers "caIssuers" +#define LN_ad_ca_issuers "CA Issuers" +#define NID_ad_ca_issuers 179 +#define OBJ_ad_ca_issuers OBJ_id_ad,2L + +#define SN_ad_timeStamping "ad_timestamping" +#define LN_ad_timeStamping "AD Time Stamping" +#define NID_ad_timeStamping 363 +#define OBJ_ad_timeStamping OBJ_id_ad,3L + +#define SN_ad_dvcs "AD_DVCS" +#define LN_ad_dvcs "ad dvcs" +#define NID_ad_dvcs 364 +#define OBJ_ad_dvcs OBJ_id_ad,4L + +#define SN_caRepository "caRepository" +#define LN_caRepository "CA Repository" +#define NID_caRepository 785 +#define OBJ_caRepository OBJ_id_ad,5L + +#define OBJ_id_pkix_OCSP OBJ_ad_OCSP + +#define SN_id_pkix_OCSP_basic "basicOCSPResponse" +#define LN_id_pkix_OCSP_basic "Basic OCSP Response" +#define NID_id_pkix_OCSP_basic 365 +#define OBJ_id_pkix_OCSP_basic OBJ_id_pkix_OCSP,1L + +#define SN_id_pkix_OCSP_Nonce "Nonce" +#define LN_id_pkix_OCSP_Nonce "OCSP Nonce" +#define NID_id_pkix_OCSP_Nonce 366 +#define OBJ_id_pkix_OCSP_Nonce OBJ_id_pkix_OCSP,2L + +#define SN_id_pkix_OCSP_CrlID "CrlID" +#define LN_id_pkix_OCSP_CrlID "OCSP CRL ID" +#define NID_id_pkix_OCSP_CrlID 367 +#define OBJ_id_pkix_OCSP_CrlID OBJ_id_pkix_OCSP,3L + +#define SN_id_pkix_OCSP_acceptableResponses "acceptableResponses" +#define LN_id_pkix_OCSP_acceptableResponses "Acceptable OCSP Responses" +#define NID_id_pkix_OCSP_acceptableResponses 368 +#define OBJ_id_pkix_OCSP_acceptableResponses OBJ_id_pkix_OCSP,4L + +#define SN_id_pkix_OCSP_noCheck "noCheck" +#define LN_id_pkix_OCSP_noCheck "OCSP No Check" +#define NID_id_pkix_OCSP_noCheck 369 +#define OBJ_id_pkix_OCSP_noCheck OBJ_id_pkix_OCSP,5L + +#define SN_id_pkix_OCSP_archiveCutoff "archiveCutoff" +#define LN_id_pkix_OCSP_archiveCutoff "OCSP Archive Cutoff" +#define NID_id_pkix_OCSP_archiveCutoff 370 +#define OBJ_id_pkix_OCSP_archiveCutoff OBJ_id_pkix_OCSP,6L + +#define SN_id_pkix_OCSP_serviceLocator "serviceLocator" +#define LN_id_pkix_OCSP_serviceLocator "OCSP Service Locator" +#define NID_id_pkix_OCSP_serviceLocator 371 +#define OBJ_id_pkix_OCSP_serviceLocator OBJ_id_pkix_OCSP,7L + +#define SN_id_pkix_OCSP_extendedStatus "extendedStatus" +#define LN_id_pkix_OCSP_extendedStatus "Extended OCSP Status" +#define NID_id_pkix_OCSP_extendedStatus 372 +#define OBJ_id_pkix_OCSP_extendedStatus OBJ_id_pkix_OCSP,8L + +#define SN_id_pkix_OCSP_valid "valid" +#define NID_id_pkix_OCSP_valid 373 +#define OBJ_id_pkix_OCSP_valid OBJ_id_pkix_OCSP,9L + +#define SN_id_pkix_OCSP_path "path" +#define NID_id_pkix_OCSP_path 374 +#define OBJ_id_pkix_OCSP_path OBJ_id_pkix_OCSP,10L + +#define SN_id_pkix_OCSP_trustRoot "trustRoot" +#define LN_id_pkix_OCSP_trustRoot "Trust Root" +#define NID_id_pkix_OCSP_trustRoot 375 +#define OBJ_id_pkix_OCSP_trustRoot OBJ_id_pkix_OCSP,11L + +#define SN_algorithm "algorithm" +#define LN_algorithm "algorithm" +#define NID_algorithm 376 +#define OBJ_algorithm 1L,3L,14L,3L,2L + +#define SN_md5WithRSA "RSA-NP-MD5" +#define LN_md5WithRSA "md5WithRSA" +#define NID_md5WithRSA 104 +#define OBJ_md5WithRSA OBJ_algorithm,3L + +#define SN_des_ecb "DES-ECB" +#define LN_des_ecb "des-ecb" +#define NID_des_ecb 29 +#define OBJ_des_ecb OBJ_algorithm,6L + +#define SN_des_cbc "DES-CBC" +#define LN_des_cbc "des-cbc" +#define NID_des_cbc 31 +#define OBJ_des_cbc OBJ_algorithm,7L + +#define SN_des_ofb64 "DES-OFB" +#define LN_des_ofb64 "des-ofb" +#define NID_des_ofb64 45 +#define OBJ_des_ofb64 OBJ_algorithm,8L + +#define SN_des_cfb64 "DES-CFB" +#define LN_des_cfb64 "des-cfb" +#define NID_des_cfb64 30 +#define OBJ_des_cfb64 OBJ_algorithm,9L + +#define SN_rsaSignature "rsaSignature" +#define NID_rsaSignature 377 +#define OBJ_rsaSignature OBJ_algorithm,11L + +#define SN_dsa_2 "DSA-old" +#define LN_dsa_2 "dsaEncryption-old" +#define NID_dsa_2 67 +#define OBJ_dsa_2 OBJ_algorithm,12L + +#define SN_dsaWithSHA "DSA-SHA" +#define LN_dsaWithSHA "dsaWithSHA" +#define NID_dsaWithSHA 66 +#define OBJ_dsaWithSHA OBJ_algorithm,13L + +#define SN_shaWithRSAEncryption "RSA-SHA" +#define LN_shaWithRSAEncryption "shaWithRSAEncryption" +#define NID_shaWithRSAEncryption 42 +#define OBJ_shaWithRSAEncryption OBJ_algorithm,15L + +#define SN_des_ede_ecb "DES-EDE" +#define LN_des_ede_ecb "des-ede" +#define NID_des_ede_ecb 32 +#define OBJ_des_ede_ecb OBJ_algorithm,17L + +#define SN_des_ede3_ecb "DES-EDE3" +#define LN_des_ede3_ecb "des-ede3" +#define NID_des_ede3_ecb 33 + +#define SN_des_ede_cbc "DES-EDE-CBC" +#define LN_des_ede_cbc "des-ede-cbc" +#define NID_des_ede_cbc 43 + +#define SN_des_ede_cfb64 "DES-EDE-CFB" +#define LN_des_ede_cfb64 "des-ede-cfb" +#define NID_des_ede_cfb64 60 + +#define SN_des_ede3_cfb64 "DES-EDE3-CFB" +#define LN_des_ede3_cfb64 "des-ede3-cfb" +#define NID_des_ede3_cfb64 61 + +#define SN_des_ede_ofb64 "DES-EDE-OFB" +#define LN_des_ede_ofb64 "des-ede-ofb" +#define NID_des_ede_ofb64 62 + +#define SN_des_ede3_ofb64 "DES-EDE3-OFB" +#define LN_des_ede3_ofb64 "des-ede3-ofb" +#define NID_des_ede3_ofb64 63 + +#define SN_desx_cbc "DESX-CBC" +#define LN_desx_cbc "desx-cbc" +#define NID_desx_cbc 80 + +#define SN_sha "SHA" +#define LN_sha "sha" +#define NID_sha 41 +#define OBJ_sha OBJ_algorithm,18L + +#define SN_sha1 "SHA1" +#define LN_sha1 "sha1" +#define NID_sha1 64 +#define OBJ_sha1 OBJ_algorithm,26L + +#define SN_dsaWithSHA1_2 "DSA-SHA1-old" +#define LN_dsaWithSHA1_2 "dsaWithSHA1-old" +#define NID_dsaWithSHA1_2 70 +#define OBJ_dsaWithSHA1_2 OBJ_algorithm,27L + +#define SN_sha1WithRSA "RSA-SHA1-2" +#define LN_sha1WithRSA "sha1WithRSA" +#define NID_sha1WithRSA 115 +#define OBJ_sha1WithRSA OBJ_algorithm,29L + +#define SN_ripemd160 "RIPEMD160" +#define LN_ripemd160 "ripemd160" +#define NID_ripemd160 117 +#define OBJ_ripemd160 1L,3L,36L,3L,2L,1L + +#define SN_ripemd160WithRSA "RSA-RIPEMD160" +#define LN_ripemd160WithRSA "ripemd160WithRSA" +#define NID_ripemd160WithRSA 119 +#define OBJ_ripemd160WithRSA 1L,3L,36L,3L,3L,1L,2L + +#define SN_sxnet "SXNetID" +#define LN_sxnet "Strong Extranet ID" +#define NID_sxnet 143 +#define OBJ_sxnet 1L,3L,101L,1L,4L,1L + +#define SN_X500 "X500" +#define LN_X500 "directory services (X.500)" +#define NID_X500 11 +#define OBJ_X500 2L,5L + +#define SN_X509 "X509" +#define NID_X509 12 +#define OBJ_X509 OBJ_X500,4L + +#define SN_commonName "CN" +#define LN_commonName "commonName" +#define NID_commonName 13 +#define OBJ_commonName OBJ_X509,3L + +#define SN_surname "SN" +#define LN_surname "surname" +#define NID_surname 100 +#define OBJ_surname OBJ_X509,4L + +#define LN_serialNumber "serialNumber" +#define NID_serialNumber 105 +#define OBJ_serialNumber OBJ_X509,5L + +#define SN_countryName "C" +#define LN_countryName "countryName" +#define NID_countryName 14 +#define OBJ_countryName OBJ_X509,6L + +#define SN_localityName "L" +#define LN_localityName "localityName" +#define NID_localityName 15 +#define OBJ_localityName OBJ_X509,7L + +#define SN_stateOrProvinceName "ST" +#define LN_stateOrProvinceName "stateOrProvinceName" +#define NID_stateOrProvinceName 16 +#define OBJ_stateOrProvinceName OBJ_X509,8L + +#define SN_streetAddress "street" +#define LN_streetAddress "streetAddress" +#define NID_streetAddress 660 +#define OBJ_streetAddress OBJ_X509,9L + +#define SN_organizationName "O" +#define LN_organizationName "organizationName" +#define NID_organizationName 17 +#define OBJ_organizationName OBJ_X509,10L + +#define SN_organizationalUnitName "OU" +#define LN_organizationalUnitName "organizationalUnitName" +#define NID_organizationalUnitName 18 +#define OBJ_organizationalUnitName OBJ_X509,11L + +#define SN_title "title" +#define LN_title "title" +#define NID_title 106 +#define OBJ_title OBJ_X509,12L + +#define LN_description "description" +#define NID_description 107 +#define OBJ_description OBJ_X509,13L + +#define LN_searchGuide "searchGuide" +#define NID_searchGuide 859 +#define OBJ_searchGuide OBJ_X509,14L + +#define LN_businessCategory "businessCategory" +#define NID_businessCategory 860 +#define OBJ_businessCategory OBJ_X509,15L + +#define LN_postalAddress "postalAddress" +#define NID_postalAddress 861 +#define OBJ_postalAddress OBJ_X509,16L + +#define LN_postalCode "postalCode" +#define NID_postalCode 661 +#define OBJ_postalCode OBJ_X509,17L + +#define LN_postOfficeBox "postOfficeBox" +#define NID_postOfficeBox 862 +#define OBJ_postOfficeBox OBJ_X509,18L + +#define LN_physicalDeliveryOfficeName "physicalDeliveryOfficeName" +#define NID_physicalDeliveryOfficeName 863 +#define OBJ_physicalDeliveryOfficeName OBJ_X509,19L + +#define LN_telephoneNumber "telephoneNumber" +#define NID_telephoneNumber 864 +#define OBJ_telephoneNumber OBJ_X509,20L + +#define LN_telexNumber "telexNumber" +#define NID_telexNumber 865 +#define OBJ_telexNumber OBJ_X509,21L + +#define LN_teletexTerminalIdentifier "teletexTerminalIdentifier" +#define NID_teletexTerminalIdentifier 866 +#define OBJ_teletexTerminalIdentifier OBJ_X509,22L + +#define LN_facsimileTelephoneNumber "facsimileTelephoneNumber" +#define NID_facsimileTelephoneNumber 867 +#define OBJ_facsimileTelephoneNumber OBJ_X509,23L + +#define LN_x121Address "x121Address" +#define NID_x121Address 868 +#define OBJ_x121Address OBJ_X509,24L + +#define LN_internationaliSDNNumber "internationaliSDNNumber" +#define NID_internationaliSDNNumber 869 +#define OBJ_internationaliSDNNumber OBJ_X509,25L + +#define LN_registeredAddress "registeredAddress" +#define NID_registeredAddress 870 +#define OBJ_registeredAddress OBJ_X509,26L + +#define LN_destinationIndicator "destinationIndicator" +#define NID_destinationIndicator 871 +#define OBJ_destinationIndicator OBJ_X509,27L + +#define LN_preferredDeliveryMethod "preferredDeliveryMethod" +#define NID_preferredDeliveryMethod 872 +#define OBJ_preferredDeliveryMethod OBJ_X509,28L + +#define LN_presentationAddress "presentationAddress" +#define NID_presentationAddress 873 +#define OBJ_presentationAddress OBJ_X509,29L + +#define LN_supportedApplicationContext "supportedApplicationContext" +#define NID_supportedApplicationContext 874 +#define OBJ_supportedApplicationContext OBJ_X509,30L + +#define SN_member "member" +#define NID_member 875 +#define OBJ_member OBJ_X509,31L + +#define SN_owner "owner" +#define NID_owner 876 +#define OBJ_owner OBJ_X509,32L + +#define LN_roleOccupant "roleOccupant" +#define NID_roleOccupant 877 +#define OBJ_roleOccupant OBJ_X509,33L + +#define SN_seeAlso "seeAlso" +#define NID_seeAlso 878 +#define OBJ_seeAlso OBJ_X509,34L + +#define LN_userPassword "userPassword" +#define NID_userPassword 879 +#define OBJ_userPassword OBJ_X509,35L + +#define LN_userCertificate "userCertificate" +#define NID_userCertificate 880 +#define OBJ_userCertificate OBJ_X509,36L + +#define LN_cACertificate "cACertificate" +#define NID_cACertificate 881 +#define OBJ_cACertificate OBJ_X509,37L + +#define LN_authorityRevocationList "authorityRevocationList" +#define NID_authorityRevocationList 882 +#define OBJ_authorityRevocationList OBJ_X509,38L + +#define LN_certificateRevocationList "certificateRevocationList" +#define NID_certificateRevocationList 883 +#define OBJ_certificateRevocationList OBJ_X509,39L + +#define LN_crossCertificatePair "crossCertificatePair" +#define NID_crossCertificatePair 884 +#define OBJ_crossCertificatePair OBJ_X509,40L + +#define SN_name "name" +#define LN_name "name" +#define NID_name 173 +#define OBJ_name OBJ_X509,41L + +#define SN_givenName "GN" +#define LN_givenName "givenName" +#define NID_givenName 99 +#define OBJ_givenName OBJ_X509,42L + +#define SN_initials "initials" +#define LN_initials "initials" +#define NID_initials 101 +#define OBJ_initials OBJ_X509,43L + +#define LN_generationQualifier "generationQualifier" +#define NID_generationQualifier 509 +#define OBJ_generationQualifier OBJ_X509,44L + +#define LN_x500UniqueIdentifier "x500UniqueIdentifier" +#define NID_x500UniqueIdentifier 503 +#define OBJ_x500UniqueIdentifier OBJ_X509,45L + +#define SN_dnQualifier "dnQualifier" +#define LN_dnQualifier "dnQualifier" +#define NID_dnQualifier 174 +#define OBJ_dnQualifier OBJ_X509,46L + +#define LN_enhancedSearchGuide "enhancedSearchGuide" +#define NID_enhancedSearchGuide 885 +#define OBJ_enhancedSearchGuide OBJ_X509,47L + +#define LN_protocolInformation "protocolInformation" +#define NID_protocolInformation 886 +#define OBJ_protocolInformation OBJ_X509,48L + +#define LN_distinguishedName "distinguishedName" +#define NID_distinguishedName 887 +#define OBJ_distinguishedName OBJ_X509,49L + +#define LN_uniqueMember "uniqueMember" +#define NID_uniqueMember 888 +#define OBJ_uniqueMember OBJ_X509,50L + +#define LN_houseIdentifier "houseIdentifier" +#define NID_houseIdentifier 889 +#define OBJ_houseIdentifier OBJ_X509,51L + +#define LN_supportedAlgorithms "supportedAlgorithms" +#define NID_supportedAlgorithms 890 +#define OBJ_supportedAlgorithms OBJ_X509,52L + +#define LN_deltaRevocationList "deltaRevocationList" +#define NID_deltaRevocationList 891 +#define OBJ_deltaRevocationList OBJ_X509,53L + +#define SN_dmdName "dmdName" +#define NID_dmdName 892 +#define OBJ_dmdName OBJ_X509,54L + +#define LN_pseudonym "pseudonym" +#define NID_pseudonym 510 +#define OBJ_pseudonym OBJ_X509,65L + +#define SN_role "role" +#define LN_role "role" +#define NID_role 400 +#define OBJ_role OBJ_X509,72L + +#define SN_X500algorithms "X500algorithms" +#define LN_X500algorithms "directory services - algorithms" +#define NID_X500algorithms 378 +#define OBJ_X500algorithms OBJ_X500,8L + +#define SN_rsa "RSA" +#define LN_rsa "rsa" +#define NID_rsa 19 +#define OBJ_rsa OBJ_X500algorithms,1L,1L + +#define SN_mdc2WithRSA "RSA-MDC2" +#define LN_mdc2WithRSA "mdc2WithRSA" +#define NID_mdc2WithRSA 96 +#define OBJ_mdc2WithRSA OBJ_X500algorithms,3L,100L + +#define SN_mdc2 "MDC2" +#define LN_mdc2 "mdc2" +#define NID_mdc2 95 +#define OBJ_mdc2 OBJ_X500algorithms,3L,101L + +#define SN_id_ce "id-ce" +#define NID_id_ce 81 +#define OBJ_id_ce OBJ_X500,29L + +#define SN_subject_directory_attributes "subjectDirectoryAttributes" +#define LN_subject_directory_attributes "X509v3 Subject Directory Attributes" +#define NID_subject_directory_attributes 769 +#define OBJ_subject_directory_attributes OBJ_id_ce,9L + +#define SN_subject_key_identifier "subjectKeyIdentifier" +#define LN_subject_key_identifier "X509v3 Subject Key Identifier" +#define NID_subject_key_identifier 82 +#define OBJ_subject_key_identifier OBJ_id_ce,14L + +#define SN_key_usage "keyUsage" +#define LN_key_usage "X509v3 Key Usage" +#define NID_key_usage 83 +#define OBJ_key_usage OBJ_id_ce,15L + +#define SN_private_key_usage_period "privateKeyUsagePeriod" +#define LN_private_key_usage_period "X509v3 Private Key Usage Period" +#define NID_private_key_usage_period 84 +#define OBJ_private_key_usage_period OBJ_id_ce,16L + +#define SN_subject_alt_name "subjectAltName" +#define LN_subject_alt_name "X509v3 Subject Alternative Name" +#define NID_subject_alt_name 85 +#define OBJ_subject_alt_name OBJ_id_ce,17L + +#define SN_issuer_alt_name "issuerAltName" +#define LN_issuer_alt_name "X509v3 Issuer Alternative Name" +#define NID_issuer_alt_name 86 +#define OBJ_issuer_alt_name OBJ_id_ce,18L + +#define SN_basic_constraints "basicConstraints" +#define LN_basic_constraints "X509v3 Basic Constraints" +#define NID_basic_constraints 87 +#define OBJ_basic_constraints OBJ_id_ce,19L + +#define SN_crl_number "crlNumber" +#define LN_crl_number "X509v3 CRL Number" +#define NID_crl_number 88 +#define OBJ_crl_number OBJ_id_ce,20L + +#define SN_crl_reason "CRLReason" +#define LN_crl_reason "X509v3 CRL Reason Code" +#define NID_crl_reason 141 +#define OBJ_crl_reason OBJ_id_ce,21L + +#define SN_invalidity_date "invalidityDate" +#define LN_invalidity_date "Invalidity Date" +#define NID_invalidity_date 142 +#define OBJ_invalidity_date OBJ_id_ce,24L + +#define SN_delta_crl "deltaCRL" +#define LN_delta_crl "X509v3 Delta CRL Indicator" +#define NID_delta_crl 140 +#define OBJ_delta_crl OBJ_id_ce,27L + +#define SN_issuing_distribution_point "issuingDistributionPoint" +#define LN_issuing_distribution_point "X509v3 Issuing Distrubution Point" +#define NID_issuing_distribution_point 770 +#define OBJ_issuing_distribution_point OBJ_id_ce,28L + +#define SN_certificate_issuer "certificateIssuer" +#define LN_certificate_issuer "X509v3 Certificate Issuer" +#define NID_certificate_issuer 771 +#define OBJ_certificate_issuer OBJ_id_ce,29L + +#define SN_name_constraints "nameConstraints" +#define LN_name_constraints "X509v3 Name Constraints" +#define NID_name_constraints 666 +#define OBJ_name_constraints OBJ_id_ce,30L + +#define SN_crl_distribution_points "crlDistributionPoints" +#define LN_crl_distribution_points "X509v3 CRL Distribution Points" +#define NID_crl_distribution_points 103 +#define OBJ_crl_distribution_points OBJ_id_ce,31L + +#define SN_certificate_policies "certificatePolicies" +#define LN_certificate_policies "X509v3 Certificate Policies" +#define NID_certificate_policies 89 +#define OBJ_certificate_policies OBJ_id_ce,32L + +#define SN_any_policy "anyPolicy" +#define LN_any_policy "X509v3 Any Policy" +#define NID_any_policy 746 +#define OBJ_any_policy OBJ_certificate_policies,0L + +#define SN_policy_mappings "policyMappings" +#define LN_policy_mappings "X509v3 Policy Mappings" +#define NID_policy_mappings 747 +#define OBJ_policy_mappings OBJ_id_ce,33L + +#define SN_authority_key_identifier "authorityKeyIdentifier" +#define LN_authority_key_identifier "X509v3 Authority Key Identifier" +#define NID_authority_key_identifier 90 +#define OBJ_authority_key_identifier OBJ_id_ce,35L + +#define SN_policy_constraints "policyConstraints" +#define LN_policy_constraints "X509v3 Policy Constraints" +#define NID_policy_constraints 401 +#define OBJ_policy_constraints OBJ_id_ce,36L + +#define SN_ext_key_usage "extendedKeyUsage" +#define LN_ext_key_usage "X509v3 Extended Key Usage" +#define NID_ext_key_usage 126 +#define OBJ_ext_key_usage OBJ_id_ce,37L + +#define SN_freshest_crl "freshestCRL" +#define LN_freshest_crl "X509v3 Freshest CRL" +#define NID_freshest_crl 857 +#define OBJ_freshest_crl OBJ_id_ce,46L + +#define SN_inhibit_any_policy "inhibitAnyPolicy" +#define LN_inhibit_any_policy "X509v3 Inhibit Any Policy" +#define NID_inhibit_any_policy 748 +#define OBJ_inhibit_any_policy OBJ_id_ce,54L + +#define SN_target_information "targetInformation" +#define LN_target_information "X509v3 AC Targeting" +#define NID_target_information 402 +#define OBJ_target_information OBJ_id_ce,55L + +#define SN_no_rev_avail "noRevAvail" +#define LN_no_rev_avail "X509v3 No Revocation Available" +#define NID_no_rev_avail 403 +#define OBJ_no_rev_avail OBJ_id_ce,56L + +#define SN_anyExtendedKeyUsage "anyExtendedKeyUsage" +#define LN_anyExtendedKeyUsage "Any Extended Key Usage" +#define NID_anyExtendedKeyUsage 910 +#define OBJ_anyExtendedKeyUsage OBJ_ext_key_usage,0L + +#define SN_netscape "Netscape" +#define LN_netscape "Netscape Communications Corp." +#define NID_netscape 57 +#define OBJ_netscape 2L,16L,840L,1L,113730L + +#define SN_netscape_cert_extension "nsCertExt" +#define LN_netscape_cert_extension "Netscape Certificate Extension" +#define NID_netscape_cert_extension 58 +#define OBJ_netscape_cert_extension OBJ_netscape,1L + +#define SN_netscape_data_type "nsDataType" +#define LN_netscape_data_type "Netscape Data Type" +#define NID_netscape_data_type 59 +#define OBJ_netscape_data_type OBJ_netscape,2L + +#define SN_netscape_cert_type "nsCertType" +#define LN_netscape_cert_type "Netscape Cert Type" +#define NID_netscape_cert_type 71 +#define OBJ_netscape_cert_type OBJ_netscape_cert_extension,1L + +#define SN_netscape_base_url "nsBaseUrl" +#define LN_netscape_base_url "Netscape Base Url" +#define NID_netscape_base_url 72 +#define OBJ_netscape_base_url OBJ_netscape_cert_extension,2L + +#define SN_netscape_revocation_url "nsRevocationUrl" +#define LN_netscape_revocation_url "Netscape Revocation Url" +#define NID_netscape_revocation_url 73 +#define OBJ_netscape_revocation_url OBJ_netscape_cert_extension,3L + +#define SN_netscape_ca_revocation_url "nsCaRevocationUrl" +#define LN_netscape_ca_revocation_url "Netscape CA Revocation Url" +#define NID_netscape_ca_revocation_url 74 +#define OBJ_netscape_ca_revocation_url OBJ_netscape_cert_extension,4L + +#define SN_netscape_renewal_url "nsRenewalUrl" +#define LN_netscape_renewal_url "Netscape Renewal Url" +#define NID_netscape_renewal_url 75 +#define OBJ_netscape_renewal_url OBJ_netscape_cert_extension,7L + +#define SN_netscape_ca_policy_url "nsCaPolicyUrl" +#define LN_netscape_ca_policy_url "Netscape CA Policy Url" +#define NID_netscape_ca_policy_url 76 +#define OBJ_netscape_ca_policy_url OBJ_netscape_cert_extension,8L + +#define SN_netscape_ssl_server_name "nsSslServerName" +#define LN_netscape_ssl_server_name "Netscape SSL Server Name" +#define NID_netscape_ssl_server_name 77 +#define OBJ_netscape_ssl_server_name OBJ_netscape_cert_extension,12L + +#define SN_netscape_comment "nsComment" +#define LN_netscape_comment "Netscape Comment" +#define NID_netscape_comment 78 +#define OBJ_netscape_comment OBJ_netscape_cert_extension,13L + +#define SN_netscape_cert_sequence "nsCertSequence" +#define LN_netscape_cert_sequence "Netscape Certificate Sequence" +#define NID_netscape_cert_sequence 79 +#define OBJ_netscape_cert_sequence OBJ_netscape_data_type,5L + +#define SN_ns_sgc "nsSGC" +#define LN_ns_sgc "Netscape Server Gated Crypto" +#define NID_ns_sgc 139 +#define OBJ_ns_sgc OBJ_netscape,4L,1L + +#define SN_org "ORG" +#define LN_org "org" +#define NID_org 379 +#define OBJ_org OBJ_iso,3L + +#define SN_dod "DOD" +#define LN_dod "dod" +#define NID_dod 380 +#define OBJ_dod OBJ_org,6L + +#define SN_iana "IANA" +#define LN_iana "iana" +#define NID_iana 381 +#define OBJ_iana OBJ_dod,1L + +#define OBJ_internet OBJ_iana + +#define SN_Directory "directory" +#define LN_Directory "Directory" +#define NID_Directory 382 +#define OBJ_Directory OBJ_internet,1L + +#define SN_Management "mgmt" +#define LN_Management "Management" +#define NID_Management 383 +#define OBJ_Management OBJ_internet,2L + +#define SN_Experimental "experimental" +#define LN_Experimental "Experimental" +#define NID_Experimental 384 +#define OBJ_Experimental OBJ_internet,3L + +#define SN_Private "private" +#define LN_Private "Private" +#define NID_Private 385 +#define OBJ_Private OBJ_internet,4L + +#define SN_Security "security" +#define LN_Security "Security" +#define NID_Security 386 +#define OBJ_Security OBJ_internet,5L + +#define SN_SNMPv2 "snmpv2" +#define LN_SNMPv2 "SNMPv2" +#define NID_SNMPv2 387 +#define OBJ_SNMPv2 OBJ_internet,6L + +#define LN_Mail "Mail" +#define NID_Mail 388 +#define OBJ_Mail OBJ_internet,7L + +#define SN_Enterprises "enterprises" +#define LN_Enterprises "Enterprises" +#define NID_Enterprises 389 +#define OBJ_Enterprises OBJ_Private,1L + +#define SN_dcObject "dcobject" +#define LN_dcObject "dcObject" +#define NID_dcObject 390 +#define OBJ_dcObject OBJ_Enterprises,1466L,344L + +#define SN_mime_mhs "mime-mhs" +#define LN_mime_mhs "MIME MHS" +#define NID_mime_mhs 504 +#define OBJ_mime_mhs OBJ_Mail,1L + +#define SN_mime_mhs_headings "mime-mhs-headings" +#define LN_mime_mhs_headings "mime-mhs-headings" +#define NID_mime_mhs_headings 505 +#define OBJ_mime_mhs_headings OBJ_mime_mhs,1L + +#define SN_mime_mhs_bodies "mime-mhs-bodies" +#define LN_mime_mhs_bodies "mime-mhs-bodies" +#define NID_mime_mhs_bodies 506 +#define OBJ_mime_mhs_bodies OBJ_mime_mhs,2L + +#define SN_id_hex_partial_message "id-hex-partial-message" +#define LN_id_hex_partial_message "id-hex-partial-message" +#define NID_id_hex_partial_message 507 +#define OBJ_id_hex_partial_message OBJ_mime_mhs_headings,1L + +#define SN_id_hex_multipart_message "id-hex-multipart-message" +#define LN_id_hex_multipart_message "id-hex-multipart-message" +#define NID_id_hex_multipart_message 508 +#define OBJ_id_hex_multipart_message OBJ_mime_mhs_headings,2L + +#define SN_rle_compression "RLE" +#define LN_rle_compression "run length compression" +#define NID_rle_compression 124 +#define OBJ_rle_compression 1L,1L,1L,1L,666L,1L + +#define SN_zlib_compression "ZLIB" +#define LN_zlib_compression "zlib compression" +#define NID_zlib_compression 125 +#define OBJ_zlib_compression OBJ_id_smime_alg,8L + +#define OBJ_csor 2L,16L,840L,1L,101L,3L + +#define OBJ_nistAlgorithms OBJ_csor,4L + +#define OBJ_aes OBJ_nistAlgorithms,1L + +#define SN_aes_128_ecb "AES-128-ECB" +#define LN_aes_128_ecb "aes-128-ecb" +#define NID_aes_128_ecb 418 +#define OBJ_aes_128_ecb OBJ_aes,1L + +#define SN_aes_128_cbc "AES-128-CBC" +#define LN_aes_128_cbc "aes-128-cbc" +#define NID_aes_128_cbc 419 +#define OBJ_aes_128_cbc OBJ_aes,2L + +#define SN_aes_128_ofb128 "AES-128-OFB" +#define LN_aes_128_ofb128 "aes-128-ofb" +#define NID_aes_128_ofb128 420 +#define OBJ_aes_128_ofb128 OBJ_aes,3L + +#define SN_aes_128_cfb128 "AES-128-CFB" +#define LN_aes_128_cfb128 "aes-128-cfb" +#define NID_aes_128_cfb128 421 +#define OBJ_aes_128_cfb128 OBJ_aes,4L + +#define SN_id_aes128_wrap "id-aes128-wrap" +#define NID_id_aes128_wrap 788 +#define OBJ_id_aes128_wrap OBJ_aes,5L + +#define SN_aes_128_gcm "id-aes128-GCM" +#define LN_aes_128_gcm "aes-128-gcm" +#define NID_aes_128_gcm 895 +#define OBJ_aes_128_gcm OBJ_aes,6L + +#define SN_aes_128_ccm "id-aes128-CCM" +#define LN_aes_128_ccm "aes-128-ccm" +#define NID_aes_128_ccm 896 +#define OBJ_aes_128_ccm OBJ_aes,7L + +#define SN_id_aes128_wrap_pad "id-aes128-wrap-pad" +#define NID_id_aes128_wrap_pad 897 +#define OBJ_id_aes128_wrap_pad OBJ_aes,8L + +#define SN_aes_192_ecb "AES-192-ECB" +#define LN_aes_192_ecb "aes-192-ecb" +#define NID_aes_192_ecb 422 +#define OBJ_aes_192_ecb OBJ_aes,21L + +#define SN_aes_192_cbc "AES-192-CBC" +#define LN_aes_192_cbc "aes-192-cbc" +#define NID_aes_192_cbc 423 +#define OBJ_aes_192_cbc OBJ_aes,22L + +#define SN_aes_192_ofb128 "AES-192-OFB" +#define LN_aes_192_ofb128 "aes-192-ofb" +#define NID_aes_192_ofb128 424 +#define OBJ_aes_192_ofb128 OBJ_aes,23L + +#define SN_aes_192_cfb128 "AES-192-CFB" +#define LN_aes_192_cfb128 "aes-192-cfb" +#define NID_aes_192_cfb128 425 +#define OBJ_aes_192_cfb128 OBJ_aes,24L + +#define SN_id_aes192_wrap "id-aes192-wrap" +#define NID_id_aes192_wrap 789 +#define OBJ_id_aes192_wrap OBJ_aes,25L + +#define SN_aes_192_gcm "id-aes192-GCM" +#define LN_aes_192_gcm "aes-192-gcm" +#define NID_aes_192_gcm 898 +#define OBJ_aes_192_gcm OBJ_aes,26L + +#define SN_aes_192_ccm "id-aes192-CCM" +#define LN_aes_192_ccm "aes-192-ccm" +#define NID_aes_192_ccm 899 +#define OBJ_aes_192_ccm OBJ_aes,27L + +#define SN_id_aes192_wrap_pad "id-aes192-wrap-pad" +#define NID_id_aes192_wrap_pad 900 +#define OBJ_id_aes192_wrap_pad OBJ_aes,28L + +#define SN_aes_256_ecb "AES-256-ECB" +#define LN_aes_256_ecb "aes-256-ecb" +#define NID_aes_256_ecb 426 +#define OBJ_aes_256_ecb OBJ_aes,41L + +#define SN_aes_256_cbc "AES-256-CBC" +#define LN_aes_256_cbc "aes-256-cbc" +#define NID_aes_256_cbc 427 +#define OBJ_aes_256_cbc OBJ_aes,42L + +#define SN_aes_256_ofb128 "AES-256-OFB" +#define LN_aes_256_ofb128 "aes-256-ofb" +#define NID_aes_256_ofb128 428 +#define OBJ_aes_256_ofb128 OBJ_aes,43L + +#define SN_aes_256_cfb128 "AES-256-CFB" +#define LN_aes_256_cfb128 "aes-256-cfb" +#define NID_aes_256_cfb128 429 +#define OBJ_aes_256_cfb128 OBJ_aes,44L + +#define SN_id_aes256_wrap "id-aes256-wrap" +#define NID_id_aes256_wrap 790 +#define OBJ_id_aes256_wrap OBJ_aes,45L + +#define SN_aes_256_gcm "id-aes256-GCM" +#define LN_aes_256_gcm "aes-256-gcm" +#define NID_aes_256_gcm 901 +#define OBJ_aes_256_gcm OBJ_aes,46L + +#define SN_aes_256_ccm "id-aes256-CCM" +#define LN_aes_256_ccm "aes-256-ccm" +#define NID_aes_256_ccm 902 +#define OBJ_aes_256_ccm OBJ_aes,47L + +#define SN_id_aes256_wrap_pad "id-aes256-wrap-pad" +#define NID_id_aes256_wrap_pad 903 +#define OBJ_id_aes256_wrap_pad OBJ_aes,48L + +#define SN_aes_128_cfb1 "AES-128-CFB1" +#define LN_aes_128_cfb1 "aes-128-cfb1" +#define NID_aes_128_cfb1 650 + +#define SN_aes_192_cfb1 "AES-192-CFB1" +#define LN_aes_192_cfb1 "aes-192-cfb1" +#define NID_aes_192_cfb1 651 + +#define SN_aes_256_cfb1 "AES-256-CFB1" +#define LN_aes_256_cfb1 "aes-256-cfb1" +#define NID_aes_256_cfb1 652 + +#define SN_aes_128_cfb8 "AES-128-CFB8" +#define LN_aes_128_cfb8 "aes-128-cfb8" +#define NID_aes_128_cfb8 653 + +#define SN_aes_192_cfb8 "AES-192-CFB8" +#define LN_aes_192_cfb8 "aes-192-cfb8" +#define NID_aes_192_cfb8 654 + +#define SN_aes_256_cfb8 "AES-256-CFB8" +#define LN_aes_256_cfb8 "aes-256-cfb8" +#define NID_aes_256_cfb8 655 + +#define SN_aes_128_ctr "AES-128-CTR" +#define LN_aes_128_ctr "aes-128-ctr" +#define NID_aes_128_ctr 904 + +#define SN_aes_192_ctr "AES-192-CTR" +#define LN_aes_192_ctr "aes-192-ctr" +#define NID_aes_192_ctr 905 + +#define SN_aes_256_ctr "AES-256-CTR" +#define LN_aes_256_ctr "aes-256-ctr" +#define NID_aes_256_ctr 906 + +#define SN_aes_128_xts "AES-128-XTS" +#define LN_aes_128_xts "aes-128-xts" +#define NID_aes_128_xts 913 + +#define SN_aes_256_xts "AES-256-XTS" +#define LN_aes_256_xts "aes-256-xts" +#define NID_aes_256_xts 914 + +#define SN_des_cfb1 "DES-CFB1" +#define LN_des_cfb1 "des-cfb1" +#define NID_des_cfb1 656 + +#define SN_des_cfb8 "DES-CFB8" +#define LN_des_cfb8 "des-cfb8" +#define NID_des_cfb8 657 + +#define SN_des_ede3_cfb1 "DES-EDE3-CFB1" +#define LN_des_ede3_cfb1 "des-ede3-cfb1" +#define NID_des_ede3_cfb1 658 + +#define SN_des_ede3_cfb8 "DES-EDE3-CFB8" +#define LN_des_ede3_cfb8 "des-ede3-cfb8" +#define NID_des_ede3_cfb8 659 + +#define OBJ_nist_hashalgs OBJ_nistAlgorithms,2L + +#define SN_sha256 "SHA256" +#define LN_sha256 "sha256" +#define NID_sha256 672 +#define OBJ_sha256 OBJ_nist_hashalgs,1L + +#define SN_sha384 "SHA384" +#define LN_sha384 "sha384" +#define NID_sha384 673 +#define OBJ_sha384 OBJ_nist_hashalgs,2L + +#define SN_sha512 "SHA512" +#define LN_sha512 "sha512" +#define NID_sha512 674 +#define OBJ_sha512 OBJ_nist_hashalgs,3L + +#define SN_sha224 "SHA224" +#define LN_sha224 "sha224" +#define NID_sha224 675 +#define OBJ_sha224 OBJ_nist_hashalgs,4L + +#define OBJ_dsa_with_sha2 OBJ_nistAlgorithms,3L + +#define SN_dsa_with_SHA224 "dsa_with_SHA224" +#define NID_dsa_with_SHA224 802 +#define OBJ_dsa_with_SHA224 OBJ_dsa_with_sha2,1L + +#define SN_dsa_with_SHA256 "dsa_with_SHA256" +#define NID_dsa_with_SHA256 803 +#define OBJ_dsa_with_SHA256 OBJ_dsa_with_sha2,2L + +#define SN_hold_instruction_code "holdInstructionCode" +#define LN_hold_instruction_code "Hold Instruction Code" +#define NID_hold_instruction_code 430 +#define OBJ_hold_instruction_code OBJ_id_ce,23L + +#define OBJ_holdInstruction OBJ_X9_57,2L + +#define SN_hold_instruction_none "holdInstructionNone" +#define LN_hold_instruction_none "Hold Instruction None" +#define NID_hold_instruction_none 431 +#define OBJ_hold_instruction_none OBJ_holdInstruction,1L + +#define SN_hold_instruction_call_issuer "holdInstructionCallIssuer" +#define LN_hold_instruction_call_issuer "Hold Instruction Call Issuer" +#define NID_hold_instruction_call_issuer 432 +#define OBJ_hold_instruction_call_issuer OBJ_holdInstruction,2L + +#define SN_hold_instruction_reject "holdInstructionReject" +#define LN_hold_instruction_reject "Hold Instruction Reject" +#define NID_hold_instruction_reject 433 +#define OBJ_hold_instruction_reject OBJ_holdInstruction,3L + +#define SN_data "data" +#define NID_data 434 +#define OBJ_data OBJ_itu_t,9L + +#define SN_pss "pss" +#define NID_pss 435 +#define OBJ_pss OBJ_data,2342L + +#define SN_ucl "ucl" +#define NID_ucl 436 +#define OBJ_ucl OBJ_pss,19200300L + +#define SN_pilot "pilot" +#define NID_pilot 437 +#define OBJ_pilot OBJ_ucl,100L + +#define LN_pilotAttributeType "pilotAttributeType" +#define NID_pilotAttributeType 438 +#define OBJ_pilotAttributeType OBJ_pilot,1L + +#define LN_pilotAttributeSyntax "pilotAttributeSyntax" +#define NID_pilotAttributeSyntax 439 +#define OBJ_pilotAttributeSyntax OBJ_pilot,3L + +#define LN_pilotObjectClass "pilotObjectClass" +#define NID_pilotObjectClass 440 +#define OBJ_pilotObjectClass OBJ_pilot,4L + +#define LN_pilotGroups "pilotGroups" +#define NID_pilotGroups 441 +#define OBJ_pilotGroups OBJ_pilot,10L + +#define LN_iA5StringSyntax "iA5StringSyntax" +#define NID_iA5StringSyntax 442 +#define OBJ_iA5StringSyntax OBJ_pilotAttributeSyntax,4L + +#define LN_caseIgnoreIA5StringSyntax "caseIgnoreIA5StringSyntax" +#define NID_caseIgnoreIA5StringSyntax 443 +#define OBJ_caseIgnoreIA5StringSyntax OBJ_pilotAttributeSyntax,5L + +#define LN_pilotObject "pilotObject" +#define NID_pilotObject 444 +#define OBJ_pilotObject OBJ_pilotObjectClass,3L + +#define LN_pilotPerson "pilotPerson" +#define NID_pilotPerson 445 +#define OBJ_pilotPerson OBJ_pilotObjectClass,4L + +#define SN_account "account" +#define NID_account 446 +#define OBJ_account OBJ_pilotObjectClass,5L + +#define SN_document "document" +#define NID_document 447 +#define OBJ_document OBJ_pilotObjectClass,6L + +#define SN_room "room" +#define NID_room 448 +#define OBJ_room OBJ_pilotObjectClass,7L + +#define LN_documentSeries "documentSeries" +#define NID_documentSeries 449 +#define OBJ_documentSeries OBJ_pilotObjectClass,9L + +#define SN_Domain "domain" +#define LN_Domain "Domain" +#define NID_Domain 392 +#define OBJ_Domain OBJ_pilotObjectClass,13L + +#define LN_rFC822localPart "rFC822localPart" +#define NID_rFC822localPart 450 +#define OBJ_rFC822localPart OBJ_pilotObjectClass,14L + +#define LN_dNSDomain "dNSDomain" +#define NID_dNSDomain 451 +#define OBJ_dNSDomain OBJ_pilotObjectClass,15L + +#define LN_domainRelatedObject "domainRelatedObject" +#define NID_domainRelatedObject 452 +#define OBJ_domainRelatedObject OBJ_pilotObjectClass,17L + +#define LN_friendlyCountry "friendlyCountry" +#define NID_friendlyCountry 453 +#define OBJ_friendlyCountry OBJ_pilotObjectClass,18L + +#define LN_simpleSecurityObject "simpleSecurityObject" +#define NID_simpleSecurityObject 454 +#define OBJ_simpleSecurityObject OBJ_pilotObjectClass,19L + +#define LN_pilotOrganization "pilotOrganization" +#define NID_pilotOrganization 455 +#define OBJ_pilotOrganization OBJ_pilotObjectClass,20L + +#define LN_pilotDSA "pilotDSA" +#define NID_pilotDSA 456 +#define OBJ_pilotDSA OBJ_pilotObjectClass,21L + +#define LN_qualityLabelledData "qualityLabelledData" +#define NID_qualityLabelledData 457 +#define OBJ_qualityLabelledData OBJ_pilotObjectClass,22L + +#define SN_userId "UID" +#define LN_userId "userId" +#define NID_userId 458 +#define OBJ_userId OBJ_pilotAttributeType,1L + +#define LN_textEncodedORAddress "textEncodedORAddress" +#define NID_textEncodedORAddress 459 +#define OBJ_textEncodedORAddress OBJ_pilotAttributeType,2L + +#define SN_rfc822Mailbox "mail" +#define LN_rfc822Mailbox "rfc822Mailbox" +#define NID_rfc822Mailbox 460 +#define OBJ_rfc822Mailbox OBJ_pilotAttributeType,3L + +#define SN_info "info" +#define NID_info 461 +#define OBJ_info OBJ_pilotAttributeType,4L + +#define LN_favouriteDrink "favouriteDrink" +#define NID_favouriteDrink 462 +#define OBJ_favouriteDrink OBJ_pilotAttributeType,5L + +#define LN_roomNumber "roomNumber" +#define NID_roomNumber 463 +#define OBJ_roomNumber OBJ_pilotAttributeType,6L + +#define SN_photo "photo" +#define NID_photo 464 +#define OBJ_photo OBJ_pilotAttributeType,7L + +#define LN_userClass "userClass" +#define NID_userClass 465 +#define OBJ_userClass OBJ_pilotAttributeType,8L + +#define SN_host "host" +#define NID_host 466 +#define OBJ_host OBJ_pilotAttributeType,9L + +#define SN_manager "manager" +#define NID_manager 467 +#define OBJ_manager OBJ_pilotAttributeType,10L + +#define LN_documentIdentifier "documentIdentifier" +#define NID_documentIdentifier 468 +#define OBJ_documentIdentifier OBJ_pilotAttributeType,11L + +#define LN_documentTitle "documentTitle" +#define NID_documentTitle 469 +#define OBJ_documentTitle OBJ_pilotAttributeType,12L + +#define LN_documentVersion "documentVersion" +#define NID_documentVersion 470 +#define OBJ_documentVersion OBJ_pilotAttributeType,13L + +#define LN_documentAuthor "documentAuthor" +#define NID_documentAuthor 471 +#define OBJ_documentAuthor OBJ_pilotAttributeType,14L + +#define LN_documentLocation "documentLocation" +#define NID_documentLocation 472 +#define OBJ_documentLocation OBJ_pilotAttributeType,15L + +#define LN_homeTelephoneNumber "homeTelephoneNumber" +#define NID_homeTelephoneNumber 473 +#define OBJ_homeTelephoneNumber OBJ_pilotAttributeType,20L + +#define SN_secretary "secretary" +#define NID_secretary 474 +#define OBJ_secretary OBJ_pilotAttributeType,21L + +#define LN_otherMailbox "otherMailbox" +#define NID_otherMailbox 475 +#define OBJ_otherMailbox OBJ_pilotAttributeType,22L + +#define LN_lastModifiedTime "lastModifiedTime" +#define NID_lastModifiedTime 476 +#define OBJ_lastModifiedTime OBJ_pilotAttributeType,23L + +#define LN_lastModifiedBy "lastModifiedBy" +#define NID_lastModifiedBy 477 +#define OBJ_lastModifiedBy OBJ_pilotAttributeType,24L + +#define SN_domainComponent "DC" +#define LN_domainComponent "domainComponent" +#define NID_domainComponent 391 +#define OBJ_domainComponent OBJ_pilotAttributeType,25L + +#define LN_aRecord "aRecord" +#define NID_aRecord 478 +#define OBJ_aRecord OBJ_pilotAttributeType,26L + +#define LN_pilotAttributeType27 "pilotAttributeType27" +#define NID_pilotAttributeType27 479 +#define OBJ_pilotAttributeType27 OBJ_pilotAttributeType,27L + +#define LN_mXRecord "mXRecord" +#define NID_mXRecord 480 +#define OBJ_mXRecord OBJ_pilotAttributeType,28L + +#define LN_nSRecord "nSRecord" +#define NID_nSRecord 481 +#define OBJ_nSRecord OBJ_pilotAttributeType,29L + +#define LN_sOARecord "sOARecord" +#define NID_sOARecord 482 +#define OBJ_sOARecord OBJ_pilotAttributeType,30L + +#define LN_cNAMERecord "cNAMERecord" +#define NID_cNAMERecord 483 +#define OBJ_cNAMERecord OBJ_pilotAttributeType,31L + +#define LN_associatedDomain "associatedDomain" +#define NID_associatedDomain 484 +#define OBJ_associatedDomain OBJ_pilotAttributeType,37L + +#define LN_associatedName "associatedName" +#define NID_associatedName 485 +#define OBJ_associatedName OBJ_pilotAttributeType,38L + +#define LN_homePostalAddress "homePostalAddress" +#define NID_homePostalAddress 486 +#define OBJ_homePostalAddress OBJ_pilotAttributeType,39L + +#define LN_personalTitle "personalTitle" +#define NID_personalTitle 487 +#define OBJ_personalTitle OBJ_pilotAttributeType,40L + +#define LN_mobileTelephoneNumber "mobileTelephoneNumber" +#define NID_mobileTelephoneNumber 488 +#define OBJ_mobileTelephoneNumber OBJ_pilotAttributeType,41L + +#define LN_pagerTelephoneNumber "pagerTelephoneNumber" +#define NID_pagerTelephoneNumber 489 +#define OBJ_pagerTelephoneNumber OBJ_pilotAttributeType,42L + +#define LN_friendlyCountryName "friendlyCountryName" +#define NID_friendlyCountryName 490 +#define OBJ_friendlyCountryName OBJ_pilotAttributeType,43L + +#define LN_organizationalStatus "organizationalStatus" +#define NID_organizationalStatus 491 +#define OBJ_organizationalStatus OBJ_pilotAttributeType,45L + +#define LN_janetMailbox "janetMailbox" +#define NID_janetMailbox 492 +#define OBJ_janetMailbox OBJ_pilotAttributeType,46L + +#define LN_mailPreferenceOption "mailPreferenceOption" +#define NID_mailPreferenceOption 493 +#define OBJ_mailPreferenceOption OBJ_pilotAttributeType,47L + +#define LN_buildingName "buildingName" +#define NID_buildingName 494 +#define OBJ_buildingName OBJ_pilotAttributeType,48L + +#define LN_dSAQuality "dSAQuality" +#define NID_dSAQuality 495 +#define OBJ_dSAQuality OBJ_pilotAttributeType,49L + +#define LN_singleLevelQuality "singleLevelQuality" +#define NID_singleLevelQuality 496 +#define OBJ_singleLevelQuality OBJ_pilotAttributeType,50L + +#define LN_subtreeMinimumQuality "subtreeMinimumQuality" +#define NID_subtreeMinimumQuality 497 +#define OBJ_subtreeMinimumQuality OBJ_pilotAttributeType,51L + +#define LN_subtreeMaximumQuality "subtreeMaximumQuality" +#define NID_subtreeMaximumQuality 498 +#define OBJ_subtreeMaximumQuality OBJ_pilotAttributeType,52L + +#define LN_personalSignature "personalSignature" +#define NID_personalSignature 499 +#define OBJ_personalSignature OBJ_pilotAttributeType,53L + +#define LN_dITRedirect "dITRedirect" +#define NID_dITRedirect 500 +#define OBJ_dITRedirect OBJ_pilotAttributeType,54L + +#define SN_audio "audio" +#define NID_audio 501 +#define OBJ_audio OBJ_pilotAttributeType,55L + +#define LN_documentPublisher "documentPublisher" +#define NID_documentPublisher 502 +#define OBJ_documentPublisher OBJ_pilotAttributeType,56L + +#define SN_id_set "id-set" +#define LN_id_set "Secure Electronic Transactions" +#define NID_id_set 512 +#define OBJ_id_set OBJ_international_organizations,42L + +#define SN_set_ctype "set-ctype" +#define LN_set_ctype "content types" +#define NID_set_ctype 513 +#define OBJ_set_ctype OBJ_id_set,0L + +#define SN_set_msgExt "set-msgExt" +#define LN_set_msgExt "message extensions" +#define NID_set_msgExt 514 +#define OBJ_set_msgExt OBJ_id_set,1L + +#define SN_set_attr "set-attr" +#define NID_set_attr 515 +#define OBJ_set_attr OBJ_id_set,3L + +#define SN_set_policy "set-policy" +#define NID_set_policy 516 +#define OBJ_set_policy OBJ_id_set,5L + +#define SN_set_certExt "set-certExt" +#define LN_set_certExt "certificate extensions" +#define NID_set_certExt 517 +#define OBJ_set_certExt OBJ_id_set,7L + +#define SN_set_brand "set-brand" +#define NID_set_brand 518 +#define OBJ_set_brand OBJ_id_set,8L + +#define SN_setct_PANData "setct-PANData" +#define NID_setct_PANData 519 +#define OBJ_setct_PANData OBJ_set_ctype,0L + +#define SN_setct_PANToken "setct-PANToken" +#define NID_setct_PANToken 520 +#define OBJ_setct_PANToken OBJ_set_ctype,1L + +#define SN_setct_PANOnly "setct-PANOnly" +#define NID_setct_PANOnly 521 +#define OBJ_setct_PANOnly OBJ_set_ctype,2L + +#define SN_setct_OIData "setct-OIData" +#define NID_setct_OIData 522 +#define OBJ_setct_OIData OBJ_set_ctype,3L + +#define SN_setct_PI "setct-PI" +#define NID_setct_PI 523 +#define OBJ_setct_PI OBJ_set_ctype,4L + +#define SN_setct_PIData "setct-PIData" +#define NID_setct_PIData 524 +#define OBJ_setct_PIData OBJ_set_ctype,5L + +#define SN_setct_PIDataUnsigned "setct-PIDataUnsigned" +#define NID_setct_PIDataUnsigned 525 +#define OBJ_setct_PIDataUnsigned OBJ_set_ctype,6L + +#define SN_setct_HODInput "setct-HODInput" +#define NID_setct_HODInput 526 +#define OBJ_setct_HODInput OBJ_set_ctype,7L + +#define SN_setct_AuthResBaggage "setct-AuthResBaggage" +#define NID_setct_AuthResBaggage 527 +#define OBJ_setct_AuthResBaggage OBJ_set_ctype,8L + +#define SN_setct_AuthRevReqBaggage "setct-AuthRevReqBaggage" +#define NID_setct_AuthRevReqBaggage 528 +#define OBJ_setct_AuthRevReqBaggage OBJ_set_ctype,9L + +#define SN_setct_AuthRevResBaggage "setct-AuthRevResBaggage" +#define NID_setct_AuthRevResBaggage 529 +#define OBJ_setct_AuthRevResBaggage OBJ_set_ctype,10L + +#define SN_setct_CapTokenSeq "setct-CapTokenSeq" +#define NID_setct_CapTokenSeq 530 +#define OBJ_setct_CapTokenSeq OBJ_set_ctype,11L + +#define SN_setct_PInitResData "setct-PInitResData" +#define NID_setct_PInitResData 531 +#define OBJ_setct_PInitResData OBJ_set_ctype,12L + +#define SN_setct_PI_TBS "setct-PI-TBS" +#define NID_setct_PI_TBS 532 +#define OBJ_setct_PI_TBS OBJ_set_ctype,13L + +#define SN_setct_PResData "setct-PResData" +#define NID_setct_PResData 533 +#define OBJ_setct_PResData OBJ_set_ctype,14L + +#define SN_setct_AuthReqTBS "setct-AuthReqTBS" +#define NID_setct_AuthReqTBS 534 +#define OBJ_setct_AuthReqTBS OBJ_set_ctype,16L + +#define SN_setct_AuthResTBS "setct-AuthResTBS" +#define NID_setct_AuthResTBS 535 +#define OBJ_setct_AuthResTBS OBJ_set_ctype,17L + +#define SN_setct_AuthResTBSX "setct-AuthResTBSX" +#define NID_setct_AuthResTBSX 536 +#define OBJ_setct_AuthResTBSX OBJ_set_ctype,18L + +#define SN_setct_AuthTokenTBS "setct-AuthTokenTBS" +#define NID_setct_AuthTokenTBS 537 +#define OBJ_setct_AuthTokenTBS OBJ_set_ctype,19L + +#define SN_setct_CapTokenData "setct-CapTokenData" +#define NID_setct_CapTokenData 538 +#define OBJ_setct_CapTokenData OBJ_set_ctype,20L + +#define SN_setct_CapTokenTBS "setct-CapTokenTBS" +#define NID_setct_CapTokenTBS 539 +#define OBJ_setct_CapTokenTBS OBJ_set_ctype,21L + +#define SN_setct_AcqCardCodeMsg "setct-AcqCardCodeMsg" +#define NID_setct_AcqCardCodeMsg 540 +#define OBJ_setct_AcqCardCodeMsg OBJ_set_ctype,22L + +#define SN_setct_AuthRevReqTBS "setct-AuthRevReqTBS" +#define NID_setct_AuthRevReqTBS 541 +#define OBJ_setct_AuthRevReqTBS OBJ_set_ctype,23L + +#define SN_setct_AuthRevResData "setct-AuthRevResData" +#define NID_setct_AuthRevResData 542 +#define OBJ_setct_AuthRevResData OBJ_set_ctype,24L + +#define SN_setct_AuthRevResTBS "setct-AuthRevResTBS" +#define NID_setct_AuthRevResTBS 543 +#define OBJ_setct_AuthRevResTBS OBJ_set_ctype,25L + +#define SN_setct_CapReqTBS "setct-CapReqTBS" +#define NID_setct_CapReqTBS 544 +#define OBJ_setct_CapReqTBS OBJ_set_ctype,26L + +#define SN_setct_CapReqTBSX "setct-CapReqTBSX" +#define NID_setct_CapReqTBSX 545 +#define OBJ_setct_CapReqTBSX OBJ_set_ctype,27L + +#define SN_setct_CapResData "setct-CapResData" +#define NID_setct_CapResData 546 +#define OBJ_setct_CapResData OBJ_set_ctype,28L + +#define SN_setct_CapRevReqTBS "setct-CapRevReqTBS" +#define NID_setct_CapRevReqTBS 547 +#define OBJ_setct_CapRevReqTBS OBJ_set_ctype,29L + +#define SN_setct_CapRevReqTBSX "setct-CapRevReqTBSX" +#define NID_setct_CapRevReqTBSX 548 +#define OBJ_setct_CapRevReqTBSX OBJ_set_ctype,30L + +#define SN_setct_CapRevResData "setct-CapRevResData" +#define NID_setct_CapRevResData 549 +#define OBJ_setct_CapRevResData OBJ_set_ctype,31L + +#define SN_setct_CredReqTBS "setct-CredReqTBS" +#define NID_setct_CredReqTBS 550 +#define OBJ_setct_CredReqTBS OBJ_set_ctype,32L + +#define SN_setct_CredReqTBSX "setct-CredReqTBSX" +#define NID_setct_CredReqTBSX 551 +#define OBJ_setct_CredReqTBSX OBJ_set_ctype,33L + +#define SN_setct_CredResData "setct-CredResData" +#define NID_setct_CredResData 552 +#define OBJ_setct_CredResData OBJ_set_ctype,34L + +#define SN_setct_CredRevReqTBS "setct-CredRevReqTBS" +#define NID_setct_CredRevReqTBS 553 +#define OBJ_setct_CredRevReqTBS OBJ_set_ctype,35L + +#define SN_setct_CredRevReqTBSX "setct-CredRevReqTBSX" +#define NID_setct_CredRevReqTBSX 554 +#define OBJ_setct_CredRevReqTBSX OBJ_set_ctype,36L + +#define SN_setct_CredRevResData "setct-CredRevResData" +#define NID_setct_CredRevResData 555 +#define OBJ_setct_CredRevResData OBJ_set_ctype,37L + +#define SN_setct_PCertReqData "setct-PCertReqData" +#define NID_setct_PCertReqData 556 +#define OBJ_setct_PCertReqData OBJ_set_ctype,38L + +#define SN_setct_PCertResTBS "setct-PCertResTBS" +#define NID_setct_PCertResTBS 557 +#define OBJ_setct_PCertResTBS OBJ_set_ctype,39L + +#define SN_setct_BatchAdminReqData "setct-BatchAdminReqData" +#define NID_setct_BatchAdminReqData 558 +#define OBJ_setct_BatchAdminReqData OBJ_set_ctype,40L + +#define SN_setct_BatchAdminResData "setct-BatchAdminResData" +#define NID_setct_BatchAdminResData 559 +#define OBJ_setct_BatchAdminResData OBJ_set_ctype,41L + +#define SN_setct_CardCInitResTBS "setct-CardCInitResTBS" +#define NID_setct_CardCInitResTBS 560 +#define OBJ_setct_CardCInitResTBS OBJ_set_ctype,42L + +#define SN_setct_MeAqCInitResTBS "setct-MeAqCInitResTBS" +#define NID_setct_MeAqCInitResTBS 561 +#define OBJ_setct_MeAqCInitResTBS OBJ_set_ctype,43L + +#define SN_setct_RegFormResTBS "setct-RegFormResTBS" +#define NID_setct_RegFormResTBS 562 +#define OBJ_setct_RegFormResTBS OBJ_set_ctype,44L + +#define SN_setct_CertReqData "setct-CertReqData" +#define NID_setct_CertReqData 563 +#define OBJ_setct_CertReqData OBJ_set_ctype,45L + +#define SN_setct_CertReqTBS "setct-CertReqTBS" +#define NID_setct_CertReqTBS 564 +#define OBJ_setct_CertReqTBS OBJ_set_ctype,46L + +#define SN_setct_CertResData "setct-CertResData" +#define NID_setct_CertResData 565 +#define OBJ_setct_CertResData OBJ_set_ctype,47L + +#define SN_setct_CertInqReqTBS "setct-CertInqReqTBS" +#define NID_setct_CertInqReqTBS 566 +#define OBJ_setct_CertInqReqTBS OBJ_set_ctype,48L + +#define SN_setct_ErrorTBS "setct-ErrorTBS" +#define NID_setct_ErrorTBS 567 +#define OBJ_setct_ErrorTBS OBJ_set_ctype,49L + +#define SN_setct_PIDualSignedTBE "setct-PIDualSignedTBE" +#define NID_setct_PIDualSignedTBE 568 +#define OBJ_setct_PIDualSignedTBE OBJ_set_ctype,50L + +#define SN_setct_PIUnsignedTBE "setct-PIUnsignedTBE" +#define NID_setct_PIUnsignedTBE 569 +#define OBJ_setct_PIUnsignedTBE OBJ_set_ctype,51L + +#define SN_setct_AuthReqTBE "setct-AuthReqTBE" +#define NID_setct_AuthReqTBE 570 +#define OBJ_setct_AuthReqTBE OBJ_set_ctype,52L + +#define SN_setct_AuthResTBE "setct-AuthResTBE" +#define NID_setct_AuthResTBE 571 +#define OBJ_setct_AuthResTBE OBJ_set_ctype,53L + +#define SN_setct_AuthResTBEX "setct-AuthResTBEX" +#define NID_setct_AuthResTBEX 572 +#define OBJ_setct_AuthResTBEX OBJ_set_ctype,54L + +#define SN_setct_AuthTokenTBE "setct-AuthTokenTBE" +#define NID_setct_AuthTokenTBE 573 +#define OBJ_setct_AuthTokenTBE OBJ_set_ctype,55L + +#define SN_setct_CapTokenTBE "setct-CapTokenTBE" +#define NID_setct_CapTokenTBE 574 +#define OBJ_setct_CapTokenTBE OBJ_set_ctype,56L + +#define SN_setct_CapTokenTBEX "setct-CapTokenTBEX" +#define NID_setct_CapTokenTBEX 575 +#define OBJ_setct_CapTokenTBEX OBJ_set_ctype,57L + +#define SN_setct_AcqCardCodeMsgTBE "setct-AcqCardCodeMsgTBE" +#define NID_setct_AcqCardCodeMsgTBE 576 +#define OBJ_setct_AcqCardCodeMsgTBE OBJ_set_ctype,58L + +#define SN_setct_AuthRevReqTBE "setct-AuthRevReqTBE" +#define NID_setct_AuthRevReqTBE 577 +#define OBJ_setct_AuthRevReqTBE OBJ_set_ctype,59L + +#define SN_setct_AuthRevResTBE "setct-AuthRevResTBE" +#define NID_setct_AuthRevResTBE 578 +#define OBJ_setct_AuthRevResTBE OBJ_set_ctype,60L + +#define SN_setct_AuthRevResTBEB "setct-AuthRevResTBEB" +#define NID_setct_AuthRevResTBEB 579 +#define OBJ_setct_AuthRevResTBEB OBJ_set_ctype,61L + +#define SN_setct_CapReqTBE "setct-CapReqTBE" +#define NID_setct_CapReqTBE 580 +#define OBJ_setct_CapReqTBE OBJ_set_ctype,62L + +#define SN_setct_CapReqTBEX "setct-CapReqTBEX" +#define NID_setct_CapReqTBEX 581 +#define OBJ_setct_CapReqTBEX OBJ_set_ctype,63L + +#define SN_setct_CapResTBE "setct-CapResTBE" +#define NID_setct_CapResTBE 582 +#define OBJ_setct_CapResTBE OBJ_set_ctype,64L + +#define SN_setct_CapRevReqTBE "setct-CapRevReqTBE" +#define NID_setct_CapRevReqTBE 583 +#define OBJ_setct_CapRevReqTBE OBJ_set_ctype,65L + +#define SN_setct_CapRevReqTBEX "setct-CapRevReqTBEX" +#define NID_setct_CapRevReqTBEX 584 +#define OBJ_setct_CapRevReqTBEX OBJ_set_ctype,66L + +#define SN_setct_CapRevResTBE "setct-CapRevResTBE" +#define NID_setct_CapRevResTBE 585 +#define OBJ_setct_CapRevResTBE OBJ_set_ctype,67L + +#define SN_setct_CredReqTBE "setct-CredReqTBE" +#define NID_setct_CredReqTBE 586 +#define OBJ_setct_CredReqTBE OBJ_set_ctype,68L + +#define SN_setct_CredReqTBEX "setct-CredReqTBEX" +#define NID_setct_CredReqTBEX 587 +#define OBJ_setct_CredReqTBEX OBJ_set_ctype,69L + +#define SN_setct_CredResTBE "setct-CredResTBE" +#define NID_setct_CredResTBE 588 +#define OBJ_setct_CredResTBE OBJ_set_ctype,70L + +#define SN_setct_CredRevReqTBE "setct-CredRevReqTBE" +#define NID_setct_CredRevReqTBE 589 +#define OBJ_setct_CredRevReqTBE OBJ_set_ctype,71L + +#define SN_setct_CredRevReqTBEX "setct-CredRevReqTBEX" +#define NID_setct_CredRevReqTBEX 590 +#define OBJ_setct_CredRevReqTBEX OBJ_set_ctype,72L + +#define SN_setct_CredRevResTBE "setct-CredRevResTBE" +#define NID_setct_CredRevResTBE 591 +#define OBJ_setct_CredRevResTBE OBJ_set_ctype,73L + +#define SN_setct_BatchAdminReqTBE "setct-BatchAdminReqTBE" +#define NID_setct_BatchAdminReqTBE 592 +#define OBJ_setct_BatchAdminReqTBE OBJ_set_ctype,74L + +#define SN_setct_BatchAdminResTBE "setct-BatchAdminResTBE" +#define NID_setct_BatchAdminResTBE 593 +#define OBJ_setct_BatchAdminResTBE OBJ_set_ctype,75L + +#define SN_setct_RegFormReqTBE "setct-RegFormReqTBE" +#define NID_setct_RegFormReqTBE 594 +#define OBJ_setct_RegFormReqTBE OBJ_set_ctype,76L + +#define SN_setct_CertReqTBE "setct-CertReqTBE" +#define NID_setct_CertReqTBE 595 +#define OBJ_setct_CertReqTBE OBJ_set_ctype,77L + +#define SN_setct_CertReqTBEX "setct-CertReqTBEX" +#define NID_setct_CertReqTBEX 596 +#define OBJ_setct_CertReqTBEX OBJ_set_ctype,78L + +#define SN_setct_CertResTBE "setct-CertResTBE" +#define NID_setct_CertResTBE 597 +#define OBJ_setct_CertResTBE OBJ_set_ctype,79L + +#define SN_setct_CRLNotificationTBS "setct-CRLNotificationTBS" +#define NID_setct_CRLNotificationTBS 598 +#define OBJ_setct_CRLNotificationTBS OBJ_set_ctype,80L + +#define SN_setct_CRLNotificationResTBS "setct-CRLNotificationResTBS" +#define NID_setct_CRLNotificationResTBS 599 +#define OBJ_setct_CRLNotificationResTBS OBJ_set_ctype,81L + +#define SN_setct_BCIDistributionTBS "setct-BCIDistributionTBS" +#define NID_setct_BCIDistributionTBS 600 +#define OBJ_setct_BCIDistributionTBS OBJ_set_ctype,82L + +#define SN_setext_genCrypt "setext-genCrypt" +#define LN_setext_genCrypt "generic cryptogram" +#define NID_setext_genCrypt 601 +#define OBJ_setext_genCrypt OBJ_set_msgExt,1L + +#define SN_setext_miAuth "setext-miAuth" +#define LN_setext_miAuth "merchant initiated auth" +#define NID_setext_miAuth 602 +#define OBJ_setext_miAuth OBJ_set_msgExt,3L + +#define SN_setext_pinSecure "setext-pinSecure" +#define NID_setext_pinSecure 603 +#define OBJ_setext_pinSecure OBJ_set_msgExt,4L + +#define SN_setext_pinAny "setext-pinAny" +#define NID_setext_pinAny 604 +#define OBJ_setext_pinAny OBJ_set_msgExt,5L + +#define SN_setext_track2 "setext-track2" +#define NID_setext_track2 605 +#define OBJ_setext_track2 OBJ_set_msgExt,7L + +#define SN_setext_cv "setext-cv" +#define LN_setext_cv "additional verification" +#define NID_setext_cv 606 +#define OBJ_setext_cv OBJ_set_msgExt,8L + +#define SN_set_policy_root "set-policy-root" +#define NID_set_policy_root 607 +#define OBJ_set_policy_root OBJ_set_policy,0L + +#define SN_setCext_hashedRoot "setCext-hashedRoot" +#define NID_setCext_hashedRoot 608 +#define OBJ_setCext_hashedRoot OBJ_set_certExt,0L + +#define SN_setCext_certType "setCext-certType" +#define NID_setCext_certType 609 +#define OBJ_setCext_certType OBJ_set_certExt,1L + +#define SN_setCext_merchData "setCext-merchData" +#define NID_setCext_merchData 610 +#define OBJ_setCext_merchData OBJ_set_certExt,2L + +#define SN_setCext_cCertRequired "setCext-cCertRequired" +#define NID_setCext_cCertRequired 611 +#define OBJ_setCext_cCertRequired OBJ_set_certExt,3L + +#define SN_setCext_tunneling "setCext-tunneling" +#define NID_setCext_tunneling 612 +#define OBJ_setCext_tunneling OBJ_set_certExt,4L + +#define SN_setCext_setExt "setCext-setExt" +#define NID_setCext_setExt 613 +#define OBJ_setCext_setExt OBJ_set_certExt,5L + +#define SN_setCext_setQualf "setCext-setQualf" +#define NID_setCext_setQualf 614 +#define OBJ_setCext_setQualf OBJ_set_certExt,6L + +#define SN_setCext_PGWYcapabilities "setCext-PGWYcapabilities" +#define NID_setCext_PGWYcapabilities 615 +#define OBJ_setCext_PGWYcapabilities OBJ_set_certExt,7L + +#define SN_setCext_TokenIdentifier "setCext-TokenIdentifier" +#define NID_setCext_TokenIdentifier 616 +#define OBJ_setCext_TokenIdentifier OBJ_set_certExt,8L + +#define SN_setCext_Track2Data "setCext-Track2Data" +#define NID_setCext_Track2Data 617 +#define OBJ_setCext_Track2Data OBJ_set_certExt,9L + +#define SN_setCext_TokenType "setCext-TokenType" +#define NID_setCext_TokenType 618 +#define OBJ_setCext_TokenType OBJ_set_certExt,10L + +#define SN_setCext_IssuerCapabilities "setCext-IssuerCapabilities" +#define NID_setCext_IssuerCapabilities 619 +#define OBJ_setCext_IssuerCapabilities OBJ_set_certExt,11L + +#define SN_setAttr_Cert "setAttr-Cert" +#define NID_setAttr_Cert 620 +#define OBJ_setAttr_Cert OBJ_set_attr,0L + +#define SN_setAttr_PGWYcap "setAttr-PGWYcap" +#define LN_setAttr_PGWYcap "payment gateway capabilities" +#define NID_setAttr_PGWYcap 621 +#define OBJ_setAttr_PGWYcap OBJ_set_attr,1L + +#define SN_setAttr_TokenType "setAttr-TokenType" +#define NID_setAttr_TokenType 622 +#define OBJ_setAttr_TokenType OBJ_set_attr,2L + +#define SN_setAttr_IssCap "setAttr-IssCap" +#define LN_setAttr_IssCap "issuer capabilities" +#define NID_setAttr_IssCap 623 +#define OBJ_setAttr_IssCap OBJ_set_attr,3L + +#define SN_set_rootKeyThumb "set-rootKeyThumb" +#define NID_set_rootKeyThumb 624 +#define OBJ_set_rootKeyThumb OBJ_setAttr_Cert,0L + +#define SN_set_addPolicy "set-addPolicy" +#define NID_set_addPolicy 625 +#define OBJ_set_addPolicy OBJ_setAttr_Cert,1L + +#define SN_setAttr_Token_EMV "setAttr-Token-EMV" +#define NID_setAttr_Token_EMV 626 +#define OBJ_setAttr_Token_EMV OBJ_setAttr_TokenType,1L + +#define SN_setAttr_Token_B0Prime "setAttr-Token-B0Prime" +#define NID_setAttr_Token_B0Prime 627 +#define OBJ_setAttr_Token_B0Prime OBJ_setAttr_TokenType,2L + +#define SN_setAttr_IssCap_CVM "setAttr-IssCap-CVM" +#define NID_setAttr_IssCap_CVM 628 +#define OBJ_setAttr_IssCap_CVM OBJ_setAttr_IssCap,3L + +#define SN_setAttr_IssCap_T2 "setAttr-IssCap-T2" +#define NID_setAttr_IssCap_T2 629 +#define OBJ_setAttr_IssCap_T2 OBJ_setAttr_IssCap,4L + +#define SN_setAttr_IssCap_Sig "setAttr-IssCap-Sig" +#define NID_setAttr_IssCap_Sig 630 +#define OBJ_setAttr_IssCap_Sig OBJ_setAttr_IssCap,5L + +#define SN_setAttr_GenCryptgrm "setAttr-GenCryptgrm" +#define LN_setAttr_GenCryptgrm "generate cryptogram" +#define NID_setAttr_GenCryptgrm 631 +#define OBJ_setAttr_GenCryptgrm OBJ_setAttr_IssCap_CVM,1L + +#define SN_setAttr_T2Enc "setAttr-T2Enc" +#define LN_setAttr_T2Enc "encrypted track 2" +#define NID_setAttr_T2Enc 632 +#define OBJ_setAttr_T2Enc OBJ_setAttr_IssCap_T2,1L + +#define SN_setAttr_T2cleartxt "setAttr-T2cleartxt" +#define LN_setAttr_T2cleartxt "cleartext track 2" +#define NID_setAttr_T2cleartxt 633 +#define OBJ_setAttr_T2cleartxt OBJ_setAttr_IssCap_T2,2L + +#define SN_setAttr_TokICCsig "setAttr-TokICCsig" +#define LN_setAttr_TokICCsig "ICC or token signature" +#define NID_setAttr_TokICCsig 634 +#define OBJ_setAttr_TokICCsig OBJ_setAttr_IssCap_Sig,1L + +#define SN_setAttr_SecDevSig "setAttr-SecDevSig" +#define LN_setAttr_SecDevSig "secure device signature" +#define NID_setAttr_SecDevSig 635 +#define OBJ_setAttr_SecDevSig OBJ_setAttr_IssCap_Sig,2L + +#define SN_set_brand_IATA_ATA "set-brand-IATA-ATA" +#define NID_set_brand_IATA_ATA 636 +#define OBJ_set_brand_IATA_ATA OBJ_set_brand,1L + +#define SN_set_brand_Diners "set-brand-Diners" +#define NID_set_brand_Diners 637 +#define OBJ_set_brand_Diners OBJ_set_brand,30L + +#define SN_set_brand_AmericanExpress "set-brand-AmericanExpress" +#define NID_set_brand_AmericanExpress 638 +#define OBJ_set_brand_AmericanExpress OBJ_set_brand,34L + +#define SN_set_brand_JCB "set-brand-JCB" +#define NID_set_brand_JCB 639 +#define OBJ_set_brand_JCB OBJ_set_brand,35L + +#define SN_set_brand_Visa "set-brand-Visa" +#define NID_set_brand_Visa 640 +#define OBJ_set_brand_Visa OBJ_set_brand,4L + +#define SN_set_brand_MasterCard "set-brand-MasterCard" +#define NID_set_brand_MasterCard 641 +#define OBJ_set_brand_MasterCard OBJ_set_brand,5L + +#define SN_set_brand_Novus "set-brand-Novus" +#define NID_set_brand_Novus 642 +#define OBJ_set_brand_Novus OBJ_set_brand,6011L + +#define SN_des_cdmf "DES-CDMF" +#define LN_des_cdmf "des-cdmf" +#define NID_des_cdmf 643 +#define OBJ_des_cdmf OBJ_rsadsi,3L,10L + +#define SN_rsaOAEPEncryptionSET "rsaOAEPEncryptionSET" +#define NID_rsaOAEPEncryptionSET 644 +#define OBJ_rsaOAEPEncryptionSET OBJ_rsadsi,1L,1L,6L + +#define SN_ipsec3 "Oakley-EC2N-3" +#define LN_ipsec3 "ipsec3" +#define NID_ipsec3 749 + +#define SN_ipsec4 "Oakley-EC2N-4" +#define LN_ipsec4 "ipsec4" +#define NID_ipsec4 750 + +#define SN_whirlpool "whirlpool" +#define NID_whirlpool 804 +#define OBJ_whirlpool OBJ_iso,0L,10118L,3L,0L,55L + +#define SN_cryptopro "cryptopro" +#define NID_cryptopro 805 +#define OBJ_cryptopro OBJ_member_body,643L,2L,2L + +#define SN_cryptocom "cryptocom" +#define NID_cryptocom 806 +#define OBJ_cryptocom OBJ_member_body,643L,2L,9L + +#define SN_id_GostR3411_94_with_GostR3410_2001 "id-GostR3411-94-with-GostR3410-2001" +#define LN_id_GostR3411_94_with_GostR3410_2001 "GOST R 34.11-94 with GOST R 34.10-2001" +#define NID_id_GostR3411_94_with_GostR3410_2001 807 +#define OBJ_id_GostR3411_94_with_GostR3410_2001 OBJ_cryptopro,3L + +#define SN_id_GostR3411_94_with_GostR3410_94 "id-GostR3411-94-with-GostR3410-94" +#define LN_id_GostR3411_94_with_GostR3410_94 "GOST R 34.11-94 with GOST R 34.10-94" +#define NID_id_GostR3411_94_with_GostR3410_94 808 +#define OBJ_id_GostR3411_94_with_GostR3410_94 OBJ_cryptopro,4L + +#define SN_id_GostR3411_94 "md_gost94" +#define LN_id_GostR3411_94 "GOST R 34.11-94" +#define NID_id_GostR3411_94 809 +#define OBJ_id_GostR3411_94 OBJ_cryptopro,9L + +#define SN_id_HMACGostR3411_94 "id-HMACGostR3411-94" +#define LN_id_HMACGostR3411_94 "HMAC GOST 34.11-94" +#define NID_id_HMACGostR3411_94 810 +#define OBJ_id_HMACGostR3411_94 OBJ_cryptopro,10L + +#define SN_id_GostR3410_2001 "gost2001" +#define LN_id_GostR3410_2001 "GOST R 34.10-2001" +#define NID_id_GostR3410_2001 811 +#define OBJ_id_GostR3410_2001 OBJ_cryptopro,19L + +#define SN_id_GostR3410_94 "gost94" +#define LN_id_GostR3410_94 "GOST R 34.10-94" +#define NID_id_GostR3410_94 812 +#define OBJ_id_GostR3410_94 OBJ_cryptopro,20L + +#define SN_id_Gost28147_89 "gost89" +#define LN_id_Gost28147_89 "GOST 28147-89" +#define NID_id_Gost28147_89 813 +#define OBJ_id_Gost28147_89 OBJ_cryptopro,21L + +#define SN_gost89_cnt "gost89-cnt" +#define NID_gost89_cnt 814 + +#define SN_id_Gost28147_89_MAC "gost-mac" +#define LN_id_Gost28147_89_MAC "GOST 28147-89 MAC" +#define NID_id_Gost28147_89_MAC 815 +#define OBJ_id_Gost28147_89_MAC OBJ_cryptopro,22L + +#define SN_id_GostR3411_94_prf "prf-gostr3411-94" +#define LN_id_GostR3411_94_prf "GOST R 34.11-94 PRF" +#define NID_id_GostR3411_94_prf 816 +#define OBJ_id_GostR3411_94_prf OBJ_cryptopro,23L + +#define SN_id_GostR3410_2001DH "id-GostR3410-2001DH" +#define LN_id_GostR3410_2001DH "GOST R 34.10-2001 DH" +#define NID_id_GostR3410_2001DH 817 +#define OBJ_id_GostR3410_2001DH OBJ_cryptopro,98L + +#define SN_id_GostR3410_94DH "id-GostR3410-94DH" +#define LN_id_GostR3410_94DH "GOST R 34.10-94 DH" +#define NID_id_GostR3410_94DH 818 +#define OBJ_id_GostR3410_94DH OBJ_cryptopro,99L + +#define SN_id_Gost28147_89_CryptoPro_KeyMeshing "id-Gost28147-89-CryptoPro-KeyMeshing" +#define NID_id_Gost28147_89_CryptoPro_KeyMeshing 819 +#define OBJ_id_Gost28147_89_CryptoPro_KeyMeshing OBJ_cryptopro,14L,1L + +#define SN_id_Gost28147_89_None_KeyMeshing "id-Gost28147-89-None-KeyMeshing" +#define NID_id_Gost28147_89_None_KeyMeshing 820 +#define OBJ_id_Gost28147_89_None_KeyMeshing OBJ_cryptopro,14L,0L + +#define SN_id_GostR3411_94_TestParamSet "id-GostR3411-94-TestParamSet" +#define NID_id_GostR3411_94_TestParamSet 821 +#define OBJ_id_GostR3411_94_TestParamSet OBJ_cryptopro,30L,0L + +#define SN_id_GostR3411_94_CryptoProParamSet "id-GostR3411-94-CryptoProParamSet" +#define NID_id_GostR3411_94_CryptoProParamSet 822 +#define OBJ_id_GostR3411_94_CryptoProParamSet OBJ_cryptopro,30L,1L + +#define SN_id_Gost28147_89_TestParamSet "id-Gost28147-89-TestParamSet" +#define NID_id_Gost28147_89_TestParamSet 823 +#define OBJ_id_Gost28147_89_TestParamSet OBJ_cryptopro,31L,0L + +#define SN_id_Gost28147_89_CryptoPro_A_ParamSet "id-Gost28147-89-CryptoPro-A-ParamSet" +#define NID_id_Gost28147_89_CryptoPro_A_ParamSet 824 +#define OBJ_id_Gost28147_89_CryptoPro_A_ParamSet OBJ_cryptopro,31L,1L + +#define SN_id_Gost28147_89_CryptoPro_B_ParamSet "id-Gost28147-89-CryptoPro-B-ParamSet" +#define NID_id_Gost28147_89_CryptoPro_B_ParamSet 825 +#define OBJ_id_Gost28147_89_CryptoPro_B_ParamSet OBJ_cryptopro,31L,2L + +#define SN_id_Gost28147_89_CryptoPro_C_ParamSet "id-Gost28147-89-CryptoPro-C-ParamSet" +#define NID_id_Gost28147_89_CryptoPro_C_ParamSet 826 +#define OBJ_id_Gost28147_89_CryptoPro_C_ParamSet OBJ_cryptopro,31L,3L + +#define SN_id_Gost28147_89_CryptoPro_D_ParamSet "id-Gost28147-89-CryptoPro-D-ParamSet" +#define NID_id_Gost28147_89_CryptoPro_D_ParamSet 827 +#define OBJ_id_Gost28147_89_CryptoPro_D_ParamSet OBJ_cryptopro,31L,4L + +#define SN_id_Gost28147_89_CryptoPro_Oscar_1_1_ParamSet "id-Gost28147-89-CryptoPro-Oscar-1-1-ParamSet" +#define NID_id_Gost28147_89_CryptoPro_Oscar_1_1_ParamSet 828 +#define OBJ_id_Gost28147_89_CryptoPro_Oscar_1_1_ParamSet OBJ_cryptopro,31L,5L + +#define SN_id_Gost28147_89_CryptoPro_Oscar_1_0_ParamSet "id-Gost28147-89-CryptoPro-Oscar-1-0-ParamSet" +#define NID_id_Gost28147_89_CryptoPro_Oscar_1_0_ParamSet 829 +#define OBJ_id_Gost28147_89_CryptoPro_Oscar_1_0_ParamSet OBJ_cryptopro,31L,6L + +#define SN_id_Gost28147_89_CryptoPro_RIC_1_ParamSet "id-Gost28147-89-CryptoPro-RIC-1-ParamSet" +#define NID_id_Gost28147_89_CryptoPro_RIC_1_ParamSet 830 +#define OBJ_id_Gost28147_89_CryptoPro_RIC_1_ParamSet OBJ_cryptopro,31L,7L + +#define SN_id_GostR3410_94_TestParamSet "id-GostR3410-94-TestParamSet" +#define NID_id_GostR3410_94_TestParamSet 831 +#define OBJ_id_GostR3410_94_TestParamSet OBJ_cryptopro,32L,0L + +#define SN_id_GostR3410_94_CryptoPro_A_ParamSet "id-GostR3410-94-CryptoPro-A-ParamSet" +#define NID_id_GostR3410_94_CryptoPro_A_ParamSet 832 +#define OBJ_id_GostR3410_94_CryptoPro_A_ParamSet OBJ_cryptopro,32L,2L + +#define SN_id_GostR3410_94_CryptoPro_B_ParamSet "id-GostR3410-94-CryptoPro-B-ParamSet" +#define NID_id_GostR3410_94_CryptoPro_B_ParamSet 833 +#define OBJ_id_GostR3410_94_CryptoPro_B_ParamSet OBJ_cryptopro,32L,3L + +#define SN_id_GostR3410_94_CryptoPro_C_ParamSet "id-GostR3410-94-CryptoPro-C-ParamSet" +#define NID_id_GostR3410_94_CryptoPro_C_ParamSet 834 +#define OBJ_id_GostR3410_94_CryptoPro_C_ParamSet OBJ_cryptopro,32L,4L + +#define SN_id_GostR3410_94_CryptoPro_D_ParamSet "id-GostR3410-94-CryptoPro-D-ParamSet" +#define NID_id_GostR3410_94_CryptoPro_D_ParamSet 835 +#define OBJ_id_GostR3410_94_CryptoPro_D_ParamSet OBJ_cryptopro,32L,5L + +#define SN_id_GostR3410_94_CryptoPro_XchA_ParamSet "id-GostR3410-94-CryptoPro-XchA-ParamSet" +#define NID_id_GostR3410_94_CryptoPro_XchA_ParamSet 836 +#define OBJ_id_GostR3410_94_CryptoPro_XchA_ParamSet OBJ_cryptopro,33L,1L + +#define SN_id_GostR3410_94_CryptoPro_XchB_ParamSet "id-GostR3410-94-CryptoPro-XchB-ParamSet" +#define NID_id_GostR3410_94_CryptoPro_XchB_ParamSet 837 +#define OBJ_id_GostR3410_94_CryptoPro_XchB_ParamSet OBJ_cryptopro,33L,2L + +#define SN_id_GostR3410_94_CryptoPro_XchC_ParamSet "id-GostR3410-94-CryptoPro-XchC-ParamSet" +#define NID_id_GostR3410_94_CryptoPro_XchC_ParamSet 838 +#define OBJ_id_GostR3410_94_CryptoPro_XchC_ParamSet OBJ_cryptopro,33L,3L + +#define SN_id_GostR3410_2001_TestParamSet "id-GostR3410-2001-TestParamSet" +#define NID_id_GostR3410_2001_TestParamSet 839 +#define OBJ_id_GostR3410_2001_TestParamSet OBJ_cryptopro,35L,0L + +#define SN_id_GostR3410_2001_CryptoPro_A_ParamSet "id-GostR3410-2001-CryptoPro-A-ParamSet" +#define NID_id_GostR3410_2001_CryptoPro_A_ParamSet 840 +#define OBJ_id_GostR3410_2001_CryptoPro_A_ParamSet OBJ_cryptopro,35L,1L + +#define SN_id_GostR3410_2001_CryptoPro_B_ParamSet "id-GostR3410-2001-CryptoPro-B-ParamSet" +#define NID_id_GostR3410_2001_CryptoPro_B_ParamSet 841 +#define OBJ_id_GostR3410_2001_CryptoPro_B_ParamSet OBJ_cryptopro,35L,2L + +#define SN_id_GostR3410_2001_CryptoPro_C_ParamSet "id-GostR3410-2001-CryptoPro-C-ParamSet" +#define NID_id_GostR3410_2001_CryptoPro_C_ParamSet 842 +#define OBJ_id_GostR3410_2001_CryptoPro_C_ParamSet OBJ_cryptopro,35L,3L + +#define SN_id_GostR3410_2001_CryptoPro_XchA_ParamSet "id-GostR3410-2001-CryptoPro-XchA-ParamSet" +#define NID_id_GostR3410_2001_CryptoPro_XchA_ParamSet 843 +#define OBJ_id_GostR3410_2001_CryptoPro_XchA_ParamSet OBJ_cryptopro,36L,0L + +#define SN_id_GostR3410_2001_CryptoPro_XchB_ParamSet "id-GostR3410-2001-CryptoPro-XchB-ParamSet" +#define NID_id_GostR3410_2001_CryptoPro_XchB_ParamSet 844 +#define OBJ_id_GostR3410_2001_CryptoPro_XchB_ParamSet OBJ_cryptopro,36L,1L + +#define SN_id_GostR3410_94_a "id-GostR3410-94-a" +#define NID_id_GostR3410_94_a 845 +#define OBJ_id_GostR3410_94_a OBJ_id_GostR3410_94,1L + +#define SN_id_GostR3410_94_aBis "id-GostR3410-94-aBis" +#define NID_id_GostR3410_94_aBis 846 +#define OBJ_id_GostR3410_94_aBis OBJ_id_GostR3410_94,2L + +#define SN_id_GostR3410_94_b "id-GostR3410-94-b" +#define NID_id_GostR3410_94_b 847 +#define OBJ_id_GostR3410_94_b OBJ_id_GostR3410_94,3L + +#define SN_id_GostR3410_94_bBis "id-GostR3410-94-bBis" +#define NID_id_GostR3410_94_bBis 848 +#define OBJ_id_GostR3410_94_bBis OBJ_id_GostR3410_94,4L + +#define SN_id_Gost28147_89_cc "id-Gost28147-89-cc" +#define LN_id_Gost28147_89_cc "GOST 28147-89 Cryptocom ParamSet" +#define NID_id_Gost28147_89_cc 849 +#define OBJ_id_Gost28147_89_cc OBJ_cryptocom,1L,6L,1L + +#define SN_id_GostR3410_94_cc "gost94cc" +#define LN_id_GostR3410_94_cc "GOST 34.10-94 Cryptocom" +#define NID_id_GostR3410_94_cc 850 +#define OBJ_id_GostR3410_94_cc OBJ_cryptocom,1L,5L,3L + +#define SN_id_GostR3410_2001_cc "gost2001cc" +#define LN_id_GostR3410_2001_cc "GOST 34.10-2001 Cryptocom" +#define NID_id_GostR3410_2001_cc 851 +#define OBJ_id_GostR3410_2001_cc OBJ_cryptocom,1L,5L,4L + +#define SN_id_GostR3411_94_with_GostR3410_94_cc "id-GostR3411-94-with-GostR3410-94-cc" +#define LN_id_GostR3411_94_with_GostR3410_94_cc "GOST R 34.11-94 with GOST R 34.10-94 Cryptocom" +#define NID_id_GostR3411_94_with_GostR3410_94_cc 852 +#define OBJ_id_GostR3411_94_with_GostR3410_94_cc OBJ_cryptocom,1L,3L,3L + +#define SN_id_GostR3411_94_with_GostR3410_2001_cc "id-GostR3411-94-with-GostR3410-2001-cc" +#define LN_id_GostR3411_94_with_GostR3410_2001_cc "GOST R 34.11-94 with GOST R 34.10-2001 Cryptocom" +#define NID_id_GostR3411_94_with_GostR3410_2001_cc 853 +#define OBJ_id_GostR3411_94_with_GostR3410_2001_cc OBJ_cryptocom,1L,3L,4L + +#define SN_id_GostR3410_2001_ParamSet_cc "id-GostR3410-2001-ParamSet-cc" +#define LN_id_GostR3410_2001_ParamSet_cc "GOST R 3410-2001 Parameter Set Cryptocom" +#define NID_id_GostR3410_2001_ParamSet_cc 854 +#define OBJ_id_GostR3410_2001_ParamSet_cc OBJ_cryptocom,1L,8L,1L + +#define SN_camellia_128_cbc "CAMELLIA-128-CBC" +#define LN_camellia_128_cbc "camellia-128-cbc" +#define NID_camellia_128_cbc 751 +#define OBJ_camellia_128_cbc 1L,2L,392L,200011L,61L,1L,1L,1L,2L + +#define SN_camellia_192_cbc "CAMELLIA-192-CBC" +#define LN_camellia_192_cbc "camellia-192-cbc" +#define NID_camellia_192_cbc 752 +#define OBJ_camellia_192_cbc 1L,2L,392L,200011L,61L,1L,1L,1L,3L + +#define SN_camellia_256_cbc "CAMELLIA-256-CBC" +#define LN_camellia_256_cbc "camellia-256-cbc" +#define NID_camellia_256_cbc 753 +#define OBJ_camellia_256_cbc 1L,2L,392L,200011L,61L,1L,1L,1L,4L + +#define SN_id_camellia128_wrap "id-camellia128-wrap" +#define NID_id_camellia128_wrap 907 +#define OBJ_id_camellia128_wrap 1L,2L,392L,200011L,61L,1L,1L,3L,2L + +#define SN_id_camellia192_wrap "id-camellia192-wrap" +#define NID_id_camellia192_wrap 908 +#define OBJ_id_camellia192_wrap 1L,2L,392L,200011L,61L,1L,1L,3L,3L + +#define SN_id_camellia256_wrap "id-camellia256-wrap" +#define NID_id_camellia256_wrap 909 +#define OBJ_id_camellia256_wrap 1L,2L,392L,200011L,61L,1L,1L,3L,4L + +#define OBJ_ntt_ds 0L,3L,4401L,5L + +#define OBJ_camellia OBJ_ntt_ds,3L,1L,9L + +#define SN_camellia_128_ecb "CAMELLIA-128-ECB" +#define LN_camellia_128_ecb "camellia-128-ecb" +#define NID_camellia_128_ecb 754 +#define OBJ_camellia_128_ecb OBJ_camellia,1L + +#define SN_camellia_128_ofb128 "CAMELLIA-128-OFB" +#define LN_camellia_128_ofb128 "camellia-128-ofb" +#define NID_camellia_128_ofb128 766 +#define OBJ_camellia_128_ofb128 OBJ_camellia,3L + +#define SN_camellia_128_cfb128 "CAMELLIA-128-CFB" +#define LN_camellia_128_cfb128 "camellia-128-cfb" +#define NID_camellia_128_cfb128 757 +#define OBJ_camellia_128_cfb128 OBJ_camellia,4L + +#define SN_camellia_192_ecb "CAMELLIA-192-ECB" +#define LN_camellia_192_ecb "camellia-192-ecb" +#define NID_camellia_192_ecb 755 +#define OBJ_camellia_192_ecb OBJ_camellia,21L + +#define SN_camellia_192_ofb128 "CAMELLIA-192-OFB" +#define LN_camellia_192_ofb128 "camellia-192-ofb" +#define NID_camellia_192_ofb128 767 +#define OBJ_camellia_192_ofb128 OBJ_camellia,23L + +#define SN_camellia_192_cfb128 "CAMELLIA-192-CFB" +#define LN_camellia_192_cfb128 "camellia-192-cfb" +#define NID_camellia_192_cfb128 758 +#define OBJ_camellia_192_cfb128 OBJ_camellia,24L + +#define SN_camellia_256_ecb "CAMELLIA-256-ECB" +#define LN_camellia_256_ecb "camellia-256-ecb" +#define NID_camellia_256_ecb 756 +#define OBJ_camellia_256_ecb OBJ_camellia,41L + +#define SN_camellia_256_ofb128 "CAMELLIA-256-OFB" +#define LN_camellia_256_ofb128 "camellia-256-ofb" +#define NID_camellia_256_ofb128 768 +#define OBJ_camellia_256_ofb128 OBJ_camellia,43L + +#define SN_camellia_256_cfb128 "CAMELLIA-256-CFB" +#define LN_camellia_256_cfb128 "camellia-256-cfb" +#define NID_camellia_256_cfb128 759 +#define OBJ_camellia_256_cfb128 OBJ_camellia,44L + +#define SN_camellia_128_cfb1 "CAMELLIA-128-CFB1" +#define LN_camellia_128_cfb1 "camellia-128-cfb1" +#define NID_camellia_128_cfb1 760 + +#define SN_camellia_192_cfb1 "CAMELLIA-192-CFB1" +#define LN_camellia_192_cfb1 "camellia-192-cfb1" +#define NID_camellia_192_cfb1 761 + +#define SN_camellia_256_cfb1 "CAMELLIA-256-CFB1" +#define LN_camellia_256_cfb1 "camellia-256-cfb1" +#define NID_camellia_256_cfb1 762 + +#define SN_camellia_128_cfb8 "CAMELLIA-128-CFB8" +#define LN_camellia_128_cfb8 "camellia-128-cfb8" +#define NID_camellia_128_cfb8 763 + +#define SN_camellia_192_cfb8 "CAMELLIA-192-CFB8" +#define LN_camellia_192_cfb8 "camellia-192-cfb8" +#define NID_camellia_192_cfb8 764 + +#define SN_camellia_256_cfb8 "CAMELLIA-256-CFB8" +#define LN_camellia_256_cfb8 "camellia-256-cfb8" +#define NID_camellia_256_cfb8 765 + +#define SN_kisa "KISA" +#define LN_kisa "kisa" +#define NID_kisa 773 +#define OBJ_kisa OBJ_member_body,410L,200004L + +#define SN_seed_ecb "SEED-ECB" +#define LN_seed_ecb "seed-ecb" +#define NID_seed_ecb 776 +#define OBJ_seed_ecb OBJ_kisa,1L,3L + +#define SN_seed_cbc "SEED-CBC" +#define LN_seed_cbc "seed-cbc" +#define NID_seed_cbc 777 +#define OBJ_seed_cbc OBJ_kisa,1L,4L + +#define SN_seed_cfb128 "SEED-CFB" +#define LN_seed_cfb128 "seed-cfb" +#define NID_seed_cfb128 779 +#define OBJ_seed_cfb128 OBJ_kisa,1L,5L + +#define SN_seed_ofb128 "SEED-OFB" +#define LN_seed_ofb128 "seed-ofb" +#define NID_seed_ofb128 778 +#define OBJ_seed_ofb128 OBJ_kisa,1L,6L + +#define SN_hmac "HMAC" +#define LN_hmac "hmac" +#define NID_hmac 855 + +#define SN_cmac "CMAC" +#define LN_cmac "cmac" +#define NID_cmac 894 + +#define SN_rc4_hmac_md5 "RC4-HMAC-MD5" +#define LN_rc4_hmac_md5 "rc4-hmac-md5" +#define NID_rc4_hmac_md5 915 + +#define SN_aes_128_cbc_hmac_sha1 "AES-128-CBC-HMAC-SHA1" +#define LN_aes_128_cbc_hmac_sha1 "aes-128-cbc-hmac-sha1" +#define NID_aes_128_cbc_hmac_sha1 916 + +#define SN_aes_192_cbc_hmac_sha1 "AES-192-CBC-HMAC-SHA1" +#define LN_aes_192_cbc_hmac_sha1 "aes-192-cbc-hmac-sha1" +#define NID_aes_192_cbc_hmac_sha1 917 + +#define SN_aes_256_cbc_hmac_sha1 "AES-256-CBC-HMAC-SHA1" +#define LN_aes_256_cbc_hmac_sha1 "aes-256-cbc-hmac-sha1" +#define NID_aes_256_cbc_hmac_sha1 918 + +#define SN_aes_128_cbc_hmac_sha256 "AES-128-CBC-HMAC-SHA256" +#define LN_aes_128_cbc_hmac_sha256 "aes-128-cbc-hmac-sha256" +#define NID_aes_128_cbc_hmac_sha256 948 + +#define SN_aes_192_cbc_hmac_sha256 "AES-192-CBC-HMAC-SHA256" +#define LN_aes_192_cbc_hmac_sha256 "aes-192-cbc-hmac-sha256" +#define NID_aes_192_cbc_hmac_sha256 949 + +#define SN_aes_256_cbc_hmac_sha256 "AES-256-CBC-HMAC-SHA256" +#define LN_aes_256_cbc_hmac_sha256 "aes-256-cbc-hmac-sha256" +#define NID_aes_256_cbc_hmac_sha256 950 + +#define SN_dhpublicnumber "dhpublicnumber" +#define LN_dhpublicnumber "X9.42 DH" +#define NID_dhpublicnumber 920 +#define OBJ_dhpublicnumber OBJ_ISO_US,10046L,2L,1L + +#define SN_brainpoolP160r1 "brainpoolP160r1" +#define NID_brainpoolP160r1 921 +#define OBJ_brainpoolP160r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,1L + +#define SN_brainpoolP160t1 "brainpoolP160t1" +#define NID_brainpoolP160t1 922 +#define OBJ_brainpoolP160t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,2L + +#define SN_brainpoolP192r1 "brainpoolP192r1" +#define NID_brainpoolP192r1 923 +#define OBJ_brainpoolP192r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,3L + +#define SN_brainpoolP192t1 "brainpoolP192t1" +#define NID_brainpoolP192t1 924 +#define OBJ_brainpoolP192t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,4L + +#define SN_brainpoolP224r1 "brainpoolP224r1" +#define NID_brainpoolP224r1 925 +#define OBJ_brainpoolP224r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,5L + +#define SN_brainpoolP224t1 "brainpoolP224t1" +#define NID_brainpoolP224t1 926 +#define OBJ_brainpoolP224t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,6L + +#define SN_brainpoolP256r1 "brainpoolP256r1" +#define NID_brainpoolP256r1 927 +#define OBJ_brainpoolP256r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,7L + +#define SN_brainpoolP256t1 "brainpoolP256t1" +#define NID_brainpoolP256t1 928 +#define OBJ_brainpoolP256t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,8L + +#define SN_brainpoolP320r1 "brainpoolP320r1" +#define NID_brainpoolP320r1 929 +#define OBJ_brainpoolP320r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,9L + +#define SN_brainpoolP320t1 "brainpoolP320t1" +#define NID_brainpoolP320t1 930 +#define OBJ_brainpoolP320t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,10L + +#define SN_brainpoolP384r1 "brainpoolP384r1" +#define NID_brainpoolP384r1 931 +#define OBJ_brainpoolP384r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,11L + +#define SN_brainpoolP384t1 "brainpoolP384t1" +#define NID_brainpoolP384t1 932 +#define OBJ_brainpoolP384t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,12L + +#define SN_brainpoolP512r1 "brainpoolP512r1" +#define NID_brainpoolP512r1 933 +#define OBJ_brainpoolP512r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,13L + +#define SN_brainpoolP512t1 "brainpoolP512t1" +#define NID_brainpoolP512t1 934 +#define OBJ_brainpoolP512t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,14L + +#define OBJ_x9_63_scheme 1L,3L,133L,16L,840L,63L,0L + +#define OBJ_secg_scheme OBJ_certicom_arc,1L + +#define SN_dhSinglePass_stdDH_sha1kdf_scheme "dhSinglePass-stdDH-sha1kdf-scheme" +#define NID_dhSinglePass_stdDH_sha1kdf_scheme 936 +#define OBJ_dhSinglePass_stdDH_sha1kdf_scheme OBJ_x9_63_scheme,2L + +#define SN_dhSinglePass_stdDH_sha224kdf_scheme "dhSinglePass-stdDH-sha224kdf-scheme" +#define NID_dhSinglePass_stdDH_sha224kdf_scheme 937 +#define OBJ_dhSinglePass_stdDH_sha224kdf_scheme OBJ_secg_scheme,11L,0L + +#define SN_dhSinglePass_stdDH_sha256kdf_scheme "dhSinglePass-stdDH-sha256kdf-scheme" +#define NID_dhSinglePass_stdDH_sha256kdf_scheme 938 +#define OBJ_dhSinglePass_stdDH_sha256kdf_scheme OBJ_secg_scheme,11L,1L + +#define SN_dhSinglePass_stdDH_sha384kdf_scheme "dhSinglePass-stdDH-sha384kdf-scheme" +#define NID_dhSinglePass_stdDH_sha384kdf_scheme 939 +#define OBJ_dhSinglePass_stdDH_sha384kdf_scheme OBJ_secg_scheme,11L,2L + +#define SN_dhSinglePass_stdDH_sha512kdf_scheme "dhSinglePass-stdDH-sha512kdf-scheme" +#define NID_dhSinglePass_stdDH_sha512kdf_scheme 940 +#define OBJ_dhSinglePass_stdDH_sha512kdf_scheme OBJ_secg_scheme,11L,3L + +#define SN_dhSinglePass_cofactorDH_sha1kdf_scheme "dhSinglePass-cofactorDH-sha1kdf-scheme" +#define NID_dhSinglePass_cofactorDH_sha1kdf_scheme 941 +#define OBJ_dhSinglePass_cofactorDH_sha1kdf_scheme OBJ_x9_63_scheme,3L + +#define SN_dhSinglePass_cofactorDH_sha224kdf_scheme "dhSinglePass-cofactorDH-sha224kdf-scheme" +#define NID_dhSinglePass_cofactorDH_sha224kdf_scheme 942 +#define OBJ_dhSinglePass_cofactorDH_sha224kdf_scheme OBJ_secg_scheme,14L,0L + +#define SN_dhSinglePass_cofactorDH_sha256kdf_scheme "dhSinglePass-cofactorDH-sha256kdf-scheme" +#define NID_dhSinglePass_cofactorDH_sha256kdf_scheme 943 +#define OBJ_dhSinglePass_cofactorDH_sha256kdf_scheme OBJ_secg_scheme,14L,1L + +#define SN_dhSinglePass_cofactorDH_sha384kdf_scheme "dhSinglePass-cofactorDH-sha384kdf-scheme" +#define NID_dhSinglePass_cofactorDH_sha384kdf_scheme 944 +#define OBJ_dhSinglePass_cofactorDH_sha384kdf_scheme OBJ_secg_scheme,14L,2L + +#define SN_dhSinglePass_cofactorDH_sha512kdf_scheme "dhSinglePass-cofactorDH-sha512kdf-scheme" +#define NID_dhSinglePass_cofactorDH_sha512kdf_scheme 945 +#define OBJ_dhSinglePass_cofactorDH_sha512kdf_scheme OBJ_secg_scheme,14L,3L + +#define SN_dh_std_kdf "dh-std-kdf" +#define NID_dh_std_kdf 946 + +#define SN_dh_cofactor_kdf "dh-cofactor-kdf" +#define NID_dh_cofactor_kdf 947 + +#define SN_ct_precert_scts "ct_precert_scts" +#define LN_ct_precert_scts "CT Precertificate SCTs" +#define NID_ct_precert_scts 951 +#define OBJ_ct_precert_scts 1L,3L,6L,1L,4L,1L,11129L,2L,4L,2L + +#define SN_ct_precert_poison "ct_precert_poison" +#define LN_ct_precert_poison "CT Precertificate Poison" +#define NID_ct_precert_poison 952 +#define OBJ_ct_precert_poison 1L,3L,6L,1L,4L,1L,11129L,2L,4L,3L + +#define SN_ct_precert_signer "ct_precert_signer" +#define LN_ct_precert_signer "CT Precertificate Signer" +#define NID_ct_precert_signer 953 +#define OBJ_ct_precert_signer 1L,3L,6L,1L,4L,1L,11129L,2L,4L,4L + +#define SN_ct_cert_scts "ct_cert_scts" +#define LN_ct_cert_scts "CT Certificate SCTs" +#define NID_ct_cert_scts 954 +#define OBJ_ct_cert_scts 1L,3L,6L,1L,4L,1L,11129L,2L,4L,5L + +#define SN_jurisdictionLocalityName "jurisdictionL" +#define LN_jurisdictionLocalityName "jurisdictionLocalityName" +#define NID_jurisdictionLocalityName 955 +#define OBJ_jurisdictionLocalityName 1L,3L,6L,1L,4L,1L,311L,60L,2L,1L,1L + +#define SN_jurisdictionStateOrProvinceName "jurisdictionST" +#define LN_jurisdictionStateOrProvinceName "jurisdictionStateOrProvinceName" +#define NID_jurisdictionStateOrProvinceName 956 +#define OBJ_jurisdictionStateOrProvinceName 1L,3L,6L,1L,4L,1L,311L,60L,2L,1L,2L + +#define SN_jurisdictionCountryName "jurisdictionC" +#define LN_jurisdictionCountryName "jurisdictionCountryName" +#define NID_jurisdictionCountryName 957 +#define OBJ_jurisdictionCountryName 1L,3L,6L,1L,4L,1L,311L,60L,2L,1L,3L diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/objects.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/objects.h new file mode 100644 index 0000000..b8dafa8 --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/objects.h @@ -0,0 +1,1143 @@ +/* crypto/objects/objects.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_OBJECTS_H +# define HEADER_OBJECTS_H + +# define USE_OBJ_MAC + +# ifdef USE_OBJ_MAC +# include +# else +# define SN_undef "UNDEF" +# define LN_undef "undefined" +# define NID_undef 0 +# define OBJ_undef 0L + +# define SN_Algorithm "Algorithm" +# define LN_algorithm "algorithm" +# define NID_algorithm 38 +# define OBJ_algorithm 1L,3L,14L,3L,2L + +# define LN_rsadsi "rsadsi" +# define NID_rsadsi 1 +# define OBJ_rsadsi 1L,2L,840L,113549L + +# define LN_pkcs "pkcs" +# define NID_pkcs 2 +# define OBJ_pkcs OBJ_rsadsi,1L + +# define SN_md2 "MD2" +# define LN_md2 "md2" +# define NID_md2 3 +# define OBJ_md2 OBJ_rsadsi,2L,2L + +# define SN_md5 "MD5" +# define LN_md5 "md5" +# define NID_md5 4 +# define OBJ_md5 OBJ_rsadsi,2L,5L + +# define SN_rc4 "RC4" +# define LN_rc4 "rc4" +# define NID_rc4 5 +# define OBJ_rc4 OBJ_rsadsi,3L,4L + +# define LN_rsaEncryption "rsaEncryption" +# define NID_rsaEncryption 6 +# define OBJ_rsaEncryption OBJ_pkcs,1L,1L + +# define SN_md2WithRSAEncryption "RSA-MD2" +# define LN_md2WithRSAEncryption "md2WithRSAEncryption" +# define NID_md2WithRSAEncryption 7 +# define OBJ_md2WithRSAEncryption OBJ_pkcs,1L,2L + +# define SN_md5WithRSAEncryption "RSA-MD5" +# define LN_md5WithRSAEncryption "md5WithRSAEncryption" +# define NID_md5WithRSAEncryption 8 +# define OBJ_md5WithRSAEncryption OBJ_pkcs,1L,4L + +# define SN_pbeWithMD2AndDES_CBC "PBE-MD2-DES" +# define LN_pbeWithMD2AndDES_CBC "pbeWithMD2AndDES-CBC" +# define NID_pbeWithMD2AndDES_CBC 9 +# define OBJ_pbeWithMD2AndDES_CBC OBJ_pkcs,5L,1L + +# define SN_pbeWithMD5AndDES_CBC "PBE-MD5-DES" +# define LN_pbeWithMD5AndDES_CBC "pbeWithMD5AndDES-CBC" +# define NID_pbeWithMD5AndDES_CBC 10 +# define OBJ_pbeWithMD5AndDES_CBC OBJ_pkcs,5L,3L + +# define LN_X500 "X500" +# define NID_X500 11 +# define OBJ_X500 2L,5L + +# define LN_X509 "X509" +# define NID_X509 12 +# define OBJ_X509 OBJ_X500,4L + +# define SN_commonName "CN" +# define LN_commonName "commonName" +# define NID_commonName 13 +# define OBJ_commonName OBJ_X509,3L + +# define SN_countryName "C" +# define LN_countryName "countryName" +# define NID_countryName 14 +# define OBJ_countryName OBJ_X509,6L + +# define SN_localityName "L" +# define LN_localityName "localityName" +# define NID_localityName 15 +# define OBJ_localityName OBJ_X509,7L + +/* Postal Address? PA */ + +/* should be "ST" (rfc1327) but MS uses 'S' */ +# define SN_stateOrProvinceName "ST" +# define LN_stateOrProvinceName "stateOrProvinceName" +# define NID_stateOrProvinceName 16 +# define OBJ_stateOrProvinceName OBJ_X509,8L + +# define SN_organizationName "O" +# define LN_organizationName "organizationName" +# define NID_organizationName 17 +# define OBJ_organizationName OBJ_X509,10L + +# define SN_organizationalUnitName "OU" +# define LN_organizationalUnitName "organizationalUnitName" +# define NID_organizationalUnitName 18 +# define OBJ_organizationalUnitName OBJ_X509,11L + +# define SN_rsa "RSA" +# define LN_rsa "rsa" +# define NID_rsa 19 +# define OBJ_rsa OBJ_X500,8L,1L,1L + +# define LN_pkcs7 "pkcs7" +# define NID_pkcs7 20 +# define OBJ_pkcs7 OBJ_pkcs,7L + +# define LN_pkcs7_data "pkcs7-data" +# define NID_pkcs7_data 21 +# define OBJ_pkcs7_data OBJ_pkcs7,1L + +# define LN_pkcs7_signed "pkcs7-signedData" +# define NID_pkcs7_signed 22 +# define OBJ_pkcs7_signed OBJ_pkcs7,2L + +# define LN_pkcs7_enveloped "pkcs7-envelopedData" +# define NID_pkcs7_enveloped 23 +# define OBJ_pkcs7_enveloped OBJ_pkcs7,3L + +# define LN_pkcs7_signedAndEnveloped "pkcs7-signedAndEnvelopedData" +# define NID_pkcs7_signedAndEnveloped 24 +# define OBJ_pkcs7_signedAndEnveloped OBJ_pkcs7,4L + +# define LN_pkcs7_digest "pkcs7-digestData" +# define NID_pkcs7_digest 25 +# define OBJ_pkcs7_digest OBJ_pkcs7,5L + +# define LN_pkcs7_encrypted "pkcs7-encryptedData" +# define NID_pkcs7_encrypted 26 +# define OBJ_pkcs7_encrypted OBJ_pkcs7,6L + +# define LN_pkcs3 "pkcs3" +# define NID_pkcs3 27 +# define OBJ_pkcs3 OBJ_pkcs,3L + +# define LN_dhKeyAgreement "dhKeyAgreement" +# define NID_dhKeyAgreement 28 +# define OBJ_dhKeyAgreement OBJ_pkcs3,1L + +# define SN_des_ecb "DES-ECB" +# define LN_des_ecb "des-ecb" +# define NID_des_ecb 29 +# define OBJ_des_ecb OBJ_algorithm,6L + +# define SN_des_cfb64 "DES-CFB" +# define LN_des_cfb64 "des-cfb" +# define NID_des_cfb64 30 +/* IV + num */ +# define OBJ_des_cfb64 OBJ_algorithm,9L + +# define SN_des_cbc "DES-CBC" +# define LN_des_cbc "des-cbc" +# define NID_des_cbc 31 +/* IV */ +# define OBJ_des_cbc OBJ_algorithm,7L + +# define SN_des_ede "DES-EDE" +# define LN_des_ede "des-ede" +# define NID_des_ede 32 +/* ?? */ +# define OBJ_des_ede OBJ_algorithm,17L + +# define SN_des_ede3 "DES-EDE3" +# define LN_des_ede3 "des-ede3" +# define NID_des_ede3 33 + +# define SN_idea_cbc "IDEA-CBC" +# define LN_idea_cbc "idea-cbc" +# define NID_idea_cbc 34 +# define OBJ_idea_cbc 1L,3L,6L,1L,4L,1L,188L,7L,1L,1L,2L + +# define SN_idea_cfb64 "IDEA-CFB" +# define LN_idea_cfb64 "idea-cfb" +# define NID_idea_cfb64 35 + +# define SN_idea_ecb "IDEA-ECB" +# define LN_idea_ecb "idea-ecb" +# define NID_idea_ecb 36 + +# define SN_rc2_cbc "RC2-CBC" +# define LN_rc2_cbc "rc2-cbc" +# define NID_rc2_cbc 37 +# define OBJ_rc2_cbc OBJ_rsadsi,3L,2L + +# define SN_rc2_ecb "RC2-ECB" +# define LN_rc2_ecb "rc2-ecb" +# define NID_rc2_ecb 38 + +# define SN_rc2_cfb64 "RC2-CFB" +# define LN_rc2_cfb64 "rc2-cfb" +# define NID_rc2_cfb64 39 + +# define SN_rc2_ofb64 "RC2-OFB" +# define LN_rc2_ofb64 "rc2-ofb" +# define NID_rc2_ofb64 40 + +# define SN_sha "SHA" +# define LN_sha "sha" +# define NID_sha 41 +# define OBJ_sha OBJ_algorithm,18L + +# define SN_shaWithRSAEncryption "RSA-SHA" +# define LN_shaWithRSAEncryption "shaWithRSAEncryption" +# define NID_shaWithRSAEncryption 42 +# define OBJ_shaWithRSAEncryption OBJ_algorithm,15L + +# define SN_des_ede_cbc "DES-EDE-CBC" +# define LN_des_ede_cbc "des-ede-cbc" +# define NID_des_ede_cbc 43 + +# define SN_des_ede3_cbc "DES-EDE3-CBC" +# define LN_des_ede3_cbc "des-ede3-cbc" +# define NID_des_ede3_cbc 44 +# define OBJ_des_ede3_cbc OBJ_rsadsi,3L,7L + +# define SN_des_ofb64 "DES-OFB" +# define LN_des_ofb64 "des-ofb" +# define NID_des_ofb64 45 +# define OBJ_des_ofb64 OBJ_algorithm,8L + +# define SN_idea_ofb64 "IDEA-OFB" +# define LN_idea_ofb64 "idea-ofb" +# define NID_idea_ofb64 46 + +# define LN_pkcs9 "pkcs9" +# define NID_pkcs9 47 +# define OBJ_pkcs9 OBJ_pkcs,9L + +# define SN_pkcs9_emailAddress "Email" +# define LN_pkcs9_emailAddress "emailAddress" +# define NID_pkcs9_emailAddress 48 +# define OBJ_pkcs9_emailAddress OBJ_pkcs9,1L + +# define LN_pkcs9_unstructuredName "unstructuredName" +# define NID_pkcs9_unstructuredName 49 +# define OBJ_pkcs9_unstructuredName OBJ_pkcs9,2L + +# define LN_pkcs9_contentType "contentType" +# define NID_pkcs9_contentType 50 +# define OBJ_pkcs9_contentType OBJ_pkcs9,3L + +# define LN_pkcs9_messageDigest "messageDigest" +# define NID_pkcs9_messageDigest 51 +# define OBJ_pkcs9_messageDigest OBJ_pkcs9,4L + +# define LN_pkcs9_signingTime "signingTime" +# define NID_pkcs9_signingTime 52 +# define OBJ_pkcs9_signingTime OBJ_pkcs9,5L + +# define LN_pkcs9_countersignature "countersignature" +# define NID_pkcs9_countersignature 53 +# define OBJ_pkcs9_countersignature OBJ_pkcs9,6L + +# define LN_pkcs9_challengePassword "challengePassword" +# define NID_pkcs9_challengePassword 54 +# define OBJ_pkcs9_challengePassword OBJ_pkcs9,7L + +# define LN_pkcs9_unstructuredAddress "unstructuredAddress" +# define NID_pkcs9_unstructuredAddress 55 +# define OBJ_pkcs9_unstructuredAddress OBJ_pkcs9,8L + +# define LN_pkcs9_extCertAttributes "extendedCertificateAttributes" +# define NID_pkcs9_extCertAttributes 56 +# define OBJ_pkcs9_extCertAttributes OBJ_pkcs9,9L + +# define SN_netscape "Netscape" +# define LN_netscape "Netscape Communications Corp." +# define NID_netscape 57 +# define OBJ_netscape 2L,16L,840L,1L,113730L + +# define SN_netscape_cert_extension "nsCertExt" +# define LN_netscape_cert_extension "Netscape Certificate Extension" +# define NID_netscape_cert_extension 58 +# define OBJ_netscape_cert_extension OBJ_netscape,1L + +# define SN_netscape_data_type "nsDataType" +# define LN_netscape_data_type "Netscape Data Type" +# define NID_netscape_data_type 59 +# define OBJ_netscape_data_type OBJ_netscape,2L + +# define SN_des_ede_cfb64 "DES-EDE-CFB" +# define LN_des_ede_cfb64 "des-ede-cfb" +# define NID_des_ede_cfb64 60 + +# define SN_des_ede3_cfb64 "DES-EDE3-CFB" +# define LN_des_ede3_cfb64 "des-ede3-cfb" +# define NID_des_ede3_cfb64 61 + +# define SN_des_ede_ofb64 "DES-EDE-OFB" +# define LN_des_ede_ofb64 "des-ede-ofb" +# define NID_des_ede_ofb64 62 + +# define SN_des_ede3_ofb64 "DES-EDE3-OFB" +# define LN_des_ede3_ofb64 "des-ede3-ofb" +# define NID_des_ede3_ofb64 63 + +/* I'm not sure about the object ID */ +# define SN_sha1 "SHA1" +# define LN_sha1 "sha1" +# define NID_sha1 64 +# define OBJ_sha1 OBJ_algorithm,26L +/* 28 Jun 1996 - eay */ +/* #define OBJ_sha1 1L,3L,14L,2L,26L,05L <- wrong */ + +# define SN_sha1WithRSAEncryption "RSA-SHA1" +# define LN_sha1WithRSAEncryption "sha1WithRSAEncryption" +# define NID_sha1WithRSAEncryption 65 +# define OBJ_sha1WithRSAEncryption OBJ_pkcs,1L,5L + +# define SN_dsaWithSHA "DSA-SHA" +# define LN_dsaWithSHA "dsaWithSHA" +# define NID_dsaWithSHA 66 +# define OBJ_dsaWithSHA OBJ_algorithm,13L + +# define SN_dsa_2 "DSA-old" +# define LN_dsa_2 "dsaEncryption-old" +# define NID_dsa_2 67 +# define OBJ_dsa_2 OBJ_algorithm,12L + +/* proposed by microsoft to RSA */ +# define SN_pbeWithSHA1AndRC2_CBC "PBE-SHA1-RC2-64" +# define LN_pbeWithSHA1AndRC2_CBC "pbeWithSHA1AndRC2-CBC" +# define NID_pbeWithSHA1AndRC2_CBC 68 +# define OBJ_pbeWithSHA1AndRC2_CBC OBJ_pkcs,5L,11L + +/* + * proposed by microsoft to RSA as pbeWithSHA1AndRC4: it is now defined + * explicitly in PKCS#5 v2.0 as id-PBKDF2 which is something completely + * different. + */ +# define LN_id_pbkdf2 "PBKDF2" +# define NID_id_pbkdf2 69 +# define OBJ_id_pbkdf2 OBJ_pkcs,5L,12L + +# define SN_dsaWithSHA1_2 "DSA-SHA1-old" +# define LN_dsaWithSHA1_2 "dsaWithSHA1-old" +# define NID_dsaWithSHA1_2 70 +/* Got this one from 'sdn706r20.pdf' which is actually an NSA document :-) */ +# define OBJ_dsaWithSHA1_2 OBJ_algorithm,27L + +# define SN_netscape_cert_type "nsCertType" +# define LN_netscape_cert_type "Netscape Cert Type" +# define NID_netscape_cert_type 71 +# define OBJ_netscape_cert_type OBJ_netscape_cert_extension,1L + +# define SN_netscape_base_url "nsBaseUrl" +# define LN_netscape_base_url "Netscape Base Url" +# define NID_netscape_base_url 72 +# define OBJ_netscape_base_url OBJ_netscape_cert_extension,2L + +# define SN_netscape_revocation_url "nsRevocationUrl" +# define LN_netscape_revocation_url "Netscape Revocation Url" +# define NID_netscape_revocation_url 73 +# define OBJ_netscape_revocation_url OBJ_netscape_cert_extension,3L + +# define SN_netscape_ca_revocation_url "nsCaRevocationUrl" +# define LN_netscape_ca_revocation_url "Netscape CA Revocation Url" +# define NID_netscape_ca_revocation_url 74 +# define OBJ_netscape_ca_revocation_url OBJ_netscape_cert_extension,4L + +# define SN_netscape_renewal_url "nsRenewalUrl" +# define LN_netscape_renewal_url "Netscape Renewal Url" +# define NID_netscape_renewal_url 75 +# define OBJ_netscape_renewal_url OBJ_netscape_cert_extension,7L + +# define SN_netscape_ca_policy_url "nsCaPolicyUrl" +# define LN_netscape_ca_policy_url "Netscape CA Policy Url" +# define NID_netscape_ca_policy_url 76 +# define OBJ_netscape_ca_policy_url OBJ_netscape_cert_extension,8L + +# define SN_netscape_ssl_server_name "nsSslServerName" +# define LN_netscape_ssl_server_name "Netscape SSL Server Name" +# define NID_netscape_ssl_server_name 77 +# define OBJ_netscape_ssl_server_name OBJ_netscape_cert_extension,12L + +# define SN_netscape_comment "nsComment" +# define LN_netscape_comment "Netscape Comment" +# define NID_netscape_comment 78 +# define OBJ_netscape_comment OBJ_netscape_cert_extension,13L + +# define SN_netscape_cert_sequence "nsCertSequence" +# define LN_netscape_cert_sequence "Netscape Certificate Sequence" +# define NID_netscape_cert_sequence 79 +# define OBJ_netscape_cert_sequence OBJ_netscape_data_type,5L + +# define SN_desx_cbc "DESX-CBC" +# define LN_desx_cbc "desx-cbc" +# define NID_desx_cbc 80 + +# define SN_id_ce "id-ce" +# define NID_id_ce 81 +# define OBJ_id_ce 2L,5L,29L + +# define SN_subject_key_identifier "subjectKeyIdentifier" +# define LN_subject_key_identifier "X509v3 Subject Key Identifier" +# define NID_subject_key_identifier 82 +# define OBJ_subject_key_identifier OBJ_id_ce,14L + +# define SN_key_usage "keyUsage" +# define LN_key_usage "X509v3 Key Usage" +# define NID_key_usage 83 +# define OBJ_key_usage OBJ_id_ce,15L + +# define SN_private_key_usage_period "privateKeyUsagePeriod" +# define LN_private_key_usage_period "X509v3 Private Key Usage Period" +# define NID_private_key_usage_period 84 +# define OBJ_private_key_usage_period OBJ_id_ce,16L + +# define SN_subject_alt_name "subjectAltName" +# define LN_subject_alt_name "X509v3 Subject Alternative Name" +# define NID_subject_alt_name 85 +# define OBJ_subject_alt_name OBJ_id_ce,17L + +# define SN_issuer_alt_name "issuerAltName" +# define LN_issuer_alt_name "X509v3 Issuer Alternative Name" +# define NID_issuer_alt_name 86 +# define OBJ_issuer_alt_name OBJ_id_ce,18L + +# define SN_basic_constraints "basicConstraints" +# define LN_basic_constraints "X509v3 Basic Constraints" +# define NID_basic_constraints 87 +# define OBJ_basic_constraints OBJ_id_ce,19L + +# define SN_crl_number "crlNumber" +# define LN_crl_number "X509v3 CRL Number" +# define NID_crl_number 88 +# define OBJ_crl_number OBJ_id_ce,20L + +# define SN_certificate_policies "certificatePolicies" +# define LN_certificate_policies "X509v3 Certificate Policies" +# define NID_certificate_policies 89 +# define OBJ_certificate_policies OBJ_id_ce,32L + +# define SN_authority_key_identifier "authorityKeyIdentifier" +# define LN_authority_key_identifier "X509v3 Authority Key Identifier" +# define NID_authority_key_identifier 90 +# define OBJ_authority_key_identifier OBJ_id_ce,35L + +# define SN_bf_cbc "BF-CBC" +# define LN_bf_cbc "bf-cbc" +# define NID_bf_cbc 91 +# define OBJ_bf_cbc 1L,3L,6L,1L,4L,1L,3029L,1L,2L + +# define SN_bf_ecb "BF-ECB" +# define LN_bf_ecb "bf-ecb" +# define NID_bf_ecb 92 + +# define SN_bf_cfb64 "BF-CFB" +# define LN_bf_cfb64 "bf-cfb" +# define NID_bf_cfb64 93 + +# define SN_bf_ofb64 "BF-OFB" +# define LN_bf_ofb64 "bf-ofb" +# define NID_bf_ofb64 94 + +# define SN_mdc2 "MDC2" +# define LN_mdc2 "mdc2" +# define NID_mdc2 95 +# define OBJ_mdc2 2L,5L,8L,3L,101L +/* An alternative? 1L,3L,14L,3L,2L,19L */ + +# define SN_mdc2WithRSA "RSA-MDC2" +# define LN_mdc2WithRSA "mdc2withRSA" +# define NID_mdc2WithRSA 96 +# define OBJ_mdc2WithRSA 2L,5L,8L,3L,100L + +# define SN_rc4_40 "RC4-40" +# define LN_rc4_40 "rc4-40" +# define NID_rc4_40 97 + +# define SN_rc2_40_cbc "RC2-40-CBC" +# define LN_rc2_40_cbc "rc2-40-cbc" +# define NID_rc2_40_cbc 98 + +# define SN_givenName "G" +# define LN_givenName "givenName" +# define NID_givenName 99 +# define OBJ_givenName OBJ_X509,42L + +# define SN_surname "S" +# define LN_surname "surname" +# define NID_surname 100 +# define OBJ_surname OBJ_X509,4L + +# define SN_initials "I" +# define LN_initials "initials" +# define NID_initials 101 +# define OBJ_initials OBJ_X509,43L + +# define SN_uniqueIdentifier "UID" +# define LN_uniqueIdentifier "uniqueIdentifier" +# define NID_uniqueIdentifier 102 +# define OBJ_uniqueIdentifier OBJ_X509,45L + +# define SN_crl_distribution_points "crlDistributionPoints" +# define LN_crl_distribution_points "X509v3 CRL Distribution Points" +# define NID_crl_distribution_points 103 +# define OBJ_crl_distribution_points OBJ_id_ce,31L + +# define SN_md5WithRSA "RSA-NP-MD5" +# define LN_md5WithRSA "md5WithRSA" +# define NID_md5WithRSA 104 +# define OBJ_md5WithRSA OBJ_algorithm,3L + +# define SN_serialNumber "SN" +# define LN_serialNumber "serialNumber" +# define NID_serialNumber 105 +# define OBJ_serialNumber OBJ_X509,5L + +# define SN_title "T" +# define LN_title "title" +# define NID_title 106 +# define OBJ_title OBJ_X509,12L + +# define SN_description "D" +# define LN_description "description" +# define NID_description 107 +# define OBJ_description OBJ_X509,13L + +/* CAST5 is CAST-128, I'm just sticking with the documentation */ +# define SN_cast5_cbc "CAST5-CBC" +# define LN_cast5_cbc "cast5-cbc" +# define NID_cast5_cbc 108 +# define OBJ_cast5_cbc 1L,2L,840L,113533L,7L,66L,10L + +# define SN_cast5_ecb "CAST5-ECB" +# define LN_cast5_ecb "cast5-ecb" +# define NID_cast5_ecb 109 + +# define SN_cast5_cfb64 "CAST5-CFB" +# define LN_cast5_cfb64 "cast5-cfb" +# define NID_cast5_cfb64 110 + +# define SN_cast5_ofb64 "CAST5-OFB" +# define LN_cast5_ofb64 "cast5-ofb" +# define NID_cast5_ofb64 111 + +# define LN_pbeWithMD5AndCast5_CBC "pbeWithMD5AndCast5CBC" +# define NID_pbeWithMD5AndCast5_CBC 112 +# define OBJ_pbeWithMD5AndCast5_CBC 1L,2L,840L,113533L,7L,66L,12L + +/*- + * This is one sun will soon be using :-( + * id-dsa-with-sha1 ID ::= { + * iso(1) member-body(2) us(840) x9-57 (10040) x9cm(4) 3 } + */ +# define SN_dsaWithSHA1 "DSA-SHA1" +# define LN_dsaWithSHA1 "dsaWithSHA1" +# define NID_dsaWithSHA1 113 +# define OBJ_dsaWithSHA1 1L,2L,840L,10040L,4L,3L + +# define NID_md5_sha1 114 +# define SN_md5_sha1 "MD5-SHA1" +# define LN_md5_sha1 "md5-sha1" + +# define SN_sha1WithRSA "RSA-SHA1-2" +# define LN_sha1WithRSA "sha1WithRSA" +# define NID_sha1WithRSA 115 +# define OBJ_sha1WithRSA OBJ_algorithm,29L + +# define SN_dsa "DSA" +# define LN_dsa "dsaEncryption" +# define NID_dsa 116 +# define OBJ_dsa 1L,2L,840L,10040L,4L,1L + +# define SN_ripemd160 "RIPEMD160" +# define LN_ripemd160 "ripemd160" +# define NID_ripemd160 117 +# define OBJ_ripemd160 1L,3L,36L,3L,2L,1L + +/* + * The name should actually be rsaSignatureWithripemd160, but I'm going to + * continue using the convention I'm using with the other ciphers + */ +# define SN_ripemd160WithRSA "RSA-RIPEMD160" +# define LN_ripemd160WithRSA "ripemd160WithRSA" +# define NID_ripemd160WithRSA 119 +# define OBJ_ripemd160WithRSA 1L,3L,36L,3L,3L,1L,2L + +/*- + * Taken from rfc2040 + * RC5_CBC_Parameters ::= SEQUENCE { + * version INTEGER (v1_0(16)), + * rounds INTEGER (8..127), + * blockSizeInBits INTEGER (64, 128), + * iv OCTET STRING OPTIONAL + * } + */ +# define SN_rc5_cbc "RC5-CBC" +# define LN_rc5_cbc "rc5-cbc" +# define NID_rc5_cbc 120 +# define OBJ_rc5_cbc OBJ_rsadsi,3L,8L + +# define SN_rc5_ecb "RC5-ECB" +# define LN_rc5_ecb "rc5-ecb" +# define NID_rc5_ecb 121 + +# define SN_rc5_cfb64 "RC5-CFB" +# define LN_rc5_cfb64 "rc5-cfb" +# define NID_rc5_cfb64 122 + +# define SN_rc5_ofb64 "RC5-OFB" +# define LN_rc5_ofb64 "rc5-ofb" +# define NID_rc5_ofb64 123 + +# define SN_rle_compression "RLE" +# define LN_rle_compression "run length compression" +# define NID_rle_compression 124 +# define OBJ_rle_compression 1L,1L,1L,1L,666L,1L + +# define SN_zlib_compression "ZLIB" +# define LN_zlib_compression "zlib compression" +# define NID_zlib_compression 125 +# define OBJ_zlib_compression 1L,1L,1L,1L,666L,2L + +# define SN_ext_key_usage "extendedKeyUsage" +# define LN_ext_key_usage "X509v3 Extended Key Usage" +# define NID_ext_key_usage 126 +# define OBJ_ext_key_usage OBJ_id_ce,37 + +# define SN_id_pkix "PKIX" +# define NID_id_pkix 127 +# define OBJ_id_pkix 1L,3L,6L,1L,5L,5L,7L + +# define SN_id_kp "id-kp" +# define NID_id_kp 128 +# define OBJ_id_kp OBJ_id_pkix,3L + +/* PKIX extended key usage OIDs */ + +# define SN_server_auth "serverAuth" +# define LN_server_auth "TLS Web Server Authentication" +# define NID_server_auth 129 +# define OBJ_server_auth OBJ_id_kp,1L + +# define SN_client_auth "clientAuth" +# define LN_client_auth "TLS Web Client Authentication" +# define NID_client_auth 130 +# define OBJ_client_auth OBJ_id_kp,2L + +# define SN_code_sign "codeSigning" +# define LN_code_sign "Code Signing" +# define NID_code_sign 131 +# define OBJ_code_sign OBJ_id_kp,3L + +# define SN_email_protect "emailProtection" +# define LN_email_protect "E-mail Protection" +# define NID_email_protect 132 +# define OBJ_email_protect OBJ_id_kp,4L + +# define SN_time_stamp "timeStamping" +# define LN_time_stamp "Time Stamping" +# define NID_time_stamp 133 +# define OBJ_time_stamp OBJ_id_kp,8L + +/* Additional extended key usage OIDs: Microsoft */ + +# define SN_ms_code_ind "msCodeInd" +# define LN_ms_code_ind "Microsoft Individual Code Signing" +# define NID_ms_code_ind 134 +# define OBJ_ms_code_ind 1L,3L,6L,1L,4L,1L,311L,2L,1L,21L + +# define SN_ms_code_com "msCodeCom" +# define LN_ms_code_com "Microsoft Commercial Code Signing" +# define NID_ms_code_com 135 +# define OBJ_ms_code_com 1L,3L,6L,1L,4L,1L,311L,2L,1L,22L + +# define SN_ms_ctl_sign "msCTLSign" +# define LN_ms_ctl_sign "Microsoft Trust List Signing" +# define NID_ms_ctl_sign 136 +# define OBJ_ms_ctl_sign 1L,3L,6L,1L,4L,1L,311L,10L,3L,1L + +# define SN_ms_sgc "msSGC" +# define LN_ms_sgc "Microsoft Server Gated Crypto" +# define NID_ms_sgc 137 +# define OBJ_ms_sgc 1L,3L,6L,1L,4L,1L,311L,10L,3L,3L + +# define SN_ms_efs "msEFS" +# define LN_ms_efs "Microsoft Encrypted File System" +# define NID_ms_efs 138 +# define OBJ_ms_efs 1L,3L,6L,1L,4L,1L,311L,10L,3L,4L + +/* Additional usage: Netscape */ + +# define SN_ns_sgc "nsSGC" +# define LN_ns_sgc "Netscape Server Gated Crypto" +# define NID_ns_sgc 139 +# define OBJ_ns_sgc OBJ_netscape,4L,1L + +# define SN_delta_crl "deltaCRL" +# define LN_delta_crl "X509v3 Delta CRL Indicator" +# define NID_delta_crl 140 +# define OBJ_delta_crl OBJ_id_ce,27L + +# define SN_crl_reason "CRLReason" +# define LN_crl_reason "CRL Reason Code" +# define NID_crl_reason 141 +# define OBJ_crl_reason OBJ_id_ce,21L + +# define SN_invalidity_date "invalidityDate" +# define LN_invalidity_date "Invalidity Date" +# define NID_invalidity_date 142 +# define OBJ_invalidity_date OBJ_id_ce,24L + +# define SN_sxnet "SXNetID" +# define LN_sxnet "Strong Extranet ID" +# define NID_sxnet 143 +# define OBJ_sxnet 1L,3L,101L,1L,4L,1L + +/* PKCS12 and related OBJECT IDENTIFIERS */ + +# define OBJ_pkcs12 OBJ_pkcs,12L +# define OBJ_pkcs12_pbeids OBJ_pkcs12, 1 + +# define SN_pbe_WithSHA1And128BitRC4 "PBE-SHA1-RC4-128" +# define LN_pbe_WithSHA1And128BitRC4 "pbeWithSHA1And128BitRC4" +# define NID_pbe_WithSHA1And128BitRC4 144 +# define OBJ_pbe_WithSHA1And128BitRC4 OBJ_pkcs12_pbeids, 1L + +# define SN_pbe_WithSHA1And40BitRC4 "PBE-SHA1-RC4-40" +# define LN_pbe_WithSHA1And40BitRC4 "pbeWithSHA1And40BitRC4" +# define NID_pbe_WithSHA1And40BitRC4 145 +# define OBJ_pbe_WithSHA1And40BitRC4 OBJ_pkcs12_pbeids, 2L + +# define SN_pbe_WithSHA1And3_Key_TripleDES_CBC "PBE-SHA1-3DES" +# define LN_pbe_WithSHA1And3_Key_TripleDES_CBC "pbeWithSHA1And3-KeyTripleDES-CBC" +# define NID_pbe_WithSHA1And3_Key_TripleDES_CBC 146 +# define OBJ_pbe_WithSHA1And3_Key_TripleDES_CBC OBJ_pkcs12_pbeids, 3L + +# define SN_pbe_WithSHA1And2_Key_TripleDES_CBC "PBE-SHA1-2DES" +# define LN_pbe_WithSHA1And2_Key_TripleDES_CBC "pbeWithSHA1And2-KeyTripleDES-CBC" +# define NID_pbe_WithSHA1And2_Key_TripleDES_CBC 147 +# define OBJ_pbe_WithSHA1And2_Key_TripleDES_CBC OBJ_pkcs12_pbeids, 4L + +# define SN_pbe_WithSHA1And128BitRC2_CBC "PBE-SHA1-RC2-128" +# define LN_pbe_WithSHA1And128BitRC2_CBC "pbeWithSHA1And128BitRC2-CBC" +# define NID_pbe_WithSHA1And128BitRC2_CBC 148 +# define OBJ_pbe_WithSHA1And128BitRC2_CBC OBJ_pkcs12_pbeids, 5L + +# define SN_pbe_WithSHA1And40BitRC2_CBC "PBE-SHA1-RC2-40" +# define LN_pbe_WithSHA1And40BitRC2_CBC "pbeWithSHA1And40BitRC2-CBC" +# define NID_pbe_WithSHA1And40BitRC2_CBC 149 +# define OBJ_pbe_WithSHA1And40BitRC2_CBC OBJ_pkcs12_pbeids, 6L + +# define OBJ_pkcs12_Version1 OBJ_pkcs12, 10L + +# define OBJ_pkcs12_BagIds OBJ_pkcs12_Version1, 1L + +# define LN_keyBag "keyBag" +# define NID_keyBag 150 +# define OBJ_keyBag OBJ_pkcs12_BagIds, 1L + +# define LN_pkcs8ShroudedKeyBag "pkcs8ShroudedKeyBag" +# define NID_pkcs8ShroudedKeyBag 151 +# define OBJ_pkcs8ShroudedKeyBag OBJ_pkcs12_BagIds, 2L + +# define LN_certBag "certBag" +# define NID_certBag 152 +# define OBJ_certBag OBJ_pkcs12_BagIds, 3L + +# define LN_crlBag "crlBag" +# define NID_crlBag 153 +# define OBJ_crlBag OBJ_pkcs12_BagIds, 4L + +# define LN_secretBag "secretBag" +# define NID_secretBag 154 +# define OBJ_secretBag OBJ_pkcs12_BagIds, 5L + +# define LN_safeContentsBag "safeContentsBag" +# define NID_safeContentsBag 155 +# define OBJ_safeContentsBag OBJ_pkcs12_BagIds, 6L + +# define LN_friendlyName "friendlyName" +# define NID_friendlyName 156 +# define OBJ_friendlyName OBJ_pkcs9, 20L + +# define LN_localKeyID "localKeyID" +# define NID_localKeyID 157 +# define OBJ_localKeyID OBJ_pkcs9, 21L + +# define OBJ_certTypes OBJ_pkcs9, 22L + +# define LN_x509Certificate "x509Certificate" +# define NID_x509Certificate 158 +# define OBJ_x509Certificate OBJ_certTypes, 1L + +# define LN_sdsiCertificate "sdsiCertificate" +# define NID_sdsiCertificate 159 +# define OBJ_sdsiCertificate OBJ_certTypes, 2L + +# define OBJ_crlTypes OBJ_pkcs9, 23L + +# define LN_x509Crl "x509Crl" +# define NID_x509Crl 160 +# define OBJ_x509Crl OBJ_crlTypes, 1L + +/* PKCS#5 v2 OIDs */ + +# define LN_pbes2 "PBES2" +# define NID_pbes2 161 +# define OBJ_pbes2 OBJ_pkcs,5L,13L + +# define LN_pbmac1 "PBMAC1" +# define NID_pbmac1 162 +# define OBJ_pbmac1 OBJ_pkcs,5L,14L + +# define LN_hmacWithSHA1 "hmacWithSHA1" +# define NID_hmacWithSHA1 163 +# define OBJ_hmacWithSHA1 OBJ_rsadsi,2L,7L + +/* Policy Qualifier Ids */ + +# define LN_id_qt_cps "Policy Qualifier CPS" +# define SN_id_qt_cps "id-qt-cps" +# define NID_id_qt_cps 164 +# define OBJ_id_qt_cps OBJ_id_pkix,2L,1L + +# define LN_id_qt_unotice "Policy Qualifier User Notice" +# define SN_id_qt_unotice "id-qt-unotice" +# define NID_id_qt_unotice 165 +# define OBJ_id_qt_unotice OBJ_id_pkix,2L,2L + +# define SN_rc2_64_cbc "RC2-64-CBC" +# define LN_rc2_64_cbc "rc2-64-cbc" +# define NID_rc2_64_cbc 166 + +# define SN_SMIMECapabilities "SMIME-CAPS" +# define LN_SMIMECapabilities "S/MIME Capabilities" +# define NID_SMIMECapabilities 167 +# define OBJ_SMIMECapabilities OBJ_pkcs9,15L + +# define SN_pbeWithMD2AndRC2_CBC "PBE-MD2-RC2-64" +# define LN_pbeWithMD2AndRC2_CBC "pbeWithMD2AndRC2-CBC" +# define NID_pbeWithMD2AndRC2_CBC 168 +# define OBJ_pbeWithMD2AndRC2_CBC OBJ_pkcs,5L,4L + +# define SN_pbeWithMD5AndRC2_CBC "PBE-MD5-RC2-64" +# define LN_pbeWithMD5AndRC2_CBC "pbeWithMD5AndRC2-CBC" +# define NID_pbeWithMD5AndRC2_CBC 169 +# define OBJ_pbeWithMD5AndRC2_CBC OBJ_pkcs,5L,6L + +# define SN_pbeWithSHA1AndDES_CBC "PBE-SHA1-DES" +# define LN_pbeWithSHA1AndDES_CBC "pbeWithSHA1AndDES-CBC" +# define NID_pbeWithSHA1AndDES_CBC 170 +# define OBJ_pbeWithSHA1AndDES_CBC OBJ_pkcs,5L,10L + +/* Extension request OIDs */ + +# define LN_ms_ext_req "Microsoft Extension Request" +# define SN_ms_ext_req "msExtReq" +# define NID_ms_ext_req 171 +# define OBJ_ms_ext_req 1L,3L,6L,1L,4L,1L,311L,2L,1L,14L + +# define LN_ext_req "Extension Request" +# define SN_ext_req "extReq" +# define NID_ext_req 172 +# define OBJ_ext_req OBJ_pkcs9,14L + +# define SN_name "name" +# define LN_name "name" +# define NID_name 173 +# define OBJ_name OBJ_X509,41L + +# define SN_dnQualifier "dnQualifier" +# define LN_dnQualifier "dnQualifier" +# define NID_dnQualifier 174 +# define OBJ_dnQualifier OBJ_X509,46L + +# define SN_id_pe "id-pe" +# define NID_id_pe 175 +# define OBJ_id_pe OBJ_id_pkix,1L + +# define SN_id_ad "id-ad" +# define NID_id_ad 176 +# define OBJ_id_ad OBJ_id_pkix,48L + +# define SN_info_access "authorityInfoAccess" +# define LN_info_access "Authority Information Access" +# define NID_info_access 177 +# define OBJ_info_access OBJ_id_pe,1L + +# define SN_ad_OCSP "OCSP" +# define LN_ad_OCSP "OCSP" +# define NID_ad_OCSP 178 +# define OBJ_ad_OCSP OBJ_id_ad,1L + +# define SN_ad_ca_issuers "caIssuers" +# define LN_ad_ca_issuers "CA Issuers" +# define NID_ad_ca_issuers 179 +# define OBJ_ad_ca_issuers OBJ_id_ad,2L + +# define SN_OCSP_sign "OCSPSigning" +# define LN_OCSP_sign "OCSP Signing" +# define NID_OCSP_sign 180 +# define OBJ_OCSP_sign OBJ_id_kp,9L +# endif /* USE_OBJ_MAC */ + +# include +# include + +# define OBJ_NAME_TYPE_UNDEF 0x00 +# define OBJ_NAME_TYPE_MD_METH 0x01 +# define OBJ_NAME_TYPE_CIPHER_METH 0x02 +# define OBJ_NAME_TYPE_PKEY_METH 0x03 +# define OBJ_NAME_TYPE_COMP_METH 0x04 +# define OBJ_NAME_TYPE_NUM 0x05 + +# define OBJ_NAME_ALIAS 0x8000 + +# define OBJ_BSEARCH_VALUE_ON_NOMATCH 0x01 +# define OBJ_BSEARCH_FIRST_VALUE_ON_MATCH 0x02 + + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct obj_name_st { + int type; + int alias; + const char *name; + const char *data; +} OBJ_NAME; + +# define OBJ_create_and_add_object(a,b,c) OBJ_create(a,b,c) + +int OBJ_NAME_init(void); +int OBJ_NAME_new_index(unsigned long (*hash_func) (const char *), + int (*cmp_func) (const char *, const char *), + void (*free_func) (const char *, int, const char *)); +const char *OBJ_NAME_get(const char *name, int type); +int OBJ_NAME_add(const char *name, int type, const char *data); +int OBJ_NAME_remove(const char *name, int type); +void OBJ_NAME_cleanup(int type); /* -1 for everything */ +void OBJ_NAME_do_all(int type, void (*fn) (const OBJ_NAME *, void *arg), + void *arg); +void OBJ_NAME_do_all_sorted(int type, + void (*fn) (const OBJ_NAME *, void *arg), + void *arg); + +ASN1_OBJECT *OBJ_dup(const ASN1_OBJECT *o); +ASN1_OBJECT *OBJ_nid2obj(int n); +const char *OBJ_nid2ln(int n); +const char *OBJ_nid2sn(int n); +int OBJ_obj2nid(const ASN1_OBJECT *o); +ASN1_OBJECT *OBJ_txt2obj(const char *s, int no_name); +int OBJ_obj2txt(char *buf, int buf_len, const ASN1_OBJECT *a, int no_name); +int OBJ_txt2nid(const char *s); +int OBJ_ln2nid(const char *s); +int OBJ_sn2nid(const char *s); +int OBJ_cmp(const ASN1_OBJECT *a, const ASN1_OBJECT *b); +const void *OBJ_bsearch_(const void *key, const void *base, int num, int size, + int (*cmp) (const void *, const void *)); +const void *OBJ_bsearch_ex_(const void *key, const void *base, int num, + int size, + int (*cmp) (const void *, const void *), + int flags); + +# define _DECLARE_OBJ_BSEARCH_CMP_FN(scope, type1, type2, nm) \ + static int nm##_cmp_BSEARCH_CMP_FN(const void *, const void *); \ + static int nm##_cmp(type1 const *, type2 const *); \ + scope type2 * OBJ_bsearch_##nm(type1 *key, type2 const *base, int num) + +# define DECLARE_OBJ_BSEARCH_CMP_FN(type1, type2, cmp) \ + _DECLARE_OBJ_BSEARCH_CMP_FN(static, type1, type2, cmp) +# define DECLARE_OBJ_BSEARCH_GLOBAL_CMP_FN(type1, type2, nm) \ + type2 * OBJ_bsearch_##nm(type1 *key, type2 const *base, int num) + +/*- + * Unsolved problem: if a type is actually a pointer type, like + * nid_triple is, then its impossible to get a const where you need + * it. Consider: + * + * typedef int nid_triple[3]; + * const void *a_; + * const nid_triple const *a = a_; + * + * The assignement discards a const because what you really want is: + * + * const int const * const *a = a_; + * + * But if you do that, you lose the fact that a is an array of 3 ints, + * which breaks comparison functions. + * + * Thus we end up having to cast, sadly, or unpack the + * declarations. Or, as I finally did in this case, delcare nid_triple + * to be a struct, which it should have been in the first place. + * + * Ben, August 2008. + * + * Also, strictly speaking not all types need be const, but handling + * the non-constness means a lot of complication, and in practice + * comparison routines do always not touch their arguments. + */ + +# define IMPLEMENT_OBJ_BSEARCH_CMP_FN(type1, type2, nm) \ + static int nm##_cmp_BSEARCH_CMP_FN(const void *a_, const void *b_) \ + { \ + type1 const *a = a_; \ + type2 const *b = b_; \ + return nm##_cmp(a,b); \ + } \ + static type2 *OBJ_bsearch_##nm(type1 *key, type2 const *base, int num) \ + { \ + return (type2 *)OBJ_bsearch_(key, base, num, sizeof(type2), \ + nm##_cmp_BSEARCH_CMP_FN); \ + } \ + extern void dummy_prototype(void) + +# define IMPLEMENT_OBJ_BSEARCH_GLOBAL_CMP_FN(type1, type2, nm) \ + static int nm##_cmp_BSEARCH_CMP_FN(const void *a_, const void *b_) \ + { \ + type1 const *a = a_; \ + type2 const *b = b_; \ + return nm##_cmp(a,b); \ + } \ + type2 *OBJ_bsearch_##nm(type1 *key, type2 const *base, int num) \ + { \ + return (type2 *)OBJ_bsearch_(key, base, num, sizeof(type2), \ + nm##_cmp_BSEARCH_CMP_FN); \ + } \ + extern void dummy_prototype(void) + +# define OBJ_bsearch(type1,key,type2,base,num,cmp) \ + ((type2 *)OBJ_bsearch_(CHECKED_PTR_OF(type1,key),CHECKED_PTR_OF(type2,base), \ + num,sizeof(type2), \ + ((void)CHECKED_PTR_OF(type1,cmp##_type_1), \ + (void)CHECKED_PTR_OF(type2,cmp##_type_2), \ + cmp##_BSEARCH_CMP_FN))) + +# define OBJ_bsearch_ex(type1,key,type2,base,num,cmp,flags) \ + ((type2 *)OBJ_bsearch_ex_(CHECKED_PTR_OF(type1,key),CHECKED_PTR_OF(type2,base), \ + num,sizeof(type2), \ + ((void)CHECKED_PTR_OF(type1,cmp##_type_1), \ + (void)type_2=CHECKED_PTR_OF(type2,cmp##_type_2), \ + cmp##_BSEARCH_CMP_FN)),flags) + +int OBJ_new_nid(int num); +int OBJ_add_object(const ASN1_OBJECT *obj); +int OBJ_create(const char *oid, const char *sn, const char *ln); +void OBJ_cleanup(void); +int OBJ_create_objects(BIO *in); + +int OBJ_find_sigid_algs(int signid, int *pdig_nid, int *ppkey_nid); +int OBJ_find_sigid_by_algs(int *psignid, int dig_nid, int pkey_nid); +int OBJ_add_sigid(int signid, int dig_id, int pkey_id); +void OBJ_sigid_free(void); + +extern int obj_cleanup_defer; +void check_defer(int nid); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_OBJ_strings(void); + +/* Error codes for the OBJ functions. */ + +/* Function codes. */ +# define OBJ_F_OBJ_ADD_OBJECT 105 +# define OBJ_F_OBJ_CREATE 100 +# define OBJ_F_OBJ_DUP 101 +# define OBJ_F_OBJ_NAME_NEW_INDEX 106 +# define OBJ_F_OBJ_NID2LN 102 +# define OBJ_F_OBJ_NID2OBJ 103 +# define OBJ_F_OBJ_NID2SN 104 + +/* Reason codes. */ +# define OBJ_R_MALLOC_FAILURE 100 +# define OBJ_R_UNKNOWN_NID 101 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/ocsp.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/ocsp.h new file mode 100644 index 0000000..ca2ee76 --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/ocsp.h @@ -0,0 +1,637 @@ +/* ocsp.h */ +/* + * Written by Tom Titchener for the OpenSSL + * project. + */ + +/* + * History: This file was transfered to Richard Levitte from CertCo by Kathy + * Weinhold in mid-spring 2000 to be included in OpenSSL or released as a + * patch kit. + */ + +/* ==================================================================== + * Copyright (c) 1998-2000 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_OCSP_H +# define HEADER_OCSP_H + +# include +# include +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Various flags and values */ + +# define OCSP_DEFAULT_NONCE_LENGTH 16 + +# define OCSP_NOCERTS 0x1 +# define OCSP_NOINTERN 0x2 +# define OCSP_NOSIGS 0x4 +# define OCSP_NOCHAIN 0x8 +# define OCSP_NOVERIFY 0x10 +# define OCSP_NOEXPLICIT 0x20 +# define OCSP_NOCASIGN 0x40 +# define OCSP_NODELEGATED 0x80 +# define OCSP_NOCHECKS 0x100 +# define OCSP_TRUSTOTHER 0x200 +# define OCSP_RESPID_KEY 0x400 +# define OCSP_NOTIME 0x800 + +/*- CertID ::= SEQUENCE { + * hashAlgorithm AlgorithmIdentifier, + * issuerNameHash OCTET STRING, -- Hash of Issuer's DN + * issuerKeyHash OCTET STRING, -- Hash of Issuers public key (excluding the tag & length fields) + * serialNumber CertificateSerialNumber } + */ +typedef struct ocsp_cert_id_st { + X509_ALGOR *hashAlgorithm; + ASN1_OCTET_STRING *issuerNameHash; + ASN1_OCTET_STRING *issuerKeyHash; + ASN1_INTEGER *serialNumber; +} OCSP_CERTID; + +DECLARE_STACK_OF(OCSP_CERTID) + +/*- Request ::= SEQUENCE { + * reqCert CertID, + * singleRequestExtensions [0] EXPLICIT Extensions OPTIONAL } + */ +typedef struct ocsp_one_request_st { + OCSP_CERTID *reqCert; + STACK_OF(X509_EXTENSION) *singleRequestExtensions; +} OCSP_ONEREQ; + +DECLARE_STACK_OF(OCSP_ONEREQ) +DECLARE_ASN1_SET_OF(OCSP_ONEREQ) + +/*- TBSRequest ::= SEQUENCE { + * version [0] EXPLICIT Version DEFAULT v1, + * requestorName [1] EXPLICIT GeneralName OPTIONAL, + * requestList SEQUENCE OF Request, + * requestExtensions [2] EXPLICIT Extensions OPTIONAL } + */ +typedef struct ocsp_req_info_st { + ASN1_INTEGER *version; + GENERAL_NAME *requestorName; + STACK_OF(OCSP_ONEREQ) *requestList; + STACK_OF(X509_EXTENSION) *requestExtensions; +} OCSP_REQINFO; + +/*- Signature ::= SEQUENCE { + * signatureAlgorithm AlgorithmIdentifier, + * signature BIT STRING, + * certs [0] EXPLICIT SEQUENCE OF Certificate OPTIONAL } + */ +typedef struct ocsp_signature_st { + X509_ALGOR *signatureAlgorithm; + ASN1_BIT_STRING *signature; + STACK_OF(X509) *certs; +} OCSP_SIGNATURE; + +/*- OCSPRequest ::= SEQUENCE { + * tbsRequest TBSRequest, + * optionalSignature [0] EXPLICIT Signature OPTIONAL } + */ +typedef struct ocsp_request_st { + OCSP_REQINFO *tbsRequest; + OCSP_SIGNATURE *optionalSignature; /* OPTIONAL */ +} OCSP_REQUEST; + +/*- OCSPResponseStatus ::= ENUMERATED { + * successful (0), --Response has valid confirmations + * malformedRequest (1), --Illegal confirmation request + * internalError (2), --Internal error in issuer + * tryLater (3), --Try again later + * --(4) is not used + * sigRequired (5), --Must sign the request + * unauthorized (6) --Request unauthorized + * } + */ +# define OCSP_RESPONSE_STATUS_SUCCESSFUL 0 +# define OCSP_RESPONSE_STATUS_MALFORMEDREQUEST 1 +# define OCSP_RESPONSE_STATUS_INTERNALERROR 2 +# define OCSP_RESPONSE_STATUS_TRYLATER 3 +# define OCSP_RESPONSE_STATUS_SIGREQUIRED 5 +# define OCSP_RESPONSE_STATUS_UNAUTHORIZED 6 + +/*- ResponseBytes ::= SEQUENCE { + * responseType OBJECT IDENTIFIER, + * response OCTET STRING } + */ +typedef struct ocsp_resp_bytes_st { + ASN1_OBJECT *responseType; + ASN1_OCTET_STRING *response; +} OCSP_RESPBYTES; + +/*- OCSPResponse ::= SEQUENCE { + * responseStatus OCSPResponseStatus, + * responseBytes [0] EXPLICIT ResponseBytes OPTIONAL } + */ +struct ocsp_response_st { + ASN1_ENUMERATED *responseStatus; + OCSP_RESPBYTES *responseBytes; +}; + +/*- ResponderID ::= CHOICE { + * byName [1] Name, + * byKey [2] KeyHash } + */ +# define V_OCSP_RESPID_NAME 0 +# define V_OCSP_RESPID_KEY 1 +struct ocsp_responder_id_st { + int type; + union { + X509_NAME *byName; + ASN1_OCTET_STRING *byKey; + } value; +}; + +DECLARE_STACK_OF(OCSP_RESPID) +DECLARE_ASN1_FUNCTIONS(OCSP_RESPID) + +/*- KeyHash ::= OCTET STRING --SHA-1 hash of responder's public key + * --(excluding the tag and length fields) + */ + +/*- RevokedInfo ::= SEQUENCE { + * revocationTime GeneralizedTime, + * revocationReason [0] EXPLICIT CRLReason OPTIONAL } + */ +typedef struct ocsp_revoked_info_st { + ASN1_GENERALIZEDTIME *revocationTime; + ASN1_ENUMERATED *revocationReason; +} OCSP_REVOKEDINFO; + +/*- CertStatus ::= CHOICE { + * good [0] IMPLICIT NULL, + * revoked [1] IMPLICIT RevokedInfo, + * unknown [2] IMPLICIT UnknownInfo } + */ +# define V_OCSP_CERTSTATUS_GOOD 0 +# define V_OCSP_CERTSTATUS_REVOKED 1 +# define V_OCSP_CERTSTATUS_UNKNOWN 2 +typedef struct ocsp_cert_status_st { + int type; + union { + ASN1_NULL *good; + OCSP_REVOKEDINFO *revoked; + ASN1_NULL *unknown; + } value; +} OCSP_CERTSTATUS; + +/*- SingleResponse ::= SEQUENCE { + * certID CertID, + * certStatus CertStatus, + * thisUpdate GeneralizedTime, + * nextUpdate [0] EXPLICIT GeneralizedTime OPTIONAL, + * singleExtensions [1] EXPLICIT Extensions OPTIONAL } + */ +typedef struct ocsp_single_response_st { + OCSP_CERTID *certId; + OCSP_CERTSTATUS *certStatus; + ASN1_GENERALIZEDTIME *thisUpdate; + ASN1_GENERALIZEDTIME *nextUpdate; + STACK_OF(X509_EXTENSION) *singleExtensions; +} OCSP_SINGLERESP; + +DECLARE_STACK_OF(OCSP_SINGLERESP) +DECLARE_ASN1_SET_OF(OCSP_SINGLERESP) + +/*- ResponseData ::= SEQUENCE { + * version [0] EXPLICIT Version DEFAULT v1, + * responderID ResponderID, + * producedAt GeneralizedTime, + * responses SEQUENCE OF SingleResponse, + * responseExtensions [1] EXPLICIT Extensions OPTIONAL } + */ +typedef struct ocsp_response_data_st { + ASN1_INTEGER *version; + OCSP_RESPID *responderId; + ASN1_GENERALIZEDTIME *producedAt; + STACK_OF(OCSP_SINGLERESP) *responses; + STACK_OF(X509_EXTENSION) *responseExtensions; +} OCSP_RESPDATA; + +/*- BasicOCSPResponse ::= SEQUENCE { + * tbsResponseData ResponseData, + * signatureAlgorithm AlgorithmIdentifier, + * signature BIT STRING, + * certs [0] EXPLICIT SEQUENCE OF Certificate OPTIONAL } + */ + /* + * Note 1: The value for "signature" is specified in the OCSP rfc2560 as + * follows: "The value for the signature SHALL be computed on the hash of + * the DER encoding ResponseData." This means that you must hash the + * DER-encoded tbsResponseData, and then run it through a crypto-signing + * function, which will (at least w/RSA) do a hash-'n'-private-encrypt + * operation. This seems a bit odd, but that's the spec. Also note that + * the data structures do not leave anywhere to independently specify the + * algorithm used for the initial hash. So, we look at the + * signature-specification algorithm, and try to do something intelligent. + * -- Kathy Weinhold, CertCo + */ + /* + * Note 2: It seems that the mentioned passage from RFC 2560 (section + * 4.2.1) is open for interpretation. I've done tests against another + * responder, and found that it doesn't do the double hashing that the RFC + * seems to say one should. Therefore, all relevant functions take a flag + * saying which variant should be used. -- Richard Levitte, OpenSSL team + * and CeloCom + */ +typedef struct ocsp_basic_response_st { + OCSP_RESPDATA *tbsResponseData; + X509_ALGOR *signatureAlgorithm; + ASN1_BIT_STRING *signature; + STACK_OF(X509) *certs; +} OCSP_BASICRESP; + +/*- + * CRLReason ::= ENUMERATED { + * unspecified (0), + * keyCompromise (1), + * cACompromise (2), + * affiliationChanged (3), + * superseded (4), + * cessationOfOperation (5), + * certificateHold (6), + * removeFromCRL (8) } + */ +# define OCSP_REVOKED_STATUS_NOSTATUS -1 +# define OCSP_REVOKED_STATUS_UNSPECIFIED 0 +# define OCSP_REVOKED_STATUS_KEYCOMPROMISE 1 +# define OCSP_REVOKED_STATUS_CACOMPROMISE 2 +# define OCSP_REVOKED_STATUS_AFFILIATIONCHANGED 3 +# define OCSP_REVOKED_STATUS_SUPERSEDED 4 +# define OCSP_REVOKED_STATUS_CESSATIONOFOPERATION 5 +# define OCSP_REVOKED_STATUS_CERTIFICATEHOLD 6 +# define OCSP_REVOKED_STATUS_REMOVEFROMCRL 8 + +/*- + * CrlID ::= SEQUENCE { + * crlUrl [0] EXPLICIT IA5String OPTIONAL, + * crlNum [1] EXPLICIT INTEGER OPTIONAL, + * crlTime [2] EXPLICIT GeneralizedTime OPTIONAL } + */ +typedef struct ocsp_crl_id_st { + ASN1_IA5STRING *crlUrl; + ASN1_INTEGER *crlNum; + ASN1_GENERALIZEDTIME *crlTime; +} OCSP_CRLID; + +/*- + * ServiceLocator ::= SEQUENCE { + * issuer Name, + * locator AuthorityInfoAccessSyntax OPTIONAL } + */ +typedef struct ocsp_service_locator_st { + X509_NAME *issuer; + STACK_OF(ACCESS_DESCRIPTION) *locator; +} OCSP_SERVICELOC; + +# define PEM_STRING_OCSP_REQUEST "OCSP REQUEST" +# define PEM_STRING_OCSP_RESPONSE "OCSP RESPONSE" + +# define d2i_OCSP_REQUEST_bio(bp,p) ASN1_d2i_bio_of(OCSP_REQUEST,OCSP_REQUEST_new,d2i_OCSP_REQUEST,bp,p) + +# define d2i_OCSP_RESPONSE_bio(bp,p) ASN1_d2i_bio_of(OCSP_RESPONSE,OCSP_RESPONSE_new,d2i_OCSP_RESPONSE,bp,p) + +# define PEM_read_bio_OCSP_REQUEST(bp,x,cb) (OCSP_REQUEST *)PEM_ASN1_read_bio( \ + (char *(*)())d2i_OCSP_REQUEST,PEM_STRING_OCSP_REQUEST,bp,(char **)x,cb,NULL) + +# define PEM_read_bio_OCSP_RESPONSE(bp,x,cb)(OCSP_RESPONSE *)PEM_ASN1_read_bio(\ + (char *(*)())d2i_OCSP_RESPONSE,PEM_STRING_OCSP_RESPONSE,bp,(char **)x,cb,NULL) + +# define PEM_write_bio_OCSP_REQUEST(bp,o) \ + PEM_ASN1_write_bio((int (*)())i2d_OCSP_REQUEST,PEM_STRING_OCSP_REQUEST,\ + bp,(char *)o, NULL,NULL,0,NULL,NULL) + +# define PEM_write_bio_OCSP_RESPONSE(bp,o) \ + PEM_ASN1_write_bio((int (*)())i2d_OCSP_RESPONSE,PEM_STRING_OCSP_RESPONSE,\ + bp,(char *)o, NULL,NULL,0,NULL,NULL) + +# define i2d_OCSP_RESPONSE_bio(bp,o) ASN1_i2d_bio_of(OCSP_RESPONSE,i2d_OCSP_RESPONSE,bp,o) + +# define i2d_OCSP_REQUEST_bio(bp,o) ASN1_i2d_bio_of(OCSP_REQUEST,i2d_OCSP_REQUEST,bp,o) + +# define OCSP_REQUEST_sign(o,pkey,md) \ + ASN1_item_sign(ASN1_ITEM_rptr(OCSP_REQINFO),\ + o->optionalSignature->signatureAlgorithm,NULL,\ + o->optionalSignature->signature,o->tbsRequest,pkey,md) + +# define OCSP_BASICRESP_sign(o,pkey,md,d) \ + ASN1_item_sign(ASN1_ITEM_rptr(OCSP_RESPDATA),o->signatureAlgorithm,NULL,\ + o->signature,o->tbsResponseData,pkey,md) + +# define OCSP_REQUEST_verify(a,r) ASN1_item_verify(ASN1_ITEM_rptr(OCSP_REQINFO),\ + a->optionalSignature->signatureAlgorithm,\ + a->optionalSignature->signature,a->tbsRequest,r) + +# define OCSP_BASICRESP_verify(a,r,d) ASN1_item_verify(ASN1_ITEM_rptr(OCSP_RESPDATA),\ + a->signatureAlgorithm,a->signature,a->tbsResponseData,r) + +# define ASN1_BIT_STRING_digest(data,type,md,len) \ + ASN1_item_digest(ASN1_ITEM_rptr(ASN1_BIT_STRING),type,data,md,len) + +# define OCSP_CERTSTATUS_dup(cs)\ + (OCSP_CERTSTATUS*)ASN1_dup((int(*)())i2d_OCSP_CERTSTATUS,\ + (char *(*)())d2i_OCSP_CERTSTATUS,(char *)(cs)) + +OCSP_CERTID *OCSP_CERTID_dup(OCSP_CERTID *id); + +OCSP_RESPONSE *OCSP_sendreq_bio(BIO *b, const char *path, OCSP_REQUEST *req); +OCSP_REQ_CTX *OCSP_sendreq_new(BIO *io, const char *path, OCSP_REQUEST *req, + int maxline); +int OCSP_REQ_CTX_nbio(OCSP_REQ_CTX *rctx); +int OCSP_sendreq_nbio(OCSP_RESPONSE **presp, OCSP_REQ_CTX *rctx); +OCSP_REQ_CTX *OCSP_REQ_CTX_new(BIO *io, int maxline); +void OCSP_REQ_CTX_free(OCSP_REQ_CTX *rctx); +void OCSP_set_max_response_length(OCSP_REQ_CTX *rctx, unsigned long len); +int OCSP_REQ_CTX_i2d(OCSP_REQ_CTX *rctx, const ASN1_ITEM *it, + ASN1_VALUE *val); +int OCSP_REQ_CTX_nbio_d2i(OCSP_REQ_CTX *rctx, ASN1_VALUE **pval, + const ASN1_ITEM *it); +BIO *OCSP_REQ_CTX_get0_mem_bio(OCSP_REQ_CTX *rctx); +int OCSP_REQ_CTX_i2d(OCSP_REQ_CTX *rctx, const ASN1_ITEM *it, + ASN1_VALUE *val); +int OCSP_REQ_CTX_http(OCSP_REQ_CTX *rctx, const char *op, const char *path); +int OCSP_REQ_CTX_set1_req(OCSP_REQ_CTX *rctx, OCSP_REQUEST *req); +int OCSP_REQ_CTX_add1_header(OCSP_REQ_CTX *rctx, + const char *name, const char *value); + +OCSP_CERTID *OCSP_cert_to_id(const EVP_MD *dgst, X509 *subject, X509 *issuer); + +OCSP_CERTID *OCSP_cert_id_new(const EVP_MD *dgst, + X509_NAME *issuerName, + ASN1_BIT_STRING *issuerKey, + ASN1_INTEGER *serialNumber); + +OCSP_ONEREQ *OCSP_request_add0_id(OCSP_REQUEST *req, OCSP_CERTID *cid); + +int OCSP_request_add1_nonce(OCSP_REQUEST *req, unsigned char *val, int len); +int OCSP_basic_add1_nonce(OCSP_BASICRESP *resp, unsigned char *val, int len); +int OCSP_check_nonce(OCSP_REQUEST *req, OCSP_BASICRESP *bs); +int OCSP_copy_nonce(OCSP_BASICRESP *resp, OCSP_REQUEST *req); + +int OCSP_request_set1_name(OCSP_REQUEST *req, X509_NAME *nm); +int OCSP_request_add1_cert(OCSP_REQUEST *req, X509 *cert); + +int OCSP_request_sign(OCSP_REQUEST *req, + X509 *signer, + EVP_PKEY *key, + const EVP_MD *dgst, + STACK_OF(X509) *certs, unsigned long flags); + +int OCSP_response_status(OCSP_RESPONSE *resp); +OCSP_BASICRESP *OCSP_response_get1_basic(OCSP_RESPONSE *resp); + +int OCSP_resp_count(OCSP_BASICRESP *bs); +OCSP_SINGLERESP *OCSP_resp_get0(OCSP_BASICRESP *bs, int idx); +int OCSP_resp_find(OCSP_BASICRESP *bs, OCSP_CERTID *id, int last); +int OCSP_single_get0_status(OCSP_SINGLERESP *single, int *reason, + ASN1_GENERALIZEDTIME **revtime, + ASN1_GENERALIZEDTIME **thisupd, + ASN1_GENERALIZEDTIME **nextupd); +int OCSP_resp_find_status(OCSP_BASICRESP *bs, OCSP_CERTID *id, int *status, + int *reason, + ASN1_GENERALIZEDTIME **revtime, + ASN1_GENERALIZEDTIME **thisupd, + ASN1_GENERALIZEDTIME **nextupd); +int OCSP_check_validity(ASN1_GENERALIZEDTIME *thisupd, + ASN1_GENERALIZEDTIME *nextupd, long sec, long maxsec); + +int OCSP_request_verify(OCSP_REQUEST *req, STACK_OF(X509) *certs, + X509_STORE *store, unsigned long flags); + +int OCSP_parse_url(const char *url, char **phost, char **pport, char **ppath, + int *pssl); + +int OCSP_id_issuer_cmp(OCSP_CERTID *a, OCSP_CERTID *b); +int OCSP_id_cmp(OCSP_CERTID *a, OCSP_CERTID *b); + +int OCSP_request_onereq_count(OCSP_REQUEST *req); +OCSP_ONEREQ *OCSP_request_onereq_get0(OCSP_REQUEST *req, int i); +OCSP_CERTID *OCSP_onereq_get0_id(OCSP_ONEREQ *one); +int OCSP_id_get0_info(ASN1_OCTET_STRING **piNameHash, ASN1_OBJECT **pmd, + ASN1_OCTET_STRING **pikeyHash, + ASN1_INTEGER **pserial, OCSP_CERTID *cid); +int OCSP_request_is_signed(OCSP_REQUEST *req); +OCSP_RESPONSE *OCSP_response_create(int status, OCSP_BASICRESP *bs); +OCSP_SINGLERESP *OCSP_basic_add1_status(OCSP_BASICRESP *rsp, + OCSP_CERTID *cid, + int status, int reason, + ASN1_TIME *revtime, + ASN1_TIME *thisupd, + ASN1_TIME *nextupd); +int OCSP_basic_add1_cert(OCSP_BASICRESP *resp, X509 *cert); +int OCSP_basic_sign(OCSP_BASICRESP *brsp, + X509 *signer, EVP_PKEY *key, const EVP_MD *dgst, + STACK_OF(X509) *certs, unsigned long flags); + +X509_EXTENSION *OCSP_crlID_new(char *url, long *n, char *tim); + +X509_EXTENSION *OCSP_accept_responses_new(char **oids); + +X509_EXTENSION *OCSP_archive_cutoff_new(char *tim); + +X509_EXTENSION *OCSP_url_svcloc_new(X509_NAME *issuer, char **urls); + +int OCSP_REQUEST_get_ext_count(OCSP_REQUEST *x); +int OCSP_REQUEST_get_ext_by_NID(OCSP_REQUEST *x, int nid, int lastpos); +int OCSP_REQUEST_get_ext_by_OBJ(OCSP_REQUEST *x, ASN1_OBJECT *obj, + int lastpos); +int OCSP_REQUEST_get_ext_by_critical(OCSP_REQUEST *x, int crit, int lastpos); +X509_EXTENSION *OCSP_REQUEST_get_ext(OCSP_REQUEST *x, int loc); +X509_EXTENSION *OCSP_REQUEST_delete_ext(OCSP_REQUEST *x, int loc); +void *OCSP_REQUEST_get1_ext_d2i(OCSP_REQUEST *x, int nid, int *crit, + int *idx); +int OCSP_REQUEST_add1_ext_i2d(OCSP_REQUEST *x, int nid, void *value, int crit, + unsigned long flags); +int OCSP_REQUEST_add_ext(OCSP_REQUEST *x, X509_EXTENSION *ex, int loc); + +int OCSP_ONEREQ_get_ext_count(OCSP_ONEREQ *x); +int OCSP_ONEREQ_get_ext_by_NID(OCSP_ONEREQ *x, int nid, int lastpos); +int OCSP_ONEREQ_get_ext_by_OBJ(OCSP_ONEREQ *x, ASN1_OBJECT *obj, int lastpos); +int OCSP_ONEREQ_get_ext_by_critical(OCSP_ONEREQ *x, int crit, int lastpos); +X509_EXTENSION *OCSP_ONEREQ_get_ext(OCSP_ONEREQ *x, int loc); +X509_EXTENSION *OCSP_ONEREQ_delete_ext(OCSP_ONEREQ *x, int loc); +void *OCSP_ONEREQ_get1_ext_d2i(OCSP_ONEREQ *x, int nid, int *crit, int *idx); +int OCSP_ONEREQ_add1_ext_i2d(OCSP_ONEREQ *x, int nid, void *value, int crit, + unsigned long flags); +int OCSP_ONEREQ_add_ext(OCSP_ONEREQ *x, X509_EXTENSION *ex, int loc); + +int OCSP_BASICRESP_get_ext_count(OCSP_BASICRESP *x); +int OCSP_BASICRESP_get_ext_by_NID(OCSP_BASICRESP *x, int nid, int lastpos); +int OCSP_BASICRESP_get_ext_by_OBJ(OCSP_BASICRESP *x, ASN1_OBJECT *obj, + int lastpos); +int OCSP_BASICRESP_get_ext_by_critical(OCSP_BASICRESP *x, int crit, + int lastpos); +X509_EXTENSION *OCSP_BASICRESP_get_ext(OCSP_BASICRESP *x, int loc); +X509_EXTENSION *OCSP_BASICRESP_delete_ext(OCSP_BASICRESP *x, int loc); +void *OCSP_BASICRESP_get1_ext_d2i(OCSP_BASICRESP *x, int nid, int *crit, + int *idx); +int OCSP_BASICRESP_add1_ext_i2d(OCSP_BASICRESP *x, int nid, void *value, + int crit, unsigned long flags); +int OCSP_BASICRESP_add_ext(OCSP_BASICRESP *x, X509_EXTENSION *ex, int loc); + +int OCSP_SINGLERESP_get_ext_count(OCSP_SINGLERESP *x); +int OCSP_SINGLERESP_get_ext_by_NID(OCSP_SINGLERESP *x, int nid, int lastpos); +int OCSP_SINGLERESP_get_ext_by_OBJ(OCSP_SINGLERESP *x, ASN1_OBJECT *obj, + int lastpos); +int OCSP_SINGLERESP_get_ext_by_critical(OCSP_SINGLERESP *x, int crit, + int lastpos); +X509_EXTENSION *OCSP_SINGLERESP_get_ext(OCSP_SINGLERESP *x, int loc); +X509_EXTENSION *OCSP_SINGLERESP_delete_ext(OCSP_SINGLERESP *x, int loc); +void *OCSP_SINGLERESP_get1_ext_d2i(OCSP_SINGLERESP *x, int nid, int *crit, + int *idx); +int OCSP_SINGLERESP_add1_ext_i2d(OCSP_SINGLERESP *x, int nid, void *value, + int crit, unsigned long flags); +int OCSP_SINGLERESP_add_ext(OCSP_SINGLERESP *x, X509_EXTENSION *ex, int loc); + +DECLARE_ASN1_FUNCTIONS(OCSP_SINGLERESP) +DECLARE_ASN1_FUNCTIONS(OCSP_CERTSTATUS) +DECLARE_ASN1_FUNCTIONS(OCSP_REVOKEDINFO) +DECLARE_ASN1_FUNCTIONS(OCSP_BASICRESP) +DECLARE_ASN1_FUNCTIONS(OCSP_RESPDATA) +DECLARE_ASN1_FUNCTIONS(OCSP_RESPID) +DECLARE_ASN1_FUNCTIONS(OCSP_RESPONSE) +DECLARE_ASN1_FUNCTIONS(OCSP_RESPBYTES) +DECLARE_ASN1_FUNCTIONS(OCSP_ONEREQ) +DECLARE_ASN1_FUNCTIONS(OCSP_CERTID) +DECLARE_ASN1_FUNCTIONS(OCSP_REQUEST) +DECLARE_ASN1_FUNCTIONS(OCSP_SIGNATURE) +DECLARE_ASN1_FUNCTIONS(OCSP_REQINFO) +DECLARE_ASN1_FUNCTIONS(OCSP_CRLID) +DECLARE_ASN1_FUNCTIONS(OCSP_SERVICELOC) + +const char *OCSP_response_status_str(long s); +const char *OCSP_cert_status_str(long s); +const char *OCSP_crl_reason_str(long s); + +int OCSP_REQUEST_print(BIO *bp, OCSP_REQUEST *a, unsigned long flags); +int OCSP_RESPONSE_print(BIO *bp, OCSP_RESPONSE *o, unsigned long flags); + +int OCSP_basic_verify(OCSP_BASICRESP *bs, STACK_OF(X509) *certs, + X509_STORE *st, unsigned long flags); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_OCSP_strings(void); + +/* Error codes for the OCSP functions. */ + +/* Function codes. */ +# define OCSP_F_ASN1_STRING_ENCODE 100 +# define OCSP_F_D2I_OCSP_NONCE 102 +# define OCSP_F_OCSP_BASIC_ADD1_STATUS 103 +# define OCSP_F_OCSP_BASIC_SIGN 104 +# define OCSP_F_OCSP_BASIC_VERIFY 105 +# define OCSP_F_OCSP_CERT_ID_NEW 101 +# define OCSP_F_OCSP_CHECK_DELEGATED 106 +# define OCSP_F_OCSP_CHECK_IDS 107 +# define OCSP_F_OCSP_CHECK_ISSUER 108 +# define OCSP_F_OCSP_CHECK_VALIDITY 115 +# define OCSP_F_OCSP_MATCH_ISSUERID 109 +# define OCSP_F_OCSP_PARSE_URL 114 +# define OCSP_F_OCSP_REQUEST_SIGN 110 +# define OCSP_F_OCSP_REQUEST_VERIFY 116 +# define OCSP_F_OCSP_RESPONSE_GET1_BASIC 111 +# define OCSP_F_OCSP_SENDREQ_BIO 112 +# define OCSP_F_OCSP_SENDREQ_NBIO 117 +# define OCSP_F_PARSE_HTTP_LINE1 118 +# define OCSP_F_REQUEST_VERIFY 113 + +/* Reason codes. */ +# define OCSP_R_BAD_DATA 100 +# define OCSP_R_CERTIFICATE_VERIFY_ERROR 101 +# define OCSP_R_DIGEST_ERR 102 +# define OCSP_R_ERROR_IN_NEXTUPDATE_FIELD 122 +# define OCSP_R_ERROR_IN_THISUPDATE_FIELD 123 +# define OCSP_R_ERROR_PARSING_URL 121 +# define OCSP_R_MISSING_OCSPSIGNING_USAGE 103 +# define OCSP_R_NEXTUPDATE_BEFORE_THISUPDATE 124 +# define OCSP_R_NOT_BASIC_RESPONSE 104 +# define OCSP_R_NO_CERTIFICATES_IN_CHAIN 105 +# define OCSP_R_NO_CONTENT 106 +# define OCSP_R_NO_PUBLIC_KEY 107 +# define OCSP_R_NO_RESPONSE_DATA 108 +# define OCSP_R_NO_REVOKED_TIME 109 +# define OCSP_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE 110 +# define OCSP_R_REQUEST_NOT_SIGNED 128 +# define OCSP_R_RESPONSE_CONTAINS_NO_REVOCATION_DATA 111 +# define OCSP_R_ROOT_CA_NOT_TRUSTED 112 +# define OCSP_R_SERVER_READ_ERROR 113 +# define OCSP_R_SERVER_RESPONSE_ERROR 114 +# define OCSP_R_SERVER_RESPONSE_PARSE_ERROR 115 +# define OCSP_R_SERVER_WRITE_ERROR 116 +# define OCSP_R_SIGNATURE_FAILURE 117 +# define OCSP_R_SIGNER_CERTIFICATE_NOT_FOUND 118 +# define OCSP_R_STATUS_EXPIRED 125 +# define OCSP_R_STATUS_NOT_YET_VALID 126 +# define OCSP_R_STATUS_TOO_OLD 127 +# define OCSP_R_UNKNOWN_MESSAGE_DIGEST 119 +# define OCSP_R_UNKNOWN_NID 120 +# define OCSP_R_UNSUPPORTED_REQUESTORNAME_TYPE 129 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/opensslconf.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/opensslconf.h new file mode 100644 index 0000000..ac0ad50 --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/opensslconf.h @@ -0,0 +1,270 @@ +/* opensslconf.h */ +/* WARNING: Generated automatically from opensslconf.h.in by Configure. */ + +#ifdef __cplusplus +extern "C" { +#endif +/* OpenSSL was configured with the following options: */ +#ifndef OPENSSL_DOING_MAKEDEPEND + + +#ifndef OPENSSL_NO_EC_NISTP_64_GCC_128 +# define OPENSSL_NO_EC_NISTP_64_GCC_128 +#endif +#ifndef OPENSSL_NO_GMP +# define OPENSSL_NO_GMP +#endif +#ifndef OPENSSL_NO_JPAKE +# define OPENSSL_NO_JPAKE +#endif +#ifndef OPENSSL_NO_KRB5 +# define OPENSSL_NO_KRB5 +#endif +#ifndef OPENSSL_NO_LIBUNBOUND +# define OPENSSL_NO_LIBUNBOUND +#endif +#ifndef OPENSSL_NO_MD2 +# define OPENSSL_NO_MD2 +#endif +#ifndef OPENSSL_NO_RC5 +# define OPENSSL_NO_RC5 +#endif +#ifndef OPENSSL_NO_RFC3779 +# define OPENSSL_NO_RFC3779 +#endif +#ifndef OPENSSL_NO_SCTP +# define OPENSSL_NO_SCTP +#endif +#ifndef OPENSSL_NO_SSL_TRACE +# define OPENSSL_NO_SSL_TRACE +#endif +#ifndef OPENSSL_NO_SSL2 +# define OPENSSL_NO_SSL2 +#endif +#ifndef OPENSSL_NO_STORE +# define OPENSSL_NO_STORE +#endif +#ifndef OPENSSL_NO_UNIT_TEST +# define OPENSSL_NO_UNIT_TEST +#endif +#ifndef OPENSSL_NO_WEAK_SSL_CIPHERS +# define OPENSSL_NO_WEAK_SSL_CIPHERS +#endif + +#endif /* OPENSSL_DOING_MAKEDEPEND */ + +#ifndef OPENSSL_THREADS +# define OPENSSL_THREADS +#endif +#ifndef OPENSSL_NO_DYNAMIC_ENGINE +# define OPENSSL_NO_DYNAMIC_ENGINE +#endif + +/* The OPENSSL_NO_* macros are also defined as NO_* if the application + asks for it. This is a transient feature that is provided for those + who haven't had the time to do the appropriate changes in their + applications. */ +#ifdef OPENSSL_ALGORITHM_DEFINES +# if defined(OPENSSL_NO_EC_NISTP_64_GCC_128) && !defined(NO_EC_NISTP_64_GCC_128) +# define NO_EC_NISTP_64_GCC_128 +# endif +# if defined(OPENSSL_NO_GMP) && !defined(NO_GMP) +# define NO_GMP +# endif +# if defined(OPENSSL_NO_JPAKE) && !defined(NO_JPAKE) +# define NO_JPAKE +# endif +# if defined(OPENSSL_NO_KRB5) && !defined(NO_KRB5) +# define NO_KRB5 +# endif +# if defined(OPENSSL_NO_LIBUNBOUND) && !defined(NO_LIBUNBOUND) +# define NO_LIBUNBOUND +# endif +# if defined(OPENSSL_NO_MD2) && !defined(NO_MD2) +# define NO_MD2 +# endif +# if defined(OPENSSL_NO_RC5) && !defined(NO_RC5) +# define NO_RC5 +# endif +# if defined(OPENSSL_NO_RFC3779) && !defined(NO_RFC3779) +# define NO_RFC3779 +# endif +# if defined(OPENSSL_NO_SCTP) && !defined(NO_SCTP) +# define NO_SCTP +# endif +# if defined(OPENSSL_NO_SSL_TRACE) && !defined(NO_SSL_TRACE) +# define NO_SSL_TRACE +# endif +# if defined(OPENSSL_NO_SSL2) && !defined(NO_SSL2) +# define NO_SSL2 +# endif +# if defined(OPENSSL_NO_STORE) && !defined(NO_STORE) +# define NO_STORE +# endif +# if defined(OPENSSL_NO_UNIT_TEST) && !defined(NO_UNIT_TEST) +# define NO_UNIT_TEST +# endif +# if defined(OPENSSL_NO_WEAK_SSL_CIPHERS) && !defined(NO_WEAK_SSL_CIPHERS) +# define NO_WEAK_SSL_CIPHERS +# endif +#endif + +#define OPENSSL_CPUID_OBJ + +/* crypto/opensslconf.h.in */ + +/* Generate 80386 code? */ +#undef I386_ONLY + +#if !(defined(VMS) || defined(__VMS)) /* VMS uses logical names instead */ +#if defined(HEADER_CRYPTLIB_H) && !defined(OPENSSLDIR) +#define ENGINESDIR "/usr/local/ssl/lib/engines" +#define OPENSSLDIR "/usr/local/ssl" +#endif +#endif + +#undef OPENSSL_UNISTD +#define OPENSSL_UNISTD + +#undef OPENSSL_EXPORT_VAR_AS_FUNCTION + +#if defined(HEADER_IDEA_H) && !defined(IDEA_INT) +#define IDEA_INT unsigned int +#endif + +#if defined(HEADER_MD2_H) && !defined(MD2_INT) +#define MD2_INT unsigned int +#endif + +#if defined(HEADER_RC2_H) && !defined(RC2_INT) +/* I need to put in a mod for the alpha - eay */ +#define RC2_INT unsigned int +#endif + +#if defined(HEADER_RC4_H) +#if !defined(RC4_INT) +/* using int types make the structure larger but make the code faster + * on most boxes I have tested - up to %20 faster. */ +/* + * I don't know what does "most" mean, but declaring "int" is a must on: + * - Intel P6 because partial register stalls are very expensive; + * - elder Alpha because it lacks byte load/store instructions; + */ +#define RC4_INT unsigned int +#endif +#if !defined(RC4_CHUNK) +/* + * This enables code handling data aligned at natural CPU word + * boundary. See crypto/rc4/rc4_enc.c for further details. + */ +#define RC4_CHUNK unsigned long +#endif +#endif + +#if (defined(HEADER_NEW_DES_H) || defined(HEADER_DES_H)) && !defined(DES_LONG) +/* If this is set to 'unsigned int' on a DEC Alpha, this gives about a + * %20 speed up (longs are 8 bytes, int's are 4). */ +#ifndef DES_LONG +#define DES_LONG unsigned int +#endif +#endif + +#if defined(HEADER_BN_H) && !defined(CONFIG_HEADER_BN_H) +#define CONFIG_HEADER_BN_H +#undef BN_LLONG + +/* Should we define BN_DIV2W here? */ + +/* Only one for the following should be defined */ +#define SIXTY_FOUR_BIT_LONG +#undef SIXTY_FOUR_BIT +#undef THIRTY_TWO_BIT +#endif + +#if defined(HEADER_RC4_LOCL_H) && !defined(CONFIG_HEADER_RC4_LOCL_H) +#define CONFIG_HEADER_RC4_LOCL_H +/* if this is defined data[i] is used instead of *data, this is a %20 + * speedup on x86 */ +#undef RC4_INDEX +#endif + +#if defined(HEADER_BF_LOCL_H) && !defined(CONFIG_HEADER_BF_LOCL_H) +#define CONFIG_HEADER_BF_LOCL_H +#undef BF_PTR +#endif /* HEADER_BF_LOCL_H */ + +#if defined(HEADER_DES_LOCL_H) && !defined(CONFIG_HEADER_DES_LOCL_H) +#define CONFIG_HEADER_DES_LOCL_H +#ifndef DES_DEFAULT_OPTIONS +/* the following is tweaked from a config script, that is why it is a + * protected undef/define */ +#ifndef DES_PTR +#undef DES_PTR +#endif + +/* This helps C compiler generate the correct code for multiple functional + * units. It reduces register dependancies at the expense of 2 more + * registers */ +#ifndef DES_RISC1 +#undef DES_RISC1 +#endif + +#ifndef DES_RISC2 +#undef DES_RISC2 +#endif + +#if defined(DES_RISC1) && defined(DES_RISC2) +#error YOU SHOULD NOT HAVE BOTH DES_RISC1 AND DES_RISC2 DEFINED!!!!! +#endif + +/* Unroll the inner loop, this sometimes helps, sometimes hinders. + * Very mucy CPU dependant */ +#ifndef DES_UNROLL +#define DES_UNROLL +#endif + +/* These default values were supplied by + * Peter Gutman + * They are only used if nothing else has been defined */ +#if !defined(DES_PTR) && !defined(DES_RISC1) && !defined(DES_RISC2) && !defined(DES_UNROLL) +/* Special defines which change the way the code is built depending on the + CPU and OS. For SGI machines you can use _MIPS_SZLONG (32 or 64) to find + even newer MIPS CPU's, but at the moment one size fits all for + optimization options. Older Sparc's work better with only UNROLL, but + there's no way to tell at compile time what it is you're running on */ + +#if defined( __sun ) || defined ( sun ) /* Newer Sparc's */ +# define DES_PTR +# define DES_RISC1 +# define DES_UNROLL +#elif defined( __ultrix ) /* Older MIPS */ +# define DES_PTR +# define DES_RISC2 +# define DES_UNROLL +#elif defined( __osf1__ ) /* Alpha */ +# define DES_PTR +# define DES_RISC2 +#elif defined ( _AIX ) /* RS6000 */ + /* Unknown */ +#elif defined( __hpux ) /* HP-PA */ + /* Unknown */ +#elif defined( __aux ) /* 68K */ + /* Unknown */ +#elif defined( __dgux ) /* 88K (but P6 in latest boxes) */ +# define DES_UNROLL +#elif defined( __sgi ) /* Newer MIPS */ +# define DES_PTR +# define DES_RISC2 +# define DES_UNROLL +#elif defined(i386) || defined(__i386__) /* x86 boxes, should be gcc */ +# define DES_PTR +# define DES_RISC1 +# define DES_UNROLL +#endif /* Systems-specific speed defines */ +#endif + +#endif /* DES_DEFAULT_OPTIONS */ +#endif /* HEADER_DES_LOCL_H */ +#ifdef __cplusplus +} +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/opensslv.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/opensslv.h new file mode 100644 index 0000000..88faad6 --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/opensslv.h @@ -0,0 +1,97 @@ +#ifndef HEADER_OPENSSLV_H +# define HEADER_OPENSSLV_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*- + * Numeric release version identifier: + * MNNFFPPS: major minor fix patch status + * The status nibble has one of the values 0 for development, 1 to e for betas + * 1 to 14, and f for release. The patch level is exactly that. + * For example: + * 0.9.3-dev 0x00903000 + * 0.9.3-beta1 0x00903001 + * 0.9.3-beta2-dev 0x00903002 + * 0.9.3-beta2 0x00903002 (same as ...beta2-dev) + * 0.9.3 0x0090300f + * 0.9.3a 0x0090301f + * 0.9.4 0x0090400f + * 1.2.3z 0x102031af + * + * For continuity reasons (because 0.9.5 is already out, and is coded + * 0x00905100), between 0.9.5 and 0.9.6 the coding of the patch level + * part is slightly different, by setting the highest bit. This means + * that 0.9.5a looks like this: 0x0090581f. At 0.9.6, we can start + * with 0x0090600S... + * + * (Prior to 0.9.3-dev a different scheme was used: 0.9.2b is 0x0922.) + * (Prior to 0.9.5a beta1, a different scheme was used: MMNNFFRBB for + * major minor fix final patch/beta) + */ +# define OPENSSL_VERSION_NUMBER 0x100020afL +# ifdef OPENSSL_FIPS +# define OPENSSL_VERSION_TEXT "OpenSSL 1.0.2j-fips 26 Sep 2016" +# else +# define OPENSSL_VERSION_TEXT "OpenSSL 1.0.2j 26 Sep 2016" +# endif +# define OPENSSL_VERSION_PTEXT " part of " OPENSSL_VERSION_TEXT + +/*- + * The macros below are to be used for shared library (.so, .dll, ...) + * versioning. That kind of versioning works a bit differently between + * operating systems. The most usual scheme is to set a major and a minor + * number, and have the runtime loader check that the major number is equal + * to what it was at application link time, while the minor number has to + * be greater or equal to what it was at application link time. With this + * scheme, the version number is usually part of the file name, like this: + * + * libcrypto.so.0.9 + * + * Some unixen also make a softlink with the major verson number only: + * + * libcrypto.so.0 + * + * On Tru64 and IRIX 6.x it works a little bit differently. There, the + * shared library version is stored in the file, and is actually a series + * of versions, separated by colons. The rightmost version present in the + * library when linking an application is stored in the application to be + * matched at run time. When the application is run, a check is done to + * see if the library version stored in the application matches any of the + * versions in the version string of the library itself. + * This version string can be constructed in any way, depending on what + * kind of matching is desired. However, to implement the same scheme as + * the one used in the other unixen, all compatible versions, from lowest + * to highest, should be part of the string. Consecutive builds would + * give the following versions strings: + * + * 3.0 + * 3.0:3.1 + * 3.0:3.1:3.2 + * 4.0 + * 4.0:4.1 + * + * Notice how version 4 is completely incompatible with version, and + * therefore give the breach you can see. + * + * There may be other schemes as well that I haven't yet discovered. + * + * So, here's the way it works here: first of all, the library version + * number doesn't need at all to match the overall OpenSSL version. + * However, it's nice and more understandable if it actually does. + * The current library version is stored in the macro SHLIB_VERSION_NUMBER, + * which is just a piece of text in the format "M.m.e" (Major, minor, edit). + * For the sake of Tru64, IRIX, and any other OS that behaves in similar ways, + * we need to keep a history of version numbers, which is done in the + * macro SHLIB_VERSION_HISTORY. The numbers are separated by colons and + * should only keep the versions that are binary compatible with the current. + */ +# define SHLIB_VERSION_HISTORY "" +# define SHLIB_VERSION_NUMBER "1.0.0" + + +#ifdef __cplusplus +} +#endif +#endif /* HEADER_OPENSSLV_H */ diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/ossl_typ.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/ossl_typ.h new file mode 100644 index 0000000..364d262 --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/ossl_typ.h @@ -0,0 +1,213 @@ +/* ==================================================================== + * Copyright (c) 1998-2001 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_OPENSSL_TYPES_H +# define HEADER_OPENSSL_TYPES_H + +#ifdef __cplusplus +extern "C" { +#endif + +# include + +# ifdef NO_ASN1_TYPEDEFS +# define ASN1_INTEGER ASN1_STRING +# define ASN1_ENUMERATED ASN1_STRING +# define ASN1_BIT_STRING ASN1_STRING +# define ASN1_OCTET_STRING ASN1_STRING +# define ASN1_PRINTABLESTRING ASN1_STRING +# define ASN1_T61STRING ASN1_STRING +# define ASN1_IA5STRING ASN1_STRING +# define ASN1_UTCTIME ASN1_STRING +# define ASN1_GENERALIZEDTIME ASN1_STRING +# define ASN1_TIME ASN1_STRING +# define ASN1_GENERALSTRING ASN1_STRING +# define ASN1_UNIVERSALSTRING ASN1_STRING +# define ASN1_BMPSTRING ASN1_STRING +# define ASN1_VISIBLESTRING ASN1_STRING +# define ASN1_UTF8STRING ASN1_STRING +# define ASN1_BOOLEAN int +# define ASN1_NULL int +# else +typedef struct asn1_string_st ASN1_INTEGER; +typedef struct asn1_string_st ASN1_ENUMERATED; +typedef struct asn1_string_st ASN1_BIT_STRING; +typedef struct asn1_string_st ASN1_OCTET_STRING; +typedef struct asn1_string_st ASN1_PRINTABLESTRING; +typedef struct asn1_string_st ASN1_T61STRING; +typedef struct asn1_string_st ASN1_IA5STRING; +typedef struct asn1_string_st ASN1_GENERALSTRING; +typedef struct asn1_string_st ASN1_UNIVERSALSTRING; +typedef struct asn1_string_st ASN1_BMPSTRING; +typedef struct asn1_string_st ASN1_UTCTIME; +typedef struct asn1_string_st ASN1_TIME; +typedef struct asn1_string_st ASN1_GENERALIZEDTIME; +typedef struct asn1_string_st ASN1_VISIBLESTRING; +typedef struct asn1_string_st ASN1_UTF8STRING; +typedef struct asn1_string_st ASN1_STRING; +typedef int ASN1_BOOLEAN; +typedef int ASN1_NULL; +# endif + +typedef struct asn1_object_st ASN1_OBJECT; + +typedef struct ASN1_ITEM_st ASN1_ITEM; +typedef struct asn1_pctx_st ASN1_PCTX; + +# ifdef OPENSSL_SYS_WIN32 +# undef X509_NAME +# undef X509_EXTENSIONS +# undef X509_CERT_PAIR +# undef PKCS7_ISSUER_AND_SERIAL +# undef OCSP_REQUEST +# undef OCSP_RESPONSE +# endif + +# ifdef BIGNUM +# undef BIGNUM +# endif +typedef struct bignum_st BIGNUM; +typedef struct bignum_ctx BN_CTX; +typedef struct bn_blinding_st BN_BLINDING; +typedef struct bn_mont_ctx_st BN_MONT_CTX; +typedef struct bn_recp_ctx_st BN_RECP_CTX; +typedef struct bn_gencb_st BN_GENCB; + +typedef struct buf_mem_st BUF_MEM; + +typedef struct evp_cipher_st EVP_CIPHER; +typedef struct evp_cipher_ctx_st EVP_CIPHER_CTX; +typedef struct env_md_st EVP_MD; +typedef struct env_md_ctx_st EVP_MD_CTX; +typedef struct evp_pkey_st EVP_PKEY; + +typedef struct evp_pkey_asn1_method_st EVP_PKEY_ASN1_METHOD; + +typedef struct evp_pkey_method_st EVP_PKEY_METHOD; +typedef struct evp_pkey_ctx_st EVP_PKEY_CTX; + +typedef struct dh_st DH; +typedef struct dh_method DH_METHOD; + +typedef struct dsa_st DSA; +typedef struct dsa_method DSA_METHOD; + +typedef struct rsa_st RSA; +typedef struct rsa_meth_st RSA_METHOD; + +typedef struct rand_meth_st RAND_METHOD; + +typedef struct ecdh_method ECDH_METHOD; +typedef struct ecdsa_method ECDSA_METHOD; + +typedef struct x509_st X509; +typedef struct X509_algor_st X509_ALGOR; +typedef struct X509_crl_st X509_CRL; +typedef struct x509_crl_method_st X509_CRL_METHOD; +typedef struct x509_revoked_st X509_REVOKED; +typedef struct X509_name_st X509_NAME; +typedef struct X509_pubkey_st X509_PUBKEY; +typedef struct x509_store_st X509_STORE; +typedef struct x509_store_ctx_st X509_STORE_CTX; + +typedef struct pkcs8_priv_key_info_st PKCS8_PRIV_KEY_INFO; + +typedef struct v3_ext_ctx X509V3_CTX; +typedef struct conf_st CONF; + +typedef struct store_st STORE; +typedef struct store_method_st STORE_METHOD; + +typedef struct ui_st UI; +typedef struct ui_method_st UI_METHOD; + +typedef struct st_ERR_FNS ERR_FNS; + +typedef struct engine_st ENGINE; +typedef struct ssl_st SSL; +typedef struct ssl_ctx_st SSL_CTX; + +typedef struct comp_method_st COMP_METHOD; + +typedef struct X509_POLICY_NODE_st X509_POLICY_NODE; +typedef struct X509_POLICY_LEVEL_st X509_POLICY_LEVEL; +typedef struct X509_POLICY_TREE_st X509_POLICY_TREE; +typedef struct X509_POLICY_CACHE_st X509_POLICY_CACHE; + +typedef struct AUTHORITY_KEYID_st AUTHORITY_KEYID; +typedef struct DIST_POINT_st DIST_POINT; +typedef struct ISSUING_DIST_POINT_st ISSUING_DIST_POINT; +typedef struct NAME_CONSTRAINTS_st NAME_CONSTRAINTS; + + /* If placed in pkcs12.h, we end up with a circular depency with pkcs7.h */ +# define DECLARE_PKCS12_STACK_OF(type)/* Nothing */ +# define IMPLEMENT_PKCS12_STACK_OF(type)/* Nothing */ + +typedef struct crypto_ex_data_st CRYPTO_EX_DATA; +/* Callback types for crypto.h */ +typedef int CRYPTO_EX_new (void *parent, void *ptr, CRYPTO_EX_DATA *ad, + int idx, long argl, void *argp); +typedef void CRYPTO_EX_free (void *parent, void *ptr, CRYPTO_EX_DATA *ad, + int idx, long argl, void *argp); +typedef int CRYPTO_EX_dup (CRYPTO_EX_DATA *to, CRYPTO_EX_DATA *from, + void *from_d, int idx, long argl, void *argp); + +typedef struct ocsp_req_ctx_st OCSP_REQ_CTX; +typedef struct ocsp_response_st OCSP_RESPONSE; +typedef struct ocsp_responder_id_st OCSP_RESPID; + +#ifdef __cplusplus +} +#endif +#endif /* def HEADER_OPENSSL_TYPES_H */ diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/pem.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/pem.h new file mode 100644 index 0000000..aac72fb --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/pem.h @@ -0,0 +1,617 @@ +/* crypto/pem/pem.h */ +/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_PEM_H +# define HEADER_PEM_H + +# include +# ifndef OPENSSL_NO_BIO +# include +# endif +# ifndef OPENSSL_NO_STACK +# include +# endif +# include +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# define PEM_BUFSIZE 1024 + +# define PEM_OBJ_UNDEF 0 +# define PEM_OBJ_X509 1 +# define PEM_OBJ_X509_REQ 2 +# define PEM_OBJ_CRL 3 +# define PEM_OBJ_SSL_SESSION 4 +# define PEM_OBJ_PRIV_KEY 10 +# define PEM_OBJ_PRIV_RSA 11 +# define PEM_OBJ_PRIV_DSA 12 +# define PEM_OBJ_PRIV_DH 13 +# define PEM_OBJ_PUB_RSA 14 +# define PEM_OBJ_PUB_DSA 15 +# define PEM_OBJ_PUB_DH 16 +# define PEM_OBJ_DHPARAMS 17 +# define PEM_OBJ_DSAPARAMS 18 +# define PEM_OBJ_PRIV_RSA_PUBLIC 19 +# define PEM_OBJ_PRIV_ECDSA 20 +# define PEM_OBJ_PUB_ECDSA 21 +# define PEM_OBJ_ECPARAMETERS 22 + +# define PEM_ERROR 30 +# define PEM_DEK_DES_CBC 40 +# define PEM_DEK_IDEA_CBC 45 +# define PEM_DEK_DES_EDE 50 +# define PEM_DEK_DES_ECB 60 +# define PEM_DEK_RSA 70 +# define PEM_DEK_RSA_MD2 80 +# define PEM_DEK_RSA_MD5 90 + +# define PEM_MD_MD2 NID_md2 +# define PEM_MD_MD5 NID_md5 +# define PEM_MD_SHA NID_sha +# define PEM_MD_MD2_RSA NID_md2WithRSAEncryption +# define PEM_MD_MD5_RSA NID_md5WithRSAEncryption +# define PEM_MD_SHA_RSA NID_sha1WithRSAEncryption + +# define PEM_STRING_X509_OLD "X509 CERTIFICATE" +# define PEM_STRING_X509 "CERTIFICATE" +# define PEM_STRING_X509_PAIR "CERTIFICATE PAIR" +# define PEM_STRING_X509_TRUSTED "TRUSTED CERTIFICATE" +# define PEM_STRING_X509_REQ_OLD "NEW CERTIFICATE REQUEST" +# define PEM_STRING_X509_REQ "CERTIFICATE REQUEST" +# define PEM_STRING_X509_CRL "X509 CRL" +# define PEM_STRING_EVP_PKEY "ANY PRIVATE KEY" +# define PEM_STRING_PUBLIC "PUBLIC KEY" +# define PEM_STRING_RSA "RSA PRIVATE KEY" +# define PEM_STRING_RSA_PUBLIC "RSA PUBLIC KEY" +# define PEM_STRING_DSA "DSA PRIVATE KEY" +# define PEM_STRING_DSA_PUBLIC "DSA PUBLIC KEY" +# define PEM_STRING_PKCS7 "PKCS7" +# define PEM_STRING_PKCS7_SIGNED "PKCS #7 SIGNED DATA" +# define PEM_STRING_PKCS8 "ENCRYPTED PRIVATE KEY" +# define PEM_STRING_PKCS8INF "PRIVATE KEY" +# define PEM_STRING_DHPARAMS "DH PARAMETERS" +# define PEM_STRING_DHXPARAMS "X9.42 DH PARAMETERS" +# define PEM_STRING_SSL_SESSION "SSL SESSION PARAMETERS" +# define PEM_STRING_DSAPARAMS "DSA PARAMETERS" +# define PEM_STRING_ECDSA_PUBLIC "ECDSA PUBLIC KEY" +# define PEM_STRING_ECPARAMETERS "EC PARAMETERS" +# define PEM_STRING_ECPRIVATEKEY "EC PRIVATE KEY" +# define PEM_STRING_PARAMETERS "PARAMETERS" +# define PEM_STRING_CMS "CMS" + + /* + * Note that this structure is initialised by PEM_SealInit and cleaned up + * by PEM_SealFinal (at least for now) + */ +typedef struct PEM_Encode_Seal_st { + EVP_ENCODE_CTX encode; + EVP_MD_CTX md; + EVP_CIPHER_CTX cipher; +} PEM_ENCODE_SEAL_CTX; + +/* enc_type is one off */ +# define PEM_TYPE_ENCRYPTED 10 +# define PEM_TYPE_MIC_ONLY 20 +# define PEM_TYPE_MIC_CLEAR 30 +# define PEM_TYPE_CLEAR 40 + +typedef struct pem_recip_st { + char *name; + X509_NAME *dn; + int cipher; + int key_enc; + /* char iv[8]; unused and wrong size */ +} PEM_USER; + +typedef struct pem_ctx_st { + int type; /* what type of object */ + struct { + int version; + int mode; + } proc_type; + + char *domain; + + struct { + int cipher; + /*- + unused, and wrong size + unsigned char iv[8]; */ + } DEK_info; + + PEM_USER *originator; + + int num_recipient; + PEM_USER **recipient; +/*- + XXX(ben): don#t think this is used! + STACK *x509_chain; / * certificate chain */ + EVP_MD *md; /* signature type */ + + int md_enc; /* is the md encrypted or not? */ + int md_len; /* length of md_data */ + char *md_data; /* message digest, could be pkey encrypted */ + + EVP_CIPHER *dec; /* date encryption cipher */ + int key_len; /* key length */ + unsigned char *key; /* key */ + /*- + unused, and wrong size + unsigned char iv[8]; */ + + int data_enc; /* is the data encrypted */ + int data_len; + unsigned char *data; +} PEM_CTX; + +/* + * These macros make the PEM_read/PEM_write functions easier to maintain and + * write. Now they are all implemented with either: IMPLEMENT_PEM_rw(...) or + * IMPLEMENT_PEM_rw_cb(...) + */ + +# ifdef OPENSSL_NO_FP_API + +# define IMPLEMENT_PEM_read_fp(name, type, str, asn1) /**/ +# define IMPLEMENT_PEM_write_fp(name, type, str, asn1) /**/ +# define IMPLEMENT_PEM_write_fp_const(name, type, str, asn1) /**/ +# define IMPLEMENT_PEM_write_cb_fp(name, type, str, asn1) /**/ +# define IMPLEMENT_PEM_write_cb_fp_const(name, type, str, asn1) /**/ +# else + +# define IMPLEMENT_PEM_read_fp(name, type, str, asn1) \ +type *PEM_read_##name(FILE *fp, type **x, pem_password_cb *cb, void *u)\ +{ \ +return PEM_ASN1_read((d2i_of_void *)d2i_##asn1, str,fp,(void **)x,cb,u); \ +} + +# define IMPLEMENT_PEM_write_fp(name, type, str, asn1) \ +int PEM_write_##name(FILE *fp, type *x) \ +{ \ +return PEM_ASN1_write((i2d_of_void *)i2d_##asn1,str,fp,x,NULL,NULL,0,NULL,NULL); \ +} + +# define IMPLEMENT_PEM_write_fp_const(name, type, str, asn1) \ +int PEM_write_##name(FILE *fp, const type *x) \ +{ \ +return PEM_ASN1_write((i2d_of_void *)i2d_##asn1,str,fp,(void *)x,NULL,NULL,0,NULL,NULL); \ +} + +# define IMPLEMENT_PEM_write_cb_fp(name, type, str, asn1) \ +int PEM_write_##name(FILE *fp, type *x, const EVP_CIPHER *enc, \ + unsigned char *kstr, int klen, pem_password_cb *cb, \ + void *u) \ + { \ + return PEM_ASN1_write((i2d_of_void *)i2d_##asn1,str,fp,x,enc,kstr,klen,cb,u); \ + } + +# define IMPLEMENT_PEM_write_cb_fp_const(name, type, str, asn1) \ +int PEM_write_##name(FILE *fp, type *x, const EVP_CIPHER *enc, \ + unsigned char *kstr, int klen, pem_password_cb *cb, \ + void *u) \ + { \ + return PEM_ASN1_write((i2d_of_void *)i2d_##asn1,str,fp,x,enc,kstr,klen,cb,u); \ + } + +# endif + +# define IMPLEMENT_PEM_read_bio(name, type, str, asn1) \ +type *PEM_read_bio_##name(BIO *bp, type **x, pem_password_cb *cb, void *u)\ +{ \ +return PEM_ASN1_read_bio((d2i_of_void *)d2i_##asn1, str,bp,(void **)x,cb,u); \ +} + +# define IMPLEMENT_PEM_write_bio(name, type, str, asn1) \ +int PEM_write_bio_##name(BIO *bp, type *x) \ +{ \ +return PEM_ASN1_write_bio((i2d_of_void *)i2d_##asn1,str,bp,x,NULL,NULL,0,NULL,NULL); \ +} + +# define IMPLEMENT_PEM_write_bio_const(name, type, str, asn1) \ +int PEM_write_bio_##name(BIO *bp, const type *x) \ +{ \ +return PEM_ASN1_write_bio((i2d_of_void *)i2d_##asn1,str,bp,(void *)x,NULL,NULL,0,NULL,NULL); \ +} + +# define IMPLEMENT_PEM_write_cb_bio(name, type, str, asn1) \ +int PEM_write_bio_##name(BIO *bp, type *x, const EVP_CIPHER *enc, \ + unsigned char *kstr, int klen, pem_password_cb *cb, void *u) \ + { \ + return PEM_ASN1_write_bio((i2d_of_void *)i2d_##asn1,str,bp,x,enc,kstr,klen,cb,u); \ + } + +# define IMPLEMENT_PEM_write_cb_bio_const(name, type, str, asn1) \ +int PEM_write_bio_##name(BIO *bp, type *x, const EVP_CIPHER *enc, \ + unsigned char *kstr, int klen, pem_password_cb *cb, void *u) \ + { \ + return PEM_ASN1_write_bio((i2d_of_void *)i2d_##asn1,str,bp,(void *)x,enc,kstr,klen,cb,u); \ + } + +# define IMPLEMENT_PEM_write(name, type, str, asn1) \ + IMPLEMENT_PEM_write_bio(name, type, str, asn1) \ + IMPLEMENT_PEM_write_fp(name, type, str, asn1) + +# define IMPLEMENT_PEM_write_const(name, type, str, asn1) \ + IMPLEMENT_PEM_write_bio_const(name, type, str, asn1) \ + IMPLEMENT_PEM_write_fp_const(name, type, str, asn1) + +# define IMPLEMENT_PEM_write_cb(name, type, str, asn1) \ + IMPLEMENT_PEM_write_cb_bio(name, type, str, asn1) \ + IMPLEMENT_PEM_write_cb_fp(name, type, str, asn1) + +# define IMPLEMENT_PEM_write_cb_const(name, type, str, asn1) \ + IMPLEMENT_PEM_write_cb_bio_const(name, type, str, asn1) \ + IMPLEMENT_PEM_write_cb_fp_const(name, type, str, asn1) + +# define IMPLEMENT_PEM_read(name, type, str, asn1) \ + IMPLEMENT_PEM_read_bio(name, type, str, asn1) \ + IMPLEMENT_PEM_read_fp(name, type, str, asn1) + +# define IMPLEMENT_PEM_rw(name, type, str, asn1) \ + IMPLEMENT_PEM_read(name, type, str, asn1) \ + IMPLEMENT_PEM_write(name, type, str, asn1) + +# define IMPLEMENT_PEM_rw_const(name, type, str, asn1) \ + IMPLEMENT_PEM_read(name, type, str, asn1) \ + IMPLEMENT_PEM_write_const(name, type, str, asn1) + +# define IMPLEMENT_PEM_rw_cb(name, type, str, asn1) \ + IMPLEMENT_PEM_read(name, type, str, asn1) \ + IMPLEMENT_PEM_write_cb(name, type, str, asn1) + +/* These are the same except they are for the declarations */ + +# if defined(OPENSSL_NO_FP_API) + +# define DECLARE_PEM_read_fp(name, type) /**/ +# define DECLARE_PEM_write_fp(name, type) /**/ +# define DECLARE_PEM_write_cb_fp(name, type) /**/ +# else + +# define DECLARE_PEM_read_fp(name, type) \ + type *PEM_read_##name(FILE *fp, type **x, pem_password_cb *cb, void *u); + +# define DECLARE_PEM_write_fp(name, type) \ + int PEM_write_##name(FILE *fp, type *x); + +# define DECLARE_PEM_write_fp_const(name, type) \ + int PEM_write_##name(FILE *fp, const type *x); + +# define DECLARE_PEM_write_cb_fp(name, type) \ + int PEM_write_##name(FILE *fp, type *x, const EVP_CIPHER *enc, \ + unsigned char *kstr, int klen, pem_password_cb *cb, void *u); + +# endif + +# ifndef OPENSSL_NO_BIO +# define DECLARE_PEM_read_bio(name, type) \ + type *PEM_read_bio_##name(BIO *bp, type **x, pem_password_cb *cb, void *u); + +# define DECLARE_PEM_write_bio(name, type) \ + int PEM_write_bio_##name(BIO *bp, type *x); + +# define DECLARE_PEM_write_bio_const(name, type) \ + int PEM_write_bio_##name(BIO *bp, const type *x); + +# define DECLARE_PEM_write_cb_bio(name, type) \ + int PEM_write_bio_##name(BIO *bp, type *x, const EVP_CIPHER *enc, \ + unsigned char *kstr, int klen, pem_password_cb *cb, void *u); + +# else + +# define DECLARE_PEM_read_bio(name, type) /**/ +# define DECLARE_PEM_write_bio(name, type) /**/ +# define DECLARE_PEM_write_bio_const(name, type) /**/ +# define DECLARE_PEM_write_cb_bio(name, type) /**/ +# endif +# define DECLARE_PEM_write(name, type) \ + DECLARE_PEM_write_bio(name, type) \ + DECLARE_PEM_write_fp(name, type) +# define DECLARE_PEM_write_const(name, type) \ + DECLARE_PEM_write_bio_const(name, type) \ + DECLARE_PEM_write_fp_const(name, type) +# define DECLARE_PEM_write_cb(name, type) \ + DECLARE_PEM_write_cb_bio(name, type) \ + DECLARE_PEM_write_cb_fp(name, type) +# define DECLARE_PEM_read(name, type) \ + DECLARE_PEM_read_bio(name, type) \ + DECLARE_PEM_read_fp(name, type) +# define DECLARE_PEM_rw(name, type) \ + DECLARE_PEM_read(name, type) \ + DECLARE_PEM_write(name, type) +# define DECLARE_PEM_rw_const(name, type) \ + DECLARE_PEM_read(name, type) \ + DECLARE_PEM_write_const(name, type) +# define DECLARE_PEM_rw_cb(name, type) \ + DECLARE_PEM_read(name, type) \ + DECLARE_PEM_write_cb(name, type) +# if 1 +/* "userdata": new with OpenSSL 0.9.4 */ +typedef int pem_password_cb (char *buf, int size, int rwflag, void *userdata); +# else +/* OpenSSL 0.9.3, 0.9.3a */ +typedef int pem_password_cb (char *buf, int size, int rwflag); +# endif + +int PEM_get_EVP_CIPHER_INFO(char *header, EVP_CIPHER_INFO *cipher); +int PEM_do_header(EVP_CIPHER_INFO *cipher, unsigned char *data, long *len, + pem_password_cb *callback, void *u); + +# ifndef OPENSSL_NO_BIO +int PEM_read_bio(BIO *bp, char **name, char **header, + unsigned char **data, long *len); +int PEM_write_bio(BIO *bp, const char *name, const char *hdr, + const unsigned char *data, long len); +int PEM_bytes_read_bio(unsigned char **pdata, long *plen, char **pnm, + const char *name, BIO *bp, pem_password_cb *cb, + void *u); +void *PEM_ASN1_read_bio(d2i_of_void *d2i, const char *name, BIO *bp, void **x, + pem_password_cb *cb, void *u); +int PEM_ASN1_write_bio(i2d_of_void *i2d, const char *name, BIO *bp, void *x, + const EVP_CIPHER *enc, unsigned char *kstr, int klen, + pem_password_cb *cb, void *u); + +STACK_OF(X509_INFO) *PEM_X509_INFO_read_bio(BIO *bp, STACK_OF(X509_INFO) *sk, + pem_password_cb *cb, void *u); +int PEM_X509_INFO_write_bio(BIO *bp, X509_INFO *xi, EVP_CIPHER *enc, + unsigned char *kstr, int klen, + pem_password_cb *cd, void *u); +# endif + +int PEM_read(FILE *fp, char **name, char **header, + unsigned char **data, long *len); +int PEM_write(FILE *fp, const char *name, const char *hdr, + const unsigned char *data, long len); +void *PEM_ASN1_read(d2i_of_void *d2i, const char *name, FILE *fp, void **x, + pem_password_cb *cb, void *u); +int PEM_ASN1_write(i2d_of_void *i2d, const char *name, FILE *fp, + void *x, const EVP_CIPHER *enc, unsigned char *kstr, + int klen, pem_password_cb *callback, void *u); +STACK_OF(X509_INFO) *PEM_X509_INFO_read(FILE *fp, STACK_OF(X509_INFO) *sk, + pem_password_cb *cb, void *u); + +int PEM_SealInit(PEM_ENCODE_SEAL_CTX *ctx, EVP_CIPHER *type, + EVP_MD *md_type, unsigned char **ek, int *ekl, + unsigned char *iv, EVP_PKEY **pubk, int npubk); +void PEM_SealUpdate(PEM_ENCODE_SEAL_CTX *ctx, unsigned char *out, int *outl, + unsigned char *in, int inl); +int PEM_SealFinal(PEM_ENCODE_SEAL_CTX *ctx, unsigned char *sig, int *sigl, + unsigned char *out, int *outl, EVP_PKEY *priv); + +void PEM_SignInit(EVP_MD_CTX *ctx, EVP_MD *type); +void PEM_SignUpdate(EVP_MD_CTX *ctx, unsigned char *d, unsigned int cnt); +int PEM_SignFinal(EVP_MD_CTX *ctx, unsigned char *sigret, + unsigned int *siglen, EVP_PKEY *pkey); + +int PEM_def_callback(char *buf, int num, int w, void *key); +void PEM_proc_type(char *buf, int type); +void PEM_dek_info(char *buf, const char *type, int len, char *str); + +# include + +DECLARE_PEM_rw(X509, X509) +DECLARE_PEM_rw(X509_AUX, X509) +DECLARE_PEM_rw(X509_CERT_PAIR, X509_CERT_PAIR) +DECLARE_PEM_rw(X509_REQ, X509_REQ) +DECLARE_PEM_write(X509_REQ_NEW, X509_REQ) +DECLARE_PEM_rw(X509_CRL, X509_CRL) +DECLARE_PEM_rw(PKCS7, PKCS7) +DECLARE_PEM_rw(NETSCAPE_CERT_SEQUENCE, NETSCAPE_CERT_SEQUENCE) +DECLARE_PEM_rw(PKCS8, X509_SIG) +DECLARE_PEM_rw(PKCS8_PRIV_KEY_INFO, PKCS8_PRIV_KEY_INFO) +# ifndef OPENSSL_NO_RSA +DECLARE_PEM_rw_cb(RSAPrivateKey, RSA) +DECLARE_PEM_rw_const(RSAPublicKey, RSA) +DECLARE_PEM_rw(RSA_PUBKEY, RSA) +# endif +# ifndef OPENSSL_NO_DSA +DECLARE_PEM_rw_cb(DSAPrivateKey, DSA) +DECLARE_PEM_rw(DSA_PUBKEY, DSA) +DECLARE_PEM_rw_const(DSAparams, DSA) +# endif +# ifndef OPENSSL_NO_EC +DECLARE_PEM_rw_const(ECPKParameters, EC_GROUP) +DECLARE_PEM_rw_cb(ECPrivateKey, EC_KEY) +DECLARE_PEM_rw(EC_PUBKEY, EC_KEY) +# endif +# ifndef OPENSSL_NO_DH +DECLARE_PEM_rw_const(DHparams, DH) +DECLARE_PEM_write_const(DHxparams, DH) +# endif +DECLARE_PEM_rw_cb(PrivateKey, EVP_PKEY) +DECLARE_PEM_rw(PUBKEY, EVP_PKEY) + +int PEM_write_bio_PKCS8PrivateKey_nid(BIO *bp, EVP_PKEY *x, int nid, + char *kstr, int klen, + pem_password_cb *cb, void *u); +int PEM_write_bio_PKCS8PrivateKey(BIO *, EVP_PKEY *, const EVP_CIPHER *, + char *, int, pem_password_cb *, void *); +int i2d_PKCS8PrivateKey_bio(BIO *bp, EVP_PKEY *x, const EVP_CIPHER *enc, + char *kstr, int klen, + pem_password_cb *cb, void *u); +int i2d_PKCS8PrivateKey_nid_bio(BIO *bp, EVP_PKEY *x, int nid, + char *kstr, int klen, + pem_password_cb *cb, void *u); +EVP_PKEY *d2i_PKCS8PrivateKey_bio(BIO *bp, EVP_PKEY **x, pem_password_cb *cb, + void *u); + +int i2d_PKCS8PrivateKey_fp(FILE *fp, EVP_PKEY *x, const EVP_CIPHER *enc, + char *kstr, int klen, + pem_password_cb *cb, void *u); +int i2d_PKCS8PrivateKey_nid_fp(FILE *fp, EVP_PKEY *x, int nid, + char *kstr, int klen, + pem_password_cb *cb, void *u); +int PEM_write_PKCS8PrivateKey_nid(FILE *fp, EVP_PKEY *x, int nid, + char *kstr, int klen, + pem_password_cb *cb, void *u); + +EVP_PKEY *d2i_PKCS8PrivateKey_fp(FILE *fp, EVP_PKEY **x, pem_password_cb *cb, + void *u); + +int PEM_write_PKCS8PrivateKey(FILE *fp, EVP_PKEY *x, const EVP_CIPHER *enc, + char *kstr, int klen, pem_password_cb *cd, + void *u); + +EVP_PKEY *PEM_read_bio_Parameters(BIO *bp, EVP_PKEY **x); +int PEM_write_bio_Parameters(BIO *bp, EVP_PKEY *x); + +EVP_PKEY *b2i_PrivateKey(const unsigned char **in, long length); +EVP_PKEY *b2i_PublicKey(const unsigned char **in, long length); +EVP_PKEY *b2i_PrivateKey_bio(BIO *in); +EVP_PKEY *b2i_PublicKey_bio(BIO *in); +int i2b_PrivateKey_bio(BIO *out, EVP_PKEY *pk); +int i2b_PublicKey_bio(BIO *out, EVP_PKEY *pk); +# ifndef OPENSSL_NO_RC4 +EVP_PKEY *b2i_PVK_bio(BIO *in, pem_password_cb *cb, void *u); +int i2b_PVK_bio(BIO *out, EVP_PKEY *pk, int enclevel, + pem_password_cb *cb, void *u); +# endif + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ + +void ERR_load_PEM_strings(void); + +/* Error codes for the PEM functions. */ + +/* Function codes. */ +# define PEM_F_B2I_DSS 127 +# define PEM_F_B2I_PVK_BIO 128 +# define PEM_F_B2I_RSA 129 +# define PEM_F_CHECK_BITLEN_DSA 130 +# define PEM_F_CHECK_BITLEN_RSA 131 +# define PEM_F_D2I_PKCS8PRIVATEKEY_BIO 120 +# define PEM_F_D2I_PKCS8PRIVATEKEY_FP 121 +# define PEM_F_DO_B2I 132 +# define PEM_F_DO_B2I_BIO 133 +# define PEM_F_DO_BLOB_HEADER 134 +# define PEM_F_DO_PK8PKEY 126 +# define PEM_F_DO_PK8PKEY_FP 125 +# define PEM_F_DO_PVK_BODY 135 +# define PEM_F_DO_PVK_HEADER 136 +# define PEM_F_I2B_PVK 137 +# define PEM_F_I2B_PVK_BIO 138 +# define PEM_F_LOAD_IV 101 +# define PEM_F_PEM_ASN1_READ 102 +# define PEM_F_PEM_ASN1_READ_BIO 103 +# define PEM_F_PEM_ASN1_WRITE 104 +# define PEM_F_PEM_ASN1_WRITE_BIO 105 +# define PEM_F_PEM_DEF_CALLBACK 100 +# define PEM_F_PEM_DO_HEADER 106 +# define PEM_F_PEM_F_PEM_WRITE_PKCS8PRIVATEKEY 118 +# define PEM_F_PEM_GET_EVP_CIPHER_INFO 107 +# define PEM_F_PEM_PK8PKEY 119 +# define PEM_F_PEM_READ 108 +# define PEM_F_PEM_READ_BIO 109 +# define PEM_F_PEM_READ_BIO_DHPARAMS 141 +# define PEM_F_PEM_READ_BIO_PARAMETERS 140 +# define PEM_F_PEM_READ_BIO_PRIVATEKEY 123 +# define PEM_F_PEM_READ_DHPARAMS 142 +# define PEM_F_PEM_READ_PRIVATEKEY 124 +# define PEM_F_PEM_SEALFINAL 110 +# define PEM_F_PEM_SEALINIT 111 +# define PEM_F_PEM_SIGNFINAL 112 +# define PEM_F_PEM_WRITE 113 +# define PEM_F_PEM_WRITE_BIO 114 +# define PEM_F_PEM_WRITE_PRIVATEKEY 139 +# define PEM_F_PEM_X509_INFO_READ 115 +# define PEM_F_PEM_X509_INFO_READ_BIO 116 +# define PEM_F_PEM_X509_INFO_WRITE_BIO 117 + +/* Reason codes. */ +# define PEM_R_BAD_BASE64_DECODE 100 +# define PEM_R_BAD_DECRYPT 101 +# define PEM_R_BAD_END_LINE 102 +# define PEM_R_BAD_IV_CHARS 103 +# define PEM_R_BAD_MAGIC_NUMBER 116 +# define PEM_R_BAD_PASSWORD_READ 104 +# define PEM_R_BAD_VERSION_NUMBER 117 +# define PEM_R_BIO_WRITE_FAILURE 118 +# define PEM_R_CIPHER_IS_NULL 127 +# define PEM_R_ERROR_CONVERTING_PRIVATE_KEY 115 +# define PEM_R_EXPECTING_PRIVATE_KEY_BLOB 119 +# define PEM_R_EXPECTING_PUBLIC_KEY_BLOB 120 +# define PEM_R_HEADER_TOO_LONG 128 +# define PEM_R_INCONSISTENT_HEADER 121 +# define PEM_R_KEYBLOB_HEADER_PARSE_ERROR 122 +# define PEM_R_KEYBLOB_TOO_SHORT 123 +# define PEM_R_NOT_DEK_INFO 105 +# define PEM_R_NOT_ENCRYPTED 106 +# define PEM_R_NOT_PROC_TYPE 107 +# define PEM_R_NO_START_LINE 108 +# define PEM_R_PROBLEMS_GETTING_PASSWORD 109 +# define PEM_R_PUBLIC_KEY_NO_RSA 110 +# define PEM_R_PVK_DATA_TOO_SHORT 124 +# define PEM_R_PVK_TOO_SHORT 125 +# define PEM_R_READ_KEY 111 +# define PEM_R_SHORT_HEADER 112 +# define PEM_R_UNSUPPORTED_CIPHER 113 +# define PEM_R_UNSUPPORTED_ENCRYPTION 114 +# define PEM_R_UNSUPPORTED_KEY_COMPONENTS 126 + +# ifdef __cplusplus +} +# endif +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/pem2.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/pem2.h new file mode 100644 index 0000000..84897d5 --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/pem2.h @@ -0,0 +1,70 @@ +/* ==================================================================== + * Copyright (c) 1999 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +/* + * This header only exists to break a circular dependency between pem and err + * Ben 30 Jan 1999. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef HEADER_PEM_H +void ERR_load_PEM_strings(void); +#endif + +#ifdef __cplusplus +} +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/pkcs12.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/pkcs12.h new file mode 100644 index 0000000..21f1f62 --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/pkcs12.h @@ -0,0 +1,342 @@ +/* pkcs12.h */ +/* + * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project + * 1999. + */ +/* ==================================================================== + * Copyright (c) 1999 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_PKCS12_H +# define HEADER_PKCS12_H + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# define PKCS12_KEY_ID 1 +# define PKCS12_IV_ID 2 +# define PKCS12_MAC_ID 3 + +/* Default iteration count */ +# ifndef PKCS12_DEFAULT_ITER +# define PKCS12_DEFAULT_ITER PKCS5_DEFAULT_ITER +# endif + +# define PKCS12_MAC_KEY_LENGTH 20 + +# define PKCS12_SALT_LEN 8 + +/* Uncomment out next line for unicode password and names, otherwise ASCII */ + +/* + * #define PBE_UNICODE + */ + +# ifdef PBE_UNICODE +# define PKCS12_key_gen PKCS12_key_gen_uni +# define PKCS12_add_friendlyname PKCS12_add_friendlyname_uni +# else +# define PKCS12_key_gen PKCS12_key_gen_asc +# define PKCS12_add_friendlyname PKCS12_add_friendlyname_asc +# endif + +/* MS key usage constants */ + +# define KEY_EX 0x10 +# define KEY_SIG 0x80 + +typedef struct { + X509_SIG *dinfo; + ASN1_OCTET_STRING *salt; + ASN1_INTEGER *iter; /* defaults to 1 */ +} PKCS12_MAC_DATA; + +typedef struct { + ASN1_INTEGER *version; + PKCS12_MAC_DATA *mac; + PKCS7 *authsafes; +} PKCS12; + +typedef struct { + ASN1_OBJECT *type; + union { + struct pkcs12_bag_st *bag; /* secret, crl and certbag */ + struct pkcs8_priv_key_info_st *keybag; /* keybag */ + X509_SIG *shkeybag; /* shrouded key bag */ + STACK_OF(PKCS12_SAFEBAG) *safes; + ASN1_TYPE *other; + } value; + STACK_OF(X509_ATTRIBUTE) *attrib; +} PKCS12_SAFEBAG; + +DECLARE_STACK_OF(PKCS12_SAFEBAG) +DECLARE_ASN1_SET_OF(PKCS12_SAFEBAG) +DECLARE_PKCS12_STACK_OF(PKCS12_SAFEBAG) + +typedef struct pkcs12_bag_st { + ASN1_OBJECT *type; + union { + ASN1_OCTET_STRING *x509cert; + ASN1_OCTET_STRING *x509crl; + ASN1_OCTET_STRING *octet; + ASN1_IA5STRING *sdsicert; + ASN1_TYPE *other; /* Secret or other bag */ + } value; +} PKCS12_BAGS; + +# define PKCS12_ERROR 0 +# define PKCS12_OK 1 + +/* Compatibility macros */ + +# define M_PKCS12_x5092certbag PKCS12_x5092certbag +# define M_PKCS12_x509crl2certbag PKCS12_x509crl2certbag + +# define M_PKCS12_certbag2x509 PKCS12_certbag2x509 +# define M_PKCS12_certbag2x509crl PKCS12_certbag2x509crl + +# define M_PKCS12_unpack_p7data PKCS12_unpack_p7data +# define M_PKCS12_pack_authsafes PKCS12_pack_authsafes +# define M_PKCS12_unpack_authsafes PKCS12_unpack_authsafes +# define M_PKCS12_unpack_p7encdata PKCS12_unpack_p7encdata + +# define M_PKCS12_decrypt_skey PKCS12_decrypt_skey +# define M_PKCS8_decrypt PKCS8_decrypt + +# define M_PKCS12_bag_type(bg) OBJ_obj2nid((bg)->type) +# define M_PKCS12_cert_bag_type(bg) OBJ_obj2nid((bg)->value.bag->type) +# define M_PKCS12_crl_bag_type M_PKCS12_cert_bag_type + +# define PKCS12_get_attr(bag, attr_nid) \ + PKCS12_get_attr_gen(bag->attrib, attr_nid) + +# define PKCS8_get_attr(p8, attr_nid) \ + PKCS12_get_attr_gen(p8->attributes, attr_nid) + +# define PKCS12_mac_present(p12) ((p12)->mac ? 1 : 0) + +PKCS12_SAFEBAG *PKCS12_x5092certbag(X509 *x509); +PKCS12_SAFEBAG *PKCS12_x509crl2certbag(X509_CRL *crl); +X509 *PKCS12_certbag2x509(PKCS12_SAFEBAG *bag); +X509_CRL *PKCS12_certbag2x509crl(PKCS12_SAFEBAG *bag); + +PKCS12_SAFEBAG *PKCS12_item_pack_safebag(void *obj, const ASN1_ITEM *it, + int nid1, int nid2); +PKCS12_SAFEBAG *PKCS12_MAKE_KEYBAG(PKCS8_PRIV_KEY_INFO *p8); +PKCS8_PRIV_KEY_INFO *PKCS8_decrypt(X509_SIG *p8, const char *pass, + int passlen); +PKCS8_PRIV_KEY_INFO *PKCS12_decrypt_skey(PKCS12_SAFEBAG *bag, + const char *pass, int passlen); +X509_SIG *PKCS8_encrypt(int pbe_nid, const EVP_CIPHER *cipher, + const char *pass, int passlen, unsigned char *salt, + int saltlen, int iter, PKCS8_PRIV_KEY_INFO *p8); +PKCS12_SAFEBAG *PKCS12_MAKE_SHKEYBAG(int pbe_nid, const char *pass, + int passlen, unsigned char *salt, + int saltlen, int iter, + PKCS8_PRIV_KEY_INFO *p8); +PKCS7 *PKCS12_pack_p7data(STACK_OF(PKCS12_SAFEBAG) *sk); +STACK_OF(PKCS12_SAFEBAG) *PKCS12_unpack_p7data(PKCS7 *p7); +PKCS7 *PKCS12_pack_p7encdata(int pbe_nid, const char *pass, int passlen, + unsigned char *salt, int saltlen, int iter, + STACK_OF(PKCS12_SAFEBAG) *bags); +STACK_OF(PKCS12_SAFEBAG) *PKCS12_unpack_p7encdata(PKCS7 *p7, const char *pass, + int passlen); + +int PKCS12_pack_authsafes(PKCS12 *p12, STACK_OF(PKCS7) *safes); +STACK_OF(PKCS7) *PKCS12_unpack_authsafes(PKCS12 *p12); + +int PKCS12_add_localkeyid(PKCS12_SAFEBAG *bag, unsigned char *name, + int namelen); +int PKCS12_add_friendlyname_asc(PKCS12_SAFEBAG *bag, const char *name, + int namelen); +int PKCS12_add_CSPName_asc(PKCS12_SAFEBAG *bag, const char *name, + int namelen); +int PKCS12_add_friendlyname_uni(PKCS12_SAFEBAG *bag, + const unsigned char *name, int namelen); +int PKCS8_add_keyusage(PKCS8_PRIV_KEY_INFO *p8, int usage); +ASN1_TYPE *PKCS12_get_attr_gen(STACK_OF(X509_ATTRIBUTE) *attrs, int attr_nid); +char *PKCS12_get_friendlyname(PKCS12_SAFEBAG *bag); +unsigned char *PKCS12_pbe_crypt(X509_ALGOR *algor, const char *pass, + int passlen, unsigned char *in, int inlen, + unsigned char **data, int *datalen, + int en_de); +void *PKCS12_item_decrypt_d2i(X509_ALGOR *algor, const ASN1_ITEM *it, + const char *pass, int passlen, + ASN1_OCTET_STRING *oct, int zbuf); +ASN1_OCTET_STRING *PKCS12_item_i2d_encrypt(X509_ALGOR *algor, + const ASN1_ITEM *it, + const char *pass, int passlen, + void *obj, int zbuf); +PKCS12 *PKCS12_init(int mode); +int PKCS12_key_gen_asc(const char *pass, int passlen, unsigned char *salt, + int saltlen, int id, int iter, int n, + unsigned char *out, const EVP_MD *md_type); +int PKCS12_key_gen_uni(unsigned char *pass, int passlen, unsigned char *salt, + int saltlen, int id, int iter, int n, + unsigned char *out, const EVP_MD *md_type); +int PKCS12_PBE_keyivgen(EVP_CIPHER_CTX *ctx, const char *pass, int passlen, + ASN1_TYPE *param, const EVP_CIPHER *cipher, + const EVP_MD *md_type, int en_de); +int PKCS12_gen_mac(PKCS12 *p12, const char *pass, int passlen, + unsigned char *mac, unsigned int *maclen); +int PKCS12_verify_mac(PKCS12 *p12, const char *pass, int passlen); +int PKCS12_set_mac(PKCS12 *p12, const char *pass, int passlen, + unsigned char *salt, int saltlen, int iter, + const EVP_MD *md_type); +int PKCS12_setup_mac(PKCS12 *p12, int iter, unsigned char *salt, + int saltlen, const EVP_MD *md_type); +unsigned char *OPENSSL_asc2uni(const char *asc, int asclen, + unsigned char **uni, int *unilen); +char *OPENSSL_uni2asc(unsigned char *uni, int unilen); + +DECLARE_ASN1_FUNCTIONS(PKCS12) +DECLARE_ASN1_FUNCTIONS(PKCS12_MAC_DATA) +DECLARE_ASN1_FUNCTIONS(PKCS12_SAFEBAG) +DECLARE_ASN1_FUNCTIONS(PKCS12_BAGS) + +DECLARE_ASN1_ITEM(PKCS12_SAFEBAGS) +DECLARE_ASN1_ITEM(PKCS12_AUTHSAFES) + +void PKCS12_PBE_add(void); +int PKCS12_parse(PKCS12 *p12, const char *pass, EVP_PKEY **pkey, X509 **cert, + STACK_OF(X509) **ca); +PKCS12 *PKCS12_create(char *pass, char *name, EVP_PKEY *pkey, X509 *cert, + STACK_OF(X509) *ca, int nid_key, int nid_cert, int iter, + int mac_iter, int keytype); + +PKCS12_SAFEBAG *PKCS12_add_cert(STACK_OF(PKCS12_SAFEBAG) **pbags, X509 *cert); +PKCS12_SAFEBAG *PKCS12_add_key(STACK_OF(PKCS12_SAFEBAG) **pbags, + EVP_PKEY *key, int key_usage, int iter, + int key_nid, char *pass); +int PKCS12_add_safe(STACK_OF(PKCS7) **psafes, STACK_OF(PKCS12_SAFEBAG) *bags, + int safe_nid, int iter, char *pass); +PKCS12 *PKCS12_add_safes(STACK_OF(PKCS7) *safes, int p7_nid); + +int i2d_PKCS12_bio(BIO *bp, PKCS12 *p12); +int i2d_PKCS12_fp(FILE *fp, PKCS12 *p12); +PKCS12 *d2i_PKCS12_bio(BIO *bp, PKCS12 **p12); +PKCS12 *d2i_PKCS12_fp(FILE *fp, PKCS12 **p12); +int PKCS12_newpass(PKCS12 *p12, const char *oldpass, const char *newpass); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_PKCS12_strings(void); + +/* Error codes for the PKCS12 functions. */ + +/* Function codes. */ +# define PKCS12_F_PARSE_BAG 129 +# define PKCS12_F_PARSE_BAGS 103 +# define PKCS12_F_PKCS12_ADD_FRIENDLYNAME 100 +# define PKCS12_F_PKCS12_ADD_FRIENDLYNAME_ASC 127 +# define PKCS12_F_PKCS12_ADD_FRIENDLYNAME_UNI 102 +# define PKCS12_F_PKCS12_ADD_LOCALKEYID 104 +# define PKCS12_F_PKCS12_CREATE 105 +# define PKCS12_F_PKCS12_GEN_MAC 107 +# define PKCS12_F_PKCS12_INIT 109 +# define PKCS12_F_PKCS12_ITEM_DECRYPT_D2I 106 +# define PKCS12_F_PKCS12_ITEM_I2D_ENCRYPT 108 +# define PKCS12_F_PKCS12_ITEM_PACK_SAFEBAG 117 +# define PKCS12_F_PKCS12_KEY_GEN_ASC 110 +# define PKCS12_F_PKCS12_KEY_GEN_UNI 111 +# define PKCS12_F_PKCS12_MAKE_KEYBAG 112 +# define PKCS12_F_PKCS12_MAKE_SHKEYBAG 113 +# define PKCS12_F_PKCS12_NEWPASS 128 +# define PKCS12_F_PKCS12_PACK_P7DATA 114 +# define PKCS12_F_PKCS12_PACK_P7ENCDATA 115 +# define PKCS12_F_PKCS12_PARSE 118 +# define PKCS12_F_PKCS12_PBE_CRYPT 119 +# define PKCS12_F_PKCS12_PBE_KEYIVGEN 120 +# define PKCS12_F_PKCS12_SETUP_MAC 122 +# define PKCS12_F_PKCS12_SET_MAC 123 +# define PKCS12_F_PKCS12_UNPACK_AUTHSAFES 130 +# define PKCS12_F_PKCS12_UNPACK_P7DATA 131 +# define PKCS12_F_PKCS12_VERIFY_MAC 126 +# define PKCS12_F_PKCS8_ADD_KEYUSAGE 124 +# define PKCS12_F_PKCS8_ENCRYPT 125 + +/* Reason codes. */ +# define PKCS12_R_CANT_PACK_STRUCTURE 100 +# define PKCS12_R_CONTENT_TYPE_NOT_DATA 121 +# define PKCS12_R_DECODE_ERROR 101 +# define PKCS12_R_ENCODE_ERROR 102 +# define PKCS12_R_ENCRYPT_ERROR 103 +# define PKCS12_R_ERROR_SETTING_ENCRYPTED_DATA_TYPE 120 +# define PKCS12_R_INVALID_NULL_ARGUMENT 104 +# define PKCS12_R_INVALID_NULL_PKCS12_POINTER 105 +# define PKCS12_R_IV_GEN_ERROR 106 +# define PKCS12_R_KEY_GEN_ERROR 107 +# define PKCS12_R_MAC_ABSENT 108 +# define PKCS12_R_MAC_GENERATION_ERROR 109 +# define PKCS12_R_MAC_SETUP_ERROR 110 +# define PKCS12_R_MAC_STRING_SET_ERROR 111 +# define PKCS12_R_MAC_VERIFY_ERROR 112 +# define PKCS12_R_MAC_VERIFY_FAILURE 113 +# define PKCS12_R_PARSE_ERROR 114 +# define PKCS12_R_PKCS12_ALGOR_CIPHERINIT_ERROR 115 +# define PKCS12_R_PKCS12_CIPHERFINAL_ERROR 116 +# define PKCS12_R_PKCS12_PBE_CRYPT_ERROR 117 +# define PKCS12_R_UNKNOWN_DIGEST_ALGORITHM 118 +# define PKCS12_R_UNSUPPORTED_PKCS12_MODE 119 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/pkcs7.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/pkcs7.h new file mode 100644 index 0000000..b51b386 --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/pkcs7.h @@ -0,0 +1,481 @@ +/* crypto/pkcs7/pkcs7.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_PKCS7_H +# define HEADER_PKCS7_H + +# include +# include +# include + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# ifdef OPENSSL_SYS_WIN32 +/* Under Win32 thes are defined in wincrypt.h */ +# undef PKCS7_ISSUER_AND_SERIAL +# undef PKCS7_SIGNER_INFO +# endif + +/*- +Encryption_ID DES-CBC +Digest_ID MD5 +Digest_Encryption_ID rsaEncryption +Key_Encryption_ID rsaEncryption +*/ + +typedef struct pkcs7_issuer_and_serial_st { + X509_NAME *issuer; + ASN1_INTEGER *serial; +} PKCS7_ISSUER_AND_SERIAL; + +typedef struct pkcs7_signer_info_st { + ASN1_INTEGER *version; /* version 1 */ + PKCS7_ISSUER_AND_SERIAL *issuer_and_serial; + X509_ALGOR *digest_alg; + STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */ + X509_ALGOR *digest_enc_alg; + ASN1_OCTET_STRING *enc_digest; + STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */ + /* The private key to sign with */ + EVP_PKEY *pkey; +} PKCS7_SIGNER_INFO; + +DECLARE_STACK_OF(PKCS7_SIGNER_INFO) +DECLARE_ASN1_SET_OF(PKCS7_SIGNER_INFO) + +typedef struct pkcs7_recip_info_st { + ASN1_INTEGER *version; /* version 0 */ + PKCS7_ISSUER_AND_SERIAL *issuer_and_serial; + X509_ALGOR *key_enc_algor; + ASN1_OCTET_STRING *enc_key; + X509 *cert; /* get the pub-key from this */ +} PKCS7_RECIP_INFO; + +DECLARE_STACK_OF(PKCS7_RECIP_INFO) +DECLARE_ASN1_SET_OF(PKCS7_RECIP_INFO) + +typedef struct pkcs7_signed_st { + ASN1_INTEGER *version; /* version 1 */ + STACK_OF(X509_ALGOR) *md_algs; /* md used */ + STACK_OF(X509) *cert; /* [ 0 ] */ + STACK_OF(X509_CRL) *crl; /* [ 1 ] */ + STACK_OF(PKCS7_SIGNER_INFO) *signer_info; + struct pkcs7_st *contents; +} PKCS7_SIGNED; +/* + * The above structure is very very similar to PKCS7_SIGN_ENVELOPE. How about + * merging the two + */ + +typedef struct pkcs7_enc_content_st { + ASN1_OBJECT *content_type; + X509_ALGOR *algorithm; + ASN1_OCTET_STRING *enc_data; /* [ 0 ] */ + const EVP_CIPHER *cipher; +} PKCS7_ENC_CONTENT; + +typedef struct pkcs7_enveloped_st { + ASN1_INTEGER *version; /* version 0 */ + STACK_OF(PKCS7_RECIP_INFO) *recipientinfo; + PKCS7_ENC_CONTENT *enc_data; +} PKCS7_ENVELOPE; + +typedef struct pkcs7_signedandenveloped_st { + ASN1_INTEGER *version; /* version 1 */ + STACK_OF(X509_ALGOR) *md_algs; /* md used */ + STACK_OF(X509) *cert; /* [ 0 ] */ + STACK_OF(X509_CRL) *crl; /* [ 1 ] */ + STACK_OF(PKCS7_SIGNER_INFO) *signer_info; + PKCS7_ENC_CONTENT *enc_data; + STACK_OF(PKCS7_RECIP_INFO) *recipientinfo; +} PKCS7_SIGN_ENVELOPE; + +typedef struct pkcs7_digest_st { + ASN1_INTEGER *version; /* version 0 */ + X509_ALGOR *md; /* md used */ + struct pkcs7_st *contents; + ASN1_OCTET_STRING *digest; +} PKCS7_DIGEST; + +typedef struct pkcs7_encrypted_st { + ASN1_INTEGER *version; /* version 0 */ + PKCS7_ENC_CONTENT *enc_data; +} PKCS7_ENCRYPT; + +typedef struct pkcs7_st { + /* + * The following is non NULL if it contains ASN1 encoding of this + * structure + */ + unsigned char *asn1; + long length; +# define PKCS7_S_HEADER 0 +# define PKCS7_S_BODY 1 +# define PKCS7_S_TAIL 2 + int state; /* used during processing */ + int detached; + ASN1_OBJECT *type; + /* content as defined by the type */ + /* + * all encryption/message digests are applied to the 'contents', leaving + * out the 'type' field. + */ + union { + char *ptr; + /* NID_pkcs7_data */ + ASN1_OCTET_STRING *data; + /* NID_pkcs7_signed */ + PKCS7_SIGNED *sign; + /* NID_pkcs7_enveloped */ + PKCS7_ENVELOPE *enveloped; + /* NID_pkcs7_signedAndEnveloped */ + PKCS7_SIGN_ENVELOPE *signed_and_enveloped; + /* NID_pkcs7_digest */ + PKCS7_DIGEST *digest; + /* NID_pkcs7_encrypted */ + PKCS7_ENCRYPT *encrypted; + /* Anything else */ + ASN1_TYPE *other; + } d; +} PKCS7; + +DECLARE_STACK_OF(PKCS7) +DECLARE_ASN1_SET_OF(PKCS7) +DECLARE_PKCS12_STACK_OF(PKCS7) + +# define PKCS7_OP_SET_DETACHED_SIGNATURE 1 +# define PKCS7_OP_GET_DETACHED_SIGNATURE 2 + +# define PKCS7_get_signed_attributes(si) ((si)->auth_attr) +# define PKCS7_get_attributes(si) ((si)->unauth_attr) + +# define PKCS7_type_is_signed(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_signed) +# define PKCS7_type_is_encrypted(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_encrypted) +# define PKCS7_type_is_enveloped(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_enveloped) +# define PKCS7_type_is_signedAndEnveloped(a) \ + (OBJ_obj2nid((a)->type) == NID_pkcs7_signedAndEnveloped) +# define PKCS7_type_is_data(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_data) +# define PKCS7_type_is_digest(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_digest) + +# define PKCS7_set_detached(p,v) \ + PKCS7_ctrl(p,PKCS7_OP_SET_DETACHED_SIGNATURE,v,NULL) +# define PKCS7_get_detached(p) \ + PKCS7_ctrl(p,PKCS7_OP_GET_DETACHED_SIGNATURE,0,NULL) + +# define PKCS7_is_detached(p7) (PKCS7_type_is_signed(p7) && PKCS7_get_detached(p7)) + +/* S/MIME related flags */ + +# define PKCS7_TEXT 0x1 +# define PKCS7_NOCERTS 0x2 +# define PKCS7_NOSIGS 0x4 +# define PKCS7_NOCHAIN 0x8 +# define PKCS7_NOINTERN 0x10 +# define PKCS7_NOVERIFY 0x20 +# define PKCS7_DETACHED 0x40 +# define PKCS7_BINARY 0x80 +# define PKCS7_NOATTR 0x100 +# define PKCS7_NOSMIMECAP 0x200 +# define PKCS7_NOOLDMIMETYPE 0x400 +# define PKCS7_CRLFEOL 0x800 +# define PKCS7_STREAM 0x1000 +# define PKCS7_NOCRL 0x2000 +# define PKCS7_PARTIAL 0x4000 +# define PKCS7_REUSE_DIGEST 0x8000 + +/* Flags: for compatibility with older code */ + +# define SMIME_TEXT PKCS7_TEXT +# define SMIME_NOCERTS PKCS7_NOCERTS +# define SMIME_NOSIGS PKCS7_NOSIGS +# define SMIME_NOCHAIN PKCS7_NOCHAIN +# define SMIME_NOINTERN PKCS7_NOINTERN +# define SMIME_NOVERIFY PKCS7_NOVERIFY +# define SMIME_DETACHED PKCS7_DETACHED +# define SMIME_BINARY PKCS7_BINARY +# define SMIME_NOATTR PKCS7_NOATTR + +DECLARE_ASN1_FUNCTIONS(PKCS7_ISSUER_AND_SERIAL) + +int PKCS7_ISSUER_AND_SERIAL_digest(PKCS7_ISSUER_AND_SERIAL *data, + const EVP_MD *type, unsigned char *md, + unsigned int *len); +# ifndef OPENSSL_NO_FP_API +PKCS7 *d2i_PKCS7_fp(FILE *fp, PKCS7 **p7); +int i2d_PKCS7_fp(FILE *fp, PKCS7 *p7); +# endif +PKCS7 *PKCS7_dup(PKCS7 *p7); +PKCS7 *d2i_PKCS7_bio(BIO *bp, PKCS7 **p7); +int i2d_PKCS7_bio(BIO *bp, PKCS7 *p7); +int i2d_PKCS7_bio_stream(BIO *out, PKCS7 *p7, BIO *in, int flags); +int PEM_write_bio_PKCS7_stream(BIO *out, PKCS7 *p7, BIO *in, int flags); + +DECLARE_ASN1_FUNCTIONS(PKCS7_SIGNER_INFO) +DECLARE_ASN1_FUNCTIONS(PKCS7_RECIP_INFO) +DECLARE_ASN1_FUNCTIONS(PKCS7_SIGNED) +DECLARE_ASN1_FUNCTIONS(PKCS7_ENC_CONTENT) +DECLARE_ASN1_FUNCTIONS(PKCS7_ENVELOPE) +DECLARE_ASN1_FUNCTIONS(PKCS7_SIGN_ENVELOPE) +DECLARE_ASN1_FUNCTIONS(PKCS7_DIGEST) +DECLARE_ASN1_FUNCTIONS(PKCS7_ENCRYPT) +DECLARE_ASN1_FUNCTIONS(PKCS7) + +DECLARE_ASN1_ITEM(PKCS7_ATTR_SIGN) +DECLARE_ASN1_ITEM(PKCS7_ATTR_VERIFY) + +DECLARE_ASN1_NDEF_FUNCTION(PKCS7) +DECLARE_ASN1_PRINT_FUNCTION(PKCS7) + +long PKCS7_ctrl(PKCS7 *p7, int cmd, long larg, char *parg); + +int PKCS7_set_type(PKCS7 *p7, int type); +int PKCS7_set0_type_other(PKCS7 *p7, int type, ASN1_TYPE *other); +int PKCS7_set_content(PKCS7 *p7, PKCS7 *p7_data); +int PKCS7_SIGNER_INFO_set(PKCS7_SIGNER_INFO *p7i, X509 *x509, EVP_PKEY *pkey, + const EVP_MD *dgst); +int PKCS7_SIGNER_INFO_sign(PKCS7_SIGNER_INFO *si); +int PKCS7_add_signer(PKCS7 *p7, PKCS7_SIGNER_INFO *p7i); +int PKCS7_add_certificate(PKCS7 *p7, X509 *x509); +int PKCS7_add_crl(PKCS7 *p7, X509_CRL *x509); +int PKCS7_content_new(PKCS7 *p7, int nid); +int PKCS7_dataVerify(X509_STORE *cert_store, X509_STORE_CTX *ctx, + BIO *bio, PKCS7 *p7, PKCS7_SIGNER_INFO *si); +int PKCS7_signatureVerify(BIO *bio, PKCS7 *p7, PKCS7_SIGNER_INFO *si, + X509 *x509); + +BIO *PKCS7_dataInit(PKCS7 *p7, BIO *bio); +int PKCS7_dataFinal(PKCS7 *p7, BIO *bio); +BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKEY *pkey, BIO *in_bio, X509 *pcert); + +PKCS7_SIGNER_INFO *PKCS7_add_signature(PKCS7 *p7, X509 *x509, + EVP_PKEY *pkey, const EVP_MD *dgst); +X509 *PKCS7_cert_from_signer_info(PKCS7 *p7, PKCS7_SIGNER_INFO *si); +int PKCS7_set_digest(PKCS7 *p7, const EVP_MD *md); +STACK_OF(PKCS7_SIGNER_INFO) *PKCS7_get_signer_info(PKCS7 *p7); + +PKCS7_RECIP_INFO *PKCS7_add_recipient(PKCS7 *p7, X509 *x509); +void PKCS7_SIGNER_INFO_get0_algs(PKCS7_SIGNER_INFO *si, EVP_PKEY **pk, + X509_ALGOR **pdig, X509_ALGOR **psig); +void PKCS7_RECIP_INFO_get0_alg(PKCS7_RECIP_INFO *ri, X509_ALGOR **penc); +int PKCS7_add_recipient_info(PKCS7 *p7, PKCS7_RECIP_INFO *ri); +int PKCS7_RECIP_INFO_set(PKCS7_RECIP_INFO *p7i, X509 *x509); +int PKCS7_set_cipher(PKCS7 *p7, const EVP_CIPHER *cipher); +int PKCS7_stream(unsigned char ***boundary, PKCS7 *p7); + +PKCS7_ISSUER_AND_SERIAL *PKCS7_get_issuer_and_serial(PKCS7 *p7, int idx); +ASN1_OCTET_STRING *PKCS7_digest_from_attributes(STACK_OF(X509_ATTRIBUTE) *sk); +int PKCS7_add_signed_attribute(PKCS7_SIGNER_INFO *p7si, int nid, int type, + void *data); +int PKCS7_add_attribute(PKCS7_SIGNER_INFO *p7si, int nid, int atrtype, + void *value); +ASN1_TYPE *PKCS7_get_attribute(PKCS7_SIGNER_INFO *si, int nid); +ASN1_TYPE *PKCS7_get_signed_attribute(PKCS7_SIGNER_INFO *si, int nid); +int PKCS7_set_signed_attributes(PKCS7_SIGNER_INFO *p7si, + STACK_OF(X509_ATTRIBUTE) *sk); +int PKCS7_set_attributes(PKCS7_SIGNER_INFO *p7si, + STACK_OF(X509_ATTRIBUTE) *sk); + +PKCS7 *PKCS7_sign(X509 *signcert, EVP_PKEY *pkey, STACK_OF(X509) *certs, + BIO *data, int flags); + +PKCS7_SIGNER_INFO *PKCS7_sign_add_signer(PKCS7 *p7, + X509 *signcert, EVP_PKEY *pkey, + const EVP_MD *md, int flags); + +int PKCS7_final(PKCS7 *p7, BIO *data, int flags); +int PKCS7_verify(PKCS7 *p7, STACK_OF(X509) *certs, X509_STORE *store, + BIO *indata, BIO *out, int flags); +STACK_OF(X509) *PKCS7_get0_signers(PKCS7 *p7, STACK_OF(X509) *certs, + int flags); +PKCS7 *PKCS7_encrypt(STACK_OF(X509) *certs, BIO *in, const EVP_CIPHER *cipher, + int flags); +int PKCS7_decrypt(PKCS7 *p7, EVP_PKEY *pkey, X509 *cert, BIO *data, + int flags); + +int PKCS7_add_attrib_smimecap(PKCS7_SIGNER_INFO *si, + STACK_OF(X509_ALGOR) *cap); +STACK_OF(X509_ALGOR) *PKCS7_get_smimecap(PKCS7_SIGNER_INFO *si); +int PKCS7_simple_smimecap(STACK_OF(X509_ALGOR) *sk, int nid, int arg); + +int PKCS7_add_attrib_content_type(PKCS7_SIGNER_INFO *si, ASN1_OBJECT *coid); +int PKCS7_add0_attrib_signing_time(PKCS7_SIGNER_INFO *si, ASN1_TIME *t); +int PKCS7_add1_attrib_digest(PKCS7_SIGNER_INFO *si, + const unsigned char *md, int mdlen); + +int SMIME_write_PKCS7(BIO *bio, PKCS7 *p7, BIO *data, int flags); +PKCS7 *SMIME_read_PKCS7(BIO *bio, BIO **bcont); + +BIO *BIO_new_PKCS7(BIO *out, PKCS7 *p7); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_PKCS7_strings(void); + +/* Error codes for the PKCS7 functions. */ + +/* Function codes. */ +# define PKCS7_F_B64_READ_PKCS7 120 +# define PKCS7_F_B64_WRITE_PKCS7 121 +# define PKCS7_F_DO_PKCS7_SIGNED_ATTRIB 136 +# define PKCS7_F_I2D_PKCS7_BIO_STREAM 140 +# define PKCS7_F_PKCS7_ADD0_ATTRIB_SIGNING_TIME 135 +# define PKCS7_F_PKCS7_ADD_ATTRIB_SMIMECAP 118 +# define PKCS7_F_PKCS7_ADD_CERTIFICATE 100 +# define PKCS7_F_PKCS7_ADD_CRL 101 +# define PKCS7_F_PKCS7_ADD_RECIPIENT_INFO 102 +# define PKCS7_F_PKCS7_ADD_SIGNATURE 131 +# define PKCS7_F_PKCS7_ADD_SIGNER 103 +# define PKCS7_F_PKCS7_BIO_ADD_DIGEST 125 +# define PKCS7_F_PKCS7_COPY_EXISTING_DIGEST 138 +# define PKCS7_F_PKCS7_CTRL 104 +# define PKCS7_F_PKCS7_DATADECODE 112 +# define PKCS7_F_PKCS7_DATAFINAL 128 +# define PKCS7_F_PKCS7_DATAINIT 105 +# define PKCS7_F_PKCS7_DATASIGN 106 +# define PKCS7_F_PKCS7_DATAVERIFY 107 +# define PKCS7_F_PKCS7_DECRYPT 114 +# define PKCS7_F_PKCS7_DECRYPT_RINFO 133 +# define PKCS7_F_PKCS7_ENCODE_RINFO 132 +# define PKCS7_F_PKCS7_ENCRYPT 115 +# define PKCS7_F_PKCS7_FINAL 134 +# define PKCS7_F_PKCS7_FIND_DIGEST 127 +# define PKCS7_F_PKCS7_GET0_SIGNERS 124 +# define PKCS7_F_PKCS7_RECIP_INFO_SET 130 +# define PKCS7_F_PKCS7_SET_CIPHER 108 +# define PKCS7_F_PKCS7_SET_CONTENT 109 +# define PKCS7_F_PKCS7_SET_DIGEST 126 +# define PKCS7_F_PKCS7_SET_TYPE 110 +# define PKCS7_F_PKCS7_SIGN 116 +# define PKCS7_F_PKCS7_SIGNATUREVERIFY 113 +# define PKCS7_F_PKCS7_SIGNER_INFO_SET 129 +# define PKCS7_F_PKCS7_SIGNER_INFO_SIGN 139 +# define PKCS7_F_PKCS7_SIGN_ADD_SIGNER 137 +# define PKCS7_F_PKCS7_SIMPLE_SMIMECAP 119 +# define PKCS7_F_PKCS7_VERIFY 117 +# define PKCS7_F_SMIME_READ_PKCS7 122 +# define PKCS7_F_SMIME_TEXT 123 + +/* Reason codes. */ +# define PKCS7_R_CERTIFICATE_VERIFY_ERROR 117 +# define PKCS7_R_CIPHER_HAS_NO_OBJECT_IDENTIFIER 144 +# define PKCS7_R_CIPHER_NOT_INITIALIZED 116 +# define PKCS7_R_CONTENT_AND_DATA_PRESENT 118 +# define PKCS7_R_CTRL_ERROR 152 +# define PKCS7_R_DECODE_ERROR 130 +# define PKCS7_R_DECRYPTED_KEY_IS_WRONG_LENGTH 100 +# define PKCS7_R_DECRYPT_ERROR 119 +# define PKCS7_R_DIGEST_FAILURE 101 +# define PKCS7_R_ENCRYPTION_CTRL_FAILURE 149 +# define PKCS7_R_ENCRYPTION_NOT_SUPPORTED_FOR_THIS_KEY_TYPE 150 +# define PKCS7_R_ERROR_ADDING_RECIPIENT 120 +# define PKCS7_R_ERROR_SETTING_CIPHER 121 +# define PKCS7_R_INVALID_MIME_TYPE 131 +# define PKCS7_R_INVALID_NULL_POINTER 143 +# define PKCS7_R_INVALID_SIGNED_DATA_TYPE 155 +# define PKCS7_R_MIME_NO_CONTENT_TYPE 132 +# define PKCS7_R_MIME_PARSE_ERROR 133 +# define PKCS7_R_MIME_SIG_PARSE_ERROR 134 +# define PKCS7_R_MISSING_CERIPEND_INFO 103 +# define PKCS7_R_NO_CONTENT 122 +# define PKCS7_R_NO_CONTENT_TYPE 135 +# define PKCS7_R_NO_DEFAULT_DIGEST 151 +# define PKCS7_R_NO_MATCHING_DIGEST_TYPE_FOUND 154 +# define PKCS7_R_NO_MULTIPART_BODY_FAILURE 136 +# define PKCS7_R_NO_MULTIPART_BOUNDARY 137 +# define PKCS7_R_NO_RECIPIENT_MATCHES_CERTIFICATE 115 +# define PKCS7_R_NO_RECIPIENT_MATCHES_KEY 146 +# define PKCS7_R_NO_SIGNATURES_ON_DATA 123 +# define PKCS7_R_NO_SIGNERS 142 +# define PKCS7_R_NO_SIG_CONTENT_TYPE 138 +# define PKCS7_R_OPERATION_NOT_SUPPORTED_ON_THIS_TYPE 104 +# define PKCS7_R_PKCS7_ADD_SIGNATURE_ERROR 124 +# define PKCS7_R_PKCS7_ADD_SIGNER_ERROR 153 +# define PKCS7_R_PKCS7_DATAFINAL 126 +# define PKCS7_R_PKCS7_DATAFINAL_ERROR 125 +# define PKCS7_R_PKCS7_DATASIGN 145 +# define PKCS7_R_PKCS7_PARSE_ERROR 139 +# define PKCS7_R_PKCS7_SIG_PARSE_ERROR 140 +# define PKCS7_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE 127 +# define PKCS7_R_SIGNATURE_FAILURE 105 +# define PKCS7_R_SIGNER_CERTIFICATE_NOT_FOUND 128 +# define PKCS7_R_SIGNING_CTRL_FAILURE 147 +# define PKCS7_R_SIGNING_NOT_SUPPORTED_FOR_THIS_KEY_TYPE 148 +# define PKCS7_R_SIG_INVALID_MIME_TYPE 141 +# define PKCS7_R_SMIME_TEXT_ERROR 129 +# define PKCS7_R_UNABLE_TO_FIND_CERTIFICATE 106 +# define PKCS7_R_UNABLE_TO_FIND_MEM_BIO 107 +# define PKCS7_R_UNABLE_TO_FIND_MESSAGE_DIGEST 108 +# define PKCS7_R_UNKNOWN_DIGEST_TYPE 109 +# define PKCS7_R_UNKNOWN_OPERATION 110 +# define PKCS7_R_UNSUPPORTED_CIPHER_TYPE 111 +# define PKCS7_R_UNSUPPORTED_CONTENT_TYPE 112 +# define PKCS7_R_WRONG_CONTENT_TYPE 113 +# define PKCS7_R_WRONG_PKCS7_TYPE 114 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/pqueue.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/pqueue.h new file mode 100644 index 0000000..d40d9c7 --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/pqueue.h @@ -0,0 +1,99 @@ +/* crypto/pqueue/pqueue.h */ +/* + * DTLS implementation written by Nagendra Modadugu + * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. + */ +/* ==================================================================== + * Copyright (c) 1999-2005 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_PQUEUE_H +# define HEADER_PQUEUE_H + +# include +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif +typedef struct _pqueue *pqueue; + +typedef struct _pitem { + unsigned char priority[8]; /* 64-bit value in big-endian encoding */ + void *data; + struct _pitem *next; +} pitem; + +typedef struct _pitem *piterator; + +pitem *pitem_new(unsigned char *prio64be, void *data); +void pitem_free(pitem *item); + +pqueue pqueue_new(void); +void pqueue_free(pqueue pq); + +pitem *pqueue_insert(pqueue pq, pitem *item); +pitem *pqueue_peek(pqueue pq); +pitem *pqueue_pop(pqueue pq); +pitem *pqueue_find(pqueue pq, unsigned char *prio64be); +pitem *pqueue_iterator(pqueue pq); +pitem *pqueue_next(piterator *iter); + +void pqueue_print(pqueue pq); +int pqueue_size(pqueue pq); + +#ifdef __cplusplus +} +#endif +#endif /* ! HEADER_PQUEUE_H */ diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/rand.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/rand.h new file mode 100644 index 0000000..2553afd --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/rand.h @@ -0,0 +1,150 @@ +/* crypto/rand/rand.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_RAND_H +# define HEADER_RAND_H + +# include +# include +# include + +# if defined(OPENSSL_SYS_WINDOWS) +# include +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +# if defined(OPENSSL_FIPS) +# define FIPS_RAND_SIZE_T size_t +# endif + +/* Already defined in ossl_typ.h */ +/* typedef struct rand_meth_st RAND_METHOD; */ + +struct rand_meth_st { + void (*seed) (const void *buf, int num); + int (*bytes) (unsigned char *buf, int num); + void (*cleanup) (void); + void (*add) (const void *buf, int num, double entropy); + int (*pseudorand) (unsigned char *buf, int num); + int (*status) (void); +}; + +# ifdef BN_DEBUG +extern int rand_predictable; +# endif + +int RAND_set_rand_method(const RAND_METHOD *meth); +const RAND_METHOD *RAND_get_rand_method(void); +# ifndef OPENSSL_NO_ENGINE +int RAND_set_rand_engine(ENGINE *engine); +# endif +RAND_METHOD *RAND_SSLeay(void); +void RAND_cleanup(void); +int RAND_bytes(unsigned char *buf, int num); +int RAND_pseudo_bytes(unsigned char *buf, int num); +void RAND_seed(const void *buf, int num); +void RAND_add(const void *buf, int num, double entropy); +int RAND_load_file(const char *file, long max_bytes); +int RAND_write_file(const char *file); +const char *RAND_file_name(char *file, size_t num); +int RAND_status(void); +int RAND_query_egd_bytes(const char *path, unsigned char *buf, int bytes); +int RAND_egd(const char *path); +int RAND_egd_bytes(const char *path, int bytes); +int RAND_poll(void); + +# if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_WIN32) + +void RAND_screen(void); +int RAND_event(UINT, WPARAM, LPARAM); + +# endif + +# ifdef OPENSSL_FIPS +void RAND_set_fips_drbg_type(int type, int flags); +int RAND_init_fips(void); +# endif + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_RAND_strings(void); + +/* Error codes for the RAND functions. */ + +/* Function codes. */ +# define RAND_F_RAND_GET_RAND_METHOD 101 +# define RAND_F_RAND_INIT_FIPS 102 +# define RAND_F_SSLEAY_RAND_BYTES 100 + +/* Reason codes. */ +# define RAND_R_DUAL_EC_DRBG_DISABLED 104 +# define RAND_R_ERROR_INITIALISING_DRBG 102 +# define RAND_R_ERROR_INSTANTIATING_DRBG 103 +# define RAND_R_NO_FIPS_RANDOM_METHOD_SET 101 +# define RAND_R_PRNG_NOT_SEEDED 100 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/rc2.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/rc2.h new file mode 100644 index 0000000..29d02d7 --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/rc2.h @@ -0,0 +1,103 @@ +/* crypto/rc2/rc2.h */ +/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_RC2_H +# define HEADER_RC2_H + +# include /* OPENSSL_NO_RC2, RC2_INT */ +# ifdef OPENSSL_NO_RC2 +# error RC2 is disabled. +# endif + +# define RC2_ENCRYPT 1 +# define RC2_DECRYPT 0 + +# define RC2_BLOCK 8 +# define RC2_KEY_LENGTH 16 + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct rc2_key_st { + RC2_INT data[64]; +} RC2_KEY; + +# ifdef OPENSSL_FIPS +void private_RC2_set_key(RC2_KEY *key, int len, const unsigned char *data, + int bits); +# endif +void RC2_set_key(RC2_KEY *key, int len, const unsigned char *data, int bits); +void RC2_ecb_encrypt(const unsigned char *in, unsigned char *out, + RC2_KEY *key, int enc); +void RC2_encrypt(unsigned long *data, RC2_KEY *key); +void RC2_decrypt(unsigned long *data, RC2_KEY *key); +void RC2_cbc_encrypt(const unsigned char *in, unsigned char *out, long length, + RC2_KEY *ks, unsigned char *iv, int enc); +void RC2_cfb64_encrypt(const unsigned char *in, unsigned char *out, + long length, RC2_KEY *schedule, unsigned char *ivec, + int *num, int enc); +void RC2_ofb64_encrypt(const unsigned char *in, unsigned char *out, + long length, RC2_KEY *schedule, unsigned char *ivec, + int *num); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/rc4.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/rc4.h new file mode 100644 index 0000000..39162b1 --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/rc4.h @@ -0,0 +1,88 @@ +/* crypto/rc4/rc4.h */ +/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_RC4_H +# define HEADER_RC4_H + +# include /* OPENSSL_NO_RC4, RC4_INT */ +# ifdef OPENSSL_NO_RC4 +# error RC4 is disabled. +# endif + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct rc4_key_st { + RC4_INT x, y; + RC4_INT data[256]; +} RC4_KEY; + +const char *RC4_options(void); +void RC4_set_key(RC4_KEY *key, int len, const unsigned char *data); +void private_RC4_set_key(RC4_KEY *key, int len, const unsigned char *data); +void RC4(RC4_KEY *key, size_t len, const unsigned char *indata, + unsigned char *outdata); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/ripemd.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/ripemd.h new file mode 100644 index 0000000..b88ef25 --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/ripemd.h @@ -0,0 +1,105 @@ +/* crypto/ripemd/ripemd.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_RIPEMD_H +# define HEADER_RIPEMD_H + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# ifdef OPENSSL_NO_RIPEMD +# error RIPEMD is disabled. +# endif + +# if defined(__LP32__) +# define RIPEMD160_LONG unsigned long +# elif defined(OPENSSL_SYS_CRAY) || defined(__ILP64__) +# define RIPEMD160_LONG unsigned long +# define RIPEMD160_LONG_LOG2 3 +# else +# define RIPEMD160_LONG unsigned int +# endif + +# define RIPEMD160_CBLOCK 64 +# define RIPEMD160_LBLOCK (RIPEMD160_CBLOCK/4) +# define RIPEMD160_DIGEST_LENGTH 20 + +typedef struct RIPEMD160state_st { + RIPEMD160_LONG A, B, C, D, E; + RIPEMD160_LONG Nl, Nh; + RIPEMD160_LONG data[RIPEMD160_LBLOCK]; + unsigned int num; +} RIPEMD160_CTX; + +# ifdef OPENSSL_FIPS +int private_RIPEMD160_Init(RIPEMD160_CTX *c); +# endif +int RIPEMD160_Init(RIPEMD160_CTX *c); +int RIPEMD160_Update(RIPEMD160_CTX *c, const void *data, size_t len); +int RIPEMD160_Final(unsigned char *md, RIPEMD160_CTX *c); +unsigned char *RIPEMD160(const unsigned char *d, size_t n, unsigned char *md); +void RIPEMD160_Transform(RIPEMD160_CTX *c, const unsigned char *b); +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/rsa.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/rsa.h new file mode 100644 index 0000000..d2ee374 --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/rsa.h @@ -0,0 +1,664 @@ +/* crypto/rsa/rsa.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_RSA_H +# define HEADER_RSA_H + +# include + +# ifndef OPENSSL_NO_BIO +# include +# endif +# include +# include +# ifndef OPENSSL_NO_DEPRECATED +# include +# endif + +# ifdef OPENSSL_NO_RSA +# error RSA is disabled. +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* Declared already in ossl_typ.h */ +/* typedef struct rsa_st RSA; */ +/* typedef struct rsa_meth_st RSA_METHOD; */ + +struct rsa_meth_st { + const char *name; + int (*rsa_pub_enc) (int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, int padding); + int (*rsa_pub_dec) (int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, int padding); + int (*rsa_priv_enc) (int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, int padding); + int (*rsa_priv_dec) (int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, int padding); + /* Can be null */ + int (*rsa_mod_exp) (BIGNUM *r0, const BIGNUM *I, RSA *rsa, BN_CTX *ctx); + /* Can be null */ + int (*bn_mod_exp) (BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx); + /* called at new */ + int (*init) (RSA *rsa); + /* called at free */ + int (*finish) (RSA *rsa); + /* RSA_METHOD_FLAG_* things */ + int flags; + /* may be needed! */ + char *app_data; + /* + * New sign and verify functions: some libraries don't allow arbitrary + * data to be signed/verified: this allows them to be used. Note: for + * this to work the RSA_public_decrypt() and RSA_private_encrypt() should + * *NOT* be used RSA_sign(), RSA_verify() should be used instead. Note: + * for backwards compatibility this functionality is only enabled if the + * RSA_FLAG_SIGN_VER option is set in 'flags'. + */ + int (*rsa_sign) (int type, + const unsigned char *m, unsigned int m_length, + unsigned char *sigret, unsigned int *siglen, + const RSA *rsa); + int (*rsa_verify) (int dtype, const unsigned char *m, + unsigned int m_length, const unsigned char *sigbuf, + unsigned int siglen, const RSA *rsa); + /* + * If this callback is NULL, the builtin software RSA key-gen will be + * used. This is for behavioural compatibility whilst the code gets + * rewired, but one day it would be nice to assume there are no such + * things as "builtin software" implementations. + */ + int (*rsa_keygen) (RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb); +}; + +struct rsa_st { + /* + * The first parameter is used to pickup errors where this is passed + * instead of aEVP_PKEY, it is set to 0 + */ + int pad; + long version; + const RSA_METHOD *meth; + /* functional reference if 'meth' is ENGINE-provided */ + ENGINE *engine; + BIGNUM *n; + BIGNUM *e; + BIGNUM *d; + BIGNUM *p; + BIGNUM *q; + BIGNUM *dmp1; + BIGNUM *dmq1; + BIGNUM *iqmp; + /* be careful using this if the RSA structure is shared */ + CRYPTO_EX_DATA ex_data; + int references; + int flags; + /* Used to cache montgomery values */ + BN_MONT_CTX *_method_mod_n; + BN_MONT_CTX *_method_mod_p; + BN_MONT_CTX *_method_mod_q; + /* + * all BIGNUM values are actually in the following data, if it is not + * NULL + */ + char *bignum_data; + BN_BLINDING *blinding; + BN_BLINDING *mt_blinding; +}; + +# ifndef OPENSSL_RSA_MAX_MODULUS_BITS +# define OPENSSL_RSA_MAX_MODULUS_BITS 16384 +# endif + +# ifndef OPENSSL_RSA_SMALL_MODULUS_BITS +# define OPENSSL_RSA_SMALL_MODULUS_BITS 3072 +# endif +# ifndef OPENSSL_RSA_MAX_PUBEXP_BITS + +/* exponent limit enforced for "large" modulus only */ +# define OPENSSL_RSA_MAX_PUBEXP_BITS 64 +# endif + +# define RSA_3 0x3L +# define RSA_F4 0x10001L + +# define RSA_METHOD_FLAG_NO_CHECK 0x0001/* don't check pub/private + * match */ + +# define RSA_FLAG_CACHE_PUBLIC 0x0002 +# define RSA_FLAG_CACHE_PRIVATE 0x0004 +# define RSA_FLAG_BLINDING 0x0008 +# define RSA_FLAG_THREAD_SAFE 0x0010 +/* + * This flag means the private key operations will be handled by rsa_mod_exp + * and that they do not depend on the private key components being present: + * for example a key stored in external hardware. Without this flag + * bn_mod_exp gets called when private key components are absent. + */ +# define RSA_FLAG_EXT_PKEY 0x0020 + +/* + * This flag in the RSA_METHOD enables the new rsa_sign, rsa_verify + * functions. + */ +# define RSA_FLAG_SIGN_VER 0x0040 + +/* + * new with 0.9.6j and 0.9.7b; the built-in + * RSA implementation now uses blinding by + * default (ignoring RSA_FLAG_BLINDING), + * but other engines might not need it + */ +# define RSA_FLAG_NO_BLINDING 0x0080 +/* + * new with 0.9.8f; the built-in RSA + * implementation now uses constant time + * operations by default in private key operations, + * e.g., constant time modular exponentiation, + * modular inverse without leaking branches, + * division without leaking branches. This + * flag disables these constant time + * operations and results in faster RSA + * private key operations. + */ +# define RSA_FLAG_NO_CONSTTIME 0x0100 +# ifdef OPENSSL_USE_DEPRECATED +/* deprecated name for the flag*/ +/* + * new with 0.9.7h; the built-in RSA + * implementation now uses constant time + * modular exponentiation for secret exponents + * by default. This flag causes the + * faster variable sliding window method to + * be used for all exponents. + */ +# define RSA_FLAG_NO_EXP_CONSTTIME RSA_FLAG_NO_CONSTTIME +# endif + +# define EVP_PKEY_CTX_set_rsa_padding(ctx, pad) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, -1, EVP_PKEY_CTRL_RSA_PADDING, \ + pad, NULL) + +# define EVP_PKEY_CTX_get_rsa_padding(ctx, ppad) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, -1, \ + EVP_PKEY_CTRL_GET_RSA_PADDING, 0, ppad) + +# define EVP_PKEY_CTX_set_rsa_pss_saltlen(ctx, len) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, \ + (EVP_PKEY_OP_SIGN|EVP_PKEY_OP_VERIFY), \ + EVP_PKEY_CTRL_RSA_PSS_SALTLEN, \ + len, NULL) + +# define EVP_PKEY_CTX_get_rsa_pss_saltlen(ctx, plen) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, \ + (EVP_PKEY_OP_SIGN|EVP_PKEY_OP_VERIFY), \ + EVP_PKEY_CTRL_GET_RSA_PSS_SALTLEN, \ + 0, plen) + +# define EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, bits) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, EVP_PKEY_OP_KEYGEN, \ + EVP_PKEY_CTRL_RSA_KEYGEN_BITS, bits, NULL) + +# define EVP_PKEY_CTX_set_rsa_keygen_pubexp(ctx, pubexp) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, EVP_PKEY_OP_KEYGEN, \ + EVP_PKEY_CTRL_RSA_KEYGEN_PUBEXP, 0, pubexp) + +# define EVP_PKEY_CTX_set_rsa_mgf1_md(ctx, md) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, \ + EVP_PKEY_OP_TYPE_SIG | EVP_PKEY_OP_TYPE_CRYPT, \ + EVP_PKEY_CTRL_RSA_MGF1_MD, 0, (void *)md) + +# define EVP_PKEY_CTX_set_rsa_oaep_md(ctx, md) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, EVP_PKEY_OP_TYPE_CRYPT, \ + EVP_PKEY_CTRL_RSA_OAEP_MD, 0, (void *)md) + +# define EVP_PKEY_CTX_get_rsa_mgf1_md(ctx, pmd) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, \ + EVP_PKEY_OP_TYPE_SIG | EVP_PKEY_OP_TYPE_CRYPT, \ + EVP_PKEY_CTRL_GET_RSA_MGF1_MD, 0, (void *)pmd) + +# define EVP_PKEY_CTX_get_rsa_oaep_md(ctx, pmd) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, EVP_PKEY_OP_TYPE_CRYPT, \ + EVP_PKEY_CTRL_GET_RSA_OAEP_MD, 0, (void *)pmd) + +# define EVP_PKEY_CTX_set0_rsa_oaep_label(ctx, l, llen) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, EVP_PKEY_OP_TYPE_CRYPT, \ + EVP_PKEY_CTRL_RSA_OAEP_LABEL, llen, (void *)l) + +# define EVP_PKEY_CTX_get0_rsa_oaep_label(ctx, l) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, EVP_PKEY_OP_TYPE_CRYPT, \ + EVP_PKEY_CTRL_GET_RSA_OAEP_LABEL, 0, (void *)l) + +# define EVP_PKEY_CTRL_RSA_PADDING (EVP_PKEY_ALG_CTRL + 1) +# define EVP_PKEY_CTRL_RSA_PSS_SALTLEN (EVP_PKEY_ALG_CTRL + 2) + +# define EVP_PKEY_CTRL_RSA_KEYGEN_BITS (EVP_PKEY_ALG_CTRL + 3) +# define EVP_PKEY_CTRL_RSA_KEYGEN_PUBEXP (EVP_PKEY_ALG_CTRL + 4) +# define EVP_PKEY_CTRL_RSA_MGF1_MD (EVP_PKEY_ALG_CTRL + 5) + +# define EVP_PKEY_CTRL_GET_RSA_PADDING (EVP_PKEY_ALG_CTRL + 6) +# define EVP_PKEY_CTRL_GET_RSA_PSS_SALTLEN (EVP_PKEY_ALG_CTRL + 7) +# define EVP_PKEY_CTRL_GET_RSA_MGF1_MD (EVP_PKEY_ALG_CTRL + 8) + +# define EVP_PKEY_CTRL_RSA_OAEP_MD (EVP_PKEY_ALG_CTRL + 9) +# define EVP_PKEY_CTRL_RSA_OAEP_LABEL (EVP_PKEY_ALG_CTRL + 10) + +# define EVP_PKEY_CTRL_GET_RSA_OAEP_MD (EVP_PKEY_ALG_CTRL + 11) +# define EVP_PKEY_CTRL_GET_RSA_OAEP_LABEL (EVP_PKEY_ALG_CTRL + 12) + +# define RSA_PKCS1_PADDING 1 +# define RSA_SSLV23_PADDING 2 +# define RSA_NO_PADDING 3 +# define RSA_PKCS1_OAEP_PADDING 4 +# define RSA_X931_PADDING 5 +/* EVP_PKEY_ only */ +# define RSA_PKCS1_PSS_PADDING 6 + +# define RSA_PKCS1_PADDING_SIZE 11 + +# define RSA_set_app_data(s,arg) RSA_set_ex_data(s,0,arg) +# define RSA_get_app_data(s) RSA_get_ex_data(s,0) + +RSA *RSA_new(void); +RSA *RSA_new_method(ENGINE *engine); +int RSA_size(const RSA *rsa); + +/* Deprecated version */ +# ifndef OPENSSL_NO_DEPRECATED +RSA *RSA_generate_key(int bits, unsigned long e, void + (*callback) (int, int, void *), void *cb_arg); +# endif /* !defined(OPENSSL_NO_DEPRECATED) */ + +/* New version */ +int RSA_generate_key_ex(RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb); + +int RSA_check_key(const RSA *); + /* next 4 return -1 on error */ +int RSA_public_encrypt(int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, int padding); +int RSA_private_encrypt(int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, int padding); +int RSA_public_decrypt(int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, int padding); +int RSA_private_decrypt(int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, int padding); +void RSA_free(RSA *r); +/* "up" the RSA object's reference count */ +int RSA_up_ref(RSA *r); + +int RSA_flags(const RSA *r); + +void RSA_set_default_method(const RSA_METHOD *meth); +const RSA_METHOD *RSA_get_default_method(void); +const RSA_METHOD *RSA_get_method(const RSA *rsa); +int RSA_set_method(RSA *rsa, const RSA_METHOD *meth); + +/* This function needs the memory locking malloc callbacks to be installed */ +int RSA_memory_lock(RSA *r); + +/* these are the actual SSLeay RSA functions */ +const RSA_METHOD *RSA_PKCS1_SSLeay(void); + +const RSA_METHOD *RSA_null_method(void); + +DECLARE_ASN1_ENCODE_FUNCTIONS_const(RSA, RSAPublicKey) +DECLARE_ASN1_ENCODE_FUNCTIONS_const(RSA, RSAPrivateKey) + +typedef struct rsa_pss_params_st { + X509_ALGOR *hashAlgorithm; + X509_ALGOR *maskGenAlgorithm; + ASN1_INTEGER *saltLength; + ASN1_INTEGER *trailerField; +} RSA_PSS_PARAMS; + +DECLARE_ASN1_FUNCTIONS(RSA_PSS_PARAMS) + +typedef struct rsa_oaep_params_st { + X509_ALGOR *hashFunc; + X509_ALGOR *maskGenFunc; + X509_ALGOR *pSourceFunc; +} RSA_OAEP_PARAMS; + +DECLARE_ASN1_FUNCTIONS(RSA_OAEP_PARAMS) + +# ifndef OPENSSL_NO_FP_API +int RSA_print_fp(FILE *fp, const RSA *r, int offset); +# endif + +# ifndef OPENSSL_NO_BIO +int RSA_print(BIO *bp, const RSA *r, int offset); +# endif + +# ifndef OPENSSL_NO_RC4 +int i2d_RSA_NET(const RSA *a, unsigned char **pp, + int (*cb) (char *buf, int len, const char *prompt, + int verify), int sgckey); +RSA *d2i_RSA_NET(RSA **a, const unsigned char **pp, long length, + int (*cb) (char *buf, int len, const char *prompt, + int verify), int sgckey); + +int i2d_Netscape_RSA(const RSA *a, unsigned char **pp, + int (*cb) (char *buf, int len, const char *prompt, + int verify)); +RSA *d2i_Netscape_RSA(RSA **a, const unsigned char **pp, long length, + int (*cb) (char *buf, int len, const char *prompt, + int verify)); +# endif + +/* + * The following 2 functions sign and verify a X509_SIG ASN1 object inside + * PKCS#1 padded RSA encryption + */ +int RSA_sign(int type, const unsigned char *m, unsigned int m_length, + unsigned char *sigret, unsigned int *siglen, RSA *rsa); +int RSA_verify(int type, const unsigned char *m, unsigned int m_length, + const unsigned char *sigbuf, unsigned int siglen, RSA *rsa); + +/* + * The following 2 function sign and verify a ASN1_OCTET_STRING object inside + * PKCS#1 padded RSA encryption + */ +int RSA_sign_ASN1_OCTET_STRING(int type, + const unsigned char *m, unsigned int m_length, + unsigned char *sigret, unsigned int *siglen, + RSA *rsa); +int RSA_verify_ASN1_OCTET_STRING(int type, const unsigned char *m, + unsigned int m_length, unsigned char *sigbuf, + unsigned int siglen, RSA *rsa); + +int RSA_blinding_on(RSA *rsa, BN_CTX *ctx); +void RSA_blinding_off(RSA *rsa); +BN_BLINDING *RSA_setup_blinding(RSA *rsa, BN_CTX *ctx); + +int RSA_padding_add_PKCS1_type_1(unsigned char *to, int tlen, + const unsigned char *f, int fl); +int RSA_padding_check_PKCS1_type_1(unsigned char *to, int tlen, + const unsigned char *f, int fl, + int rsa_len); +int RSA_padding_add_PKCS1_type_2(unsigned char *to, int tlen, + const unsigned char *f, int fl); +int RSA_padding_check_PKCS1_type_2(unsigned char *to, int tlen, + const unsigned char *f, int fl, + int rsa_len); +int PKCS1_MGF1(unsigned char *mask, long len, const unsigned char *seed, + long seedlen, const EVP_MD *dgst); +int RSA_padding_add_PKCS1_OAEP(unsigned char *to, int tlen, + const unsigned char *f, int fl, + const unsigned char *p, int pl); +int RSA_padding_check_PKCS1_OAEP(unsigned char *to, int tlen, + const unsigned char *f, int fl, int rsa_len, + const unsigned char *p, int pl); +int RSA_padding_add_PKCS1_OAEP_mgf1(unsigned char *to, int tlen, + const unsigned char *from, int flen, + const unsigned char *param, int plen, + const EVP_MD *md, const EVP_MD *mgf1md); +int RSA_padding_check_PKCS1_OAEP_mgf1(unsigned char *to, int tlen, + const unsigned char *from, int flen, + int num, const unsigned char *param, + int plen, const EVP_MD *md, + const EVP_MD *mgf1md); +int RSA_padding_add_SSLv23(unsigned char *to, int tlen, + const unsigned char *f, int fl); +int RSA_padding_check_SSLv23(unsigned char *to, int tlen, + const unsigned char *f, int fl, int rsa_len); +int RSA_padding_add_none(unsigned char *to, int tlen, const unsigned char *f, + int fl); +int RSA_padding_check_none(unsigned char *to, int tlen, + const unsigned char *f, int fl, int rsa_len); +int RSA_padding_add_X931(unsigned char *to, int tlen, const unsigned char *f, + int fl); +int RSA_padding_check_X931(unsigned char *to, int tlen, + const unsigned char *f, int fl, int rsa_len); +int RSA_X931_hash_id(int nid); + +int RSA_verify_PKCS1_PSS(RSA *rsa, const unsigned char *mHash, + const EVP_MD *Hash, const unsigned char *EM, + int sLen); +int RSA_padding_add_PKCS1_PSS(RSA *rsa, unsigned char *EM, + const unsigned char *mHash, const EVP_MD *Hash, + int sLen); + +int RSA_verify_PKCS1_PSS_mgf1(RSA *rsa, const unsigned char *mHash, + const EVP_MD *Hash, const EVP_MD *mgf1Hash, + const unsigned char *EM, int sLen); + +int RSA_padding_add_PKCS1_PSS_mgf1(RSA *rsa, unsigned char *EM, + const unsigned char *mHash, + const EVP_MD *Hash, const EVP_MD *mgf1Hash, + int sLen); + +int RSA_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); +int RSA_set_ex_data(RSA *r, int idx, void *arg); +void *RSA_get_ex_data(const RSA *r, int idx); + +RSA *RSAPublicKey_dup(RSA *rsa); +RSA *RSAPrivateKey_dup(RSA *rsa); + +/* + * If this flag is set the RSA method is FIPS compliant and can be used in + * FIPS mode. This is set in the validated module method. If an application + * sets this flag in its own methods it is its responsibility to ensure the + * result is compliant. + */ + +# define RSA_FLAG_FIPS_METHOD 0x0400 + +/* + * If this flag is set the operations normally disabled in FIPS mode are + * permitted it is then the applications responsibility to ensure that the + * usage is compliant. + */ + +# define RSA_FLAG_NON_FIPS_ALLOW 0x0400 +/* + * Application has decided PRNG is good enough to generate a key: don't + * check. + */ +# define RSA_FLAG_CHECKED 0x0800 + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_RSA_strings(void); + +/* Error codes for the RSA functions. */ + +/* Function codes. */ +# define RSA_F_CHECK_PADDING_MD 140 +# define RSA_F_DO_RSA_PRINT 146 +# define RSA_F_INT_RSA_VERIFY 145 +# define RSA_F_MEMORY_LOCK 100 +# define RSA_F_OLD_RSA_PRIV_DECODE 147 +# define RSA_F_PKEY_RSA_CTRL 143 +# define RSA_F_PKEY_RSA_CTRL_STR 144 +# define RSA_F_PKEY_RSA_SIGN 142 +# define RSA_F_PKEY_RSA_VERIFY 154 +# define RSA_F_PKEY_RSA_VERIFYRECOVER 141 +# define RSA_F_RSA_ALGOR_TO_MD 157 +# define RSA_F_RSA_BUILTIN_KEYGEN 129 +# define RSA_F_RSA_CHECK_KEY 123 +# define RSA_F_RSA_CMS_DECRYPT 158 +# define RSA_F_RSA_EAY_PRIVATE_DECRYPT 101 +# define RSA_F_RSA_EAY_PRIVATE_ENCRYPT 102 +# define RSA_F_RSA_EAY_PUBLIC_DECRYPT 103 +# define RSA_F_RSA_EAY_PUBLIC_ENCRYPT 104 +# define RSA_F_RSA_GENERATE_KEY 105 +# define RSA_F_RSA_GENERATE_KEY_EX 155 +# define RSA_F_RSA_ITEM_VERIFY 156 +# define RSA_F_RSA_MEMORY_LOCK 130 +# define RSA_F_RSA_MGF1_TO_MD 159 +# define RSA_F_RSA_NEW_METHOD 106 +# define RSA_F_RSA_NULL 124 +# define RSA_F_RSA_NULL_MOD_EXP 131 +# define RSA_F_RSA_NULL_PRIVATE_DECRYPT 132 +# define RSA_F_RSA_NULL_PRIVATE_ENCRYPT 133 +# define RSA_F_RSA_NULL_PUBLIC_DECRYPT 134 +# define RSA_F_RSA_NULL_PUBLIC_ENCRYPT 135 +# define RSA_F_RSA_PADDING_ADD_NONE 107 +# define RSA_F_RSA_PADDING_ADD_PKCS1_OAEP 121 +# define RSA_F_RSA_PADDING_ADD_PKCS1_OAEP_MGF1 160 +# define RSA_F_RSA_PADDING_ADD_PKCS1_PSS 125 +# define RSA_F_RSA_PADDING_ADD_PKCS1_PSS_MGF1 148 +# define RSA_F_RSA_PADDING_ADD_PKCS1_TYPE_1 108 +# define RSA_F_RSA_PADDING_ADD_PKCS1_TYPE_2 109 +# define RSA_F_RSA_PADDING_ADD_SSLV23 110 +# define RSA_F_RSA_PADDING_ADD_X931 127 +# define RSA_F_RSA_PADDING_CHECK_NONE 111 +# define RSA_F_RSA_PADDING_CHECK_PKCS1_OAEP 122 +# define RSA_F_RSA_PADDING_CHECK_PKCS1_OAEP_MGF1 161 +# define RSA_F_RSA_PADDING_CHECK_PKCS1_TYPE_1 112 +# define RSA_F_RSA_PADDING_CHECK_PKCS1_TYPE_2 113 +# define RSA_F_RSA_PADDING_CHECK_SSLV23 114 +# define RSA_F_RSA_PADDING_CHECK_X931 128 +# define RSA_F_RSA_PRINT 115 +# define RSA_F_RSA_PRINT_FP 116 +# define RSA_F_RSA_PRIVATE_DECRYPT 150 +# define RSA_F_RSA_PRIVATE_ENCRYPT 151 +# define RSA_F_RSA_PRIV_DECODE 137 +# define RSA_F_RSA_PRIV_ENCODE 138 +# define RSA_F_RSA_PSS_TO_CTX 162 +# define RSA_F_RSA_PUBLIC_DECRYPT 152 +# define RSA_F_RSA_PUBLIC_ENCRYPT 153 +# define RSA_F_RSA_PUB_DECODE 139 +# define RSA_F_RSA_SETUP_BLINDING 136 +# define RSA_F_RSA_SIGN 117 +# define RSA_F_RSA_SIGN_ASN1_OCTET_STRING 118 +# define RSA_F_RSA_VERIFY 119 +# define RSA_F_RSA_VERIFY_ASN1_OCTET_STRING 120 +# define RSA_F_RSA_VERIFY_PKCS1_PSS 126 +# define RSA_F_RSA_VERIFY_PKCS1_PSS_MGF1 149 + +/* Reason codes. */ +# define RSA_R_ALGORITHM_MISMATCH 100 +# define RSA_R_BAD_E_VALUE 101 +# define RSA_R_BAD_FIXED_HEADER_DECRYPT 102 +# define RSA_R_BAD_PAD_BYTE_COUNT 103 +# define RSA_R_BAD_SIGNATURE 104 +# define RSA_R_BLOCK_TYPE_IS_NOT_01 106 +# define RSA_R_BLOCK_TYPE_IS_NOT_02 107 +# define RSA_R_DATA_GREATER_THAN_MOD_LEN 108 +# define RSA_R_DATA_TOO_LARGE 109 +# define RSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE 110 +# define RSA_R_DATA_TOO_LARGE_FOR_MODULUS 132 +# define RSA_R_DATA_TOO_SMALL 111 +# define RSA_R_DATA_TOO_SMALL_FOR_KEY_SIZE 122 +# define RSA_R_DIGEST_DOES_NOT_MATCH 166 +# define RSA_R_DIGEST_TOO_BIG_FOR_RSA_KEY 112 +# define RSA_R_DMP1_NOT_CONGRUENT_TO_D 124 +# define RSA_R_DMQ1_NOT_CONGRUENT_TO_D 125 +# define RSA_R_D_E_NOT_CONGRUENT_TO_1 123 +# define RSA_R_FIRST_OCTET_INVALID 133 +# define RSA_R_ILLEGAL_OR_UNSUPPORTED_PADDING_MODE 144 +# define RSA_R_INVALID_DIGEST 160 +# define RSA_R_INVALID_DIGEST_LENGTH 143 +# define RSA_R_INVALID_HEADER 137 +# define RSA_R_INVALID_KEYBITS 145 +# define RSA_R_INVALID_LABEL 161 +# define RSA_R_INVALID_MESSAGE_LENGTH 131 +# define RSA_R_INVALID_MGF1_MD 156 +# define RSA_R_INVALID_OAEP_PARAMETERS 162 +# define RSA_R_INVALID_PADDING 138 +# define RSA_R_INVALID_PADDING_MODE 141 +# define RSA_R_INVALID_PSS_PARAMETERS 149 +# define RSA_R_INVALID_PSS_SALTLEN 146 +# define RSA_R_INVALID_SALT_LENGTH 150 +# define RSA_R_INVALID_TRAILER 139 +# define RSA_R_INVALID_X931_DIGEST 142 +# define RSA_R_IQMP_NOT_INVERSE_OF_Q 126 +# define RSA_R_KEY_SIZE_TOO_SMALL 120 +# define RSA_R_LAST_OCTET_INVALID 134 +# define RSA_R_MODULUS_TOO_LARGE 105 +# define RSA_R_NON_FIPS_RSA_METHOD 157 +# define RSA_R_NO_PUBLIC_EXPONENT 140 +# define RSA_R_NULL_BEFORE_BLOCK_MISSING 113 +# define RSA_R_N_DOES_NOT_EQUAL_P_Q 127 +# define RSA_R_OAEP_DECODING_ERROR 121 +# define RSA_R_OPERATION_NOT_ALLOWED_IN_FIPS_MODE 158 +# define RSA_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE 148 +# define RSA_R_PADDING_CHECK_FAILED 114 +# define RSA_R_PKCS_DECODING_ERROR 159 +# define RSA_R_P_NOT_PRIME 128 +# define RSA_R_Q_NOT_PRIME 129 +# define RSA_R_RSA_OPERATIONS_NOT_SUPPORTED 130 +# define RSA_R_SLEN_CHECK_FAILED 136 +# define RSA_R_SLEN_RECOVERY_FAILED 135 +# define RSA_R_SSLV3_ROLLBACK_ATTACK 115 +# define RSA_R_THE_ASN1_OBJECT_IDENTIFIER_IS_NOT_KNOWN_FOR_THIS_MD 116 +# define RSA_R_UNKNOWN_ALGORITHM_TYPE 117 +# define RSA_R_UNKNOWN_DIGEST 163 +# define RSA_R_UNKNOWN_MASK_DIGEST 151 +# define RSA_R_UNKNOWN_PADDING_TYPE 118 +# define RSA_R_UNKNOWN_PSS_DIGEST 152 +# define RSA_R_UNSUPPORTED_ENCRYPTION_TYPE 164 +# define RSA_R_UNSUPPORTED_LABEL_SOURCE 165 +# define RSA_R_UNSUPPORTED_MASK_ALGORITHM 153 +# define RSA_R_UNSUPPORTED_MASK_PARAMETER 154 +# define RSA_R_UNSUPPORTED_SIGNATURE_TYPE 155 +# define RSA_R_VALUE_MISSING 147 +# define RSA_R_WRONG_SIGNATURE_LENGTH 119 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/safestack.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/safestack.h new file mode 100644 index 0000000..1d4f87e --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/safestack.h @@ -0,0 +1,2672 @@ +/* ==================================================================== + * Copyright (c) 1999 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_SAFESTACK_H +# define HEADER_SAFESTACK_H + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# ifndef CHECKED_PTR_OF +# define CHECKED_PTR_OF(type, p) \ + ((void*) (1 ? p : (type*)0)) +# endif + +/* + * In C++ we get problems because an explicit cast is needed from (void *) we + * use CHECKED_STACK_OF to ensure the correct type is passed in the macros + * below. + */ + +# define CHECKED_STACK_OF(type, p) \ + ((_STACK*) (1 ? p : (STACK_OF(type)*)0)) + +# define CHECKED_SK_COPY_FUNC(type, p) \ + ((void *(*)(void *)) ((1 ? p : (type *(*)(const type *))0))) + +# define CHECKED_SK_FREE_FUNC(type, p) \ + ((void (*)(void *)) ((1 ? p : (void (*)(type *))0))) + +# define CHECKED_SK_CMP_FUNC(type, p) \ + ((int (*)(const void *, const void *)) \ + ((1 ? p : (int (*)(const type * const *, const type * const *))0))) + +# define STACK_OF(type) struct stack_st_##type +# define PREDECLARE_STACK_OF(type) STACK_OF(type); + +# define DECLARE_STACK_OF(type) \ +STACK_OF(type) \ + { \ + _STACK stack; \ + }; +# define DECLARE_SPECIAL_STACK_OF(type, type2) \ +STACK_OF(type) \ + { \ + _STACK stack; \ + }; + +/* nada (obsolete in new safestack approach)*/ +# define IMPLEMENT_STACK_OF(type) + +/*- + * Strings are special: normally an lhash entry will point to a single + * (somewhat) mutable object. In the case of strings: + * + * a) Instead of a single char, there is an array of chars, NUL-terminated. + * b) The string may have be immutable. + * + * So, they need their own declarations. Especially important for + * type-checking tools, such as Deputy. + * + * In practice, however, it appears to be hard to have a const + * string. For now, I'm settling for dealing with the fact it is a + * string at all. + */ +typedef char *OPENSSL_STRING; + +typedef const char *OPENSSL_CSTRING; + +/* + * Confusingly, LHASH_OF(STRING) deals with char ** throughout, but + * STACK_OF(STRING) is really more like STACK_OF(char), only, as mentioned + * above, instead of a single char each entry is a NUL-terminated array of + * chars. So, we have to implement STRING specially for STACK_OF. This is + * dealt with in the autogenerated macros below. + */ + +DECLARE_SPECIAL_STACK_OF(OPENSSL_STRING, char) + +/* + * Similarly, we sometimes use a block of characters, NOT nul-terminated. + * These should also be distinguished from "normal" stacks. + */ +typedef void *OPENSSL_BLOCK; +DECLARE_SPECIAL_STACK_OF(OPENSSL_BLOCK, void) + +/* + * SKM_sk_... stack macros are internal to safestack.h: never use them + * directly, use sk__... instead + */ +# define SKM_sk_new(type, cmp) \ + ((STACK_OF(type) *)sk_new(CHECKED_SK_CMP_FUNC(type, cmp))) +# define SKM_sk_new_null(type) \ + ((STACK_OF(type) *)sk_new_null()) +# define SKM_sk_free(type, st) \ + sk_free(CHECKED_STACK_OF(type, st)) +# define SKM_sk_num(type, st) \ + sk_num(CHECKED_STACK_OF(type, st)) +# define SKM_sk_value(type, st,i) \ + ((type *)sk_value(CHECKED_STACK_OF(type, st), i)) +# define SKM_sk_set(type, st,i,val) \ + sk_set(CHECKED_STACK_OF(type, st), i, CHECKED_PTR_OF(type, val)) +# define SKM_sk_zero(type, st) \ + sk_zero(CHECKED_STACK_OF(type, st)) +# define SKM_sk_push(type, st, val) \ + sk_push(CHECKED_STACK_OF(type, st), CHECKED_PTR_OF(type, val)) +# define SKM_sk_unshift(type, st, val) \ + sk_unshift(CHECKED_STACK_OF(type, st), CHECKED_PTR_OF(type, val)) +# define SKM_sk_find(type, st, val) \ + sk_find(CHECKED_STACK_OF(type, st), CHECKED_PTR_OF(type, val)) +# define SKM_sk_find_ex(type, st, val) \ + sk_find_ex(CHECKED_STACK_OF(type, st), \ + CHECKED_PTR_OF(type, val)) +# define SKM_sk_delete(type, st, i) \ + (type *)sk_delete(CHECKED_STACK_OF(type, st), i) +# define SKM_sk_delete_ptr(type, st, ptr) \ + (type *)sk_delete_ptr(CHECKED_STACK_OF(type, st), CHECKED_PTR_OF(type, ptr)) +# define SKM_sk_insert(type, st,val, i) \ + sk_insert(CHECKED_STACK_OF(type, st), CHECKED_PTR_OF(type, val), i) +# define SKM_sk_set_cmp_func(type, st, cmp) \ + ((int (*)(const type * const *,const type * const *)) \ + sk_set_cmp_func(CHECKED_STACK_OF(type, st), CHECKED_SK_CMP_FUNC(type, cmp))) +# define SKM_sk_dup(type, st) \ + (STACK_OF(type) *)sk_dup(CHECKED_STACK_OF(type, st)) +# define SKM_sk_pop_free(type, st, free_func) \ + sk_pop_free(CHECKED_STACK_OF(type, st), CHECKED_SK_FREE_FUNC(type, free_func)) +# define SKM_sk_deep_copy(type, st, copy_func, free_func) \ + (STACK_OF(type) *)sk_deep_copy(CHECKED_STACK_OF(type, st), CHECKED_SK_COPY_FUNC(type, copy_func), CHECKED_SK_FREE_FUNC(type, free_func)) +# define SKM_sk_shift(type, st) \ + (type *)sk_shift(CHECKED_STACK_OF(type, st)) +# define SKM_sk_pop(type, st) \ + (type *)sk_pop(CHECKED_STACK_OF(type, st)) +# define SKM_sk_sort(type, st) \ + sk_sort(CHECKED_STACK_OF(type, st)) +# define SKM_sk_is_sorted(type, st) \ + sk_is_sorted(CHECKED_STACK_OF(type, st)) +# define SKM_ASN1_SET_OF_d2i(type, st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + (STACK_OF(type) *)d2i_ASN1_SET( \ + (STACK_OF(OPENSSL_BLOCK) **)CHECKED_PTR_OF(STACK_OF(type)*, st), \ + pp, length, \ + CHECKED_D2I_OF(type, d2i_func), \ + CHECKED_SK_FREE_FUNC(type, free_func), \ + ex_tag, ex_class) +# define SKM_ASN1_SET_OF_i2d(type, st, pp, i2d_func, ex_tag, ex_class, is_set) \ + i2d_ASN1_SET((STACK_OF(OPENSSL_BLOCK) *)CHECKED_STACK_OF(type, st), pp, \ + CHECKED_I2D_OF(type, i2d_func), \ + ex_tag, ex_class, is_set) +# define SKM_ASN1_seq_pack(type, st, i2d_func, buf, len) \ + ASN1_seq_pack(CHECKED_PTR_OF(STACK_OF(type), st), \ + CHECKED_I2D_OF(type, i2d_func), buf, len) +# define SKM_ASN1_seq_unpack(type, buf, len, d2i_func, free_func) \ + (STACK_OF(type) *)ASN1_seq_unpack(buf, len, CHECKED_D2I_OF(type, d2i_func), CHECKED_SK_FREE_FUNC(type, free_func)) +# define SKM_PKCS12_decrypt_d2i(type, algor, d2i_func, free_func, pass, passlen, oct, seq) \ + (STACK_OF(type) *)PKCS12_decrypt_d2i(algor, \ + CHECKED_D2I_OF(type, d2i_func), \ + CHECKED_SK_FREE_FUNC(type, free_func), \ + pass, passlen, oct, seq) +/* + * This block of defines is updated by util/mkstack.pl, please do not touch! + */ +# define sk_ACCESS_DESCRIPTION_new(cmp) SKM_sk_new(ACCESS_DESCRIPTION, (cmp)) +# define sk_ACCESS_DESCRIPTION_new_null() SKM_sk_new_null(ACCESS_DESCRIPTION) +# define sk_ACCESS_DESCRIPTION_free(st) SKM_sk_free(ACCESS_DESCRIPTION, (st)) +# define sk_ACCESS_DESCRIPTION_num(st) SKM_sk_num(ACCESS_DESCRIPTION, (st)) +# define sk_ACCESS_DESCRIPTION_value(st, i) SKM_sk_value(ACCESS_DESCRIPTION, (st), (i)) +# define sk_ACCESS_DESCRIPTION_set(st, i, val) SKM_sk_set(ACCESS_DESCRIPTION, (st), (i), (val)) +# define sk_ACCESS_DESCRIPTION_zero(st) SKM_sk_zero(ACCESS_DESCRIPTION, (st)) +# define sk_ACCESS_DESCRIPTION_push(st, val) SKM_sk_push(ACCESS_DESCRIPTION, (st), (val)) +# define sk_ACCESS_DESCRIPTION_unshift(st, val) SKM_sk_unshift(ACCESS_DESCRIPTION, (st), (val)) +# define sk_ACCESS_DESCRIPTION_find(st, val) SKM_sk_find(ACCESS_DESCRIPTION, (st), (val)) +# define sk_ACCESS_DESCRIPTION_find_ex(st, val) SKM_sk_find_ex(ACCESS_DESCRIPTION, (st), (val)) +# define sk_ACCESS_DESCRIPTION_delete(st, i) SKM_sk_delete(ACCESS_DESCRIPTION, (st), (i)) +# define sk_ACCESS_DESCRIPTION_delete_ptr(st, ptr) SKM_sk_delete_ptr(ACCESS_DESCRIPTION, (st), (ptr)) +# define sk_ACCESS_DESCRIPTION_insert(st, val, i) SKM_sk_insert(ACCESS_DESCRIPTION, (st), (val), (i)) +# define sk_ACCESS_DESCRIPTION_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ACCESS_DESCRIPTION, (st), (cmp)) +# define sk_ACCESS_DESCRIPTION_dup(st) SKM_sk_dup(ACCESS_DESCRIPTION, st) +# define sk_ACCESS_DESCRIPTION_pop_free(st, free_func) SKM_sk_pop_free(ACCESS_DESCRIPTION, (st), (free_func)) +# define sk_ACCESS_DESCRIPTION_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(ACCESS_DESCRIPTION, (st), (copy_func), (free_func)) +# define sk_ACCESS_DESCRIPTION_shift(st) SKM_sk_shift(ACCESS_DESCRIPTION, (st)) +# define sk_ACCESS_DESCRIPTION_pop(st) SKM_sk_pop(ACCESS_DESCRIPTION, (st)) +# define sk_ACCESS_DESCRIPTION_sort(st) SKM_sk_sort(ACCESS_DESCRIPTION, (st)) +# define sk_ACCESS_DESCRIPTION_is_sorted(st) SKM_sk_is_sorted(ACCESS_DESCRIPTION, (st)) +# define sk_ASIdOrRange_new(cmp) SKM_sk_new(ASIdOrRange, (cmp)) +# define sk_ASIdOrRange_new_null() SKM_sk_new_null(ASIdOrRange) +# define sk_ASIdOrRange_free(st) SKM_sk_free(ASIdOrRange, (st)) +# define sk_ASIdOrRange_num(st) SKM_sk_num(ASIdOrRange, (st)) +# define sk_ASIdOrRange_value(st, i) SKM_sk_value(ASIdOrRange, (st), (i)) +# define sk_ASIdOrRange_set(st, i, val) SKM_sk_set(ASIdOrRange, (st), (i), (val)) +# define sk_ASIdOrRange_zero(st) SKM_sk_zero(ASIdOrRange, (st)) +# define sk_ASIdOrRange_push(st, val) SKM_sk_push(ASIdOrRange, (st), (val)) +# define sk_ASIdOrRange_unshift(st, val) SKM_sk_unshift(ASIdOrRange, (st), (val)) +# define sk_ASIdOrRange_find(st, val) SKM_sk_find(ASIdOrRange, (st), (val)) +# define sk_ASIdOrRange_find_ex(st, val) SKM_sk_find_ex(ASIdOrRange, (st), (val)) +# define sk_ASIdOrRange_delete(st, i) SKM_sk_delete(ASIdOrRange, (st), (i)) +# define sk_ASIdOrRange_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASIdOrRange, (st), (ptr)) +# define sk_ASIdOrRange_insert(st, val, i) SKM_sk_insert(ASIdOrRange, (st), (val), (i)) +# define sk_ASIdOrRange_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASIdOrRange, (st), (cmp)) +# define sk_ASIdOrRange_dup(st) SKM_sk_dup(ASIdOrRange, st) +# define sk_ASIdOrRange_pop_free(st, free_func) SKM_sk_pop_free(ASIdOrRange, (st), (free_func)) +# define sk_ASIdOrRange_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(ASIdOrRange, (st), (copy_func), (free_func)) +# define sk_ASIdOrRange_shift(st) SKM_sk_shift(ASIdOrRange, (st)) +# define sk_ASIdOrRange_pop(st) SKM_sk_pop(ASIdOrRange, (st)) +# define sk_ASIdOrRange_sort(st) SKM_sk_sort(ASIdOrRange, (st)) +# define sk_ASIdOrRange_is_sorted(st) SKM_sk_is_sorted(ASIdOrRange, (st)) +# define sk_ASN1_GENERALSTRING_new(cmp) SKM_sk_new(ASN1_GENERALSTRING, (cmp)) +# define sk_ASN1_GENERALSTRING_new_null() SKM_sk_new_null(ASN1_GENERALSTRING) +# define sk_ASN1_GENERALSTRING_free(st) SKM_sk_free(ASN1_GENERALSTRING, (st)) +# define sk_ASN1_GENERALSTRING_num(st) SKM_sk_num(ASN1_GENERALSTRING, (st)) +# define sk_ASN1_GENERALSTRING_value(st, i) SKM_sk_value(ASN1_GENERALSTRING, (st), (i)) +# define sk_ASN1_GENERALSTRING_set(st, i, val) SKM_sk_set(ASN1_GENERALSTRING, (st), (i), (val)) +# define sk_ASN1_GENERALSTRING_zero(st) SKM_sk_zero(ASN1_GENERALSTRING, (st)) +# define sk_ASN1_GENERALSTRING_push(st, val) SKM_sk_push(ASN1_GENERALSTRING, (st), (val)) +# define sk_ASN1_GENERALSTRING_unshift(st, val) SKM_sk_unshift(ASN1_GENERALSTRING, (st), (val)) +# define sk_ASN1_GENERALSTRING_find(st, val) SKM_sk_find(ASN1_GENERALSTRING, (st), (val)) +# define sk_ASN1_GENERALSTRING_find_ex(st, val) SKM_sk_find_ex(ASN1_GENERALSTRING, (st), (val)) +# define sk_ASN1_GENERALSTRING_delete(st, i) SKM_sk_delete(ASN1_GENERALSTRING, (st), (i)) +# define sk_ASN1_GENERALSTRING_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASN1_GENERALSTRING, (st), (ptr)) +# define sk_ASN1_GENERALSTRING_insert(st, val, i) SKM_sk_insert(ASN1_GENERALSTRING, (st), (val), (i)) +# define sk_ASN1_GENERALSTRING_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASN1_GENERALSTRING, (st), (cmp)) +# define sk_ASN1_GENERALSTRING_dup(st) SKM_sk_dup(ASN1_GENERALSTRING, st) +# define sk_ASN1_GENERALSTRING_pop_free(st, free_func) SKM_sk_pop_free(ASN1_GENERALSTRING, (st), (free_func)) +# define sk_ASN1_GENERALSTRING_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(ASN1_GENERALSTRING, (st), (copy_func), (free_func)) +# define sk_ASN1_GENERALSTRING_shift(st) SKM_sk_shift(ASN1_GENERALSTRING, (st)) +# define sk_ASN1_GENERALSTRING_pop(st) SKM_sk_pop(ASN1_GENERALSTRING, (st)) +# define sk_ASN1_GENERALSTRING_sort(st) SKM_sk_sort(ASN1_GENERALSTRING, (st)) +# define sk_ASN1_GENERALSTRING_is_sorted(st) SKM_sk_is_sorted(ASN1_GENERALSTRING, (st)) +# define sk_ASN1_INTEGER_new(cmp) SKM_sk_new(ASN1_INTEGER, (cmp)) +# define sk_ASN1_INTEGER_new_null() SKM_sk_new_null(ASN1_INTEGER) +# define sk_ASN1_INTEGER_free(st) SKM_sk_free(ASN1_INTEGER, (st)) +# define sk_ASN1_INTEGER_num(st) SKM_sk_num(ASN1_INTEGER, (st)) +# define sk_ASN1_INTEGER_value(st, i) SKM_sk_value(ASN1_INTEGER, (st), (i)) +# define sk_ASN1_INTEGER_set(st, i, val) SKM_sk_set(ASN1_INTEGER, (st), (i), (val)) +# define sk_ASN1_INTEGER_zero(st) SKM_sk_zero(ASN1_INTEGER, (st)) +# define sk_ASN1_INTEGER_push(st, val) SKM_sk_push(ASN1_INTEGER, (st), (val)) +# define sk_ASN1_INTEGER_unshift(st, val) SKM_sk_unshift(ASN1_INTEGER, (st), (val)) +# define sk_ASN1_INTEGER_find(st, val) SKM_sk_find(ASN1_INTEGER, (st), (val)) +# define sk_ASN1_INTEGER_find_ex(st, val) SKM_sk_find_ex(ASN1_INTEGER, (st), (val)) +# define sk_ASN1_INTEGER_delete(st, i) SKM_sk_delete(ASN1_INTEGER, (st), (i)) +# define sk_ASN1_INTEGER_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASN1_INTEGER, (st), (ptr)) +# define sk_ASN1_INTEGER_insert(st, val, i) SKM_sk_insert(ASN1_INTEGER, (st), (val), (i)) +# define sk_ASN1_INTEGER_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASN1_INTEGER, (st), (cmp)) +# define sk_ASN1_INTEGER_dup(st) SKM_sk_dup(ASN1_INTEGER, st) +# define sk_ASN1_INTEGER_pop_free(st, free_func) SKM_sk_pop_free(ASN1_INTEGER, (st), (free_func)) +# define sk_ASN1_INTEGER_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(ASN1_INTEGER, (st), (copy_func), (free_func)) +# define sk_ASN1_INTEGER_shift(st) SKM_sk_shift(ASN1_INTEGER, (st)) +# define sk_ASN1_INTEGER_pop(st) SKM_sk_pop(ASN1_INTEGER, (st)) +# define sk_ASN1_INTEGER_sort(st) SKM_sk_sort(ASN1_INTEGER, (st)) +# define sk_ASN1_INTEGER_is_sorted(st) SKM_sk_is_sorted(ASN1_INTEGER, (st)) +# define sk_ASN1_OBJECT_new(cmp) SKM_sk_new(ASN1_OBJECT, (cmp)) +# define sk_ASN1_OBJECT_new_null() SKM_sk_new_null(ASN1_OBJECT) +# define sk_ASN1_OBJECT_free(st) SKM_sk_free(ASN1_OBJECT, (st)) +# define sk_ASN1_OBJECT_num(st) SKM_sk_num(ASN1_OBJECT, (st)) +# define sk_ASN1_OBJECT_value(st, i) SKM_sk_value(ASN1_OBJECT, (st), (i)) +# define sk_ASN1_OBJECT_set(st, i, val) SKM_sk_set(ASN1_OBJECT, (st), (i), (val)) +# define sk_ASN1_OBJECT_zero(st) SKM_sk_zero(ASN1_OBJECT, (st)) +# define sk_ASN1_OBJECT_push(st, val) SKM_sk_push(ASN1_OBJECT, (st), (val)) +# define sk_ASN1_OBJECT_unshift(st, val) SKM_sk_unshift(ASN1_OBJECT, (st), (val)) +# define sk_ASN1_OBJECT_find(st, val) SKM_sk_find(ASN1_OBJECT, (st), (val)) +# define sk_ASN1_OBJECT_find_ex(st, val) SKM_sk_find_ex(ASN1_OBJECT, (st), (val)) +# define sk_ASN1_OBJECT_delete(st, i) SKM_sk_delete(ASN1_OBJECT, (st), (i)) +# define sk_ASN1_OBJECT_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASN1_OBJECT, (st), (ptr)) +# define sk_ASN1_OBJECT_insert(st, val, i) SKM_sk_insert(ASN1_OBJECT, (st), (val), (i)) +# define sk_ASN1_OBJECT_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASN1_OBJECT, (st), (cmp)) +# define sk_ASN1_OBJECT_dup(st) SKM_sk_dup(ASN1_OBJECT, st) +# define sk_ASN1_OBJECT_pop_free(st, free_func) SKM_sk_pop_free(ASN1_OBJECT, (st), (free_func)) +# define sk_ASN1_OBJECT_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(ASN1_OBJECT, (st), (copy_func), (free_func)) +# define sk_ASN1_OBJECT_shift(st) SKM_sk_shift(ASN1_OBJECT, (st)) +# define sk_ASN1_OBJECT_pop(st) SKM_sk_pop(ASN1_OBJECT, (st)) +# define sk_ASN1_OBJECT_sort(st) SKM_sk_sort(ASN1_OBJECT, (st)) +# define sk_ASN1_OBJECT_is_sorted(st) SKM_sk_is_sorted(ASN1_OBJECT, (st)) +# define sk_ASN1_STRING_TABLE_new(cmp) SKM_sk_new(ASN1_STRING_TABLE, (cmp)) +# define sk_ASN1_STRING_TABLE_new_null() SKM_sk_new_null(ASN1_STRING_TABLE) +# define sk_ASN1_STRING_TABLE_free(st) SKM_sk_free(ASN1_STRING_TABLE, (st)) +# define sk_ASN1_STRING_TABLE_num(st) SKM_sk_num(ASN1_STRING_TABLE, (st)) +# define sk_ASN1_STRING_TABLE_value(st, i) SKM_sk_value(ASN1_STRING_TABLE, (st), (i)) +# define sk_ASN1_STRING_TABLE_set(st, i, val) SKM_sk_set(ASN1_STRING_TABLE, (st), (i), (val)) +# define sk_ASN1_STRING_TABLE_zero(st) SKM_sk_zero(ASN1_STRING_TABLE, (st)) +# define sk_ASN1_STRING_TABLE_push(st, val) SKM_sk_push(ASN1_STRING_TABLE, (st), (val)) +# define sk_ASN1_STRING_TABLE_unshift(st, val) SKM_sk_unshift(ASN1_STRING_TABLE, (st), (val)) +# define sk_ASN1_STRING_TABLE_find(st, val) SKM_sk_find(ASN1_STRING_TABLE, (st), (val)) +# define sk_ASN1_STRING_TABLE_find_ex(st, val) SKM_sk_find_ex(ASN1_STRING_TABLE, (st), (val)) +# define sk_ASN1_STRING_TABLE_delete(st, i) SKM_sk_delete(ASN1_STRING_TABLE, (st), (i)) +# define sk_ASN1_STRING_TABLE_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASN1_STRING_TABLE, (st), (ptr)) +# define sk_ASN1_STRING_TABLE_insert(st, val, i) SKM_sk_insert(ASN1_STRING_TABLE, (st), (val), (i)) +# define sk_ASN1_STRING_TABLE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASN1_STRING_TABLE, (st), (cmp)) +# define sk_ASN1_STRING_TABLE_dup(st) SKM_sk_dup(ASN1_STRING_TABLE, st) +# define sk_ASN1_STRING_TABLE_pop_free(st, free_func) SKM_sk_pop_free(ASN1_STRING_TABLE, (st), (free_func)) +# define sk_ASN1_STRING_TABLE_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(ASN1_STRING_TABLE, (st), (copy_func), (free_func)) +# define sk_ASN1_STRING_TABLE_shift(st) SKM_sk_shift(ASN1_STRING_TABLE, (st)) +# define sk_ASN1_STRING_TABLE_pop(st) SKM_sk_pop(ASN1_STRING_TABLE, (st)) +# define sk_ASN1_STRING_TABLE_sort(st) SKM_sk_sort(ASN1_STRING_TABLE, (st)) +# define sk_ASN1_STRING_TABLE_is_sorted(st) SKM_sk_is_sorted(ASN1_STRING_TABLE, (st)) +# define sk_ASN1_TYPE_new(cmp) SKM_sk_new(ASN1_TYPE, (cmp)) +# define sk_ASN1_TYPE_new_null() SKM_sk_new_null(ASN1_TYPE) +# define sk_ASN1_TYPE_free(st) SKM_sk_free(ASN1_TYPE, (st)) +# define sk_ASN1_TYPE_num(st) SKM_sk_num(ASN1_TYPE, (st)) +# define sk_ASN1_TYPE_value(st, i) SKM_sk_value(ASN1_TYPE, (st), (i)) +# define sk_ASN1_TYPE_set(st, i, val) SKM_sk_set(ASN1_TYPE, (st), (i), (val)) +# define sk_ASN1_TYPE_zero(st) SKM_sk_zero(ASN1_TYPE, (st)) +# define sk_ASN1_TYPE_push(st, val) SKM_sk_push(ASN1_TYPE, (st), (val)) +# define sk_ASN1_TYPE_unshift(st, val) SKM_sk_unshift(ASN1_TYPE, (st), (val)) +# define sk_ASN1_TYPE_find(st, val) SKM_sk_find(ASN1_TYPE, (st), (val)) +# define sk_ASN1_TYPE_find_ex(st, val) SKM_sk_find_ex(ASN1_TYPE, (st), (val)) +# define sk_ASN1_TYPE_delete(st, i) SKM_sk_delete(ASN1_TYPE, (st), (i)) +# define sk_ASN1_TYPE_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASN1_TYPE, (st), (ptr)) +# define sk_ASN1_TYPE_insert(st, val, i) SKM_sk_insert(ASN1_TYPE, (st), (val), (i)) +# define sk_ASN1_TYPE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASN1_TYPE, (st), (cmp)) +# define sk_ASN1_TYPE_dup(st) SKM_sk_dup(ASN1_TYPE, st) +# define sk_ASN1_TYPE_pop_free(st, free_func) SKM_sk_pop_free(ASN1_TYPE, (st), (free_func)) +# define sk_ASN1_TYPE_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(ASN1_TYPE, (st), (copy_func), (free_func)) +# define sk_ASN1_TYPE_shift(st) SKM_sk_shift(ASN1_TYPE, (st)) +# define sk_ASN1_TYPE_pop(st) SKM_sk_pop(ASN1_TYPE, (st)) +# define sk_ASN1_TYPE_sort(st) SKM_sk_sort(ASN1_TYPE, (st)) +# define sk_ASN1_TYPE_is_sorted(st) SKM_sk_is_sorted(ASN1_TYPE, (st)) +# define sk_ASN1_UTF8STRING_new(cmp) SKM_sk_new(ASN1_UTF8STRING, (cmp)) +# define sk_ASN1_UTF8STRING_new_null() SKM_sk_new_null(ASN1_UTF8STRING) +# define sk_ASN1_UTF8STRING_free(st) SKM_sk_free(ASN1_UTF8STRING, (st)) +# define sk_ASN1_UTF8STRING_num(st) SKM_sk_num(ASN1_UTF8STRING, (st)) +# define sk_ASN1_UTF8STRING_value(st, i) SKM_sk_value(ASN1_UTF8STRING, (st), (i)) +# define sk_ASN1_UTF8STRING_set(st, i, val) SKM_sk_set(ASN1_UTF8STRING, (st), (i), (val)) +# define sk_ASN1_UTF8STRING_zero(st) SKM_sk_zero(ASN1_UTF8STRING, (st)) +# define sk_ASN1_UTF8STRING_push(st, val) SKM_sk_push(ASN1_UTF8STRING, (st), (val)) +# define sk_ASN1_UTF8STRING_unshift(st, val) SKM_sk_unshift(ASN1_UTF8STRING, (st), (val)) +# define sk_ASN1_UTF8STRING_find(st, val) SKM_sk_find(ASN1_UTF8STRING, (st), (val)) +# define sk_ASN1_UTF8STRING_find_ex(st, val) SKM_sk_find_ex(ASN1_UTF8STRING, (st), (val)) +# define sk_ASN1_UTF8STRING_delete(st, i) SKM_sk_delete(ASN1_UTF8STRING, (st), (i)) +# define sk_ASN1_UTF8STRING_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASN1_UTF8STRING, (st), (ptr)) +# define sk_ASN1_UTF8STRING_insert(st, val, i) SKM_sk_insert(ASN1_UTF8STRING, (st), (val), (i)) +# define sk_ASN1_UTF8STRING_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASN1_UTF8STRING, (st), (cmp)) +# define sk_ASN1_UTF8STRING_dup(st) SKM_sk_dup(ASN1_UTF8STRING, st) +# define sk_ASN1_UTF8STRING_pop_free(st, free_func) SKM_sk_pop_free(ASN1_UTF8STRING, (st), (free_func)) +# define sk_ASN1_UTF8STRING_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(ASN1_UTF8STRING, (st), (copy_func), (free_func)) +# define sk_ASN1_UTF8STRING_shift(st) SKM_sk_shift(ASN1_UTF8STRING, (st)) +# define sk_ASN1_UTF8STRING_pop(st) SKM_sk_pop(ASN1_UTF8STRING, (st)) +# define sk_ASN1_UTF8STRING_sort(st) SKM_sk_sort(ASN1_UTF8STRING, (st)) +# define sk_ASN1_UTF8STRING_is_sorted(st) SKM_sk_is_sorted(ASN1_UTF8STRING, (st)) +# define sk_ASN1_VALUE_new(cmp) SKM_sk_new(ASN1_VALUE, (cmp)) +# define sk_ASN1_VALUE_new_null() SKM_sk_new_null(ASN1_VALUE) +# define sk_ASN1_VALUE_free(st) SKM_sk_free(ASN1_VALUE, (st)) +# define sk_ASN1_VALUE_num(st) SKM_sk_num(ASN1_VALUE, (st)) +# define sk_ASN1_VALUE_value(st, i) SKM_sk_value(ASN1_VALUE, (st), (i)) +# define sk_ASN1_VALUE_set(st, i, val) SKM_sk_set(ASN1_VALUE, (st), (i), (val)) +# define sk_ASN1_VALUE_zero(st) SKM_sk_zero(ASN1_VALUE, (st)) +# define sk_ASN1_VALUE_push(st, val) SKM_sk_push(ASN1_VALUE, (st), (val)) +# define sk_ASN1_VALUE_unshift(st, val) SKM_sk_unshift(ASN1_VALUE, (st), (val)) +# define sk_ASN1_VALUE_find(st, val) SKM_sk_find(ASN1_VALUE, (st), (val)) +# define sk_ASN1_VALUE_find_ex(st, val) SKM_sk_find_ex(ASN1_VALUE, (st), (val)) +# define sk_ASN1_VALUE_delete(st, i) SKM_sk_delete(ASN1_VALUE, (st), (i)) +# define sk_ASN1_VALUE_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASN1_VALUE, (st), (ptr)) +# define sk_ASN1_VALUE_insert(st, val, i) SKM_sk_insert(ASN1_VALUE, (st), (val), (i)) +# define sk_ASN1_VALUE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASN1_VALUE, (st), (cmp)) +# define sk_ASN1_VALUE_dup(st) SKM_sk_dup(ASN1_VALUE, st) +# define sk_ASN1_VALUE_pop_free(st, free_func) SKM_sk_pop_free(ASN1_VALUE, (st), (free_func)) +# define sk_ASN1_VALUE_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(ASN1_VALUE, (st), (copy_func), (free_func)) +# define sk_ASN1_VALUE_shift(st) SKM_sk_shift(ASN1_VALUE, (st)) +# define sk_ASN1_VALUE_pop(st) SKM_sk_pop(ASN1_VALUE, (st)) +# define sk_ASN1_VALUE_sort(st) SKM_sk_sort(ASN1_VALUE, (st)) +# define sk_ASN1_VALUE_is_sorted(st) SKM_sk_is_sorted(ASN1_VALUE, (st)) +# define sk_BIO_new(cmp) SKM_sk_new(BIO, (cmp)) +# define sk_BIO_new_null() SKM_sk_new_null(BIO) +# define sk_BIO_free(st) SKM_sk_free(BIO, (st)) +# define sk_BIO_num(st) SKM_sk_num(BIO, (st)) +# define sk_BIO_value(st, i) SKM_sk_value(BIO, (st), (i)) +# define sk_BIO_set(st, i, val) SKM_sk_set(BIO, (st), (i), (val)) +# define sk_BIO_zero(st) SKM_sk_zero(BIO, (st)) +# define sk_BIO_push(st, val) SKM_sk_push(BIO, (st), (val)) +# define sk_BIO_unshift(st, val) SKM_sk_unshift(BIO, (st), (val)) +# define sk_BIO_find(st, val) SKM_sk_find(BIO, (st), (val)) +# define sk_BIO_find_ex(st, val) SKM_sk_find_ex(BIO, (st), (val)) +# define sk_BIO_delete(st, i) SKM_sk_delete(BIO, (st), (i)) +# define sk_BIO_delete_ptr(st, ptr) SKM_sk_delete_ptr(BIO, (st), (ptr)) +# define sk_BIO_insert(st, val, i) SKM_sk_insert(BIO, (st), (val), (i)) +# define sk_BIO_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(BIO, (st), (cmp)) +# define sk_BIO_dup(st) SKM_sk_dup(BIO, st) +# define sk_BIO_pop_free(st, free_func) SKM_sk_pop_free(BIO, (st), (free_func)) +# define sk_BIO_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(BIO, (st), (copy_func), (free_func)) +# define sk_BIO_shift(st) SKM_sk_shift(BIO, (st)) +# define sk_BIO_pop(st) SKM_sk_pop(BIO, (st)) +# define sk_BIO_sort(st) SKM_sk_sort(BIO, (st)) +# define sk_BIO_is_sorted(st) SKM_sk_is_sorted(BIO, (st)) +# define sk_BY_DIR_ENTRY_new(cmp) SKM_sk_new(BY_DIR_ENTRY, (cmp)) +# define sk_BY_DIR_ENTRY_new_null() SKM_sk_new_null(BY_DIR_ENTRY) +# define sk_BY_DIR_ENTRY_free(st) SKM_sk_free(BY_DIR_ENTRY, (st)) +# define sk_BY_DIR_ENTRY_num(st) SKM_sk_num(BY_DIR_ENTRY, (st)) +# define sk_BY_DIR_ENTRY_value(st, i) SKM_sk_value(BY_DIR_ENTRY, (st), (i)) +# define sk_BY_DIR_ENTRY_set(st, i, val) SKM_sk_set(BY_DIR_ENTRY, (st), (i), (val)) +# define sk_BY_DIR_ENTRY_zero(st) SKM_sk_zero(BY_DIR_ENTRY, (st)) +# define sk_BY_DIR_ENTRY_push(st, val) SKM_sk_push(BY_DIR_ENTRY, (st), (val)) +# define sk_BY_DIR_ENTRY_unshift(st, val) SKM_sk_unshift(BY_DIR_ENTRY, (st), (val)) +# define sk_BY_DIR_ENTRY_find(st, val) SKM_sk_find(BY_DIR_ENTRY, (st), (val)) +# define sk_BY_DIR_ENTRY_find_ex(st, val) SKM_sk_find_ex(BY_DIR_ENTRY, (st), (val)) +# define sk_BY_DIR_ENTRY_delete(st, i) SKM_sk_delete(BY_DIR_ENTRY, (st), (i)) +# define sk_BY_DIR_ENTRY_delete_ptr(st, ptr) SKM_sk_delete_ptr(BY_DIR_ENTRY, (st), (ptr)) +# define sk_BY_DIR_ENTRY_insert(st, val, i) SKM_sk_insert(BY_DIR_ENTRY, (st), (val), (i)) +# define sk_BY_DIR_ENTRY_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(BY_DIR_ENTRY, (st), (cmp)) +# define sk_BY_DIR_ENTRY_dup(st) SKM_sk_dup(BY_DIR_ENTRY, st) +# define sk_BY_DIR_ENTRY_pop_free(st, free_func) SKM_sk_pop_free(BY_DIR_ENTRY, (st), (free_func)) +# define sk_BY_DIR_ENTRY_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(BY_DIR_ENTRY, (st), (copy_func), (free_func)) +# define sk_BY_DIR_ENTRY_shift(st) SKM_sk_shift(BY_DIR_ENTRY, (st)) +# define sk_BY_DIR_ENTRY_pop(st) SKM_sk_pop(BY_DIR_ENTRY, (st)) +# define sk_BY_DIR_ENTRY_sort(st) SKM_sk_sort(BY_DIR_ENTRY, (st)) +# define sk_BY_DIR_ENTRY_is_sorted(st) SKM_sk_is_sorted(BY_DIR_ENTRY, (st)) +# define sk_BY_DIR_HASH_new(cmp) SKM_sk_new(BY_DIR_HASH, (cmp)) +# define sk_BY_DIR_HASH_new_null() SKM_sk_new_null(BY_DIR_HASH) +# define sk_BY_DIR_HASH_free(st) SKM_sk_free(BY_DIR_HASH, (st)) +# define sk_BY_DIR_HASH_num(st) SKM_sk_num(BY_DIR_HASH, (st)) +# define sk_BY_DIR_HASH_value(st, i) SKM_sk_value(BY_DIR_HASH, (st), (i)) +# define sk_BY_DIR_HASH_set(st, i, val) SKM_sk_set(BY_DIR_HASH, (st), (i), (val)) +# define sk_BY_DIR_HASH_zero(st) SKM_sk_zero(BY_DIR_HASH, (st)) +# define sk_BY_DIR_HASH_push(st, val) SKM_sk_push(BY_DIR_HASH, (st), (val)) +# define sk_BY_DIR_HASH_unshift(st, val) SKM_sk_unshift(BY_DIR_HASH, (st), (val)) +# define sk_BY_DIR_HASH_find(st, val) SKM_sk_find(BY_DIR_HASH, (st), (val)) +# define sk_BY_DIR_HASH_find_ex(st, val) SKM_sk_find_ex(BY_DIR_HASH, (st), (val)) +# define sk_BY_DIR_HASH_delete(st, i) SKM_sk_delete(BY_DIR_HASH, (st), (i)) +# define sk_BY_DIR_HASH_delete_ptr(st, ptr) SKM_sk_delete_ptr(BY_DIR_HASH, (st), (ptr)) +# define sk_BY_DIR_HASH_insert(st, val, i) SKM_sk_insert(BY_DIR_HASH, (st), (val), (i)) +# define sk_BY_DIR_HASH_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(BY_DIR_HASH, (st), (cmp)) +# define sk_BY_DIR_HASH_dup(st) SKM_sk_dup(BY_DIR_HASH, st) +# define sk_BY_DIR_HASH_pop_free(st, free_func) SKM_sk_pop_free(BY_DIR_HASH, (st), (free_func)) +# define sk_BY_DIR_HASH_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(BY_DIR_HASH, (st), (copy_func), (free_func)) +# define sk_BY_DIR_HASH_shift(st) SKM_sk_shift(BY_DIR_HASH, (st)) +# define sk_BY_DIR_HASH_pop(st) SKM_sk_pop(BY_DIR_HASH, (st)) +# define sk_BY_DIR_HASH_sort(st) SKM_sk_sort(BY_DIR_HASH, (st)) +# define sk_BY_DIR_HASH_is_sorted(st) SKM_sk_is_sorted(BY_DIR_HASH, (st)) +# define sk_CMS_CertificateChoices_new(cmp) SKM_sk_new(CMS_CertificateChoices, (cmp)) +# define sk_CMS_CertificateChoices_new_null() SKM_sk_new_null(CMS_CertificateChoices) +# define sk_CMS_CertificateChoices_free(st) SKM_sk_free(CMS_CertificateChoices, (st)) +# define sk_CMS_CertificateChoices_num(st) SKM_sk_num(CMS_CertificateChoices, (st)) +# define sk_CMS_CertificateChoices_value(st, i) SKM_sk_value(CMS_CertificateChoices, (st), (i)) +# define sk_CMS_CertificateChoices_set(st, i, val) SKM_sk_set(CMS_CertificateChoices, (st), (i), (val)) +# define sk_CMS_CertificateChoices_zero(st) SKM_sk_zero(CMS_CertificateChoices, (st)) +# define sk_CMS_CertificateChoices_push(st, val) SKM_sk_push(CMS_CertificateChoices, (st), (val)) +# define sk_CMS_CertificateChoices_unshift(st, val) SKM_sk_unshift(CMS_CertificateChoices, (st), (val)) +# define sk_CMS_CertificateChoices_find(st, val) SKM_sk_find(CMS_CertificateChoices, (st), (val)) +# define sk_CMS_CertificateChoices_find_ex(st, val) SKM_sk_find_ex(CMS_CertificateChoices, (st), (val)) +# define sk_CMS_CertificateChoices_delete(st, i) SKM_sk_delete(CMS_CertificateChoices, (st), (i)) +# define sk_CMS_CertificateChoices_delete_ptr(st, ptr) SKM_sk_delete_ptr(CMS_CertificateChoices, (st), (ptr)) +# define sk_CMS_CertificateChoices_insert(st, val, i) SKM_sk_insert(CMS_CertificateChoices, (st), (val), (i)) +# define sk_CMS_CertificateChoices_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CMS_CertificateChoices, (st), (cmp)) +# define sk_CMS_CertificateChoices_dup(st) SKM_sk_dup(CMS_CertificateChoices, st) +# define sk_CMS_CertificateChoices_pop_free(st, free_func) SKM_sk_pop_free(CMS_CertificateChoices, (st), (free_func)) +# define sk_CMS_CertificateChoices_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(CMS_CertificateChoices, (st), (copy_func), (free_func)) +# define sk_CMS_CertificateChoices_shift(st) SKM_sk_shift(CMS_CertificateChoices, (st)) +# define sk_CMS_CertificateChoices_pop(st) SKM_sk_pop(CMS_CertificateChoices, (st)) +# define sk_CMS_CertificateChoices_sort(st) SKM_sk_sort(CMS_CertificateChoices, (st)) +# define sk_CMS_CertificateChoices_is_sorted(st) SKM_sk_is_sorted(CMS_CertificateChoices, (st)) +# define sk_CMS_RecipientEncryptedKey_new(cmp) SKM_sk_new(CMS_RecipientEncryptedKey, (cmp)) +# define sk_CMS_RecipientEncryptedKey_new_null() SKM_sk_new_null(CMS_RecipientEncryptedKey) +# define sk_CMS_RecipientEncryptedKey_free(st) SKM_sk_free(CMS_RecipientEncryptedKey, (st)) +# define sk_CMS_RecipientEncryptedKey_num(st) SKM_sk_num(CMS_RecipientEncryptedKey, (st)) +# define sk_CMS_RecipientEncryptedKey_value(st, i) SKM_sk_value(CMS_RecipientEncryptedKey, (st), (i)) +# define sk_CMS_RecipientEncryptedKey_set(st, i, val) SKM_sk_set(CMS_RecipientEncryptedKey, (st), (i), (val)) +# define sk_CMS_RecipientEncryptedKey_zero(st) SKM_sk_zero(CMS_RecipientEncryptedKey, (st)) +# define sk_CMS_RecipientEncryptedKey_push(st, val) SKM_sk_push(CMS_RecipientEncryptedKey, (st), (val)) +# define sk_CMS_RecipientEncryptedKey_unshift(st, val) SKM_sk_unshift(CMS_RecipientEncryptedKey, (st), (val)) +# define sk_CMS_RecipientEncryptedKey_find(st, val) SKM_sk_find(CMS_RecipientEncryptedKey, (st), (val)) +# define sk_CMS_RecipientEncryptedKey_find_ex(st, val) SKM_sk_find_ex(CMS_RecipientEncryptedKey, (st), (val)) +# define sk_CMS_RecipientEncryptedKey_delete(st, i) SKM_sk_delete(CMS_RecipientEncryptedKey, (st), (i)) +# define sk_CMS_RecipientEncryptedKey_delete_ptr(st, ptr) SKM_sk_delete_ptr(CMS_RecipientEncryptedKey, (st), (ptr)) +# define sk_CMS_RecipientEncryptedKey_insert(st, val, i) SKM_sk_insert(CMS_RecipientEncryptedKey, (st), (val), (i)) +# define sk_CMS_RecipientEncryptedKey_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CMS_RecipientEncryptedKey, (st), (cmp)) +# define sk_CMS_RecipientEncryptedKey_dup(st) SKM_sk_dup(CMS_RecipientEncryptedKey, st) +# define sk_CMS_RecipientEncryptedKey_pop_free(st, free_func) SKM_sk_pop_free(CMS_RecipientEncryptedKey, (st), (free_func)) +# define sk_CMS_RecipientEncryptedKey_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(CMS_RecipientEncryptedKey, (st), (copy_func), (free_func)) +# define sk_CMS_RecipientEncryptedKey_shift(st) SKM_sk_shift(CMS_RecipientEncryptedKey, (st)) +# define sk_CMS_RecipientEncryptedKey_pop(st) SKM_sk_pop(CMS_RecipientEncryptedKey, (st)) +# define sk_CMS_RecipientEncryptedKey_sort(st) SKM_sk_sort(CMS_RecipientEncryptedKey, (st)) +# define sk_CMS_RecipientEncryptedKey_is_sorted(st) SKM_sk_is_sorted(CMS_RecipientEncryptedKey, (st)) +# define sk_CMS_RecipientInfo_new(cmp) SKM_sk_new(CMS_RecipientInfo, (cmp)) +# define sk_CMS_RecipientInfo_new_null() SKM_sk_new_null(CMS_RecipientInfo) +# define sk_CMS_RecipientInfo_free(st) SKM_sk_free(CMS_RecipientInfo, (st)) +# define sk_CMS_RecipientInfo_num(st) SKM_sk_num(CMS_RecipientInfo, (st)) +# define sk_CMS_RecipientInfo_value(st, i) SKM_sk_value(CMS_RecipientInfo, (st), (i)) +# define sk_CMS_RecipientInfo_set(st, i, val) SKM_sk_set(CMS_RecipientInfo, (st), (i), (val)) +# define sk_CMS_RecipientInfo_zero(st) SKM_sk_zero(CMS_RecipientInfo, (st)) +# define sk_CMS_RecipientInfo_push(st, val) SKM_sk_push(CMS_RecipientInfo, (st), (val)) +# define sk_CMS_RecipientInfo_unshift(st, val) SKM_sk_unshift(CMS_RecipientInfo, (st), (val)) +# define sk_CMS_RecipientInfo_find(st, val) SKM_sk_find(CMS_RecipientInfo, (st), (val)) +# define sk_CMS_RecipientInfo_find_ex(st, val) SKM_sk_find_ex(CMS_RecipientInfo, (st), (val)) +# define sk_CMS_RecipientInfo_delete(st, i) SKM_sk_delete(CMS_RecipientInfo, (st), (i)) +# define sk_CMS_RecipientInfo_delete_ptr(st, ptr) SKM_sk_delete_ptr(CMS_RecipientInfo, (st), (ptr)) +# define sk_CMS_RecipientInfo_insert(st, val, i) SKM_sk_insert(CMS_RecipientInfo, (st), (val), (i)) +# define sk_CMS_RecipientInfo_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CMS_RecipientInfo, (st), (cmp)) +# define sk_CMS_RecipientInfo_dup(st) SKM_sk_dup(CMS_RecipientInfo, st) +# define sk_CMS_RecipientInfo_pop_free(st, free_func) SKM_sk_pop_free(CMS_RecipientInfo, (st), (free_func)) +# define sk_CMS_RecipientInfo_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(CMS_RecipientInfo, (st), (copy_func), (free_func)) +# define sk_CMS_RecipientInfo_shift(st) SKM_sk_shift(CMS_RecipientInfo, (st)) +# define sk_CMS_RecipientInfo_pop(st) SKM_sk_pop(CMS_RecipientInfo, (st)) +# define sk_CMS_RecipientInfo_sort(st) SKM_sk_sort(CMS_RecipientInfo, (st)) +# define sk_CMS_RecipientInfo_is_sorted(st) SKM_sk_is_sorted(CMS_RecipientInfo, (st)) +# define sk_CMS_RevocationInfoChoice_new(cmp) SKM_sk_new(CMS_RevocationInfoChoice, (cmp)) +# define sk_CMS_RevocationInfoChoice_new_null() SKM_sk_new_null(CMS_RevocationInfoChoice) +# define sk_CMS_RevocationInfoChoice_free(st) SKM_sk_free(CMS_RevocationInfoChoice, (st)) +# define sk_CMS_RevocationInfoChoice_num(st) SKM_sk_num(CMS_RevocationInfoChoice, (st)) +# define sk_CMS_RevocationInfoChoice_value(st, i) SKM_sk_value(CMS_RevocationInfoChoice, (st), (i)) +# define sk_CMS_RevocationInfoChoice_set(st, i, val) SKM_sk_set(CMS_RevocationInfoChoice, (st), (i), (val)) +# define sk_CMS_RevocationInfoChoice_zero(st) SKM_sk_zero(CMS_RevocationInfoChoice, (st)) +# define sk_CMS_RevocationInfoChoice_push(st, val) SKM_sk_push(CMS_RevocationInfoChoice, (st), (val)) +# define sk_CMS_RevocationInfoChoice_unshift(st, val) SKM_sk_unshift(CMS_RevocationInfoChoice, (st), (val)) +# define sk_CMS_RevocationInfoChoice_find(st, val) SKM_sk_find(CMS_RevocationInfoChoice, (st), (val)) +# define sk_CMS_RevocationInfoChoice_find_ex(st, val) SKM_sk_find_ex(CMS_RevocationInfoChoice, (st), (val)) +# define sk_CMS_RevocationInfoChoice_delete(st, i) SKM_sk_delete(CMS_RevocationInfoChoice, (st), (i)) +# define sk_CMS_RevocationInfoChoice_delete_ptr(st, ptr) SKM_sk_delete_ptr(CMS_RevocationInfoChoice, (st), (ptr)) +# define sk_CMS_RevocationInfoChoice_insert(st, val, i) SKM_sk_insert(CMS_RevocationInfoChoice, (st), (val), (i)) +# define sk_CMS_RevocationInfoChoice_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CMS_RevocationInfoChoice, (st), (cmp)) +# define sk_CMS_RevocationInfoChoice_dup(st) SKM_sk_dup(CMS_RevocationInfoChoice, st) +# define sk_CMS_RevocationInfoChoice_pop_free(st, free_func) SKM_sk_pop_free(CMS_RevocationInfoChoice, (st), (free_func)) +# define sk_CMS_RevocationInfoChoice_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(CMS_RevocationInfoChoice, (st), (copy_func), (free_func)) +# define sk_CMS_RevocationInfoChoice_shift(st) SKM_sk_shift(CMS_RevocationInfoChoice, (st)) +# define sk_CMS_RevocationInfoChoice_pop(st) SKM_sk_pop(CMS_RevocationInfoChoice, (st)) +# define sk_CMS_RevocationInfoChoice_sort(st) SKM_sk_sort(CMS_RevocationInfoChoice, (st)) +# define sk_CMS_RevocationInfoChoice_is_sorted(st) SKM_sk_is_sorted(CMS_RevocationInfoChoice, (st)) +# define sk_CMS_SignerInfo_new(cmp) SKM_sk_new(CMS_SignerInfo, (cmp)) +# define sk_CMS_SignerInfo_new_null() SKM_sk_new_null(CMS_SignerInfo) +# define sk_CMS_SignerInfo_free(st) SKM_sk_free(CMS_SignerInfo, (st)) +# define sk_CMS_SignerInfo_num(st) SKM_sk_num(CMS_SignerInfo, (st)) +# define sk_CMS_SignerInfo_value(st, i) SKM_sk_value(CMS_SignerInfo, (st), (i)) +# define sk_CMS_SignerInfo_set(st, i, val) SKM_sk_set(CMS_SignerInfo, (st), (i), (val)) +# define sk_CMS_SignerInfo_zero(st) SKM_sk_zero(CMS_SignerInfo, (st)) +# define sk_CMS_SignerInfo_push(st, val) SKM_sk_push(CMS_SignerInfo, (st), (val)) +# define sk_CMS_SignerInfo_unshift(st, val) SKM_sk_unshift(CMS_SignerInfo, (st), (val)) +# define sk_CMS_SignerInfo_find(st, val) SKM_sk_find(CMS_SignerInfo, (st), (val)) +# define sk_CMS_SignerInfo_find_ex(st, val) SKM_sk_find_ex(CMS_SignerInfo, (st), (val)) +# define sk_CMS_SignerInfo_delete(st, i) SKM_sk_delete(CMS_SignerInfo, (st), (i)) +# define sk_CMS_SignerInfo_delete_ptr(st, ptr) SKM_sk_delete_ptr(CMS_SignerInfo, (st), (ptr)) +# define sk_CMS_SignerInfo_insert(st, val, i) SKM_sk_insert(CMS_SignerInfo, (st), (val), (i)) +# define sk_CMS_SignerInfo_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CMS_SignerInfo, (st), (cmp)) +# define sk_CMS_SignerInfo_dup(st) SKM_sk_dup(CMS_SignerInfo, st) +# define sk_CMS_SignerInfo_pop_free(st, free_func) SKM_sk_pop_free(CMS_SignerInfo, (st), (free_func)) +# define sk_CMS_SignerInfo_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(CMS_SignerInfo, (st), (copy_func), (free_func)) +# define sk_CMS_SignerInfo_shift(st) SKM_sk_shift(CMS_SignerInfo, (st)) +# define sk_CMS_SignerInfo_pop(st) SKM_sk_pop(CMS_SignerInfo, (st)) +# define sk_CMS_SignerInfo_sort(st) SKM_sk_sort(CMS_SignerInfo, (st)) +# define sk_CMS_SignerInfo_is_sorted(st) SKM_sk_is_sorted(CMS_SignerInfo, (st)) +# define sk_CONF_IMODULE_new(cmp) SKM_sk_new(CONF_IMODULE, (cmp)) +# define sk_CONF_IMODULE_new_null() SKM_sk_new_null(CONF_IMODULE) +# define sk_CONF_IMODULE_free(st) SKM_sk_free(CONF_IMODULE, (st)) +# define sk_CONF_IMODULE_num(st) SKM_sk_num(CONF_IMODULE, (st)) +# define sk_CONF_IMODULE_value(st, i) SKM_sk_value(CONF_IMODULE, (st), (i)) +# define sk_CONF_IMODULE_set(st, i, val) SKM_sk_set(CONF_IMODULE, (st), (i), (val)) +# define sk_CONF_IMODULE_zero(st) SKM_sk_zero(CONF_IMODULE, (st)) +# define sk_CONF_IMODULE_push(st, val) SKM_sk_push(CONF_IMODULE, (st), (val)) +# define sk_CONF_IMODULE_unshift(st, val) SKM_sk_unshift(CONF_IMODULE, (st), (val)) +# define sk_CONF_IMODULE_find(st, val) SKM_sk_find(CONF_IMODULE, (st), (val)) +# define sk_CONF_IMODULE_find_ex(st, val) SKM_sk_find_ex(CONF_IMODULE, (st), (val)) +# define sk_CONF_IMODULE_delete(st, i) SKM_sk_delete(CONF_IMODULE, (st), (i)) +# define sk_CONF_IMODULE_delete_ptr(st, ptr) SKM_sk_delete_ptr(CONF_IMODULE, (st), (ptr)) +# define sk_CONF_IMODULE_insert(st, val, i) SKM_sk_insert(CONF_IMODULE, (st), (val), (i)) +# define sk_CONF_IMODULE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CONF_IMODULE, (st), (cmp)) +# define sk_CONF_IMODULE_dup(st) SKM_sk_dup(CONF_IMODULE, st) +# define sk_CONF_IMODULE_pop_free(st, free_func) SKM_sk_pop_free(CONF_IMODULE, (st), (free_func)) +# define sk_CONF_IMODULE_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(CONF_IMODULE, (st), (copy_func), (free_func)) +# define sk_CONF_IMODULE_shift(st) SKM_sk_shift(CONF_IMODULE, (st)) +# define sk_CONF_IMODULE_pop(st) SKM_sk_pop(CONF_IMODULE, (st)) +# define sk_CONF_IMODULE_sort(st) SKM_sk_sort(CONF_IMODULE, (st)) +# define sk_CONF_IMODULE_is_sorted(st) SKM_sk_is_sorted(CONF_IMODULE, (st)) +# define sk_CONF_MODULE_new(cmp) SKM_sk_new(CONF_MODULE, (cmp)) +# define sk_CONF_MODULE_new_null() SKM_sk_new_null(CONF_MODULE) +# define sk_CONF_MODULE_free(st) SKM_sk_free(CONF_MODULE, (st)) +# define sk_CONF_MODULE_num(st) SKM_sk_num(CONF_MODULE, (st)) +# define sk_CONF_MODULE_value(st, i) SKM_sk_value(CONF_MODULE, (st), (i)) +# define sk_CONF_MODULE_set(st, i, val) SKM_sk_set(CONF_MODULE, (st), (i), (val)) +# define sk_CONF_MODULE_zero(st) SKM_sk_zero(CONF_MODULE, (st)) +# define sk_CONF_MODULE_push(st, val) SKM_sk_push(CONF_MODULE, (st), (val)) +# define sk_CONF_MODULE_unshift(st, val) SKM_sk_unshift(CONF_MODULE, (st), (val)) +# define sk_CONF_MODULE_find(st, val) SKM_sk_find(CONF_MODULE, (st), (val)) +# define sk_CONF_MODULE_find_ex(st, val) SKM_sk_find_ex(CONF_MODULE, (st), (val)) +# define sk_CONF_MODULE_delete(st, i) SKM_sk_delete(CONF_MODULE, (st), (i)) +# define sk_CONF_MODULE_delete_ptr(st, ptr) SKM_sk_delete_ptr(CONF_MODULE, (st), (ptr)) +# define sk_CONF_MODULE_insert(st, val, i) SKM_sk_insert(CONF_MODULE, (st), (val), (i)) +# define sk_CONF_MODULE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CONF_MODULE, (st), (cmp)) +# define sk_CONF_MODULE_dup(st) SKM_sk_dup(CONF_MODULE, st) +# define sk_CONF_MODULE_pop_free(st, free_func) SKM_sk_pop_free(CONF_MODULE, (st), (free_func)) +# define sk_CONF_MODULE_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(CONF_MODULE, (st), (copy_func), (free_func)) +# define sk_CONF_MODULE_shift(st) SKM_sk_shift(CONF_MODULE, (st)) +# define sk_CONF_MODULE_pop(st) SKM_sk_pop(CONF_MODULE, (st)) +# define sk_CONF_MODULE_sort(st) SKM_sk_sort(CONF_MODULE, (st)) +# define sk_CONF_MODULE_is_sorted(st) SKM_sk_is_sorted(CONF_MODULE, (st)) +# define sk_CONF_VALUE_new(cmp) SKM_sk_new(CONF_VALUE, (cmp)) +# define sk_CONF_VALUE_new_null() SKM_sk_new_null(CONF_VALUE) +# define sk_CONF_VALUE_free(st) SKM_sk_free(CONF_VALUE, (st)) +# define sk_CONF_VALUE_num(st) SKM_sk_num(CONF_VALUE, (st)) +# define sk_CONF_VALUE_value(st, i) SKM_sk_value(CONF_VALUE, (st), (i)) +# define sk_CONF_VALUE_set(st, i, val) SKM_sk_set(CONF_VALUE, (st), (i), (val)) +# define sk_CONF_VALUE_zero(st) SKM_sk_zero(CONF_VALUE, (st)) +# define sk_CONF_VALUE_push(st, val) SKM_sk_push(CONF_VALUE, (st), (val)) +# define sk_CONF_VALUE_unshift(st, val) SKM_sk_unshift(CONF_VALUE, (st), (val)) +# define sk_CONF_VALUE_find(st, val) SKM_sk_find(CONF_VALUE, (st), (val)) +# define sk_CONF_VALUE_find_ex(st, val) SKM_sk_find_ex(CONF_VALUE, (st), (val)) +# define sk_CONF_VALUE_delete(st, i) SKM_sk_delete(CONF_VALUE, (st), (i)) +# define sk_CONF_VALUE_delete_ptr(st, ptr) SKM_sk_delete_ptr(CONF_VALUE, (st), (ptr)) +# define sk_CONF_VALUE_insert(st, val, i) SKM_sk_insert(CONF_VALUE, (st), (val), (i)) +# define sk_CONF_VALUE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CONF_VALUE, (st), (cmp)) +# define sk_CONF_VALUE_dup(st) SKM_sk_dup(CONF_VALUE, st) +# define sk_CONF_VALUE_pop_free(st, free_func) SKM_sk_pop_free(CONF_VALUE, (st), (free_func)) +# define sk_CONF_VALUE_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(CONF_VALUE, (st), (copy_func), (free_func)) +# define sk_CONF_VALUE_shift(st) SKM_sk_shift(CONF_VALUE, (st)) +# define sk_CONF_VALUE_pop(st) SKM_sk_pop(CONF_VALUE, (st)) +# define sk_CONF_VALUE_sort(st) SKM_sk_sort(CONF_VALUE, (st)) +# define sk_CONF_VALUE_is_sorted(st) SKM_sk_is_sorted(CONF_VALUE, (st)) +# define sk_CRYPTO_EX_DATA_FUNCS_new(cmp) SKM_sk_new(CRYPTO_EX_DATA_FUNCS, (cmp)) +# define sk_CRYPTO_EX_DATA_FUNCS_new_null() SKM_sk_new_null(CRYPTO_EX_DATA_FUNCS) +# define sk_CRYPTO_EX_DATA_FUNCS_free(st) SKM_sk_free(CRYPTO_EX_DATA_FUNCS, (st)) +# define sk_CRYPTO_EX_DATA_FUNCS_num(st) SKM_sk_num(CRYPTO_EX_DATA_FUNCS, (st)) +# define sk_CRYPTO_EX_DATA_FUNCS_value(st, i) SKM_sk_value(CRYPTO_EX_DATA_FUNCS, (st), (i)) +# define sk_CRYPTO_EX_DATA_FUNCS_set(st, i, val) SKM_sk_set(CRYPTO_EX_DATA_FUNCS, (st), (i), (val)) +# define sk_CRYPTO_EX_DATA_FUNCS_zero(st) SKM_sk_zero(CRYPTO_EX_DATA_FUNCS, (st)) +# define sk_CRYPTO_EX_DATA_FUNCS_push(st, val) SKM_sk_push(CRYPTO_EX_DATA_FUNCS, (st), (val)) +# define sk_CRYPTO_EX_DATA_FUNCS_unshift(st, val) SKM_sk_unshift(CRYPTO_EX_DATA_FUNCS, (st), (val)) +# define sk_CRYPTO_EX_DATA_FUNCS_find(st, val) SKM_sk_find(CRYPTO_EX_DATA_FUNCS, (st), (val)) +# define sk_CRYPTO_EX_DATA_FUNCS_find_ex(st, val) SKM_sk_find_ex(CRYPTO_EX_DATA_FUNCS, (st), (val)) +# define sk_CRYPTO_EX_DATA_FUNCS_delete(st, i) SKM_sk_delete(CRYPTO_EX_DATA_FUNCS, (st), (i)) +# define sk_CRYPTO_EX_DATA_FUNCS_delete_ptr(st, ptr) SKM_sk_delete_ptr(CRYPTO_EX_DATA_FUNCS, (st), (ptr)) +# define sk_CRYPTO_EX_DATA_FUNCS_insert(st, val, i) SKM_sk_insert(CRYPTO_EX_DATA_FUNCS, (st), (val), (i)) +# define sk_CRYPTO_EX_DATA_FUNCS_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CRYPTO_EX_DATA_FUNCS, (st), (cmp)) +# define sk_CRYPTO_EX_DATA_FUNCS_dup(st) SKM_sk_dup(CRYPTO_EX_DATA_FUNCS, st) +# define sk_CRYPTO_EX_DATA_FUNCS_pop_free(st, free_func) SKM_sk_pop_free(CRYPTO_EX_DATA_FUNCS, (st), (free_func)) +# define sk_CRYPTO_EX_DATA_FUNCS_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(CRYPTO_EX_DATA_FUNCS, (st), (copy_func), (free_func)) +# define sk_CRYPTO_EX_DATA_FUNCS_shift(st) SKM_sk_shift(CRYPTO_EX_DATA_FUNCS, (st)) +# define sk_CRYPTO_EX_DATA_FUNCS_pop(st) SKM_sk_pop(CRYPTO_EX_DATA_FUNCS, (st)) +# define sk_CRYPTO_EX_DATA_FUNCS_sort(st) SKM_sk_sort(CRYPTO_EX_DATA_FUNCS, (st)) +# define sk_CRYPTO_EX_DATA_FUNCS_is_sorted(st) SKM_sk_is_sorted(CRYPTO_EX_DATA_FUNCS, (st)) +# define sk_CRYPTO_dynlock_new(cmp) SKM_sk_new(CRYPTO_dynlock, (cmp)) +# define sk_CRYPTO_dynlock_new_null() SKM_sk_new_null(CRYPTO_dynlock) +# define sk_CRYPTO_dynlock_free(st) SKM_sk_free(CRYPTO_dynlock, (st)) +# define sk_CRYPTO_dynlock_num(st) SKM_sk_num(CRYPTO_dynlock, (st)) +# define sk_CRYPTO_dynlock_value(st, i) SKM_sk_value(CRYPTO_dynlock, (st), (i)) +# define sk_CRYPTO_dynlock_set(st, i, val) SKM_sk_set(CRYPTO_dynlock, (st), (i), (val)) +# define sk_CRYPTO_dynlock_zero(st) SKM_sk_zero(CRYPTO_dynlock, (st)) +# define sk_CRYPTO_dynlock_push(st, val) SKM_sk_push(CRYPTO_dynlock, (st), (val)) +# define sk_CRYPTO_dynlock_unshift(st, val) SKM_sk_unshift(CRYPTO_dynlock, (st), (val)) +# define sk_CRYPTO_dynlock_find(st, val) SKM_sk_find(CRYPTO_dynlock, (st), (val)) +# define sk_CRYPTO_dynlock_find_ex(st, val) SKM_sk_find_ex(CRYPTO_dynlock, (st), (val)) +# define sk_CRYPTO_dynlock_delete(st, i) SKM_sk_delete(CRYPTO_dynlock, (st), (i)) +# define sk_CRYPTO_dynlock_delete_ptr(st, ptr) SKM_sk_delete_ptr(CRYPTO_dynlock, (st), (ptr)) +# define sk_CRYPTO_dynlock_insert(st, val, i) SKM_sk_insert(CRYPTO_dynlock, (st), (val), (i)) +# define sk_CRYPTO_dynlock_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CRYPTO_dynlock, (st), (cmp)) +# define sk_CRYPTO_dynlock_dup(st) SKM_sk_dup(CRYPTO_dynlock, st) +# define sk_CRYPTO_dynlock_pop_free(st, free_func) SKM_sk_pop_free(CRYPTO_dynlock, (st), (free_func)) +# define sk_CRYPTO_dynlock_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(CRYPTO_dynlock, (st), (copy_func), (free_func)) +# define sk_CRYPTO_dynlock_shift(st) SKM_sk_shift(CRYPTO_dynlock, (st)) +# define sk_CRYPTO_dynlock_pop(st) SKM_sk_pop(CRYPTO_dynlock, (st)) +# define sk_CRYPTO_dynlock_sort(st) SKM_sk_sort(CRYPTO_dynlock, (st)) +# define sk_CRYPTO_dynlock_is_sorted(st) SKM_sk_is_sorted(CRYPTO_dynlock, (st)) +# define sk_DIST_POINT_new(cmp) SKM_sk_new(DIST_POINT, (cmp)) +# define sk_DIST_POINT_new_null() SKM_sk_new_null(DIST_POINT) +# define sk_DIST_POINT_free(st) SKM_sk_free(DIST_POINT, (st)) +# define sk_DIST_POINT_num(st) SKM_sk_num(DIST_POINT, (st)) +# define sk_DIST_POINT_value(st, i) SKM_sk_value(DIST_POINT, (st), (i)) +# define sk_DIST_POINT_set(st, i, val) SKM_sk_set(DIST_POINT, (st), (i), (val)) +# define sk_DIST_POINT_zero(st) SKM_sk_zero(DIST_POINT, (st)) +# define sk_DIST_POINT_push(st, val) SKM_sk_push(DIST_POINT, (st), (val)) +# define sk_DIST_POINT_unshift(st, val) SKM_sk_unshift(DIST_POINT, (st), (val)) +# define sk_DIST_POINT_find(st, val) SKM_sk_find(DIST_POINT, (st), (val)) +# define sk_DIST_POINT_find_ex(st, val) SKM_sk_find_ex(DIST_POINT, (st), (val)) +# define sk_DIST_POINT_delete(st, i) SKM_sk_delete(DIST_POINT, (st), (i)) +# define sk_DIST_POINT_delete_ptr(st, ptr) SKM_sk_delete_ptr(DIST_POINT, (st), (ptr)) +# define sk_DIST_POINT_insert(st, val, i) SKM_sk_insert(DIST_POINT, (st), (val), (i)) +# define sk_DIST_POINT_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(DIST_POINT, (st), (cmp)) +# define sk_DIST_POINT_dup(st) SKM_sk_dup(DIST_POINT, st) +# define sk_DIST_POINT_pop_free(st, free_func) SKM_sk_pop_free(DIST_POINT, (st), (free_func)) +# define sk_DIST_POINT_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(DIST_POINT, (st), (copy_func), (free_func)) +# define sk_DIST_POINT_shift(st) SKM_sk_shift(DIST_POINT, (st)) +# define sk_DIST_POINT_pop(st) SKM_sk_pop(DIST_POINT, (st)) +# define sk_DIST_POINT_sort(st) SKM_sk_sort(DIST_POINT, (st)) +# define sk_DIST_POINT_is_sorted(st) SKM_sk_is_sorted(DIST_POINT, (st)) +# define sk_ENGINE_new(cmp) SKM_sk_new(ENGINE, (cmp)) +# define sk_ENGINE_new_null() SKM_sk_new_null(ENGINE) +# define sk_ENGINE_free(st) SKM_sk_free(ENGINE, (st)) +# define sk_ENGINE_num(st) SKM_sk_num(ENGINE, (st)) +# define sk_ENGINE_value(st, i) SKM_sk_value(ENGINE, (st), (i)) +# define sk_ENGINE_set(st, i, val) SKM_sk_set(ENGINE, (st), (i), (val)) +# define sk_ENGINE_zero(st) SKM_sk_zero(ENGINE, (st)) +# define sk_ENGINE_push(st, val) SKM_sk_push(ENGINE, (st), (val)) +# define sk_ENGINE_unshift(st, val) SKM_sk_unshift(ENGINE, (st), (val)) +# define sk_ENGINE_find(st, val) SKM_sk_find(ENGINE, (st), (val)) +# define sk_ENGINE_find_ex(st, val) SKM_sk_find_ex(ENGINE, (st), (val)) +# define sk_ENGINE_delete(st, i) SKM_sk_delete(ENGINE, (st), (i)) +# define sk_ENGINE_delete_ptr(st, ptr) SKM_sk_delete_ptr(ENGINE, (st), (ptr)) +# define sk_ENGINE_insert(st, val, i) SKM_sk_insert(ENGINE, (st), (val), (i)) +# define sk_ENGINE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ENGINE, (st), (cmp)) +# define sk_ENGINE_dup(st) SKM_sk_dup(ENGINE, st) +# define sk_ENGINE_pop_free(st, free_func) SKM_sk_pop_free(ENGINE, (st), (free_func)) +# define sk_ENGINE_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(ENGINE, (st), (copy_func), (free_func)) +# define sk_ENGINE_shift(st) SKM_sk_shift(ENGINE, (st)) +# define sk_ENGINE_pop(st) SKM_sk_pop(ENGINE, (st)) +# define sk_ENGINE_sort(st) SKM_sk_sort(ENGINE, (st)) +# define sk_ENGINE_is_sorted(st) SKM_sk_is_sorted(ENGINE, (st)) +# define sk_ENGINE_CLEANUP_ITEM_new(cmp) SKM_sk_new(ENGINE_CLEANUP_ITEM, (cmp)) +# define sk_ENGINE_CLEANUP_ITEM_new_null() SKM_sk_new_null(ENGINE_CLEANUP_ITEM) +# define sk_ENGINE_CLEANUP_ITEM_free(st) SKM_sk_free(ENGINE_CLEANUP_ITEM, (st)) +# define sk_ENGINE_CLEANUP_ITEM_num(st) SKM_sk_num(ENGINE_CLEANUP_ITEM, (st)) +# define sk_ENGINE_CLEANUP_ITEM_value(st, i) SKM_sk_value(ENGINE_CLEANUP_ITEM, (st), (i)) +# define sk_ENGINE_CLEANUP_ITEM_set(st, i, val) SKM_sk_set(ENGINE_CLEANUP_ITEM, (st), (i), (val)) +# define sk_ENGINE_CLEANUP_ITEM_zero(st) SKM_sk_zero(ENGINE_CLEANUP_ITEM, (st)) +# define sk_ENGINE_CLEANUP_ITEM_push(st, val) SKM_sk_push(ENGINE_CLEANUP_ITEM, (st), (val)) +# define sk_ENGINE_CLEANUP_ITEM_unshift(st, val) SKM_sk_unshift(ENGINE_CLEANUP_ITEM, (st), (val)) +# define sk_ENGINE_CLEANUP_ITEM_find(st, val) SKM_sk_find(ENGINE_CLEANUP_ITEM, (st), (val)) +# define sk_ENGINE_CLEANUP_ITEM_find_ex(st, val) SKM_sk_find_ex(ENGINE_CLEANUP_ITEM, (st), (val)) +# define sk_ENGINE_CLEANUP_ITEM_delete(st, i) SKM_sk_delete(ENGINE_CLEANUP_ITEM, (st), (i)) +# define sk_ENGINE_CLEANUP_ITEM_delete_ptr(st, ptr) SKM_sk_delete_ptr(ENGINE_CLEANUP_ITEM, (st), (ptr)) +# define sk_ENGINE_CLEANUP_ITEM_insert(st, val, i) SKM_sk_insert(ENGINE_CLEANUP_ITEM, (st), (val), (i)) +# define sk_ENGINE_CLEANUP_ITEM_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ENGINE_CLEANUP_ITEM, (st), (cmp)) +# define sk_ENGINE_CLEANUP_ITEM_dup(st) SKM_sk_dup(ENGINE_CLEANUP_ITEM, st) +# define sk_ENGINE_CLEANUP_ITEM_pop_free(st, free_func) SKM_sk_pop_free(ENGINE_CLEANUP_ITEM, (st), (free_func)) +# define sk_ENGINE_CLEANUP_ITEM_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(ENGINE_CLEANUP_ITEM, (st), (copy_func), (free_func)) +# define sk_ENGINE_CLEANUP_ITEM_shift(st) SKM_sk_shift(ENGINE_CLEANUP_ITEM, (st)) +# define sk_ENGINE_CLEANUP_ITEM_pop(st) SKM_sk_pop(ENGINE_CLEANUP_ITEM, (st)) +# define sk_ENGINE_CLEANUP_ITEM_sort(st) SKM_sk_sort(ENGINE_CLEANUP_ITEM, (st)) +# define sk_ENGINE_CLEANUP_ITEM_is_sorted(st) SKM_sk_is_sorted(ENGINE_CLEANUP_ITEM, (st)) +# define sk_ESS_CERT_ID_new(cmp) SKM_sk_new(ESS_CERT_ID, (cmp)) +# define sk_ESS_CERT_ID_new_null() SKM_sk_new_null(ESS_CERT_ID) +# define sk_ESS_CERT_ID_free(st) SKM_sk_free(ESS_CERT_ID, (st)) +# define sk_ESS_CERT_ID_num(st) SKM_sk_num(ESS_CERT_ID, (st)) +# define sk_ESS_CERT_ID_value(st, i) SKM_sk_value(ESS_CERT_ID, (st), (i)) +# define sk_ESS_CERT_ID_set(st, i, val) SKM_sk_set(ESS_CERT_ID, (st), (i), (val)) +# define sk_ESS_CERT_ID_zero(st) SKM_sk_zero(ESS_CERT_ID, (st)) +# define sk_ESS_CERT_ID_push(st, val) SKM_sk_push(ESS_CERT_ID, (st), (val)) +# define sk_ESS_CERT_ID_unshift(st, val) SKM_sk_unshift(ESS_CERT_ID, (st), (val)) +# define sk_ESS_CERT_ID_find(st, val) SKM_sk_find(ESS_CERT_ID, (st), (val)) +# define sk_ESS_CERT_ID_find_ex(st, val) SKM_sk_find_ex(ESS_CERT_ID, (st), (val)) +# define sk_ESS_CERT_ID_delete(st, i) SKM_sk_delete(ESS_CERT_ID, (st), (i)) +# define sk_ESS_CERT_ID_delete_ptr(st, ptr) SKM_sk_delete_ptr(ESS_CERT_ID, (st), (ptr)) +# define sk_ESS_CERT_ID_insert(st, val, i) SKM_sk_insert(ESS_CERT_ID, (st), (val), (i)) +# define sk_ESS_CERT_ID_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ESS_CERT_ID, (st), (cmp)) +# define sk_ESS_CERT_ID_dup(st) SKM_sk_dup(ESS_CERT_ID, st) +# define sk_ESS_CERT_ID_pop_free(st, free_func) SKM_sk_pop_free(ESS_CERT_ID, (st), (free_func)) +# define sk_ESS_CERT_ID_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(ESS_CERT_ID, (st), (copy_func), (free_func)) +# define sk_ESS_CERT_ID_shift(st) SKM_sk_shift(ESS_CERT_ID, (st)) +# define sk_ESS_CERT_ID_pop(st) SKM_sk_pop(ESS_CERT_ID, (st)) +# define sk_ESS_CERT_ID_sort(st) SKM_sk_sort(ESS_CERT_ID, (st)) +# define sk_ESS_CERT_ID_is_sorted(st) SKM_sk_is_sorted(ESS_CERT_ID, (st)) +# define sk_EVP_MD_new(cmp) SKM_sk_new(EVP_MD, (cmp)) +# define sk_EVP_MD_new_null() SKM_sk_new_null(EVP_MD) +# define sk_EVP_MD_free(st) SKM_sk_free(EVP_MD, (st)) +# define sk_EVP_MD_num(st) SKM_sk_num(EVP_MD, (st)) +# define sk_EVP_MD_value(st, i) SKM_sk_value(EVP_MD, (st), (i)) +# define sk_EVP_MD_set(st, i, val) SKM_sk_set(EVP_MD, (st), (i), (val)) +# define sk_EVP_MD_zero(st) SKM_sk_zero(EVP_MD, (st)) +# define sk_EVP_MD_push(st, val) SKM_sk_push(EVP_MD, (st), (val)) +# define sk_EVP_MD_unshift(st, val) SKM_sk_unshift(EVP_MD, (st), (val)) +# define sk_EVP_MD_find(st, val) SKM_sk_find(EVP_MD, (st), (val)) +# define sk_EVP_MD_find_ex(st, val) SKM_sk_find_ex(EVP_MD, (st), (val)) +# define sk_EVP_MD_delete(st, i) SKM_sk_delete(EVP_MD, (st), (i)) +# define sk_EVP_MD_delete_ptr(st, ptr) SKM_sk_delete_ptr(EVP_MD, (st), (ptr)) +# define sk_EVP_MD_insert(st, val, i) SKM_sk_insert(EVP_MD, (st), (val), (i)) +# define sk_EVP_MD_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(EVP_MD, (st), (cmp)) +# define sk_EVP_MD_dup(st) SKM_sk_dup(EVP_MD, st) +# define sk_EVP_MD_pop_free(st, free_func) SKM_sk_pop_free(EVP_MD, (st), (free_func)) +# define sk_EVP_MD_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(EVP_MD, (st), (copy_func), (free_func)) +# define sk_EVP_MD_shift(st) SKM_sk_shift(EVP_MD, (st)) +# define sk_EVP_MD_pop(st) SKM_sk_pop(EVP_MD, (st)) +# define sk_EVP_MD_sort(st) SKM_sk_sort(EVP_MD, (st)) +# define sk_EVP_MD_is_sorted(st) SKM_sk_is_sorted(EVP_MD, (st)) +# define sk_EVP_PBE_CTL_new(cmp) SKM_sk_new(EVP_PBE_CTL, (cmp)) +# define sk_EVP_PBE_CTL_new_null() SKM_sk_new_null(EVP_PBE_CTL) +# define sk_EVP_PBE_CTL_free(st) SKM_sk_free(EVP_PBE_CTL, (st)) +# define sk_EVP_PBE_CTL_num(st) SKM_sk_num(EVP_PBE_CTL, (st)) +# define sk_EVP_PBE_CTL_value(st, i) SKM_sk_value(EVP_PBE_CTL, (st), (i)) +# define sk_EVP_PBE_CTL_set(st, i, val) SKM_sk_set(EVP_PBE_CTL, (st), (i), (val)) +# define sk_EVP_PBE_CTL_zero(st) SKM_sk_zero(EVP_PBE_CTL, (st)) +# define sk_EVP_PBE_CTL_push(st, val) SKM_sk_push(EVP_PBE_CTL, (st), (val)) +# define sk_EVP_PBE_CTL_unshift(st, val) SKM_sk_unshift(EVP_PBE_CTL, (st), (val)) +# define sk_EVP_PBE_CTL_find(st, val) SKM_sk_find(EVP_PBE_CTL, (st), (val)) +# define sk_EVP_PBE_CTL_find_ex(st, val) SKM_sk_find_ex(EVP_PBE_CTL, (st), (val)) +# define sk_EVP_PBE_CTL_delete(st, i) SKM_sk_delete(EVP_PBE_CTL, (st), (i)) +# define sk_EVP_PBE_CTL_delete_ptr(st, ptr) SKM_sk_delete_ptr(EVP_PBE_CTL, (st), (ptr)) +# define sk_EVP_PBE_CTL_insert(st, val, i) SKM_sk_insert(EVP_PBE_CTL, (st), (val), (i)) +# define sk_EVP_PBE_CTL_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(EVP_PBE_CTL, (st), (cmp)) +# define sk_EVP_PBE_CTL_dup(st) SKM_sk_dup(EVP_PBE_CTL, st) +# define sk_EVP_PBE_CTL_pop_free(st, free_func) SKM_sk_pop_free(EVP_PBE_CTL, (st), (free_func)) +# define sk_EVP_PBE_CTL_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(EVP_PBE_CTL, (st), (copy_func), (free_func)) +# define sk_EVP_PBE_CTL_shift(st) SKM_sk_shift(EVP_PBE_CTL, (st)) +# define sk_EVP_PBE_CTL_pop(st) SKM_sk_pop(EVP_PBE_CTL, (st)) +# define sk_EVP_PBE_CTL_sort(st) SKM_sk_sort(EVP_PBE_CTL, (st)) +# define sk_EVP_PBE_CTL_is_sorted(st) SKM_sk_is_sorted(EVP_PBE_CTL, (st)) +# define sk_EVP_PKEY_ASN1_METHOD_new(cmp) SKM_sk_new(EVP_PKEY_ASN1_METHOD, (cmp)) +# define sk_EVP_PKEY_ASN1_METHOD_new_null() SKM_sk_new_null(EVP_PKEY_ASN1_METHOD) +# define sk_EVP_PKEY_ASN1_METHOD_free(st) SKM_sk_free(EVP_PKEY_ASN1_METHOD, (st)) +# define sk_EVP_PKEY_ASN1_METHOD_num(st) SKM_sk_num(EVP_PKEY_ASN1_METHOD, (st)) +# define sk_EVP_PKEY_ASN1_METHOD_value(st, i) SKM_sk_value(EVP_PKEY_ASN1_METHOD, (st), (i)) +# define sk_EVP_PKEY_ASN1_METHOD_set(st, i, val) SKM_sk_set(EVP_PKEY_ASN1_METHOD, (st), (i), (val)) +# define sk_EVP_PKEY_ASN1_METHOD_zero(st) SKM_sk_zero(EVP_PKEY_ASN1_METHOD, (st)) +# define sk_EVP_PKEY_ASN1_METHOD_push(st, val) SKM_sk_push(EVP_PKEY_ASN1_METHOD, (st), (val)) +# define sk_EVP_PKEY_ASN1_METHOD_unshift(st, val) SKM_sk_unshift(EVP_PKEY_ASN1_METHOD, (st), (val)) +# define sk_EVP_PKEY_ASN1_METHOD_find(st, val) SKM_sk_find(EVP_PKEY_ASN1_METHOD, (st), (val)) +# define sk_EVP_PKEY_ASN1_METHOD_find_ex(st, val) SKM_sk_find_ex(EVP_PKEY_ASN1_METHOD, (st), (val)) +# define sk_EVP_PKEY_ASN1_METHOD_delete(st, i) SKM_sk_delete(EVP_PKEY_ASN1_METHOD, (st), (i)) +# define sk_EVP_PKEY_ASN1_METHOD_delete_ptr(st, ptr) SKM_sk_delete_ptr(EVP_PKEY_ASN1_METHOD, (st), (ptr)) +# define sk_EVP_PKEY_ASN1_METHOD_insert(st, val, i) SKM_sk_insert(EVP_PKEY_ASN1_METHOD, (st), (val), (i)) +# define sk_EVP_PKEY_ASN1_METHOD_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(EVP_PKEY_ASN1_METHOD, (st), (cmp)) +# define sk_EVP_PKEY_ASN1_METHOD_dup(st) SKM_sk_dup(EVP_PKEY_ASN1_METHOD, st) +# define sk_EVP_PKEY_ASN1_METHOD_pop_free(st, free_func) SKM_sk_pop_free(EVP_PKEY_ASN1_METHOD, (st), (free_func)) +# define sk_EVP_PKEY_ASN1_METHOD_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(EVP_PKEY_ASN1_METHOD, (st), (copy_func), (free_func)) +# define sk_EVP_PKEY_ASN1_METHOD_shift(st) SKM_sk_shift(EVP_PKEY_ASN1_METHOD, (st)) +# define sk_EVP_PKEY_ASN1_METHOD_pop(st) SKM_sk_pop(EVP_PKEY_ASN1_METHOD, (st)) +# define sk_EVP_PKEY_ASN1_METHOD_sort(st) SKM_sk_sort(EVP_PKEY_ASN1_METHOD, (st)) +# define sk_EVP_PKEY_ASN1_METHOD_is_sorted(st) SKM_sk_is_sorted(EVP_PKEY_ASN1_METHOD, (st)) +# define sk_EVP_PKEY_METHOD_new(cmp) SKM_sk_new(EVP_PKEY_METHOD, (cmp)) +# define sk_EVP_PKEY_METHOD_new_null() SKM_sk_new_null(EVP_PKEY_METHOD) +# define sk_EVP_PKEY_METHOD_free(st) SKM_sk_free(EVP_PKEY_METHOD, (st)) +# define sk_EVP_PKEY_METHOD_num(st) SKM_sk_num(EVP_PKEY_METHOD, (st)) +# define sk_EVP_PKEY_METHOD_value(st, i) SKM_sk_value(EVP_PKEY_METHOD, (st), (i)) +# define sk_EVP_PKEY_METHOD_set(st, i, val) SKM_sk_set(EVP_PKEY_METHOD, (st), (i), (val)) +# define sk_EVP_PKEY_METHOD_zero(st) SKM_sk_zero(EVP_PKEY_METHOD, (st)) +# define sk_EVP_PKEY_METHOD_push(st, val) SKM_sk_push(EVP_PKEY_METHOD, (st), (val)) +# define sk_EVP_PKEY_METHOD_unshift(st, val) SKM_sk_unshift(EVP_PKEY_METHOD, (st), (val)) +# define sk_EVP_PKEY_METHOD_find(st, val) SKM_sk_find(EVP_PKEY_METHOD, (st), (val)) +# define sk_EVP_PKEY_METHOD_find_ex(st, val) SKM_sk_find_ex(EVP_PKEY_METHOD, (st), (val)) +# define sk_EVP_PKEY_METHOD_delete(st, i) SKM_sk_delete(EVP_PKEY_METHOD, (st), (i)) +# define sk_EVP_PKEY_METHOD_delete_ptr(st, ptr) SKM_sk_delete_ptr(EVP_PKEY_METHOD, (st), (ptr)) +# define sk_EVP_PKEY_METHOD_insert(st, val, i) SKM_sk_insert(EVP_PKEY_METHOD, (st), (val), (i)) +# define sk_EVP_PKEY_METHOD_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(EVP_PKEY_METHOD, (st), (cmp)) +# define sk_EVP_PKEY_METHOD_dup(st) SKM_sk_dup(EVP_PKEY_METHOD, st) +# define sk_EVP_PKEY_METHOD_pop_free(st, free_func) SKM_sk_pop_free(EVP_PKEY_METHOD, (st), (free_func)) +# define sk_EVP_PKEY_METHOD_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(EVP_PKEY_METHOD, (st), (copy_func), (free_func)) +# define sk_EVP_PKEY_METHOD_shift(st) SKM_sk_shift(EVP_PKEY_METHOD, (st)) +# define sk_EVP_PKEY_METHOD_pop(st) SKM_sk_pop(EVP_PKEY_METHOD, (st)) +# define sk_EVP_PKEY_METHOD_sort(st) SKM_sk_sort(EVP_PKEY_METHOD, (st)) +# define sk_EVP_PKEY_METHOD_is_sorted(st) SKM_sk_is_sorted(EVP_PKEY_METHOD, (st)) +# define sk_GENERAL_NAME_new(cmp) SKM_sk_new(GENERAL_NAME, (cmp)) +# define sk_GENERAL_NAME_new_null() SKM_sk_new_null(GENERAL_NAME) +# define sk_GENERAL_NAME_free(st) SKM_sk_free(GENERAL_NAME, (st)) +# define sk_GENERAL_NAME_num(st) SKM_sk_num(GENERAL_NAME, (st)) +# define sk_GENERAL_NAME_value(st, i) SKM_sk_value(GENERAL_NAME, (st), (i)) +# define sk_GENERAL_NAME_set(st, i, val) SKM_sk_set(GENERAL_NAME, (st), (i), (val)) +# define sk_GENERAL_NAME_zero(st) SKM_sk_zero(GENERAL_NAME, (st)) +# define sk_GENERAL_NAME_push(st, val) SKM_sk_push(GENERAL_NAME, (st), (val)) +# define sk_GENERAL_NAME_unshift(st, val) SKM_sk_unshift(GENERAL_NAME, (st), (val)) +# define sk_GENERAL_NAME_find(st, val) SKM_sk_find(GENERAL_NAME, (st), (val)) +# define sk_GENERAL_NAME_find_ex(st, val) SKM_sk_find_ex(GENERAL_NAME, (st), (val)) +# define sk_GENERAL_NAME_delete(st, i) SKM_sk_delete(GENERAL_NAME, (st), (i)) +# define sk_GENERAL_NAME_delete_ptr(st, ptr) SKM_sk_delete_ptr(GENERAL_NAME, (st), (ptr)) +# define sk_GENERAL_NAME_insert(st, val, i) SKM_sk_insert(GENERAL_NAME, (st), (val), (i)) +# define sk_GENERAL_NAME_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(GENERAL_NAME, (st), (cmp)) +# define sk_GENERAL_NAME_dup(st) SKM_sk_dup(GENERAL_NAME, st) +# define sk_GENERAL_NAME_pop_free(st, free_func) SKM_sk_pop_free(GENERAL_NAME, (st), (free_func)) +# define sk_GENERAL_NAME_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(GENERAL_NAME, (st), (copy_func), (free_func)) +# define sk_GENERAL_NAME_shift(st) SKM_sk_shift(GENERAL_NAME, (st)) +# define sk_GENERAL_NAME_pop(st) SKM_sk_pop(GENERAL_NAME, (st)) +# define sk_GENERAL_NAME_sort(st) SKM_sk_sort(GENERAL_NAME, (st)) +# define sk_GENERAL_NAME_is_sorted(st) SKM_sk_is_sorted(GENERAL_NAME, (st)) +# define sk_GENERAL_NAMES_new(cmp) SKM_sk_new(GENERAL_NAMES, (cmp)) +# define sk_GENERAL_NAMES_new_null() SKM_sk_new_null(GENERAL_NAMES) +# define sk_GENERAL_NAMES_free(st) SKM_sk_free(GENERAL_NAMES, (st)) +# define sk_GENERAL_NAMES_num(st) SKM_sk_num(GENERAL_NAMES, (st)) +# define sk_GENERAL_NAMES_value(st, i) SKM_sk_value(GENERAL_NAMES, (st), (i)) +# define sk_GENERAL_NAMES_set(st, i, val) SKM_sk_set(GENERAL_NAMES, (st), (i), (val)) +# define sk_GENERAL_NAMES_zero(st) SKM_sk_zero(GENERAL_NAMES, (st)) +# define sk_GENERAL_NAMES_push(st, val) SKM_sk_push(GENERAL_NAMES, (st), (val)) +# define sk_GENERAL_NAMES_unshift(st, val) SKM_sk_unshift(GENERAL_NAMES, (st), (val)) +# define sk_GENERAL_NAMES_find(st, val) SKM_sk_find(GENERAL_NAMES, (st), (val)) +# define sk_GENERAL_NAMES_find_ex(st, val) SKM_sk_find_ex(GENERAL_NAMES, (st), (val)) +# define sk_GENERAL_NAMES_delete(st, i) SKM_sk_delete(GENERAL_NAMES, (st), (i)) +# define sk_GENERAL_NAMES_delete_ptr(st, ptr) SKM_sk_delete_ptr(GENERAL_NAMES, (st), (ptr)) +# define sk_GENERAL_NAMES_insert(st, val, i) SKM_sk_insert(GENERAL_NAMES, (st), (val), (i)) +# define sk_GENERAL_NAMES_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(GENERAL_NAMES, (st), (cmp)) +# define sk_GENERAL_NAMES_dup(st) SKM_sk_dup(GENERAL_NAMES, st) +# define sk_GENERAL_NAMES_pop_free(st, free_func) SKM_sk_pop_free(GENERAL_NAMES, (st), (free_func)) +# define sk_GENERAL_NAMES_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(GENERAL_NAMES, (st), (copy_func), (free_func)) +# define sk_GENERAL_NAMES_shift(st) SKM_sk_shift(GENERAL_NAMES, (st)) +# define sk_GENERAL_NAMES_pop(st) SKM_sk_pop(GENERAL_NAMES, (st)) +# define sk_GENERAL_NAMES_sort(st) SKM_sk_sort(GENERAL_NAMES, (st)) +# define sk_GENERAL_NAMES_is_sorted(st) SKM_sk_is_sorted(GENERAL_NAMES, (st)) +# define sk_GENERAL_SUBTREE_new(cmp) SKM_sk_new(GENERAL_SUBTREE, (cmp)) +# define sk_GENERAL_SUBTREE_new_null() SKM_sk_new_null(GENERAL_SUBTREE) +# define sk_GENERAL_SUBTREE_free(st) SKM_sk_free(GENERAL_SUBTREE, (st)) +# define sk_GENERAL_SUBTREE_num(st) SKM_sk_num(GENERAL_SUBTREE, (st)) +# define sk_GENERAL_SUBTREE_value(st, i) SKM_sk_value(GENERAL_SUBTREE, (st), (i)) +# define sk_GENERAL_SUBTREE_set(st, i, val) SKM_sk_set(GENERAL_SUBTREE, (st), (i), (val)) +# define sk_GENERAL_SUBTREE_zero(st) SKM_sk_zero(GENERAL_SUBTREE, (st)) +# define sk_GENERAL_SUBTREE_push(st, val) SKM_sk_push(GENERAL_SUBTREE, (st), (val)) +# define sk_GENERAL_SUBTREE_unshift(st, val) SKM_sk_unshift(GENERAL_SUBTREE, (st), (val)) +# define sk_GENERAL_SUBTREE_find(st, val) SKM_sk_find(GENERAL_SUBTREE, (st), (val)) +# define sk_GENERAL_SUBTREE_find_ex(st, val) SKM_sk_find_ex(GENERAL_SUBTREE, (st), (val)) +# define sk_GENERAL_SUBTREE_delete(st, i) SKM_sk_delete(GENERAL_SUBTREE, (st), (i)) +# define sk_GENERAL_SUBTREE_delete_ptr(st, ptr) SKM_sk_delete_ptr(GENERAL_SUBTREE, (st), (ptr)) +# define sk_GENERAL_SUBTREE_insert(st, val, i) SKM_sk_insert(GENERAL_SUBTREE, (st), (val), (i)) +# define sk_GENERAL_SUBTREE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(GENERAL_SUBTREE, (st), (cmp)) +# define sk_GENERAL_SUBTREE_dup(st) SKM_sk_dup(GENERAL_SUBTREE, st) +# define sk_GENERAL_SUBTREE_pop_free(st, free_func) SKM_sk_pop_free(GENERAL_SUBTREE, (st), (free_func)) +# define sk_GENERAL_SUBTREE_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(GENERAL_SUBTREE, (st), (copy_func), (free_func)) +# define sk_GENERAL_SUBTREE_shift(st) SKM_sk_shift(GENERAL_SUBTREE, (st)) +# define sk_GENERAL_SUBTREE_pop(st) SKM_sk_pop(GENERAL_SUBTREE, (st)) +# define sk_GENERAL_SUBTREE_sort(st) SKM_sk_sort(GENERAL_SUBTREE, (st)) +# define sk_GENERAL_SUBTREE_is_sorted(st) SKM_sk_is_sorted(GENERAL_SUBTREE, (st)) +# define sk_IPAddressFamily_new(cmp) SKM_sk_new(IPAddressFamily, (cmp)) +# define sk_IPAddressFamily_new_null() SKM_sk_new_null(IPAddressFamily) +# define sk_IPAddressFamily_free(st) SKM_sk_free(IPAddressFamily, (st)) +# define sk_IPAddressFamily_num(st) SKM_sk_num(IPAddressFamily, (st)) +# define sk_IPAddressFamily_value(st, i) SKM_sk_value(IPAddressFamily, (st), (i)) +# define sk_IPAddressFamily_set(st, i, val) SKM_sk_set(IPAddressFamily, (st), (i), (val)) +# define sk_IPAddressFamily_zero(st) SKM_sk_zero(IPAddressFamily, (st)) +# define sk_IPAddressFamily_push(st, val) SKM_sk_push(IPAddressFamily, (st), (val)) +# define sk_IPAddressFamily_unshift(st, val) SKM_sk_unshift(IPAddressFamily, (st), (val)) +# define sk_IPAddressFamily_find(st, val) SKM_sk_find(IPAddressFamily, (st), (val)) +# define sk_IPAddressFamily_find_ex(st, val) SKM_sk_find_ex(IPAddressFamily, (st), (val)) +# define sk_IPAddressFamily_delete(st, i) SKM_sk_delete(IPAddressFamily, (st), (i)) +# define sk_IPAddressFamily_delete_ptr(st, ptr) SKM_sk_delete_ptr(IPAddressFamily, (st), (ptr)) +# define sk_IPAddressFamily_insert(st, val, i) SKM_sk_insert(IPAddressFamily, (st), (val), (i)) +# define sk_IPAddressFamily_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(IPAddressFamily, (st), (cmp)) +# define sk_IPAddressFamily_dup(st) SKM_sk_dup(IPAddressFamily, st) +# define sk_IPAddressFamily_pop_free(st, free_func) SKM_sk_pop_free(IPAddressFamily, (st), (free_func)) +# define sk_IPAddressFamily_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(IPAddressFamily, (st), (copy_func), (free_func)) +# define sk_IPAddressFamily_shift(st) SKM_sk_shift(IPAddressFamily, (st)) +# define sk_IPAddressFamily_pop(st) SKM_sk_pop(IPAddressFamily, (st)) +# define sk_IPAddressFamily_sort(st) SKM_sk_sort(IPAddressFamily, (st)) +# define sk_IPAddressFamily_is_sorted(st) SKM_sk_is_sorted(IPAddressFamily, (st)) +# define sk_IPAddressOrRange_new(cmp) SKM_sk_new(IPAddressOrRange, (cmp)) +# define sk_IPAddressOrRange_new_null() SKM_sk_new_null(IPAddressOrRange) +# define sk_IPAddressOrRange_free(st) SKM_sk_free(IPAddressOrRange, (st)) +# define sk_IPAddressOrRange_num(st) SKM_sk_num(IPAddressOrRange, (st)) +# define sk_IPAddressOrRange_value(st, i) SKM_sk_value(IPAddressOrRange, (st), (i)) +# define sk_IPAddressOrRange_set(st, i, val) SKM_sk_set(IPAddressOrRange, (st), (i), (val)) +# define sk_IPAddressOrRange_zero(st) SKM_sk_zero(IPAddressOrRange, (st)) +# define sk_IPAddressOrRange_push(st, val) SKM_sk_push(IPAddressOrRange, (st), (val)) +# define sk_IPAddressOrRange_unshift(st, val) SKM_sk_unshift(IPAddressOrRange, (st), (val)) +# define sk_IPAddressOrRange_find(st, val) SKM_sk_find(IPAddressOrRange, (st), (val)) +# define sk_IPAddressOrRange_find_ex(st, val) SKM_sk_find_ex(IPAddressOrRange, (st), (val)) +# define sk_IPAddressOrRange_delete(st, i) SKM_sk_delete(IPAddressOrRange, (st), (i)) +# define sk_IPAddressOrRange_delete_ptr(st, ptr) SKM_sk_delete_ptr(IPAddressOrRange, (st), (ptr)) +# define sk_IPAddressOrRange_insert(st, val, i) SKM_sk_insert(IPAddressOrRange, (st), (val), (i)) +# define sk_IPAddressOrRange_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(IPAddressOrRange, (st), (cmp)) +# define sk_IPAddressOrRange_dup(st) SKM_sk_dup(IPAddressOrRange, st) +# define sk_IPAddressOrRange_pop_free(st, free_func) SKM_sk_pop_free(IPAddressOrRange, (st), (free_func)) +# define sk_IPAddressOrRange_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(IPAddressOrRange, (st), (copy_func), (free_func)) +# define sk_IPAddressOrRange_shift(st) SKM_sk_shift(IPAddressOrRange, (st)) +# define sk_IPAddressOrRange_pop(st) SKM_sk_pop(IPAddressOrRange, (st)) +# define sk_IPAddressOrRange_sort(st) SKM_sk_sort(IPAddressOrRange, (st)) +# define sk_IPAddressOrRange_is_sorted(st) SKM_sk_is_sorted(IPAddressOrRange, (st)) +# define sk_KRB5_APREQBODY_new(cmp) SKM_sk_new(KRB5_APREQBODY, (cmp)) +# define sk_KRB5_APREQBODY_new_null() SKM_sk_new_null(KRB5_APREQBODY) +# define sk_KRB5_APREQBODY_free(st) SKM_sk_free(KRB5_APREQBODY, (st)) +# define sk_KRB5_APREQBODY_num(st) SKM_sk_num(KRB5_APREQBODY, (st)) +# define sk_KRB5_APREQBODY_value(st, i) SKM_sk_value(KRB5_APREQBODY, (st), (i)) +# define sk_KRB5_APREQBODY_set(st, i, val) SKM_sk_set(KRB5_APREQBODY, (st), (i), (val)) +# define sk_KRB5_APREQBODY_zero(st) SKM_sk_zero(KRB5_APREQBODY, (st)) +# define sk_KRB5_APREQBODY_push(st, val) SKM_sk_push(KRB5_APREQBODY, (st), (val)) +# define sk_KRB5_APREQBODY_unshift(st, val) SKM_sk_unshift(KRB5_APREQBODY, (st), (val)) +# define sk_KRB5_APREQBODY_find(st, val) SKM_sk_find(KRB5_APREQBODY, (st), (val)) +# define sk_KRB5_APREQBODY_find_ex(st, val) SKM_sk_find_ex(KRB5_APREQBODY, (st), (val)) +# define sk_KRB5_APREQBODY_delete(st, i) SKM_sk_delete(KRB5_APREQBODY, (st), (i)) +# define sk_KRB5_APREQBODY_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_APREQBODY, (st), (ptr)) +# define sk_KRB5_APREQBODY_insert(st, val, i) SKM_sk_insert(KRB5_APREQBODY, (st), (val), (i)) +# define sk_KRB5_APREQBODY_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_APREQBODY, (st), (cmp)) +# define sk_KRB5_APREQBODY_dup(st) SKM_sk_dup(KRB5_APREQBODY, st) +# define sk_KRB5_APREQBODY_pop_free(st, free_func) SKM_sk_pop_free(KRB5_APREQBODY, (st), (free_func)) +# define sk_KRB5_APREQBODY_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(KRB5_APREQBODY, (st), (copy_func), (free_func)) +# define sk_KRB5_APREQBODY_shift(st) SKM_sk_shift(KRB5_APREQBODY, (st)) +# define sk_KRB5_APREQBODY_pop(st) SKM_sk_pop(KRB5_APREQBODY, (st)) +# define sk_KRB5_APREQBODY_sort(st) SKM_sk_sort(KRB5_APREQBODY, (st)) +# define sk_KRB5_APREQBODY_is_sorted(st) SKM_sk_is_sorted(KRB5_APREQBODY, (st)) +# define sk_KRB5_AUTHDATA_new(cmp) SKM_sk_new(KRB5_AUTHDATA, (cmp)) +# define sk_KRB5_AUTHDATA_new_null() SKM_sk_new_null(KRB5_AUTHDATA) +# define sk_KRB5_AUTHDATA_free(st) SKM_sk_free(KRB5_AUTHDATA, (st)) +# define sk_KRB5_AUTHDATA_num(st) SKM_sk_num(KRB5_AUTHDATA, (st)) +# define sk_KRB5_AUTHDATA_value(st, i) SKM_sk_value(KRB5_AUTHDATA, (st), (i)) +# define sk_KRB5_AUTHDATA_set(st, i, val) SKM_sk_set(KRB5_AUTHDATA, (st), (i), (val)) +# define sk_KRB5_AUTHDATA_zero(st) SKM_sk_zero(KRB5_AUTHDATA, (st)) +# define sk_KRB5_AUTHDATA_push(st, val) SKM_sk_push(KRB5_AUTHDATA, (st), (val)) +# define sk_KRB5_AUTHDATA_unshift(st, val) SKM_sk_unshift(KRB5_AUTHDATA, (st), (val)) +# define sk_KRB5_AUTHDATA_find(st, val) SKM_sk_find(KRB5_AUTHDATA, (st), (val)) +# define sk_KRB5_AUTHDATA_find_ex(st, val) SKM_sk_find_ex(KRB5_AUTHDATA, (st), (val)) +# define sk_KRB5_AUTHDATA_delete(st, i) SKM_sk_delete(KRB5_AUTHDATA, (st), (i)) +# define sk_KRB5_AUTHDATA_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_AUTHDATA, (st), (ptr)) +# define sk_KRB5_AUTHDATA_insert(st, val, i) SKM_sk_insert(KRB5_AUTHDATA, (st), (val), (i)) +# define sk_KRB5_AUTHDATA_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_AUTHDATA, (st), (cmp)) +# define sk_KRB5_AUTHDATA_dup(st) SKM_sk_dup(KRB5_AUTHDATA, st) +# define sk_KRB5_AUTHDATA_pop_free(st, free_func) SKM_sk_pop_free(KRB5_AUTHDATA, (st), (free_func)) +# define sk_KRB5_AUTHDATA_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(KRB5_AUTHDATA, (st), (copy_func), (free_func)) +# define sk_KRB5_AUTHDATA_shift(st) SKM_sk_shift(KRB5_AUTHDATA, (st)) +# define sk_KRB5_AUTHDATA_pop(st) SKM_sk_pop(KRB5_AUTHDATA, (st)) +# define sk_KRB5_AUTHDATA_sort(st) SKM_sk_sort(KRB5_AUTHDATA, (st)) +# define sk_KRB5_AUTHDATA_is_sorted(st) SKM_sk_is_sorted(KRB5_AUTHDATA, (st)) +# define sk_KRB5_AUTHENTBODY_new(cmp) SKM_sk_new(KRB5_AUTHENTBODY, (cmp)) +# define sk_KRB5_AUTHENTBODY_new_null() SKM_sk_new_null(KRB5_AUTHENTBODY) +# define sk_KRB5_AUTHENTBODY_free(st) SKM_sk_free(KRB5_AUTHENTBODY, (st)) +# define sk_KRB5_AUTHENTBODY_num(st) SKM_sk_num(KRB5_AUTHENTBODY, (st)) +# define sk_KRB5_AUTHENTBODY_value(st, i) SKM_sk_value(KRB5_AUTHENTBODY, (st), (i)) +# define sk_KRB5_AUTHENTBODY_set(st, i, val) SKM_sk_set(KRB5_AUTHENTBODY, (st), (i), (val)) +# define sk_KRB5_AUTHENTBODY_zero(st) SKM_sk_zero(KRB5_AUTHENTBODY, (st)) +# define sk_KRB5_AUTHENTBODY_push(st, val) SKM_sk_push(KRB5_AUTHENTBODY, (st), (val)) +# define sk_KRB5_AUTHENTBODY_unshift(st, val) SKM_sk_unshift(KRB5_AUTHENTBODY, (st), (val)) +# define sk_KRB5_AUTHENTBODY_find(st, val) SKM_sk_find(KRB5_AUTHENTBODY, (st), (val)) +# define sk_KRB5_AUTHENTBODY_find_ex(st, val) SKM_sk_find_ex(KRB5_AUTHENTBODY, (st), (val)) +# define sk_KRB5_AUTHENTBODY_delete(st, i) SKM_sk_delete(KRB5_AUTHENTBODY, (st), (i)) +# define sk_KRB5_AUTHENTBODY_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_AUTHENTBODY, (st), (ptr)) +# define sk_KRB5_AUTHENTBODY_insert(st, val, i) SKM_sk_insert(KRB5_AUTHENTBODY, (st), (val), (i)) +# define sk_KRB5_AUTHENTBODY_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_AUTHENTBODY, (st), (cmp)) +# define sk_KRB5_AUTHENTBODY_dup(st) SKM_sk_dup(KRB5_AUTHENTBODY, st) +# define sk_KRB5_AUTHENTBODY_pop_free(st, free_func) SKM_sk_pop_free(KRB5_AUTHENTBODY, (st), (free_func)) +# define sk_KRB5_AUTHENTBODY_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(KRB5_AUTHENTBODY, (st), (copy_func), (free_func)) +# define sk_KRB5_AUTHENTBODY_shift(st) SKM_sk_shift(KRB5_AUTHENTBODY, (st)) +# define sk_KRB5_AUTHENTBODY_pop(st) SKM_sk_pop(KRB5_AUTHENTBODY, (st)) +# define sk_KRB5_AUTHENTBODY_sort(st) SKM_sk_sort(KRB5_AUTHENTBODY, (st)) +# define sk_KRB5_AUTHENTBODY_is_sorted(st) SKM_sk_is_sorted(KRB5_AUTHENTBODY, (st)) +# define sk_KRB5_CHECKSUM_new(cmp) SKM_sk_new(KRB5_CHECKSUM, (cmp)) +# define sk_KRB5_CHECKSUM_new_null() SKM_sk_new_null(KRB5_CHECKSUM) +# define sk_KRB5_CHECKSUM_free(st) SKM_sk_free(KRB5_CHECKSUM, (st)) +# define sk_KRB5_CHECKSUM_num(st) SKM_sk_num(KRB5_CHECKSUM, (st)) +# define sk_KRB5_CHECKSUM_value(st, i) SKM_sk_value(KRB5_CHECKSUM, (st), (i)) +# define sk_KRB5_CHECKSUM_set(st, i, val) SKM_sk_set(KRB5_CHECKSUM, (st), (i), (val)) +# define sk_KRB5_CHECKSUM_zero(st) SKM_sk_zero(KRB5_CHECKSUM, (st)) +# define sk_KRB5_CHECKSUM_push(st, val) SKM_sk_push(KRB5_CHECKSUM, (st), (val)) +# define sk_KRB5_CHECKSUM_unshift(st, val) SKM_sk_unshift(KRB5_CHECKSUM, (st), (val)) +# define sk_KRB5_CHECKSUM_find(st, val) SKM_sk_find(KRB5_CHECKSUM, (st), (val)) +# define sk_KRB5_CHECKSUM_find_ex(st, val) SKM_sk_find_ex(KRB5_CHECKSUM, (st), (val)) +# define sk_KRB5_CHECKSUM_delete(st, i) SKM_sk_delete(KRB5_CHECKSUM, (st), (i)) +# define sk_KRB5_CHECKSUM_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_CHECKSUM, (st), (ptr)) +# define sk_KRB5_CHECKSUM_insert(st, val, i) SKM_sk_insert(KRB5_CHECKSUM, (st), (val), (i)) +# define sk_KRB5_CHECKSUM_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_CHECKSUM, (st), (cmp)) +# define sk_KRB5_CHECKSUM_dup(st) SKM_sk_dup(KRB5_CHECKSUM, st) +# define sk_KRB5_CHECKSUM_pop_free(st, free_func) SKM_sk_pop_free(KRB5_CHECKSUM, (st), (free_func)) +# define sk_KRB5_CHECKSUM_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(KRB5_CHECKSUM, (st), (copy_func), (free_func)) +# define sk_KRB5_CHECKSUM_shift(st) SKM_sk_shift(KRB5_CHECKSUM, (st)) +# define sk_KRB5_CHECKSUM_pop(st) SKM_sk_pop(KRB5_CHECKSUM, (st)) +# define sk_KRB5_CHECKSUM_sort(st) SKM_sk_sort(KRB5_CHECKSUM, (st)) +# define sk_KRB5_CHECKSUM_is_sorted(st) SKM_sk_is_sorted(KRB5_CHECKSUM, (st)) +# define sk_KRB5_ENCDATA_new(cmp) SKM_sk_new(KRB5_ENCDATA, (cmp)) +# define sk_KRB5_ENCDATA_new_null() SKM_sk_new_null(KRB5_ENCDATA) +# define sk_KRB5_ENCDATA_free(st) SKM_sk_free(KRB5_ENCDATA, (st)) +# define sk_KRB5_ENCDATA_num(st) SKM_sk_num(KRB5_ENCDATA, (st)) +# define sk_KRB5_ENCDATA_value(st, i) SKM_sk_value(KRB5_ENCDATA, (st), (i)) +# define sk_KRB5_ENCDATA_set(st, i, val) SKM_sk_set(KRB5_ENCDATA, (st), (i), (val)) +# define sk_KRB5_ENCDATA_zero(st) SKM_sk_zero(KRB5_ENCDATA, (st)) +# define sk_KRB5_ENCDATA_push(st, val) SKM_sk_push(KRB5_ENCDATA, (st), (val)) +# define sk_KRB5_ENCDATA_unshift(st, val) SKM_sk_unshift(KRB5_ENCDATA, (st), (val)) +# define sk_KRB5_ENCDATA_find(st, val) SKM_sk_find(KRB5_ENCDATA, (st), (val)) +# define sk_KRB5_ENCDATA_find_ex(st, val) SKM_sk_find_ex(KRB5_ENCDATA, (st), (val)) +# define sk_KRB5_ENCDATA_delete(st, i) SKM_sk_delete(KRB5_ENCDATA, (st), (i)) +# define sk_KRB5_ENCDATA_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_ENCDATA, (st), (ptr)) +# define sk_KRB5_ENCDATA_insert(st, val, i) SKM_sk_insert(KRB5_ENCDATA, (st), (val), (i)) +# define sk_KRB5_ENCDATA_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_ENCDATA, (st), (cmp)) +# define sk_KRB5_ENCDATA_dup(st) SKM_sk_dup(KRB5_ENCDATA, st) +# define sk_KRB5_ENCDATA_pop_free(st, free_func) SKM_sk_pop_free(KRB5_ENCDATA, (st), (free_func)) +# define sk_KRB5_ENCDATA_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(KRB5_ENCDATA, (st), (copy_func), (free_func)) +# define sk_KRB5_ENCDATA_shift(st) SKM_sk_shift(KRB5_ENCDATA, (st)) +# define sk_KRB5_ENCDATA_pop(st) SKM_sk_pop(KRB5_ENCDATA, (st)) +# define sk_KRB5_ENCDATA_sort(st) SKM_sk_sort(KRB5_ENCDATA, (st)) +# define sk_KRB5_ENCDATA_is_sorted(st) SKM_sk_is_sorted(KRB5_ENCDATA, (st)) +# define sk_KRB5_ENCKEY_new(cmp) SKM_sk_new(KRB5_ENCKEY, (cmp)) +# define sk_KRB5_ENCKEY_new_null() SKM_sk_new_null(KRB5_ENCKEY) +# define sk_KRB5_ENCKEY_free(st) SKM_sk_free(KRB5_ENCKEY, (st)) +# define sk_KRB5_ENCKEY_num(st) SKM_sk_num(KRB5_ENCKEY, (st)) +# define sk_KRB5_ENCKEY_value(st, i) SKM_sk_value(KRB5_ENCKEY, (st), (i)) +# define sk_KRB5_ENCKEY_set(st, i, val) SKM_sk_set(KRB5_ENCKEY, (st), (i), (val)) +# define sk_KRB5_ENCKEY_zero(st) SKM_sk_zero(KRB5_ENCKEY, (st)) +# define sk_KRB5_ENCKEY_push(st, val) SKM_sk_push(KRB5_ENCKEY, (st), (val)) +# define sk_KRB5_ENCKEY_unshift(st, val) SKM_sk_unshift(KRB5_ENCKEY, (st), (val)) +# define sk_KRB5_ENCKEY_find(st, val) SKM_sk_find(KRB5_ENCKEY, (st), (val)) +# define sk_KRB5_ENCKEY_find_ex(st, val) SKM_sk_find_ex(KRB5_ENCKEY, (st), (val)) +# define sk_KRB5_ENCKEY_delete(st, i) SKM_sk_delete(KRB5_ENCKEY, (st), (i)) +# define sk_KRB5_ENCKEY_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_ENCKEY, (st), (ptr)) +# define sk_KRB5_ENCKEY_insert(st, val, i) SKM_sk_insert(KRB5_ENCKEY, (st), (val), (i)) +# define sk_KRB5_ENCKEY_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_ENCKEY, (st), (cmp)) +# define sk_KRB5_ENCKEY_dup(st) SKM_sk_dup(KRB5_ENCKEY, st) +# define sk_KRB5_ENCKEY_pop_free(st, free_func) SKM_sk_pop_free(KRB5_ENCKEY, (st), (free_func)) +# define sk_KRB5_ENCKEY_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(KRB5_ENCKEY, (st), (copy_func), (free_func)) +# define sk_KRB5_ENCKEY_shift(st) SKM_sk_shift(KRB5_ENCKEY, (st)) +# define sk_KRB5_ENCKEY_pop(st) SKM_sk_pop(KRB5_ENCKEY, (st)) +# define sk_KRB5_ENCKEY_sort(st) SKM_sk_sort(KRB5_ENCKEY, (st)) +# define sk_KRB5_ENCKEY_is_sorted(st) SKM_sk_is_sorted(KRB5_ENCKEY, (st)) +# define sk_KRB5_PRINCNAME_new(cmp) SKM_sk_new(KRB5_PRINCNAME, (cmp)) +# define sk_KRB5_PRINCNAME_new_null() SKM_sk_new_null(KRB5_PRINCNAME) +# define sk_KRB5_PRINCNAME_free(st) SKM_sk_free(KRB5_PRINCNAME, (st)) +# define sk_KRB5_PRINCNAME_num(st) SKM_sk_num(KRB5_PRINCNAME, (st)) +# define sk_KRB5_PRINCNAME_value(st, i) SKM_sk_value(KRB5_PRINCNAME, (st), (i)) +# define sk_KRB5_PRINCNAME_set(st, i, val) SKM_sk_set(KRB5_PRINCNAME, (st), (i), (val)) +# define sk_KRB5_PRINCNAME_zero(st) SKM_sk_zero(KRB5_PRINCNAME, (st)) +# define sk_KRB5_PRINCNAME_push(st, val) SKM_sk_push(KRB5_PRINCNAME, (st), (val)) +# define sk_KRB5_PRINCNAME_unshift(st, val) SKM_sk_unshift(KRB5_PRINCNAME, (st), (val)) +# define sk_KRB5_PRINCNAME_find(st, val) SKM_sk_find(KRB5_PRINCNAME, (st), (val)) +# define sk_KRB5_PRINCNAME_find_ex(st, val) SKM_sk_find_ex(KRB5_PRINCNAME, (st), (val)) +# define sk_KRB5_PRINCNAME_delete(st, i) SKM_sk_delete(KRB5_PRINCNAME, (st), (i)) +# define sk_KRB5_PRINCNAME_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_PRINCNAME, (st), (ptr)) +# define sk_KRB5_PRINCNAME_insert(st, val, i) SKM_sk_insert(KRB5_PRINCNAME, (st), (val), (i)) +# define sk_KRB5_PRINCNAME_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_PRINCNAME, (st), (cmp)) +# define sk_KRB5_PRINCNAME_dup(st) SKM_sk_dup(KRB5_PRINCNAME, st) +# define sk_KRB5_PRINCNAME_pop_free(st, free_func) SKM_sk_pop_free(KRB5_PRINCNAME, (st), (free_func)) +# define sk_KRB5_PRINCNAME_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(KRB5_PRINCNAME, (st), (copy_func), (free_func)) +# define sk_KRB5_PRINCNAME_shift(st) SKM_sk_shift(KRB5_PRINCNAME, (st)) +# define sk_KRB5_PRINCNAME_pop(st) SKM_sk_pop(KRB5_PRINCNAME, (st)) +# define sk_KRB5_PRINCNAME_sort(st) SKM_sk_sort(KRB5_PRINCNAME, (st)) +# define sk_KRB5_PRINCNAME_is_sorted(st) SKM_sk_is_sorted(KRB5_PRINCNAME, (st)) +# define sk_KRB5_TKTBODY_new(cmp) SKM_sk_new(KRB5_TKTBODY, (cmp)) +# define sk_KRB5_TKTBODY_new_null() SKM_sk_new_null(KRB5_TKTBODY) +# define sk_KRB5_TKTBODY_free(st) SKM_sk_free(KRB5_TKTBODY, (st)) +# define sk_KRB5_TKTBODY_num(st) SKM_sk_num(KRB5_TKTBODY, (st)) +# define sk_KRB5_TKTBODY_value(st, i) SKM_sk_value(KRB5_TKTBODY, (st), (i)) +# define sk_KRB5_TKTBODY_set(st, i, val) SKM_sk_set(KRB5_TKTBODY, (st), (i), (val)) +# define sk_KRB5_TKTBODY_zero(st) SKM_sk_zero(KRB5_TKTBODY, (st)) +# define sk_KRB5_TKTBODY_push(st, val) SKM_sk_push(KRB5_TKTBODY, (st), (val)) +# define sk_KRB5_TKTBODY_unshift(st, val) SKM_sk_unshift(KRB5_TKTBODY, (st), (val)) +# define sk_KRB5_TKTBODY_find(st, val) SKM_sk_find(KRB5_TKTBODY, (st), (val)) +# define sk_KRB5_TKTBODY_find_ex(st, val) SKM_sk_find_ex(KRB5_TKTBODY, (st), (val)) +# define sk_KRB5_TKTBODY_delete(st, i) SKM_sk_delete(KRB5_TKTBODY, (st), (i)) +# define sk_KRB5_TKTBODY_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_TKTBODY, (st), (ptr)) +# define sk_KRB5_TKTBODY_insert(st, val, i) SKM_sk_insert(KRB5_TKTBODY, (st), (val), (i)) +# define sk_KRB5_TKTBODY_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_TKTBODY, (st), (cmp)) +# define sk_KRB5_TKTBODY_dup(st) SKM_sk_dup(KRB5_TKTBODY, st) +# define sk_KRB5_TKTBODY_pop_free(st, free_func) SKM_sk_pop_free(KRB5_TKTBODY, (st), (free_func)) +# define sk_KRB5_TKTBODY_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(KRB5_TKTBODY, (st), (copy_func), (free_func)) +# define sk_KRB5_TKTBODY_shift(st) SKM_sk_shift(KRB5_TKTBODY, (st)) +# define sk_KRB5_TKTBODY_pop(st) SKM_sk_pop(KRB5_TKTBODY, (st)) +# define sk_KRB5_TKTBODY_sort(st) SKM_sk_sort(KRB5_TKTBODY, (st)) +# define sk_KRB5_TKTBODY_is_sorted(st) SKM_sk_is_sorted(KRB5_TKTBODY, (st)) +# define sk_MEM_OBJECT_DATA_new(cmp) SKM_sk_new(MEM_OBJECT_DATA, (cmp)) +# define sk_MEM_OBJECT_DATA_new_null() SKM_sk_new_null(MEM_OBJECT_DATA) +# define sk_MEM_OBJECT_DATA_free(st) SKM_sk_free(MEM_OBJECT_DATA, (st)) +# define sk_MEM_OBJECT_DATA_num(st) SKM_sk_num(MEM_OBJECT_DATA, (st)) +# define sk_MEM_OBJECT_DATA_value(st, i) SKM_sk_value(MEM_OBJECT_DATA, (st), (i)) +# define sk_MEM_OBJECT_DATA_set(st, i, val) SKM_sk_set(MEM_OBJECT_DATA, (st), (i), (val)) +# define sk_MEM_OBJECT_DATA_zero(st) SKM_sk_zero(MEM_OBJECT_DATA, (st)) +# define sk_MEM_OBJECT_DATA_push(st, val) SKM_sk_push(MEM_OBJECT_DATA, (st), (val)) +# define sk_MEM_OBJECT_DATA_unshift(st, val) SKM_sk_unshift(MEM_OBJECT_DATA, (st), (val)) +# define sk_MEM_OBJECT_DATA_find(st, val) SKM_sk_find(MEM_OBJECT_DATA, (st), (val)) +# define sk_MEM_OBJECT_DATA_find_ex(st, val) SKM_sk_find_ex(MEM_OBJECT_DATA, (st), (val)) +# define sk_MEM_OBJECT_DATA_delete(st, i) SKM_sk_delete(MEM_OBJECT_DATA, (st), (i)) +# define sk_MEM_OBJECT_DATA_delete_ptr(st, ptr) SKM_sk_delete_ptr(MEM_OBJECT_DATA, (st), (ptr)) +# define sk_MEM_OBJECT_DATA_insert(st, val, i) SKM_sk_insert(MEM_OBJECT_DATA, (st), (val), (i)) +# define sk_MEM_OBJECT_DATA_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(MEM_OBJECT_DATA, (st), (cmp)) +# define sk_MEM_OBJECT_DATA_dup(st) SKM_sk_dup(MEM_OBJECT_DATA, st) +# define sk_MEM_OBJECT_DATA_pop_free(st, free_func) SKM_sk_pop_free(MEM_OBJECT_DATA, (st), (free_func)) +# define sk_MEM_OBJECT_DATA_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(MEM_OBJECT_DATA, (st), (copy_func), (free_func)) +# define sk_MEM_OBJECT_DATA_shift(st) SKM_sk_shift(MEM_OBJECT_DATA, (st)) +# define sk_MEM_OBJECT_DATA_pop(st) SKM_sk_pop(MEM_OBJECT_DATA, (st)) +# define sk_MEM_OBJECT_DATA_sort(st) SKM_sk_sort(MEM_OBJECT_DATA, (st)) +# define sk_MEM_OBJECT_DATA_is_sorted(st) SKM_sk_is_sorted(MEM_OBJECT_DATA, (st)) +# define sk_MIME_HEADER_new(cmp) SKM_sk_new(MIME_HEADER, (cmp)) +# define sk_MIME_HEADER_new_null() SKM_sk_new_null(MIME_HEADER) +# define sk_MIME_HEADER_free(st) SKM_sk_free(MIME_HEADER, (st)) +# define sk_MIME_HEADER_num(st) SKM_sk_num(MIME_HEADER, (st)) +# define sk_MIME_HEADER_value(st, i) SKM_sk_value(MIME_HEADER, (st), (i)) +# define sk_MIME_HEADER_set(st, i, val) SKM_sk_set(MIME_HEADER, (st), (i), (val)) +# define sk_MIME_HEADER_zero(st) SKM_sk_zero(MIME_HEADER, (st)) +# define sk_MIME_HEADER_push(st, val) SKM_sk_push(MIME_HEADER, (st), (val)) +# define sk_MIME_HEADER_unshift(st, val) SKM_sk_unshift(MIME_HEADER, (st), (val)) +# define sk_MIME_HEADER_find(st, val) SKM_sk_find(MIME_HEADER, (st), (val)) +# define sk_MIME_HEADER_find_ex(st, val) SKM_sk_find_ex(MIME_HEADER, (st), (val)) +# define sk_MIME_HEADER_delete(st, i) SKM_sk_delete(MIME_HEADER, (st), (i)) +# define sk_MIME_HEADER_delete_ptr(st, ptr) SKM_sk_delete_ptr(MIME_HEADER, (st), (ptr)) +# define sk_MIME_HEADER_insert(st, val, i) SKM_sk_insert(MIME_HEADER, (st), (val), (i)) +# define sk_MIME_HEADER_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(MIME_HEADER, (st), (cmp)) +# define sk_MIME_HEADER_dup(st) SKM_sk_dup(MIME_HEADER, st) +# define sk_MIME_HEADER_pop_free(st, free_func) SKM_sk_pop_free(MIME_HEADER, (st), (free_func)) +# define sk_MIME_HEADER_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(MIME_HEADER, (st), (copy_func), (free_func)) +# define sk_MIME_HEADER_shift(st) SKM_sk_shift(MIME_HEADER, (st)) +# define sk_MIME_HEADER_pop(st) SKM_sk_pop(MIME_HEADER, (st)) +# define sk_MIME_HEADER_sort(st) SKM_sk_sort(MIME_HEADER, (st)) +# define sk_MIME_HEADER_is_sorted(st) SKM_sk_is_sorted(MIME_HEADER, (st)) +# define sk_MIME_PARAM_new(cmp) SKM_sk_new(MIME_PARAM, (cmp)) +# define sk_MIME_PARAM_new_null() SKM_sk_new_null(MIME_PARAM) +# define sk_MIME_PARAM_free(st) SKM_sk_free(MIME_PARAM, (st)) +# define sk_MIME_PARAM_num(st) SKM_sk_num(MIME_PARAM, (st)) +# define sk_MIME_PARAM_value(st, i) SKM_sk_value(MIME_PARAM, (st), (i)) +# define sk_MIME_PARAM_set(st, i, val) SKM_sk_set(MIME_PARAM, (st), (i), (val)) +# define sk_MIME_PARAM_zero(st) SKM_sk_zero(MIME_PARAM, (st)) +# define sk_MIME_PARAM_push(st, val) SKM_sk_push(MIME_PARAM, (st), (val)) +# define sk_MIME_PARAM_unshift(st, val) SKM_sk_unshift(MIME_PARAM, (st), (val)) +# define sk_MIME_PARAM_find(st, val) SKM_sk_find(MIME_PARAM, (st), (val)) +# define sk_MIME_PARAM_find_ex(st, val) SKM_sk_find_ex(MIME_PARAM, (st), (val)) +# define sk_MIME_PARAM_delete(st, i) SKM_sk_delete(MIME_PARAM, (st), (i)) +# define sk_MIME_PARAM_delete_ptr(st, ptr) SKM_sk_delete_ptr(MIME_PARAM, (st), (ptr)) +# define sk_MIME_PARAM_insert(st, val, i) SKM_sk_insert(MIME_PARAM, (st), (val), (i)) +# define sk_MIME_PARAM_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(MIME_PARAM, (st), (cmp)) +# define sk_MIME_PARAM_dup(st) SKM_sk_dup(MIME_PARAM, st) +# define sk_MIME_PARAM_pop_free(st, free_func) SKM_sk_pop_free(MIME_PARAM, (st), (free_func)) +# define sk_MIME_PARAM_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(MIME_PARAM, (st), (copy_func), (free_func)) +# define sk_MIME_PARAM_shift(st) SKM_sk_shift(MIME_PARAM, (st)) +# define sk_MIME_PARAM_pop(st) SKM_sk_pop(MIME_PARAM, (st)) +# define sk_MIME_PARAM_sort(st) SKM_sk_sort(MIME_PARAM, (st)) +# define sk_MIME_PARAM_is_sorted(st) SKM_sk_is_sorted(MIME_PARAM, (st)) +# define sk_NAME_FUNCS_new(cmp) SKM_sk_new(NAME_FUNCS, (cmp)) +# define sk_NAME_FUNCS_new_null() SKM_sk_new_null(NAME_FUNCS) +# define sk_NAME_FUNCS_free(st) SKM_sk_free(NAME_FUNCS, (st)) +# define sk_NAME_FUNCS_num(st) SKM_sk_num(NAME_FUNCS, (st)) +# define sk_NAME_FUNCS_value(st, i) SKM_sk_value(NAME_FUNCS, (st), (i)) +# define sk_NAME_FUNCS_set(st, i, val) SKM_sk_set(NAME_FUNCS, (st), (i), (val)) +# define sk_NAME_FUNCS_zero(st) SKM_sk_zero(NAME_FUNCS, (st)) +# define sk_NAME_FUNCS_push(st, val) SKM_sk_push(NAME_FUNCS, (st), (val)) +# define sk_NAME_FUNCS_unshift(st, val) SKM_sk_unshift(NAME_FUNCS, (st), (val)) +# define sk_NAME_FUNCS_find(st, val) SKM_sk_find(NAME_FUNCS, (st), (val)) +# define sk_NAME_FUNCS_find_ex(st, val) SKM_sk_find_ex(NAME_FUNCS, (st), (val)) +# define sk_NAME_FUNCS_delete(st, i) SKM_sk_delete(NAME_FUNCS, (st), (i)) +# define sk_NAME_FUNCS_delete_ptr(st, ptr) SKM_sk_delete_ptr(NAME_FUNCS, (st), (ptr)) +# define sk_NAME_FUNCS_insert(st, val, i) SKM_sk_insert(NAME_FUNCS, (st), (val), (i)) +# define sk_NAME_FUNCS_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(NAME_FUNCS, (st), (cmp)) +# define sk_NAME_FUNCS_dup(st) SKM_sk_dup(NAME_FUNCS, st) +# define sk_NAME_FUNCS_pop_free(st, free_func) SKM_sk_pop_free(NAME_FUNCS, (st), (free_func)) +# define sk_NAME_FUNCS_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(NAME_FUNCS, (st), (copy_func), (free_func)) +# define sk_NAME_FUNCS_shift(st) SKM_sk_shift(NAME_FUNCS, (st)) +# define sk_NAME_FUNCS_pop(st) SKM_sk_pop(NAME_FUNCS, (st)) +# define sk_NAME_FUNCS_sort(st) SKM_sk_sort(NAME_FUNCS, (st)) +# define sk_NAME_FUNCS_is_sorted(st) SKM_sk_is_sorted(NAME_FUNCS, (st)) +# define sk_OCSP_CERTID_new(cmp) SKM_sk_new(OCSP_CERTID, (cmp)) +# define sk_OCSP_CERTID_new_null() SKM_sk_new_null(OCSP_CERTID) +# define sk_OCSP_CERTID_free(st) SKM_sk_free(OCSP_CERTID, (st)) +# define sk_OCSP_CERTID_num(st) SKM_sk_num(OCSP_CERTID, (st)) +# define sk_OCSP_CERTID_value(st, i) SKM_sk_value(OCSP_CERTID, (st), (i)) +# define sk_OCSP_CERTID_set(st, i, val) SKM_sk_set(OCSP_CERTID, (st), (i), (val)) +# define sk_OCSP_CERTID_zero(st) SKM_sk_zero(OCSP_CERTID, (st)) +# define sk_OCSP_CERTID_push(st, val) SKM_sk_push(OCSP_CERTID, (st), (val)) +# define sk_OCSP_CERTID_unshift(st, val) SKM_sk_unshift(OCSP_CERTID, (st), (val)) +# define sk_OCSP_CERTID_find(st, val) SKM_sk_find(OCSP_CERTID, (st), (val)) +# define sk_OCSP_CERTID_find_ex(st, val) SKM_sk_find_ex(OCSP_CERTID, (st), (val)) +# define sk_OCSP_CERTID_delete(st, i) SKM_sk_delete(OCSP_CERTID, (st), (i)) +# define sk_OCSP_CERTID_delete_ptr(st, ptr) SKM_sk_delete_ptr(OCSP_CERTID, (st), (ptr)) +# define sk_OCSP_CERTID_insert(st, val, i) SKM_sk_insert(OCSP_CERTID, (st), (val), (i)) +# define sk_OCSP_CERTID_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(OCSP_CERTID, (st), (cmp)) +# define sk_OCSP_CERTID_dup(st) SKM_sk_dup(OCSP_CERTID, st) +# define sk_OCSP_CERTID_pop_free(st, free_func) SKM_sk_pop_free(OCSP_CERTID, (st), (free_func)) +# define sk_OCSP_CERTID_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(OCSP_CERTID, (st), (copy_func), (free_func)) +# define sk_OCSP_CERTID_shift(st) SKM_sk_shift(OCSP_CERTID, (st)) +# define sk_OCSP_CERTID_pop(st) SKM_sk_pop(OCSP_CERTID, (st)) +# define sk_OCSP_CERTID_sort(st) SKM_sk_sort(OCSP_CERTID, (st)) +# define sk_OCSP_CERTID_is_sorted(st) SKM_sk_is_sorted(OCSP_CERTID, (st)) +# define sk_OCSP_ONEREQ_new(cmp) SKM_sk_new(OCSP_ONEREQ, (cmp)) +# define sk_OCSP_ONEREQ_new_null() SKM_sk_new_null(OCSP_ONEREQ) +# define sk_OCSP_ONEREQ_free(st) SKM_sk_free(OCSP_ONEREQ, (st)) +# define sk_OCSP_ONEREQ_num(st) SKM_sk_num(OCSP_ONEREQ, (st)) +# define sk_OCSP_ONEREQ_value(st, i) SKM_sk_value(OCSP_ONEREQ, (st), (i)) +# define sk_OCSP_ONEREQ_set(st, i, val) SKM_sk_set(OCSP_ONEREQ, (st), (i), (val)) +# define sk_OCSP_ONEREQ_zero(st) SKM_sk_zero(OCSP_ONEREQ, (st)) +# define sk_OCSP_ONEREQ_push(st, val) SKM_sk_push(OCSP_ONEREQ, (st), (val)) +# define sk_OCSP_ONEREQ_unshift(st, val) SKM_sk_unshift(OCSP_ONEREQ, (st), (val)) +# define sk_OCSP_ONEREQ_find(st, val) SKM_sk_find(OCSP_ONEREQ, (st), (val)) +# define sk_OCSP_ONEREQ_find_ex(st, val) SKM_sk_find_ex(OCSP_ONEREQ, (st), (val)) +# define sk_OCSP_ONEREQ_delete(st, i) SKM_sk_delete(OCSP_ONEREQ, (st), (i)) +# define sk_OCSP_ONEREQ_delete_ptr(st, ptr) SKM_sk_delete_ptr(OCSP_ONEREQ, (st), (ptr)) +# define sk_OCSP_ONEREQ_insert(st, val, i) SKM_sk_insert(OCSP_ONEREQ, (st), (val), (i)) +# define sk_OCSP_ONEREQ_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(OCSP_ONEREQ, (st), (cmp)) +# define sk_OCSP_ONEREQ_dup(st) SKM_sk_dup(OCSP_ONEREQ, st) +# define sk_OCSP_ONEREQ_pop_free(st, free_func) SKM_sk_pop_free(OCSP_ONEREQ, (st), (free_func)) +# define sk_OCSP_ONEREQ_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(OCSP_ONEREQ, (st), (copy_func), (free_func)) +# define sk_OCSP_ONEREQ_shift(st) SKM_sk_shift(OCSP_ONEREQ, (st)) +# define sk_OCSP_ONEREQ_pop(st) SKM_sk_pop(OCSP_ONEREQ, (st)) +# define sk_OCSP_ONEREQ_sort(st) SKM_sk_sort(OCSP_ONEREQ, (st)) +# define sk_OCSP_ONEREQ_is_sorted(st) SKM_sk_is_sorted(OCSP_ONEREQ, (st)) +# define sk_OCSP_RESPID_new(cmp) SKM_sk_new(OCSP_RESPID, (cmp)) +# define sk_OCSP_RESPID_new_null() SKM_sk_new_null(OCSP_RESPID) +# define sk_OCSP_RESPID_free(st) SKM_sk_free(OCSP_RESPID, (st)) +# define sk_OCSP_RESPID_num(st) SKM_sk_num(OCSP_RESPID, (st)) +# define sk_OCSP_RESPID_value(st, i) SKM_sk_value(OCSP_RESPID, (st), (i)) +# define sk_OCSP_RESPID_set(st, i, val) SKM_sk_set(OCSP_RESPID, (st), (i), (val)) +# define sk_OCSP_RESPID_zero(st) SKM_sk_zero(OCSP_RESPID, (st)) +# define sk_OCSP_RESPID_push(st, val) SKM_sk_push(OCSP_RESPID, (st), (val)) +# define sk_OCSP_RESPID_unshift(st, val) SKM_sk_unshift(OCSP_RESPID, (st), (val)) +# define sk_OCSP_RESPID_find(st, val) SKM_sk_find(OCSP_RESPID, (st), (val)) +# define sk_OCSP_RESPID_find_ex(st, val) SKM_sk_find_ex(OCSP_RESPID, (st), (val)) +# define sk_OCSP_RESPID_delete(st, i) SKM_sk_delete(OCSP_RESPID, (st), (i)) +# define sk_OCSP_RESPID_delete_ptr(st, ptr) SKM_sk_delete_ptr(OCSP_RESPID, (st), (ptr)) +# define sk_OCSP_RESPID_insert(st, val, i) SKM_sk_insert(OCSP_RESPID, (st), (val), (i)) +# define sk_OCSP_RESPID_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(OCSP_RESPID, (st), (cmp)) +# define sk_OCSP_RESPID_dup(st) SKM_sk_dup(OCSP_RESPID, st) +# define sk_OCSP_RESPID_pop_free(st, free_func) SKM_sk_pop_free(OCSP_RESPID, (st), (free_func)) +# define sk_OCSP_RESPID_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(OCSP_RESPID, (st), (copy_func), (free_func)) +# define sk_OCSP_RESPID_shift(st) SKM_sk_shift(OCSP_RESPID, (st)) +# define sk_OCSP_RESPID_pop(st) SKM_sk_pop(OCSP_RESPID, (st)) +# define sk_OCSP_RESPID_sort(st) SKM_sk_sort(OCSP_RESPID, (st)) +# define sk_OCSP_RESPID_is_sorted(st) SKM_sk_is_sorted(OCSP_RESPID, (st)) +# define sk_OCSP_SINGLERESP_new(cmp) SKM_sk_new(OCSP_SINGLERESP, (cmp)) +# define sk_OCSP_SINGLERESP_new_null() SKM_sk_new_null(OCSP_SINGLERESP) +# define sk_OCSP_SINGLERESP_free(st) SKM_sk_free(OCSP_SINGLERESP, (st)) +# define sk_OCSP_SINGLERESP_num(st) SKM_sk_num(OCSP_SINGLERESP, (st)) +# define sk_OCSP_SINGLERESP_value(st, i) SKM_sk_value(OCSP_SINGLERESP, (st), (i)) +# define sk_OCSP_SINGLERESP_set(st, i, val) SKM_sk_set(OCSP_SINGLERESP, (st), (i), (val)) +# define sk_OCSP_SINGLERESP_zero(st) SKM_sk_zero(OCSP_SINGLERESP, (st)) +# define sk_OCSP_SINGLERESP_push(st, val) SKM_sk_push(OCSP_SINGLERESP, (st), (val)) +# define sk_OCSP_SINGLERESP_unshift(st, val) SKM_sk_unshift(OCSP_SINGLERESP, (st), (val)) +# define sk_OCSP_SINGLERESP_find(st, val) SKM_sk_find(OCSP_SINGLERESP, (st), (val)) +# define sk_OCSP_SINGLERESP_find_ex(st, val) SKM_sk_find_ex(OCSP_SINGLERESP, (st), (val)) +# define sk_OCSP_SINGLERESP_delete(st, i) SKM_sk_delete(OCSP_SINGLERESP, (st), (i)) +# define sk_OCSP_SINGLERESP_delete_ptr(st, ptr) SKM_sk_delete_ptr(OCSP_SINGLERESP, (st), (ptr)) +# define sk_OCSP_SINGLERESP_insert(st, val, i) SKM_sk_insert(OCSP_SINGLERESP, (st), (val), (i)) +# define sk_OCSP_SINGLERESP_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(OCSP_SINGLERESP, (st), (cmp)) +# define sk_OCSP_SINGLERESP_dup(st) SKM_sk_dup(OCSP_SINGLERESP, st) +# define sk_OCSP_SINGLERESP_pop_free(st, free_func) SKM_sk_pop_free(OCSP_SINGLERESP, (st), (free_func)) +# define sk_OCSP_SINGLERESP_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(OCSP_SINGLERESP, (st), (copy_func), (free_func)) +# define sk_OCSP_SINGLERESP_shift(st) SKM_sk_shift(OCSP_SINGLERESP, (st)) +# define sk_OCSP_SINGLERESP_pop(st) SKM_sk_pop(OCSP_SINGLERESP, (st)) +# define sk_OCSP_SINGLERESP_sort(st) SKM_sk_sort(OCSP_SINGLERESP, (st)) +# define sk_OCSP_SINGLERESP_is_sorted(st) SKM_sk_is_sorted(OCSP_SINGLERESP, (st)) +# define sk_PKCS12_SAFEBAG_new(cmp) SKM_sk_new(PKCS12_SAFEBAG, (cmp)) +# define sk_PKCS12_SAFEBAG_new_null() SKM_sk_new_null(PKCS12_SAFEBAG) +# define sk_PKCS12_SAFEBAG_free(st) SKM_sk_free(PKCS12_SAFEBAG, (st)) +# define sk_PKCS12_SAFEBAG_num(st) SKM_sk_num(PKCS12_SAFEBAG, (st)) +# define sk_PKCS12_SAFEBAG_value(st, i) SKM_sk_value(PKCS12_SAFEBAG, (st), (i)) +# define sk_PKCS12_SAFEBAG_set(st, i, val) SKM_sk_set(PKCS12_SAFEBAG, (st), (i), (val)) +# define sk_PKCS12_SAFEBAG_zero(st) SKM_sk_zero(PKCS12_SAFEBAG, (st)) +# define sk_PKCS12_SAFEBAG_push(st, val) SKM_sk_push(PKCS12_SAFEBAG, (st), (val)) +# define sk_PKCS12_SAFEBAG_unshift(st, val) SKM_sk_unshift(PKCS12_SAFEBAG, (st), (val)) +# define sk_PKCS12_SAFEBAG_find(st, val) SKM_sk_find(PKCS12_SAFEBAG, (st), (val)) +# define sk_PKCS12_SAFEBAG_find_ex(st, val) SKM_sk_find_ex(PKCS12_SAFEBAG, (st), (val)) +# define sk_PKCS12_SAFEBAG_delete(st, i) SKM_sk_delete(PKCS12_SAFEBAG, (st), (i)) +# define sk_PKCS12_SAFEBAG_delete_ptr(st, ptr) SKM_sk_delete_ptr(PKCS12_SAFEBAG, (st), (ptr)) +# define sk_PKCS12_SAFEBAG_insert(st, val, i) SKM_sk_insert(PKCS12_SAFEBAG, (st), (val), (i)) +# define sk_PKCS12_SAFEBAG_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(PKCS12_SAFEBAG, (st), (cmp)) +# define sk_PKCS12_SAFEBAG_dup(st) SKM_sk_dup(PKCS12_SAFEBAG, st) +# define sk_PKCS12_SAFEBAG_pop_free(st, free_func) SKM_sk_pop_free(PKCS12_SAFEBAG, (st), (free_func)) +# define sk_PKCS12_SAFEBAG_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(PKCS12_SAFEBAG, (st), (copy_func), (free_func)) +# define sk_PKCS12_SAFEBAG_shift(st) SKM_sk_shift(PKCS12_SAFEBAG, (st)) +# define sk_PKCS12_SAFEBAG_pop(st) SKM_sk_pop(PKCS12_SAFEBAG, (st)) +# define sk_PKCS12_SAFEBAG_sort(st) SKM_sk_sort(PKCS12_SAFEBAG, (st)) +# define sk_PKCS12_SAFEBAG_is_sorted(st) SKM_sk_is_sorted(PKCS12_SAFEBAG, (st)) +# define sk_PKCS7_new(cmp) SKM_sk_new(PKCS7, (cmp)) +# define sk_PKCS7_new_null() SKM_sk_new_null(PKCS7) +# define sk_PKCS7_free(st) SKM_sk_free(PKCS7, (st)) +# define sk_PKCS7_num(st) SKM_sk_num(PKCS7, (st)) +# define sk_PKCS7_value(st, i) SKM_sk_value(PKCS7, (st), (i)) +# define sk_PKCS7_set(st, i, val) SKM_sk_set(PKCS7, (st), (i), (val)) +# define sk_PKCS7_zero(st) SKM_sk_zero(PKCS7, (st)) +# define sk_PKCS7_push(st, val) SKM_sk_push(PKCS7, (st), (val)) +# define sk_PKCS7_unshift(st, val) SKM_sk_unshift(PKCS7, (st), (val)) +# define sk_PKCS7_find(st, val) SKM_sk_find(PKCS7, (st), (val)) +# define sk_PKCS7_find_ex(st, val) SKM_sk_find_ex(PKCS7, (st), (val)) +# define sk_PKCS7_delete(st, i) SKM_sk_delete(PKCS7, (st), (i)) +# define sk_PKCS7_delete_ptr(st, ptr) SKM_sk_delete_ptr(PKCS7, (st), (ptr)) +# define sk_PKCS7_insert(st, val, i) SKM_sk_insert(PKCS7, (st), (val), (i)) +# define sk_PKCS7_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(PKCS7, (st), (cmp)) +# define sk_PKCS7_dup(st) SKM_sk_dup(PKCS7, st) +# define sk_PKCS7_pop_free(st, free_func) SKM_sk_pop_free(PKCS7, (st), (free_func)) +# define sk_PKCS7_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(PKCS7, (st), (copy_func), (free_func)) +# define sk_PKCS7_shift(st) SKM_sk_shift(PKCS7, (st)) +# define sk_PKCS7_pop(st) SKM_sk_pop(PKCS7, (st)) +# define sk_PKCS7_sort(st) SKM_sk_sort(PKCS7, (st)) +# define sk_PKCS7_is_sorted(st) SKM_sk_is_sorted(PKCS7, (st)) +# define sk_PKCS7_RECIP_INFO_new(cmp) SKM_sk_new(PKCS7_RECIP_INFO, (cmp)) +# define sk_PKCS7_RECIP_INFO_new_null() SKM_sk_new_null(PKCS7_RECIP_INFO) +# define sk_PKCS7_RECIP_INFO_free(st) SKM_sk_free(PKCS7_RECIP_INFO, (st)) +# define sk_PKCS7_RECIP_INFO_num(st) SKM_sk_num(PKCS7_RECIP_INFO, (st)) +# define sk_PKCS7_RECIP_INFO_value(st, i) SKM_sk_value(PKCS7_RECIP_INFO, (st), (i)) +# define sk_PKCS7_RECIP_INFO_set(st, i, val) SKM_sk_set(PKCS7_RECIP_INFO, (st), (i), (val)) +# define sk_PKCS7_RECIP_INFO_zero(st) SKM_sk_zero(PKCS7_RECIP_INFO, (st)) +# define sk_PKCS7_RECIP_INFO_push(st, val) SKM_sk_push(PKCS7_RECIP_INFO, (st), (val)) +# define sk_PKCS7_RECIP_INFO_unshift(st, val) SKM_sk_unshift(PKCS7_RECIP_INFO, (st), (val)) +# define sk_PKCS7_RECIP_INFO_find(st, val) SKM_sk_find(PKCS7_RECIP_INFO, (st), (val)) +# define sk_PKCS7_RECIP_INFO_find_ex(st, val) SKM_sk_find_ex(PKCS7_RECIP_INFO, (st), (val)) +# define sk_PKCS7_RECIP_INFO_delete(st, i) SKM_sk_delete(PKCS7_RECIP_INFO, (st), (i)) +# define sk_PKCS7_RECIP_INFO_delete_ptr(st, ptr) SKM_sk_delete_ptr(PKCS7_RECIP_INFO, (st), (ptr)) +# define sk_PKCS7_RECIP_INFO_insert(st, val, i) SKM_sk_insert(PKCS7_RECIP_INFO, (st), (val), (i)) +# define sk_PKCS7_RECIP_INFO_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(PKCS7_RECIP_INFO, (st), (cmp)) +# define sk_PKCS7_RECIP_INFO_dup(st) SKM_sk_dup(PKCS7_RECIP_INFO, st) +# define sk_PKCS7_RECIP_INFO_pop_free(st, free_func) SKM_sk_pop_free(PKCS7_RECIP_INFO, (st), (free_func)) +# define sk_PKCS7_RECIP_INFO_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(PKCS7_RECIP_INFO, (st), (copy_func), (free_func)) +# define sk_PKCS7_RECIP_INFO_shift(st) SKM_sk_shift(PKCS7_RECIP_INFO, (st)) +# define sk_PKCS7_RECIP_INFO_pop(st) SKM_sk_pop(PKCS7_RECIP_INFO, (st)) +# define sk_PKCS7_RECIP_INFO_sort(st) SKM_sk_sort(PKCS7_RECIP_INFO, (st)) +# define sk_PKCS7_RECIP_INFO_is_sorted(st) SKM_sk_is_sorted(PKCS7_RECIP_INFO, (st)) +# define sk_PKCS7_SIGNER_INFO_new(cmp) SKM_sk_new(PKCS7_SIGNER_INFO, (cmp)) +# define sk_PKCS7_SIGNER_INFO_new_null() SKM_sk_new_null(PKCS7_SIGNER_INFO) +# define sk_PKCS7_SIGNER_INFO_free(st) SKM_sk_free(PKCS7_SIGNER_INFO, (st)) +# define sk_PKCS7_SIGNER_INFO_num(st) SKM_sk_num(PKCS7_SIGNER_INFO, (st)) +# define sk_PKCS7_SIGNER_INFO_value(st, i) SKM_sk_value(PKCS7_SIGNER_INFO, (st), (i)) +# define sk_PKCS7_SIGNER_INFO_set(st, i, val) SKM_sk_set(PKCS7_SIGNER_INFO, (st), (i), (val)) +# define sk_PKCS7_SIGNER_INFO_zero(st) SKM_sk_zero(PKCS7_SIGNER_INFO, (st)) +# define sk_PKCS7_SIGNER_INFO_push(st, val) SKM_sk_push(PKCS7_SIGNER_INFO, (st), (val)) +# define sk_PKCS7_SIGNER_INFO_unshift(st, val) SKM_sk_unshift(PKCS7_SIGNER_INFO, (st), (val)) +# define sk_PKCS7_SIGNER_INFO_find(st, val) SKM_sk_find(PKCS7_SIGNER_INFO, (st), (val)) +# define sk_PKCS7_SIGNER_INFO_find_ex(st, val) SKM_sk_find_ex(PKCS7_SIGNER_INFO, (st), (val)) +# define sk_PKCS7_SIGNER_INFO_delete(st, i) SKM_sk_delete(PKCS7_SIGNER_INFO, (st), (i)) +# define sk_PKCS7_SIGNER_INFO_delete_ptr(st, ptr) SKM_sk_delete_ptr(PKCS7_SIGNER_INFO, (st), (ptr)) +# define sk_PKCS7_SIGNER_INFO_insert(st, val, i) SKM_sk_insert(PKCS7_SIGNER_INFO, (st), (val), (i)) +# define sk_PKCS7_SIGNER_INFO_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(PKCS7_SIGNER_INFO, (st), (cmp)) +# define sk_PKCS7_SIGNER_INFO_dup(st) SKM_sk_dup(PKCS7_SIGNER_INFO, st) +# define sk_PKCS7_SIGNER_INFO_pop_free(st, free_func) SKM_sk_pop_free(PKCS7_SIGNER_INFO, (st), (free_func)) +# define sk_PKCS7_SIGNER_INFO_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(PKCS7_SIGNER_INFO, (st), (copy_func), (free_func)) +# define sk_PKCS7_SIGNER_INFO_shift(st) SKM_sk_shift(PKCS7_SIGNER_INFO, (st)) +# define sk_PKCS7_SIGNER_INFO_pop(st) SKM_sk_pop(PKCS7_SIGNER_INFO, (st)) +# define sk_PKCS7_SIGNER_INFO_sort(st) SKM_sk_sort(PKCS7_SIGNER_INFO, (st)) +# define sk_PKCS7_SIGNER_INFO_is_sorted(st) SKM_sk_is_sorted(PKCS7_SIGNER_INFO, (st)) +# define sk_POLICYINFO_new(cmp) SKM_sk_new(POLICYINFO, (cmp)) +# define sk_POLICYINFO_new_null() SKM_sk_new_null(POLICYINFO) +# define sk_POLICYINFO_free(st) SKM_sk_free(POLICYINFO, (st)) +# define sk_POLICYINFO_num(st) SKM_sk_num(POLICYINFO, (st)) +# define sk_POLICYINFO_value(st, i) SKM_sk_value(POLICYINFO, (st), (i)) +# define sk_POLICYINFO_set(st, i, val) SKM_sk_set(POLICYINFO, (st), (i), (val)) +# define sk_POLICYINFO_zero(st) SKM_sk_zero(POLICYINFO, (st)) +# define sk_POLICYINFO_push(st, val) SKM_sk_push(POLICYINFO, (st), (val)) +# define sk_POLICYINFO_unshift(st, val) SKM_sk_unshift(POLICYINFO, (st), (val)) +# define sk_POLICYINFO_find(st, val) SKM_sk_find(POLICYINFO, (st), (val)) +# define sk_POLICYINFO_find_ex(st, val) SKM_sk_find_ex(POLICYINFO, (st), (val)) +# define sk_POLICYINFO_delete(st, i) SKM_sk_delete(POLICYINFO, (st), (i)) +# define sk_POLICYINFO_delete_ptr(st, ptr) SKM_sk_delete_ptr(POLICYINFO, (st), (ptr)) +# define sk_POLICYINFO_insert(st, val, i) SKM_sk_insert(POLICYINFO, (st), (val), (i)) +# define sk_POLICYINFO_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(POLICYINFO, (st), (cmp)) +# define sk_POLICYINFO_dup(st) SKM_sk_dup(POLICYINFO, st) +# define sk_POLICYINFO_pop_free(st, free_func) SKM_sk_pop_free(POLICYINFO, (st), (free_func)) +# define sk_POLICYINFO_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(POLICYINFO, (st), (copy_func), (free_func)) +# define sk_POLICYINFO_shift(st) SKM_sk_shift(POLICYINFO, (st)) +# define sk_POLICYINFO_pop(st) SKM_sk_pop(POLICYINFO, (st)) +# define sk_POLICYINFO_sort(st) SKM_sk_sort(POLICYINFO, (st)) +# define sk_POLICYINFO_is_sorted(st) SKM_sk_is_sorted(POLICYINFO, (st)) +# define sk_POLICYQUALINFO_new(cmp) SKM_sk_new(POLICYQUALINFO, (cmp)) +# define sk_POLICYQUALINFO_new_null() SKM_sk_new_null(POLICYQUALINFO) +# define sk_POLICYQUALINFO_free(st) SKM_sk_free(POLICYQUALINFO, (st)) +# define sk_POLICYQUALINFO_num(st) SKM_sk_num(POLICYQUALINFO, (st)) +# define sk_POLICYQUALINFO_value(st, i) SKM_sk_value(POLICYQUALINFO, (st), (i)) +# define sk_POLICYQUALINFO_set(st, i, val) SKM_sk_set(POLICYQUALINFO, (st), (i), (val)) +# define sk_POLICYQUALINFO_zero(st) SKM_sk_zero(POLICYQUALINFO, (st)) +# define sk_POLICYQUALINFO_push(st, val) SKM_sk_push(POLICYQUALINFO, (st), (val)) +# define sk_POLICYQUALINFO_unshift(st, val) SKM_sk_unshift(POLICYQUALINFO, (st), (val)) +# define sk_POLICYQUALINFO_find(st, val) SKM_sk_find(POLICYQUALINFO, (st), (val)) +# define sk_POLICYQUALINFO_find_ex(st, val) SKM_sk_find_ex(POLICYQUALINFO, (st), (val)) +# define sk_POLICYQUALINFO_delete(st, i) SKM_sk_delete(POLICYQUALINFO, (st), (i)) +# define sk_POLICYQUALINFO_delete_ptr(st, ptr) SKM_sk_delete_ptr(POLICYQUALINFO, (st), (ptr)) +# define sk_POLICYQUALINFO_insert(st, val, i) SKM_sk_insert(POLICYQUALINFO, (st), (val), (i)) +# define sk_POLICYQUALINFO_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(POLICYQUALINFO, (st), (cmp)) +# define sk_POLICYQUALINFO_dup(st) SKM_sk_dup(POLICYQUALINFO, st) +# define sk_POLICYQUALINFO_pop_free(st, free_func) SKM_sk_pop_free(POLICYQUALINFO, (st), (free_func)) +# define sk_POLICYQUALINFO_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(POLICYQUALINFO, (st), (copy_func), (free_func)) +# define sk_POLICYQUALINFO_shift(st) SKM_sk_shift(POLICYQUALINFO, (st)) +# define sk_POLICYQUALINFO_pop(st) SKM_sk_pop(POLICYQUALINFO, (st)) +# define sk_POLICYQUALINFO_sort(st) SKM_sk_sort(POLICYQUALINFO, (st)) +# define sk_POLICYQUALINFO_is_sorted(st) SKM_sk_is_sorted(POLICYQUALINFO, (st)) +# define sk_POLICY_MAPPING_new(cmp) SKM_sk_new(POLICY_MAPPING, (cmp)) +# define sk_POLICY_MAPPING_new_null() SKM_sk_new_null(POLICY_MAPPING) +# define sk_POLICY_MAPPING_free(st) SKM_sk_free(POLICY_MAPPING, (st)) +# define sk_POLICY_MAPPING_num(st) SKM_sk_num(POLICY_MAPPING, (st)) +# define sk_POLICY_MAPPING_value(st, i) SKM_sk_value(POLICY_MAPPING, (st), (i)) +# define sk_POLICY_MAPPING_set(st, i, val) SKM_sk_set(POLICY_MAPPING, (st), (i), (val)) +# define sk_POLICY_MAPPING_zero(st) SKM_sk_zero(POLICY_MAPPING, (st)) +# define sk_POLICY_MAPPING_push(st, val) SKM_sk_push(POLICY_MAPPING, (st), (val)) +# define sk_POLICY_MAPPING_unshift(st, val) SKM_sk_unshift(POLICY_MAPPING, (st), (val)) +# define sk_POLICY_MAPPING_find(st, val) SKM_sk_find(POLICY_MAPPING, (st), (val)) +# define sk_POLICY_MAPPING_find_ex(st, val) SKM_sk_find_ex(POLICY_MAPPING, (st), (val)) +# define sk_POLICY_MAPPING_delete(st, i) SKM_sk_delete(POLICY_MAPPING, (st), (i)) +# define sk_POLICY_MAPPING_delete_ptr(st, ptr) SKM_sk_delete_ptr(POLICY_MAPPING, (st), (ptr)) +# define sk_POLICY_MAPPING_insert(st, val, i) SKM_sk_insert(POLICY_MAPPING, (st), (val), (i)) +# define sk_POLICY_MAPPING_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(POLICY_MAPPING, (st), (cmp)) +# define sk_POLICY_MAPPING_dup(st) SKM_sk_dup(POLICY_MAPPING, st) +# define sk_POLICY_MAPPING_pop_free(st, free_func) SKM_sk_pop_free(POLICY_MAPPING, (st), (free_func)) +# define sk_POLICY_MAPPING_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(POLICY_MAPPING, (st), (copy_func), (free_func)) +# define sk_POLICY_MAPPING_shift(st) SKM_sk_shift(POLICY_MAPPING, (st)) +# define sk_POLICY_MAPPING_pop(st) SKM_sk_pop(POLICY_MAPPING, (st)) +# define sk_POLICY_MAPPING_sort(st) SKM_sk_sort(POLICY_MAPPING, (st)) +# define sk_POLICY_MAPPING_is_sorted(st) SKM_sk_is_sorted(POLICY_MAPPING, (st)) +# define sk_SCT_new(cmp) SKM_sk_new(SCT, (cmp)) +# define sk_SCT_new_null() SKM_sk_new_null(SCT) +# define sk_SCT_free(st) SKM_sk_free(SCT, (st)) +# define sk_SCT_num(st) SKM_sk_num(SCT, (st)) +# define sk_SCT_value(st, i) SKM_sk_value(SCT, (st), (i)) +# define sk_SCT_set(st, i, val) SKM_sk_set(SCT, (st), (i), (val)) +# define sk_SCT_zero(st) SKM_sk_zero(SCT, (st)) +# define sk_SCT_push(st, val) SKM_sk_push(SCT, (st), (val)) +# define sk_SCT_unshift(st, val) SKM_sk_unshift(SCT, (st), (val)) +# define sk_SCT_find(st, val) SKM_sk_find(SCT, (st), (val)) +# define sk_SCT_find_ex(st, val) SKM_sk_find_ex(SCT, (st), (val)) +# define sk_SCT_delete(st, i) SKM_sk_delete(SCT, (st), (i)) +# define sk_SCT_delete_ptr(st, ptr) SKM_sk_delete_ptr(SCT, (st), (ptr)) +# define sk_SCT_insert(st, val, i) SKM_sk_insert(SCT, (st), (val), (i)) +# define sk_SCT_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(SCT, (st), (cmp)) +# define sk_SCT_dup(st) SKM_sk_dup(SCT, st) +# define sk_SCT_pop_free(st, free_func) SKM_sk_pop_free(SCT, (st), (free_func)) +# define sk_SCT_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(SCT, (st), (copy_func), (free_func)) +# define sk_SCT_shift(st) SKM_sk_shift(SCT, (st)) +# define sk_SCT_pop(st) SKM_sk_pop(SCT, (st)) +# define sk_SCT_sort(st) SKM_sk_sort(SCT, (st)) +# define sk_SCT_is_sorted(st) SKM_sk_is_sorted(SCT, (st)) +# define sk_SRP_gN_new(cmp) SKM_sk_new(SRP_gN, (cmp)) +# define sk_SRP_gN_new_null() SKM_sk_new_null(SRP_gN) +# define sk_SRP_gN_free(st) SKM_sk_free(SRP_gN, (st)) +# define sk_SRP_gN_num(st) SKM_sk_num(SRP_gN, (st)) +# define sk_SRP_gN_value(st, i) SKM_sk_value(SRP_gN, (st), (i)) +# define sk_SRP_gN_set(st, i, val) SKM_sk_set(SRP_gN, (st), (i), (val)) +# define sk_SRP_gN_zero(st) SKM_sk_zero(SRP_gN, (st)) +# define sk_SRP_gN_push(st, val) SKM_sk_push(SRP_gN, (st), (val)) +# define sk_SRP_gN_unshift(st, val) SKM_sk_unshift(SRP_gN, (st), (val)) +# define sk_SRP_gN_find(st, val) SKM_sk_find(SRP_gN, (st), (val)) +# define sk_SRP_gN_find_ex(st, val) SKM_sk_find_ex(SRP_gN, (st), (val)) +# define sk_SRP_gN_delete(st, i) SKM_sk_delete(SRP_gN, (st), (i)) +# define sk_SRP_gN_delete_ptr(st, ptr) SKM_sk_delete_ptr(SRP_gN, (st), (ptr)) +# define sk_SRP_gN_insert(st, val, i) SKM_sk_insert(SRP_gN, (st), (val), (i)) +# define sk_SRP_gN_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(SRP_gN, (st), (cmp)) +# define sk_SRP_gN_dup(st) SKM_sk_dup(SRP_gN, st) +# define sk_SRP_gN_pop_free(st, free_func) SKM_sk_pop_free(SRP_gN, (st), (free_func)) +# define sk_SRP_gN_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(SRP_gN, (st), (copy_func), (free_func)) +# define sk_SRP_gN_shift(st) SKM_sk_shift(SRP_gN, (st)) +# define sk_SRP_gN_pop(st) SKM_sk_pop(SRP_gN, (st)) +# define sk_SRP_gN_sort(st) SKM_sk_sort(SRP_gN, (st)) +# define sk_SRP_gN_is_sorted(st) SKM_sk_is_sorted(SRP_gN, (st)) +# define sk_SRP_gN_cache_new(cmp) SKM_sk_new(SRP_gN_cache, (cmp)) +# define sk_SRP_gN_cache_new_null() SKM_sk_new_null(SRP_gN_cache) +# define sk_SRP_gN_cache_free(st) SKM_sk_free(SRP_gN_cache, (st)) +# define sk_SRP_gN_cache_num(st) SKM_sk_num(SRP_gN_cache, (st)) +# define sk_SRP_gN_cache_value(st, i) SKM_sk_value(SRP_gN_cache, (st), (i)) +# define sk_SRP_gN_cache_set(st, i, val) SKM_sk_set(SRP_gN_cache, (st), (i), (val)) +# define sk_SRP_gN_cache_zero(st) SKM_sk_zero(SRP_gN_cache, (st)) +# define sk_SRP_gN_cache_push(st, val) SKM_sk_push(SRP_gN_cache, (st), (val)) +# define sk_SRP_gN_cache_unshift(st, val) SKM_sk_unshift(SRP_gN_cache, (st), (val)) +# define sk_SRP_gN_cache_find(st, val) SKM_sk_find(SRP_gN_cache, (st), (val)) +# define sk_SRP_gN_cache_find_ex(st, val) SKM_sk_find_ex(SRP_gN_cache, (st), (val)) +# define sk_SRP_gN_cache_delete(st, i) SKM_sk_delete(SRP_gN_cache, (st), (i)) +# define sk_SRP_gN_cache_delete_ptr(st, ptr) SKM_sk_delete_ptr(SRP_gN_cache, (st), (ptr)) +# define sk_SRP_gN_cache_insert(st, val, i) SKM_sk_insert(SRP_gN_cache, (st), (val), (i)) +# define sk_SRP_gN_cache_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(SRP_gN_cache, (st), (cmp)) +# define sk_SRP_gN_cache_dup(st) SKM_sk_dup(SRP_gN_cache, st) +# define sk_SRP_gN_cache_pop_free(st, free_func) SKM_sk_pop_free(SRP_gN_cache, (st), (free_func)) +# define sk_SRP_gN_cache_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(SRP_gN_cache, (st), (copy_func), (free_func)) +# define sk_SRP_gN_cache_shift(st) SKM_sk_shift(SRP_gN_cache, (st)) +# define sk_SRP_gN_cache_pop(st) SKM_sk_pop(SRP_gN_cache, (st)) +# define sk_SRP_gN_cache_sort(st) SKM_sk_sort(SRP_gN_cache, (st)) +# define sk_SRP_gN_cache_is_sorted(st) SKM_sk_is_sorted(SRP_gN_cache, (st)) +# define sk_SRP_user_pwd_new(cmp) SKM_sk_new(SRP_user_pwd, (cmp)) +# define sk_SRP_user_pwd_new_null() SKM_sk_new_null(SRP_user_pwd) +# define sk_SRP_user_pwd_free(st) SKM_sk_free(SRP_user_pwd, (st)) +# define sk_SRP_user_pwd_num(st) SKM_sk_num(SRP_user_pwd, (st)) +# define sk_SRP_user_pwd_value(st, i) SKM_sk_value(SRP_user_pwd, (st), (i)) +# define sk_SRP_user_pwd_set(st, i, val) SKM_sk_set(SRP_user_pwd, (st), (i), (val)) +# define sk_SRP_user_pwd_zero(st) SKM_sk_zero(SRP_user_pwd, (st)) +# define sk_SRP_user_pwd_push(st, val) SKM_sk_push(SRP_user_pwd, (st), (val)) +# define sk_SRP_user_pwd_unshift(st, val) SKM_sk_unshift(SRP_user_pwd, (st), (val)) +# define sk_SRP_user_pwd_find(st, val) SKM_sk_find(SRP_user_pwd, (st), (val)) +# define sk_SRP_user_pwd_find_ex(st, val) SKM_sk_find_ex(SRP_user_pwd, (st), (val)) +# define sk_SRP_user_pwd_delete(st, i) SKM_sk_delete(SRP_user_pwd, (st), (i)) +# define sk_SRP_user_pwd_delete_ptr(st, ptr) SKM_sk_delete_ptr(SRP_user_pwd, (st), (ptr)) +# define sk_SRP_user_pwd_insert(st, val, i) SKM_sk_insert(SRP_user_pwd, (st), (val), (i)) +# define sk_SRP_user_pwd_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(SRP_user_pwd, (st), (cmp)) +# define sk_SRP_user_pwd_dup(st) SKM_sk_dup(SRP_user_pwd, st) +# define sk_SRP_user_pwd_pop_free(st, free_func) SKM_sk_pop_free(SRP_user_pwd, (st), (free_func)) +# define sk_SRP_user_pwd_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(SRP_user_pwd, (st), (copy_func), (free_func)) +# define sk_SRP_user_pwd_shift(st) SKM_sk_shift(SRP_user_pwd, (st)) +# define sk_SRP_user_pwd_pop(st) SKM_sk_pop(SRP_user_pwd, (st)) +# define sk_SRP_user_pwd_sort(st) SKM_sk_sort(SRP_user_pwd, (st)) +# define sk_SRP_user_pwd_is_sorted(st) SKM_sk_is_sorted(SRP_user_pwd, (st)) +# define sk_SRTP_PROTECTION_PROFILE_new(cmp) SKM_sk_new(SRTP_PROTECTION_PROFILE, (cmp)) +# define sk_SRTP_PROTECTION_PROFILE_new_null() SKM_sk_new_null(SRTP_PROTECTION_PROFILE) +# define sk_SRTP_PROTECTION_PROFILE_free(st) SKM_sk_free(SRTP_PROTECTION_PROFILE, (st)) +# define sk_SRTP_PROTECTION_PROFILE_num(st) SKM_sk_num(SRTP_PROTECTION_PROFILE, (st)) +# define sk_SRTP_PROTECTION_PROFILE_value(st, i) SKM_sk_value(SRTP_PROTECTION_PROFILE, (st), (i)) +# define sk_SRTP_PROTECTION_PROFILE_set(st, i, val) SKM_sk_set(SRTP_PROTECTION_PROFILE, (st), (i), (val)) +# define sk_SRTP_PROTECTION_PROFILE_zero(st) SKM_sk_zero(SRTP_PROTECTION_PROFILE, (st)) +# define sk_SRTP_PROTECTION_PROFILE_push(st, val) SKM_sk_push(SRTP_PROTECTION_PROFILE, (st), (val)) +# define sk_SRTP_PROTECTION_PROFILE_unshift(st, val) SKM_sk_unshift(SRTP_PROTECTION_PROFILE, (st), (val)) +# define sk_SRTP_PROTECTION_PROFILE_find(st, val) SKM_sk_find(SRTP_PROTECTION_PROFILE, (st), (val)) +# define sk_SRTP_PROTECTION_PROFILE_find_ex(st, val) SKM_sk_find_ex(SRTP_PROTECTION_PROFILE, (st), (val)) +# define sk_SRTP_PROTECTION_PROFILE_delete(st, i) SKM_sk_delete(SRTP_PROTECTION_PROFILE, (st), (i)) +# define sk_SRTP_PROTECTION_PROFILE_delete_ptr(st, ptr) SKM_sk_delete_ptr(SRTP_PROTECTION_PROFILE, (st), (ptr)) +# define sk_SRTP_PROTECTION_PROFILE_insert(st, val, i) SKM_sk_insert(SRTP_PROTECTION_PROFILE, (st), (val), (i)) +# define sk_SRTP_PROTECTION_PROFILE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(SRTP_PROTECTION_PROFILE, (st), (cmp)) +# define sk_SRTP_PROTECTION_PROFILE_dup(st) SKM_sk_dup(SRTP_PROTECTION_PROFILE, st) +# define sk_SRTP_PROTECTION_PROFILE_pop_free(st, free_func) SKM_sk_pop_free(SRTP_PROTECTION_PROFILE, (st), (free_func)) +# define sk_SRTP_PROTECTION_PROFILE_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(SRTP_PROTECTION_PROFILE, (st), (copy_func), (free_func)) +# define sk_SRTP_PROTECTION_PROFILE_shift(st) SKM_sk_shift(SRTP_PROTECTION_PROFILE, (st)) +# define sk_SRTP_PROTECTION_PROFILE_pop(st) SKM_sk_pop(SRTP_PROTECTION_PROFILE, (st)) +# define sk_SRTP_PROTECTION_PROFILE_sort(st) SKM_sk_sort(SRTP_PROTECTION_PROFILE, (st)) +# define sk_SRTP_PROTECTION_PROFILE_is_sorted(st) SKM_sk_is_sorted(SRTP_PROTECTION_PROFILE, (st)) +# define sk_SSL_CIPHER_new(cmp) SKM_sk_new(SSL_CIPHER, (cmp)) +# define sk_SSL_CIPHER_new_null() SKM_sk_new_null(SSL_CIPHER) +# define sk_SSL_CIPHER_free(st) SKM_sk_free(SSL_CIPHER, (st)) +# define sk_SSL_CIPHER_num(st) SKM_sk_num(SSL_CIPHER, (st)) +# define sk_SSL_CIPHER_value(st, i) SKM_sk_value(SSL_CIPHER, (st), (i)) +# define sk_SSL_CIPHER_set(st, i, val) SKM_sk_set(SSL_CIPHER, (st), (i), (val)) +# define sk_SSL_CIPHER_zero(st) SKM_sk_zero(SSL_CIPHER, (st)) +# define sk_SSL_CIPHER_push(st, val) SKM_sk_push(SSL_CIPHER, (st), (val)) +# define sk_SSL_CIPHER_unshift(st, val) SKM_sk_unshift(SSL_CIPHER, (st), (val)) +# define sk_SSL_CIPHER_find(st, val) SKM_sk_find(SSL_CIPHER, (st), (val)) +# define sk_SSL_CIPHER_find_ex(st, val) SKM_sk_find_ex(SSL_CIPHER, (st), (val)) +# define sk_SSL_CIPHER_delete(st, i) SKM_sk_delete(SSL_CIPHER, (st), (i)) +# define sk_SSL_CIPHER_delete_ptr(st, ptr) SKM_sk_delete_ptr(SSL_CIPHER, (st), (ptr)) +# define sk_SSL_CIPHER_insert(st, val, i) SKM_sk_insert(SSL_CIPHER, (st), (val), (i)) +# define sk_SSL_CIPHER_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(SSL_CIPHER, (st), (cmp)) +# define sk_SSL_CIPHER_dup(st) SKM_sk_dup(SSL_CIPHER, st) +# define sk_SSL_CIPHER_pop_free(st, free_func) SKM_sk_pop_free(SSL_CIPHER, (st), (free_func)) +# define sk_SSL_CIPHER_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(SSL_CIPHER, (st), (copy_func), (free_func)) +# define sk_SSL_CIPHER_shift(st) SKM_sk_shift(SSL_CIPHER, (st)) +# define sk_SSL_CIPHER_pop(st) SKM_sk_pop(SSL_CIPHER, (st)) +# define sk_SSL_CIPHER_sort(st) SKM_sk_sort(SSL_CIPHER, (st)) +# define sk_SSL_CIPHER_is_sorted(st) SKM_sk_is_sorted(SSL_CIPHER, (st)) +# define sk_SSL_COMP_new(cmp) SKM_sk_new(SSL_COMP, (cmp)) +# define sk_SSL_COMP_new_null() SKM_sk_new_null(SSL_COMP) +# define sk_SSL_COMP_free(st) SKM_sk_free(SSL_COMP, (st)) +# define sk_SSL_COMP_num(st) SKM_sk_num(SSL_COMP, (st)) +# define sk_SSL_COMP_value(st, i) SKM_sk_value(SSL_COMP, (st), (i)) +# define sk_SSL_COMP_set(st, i, val) SKM_sk_set(SSL_COMP, (st), (i), (val)) +# define sk_SSL_COMP_zero(st) SKM_sk_zero(SSL_COMP, (st)) +# define sk_SSL_COMP_push(st, val) SKM_sk_push(SSL_COMP, (st), (val)) +# define sk_SSL_COMP_unshift(st, val) SKM_sk_unshift(SSL_COMP, (st), (val)) +# define sk_SSL_COMP_find(st, val) SKM_sk_find(SSL_COMP, (st), (val)) +# define sk_SSL_COMP_find_ex(st, val) SKM_sk_find_ex(SSL_COMP, (st), (val)) +# define sk_SSL_COMP_delete(st, i) SKM_sk_delete(SSL_COMP, (st), (i)) +# define sk_SSL_COMP_delete_ptr(st, ptr) SKM_sk_delete_ptr(SSL_COMP, (st), (ptr)) +# define sk_SSL_COMP_insert(st, val, i) SKM_sk_insert(SSL_COMP, (st), (val), (i)) +# define sk_SSL_COMP_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(SSL_COMP, (st), (cmp)) +# define sk_SSL_COMP_dup(st) SKM_sk_dup(SSL_COMP, st) +# define sk_SSL_COMP_pop_free(st, free_func) SKM_sk_pop_free(SSL_COMP, (st), (free_func)) +# define sk_SSL_COMP_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(SSL_COMP, (st), (copy_func), (free_func)) +# define sk_SSL_COMP_shift(st) SKM_sk_shift(SSL_COMP, (st)) +# define sk_SSL_COMP_pop(st) SKM_sk_pop(SSL_COMP, (st)) +# define sk_SSL_COMP_sort(st) SKM_sk_sort(SSL_COMP, (st)) +# define sk_SSL_COMP_is_sorted(st) SKM_sk_is_sorted(SSL_COMP, (st)) +# define sk_STACK_OF_X509_NAME_ENTRY_new(cmp) SKM_sk_new(STACK_OF_X509_NAME_ENTRY, (cmp)) +# define sk_STACK_OF_X509_NAME_ENTRY_new_null() SKM_sk_new_null(STACK_OF_X509_NAME_ENTRY) +# define sk_STACK_OF_X509_NAME_ENTRY_free(st) SKM_sk_free(STACK_OF_X509_NAME_ENTRY, (st)) +# define sk_STACK_OF_X509_NAME_ENTRY_num(st) SKM_sk_num(STACK_OF_X509_NAME_ENTRY, (st)) +# define sk_STACK_OF_X509_NAME_ENTRY_value(st, i) SKM_sk_value(STACK_OF_X509_NAME_ENTRY, (st), (i)) +# define sk_STACK_OF_X509_NAME_ENTRY_set(st, i, val) SKM_sk_set(STACK_OF_X509_NAME_ENTRY, (st), (i), (val)) +# define sk_STACK_OF_X509_NAME_ENTRY_zero(st) SKM_sk_zero(STACK_OF_X509_NAME_ENTRY, (st)) +# define sk_STACK_OF_X509_NAME_ENTRY_push(st, val) SKM_sk_push(STACK_OF_X509_NAME_ENTRY, (st), (val)) +# define sk_STACK_OF_X509_NAME_ENTRY_unshift(st, val) SKM_sk_unshift(STACK_OF_X509_NAME_ENTRY, (st), (val)) +# define sk_STACK_OF_X509_NAME_ENTRY_find(st, val) SKM_sk_find(STACK_OF_X509_NAME_ENTRY, (st), (val)) +# define sk_STACK_OF_X509_NAME_ENTRY_find_ex(st, val) SKM_sk_find_ex(STACK_OF_X509_NAME_ENTRY, (st), (val)) +# define sk_STACK_OF_X509_NAME_ENTRY_delete(st, i) SKM_sk_delete(STACK_OF_X509_NAME_ENTRY, (st), (i)) +# define sk_STACK_OF_X509_NAME_ENTRY_delete_ptr(st, ptr) SKM_sk_delete_ptr(STACK_OF_X509_NAME_ENTRY, (st), (ptr)) +# define sk_STACK_OF_X509_NAME_ENTRY_insert(st, val, i) SKM_sk_insert(STACK_OF_X509_NAME_ENTRY, (st), (val), (i)) +# define sk_STACK_OF_X509_NAME_ENTRY_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(STACK_OF_X509_NAME_ENTRY, (st), (cmp)) +# define sk_STACK_OF_X509_NAME_ENTRY_dup(st) SKM_sk_dup(STACK_OF_X509_NAME_ENTRY, st) +# define sk_STACK_OF_X509_NAME_ENTRY_pop_free(st, free_func) SKM_sk_pop_free(STACK_OF_X509_NAME_ENTRY, (st), (free_func)) +# define sk_STACK_OF_X509_NAME_ENTRY_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(STACK_OF_X509_NAME_ENTRY, (st), (copy_func), (free_func)) +# define sk_STACK_OF_X509_NAME_ENTRY_shift(st) SKM_sk_shift(STACK_OF_X509_NAME_ENTRY, (st)) +# define sk_STACK_OF_X509_NAME_ENTRY_pop(st) SKM_sk_pop(STACK_OF_X509_NAME_ENTRY, (st)) +# define sk_STACK_OF_X509_NAME_ENTRY_sort(st) SKM_sk_sort(STACK_OF_X509_NAME_ENTRY, (st)) +# define sk_STACK_OF_X509_NAME_ENTRY_is_sorted(st) SKM_sk_is_sorted(STACK_OF_X509_NAME_ENTRY, (st)) +# define sk_STORE_ATTR_INFO_new(cmp) SKM_sk_new(STORE_ATTR_INFO, (cmp)) +# define sk_STORE_ATTR_INFO_new_null() SKM_sk_new_null(STORE_ATTR_INFO) +# define sk_STORE_ATTR_INFO_free(st) SKM_sk_free(STORE_ATTR_INFO, (st)) +# define sk_STORE_ATTR_INFO_num(st) SKM_sk_num(STORE_ATTR_INFO, (st)) +# define sk_STORE_ATTR_INFO_value(st, i) SKM_sk_value(STORE_ATTR_INFO, (st), (i)) +# define sk_STORE_ATTR_INFO_set(st, i, val) SKM_sk_set(STORE_ATTR_INFO, (st), (i), (val)) +# define sk_STORE_ATTR_INFO_zero(st) SKM_sk_zero(STORE_ATTR_INFO, (st)) +# define sk_STORE_ATTR_INFO_push(st, val) SKM_sk_push(STORE_ATTR_INFO, (st), (val)) +# define sk_STORE_ATTR_INFO_unshift(st, val) SKM_sk_unshift(STORE_ATTR_INFO, (st), (val)) +# define sk_STORE_ATTR_INFO_find(st, val) SKM_sk_find(STORE_ATTR_INFO, (st), (val)) +# define sk_STORE_ATTR_INFO_find_ex(st, val) SKM_sk_find_ex(STORE_ATTR_INFO, (st), (val)) +# define sk_STORE_ATTR_INFO_delete(st, i) SKM_sk_delete(STORE_ATTR_INFO, (st), (i)) +# define sk_STORE_ATTR_INFO_delete_ptr(st, ptr) SKM_sk_delete_ptr(STORE_ATTR_INFO, (st), (ptr)) +# define sk_STORE_ATTR_INFO_insert(st, val, i) SKM_sk_insert(STORE_ATTR_INFO, (st), (val), (i)) +# define sk_STORE_ATTR_INFO_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(STORE_ATTR_INFO, (st), (cmp)) +# define sk_STORE_ATTR_INFO_dup(st) SKM_sk_dup(STORE_ATTR_INFO, st) +# define sk_STORE_ATTR_INFO_pop_free(st, free_func) SKM_sk_pop_free(STORE_ATTR_INFO, (st), (free_func)) +# define sk_STORE_ATTR_INFO_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(STORE_ATTR_INFO, (st), (copy_func), (free_func)) +# define sk_STORE_ATTR_INFO_shift(st) SKM_sk_shift(STORE_ATTR_INFO, (st)) +# define sk_STORE_ATTR_INFO_pop(st) SKM_sk_pop(STORE_ATTR_INFO, (st)) +# define sk_STORE_ATTR_INFO_sort(st) SKM_sk_sort(STORE_ATTR_INFO, (st)) +# define sk_STORE_ATTR_INFO_is_sorted(st) SKM_sk_is_sorted(STORE_ATTR_INFO, (st)) +# define sk_STORE_OBJECT_new(cmp) SKM_sk_new(STORE_OBJECT, (cmp)) +# define sk_STORE_OBJECT_new_null() SKM_sk_new_null(STORE_OBJECT) +# define sk_STORE_OBJECT_free(st) SKM_sk_free(STORE_OBJECT, (st)) +# define sk_STORE_OBJECT_num(st) SKM_sk_num(STORE_OBJECT, (st)) +# define sk_STORE_OBJECT_value(st, i) SKM_sk_value(STORE_OBJECT, (st), (i)) +# define sk_STORE_OBJECT_set(st, i, val) SKM_sk_set(STORE_OBJECT, (st), (i), (val)) +# define sk_STORE_OBJECT_zero(st) SKM_sk_zero(STORE_OBJECT, (st)) +# define sk_STORE_OBJECT_push(st, val) SKM_sk_push(STORE_OBJECT, (st), (val)) +# define sk_STORE_OBJECT_unshift(st, val) SKM_sk_unshift(STORE_OBJECT, (st), (val)) +# define sk_STORE_OBJECT_find(st, val) SKM_sk_find(STORE_OBJECT, (st), (val)) +# define sk_STORE_OBJECT_find_ex(st, val) SKM_sk_find_ex(STORE_OBJECT, (st), (val)) +# define sk_STORE_OBJECT_delete(st, i) SKM_sk_delete(STORE_OBJECT, (st), (i)) +# define sk_STORE_OBJECT_delete_ptr(st, ptr) SKM_sk_delete_ptr(STORE_OBJECT, (st), (ptr)) +# define sk_STORE_OBJECT_insert(st, val, i) SKM_sk_insert(STORE_OBJECT, (st), (val), (i)) +# define sk_STORE_OBJECT_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(STORE_OBJECT, (st), (cmp)) +# define sk_STORE_OBJECT_dup(st) SKM_sk_dup(STORE_OBJECT, st) +# define sk_STORE_OBJECT_pop_free(st, free_func) SKM_sk_pop_free(STORE_OBJECT, (st), (free_func)) +# define sk_STORE_OBJECT_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(STORE_OBJECT, (st), (copy_func), (free_func)) +# define sk_STORE_OBJECT_shift(st) SKM_sk_shift(STORE_OBJECT, (st)) +# define sk_STORE_OBJECT_pop(st) SKM_sk_pop(STORE_OBJECT, (st)) +# define sk_STORE_OBJECT_sort(st) SKM_sk_sort(STORE_OBJECT, (st)) +# define sk_STORE_OBJECT_is_sorted(st) SKM_sk_is_sorted(STORE_OBJECT, (st)) +# define sk_SXNETID_new(cmp) SKM_sk_new(SXNETID, (cmp)) +# define sk_SXNETID_new_null() SKM_sk_new_null(SXNETID) +# define sk_SXNETID_free(st) SKM_sk_free(SXNETID, (st)) +# define sk_SXNETID_num(st) SKM_sk_num(SXNETID, (st)) +# define sk_SXNETID_value(st, i) SKM_sk_value(SXNETID, (st), (i)) +# define sk_SXNETID_set(st, i, val) SKM_sk_set(SXNETID, (st), (i), (val)) +# define sk_SXNETID_zero(st) SKM_sk_zero(SXNETID, (st)) +# define sk_SXNETID_push(st, val) SKM_sk_push(SXNETID, (st), (val)) +# define sk_SXNETID_unshift(st, val) SKM_sk_unshift(SXNETID, (st), (val)) +# define sk_SXNETID_find(st, val) SKM_sk_find(SXNETID, (st), (val)) +# define sk_SXNETID_find_ex(st, val) SKM_sk_find_ex(SXNETID, (st), (val)) +# define sk_SXNETID_delete(st, i) SKM_sk_delete(SXNETID, (st), (i)) +# define sk_SXNETID_delete_ptr(st, ptr) SKM_sk_delete_ptr(SXNETID, (st), (ptr)) +# define sk_SXNETID_insert(st, val, i) SKM_sk_insert(SXNETID, (st), (val), (i)) +# define sk_SXNETID_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(SXNETID, (st), (cmp)) +# define sk_SXNETID_dup(st) SKM_sk_dup(SXNETID, st) +# define sk_SXNETID_pop_free(st, free_func) SKM_sk_pop_free(SXNETID, (st), (free_func)) +# define sk_SXNETID_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(SXNETID, (st), (copy_func), (free_func)) +# define sk_SXNETID_shift(st) SKM_sk_shift(SXNETID, (st)) +# define sk_SXNETID_pop(st) SKM_sk_pop(SXNETID, (st)) +# define sk_SXNETID_sort(st) SKM_sk_sort(SXNETID, (st)) +# define sk_SXNETID_is_sorted(st) SKM_sk_is_sorted(SXNETID, (st)) +# define sk_UI_STRING_new(cmp) SKM_sk_new(UI_STRING, (cmp)) +# define sk_UI_STRING_new_null() SKM_sk_new_null(UI_STRING) +# define sk_UI_STRING_free(st) SKM_sk_free(UI_STRING, (st)) +# define sk_UI_STRING_num(st) SKM_sk_num(UI_STRING, (st)) +# define sk_UI_STRING_value(st, i) SKM_sk_value(UI_STRING, (st), (i)) +# define sk_UI_STRING_set(st, i, val) SKM_sk_set(UI_STRING, (st), (i), (val)) +# define sk_UI_STRING_zero(st) SKM_sk_zero(UI_STRING, (st)) +# define sk_UI_STRING_push(st, val) SKM_sk_push(UI_STRING, (st), (val)) +# define sk_UI_STRING_unshift(st, val) SKM_sk_unshift(UI_STRING, (st), (val)) +# define sk_UI_STRING_find(st, val) SKM_sk_find(UI_STRING, (st), (val)) +# define sk_UI_STRING_find_ex(st, val) SKM_sk_find_ex(UI_STRING, (st), (val)) +# define sk_UI_STRING_delete(st, i) SKM_sk_delete(UI_STRING, (st), (i)) +# define sk_UI_STRING_delete_ptr(st, ptr) SKM_sk_delete_ptr(UI_STRING, (st), (ptr)) +# define sk_UI_STRING_insert(st, val, i) SKM_sk_insert(UI_STRING, (st), (val), (i)) +# define sk_UI_STRING_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(UI_STRING, (st), (cmp)) +# define sk_UI_STRING_dup(st) SKM_sk_dup(UI_STRING, st) +# define sk_UI_STRING_pop_free(st, free_func) SKM_sk_pop_free(UI_STRING, (st), (free_func)) +# define sk_UI_STRING_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(UI_STRING, (st), (copy_func), (free_func)) +# define sk_UI_STRING_shift(st) SKM_sk_shift(UI_STRING, (st)) +# define sk_UI_STRING_pop(st) SKM_sk_pop(UI_STRING, (st)) +# define sk_UI_STRING_sort(st) SKM_sk_sort(UI_STRING, (st)) +# define sk_UI_STRING_is_sorted(st) SKM_sk_is_sorted(UI_STRING, (st)) +# define sk_X509_new(cmp) SKM_sk_new(X509, (cmp)) +# define sk_X509_new_null() SKM_sk_new_null(X509) +# define sk_X509_free(st) SKM_sk_free(X509, (st)) +# define sk_X509_num(st) SKM_sk_num(X509, (st)) +# define sk_X509_value(st, i) SKM_sk_value(X509, (st), (i)) +# define sk_X509_set(st, i, val) SKM_sk_set(X509, (st), (i), (val)) +# define sk_X509_zero(st) SKM_sk_zero(X509, (st)) +# define sk_X509_push(st, val) SKM_sk_push(X509, (st), (val)) +# define sk_X509_unshift(st, val) SKM_sk_unshift(X509, (st), (val)) +# define sk_X509_find(st, val) SKM_sk_find(X509, (st), (val)) +# define sk_X509_find_ex(st, val) SKM_sk_find_ex(X509, (st), (val)) +# define sk_X509_delete(st, i) SKM_sk_delete(X509, (st), (i)) +# define sk_X509_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509, (st), (ptr)) +# define sk_X509_insert(st, val, i) SKM_sk_insert(X509, (st), (val), (i)) +# define sk_X509_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509, (st), (cmp)) +# define sk_X509_dup(st) SKM_sk_dup(X509, st) +# define sk_X509_pop_free(st, free_func) SKM_sk_pop_free(X509, (st), (free_func)) +# define sk_X509_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509, (st), (copy_func), (free_func)) +# define sk_X509_shift(st) SKM_sk_shift(X509, (st)) +# define sk_X509_pop(st) SKM_sk_pop(X509, (st)) +# define sk_X509_sort(st) SKM_sk_sort(X509, (st)) +# define sk_X509_is_sorted(st) SKM_sk_is_sorted(X509, (st)) +# define sk_X509V3_EXT_METHOD_new(cmp) SKM_sk_new(X509V3_EXT_METHOD, (cmp)) +# define sk_X509V3_EXT_METHOD_new_null() SKM_sk_new_null(X509V3_EXT_METHOD) +# define sk_X509V3_EXT_METHOD_free(st) SKM_sk_free(X509V3_EXT_METHOD, (st)) +# define sk_X509V3_EXT_METHOD_num(st) SKM_sk_num(X509V3_EXT_METHOD, (st)) +# define sk_X509V3_EXT_METHOD_value(st, i) SKM_sk_value(X509V3_EXT_METHOD, (st), (i)) +# define sk_X509V3_EXT_METHOD_set(st, i, val) SKM_sk_set(X509V3_EXT_METHOD, (st), (i), (val)) +# define sk_X509V3_EXT_METHOD_zero(st) SKM_sk_zero(X509V3_EXT_METHOD, (st)) +# define sk_X509V3_EXT_METHOD_push(st, val) SKM_sk_push(X509V3_EXT_METHOD, (st), (val)) +# define sk_X509V3_EXT_METHOD_unshift(st, val) SKM_sk_unshift(X509V3_EXT_METHOD, (st), (val)) +# define sk_X509V3_EXT_METHOD_find(st, val) SKM_sk_find(X509V3_EXT_METHOD, (st), (val)) +# define sk_X509V3_EXT_METHOD_find_ex(st, val) SKM_sk_find_ex(X509V3_EXT_METHOD, (st), (val)) +# define sk_X509V3_EXT_METHOD_delete(st, i) SKM_sk_delete(X509V3_EXT_METHOD, (st), (i)) +# define sk_X509V3_EXT_METHOD_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509V3_EXT_METHOD, (st), (ptr)) +# define sk_X509V3_EXT_METHOD_insert(st, val, i) SKM_sk_insert(X509V3_EXT_METHOD, (st), (val), (i)) +# define sk_X509V3_EXT_METHOD_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509V3_EXT_METHOD, (st), (cmp)) +# define sk_X509V3_EXT_METHOD_dup(st) SKM_sk_dup(X509V3_EXT_METHOD, st) +# define sk_X509V3_EXT_METHOD_pop_free(st, free_func) SKM_sk_pop_free(X509V3_EXT_METHOD, (st), (free_func)) +# define sk_X509V3_EXT_METHOD_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509V3_EXT_METHOD, (st), (copy_func), (free_func)) +# define sk_X509V3_EXT_METHOD_shift(st) SKM_sk_shift(X509V3_EXT_METHOD, (st)) +# define sk_X509V3_EXT_METHOD_pop(st) SKM_sk_pop(X509V3_EXT_METHOD, (st)) +# define sk_X509V3_EXT_METHOD_sort(st) SKM_sk_sort(X509V3_EXT_METHOD, (st)) +# define sk_X509V3_EXT_METHOD_is_sorted(st) SKM_sk_is_sorted(X509V3_EXT_METHOD, (st)) +# define sk_X509_ALGOR_new(cmp) SKM_sk_new(X509_ALGOR, (cmp)) +# define sk_X509_ALGOR_new_null() SKM_sk_new_null(X509_ALGOR) +# define sk_X509_ALGOR_free(st) SKM_sk_free(X509_ALGOR, (st)) +# define sk_X509_ALGOR_num(st) SKM_sk_num(X509_ALGOR, (st)) +# define sk_X509_ALGOR_value(st, i) SKM_sk_value(X509_ALGOR, (st), (i)) +# define sk_X509_ALGOR_set(st, i, val) SKM_sk_set(X509_ALGOR, (st), (i), (val)) +# define sk_X509_ALGOR_zero(st) SKM_sk_zero(X509_ALGOR, (st)) +# define sk_X509_ALGOR_push(st, val) SKM_sk_push(X509_ALGOR, (st), (val)) +# define sk_X509_ALGOR_unshift(st, val) SKM_sk_unshift(X509_ALGOR, (st), (val)) +# define sk_X509_ALGOR_find(st, val) SKM_sk_find(X509_ALGOR, (st), (val)) +# define sk_X509_ALGOR_find_ex(st, val) SKM_sk_find_ex(X509_ALGOR, (st), (val)) +# define sk_X509_ALGOR_delete(st, i) SKM_sk_delete(X509_ALGOR, (st), (i)) +# define sk_X509_ALGOR_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_ALGOR, (st), (ptr)) +# define sk_X509_ALGOR_insert(st, val, i) SKM_sk_insert(X509_ALGOR, (st), (val), (i)) +# define sk_X509_ALGOR_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_ALGOR, (st), (cmp)) +# define sk_X509_ALGOR_dup(st) SKM_sk_dup(X509_ALGOR, st) +# define sk_X509_ALGOR_pop_free(st, free_func) SKM_sk_pop_free(X509_ALGOR, (st), (free_func)) +# define sk_X509_ALGOR_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_ALGOR, (st), (copy_func), (free_func)) +# define sk_X509_ALGOR_shift(st) SKM_sk_shift(X509_ALGOR, (st)) +# define sk_X509_ALGOR_pop(st) SKM_sk_pop(X509_ALGOR, (st)) +# define sk_X509_ALGOR_sort(st) SKM_sk_sort(X509_ALGOR, (st)) +# define sk_X509_ALGOR_is_sorted(st) SKM_sk_is_sorted(X509_ALGOR, (st)) +# define sk_X509_ATTRIBUTE_new(cmp) SKM_sk_new(X509_ATTRIBUTE, (cmp)) +# define sk_X509_ATTRIBUTE_new_null() SKM_sk_new_null(X509_ATTRIBUTE) +# define sk_X509_ATTRIBUTE_free(st) SKM_sk_free(X509_ATTRIBUTE, (st)) +# define sk_X509_ATTRIBUTE_num(st) SKM_sk_num(X509_ATTRIBUTE, (st)) +# define sk_X509_ATTRIBUTE_value(st, i) SKM_sk_value(X509_ATTRIBUTE, (st), (i)) +# define sk_X509_ATTRIBUTE_set(st, i, val) SKM_sk_set(X509_ATTRIBUTE, (st), (i), (val)) +# define sk_X509_ATTRIBUTE_zero(st) SKM_sk_zero(X509_ATTRIBUTE, (st)) +# define sk_X509_ATTRIBUTE_push(st, val) SKM_sk_push(X509_ATTRIBUTE, (st), (val)) +# define sk_X509_ATTRIBUTE_unshift(st, val) SKM_sk_unshift(X509_ATTRIBUTE, (st), (val)) +# define sk_X509_ATTRIBUTE_find(st, val) SKM_sk_find(X509_ATTRIBUTE, (st), (val)) +# define sk_X509_ATTRIBUTE_find_ex(st, val) SKM_sk_find_ex(X509_ATTRIBUTE, (st), (val)) +# define sk_X509_ATTRIBUTE_delete(st, i) SKM_sk_delete(X509_ATTRIBUTE, (st), (i)) +# define sk_X509_ATTRIBUTE_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_ATTRIBUTE, (st), (ptr)) +# define sk_X509_ATTRIBUTE_insert(st, val, i) SKM_sk_insert(X509_ATTRIBUTE, (st), (val), (i)) +# define sk_X509_ATTRIBUTE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_ATTRIBUTE, (st), (cmp)) +# define sk_X509_ATTRIBUTE_dup(st) SKM_sk_dup(X509_ATTRIBUTE, st) +# define sk_X509_ATTRIBUTE_pop_free(st, free_func) SKM_sk_pop_free(X509_ATTRIBUTE, (st), (free_func)) +# define sk_X509_ATTRIBUTE_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_ATTRIBUTE, (st), (copy_func), (free_func)) +# define sk_X509_ATTRIBUTE_shift(st) SKM_sk_shift(X509_ATTRIBUTE, (st)) +# define sk_X509_ATTRIBUTE_pop(st) SKM_sk_pop(X509_ATTRIBUTE, (st)) +# define sk_X509_ATTRIBUTE_sort(st) SKM_sk_sort(X509_ATTRIBUTE, (st)) +# define sk_X509_ATTRIBUTE_is_sorted(st) SKM_sk_is_sorted(X509_ATTRIBUTE, (st)) +# define sk_X509_CRL_new(cmp) SKM_sk_new(X509_CRL, (cmp)) +# define sk_X509_CRL_new_null() SKM_sk_new_null(X509_CRL) +# define sk_X509_CRL_free(st) SKM_sk_free(X509_CRL, (st)) +# define sk_X509_CRL_num(st) SKM_sk_num(X509_CRL, (st)) +# define sk_X509_CRL_value(st, i) SKM_sk_value(X509_CRL, (st), (i)) +# define sk_X509_CRL_set(st, i, val) SKM_sk_set(X509_CRL, (st), (i), (val)) +# define sk_X509_CRL_zero(st) SKM_sk_zero(X509_CRL, (st)) +# define sk_X509_CRL_push(st, val) SKM_sk_push(X509_CRL, (st), (val)) +# define sk_X509_CRL_unshift(st, val) SKM_sk_unshift(X509_CRL, (st), (val)) +# define sk_X509_CRL_find(st, val) SKM_sk_find(X509_CRL, (st), (val)) +# define sk_X509_CRL_find_ex(st, val) SKM_sk_find_ex(X509_CRL, (st), (val)) +# define sk_X509_CRL_delete(st, i) SKM_sk_delete(X509_CRL, (st), (i)) +# define sk_X509_CRL_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_CRL, (st), (ptr)) +# define sk_X509_CRL_insert(st, val, i) SKM_sk_insert(X509_CRL, (st), (val), (i)) +# define sk_X509_CRL_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_CRL, (st), (cmp)) +# define sk_X509_CRL_dup(st) SKM_sk_dup(X509_CRL, st) +# define sk_X509_CRL_pop_free(st, free_func) SKM_sk_pop_free(X509_CRL, (st), (free_func)) +# define sk_X509_CRL_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_CRL, (st), (copy_func), (free_func)) +# define sk_X509_CRL_shift(st) SKM_sk_shift(X509_CRL, (st)) +# define sk_X509_CRL_pop(st) SKM_sk_pop(X509_CRL, (st)) +# define sk_X509_CRL_sort(st) SKM_sk_sort(X509_CRL, (st)) +# define sk_X509_CRL_is_sorted(st) SKM_sk_is_sorted(X509_CRL, (st)) +# define sk_X509_EXTENSION_new(cmp) SKM_sk_new(X509_EXTENSION, (cmp)) +# define sk_X509_EXTENSION_new_null() SKM_sk_new_null(X509_EXTENSION) +# define sk_X509_EXTENSION_free(st) SKM_sk_free(X509_EXTENSION, (st)) +# define sk_X509_EXTENSION_num(st) SKM_sk_num(X509_EXTENSION, (st)) +# define sk_X509_EXTENSION_value(st, i) SKM_sk_value(X509_EXTENSION, (st), (i)) +# define sk_X509_EXTENSION_set(st, i, val) SKM_sk_set(X509_EXTENSION, (st), (i), (val)) +# define sk_X509_EXTENSION_zero(st) SKM_sk_zero(X509_EXTENSION, (st)) +# define sk_X509_EXTENSION_push(st, val) SKM_sk_push(X509_EXTENSION, (st), (val)) +# define sk_X509_EXTENSION_unshift(st, val) SKM_sk_unshift(X509_EXTENSION, (st), (val)) +# define sk_X509_EXTENSION_find(st, val) SKM_sk_find(X509_EXTENSION, (st), (val)) +# define sk_X509_EXTENSION_find_ex(st, val) SKM_sk_find_ex(X509_EXTENSION, (st), (val)) +# define sk_X509_EXTENSION_delete(st, i) SKM_sk_delete(X509_EXTENSION, (st), (i)) +# define sk_X509_EXTENSION_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_EXTENSION, (st), (ptr)) +# define sk_X509_EXTENSION_insert(st, val, i) SKM_sk_insert(X509_EXTENSION, (st), (val), (i)) +# define sk_X509_EXTENSION_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_EXTENSION, (st), (cmp)) +# define sk_X509_EXTENSION_dup(st) SKM_sk_dup(X509_EXTENSION, st) +# define sk_X509_EXTENSION_pop_free(st, free_func) SKM_sk_pop_free(X509_EXTENSION, (st), (free_func)) +# define sk_X509_EXTENSION_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_EXTENSION, (st), (copy_func), (free_func)) +# define sk_X509_EXTENSION_shift(st) SKM_sk_shift(X509_EXTENSION, (st)) +# define sk_X509_EXTENSION_pop(st) SKM_sk_pop(X509_EXTENSION, (st)) +# define sk_X509_EXTENSION_sort(st) SKM_sk_sort(X509_EXTENSION, (st)) +# define sk_X509_EXTENSION_is_sorted(st) SKM_sk_is_sorted(X509_EXTENSION, (st)) +# define sk_X509_INFO_new(cmp) SKM_sk_new(X509_INFO, (cmp)) +# define sk_X509_INFO_new_null() SKM_sk_new_null(X509_INFO) +# define sk_X509_INFO_free(st) SKM_sk_free(X509_INFO, (st)) +# define sk_X509_INFO_num(st) SKM_sk_num(X509_INFO, (st)) +# define sk_X509_INFO_value(st, i) SKM_sk_value(X509_INFO, (st), (i)) +# define sk_X509_INFO_set(st, i, val) SKM_sk_set(X509_INFO, (st), (i), (val)) +# define sk_X509_INFO_zero(st) SKM_sk_zero(X509_INFO, (st)) +# define sk_X509_INFO_push(st, val) SKM_sk_push(X509_INFO, (st), (val)) +# define sk_X509_INFO_unshift(st, val) SKM_sk_unshift(X509_INFO, (st), (val)) +# define sk_X509_INFO_find(st, val) SKM_sk_find(X509_INFO, (st), (val)) +# define sk_X509_INFO_find_ex(st, val) SKM_sk_find_ex(X509_INFO, (st), (val)) +# define sk_X509_INFO_delete(st, i) SKM_sk_delete(X509_INFO, (st), (i)) +# define sk_X509_INFO_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_INFO, (st), (ptr)) +# define sk_X509_INFO_insert(st, val, i) SKM_sk_insert(X509_INFO, (st), (val), (i)) +# define sk_X509_INFO_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_INFO, (st), (cmp)) +# define sk_X509_INFO_dup(st) SKM_sk_dup(X509_INFO, st) +# define sk_X509_INFO_pop_free(st, free_func) SKM_sk_pop_free(X509_INFO, (st), (free_func)) +# define sk_X509_INFO_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_INFO, (st), (copy_func), (free_func)) +# define sk_X509_INFO_shift(st) SKM_sk_shift(X509_INFO, (st)) +# define sk_X509_INFO_pop(st) SKM_sk_pop(X509_INFO, (st)) +# define sk_X509_INFO_sort(st) SKM_sk_sort(X509_INFO, (st)) +# define sk_X509_INFO_is_sorted(st) SKM_sk_is_sorted(X509_INFO, (st)) +# define sk_X509_LOOKUP_new(cmp) SKM_sk_new(X509_LOOKUP, (cmp)) +# define sk_X509_LOOKUP_new_null() SKM_sk_new_null(X509_LOOKUP) +# define sk_X509_LOOKUP_free(st) SKM_sk_free(X509_LOOKUP, (st)) +# define sk_X509_LOOKUP_num(st) SKM_sk_num(X509_LOOKUP, (st)) +# define sk_X509_LOOKUP_value(st, i) SKM_sk_value(X509_LOOKUP, (st), (i)) +# define sk_X509_LOOKUP_set(st, i, val) SKM_sk_set(X509_LOOKUP, (st), (i), (val)) +# define sk_X509_LOOKUP_zero(st) SKM_sk_zero(X509_LOOKUP, (st)) +# define sk_X509_LOOKUP_push(st, val) SKM_sk_push(X509_LOOKUP, (st), (val)) +# define sk_X509_LOOKUP_unshift(st, val) SKM_sk_unshift(X509_LOOKUP, (st), (val)) +# define sk_X509_LOOKUP_find(st, val) SKM_sk_find(X509_LOOKUP, (st), (val)) +# define sk_X509_LOOKUP_find_ex(st, val) SKM_sk_find_ex(X509_LOOKUP, (st), (val)) +# define sk_X509_LOOKUP_delete(st, i) SKM_sk_delete(X509_LOOKUP, (st), (i)) +# define sk_X509_LOOKUP_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_LOOKUP, (st), (ptr)) +# define sk_X509_LOOKUP_insert(st, val, i) SKM_sk_insert(X509_LOOKUP, (st), (val), (i)) +# define sk_X509_LOOKUP_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_LOOKUP, (st), (cmp)) +# define sk_X509_LOOKUP_dup(st) SKM_sk_dup(X509_LOOKUP, st) +# define sk_X509_LOOKUP_pop_free(st, free_func) SKM_sk_pop_free(X509_LOOKUP, (st), (free_func)) +# define sk_X509_LOOKUP_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_LOOKUP, (st), (copy_func), (free_func)) +# define sk_X509_LOOKUP_shift(st) SKM_sk_shift(X509_LOOKUP, (st)) +# define sk_X509_LOOKUP_pop(st) SKM_sk_pop(X509_LOOKUP, (st)) +# define sk_X509_LOOKUP_sort(st) SKM_sk_sort(X509_LOOKUP, (st)) +# define sk_X509_LOOKUP_is_sorted(st) SKM_sk_is_sorted(X509_LOOKUP, (st)) +# define sk_X509_NAME_new(cmp) SKM_sk_new(X509_NAME, (cmp)) +# define sk_X509_NAME_new_null() SKM_sk_new_null(X509_NAME) +# define sk_X509_NAME_free(st) SKM_sk_free(X509_NAME, (st)) +# define sk_X509_NAME_num(st) SKM_sk_num(X509_NAME, (st)) +# define sk_X509_NAME_value(st, i) SKM_sk_value(X509_NAME, (st), (i)) +# define sk_X509_NAME_set(st, i, val) SKM_sk_set(X509_NAME, (st), (i), (val)) +# define sk_X509_NAME_zero(st) SKM_sk_zero(X509_NAME, (st)) +# define sk_X509_NAME_push(st, val) SKM_sk_push(X509_NAME, (st), (val)) +# define sk_X509_NAME_unshift(st, val) SKM_sk_unshift(X509_NAME, (st), (val)) +# define sk_X509_NAME_find(st, val) SKM_sk_find(X509_NAME, (st), (val)) +# define sk_X509_NAME_find_ex(st, val) SKM_sk_find_ex(X509_NAME, (st), (val)) +# define sk_X509_NAME_delete(st, i) SKM_sk_delete(X509_NAME, (st), (i)) +# define sk_X509_NAME_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_NAME, (st), (ptr)) +# define sk_X509_NAME_insert(st, val, i) SKM_sk_insert(X509_NAME, (st), (val), (i)) +# define sk_X509_NAME_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_NAME, (st), (cmp)) +# define sk_X509_NAME_dup(st) SKM_sk_dup(X509_NAME, st) +# define sk_X509_NAME_pop_free(st, free_func) SKM_sk_pop_free(X509_NAME, (st), (free_func)) +# define sk_X509_NAME_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_NAME, (st), (copy_func), (free_func)) +# define sk_X509_NAME_shift(st) SKM_sk_shift(X509_NAME, (st)) +# define sk_X509_NAME_pop(st) SKM_sk_pop(X509_NAME, (st)) +# define sk_X509_NAME_sort(st) SKM_sk_sort(X509_NAME, (st)) +# define sk_X509_NAME_is_sorted(st) SKM_sk_is_sorted(X509_NAME, (st)) +# define sk_X509_NAME_ENTRY_new(cmp) SKM_sk_new(X509_NAME_ENTRY, (cmp)) +# define sk_X509_NAME_ENTRY_new_null() SKM_sk_new_null(X509_NAME_ENTRY) +# define sk_X509_NAME_ENTRY_free(st) SKM_sk_free(X509_NAME_ENTRY, (st)) +# define sk_X509_NAME_ENTRY_num(st) SKM_sk_num(X509_NAME_ENTRY, (st)) +# define sk_X509_NAME_ENTRY_value(st, i) SKM_sk_value(X509_NAME_ENTRY, (st), (i)) +# define sk_X509_NAME_ENTRY_set(st, i, val) SKM_sk_set(X509_NAME_ENTRY, (st), (i), (val)) +# define sk_X509_NAME_ENTRY_zero(st) SKM_sk_zero(X509_NAME_ENTRY, (st)) +# define sk_X509_NAME_ENTRY_push(st, val) SKM_sk_push(X509_NAME_ENTRY, (st), (val)) +# define sk_X509_NAME_ENTRY_unshift(st, val) SKM_sk_unshift(X509_NAME_ENTRY, (st), (val)) +# define sk_X509_NAME_ENTRY_find(st, val) SKM_sk_find(X509_NAME_ENTRY, (st), (val)) +# define sk_X509_NAME_ENTRY_find_ex(st, val) SKM_sk_find_ex(X509_NAME_ENTRY, (st), (val)) +# define sk_X509_NAME_ENTRY_delete(st, i) SKM_sk_delete(X509_NAME_ENTRY, (st), (i)) +# define sk_X509_NAME_ENTRY_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_NAME_ENTRY, (st), (ptr)) +# define sk_X509_NAME_ENTRY_insert(st, val, i) SKM_sk_insert(X509_NAME_ENTRY, (st), (val), (i)) +# define sk_X509_NAME_ENTRY_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_NAME_ENTRY, (st), (cmp)) +# define sk_X509_NAME_ENTRY_dup(st) SKM_sk_dup(X509_NAME_ENTRY, st) +# define sk_X509_NAME_ENTRY_pop_free(st, free_func) SKM_sk_pop_free(X509_NAME_ENTRY, (st), (free_func)) +# define sk_X509_NAME_ENTRY_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_NAME_ENTRY, (st), (copy_func), (free_func)) +# define sk_X509_NAME_ENTRY_shift(st) SKM_sk_shift(X509_NAME_ENTRY, (st)) +# define sk_X509_NAME_ENTRY_pop(st) SKM_sk_pop(X509_NAME_ENTRY, (st)) +# define sk_X509_NAME_ENTRY_sort(st) SKM_sk_sort(X509_NAME_ENTRY, (st)) +# define sk_X509_NAME_ENTRY_is_sorted(st) SKM_sk_is_sorted(X509_NAME_ENTRY, (st)) +# define sk_X509_OBJECT_new(cmp) SKM_sk_new(X509_OBJECT, (cmp)) +# define sk_X509_OBJECT_new_null() SKM_sk_new_null(X509_OBJECT) +# define sk_X509_OBJECT_free(st) SKM_sk_free(X509_OBJECT, (st)) +# define sk_X509_OBJECT_num(st) SKM_sk_num(X509_OBJECT, (st)) +# define sk_X509_OBJECT_value(st, i) SKM_sk_value(X509_OBJECT, (st), (i)) +# define sk_X509_OBJECT_set(st, i, val) SKM_sk_set(X509_OBJECT, (st), (i), (val)) +# define sk_X509_OBJECT_zero(st) SKM_sk_zero(X509_OBJECT, (st)) +# define sk_X509_OBJECT_push(st, val) SKM_sk_push(X509_OBJECT, (st), (val)) +# define sk_X509_OBJECT_unshift(st, val) SKM_sk_unshift(X509_OBJECT, (st), (val)) +# define sk_X509_OBJECT_find(st, val) SKM_sk_find(X509_OBJECT, (st), (val)) +# define sk_X509_OBJECT_find_ex(st, val) SKM_sk_find_ex(X509_OBJECT, (st), (val)) +# define sk_X509_OBJECT_delete(st, i) SKM_sk_delete(X509_OBJECT, (st), (i)) +# define sk_X509_OBJECT_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_OBJECT, (st), (ptr)) +# define sk_X509_OBJECT_insert(st, val, i) SKM_sk_insert(X509_OBJECT, (st), (val), (i)) +# define sk_X509_OBJECT_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_OBJECT, (st), (cmp)) +# define sk_X509_OBJECT_dup(st) SKM_sk_dup(X509_OBJECT, st) +# define sk_X509_OBJECT_pop_free(st, free_func) SKM_sk_pop_free(X509_OBJECT, (st), (free_func)) +# define sk_X509_OBJECT_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_OBJECT, (st), (copy_func), (free_func)) +# define sk_X509_OBJECT_shift(st) SKM_sk_shift(X509_OBJECT, (st)) +# define sk_X509_OBJECT_pop(st) SKM_sk_pop(X509_OBJECT, (st)) +# define sk_X509_OBJECT_sort(st) SKM_sk_sort(X509_OBJECT, (st)) +# define sk_X509_OBJECT_is_sorted(st) SKM_sk_is_sorted(X509_OBJECT, (st)) +# define sk_X509_POLICY_DATA_new(cmp) SKM_sk_new(X509_POLICY_DATA, (cmp)) +# define sk_X509_POLICY_DATA_new_null() SKM_sk_new_null(X509_POLICY_DATA) +# define sk_X509_POLICY_DATA_free(st) SKM_sk_free(X509_POLICY_DATA, (st)) +# define sk_X509_POLICY_DATA_num(st) SKM_sk_num(X509_POLICY_DATA, (st)) +# define sk_X509_POLICY_DATA_value(st, i) SKM_sk_value(X509_POLICY_DATA, (st), (i)) +# define sk_X509_POLICY_DATA_set(st, i, val) SKM_sk_set(X509_POLICY_DATA, (st), (i), (val)) +# define sk_X509_POLICY_DATA_zero(st) SKM_sk_zero(X509_POLICY_DATA, (st)) +# define sk_X509_POLICY_DATA_push(st, val) SKM_sk_push(X509_POLICY_DATA, (st), (val)) +# define sk_X509_POLICY_DATA_unshift(st, val) SKM_sk_unshift(X509_POLICY_DATA, (st), (val)) +# define sk_X509_POLICY_DATA_find(st, val) SKM_sk_find(X509_POLICY_DATA, (st), (val)) +# define sk_X509_POLICY_DATA_find_ex(st, val) SKM_sk_find_ex(X509_POLICY_DATA, (st), (val)) +# define sk_X509_POLICY_DATA_delete(st, i) SKM_sk_delete(X509_POLICY_DATA, (st), (i)) +# define sk_X509_POLICY_DATA_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_POLICY_DATA, (st), (ptr)) +# define sk_X509_POLICY_DATA_insert(st, val, i) SKM_sk_insert(X509_POLICY_DATA, (st), (val), (i)) +# define sk_X509_POLICY_DATA_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_POLICY_DATA, (st), (cmp)) +# define sk_X509_POLICY_DATA_dup(st) SKM_sk_dup(X509_POLICY_DATA, st) +# define sk_X509_POLICY_DATA_pop_free(st, free_func) SKM_sk_pop_free(X509_POLICY_DATA, (st), (free_func)) +# define sk_X509_POLICY_DATA_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_POLICY_DATA, (st), (copy_func), (free_func)) +# define sk_X509_POLICY_DATA_shift(st) SKM_sk_shift(X509_POLICY_DATA, (st)) +# define sk_X509_POLICY_DATA_pop(st) SKM_sk_pop(X509_POLICY_DATA, (st)) +# define sk_X509_POLICY_DATA_sort(st) SKM_sk_sort(X509_POLICY_DATA, (st)) +# define sk_X509_POLICY_DATA_is_sorted(st) SKM_sk_is_sorted(X509_POLICY_DATA, (st)) +# define sk_X509_POLICY_NODE_new(cmp) SKM_sk_new(X509_POLICY_NODE, (cmp)) +# define sk_X509_POLICY_NODE_new_null() SKM_sk_new_null(X509_POLICY_NODE) +# define sk_X509_POLICY_NODE_free(st) SKM_sk_free(X509_POLICY_NODE, (st)) +# define sk_X509_POLICY_NODE_num(st) SKM_sk_num(X509_POLICY_NODE, (st)) +# define sk_X509_POLICY_NODE_value(st, i) SKM_sk_value(X509_POLICY_NODE, (st), (i)) +# define sk_X509_POLICY_NODE_set(st, i, val) SKM_sk_set(X509_POLICY_NODE, (st), (i), (val)) +# define sk_X509_POLICY_NODE_zero(st) SKM_sk_zero(X509_POLICY_NODE, (st)) +# define sk_X509_POLICY_NODE_push(st, val) SKM_sk_push(X509_POLICY_NODE, (st), (val)) +# define sk_X509_POLICY_NODE_unshift(st, val) SKM_sk_unshift(X509_POLICY_NODE, (st), (val)) +# define sk_X509_POLICY_NODE_find(st, val) SKM_sk_find(X509_POLICY_NODE, (st), (val)) +# define sk_X509_POLICY_NODE_find_ex(st, val) SKM_sk_find_ex(X509_POLICY_NODE, (st), (val)) +# define sk_X509_POLICY_NODE_delete(st, i) SKM_sk_delete(X509_POLICY_NODE, (st), (i)) +# define sk_X509_POLICY_NODE_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_POLICY_NODE, (st), (ptr)) +# define sk_X509_POLICY_NODE_insert(st, val, i) SKM_sk_insert(X509_POLICY_NODE, (st), (val), (i)) +# define sk_X509_POLICY_NODE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_POLICY_NODE, (st), (cmp)) +# define sk_X509_POLICY_NODE_dup(st) SKM_sk_dup(X509_POLICY_NODE, st) +# define sk_X509_POLICY_NODE_pop_free(st, free_func) SKM_sk_pop_free(X509_POLICY_NODE, (st), (free_func)) +# define sk_X509_POLICY_NODE_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_POLICY_NODE, (st), (copy_func), (free_func)) +# define sk_X509_POLICY_NODE_shift(st) SKM_sk_shift(X509_POLICY_NODE, (st)) +# define sk_X509_POLICY_NODE_pop(st) SKM_sk_pop(X509_POLICY_NODE, (st)) +# define sk_X509_POLICY_NODE_sort(st) SKM_sk_sort(X509_POLICY_NODE, (st)) +# define sk_X509_POLICY_NODE_is_sorted(st) SKM_sk_is_sorted(X509_POLICY_NODE, (st)) +# define sk_X509_PURPOSE_new(cmp) SKM_sk_new(X509_PURPOSE, (cmp)) +# define sk_X509_PURPOSE_new_null() SKM_sk_new_null(X509_PURPOSE) +# define sk_X509_PURPOSE_free(st) SKM_sk_free(X509_PURPOSE, (st)) +# define sk_X509_PURPOSE_num(st) SKM_sk_num(X509_PURPOSE, (st)) +# define sk_X509_PURPOSE_value(st, i) SKM_sk_value(X509_PURPOSE, (st), (i)) +# define sk_X509_PURPOSE_set(st, i, val) SKM_sk_set(X509_PURPOSE, (st), (i), (val)) +# define sk_X509_PURPOSE_zero(st) SKM_sk_zero(X509_PURPOSE, (st)) +# define sk_X509_PURPOSE_push(st, val) SKM_sk_push(X509_PURPOSE, (st), (val)) +# define sk_X509_PURPOSE_unshift(st, val) SKM_sk_unshift(X509_PURPOSE, (st), (val)) +# define sk_X509_PURPOSE_find(st, val) SKM_sk_find(X509_PURPOSE, (st), (val)) +# define sk_X509_PURPOSE_find_ex(st, val) SKM_sk_find_ex(X509_PURPOSE, (st), (val)) +# define sk_X509_PURPOSE_delete(st, i) SKM_sk_delete(X509_PURPOSE, (st), (i)) +# define sk_X509_PURPOSE_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_PURPOSE, (st), (ptr)) +# define sk_X509_PURPOSE_insert(st, val, i) SKM_sk_insert(X509_PURPOSE, (st), (val), (i)) +# define sk_X509_PURPOSE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_PURPOSE, (st), (cmp)) +# define sk_X509_PURPOSE_dup(st) SKM_sk_dup(X509_PURPOSE, st) +# define sk_X509_PURPOSE_pop_free(st, free_func) SKM_sk_pop_free(X509_PURPOSE, (st), (free_func)) +# define sk_X509_PURPOSE_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_PURPOSE, (st), (copy_func), (free_func)) +# define sk_X509_PURPOSE_shift(st) SKM_sk_shift(X509_PURPOSE, (st)) +# define sk_X509_PURPOSE_pop(st) SKM_sk_pop(X509_PURPOSE, (st)) +# define sk_X509_PURPOSE_sort(st) SKM_sk_sort(X509_PURPOSE, (st)) +# define sk_X509_PURPOSE_is_sorted(st) SKM_sk_is_sorted(X509_PURPOSE, (st)) +# define sk_X509_REVOKED_new(cmp) SKM_sk_new(X509_REVOKED, (cmp)) +# define sk_X509_REVOKED_new_null() SKM_sk_new_null(X509_REVOKED) +# define sk_X509_REVOKED_free(st) SKM_sk_free(X509_REVOKED, (st)) +# define sk_X509_REVOKED_num(st) SKM_sk_num(X509_REVOKED, (st)) +# define sk_X509_REVOKED_value(st, i) SKM_sk_value(X509_REVOKED, (st), (i)) +# define sk_X509_REVOKED_set(st, i, val) SKM_sk_set(X509_REVOKED, (st), (i), (val)) +# define sk_X509_REVOKED_zero(st) SKM_sk_zero(X509_REVOKED, (st)) +# define sk_X509_REVOKED_push(st, val) SKM_sk_push(X509_REVOKED, (st), (val)) +# define sk_X509_REVOKED_unshift(st, val) SKM_sk_unshift(X509_REVOKED, (st), (val)) +# define sk_X509_REVOKED_find(st, val) SKM_sk_find(X509_REVOKED, (st), (val)) +# define sk_X509_REVOKED_find_ex(st, val) SKM_sk_find_ex(X509_REVOKED, (st), (val)) +# define sk_X509_REVOKED_delete(st, i) SKM_sk_delete(X509_REVOKED, (st), (i)) +# define sk_X509_REVOKED_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_REVOKED, (st), (ptr)) +# define sk_X509_REVOKED_insert(st, val, i) SKM_sk_insert(X509_REVOKED, (st), (val), (i)) +# define sk_X509_REVOKED_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_REVOKED, (st), (cmp)) +# define sk_X509_REVOKED_dup(st) SKM_sk_dup(X509_REVOKED, st) +# define sk_X509_REVOKED_pop_free(st, free_func) SKM_sk_pop_free(X509_REVOKED, (st), (free_func)) +# define sk_X509_REVOKED_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_REVOKED, (st), (copy_func), (free_func)) +# define sk_X509_REVOKED_shift(st) SKM_sk_shift(X509_REVOKED, (st)) +# define sk_X509_REVOKED_pop(st) SKM_sk_pop(X509_REVOKED, (st)) +# define sk_X509_REVOKED_sort(st) SKM_sk_sort(X509_REVOKED, (st)) +# define sk_X509_REVOKED_is_sorted(st) SKM_sk_is_sorted(X509_REVOKED, (st)) +# define sk_X509_TRUST_new(cmp) SKM_sk_new(X509_TRUST, (cmp)) +# define sk_X509_TRUST_new_null() SKM_sk_new_null(X509_TRUST) +# define sk_X509_TRUST_free(st) SKM_sk_free(X509_TRUST, (st)) +# define sk_X509_TRUST_num(st) SKM_sk_num(X509_TRUST, (st)) +# define sk_X509_TRUST_value(st, i) SKM_sk_value(X509_TRUST, (st), (i)) +# define sk_X509_TRUST_set(st, i, val) SKM_sk_set(X509_TRUST, (st), (i), (val)) +# define sk_X509_TRUST_zero(st) SKM_sk_zero(X509_TRUST, (st)) +# define sk_X509_TRUST_push(st, val) SKM_sk_push(X509_TRUST, (st), (val)) +# define sk_X509_TRUST_unshift(st, val) SKM_sk_unshift(X509_TRUST, (st), (val)) +# define sk_X509_TRUST_find(st, val) SKM_sk_find(X509_TRUST, (st), (val)) +# define sk_X509_TRUST_find_ex(st, val) SKM_sk_find_ex(X509_TRUST, (st), (val)) +# define sk_X509_TRUST_delete(st, i) SKM_sk_delete(X509_TRUST, (st), (i)) +# define sk_X509_TRUST_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_TRUST, (st), (ptr)) +# define sk_X509_TRUST_insert(st, val, i) SKM_sk_insert(X509_TRUST, (st), (val), (i)) +# define sk_X509_TRUST_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_TRUST, (st), (cmp)) +# define sk_X509_TRUST_dup(st) SKM_sk_dup(X509_TRUST, st) +# define sk_X509_TRUST_pop_free(st, free_func) SKM_sk_pop_free(X509_TRUST, (st), (free_func)) +# define sk_X509_TRUST_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_TRUST, (st), (copy_func), (free_func)) +# define sk_X509_TRUST_shift(st) SKM_sk_shift(X509_TRUST, (st)) +# define sk_X509_TRUST_pop(st) SKM_sk_pop(X509_TRUST, (st)) +# define sk_X509_TRUST_sort(st) SKM_sk_sort(X509_TRUST, (st)) +# define sk_X509_TRUST_is_sorted(st) SKM_sk_is_sorted(X509_TRUST, (st)) +# define sk_X509_VERIFY_PARAM_new(cmp) SKM_sk_new(X509_VERIFY_PARAM, (cmp)) +# define sk_X509_VERIFY_PARAM_new_null() SKM_sk_new_null(X509_VERIFY_PARAM) +# define sk_X509_VERIFY_PARAM_free(st) SKM_sk_free(X509_VERIFY_PARAM, (st)) +# define sk_X509_VERIFY_PARAM_num(st) SKM_sk_num(X509_VERIFY_PARAM, (st)) +# define sk_X509_VERIFY_PARAM_value(st, i) SKM_sk_value(X509_VERIFY_PARAM, (st), (i)) +# define sk_X509_VERIFY_PARAM_set(st, i, val) SKM_sk_set(X509_VERIFY_PARAM, (st), (i), (val)) +# define sk_X509_VERIFY_PARAM_zero(st) SKM_sk_zero(X509_VERIFY_PARAM, (st)) +# define sk_X509_VERIFY_PARAM_push(st, val) SKM_sk_push(X509_VERIFY_PARAM, (st), (val)) +# define sk_X509_VERIFY_PARAM_unshift(st, val) SKM_sk_unshift(X509_VERIFY_PARAM, (st), (val)) +# define sk_X509_VERIFY_PARAM_find(st, val) SKM_sk_find(X509_VERIFY_PARAM, (st), (val)) +# define sk_X509_VERIFY_PARAM_find_ex(st, val) SKM_sk_find_ex(X509_VERIFY_PARAM, (st), (val)) +# define sk_X509_VERIFY_PARAM_delete(st, i) SKM_sk_delete(X509_VERIFY_PARAM, (st), (i)) +# define sk_X509_VERIFY_PARAM_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_VERIFY_PARAM, (st), (ptr)) +# define sk_X509_VERIFY_PARAM_insert(st, val, i) SKM_sk_insert(X509_VERIFY_PARAM, (st), (val), (i)) +# define sk_X509_VERIFY_PARAM_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_VERIFY_PARAM, (st), (cmp)) +# define sk_X509_VERIFY_PARAM_dup(st) SKM_sk_dup(X509_VERIFY_PARAM, st) +# define sk_X509_VERIFY_PARAM_pop_free(st, free_func) SKM_sk_pop_free(X509_VERIFY_PARAM, (st), (free_func)) +# define sk_X509_VERIFY_PARAM_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_VERIFY_PARAM, (st), (copy_func), (free_func)) +# define sk_X509_VERIFY_PARAM_shift(st) SKM_sk_shift(X509_VERIFY_PARAM, (st)) +# define sk_X509_VERIFY_PARAM_pop(st) SKM_sk_pop(X509_VERIFY_PARAM, (st)) +# define sk_X509_VERIFY_PARAM_sort(st) SKM_sk_sort(X509_VERIFY_PARAM, (st)) +# define sk_X509_VERIFY_PARAM_is_sorted(st) SKM_sk_is_sorted(X509_VERIFY_PARAM, (st)) +# define sk_nid_triple_new(cmp) SKM_sk_new(nid_triple, (cmp)) +# define sk_nid_triple_new_null() SKM_sk_new_null(nid_triple) +# define sk_nid_triple_free(st) SKM_sk_free(nid_triple, (st)) +# define sk_nid_triple_num(st) SKM_sk_num(nid_triple, (st)) +# define sk_nid_triple_value(st, i) SKM_sk_value(nid_triple, (st), (i)) +# define sk_nid_triple_set(st, i, val) SKM_sk_set(nid_triple, (st), (i), (val)) +# define sk_nid_triple_zero(st) SKM_sk_zero(nid_triple, (st)) +# define sk_nid_triple_push(st, val) SKM_sk_push(nid_triple, (st), (val)) +# define sk_nid_triple_unshift(st, val) SKM_sk_unshift(nid_triple, (st), (val)) +# define sk_nid_triple_find(st, val) SKM_sk_find(nid_triple, (st), (val)) +# define sk_nid_triple_find_ex(st, val) SKM_sk_find_ex(nid_triple, (st), (val)) +# define sk_nid_triple_delete(st, i) SKM_sk_delete(nid_triple, (st), (i)) +# define sk_nid_triple_delete_ptr(st, ptr) SKM_sk_delete_ptr(nid_triple, (st), (ptr)) +# define sk_nid_triple_insert(st, val, i) SKM_sk_insert(nid_triple, (st), (val), (i)) +# define sk_nid_triple_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(nid_triple, (st), (cmp)) +# define sk_nid_triple_dup(st) SKM_sk_dup(nid_triple, st) +# define sk_nid_triple_pop_free(st, free_func) SKM_sk_pop_free(nid_triple, (st), (free_func)) +# define sk_nid_triple_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(nid_triple, (st), (copy_func), (free_func)) +# define sk_nid_triple_shift(st) SKM_sk_shift(nid_triple, (st)) +# define sk_nid_triple_pop(st) SKM_sk_pop(nid_triple, (st)) +# define sk_nid_triple_sort(st) SKM_sk_sort(nid_triple, (st)) +# define sk_nid_triple_is_sorted(st) SKM_sk_is_sorted(nid_triple, (st)) +# define sk_void_new(cmp) SKM_sk_new(void, (cmp)) +# define sk_void_new_null() SKM_sk_new_null(void) +# define sk_void_free(st) SKM_sk_free(void, (st)) +# define sk_void_num(st) SKM_sk_num(void, (st)) +# define sk_void_value(st, i) SKM_sk_value(void, (st), (i)) +# define sk_void_set(st, i, val) SKM_sk_set(void, (st), (i), (val)) +# define sk_void_zero(st) SKM_sk_zero(void, (st)) +# define sk_void_push(st, val) SKM_sk_push(void, (st), (val)) +# define sk_void_unshift(st, val) SKM_sk_unshift(void, (st), (val)) +# define sk_void_find(st, val) SKM_sk_find(void, (st), (val)) +# define sk_void_find_ex(st, val) SKM_sk_find_ex(void, (st), (val)) +# define sk_void_delete(st, i) SKM_sk_delete(void, (st), (i)) +# define sk_void_delete_ptr(st, ptr) SKM_sk_delete_ptr(void, (st), (ptr)) +# define sk_void_insert(st, val, i) SKM_sk_insert(void, (st), (val), (i)) +# define sk_void_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(void, (st), (cmp)) +# define sk_void_dup(st) SKM_sk_dup(void, st) +# define sk_void_pop_free(st, free_func) SKM_sk_pop_free(void, (st), (free_func)) +# define sk_void_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(void, (st), (copy_func), (free_func)) +# define sk_void_shift(st) SKM_sk_shift(void, (st)) +# define sk_void_pop(st) SKM_sk_pop(void, (st)) +# define sk_void_sort(st) SKM_sk_sort(void, (st)) +# define sk_void_is_sorted(st) SKM_sk_is_sorted(void, (st)) +# define sk_OPENSSL_STRING_new(cmp) ((STACK_OF(OPENSSL_STRING) *)sk_new(CHECKED_SK_CMP_FUNC(char, cmp))) +# define sk_OPENSSL_STRING_new_null() ((STACK_OF(OPENSSL_STRING) *)sk_new_null()) +# define sk_OPENSSL_STRING_push(st, val) sk_push(CHECKED_STACK_OF(OPENSSL_STRING, st), CHECKED_PTR_OF(char, val)) +# define sk_OPENSSL_STRING_find(st, val) sk_find(CHECKED_STACK_OF(OPENSSL_STRING, st), CHECKED_PTR_OF(char, val)) +# define sk_OPENSSL_STRING_value(st, i) ((OPENSSL_STRING)sk_value(CHECKED_STACK_OF(OPENSSL_STRING, st), i)) +# define sk_OPENSSL_STRING_num(st) SKM_sk_num(OPENSSL_STRING, st) +# define sk_OPENSSL_STRING_pop_free(st, free_func) sk_pop_free(CHECKED_STACK_OF(OPENSSL_STRING, st), CHECKED_SK_FREE_FUNC(char, free_func)) +# define sk_OPENSSL_STRING_deep_copy(st, copy_func, free_func) ((STACK_OF(OPENSSL_STRING) *)sk_deep_copy(CHECKED_STACK_OF(OPENSSL_STRING, st), CHECKED_SK_COPY_FUNC(char, copy_func), CHECKED_SK_FREE_FUNC(char, free_func))) +# define sk_OPENSSL_STRING_insert(st, val, i) sk_insert(CHECKED_STACK_OF(OPENSSL_STRING, st), CHECKED_PTR_OF(char, val), i) +# define sk_OPENSSL_STRING_free(st) SKM_sk_free(OPENSSL_STRING, st) +# define sk_OPENSSL_STRING_set(st, i, val) sk_set(CHECKED_STACK_OF(OPENSSL_STRING, st), i, CHECKED_PTR_OF(char, val)) +# define sk_OPENSSL_STRING_zero(st) SKM_sk_zero(OPENSSL_STRING, (st)) +# define sk_OPENSSL_STRING_unshift(st, val) sk_unshift(CHECKED_STACK_OF(OPENSSL_STRING, st), CHECKED_PTR_OF(char, val)) +# define sk_OPENSSL_STRING_find_ex(st, val) sk_find_ex((_STACK *)CHECKED_CONST_PTR_OF(STACK_OF(OPENSSL_STRING), st), CHECKED_CONST_PTR_OF(char, val)) +# define sk_OPENSSL_STRING_delete(st, i) SKM_sk_delete(OPENSSL_STRING, (st), (i)) +# define sk_OPENSSL_STRING_delete_ptr(st, ptr) (OPENSSL_STRING *)sk_delete_ptr(CHECKED_STACK_OF(OPENSSL_STRING, st), CHECKED_PTR_OF(char, ptr)) +# define sk_OPENSSL_STRING_set_cmp_func(st, cmp) \ + ((int (*)(const char * const *,const char * const *)) \ + sk_set_cmp_func(CHECKED_STACK_OF(OPENSSL_STRING, st), CHECKED_SK_CMP_FUNC(char, cmp))) +# define sk_OPENSSL_STRING_dup(st) SKM_sk_dup(OPENSSL_STRING, st) +# define sk_OPENSSL_STRING_shift(st) SKM_sk_shift(OPENSSL_STRING, (st)) +# define sk_OPENSSL_STRING_pop(st) (char *)sk_pop(CHECKED_STACK_OF(OPENSSL_STRING, st)) +# define sk_OPENSSL_STRING_sort(st) SKM_sk_sort(OPENSSL_STRING, (st)) +# define sk_OPENSSL_STRING_is_sorted(st) SKM_sk_is_sorted(OPENSSL_STRING, (st)) +# define sk_OPENSSL_BLOCK_new(cmp) ((STACK_OF(OPENSSL_BLOCK) *)sk_new(CHECKED_SK_CMP_FUNC(void, cmp))) +# define sk_OPENSSL_BLOCK_new_null() ((STACK_OF(OPENSSL_BLOCK) *)sk_new_null()) +# define sk_OPENSSL_BLOCK_push(st, val) sk_push(CHECKED_STACK_OF(OPENSSL_BLOCK, st), CHECKED_PTR_OF(void, val)) +# define sk_OPENSSL_BLOCK_find(st, val) sk_find(CHECKED_STACK_OF(OPENSSL_BLOCK, st), CHECKED_PTR_OF(void, val)) +# define sk_OPENSSL_BLOCK_value(st, i) ((OPENSSL_BLOCK)sk_value(CHECKED_STACK_OF(OPENSSL_BLOCK, st), i)) +# define sk_OPENSSL_BLOCK_num(st) SKM_sk_num(OPENSSL_BLOCK, st) +# define sk_OPENSSL_BLOCK_pop_free(st, free_func) sk_pop_free(CHECKED_STACK_OF(OPENSSL_BLOCK, st), CHECKED_SK_FREE_FUNC(void, free_func)) +# define sk_OPENSSL_BLOCK_deep_copy(st, copy_func, free_func) ((STACK_OF(OPENSSL_BLOCK) *)sk_deep_copy(CHECKED_STACK_OF(OPENSSL_BLOCK, st), CHECKED_SK_COPY_FUNC(void, copy_func), CHECKED_SK_FREE_FUNC(void, free_func))) +# define sk_OPENSSL_BLOCK_insert(st, val, i) sk_insert(CHECKED_STACK_OF(OPENSSL_BLOCK, st), CHECKED_PTR_OF(void, val), i) +# define sk_OPENSSL_BLOCK_free(st) SKM_sk_free(OPENSSL_BLOCK, st) +# define sk_OPENSSL_BLOCK_set(st, i, val) sk_set(CHECKED_STACK_OF(OPENSSL_BLOCK, st), i, CHECKED_PTR_OF(void, val)) +# define sk_OPENSSL_BLOCK_zero(st) SKM_sk_zero(OPENSSL_BLOCK, (st)) +# define sk_OPENSSL_BLOCK_unshift(st, val) sk_unshift(CHECKED_STACK_OF(OPENSSL_BLOCK, st), CHECKED_PTR_OF(void, val)) +# define sk_OPENSSL_BLOCK_find_ex(st, val) sk_find_ex((_STACK *)CHECKED_CONST_PTR_OF(STACK_OF(OPENSSL_BLOCK), st), CHECKED_CONST_PTR_OF(void, val)) +# define sk_OPENSSL_BLOCK_delete(st, i) SKM_sk_delete(OPENSSL_BLOCK, (st), (i)) +# define sk_OPENSSL_BLOCK_delete_ptr(st, ptr) (OPENSSL_BLOCK *)sk_delete_ptr(CHECKED_STACK_OF(OPENSSL_BLOCK, st), CHECKED_PTR_OF(void, ptr)) +# define sk_OPENSSL_BLOCK_set_cmp_func(st, cmp) \ + ((int (*)(const void * const *,const void * const *)) \ + sk_set_cmp_func(CHECKED_STACK_OF(OPENSSL_BLOCK, st), CHECKED_SK_CMP_FUNC(void, cmp))) +# define sk_OPENSSL_BLOCK_dup(st) SKM_sk_dup(OPENSSL_BLOCK, st) +# define sk_OPENSSL_BLOCK_shift(st) SKM_sk_shift(OPENSSL_BLOCK, (st)) +# define sk_OPENSSL_BLOCK_pop(st) (void *)sk_pop(CHECKED_STACK_OF(OPENSSL_BLOCK, st)) +# define sk_OPENSSL_BLOCK_sort(st) SKM_sk_sort(OPENSSL_BLOCK, (st)) +# define sk_OPENSSL_BLOCK_is_sorted(st) SKM_sk_is_sorted(OPENSSL_BLOCK, (st)) +# define sk_OPENSSL_PSTRING_new(cmp) ((STACK_OF(OPENSSL_PSTRING) *)sk_new(CHECKED_SK_CMP_FUNC(OPENSSL_STRING, cmp))) +# define sk_OPENSSL_PSTRING_new_null() ((STACK_OF(OPENSSL_PSTRING) *)sk_new_null()) +# define sk_OPENSSL_PSTRING_push(st, val) sk_push(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_PTR_OF(OPENSSL_STRING, val)) +# define sk_OPENSSL_PSTRING_find(st, val) sk_find(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_PTR_OF(OPENSSL_STRING, val)) +# define sk_OPENSSL_PSTRING_value(st, i) ((OPENSSL_PSTRING)sk_value(CHECKED_STACK_OF(OPENSSL_PSTRING, st), i)) +# define sk_OPENSSL_PSTRING_num(st) SKM_sk_num(OPENSSL_PSTRING, st) +# define sk_OPENSSL_PSTRING_pop_free(st, free_func) sk_pop_free(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_SK_FREE_FUNC(OPENSSL_STRING, free_func)) +# define sk_OPENSSL_PSTRING_deep_copy(st, copy_func, free_func) ((STACK_OF(OPENSSL_PSTRING) *)sk_deep_copy(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_SK_COPY_FUNC(OPENSSL_STRING, copy_func), CHECKED_SK_FREE_FUNC(OPENSSL_STRING, free_func))) +# define sk_OPENSSL_PSTRING_insert(st, val, i) sk_insert(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_PTR_OF(OPENSSL_STRING, val), i) +# define sk_OPENSSL_PSTRING_free(st) SKM_sk_free(OPENSSL_PSTRING, st) +# define sk_OPENSSL_PSTRING_set(st, i, val) sk_set(CHECKED_STACK_OF(OPENSSL_PSTRING, st), i, CHECKED_PTR_OF(OPENSSL_STRING, val)) +# define sk_OPENSSL_PSTRING_zero(st) SKM_sk_zero(OPENSSL_PSTRING, (st)) +# define sk_OPENSSL_PSTRING_unshift(st, val) sk_unshift(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_PTR_OF(OPENSSL_STRING, val)) +# define sk_OPENSSL_PSTRING_find_ex(st, val) sk_find_ex((_STACK *)CHECKED_CONST_PTR_OF(STACK_OF(OPENSSL_PSTRING), st), CHECKED_CONST_PTR_OF(OPENSSL_STRING, val)) +# define sk_OPENSSL_PSTRING_delete(st, i) SKM_sk_delete(OPENSSL_PSTRING, (st), (i)) +# define sk_OPENSSL_PSTRING_delete_ptr(st, ptr) (OPENSSL_PSTRING *)sk_delete_ptr(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_PTR_OF(OPENSSL_STRING, ptr)) +# define sk_OPENSSL_PSTRING_set_cmp_func(st, cmp) \ + ((int (*)(const OPENSSL_STRING * const *,const OPENSSL_STRING * const *)) \ + sk_set_cmp_func(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_SK_CMP_FUNC(OPENSSL_STRING, cmp))) +# define sk_OPENSSL_PSTRING_dup(st) SKM_sk_dup(OPENSSL_PSTRING, st) +# define sk_OPENSSL_PSTRING_shift(st) SKM_sk_shift(OPENSSL_PSTRING, (st)) +# define sk_OPENSSL_PSTRING_pop(st) (OPENSSL_STRING *)sk_pop(CHECKED_STACK_OF(OPENSSL_PSTRING, st)) +# define sk_OPENSSL_PSTRING_sort(st) SKM_sk_sort(OPENSSL_PSTRING, (st)) +# define sk_OPENSSL_PSTRING_is_sorted(st) SKM_sk_is_sorted(OPENSSL_PSTRING, (st)) +# define d2i_ASN1_SET_OF_ACCESS_DESCRIPTION(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(ACCESS_DESCRIPTION, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_ACCESS_DESCRIPTION(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(ACCESS_DESCRIPTION, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_ACCESS_DESCRIPTION(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(ACCESS_DESCRIPTION, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_ACCESS_DESCRIPTION(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(ACCESS_DESCRIPTION, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_ASN1_INTEGER(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(ASN1_INTEGER, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_ASN1_INTEGER(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(ASN1_INTEGER, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_ASN1_INTEGER(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(ASN1_INTEGER, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_ASN1_INTEGER(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(ASN1_INTEGER, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_ASN1_OBJECT(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(ASN1_OBJECT, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_ASN1_OBJECT(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(ASN1_OBJECT, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_ASN1_OBJECT(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(ASN1_OBJECT, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_ASN1_OBJECT(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(ASN1_OBJECT, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_ASN1_TYPE(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(ASN1_TYPE, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_ASN1_TYPE(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(ASN1_TYPE, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_ASN1_TYPE(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(ASN1_TYPE, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_ASN1_TYPE(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(ASN1_TYPE, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_ASN1_UTF8STRING(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(ASN1_UTF8STRING, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_ASN1_UTF8STRING(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(ASN1_UTF8STRING, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_ASN1_UTF8STRING(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(ASN1_UTF8STRING, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_ASN1_UTF8STRING(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(ASN1_UTF8STRING, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_DIST_POINT(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(DIST_POINT, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_DIST_POINT(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(DIST_POINT, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_DIST_POINT(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(DIST_POINT, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_DIST_POINT(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(DIST_POINT, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_ESS_CERT_ID(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(ESS_CERT_ID, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_ESS_CERT_ID(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(ESS_CERT_ID, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_ESS_CERT_ID(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(ESS_CERT_ID, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_ESS_CERT_ID(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(ESS_CERT_ID, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_EVP_MD(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(EVP_MD, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_EVP_MD(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(EVP_MD, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_EVP_MD(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(EVP_MD, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_EVP_MD(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(EVP_MD, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_GENERAL_NAME(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(GENERAL_NAME, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_GENERAL_NAME(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(GENERAL_NAME, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_GENERAL_NAME(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(GENERAL_NAME, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_GENERAL_NAME(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(GENERAL_NAME, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_OCSP_ONEREQ(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(OCSP_ONEREQ, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_OCSP_ONEREQ(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(OCSP_ONEREQ, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_OCSP_ONEREQ(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(OCSP_ONEREQ, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_OCSP_ONEREQ(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(OCSP_ONEREQ, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_OCSP_SINGLERESP(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(OCSP_SINGLERESP, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_OCSP_SINGLERESP(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(OCSP_SINGLERESP, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_OCSP_SINGLERESP(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(OCSP_SINGLERESP, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_OCSP_SINGLERESP(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(OCSP_SINGLERESP, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_PKCS12_SAFEBAG(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(PKCS12_SAFEBAG, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_PKCS12_SAFEBAG(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(PKCS12_SAFEBAG, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_PKCS12_SAFEBAG(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(PKCS12_SAFEBAG, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_PKCS12_SAFEBAG(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(PKCS12_SAFEBAG, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_PKCS7(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(PKCS7, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_PKCS7(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(PKCS7, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_PKCS7(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(PKCS7, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_PKCS7(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(PKCS7, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_PKCS7_RECIP_INFO(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(PKCS7_RECIP_INFO, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_PKCS7_RECIP_INFO(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(PKCS7_RECIP_INFO, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_PKCS7_RECIP_INFO(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(PKCS7_RECIP_INFO, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_PKCS7_RECIP_INFO(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(PKCS7_RECIP_INFO, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_PKCS7_SIGNER_INFO(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(PKCS7_SIGNER_INFO, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_PKCS7_SIGNER_INFO(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(PKCS7_SIGNER_INFO, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_PKCS7_SIGNER_INFO(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(PKCS7_SIGNER_INFO, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_PKCS7_SIGNER_INFO(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(PKCS7_SIGNER_INFO, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_POLICYINFO(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(POLICYINFO, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_POLICYINFO(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(POLICYINFO, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_POLICYINFO(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(POLICYINFO, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_POLICYINFO(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(POLICYINFO, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_POLICYQUALINFO(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(POLICYQUALINFO, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_POLICYQUALINFO(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(POLICYQUALINFO, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_POLICYQUALINFO(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(POLICYQUALINFO, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_POLICYQUALINFO(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(POLICYQUALINFO, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_SXNETID(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(SXNETID, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_SXNETID(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(SXNETID, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_SXNETID(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(SXNETID, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_SXNETID(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(SXNETID, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_X509(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(X509, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_X509(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(X509, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_X509(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(X509, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_X509(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(X509, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_X509_ALGOR(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(X509_ALGOR, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_X509_ALGOR(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(X509_ALGOR, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_X509_ALGOR(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(X509_ALGOR, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_X509_ALGOR(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(X509_ALGOR, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_X509_ATTRIBUTE(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(X509_ATTRIBUTE, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_X509_ATTRIBUTE(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(X509_ATTRIBUTE, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_X509_ATTRIBUTE(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(X509_ATTRIBUTE, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_X509_ATTRIBUTE(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(X509_ATTRIBUTE, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_X509_CRL(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(X509_CRL, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_X509_CRL(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(X509_CRL, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_X509_CRL(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(X509_CRL, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_X509_CRL(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(X509_CRL, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_X509_EXTENSION(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(X509_EXTENSION, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_X509_EXTENSION(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(X509_EXTENSION, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_X509_EXTENSION(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(X509_EXTENSION, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_X509_EXTENSION(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(X509_EXTENSION, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_X509_NAME_ENTRY(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(X509_NAME_ENTRY, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_X509_NAME_ENTRY(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(X509_NAME_ENTRY, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_X509_NAME_ENTRY(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(X509_NAME_ENTRY, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_X509_NAME_ENTRY(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(X509_NAME_ENTRY, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_X509_REVOKED(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(X509_REVOKED, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_X509_REVOKED(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(X509_REVOKED, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_X509_REVOKED(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(X509_REVOKED, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_X509_REVOKED(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(X509_REVOKED, (buf), (len), (d2i_func), (free_func)) +# define PKCS12_decrypt_d2i_PKCS12_SAFEBAG(algor, d2i_func, free_func, pass, passlen, oct, seq) \ + SKM_PKCS12_decrypt_d2i(PKCS12_SAFEBAG, (algor), (d2i_func), (free_func), (pass), (passlen), (oct), (seq)) +# define PKCS12_decrypt_d2i_PKCS7(algor, d2i_func, free_func, pass, passlen, oct, seq) \ + SKM_PKCS12_decrypt_d2i(PKCS7, (algor), (d2i_func), (free_func), (pass), (passlen), (oct), (seq)) +# define lh_ADDED_OBJ_new() LHM_lh_new(ADDED_OBJ,added_obj) +# define lh_ADDED_OBJ_insert(lh,inst) LHM_lh_insert(ADDED_OBJ,lh,inst) +# define lh_ADDED_OBJ_retrieve(lh,inst) LHM_lh_retrieve(ADDED_OBJ,lh,inst) +# define lh_ADDED_OBJ_delete(lh,inst) LHM_lh_delete(ADDED_OBJ,lh,inst) +# define lh_ADDED_OBJ_doall(lh,fn) LHM_lh_doall(ADDED_OBJ,lh,fn) +# define lh_ADDED_OBJ_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(ADDED_OBJ,lh,fn,arg_type,arg) +# define lh_ADDED_OBJ_error(lh) LHM_lh_error(ADDED_OBJ,lh) +# define lh_ADDED_OBJ_num_items(lh) LHM_lh_num_items(ADDED_OBJ,lh) +# define lh_ADDED_OBJ_down_load(lh) LHM_lh_down_load(ADDED_OBJ,lh) +# define lh_ADDED_OBJ_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(ADDED_OBJ,lh,out) +# define lh_ADDED_OBJ_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(ADDED_OBJ,lh,out) +# define lh_ADDED_OBJ_stats_bio(lh,out) \ + LHM_lh_stats_bio(ADDED_OBJ,lh,out) +# define lh_ADDED_OBJ_free(lh) LHM_lh_free(ADDED_OBJ,lh) +# define lh_APP_INFO_new() LHM_lh_new(APP_INFO,app_info) +# define lh_APP_INFO_insert(lh,inst) LHM_lh_insert(APP_INFO,lh,inst) +# define lh_APP_INFO_retrieve(lh,inst) LHM_lh_retrieve(APP_INFO,lh,inst) +# define lh_APP_INFO_delete(lh,inst) LHM_lh_delete(APP_INFO,lh,inst) +# define lh_APP_INFO_doall(lh,fn) LHM_lh_doall(APP_INFO,lh,fn) +# define lh_APP_INFO_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(APP_INFO,lh,fn,arg_type,arg) +# define lh_APP_INFO_error(lh) LHM_lh_error(APP_INFO,lh) +# define lh_APP_INFO_num_items(lh) LHM_lh_num_items(APP_INFO,lh) +# define lh_APP_INFO_down_load(lh) LHM_lh_down_load(APP_INFO,lh) +# define lh_APP_INFO_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(APP_INFO,lh,out) +# define lh_APP_INFO_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(APP_INFO,lh,out) +# define lh_APP_INFO_stats_bio(lh,out) \ + LHM_lh_stats_bio(APP_INFO,lh,out) +# define lh_APP_INFO_free(lh) LHM_lh_free(APP_INFO,lh) +# define lh_CONF_VALUE_new() LHM_lh_new(CONF_VALUE,conf_value) +# define lh_CONF_VALUE_insert(lh,inst) LHM_lh_insert(CONF_VALUE,lh,inst) +# define lh_CONF_VALUE_retrieve(lh,inst) LHM_lh_retrieve(CONF_VALUE,lh,inst) +# define lh_CONF_VALUE_delete(lh,inst) LHM_lh_delete(CONF_VALUE,lh,inst) +# define lh_CONF_VALUE_doall(lh,fn) LHM_lh_doall(CONF_VALUE,lh,fn) +# define lh_CONF_VALUE_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(CONF_VALUE,lh,fn,arg_type,arg) +# define lh_CONF_VALUE_error(lh) LHM_lh_error(CONF_VALUE,lh) +# define lh_CONF_VALUE_num_items(lh) LHM_lh_num_items(CONF_VALUE,lh) +# define lh_CONF_VALUE_down_load(lh) LHM_lh_down_load(CONF_VALUE,lh) +# define lh_CONF_VALUE_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(CONF_VALUE,lh,out) +# define lh_CONF_VALUE_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(CONF_VALUE,lh,out) +# define lh_CONF_VALUE_stats_bio(lh,out) \ + LHM_lh_stats_bio(CONF_VALUE,lh,out) +# define lh_CONF_VALUE_free(lh) LHM_lh_free(CONF_VALUE,lh) +# define lh_ENGINE_PILE_new() LHM_lh_new(ENGINE_PILE,engine_pile) +# define lh_ENGINE_PILE_insert(lh,inst) LHM_lh_insert(ENGINE_PILE,lh,inst) +# define lh_ENGINE_PILE_retrieve(lh,inst) LHM_lh_retrieve(ENGINE_PILE,lh,inst) +# define lh_ENGINE_PILE_delete(lh,inst) LHM_lh_delete(ENGINE_PILE,lh,inst) +# define lh_ENGINE_PILE_doall(lh,fn) LHM_lh_doall(ENGINE_PILE,lh,fn) +# define lh_ENGINE_PILE_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(ENGINE_PILE,lh,fn,arg_type,arg) +# define lh_ENGINE_PILE_error(lh) LHM_lh_error(ENGINE_PILE,lh) +# define lh_ENGINE_PILE_num_items(lh) LHM_lh_num_items(ENGINE_PILE,lh) +# define lh_ENGINE_PILE_down_load(lh) LHM_lh_down_load(ENGINE_PILE,lh) +# define lh_ENGINE_PILE_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(ENGINE_PILE,lh,out) +# define lh_ENGINE_PILE_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(ENGINE_PILE,lh,out) +# define lh_ENGINE_PILE_stats_bio(lh,out) \ + LHM_lh_stats_bio(ENGINE_PILE,lh,out) +# define lh_ENGINE_PILE_free(lh) LHM_lh_free(ENGINE_PILE,lh) +# define lh_ERR_STATE_new() LHM_lh_new(ERR_STATE,err_state) +# define lh_ERR_STATE_insert(lh,inst) LHM_lh_insert(ERR_STATE,lh,inst) +# define lh_ERR_STATE_retrieve(lh,inst) LHM_lh_retrieve(ERR_STATE,lh,inst) +# define lh_ERR_STATE_delete(lh,inst) LHM_lh_delete(ERR_STATE,lh,inst) +# define lh_ERR_STATE_doall(lh,fn) LHM_lh_doall(ERR_STATE,lh,fn) +# define lh_ERR_STATE_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(ERR_STATE,lh,fn,arg_type,arg) +# define lh_ERR_STATE_error(lh) LHM_lh_error(ERR_STATE,lh) +# define lh_ERR_STATE_num_items(lh) LHM_lh_num_items(ERR_STATE,lh) +# define lh_ERR_STATE_down_load(lh) LHM_lh_down_load(ERR_STATE,lh) +# define lh_ERR_STATE_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(ERR_STATE,lh,out) +# define lh_ERR_STATE_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(ERR_STATE,lh,out) +# define lh_ERR_STATE_stats_bio(lh,out) \ + LHM_lh_stats_bio(ERR_STATE,lh,out) +# define lh_ERR_STATE_free(lh) LHM_lh_free(ERR_STATE,lh) +# define lh_ERR_STRING_DATA_new() LHM_lh_new(ERR_STRING_DATA,err_string_data) +# define lh_ERR_STRING_DATA_insert(lh,inst) LHM_lh_insert(ERR_STRING_DATA,lh,inst) +# define lh_ERR_STRING_DATA_retrieve(lh,inst) LHM_lh_retrieve(ERR_STRING_DATA,lh,inst) +# define lh_ERR_STRING_DATA_delete(lh,inst) LHM_lh_delete(ERR_STRING_DATA,lh,inst) +# define lh_ERR_STRING_DATA_doall(lh,fn) LHM_lh_doall(ERR_STRING_DATA,lh,fn) +# define lh_ERR_STRING_DATA_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(ERR_STRING_DATA,lh,fn,arg_type,arg) +# define lh_ERR_STRING_DATA_error(lh) LHM_lh_error(ERR_STRING_DATA,lh) +# define lh_ERR_STRING_DATA_num_items(lh) LHM_lh_num_items(ERR_STRING_DATA,lh) +# define lh_ERR_STRING_DATA_down_load(lh) LHM_lh_down_load(ERR_STRING_DATA,lh) +# define lh_ERR_STRING_DATA_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(ERR_STRING_DATA,lh,out) +# define lh_ERR_STRING_DATA_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(ERR_STRING_DATA,lh,out) +# define lh_ERR_STRING_DATA_stats_bio(lh,out) \ + LHM_lh_stats_bio(ERR_STRING_DATA,lh,out) +# define lh_ERR_STRING_DATA_free(lh) LHM_lh_free(ERR_STRING_DATA,lh) +# define lh_EX_CLASS_ITEM_new() LHM_lh_new(EX_CLASS_ITEM,ex_class_item) +# define lh_EX_CLASS_ITEM_insert(lh,inst) LHM_lh_insert(EX_CLASS_ITEM,lh,inst) +# define lh_EX_CLASS_ITEM_retrieve(lh,inst) LHM_lh_retrieve(EX_CLASS_ITEM,lh,inst) +# define lh_EX_CLASS_ITEM_delete(lh,inst) LHM_lh_delete(EX_CLASS_ITEM,lh,inst) +# define lh_EX_CLASS_ITEM_doall(lh,fn) LHM_lh_doall(EX_CLASS_ITEM,lh,fn) +# define lh_EX_CLASS_ITEM_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(EX_CLASS_ITEM,lh,fn,arg_type,arg) +# define lh_EX_CLASS_ITEM_error(lh) LHM_lh_error(EX_CLASS_ITEM,lh) +# define lh_EX_CLASS_ITEM_num_items(lh) LHM_lh_num_items(EX_CLASS_ITEM,lh) +# define lh_EX_CLASS_ITEM_down_load(lh) LHM_lh_down_load(EX_CLASS_ITEM,lh) +# define lh_EX_CLASS_ITEM_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(EX_CLASS_ITEM,lh,out) +# define lh_EX_CLASS_ITEM_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(EX_CLASS_ITEM,lh,out) +# define lh_EX_CLASS_ITEM_stats_bio(lh,out) \ + LHM_lh_stats_bio(EX_CLASS_ITEM,lh,out) +# define lh_EX_CLASS_ITEM_free(lh) LHM_lh_free(EX_CLASS_ITEM,lh) +# define lh_FUNCTION_new() LHM_lh_new(FUNCTION,function) +# define lh_FUNCTION_insert(lh,inst) LHM_lh_insert(FUNCTION,lh,inst) +# define lh_FUNCTION_retrieve(lh,inst) LHM_lh_retrieve(FUNCTION,lh,inst) +# define lh_FUNCTION_delete(lh,inst) LHM_lh_delete(FUNCTION,lh,inst) +# define lh_FUNCTION_doall(lh,fn) LHM_lh_doall(FUNCTION,lh,fn) +# define lh_FUNCTION_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(FUNCTION,lh,fn,arg_type,arg) +# define lh_FUNCTION_error(lh) LHM_lh_error(FUNCTION,lh) +# define lh_FUNCTION_num_items(lh) LHM_lh_num_items(FUNCTION,lh) +# define lh_FUNCTION_down_load(lh) LHM_lh_down_load(FUNCTION,lh) +# define lh_FUNCTION_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(FUNCTION,lh,out) +# define lh_FUNCTION_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(FUNCTION,lh,out) +# define lh_FUNCTION_stats_bio(lh,out) \ + LHM_lh_stats_bio(FUNCTION,lh,out) +# define lh_FUNCTION_free(lh) LHM_lh_free(FUNCTION,lh) +# define lh_MEM_new() LHM_lh_new(MEM,mem) +# define lh_MEM_insert(lh,inst) LHM_lh_insert(MEM,lh,inst) +# define lh_MEM_retrieve(lh,inst) LHM_lh_retrieve(MEM,lh,inst) +# define lh_MEM_delete(lh,inst) LHM_lh_delete(MEM,lh,inst) +# define lh_MEM_doall(lh,fn) LHM_lh_doall(MEM,lh,fn) +# define lh_MEM_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(MEM,lh,fn,arg_type,arg) +# define lh_MEM_error(lh) LHM_lh_error(MEM,lh) +# define lh_MEM_num_items(lh) LHM_lh_num_items(MEM,lh) +# define lh_MEM_down_load(lh) LHM_lh_down_load(MEM,lh) +# define lh_MEM_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(MEM,lh,out) +# define lh_MEM_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(MEM,lh,out) +# define lh_MEM_stats_bio(lh,out) \ + LHM_lh_stats_bio(MEM,lh,out) +# define lh_MEM_free(lh) LHM_lh_free(MEM,lh) +# define lh_OBJ_NAME_new() LHM_lh_new(OBJ_NAME,obj_name) +# define lh_OBJ_NAME_insert(lh,inst) LHM_lh_insert(OBJ_NAME,lh,inst) +# define lh_OBJ_NAME_retrieve(lh,inst) LHM_lh_retrieve(OBJ_NAME,lh,inst) +# define lh_OBJ_NAME_delete(lh,inst) LHM_lh_delete(OBJ_NAME,lh,inst) +# define lh_OBJ_NAME_doall(lh,fn) LHM_lh_doall(OBJ_NAME,lh,fn) +# define lh_OBJ_NAME_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(OBJ_NAME,lh,fn,arg_type,arg) +# define lh_OBJ_NAME_error(lh) LHM_lh_error(OBJ_NAME,lh) +# define lh_OBJ_NAME_num_items(lh) LHM_lh_num_items(OBJ_NAME,lh) +# define lh_OBJ_NAME_down_load(lh) LHM_lh_down_load(OBJ_NAME,lh) +# define lh_OBJ_NAME_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(OBJ_NAME,lh,out) +# define lh_OBJ_NAME_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(OBJ_NAME,lh,out) +# define lh_OBJ_NAME_stats_bio(lh,out) \ + LHM_lh_stats_bio(OBJ_NAME,lh,out) +# define lh_OBJ_NAME_free(lh) LHM_lh_free(OBJ_NAME,lh) +# define lh_OPENSSL_CSTRING_new() LHM_lh_new(OPENSSL_CSTRING,openssl_cstring) +# define lh_OPENSSL_CSTRING_insert(lh,inst) LHM_lh_insert(OPENSSL_CSTRING,lh,inst) +# define lh_OPENSSL_CSTRING_retrieve(lh,inst) LHM_lh_retrieve(OPENSSL_CSTRING,lh,inst) +# define lh_OPENSSL_CSTRING_delete(lh,inst) LHM_lh_delete(OPENSSL_CSTRING,lh,inst) +# define lh_OPENSSL_CSTRING_doall(lh,fn) LHM_lh_doall(OPENSSL_CSTRING,lh,fn) +# define lh_OPENSSL_CSTRING_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(OPENSSL_CSTRING,lh,fn,arg_type,arg) +# define lh_OPENSSL_CSTRING_error(lh) LHM_lh_error(OPENSSL_CSTRING,lh) +# define lh_OPENSSL_CSTRING_num_items(lh) LHM_lh_num_items(OPENSSL_CSTRING,lh) +# define lh_OPENSSL_CSTRING_down_load(lh) LHM_lh_down_load(OPENSSL_CSTRING,lh) +# define lh_OPENSSL_CSTRING_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(OPENSSL_CSTRING,lh,out) +# define lh_OPENSSL_CSTRING_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(OPENSSL_CSTRING,lh,out) +# define lh_OPENSSL_CSTRING_stats_bio(lh,out) \ + LHM_lh_stats_bio(OPENSSL_CSTRING,lh,out) +# define lh_OPENSSL_CSTRING_free(lh) LHM_lh_free(OPENSSL_CSTRING,lh) +# define lh_OPENSSL_STRING_new() LHM_lh_new(OPENSSL_STRING,openssl_string) +# define lh_OPENSSL_STRING_insert(lh,inst) LHM_lh_insert(OPENSSL_STRING,lh,inst) +# define lh_OPENSSL_STRING_retrieve(lh,inst) LHM_lh_retrieve(OPENSSL_STRING,lh,inst) +# define lh_OPENSSL_STRING_delete(lh,inst) LHM_lh_delete(OPENSSL_STRING,lh,inst) +# define lh_OPENSSL_STRING_doall(lh,fn) LHM_lh_doall(OPENSSL_STRING,lh,fn) +# define lh_OPENSSL_STRING_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(OPENSSL_STRING,lh,fn,arg_type,arg) +# define lh_OPENSSL_STRING_error(lh) LHM_lh_error(OPENSSL_STRING,lh) +# define lh_OPENSSL_STRING_num_items(lh) LHM_lh_num_items(OPENSSL_STRING,lh) +# define lh_OPENSSL_STRING_down_load(lh) LHM_lh_down_load(OPENSSL_STRING,lh) +# define lh_OPENSSL_STRING_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(OPENSSL_STRING,lh,out) +# define lh_OPENSSL_STRING_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(OPENSSL_STRING,lh,out) +# define lh_OPENSSL_STRING_stats_bio(lh,out) \ + LHM_lh_stats_bio(OPENSSL_STRING,lh,out) +# define lh_OPENSSL_STRING_free(lh) LHM_lh_free(OPENSSL_STRING,lh) +# define lh_SSL_SESSION_new() LHM_lh_new(SSL_SESSION,ssl_session) +# define lh_SSL_SESSION_insert(lh,inst) LHM_lh_insert(SSL_SESSION,lh,inst) +# define lh_SSL_SESSION_retrieve(lh,inst) LHM_lh_retrieve(SSL_SESSION,lh,inst) +# define lh_SSL_SESSION_delete(lh,inst) LHM_lh_delete(SSL_SESSION,lh,inst) +# define lh_SSL_SESSION_doall(lh,fn) LHM_lh_doall(SSL_SESSION,lh,fn) +# define lh_SSL_SESSION_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(SSL_SESSION,lh,fn,arg_type,arg) +# define lh_SSL_SESSION_error(lh) LHM_lh_error(SSL_SESSION,lh) +# define lh_SSL_SESSION_num_items(lh) LHM_lh_num_items(SSL_SESSION,lh) +# define lh_SSL_SESSION_down_load(lh) LHM_lh_down_load(SSL_SESSION,lh) +# define lh_SSL_SESSION_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(SSL_SESSION,lh,out) +# define lh_SSL_SESSION_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(SSL_SESSION,lh,out) +# define lh_SSL_SESSION_stats_bio(lh,out) \ + LHM_lh_stats_bio(SSL_SESSION,lh,out) +# define lh_SSL_SESSION_free(lh) LHM_lh_free(SSL_SESSION,lh) +#ifdef __cplusplus +} +#endif +#endif /* !defined HEADER_SAFESTACK_H */ diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/seed.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/seed.h new file mode 100644 index 0000000..8cbf0d9 --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/seed.h @@ -0,0 +1,149 @@ +/* + * Copyright (c) 2007 KISA(Korea Information Security Agency). All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Neither the name of author nor the names of its contributors may + * be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY 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 + * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ +/* ==================================================================== + * Copyright (c) 1998-2007 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_SEED_H +# define HEADER_SEED_H + +# include +# include +# include + +# ifdef OPENSSL_NO_SEED +# error SEED is disabled. +# endif + +/* look whether we need 'long' to get 32 bits */ +# ifdef AES_LONG +# ifndef SEED_LONG +# define SEED_LONG 1 +# endif +# endif + +# if !defined(NO_SYS_TYPES_H) +# include +# endif + +# define SEED_BLOCK_SIZE 16 +# define SEED_KEY_LENGTH 16 + + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct seed_key_st { +# ifdef SEED_LONG + unsigned long data[32]; +# else + unsigned int data[32]; +# endif +} SEED_KEY_SCHEDULE; + +# ifdef OPENSSL_FIPS +void private_SEED_set_key(const unsigned char rawkey[SEED_KEY_LENGTH], + SEED_KEY_SCHEDULE *ks); +# endif +void SEED_set_key(const unsigned char rawkey[SEED_KEY_LENGTH], + SEED_KEY_SCHEDULE *ks); + +void SEED_encrypt(const unsigned char s[SEED_BLOCK_SIZE], + unsigned char d[SEED_BLOCK_SIZE], + const SEED_KEY_SCHEDULE *ks); +void SEED_decrypt(const unsigned char s[SEED_BLOCK_SIZE], + unsigned char d[SEED_BLOCK_SIZE], + const SEED_KEY_SCHEDULE *ks); + +void SEED_ecb_encrypt(const unsigned char *in, unsigned char *out, + const SEED_KEY_SCHEDULE *ks, int enc); +void SEED_cbc_encrypt(const unsigned char *in, unsigned char *out, size_t len, + const SEED_KEY_SCHEDULE *ks, + unsigned char ivec[SEED_BLOCK_SIZE], int enc); +void SEED_cfb128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const SEED_KEY_SCHEDULE *ks, + unsigned char ivec[SEED_BLOCK_SIZE], int *num, + int enc); +void SEED_ofb128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const SEED_KEY_SCHEDULE *ks, + unsigned char ivec[SEED_BLOCK_SIZE], int *num); + +#ifdef __cplusplus +} +#endif + +#endif /* HEADER_SEED_H */ diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/sha.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/sha.h new file mode 100644 index 0000000..e5169e4 --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/sha.h @@ -0,0 +1,214 @@ +/* crypto/sha/sha.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_SHA_H +# define HEADER_SHA_H + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# if defined(OPENSSL_NO_SHA) || (defined(OPENSSL_NO_SHA0) && defined(OPENSSL_NO_SHA1)) +# error SHA is disabled. +# endif + +# if defined(OPENSSL_FIPS) +# define FIPS_SHA_SIZE_T size_t +# endif + +/*- + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + * ! SHA_LONG has to be at least 32 bits wide. If it's wider, then ! + * ! SHA_LONG_LOG2 has to be defined along. ! + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + */ + +# if defined(__LP32__) +# define SHA_LONG unsigned long +# elif defined(OPENSSL_SYS_CRAY) || defined(__ILP64__) +# define SHA_LONG unsigned long +# define SHA_LONG_LOG2 3 +# else +# define SHA_LONG unsigned int +# endif + +# define SHA_LBLOCK 16 +# define SHA_CBLOCK (SHA_LBLOCK*4)/* SHA treats input data as a + * contiguous array of 32 bit wide + * big-endian values. */ +# define SHA_LAST_BLOCK (SHA_CBLOCK-8) +# define SHA_DIGEST_LENGTH 20 + +typedef struct SHAstate_st { + SHA_LONG h0, h1, h2, h3, h4; + SHA_LONG Nl, Nh; + SHA_LONG data[SHA_LBLOCK]; + unsigned int num; +} SHA_CTX; + +# ifndef OPENSSL_NO_SHA0 +# ifdef OPENSSL_FIPS +int private_SHA_Init(SHA_CTX *c); +# endif +int SHA_Init(SHA_CTX *c); +int SHA_Update(SHA_CTX *c, const void *data, size_t len); +int SHA_Final(unsigned char *md, SHA_CTX *c); +unsigned char *SHA(const unsigned char *d, size_t n, unsigned char *md); +void SHA_Transform(SHA_CTX *c, const unsigned char *data); +# endif +# ifndef OPENSSL_NO_SHA1 +# ifdef OPENSSL_FIPS +int private_SHA1_Init(SHA_CTX *c); +# endif +int SHA1_Init(SHA_CTX *c); +int SHA1_Update(SHA_CTX *c, const void *data, size_t len); +int SHA1_Final(unsigned char *md, SHA_CTX *c); +unsigned char *SHA1(const unsigned char *d, size_t n, unsigned char *md); +void SHA1_Transform(SHA_CTX *c, const unsigned char *data); +# endif + +# define SHA256_CBLOCK (SHA_LBLOCK*4)/* SHA-256 treats input data as a + * contiguous array of 32 bit wide + * big-endian values. */ +# define SHA224_DIGEST_LENGTH 28 +# define SHA256_DIGEST_LENGTH 32 + +typedef struct SHA256state_st { + SHA_LONG h[8]; + SHA_LONG Nl, Nh; + SHA_LONG data[SHA_LBLOCK]; + unsigned int num, md_len; +} SHA256_CTX; + +# ifndef OPENSSL_NO_SHA256 +# ifdef OPENSSL_FIPS +int private_SHA224_Init(SHA256_CTX *c); +int private_SHA256_Init(SHA256_CTX *c); +# endif +int SHA224_Init(SHA256_CTX *c); +int SHA224_Update(SHA256_CTX *c, const void *data, size_t len); +int SHA224_Final(unsigned char *md, SHA256_CTX *c); +unsigned char *SHA224(const unsigned char *d, size_t n, unsigned char *md); +int SHA256_Init(SHA256_CTX *c); +int SHA256_Update(SHA256_CTX *c, const void *data, size_t len); +int SHA256_Final(unsigned char *md, SHA256_CTX *c); +unsigned char *SHA256(const unsigned char *d, size_t n, unsigned char *md); +void SHA256_Transform(SHA256_CTX *c, const unsigned char *data); +# endif + +# define SHA384_DIGEST_LENGTH 48 +# define SHA512_DIGEST_LENGTH 64 + +# ifndef OPENSSL_NO_SHA512 +/* + * Unlike 32-bit digest algorithms, SHA-512 *relies* on SHA_LONG64 + * being exactly 64-bit wide. See Implementation Notes in sha512.c + * for further details. + */ +/* + * SHA-512 treats input data as a + * contiguous array of 64 bit + * wide big-endian values. + */ +# define SHA512_CBLOCK (SHA_LBLOCK*8) +# if (defined(_WIN32) || defined(_WIN64)) && !defined(__MINGW32__) +# define SHA_LONG64 unsigned __int64 +# define U64(C) C##UI64 +# elif defined(__arch64__) +# define SHA_LONG64 unsigned long +# define U64(C) C##UL +# else +# define SHA_LONG64 unsigned long long +# define U64(C) C##ULL +# endif + +typedef struct SHA512state_st { + SHA_LONG64 h[8]; + SHA_LONG64 Nl, Nh; + union { + SHA_LONG64 d[SHA_LBLOCK]; + unsigned char p[SHA512_CBLOCK]; + } u; + unsigned int num, md_len; +} SHA512_CTX; +# endif + +# ifndef OPENSSL_NO_SHA512 +# ifdef OPENSSL_FIPS +int private_SHA384_Init(SHA512_CTX *c); +int private_SHA512_Init(SHA512_CTX *c); +# endif +int SHA384_Init(SHA512_CTX *c); +int SHA384_Update(SHA512_CTX *c, const void *data, size_t len); +int SHA384_Final(unsigned char *md, SHA512_CTX *c); +unsigned char *SHA384(const unsigned char *d, size_t n, unsigned char *md); +int SHA512_Init(SHA512_CTX *c); +int SHA512_Update(SHA512_CTX *c, const void *data, size_t len); +int SHA512_Final(unsigned char *md, SHA512_CTX *c); +unsigned char *SHA512(const unsigned char *d, size_t n, unsigned char *md); +void SHA512_Transform(SHA512_CTX *c, const unsigned char *data); +# endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/srp.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/srp.h new file mode 100644 index 0000000..028892a --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/srp.h @@ -0,0 +1,179 @@ +/* crypto/srp/srp.h */ +/* + * Written by Christophe Renou (christophe.renou@edelweb.fr) with the + * precious help of Peter Sylvester (peter.sylvester@edelweb.fr) for the + * EdelKey project and contributed to the OpenSSL project 2004. + */ +/* ==================================================================== + * Copyright (c) 2004 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +#ifndef __SRP_H__ +# define __SRP_H__ + +# ifndef OPENSSL_NO_SRP + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# include +# include +# include + +typedef struct SRP_gN_cache_st { + char *b64_bn; + BIGNUM *bn; +} SRP_gN_cache; + + +DECLARE_STACK_OF(SRP_gN_cache) + +typedef struct SRP_user_pwd_st { + /* Owned by us. */ + char *id; + BIGNUM *s; + BIGNUM *v; + /* Not owned by us. */ + const BIGNUM *g; + const BIGNUM *N; + /* Owned by us. */ + char *info; +} SRP_user_pwd; + +DECLARE_STACK_OF(SRP_user_pwd) + +void SRP_user_pwd_free(SRP_user_pwd *user_pwd); + +typedef struct SRP_VBASE_st { + STACK_OF(SRP_user_pwd) *users_pwd; + STACK_OF(SRP_gN_cache) *gN_cache; +/* to simulate a user */ + char *seed_key; + BIGNUM *default_g; + BIGNUM *default_N; +} SRP_VBASE; + +/* + * Structure interne pour retenir les couples N et g + */ +typedef struct SRP_gN_st { + char *id; + BIGNUM *g; + BIGNUM *N; +} SRP_gN; + +DECLARE_STACK_OF(SRP_gN) + +SRP_VBASE *SRP_VBASE_new(char *seed_key); +int SRP_VBASE_free(SRP_VBASE *vb); +int SRP_VBASE_init(SRP_VBASE *vb, char *verifier_file); + +/* This method ignores the configured seed and fails for an unknown user. */ +SRP_user_pwd *SRP_VBASE_get_by_user(SRP_VBASE *vb, char *username); +/* NOTE: unlike in SRP_VBASE_get_by_user, caller owns the returned pointer.*/ +SRP_user_pwd *SRP_VBASE_get1_by_user(SRP_VBASE *vb, char *username); + +char *SRP_create_verifier(const char *user, const char *pass, char **salt, + char **verifier, const char *N, const char *g); +int SRP_create_verifier_BN(const char *user, const char *pass, BIGNUM **salt, + BIGNUM **verifier, BIGNUM *N, BIGNUM *g); + +# define SRP_NO_ERROR 0 +# define SRP_ERR_VBASE_INCOMPLETE_FILE 1 +# define SRP_ERR_VBASE_BN_LIB 2 +# define SRP_ERR_OPEN_FILE 3 +# define SRP_ERR_MEMORY 4 + +# define DB_srptype 0 +# define DB_srpverifier 1 +# define DB_srpsalt 2 +# define DB_srpid 3 +# define DB_srpgN 4 +# define DB_srpinfo 5 +# undef DB_NUMBER +# define DB_NUMBER 6 + +# define DB_SRP_INDEX 'I' +# define DB_SRP_VALID 'V' +# define DB_SRP_REVOKED 'R' +# define DB_SRP_MODIF 'v' + +/* see srp.c */ +char *SRP_check_known_gN_param(BIGNUM *g, BIGNUM *N); +SRP_gN *SRP_get_default_gN(const char *id); + +/* server side .... */ +BIGNUM *SRP_Calc_server_key(BIGNUM *A, BIGNUM *v, BIGNUM *u, BIGNUM *b, + BIGNUM *N); +BIGNUM *SRP_Calc_B(BIGNUM *b, BIGNUM *N, BIGNUM *g, BIGNUM *v); +int SRP_Verify_A_mod_N(BIGNUM *A, BIGNUM *N); +BIGNUM *SRP_Calc_u(BIGNUM *A, BIGNUM *B, BIGNUM *N); + +/* client side .... */ +BIGNUM *SRP_Calc_x(BIGNUM *s, const char *user, const char *pass); +BIGNUM *SRP_Calc_A(BIGNUM *a, BIGNUM *N, BIGNUM *g); +BIGNUM *SRP_Calc_client_key(BIGNUM *N, BIGNUM *B, BIGNUM *g, BIGNUM *x, + BIGNUM *a, BIGNUM *u); +int SRP_Verify_B_mod_N(BIGNUM *B, BIGNUM *N); + +# define SRP_MINIMAL_N 1024 + +#ifdef __cplusplus +} +#endif + +# endif +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/srtp.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/srtp.h new file mode 100644 index 0000000..2279c32 --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/srtp.h @@ -0,0 +1,147 @@ +/* ssl/srtp.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ +/* ==================================================================== + * Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +/* + * DTLS code by Eric Rescorla + * + * Copyright (C) 2006, Network Resonance, Inc. Copyright (C) 2011, RTFM, Inc. + */ + +#ifndef HEADER_D1_SRTP_H +# define HEADER_D1_SRTP_H + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# define SRTP_AES128_CM_SHA1_80 0x0001 +# define SRTP_AES128_CM_SHA1_32 0x0002 +# define SRTP_AES128_F8_SHA1_80 0x0003 +# define SRTP_AES128_F8_SHA1_32 0x0004 +# define SRTP_NULL_SHA1_80 0x0005 +# define SRTP_NULL_SHA1_32 0x0006 + +# ifndef OPENSSL_NO_SRTP + +int SSL_CTX_set_tlsext_use_srtp(SSL_CTX *ctx, const char *profiles); +int SSL_set_tlsext_use_srtp(SSL *ctx, const char *profiles); + +STACK_OF(SRTP_PROTECTION_PROFILE) *SSL_get_srtp_profiles(SSL *ssl); +SRTP_PROTECTION_PROFILE *SSL_get_selected_srtp_profile(SSL *s); + +# endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/ssl.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/ssl.h new file mode 100644 index 0000000..90aeb0c --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/ssl.h @@ -0,0 +1,3163 @@ +/* ssl/ssl.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ +/* ==================================================================== + * Copyright (c) 1998-2007 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * ECC cipher suite support in OpenSSL originally developed by + * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project. + */ +/* ==================================================================== + * Copyright 2005 Nokia. All rights reserved. + * + * The portions of the attached software ("Contribution") is developed by + * Nokia Corporation and is licensed pursuant to the OpenSSL open source + * license. + * + * The Contribution, originally written by Mika Kousa and Pasi Eronen of + * Nokia Corporation, consists of the "PSK" (Pre-Shared Key) ciphersuites + * support (see RFC 4279) to OpenSSL. + * + * No patent licenses or other rights except those expressly stated in + * the OpenSSL open source license shall be deemed granted or received + * expressly, by implication, estoppel, or otherwise. + * + * No assurances are provided by Nokia that the Contribution does not + * infringe the patent or other intellectual property rights of any third + * party or that the license provides you with all the necessary rights + * to make use of the Contribution. + * + * THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. IN + * ADDITION TO THE DISCLAIMERS INCLUDED IN THE LICENSE, NOKIA + * SPECIFICALLY DISCLAIMS ANY LIABILITY FOR CLAIMS BROUGHT BY YOU OR ANY + * OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS OR + * OTHERWISE. + */ + +#ifndef HEADER_SSL_H +# define HEADER_SSL_H + +# include + +# ifndef OPENSSL_NO_COMP +# include +# endif +# ifndef OPENSSL_NO_BIO +# include +# endif +# ifndef OPENSSL_NO_DEPRECATED +# ifndef OPENSSL_NO_X509 +# include +# endif +# include +# include +# include +# endif +# include +# include + +# include +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* SSLeay version number for ASN.1 encoding of the session information */ +/*- + * Version 0 - initial version + * Version 1 - added the optional peer certificate + */ +# define SSL_SESSION_ASN1_VERSION 0x0001 + +/* text strings for the ciphers */ +# define SSL_TXT_NULL_WITH_MD5 SSL2_TXT_NULL_WITH_MD5 +# define SSL_TXT_RC4_128_WITH_MD5 SSL2_TXT_RC4_128_WITH_MD5 +# define SSL_TXT_RC4_128_EXPORT40_WITH_MD5 SSL2_TXT_RC4_128_EXPORT40_WITH_MD5 +# define SSL_TXT_RC2_128_CBC_WITH_MD5 SSL2_TXT_RC2_128_CBC_WITH_MD5 +# define SSL_TXT_RC2_128_CBC_EXPORT40_WITH_MD5 SSL2_TXT_RC2_128_CBC_EXPORT40_WITH_MD5 +# define SSL_TXT_IDEA_128_CBC_WITH_MD5 SSL2_TXT_IDEA_128_CBC_WITH_MD5 +# define SSL_TXT_DES_64_CBC_WITH_MD5 SSL2_TXT_DES_64_CBC_WITH_MD5 +# define SSL_TXT_DES_64_CBC_WITH_SHA SSL2_TXT_DES_64_CBC_WITH_SHA +# define SSL_TXT_DES_192_EDE3_CBC_WITH_MD5 SSL2_TXT_DES_192_EDE3_CBC_WITH_MD5 +# define SSL_TXT_DES_192_EDE3_CBC_WITH_SHA SSL2_TXT_DES_192_EDE3_CBC_WITH_SHA + +/* + * VRS Additional Kerberos5 entries + */ +# define SSL_TXT_KRB5_DES_64_CBC_SHA SSL3_TXT_KRB5_DES_64_CBC_SHA +# define SSL_TXT_KRB5_DES_192_CBC3_SHA SSL3_TXT_KRB5_DES_192_CBC3_SHA +# define SSL_TXT_KRB5_RC4_128_SHA SSL3_TXT_KRB5_RC4_128_SHA +# define SSL_TXT_KRB5_IDEA_128_CBC_SHA SSL3_TXT_KRB5_IDEA_128_CBC_SHA +# define SSL_TXT_KRB5_DES_64_CBC_MD5 SSL3_TXT_KRB5_DES_64_CBC_MD5 +# define SSL_TXT_KRB5_DES_192_CBC3_MD5 SSL3_TXT_KRB5_DES_192_CBC3_MD5 +# define SSL_TXT_KRB5_RC4_128_MD5 SSL3_TXT_KRB5_RC4_128_MD5 +# define SSL_TXT_KRB5_IDEA_128_CBC_MD5 SSL3_TXT_KRB5_IDEA_128_CBC_MD5 + +# define SSL_TXT_KRB5_DES_40_CBC_SHA SSL3_TXT_KRB5_DES_40_CBC_SHA +# define SSL_TXT_KRB5_RC2_40_CBC_SHA SSL3_TXT_KRB5_RC2_40_CBC_SHA +# define SSL_TXT_KRB5_RC4_40_SHA SSL3_TXT_KRB5_RC4_40_SHA +# define SSL_TXT_KRB5_DES_40_CBC_MD5 SSL3_TXT_KRB5_DES_40_CBC_MD5 +# define SSL_TXT_KRB5_RC2_40_CBC_MD5 SSL3_TXT_KRB5_RC2_40_CBC_MD5 +# define SSL_TXT_KRB5_RC4_40_MD5 SSL3_TXT_KRB5_RC4_40_MD5 + +# define SSL_TXT_KRB5_DES_40_CBC_SHA SSL3_TXT_KRB5_DES_40_CBC_SHA +# define SSL_TXT_KRB5_DES_40_CBC_MD5 SSL3_TXT_KRB5_DES_40_CBC_MD5 +# define SSL_TXT_KRB5_DES_64_CBC_SHA SSL3_TXT_KRB5_DES_64_CBC_SHA +# define SSL_TXT_KRB5_DES_64_CBC_MD5 SSL3_TXT_KRB5_DES_64_CBC_MD5 +# define SSL_TXT_KRB5_DES_192_CBC3_SHA SSL3_TXT_KRB5_DES_192_CBC3_SHA +# define SSL_TXT_KRB5_DES_192_CBC3_MD5 SSL3_TXT_KRB5_DES_192_CBC3_MD5 +# define SSL_MAX_KRB5_PRINCIPAL_LENGTH 256 + +# define SSL_MAX_SSL_SESSION_ID_LENGTH 32 +# define SSL_MAX_SID_CTX_LENGTH 32 + +# define SSL_MIN_RSA_MODULUS_LENGTH_IN_BYTES (512/8) +# define SSL_MAX_KEY_ARG_LENGTH 8 +# define SSL_MAX_MASTER_KEY_LENGTH 48 + +/* These are used to specify which ciphers to use and not to use */ + +# define SSL_TXT_EXP40 "EXPORT40" +# define SSL_TXT_EXP56 "EXPORT56" +# define SSL_TXT_LOW "LOW" +# define SSL_TXT_MEDIUM "MEDIUM" +# define SSL_TXT_HIGH "HIGH" +# define SSL_TXT_FIPS "FIPS" + +# define SSL_TXT_kFZA "kFZA"/* unused! */ +# define SSL_TXT_aFZA "aFZA"/* unused! */ +# define SSL_TXT_eFZA "eFZA"/* unused! */ +# define SSL_TXT_FZA "FZA"/* unused! */ + +# define SSL_TXT_aNULL "aNULL" +# define SSL_TXT_eNULL "eNULL" +# define SSL_TXT_NULL "NULL" + +# define SSL_TXT_kRSA "kRSA" +# define SSL_TXT_kDHr "kDHr" +# define SSL_TXT_kDHd "kDHd" +# define SSL_TXT_kDH "kDH" +# define SSL_TXT_kEDH "kEDH" +# define SSL_TXT_kDHE "kDHE"/* alias for kEDH */ +# define SSL_TXT_kKRB5 "kKRB5" +# define SSL_TXT_kECDHr "kECDHr" +# define SSL_TXT_kECDHe "kECDHe" +# define SSL_TXT_kECDH "kECDH" +# define SSL_TXT_kEECDH "kEECDH" +# define SSL_TXT_kECDHE "kECDHE"/* alias for kEECDH */ +# define SSL_TXT_kPSK "kPSK" +# define SSL_TXT_kGOST "kGOST" +# define SSL_TXT_kSRP "kSRP" + +# define SSL_TXT_aRSA "aRSA" +# define SSL_TXT_aDSS "aDSS" +# define SSL_TXT_aDH "aDH" +# define SSL_TXT_aECDH "aECDH" +# define SSL_TXT_aKRB5 "aKRB5" +# define SSL_TXT_aECDSA "aECDSA" +# define SSL_TXT_aPSK "aPSK" +# define SSL_TXT_aGOST94 "aGOST94" +# define SSL_TXT_aGOST01 "aGOST01" +# define SSL_TXT_aGOST "aGOST" +# define SSL_TXT_aSRP "aSRP" + +# define SSL_TXT_DSS "DSS" +# define SSL_TXT_DH "DH" +# define SSL_TXT_EDH "EDH"/* same as "kEDH:-ADH" */ +# define SSL_TXT_DHE "DHE"/* alias for EDH */ +# define SSL_TXT_ADH "ADH" +# define SSL_TXT_RSA "RSA" +# define SSL_TXT_ECDH "ECDH" +# define SSL_TXT_EECDH "EECDH"/* same as "kEECDH:-AECDH" */ +# define SSL_TXT_ECDHE "ECDHE"/* alias for ECDHE" */ +# define SSL_TXT_AECDH "AECDH" +# define SSL_TXT_ECDSA "ECDSA" +# define SSL_TXT_KRB5 "KRB5" +# define SSL_TXT_PSK "PSK" +# define SSL_TXT_SRP "SRP" + +# define SSL_TXT_DES "DES" +# define SSL_TXT_3DES "3DES" +# define SSL_TXT_RC4 "RC4" +# define SSL_TXT_RC2 "RC2" +# define SSL_TXT_IDEA "IDEA" +# define SSL_TXT_SEED "SEED" +# define SSL_TXT_AES128 "AES128" +# define SSL_TXT_AES256 "AES256" +# define SSL_TXT_AES "AES" +# define SSL_TXT_AES_GCM "AESGCM" +# define SSL_TXT_CAMELLIA128 "CAMELLIA128" +# define SSL_TXT_CAMELLIA256 "CAMELLIA256" +# define SSL_TXT_CAMELLIA "CAMELLIA" + +# define SSL_TXT_MD5 "MD5" +# define SSL_TXT_SHA1 "SHA1" +# define SSL_TXT_SHA "SHA"/* same as "SHA1" */ +# define SSL_TXT_GOST94 "GOST94" +# define SSL_TXT_GOST89MAC "GOST89MAC" +# define SSL_TXT_SHA256 "SHA256" +# define SSL_TXT_SHA384 "SHA384" + +# define SSL_TXT_SSLV2 "SSLv2" +# define SSL_TXT_SSLV3 "SSLv3" +# define SSL_TXT_TLSV1 "TLSv1" +# define SSL_TXT_TLSV1_1 "TLSv1.1" +# define SSL_TXT_TLSV1_2 "TLSv1.2" + +# define SSL_TXT_EXP "EXP" +# define SSL_TXT_EXPORT "EXPORT" + +# define SSL_TXT_ALL "ALL" + +/*- + * COMPLEMENTOF* definitions. These identifiers are used to (de-select) + * ciphers normally not being used. + * Example: "RC4" will activate all ciphers using RC4 including ciphers + * without authentication, which would normally disabled by DEFAULT (due + * the "!ADH" being part of default). Therefore "RC4:!COMPLEMENTOFDEFAULT" + * will make sure that it is also disabled in the specific selection. + * COMPLEMENTOF* identifiers are portable between version, as adjustments + * to the default cipher setup will also be included here. + * + * COMPLEMENTOFDEFAULT does not experience the same special treatment that + * DEFAULT gets, as only selection is being done and no sorting as needed + * for DEFAULT. + */ +# define SSL_TXT_CMPALL "COMPLEMENTOFALL" +# define SSL_TXT_CMPDEF "COMPLEMENTOFDEFAULT" + +/* + * The following cipher list is used by default. It also is substituted when + * an application-defined cipher list string starts with 'DEFAULT'. + */ +# define SSL_DEFAULT_CIPHER_LIST "ALL:!EXPORT:!LOW:!aNULL:!eNULL:!SSLv2" +/* + * As of OpenSSL 1.0.0, ssl_create_cipher_list() in ssl/ssl_ciph.c always + * starts with a reasonable order, and all we have to do for DEFAULT is + * throwing out anonymous and unencrypted ciphersuites! (The latter are not + * actually enabled by ALL, but "ALL:RSA" would enable some of them.) + */ + +/* Used in SSL_set_shutdown()/SSL_get_shutdown(); */ +# define SSL_SENT_SHUTDOWN 1 +# define SSL_RECEIVED_SHUTDOWN 2 + +#ifdef __cplusplus +} +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +# if (defined(OPENSSL_NO_RSA) || defined(OPENSSL_NO_MD5)) && !defined(OPENSSL_NO_SSL2) +# define OPENSSL_NO_SSL2 +# endif + +# define SSL_FILETYPE_ASN1 X509_FILETYPE_ASN1 +# define SSL_FILETYPE_PEM X509_FILETYPE_PEM + +/* + * This is needed to stop compilers complaining about the 'struct ssl_st *' + * function parameters used to prototype callbacks in SSL_CTX. + */ +typedef struct ssl_st *ssl_crock_st; +typedef struct tls_session_ticket_ext_st TLS_SESSION_TICKET_EXT; +typedef struct ssl_method_st SSL_METHOD; +typedef struct ssl_cipher_st SSL_CIPHER; +typedef struct ssl_session_st SSL_SESSION; +typedef struct tls_sigalgs_st TLS_SIGALGS; +typedef struct ssl_conf_ctx_st SSL_CONF_CTX; + +DECLARE_STACK_OF(SSL_CIPHER) + +/* SRTP protection profiles for use with the use_srtp extension (RFC 5764)*/ +typedef struct srtp_protection_profile_st { + const char *name; + unsigned long id; +} SRTP_PROTECTION_PROFILE; + +DECLARE_STACK_OF(SRTP_PROTECTION_PROFILE) + +typedef int (*tls_session_ticket_ext_cb_fn) (SSL *s, + const unsigned char *data, + int len, void *arg); +typedef int (*tls_session_secret_cb_fn) (SSL *s, void *secret, + int *secret_len, + STACK_OF(SSL_CIPHER) *peer_ciphers, + SSL_CIPHER **cipher, void *arg); + +# ifndef OPENSSL_NO_TLSEXT + +/* Typedefs for handling custom extensions */ + +typedef int (*custom_ext_add_cb) (SSL *s, unsigned int ext_type, + const unsigned char **out, + size_t *outlen, int *al, void *add_arg); + +typedef void (*custom_ext_free_cb) (SSL *s, unsigned int ext_type, + const unsigned char *out, void *add_arg); + +typedef int (*custom_ext_parse_cb) (SSL *s, unsigned int ext_type, + const unsigned char *in, + size_t inlen, int *al, void *parse_arg); + +# endif + +# ifndef OPENSSL_NO_SSL_INTERN + +/* used to hold info on the particular ciphers used */ +struct ssl_cipher_st { + int valid; + const char *name; /* text name */ + unsigned long id; /* id, 4 bytes, first is version */ + /* + * changed in 0.9.9: these four used to be portions of a single value + * 'algorithms' + */ + unsigned long algorithm_mkey; /* key exchange algorithm */ + unsigned long algorithm_auth; /* server authentication */ + unsigned long algorithm_enc; /* symmetric encryption */ + unsigned long algorithm_mac; /* symmetric authentication */ + unsigned long algorithm_ssl; /* (major) protocol version */ + unsigned long algo_strength; /* strength and export flags */ + unsigned long algorithm2; /* Extra flags */ + int strength_bits; /* Number of bits really used */ + int alg_bits; /* Number of bits for algorithm */ +}; + +/* Used to hold functions for SSLv2 or SSLv3/TLSv1 functions */ +struct ssl_method_st { + int version; + int (*ssl_new) (SSL *s); + void (*ssl_clear) (SSL *s); + void (*ssl_free) (SSL *s); + int (*ssl_accept) (SSL *s); + int (*ssl_connect) (SSL *s); + int (*ssl_read) (SSL *s, void *buf, int len); + int (*ssl_peek) (SSL *s, void *buf, int len); + int (*ssl_write) (SSL *s, const void *buf, int len); + int (*ssl_shutdown) (SSL *s); + int (*ssl_renegotiate) (SSL *s); + int (*ssl_renegotiate_check) (SSL *s); + long (*ssl_get_message) (SSL *s, int st1, int stn, int mt, long + max, int *ok); + int (*ssl_read_bytes) (SSL *s, int type, unsigned char *buf, int len, + int peek); + int (*ssl_write_bytes) (SSL *s, int type, const void *buf_, int len); + int (*ssl_dispatch_alert) (SSL *s); + long (*ssl_ctrl) (SSL *s, int cmd, long larg, void *parg); + long (*ssl_ctx_ctrl) (SSL_CTX *ctx, int cmd, long larg, void *parg); + const SSL_CIPHER *(*get_cipher_by_char) (const unsigned char *ptr); + int (*put_cipher_by_char) (const SSL_CIPHER *cipher, unsigned char *ptr); + int (*ssl_pending) (const SSL *s); + int (*num_ciphers) (void); + const SSL_CIPHER *(*get_cipher) (unsigned ncipher); + const struct ssl_method_st *(*get_ssl_method) (int version); + long (*get_timeout) (void); + struct ssl3_enc_method *ssl3_enc; /* Extra SSLv3/TLS stuff */ + int (*ssl_version) (void); + long (*ssl_callback_ctrl) (SSL *s, int cb_id, void (*fp) (void)); + long (*ssl_ctx_callback_ctrl) (SSL_CTX *s, int cb_id, void (*fp) (void)); +}; + +/*- + * Lets make this into an ASN.1 type structure as follows + * SSL_SESSION_ID ::= SEQUENCE { + * version INTEGER, -- structure version number + * SSLversion INTEGER, -- SSL version number + * Cipher OCTET STRING, -- the 3 byte cipher ID + * Session_ID OCTET STRING, -- the Session ID + * Master_key OCTET STRING, -- the master key + * KRB5_principal OCTET STRING -- optional Kerberos principal + * Key_Arg [ 0 ] IMPLICIT OCTET STRING, -- the optional Key argument + * Time [ 1 ] EXPLICIT INTEGER, -- optional Start Time + * Timeout [ 2 ] EXPLICIT INTEGER, -- optional Timeout ins seconds + * Peer [ 3 ] EXPLICIT X509, -- optional Peer Certificate + * Session_ID_context [ 4 ] EXPLICIT OCTET STRING, -- the Session ID context + * Verify_result [ 5 ] EXPLICIT INTEGER, -- X509_V_... code for `Peer' + * HostName [ 6 ] EXPLICIT OCTET STRING, -- optional HostName from servername TLS extension + * PSK_identity_hint [ 7 ] EXPLICIT OCTET STRING, -- optional PSK identity hint + * PSK_identity [ 8 ] EXPLICIT OCTET STRING, -- optional PSK identity + * Ticket_lifetime_hint [9] EXPLICIT INTEGER, -- server's lifetime hint for session ticket + * Ticket [10] EXPLICIT OCTET STRING, -- session ticket (clients only) + * Compression_meth [11] EXPLICIT OCTET STRING, -- optional compression method + * SRP_username [ 12 ] EXPLICIT OCTET STRING -- optional SRP username + * } + * Look in ssl/ssl_asn1.c for more details + * I'm using EXPLICIT tags so I can read the damn things using asn1parse :-). + */ +struct ssl_session_st { + int ssl_version; /* what ssl version session info is being + * kept in here? */ + /* only really used in SSLv2 */ + unsigned int key_arg_length; + unsigned char key_arg[SSL_MAX_KEY_ARG_LENGTH]; + int master_key_length; + unsigned char master_key[SSL_MAX_MASTER_KEY_LENGTH]; + /* session_id - valid? */ + unsigned int session_id_length; + unsigned char session_id[SSL_MAX_SSL_SESSION_ID_LENGTH]; + /* + * this is used to determine whether the session is being reused in the + * appropriate context. It is up to the application to set this, via + * SSL_new + */ + unsigned int sid_ctx_length; + unsigned char sid_ctx[SSL_MAX_SID_CTX_LENGTH]; +# ifndef OPENSSL_NO_KRB5 + unsigned int krb5_client_princ_len; + unsigned char krb5_client_princ[SSL_MAX_KRB5_PRINCIPAL_LENGTH]; +# endif /* OPENSSL_NO_KRB5 */ +# ifndef OPENSSL_NO_PSK + char *psk_identity_hint; + char *psk_identity; +# endif + /* + * Used to indicate that session resumption is not allowed. Applications + * can also set this bit for a new session via not_resumable_session_cb + * to disable session caching and tickets. + */ + int not_resumable; + /* The cert is the certificate used to establish this connection */ + struct sess_cert_st /* SESS_CERT */ *sess_cert; + /* + * This is the cert for the other end. On clients, it will be the same as + * sess_cert->peer_key->x509 (the latter is not enough as sess_cert is + * not retained in the external representation of sessions, see + * ssl_asn1.c). + */ + X509 *peer; + /* + * when app_verify_callback accepts a session where the peer's + * certificate is not ok, we must remember the error for session reuse: + */ + long verify_result; /* only for servers */ + int references; + long timeout; + long time; + unsigned int compress_meth; /* Need to lookup the method */ + const SSL_CIPHER *cipher; + unsigned long cipher_id; /* when ASN.1 loaded, this needs to be used + * to load the 'cipher' structure */ + STACK_OF(SSL_CIPHER) *ciphers; /* shared ciphers? */ + CRYPTO_EX_DATA ex_data; /* application specific data */ + /* + * These are used to make removal of session-ids more efficient and to + * implement a maximum cache size. + */ + struct ssl_session_st *prev, *next; +# ifndef OPENSSL_NO_TLSEXT + char *tlsext_hostname; +# ifndef OPENSSL_NO_EC + size_t tlsext_ecpointformatlist_length; + unsigned char *tlsext_ecpointformatlist; /* peer's list */ + size_t tlsext_ellipticcurvelist_length; + unsigned char *tlsext_ellipticcurvelist; /* peer's list */ +# endif /* OPENSSL_NO_EC */ + /* RFC4507 info */ + unsigned char *tlsext_tick; /* Session ticket */ + size_t tlsext_ticklen; /* Session ticket length */ + long tlsext_tick_lifetime_hint; /* Session lifetime hint in seconds */ +# endif +# ifndef OPENSSL_NO_SRP + char *srp_username; +# endif +}; + +# endif + +# define SSL_OP_MICROSOFT_SESS_ID_BUG 0x00000001L +# define SSL_OP_NETSCAPE_CHALLENGE_BUG 0x00000002L +/* Allow initial connection to servers that don't support RI */ +# define SSL_OP_LEGACY_SERVER_CONNECT 0x00000004L +# define SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG 0x00000008L +# define SSL_OP_TLSEXT_PADDING 0x00000010L +# define SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER 0x00000020L +# define SSL_OP_SAFARI_ECDHE_ECDSA_BUG 0x00000040L +# define SSL_OP_SSLEAY_080_CLIENT_DH_BUG 0x00000080L +# define SSL_OP_TLS_D5_BUG 0x00000100L +# define SSL_OP_TLS_BLOCK_PADDING_BUG 0x00000200L + +/* Hasn't done anything since OpenSSL 0.9.7h, retained for compatibility */ +# define SSL_OP_MSIE_SSLV2_RSA_PADDING 0x0 +/* Refers to ancient SSLREF and SSLv2, retained for compatibility */ +# define SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG 0x0 + +/* + * Disable SSL 3.0/TLS 1.0 CBC vulnerability workaround that was added in + * OpenSSL 0.9.6d. Usually (depending on the application protocol) the + * workaround is not needed. Unfortunately some broken SSL/TLS + * implementations cannot handle it at all, which is why we include it in + * SSL_OP_ALL. + */ +/* added in 0.9.6e */ +# define SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS 0x00000800L + +/* + * SSL_OP_ALL: various bug workarounds that should be rather harmless. This + * used to be 0x000FFFFFL before 0.9.7. + */ +# define SSL_OP_ALL 0x80000BFFL + +/* DTLS options */ +# define SSL_OP_NO_QUERY_MTU 0x00001000L +/* Turn on Cookie Exchange (on relevant for servers) */ +# define SSL_OP_COOKIE_EXCHANGE 0x00002000L +/* Don't use RFC4507 ticket extension */ +# define SSL_OP_NO_TICKET 0x00004000L +/* Use Cisco's "speshul" version of DTLS_BAD_VER (as client) */ +# define SSL_OP_CISCO_ANYCONNECT 0x00008000L + +/* As server, disallow session resumption on renegotiation */ +# define SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION 0x00010000L +/* Don't use compression even if supported */ +# define SSL_OP_NO_COMPRESSION 0x00020000L +/* Permit unsafe legacy renegotiation */ +# define SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION 0x00040000L +/* If set, always create a new key when using tmp_ecdh parameters */ +# define SSL_OP_SINGLE_ECDH_USE 0x00080000L +/* Does nothing: retained for compatibility */ +# define SSL_OP_SINGLE_DH_USE 0x00100000L +/* Does nothing: retained for compatibiity */ +# define SSL_OP_EPHEMERAL_RSA 0x0 +/* + * Set on servers to choose the cipher according to the server's preferences + */ +# define SSL_OP_CIPHER_SERVER_PREFERENCE 0x00400000L +/* + * If set, a server will allow a client to issue a SSLv3.0 version number as + * latest version supported in the premaster secret, even when TLSv1.0 + * (version 3.1) was announced in the client hello. Normally this is + * forbidden to prevent version rollback attacks. + */ +# define SSL_OP_TLS_ROLLBACK_BUG 0x00800000L + +# define SSL_OP_NO_SSLv2 0x01000000L +# define SSL_OP_NO_SSLv3 0x02000000L +# define SSL_OP_NO_TLSv1 0x04000000L +# define SSL_OP_NO_TLSv1_2 0x08000000L +# define SSL_OP_NO_TLSv1_1 0x10000000L + +# define SSL_OP_NO_DTLSv1 0x04000000L +# define SSL_OP_NO_DTLSv1_2 0x08000000L + +# define SSL_OP_NO_SSL_MASK (SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3|\ + SSL_OP_NO_TLSv1|SSL_OP_NO_TLSv1_1|SSL_OP_NO_TLSv1_2) + +/* + * These next two were never actually used for anything since SSLeay zap so + * we have some more flags. + */ +/* + * The next flag deliberately changes the ciphertest, this is a check for the + * PKCS#1 attack + */ +# define SSL_OP_PKCS1_CHECK_1 0x0 +# define SSL_OP_PKCS1_CHECK_2 0x0 + +# define SSL_OP_NETSCAPE_CA_DN_BUG 0x20000000L +# define SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG 0x40000000L +/* + * Make server add server-hello extension from early version of cryptopro + * draft, when GOST ciphersuite is negotiated. Required for interoperability + * with CryptoPro CSP 3.x + */ +# define SSL_OP_CRYPTOPRO_TLSEXT_BUG 0x80000000L + +/* + * Allow SSL_write(..., n) to return r with 0 < r < n (i.e. report success + * when just a single record has been written): + */ +# define SSL_MODE_ENABLE_PARTIAL_WRITE 0x00000001L +/* + * Make it possible to retry SSL_write() with changed buffer location (buffer + * contents must stay the same!); this is not the default to avoid the + * misconception that non-blocking SSL_write() behaves like non-blocking + * write(): + */ +# define SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER 0x00000002L +/* + * Never bother the application with retries if the transport is blocking: + */ +# define SSL_MODE_AUTO_RETRY 0x00000004L +/* Don't attempt to automatically build certificate chain */ +# define SSL_MODE_NO_AUTO_CHAIN 0x00000008L +/* + * Save RAM by releasing read and write buffers when they're empty. (SSL3 and + * TLS only.) "Released" buffers are put onto a free-list in the context or + * just freed (depending on the context's setting for freelist_max_len). + */ +# define SSL_MODE_RELEASE_BUFFERS 0x00000010L +/* + * Send the current time in the Random fields of the ClientHello and + * ServerHello records for compatibility with hypothetical implementations + * that require it. + */ +# define SSL_MODE_SEND_CLIENTHELLO_TIME 0x00000020L +# define SSL_MODE_SEND_SERVERHELLO_TIME 0x00000040L +/* + * Send TLS_FALLBACK_SCSV in the ClientHello. To be set only by applications + * that reconnect with a downgraded protocol version; see + * draft-ietf-tls-downgrade-scsv-00 for details. DO NOT ENABLE THIS if your + * application attempts a normal handshake. Only use this in explicit + * fallback retries, following the guidance in + * draft-ietf-tls-downgrade-scsv-00. + */ +# define SSL_MODE_SEND_FALLBACK_SCSV 0x00000080L + +/* Cert related flags */ +/* + * Many implementations ignore some aspects of the TLS standards such as + * enforcing certifcate chain algorithms. When this is set we enforce them. + */ +# define SSL_CERT_FLAG_TLS_STRICT 0x00000001L + +/* Suite B modes, takes same values as certificate verify flags */ +# define SSL_CERT_FLAG_SUITEB_128_LOS_ONLY 0x10000 +/* Suite B 192 bit only mode */ +# define SSL_CERT_FLAG_SUITEB_192_LOS 0x20000 +/* Suite B 128 bit mode allowing 192 bit algorithms */ +# define SSL_CERT_FLAG_SUITEB_128_LOS 0x30000 + +/* Perform all sorts of protocol violations for testing purposes */ +# define SSL_CERT_FLAG_BROKEN_PROTOCOL 0x10000000 + +/* Flags for building certificate chains */ +/* Treat any existing certificates as untrusted CAs */ +# define SSL_BUILD_CHAIN_FLAG_UNTRUSTED 0x1 +/* Don't include root CA in chain */ +# define SSL_BUILD_CHAIN_FLAG_NO_ROOT 0x2 +/* Just check certificates already there */ +# define SSL_BUILD_CHAIN_FLAG_CHECK 0x4 +/* Ignore verification errors */ +# define SSL_BUILD_CHAIN_FLAG_IGNORE_ERROR 0x8 +/* Clear verification errors from queue */ +# define SSL_BUILD_CHAIN_FLAG_CLEAR_ERROR 0x10 + +/* Flags returned by SSL_check_chain */ +/* Certificate can be used with this session */ +# define CERT_PKEY_VALID 0x1 +/* Certificate can also be used for signing */ +# define CERT_PKEY_SIGN 0x2 +/* EE certificate signing algorithm OK */ +# define CERT_PKEY_EE_SIGNATURE 0x10 +/* CA signature algorithms OK */ +# define CERT_PKEY_CA_SIGNATURE 0x20 +/* EE certificate parameters OK */ +# define CERT_PKEY_EE_PARAM 0x40 +/* CA certificate parameters OK */ +# define CERT_PKEY_CA_PARAM 0x80 +/* Signing explicitly allowed as opposed to SHA1 fallback */ +# define CERT_PKEY_EXPLICIT_SIGN 0x100 +/* Client CA issuer names match (always set for server cert) */ +# define CERT_PKEY_ISSUER_NAME 0x200 +/* Cert type matches client types (always set for server cert) */ +# define CERT_PKEY_CERT_TYPE 0x400 +/* Cert chain suitable to Suite B */ +# define CERT_PKEY_SUITEB 0x800 + +# define SSL_CONF_FLAG_CMDLINE 0x1 +# define SSL_CONF_FLAG_FILE 0x2 +# define SSL_CONF_FLAG_CLIENT 0x4 +# define SSL_CONF_FLAG_SERVER 0x8 +# define SSL_CONF_FLAG_SHOW_ERRORS 0x10 +# define SSL_CONF_FLAG_CERTIFICATE 0x20 +/* Configuration value types */ +# define SSL_CONF_TYPE_UNKNOWN 0x0 +# define SSL_CONF_TYPE_STRING 0x1 +# define SSL_CONF_TYPE_FILE 0x2 +# define SSL_CONF_TYPE_DIR 0x3 + +/* + * Note: SSL[_CTX]_set_{options,mode} use |= op on the previous value, they + * cannot be used to clear bits. + */ + +# define SSL_CTX_set_options(ctx,op) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_OPTIONS,(op),NULL) +# define SSL_CTX_clear_options(ctx,op) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_CLEAR_OPTIONS,(op),NULL) +# define SSL_CTX_get_options(ctx) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_OPTIONS,0,NULL) +# define SSL_set_options(ssl,op) \ + SSL_ctrl((ssl),SSL_CTRL_OPTIONS,(op),NULL) +# define SSL_clear_options(ssl,op) \ + SSL_ctrl((ssl),SSL_CTRL_CLEAR_OPTIONS,(op),NULL) +# define SSL_get_options(ssl) \ + SSL_ctrl((ssl),SSL_CTRL_OPTIONS,0,NULL) + +# define SSL_CTX_set_mode(ctx,op) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_MODE,(op),NULL) +# define SSL_CTX_clear_mode(ctx,op) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_CLEAR_MODE,(op),NULL) +# define SSL_CTX_get_mode(ctx) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_MODE,0,NULL) +# define SSL_clear_mode(ssl,op) \ + SSL_ctrl((ssl),SSL_CTRL_CLEAR_MODE,(op),NULL) +# define SSL_set_mode(ssl,op) \ + SSL_ctrl((ssl),SSL_CTRL_MODE,(op),NULL) +# define SSL_get_mode(ssl) \ + SSL_ctrl((ssl),SSL_CTRL_MODE,0,NULL) +# define SSL_set_mtu(ssl, mtu) \ + SSL_ctrl((ssl),SSL_CTRL_SET_MTU,(mtu),NULL) +# define DTLS_set_link_mtu(ssl, mtu) \ + SSL_ctrl((ssl),DTLS_CTRL_SET_LINK_MTU,(mtu),NULL) +# define DTLS_get_link_min_mtu(ssl) \ + SSL_ctrl((ssl),DTLS_CTRL_GET_LINK_MIN_MTU,0,NULL) + +# define SSL_get_secure_renegotiation_support(ssl) \ + SSL_ctrl((ssl), SSL_CTRL_GET_RI_SUPPORT, 0, NULL) + +# ifndef OPENSSL_NO_HEARTBEATS +# define SSL_heartbeat(ssl) \ + SSL_ctrl((ssl),SSL_CTRL_TLS_EXT_SEND_HEARTBEAT,0,NULL) +# endif + +# define SSL_CTX_set_cert_flags(ctx,op) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_CERT_FLAGS,(op),NULL) +# define SSL_set_cert_flags(s,op) \ + SSL_ctrl((s),SSL_CTRL_CERT_FLAGS,(op),NULL) +# define SSL_CTX_clear_cert_flags(ctx,op) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_CLEAR_CERT_FLAGS,(op),NULL) +# define SSL_clear_cert_flags(s,op) \ + SSL_ctrl((s),SSL_CTRL_CLEAR_CERT_FLAGS,(op),NULL) + +void SSL_CTX_set_msg_callback(SSL_CTX *ctx, + void (*cb) (int write_p, int version, + int content_type, const void *buf, + size_t len, SSL *ssl, void *arg)); +void SSL_set_msg_callback(SSL *ssl, + void (*cb) (int write_p, int version, + int content_type, const void *buf, + size_t len, SSL *ssl, void *arg)); +# define SSL_CTX_set_msg_callback_arg(ctx, arg) SSL_CTX_ctrl((ctx), SSL_CTRL_SET_MSG_CALLBACK_ARG, 0, (arg)) +# define SSL_set_msg_callback_arg(ssl, arg) SSL_ctrl((ssl), SSL_CTRL_SET_MSG_CALLBACK_ARG, 0, (arg)) + +# ifndef OPENSSL_NO_SRP + +# ifndef OPENSSL_NO_SSL_INTERN + +typedef struct srp_ctx_st { + /* param for all the callbacks */ + void *SRP_cb_arg; + /* set client Hello login callback */ + int (*TLS_ext_srp_username_callback) (SSL *, int *, void *); + /* set SRP N/g param callback for verification */ + int (*SRP_verify_param_callback) (SSL *, void *); + /* set SRP client passwd callback */ + char *(*SRP_give_srp_client_pwd_callback) (SSL *, void *); + char *login; + BIGNUM *N, *g, *s, *B, *A; + BIGNUM *a, *b, *v; + char *info; + int strength; + unsigned long srp_Mask; +} SRP_CTX; + +# endif + +/* see tls_srp.c */ +int SSL_SRP_CTX_init(SSL *s); +int SSL_CTX_SRP_CTX_init(SSL_CTX *ctx); +int SSL_SRP_CTX_free(SSL *ctx); +int SSL_CTX_SRP_CTX_free(SSL_CTX *ctx); +int SSL_srp_server_param_with_username(SSL *s, int *ad); +int SRP_generate_server_master_secret(SSL *s, unsigned char *master_key); +int SRP_Calc_A_param(SSL *s); +int SRP_generate_client_master_secret(SSL *s, unsigned char *master_key); + +# endif + +# if defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_WIN32) +# define SSL_MAX_CERT_LIST_DEFAULT 1024*30 + /* 30k max cert list :-) */ +# else +# define SSL_MAX_CERT_LIST_DEFAULT 1024*100 + /* 100k max cert list :-) */ +# endif + +# define SSL_SESSION_CACHE_MAX_SIZE_DEFAULT (1024*20) + +/* + * This callback type is used inside SSL_CTX, SSL, and in the functions that + * set them. It is used to override the generation of SSL/TLS session IDs in + * a server. Return value should be zero on an error, non-zero to proceed. + * Also, callbacks should themselves check if the id they generate is unique + * otherwise the SSL handshake will fail with an error - callbacks can do + * this using the 'ssl' value they're passed by; + * SSL_has_matching_session_id(ssl, id, *id_len) The length value passed in + * is set at the maximum size the session ID can be. In SSLv2 this is 16 + * bytes, whereas SSLv3/TLSv1 it is 32 bytes. The callback can alter this + * length to be less if desired, but under SSLv2 session IDs are supposed to + * be fixed at 16 bytes so the id will be padded after the callback returns + * in this case. It is also an error for the callback to set the size to + * zero. + */ +typedef int (*GEN_SESSION_CB) (const SSL *ssl, unsigned char *id, + unsigned int *id_len); + +typedef struct ssl_comp_st SSL_COMP; + +# ifndef OPENSSL_NO_SSL_INTERN + +struct ssl_comp_st { + int id; + const char *name; +# ifndef OPENSSL_NO_COMP + COMP_METHOD *method; +# else + char *method; +# endif +}; + +DECLARE_STACK_OF(SSL_COMP) +DECLARE_LHASH_OF(SSL_SESSION); + +struct ssl_ctx_st { + const SSL_METHOD *method; + STACK_OF(SSL_CIPHER) *cipher_list; + /* same as above but sorted for lookup */ + STACK_OF(SSL_CIPHER) *cipher_list_by_id; + struct x509_store_st /* X509_STORE */ *cert_store; + LHASH_OF(SSL_SESSION) *sessions; + /* + * Most session-ids that will be cached, default is + * SSL_SESSION_CACHE_MAX_SIZE_DEFAULT. 0 is unlimited. + */ + unsigned long session_cache_size; + struct ssl_session_st *session_cache_head; + struct ssl_session_st *session_cache_tail; + /* + * This can have one of 2 values, ored together, SSL_SESS_CACHE_CLIENT, + * SSL_SESS_CACHE_SERVER, Default is SSL_SESSION_CACHE_SERVER, which + * means only SSL_accept which cache SSL_SESSIONS. + */ + int session_cache_mode; + /* + * If timeout is not 0, it is the default timeout value set when + * SSL_new() is called. This has been put in to make life easier to set + * things up + */ + long session_timeout; + /* + * If this callback is not null, it will be called each time a session id + * is added to the cache. If this function returns 1, it means that the + * callback will do a SSL_SESSION_free() when it has finished using it. + * Otherwise, on 0, it means the callback has finished with it. If + * remove_session_cb is not null, it will be called when a session-id is + * removed from the cache. After the call, OpenSSL will + * SSL_SESSION_free() it. + */ + int (*new_session_cb) (struct ssl_st *ssl, SSL_SESSION *sess); + void (*remove_session_cb) (struct ssl_ctx_st *ctx, SSL_SESSION *sess); + SSL_SESSION *(*get_session_cb) (struct ssl_st *ssl, + unsigned char *data, int len, int *copy); + struct { + int sess_connect; /* SSL new conn - started */ + int sess_connect_renegotiate; /* SSL reneg - requested */ + int sess_connect_good; /* SSL new conne/reneg - finished */ + int sess_accept; /* SSL new accept - started */ + int sess_accept_renegotiate; /* SSL reneg - requested */ + int sess_accept_good; /* SSL accept/reneg - finished */ + int sess_miss; /* session lookup misses */ + int sess_timeout; /* reuse attempt on timeouted session */ + int sess_cache_full; /* session removed due to full cache */ + int sess_hit; /* session reuse actually done */ + int sess_cb_hit; /* session-id that was not in the cache was + * passed back via the callback. This + * indicates that the application is + * supplying session-id's from other + * processes - spooky :-) */ + } stats; + + int references; + + /* if defined, these override the X509_verify_cert() calls */ + int (*app_verify_callback) (X509_STORE_CTX *, void *); + void *app_verify_arg; + /* + * before OpenSSL 0.9.7, 'app_verify_arg' was ignored + * ('app_verify_callback' was called with just one argument) + */ + + /* Default password callback. */ + pem_password_cb *default_passwd_callback; + + /* Default password callback user data. */ + void *default_passwd_callback_userdata; + + /* get client cert callback */ + int (*client_cert_cb) (SSL *ssl, X509 **x509, EVP_PKEY **pkey); + + /* cookie generate callback */ + int (*app_gen_cookie_cb) (SSL *ssl, unsigned char *cookie, + unsigned int *cookie_len); + + /* verify cookie callback */ + int (*app_verify_cookie_cb) (SSL *ssl, unsigned char *cookie, + unsigned int cookie_len); + + CRYPTO_EX_DATA ex_data; + + const EVP_MD *rsa_md5; /* For SSLv2 - name is 'ssl2-md5' */ + const EVP_MD *md5; /* For SSLv3/TLSv1 'ssl3-md5' */ + const EVP_MD *sha1; /* For SSLv3/TLSv1 'ssl3->sha1' */ + + STACK_OF(X509) *extra_certs; + STACK_OF(SSL_COMP) *comp_methods; /* stack of SSL_COMP, SSLv3/TLSv1 */ + + /* Default values used when no per-SSL value is defined follow */ + + /* used if SSL's info_callback is NULL */ + void (*info_callback) (const SSL *ssl, int type, int val); + + /* what we put in client cert requests */ + STACK_OF(X509_NAME) *client_CA; + + /* + * Default values to use in SSL structures follow (these are copied by + * SSL_new) + */ + + unsigned long options; + unsigned long mode; + long max_cert_list; + + struct cert_st /* CERT */ *cert; + int read_ahead; + + /* callback that allows applications to peek at protocol messages */ + void (*msg_callback) (int write_p, int version, int content_type, + const void *buf, size_t len, SSL *ssl, void *arg); + void *msg_callback_arg; + + int verify_mode; + unsigned int sid_ctx_length; + unsigned char sid_ctx[SSL_MAX_SID_CTX_LENGTH]; + /* called 'verify_callback' in the SSL */ + int (*default_verify_callback) (int ok, X509_STORE_CTX *ctx); + + /* Default generate session ID callback. */ + GEN_SESSION_CB generate_session_id; + + X509_VERIFY_PARAM *param; + +# if 0 + int purpose; /* Purpose setting */ + int trust; /* Trust setting */ +# endif + + int quiet_shutdown; + + /* + * Maximum amount of data to send in one fragment. actual record size can + * be more than this due to padding and MAC overheads. + */ + unsigned int max_send_fragment; + +# ifndef OPENSSL_NO_ENGINE + /* + * Engine to pass requests for client certs to + */ + ENGINE *client_cert_engine; +# endif + +# ifndef OPENSSL_NO_TLSEXT + /* TLS extensions servername callback */ + int (*tlsext_servername_callback) (SSL *, int *, void *); + void *tlsext_servername_arg; + /* RFC 4507 session ticket keys */ + unsigned char tlsext_tick_key_name[16]; + unsigned char tlsext_tick_hmac_key[16]; + unsigned char tlsext_tick_aes_key[16]; + /* Callback to support customisation of ticket key setting */ + int (*tlsext_ticket_key_cb) (SSL *ssl, + unsigned char *name, unsigned char *iv, + EVP_CIPHER_CTX *ectx, + HMAC_CTX *hctx, int enc); + + /* certificate status request info */ + /* Callback for status request */ + int (*tlsext_status_cb) (SSL *ssl, void *arg); + void *tlsext_status_arg; + + /* draft-rescorla-tls-opaque-prf-input-00.txt information */ + int (*tlsext_opaque_prf_input_callback) (SSL *, void *peerinput, + size_t len, void *arg); + void *tlsext_opaque_prf_input_callback_arg; +# endif + +# ifndef OPENSSL_NO_PSK + char *psk_identity_hint; + unsigned int (*psk_client_callback) (SSL *ssl, const char *hint, + char *identity, + unsigned int max_identity_len, + unsigned char *psk, + unsigned int max_psk_len); + unsigned int (*psk_server_callback) (SSL *ssl, const char *identity, + unsigned char *psk, + unsigned int max_psk_len); +# endif + +# ifndef OPENSSL_NO_BUF_FREELISTS +# define SSL_MAX_BUF_FREELIST_LEN_DEFAULT 32 + unsigned int freelist_max_len; + struct ssl3_buf_freelist_st *wbuf_freelist; + struct ssl3_buf_freelist_st *rbuf_freelist; +# endif +# ifndef OPENSSL_NO_SRP + SRP_CTX srp_ctx; /* ctx for SRP authentication */ +# endif + +# ifndef OPENSSL_NO_TLSEXT + +# ifndef OPENSSL_NO_NEXTPROTONEG + /* Next protocol negotiation information */ + /* (for experimental NPN extension). */ + + /* + * For a server, this contains a callback function by which the set of + * advertised protocols can be provided. + */ + int (*next_protos_advertised_cb) (SSL *s, const unsigned char **buf, + unsigned int *len, void *arg); + void *next_protos_advertised_cb_arg; + /* + * For a client, this contains a callback function that selects the next + * protocol from the list provided by the server. + */ + int (*next_proto_select_cb) (SSL *s, unsigned char **out, + unsigned char *outlen, + const unsigned char *in, + unsigned int inlen, void *arg); + void *next_proto_select_cb_arg; +# endif + /* SRTP profiles we are willing to do from RFC 5764 */ + STACK_OF(SRTP_PROTECTION_PROFILE) *srtp_profiles; + + /* + * ALPN information (we are in the process of transitioning from NPN to + * ALPN.) + */ + + /*- + * For a server, this contains a callback function that allows the + * server to select the protocol for the connection. + * out: on successful return, this must point to the raw protocol + * name (without the length prefix). + * outlen: on successful return, this contains the length of |*out|. + * in: points to the client's list of supported protocols in + * wire-format. + * inlen: the length of |in|. + */ + int (*alpn_select_cb) (SSL *s, + const unsigned char **out, + unsigned char *outlen, + const unsigned char *in, + unsigned int inlen, void *arg); + void *alpn_select_cb_arg; + + /* + * For a client, this contains the list of supported protocols in wire + * format. + */ + unsigned char *alpn_client_proto_list; + unsigned alpn_client_proto_list_len; + +# ifndef OPENSSL_NO_EC + /* EC extension values inherited by SSL structure */ + size_t tlsext_ecpointformatlist_length; + unsigned char *tlsext_ecpointformatlist; + size_t tlsext_ellipticcurvelist_length; + unsigned char *tlsext_ellipticcurvelist; +# endif /* OPENSSL_NO_EC */ +# endif +}; + +# endif + +# define SSL_SESS_CACHE_OFF 0x0000 +# define SSL_SESS_CACHE_CLIENT 0x0001 +# define SSL_SESS_CACHE_SERVER 0x0002 +# define SSL_SESS_CACHE_BOTH (SSL_SESS_CACHE_CLIENT|SSL_SESS_CACHE_SERVER) +# define SSL_SESS_CACHE_NO_AUTO_CLEAR 0x0080 +/* enough comments already ... see SSL_CTX_set_session_cache_mode(3) */ +# define SSL_SESS_CACHE_NO_INTERNAL_LOOKUP 0x0100 +# define SSL_SESS_CACHE_NO_INTERNAL_STORE 0x0200 +# define SSL_SESS_CACHE_NO_INTERNAL \ + (SSL_SESS_CACHE_NO_INTERNAL_LOOKUP|SSL_SESS_CACHE_NO_INTERNAL_STORE) + +LHASH_OF(SSL_SESSION) *SSL_CTX_sessions(SSL_CTX *ctx); +# define SSL_CTX_sess_number(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_NUMBER,0,NULL) +# define SSL_CTX_sess_connect(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CONNECT,0,NULL) +# define SSL_CTX_sess_connect_good(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CONNECT_GOOD,0,NULL) +# define SSL_CTX_sess_connect_renegotiate(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CONNECT_RENEGOTIATE,0,NULL) +# define SSL_CTX_sess_accept(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_ACCEPT,0,NULL) +# define SSL_CTX_sess_accept_renegotiate(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_ACCEPT_RENEGOTIATE,0,NULL) +# define SSL_CTX_sess_accept_good(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_ACCEPT_GOOD,0,NULL) +# define SSL_CTX_sess_hits(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_HIT,0,NULL) +# define SSL_CTX_sess_cb_hits(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CB_HIT,0,NULL) +# define SSL_CTX_sess_misses(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_MISSES,0,NULL) +# define SSL_CTX_sess_timeouts(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_TIMEOUTS,0,NULL) +# define SSL_CTX_sess_cache_full(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CACHE_FULL,0,NULL) + +void SSL_CTX_sess_set_new_cb(SSL_CTX *ctx, + int (*new_session_cb) (struct ssl_st *ssl, + SSL_SESSION *sess)); +int (*SSL_CTX_sess_get_new_cb(SSL_CTX *ctx)) (struct ssl_st *ssl, + SSL_SESSION *sess); +void SSL_CTX_sess_set_remove_cb(SSL_CTX *ctx, + void (*remove_session_cb) (struct ssl_ctx_st + *ctx, + SSL_SESSION + *sess)); +void (*SSL_CTX_sess_get_remove_cb(SSL_CTX *ctx)) (struct ssl_ctx_st *ctx, + SSL_SESSION *sess); +void SSL_CTX_sess_set_get_cb(SSL_CTX *ctx, + SSL_SESSION *(*get_session_cb) (struct ssl_st + *ssl, + unsigned char + *data, int len, + int *copy)); +SSL_SESSION *(*SSL_CTX_sess_get_get_cb(SSL_CTX *ctx)) (struct ssl_st *ssl, + unsigned char *Data, + int len, int *copy); +void SSL_CTX_set_info_callback(SSL_CTX *ctx, + void (*cb) (const SSL *ssl, int type, + int val)); +void (*SSL_CTX_get_info_callback(SSL_CTX *ctx)) (const SSL *ssl, int type, + int val); +void SSL_CTX_set_client_cert_cb(SSL_CTX *ctx, + int (*client_cert_cb) (SSL *ssl, X509 **x509, + EVP_PKEY **pkey)); +int (*SSL_CTX_get_client_cert_cb(SSL_CTX *ctx)) (SSL *ssl, X509 **x509, + EVP_PKEY **pkey); +# ifndef OPENSSL_NO_ENGINE +int SSL_CTX_set_client_cert_engine(SSL_CTX *ctx, ENGINE *e); +# endif +void SSL_CTX_set_cookie_generate_cb(SSL_CTX *ctx, + int (*app_gen_cookie_cb) (SSL *ssl, + unsigned char + *cookie, + unsigned int + *cookie_len)); +void SSL_CTX_set_cookie_verify_cb(SSL_CTX *ctx, + int (*app_verify_cookie_cb) (SSL *ssl, + unsigned char + *cookie, + unsigned int + cookie_len)); +# ifndef OPENSSL_NO_NEXTPROTONEG +void SSL_CTX_set_next_protos_advertised_cb(SSL_CTX *s, + int (*cb) (SSL *ssl, + const unsigned char + **out, + unsigned int *outlen, + void *arg), void *arg); +void SSL_CTX_set_next_proto_select_cb(SSL_CTX *s, + int (*cb) (SSL *ssl, + unsigned char **out, + unsigned char *outlen, + const unsigned char *in, + unsigned int inlen, + void *arg), void *arg); +void SSL_get0_next_proto_negotiated(const SSL *s, const unsigned char **data, + unsigned *len); +# endif + +# ifndef OPENSSL_NO_TLSEXT +int SSL_select_next_proto(unsigned char **out, unsigned char *outlen, + const unsigned char *in, unsigned int inlen, + const unsigned char *client, + unsigned int client_len); +# endif + +# define OPENSSL_NPN_UNSUPPORTED 0 +# define OPENSSL_NPN_NEGOTIATED 1 +# define OPENSSL_NPN_NO_OVERLAP 2 + +int SSL_CTX_set_alpn_protos(SSL_CTX *ctx, const unsigned char *protos, + unsigned protos_len); +int SSL_set_alpn_protos(SSL *ssl, const unsigned char *protos, + unsigned protos_len); +void SSL_CTX_set_alpn_select_cb(SSL_CTX *ctx, + int (*cb) (SSL *ssl, + const unsigned char **out, + unsigned char *outlen, + const unsigned char *in, + unsigned int inlen, + void *arg), void *arg); +void SSL_get0_alpn_selected(const SSL *ssl, const unsigned char **data, + unsigned *len); + +# ifndef OPENSSL_NO_PSK +/* + * the maximum length of the buffer given to callbacks containing the + * resulting identity/psk + */ +# define PSK_MAX_IDENTITY_LEN 128 +# define PSK_MAX_PSK_LEN 256 +void SSL_CTX_set_psk_client_callback(SSL_CTX *ctx, + unsigned int (*psk_client_callback) (SSL + *ssl, + const + char + *hint, + char + *identity, + unsigned + int + max_identity_len, + unsigned + char + *psk, + unsigned + int + max_psk_len)); +void SSL_set_psk_client_callback(SSL *ssl, + unsigned int (*psk_client_callback) (SSL + *ssl, + const + char + *hint, + char + *identity, + unsigned + int + max_identity_len, + unsigned + char + *psk, + unsigned + int + max_psk_len)); +void SSL_CTX_set_psk_server_callback(SSL_CTX *ctx, + unsigned int (*psk_server_callback) (SSL + *ssl, + const + char + *identity, + unsigned + char + *psk, + unsigned + int + max_psk_len)); +void SSL_set_psk_server_callback(SSL *ssl, + unsigned int (*psk_server_callback) (SSL + *ssl, + const + char + *identity, + unsigned + char + *psk, + unsigned + int + max_psk_len)); +int SSL_CTX_use_psk_identity_hint(SSL_CTX *ctx, const char *identity_hint); +int SSL_use_psk_identity_hint(SSL *s, const char *identity_hint); +const char *SSL_get_psk_identity_hint(const SSL *s); +const char *SSL_get_psk_identity(const SSL *s); +# endif + +# ifndef OPENSSL_NO_TLSEXT +/* Register callbacks to handle custom TLS Extensions for client or server. */ + +int SSL_CTX_add_client_custom_ext(SSL_CTX *ctx, unsigned int ext_type, + custom_ext_add_cb add_cb, + custom_ext_free_cb free_cb, + void *add_arg, + custom_ext_parse_cb parse_cb, + void *parse_arg); + +int SSL_CTX_add_server_custom_ext(SSL_CTX *ctx, unsigned int ext_type, + custom_ext_add_cb add_cb, + custom_ext_free_cb free_cb, + void *add_arg, + custom_ext_parse_cb parse_cb, + void *parse_arg); + +int SSL_extension_supported(unsigned int ext_type); + +# endif + +# define SSL_NOTHING 1 +# define SSL_WRITING 2 +# define SSL_READING 3 +# define SSL_X509_LOOKUP 4 + +/* These will only be used when doing non-blocking IO */ +# define SSL_want_nothing(s) (SSL_want(s) == SSL_NOTHING) +# define SSL_want_read(s) (SSL_want(s) == SSL_READING) +# define SSL_want_write(s) (SSL_want(s) == SSL_WRITING) +# define SSL_want_x509_lookup(s) (SSL_want(s) == SSL_X509_LOOKUP) + +# define SSL_MAC_FLAG_READ_MAC_STREAM 1 +# define SSL_MAC_FLAG_WRITE_MAC_STREAM 2 + +# ifndef OPENSSL_NO_SSL_INTERN + +struct ssl_st { + /* + * protocol version (one of SSL2_VERSION, SSL3_VERSION, TLS1_VERSION, + * DTLS1_VERSION) + */ + int version; + /* SSL_ST_CONNECT or SSL_ST_ACCEPT */ + int type; + /* SSLv3 */ + const SSL_METHOD *method; + /* + * There are 2 BIO's even though they are normally both the same. This + * is so data can be read and written to different handlers + */ +# ifndef OPENSSL_NO_BIO + /* used by SSL_read */ + BIO *rbio; + /* used by SSL_write */ + BIO *wbio; + /* used during session-id reuse to concatenate messages */ + BIO *bbio; +# else + /* used by SSL_read */ + char *rbio; + /* used by SSL_write */ + char *wbio; + char *bbio; +# endif + /* + * This holds a variable that indicates what we were doing when a 0 or -1 + * is returned. This is needed for non-blocking IO so we know what + * request needs re-doing when in SSL_accept or SSL_connect + */ + int rwstate; + /* true when we are actually in SSL_accept() or SSL_connect() */ + int in_handshake; + int (*handshake_func) (SSL *); + /* + * Imagine that here's a boolean member "init" that is switched as soon + * as SSL_set_{accept/connect}_state is called for the first time, so + * that "state" and "handshake_func" are properly initialized. But as + * handshake_func is == 0 until then, we use this test instead of an + * "init" member. + */ + /* are we the server side? - mostly used by SSL_clear */ + int server; + /* + * Generate a new session or reuse an old one. + * NB: For servers, the 'new' session may actually be a previously + * cached session or even the previous session unless + * SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION is set + */ + int new_session; + /* don't send shutdown packets */ + int quiet_shutdown; + /* we have shut things down, 0x01 sent, 0x02 for received */ + int shutdown; + /* where we are */ + int state; + /* where we are when reading */ + int rstate; + BUF_MEM *init_buf; /* buffer used during init */ + void *init_msg; /* pointer to handshake message body, set by + * ssl3_get_message() */ + int init_num; /* amount read/written */ + int init_off; /* amount read/written */ + /* used internally to point at a raw packet */ + unsigned char *packet; + unsigned int packet_length; + struct ssl2_state_st *s2; /* SSLv2 variables */ + struct ssl3_state_st *s3; /* SSLv3 variables */ + struct dtls1_state_st *d1; /* DTLSv1 variables */ + int read_ahead; /* Read as many input bytes as possible (for + * non-blocking reads) */ + /* callback that allows applications to peek at protocol messages */ + void (*msg_callback) (int write_p, int version, int content_type, + const void *buf, size_t len, SSL *ssl, void *arg); + void *msg_callback_arg; + int hit; /* reusing a previous session */ + X509_VERIFY_PARAM *param; +# if 0 + int purpose; /* Purpose setting */ + int trust; /* Trust setting */ +# endif + /* crypto */ + STACK_OF(SSL_CIPHER) *cipher_list; + STACK_OF(SSL_CIPHER) *cipher_list_by_id; + /* + * These are the ones being used, the ones in SSL_SESSION are the ones to + * be 'copied' into these ones + */ + int mac_flags; + EVP_CIPHER_CTX *enc_read_ctx; /* cryptographic state */ + EVP_MD_CTX *read_hash; /* used for mac generation */ +# ifndef OPENSSL_NO_COMP + COMP_CTX *expand; /* uncompress */ +# else + char *expand; +# endif + EVP_CIPHER_CTX *enc_write_ctx; /* cryptographic state */ + EVP_MD_CTX *write_hash; /* used for mac generation */ +# ifndef OPENSSL_NO_COMP + COMP_CTX *compress; /* compression */ +# else + char *compress; +# endif + /* session info */ + /* client cert? */ + /* This is used to hold the server certificate used */ + struct cert_st /* CERT */ *cert; + /* + * the session_id_context is used to ensure sessions are only reused in + * the appropriate context + */ + unsigned int sid_ctx_length; + unsigned char sid_ctx[SSL_MAX_SID_CTX_LENGTH]; + /* This can also be in the session once a session is established */ + SSL_SESSION *session; + /* Default generate session ID callback. */ + GEN_SESSION_CB generate_session_id; + /* Used in SSL2 and SSL3 */ + /* + * 0 don't care about verify failure. + * 1 fail if verify fails + */ + int verify_mode; + /* fail if callback returns 0 */ + int (*verify_callback) (int ok, X509_STORE_CTX *ctx); + /* optional informational callback */ + void (*info_callback) (const SSL *ssl, int type, int val); + /* error bytes to be written */ + int error; + /* actual code */ + int error_code; +# ifndef OPENSSL_NO_KRB5 + /* Kerberos 5 context */ + KSSL_CTX *kssl_ctx; +# endif /* OPENSSL_NO_KRB5 */ +# ifndef OPENSSL_NO_PSK + unsigned int (*psk_client_callback) (SSL *ssl, const char *hint, + char *identity, + unsigned int max_identity_len, + unsigned char *psk, + unsigned int max_psk_len); + unsigned int (*psk_server_callback) (SSL *ssl, const char *identity, + unsigned char *psk, + unsigned int max_psk_len); +# endif + SSL_CTX *ctx; + /* + * set this flag to 1 and a sleep(1) is put into all SSL_read() and + * SSL_write() calls, good for nbio debuging :-) + */ + int debug; + /* extra application data */ + long verify_result; + CRYPTO_EX_DATA ex_data; + /* for server side, keep the list of CA_dn we can use */ + STACK_OF(X509_NAME) *client_CA; + int references; + /* protocol behaviour */ + unsigned long options; + /* API behaviour */ + unsigned long mode; + long max_cert_list; + int first_packet; + /* what was passed, used for SSLv3/TLS rollback check */ + int client_version; + unsigned int max_send_fragment; +# ifndef OPENSSL_NO_TLSEXT + /* TLS extension debug callback */ + void (*tlsext_debug_cb) (SSL *s, int client_server, int type, + unsigned char *data, int len, void *arg); + void *tlsext_debug_arg; + char *tlsext_hostname; + /*- + * no further mod of servername + * 0 : call the servername extension callback. + * 1 : prepare 2, allow last ack just after in server callback. + * 2 : don't call servername callback, no ack in server hello + */ + int servername_done; + /* certificate status request info */ + /* Status type or -1 if no status type */ + int tlsext_status_type; + /* Expect OCSP CertificateStatus message */ + int tlsext_status_expected; + /* OCSP status request only */ + STACK_OF(OCSP_RESPID) *tlsext_ocsp_ids; + X509_EXTENSIONS *tlsext_ocsp_exts; + /* OCSP response received or to be sent */ + unsigned char *tlsext_ocsp_resp; + int tlsext_ocsp_resplen; + /* RFC4507 session ticket expected to be received or sent */ + int tlsext_ticket_expected; +# ifndef OPENSSL_NO_EC + size_t tlsext_ecpointformatlist_length; + /* our list */ + unsigned char *tlsext_ecpointformatlist; + size_t tlsext_ellipticcurvelist_length; + /* our list */ + unsigned char *tlsext_ellipticcurvelist; +# endif /* OPENSSL_NO_EC */ + /* + * draft-rescorla-tls-opaque-prf-input-00.txt information to be used for + * handshakes + */ + void *tlsext_opaque_prf_input; + size_t tlsext_opaque_prf_input_len; + /* TLS Session Ticket extension override */ + TLS_SESSION_TICKET_EXT *tlsext_session_ticket; + /* TLS Session Ticket extension callback */ + tls_session_ticket_ext_cb_fn tls_session_ticket_ext_cb; + void *tls_session_ticket_ext_cb_arg; + /* TLS pre-shared secret session resumption */ + tls_session_secret_cb_fn tls_session_secret_cb; + void *tls_session_secret_cb_arg; + SSL_CTX *initial_ctx; /* initial ctx, used to store sessions */ +# ifndef OPENSSL_NO_NEXTPROTONEG + /* + * Next protocol negotiation. For the client, this is the protocol that + * we sent in NextProtocol and is set when handling ServerHello + * extensions. For a server, this is the client's selected_protocol from + * NextProtocol and is set when handling the NextProtocol message, before + * the Finished message. + */ + unsigned char *next_proto_negotiated; + unsigned char next_proto_negotiated_len; +# endif +# define session_ctx initial_ctx + /* What we'll do */ + STACK_OF(SRTP_PROTECTION_PROFILE) *srtp_profiles; + /* What's been chosen */ + SRTP_PROTECTION_PROFILE *srtp_profile; + /*- + * Is use of the Heartbeat extension negotiated? + * 0: disabled + * 1: enabled + * 2: enabled, but not allowed to send Requests + */ + unsigned int tlsext_heartbeat; + /* Indicates if a HeartbeatRequest is in flight */ + unsigned int tlsext_hb_pending; + /* HeartbeatRequest sequence number */ + unsigned int tlsext_hb_seq; +# else +# define session_ctx ctx +# endif /* OPENSSL_NO_TLSEXT */ + /*- + * 1 if we are renegotiating. + * 2 if we are a server and are inside a handshake + * (i.e. not just sending a HelloRequest) + */ + int renegotiate; +# ifndef OPENSSL_NO_SRP + /* ctx for SRP authentication */ + SRP_CTX srp_ctx; +# endif +# ifndef OPENSSL_NO_TLSEXT + /* + * For a client, this contains the list of supported protocols in wire + * format. + */ + unsigned char *alpn_client_proto_list; + unsigned alpn_client_proto_list_len; +# endif /* OPENSSL_NO_TLSEXT */ +}; + +# endif + +#ifdef __cplusplus +} +#endif + +# include +# include +# include /* This is mostly sslv3 with a few tweaks */ +# include /* Datagram TLS */ +# include +# include /* Support for the use_srtp extension */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* compatibility */ +# define SSL_set_app_data(s,arg) (SSL_set_ex_data(s,0,(char *)arg)) +# define SSL_get_app_data(s) (SSL_get_ex_data(s,0)) +# define SSL_SESSION_set_app_data(s,a) (SSL_SESSION_set_ex_data(s,0,(char *)a)) +# define SSL_SESSION_get_app_data(s) (SSL_SESSION_get_ex_data(s,0)) +# define SSL_CTX_get_app_data(ctx) (SSL_CTX_get_ex_data(ctx,0)) +# define SSL_CTX_set_app_data(ctx,arg) (SSL_CTX_set_ex_data(ctx,0,(char *)arg)) + +/* + * The following are the possible values for ssl->state are are used to + * indicate where we are up to in the SSL connection establishment. The + * macros that follow are about the only things you should need to use and + * even then, only when using non-blocking IO. It can also be useful to work + * out where you were when the connection failed + */ + +# define SSL_ST_CONNECT 0x1000 +# define SSL_ST_ACCEPT 0x2000 +# define SSL_ST_MASK 0x0FFF +# define SSL_ST_INIT (SSL_ST_CONNECT|SSL_ST_ACCEPT) +# define SSL_ST_BEFORE 0x4000 +# define SSL_ST_OK 0x03 +# define SSL_ST_RENEGOTIATE (0x04|SSL_ST_INIT) +# define SSL_ST_ERR 0x05 + +# define SSL_CB_LOOP 0x01 +# define SSL_CB_EXIT 0x02 +# define SSL_CB_READ 0x04 +# define SSL_CB_WRITE 0x08 +# define SSL_CB_ALERT 0x4000/* used in callback */ +# define SSL_CB_READ_ALERT (SSL_CB_ALERT|SSL_CB_READ) +# define SSL_CB_WRITE_ALERT (SSL_CB_ALERT|SSL_CB_WRITE) +# define SSL_CB_ACCEPT_LOOP (SSL_ST_ACCEPT|SSL_CB_LOOP) +# define SSL_CB_ACCEPT_EXIT (SSL_ST_ACCEPT|SSL_CB_EXIT) +# define SSL_CB_CONNECT_LOOP (SSL_ST_CONNECT|SSL_CB_LOOP) +# define SSL_CB_CONNECT_EXIT (SSL_ST_CONNECT|SSL_CB_EXIT) +# define SSL_CB_HANDSHAKE_START 0x10 +# define SSL_CB_HANDSHAKE_DONE 0x20 + +/* Is the SSL_connection established? */ +# define SSL_get_state(a) SSL_state(a) +# define SSL_is_init_finished(a) (SSL_state(a) == SSL_ST_OK) +# define SSL_in_init(a) (SSL_state(a)&SSL_ST_INIT) +# define SSL_in_before(a) (SSL_state(a)&SSL_ST_BEFORE) +# define SSL_in_connect_init(a) (SSL_state(a)&SSL_ST_CONNECT) +# define SSL_in_accept_init(a) (SSL_state(a)&SSL_ST_ACCEPT) + +/* + * The following 2 states are kept in ssl->rstate when reads fail, you should + * not need these + */ +# define SSL_ST_READ_HEADER 0xF0 +# define SSL_ST_READ_BODY 0xF1 +# define SSL_ST_READ_DONE 0xF2 + +/*- + * Obtain latest Finished message + * -- that we sent (SSL_get_finished) + * -- that we expected from peer (SSL_get_peer_finished). + * Returns length (0 == no Finished so far), copies up to 'count' bytes. + */ +size_t SSL_get_finished(const SSL *s, void *buf, size_t count); +size_t SSL_get_peer_finished(const SSL *s, void *buf, size_t count); + +/* + * use either SSL_VERIFY_NONE or SSL_VERIFY_PEER, the last 2 options are + * 'ored' with SSL_VERIFY_PEER if they are desired + */ +# define SSL_VERIFY_NONE 0x00 +# define SSL_VERIFY_PEER 0x01 +# define SSL_VERIFY_FAIL_IF_NO_PEER_CERT 0x02 +# define SSL_VERIFY_CLIENT_ONCE 0x04 + +# define OpenSSL_add_ssl_algorithms() SSL_library_init() +# define SSLeay_add_ssl_algorithms() SSL_library_init() + +/* this is for backward compatibility */ +# if 0 /* NEW_SSLEAY */ +# define SSL_CTX_set_default_verify(a,b,c) SSL_CTX_set_verify(a,b,c) +# define SSL_set_pref_cipher(c,n) SSL_set_cipher_list(c,n) +# define SSL_add_session(a,b) SSL_CTX_add_session((a),(b)) +# define SSL_remove_session(a,b) SSL_CTX_remove_session((a),(b)) +# define SSL_flush_sessions(a,b) SSL_CTX_flush_sessions((a),(b)) +# endif +/* More backward compatibility */ +# define SSL_get_cipher(s) \ + SSL_CIPHER_get_name(SSL_get_current_cipher(s)) +# define SSL_get_cipher_bits(s,np) \ + SSL_CIPHER_get_bits(SSL_get_current_cipher(s),np) +# define SSL_get_cipher_version(s) \ + SSL_CIPHER_get_version(SSL_get_current_cipher(s)) +# define SSL_get_cipher_name(s) \ + SSL_CIPHER_get_name(SSL_get_current_cipher(s)) +# define SSL_get_time(a) SSL_SESSION_get_time(a) +# define SSL_set_time(a,b) SSL_SESSION_set_time((a),(b)) +# define SSL_get_timeout(a) SSL_SESSION_get_timeout(a) +# define SSL_set_timeout(a,b) SSL_SESSION_set_timeout((a),(b)) + +# define d2i_SSL_SESSION_bio(bp,s_id) ASN1_d2i_bio_of(SSL_SESSION,SSL_SESSION_new,d2i_SSL_SESSION,bp,s_id) +# define i2d_SSL_SESSION_bio(bp,s_id) ASN1_i2d_bio_of(SSL_SESSION,i2d_SSL_SESSION,bp,s_id) + +DECLARE_PEM_rw(SSL_SESSION, SSL_SESSION) +# define SSL_AD_REASON_OFFSET 1000/* offset to get SSL_R_... value + * from SSL_AD_... */ +/* These alert types are for SSLv3 and TLSv1 */ +# define SSL_AD_CLOSE_NOTIFY SSL3_AD_CLOSE_NOTIFY +/* fatal */ +# define SSL_AD_UNEXPECTED_MESSAGE SSL3_AD_UNEXPECTED_MESSAGE +/* fatal */ +# define SSL_AD_BAD_RECORD_MAC SSL3_AD_BAD_RECORD_MAC +# define SSL_AD_DECRYPTION_FAILED TLS1_AD_DECRYPTION_FAILED +# define SSL_AD_RECORD_OVERFLOW TLS1_AD_RECORD_OVERFLOW +/* fatal */ +# define SSL_AD_DECOMPRESSION_FAILURE SSL3_AD_DECOMPRESSION_FAILURE +/* fatal */ +# define SSL_AD_HANDSHAKE_FAILURE SSL3_AD_HANDSHAKE_FAILURE +/* Not for TLS */ +# define SSL_AD_NO_CERTIFICATE SSL3_AD_NO_CERTIFICATE +# define SSL_AD_BAD_CERTIFICATE SSL3_AD_BAD_CERTIFICATE +# define SSL_AD_UNSUPPORTED_CERTIFICATE SSL3_AD_UNSUPPORTED_CERTIFICATE +# define SSL_AD_CERTIFICATE_REVOKED SSL3_AD_CERTIFICATE_REVOKED +# define SSL_AD_CERTIFICATE_EXPIRED SSL3_AD_CERTIFICATE_EXPIRED +# define SSL_AD_CERTIFICATE_UNKNOWN SSL3_AD_CERTIFICATE_UNKNOWN +/* fatal */ +# define SSL_AD_ILLEGAL_PARAMETER SSL3_AD_ILLEGAL_PARAMETER +/* fatal */ +# define SSL_AD_UNKNOWN_CA TLS1_AD_UNKNOWN_CA +/* fatal */ +# define SSL_AD_ACCESS_DENIED TLS1_AD_ACCESS_DENIED +/* fatal */ +# define SSL_AD_DECODE_ERROR TLS1_AD_DECODE_ERROR +# define SSL_AD_DECRYPT_ERROR TLS1_AD_DECRYPT_ERROR +/* fatal */ +# define SSL_AD_EXPORT_RESTRICTION TLS1_AD_EXPORT_RESTRICTION +/* fatal */ +# define SSL_AD_PROTOCOL_VERSION TLS1_AD_PROTOCOL_VERSION +/* fatal */ +# define SSL_AD_INSUFFICIENT_SECURITY TLS1_AD_INSUFFICIENT_SECURITY +/* fatal */ +# define SSL_AD_INTERNAL_ERROR TLS1_AD_INTERNAL_ERROR +# define SSL_AD_USER_CANCELLED TLS1_AD_USER_CANCELLED +# define SSL_AD_NO_RENEGOTIATION TLS1_AD_NO_RENEGOTIATION +# define SSL_AD_UNSUPPORTED_EXTENSION TLS1_AD_UNSUPPORTED_EXTENSION +# define SSL_AD_CERTIFICATE_UNOBTAINABLE TLS1_AD_CERTIFICATE_UNOBTAINABLE +# define SSL_AD_UNRECOGNIZED_NAME TLS1_AD_UNRECOGNIZED_NAME +# define SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE TLS1_AD_BAD_CERTIFICATE_STATUS_RESPONSE +# define SSL_AD_BAD_CERTIFICATE_HASH_VALUE TLS1_AD_BAD_CERTIFICATE_HASH_VALUE +/* fatal */ +# define SSL_AD_UNKNOWN_PSK_IDENTITY TLS1_AD_UNKNOWN_PSK_IDENTITY +/* fatal */ +# define SSL_AD_INAPPROPRIATE_FALLBACK TLS1_AD_INAPPROPRIATE_FALLBACK +# define SSL_ERROR_NONE 0 +# define SSL_ERROR_SSL 1 +# define SSL_ERROR_WANT_READ 2 +# define SSL_ERROR_WANT_WRITE 3 +# define SSL_ERROR_WANT_X509_LOOKUP 4 +# define SSL_ERROR_SYSCALL 5/* look at error stack/return + * value/errno */ +# define SSL_ERROR_ZERO_RETURN 6 +# define SSL_ERROR_WANT_CONNECT 7 +# define SSL_ERROR_WANT_ACCEPT 8 +# define SSL_CTRL_NEED_TMP_RSA 1 +# define SSL_CTRL_SET_TMP_RSA 2 +# define SSL_CTRL_SET_TMP_DH 3 +# define SSL_CTRL_SET_TMP_ECDH 4 +# define SSL_CTRL_SET_TMP_RSA_CB 5 +# define SSL_CTRL_SET_TMP_DH_CB 6 +# define SSL_CTRL_SET_TMP_ECDH_CB 7 +# define SSL_CTRL_GET_SESSION_REUSED 8 +# define SSL_CTRL_GET_CLIENT_CERT_REQUEST 9 +# define SSL_CTRL_GET_NUM_RENEGOTIATIONS 10 +# define SSL_CTRL_CLEAR_NUM_RENEGOTIATIONS 11 +# define SSL_CTRL_GET_TOTAL_RENEGOTIATIONS 12 +# define SSL_CTRL_GET_FLAGS 13 +# define SSL_CTRL_EXTRA_CHAIN_CERT 14 +# define SSL_CTRL_SET_MSG_CALLBACK 15 +# define SSL_CTRL_SET_MSG_CALLBACK_ARG 16 +/* only applies to datagram connections */ +# define SSL_CTRL_SET_MTU 17 +/* Stats */ +# define SSL_CTRL_SESS_NUMBER 20 +# define SSL_CTRL_SESS_CONNECT 21 +# define SSL_CTRL_SESS_CONNECT_GOOD 22 +# define SSL_CTRL_SESS_CONNECT_RENEGOTIATE 23 +# define SSL_CTRL_SESS_ACCEPT 24 +# define SSL_CTRL_SESS_ACCEPT_GOOD 25 +# define SSL_CTRL_SESS_ACCEPT_RENEGOTIATE 26 +# define SSL_CTRL_SESS_HIT 27 +# define SSL_CTRL_SESS_CB_HIT 28 +# define SSL_CTRL_SESS_MISSES 29 +# define SSL_CTRL_SESS_TIMEOUTS 30 +# define SSL_CTRL_SESS_CACHE_FULL 31 +# define SSL_CTRL_OPTIONS 32 +# define SSL_CTRL_MODE 33 +# define SSL_CTRL_GET_READ_AHEAD 40 +# define SSL_CTRL_SET_READ_AHEAD 41 +# define SSL_CTRL_SET_SESS_CACHE_SIZE 42 +# define SSL_CTRL_GET_SESS_CACHE_SIZE 43 +# define SSL_CTRL_SET_SESS_CACHE_MODE 44 +# define SSL_CTRL_GET_SESS_CACHE_MODE 45 +# define SSL_CTRL_GET_MAX_CERT_LIST 50 +# define SSL_CTRL_SET_MAX_CERT_LIST 51 +# define SSL_CTRL_SET_MAX_SEND_FRAGMENT 52 +/* see tls1.h for macros based on these */ +# ifndef OPENSSL_NO_TLSEXT +# define SSL_CTRL_SET_TLSEXT_SERVERNAME_CB 53 +# define SSL_CTRL_SET_TLSEXT_SERVERNAME_ARG 54 +# define SSL_CTRL_SET_TLSEXT_HOSTNAME 55 +# define SSL_CTRL_SET_TLSEXT_DEBUG_CB 56 +# define SSL_CTRL_SET_TLSEXT_DEBUG_ARG 57 +# define SSL_CTRL_GET_TLSEXT_TICKET_KEYS 58 +# define SSL_CTRL_SET_TLSEXT_TICKET_KEYS 59 +# define SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT 60 +# define SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT_CB 61 +# define SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT_CB_ARG 62 +# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB 63 +# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB_ARG 64 +# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_TYPE 65 +# define SSL_CTRL_GET_TLSEXT_STATUS_REQ_EXTS 66 +# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_EXTS 67 +# define SSL_CTRL_GET_TLSEXT_STATUS_REQ_IDS 68 +# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_IDS 69 +# define SSL_CTRL_GET_TLSEXT_STATUS_REQ_OCSP_RESP 70 +# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_OCSP_RESP 71 +# define SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB 72 +# define SSL_CTRL_SET_TLS_EXT_SRP_USERNAME_CB 75 +# define SSL_CTRL_SET_SRP_VERIFY_PARAM_CB 76 +# define SSL_CTRL_SET_SRP_GIVE_CLIENT_PWD_CB 77 +# define SSL_CTRL_SET_SRP_ARG 78 +# define SSL_CTRL_SET_TLS_EXT_SRP_USERNAME 79 +# define SSL_CTRL_SET_TLS_EXT_SRP_STRENGTH 80 +# define SSL_CTRL_SET_TLS_EXT_SRP_PASSWORD 81 +# ifndef OPENSSL_NO_HEARTBEATS +# define SSL_CTRL_TLS_EXT_SEND_HEARTBEAT 85 +# define SSL_CTRL_GET_TLS_EXT_HEARTBEAT_PENDING 86 +# define SSL_CTRL_SET_TLS_EXT_HEARTBEAT_NO_REQUESTS 87 +# endif +# endif /* OPENSSL_NO_TLSEXT */ +# define DTLS_CTRL_GET_TIMEOUT 73 +# define DTLS_CTRL_HANDLE_TIMEOUT 74 +# define DTLS_CTRL_LISTEN 75 +# define SSL_CTRL_GET_RI_SUPPORT 76 +# define SSL_CTRL_CLEAR_OPTIONS 77 +# define SSL_CTRL_CLEAR_MODE 78 +# define SSL_CTRL_GET_EXTRA_CHAIN_CERTS 82 +# define SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS 83 +# define SSL_CTRL_CHAIN 88 +# define SSL_CTRL_CHAIN_CERT 89 +# define SSL_CTRL_GET_CURVES 90 +# define SSL_CTRL_SET_CURVES 91 +# define SSL_CTRL_SET_CURVES_LIST 92 +# define SSL_CTRL_GET_SHARED_CURVE 93 +# define SSL_CTRL_SET_ECDH_AUTO 94 +# define SSL_CTRL_SET_SIGALGS 97 +# define SSL_CTRL_SET_SIGALGS_LIST 98 +# define SSL_CTRL_CERT_FLAGS 99 +# define SSL_CTRL_CLEAR_CERT_FLAGS 100 +# define SSL_CTRL_SET_CLIENT_SIGALGS 101 +# define SSL_CTRL_SET_CLIENT_SIGALGS_LIST 102 +# define SSL_CTRL_GET_CLIENT_CERT_TYPES 103 +# define SSL_CTRL_SET_CLIENT_CERT_TYPES 104 +# define SSL_CTRL_BUILD_CERT_CHAIN 105 +# define SSL_CTRL_SET_VERIFY_CERT_STORE 106 +# define SSL_CTRL_SET_CHAIN_CERT_STORE 107 +# define SSL_CTRL_GET_PEER_SIGNATURE_NID 108 +# define SSL_CTRL_GET_SERVER_TMP_KEY 109 +# define SSL_CTRL_GET_RAW_CIPHERLIST 110 +# define SSL_CTRL_GET_EC_POINT_FORMATS 111 +# define SSL_CTRL_GET_CHAIN_CERTS 115 +# define SSL_CTRL_SELECT_CURRENT_CERT 116 +# define SSL_CTRL_SET_CURRENT_CERT 117 +# define SSL_CTRL_CHECK_PROTO_VERSION 119 +# define DTLS_CTRL_SET_LINK_MTU 120 +# define DTLS_CTRL_GET_LINK_MIN_MTU 121 +# define SSL_CERT_SET_FIRST 1 +# define SSL_CERT_SET_NEXT 2 +# define SSL_CERT_SET_SERVER 3 +# define DTLSv1_get_timeout(ssl, arg) \ + SSL_ctrl(ssl,DTLS_CTRL_GET_TIMEOUT,0, (void *)arg) +# define DTLSv1_handle_timeout(ssl) \ + SSL_ctrl(ssl,DTLS_CTRL_HANDLE_TIMEOUT,0, NULL) +# define DTLSv1_listen(ssl, peer) \ + SSL_ctrl(ssl,DTLS_CTRL_LISTEN,0, (void *)peer) +# define SSL_session_reused(ssl) \ + SSL_ctrl((ssl),SSL_CTRL_GET_SESSION_REUSED,0,NULL) +# define SSL_num_renegotiations(ssl) \ + SSL_ctrl((ssl),SSL_CTRL_GET_NUM_RENEGOTIATIONS,0,NULL) +# define SSL_clear_num_renegotiations(ssl) \ + SSL_ctrl((ssl),SSL_CTRL_CLEAR_NUM_RENEGOTIATIONS,0,NULL) +# define SSL_total_renegotiations(ssl) \ + SSL_ctrl((ssl),SSL_CTRL_GET_TOTAL_RENEGOTIATIONS,0,NULL) +# define SSL_CTX_need_tmp_RSA(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_NEED_TMP_RSA,0,NULL) +# define SSL_CTX_set_tmp_rsa(ctx,rsa) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_RSA,0,(char *)rsa) +# define SSL_CTX_set_tmp_dh(ctx,dh) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_DH,0,(char *)dh) +# define SSL_CTX_set_tmp_ecdh(ctx,ecdh) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_ECDH,0,(char *)ecdh) +# define SSL_need_tmp_RSA(ssl) \ + SSL_ctrl(ssl,SSL_CTRL_NEED_TMP_RSA,0,NULL) +# define SSL_set_tmp_rsa(ssl,rsa) \ + SSL_ctrl(ssl,SSL_CTRL_SET_TMP_RSA,0,(char *)rsa) +# define SSL_set_tmp_dh(ssl,dh) \ + SSL_ctrl(ssl,SSL_CTRL_SET_TMP_DH,0,(char *)dh) +# define SSL_set_tmp_ecdh(ssl,ecdh) \ + SSL_ctrl(ssl,SSL_CTRL_SET_TMP_ECDH,0,(char *)ecdh) +# define SSL_CTX_add_extra_chain_cert(ctx,x509) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_EXTRA_CHAIN_CERT,0,(char *)x509) +# define SSL_CTX_get_extra_chain_certs(ctx,px509) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_GET_EXTRA_CHAIN_CERTS,0,px509) +# define SSL_CTX_get_extra_chain_certs_only(ctx,px509) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_GET_EXTRA_CHAIN_CERTS,1,px509) +# define SSL_CTX_clear_extra_chain_certs(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS,0,NULL) +# define SSL_CTX_set0_chain(ctx,sk) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_CHAIN,0,(char *)sk) +# define SSL_CTX_set1_chain(ctx,sk) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_CHAIN,1,(char *)sk) +# define SSL_CTX_add0_chain_cert(ctx,x509) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_CHAIN_CERT,0,(char *)x509) +# define SSL_CTX_add1_chain_cert(ctx,x509) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_CHAIN_CERT,1,(char *)x509) +# define SSL_CTX_get0_chain_certs(ctx,px509) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_GET_CHAIN_CERTS,0,px509) +# define SSL_CTX_clear_chain_certs(ctx) \ + SSL_CTX_set0_chain(ctx,NULL) +# define SSL_CTX_build_cert_chain(ctx, flags) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_BUILD_CERT_CHAIN, flags, NULL) +# define SSL_CTX_select_current_cert(ctx,x509) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SELECT_CURRENT_CERT,0,(char *)x509) +# define SSL_CTX_set_current_cert(ctx, op) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CURRENT_CERT, op, NULL) +# define SSL_CTX_set0_verify_cert_store(ctx,st) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_VERIFY_CERT_STORE,0,(char *)st) +# define SSL_CTX_set1_verify_cert_store(ctx,st) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_VERIFY_CERT_STORE,1,(char *)st) +# define SSL_CTX_set0_chain_cert_store(ctx,st) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CHAIN_CERT_STORE,0,(char *)st) +# define SSL_CTX_set1_chain_cert_store(ctx,st) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CHAIN_CERT_STORE,1,(char *)st) +# define SSL_set0_chain(ctx,sk) \ + SSL_ctrl(ctx,SSL_CTRL_CHAIN,0,(char *)sk) +# define SSL_set1_chain(ctx,sk) \ + SSL_ctrl(ctx,SSL_CTRL_CHAIN,1,(char *)sk) +# define SSL_add0_chain_cert(ctx,x509) \ + SSL_ctrl(ctx,SSL_CTRL_CHAIN_CERT,0,(char *)x509) +# define SSL_add1_chain_cert(ctx,x509) \ + SSL_ctrl(ctx,SSL_CTRL_CHAIN_CERT,1,(char *)x509) +# define SSL_get0_chain_certs(ctx,px509) \ + SSL_ctrl(ctx,SSL_CTRL_GET_CHAIN_CERTS,0,px509) +# define SSL_clear_chain_certs(ctx) \ + SSL_set0_chain(ctx,NULL) +# define SSL_build_cert_chain(s, flags) \ + SSL_ctrl(s,SSL_CTRL_BUILD_CERT_CHAIN, flags, NULL) +# define SSL_select_current_cert(ctx,x509) \ + SSL_ctrl(ctx,SSL_CTRL_SELECT_CURRENT_CERT,0,(char *)x509) +# define SSL_set_current_cert(ctx,op) \ + SSL_ctrl(ctx,SSL_CTRL_SET_CURRENT_CERT, op, NULL) +# define SSL_set0_verify_cert_store(s,st) \ + SSL_ctrl(s,SSL_CTRL_SET_VERIFY_CERT_STORE,0,(char *)st) +# define SSL_set1_verify_cert_store(s,st) \ + SSL_ctrl(s,SSL_CTRL_SET_VERIFY_CERT_STORE,1,(char *)st) +# define SSL_set0_chain_cert_store(s,st) \ + SSL_ctrl(s,SSL_CTRL_SET_CHAIN_CERT_STORE,0,(char *)st) +# define SSL_set1_chain_cert_store(s,st) \ + SSL_ctrl(s,SSL_CTRL_SET_CHAIN_CERT_STORE,1,(char *)st) +# define SSL_get1_curves(ctx, s) \ + SSL_ctrl(ctx,SSL_CTRL_GET_CURVES,0,(char *)s) +# define SSL_CTX_set1_curves(ctx, clist, clistlen) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CURVES,clistlen,(char *)clist) +# define SSL_CTX_set1_curves_list(ctx, s) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CURVES_LIST,0,(char *)s) +# define SSL_set1_curves(ctx, clist, clistlen) \ + SSL_ctrl(ctx,SSL_CTRL_SET_CURVES,clistlen,(char *)clist) +# define SSL_set1_curves_list(ctx, s) \ + SSL_ctrl(ctx,SSL_CTRL_SET_CURVES_LIST,0,(char *)s) +# define SSL_get_shared_curve(s, n) \ + SSL_ctrl(s,SSL_CTRL_GET_SHARED_CURVE,n,NULL) +# define SSL_CTX_set_ecdh_auto(ctx, onoff) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_ECDH_AUTO,onoff,NULL) +# define SSL_set_ecdh_auto(s, onoff) \ + SSL_ctrl(s,SSL_CTRL_SET_ECDH_AUTO,onoff,NULL) +# define SSL_CTX_set1_sigalgs(ctx, slist, slistlen) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SIGALGS,slistlen,(int *)slist) +# define SSL_CTX_set1_sigalgs_list(ctx, s) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SIGALGS_LIST,0,(char *)s) +# define SSL_set1_sigalgs(ctx, slist, slistlen) \ + SSL_ctrl(ctx,SSL_CTRL_SET_SIGALGS,slistlen,(int *)slist) +# define SSL_set1_sigalgs_list(ctx, s) \ + SSL_ctrl(ctx,SSL_CTRL_SET_SIGALGS_LIST,0,(char *)s) +# define SSL_CTX_set1_client_sigalgs(ctx, slist, slistlen) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CLIENT_SIGALGS,slistlen,(int *)slist) +# define SSL_CTX_set1_client_sigalgs_list(ctx, s) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CLIENT_SIGALGS_LIST,0,(char *)s) +# define SSL_set1_client_sigalgs(ctx, slist, slistlen) \ + SSL_ctrl(ctx,SSL_CTRL_SET_CLIENT_SIGALGS,clistlen,(int *)slist) +# define SSL_set1_client_sigalgs_list(ctx, s) \ + SSL_ctrl(ctx,SSL_CTRL_SET_CLIENT_SIGALGS_LIST,0,(char *)s) +# define SSL_get0_certificate_types(s, clist) \ + SSL_ctrl(s, SSL_CTRL_GET_CLIENT_CERT_TYPES, 0, (char *)clist) +# define SSL_CTX_set1_client_certificate_types(ctx, clist, clistlen) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CLIENT_CERT_TYPES,clistlen,(char *)clist) +# define SSL_set1_client_certificate_types(s, clist, clistlen) \ + SSL_ctrl(s,SSL_CTRL_SET_CLIENT_CERT_TYPES,clistlen,(char *)clist) +# define SSL_get_peer_signature_nid(s, pn) \ + SSL_ctrl(s,SSL_CTRL_GET_PEER_SIGNATURE_NID,0,pn) +# define SSL_get_server_tmp_key(s, pk) \ + SSL_ctrl(s,SSL_CTRL_GET_SERVER_TMP_KEY,0,pk) +# define SSL_get0_raw_cipherlist(s, plst) \ + SSL_ctrl(s,SSL_CTRL_GET_RAW_CIPHERLIST,0,(char *)plst) +# define SSL_get0_ec_point_formats(s, plst) \ + SSL_ctrl(s,SSL_CTRL_GET_EC_POINT_FORMATS,0,(char *)plst) +# ifndef OPENSSL_NO_BIO +BIO_METHOD *BIO_f_ssl(void); +BIO *BIO_new_ssl(SSL_CTX *ctx, int client); +BIO *BIO_new_ssl_connect(SSL_CTX *ctx); +BIO *BIO_new_buffer_ssl_connect(SSL_CTX *ctx); +int BIO_ssl_copy_session_id(BIO *to, BIO *from); +void BIO_ssl_shutdown(BIO *ssl_bio); + +# endif + +int SSL_CTX_set_cipher_list(SSL_CTX *, const char *str); +SSL_CTX *SSL_CTX_new(const SSL_METHOD *meth); +void SSL_CTX_free(SSL_CTX *); +long SSL_CTX_set_timeout(SSL_CTX *ctx, long t); +long SSL_CTX_get_timeout(const SSL_CTX *ctx); +X509_STORE *SSL_CTX_get_cert_store(const SSL_CTX *); +void SSL_CTX_set_cert_store(SSL_CTX *, X509_STORE *); +int SSL_want(const SSL *s); +int SSL_clear(SSL *s); + +void SSL_CTX_flush_sessions(SSL_CTX *ctx, long tm); + +const SSL_CIPHER *SSL_get_current_cipher(const SSL *s); +int SSL_CIPHER_get_bits(const SSL_CIPHER *c, int *alg_bits); +char *SSL_CIPHER_get_version(const SSL_CIPHER *c); +const char *SSL_CIPHER_get_name(const SSL_CIPHER *c); +unsigned long SSL_CIPHER_get_id(const SSL_CIPHER *c); + +int SSL_get_fd(const SSL *s); +int SSL_get_rfd(const SSL *s); +int SSL_get_wfd(const SSL *s); +const char *SSL_get_cipher_list(const SSL *s, int n); +char *SSL_get_shared_ciphers(const SSL *s, char *buf, int len); +int SSL_get_read_ahead(const SSL *s); +int SSL_pending(const SSL *s); +# ifndef OPENSSL_NO_SOCK +int SSL_set_fd(SSL *s, int fd); +int SSL_set_rfd(SSL *s, int fd); +int SSL_set_wfd(SSL *s, int fd); +# endif +# ifndef OPENSSL_NO_BIO +void SSL_set_bio(SSL *s, BIO *rbio, BIO *wbio); +BIO *SSL_get_rbio(const SSL *s); +BIO *SSL_get_wbio(const SSL *s); +# endif +int SSL_set_cipher_list(SSL *s, const char *str); +void SSL_set_read_ahead(SSL *s, int yes); +int SSL_get_verify_mode(const SSL *s); +int SSL_get_verify_depth(const SSL *s); +int (*SSL_get_verify_callback(const SSL *s)) (int, X509_STORE_CTX *); +void SSL_set_verify(SSL *s, int mode, + int (*callback) (int ok, X509_STORE_CTX *ctx)); +void SSL_set_verify_depth(SSL *s, int depth); +void SSL_set_cert_cb(SSL *s, int (*cb) (SSL *ssl, void *arg), void *arg); +# ifndef OPENSSL_NO_RSA +int SSL_use_RSAPrivateKey(SSL *ssl, RSA *rsa); +# endif +int SSL_use_RSAPrivateKey_ASN1(SSL *ssl, unsigned char *d, long len); +int SSL_use_PrivateKey(SSL *ssl, EVP_PKEY *pkey); +int SSL_use_PrivateKey_ASN1(int pk, SSL *ssl, const unsigned char *d, + long len); +int SSL_use_certificate(SSL *ssl, X509 *x); +int SSL_use_certificate_ASN1(SSL *ssl, const unsigned char *d, int len); + +# ifndef OPENSSL_NO_TLSEXT +/* Set serverinfo data for the current active cert. */ +int SSL_CTX_use_serverinfo(SSL_CTX *ctx, const unsigned char *serverinfo, + size_t serverinfo_length); +# ifndef OPENSSL_NO_STDIO +int SSL_CTX_use_serverinfo_file(SSL_CTX *ctx, const char *file); +# endif /* NO_STDIO */ + +# endif + +# ifndef OPENSSL_NO_STDIO +int SSL_use_RSAPrivateKey_file(SSL *ssl, const char *file, int type); +int SSL_use_PrivateKey_file(SSL *ssl, const char *file, int type); +int SSL_use_certificate_file(SSL *ssl, const char *file, int type); +int SSL_CTX_use_RSAPrivateKey_file(SSL_CTX *ctx, const char *file, int type); +int SSL_CTX_use_PrivateKey_file(SSL_CTX *ctx, const char *file, int type); +int SSL_CTX_use_certificate_file(SSL_CTX *ctx, const char *file, int type); +/* PEM type */ +int SSL_CTX_use_certificate_chain_file(SSL_CTX *ctx, const char *file); +STACK_OF(X509_NAME) *SSL_load_client_CA_file(const char *file); +int SSL_add_file_cert_subjects_to_stack(STACK_OF(X509_NAME) *stackCAs, + const char *file); +# ifndef OPENSSL_SYS_VMS +/* XXXXX: Better scheme needed! [was: #ifndef MAC_OS_pre_X] */ +# ifndef OPENSSL_SYS_MACINTOSH_CLASSIC +int SSL_add_dir_cert_subjects_to_stack(STACK_OF(X509_NAME) *stackCAs, + const char *dir); +# endif +# endif + +# endif + +void SSL_load_error_strings(void); +const char *SSL_state_string(const SSL *s); +const char *SSL_rstate_string(const SSL *s); +const char *SSL_state_string_long(const SSL *s); +const char *SSL_rstate_string_long(const SSL *s); +long SSL_SESSION_get_time(const SSL_SESSION *s); +long SSL_SESSION_set_time(SSL_SESSION *s, long t); +long SSL_SESSION_get_timeout(const SSL_SESSION *s); +long SSL_SESSION_set_timeout(SSL_SESSION *s, long t); +void SSL_copy_session_id(SSL *to, const SSL *from); +X509 *SSL_SESSION_get0_peer(SSL_SESSION *s); +int SSL_SESSION_set1_id_context(SSL_SESSION *s, const unsigned char *sid_ctx, + unsigned int sid_ctx_len); + +SSL_SESSION *SSL_SESSION_new(void); +const unsigned char *SSL_SESSION_get_id(const SSL_SESSION *s, + unsigned int *len); +unsigned int SSL_SESSION_get_compress_id(const SSL_SESSION *s); +# ifndef OPENSSL_NO_FP_API +int SSL_SESSION_print_fp(FILE *fp, const SSL_SESSION *ses); +# endif +# ifndef OPENSSL_NO_BIO +int SSL_SESSION_print(BIO *fp, const SSL_SESSION *ses); +# endif +void SSL_SESSION_free(SSL_SESSION *ses); +int i2d_SSL_SESSION(SSL_SESSION *in, unsigned char **pp); +int SSL_set_session(SSL *to, SSL_SESSION *session); +int SSL_CTX_add_session(SSL_CTX *s, SSL_SESSION *c); +int SSL_CTX_remove_session(SSL_CTX *, SSL_SESSION *c); +int SSL_CTX_set_generate_session_id(SSL_CTX *, GEN_SESSION_CB); +int SSL_set_generate_session_id(SSL *, GEN_SESSION_CB); +int SSL_has_matching_session_id(const SSL *ssl, const unsigned char *id, + unsigned int id_len); +SSL_SESSION *d2i_SSL_SESSION(SSL_SESSION **a, const unsigned char **pp, + long length); + +# ifdef HEADER_X509_H +X509 *SSL_get_peer_certificate(const SSL *s); +# endif + +STACK_OF(X509) *SSL_get_peer_cert_chain(const SSL *s); + +int SSL_CTX_get_verify_mode(const SSL_CTX *ctx); +int SSL_CTX_get_verify_depth(const SSL_CTX *ctx); +int (*SSL_CTX_get_verify_callback(const SSL_CTX *ctx)) (int, + X509_STORE_CTX *); +void SSL_CTX_set_verify(SSL_CTX *ctx, int mode, + int (*callback) (int, X509_STORE_CTX *)); +void SSL_CTX_set_verify_depth(SSL_CTX *ctx, int depth); +void SSL_CTX_set_cert_verify_callback(SSL_CTX *ctx, + int (*cb) (X509_STORE_CTX *, void *), + void *arg); +void SSL_CTX_set_cert_cb(SSL_CTX *c, int (*cb) (SSL *ssl, void *arg), + void *arg); +# ifndef OPENSSL_NO_RSA +int SSL_CTX_use_RSAPrivateKey(SSL_CTX *ctx, RSA *rsa); +# endif +int SSL_CTX_use_RSAPrivateKey_ASN1(SSL_CTX *ctx, const unsigned char *d, + long len); +int SSL_CTX_use_PrivateKey(SSL_CTX *ctx, EVP_PKEY *pkey); +int SSL_CTX_use_PrivateKey_ASN1(int pk, SSL_CTX *ctx, + const unsigned char *d, long len); +int SSL_CTX_use_certificate(SSL_CTX *ctx, X509 *x); +int SSL_CTX_use_certificate_ASN1(SSL_CTX *ctx, int len, + const unsigned char *d); + +void SSL_CTX_set_default_passwd_cb(SSL_CTX *ctx, pem_password_cb *cb); +void SSL_CTX_set_default_passwd_cb_userdata(SSL_CTX *ctx, void *u); + +int SSL_CTX_check_private_key(const SSL_CTX *ctx); +int SSL_check_private_key(const SSL *ctx); + +int SSL_CTX_set_session_id_context(SSL_CTX *ctx, const unsigned char *sid_ctx, + unsigned int sid_ctx_len); + +SSL *SSL_new(SSL_CTX *ctx); +int SSL_set_session_id_context(SSL *ssl, const unsigned char *sid_ctx, + unsigned int sid_ctx_len); + +int SSL_CTX_set_purpose(SSL_CTX *s, int purpose); +int SSL_set_purpose(SSL *s, int purpose); +int SSL_CTX_set_trust(SSL_CTX *s, int trust); +int SSL_set_trust(SSL *s, int trust); + +int SSL_CTX_set1_param(SSL_CTX *ctx, X509_VERIFY_PARAM *vpm); +int SSL_set1_param(SSL *ssl, X509_VERIFY_PARAM *vpm); + +X509_VERIFY_PARAM *SSL_CTX_get0_param(SSL_CTX *ctx); +X509_VERIFY_PARAM *SSL_get0_param(SSL *ssl); + +# ifndef OPENSSL_NO_SRP +int SSL_CTX_set_srp_username(SSL_CTX *ctx, char *name); +int SSL_CTX_set_srp_password(SSL_CTX *ctx, char *password); +int SSL_CTX_set_srp_strength(SSL_CTX *ctx, int strength); +int SSL_CTX_set_srp_client_pwd_callback(SSL_CTX *ctx, + char *(*cb) (SSL *, void *)); +int SSL_CTX_set_srp_verify_param_callback(SSL_CTX *ctx, + int (*cb) (SSL *, void *)); +int SSL_CTX_set_srp_username_callback(SSL_CTX *ctx, + int (*cb) (SSL *, int *, void *)); +int SSL_CTX_set_srp_cb_arg(SSL_CTX *ctx, void *arg); + +int SSL_set_srp_server_param(SSL *s, const BIGNUM *N, const BIGNUM *g, + BIGNUM *sa, BIGNUM *v, char *info); +int SSL_set_srp_server_param_pw(SSL *s, const char *user, const char *pass, + const char *grp); + +BIGNUM *SSL_get_srp_g(SSL *s); +BIGNUM *SSL_get_srp_N(SSL *s); + +char *SSL_get_srp_username(SSL *s); +char *SSL_get_srp_userinfo(SSL *s); +# endif + +void SSL_certs_clear(SSL *s); +void SSL_free(SSL *ssl); +int SSL_accept(SSL *ssl); +int SSL_connect(SSL *ssl); +int SSL_read(SSL *ssl, void *buf, int num); +int SSL_peek(SSL *ssl, void *buf, int num); +int SSL_write(SSL *ssl, const void *buf, int num); +long SSL_ctrl(SSL *ssl, int cmd, long larg, void *parg); +long SSL_callback_ctrl(SSL *, int, void (*)(void)); +long SSL_CTX_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg); +long SSL_CTX_callback_ctrl(SSL_CTX *, int, void (*)(void)); + +int SSL_get_error(const SSL *s, int ret_code); +const char *SSL_get_version(const SSL *s); + +/* This sets the 'default' SSL version that SSL_new() will create */ +int SSL_CTX_set_ssl_version(SSL_CTX *ctx, const SSL_METHOD *meth); + +# ifndef OPENSSL_NO_SSL2_METHOD +const SSL_METHOD *SSLv2_method(void); /* SSLv2 */ +const SSL_METHOD *SSLv2_server_method(void); /* SSLv2 */ +const SSL_METHOD *SSLv2_client_method(void); /* SSLv2 */ +# endif + +# ifndef OPENSSL_NO_SSL3_METHOD +const SSL_METHOD *SSLv3_method(void); /* SSLv3 */ +const SSL_METHOD *SSLv3_server_method(void); /* SSLv3 */ +const SSL_METHOD *SSLv3_client_method(void); /* SSLv3 */ +# endif + +const SSL_METHOD *SSLv23_method(void); /* Negotiate highest available SSL/TLS + * version */ +const SSL_METHOD *SSLv23_server_method(void); /* Negotiate highest available + * SSL/TLS version */ +const SSL_METHOD *SSLv23_client_method(void); /* Negotiate highest available + * SSL/TLS version */ + +const SSL_METHOD *TLSv1_method(void); /* TLSv1.0 */ +const SSL_METHOD *TLSv1_server_method(void); /* TLSv1.0 */ +const SSL_METHOD *TLSv1_client_method(void); /* TLSv1.0 */ + +const SSL_METHOD *TLSv1_1_method(void); /* TLSv1.1 */ +const SSL_METHOD *TLSv1_1_server_method(void); /* TLSv1.1 */ +const SSL_METHOD *TLSv1_1_client_method(void); /* TLSv1.1 */ + +const SSL_METHOD *TLSv1_2_method(void); /* TLSv1.2 */ +const SSL_METHOD *TLSv1_2_server_method(void); /* TLSv1.2 */ +const SSL_METHOD *TLSv1_2_client_method(void); /* TLSv1.2 */ + +const SSL_METHOD *DTLSv1_method(void); /* DTLSv1.0 */ +const SSL_METHOD *DTLSv1_server_method(void); /* DTLSv1.0 */ +const SSL_METHOD *DTLSv1_client_method(void); /* DTLSv1.0 */ + +const SSL_METHOD *DTLSv1_2_method(void); /* DTLSv1.2 */ +const SSL_METHOD *DTLSv1_2_server_method(void); /* DTLSv1.2 */ +const SSL_METHOD *DTLSv1_2_client_method(void); /* DTLSv1.2 */ + +const SSL_METHOD *DTLS_method(void); /* DTLS 1.0 and 1.2 */ +const SSL_METHOD *DTLS_server_method(void); /* DTLS 1.0 and 1.2 */ +const SSL_METHOD *DTLS_client_method(void); /* DTLS 1.0 and 1.2 */ + +STACK_OF(SSL_CIPHER) *SSL_get_ciphers(const SSL *s); + +int SSL_do_handshake(SSL *s); +int SSL_renegotiate(SSL *s); +int SSL_renegotiate_abbreviated(SSL *s); +int SSL_renegotiate_pending(SSL *s); +int SSL_shutdown(SSL *s); + +const SSL_METHOD *SSL_CTX_get_ssl_method(SSL_CTX *ctx); +const SSL_METHOD *SSL_get_ssl_method(SSL *s); +int SSL_set_ssl_method(SSL *s, const SSL_METHOD *method); +const char *SSL_alert_type_string_long(int value); +const char *SSL_alert_type_string(int value); +const char *SSL_alert_desc_string_long(int value); +const char *SSL_alert_desc_string(int value); + +void SSL_set_client_CA_list(SSL *s, STACK_OF(X509_NAME) *name_list); +void SSL_CTX_set_client_CA_list(SSL_CTX *ctx, STACK_OF(X509_NAME) *name_list); +STACK_OF(X509_NAME) *SSL_get_client_CA_list(const SSL *s); +STACK_OF(X509_NAME) *SSL_CTX_get_client_CA_list(const SSL_CTX *s); +int SSL_add_client_CA(SSL *ssl, X509 *x); +int SSL_CTX_add_client_CA(SSL_CTX *ctx, X509 *x); + +void SSL_set_connect_state(SSL *s); +void SSL_set_accept_state(SSL *s); + +long SSL_get_default_timeout(const SSL *s); + +int SSL_library_init(void); + +char *SSL_CIPHER_description(const SSL_CIPHER *, char *buf, int size); +STACK_OF(X509_NAME) *SSL_dup_CA_list(STACK_OF(X509_NAME) *sk); + +SSL *SSL_dup(SSL *ssl); + +X509 *SSL_get_certificate(const SSL *ssl); +/* + * EVP_PKEY + */ struct evp_pkey_st *SSL_get_privatekey(const SSL *ssl); + +X509 *SSL_CTX_get0_certificate(const SSL_CTX *ctx); +EVP_PKEY *SSL_CTX_get0_privatekey(const SSL_CTX *ctx); + +void SSL_CTX_set_quiet_shutdown(SSL_CTX *ctx, int mode); +int SSL_CTX_get_quiet_shutdown(const SSL_CTX *ctx); +void SSL_set_quiet_shutdown(SSL *ssl, int mode); +int SSL_get_quiet_shutdown(const SSL *ssl); +void SSL_set_shutdown(SSL *ssl, int mode); +int SSL_get_shutdown(const SSL *ssl); +int SSL_version(const SSL *ssl); +int SSL_CTX_set_default_verify_paths(SSL_CTX *ctx); +int SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *CAfile, + const char *CApath); +# define SSL_get0_session SSL_get_session/* just peek at pointer */ +SSL_SESSION *SSL_get_session(const SSL *ssl); +SSL_SESSION *SSL_get1_session(SSL *ssl); /* obtain a reference count */ +SSL_CTX *SSL_get_SSL_CTX(const SSL *ssl); +SSL_CTX *SSL_set_SSL_CTX(SSL *ssl, SSL_CTX *ctx); +void SSL_set_info_callback(SSL *ssl, + void (*cb) (const SSL *ssl, int type, int val)); +void (*SSL_get_info_callback(const SSL *ssl)) (const SSL *ssl, int type, + int val); +int SSL_state(const SSL *ssl); +void SSL_set_state(SSL *ssl, int state); + +void SSL_set_verify_result(SSL *ssl, long v); +long SSL_get_verify_result(const SSL *ssl); + +int SSL_set_ex_data(SSL *ssl, int idx, void *data); +void *SSL_get_ex_data(const SSL *ssl, int idx); +int SSL_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); + +int SSL_SESSION_set_ex_data(SSL_SESSION *ss, int idx, void *data); +void *SSL_SESSION_get_ex_data(const SSL_SESSION *ss, int idx); +int SSL_SESSION_get_ex_new_index(long argl, void *argp, + CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, + CRYPTO_EX_free *free_func); + +int SSL_CTX_set_ex_data(SSL_CTX *ssl, int idx, void *data); +void *SSL_CTX_get_ex_data(const SSL_CTX *ssl, int idx); +int SSL_CTX_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, + CRYPTO_EX_free *free_func); + +int SSL_get_ex_data_X509_STORE_CTX_idx(void); + +# define SSL_CTX_sess_set_cache_size(ctx,t) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SESS_CACHE_SIZE,t,NULL) +# define SSL_CTX_sess_get_cache_size(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_GET_SESS_CACHE_SIZE,0,NULL) +# define SSL_CTX_set_session_cache_mode(ctx,m) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SESS_CACHE_MODE,m,NULL) +# define SSL_CTX_get_session_cache_mode(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_GET_SESS_CACHE_MODE,0,NULL) + +# define SSL_CTX_get_default_read_ahead(ctx) SSL_CTX_get_read_ahead(ctx) +# define SSL_CTX_set_default_read_ahead(ctx,m) SSL_CTX_set_read_ahead(ctx,m) +# define SSL_CTX_get_read_ahead(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_GET_READ_AHEAD,0,NULL) +# define SSL_CTX_set_read_ahead(ctx,m) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_READ_AHEAD,m,NULL) +# define SSL_CTX_get_max_cert_list(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_GET_MAX_CERT_LIST,0,NULL) +# define SSL_CTX_set_max_cert_list(ctx,m) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_MAX_CERT_LIST,m,NULL) +# define SSL_get_max_cert_list(ssl) \ + SSL_ctrl(ssl,SSL_CTRL_GET_MAX_CERT_LIST,0,NULL) +# define SSL_set_max_cert_list(ssl,m) \ + SSL_ctrl(ssl,SSL_CTRL_SET_MAX_CERT_LIST,m,NULL) + +# define SSL_CTX_set_max_send_fragment(ctx,m) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_MAX_SEND_FRAGMENT,m,NULL) +# define SSL_set_max_send_fragment(ssl,m) \ + SSL_ctrl(ssl,SSL_CTRL_SET_MAX_SEND_FRAGMENT,m,NULL) + + /* NB: the keylength is only applicable when is_export is true */ +# ifndef OPENSSL_NO_RSA +void SSL_CTX_set_tmp_rsa_callback(SSL_CTX *ctx, + RSA *(*cb) (SSL *ssl, int is_export, + int keylength)); + +void SSL_set_tmp_rsa_callback(SSL *ssl, + RSA *(*cb) (SSL *ssl, int is_export, + int keylength)); +# endif +# ifndef OPENSSL_NO_DH +void SSL_CTX_set_tmp_dh_callback(SSL_CTX *ctx, + DH *(*dh) (SSL *ssl, int is_export, + int keylength)); +void SSL_set_tmp_dh_callback(SSL *ssl, + DH *(*dh) (SSL *ssl, int is_export, + int keylength)); +# endif +# ifndef OPENSSL_NO_ECDH +void SSL_CTX_set_tmp_ecdh_callback(SSL_CTX *ctx, + EC_KEY *(*ecdh) (SSL *ssl, int is_export, + int keylength)); +void SSL_set_tmp_ecdh_callback(SSL *ssl, + EC_KEY *(*ecdh) (SSL *ssl, int is_export, + int keylength)); +# endif + +const COMP_METHOD *SSL_get_current_compression(SSL *s); +const COMP_METHOD *SSL_get_current_expansion(SSL *s); +const char *SSL_COMP_get_name(const COMP_METHOD *comp); +STACK_OF(SSL_COMP) *SSL_COMP_get_compression_methods(void); +STACK_OF(SSL_COMP) *SSL_COMP_set0_compression_methods(STACK_OF(SSL_COMP) + *meths); +void SSL_COMP_free_compression_methods(void); +int SSL_COMP_add_compression_method(int id, COMP_METHOD *cm); + +const SSL_CIPHER *SSL_CIPHER_find(SSL *ssl, const unsigned char *ptr); + +/* TLS extensions functions */ +int SSL_set_session_ticket_ext(SSL *s, void *ext_data, int ext_len); + +int SSL_set_session_ticket_ext_cb(SSL *s, tls_session_ticket_ext_cb_fn cb, + void *arg); + +/* Pre-shared secret session resumption functions */ +int SSL_set_session_secret_cb(SSL *s, + tls_session_secret_cb_fn tls_session_secret_cb, + void *arg); + +void SSL_set_debug(SSL *s, int debug); +int SSL_cache_hit(SSL *s); +int SSL_is_server(SSL *s); + +SSL_CONF_CTX *SSL_CONF_CTX_new(void); +int SSL_CONF_CTX_finish(SSL_CONF_CTX *cctx); +void SSL_CONF_CTX_free(SSL_CONF_CTX *cctx); +unsigned int SSL_CONF_CTX_set_flags(SSL_CONF_CTX *cctx, unsigned int flags); +unsigned int SSL_CONF_CTX_clear_flags(SSL_CONF_CTX *cctx, unsigned int flags); +int SSL_CONF_CTX_set1_prefix(SSL_CONF_CTX *cctx, const char *pre); + +void SSL_CONF_CTX_set_ssl(SSL_CONF_CTX *cctx, SSL *ssl); +void SSL_CONF_CTX_set_ssl_ctx(SSL_CONF_CTX *cctx, SSL_CTX *ctx); + +int SSL_CONF_cmd(SSL_CONF_CTX *cctx, const char *cmd, const char *value); +int SSL_CONF_cmd_argv(SSL_CONF_CTX *cctx, int *pargc, char ***pargv); +int SSL_CONF_cmd_value_type(SSL_CONF_CTX *cctx, const char *cmd); + +# ifndef OPENSSL_NO_SSL_TRACE +void SSL_trace(int write_p, int version, int content_type, + const void *buf, size_t len, SSL *ssl, void *arg); +const char *SSL_CIPHER_standard_name(const SSL_CIPHER *c); +# endif + +# ifndef OPENSSL_NO_UNIT_TEST +const struct openssl_ssl_test_functions *SSL_test_functions(void); +# endif + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_SSL_strings(void); + +/* Error codes for the SSL functions. */ + +/* Function codes. */ +# define SSL_F_CHECK_SUITEB_CIPHER_LIST 331 +# define SSL_F_CLIENT_CERTIFICATE 100 +# define SSL_F_CLIENT_FINISHED 167 +# define SSL_F_CLIENT_HELLO 101 +# define SSL_F_CLIENT_MASTER_KEY 102 +# define SSL_F_D2I_SSL_SESSION 103 +# define SSL_F_DO_DTLS1_WRITE 245 +# define SSL_F_DO_SSL3_WRITE 104 +# define SSL_F_DTLS1_ACCEPT 246 +# define SSL_F_DTLS1_ADD_CERT_TO_BUF 295 +# define SSL_F_DTLS1_BUFFER_RECORD 247 +# define SSL_F_DTLS1_CHECK_TIMEOUT_NUM 316 +# define SSL_F_DTLS1_CLIENT_HELLO 248 +# define SSL_F_DTLS1_CONNECT 249 +# define SSL_F_DTLS1_ENC 250 +# define SSL_F_DTLS1_GET_HELLO_VERIFY 251 +# define SSL_F_DTLS1_GET_MESSAGE 252 +# define SSL_F_DTLS1_GET_MESSAGE_FRAGMENT 253 +# define SSL_F_DTLS1_GET_RECORD 254 +# define SSL_F_DTLS1_HANDLE_TIMEOUT 297 +# define SSL_F_DTLS1_HEARTBEAT 305 +# define SSL_F_DTLS1_OUTPUT_CERT_CHAIN 255 +# define SSL_F_DTLS1_PREPROCESS_FRAGMENT 288 +# define SSL_F_DTLS1_PROCESS_BUFFERED_RECORDS 424 +# define SSL_F_DTLS1_PROCESS_OUT_OF_SEQ_MESSAGE 256 +# define SSL_F_DTLS1_PROCESS_RECORD 257 +# define SSL_F_DTLS1_READ_BYTES 258 +# define SSL_F_DTLS1_READ_FAILED 259 +# define SSL_F_DTLS1_SEND_CERTIFICATE_REQUEST 260 +# define SSL_F_DTLS1_SEND_CLIENT_CERTIFICATE 261 +# define SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE 262 +# define SSL_F_DTLS1_SEND_CLIENT_VERIFY 263 +# define SSL_F_DTLS1_SEND_HELLO_VERIFY_REQUEST 264 +# define SSL_F_DTLS1_SEND_SERVER_CERTIFICATE 265 +# define SSL_F_DTLS1_SEND_SERVER_HELLO 266 +# define SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE 267 +# define SSL_F_DTLS1_WRITE_APP_DATA_BYTES 268 +# define SSL_F_GET_CLIENT_FINISHED 105 +# define SSL_F_GET_CLIENT_HELLO 106 +# define SSL_F_GET_CLIENT_MASTER_KEY 107 +# define SSL_F_GET_SERVER_FINISHED 108 +# define SSL_F_GET_SERVER_HELLO 109 +# define SSL_F_GET_SERVER_STATIC_DH_KEY 340 +# define SSL_F_GET_SERVER_VERIFY 110 +# define SSL_F_I2D_SSL_SESSION 111 +# define SSL_F_READ_N 112 +# define SSL_F_REQUEST_CERTIFICATE 113 +# define SSL_F_SERVER_FINISH 239 +# define SSL_F_SERVER_HELLO 114 +# define SSL_F_SERVER_VERIFY 240 +# define SSL_F_SSL23_ACCEPT 115 +# define SSL_F_SSL23_CLIENT_HELLO 116 +# define SSL_F_SSL23_CONNECT 117 +# define SSL_F_SSL23_GET_CLIENT_HELLO 118 +# define SSL_F_SSL23_GET_SERVER_HELLO 119 +# define SSL_F_SSL23_PEEK 237 +# define SSL_F_SSL23_READ 120 +# define SSL_F_SSL23_WRITE 121 +# define SSL_F_SSL2_ACCEPT 122 +# define SSL_F_SSL2_CONNECT 123 +# define SSL_F_SSL2_ENC_INIT 124 +# define SSL_F_SSL2_GENERATE_KEY_MATERIAL 241 +# define SSL_F_SSL2_PEEK 234 +# define SSL_F_SSL2_READ 125 +# define SSL_F_SSL2_READ_INTERNAL 236 +# define SSL_F_SSL2_SET_CERTIFICATE 126 +# define SSL_F_SSL2_WRITE 127 +# define SSL_F_SSL3_ACCEPT 128 +# define SSL_F_SSL3_ADD_CERT_TO_BUF 296 +# define SSL_F_SSL3_CALLBACK_CTRL 233 +# define SSL_F_SSL3_CHANGE_CIPHER_STATE 129 +# define SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM 130 +# define SSL_F_SSL3_CHECK_CLIENT_HELLO 304 +# define SSL_F_SSL3_CHECK_FINISHED 339 +# define SSL_F_SSL3_CLIENT_HELLO 131 +# define SSL_F_SSL3_CONNECT 132 +# define SSL_F_SSL3_CTRL 213 +# define SSL_F_SSL3_CTX_CTRL 133 +# define SSL_F_SSL3_DIGEST_CACHED_RECORDS 293 +# define SSL_F_SSL3_DO_CHANGE_CIPHER_SPEC 292 +# define SSL_F_SSL3_ENC 134 +# define SSL_F_SSL3_GENERATE_KEY_BLOCK 238 +# define SSL_F_SSL3_GENERATE_MASTER_SECRET 388 +# define SSL_F_SSL3_GET_CERTIFICATE_REQUEST 135 +# define SSL_F_SSL3_GET_CERT_STATUS 289 +# define SSL_F_SSL3_GET_CERT_VERIFY 136 +# define SSL_F_SSL3_GET_CLIENT_CERTIFICATE 137 +# define SSL_F_SSL3_GET_CLIENT_HELLO 138 +# define SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE 139 +# define SSL_F_SSL3_GET_FINISHED 140 +# define SSL_F_SSL3_GET_KEY_EXCHANGE 141 +# define SSL_F_SSL3_GET_MESSAGE 142 +# define SSL_F_SSL3_GET_NEW_SESSION_TICKET 283 +# define SSL_F_SSL3_GET_NEXT_PROTO 306 +# define SSL_F_SSL3_GET_RECORD 143 +# define SSL_F_SSL3_GET_SERVER_CERTIFICATE 144 +# define SSL_F_SSL3_GET_SERVER_DONE 145 +# define SSL_F_SSL3_GET_SERVER_HELLO 146 +# define SSL_F_SSL3_HANDSHAKE_MAC 285 +# define SSL_F_SSL3_NEW_SESSION_TICKET 287 +# define SSL_F_SSL3_OUTPUT_CERT_CHAIN 147 +# define SSL_F_SSL3_PEEK 235 +# define SSL_F_SSL3_READ_BYTES 148 +# define SSL_F_SSL3_READ_N 149 +# define SSL_F_SSL3_SEND_CERTIFICATE_REQUEST 150 +# define SSL_F_SSL3_SEND_CLIENT_CERTIFICATE 151 +# define SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE 152 +# define SSL_F_SSL3_SEND_CLIENT_VERIFY 153 +# define SSL_F_SSL3_SEND_SERVER_CERTIFICATE 154 +# define SSL_F_SSL3_SEND_SERVER_HELLO 242 +# define SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE 155 +# define SSL_F_SSL3_SETUP_KEY_BLOCK 157 +# define SSL_F_SSL3_SETUP_READ_BUFFER 156 +# define SSL_F_SSL3_SETUP_WRITE_BUFFER 291 +# define SSL_F_SSL3_WRITE_BYTES 158 +# define SSL_F_SSL3_WRITE_PENDING 159 +# define SSL_F_SSL_ADD_CERT_CHAIN 318 +# define SSL_F_SSL_ADD_CERT_TO_BUF 319 +# define SSL_F_SSL_ADD_CLIENTHELLO_RENEGOTIATE_EXT 298 +# define SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT 277 +# define SSL_F_SSL_ADD_CLIENTHELLO_USE_SRTP_EXT 307 +# define SSL_F_SSL_ADD_DIR_CERT_SUBJECTS_TO_STACK 215 +# define SSL_F_SSL_ADD_FILE_CERT_SUBJECTS_TO_STACK 216 +# define SSL_F_SSL_ADD_SERVERHELLO_RENEGOTIATE_EXT 299 +# define SSL_F_SSL_ADD_SERVERHELLO_TLSEXT 278 +# define SSL_F_SSL_ADD_SERVERHELLO_USE_SRTP_EXT 308 +# define SSL_F_SSL_BAD_METHOD 160 +# define SSL_F_SSL_BUILD_CERT_CHAIN 332 +# define SSL_F_SSL_BYTES_TO_CIPHER_LIST 161 +# define SSL_F_SSL_CERT_DUP 221 +# define SSL_F_SSL_CERT_INST 222 +# define SSL_F_SSL_CERT_INSTANTIATE 214 +# define SSL_F_SSL_CERT_NEW 162 +# define SSL_F_SSL_CHECK_PRIVATE_KEY 163 +# define SSL_F_SSL_CHECK_SERVERHELLO_TLSEXT 280 +# define SSL_F_SSL_CHECK_SRVR_ECC_CERT_AND_ALG 279 +# define SSL_F_SSL_CIPHER_PROCESS_RULESTR 230 +# define SSL_F_SSL_CIPHER_STRENGTH_SORT 231 +# define SSL_F_SSL_CLEAR 164 +# define SSL_F_SSL_COMP_ADD_COMPRESSION_METHOD 165 +# define SSL_F_SSL_CONF_CMD 334 +# define SSL_F_SSL_CREATE_CIPHER_LIST 166 +# define SSL_F_SSL_CTRL 232 +# define SSL_F_SSL_CTX_CHECK_PRIVATE_KEY 168 +# define SSL_F_SSL_CTX_MAKE_PROFILES 309 +# define SSL_F_SSL_CTX_NEW 169 +# define SSL_F_SSL_CTX_SET_CIPHER_LIST 269 +# define SSL_F_SSL_CTX_SET_CLIENT_CERT_ENGINE 290 +# define SSL_F_SSL_CTX_SET_PURPOSE 226 +# define SSL_F_SSL_CTX_SET_SESSION_ID_CONTEXT 219 +# define SSL_F_SSL_CTX_SET_SSL_VERSION 170 +# define SSL_F_SSL_CTX_SET_TRUST 229 +# define SSL_F_SSL_CTX_USE_CERTIFICATE 171 +# define SSL_F_SSL_CTX_USE_CERTIFICATE_ASN1 172 +# define SSL_F_SSL_CTX_USE_CERTIFICATE_CHAIN_FILE 220 +# define SSL_F_SSL_CTX_USE_CERTIFICATE_FILE 173 +# define SSL_F_SSL_CTX_USE_PRIVATEKEY 174 +# define SSL_F_SSL_CTX_USE_PRIVATEKEY_ASN1 175 +# define SSL_F_SSL_CTX_USE_PRIVATEKEY_FILE 176 +# define SSL_F_SSL_CTX_USE_PSK_IDENTITY_HINT 272 +# define SSL_F_SSL_CTX_USE_RSAPRIVATEKEY 177 +# define SSL_F_SSL_CTX_USE_RSAPRIVATEKEY_ASN1 178 +# define SSL_F_SSL_CTX_USE_RSAPRIVATEKEY_FILE 179 +# define SSL_F_SSL_CTX_USE_SERVERINFO 336 +# define SSL_F_SSL_CTX_USE_SERVERINFO_FILE 337 +# define SSL_F_SSL_DO_HANDSHAKE 180 +# define SSL_F_SSL_GET_NEW_SESSION 181 +# define SSL_F_SSL_GET_PREV_SESSION 217 +# define SSL_F_SSL_GET_SERVER_CERT_INDEX 322 +# define SSL_F_SSL_GET_SERVER_SEND_CERT 182 +# define SSL_F_SSL_GET_SERVER_SEND_PKEY 317 +# define SSL_F_SSL_GET_SIGN_PKEY 183 +# define SSL_F_SSL_INIT_WBIO_BUFFER 184 +# define SSL_F_SSL_LOAD_CLIENT_CA_FILE 185 +# define SSL_F_SSL_NEW 186 +# define SSL_F_SSL_PARSE_CLIENTHELLO_RENEGOTIATE_EXT 300 +# define SSL_F_SSL_PARSE_CLIENTHELLO_TLSEXT 302 +# define SSL_F_SSL_PARSE_CLIENTHELLO_USE_SRTP_EXT 310 +# define SSL_F_SSL_PARSE_SERVERHELLO_RENEGOTIATE_EXT 301 +# define SSL_F_SSL_PARSE_SERVERHELLO_TLSEXT 303 +# define SSL_F_SSL_PARSE_SERVERHELLO_USE_SRTP_EXT 311 +# define SSL_F_SSL_PEEK 270 +# define SSL_F_SSL_PREPARE_CLIENTHELLO_TLSEXT 281 +# define SSL_F_SSL_PREPARE_SERVERHELLO_TLSEXT 282 +# define SSL_F_SSL_READ 223 +# define SSL_F_SSL_RSA_PRIVATE_DECRYPT 187 +# define SSL_F_SSL_RSA_PUBLIC_ENCRYPT 188 +# define SSL_F_SSL_SCAN_CLIENTHELLO_TLSEXT 320 +# define SSL_F_SSL_SCAN_SERVERHELLO_TLSEXT 321 +# define SSL_F_SSL_SESSION_DUP 348 +# define SSL_F_SSL_SESSION_NEW 189 +# define SSL_F_SSL_SESSION_PRINT_FP 190 +# define SSL_F_SSL_SESSION_SET1_ID_CONTEXT 312 +# define SSL_F_SSL_SESS_CERT_NEW 225 +# define SSL_F_SSL_SET_CERT 191 +# define SSL_F_SSL_SET_CIPHER_LIST 271 +# define SSL_F_SSL_SET_FD 192 +# define SSL_F_SSL_SET_PKEY 193 +# define SSL_F_SSL_SET_PURPOSE 227 +# define SSL_F_SSL_SET_RFD 194 +# define SSL_F_SSL_SET_SESSION 195 +# define SSL_F_SSL_SET_SESSION_ID_CONTEXT 218 +# define SSL_F_SSL_SET_SESSION_TICKET_EXT 294 +# define SSL_F_SSL_SET_TRUST 228 +# define SSL_F_SSL_SET_WFD 196 +# define SSL_F_SSL_SHUTDOWN 224 +# define SSL_F_SSL_SRP_CTX_INIT 313 +# define SSL_F_SSL_UNDEFINED_CONST_FUNCTION 243 +# define SSL_F_SSL_UNDEFINED_FUNCTION 197 +# define SSL_F_SSL_UNDEFINED_VOID_FUNCTION 244 +# define SSL_F_SSL_USE_CERTIFICATE 198 +# define SSL_F_SSL_USE_CERTIFICATE_ASN1 199 +# define SSL_F_SSL_USE_CERTIFICATE_FILE 200 +# define SSL_F_SSL_USE_PRIVATEKEY 201 +# define SSL_F_SSL_USE_PRIVATEKEY_ASN1 202 +# define SSL_F_SSL_USE_PRIVATEKEY_FILE 203 +# define SSL_F_SSL_USE_PSK_IDENTITY_HINT 273 +# define SSL_F_SSL_USE_RSAPRIVATEKEY 204 +# define SSL_F_SSL_USE_RSAPRIVATEKEY_ASN1 205 +# define SSL_F_SSL_USE_RSAPRIVATEKEY_FILE 206 +# define SSL_F_SSL_VERIFY_CERT_CHAIN 207 +# define SSL_F_SSL_WRITE 208 +# define SSL_F_TLS12_CHECK_PEER_SIGALG 333 +# define SSL_F_TLS1_CERT_VERIFY_MAC 286 +# define SSL_F_TLS1_CHANGE_CIPHER_STATE 209 +# define SSL_F_TLS1_CHECK_SERVERHELLO_TLSEXT 274 +# define SSL_F_TLS1_ENC 210 +# define SSL_F_TLS1_EXPORT_KEYING_MATERIAL 314 +# define SSL_F_TLS1_GET_CURVELIST 338 +# define SSL_F_TLS1_HEARTBEAT 315 +# define SSL_F_TLS1_PREPARE_CLIENTHELLO_TLSEXT 275 +# define SSL_F_TLS1_PREPARE_SERVERHELLO_TLSEXT 276 +# define SSL_F_TLS1_PRF 284 +# define SSL_F_TLS1_SETUP_KEY_BLOCK 211 +# define SSL_F_TLS1_SET_SERVER_SIGALGS 335 +# define SSL_F_WRITE_PENDING 212 + +/* Reason codes. */ +# define SSL_R_APP_DATA_IN_HANDSHAKE 100 +# define SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT 272 +# define SSL_R_BAD_ALERT_RECORD 101 +# define SSL_R_BAD_AUTHENTICATION_TYPE 102 +# define SSL_R_BAD_CHANGE_CIPHER_SPEC 103 +# define SSL_R_BAD_CHECKSUM 104 +# define SSL_R_BAD_DATA 390 +# define SSL_R_BAD_DATA_RETURNED_BY_CALLBACK 106 +# define SSL_R_BAD_DECOMPRESSION 107 +# define SSL_R_BAD_DH_G_LENGTH 108 +# define SSL_R_BAD_DH_G_VALUE 375 +# define SSL_R_BAD_DH_PUB_KEY_LENGTH 109 +# define SSL_R_BAD_DH_PUB_KEY_VALUE 393 +# define SSL_R_BAD_DH_P_LENGTH 110 +# define SSL_R_BAD_DH_P_VALUE 395 +# define SSL_R_BAD_DIGEST_LENGTH 111 +# define SSL_R_BAD_DSA_SIGNATURE 112 +# define SSL_R_BAD_ECC_CERT 304 +# define SSL_R_BAD_ECDSA_SIGNATURE 305 +# define SSL_R_BAD_ECPOINT 306 +# define SSL_R_BAD_HANDSHAKE_LENGTH 332 +# define SSL_R_BAD_HELLO_REQUEST 105 +# define SSL_R_BAD_LENGTH 271 +# define SSL_R_BAD_MAC_DECODE 113 +# define SSL_R_BAD_MAC_LENGTH 333 +# define SSL_R_BAD_MESSAGE_TYPE 114 +# define SSL_R_BAD_PACKET_LENGTH 115 +# define SSL_R_BAD_PROTOCOL_VERSION_NUMBER 116 +# define SSL_R_BAD_PSK_IDENTITY_HINT_LENGTH 316 +# define SSL_R_BAD_RESPONSE_ARGUMENT 117 +# define SSL_R_BAD_RSA_DECRYPT 118 +# define SSL_R_BAD_RSA_ENCRYPT 119 +# define SSL_R_BAD_RSA_E_LENGTH 120 +# define SSL_R_BAD_RSA_MODULUS_LENGTH 121 +# define SSL_R_BAD_RSA_SIGNATURE 122 +# define SSL_R_BAD_SIGNATURE 123 +# define SSL_R_BAD_SRP_A_LENGTH 347 +# define SSL_R_BAD_SRP_B_LENGTH 348 +# define SSL_R_BAD_SRP_G_LENGTH 349 +# define SSL_R_BAD_SRP_N_LENGTH 350 +# define SSL_R_BAD_SRP_PARAMETERS 371 +# define SSL_R_BAD_SRP_S_LENGTH 351 +# define SSL_R_BAD_SRTP_MKI_VALUE 352 +# define SSL_R_BAD_SRTP_PROTECTION_PROFILE_LIST 353 +# define SSL_R_BAD_SSL_FILETYPE 124 +# define SSL_R_BAD_SSL_SESSION_ID_LENGTH 125 +# define SSL_R_BAD_STATE 126 +# define SSL_R_BAD_VALUE 384 +# define SSL_R_BAD_WRITE_RETRY 127 +# define SSL_R_BIO_NOT_SET 128 +# define SSL_R_BLOCK_CIPHER_PAD_IS_WRONG 129 +# define SSL_R_BN_LIB 130 +# define SSL_R_CA_DN_LENGTH_MISMATCH 131 +# define SSL_R_CA_DN_TOO_LONG 132 +# define SSL_R_CCS_RECEIVED_EARLY 133 +# define SSL_R_CERTIFICATE_VERIFY_FAILED 134 +# define SSL_R_CERT_CB_ERROR 377 +# define SSL_R_CERT_LENGTH_MISMATCH 135 +# define SSL_R_CHALLENGE_IS_DIFFERENT 136 +# define SSL_R_CIPHER_CODE_WRONG_LENGTH 137 +# define SSL_R_CIPHER_OR_HASH_UNAVAILABLE 138 +# define SSL_R_CIPHER_TABLE_SRC_ERROR 139 +# define SSL_R_CLIENTHELLO_TLSEXT 226 +# define SSL_R_COMPRESSED_LENGTH_TOO_LONG 140 +# define SSL_R_COMPRESSION_DISABLED 343 +# define SSL_R_COMPRESSION_FAILURE 141 +# define SSL_R_COMPRESSION_ID_NOT_WITHIN_PRIVATE_RANGE 307 +# define SSL_R_COMPRESSION_LIBRARY_ERROR 142 +# define SSL_R_CONNECTION_ID_IS_DIFFERENT 143 +# define SSL_R_CONNECTION_TYPE_NOT_SET 144 +# define SSL_R_COOKIE_MISMATCH 308 +# define SSL_R_DATA_BETWEEN_CCS_AND_FINISHED 145 +# define SSL_R_DATA_LENGTH_TOO_LONG 146 +# define SSL_R_DECRYPTION_FAILED 147 +# define SSL_R_DECRYPTION_FAILED_OR_BAD_RECORD_MAC 281 +# define SSL_R_DH_KEY_TOO_SMALL 372 +# define SSL_R_DH_PUBLIC_VALUE_LENGTH_IS_WRONG 148 +# define SSL_R_DIGEST_CHECK_FAILED 149 +# define SSL_R_DTLS_MESSAGE_TOO_BIG 334 +# define SSL_R_DUPLICATE_COMPRESSION_ID 309 +# define SSL_R_ECC_CERT_NOT_FOR_KEY_AGREEMENT 317 +# define SSL_R_ECC_CERT_NOT_FOR_SIGNING 318 +# define SSL_R_ECC_CERT_SHOULD_HAVE_RSA_SIGNATURE 322 +# define SSL_R_ECC_CERT_SHOULD_HAVE_SHA1_SIGNATURE 323 +# define SSL_R_ECDH_REQUIRED_FOR_SUITEB_MODE 374 +# define SSL_R_ECGROUP_TOO_LARGE_FOR_CIPHER 310 +# define SSL_R_EMPTY_SRTP_PROTECTION_PROFILE_LIST 354 +# define SSL_R_ENCRYPTED_LENGTH_TOO_LONG 150 +# define SSL_R_ERROR_GENERATING_TMP_RSA_KEY 282 +# define SSL_R_ERROR_IN_RECEIVED_CIPHER_LIST 151 +# define SSL_R_EXCESSIVE_MESSAGE_SIZE 152 +# define SSL_R_EXTRA_DATA_IN_MESSAGE 153 +# define SSL_R_GOT_A_FIN_BEFORE_A_CCS 154 +# define SSL_R_GOT_NEXT_PROTO_BEFORE_A_CCS 355 +# define SSL_R_GOT_NEXT_PROTO_WITHOUT_EXTENSION 356 +# define SSL_R_HTTPS_PROXY_REQUEST 155 +# define SSL_R_HTTP_REQUEST 156 +# define SSL_R_ILLEGAL_PADDING 283 +# define SSL_R_ILLEGAL_SUITEB_DIGEST 380 +# define SSL_R_INAPPROPRIATE_FALLBACK 373 +# define SSL_R_INCONSISTENT_COMPRESSION 340 +# define SSL_R_INVALID_CHALLENGE_LENGTH 158 +# define SSL_R_INVALID_COMMAND 280 +# define SSL_R_INVALID_COMPRESSION_ALGORITHM 341 +# define SSL_R_INVALID_NULL_CMD_NAME 385 +# define SSL_R_INVALID_PURPOSE 278 +# define SSL_R_INVALID_SERVERINFO_DATA 388 +# define SSL_R_INVALID_SRP_USERNAME 357 +# define SSL_R_INVALID_STATUS_RESPONSE 328 +# define SSL_R_INVALID_TICKET_KEYS_LENGTH 325 +# define SSL_R_INVALID_TRUST 279 +# define SSL_R_KEY_ARG_TOO_LONG 284 +# define SSL_R_KRB5 285 +# define SSL_R_KRB5_C_CC_PRINC 286 +# define SSL_R_KRB5_C_GET_CRED 287 +# define SSL_R_KRB5_C_INIT 288 +# define SSL_R_KRB5_C_MK_REQ 289 +# define SSL_R_KRB5_S_BAD_TICKET 290 +# define SSL_R_KRB5_S_INIT 291 +# define SSL_R_KRB5_S_RD_REQ 292 +# define SSL_R_KRB5_S_TKT_EXPIRED 293 +# define SSL_R_KRB5_S_TKT_NYV 294 +# define SSL_R_KRB5_S_TKT_SKEW 295 +# define SSL_R_LENGTH_MISMATCH 159 +# define SSL_R_LENGTH_TOO_SHORT 160 +# define SSL_R_LIBRARY_BUG 274 +# define SSL_R_LIBRARY_HAS_NO_CIPHERS 161 +# define SSL_R_MESSAGE_TOO_LONG 296 +# define SSL_R_MISSING_DH_DSA_CERT 162 +# define SSL_R_MISSING_DH_KEY 163 +# define SSL_R_MISSING_DH_RSA_CERT 164 +# define SSL_R_MISSING_DSA_SIGNING_CERT 165 +# define SSL_R_MISSING_ECDH_CERT 382 +# define SSL_R_MISSING_ECDSA_SIGNING_CERT 381 +# define SSL_R_MISSING_EXPORT_TMP_DH_KEY 166 +# define SSL_R_MISSING_EXPORT_TMP_RSA_KEY 167 +# define SSL_R_MISSING_RSA_CERTIFICATE 168 +# define SSL_R_MISSING_RSA_ENCRYPTING_CERT 169 +# define SSL_R_MISSING_RSA_SIGNING_CERT 170 +# define SSL_R_MISSING_SRP_PARAM 358 +# define SSL_R_MISSING_TMP_DH_KEY 171 +# define SSL_R_MISSING_TMP_ECDH_KEY 311 +# define SSL_R_MISSING_TMP_RSA_KEY 172 +# define SSL_R_MISSING_TMP_RSA_PKEY 173 +# define SSL_R_MISSING_VERIFY_MESSAGE 174 +# define SSL_R_MULTIPLE_SGC_RESTARTS 346 +# define SSL_R_NON_SSLV2_INITIAL_PACKET 175 +# define SSL_R_NO_CERTIFICATES_RETURNED 176 +# define SSL_R_NO_CERTIFICATE_ASSIGNED 177 +# define SSL_R_NO_CERTIFICATE_RETURNED 178 +# define SSL_R_NO_CERTIFICATE_SET 179 +# define SSL_R_NO_CERTIFICATE_SPECIFIED 180 +# define SSL_R_NO_CIPHERS_AVAILABLE 181 +# define SSL_R_NO_CIPHERS_PASSED 182 +# define SSL_R_NO_CIPHERS_SPECIFIED 183 +# define SSL_R_NO_CIPHER_LIST 184 +# define SSL_R_NO_CIPHER_MATCH 185 +# define SSL_R_NO_CLIENT_CERT_METHOD 331 +# define SSL_R_NO_CLIENT_CERT_RECEIVED 186 +# define SSL_R_NO_COMPRESSION_SPECIFIED 187 +# define SSL_R_NO_GOST_CERTIFICATE_SENT_BY_PEER 330 +# define SSL_R_NO_METHOD_SPECIFIED 188 +# define SSL_R_NO_PEM_EXTENSIONS 389 +# define SSL_R_NO_PRIVATEKEY 189 +# define SSL_R_NO_PRIVATE_KEY_ASSIGNED 190 +# define SSL_R_NO_PROTOCOLS_AVAILABLE 191 +# define SSL_R_NO_PUBLICKEY 192 +# define SSL_R_NO_RENEGOTIATION 339 +# define SSL_R_NO_REQUIRED_DIGEST 324 +# define SSL_R_NO_SHARED_CIPHER 193 +# define SSL_R_NO_SHARED_SIGATURE_ALGORITHMS 376 +# define SSL_R_NO_SRTP_PROFILES 359 +# define SSL_R_NO_VERIFY_CALLBACK 194 +# define SSL_R_NULL_SSL_CTX 195 +# define SSL_R_NULL_SSL_METHOD_PASSED 196 +# define SSL_R_OLD_SESSION_CIPHER_NOT_RETURNED 197 +# define SSL_R_OLD_SESSION_COMPRESSION_ALGORITHM_NOT_RETURNED 344 +# define SSL_R_ONLY_DTLS_1_2_ALLOWED_IN_SUITEB_MODE 387 +# define SSL_R_ONLY_TLS_1_2_ALLOWED_IN_SUITEB_MODE 379 +# define SSL_R_ONLY_TLS_ALLOWED_IN_FIPS_MODE 297 +# define SSL_R_OPAQUE_PRF_INPUT_TOO_LONG 327 +# define SSL_R_PACKET_LENGTH_TOO_LONG 198 +# define SSL_R_PARSE_TLSEXT 227 +# define SSL_R_PATH_TOO_LONG 270 +# define SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE 199 +# define SSL_R_PEER_ERROR 200 +# define SSL_R_PEER_ERROR_CERTIFICATE 201 +# define SSL_R_PEER_ERROR_NO_CERTIFICATE 202 +# define SSL_R_PEER_ERROR_NO_CIPHER 203 +# define SSL_R_PEER_ERROR_UNSUPPORTED_CERTIFICATE_TYPE 204 +# define SSL_R_PEM_NAME_BAD_PREFIX 391 +# define SSL_R_PEM_NAME_TOO_SHORT 392 +# define SSL_R_PRE_MAC_LENGTH_TOO_LONG 205 +# define SSL_R_PROBLEMS_MAPPING_CIPHER_FUNCTIONS 206 +# define SSL_R_PROTOCOL_IS_SHUTDOWN 207 +# define SSL_R_PSK_IDENTITY_NOT_FOUND 223 +# define SSL_R_PSK_NO_CLIENT_CB 224 +# define SSL_R_PSK_NO_SERVER_CB 225 +# define SSL_R_PUBLIC_KEY_ENCRYPT_ERROR 208 +# define SSL_R_PUBLIC_KEY_IS_NOT_RSA 209 +# define SSL_R_PUBLIC_KEY_NOT_RSA 210 +# define SSL_R_READ_BIO_NOT_SET 211 +# define SSL_R_READ_TIMEOUT_EXPIRED 312 +# define SSL_R_READ_WRONG_PACKET_TYPE 212 +# define SSL_R_RECORD_LENGTH_MISMATCH 213 +# define SSL_R_RECORD_TOO_LARGE 214 +# define SSL_R_RECORD_TOO_SMALL 298 +# define SSL_R_RENEGOTIATE_EXT_TOO_LONG 335 +# define SSL_R_RENEGOTIATION_ENCODING_ERR 336 +# define SSL_R_RENEGOTIATION_MISMATCH 337 +# define SSL_R_REQUIRED_CIPHER_MISSING 215 +# define SSL_R_REQUIRED_COMPRESSSION_ALGORITHM_MISSING 342 +# define SSL_R_REUSE_CERT_LENGTH_NOT_ZERO 216 +# define SSL_R_REUSE_CERT_TYPE_NOT_ZERO 217 +# define SSL_R_REUSE_CIPHER_LIST_NOT_ZERO 218 +# define SSL_R_SCSV_RECEIVED_WHEN_RENEGOTIATING 345 +# define SSL_R_SERVERHELLO_TLSEXT 275 +# define SSL_R_SESSION_ID_CONTEXT_UNINITIALIZED 277 +# define SSL_R_SHORT_READ 219 +# define SSL_R_SHUTDOWN_WHILE_IN_INIT 407 +# define SSL_R_SIGNATURE_ALGORITHMS_ERROR 360 +# define SSL_R_SIGNATURE_FOR_NON_SIGNING_CERTIFICATE 220 +# define SSL_R_SRP_A_CALC 361 +# define SSL_R_SRTP_COULD_NOT_ALLOCATE_PROFILES 362 +# define SSL_R_SRTP_PROTECTION_PROFILE_LIST_TOO_LONG 363 +# define SSL_R_SRTP_UNKNOWN_PROTECTION_PROFILE 364 +# define SSL_R_SSL23_DOING_SESSION_ID_REUSE 221 +# define SSL_R_SSL2_CONNECTION_ID_TOO_LONG 299 +# define SSL_R_SSL3_EXT_INVALID_ECPOINTFORMAT 321 +# define SSL_R_SSL3_EXT_INVALID_SERVERNAME 319 +# define SSL_R_SSL3_EXT_INVALID_SERVERNAME_TYPE 320 +# define SSL_R_SSL3_SESSION_ID_TOO_LONG 300 +# define SSL_R_SSL3_SESSION_ID_TOO_SHORT 222 +# define SSL_R_SSLV3_ALERT_BAD_CERTIFICATE 1042 +# define SSL_R_SSLV3_ALERT_BAD_RECORD_MAC 1020 +# define SSL_R_SSLV3_ALERT_CERTIFICATE_EXPIRED 1045 +# define SSL_R_SSLV3_ALERT_CERTIFICATE_REVOKED 1044 +# define SSL_R_SSLV3_ALERT_CERTIFICATE_UNKNOWN 1046 +# define SSL_R_SSLV3_ALERT_DECOMPRESSION_FAILURE 1030 +# define SSL_R_SSLV3_ALERT_HANDSHAKE_FAILURE 1040 +# define SSL_R_SSLV3_ALERT_ILLEGAL_PARAMETER 1047 +# define SSL_R_SSLV3_ALERT_NO_CERTIFICATE 1041 +# define SSL_R_SSLV3_ALERT_UNEXPECTED_MESSAGE 1010 +# define SSL_R_SSLV3_ALERT_UNSUPPORTED_CERTIFICATE 1043 +# define SSL_R_SSL_CTX_HAS_NO_DEFAULT_SSL_VERSION 228 +# define SSL_R_SSL_HANDSHAKE_FAILURE 229 +# define SSL_R_SSL_LIBRARY_HAS_NO_CIPHERS 230 +# define SSL_R_SSL_SESSION_ID_CALLBACK_FAILED 301 +# define SSL_R_SSL_SESSION_ID_CONFLICT 302 +# define SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG 273 +# define SSL_R_SSL_SESSION_ID_HAS_BAD_LENGTH 303 +# define SSL_R_SSL_SESSION_ID_IS_DIFFERENT 231 +# define SSL_R_TLSV1_ALERT_ACCESS_DENIED 1049 +# define SSL_R_TLSV1_ALERT_DECODE_ERROR 1050 +# define SSL_R_TLSV1_ALERT_DECRYPTION_FAILED 1021 +# define SSL_R_TLSV1_ALERT_DECRYPT_ERROR 1051 +# define SSL_R_TLSV1_ALERT_EXPORT_RESTRICTION 1060 +# define SSL_R_TLSV1_ALERT_INAPPROPRIATE_FALLBACK 1086 +# define SSL_R_TLSV1_ALERT_INSUFFICIENT_SECURITY 1071 +# define SSL_R_TLSV1_ALERT_INTERNAL_ERROR 1080 +# define SSL_R_TLSV1_ALERT_NO_RENEGOTIATION 1100 +# define SSL_R_TLSV1_ALERT_PROTOCOL_VERSION 1070 +# define SSL_R_TLSV1_ALERT_RECORD_OVERFLOW 1022 +# define SSL_R_TLSV1_ALERT_UNKNOWN_CA 1048 +# define SSL_R_TLSV1_ALERT_USER_CANCELLED 1090 +# define SSL_R_TLSV1_BAD_CERTIFICATE_HASH_VALUE 1114 +# define SSL_R_TLSV1_BAD_CERTIFICATE_STATUS_RESPONSE 1113 +# define SSL_R_TLSV1_CERTIFICATE_UNOBTAINABLE 1111 +# define SSL_R_TLSV1_UNRECOGNIZED_NAME 1112 +# define SSL_R_TLSV1_UNSUPPORTED_EXTENSION 1110 +# define SSL_R_TLS_CLIENT_CERT_REQ_WITH_ANON_CIPHER 232 +# define SSL_R_TLS_HEARTBEAT_PEER_DOESNT_ACCEPT 365 +# define SSL_R_TLS_HEARTBEAT_PENDING 366 +# define SSL_R_TLS_ILLEGAL_EXPORTER_LABEL 367 +# define SSL_R_TLS_INVALID_ECPOINTFORMAT_LIST 157 +# define SSL_R_TLS_PEER_DID_NOT_RESPOND_WITH_CERTIFICATE_LIST 233 +# define SSL_R_TLS_RSA_ENCRYPTED_VALUE_LENGTH_IS_WRONG 234 +# define SSL_R_TOO_MANY_WARN_ALERTS 409 +# define SSL_R_TRIED_TO_USE_UNSUPPORTED_CIPHER 235 +# define SSL_R_UNABLE_TO_DECODE_DH_CERTS 236 +# define SSL_R_UNABLE_TO_DECODE_ECDH_CERTS 313 +# define SSL_R_UNABLE_TO_EXTRACT_PUBLIC_KEY 237 +# define SSL_R_UNABLE_TO_FIND_DH_PARAMETERS 238 +# define SSL_R_UNABLE_TO_FIND_ECDH_PARAMETERS 314 +# define SSL_R_UNABLE_TO_FIND_PUBLIC_KEY_PARAMETERS 239 +# define SSL_R_UNABLE_TO_FIND_SSL_METHOD 240 +# define SSL_R_UNABLE_TO_LOAD_SSL2_MD5_ROUTINES 241 +# define SSL_R_UNABLE_TO_LOAD_SSL3_MD5_ROUTINES 242 +# define SSL_R_UNABLE_TO_LOAD_SSL3_SHA1_ROUTINES 243 +# define SSL_R_UNEXPECTED_MESSAGE 244 +# define SSL_R_UNEXPECTED_RECORD 245 +# define SSL_R_UNINITIALIZED 276 +# define SSL_R_UNKNOWN_ALERT_TYPE 246 +# define SSL_R_UNKNOWN_CERTIFICATE_TYPE 247 +# define SSL_R_UNKNOWN_CIPHER_RETURNED 248 +# define SSL_R_UNKNOWN_CIPHER_TYPE 249 +# define SSL_R_UNKNOWN_CMD_NAME 386 +# define SSL_R_UNKNOWN_DIGEST 368 +# define SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE 250 +# define SSL_R_UNKNOWN_PKEY_TYPE 251 +# define SSL_R_UNKNOWN_PROTOCOL 252 +# define SSL_R_UNKNOWN_REMOTE_ERROR_TYPE 253 +# define SSL_R_UNKNOWN_SSL_VERSION 254 +# define SSL_R_UNKNOWN_STATE 255 +# define SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED 338 +# define SSL_R_UNSUPPORTED_CIPHER 256 +# define SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM 257 +# define SSL_R_UNSUPPORTED_DIGEST_TYPE 326 +# define SSL_R_UNSUPPORTED_ELLIPTIC_CURVE 315 +# define SSL_R_UNSUPPORTED_PROTOCOL 258 +# define SSL_R_UNSUPPORTED_SSL_VERSION 259 +# define SSL_R_UNSUPPORTED_STATUS_TYPE 329 +# define SSL_R_USE_SRTP_NOT_NEGOTIATED 369 +# define SSL_R_WRITE_BIO_NOT_SET 260 +# define SSL_R_WRONG_CERTIFICATE_TYPE 383 +# define SSL_R_WRONG_CIPHER_RETURNED 261 +# define SSL_R_WRONG_CURVE 378 +# define SSL_R_WRONG_MESSAGE_TYPE 262 +# define SSL_R_WRONG_NUMBER_OF_KEY_BITS 263 +# define SSL_R_WRONG_SIGNATURE_LENGTH 264 +# define SSL_R_WRONG_SIGNATURE_SIZE 265 +# define SSL_R_WRONG_SIGNATURE_TYPE 370 +# define SSL_R_WRONG_SSL_VERSION 266 +# define SSL_R_WRONG_VERSION_NUMBER 267 +# define SSL_R_X509_LIB 268 +# define SSL_R_X509_VERIFICATION_SETUP_PROBLEMS 269 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/ssl2.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/ssl2.h new file mode 100644 index 0000000..03c7dd8 --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/ssl2.h @@ -0,0 +1,265 @@ +/* ssl/ssl2.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_SSL2_H +# define HEADER_SSL2_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Protocol Version Codes */ +# define SSL2_VERSION 0x0002 +# define SSL2_VERSION_MAJOR 0x00 +# define SSL2_VERSION_MINOR 0x02 +/* #define SSL2_CLIENT_VERSION 0x0002 */ +/* #define SSL2_SERVER_VERSION 0x0002 */ + +/* Protocol Message Codes */ +# define SSL2_MT_ERROR 0 +# define SSL2_MT_CLIENT_HELLO 1 +# define SSL2_MT_CLIENT_MASTER_KEY 2 +# define SSL2_MT_CLIENT_FINISHED 3 +# define SSL2_MT_SERVER_HELLO 4 +# define SSL2_MT_SERVER_VERIFY 5 +# define SSL2_MT_SERVER_FINISHED 6 +# define SSL2_MT_REQUEST_CERTIFICATE 7 +# define SSL2_MT_CLIENT_CERTIFICATE 8 + +/* Error Message Codes */ +# define SSL2_PE_UNDEFINED_ERROR 0x0000 +# define SSL2_PE_NO_CIPHER 0x0001 +# define SSL2_PE_NO_CERTIFICATE 0x0002 +# define SSL2_PE_BAD_CERTIFICATE 0x0004 +# define SSL2_PE_UNSUPPORTED_CERTIFICATE_TYPE 0x0006 + +/* Cipher Kind Values */ +# define SSL2_CK_NULL_WITH_MD5 0x02000000/* v3 */ +# define SSL2_CK_RC4_128_WITH_MD5 0x02010080 +# define SSL2_CK_RC4_128_EXPORT40_WITH_MD5 0x02020080 +# define SSL2_CK_RC2_128_CBC_WITH_MD5 0x02030080 +# define SSL2_CK_RC2_128_CBC_EXPORT40_WITH_MD5 0x02040080 +# define SSL2_CK_IDEA_128_CBC_WITH_MD5 0x02050080 +# define SSL2_CK_DES_64_CBC_WITH_MD5 0x02060040 +# define SSL2_CK_DES_64_CBC_WITH_SHA 0x02060140/* v3 */ +# define SSL2_CK_DES_192_EDE3_CBC_WITH_MD5 0x020700c0 +# define SSL2_CK_DES_192_EDE3_CBC_WITH_SHA 0x020701c0/* v3 */ +# define SSL2_CK_RC4_64_WITH_MD5 0x02080080/* MS hack */ + +# define SSL2_CK_DES_64_CFB64_WITH_MD5_1 0x02ff0800/* SSLeay */ +# define SSL2_CK_NULL 0x02ff0810/* SSLeay */ + +# define SSL2_TXT_DES_64_CFB64_WITH_MD5_1 "DES-CFB-M1" +# define SSL2_TXT_NULL_WITH_MD5 "NULL-MD5" +# define SSL2_TXT_RC4_128_WITH_MD5 "RC4-MD5" +# define SSL2_TXT_RC4_128_EXPORT40_WITH_MD5 "EXP-RC4-MD5" +# define SSL2_TXT_RC2_128_CBC_WITH_MD5 "RC2-CBC-MD5" +# define SSL2_TXT_RC2_128_CBC_EXPORT40_WITH_MD5 "EXP-RC2-CBC-MD5" +# define SSL2_TXT_IDEA_128_CBC_WITH_MD5 "IDEA-CBC-MD5" +# define SSL2_TXT_DES_64_CBC_WITH_MD5 "DES-CBC-MD5" +# define SSL2_TXT_DES_64_CBC_WITH_SHA "DES-CBC-SHA" +# define SSL2_TXT_DES_192_EDE3_CBC_WITH_MD5 "DES-CBC3-MD5" +# define SSL2_TXT_DES_192_EDE3_CBC_WITH_SHA "DES-CBC3-SHA" +# define SSL2_TXT_RC4_64_WITH_MD5 "RC4-64-MD5" + +# define SSL2_TXT_NULL "NULL" + +/* Flags for the SSL_CIPHER.algorithm2 field */ +# define SSL2_CF_5_BYTE_ENC 0x01 +# define SSL2_CF_8_BYTE_ENC 0x02 + +/* Certificate Type Codes */ +# define SSL2_CT_X509_CERTIFICATE 0x01 + +/* Authentication Type Code */ +# define SSL2_AT_MD5_WITH_RSA_ENCRYPTION 0x01 + +# define SSL2_MAX_SSL_SESSION_ID_LENGTH 32 + +/* Upper/Lower Bounds */ +# define SSL2_MAX_MASTER_KEY_LENGTH_IN_BITS 256 +# ifdef OPENSSL_SYS_MPE +# define SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER 29998u +# else +# define SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER 32767u + /* 2^15-1 */ +# endif +# define SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER 16383/* 2^14-1 */ + +# define SSL2_CHALLENGE_LENGTH 16 +/* + * #define SSL2_CHALLENGE_LENGTH 32 + */ +# define SSL2_MIN_CHALLENGE_LENGTH 16 +# define SSL2_MAX_CHALLENGE_LENGTH 32 +# define SSL2_CONNECTION_ID_LENGTH 16 +# define SSL2_MAX_CONNECTION_ID_LENGTH 16 +# define SSL2_SSL_SESSION_ID_LENGTH 16 +# define SSL2_MAX_CERT_CHALLENGE_LENGTH 32 +# define SSL2_MIN_CERT_CHALLENGE_LENGTH 16 +# define SSL2_MAX_KEY_MATERIAL_LENGTH 24 + +# ifndef HEADER_SSL_LOCL_H +# define CERT char +# endif + +# ifndef OPENSSL_NO_SSL_INTERN + +typedef struct ssl2_state_st { + int three_byte_header; + int clear_text; /* clear text */ + int escape; /* not used in SSLv2 */ + int ssl2_rollback; /* used if SSLv23 rolled back to SSLv2 */ + /* + * non-blocking io info, used to make sure the same args were passwd + */ + unsigned int wnum; /* number of bytes sent so far */ + int wpend_tot; + const unsigned char *wpend_buf; + int wpend_off; /* offset to data to write */ + int wpend_len; /* number of bytes passwd to write */ + int wpend_ret; /* number of bytes to return to caller */ + /* buffer raw data */ + int rbuf_left; + int rbuf_offs; + unsigned char *rbuf; + unsigned char *wbuf; + unsigned char *write_ptr; /* used to point to the start due to 2/3 byte + * header. */ + unsigned int padding; + unsigned int rlength; /* passed to ssl2_enc */ + int ract_data_length; /* Set when things are encrypted. */ + unsigned int wlength; /* passed to ssl2_enc */ + int wact_data_length; /* Set when things are decrypted. */ + unsigned char *ract_data; + unsigned char *wact_data; + unsigned char *mac_data; + unsigned char *read_key; + unsigned char *write_key; + /* Stuff specifically to do with this SSL session */ + unsigned int challenge_length; + unsigned char challenge[SSL2_MAX_CHALLENGE_LENGTH]; + unsigned int conn_id_length; + unsigned char conn_id[SSL2_MAX_CONNECTION_ID_LENGTH]; + unsigned int key_material_length; + unsigned char key_material[SSL2_MAX_KEY_MATERIAL_LENGTH * 2]; + unsigned long read_sequence; + unsigned long write_sequence; + struct { + unsigned int conn_id_length; + unsigned int cert_type; + unsigned int cert_length; + unsigned int csl; + unsigned int clear; + unsigned int enc; + unsigned char ccl[SSL2_MAX_CERT_CHALLENGE_LENGTH]; + unsigned int cipher_spec_length; + unsigned int session_id_length; + unsigned int clen; + unsigned int rlen; + } tmp; +} SSL2_STATE; + +# endif + +/* SSLv2 */ +/* client */ +# define SSL2_ST_SEND_CLIENT_HELLO_A (0x10|SSL_ST_CONNECT) +# define SSL2_ST_SEND_CLIENT_HELLO_B (0x11|SSL_ST_CONNECT) +# define SSL2_ST_GET_SERVER_HELLO_A (0x20|SSL_ST_CONNECT) +# define SSL2_ST_GET_SERVER_HELLO_B (0x21|SSL_ST_CONNECT) +# define SSL2_ST_SEND_CLIENT_MASTER_KEY_A (0x30|SSL_ST_CONNECT) +# define SSL2_ST_SEND_CLIENT_MASTER_KEY_B (0x31|SSL_ST_CONNECT) +# define SSL2_ST_SEND_CLIENT_FINISHED_A (0x40|SSL_ST_CONNECT) +# define SSL2_ST_SEND_CLIENT_FINISHED_B (0x41|SSL_ST_CONNECT) +# define SSL2_ST_SEND_CLIENT_CERTIFICATE_A (0x50|SSL_ST_CONNECT) +# define SSL2_ST_SEND_CLIENT_CERTIFICATE_B (0x51|SSL_ST_CONNECT) +# define SSL2_ST_SEND_CLIENT_CERTIFICATE_C (0x52|SSL_ST_CONNECT) +# define SSL2_ST_SEND_CLIENT_CERTIFICATE_D (0x53|SSL_ST_CONNECT) +# define SSL2_ST_GET_SERVER_VERIFY_A (0x60|SSL_ST_CONNECT) +# define SSL2_ST_GET_SERVER_VERIFY_B (0x61|SSL_ST_CONNECT) +# define SSL2_ST_GET_SERVER_FINISHED_A (0x70|SSL_ST_CONNECT) +# define SSL2_ST_GET_SERVER_FINISHED_B (0x71|SSL_ST_CONNECT) +# define SSL2_ST_CLIENT_START_ENCRYPTION (0x80|SSL_ST_CONNECT) +# define SSL2_ST_X509_GET_CLIENT_CERTIFICATE (0x90|SSL_ST_CONNECT) +/* server */ +# define SSL2_ST_GET_CLIENT_HELLO_A (0x10|SSL_ST_ACCEPT) +# define SSL2_ST_GET_CLIENT_HELLO_B (0x11|SSL_ST_ACCEPT) +# define SSL2_ST_GET_CLIENT_HELLO_C (0x12|SSL_ST_ACCEPT) +# define SSL2_ST_SEND_SERVER_HELLO_A (0x20|SSL_ST_ACCEPT) +# define SSL2_ST_SEND_SERVER_HELLO_B (0x21|SSL_ST_ACCEPT) +# define SSL2_ST_GET_CLIENT_MASTER_KEY_A (0x30|SSL_ST_ACCEPT) +# define SSL2_ST_GET_CLIENT_MASTER_KEY_B (0x31|SSL_ST_ACCEPT) +# define SSL2_ST_SEND_SERVER_VERIFY_A (0x40|SSL_ST_ACCEPT) +# define SSL2_ST_SEND_SERVER_VERIFY_B (0x41|SSL_ST_ACCEPT) +# define SSL2_ST_SEND_SERVER_VERIFY_C (0x42|SSL_ST_ACCEPT) +# define SSL2_ST_GET_CLIENT_FINISHED_A (0x50|SSL_ST_ACCEPT) +# define SSL2_ST_GET_CLIENT_FINISHED_B (0x51|SSL_ST_ACCEPT) +# define SSL2_ST_SEND_SERVER_FINISHED_A (0x60|SSL_ST_ACCEPT) +# define SSL2_ST_SEND_SERVER_FINISHED_B (0x61|SSL_ST_ACCEPT) +# define SSL2_ST_SEND_REQUEST_CERTIFICATE_A (0x70|SSL_ST_ACCEPT) +# define SSL2_ST_SEND_REQUEST_CERTIFICATE_B (0x71|SSL_ST_ACCEPT) +# define SSL2_ST_SEND_REQUEST_CERTIFICATE_C (0x72|SSL_ST_ACCEPT) +# define SSL2_ST_SEND_REQUEST_CERTIFICATE_D (0x73|SSL_ST_ACCEPT) +# define SSL2_ST_SERVER_START_ENCRYPTION (0x80|SSL_ST_ACCEPT) +# define SSL2_ST_X509_GET_SERVER_CERTIFICATE (0x90|SSL_ST_ACCEPT) + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/ssl23.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/ssl23.h new file mode 100644 index 0000000..9de4685 --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/ssl23.h @@ -0,0 +1,84 @@ +/* ssl/ssl23.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_SSL23_H +# define HEADER_SSL23_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * client + */ +/* write to server */ +# define SSL23_ST_CW_CLNT_HELLO_A (0x210|SSL_ST_CONNECT) +# define SSL23_ST_CW_CLNT_HELLO_B (0x211|SSL_ST_CONNECT) +/* read from server */ +# define SSL23_ST_CR_SRVR_HELLO_A (0x220|SSL_ST_CONNECT) +# define SSL23_ST_CR_SRVR_HELLO_B (0x221|SSL_ST_CONNECT) + +/* server */ +/* read from client */ +# define SSL23_ST_SR_CLNT_HELLO_A (0x210|SSL_ST_ACCEPT) +# define SSL23_ST_SR_CLNT_HELLO_B (0x211|SSL_ST_ACCEPT) + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/ssl3.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/ssl3.h new file mode 100644 index 0000000..e681d50 --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/ssl3.h @@ -0,0 +1,774 @@ +/* ssl/ssl3.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ +/* ==================================================================== + * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * ECC cipher suite support in OpenSSL originally developed by + * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project. + */ + +#ifndef HEADER_SSL3_H +# define HEADER_SSL3_H + +# ifndef OPENSSL_NO_COMP +# include +# endif +# include +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Signalling cipher suite value from RFC 5746 + * (TLS_EMPTY_RENEGOTIATION_INFO_SCSV) + */ +# define SSL3_CK_SCSV 0x030000FF + +/* + * Signalling cipher suite value from draft-ietf-tls-downgrade-scsv-00 + * (TLS_FALLBACK_SCSV) + */ +# define SSL3_CK_FALLBACK_SCSV 0x03005600 + +# define SSL3_CK_RSA_NULL_MD5 0x03000001 +# define SSL3_CK_RSA_NULL_SHA 0x03000002 +# define SSL3_CK_RSA_RC4_40_MD5 0x03000003 +# define SSL3_CK_RSA_RC4_128_MD5 0x03000004 +# define SSL3_CK_RSA_RC4_128_SHA 0x03000005 +# define SSL3_CK_RSA_RC2_40_MD5 0x03000006 +# define SSL3_CK_RSA_IDEA_128_SHA 0x03000007 +# define SSL3_CK_RSA_DES_40_CBC_SHA 0x03000008 +# define SSL3_CK_RSA_DES_64_CBC_SHA 0x03000009 +# define SSL3_CK_RSA_DES_192_CBC3_SHA 0x0300000A + +# define SSL3_CK_DH_DSS_DES_40_CBC_SHA 0x0300000B +# define SSL3_CK_DH_DSS_DES_64_CBC_SHA 0x0300000C +# define SSL3_CK_DH_DSS_DES_192_CBC3_SHA 0x0300000D +# define SSL3_CK_DH_RSA_DES_40_CBC_SHA 0x0300000E +# define SSL3_CK_DH_RSA_DES_64_CBC_SHA 0x0300000F +# define SSL3_CK_DH_RSA_DES_192_CBC3_SHA 0x03000010 + +# define SSL3_CK_EDH_DSS_DES_40_CBC_SHA 0x03000011 +# define SSL3_CK_DHE_DSS_DES_40_CBC_SHA SSL3_CK_EDH_DSS_DES_40_CBC_SHA +# define SSL3_CK_EDH_DSS_DES_64_CBC_SHA 0x03000012 +# define SSL3_CK_DHE_DSS_DES_64_CBC_SHA SSL3_CK_EDH_DSS_DES_64_CBC_SHA +# define SSL3_CK_EDH_DSS_DES_192_CBC3_SHA 0x03000013 +# define SSL3_CK_DHE_DSS_DES_192_CBC3_SHA SSL3_CK_EDH_DSS_DES_192_CBC3_SHA +# define SSL3_CK_EDH_RSA_DES_40_CBC_SHA 0x03000014 +# define SSL3_CK_DHE_RSA_DES_40_CBC_SHA SSL3_CK_EDH_RSA_DES_40_CBC_SHA +# define SSL3_CK_EDH_RSA_DES_64_CBC_SHA 0x03000015 +# define SSL3_CK_DHE_RSA_DES_64_CBC_SHA SSL3_CK_EDH_RSA_DES_64_CBC_SHA +# define SSL3_CK_EDH_RSA_DES_192_CBC3_SHA 0x03000016 +# define SSL3_CK_DHE_RSA_DES_192_CBC3_SHA SSL3_CK_EDH_RSA_DES_192_CBC3_SHA + +# define SSL3_CK_ADH_RC4_40_MD5 0x03000017 +# define SSL3_CK_ADH_RC4_128_MD5 0x03000018 +# define SSL3_CK_ADH_DES_40_CBC_SHA 0x03000019 +# define SSL3_CK_ADH_DES_64_CBC_SHA 0x0300001A +# define SSL3_CK_ADH_DES_192_CBC_SHA 0x0300001B + +# if 0 +# define SSL3_CK_FZA_DMS_NULL_SHA 0x0300001C +# define SSL3_CK_FZA_DMS_FZA_SHA 0x0300001D +# if 0 /* Because it clashes with KRB5, is never + * used any more, and is safe to remove + * according to David Hopwood + * of the + * ietf-tls list */ +# define SSL3_CK_FZA_DMS_RC4_SHA 0x0300001E +# endif +# endif + +/* + * VRS Additional Kerberos5 entries + */ +# define SSL3_CK_KRB5_DES_64_CBC_SHA 0x0300001E +# define SSL3_CK_KRB5_DES_192_CBC3_SHA 0x0300001F +# define SSL3_CK_KRB5_RC4_128_SHA 0x03000020 +# define SSL3_CK_KRB5_IDEA_128_CBC_SHA 0x03000021 +# define SSL3_CK_KRB5_DES_64_CBC_MD5 0x03000022 +# define SSL3_CK_KRB5_DES_192_CBC3_MD5 0x03000023 +# define SSL3_CK_KRB5_RC4_128_MD5 0x03000024 +# define SSL3_CK_KRB5_IDEA_128_CBC_MD5 0x03000025 + +# define SSL3_CK_KRB5_DES_40_CBC_SHA 0x03000026 +# define SSL3_CK_KRB5_RC2_40_CBC_SHA 0x03000027 +# define SSL3_CK_KRB5_RC4_40_SHA 0x03000028 +# define SSL3_CK_KRB5_DES_40_CBC_MD5 0x03000029 +# define SSL3_CK_KRB5_RC2_40_CBC_MD5 0x0300002A +# define SSL3_CK_KRB5_RC4_40_MD5 0x0300002B + +# define SSL3_TXT_RSA_NULL_MD5 "NULL-MD5" +# define SSL3_TXT_RSA_NULL_SHA "NULL-SHA" +# define SSL3_TXT_RSA_RC4_40_MD5 "EXP-RC4-MD5" +# define SSL3_TXT_RSA_RC4_128_MD5 "RC4-MD5" +# define SSL3_TXT_RSA_RC4_128_SHA "RC4-SHA" +# define SSL3_TXT_RSA_RC2_40_MD5 "EXP-RC2-CBC-MD5" +# define SSL3_TXT_RSA_IDEA_128_SHA "IDEA-CBC-SHA" +# define SSL3_TXT_RSA_DES_40_CBC_SHA "EXP-DES-CBC-SHA" +# define SSL3_TXT_RSA_DES_64_CBC_SHA "DES-CBC-SHA" +# define SSL3_TXT_RSA_DES_192_CBC3_SHA "DES-CBC3-SHA" + +# define SSL3_TXT_DH_DSS_DES_40_CBC_SHA "EXP-DH-DSS-DES-CBC-SHA" +# define SSL3_TXT_DH_DSS_DES_64_CBC_SHA "DH-DSS-DES-CBC-SHA" +# define SSL3_TXT_DH_DSS_DES_192_CBC3_SHA "DH-DSS-DES-CBC3-SHA" +# define SSL3_TXT_DH_RSA_DES_40_CBC_SHA "EXP-DH-RSA-DES-CBC-SHA" +# define SSL3_TXT_DH_RSA_DES_64_CBC_SHA "DH-RSA-DES-CBC-SHA" +# define SSL3_TXT_DH_RSA_DES_192_CBC3_SHA "DH-RSA-DES-CBC3-SHA" + +# define SSL3_TXT_DHE_DSS_DES_40_CBC_SHA "EXP-DHE-DSS-DES-CBC-SHA" +# define SSL3_TXT_DHE_DSS_DES_64_CBC_SHA "DHE-DSS-DES-CBC-SHA" +# define SSL3_TXT_DHE_DSS_DES_192_CBC3_SHA "DHE-DSS-DES-CBC3-SHA" +# define SSL3_TXT_DHE_RSA_DES_40_CBC_SHA "EXP-DHE-RSA-DES-CBC-SHA" +# define SSL3_TXT_DHE_RSA_DES_64_CBC_SHA "DHE-RSA-DES-CBC-SHA" +# define SSL3_TXT_DHE_RSA_DES_192_CBC3_SHA "DHE-RSA-DES-CBC3-SHA" + +/* + * This next block of six "EDH" labels is for backward compatibility with + * older versions of OpenSSL. New code should use the six "DHE" labels above + * instead: + */ +# define SSL3_TXT_EDH_DSS_DES_40_CBC_SHA "EXP-EDH-DSS-DES-CBC-SHA" +# define SSL3_TXT_EDH_DSS_DES_64_CBC_SHA "EDH-DSS-DES-CBC-SHA" +# define SSL3_TXT_EDH_DSS_DES_192_CBC3_SHA "EDH-DSS-DES-CBC3-SHA" +# define SSL3_TXT_EDH_RSA_DES_40_CBC_SHA "EXP-EDH-RSA-DES-CBC-SHA" +# define SSL3_TXT_EDH_RSA_DES_64_CBC_SHA "EDH-RSA-DES-CBC-SHA" +# define SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA "EDH-RSA-DES-CBC3-SHA" + +# define SSL3_TXT_ADH_RC4_40_MD5 "EXP-ADH-RC4-MD5" +# define SSL3_TXT_ADH_RC4_128_MD5 "ADH-RC4-MD5" +# define SSL3_TXT_ADH_DES_40_CBC_SHA "EXP-ADH-DES-CBC-SHA" +# define SSL3_TXT_ADH_DES_64_CBC_SHA "ADH-DES-CBC-SHA" +# define SSL3_TXT_ADH_DES_192_CBC_SHA "ADH-DES-CBC3-SHA" + +# if 0 +# define SSL3_TXT_FZA_DMS_NULL_SHA "FZA-NULL-SHA" +# define SSL3_TXT_FZA_DMS_FZA_SHA "FZA-FZA-CBC-SHA" +# define SSL3_TXT_FZA_DMS_RC4_SHA "FZA-RC4-SHA" +# endif + +# define SSL3_TXT_KRB5_DES_64_CBC_SHA "KRB5-DES-CBC-SHA" +# define SSL3_TXT_KRB5_DES_192_CBC3_SHA "KRB5-DES-CBC3-SHA" +# define SSL3_TXT_KRB5_RC4_128_SHA "KRB5-RC4-SHA" +# define SSL3_TXT_KRB5_IDEA_128_CBC_SHA "KRB5-IDEA-CBC-SHA" +# define SSL3_TXT_KRB5_DES_64_CBC_MD5 "KRB5-DES-CBC-MD5" +# define SSL3_TXT_KRB5_DES_192_CBC3_MD5 "KRB5-DES-CBC3-MD5" +# define SSL3_TXT_KRB5_RC4_128_MD5 "KRB5-RC4-MD5" +# define SSL3_TXT_KRB5_IDEA_128_CBC_MD5 "KRB5-IDEA-CBC-MD5" + +# define SSL3_TXT_KRB5_DES_40_CBC_SHA "EXP-KRB5-DES-CBC-SHA" +# define SSL3_TXT_KRB5_RC2_40_CBC_SHA "EXP-KRB5-RC2-CBC-SHA" +# define SSL3_TXT_KRB5_RC4_40_SHA "EXP-KRB5-RC4-SHA" +# define SSL3_TXT_KRB5_DES_40_CBC_MD5 "EXP-KRB5-DES-CBC-MD5" +# define SSL3_TXT_KRB5_RC2_40_CBC_MD5 "EXP-KRB5-RC2-CBC-MD5" +# define SSL3_TXT_KRB5_RC4_40_MD5 "EXP-KRB5-RC4-MD5" + +# define SSL3_SSL_SESSION_ID_LENGTH 32 +# define SSL3_MAX_SSL_SESSION_ID_LENGTH 32 + +# define SSL3_MASTER_SECRET_SIZE 48 +# define SSL3_RANDOM_SIZE 32 +# define SSL3_SESSION_ID_SIZE 32 +# define SSL3_RT_HEADER_LENGTH 5 + +# define SSL3_HM_HEADER_LENGTH 4 + +# ifndef SSL3_ALIGN_PAYLOAD + /* + * Some will argue that this increases memory footprint, but it's not + * actually true. Point is that malloc has to return at least 64-bit aligned + * pointers, meaning that allocating 5 bytes wastes 3 bytes in either case. + * Suggested pre-gaping simply moves these wasted bytes from the end of + * allocated region to its front, but makes data payload aligned, which + * improves performance:-) + */ +# define SSL3_ALIGN_PAYLOAD 8 +# else +# if (SSL3_ALIGN_PAYLOAD&(SSL3_ALIGN_PAYLOAD-1))!=0 +# error "insane SSL3_ALIGN_PAYLOAD" +# undef SSL3_ALIGN_PAYLOAD +# endif +# endif + +/* + * This is the maximum MAC (digest) size used by the SSL library. Currently + * maximum of 20 is used by SHA1, but we reserve for future extension for + * 512-bit hashes. + */ + +# define SSL3_RT_MAX_MD_SIZE 64 + +/* + * Maximum block size used in all ciphersuites. Currently 16 for AES. + */ + +# define SSL_RT_MAX_CIPHER_BLOCK_SIZE 16 + +# define SSL3_RT_MAX_EXTRA (16384) + +/* Maximum plaintext length: defined by SSL/TLS standards */ +# define SSL3_RT_MAX_PLAIN_LENGTH 16384 +/* Maximum compression overhead: defined by SSL/TLS standards */ +# define SSL3_RT_MAX_COMPRESSED_OVERHEAD 1024 + +/* + * The standards give a maximum encryption overhead of 1024 bytes. In + * practice the value is lower than this. The overhead is the maximum number + * of padding bytes (256) plus the mac size. + */ +# define SSL3_RT_MAX_ENCRYPTED_OVERHEAD (256 + SSL3_RT_MAX_MD_SIZE) + +/* + * OpenSSL currently only uses a padding length of at most one block so the + * send overhead is smaller. + */ + +# define SSL3_RT_SEND_MAX_ENCRYPTED_OVERHEAD \ + (SSL_RT_MAX_CIPHER_BLOCK_SIZE + SSL3_RT_MAX_MD_SIZE) + +/* If compression isn't used don't include the compression overhead */ + +# ifdef OPENSSL_NO_COMP +# define SSL3_RT_MAX_COMPRESSED_LENGTH SSL3_RT_MAX_PLAIN_LENGTH +# else +# define SSL3_RT_MAX_COMPRESSED_LENGTH \ + (SSL3_RT_MAX_PLAIN_LENGTH+SSL3_RT_MAX_COMPRESSED_OVERHEAD) +# endif +# define SSL3_RT_MAX_ENCRYPTED_LENGTH \ + (SSL3_RT_MAX_ENCRYPTED_OVERHEAD+SSL3_RT_MAX_COMPRESSED_LENGTH) +# define SSL3_RT_MAX_PACKET_SIZE \ + (SSL3_RT_MAX_ENCRYPTED_LENGTH+SSL3_RT_HEADER_LENGTH) + +# define SSL3_MD_CLIENT_FINISHED_CONST "\x43\x4C\x4E\x54" +# define SSL3_MD_SERVER_FINISHED_CONST "\x53\x52\x56\x52" + +# define SSL3_VERSION 0x0300 +# define SSL3_VERSION_MAJOR 0x03 +# define SSL3_VERSION_MINOR 0x00 + +# define SSL3_RT_CHANGE_CIPHER_SPEC 20 +# define SSL3_RT_ALERT 21 +# define SSL3_RT_HANDSHAKE 22 +# define SSL3_RT_APPLICATION_DATA 23 +# define TLS1_RT_HEARTBEAT 24 + +/* Pseudo content types to indicate additional parameters */ +# define TLS1_RT_CRYPTO 0x1000 +# define TLS1_RT_CRYPTO_PREMASTER (TLS1_RT_CRYPTO | 0x1) +# define TLS1_RT_CRYPTO_CLIENT_RANDOM (TLS1_RT_CRYPTO | 0x2) +# define TLS1_RT_CRYPTO_SERVER_RANDOM (TLS1_RT_CRYPTO | 0x3) +# define TLS1_RT_CRYPTO_MASTER (TLS1_RT_CRYPTO | 0x4) + +# define TLS1_RT_CRYPTO_READ 0x0000 +# define TLS1_RT_CRYPTO_WRITE 0x0100 +# define TLS1_RT_CRYPTO_MAC (TLS1_RT_CRYPTO | 0x5) +# define TLS1_RT_CRYPTO_KEY (TLS1_RT_CRYPTO | 0x6) +# define TLS1_RT_CRYPTO_IV (TLS1_RT_CRYPTO | 0x7) +# define TLS1_RT_CRYPTO_FIXED_IV (TLS1_RT_CRYPTO | 0x8) + +/* Pseudo content type for SSL/TLS header info */ +# define SSL3_RT_HEADER 0x100 + +# define SSL3_AL_WARNING 1 +# define SSL3_AL_FATAL 2 + +# define SSL3_AD_CLOSE_NOTIFY 0 +# define SSL3_AD_UNEXPECTED_MESSAGE 10/* fatal */ +# define SSL3_AD_BAD_RECORD_MAC 20/* fatal */ +# define SSL3_AD_DECOMPRESSION_FAILURE 30/* fatal */ +# define SSL3_AD_HANDSHAKE_FAILURE 40/* fatal */ +# define SSL3_AD_NO_CERTIFICATE 41 +# define SSL3_AD_BAD_CERTIFICATE 42 +# define SSL3_AD_UNSUPPORTED_CERTIFICATE 43 +# define SSL3_AD_CERTIFICATE_REVOKED 44 +# define SSL3_AD_CERTIFICATE_EXPIRED 45 +# define SSL3_AD_CERTIFICATE_UNKNOWN 46 +# define SSL3_AD_ILLEGAL_PARAMETER 47/* fatal */ + +# define TLS1_HB_REQUEST 1 +# define TLS1_HB_RESPONSE 2 + +# ifndef OPENSSL_NO_SSL_INTERN + +typedef struct ssl3_record_st { + /* type of record */ + /* + * r + */ int type; + /* How many bytes available */ + /* + * rw + */ unsigned int length; + /* read/write offset into 'buf' */ + /* + * r + */ unsigned int off; + /* pointer to the record data */ + /* + * rw + */ unsigned char *data; + /* where the decode bytes are */ + /* + * rw + */ unsigned char *input; + /* only used with decompression - malloc()ed */ + /* + * r + */ unsigned char *comp; + /* epoch number, needed by DTLS1 */ + /* + * r + */ unsigned long epoch; + /* sequence number, needed by DTLS1 */ + /* + * r + */ unsigned char seq_num[8]; +} SSL3_RECORD; + +typedef struct ssl3_buffer_st { + /* at least SSL3_RT_MAX_PACKET_SIZE bytes, see ssl3_setup_buffers() */ + unsigned char *buf; + /* buffer size */ + size_t len; + /* where to 'copy from' */ + int offset; + /* how many bytes left */ + int left; +} SSL3_BUFFER; + +# endif + +# define SSL3_CT_RSA_SIGN 1 +# define SSL3_CT_DSS_SIGN 2 +# define SSL3_CT_RSA_FIXED_DH 3 +# define SSL3_CT_DSS_FIXED_DH 4 +# define SSL3_CT_RSA_EPHEMERAL_DH 5 +# define SSL3_CT_DSS_EPHEMERAL_DH 6 +# define SSL3_CT_FORTEZZA_DMS 20 +/* + * SSL3_CT_NUMBER is used to size arrays and it must be large enough to + * contain all of the cert types defined either for SSLv3 and TLSv1. + */ +# define SSL3_CT_NUMBER 9 + +# define SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS 0x0001 +# define SSL3_FLAGS_DELAY_CLIENT_FINISHED 0x0002 +# define SSL3_FLAGS_POP_BUFFER 0x0004 +# define TLS1_FLAGS_TLS_PADDING_BUG 0x0008 +# define TLS1_FLAGS_SKIP_CERT_VERIFY 0x0010 +# define TLS1_FLAGS_KEEP_HANDSHAKE 0x0020 +/* + * Set when the handshake is ready to process peer's ChangeCipherSpec message. + * Cleared after the message has been processed. + */ +# define SSL3_FLAGS_CCS_OK 0x0080 + +/* SSL3_FLAGS_SGC_RESTART_DONE is no longer used */ +# define SSL3_FLAGS_SGC_RESTART_DONE 0x0040 + +# ifndef OPENSSL_NO_SSL_INTERN + +typedef struct ssl3_state_st { + long flags; + int delay_buf_pop_ret; + unsigned char read_sequence[8]; + int read_mac_secret_size; + unsigned char read_mac_secret[EVP_MAX_MD_SIZE]; + unsigned char write_sequence[8]; + int write_mac_secret_size; + unsigned char write_mac_secret[EVP_MAX_MD_SIZE]; + unsigned char server_random[SSL3_RANDOM_SIZE]; + unsigned char client_random[SSL3_RANDOM_SIZE]; + /* flags for countermeasure against known-IV weakness */ + int need_empty_fragments; + int empty_fragment_done; + /* The value of 'extra' when the buffers were initialized */ + int init_extra; + SSL3_BUFFER rbuf; /* read IO goes into here */ + SSL3_BUFFER wbuf; /* write IO goes into here */ + SSL3_RECORD rrec; /* each decoded record goes in here */ + SSL3_RECORD wrec; /* goes out from here */ + /* + * storage for Alert/Handshake protocol data received but not yet + * processed by ssl3_read_bytes: + */ + unsigned char alert_fragment[2]; + unsigned int alert_fragment_len; + unsigned char handshake_fragment[4]; + unsigned int handshake_fragment_len; + /* partial write - check the numbers match */ + unsigned int wnum; /* number of bytes sent so far */ + int wpend_tot; /* number bytes written */ + int wpend_type; + int wpend_ret; /* number of bytes submitted */ + const unsigned char *wpend_buf; + /* used during startup, digest all incoming/outgoing packets */ + BIO *handshake_buffer; + /* + * When set of handshake digests is determined, buffer is hashed and + * freed and MD_CTX-es for all required digests are stored in this array + */ + EVP_MD_CTX **handshake_dgst; + /* + * Set whenever an expected ChangeCipherSpec message is processed. + * Unset when the peer's Finished message is received. + * Unexpected ChangeCipherSpec messages trigger a fatal alert. + */ + int change_cipher_spec; + int warn_alert; + int fatal_alert; + /* + * we allow one fatal and one warning alert to be outstanding, send close + * alert via the warning alert + */ + int alert_dispatch; + unsigned char send_alert[2]; + /* + * This flag is set when we should renegotiate ASAP, basically when there + * is no more data in the read or write buffers + */ + int renegotiate; + int total_renegotiations; + int num_renegotiations; + int in_read_app_data; + /* + * Opaque PRF input as used for the current handshake. These fields are + * used only if TLSEXT_TYPE_opaque_prf_input is defined (otherwise, they + * are merely present to improve binary compatibility) + */ + void *client_opaque_prf_input; + size_t client_opaque_prf_input_len; + void *server_opaque_prf_input; + size_t server_opaque_prf_input_len; + struct { + /* actually only needs to be 16+20 */ + unsigned char cert_verify_md[EVP_MAX_MD_SIZE * 2]; + /* actually only need to be 16+20 for SSLv3 and 12 for TLS */ + unsigned char finish_md[EVP_MAX_MD_SIZE * 2]; + int finish_md_len; + unsigned char peer_finish_md[EVP_MAX_MD_SIZE * 2]; + int peer_finish_md_len; + unsigned long message_size; + int message_type; + /* used to hold the new cipher we are going to use */ + const SSL_CIPHER *new_cipher; +# ifndef OPENSSL_NO_DH + DH *dh; +# endif +# ifndef OPENSSL_NO_ECDH + EC_KEY *ecdh; /* holds short lived ECDH key */ +# endif + /* used when SSL_ST_FLUSH_DATA is entered */ + int next_state; + int reuse_message; + /* used for certificate requests */ + int cert_req; + int ctype_num; + char ctype[SSL3_CT_NUMBER]; + STACK_OF(X509_NAME) *ca_names; + int use_rsa_tmp; + int key_block_length; + unsigned char *key_block; + const EVP_CIPHER *new_sym_enc; + const EVP_MD *new_hash; + int new_mac_pkey_type; + int new_mac_secret_size; +# ifndef OPENSSL_NO_COMP + const SSL_COMP *new_compression; +# else + char *new_compression; +# endif + int cert_request; + } tmp; + + /* Connection binding to prevent renegotiation attacks */ + unsigned char previous_client_finished[EVP_MAX_MD_SIZE]; + unsigned char previous_client_finished_len; + unsigned char previous_server_finished[EVP_MAX_MD_SIZE]; + unsigned char previous_server_finished_len; + int send_connection_binding; /* TODOEKR */ + +# ifndef OPENSSL_NO_NEXTPROTONEG + /* + * Set if we saw the Next Protocol Negotiation extension from our peer. + */ + int next_proto_neg_seen; +# endif + +# ifndef OPENSSL_NO_TLSEXT +# ifndef OPENSSL_NO_EC + /* + * This is set to true if we believe that this is a version of Safari + * running on OS X 10.6 or newer. We wish to know this because Safari on + * 10.8 .. 10.8.3 has broken ECDHE-ECDSA support. + */ + char is_probably_safari; +# endif /* !OPENSSL_NO_EC */ + + /* + * ALPN information (we are in the process of transitioning from NPN to + * ALPN.) + */ + + /* + * In a server these point to the selected ALPN protocol after the + * ClientHello has been processed. In a client these contain the protocol + * that the server selected once the ServerHello has been processed. + */ + unsigned char *alpn_selected; + unsigned alpn_selected_len; +# endif /* OPENSSL_NO_TLSEXT */ +} SSL3_STATE; + +# endif + +/* SSLv3 */ +/* + * client + */ +/* extra state */ +# define SSL3_ST_CW_FLUSH (0x100|SSL_ST_CONNECT) +# ifndef OPENSSL_NO_SCTP +# define DTLS1_SCTP_ST_CW_WRITE_SOCK (0x310|SSL_ST_CONNECT) +# define DTLS1_SCTP_ST_CR_READ_SOCK (0x320|SSL_ST_CONNECT) +# endif +/* write to server */ +# define SSL3_ST_CW_CLNT_HELLO_A (0x110|SSL_ST_CONNECT) +# define SSL3_ST_CW_CLNT_HELLO_B (0x111|SSL_ST_CONNECT) +/* read from server */ +# define SSL3_ST_CR_SRVR_HELLO_A (0x120|SSL_ST_CONNECT) +# define SSL3_ST_CR_SRVR_HELLO_B (0x121|SSL_ST_CONNECT) +# define DTLS1_ST_CR_HELLO_VERIFY_REQUEST_A (0x126|SSL_ST_CONNECT) +# define DTLS1_ST_CR_HELLO_VERIFY_REQUEST_B (0x127|SSL_ST_CONNECT) +# define SSL3_ST_CR_CERT_A (0x130|SSL_ST_CONNECT) +# define SSL3_ST_CR_CERT_B (0x131|SSL_ST_CONNECT) +# define SSL3_ST_CR_KEY_EXCH_A (0x140|SSL_ST_CONNECT) +# define SSL3_ST_CR_KEY_EXCH_B (0x141|SSL_ST_CONNECT) +# define SSL3_ST_CR_CERT_REQ_A (0x150|SSL_ST_CONNECT) +# define SSL3_ST_CR_CERT_REQ_B (0x151|SSL_ST_CONNECT) +# define SSL3_ST_CR_SRVR_DONE_A (0x160|SSL_ST_CONNECT) +# define SSL3_ST_CR_SRVR_DONE_B (0x161|SSL_ST_CONNECT) +/* write to server */ +# define SSL3_ST_CW_CERT_A (0x170|SSL_ST_CONNECT) +# define SSL3_ST_CW_CERT_B (0x171|SSL_ST_CONNECT) +# define SSL3_ST_CW_CERT_C (0x172|SSL_ST_CONNECT) +# define SSL3_ST_CW_CERT_D (0x173|SSL_ST_CONNECT) +# define SSL3_ST_CW_KEY_EXCH_A (0x180|SSL_ST_CONNECT) +# define SSL3_ST_CW_KEY_EXCH_B (0x181|SSL_ST_CONNECT) +# define SSL3_ST_CW_CERT_VRFY_A (0x190|SSL_ST_CONNECT) +# define SSL3_ST_CW_CERT_VRFY_B (0x191|SSL_ST_CONNECT) +# define SSL3_ST_CW_CHANGE_A (0x1A0|SSL_ST_CONNECT) +# define SSL3_ST_CW_CHANGE_B (0x1A1|SSL_ST_CONNECT) +# ifndef OPENSSL_NO_NEXTPROTONEG +# define SSL3_ST_CW_NEXT_PROTO_A (0x200|SSL_ST_CONNECT) +# define SSL3_ST_CW_NEXT_PROTO_B (0x201|SSL_ST_CONNECT) +# endif +# define SSL3_ST_CW_FINISHED_A (0x1B0|SSL_ST_CONNECT) +# define SSL3_ST_CW_FINISHED_B (0x1B1|SSL_ST_CONNECT) +/* read from server */ +# define SSL3_ST_CR_CHANGE_A (0x1C0|SSL_ST_CONNECT) +# define SSL3_ST_CR_CHANGE_B (0x1C1|SSL_ST_CONNECT) +# define SSL3_ST_CR_FINISHED_A (0x1D0|SSL_ST_CONNECT) +# define SSL3_ST_CR_FINISHED_B (0x1D1|SSL_ST_CONNECT) +# define SSL3_ST_CR_SESSION_TICKET_A (0x1E0|SSL_ST_CONNECT) +# define SSL3_ST_CR_SESSION_TICKET_B (0x1E1|SSL_ST_CONNECT) +# define SSL3_ST_CR_CERT_STATUS_A (0x1F0|SSL_ST_CONNECT) +# define SSL3_ST_CR_CERT_STATUS_B (0x1F1|SSL_ST_CONNECT) + +/* server */ +/* extra state */ +# define SSL3_ST_SW_FLUSH (0x100|SSL_ST_ACCEPT) +# ifndef OPENSSL_NO_SCTP +# define DTLS1_SCTP_ST_SW_WRITE_SOCK (0x310|SSL_ST_ACCEPT) +# define DTLS1_SCTP_ST_SR_READ_SOCK (0x320|SSL_ST_ACCEPT) +# endif +/* read from client */ +/* Do not change the number values, they do matter */ +# define SSL3_ST_SR_CLNT_HELLO_A (0x110|SSL_ST_ACCEPT) +# define SSL3_ST_SR_CLNT_HELLO_B (0x111|SSL_ST_ACCEPT) +# define SSL3_ST_SR_CLNT_HELLO_C (0x112|SSL_ST_ACCEPT) +# define SSL3_ST_SR_CLNT_HELLO_D (0x115|SSL_ST_ACCEPT) +/* write to client */ +# define DTLS1_ST_SW_HELLO_VERIFY_REQUEST_A (0x113|SSL_ST_ACCEPT) +# define DTLS1_ST_SW_HELLO_VERIFY_REQUEST_B (0x114|SSL_ST_ACCEPT) +# define SSL3_ST_SW_HELLO_REQ_A (0x120|SSL_ST_ACCEPT) +# define SSL3_ST_SW_HELLO_REQ_B (0x121|SSL_ST_ACCEPT) +# define SSL3_ST_SW_HELLO_REQ_C (0x122|SSL_ST_ACCEPT) +# define SSL3_ST_SW_SRVR_HELLO_A (0x130|SSL_ST_ACCEPT) +# define SSL3_ST_SW_SRVR_HELLO_B (0x131|SSL_ST_ACCEPT) +# define SSL3_ST_SW_CERT_A (0x140|SSL_ST_ACCEPT) +# define SSL3_ST_SW_CERT_B (0x141|SSL_ST_ACCEPT) +# define SSL3_ST_SW_KEY_EXCH_A (0x150|SSL_ST_ACCEPT) +# define SSL3_ST_SW_KEY_EXCH_B (0x151|SSL_ST_ACCEPT) +# define SSL3_ST_SW_CERT_REQ_A (0x160|SSL_ST_ACCEPT) +# define SSL3_ST_SW_CERT_REQ_B (0x161|SSL_ST_ACCEPT) +# define SSL3_ST_SW_SRVR_DONE_A (0x170|SSL_ST_ACCEPT) +# define SSL3_ST_SW_SRVR_DONE_B (0x171|SSL_ST_ACCEPT) +/* read from client */ +# define SSL3_ST_SR_CERT_A (0x180|SSL_ST_ACCEPT) +# define SSL3_ST_SR_CERT_B (0x181|SSL_ST_ACCEPT) +# define SSL3_ST_SR_KEY_EXCH_A (0x190|SSL_ST_ACCEPT) +# define SSL3_ST_SR_KEY_EXCH_B (0x191|SSL_ST_ACCEPT) +# define SSL3_ST_SR_CERT_VRFY_A (0x1A0|SSL_ST_ACCEPT) +# define SSL3_ST_SR_CERT_VRFY_B (0x1A1|SSL_ST_ACCEPT) +# define SSL3_ST_SR_CHANGE_A (0x1B0|SSL_ST_ACCEPT) +# define SSL3_ST_SR_CHANGE_B (0x1B1|SSL_ST_ACCEPT) +# ifndef OPENSSL_NO_NEXTPROTONEG +# define SSL3_ST_SR_NEXT_PROTO_A (0x210|SSL_ST_ACCEPT) +# define SSL3_ST_SR_NEXT_PROTO_B (0x211|SSL_ST_ACCEPT) +# endif +# define SSL3_ST_SR_FINISHED_A (0x1C0|SSL_ST_ACCEPT) +# define SSL3_ST_SR_FINISHED_B (0x1C1|SSL_ST_ACCEPT) +/* write to client */ +# define SSL3_ST_SW_CHANGE_A (0x1D0|SSL_ST_ACCEPT) +# define SSL3_ST_SW_CHANGE_B (0x1D1|SSL_ST_ACCEPT) +# define SSL3_ST_SW_FINISHED_A (0x1E0|SSL_ST_ACCEPT) +# define SSL3_ST_SW_FINISHED_B (0x1E1|SSL_ST_ACCEPT) +# define SSL3_ST_SW_SESSION_TICKET_A (0x1F0|SSL_ST_ACCEPT) +# define SSL3_ST_SW_SESSION_TICKET_B (0x1F1|SSL_ST_ACCEPT) +# define SSL3_ST_SW_CERT_STATUS_A (0x200|SSL_ST_ACCEPT) +# define SSL3_ST_SW_CERT_STATUS_B (0x201|SSL_ST_ACCEPT) + +# define SSL3_MT_HELLO_REQUEST 0 +# define SSL3_MT_CLIENT_HELLO 1 +# define SSL3_MT_SERVER_HELLO 2 +# define SSL3_MT_NEWSESSION_TICKET 4 +# define SSL3_MT_CERTIFICATE 11 +# define SSL3_MT_SERVER_KEY_EXCHANGE 12 +# define SSL3_MT_CERTIFICATE_REQUEST 13 +# define SSL3_MT_SERVER_DONE 14 +# define SSL3_MT_CERTIFICATE_VERIFY 15 +# define SSL3_MT_CLIENT_KEY_EXCHANGE 16 +# define SSL3_MT_FINISHED 20 +# define SSL3_MT_CERTIFICATE_STATUS 22 +# ifndef OPENSSL_NO_NEXTPROTONEG +# define SSL3_MT_NEXT_PROTO 67 +# endif +# define DTLS1_MT_HELLO_VERIFY_REQUEST 3 + +# define SSL3_MT_CCS 1 + +/* These are used when changing over to a new cipher */ +# define SSL3_CC_READ 0x01 +# define SSL3_CC_WRITE 0x02 +# define SSL3_CC_CLIENT 0x10 +# define SSL3_CC_SERVER 0x20 +# define SSL3_CHANGE_CIPHER_CLIENT_WRITE (SSL3_CC_CLIENT|SSL3_CC_WRITE) +# define SSL3_CHANGE_CIPHER_SERVER_READ (SSL3_CC_SERVER|SSL3_CC_READ) +# define SSL3_CHANGE_CIPHER_CLIENT_READ (SSL3_CC_CLIENT|SSL3_CC_READ) +# define SSL3_CHANGE_CIPHER_SERVER_WRITE (SSL3_CC_SERVER|SSL3_CC_WRITE) + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/stack.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/stack.h new file mode 100644 index 0000000..eb07216 --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/stack.h @@ -0,0 +1,107 @@ +/* crypto/stack/stack.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_STACK_H +# define HEADER_STACK_H + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct stack_st { + int num; + char **data; + int sorted; + int num_alloc; + int (*comp) (const void *, const void *); +} _STACK; /* Use STACK_OF(...) instead */ + +# define M_sk_num(sk) ((sk) ? (sk)->num:-1) +# define M_sk_value(sk,n) ((sk) ? (sk)->data[n] : NULL) + +int sk_num(const _STACK *); +void *sk_value(const _STACK *, int); + +void *sk_set(_STACK *, int, void *); + +_STACK *sk_new(int (*cmp) (const void *, const void *)); +_STACK *sk_new_null(void); +void sk_free(_STACK *); +void sk_pop_free(_STACK *st, void (*func) (void *)); +_STACK *sk_deep_copy(_STACK *, void *(*)(void *), void (*)(void *)); +int sk_insert(_STACK *sk, void *data, int where); +void *sk_delete(_STACK *st, int loc); +void *sk_delete_ptr(_STACK *st, void *p); +int sk_find(_STACK *st, void *data); +int sk_find_ex(_STACK *st, void *data); +int sk_push(_STACK *st, void *data); +int sk_unshift(_STACK *st, void *data); +void *sk_shift(_STACK *st); +void *sk_pop(_STACK *st); +void sk_zero(_STACK *st); +int (*sk_set_cmp_func(_STACK *sk, int (*c) (const void *, const void *))) + (const void *, const void *); +_STACK *sk_dup(_STACK *st); +void sk_sort(_STACK *st); +int sk_is_sorted(const _STACK *st); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/symhacks.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/symhacks.h new file mode 100644 index 0000000..239fa4f --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/symhacks.h @@ -0,0 +1,516 @@ +/* ==================================================================== + * Copyright (c) 1999 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_SYMHACKS_H +# define HEADER_SYMHACKS_H + +# include + +/* + * Hacks to solve the problem with linkers incapable of handling very long + * symbol names. In the case of VMS, the limit is 31 characters on VMS for + * VAX. + */ +/* + * Note that this affects util/libeay.num and util/ssleay.num... you may + * change those manually, but that's not recommended, as those files are + * controlled centrally and updated on Unix, and the central definition may + * disagree with yours, which in turn may come with shareable library + * incompatibilities. + */ +# ifdef OPENSSL_SYS_VMS + +/* Hack a long name in crypto/ex_data.c */ +# undef CRYPTO_get_ex_data_implementation +# define CRYPTO_get_ex_data_implementation CRYPTO_get_ex_data_impl +# undef CRYPTO_set_ex_data_implementation +# define CRYPTO_set_ex_data_implementation CRYPTO_set_ex_data_impl + +/* Hack a long name in crypto/asn1/a_mbstr.c */ +# undef ASN1_STRING_set_default_mask_asc +# define ASN1_STRING_set_default_mask_asc ASN1_STRING_set_def_mask_asc + +# if 0 /* No longer needed, since safestack macro + * magic does the job */ +/* Hack the names created with DECLARE_ASN1_SET_OF(PKCS7_SIGNER_INFO) */ +# undef i2d_ASN1_SET_OF_PKCS7_SIGNER_INFO +# define i2d_ASN1_SET_OF_PKCS7_SIGNER_INFO i2d_ASN1_SET_OF_PKCS7_SIGINF +# undef d2i_ASN1_SET_OF_PKCS7_SIGNER_INFO +# define d2i_ASN1_SET_OF_PKCS7_SIGNER_INFO d2i_ASN1_SET_OF_PKCS7_SIGINF +# endif + +# if 0 /* No longer needed, since safestack macro + * magic does the job */ +/* Hack the names created with DECLARE_ASN1_SET_OF(PKCS7_RECIP_INFO) */ +# undef i2d_ASN1_SET_OF_PKCS7_RECIP_INFO +# define i2d_ASN1_SET_OF_PKCS7_RECIP_INFO i2d_ASN1_SET_OF_PKCS7_RECINF +# undef d2i_ASN1_SET_OF_PKCS7_RECIP_INFO +# define d2i_ASN1_SET_OF_PKCS7_RECIP_INFO d2i_ASN1_SET_OF_PKCS7_RECINF +# endif + +# if 0 /* No longer needed, since safestack macro + * magic does the job */ +/* Hack the names created with DECLARE_ASN1_SET_OF(ACCESS_DESCRIPTION) */ +# undef i2d_ASN1_SET_OF_ACCESS_DESCRIPTION +# define i2d_ASN1_SET_OF_ACCESS_DESCRIPTION i2d_ASN1_SET_OF_ACC_DESC +# undef d2i_ASN1_SET_OF_ACCESS_DESCRIPTION +# define d2i_ASN1_SET_OF_ACCESS_DESCRIPTION d2i_ASN1_SET_OF_ACC_DESC +# endif + +/* Hack the names created with DECLARE_PEM_rw(NETSCAPE_CERT_SEQUENCE) */ +# undef PEM_read_NETSCAPE_CERT_SEQUENCE +# define PEM_read_NETSCAPE_CERT_SEQUENCE PEM_read_NS_CERT_SEQ +# undef PEM_write_NETSCAPE_CERT_SEQUENCE +# define PEM_write_NETSCAPE_CERT_SEQUENCE PEM_write_NS_CERT_SEQ +# undef PEM_read_bio_NETSCAPE_CERT_SEQUENCE +# define PEM_read_bio_NETSCAPE_CERT_SEQUENCE PEM_read_bio_NS_CERT_SEQ +# undef PEM_write_bio_NETSCAPE_CERT_SEQUENCE +# define PEM_write_bio_NETSCAPE_CERT_SEQUENCE PEM_write_bio_NS_CERT_SEQ +# undef PEM_write_cb_bio_NETSCAPE_CERT_SEQUENCE +# define PEM_write_cb_bio_NETSCAPE_CERT_SEQUENCE PEM_write_cb_bio_NS_CERT_SEQ + +/* Hack the names created with DECLARE_PEM_rw(PKCS8_PRIV_KEY_INFO) */ +# undef PEM_read_PKCS8_PRIV_KEY_INFO +# define PEM_read_PKCS8_PRIV_KEY_INFO PEM_read_P8_PRIV_KEY_INFO +# undef PEM_write_PKCS8_PRIV_KEY_INFO +# define PEM_write_PKCS8_PRIV_KEY_INFO PEM_write_P8_PRIV_KEY_INFO +# undef PEM_read_bio_PKCS8_PRIV_KEY_INFO +# define PEM_read_bio_PKCS8_PRIV_KEY_INFO PEM_read_bio_P8_PRIV_KEY_INFO +# undef PEM_write_bio_PKCS8_PRIV_KEY_INFO +# define PEM_write_bio_PKCS8_PRIV_KEY_INFO PEM_write_bio_P8_PRIV_KEY_INFO +# undef PEM_write_cb_bio_PKCS8_PRIV_KEY_INFO +# define PEM_write_cb_bio_PKCS8_PRIV_KEY_INFO PEM_wrt_cb_bio_P8_PRIV_KEY_INFO + +/* Hack other PEM names */ +# undef PEM_write_bio_PKCS8PrivateKey_nid +# define PEM_write_bio_PKCS8PrivateKey_nid PEM_write_bio_PKCS8PrivKey_nid + +/* Hack some long X509 names */ +# undef X509_REVOKED_get_ext_by_critical +# define X509_REVOKED_get_ext_by_critical X509_REVOKED_get_ext_by_critic +# undef X509_policy_tree_get0_user_policies +# define X509_policy_tree_get0_user_policies X509_pcy_tree_get0_usr_policies +# undef X509_policy_node_get0_qualifiers +# define X509_policy_node_get0_qualifiers X509_pcy_node_get0_qualifiers +# undef X509_STORE_CTX_get_explicit_policy +# define X509_STORE_CTX_get_explicit_policy X509_STORE_CTX_get_expl_policy +# undef X509_STORE_CTX_get0_current_issuer +# define X509_STORE_CTX_get0_current_issuer X509_STORE_CTX_get0_cur_issuer + +/* Hack some long CRYPTO names */ +# undef CRYPTO_set_dynlock_destroy_callback +# define CRYPTO_set_dynlock_destroy_callback CRYPTO_set_dynlock_destroy_cb +# undef CRYPTO_set_dynlock_create_callback +# define CRYPTO_set_dynlock_create_callback CRYPTO_set_dynlock_create_cb +# undef CRYPTO_set_dynlock_lock_callback +# define CRYPTO_set_dynlock_lock_callback CRYPTO_set_dynlock_lock_cb +# undef CRYPTO_get_dynlock_lock_callback +# define CRYPTO_get_dynlock_lock_callback CRYPTO_get_dynlock_lock_cb +# undef CRYPTO_get_dynlock_destroy_callback +# define CRYPTO_get_dynlock_destroy_callback CRYPTO_get_dynlock_destroy_cb +# undef CRYPTO_get_dynlock_create_callback +# define CRYPTO_get_dynlock_create_callback CRYPTO_get_dynlock_create_cb +# undef CRYPTO_set_locked_mem_ex_functions +# define CRYPTO_set_locked_mem_ex_functions CRYPTO_set_locked_mem_ex_funcs +# undef CRYPTO_get_locked_mem_ex_functions +# define CRYPTO_get_locked_mem_ex_functions CRYPTO_get_locked_mem_ex_funcs + +/* Hack some long SSL/TLS names */ +# undef SSL_CTX_set_default_verify_paths +# define SSL_CTX_set_default_verify_paths SSL_CTX_set_def_verify_paths +# undef SSL_get_ex_data_X509_STORE_CTX_idx +# define SSL_get_ex_data_X509_STORE_CTX_idx SSL_get_ex_d_X509_STORE_CTX_idx +# undef SSL_add_file_cert_subjects_to_stack +# define SSL_add_file_cert_subjects_to_stack SSL_add_file_cert_subjs_to_stk +# undef SSL_add_dir_cert_subjects_to_stack +# define SSL_add_dir_cert_subjects_to_stack SSL_add_dir_cert_subjs_to_stk +# undef SSL_CTX_use_certificate_chain_file +# define SSL_CTX_use_certificate_chain_file SSL_CTX_use_cert_chain_file +# undef SSL_CTX_set_cert_verify_callback +# define SSL_CTX_set_cert_verify_callback SSL_CTX_set_cert_verify_cb +# undef SSL_CTX_set_default_passwd_cb_userdata +# define SSL_CTX_set_default_passwd_cb_userdata SSL_CTX_set_def_passwd_cb_ud +# undef SSL_COMP_get_compression_methods +# define SSL_COMP_get_compression_methods SSL_COMP_get_compress_methods +# undef SSL_COMP_set0_compression_methods +# define SSL_COMP_set0_compression_methods SSL_COMP_set0_compress_methods +# undef SSL_COMP_free_compression_methods +# define SSL_COMP_free_compression_methods SSL_COMP_free_compress_methods +# undef ssl_add_clienthello_renegotiate_ext +# define ssl_add_clienthello_renegotiate_ext ssl_add_clienthello_reneg_ext +# undef ssl_add_serverhello_renegotiate_ext +# define ssl_add_serverhello_renegotiate_ext ssl_add_serverhello_reneg_ext +# undef ssl_parse_clienthello_renegotiate_ext +# define ssl_parse_clienthello_renegotiate_ext ssl_parse_clienthello_reneg_ext +# undef ssl_parse_serverhello_renegotiate_ext +# define ssl_parse_serverhello_renegotiate_ext ssl_parse_serverhello_reneg_ext +# undef SSL_srp_server_param_with_username +# define SSL_srp_server_param_with_username SSL_srp_server_param_with_un +# undef SSL_CTX_set_srp_client_pwd_callback +# define SSL_CTX_set_srp_client_pwd_callback SSL_CTX_set_srp_client_pwd_cb +# undef SSL_CTX_set_srp_verify_param_callback +# define SSL_CTX_set_srp_verify_param_callback SSL_CTX_set_srp_vfy_param_cb +# undef SSL_CTX_set_srp_username_callback +# define SSL_CTX_set_srp_username_callback SSL_CTX_set_srp_un_cb +# undef ssl_add_clienthello_use_srtp_ext +# define ssl_add_clienthello_use_srtp_ext ssl_add_clihello_use_srtp_ext +# undef ssl_add_serverhello_use_srtp_ext +# define ssl_add_serverhello_use_srtp_ext ssl_add_serhello_use_srtp_ext +# undef ssl_parse_clienthello_use_srtp_ext +# define ssl_parse_clienthello_use_srtp_ext ssl_parse_clihello_use_srtp_ext +# undef ssl_parse_serverhello_use_srtp_ext +# define ssl_parse_serverhello_use_srtp_ext ssl_parse_serhello_use_srtp_ext +# undef SSL_CTX_set_next_protos_advertised_cb +# define SSL_CTX_set_next_protos_advertised_cb SSL_CTX_set_next_protos_adv_cb +# undef SSL_CTX_set_next_proto_select_cb +# define SSL_CTX_set_next_proto_select_cb SSL_CTX_set_next_proto_sel_cb + +# undef tls1_send_server_supplemental_data +# define tls1_send_server_supplemental_data tls1_send_server_suppl_data +# undef tls1_send_client_supplemental_data +# define tls1_send_client_supplemental_data tls1_send_client_suppl_data +# undef tls1_get_server_supplemental_data +# define tls1_get_server_supplemental_data tls1_get_server_suppl_data +# undef tls1_get_client_supplemental_data +# define tls1_get_client_supplemental_data tls1_get_client_suppl_data + +# undef ssl3_cbc_record_digest_supported +# define ssl3_cbc_record_digest_supported ssl3_cbc_record_digest_support +# undef ssl_check_clienthello_tlsext_late +# define ssl_check_clienthello_tlsext_late ssl_check_clihello_tlsext_late +# undef ssl_check_clienthello_tlsext_early +# define ssl_check_clienthello_tlsext_early ssl_check_clihello_tlsext_early + +/* Hack some RSA long names */ +# undef RSA_padding_check_PKCS1_OAEP_mgf1 +# define RSA_padding_check_PKCS1_OAEP_mgf1 RSA_pad_check_PKCS1_OAEP_mgf1 + +/* Hack some ENGINE long names */ +# undef ENGINE_get_default_BN_mod_exp_crt +# define ENGINE_get_default_BN_mod_exp_crt ENGINE_get_def_BN_mod_exp_crt +# undef ENGINE_set_default_BN_mod_exp_crt +# define ENGINE_set_default_BN_mod_exp_crt ENGINE_set_def_BN_mod_exp_crt +# undef ENGINE_set_load_privkey_function +# define ENGINE_set_load_privkey_function ENGINE_set_load_privkey_fn +# undef ENGINE_get_load_privkey_function +# define ENGINE_get_load_privkey_function ENGINE_get_load_privkey_fn +# undef ENGINE_unregister_pkey_asn1_meths +# define ENGINE_unregister_pkey_asn1_meths ENGINE_unreg_pkey_asn1_meths +# undef ENGINE_register_all_pkey_asn1_meths +# define ENGINE_register_all_pkey_asn1_meths ENGINE_reg_all_pkey_asn1_meths +# undef ENGINE_set_default_pkey_asn1_meths +# define ENGINE_set_default_pkey_asn1_meths ENGINE_set_def_pkey_asn1_meths +# undef ENGINE_get_pkey_asn1_meth_engine +# define ENGINE_get_pkey_asn1_meth_engine ENGINE_get_pkey_asn1_meth_eng +# undef ENGINE_set_load_ssl_client_cert_function +# define ENGINE_set_load_ssl_client_cert_function \ + ENGINE_set_ld_ssl_clnt_cert_fn +# undef ENGINE_get_ssl_client_cert_function +# define ENGINE_get_ssl_client_cert_function ENGINE_get_ssl_client_cert_fn + +/* Hack some long OCSP names */ +# undef OCSP_REQUEST_get_ext_by_critical +# define OCSP_REQUEST_get_ext_by_critical OCSP_REQUEST_get_ext_by_crit +# undef OCSP_BASICRESP_get_ext_by_critical +# define OCSP_BASICRESP_get_ext_by_critical OCSP_BASICRESP_get_ext_by_crit +# undef OCSP_SINGLERESP_get_ext_by_critical +# define OCSP_SINGLERESP_get_ext_by_critical OCSP_SINGLERESP_get_ext_by_crit + +/* Hack some long DES names */ +# undef _ossl_old_des_ede3_cfb64_encrypt +# define _ossl_old_des_ede3_cfb64_encrypt _ossl_odes_ede3_cfb64_encrypt +# undef _ossl_old_des_ede3_ofb64_encrypt +# define _ossl_old_des_ede3_ofb64_encrypt _ossl_odes_ede3_ofb64_encrypt + +/* Hack some long EVP names */ +# undef OPENSSL_add_all_algorithms_noconf +# define OPENSSL_add_all_algorithms_noconf OPENSSL_add_all_algo_noconf +# undef OPENSSL_add_all_algorithms_conf +# define OPENSSL_add_all_algorithms_conf OPENSSL_add_all_algo_conf +# undef EVP_PKEY_meth_set_verify_recover +# define EVP_PKEY_meth_set_verify_recover EVP_PKEY_meth_set_vrfy_recover + +/* Hack some long EC names */ +# undef EC_GROUP_set_point_conversion_form +# define EC_GROUP_set_point_conversion_form EC_GROUP_set_point_conv_form +# undef EC_GROUP_get_point_conversion_form +# define EC_GROUP_get_point_conversion_form EC_GROUP_get_point_conv_form +# undef EC_GROUP_clear_free_all_extra_data +# define EC_GROUP_clear_free_all_extra_data EC_GROUP_clr_free_all_xtra_data +# undef EC_KEY_set_public_key_affine_coordinates +# define EC_KEY_set_public_key_affine_coordinates \ + EC_KEY_set_pub_key_aff_coords +# undef EC_POINT_set_Jprojective_coordinates_GFp +# define EC_POINT_set_Jprojective_coordinates_GFp \ + EC_POINT_set_Jproj_coords_GFp +# undef EC_POINT_get_Jprojective_coordinates_GFp +# define EC_POINT_get_Jprojective_coordinates_GFp \ + EC_POINT_get_Jproj_coords_GFp +# undef EC_POINT_set_affine_coordinates_GFp +# define EC_POINT_set_affine_coordinates_GFp EC_POINT_set_affine_coords_GFp +# undef EC_POINT_get_affine_coordinates_GFp +# define EC_POINT_get_affine_coordinates_GFp EC_POINT_get_affine_coords_GFp +# undef EC_POINT_set_compressed_coordinates_GFp +# define EC_POINT_set_compressed_coordinates_GFp EC_POINT_set_compr_coords_GFp +# undef EC_POINT_set_affine_coordinates_GF2m +# define EC_POINT_set_affine_coordinates_GF2m EC_POINT_set_affine_coords_GF2m +# undef EC_POINT_get_affine_coordinates_GF2m +# define EC_POINT_get_affine_coordinates_GF2m EC_POINT_get_affine_coords_GF2m +# undef EC_POINT_set_compressed_coordinates_GF2m +# define EC_POINT_set_compressed_coordinates_GF2m \ + EC_POINT_set_compr_coords_GF2m +# undef ec_GF2m_simple_group_clear_finish +# define ec_GF2m_simple_group_clear_finish ec_GF2m_simple_grp_clr_finish +# undef ec_GF2m_simple_group_check_discriminant +# define ec_GF2m_simple_group_check_discriminant ec_GF2m_simple_grp_chk_discrim +# undef ec_GF2m_simple_point_clear_finish +# define ec_GF2m_simple_point_clear_finish ec_GF2m_simple_pt_clr_finish +# undef ec_GF2m_simple_point_set_to_infinity +# define ec_GF2m_simple_point_set_to_infinity ec_GF2m_simple_pt_set_to_inf +# undef ec_GF2m_simple_points_make_affine +# define ec_GF2m_simple_points_make_affine ec_GF2m_simple_pts_make_affine +# undef ec_GF2m_simple_point_set_affine_coordinates +# define ec_GF2m_simple_point_set_affine_coordinates \ + ec_GF2m_smp_pt_set_af_coords +# undef ec_GF2m_simple_point_get_affine_coordinates +# define ec_GF2m_simple_point_get_affine_coordinates \ + ec_GF2m_smp_pt_get_af_coords +# undef ec_GF2m_simple_set_compressed_coordinates +# define ec_GF2m_simple_set_compressed_coordinates \ + ec_GF2m_smp_set_compr_coords +# undef ec_GFp_simple_group_set_curve_GFp +# define ec_GFp_simple_group_set_curve_GFp ec_GFp_simple_grp_set_curve_GFp +# undef ec_GFp_simple_group_get_curve_GFp +# define ec_GFp_simple_group_get_curve_GFp ec_GFp_simple_grp_get_curve_GFp +# undef ec_GFp_simple_group_clear_finish +# define ec_GFp_simple_group_clear_finish ec_GFp_simple_grp_clear_finish +# undef ec_GFp_simple_group_set_generator +# define ec_GFp_simple_group_set_generator ec_GFp_simple_grp_set_generator +# undef ec_GFp_simple_group_get0_generator +# define ec_GFp_simple_group_get0_generator ec_GFp_simple_grp_gt0_generator +# undef ec_GFp_simple_group_get_cofactor +# define ec_GFp_simple_group_get_cofactor ec_GFp_simple_grp_get_cofactor +# undef ec_GFp_simple_point_clear_finish +# define ec_GFp_simple_point_clear_finish ec_GFp_simple_pt_clear_finish +# undef ec_GFp_simple_point_set_to_infinity +# define ec_GFp_simple_point_set_to_infinity ec_GFp_simple_pt_set_to_inf +# undef ec_GFp_simple_points_make_affine +# define ec_GFp_simple_points_make_affine ec_GFp_simple_pts_make_affine +# undef ec_GFp_simple_set_Jprojective_coordinates_GFp +# define ec_GFp_simple_set_Jprojective_coordinates_GFp \ + ec_GFp_smp_set_Jproj_coords_GFp +# undef ec_GFp_simple_get_Jprojective_coordinates_GFp +# define ec_GFp_simple_get_Jprojective_coordinates_GFp \ + ec_GFp_smp_get_Jproj_coords_GFp +# undef ec_GFp_simple_point_set_affine_coordinates_GFp +# define ec_GFp_simple_point_set_affine_coordinates_GFp \ + ec_GFp_smp_pt_set_af_coords_GFp +# undef ec_GFp_simple_point_get_affine_coordinates_GFp +# define ec_GFp_simple_point_get_affine_coordinates_GFp \ + ec_GFp_smp_pt_get_af_coords_GFp +# undef ec_GFp_simple_set_compressed_coordinates_GFp +# define ec_GFp_simple_set_compressed_coordinates_GFp \ + ec_GFp_smp_set_compr_coords_GFp +# undef ec_GFp_simple_point_set_affine_coordinates +# define ec_GFp_simple_point_set_affine_coordinates \ + ec_GFp_smp_pt_set_af_coords +# undef ec_GFp_simple_point_get_affine_coordinates +# define ec_GFp_simple_point_get_affine_coordinates \ + ec_GFp_smp_pt_get_af_coords +# undef ec_GFp_simple_set_compressed_coordinates +# define ec_GFp_simple_set_compressed_coordinates \ + ec_GFp_smp_set_compr_coords +# undef ec_GFp_simple_group_check_discriminant +# define ec_GFp_simple_group_check_discriminant ec_GFp_simple_grp_chk_discrim + +/* Hack som long STORE names */ +# undef STORE_method_set_initialise_function +# define STORE_method_set_initialise_function STORE_meth_set_initialise_fn +# undef STORE_method_set_cleanup_function +# define STORE_method_set_cleanup_function STORE_meth_set_cleanup_fn +# undef STORE_method_set_generate_function +# define STORE_method_set_generate_function STORE_meth_set_generate_fn +# undef STORE_method_set_modify_function +# define STORE_method_set_modify_function STORE_meth_set_modify_fn +# undef STORE_method_set_revoke_function +# define STORE_method_set_revoke_function STORE_meth_set_revoke_fn +# undef STORE_method_set_delete_function +# define STORE_method_set_delete_function STORE_meth_set_delete_fn +# undef STORE_method_set_list_start_function +# define STORE_method_set_list_start_function STORE_meth_set_list_start_fn +# undef STORE_method_set_list_next_function +# define STORE_method_set_list_next_function STORE_meth_set_list_next_fn +# undef STORE_method_set_list_end_function +# define STORE_method_set_list_end_function STORE_meth_set_list_end_fn +# undef STORE_method_set_update_store_function +# define STORE_method_set_update_store_function STORE_meth_set_update_store_fn +# undef STORE_method_set_lock_store_function +# define STORE_method_set_lock_store_function STORE_meth_set_lock_store_fn +# undef STORE_method_set_unlock_store_function +# define STORE_method_set_unlock_store_function STORE_meth_set_unlock_store_fn +# undef STORE_method_get_initialise_function +# define STORE_method_get_initialise_function STORE_meth_get_initialise_fn +# undef STORE_method_get_cleanup_function +# define STORE_method_get_cleanup_function STORE_meth_get_cleanup_fn +# undef STORE_method_get_generate_function +# define STORE_method_get_generate_function STORE_meth_get_generate_fn +# undef STORE_method_get_modify_function +# define STORE_method_get_modify_function STORE_meth_get_modify_fn +# undef STORE_method_get_revoke_function +# define STORE_method_get_revoke_function STORE_meth_get_revoke_fn +# undef STORE_method_get_delete_function +# define STORE_method_get_delete_function STORE_meth_get_delete_fn +# undef STORE_method_get_list_start_function +# define STORE_method_get_list_start_function STORE_meth_get_list_start_fn +# undef STORE_method_get_list_next_function +# define STORE_method_get_list_next_function STORE_meth_get_list_next_fn +# undef STORE_method_get_list_end_function +# define STORE_method_get_list_end_function STORE_meth_get_list_end_fn +# undef STORE_method_get_update_store_function +# define STORE_method_get_update_store_function STORE_meth_get_update_store_fn +# undef STORE_method_get_lock_store_function +# define STORE_method_get_lock_store_function STORE_meth_get_lock_store_fn +# undef STORE_method_get_unlock_store_function +# define STORE_method_get_unlock_store_function STORE_meth_get_unlock_store_fn + +/* Hack some long TS names */ +# undef TS_RESP_CTX_set_status_info_cond +# define TS_RESP_CTX_set_status_info_cond TS_RESP_CTX_set_stat_info_cond +# undef TS_RESP_CTX_set_clock_precision_digits +# define TS_RESP_CTX_set_clock_precision_digits TS_RESP_CTX_set_clk_prec_digits +# undef TS_CONF_set_clock_precision_digits +# define TS_CONF_set_clock_precision_digits TS_CONF_set_clk_prec_digits + +/* Hack some long CMS names */ +# undef CMS_RecipientInfo_ktri_get0_algs +# define CMS_RecipientInfo_ktri_get0_algs CMS_RecipInfo_ktri_get0_algs +# undef CMS_RecipientInfo_ktri_get0_signer_id +# define CMS_RecipientInfo_ktri_get0_signer_id CMS_RecipInfo_ktri_get0_sigr_id +# undef CMS_OtherRevocationInfoFormat_it +# define CMS_OtherRevocationInfoFormat_it CMS_OtherRevocInfoFormat_it +# undef CMS_KeyAgreeRecipientIdentifier_it +# define CMS_KeyAgreeRecipientIdentifier_it CMS_KeyAgreeRecipIdentifier_it +# undef CMS_OriginatorIdentifierOrKey_it +# define CMS_OriginatorIdentifierOrKey_it CMS_OriginatorIdOrKey_it +# undef cms_SignerIdentifier_get0_signer_id +# define cms_SignerIdentifier_get0_signer_id cms_SignerId_get0_signer_id +# undef CMS_RecipientInfo_kari_get0_orig_id +# define CMS_RecipientInfo_kari_get0_orig_id CMS_RecipInfo_kari_get0_orig_id +# undef CMS_RecipientInfo_kari_get0_reks +# define CMS_RecipientInfo_kari_get0_reks CMS_RecipInfo_kari_get0_reks +# undef CMS_RecipientEncryptedKey_cert_cmp +# define CMS_RecipientEncryptedKey_cert_cmp CMS_RecipEncryptedKey_cert_cmp +# undef CMS_RecipientInfo_kari_set0_pkey +# define CMS_RecipientInfo_kari_set0_pkey CMS_RecipInfo_kari_set0_pkey +# undef CMS_RecipientEncryptedKey_get0_id +# define CMS_RecipientEncryptedKey_get0_id CMS_RecipEncryptedKey_get0_id +# undef CMS_RecipientInfo_kari_orig_id_cmp +# define CMS_RecipientInfo_kari_orig_id_cmp CMS_RecipInfo_kari_orig_id_cmp + +/* Hack some long DTLS1 names */ +# undef dtls1_retransmit_buffered_messages +# define dtls1_retransmit_buffered_messages dtls1_retransmit_buffered_msgs + +/* Hack some long SRP names */ +# undef SRP_generate_server_master_secret +# define SRP_generate_server_master_secret SRP_gen_server_master_secret +# undef SRP_generate_client_master_secret +# define SRP_generate_client_master_secret SRP_gen_client_master_secret + +/* Hack some long UI names */ +# undef UI_method_get_prompt_constructor +# define UI_method_get_prompt_constructor UI_method_get_prompt_constructr +# undef UI_method_set_prompt_constructor +# define UI_method_set_prompt_constructor UI_method_set_prompt_constructr + +# endif /* defined OPENSSL_SYS_VMS */ + +/* Case insensitive linking causes problems.... */ +# if defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_OS2) +# undef ERR_load_CRYPTO_strings +# define ERR_load_CRYPTO_strings ERR_load_CRYPTOlib_strings +# undef OCSP_crlID_new +# define OCSP_crlID_new OCSP_crlID2_new + +# undef d2i_ECPARAMETERS +# define d2i_ECPARAMETERS d2i_UC_ECPARAMETERS +# undef i2d_ECPARAMETERS +# define i2d_ECPARAMETERS i2d_UC_ECPARAMETERS +# undef d2i_ECPKPARAMETERS +# define d2i_ECPKPARAMETERS d2i_UC_ECPKPARAMETERS +# undef i2d_ECPKPARAMETERS +# define i2d_ECPKPARAMETERS i2d_UC_ECPKPARAMETERS + +/* + * These functions do not seem to exist! However, I'm paranoid... Original + * command in x509v3.h: These functions are being redefined in another + * directory, and clash when the linker is case-insensitive, so let's hide + * them a little, by giving them an extra 'o' at the beginning of the name... + */ +# undef X509v3_cleanup_extensions +# define X509v3_cleanup_extensions oX509v3_cleanup_extensions +# undef X509v3_add_extension +# define X509v3_add_extension oX509v3_add_extension +# undef X509v3_add_netscape_extensions +# define X509v3_add_netscape_extensions oX509v3_add_netscape_extensions +# undef X509v3_add_standard_extensions +# define X509v3_add_standard_extensions oX509v3_add_standard_extensions + +/* This one clashes with CMS_data_create */ +# undef cms_Data_create +# define cms_Data_create priv_cms_Data_create + +# endif + +#endif /* ! defined HEADER_VMS_IDHACKS_H */ diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/tls1.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/tls1.h new file mode 100644 index 0000000..7e237d0 --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/tls1.h @@ -0,0 +1,810 @@ +/* ssl/tls1.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ +/* ==================================================================== + * Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * + * Portions of the attached software ("Contribution") are developed by + * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project. + * + * The Contribution is licensed pursuant to the OpenSSL open source + * license provided above. + * + * ECC cipher suite support in OpenSSL originally written by + * Vipul Gupta and Sumit Gupta of Sun Microsystems Laboratories. + * + */ +/* ==================================================================== + * Copyright 2005 Nokia. All rights reserved. + * + * The portions of the attached software ("Contribution") is developed by + * Nokia Corporation and is licensed pursuant to the OpenSSL open source + * license. + * + * The Contribution, originally written by Mika Kousa and Pasi Eronen of + * Nokia Corporation, consists of the "PSK" (Pre-Shared Key) ciphersuites + * support (see RFC 4279) to OpenSSL. + * + * No patent licenses or other rights except those expressly stated in + * the OpenSSL open source license shall be deemed granted or received + * expressly, by implication, estoppel, or otherwise. + * + * No assurances are provided by Nokia that the Contribution does not + * infringe the patent or other intellectual property rights of any third + * party or that the license provides you with all the necessary rights + * to make use of the Contribution. + * + * THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. IN + * ADDITION TO THE DISCLAIMERS INCLUDED IN THE LICENSE, NOKIA + * SPECIFICALLY DISCLAIMS ANY LIABILITY FOR CLAIMS BROUGHT BY YOU OR ANY + * OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS OR + * OTHERWISE. + */ + +#ifndef HEADER_TLS1_H +# define HEADER_TLS1_H + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES 0 + +# define TLS1_VERSION 0x0301 +# define TLS1_1_VERSION 0x0302 +# define TLS1_2_VERSION 0x0303 +# define TLS_MAX_VERSION TLS1_2_VERSION + +# define TLS1_VERSION_MAJOR 0x03 +# define TLS1_VERSION_MINOR 0x01 + +# define TLS1_1_VERSION_MAJOR 0x03 +# define TLS1_1_VERSION_MINOR 0x02 + +# define TLS1_2_VERSION_MAJOR 0x03 +# define TLS1_2_VERSION_MINOR 0x03 + +# define TLS1_get_version(s) \ + ((s->version >> 8) == TLS1_VERSION_MAJOR ? s->version : 0) + +# define TLS1_get_client_version(s) \ + ((s->client_version >> 8) == TLS1_VERSION_MAJOR ? s->client_version : 0) + +# define TLS1_AD_DECRYPTION_FAILED 21 +# define TLS1_AD_RECORD_OVERFLOW 22 +# define TLS1_AD_UNKNOWN_CA 48/* fatal */ +# define TLS1_AD_ACCESS_DENIED 49/* fatal */ +# define TLS1_AD_DECODE_ERROR 50/* fatal */ +# define TLS1_AD_DECRYPT_ERROR 51 +# define TLS1_AD_EXPORT_RESTRICTION 60/* fatal */ +# define TLS1_AD_PROTOCOL_VERSION 70/* fatal */ +# define TLS1_AD_INSUFFICIENT_SECURITY 71/* fatal */ +# define TLS1_AD_INTERNAL_ERROR 80/* fatal */ +# define TLS1_AD_INAPPROPRIATE_FALLBACK 86/* fatal */ +# define TLS1_AD_USER_CANCELLED 90 +# define TLS1_AD_NO_RENEGOTIATION 100 +/* codes 110-114 are from RFC3546 */ +# define TLS1_AD_UNSUPPORTED_EXTENSION 110 +# define TLS1_AD_CERTIFICATE_UNOBTAINABLE 111 +# define TLS1_AD_UNRECOGNIZED_NAME 112 +# define TLS1_AD_BAD_CERTIFICATE_STATUS_RESPONSE 113 +# define TLS1_AD_BAD_CERTIFICATE_HASH_VALUE 114 +# define TLS1_AD_UNKNOWN_PSK_IDENTITY 115/* fatal */ + +/* ExtensionType values from RFC3546 / RFC4366 / RFC6066 */ +# define TLSEXT_TYPE_server_name 0 +# define TLSEXT_TYPE_max_fragment_length 1 +# define TLSEXT_TYPE_client_certificate_url 2 +# define TLSEXT_TYPE_trusted_ca_keys 3 +# define TLSEXT_TYPE_truncated_hmac 4 +# define TLSEXT_TYPE_status_request 5 +/* ExtensionType values from RFC4681 */ +# define TLSEXT_TYPE_user_mapping 6 +/* ExtensionType values from RFC5878 */ +# define TLSEXT_TYPE_client_authz 7 +# define TLSEXT_TYPE_server_authz 8 +/* ExtensionType values from RFC6091 */ +# define TLSEXT_TYPE_cert_type 9 + +/* ExtensionType values from RFC4492 */ +# define TLSEXT_TYPE_elliptic_curves 10 +# define TLSEXT_TYPE_ec_point_formats 11 + +/* ExtensionType value from RFC5054 */ +# define TLSEXT_TYPE_srp 12 + +/* ExtensionType values from RFC5246 */ +# define TLSEXT_TYPE_signature_algorithms 13 + +/* ExtensionType value from RFC5764 */ +# define TLSEXT_TYPE_use_srtp 14 + +/* ExtensionType value from RFC5620 */ +# define TLSEXT_TYPE_heartbeat 15 + +/* ExtensionType value from RFC7301 */ +# define TLSEXT_TYPE_application_layer_protocol_negotiation 16 + +/* + * ExtensionType value for TLS padding extension. + * http://tools.ietf.org/html/draft-agl-tls-padding + */ +# define TLSEXT_TYPE_padding 21 + +/* ExtensionType value from RFC4507 */ +# define TLSEXT_TYPE_session_ticket 35 + +/* ExtensionType value from draft-rescorla-tls-opaque-prf-input-00.txt */ +# if 0 +/* + * will have to be provided externally for now , + * i.e. build with -DTLSEXT_TYPE_opaque_prf_input=38183 + * using whatever extension number you'd like to try + */ +# define TLSEXT_TYPE_opaque_prf_input ?? +# endif + +/* Temporary extension type */ +# define TLSEXT_TYPE_renegotiate 0xff01 + +# ifndef OPENSSL_NO_NEXTPROTONEG +/* This is not an IANA defined extension number */ +# define TLSEXT_TYPE_next_proto_neg 13172 +# endif + +/* NameType value from RFC3546 */ +# define TLSEXT_NAMETYPE_host_name 0 +/* status request value from RFC3546 */ +# define TLSEXT_STATUSTYPE_ocsp 1 + +/* ECPointFormat values from RFC4492 */ +# define TLSEXT_ECPOINTFORMAT_first 0 +# define TLSEXT_ECPOINTFORMAT_uncompressed 0 +# define TLSEXT_ECPOINTFORMAT_ansiX962_compressed_prime 1 +# define TLSEXT_ECPOINTFORMAT_ansiX962_compressed_char2 2 +# define TLSEXT_ECPOINTFORMAT_last 2 + +/* Signature and hash algorithms from RFC5246 */ +# define TLSEXT_signature_anonymous 0 +# define TLSEXT_signature_rsa 1 +# define TLSEXT_signature_dsa 2 +# define TLSEXT_signature_ecdsa 3 + +/* Total number of different signature algorithms */ +# define TLSEXT_signature_num 4 + +# define TLSEXT_hash_none 0 +# define TLSEXT_hash_md5 1 +# define TLSEXT_hash_sha1 2 +# define TLSEXT_hash_sha224 3 +# define TLSEXT_hash_sha256 4 +# define TLSEXT_hash_sha384 5 +# define TLSEXT_hash_sha512 6 + +/* Total number of different digest algorithms */ + +# define TLSEXT_hash_num 7 + +/* Flag set for unrecognised algorithms */ +# define TLSEXT_nid_unknown 0x1000000 + +/* ECC curves */ + +# define TLSEXT_curve_P_256 23 +# define TLSEXT_curve_P_384 24 + +# ifndef OPENSSL_NO_TLSEXT + +# define TLSEXT_MAXLEN_host_name 255 + +const char *SSL_get_servername(const SSL *s, const int type); +int SSL_get_servername_type(const SSL *s); +/* + * SSL_export_keying_material exports a value derived from the master secret, + * as specified in RFC 5705. It writes |olen| bytes to |out| given a label and + * optional context. (Since a zero length context is allowed, the |use_context| + * flag controls whether a context is included.) It returns 1 on success and + * zero otherwise. + */ +int SSL_export_keying_material(SSL *s, unsigned char *out, size_t olen, + const char *label, size_t llen, + const unsigned char *p, size_t plen, + int use_context); + +int SSL_get_sigalgs(SSL *s, int idx, + int *psign, int *phash, int *psignandhash, + unsigned char *rsig, unsigned char *rhash); + +int SSL_get_shared_sigalgs(SSL *s, int idx, + int *psign, int *phash, int *psignandhash, + unsigned char *rsig, unsigned char *rhash); + +int SSL_check_chain(SSL *s, X509 *x, EVP_PKEY *pk, STACK_OF(X509) *chain); + +# define SSL_set_tlsext_host_name(s,name) \ +SSL_ctrl(s,SSL_CTRL_SET_TLSEXT_HOSTNAME,TLSEXT_NAMETYPE_host_name,(char *)name) + +# define SSL_set_tlsext_debug_callback(ssl, cb) \ +SSL_callback_ctrl(ssl,SSL_CTRL_SET_TLSEXT_DEBUG_CB,(void (*)(void))cb) + +# define SSL_set_tlsext_debug_arg(ssl, arg) \ +SSL_ctrl(ssl,SSL_CTRL_SET_TLSEXT_DEBUG_ARG,0, (void *)arg) + +# define SSL_set_tlsext_status_type(ssl, type) \ +SSL_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_TYPE,type, NULL) + +# define SSL_get_tlsext_status_exts(ssl, arg) \ +SSL_ctrl(ssl,SSL_CTRL_GET_TLSEXT_STATUS_REQ_EXTS,0, (void *)arg) + +# define SSL_set_tlsext_status_exts(ssl, arg) \ +SSL_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_EXTS,0, (void *)arg) + +# define SSL_get_tlsext_status_ids(ssl, arg) \ +SSL_ctrl(ssl,SSL_CTRL_GET_TLSEXT_STATUS_REQ_IDS,0, (void *)arg) + +# define SSL_set_tlsext_status_ids(ssl, arg) \ +SSL_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_IDS,0, (void *)arg) + +# define SSL_get_tlsext_status_ocsp_resp(ssl, arg) \ +SSL_ctrl(ssl,SSL_CTRL_GET_TLSEXT_STATUS_REQ_OCSP_RESP,0, (void *)arg) + +# define SSL_set_tlsext_status_ocsp_resp(ssl, arg, arglen) \ +SSL_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_OCSP_RESP,arglen, (void *)arg) + +# define SSL_CTX_set_tlsext_servername_callback(ctx, cb) \ +SSL_CTX_callback_ctrl(ctx,SSL_CTRL_SET_TLSEXT_SERVERNAME_CB,(void (*)(void))cb) + +# define SSL_TLSEXT_ERR_OK 0 +# define SSL_TLSEXT_ERR_ALERT_WARNING 1 +# define SSL_TLSEXT_ERR_ALERT_FATAL 2 +# define SSL_TLSEXT_ERR_NOACK 3 + +# define SSL_CTX_set_tlsext_servername_arg(ctx, arg) \ +SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TLSEXT_SERVERNAME_ARG,0, (void *)arg) + +# define SSL_CTX_get_tlsext_ticket_keys(ctx, keys, keylen) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_GET_TLSEXT_TICKET_KEYS,(keylen),(keys)) +# define SSL_CTX_set_tlsext_ticket_keys(ctx, keys, keylen) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_SET_TLSEXT_TICKET_KEYS,(keylen),(keys)) + +# define SSL_CTX_set_tlsext_status_cb(ssl, cb) \ +SSL_CTX_callback_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB,(void (*)(void))cb) + +# define SSL_CTX_set_tlsext_status_arg(ssl, arg) \ +SSL_CTX_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB_ARG,0, (void *)arg) + +# define SSL_set_tlsext_opaque_prf_input(s, src, len) \ +SSL_ctrl(s,SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT, len, src) +# define SSL_CTX_set_tlsext_opaque_prf_input_callback(ctx, cb) \ +SSL_CTX_callback_ctrl(ctx,SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT_CB, (void (*)(void))cb) +# define SSL_CTX_set_tlsext_opaque_prf_input_callback_arg(ctx, arg) \ +SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT_CB_ARG, 0, arg) + +# define SSL_CTX_set_tlsext_ticket_key_cb(ssl, cb) \ +SSL_CTX_callback_ctrl(ssl,SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB,(void (*)(void))cb) + +# ifndef OPENSSL_NO_HEARTBEATS +# define SSL_TLSEXT_HB_ENABLED 0x01 +# define SSL_TLSEXT_HB_DONT_SEND_REQUESTS 0x02 +# define SSL_TLSEXT_HB_DONT_RECV_REQUESTS 0x04 + +# define SSL_get_tlsext_heartbeat_pending(ssl) \ + SSL_ctrl((ssl),SSL_CTRL_GET_TLS_EXT_HEARTBEAT_PENDING,0,NULL) +# define SSL_set_tlsext_heartbeat_no_requests(ssl, arg) \ + SSL_ctrl((ssl),SSL_CTRL_SET_TLS_EXT_HEARTBEAT_NO_REQUESTS,arg,NULL) +# endif +# endif + +/* PSK ciphersuites from 4279 */ +# define TLS1_CK_PSK_WITH_RC4_128_SHA 0x0300008A +# define TLS1_CK_PSK_WITH_3DES_EDE_CBC_SHA 0x0300008B +# define TLS1_CK_PSK_WITH_AES_128_CBC_SHA 0x0300008C +# define TLS1_CK_PSK_WITH_AES_256_CBC_SHA 0x0300008D + +/* + * Additional TLS ciphersuites from expired Internet Draft + * draft-ietf-tls-56-bit-ciphersuites-01.txt (available if + * TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES is defined, see s3_lib.c). We + * actually treat them like SSL 3.0 ciphers, which we probably shouldn't. + * Note that the first two are actually not in the IDs. + */ +# define TLS1_CK_RSA_EXPORT1024_WITH_RC4_56_MD5 0x03000060/* not in + * ID */ +# define TLS1_CK_RSA_EXPORT1024_WITH_RC2_CBC_56_MD5 0x03000061/* not in + * ID */ +# define TLS1_CK_RSA_EXPORT1024_WITH_DES_CBC_SHA 0x03000062 +# define TLS1_CK_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA 0x03000063 +# define TLS1_CK_RSA_EXPORT1024_WITH_RC4_56_SHA 0x03000064 +# define TLS1_CK_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA 0x03000065 +# define TLS1_CK_DHE_DSS_WITH_RC4_128_SHA 0x03000066 + +/* AES ciphersuites from RFC3268 */ +# define TLS1_CK_RSA_WITH_AES_128_SHA 0x0300002F +# define TLS1_CK_DH_DSS_WITH_AES_128_SHA 0x03000030 +# define TLS1_CK_DH_RSA_WITH_AES_128_SHA 0x03000031 +# define TLS1_CK_DHE_DSS_WITH_AES_128_SHA 0x03000032 +# define TLS1_CK_DHE_RSA_WITH_AES_128_SHA 0x03000033 +# define TLS1_CK_ADH_WITH_AES_128_SHA 0x03000034 + +# define TLS1_CK_RSA_WITH_AES_256_SHA 0x03000035 +# define TLS1_CK_DH_DSS_WITH_AES_256_SHA 0x03000036 +# define TLS1_CK_DH_RSA_WITH_AES_256_SHA 0x03000037 +# define TLS1_CK_DHE_DSS_WITH_AES_256_SHA 0x03000038 +# define TLS1_CK_DHE_RSA_WITH_AES_256_SHA 0x03000039 +# define TLS1_CK_ADH_WITH_AES_256_SHA 0x0300003A + +/* TLS v1.2 ciphersuites */ +# define TLS1_CK_RSA_WITH_NULL_SHA256 0x0300003B +# define TLS1_CK_RSA_WITH_AES_128_SHA256 0x0300003C +# define TLS1_CK_RSA_WITH_AES_256_SHA256 0x0300003D +# define TLS1_CK_DH_DSS_WITH_AES_128_SHA256 0x0300003E +# define TLS1_CK_DH_RSA_WITH_AES_128_SHA256 0x0300003F +# define TLS1_CK_DHE_DSS_WITH_AES_128_SHA256 0x03000040 + +/* Camellia ciphersuites from RFC4132 */ +# define TLS1_CK_RSA_WITH_CAMELLIA_128_CBC_SHA 0x03000041 +# define TLS1_CK_DH_DSS_WITH_CAMELLIA_128_CBC_SHA 0x03000042 +# define TLS1_CK_DH_RSA_WITH_CAMELLIA_128_CBC_SHA 0x03000043 +# define TLS1_CK_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA 0x03000044 +# define TLS1_CK_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA 0x03000045 +# define TLS1_CK_ADH_WITH_CAMELLIA_128_CBC_SHA 0x03000046 + +/* TLS v1.2 ciphersuites */ +# define TLS1_CK_DHE_RSA_WITH_AES_128_SHA256 0x03000067 +# define TLS1_CK_DH_DSS_WITH_AES_256_SHA256 0x03000068 +# define TLS1_CK_DH_RSA_WITH_AES_256_SHA256 0x03000069 +# define TLS1_CK_DHE_DSS_WITH_AES_256_SHA256 0x0300006A +# define TLS1_CK_DHE_RSA_WITH_AES_256_SHA256 0x0300006B +# define TLS1_CK_ADH_WITH_AES_128_SHA256 0x0300006C +# define TLS1_CK_ADH_WITH_AES_256_SHA256 0x0300006D + +/* Camellia ciphersuites from RFC4132 */ +# define TLS1_CK_RSA_WITH_CAMELLIA_256_CBC_SHA 0x03000084 +# define TLS1_CK_DH_DSS_WITH_CAMELLIA_256_CBC_SHA 0x03000085 +# define TLS1_CK_DH_RSA_WITH_CAMELLIA_256_CBC_SHA 0x03000086 +# define TLS1_CK_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA 0x03000087 +# define TLS1_CK_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA 0x03000088 +# define TLS1_CK_ADH_WITH_CAMELLIA_256_CBC_SHA 0x03000089 + +/* SEED ciphersuites from RFC4162 */ +# define TLS1_CK_RSA_WITH_SEED_SHA 0x03000096 +# define TLS1_CK_DH_DSS_WITH_SEED_SHA 0x03000097 +# define TLS1_CK_DH_RSA_WITH_SEED_SHA 0x03000098 +# define TLS1_CK_DHE_DSS_WITH_SEED_SHA 0x03000099 +# define TLS1_CK_DHE_RSA_WITH_SEED_SHA 0x0300009A +# define TLS1_CK_ADH_WITH_SEED_SHA 0x0300009B + +/* TLS v1.2 GCM ciphersuites from RFC5288 */ +# define TLS1_CK_RSA_WITH_AES_128_GCM_SHA256 0x0300009C +# define TLS1_CK_RSA_WITH_AES_256_GCM_SHA384 0x0300009D +# define TLS1_CK_DHE_RSA_WITH_AES_128_GCM_SHA256 0x0300009E +# define TLS1_CK_DHE_RSA_WITH_AES_256_GCM_SHA384 0x0300009F +# define TLS1_CK_DH_RSA_WITH_AES_128_GCM_SHA256 0x030000A0 +# define TLS1_CK_DH_RSA_WITH_AES_256_GCM_SHA384 0x030000A1 +# define TLS1_CK_DHE_DSS_WITH_AES_128_GCM_SHA256 0x030000A2 +# define TLS1_CK_DHE_DSS_WITH_AES_256_GCM_SHA384 0x030000A3 +# define TLS1_CK_DH_DSS_WITH_AES_128_GCM_SHA256 0x030000A4 +# define TLS1_CK_DH_DSS_WITH_AES_256_GCM_SHA384 0x030000A5 +# define TLS1_CK_ADH_WITH_AES_128_GCM_SHA256 0x030000A6 +# define TLS1_CK_ADH_WITH_AES_256_GCM_SHA384 0x030000A7 + +/* + * ECC ciphersuites from draft-ietf-tls-ecc-12.txt with changes soon to be in + * draft 13 + */ +# define TLS1_CK_ECDH_ECDSA_WITH_NULL_SHA 0x0300C001 +# define TLS1_CK_ECDH_ECDSA_WITH_RC4_128_SHA 0x0300C002 +# define TLS1_CK_ECDH_ECDSA_WITH_DES_192_CBC3_SHA 0x0300C003 +# define TLS1_CK_ECDH_ECDSA_WITH_AES_128_CBC_SHA 0x0300C004 +# define TLS1_CK_ECDH_ECDSA_WITH_AES_256_CBC_SHA 0x0300C005 + +# define TLS1_CK_ECDHE_ECDSA_WITH_NULL_SHA 0x0300C006 +# define TLS1_CK_ECDHE_ECDSA_WITH_RC4_128_SHA 0x0300C007 +# define TLS1_CK_ECDHE_ECDSA_WITH_DES_192_CBC3_SHA 0x0300C008 +# define TLS1_CK_ECDHE_ECDSA_WITH_AES_128_CBC_SHA 0x0300C009 +# define TLS1_CK_ECDHE_ECDSA_WITH_AES_256_CBC_SHA 0x0300C00A + +# define TLS1_CK_ECDH_RSA_WITH_NULL_SHA 0x0300C00B +# define TLS1_CK_ECDH_RSA_WITH_RC4_128_SHA 0x0300C00C +# define TLS1_CK_ECDH_RSA_WITH_DES_192_CBC3_SHA 0x0300C00D +# define TLS1_CK_ECDH_RSA_WITH_AES_128_CBC_SHA 0x0300C00E +# define TLS1_CK_ECDH_RSA_WITH_AES_256_CBC_SHA 0x0300C00F + +# define TLS1_CK_ECDHE_RSA_WITH_NULL_SHA 0x0300C010 +# define TLS1_CK_ECDHE_RSA_WITH_RC4_128_SHA 0x0300C011 +# define TLS1_CK_ECDHE_RSA_WITH_DES_192_CBC3_SHA 0x0300C012 +# define TLS1_CK_ECDHE_RSA_WITH_AES_128_CBC_SHA 0x0300C013 +# define TLS1_CK_ECDHE_RSA_WITH_AES_256_CBC_SHA 0x0300C014 + +# define TLS1_CK_ECDH_anon_WITH_NULL_SHA 0x0300C015 +# define TLS1_CK_ECDH_anon_WITH_RC4_128_SHA 0x0300C016 +# define TLS1_CK_ECDH_anon_WITH_DES_192_CBC3_SHA 0x0300C017 +# define TLS1_CK_ECDH_anon_WITH_AES_128_CBC_SHA 0x0300C018 +# define TLS1_CK_ECDH_anon_WITH_AES_256_CBC_SHA 0x0300C019 + +/* SRP ciphersuites from RFC 5054 */ +# define TLS1_CK_SRP_SHA_WITH_3DES_EDE_CBC_SHA 0x0300C01A +# define TLS1_CK_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA 0x0300C01B +# define TLS1_CK_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA 0x0300C01C +# define TLS1_CK_SRP_SHA_WITH_AES_128_CBC_SHA 0x0300C01D +# define TLS1_CK_SRP_SHA_RSA_WITH_AES_128_CBC_SHA 0x0300C01E +# define TLS1_CK_SRP_SHA_DSS_WITH_AES_128_CBC_SHA 0x0300C01F +# define TLS1_CK_SRP_SHA_WITH_AES_256_CBC_SHA 0x0300C020 +# define TLS1_CK_SRP_SHA_RSA_WITH_AES_256_CBC_SHA 0x0300C021 +# define TLS1_CK_SRP_SHA_DSS_WITH_AES_256_CBC_SHA 0x0300C022 + +/* ECDH HMAC based ciphersuites from RFC5289 */ + +# define TLS1_CK_ECDHE_ECDSA_WITH_AES_128_SHA256 0x0300C023 +# define TLS1_CK_ECDHE_ECDSA_WITH_AES_256_SHA384 0x0300C024 +# define TLS1_CK_ECDH_ECDSA_WITH_AES_128_SHA256 0x0300C025 +# define TLS1_CK_ECDH_ECDSA_WITH_AES_256_SHA384 0x0300C026 +# define TLS1_CK_ECDHE_RSA_WITH_AES_128_SHA256 0x0300C027 +# define TLS1_CK_ECDHE_RSA_WITH_AES_256_SHA384 0x0300C028 +# define TLS1_CK_ECDH_RSA_WITH_AES_128_SHA256 0x0300C029 +# define TLS1_CK_ECDH_RSA_WITH_AES_256_SHA384 0x0300C02A + +/* ECDH GCM based ciphersuites from RFC5289 */ +# define TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 0x0300C02B +# define TLS1_CK_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 0x0300C02C +# define TLS1_CK_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 0x0300C02D +# define TLS1_CK_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 0x0300C02E +# define TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256 0x0300C02F +# define TLS1_CK_ECDHE_RSA_WITH_AES_256_GCM_SHA384 0x0300C030 +# define TLS1_CK_ECDH_RSA_WITH_AES_128_GCM_SHA256 0x0300C031 +# define TLS1_CK_ECDH_RSA_WITH_AES_256_GCM_SHA384 0x0300C032 + +/* + * XXX * Backward compatibility alert: + * Older versions of OpenSSL gave + * some DHE ciphers names with "EDH" + * instead of "DHE". Going forward, we + * should be using DHE + * everywhere, though we may indefinitely maintain + * aliases for users + * or configurations that used "EDH" + + */ +# define TLS1_TXT_RSA_EXPORT1024_WITH_RC4_56_MD5 "EXP1024-RC4-MD5" +# define TLS1_TXT_RSA_EXPORT1024_WITH_RC2_CBC_56_MD5 "EXP1024-RC2-CBC-MD5" +# define TLS1_TXT_RSA_EXPORT1024_WITH_DES_CBC_SHA "EXP1024-DES-CBC-SHA" +# define TLS1_TXT_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA "EXP1024-DHE-DSS-DES-CBC-SHA" +# define TLS1_TXT_RSA_EXPORT1024_WITH_RC4_56_SHA "EXP1024-RC4-SHA" +# define TLS1_TXT_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA "EXP1024-DHE-DSS-RC4-SHA" +# define TLS1_TXT_DHE_DSS_WITH_RC4_128_SHA "DHE-DSS-RC4-SHA" + +/* AES ciphersuites from RFC3268 */ +# define TLS1_TXT_RSA_WITH_AES_128_SHA "AES128-SHA" +# define TLS1_TXT_DH_DSS_WITH_AES_128_SHA "DH-DSS-AES128-SHA" +# define TLS1_TXT_DH_RSA_WITH_AES_128_SHA "DH-RSA-AES128-SHA" +# define TLS1_TXT_DHE_DSS_WITH_AES_128_SHA "DHE-DSS-AES128-SHA" +# define TLS1_TXT_DHE_RSA_WITH_AES_128_SHA "DHE-RSA-AES128-SHA" +# define TLS1_TXT_ADH_WITH_AES_128_SHA "ADH-AES128-SHA" + +# define TLS1_TXT_RSA_WITH_AES_256_SHA "AES256-SHA" +# define TLS1_TXT_DH_DSS_WITH_AES_256_SHA "DH-DSS-AES256-SHA" +# define TLS1_TXT_DH_RSA_WITH_AES_256_SHA "DH-RSA-AES256-SHA" +# define TLS1_TXT_DHE_DSS_WITH_AES_256_SHA "DHE-DSS-AES256-SHA" +# define TLS1_TXT_DHE_RSA_WITH_AES_256_SHA "DHE-RSA-AES256-SHA" +# define TLS1_TXT_ADH_WITH_AES_256_SHA "ADH-AES256-SHA" + +/* ECC ciphersuites from RFC4492 */ +# define TLS1_TXT_ECDH_ECDSA_WITH_NULL_SHA "ECDH-ECDSA-NULL-SHA" +# define TLS1_TXT_ECDH_ECDSA_WITH_RC4_128_SHA "ECDH-ECDSA-RC4-SHA" +# define TLS1_TXT_ECDH_ECDSA_WITH_DES_192_CBC3_SHA "ECDH-ECDSA-DES-CBC3-SHA" +# define TLS1_TXT_ECDH_ECDSA_WITH_AES_128_CBC_SHA "ECDH-ECDSA-AES128-SHA" +# define TLS1_TXT_ECDH_ECDSA_WITH_AES_256_CBC_SHA "ECDH-ECDSA-AES256-SHA" + +# define TLS1_TXT_ECDHE_ECDSA_WITH_NULL_SHA "ECDHE-ECDSA-NULL-SHA" +# define TLS1_TXT_ECDHE_ECDSA_WITH_RC4_128_SHA "ECDHE-ECDSA-RC4-SHA" +# define TLS1_TXT_ECDHE_ECDSA_WITH_DES_192_CBC3_SHA "ECDHE-ECDSA-DES-CBC3-SHA" +# define TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_CBC_SHA "ECDHE-ECDSA-AES128-SHA" +# define TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_CBC_SHA "ECDHE-ECDSA-AES256-SHA" + +# define TLS1_TXT_ECDH_RSA_WITH_NULL_SHA "ECDH-RSA-NULL-SHA" +# define TLS1_TXT_ECDH_RSA_WITH_RC4_128_SHA "ECDH-RSA-RC4-SHA" +# define TLS1_TXT_ECDH_RSA_WITH_DES_192_CBC3_SHA "ECDH-RSA-DES-CBC3-SHA" +# define TLS1_TXT_ECDH_RSA_WITH_AES_128_CBC_SHA "ECDH-RSA-AES128-SHA" +# define TLS1_TXT_ECDH_RSA_WITH_AES_256_CBC_SHA "ECDH-RSA-AES256-SHA" + +# define TLS1_TXT_ECDHE_RSA_WITH_NULL_SHA "ECDHE-RSA-NULL-SHA" +# define TLS1_TXT_ECDHE_RSA_WITH_RC4_128_SHA "ECDHE-RSA-RC4-SHA" +# define TLS1_TXT_ECDHE_RSA_WITH_DES_192_CBC3_SHA "ECDHE-RSA-DES-CBC3-SHA" +# define TLS1_TXT_ECDHE_RSA_WITH_AES_128_CBC_SHA "ECDHE-RSA-AES128-SHA" +# define TLS1_TXT_ECDHE_RSA_WITH_AES_256_CBC_SHA "ECDHE-RSA-AES256-SHA" + +# define TLS1_TXT_ECDH_anon_WITH_NULL_SHA "AECDH-NULL-SHA" +# define TLS1_TXT_ECDH_anon_WITH_RC4_128_SHA "AECDH-RC4-SHA" +# define TLS1_TXT_ECDH_anon_WITH_DES_192_CBC3_SHA "AECDH-DES-CBC3-SHA" +# define TLS1_TXT_ECDH_anon_WITH_AES_128_CBC_SHA "AECDH-AES128-SHA" +# define TLS1_TXT_ECDH_anon_WITH_AES_256_CBC_SHA "AECDH-AES256-SHA" + +/* PSK ciphersuites from RFC 4279 */ +# define TLS1_TXT_PSK_WITH_RC4_128_SHA "PSK-RC4-SHA" +# define TLS1_TXT_PSK_WITH_3DES_EDE_CBC_SHA "PSK-3DES-EDE-CBC-SHA" +# define TLS1_TXT_PSK_WITH_AES_128_CBC_SHA "PSK-AES128-CBC-SHA" +# define TLS1_TXT_PSK_WITH_AES_256_CBC_SHA "PSK-AES256-CBC-SHA" + +/* SRP ciphersuite from RFC 5054 */ +# define TLS1_TXT_SRP_SHA_WITH_3DES_EDE_CBC_SHA "SRP-3DES-EDE-CBC-SHA" +# define TLS1_TXT_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA "SRP-RSA-3DES-EDE-CBC-SHA" +# define TLS1_TXT_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA "SRP-DSS-3DES-EDE-CBC-SHA" +# define TLS1_TXT_SRP_SHA_WITH_AES_128_CBC_SHA "SRP-AES-128-CBC-SHA" +# define TLS1_TXT_SRP_SHA_RSA_WITH_AES_128_CBC_SHA "SRP-RSA-AES-128-CBC-SHA" +# define TLS1_TXT_SRP_SHA_DSS_WITH_AES_128_CBC_SHA "SRP-DSS-AES-128-CBC-SHA" +# define TLS1_TXT_SRP_SHA_WITH_AES_256_CBC_SHA "SRP-AES-256-CBC-SHA" +# define TLS1_TXT_SRP_SHA_RSA_WITH_AES_256_CBC_SHA "SRP-RSA-AES-256-CBC-SHA" +# define TLS1_TXT_SRP_SHA_DSS_WITH_AES_256_CBC_SHA "SRP-DSS-AES-256-CBC-SHA" + +/* Camellia ciphersuites from RFC4132 */ +# define TLS1_TXT_RSA_WITH_CAMELLIA_128_CBC_SHA "CAMELLIA128-SHA" +# define TLS1_TXT_DH_DSS_WITH_CAMELLIA_128_CBC_SHA "DH-DSS-CAMELLIA128-SHA" +# define TLS1_TXT_DH_RSA_WITH_CAMELLIA_128_CBC_SHA "DH-RSA-CAMELLIA128-SHA" +# define TLS1_TXT_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA "DHE-DSS-CAMELLIA128-SHA" +# define TLS1_TXT_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA "DHE-RSA-CAMELLIA128-SHA" +# define TLS1_TXT_ADH_WITH_CAMELLIA_128_CBC_SHA "ADH-CAMELLIA128-SHA" + +# define TLS1_TXT_RSA_WITH_CAMELLIA_256_CBC_SHA "CAMELLIA256-SHA" +# define TLS1_TXT_DH_DSS_WITH_CAMELLIA_256_CBC_SHA "DH-DSS-CAMELLIA256-SHA" +# define TLS1_TXT_DH_RSA_WITH_CAMELLIA_256_CBC_SHA "DH-RSA-CAMELLIA256-SHA" +# define TLS1_TXT_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA "DHE-DSS-CAMELLIA256-SHA" +# define TLS1_TXT_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA "DHE-RSA-CAMELLIA256-SHA" +# define TLS1_TXT_ADH_WITH_CAMELLIA_256_CBC_SHA "ADH-CAMELLIA256-SHA" + +/* SEED ciphersuites from RFC4162 */ +# define TLS1_TXT_RSA_WITH_SEED_SHA "SEED-SHA" +# define TLS1_TXT_DH_DSS_WITH_SEED_SHA "DH-DSS-SEED-SHA" +# define TLS1_TXT_DH_RSA_WITH_SEED_SHA "DH-RSA-SEED-SHA" +# define TLS1_TXT_DHE_DSS_WITH_SEED_SHA "DHE-DSS-SEED-SHA" +# define TLS1_TXT_DHE_RSA_WITH_SEED_SHA "DHE-RSA-SEED-SHA" +# define TLS1_TXT_ADH_WITH_SEED_SHA "ADH-SEED-SHA" + +/* TLS v1.2 ciphersuites */ +# define TLS1_TXT_RSA_WITH_NULL_SHA256 "NULL-SHA256" +# define TLS1_TXT_RSA_WITH_AES_128_SHA256 "AES128-SHA256" +# define TLS1_TXT_RSA_WITH_AES_256_SHA256 "AES256-SHA256" +# define TLS1_TXT_DH_DSS_WITH_AES_128_SHA256 "DH-DSS-AES128-SHA256" +# define TLS1_TXT_DH_RSA_WITH_AES_128_SHA256 "DH-RSA-AES128-SHA256" +# define TLS1_TXT_DHE_DSS_WITH_AES_128_SHA256 "DHE-DSS-AES128-SHA256" +# define TLS1_TXT_DHE_RSA_WITH_AES_128_SHA256 "DHE-RSA-AES128-SHA256" +# define TLS1_TXT_DH_DSS_WITH_AES_256_SHA256 "DH-DSS-AES256-SHA256" +# define TLS1_TXT_DH_RSA_WITH_AES_256_SHA256 "DH-RSA-AES256-SHA256" +# define TLS1_TXT_DHE_DSS_WITH_AES_256_SHA256 "DHE-DSS-AES256-SHA256" +# define TLS1_TXT_DHE_RSA_WITH_AES_256_SHA256 "DHE-RSA-AES256-SHA256" +# define TLS1_TXT_ADH_WITH_AES_128_SHA256 "ADH-AES128-SHA256" +# define TLS1_TXT_ADH_WITH_AES_256_SHA256 "ADH-AES256-SHA256" + +/* TLS v1.2 GCM ciphersuites from RFC5288 */ +# define TLS1_TXT_RSA_WITH_AES_128_GCM_SHA256 "AES128-GCM-SHA256" +# define TLS1_TXT_RSA_WITH_AES_256_GCM_SHA384 "AES256-GCM-SHA384" +# define TLS1_TXT_DHE_RSA_WITH_AES_128_GCM_SHA256 "DHE-RSA-AES128-GCM-SHA256" +# define TLS1_TXT_DHE_RSA_WITH_AES_256_GCM_SHA384 "DHE-RSA-AES256-GCM-SHA384" +# define TLS1_TXT_DH_RSA_WITH_AES_128_GCM_SHA256 "DH-RSA-AES128-GCM-SHA256" +# define TLS1_TXT_DH_RSA_WITH_AES_256_GCM_SHA384 "DH-RSA-AES256-GCM-SHA384" +# define TLS1_TXT_DHE_DSS_WITH_AES_128_GCM_SHA256 "DHE-DSS-AES128-GCM-SHA256" +# define TLS1_TXT_DHE_DSS_WITH_AES_256_GCM_SHA384 "DHE-DSS-AES256-GCM-SHA384" +# define TLS1_TXT_DH_DSS_WITH_AES_128_GCM_SHA256 "DH-DSS-AES128-GCM-SHA256" +# define TLS1_TXT_DH_DSS_WITH_AES_256_GCM_SHA384 "DH-DSS-AES256-GCM-SHA384" +# define TLS1_TXT_ADH_WITH_AES_128_GCM_SHA256 "ADH-AES128-GCM-SHA256" +# define TLS1_TXT_ADH_WITH_AES_256_GCM_SHA384 "ADH-AES256-GCM-SHA384" + +/* ECDH HMAC based ciphersuites from RFC5289 */ + +# define TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_SHA256 "ECDHE-ECDSA-AES128-SHA256" +# define TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_SHA384 "ECDHE-ECDSA-AES256-SHA384" +# define TLS1_TXT_ECDH_ECDSA_WITH_AES_128_SHA256 "ECDH-ECDSA-AES128-SHA256" +# define TLS1_TXT_ECDH_ECDSA_WITH_AES_256_SHA384 "ECDH-ECDSA-AES256-SHA384" +# define TLS1_TXT_ECDHE_RSA_WITH_AES_128_SHA256 "ECDHE-RSA-AES128-SHA256" +# define TLS1_TXT_ECDHE_RSA_WITH_AES_256_SHA384 "ECDHE-RSA-AES256-SHA384" +# define TLS1_TXT_ECDH_RSA_WITH_AES_128_SHA256 "ECDH-RSA-AES128-SHA256" +# define TLS1_TXT_ECDH_RSA_WITH_AES_256_SHA384 "ECDH-RSA-AES256-SHA384" + +/* ECDH GCM based ciphersuites from RFC5289 */ +# define TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 "ECDHE-ECDSA-AES128-GCM-SHA256" +# define TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 "ECDHE-ECDSA-AES256-GCM-SHA384" +# define TLS1_TXT_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 "ECDH-ECDSA-AES128-GCM-SHA256" +# define TLS1_TXT_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 "ECDH-ECDSA-AES256-GCM-SHA384" +# define TLS1_TXT_ECDHE_RSA_WITH_AES_128_GCM_SHA256 "ECDHE-RSA-AES128-GCM-SHA256" +# define TLS1_TXT_ECDHE_RSA_WITH_AES_256_GCM_SHA384 "ECDHE-RSA-AES256-GCM-SHA384" +# define TLS1_TXT_ECDH_RSA_WITH_AES_128_GCM_SHA256 "ECDH-RSA-AES128-GCM-SHA256" +# define TLS1_TXT_ECDH_RSA_WITH_AES_256_GCM_SHA384 "ECDH-RSA-AES256-GCM-SHA384" + +# define TLS_CT_RSA_SIGN 1 +# define TLS_CT_DSS_SIGN 2 +# define TLS_CT_RSA_FIXED_DH 3 +# define TLS_CT_DSS_FIXED_DH 4 +# define TLS_CT_ECDSA_SIGN 64 +# define TLS_CT_RSA_FIXED_ECDH 65 +# define TLS_CT_ECDSA_FIXED_ECDH 66 +# define TLS_CT_GOST94_SIGN 21 +# define TLS_CT_GOST01_SIGN 22 +/* + * when correcting this number, correct also SSL3_CT_NUMBER in ssl3.h (see + * comment there) + */ +# define TLS_CT_NUMBER 9 + +# define TLS1_FINISH_MAC_LENGTH 12 + +# define TLS_MD_MAX_CONST_SIZE 20 +# define TLS_MD_CLIENT_FINISH_CONST "client finished" +# define TLS_MD_CLIENT_FINISH_CONST_SIZE 15 +# define TLS_MD_SERVER_FINISH_CONST "server finished" +# define TLS_MD_SERVER_FINISH_CONST_SIZE 15 +# define TLS_MD_SERVER_WRITE_KEY_CONST "server write key" +# define TLS_MD_SERVER_WRITE_KEY_CONST_SIZE 16 +# define TLS_MD_KEY_EXPANSION_CONST "key expansion" +# define TLS_MD_KEY_EXPANSION_CONST_SIZE 13 +# define TLS_MD_CLIENT_WRITE_KEY_CONST "client write key" +# define TLS_MD_CLIENT_WRITE_KEY_CONST_SIZE 16 +# define TLS_MD_SERVER_WRITE_KEY_CONST "server write key" +# define TLS_MD_SERVER_WRITE_KEY_CONST_SIZE 16 +# define TLS_MD_IV_BLOCK_CONST "IV block" +# define TLS_MD_IV_BLOCK_CONST_SIZE 8 +# define TLS_MD_MASTER_SECRET_CONST "master secret" +# define TLS_MD_MASTER_SECRET_CONST_SIZE 13 + +# ifdef CHARSET_EBCDIC +# undef TLS_MD_CLIENT_FINISH_CONST +/* + * client finished + */ +# define TLS_MD_CLIENT_FINISH_CONST "\x63\x6c\x69\x65\x6e\x74\x20\x66\x69\x6e\x69\x73\x68\x65\x64" + +# undef TLS_MD_SERVER_FINISH_CONST +/* + * server finished + */ +# define TLS_MD_SERVER_FINISH_CONST "\x73\x65\x72\x76\x65\x72\x20\x66\x69\x6e\x69\x73\x68\x65\x64" + +# undef TLS_MD_SERVER_WRITE_KEY_CONST +/* + * server write key + */ +# define TLS_MD_SERVER_WRITE_KEY_CONST "\x73\x65\x72\x76\x65\x72\x20\x77\x72\x69\x74\x65\x20\x6b\x65\x79" + +# undef TLS_MD_KEY_EXPANSION_CONST +/* + * key expansion + */ +# define TLS_MD_KEY_EXPANSION_CONST "\x6b\x65\x79\x20\x65\x78\x70\x61\x6e\x73\x69\x6f\x6e" + +# undef TLS_MD_CLIENT_WRITE_KEY_CONST +/* + * client write key + */ +# define TLS_MD_CLIENT_WRITE_KEY_CONST "\x63\x6c\x69\x65\x6e\x74\x20\x77\x72\x69\x74\x65\x20\x6b\x65\x79" + +# undef TLS_MD_SERVER_WRITE_KEY_CONST +/* + * server write key + */ +# define TLS_MD_SERVER_WRITE_KEY_CONST "\x73\x65\x72\x76\x65\x72\x20\x77\x72\x69\x74\x65\x20\x6b\x65\x79" + +# undef TLS_MD_IV_BLOCK_CONST +/* + * IV block + */ +# define TLS_MD_IV_BLOCK_CONST "\x49\x56\x20\x62\x6c\x6f\x63\x6b" + +# undef TLS_MD_MASTER_SECRET_CONST +/* + * master secret + */ +# define TLS_MD_MASTER_SECRET_CONST "\x6d\x61\x73\x74\x65\x72\x20\x73\x65\x63\x72\x65\x74" +# endif + +/* TLS Session Ticket extension struct */ +struct tls_session_ticket_ext_st { + unsigned short length; + void *data; +}; + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/ts.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/ts.h new file mode 100644 index 0000000..2daa1b2 --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/ts.h @@ -0,0 +1,865 @@ +/* crypto/ts/ts.h */ +/* + * Written by Zoltan Glozik (zglozik@opentsa.org) for the OpenSSL project + * 2002, 2003, 2004. + */ +/* ==================================================================== + * Copyright (c) 2006 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_TS_H +# define HEADER_TS_H + +# include +# include +# ifndef OPENSSL_NO_BUFFER +# include +# endif +# ifndef OPENSSL_NO_EVP +# include +# endif +# ifndef OPENSSL_NO_BIO +# include +# endif +# include +# include +# include + +# ifndef OPENSSL_NO_RSA +# include +# endif + +# ifndef OPENSSL_NO_DSA +# include +# endif + +# ifndef OPENSSL_NO_DH +# include +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +# ifdef WIN32 +/* Under Win32 this is defined in wincrypt.h */ +# undef X509_NAME +# endif + +# include +# include + +/*- +MessageImprint ::= SEQUENCE { + hashAlgorithm AlgorithmIdentifier, + hashedMessage OCTET STRING } +*/ + +typedef struct TS_msg_imprint_st { + X509_ALGOR *hash_algo; + ASN1_OCTET_STRING *hashed_msg; +} TS_MSG_IMPRINT; + +/*- +TimeStampReq ::= SEQUENCE { + version INTEGER { v1(1) }, + messageImprint MessageImprint, + --a hash algorithm OID and the hash value of the data to be + --time-stamped + reqPolicy TSAPolicyId OPTIONAL, + nonce INTEGER OPTIONAL, + certReq BOOLEAN DEFAULT FALSE, + extensions [0] IMPLICIT Extensions OPTIONAL } +*/ + +typedef struct TS_req_st { + ASN1_INTEGER *version; + TS_MSG_IMPRINT *msg_imprint; + ASN1_OBJECT *policy_id; /* OPTIONAL */ + ASN1_INTEGER *nonce; /* OPTIONAL */ + ASN1_BOOLEAN cert_req; /* DEFAULT FALSE */ + STACK_OF(X509_EXTENSION) *extensions; /* [0] OPTIONAL */ +} TS_REQ; + +/*- +Accuracy ::= SEQUENCE { + seconds INTEGER OPTIONAL, + millis [0] INTEGER (1..999) OPTIONAL, + micros [1] INTEGER (1..999) OPTIONAL } +*/ + +typedef struct TS_accuracy_st { + ASN1_INTEGER *seconds; + ASN1_INTEGER *millis; + ASN1_INTEGER *micros; +} TS_ACCURACY; + +/*- +TSTInfo ::= SEQUENCE { + version INTEGER { v1(1) }, + policy TSAPolicyId, + messageImprint MessageImprint, + -- MUST have the same value as the similar field in + -- TimeStampReq + serialNumber INTEGER, + -- Time-Stamping users MUST be ready to accommodate integers + -- up to 160 bits. + genTime GeneralizedTime, + accuracy Accuracy OPTIONAL, + ordering BOOLEAN DEFAULT FALSE, + nonce INTEGER OPTIONAL, + -- MUST be present if the similar field was present + -- in TimeStampReq. In that case it MUST have the same value. + tsa [0] GeneralName OPTIONAL, + extensions [1] IMPLICIT Extensions OPTIONAL } +*/ + +typedef struct TS_tst_info_st { + ASN1_INTEGER *version; + ASN1_OBJECT *policy_id; + TS_MSG_IMPRINT *msg_imprint; + ASN1_INTEGER *serial; + ASN1_GENERALIZEDTIME *time; + TS_ACCURACY *accuracy; + ASN1_BOOLEAN ordering; + ASN1_INTEGER *nonce; + GENERAL_NAME *tsa; + STACK_OF(X509_EXTENSION) *extensions; +} TS_TST_INFO; + +/*- +PKIStatusInfo ::= SEQUENCE { + status PKIStatus, + statusString PKIFreeText OPTIONAL, + failInfo PKIFailureInfo OPTIONAL } + +From RFC 1510 - section 3.1.1: +PKIFreeText ::= SEQUENCE SIZE (1..MAX) OF UTF8String + -- text encoded as UTF-8 String (note: each UTF8String SHOULD + -- include an RFC 1766 language tag to indicate the language + -- of the contained text) +*/ + +/* Possible values for status. See ts_resp_print.c && ts_resp_verify.c. */ + +# define TS_STATUS_GRANTED 0 +# define TS_STATUS_GRANTED_WITH_MODS 1 +# define TS_STATUS_REJECTION 2 +# define TS_STATUS_WAITING 3 +# define TS_STATUS_REVOCATION_WARNING 4 +# define TS_STATUS_REVOCATION_NOTIFICATION 5 + +/* + * Possible values for failure_info. See ts_resp_print.c && ts_resp_verify.c + */ + +# define TS_INFO_BAD_ALG 0 +# define TS_INFO_BAD_REQUEST 2 +# define TS_INFO_BAD_DATA_FORMAT 5 +# define TS_INFO_TIME_NOT_AVAILABLE 14 +# define TS_INFO_UNACCEPTED_POLICY 15 +# define TS_INFO_UNACCEPTED_EXTENSION 16 +# define TS_INFO_ADD_INFO_NOT_AVAILABLE 17 +# define TS_INFO_SYSTEM_FAILURE 25 + +typedef struct TS_status_info_st { + ASN1_INTEGER *status; + STACK_OF(ASN1_UTF8STRING) *text; + ASN1_BIT_STRING *failure_info; +} TS_STATUS_INFO; + +DECLARE_STACK_OF(ASN1_UTF8STRING) +DECLARE_ASN1_SET_OF(ASN1_UTF8STRING) + +/*- +TimeStampResp ::= SEQUENCE { + status PKIStatusInfo, + timeStampToken TimeStampToken OPTIONAL } +*/ + +typedef struct TS_resp_st { + TS_STATUS_INFO *status_info; + PKCS7 *token; + TS_TST_INFO *tst_info; +} TS_RESP; + +/* The structure below would belong to the ESS component. */ + +/*- +IssuerSerial ::= SEQUENCE { + issuer GeneralNames, + serialNumber CertificateSerialNumber + } +*/ + +typedef struct ESS_issuer_serial { + STACK_OF(GENERAL_NAME) *issuer; + ASN1_INTEGER *serial; +} ESS_ISSUER_SERIAL; + +/*- +ESSCertID ::= SEQUENCE { + certHash Hash, + issuerSerial IssuerSerial OPTIONAL +} +*/ + +typedef struct ESS_cert_id { + ASN1_OCTET_STRING *hash; /* Always SHA-1 digest. */ + ESS_ISSUER_SERIAL *issuer_serial; +} ESS_CERT_ID; + +DECLARE_STACK_OF(ESS_CERT_ID) +DECLARE_ASN1_SET_OF(ESS_CERT_ID) + +/*- +SigningCertificate ::= SEQUENCE { + certs SEQUENCE OF ESSCertID, + policies SEQUENCE OF PolicyInformation OPTIONAL +} +*/ + +typedef struct ESS_signing_cert { + STACK_OF(ESS_CERT_ID) *cert_ids; + STACK_OF(POLICYINFO) *policy_info; +} ESS_SIGNING_CERT; + +TS_REQ *TS_REQ_new(void); +void TS_REQ_free(TS_REQ *a); +int i2d_TS_REQ(const TS_REQ *a, unsigned char **pp); +TS_REQ *d2i_TS_REQ(TS_REQ **a, const unsigned char **pp, long length); + +TS_REQ *TS_REQ_dup(TS_REQ *a); + +TS_REQ *d2i_TS_REQ_fp(FILE *fp, TS_REQ **a); +int i2d_TS_REQ_fp(FILE *fp, TS_REQ *a); +TS_REQ *d2i_TS_REQ_bio(BIO *fp, TS_REQ **a); +int i2d_TS_REQ_bio(BIO *fp, TS_REQ *a); + +TS_MSG_IMPRINT *TS_MSG_IMPRINT_new(void); +void TS_MSG_IMPRINT_free(TS_MSG_IMPRINT *a); +int i2d_TS_MSG_IMPRINT(const TS_MSG_IMPRINT *a, unsigned char **pp); +TS_MSG_IMPRINT *d2i_TS_MSG_IMPRINT(TS_MSG_IMPRINT **a, + const unsigned char **pp, long length); + +TS_MSG_IMPRINT *TS_MSG_IMPRINT_dup(TS_MSG_IMPRINT *a); + +TS_MSG_IMPRINT *d2i_TS_MSG_IMPRINT_fp(FILE *fp, TS_MSG_IMPRINT **a); +int i2d_TS_MSG_IMPRINT_fp(FILE *fp, TS_MSG_IMPRINT *a); +TS_MSG_IMPRINT *d2i_TS_MSG_IMPRINT_bio(BIO *fp, TS_MSG_IMPRINT **a); +int i2d_TS_MSG_IMPRINT_bio(BIO *fp, TS_MSG_IMPRINT *a); + +TS_RESP *TS_RESP_new(void); +void TS_RESP_free(TS_RESP *a); +int i2d_TS_RESP(const TS_RESP *a, unsigned char **pp); +TS_RESP *d2i_TS_RESP(TS_RESP **a, const unsigned char **pp, long length); +TS_TST_INFO *PKCS7_to_TS_TST_INFO(PKCS7 *token); +TS_RESP *TS_RESP_dup(TS_RESP *a); + +TS_RESP *d2i_TS_RESP_fp(FILE *fp, TS_RESP **a); +int i2d_TS_RESP_fp(FILE *fp, TS_RESP *a); +TS_RESP *d2i_TS_RESP_bio(BIO *fp, TS_RESP **a); +int i2d_TS_RESP_bio(BIO *fp, TS_RESP *a); + +TS_STATUS_INFO *TS_STATUS_INFO_new(void); +void TS_STATUS_INFO_free(TS_STATUS_INFO *a); +int i2d_TS_STATUS_INFO(const TS_STATUS_INFO *a, unsigned char **pp); +TS_STATUS_INFO *d2i_TS_STATUS_INFO(TS_STATUS_INFO **a, + const unsigned char **pp, long length); +TS_STATUS_INFO *TS_STATUS_INFO_dup(TS_STATUS_INFO *a); + +TS_TST_INFO *TS_TST_INFO_new(void); +void TS_TST_INFO_free(TS_TST_INFO *a); +int i2d_TS_TST_INFO(const TS_TST_INFO *a, unsigned char **pp); +TS_TST_INFO *d2i_TS_TST_INFO(TS_TST_INFO **a, const unsigned char **pp, + long length); +TS_TST_INFO *TS_TST_INFO_dup(TS_TST_INFO *a); + +TS_TST_INFO *d2i_TS_TST_INFO_fp(FILE *fp, TS_TST_INFO **a); +int i2d_TS_TST_INFO_fp(FILE *fp, TS_TST_INFO *a); +TS_TST_INFO *d2i_TS_TST_INFO_bio(BIO *fp, TS_TST_INFO **a); +int i2d_TS_TST_INFO_bio(BIO *fp, TS_TST_INFO *a); + +TS_ACCURACY *TS_ACCURACY_new(void); +void TS_ACCURACY_free(TS_ACCURACY *a); +int i2d_TS_ACCURACY(const TS_ACCURACY *a, unsigned char **pp); +TS_ACCURACY *d2i_TS_ACCURACY(TS_ACCURACY **a, const unsigned char **pp, + long length); +TS_ACCURACY *TS_ACCURACY_dup(TS_ACCURACY *a); + +ESS_ISSUER_SERIAL *ESS_ISSUER_SERIAL_new(void); +void ESS_ISSUER_SERIAL_free(ESS_ISSUER_SERIAL *a); +int i2d_ESS_ISSUER_SERIAL(const ESS_ISSUER_SERIAL *a, unsigned char **pp); +ESS_ISSUER_SERIAL *d2i_ESS_ISSUER_SERIAL(ESS_ISSUER_SERIAL **a, + const unsigned char **pp, + long length); +ESS_ISSUER_SERIAL *ESS_ISSUER_SERIAL_dup(ESS_ISSUER_SERIAL *a); + +ESS_CERT_ID *ESS_CERT_ID_new(void); +void ESS_CERT_ID_free(ESS_CERT_ID *a); +int i2d_ESS_CERT_ID(const ESS_CERT_ID *a, unsigned char **pp); +ESS_CERT_ID *d2i_ESS_CERT_ID(ESS_CERT_ID **a, const unsigned char **pp, + long length); +ESS_CERT_ID *ESS_CERT_ID_dup(ESS_CERT_ID *a); + +ESS_SIGNING_CERT *ESS_SIGNING_CERT_new(void); +void ESS_SIGNING_CERT_free(ESS_SIGNING_CERT *a); +int i2d_ESS_SIGNING_CERT(const ESS_SIGNING_CERT *a, unsigned char **pp); +ESS_SIGNING_CERT *d2i_ESS_SIGNING_CERT(ESS_SIGNING_CERT **a, + const unsigned char **pp, long length); +ESS_SIGNING_CERT *ESS_SIGNING_CERT_dup(ESS_SIGNING_CERT *a); + +void ERR_load_TS_strings(void); + +int TS_REQ_set_version(TS_REQ *a, long version); +long TS_REQ_get_version(const TS_REQ *a); + +int TS_REQ_set_msg_imprint(TS_REQ *a, TS_MSG_IMPRINT *msg_imprint); +TS_MSG_IMPRINT *TS_REQ_get_msg_imprint(TS_REQ *a); + +int TS_MSG_IMPRINT_set_algo(TS_MSG_IMPRINT *a, X509_ALGOR *alg); +X509_ALGOR *TS_MSG_IMPRINT_get_algo(TS_MSG_IMPRINT *a); + +int TS_MSG_IMPRINT_set_msg(TS_MSG_IMPRINT *a, unsigned char *d, int len); +ASN1_OCTET_STRING *TS_MSG_IMPRINT_get_msg(TS_MSG_IMPRINT *a); + +int TS_REQ_set_policy_id(TS_REQ *a, ASN1_OBJECT *policy); +ASN1_OBJECT *TS_REQ_get_policy_id(TS_REQ *a); + +int TS_REQ_set_nonce(TS_REQ *a, const ASN1_INTEGER *nonce); +const ASN1_INTEGER *TS_REQ_get_nonce(const TS_REQ *a); + +int TS_REQ_set_cert_req(TS_REQ *a, int cert_req); +int TS_REQ_get_cert_req(const TS_REQ *a); + +STACK_OF(X509_EXTENSION) *TS_REQ_get_exts(TS_REQ *a); +void TS_REQ_ext_free(TS_REQ *a); +int TS_REQ_get_ext_count(TS_REQ *a); +int TS_REQ_get_ext_by_NID(TS_REQ *a, int nid, int lastpos); +int TS_REQ_get_ext_by_OBJ(TS_REQ *a, ASN1_OBJECT *obj, int lastpos); +int TS_REQ_get_ext_by_critical(TS_REQ *a, int crit, int lastpos); +X509_EXTENSION *TS_REQ_get_ext(TS_REQ *a, int loc); +X509_EXTENSION *TS_REQ_delete_ext(TS_REQ *a, int loc); +int TS_REQ_add_ext(TS_REQ *a, X509_EXTENSION *ex, int loc); +void *TS_REQ_get_ext_d2i(TS_REQ *a, int nid, int *crit, int *idx); + +/* Function declarations for TS_REQ defined in ts/ts_req_print.c */ + +int TS_REQ_print_bio(BIO *bio, TS_REQ *a); + +/* Function declarations for TS_RESP defined in ts/ts_resp_utils.c */ + +int TS_RESP_set_status_info(TS_RESP *a, TS_STATUS_INFO *info); +TS_STATUS_INFO *TS_RESP_get_status_info(TS_RESP *a); + +/* Caller loses ownership of PKCS7 and TS_TST_INFO objects. */ +void TS_RESP_set_tst_info(TS_RESP *a, PKCS7 *p7, TS_TST_INFO *tst_info); +PKCS7 *TS_RESP_get_token(TS_RESP *a); +TS_TST_INFO *TS_RESP_get_tst_info(TS_RESP *a); + +int TS_TST_INFO_set_version(TS_TST_INFO *a, long version); +long TS_TST_INFO_get_version(const TS_TST_INFO *a); + +int TS_TST_INFO_set_policy_id(TS_TST_INFO *a, ASN1_OBJECT *policy_id); +ASN1_OBJECT *TS_TST_INFO_get_policy_id(TS_TST_INFO *a); + +int TS_TST_INFO_set_msg_imprint(TS_TST_INFO *a, TS_MSG_IMPRINT *msg_imprint); +TS_MSG_IMPRINT *TS_TST_INFO_get_msg_imprint(TS_TST_INFO *a); + +int TS_TST_INFO_set_serial(TS_TST_INFO *a, const ASN1_INTEGER *serial); +const ASN1_INTEGER *TS_TST_INFO_get_serial(const TS_TST_INFO *a); + +int TS_TST_INFO_set_time(TS_TST_INFO *a, const ASN1_GENERALIZEDTIME *gtime); +const ASN1_GENERALIZEDTIME *TS_TST_INFO_get_time(const TS_TST_INFO *a); + +int TS_TST_INFO_set_accuracy(TS_TST_INFO *a, TS_ACCURACY *accuracy); +TS_ACCURACY *TS_TST_INFO_get_accuracy(TS_TST_INFO *a); + +int TS_ACCURACY_set_seconds(TS_ACCURACY *a, const ASN1_INTEGER *seconds); +const ASN1_INTEGER *TS_ACCURACY_get_seconds(const TS_ACCURACY *a); + +int TS_ACCURACY_set_millis(TS_ACCURACY *a, const ASN1_INTEGER *millis); +const ASN1_INTEGER *TS_ACCURACY_get_millis(const TS_ACCURACY *a); + +int TS_ACCURACY_set_micros(TS_ACCURACY *a, const ASN1_INTEGER *micros); +const ASN1_INTEGER *TS_ACCURACY_get_micros(const TS_ACCURACY *a); + +int TS_TST_INFO_set_ordering(TS_TST_INFO *a, int ordering); +int TS_TST_INFO_get_ordering(const TS_TST_INFO *a); + +int TS_TST_INFO_set_nonce(TS_TST_INFO *a, const ASN1_INTEGER *nonce); +const ASN1_INTEGER *TS_TST_INFO_get_nonce(const TS_TST_INFO *a); + +int TS_TST_INFO_set_tsa(TS_TST_INFO *a, GENERAL_NAME *tsa); +GENERAL_NAME *TS_TST_INFO_get_tsa(TS_TST_INFO *a); + +STACK_OF(X509_EXTENSION) *TS_TST_INFO_get_exts(TS_TST_INFO *a); +void TS_TST_INFO_ext_free(TS_TST_INFO *a); +int TS_TST_INFO_get_ext_count(TS_TST_INFO *a); +int TS_TST_INFO_get_ext_by_NID(TS_TST_INFO *a, int nid, int lastpos); +int TS_TST_INFO_get_ext_by_OBJ(TS_TST_INFO *a, ASN1_OBJECT *obj, int lastpos); +int TS_TST_INFO_get_ext_by_critical(TS_TST_INFO *a, int crit, int lastpos); +X509_EXTENSION *TS_TST_INFO_get_ext(TS_TST_INFO *a, int loc); +X509_EXTENSION *TS_TST_INFO_delete_ext(TS_TST_INFO *a, int loc); +int TS_TST_INFO_add_ext(TS_TST_INFO *a, X509_EXTENSION *ex, int loc); +void *TS_TST_INFO_get_ext_d2i(TS_TST_INFO *a, int nid, int *crit, int *idx); + +/* + * Declarations related to response generation, defined in ts/ts_resp_sign.c. + */ + +/* Optional flags for response generation. */ + +/* Don't include the TSA name in response. */ +# define TS_TSA_NAME 0x01 + +/* Set ordering to true in response. */ +# define TS_ORDERING 0x02 + +/* + * Include the signer certificate and the other specified certificates in + * the ESS signing certificate attribute beside the PKCS7 signed data. + * Only the signer certificates is included by default. + */ +# define TS_ESS_CERT_ID_CHAIN 0x04 + +/* Forward declaration. */ +struct TS_resp_ctx; + +/* This must return a unique number less than 160 bits long. */ +typedef ASN1_INTEGER *(*TS_serial_cb) (struct TS_resp_ctx *, void *); + +/* + * This must return the seconds and microseconds since Jan 1, 1970 in the sec + * and usec variables allocated by the caller. Return non-zero for success + * and zero for failure. + */ +typedef int (*TS_time_cb) (struct TS_resp_ctx *, void *, long *sec, + long *usec); + +/* + * This must process the given extension. It can modify the TS_TST_INFO + * object of the context. Return values: !0 (processed), 0 (error, it must + * set the status info/failure info of the response). + */ +typedef int (*TS_extension_cb) (struct TS_resp_ctx *, X509_EXTENSION *, + void *); + +typedef struct TS_resp_ctx { + X509 *signer_cert; + EVP_PKEY *signer_key; + STACK_OF(X509) *certs; /* Certs to include in signed data. */ + STACK_OF(ASN1_OBJECT) *policies; /* Acceptable policies. */ + ASN1_OBJECT *default_policy; /* It may appear in policies, too. */ + STACK_OF(EVP_MD) *mds; /* Acceptable message digests. */ + ASN1_INTEGER *seconds; /* accuracy, 0 means not specified. */ + ASN1_INTEGER *millis; /* accuracy, 0 means not specified. */ + ASN1_INTEGER *micros; /* accuracy, 0 means not specified. */ + unsigned clock_precision_digits; /* fraction of seconds in time stamp + * token. */ + unsigned flags; /* Optional info, see values above. */ + /* Callback functions. */ + TS_serial_cb serial_cb; + void *serial_cb_data; /* User data for serial_cb. */ + TS_time_cb time_cb; + void *time_cb_data; /* User data for time_cb. */ + TS_extension_cb extension_cb; + void *extension_cb_data; /* User data for extension_cb. */ + /* These members are used only while creating the response. */ + TS_REQ *request; + TS_RESP *response; + TS_TST_INFO *tst_info; +} TS_RESP_CTX; + +DECLARE_STACK_OF(EVP_MD) +DECLARE_ASN1_SET_OF(EVP_MD) + +/* Creates a response context that can be used for generating responses. */ +TS_RESP_CTX *TS_RESP_CTX_new(void); +void TS_RESP_CTX_free(TS_RESP_CTX *ctx); + +/* This parameter must be set. */ +int TS_RESP_CTX_set_signer_cert(TS_RESP_CTX *ctx, X509 *signer); + +/* This parameter must be set. */ +int TS_RESP_CTX_set_signer_key(TS_RESP_CTX *ctx, EVP_PKEY *key); + +/* This parameter must be set. */ +int TS_RESP_CTX_set_def_policy(TS_RESP_CTX *ctx, ASN1_OBJECT *def_policy); + +/* No additional certs are included in the response by default. */ +int TS_RESP_CTX_set_certs(TS_RESP_CTX *ctx, STACK_OF(X509) *certs); + +/* + * Adds a new acceptable policy, only the default policy is accepted by + * default. + */ +int TS_RESP_CTX_add_policy(TS_RESP_CTX *ctx, ASN1_OBJECT *policy); + +/* + * Adds a new acceptable message digest. Note that no message digests are + * accepted by default. The md argument is shared with the caller. + */ +int TS_RESP_CTX_add_md(TS_RESP_CTX *ctx, const EVP_MD *md); + +/* Accuracy is not included by default. */ +int TS_RESP_CTX_set_accuracy(TS_RESP_CTX *ctx, + int secs, int millis, int micros); + +/* + * Clock precision digits, i.e. the number of decimal digits: '0' means sec, + * '3' msec, '6' usec, and so on. Default is 0. + */ +int TS_RESP_CTX_set_clock_precision_digits(TS_RESP_CTX *ctx, + unsigned clock_precision_digits); +/* At most we accept usec precision. */ +# define TS_MAX_CLOCK_PRECISION_DIGITS 6 + +/* Maximum status message length */ +# define TS_MAX_STATUS_LENGTH (1024 * 1024) + +/* No flags are set by default. */ +void TS_RESP_CTX_add_flags(TS_RESP_CTX *ctx, int flags); + +/* Default callback always returns a constant. */ +void TS_RESP_CTX_set_serial_cb(TS_RESP_CTX *ctx, TS_serial_cb cb, void *data); + +/* Default callback uses the gettimeofday() and gmtime() system calls. */ +void TS_RESP_CTX_set_time_cb(TS_RESP_CTX *ctx, TS_time_cb cb, void *data); + +/* + * Default callback rejects all extensions. The extension callback is called + * when the TS_TST_INFO object is already set up and not signed yet. + */ +/* FIXME: extension handling is not tested yet. */ +void TS_RESP_CTX_set_extension_cb(TS_RESP_CTX *ctx, + TS_extension_cb cb, void *data); + +/* The following methods can be used in the callbacks. */ +int TS_RESP_CTX_set_status_info(TS_RESP_CTX *ctx, + int status, const char *text); + +/* Sets the status info only if it is still TS_STATUS_GRANTED. */ +int TS_RESP_CTX_set_status_info_cond(TS_RESP_CTX *ctx, + int status, const char *text); + +int TS_RESP_CTX_add_failure_info(TS_RESP_CTX *ctx, int failure); + +/* The get methods below can be used in the extension callback. */ +TS_REQ *TS_RESP_CTX_get_request(TS_RESP_CTX *ctx); + +TS_TST_INFO *TS_RESP_CTX_get_tst_info(TS_RESP_CTX *ctx); + +/* + * Creates the signed TS_TST_INFO and puts it in TS_RESP. + * In case of errors it sets the status info properly. + * Returns NULL only in case of memory allocation/fatal error. + */ +TS_RESP *TS_RESP_create_response(TS_RESP_CTX *ctx, BIO *req_bio); + +/* + * Declarations related to response verification, + * they are defined in ts/ts_resp_verify.c. + */ + +int TS_RESP_verify_signature(PKCS7 *token, STACK_OF(X509) *certs, + X509_STORE *store, X509 **signer_out); + +/* Context structure for the generic verify method. */ + +/* Verify the signer's certificate and the signature of the response. */ +# define TS_VFY_SIGNATURE (1u << 0) +/* Verify the version number of the response. */ +# define TS_VFY_VERSION (1u << 1) +/* Verify if the policy supplied by the user matches the policy of the TSA. */ +# define TS_VFY_POLICY (1u << 2) +/* + * Verify the message imprint provided by the user. This flag should not be + * specified with TS_VFY_DATA. + */ +# define TS_VFY_IMPRINT (1u << 3) +/* + * Verify the message imprint computed by the verify method from the user + * provided data and the MD algorithm of the response. This flag should not + * be specified with TS_VFY_IMPRINT. + */ +# define TS_VFY_DATA (1u << 4) +/* Verify the nonce value. */ +# define TS_VFY_NONCE (1u << 5) +/* Verify if the TSA name field matches the signer certificate. */ +# define TS_VFY_SIGNER (1u << 6) +/* Verify if the TSA name field equals to the user provided name. */ +# define TS_VFY_TSA_NAME (1u << 7) + +/* You can use the following convenience constants. */ +# define TS_VFY_ALL_IMPRINT (TS_VFY_SIGNATURE \ + | TS_VFY_VERSION \ + | TS_VFY_POLICY \ + | TS_VFY_IMPRINT \ + | TS_VFY_NONCE \ + | TS_VFY_SIGNER \ + | TS_VFY_TSA_NAME) +# define TS_VFY_ALL_DATA (TS_VFY_SIGNATURE \ + | TS_VFY_VERSION \ + | TS_VFY_POLICY \ + | TS_VFY_DATA \ + | TS_VFY_NONCE \ + | TS_VFY_SIGNER \ + | TS_VFY_TSA_NAME) + +typedef struct TS_verify_ctx { + /* Set this to the union of TS_VFY_... flags you want to carry out. */ + unsigned flags; + /* Must be set only with TS_VFY_SIGNATURE. certs is optional. */ + X509_STORE *store; + STACK_OF(X509) *certs; + /* Must be set only with TS_VFY_POLICY. */ + ASN1_OBJECT *policy; + /* + * Must be set only with TS_VFY_IMPRINT. If md_alg is NULL, the + * algorithm from the response is used. + */ + X509_ALGOR *md_alg; + unsigned char *imprint; + unsigned imprint_len; + /* Must be set only with TS_VFY_DATA. */ + BIO *data; + /* Must be set only with TS_VFY_TSA_NAME. */ + ASN1_INTEGER *nonce; + /* Must be set only with TS_VFY_TSA_NAME. */ + GENERAL_NAME *tsa_name; +} TS_VERIFY_CTX; + +int TS_RESP_verify_response(TS_VERIFY_CTX *ctx, TS_RESP *response); +int TS_RESP_verify_token(TS_VERIFY_CTX *ctx, PKCS7 *token); + +/* + * Declarations related to response verification context, + * they are defined in ts/ts_verify_ctx.c. + */ + +/* Set all fields to zero. */ +TS_VERIFY_CTX *TS_VERIFY_CTX_new(void); +void TS_VERIFY_CTX_init(TS_VERIFY_CTX *ctx); +void TS_VERIFY_CTX_free(TS_VERIFY_CTX *ctx); +void TS_VERIFY_CTX_cleanup(TS_VERIFY_CTX *ctx); + +/*- + * If ctx is NULL, it allocates and returns a new object, otherwise + * it returns ctx. It initialises all the members as follows: + * flags = TS_VFY_ALL_IMPRINT & ~(TS_VFY_TSA_NAME | TS_VFY_SIGNATURE) + * certs = NULL + * store = NULL + * policy = policy from the request or NULL if absent (in this case + * TS_VFY_POLICY is cleared from flags as well) + * md_alg = MD algorithm from request + * imprint, imprint_len = imprint from request + * data = NULL + * nonce, nonce_len = nonce from the request or NULL if absent (in this case + * TS_VFY_NONCE is cleared from flags as well) + * tsa_name = NULL + * Important: after calling this method TS_VFY_SIGNATURE should be added! + */ +TS_VERIFY_CTX *TS_REQ_to_TS_VERIFY_CTX(TS_REQ *req, TS_VERIFY_CTX *ctx); + +/* Function declarations for TS_RESP defined in ts/ts_resp_print.c */ + +int TS_RESP_print_bio(BIO *bio, TS_RESP *a); +int TS_STATUS_INFO_print_bio(BIO *bio, TS_STATUS_INFO *a); +int TS_TST_INFO_print_bio(BIO *bio, TS_TST_INFO *a); + +/* Common utility functions defined in ts/ts_lib.c */ + +int TS_ASN1_INTEGER_print_bio(BIO *bio, const ASN1_INTEGER *num); +int TS_OBJ_print_bio(BIO *bio, const ASN1_OBJECT *obj); +int TS_ext_print_bio(BIO *bio, const STACK_OF(X509_EXTENSION) *extensions); +int TS_X509_ALGOR_print_bio(BIO *bio, const X509_ALGOR *alg); +int TS_MSG_IMPRINT_print_bio(BIO *bio, TS_MSG_IMPRINT *msg); + +/* + * Function declarations for handling configuration options, defined in + * ts/ts_conf.c + */ + +X509 *TS_CONF_load_cert(const char *file); +STACK_OF(X509) *TS_CONF_load_certs(const char *file); +EVP_PKEY *TS_CONF_load_key(const char *file, const char *pass); +const char *TS_CONF_get_tsa_section(CONF *conf, const char *section); +int TS_CONF_set_serial(CONF *conf, const char *section, TS_serial_cb cb, + TS_RESP_CTX *ctx); +int TS_CONF_set_crypto_device(CONF *conf, const char *section, + const char *device); +int TS_CONF_set_default_engine(const char *name); +int TS_CONF_set_signer_cert(CONF *conf, const char *section, + const char *cert, TS_RESP_CTX *ctx); +int TS_CONF_set_certs(CONF *conf, const char *section, const char *certs, + TS_RESP_CTX *ctx); +int TS_CONF_set_signer_key(CONF *conf, const char *section, + const char *key, const char *pass, + TS_RESP_CTX *ctx); +int TS_CONF_set_def_policy(CONF *conf, const char *section, + const char *policy, TS_RESP_CTX *ctx); +int TS_CONF_set_policies(CONF *conf, const char *section, TS_RESP_CTX *ctx); +int TS_CONF_set_digests(CONF *conf, const char *section, TS_RESP_CTX *ctx); +int TS_CONF_set_accuracy(CONF *conf, const char *section, TS_RESP_CTX *ctx); +int TS_CONF_set_clock_precision_digits(CONF *conf, const char *section, + TS_RESP_CTX *ctx); +int TS_CONF_set_ordering(CONF *conf, const char *section, TS_RESP_CTX *ctx); +int TS_CONF_set_tsa_name(CONF *conf, const char *section, TS_RESP_CTX *ctx); +int TS_CONF_set_ess_cert_id_chain(CONF *conf, const char *section, + TS_RESP_CTX *ctx); + +/* -------------------------------------------------- */ +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_TS_strings(void); + +/* Error codes for the TS functions. */ + +/* Function codes. */ +# define TS_F_D2I_TS_RESP 147 +# define TS_F_DEF_SERIAL_CB 110 +# define TS_F_DEF_TIME_CB 111 +# define TS_F_ESS_ADD_SIGNING_CERT 112 +# define TS_F_ESS_CERT_ID_NEW_INIT 113 +# define TS_F_ESS_SIGNING_CERT_NEW_INIT 114 +# define TS_F_INT_TS_RESP_VERIFY_TOKEN 149 +# define TS_F_PKCS7_TO_TS_TST_INFO 148 +# define TS_F_TS_ACCURACY_SET_MICROS 115 +# define TS_F_TS_ACCURACY_SET_MILLIS 116 +# define TS_F_TS_ACCURACY_SET_SECONDS 117 +# define TS_F_TS_CHECK_IMPRINTS 100 +# define TS_F_TS_CHECK_NONCES 101 +# define TS_F_TS_CHECK_POLICY 102 +# define TS_F_TS_CHECK_SIGNING_CERTS 103 +# define TS_F_TS_CHECK_STATUS_INFO 104 +# define TS_F_TS_COMPUTE_IMPRINT 145 +# define TS_F_TS_CONF_SET_DEFAULT_ENGINE 146 +# define TS_F_TS_GET_STATUS_TEXT 105 +# define TS_F_TS_MSG_IMPRINT_SET_ALGO 118 +# define TS_F_TS_REQ_SET_MSG_IMPRINT 119 +# define TS_F_TS_REQ_SET_NONCE 120 +# define TS_F_TS_REQ_SET_POLICY_ID 121 +# define TS_F_TS_RESP_CREATE_RESPONSE 122 +# define TS_F_TS_RESP_CREATE_TST_INFO 123 +# define TS_F_TS_RESP_CTX_ADD_FAILURE_INFO 124 +# define TS_F_TS_RESP_CTX_ADD_MD 125 +# define TS_F_TS_RESP_CTX_ADD_POLICY 126 +# define TS_F_TS_RESP_CTX_NEW 127 +# define TS_F_TS_RESP_CTX_SET_ACCURACY 128 +# define TS_F_TS_RESP_CTX_SET_CERTS 129 +# define TS_F_TS_RESP_CTX_SET_DEF_POLICY 130 +# define TS_F_TS_RESP_CTX_SET_SIGNER_CERT 131 +# define TS_F_TS_RESP_CTX_SET_STATUS_INFO 132 +# define TS_F_TS_RESP_GET_POLICY 133 +# define TS_F_TS_RESP_SET_GENTIME_WITH_PRECISION 134 +# define TS_F_TS_RESP_SET_STATUS_INFO 135 +# define TS_F_TS_RESP_SET_TST_INFO 150 +# define TS_F_TS_RESP_SIGN 136 +# define TS_F_TS_RESP_VERIFY_SIGNATURE 106 +# define TS_F_TS_RESP_VERIFY_TOKEN 107 +# define TS_F_TS_TST_INFO_SET_ACCURACY 137 +# define TS_F_TS_TST_INFO_SET_MSG_IMPRINT 138 +# define TS_F_TS_TST_INFO_SET_NONCE 139 +# define TS_F_TS_TST_INFO_SET_POLICY_ID 140 +# define TS_F_TS_TST_INFO_SET_SERIAL 141 +# define TS_F_TS_TST_INFO_SET_TIME 142 +# define TS_F_TS_TST_INFO_SET_TSA 143 +# define TS_F_TS_VERIFY 108 +# define TS_F_TS_VERIFY_CERT 109 +# define TS_F_TS_VERIFY_CTX_NEW 144 + +/* Reason codes. */ +# define TS_R_BAD_PKCS7_TYPE 132 +# define TS_R_BAD_TYPE 133 +# define TS_R_CERTIFICATE_VERIFY_ERROR 100 +# define TS_R_COULD_NOT_SET_ENGINE 127 +# define TS_R_COULD_NOT_SET_TIME 115 +# define TS_R_D2I_TS_RESP_INT_FAILED 128 +# define TS_R_DETACHED_CONTENT 134 +# define TS_R_ESS_ADD_SIGNING_CERT_ERROR 116 +# define TS_R_ESS_SIGNING_CERTIFICATE_ERROR 101 +# define TS_R_INVALID_NULL_POINTER 102 +# define TS_R_INVALID_SIGNER_CERTIFICATE_PURPOSE 117 +# define TS_R_MESSAGE_IMPRINT_MISMATCH 103 +# define TS_R_NONCE_MISMATCH 104 +# define TS_R_NONCE_NOT_RETURNED 105 +# define TS_R_NO_CONTENT 106 +# define TS_R_NO_TIME_STAMP_TOKEN 107 +# define TS_R_PKCS7_ADD_SIGNATURE_ERROR 118 +# define TS_R_PKCS7_ADD_SIGNED_ATTR_ERROR 119 +# define TS_R_PKCS7_TO_TS_TST_INFO_FAILED 129 +# define TS_R_POLICY_MISMATCH 108 +# define TS_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE 120 +# define TS_R_RESPONSE_SETUP_ERROR 121 +# define TS_R_SIGNATURE_FAILURE 109 +# define TS_R_THERE_MUST_BE_ONE_SIGNER 110 +# define TS_R_TIME_SYSCALL_ERROR 122 +# define TS_R_TOKEN_NOT_PRESENT 130 +# define TS_R_TOKEN_PRESENT 131 +# define TS_R_TSA_NAME_MISMATCH 111 +# define TS_R_TSA_UNTRUSTED 112 +# define TS_R_TST_INFO_SETUP_ERROR 123 +# define TS_R_TS_DATASIGN 124 +# define TS_R_UNACCEPTABLE_POLICY 125 +# define TS_R_UNSUPPORTED_MD_ALGORITHM 126 +# define TS_R_UNSUPPORTED_VERSION 113 +# define TS_R_WRONG_CONTENT_TYPE 114 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/txt_db.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/txt_db.h new file mode 100644 index 0000000..98e23a2 --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/txt_db.h @@ -0,0 +1,112 @@ +/* crypto/txt_db/txt_db.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_TXT_DB_H +# define HEADER_TXT_DB_H + +# include +# ifndef OPENSSL_NO_BIO +# include +# endif +# include +# include + +# define DB_ERROR_OK 0 +# define DB_ERROR_MALLOC 1 +# define DB_ERROR_INDEX_CLASH 2 +# define DB_ERROR_INDEX_OUT_OF_RANGE 3 +# define DB_ERROR_NO_INDEX 4 +# define DB_ERROR_INSERT_INDEX_CLASH 5 + +#ifdef __cplusplus +extern "C" { +#endif + +typedef OPENSSL_STRING *OPENSSL_PSTRING; +DECLARE_SPECIAL_STACK_OF(OPENSSL_PSTRING, OPENSSL_STRING) + +typedef struct txt_db_st { + int num_fields; + STACK_OF(OPENSSL_PSTRING) *data; + LHASH_OF(OPENSSL_STRING) **index; + int (**qual) (OPENSSL_STRING *); + long error; + long arg1; + long arg2; + OPENSSL_STRING *arg_row; +} TXT_DB; + +# ifndef OPENSSL_NO_BIO +TXT_DB *TXT_DB_read(BIO *in, int num); +long TXT_DB_write(BIO *out, TXT_DB *db); +# else +TXT_DB *TXT_DB_read(char *in, int num); +long TXT_DB_write(char *out, TXT_DB *db); +# endif +int TXT_DB_create_index(TXT_DB *db, int field, int (*qual) (OPENSSL_STRING *), + LHASH_HASH_FN_TYPE hash, LHASH_COMP_FN_TYPE cmp); +void TXT_DB_free(TXT_DB *db); +OPENSSL_STRING *TXT_DB_get_by_index(TXT_DB *db, int idx, + OPENSSL_STRING *value); +int TXT_DB_insert(TXT_DB *db, OPENSSL_STRING *value); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/ui.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/ui.h new file mode 100644 index 0000000..0dc1633 --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/ui.h @@ -0,0 +1,415 @@ +/* crypto/ui/ui.h */ +/* + * Written by Richard Levitte (richard@levitte.org) for the OpenSSL project + * 2001. + */ +/* ==================================================================== + * Copyright (c) 2001 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_UI_H +# define HEADER_UI_H + +# ifndef OPENSSL_NO_DEPRECATED +# include +# endif +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Declared already in ossl_typ.h */ +/* typedef struct ui_st UI; */ +/* typedef struct ui_method_st UI_METHOD; */ + +/* + * All the following functions return -1 or NULL on error and in some cases + * (UI_process()) -2 if interrupted or in some other way cancelled. When + * everything is fine, they return 0, a positive value or a non-NULL pointer, + * all depending on their purpose. + */ + +/* Creators and destructor. */ +UI *UI_new(void); +UI *UI_new_method(const UI_METHOD *method); +void UI_free(UI *ui); + +/*- + The following functions are used to add strings to be printed and prompt + strings to prompt for data. The names are UI_{add,dup}__string + and UI_{add,dup}_input_boolean. + + UI_{add,dup}__string have the following meanings: + add add a text or prompt string. The pointers given to these + functions are used verbatim, no copying is done. + dup make a copy of the text or prompt string, then add the copy + to the collection of strings in the user interface. + + The function is a name for the functionality that the given + string shall be used for. It can be one of: + input use the string as data prompt. + verify use the string as verification prompt. This + is used to verify a previous input. + info use the string for informational output. + error use the string for error output. + Honestly, there's currently no difference between info and error for the + moment. + + UI_{add,dup}_input_boolean have the same semantics for "add" and "dup", + and are typically used when one wants to prompt for a yes/no response. + + All of the functions in this group take a UI and a prompt string. + The string input and verify addition functions also take a flag argument, + a buffer for the result to end up with, a minimum input size and a maximum + input size (the result buffer MUST be large enough to be able to contain + the maximum number of characters). Additionally, the verify addition + functions takes another buffer to compare the result against. + The boolean input functions take an action description string (which should + be safe to ignore if the expected user action is obvious, for example with + a dialog box with an OK button and a Cancel button), a string of acceptable + characters to mean OK and to mean Cancel. The two last strings are checked + to make sure they don't have common characters. Additionally, the same + flag argument as for the string input is taken, as well as a result buffer. + The result buffer is required to be at least one byte long. Depending on + the answer, the first character from the OK or the Cancel character strings + will be stored in the first byte of the result buffer. No NUL will be + added, so the result is *not* a string. + + On success, the all return an index of the added information. That index + is usefull when retrieving results with UI_get0_result(). */ +int UI_add_input_string(UI *ui, const char *prompt, int flags, + char *result_buf, int minsize, int maxsize); +int UI_dup_input_string(UI *ui, const char *prompt, int flags, + char *result_buf, int minsize, int maxsize); +int UI_add_verify_string(UI *ui, const char *prompt, int flags, + char *result_buf, int minsize, int maxsize, + const char *test_buf); +int UI_dup_verify_string(UI *ui, const char *prompt, int flags, + char *result_buf, int minsize, int maxsize, + const char *test_buf); +int UI_add_input_boolean(UI *ui, const char *prompt, const char *action_desc, + const char *ok_chars, const char *cancel_chars, + int flags, char *result_buf); +int UI_dup_input_boolean(UI *ui, const char *prompt, const char *action_desc, + const char *ok_chars, const char *cancel_chars, + int flags, char *result_buf); +int UI_add_info_string(UI *ui, const char *text); +int UI_dup_info_string(UI *ui, const char *text); +int UI_add_error_string(UI *ui, const char *text); +int UI_dup_error_string(UI *ui, const char *text); + +/* These are the possible flags. They can be or'ed together. */ +/* Use to have echoing of input */ +# define UI_INPUT_FLAG_ECHO 0x01 +/* + * Use a default password. Where that password is found is completely up to + * the application, it might for example be in the user data set with + * UI_add_user_data(). It is not recommended to have more than one input in + * each UI being marked with this flag, or the application might get + * confused. + */ +# define UI_INPUT_FLAG_DEFAULT_PWD 0x02 + +/*- + * The user of these routines may want to define flags of their own. The core + * UI won't look at those, but will pass them on to the method routines. They + * must use higher bits so they don't get confused with the UI bits above. + * UI_INPUT_FLAG_USER_BASE tells which is the lowest bit to use. A good + * example of use is this: + * + * #define MY_UI_FLAG1 (0x01 << UI_INPUT_FLAG_USER_BASE) + * +*/ +# define UI_INPUT_FLAG_USER_BASE 16 + +/*- + * The following function helps construct a prompt. object_desc is a + * textual short description of the object, for example "pass phrase", + * and object_name is the name of the object (might be a card name or + * a file name. + * The returned string shall always be allocated on the heap with + * OPENSSL_malloc(), and need to be free'd with OPENSSL_free(). + * + * If the ui_method doesn't contain a pointer to a user-defined prompt + * constructor, a default string is built, looking like this: + * + * "Enter {object_desc} for {object_name}:" + * + * So, if object_desc has the value "pass phrase" and object_name has + * the value "foo.key", the resulting string is: + * + * "Enter pass phrase for foo.key:" +*/ +char *UI_construct_prompt(UI *ui_method, + const char *object_desc, const char *object_name); + +/* + * The following function is used to store a pointer to user-specific data. + * Any previous such pointer will be returned and replaced. + * + * For callback purposes, this function makes a lot more sense than using + * ex_data, since the latter requires that different parts of OpenSSL or + * applications share the same ex_data index. + * + * Note that the UI_OpenSSL() method completely ignores the user data. Other + * methods may not, however. + */ +void *UI_add_user_data(UI *ui, void *user_data); +/* We need a user data retrieving function as well. */ +void *UI_get0_user_data(UI *ui); + +/* Return the result associated with a prompt given with the index i. */ +const char *UI_get0_result(UI *ui, int i); + +/* When all strings have been added, process the whole thing. */ +int UI_process(UI *ui); + +/* + * Give a user interface parametrised control commands. This can be used to + * send down an integer, a data pointer or a function pointer, as well as be + * used to get information from a UI. + */ +int UI_ctrl(UI *ui, int cmd, long i, void *p, void (*f) (void)); + +/* The commands */ +/* + * Use UI_CONTROL_PRINT_ERRORS with the value 1 to have UI_process print the + * OpenSSL error stack before printing any info or added error messages and + * before any prompting. + */ +# define UI_CTRL_PRINT_ERRORS 1 +/* + * Check if a UI_process() is possible to do again with the same instance of + * a user interface. This makes UI_ctrl() return 1 if it is redoable, and 0 + * if not. + */ +# define UI_CTRL_IS_REDOABLE 2 + +/* Some methods may use extra data */ +# define UI_set_app_data(s,arg) UI_set_ex_data(s,0,arg) +# define UI_get_app_data(s) UI_get_ex_data(s,0) +int UI_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); +int UI_set_ex_data(UI *r, int idx, void *arg); +void *UI_get_ex_data(UI *r, int idx); + +/* Use specific methods instead of the built-in one */ +void UI_set_default_method(const UI_METHOD *meth); +const UI_METHOD *UI_get_default_method(void); +const UI_METHOD *UI_get_method(UI *ui); +const UI_METHOD *UI_set_method(UI *ui, const UI_METHOD *meth); + +/* The method with all the built-in thingies */ +UI_METHOD *UI_OpenSSL(void); + +/* ---------- For method writers ---------- */ +/*- + A method contains a number of functions that implement the low level + of the User Interface. The functions are: + + an opener This function starts a session, maybe by opening + a channel to a tty, or by opening a window. + a writer This function is called to write a given string, + maybe to the tty, maybe as a field label in a + window. + a flusher This function is called to flush everything that + has been output so far. It can be used to actually + display a dialog box after it has been built. + a reader This function is called to read a given prompt, + maybe from the tty, maybe from a field in a + window. Note that it's called wth all string + structures, not only the prompt ones, so it must + check such things itself. + a closer This function closes the session, maybe by closing + the channel to the tty, or closing the window. + + All these functions are expected to return: + + 0 on error. + 1 on success. + -1 on out-of-band events, for example if some prompting has + been canceled (by pressing Ctrl-C, for example). This is + only checked when returned by the flusher or the reader. + + The way this is used, the opener is first called, then the writer for all + strings, then the flusher, then the reader for all strings and finally the + closer. Note that if you want to prompt from a terminal or other command + line interface, the best is to have the reader also write the prompts + instead of having the writer do it. If you want to prompt from a dialog + box, the writer can be used to build up the contents of the box, and the + flusher to actually display the box and run the event loop until all data + has been given, after which the reader only grabs the given data and puts + them back into the UI strings. + + All method functions take a UI as argument. Additionally, the writer and + the reader take a UI_STRING. +*/ + +/* + * The UI_STRING type is the data structure that contains all the needed info + * about a string or a prompt, including test data for a verification prompt. + */ +typedef struct ui_string_st UI_STRING; +DECLARE_STACK_OF(UI_STRING) + +/* + * The different types of strings that are currently supported. This is only + * needed by method authors. + */ +enum UI_string_types { + UIT_NONE = 0, + UIT_PROMPT, /* Prompt for a string */ + UIT_VERIFY, /* Prompt for a string and verify */ + UIT_BOOLEAN, /* Prompt for a yes/no response */ + UIT_INFO, /* Send info to the user */ + UIT_ERROR /* Send an error message to the user */ +}; + +/* Create and manipulate methods */ +UI_METHOD *UI_create_method(char *name); +void UI_destroy_method(UI_METHOD *ui_method); +int UI_method_set_opener(UI_METHOD *method, int (*opener) (UI *ui)); +int UI_method_set_writer(UI_METHOD *method, + int (*writer) (UI *ui, UI_STRING *uis)); +int UI_method_set_flusher(UI_METHOD *method, int (*flusher) (UI *ui)); +int UI_method_set_reader(UI_METHOD *method, + int (*reader) (UI *ui, UI_STRING *uis)); +int UI_method_set_closer(UI_METHOD *method, int (*closer) (UI *ui)); +int UI_method_set_prompt_constructor(UI_METHOD *method, + char *(*prompt_constructor) (UI *ui, + const char + *object_desc, + const char + *object_name)); +int (*UI_method_get_opener(UI_METHOD *method)) (UI *); +int (*UI_method_get_writer(UI_METHOD *method)) (UI *, UI_STRING *); +int (*UI_method_get_flusher(UI_METHOD *method)) (UI *); +int (*UI_method_get_reader(UI_METHOD *method)) (UI *, UI_STRING *); +int (*UI_method_get_closer(UI_METHOD *method)) (UI *); +char *(*UI_method_get_prompt_constructor(UI_METHOD *method)) (UI *, + const char *, + const char *); + +/* + * The following functions are helpers for method writers to access relevant + * data from a UI_STRING. + */ + +/* Return type of the UI_STRING */ +enum UI_string_types UI_get_string_type(UI_STRING *uis); +/* Return input flags of the UI_STRING */ +int UI_get_input_flags(UI_STRING *uis); +/* Return the actual string to output (the prompt, info or error) */ +const char *UI_get0_output_string(UI_STRING *uis); +/* + * Return the optional action string to output (the boolean promtp + * instruction) + */ +const char *UI_get0_action_string(UI_STRING *uis); +/* Return the result of a prompt */ +const char *UI_get0_result_string(UI_STRING *uis); +/* + * Return the string to test the result against. Only useful with verifies. + */ +const char *UI_get0_test_string(UI_STRING *uis); +/* Return the required minimum size of the result */ +int UI_get_result_minsize(UI_STRING *uis); +/* Return the required maximum size of the result */ +int UI_get_result_maxsize(UI_STRING *uis); +/* Set the result of a UI_STRING. */ +int UI_set_result(UI *ui, UI_STRING *uis, const char *result); + +/* A couple of popular utility functions */ +int UI_UTIL_read_pw_string(char *buf, int length, const char *prompt, + int verify); +int UI_UTIL_read_pw(char *buf, char *buff, int size, const char *prompt, + int verify); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_UI_strings(void); + +/* Error codes for the UI functions. */ + +/* Function codes. */ +# define UI_F_GENERAL_ALLOCATE_BOOLEAN 108 +# define UI_F_GENERAL_ALLOCATE_PROMPT 109 +# define UI_F_GENERAL_ALLOCATE_STRING 100 +# define UI_F_UI_CTRL 111 +# define UI_F_UI_DUP_ERROR_STRING 101 +# define UI_F_UI_DUP_INFO_STRING 102 +# define UI_F_UI_DUP_INPUT_BOOLEAN 110 +# define UI_F_UI_DUP_INPUT_STRING 103 +# define UI_F_UI_DUP_VERIFY_STRING 106 +# define UI_F_UI_GET0_RESULT 107 +# define UI_F_UI_NEW_METHOD 104 +# define UI_F_UI_SET_RESULT 105 + +/* Reason codes. */ +# define UI_R_COMMON_OK_AND_CANCEL_CHARACTERS 104 +# define UI_R_INDEX_TOO_LARGE 102 +# define UI_R_INDEX_TOO_SMALL 103 +# define UI_R_NO_RESULT_BUFFER 105 +# define UI_R_RESULT_TOO_LARGE 100 +# define UI_R_RESULT_TOO_SMALL 101 +# define UI_R_UNKNOWN_CONTROL_COMMAND 106 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/ui_compat.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/ui_compat.h new file mode 100644 index 0000000..bf54154 --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/ui_compat.h @@ -0,0 +1,88 @@ +/* crypto/ui/ui.h */ +/* + * Written by Richard Levitte (richard@levitte.org) for the OpenSSL project + * 2001. + */ +/* ==================================================================== + * Copyright (c) 2001 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_UI_COMPAT_H +# define HEADER_UI_COMPAT_H + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * The following functions were previously part of the DES section, and are + * provided here for backward compatibility reasons. + */ + +# define des_read_pw_string(b,l,p,v) \ + _ossl_old_des_read_pw_string((b),(l),(p),(v)) +# define des_read_pw(b,bf,s,p,v) \ + _ossl_old_des_read_pw((b),(bf),(s),(p),(v)) + +int _ossl_old_des_read_pw_string(char *buf, int length, const char *prompt, + int verify); +int _ossl_old_des_read_pw(char *buf, char *buff, int size, const char *prompt, + int verify); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/whrlpool.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/whrlpool.h new file mode 100644 index 0000000..73c749d --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/whrlpool.h @@ -0,0 +1,41 @@ +#ifndef HEADER_WHRLPOOL_H +# define HEADER_WHRLPOOL_H + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# define WHIRLPOOL_DIGEST_LENGTH (512/8) +# define WHIRLPOOL_BBLOCK 512 +# define WHIRLPOOL_COUNTER (256/8) + +typedef struct { + union { + unsigned char c[WHIRLPOOL_DIGEST_LENGTH]; + /* double q is here to ensure 64-bit alignment */ + double q[WHIRLPOOL_DIGEST_LENGTH / sizeof(double)]; + } H; + unsigned char data[WHIRLPOOL_BBLOCK / 8]; + unsigned int bitoff; + size_t bitlen[WHIRLPOOL_COUNTER / sizeof(size_t)]; +} WHIRLPOOL_CTX; + +# ifndef OPENSSL_NO_WHIRLPOOL +# ifdef OPENSSL_FIPS +int private_WHIRLPOOL_Init(WHIRLPOOL_CTX *c); +# endif +int WHIRLPOOL_Init(WHIRLPOOL_CTX *c); +int WHIRLPOOL_Update(WHIRLPOOL_CTX *c, const void *inp, size_t bytes); +void WHIRLPOOL_BitUpdate(WHIRLPOOL_CTX *c, const void *inp, size_t bits); +int WHIRLPOOL_Final(unsigned char *md, WHIRLPOOL_CTX *c); +unsigned char *WHIRLPOOL(const void *inp, size_t bytes, unsigned char *md); +# endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/x509.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/x509.h new file mode 100644 index 0000000..6fa28eb --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/x509.h @@ -0,0 +1,1330 @@ +/* crypto/x509/x509.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * ECDH support in OpenSSL originally developed by + * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project. + */ + +#ifndef HEADER_X509_H +# define HEADER_X509_H + +# include +# include +# ifndef OPENSSL_NO_BUFFER +# include +# endif +# ifndef OPENSSL_NO_EVP +# include +# endif +# ifndef OPENSSL_NO_BIO +# include +# endif +# include +# include +# include + +# ifndef OPENSSL_NO_EC +# include +# endif + +# ifndef OPENSSL_NO_ECDSA +# include +# endif + +# ifndef OPENSSL_NO_ECDH +# include +# endif + +# ifndef OPENSSL_NO_DEPRECATED +# ifndef OPENSSL_NO_RSA +# include +# endif +# ifndef OPENSSL_NO_DSA +# include +# endif +# ifndef OPENSSL_NO_DH +# include +# endif +# endif + +# ifndef OPENSSL_NO_SHA +# include +# endif +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# ifdef OPENSSL_SYS_WIN32 +/* Under Win32 these are defined in wincrypt.h */ +# undef X509_NAME +# undef X509_CERT_PAIR +# undef X509_EXTENSIONS +# endif + +# define X509_FILETYPE_PEM 1 +# define X509_FILETYPE_ASN1 2 +# define X509_FILETYPE_DEFAULT 3 + +# define X509v3_KU_DIGITAL_SIGNATURE 0x0080 +# define X509v3_KU_NON_REPUDIATION 0x0040 +# define X509v3_KU_KEY_ENCIPHERMENT 0x0020 +# define X509v3_KU_DATA_ENCIPHERMENT 0x0010 +# define X509v3_KU_KEY_AGREEMENT 0x0008 +# define X509v3_KU_KEY_CERT_SIGN 0x0004 +# define X509v3_KU_CRL_SIGN 0x0002 +# define X509v3_KU_ENCIPHER_ONLY 0x0001 +# define X509v3_KU_DECIPHER_ONLY 0x8000 +# define X509v3_KU_UNDEF 0xffff + +typedef struct X509_objects_st { + int nid; + int (*a2i) (void); + int (*i2a) (void); +} X509_OBJECTS; + +struct X509_algor_st { + ASN1_OBJECT *algorithm; + ASN1_TYPE *parameter; +} /* X509_ALGOR */ ; + +DECLARE_ASN1_SET_OF(X509_ALGOR) + +typedef STACK_OF(X509_ALGOR) X509_ALGORS; + +typedef struct X509_val_st { + ASN1_TIME *notBefore; + ASN1_TIME *notAfter; +} X509_VAL; + +struct X509_pubkey_st { + X509_ALGOR *algor; + ASN1_BIT_STRING *public_key; + EVP_PKEY *pkey; +}; + +typedef struct X509_sig_st { + X509_ALGOR *algor; + ASN1_OCTET_STRING *digest; +} X509_SIG; + +typedef struct X509_name_entry_st { + ASN1_OBJECT *object; + ASN1_STRING *value; + int set; + int size; /* temp variable */ +} X509_NAME_ENTRY; + +DECLARE_STACK_OF(X509_NAME_ENTRY) +DECLARE_ASN1_SET_OF(X509_NAME_ENTRY) + +/* we always keep X509_NAMEs in 2 forms. */ +struct X509_name_st { + STACK_OF(X509_NAME_ENTRY) *entries; + int modified; /* true if 'bytes' needs to be built */ +# ifndef OPENSSL_NO_BUFFER + BUF_MEM *bytes; +# else + char *bytes; +# endif +/* unsigned long hash; Keep the hash around for lookups */ + unsigned char *canon_enc; + int canon_enclen; +} /* X509_NAME */ ; + +DECLARE_STACK_OF(X509_NAME) + +# define X509_EX_V_NETSCAPE_HACK 0x8000 +# define X509_EX_V_INIT 0x0001 +typedef struct X509_extension_st { + ASN1_OBJECT *object; + ASN1_BOOLEAN critical; + ASN1_OCTET_STRING *value; +} X509_EXTENSION; + +typedef STACK_OF(X509_EXTENSION) X509_EXTENSIONS; + +DECLARE_STACK_OF(X509_EXTENSION) +DECLARE_ASN1_SET_OF(X509_EXTENSION) + +/* a sequence of these are used */ +typedef struct x509_attributes_st { + ASN1_OBJECT *object; + int single; /* 0 for a set, 1 for a single item (which is + * wrong) */ + union { + char *ptr; + /* + * 0 + */ STACK_OF(ASN1_TYPE) *set; + /* + * 1 + */ ASN1_TYPE *single; + } value; +} X509_ATTRIBUTE; + +DECLARE_STACK_OF(X509_ATTRIBUTE) +DECLARE_ASN1_SET_OF(X509_ATTRIBUTE) + +typedef struct X509_req_info_st { + ASN1_ENCODING enc; + ASN1_INTEGER *version; + X509_NAME *subject; + X509_PUBKEY *pubkey; + /* d=2 hl=2 l= 0 cons: cont: 00 */ + STACK_OF(X509_ATTRIBUTE) *attributes; /* [ 0 ] */ +} X509_REQ_INFO; + +typedef struct X509_req_st { + X509_REQ_INFO *req_info; + X509_ALGOR *sig_alg; + ASN1_BIT_STRING *signature; + int references; +} X509_REQ; + +typedef struct x509_cinf_st { + ASN1_INTEGER *version; /* [ 0 ] default of v1 */ + ASN1_INTEGER *serialNumber; + X509_ALGOR *signature; + X509_NAME *issuer; + X509_VAL *validity; + X509_NAME *subject; + X509_PUBKEY *key; + ASN1_BIT_STRING *issuerUID; /* [ 1 ] optional in v2 */ + ASN1_BIT_STRING *subjectUID; /* [ 2 ] optional in v2 */ + STACK_OF(X509_EXTENSION) *extensions; /* [ 3 ] optional in v3 */ + ASN1_ENCODING enc; +} X509_CINF; + +/* + * This stuff is certificate "auxiliary info" it contains details which are + * useful in certificate stores and databases. When used this is tagged onto + * the end of the certificate itself + */ + +typedef struct x509_cert_aux_st { + STACK_OF(ASN1_OBJECT) *trust; /* trusted uses */ + STACK_OF(ASN1_OBJECT) *reject; /* rejected uses */ + ASN1_UTF8STRING *alias; /* "friendly name" */ + ASN1_OCTET_STRING *keyid; /* key id of private key */ + STACK_OF(X509_ALGOR) *other; /* other unspecified info */ +} X509_CERT_AUX; + +struct x509_st { + X509_CINF *cert_info; + X509_ALGOR *sig_alg; + ASN1_BIT_STRING *signature; + int valid; + int references; + char *name; + CRYPTO_EX_DATA ex_data; + /* These contain copies of various extension values */ + long ex_pathlen; + long ex_pcpathlen; + unsigned long ex_flags; + unsigned long ex_kusage; + unsigned long ex_xkusage; + unsigned long ex_nscert; + ASN1_OCTET_STRING *skid; + AUTHORITY_KEYID *akid; + X509_POLICY_CACHE *policy_cache; + STACK_OF(DIST_POINT) *crldp; + STACK_OF(GENERAL_NAME) *altname; + NAME_CONSTRAINTS *nc; +# ifndef OPENSSL_NO_RFC3779 + STACK_OF(IPAddressFamily) *rfc3779_addr; + struct ASIdentifiers_st *rfc3779_asid; +# endif +# ifndef OPENSSL_NO_SHA + unsigned char sha1_hash[SHA_DIGEST_LENGTH]; +# endif + X509_CERT_AUX *aux; +} /* X509 */ ; + +DECLARE_STACK_OF(X509) +DECLARE_ASN1_SET_OF(X509) + +/* This is used for a table of trust checking functions */ + +typedef struct x509_trust_st { + int trust; + int flags; + int (*check_trust) (struct x509_trust_st *, X509 *, int); + char *name; + int arg1; + void *arg2; +} X509_TRUST; + +DECLARE_STACK_OF(X509_TRUST) + +typedef struct x509_cert_pair_st { + X509 *forward; + X509 *reverse; +} X509_CERT_PAIR; + +/* standard trust ids */ + +# define X509_TRUST_DEFAULT -1/* Only valid in purpose settings */ + +# define X509_TRUST_COMPAT 1 +# define X509_TRUST_SSL_CLIENT 2 +# define X509_TRUST_SSL_SERVER 3 +# define X509_TRUST_EMAIL 4 +# define X509_TRUST_OBJECT_SIGN 5 +# define X509_TRUST_OCSP_SIGN 6 +# define X509_TRUST_OCSP_REQUEST 7 +# define X509_TRUST_TSA 8 + +/* Keep these up to date! */ +# define X509_TRUST_MIN 1 +# define X509_TRUST_MAX 8 + +/* trust_flags values */ +# define X509_TRUST_DYNAMIC 1 +# define X509_TRUST_DYNAMIC_NAME 2 + +/* check_trust return codes */ + +# define X509_TRUST_TRUSTED 1 +# define X509_TRUST_REJECTED 2 +# define X509_TRUST_UNTRUSTED 3 + +/* Flags for X509_print_ex() */ + +# define X509_FLAG_COMPAT 0 +# define X509_FLAG_NO_HEADER 1L +# define X509_FLAG_NO_VERSION (1L << 1) +# define X509_FLAG_NO_SERIAL (1L << 2) +# define X509_FLAG_NO_SIGNAME (1L << 3) +# define X509_FLAG_NO_ISSUER (1L << 4) +# define X509_FLAG_NO_VALIDITY (1L << 5) +# define X509_FLAG_NO_SUBJECT (1L << 6) +# define X509_FLAG_NO_PUBKEY (1L << 7) +# define X509_FLAG_NO_EXTENSIONS (1L << 8) +# define X509_FLAG_NO_SIGDUMP (1L << 9) +# define X509_FLAG_NO_AUX (1L << 10) +# define X509_FLAG_NO_ATTRIBUTES (1L << 11) +# define X509_FLAG_NO_IDS (1L << 12) + +/* Flags specific to X509_NAME_print_ex() */ + +/* The field separator information */ + +# define XN_FLAG_SEP_MASK (0xf << 16) + +# define XN_FLAG_COMPAT 0/* Traditional SSLeay: use old + * X509_NAME_print */ +# define XN_FLAG_SEP_COMMA_PLUS (1 << 16)/* RFC2253 ,+ */ +# define XN_FLAG_SEP_CPLUS_SPC (2 << 16)/* ,+ spaced: more readable */ +# define XN_FLAG_SEP_SPLUS_SPC (3 << 16)/* ;+ spaced */ +# define XN_FLAG_SEP_MULTILINE (4 << 16)/* One line per field */ + +# define XN_FLAG_DN_REV (1 << 20)/* Reverse DN order */ + +/* How the field name is shown */ + +# define XN_FLAG_FN_MASK (0x3 << 21) + +# define XN_FLAG_FN_SN 0/* Object short name */ +# define XN_FLAG_FN_LN (1 << 21)/* Object long name */ +# define XN_FLAG_FN_OID (2 << 21)/* Always use OIDs */ +# define XN_FLAG_FN_NONE (3 << 21)/* No field names */ + +# define XN_FLAG_SPC_EQ (1 << 23)/* Put spaces round '=' */ + +/* + * This determines if we dump fields we don't recognise: RFC2253 requires + * this. + */ + +# define XN_FLAG_DUMP_UNKNOWN_FIELDS (1 << 24) + +# define XN_FLAG_FN_ALIGN (1 << 25)/* Align field names to 20 + * characters */ + +/* Complete set of RFC2253 flags */ + +# define XN_FLAG_RFC2253 (ASN1_STRFLGS_RFC2253 | \ + XN_FLAG_SEP_COMMA_PLUS | \ + XN_FLAG_DN_REV | \ + XN_FLAG_FN_SN | \ + XN_FLAG_DUMP_UNKNOWN_FIELDS) + +/* readable oneline form */ + +# define XN_FLAG_ONELINE (ASN1_STRFLGS_RFC2253 | \ + ASN1_STRFLGS_ESC_QUOTE | \ + XN_FLAG_SEP_CPLUS_SPC | \ + XN_FLAG_SPC_EQ | \ + XN_FLAG_FN_SN) + +/* readable multiline form */ + +# define XN_FLAG_MULTILINE (ASN1_STRFLGS_ESC_CTRL | \ + ASN1_STRFLGS_ESC_MSB | \ + XN_FLAG_SEP_MULTILINE | \ + XN_FLAG_SPC_EQ | \ + XN_FLAG_FN_LN | \ + XN_FLAG_FN_ALIGN) + +struct x509_revoked_st { + ASN1_INTEGER *serialNumber; + ASN1_TIME *revocationDate; + STACK_OF(X509_EXTENSION) /* optional */ *extensions; + /* Set up if indirect CRL */ + STACK_OF(GENERAL_NAME) *issuer; + /* Revocation reason */ + int reason; + int sequence; /* load sequence */ +}; + +DECLARE_STACK_OF(X509_REVOKED) +DECLARE_ASN1_SET_OF(X509_REVOKED) + +typedef struct X509_crl_info_st { + ASN1_INTEGER *version; + X509_ALGOR *sig_alg; + X509_NAME *issuer; + ASN1_TIME *lastUpdate; + ASN1_TIME *nextUpdate; + STACK_OF(X509_REVOKED) *revoked; + STACK_OF(X509_EXTENSION) /* [0] */ *extensions; + ASN1_ENCODING enc; +} X509_CRL_INFO; + +struct X509_crl_st { + /* actual signature */ + X509_CRL_INFO *crl; + X509_ALGOR *sig_alg; + ASN1_BIT_STRING *signature; + int references; + int flags; + /* Copies of various extensions */ + AUTHORITY_KEYID *akid; + ISSUING_DIST_POINT *idp; + /* Convenient breakdown of IDP */ + int idp_flags; + int idp_reasons; + /* CRL and base CRL numbers for delta processing */ + ASN1_INTEGER *crl_number; + ASN1_INTEGER *base_crl_number; +# ifndef OPENSSL_NO_SHA + unsigned char sha1_hash[SHA_DIGEST_LENGTH]; +# endif + STACK_OF(GENERAL_NAMES) *issuers; + const X509_CRL_METHOD *meth; + void *meth_data; +} /* X509_CRL */ ; + +DECLARE_STACK_OF(X509_CRL) +DECLARE_ASN1_SET_OF(X509_CRL) + +typedef struct private_key_st { + int version; + /* The PKCS#8 data types */ + X509_ALGOR *enc_algor; + ASN1_OCTET_STRING *enc_pkey; /* encrypted pub key */ + /* When decrypted, the following will not be NULL */ + EVP_PKEY *dec_pkey; + /* used to encrypt and decrypt */ + int key_length; + char *key_data; + int key_free; /* true if we should auto free key_data */ + /* expanded version of 'enc_algor' */ + EVP_CIPHER_INFO cipher; + int references; +} X509_PKEY; + +# ifndef OPENSSL_NO_EVP +typedef struct X509_info_st { + X509 *x509; + X509_CRL *crl; + X509_PKEY *x_pkey; + EVP_CIPHER_INFO enc_cipher; + int enc_len; + char *enc_data; + int references; +} X509_INFO; + +DECLARE_STACK_OF(X509_INFO) +# endif + +/* + * The next 2 structures and their 8 routines were sent to me by Pat Richard + * and are used to manipulate Netscapes spki structures - + * useful if you are writing a CA web page + */ +typedef struct Netscape_spkac_st { + X509_PUBKEY *pubkey; + ASN1_IA5STRING *challenge; /* challenge sent in atlas >= PR2 */ +} NETSCAPE_SPKAC; + +typedef struct Netscape_spki_st { + NETSCAPE_SPKAC *spkac; /* signed public key and challenge */ + X509_ALGOR *sig_algor; + ASN1_BIT_STRING *signature; +} NETSCAPE_SPKI; + +/* Netscape certificate sequence structure */ +typedef struct Netscape_certificate_sequence { + ASN1_OBJECT *type; + STACK_OF(X509) *certs; +} NETSCAPE_CERT_SEQUENCE; + +/*- Unused (and iv length is wrong) +typedef struct CBCParameter_st + { + unsigned char iv[8]; + } CBC_PARAM; +*/ + +/* Password based encryption structure */ + +typedef struct PBEPARAM_st { + ASN1_OCTET_STRING *salt; + ASN1_INTEGER *iter; +} PBEPARAM; + +/* Password based encryption V2 structures */ + +typedef struct PBE2PARAM_st { + X509_ALGOR *keyfunc; + X509_ALGOR *encryption; +} PBE2PARAM; + +typedef struct PBKDF2PARAM_st { +/* Usually OCTET STRING but could be anything */ + ASN1_TYPE *salt; + ASN1_INTEGER *iter; + ASN1_INTEGER *keylength; + X509_ALGOR *prf; +} PBKDF2PARAM; + +/* PKCS#8 private key info structure */ + +struct pkcs8_priv_key_info_st { + /* Flag for various broken formats */ + int broken; +# define PKCS8_OK 0 +# define PKCS8_NO_OCTET 1 +# define PKCS8_EMBEDDED_PARAM 2 +# define PKCS8_NS_DB 3 +# define PKCS8_NEG_PRIVKEY 4 + ASN1_INTEGER *version; + X509_ALGOR *pkeyalg; + /* Should be OCTET STRING but some are broken */ + ASN1_TYPE *pkey; + STACK_OF(X509_ATTRIBUTE) *attributes; +}; + +#ifdef __cplusplus +} +#endif + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# define X509_EXT_PACK_UNKNOWN 1 +# define X509_EXT_PACK_STRING 2 + +# define X509_get_version(x) ASN1_INTEGER_get((x)->cert_info->version) +/* #define X509_get_serialNumber(x) ((x)->cert_info->serialNumber) */ +# define X509_get_notBefore(x) ((x)->cert_info->validity->notBefore) +# define X509_get_notAfter(x) ((x)->cert_info->validity->notAfter) +# define X509_extract_key(x) X509_get_pubkey(x)/*****/ +# define X509_REQ_get_version(x) ASN1_INTEGER_get((x)->req_info->version) +# define X509_REQ_get_subject_name(x) ((x)->req_info->subject) +# define X509_REQ_extract_key(a) X509_REQ_get_pubkey(a) +# define X509_name_cmp(a,b) X509_NAME_cmp((a),(b)) +# define X509_get_signature_type(x) EVP_PKEY_type(OBJ_obj2nid((x)->sig_alg->algorithm)) + +# define X509_CRL_get_version(x) ASN1_INTEGER_get((x)->crl->version) +# define X509_CRL_get_lastUpdate(x) ((x)->crl->lastUpdate) +# define X509_CRL_get_nextUpdate(x) ((x)->crl->nextUpdate) +# define X509_CRL_get_issuer(x) ((x)->crl->issuer) +# define X509_CRL_get_REVOKED(x) ((x)->crl->revoked) + +void X509_CRL_set_default_method(const X509_CRL_METHOD *meth); +X509_CRL_METHOD *X509_CRL_METHOD_new(int (*crl_init) (X509_CRL *crl), + int (*crl_free) (X509_CRL *crl), + int (*crl_lookup) (X509_CRL *crl, + X509_REVOKED **ret, + ASN1_INTEGER *ser, + X509_NAME *issuer), + int (*crl_verify) (X509_CRL *crl, + EVP_PKEY *pk)); +void X509_CRL_METHOD_free(X509_CRL_METHOD *m); + +void X509_CRL_set_meth_data(X509_CRL *crl, void *dat); +void *X509_CRL_get_meth_data(X509_CRL *crl); + +/* + * This one is only used so that a binary form can output, as in + * i2d_X509_NAME(X509_get_X509_PUBKEY(x),&buf) + */ +# define X509_get_X509_PUBKEY(x) ((x)->cert_info->key) + +const char *X509_verify_cert_error_string(long n); + +# ifndef OPENSSL_NO_EVP +int X509_verify(X509 *a, EVP_PKEY *r); + +int X509_REQ_verify(X509_REQ *a, EVP_PKEY *r); +int X509_CRL_verify(X509_CRL *a, EVP_PKEY *r); +int NETSCAPE_SPKI_verify(NETSCAPE_SPKI *a, EVP_PKEY *r); + +NETSCAPE_SPKI *NETSCAPE_SPKI_b64_decode(const char *str, int len); +char *NETSCAPE_SPKI_b64_encode(NETSCAPE_SPKI *x); +EVP_PKEY *NETSCAPE_SPKI_get_pubkey(NETSCAPE_SPKI *x); +int NETSCAPE_SPKI_set_pubkey(NETSCAPE_SPKI *x, EVP_PKEY *pkey); + +int NETSCAPE_SPKI_print(BIO *out, NETSCAPE_SPKI *spki); + +int X509_signature_dump(BIO *bp, const ASN1_STRING *sig, int indent); +int X509_signature_print(BIO *bp, X509_ALGOR *alg, ASN1_STRING *sig); + +int X509_sign(X509 *x, EVP_PKEY *pkey, const EVP_MD *md); +int X509_sign_ctx(X509 *x, EVP_MD_CTX *ctx); +int X509_http_nbio(OCSP_REQ_CTX *rctx, X509 **pcert); +int X509_REQ_sign(X509_REQ *x, EVP_PKEY *pkey, const EVP_MD *md); +int X509_REQ_sign_ctx(X509_REQ *x, EVP_MD_CTX *ctx); +int X509_CRL_sign(X509_CRL *x, EVP_PKEY *pkey, const EVP_MD *md); +int X509_CRL_sign_ctx(X509_CRL *x, EVP_MD_CTX *ctx); +int X509_CRL_http_nbio(OCSP_REQ_CTX *rctx, X509_CRL **pcrl); +int NETSCAPE_SPKI_sign(NETSCAPE_SPKI *x, EVP_PKEY *pkey, const EVP_MD *md); + +int X509_pubkey_digest(const X509 *data, const EVP_MD *type, + unsigned char *md, unsigned int *len); +int X509_digest(const X509 *data, const EVP_MD *type, + unsigned char *md, unsigned int *len); +int X509_CRL_digest(const X509_CRL *data, const EVP_MD *type, + unsigned char *md, unsigned int *len); +int X509_REQ_digest(const X509_REQ *data, const EVP_MD *type, + unsigned char *md, unsigned int *len); +int X509_NAME_digest(const X509_NAME *data, const EVP_MD *type, + unsigned char *md, unsigned int *len); +# endif + +# ifndef OPENSSL_NO_FP_API +X509 *d2i_X509_fp(FILE *fp, X509 **x509); +int i2d_X509_fp(FILE *fp, X509 *x509); +X509_CRL *d2i_X509_CRL_fp(FILE *fp, X509_CRL **crl); +int i2d_X509_CRL_fp(FILE *fp, X509_CRL *crl); +X509_REQ *d2i_X509_REQ_fp(FILE *fp, X509_REQ **req); +int i2d_X509_REQ_fp(FILE *fp, X509_REQ *req); +# ifndef OPENSSL_NO_RSA +RSA *d2i_RSAPrivateKey_fp(FILE *fp, RSA **rsa); +int i2d_RSAPrivateKey_fp(FILE *fp, RSA *rsa); +RSA *d2i_RSAPublicKey_fp(FILE *fp, RSA **rsa); +int i2d_RSAPublicKey_fp(FILE *fp, RSA *rsa); +RSA *d2i_RSA_PUBKEY_fp(FILE *fp, RSA **rsa); +int i2d_RSA_PUBKEY_fp(FILE *fp, RSA *rsa); +# endif +# ifndef OPENSSL_NO_DSA +DSA *d2i_DSA_PUBKEY_fp(FILE *fp, DSA **dsa); +int i2d_DSA_PUBKEY_fp(FILE *fp, DSA *dsa); +DSA *d2i_DSAPrivateKey_fp(FILE *fp, DSA **dsa); +int i2d_DSAPrivateKey_fp(FILE *fp, DSA *dsa); +# endif +# ifndef OPENSSL_NO_EC +EC_KEY *d2i_EC_PUBKEY_fp(FILE *fp, EC_KEY **eckey); +int i2d_EC_PUBKEY_fp(FILE *fp, EC_KEY *eckey); +EC_KEY *d2i_ECPrivateKey_fp(FILE *fp, EC_KEY **eckey); +int i2d_ECPrivateKey_fp(FILE *fp, EC_KEY *eckey); +# endif +X509_SIG *d2i_PKCS8_fp(FILE *fp, X509_SIG **p8); +int i2d_PKCS8_fp(FILE *fp, X509_SIG *p8); +PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_fp(FILE *fp, + PKCS8_PRIV_KEY_INFO **p8inf); +int i2d_PKCS8_PRIV_KEY_INFO_fp(FILE *fp, PKCS8_PRIV_KEY_INFO *p8inf); +int i2d_PKCS8PrivateKeyInfo_fp(FILE *fp, EVP_PKEY *key); +int i2d_PrivateKey_fp(FILE *fp, EVP_PKEY *pkey); +EVP_PKEY *d2i_PrivateKey_fp(FILE *fp, EVP_PKEY **a); +int i2d_PUBKEY_fp(FILE *fp, EVP_PKEY *pkey); +EVP_PKEY *d2i_PUBKEY_fp(FILE *fp, EVP_PKEY **a); +# endif + +# ifndef OPENSSL_NO_BIO +X509 *d2i_X509_bio(BIO *bp, X509 **x509); +int i2d_X509_bio(BIO *bp, X509 *x509); +X509_CRL *d2i_X509_CRL_bio(BIO *bp, X509_CRL **crl); +int i2d_X509_CRL_bio(BIO *bp, X509_CRL *crl); +X509_REQ *d2i_X509_REQ_bio(BIO *bp, X509_REQ **req); +int i2d_X509_REQ_bio(BIO *bp, X509_REQ *req); +# ifndef OPENSSL_NO_RSA +RSA *d2i_RSAPrivateKey_bio(BIO *bp, RSA **rsa); +int i2d_RSAPrivateKey_bio(BIO *bp, RSA *rsa); +RSA *d2i_RSAPublicKey_bio(BIO *bp, RSA **rsa); +int i2d_RSAPublicKey_bio(BIO *bp, RSA *rsa); +RSA *d2i_RSA_PUBKEY_bio(BIO *bp, RSA **rsa); +int i2d_RSA_PUBKEY_bio(BIO *bp, RSA *rsa); +# endif +# ifndef OPENSSL_NO_DSA +DSA *d2i_DSA_PUBKEY_bio(BIO *bp, DSA **dsa); +int i2d_DSA_PUBKEY_bio(BIO *bp, DSA *dsa); +DSA *d2i_DSAPrivateKey_bio(BIO *bp, DSA **dsa); +int i2d_DSAPrivateKey_bio(BIO *bp, DSA *dsa); +# endif +# ifndef OPENSSL_NO_EC +EC_KEY *d2i_EC_PUBKEY_bio(BIO *bp, EC_KEY **eckey); +int i2d_EC_PUBKEY_bio(BIO *bp, EC_KEY *eckey); +EC_KEY *d2i_ECPrivateKey_bio(BIO *bp, EC_KEY **eckey); +int i2d_ECPrivateKey_bio(BIO *bp, EC_KEY *eckey); +# endif +X509_SIG *d2i_PKCS8_bio(BIO *bp, X509_SIG **p8); +int i2d_PKCS8_bio(BIO *bp, X509_SIG *p8); +PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_bio(BIO *bp, + PKCS8_PRIV_KEY_INFO **p8inf); +int i2d_PKCS8_PRIV_KEY_INFO_bio(BIO *bp, PKCS8_PRIV_KEY_INFO *p8inf); +int i2d_PKCS8PrivateKeyInfo_bio(BIO *bp, EVP_PKEY *key); +int i2d_PrivateKey_bio(BIO *bp, EVP_PKEY *pkey); +EVP_PKEY *d2i_PrivateKey_bio(BIO *bp, EVP_PKEY **a); +int i2d_PUBKEY_bio(BIO *bp, EVP_PKEY *pkey); +EVP_PKEY *d2i_PUBKEY_bio(BIO *bp, EVP_PKEY **a); +# endif + +X509 *X509_dup(X509 *x509); +X509_ATTRIBUTE *X509_ATTRIBUTE_dup(X509_ATTRIBUTE *xa); +X509_EXTENSION *X509_EXTENSION_dup(X509_EXTENSION *ex); +X509_CRL *X509_CRL_dup(X509_CRL *crl); +X509_REVOKED *X509_REVOKED_dup(X509_REVOKED *rev); +X509_REQ *X509_REQ_dup(X509_REQ *req); +X509_ALGOR *X509_ALGOR_dup(X509_ALGOR *xn); +int X509_ALGOR_set0(X509_ALGOR *alg, ASN1_OBJECT *aobj, int ptype, + void *pval); +void X509_ALGOR_get0(ASN1_OBJECT **paobj, int *pptype, void **ppval, + X509_ALGOR *algor); +void X509_ALGOR_set_md(X509_ALGOR *alg, const EVP_MD *md); +int X509_ALGOR_cmp(const X509_ALGOR *a, const X509_ALGOR *b); + +X509_NAME *X509_NAME_dup(X509_NAME *xn); +X509_NAME_ENTRY *X509_NAME_ENTRY_dup(X509_NAME_ENTRY *ne); + +int X509_cmp_time(const ASN1_TIME *s, time_t *t); +int X509_cmp_current_time(const ASN1_TIME *s); +ASN1_TIME *X509_time_adj(ASN1_TIME *s, long adj, time_t *t); +ASN1_TIME *X509_time_adj_ex(ASN1_TIME *s, + int offset_day, long offset_sec, time_t *t); +ASN1_TIME *X509_gmtime_adj(ASN1_TIME *s, long adj); + +const char *X509_get_default_cert_area(void); +const char *X509_get_default_cert_dir(void); +const char *X509_get_default_cert_file(void); +const char *X509_get_default_cert_dir_env(void); +const char *X509_get_default_cert_file_env(void); +const char *X509_get_default_private_dir(void); + +X509_REQ *X509_to_X509_REQ(X509 *x, EVP_PKEY *pkey, const EVP_MD *md); +X509 *X509_REQ_to_X509(X509_REQ *r, int days, EVP_PKEY *pkey); + +DECLARE_ASN1_FUNCTIONS(X509_ALGOR) +DECLARE_ASN1_ENCODE_FUNCTIONS(X509_ALGORS, X509_ALGORS, X509_ALGORS) +DECLARE_ASN1_FUNCTIONS(X509_VAL) + +DECLARE_ASN1_FUNCTIONS(X509_PUBKEY) + +int X509_PUBKEY_set(X509_PUBKEY **x, EVP_PKEY *pkey); +EVP_PKEY *X509_PUBKEY_get(X509_PUBKEY *key); +int X509_get_pubkey_parameters(EVP_PKEY *pkey, STACK_OF(X509) *chain); +int i2d_PUBKEY(EVP_PKEY *a, unsigned char **pp); +EVP_PKEY *d2i_PUBKEY(EVP_PKEY **a, const unsigned char **pp, long length); +# ifndef OPENSSL_NO_RSA +int i2d_RSA_PUBKEY(RSA *a, unsigned char **pp); +RSA *d2i_RSA_PUBKEY(RSA **a, const unsigned char **pp, long length); +# endif +# ifndef OPENSSL_NO_DSA +int i2d_DSA_PUBKEY(DSA *a, unsigned char **pp); +DSA *d2i_DSA_PUBKEY(DSA **a, const unsigned char **pp, long length); +# endif +# ifndef OPENSSL_NO_EC +int i2d_EC_PUBKEY(EC_KEY *a, unsigned char **pp); +EC_KEY *d2i_EC_PUBKEY(EC_KEY **a, const unsigned char **pp, long length); +# endif + +DECLARE_ASN1_FUNCTIONS(X509_SIG) +DECLARE_ASN1_FUNCTIONS(X509_REQ_INFO) +DECLARE_ASN1_FUNCTIONS(X509_REQ) + +DECLARE_ASN1_FUNCTIONS(X509_ATTRIBUTE) +X509_ATTRIBUTE *X509_ATTRIBUTE_create(int nid, int atrtype, void *value); + +DECLARE_ASN1_FUNCTIONS(X509_EXTENSION) +DECLARE_ASN1_ENCODE_FUNCTIONS(X509_EXTENSIONS, X509_EXTENSIONS, X509_EXTENSIONS) + +DECLARE_ASN1_FUNCTIONS(X509_NAME_ENTRY) + +DECLARE_ASN1_FUNCTIONS(X509_NAME) + +int X509_NAME_set(X509_NAME **xn, X509_NAME *name); + +DECLARE_ASN1_FUNCTIONS(X509_CINF) + +DECLARE_ASN1_FUNCTIONS(X509) +DECLARE_ASN1_FUNCTIONS(X509_CERT_AUX) + +DECLARE_ASN1_FUNCTIONS(X509_CERT_PAIR) + +int X509_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); +int X509_set_ex_data(X509 *r, int idx, void *arg); +void *X509_get_ex_data(X509 *r, int idx); +int i2d_X509_AUX(X509 *a, unsigned char **pp); +X509 *d2i_X509_AUX(X509 **a, const unsigned char **pp, long length); + +int i2d_re_X509_tbs(X509 *x, unsigned char **pp); + +void X509_get0_signature(ASN1_BIT_STRING **psig, X509_ALGOR **palg, + const X509 *x); +int X509_get_signature_nid(const X509 *x); + +int X509_alias_set1(X509 *x, unsigned char *name, int len); +int X509_keyid_set1(X509 *x, unsigned char *id, int len); +unsigned char *X509_alias_get0(X509 *x, int *len); +unsigned char *X509_keyid_get0(X509 *x, int *len); +int (*X509_TRUST_set_default(int (*trust) (int, X509 *, int))) (int, X509 *, + int); +int X509_TRUST_set(int *t, int trust); +int X509_add1_trust_object(X509 *x, ASN1_OBJECT *obj); +int X509_add1_reject_object(X509 *x, ASN1_OBJECT *obj); +void X509_trust_clear(X509 *x); +void X509_reject_clear(X509 *x); + +DECLARE_ASN1_FUNCTIONS(X509_REVOKED) +DECLARE_ASN1_FUNCTIONS(X509_CRL_INFO) +DECLARE_ASN1_FUNCTIONS(X509_CRL) + +int X509_CRL_add0_revoked(X509_CRL *crl, X509_REVOKED *rev); +int X509_CRL_get0_by_serial(X509_CRL *crl, + X509_REVOKED **ret, ASN1_INTEGER *serial); +int X509_CRL_get0_by_cert(X509_CRL *crl, X509_REVOKED **ret, X509 *x); + +X509_PKEY *X509_PKEY_new(void); +void X509_PKEY_free(X509_PKEY *a); +int i2d_X509_PKEY(X509_PKEY *a, unsigned char **pp); +X509_PKEY *d2i_X509_PKEY(X509_PKEY **a, const unsigned char **pp, + long length); + +DECLARE_ASN1_FUNCTIONS(NETSCAPE_SPKI) +DECLARE_ASN1_FUNCTIONS(NETSCAPE_SPKAC) +DECLARE_ASN1_FUNCTIONS(NETSCAPE_CERT_SEQUENCE) + +# ifndef OPENSSL_NO_EVP +X509_INFO *X509_INFO_new(void); +void X509_INFO_free(X509_INFO *a); +char *X509_NAME_oneline(X509_NAME *a, char *buf, int size); + +int ASN1_verify(i2d_of_void *i2d, X509_ALGOR *algor1, + ASN1_BIT_STRING *signature, char *data, EVP_PKEY *pkey); + +int ASN1_digest(i2d_of_void *i2d, const EVP_MD *type, char *data, + unsigned char *md, unsigned int *len); + +int ASN1_sign(i2d_of_void *i2d, X509_ALGOR *algor1, + X509_ALGOR *algor2, ASN1_BIT_STRING *signature, + char *data, EVP_PKEY *pkey, const EVP_MD *type); + +int ASN1_item_digest(const ASN1_ITEM *it, const EVP_MD *type, void *data, + unsigned char *md, unsigned int *len); + +int ASN1_item_verify(const ASN1_ITEM *it, X509_ALGOR *algor1, + ASN1_BIT_STRING *signature, void *data, EVP_PKEY *pkey); + +int ASN1_item_sign(const ASN1_ITEM *it, X509_ALGOR *algor1, + X509_ALGOR *algor2, ASN1_BIT_STRING *signature, void *data, + EVP_PKEY *pkey, const EVP_MD *type); +int ASN1_item_sign_ctx(const ASN1_ITEM *it, X509_ALGOR *algor1, + X509_ALGOR *algor2, ASN1_BIT_STRING *signature, + void *asn, EVP_MD_CTX *ctx); +# endif + +int X509_set_version(X509 *x, long version); +int X509_set_serialNumber(X509 *x, ASN1_INTEGER *serial); +ASN1_INTEGER *X509_get_serialNumber(X509 *x); +int X509_set_issuer_name(X509 *x, X509_NAME *name); +X509_NAME *X509_get_issuer_name(X509 *a); +int X509_set_subject_name(X509 *x, X509_NAME *name); +X509_NAME *X509_get_subject_name(X509 *a); +int X509_set_notBefore(X509 *x, const ASN1_TIME *tm); +int X509_set_notAfter(X509 *x, const ASN1_TIME *tm); +int X509_set_pubkey(X509 *x, EVP_PKEY *pkey); +EVP_PKEY *X509_get_pubkey(X509 *x); +ASN1_BIT_STRING *X509_get0_pubkey_bitstr(const X509 *x); +int X509_certificate_type(X509 *x, EVP_PKEY *pubkey /* optional */ ); + +int X509_REQ_set_version(X509_REQ *x, long version); +int X509_REQ_set_subject_name(X509_REQ *req, X509_NAME *name); +int X509_REQ_set_pubkey(X509_REQ *x, EVP_PKEY *pkey); +EVP_PKEY *X509_REQ_get_pubkey(X509_REQ *req); +int X509_REQ_extension_nid(int nid); +int *X509_REQ_get_extension_nids(void); +void X509_REQ_set_extension_nids(int *nids); +STACK_OF(X509_EXTENSION) *X509_REQ_get_extensions(X509_REQ *req); +int X509_REQ_add_extensions_nid(X509_REQ *req, STACK_OF(X509_EXTENSION) *exts, + int nid); +int X509_REQ_add_extensions(X509_REQ *req, STACK_OF(X509_EXTENSION) *exts); +int X509_REQ_get_attr_count(const X509_REQ *req); +int X509_REQ_get_attr_by_NID(const X509_REQ *req, int nid, int lastpos); +int X509_REQ_get_attr_by_OBJ(const X509_REQ *req, ASN1_OBJECT *obj, + int lastpos); +X509_ATTRIBUTE *X509_REQ_get_attr(const X509_REQ *req, int loc); +X509_ATTRIBUTE *X509_REQ_delete_attr(X509_REQ *req, int loc); +int X509_REQ_add1_attr(X509_REQ *req, X509_ATTRIBUTE *attr); +int X509_REQ_add1_attr_by_OBJ(X509_REQ *req, + const ASN1_OBJECT *obj, int type, + const unsigned char *bytes, int len); +int X509_REQ_add1_attr_by_NID(X509_REQ *req, + int nid, int type, + const unsigned char *bytes, int len); +int X509_REQ_add1_attr_by_txt(X509_REQ *req, + const char *attrname, int type, + const unsigned char *bytes, int len); + +int X509_CRL_set_version(X509_CRL *x, long version); +int X509_CRL_set_issuer_name(X509_CRL *x, X509_NAME *name); +int X509_CRL_set_lastUpdate(X509_CRL *x, const ASN1_TIME *tm); +int X509_CRL_set_nextUpdate(X509_CRL *x, const ASN1_TIME *tm); +int X509_CRL_sort(X509_CRL *crl); + +int X509_REVOKED_set_serialNumber(X509_REVOKED *x, ASN1_INTEGER *serial); +int X509_REVOKED_set_revocationDate(X509_REVOKED *r, ASN1_TIME *tm); + +X509_CRL *X509_CRL_diff(X509_CRL *base, X509_CRL *newer, + EVP_PKEY *skey, const EVP_MD *md, unsigned int flags); + +int X509_REQ_check_private_key(X509_REQ *x509, EVP_PKEY *pkey); + +int X509_check_private_key(X509 *x509, EVP_PKEY *pkey); +int X509_chain_check_suiteb(int *perror_depth, + X509 *x, STACK_OF(X509) *chain, + unsigned long flags); +int X509_CRL_check_suiteb(X509_CRL *crl, EVP_PKEY *pk, unsigned long flags); +STACK_OF(X509) *X509_chain_up_ref(STACK_OF(X509) *chain); + +int X509_issuer_and_serial_cmp(const X509 *a, const X509 *b); +unsigned long X509_issuer_and_serial_hash(X509 *a); + +int X509_issuer_name_cmp(const X509 *a, const X509 *b); +unsigned long X509_issuer_name_hash(X509 *a); + +int X509_subject_name_cmp(const X509 *a, const X509 *b); +unsigned long X509_subject_name_hash(X509 *x); + +# ifndef OPENSSL_NO_MD5 +unsigned long X509_issuer_name_hash_old(X509 *a); +unsigned long X509_subject_name_hash_old(X509 *x); +# endif + +int X509_cmp(const X509 *a, const X509 *b); +int X509_NAME_cmp(const X509_NAME *a, const X509_NAME *b); +unsigned long X509_NAME_hash(X509_NAME *x); +unsigned long X509_NAME_hash_old(X509_NAME *x); + +int X509_CRL_cmp(const X509_CRL *a, const X509_CRL *b); +int X509_CRL_match(const X509_CRL *a, const X509_CRL *b); +# ifndef OPENSSL_NO_FP_API +int X509_print_ex_fp(FILE *bp, X509 *x, unsigned long nmflag, + unsigned long cflag); +int X509_print_fp(FILE *bp, X509 *x); +int X509_CRL_print_fp(FILE *bp, X509_CRL *x); +int X509_REQ_print_fp(FILE *bp, X509_REQ *req); +int X509_NAME_print_ex_fp(FILE *fp, X509_NAME *nm, int indent, + unsigned long flags); +# endif + +# ifndef OPENSSL_NO_BIO +int X509_NAME_print(BIO *bp, X509_NAME *name, int obase); +int X509_NAME_print_ex(BIO *out, X509_NAME *nm, int indent, + unsigned long flags); +int X509_print_ex(BIO *bp, X509 *x, unsigned long nmflag, + unsigned long cflag); +int X509_print(BIO *bp, X509 *x); +int X509_ocspid_print(BIO *bp, X509 *x); +int X509_CERT_AUX_print(BIO *bp, X509_CERT_AUX *x, int indent); +int X509_CRL_print(BIO *bp, X509_CRL *x); +int X509_REQ_print_ex(BIO *bp, X509_REQ *x, unsigned long nmflag, + unsigned long cflag); +int X509_REQ_print(BIO *bp, X509_REQ *req); +# endif + +int X509_NAME_entry_count(X509_NAME *name); +int X509_NAME_get_text_by_NID(X509_NAME *name, int nid, char *buf, int len); +int X509_NAME_get_text_by_OBJ(X509_NAME *name, ASN1_OBJECT *obj, + char *buf, int len); + +/* + * NOTE: you should be passsing -1, not 0 as lastpos. The functions that use + * lastpos, search after that position on. + */ +int X509_NAME_get_index_by_NID(X509_NAME *name, int nid, int lastpos); +int X509_NAME_get_index_by_OBJ(X509_NAME *name, ASN1_OBJECT *obj, + int lastpos); +X509_NAME_ENTRY *X509_NAME_get_entry(X509_NAME *name, int loc); +X509_NAME_ENTRY *X509_NAME_delete_entry(X509_NAME *name, int loc); +int X509_NAME_add_entry(X509_NAME *name, X509_NAME_ENTRY *ne, + int loc, int set); +int X509_NAME_add_entry_by_OBJ(X509_NAME *name, ASN1_OBJECT *obj, int type, + unsigned char *bytes, int len, int loc, + int set); +int X509_NAME_add_entry_by_NID(X509_NAME *name, int nid, int type, + unsigned char *bytes, int len, int loc, + int set); +X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_txt(X509_NAME_ENTRY **ne, + const char *field, int type, + const unsigned char *bytes, + int len); +X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_NID(X509_NAME_ENTRY **ne, int nid, + int type, unsigned char *bytes, + int len); +int X509_NAME_add_entry_by_txt(X509_NAME *name, const char *field, int type, + const unsigned char *bytes, int len, int loc, + int set); +X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_OBJ(X509_NAME_ENTRY **ne, + ASN1_OBJECT *obj, int type, + const unsigned char *bytes, + int len); +int X509_NAME_ENTRY_set_object(X509_NAME_ENTRY *ne, ASN1_OBJECT *obj); +int X509_NAME_ENTRY_set_data(X509_NAME_ENTRY *ne, int type, + const unsigned char *bytes, int len); +ASN1_OBJECT *X509_NAME_ENTRY_get_object(X509_NAME_ENTRY *ne); +ASN1_STRING *X509_NAME_ENTRY_get_data(X509_NAME_ENTRY *ne); + +int X509v3_get_ext_count(const STACK_OF(X509_EXTENSION) *x); +int X509v3_get_ext_by_NID(const STACK_OF(X509_EXTENSION) *x, + int nid, int lastpos); +int X509v3_get_ext_by_OBJ(const STACK_OF(X509_EXTENSION) *x, + ASN1_OBJECT *obj, int lastpos); +int X509v3_get_ext_by_critical(const STACK_OF(X509_EXTENSION) *x, + int crit, int lastpos); +X509_EXTENSION *X509v3_get_ext(const STACK_OF(X509_EXTENSION) *x, int loc); +X509_EXTENSION *X509v3_delete_ext(STACK_OF(X509_EXTENSION) *x, int loc); +STACK_OF(X509_EXTENSION) *X509v3_add_ext(STACK_OF(X509_EXTENSION) **x, + X509_EXTENSION *ex, int loc); + +int X509_get_ext_count(X509 *x); +int X509_get_ext_by_NID(X509 *x, int nid, int lastpos); +int X509_get_ext_by_OBJ(X509 *x, ASN1_OBJECT *obj, int lastpos); +int X509_get_ext_by_critical(X509 *x, int crit, int lastpos); +X509_EXTENSION *X509_get_ext(X509 *x, int loc); +X509_EXTENSION *X509_delete_ext(X509 *x, int loc); +int X509_add_ext(X509 *x, X509_EXTENSION *ex, int loc); +void *X509_get_ext_d2i(X509 *x, int nid, int *crit, int *idx); +int X509_add1_ext_i2d(X509 *x, int nid, void *value, int crit, + unsigned long flags); + +int X509_CRL_get_ext_count(X509_CRL *x); +int X509_CRL_get_ext_by_NID(X509_CRL *x, int nid, int lastpos); +int X509_CRL_get_ext_by_OBJ(X509_CRL *x, ASN1_OBJECT *obj, int lastpos); +int X509_CRL_get_ext_by_critical(X509_CRL *x, int crit, int lastpos); +X509_EXTENSION *X509_CRL_get_ext(X509_CRL *x, int loc); +X509_EXTENSION *X509_CRL_delete_ext(X509_CRL *x, int loc); +int X509_CRL_add_ext(X509_CRL *x, X509_EXTENSION *ex, int loc); +void *X509_CRL_get_ext_d2i(X509_CRL *x, int nid, int *crit, int *idx); +int X509_CRL_add1_ext_i2d(X509_CRL *x, int nid, void *value, int crit, + unsigned long flags); + +int X509_REVOKED_get_ext_count(X509_REVOKED *x); +int X509_REVOKED_get_ext_by_NID(X509_REVOKED *x, int nid, int lastpos); +int X509_REVOKED_get_ext_by_OBJ(X509_REVOKED *x, ASN1_OBJECT *obj, + int lastpos); +int X509_REVOKED_get_ext_by_critical(X509_REVOKED *x, int crit, int lastpos); +X509_EXTENSION *X509_REVOKED_get_ext(X509_REVOKED *x, int loc); +X509_EXTENSION *X509_REVOKED_delete_ext(X509_REVOKED *x, int loc); +int X509_REVOKED_add_ext(X509_REVOKED *x, X509_EXTENSION *ex, int loc); +void *X509_REVOKED_get_ext_d2i(X509_REVOKED *x, int nid, int *crit, int *idx); +int X509_REVOKED_add1_ext_i2d(X509_REVOKED *x, int nid, void *value, int crit, + unsigned long flags); + +X509_EXTENSION *X509_EXTENSION_create_by_NID(X509_EXTENSION **ex, + int nid, int crit, + ASN1_OCTET_STRING *data); +X509_EXTENSION *X509_EXTENSION_create_by_OBJ(X509_EXTENSION **ex, + ASN1_OBJECT *obj, int crit, + ASN1_OCTET_STRING *data); +int X509_EXTENSION_set_object(X509_EXTENSION *ex, ASN1_OBJECT *obj); +int X509_EXTENSION_set_critical(X509_EXTENSION *ex, int crit); +int X509_EXTENSION_set_data(X509_EXTENSION *ex, ASN1_OCTET_STRING *data); +ASN1_OBJECT *X509_EXTENSION_get_object(X509_EXTENSION *ex); +ASN1_OCTET_STRING *X509_EXTENSION_get_data(X509_EXTENSION *ne); +int X509_EXTENSION_get_critical(X509_EXTENSION *ex); + +int X509at_get_attr_count(const STACK_OF(X509_ATTRIBUTE) *x); +int X509at_get_attr_by_NID(const STACK_OF(X509_ATTRIBUTE) *x, int nid, + int lastpos); +int X509at_get_attr_by_OBJ(const STACK_OF(X509_ATTRIBUTE) *sk, + ASN1_OBJECT *obj, int lastpos); +X509_ATTRIBUTE *X509at_get_attr(const STACK_OF(X509_ATTRIBUTE) *x, int loc); +X509_ATTRIBUTE *X509at_delete_attr(STACK_OF(X509_ATTRIBUTE) *x, int loc); +STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr(STACK_OF(X509_ATTRIBUTE) **x, + X509_ATTRIBUTE *attr); +STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_OBJ(STACK_OF(X509_ATTRIBUTE) + **x, const ASN1_OBJECT *obj, + int type, + const unsigned char *bytes, + int len); +STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_NID(STACK_OF(X509_ATTRIBUTE) + **x, int nid, int type, + const unsigned char *bytes, + int len); +STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_txt(STACK_OF(X509_ATTRIBUTE) + **x, const char *attrname, + int type, + const unsigned char *bytes, + int len); +void *X509at_get0_data_by_OBJ(STACK_OF(X509_ATTRIBUTE) *x, ASN1_OBJECT *obj, + int lastpos, int type); +X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_NID(X509_ATTRIBUTE **attr, int nid, + int atrtype, const void *data, + int len); +X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_OBJ(X509_ATTRIBUTE **attr, + const ASN1_OBJECT *obj, + int atrtype, const void *data, + int len); +X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_txt(X509_ATTRIBUTE **attr, + const char *atrname, int type, + const unsigned char *bytes, + int len); +int X509_ATTRIBUTE_set1_object(X509_ATTRIBUTE *attr, const ASN1_OBJECT *obj); +int X509_ATTRIBUTE_set1_data(X509_ATTRIBUTE *attr, int attrtype, + const void *data, int len); +void *X509_ATTRIBUTE_get0_data(X509_ATTRIBUTE *attr, int idx, int atrtype, + void *data); +int X509_ATTRIBUTE_count(X509_ATTRIBUTE *attr); +ASN1_OBJECT *X509_ATTRIBUTE_get0_object(X509_ATTRIBUTE *attr); +ASN1_TYPE *X509_ATTRIBUTE_get0_type(X509_ATTRIBUTE *attr, int idx); + +int EVP_PKEY_get_attr_count(const EVP_PKEY *key); +int EVP_PKEY_get_attr_by_NID(const EVP_PKEY *key, int nid, int lastpos); +int EVP_PKEY_get_attr_by_OBJ(const EVP_PKEY *key, ASN1_OBJECT *obj, + int lastpos); +X509_ATTRIBUTE *EVP_PKEY_get_attr(const EVP_PKEY *key, int loc); +X509_ATTRIBUTE *EVP_PKEY_delete_attr(EVP_PKEY *key, int loc); +int EVP_PKEY_add1_attr(EVP_PKEY *key, X509_ATTRIBUTE *attr); +int EVP_PKEY_add1_attr_by_OBJ(EVP_PKEY *key, + const ASN1_OBJECT *obj, int type, + const unsigned char *bytes, int len); +int EVP_PKEY_add1_attr_by_NID(EVP_PKEY *key, + int nid, int type, + const unsigned char *bytes, int len); +int EVP_PKEY_add1_attr_by_txt(EVP_PKEY *key, + const char *attrname, int type, + const unsigned char *bytes, int len); + +int X509_verify_cert(X509_STORE_CTX *ctx); + +/* lookup a cert from a X509 STACK */ +X509 *X509_find_by_issuer_and_serial(STACK_OF(X509) *sk, X509_NAME *name, + ASN1_INTEGER *serial); +X509 *X509_find_by_subject(STACK_OF(X509) *sk, X509_NAME *name); + +DECLARE_ASN1_FUNCTIONS(PBEPARAM) +DECLARE_ASN1_FUNCTIONS(PBE2PARAM) +DECLARE_ASN1_FUNCTIONS(PBKDF2PARAM) + +int PKCS5_pbe_set0_algor(X509_ALGOR *algor, int alg, int iter, + const unsigned char *salt, int saltlen); + +X509_ALGOR *PKCS5_pbe_set(int alg, int iter, + const unsigned char *salt, int saltlen); +X509_ALGOR *PKCS5_pbe2_set(const EVP_CIPHER *cipher, int iter, + unsigned char *salt, int saltlen); +X509_ALGOR *PKCS5_pbe2_set_iv(const EVP_CIPHER *cipher, int iter, + unsigned char *salt, int saltlen, + unsigned char *aiv, int prf_nid); + +X509_ALGOR *PKCS5_pbkdf2_set(int iter, unsigned char *salt, int saltlen, + int prf_nid, int keylen); + +/* PKCS#8 utilities */ + +DECLARE_ASN1_FUNCTIONS(PKCS8_PRIV_KEY_INFO) + +EVP_PKEY *EVP_PKCS82PKEY(PKCS8_PRIV_KEY_INFO *p8); +PKCS8_PRIV_KEY_INFO *EVP_PKEY2PKCS8(EVP_PKEY *pkey); +PKCS8_PRIV_KEY_INFO *EVP_PKEY2PKCS8_broken(EVP_PKEY *pkey, int broken); +PKCS8_PRIV_KEY_INFO *PKCS8_set_broken(PKCS8_PRIV_KEY_INFO *p8, int broken); + +int PKCS8_pkey_set0(PKCS8_PRIV_KEY_INFO *priv, ASN1_OBJECT *aobj, + int version, int ptype, void *pval, + unsigned char *penc, int penclen); +int PKCS8_pkey_get0(ASN1_OBJECT **ppkalg, + const unsigned char **pk, int *ppklen, + X509_ALGOR **pa, PKCS8_PRIV_KEY_INFO *p8); + +int X509_PUBKEY_set0_param(X509_PUBKEY *pub, ASN1_OBJECT *aobj, + int ptype, void *pval, + unsigned char *penc, int penclen); +int X509_PUBKEY_get0_param(ASN1_OBJECT **ppkalg, + const unsigned char **pk, int *ppklen, + X509_ALGOR **pa, X509_PUBKEY *pub); + +int X509_check_trust(X509 *x, int id, int flags); +int X509_TRUST_get_count(void); +X509_TRUST *X509_TRUST_get0(int idx); +int X509_TRUST_get_by_id(int id); +int X509_TRUST_add(int id, int flags, int (*ck) (X509_TRUST *, X509 *, int), + char *name, int arg1, void *arg2); +void X509_TRUST_cleanup(void); +int X509_TRUST_get_flags(X509_TRUST *xp); +char *X509_TRUST_get0_name(X509_TRUST *xp); +int X509_TRUST_get_trust(X509_TRUST *xp); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ + +void ERR_load_X509_strings(void); + +/* Error codes for the X509 functions. */ + +/* Function codes. */ +# define X509_F_ADD_CERT_DIR 100 +# define X509_F_BY_FILE_CTRL 101 +# define X509_F_CHECK_NAME_CONSTRAINTS 106 +# define X509_F_CHECK_POLICY 145 +# define X509_F_DIR_CTRL 102 +# define X509_F_GET_CERT_BY_SUBJECT 103 +# define X509_F_NETSCAPE_SPKI_B64_DECODE 129 +# define X509_F_NETSCAPE_SPKI_B64_ENCODE 130 +# define X509_F_X509AT_ADD1_ATTR 135 +# define X509_F_X509V3_ADD_EXT 104 +# define X509_F_X509_ATTRIBUTE_CREATE_BY_NID 136 +# define X509_F_X509_ATTRIBUTE_CREATE_BY_OBJ 137 +# define X509_F_X509_ATTRIBUTE_CREATE_BY_TXT 140 +# define X509_F_X509_ATTRIBUTE_GET0_DATA 139 +# define X509_F_X509_ATTRIBUTE_SET1_DATA 138 +# define X509_F_X509_CHECK_PRIVATE_KEY 128 +# define X509_F_X509_CRL_DIFF 105 +# define X509_F_X509_CRL_PRINT_FP 147 +# define X509_F_X509_EXTENSION_CREATE_BY_NID 108 +# define X509_F_X509_EXTENSION_CREATE_BY_OBJ 109 +# define X509_F_X509_GET_PUBKEY_PARAMETERS 110 +# define X509_F_X509_LOAD_CERT_CRL_FILE 132 +# define X509_F_X509_LOAD_CERT_FILE 111 +# define X509_F_X509_LOAD_CRL_FILE 112 +# define X509_F_X509_NAME_ADD_ENTRY 113 +# define X509_F_X509_NAME_ENTRY_CREATE_BY_NID 114 +# define X509_F_X509_NAME_ENTRY_CREATE_BY_TXT 131 +# define X509_F_X509_NAME_ENTRY_SET_OBJECT 115 +# define X509_F_X509_NAME_ONELINE 116 +# define X509_F_X509_NAME_PRINT 117 +# define X509_F_X509_PRINT_EX_FP 118 +# define X509_F_X509_PUBKEY_GET 119 +# define X509_F_X509_PUBKEY_SET 120 +# define X509_F_X509_REQ_CHECK_PRIVATE_KEY 144 +# define X509_F_X509_REQ_PRINT_EX 121 +# define X509_F_X509_REQ_PRINT_FP 122 +# define X509_F_X509_REQ_TO_X509 123 +# define X509_F_X509_STORE_ADD_CERT 124 +# define X509_F_X509_STORE_ADD_CRL 125 +# define X509_F_X509_STORE_CTX_GET1_ISSUER 146 +# define X509_F_X509_STORE_CTX_INIT 143 +# define X509_F_X509_STORE_CTX_NEW 142 +# define X509_F_X509_STORE_CTX_PURPOSE_INHERIT 134 +# define X509_F_X509_TO_X509_REQ 126 +# define X509_F_X509_TRUST_ADD 133 +# define X509_F_X509_TRUST_SET 141 +# define X509_F_X509_VERIFY_CERT 127 + +/* Reason codes. */ +# define X509_R_AKID_MISMATCH 110 +# define X509_R_BAD_X509_FILETYPE 100 +# define X509_R_BASE64_DECODE_ERROR 118 +# define X509_R_CANT_CHECK_DH_KEY 114 +# define X509_R_CERT_ALREADY_IN_HASH_TABLE 101 +# define X509_R_CRL_ALREADY_DELTA 127 +# define X509_R_CRL_VERIFY_FAILURE 131 +# define X509_R_ERR_ASN1_LIB 102 +# define X509_R_IDP_MISMATCH 128 +# define X509_R_INVALID_DIRECTORY 113 +# define X509_R_INVALID_FIELD_NAME 119 +# define X509_R_INVALID_TRUST 123 +# define X509_R_ISSUER_MISMATCH 129 +# define X509_R_KEY_TYPE_MISMATCH 115 +# define X509_R_KEY_VALUES_MISMATCH 116 +# define X509_R_LOADING_CERT_DIR 103 +# define X509_R_LOADING_DEFAULTS 104 +# define X509_R_METHOD_NOT_SUPPORTED 124 +# define X509_R_NAME_TOO_LONG 134 +# define X509_R_NEWER_CRL_NOT_NEWER 132 +# define X509_R_NO_CERT_SET_FOR_US_TO_VERIFY 105 +# define X509_R_NO_CRL_NUMBER 130 +# define X509_R_PUBLIC_KEY_DECODE_ERROR 125 +# define X509_R_PUBLIC_KEY_ENCODE_ERROR 126 +# define X509_R_SHOULD_RETRY 106 +# define X509_R_UNABLE_TO_FIND_PARAMETERS_IN_CHAIN 107 +# define X509_R_UNABLE_TO_GET_CERTS_PUBLIC_KEY 108 +# define X509_R_UNKNOWN_KEY_TYPE 117 +# define X509_R_UNKNOWN_NID 109 +# define X509_R_UNKNOWN_PURPOSE_ID 121 +# define X509_R_UNKNOWN_TRUST_ID 120 +# define X509_R_UNSUPPORTED_ALGORITHM 111 +# define X509_R_WRONG_LOOKUP_TYPE 112 +# define X509_R_WRONG_TYPE 122 + +# ifdef __cplusplus +} +# endif +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/x509_vfy.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/x509_vfy.h new file mode 100644 index 0000000..5062682 --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/x509_vfy.h @@ -0,0 +1,652 @@ +/* crypto/x509/x509_vfy.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_X509_H +# include +/* + * openssl/x509.h ends up #include-ing this file at about the only + * appropriate moment. + */ +#endif + +#ifndef HEADER_X509_VFY_H +# define HEADER_X509_VFY_H + +# include +# ifndef OPENSSL_NO_LHASH +# include +# endif +# include +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# if 0 +/* Outer object */ +typedef struct x509_hash_dir_st { + int num_dirs; + char **dirs; + int *dirs_type; + int num_dirs_alloced; +} X509_HASH_DIR_CTX; +# endif + +typedef struct x509_file_st { + int num_paths; /* number of paths to files or directories */ + int num_alloced; + char **paths; /* the list of paths or directories */ + int *path_type; +} X509_CERT_FILE_CTX; + +/*******************************/ +/*- +SSL_CTX -> X509_STORE + -> X509_LOOKUP + ->X509_LOOKUP_METHOD + -> X509_LOOKUP + ->X509_LOOKUP_METHOD + +SSL -> X509_STORE_CTX + ->X509_STORE + +The X509_STORE holds the tables etc for verification stuff. +A X509_STORE_CTX is used while validating a single certificate. +The X509_STORE has X509_LOOKUPs for looking up certs. +The X509_STORE then calls a function to actually verify the +certificate chain. +*/ + +# define X509_LU_RETRY -1 +# define X509_LU_FAIL 0 +# define X509_LU_X509 1 +# define X509_LU_CRL 2 +# define X509_LU_PKEY 3 + +typedef struct x509_object_st { + /* one of the above types */ + int type; + union { + char *ptr; + X509 *x509; + X509_CRL *crl; + EVP_PKEY *pkey; + } data; +} X509_OBJECT; + +typedef struct x509_lookup_st X509_LOOKUP; + +DECLARE_STACK_OF(X509_LOOKUP) +DECLARE_STACK_OF(X509_OBJECT) + +/* This is a static that defines the function interface */ +typedef struct x509_lookup_method_st { + const char *name; + int (*new_item) (X509_LOOKUP *ctx); + void (*free) (X509_LOOKUP *ctx); + int (*init) (X509_LOOKUP *ctx); + int (*shutdown) (X509_LOOKUP *ctx); + int (*ctrl) (X509_LOOKUP *ctx, int cmd, const char *argc, long argl, + char **ret); + int (*get_by_subject) (X509_LOOKUP *ctx, int type, X509_NAME *name, + X509_OBJECT *ret); + int (*get_by_issuer_serial) (X509_LOOKUP *ctx, int type, X509_NAME *name, + ASN1_INTEGER *serial, X509_OBJECT *ret); + int (*get_by_fingerprint) (X509_LOOKUP *ctx, int type, + unsigned char *bytes, int len, + X509_OBJECT *ret); + int (*get_by_alias) (X509_LOOKUP *ctx, int type, char *str, int len, + X509_OBJECT *ret); +} X509_LOOKUP_METHOD; + +typedef struct X509_VERIFY_PARAM_ID_st X509_VERIFY_PARAM_ID; + +/* + * This structure hold all parameters associated with a verify operation by + * including an X509_VERIFY_PARAM structure in related structures the + * parameters used can be customized + */ + +typedef struct X509_VERIFY_PARAM_st { + char *name; + time_t check_time; /* Time to use */ + unsigned long inh_flags; /* Inheritance flags */ + unsigned long flags; /* Various verify flags */ + int purpose; /* purpose to check untrusted certificates */ + int trust; /* trust setting to check */ + int depth; /* Verify depth */ + STACK_OF(ASN1_OBJECT) *policies; /* Permissible policies */ + X509_VERIFY_PARAM_ID *id; /* opaque ID data */ +} X509_VERIFY_PARAM; + +DECLARE_STACK_OF(X509_VERIFY_PARAM) + +/* + * This is used to hold everything. It is used for all certificate + * validation. Once we have a certificate chain, the 'verify' function is + * then called to actually check the cert chain. + */ +struct x509_store_st { + /* The following is a cache of trusted certs */ + int cache; /* if true, stash any hits */ + STACK_OF(X509_OBJECT) *objs; /* Cache of all objects */ + /* These are external lookup methods */ + STACK_OF(X509_LOOKUP) *get_cert_methods; + X509_VERIFY_PARAM *param; + /* Callbacks for various operations */ + /* called to verify a certificate */ + int (*verify) (X509_STORE_CTX *ctx); + /* error callback */ + int (*verify_cb) (int ok, X509_STORE_CTX *ctx); + /* get issuers cert from ctx */ + int (*get_issuer) (X509 **issuer, X509_STORE_CTX *ctx, X509 *x); + /* check issued */ + int (*check_issued) (X509_STORE_CTX *ctx, X509 *x, X509 *issuer); + /* Check revocation status of chain */ + int (*check_revocation) (X509_STORE_CTX *ctx); + /* retrieve CRL */ + int (*get_crl) (X509_STORE_CTX *ctx, X509_CRL **crl, X509 *x); + /* Check CRL validity */ + int (*check_crl) (X509_STORE_CTX *ctx, X509_CRL *crl); + /* Check certificate against CRL */ + int (*cert_crl) (X509_STORE_CTX *ctx, X509_CRL *crl, X509 *x); + STACK_OF(X509) *(*lookup_certs) (X509_STORE_CTX *ctx, X509_NAME *nm); + STACK_OF(X509_CRL) *(*lookup_crls) (X509_STORE_CTX *ctx, X509_NAME *nm); + int (*cleanup) (X509_STORE_CTX *ctx); + CRYPTO_EX_DATA ex_data; + int references; +} /* X509_STORE */ ; + +int X509_STORE_set_depth(X509_STORE *store, int depth); + +# define X509_STORE_set_verify_cb_func(ctx,func) ((ctx)->verify_cb=(func)) +# define X509_STORE_set_verify_func(ctx,func) ((ctx)->verify=(func)) + +/* This is the functions plus an instance of the local variables. */ +struct x509_lookup_st { + int init; /* have we been started */ + int skip; /* don't use us. */ + X509_LOOKUP_METHOD *method; /* the functions */ + char *method_data; /* method data */ + X509_STORE *store_ctx; /* who owns us */ +} /* X509_LOOKUP */ ; + +/* + * This is a used when verifying cert chains. Since the gathering of the + * cert chain can take some time (and have to be 'retried', this needs to be + * kept and passed around. + */ +struct x509_store_ctx_st { /* X509_STORE_CTX */ + X509_STORE *ctx; + /* used when looking up certs */ + int current_method; + /* The following are set by the caller */ + /* The cert to check */ + X509 *cert; + /* chain of X509s - untrusted - passed in */ + STACK_OF(X509) *untrusted; + /* set of CRLs passed in */ + STACK_OF(X509_CRL) *crls; + X509_VERIFY_PARAM *param; + /* Other info for use with get_issuer() */ + void *other_ctx; + /* Callbacks for various operations */ + /* called to verify a certificate */ + int (*verify) (X509_STORE_CTX *ctx); + /* error callback */ + int (*verify_cb) (int ok, X509_STORE_CTX *ctx); + /* get issuers cert from ctx */ + int (*get_issuer) (X509 **issuer, X509_STORE_CTX *ctx, X509 *x); + /* check issued */ + int (*check_issued) (X509_STORE_CTX *ctx, X509 *x, X509 *issuer); + /* Check revocation status of chain */ + int (*check_revocation) (X509_STORE_CTX *ctx); + /* retrieve CRL */ + int (*get_crl) (X509_STORE_CTX *ctx, X509_CRL **crl, X509 *x); + /* Check CRL validity */ + int (*check_crl) (X509_STORE_CTX *ctx, X509_CRL *crl); + /* Check certificate against CRL */ + int (*cert_crl) (X509_STORE_CTX *ctx, X509_CRL *crl, X509 *x); + int (*check_policy) (X509_STORE_CTX *ctx); + STACK_OF(X509) *(*lookup_certs) (X509_STORE_CTX *ctx, X509_NAME *nm); + STACK_OF(X509_CRL) *(*lookup_crls) (X509_STORE_CTX *ctx, X509_NAME *nm); + int (*cleanup) (X509_STORE_CTX *ctx); + /* The following is built up */ + /* if 0, rebuild chain */ + int valid; + /* index of last untrusted cert */ + int last_untrusted; + /* chain of X509s - built up and trusted */ + STACK_OF(X509) *chain; + /* Valid policy tree */ + X509_POLICY_TREE *tree; + /* Require explicit policy value */ + int explicit_policy; + /* When something goes wrong, this is why */ + int error_depth; + int error; + X509 *current_cert; + /* cert currently being tested as valid issuer */ + X509 *current_issuer; + /* current CRL */ + X509_CRL *current_crl; + /* score of current CRL */ + int current_crl_score; + /* Reason mask */ + unsigned int current_reasons; + /* For CRL path validation: parent context */ + X509_STORE_CTX *parent; + CRYPTO_EX_DATA ex_data; +} /* X509_STORE_CTX */ ; + +void X509_STORE_CTX_set_depth(X509_STORE_CTX *ctx, int depth); + +# define X509_STORE_CTX_set_app_data(ctx,data) \ + X509_STORE_CTX_set_ex_data(ctx,0,data) +# define X509_STORE_CTX_get_app_data(ctx) \ + X509_STORE_CTX_get_ex_data(ctx,0) + +# define X509_L_FILE_LOAD 1 +# define X509_L_ADD_DIR 2 + +# define X509_LOOKUP_load_file(x,name,type) \ + X509_LOOKUP_ctrl((x),X509_L_FILE_LOAD,(name),(long)(type),NULL) + +# define X509_LOOKUP_add_dir(x,name,type) \ + X509_LOOKUP_ctrl((x),X509_L_ADD_DIR,(name),(long)(type),NULL) + +# define X509_V_OK 0 +# define X509_V_ERR_UNSPECIFIED 1 + +# define X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT 2 +# define X509_V_ERR_UNABLE_TO_GET_CRL 3 +# define X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE 4 +# define X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE 5 +# define X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY 6 +# define X509_V_ERR_CERT_SIGNATURE_FAILURE 7 +# define X509_V_ERR_CRL_SIGNATURE_FAILURE 8 +# define X509_V_ERR_CERT_NOT_YET_VALID 9 +# define X509_V_ERR_CERT_HAS_EXPIRED 10 +# define X509_V_ERR_CRL_NOT_YET_VALID 11 +# define X509_V_ERR_CRL_HAS_EXPIRED 12 +# define X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD 13 +# define X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD 14 +# define X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD 15 +# define X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD 16 +# define X509_V_ERR_OUT_OF_MEM 17 +# define X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT 18 +# define X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN 19 +# define X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY 20 +# define X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE 21 +# define X509_V_ERR_CERT_CHAIN_TOO_LONG 22 +# define X509_V_ERR_CERT_REVOKED 23 +# define X509_V_ERR_INVALID_CA 24 +# define X509_V_ERR_PATH_LENGTH_EXCEEDED 25 +# define X509_V_ERR_INVALID_PURPOSE 26 +# define X509_V_ERR_CERT_UNTRUSTED 27 +# define X509_V_ERR_CERT_REJECTED 28 +/* These are 'informational' when looking for issuer cert */ +# define X509_V_ERR_SUBJECT_ISSUER_MISMATCH 29 +# define X509_V_ERR_AKID_SKID_MISMATCH 30 +# define X509_V_ERR_AKID_ISSUER_SERIAL_MISMATCH 31 +# define X509_V_ERR_KEYUSAGE_NO_CERTSIGN 32 + +# define X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER 33 +# define X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION 34 +# define X509_V_ERR_KEYUSAGE_NO_CRL_SIGN 35 +# define X509_V_ERR_UNHANDLED_CRITICAL_CRL_EXTENSION 36 +# define X509_V_ERR_INVALID_NON_CA 37 +# define X509_V_ERR_PROXY_PATH_LENGTH_EXCEEDED 38 +# define X509_V_ERR_KEYUSAGE_NO_DIGITAL_SIGNATURE 39 +# define X509_V_ERR_PROXY_CERTIFICATES_NOT_ALLOWED 40 + +# define X509_V_ERR_INVALID_EXTENSION 41 +# define X509_V_ERR_INVALID_POLICY_EXTENSION 42 +# define X509_V_ERR_NO_EXPLICIT_POLICY 43 +# define X509_V_ERR_DIFFERENT_CRL_SCOPE 44 +# define X509_V_ERR_UNSUPPORTED_EXTENSION_FEATURE 45 + +# define X509_V_ERR_UNNESTED_RESOURCE 46 + +# define X509_V_ERR_PERMITTED_VIOLATION 47 +# define X509_V_ERR_EXCLUDED_VIOLATION 48 +# define X509_V_ERR_SUBTREE_MINMAX 49 +# define X509_V_ERR_APPLICATION_VERIFICATION 50 +# define X509_V_ERR_UNSUPPORTED_CONSTRAINT_TYPE 51 +# define X509_V_ERR_UNSUPPORTED_CONSTRAINT_SYNTAX 52 +# define X509_V_ERR_UNSUPPORTED_NAME_SYNTAX 53 +# define X509_V_ERR_CRL_PATH_VALIDATION_ERROR 54 + +/* Suite B mode algorithm violation */ +# define X509_V_ERR_SUITE_B_INVALID_VERSION 56 +# define X509_V_ERR_SUITE_B_INVALID_ALGORITHM 57 +# define X509_V_ERR_SUITE_B_INVALID_CURVE 58 +# define X509_V_ERR_SUITE_B_INVALID_SIGNATURE_ALGORITHM 59 +# define X509_V_ERR_SUITE_B_LOS_NOT_ALLOWED 60 +# define X509_V_ERR_SUITE_B_CANNOT_SIGN_P_384_WITH_P_256 61 + +/* Host, email and IP check errors */ +# define X509_V_ERR_HOSTNAME_MISMATCH 62 +# define X509_V_ERR_EMAIL_MISMATCH 63 +# define X509_V_ERR_IP_ADDRESS_MISMATCH 64 + +/* Caller error */ +# define X509_V_ERR_INVALID_CALL 65 +/* Issuer lookup error */ +# define X509_V_ERR_STORE_LOOKUP 66 + +# define X509_V_ERR_PROXY_SUBJECT_NAME_VIOLATION 67 + +/* Certificate verify flags */ + +/* Send issuer+subject checks to verify_cb */ +# define X509_V_FLAG_CB_ISSUER_CHECK 0x1 +/* Use check time instead of current time */ +# define X509_V_FLAG_USE_CHECK_TIME 0x2 +/* Lookup CRLs */ +# define X509_V_FLAG_CRL_CHECK 0x4 +/* Lookup CRLs for whole chain */ +# define X509_V_FLAG_CRL_CHECK_ALL 0x8 +/* Ignore unhandled critical extensions */ +# define X509_V_FLAG_IGNORE_CRITICAL 0x10 +/* Disable workarounds for broken certificates */ +# define X509_V_FLAG_X509_STRICT 0x20 +/* Enable proxy certificate validation */ +# define X509_V_FLAG_ALLOW_PROXY_CERTS 0x40 +/* Enable policy checking */ +# define X509_V_FLAG_POLICY_CHECK 0x80 +/* Policy variable require-explicit-policy */ +# define X509_V_FLAG_EXPLICIT_POLICY 0x100 +/* Policy variable inhibit-any-policy */ +# define X509_V_FLAG_INHIBIT_ANY 0x200 +/* Policy variable inhibit-policy-mapping */ +# define X509_V_FLAG_INHIBIT_MAP 0x400 +/* Notify callback that policy is OK */ +# define X509_V_FLAG_NOTIFY_POLICY 0x800 +/* Extended CRL features such as indirect CRLs, alternate CRL signing keys */ +# define X509_V_FLAG_EXTENDED_CRL_SUPPORT 0x1000 +/* Delta CRL support */ +# define X509_V_FLAG_USE_DELTAS 0x2000 +/* Check selfsigned CA signature */ +# define X509_V_FLAG_CHECK_SS_SIGNATURE 0x4000 +/* Use trusted store first */ +# define X509_V_FLAG_TRUSTED_FIRST 0x8000 +/* Suite B 128 bit only mode: not normally used */ +# define X509_V_FLAG_SUITEB_128_LOS_ONLY 0x10000 +/* Suite B 192 bit only mode */ +# define X509_V_FLAG_SUITEB_192_LOS 0x20000 +/* Suite B 128 bit mode allowing 192 bit algorithms */ +# define X509_V_FLAG_SUITEB_128_LOS 0x30000 + +/* Allow partial chains if at least one certificate is in trusted store */ +# define X509_V_FLAG_PARTIAL_CHAIN 0x80000 +/* + * If the initial chain is not trusted, do not attempt to build an alternative + * chain. Alternate chain checking was introduced in 1.0.2b. Setting this flag + * will force the behaviour to match that of previous versions. + */ +# define X509_V_FLAG_NO_ALT_CHAINS 0x100000 + +# define X509_VP_FLAG_DEFAULT 0x1 +# define X509_VP_FLAG_OVERWRITE 0x2 +# define X509_VP_FLAG_RESET_FLAGS 0x4 +# define X509_VP_FLAG_LOCKED 0x8 +# define X509_VP_FLAG_ONCE 0x10 + +/* Internal use: mask of policy related options */ +# define X509_V_FLAG_POLICY_MASK (X509_V_FLAG_POLICY_CHECK \ + | X509_V_FLAG_EXPLICIT_POLICY \ + | X509_V_FLAG_INHIBIT_ANY \ + | X509_V_FLAG_INHIBIT_MAP) + +int X509_OBJECT_idx_by_subject(STACK_OF(X509_OBJECT) *h, int type, + X509_NAME *name); +X509_OBJECT *X509_OBJECT_retrieve_by_subject(STACK_OF(X509_OBJECT) *h, + int type, X509_NAME *name); +X509_OBJECT *X509_OBJECT_retrieve_match(STACK_OF(X509_OBJECT) *h, + X509_OBJECT *x); +void X509_OBJECT_up_ref_count(X509_OBJECT *a); +void X509_OBJECT_free_contents(X509_OBJECT *a); +X509_STORE *X509_STORE_new(void); +void X509_STORE_free(X509_STORE *v); + +STACK_OF(X509) *X509_STORE_get1_certs(X509_STORE_CTX *st, X509_NAME *nm); +STACK_OF(X509_CRL) *X509_STORE_get1_crls(X509_STORE_CTX *st, X509_NAME *nm); +int X509_STORE_set_flags(X509_STORE *ctx, unsigned long flags); +int X509_STORE_set_purpose(X509_STORE *ctx, int purpose); +int X509_STORE_set_trust(X509_STORE *ctx, int trust); +int X509_STORE_set1_param(X509_STORE *ctx, X509_VERIFY_PARAM *pm); + +void X509_STORE_set_verify_cb(X509_STORE *ctx, + int (*verify_cb) (int, X509_STORE_CTX *)); + +void X509_STORE_set_lookup_crls_cb(X509_STORE *ctx, + STACK_OF(X509_CRL) *(*cb) (X509_STORE_CTX + *ctx, + X509_NAME *nm)); + +X509_STORE_CTX *X509_STORE_CTX_new(void); + +int X509_STORE_CTX_get1_issuer(X509 **issuer, X509_STORE_CTX *ctx, X509 *x); + +void X509_STORE_CTX_free(X509_STORE_CTX *ctx); +int X509_STORE_CTX_init(X509_STORE_CTX *ctx, X509_STORE *store, + X509 *x509, STACK_OF(X509) *chain); +void X509_STORE_CTX_trusted_stack(X509_STORE_CTX *ctx, STACK_OF(X509) *sk); +void X509_STORE_CTX_cleanup(X509_STORE_CTX *ctx); + +X509_STORE *X509_STORE_CTX_get0_store(X509_STORE_CTX *ctx); + +X509_LOOKUP *X509_STORE_add_lookup(X509_STORE *v, X509_LOOKUP_METHOD *m); + +X509_LOOKUP_METHOD *X509_LOOKUP_hash_dir(void); +X509_LOOKUP_METHOD *X509_LOOKUP_file(void); + +int X509_STORE_add_cert(X509_STORE *ctx, X509 *x); +int X509_STORE_add_crl(X509_STORE *ctx, X509_CRL *x); + +int X509_STORE_get_by_subject(X509_STORE_CTX *vs, int type, X509_NAME *name, + X509_OBJECT *ret); + +int X509_LOOKUP_ctrl(X509_LOOKUP *ctx, int cmd, const char *argc, + long argl, char **ret); + +# ifndef OPENSSL_NO_STDIO +int X509_load_cert_file(X509_LOOKUP *ctx, const char *file, int type); +int X509_load_crl_file(X509_LOOKUP *ctx, const char *file, int type); +int X509_load_cert_crl_file(X509_LOOKUP *ctx, const char *file, int type); +# endif + +X509_LOOKUP *X509_LOOKUP_new(X509_LOOKUP_METHOD *method); +void X509_LOOKUP_free(X509_LOOKUP *ctx); +int X509_LOOKUP_init(X509_LOOKUP *ctx); +int X509_LOOKUP_by_subject(X509_LOOKUP *ctx, int type, X509_NAME *name, + X509_OBJECT *ret); +int X509_LOOKUP_by_issuer_serial(X509_LOOKUP *ctx, int type, X509_NAME *name, + ASN1_INTEGER *serial, X509_OBJECT *ret); +int X509_LOOKUP_by_fingerprint(X509_LOOKUP *ctx, int type, + unsigned char *bytes, int len, + X509_OBJECT *ret); +int X509_LOOKUP_by_alias(X509_LOOKUP *ctx, int type, char *str, int len, + X509_OBJECT *ret); +int X509_LOOKUP_shutdown(X509_LOOKUP *ctx); + +# ifndef OPENSSL_NO_STDIO +int X509_STORE_load_locations(X509_STORE *ctx, + const char *file, const char *dir); +int X509_STORE_set_default_paths(X509_STORE *ctx); +# endif + +int X509_STORE_CTX_get_ex_new_index(long argl, void *argp, + CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, + CRYPTO_EX_free *free_func); +int X509_STORE_CTX_set_ex_data(X509_STORE_CTX *ctx, int idx, void *data); +void *X509_STORE_CTX_get_ex_data(X509_STORE_CTX *ctx, int idx); +int X509_STORE_CTX_get_error(X509_STORE_CTX *ctx); +void X509_STORE_CTX_set_error(X509_STORE_CTX *ctx, int s); +int X509_STORE_CTX_get_error_depth(X509_STORE_CTX *ctx); +X509 *X509_STORE_CTX_get_current_cert(X509_STORE_CTX *ctx); +X509 *X509_STORE_CTX_get0_current_issuer(X509_STORE_CTX *ctx); +X509_CRL *X509_STORE_CTX_get0_current_crl(X509_STORE_CTX *ctx); +X509_STORE_CTX *X509_STORE_CTX_get0_parent_ctx(X509_STORE_CTX *ctx); +STACK_OF(X509) *X509_STORE_CTX_get_chain(X509_STORE_CTX *ctx); +STACK_OF(X509) *X509_STORE_CTX_get1_chain(X509_STORE_CTX *ctx); +void X509_STORE_CTX_set_cert(X509_STORE_CTX *c, X509 *x); +void X509_STORE_CTX_set_chain(X509_STORE_CTX *c, STACK_OF(X509) *sk); +void X509_STORE_CTX_set0_crls(X509_STORE_CTX *c, STACK_OF(X509_CRL) *sk); +int X509_STORE_CTX_set_purpose(X509_STORE_CTX *ctx, int purpose); +int X509_STORE_CTX_set_trust(X509_STORE_CTX *ctx, int trust); +int X509_STORE_CTX_purpose_inherit(X509_STORE_CTX *ctx, int def_purpose, + int purpose, int trust); +void X509_STORE_CTX_set_flags(X509_STORE_CTX *ctx, unsigned long flags); +void X509_STORE_CTX_set_time(X509_STORE_CTX *ctx, unsigned long flags, + time_t t); +void X509_STORE_CTX_set_verify_cb(X509_STORE_CTX *ctx, + int (*verify_cb) (int, X509_STORE_CTX *)); + +X509_POLICY_TREE *X509_STORE_CTX_get0_policy_tree(X509_STORE_CTX *ctx); +int X509_STORE_CTX_get_explicit_policy(X509_STORE_CTX *ctx); + +X509_VERIFY_PARAM *X509_STORE_CTX_get0_param(X509_STORE_CTX *ctx); +void X509_STORE_CTX_set0_param(X509_STORE_CTX *ctx, X509_VERIFY_PARAM *param); +int X509_STORE_CTX_set_default(X509_STORE_CTX *ctx, const char *name); + +/* X509_VERIFY_PARAM functions */ + +X509_VERIFY_PARAM *X509_VERIFY_PARAM_new(void); +void X509_VERIFY_PARAM_free(X509_VERIFY_PARAM *param); +int X509_VERIFY_PARAM_inherit(X509_VERIFY_PARAM *to, + const X509_VERIFY_PARAM *from); +int X509_VERIFY_PARAM_set1(X509_VERIFY_PARAM *to, + const X509_VERIFY_PARAM *from); +int X509_VERIFY_PARAM_set1_name(X509_VERIFY_PARAM *param, const char *name); +int X509_VERIFY_PARAM_set_flags(X509_VERIFY_PARAM *param, + unsigned long flags); +int X509_VERIFY_PARAM_clear_flags(X509_VERIFY_PARAM *param, + unsigned long flags); +unsigned long X509_VERIFY_PARAM_get_flags(X509_VERIFY_PARAM *param); +int X509_VERIFY_PARAM_set_purpose(X509_VERIFY_PARAM *param, int purpose); +int X509_VERIFY_PARAM_set_trust(X509_VERIFY_PARAM *param, int trust); +void X509_VERIFY_PARAM_set_depth(X509_VERIFY_PARAM *param, int depth); +void X509_VERIFY_PARAM_set_time(X509_VERIFY_PARAM *param, time_t t); +int X509_VERIFY_PARAM_add0_policy(X509_VERIFY_PARAM *param, + ASN1_OBJECT *policy); +int X509_VERIFY_PARAM_set1_policies(X509_VERIFY_PARAM *param, + STACK_OF(ASN1_OBJECT) *policies); + +int X509_VERIFY_PARAM_set1_host(X509_VERIFY_PARAM *param, + const char *name, size_t namelen); +int X509_VERIFY_PARAM_add1_host(X509_VERIFY_PARAM *param, + const char *name, size_t namelen); +void X509_VERIFY_PARAM_set_hostflags(X509_VERIFY_PARAM *param, + unsigned int flags); +char *X509_VERIFY_PARAM_get0_peername(X509_VERIFY_PARAM *); +int X509_VERIFY_PARAM_set1_email(X509_VERIFY_PARAM *param, + const char *email, size_t emaillen); +int X509_VERIFY_PARAM_set1_ip(X509_VERIFY_PARAM *param, + const unsigned char *ip, size_t iplen); +int X509_VERIFY_PARAM_set1_ip_asc(X509_VERIFY_PARAM *param, + const char *ipasc); + +int X509_VERIFY_PARAM_get_depth(const X509_VERIFY_PARAM *param); +const char *X509_VERIFY_PARAM_get0_name(const X509_VERIFY_PARAM *param); + +int X509_VERIFY_PARAM_add0_table(X509_VERIFY_PARAM *param); +int X509_VERIFY_PARAM_get_count(void); +const X509_VERIFY_PARAM *X509_VERIFY_PARAM_get0(int id); +const X509_VERIFY_PARAM *X509_VERIFY_PARAM_lookup(const char *name); +void X509_VERIFY_PARAM_table_cleanup(void); + +int X509_policy_check(X509_POLICY_TREE **ptree, int *pexplicit_policy, + STACK_OF(X509) *certs, + STACK_OF(ASN1_OBJECT) *policy_oids, unsigned int flags); + +void X509_policy_tree_free(X509_POLICY_TREE *tree); + +int X509_policy_tree_level_count(const X509_POLICY_TREE *tree); +X509_POLICY_LEVEL *X509_policy_tree_get0_level(const X509_POLICY_TREE *tree, + int i); + +STACK_OF(X509_POLICY_NODE) *X509_policy_tree_get0_policies(const + X509_POLICY_TREE + *tree); + +STACK_OF(X509_POLICY_NODE) *X509_policy_tree_get0_user_policies(const + X509_POLICY_TREE + *tree); + +int X509_policy_level_node_count(X509_POLICY_LEVEL *level); + +X509_POLICY_NODE *X509_policy_level_get0_node(X509_POLICY_LEVEL *level, + int i); + +const ASN1_OBJECT *X509_policy_node_get0_policy(const X509_POLICY_NODE *node); + +STACK_OF(POLICYQUALINFO) *X509_policy_node_get0_qualifiers(const + X509_POLICY_NODE + *node); +const X509_POLICY_NODE *X509_policy_node_get0_parent(const X509_POLICY_NODE + *node); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/include/openssl/x509v3.h b/hdssd/external/linux/openssl-1.0.2j/include/openssl/x509v3.h new file mode 100644 index 0000000..f5c6156 --- /dev/null +++ b/hdssd/external/linux/openssl-1.0.2j/include/openssl/x509v3.h @@ -0,0 +1,1055 @@ +/* x509v3.h */ +/* + * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project + * 1999. + */ +/* ==================================================================== + * Copyright (c) 1999-2004 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +#ifndef HEADER_X509V3_H +# define HEADER_X509V3_H + +# include +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# ifdef OPENSSL_SYS_WIN32 +/* Under Win32 these are defined in wincrypt.h */ +# undef X509_NAME +# undef X509_CERT_PAIR +# undef X509_EXTENSIONS +# endif + +/* Forward reference */ +struct v3_ext_method; +struct v3_ext_ctx; + +/* Useful typedefs */ + +typedef void *(*X509V3_EXT_NEW)(void); +typedef void (*X509V3_EXT_FREE) (void *); +typedef void *(*X509V3_EXT_D2I)(void *, const unsigned char **, long); +typedef int (*X509V3_EXT_I2D) (void *, unsigned char **); +typedef STACK_OF(CONF_VALUE) * + (*X509V3_EXT_I2V) (const struct v3_ext_method *method, void *ext, + STACK_OF(CONF_VALUE) *extlist); +typedef void *(*X509V3_EXT_V2I)(const struct v3_ext_method *method, + struct v3_ext_ctx *ctx, + STACK_OF(CONF_VALUE) *values); +typedef char *(*X509V3_EXT_I2S)(const struct v3_ext_method *method, + void *ext); +typedef void *(*X509V3_EXT_S2I)(const struct v3_ext_method *method, + struct v3_ext_ctx *ctx, const char *str); +typedef int (*X509V3_EXT_I2R) (const struct v3_ext_method *method, void *ext, + BIO *out, int indent); +typedef void *(*X509V3_EXT_R2I)(const struct v3_ext_method *method, + struct v3_ext_ctx *ctx, const char *str); + +/* V3 extension structure */ + +struct v3_ext_method { + int ext_nid; + int ext_flags; +/* If this is set the following four fields are ignored */ + ASN1_ITEM_EXP *it; +/* Old style ASN1 calls */ + X509V3_EXT_NEW ext_new; + X509V3_EXT_FREE ext_free; + X509V3_EXT_D2I d2i; + X509V3_EXT_I2D i2d; +/* The following pair is used for string extensions */ + X509V3_EXT_I2S i2s; + X509V3_EXT_S2I s2i; +/* The following pair is used for multi-valued extensions */ + X509V3_EXT_I2V i2v; + X509V3_EXT_V2I v2i; +/* The following are used for raw extensions */ + X509V3_EXT_I2R i2r; + X509V3_EXT_R2I r2i; + void *usr_data; /* Any extension specific data */ +}; + +typedef struct X509V3_CONF_METHOD_st { + char *(*get_string) (void *db, char *section, char *value); + STACK_OF(CONF_VALUE) *(*get_section) (void *db, char *section); + void (*free_string) (void *db, char *string); + void (*free_section) (void *db, STACK_OF(CONF_VALUE) *section); +} X509V3_CONF_METHOD; + +/* Context specific info */ +struct v3_ext_ctx { +# define CTX_TEST 0x1 + int flags; + X509 *issuer_cert; + X509 *subject_cert; + X509_REQ *subject_req; + X509_CRL *crl; + X509V3_CONF_METHOD *db_meth; + void *db; +/* Maybe more here */ +}; + +typedef struct v3_ext_method X509V3_EXT_METHOD; + +DECLARE_STACK_OF(X509V3_EXT_METHOD) + +/* ext_flags values */ +# define X509V3_EXT_DYNAMIC 0x1 +# define X509V3_EXT_CTX_DEP 0x2 +# define X509V3_EXT_MULTILINE 0x4 + +typedef BIT_STRING_BITNAME ENUMERATED_NAMES; + +typedef struct BASIC_CONSTRAINTS_st { + int ca; + ASN1_INTEGER *pathlen; +} BASIC_CONSTRAINTS; + +typedef struct PKEY_USAGE_PERIOD_st { + ASN1_GENERALIZEDTIME *notBefore; + ASN1_GENERALIZEDTIME *notAfter; +} PKEY_USAGE_PERIOD; + +typedef struct otherName_st { + ASN1_OBJECT *type_id; + ASN1_TYPE *value; +} OTHERNAME; + +typedef struct EDIPartyName_st { + ASN1_STRING *nameAssigner; + ASN1_STRING *partyName; +} EDIPARTYNAME; + +typedef struct GENERAL_NAME_st { +# define GEN_OTHERNAME 0 +# define GEN_EMAIL 1 +# define GEN_DNS 2 +# define GEN_X400 3 +# define GEN_DIRNAME 4 +# define GEN_EDIPARTY 5 +# define GEN_URI 6 +# define GEN_IPADD 7 +# define GEN_RID 8 + int type; + union { + char *ptr; + OTHERNAME *otherName; /* otherName */ + ASN1_IA5STRING *rfc822Name; + ASN1_IA5STRING *dNSName; + ASN1_TYPE *x400Address; + X509_NAME *directoryName; + EDIPARTYNAME *ediPartyName; + ASN1_IA5STRING *uniformResourceIdentifier; + ASN1_OCTET_STRING *iPAddress; + ASN1_OBJECT *registeredID; + /* Old names */ + ASN1_OCTET_STRING *ip; /* iPAddress */ + X509_NAME *dirn; /* dirn */ + ASN1_IA5STRING *ia5; /* rfc822Name, dNSName, + * uniformResourceIdentifier */ + ASN1_OBJECT *rid; /* registeredID */ + ASN1_TYPE *other; /* x400Address */ + } d; +} GENERAL_NAME; + +typedef STACK_OF(GENERAL_NAME) GENERAL_NAMES; + +typedef struct ACCESS_DESCRIPTION_st { + ASN1_OBJECT *method; + GENERAL_NAME *location; +} ACCESS_DESCRIPTION; + +typedef STACK_OF(ACCESS_DESCRIPTION) AUTHORITY_INFO_ACCESS; + +typedef STACK_OF(ASN1_OBJECT) EXTENDED_KEY_USAGE; + +DECLARE_STACK_OF(GENERAL_NAME) +DECLARE_ASN1_SET_OF(GENERAL_NAME) + +DECLARE_STACK_OF(ACCESS_DESCRIPTION) +DECLARE_ASN1_SET_OF(ACCESS_DESCRIPTION) + +typedef struct DIST_POINT_NAME_st { + int type; + union { + GENERAL_NAMES *fullname; + STACK_OF(X509_NAME_ENTRY) *relativename; + } name; +/* If relativename then this contains the full distribution point name */ + X509_NAME *dpname; +} DIST_POINT_NAME; +/* All existing reasons */ +# define CRLDP_ALL_REASONS 0x807f + +# define CRL_REASON_NONE -1 +# define CRL_REASON_UNSPECIFIED 0 +# define CRL_REASON_KEY_COMPROMISE 1 +# define CRL_REASON_CA_COMPROMISE 2 +# define CRL_REASON_AFFILIATION_CHANGED 3 +# define CRL_REASON_SUPERSEDED 4 +# define CRL_REASON_CESSATION_OF_OPERATION 5 +# define CRL_REASON_CERTIFICATE_HOLD 6 +# define CRL_REASON_REMOVE_FROM_CRL 8 +# define CRL_REASON_PRIVILEGE_WITHDRAWN 9 +# define CRL_REASON_AA_COMPROMISE 10 + +struct DIST_POINT_st { + DIST_POINT_NAME *distpoint; + ASN1_BIT_STRING *reasons; + GENERAL_NAMES *CRLissuer; + int dp_reasons; +}; + +typedef STACK_OF(DIST_POINT) CRL_DIST_POINTS; + +DECLARE_STACK_OF(DIST_POINT) +DECLARE_ASN1_SET_OF(DIST_POINT) + +struct AUTHORITY_KEYID_st { + ASN1_OCTET_STRING *keyid; + GENERAL_NAMES *issuer; + ASN1_INTEGER *serial; +}; + +/* Strong extranet structures */ + +typedef struct SXNET_ID_st { + ASN1_INTEGER *zone; + ASN1_OCTET_STRING *user; +} SXNETID; + +DECLARE_STACK_OF(SXNETID) +DECLARE_ASN1_SET_OF(SXNETID) + +typedef struct SXNET_st { + ASN1_INTEGER *version; + STACK_OF(SXNETID) *ids; +} SXNET; + +typedef struct NOTICEREF_st { + ASN1_STRING *organization; + STACK_OF(ASN1_INTEGER) *noticenos; +} NOTICEREF; + +typedef struct USERNOTICE_st { + NOTICEREF *noticeref; + ASN1_STRING *exptext; +} USERNOTICE; + +typedef struct POLICYQUALINFO_st { + ASN1_OBJECT *pqualid; + union { + ASN1_IA5STRING *cpsuri; + USERNOTICE *usernotice; + ASN1_TYPE *other; + } d; +} POLICYQUALINFO; + +DECLARE_STACK_OF(POLICYQUALINFO) +DECLARE_ASN1_SET_OF(POLICYQUALINFO) + +typedef struct POLICYINFO_st { + ASN1_OBJECT *policyid; + STACK_OF(POLICYQUALINFO) *qualifiers; +} POLICYINFO; + +typedef STACK_OF(POLICYINFO) CERTIFICATEPOLICIES; + +DECLARE_STACK_OF(POLICYINFO) +DECLARE_ASN1_SET_OF(POLICYINFO) + +typedef struct POLICY_MAPPING_st { + ASN1_OBJECT *issuerDomainPolicy; + ASN1_OBJECT *subjectDomainPolicy; +} POLICY_MAPPING; + +DECLARE_STACK_OF(POLICY_MAPPING) + +typedef STACK_OF(POLICY_MAPPING) POLICY_MAPPINGS; + +typedef struct GENERAL_SUBTREE_st { + GENERAL_NAME *base; + ASN1_INTEGER *minimum; + ASN1_INTEGER *maximum; +} GENERAL_SUBTREE; + +DECLARE_STACK_OF(GENERAL_SUBTREE) + +struct NAME_CONSTRAINTS_st { + STACK_OF(GENERAL_SUBTREE) *permittedSubtrees; + STACK_OF(GENERAL_SUBTREE) *excludedSubtrees; +}; + +typedef struct POLICY_CONSTRAINTS_st { + ASN1_INTEGER *requireExplicitPolicy; + ASN1_INTEGER *inhibitPolicyMapping; +} POLICY_CONSTRAINTS; + +/* Proxy certificate structures, see RFC 3820 */ +typedef struct PROXY_POLICY_st { + ASN1_OBJECT *policyLanguage; + ASN1_OCTET_STRING *policy; +} PROXY_POLICY; + +typedef struct PROXY_CERT_INFO_EXTENSION_st { + ASN1_INTEGER *pcPathLengthConstraint; + PROXY_POLICY *proxyPolicy; +} PROXY_CERT_INFO_EXTENSION; + +DECLARE_ASN1_FUNCTIONS(PROXY_POLICY) +DECLARE_ASN1_FUNCTIONS(PROXY_CERT_INFO_EXTENSION) + +struct ISSUING_DIST_POINT_st { + DIST_POINT_NAME *distpoint; + int onlyuser; + int onlyCA; + ASN1_BIT_STRING *onlysomereasons; + int indirectCRL; + int onlyattr; +}; + +/* Values in idp_flags field */ +/* IDP present */ +# define IDP_PRESENT 0x1 +/* IDP values inconsistent */ +# define IDP_INVALID 0x2 +/* onlyuser true */ +# define IDP_ONLYUSER 0x4 +/* onlyCA true */ +# define IDP_ONLYCA 0x8 +/* onlyattr true */ +# define IDP_ONLYATTR 0x10 +/* indirectCRL true */ +# define IDP_INDIRECT 0x20 +/* onlysomereasons present */ +# define IDP_REASONS 0x40 + +# define X509V3_conf_err(val) ERR_add_error_data(6, "section:", val->section, \ +",name:", val->name, ",value:", val->value); + +# define X509V3_set_ctx_test(ctx) \ + X509V3_set_ctx(ctx, NULL, NULL, NULL, NULL, CTX_TEST) +# define X509V3_set_ctx_nodb(ctx) (ctx)->db = NULL; + +# define EXT_BITSTRING(nid, table) { nid, 0, ASN1_ITEM_ref(ASN1_BIT_STRING), \ + 0,0,0,0, \ + 0,0, \ + (X509V3_EXT_I2V)i2v_ASN1_BIT_STRING, \ + (X509V3_EXT_V2I)v2i_ASN1_BIT_STRING, \ + NULL, NULL, \ + table} + +# define EXT_IA5STRING(nid) { nid, 0, ASN1_ITEM_ref(ASN1_IA5STRING), \ + 0,0,0,0, \ + (X509V3_EXT_I2S)i2s_ASN1_IA5STRING, \ + (X509V3_EXT_S2I)s2i_ASN1_IA5STRING, \ + 0,0,0,0, \ + NULL} + +# define EXT_END { -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} + +/* X509_PURPOSE stuff */ + +# define EXFLAG_BCONS 0x1 +# define EXFLAG_KUSAGE 0x2 +# define EXFLAG_XKUSAGE 0x4 +# define EXFLAG_NSCERT 0x8 + +# define EXFLAG_CA 0x10 +/* Really self issued not necessarily self signed */ +# define EXFLAG_SI 0x20 +# define EXFLAG_V1 0x40 +# define EXFLAG_INVALID 0x80 +# define EXFLAG_SET 0x100 +# define EXFLAG_CRITICAL 0x200 +# define EXFLAG_PROXY 0x400 + +# define EXFLAG_INVALID_POLICY 0x800 +# define EXFLAG_FRESHEST 0x1000 +/* Self signed */ +# define EXFLAG_SS 0x2000 + +# define KU_DIGITAL_SIGNATURE 0x0080 +# define KU_NON_REPUDIATION 0x0040 +# define KU_KEY_ENCIPHERMENT 0x0020 +# define KU_DATA_ENCIPHERMENT 0x0010 +# define KU_KEY_AGREEMENT 0x0008 +# define KU_KEY_CERT_SIGN 0x0004 +# define KU_CRL_SIGN 0x0002 +# define KU_ENCIPHER_ONLY 0x0001 +# define KU_DECIPHER_ONLY 0x8000 + +# define NS_SSL_CLIENT 0x80 +# define NS_SSL_SERVER 0x40 +# define NS_SMIME 0x20 +# define NS_OBJSIGN 0x10 +# define NS_SSL_CA 0x04 +# define NS_SMIME_CA 0x02 +# define NS_OBJSIGN_CA 0x01 +# define NS_ANY_CA (NS_SSL_CA|NS_SMIME_CA|NS_OBJSIGN_CA) + +# define XKU_SSL_SERVER 0x1 +# define XKU_SSL_CLIENT 0x2 +# define XKU_SMIME 0x4 +# define XKU_CODE_SIGN 0x8 +# define XKU_SGC 0x10 +# define XKU_OCSP_SIGN 0x20 +# define XKU_TIMESTAMP 0x40 +# define XKU_DVCS 0x80 +# define XKU_ANYEKU 0x100 + +# define X509_PURPOSE_DYNAMIC 0x1 +# define X509_PURPOSE_DYNAMIC_NAME 0x2 + +typedef struct x509_purpose_st { + int purpose; + int trust; /* Default trust ID */ + int flags; + int (*check_purpose) (const struct x509_purpose_st *, const X509 *, int); + char *name; + char *sname; + void *usr_data; +} X509_PURPOSE; + +# define X509_PURPOSE_SSL_CLIENT 1 +# define X509_PURPOSE_SSL_SERVER 2 +# define X509_PURPOSE_NS_SSL_SERVER 3 +# define X509_PURPOSE_SMIME_SIGN 4 +# define X509_PURPOSE_SMIME_ENCRYPT 5 +# define X509_PURPOSE_CRL_SIGN 6 +# define X509_PURPOSE_ANY 7 +# define X509_PURPOSE_OCSP_HELPER 8 +# define X509_PURPOSE_TIMESTAMP_SIGN 9 + +# define X509_PURPOSE_MIN 1 +# define X509_PURPOSE_MAX 9 + +/* Flags for X509V3_EXT_print() */ + +# define X509V3_EXT_UNKNOWN_MASK (0xfL << 16) +/* Return error for unknown extensions */ +# define X509V3_EXT_DEFAULT 0 +/* Print error for unknown extensions */ +# define X509V3_EXT_ERROR_UNKNOWN (1L << 16) +/* ASN1 parse unknown extensions */ +# define X509V3_EXT_PARSE_UNKNOWN (2L << 16) +/* BIO_dump unknown extensions */ +# define X509V3_EXT_DUMP_UNKNOWN (3L << 16) + +/* Flags for X509V3_add1_i2d */ + +# define X509V3_ADD_OP_MASK 0xfL +# define X509V3_ADD_DEFAULT 0L +# define X509V3_ADD_APPEND 1L +# define X509V3_ADD_REPLACE 2L +# define X509V3_ADD_REPLACE_EXISTING 3L +# define X509V3_ADD_KEEP_EXISTING 4L +# define X509V3_ADD_DELETE 5L +# define X509V3_ADD_SILENT 0x10 + +DECLARE_STACK_OF(X509_PURPOSE) + +DECLARE_ASN1_FUNCTIONS(BASIC_CONSTRAINTS) + +DECLARE_ASN1_FUNCTIONS(SXNET) +DECLARE_ASN1_FUNCTIONS(SXNETID) + +int SXNET_add_id_asc(SXNET **psx, char *zone, char *user, int userlen); +int SXNET_add_id_ulong(SXNET **psx, unsigned long lzone, char *user, + int userlen); +int SXNET_add_id_INTEGER(SXNET **psx, ASN1_INTEGER *izone, char *user, + int userlen); + +ASN1_OCTET_STRING *SXNET_get_id_asc(SXNET *sx, char *zone); +ASN1_OCTET_STRING *SXNET_get_id_ulong(SXNET *sx, unsigned long lzone); +ASN1_OCTET_STRING *SXNET_get_id_INTEGER(SXNET *sx, ASN1_INTEGER *zone); + +DECLARE_ASN1_FUNCTIONS(AUTHORITY_KEYID) + +DECLARE_ASN1_FUNCTIONS(PKEY_USAGE_PERIOD) + +DECLARE_ASN1_FUNCTIONS(GENERAL_NAME) +GENERAL_NAME *GENERAL_NAME_dup(GENERAL_NAME *a); +int GENERAL_NAME_cmp(GENERAL_NAME *a, GENERAL_NAME *b); + +ASN1_BIT_STRING *v2i_ASN1_BIT_STRING(X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, + STACK_OF(CONF_VALUE) *nval); +STACK_OF(CONF_VALUE) *i2v_ASN1_BIT_STRING(X509V3_EXT_METHOD *method, + ASN1_BIT_STRING *bits, + STACK_OF(CONF_VALUE) *extlist); + +STACK_OF(CONF_VALUE) *i2v_GENERAL_NAME(X509V3_EXT_METHOD *method, + GENERAL_NAME *gen, + STACK_OF(CONF_VALUE) *ret); +int GENERAL_NAME_print(BIO *out, GENERAL_NAME *gen); + +DECLARE_ASN1_FUNCTIONS(GENERAL_NAMES) + +STACK_OF(CONF_VALUE) *i2v_GENERAL_NAMES(X509V3_EXT_METHOD *method, + GENERAL_NAMES *gen, + STACK_OF(CONF_VALUE) *extlist); +GENERAL_NAMES *v2i_GENERAL_NAMES(const X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval); + +DECLARE_ASN1_FUNCTIONS(OTHERNAME) +DECLARE_ASN1_FUNCTIONS(EDIPARTYNAME) +int OTHERNAME_cmp(OTHERNAME *a, OTHERNAME *b); +void GENERAL_NAME_set0_value(GENERAL_NAME *a, int type, void *value); +void *GENERAL_NAME_get0_value(GENERAL_NAME *a, int *ptype); +int GENERAL_NAME_set0_othername(GENERAL_NAME *gen, + ASN1_OBJECT *oid, ASN1_TYPE *value); +int GENERAL_NAME_get0_otherName(GENERAL_NAME *gen, + ASN1_OBJECT **poid, ASN1_TYPE **pvalue); + +char *i2s_ASN1_OCTET_STRING(X509V3_EXT_METHOD *method, + ASN1_OCTET_STRING *ia5); +ASN1_OCTET_STRING *s2i_ASN1_OCTET_STRING(X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, char *str); + +DECLARE_ASN1_FUNCTIONS(EXTENDED_KEY_USAGE) +int i2a_ACCESS_DESCRIPTION(BIO *bp, ACCESS_DESCRIPTION *a); + +DECLARE_ASN1_FUNCTIONS(CERTIFICATEPOLICIES) +DECLARE_ASN1_FUNCTIONS(POLICYINFO) +DECLARE_ASN1_FUNCTIONS(POLICYQUALINFO) +DECLARE_ASN1_FUNCTIONS(USERNOTICE) +DECLARE_ASN1_FUNCTIONS(NOTICEREF) + +DECLARE_ASN1_FUNCTIONS(CRL_DIST_POINTS) +DECLARE_ASN1_FUNCTIONS(DIST_POINT) +DECLARE_ASN1_FUNCTIONS(DIST_POINT_NAME) +DECLARE_ASN1_FUNCTIONS(ISSUING_DIST_POINT) + +int DIST_POINT_set_dpname(DIST_POINT_NAME *dpn, X509_NAME *iname); + +int NAME_CONSTRAINTS_check(X509 *x, NAME_CONSTRAINTS *nc); + +DECLARE_ASN1_FUNCTIONS(ACCESS_DESCRIPTION) +DECLARE_ASN1_FUNCTIONS(AUTHORITY_INFO_ACCESS) + +DECLARE_ASN1_ITEM(POLICY_MAPPING) +DECLARE_ASN1_ALLOC_FUNCTIONS(POLICY_MAPPING) +DECLARE_ASN1_ITEM(POLICY_MAPPINGS) + +DECLARE_ASN1_ITEM(GENERAL_SUBTREE) +DECLARE_ASN1_ALLOC_FUNCTIONS(GENERAL_SUBTREE) + +DECLARE_ASN1_ITEM(NAME_CONSTRAINTS) +DECLARE_ASN1_ALLOC_FUNCTIONS(NAME_CONSTRAINTS) + +DECLARE_ASN1_ALLOC_FUNCTIONS(POLICY_CONSTRAINTS) +DECLARE_ASN1_ITEM(POLICY_CONSTRAINTS) + +GENERAL_NAME *a2i_GENERAL_NAME(GENERAL_NAME *out, + const X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, int gen_type, char *value, + int is_nc); + +# ifdef HEADER_CONF_H +GENERAL_NAME *v2i_GENERAL_NAME(const X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, CONF_VALUE *cnf); +GENERAL_NAME *v2i_GENERAL_NAME_ex(GENERAL_NAME *out, + const X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, CONF_VALUE *cnf, + int is_nc); +void X509V3_conf_free(CONF_VALUE *val); + +X509_EXTENSION *X509V3_EXT_nconf_nid(CONF *conf, X509V3_CTX *ctx, int ext_nid, + char *value); +X509_EXTENSION *X509V3_EXT_nconf(CONF *conf, X509V3_CTX *ctx, char *name, + char *value); +int X509V3_EXT_add_nconf_sk(CONF *conf, X509V3_CTX *ctx, char *section, + STACK_OF(X509_EXTENSION) **sk); +int X509V3_EXT_add_nconf(CONF *conf, X509V3_CTX *ctx, char *section, + X509 *cert); +int X509V3_EXT_REQ_add_nconf(CONF *conf, X509V3_CTX *ctx, char *section, + X509_REQ *req); +int X509V3_EXT_CRL_add_nconf(CONF *conf, X509V3_CTX *ctx, char *section, + X509_CRL *crl); + +X509_EXTENSION *X509V3_EXT_conf_nid(LHASH_OF(CONF_VALUE) *conf, + X509V3_CTX *ctx, int ext_nid, + char *value); +X509_EXTENSION *X509V3_EXT_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx, + char *name, char *value); +int X509V3_EXT_add_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx, + char *section, X509 *cert); +int X509V3_EXT_REQ_add_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx, + char *section, X509_REQ *req); +int X509V3_EXT_CRL_add_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx, + char *section, X509_CRL *crl); + +int X509V3_add_value_bool_nf(char *name, int asn1_bool, + STACK_OF(CONF_VALUE) **extlist); +int X509V3_get_value_bool(CONF_VALUE *value, int *asn1_bool); +int X509V3_get_value_int(CONF_VALUE *value, ASN1_INTEGER **aint); +void X509V3_set_nconf(X509V3_CTX *ctx, CONF *conf); +void X509V3_set_conf_lhash(X509V3_CTX *ctx, LHASH_OF(CONF_VALUE) *lhash); +# endif + +char *X509V3_get_string(X509V3_CTX *ctx, char *name, char *section); +STACK_OF(CONF_VALUE) *X509V3_get_section(X509V3_CTX *ctx, char *section); +void X509V3_string_free(X509V3_CTX *ctx, char *str); +void X509V3_section_free(X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *section); +void X509V3_set_ctx(X509V3_CTX *ctx, X509 *issuer, X509 *subject, + X509_REQ *req, X509_CRL *crl, int flags); + +int X509V3_add_value(const char *name, const char *value, + STACK_OF(CONF_VALUE) **extlist); +int X509V3_add_value_uchar(const char *name, const unsigned char *value, + STACK_OF(CONF_VALUE) **extlist); +int X509V3_add_value_bool(const char *name, int asn1_bool, + STACK_OF(CONF_VALUE) **extlist); +int X509V3_add_value_int(const char *name, ASN1_INTEGER *aint, + STACK_OF(CONF_VALUE) **extlist); +char *i2s_ASN1_INTEGER(X509V3_EXT_METHOD *meth, ASN1_INTEGER *aint); +ASN1_INTEGER *s2i_ASN1_INTEGER(X509V3_EXT_METHOD *meth, char *value); +char *i2s_ASN1_ENUMERATED(X509V3_EXT_METHOD *meth, ASN1_ENUMERATED *aint); +char *i2s_ASN1_ENUMERATED_TABLE(X509V3_EXT_METHOD *meth, + ASN1_ENUMERATED *aint); +int X509V3_EXT_add(X509V3_EXT_METHOD *ext); +int X509V3_EXT_add_list(X509V3_EXT_METHOD *extlist); +int X509V3_EXT_add_alias(int nid_to, int nid_from); +void X509V3_EXT_cleanup(void); + +const X509V3_EXT_METHOD *X509V3_EXT_get(X509_EXTENSION *ext); +const X509V3_EXT_METHOD *X509V3_EXT_get_nid(int nid); +int X509V3_add_standard_extensions(void); +STACK_OF(CONF_VALUE) *X509V3_parse_list(const char *line); +void *X509V3_EXT_d2i(X509_EXTENSION *ext); +void *X509V3_get_d2i(STACK_OF(X509_EXTENSION) *x, int nid, int *crit, + int *idx); +int X509V3_EXT_free(int nid, void *ext_data); + +X509_EXTENSION *X509V3_EXT_i2d(int ext_nid, int crit, void *ext_struc); +int X509V3_add1_i2d(STACK_OF(X509_EXTENSION) **x, int nid, void *value, + int crit, unsigned long flags); + +char *hex_to_string(const unsigned char *buffer, long len); +unsigned char *string_to_hex(const char *str, long *len); +int name_cmp(const char *name, const char *cmp); + +void X509V3_EXT_val_prn(BIO *out, STACK_OF(CONF_VALUE) *val, int indent, + int ml); +int X509V3_EXT_print(BIO *out, X509_EXTENSION *ext, unsigned long flag, + int indent); +int X509V3_EXT_print_fp(FILE *out, X509_EXTENSION *ext, int flag, int indent); + +int X509V3_extensions_print(BIO *out, char *title, + STACK_OF(X509_EXTENSION) *exts, + unsigned long flag, int indent); + +int X509_check_ca(X509 *x); +int X509_check_purpose(X509 *x, int id, int ca); +int X509_supported_extension(X509_EXTENSION *ex); +int X509_PURPOSE_set(int *p, int purpose); +int X509_check_issued(X509 *issuer, X509 *subject); +int X509_check_akid(X509 *issuer, AUTHORITY_KEYID *akid); +int X509_PURPOSE_get_count(void); +X509_PURPOSE *X509_PURPOSE_get0(int idx); +int X509_PURPOSE_get_by_sname(char *sname); +int X509_PURPOSE_get_by_id(int id); +int X509_PURPOSE_add(int id, int trust, int flags, + int (*ck) (const X509_PURPOSE *, const X509 *, int), + char *name, char *sname, void *arg); +char *X509_PURPOSE_get0_name(X509_PURPOSE *xp); +char *X509_PURPOSE_get0_sname(X509_PURPOSE *xp); +int X509_PURPOSE_get_trust(X509_PURPOSE *xp); +void X509_PURPOSE_cleanup(void); +int X509_PURPOSE_get_id(X509_PURPOSE *); + +STACK_OF(OPENSSL_STRING) *X509_get1_email(X509 *x); +STACK_OF(OPENSSL_STRING) *X509_REQ_get1_email(X509_REQ *x); +void X509_email_free(STACK_OF(OPENSSL_STRING) *sk); +STACK_OF(OPENSSL_STRING) *X509_get1_ocsp(X509 *x); +/* Flags for X509_check_* functions */ + +/* + * Always check subject name for host match even if subject alt names present + */ +# define X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT 0x1 +/* Disable wildcard matching for dnsName fields and common name. */ +# define X509_CHECK_FLAG_NO_WILDCARDS 0x2 +/* Wildcards must not match a partial label. */ +# define X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS 0x4 +/* Allow (non-partial) wildcards to match multiple labels. */ +# define X509_CHECK_FLAG_MULTI_LABEL_WILDCARDS 0x8 +/* Constraint verifier subdomain patterns to match a single labels. */ +# define X509_CHECK_FLAG_SINGLE_LABEL_SUBDOMAINS 0x10 +/* + * Match reference identifiers starting with "." to any sub-domain. + * This is a non-public flag, turned on implicitly when the subject + * reference identity is a DNS name. + */ +# define _X509_CHECK_FLAG_DOT_SUBDOMAINS 0x8000 + +int X509_check_host(X509 *x, const char *chk, size_t chklen, + unsigned int flags, char **peername); +int X509_check_email(X509 *x, const char *chk, size_t chklen, + unsigned int flags); +int X509_check_ip(X509 *x, const unsigned char *chk, size_t chklen, + unsigned int flags); +int X509_check_ip_asc(X509 *x, const char *ipasc, unsigned int flags); + +ASN1_OCTET_STRING *a2i_IPADDRESS(const char *ipasc); +ASN1_OCTET_STRING *a2i_IPADDRESS_NC(const char *ipasc); +int a2i_ipadd(unsigned char *ipout, const char *ipasc); +int X509V3_NAME_from_section(X509_NAME *nm, STACK_OF(CONF_VALUE) *dn_sk, + unsigned long chtype); + +void X509_POLICY_NODE_print(BIO *out, X509_POLICY_NODE *node, int indent); +DECLARE_STACK_OF(X509_POLICY_NODE) + +# ifndef OPENSSL_NO_RFC3779 + +typedef struct ASRange_st { + ASN1_INTEGER *min, *max; +} ASRange; + +# define ASIdOrRange_id 0 +# define ASIdOrRange_range 1 + +typedef struct ASIdOrRange_st { + int type; + union { + ASN1_INTEGER *id; + ASRange *range; + } u; +} ASIdOrRange; + +typedef STACK_OF(ASIdOrRange) ASIdOrRanges; +DECLARE_STACK_OF(ASIdOrRange) + +# define ASIdentifierChoice_inherit 0 +# define ASIdentifierChoice_asIdsOrRanges 1 + +typedef struct ASIdentifierChoice_st { + int type; + union { + ASN1_NULL *inherit; + ASIdOrRanges *asIdsOrRanges; + } u; +} ASIdentifierChoice; + +typedef struct ASIdentifiers_st { + ASIdentifierChoice *asnum, *rdi; +} ASIdentifiers; + +DECLARE_ASN1_FUNCTIONS(ASRange) +DECLARE_ASN1_FUNCTIONS(ASIdOrRange) +DECLARE_ASN1_FUNCTIONS(ASIdentifierChoice) +DECLARE_ASN1_FUNCTIONS(ASIdentifiers) + +typedef struct IPAddressRange_st { + ASN1_BIT_STRING *min, *max; +} IPAddressRange; + +# define IPAddressOrRange_addressPrefix 0 +# define IPAddressOrRange_addressRange 1 + +typedef struct IPAddressOrRange_st { + int type; + union { + ASN1_BIT_STRING *addressPrefix; + IPAddressRange *addressRange; + } u; +} IPAddressOrRange; + +typedef STACK_OF(IPAddressOrRange) IPAddressOrRanges; +DECLARE_STACK_OF(IPAddressOrRange) + +# define IPAddressChoice_inherit 0 +# define IPAddressChoice_addressesOrRanges 1 + +typedef struct IPAddressChoice_st { + int type; + union { + ASN1_NULL *inherit; + IPAddressOrRanges *addressesOrRanges; + } u; +} IPAddressChoice; + +typedef struct IPAddressFamily_st { + ASN1_OCTET_STRING *addressFamily; + IPAddressChoice *ipAddressChoice; +} IPAddressFamily; + +typedef STACK_OF(IPAddressFamily) IPAddrBlocks; +DECLARE_STACK_OF(IPAddressFamily) + +DECLARE_ASN1_FUNCTIONS(IPAddressRange) +DECLARE_ASN1_FUNCTIONS(IPAddressOrRange) +DECLARE_ASN1_FUNCTIONS(IPAddressChoice) +DECLARE_ASN1_FUNCTIONS(IPAddressFamily) + +/* + * API tag for elements of the ASIdentifer SEQUENCE. + */ +# define V3_ASID_ASNUM 0 +# define V3_ASID_RDI 1 + +/* + * AFI values, assigned by IANA. It'd be nice to make the AFI + * handling code totally generic, but there are too many little things + * that would need to be defined for other address families for it to + * be worth the trouble. + */ +# define IANA_AFI_IPV4 1 +# define IANA_AFI_IPV6 2 + +/* + * Utilities to construct and extract values from RFC3779 extensions, + * since some of the encodings (particularly for IP address prefixes + * and ranges) are a bit tedious to work with directly. + */ +int v3_asid_add_inherit(ASIdentifiers *asid, int which); +int v3_asid_add_id_or_range(ASIdentifiers *asid, int which, + ASN1_INTEGER *min, ASN1_INTEGER *max); +int v3_addr_add_inherit(IPAddrBlocks *addr, + const unsigned afi, const unsigned *safi); +int v3_addr_add_prefix(IPAddrBlocks *addr, + const unsigned afi, const unsigned *safi, + unsigned char *a, const int prefixlen); +int v3_addr_add_range(IPAddrBlocks *addr, + const unsigned afi, const unsigned *safi, + unsigned char *min, unsigned char *max); +unsigned v3_addr_get_afi(const IPAddressFamily *f); +int v3_addr_get_range(IPAddressOrRange *aor, const unsigned afi, + unsigned char *min, unsigned char *max, + const int length); + +/* + * Canonical forms. + */ +int v3_asid_is_canonical(ASIdentifiers *asid); +int v3_addr_is_canonical(IPAddrBlocks *addr); +int v3_asid_canonize(ASIdentifiers *asid); +int v3_addr_canonize(IPAddrBlocks *addr); + +/* + * Tests for inheritance and containment. + */ +int v3_asid_inherits(ASIdentifiers *asid); +int v3_addr_inherits(IPAddrBlocks *addr); +int v3_asid_subset(ASIdentifiers *a, ASIdentifiers *b); +int v3_addr_subset(IPAddrBlocks *a, IPAddrBlocks *b); + +/* + * Check whether RFC 3779 extensions nest properly in chains. + */ +int v3_asid_validate_path(X509_STORE_CTX *); +int v3_addr_validate_path(X509_STORE_CTX *); +int v3_asid_validate_resource_set(STACK_OF(X509) *chain, + ASIdentifiers *ext, int allow_inheritance); +int v3_addr_validate_resource_set(STACK_OF(X509) *chain, + IPAddrBlocks *ext, int allow_inheritance); + +# endif /* OPENSSL_NO_RFC3779 */ + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_X509V3_strings(void); + +/* Error codes for the X509V3 functions. */ + +/* Function codes. */ +# define X509V3_F_A2I_GENERAL_NAME 164 +# define X509V3_F_ASIDENTIFIERCHOICE_CANONIZE 161 +# define X509V3_F_ASIDENTIFIERCHOICE_IS_CANONICAL 162 +# define X509V3_F_COPY_EMAIL 122 +# define X509V3_F_COPY_ISSUER 123 +# define X509V3_F_DO_DIRNAME 144 +# define X509V3_F_DO_EXT_CONF 124 +# define X509V3_F_DO_EXT_I2D 135 +# define X509V3_F_DO_EXT_NCONF 151 +# define X509V3_F_DO_I2V_NAME_CONSTRAINTS 148 +# define X509V3_F_GNAMES_FROM_SECTNAME 156 +# define X509V3_F_HEX_TO_STRING 111 +# define X509V3_F_I2S_ASN1_ENUMERATED 121 +# define X509V3_F_I2S_ASN1_IA5STRING 149 +# define X509V3_F_I2S_ASN1_INTEGER 120 +# define X509V3_F_I2V_AUTHORITY_INFO_ACCESS 138 +# define X509V3_F_NOTICE_SECTION 132 +# define X509V3_F_NREF_NOS 133 +# define X509V3_F_POLICY_SECTION 131 +# define X509V3_F_PROCESS_PCI_VALUE 150 +# define X509V3_F_R2I_CERTPOL 130 +# define X509V3_F_R2I_PCI 155 +# define X509V3_F_S2I_ASN1_IA5STRING 100 +# define X509V3_F_S2I_ASN1_INTEGER 108 +# define X509V3_F_S2I_ASN1_OCTET_STRING 112 +# define X509V3_F_S2I_ASN1_SKEY_ID 114 +# define X509V3_F_S2I_SKEY_ID 115 +# define X509V3_F_SET_DIST_POINT_NAME 158 +# define X509V3_F_STRING_TO_HEX 113 +# define X509V3_F_SXNET_ADD_ID_ASC 125 +# define X509V3_F_SXNET_ADD_ID_INTEGER 126 +# define X509V3_F_SXNET_ADD_ID_ULONG 127 +# define X509V3_F_SXNET_GET_ID_ASC 128 +# define X509V3_F_SXNET_GET_ID_ULONG 129 +# define X509V3_F_V2I_ASIDENTIFIERS 163 +# define X509V3_F_V2I_ASN1_BIT_STRING 101 +# define X509V3_F_V2I_AUTHORITY_INFO_ACCESS 139 +# define X509V3_F_V2I_AUTHORITY_KEYID 119 +# define X509V3_F_V2I_BASIC_CONSTRAINTS 102 +# define X509V3_F_V2I_CRLD 134 +# define X509V3_F_V2I_EXTENDED_KEY_USAGE 103 +# define X509V3_F_V2I_GENERAL_NAMES 118 +# define X509V3_F_V2I_GENERAL_NAME_EX 117 +# define X509V3_F_V2I_IDP 157 +# define X509V3_F_V2I_IPADDRBLOCKS 159 +# define X509V3_F_V2I_ISSUER_ALT 153 +# define X509V3_F_V2I_NAME_CONSTRAINTS 147 +# define X509V3_F_V2I_POLICY_CONSTRAINTS 146 +# define X509V3_F_V2I_POLICY_MAPPINGS 145 +# define X509V3_F_V2I_SUBJECT_ALT 154 +# define X509V3_F_V3_ADDR_VALIDATE_PATH_INTERNAL 160 +# define X509V3_F_V3_GENERIC_EXTENSION 116 +# define X509V3_F_X509V3_ADD1_I2D 140 +# define X509V3_F_X509V3_ADD_VALUE 105 +# define X509V3_F_X509V3_EXT_ADD 104 +# define X509V3_F_X509V3_EXT_ADD_ALIAS 106 +# define X509V3_F_X509V3_EXT_CONF 107 +# define X509V3_F_X509V3_EXT_FREE 165 +# define X509V3_F_X509V3_EXT_I2D 136 +# define X509V3_F_X509V3_EXT_NCONF 152 +# define X509V3_F_X509V3_GET_SECTION 142 +# define X509V3_F_X509V3_GET_STRING 143 +# define X509V3_F_X509V3_GET_VALUE_BOOL 110 +# define X509V3_F_X509V3_PARSE_LIST 109 +# define X509V3_F_X509_PURPOSE_ADD 137 +# define X509V3_F_X509_PURPOSE_SET 141 + +/* Reason codes. */ +# define X509V3_R_BAD_IP_ADDRESS 118 +# define X509V3_R_BAD_OBJECT 119 +# define X509V3_R_BN_DEC2BN_ERROR 100 +# define X509V3_R_BN_TO_ASN1_INTEGER_ERROR 101 +# define X509V3_R_CANNOT_FIND_FREE_FUNCTION 168 +# define X509V3_R_DIRNAME_ERROR 149 +# define X509V3_R_DISTPOINT_ALREADY_SET 160 +# define X509V3_R_DUPLICATE_ZONE_ID 133 +# define X509V3_R_ERROR_CONVERTING_ZONE 131 +# define X509V3_R_ERROR_CREATING_EXTENSION 144 +# define X509V3_R_ERROR_IN_EXTENSION 128 +# define X509V3_R_EXPECTED_A_SECTION_NAME 137 +# define X509V3_R_EXTENSION_EXISTS 145 +# define X509V3_R_EXTENSION_NAME_ERROR 115 +# define X509V3_R_EXTENSION_NOT_FOUND 102 +# define X509V3_R_EXTENSION_SETTING_NOT_SUPPORTED 103 +# define X509V3_R_EXTENSION_VALUE_ERROR 116 +# define X509V3_R_ILLEGAL_EMPTY_EXTENSION 151 +# define X509V3_R_ILLEGAL_HEX_DIGIT 113 +# define X509V3_R_INCORRECT_POLICY_SYNTAX_TAG 152 +# define X509V3_R_INVALID_ASNUMBER 162 +# define X509V3_R_INVALID_ASRANGE 163 +# define X509V3_R_INVALID_BOOLEAN_STRING 104 +# define X509V3_R_INVALID_EXTENSION_STRING 105 +# define X509V3_R_INVALID_INHERITANCE 165 +# define X509V3_R_INVALID_IPADDRESS 166 +# define X509V3_R_INVALID_MULTIPLE_RDNS 161 +# define X509V3_R_INVALID_NAME 106 +# define X509V3_R_INVALID_NULL_ARGUMENT 107 +# define X509V3_R_INVALID_NULL_NAME 108 +# define X509V3_R_INVALID_NULL_VALUE 109 +# define X509V3_R_INVALID_NUMBER 140 +# define X509V3_R_INVALID_NUMBERS 141 +# define X509V3_R_INVALID_OBJECT_IDENTIFIER 110 +# define X509V3_R_INVALID_OPTION 138 +# define X509V3_R_INVALID_POLICY_IDENTIFIER 134 +# define X509V3_R_INVALID_PROXY_POLICY_SETTING 153 +# define X509V3_R_INVALID_PURPOSE 146 +# define X509V3_R_INVALID_SAFI 164 +# define X509V3_R_INVALID_SECTION 135 +# define X509V3_R_INVALID_SYNTAX 143 +# define X509V3_R_ISSUER_DECODE_ERROR 126 +# define X509V3_R_MISSING_VALUE 124 +# define X509V3_R_NEED_ORGANIZATION_AND_NUMBERS 142 +# define X509V3_R_NO_CONFIG_DATABASE 136 +# define X509V3_R_NO_ISSUER_CERTIFICATE 121 +# define X509V3_R_NO_ISSUER_DETAILS 127 +# define X509V3_R_NO_POLICY_IDENTIFIER 139 +# define X509V3_R_NO_PROXY_CERT_POLICY_LANGUAGE_DEFINED 154 +# define X509V3_R_NO_PUBLIC_KEY 114 +# define X509V3_R_NO_SUBJECT_DETAILS 125 +# define X509V3_R_ODD_NUMBER_OF_DIGITS 112 +# define X509V3_R_OPERATION_NOT_DEFINED 148 +# define X509V3_R_OTHERNAME_ERROR 147 +# define X509V3_R_POLICY_LANGUAGE_ALREADY_DEFINED 155 +# define X509V3_R_POLICY_PATH_LENGTH 156 +# define X509V3_R_POLICY_PATH_LENGTH_ALREADY_DEFINED 157 +# define X509V3_R_POLICY_SYNTAX_NOT_CURRENTLY_SUPPORTED 158 +# define X509V3_R_POLICY_WHEN_PROXY_LANGUAGE_REQUIRES_NO_POLICY 159 +# define X509V3_R_SECTION_NOT_FOUND 150 +# define X509V3_R_UNABLE_TO_GET_ISSUER_DETAILS 122 +# define X509V3_R_UNABLE_TO_GET_ISSUER_KEYID 123 +# define X509V3_R_UNKNOWN_BIT_STRING_ARGUMENT 111 +# define X509V3_R_UNKNOWN_EXTENSION 129 +# define X509V3_R_UNKNOWN_EXTENSION_NAME 130 +# define X509V3_R_UNKNOWN_OPTION 120 +# define X509V3_R_UNSUPPORTED_OPTION 117 +# define X509V3_R_UNSUPPORTED_TYPE 167 +# define X509V3_R_USER_TOO_LONG 132 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/linux/openssl-1.0.2j/libcrypto.a b/hdssd/external/linux/openssl-1.0.2j/libcrypto.a new file mode 100644 index 0000000000000000000000000000000000000000..8e520b35284c5ea4b1511487ecf97a9ea646eb08 GIT binary patch literal 4795236 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μ9)m;>&` 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%0D97IFIy? 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

      B5#(`6pCcc~Ng0H`zX;g<&? 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%0As+kCP^Yb_P`Myxq;uqMR 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

      Zt3xfDB>V$QE` z{M(Ywp_1;;s9}e!q?Ho?+f;>=sv%M-13YUL|KTW4(|X(unw@EM8(3s^_Vj1d9OsLH zC3#X8OeShT)=K;dgz1rNvva9&EAwX=d34kzMnAf_8ly2<3T8)mkQM(NxC zlZK`vp3huX6d(aqG2~Mz!7Tc@4P+1*ND>(c*W}KhiWL(JHyAkBV=o%d2X3@IH544wx(>ewz{P}+|=iDvsTfOp9%o~n=w zBL8ptCK5E2lAwXcvn13}?_*;mrk$Sq@-@aBbPOdsFOhL=1rAE6BOg+#T4 zQDF$g1xX?QZ@Yo{ASk(ZUdeno&j$I_1LYu+davp5saIF7=NaiK77g|9GaPpk--3bY zZC9{P@PDzxt;vV~`Aiz0(|p24Z4dKZs{fOS^w7a7MXnS*WsewA_GmIo*;B4D$z=FK zV*$gd(ssLe;qwW-X1_|(7ZR~@Gr%V>*Dx5B?@2Sc#$GQN&&H@{VDa9a)0`_-!&`uNi)^g%1}oCm7{$c(5KA4Z(Dj34=zTa}{QjruX@5J(S352FYFc_fK`onjiS+XR z6T;Q$=^Eo>Iak8>{EBxn@d*j`nj7VnT%h8yuN--jpV3Gm5buC;@^bP8?#b8whLtCc zsT|5{qU6s@m%}Tr6;E0h0_j^%I?5Q_0wRQ?{pf_}RAra$eGs(ogz#dH$0*UdM2?5^ zcihDOoiQBG;kdlN!_&96sMn`&Jr%+y_p0LQ7Q-hzoa^@q$JcPYnBzZld=JOx^L*Mk zev0D;UPM_O|4YzwJcHvE!I$J3c)9UcE_HP|9?tP#P9Mzi!b%Fzg5%u<&JE`@#|I0X zGya9+HjdAy%~@~@6i?^mcswtEE?!69m?AyJyN4HfzKaB|R~U5U^?Z=y2L7&1kBVGC zT%5-*D!i&wMc_4a_DzLy5%l2?TY5P-D|;xujFLXeQ$#t8zT+@-TwLg@c#~cJ!U%`U zqDjL?Gvcx+XYp)VRC(uLVhOd%Qk4532fkxKugjOE^8BF*Q6^<+<Ks--Hdb4AYahDlukOy&FV|64Mi)ld;PvL*HI&8)(R>wr+ zZS!jv10m9ku)o>yo7r)L39>rQ2_Mf z-+biC+0_@JB`j18p`|S3@9a|(7t84)*SG?n{p3S?u~(H{=6oz=()HF#AfOm}I8UM> z*y?mn2Lj<%$E`;(!6dz&ke>T0linjt(J%zl+fp5GphHn~{7TW$%yldTKSjr_EJQl~ z%0gVnU38Ia+y_tAv5>BrjugXnB+<|@2MC0lvD)O%wakWmGww?8*z}s&am!tHgBgy6 zWvAI6%U`vr63mXxX2%vc$#aaPZ!AxarRU4;xF>nGtd8^9oh{Btoypn1Ce>`b$rPO!VgxcYr z^qb7$Pz=bnTpcM&njmxD9)0c!R)9SW=DcnCTv3{M;4+pflFEzBH<3pvKu@VmB#S;dyiU?zn zvnv%|OJ`SR4-v*-lt!CUOXz1bC?(j2+W_vlVFNwJnq>p9jr|Gw=`Li=HlvbIMsE=!*jQj9J*jONU+FkUIv~&p!3NEhBrj9 zuTJR(ut5N;ZdZVrvFb?FVkz1R9D^^eSFqJ)t8)!oWyY!t^($;+hdH11TG%YImd1J} z%$!$f`veiwiI)S0dADqw9o-9hk=)hTDFh2KnDZx$RWs1%zKjQSAauPAs+8I0{C>F0 z#}b9X>^NX{;E|9b3g&5bfQuK^O}NuUbz^p#sBWxIlfTna6QLN?O+Why){|^is->Su z4*R6%O9}&n!XQXt(9+F7soXLQ+K_G~cUh4}FiVed4Tq|H!wRoYW~yjG|2tLb>Oy6q z^#6G1==w-0z+l(=?C}>$vP>6|7Yx`{9nT+8e(v#NRVAuY_lRM3JSZJ8ERMg-_KRlh zhha6g8WpHpM{}sikej@~K4L2ud5876UjR3ABQiUVEAftV(18VE1VhcvkLH8Qw55U( z9>z8#`vZZt}2~2V%YT7x-7)YzGc+@+Rp5@t$7>Te>V76~G z^KlfMh&wpxY~QSUwk$`QWipNzmaeK&Hj0FqR(i46Rgaa8D>Y=NJGXh&*`8E1N~M>D zjhh|ViIqpiVVml@j#8$LPSD5p6m{}~juFiVk!uJzxZB^Vre$TiGry`?*$7z~Vnbz^ zR|Bjr%$1**v-;&zfE}e38c7C$Ndl{H%m=1}g9+^ga|BEY@PKv;+6gdG@EZ!i`4Ow9 z^CZk&t)hC5Q#%V}#b$9%g2ACjWLFXS@qYHg%BwS>{#xP~p|=#9ithVF2otfR@q*(f zeeQAUQgIom)93D`Fb&w-5ir>w`sj1#BQ-)5^|||%5N0APC{&OO=Bp6WtsafPwJG>p zhjClcUQyj~94hh7L1>?M2_1m1t)3aH49ZZO?!taNq4JRa!di|8GNx`jvwdlC zW}`8nyjV%2upH;9u$+;$NDLULLVr>z7x*_Qpd|)<9t~O+`=l_P%>XZ4XR8Cxtg}^z z7o)RPg%^tf&jvC!kE@A5w6lNk5^r0O#o6Cr$)ALg>JV#~*3#ZKuaK63ef7CDkweTY z{4LICgT-+$+8K==d=HJv7-&(?d{n-KRzVd_gX=e>GON`Lgs6ZGV#<;qL#Bf(y?K3v z<7ClopXTe$iPy|Nc$Tjim*Z^n&3QNVGv7i!@n|OK)*<@|eTSX;?mKC6pv4g4p53r%e4XlD~8=*tK&ea z4Zu3k6SEff~TOYY9u#Fm0ol8#T1jx@N26uK5MRo`>#hq-_!{gPHPGNN98vIXMW0zbc$P(WGziD%;V#Nso)(q^++vhS2t9WGT*z| z&E{>ZD`v}PhpX(Ax{P$i7B(U*@-&{z1e=dnm+dqgR@Zg2Ur22Cf5-!aj(W2QKX}oHejE}XvK(3j?I|; z=p8dzVHCNumsuuzjMViCQv+?qRFLH+9A1V{s%cju$i=+3R13<3k8P5YmE2U66$QO) zJxvAFE)?@&69rF3;W~?!>+bJO1!IxK)fs}2X^~GCO|-N!>+<`%NGfP`d*|ylXyRhM zrgWx8jU5X$)kK45(=*oKmB|cm@GDr`RyFwFJT&;X(2Q7Fmu>L9sm1YC1gTkIKv9U% z;6>w)$WLW6x}T_8@S_=BiK*xTW^~Hj1g#ufNcFkP5f`0@-sE!xSiAlh0n~*rZt`lN zSkX@PGrK}EVVL025djp$iV~fIfB_xZM&BJ7vMn;CFoI^!iaOMry$%Z8LIM?ctW3lR z!07qVbtt_&NT=5ZW-2%e;ZoO;ipz3cM-!Nco6LmJT2EwB0kP7F&O1&0#yLx3*_E{a zalbJTMq(3LM{e~w^-2Da>8>Yh_A&IGAw>u%Ta!(0eVK7pZ|3CB}29N#6L$REe zox!`0^H7-Gf4b{Tsx4PEi_L*nrFAODxB7?p$4lcOIl^&)mAaT6-eR-E^YZLanGiSM zfP12u(-oEL^H^EmD_s)n7ry|#>kI(WT<7YKdQ|r(tRE?}{9nd+5`(7Ao z5KRWKj)xuqU4=gPAOfuI{)RwAhX?xnsSs!?sDw+UWY|bZjX>RCC2g2Zh!NcEZiz~l z#9Lx2jo`R{!&XjO#L59jTErp~q5HYn@Nqv!g;RPzhrFq$C&xix!4zDcpEyoJTN5U? z;@-;uB6jap1fTA`8iBxq?BnLkNIveq>XVP#ubSlJ{;L}KbOUw+g-17Fc}o$npiu?W zj62-y44?`NclP#$XLk0k2G8p3&DOK}VLhv#vYvI)tIBr!_DYECM+<6-zL?}%uuxX! z{!M8pD14f_2kP^FfUc}P@OC{ZhfB$G4$yRoBEH=kF3da^>0p(q}8KfPR}3AvmGE*Zsa=BA3H^H96M1m z2$%7M!L_D^OLi(^G#!W7+i$)%9gXM{TLI@HMpo4s5j}$l;r5}0=mrrPoub&=FNP?+ z7qSBsi6^b`ky}_1e_&^?98DCx{bqYn5}(d=Dx+CBm9dxz;m%;{s{@(6@<6|MoDIdzXCWn;5z)v(;nHG zj@m~){@*#}aY;Q^MD9Pb3E5FJ6`$ILKdm6~)fFF$4fM!J=c`=0cM=g9;Z$8^9N&qR zQ3llM465sCq{cafLj6yefexKS4YM0d<*B z+}P(83c37g5mKZNRHE6JcGYE1QHCcKf>E4Kcq(;R-qpGjtv@gL`P5$F9>DhFG+LJPN>*u$C_xTqTi-=Mz{e!Io5Z> ze-1yw$`ysSloM{M(xqG;wqJI90*Iou9Fl$nSl|F8yL zqJdx6!0&3{UQor8Twe{GmP|d-(+)jPc!&nxK?9G}z-i~6C;nL)_%scic7J%{vq%H~ zRs+{MO>&0@{UHt9rGe88m?u3SLuca&Z>E8F(!jfG;5{|)|MZl}(HeYcRos*QpK0Lh zHSj|kxYlWs0q93P$qmxLX#<%j`XL(lBn@0wI)SE8#)!nM5Ze65&TrFU{>(1ec~Rnm zpAjW4akd$q*Txvp=}bdM4o|~bYQx-#Gct#d#>r}NICLm;T!yU_$I)ZM6XS5?kSDkt zHRmFe(=0zE4#&wsVLGfVx);uPqa)(jac5M5yME?Ak){Ys1fBPkNr#YwTUV>4XN09^RGcj}GdUqC zZn*nMyi#hM1Vx1jAvl7}U3^>>I(!YmG;y?C*#qD_9+1a!|91!Nk+clt8nwjEmP<=d zOJ*v_pi;QDaT&>RA>|@tJ3JdgY7HHp7CJPILfLen6(InIGsKhvLY%}dv|J>tYjo(dWne{$lByg-CGsCq zu~H4C(%`K}*;I@%5Zx+sG%rDubvrt-gB-dQT@C!OfWTZA0^!tni~^U#-;;2<*A;v| zk?>j){-p*^3t{9)u1tTAp$bk@6gPjKF`}38_5{F@N1M+DJ*~cwBai070;hhP9C>x{ z6ZioMm-*k7aG4LC(o0Uwr?rI3^f?kP>-n*S%W|E3(og(le6fVrMV!$8wuIM{@S1#T zOMGO!g9e@`;dF~4_h~E5r+Z0( zM@V=}2_GQgw1y$*cT2e3-sMx% z{*8nOLypk@cL}F8F@gWZakW0a{C-}o&makx>(M6Rtt9?=5-!ufBjJrD`ehO>x9cAz zT&~~s8u)J#F3TgBS8)0(ZY^GX4@fK%&Jm*Z;vpV6SVXwb(?xU5gE2A_{5df6VnfSbxF9~ej89_z^Us!gyZUb^^oZ0e7&MUpQ}OtxrEE@_lkte^ALYB0p!}|19B@6`|)Q2`3cv><|Binfhb%Jne`W_rt=c})T%l0-p#UWl6YfZ)+r6ZeM#O zTy9@)(oGs1=_%XESqYcR^FGJb`K?Mf&v3*?o_9Sd;m;sW)JqV@)qFZi^fI4!BwV(u zH5z>OOZ2i`-O`{Bpvr(#*VkAH4@11re-_8p`hOi$j!=)i|1Mf6(8}Oifo=7$tC{r_>l`%Jcf7VVe+W%$O(F(M>s=EaRa{=KJliX za8$PB1TOfP71)g%_;r#BkLTC3Rk(P*SD?a0Ih5^Wev@Q?2w}`Fo{%ugwnWMLF!1+=?V-XB6I= z2~WkgH(U6lUGzrm`wU)coDZMgj9tR~rN-sVU%@_gM4Ji=ag9xd#D%|`NL%=P=}o&5 zV6^j*ZHJtS5)zv%#ft~V zyV_#6whfyc@t%Ui#kK^V6VxqC*yiTzmF;J7;tN&wFzn2mgu;t(Tw4p(P;kmVPka~B zVJf%^WEFn8)js%J`x^dAUk3~+MCoDcqEh+@GZD0X(A5MR#ITp}9~rpr(|*0#v;ol{ zTl4ZpW2ri1&sq{zs)#-}3o!B@j{LVQmw$b3KNgMe0;7m{Ht~X`Z_8-P zxyUxuspQZbv8IA$&{!#`v7QRbwFgN{>yz27QfsvPvm0JQg5l}&?$EZqsUVf&3_NZ& z#nIM9b>d)7FrEl39tiNZ4db3f1VJ7M!Z<-sBB<y?tv)w`QEv89-g1Mv`|Gj~ z(C%4XIm@cU#Feem=^L5p^hK`Gr0~85+K@1-+!Bn-LU*OTiI%0${Z)!n=W99QXj3UM z!^;*{{z?z+M|}rT^d*Gs9#lxEZ}!?>hVt6qSmm|9iTt&{Tw@Nhf$tII!joVAQxJ1L zJ~P2OI{wZYUM+MnuEL`9xlOq^ecmnbKv@Ty^G6y{K}>9nA~seLJIMXEVLX~>k}MFH zkYT1TK9u0w0{AL~yNots+b7~;c-$R1ZVBR8X2(D>O84Kt;z%DT2JQ8_G>kwV*|Btpg8lWl_Gi6D3;rxQ-Rf-UEC;`z_vx2yg{ONqIxRpoJQZ>o( zg?Ro?)6=}1|OK9q{2c*m4`lr%`&P!TYU9+G zVy40z)eAYo$yNpaF@bP|Q=1p~R|LYT@s$c(4lmNcV|WKZe5i{M{KrT*4P64yk#Ksv zBk)-gPVGtHv{#cH@u$8~;J-;Y-S!Lo7{{q>FM(}@Jdh6+q`$0Z8wr=~ zu$zR-b~sqVWjmZE;d1?cr-5&gaJl?XNjS{~M0sA3a9Phs5-#gmjT=4XSEjEg;WB+Y z376%HJ@v$=j-*dzJ~R?e%d|qzr!;VRPn68ZfVAX@5B-FrHM)_*hyLp|y7pnAZ4Au) z`|o82Qb)*LIP;b7WtttG=?bso<}#EP;&5tf>HE|D*&URrUw`)HO#8(!vwaG!Zhe3p znDe8s%rGE$EhVMzl>orqFMZZ2KMMC&SiV8POo2cIVw79Z{HRz8VErK~%sJk7bw_kl zK4X3HCVaSkiW$qa_ha;|l}P`6D+eGQc;? zoF5qoo?snjapGegj{bobTJkVEV!(wydgF*uctQZ8z&HF~@C^rF(iMEeIp1JyzKHsl zd~v8sq*>u>=6vC6>5Hg;$u|ak;}yO!oNv4~Uqt;&zBtq)60Z?cImB|lW3~Arsytuu zX$pIy4eJSC%|@Lncl`E^VFPi9s%bD^6E+pl3c0ctX9CsQ*YPJWT3+~-y_apaZ;5vy z3U6uWkf*+m#xaFB91;gU(uYGIvXAGLrN8KlG#RD>`tY41kM1wl;z}_r`)x1%Cx!T; zjjw)X;fDVBIxKHlXaQ^yJe(H6y=f7ALLhyW_Ho7Lw{)Yv3M(^_XksJ$iKrsp1qU5i zu}lvfykRyH5Ib9AbN&=4aS$maC1~2jxaAd2u1H_B1v~nhYdDk1*>SP_>$v%S<5?!n zj$?`*^l2jLTe(=Bmal@#T!odnf{@aW?oKe5xr!-s6)Ru;MD4x|FkcN&y-O61;{$n} zp#D%FPS)X5iJ@*b`cl4?yf~By1fdYe03gHrpKwWHMW4bwiMEsU+ z8NhG|Wj9}V;BpK>0}F2H7NkJuo#AGn!E~k6(w1&voFtt4X70z3pL6;i=wmrFR`KmQ zGs>rEc_v1@m^Npsb%q0R`e43s|IcZNi`OemYOZ>d%!AShQCza3LeO z@R6y2vY|AArUy@<5BCH#?^|<1eR4=Jlz6qwanrxLc*E`5ZV7ftqI>RQ@W)81xtz$^97}y zyVjSt6Xlz!7uJdS&p*`vh57%3${&u(7jwKsSdQ#)qi)E+UAQ4V#n3AwISns<7(!YH zw+?;9U@A>I97-I zr1u&gW;#Xq`KS8%vc2B>INpnVd>3J=cZ6S{-6zV=Fu^adyPv-abZoCLr+XZ&K!@~p z?^G;#&9>M1cD(;S*1-^g^CUroIkA1j$#g=?nR^W*|GFB`5rF z9wrl#T_G>GAQ?p1pt?5Wns~7`AjOsN^sOX}f2J1h$Sb+yE6!T(*FT)(kF(~2U8+At?w2D!mx-w zhtsn$67=*{b5H!~#)Rm1ae6jZg8q38`aT+Xq6R)%1E;S_lH6k6{+d&!;O1)3f63|n zxq+}T8T6|(=(lL#do}Qr8o1W?396ypll~ce{9@xi^r2;+0O<*M5M_#7>BKK7IVB-` zq%Dq~&5TO6rLuQ|>CJEvL120kgXu+h>2g%^sPxQn>=knHviK-GX-Q8MZ~k39k&q2fa^l#Bk@$!=p8sY?>S`tqEfWQYzxJ*wA6y%7HO#i)v z%k-NhT&Ax|4B*uIG>~waK2gGD{`84?!AGY5Ny26N4H7QXU*@>FJbifoN6|Fr5akoc zaW#FKL{ELVpkE~6H1`$wX$?NtC3=}pecmsUJ~E$H5>8Vn!M~$~%lWlv-~%-9WDPt^ z1Ak2epQV9+q=A1U;ZI8WVoNl*rgD(+T@tQRH z-kWor=#3H|i-gO3hDmr6iGG5FHC3@K&7E8EXZUqu9m;W{iZz|P`lTVb@_VB%g%ldDSaM>PqNVuG@ z6A~`hdx?b0`g`*UG3g`At<7qeL2uQd?=Ru9+&BrB^HodgSLJ8-O(b02 z+d$tzB1id>pOqh?%)=3Gz)!Rn3X>z8e!{ik0fAFrOwO!$Zh8a1&Q;;!zC$d!3qIoh zVyTK=+(#6uaB;tIP=$;80!&?*6a2;e-=M<9{5)KRi+T7+6)xt(G~LY_KFs~X$v>U_ z*go_>f0lil77e%yXTJJ<6FOTfi66~qrlUP@-iJ8agPkli9m(i;51bCS18d3*y;AK2BPSm~It^AJOY3 zn2JiLj&(nlin{>CHX$e0lq95jJX47(xmA!&-b&=JqlB6IP<_e)q? z$M>tH?ENWDpmMAaDa_k58P6GMA3)+Bv%{Yi0-gC`rZ0xa&=CBIKc2qo_`H_L= zL1XbWD1sDT4GmY}r&~P+f8`Xu@B^b`dd!6$rh*;r1a?me=(Ff~O|UHQ8p|HcD6NsD zXGe>+Gx{wgC_;A7F(7iUK^y)V#lMWk2GWG{bxUIrxQOf)`&O%bsuUW>Ck z&h)_7zReCFgdfA>8ej7kZ|V?~)UTI5YdGUp(_=-r=oJ=eFGj&OH@yj=a^>Lqk}3gq zf!zh{e5znjDUUko3*=-FGau4h5FIwz>Qml=&52hOo1qI9avf#wKHy-*=nk+195iwh zkC(15#-G)(*`$AOlYY*6Q_%0F$s+Y@FR`o0yi5ALkCEKstZa5-M+YAF)@CvG+Z9a( z_n?bDFIU7X#tKcMOa+xuZc6bCg^G^flcy*>C{s7W7^=iv`Ce;t@WcnHSnRDeulr2MwJrIU7E`J4d4m zeUN`X^H=b9>DI7!>G19xvD|>O6z*l}bK4^y^u9HXTx_)81t*xYY@6`~_;|Vu zXWL)!<`uH#13m5V2-Paln&>Lh1>)dL$hGB!-Rc8_{Kft z7>H*o6A^L~!TM}l2)Hu{9Wosn|`S_4zc8gvL%n1~rJWT!9GVSS8-^Cn^(Cu89uI#cKZkW#dxrXTZ|$4zhYNMER;PjS_YhO@9$zBhybCXV`9S6f#7|1fU3^kw>Y)_3Pm3fQnD&Jba9gd%{zR8v8=@-+(O*<$%;rL=B= z{>HtQE%>Za$rZR-me#ZSf15sp%U3_E7wOe%kgnu}AI`(U1WIlTPxw#I+AT;UcuC21 zf2jrYNHy&co}SEBcDH$Y>f>eSD_5(!C6CW<$RO@d5g zkZ#+py;FNxcDK7rw_O{l#UO%UZ>X)MwXN8j#CXA41+~imdCocS%sVIZDY)(acYA)n zneUwEyyrdl`#JCN)jBuNZuTtv@YC#volYuTLEGgl$&Sl5zW>Au`CsDp+TZDU=o#U< zup-@Ga<84f2Jfl6O5+7Bcu(Celq!0rmtR+D&1B&oq$txi!tgHq3emqO0Iv+ds{?SB zvqJor2H+es7NYMDz_|`li2e%!_}2sQp#Xeq0KPi_|7`$13Y_Ub>?)nUiM-NLiVE9>T^W_uU&1h$*SuP5)jWkzF;NqpX%Xx;qFYpcwS!MQUptZQF<)r>X> zCZ`_X8C`9ms!MBWUDw#Mw5cn-_`0_GtJl{VM_V(_EuZYrR%~j>2{N#1*d7NAJmM`Wpl2|54!_;z;^$RQOvIeviZbbbeUT z>vTKPwF``wzVCLd!u4LmI~2}7S;7-_xbLsLx@4)?<&dzU`_WdZcd0{HJ&xXzcO-9XFtcdEnbug;eX0_gu< z(d%@(PT@LVdKIqoIt|5edz{y$f^Zud@Q;f7-Pb^Cm=!~OVPrRX*Pn-s3w=lcWr zJgVq5pZx*!lNb;vKYuS(xUOHKE+>h^N3fJL`kO>s&`4d&`G=j@GYlVl)xXJ7}*0*=b1={SMBb+@1thnb!8hmg`<6(Sz8n;HIft%{1%h z>6U?#MCC~LJGcs!*~xXY%AN7=a(IEovrpX{{)gd;d(-cV4`qPZXf#8&c}z59y&Tsy z-8DkFxH%ZmsRc3FBWXGX%E;LjBq>(l5r?7OlHvvel? z#?oc7^`_y^w`NxgUuDg16$^@yadpMy+U(lemFBh$=@R%+nfo@E$s?k3CNJupcw2Gt zHoLO--@P~Uzhn*WZr#8k&i;HbXbrC1wZR?EJ)2S{YYBc-)9fekzRaIIe;xUl^`iH} zf;`=jR>(q!>OKk=4A+dTOREw0t_#T8l9o!oF{dvlsFcX)c(ZG8XZjIxyv1MfDrgO^ z!nto2Lid&Q7x;2$*q-=mJqK7&5-+9$-HLn3Klamwg1SDye?R;*7s~3S8yg;Q4j3Hv z!M^{*3i%(S1=NWBWdD8tvlgC)bpO}a;PhIXY10s=>G=6|m{Di>FNDVe@Hqi^eE`n$ zFNOH83BYd;z`p|AtUbAmlsk|21knE^0Jm#Z9DFs%xppj2)tN=2xwGb1&99p`{}Q}k zms_&Rzm<@G%syZNYb-Z|Sk7;}d?kxa1wzG@t+CuqFuYd>5r3+)?8nqKHqA2TmcGm% z6JMd|S@(s0t;2o#PbzxWRiXd3!u4F}VTJ3t&?J|yKL2+)oNa{;&$|__=Qd|5oaIi! zBjtsB^cYhHTJQ>o~6eB%n& z@fDd?embvJ^g6y@bhuA1Ysj?L^bwe;h&!jooHYMAyvN0#W4fl!PMHct-e@jVS$WRc zhbv2H9TUu{nEA%A4t2DXwebNWd-=x`9g{G0Epakf%qTi)1&}yBZF61Au%2asK}1&4 z$PH?WXO2zC?{dpM`+Xk2kY~TgvtRGo@AB+-dG=F0`;8Ox!?VYuul2&a$TN3%<{r?_{a?gFtGuL|NMV`6CGjH_#Tj%)~Ix0W?c6s(OFZ{zE zzg?brk7wTJ@!RLwulMYyc;N~8_MSQ7nL}Ru%RT#;XI|vRufsF1^Z2dz%n>iVJ-&O- zywP*tH#x{BGvBHvP{zuO|;F&RI%A;TDnOAt`)t#FC@x+pZaIw6FY)+MTD%}rE=YA>p~+<>#@Us9cK z;*=(bU}Jqw&g8gfU0d@d;0c|X1jVao&%LB>{@gkQkQ0rW3sTkdQ*-LzA7tnnsKGp5 z4Y9q(G^=JF19i#eweyX+Dt>t#qI79|epMh2VZ8bD3vg$8)>v{2YwE1rU-4c8xZ!Mq zkeXjrQ|F?}IOzN7G}p|&0A~cUQB>EeX**{@b+utb4IW)j)Kx9CuWB2hP~7q?ba1W3 z*w|@Y)9V+?-`qRjwe#kgz-vzG1@N(Noh!>jdLEp2F0 zTI)NPHhIR#lJ?FBYBl`C0UX05OKR-ErMtDeD`$oHL7aD%(ilB1=6p}2vAxL#*(QiR z^%EiY#Vt#X3(QODcc^iBN7O{Fp}lQsXLnOu8f1}1;8z#Mk+MvSJo0F0NlRxJWTrKw zo6-?T3$Jg*@gw(*Sl>M(lV@qVIg8rd$r=%~#VzTsthu#*aZ_v7w7jXStA1&d&x7S5 zvOMQ;dp)GJL6{rPIw5Cr%v?*6W#`PywWb`{)m6|f;I8`CG;>!XNV6Z7bZ31_Yg1>I zW<}*0(QHawy}ZLDqLZsmS#wv1q$HSZvN_#aKPFLKnJ`4QP@xTqENSWJiZDx^u#C3$ zh^@nsrWG9!50Ap#*4^3~S=@v&*A%fu8}+5DrEO`bEmvHcuI{dHjdUP1ChbsH+8aR< z!3suuXGqe?G;)z8j9_D^V_8END^(t$iJcKtAG%uU8N&7s3c-h{4O>9Fx;r}BJJVpK zQZbU}gSO~|M`#DG6W_bKTCX`H(%IhHy0{*-wLYE3C)C}xtgZdpwn(mRU^ULdu0RUa z^7^i2k~M-!RP)?*An&tovjLB|W)e{{tp&Wv*_m=1>1yxpY@q)+3*%`vd}FP$#Wv3> z+d5gFOcTd;&*bB^ov6aO224sMWHqr#M=yq)tYc@E>z-^ATG&3@!sfa6J2=b14)`=5 zO~*v6i{^)8j6D|WTUuM2mZJQjS=31-d10z2eaaRgQ?w{|=UTMyEv_15$vnDT+OyqF zH=|KUl`|Ra#;fV(rbvBPTQq`0k4+6|$Qn^`T9&k+Rd+prEmm3gXlp{VXU#e{QZ{?e zg6WYnPe1eYvnd{OM)?`#XGO{`L8y}TX^WqBCbuYzlI1%8JtFSY%3kexq=YQQ1=w|+ zJ?Szd3-J(T7MiDsj7Xu=7k71qPWK)m(#DGaG5LjzP6R(Li@M`l&{-98UlV7i=Vyx2 zQya7=8+ofGT<7Sy9#4NtoLTnt-s5n8U#-W{#l(R#N8DFFr$AF^!n4u&U(SVYDEd!7 zgq`@0Dqt|*|6w77y;i5#ijV6`#0Gsjfsj2qKRShj^^8q#K* z*+sWB`hT3sNsU;2p?e?ihLzr1miFj;;C@>~E(-#1vj@vfAG-yM*Wc=vbhkBNIBTXy zFk-IIg%Oas0MOcA-)I&#K!+aMf~4oZQF|vI1tOdy6|zvs9VIYjiseG~0$np?aF%7k zPlTR|Wm}h{GK1Q(srM|UK4%-fZE}kcY2v_zs0LUgKROwA;hq?(n@HE@#IM zc=!h$eTn-@I$Y$;a<4^jktJB>(aZZ#a>h*PdmUZUqyM-wFZA#`oVnS<OzSs>}ZujtG9lpWCPjmQ? zhbJAr!^1Cg_-+sHa=3&`!f9Ve2!#%K^zt57iE}6PcRTYm5C5?39KOcmbG^fF_wYf7Z}9Mca`=#k-|g@n3TL_6WnznYnup6cX0O7@VwdA{ zz{7v%@Dlfxc)jGzl7508LC>MeJo;lDUg6=VJ6z7_3ZK~yU+B>{IJ{Zmgv#g;YK6k7 zmHSz1JbazwbGwIs(cv3BTx3oTdH4=Tzr({Hb@*-%-|z6f9zMmbBOLH>ks(>)+)4Ue z;OM7$c)i2RJiOiE5hfB8yK~p28#B+$bu5b>@|n3a-o%+XsRQ&dW_-2xhX&(C^AeTA z-PiVf^l!Ca%1G@bZI+>02wGUv**T=gG|Wz4R`#o6mj4LVb7%9p@NuR&Tgy zbk~w~-{H;a_|Q^7cad(>RruT7fxn!bD!SEod^mr}kr)ofkI~P>hk9XW8Iffns*$UW zk2s9r2$$p$_I}SE5FEMCkl{>>BfGjV*-0Q%?-dSS0C9C!Lei9#Kh;VlQPJju;2fX+eF){LY4~k*=GSuv8&9?;7*iB2 z7T-R;G-NLGm{^+8KCkOQ@>y%?6kgYvX65|!-dBcnx+ojsHiozrf4QWL4v*dkk#G4j zvvxDEdos`S`W0kmwU+KnW&T9jSqyeX|ITFQCo9hBe{sbb%}y!~x6--XBY3?%(u7^1&|zu|E*{ zIKI@x*NBSR2I)T~iGlHunH7e=H4Xcs6boo%SdK3xy`d!)E|`6nwJX{1U~2j!7Y*Kc zmQBm5@SQb9_*(#3iqFRJEsnkz-ASJD-sg%(kFxi^!gpR)9KQ1*$Y&}VoOy8nLnrRa zJh0`!JE6Jv$Sv{A!zVu3yR9g`|KY@mzdG`fMCG>bAI3o!AH4WreE&o7{SRiIOPshX zapD8L&mDE*y(kP@UVdlqzN3!Z5#86jy$Fn^zp#H-X5_?sGrOZdo4z-?7dE@ee^>v# z-6xsELg-9fdS5*l?&ph9BkS-dGRKk)FD4rx(d>!TVA@4&^at@FRz8~wWf3L{o(0 zA7;K=AUbSJ30@WabT%rc{Ias=%9SFwVk+2fHoS>liJ(1+2)sK1KdLG=_~!kl;-%P@ zsG4*w{^OHE5x_D0sJ_g9rmHCndYIZ z*>nvtQGEK!A_)qjT9glf-(Si7wM}kr;F4<0`ee{v$wId{D0BWvV8CoGag3(9?plv%441#xA^vksQY+F@$v5Wo zN@0e(a3%-uJxJ{H16ybhgVEP}45m#5_HO*9GoR0+1uM5CG=lJY%nQPi;VC-xQ`D^w^5Yd^Y|Guji ze)xamaMJ7ezRNX1#JLSG{Nn-mGKFh@MW&GN@4qT~?QaBrQPE%iL?xU?aA{wpzYts; zv7Mk2T-pWB;c+v|6}~a|1rpo-j|M?7hX$gZkWwuG9T{W1iPMd zi^KijfQHj~Ozfi%$s7Vg{>}Wms&6Hfe;CUH=jSgEWao@-O&~WzUzW#jFHB}VLBEyDX+j|{ zM+f3V9k8O_JRE1svVk6fkot{=Lqeiscyn=V71p3Yt@u!8@5#b+8?@ zbE*wy26QR@FPy~r6=qg;oR`Fx>gW6mo)4|mvmeZdE;yw55PANU%!w{!Bczl+9toNg z$+~He>yw!7)Rs72GNuli6W!|hD?xBguNXr?bD~3a&#@rG<E{P5FUD66Nrb#mz|4|h(~>;ihl8~E>8XN?TkU(=k(w26pQDSmz( zW~5pE3*nW(IVTeLro9AK8$fSmWthfYPX+AJWV}Lo&5ScV5v@u}syRFs*0Lrv{*t2C>2N9o0_FSreuw+vj2LPgen(=EY7dw4!Z9mvbjhIgjbt^< zz(McBmDR9N1tey|VaKewO%l8BpteaMCGOQ!=Ew2O4_2ize~7*~{QIL1U(cp1%?Xzkd%JGaah?pfQuU zXSlVJV97TIOX|xt5%eN6`pu4+)`RxPPND z(>@o_X7R{<{qWPQn!GIa?QXHG);T!bF_WAbnV;ooHNO9zb=F9_|I1@0rk7qvHfn@@Q+GJ)ab~H6f);nsV(?prli3^9 zmi@5g>56G{c}SqT^7$Lz%g3*#Ff>n87s;M}dJ(KvF5-TDP3DD>8Z2#@^`hh;g#8*? zoTYFh&Z6^Cg?AB#RZ z`l#iLqb0k|!>I8LPP@nhZB?1=N?h*EPfbI5^07c3D`Pgq;+g$PywO+A=b-R3+t*9W zVN-+09{a9G_nGW}8b>Bl;ex%Ui(kfRQ_?*F@uS>6~`;LhX=n3 zB>TJ;HDv%Wkb4sUb|7~hbeq3~KW~7@2iVF&>7$qwWhP;WL>v+^2uGt|FWm>n$$`(A z6D)iH@c_(>6Z_Wcfp3+TnD5=CQ}9K?G0I!*S*X#?+4560cbH1mgj*1dC3%?{6{TXGoJFyvzoDO~Z@1<1;K=pjD5m zr5b+B;!=*|Gt~{hxoGgbXf;aOdU$7IXkOwnoXzp1R0d~;evbn+MKuj59FP`VU4%Ex zepZcRP>@c{M?NzzL&EWzL}{II&!<4~mY3mBP2tkv{yWeluqtKXNAD}))L^P8yqeEH zqz2>1rjTi?KMzCZS6iMLpV`0ViSfwTzEcsA>de0AL)r9tKHOe}cR=0N&%yqA_5td16qme}&xurGY)C(dNVa2jpKv2a*axpj?2Rz1#K zhTLq#?s1$ms?Pk%JV%zx03DBTKOe)W!qa4Hxno#U^mx4YWfzY#5cC(3J>hVF8Kcy@ z<=E=VYM56~gfWqMM8}HrB|e;&j6SqZ#Ru9F#A%C))8p~VmoqP?%MEq1;elk)j^w!N z((>FKCVXeqCPz`M90#q2i{h0Jt$H%q@U2qQb`7?onL`{as-ioiJ8RG!WuDZr3-_^+ zH>rR_Y0?y!Y)e!=93FfCeGQ)(t{Yr&aR098iznW1f`X$^`yWhZwp|dub9^K@4$mi^ z_&{{$i9g+P@SUTRO}bht&@b_CtFxK! zeF?_gylmtcIEoK_CQB2Cu27X9DPb(_T+i%FjO>2}2mVYvOleMKwvAi|C^dM&lw{?W z@GY0(JvtbQ25-Robp}Y%Zd- z8Xivw5+A$}R%rVm>${}Lg(H0DQDjkGLWar8ecjKDoQmUJJQ_9*61$mWv1G%;CU_%B zge^KeQUs3Chem#cPqx0qFGJ_YqhP7btMU0bm3VN$Jj{DnRI@p#9_X{rv!cO)VDPV( z4k3kV*!A#nKp|ZF67PQ0psXS*IsmYV-~$4I;?sY zD`Pwcjy8{1K(~24{&IP2=H4rmoA}VVS$Z=E&!->bMU&JdP zNuOpC!Zt~%!K05B_XXOcM^-&q4Jr0$#E{=ir-+FV9w)c)W`shB5IcvDAU^0E!mICu z1`X;I#Nc0{wKb3C)wjWDdx?Ep_Kb)4PmFtzPK*Kupa^y`Lcb&)es)621bhlkrU$#F5!pL9?_hEq0%ZB4&ty1?;^kFEDKv+v%Aa(Pj(#DDmV~d#-op2# zO;W~tpD98UeBofa9Bn|TK>g?Y(|U<3j=+tn4kJ$?JnHOkw*JTGz2k#Z--lce5AvvV<+hcn{MtR<)@~eOHa!dmC50+@ zdQ9a*JmW(#u>8x_@5~6RhpOI*(l@T($%a?oWc@y#TgRDag6cQA%y1u<8TiI^wtgeg zID>GHYOp#y6i~m-IHQ|99*4(XU^x^vt?w} zy|!Pft*rTG>n#dQ3MZaZl|Sx&a`d~bxXH?G;afhTD=tP=rs6JHSD@ZLc1ZPhDni5Y z14h)lyaz|jOiG?=#{`xW3p41BXI@}Mj+oh1wag1L_oJAZYFyQC=1Cin$T*b{Udu!L z`SYaD6T!PIm?2Gr_K;^t)7*T>_Hs4-2h(Us>@jpZIobneoE+`Omy;ughm#{tnm9Q+ zV7_;o$r2_qo=8* zoEYKR=uaa=?E8A)Lv~{HS%BGz(akXAPmCtZ#0d5I&CG`w8+3VUK19UMhbsK}5bkNX z1XqC%_dm|ohO?nBz-iuW=wyT!6}$qS_gfhcHyf%5ujV$GHyh#!2ljv!JiNsITjB%l z>&=HMa`T}`u6-*o{&4dlPQy74sbz;yX68dCqJL1a3-=ujDiYwu>tEv$ZIflpD>EDV z73T?<4b9D)4ON)g5XJ&C!*{+nQavtF8q3Xw!nyXOEQJ)0h3|Yi^JKx<&|uZU{Xa2t zp%eEOo(gT^ROoU9A~zNKWq6Qbe50vQDMQZj(IL%;-fF0Oz&B*-hp@t6>T|9Yxv3Z^7dF;&1 z#KJD;J-3q(>IGDM>o@qV9alxatLS%C*6+mRjYY+uD(H0;cl#<3%rQY~C`cclM8A3J zkm}zG_-*2ypx+6`+xUH5L0*Z&_M2(6&iOr?X>=LiW9R$q7f)VS%xBb#A4U>YaqauB zW$$wT-!d{eH6^Dty0_sU3!-Dx-nUyw?zb{cm~=F?Oj$#!FP1>@%?%)EXb2Z zL90V`&pi=_%RlcW?oD1Q#xDDf8^SUCh?V1~)hrkOH@kP)5fFdzU;GN%yA=0kXeq?_ zO8N_QIW&Hn(r(YmmV)(-is?YN;$HIaSYUqI0}7S7{f}lEl=8z*GdkQcYS-}=8giE0 zA3B^nFl$`nc)91HXB^|N0HphC+PgG;1mbiYetsQhoKFqF&j`S=a#oPfr2%+L0NxRR z_X5}F%uJsI?5hFv-weQc-m6f2e-MEGH~@bv0Dn3Fe-XIZJ9cL{Og{;XXF&>u=S1L! z-ZeO;Zv#E=h!Ed683riR?@*K7#B6{d_F40yM*g@wHx9YebuDczX)zn=$9$hWVPqGl zU`4U!Ib=Zxgjw3x$}PzSEp7F!q>(LVIL15XWZcl&RNvO^~JSATi@P57p^FecCX0tBIt6mzj(u(-!J<`!Q`3 z_pLGDH0o@HGphvutist=3H~jGAEWRG1Mrs>&MX%`r?5eSVsohRpm*3WRP-!w!skJS z>+nx??X15?f11Pj`5VPY?hp~@5JC7~tmrlVFAn$lZ&LK^@`TTQ0rZaq(1%?oMC-RG zK4&OAtne;{vtJQ^-|sp@^3nM59PdF9XV)h5QH8T@75q02_v5=?(d+b-cf);pxl2la zHGO;n04U<@i^X4&lS5p`cdl!Pi0gd+vch$|?svE!o<|kE4v)OY?bAnAKjLsdJWncm zoo=VP_MZGTpBW0*`PHXzonQataNpnWD0=PhPXp*j1L(`xs6jEDI=`+^xX!Po3fK8{ zqr?4h-lFJre*L?`b-t`(V+!Tx*Rigj^z&=2!+n46Q1m)|o>92YmzNaIq>_4fHX{$^ z^PlT*hDY8h0Qz^kL5ZKga}-Xe65m0E>wLM869Ond zU&G9j+hc z$qOpMjqpjBdAf!wi@SRD2@jWX9fxxb&CBFSTJ8IE8chz9n0kD$vA42KC%W|%Kcvh11(`F4)f+4@Mm`2 zzspgXVJb3gWV19maGqV2mwjEX(Ya-H*&5h;2oKFK!8!U5!aKVs`0+g7-HY|3cbc`# zWbb*Ui1u8B2z%$@z6+?qGJgrcbEzMgRc0QNAE+(qeYq&yH;U5H|IkWo;!k<8xTyQY z_z?Hutw&9TJW3ASP=SLp4@K=laPNVlG#p)#b<`8!C^ptneb&*C}$JyYci=juM8n7hgA}L;W^K3M#Ot>Dk_W{~R?jK6Gm~8Caxp<;vx3viAlaU|WwRTxe^d{iM|{g!ZG*O1$#p8}579 zY{$(jj~+BZ9l>$6Y-qW0j*up$q$0}5Mb02>*7MBDn2?A^HUT9^!hKi0jz@E>N45DL z{d3kM?w*hFC^;|>%h_EqmGh=FbITO?LY=T{&>h5wzL{mXvJk_O#h~KZ85Hwm@3}?c z{xA}5AT|Ycr2pN}Zem%F4_z#5azTof+XI%YIjA%vKQjI;6T(fa3i`JKJdxc~kVWSq z(CbFtf`3p-8{2SrOYkA~t5p755~aXo4gPnWH`H(~c;Vz)E(LRGxcGp%%ktN<7Hs0k zgmB6Y0mK;ic7(jy5OZ@Mc7>>XW7ZOb)`H8NyR1h}4mW9O=;~g~&(elQei~b@;Rla2i5qI&Lud&5 zhw!6fbz++)bGjyiP(Hrg!ej7j0&u1?mCt95g$>R!DgOSm!~MD2y^5Z7Ug#fCIF|tg ze<%QdGywli0RD6U{({1}3?TlV>KYP1{2y>Q(?N${_Kiyr{d?=aSo?5oz5RnxDJ1{!gctY6|Tc`qr!E14mjKo&zBUv z4$s#VuEQg5B{2LtJP#^*9iHDQT!-h64)?<&FSGmU^L97LAglPg=Hag4L|j_a&zSKz zhW(&Pp&{zG=FXj&egD@nQ`SIys0WVhobw~lZSKQg?k>X+Ce@hr8o2|QGn0NrK0Q0m z*QLKDpMLcl(Rbw2(|IBOfd7B1Y+g5n=J3@|bohrktF$o)np?6Rley&t7g=KEPOq_q zhmq$(hn>bRWM4Hyo&s^EFqMx>->h+t>(`SQO5+ANG}#Pq@J?bw`|{;{IQ4WqciVJ2 z9(X*h%RDZ6x^dUkjA0QTmNowUH~%7V&u&iAP1wbp=4k=kmuaol+hB0bfrdjRZf>&M zp=^ifk3Toz*qOMhzA&K<6NHj{v8GTcA{zHS1>Zvc?{WTbaCG#ae)#@J9p?ML(fRM3 zXFtAQXTyf1GqMy`BkrXfi?y(oZxt-4m+~ug_c;Pnz65l%G>ZE5zWb3!11`}%ML zaALZ>Cg}l3I7EX|l70elZtbTD?bfhUg3{^FED`stLsaa~{In;&(FJHZ4NCdpFBEo? zuXhDn^5Ga@EW5t{3{xThYaO89Wdcr-$V&o{}N+tEW z40_@bf>44}Ur1JP1#r?!xs-BvvBMYPOC|VK(35_hL323!PvXNKPGg~W5H0R1uX7`x zLNbs)14})Jmw5dPa7hDkZ@#L75^Wt{t~RG%I7+bxgg8+(rX@Hp)TL}O^E9vC%UkYQ zLb1><*BcJ*Mf&yGmIaV zWEr&|z zB|K>hXYobOe5;4AbLOvj_^>mxOyjL^8EU`bere^I=gc_Vv33O~MNY-c*N(Mw`=yD@ z_j3ECxY5i9OdwV4#?k{dneDh4bvs-oGe5!==IU?)lD!}g!(5O`W`3}j4C9&mqQkfq zg&TG-^}YfT13bvo`^szS3E^AEBhyj?H$@C-0(U%Q>m}a%#6;W?Isw8ay8n*17^ZB8 zqt?)LNmk=y$)?HcJOi5`S z6q2@r7p{6h%?np+%=hk6W;8BbF{MPlSz`Kc#$8!@!bmOVANJ1mPho54DRj2^6Zp%` z3-G?or|kYK!?vk}6!_V#NbbYdaUNst`8GUdVuI^&CNi{~3CsRR)6=X)!^7B$%-Wp- zyF_M>xzB6t_wT}OniG<@CyVZ7Dwo;JBYLAMrt_aqyzbIF_0gVhzU^+bz!3G0)H2(NEX!A-0rL@ndK<-zdk(@-+( zean+rMg|w)3dRsl1Dm! zk;rVpHEc+ANZ@Yr+i{@@SLJcl(wFH_`S7Yyl)W^{9xfK&#S|an23unKOAjB26ek;) zNVM9XC_Z?%nTn450-JJj_h{&MAh!A02Hlwa9Jvp~xw&j2^P7=BVsS|BbjOFD%DRsi zbl(T}$-&FQxZNDSM*?U;|v zI#bu#K&!f*WL=N+<<05nzqTLb!O+ozYgCyx&MK1KRd6g{+-=NCVLTr zqTanlvj*p%QdGGsyml7@iGA~F$%b7$Hy(TN?r`7J48YJw@NctVHFTR<&Qz6pRN`Q7 zPi}-QZ%=N(m$xT}%=hc1!{+;~(jDe|cd7C1=KGj3YV9FD#Fb*}85;}Fv(b-b%SC&Z zZp~P_ktHsF;zL|vw)~bCp!=ZEW$qi4+JkBQ5?%3ocIHCCZ#&FixLESz=U@Y z$Ki%_vUls0F?SH3>x4{}pQKMTb#?qvl*TeGeCP2_221%gb_gI~ecc)E{|AOCd}nbV zn(enURD(4Kfv>#-cy;C>NKL~1K&B8|LTer<}bJc$IlJ=Na#X!sGO|TyG!+TCD!X^awaa;#+(yUir&( zX#%Z9=Go~#Pc}T78a(r@B67pI4)--9bZAa&Uub=n_olKm3DTg#qMLXO9(@NTLpmi} zSo)qp>5LD3EgP$5=yJ8A{Lx&>jcf&Jww^HgZ92sBT-c=jAlk~*;7s%hD8}JiK5tSw zVRM_!@-!5#)Zmpz1;}<`i}*vhG2tCK68`e_HYLMBkAJr6@edww!_dbJf-vfFRH1_b>dfhQd5{FXzV zC*Zd|PxhvUIw)51w~^-st9?s3>-H!xvQ`9tCYKhc_%8V}>`p3@XE$ z@ly*3lE{v3erbj_yD+qYCVhfwF(D|X@Zjdf^xx=a={Yn@k%=7GOpR|(Oq4;*A5cwr zKJbmkGrR(v8_#4$M~)+K=;N6$g4~X0ejL8#B_yXA&-^-QJo5o$CB`#v#V3C}lgMoI z>Z{CGP+4~%dD)~b%Fa_tOvQB*gzV`_H;!TN!1n_C_`Fi@t7a7QB(qc1Urt%1{ys6$ zjay!N_}A!zYC;^jd<+gair;gZn|RknotxaFB@_@fbgg;5H`hCt?G1|skv z{Of24kTCULYHKx)Lx$H-qB#5RwS9;whMgFg+yE}|7q?(way9uuY)cB##8%hB01vl3 zJ3jNW9g{?>Gds`@=42X8FyoQ!W5**eaXj+l^htI+a%8IL2dE#+ZHy_H$5wzCNLGzd zRAN7K3HBIZg!|vZ;0#umnjy(Q!2*KJFkc;=>e8Fzl6d70!h;-IabOY$LySzG;1@%a zYuT-EV1PMWV*1|7ZRwj{Z)D=chcR`c5a;-#y>J;C`8KMW^G`PbnApVMRTN)SG;#@Y z%Z)pp4j7kw+S;=rEa6-ky}$E}V}qkh^T#DJJ1{o?N=N8iFf7T#KVDV&6h|e$#;_Dt ziRn*bSQ6F466A3oOB|;pn2tJMa}#w_3i^_yfEUv+x`8j|II@Yj4OzJFd6dB5A&DHw zB(sqnAhqMN*B_7Y{3m3Gpm0G>4FxYq{Xxr)1_A=Gs*k0NDU^c+=+se2a88s`=5};H zHS!4P<0hCR$HPBa_i12eS@jorGv*gud^G1dYj~2ghDSPQPhMX%?%fcg04e2Vuui%F zm^bWmv=>9x0?Eg{m82I<3XxXUy}q8$cRpCI9d}#txVMlNk^@M)-tqnZcxW`=U50P* zYapG?1;j(!gTu|v`q1f%yShTBcec}TdRMwLdU{lhq0|3|w&5ZOG8&=0HF+3AG5$f_ z$OT-brYJqNZ^MsC;;W5swaC6B?e}PW=ue3?ntN5$o`N57W`S0Bd;W@@@7H@_L7s2c zeH3o#zrTkj{&Ou^E7DTQH|F$cCiB#G7k-JaSc*F_C!rx$E`a;~(78X&!^ORPFNVG7 zHR&tPy~e2bX_q+655Kt>1-l(|q?8|@df54SLh|*c*3lySF=ugD6vX{BhclRd-qC8u z-&leU`^ojXo(8^lkU&A2UjSC z8SW#-_{=yKsoE^@C1IhxHj8U2B36wvCwj${`xe>@V|MAiFw<58i{j_E8RYbV06Z0d zUlM>X3c!~I;5P)|g8}%b18@$73dM^f*h2XC0`Ol2;3EO}KHyB}J+9E2eh%1CC~zkI zS)idzpN4O#!#A=4hBEyZHMvgv`lilyy!Oe>M3HKryPRJ;Z=RDIV1*4BsRcO5+Sa|i zZgET6Ix}Ft_yBe5pOONcn1ZbQgM66>S_(n_)?-fmK(I6f#b3lADCrB7m4MT^jNLU& zoh?hQtFxBbhy}*Gpc^I~)dlur+8!pYoRhp-;cRmRze(Zxoa#=8v!Btmd6%LOLoa-O zuW*(#!4D{$ZK~iCU4zADkabk>cPU(-GrZQ}es~5H{Zz&0%Zh#?a8Vl+y*{rf=VKWj zjXxehf1GQ-`O)V;rz>2aSDdAA_AwIQ*{;6$@w&p{bf)8VO91_61L#X#6HPuk{m)Ri zE+-#SxGpE13fJZ20f+nH|COTG;oqxpoj&KdLgw?i$l-oE$UPUIzAJ!UWWxCLpADeD zDoc)zQ0jdDE)ZJJ3hp9`CsMeeLi1Md~`kfhN5>`1}}7% zqSxj8p#WTDH84Dy{%x*nCa%l>2Ncesij?yO4)?>qOwsFda!UaHX9MWZb^Qy&qsw!n z!gYD>P`ED7-*UJg&hIFCo$n7ST(^6_QMj&me^9v2uVd&Tl%MZ)4)?>;rRa6K4Jdk@ z@9Px3&d2`@z<(Hk|4HFG-zRf`=fbb+b(z9-y*SSG`()>;lyUzahcg{?yev^9eH$P` zIowaTa{}lu3ZQQZpubkp>+=6E3fKAjpCl>}PLWOFhjX{1C$8JQ<5;Pn{P>>ZaMJ5~ zlv4D%{9ml-b@^`zz}E)g8x^k0|APwG?cQF8`{6&R=ym=c$HEHb)4#{ze!4{rwJo=_ z6IJar#Q2kO`3eu0snl0IT*l=bj<2XZBPxfd-teBnS!W#f`$ucs*o8renQ&NH6E`1R zkDw2o2`GKi%IP;B{1T04(>V3!gM5=^<5}Iu=k`jTcWd&!2V)!0NFQnLB;cG-Nbq>& zj(OeJV@rE5`Hwv>6IiC-xB*zLtI)q{8={H{tu?{yV`x^Ygt7hkFkk1h4XZ z%{D+>NxbH6L&-+gIm0(beLq%`l+GhC9zr(8oMLjQXN*~?x@^`w=$HF8;^6#C# zb@WTLH}YupbKe;-+1!J_+-VByWgjrCZx3-+NS{KRK8n8_so`XTXtus(jdW-rOHW-v z`Z6r)#)o=gJ^Ix#d$p~ldk5Pf&Hc*KJ>2`j@wC>`1GvsnHXWO?4?~uB@2jC3uTC%N zeYI%&#AVfk?M3Og4K9FWTRw4AGuV3C!Oh-j_ed1L~crm&~-S^+r#)$D`W-iT4Mvs2mOdU;GZ8*H^ z6|8?${+)eRQMp%fp`i$cBKVd&{jr=In76_^u*#a4RNRhFYLa;;cfO;!hu`Gt@$>A9 zmc2(5cY%nKaiRXZYqI}K)?(j>ny8g)+Okm4TI}s^EJp$AR7@0V9sGuCu^pbj9tX5(EXOHk7m0%LhB#78&aT>V;z zaYtQqeOGf`OJm+LU_*0L!!l!?6*+pzC3PL$5LDXP+1{B)%OyiHB4t-o8eWI=nitEg z%mIEuODKQrwa>z)3^L7xUe>UD`iP4!%dDn9$KgJGZ2-O5$pjDb;V@hL{i&kY;h*9v ziO;{(;eL1`;7LW?kr*@cnM!ae2MaBn#U)=kMy&5@JLECqInn50pRbp`f&y5F=2W*g=T zb^bJ&dCe5l5xOV6XWm5ISlWI2!!?`HoN|A-W^*o8x%bVvz}xWU%pq0_Q#H86TpPb6 zUNg@ajYwQ)#!_@wOM6?WEz}fh#6`oaLygNjqWHTy8fv*3>(#7|@z$m7oh|9+<)P*E zUCU-SwdH`W`qp%HQ`=J99ZGlBx3o5OUeMCi+Gw0z(B0M`E{wioUVC?ELzB@nSqmvw z)W@_JM|#8?JhK>s-0SjA+QW74_lFVj(EA4Y@ApU2S9;FJ7)!<=g@H(6cnn%L1}O}b z7ly~66=RUXK&&u422GAZ3Iozc6}HWx(uU=b|5;t+5WPFpd^tpRfn*;Gw8^&+Iw{XV zN-m?wp%x^Ve($Wq`khctV0vnEgJEw05J zuxiqLGizLc+xB)mlyE%U(w}Mbq`YdZ)zPt^r(zoSPy?m0Pgp1q+fV?zy8yPU0QTDg z*nt8V-yx#XVUaPB#?CB2m-Mjz_8i$r2e4Kh4A?^|U7!@}~fzGO!`@Y-7(;3I~ zZ$WeBDO?OT!Dv*g=da-7MdQBj#g{zatotb3(kp+?EdGBE zc3MfWZKhK+K2;Icma+Gf&0er^+=4(9xnbu^*BqWAM?mhzZzilzZ^fUZg&}a zng*elaLe~ng=x}let~e7;!bFnIro12WzM_Mb0Fat_e-ED6#qqUwG=XEX8c(v#l4iD zV}bd3PnQu#*iC~{UT_NL9myARLIhRo0>^m`{qp_i_^y!u8(fD{?|F?H6@{Xz(p`E{fKL=H{&C=Dd_+CHYn6@E#X`nyJpkkMzS1uQg~WG{@l)mzY9d z=kP@iU+?Iduf|`OKPw#0Pw=@bY1I|6p_g3E;kQETvM>ii$G)l%{(0bBLy-8eyi)xK ze#ffTwZfpG&@jG*`1}w!`7FYhO87hmJ^924LJ6N|p*L$62F>+lU{R3&WZB9O_#O|Z zEEe+F=ixsCUdZ3Qjvh{ok`nVLhfncvu4NSB^A6zjH{#Jp1L!LQaGu90#Gh}H6vEBg zlv(6xFxrO2oIBTA!50@bU02uDbah?YNUTs`efJ7OW~5qpR9Vas)#aw;idmhSookqa zA-P6o!4!#=baNU=ve$3g){FYzg7p}{}_OO zEdb|kG!?@W!B6;ahn~vEAF=Ql{PzL)iwZv(df`98r4RXQoNtm*5$9M!==GaZ8ke?| z&dhlX=RN{6mEb*O2vu%B2A|;c{M0I(e1;wUA`h2wPKUxZpLGf+9~u8_R5%gx;wL#e>92^t+hP2~TzUxodz_ujgNX}9D;Wn0z05;oE#9YJ zM*vFb-)D`X+ZC?)n?-a*A9eJ@0rYzm&iJ0;=-J;>@uT^dxO^i{`m^w(lD!L`zTBhd zIG3tI;hO(Kg_HmJh8p>-a7}-^!kyN**sXB#5jT4jE|_uP#?cZl$(Is^Yx)X>YkyZL zoc<;Z^H8Wq;hdX`TCZ@@U*aq_C|uL;P&nxu9Q`hZOW0|(PvN9*bMyxkuIZ<_`XT9X zgQJfqT!$y7aPseS^ht$l`eucbUg~p)!Zm%w@nah6bWVDBtutTg;ftKP!^6ca;T8Tp zj_!7kUc&ix4`1)h!ydlTnSbozLbun$cRBN)JbaHc%lKNtxzFLehe0K{sjx6tc(}N) z_V9=^a}ThwsiX5y&xu7V5C5E)v>gm@jDPq)8aw{+%i@=&GLOU;#51qP=P%%fAkHk| zl@&YzW6~-6mQeq2GP5oHehOunUKKq^2_^}gvx01hI1Y`aKUf|9@+)2Y5*ZwUl2=o@ zA5TJBRfzy_+I=wu-Bwg*_FVCy_?7Vw#XlUc!_Ff3P!voF1Ts-<(~}U?g8S_ELqro( zh;l9>S}H>NpM~R+b))|QN=TqEVI95W@D4A5xs0d$wdZQs$(ZLy&=-7rJNNGQ?8zO) zAI9_7coExsV*7$gbp0mIEBy~0P_m&5Met=}vt7_C<_sncl*JUKr#5KKb(dqf!O?Rp zNq$g5PC^JfiHx{PZQd$Fas}puYzW#KOu21>3=LRKkWd8HaP!f zY)_2J4?oR**hyD%1pjkmFV+V7?fW0JX4&D&kMu3%MdkZ%(Xs!e`%A7_(#Jw;kQR4| zPlHm0)-sQVJ=bPLNqysaBEPPYhVzO-IO{a(KfyN0U&x3$9tl~NyryGMx<95n%tpc^wrbU`5p`o$aV^xbWeiI-utH5 zb3whUN=D)!dTmLJn^9-WYJv&Hhmg@ zo4<&^+!1ITLBH3IWrmK((tV~N-Dl!MM`cMql}Ew>iXAbTq0C4t#g`a$y2u|&4y=lp zV7W8r^KjN1Ng6$vjm6s`O$0(^HnY()pve%Nv2x+N4!Dg6+xpEP$DfV|2%!S~%gGZ< zQiQ6!Kbgw>F(*$I`J2Q!FLPqu%1-^jI%FsE0~yd}q_y!Zx(zX;j!xt0^9WC$msLYo zUJaQi71a<;6hkf~?bt45#&&qtaE>`~1?Lz)8V(R~6#nA<6wP`t{SElg{RI=@(XX2L z3bi8*e{nc`=kRC-iP49MLl_cD*T219=`vD$wx=`6ffXftKL`OQ!chjb{lhD#Zt4Lm zj5sA$22g-9CSN^;B?BcTW z^JBeDXFQ_t+BCdM4O~!Sxbpd%Jg(uj6lpfb(fI&Ps5y2?4V(!vMKT}{uYH&AVr)3V zeXl|Q%ow(N0j377LG66ey-BLre$RJNi0#*WBBa$?zHte*)4(=;qYmi`MIFC~J)=px zkp|$lKKMbr?NhKCi79tda&9{k(H=Rakj=AnbM#o7RlOrGsuGjs^mpV$A*)N)B?o3l zP_(2@BXjcWH|yJ8w#R6caUG=5TnE9_>Xjs>HfG>O*K8U^f>dVP%B##xj(f5#K=h$1 zG_{%SHJQiFy;`&onfKZUS6!Rl|4{lZY_k!TR@TDC(sItmPrefPF9?8_uG>LRRBB6oMo9L z;wM;7;w7e#v6bb<(9lWw>^;l&U=+fH5zN?(otdMaiYl ztF~}4ee4tR=m#DOFdy*l%_#UwD4EXIDBqV3qZAK_R% z%C!OO1BVkhTOR(TDHndu*!s@Z2@XIIf88SAM>mR^Dm?S$R~kjcm4VebKm0N)Lb ziwS$L25gsJKIIc(OH^s&i?G$b}>?C=F0%~{c`Fg+}kgp&i~OIZ@7Jn;!$4$!(6 zIMk+t5naYmPkIqzCWq6Ti~zLc;0+~ve};w$$cAL**M0_?6Y<^aMsLmbpC)W5>UX&D zh>@CYK#XNh7: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Ç&J5=hH?3R=eS_%} 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%0AYuLUq(ZyElU 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�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

      N!98}kq6Jq|onVx-3QZ5#+# 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%0Dc&zHeWrHUr?%=4iq|?`s$8B9Zou|F@ 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

      T(%`z!HI(x{ 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 KbirX; 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 z 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 z�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�WC+V)oA)1omOm3A0oB$XH~+HP~{KS_DJ9fD|}{WEYR z#s}v5xq1Mx{hQTUgZhtk&qO`xYm;g|7ok|H4^{f1<}j-1Lgh3graC>pxSuCqtb1N2 zow}wCO7|k9veyG^BNX-^qKi$TD)o1DQsEMT3k0uvML{px7VTHLqh~Q&-Ls(ct4eJT zC%+DX>Qw(m4so|M;h*h#AP`Refw7&qQnQ~ad#3E!>eSozL{$Q7nIhYpG0pdKl~kpE z8cu#qv7g$?@91eeygK!+GH71co(JGs_^&#(-wN!xll^h`ldwwrGX@1)cHy77Ch3Y- zIrDm|2N^-O0phI0Ik($3Dt&$046kc%*fQ+d%m(~U?)WBl)rS4Zn2jW)ef!~)9P4V| z?%Tq9Bwm40Y1N(gl@wwd^d{AoNmQwHznr(ZQMsY>`fAx*LE;H*L>wKDK3O&# zgQQvstyVLls}#J5BP#15bq!BK#uOl3q`cMfY_%zSAoJo>bI)( zvA%479_v2LrrOAEe#;B^mpvQ$r|46vg69njsOy>YZ)7FS`Q3jaWi#WUAbn1dzPKOi zaMecoE6~SJQ$wwe{o&-Tz(GO{_(JjNfoWx;RpXi;pB1DxtC63%nx~#pT@gxq2#2FH zuR(*!R1`^Bk7Di2G)SRq*IwiZqC+W4gSDc^hCQx4+6^r%dr76iS+@s8fn4ejwzn15 z#m8WTVXF^=@M99&&}Zsup1AGipU=FeI@K4OMf)J7ysp&Fyr!&2;b@4yC<@ZYv)jg% zK#w?&QBpWR@5X)4_M-4ldS*h$Q03_jQsubFu{=NLP15$Fnd%N8<9~bU`QS-<1O3eq zoy|7wAJe{J3Hl$?Z?lisiiFjvS3JGWQ;cP=gFza~Y5E=O1=a6-7a}zse~LFaozG5i z;Z4=~JfWEEd_G}2pFQ^~KW6$JbV1hldsf=(i7txjFI&4}-3c`EJqIIQtou6bivEea z*%q!wm@mZ(?fD*byu|}ul}^vaqL@Am{zeUpjw@5oP^e7Vvo^QCLI=n`KYnu1`Q%=l zKe6t+aKdT3_^5gd&K^Bn>gc&OevPXs3AQ)*n7*u*=eQ2eAIy@^Ip@@OS_FAp=qMNkQ6kE!?GqkB7~40)>yzHuKO3 z$LnDN-5ZKikPZ@pJhX!6LQp+$Qi61z5agj19K~K;b(-x^i}UQHZp5mQsOtaeY&4nX zaB>U>V75O9Qf7eulpePrJLUACGqD!QTVF<%^AY~qO*o$+qZ&-duPI}$JDZdvA*Z9JX*v2P-0_%{ zQ+|Y;jyg@t4Jf&9NIB(3$f>C0t%&OXh-G5PTo2$~eI`^4gONNFP=TM&MeZ$chUK6) zwdK$@O*37~C$m?wpf|CSu?VQ=E^eUjSfejNzyPt;dXHjjvAgWvH3TRH6BOA5jADQk zt0^arfPoE)8>Gv%gp>gSJGhaS5HP@!oqCUAeb`-g?=Aw@5=JpVipJ$wLcoAH+nMHC zLdpOEt2pBm0u|SrD73rjO>9id?kys~Cnq;XsRU_tR_DY;vT>y*U9KghCh-I#kg%{OtmmXI2OW+RZXgh0jhCfe+-?q8PO z+fHB-WZKEftW=j9N1&9YH?1*oxt5R`fwe{;V+nzZ>rJe)ySf8gc5gR{1_8+2Te ziOaQwlmUs0jX=f{0u|Srh?w1F_m1Wsa&*R<>|E685u_4(Az}Bs#eTckU#(SS`zJhw zO{*_1aNnuM_vqa*{@!pG66u>Ge%+$(@s#e2@aY@AnJdCaB$=m{d<@C4z8y#7D+LZ! zRZmu?2V5zYt=6~aN15?<=J~REK70nB=wfhK7nsMO7vbToG6duQOM}jvj*E3yz%_bA z$6KuIQ}1q85Fbm4=hxalyfwj4zOuOWQIoHJekBAAw@(ZTF|3JC%HA&vu_zhIe}>dC$EL$-X|;?pp``#d5tNAHHHEi>fMA z-y5rH<$a{Mt=<++Zo}P+Q@>Zp`b}4&t=%$#U(_Y~2GBVLofQSmL8<@`VpHX4=#?1X zV~n4!EY|n5l@V+sI3A7dXgfwpSK=vg`2?s65EZ4KRCzQ$Biqi(gK%;Qj6pO++D5Y< z)Hl@XW^{pynid49Nu!NOgd#^-4dLX>tO)YI1?N&F@3D|kZTxU6hNBtb8j)z`BVsjS+LcNJK+#sMwN^f3`osH*1v8qIolEUHSZ}AJY zAbmHbg7o8LsxP`z1I2Zk^yamUMD`~KDK&`uxZ>$=fKbA*IIY*I3^sG~vE}SB8Od^z zg_BK%Fd?yd2M$oqUECn3a_+>=kmaOsIQdsxH&9MWp`2v8oEj*;8xWD3`?xXX%Q>LZ<<=)zIGMylX_Qm-jlGE?)EXCV%TEGLD-$wPEGDTQ*9 z>2hjtH#fGN#f&uNaa!$Yj>NDU5L6tL# zgCWaF;c)UqJbp)gQVQiH)8*7aaa+z>Mw)VR|6|KJLnYAVRQu`8+PSchf1K!srJ*Gx%t>~?lKw4a+2ZuGz{%f&ORKVoO`)JQ03f>gCWaF zVSI&K$O7I?DU_2;ms119Z8--RY0Am{k1eMj_v>=1{q$yTKDL~hdjg#^2R#Y0aPkBE zM>*9kKyN|~`fWLRFEC^|DI89Ii9J~QZc3q?>ZXEY+&eW;T;-;-{8#Q45}RwG4DL#- zreko|%0m+L9A-D1JVs@>c?LEcr$bI%^{P7`UI$R!d2bIkqLkDaPL|_8jN}1KW>VCN zmP%}{$02Zs#tCl1$zRff^yc|E*m%vy=0X+W!P) zl{CRk{ET2(?@E{x>%Jc9^*|-}mp#xxU92N+(4TOFHk?g*vp=a4P9?Z8H5PO}zK$9& zroo26)M57PG+Zo!A=txYnQxxsU&Q?$p5gD(kLUT5D&Ftd`s_{A8inDGv+$Sxr?y@0m`8`nfZUeVa6Ij;Fqxm4`Xh!zPT5ruo%6~tJ`}dPLG{PvF z8v`E1)MEGFPvYPc4gri$dX!JP3Gm?w_3tNf?6%;HvX^o@Jk{Toy%g)_mrddciPLB0 zbdvbWv=7?6(*0}S=Wk&6n?)^C1nK_Q6+Dnh$Omct&nkFOMv~9M`Zp`cg+6q01*tRp zeGPserhXEJ2Z`!;V*JtSUi^e(0ulxKr&9OZKqECd@;aR*hOXdLRo+1i(lE`7j5P@R4_cm zFYWZ5VnQ{%)L+ugP2#7M73q^HRtbAna^QepS>T6=_CZ;?e1aN=;JBlwn}YbA=Uz3y zs7~LzPRX0^np3^VRS!MVKMrUn9`uQ?qVLof_AjkwB3ktnchWyvqm>-k88qBgvO^#6 z=_f{9?a-n$@*!ydpZT3o=6P$Z`vtgBSBAQh{~AfNS2X-=>G2$S)Bp{rPS+RruSAUZ zxop-UZKXp!nN8bVh#E?qG1hKPC@>AcX%EoYqE62cP3m(^BI;TuO4Ra5JhHqM?q`jm!v+gQwn z2pE~SWNG9&ovvYaQ_~#207;cCjZ1;`TSZL^_?qPZ;3ZCe!^7ad!^!c8eTVZQC86KJ zDmD9fw66l?aM@7-51v#Yn_>0~&6cdm>|buS5p3JdJ}<+en&kzFVO66dtMYF-WK>}# zucO8I+{ZYCDF4+g&rcLojEXECRmiv=GK47qIdQ)uL%4+hri_Xt3YOYfrK5J{)1V0zqe^3=Mo$_Q zfhdwpqKOeCuP~?c9_+)0VTprkM@2jHR~6(pq8OKqWPTi5F@(`fbbgi056Vn_P`-S4 zjQLF-)svt9B=Um^PJY42D3U*BbWP$GhTKluI}0v_N3zGigXkzbv$=h961l|7e@+F6+21AEE`*;6%A)j!LG!1`ji0G}C#eS;u2 zs%UwB#i(LdTxovQA)|^xVxtNxMpk3LTSGmJp!Hz| zd{{Gt4=YCU+^};*aUdJQJI;yxg{be?$o!w{wmFM!3t<8ODO+wsd@ynX4%EKBcA7Y~%&N*WPS=DY_`GT2 zQrJhj$Q0E&^8;lRPz0YM>O@d7IA?gaj>UngR*6G9rs%_+WA&DPV?J!V3~Vb5r{F_wnlh0J-6mgG zw|h+W)aj;w!m(Rx9c-(8NB&GJV74~BI@d)UZDp|AsM#+i6yaocdI%r)j(rtmtS*(n z{F`dhOU8Xy_Vb3B?k^)g!=$(KT-pfhe|!8n?6^K<-0GXOM6q!!>yK$|dRu?KckKHn z>h$yVCiCC5pU1B46kd6uPGaW;I~0ffxcMIp=GHw^?wZX1q0rk-!*=u6QiK0f?*IFD z>`iAQvS%6dQOi3`)E*NTF}#NrfnYYF&tN}KctF;r|6P6SMWrh9Z>V?v>BhrFt9!^u z&oX?SIkw}+FB;xsIO~UDB|g-%QypdN@m|CG48PoL`I9!vM@@yTHvCy^-9Cs>uX^}j z!KtUu=!xQ(fsfjT(!;gFhT?ocMm-VJSfffyD8#ob$?FYQV^hRU^XTDsVwC4?2Sda( z-lZOSzVSGeJ$HHd_dT3HnHfsYE)V~UhYxu82$W|i{ruI}Q2b~QKh480_VCL*e2#}N z@Nm90F_fKaJp9KV{)C7B8l3gsWBMa?-+=mm)o?qHrMd?IAC7i0ls!jz_z509#>3C_ z@CpyV+Qa92c(aFdoIF&ymVvADi@)zeQ1>y|-sh3$ysAU#+3MjtJp6eN|FehlrOKi5 z9fppV_U|+uvl`>Ve!janl>8}1zL_09LX+Nv&N1B1C#mjx5OFj<9^NB*lGevgMg;Nd?4SN<^i0kN3{yz$w_N+Tv%d7hOPRW z;^827XV0Cho)y+%QldGn^FnQlF~M0~!=h#-*mid5M9fvRWGPU*t!}~GwsB?Wo_WqW z87+7y7_Vz+UAmNy1FdQe@c^=}VUB_nYHn;?YI3@vxseYV>&mCksJoWw)zief@>pHd zf|j_78Uhd2t_%y!ppDa}UpBQ8v$HiehRUaYu6Fums$fk^@aWR!q%6(NNhO^Ut1&5C z7S=T{Y1UepYKRolh|;=-`Lh=+)&{7o89S$SL6dQ*h}QP8zzY^Hh^y(Knp@+Xk#EUT zSprHh+j&j1F>92vPd|!Pu5%^fr7~$mHkXE`#@UNoQHcxdTIMg97ndm)H(pP^xOEXX z*UfHfZIscrMQ9@%8yD6!&2F)#avm${UMfv*nBUj{*R?KfUeeM?o$#X6XzN*&RuoEW zGBaYSOlg6hK1)r_x8TgVb@W7N(iNA~)l}BhUAuJ2^~#FHs&!d|jVD-hMDrFjq1Cb# zwzSUqLSsX`g>78V=SR1&;VnXKw=Ql7O{%)Au0^F#yYvuILwspds1`Z$8F}5D1xvIY zs#@4Wjp90rBvpVWu&{H3XJ zv9@?|GiDcy&&zq7--t}>=)T2EFymOm?D&Eurim)scxKx(LOIT!5voZvUXNzc)TAU( zip(jQY4%8Bn!Rq2RHf%NvwE}_*}il$%bXZ3jV&#@J`|cdEvC=3ia>8G%j-T{`MI2P zc!;#rYW%YZUrsD(kiAY5YB|#zsamofnQ8~R;c^!fvRzqQSDVQ%Q$DtexsCH?w>HJ= z7R^;sE%RrWW%{JXwmP;+)ecOjqfY9%Z9_KrHhKZ4{M^R2texn~Hbr{cD5(gVXJZD-mOAoDQ`E-zon%qtqK4)hLJh6x zSr^qcw&9d%SmJ<8oyb#o$exbAH2!j(Bi!sp;k+uXQ&#GjD=Vi~UGllQ+St@s4NuxK zHvx57TlD2dRkpGdb77kCBW`1GJbYI;h~ReJ3ECse^`Ams`t4!CPY`;3EI9Spd|wq@)^8rh+YGex zM0~9L34)&_IPYs1C|`n)m5&L2vf!5rev06Yf}bil?`s&SU*@~g!|xWn1Zk{24+=h7 z@J)h`5qz8A(r+&aF8#J!a9Q3X%}GN0Ww}l@+-+~?3whbzuJXt)_Q+o+_-919ZWWwE zZtI_fqu)M<{Hl;2E9CDHJR-PUze3h;uaK91cvo;fQ@8dUhH*Fp{l=lV&kV4xnUKQcn$LHg?iFM){7cbVX_9c~m{_9wp-T=oOc3Vy24|EAzF-y_T;UAO&5 z1dj+kb%wkCX%X_$KVSFAKkSj;F1XBhm(W97?epw+gnXH>^F6`O6g=->93W5!zv{96 zKT&Xg1!8%*;AabdrQm!9VCAnB{9M6r6?}r=UlyF#FRSM}f=?9uhlacU|EZ9d{(oL@ z+0V%JC8XaD2zl9lMleGJ`t3Y?tev9`ckQVc@)rpCC4%#-8mlKE_(g)>?%|IZ&J9m- zmW^S9kmuYtR{yUAFBSZC!J~q|V>maa3&9?O>A2_zS*{ZVk0H+Hd#>TGo+=?P>uZW5 z&uclul@32q<+>TN{fEu-O8QN<=dpsz z_J4`s6-ZKSKg<(c_HT;?m;Kvn!DaupNpRV}{YG$Ezkd>3`tu)x%l>Ty zUg&0EnPmMQEx7d0i5^}ixb)j)hP&rigOHc)yhZRT*kt|LF1YO9?hyP_LjD_q%YO1P z!`*fw*AJ2HJ&WbJ_$3`k@9NEB}JwZaaBJ$kz(_Hk{i zm-&_)&C(7oZ&YxZ?<~XJd}j-JneQ!v%X}Xf{7U3+?cD0&zx41IJ$%351w#KQ^F1Z) zm)EaP8_s&aK**mYxYSeT(NiJhrJj06{(R)YaIKJ^fn)23MS{zGTRi*$!6ynm8w_{L zyFy6d$I4GK+-(n&g}iJJagY2B9{I0$N0RKs2WpD*O)b@@8MX9+*w?$PsIAusi;_sBovkyj6Y zksr%-j>xx=4{;F4&&9{q`|*NL6#N3g*~MDf4(i`Wqqk1utP8HsTcak zu1(w^UW{G zY5#VQ{0koW-GWQ|KW!dpxb~lDILj;Tzfy2%f15|o3L!7;f5apIq(^?I;L`qsA}|oa zwf~Ta!m7Tc{TB%??XNf7)w4v%OZ)Hg$Uo?j?-pFz|CUG3UxmE1{}g`NgTQ)`_6LT$ z_FpCBrTsU1 zN6%A2UfRE3aOwZzlXSUU`%g7IAJNkOYL9%KN4{BbY5)BmJ>L`Z(*8dPF75xL;PSfv z7Z3l3hmR=9*00o4Zn*28D}}tY^Jc;4LZ!W4Jmk^ygpikdUKL#GIqKx0>uZeRtS_nO zGQp*uZ+rASBIISg@AAmM?velWDOrCu3O|hZ@D+x;ett;E^U`hoxn6MjJm+b_<@221 z2ri%Jyd?NMq5qE_{*K@riduU{@ZlW-{V(s!@XoCYESDL&s^gP|{81oQPfT!mU$#_m zneXj_%Y46QxSQ_}g}lu7=Yq?8KM-8zTRd77V^Dd=8}8;iQOL`DuMk}3yIgRY?{@{4 z<=tYqo9{LuFY|p_aG7t>m~6RZzGDTK`38o&`PK+|nePI@Wxn?aF7y3~;4 zLCDK|_X#fZE&0sQ<&6q1^POe5o9}EPFY~=caGCE91efLgncy)&lmh>hTC#YLmb0%4*$Hyq2CKV3&3o?Zwmee z!QT~pq2MD=*9z%}Cc&!&j|hIP;nq$>sc@5!m-YUDNB(gke*rXD`=1b8`t9c)J--$5 zQqP-$^VY}e|IpEMzBWHJY@FVqA7%*oLj;%h9OmKY8t(e%5+N_g16K?FS&{F2!K($o zPVgGRlY+~B;2yzcKk#G2X{YQ5x`n*#2c8pripck%GjM=FzsY=05M1Vaq2X@6lZ3p? z_w$0weD4rk=KHYVGT&aq-F$x`O9j{mRr@P&d)J-s8dc1{xZ{34v?Qa-O;BfnX zWRw?O1V-~?-*>EcxoICaJKVl^*zIupe&KTtx9<_|b+~RR_@6UR?HC&EyF z$ZeI?m*nS}1_B@Cg)YKpaF~B$mPOTWG!(|H513n#^HO3$%A}&4`SGCiAbxO=TE7E)T^^Q=XUNR$sN+XKE#voX%O3MA-M0;?gVbJ5F1eln z@wsb9BH=o6YmZKkr8*`DLF)RzWas8LjPd)B2+M)cJ}m38o@Zx}`Z_1KrkU9_ZcKcw zj_2e{A|9F4!lF!hpg8w9b^Qz{KKD3veZ3Q(dz@NdnB(vCirnMW`fgc%_#^i?wZ11O zUROlMUsxk$bdY*KNWD{8_6+8<+yddyll;f!ev9l*A$NL*m2k70|1gc~X!`H}G<{WS zXI1JMZGp;G8PLxx)ZDNi7ayc@);{9m-0x!fBV{8NyC}^rme~`>x=-I;4QHx;(^=!l zwx3w{%Q#CnF#nBwytU;-B#?8BI_YBFf6B;z7NU;4%^s`j+^)(qZNvT0ig{xvMbjWz=bB~b#alK2pU}k^Q^|N-7pKr1gQ&3 z)RM9~*`Y|Gvf#?$W+GxN8-ynRs`7P^t}6|CCznFZXvP$*MH}WolTg5XgVc;tTlo>L za#=w(i_4@pmFz9+;VifVu%~$0#UXUPC}dUYZ>i^Ry*fxg$!m`~)3k!@WcZ!86m2X) zUdk37siyX4g81cJ$8>zq*;X_!H9BZ`UQKq}rk9#AwRjwslfufbTtB@?EuN+4P@mUJ zgL|WeES3`Ga+^`iy~?-!b^XQ=wdEA2e)l|*(?6j&g^Bkg*B_s{YCcxEX-Yk-Y}A=! zT4LKzpdFydTJK?O2NN8@1s`zvF}1d85Au(7UzSP7#xQ6u*v>l#fU$s=S_@e_ zsPm@6Ei9NlI&uqZ&mIL^BAKJ?qMdfW_sp7w8L$`9teOlchUqzg1E3th8CWpEW&|6C zoH!O7acszg;<{Yn)h?L9)LCOvFK?*_(M7ZKKFaHdT{e~VglkbanWjcP0Wg=X4;|=Y ze~7aqob2Jw#PUKe2AWyDH}zCm50+`J4mvk8KGuDIZhf#AI{Wk{eR5_!)uB|U9#$NS z5kR(^@~msMcv%#tJZV#zb5FP?ooI%5kS+}-wiK$AaV!}BvdRtytCf`tXJTn(E+3tQ zVhWcRrf(6Y>i7(1!HjixW~^p)ZrO%^ve)Wg04cqO_^gs$JYW0JOY(%>&55k{2B{CL zu?jWMUaStVKbCqfoLmMS=}RimuiV)2Y`EjQD)(C=b}cz9g7#A=Zmy^!}%zn(;ww5oQL_eSM2#g*M_rl{dagk)fR%;2%(Cp6xy5H*qv{P&x;@0M*!VV#j-~#tE~sWXJocf3m&4utBE4>a17s<*udGEBm2!UO!U99`a zj3oMnTuGLTYURR7WZ~qwNW=wah7ceNCy&ws^nt5^ES&s1V><7q7cpkZUb=aPyvVrp zW_ry{OcqXdYXSO_0>@$1p9uEVS&E(t>(($ToKywCk~>DO7;-$Rg&d>eO_d#QwNAz* zxfVwZ*bVHiUNnr^946AuV7l?Vj15|wCjB_m!hTk&NW#O`by%B$v#N>l)hrxluSDn; z%3ji`T;=-uHf`f}Sg6|Wll3_{VEx8lBMR#`>L$ze*UPvh4&4PwEOFIi_5gQaH|q>L zh*Ik+Besz82-qz$yV-^M(4m2|DvU_P?5b)+6uobvn1$J;uNidddWT$Bx;H`3GMIJZ z(UyOTBjK;jIL!KM&kG!livF16?LM{UM8HcnmYvWGQQ*2AOZ`pfolJH7$K zQ7Em}0OY{?%AoV6CM=wEC{&ukce;c1hnqQNy>0+Zge5Iuu~|%=_h~pInmDYO%V9;6 z8CIBnQY@Cr9Jf4 z5BJg3jssZo9pevOKk5`_`wDj)sRnO_NTr(qP3dn|W3?o9=_$lfe-SoTf9skJzejR0 z96AWGN_lnqel|q4<_O)h;niG0K02)KTo@?fba_S4IlTmHl5lW_;nbnA1JALMuuY~B zfudXjp@~mje{svm#4Vxxu5dC8g{f&3I*n4p6o;#V9AJ(}8`?Myd;Je8C$$sAy7y(` z&R|?x#i4v`SH^$+n=<2?-U2op%kLGOEzWW((e>F|z~*OpONPg~cW3fFo%tStC_J}7 zzBsb-Q%{{v=xE zQ`)uDD*9hU0$j3q7McedQ7q_^dt8&+T9w)nr2Z>N{WVB^q`DX*+|JB%?r+jp;vVPO z_|dq(*@3vAV8u>uCO#Fu{VwjLZ^2!?Ug_BmCvmU9!EKElaw2&w=)6n~ZdwYtHI`NJ=G1U*3b4Pb`s8iD~cYc-?6HeZO$m)r&hLfF?vK6EH#6aIP;64yfZIn7F z#)VAviE5Xp?^c zK+7phBvwK+PbE51Br3yGyQi@_d5)rqPv5qA6Y>uAzogHzAl;>l{A|23NUu~TbUYKE z7<9IvsDF)LRz2~R_?#g1WffxtQeRPNvg1Gu2^r6TDo_>E|3jX$xSuO8?LSy`nC*LDI=CQItEtt@-1J<1pnDxykgi?&_3&Fe4wp zq`y_tMg!B2l&~M?vRW(E_K}hq;OY-emTa{YT2NgEwjKe#= zj=b%7s_d=)b9AP9Jb~lWU#`40+6-b4FXT9q1eho1+PJWq5{{@|^)PCv>^-%X^Ts=B^s#3k-ZjwabU`@zS*q^5 zxg@Ag{T11!hLzx4t5AtHG@`_!L(hz;Y-7YqY3a6zl7*$#GTfAQcK5)zSU0CL)-F>I za#={Nd10<*4#9HlR1KyR-`bn367B5}$?M;mbwpwXt1nNTtz&dib;--#%2Cx{h3+L| z(QO`!Y?Cow?*B0~LOmw9i%hGWHm&NiDG@aXS>^P~sngVKZ0hUA2FU!&VRCu-d6ChR zr(7{6GJf3napy$NEG;{;^sLgeBcrD_&W!}Kp7ehhW;%EIu^*2*c=B5KZ4)#>8c zd}XW{PBRrom~9cZGt54J7r{W*r1r9Nr;@b~!8oR3I6`k!+O=k1+VX^9hY7izX8#j{ z{mJZqO0a<;7`s*mHbDm37a4+$AA$u#Fy4YQNPW#iu%uzKZ0sc&Bzt5C)-wcqZV0y9 zVXSxidxZ;`5!MZ9!>S$R>}nY#r!U4D&fjn{kVPF90h?~v!`SBHFAks zCZ!m-&B#olj9SwL3z?v>$KmiU6L(W4j!W#s)jBs3u*XdNZy0|CmsVPiHJ0*khVscH zfv97b)Q`1EW+5^d*{Iefi6DN!#H)3Vc(7)#%&HDT0xKUfnczcaHa zOy$V@N%{b*@l=g0f#`ITP7TOvmLHTDe&wj>?fIPrtA^#TfE`>wg}$@Dw=h2wQFeEk zw3j1Z`{hccs2bS}tD-=h^PAy&v`MWYB-YrufotqsGO7rR2u&Ip%UE^kNGt>c`zJ$3 zfMkC&I@Z$%Y7Lpo2CpGgmhY?%GkIiwP40Rz^mB9={vmL%Vd`-Y4Cb;vYL2^l6R+%6 z>qt$}>qr%x0%LW3(HC}(x>_ZvT~%D+6bUQzxcEsZ6L)bvJ_A8Srz&J!N`?Ck|tcMe;1(DLDl5!IvC z72J_uFpDKBXUP%9wcM~MK6?(f@uhk@-|j7KY??hTj;Sw0WBWJu2@I#;LvETV zkqXDLu?-R2yjV}v`9Dq1pFA>u^HV_V>0t9e(E_ujEQ8%vnte7Y8KTDi(Gp_cmfzwi zcHA;Cu5>d0quqd*aXA(8b7J)6d1!$YwKukgq2kGUxBLO?6KV|$avin{k|dRqPM};OFaO& z?WgRxwZ-rVwhVUcdI$C?Z_gh)etppJS_&gref;edTfslmX9&K%i$G0G|FBLLy3r%Q+{3@;;rz|;Q1<^6T(uu;8Pxb6+ZR0Ye>C!TTzr#C6$-uY zkspEU1NGZAAJshq(wqoBls)4-`~nXzH~RNt%V6!VGdyZeEW3VcvqulFV?)_yWy)K{;OZ$iL~~10J4_@>74i>C)}J&8H0SGF;u?Am1~Thmx;1`q!A@x4O51{$`K-O&P*MPIU^&Ai&sQVyn*Lmb0_wXG?PrJE5 z+55cTdF21*;r}ptO3n4!-a8$E`X0(}r-0M`s3U)oNB(jnUu)#;eb{1;{Bk3|h7T4H z)V&tA_ju&*^YBNFo?0_^m%0aoo}YT;f9v6W9xk7@#TP7UT!NKTs)N|HpswPwSao$> zZ0h9D(#Azgu4`1U0ARrju6(gDgoPZizRcprrL*JNm<4k)i#hNC9#_ZUA{OQupIVQ` zh)C41WKr`{E@0uraq$6T(jYbejOPejB{@*9gMdYI6t(NZNS$_B70IZ|6bsvir8sPu zqcq5v_=1Loh{0X1jn(>5K8kV83X>|sx!lQ6obtx^LnZMlqm1Gc)W0i|}OX?cz zTI6>55(*9-L-l4+A-(X2c7b)6CrYJSvSi_c#%!y}F%U|1bauH3E)H}3(gkQ=q7j9- zVvRheRBYOmGA*iBl+lT}q>NvXE6!w>pOJEN&s;EcIxbX`P2yE=*R#oKThc9!i?3a< zxG_{YWpdS&N_d%T7U_L@U9DK67ktrcZD0)@wayHe2g?EbgCmNkrXv5Xww39S}WeLpm{zP zNt<&6SF&0f3cX_PcQ{VN&><6E6a176#WM(Vzrf9@_}F(|PcYoobBf?n5AWL;xEX_w z)pL!IKaBz=a4k~?SN|=7OL?wkI+Xlc!?`KN$L4FlQy}LvK+9iu^qApC=pRB4pA}m9 zqs@JdwbROxZiicm2uxEe7g24<9SPT=4S+@Ac?;Nyy83 zDKIAk^-Dd+8}8b3mXMcvuJXvw6Y>`cJKF`nSn%5gj|%=R5C5KrZxTEv^!!5bNrL}g z@N&W57F^cX0S`YG<8B7}Q_7#~;em&L&cnap;amfgf%!)9vF+rSf>#Ruy5Vm9?icd1 zzDAe_ht$t!Jy!pP9^NRp%=g=dyZJsU5l->03I3ckg||F__QkT0O&2-Ndge5{{8C3v;qV+EJ;lLVLYR|qcU z7YZ)rZxvk1-zB(|e^78Kzgci8zf*82|C-=Z{yo8^{K%1T3IhEm<&P0u%8wOX%AYT| zl&=w7%Fhy9$}bjN%0Fy4i@`3$UN7ui3AA7K^XWqY5M23t45z$2PwiSLuKae7{PTkI z8J}%$`#t<<^I)F&UMA$v7ra*R>4HoBHw(^ZWH#UXJp6ZpOFd!pJc{;6J*OJ(`r&*b zFZ-EF!DWAPtw+xng}khf=?BCUKCu~-)x4bSK8XVa>X-FC%5c}7PYZde|GxyUhb~**;YZ;Bf%@z5 zvHTbh?+{$t^L^8iQqLTrXQSW^fh2Y}^Zx`cUIc}dI z&d1LQ`9ScQf;S3&jo_z>^Gmi9h^WBF5HzjNv?nvn#5We2?=eW4~9P;c)vq zp>~Jc?}_hnxc#2^F^Ajn!+^u>_r4Y4c@FKd-^mU0)XsPj^<@S3`KBwg~+JAM9v9r!O=bZ5ohJSsIvAt8_7!#su8%2Ni z3A{3b`M{1!hfd44bATic9CZEhLBoNdVc2F0suwVZw;mPr(r!KB2B+*w@(AgNeWOYP1zrt~R^UzHAeQ(5?}z*q>iFVtZGah)W|X}ZqzkIk zXJDq2>eL?0$`nrC0DbChmS*liXhP!kf&i~)?N$fNUgvMwdA!#gvoZ2`V9&XkcVsF% zUc##+nDeBl?aa!FSJ#G<_rS`k)Kk?He`Dqr;7eGaP^t#-qS3E(iXx=A;a8k-ZFp73 z(&G3p`7$VWr$*vW1$e0ryO)lRudl&dd&6rwCY8n?sUfZDxO77NKZ68}#2d$IZUgM^ z4aJYDW&vtWx-lAix0iev#M9Be29t6|XyU*|qUgr5fH(I3X ztv9MJmvl$RJ9sz6yu%YxQ?!-u~zObt78))XRR^IS|#{ zRInUV(;evQLK^fS@o+`DSQV1zHp)n~c)1+& zEFcl$_2h3RLZy3>*8sKG|9N&_=4Hk`FJ-O=nK|mroL6d+Iy9fuhv=`6I6Vrl6ei!o zUT4R}P>~q8D7@kU9A?Y3aTgwd54OH4wO#jzn4T^*qiFYRG<$0_dY7?y$xvB_w_;Ow zL!pR6kCTb(*nl`Yi&C~cvF<&{m2shsG5p(dKmKJWsZbZUJttyLg5PAsIK77>hUT6g zG)o@e_15WM?HVfMKW8+aJy@eo_>lE))?mC4d*{5a>~XC7CFtotPjvv<^AmHm?LHSB zNsv};LpObS{;FD6-VS<|2wk9BnR-W^bD*fXPg48TR48@|l+hjgF0YNsLvNDR(??C)_rdndDr*GX^_Le%IQ*T>OOe~IXPCT6#oA}mkZ_Ml3 z^TWY&u;{n6%^WQDMQu!|##gy{xyLy_AAJgPUJ}9ijQK~dDy>dmHlaFwTM(pgi>5wG zyq2GMy)c~o0sI?NKUsB6;pIP~brW&9-FOU*m^ihIZ6?argPNL)_k?j+%PHw*@Zw*OCNv+{ zj{}uuF9nH#ylD8YUX&N5PV|oG4{+|Qb~Gh@!ShttzXa``*O$b5!?cgX$u$&O{uvsT zcn`H7VaXHknK}q}G$X$MCZ!4G`*4_XXR@1U#d$~vnrG>EL2;aKkH3mzz2DClqO<tEP!LQFiy=0NfQz zyfVx*SJmFoT(|bm$N6pY-=v(u5rTgAJwW4xG1euW>F7QzmXaD#~0vJJa zqNQ!Tv@SME6wri=21UC|5;!XXA_2i_B{2j;2_YpLiTBXmMfMGWXlVgPS86h8l_V9v@(yY@Uqx5ksRMd;){Sw z@+8TbYEL8>ioPm`cI9qaZ!##D#2_B@bx}C6J2Wet_z=6dJOH&jvx?rJ?dl3K6MP6} zAqGt2{P|NUMh0aVLJjfSa@%H9jDN~4e+{FBTnww4|54grn=!TKrHSnmsIzo7)*!x6 zh?aS|U*!euLj_6EZndXK7~4nD*ld`zQw;0TQ&1{i&5VlZfUjq$R9=q1(K5xWd9=Je zKRUl7)HXIhzWe$jxq~uolv1?22)hwPNbT6%5`Ve0-JQsZ+C+INwpR&9Ump;CBjc(~ zYRrQ6rBHOPYHG73)LDyY!Ynq1ke^Mj;wLo(pa|IRktafG4?s1)MfX&RZ9~=|ikG-2 zzg1js$zLI^<@t^7h9e-?wWRT#<5J}{VT2pI7sKBP!?0&6U4w4yak>WF_@j`<-B6a{ zwSO7gM*Kb2g(eK~CyZ)-+(VBEb}ck;rp=>^aTT5_!hM+rl9?k7U zbW4W2A*;QjJCt}nblO|3`;NSFXM4p%t^1C<@*nLL->2&{6Glazo^VFw&td}hTcnNI zYs)}vw?zVvfEZ#0)Q$ZFwTmW@jpc0t+EsYm)SCU6<4`{`7417Z0c?W(R(WE#uoGC) z5hbk?&UYf0Ol_;pMvIb-NX<_{oEY}Rk@7(wvAt+FCYuP=q315p%MyMoIVPV!9M#6a*hhnY`9eTK{3uD`@0Br~q|Ez#!=2wKNf?|H}#!nMa zdA>Il{0cG8cjM;*D#u+gOg}JWOid#v?}qjTRyE1$>x+TDJu_7|c z+XHGj{r@gUSoTB~$xm^#(EWtb9Jq|elgpl<25a{tnVwrp7^X4kQH$N!ACSo~$T0LO z&#x*)hAyR9d29!8m<+WmfBa$tG}C6%)nfh^AQqG_+1$2#Qd2e|Gcn8?$jQ+Dg;}t_E)G zE`XuV%Rwt!p*)DS=@o#fRtUmg3jp<(auahQ3)P8d-^Vr3oR|DFJQxR2ec47B!n){+ z`qD{P)R*$vKqewtHkVhh2?YAzAO5_h>gO zH-0fFljZm!A;yTr5wV3-?Z&>b2q!YAHH%=2vdH2vCK?#L1l<_znd>h9I>iw~Z8x?RrSIN& zr$i_;CMvrau%LOT))7M$H})&?Z7l;G?X{Vtf>zxlA_p8dP7^{g&Xvptwyea%oA+UZc{JA7gN?|2k~Tmh zJ#`|NPVyqiF6|J-5ynkNr>NQI`*RzllQDe^G80jMa zsrw`8{`3AlNtfZqX#$ciUHo#+YVvq^z$}J{oUuqXXR5AmG%_dBkUzgd#fb+&mwdY~ z@kfA&IF(;gXY+4&e%}!0DJD$P{#|M7r8rU{MJs%~swOn||0jS(D{{e5WG&t$Z`>6H zu(Fg6tYpK|$x_RYpHYoiish%%X%nw*M6vGY{tw+9teuS(J%o7OP8upE2*=YVVn^Y) z6gk)rCpNRV*Ee}>6Y^<+NuH*F&i*KsVq~yf%L;(AH7g=O(}0mv8G=!Np0?ht#M>E_ z^+B!-|0XSa$%kN6Y_Br>zVvXK0H=jNlpel46`tCq&`bPI?+?Wp0=)jU?Db+Wz_1m& z6^0W}HBZEn2`#VuJU^H4w(sQAGZxyIFHc;5o=@|La`f9&)U-ocA+8uR6C1hSP7D6` z(KD}m?xPk$?9&{>gDmN2=R;8nO1+)*Rt5GaymhmC^TS2Ei~kh4>^|x(5Kn0N?H_|8 zOKu1%i9mAhebjiQNVM1i5le;B#)rp%UD0lE$rS5Rp|*ao4& zHZW_O(YX8J+~zZ*FJ@zBMYLU^&f8#Kax@i1?l#fEF=8~un~Nq%*%%{$ZS3oa0B;t& zP12hox246fdq-$%unuvt4dgxfJ-BKX3~dlX4qo*dMR{V6Z^R?L_6I~j(ROLcSUi<> zT(liSrRlebz=XVbD3BiTN||<4M$Sm33FcG?L`F_a);q526ch#xF#)7_H4mgtV#9(~czy9Ya1C(y2F zkDp26uwK!kWN*nwWk{uX9B7rgP^V(~T?ln!!_Z&1je{4Z7t8M^4;&rdLSHe^tgwRS zhuEaC90N<}skj^?@WTDyAOR9vH@<`nh-P~8s{_IG7NEVv0V6Id;zkc6W-Qtg2l#^J zn1Nz77aTA>M*AM6H||Tdg_tSmk+^v z0Q6IbMz)R;p_`WSArIuYikk<-G=uI*w{%^LtB1-#nssn;gLh;%B_|YfXzouaaUb{3R9l=d44N}B)%gPLi@Q5_h>#T0yVxZ;l%5Sr)a#G zcq_F37FizXqb?SY(JIU1b$QL${u#4GFYX1JCzi)s3YsT)P|6%HUQyUw2YOjEp}|C^w{>DJQa}++%%khpiP?0abg<4de&-E0LBVx2>~ATjT~-lBjrs~) z(Rjq#amC~eJdtvvw>2b~V7J@I#d!1(pdf5y>g7g;Ly)@YYuEx6X=nUN%n#Ztf?gts zS#kwN?&p_;6KDf(kFU{@&Z64(bN%2bru#8?33P!n$uI(%N z`g4KvV%>HeApkSW6YHV0r7<29p{T_q9#`t4{9!=vmcOHkX_sA&w%E5{M5a>9>k}W% zOe%g<#Fz4Ld@K~+*HuVj&dkrFjh8bRs;pHM_NQ}oRYJbAh zJVT9vdLMh1GM^^=seHls8y{B?|GUU z);Uu#r~}QOKZW;fkK~E@8ZDS(IX;}o4M)4MV|`ci8`S!t?TFC@e5kH^0k5sG053un z(vWUoIR2N&DfAW-e2+&?ps^l&dm_h(5l1+_FLFdUfr%yl<#TWU7|ZGItq;35cNIVE#$E&3`bErHuM+L4-04{54NpRNnG|i9XeRKwRqoDH zI3J7fOyP~lXG`0f@xWnsudp1GAf?M*>@5rG{H$>0IU$S>Et%iLU{hk~(UIYGpM~&a1Xc!5KGD`f_ zOS~r3BRbFCS6|(~zxA3U&cSgSM|ka(*`hkrPuhri?b|wi@+RDdI$wdpcA{-lXU-(A28{1HPzBT< zWlHzceZjQp)5=bBW|mi8S#%~og}-u))7-GIVewM2eae-iBDwO zC*qtj+9~zUEUm1h%Z$p9!+!-ug`=_CG42Y+6^%a4nKEPIIFR5!hrlBO%5W}+h$uYx z0T1#z6_rz*${7{TX({uXpcCEYguX8 z7;%HtNh!ilDiyD%ge8`iO$yB_pXp%tBBx~f)Qa-5sb$k< zPM>7nE4qbLTNajjOXz1F{WuHD=m&{93q_q-ND?5NF17N4U%Hbwpre|ykgCc;QCF&o zX*JcDYQdp;+AN4ujR@5u8vPOlMXTnTB(BJSxH{FujN~9OWLgxn%n_VI2nY#IFcVSb z$Sg!H6ea1@N;08KG72ghTRL8ur&oqZS_0Fw-4 zO-HsvrJ@;yrDE3*v3XO|f~#vUp`Ayjmg4`ox#7||Uk;pqUZ9ZLWODRQx`iH@DC!g8 zW9VfO8!<$A+N}N@Bh;{Zk`ESr&M;XZ=M01X&lx7n?3`hu@Xr}WT?Bn2cFL&HW10e| zGzF%#oOjBo;-)~T8P~B*fwG1gc*ZvcrdE?@Y||;UVUm}YFb<15Tn*3RYA9I=hf5uYOYFnNH*i>tqW^vI4@FXkt9?IQ?Qrl=WV#<7 zhl_7(KWQBj=>J-Uqb1P8;SOL=)~%iF~;Dwz7bSTHeFO*VJdg1pdu?)!rN` zeo72g&D2%l|LIlP!yz_br#Z|{1o%UHI6u3YEgEl zKr03v=#T_ob|JN$=;TrdFq5WS| z$A8;PS#XD|y$l?d%A8{QUwf0fI9&a+()8h~Cx?sgVd|#oW0b?<0*8gG;{*>A-`4+- z@AJ0#>?f?ys+^S_sp#rnT|enFw1ee4>=Ww2o^$@kyYgW{*I zCf{KPDW@Vcj<`ccA>|G)14c@2;`P%}fe#LbPk&=6R^H~rL? zn%F0~#~WvkGr6SXoIt_kX|qm~XWR!y7Z!~!98)+hP%xu*Ucjr4NPHCDv4R^)KX4gW z&u}tYax+di>WJ(PWPt4aL=oaR^x+CQ!U}~C?;G&76j%Bq7oiN|EbY~q6La!bWlhWp zv=5k=Q?PPiD5r4wpioY6^oXp7a6WWlD5n5{AObNCmsV$iuM}Kx9v)vQy|tR3yoBAu z7;pD0ux*S99WdRqjPdr@f^HXM^brp^;x~Zn?`(lcozRCt#(QzGTRC_`MhkB^t5$0j_bPnM&ukhv^{q%nw0R1{x}x zwan+!@RJ-BEQfe^8jvcZ0Q|pa+9mKiL&W&PVl)brz=w_Cv!3g z$yBBLkIyz=Oy{1{$>>FA6yxM`IuHGS|EO~(fZR~=n(t!-fswn66s$RA_X;`z9#XsM zDlV7EdNxpc&wY`5G|pi*QeJ z(YsN)Q}OFmrRG4QC8w@I_M7nwXai}uQx&1S_4BV_s%PY9vt%mAsp3X(?MXf)Jc0CE zan3@2`gd-SgnPN6BmL7m>ZB`jO0So~Pw5vDsJrR%W|WS>ujE$OS`E`lM{#@|BfpBL z@T(a!^IypEi;aR+@~imG@bs7ey(=X}kQr0{sqU)yD*tpOfRTiVST{ploS3}$zoz_j zZ^}-@yDpMZvPtQ1F8-*lnCa6OpZ%r3_sa-?t28oarZ1`b{u15cJS&}=NILsmIn^$b zUNgwjJ|{zzo~eFhK%%u0_U)|<_r#})aWRHqf0o)fnD6Ow3I2$Wa!Q}|0Eka6*H^wc zOBoL^Ao^oqH{nmni7Pq9=X>xI9$@)Z;ob?H`0wKSB>F^P4>KO50*1SQ)A>96Bxis? zxJG$#cHt`cbG>e5{C$C^EJ5jQ2vkgbx|vSlblcxq@+S#;$j|gWYJec<*%&!YUF>Jf zt5Q{z@|u-)DuTq$K)Q5>ZZ4CC_&S;K9?sgCj9;ecxhPese63|ZVw?+JCjsw|exwDbGYR{nKbQG;(BK?Sj5%?g zW}%;J!Kt0=kN+~}pL?8O?}%|Kyf<6ue`3M!w&1i&S%2xiXu)?`@b`fWJyWL!C&tXU z9*g?ZAOFu=@KY@KC<{(!&-ce)|1JuLsnR*pb88miU{$=gUsv5Quc@wjVeQ;`3$Cbb zis1Cy>MKMD-^(*$n|vNP9JIQzvHq&LOPcHDk+XuIBC8>fJZZLmF%E>iym>)=WI=;S zln$@P`L0dQ{KZRf2J9I{#f8QAtfF%E%o6X6qQbFy8W{WI{9mwYQm2#h$)xJ^Qc4~~ zdK@K#&+#k~N}nb)F08#u9W!fus^Bo=YJ3faGgU z?vfPTfDfxo(#sb_9UtONU*6zDi%6laAwGzg;}8W2Bsi=6|4|HtiKCAfh%;j; zL_p~$xYCCkoGcDOo~O>l)ejlg4;aRow|su=LOLT?k;{+1#CJk-udZKkIUUN|h+~rJ zDoRKsLz2?bwCbdCI?PuV3ekz=(@$siV+q0eeDhQ+O#$NIxf<|#*^u+M=xlIj?OBOUl<~w}mFD$D;RS~ui60!Em zMyKqe3SXh9D@_7ODgN@SL^%;vZ9@$Nz(;XZG@>?0R;ehmj%iWwi4A>jBY0L!DZ6-X zbyGu;&>WqHY`{pgP@F!l&c)_auBSKFHbAqb3%Gvbq-`7y&e^D6(1g=|Md7k=@_1!H z@|K(Tv)2%Xp)?@eE$;KMRK&> zO=ElI-ZF51Bu0_p6g?ji61PKCP%za!=K{wwuYas;Yag$%q*{yG<<|cf2xM- z@{G`MS|d^E(uelsh`+9fi5h+i!W6wa%f_U?jp@zu{h`K3&+o$;uFLs^hSQRXO7}Sp z*Xeg^xUPryHC&f}AXhX~{#?dQ`SUe;nyV;z&bH7`vCu~}T$ks14Ii%YPcUxEqt3)7 z`E_|VSol0f&ZQ#o!?35e$ZH!-L;Qzz;R}B0cj4v^8)ow30 z@H(ddwt;V8e7%7`$oNABPU{ln)Y-sFZ?tKR_PAdyUuhv=qV(>3P7`fdBuJoD1OA{1KS^OCh z!{rZyNY6#_uxl9>yOu@EweAH}JiTKV#q- zEYA#Dc!yK^QTdw9xS6kJ4KGGKmEYYOuJ@;(;srmG|8T~Mzus@&z>5cjkJtEL&jzOW z{E+2e&bUecErVX=>lYfmp03O5MT)Hop>lx|wT{AmDigr9*wrJoZuT&Mqn zhL6+eZ_#jSOBA05UT~#mg7^gRN3Ko7MZ3-G*LP?*(XS<9xL;{FPkjXbkcJa|w?MIe zL`>n7em-LTZ(*GBI{|-6&VOq7c^ZBxFOVxfzhFMqjGKJEZqU;@Fu64r`YwaMo9Q35 z&?gOgT9+pGriK2~yzZyu{|pHXcRb^!{3jXopJ)10HG0ysT7Mm(;krHx4L&27&)FJ1 z@yRD);3jCe&L?E>Ig|N#8a?qDDY)PA_kvw=5vikPkhP+7sqMUaGg)w;4_E$tkmd<&rIfXlZNYjzG?7T zz>>uJiec!RKn`^Gl7M_{?KIcWb!Lr_raz8x)js@^<@vluucup};gs$Vna?N<4+2x^ zj?-|WSM76z&@kj1r4G-d8rCY7xME@lI$kj8h(tVKA{i;T< zr+dAHKCaOd|9b>?$GJ_zL%@_gztQlC8opJ-X^x`k|E%HE-|=+Vc}Bzae7(fD%GYC@ zucSt==j&|^Cq570kKA4j58__Q^P$2256nM{C(d+Be4fQ0xoi#B(>+$hiT)8mjk%kK z2Z5<{Kd0eD--ADLA;u}cJoFIw6b+|&+%SPUPKCy&6qw>)t$%3jUu1l_fxpT4w+x(~dy;$Az?FVJWSq$KapTFn zKCR@*UxBu%jd?Lb>{_oK65)Hq{;9ti4U()Dx{+Yb6PU-6WPtoZ!z$nG5#k5 zznk$_G&~EKY9~(#NCIWI%Ff3!PWsX3zt_?v5YD7u!MI8Pq((31FEYAw%Bj*b1Q#)- zV0#_OxZ+RG_sPv=ocI$Cu{WG8t!TMix&J%#!3D# z{*-%LqrU*4lK%q@AF1J=8!lriJ*aXS!#L?dZ-1s}^wh4Z@x#>`y`JCY7QDmY(;>xh zZq;yVp95SjKeFI^Ec|l{Btx?tk7L}-@0l9Cp5OB|T+i1m4fl|g((^F``%m{v8cs!_ z=znd&^RiQX=-oO+FHw4DO!l*T8DMb)PI|kD_14PaL{Ipa7~f&wUtwIm|E}n-XM6<# za0-ty-ece^7%wKpYxM1mcNq9hjQ1M&HyID|Ri(Q~vUS!N__z6<-e)1F=x^tHj~ZVM zU&r`b1OFA{dky?Ij8|}ZDgF;IzRtkEA(Qi8yjJvEn10S6Nucm;jITHFKQOM|Ggb6| zX1wZ%bUr&6?=_n{sPA582EI?*Bkgu#vK9 zmCmQ0@j3%ttV_Va5b+FP$vqf%HHE=ag++pA+F#keccU64GF}}jU@8EQM4E$WCFXr`6#b+JUcNqB38Sgdl zyBQDidW+)o0OM;6{87et8TjLjdpuuOeAIiuYYqGU$c6Pi9;_M^(78s{$U+DqPuBp@Fj*JH-aB>`Kia6(2?K z8T1OTu;6nH{8E;`%D@$$It$)t!CNeNs|8j1q@v2zrcbQTJT~E9<<<| z1+TE+b1Zn31+TNQcU$ls7QDxT z_ge5>7JRP-cX-{ywDW8Wo@>GL47^6Q|J<+AG>NB50vT)IJPdO@1Fz!y4g*);?flTd zbGcvZH1Gi9zc=t8<2?pm!T37{Ud4DeDGW~KtC4X!msiJCf34ncQuOM(9nYXw@3V=6 zt~LGv)@Q3hufCH}?*%CS>bsW*40^S&rJfHf`T)U~6o~vSDl9x} z?AQQy6*zm$Spu&bd_!6Jq|6M?5O`)d=ZohUPoW&3&viC+sE!FP*1vvk?MuVPjqkjO%J)q^6Hy8yYdzk*SRyLz91 zI((`!clFcI-m-m7J~Udyzjg$~_OZ_|+qX>JxG{Q_S)A=8^K_E)wx9mVkV~e&(_J-7 zB+1~~~nRizsFw!7*&0fl^Mg}eG| zLij=jxv{U}B~EuWEgCG_H{6HgGXTH61$y(L*knQZEg{fmz;2ADc<$1P%0s|myUK_y&fSrh+1OeL@4Oyj8uMZSJ}i_;vxbaa@jQ_Xti#uE>}WwV%m?D{;3EpEUERoC=Z-&CdjlQ>B3T%}i6|>o0brpb7dwyn$(Mr_^Hs zR9%#ukYpx8l7HSuz%D=C*d)Q=pFR*D#SE%_p0Se!O`{LQk7Sx$KU(Y~!T1;-h`$Vg z)DiTd*xv+A$Oqz^ndT-Rifs@yYkeU8U8V{6$;WOMG{bx#ewCnMJ8GLOG=`S>i({3$E9mp!HcepAbUg%zMO!WLkeT3~~rGg8rx$axdHG7eWO6(cc7A=u@FT z`k}~x-;sT?{)kp9(3vS=RezKP@%rtLxJyPse z0esb`h+oevgUD*CHpCVKzG0l|pWYLEbNyJc3c&u1+Am9_n|0SCBw2tXjKdfQk2^SrRr}|{YdOyK|fv4%LeVcK&0w@y{+{b z#cmYzzZCSTS{<)T=YO)wXKc2he^k)F05)#?yuSQ9QkFDa(EmeJkYzp`&raiij2{r& zgI3yIO|Oljd-UNr^+T!g+J$~VY^$I@M$lLIaD1JhU$(CckQ;klB)^&b@l^=X`xCVP z$VQ}^2e$DBBb@6e8b+;GzYs)v=MpdG^ltJ+h>a37Yek~R!7s}|8%DaZ!Ga`+^reZ! z|H|sH(9)KJFCHyL>s+2U}mu!3>zMR=;o%J<>#tHi3 zT+TE_eze$ZK@;?W`1wo|@S)fkL8CSI#|s)&ew+7a3jw41Ga|>ZFLNV`hz?|b`0XtR z3Sai>e$aBnCUh1!Ep)(#6rVa2)Z+t$AE3W+F0aMMz|c@$IW6q-JqLLv2l;coYGjo7Y~k7~CSY0ri=#4jYxe%`inCU zrK&a+>g%V=pq=^W`J{sr?F)R5^JrK^Rc$H9IEIN`Pi zn-pAOMoJ4xkA?jWXwQN`WI@fsS~Jr|pczwGQ<`O@WlS@T(Pw^~<=R4JdLmR5U7EtA zS}cKP%rtW_W2Oa8R0jwLXnm(v-8rG~wD8P;Qz0)U@`4&UeM*3A2%8u?&u=!N+@hbWr@6-QYP-Elu=m83=xKlpe&V?rF1vDM8u;D-<3$P zlrDk`T}0SLGWCm?vQo%WQb}Qx!qeyu7u?M#DWNdB(47pU3sHJP7P{~q(wiYOMi&v? zn@d8-{LzIdkugd^=5KbTlnfUNllh~IpcMI=T`BShA!OdAUSy7D$Q;cm5jmpEL}xUq zHzY4~2fflAWa7(2rxZ6A;iOc$;12Y3N0*7ttZ7qbPYXCptCut^Xt=_ej|Qb4yBf`M zCONaFIKs;6&{Wngk^ajU&$~+c$e5jyX$}r)ojBDgEpcW{cSN+JCJ7qJRii@0Zr4uf5X5k>{8O|)=(;|Y6A`EZRTGEo5M-f=#*;bVXus)rs^wdoy*aDFR86rykuSgo0T~8a1QHLVy}w8 z{OSeuweujP2waQ?et!Mpr9_e1JVOvQFR69>9ZYXhua}iL+~)(RW_uU{{aY zB@GZjvTa7Q5~!(esHr7ALLaGq9}Od9OKG6CB~sfUws_I=+T5`C@<{c9hU&|){Y`TN zmBbYd*s^0@KV3Rih`9+mEPx<1FLA0%SQt;?2NG*%O@^n3+gN;{i1gp_bb3 zF`Jr&uI6Juk*h!|hX;B?si&%X5nH%w+x76YZX=}0gT~xSH_=X~%VYMkI=}wt`jgM- zo>;=ZdNAl%LP;lkEbapIgpK@K>5TkZ=}OY|Vx`l|-Rv~`Es%clkw&KkOrz6A5vVL^ zbTG_dcK|xYE^Xw*qYgPr4m6?hvhb6m6P?cBC+whKc2X`|xUvt{tCqi%rO6E1@~7yO zKze#|w4H7qA0Mvdk@Cv;X~kmb+e)Xz(d)M^h+llVJX-cS93A1z^2#DvZ{>iMLsY(% zKnJ2z0!ccl?~h}6Kssh+A3c%|6SuHK?Tb}`X^Q@eWm|Pfl>N}_|skI$?|TL4#KbG zR#zHvE5AV=o6$xpk0=kdH<+I669UA1%u(&o8Hgi zo*dy+BrR-LlL&-U^z>#cIcitPDO~O4f1`wbKCNsLzc6r*>wTAjcQgG~17F8Dl^;1J z=U&ENkg$)dcbfmH;gsJBmj4Kjr{uqq6f&YT>pn>1a_-qX)eX4JLzhdAW zEZ=no&dsB9i-9+?{68^p_0IZV3|xJ~yj#Ob5C7nF2eZ6NpA0+04P1RgdcJ{ovYpH_ zaP=+pVhyKs^ZEW31AmMY{)vW@-nuxyzcz67jo}szC;m#lCk^~deE+J36aNa9|04}2 zKA&aW<*U+90pAbTaH1c;`c-?JD7#7`jNEL4eiPp}XgJAJ$b4?laN@7p_g`o@(KoW( z`d;6JXEUApMp?;I$^2D4R{2unh~cbnh4+9Lxi4xs$)nnfiwsr;JO zsr30CzTgLz?U;#V&ID;TW6+$-^utD8czB37;iD~I>yzW07}l$ zobG)ZJ$a`y{(A$j=Y0KL!ztZ4jPKHL^6p|hgNWc%x~kn7YT)YIl2Z&^?PXM~;pFXM zIl~5?&EH20otgn1Nr$e7?mvjgje3Ikoq=%GU>+{|5~|8yG)^=PQbS z663=S{3T9zs)4IcTaE7&A7z(U81y@tkJ=kt(Z9#|GJ}2;%YCbXU&3s z_(KN1o%#R8z#mchHSpgtzSqDXWZdPwDO7$N89&3o7cl-s1E0@w&Ngthr~l;!zLfbi z8MxZ(KW5;nJ-XGvZ)ZNgH1OLP-)i7*GX9c*Pi1_Mf%h<;LyCb@`uQv4!wo!(?V;4b zifyWt-8~94b*BH3!hwe1+UopMD_c%eXGX7_S zzL@dn4g4>xhg}B#cgC}L{-^XgnC)b!fiGhE;Rdeuf+#ldjZ8nqz`w`%r3U^Z#v=wk zmgTwLz*T>=+`uO={VfKr&e-^#ftNDwlUw$KMHxM#t68P1ne@tI;9Um(RnG4=1CKD?ZQx58-(lcNKRp(_*Mje|;Cn5&Fa(5|_NM0dCZ0=xMt?QS zpJ(7o{(uE9u;6MwO2Jg`6rW-Xeb9n?7QDiOtN8>4>*-b*^w)8I>kPb=@kRrWGTvg~ z%NcJq@C4&4416Wy9R|Ld@ihj1GvjLw{2Pp~Gw?NxuQ%{-Gu~<7-($SXz*Tu|v*6tp ze1`?^vEaQHe3u2^Yr)mS0t%*bzn$}y&GUGLt9<2J@H`8y)&)&I1s3{33$E`asM}}I zLho7d3IkX3$vFo86V^kOfh#@KS#Y&JWahWULf>k^S6J{43%6@2N+*(;14n0Y2fOtyDkHNl4Ilp-ZuJ{BjxO%>!_$c~93w^N#4_a`~f>&7ZITpOiz+dM4)*1La zj5iwiAYNZsaNRtvtuf_GT(H5PoW1z%^u*Bkg}SpH4}SMqmR@NE{n+k)?~;5`<+ z*Mje|;Cn5&81$eAPTF20?xOI!m`~8)vxRZb!2ig2g@HfI_#6XIGG1lis@&@=xLP+=aw_^33w^5vUtz&J zEchA=zSh9^aK6?VxRP_d1@E-rT^4+s1@E@tJ1lsQ1@E=sy9|7AwzSv127UtL;^hO) zo|PW5xji$>G1r2t=Kv;sz(QYO!3!<8dJbjs4;u7EoG&%rG3nJFZzev+;G^_VWx?w# zc%ubxvEZ#1e1!$?Fz_Jfca4E7`PW+TbryWR1@E-rT^4+s1@E@tJ1lsQfluT7_8Pd# z?=B0z*Mh58v`l-@_gbf_qxh>cg-!ZAZdXh^V8IJ4c%gyM<@^>Kcr)Wc17F3sr{R=! z)n8UzLD3p8zt=H9gN2ed_Ci8y;Sk(X8h*{{Vv97@5Cid)oSa+1Mi(!G>*1V zggf}X6FX1k#Bm7 zRAu6AFZz0(*B;5w_7X38TTA6LTW{-td}7*5KZ%Eny5id-BfPew^1U`tggMmPT1MfN zX7foQ+|Y}}o!DGyzZZQZ?~*TvE)9KI?X~B{yCTne(f2Zz=IneDdrOfw@;fi1+iSn@ zBX>igyP+k+i|)&~@?LjCMP{kHA(-VwlLI!tm>p^#n(NhU_s0Kr>9>RKhTZrB|E>X> zU&(GCd-nLZBS(3s{i*p^MO`}+#5YmqgcC#ag%Xkx$TFXtzjvUQxHP|~JTWhSmzQ|o zOVsE0mg8qHv``Q||HN?O9XECy?6+vY%=)A8H{2DpzUbAw;k6HaLu5D6>uv5C- zwOyOl=*9O(E)&$qV>t1s8zcJi#4BE6tANWBZ;7k;2}LL54{~F~$ZH=U_=OX1fI7VS zsmCip#q^`L{de9*4dT!duHkeJ$!rei^Ysoev{5naMryZQ6{Vhlb)uZ~)cWph}f@sPnfz zeW)LLDJ7ygh$igkQZfx`5_w*Hw=k1;BUgCs4;3PNEN5gmvP<_~;?0!S$n2B1VJ9g) z{aQ2|QeKh%FAaIqV{Zv{R{QiNByT$X&OZusPVpyuw#iEq6OzK3@+V8lwq>~A zc%*0j`WB(2@YYE!kW3bT@^iwrTL}ntuJ&a=3cgJb0ZgkuRg{L`UWPiq;nR!ymQJr! zj0#jh@j5=v9uKbm{LQF8U-Q!sLDWq@Gvw`4f3ElGg*~Rz_iK;;S^YWPkhdHHYW3%_ z1Ig?8^g`Zr`hMj_mo*Pn1%0=uKj^w(?%~7-ZtRcXWi(U`sxEodHN}Y_@w~(mf7?XE zJ&*e*^fqFz<8a#p`P{Vi{$VdV^Tb;T^!g$Wb^oOCT(Vx+>^#*$sJ(eZojHE{CCckA zq@df^&MslUq0VD{Iuc@2AG$S6M{graeG2`Ubjd|&_Np=mgPe(g4(wNyc)th(28?ph zz+{V|j;4~x=Mlq8JjNP%E3rlR5PC9I z3r6E%2o(DU{Ae`MdocUALWxI&cjql!PN(}K(XhU+NXbSjk5DI_04>WCp8n{9RG`Y9 zGa*}l%C_7y*}jS!7n zp^j<qjp?ymF@E^no1@Khi0rplq0Vx@ zJVNko^80fox18UEI+y!<<9*{^d@azaEsnb>T_hvNd|HcmJ+_g_ruajr*0{O5aPA zeMo)N^s0ZkMfpJ9l(NY_YW`w$!BXG4iIBeOp7j0uxBC@Y)36?~HJ`hVKG~SB7o=Y=}!D8m^#kV&XhC1owNm*Y-`&xlygg%6o7Ine?a%m}q&vu|S z4tM!CDR=D?Kk}k`aYyR~?uJR3?uLu9Huq%Hn#imVyfxnVZuds|ro%h!;m9Pfy?oGs zoda>n7$BKkn8u_;FbRRlSFv*P+5j+WA25iyoGQ6AZw|N1v7Hc(mKV-PNVqK~2YhXq z*8}?!QMa`O?)x#aCicNq-9Ck0E@IrmL&WDWRPox5^%4^UUg9;umWC3d_}VhOL|uWb zckYHPcSBQ#*LEMh?cufE)P)OW_A%1sDek?4i@L`DvH4Rw&zJOG^x;B) zZ~WG!ua^~d6+Ir3x<=`Vrc__3!V=S0y!JAo)hnyq4JA-UC6w`oR7NH#qj%|KEPX^8 zJ?aQ1c8NeXAC*rlwO`xnnhirJVTxLfO6-Pq0aC5F+z~ah=GCV zdzc}}^{BVt3w7S%)0g&3|G1!9N8HziW_uee%Vu0uHX}UE>zp(_FlqXXfD^hXG%GZd z#->93J|T|6_aMjQ>Z)z$`cTt#7vCdF`&~R-RwrC7$pSN99Z2Sd}bKyx4XQEM`Faz574<=%YPP z5Bq4@E3I&m-o&2GZ{_ZJtQEqzrF*>gt1~^f^y#3p+l&4!tNgSVsgixI4ZOvI-4lW( ztUONV`goX<7kbf;vfNdl7Pm9=i`@+qVO29!J-vwQY5X1J73+eD=kKEvN!!O3ih3g@ zxwU8Jr0y*~_ZWFZ6E%RE7m96_UaU3Zx*vwA;&x-%QNKu#j6Y zHLdK-SYkz3j0ar%J)g@QGLG>IC+n-eR^X>rcG^QUm<_0wf}UItfalMKicFqG`!K) zGd}R?Lr`TO-pMHj{gXaD?6NO?(KE^85QDObCG^**&!Q5-JS7vbSP$7j^T8gm-i389 zvFL?0E`PmC&`Z7Wim{j%Vz#~*87fb_V5ukc`Lx&8Mng@n?d$7sp}`$5WYJReBW~== z;NZ23l}eEUHQ-4RL0~ZY-mkolHc3r@$zX0mco}-Ri;EsF+P-NHQS%5*)W45O5F!sn zf<@ag7~gcU7BSw{jP<*>%8GUiDb(_tlD0Il%WM1C6)`jjyLVy)0t0>!#URUDl*hA3 zCe>Pj4D;3I9~1eV(mrkD10{?oC(WMd?M2C7jK6*UKK(Q@5H&vybw1+L(}a1GPcL#R zCaWZexbqSZdz)X&Yu$IGTmnC3Kep9~?yYy@p94=Bp+^j{eR~zpD?aIZ!okdkGTfM) z4`tGN0<{e?(_%jKJEhc5yq?f^ej(Nm-UUM%duSt5H%69Ai%oKP`etv{D`bi2N2Cq! z{2x)?lYP-ddGry@oDY@z^uj*+(x=UbXzbHSHcRUsA2WYTjzb9vd2HikrK;qFbo-zx zC{(+tuP8t2GoSijD(|>&w4%JJBt#`rnNT(Ufa^yGC~q1E3cIF;N0ql29AZe>_)>r6 z9q~mI<=sa#v%IhJ=|y?>r8mm^K{;?KA-nmQj`!3V{h;b7{GsQpiaai7|MGl5#| zfAQrsYe+7kV!(RgrJ$3d3w!7zdh){b@~Zafg*~LxCv!ne?Qvhb6?~AMZT{|;_m|Ss z`>INBlaUk^w&?%S_2W77Cs+^uNBUL_a&%g zRXxv6ujk1YQ3mpDi%{nizUZQS`-pCq?~^{gDBpDYk1Jmq*r9yw;{myJE}k1`{rgKQ zy-h|^RK8+sB6`=O#&JH;?t%2gnq0=!Gn|Z;+>8^BIwHFRDdhq?QG__or};`#x?!Ma@#Y@a`IMYmF5JN4=Bwkhz^{T6U>}7IHw?#6A0zxfns7#wl~C~*Ep#1llvSg zZ0gFa=)h??h3%Qk2V@^s4rk*PKv=;+&`^(0?o7H) zU6~mj5Y8!Fo|V~(v@Sqeq&sS>$bE%=LOHq1Gohtu76_LN&dCE1q8whKyiNdQGzTPi zGhNG<4`98m%*yN#xd;H>#xx(7_UlaZNzx8bS;5_5Nqa29N}1-TL@4q!iSksMQ}7W?~|S{=VV__BfTI*%g4-%Tr0(g zMX$^(&B5I|^%*l(qdc|1f{@K~LBQBK~f ztcf{+_5l-f3RVsb!Bhr?a*CrzOwMV|$h>iIPH{<2VJN2nBok8=iR_xzd&rF=d8RHO z7#%dVJ!>Ty+p5g0VN{h$MIBN5(Y$CWy8tm6KtGQ2aWwf%Blgcpv%ha4tum38cL19I zc&|?!vatx~HaKVC=#JVmCQq9+3Ol9MEOgFTQd?hrMs3~P`E8b!$ySjBo!bd#+-S|a_ zOLC3IpYBxpgLM#oq9v!ULH4VDg2KpcWcf$QTmM(ZQ`ay;l;0D!wYeV}O~ur z5$`=sMp5qyABEea@n@z_bN~L*@8tq{-pHJpzD%X>FVP*&y)a3inObS8F~=7e58z5p zj60+k`5ef;)MY%p#3#TR6JrfvlNevi`4?jXj%MHUQfZe7eR{KXz?m=z%S|T}cS|gI zs|D|{;CEW^doB1@3;vu1f762Rwcwf1Z-4pC1x|Zs2H6O2M|^U_E%f7VqCp*uJ8!sJv4ZS6XPIUR{`%&&Tm`rA6sxb0J=Xu4*{qA=2FFj`-;4XF=v1D zyO_R}>BX21aa>gT{^*al;3r#fI`q6hK4UHTbPGyJM@+UyUfJskVPe`CQP z1}^gZS(&aF8^Zgth5mgDJ{av|f9ZbKf}du=&jU{KbRQ?>5#vjEXIbc}U+yp6R_4>i zdwDB9-(h_H=OlkIHih>$7CsL%eaA`Z^xDK(9(uT-VgBN|O-rtvi$l|zYUkEm?ihIW zym?htLnCQfozRsL+h2!TEbz}48#Hs9} zin$e2$}XN;v$*jpl0hEa)|3jEzofPnC*94MTT@?Ky=1ODT1~L2sjID7IJa@hf-7;J z;#}fZGUMWknbYTz$n}dcSe{WCnmfO~`idr*uFtBmIl_!+XX28XbLQf#wz(CO(-h92 z5E=))MZ|u>27w+=J2c5BH8GV2B+`=cbKg+AR0!MLICn|y{8Z+vafap<4Kg332R+#| zR&zs@(~6vVqZiCggFhz1e4Os*Obkz-+cekrk{ATlM3&SGkI+~}*;GhXJ#X&i3lpn43)b-U(dSywk2Qodf0!^i4 z0%;6WVQJE*V97>Vfu1X21H@lsLm5|pWhE$`>9V=Qm{`si@R5aZ7hoJhj&SOl72cxZ z)TJtXwT4qWt?*kloVrwnt37*(|FIgb_PiyWx=2O;FAJYcB7_@^KOWkN`(qfV3$0-) zK8rM5=f6_Jb$RHmJ#uuRIfvqNpN8vvXxu`MF0}8yqSyC~*5!O(qo=M}(W||q&3uhO zzf6vz>GWz3Ucz-fS8Mdt)hhnCGH&w!nMSYk-)fD8Wx#9yax()j4|s6Dud zUbly*E%NNt_~`tP;L2mla{}Y0JQr%Xp6-nnKHt{p^>pvG(ErXtul6V~^ZO}YG9di( z_*3<9xQ5dZRN-f9ctFE1(QsYQH!^PO=i3^+p08h7=(kwtpSIBNw9pUWc`W63m?rJpT*vdGGtLx_(jb7K!TNZk? z=dYQs&+@v4$$tdnCVi=f>*Y9K!}WS`m4=Vd@*CA~ozJ%zH|6<-Mz81h1r68hMN-4{ zdNG(5m*FU1dc7FQxS4K=Mz5zkMZ@)au~NhJda+K!bv@jz;kq8SGH%NAoJOz9v&TZ8 z!|PLKIi9NFr$ZOY4kt5irhBnQucy0Q!_UvH~0!*zY`VceASXvz$nS&k<$Zqkpl z&@Z*nw^`^5Xwb~*>hjNE+)Vdkjh-HbD!aNt!_U(2e`tItZ_4!=cz^@;YJAQHrua{$ zK|Gu(&n1kTdb`R(-)^D5(?b8Cg?>B@`umY*D&wX+7i;)<#8dgIvEYj=c*KI=q~UtM z@GTA3`-P1fuJ;RXX!tproI!q&NBKHe!~chIvs_kd^tzq=TElfa*{tEZex9`8uUhcI zRN3H2&I$NadOnqLQ_cw*z1}`dx6s#E=$BgP+b#6BYPg=?+b#IdEco3P{C*AB`|IB^ zZtCF$jb7Ko9t-`^Lc|eHyOUi_IFY z*NYc5T(1{d{9*v*_k4~22^y}qpXX@!7d85eH9V-{5e*M%_{|!w)8DS)R75JjcUthf zG+eibR~a|U>wS%$RHFEQmNE%v(x1V&X%CYv^p{!ams;rCEcD;f@QIL1$@zeW>-O+Z z4cG1AJq_3G;rQc4c7>hm_Ar5QQxBCIy{@-QG+fvJat$xl&6&60%YxH`$w_51$w9vnx;d*%`HC!*R!Teqp z$*-5!NXE_lmT2_4oKrMhFRv>#TraO%G+ZyQdo^4yudR%m@;s-}>+E39e|CWXRPa3Y5*IzYUFRy(Xu9w$|w739g%2~*`ncq?k*UKxW z;d;AzhlcCr^{9sH?dsEvoAT_`=ykmv!Oy2n`V$y8*-}>&X^Amud8Rx=Ste z%PsVGX}Dfq_i4CZUVqbYy}UkP+{|xofJ(9NI3YhEV9~DX<#m~c>*aN=hU?|^eGS*k z>t4o9d48wS>w0_DLjS&nK8F@B;HVt+@*2*#neO=-y`JuD3;lcxeSi{$qjc#{IT{O* zQ+Pn!;XQS}`gn!}))=^Y&+7pLSMPK67`S@>E}Qu&{^~uikp`~b^Qtg#^_~~K_eD`%UUBTE$%fi_n7EwPMu!8ucXd? zP<+(;N(I_;HwshlE7cpgde2Dh_3!f`V}a{2>8TRH4bYyKQ5^MtO@V={_iM@xT)js_ zdyG~$H592$MvKN3oi)C&aQxW9Kmh;Ynxn+Ox60!VFVuA14u}f(zzeDhwneS0Z z7jAm-=g`N6v$KgkxRtlxBSO5knfXE5?r>`?U)3IXi32%&aV`WC48*nDjG1HAdia^?ip~c;h;cf_LU^CQg@5pT)t?*`fi72HaRYA&+ z_TZLWUm+Gk2&B?T`ymAB1NsVL8;I@=cs1SEA4}2)5OE{@bka|vq!e2|o=x;EUi&qk zciJ{xbE3dxq4!Pf)0EguN{k8@95}Ikh3=|_sAOA9ato2fM*2Y_gH$3z(-VOXg1%lO z$BBHp8?qC>UH0Phh#7sj)r}nm1r=>iR1QdNS6p~YB;--swbhf%QZ^aM5&T+8dgQg;zn)YE zOU-2=q6CnWGPto5&=_*ge&EKgL*mLZX-5lTs;$L8bYq{wLlIFvTTALFKJOud+NmW- zN`kqzp7SF&c5F5!;w$OTgD8IgN}>uPjh6bWF8c}-bi;Ugr#x_%lq%uY)VA?W9J@f%H7EW~aFLsrbD9Cvedp1q& zPYba@XaTqof9A&4LBKw$YAyb`8-EKN%Y}~HSLSaceYM|`|9f%0CtsKf+IGJ+igjV{ z33tVDnDa;X4s&BK3lq473ExCLmU$B!SAZxK{RmW7=So@9nrd0MM1$bQ7Er!wBKeK1 z8VXEA=lHr(cIW3IwFzcyrKk>QO{T_Q3S&QMH+CK@Ae=ZcKS{51cSQGQxv{tQ?ccu) zO(x#81;Gor1FMnLSmIiBFVKy26Y3;y@^|?0zbQ>r(uUT_Z@y2TBA51~N9-B24-*Qt z#{}E^kKOo{*d0ac7VUI}XIHSub*w9~*;_Q>%l{KM{tRx@<(GzW3mb}WAe#K&Q}UmF5b_UE z^8fgN@=xzqeyYEk{NqS|G&duuQ2z&c3w6@(eV}qSU4fs6sMiw_uwymq2l|!MJ`(pZ zp2#WTb5G1~KB?##Z`mU|Ky{qf~}4k?$)`$6gvP;2ewT?$$HmNzwJB5}XH^lKEg0mrSS4BCE;L1mc0RcJ~G=1eX z!g6EBkN}A&HFsVO4LuT3`r;*dByhie%KY%IO@pAta9f#^EXU4&vV8m;!qXxOaI0up z$eX+yoVeej@luu>e+qDFy!2IUA0@_2x!#exyv;9Ui*ZvX22jba-EwaN^bp$+hh`AT z@6ramTce%ulS_W-J={m{C!w9lscn^|*qQ$%5Ku2bFPI8zN#>$CO6_^X!4zKx{}W8G zmkGolnE;4u)q2F=NH?KQ@+OZL`#VYdNFMz=~X94`k%Q6=-x)g^pr!H;88FbWwY$iA!{Aqj4(36@wA6F}g3? zU3DAuwY6jbOvBkoKgm@>f!zD37V^L?%(G}%gq6`jKWSFBr*8{+Gei?L=0ol!^cq6~ zCKoFGq}SX7%kiX=qv{~!xD~c8=Gk%&?Q*o!|QZLr_rNbJ|tC{uHhTrZ?=C3>>Y>(TL2I~?jH zU-B9{=Tx(p=LtX zIXp?x>$8|>(isq<^Oz5*WaAUK;ato=>l2lA7|5|rV}vPv$f4*J{G7s`gUPcIS zdk{9#g><-9(JS@+$1Fw6DzfTi8)`$Ez0>!V(%#7@+MKlT+x>9zC8r=hrM1b2$(J0< z@E?4be96xN7VR@O63wI)f(o%h;3Z^LNVcGJ__%Ny^?h7;*8$>JU}u$&i+?`ts*T(S zE%F6X`#&yx(*feII6(YgqM!LV{$DzP{_Z*e|18*wT%yRLl@ZLBMntd}mAFTYe}t`| ztBkM0P=gHVi`+*36J@uNZbF^pO?TYyvZrxqqmPE&*eHJ44rO5 zox;#h1|jK4g^M~R!$qCSMEF6-Gxx1@Rnw++Y|Z3N-v3XFJi=aOdct0B2B9vGs1`C@ zREs4>xG+>1E(~>s5iTrHh6@WEZG;P(km156jy1wX0m*PtK>xy);<|joG-bFj&Fx0G zFcujujOEuxxF|RoE(-2uBU~s_h6_b5LAV(GLWrtY(Fm=`PW76zWaKK+lx)3(&dz6; z6f9w(>fsDiIZIfScrL?a9ugLY@}4Z=D$7m@+3}k%ZG&G8!K}=z;yp9Ei^$fAV$28Aa`04|6`L86Re`7_~_#T3h*1Hb6v zAsDH}6pV%dELbbNB-jeNw*6pDKh*T0DpS)iov7DJYD&lCeNT#dJyUn$O1n6!le@0V zE849NrGcdt7VVzYJ~AK##%&7%GaglURjIquwvqt|DI-hyI!$+@_jf~FGQ*K{b>nY9 zOrTU&gceBjCxpsp9{}?Rq-P)}@fOEo&*sEqv`vWvL(UT^BOPd&bf>6<27IcaQoiW@ zWCsq!F97R&^1Ja{r4&>)B!zgr==xK+&=fmV3MZAQd~!&MM(-yRp?F8(f`uc*D;D|_ zDT?C)Q}K>c!j{p&N%!Yb)W|7_lC4ESrBX?Sc-v~E)OP<4;7BKci-QIv?n=2S(}ZW! zRisZjQF6oD6*DMHJ}i@Rlj%@AQk0BG_N(F%x0Kuil-v-SjL6}`0fg*ik}4W0K}8#o zuVQV?1zehVQKB{|YsKi{`IV{_&EMRViR<=r-UceT7*Pj`_KXxj6X5TVXi zVE56&p-fQPr_Xz4{!k_%b*fk_o3KkoinN6dy79R*E&l)5dl&e+sw#i{HZ3&J(nKB- z9-{{+5|GxUdstHYHX7W-OhD2BL3o-;z!)lTBuXZ z@=wqz*3a|r`rGp5{l_w zB#c5THP%fHEMeSBK;$F=wT&grR}xA^!sLk*%;g_d+xgs}katp*d^|pHv-O8tV$tRv zS}#w&hyGee>W1%km5Q`SJ_&DS(dTMngX6*Au7S!eHM#C&)2AtK{fuyc*dHW?ro}l% zn8=~lzl%tk{@v~ama?+Q6ss(8LQBzrhl7Hm)#XRqGHul{t5EH`5m)!1yJCic`7~N;jO*Q|8274*8 zqmdYL)@E-VVQxI8>mxYlLNnb*!Hd1TAf$g6?8|F75p{la`CCg;$)v^#-_SsLK`{)PT# z4Zo9#JVB)|Wd9PrzJYO6Ebabi;uSv|*O}x2nSX8gataH*7ST^TiQko_@>KT;qIS z22i=#r+Q+6!f-3$*+pFf(v#ok(gK5_<`B7N62wh4089H z2o33(^8ADE|E3L4M48W~r^hi@o9ji5bg<{uP}9&*yK+SgaB^8H z(~!EZFV)qYatyFpm#kf}x@K9;DzT^L?4M~5SPRT?udG^KvpU(Znm)_6Ol+<>(_p!9 zurAoW_S#f)Cbs1ArAZi3Yw1gS4Vt^jo?mildslmJn>TTmwFKxigxNN4VNfYgrncGi z9;YS=J9(LQGQTaB$zo1pFTL5BB_!L26bsoUOm(%y+84DXl|awU2`58vWJA##d;_0O zy9?-mP`bh9?AbXlpVnk=`wb~C7}gCr1E}`USJB+R?_)8oq4}J1UspK#cEMj&IQkI5 z7gD*yp|95bZnDVu5p)&)wBpxt9#S}_2Evao3d7-|@p}|b=ccm!_bXiUzoKx>e>M*i z@YZ;>!nK~aDO{)P-3r(IKUTQr|Bb>m|M5KNLLam<$%l_CT+4Y#;abkEhfrX0kfZsr ztp*2N^Cz%$iI(=G#l^N6|Ung=7Apk zI^L5MuH$V{xK0-ivB5!(mcLu!TK=;N*Yam#qCpOAh_lwwM=}oiSgS~SPgXcy!xwzD z!u7jY?^3wdf2YE={!S5+YxCzdP>^x0e^TLE{_P6a@}E_>ei!RSo)9Bm%mK6MLS*D@ zK7UE!I^KN>*Zs)~RAQE+`TG^F`M;}h&Ht*xb-FGD!SZ$fd{^OGj_WL#U&nh5IuXV- z{}zR7{+}yc^B>KFEbIi&5+48_^(W1{+ zBJcuUprg9zc5xiz&_}n6(-p4Ug|-Qz<9(On*Z2=3@ROCz3(emif$xaGUx~o0&}hja zU0VKd1bza)n`Ze>M__WmF(;RNUKN2~kA*fl@Z)u0;s2w;wVYxQFTa*Zj{Y9Jiv+kqAuA zruU=(==Abk7C3ks{}l??@^4bO)@NAZn*Y-Z*ZgA&*ZKc*g=_wo6t3l$q7sm^={;BB zn*Sk%>v*45IBq3Bf2nZIzhB{+|9B`(4*F>RHz{26FH^YI^J;}_{u>mo`FAQDU6kk_ zI|bT!eKfu#0&i0|M2ej26|U3uF@11EkqA=qU)8Ch$im5$=A8uER4Q0y#KUkZHOI8;g$2Tz=8a?0xM; z1=;(HE}D_OFTZI2pM?L^i(bv%A9oS9;hY?|8B5M4Mj>I!prC0HW*Ezk8&ZF1lTnau-<|}mmnU1AU_K`^Xc6Q0$v*cX|C3n__#ZGQv zKDnPE5!2*;I3IWifplPKD`i9F7w9jW<%!MTtSzekcKKMgRwna>zr=?hIbg_B^Mx$- zA+c>Es!oq{uRAM#FP`v|XVK;#Q#|xUGEQ_XQz7B9Dt^JUC%``Z0Jt8Ug%G*dJMVrk zu?)I%Ds;5sNq7$5yBimXf4`@9c{+3Kw7f04`z;iHTD;Zyz&AN%+(`XWBO`A$^8$!GKX;dA7ZPmo{TUG(l09ZkV!+x_RP=_o)U#V1d! ziK2sabogetzE~2F7`~)%xHwnF@BB3t%H#$TH+=6N3Mzb(!S8$;{#TH{Z`b%<^#s0e zyDu^HQr%F?{Hes?^Ch)IfAk5~AGCigvxGioPoI>(*5$#I%<(IE{gJLi{)E=hMEG;? z=n@{|eq^+fLc0U#4`I7zClqv_x-Eaf3EcZAzU{D}Aw^#->FzrJa8Mf-x&Otn)pZRU z$`>x;Yq`J1svXQ1^6l$d-_?D67Xu5{Hnqgi{nz(&XS$oaJA&Z+;MCs39ahzzZcFvR zm$0&PI@aWa&&mt41XgrGZT0ys{&w%yR-sy1A*4~v7F%7Hg1Nx#yPZxdmMli~ipx0+( zkZEsTpUO~fIyI`gJJUU!!NI95dBLFc)ZWv*PeZ1uCljoueQL_24rT}0-Iwt>*U=J` z_NJPNKSn@sMXIO0bz{(z%JlVg16!)|?X4;7jB_eo zV2Yu;tA(_R{Y9VZrC6e${a275FB@ZDMo&Y}>hCI`Xa9H3q%ZOEw|SS%i_d&5eIGRR zabEwe&@~WF?q2*YzkMdYT^rn4P|!eM_=E|F|Kn%(J>4x$nWlxbv0uKhBDV1F^f}L1 zK&qpQ<}Fyd^DfTUX1zf}STW;rIe~7Foz_+G-c`VRwb(~OJcZ0y!q+!2PE(?gyU)Zc zo;I#C$pbR~+VJHR7J4nBpLP=eFX5@2kaCTaU%v1oobIz#SlmkbCHzVbUuO88;P49! zF5%>gdMWps^*0<|W4O1xos8-EIQXVGd_M@~M1O(W=*E@_{MPW^mZS^ik8NoQFXfLd zMO$_R#nQ}pJqYEj{-CYyU~fZ&;NV_j&$#Z5GO|muZq#pD;ZTLuD?#p(R zAack1%d}@!SjWSmIq7E<3muw!#>LGhc9Fq(>pfO$aEb47gP+WFlflnm8vPa=+BAj= z>1Q?qBq#W}o{VkgtKe~_?=X0R>GvDFfoaqSIOGGm7@A-^H%9kxBLCfHVPLzlG(0!rEx+FI<7^Tf-uj2L@^4f)#&~Iu4;VSySkC7azm9j8;r~4I z?^gUeUH@hHzsUUfo-CZz^LGl@&tMCA+>-qHF3UNRamdknzCrQpQGQ_r{}RQIesY-Q zUlPH;LE-wD@Q{&n9m{#I;@5h9+VEe^{BD_CINdhwT~i_Ra)66aT*>T;INP#sFrhp9@~# zAh}tvC{`_)+$`v(Eurd$2Ks7nZ!b;X|8{#b*q4#LnVD!n)$@vH{%OX%Lb`QsVeiJy zOw(H0W6AXRYn$Blq&k`wX7H`th1frdEnM5%8(XM1Q_BBtn<)V)i=5Z}GW3t*kDN=J zzjgn1{S&p9GKP+lTm`SmF%BUf$sbuuW32^Tbq7RIb|O#nIPRjdK4;P$Wd60`v8F@( zb}vQZe+&6(2VOY2#`#|6^6-QEAnU)tli7a>Cs(X3F-5IJC54(IGy6MZ5z>}{^Y|^ zZ}Z_-MBu2W`S`md@EarWJ0kG+Mc|)^z%g3o)91?(_zxoR-$vl`r~>7ae?|npGy=aW z0>`=YeDZIOz&A(W?~1@b5`kl_oG;$bM&M%+_*WuutR?cveZ|B=$5fQcR1IXO(5iCW@?lQAL_bW!k!1dR;~6=x&k{?xluIj+anwOu`T%Yc8zQ;V_)&H8s|EaKQE2@OXz# z=hu6ZdhLH&1V83CaFDOp;Ac5>y8QDLuGhkq3fKBCRXEyor?^d|xf1kp!))fAaDqQpb3*(YM(w~0X;7dpr+~<^>fM}5~d$Cr|6GqNT2qE|7 z2suw1e$nUq24C&P#C{wh=cfwCSR;DwRk+TFeF`sC{4XgSYX*@M&^;XLA%5bpmq;gL zTBq$LmdjU!$^tm~me8U_=bpXDA%FgP*nU(Tc5!!&)4M@)V{S|7v79ZJ;n|1n8=8&7 zUYi`((7so8pE8>eIll>Oyw?YbCzrX^E!jT5>-O!G-o((d(!}uXSbHZ1$H@NLvN8%1 zCo{v#kTtlL;rf`deMjeSNnQzg2k>_C(BH7UvcFv3emdIwhs?2w;almn-TurW6Oc=1 z+pe0#%~f83g_6F@%U=LLwp2-#%#n$qS2(~EbUbkL3mHn)jaty=7ZOA33rSBgd^S{7 zoZXkZ>TTJ4qVL(bh-tUZc{?x44~poaMk@WC@O?Nze?C4s7`XIFV3bwyLcV$tPsRhL zU7nMFDbp@XiN*>P;o|O!4MIs@<(0KVQ*v-s zKUq`$9P9*^4oy^_G_ied=FsX3ZY<24kCVpB&--ofaf!jlN{Exa`<`Wwo?p0g#uXvM zO9M`MGEPHTenH*Pml7}*jqe5&SJR!h;6}Ephk?SlQZ?O`^t~%Fd|9b406GKwiTKM; z%&0D^uA4u9@Mi^?(`)Fgaz|pgvMfPogbypGz0(RVjmoPl-&T1|Ws=V|g7K6D%oHA0 z04~wYaTAy1r(=0#cjBbHT&-j))yMV9H&1f0Svizp-sVs?Q!;1$1<5VibOb$?rgPbx zkwt?K;1Dn6^4@=Qa%%_2W>gOTdWI^)$#aQC^cVli2T{BzX5{+h(T=5>DiIpO&=j?v z0Cglt4E;Bq7`>W!Ts5V$@gE+;4m2H>_3eAOpFScM&68hV>z^SnKTm#nYyS*+`FU`D zb{yws>HO>;>gXKp6b{o)P&B14&kpd7wJ%WCkRi^0rzjGGx0a9@rd<-7JaTa+)SoEY z^fYzo9+PX@Qo#O;2fDwozNqc>DaP! znO-^c1o^u1IMScs)m~)$jw+R7tl9iRWzmNpm#(RLXgo1|H61!0?wDU(H{3G6q>kdM~l%J@O~O<9e6rgO@a#pry8UUI@R=Y%92?(73NF_Qcv z97JEU2no+6lGLGt%H*>BJIdF@_iAG3MIT>zC_Wx3hHrK`Em8gWfKiRSJiDNF=)aw~ zzL_sRHbR5Qj#o1;(|E>x^0N40l(*CgKS-CD(|;!xtaU?Ay8+3LhhAUG6Um~P^ijB1 zyuKGx?^Bw1vMPS4h$6zpQ#-WB$#i) znUTGjVk!FEp|wvwPL*kY&Ct&<7FAH(7>feBx?xgIsKZ7m7I&3{uTqQrZ)iAtGrht? z#Ak>of2wZiCp)j9yNEKI)&}CS!Jo{?9QiN>i9Lv=(2E~0+Voz!su(vtMRcwmCx#x& z#Iw;p?s(B!XVIODmKrO6PpEus^9z(WlQ&Y*r2mELnUBy1rdl0{1O$@TMVl@oFd`L` zXOmy+h;OQsvs`G`Uq42D{d3fFOn!qJI(XEFAcaHqqzWeQ&jV)b3zf7qMItKBdg;Tb@UyRIJN2o zbut6czizm@a5-h`ra!pE_{rLGVlA#aZ(q^vSen-iUpT+=zXiV(#6O z&7UQI@+-*ahjOo*K{|KfJ&hNNHt+JxGiruj&74bBtCogK-`eOVUPQh-DN87)em(JS z`Xa&5qpl$F7R#9g*9@OIpUP|SXT_N%m7`~5GvMvhGXUQ*khh2)CPrV8TvM5R))ijN z6W=DnzlTvh{AQ$)R4dwaCJhGz7cc1hVS--r8lWbX`G!lxmff&$656G}J%JOiYmw`{bG~&0vfdiY6z(Q*C13bKc*@CZwK&$JI2Z%o zT|A(Ky{>0JfRbN67{k9FjA2WNfxf-!a$e>LTsW_gx!B2TLY$fDUCl)YV>t0(41aL% z`yC*?KR6h}g9l^SdN79T55{oC!5Gdy7{k#ahN4YP_$FO;UdDM|N8lvB5ji;ZC;Ge~ zQRQQmFVBKC?YqhFZRP0es6F^08T*T7NahhKJFTRq6MHy28K6nSB_zYeGM#(z=%Bf zGa8X6sW{LjHBK9mWd-63cGD+_G2H46!_dJP+78CB>|hLUI2gkr2V;0{+E`{%@z}u_ zuseOge85cefDDZXV|eqy7+!ZUhF8PGC3SixnLj!h1J*kSOvU@c3^ay?qR8B=LQnH- zJdkIV@}v=2#1?HTGb8eBbVyl$?tp%Seqm&INr~%)Wc}l-JSzG(r;WW5ffJCSJ&$Zp zK27iK2l5USmwahJ>4>G|XB31qW=I>YJEZDFox!XF)TS4!$~2AqD?bsmSa=0`FRY(uTWKYm3s08 zx^t&0-1DC1SW{o7yR(Vj?sj*vGlLCH9et^bV$Gc`7sVRd*L5|~E7+;Zj&|5rXD($LhrHn#_+m19qxc% z%)d(C;NM5%6Fu_EeQaeqLvQm_w5gsMSv0xVr*iv|U;h$5T?C$b`0O#kYW7O>wEZWh)bwKz3 zc7K|G9MJu({c*;@opXqXqs4h7hZlx%%%yP_YX6+rfcC+;4u4)EtRbERdJ%EW?#`ch zJX~VHJno($X2alFyT|>%cpOJJ&?o;%XMcX!>*bD;I8OXw)0FX$0tyc$MB&JSteZ`D zEGML}!ovz@L;4%=dHrJ{Jro|&L*XGkuvyP?LV74Xq(@Xa=H!Q>b?4&p<$qRw+^0wW zbLAEGIGPypl^4!yL4GJvMB|K%k2jP(?(90^w)}X)fV!LI{tI6VfqroITOG($oPmNv z9B{zO++8e&e1ij4?e6@UcEQ##R>@cJbr=lt2N*jUS9f@~1rN-_(Y=M`?J+vgd7 zBZ}I6E9BDbw?~%X+avT{5dQW^^}KY!JMw-hBr&I8EqN@R_6d{;!@Rhcedg1R`vo1^+a^q_q8Yo*QEd;z1F? zq1@r#KtJGIEP$N*jEPrp8`qiS0hxbo_^5ZPB>ro;Zb|&m6;7@-d~eud0U9y6gi$zf zXznjgw}!=emR#m}wqc+qhx|hs+5B5h7<4J4pLT75rxs|C?nQ68UZF6}`tCqexqAsG z2--9-oBpkV=V&tpBl>&aSge(9@}++iijga2!AO5@49?Xboa;7GAXqFm-(ULtCHrsn z&!;<>D@uJ3vCWS$_;~t>{!)K2X6K84fDfz6J7Hd0F8_s&x?!{AMf%YkP%J`vW#co}y@ZcHLd7yX=` zjJvUju=^N~^8}`nXt*8pn?Wt8k<+!up|RMP=n6SvPs)u^gnf(o<6Qqnn13(xOGR*F z7GZy6yq+tF8?Ok1T@l1P&T`r~ew@t)E>83Uo$uR09!G7P?q<4{kq?*Jn)5rG;??$r zM1xw!iB?xdm``$BJi(7;J=E%XH%z{PtRi`@Ha)^RT21#2)r=@-xz^!j=)C< zN4+Y;phV8iJ?Z+v2>wq-;IN~TFCV_d^6UAfEjM2!`Fj}O&A6M7LV@hz^=5ZVA2CXH zyS=$&M?1Z@MjM&QD&B&`ZS=M!`R3iuBs{c@2#IE!5s=!5baCp9O7fNsOsK2$TUdV1 zIcHZmEwg)_U`eyBQI`lXomJ+O;@)(WO;VC;HdK{(zw<|7&pO9hXmCgTlcZZOzjwD{ zX|ihdnj}6C)!P=vkc+JyO|+Q^V`Eh-nYFni)zp*E1N;Xo@qT4f`lVC9tlRBL;`d^Zc9&7vK}j#O7z5I%p!aypwjI=ZO}&_}kKo5;{7?SIle zE=WN$1@=KH!H$5*v?xPn^)<_Bf0N!iT-)AFW$$*4dueaiD~piX4{;#_$!;orI}5w2 z^sTLK%1_$=b=k&#xtfvlLzsNH$iv8xw$P|2pAbsKyJqTZn~xrY+T%*J#o_EWTZa@4)X0{YSO4CjvK zaSr&&3Xgi{3x}QHz<&z;M9vM2qkH2e2;IeEn-u@4L<|2XA%Gk%Z=j#x@1y<-4)|&G z6a0-lF9cqyaD3t$4*2Qx6aE_&uK7Q#aLxY}g=_v_D_rxR$B9I|XQ+596^^;C=(ASg zSc3|_QQ=s72`=k6o376*ey!(I3dd4HstbMu zPy8TfvBFPLIQCJ5|0>4k5Qe?YMy?<08AttrtZ~L4GyHLQlKV;o{~pG{b~gPa-ct$@ z%F8~7u7aPXaM&gk{3DD@eTKep|El;ah!+0uDO}f+Ll1MovhOxxpBL@~#-S(HE+Xd) zg`cnR6$(FH;cFCrfxR4#p)P925NwDE^Cy7X2Slxb7c* zq3|~={+XPyh*$Rm<%~-`83zNoPR6Z1w<$SVpSuh{bb@=2;*S$8`X7n~EjdJo`pIPM zD21O!xbPp(IP?L(xYHCraPCH8XDM9Qp9>=7Bosg7oXHVfu5hi-)kaRh{OyV#a^^F> zLE&1Tn6+h&3u$=EJT3yL3dS{VPm!nHm#u)#!5%DvH1^z4OksXuozeuBcaJ|`PF1I+&>#SeWpF@B-K zwLVo5a_SX7$5pR&OM4Ba=yxPKCE!9&&Q3N zG3I|j@k7qzjE^Z?>+@uUoNp_B$a$XSJgac6&xDaP&ipSae#m)_@d9iFl0$va`W(i% z)Sq!Mk$bJ;hn%@Q4xXZLt;FN%>Q|X>v$h!T*@WR{D(!A8*K&?yJX?R5{|$;C z`baxktZ*&od?QEN<1)n$InplHC|t`)8adJ~u2cMwGndnQi^6q#+-&49d+Z*?4>@PD z$A=ZJ<$T=837G!@#Sb}kjE^Z?%X!ksi8KGV6+h&3F#fE+%Ddy_#sEesee(pmh&kiN7}{b6+h(2 z`0`bSYdPOCa-?1CS2!=hU5bz5eOQ#cUZ1z>kexUdv=S-IK3x#Waer4nY%>M_)4>|K0FFe}cAm6k;MT|?j0_Hza z@k34>g39{znu)k8NUd?!NAPZU4o+|P1;t#GZ+ z%SO&N=AX$MKBy;$Z1vlkn=pt=~cMa=LREZocZ6O_#x*x#^0rItKjg@G^rFJGKEF3|WIURQz~rR<$b7F@;aZ<#8JGGa zastJVTN&3DC|v7vp~7)1^TXu|*YU1qT;i2+=QhQU+gbF3yIbK}&by5q&mD_>Nb%!# zK6`vp;abjr7&!s+e_rw9wwm!>3fFR;Hge+3zen-owuSMZDO}5W-pFZW{@*En+-_q0 zP#9PwXUCT#7?*q=a9lKBQ2dZ{ALFMfTt;jldyR+_{aJA@r1&`kJqH(_W4V;9G_&`0dz0*LC$p+0$?0+ zq+J&q{Ckdz>Vv|ekDMDVRXF7Qkon^Z2frL@NGKfqzhwS;gTKOfqrvwx-f!?Dm>w}W zY{$TDH~2|Rj~RRc)AGItNa%SnVSJ0>-^%zlgMWx|XAOqJi=2-$K5qCw#rTxL#ip&i*CBFtGJokz60YQbiSf9> zcQY>EK@&MYU_5R3<$UiJga3m0w;B9J#zzhQD&xBiF6B32aQWVzOuP{s`M;R+rG)!M z!7pLF%;3$82NV_#Btwoq%l+r@Vx|)Y5178%;AKpw4L-p1CWG&0`aXlZib2>OgQq#) z_8EMf@elA-(k1=8v#>~E1ebB-M}}X3C-`7;*MG6ikz_EAtO&Xhj4X#{NWc#>i^*6c1wJ1p7f(wJ z$LZb~%Q?Zbk@1^R)CkzT$=S9fw0z7N79K#HFf20xn>YK&&?3y`YN*4O38#NBHM|{h?u@f4DEq|J~AeH;(QqCgLT^yZ_`G? z?In}F&y@erMYQ*6$`9C*r92t@(>%(SOfh8^LKSibk?8L_UY9a>OtZ~Amb1;gKSS0! zyD3|4R%R)O8&2H(%|6Pn8_T>9%DuzGGF|rgRzF--LfK8aXc13Vxf%A8RRJY7w)Zp2 zc4)&x*SZY&!%lcTjIJe@iH~MV%f}wXY$P%Cy%!UoWI2hUhO!+qSlU%Se=0{ii0wi8 z#r~sm=LWhw9MGSWMde3KUO#O+lWftFO9{L zZZ;97hFk`>jtuSFKmQ4eh$`a%F0ktQ7#WMK^LAma!9|25UE-7=s-I+$FflZDzEALQ z4HaY`Wj@g1x$_ejq)Ur7)y*QA7o>xtO>1yBJ=BdAxezeYc^5TuH$YA! zcf{b-OtN1?4ZG-_BlJHwRp4wp6>a_~$=ivOaUx}Mgph3cQjzU!C*R2`#7nkfU&t&Z z&Rk|64wE8eJ@oB#g{f=K?xIagDL~!u`m&*h6KjW-llZ5-R=)XC=izgbitI`6ao5cW zvQtjkw|08=IS#6?XyZOpCMPLE(&s5M0Pa*co$+rFmCIi;ZMo?k6e?UyllK#ot2ej( zen0ubidNCx?;)^u=T{689QBS>rm~#FI6}BuOe@8w83;eW~}8+dZ0VAPC_)Ah1jhk+pg4t|n z%V+lAuzXxOWtzx3tI*WblTmFRyU4_SzUgPy2qWgq z^Ap1-(vRk&xw)wHTDkEmTL<^o(LKeBDK+8F`5%-I|&CFl#l$@SqcWOwR@tm&UxmgUA8 zVrygG!GeNHXY?mIuMn~dF_j>9wp){U8%1&0DC#1vWpjGzzXppcOvuh+-g6N^Y#lYt zE5r)7p8dArN+yg3XJ0ihe&->#AL`5)ts^m&bHLZnd~T0Ef-fLGCx@>0(~oRG72FQX zOM|lt`kf?y=HhXdb&umgUJ?)GC5$Fr0;S>pyzj%iPsK-nB;I-d{S6$E`T_lrOnziV zcizSMx)v)l<=lEm(I?RTEJe%hXyETkFkdH!R}BzPAqaAA0#4UA(hoRqt^{N;?<_>1`+7Y?4i*tpIiAL#GeQkILJopN}7#Ukqi zUO2g4!uNI>6>#`1CPLBQ38B9l`WY7IHFAdM*sAovV`vF4`M-)V=z{)6yX}0YcYy}! zUi6mhRSMIr-{J5Y!@YzPJk6L*{~iuMVFHN$5`I11MwV z5ps;r!rlNvIirqCkJTOQagM<4#So2cyCdmm<45zz7yr~hkO#TX8{sy7&o%uYe1AI| zN$9-84tY64X)f&)$%f6KI4dgc0@V@t0OM|KVUhW4`YdLC3glcH^IpKXJY#j^3j58B z@j(lwajB*s;@!bsZfqfJIpg~n-^O}f!T1RGTk@=zU`j0(!_(bNSF`frEJS%V(miaW zh?9QzTE>gnL*@ZD5-pg7!F3D$ASVujT)V%-w$U{o|ED7GM+t|V9dw1e+h1Z|r)xer z-;Kb39D%tY`sR;g9Zli-gWRFM4WRM2m*(EzQYnz(adn+_R zoCOu!z?zL?fw3Cgr2EJqIc{K##@$>`R@hT9XMx7q+i_NGh@rQwFVoU}y*H1OCB(P6 zJH3%C)Hti>NwVqU!nb#|c#A5qy^@auCSNFW#|_oMCs&w|X=-jxrOE712DaECGHYbV z8JO{g!gLgv{WGZL7jj1fCW5a3H2oUQ`+8?n{yMdT_3 z7gyF|yVEj6fn#l7E7`F}xrV%2*~3?C>L#4Sh^Xf;D;cM1@7@8S$2HC+Bk`A;kU;}rih3dj3oBImaX$67^j`Mx~#JW=6twiGy~V8So+NZ_wicnfC)@Ic`o zQaFxoh@4S{pQP|-6@Ie94~JlK$OoA_fCTKEB+@KN4LdY7v0gh zDK1oaYyB@!_^IS4@!q6xtjPo)X58xkA;o{1;{UF~OBMb*g`ckQLZ19X&odN$jKbfj z@HZ5NAUkt_(Fw$nQ@!0?<; zd{p5lEBtc`FH?9aPduSdxx!l%j=8(!!`l_E_4$Otb^Cf+;X0pRjlhd|9u9pp{}~F$ znn3hf!nn=<%M|}huC{MiWncM-Vz0x;=~bYYDo`X>(~f}E`Xw*Q;<{&$lRCx8HjeuKTwK6t2g+$0P7xD*QsyT*~)13fJi^ znCp_~^6fmue~iMlKFbuY^;sQ(i)|>Bi{?k&g9EO|wYRA8_x0o_`ac9la=7Sx`>E<5 z^gA8gylCa%$7`-m*|igJ$ddg9-X?PVz-2!opnEvsm;DR$;c$Y>K8U1Ca2E;j#lcKY z@B!SAOZZC`k2B727XKiWBB#>@NY0weno#5mzfIS7SWW<87^+@Rvm3 zK?GhJftN+#vL1mqnwHd)cm#hU0+;7%R?eCT{>BKrEdozR;QbN!Km@)e0w0OMw?^RG zBJk}I_>KsCGy)%sz;{L9yCd*D5%_onJ`sWMi@>KMa2Yq?t?QM%b7S#h?$<3|5`hO1 zcxeQVeL*-Yzaj#UN8pJFygmY#cT#M;jS>895x9)cR!)Be|3C!3B?2Fbz_&)=+amDo z5%`V>d^7?di@R&fhP=J&+E;4gNyt%5xC61Y(BIZ{zjIcHuyfq`wcGf4n*KvBJhz2 zd}{>0Edt*jf$xaGM-5)g^T08KOS*PN;JYL6JrVeL1U_N#GS+9G!AE$0J7w@<#^qtU zly4!g&t;!Y@XHHbx14=PT=0F2>vt{DF7_}UaQO@W7~`b|7x`roc!j~Yvz)lWM;Mp= z1BrKp7iQ891b>Osi?@Z~1n*~lsn>!xGTvtR6O5+~F7o>$@BxF%JBfkQ#*fL|bvXok zQ*glWD+WO>;V)S{&h$+Nm-+oRgU69Ta%1j4Cx3wP=MC;6B5W@Ei#};qw!+}Do?UHl zS^wT-a9J%#t;n8FY!e+c=%~ zm`k7Y!@GqS0hz!b4u#L5wGa`Yy59IV z8ai$0da>ZfQ4ARWM&qA8G8|vp_>UbG_8&0*BZl5#=rKd@HuSimM~ptjCjNbfKW6v` zjt}b_D-P4eh7Jr}X6U$~>kZv#=(M2+3_W7#ZHC@q=rKc&nDX3a=pBY0GxTml$Bzl; z&$#j5XXx1MFn_V3_st9Y2gW~U%CF4$#|>R?=te`Q4ZYjMKVbYv486_JI}AN$=whS) zHWS}&!#`&H$Bq9!L&wB2qqJXBzekL`V#6O8I%e8WnJMow!yh+v{So2vthfF~zqp|r z4ga{&KVA}+pEmr(M&5w&A2IYcL+>#3n4xzYdfd=EUK7?YF!{O9@W&1d^A{UBF!XLC zf1jbt4F3+Bf5yMw(2a&p8+yRdBZl5)=)lzf9mapRp~nneX3BHi`0q3HxXo`vZ!_}h zZT=blw5iVnhTdW1H5z$wBQIvg>oGIF7aRZGCcbe)HyS!H;mZs?VDw8Hy3y2^w4vih zUcI5mO?n!Q|A3J68 zoN#-Onfxy{{(+&(3>`E5bFrc0hQHp>BPKn8EkDD*+muh*_zxI*#L(LeJ!Z;p+|Z3C zzTL)upP|!+f85lU5tHBB4870f#}2Enp<^b$iVZzx%44?)KW^v&qkplfpZg5|K9j!K z+;IIWHguVh7g&EoZ!`JPX!1L5QXXu#8zul&OjGOq14S!(#1LMEV&+YaMjX5_^UJ!a@K6W>0g zf86-zR;uo<#Xn-tqQx`ZBlj$wGXAZGUT5ewL*H)XU2FW;8@j{L*PHO2#(&88cNza- zH0_Or_;0oT zhQ7_vZ#VRyp*I#I7^1s*6$C>c-PDhCUU55YNhF)R#>HFcK@bvxA5Ph+sml&Gf zSqbrPF!VWwCbLN){(mz19dG>KWBj)o`n`sJpP|W4W+*;7`y8U*Z}>l8XnKby#7}#? zA-d1dv^N~`|B#VaV*D>R^lgTIt)Vv=I%VjDp=%6%tf5ad^gkH-b%uVup#wvoWayI( zeTt#y8~Rj3zroO_8T!K}f43Q$-pvY?$488Rsqz1)@&A~i?=$p28~PR_?`A`P-0=U4 zp|>0QUk&{UL({unq4a&y_@8V1?>GMcX6R2D`mHAXzZ-vg788p9(}w;JLqA~X&lvi% zhW?zP|I^T;hJMh{mm2*aGX9@8^d*M>3&wx5@&BUnr)MIe{CL>VV}@=p@~RE}h~e)y z{_70=sNsLi(2pDX2}7?j@&*lkqoGeX^fE(#$;khyq30R?CyoCuLqBEcFB|$RhW@Id z$;@7;e6|?+Yli>phJM=6&lq~#(9arrx1qmb=x-YOTZX1*k|F)SZT!Du=Fo)tl%FxFc`iCa`dyIdZp?_rf+l~LVhF)*z z4nzN!k@rU9Uuoz!8#-=idUq?7{vR9pN6rfS|8ZuRrgw%y;g2@-YYlyrYUsBZ`btC78IVx?R~UN2Ltkg;S%$vV(1#fM z216fe=-GxYH1uJH?lJV?hMr?+Iy)3eR z*3~wwj#bsw)~r~atg2bHx^`)8Rpsg$ftJ>;sBK8pR12M`sjFKl#PZ69)g$h-7TdER@GFkTvg4%n%h$Jra#{I?xq*jyZSl>?`ThTWs+^Fj*f1D{QL4O zY+23fq*Fh6Ma`<(rKGb{5bv3H(tG?(>r#qwIi;g=Sxs{3s>)@{DQ^^WPpY}Qr-cE$ z&)$&|bp%W`^<>tjnlen2qIjvkIn_gdZB6Z698vwMn)+2Mt0<~mJU%-F4y7C~tS8rQ z%%pl*t^-<|+B;IBPA|Rvo^19xf#}*>+nZrZz$aDvZbj!p%w`&3Z-59+tyj}F z3@WvrDF=sQ@?q1d)Oy&ZAjx8)f^NM{0>BcvyO)R@k?LwDix2G?7dp8v)s^a@vQMs0 zZA^C3O;3B1Gl8*)Y$R|LSsMt8sEtwP)UKfRyrQzsOX#JRp(~M#B&&$dg~ij_FYzv( zZkK}~YB1|k$>#QS8%!oRI~ShUHEY*Is7aC4hIQR!m!qu{svsB|Jy&dB2VH;Sd$eqA z@w~bt@CX-&C)g4Q3C;9pEru*kwzRKH^-_YHD6SUD7&LNcDTKVbt={RBv$wi9NqLTH zusFG_W<|{^>NrsslS}GWR$b~f&lW>xQ!kYP8M$aC%N61m%3zB0x<1k&?CCP8k2OJO z1#-vcd|Z#)As$HcdxgWBfQ8Ss;#~4-QHr7;F+F2 z$x#a3*Gnqr+DtZPgC{E+R+LA2w$h9z=h42dE15+we@I>rTU*@5QS2Sv)W&%5t*Xo= z0@Ve&r<;0EtofU+_sr9HA=&k`xN%b*+)(aPy{x?gLuqx5vrgp_=kUvy)X{{mW%)3i{&n~eMHOamTU_UI^9FXpKJ{?QPU`=3Ic0S8R?-Q(DxwH zh#D{xrcT7k&)1rOwYG5dtCRIuM?n|hx`l!6VMg5R+MsByk%*CG`k|NxdS8_hD%UPS zT`%&r(X)nC^+~iPnN%kGx>`~+HK6$sC7mWqt$kh188mogY0fhO-q1~Xmi2>*rq#RD z8!Xpytw**kg`0X-NUo8FWhgu(B7dug@aZjn8XArw6u`F^hjwdf-0 zuv3^Qwy&c}aLlby-N?kDF{$xjo~g83OY<^+`UvELVaDoj`qSOCAf>*5?4{*a2u_4s zvRqC}F}FS7*xRy;T1TdPTD=&mJ)t>-^YzuzttWjtdShInLsLhekGrKUNcXJ` zDDMoDpkY?aq$Rm!M~I=fDWFX2Y9eKQY^mnv09C+gl4@?r!;tRAFa^!Cxv6EkSret- zuP?x+(nd8ZXrUZv@v(u_zLYDpHHf_1U&u+v@5eV)#KEmRu#xt z8elBd0V&7R)RClurk-_uom9v!NDrlt^y%4{&e2qB!*oat1?cQ<>Fen0wQx8i4b_tl znsk6(0@hj}R1LtEFjWY9dvbPC^Y33X7SP@(iEhH{<9iUwM@H zHnPD;O(_L+TH0YO5k<`n7xm67DXC_U?jEYky=_5XSJMXC<7!$lS^N&t&=*vkkyjqM;C*nq3wwbV3d13O+6bWLcgN`4=Sy2vT|N1 z-E7%3cXzLEPvvsO^?qwpnd?)jt^iq1+a6RWc-`%Mt>WA$L`CfSwYfeBNu#nPOP78Z z!*_yGMA-Zbc%>eIb#42)7)^XS+}>cIQ%QzQrL%F0w^AXX(ZHf6bv$jZ3u*76Om#ke zWI1&$nqG>0*Y$MwrJei^YR)Og;ma$=tv63uxM~ydCJDt7WIEFUIsi;jy(f(j+1kkE z@78a$Yk>}X1LY}qQN8UqkRtt=9;)R$w#Wv>I%*+J$lhRWid3f_2YDU?jBSa)bzxz@ zwoE473y=PdF4@?b0hT4&saDe%9Z*AaCP#&CK(+)+sBU3LDc0UagI!NI%_M2PMrGn{ z)e?+36fH!lE$A{J4{GRCt7v@VX5;HY&ZE1tlPZg*W$dESQ})e7Ojln=M?j0lpo==G zY#5ne3RiCF;>XM^PMsM|c6vgAv290Pt@Pemp?;Q$qRaMwBFE1*FvVDHzsv6+xw8TUQ~2yOc==BxUMkN zdqtutgjopS78&+%%`?QBn<*f^u$PontbIH0h-YHH}jomgWs9>awXL zCD{;0rlc_#@i3DEs36?*IoBULP25b3BErEoI}H_X9PCav(Ih*lU$vBQdg_q7Hp4b$d{%v#b-nKtD`>p-4x z&_)U0>M9pgFeP5qQtRWY5`mp=7;qgZjTx=&{W;7{B3!pdK2%j?6`=IN-aY2|G~vk_ zL=R2y(W$m}(@sDPFjV3ywN?P`ftv|%CF|+|_a2hgoCie&k<^Q5c7d>IM3b4^{MP~e zXgJ&PJJ8L7xk3A-j9+2Om~jndSOX#o;N zLR7`g%>l6>bF(R)*KmJD>@?>3*2!ZIl6*s|r(1hvrwb_lM=*w&y;sWyXvg_&bTtG{6nun(;XK4-O9#Sn@9JJ74be&$# zxb$F?Xc5hHy1G(s(+D%??5Ie7i(PKYgu(0VrX9{tEsny0jE5hXDaeM!yp@2-f^Hes zj|&+4D%vZzj+W(s_LaF_cI_7mYuX|ORLgQDj>^feD$Jw-0aUsu&swPybdN$bj!MiVyP|+G}_1S0&poC4=lgc$|H|&o^Z6@$K0_aj~C@ps8xg% zk-g($5OJf#9aCRhvxIjwXPm)L^tx8iJF1`($Tn+K(dXX=gM<_1bIk9%xeW<{RIBlQ zX4b>^GTDiZ!NWpi=^;$KEE1B2cFJYm%nOCY6fPXEREwgC;>1l_xg z5L709e@BmOe*BtNAPk%0VASd9@3X5AY@T|^@6iR_t!@Nf+fKFBd*nKPUUyp9Ewe4? z(!-$2dXI2H$i86z*=6UU>yz_o;WJPE&{s`0pABfBZ&JBEX?bY6^77Tml}qV~&1FeG zr6qFoDW}|oJ^NfF|DdGU2Jnr#-~Z^>Hcp z_yxM=)=_x5b)Nz%@dkDU+jIQ^?uF0c2Ql3PT`^LpqlkBPZJP{Zj^ z%{qF>o1Swyz5|y;e!d8KJt>Mh?^9T>Kl|$#X-K1?Cl=%8Ra0NNswUsV)R2Fk2dYh( zOsX@DnJ^9Mq+V{0(v{oq#mvt=EsgOmIqjsO38h)mn)2Y>_SgxRG;9?;1p%H@<>U&vxRv}Z<- zj3|@3Xn>>HS1C=lXwU1-r#tmRe4XpjKL(||O{UpGn_@jU6GwcMCA9k+cVTHxhs~+;lQY`yOI{QS*E28D7>AlSOLvkW2 zloLd9u+fFbY*bpbcxi2-ozVcWOr5iQx(@Io40*nU__FO#)sgHvU9T1W(uwL>Z>EQq zwAjZBt<)l(mN-4M96F~*hZEbIap<2Sr%5>-*7DiI^31v)schqCs0ZY;Pd7wAU7~$m z-D@*6$#4%P-O^Atx~OrZuM6DnNE6xsuQ4c2w_DfJo${Mn{{4p_d#<84mc4}poCKz( zfi0Si)ZO~8+Ihv@Qk0((g{m@-p78f^W&0jHXK(RJ>2$dLVW&TavD{<2{Np2)7%ePm zl*bq!s#vZcqBW7MgWbB+t##G1)%xd_yLxd;NzBQ?$urc)ML}oF*#SLZ%+SP8y16`j zi~npsHyj&*l%%Fsnu5?%y=FY~%XWoSirELnPQTo8PPfwB!#7_}Zk+4ogI{}qO49dWjwy%EDYW9vd@eg zR>fxY7tc6h?(D*m8U8yvC;BL37vf6asK1=PxxQ@9mF^q$f1_`%cjKYzLTb0=3oBv^ zDdBEbw2->+)Iv(a0>2_z=)TRKYNKy(;(_De!UZIRk}02v$%>5golA2T&DnGo=mff% zC4{JIijSNTBn-nn!0=pRL4<3EhBeDTM*{vsT-%=O4Q94G#^L-l~Ve)(BbV?T*k@G}_~`GQM1B-mf@TBg?+oSRdu&EUMv7V9_o4NPw_xX@b- z{%)qX8~l?@j~blpw>Y=U;NN3e7Jt$6!;Eh+{0}g_)!>gaz1`sd z#q_Abf6eqRgYRd0kHHV+&S}En$1^@<@KVML`6}r;o9PmRS1~Q&gukBg3d7&bbi&}* zF}=p%TbOP$_=lP9H~1%*mT;oaXBppW_#a_tk$ z5sXh6{$m-}-^xL~J%e$wPvV@&k#AA!Z{L9b66Pa&C?S5bKjNJJmJRsVGfwtOoD=!C zFs;8$1OE3g-f#Fn%k&n5e~sy_27i|6?FN65=~08n4)OZ!GWg+)?=g4@;}Zs7%=nbS zS1?}4SILJfnHG71cQamU_=lOUF!*++69)ex(`yX=O{Uun{wt>Y4L<8opFdj+eiGwb z4ZfIh(M!@*%lN3_e=Fm=48DQ!JqEvn@d<;!kMSvke~$4&zKT9yVYylH{fgeiGw_98U7Bg7FfA*E3#f@FvD944z>;Veoe_zDD7Ib~!C+ z9-(mDzMuK~6%J@0^KUVD2@*nXtHI-pZ#Q@wc&WipXI#on=1Ub0kutBXP&o9zh~*>{4*n9JhpkaK_~o1QZ3dTb()SzuMwY+D;P*1V zRpE%Yg5%w;aKyWV`9}@@HO6-t{5i(=7(6zIgpr#t_=${98T@?43t1lW8G1Ido+Sn! zV7ye}(0?_{sWA9@#^u|3QjYIne2wAX%6OZ>?`K@T=_hg?VSJ0>{~_aB4gOokw;TKj z-gp=_`0E+pW$?2Y-(&DP#wQex{M^R*Hl=WvZ_HoFdP)AvdZWbP@@>>og+tDDET=-@ zuAcLJH=%Iw-_87M6b}A4^S2qik@0?oL(Y3x&K84jV|=T@M;YI4@TVCcHTYh}cNu&( zHiyXVG5E2JPZ<0(#-|K^A>)M{kJPI*jF%YvTEl)>N1cp>X0 z`F|bbB?iBX@lu0-gz*Z4Kg4*#;NN0g%30$5Ipb}H|4)qf8~n9Jz8-Edcp2kc4Zf7| z?FMgReAM7KF}};-_b|T4;2&Uo!r-4_e9GWYFk`WxU_u zOBvr{@T(c$YVhkA-)`{R7#}tG2;;j9{!zyF82mGgPZ<0W#-|Ma9mWeepCtdEWxT}T zFEd_h@WLZ~eoFlnIY%*`F#IPozQ*9?jJFwl3FG|+U(NUygQpqaYVf-l-)``aF+OVW z2N>UF@W&Y6WAJY?K4I{^j87T-RmKZBUnSq>9Od(~#Na0~UTW|Kj8_=^V#X5&U&;6y zgRf=0&EUO^_bVLjUB1b^Md4`gw=@4%gTIII?FRoevaMY6$-rt;3IO<6m^A~bCNIqY} zc!|MNjF%exX2vTFei!2jgMX6oH3lDJyiMWIKhFC1D;)ZNlliwO9QaW3%V!YqrZ)ALn!Q+f?HTW9Fw;Q~d@lk`{#`rFS-^2JGg`*r3T#ge8 zM>)QS`KJtiKjVd5U!*>#Sx$+mto7fMp7O%!zk3EpgzHo}5o!A;wgHb@JxnQVg( z(C8#>uG5tAD410rtv?=&&-$!Ypau#hP-p_nF10HX_tA&Ci;*-J$6hAC{Nbwn`1@;+M z{B+?XiZ2j8?r@IlQ8_+LIGp2pvB*yDSf{pB5fh{0qV>75}dA8pU@C z_Z&|Bqq5%C>Tv4+l*o4|zE60M;%^8aP&{@zGJ_jZ{7m7)ik~lh#NpJlM)Vw4yjA#w z;se4b72hU&%HgcT_0_AIQ7{k@*Rrr z5Z zUm@Hcx2*kF3y;esPIa~e=5Aj z;mp5B^7kB0G$rz_4yXK9k?(Lg(aZ!ka6O8@BVll4K=Jd04>_Fq+x7Bchckaqkgu{d-vPsI0$^IGp;= zk#ffs|B&zr#Xlx|(&5yzO7fplyhV6a#&HQ`Dc>VJ?r`eUBl+9oALYq63$JnHna@_q z$8$L4za{dm4yXL6$agrL@(+uAkK)e?A5i=?;X{g_awal^8&-Ut@DatEgpWI%dfMk1 zCKNXhq9cA%@k&|WopLzqwNmnr%JHBCjQmr=`ix6HLk?#?6|&Actay#^5yh7ZA9pzO|1ZgZLh)CGPbxkmi9~Qy3A4-D z?G)ir8LzhgR|=0SUMIX#@vDT_D85Fxr}(YHTNNJ^-l6z6h1=s_393Om+$VfM$v+`{ zNb%={4=X+;e8k~wFS~v}?r@en{VZ(YCLB)rZPH$o4yXLPM1D%~YT;2i9+W_q@=e0y ziZ2shsrXI8YZSj-xTpBHgtscbLwJYcdxiHXJ}G=a@!tp^QhdhQs2tp|;tAm+iZ2vC zu6UF13B{KQpH#d{_>|%U!lN>7Xn(e&eSRVVKV7N(OaPnf@qes&H=ducu6jZBduywz zYA>u#B&rMyw$)Wt@4fKCM56YB_loG!lh!vhU0Pbgk^)x}`Jfq(Hf;AJ)`NY@_*0P+ zBh!!bufg-WZd!xaa^R1?>9xVW!}`oSSLX4ryODXzySl>vxa%nLM|e5)XRT3#0+%WX zE~O)amCUf^GYUrau>HS$-9Mu1iVaJQu=GSvtF4;P_31Y}U8| z$8XbF#HB;6JL7En1}i9got|O#W9{sJUxp=uHsUdedpfygguYk2{H>ytl{bm7(dApN z_mn&S|B4o?3H2*xA@UP+u_j!Gl8^RSj@%hEa_yr5+2ZKKG*2j3t z84M|-NDBXdoEh=_YmyV5zdE_k^Z&KUUy+<_Lg0}9bd#S>PI;MMReITty-3jLzuxG- z65BrTRa7Llealkp>SNnqifwP>@%<*Ykhy z@?G66qCn$d`jiMFmzl`NU%o5W|DQ-a*82?rwzGL&+RL7n^s=jy(WdN*WJMEv@uqA# zneZ}?R_RuLtMO?BpWNM#I}0$z&%o*x)Ej{$hQ=e zKR=M~6Z!j@%g#gCJVc+#)K*pM0*m!O{l<|af#^#GqWd2}L~M2ndcG@HF7-UHA<(~n z@8xwPUqBi(Uu<(9JZO~Zb%Uvr+CANCrR`7ME*XP<8)Pscv^V0RJwT)iu2pKs*kjeWFyU>`^R9>^c~a%?trXEm-#PO?89^8DA> zAK3@vUjM6}|8%-5S0B^;V%vLz&iFgjd9-fuqMF*LVuPPXE`zfwng&;v47|h3-rb9E zlmCm@_B&|(+hG{>*T;us3*X zNp5Itb7~?=nnamVDhExXW)xigv0W?YS^L(Fe6mol_Y~;GMAf56F~`2dvkh-xOx%2P zqU*d5c3p7Z2k~C!f4uI-ZhU9Tyj2-*xC_1(K`~?;IcB=xy+(!UatFZn%=9bDt2UPomTj6=`iyxu3GOc;svbYOac(XtugH{^UTLB`u=QpJ zTSO)B>%@=l05{DW$}-a$%M+VQOaBF;^|+S25cqS9gB#+euDoJHX?=M-Q}*HVMCoNG zmB%kFuc#}JE}Ge19!FvDQtU0hAH|tNtu1^PiW{sBpJDx}UyYK0>NKx&dO^s}BlFM0 z7>JEL7G{GH&ebs7j&gCizNwJYFM}*6Fjju9aJF!LHf}AJDP%R~T#I@Bq3Nro{Q20s z&X#ZIOg7Hy&$`g1@S|U+e@qmW+Y^uooK0u-J-_|EHk3r! za;+rmM|RXKNv1*LR#5h~{uXz@Q>>^;d46`O2(tY-FSP0HTrq5}YX2{}PSV?**1xFk z5FTY=a6^*dZSeEfl`cPQuG%UMH;Oc_)8)HyuAg$pKUdYgILNW++!ImZb5%W>Z9ca4 zLD+7~Ov~6%eqZc;Cu~ReJtgMY495Pij}6Qz6~Y&RGoMj0=s3c3pTLiNi*(2XhDIWH zU|%f%FNu7wn9dxtnZ`LM@s%jSJ5}8`m*(Hi6}(lK??d4y*3C;4BTMkQG`tw4{yOuW z;3BVN)yY{1U$pyXMXb4YO?zkX*-Z02TXPByzDBFFn;~{#pLJXFRN*uayQqC%%EA!& zMIrLb9C`PO=X!^`<#syxun*XBH#zdmrv^W|J00%k^Tm*Sz7rxpSNegr!~2D6JA5=m z{`wGkdriw|K5}mBb-MH?&D(@)eYzZZw_P4_xSRjskbGv!!Ib5?`6LjgBj?XLPdt{} z@sw8Fjwd@lth^mJc;6r19o=a!VH3x?hOMriUsGf5RK4|USo@4ARZAKDQg}zuNw_@o z`j5o=z6<1yZM6Tegf}HM-ByBtCjod{^4_I+Z%5wSnfLbOy}fzwK;CODgM5ebv^DSD zmiKNI@7Ts+`p{M{?^?M9bNdMdz5dbkGzoLKc-da6w2Se3ipNuX6F*)&o?4jr3Urqu z`BNXn^V-Az_0DFfG)cSiD!{pBus&#iy< zjwu+bAe99A8DVqsvUiwv%-(C7EBhcL19kjIJiq@Cg28=>{=MC|ANWjOKdKfe$qT`_ z=fC1*zaM1s5VI6Tdrlu~h@21I(c__Pl*(2>SzdA0Lyzp;L7E+t`7}2@>18tvXH!vh zu$^9Z2ZcLZ#XyT@XEXCW69N>f6Xg*N*?lZI-_W~NN4hx18x$NGMa`$C>S zX4qiMjQgUn^G+Ju-}CVAW*`3T{kP)?;*a_D$&+n5&!3iz_1%YrFk{Y0*-N6?rsT;@ z{u^F)RuavQ!_GMJInomM+SAFCz3fFve^-zPyvBp{vJYBd|E;VZ?tox z{~OcPK~Kp13S-Uo@tlFthw5nDgQl5tEi5e=v|xql`)olpBN~(~h_<{rS%slcV~(e8 z`yn&cglv?rc-bs3`e5%UcNm~SJHy_&@nM=9?QP>uttD8m-$74{#P6QC!77pn*D!IpW$U6+Jnr@ ztn68o9+|SlJt0A!x$a+><8ngtGc03&gU!bs*kdLy=n~og zV{?E=@eD4jW_x;{m=99)WgP`nlk0Kxo2ln*az3k_QK{z{#_1{G*y$f?6&R=7F zn*zuRAarXGGU}z%w*RC*UND`+OzSGlZ{2yR1Ty9D=Z=kv6qB$9?o|2-nN6p5rk(;q-& zt3s3@@qp|>PEIfB3P?JZjqg}FjjsI6o(h)6PVOJ)VPPG zKh=E0u0I9GUs;UGtu4~Tfu5KaX+8H}j$v%?L$n|FN>cb*QU%JgYe{B~jW8KUE1f)Q zXc+aPb6IPE3fOAJW+B`w%=~o>@6Z1TmWIgfJr~W{YIK^92RL}10{L7n`RohfQz5(p z-GDC6jpRc+R0=nGEiP}#lx-+oh4rsRxZ%WjPvW0py5xw#3vwd>C8wHs6*nP z=f3&2(#(vj%Ud>=4Nlv1!iMRk83;Daq}&#fGxs2yH=RJa)NQ4dgdD#vaLG*SW)9}q zS5qFVYnjrr_mrT{jQgSFq2rkUA&GmPd$T@xWo~_NkI^C$NgyhY-cR>)Zkjht%bd_W zSh@+7s_KN)#YWeQMCK=yao7A>O8>1q4uEyOdPLdx-u{I0My^iQ2Fre5l3N_SWM=7Y z2n5T64KwR=evkL`{SGy(Dc&GAO%}EgLN?orC=@=akyHkA9n zTifFkcSpOjThq-_$c;t_8d45e#-A7gtPo2_)R`yILmpLmpq~P zO5rKt=DY{?8T^WM>930XQYF7jc(3C7g>MyZ`(Xs(V)>VYQ_oQ)KUerZ#Z$sdm zZTQ?>jv%mh^-)P}K{>IbB+M7RZsKDF%hrTTwJ&d5wsw_MYO%ubkUl)V#!l*aebE?(TW{JIU(?A<@Qr9>gfBxgS@5M_^Re)@Rf|QK5v%Z_ zw6*wtqqX{)WnK8{J07NJ#|Oeq(kuB5w42&4Zo>yO+ZHot>VvP_;M1xR*nrP3UUJ!0 zEq}KpKshbD^9uLmz0$h)6sb+M#(YE4)Em{l?gk^9(@Uxss#l%pl`B>fumBp*aCBUw zE|fQWM!3B>2l0(J)0?$X+i%3n^?j;u&)Wi%ud}x~=38FrQ&(CnY+i$wyFjnwv#TuMf=rkV;;r7`O z%5&;ypV4^Ak$3rvAw0$m;B-Fkb2!iGHvdkCzsuo$4*zS1f7#)DF4E@n-wr?B;qS!p zj*ihTx8DvSKLbCT&!-)E&b2Im#^G}u{<6c*bogr_JSvlYmiul;{;wSF*7sD0Cms2B zJKQaIrNhs1wST3*mY`rEO`MC~%-Qli%PL%UDugk;>UnKX=EaqQ{pUuBUgvifv z_zH)+^&^YajXj?6Ep|5;8xS2z_z~EIo!3I z{T79`+a^cewcFPn?%M4Mhr4#$>u}d@heLRoT;i}^y!NpA$3pn2A$)EKzaWHvD1b0gNB%-b|9c(o z)@yeN-{gVt^jIov(3?RB_&UVGl*?)bIuYG?ino&0B&BLGM4 z)@wlszcPfc3*q+N&pQA6LgarG!e0*I6?`BQj``Q(XYKZ3;p|3o=!Gv5x!RF`AHr6C zmBZcf-sSLlj{N!%o(&16dx7-y5jqU&yu~Z zmo*0eN=IjTf*!ag#Ycs&R@~l)`JCeRe#HZd+xrg_irf1Pzfs)YXE;sDw|d(91}Vku zeSi+d?e#t$!B4MkzxFLZQ(SvNt$Ct2aUB1P9SKZmwkg^E<-hMo-**peV+>TVnN|>r zMCKyQ)4yCI(=1{CA)UTL^ zHjj$|GeW|rqVh4v#s8Wqul?iah@C8?UDZhTK18| literal 0 HcmV?d00001 diff --git a/hdssd/external/linux/sqlite-3.22.0/libsqlite3.a b/hdssd/external/linux/sqlite-3.22.0/libsqlite3.a new file mode 100644 index 0000000000000000000000000000000000000000..11e10e2dbbf8f44442b5efcb0832b7e41064193f GIT binary patch literal 4805660 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´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%0AC>NJzi2z$9kt5KRgar`1k{nCpWvF%!9Oe&X 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

      CSp8!KHYv!yNVF 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%0D6!qoG}HaS z%o^PWY3A10mE7EFyeBZh(-s+6Hx$;rVh5Q%;vqB~6u5z$;UK8EW3T5z@jMKwDHp9y z<*s36?R*gl-)|U)OcRVs4y%RWtid2sRgp>>sA1JT^A;%$lB2)nc7MCNtc ztzv8OYIU4#&EQ1%#oTJKwd7|c_r<$j_El~iZ~I2$Q09-L(iezAG$rSq4eDM}D~8@M z{qPA(P90I@M~~8jvaTZs>x%0w_mHc19rbdaVmrVr*1J0~=9A>4_cO18o2|6R*!;H` zoegx-7Lsd+a}AxK$hVuMRwccoUa1mf@1+Kldxi41Z0JSWXnr*P0 z?QG2-_f6y{)C|@e{mOjMn4X;Z;P~`0nGa4(A4N)!>PY&C1Q}Yg*E7kiqzJJ+yj5fJ z*F2v2q+-ESaW}8ATw(&=hf7Y-EZpuU_7gV?2g55a&-FR@Zv_4yqz?l2F$9*7oqEiN zgLii7J;nZV4+1%p;)4PBb!VmOO(aj zJ>$@Fe^Cwm&g>d?UW98CfT~LLrbHpb-7Gx+t>mOXgGW1`0gqTNleUD<7?~^atPl4V zc-8?rP!z_(Pr)3T3;#gylaJ6R9?#1T5zkMEP0{_vCw^N+IGXyEr6ra-5h_iIfD()L!isM2K z_-hBrN&(9$VzMJxO89=0cI{T76TZ$9Nb;0Acp>rvtI+m+|1R^X{w_DSx+%_VxE8U=d?*uTWe`@Pu7O?GA$;zY6DI z1v}dus?_3%3HAiXAh%d&^(7D2_BGo_Yl5#;{9W`L4gM9-FJqBtibOyTZr`$FlLc1) zli=pP8vTV>c(n&#s3x0eGWdA(|F*q@_iArLFiEGCfCNNNbmvRvu^|$iK3nb7gTXOe zio^xuXF)oceW625Rnz@+LyhBj34K`PcvZ*QxT++|cX_MZs*HC-AwWpMIWWTUs_pZ(?8^d#-=?=5=E)i+MFpIH|f{EuP$wNDdUUrqJAnEsudUCyufdPDdl zJUpY#>(ekh-HeljW$J_L7W6^Yps=At*Xz^HuO}{tNbtY(x7T&Wh;1lg;w`}S?pV<q7Ey6W6h!u?HfKbN>6;SqLe(U{pJ!snUy;`SO=QH>Zn*aPM! zjPou!H2uVGuV*j=mmmNoQ#ED9a1&v32^QLrN^SkNV=3Qz0;V>6AgTUfH zXU!v{-l~eJR<7#>hz;TO0nhaAMN?@%dkfdin=p}SRYR5@1(W+O<&ynF9wMCkp1^sW z%WUsR`u%cIM;$()4(C&Y@Z*N30o$O$pB7PYQZm21Ik+Ey@#tGK&?uu{=B!Y%`g* zM~Nq7*>X5Xb)|U>#(wp~-7V9#OhGZdDbAtS(`}St25WylYoAojU*`dn6JAdXIJvT+ zZVqQ~ja)3*?vHHPB2`UEQo|<(ZWR^K(iRg1Rf9XqEU6x4+c!Kl5gRxxiy8&{Vk&ob zZPMQXIZ7coiIPa#xXXT@8$4~6!Y&M@XCgL4XUn-^zMz4nu;a9{ie&!t5qCTf3slz_ zJNxuiP{od1Wi~|6{oVkpO~@d9!+!kp6ro6Sg=QdJ)(qWV7|IAcyb7Q_@_HT8GKUCx zy-VOFM7tQvRdwxy2O*a@640&}kbt4q@sad)7O~VpaIEudg0s$)p6(3OD6I|h_}RcI zQG%CMgKMyi)W@1HtM-otqfbOAP>UiM<9L0V&JkC&cZAw_QZ9H)MhBs+B5Dt5C!_QQDI z#VosxG(UT^W;*?;mWV~9V4-+%_NIc23`WZ5p?6ex4h*7+cd!`eR}ZZ{J$+nM{~jG3 z^9-j)h)c0H^XjLf&08?x)3Dus)^4A*Ig%4E^BD;n4X2FNI4{vX^-`~AHrS?+ea2|u zS;KAj4dv`B)3}1|5=Rz(ReFqEgp{J8i*umkf@Ba4|AXxmmrPb_2{seIq9}EXYqYx` z%yqPB<1n1k<6EYC%RWy$4NJGV>>RGZanrZkK0l(Oje7$*{S9P)Z`D|D)fz|fF6)|_ z-E6e4t7`C~;r%7MnT&rW)dS@l{_2cKn)4xlyV>16(s>Ve*~|V1=lS8ts>>=-5+f*v zFTP3t^XE9xVe1=XekS4?{sQ<-Sx%##dnqH@NY!QG3irz36fU88kUO(^x5BmocsWV2owb2{`wHcQ z{huFJwTset*_l*h+J{swS!*lYLT2X^E`R9OZP78e*eK@P5<$+E=Jli<$U)zPIhi$& zbII3Kx}Yn`HLp~_Q2TVOOsf6%a4bjiZTd(oVNOSn=vD5fLYSnRSj+HmxW1Tvq=YKZ zF4KTXPkg5)(I(OshAk=c&^`cHM0DSzWF(DrC#vIt20Vzqteldeb!TK@E{l7hZ!k3zdwHy(dX$6Sj6_wd(K26{oHyR1xmm^#&|9k38H`R z^oguWg5}(-BHcCJ_MC1%b$Dl)<2pMzqRX~US#Br1uf+6 z;3(W$G&-bg*!kcj4n6CZ11skgW_<@3sa=9cXB8fC1dT_a+Avj)<=Ws36Sd(*AhnFc zCE$!j7PPHKyNN@j@AG{Jf2H#hCHwLD*n5j!p)(QPPms<$BB4HEc4J}h<#Mm*@Gssv z($tCv`3tOI3z=8`TfdlmV+9tsA(gum1KSaRz{nDyXY0o_*_fYV?2n?WqlQiK(l6wsky-yxz!@86iKl5fm^~)pl6NN znlOaqXMgGmn&XR+UuvH#uO3Zt@yQPX{FHguu^Fl4q z*vmsZKvUrN!7lUEM|+&%8$Dqfpc_})9ApbgsHeWJO(>kk?xllNu%it3KL&a(7)xif(Q z$co|y%5&px7Gm1)<*0rcwFFiFq{9yt_E5fxC+guB??$^ZEv+b};^Q{9R<48-8|Ow6 ze$9v?ZXg5Gn|O=Ajvyg)Ls{PxJo(87yCFC&dcZs*>j#ftM+8G2QLg2$JYm=IeOC=V z;|u09_|IO1uXTeX@NGm*OQ~t_fr7l~CKS~3M<3q5a|`EWdRr^Q^XQ(FcR_Zmv#pSA zC&=7|ikE(b?J85EUpDyQlsgNv=TArKxV9;@h{Y3QKy*(8ydNpQ1V|m3UL=?uL)`!} z`~?^r)7p0MU_{~};R!|UC3HmDW@gRn=S<8#=j11h60^uUJf9M1CxZS5o!X@~1*Mvw zqPO+7Xbm=^7oEw1UOS1}Ea5+C-v@s2Gqi+7LPLYL=#v8x(Ymq_H#ehAc;*p_P2^zB z8zAn~;KosE)aV2KwZ(+|B^@yBkywTNcJ51@b||HFh3*O`e$KT|4nK{yHIcibQeB*z z7>HV9|HSvv=IuAV_V-#T<}t9iSYHA~3wS;p2PdDE~KeQi@N57Z@bdf`sG_Q&jI> z4LpBaU7H@WtZfQJo2 z!B*0zT5W#oltliP^GwvVn{gi25s7+`ia}F>byd477?^QlguGEBQa+XL{|&1&m1f_ttgtaj*-H zI0mdWaqNt9`9aUXc6$-`{5LB7`+p!^=TK~)I2^+*lz{&PjnBip44a3OdpaG< zeNHETu41{sTQk)}BRyU*hg(ascTsv;!k3*NCt@{kcPCSCi*e;$ZKl{XKgDwsM zGOakL%qzUx!aJ1v%`e;(CUeygAXb)~-f5i`6&$op7~}fOCO%i`q~=Z=>)p1mkdEEK z1}!iQezmU+E-3nlaGTTt0vwTPUc^EP|=QgOk|>!}yP$gX~f8 z2J|=g+cHx;0I%l`%@1t|X=1r{;sp}(K&qrv{^7b>9-<)vzDa+(Ccka6|RGpxXW0l`}7eUUsnJG z3-D#&4_bZ#Xfm_L!xgzMO6w()yJ?PY7ypy;UuRZCYL>n#xDqugO1uG5+zNUw7oICStx^#8vs+V`7xdfD$WeAXBi<~N}wewXr% zUi_OeFZP0*nODaW@#|+PFMgFy*_?^S69cPGb~e5=s~IQQKVAO?&Oeb?WsJA#%$Ce6 zW7AP7W2VQJOp);+TWI|aXWc%0uvYjm(!RaR%PwX-t^;q##7)G8weyqBzg@600W!Jm zN{$-A>mSKg$HlZNk#k9J4kSVRYHS0oaEu&Ml&?r(V<6DR%_7OcA>_i5&ol7Ad1r*% zb5Y?xc(da>#YN25?raIcl_)syokf(uOJ0`1O)x}ochTHTV$O?O=;X29X8JPn5Y) zf?w)%h{@{fpz<#x{dkWK1*ceXw^=(ki*wX5SNuqdYy9(Jy)kn#CsO1@jpuqEMnT zJpnUu*I`2&YrX8RhM!aF-?&3`aKxa@Tb8C8v6TzaFclXkTna<{Qr%n>Y>SahUA8O> zCX|x;Y?tj>+Pk!GU9}(E(X9DWdK@PbEyy*Z*+klymZ*Wfb#^pVgG%0jCWAOPPj|gL z6pxIWmFr4$k%4@14Z!^n0>cTrdS$lEzNg{FBek<~9kuC$j6k{QZeDiBv4SdGefLdq zKD*i|!LH&qn_TlITk5uoW{#(nwtqpeGhLH%Dx-yuXBI?0HW5CD+nh+C~%dQi? zd8_a`B~ym~C;YA|zydJfv7y*uF|<*Nu>@M(%}-g^*rCX=xK_)g&uL0r_TTV&{*#;H z-j$e_z~{cr+_w_>abpwBk6m|Ok~rpT-qoB2FH7kUO#2pf^ozG zk?&FSn(M1mJ?%|t5_U8U&8R5nFhKK~1?Q)FE^A8f(~&uo9Wt|)a!)VVPLM#1e_K$q zHNTavIrc4BYjjdOu6za-?3qA4RS87j!VAC!bttkgL8lYE0PFX3?M+V%EeMO`~( z9Q{wtd)SJem9Ka-nXj0c%Ga$+(xm2<*@_SoXbdRst$Mg_J&*dTt%hBsBTM+~x4L6i z5^G*(&dm!I`<3HtwZu~SII_k-3SQs^`w$Wme9)_9^0j&%_Uqxi)`8O+|Gb8IvaXt;`1ny>lKC{1()SVzN{!z)SLcAZk9VJkPy1-uRF1ITjm2vk}t%wV8jhZ$nUS~=3Qdm z=0_(mDax(jx`ZGNg*nui>qKr`ISe-CpjEElUXKihZfnlZVly7HFjr0N#=$NEeOhi_ z{JWd#q>-3mO29FEdZs@)7#`=XHP#1!XVzKt4oZT!oOb-j5@z?~vOBSJOJd9>k*|dv z{ss8DDM#pSh23&RY1jOjy2mQ$=67I5eRR4Fr$`TeeTKcBeOP;9(v}2s{{Z)dLzzL8 z)HA%ZHxZJxXEU<98eh@?ozjIUq{=mJF2Nhb+xm9q_43TexGVjBx0tCXZwlo)&^xxNyY~|{=nWix?BWUO>FQonLHJb7O)&$cK-nf?L-;1^cH7{gAYB1p495n&Tkf=% z5nv|E?mFj`4boJRbf`T8V0Cr@y1!>h1c>aMd^X2+J z4k5m+COGPH48htE8MFCB3pA8FCz8haTqPt(jiE+qY!l6cXZqD^yj#BtK9JzgjSJ35 z<09I+3$~xH7!PqD4WKkPaL3Dj`Z)*jxdp5NK8#y4mgEdAPGVsDk2hR*Fjc6T4!`08 zf?vu3!_IOK+_a51Y$aCjNDk~SNV?^KIN=@HDs;&!c@LuYcjubIW)$=<;SbA3_yBwa|nr)sw)o;&WI|p zLmNzk*RB%u(DW6c*4mkwksyrds=Gx7<=U5$#m?Y(Uh0K=T*c$y8@>gyX_Lr%HxESI zyY zptiH=EVhDSNXXN^vEL8f=CER&Kp4%PM||elby^#h>PIP}=_CItqQo2P7rKFN-fF?| zNmX#)QgsunY;LJ=1dium{9F>bBuBJopZ78R&eNl+5b_HHRaituM~bDIVgOXHuu6A6 z4aM{;zWF~+!lx$yb|4CS-FwcF!VvUaoKDTOwu-Jl z;Wj`Z)62Z;7a>mjZHZENdHxC>LUxKfhw|3Hn_?xl`G3>3wp|YXv5FeQWpS zN5@%K3_f>rVJ-l28dz9hf%86QsJQJhA)^@w7^&z(z5O(&F1H&&DfXK%vO?K>^?4!> z$~a5@QOi^5CPovgV9pBv3NEv~dNIAxOcMct5|C7GW*6Y4cO zk{C^(-NXq-weCyv`MO)I!JIl_#Pi|r%U>n@5eIU@$Nb=9~zHZ3DX3F5O! ziZOqHn78$K%|DLy&HQCMoAj;!bbf{}TM2W7~+58IH zX_{sw>_=VqP?zlz@W{umMe2xsF1`|Z`?39j_NpQZ!G$EYzU3gaFgFLm9i{orQ2(Kg z<>@g)YxnVbeq2LmX4Nl!WfW+#^aK5ia*7@fZA32KaWJ>5yJ|Fwq1H&bM$&-+qF%*T zFP?yJR@bMH)&$%RkY|eFTD%qjDhZg7 zd4=`#x>|4bZFU7W-PGMuDZ@M(4HBL$%ig{B)8>(PpzApAbO=0x7 z-yRg9(wjvTSKF@7Iu@XGT?tgI>a)h8?;M^RIfhUgvg2-*%1>UGn-0hRh!cGr%d14~ zOxH~OQ5^3}qgivc@>ZV%iC$2P6*OA@8=C3|?6LA~;zR$!B~!#<&)~6{qFL-bINylv zeQ`G#=7Cic9kCt-{IayUl_j2&S3eb6#Qb~fw097ZwN@i?VgM&3`X*66_;2Gd+(VbQ z>qJ%|9lggYCWclY7^?N6N{XMuJNT~<0X8^>7zN%$*9-%E>v+H!qUAl6^i zq!t+e2YAkn%O<(M5+>khr96^o-=Wk?E+&JXCPRZV4A!Ba=u2W_koZ`E&c)rtG}FLxX4LLw`1)Ty<4B{HuQmqrgo zI2z<>=?RO<(iP+{k4A~9BcBhlHgbBa0LR-$nP^#n6QYFRBnWCjSD5HE zTE0RG#Sa7HMHOS^@1id-_FUv8c=Khk=Z!vkX`X9LmSdG=q|1#l&2x7BM4-S* zO5|@FEtVn|9rtwLPao&4ijK={L&%zrqsE)T+6GHp(^Gv63~yoib9|vd#MPXpP%$L$ zcWbtMZE*3qIK}ETl{gu7IyTzT@s>NiZ2xEFiQr}L)Gyu$T~w^~Drjl2?edn31m7g5 zs*bTlBn;l>mW#vr$BxAtnCQnU_1ZT$(zH5G+;8qWAi*4~>W^~1;j{u(&<-sCQ-vm( z?rNtpZlSz?dcLB2G>b_&4)5|-{fq)-!OyRUEnvn(ahaFh?1>tsZmC3Yw<*CJBv$^O zStAH^?_^ocP4L4;j$o|5-%)V&n2&`*g_-u>lUldszcf{@k)fGP)oEHhZmQsiqfT$< zChB-t*#E^u9sUn)qTXTW(Q&ckfoVVO5=K_@_}Dp^dR91CxGh2lj?};42R9%sx>w~Z zY=ky>nyfQE<0k7c{W4h#3zH>i*klE-p6&F(!UB!x1%87^ekaEQcO%=%PwgI-^DHx79qoW+)P=^?L3>c7U2hhStN}Tm%je zt*?@OBMx;rn_FV+46~?wt?BN&nJVmvzCx*0UH1{`Pa?IXy9GI{c21pmvGtjS3z_g^ z%mUz!hu{(1#)$#^G_4Pd2uILwrq@EnsXUVLs4`h$sp>8YiFOAx$=0nHx#CYYajQSx z^zta4`?LZXFZ&^nFnHLu!-<906r~*cb~ld)33g+&a8!KSXBS@!BV5@rJ=0SEN!Ocf zDT(~Urkypu7BO-k?cCDPLp(>}BeySJbGXCPoVtdgw>CKK7)?@FRq@jxfg7`q>`Hm5RF&_k^UBekGZ>ck;C|6l<;mhXrEngV_zjW%TIapUCq2Ws-1UwuqNCCb7 zWS&#W-Fz3GV4oEs`NUlNGv^#0Q2S_cQHX|r#`T>2F?@;V$$adPh6GD; zEN7vt!y6afLTDZO8GXeOae z9wRyeEBGEj!__En*_m9KvF-{kw2wKN&&Yo6+;RRE5G=E+{P3Zt-^y$}H25A=n?>2J zCPmatbA^LAJxc@^e-pb37q&}ec9o@1HpP@nF7MrTiM0UOZKq7+PBoJ+fxLk#3Y}L` z=v>(8pUJY?UT#hj8r|)RYh2RD%AK`+mj9MQzhn=iKKYBpNssBYzxF{t)}5kWT$5q+ zZ-vQ;%e5|k#%IOnFtzJU1{Tp^OnRPivZhI8ycXbbs)FvUq(HNCfAMa=_6=4*Vw*ha zVzv^;%YOhO>1BT^^Ai1hfG;JQ#?c`FpZ4%fUO0Qk-vXiAX+Pz=W2KSseM(1jT}ZBu zHsg-siVWb#C|3ry;;vhe=-Y*M;oBIcmgl3p!++vCfu#t85wKZ?q1)6UeRKIlfJx== zH65Ys!QOov$@o^8%HKa)2swCI$8z15@a$1O9)V|n1mCJx-kg4EXniI5upC{U7N5}d z7>OJnOA)Re*%*DK*b2dxeNvP=`oRAo?QP(zs;>O+Bm@YE-e^&y)e>!VXtg7>)Fwh} zF1djlNi+&5TI*n;lqyz~8;gPvyb0v=dXY}GQpdLG+YFttQ~lQ>S`7g;0b3QdDr&1} zwVq>q!IuJ}!t?#DeNJ+2urvSXdGh(dJ!hZ&y7t;@ueZH+mjAVDZR6MUlKvO(u_KA5 zisUGJ?O~;y`(p!2q9(VXjhYu@vTSj7)lt%>^?Mss7j!Y#A>rOzb0_~Bv*5o?6n8^W zG+JV~lN`5|Q+_KYilX}kj!UdRYtTIm0bI77@5;cRDZPC8*{C~uEzX2`|&pS9Ua-TW>#m$YyU`1oU`=WqX)p6d70xx ztWEc2DUo%Y#VWYijE*gC*%8d&R-WItGIS_XsXpX+)+E}4le1IP#c)DmhzPyzXHLRR z+EFTjk{Qt#brWxWz{f2V(tV^vU=nTr&NmIEli&1EQ}G}rVlMd;7vgXb&-I6sSB#~TP8d!o`z(L=CD16B%FG9dg_l6YpaaW6sPkY-NL-H z%fuTU^?3HBo3gLX>R6-Q!Kk0?GwOponxw^)%zn7vJ9|{FK{qo3?i)cfmV=sY%(n{M zO>lD zv|N;3fJCPisTx9+`k`O|K})YImCjhsST=ao%TvNB!V6->PMwcNn~(y;wPW9eKnd!{ zeJfmVW=HuVh5a8B^*IgC=k;VRfaAbx$(hkW2K+g^DdqkjPYiQRsmN5pxj1=SVH9?y zieJJ7TxiotT^vdC_h;F=d#9B13ShWlX}{mN0SO3@V&MmsKHQ(-4xxI^ihY=nke;|f zmytrIK9x%Rd`BW{_rHoV!)8RKe6LPbe7L^_d-wn}yJy{Kc1BEa>^_CaB&Vy!{F%A^!$X{n~Jty2?abZG{G~CwccQ zvNR-qvngWuf?sp4+nOE!ckBbgUqO-bXJF&T+T3D^(%A91`|0$Liuh)_nSN?N?LRPBbV&R_v&MmSXe_AsJD zvl9;A^l$hyqSy6SJ8n$yF{tno>zA4C~uYjz~(D9q|5*$2NwF%@b))ndgop(e7(Z!d=c2eNPazpO=8Cf?a%5i!FL z+dWrnjqm2jTIv1S&BGndf|9IN_lJtAt@ua-^3tQc#bxMiIXY^(C*6nwPTJ{|`rK^R z+XE<~W><^WU-J!-0mhEtzN_{^{E#<^5_*pjeC34Jy(1DU=jnaLrU$4w`zS}Sx?u2@ z_l@@60WjG;BOzA|oCEixy{B?#m)E>=?JHhy-(S^p=rq-`e(ml=4S^LBTJrp28V;U$ zdH?>k_4&D_n}VOBrOBVM-*bxB;1?`HGrCPH-iN&{w{TQ=02EVU&_pqbJYOE;#GBWU z7D5xGlP>D=qffL0Ou6(Z|7HT+1-)dEt*Mn^5F={wl+zQdD_(TPW|^6Mk~5PJSzMML z(pp|S%CrVTjwp`GZoiK?$2 zzjZ*{nY#p%GY6i+_W~k)j^q?cwr8~WSnk~Nnuo3pyk3Wt zEkSxtuMHZ__ULrJZJ5di%c)PXkR@5JfDSv)N0`^+*`!$3v)TPJpA!SWlkDkR?ye*Zq) zaMfmze@d8lp&X|i!UoSXy@~b6%s@yyEZy!n?*w{2Ts^mCJdaTC>T`2C<;@Qh)=bIr&5;2Ye!@6Tg5j zpzD0lbr@Y$geC5sE(;#z#Ue((z|ukOX~rv}@>*=2$gc%b6CSghny)%hMCNd7J3jZ{ zKlVWN7=ql(jJ4SRK~JHYY^A-UvPF285?OzSZYEA(?~s5G;1+A6RR-x-RTV!XnZQXp znPk4y_?1}&dd+9(Tkx~jH6QFh2LGl@UtXBIYQkChxhE8PJ7LSEtJO9zbpp{p?IGOd zodL=pN{BPKJT;;XyNPu*7AJk}ne)Z|jkOP84A0$kNS%j@59w(Y+j%;Jd$UM2VJI{W}sOgOQMAwsU09b}vq>|6Us(*+U`m z*qxt}=@pMr46g4qudL;_mftkLX@0S;Eo3gPq``%=_?^w~Y&(DBHP2@V3u`_~`gT^#>>-ove_ujwF8-vz1-4v>2etJ|H)n#mc+vQn{6Bu0pAa0H@gw zJ~ZGOnH!h+q&dEF3t{tN*_Vd3jGDK*cJ%%+iT3rht}RtUp~SA!xB!x>~9CyQzQP2}PyZEtN!X!8d#+R%ev;aYa=O?dfwh^-L3AKyn4o z`ZF)PTTQnv5o8w0PT+C+5aCBNX+oxMviEc8p;P{lsg)DwA0tWraERe0Y;SG3HIlvC|Dx_f0Bv% zeez%j2Bw;8`zi9Gx<0>wyX0{BZ#kq7-*~F9TU|2;5qQA4xVOB{EwvX}XD}7MM=&Qm zki6c^si6ohmon#+IW=F($q+l@OwTp(lM@?9a}D`}CI0KH_YqU?ugkZgqII;feE}Lv z(Ip|Ls-NXO6Ws(e{tf@%zG||sK0*bAwMmX|Dx1z_xAN{+_ebvIMuL6*-E@tfh}ML3 z!`)P;GX8B;m;I?r4ko1a z+9@2ZOgXBG!!oyRy5~gO&&rrDMJ-yz1KS}>+~K1sC3ht;B-ja0p(r#hI!JJ-<#x7r z{|zMjXg1AJk}aT<)>%eZjZR$OgbGC)q|iA+1EH|0G!oj*VU^M$X>Y?e`pWgA&c^Po zlT042!D9_^BPz-PXcnuanI6CUS9|5`EfPTOSeYVA`8Sy{O>iN&$|bZJz37J-r@{cb z?L>DDkv_&h*_fOKa&xSQ?z#I$4-faB!W&0*^yI3;2Nq6fBD!Vc`|6c#b42(ij*zmr z4Fpcw|Lz3D+fzwq_ti?mG}MC`BHHoBcL%S)YDN}GgaGjs{Z`34Lo{@a5o^;w`UTD> za79-i8#?{ex)!jse>m~@{MnkLFa^^>k$>|AgIp7kxr&0>FQ}_F^cJ>&rrO}U9QhM) zLPmFZ@MmQ2=nR~KdB|>c9ALBaa82wE$?P(s5x2j%1(svi&M9M$=NGwz1w<60dt-45xi`gzjgPbQcdojD2J3^^5R2onjQM@N{ zVR7cOgvTmV%#3*xPir|MxT}=@+;xT|o054okFu+h0P|4Ov)mWgjT(bS!v1%CT}>GJ zqfMNu0|asb@&9lx{vW!h_oDimhnHTT_6WJ-`r}GpU)4&%E{yu3UIKwt;!mFi7xp7C z7pJ>j=qL=e%^^s%KRD{oj;*0)=0VQ}@c7@@!~PP*1>)u}aHo5nf|>%@m(H#XN2 z7lj81`e;h(5^jtw-PxBm?%w8|J(l<2a6bQIPTn*b+7C2#$I<6z!qB73ojuApdH8w` z-Wwxy>`!PjD{GMO?q!*hn<9_WjEmhBXB>o8KqjaWs zn}EStkLDzo=Y5@Oc4z<&`x0$GWs6~_9RFP3QL?LmsHv)pa0t?_SaW|OuM@pZxaAml z)4iL7Pr6~pt`hs(Pi=9wAk@yZHCKy4^o-o7b<3`h1t3Mk_yy`xkz8gdUB>YIA;9O3 zj@`XQ#Y(sy9639&xXBI8} zf$KS4ZhM52Ing>yv=5`hcJv@S@*=_$AmX#GxH%$2^Muz~2j8!n#a_UZp%JZu(6T9g3uPvuY1PXrj4 zF=U2ETm<(=S(=`JTYs9Zy3FT;UU0+B4|D>|LC{dF_hI}SoIBBe3z=)%_P0C{5}}Qy zW92@6J`8~l%U7^kZHmt+Yh7B-*~Ip{0Ccc`QUm9cHE+Q`X#%{R!n0r!pS?|-ZV6!O znV`@!u%@{((Y8p+*%*@?w2|-+S*I(`fdcJjML96N&Dk@;aE~iWcz@$Dco2wWuhs7K z7{p~=ZKC}KrpC$0?QNPRaSX`~-vU6b%j&rliLGy;HcnBIO&QohmufSVtT8EIWyU(`}FFMI8j)0clTPAN2=bU%{UYQ$6k^Cz6#SKU+t^MG*7F##$037lakOZG-HlD&FS`z&nopwCbl_zw zNP6A2ZQu{^IbQw4nLBuxS5UHuu(?)mxaT#xvX1|thfz<)8big7&c&;o&S*)YJ&ROl zG-=9TIR>HAW*?Q}+h51#Cnhpda%Z=&u|#_A;1gCM)PUWkBRK|1TUzzpZ7Za1?)y&* z;PP|dF+$$^oc|jlE6(DEJV$PzxD6{Fkm5G6ehuT`N61ptG4t?fhp=JR(;d9DH~SA0 zbMS;Bzmyni1%R$YiN$(BcgK%6(3|}7o}9S&FQyE3Fq{SJPtH2 zo;lX|2sQrDb~O>|TV|O?(AelRt1)n!+nsDFXL5^D(8IQxSceLse4r9 zf9#I<7C+9p;Zf+Rh-+3Wf8=84kNgGTJz^W_qk#V=p2m$t)Jn z{@{LIY?u(gTv2c+X&m6JmW7!kZgY)es(?NmU}?~=cZXk?_W2!#Xit*MNvK(xidF@)=+ z0Uf~&nm0$`L$a@N?3V~4%UB}97@R0`BZ3~lkrD;T18oDJ$c59xnl{sQ=*~C`bT;~< zI0tlg!~vb%7zZh;OxAoQUG^_-1gMvSX|egb0aOja5Yh*vX$jJ}3Kscq0hmZGC;CFi zf1oRiNRMS7kj(ud)E?FZCi@gWKrZhzIL|Tr-)lKMYY!RQTaL5j^@lP*-4Mu zql5)QFIHBlv_*j_gsQLhHih`*&zwdzzhhcW_j?%RO#4VD?JH=J6Hb$5XhE7~l75SH zwv-Clpf|k)(^kulUZNd+J=U{`=MH|wi!=C$LImFhI8-Wpj`t?1E8CwuLq=5haRZs9 z;p^rnd^Fn0YZ9Un{0)Z#)b_zVdbuXMhm$6sVN(w-vEA%K972d%6U@CwOf`oDI08Le zR(TQ4z9W*Y%f4QeIjAAKj7yc;`bZ-aa@ekxR}@5Rwv-Uci9TGsOWR3Q6FiOiCcAeZ zMg&oiC(L&u^bW{fPIS;oRhW?K&4h%meL_3s@u&M8%S~1M3XOU{NlR>;Ic5BQ+l1gl z7ved!8O6T$cHfwW+&Q@Ljy`Q(`{RobN^?PB3h&y+HKoR}_m-q^B+8#lT(NCSpS+v? zfLNPh1?1LQL&V3Rj#flqq4PteE74!LA?q=C6kCx5@Q3Rb&a_`dL6GDf3P}UQu3`!@?23nEqXg;AK-&XX1y2pjuu6yK6a&oHu8?b#Q zyu+6ycTJg7Sui~I zwJ(U#<|;M$d&vFyzka4fg)gwe(ERgDSZg&c*1^hUUm+q7#C`vMVyj{)K+`#DEOc=P z#Z_#q>i7;7H=&AS02PV$Z;=@nj@sZGJdoAK22pB%eAz+ii7BqUZ$b|gCW4JK!xAFJ<7?lFOBbWY-8?QXlLGN8P#`$?oWgqypbUQ zX20UN4GTOZ+y zKTZ|Up~_&KWVBFD2Z04OBF06Bev|V9j|}cRJ+4$8)iC$i4dglWYHw*3jTHIIe?zYI zGfxgTTq5tOv+1sX)yKzEw5A&__Osj+Gw2S4>ovjKw)l#)k2F@z2u4^#wc>eqP|5&n z=qo&Z6wFrN3V@34Gk1QY|8B9W??#YmZNJ8I|xiQ@QMI~%j7qh26ZsV*+3sk0%TB|qn zZaavU&^QRV_ZNcehw%}{cN4Pib5O^rRW;i)*EHnMLjl-#IFr{#F$R&{T!{|wn3`uY zUxNw2!QqV>zvUbda3x>0ojjyj*Tyxo41be!De4r`_j$8WOKsMbL?h(pBPX)n2KrnJ zmd<$)EKKK9#9-|H^-c zW={0IT22eq*UZ%R=e&w#{ioW9(sbDnN-4@ zrBL_6G3A?!lNw=)3M;(Fn5bq1j%pa|qb7@YA=RWD29?70FnYah{{YE8WzNFod)XNn z&MwrgL31G!e_-ZP1^3JSO`SgJ1o-(mPe`-orJiOZn_5xxm!8t{qUC>9AUYL?QK=Oz z91Hfi+Xd3S^=UT(4V*}-HXi?SEoq^9I(v=yo$sQ>;FXBn2A^$HO{(D@`5W7+ZlHY2 z!30()r>BYbdxpY4a9_1*<=6Hs4pMNkf44t>4GwyMgjQ$i`}nP}e7Ey(FdWAQrSNBd z{Jh`mUgfT~hDR<8eHBphVQu(<$6Lck38~$&=g#mMV2{f;m+(`YZyv%d3-Zjv0#XEs zaSW;!R`yQvqou!*pL%3Kb;aA91kL@!YuScpRL$^kR5ie5w6nbhNhwDW%l*(VYct5- z=u|arRaz{5=L`E(Xk1qS84aMOmdK%vSm!7BhN>qn!2x^4}ye2Z%kM=K~5{|~9gT`dzA=@PRvJ=G5wpT3N z;Q$-GNmYQHMd$$KzX?F-*jzGJF?SubtG}$j2(1tw8WSs@gvpU(=+6(ss!2B0p7mR( zhV}C_*{+(&cA%1cSzwkpS}~r>>5Sk6 z-26#O#}ur#$I+NUQzt;Gi2HBEU@rM&ifk;dN3a&oC070mt*YlVQx#R`zy0Nbs$Qw* z8LlQm85p0ATPW0!8xvV*r<|4zq2`sdduFbaB$)E<$zE@0IBU>*(lOtJU^a+MAh9dzVOOZ;SU6t3E(~1>=T-_oi<6!R_RW@qUI5Al-RM z$y*H`L8cV7`o8Y_cJ4P`>!a!E?CY}{a%ZCK7^5(WC%|)8B0E`pM9yTjsyv~bu-L$z zWVl3m{vwen!Fh{LsmU1YUw3}U);y5;oNfyBUU0X>4fVHglm#7Xpaw|i zF2tcl{^l^XT;tZU8qiUJD+t!TODv42h_=qMqM{OHhmZwcdJ(PUK^D6d8?5aSF`0n* zc-$zJstrq3hrg5b>mTvVKG;W&p1k0Hu!spBIR77PKBhftJjDWrwrQs2k`ClLSh(le8_M@o@q_Gn26DQmK)PGxm z*>;_0XvlqsIGxxmH&Ki383!m6uc*j;DxFVO4&Y%0JRNd|!^Edrxbu$-9gjq~zzk{h zaNG5)blW#)CE9*Y#kz2Q0=+CpHG}5c7O}Gnv7Bco`ENqz1T9+(`u*+Hj`bc((o|?b zdNT=UFacqe0l)*^)ZO0AkmqK&sGPfLZme=s^NUbJ;iRetR;x>YH3jxm`+xhAtqlW~ z0y|+q9HRbVDE?GY%kb8YO$?#j!Uij*Y*?y!1{_F+TVPZ|jzo)KD#bf=k~`E47%JFB z&EC`2mhLUncSQ$Z$FKkFYIp0lT5ZomeOe*u%vFYYVb^>bn6m(9ajoA`(&K5HLrK{( ziio>2B*t7@hHF`yS+{Ew?O&h^DP{TnG4N=1EVq&*&SFX>uz|{&a_6B9csz5o#f@sp zor6B$anlD(4!tz`5U;MhNC$0A(8RV+-!wTesl|znk6>x5x>DA@3EVYL@&cK1s_`?G zLp|T-o0?yV6Z}6D_E(fw8#xIaQhmx_H|9h54ArR*40SPZ(5^AtFd99zT@I_Lq}Hmn z@0C{hV>%IN<&lRJWo5&;IuBvhMEhEl2hKJ^2ubsUNmK}HdR+@#mi`==|@xlA$wgkZ41aPujRRr%xNsY z*+d!|20NV2JDRFC&>}u_HyB!UkL<_5Mw17F?Feu*!)cG%J+AUYS2Ylrt>ttUb=kNR z%-TRFPq2#Uj=%gg@nz@DpvoE6DNXUwwgMQvN;pG8+MIp-ou3c;9xa_a$O`!}r+LB- za|`#T%qRN}HvN{aCwg9kiTTMp@@SyYeIV8TnHQLC3CfeU(Sk1G~n@xq#0EF|SwO2qbW@@Amf z#1QDf3=P%}saO|Ks{3DOv|1l%v)BTNOb~eoN_ey0s2e;vXG(&!0mXE`(#s;Ag#<9s zfYnLFicRq*N^4;yyuV_5aTyZrPxCyGseKEt^a%9>m}k12t}`j^KLV%aU_}3m{Ik9< zZkH^q`@2=W7#6=~3{28WYS280iE&`}&;ICrHZ1L8%F2zQ@KM1(@t?+T6vOtl|HN3L z6r&9s#@Rz=eze~Q{{q9O4a|a4r&k0;X}>toHG;n%&9H)}_^eTMlDDX3n4I1!0T6N& zp?KhqoS=bIC{s!50(Z_lk~K7vS^jfK;=u!K9&VhHW({Hd#Ca#v2zO?Jx*ub+ph=$~I9d<9D9oFt|GSK&VCwZa*UT z6mlDI3W_ZDFQW+kUCL+md%k|TL)0i)u~Lj?8EOPM=3RES6WKlJQyf`^Vg7MZ^RCDD zl0BJU#1U8|0EXb^X3j2u#Lb~@?|#b|?n#OWlFUypHm1R191oOnL8L8X)12of_oP0F z0O|HEtD?Po@klo*J*7jUX(&t-`Ybg~*3Xzq!!?Iy6Hg9_93Wf}Tm(ilYMajBP-GKU zh7rcDB@8iEY{EZ>#ex?o66RXmrHv_;>kx8- zj+QFOvk}LP_YBlfER9LfF0Wsztbs|Q|Z5~Z2 zHTxpAY79J5z1abzac(YGUm^4(u{!uBPpQPl#&CmmZlI0f7V9S93}6(2+yN;s8pRD{ zF+jFouXCqb2uVlCy{y%T@|F>J0QId7?NTPNLY8(5hImM) zs*cf=>!DH)nAp@Sgp6poF&9_|po&2BlR_VvTC?QkyBAj zep20X(Wy*XfCww!if#&)B3?hhul^)zZ*z~b_-`3_{A2j&KfR@2eQ+<=YbRT;E&5L8 z;I73gjqtq=a)jNp*7`q(geK8*rXqx(*S|>P@ia+{ukeZ zcbP$Ul`Rgw!;`c3;G!D#C#)s~I*#>Epe|}2Yc*4&KfzT_T?9Muhf%pG!q`UdML40b zkyaSdKo_Dg53zd3F*;Z4PyX9#brYgm|N9B+a#-u_*!B;s_1S}qi!9`e(@V&!L}B!i zAcPNyQ5<4ythx}%MO+es49<)FywhQz)P)DKP0d}C0js}%tQxGxPTt*e4Ty(DuAY!- zQ^$GrMNYtZFugoaTu}ZlE^~I$XtYnmN!L0@dUy=*m6jFQ!10ru}*9H7@qH? z6+Kt_85FIWh?Bt=+YEO5FJ6xa6Dn}&JBUqwy1$KtzSXJ=U(w%o*u--tcm8~T*h5n1 zAZ3dH)P|vWdneB)3mEqqFIg5`%#>QM{9jdlus@8qZHr5K#tZ$QC&7RlU_GG5G5uEZ zyasQ7x_D4hXWWq5%KuOj8`jBD{M9e6c2 zdJm!O1NzpBYqUYh&1O_p%k9A=t%L%2n0~b0dqh^~CnL?M_bwnAD=eFTHAZVo_$ad{OYJ9hcnn z2Ep3?PVAId2yv!h6=}>$1Qp%e#c>?=Br{}TXsU)3Fpc~DpVE(*l>q53W+g~@3pV2e z_rTZ~L=&rX{=_?t-o-+P_VGeUIt8yN{ULuA-5zczut09`nS})L*DTO)30A zYg-Oy7gd&mhQP|*{+`m;wg#s7k&am{rbM_N5c|r_p-%s z#n-TQ)Phy_XF7x_9kxL?=AD{0op)}Ec54%;fuBXHLsy2zRjoYlU~KyHFTO>an7F7) z-1W&xtP0>pB&x9%r7VxOL@H~iUI~4KTdgbrWV6)%06E|yo6sPi>bTV`80=`6C!8Z} z-xY?pY#H;34gI86g+keZMY+saca)=>M7Py0dx$+vJ|=fowNkeT%>uo*jQRAKdW?ZQc0TYe>c4{RN;g>snOp{=nncPCZ>O+lVFhC zIRNBaw{5%en4=c_0tGgx@MX`ruc`^n??it1Do(B0KRf)U&Ajm2Z2yb;25!w3S96V( z+V5{$Dt-rop+x8J1w1WLE}-((*zI5XXG$_VX;7SLOtfvJv;f{&(2W1Yv#w{|1<9^w zcj;TyP}KT4YUqG^T!EEgWgj<`OTx+uhB7ohl+V!xp~lW78lOCt-B3CO1O}mtp69b> zUP8jrsXwK=hOY5caq03o$`splwmp_yC%Z+;n7d?lMxx@G!tm0_NM~QGQmHrL(K`fA0KQ{W}H;70uuZ!tbJ-l^) z!wMB-5?$!Cw%>o`>JRo?Iinl4ju!hzQL7_(R@N+c$?SjIpw-odg=7lV*hb6#laN@r~3Xu{H*gI6z2vf z`vJDuwIGy0A%u0HXtSW-dM3FeOwOG*PI?B`4%>n_JtpH63}3@!oXxZdZu6};JKTI# z8QEu5uj*H#WpMV{a23DhzuzjlVl}_z|M8n9@kmT8zSOOS*?O6K2`?)iP+wz=l>cis zVZ$#hPzbcJ8=M+hNLMnl+lyKu_ME~VTd6c_UAGw?+aCuK*}Pho%dE`xZ@27(E}?kj z;GNhYowy=+^F3NL2xnlwp7C)V&)qiVQz zjWgpuqHohDxJ^zUJ0ywOpk`zjPRoIYk ztU@X4R5anh-%4zpGG&Ns5F<-|!U})RijesYSsU#qFbi6iU@mG$caw)x*CsYjos!O% zUUx=*RHxuv223MH%6l|T%iXk$?wQJA_sFq>cN?BI0)0fQdm`uRRW}ziOqtidb=jw) zMmX)sWt!c^y(J(JdjXfJY+3qN8VsnUA?Hy}{}63qw8wXwqDew1$2^ol?TzIZFBr^7 ziPgD7NaKo~jI&>M(z@^;RJA{JDu2?0_aIMi=}8sY#-_t9K(0e+a~@9T?+xqc(r0{K z(wqJ|v>|`tv5aC-ng4mB5=%DuEc0VvMi07dimXwqt1M|rx#1`#Q|@j|tRD{fyIrjr zf6+MSi6-x{2ClC=D}T(W2JRJ%YJFc(#fG5n%@9`5N zBkO|xDIvRj23{4IOKC`wZSU?zTYM#en2HrA6F=!rj_9s$V}834o6%+` z7on*?C!IT+!!IQS=1+8-qG{svMtyElR_Ne;iUgdpPn7(MCjq%Q3^Kyy+Qnp+)aNGr zR*_e{_o$KyuGzEn>15C3VoGt@*Vv?oK*Y7GQftUqrE?exYT5zLOR{T!#Lk^VACF+m zH6AX}_IH?z)+I4-4QNXSsM&({f5{cP2HI5aU%0sWIlS;`TDuLS)E|$>P`&=pu<)kf z2>Ro((;hS?q1YC^IX{y&^WV|U8X~v3?@P~1lfYX9N~=tJkj|>H$ZT7pQ?t1yUK#!3 zXGMFkbw}&Ye-!(Mme^;c5)tJ{;p1UOp0z+vR@bW!NoRk*&U(rZG{>8BQ(OE+HM<9#;lv@Ynb(qqBLF+s53<`}R)^sU)<6 z2;*d5dS@ewC-1>}4{qr~;-w3bMjvKl-9ZboIsMm_=6b)lBy*%Z-`L#U`F4Nv@ltM* zqFgtX>&2b*2L>u^zB=FKL5vtxZ_P{tvH}E_zr#;*-rrjJ-Q-EH?I|tMmee-*yW5)d zz1YHbLX`f%Y={V`ppJ{)$*;^tfWr*XqAdrov)|w6l)v-@8v45ggLH9=FvXq5qaekN z>gr$SvplFHnd5ZEQ5eO~4t}@=0e{$IdD5WAfqIgAis^%Wg+-NA2V<5WvVlI}3iQN|RJ-5u-y!jGk!TcnWml^Dlf^AR@PYxt;U5mZ z_T9?9oLIkjPWIIy+%80HqnU^X_1@&h+>!~wSv>RIxu`PNd$h?QkR4IuT(@*1Ry;JNf3s>M}YlXm_d-J_;bya-#?+JVpC*bueEf19+%Z zdd_pbrMGBb53VISS67|5>+IQVEybI?>D8jCKZm9USn4SPLHUQfejv9y$H(lFKaWLO z5t(YGl|=iA9KxkZO`YAnfL1Yvk5G9ni{L79_4_NjeLt9q;T4gqJea8%9$FYws z4z^o(*}^h?Po#2-s*`!$>(GO0IwbWeZ&5YF6|@sKZR%eYUvJyma*-&O)()hq+Bp*&&z;i0FEml2LG-|t*xE9QQ47yIsUe>(F5c$VRl`YZqYZv)bBTnL%r7fu zZK%e?#^xzRygY(zeZOKV>6MD=wOeYscETr>q)u~UL@x1<;+qh$m2~Z4A+!I| zF3joATEC~xZp_Vr`~3u4TB7a5gUL6Msc`+x94$GhT9M>4y4 zNWBd6;mvB%O3al2gN`p?dQ7iPc{roLCFHbz$gjN2zkrw&R=p8P?Z8vqMP$-F4 zsog@ojw*>@1RokA21Whbr8CI>zLRf7+>KLLNiQMO+Kf&(RgQw!8v<(<;ZwYwT>wcP zV-Czsa5mE#9hfm%V6mojo5w=V9&=dc@dnD`FQ~h4J+5BGNkWZj-V&+%=D?W!X91h8@9n@MO8 zx!^EGnD#zs!s#DEsQkhb5oKK>p?x&s3|fxw-+x+;4B;=PVj6igWnZS#z!cR|w5>DC zFiULTX5f0k8&ze-e}4{P2yHr9x@uuwcA56|;pC@n5i!vu0bdlGAN}?3^3JWH@0vA` zS$!O{{5X8JrK%~;92xdGMD)bZ_a(9)4%Jv3t46oABtauEQiZJ>{^W_#rtjJ-W*G?t zww}6qD7Ee1eZ2PT{TuT{m%?qqRIGftVy##^H@%h?R0nOjEkz6VR|jK^yot;jB=^0k z3o+JU?{MaQ5j#^fphWvP2oW_^kY66Tv-maP<&}M4XZ2X3*STPF$ zetdqnj*NaXIQTe>-fK@s*kL^aIDcWC&vb)U8y^I{hlI2b>kl z3_gg(2z|2Cvn~8Y3&ua1P8AeBk{mn8F}S>mNHO{Bp%ORjgm=C!Nr>dO_G!E+Z=yZP zQydV$!1>Ak`!G3+yy{lLXXYzT;(&v!Aa(eAD2Pi`ElMNt2UPPOeTuj!?Yo`43x{?p zoh?Kzni=*3g@HAMqD&b@9advCmzTi8G(rp3KKNRIjjr3j<~dtV;*^Ur$E#vBq=+Bu z_zmRKwed({m8K9w(ub=KHsXXCIMf z!4Nmn)M(a}CmgR^`Tc`MR4eCWzXbv(TMllQdid8Ka;y!-+UEQc28F@x3 z3YLowtQ@e`gs0+Z{o9ZUgCDsLI3mh)s_nlr^#inktd1)GZ?xc#e^XccSN>lp*NclI=ReQ-J{@8Krzss8(v=-Vu_+;bN*Y;Vnz z*Un4k4q+dC#rT@U#mV zyy$R@%znQFK#jul6P~Ei`wM4=gCFuHQaLbp7FbHq8>-wVvP$}4k-1js#}?Vvzk|9d zB|1l{g~=6<>Hjmu!gSbVeOf{m|41dr8q&4B{bD`)p|4EmfGoi!#xS}SY4&YA-UBQn z;x~4Xi^{ba#r!yj)mQxs2wX8R0^(Ful7XhJLto}2`>7hxUocWtIjskqfRcA_+vJb= zOb^<`)fG6^b&V!XBmFIX{(r0VpvhYQmN&!}!Zs(fd%^ZYsWe*t*ZyBF|KQKCK?5Sg zTmHF^yf0UCdagAj7p06?r@5}LgsEcfew_{bB6!y0EwA^Iud;KT*|kl&LAtD0ITl@x8D?xI8r z(HS5u4z3_yIG1W!v`IjJb3fbC1tQLMNLA+3PqJh;L_G!L(w^^cQLZL!UUaKd74sMD zgsBs|Uhi$g{X68@9fkf91tQNXn;N>h`aZFZaThCh5Igv#v6D_gN3Z5mHqt>Ay zAT$;O7=qsa^F9kkuHk7$GW=>FC(xpbC>_*QNque!KmR+WM8Y&~KRD!r{kDY2p|Sz{ ziAW;DZRNW#^F8_mEvc9GP!5vb-<@jGG&rjG>tv*?DU+NM$Dd3aH5bxbQHA9gf8RCd z%6jj48=^oJpY%oQ5`=F%H4(d0*r&&2{#?ulFZeGHfzW@3Zm66IJQ22>M!_J#m&BM9 z`Oj<2pI4qd7gEP*Wba{xf%+4XUpS4t;`Oo29*2<|y{TpJVHvD3QgEX6=%%Gm=Emcz zmyx%T;`INYSh4pp%6Z$C*CD~Aygj-E8J#KL*Ke7epHQ5hv+uN3de0m^>74H@OV4>f zv0hF*MZ{XoT#j|{Y3ZHrYCBzNUw#W-F0razkFVR~Lp-MQ(<{;wZ(1ljls8k~;l1)5 zO|<*v$N4YSaSegrFM(V9dRd}r(>$*P+pb0vv+X*2dA4WzXC7IxuN39e@;O9rX*G4q z^p^A5x---1#Hjf+bj^>{sl>`rbm+^% z{=_OdR7~Dq^`vTA6Tu?*G?g*VFTbflSvcV6#&w+-)n2LhJ(SV=PJWZEld5R?Yh{VH zWqeNOo%z-}%#`E6{F5`l#5-*+^i`Fly{}>6ddsikCg)%``#RbZ3@w#44w(}-q{nMK zw^nu10vx?Ce0a-6A(fHHAo?xb*P3XA7~ndB1BYDoYO|Z+&95j6!{+&Gc7T%d&{HPx zPLXxVm1z5DimJHNRpm{gkmJ!{a?4a}V&hp;WGZYNau&MzN8kOgCa*X*y&PGheNsIG z?@1n&-Nc~&8Jw|$cG>>M)C%7Gd&?iqR0OLi66pm=D zU8$1#3kZ4(39VaaHKg;?IP^Jvdpf_UJ67AbJDKf)ih?tv7RkrV_YZmAoWgu3M)?W= zQ#&YEk>!#hJ6GJAtbz_cnr)rUA^>j+s+V7Qyc=$wK`FYiGo8Dxn=(VL+hWV->67Yq zdUbnZof~mcVQJ51a8Y+S@age^d<{H_xAZm3%M1e?0JLaltls1VcUUf5Hg;srVFRZm zWBHC6lyAiUQ0K$r3+wy~ocG7o`O881erNfZLt`t%42VUZZ< z{^cHA?aD$2rtP#shN!BjtD>NE11=xpgk}w@pjzU=bS8qx@hUdZo`2t)uR=u zfHH+u_>}~4mM+e#W32t-$4!VrJ+;N9!R1z36FrTErdemx6ou6uDtgKgw>QeQJEV<_ zx~tjx**l2TYKxigufEvznAUKr986|MvRU;MeTSw;Hp+vtxxAm~LeCxj9+)}g4*yI< z3XK3RDIFU^=AXHK6X%@Fi3EjZ8THn3$HA_ZbPV;?ke=a{xMmRYP<|TZYI!kDcwUia zH?(wFa21k@8*qMF2dEB=A{~Sl*y+)LO$#m!1WR@rlTa65JL5U6V&L5r?;1W$5wIv0 zI!kIS@7zju4WuVoJksqvR*ue97L<{%OFD*A-%5oA<3orw8LX2PDgXP0MrI*}k?VA> zZcRFOD$I|YN-#Dw2r(EapGK|RhWQIL+W^7srn$w`HE6h#e{I8!HJoTGnIIf7@Z4$8 zjgR*y{oQuEDFemDChU!O^|+2?aU2YQ&F079VIc^vn%rMkXjtWz>{w5NU&`*0|Nblk z0RlmUz&RTUV+9i82s<^*9CHjtyVjO$?{e;KRx0diE;m~>dA);R@Ri#P28swdu%Pg7 z{0CD$=HL3e9S4saVREeh!Y#U$GBOo2WZ^=`*@MC2=ERm~Ay{58utXyvga73LKsjfG zH20>)`Wh_7+UI5*NTBD5;aM>bqw%a~|KqGr;g1^6dZJ~mD+{@fy6uou3{G`Btf_)l z{%ugvKJ2vQW=3k$!Sn8g;v%oLz@xdAkM7-TP6zk74B{(x2Dj@aVkLeae(9~-?&h;@ zM{oma_?MQDsa(VL>dJy8q*3NLUW3c+d1tMj=Y)Bc=RBTs*)%A?st2vyYM6Gru@Cv* z8g6J3;WjIB*$VRURBqb{4{Qo`+XvukTS)tF;Ay6{#$YB#qO~Ur8?z4AtRCLx8|Gyz z`3WAe7|V6tZjI#~L!D+t@1)CWZ%AGFNp;;M?6HJ`{rY=n74GdTtTLfdewtXhZua+e zNi)6=^w$3>HO0CaOpBH3XPFKtb;6)hhsR3ww}sL;*3dh<3mbaL>?*E%{S6fs**K`k zZw87uZiVa$fEsNg{^~&mmJJjrV7Pjw6yo!_QN9AkrgKoPapd|3e84xpTFBQ7Rn}=c zK_E9YVNXHbcd{3Q)a~84Ky$BLg2)W<7`~?927nk4VEtsBm<>qoHT42}gvC8~~u8KHw6&%xF1(PMr8Ds7L$9X#|eFx$7S7pbhY!b2Zt+ZQ9e;kQf}HgNvI02?xWlCK6< zmJXxW1GPlk!LX##QmHBg>V01n$Zm98&>Wmlxbg~r>P0n`W#OC@SJJ^D{uj$oYJuV>KeQIiC+X#Lj{Kppt9*D|+2{Z3+|ZUli66%NyJ? zDC3}JPf`)hx|)uf{F}mGE-7e|$lnVG)nrZf>3kq%<4sPrjG6+?@^=cyd5;RX2DkS& z*g|5whM`tN-Ok2*oo|5u5%`#`CXUc=#sc#EG>7X3!vQvQ`Z`hb0+o(GP0g85Ll*~2 z7`IYugH9QG&6P$r2chqq7*k?AXLd<9lm0DJjz_F7qqO5r@+dCYODtY?#OR?UiVyEZ zs{(a`Erqx++=vea&~Xb1@c0vzkYCaX!i)ou;?)h0Rnq2P=Wx3y(Z{r$D!LXx;FP?N_10#+}(&TWnDMW!r(%uxI$!*TqC&=WyioW zOXt3VDPEO`B3{Wu>uKL0zP?qvu%f5v3nGlOW4(CuR59>Mi`CLwTS41J!Fb9cR!9jk zeY;(oG`K%MnQV{(Eu{4MnEupoCx+|}>d#9&Sbv^T3L!IkiV$K8`*YF%)SsVHj{Zbg zxV7sGg_Ce-*qhi`g3BnwB;dI-9YgEj{=a}kFnFdXs(1Nm8x+aY?cBL(Thywz-l%f)bl0VMB4@}*6sdf z`WO-Tct_tOpfnxb{xKc>mUT4TWO9>TM_=YTsHmgcdA6Rw^_9i9L;uIF);LlJ|4DAQ zjvOWqp2VXa$O;&ptE>gdSc_OBg)8qC{7Wp&i2cn#PFUFNKd!d_5#jyCiH;-%$5_p# z_@#Ce0{5(#Ch4R#D6((JDEVn@0=qItm~uCrE6E)(ag8WO;)WAGO>^u9jrpV_nOu%M zSRe93q913MY)5HYhy;nY(^Xo*E`GpOH4&2=s@JNhe_&;cu{irjEN*mbwrPn0fwUOw z>wk%57Q?P!s#OP=BsCRG$iei5I^sKPa1^;2IiuW$`d~X~*nZp?HBRIf`nK1ut*R?) zt^RbP{b$EA>h;aVyRM^qcu2Kt+y#=_s99Ayg(xO*M#*o=U-xN|fcMl@G?4S*S4v7a1LEYn^Lr;sI?v zD*XrpbQ_@S*!F?UnxxypED{l-84dfc`jo{pElUBh*kot+{V~Mk?q}!R>I}aO)t5nB z&c$-ofY@u6W4$N@&oLj<o1Ndt4D#422PwvPh!wy1`X%ez36W>#S;{k*wjtxqqQJ(Ss18*-AuwP@Jo~N-(mi zl?}=3F`Tu{+CM0(*=O4x48xLG`{~?o4Sa*3F~&M!kc|Un3;qJ(NDmn0>$qU3-~GJ_ zyVB!dcU>V7yUuEH%BKH|X@f--wHvhMEm}8#EdIC^8mg&~*-9Ylu}-97VI6#T+f%ZgC7aa?@}*AcgG?}S&4K{nBLIfcYJeUsl@ zIk&pVQl6i27>7?^D(z@2DG!?Zt38lWxT3$}?!grw5mtQ2Kdkt@9k$RR7HD-|)k~zZ zde(iB0NWir?7m3dS=3v%$A*1(tZ2w$>_uqAVpDX!6)2#OCk_-?1Rt&7JN;Ua&sz3^3ElmI30pRrKAyu}2ik-+ zFg|&v|Jcj?4HCE3t5CkKf}3YdWb3UhH!S$ErT^9}LH!nvh*Bro?$8o6R@TMVp*gtW zkQ0>*4oAP1iX=Mcjv&4lN~BNXxH1`EtmVV|PQ@R@+mcV~*4sj@$ehPyZrk({YLZt` zlk5el*3UR1)iGmOs^#IHDJg1nHKV~X43!!O8eAx1>(HN#!*n?etY4S2KIY#PZLRpP zNdvB$JFU+lDG?bab#j?_NQIF}d)RQ>W{P5mrV_7EdY}Ki!$s7f>rhZY1O}+HCNr!N ziMM}Nts7%9~D+dHR=7DCuf6lbm{xENm3(%gzM=6^={WK*W$Fz1fj_&ShX89 ziyZIKdi5T2P=67qKa?&;NLe^vx~bsCzqm0)W64kJ-y+t~eE0v*{P}9$4J#t1+T;A> zlEMvTyqbtsZIx>eWg}A8k-X&O9<%yjp6Dm^L8Rr<#}{@qmZyTU)BK$>j(K&JF=z%0EPtWA5}ap=MxW7l-BM7I z{}6GL{}-lp_ZsatF^v+-#c`y06_!5Vuz^eCPIjw1KEuKG=L8-Yv;!I!J-FpYRUU10 zR1v&y!zv(1H>rwzU1!)%#9~AIgiZZu?EjjwcrpQ%cn_Gl_B0+!@NV7x3L~lbT(2Wj z`I#)U;dZ?LL^U^OybPxObsIZmZUNjlHZ+}YJcRN%V@WaK51phy0pgNi{^k!X%wGSi zS8I5MlAXzPo1dkP2;F|C7uj*uqev|rC%c8TM0{v(c(Uvg2l0ZPe4bS&Td;z;tArM)Tn+u^wt^LqDS;(dk2ZgqV_m9NBslBq!Pj;LQUWA)U`{NDX+3C#i z6<;5}%Zd~w={lUYwM#k7Ljx1( zO=yg1m^}apM3342*D!}fHVu81XwknCC4DcYc20V2V@xA}+Mfh6{v=N;jil|CV2^(e zALSRkBlhe^&(^C#->v7a)G;V0T>*z`|DNLt$>!dtp><}}D|6lwHckD@#((J0LG~~5 zBg`AK(8aUVBk>tydx{q1BJ|}0y0y45xNt&;#U}KtyP43)0un>pOd?{|SA5gv%;say zp}6qWmJvlDnuoA$jPtfik8!`*&vp~8tINp+N^#n)6vX8W9ot`fW z_Wj9b1`p(-;2nG3DgM>2n5KH22@Relohp0l{#>-bsA$s;o397^6G_95V|(yhD{jpx zt4emd8ui>;_nsx?t=y>H+df^l^B~vHYb;l#ef~Dj;bL9mW)VgF`Ib12TRW!=0N-t7 z{f5|3jKwQ-Uby=FpIu>;F*c=%wnMBcp}dsG(xTpW7g!`qz{h&Xjc3zMY>aG{S3*Br zL$X88*&=$E#tj*n`w+Hl?W6Z`=|s4N+LlQZ+ErtnNas||Ih;#IC`lbs-g0!X_z54E8;)cEg=~0N(zPcM6xs{p8c~u&$UD`2XwbsQE-8vVV)3saO_} zT`YV@qhdX|`qaYwHP&O)9@d+c{Qx}rgI>JmJGZk9~<*#;a0w|R^VCv*{>EAf0OzHp9#@s>q|Fli;k$5K^ zpqHHQB>m*V;2yp-dUGm+JHjmH10^5m;3uSnp5rIgt?}yC2KjhOH@2x@iAo_lhaz(% zK?ifJHZ4`B(b{P9%Dr@oIT!iTMO@jbWL8YJi7TbwO61>wy5;Kj&=alLwFPsKUs&P~ z(=v6jf%^{~yz?lXoxaBaC~sI%2MVelXV@m@To3z}8NmJbY@s_o{s6o8#@Z>|GUmue zV)avx2y||L=CW*}K6R=?xibhNUTj;_T5@nMh6rZku&*T6Ka*I$UQO4Y_FMgAP6@6e zhn*wPWGd!aVm$%sIg$HzVb(-@BRPqz@pOp5n-4HYSpTCF9R95p!ac@10H_{+_bKle zY=uu#XLd>X&_vsDY!BhSBW$zEC9h~b6xcjcRGf zzK1n6Fo&(Rxc{>UfNdq=8GztLJ|cIB0-=--m;9ogPP!RrSnSb>muNxL>zkJ-0_bnsGXC+ zhNm5*Zr~qb+UmC%E%#HL6fRsK?T`IYz@jSu=`9Ctt-s}KC}JBMZD-RFK>fYFg;V)m zGDafTGM*73jnBB!s%Hw|^^7etMCmH*aXNQcWSi_6mh!ih?1gIzlBK{N7?d6*YOg6%c$Kj|5@j zngvD7yq&l4Tf=Hcc+ZBDzdLc`CWY2`gV?<0;i>RS$q_3bAba+M;>@QSxX!~7x^pT) z#Lt(tUUO(sW;j{4kVT8rI;LnSG+#OKU&bz7+oXUcgiTftnuvswSReL~<5@=YAUf)g zO$8qQF|_*Kph@}rL*d+p+}G)nc-5jaaX!W8*5%yDJ2JbNtG(LZ)j>Kfm+UnaSU~UM zbMNE|TVDTVHA#?M@dOFQ!7Y{``Q16{;`p2U#!-qYr#}7MqogxA|cl3Obijyxe=1sI?2Jgx~+l(ECO4M zz?xV;1*P8ZG^gMc`)~?fuqD75#Z}vQNkWQ~iXxQq>^&sOoDH63Lq! zm&jjdO@W^WP-uTRhu&j749>HxPH*gme#v#M=maZKUIsPxm0QO?wyxhFR#?|TQL`dV z{l=+Rz8S`hu61Dl*Ed4K*qiH2 z_b>n=D!o^AtWD=ft6-6T(|;JiOlOXupcCKC1u(l@BSLN8b|??YfqpcoANN{y^d#xk zgd~eJ>j*KG4xFN-H)=(Cj?;f8y`?Kk8}g|YWgZmAVL4=4fVK*}hnys%ZfdEdb;?Cw zdP>U(n56@n)=^VwS-*`CG`n~oMu*3W}Z09WfAk(zzQB{Hk~`oRZ@E>K-Z9BkOsz? zQGmDg<$bMxEb)@1_#nawgkGcrl^nHe_fy%PFZvg<(LhMn#i|H4JV?JIEl~ez)+&$| z$y{eN2s;7`f9Dv;PctG1!#GTtJL_Qsn%N*HwYT&b8+gd3OUr}bIPLiM;ANBRLaDdk zjIyjOI9Yump#$IaEgo zP8fS{Ri$L74G*YI+peWpH@DRZpLB4F%~$ZI6s&{tjdJ<6$Maoo+Fw)IIs6P)YiuaF z4O+$ikI}soW0qB)*tjz`C5iUe>6jrVl-kyRNU66#eLsdC1bt{jCI3aR)5aezYOw%B z#o;PWiGGcFT-h{;SZ}=1Rm6z9gWE&Ye-7F5a1DN7WKYdujOVGsf{=9=_{&oIOX&UOa4?Yl$Gn z1O4(7TwosSLXfy$gVbV?#}^dQVTmM0mPmp2*8jv|1v`THg4sdxH7bZ1EVD~?u>IF- z4aRHCF4;-4EzRtbG9FK{RVuHD0gGR-0>=WOACQD~inNE~{%=0Gu;1rdP8(v}TB4oj z&xAZl&%rN35U}mcZU*F&d5EvrEHL@IIAAz<)s{q+4yG2>{*kmFN65Lh+Gt=Z`6>~_eyJe6RXQf zP0!gjal-eAqn=NF&ne~i!as*q1lK`NLmti%fjDHV{rg5LR@BybmlNhpXVVa$gHJHB zIPN^r9rkyiLjTcw0jn@Ql7sstphR1m4Zv>gk_<5AKG74$T*oSHy_##(+wWi#Hr_Y8 zY-v%;LFw$W*>Gb2W~q+CZE(1r$la_bm1-#^w%>fQ=Icn2lM^O^PG#edM=dh_NzN6L z2QTxVLW}ByHD*G}6EC%&yEM@zVSB{)AK-tu5alS&RHlj59})mgzVVu>E^A#3Pd;qK z_qSLjk(S@FdV^^~E?GH#Yx{YNBmRMiX}Q$63X=y2oSDj{OH;Wbf095L9)*oVX2b7j zqo`#}E~_DP8Svra9-7HpHy^ug1-ERLln}w!4b@`0b&`>OI@3)^XeOR9HgSEatlj`Z zpc0%S;KV>?>yX8%IwsyBK{=7Pdr_QB5;7OLm1B*pmR19j+01fdk}3q1oN?W=K&r8=<;zkR=y`;CuAczxww?NOrSn<5G9a;uw1txq4Tq zlltS-eheii-2*&hV-#*`+_AC7s_MJgrY&M|x@^cpR;^LBOuh<|yB0d0E@#5%Ax&dS zk2UxQ8XVl)idYl27@3q#>YBLbdj4OUOXnce3(FgG9U7YiOGyXFlMzB&)XdP2B2;!Y zdJhN2M21M2n_13HZyUZv!GYf7zBW3YJF7B1XR{j@5fN!$TS|Jqzv5@wpX$p}`8s~x zl%~8MV;Iv!t3O+y3)8saTyXpTst|AmbOl-?Fh_Uds(EksUqORn`A=+X@P zkj~z1i!5_+_UZ{mEyH^it3g9Ukc}D`m^HumBtf2UF$&N-rQ-jg>|Nlas;<8O2?-Do zJyEH~OEuO}gQ5nDZ35WNzyxMsqN#w=ib@S4k7A87qbRq*nNd!UgS6FFt!=TjeelxS zM=f4ZNVp_m`&31(w<>t4oMS{#Yq$w{zrTIXB*C`-_xyytALk3$z^BVK48DuLFWcIts!(vGJk zr}a`37)g(vd8W^@hF(#Av8Z>!M9f4}TF&Jfp%O)L<5rifmXL*O20w&ugT z>=Sj;U#rfKmN9;_^t#1>ZUj0D*WX@McsJ9u_#qW>eyYD6>mi}ut9$g_U!JfK?v+O$ zI7{Ox*B&9dJB`0b<3aboB+3TjoHwE;$7*)eK-ld<*bQtNxsyR``a_DuVmll7%Y{t|8+6#7Ecx6W`zPQuyOL>AseEU;T$hk@P0%t? zB3d^+OBAlIh}XH-pR73Lg+`ac8YDpynz6@4b4hn5)FAdR8N;Iq0-77j zQ`}jpo!6AgtbAG3Sh+x0aKS2|1b6;^Qy|DhWDl-H0>ZZ2 zD{z*XN3AZwo>)gVF<|=MwYw`iq}>@5wiegWJJx|x7w!LrhPFh2P*6Rgk({6Yz}H3l zf2FkCqx^*zDp~JsLDvu<0^dTzI=#>N;yyJP7z7ap{5Yy?0vflrb%CK$qioOWRsY(v z+LiUsyMv7WIGr(-*w{`#m{PUZa$Tx-l}U>TAsA1{ zyO$m*&J#X7wr7yQ54{z}S=U=g;yGH$X0uIMC&`#@p0m4-zWx-Goti-L?t&t$7m zSIL&%3y}r~_OTvfHZEJ6-OC2}0D!WU8z4Y9%DpcF{Lubk3afw9n5E2I$wC+K6wl6) zQhfrCF(=~R@A55PpmB-p{PIw0P@Slgpvp3BQr7jgGss((ekaQ^hryYZcX5N&2 zr!=$ML`^?mehKLgdNCt=(dcXi9b$6S_C9sH*F)j|6Ms`C%=F zh`RrL121t`x6M^6>|u>=o2%7ra}nJ(hlY>)p1Eyq3U|e4)T1N{HL)}N*=c4YN(^m+ zq>B3}_wPf3jjdE?(6-DYuCYoL7p(5S);rd+_36bidrORA96P#jNA0N~fc>iULnZ^f z7kS~1sI!#A$cUjoKt0PX^h)bD%&$#gv%;x z$E*EvU{0kj@H$pZBHf$Q`@7zb`2B9~mcKmYc?P{=O!}@eE8ouB)7tfEX|;L~48k9D zemTiWCtX_@9BnAd1_8;^j@~8fWDi-NoH$Py%0+RgM+%3qo`Ica@iQqw!-m=M8 z_i8a}ujA_E?7CWD*K2E-u{2hgzb~5Yg0BCVFbqz=$py8;rP+OCB_*4@U(@C9H+0evwRO{s`ZE}%(USaz168FC!+TB%Ow|yZu zPL?5vR4ag=2CLv#^b5MW#aPhS>h!LT2;0SMIFnd@_^ci3ia)0;g-mYP9Dvd?nmDO10EF}O`jH! zpH+k2QLOD@+q^~8=)=CFt!F>!bw9c8bNtL-L5n^rr=4WsVdJ)$EP%yH=Ey8a?JHYU zG5^G_A@6G7eBHs%2LI7`kNJ zBzDhxqG_GAYLnk9XOP)7X_WZd>$&D+U5Psse;%yU2R+T9&QP7Z@OfSaaEr_GDl4zy zFK@B(;zN8JHxKHw+xa451;59grC)ZYE)4;4!R^uM#?>`En-4}bTa&7LO5S&}ZM>?x z`|R&Q3T~>5EWUC`Z1H8#Gmy%zU>5JB>Qy_GN9^sawZ?wEroq)#&)t2+9e?01I1^;(j#3=DcKS|55CP-Swue;zw z_IQ!}^;Yf&z%g0)O$(K0#vE7jl=!o_z4d9;7wueE!qu&x#eWM8vGNy^C(_xDt@CpK z30ggyC;P==Ev;T@=bAEmBZy(;J1N__hJ3H^z@_O{-l%}+yE@G6tYS32i_9jLMV~~8 z>IR7yA!)mN29JK*aO@vEsjgW0y6)B=;hlca`oU_wb=W3aUv3)zZTg($ebOf^FG(Mq zx$3wQZ)re3tQBQPEG|3Jd{fwW>xn@}%&-R?iCcP)84Du>iSlP<&qqhf}7g8q`W3f~Rg z^o;8pF~M9Jm)l!;uTa`j|U<*)>r> z^(Sg_!v0&retxCtGFs-OGqj)mx{&~wuho^*+`YKxGv6Qb)qUV{v$Ld*X|Q+W0us01 zA;G6;qGaxO;qVnBdT-zKWB(5f(wEowtT0kD+!zAC8I0+6!rs?wFsAz#R7(jUp{SPb z>*krN_{i^6a>pgFE34=_*9mqE?2c!ST1MFpk^ZCA;>(@JlQG|H>C? zr>q>dk@Bk~uc?xRsU*Ep&)a?zEbz9}L%Owq8LAJN8$U_)VeSmB1nBRhwTUV6{&siB zLwmZ=6jK|$Zt#`eis8M))W6fc`+mr=7-YZyg2MGcA-dXJ5!}8u^yHEI4M>)KH2_H* zaIDgZyT_k&9#uAPA86+TQdIzOc5y-T^4>+0&RO1?06!J9`}61|IB@^EUJT^Qt8Kfzq3M11&-Y2J$u8qd)b{Fa*FYmczs=g< zxN0cT`hH(sH)M<`k*b6R5x5o)5Avm5gtYzdw zFQ}P;j--K4cFo|CR}M;jo3+LzxH}@&iZ9{~<3twEJ|3>J(q}0l@GS9? z#S@RWR%~(}{)uvUwFc0kw$c4qv)wtn=~48;xV^)_f_k61f;#&V8rnyU0>$~J)IZhn z_FMI;e^OxQY^sepSJarRM(6PY7FTm3)tS%ynAwXyW2O?JilLud1^ZyuLww}5l~(?A zN(|dr^QKQ{z<%+o^|h%Ze16NG2|`CAd`%P3eR8e2a~y6?T(xAQY3_}ycPqZ(%mf$R z8Agw#M-oC%yyUgG13Gc}GfDu~Pop|b$%yo8wQ+=wX^Jr#*XtC$*667!9W$l{A0Mxy zQsiCtQR0r!HP%N(I)c|ae2G3^M1+;%=OIXv^b`^>U%+v$t1x+t(#(CdUw6jT16ByXitSv&z`etlUyMXMkmYnB=BhXI^C`i=@_#d|(J^++LeHJGyi1 zG&Y$~`s{k=m+L4HZ5#Xj5-#vua8R`UmMP2`|KaX+%QQU>Yw^wmuUL82@saauQvLaG zocYjA&)z#q1B8q@jWdZk&kW3*Nv>VNIuxN;`YS_RtlZmt#Mj+^m#+d(h5MCfq+dXW z0z8VJ<;~O<3?YG?%%cPn3 zK9uSVAhu)L?>6ZT{vWd+!o7gB_x-^KD zGD@m`+5@BfQ9Sa?BK5R20Q<$b-KhHd`T4c$ZYT%3b8 zC5IsbYOL;wildA3s~r_KlnW4?_&M{LU0adJt}jcN4SsKpl{Zl#vgfED6sMo5E1X&3 zQPMV4*Ss0yd61JlHe!DmeX5i!ki%71Dl1Bc%NTsrxkaomL~d{x8}8w{kK){!P$$M8 z;f}URt%zu4zaWclg{FC$2H9Er53m?!9BHQ)D-4{_i#+-C*+_|VC=3G5I z3f)EsPMzq}nb{S(v!uey!f*u)3pKny!0|T$+*Ff|FRFiCCJ=ab+ z=Qgi2eYkrK;AzmUTR4xGBR|CG1|RuY~wq$ZSH zkaQjiNtxs{G#ihRAA^7*4#Tzun@zkjJ;-~JuLj=sOTw^`NoZeTxKBzu*!mi*)$_*^ zi`h^K7N$=|Si;o_IGsdxJ9{{LV4`(v--gopI4!lX4$axA+6G6rFTnP>M_wdar>)Y_ ziMCZot9vpMu)(-{J{C`=wO1wc7sG)lrN7Ck+EhitiB@E4FE=nxTCok$&T-rTo8PK& zW#?CfQboO=bl{(C-J^JFQ)RrJr88C271Vr|uHH4K(`UjN+Lf@!54?chki5nYi&**J zQzI=}xd(Vif~4`MqNExr-W=bBMs|;$jWe#Y?s@C>nXY&DdXWfG+}LVfQbpZm+;ux; zr4zZ;7^7GW63*8T0IK_)x_}y@bS&0rKo10V5Y>-w_q}u zE_JRDp&7brmxTfAsXJu#g>&8McJ156q9_ic-o9iglq(iKUarr#gMIZtyH-lGdbkZ# zd8~w2{d@S}5oa(EQ@^|XXTfgrBxORjCr|gAwWntHm86bJpm{cAWYW>yPVP5vFoj=z ziXDbs>cb$YJ)Lz|7Aw=|8nQ*59|~V+I@{XEy|9o6Hp^CJ6a#^pV&~nMu>;uJAAJ2Swp2x55?UQFAp&={7rFsn21CF zL78JIqj?8e(-WeZg_WUnjSx3K&LnUXF26NzdNB!kZb@`8(}O0a-tqh5T>%7p)%h%P ziMN5gET<~A!CgG|O8%viAK;tVW5X&J6Wy$mmXP#i`S1XH5vC$>o;wg0MZeHueuNhO zzeSjm&Y2KbEB7EEazB4mn_(ju6&@iM=*9F;EY5cKzSm)hSo+Nzy)c#tv1U*$C}4bKb7ksCY_{xH<10n@>=&3x zwt&B;w>dw_(0YSY7B;ISX%9!;w%Jt7@?e{*Xh0RheBc9blzH3T5BBWB{I=PB`_4UG z_Qz_EmniY-ST(EeqBeK>Pt_S+^X-d;lrN!wQp4czyVHIAZk!ento%GXwTNO!STT5- z*D1tDxegDyS&i(ZJ5`2ua&la0k-uQY_h4tT#RHjhD1RZ^@o79PYLrL_NSPZaKKVJ3|o zLF!R-a-KLz9))@rT(!F^yN_z8hO4aGN~pxj zyR$4Ph3SiJe*^rj9UyZz^ z^a%xZ46Lq2dQN}enC`UVr|Ke#&!~!Pv>HdD@OzM~tIAasOyz1lFq!VRkQ%uhP4ZsT zdhNwEEU-Y09~;7C6V{HEPxtLc_K;7m;S3JjG zNkFOstOg^%g3h<74wbDx0h`@hI(Kz-RQi1JSQuYs3?CZ0>CPfWIrRdOOKq)= z3P6yV*9X&CzONP`1OlA|OGE&0FNpC-eI1V?KLuG*w4+qLx4E~tqHuF7?e$s_EcbQQ z2bigP#;c^&&$0rFGE($XZ_e4+*n0fSy5Z5_Unls_;!XiCk!V-_M(;riO#MoeKG3(xFceZ9-M@Kr73JK?X{woLl(OO;?gkYK*0w)y35 z*Z{}C>Me}d^)^5VGs}trt?!ga3%8Yrs-Y5v(R~)}?t+{rtg$a3yVvbczZe_xF4piw z$;-yuKzGLl@LqlH^LY6DQZZQ$94D=GZ0x~@>^oLwW5yH3GW#;D7T0<`m7&Yt4%UkQ zK5V1+9xtNvD5xouvCnM(K(cnehbl*Uk^74-@$s%Z<}ivRnR5C#*p zI1Z7RcmW*}7P#@wy!U1z!s&#oxS-TjP5cPiz0bkP*;;)?ReCt2eZiT--s~8}-haHj zF_lw>2BS+@UyedeZN}=}oA*{RIbpM5ELx|wiu1e{db;Z{-vNoI{;6y6B|}P{T{WzQ ze!TB{nZQprper6D+)NfA{M3NAywPPD41^0c&A}kDUIR~)pi`h$`FNWld1q@y2VadN zqPa5?2Q~4{MsNjm>NV|kEQveLljghM9~E3iS}}unCAA6uuo$lFSv$mZPd6NXbv(PU zf|R|wMzqMUnoUKk9n40Lgl#Cn&c9quz%H>c##P8`Qy=uNZOkCFs2!^l>}~4bu$CSN z6;`9~NXfkX(l~w)ArB{_UJ#KkP}M+lyCEV-Xd9VH&pUn<;HB^f$5w-2aybzC%z+jf z^a;kdMdNe*@nJ@q72XxK|0zi(?p(B+6v?SGyOzsCpb4hcVAk;cgC|kmXUz#a z4Zq_^oJgJ($JJAndBSTzQ)9Lf1c>PpAY>q5ZTjVt@(0e9X|p-ut_au z5h0r_`sg*~W_zkRz_2fkZ$!FZYWX0r>OW6Taq#i~yGcI|%I{FcK(~_L5XQ3#{lvm$ z68NP?!tc+hZM9n|3vpp+aeY0@vr72IG>z08RDO95Y~}O4bHv_OvOqP6i!NU4^YiUv zA_8B>8wcWx0*v~|GGSMd*7$M+=&?l$fknZcyGHayB1W0lE&p-@Zp^uXxf)Z|(DZQv zg*Gfpb>)ogwCnczoZ`=D5wl6^8eH%=9+$gDtHhaKVVrCXF*AeIK9^HgCrx%-?anm$ z>TxA%Ney6!v+`dxU&d6i?~Hc_SG!+Lu=9}m6{-Vf%~RaDh_0&WO)6rKJ8-=oC|ZIU zrY+7gP9}VZ$U~^(e|8}Ah`$xV6D`B%4 zi8H1#w%C-XZ=*6RO_}u9p@>l?cd##aWp@ooRgLPGI##=KP$`p-_`KC!f23Fj=!(Hx zlZr9r3`3(b#k_`nQ|_OUn`Db*#UR}3-r|4Q-?Lu{ri}AyKj9xF_~YC;#^+mq7IPf2 zt!-l@GjCilustiXERbYfb-V0Hp)&11rQoPRa*@Fbap85kr zmqEVFZ(8}gPYbHC$PX==8~)9~pPrtQ5D)<2w9I^Dt8cWAF`||4awQG~oWId$FFvwzAo9vN3vJCH-EtQ4zbJiD#T!+aKY7F}3QS4hTVPltr}1%5Ck-My7*9E1x9U zKj*Ji9#`&R#-Y{rI>s5fM@&yRf#J9`S=uy{QmH|b%uBwoa?8s!w$FR|KdRiyU&Ke< zaQuLkYt*Ctu`^+Kfh!E_cH3iyTZM8y`iJN0TIbz2q!m*YhP1jD=N%Wf_xJE4ac6A# zkQe2AXHw^HH{4gTBURpPgJO|THouNOL!vjkH;(7r-S5q7cGq-yHXa|(uGEBv7950) zQ}pJyLnXR@ak-T{2FS&yb%ezAo?*da+q`ZK%S@8{pAXjr1l!H{&L+Wd=20?|!sZ@+XL!nS+d*+s2IccAf8y zlin4kSHYolIHZ=iq}-nOEu(wh+sD7Q|gq z%;vKO2#gc#3DlCq--cY?&%1nazQFIe>%{hakP$ z9;sBVY}6I*eUyN#R6y*)7a^%w$^-(*iD7*zch?_=Q5Jsx(+W~M!cyJ zOXZx3cR-gj64%u)Q8SaN91< z0C08^xND%%XD;Wjm-M?3gUJ|UGzPvOtap9)_o(w@(R)e?WiH{7obnJd+cOy3?K}Gh z5&yltv|{iLlL8vnGZJuHoDw=SZtqDS<>?$kk-t#*zw8=1`*Erqb3(MPZD9w0to+er ziWYu=y$ur+rcuRWW;P7nEtG9j@2xx843n}m6v?pN2C$~MA2i9vW{+V@P!XRFD`O8a z&R?UY%X?f}lnS{vJ2zF#$c`_s7;l&DQqc`DTHW|G?mzB_fps zAaC{C8C8~!t9Oxx!tB}^(e^RWZ+^y>_Zb+s$Jb)Bk-MvdSskivYZz}kmqhHNfM1N*7EzKNpo2PSb^W^{#3zuYD z4jpA#x4cBg1}3?pfzxsaiMU4EG@kZ&LGC?oaAvEaZUM)q>rvAJ0;!as0xiAeL1V64 zHbZ_}W>dG*;8iaPNq?uvsUEN74Zx3X1<#u@cR4lGO%2EA zzb$cPiXjU7`oGkX-S6rnE6UL*H>sIvTue~v%q{_$yBGzk&+^F?Jc5w z62j`8sRtCA=75Fwro4-s!@NzP9dPaA{e}m__x9*l5IKGQN~JS)FuuW@p3r9PvuPKU zC!H%WMd6|;HK0+8OS0iPKoWzA&!9ENOU|`pWpz z-tv|sFZ{NXGg&o`hP#)ijukns}>#lFdOFoUa?&%jFvL;?AJ70c52>%sB{)T@u zY%?*WVxNQg5<#ba9)vG7%$LrZWg2&})<$ z+6I4U&;6UB#gPY^Hpa898r%P}1SavPZf)vNGhfE09Kn*jR{oh9wyv|TqBVNp^RdWb z{{{;Fc<}}8*ep5QmlMRu%cyXEkzZv*?c;{>h8W*zs!?#x6rN?UMN&KGs*(<&H|z?y7z=cYV;q(%va{2Haz>lI8wc z@omAN2~s<5fVJXhVmTxFG^Fl_~`utt23s? znGoidy^2`jzc8g;70%B3$()iz(<=}b2+X^s2)P8`8Qv#uBfX^hFt^Q&V^SaHy|Kbt zQcH!LLN)w$tPuW26kh`N&TWMJqkcBhKJ|6~u$J5xG!_pkE)05s4P0$7cFx@meu3YC z0{9I_3Ha8nH&en|aZ^QP#EliR=lJ@jroRTbx`EswllySxzTs?Z#rYK@8Y^ZG6b(=efdzhjzw%7%n( zb{_%S_Q!!wagNTb`(xs5V+Mq>v$AvK@D2tCjrr+5Wz&-QGemm|^YmvG^B(?}{RpLZ zkseoP77k$O)f+exQW#g8ww&|AGHfrTBypH(BG!t}<4u3d#+XKF9|smeb$v}{?toDG zN)T{DEyq4;Ba5$6_YiXagWW*mOqbu(FEV0g#dT|F6E*l|?I)F{NVk>2n=MS^e5$pA zrQVi}-8!eFJUBcIYr#@Tmj;DXx3V_krvdWTU8Vok^3a11K8Os) zS=ohWv4axV1lf5ln<9c#`XA)F;-$cwI!`^f^-zJ%SevQ8dozzzwA(D9gmb;%DE%V;$G?qYLTOG~L3OAyC z+v*-QYG2ny7b9;@#oi^>X@~3;yJXqIxDj_&FV-|*+Qg$*3pJ>HrT_Uu!xQxW*85qI ztq^1pO4n6-8u5Yj?%%byj9mYwJ^%B8?de;wJ(K?bqdg5SJC2pgK%Ipg1vV9-aueG< zH?V>sDAI(sUX)d9)KhH=pS)qBO#)lpMr-8nEC} zdkvb~?7LM++k=Yw2DC9)$_F6=d@E|*(e95e-!iT+@0?Jo3JIXM6{Vp`%J}hiY%j{t zcj>0ITCknv^>rUD{F8Vu6W+iG2;J5XJyd8+%)OJz@W6*Ee)LL8F&K>;n2j%?4-&PQZ(fYD^q~sp!~% zJ+~*`Op&*lLR3WX6RFyqEnsN|nlblzg3v9 z_uBT|U73-vNjiQhVU`=okV#~=h&;`DMi2RRPu=R2VI@;3qrXRTm5I2oJMcKUsjD^y)jecuMQLY7!^TOMP6YFXP}Y->-qAhsmtNeZ)nes!ctv2%KfnW^ zg2VOxmq&jb1W`#llHkfaM-MAWWu!r^F_pNBUIuo-;n{mBz|nxSMcEWC!hVZWIfmaB z9MCpI;S>Wzfm2*t9Z z1_(wLTMAIXA0}VIZxvTqFm2~)FzB6%^e{0DrUbYZ#sOz)(8U1+``)>re8I;LB{+E|gftZAV%-hTQ7>Ke>dXugMU+&&f`0GuMhNcU0#ps6sP z7rX{q2y$}D-W~IMsHaa3aSv|eD+g_5T~@CRCi?zEqKEB&6&1Lej%?%H;z>T0}J+o z5B$LkLfF>~HI#+gH782~c5aIwUuDrpO6K%&+pY4AEXnR?n-#?YF7fEI8lwVJR7vd; zNm?-%C0OIIjrQlOr2SB>RiYc!CL<3u#fMrw@L`gE-M?-Dzj=|)!OHJo5o)7KHto}S z5<+r}kaq_nI%IAxWX|3H#V#~ke4>V9RYL|x6DxNsX(H3ph|@rHW*>_6`nY4J~ zB_{jg#%s+lF*;L7N|=Asr$Dx5X7`7z+xAlG=^EHIEB2{r#BNTxNA&Se>Q>Um^u^m!PIS3gpA|rdR#*^@s*B2|r*El2bOe$!_I;K`#0-$qy00)>-a;?Ju~f@xW*f z@kPlDD^g#4rv$8;gjTci=czq9G;AYo3$?f{#IGxnMd4W4WDoO)tok0^_=PFm^JNG&}`r_kV+#oVD=IX@7rFwrkat0mPKq;X z#y!+1hC9d9ps`!;T zu}ETkW)+}YXw`q}b%I9S@b!;U1ZKpOfFi?PtFBh36(M`mo z><9Sb^DR3)JaoT=-smN3k(YE*@dIo)lqhtU=;^QFH;w0MgT1b}1Sq1o6;NlPUt5S$fc($&ZMr219Y%cbS7M zo82X>N4dKN1cyy%<^fzj@~J4FN&>Xa?tX$^n@zOU${Ci#4{i1_u<;pXD|ZzgvA8g) ze%L0!kW_yG8xXRVWO!D6oHUH0cItx0+N)g{BpdCQ9Bfoo+Q z$vAA#M1z!Avhe8UomXXxMGDYFrE`9ePIyJ;2%`}-u?G>zojg_1jIK$!Q^OjHW6k-; zaAim|#&8Wf#HgVXq^&F&X&RE!ThOUu=X*nKZSp>1sr&0+8&^!=3ns^?=G?JuVnB>b z5a{a5lQL1e^NBTKTnWKd?@-DaD0gF_h|7P*LN86T(avb3im1IjihZm#gLc;+<3~hg zlw7l@Y}V@U#IW&C3Mc3MJc)}i_p3FOazVpJ8m)H{@bKVZD=cd%L#;0Hj)r^?{Gf>X z-T*3L9ZTQfihtSB<8NAUM|Q^2_Homd!<%F_ zj)<=nb-v9-ORLQWmFjnqFSl?Np}XBDJKJo6NwNi86zFe!{><1rx&z)RzRGlY7Q(Ng z)|rFCC*_=`c2xnX5h0DH=pq&>_WaaLqh=1nU{oqf&b!-8j)Q!ja zrS0R%XQ*_d>8*I{dwu=TEoBf*2%0Z+nhnaFx#u!G|0uVa~rUT7foVcIH_> zq^UXA?2~;08aSgW-Cuw`lJM_@?KJzcIgq#2oxD~Ek9;FcXcQ()kuT#kSx#q4l*7Qi zZVvFy?!xouo0N{4mC_x5fpvXs&@BVF?e&FG$v;&~mqgWMeryc?S{^N$OqzhaiaQ$lS3_1W*z zW!yqBvm0@&{03T+hVd&Gg8`Cm@B@3CZ#rD7x|MeKjXD~S=xh+@=QI*?=GXe?e3fs8 zseNa(a9#;v?C{iT=fwZ~S`j+CkRg$S6SiUaMDN^tE()%^;*4YWomT>wjsjz1GxuHf z90k5*gQ;PU2_z~m=;_NiM!8mpM{CUKUUlILzYEzdeVE_+quBemU^L)J{^>Nv6ve`q zknO3yWGm)%4mT|@dEt9&2&SCzRO)pX?t$P%O{Ww#M@c4F zgf_~vr|NjIIB3gL;a3#_T3W-&zpp{3zr>h%UqQ=2MXH#%44Xuj%sklsord{qi zrXE(`uuWuHl@7`tLD?V{1z{)-Qy7X1X5vy!42t&Hnm*;BRo4bN?_~_$ui@wdc{=Kx zi^O2%p5;@puPDaU<;%%7mv1Oqf+cwvTY^E{ELFj4WcXo`6C;KlyjRgvRrG9%w%1om z!H})5De+F?J%H02XgR#E@GdAvjd-RhUrbh^!-VgG4tX&$-eM4U)jh%Y_ZXr#kxiuV zy)N%WQhIt;er(XQpP3GS+N(3a;2tJ#Is9aCzlVP{Gh<^a-jbU@Lsnv>4gqyEuY#Gh&%{Fb6YaVU=Ip&xL<<^(-Fi3vzSyqAwPtbguN z&^8VvnbX4GNDEhZSJDt({1d)A-G;Y&XR}BlpntryKGgfDv}n#0rXqz=WdpU|T~V2euFFB`2wFDSy#@hrQ|ctM!-zgdM4#iL&roW3O3~+O;vKagVth46vD{4xPHjk1YGBgd(a{pf zVI!lR>r2cs^_^G*Fspu-`zdkJLFR8nv;XLm{wq2aEB7;&O#=oVqyGzLSzOQ)zunW- zHs-4e+apz&L2Jygv?W$19pYW*6p2yyJBgjDaOeJ=bfAJ> zzQw39lqqia!*7RPXz>_!8l@MxO_e$e#Vzht?W4_hz`aCtR24Yqb1leNHj21?L9_IG z$9LE57hdDOb)9y8lbPypfd7m6K;QiOu@ii#1LWOVKuCAF$s=Buu1RN(EK#f??#TT9 zoO}O0+S1Jc^LLsR5v}s}7@jU8NF^1e&JQ^R9x^8a!c@;vZM!b72#b#~bAFhMEfT zo9t2Z36Sp3ajVjB7?Y;si>HML0NA;<%D9&Ng2LHzBShFxa^XJl`6RbTtJGC*L9u;z z4JEy6cs;=Wmvjb#QaYc~A8&@L215=K1z2i7J_)y7a6YL;pPZR@eP>)N zuj3%-PNxxj4(#FJnvfjcNvGmOYKgVy{3IdDPQ&7b&Pblyr!iaAbq?h~FJ{6Dwzku91;aCkN*^*Zhw#F!jqP>9o$_2{J`_ z9|Kf^+|nfuwS4K#nCo?R*I)@ZFVLsdS|>8h4hYRXQr4NsG z#=_^|Wp{?@?)=J7D(`D?+$%OqBb3hL9b?uJ?z?VwKmKOc6IT;lNAqI0sfB91#p=hh zPyea!Zrsf5tH*lZGSmR_BHykY=Pq@?6xNyt0=dAvx5OwISuhLf_vi-OMT&t(UCW#H zK*&@C5x6{7E3dFn`kVE+H&f%|_KO_{`SM~U*NHigt4AdSTPucHD{3*Be{8MLNn$P- zmXRZrdOb=G=CLX^5=G;@2l4tT_fqOh6QL3RI-xLY0H$b?FkbS2!u}s+QrdI<$LU}Q ztA{`wXM-n6+~ZM49EIxabR;G@-i=rW|ED=It38@|7Z7eTqz!4(5KDKf)CyXx%z>2~ z$)t>TQdA7&Y6GU%rvc}_D#XJZMu=C9_^2GwY$7sxf;0TIgk1uBqYyy-z$2qiMlUP4 zBM=IsYE5Btlp!xKN^3=ZdDfjhs>J$f3;wG{@lcyOSyodRD5s+1hsu}u%Xzul%H2n9 z&XKY}wf4Xaffc$wdK&ldX`88Z?=BSq=E-!HtKO!me6eEe+x8liXmJ3R{%71_kC%q3 z5Id{{&b17Qp)U&cO{pU^4~ID4h&g>?axY(x8kQy!g#?$jd}pj?<^}EoFr7@D(pi5n zkpByL7z*|D?e2Ggz8|}NOt&=EO#FoQ*x6=S3Hu2R+q(vO6;M`HT~F{cf6}ib!8oh- z&|UYG?$k-7iba4YkTufRM33MjvHq*#g~`>>5WFjmmZC;rkZ@HcII+PY??qW64Ta0g zxf!dDvkq2axfZ8$udgH)zkWTv)7r0M_O9fa#ghv^OigxctJgRCP6_dDk)D0uqy%!c zVKuD$x6LXijD=dY@-@6#t7j8pKiK-Q#e(;Zv5^Ftw+gLfGQu-c3SK6iV{2uS;}B=- zmj32uzabl7%lcMxzPNd;jtE>&M-GDH(9KpqQX9iIir#Z2IJbbaMEA#Pbxbgnjo@LP3o)p5KP#8@VrqCAKJ^4P$oX)ksE!4ovZLz(B*b_sRou<$X5_r zD{Os;)x9nqp_LoXfROq-2F_TjbM+_j>Vxq=>j+;Jg~Z}pRbRJZ;ctx+O6095OKf&0 z{=A6s8C-#cmjJc~qPnh`he(O{U2zImJ?~?Klj2e?nVug(_RwG&%{9bG5%j(v2l1K2 z*Me?GM>y)emCus59&dtCDggc)E}EEn^vo|+r&9bc-&dypSAMaiUo8ESmhv=1%?g9c zGYNTyB&ws?=%|uK4TC~e6mcp%ZV{(LX3Ih_fi}4Vy2KLkRx!Zhlp^ngqqFI!DHRzK{B`@z)#_qi@rtD{#_!x4O#J3p-G^~;VQ>EylvsKO^b^hgs z)@|Y_dhBF=In5}04iIoh+#?b4a$k7;q^}wxE$WnoN8XyFQtS4$d?bKNa~U{+4>oVY zk5CyKy7wF0={Zq`I1*vI2N)_1ALz4w{;{=MY6&@KYW}9x&4RWTKGGgZ>(dg9HsL@J zoQq(uxi?IbD%2b*;O~qaeDFgYKBbKksxu`dcQ1Yw2P&hQ`PVt_V2(Nbf+uCE38lVc z_(ek>jFx|dwc?X6Y57m}?tzB?U)DKt9GP+()2}jFxZ6V=jxc?Pr-s!c!ZqUj;J9%D zzYe|I3qr_v-6wKH=%Hb8kSRmwW@P7%g&qEyX;=LOd#d=3Eg%+N=#S32GZ)rE)wZPH zVcV)my<-ua7@ZRp?ISPcCXhgo0u`n(5&Q;f~AI<^(-_NxuXia0sr;2&F3 zH^iJNDBj*QbX|SJ^+|NybnRcdG)i64?eOZ-AwJ(Lx-P-~|FvHg>KAmKrJ!i)BY}b2 zQpVMezOgTarZmlVjm#6x)|M>5=Le)U+5NnCkXNrP|4&%qt8P*SXL3SCR=5l=sv&iz z!cXa~SIO`FyON(1Wt#%U*8Ql_OkB_edZAC{~^xHQelbNz1c^x zbyZon57ws0-ZIk}LTatyMy54;ZEQ6DJo?2u*7fv;YY&N96YM*tGv<)%oO1UC6Y3y! zm-nLKDvJ|T^sHci`hhL5BJ8z$k4p6Go((o&WGjDG7(0~C9ZlZeVigs++eG-XEVB~9~S8E7zuZo}hF%|y>9;6q;y@GH4zWg51J|W|O z=O;lpn_hW-Odhy?pFsJUSCFfLUAbBvK~nkH-A6bwsb_vhiVv*}&~i_H#0YRmS%D09 zgQ*`SQBiyouX8h5O(FM|jpWBoE@``nnsFUBL6oV97aGc8`o~Jg@by1`(KVyJUcy{^ zJ+fT3A=1Y?lxoFl*q`*0HD3RbmLAqc)9HkLyAeqCY=^=4k}Tt$$q{(d11(W{qj~<` ztrS;?YL%?Q&FEt{eSWBuNfYG4Ltnw3-5=A_k|r@IpQ^Qw2bMg6{!bvKoWZt zF6&^91oLvu+O5c2EU#*_yrxum%ZL#j$PuzS?noA9u$fN{Z;?#p$_BYhw?AY*s#bV6 zjsd*u4ks8UF*Cq~k#aZ6FA*u(mb9;~PGR<|AB9!`<@IKF6u6mh5xHTir_#Jt&$5~& zi5+ta^DQ-S70TZrPLP^?!I(ZxL#BC*qUe{^m)DBkYGTb|P^}hzS$|=a5?VLa^7|3x zGgrbO?ahbe$GF}MJBpQGD*7*_mTzy9*F?X}d}3+b1j`38HC^8B4)|~QTi-_Wc0n|a zF>iNY8YoiwxGxa#K6@$e*_Gxd077r8YQ{H5j8=vY$Pq~lnmQx~Q{EzC(c~?%j9(N| z8UvSLbYYM@nc}9&&F)<2P%+W~=W$w6$Jc|)3}9oLATE=u;5uvLb@6835Msr4X#`xZ zZjiOKq3L`YUAjY2v6SrvhV;W@>s8NRiV_JIdvR?N~&v0ZV)fXR1; zUfm)8goyhF%5p97*XUT#$5%zAC21LR|I1WUyqGR`8!u+Hbew9L_$-*BXS&xD(o`1c zcFVqnYP{R{ir+v_Wo!ISy2w|&LvC<%v8Up2Z4_wIKLagt*@$13H?=^lYEd@!EWDPV&42_wur z>zlRnZ}ZZYSB#nxA5pwbW}A{y2%I5s7s6YX3k15J!U~<8Q^717?YO*jMlj(UD9YJx zu4|hVp4l^E8ghpg7<88EOuY2X`s7`N!K;~131>uaWw@$jj{JZ}L2pgu=+s=8UUYHJ z=t?}ML75u8pI{bUpaAdoC5+?OD6fYW_tD#AKkV}Q(UK`|-4P3)iDNLhm~gIx*@Z;Q zx@ojucu5eZdK@h7o_JwlRkE%vbu=`nqoX(+_54z*^j5InaW|_@Lljj8Ne4~kYpF76 zyz6saX{(rE+=^3uSM>!z2?sNew6Nw_znL$8xEtAsG+Yk*Tlq_wU8?9Ao4k~$yxW^# zvwOG6Z{>%R6~6h*&>v4QW>G5^3!?;AfUvNeTOJ@mJ9hy{zhqY#Z7tZe8w-t@z=S=n z+&F3p0tV8Q#tE_<4gEMomeE8S9#g^xC#Swyn4V9m|wmeTBH~5PYI3#9U(ga z1YhxgPTGcc@Ttm^Ag?xnVZ5-^T;$S9=b1_?e=QH<+KM;&7!>LJA%Je6)Y5<|;woZJ z2pi&Q>~a4*z#a$BcD$5nDWovbWszV+wW+?>3~Eqgl|$H)Ev^xAJjHu=F)Hb$@xlc< zD^b7IbO%zOTE#UBTte9iI?H=2b$WmSG6P>izdC-Q_1o)XLLV1*+c#2!}fqm3yh_zip z&0`B=`@zjx@g1%EOAEt4F9+EICv$f`m5A?Q8lVo?p-jKs3l_@6x{yE++#!HsO&2F> zHgcGIX%#+qH7fwqq}w2WVMHiU}l5jjdHn%V%2PFxcNw|!h-?u%96GX5ze zXhzG_7`4YWx*uGqC_3BSZ;gbPQNR1qZ*vdncK4pq;7%ut-lxz0t_sS4KY?R7NM!DN zHU3BQ*!#Kkm0o~C#8VU&#hkfAQ|MDwB#@lo8@Wc`%EW->w zT^E@bw?$w7plwjwVi2jS#~(Mqw^!ab02jfIq<)G~tXaVp{Xp5E zxRnc=-PG)dW`7uqBq73jLeDxBx?cmUXgr8|wa2{116VA>|Cv(h=Y0JUce!9r9ci4g zth^Su$+z9TYpK5&{va#^CnE9ejVvs-i$jac$SqS-1v1pMm_xaNN{YrnI&;AS^NnHO z{W%+o=*IU=WybGvyZg6wGDunZWU+i9)&|d zPJU8z9!e9f4BBt@&sz86T7yrT7EJd>O}-mU8rDfsPP|5R2P|lJ1+K^@B<^;1XhdpX za?0xY9c~AK*?__TM@@^4#@d(Hx*ya9xlE#2MpU;-(kGrQaHn1FY_i0i{4zcPQ?{}7 z{)JK?h`OsDp_piog{P7u)PdHa0v2~Fgkx7%>LfftPY_p~*|YkFejV@Wkqq{Wi{5D= zceXW?`l#cD&M~?g;xByAEHtt(r#9H0Rx0s6+~QP-9j?$H7IzXCCzh{q!IAoRXxQyo zqDiDkkbko~KyJWdE_Vty%~l@F86*H0qxW}aH( zx1Hy!`rfDoRpZ{md19G7Wl4V5fB5Q zz-SxzZ}KJ!v)H~0kB2k7{HMuI>7Wlh7Q@G@MSy&qYFP6ZX66qKrH?cC*BLphJbkzT zL%`gpmr)%^@*RUD;I$buWX9+VKXe~|z)VE05jbfmP*3&)LUpu z`yn5DIXL)yh{3fj&}iqXYVt1`$QpCTMB+^^)H~sy$(z|;L#i}P^dDqL%Zes=e2n|N z!Gm85NcJ08TnKVt@jM9$2&0!ngC#ln51$q;vbB=`z>tr*6iAJ+=qFk|8_epr0uL>z_g*O!qK zG4%ey2k}&GQyk}iP3@T;;D|=M+EYvjdK*71bnY1{cGn-TtLwRDNEvI~zx@=F_Xq=6 z3J9mG0_rjK6-$^3RhvB+8RSFN$xL*)^QcH&*Kp|mL*6L98vpg#6<#&uJK&pRbsWW# z*z6t7#~yw|b6L18EU{a3NtOmZd*>UpsMeb3OKxJZr>bkBcT*gbgb{;ura0ak7>^=fTfd9A4I zULtsw@Zhg*=jLU!C@Nyb)`(5<6i}A-435n)_tTkuMO4^tfU;e^5$ygC_WO#D%-qxa zTlw?Na)~jqI=7pddj{Wh26w5aGr%!Sp!vzdi>2N_(e!3+s)DqLKm5(=fT*A8ui6Gx#(^CMu~m z7AM2kERKaQcekI0FD@25kTSca3Rmo-HfG-`&9;6OG5m66W8JL!~pt@x5<KF6h<=S;nVt(d-vp zsjuLUe*D6)uVRyzdMv*s^%bg4n%n7!$zg)JHc#DW^zPc5gtIa32VV`|Owml!@0jyj zVYC^J@3{Q*)x6Vbx>P~Np}-XNunl6xDwxKRCckxCJGp3WD6F^Pg#%b^k!n9XSJxLR zAd$uryAaSH1BPW0QG>_IRgU%H4h z5@L@?3IjfohItxYnIiCrsk;ftdPjrrX1}mjq{20RW?@qA%x)t&F`2wTOG1Bd0Dm;) zEV!Y33z_Nmw7z02Q)Q!_nLxyEO0(}Cd;WgZBjDFHf>?6Z4dkLB>&{m9M_?m2W*uj& z!KE77cMZe!V#X-NW~ayJHkv0wTb)_dzjHq9!~=M)e|J8tqvB~yGeSTO_<Nn zvl4?XYvdiLhIP~!cPuS)4mnE+Bu%;Tr@7zUp1wF2{aSw8;vT@Xu8ClEg4MX;6zFtQgz(^>CA$s z47^Sg_Q&=1^V)G(RScwgDI8yYtnM}F2)Pj(;!S@hFtjuDHkg~mkMIrWD%2wz5?mK% zt(aLUj`uD;W6MPXZ>H?^|no}x4tt9G7nw-Bb{V80x8>1 zJ(U624SM4rkI(o|dTa?EO?7eSyA?(vS_V^Rt@bAaToMA%T&f6k?YJrC>^>DnCSo}@ z>k%CK3qP7J^i=j8;rsQGmA~@^lGGi;w}5WWKr!ArPftHhHQaL`4;@y^pRsX5#Nr{q zHb;>bARl-HjiorrC@|hQMF3{!Va=;jq$j{DIFDBp;yG^Jg#Bbd-scb$>0}UwJAI;s zc!{tV6D``lo)%70=B?DbWEgwXajWjb_3-kkfV?1$P?@?Pg6?P)U`&f*sHDk zkKg&XY+D12hI*W!L)H@$rbSU$a2qTKoJ8v1v6k!raPqqtjSN$r-L*gcYoO_Oncn$* zZj2?G)}fv=B2MWTzG5o>=9wA+j4{rs8bQZ07Ox5l83z`_ZUBO3839dvnVksmTjx07 z)O`H_xU-zhs0Z%8QfG&>V7#XfN3*^v%6EgqKs;LVnp=6YAPh(LG`s?ugq`jOd7P8| zyJ;ocnZVs&Iule9GWQoUDLMzpK=0sZRhB=3(MeRvT#GP-Qe%o_g(1#abvB>Ku2RbR zbLPLBOdh2(=a5M`LtWLvX@yutpQWHtBorkAg>~EFG8n?_{!;7q6i)`CNFxe1yKbBq z@B??PIbYhfgfwo)yPT$<6i(IoT}T~AUqpql$C)mfOc(rPS747qB1Ad^C(BqWsT+A} zF7Zw=+*gKD^ntXPqs=C@YPvo!ruHxZt@9%gK+MxOb%Uarr(dgFdPeWw-c51Xu8XSu z9{UZl+veZ&H{A5CG3HYX*_^pMw7(k8(G>&A7QWjRNPMF2y(B)t4GwMgWoYM9OKCZv zcqainzCUi>X}Ot0Wk=#ScsT2@nss7>WkvimXsJA_j-{1S-}f!rHTuM; zYQTcW&BSt}rXM*XeT=sm2nPAan>&wY)IE>7pRbZ_cg%B*01;sOxI)>eRhQ8kOQuK+ z+&_O!)S>>8SlyO|KTg`8t4Ds%{OnN^&v$gk(DYX z*Z)0|;Ou)%WpT%cZ^?7Oa4ET-9L^t&_%-wUO!)8o`ecsC=rXhh^aT18G3#c$Gkm%G z*MVG{@dRN_P;)`Jv`$qUQ%fjy!d5=5#Tv6>&<6hQfv^p(Mz6vIb%6@^o3{2t7TtfG z*lQJYe(*qMhb8>Pm`jQv%KD8^{}$`^S>l@*O%X(<|A0*WH?A_m4!rIRtnM%*%^6+O zxvt8}uVn}6ToDW`1}#5 zJw>!{rq=BvtlMCtEAcLc7)swZhZ|V(A>2{D8)5S34!&~F3rHf^ac9voJsZ)kb=ao1 zNEK3Y_wGzDpJlOe^r*NXZZnHS{HrEc02g22_rPpwsE|oq$44j!TWy7Gq5PKfqdl^c zBHDIsgoJN@$|*^IR|i8w-d;Kw=m&_9iB!N4vimqs5heb%MoP^y$r*^tJ4@bh=T*U- z->T%tO_IPcvzl*@_=6qzw6+{3|5I<1Q5CR5Dt@tIlXLs;6X#tLaC71rMMu5iNF_b` zhz4gNc7(3f%Qz8^^AS7U(a|QtU^exr2|rk*O>hpQp-eeLnWCtqxe#Cn8l5GR>2tA+3s=(af)Ee}nj&gU>oa*$E(<-Ij0d zXFj`_&%q3mt3~=waFQp%6Tz$;!57l{n&F$mS^&W|#(nq%)qUW;(|q8* zV_3S2@$;0McCzU`g_x9r6A5<;@pDss%Zb%umH}QmgmDM0K?r7xe(HYH!ZT*r(ki0caTD;<lC*N)2U^yOd(E_E_x8os zzb=^4zNihOC+N-a0#^QWdQ_i#-^#UW91L@&aTiABKgv^>=5D)iq?%Rb-+#?%zRR*7 zmS*;p+^}`k!74{@4m%#@g3sN08NPwQ&-h93WA6RzLNPvVP>PYN1Plg};33uQq}-ujuGY4fmJ^j;Jbsn9!2kkqhYwY;~WD!tfivl+58Xz6m4eN`2| z>gUryExQ*an?&2z?SJNTb}zh)9)j_UnSI+Wxx$FQEqvF%-dJV%7!}?53Q=$oz=N^U zy2ht}G9jFdVXPZGpMmtyRe{7GKWkqvfJ|lJES!r8NZe(`H~7Gq`~48N4K%fi@#4g= zfx*khA5PR!%jeOnjrPHP?K4>q)_7d{z{rrA?xw<(pg_pPJuO7LykjU>7~cg=P-C7A z+`5@SI3>YHTZ`ax&oMn)hqdG#(e8iQKD_7nY^``RyBC422{;Bw=H1WtUX<$(Y(oJ- zr1sGNq3m7YOUo0WK)5zYz*JBZt&-3xnRe37KvD`6s8UNHwHB;eUr3ir0Kmyfl@3K5zC$D=>RPtY0E9|_qX;lNeZ0f|IG(F z&t*URvi92Rw%1xaSYh+!G}69kJ>;c-S=N?danpKRT!kH z3c2Y|Wx*8Vtsm0EM_&u~Mb@~i5y7t*i_6bRPLiTMQHLvbP$m9%ba;U(=Z{M*ME%9` zXW{^ol&2YFJO*9H#(-&C^xS!}{fH|}^?VZxze$ejn>+@`_9yiQP|x6(7OWETjXn+- z6fC$tITP*5`7OoDRiahC0r82KRk3%%R-gC<{v=gVIRq3p`W{QY%pR=yz7`Xb?C{U~ zy4!vEPa2Zuc<6wBrV8KJgp^IMX*fqr3d?qKMe8?Job< zOMvCFbpq57@twop;t=&CjWytu@K}7K)|eKJ{9ypq41WwY1~N1k<+~^b@s{pv&0Ok| zn~3LY-MtI=$3JSfQs}kfYN=P+AJ7Vw*``;oSN_6z1{_A6;EAdUy%#RW9Zwkf zj&K&wj@PT;eA*ae$KA_fp2iGKijfiNuGLgjDZh5r3@wxs7i@quGI9tQxq(Dn{>;zd zkpc(gkh<)<6>4Osc?j(A?|soU14Gm)9PF}c@zm~xrMcG;ZiN)!%7X5(hjUnvh2AE| zaC9q133{=BXQAk|+8@TzWbnV|_yRAOrq%w4%Hw(LL_=T{kP__-dX zCK0yl>{j^ODU+_9_u9oP?FGv|$?>iD6H~`(ET(CF6g%}g{UoAgDZ`=4O+6mZR9}-~@M5_$8e;i-gg&v{ z14M;DSL&L(rY zJ*qwNEma$ul&xwSp7FK3F3JBuL%F&l)_si;{w72ZJ#o@Yr9mLkzR_{*sJM0_KYU>E z<)t!oc-ikWzxgQ>xZx!AGsb~19D+v-Oy_i7a1b1eN!~Z@fbLqZH*$S#1B2-R__KSo zOJQB~TgSqzZ!uulgPuxW`KO45tFSYrG$Y_@I?NtIlXd>`LnuH^_E?E$lKQMfl@*^h z=k~^O&satp|9XlWD8up(`P*nAe8S#19KxmP5m-)l&@-4|ur{IYfJ9M_nFc#~9-t8D zdk}NN*wgz)c-LRTO}sm^j&5KeIiY@Q;h@;Ww$Wa;g%@r~jb*tMSWkvizsTr7>8>-z z1)tQH3>F%`)6g_Dw}G`qgcVP~y#x0__NyzHqM01n)$5;ik;^g?{0$ynBoqPJq8Y%a zEytGgh4Zqz(7o^_SDXSU^9*;1%#t=PALBA4$B+7FWG#mGpFKLj@vaAUn4}!b4jh(dpdD1(q$8uB#hCe3Sc$V--$o3i(Sn{0JFKH<>l~iHc7gc|UiKPqd+F=_3xV&K_W2V5t>( z{`BOg+pE1!GK}|Uu9-)P+ZI z00k-qXJs-`3sL@X?>tivBvI=EnmU624}-35;(zTOmo%UH9sQ8&fdb8#&M-YFRC+^c zVN3T}NUCeHTf5E~2Te1)LAHcSc1PdqnlcXG6-+|*IQX%ID?s$?gDmxvQc1+}UBcw# zHSzob2qA59Quum&;;7^$r2VKZ>`u!Qa8w#cTMX*#BoG6K&74@vd_s;iO?X+Ozw)!8 zsbP=Tc_T%*mudTI%5Y2uyC&{@0j31RtYe}n1GVR9rRv}T*mzGB9k2{!(Z+pCP9eC? zXn9orGATT-UW=E<=L3<_XnOA@92N)&xcU$D53U>-stW6v0dRb_z!dWNTh_quJJ5rV zh2|(E?=XI$rRT;hqmuTe%)1(H(>k@jPttIIfoM=tFl>as#p;d%z}1iVaPeqqZ>;g* zMbF{JcPKk_2Q`mht;`f1%{ex{|H`s)O=_nERt68(OE=Q=V!|x5W`$ATu0CFeIfzCmHsn@A-*4f)e}N~iA%fbg^3I=|L=agsQDI~_Kp242NrDSjG2!A|e2_*Sa+s;B zs)TRT{8+30Uq-*x-{<7DQeOOx7YqTT4=w(K8}3#LPC^cBs5h7pRP3;JN&I^bM8PCD zlB8u{VCdGFPjX?MnZSNqNS4b1ux*92dKS3Gm++~h9oZWr>Jh}%QPytEpMnY~vcSwm z{@Ik(ojvY>s+9Pr!BJtQx2v0U*GTXZ&iuYsp3Dn+Zssv<>#;vpUoWazz>-4 zkND$Ka*Y1KmxcOex-s!Az%_88*S&{+nOvc^8NxyW0~eC@9&%iiABX8$a$LS6B4g33 z)PWBueOTBShw}fE`})m=L(CqoV3$m9WlYs@1n26~#(j%+8e)PiCXgm4T4fXCkwx{w zKAD@joq^cVK)^hIv*fCS}bH*j0utLkK1yPc|AbI)jG>KpY*m8G8I z&8<|TqY(dSdlNS$$pqDE=zxDd4z|=T+)>^k>Z6~_u%3=8W zB6WkW$@6HZ*V<#{`xhN-;mv6t&;zu*{7oykyn2)~?C7~QqK8}^Xp$Ev4TRLq%t%uu zkeXh|nN{}*b|uNL2p(SUA!0T4#_L?iRq?IYsi4vi!fHBS`VWr`MP+x6&5W-~ou;d> z3S&{`!FDQAL~xm_@>Xl`+v2hR^)H+vItS3&B8>oVuj;*udYOVW*9=5d&k5b5u#XK8 zYe?h29jSe6xf0coKdzFc^ByeKrifmk$ofCpM5MFGH50hd>v}gN+1V{zXbmp>kTrNE z$x^6sp{rj$2>x355+&WE%me+FZIUYM{NGSm71i17;IT0%D^GUt3db=ZEB89>VVWk( zH6ik@2L0J;210CJ|98~v6@(z!Hj`WrA>^^#gDq&iyLpNngc9^TSNwGGW8-ghbkgfK zyNx5YpI37Y`ST-kcUehE9mDO&tE@TmTkLZwb4hH6iAub|uOOB;7C4Zz;yg(21E z%qn>O#IHvdpDU!!zRRatrD|WZA0Y593fJy%muKKUIJh8<41W_!~yQ*I&4^{*~aXd;lgH<5tM0prH^@!7X(Jp9v_| z4=9Fz8f)J`!@9GjiR`{-OF1~e+IJpe^_y*tqckI)Iw}CYQ=?kw$L=&v)I3#FB>b8I zev#`rSjCQxSO!kG*y%|tq74V!@$+-b20D*Y>(d+gWDckQ_;NRd<8lsjj92fYNJKFX zagF6x#|*y`!`18M6*bWf6*b?FE}L6Z(NFMm6r&2+q``;* zpJ2fa^|N1dxuGN(jsiSa4Mh%^n^B<==i;MTg~9I!zRF?`6K6*i==HL92!AHl%K5vg zw(znjz)5a5+{=BIeg~)X58Jtpu_C9pha&fIQ8N0~7+>$^6D8|)v$IJXG zCfMu>ERgwb1JG-RA?25;zj(79A`5+D&`l#ZGlI03xlMhuozS)Bpab)pi-SnYhN6D&4*j#rL*ezno2HAv8zA5oLzG|v9 zK`MsMUiSE%nt^jGF%sAJ6^>z{K;c3~0j+O!1qbbd=4aQIvP>E`Ec$1#labQ>j{W7e zGtUCG9}DPh<5{Ex-NN>5Fz;2wq=^@eCIXDx7}-OcCpP1SKAq>-Y29w*uk>nSbe5Mr zg~!0Yw(ydWndMC|)(-P=Gtu;Okx(=Z+Ss&tG4F zrKSWa=AHv7L+Y+KekVr*JweGtfpAShV_3$IJCl;%et|OwzvA1L#$AFOf1%pPjB`*l zz249?oD;tLlZnvuaux3B?=!n}V0O8hRzAe+;`C(9E-pep_~UB~%2d^6JZH23&=UTj@&voE~Z%1{8CRSD+k3-f-{0p-r2*6GF%T>CBtQqzr7 z#1mdnTi8xK=i*pN$DvTY=9bLfQK3xWb^aH#5uz^KyCk@od+m4!S22DMwBr=Puk&1Q#Saz|yp5<4pt&N5xahmsj zo&>H~1}2Ls>D%xfSB!XCwX%l7FUdUgK=N3)nZ7G61nAUFUgu_1f)&hdNltn#do1wwcf3jIK9IkwNq=`G1R`vC*!T~+;FVm26C@UiM(K_HovJuVCQK%j(b>! zyzSR1#kFu7y+~w2{=awh?{j;g&a1l4FO)Dg>>SLQDv9R5ZA5JA)#Vs!68TefS0X=5 zZGNs1)N$6=A;gFu#8s{IfP!(d&l!{-_(;Ul7|c6 zJxi=#-56e1u$yg;DKYx&y zP`$`Ln2m-6i!bhvzBh7#D(H%U3Swa@>FhDlvUQkXqwWz(Ww0?`C zzL$N3nF-hBrBGUYgMX(2EGjFAh_>=7w@_uv&=FpRCs>}9CCM*;U_w7d%i-(=I_i#{ zI1VOhE-_s%+}pZwpVL^{!qry4Ie$LE_88T6_?PpJWh|7@U+`G~7B(_FO!D6EKS;vT zVk0`{Bi}l!$jWM?A}t@H1FTMale)i;gxoqY=ApGIo*#XXx!?Q`4~%z`zzCkk1f%Nx0s z@l}})3lB2A2E^vv%M!gc^$It?mEYuqaOEr>)qQz?xKWeHdn!}hP-zeCGet@;BLa`? zC`nE#aqLZcU|ylakgR z%GM^gfAPIrYSI+pxU=@$&ddX)=H2MUc7`Z3yGL);)!nRsLDV}cek&?lh4w+cCgx2jptf7=7#pmxE>BT%62nR#r z(iXXT8mwdsPi2cl@cv4k`k#i+1jDpuQJddCXMs-KGQ#0?o`F;xjOU-B;QKcBLpBcb zS(|ETKBi9ch7ax?48G|I{+kyHV{6c1Cz2-4BMDP*98aA}JcOFa6i?q|lJB6mCEhJ- z6id_}d>iRP_!LT2XK_1^zk&0;E&q}w6?tF&r8g}pQ!)Qi7l?^iFDH&RiPN(X?FRJ2{04=eu;8 zqEznNm;7gbXw@UG5UxRa^Vzq=PCB8*L?&g7zgNZ7B@z1h&1?p=wr|t%Loyh)QL?0^ zbSsLYq`&zrqWmZug<{>?Bm>}vhp(S%R5&|USU=w4yg|en$xEb0UYN}kARAElC4al! z{KO(_M1k5gSd0N?DCAyl+uAFXzlUNx(){B7AsDVTZe)~?n%Fe_$Ei?n_1>c4@ka$t z{=vqRvb#X4!uOrOfEFAhL`)QTpQdL~roT?mo}Sr@jGk9v7W32kMfj{4RBlYoyeuY0=km#d?(MCj_361F4qwE5#iC$ii7K@jaBcaW3vvolEcqh z>#diaueLa$`F1uYo5z)u++LO%dpmq*%kgv^O3apKb{*HGla74!%Fnn*I-j0b{@a(z zE$1apN1$URiFOz#KvcJ$!CDbuD6w%s!KXy}Yt~z#%;!t)#Yl{qt9e_o0kJCS+p{QH z%GMzqY?%skyD7789`TtUcV4PzB3gwLzPT{c_}L^Lxt#3E`PRs%hw=Xo7~qdpMf0ih zi7H7xYDUk(IQhEH;uD-aj0L(Dck{`0Do0lLSc6?9x1o(cUt5GiambPVhFss5ShkW} zaQc*wv$vk?hW{*455X8IOCboq@ljp~X7TR3YN{#k-+73R++b+-<`#Phrg&X39xQ`t z^e5cw^FAb^hA-&U#Fd^MDwxr)8Is453!|Unop1-9fe-dzO zZXp8@tYxQU%26zWXY04#UYe|?`9Ip> zN>d}8r)cg&WsR>djd-g#t~f}+yQkot)XN|&Lsz7@%&lW|uAv2b)a3vCP-B^huiRmA z!l$#o_axw9>zf&+C}KF)7Z>WLI8~0gtEg$omqXZ|!%S}jv;hTikfS*9uZB~7A=tOz zM5dj?pvX624g;WDeV>`I{OG~^`Z0K#D$9z^JUhZ`USmYQYjWj=$p@AC7p}n+${tx* zGm)J8p=-%OLf6z7(H6sBp-epUaKA$;^5;MW3N@f5d$$9KJ`jES7JKFPex|4?u>Kv+{MGSAlfwI#0gDZ`&Z;#z+@ z&v4>&k7tAh*Ycq~$vx3i7e2d_XPr+vcV9HaFM^*#U7b;I*E-Xr^X_dz=qSQ`g08_g zusP&n7yplwDzZoL3M>}hc-hh1fTW;n#2Vcp=0ui+SNzG)2Afd%Va%1c1=d3%Pg-+- zi-Pn@4)um`_J@2Y|)=gAr9Vi_EU8uyX2*iyW@*xzl1oSu(ZztX*v$j%443MDfX{^r`mDX|`R0Iz% zcoU(s@$0qTx4!}kvOFU;&aX0i@`DPRcpA%Jf%#k7l&t}R$cIO}&*OBn>BBH;gk%io zv|rFEq(lkD{-;O3ivUVb4JKrXtJF>$N@lMZZZAc=tgQ5?y0>#feVkB6E)$g1zj3cv zoC5KADFH8{<+_0dSURr+~`lRLFZLPU?+!-(U|!8gojHqc)D2>#U%EJxo=*FR0J!{1RwW zv=arydtv~v^7P5v9g8#eI@J$Q6C*;GvczPf&`rtJUOaEyOh}_A(ae%aiAa{aReFx5 zDC4OmV9V zr8^2Iw4U&6LvWK*_6(!+5@D@p>1A>q<}9Gxoww1D-*gSYgXMMc+_->f#|+JW9X$dK zsE<(2YIQAltq6SX!GxlAka9yoRrTI`FqMVEsqQK0C@^r$P6wk+`n(w!8caM%o^KMjOCS&$CNgh*+3ReDa1`?h z92~5m2jBMuwSdRWzP?uYWNV)qN<) z$1@M{amHTe{g!Z42SKVXgH?D`a6^6c>5-l5_@3+^NJ>h7!|o2_pBbJ*IecWN zAk&=N65`3TJtMhiVr1@&D`V*lf3+_Ohbt+jEQCUJH1l%l)yo({Yi@^qxF4tYck@B; zJ8f}*#P_ySVJHqcxtLc{>G|nK2S3tXvHdTqcfF7srhotL510vbS z^ZpYRgbwhL+7}m62YV{)W-@a$J5oi4LVVD0`m>?ksa!^XydYMid)wq*87jma-;uumU}<|ce6!M!ky4>Uj z3s>A&Q3De7`!kr(fzbLYW$`gM-Z~hZn`>E9W}ldgpXka0W1?S*+E z_Mb4`h1pNKF09hT?kBm1#yiEO!O|<`r$Pi9(odSIyzFgKOT*2fcz#wTn@%u~8@(|i z3VnT3utOf-0_R7xBe_cz^Zwy_7z>q%#>-EDFvU2$Ls^M7I{Qj`#RIfdlKhCb{7ku! zUv&hYx?6aHmMs_Yt~19?&E0Ul478#37WZ)yeIg0PyKk}ZfOxkHVbT`05gK+KH$+ch zs35kIYL2bB_Y!I}xz#`C5gBst8NmZ{?GcsmW0TP0S1XyUm0gj~BKMw&d9OdAk z#7PpUNPJPP0PY+AN+}-3xJf=M)p2rqQ7t~okA*F}d55Nk*>TP|1Wl+@4DG|x;-pLN zH7t_HhdTQd;$~EbP;>5do?Llu1sXP?kUE32<4^ifkKDkxu(XNC-G3`Hcdq_>=|- zYsf@MCw_g2G=MqKA!N_L@f!Xlf?C3S=ug+ix432+bz2#}N?&`iJN~(-OOt(XwRY>t zlcIpy%rmCs!&fnjTfP9Wf1N6h=ZXsUH(CAKzNYz9S1^6A zMT~2C*=ou~GuMu0f!%Z{vwU~FEo4YC^Ac20RaA;#a*`b9`=9H#Bjehji9BPg2hRzH ztp*lKf$1pJ5Vo@)+cTtnlN{_Z&H`%lZak2tIDZB!?F+1wsovccZS!Ex9b~&_F_CP! z*Qs%5kt%sKfm)ym9^<`0(9}9-UF?MHNI+Yd?-&gm$P+9ubq+mlaEv0iYqGa|^hfLi zvUJg0Q`GzEYQdG0Z=VLOVpI^E#q1-P`kJlaV1^RSJQzYzl|za+c`V#A#7<=~SgRd} zo|pQ3cC(3Xsj)%bSfDp9t!g9(9>*=T9u8QH+wzw0d*5k9oG&C($5tB-5cJO>VQaP* zJXr6f9wc6|>LqnT{yx(*Z8i|RB@6R;WyJr_#Y`zP-9U51ebmu?FM=Zsz<$+hqH zBb>4ld|I9ePK-37mHz@mD>b!-j`+`?yBDV#$y^}a0+%I!%hA{+_L6yS54#3YPK0Vh zcElO`05>!c)kg|(PmyDJ zn0F6r=^<5)6NhX!k*8zwiL z&B`K(;ZNMBuW2voc*W*Ge9Ooac*98~#Pj<{-~ucWklw7;_C&T8wuFe+EW>T*+k79* zf2{%1&3T^kNYc9?$4c7$?J~?%^3;NI#hkES@UWsrm;QIV*jP4;HBVg?M(Xv_w7>U%Jn-eLfiI)h zlfm`}TK_=H10Ns7#{lw!-}v>{06&DbVe>NaveDQW2g@Asq}9xKndkP>xy;(pewi!o zWkjx5mGaq_HyYFJ=2Fnn5M17B$NK9;;?{NW%|{o@ny?&!4UJ4w)3o zJPV}0I+B~5^nY*_Uz|PUiv@fU&0jEju({m!^z*A^U&rVg+fG#cbMLsepJG(ek+W;+ z29W26Pk}sF3@}D(uZ8of$u~kjjXByGg73@7*D)ALrE`97$huP)RaW z{T$Is9>5VF zrA>y|^fiYNCf1VwmZW10YPlyIShNi21O(BC`dGl(`s!%oYZP`0=73qj_0VGxfcqYVfhTA zv9o6vAr$Mrh+MXS(N7OBh}2^k9fBErIOx&9x%KEAH`JsxsLmd2IKdZi;%Mcdo%|Jb zvds`Z=M+IwXAnws3>#F+W_3FsC=FTmV0siv`4qf`$L5Y9+&^JEs^?wy%n95&aHDG} z(((R^ou`90hREDH!%6j{;E{M5YZ~b6&_`fU&3|E{r2-l#KEZ2D0)H_(264jX<;95pkAs2 z74Ae9P!e|n@ZBy$aQF@oN1GoqYkdsgRvo`1JC_OhoqPWYAkjlc2H$-e*0}17sr%`E z=6THMu*&(r-!{Y~@qs*HY3PM%w_a9>UGPsavzGEJNOFP6x2cPuDEmr5Czm(HlrF$! z#{qC&S2=T(zUHD56BJSh$&J4Q1RKok6OUjgXkw~cb1%Y>>x=|)h!%@c4D)Pq-fm5f z$>&tTo-OzwjsB*%B+*ze`geYJ?|^De7nwqnxioVX#3i>({Dt)stVnJTL15publ+f2 zB2OqM2WMOm!qJkOP~*R{7i}1o(kNO_sEaeW%$kV*3~}Pk-rWdtDuI4O$~ECAk@7vq z(mOSK4AZ_J*P(6yc46kAxy79sRYbLusMUR8CNt`|`hCUqd;l}wVO)v)*qQ-6K7-P> zN?Z$u(#6u44t~MM{zg7h?@nV=hgm@q52wiM`XU36J=Nw%6P5bl8jVLJh+JIaWshZv zs-j;#VotS-YUWtfRPro$z5sH#NV+B5#Fw;#H2CL4@K|KmBfY4ysw8!oMBypjGe752 zo~f!leS`eRYRE^o9y5lH5Ac_+5Qszg4iK?6I3(J_LSU*d&w}#|F3zqm*hq%1tq+a_ zDy9jX!;}qe;G+OZJyWe049rJSZcu&zXr~~l0)IC?-3)FH=3{Qa~vnK%k5e5ZQQ?Xr8zgx z4|CV{d_=wG1-eIf%R%zNBPrmjUjGRuC+LTN$XxcY|M#oye2=2J*G^f;&S7vx>x}}A zwjIYecVZ#Ll{?zitf=^C{tol#4E9l#QN90U_HD^P>Ldr!a8VyhF^kqFXPyHj6Y(5* z`thpJ>TVP&sQL$a)VCvT1ixdmwKeyy`Xyo#o7gsC2?Fp9?k;!H1X?-4TG{2#gMER_ zo47Sae_;DtsS*(D)4b5%yqj3&X)Y4^D~oXzqpKx?v-6G=FXkX5UsvHjie*NrQuh^eUj@+l9u}p6T z>!^bI>I(lo#2*mMRL_tPkO*uEXdm^@|FM^zO|O+RvIGHCT_7V)Zb?AsM{abDzY0t# zmf*FZgo#Ie5P4_llZIaKD~#Po9P zpK5pkDjU2Z>PPWj-fP3d{o+HAKiKWxgK2sed>XbZQn8d{UHJt){G=|y!1*9v8+F8) zs?6kgDJCaUEH>v)u8C$|Au{KcC7+RZC#2}9c<#|e`+CjCTV`R)?NE_KK3Ng*KNGww z+P9R&R@0cOb`5B;#e^m^^ZutCS5n#wd7DIhdEAn zHJq*j;LOkLEX&Op9jqhboB*?8vxVzJV*!Y=G+6&6=yHDId{qWY^Ogt>XT;&A_HERnf!qv21SgsX;P!6y@IXw|K_eBjvl`9) zePDAnxC@=g6jZkzothP8In?Gh+|xvLe=IAUX8r^$2=?0!z%?DLryD8j%@0>0(S$dFtuoPb>mx$?vHjQYuXJXte&%|;%xpuIC(<)8mbu= z&ws1hD9z^N@buNxGA6gWYqI>ngFtfT^3x-Q*F&()rCay5^G{HVmTJ-z<0~q#Hj0z)MQl&yGL|JDO)E?iB9CVi&QkEVRDZ8il*giFQRV zi)R)~YJTHU6sQT>2}j2bEdiQA|F4qncn&*1*y3@n*+}elmh&z@nMY>#PSjLvZaghl6W>poSG{^gjI) ztb_bJBG6{=mEvhjdG7-tYlgxoT}ig1Sjf#7vx9{^x}TOyf=}{6<}D-whO>z-lc8ve zv$#PhXB7?{(8NpCiB#;XnxA*XeZFeu)M)v@;1Zx%@$1?tc%xXm}r7PkvPaPlVy~$1R{zJZ<5udN=h7!pAhWJ^ zNRG^#IB%S0{cYsIG%-l~f>mRP)4n zwO;oje5y_M0=lQU8h-O*h%)cmvU@!Q$eGt$3Q_IYGSZ7Ez&s_7D_VYcKl4uiy;KAI zEE8MX%W(Vqs9^}-oWy-G4>LBO?b^A;)s}q41eWx!{=r{%=<-`b7qDcX;L5SMN`INXE5sAb9y>Ml4E(Yqg(n^7HRr#Ezj+_x zrPuj;6_aQwqE<3*0BhQ8;rTvH$hn-@dkzx#c|?RmyXE8{oyK(I^>Iam6od z_FC5)J@_w5w6?P+z5KIGPeQA?d`fj9kBuBD?fpC2Cl;m%?}yT=51yrzB8WWoWP-yt zrM$jpr>NgEiDhr8`T9~#F1CU59={E6WI7wouIwqYsy!QGwRRX@Bx}uv=3`1N`3_wy z_O0+sp-00pK=656NfvKZwd0-s!WIV)3w0B|Kdp2&3u=5j138g<#{%J8xSJi3HZGBS zlcN<3$e(iAHiSkqloJxe=v;-sX*U{}&X-`fkcsFB{$q?V5B%_-yU5_aURb{hHk0T+ z7qO7pf64d1%F@SiUN-g^hLc48%!T(C&%@^I$SKu0l1z+OB@ZSZ46kKWe85Vu|0Aj0 z&G`#Cj2p}O&D6=BrfDB0_r<-~7U-^XR5Z%_lIUQy>XQ`CKNVQHIbc?gYyFE!?j~+m z4V-NWE6IC(A5H-8mWo+-CqL`S>$f(MKU}^3R9Ifw=8Mm9I}-QP>qElVkMNqTw}S`S zn-C=|Ka-(aLzf5~nWe;wWY_UbUw7(=Y!&)0pR)%pDM!!8Jf%&1FZXJw`oHA=_(;`1 zp{8$YeUp5cYm;M}^JfB+%_%Y~Sf$rdsRWE#8#dL%%TKR%?x)Al&S3QdM1%jEf4swK za?_{+XpFNCS>dOsrC_!#btuglL+y?Ne%d?IZm@>eaC$a=3sE?5U; zs-ZL!7gotT52(gv8`w*y6q@aFoUlZ=}>ygmrIAB@ClcY-0Q16!cIQ{ z8ws7tGG&@HgWb7EaGK69@-FDXNLhT}oIf8xZ%v-Uc-qukuW+!z*L6NQEIzR+rJ+Qe z4Ll!@*pY|D?*|a{79r>Xff~^FitRs-c1X&Bu#^CaR`vmQ8{_yOfWzmKtVMXvvBFW5A=v&mpcV;sJ*2sk5rZo%OhsAY z!9f&8N>&RIYa#P2=fuspJm9okMs(V}_~$u~l!1lz1B1iRu`VaSPH+kz3>_asV}Rh@ z&K`+KektP%-e&!2RN$M(P;tM?A7()F%f>R5E}JdD>G_d9`TG5Q^56%Wo2KSAA&d%G zzg>wwkVF1pUHD&f%$<=o@O?>gX_WLxYq*j_Q%$Xy!mGYNcb{X2`uwDClJO=i1Z-IF zeN#Whj{Kkb2zWL?MAUmtM;$YvHEG8hHrptm0uAnHwqim&Q{m`KZSaHvkYp;Xs_E$t z&g~s%An%*ZxxGY-Hbn~0i_#dC34UjDs>5IRt~-PY%U*UC&vCL!8=6ov>VR&a=2CyS+;b8)W`!FpEw=bx zY6QvqJ2x-60ufhc(*~2v-;Eb35`IZZNR#v9gBKm^>gMm za0`)!%~Z0o<~FOO&sx*RHX@g2TqIV*x_^MXnW>!@ti1zYOe{qb+x9b<9o_eCq zc(H3e-^8!K@L0~m?LN=)DDU#OBB+6iS|`fB%ZRl7N|eMBmL!;-#Fb%@x(S1sAC(ij z*Xc5&!rxg?9aKrE`*u~I)}_h~vf;u0C-M#I4*t1Ann{frfW>qg5nKruTOuB<%=SZM zuS>}u20{cop{Viv_exaS9U4C0%Wk!YXD>9@xo=uUS5!yutEM@+m{haziRU4(-c^(4 z+RKisP-Cvgw3#f7bo4TjdmG*B^ocX8s!s17U6ts*wmMaS-E&r@b7>eDvdPNMo{&Eq z7Kt3q&K1Y8Sj}vF4FuwP*?xNltO|#Rc*fB)?U`pedIqxnbD>ShL|?+`zglzA(OQar zEyn&4%1-DF9jM*hl$r#B|6s)*pV zDF-HoBbK-}oy>`6fx^Pksn$3;%f_`OD-M5e0B3}YCKG*Jhh!I5Ot9I8h-Jzd zn29D4Z(tMA0ywx%{mT}HoRWvk@BoYS_7!J(zlrLF6Q=JsN|vlhH;sVTtu*wvRXr%d z_u#@*GKe@W21SYW@&?)><7$I{2dPY*cSeKP`4uXz@3UGYcH+Z8DNf_StQKh^MK}^t zseg@qF|H z+rY^w0Jl)hGBHn{{u%= zz_y!=&dH|R;CiW4Q(Dk7x?4(13qNbFdvajnf)kn1mXKb!wJ`{=1aYQEU-`j>(k%kI z(zeJ-QlH#^$^3-Slwcei)yB#PDHUTc37Aef2tado`BSzaQ1)TaBi$yb_e7Bn1-Agq zmK>*ky=j48k2UA8eZ4d=a4{=4+|`fJH72Wrz~){J&&;g?z>vvFjueJ<$en#^_sr5# zaiFK^OX(JG6~cKDit*gOSWf08SM_y_KpdN_1O~k1$6MuyJdN&>TtJNat}?`jQ>^>f z()}Ir(2F`?CzT<&Mxun<160E_olBf+NVNBwMqla#1zWN2 zmxLTbIYhfAvmwOF6=PEjtR#vOW1NZHWU`)( zm>11Wo|BAf+g|VD9IjH|Ynw96!65$lCm_6s{cv*05D+GEm&c1MOb2bGI~GJD&sfYx!bEr^^zW!7%j_8f<*`kA#ySM`*XGJHD@VZZiI?Ce; zufa(dd09y`ljaN_V@?2D@4eN0Ae2cX24|EDx$_{3>Bu4DPFs>6&!1k=x4trUcmdCV zCTMRHewMw-!}4)GP9C`InUa!cn1*$+&6SpjKV`|R%!4Ln%Ph~QIHA#B_=7XLtF#P zB?mY8v0Dk&mb|7X!uixMTd^o31g5PoOpRnGLkJ!OlOX7(^9PqP0B=>3{C_4G*2UX5 zxrCTkMbeAv@d6s2eH@G#=Lp&q+2bKK>Br z1Ct`uUQA^WG`%g zEP+F>clYSCbb5CiE>G9Yna9{VIR6q6Nl2@%wiWPCUR~DNzvO6~c}g?8FiN@!Oua-J z!%N#r5wi-nITX4Z;-o>gu?#0+yhHEX^u_5 zR*8C9_>=tcfdAPMaB#8^@9ZW#_1EwYQRVT$1?-g4Iq4L(jmqXV0#Gk25VDa(=|#_Ep55Uph3dr{ zt;b&WG8Wu`xb_^&QOXC$rKkDO>(rsLwqi|G&#vHB?>i3#D=@PT^Ri#F5@4sW$50z8 zSUYqXwB*jO43@o)KqqfcB^`waTbh3`YEVQnf*o!#J4ErrQ?HXL;9oitJsFtTo`LE)xgpdv%ILmMUt=7g$=TJ5v|JZj1 z?&JjndS$-5m!8@zm3MFAGMuX&xQWNcujb50{4GoRClXYSAKrL^lwL8R(?rW&{|m3G zKgHEGAYO}lbRdhg8D`qx33x(vYr$E%H#dPiKb{#mTk~Z_dZ1BJS-vGrRc`J4L zyMU2Z9L29!glksk)~K_oSo&8jzgh8oosHIVz;b*6iamSeE>F&6C4%*qXZ}oW_+NC+ zMF9xRjF=<*Yv}UH&8Q9blKmGtfoY5l0ag(sLXWBT_wF*8(+zRbo+)9N+{rAq%zf*q zx@5x?LgYqm%*yUG9S-RxQ^4>u4j=Ahm>xQbva7L{fICzS@cwa9ojaE?}+?Q+g)}yKSCR9Z?56O z;RE*I!BY3D6wC&YmC^*&_J%Fc0In=nnPFcn*Q?3wh@NWClK0sV?4U$%`B^4tUfi%I zIVJrTr-gopYA20Kepb0gi)d&(evsMtcfTpLfo~TH2s4+y`r=W^vt?%TI==~R@RmnO z*Y(b*tVya}(f0i&=lA~-UTcUUY@N-#ERYXtaoE93<_FMCzPKxTap4!9?CaWpcbo6; zu=&31BvEQ!29=;Fmu$&k?UZ*8DMA3BaS>T`Rn`H z$GZE9sUTDSjL5vsz9qHZDk3?e)pB20{o*i^sn->Tvp>bgl(#%_Wa$I(Mz)Sur(RXC zIO!rv(F@Ap;00`f3eBIFn{v81w@?GP$hV~A8|Hked}*m&#X*MNPWfvWa%!3q@nkke z{O^Y+eP>q?qY~ZIY%45vd^Gv8FiWD4&f*G-W;)#xTeeOhAKV*V%K_=P zvsd$LMysTOR|B}rrZ(Ff%}r^d8_F(OlKO-N%P;w;@JjodB#tOQBhnW=sx(=#AzD?Y zFbKETS>3p4(bG{7J+xJ(K#3^soHkQ$l_XE}Zus*kP3wV<4qc69bubt8)cG5mMoR$V z2=&-J3FpVrGjntw2!(ch^EL|ki`F{6shf~*;u`?pG}dz9oRDv74lmkhtceXjFRNpB z!OU#UR)(unakUTqQnah7nk8{Y3))b%`oM1$Kl-iIulP>HU4&7da`}n6Ll3*DvxPhy zSQ1hP74rua&jVNfyMgn-=WU$ANgKg7L?me#ok#LzaIvi%=PF8Hu-a4-9TS|wyUZC) zrNQy4o?%@2i*OhO;eUc}Fr8nfuHgjxQ{#~&o-@E215}S^S&y-s*kdAB#Rbrm8jMPz zDP7B$qO9hID0*g=(qtO5Y{_6HDlluZt$RjUrnj7h*`$DI^*m*ZX{v2S?wXf72kB}Cf_9TOjdBD=Y;3Z*^8Ht_ zt00_M6%w-2v`JO$qUdUjDBDe3=#R@Tccn}1bLkI!5?K8IjJ}Jkx~N7v>>uHc*6k+V zX!#!Z8@Xvuts+)TXIkoVV^b|Jf$jG-On0c|{&*iAWtk|Ss;DGZiQ2JKCROD_x66SX zEth#wUwY>94~5i4-pld%jGwv9A^98n{{%Ng*WEsh%*%S(MG@7~#49&jVY2c){usT| z7UdrQV!BV)|DXG6SZ59C>l*dcTctU`^VPii6#ISS*TL~-oRP5uBvwB&YzjD$?kjCVg2OE@`%U-2|?yE;cOZT=kK16l~t(MG&>cT2xYi^0W zf~*$Qnhne?yvhRJMlpB_rxLIbE$`&Oxxrv*d{OVb z=G>WcY^~?knC5kU`v3_Yk=axm?V5&ScK5V75P25TEdEa>YuNBcR9kZN{$Q&W1? zNGIC^CR@x%fc1Z%zjzCnA?8j#SGvma55#kuI!46X-->rnYK%AHd2^7L`4(^M`?6b8 zM+Zx}ByLs0RpUnQx-WC9^B2El-}jcL-&%Fm@WMZ3$fH#5k!8>H(r{*VI{9+pFU9>f zh0q*|{4%9`Y&n|-aya`#t4sGfoO+nUsY75G&8>Ct1CkY|0z5+=lLrJpNedy)yc)vJ z%RVH&sA>ui49X+;z94;`*OX{q3rH)XQTh?jkG?0K8@;Bmj$>YH zu2FRyR6)2w{bska4*y?PRjhQi_(B__cB~?^?^AKFRV0$fO?vDy4@mrM3%Lfbn{?k~ z_bpxv$5l3eb?b0RYjxOW4>~^4PTD_2N&oI)rU0O!N^WJ#u8g&dn$iHNHm;ZstZ=Jhlm!Q!vZ_))a%{Dk#%0q$ewv^xKvaRZhrHSgVUKBy-vIv=r(@p4|H;h&DM-v&i>y}oz+!)DjA z-b==9Y2Vh8KR^k;O#|G|??yUW9a<|E0LS~ZDPGA`ROvyMmRoY8Yq(dgtK*2rG53{S zeqRZ$`{wE~`@i<}lV1vmQ&aMg*79?!6AGr!bSSgtnYLPsGK_YfM(>c5i20`O@mKv6 z!5|dgF&Djw)N?%l5d7GLKNvg3eBMe&Y|(o$vo6+=t8o14^yeog%gf^~H!o|En*T_& zx7=+a1}RwBF5f%dEzokb6GIX2#=UPyM_n2b0Lg=fSLa)@0NSEFGF+6enUFpeB;YKg ze+298lk=N!9>ddYUT(s)qRFnXJ>-t$k_#r$^FcZne4DQ_8^+|Wm=WAc^F74GmlR%; zj)aM{GKj&Wih??)3fo$}e;s9u%Ko;YS!&EG%vGC)F14`OF5x5F?cxqRV#kJ`hidDl8dY1-Kf@2E-hjhq;|?Dvk)lItRu73Omr&v9Z<%WDVe8?!6=A;#Eah9$QffuS^Eb^V4rmsu*{6n_1W6( z;1@OhyEd9NnA1@>I~8`K4mV^rkqxjfH@V5n>REoc`KQeAZu|}9>1cEP*89N#tbn~- z_n8Tm3Y%;`*)%&OB6$Vf{h0iWioOk%$wQYtt9>J#Z#%H5lzNVlr{B6Ld2;$KHh@GO z({D{o9)}E@$gHVu!L&mAAEU)Y?!CfqZn7<>-?D>YT_m$tem)y#dk}T6nToW$;pcjjYHU^l7}+oI3?~~5mMbk0iM~!C8Radn zqn_186Hx3_o4e#Th!Gj@$wK$;qTd890z`gBW%^V$Sx)0-L)k=H36w$s1!Z<=@=Bc- zi?t8P&dXgI>zb@3GLu|yBPTZz;FR>pU;sX2Z|VA`v|zhb(z^VqxbDs$v=9VUFTm$Q zf5vD!aTMJsLaOsIa6y}HES_HFkDLdgor!0^*2HWbOgKw9k>FZ!r)7gs`)Srppe4AD z2srg@Y=?UFgujDtI8`!8zAcia_XsHo&fzI)!}sl>f4~YlC;#h5(#8}o@j9e8tzfL95@qVe{3z%rN4oAlRA^Gt^=ju8UTil-J zY7c0E90QW_wFcbG(5#^8>An4aeuDW`KfrEZCC;80LI_qo-noziJr@&_8A zqnUn7IbIdYhp{cKI+C~O0Ij1KEB!HqlghfswbyyPO(&#EpHlb;*<3O&l7D4XB7azB z!)X7XupNkg=RV*lU4O~VX6x{>J`ael5P4N=QBO|oPS&DUx%#2#K#fxgYAZEyS7mFkKY1wuD=39A$5KTCcO*v_(Yg@e7 z(**Lwy_nxUnXSRy-VL{cOY*qB@hpUXHpv<471hx01cIEmTy-d)9CQ(K3; zN=2oi4Hs5I77rS*mutQ5=KX%__0;|8X7*wWkL-I)e4mPVGqRa`{L zU(eDIOGGmEPe_G`wTw?&+OMdM=U5BK79jh~nn^8O)wXm4Af$i<=H2O-cN03B55BN* zsu3%GE5rLL{pP1gN|+SSm*ePD<)72=woo~{l~+m{nAI?4fvT0H`b!+NMAJLIqvtn{5e*Qe6CsbXT7;c2At&ogfaE%6m()} z&4X3?S5P1IT9t+04Q$eUku~~%Z_)&(P(+lSp`y_wx~C%&;mFO3!8{#Zwz-5!jIsJB z`Taj}8+~;$RH-|eDYb;u^dGWe$|WUUb~5uqhrMhaUqqMnj~WeX+_HuOBj6?@*F-l= ztt9FYF=3dTn-V^2!htsbl|dFlg`w_P@Wer|4>@DC(oOhVvAh!)okl z(^QN0xuk$zx4Ekj4@E=f$2u*xY7JeFx;{!5q z;JdNI|M9+%)=!0w9}6IH?V)Edu8<{@=GHAPd=g?_fz4Y zXW$}$-%Xwhh(;%I-%ZujhT$bSJbew(=;d8_Spad%mrmI8r-+@$L|w4-nVJL!pd!{9YCIvIH;m ze+YsEeE?#}0Dr3V9(Nm8BB~=;$y*b(qh@UkHgO-ldqhwU0y`vI6WqnK{rUB5h5ixu zhaplHwY_Lh!d(T5nuy;$x|3UHH_?i35~qvDb8p7SZ;E%{Q1dV^`=9p4U;Ual{<3Gh z@s~W}jlXEMH~tI%d~mS^DB+&Y27a~s=GGc z9iCPtZRBy7laLq6T_Mt~X(Tg)Fo!D`qMpe!U|sT~=oU_lXZv%5y@6Nd%I&I<8=$Wn z%VmfSQh+4Xi)KreBoNH>$+xgyF|;`nJS_q0X<1}tzg z9v*-S!Q7vJ5BAR;Go$W7_^v`Uq>EwaihX&FF(fzxIXBk)uZ0Wh5Zi`3{O4x=yAI*M zort5ok0HRjUK%(~jO1}_?rRUyau1lS!+s%??IAt_{$(E&9O-5mvr(=UjY zH7f(O9wt2^x>3LM?8)TtjR*+R@}Eye5~0|&>NdRu$s&5i@7VCyXg2ppLzDEpQZM+e z*83v#i8SKQY*u^XVMDoRT60f_!WHHP6^FEdN2K1JR1;12SHyF0=U?z#Y|PE1h)(A- zJW{zvTD$7Zc)p?rAp{2VN+Q?HNO)Dng^h&ku{p96?$wNfIVP*mm8?#Lq@?y)lG@t< z;r!4}Ow=LGBU!IkkBS3G{f9lxu*Iv#$Vr^_FhhvuNLb+~w*9Mj)>&~oTw9+{9-p8# zR|~C03}r#|fr5!#IQAI*sBX?JnGq;f8~j%Y4tA=r4oo!s3rPVa#AGs zpo#nSoBb?-Quu>^&blS`rFj}`pJhPC@7&+**s#IJAGq2tIN31Hx-;0HbF?I7Xs9F_ zgOg!A3RPYppvrm)Skx`F5VD-&4}(5Nr~YBP$C})sy*j7L`ucBrwX8Akl>x{uixNP>ByAVM3J#6>DNxaRk9|ngQJY@Qk-_ zdtb+~iCHGrL6B+|Dg*}pXO;CQui#`yQIS^-JzT-uniWDX+h0+HvBAU{|L@_pzh_vn z1|+^V*$8Gy&@*6493E`$eOJNJ!X@y_QvdB7tf#R2{rFX+Cx&0p6X=LkD0t8SIT1W- z;jxyn48r1%MMcyBH|vrg4@uR(S$4&JyzUAd#SpwvXiE*K`1Qd>y61|#uZ^!RoE9%# z>&DXky?!WE{E@e%;piI!dE85Eli-YT38^H$Y>f)p2PU_xoZV&i&P^rkvleBVd)9qC zK(fwR=FWwxhDa|tAl|svNoI?C>=Ubj(FNmx;{NqQn|R@6hw(nlf6{v6>;kqOHFSvAsw{3~ zkM575we@}WRrq$x{@7Z(e_=k~vOn^MvW%*>YTQ(Ra}YMc@M1Ry-+P^;mT(v>^=bbV zGte7HS_Rv+ls>n9vn-cABz{L(BA0;Z#{m5N-}eb@@X*6$(1JUbvoNc2{smtO>9~3n z!5Hu%je!73Sap%7sG1du9Ya?Z5gV+jIKKqGSuZntD^eQ^Hx9^SMfn68UXB`C&kyHc`N^>+D$dtn|4np;d=X=s{93$y8q(XM4MZLZ z@nJIpKUjjl;?VD`Jl~}r^p{qnb;0TDdkeh-^bYl0b7H|%{!{GfF`GYU+kI9EiGkXu zs4MHM{TQDr4YH<()ri-3xURg;%K?uoICDLHo~%BnSE$Rwl5s^#;rBk|S?U;`(Z_hi zSxKK6mp0SfFt1a9wiX7LizwJZ#mDbkqp)pw^w}g_8Cw&)42UHUk-g`!=($QpK>{E7 z5N2Mkj^z(m4E-VCVRg}t60Xnu)Vl79boZo?QJFwYDr7nz%{SN8KMC>ug6%Ezwseo} z6uS)dhW5Wq$&VgBy}M-$6m`>pd?8=(U<6An^FX=_83ZeG=jPmFsh48oHxUq4k$G`x z>Dt!DElpjgkXI7Gb2w9vWL24KE_~gfe{LfGy}cl!Kv6Xa3cJk_NVU`P-~CBu)c|nZ zRg`(&Z@gf;)IlpITJ?bfQDkiK`e2)Z(#cCMAJTh*=r%$0uUHA+6i{cy@=NOSr^KXK z%1x2BW))!@y%5nP{Jwiy*?r^=mvik{vIj$YXxqE?^B zPIpBdzHChevGKh~-4&TL@9)Jcf0isl{`3tJ!dhn*Cd7x`{B zl2>EV=Suu%uio2Vx?XIzNo-_oMRVgjOShZUEF}h(WqLE!*#=3lkDh7L^W}T~-nhlf zjHDM%!wf38EYiaP{-V78j=fZ+mmGj5Ps*D&Q{%K-#T3W$N8`{x7s&>GKa_vr>$aD@ z0w!i{@?fc64>=EE0jRJBdG}n1=;F$u%X)F;hUNp@1W6`9$6H*KYI19#5(=!(bj&D8 zWi~XADxG)V0i}gs4Xm&8>wD!fZ3Iu7tV&llD}Pw$R*VoWsY~E2wJDXbe`P7R5zC~ge z^!=9J<2YyUL)Slyq*i)(T;un$qd>)Y{v;ho$KuR4$88a}`NS+#Z|X395xMlm#WSJtxmoU5XdR4AA#t@BYSn%EeTU z-zNQPSD=BLNxI>;!9A4GpEpffzcC>(;u$WY(f;#*wyNiNo!Zo|P$H5)%by#Gvc(LF zG?y$sB-;3R@<35Na-3AMdHT)5-(&3QikFR&g}p&pe0GrX1-y_0%NJ*8y z?LFnw!4Bxmr28?Zw5BDVzsnT|yjA}2|BthG0gtLW_x}?TWx(i;7ByO0V@++Sv?d;{ ziC~?9iSEIP2Ei6Dt!bk)ZEcM@QB;KB%xHFp0Zxl8=d?ZA*3)v@dTLK8qM{~<33%mF zm7-R>?`=fX)^PEX-{-s5o=HG@&j0!6d0_Ts?R9zAyWabH7n&M9n<5~~WbCd+)XVMI*yV}h!t$B`*KzBaxDtyj$_lRpF z;c>4r%fjb=^$(O76graBPD?#DNULT*kX2j2^YDSe7zToOzW*jY*I)R~M%tL00QaVe zH&ciHG`jcoa`PBvReadCocgJh0u`IxB67$;ej!<~wq!yOn z8nd+dlzWU+97oigP+?Sv>odS79HR|3A~*L{)p`O{uV*&5 z`Zv$DDOu%#O6Eh$J43mP#+$v}$-M2jMyauAdRFmka`_F$hOkA5f_sS{CYd% z>0NA0RF1Vm7ymRmSSh=V*1bdzLrx6F1Wyu!S14w2$PE1BD{Y18oY7iLJtG!f&SrTh z0MOQX19b`$?fMNS(X=du)55(X~)oeX4YHi)=U*M>2e8UUBa~j zgG!w4ZD`QIO;5ZHy?c(?Ik#peYrl(o4Ow{Of)Mfos}IY$*I)g1Ztk$xEFa@!lXeQI zTn;#s0{{2l(d=9mq3BY61Pz68aEQZ{x`AWBP(4Lh!gx97bM&*74cc={>7Sls*`Mp= zgL2b70h2KGxt))wg$OOMNr{fFs98nF>NowJQ;U=$|2rAcj?`s3C4&mv-P}D}C=eo) z_CxpIq6hlZ7ettZz8{c8@UD6v?*OUiCi8dHtfmZL@8UCoS>OdqE&LcLd9QJ&GWugW8n|RP zXB8`11BMq&<|p*!Ej6E0D#|nenVT&6oCWgIf{KgysZ;D7A8*hkb%<;un_qLstS~c* zHih<6*SK-+wm7~{bwlmj=FPnKjJRGGUNgO|>a8+sbhoNG+XZlUkvWfs?GAudEsK`S zck>;k7}vf#2tAuSn&fh0a>>z^jgL6zZdB{+$?JR#!z(38)I)VK@2NQCOe0mM&Gc$B zK*ASn51mDw6oO34U?(#%8bhs#ns_*->=2rO_C^`kD7 z=OlTSEi}Dwb63`Cp zS7tAXPf+S#;Ze1>F_u58G`67Mm#njyq>Ti{5I^mX36j|tIdg4SEH^4S=2c86N3r7| z+$ZBb<8IaoO^GodHTHJCJ$T?pI+QvEgUNIJ0nPdokh%-~vOS?sjT`2n(b+Br*D^tc zY1IKg8g;N(q;(0)w*f=~Fm>R0!z7Ci&O)1H!`H!YfYrpz)fIpmH~9ETz|PlRgHPg?`!L@Z!HxKemmGVe+Qe-3rs>6TesV;T!6!-+Z!?OOE2{wn_g4XrT6 zPtAQi_)N%|grH^^5QNso)rR`aooFZ(XCE*rdY~uB2Ug0mYHUx;S-RE~ zYRZs(ECHv{2?5zC7opI57auyA6M10SQTAPv^#{Ui&UYOlAGFhJ5l%5AIpI3!YBkqr zrrQ&oDFgJYVHq=>Mav+(B1zfBT#O*2N+I?^A~%{H2W+tzU!z^L6_5|_X{Hwc5*TYo zWbBX>CUl}sM4a;8)Akil*@t;85<1WaZTKi^PR6T`H-EO@knNBZOPuJBUqLXQ=<+3My)3J)jL`W4=( zU$LR{5F-Ob1s9=U07Kor01y@E&5b8MBjB z@=XKo5p~f|Kzv+Sp|;O3cU`o{v8(}cxo;;n`&`7jwv~1s0P+sJIbnl27{FU2;cd6Z z*6S?#Ks^+)GRmm%sf$i1?ym|=Qb4i(jQZU6%!J(-M-B&4YzV9NBkXfW?s@@5YX@cDC9_O(WFn4G9{izQ-w0Z#%{_CY%O%nbgO>7 z3DH7a2{^o((7GbMKmjryeE6{+Bu$M_em8gT7CIYJ6r@yEhugnE&-CYHziD27p2jl^cS3Bc)<@0A|s5BG=u3O>8K2shfV#Kp}OZbN4M`(a@k+$jbb_ek{;CHD}b|}w_RJU!g@YO&$U62=c_ai1OKI0k`=c5 z7wP3`JhXOo!oEYJapmmv{79*D^BOwh60|3?-F3`I1@{<1F0H8;I9>VwU$POm{<}3F z5E$E3*EjW`(*CKUFeTkn$70{E&GfLnzOJ*z?2vlFzrYMVb$Hhe2bFX_SmfFRE957I z{wiQ^9KfrTvQx-s+jrL3(ykklCj0Z$R=06#-Ho5_n>rTJZY`<7!;*3JbSep^rq<1W zX|FdtpIx(fEo88+MnOSs=%)7^V8Z3t$q2_MT*yc!&Z3)82-15Fv3HA8+_~VVh@Se%pRSkNOC1WYTX7Hl zN$8j13M#YqcKs@wLOoR&^Q-Yugl3sUaUiR?>)6qDAT=ZtgHX4oDS@lD22C3q4>(YCjl36^}zu#i}@805Q#3IpcHp z{0jvTY*a4oN1Z=xWamJ7O*t;7#V0ZfZD-~cB3&Hf;ay!7hL2+R)+6Lsz)2XjWGki2 z!cNbtq({Kh6M9G2DWEIp4{ux#^O?>lSW_^dnbcoSrh>-mH-Wf1`bGVdU))!U`FRxQ*qg;b356UZH!vs%PN!P{%!NS!eqVHhR_lLf5BSe`iOYF+zdPx#Tha6yLs~O7N>yB`Qa2) zGU5d{R6j@s&Z5oy|1nq#Y$L$z=BIY3a<-WoIE7)L*c5of#&8oTRY^BNz;NBGhITif z?lKSUW;8wP;90kxaXp9YCFa`7x7>U`u6bFl**@mE8WR zZb?Zc?Bo|bV8XIrMc5P?SJn3zxSMZSaA2g9IZ5>3!}59GB&=EfvWD1dP!s><^WK2# zJ+5QYL^q*br%+z!wGa>+PG5{eSlF#@2^i4RXe=(o8($W>)y)T!2E^{L2-p)j))+t+ zYA{_fUs|;sE<$1jLzLJbZgEhCMTtr_BB8M8A!@=V*Q*NFvZ_LRfj6Vtq!}*YC)3ri z7p}<`EnK6`BI2r^;Cw2Xy+qu1z;w!xqF}tKI?5`yc=d4zrk<8`*aOIlM1Oes*om1y zn`Y0BF@%THQ$RK%S=r(!l1?Nftv^pFSt4ipEO8jqq|6;7^gQApz5;7GCl{aG3MQI# zBbM2ib~PuQrex@n>3wJb zq&d;zX7~z`s0$8Zd9l7#PoZHu7H?m=F!0dF=HOiVAURdgG*zNf!xnMK*k{8;Ux1Z9 zRM&a0*?;(J`n2j&K6BH%FD3UxFC^a$mPyMBzb!KG-hsR9+(yNqy#a4c@FnaBR=$Ca zR}t4jMJ4_cDfTF9#LyS*@8NquNPhYKyf>^l+4h=Y%gxAT<--xaT3y8u)LGNgb9Y9- z>Gxx7^-$!(lTPM8s5YLP8kJA>vyvH+Ixi0c610e-d+*rfe5G@8m%fYiJ5$Qwoay|UhI5kwSOe#TRO zJYW7)M1A=K*JR9U+~VYAx7NAsaXLC)9R;G!qN91rptS{`?~>ts@nn2{S}EJKoj;&S z&<+Xwml1hTTF#cqL_UE4A@RvsC)!=>EIJ$1CV>wpBF~k)9dCTkxvfVw5_>M$Q0lxU zx<-DF@?+@ZG3Cn2w9a|N$!Ja+AD(*%r{&E1V$r`S5vrPIId*cy7FN5Nx6V_NX}0pp zR8B-rq-oOSHRGN9It>Zrr;*E#iU9Sa2vT^~c|7JkVUsqnjw=4{RH6#RnRZ)i4w-tOJ|g{0*j zfv>VjxP)EIJ4e7bm{)7p#3o}sl?hyQ6TAVtlD_y2R-*B2Ys52M3iRTb2*=-ehCv9E z!Nc<7Vr>SGwZ0cnVe!+3;-_;TF2n;j2tkLjGZ5++#P$AaFqKLW-TwU+miq>(kDGU# zgFWKqje7YfBT{m*16yuOEV`z5)dDxyS)?Rt-kK3#oUJbwxFOjvFKFa|$JtBG7uCTG z_=Qy3WE!c4J~khMgBxXd3a6I@6YG1fvc9S33wb2M~>fxe8nkm zEZ!A0U8V->50#1pE+uO^_$R|zQk;rEXJvbtG&!Rlac??k7^uWd36f+ltu#*oFQ#Ry z561H~ACjqq6<|3^I13Qj_QUBx+jB-SQwW3_*{4(kTXHF-B3laps_%(*eR#4wDe4)K zU=YTtGI~AHS@auDun;NB{s$L^@p1UA5k{HZh#KIx$a32CK(snqxR_PAXf0g0x?t4H z^~)cZzqeN<-~|K@aUpckC381oJU<13FVZ@Zex#0%kvUa6M?RW-dgtN6f6(D2_Sn+{ zC!g+QJnl0+o%nIAhQ>06HL}R_@lhhd>_VX1tjGu{J0|xQ#;g%8?TI&H26Ap&bL<+) z&oN{+Lea8f4`LPAIZ*pS$+=jfG5OXpdPqTpT1f{8gc?jgp~E7-nS&A7ivw{oZ-}K( zi(8VSLx_+jdzX_PO|b`S8UOu43Txc<1&(l5BTlB0hA^$(X(p|ot?gyDfT_*N^bt!Q zOMigjYc*GzBDSQ_FR4&q@f)+3&{W>t(6xJvbIV5h=seJq_Ui^dUE~M(@-F9r_4#;g z!|7c=URL5P{vD-k;*7ERD>p>DJ{oh)vu@)XnAUh9adj-KI+lJ@snv<)j5ogSsR?QO(dE%2m{`tAI7yJROHxMUB$EWJwM(Y}w#)6=TpD zDtg?*ul^Lwqvt$Y$B$wJ^m+ro`r~p7KLE`<-o~%~cr36Pe?Ql6n}_D{E-nw?pDL05 zsy{BJ!-{z6v1|+a{sUQ8KOs8 zwCV^H%OFN@JoH}Q6>2B;FXG&M4;1)bK_z4ac7bR%ZxgL1b!h}f-TgyuTu`J-Ag2B7 z0zJUwt;S6!c$&yxJI2jhC#Zk=FO7c#>ZG0oB<%QD`9fLKv|qso=nA&HlX+Di6sQTg zE?8!+8OR938_!yc&#b{(Z==O$?dFP*SF=yJf#~gF`80vyRI8aeuo@VO@O&I?NS(#+ ztuBYnM`J)nJwc{Z6xkjAyi!ag_Boafk^5nGjioa#sOTt6??fztOp>U%Ov5CZ8a>of z8GbrI{1ELiOd*gVnh}28exX=NAi*QH8XCcbmrR}rF|zBghtP4GCi9I%+nZjHpX~L% zUKVVn`0)6U`&pdXHUoG_O953vrZ@sc0E_?M*W-7yCd5%@!)nEr~AwJNw!^H zQ>6fG#pAKSA#p9xtd>OE+GPIZF6iIf(miERy0i1~Q(|Z4C!f}opWGi0X|CnJPKJ1B zNR|oTwT#%shtfs$aj;1w-_2(u5|G6ev;PoS^pGs`{n@w8T_tztV?48nhQ#JI*Y!8G z4w+)-yTq~{NAMiEJIcCm)%G9dc$nCI>%-=fD7EhVT61aRxw>z)#}g2~!$wMRg{ZW6 z`1OsmrsXI5uGie+diVQ$V$cE?XWaYGZQRZ~N5rmv)7kmt9S3j@N13H>W^0Gho{y0?ZjYXzDl-T%Ff}^x1oIOGpJ?cbjZjG zFD1S25k|k`-2A1V1-&|~5Fox$r@5JnRG9QGtJc{b1pYObzA3MO>W1#HV@tvUl%%>~ zCu-Z&oWFEj>9pMB6XYdx=`l#5AN~2s3rs|V?nzL3xH$y}6OolJ0KQ)EkSC&KBxf8~ z;x9W}k(*5o;p=lejIu1RrpAxvE}`j4Npw-L-N2zBuhDgwACS&hY*))8Ob5@hVVmO# z%)`sIpZZcFqeTp;X5bSR-V*8)>9vt~u#FkWA6;Jh3$&?0@ zgsV8NCmE5)W}J1wcI*$~f-{mYnY6>mjO9C((#pxK<5#p`UwWpkCx{LNw@!nD6eJT7 z##!o&E?RXFET#e$vT<@0i0(-t4Ruw5_Lu9IzxrpnDTr69qFqmQ5!D611~vIL6Sbe# zjt#qO39J}fJ1M*htmZyq3^kajfwJC4N4)*H-iAeCLS;@S22i*nv?QXdkf&+WxVnSD zU3tx3Jk422a+nt;$64x=FNG?4y<;|}UsPdoyOMVUqefhg&H&_{@4jX;AiG` zkTnTW(PIUii+|#1Qwih`mZAT1fRnqC?2hxk$Uw}ZZfXb%kR8nE>KrCnO`cX3xBq>L zYct5)EpD!vV@=nm4jWOJjxsUxeIkXRVS+e{TBipK6&C;U%qZp`2nzo>2s z%PqQl*}KgB@Tk~kW7g)nt(;Ryc!zWb22red$bSMj$`0&IrDv8{&| z9(IoI%ZlNR;(=h#lzfs>x$I-yr2XT(Y>zGqFS9z48og>3-ejBAZP-nS?F-A_Ex8SaD zc~@H+Y%3HO4K)(sbDe<3pE)Q?G0SoK5$Gj&%r2(hFPr{GAx8PE?H=!vb*7#Oa z{?hW&`OmpVM8iQ*$szXn$u>T2*b*>{`au+eV=ocQs)n%P{~i>JN#<+bz+PMEA%|aU zz6#CA6=|;X?WLqT#{d7i+eZGmH_XFk?{kULH|5EQHU4exYN{iq5P7PE!_x_cvST(S ziO^Gkt>y*Al#!d>IGH~Rj*z(OINhoOk}@{7gKJWFoy-DWql%1iR>Hv_aaO+LtTd<) zJbCq4=(542-gTk z=wa;W^;*bb)5AE{&3!YCxLX={u`QS$^=87#6fm|A7+!gno-W`_ErtkMx`OC1^Kz zD#9SJRyKu6cTDPZ$oSgQb8;0dVWVgLhOZ3$+hFP6k%mZ*ppwv(G-cGEDuXh?=S(n= zU2EovFiQLn$9O?Lc>8C}VPAk?X>UTESxZ zzr;Jig@Op4B&jC~lbN38YW3I6uQqRsjAzhq`jh(pPhTI;>#qAv76bxb_9<6@J3#;F ze^gE^1BR02f4HLhQ4l4628fz6#E>j9(*ZPyT@rL-USH6~Gw9X*qQk*K2%XAKSr}t* ztwubO3KVV%e!c=>Gt4Qh^x@!c;}LAGW?}%n9k*Z*j@?hvtIt;>imb> zwe4TCTFJ})eyA<6mRfyXJY@Qa1nDHN z7f%XA4Qt`^+H!7^nEJQT9euktwGONNWhun2?aE?vwE4zPQ+jO`@u${|NW1_;Y4TpR zuh>tes&@GO5AGV$NhOR+i)ov2k%jpx-?mP(1#j+RfTC>;*dIj7OIGPWIh>;V$yjL) zsC`M%4TgRX{htXe-MqDk6MP}w1s&UOO3KUUnnb%=2;(gj7=!;~Ky9N(iG%i+{l`um zR{sALONND2V=^AMB7PM8ZLasBTyEN#!6C=(94ME}&F_#1(~8h|{@1%_*39=0d44A+ z5I2l=GUHGg*goqDCT@SWTfh9pa^}P|4o<6+!IeKro<|xYfpq}ZO&;fYoIrQuH%ber zc~nn&8;4_!W?r#R>J*T159><k@s+4hKD3@Ig7fF#I`n7^7HgF4Mb?c5ePX;~YNV&%cby<2tE&N8G!t!9U^` zWSh<9g*M4tR#oEa8#bh<3E|PubMNc$jd`^9is=L6EXf&ve!TS0&vAo>jSX~%-}xLB zE?6t*l5TB;kvoyTf4RPb<%wsCPNa^G{15Y@|yNgN~fi6;a7rYzC5b^>KpVpKfc$^XRD|{e$aJ1 zD)KXDaYRvSwZ8O*ZBq#bNavZ(TP@4Kwl1&Pt2Y&sj z%HYhbny^x`?1Qwit~sNC*4xvG2FbP7nS$c92RyZtY~pN&ka$?hq?wq3*$kx0;87BN zNBO9EP(Uod{tK!Br5LUyS5n>ArM`FnDkm(`l6#W zL4DCOl*AcG9Z{^;EyR#^0ck8l4^;)<0+J)Z&w|o!~BaiY|>h1k5!AqD>U`7_o$izEkyX-`e%|bo8-8`cx3*eqk@2f zMZaeHNPsIL4&Xp{!XwVzXOEiJSaF(@y_xr_rgCg>gDHCUFzKsU*9?_Em>$F@ zO^rC2UMd*O>VE*fJOj-*yCR-zBP(35j$BEUHC1=*`3{aJR%fcF!^zB>1wpxc#;Af; zlYWV_9!}H4l~YS6@5D~Vb^WHvA4=Kbk{6lZT}ZuGmjhBw#aTlnClaHbj>WdiJ)j&K zQmVxQO@^pq0^%GI$w(b>uQhIF%TKQhfiK-=7Qjz<(;EQp&X{v+tX#Apk(*wZ-d2Wy z)jfsdFS?Ae1L_k<&u^Pr;pQ!$W>i3HLu@cUn*A}E3#F)%1?mKaiQg+Wtv|PSSDEYl zVGZEtOlAC0*<&EjZtnhFjK^5=p1Vc&Wahgw0^(vs%Ia0FX>zQzX->>*O8IyF<^7@b z4G~-gyT7Wk=eN6rr?pCANNJ1ajRcv))$-%}43&)Szn_VG`RKuDq`dQVg9JoLJODWY zt5G!l=Nn};;YuZ(%<-(E{R~xAxNX9LTbJ=^5>Za;4W5;&c%*)PB6nTghy|3)LBzrG z@Qmj=f8Fu#TfEnPNpkzIjrGMwk*PRVO=S=xjGd_Ds!TAu+S-?K%n11;0&fLHzNX~#3WCY+#~Tq2y?`T24RpYQK2-(+|

      X7!lJO!(Wt&(I=#KF5;4m9EttUf>PscK$9%`2G@;(!MI zOaBe(AhQoXS4N5BlyaOoszG5fWUcY0>YRKz5_Qz{Kbu_eZw!)wfy(>jov+8cMxea8;`+}!EvgQ@oq9Iq0s@*3T?Xi96W zyYmX+#M2-%JCF8Ita_FHbDeY65b=9%zZWZy=RT|N%|71r_l&&7NtbgX70xYpK${Si zs;Me9HZiG*rT(ux>Wf`m7IbrAr;Bx6oU8A=A1-cfU1D+L1s}y3m2QNiHnm8#aV>Vw zrvWVPYC*LwmR@%NryKV851ytJC?c#vG$(sM77$WYglU`?99opm%-h>!AIY7~uCDb7 zZyLdDM_+FVlRlAeTNo&f2&+}9W>)%`Vys0{xVE*s-l*Upb;4HCVk&{lGs%#1BYL}%8jU3Vy5F-t z6ry8|=g)O+`UWN#L-}p|?WoU$6Xj(8jG-H@M6SW??~NCS`Uaz8DhWc9J4UCM1CCke#_Ufa_YL~AZ27u(HQ4kz||p_saMg; zoJ%gq)>>`aA_pB5LWt$xSgCf6xlQZd$<%zE;_5)C;1zYhVCWswjRGTvd;!u85^UhM zghEUw#Ht6mdLcXlX@ftsQ76E>Vi>?Ytko`= zi3ekm($vwxA!o1_B>&xgWfWv=NWTVm-~DCuiZ$#>{mXnjIS`6dCshIw6o(`11)IGClwfxshBTT2f%y+=Yn=SF-@OZ4hdMU$v5 z&?_{;>+7PZGX}Q)WmkaiqQiz9ghGG+lp2+Evj2(0g>&C$!M%Tma|KbpnpKf*nk+nb zGTl5ABDD|3bTs^R+$M8VI9~RCsf;Fry_*}O>N|!u1Q)8bbceR9L63@uO=paV06yf! zFT3`1ii0L|-r3ImkE@O#mY~+^VDSLf}B_8CX!8II}u1*cEsZKH3BzvNK z!fR%dUFLCNjU2i;w}Pt`T-C21T*C^joT>x7#zdX$t|>-=T*W)nDR{J8koqIGn4ObE z1aO~zX{=G>4Ab^+xJ=9%Mr0rtLoI_-N2~Rbm0h#n!n}+K=ww=%Lras#gs@4%x7A4_ zW2Lv1V=y~vF#X#5>AoXlL$?aZ!3lh1*SB$)vg-9WLVWNqAYqb00C2Qp#IhI8whu-R z80BPczCfHqqHG4Kisp>$WF~Jeq*!sk9x*x`PeZuEKa8Zi_qr`pf*ZRI{r@70#^8#( zO7a4K^EqM6ZR~Y2Pm1>;Y_$)bNwe7=a~smC#@@MzgfYl;k$8zBwhx}A9v*laU*@e8 zlguwQT3`Q*c zO`ImWs6ksW)eobWa7_y*8YNO68 zZrelN3n{YtPR<}`S53*Ed}6$Gr`rZ54mvBxjlvw*4w5`v4F`CS`rrVsp#}7D`=Pyk z{Xm_s>rUu5$Ms&y8KXdXnV_rwfh79bxdlzJ9az&_CvKm`b78M@w%6Jlt1gG11iR&S zg!d#3kvY3!TE6^oHOcwt2PP);a%*T#0-AGfzQRdN=%G`l1mT4|LUy0f%fZpHNP^ei zn%S{~S|aI}fbET_6@zP`6f4gJLY8P;rArlFewdRv9rc%+sJZzYZ<=x~6-{N+E1KZA z9N%mNBWL03EO{9>t{RnO)hxy4Y%`n;la)9eug;$zvD^+$XGn}8D01E-tC7MFViJqY z{%pyY)9X~xY%dl`H743xpncbIR$&J;PhWy_#51B`*h&QoQ-`T-ScXot&8bMVO|Njv z^zoJUH#%t!ADrZX-=Xm$&72UD1L5EogMhGZ^7tji- z$fnZ~_wHV^yu!&wP8TuX1OT(YZ39!1JphPbyie(WYqX8I)*wSjL!<%nm?HFCV-dpB zHoir(go|))Yvx?$&`q;@66(t`c?9$FE;5w6y?f4Zcj8~(XePMX3n5>QiV=+jnK!lQ z8EYFUl*Fz^pcG@~b_Cj2IG{a`ilUL0fIDH0637#k8P4L#hyc9* z3i}f>A6%zKc0&I*?@<1N?x)OykCcht^-i+*RX*FB5(#b_5NDrS$?Dp7RcR$PH%3xt zBg02O4|Ldem)!l zRT{!CWD+DbIxko1V%^BmC%m9ypIfv!~n{YARF=4S$V%)|416Joel)H zZQP|g!k#mY&+N-_$TF)l(=pT(*v?-H=cDdG?k$Zv4-As~&&^-a;D4ib4|DM^7~?x% zlpfjs&lrK$2)aJ0t7tyVO+bqDkZseF*tUAIieDo=JXw^Fn>@BvvJ5#n1$xmOkQbH^xk&w$ks< zzvd`xUcEktzjjdAExOJ)0x#cTd5wXz02HN*gOI_~?^bWW29Vh!Hw_b1hp-BC9+gWoSl|eE| z0~~>@4fcpA!w83`lX-yAy2M^i*l1==Ym_$0Q{HB_h^g|8)`r|b(og{`E z?A#XD{&|HG!2PKzxZI$2(ej)`9Yro-$~Dp+rA5oC7H=> zRB9&INV_r5jm}2up9bz97;B7P?xYV>qy5p#)xX?Y00$}@cv2BcIRf7 zPO5^|+?gctaTc95hx=tx`9d>YUocTY2FSz4w!%WsU5zHhQX?L@+MLjxn_C$%>VscD zfZS*;0cXyUN)UeKRR*uUY6*-nbwm(zFf%LW=Q@aqILm?cxIw(N#z?`v{PvmBnc&tg zMDq)z#okcPqg!W4SLo76WV_1dU!q!Rr-Lu6{^BgVaw_Cn>WV7EkN>b6ZyC^CYZM13 zQ-*z-5ogb)2IW^FsDQIuNcNEQ-e>3kz@-KK*ZKo*qeW=e5zgI@BubxTZ6s^R`LwBV zqm!vQQ84UiEk##A$zBiI9#ZP8tT?3i#mJaPW*^s5#k{sqICpZT^MwEAoyKsHeF=>y zf%dh8n!DyiN>V>YY&#-R+8>TDhTJK`#B{`IIUrwI1@8~b)Benw3ujMiIpXRqXbbQp zZq>cunhoP=Oep}zaCou^5p$uV<`pd}VT_N4 zmKbsb>EmAK91>LEfA@C0DgW8aFh1JX?T^a4MP>EFsUCrYv{l+bDY1t2ZNw@&|fkUn4{J5`} znOfc!&VONv^h*5stx&UcwU`_Z2#?e)==!bgV= zj0^oQ;dcj^@9_94nP(!G-)4sUuB?Qfd6te=VInDirvM!P-m48VI+#Cv~awJo?DWY8TgtyM1y#c{_<12 z-ir7|J(*h3lWrbASi|XxXuN+JJJzgf4(~5vs*n<9kqrrIw@lN_pP_t( zYr3p33YXFy`lZ~u@Er*fl2luGyuA1cQiRKkIXpmgnv8tBkW0Q?5*Fcd>G0+4;icI< z+-*zVG5lKU@}+c(kA#>dkNo>2E_=cPeVLlIy5v{U&*-)rVhr<(Kh}a>UDL%gLjt%~ zlhC2;RdGg576;ve&D~#QSOS-D!@uk|`cM|Ibbo_?B*><_4xi2h9h0osJS+RR4SpFPe8|elrJwj_oV>cH3 zf?;&Yw{6bgP{_$1BO8O1$D$ncb*eKfM#{CATr*X}TJ^FeBSl0tQ^+2Wq?56o_tzzgwY{s?QHw#+pxxs=-WH2 zzRhBaq|dAucv6onKf0ij}wg(XZY=l??UO8ob(E$~#~gp+Y45ck`i!V(+Y z2a16R-nX%@#8{s;M4@~7=fl{9J}*{HOv&4>cQ!#SKMpQ4QC5iLc$U1sq4Bmu`1VUQ zSpWW?=%c0{)-@JZH1A7t2({C}q7lfQ@NWI!wDjcDN~Sr9lTRyJsOJ-E;x;}_Mk5i> zeiH*2jN2-VzI7LaGsHgEBJvlNIDqd8X17Upd?fO{Lss0f7Px9?$lrDsK#_T7Zvk~L z*>ttaKzW%=K{SVUIm*fZ_^-5%^KlWsvB9R3B2M;&2`pCyZ{Vg(&?$_siPEej$DrMm zHbFsmnx$#Gja8y;+DyYR@+ftwC(6t42(=B;<@bbL)?)mGTXt3Ty`=9e@weT{G=EZ+ ziTv(Oc3~)@x)?pGJ8KFC4?`-hzea#Z+SCB_o=v_+T_H(8!#?1dmOJ@0|KA`=!3yv& z&UlnhBzr1j!`UzI2y!WJhUKlU?q0e|B%WbAoo@#>@OmFrNTF337i%!3>gqS;I$DUa ziuk`E62=G`PUcKL3eI?n_0H;&s;58U6)RD<^_vXSyt*7|)@j-x;D*XyB;sE{J*b69 zEFyJnauiz4uk`%Mxv566JV#EXWj2E8Vb#soSmW0vO2>^3>WdyG{}95s+>jkAo~abh zV1!j81!PzArL*{gR?Rds)>Mr}&24+Pz%P4WI{??3_!sc5V+9eu6i!9E|05GJ%Ob(_ zW{TvO*0gA7IPo&(itqSvKHphF?brQ!rv(r_QphFe95N9i%y>t_BlM5thIL z0M=_=uq0fu@4_Amt{~8^s_6q3H55bng1GyQw|`_}4X-nmOL?-%5bsf0t5lIJl}?AY z*VQ#XH+;!h-sZ{*p3wZ6cN%&iC_OVYTP$Zi9P7sW=vX0fmk zB|Q40IQYW!HRQA#HfU~ab*@($tkJqL;yIS3qCPsevZ{U)LRPhZ)49+FTy&?POu-GN zSGtWGI!WArwipi!Y#LcO);XCkVz484N(_i}seKyH@>v>s^Tg8N>;G#T5&zS)!57-~ z_M@4Fk0$)DA2s;FIi_PqU;c2DuxU=MJ84cGXD7{4UocAS@Z%R1s@tj}3Qw^CGQb|Z zx(CAzU}i5;&4!rsARB-D!=4T!fX1V8DXvPx;hFGkHmV!kapSnx+mEZJ-IDvbR4k)exSljbqwpRwyk--asU z6aKiLhmtOE2uFcMrF+V#zA0sepmHahe1b9JrpER;mDWPOC6=3fh8~>AvwtemeTD@F zK9V_3jNQp}N=WRtD?<|9Jq3v_;k8#`&xNm8i7wXNQV{8SW!#lamn25Gt87&8nb1(W z4~-RlCC~@aA$=5s%pHpSev)(d+tIHE2c1*W&$g; zD4Fgl^mQiQC_IIzo5FzoNVM;L15xMqW`!1MKlBRtPiYYKw(Q7|XK|peNwr7ybX(qJ ziTYk~H6wXZGWSim+Ux$Geia6TAuyslxThn{;!$X*wv*X{;8xsYF^d}!w%^xaP?v_+ zVIIKP9)Dl?r`EF9Q)iOgiHzf|0r7Tj9V{zFP|?%uw;p3x)+T51ZV5RTgVo5K6(jH} zp1TN(O~t-^4NbwYwMB!ci>${QlKDH#xN#Ma0D+6hAs$;`#xZuZ90owfJDKbGun>-F zn0b-Ki_X4gc)Pq$b^ccvh6zn%EXM59Ob*1#r1!K)$Cz(R7soVYM)Plv7MG=sytT5H ziOMZ-a0!jt_qHMZc4@3THmYmVr}6C6%I^*e$aI%|6Z|%K&I$-#;KrJb4V}Qiu?c{z zi*;RBu5e%3T_fWS5b#J$M`+z!WWnQFhOuOpupU`VxKV&c+}n`eh9kE0C^$@-ZB%~g z2sA;OIfBCbS~~U?UW#InjRiPik3D_G!YK?!$UI^L#PAj<18di6TdzrP;bcF-qY;$s z|f2<^Vya$+Lf~Lm>ff1;Vpa8BpnTh7be#Df?qy4*}=}?cLI%E(Z6J;ik9z07S z=Z|COwvuq>Igl~9LW0!@<>@<9fdR)zp3vOx_UlF`&)0?zY<_LbyPQ#;YiiF$%h_EJ%%^g((2sRQqM*z@lH2zuZ-tRRFI*^9 z1@YE&J6osf&|GFoh9&H$y~FY$l&gKE(i8Ux>2 z3(ln8;018^pY+dqi(j26X3-J}{la+t@eBVKU%~R4E{W%EK*}Hm)GjA8*k~p(TXmdF zisPu%H6mA=2F5PY)~(Fv zxK+{$#devj6{qoeUsJeCD}LH7`ZDzwHFX+|Fm)dy(H3*@|mE^j6sGrx8%KYE*mT5tR67A<~VegROOx91>R8CE? z5{&)ZSiWbDrIPa^x$`DVefgw{j$A30DTjW+$|31F@Ixc%g>jt3CGio$C&%t=?PCM~ zlu?MBuLQ~cRE5}fS8(@wrsV2~;wIi;D)t_95`UwB^uy0|U2>>bu0wUs9498%y868gP`(yO5kX!N79(|Xjepn^0_@1?i&s{$aIIr2 za{@L2MCeJDoOh0C#7mwzLWY8z*+D5zaBka98_=PflZa74ax~cBnLVIxTc4G=RdES> z2_+GwufU!8%ME^kZ)vDJqP8}i1W0oBlxgi)nG0JLrCK=hZiGkDeS&C48{cBNeC56<1wql>feye9p9WgiipA8 z&ACs^JHySN*+Gg?4*5{24l4SPZnJP-$8bOvJ@ahEmzVR*+MPzR!pNw+2G_ycoo`Fw z#?fYW`i2FwQFP|N5A~Gx*U@OO+Jg!dmAJl2) z=4t;^&uWZt9NADtjjhK^e_(1XrlQJY= z!F!>9Y5^!5T))QZwFrsT5-s@SvX)DuVdWQ^$2`*6s(K_B+y+XqO5iOlD5B@f{mvVU zwz01r25sOJ;_NY09agK^G;2FJi?{n_Y2#qIR^Ff8KLze7Bks3*%sN^ow)tHIFY7Rl z;xI=2|M#;*O<*`&FX9?EVLN;1B2H#G$e0~u=9^~|>pBO!+&s4X;J&OFu_T_%pTlXS zlg~&JQWK$jIYpYg*Ht6+;eUm>!DzxAy}(+4dAS`9^6-T(lXh(yD3M6|jcjCt5v{b6{c6+K(HM za+UhDOM>Nj*twrZ>X~_-_MJT)TvYtlh$jEXxB2lKg9&^A_it)nz998&%S}dgwi=5b z5_F~o0|YCjyAy5zJy^>Sp$Bu(XN~v)ULk(Gihov4PhN((nS05rrG;Hfp#2sehd_oP z_4(iW8Z3Hh`6Njy$W(ofG^}3}NdyKKDbA_K3i3_uM#vpFI*c1Z!hjA|HQp+^d)x+_RWEk^j)5g!f~ z7&afW+wuqP=R?z5gudUPw&44!avy#ddLFH~X>iVeKNor$iIzH+o?I;IwfZu;D!MSs zytksmZ4ba9r$(CUUJ3r&uo)2G9*v2=uKi;Hd0Cyzw@Gti0tZRe;K5YiLF@=-@(^`j zQmZDhiQ8ZcFKpoUjD5pP31N9k?I<4625qlVJR-p&2}m-|H1CPH*VE)ZG-e$e+Y~$d z+e7S9NWXMe*PbcPq6wcSf^SsnGl=!u4l!{}e?|$9ds_;(-{O|~u8hQw{agAqmd_vg zB9W_4G@j%v`V1NbsSZp`FxpxAjgv8^J1c*vJ`nij#-!UXLVxP9!+S zeD^W^BHUS7Ik6w?Q>vCaK--180jKc>8AHUO8!JaXHk<%D(KS?fM8`o zO4;w4mm_M?4MIgJ_&BZXN8$^tCJ-|_>R^Uya#v<&P>!GlNo>M@b!!WnfRV=J^hBU_ zvM(Nl7=C6#|hTSBdL0-*E_8MjW>fPLYpq=y2QK_V52XTu&R$ zsLIJ41~kaZCbEGQMk48_&J$PUmheBCXH&{(@yKL;PKWu%ig{kG*U~DBDYBf`a_NX& z&(0sV!csa25UTcO%_Iq<*K%>VYnW%Xx$`G_El5Dx$;{StLsUGXAI*8wEe%FAGF$5y z4I)8#fI_H}9y_8n49|eLpb?|r(G)6QTKL z;o1#=Tivz`hUy2+ zURLDQO%GHB2i?D4d^fnvJke|UoUVp{Re&JX@<|cfDB8UYnhMbN;y~F!`=OQ3oa|?z z0Vej#^hFNaTpcN|{Lbs~5iVK1-=^<9kiv)pq4D8|HB?~~|GjK-=ET?GQs+^sYtlp~ z^F7q6eEFg7GH2xy>d~k8X!iOvy=RnqiE%_KnBmSJQ`-M=pZbPD<$sA+*!IJMo~rJZ zjtU;+BXoSJ^DE5vXkYsX{t|KguQp?y{2?XclWbBBR4>JqI5&03zakd&EiS^`9?I*% zAvAhpW$`f@)^POuS5}2!)Ygf;rvra1)~>xY57U9ClXT!vbUiWN702| z$7+8&IUFTT%{R(LtUEC_*vihY{SZj7a25xsoCxDM-{a757HiD(Frpm3WN<) ziyyVVZvE^9y``nuO|v~W;wpOt%>myC4)ag< zUuDQu89Zn{hQAOL0R7bwn(Z18RDu9qqH{-156e*sDRTD5!w1N5$`PCchtFQ3`1tL} zQRxAt4{so~AL)lHCGK+$=j;B#Gz)908B>{hO83t{qY#=DMv(zaIte0&WEXcz^lQ`z zHS{j**v0DD+H2T=ZHMBdyT7z!uSQ^mBat4zIm zbi#iZd-$yGC)pl8sTlWJ#Xe#;EcWp@`Zzq_+T}_bn0=?A?9aC|;o8%*{IJxK3IY0x zLV%7S9M?p-E_}!sJ~fGG6MQ{F)v!C}HZ5ev4rcAx9Bt{2(0$}&2Uh?jvbyG0$*zJ8 z=Ac|>RK}c1Uxqg})unqzf#Y6Noq;6&<-OqsFU=B6eSfz)xM)T-Y9~n-k7r2nl9JDk zqDmt^m7{sZOv>y2hInHe_+Lv=B&f3@gKH~On9hg%L!Q=jI@!M>-kCQ84>C{t?x57+ zmCI<19hMStt&&-0=x$v(gNONcgr+PxDv!Eb>+(tek4*sJ8g68N@OsT5F84u&O2Q2f zUqi!NvOJQyn0M01?i)S)F2*}E9&h`7V|iTIs1bCS7f}wO~pX!RH)oxQ}}xj9hV>K`3+ZvG9OGB@(xj6cG37NC{fr~ksv&Y(Gtr(z3s zv;`c_r79zY!oN6=*tWOjV}cR3yQt=}S1FbopQ-)BK zQGM3FWu^t<|0yj*(K4&;+u?hGgGsTPeZpP zqK+|>gj<33l_5>UhS7~W{BawK(`96k(9uyT=~i+BW*m6R*DIY{UO`4}>i$H`ZU?cZy2&cS<(4G<0qcs;H|e_wydAQ8?kEUryZ1)o{;ulpqVd zC<)&DgR&Levq9J2eiP-LVBD$Y>Fg^!D3$BzRU><>Fh;3lTbtC*S9yn?`3hT#)}EWM z`J9OU?6^4W3S+cN^e4^9a7&jJGQe2YewdKm83fqX$$7R z0~qZ7(tSCaq?dv+dn<0Bfc?Q(2gGg+SRCY;Yd z^sZAmcDBwCym{S;>Qm@PjHNd*Is&8ecKK_I{#H4PRhfLL#>nd*@Hcy;V6`#z8l$~w zs@c1s#mS!k-*Bx>ETNMPoO_!j_DSDY2WxfawK%t7|+?wEZ)Eg@B6YAR?tR%z*#dJz#50-KdwCc;9tjA?= z9DL-#Un!;GXAst8Y2g&LId`(+pJB&w3|F~UID{;|&SQ{R-&??@ZY@qb zVPpun>F+05&YSrrL`+$E3lnR;L(Q%8r~akrmuH&I_aV#*zoIGU1RqH$=%*~=85_|Mu_h^xNV zpML@UC{*X>Z8p(DwfPT+oAU3X;9hN%n*QElNMPK1(WYP1@mPiJ(~>8;X$Mu!dlXa0 zES-YarB+p{__i>|J zHwUacOGw*!WYB}?ZuJjnDUXN*=84Nzuf}N&ode!g4Fj)XB*A7L3HJQfP%0B!)mo4{ z`+}EwEMO{tGYrwJYZ?yGG+6r}WrA}F?--8nW~bJ2dVf#5VCZcS9>zI2IJTf?9Z!NI zU?Yk2J=KQ9WbU1;x}OZ0A?`NA5qq?6Cs;9>2O_F!x|mZ5rYsI~x70|r#<4mZx%PHmF@VnY zgG*rspPdhBCIcgS!#Yi0w0lL(HkIgWYA1lavsQuj!&{ydi3hR3?kdK(GFnNKKE<^H zd-N;ZAxi0OuKmY;1%7BZ9!k>$RheDEV-)9%=>!aqWw+Y&4$`2$Qj2;{epY2K@_&$2GkTt@9 zVq|BwBW?$ev1W$tBe_@=mbLDdj$j!|W3k4M^>XvC_FLm3)p$KMB02~~I8UlrC<8LSAAeQ@chIuZ9+UhtSLg4-;MCA+(3U;X!e~_$2)yIju^n_WhR`FEl zXm^m(s*qvA^%ff3ZT9-n55cNgQmF(pP})Yw_;Ec&0%pmnhS!rSV-H7z%{ zA>uE6Oq@HlMMoIm1bDe%Kw#wrul*8=sJ^kpkVQg%D|K7rkh-mLDxcNu=HBY0(zVq| z@2m<12UIfp+rT_oXUu)nJ2F^gP;tnA`XQFhj_oF-F>@Uci}M?lK^s62zwBfzvB#7I z7nx5uXX^EY78KZOxC%O=-*H7T0-DE8_KWJbF~FK~e#fbjrg$YW5lUZ4Rq2<=8Z<=# z4cN(*H-{LpeNq9Pi(bFHl(10t^JlMwUSK>j>&7f&6Eb0Zt$x%nW*n`gMv2S!y3_vx zkI1isGL%%FVk23hx^`&R6@IX_xVR?YGKVBv23Qr{6cv3EJ2OC#&NdoFDv_|DoN{NYj|D z@5Y=%!|nJSocvP6Y{@5=GnCUNG048orRHFNN(kpCyz?mCJ!fk58 zp*=zhBs6-@q+gGupDdSM7{c9gT2>)1PWn5P>9*ID3@+l_vuef7 z50=f9;fjx^4zWCZR_6}ys#ybXI4c(#93(Reu@LiuFVa`x=kIC8X;H~^0trwd)ttyH#Vln z#$B=H!2}!b(@X!OUnmcUG2WO?nYwJq)k61hrg9}ACF5TN0Q>m3gClup!x^t1p=L9S zLoKyoOkP3HCQk_1Y4zt2t|K()_WwZtn`&fXYti`bTM(5Ql|eJBS>gt-pq7iEYmbbO};Zd5t2&_sl0$TSK^ZGQ&w=NDsqN-O`6hC~_wj zM$UWnj=^J6o}7e@%}Fn%=J+J|jI-F|GST+dz+F-xREw-s(Pq>iTd9nFU&~MX$HqXg zTAwIg>y|z`@EaGN&L4(txA9TumX%C7MmaIe`y^U~M!6a+&0*x^4*!H%MZdz7pTlOm zZ@eTpWhb@_5(KFiB?CWCa&|jx3{~M>5-29aHCeFgYyI9%Iq?^PuE1BcX18(g-10J> zgsVu99&Jx*2hoe%N?Sl*)KRn@IpIU*QJyB!b6TO{>t(ddqw|#^ApZ0uSkK)&vGPqQ zr%*514T5T9c?n=&VFyw$^S`W=u#MiEh`kM^is4gZHI{V%x(9vv7$@bh) zKk&K$k($Ih^~!vrfW5^I(k~ zry?+GP0o@mmNtxQmCgC-#Mt76{ZP%J!A8vtTe(|WoPpy$IA?IoiYy=+=!Sa>e*s@N zn6F>+TQ5c(>z~R}Qo|WjtKRnjNBr7K3{rCAXm+STG)dKKHmx|B$B_AWi@_eR9^nPF zlbCesJS+y+6DM%4f`L2zgm)I!{)>n&T3xeF)yePo77=odispqdI z@hRO<`P=ywLEj&8NFvhUiFlw2Ogk19(C-LeiH@7mkQ{@s53L0iju}cSIH_u_O$#r3 zbiK*!#iHR=lG-KuxZdWt_te0F+5_M{1nXifRyZ=pK)Mhc(+M_y`#-%1AbKhhK7^$q z{%$o63|pNBV_Ie<*g@Hr$)JxV5;`?IJ?$hiNf&t0lq&k53=i1R!5I(Sfga6rb6>4x z%&A)FE-5%ODrA{va#G1W&OtI0)cGzp7{R7<3m%nOT-`uRjq8<-D+j3`-k^ zJ(K(ozHRhRXT9@?f9GrAKtknlWDV39Sw+CtOv zvJ}w*Dg^}2A(WPfeId>N`&;Ksl7jv}|Nng2%$alc*^jl?Uhlp3v$9Yu{WFz9U6mt4 z5o?kcGQ4#&-|R>dqtK;XJ(_bd3Q5lhxjIf-*f!N$XBHTH`fvx%=R@W!1B+B6UK;|W zvKcHNoU7fI%q==LmOYXa)D~gt1s5u&s1LrlTS4a`ez0`SKN=Es$hv>DkG={k>1cg% z@lU6E+sURS@@pNU7wV9Z({Mjpc^W0d(lQ`RQA)&{{@7XAPeSeF)>8*V_m(;LR&l%H z+^TrCI=q(|-mr7)k%7-x==V;4()oy2t*Gx8)lv(6OHHB!)aYFO8^m^*-&DWy6&2Fd z%xPR&T0$F4T*=j2HPtqW9p2U_UYZR5Z1i3)ZtwZ;umK5U{-0)BBNDrM_BY`5EDzz< zC;Js+vlC|gk3TOOAJ(qIR$CFC(*brh*u>2WnxRblw<4xWxkBi0E1ZQ&J#%~6{(5jF*Oa@z9=7blc zONVkDZu;SXhwGOQ!z5hWbMBHY0)Px#0Gz^wyd9iP*>KO z39zkY-=8<71_e@bcz!)QD7oMDxY0QCt3_LN*&PvWQ4fChUD^2VGaDSKv{6aY&Z@w#hvdrL(L9415s_B=B_4$p>-t)$A;wVo9RKKXZUtMhX!Qa&5yey+=cS;+Ct< z;eQ?<=!3KT&t34g@IK|FwkXJnpr8CZgFVlf>L$6*>WRpqSlSmY~)4!zwv?yUI2Ih;RCc*~JiLvtU9;(EWiS%q|5NB`p2 za=T%(EO&0{bJ^kk%+V~_h%<4AO`;fUZ0xz-bNG1`Ym7HEP<{R#Sr<^Y@LWIT1pOuhE`o5=j z(YPUcv6`&#YstE@X7O8ApV14G6Dm|eZ-%X`-ZGj^viqqe4pWTJNGatf_%_-7VR-Al}wnC|*YoA2y7#8{VWlX}4EtHa8Adp6rBFE<| z2nErcpK^|ND`zg;GS`+yI{wczmaSe2ef=XUbgv=Ks!l5KW1nQMl`js=MoMLiKEB<* ztF8-E4c&7?NR|n%7Y}jE3-+5;nK}Q(xkK(_o;k%IS`U)0Gw^R#>5KVTw zkUhpv=5;U`qy;ZG5;RTDp7Lx=LUNYz=pMY`^SXqe`c9YG>aLyxu(oCu_G~>vpGnE{~kwO-U#?IsaTd>-RHPf=zHLPr_s- zbC3$qig31ys`IDb|8!;Ve}%zt6XWa;1ez~~vEQrpN?6*Z^i=P8V`9Ny;6j-4;Q)U3 zF>sQHm)Wi&v0Hr<+t9qj_-6dU$Qer4L7bD;GA7$Y`Q7r+E7sLR;hVS8{@>-3!bi@E zmXXS)_}$*@Fvv7yK4F;Y6gogO0T_aI&~>^t4}S-~!qWO;U2w=2JygC8A{V+63g^wS zH_g^v@YMHt7zU`Gahwuo)XNCI=UVPsKyOE9uvI@w-vYZsGl6jn(YI*0mNCTt%#B0X zuAvqKG=P*OVoKR=^-bIeUZ<`c*`Eq7QD&LaSDKQ!wgx=-Unc+x24q$HGua|J%!SNQ z8_F)h7j6_5^v-JD(Y(pF@Q36j$YK8(an_?OTyV2-Ru4iKfW*+1YG@-v6h{}q*|C7h z_9mwbs?Q9P@6H|nM(f5!`#1L?n5Wl})8V3I>(m8luX~o0|1=K9;4(D$kYC*|66>G& zPNaLR6RQ#V#ec@O^bRV8Koe86cMp#Cz6?5~B;)3-5^Z;>FOq3On@~utA*Hi;zd}ky zl=WMm(&dO8klWPwmqdTRu-*UFcLnI|CGVzz)GG6cmePC4U`Uo_jUMb0nGWIRzo8$r zmg6OTh8{e{gAr34q&Eu(ej9c(B>&4BX3$6VLSs+fCsg%c=e_*fanrDzrCv2aVV#ng za`lT_ z_*FPlx4j*Tsf9bSQW-SU-@=dS4uOA$r z;L&bW#*ri&7 z4iFWK(^h3QTte?oFR{Wl1Rr>5aIo!cr*Iqd+jh<}rxOIj;CuMbt?kXmuiOQB)@mDbJb5+3*|H4di)i6Fi#Yv^`4fOMKJXL zhB6%-`JZ$*3Tc+Gk1C{Y0)irNF zc4!a@@P>2V>N!s1`k+U!_I8Gn5MIed7`bqsltk!mg2Oh3o!g394+=NwjnGZ&f7;3c zrlhwfXw#E_z4au>-OjTxVaB9(l)iPum<3w^r1_9($n?iy2Z;a35imB<`((d54({|P zs^bak)Ufv=nDE!50kZIuy1n9y_onDal$;8Jj}dGT@P0WSq}1hs-3G>GgJ9p?CV*{MKU*QW}IDY zMvmF=mMWje{;@FZ?eJmw(Bj|NbBY!6t@s<9c7gqf#J!`9vLs+@=dy4i0k$vncic{v zt46o3bIQNq8lX$k8OHk1jpdf3RBjS{Z2d5^=FY-<-XG><<6AOzEWR;GmR(q`yQm5( zRz0=UnIL(NQ@8_ms&+B>O(&5~vOI1yDTS9_%{v@TgD{6~5Fc#avv?1sstDL#x{`3^ z)-}%3U-3;=LAkK@>D&lM+e^n9S5W_kb^T!%S-3$OCc%^;A9PMf6iB4Ri;$o8BNr4Q zlk_aVcK=KlC&j<8>oj7AQt{0UqZ4~ri#Swu@`MCv&%QIAi9-tZbXftWCW1=*Fga8Z zh&oV-*W;ksspJAnvQc64&FsHMCX59$cMHR@p5r_A$3Km+s&u`A29l$%*A@-M^C?&Q z41X)hLCkOxI^~KdK>yq>Kt%z2o7~LD`X4#ohM$(yK#fF(BFA$z101Ud*sj+C-)3i+ z(dH<>K(mmFAQb)i4~z}PURu`qn=oa|p)u9_Y2_A%eGBu{09E94zw-xh?o2(XF_l>EK_GkPAyGtvczc- zZ}Rs)J#u)0e8C@)wnNcF`sMp}X`%b+(pkvF*BHk~%oq}jy-cl(-=~UF9o|3R9ois) zXNgT2UJ4dyFke1lc+HZd$jN~VX3?R;XPRZkuV){@;)Bxh-N9JQcs%ZXQ&9x*;GSoB zEk8(9?>8W)BNDYL@-#dqsCD(?CtQ;!XfHS9^dC%f4BGEA&h38)?!ts6izA>ej3A6!({xeg>BBq7fV5kDNu-QHgY#O!^UP6a7VRrxyO@l;T!c;6= zWkjsXkj>Ybo`MppA`)W6KoQ6M zWwqj+lG4OLgV+9H0>FCbs!1CWKu1LM$Aa;?!}80~f;16vxqGmk z{$yfcQjG;*i!?rD+dTAA0;yL=-TGI4PJ}?^keBO?F@-w1EbQn3RuD1ezthABcahV`Ln8B{A)RGM|&>1{U0A8U6`;9 zzcsCfS&-0xYCI~X#Kb6S1BsR%?&39nq7{OBTfL?Qmr~VrrS7c1;WWKZP0c&}gT4@6 zccWm&E7z-zRSj$GXBeUyDT>64e#@AX!c*77>E9imipD8|2i+4*P)Mp2BD*{zn}3L) z*{QwWpQ5nTj;5h_)uG_j`?et~SmY>G<#>@rSM6W^agF^Ny8#s%;SH~&NX-8a0_B3U z;aL$wMajGD0Ne=#9sG*8R7s$>@NM$z)m*&c%vc|M^C?|?X?^fDyODr)UUTGQR^rI43W`jism2Dd!U z(~t~F-x)!MJ}^)3q2%HsZyMT+vAI)|h_pU}GnW#ir`;%ol_QN{Vs?G9g9C>_WS;sf zT2)1#35B~KeSbtitr-|E8-TJVLBoQmbV>e=&z$aYa`pRNl%S3aAoYQDs z7^dlM4E`5mEg5h6fC-|=+59q-Y{-P~{N&IsxR-iGnFvy_MGPzOcgzrkM5u?Pk@9BM25)esEq^91?a6tt8iEbwKgP|LNHnNh*VK{eK|_A6J&NvLKXah_%zN!Cb*bu9QC`)uyNV-MII zd@2mWzVT5FW7`PP=l=Iqh9MO_=$Nlg8)r5NT|96?V-%lFcy`DJr^t_3>gMQXZ0*n$ z1YrLb4jES@VyNnuCeO9gY%>xH%AE;ZQVDMKyorR6VE;mJD`KO!Jxb6JOxrFo_O30= zf>LY0a=*|$$|@9mR1`Z*9iOdzw^80kL(lyc2!3W^uSh)B5fgiYD#Dcz;r|0rUik!4 zT}5Uo?1m?Y(G3EMs#$#Ez5%q~zMNO1xbv{Y*QZaJ19*hQiv!pQcp=xYm!J`rp>&1hSC!E5YzlG@ifIkrluA-t5 zB>09b>-3j{0AY8kaWzMcl2duTbIsG(MBSa6gYRPH)6m}~#d4I53;@BN8`YSL^<+w8 z@aT`pO=&sGM*VAYKY_Log5F?B<#&tZq0+ub$x83sExG%eFH$V{4u9TbY`<4J`Mi@j27d!}o^Xu`8+hkbL3b2g7MY#d zfwt{sX$vU8bbxidomW`Z>JAHB;Sd{j>8vquOi+xt4CfZ^1uG%VX z`2*de3g=IF+oXM`IQIWi_5GBMiaif8aarfWRZAL{_K?4&y@{UVG#xF-(mw|5t%E3Y z-se2!ZkZMrCm$WY8G?14e`a6EE$=igzIGG|5EyZ+XQjQ5hL`bP^pE|#mOWtekFYBO zG({a0d0yhIf&AxV+0ThxbPv&=(wWt(aAskBn%tyxtIq9fSbP-`!7c4S*x8xirIR+Y zL~HddvW(QwHjY6fI+be0(^(3O@nF6A3qcSi5y#l_hDJ(3TkH4|EyM>biJ+Qm)n3oH zCY1I0vVDg@D?D#De9n+iIfeU`T5^kPV?AU17hkB1?Hm)kg(hF*Dwv0oXASF+1{2aJ zmnQxw<2~gc2hp~AO)3Z1m>ewnwULYn=?b@Q&qL0&BE*$ z=P#pBb+iZsB!MK_XUX*<^nM_eE0ieE^I)c(7R%o zc8-6q0j23;O)SwCcAi1S&T(JOP9=X{qB@*n=Qgd)(A*KU^TRM9mmV`J*o$G}?gXXA zL!;LZx=(Cz$My&Blb9Et{rqxJtsiBCaI*{#Nl+(^iCDW$TBz%ujk_T9kOba0^j64l zqRHk}aiU)zy)P%SnGc*mqT;{VpKvf-b69<}Eeb*x8ofkm{?4urzI=yqGhFmSBmUHf zI>jGtA6`X-)Js;L?GZs8udtI~%t`^t=om3X8!N~$v?1)u#`gmKp0C5)>Ud3(iH$Bi zm2S=xEWa?I&PK)NKL*WCF;EjDIIjF|yz$D}hQFvgSoCd81*XGQyMXO5ltPQH&H_5) zAgeH19D+Tx1c}_d63{3J}RsvsaT%x51mcJwO%;&L7f`ZLn`HI2ax(Y$@ln_v2{)YqaYM({jh4m(^g z8shOG!`Y8L2D0f8s#xjBbIj5Bes}b}4fPVB%F7!z(ghRS{Qai@X;z+8CGA4d6Ms!S zT6e)~U|~gk3|}}C6BYoHh8!w2-=IjczvCheDInZs@czw{*}wWLa2jw0f4@Lu3L_W< z*}1$J9QHIb8Ct!9^B=cmWfFcQBq9|`8=#~*k%Zs5s*d9V9&Ue@UlQ{#gq$gSq>|_>{DVESZRKI%b5@)}2wPw4=EW;b2sX`V!0-DOenIa= zAyff3gu;Bf5v3aa|3xTey5ueDMN743h(bzI;{5LP{njN8<3Nhe+Th&H4AX=&)sd!L zv`Rn1+I)|g{_kUAf}MZ)|0{pL$|GBSoSjR-qo_^(A9v7Y<1O@Llr#z=Q-V3xkFPWZ z6P}T#G5sa_Yixtb4z2lb!}&xs3rgZbOak6!6JTBQ(^|11Cy?6;m2$3KPsw1csv;^i zSSeaP1cQg6x{^VWOl2j)fH@~W>%;H(#fj>kq`LXhRk#1^${}J-ak;%F(Y6Me-3r2R zb8X>ucSMcMu1FFE_z^XsmH6Ly26G|UO8cx4|L>+T>e!st&MB8IAfCqUdZ?6H z(w*N;w9D;!et$Q+au=7!9gh9EG<{jOH?7LK>S~_kgPO+!??A-uCVJnzmAyW-IX7M_ z`5Q!z2Xk1fBmD35Jmb9*^*nJ`+@JTHbw2o<$}J1!4GKji!ceO-DI@qW$Z-4-Sd0)j z$}i+`khw>9VgYh4`%khftfu_#{S6-_!3^ArUqe&3UGugp?fuhbGPh{{eC7==Hb5kF z=tgRBOJAB{w5$c03hFKOb4qV>7!+!iDDak(fDo832{dSnNPgC@8ntt9 z;Kn)2?*HqV@Totw?*?rK{%g*%Pj(7=2%9a?Yb5RkdT5L z9fgay;{CVs%-Zj_FC9p6~tdOKyX+>_{Z)onnj$3e!^+{%Q?XUahQ)FAIWndPXeE_OGFC_`i#( zHHk#@bcS^jtupGQKc2p5B=A(59$-m8D9dt;|0@m&(3Hq^>R)2DTx0KXuOXU64Q*%+ zfBCZJaJc2q>K%>Fzw{ME65dixe|}5e*M)W7T7$iN#RHl~Z}U0lCTAwkO`ezh^4fIi zJjfl>VB08)xP!V8cgF|mY&iqTWCd z3A=F-bxm(*nF{^nn3y!%`J&@tmXXol&WCv@)nd!3=aYp^*~uuo17mHS6*goinje6G z31Xd0|f{?9nFYr}Ltb|iI zjNztBXVxSAnhk9fF3TV%hyEwO*ynl6fKemU;v$s$Sh$DuXcBQtTOzJW7wZyr7bHukwXB;QCu?rD zfiz@aCEf3!H>H}>4^KN8#Kfh`<(Vhz5NK&EQfxa%NS$03xGAFIUw$B6{2c>>A2bxV zI>qay7O59KAJl+`sJFlavb7O<=@kB;!K(jKO@63xl&(`LTjO9S)O((?#O&lzs&o=7tHWCu z%U+f&FCG_CLhnHf2y=^Dvon)d48{_;AjVErZr)$;&eSfJ{XMGjwDLtC1KBY*xr8J0 zh$hqh9lD6|U9E5QJseb=Fmxy;C*x>at)x*^ZvsNoOl<~(MT=Pz1ags5n1IR3&Djat zp0QT(KG#XxWCYpicsf`o^Fi{w`e0s6-;A}cS7jFGSTG8F(mGG}@251*$@}c@{rVdu zc-GN87*tsqVTT}eX=8Jrk<$nQY$498$p{dedX@yI+Y33B5BWdL-}N4y<~@NNgRZt9 zlQPV0 z4R65n-xo`_{@J;*3)FV5I-yE)7w+IitGga|{%CGxK%|@Ll*u`0SQSKFN%gUT&kGJ6 zg}*z6B)_%Z5*^K3)82lPdZ7)8xLUaCBpx!usuih3#cSz0K@dgNH=UYdJ@1EW$t(Xk z^~MG@-P&;DYv4#a!)(bDRAT~t!damsvJY^({vn-c~sA z!q3F9vq8Zj<}w@9QaqeRsJDwOE-EkcL9J7`i-uheB%h%gbheH6n7s#2_-u&s;Zr&c z7(@O5DmBJ8vR&nn*0t;bIPGB_X4bml&0C!Btxh=KS(j*heJaFY)rRa*cxx6M>=a*u zM6|AT%6~H&2!zP07}JjR72E)J!%(~WA?^si)Q}}_aa0yKLcqdb1gdP~9m6UJ@JtSU z`7W>&NogX0C)MBzw0xUDge*8T!A?<;Yrwl;YnJMe&@Ljz5Fx{@w6hH58 zfTYNF@nFvd}`dkLk4S)pSJ67D1z->)e#vXXtk_n&(r z@MX^%0guZ31e;})Lv5{M}ZhaNH) z-i}Yx(04B1G5?y;d!>@CaSF$Qvlgxvye29!q;FmA>w&C|>$%UgZ05ZKF)#AvTo3)& zM2nqTzOHR8E4OWgC3niTdzn@}NfwbyupEgfV9{|3T1M$EqQF24>A=s>+vy$Nql%^b zLt8hOO}(@FhC(d(AVwp%~+7w8>)}jls`oWdy#+ zs^)g38Zu_+3Wp7NIeW9TMSvoCBa4Vs;ZL%U?f@WC8&*{a;Z`uXX)byt3xMh~Wi3R8 zNqYSQUs@)_>J{?m=nm0@koq!KQuVFKCc}WF3kh~f36j+*57Dqc?%!G)dMmqa2C&A&eJ_8?nls=0Hw#$@Lh zh#z$a_-#n}t9&|pp?OjNf^)d5%C;DUN01K!Sw@hLse|u?GzLagh$GAg$Dv~t7oBuPIYU0&WW2=ZC+U)KQKEc%d4?)BbN_yNxe*25tx^lXTJB6cU)xA9K|!6&Eb?4SIr zGYB~AX&Lye=Cd@K9Gcl=epi*^bEbN`I9d^WB-jY~DH-pu3B4U4k(CHl_L=Pd$r5UA zwqJ5@1!D|f+UrZ5o$)hRE2wit5z97b=@AeWSd=l1sYs9XHX(Z8X1W$MAX$S5_s?KB zrpz>rxcO|5SkcMt}s zQI$bI)x7s4Ni&=!SF@Zl<=Yyr;Z_F7^$OpcpDAuy^dW2-3h+6y^@N^72aeEvxAY~> zmRw!kdO~)8!dY84EGnpb#gf*88g=$Foo

      uZZ|L*|g=6_x*cwq{yVT^WVYsopgqQ4@RXkvE5D5kh=Gs5n?YdCuFe5( z;yCUCi6de0Tp^AkXT0nR?pkCh1*;qAcye_2aT(0z?T@+AkBf>c1AGPYq`;Z*!_B=5 z7{N<-@Ic$(I;D%4H*Sq)T@KS2QARM$+H&6zw3Bk*d#IJKDNaR;^;ppO8iuAu{$uj}sZ)mDk4Wm0JPV4QW07ip!U6~lX|2$byUjN0Rb7|w+2dQl}f_s7XasISrY%b{m4VyRsr#55-IeI>v+H^wYg)NAy682$e=i1SpMqP&NC3+Cnx zgOAlLv6nGn;<1J~r$&gEgxJbNG|+n0m#hx`$CexO@zw@5ohwm(%GXqfQT;{gJp{v& z4!0kg!*{1OBTic;Dpi(e?ILA0g5p-hsIfSSIcK&I3*)7X%2{H$kGIn9ROw(wFsuTV zP5Un^gM)$guck^yaidLRha#1oV`5>yIqoerF{GYGwH=@neiagX6N~K!nW$8M^Ov-) zI+eHrcN~V(FNXH<_@Kj1X2Jv@lQ}1c38)y!Y0@8EnK1DA;&DAqx}W@iL&npGOa#Zk zw=8ijPWcs_(=cu}s9(eS@GYwDoavvM)Y+H>8jnC!UWCMclEuc`&zN)Gjg`Vn0%iK5 zc;HaYVIdtBZ2Dyr_i%G>45n=7fJ{RcI}ueo>-NiWDE|zV|B)r8@;_qzQg@`Q4)gzU zl$-ML!NY^0Avx5N{isw;Vr?=`tG4jN?#`&)QHbMWdKK9*(iEXjl}5!Ti}q+Hg55BO zCC(K>T*m~g1oC?xoSm`*(VOxWg)ksrO^rEOdbVPJ+*Hgp)tfwP$g2{=<|O8t%Xv2u zQ)WV~e7ita+T~D^eYja^R{-&^wATWW$JgC+it9Zpbarq9c-ocFVbL2u`r<3TfmbAI!voy@su&hs~*HO`86P>$%72=I;$jAjdFwghNp-d zDqOt6>&Ag5Z*=RzM>Ffb4br{`FisM*uVkdOkCgoFBgEf6LcHyJ5WGIojCRwShk$g# zxd|P{`GqF7Ie+MaGe@)UZ8<8o?*$g$_jUzG{=0k8?qH}A z-e2|v8$U7VC7S4=-b|lM4y!)k;#Y6``ndDJ(fMvS_cr^%Tn?p74n>fL31U2=NMam? zl0U}tfk-sW;93C08{>uGW#r)gDgQ9W+61wE6QlNGAH$v=Z!k9S(edsyNmVZ7jo%KdQ62r9uM~;}pItm;)YPf&-xTBftJB40WdJH(S z*>?_c$AY8U+@x;9B4gw@=Ca(%ZvvN>1Rv=OiW9)ZYdet@c`TgDY~H7%WvCQ#t zxy-piAK(+^fs03W5IAa&F>(QG<~gXuKw|;j2#%vRfi;Y9qK}&d&b;S=l{W#18-I$G zaq4;rLP70l&>yYVp%xVDX4Wcvwjhz|isvtsuJ~(=bj1t6;z|7?II?fjmAH6!yabNA z!#KJbT*d9u%q`%~xPw#j6)r|u_bTXkY+eKRQmoMH;HcY-!8f>+;obsA&yX7KZI+p| zJ{ir<`xGs3JMCMRafH4H8;{TrEHq{ghGR27p&(za@78xBZk}n(u{M^PfO9jBBYP3l z%}UhRmdK6)7LV*$_JpPj8#MVy(*@D-7>@%NPk9Gie7XpOi${DsxLCv|fQcvWL~!va zPXb3hKo@%^vmQ6H3~W4Bvsh?ac<|h8E++&2p?rzO+E^?IqgmS6ei&Tr>f|F};=Vu1 zT;C~lf%!4!y7hIx#@q;&zKAncHi4s9;i(2R?PV$G-g>y%r@4hSF*MA&{3O2oO|ULE znJnva4V2`r6SJ~x@O)=%kc~hnf^-;UQ$Xh_AW5mN3O$__QqOo)%u4hu5R*=_C4A1K zLtEwN!BfcSFlAl!X1S zTk0=}PjhhY7Q3j0_jMp8yodS|N{^CK8xjuEY$yoAO9vl8f`Ta*N>uB;NlOiQ_0%+O_r{r+J}fbRi0b z$Q7c85S@fLL5LI~8Zu!bu~gt2bBh)F`s7UFUymZ%j>QDyEWg_qF<&h4W3AQMq_6qY~lq1s}b^1?)1)EEOv zcnCi1eyn467osB*#@QE{bKVi+QzoYT2*UYY;6_+*>2O*xQAB%`cmm;v?pPo$sg+nt zMo)kzpF?7AWwHH|5Kk~+JlV~h^Oq1!u@Jgd9wkIuAvz1uTZn-|6fvW7?qI{w1~aZ5d@o;j`GN`chu1%fJgc8$Rt!Dxp?qvT1WG! zHgfdw-`_LIe^f1|emmud7;1JGyK!@8g5AYa7t8MAXDIo17qy-{Ma^Df4-i>j4YD_& zvk!>uF3hU@3lRUkvA>cX-aNQFkl#FJOrZk-e&#FMV#V+4UEF8AU3v6hVlz1$9gDm7vy=6|I;0iynk;~A$!)d zrHm^*pX0#M_qp!5U@92eE%DQRZG|f}_HQ zyA2%OROGhq4i=f#+zF1VG~8V*a~~^yj2V=|GmeilC+*yGnfSAGs_|zpkhnklz{UO9 z4=(P{FQkb*w(;&)pX@hqWYP8YcNQ7%{s8Cs(mgcSdlgUlxFjE^!Nt3*0XXu-wCfP& zOcf28%R3V;7^n@P_&M!ytkBH}PXzlH9;&5e!70mGEH%QjeOwoCD`1sN=5k49hl7pR zGJ;EzVVv~8w2nR}qaKqBcR*~;P0yZYVt*%)c27mxkjY|KRa9&nTkhPxMBEZX<8 zBDG`<)21bBecS`!;yLpmbL?9abdvFHH~ZEUNZhw(;HXAZ|6$L zPljvZlO?mv&5{(KVoM))q>pRm<648G9%0W*E)~x=PB&341rqmsCb+ogWh9H`@GNj~ zU*~{}UthkIW!%#hK4B#|^1*G$Jk~TVj`+B!kDJdN+gt&bCNmtp=tEtErYSXchH1wb zaPfAG1xM}Z>E4)UgQFRUI^6*sZ$+_>3xkU}I-W&&nW({ddkM=!c^Aa6tAM#~v70xD z4xhA7!{nJ@S&hy!cj%J}xlV^!FbN?i>qp$haJomuEGjbsNC^_GG8%Xi zT~)!>$8au8{anuz=ut(hhWAh(qsW7oB5dPWVhbmp8&A(jfUQi%J6STDqj zLcA-)XG}yDtrFftosCK2@Hz0M17=}5>^4FiAw&Zvj8om1bNc(>5du3x%n+hdh^0cT zWFo;siAylS_M8Q$4(6f61U44KM)Y89L{;fgrneME3fhsxi{68ljht{37;CQM+S zWsWoU>Df5{yPq3c&tr(Uqk{I(`7a(MOz>3bjj&W%uchELQ_lm1^*rEsD=hjSO*Boc zr*wjc8y^W+I4EBb{(Ac2Xe8-qO43*t#5(0a_C2d@_R0UTg!oE`y-c`kjGBuPdlv6N zoZdnVWWue!Xf!z7=vp3Cv&mi5 z86pDBg#PAABI|>53d`5Lq~g=kqJoP4Us_Hbm_}aeEh|_BJ6l3sED)15B8HsAbOi zTZksI2|G%NQ{sEDisv~D@#tZD`Ulnhg+yvQ6T!LUXO=jBGg1F|YDVV%`PD_{y6g8# z6P_Uc9+m5^KR_vb!1!xU5&sQDepS#QKLW9y^XmKrz9v${8_3w(JPoEYFr&}sbbX!<<3Cd>sGbqY8^>R1C z_G=R6UG;p)yB$#S=iU22{CT$%h-8_`#1DYT3oqTg`v`#KT>=+B^VpTERTHjb7gg&8 zay5-G@~AfjO%Z1y=iN(76Twg|=3>nx7V#DCi&@B*X{NE%=uQX6jWUDsJpc)=+NgyR z98&TJhY)gy4igGOq~$@x^v*U@V1kYw zeuZ>2Dfv5^5PwG#A|37K{8fGcUoR~3Ag1RRd(0SQiAN`@F6Jp;0;jHl_**34s9PY> zRk^F|t69aK$AsyR`(q_5R@FC6J`6+lCYd51OgKfp`j1oObC~HDhH05DBV5CIXSk#trjikBa*Psuz0zb3tQ#$Kx)RGYcWMhcjwt3z5Nu$(M1=6-@_0H_f1UJ!6R4>KQ})t-`iz zWuBhANapG7z~b}t4sg_dGi$#Oj@oXxo#3dG>FWH4OrJ~MtB*uN_n&>@6MgFAJ_APv zO|j3x#lLXe1&*pVvM+ty*Wjq5jO-icvfRo?V1(rLLwk(yRIqU~?ZLT;nKv?~(G{4x zi0~5AS9p%n7??NT8XdVrqBIs*JW4jWcwEMTqdH8K9B}an7W=rcuiSX%jNcQ%ZJVyS z6_dc3Z$c34$zZ4gqd3LKUE<@Wf}@->n$ua9H+(U^)S=r_bni!wZK>Aav!(Q z$6djtO}Q(X<0viz8}Fhj=K4;Wgr}!{<(7ks`?!L+*lphH0mS?732^a*d6GHVckD&a znV!mADm}FiSiGn9gNygZFW}<+_A9t}SPy`UC*$uv?hh_!8vZA^&Cf}Y{{k1c@;5m0 z#b}1EH!}AYQY8!xk|bepkFI7q?=PgADcBJZ#VC|_1dP$0&Ru|z>++RtfAG{Wl4Y@s zcTl-t$s-(^j0}K@2K~V`;Ay`I3JKQIw%5tDKN?E@Y5zhXR3#l|lD`Ou>r@OG1BB}~ zcca=Kz&*2=b+t^Hj>ld!uxD4}A#MWY_tMN{*#EhXF)jC zq0#R>)HKxe!ZLU?lqL50LYyN+dnU|mJ(f9Vsu1NuEEeJ>CW`I>K`W87PDC#V@wN~j zGvS7E0DN(pqj%|Wj$P(b- zl*+AQiCrZsrtLabD;6l)PIwPBg?ep1qxMW8#tTu%gt2uEb56AoYlL`Gh?j+UPlzvs z_?d~Kzd_KVS=0=x0bYPuzC;}jN{$3u;1C9NbrqT_TVUJW0#hkBRw>sYR=I2k3wvx! zXY49kaO`~9|78o2!9=C{z0Ss4y+pg@!&z=Za5Qsdvz~4|2X%CXA9cF%dUCBjyXKq| z^D(etJ&k;%%_<%Ld9w-^>Yik)1~9RaT!@`u*ONBCU<&_^lq6eX`IG3Bf_4ze%e^g& zD%!qy4|O=|zU*2kZDoo5k`PY_ai0(?g;**?B@-sppEKv|7UC}p@ z3931w*2x7JaRh(WYWQ*r_23Sc+OIGXoX~c$#Ho#0s;JlKDj5C$G)TS$_WOUqL1z>v zLp>v%wvzv+BfX;Td`)htK2%L?z6N5>k?+HtnqXa@dxNa&q~u@M36ZlY_f+kE0J4ai z6QwmkXz8bSn3%JhwE>+6VmkNWg^_DyF(8L=sP7@Z@Ot#`8?s(J!-UDK51Dhm6=FXV z?s(~nqRt@|CV`8RLC`HN!PGc`Rq*vmy`hW34R7dNd1YJ3P%Y4Sk=RMU61X zP9Sn+EgGEdNqh(l{$J)nW#HP3`U2I|vmga?Hb2(5O(-J$njk#e$!a{aOkU;OkT9=m zS4v*xLP>t=+w2Yp0Fmkpk_SZYCN{`GAnU(3y=tO+0T9VgHya0g%$RH(0>ppXKGdVL z$hD?k0whO7b&jQlU`WZ~P`UU<^i&^_y4kSnW@H0B^cD74ji?vji5C@0T@96o$iz;O zMgkB2kg}_IfE48cpg`)@^Dt1|D%BEHcic_h>Y{3qIL}V0GAPX@rBy631MGh0ob^mp zs$0crDS9}H+Uw$IL=CQE-EGWFsQpMa6tgtY7-zcFR?b94-O5}`hXyLFdl$T`HVN%7$O!VRHG&?=Ocw65rLnSV)jy}b?^c0Nl2p(%18 zi9fSLB@*~~7wn{Afc+PKCP>q}VQBdw+Q{zUcNxQM5f1yrd zsK+3;zhczh!Gy`Zz06gr6XTCFP|HK=cA9a{@uJgRd~Fpb9dXN5IVVD+F|Ot8{cUpSU5|or7lwPKT<)6fAYEq zi1e+Uzh0_1!a>M(H z$6+=>Smv(AEwOef9-<{B35$6n2_b2zrUf$)aN_-KUI#?xcoT*7K)iu_0=xvSFRqt7 z34Zjm?(YwVR1Fxv!3{wEA&6vc_$qG@qbjM=KXTP`P}&5ga5f}%28-=9AyS2C!9=C{ z;8*D<^H;r#^S1CWK*Qg=qKLZQo7t?bUO`nqkw5ELYTqMj^=v4ff%ag;`+x1>DSQfv zvvH|S9HJ_0N1PcE6PsK7Us}d_pt{~Fm)Twh)*G4Kn@p(9;HXCow*{P)C)_LGs4I=^ zRd7$>i5kPb1}=Wl?G13dpn0xq^G$GM)BVcuEn$!gZ-b^>Flz6BBe%L4_5dqluet`+ zWI^Iy`)b5FJp?UHkkfzOEkm7@yxBMuykw)v*I_{X89W?_q@d9m0YuW&{kkxp0bR9` zchLnN6;r6tgSeZJksiRPjPf95cmq%o_|=F99res07ePGaHgEDL`0mbz;$@^5+y8kM ziDC#TpmZ2F!a%5(>4*j|Va$Q}eX^G5GKRuh;y&n{@ODVTTWBb3 zU>$p{5UYf!V#2IEUoz+H5kes)=$LXCh@yYtgI;KeSKQYf%wHmvs%}S(G@xxWpivGt ziPzC2Yibv?pAKr*WA_VaejC(GVE1!qx4I+XMLl*ugJ$obW&*pPLi>`Sc0G1Kf#!`t z%>;HohW5(`t-Tl8`wm)r542CbGZ2dep43A7f`iun8QK*Gt-TxCYY$rcCuo0g(Aqyj zyU|?-+sc1KyGu~Jo__oqnqv-1^DAgBIw;M3(0n|onV?7ZL;H)Mc3{()guz~Psyi~D zs0dZmy*%oUw;iw*n_Kb;@*a-=a_I(MvPDHr$CPppO(}aIvA>k1eY+5^GGQhWHBY%E z-P6OHQEW;IA+B)B2}W3{3b;(HlBuX9Tm{sQirrEnCNN)Z%C3D&G( z_sE(>O0o|#6ZB0$WEC4oUpn0kz${2++k5!(gmxF*Cw7m3lGrup?9GA5x)w*|E@y+Z z2rui$l>5JGMYjqy}w zl8jvF2UHfxNZ{0+l1>#ur3cK!PvI+7C(hkiRt_XT1~Y2+Wy0j)Ma(%gEJQ?zWlT8LLaY(uNhYS1fKcx6x((Kx*F<5b5Z?%~pNYVv z(dB-+Lb#kgtmn?zTT5_V1WNzKowErZDXE5~H(|+t2W@Z?s^@`_dY<1{2y1O9hW~fZ zZ(IeFW65OS&rM$ieH+9QTqx}nBjX*b$izVv=Pxggl*sd46vxk$lZMu7&6A%e0Es{O zc_KI($i3YpI?2bi1xNQKp6kj^0Y^{qxhDecSdnXKGEHi^iEC*JBwkB1aPe9W^Kpm! zxFf*1cU;g+*@8vJfn;#xfZcu zHNM9TpH^*WO;hO(ANM}E_~YU`xu7gw4Q8`P@!T?$S~=-S^IYvAP$3uTFv~|nATrAv zXTWiT#5R9}Dpo6XC}|*!M7Jys{P;gU*pcoFv2NOdd=$5=4}29P{Y^W@9>RTy(HD>e(pVgYtJ#`GbGNrXDNz z!paZ-vz0Zlat7u9!TS#vtQsDIYL5UZvt5>FNhhk8`e>h3+%Su|oF$Fw#U5_>3% z?em2=M~Dtgn1MQ#IcKgAi7jK{s%442ONebugg1i-*Wkl`fFa{U2+J`YPBS5nVxpdTd^INClc=J=JRYWb zJWO-AYj%p6zw0q^158XJ6Vj>ik}<1wqf<|yZ}ct!2VsKN5!wfN4>bgFv&S)N4;P}p z5E)Duf2RAmO6HuULaY?xJ|-$v^SZyD@CimucmdFG8GTHkmk;!0CHr(C+6pmJhyhF( zPnI+1E(g~?ftmGjMx3{Wc-~jyQ-ObEqEcNETVYL1R5ELlMz#OBa{ zer2kx$DjI7U?@fh6`xqHnyVrXvNgfgmc}(^!%8Z$VRg5j#Q~7XkW&KYh&Vq*fPL!m&??jRP^yfnox_3F;GrQ$4pya<9V;2y)L_=2-z9L>;+BR-% zNPP{U-*F}uZkxUVAZ_9=PY#`$uOn^!1zm5B z_LPwq3%w3ZsW(wGULVvaq}~8er*QNGz;A*kKYEi%^%giQ6_PPS@Pg#G!O^dh8QD8r z%02Db3Wl6D=Q;0zqyBQ=r}d#v^pTJI7#wZ>`E2Pk7Bc$t{p{CK{e&^H_05vH7ol`SLNF}PM-@J!99O6FkAv_WidjN|^ z^#nl|;q1$)DUBJ9fQsb zOi(e?qe})S?9m-h$*?3P8J6Z$L)`{we5wldqCt5F80m92>+b|0W5+b$E+BH68427? zLH;OG>5Dq!cU8Cx*g8PQ##)cnvfj8w!oydpW|!7E1$zkMa7Uo_@hmdY=+2zepNXR3 zAn>CpaH2B!zUFl>6Mt7ThwYf53B%UmX)83-Z4fC@*wnB%Pf<}r-OJj?LTrL$x}q)K z4wzs9uYAS~E>e*|n}I`!Khh_A5Vtc<@c`yZK|3HcKhOhf34VI52UOlhOX4kegNLz+ zyA39MYFol8Y7~u~rQoDXP48R{gkE8ejI31D^WH<<0I9u#QIpWCnXBhz!v#`IuPY%SanmT{itA^A+io_XHbB_!7Jft;IoV?QnAL%_xx zJJiPw^Krw$(MUBei~tvRs1O`ozsxH~l}5p4g;3rDG3*jwp{dMu>kB_h!I%Y}2fz|3 zFY$V^jF~GG5Q)DMTPCuf~9rGsO|w5_i!(Btoke1cnAN+!oKu- zQ3t@#Z%44^Up~#hS<_Sz@+FO*Q!I1$Wrs)xQ66&|MPN!%&{U(BOt_;|RV+Q{b5$l; z7cggDLU}nj>I&n=72xP%a9{UA@Ri``La>|GS8*|;xCk88$W6NiZ2Y2lwU1j3E*{HU zecWx#v6;J=jkT;l05d>_aLclQ#9Nk497dPxVJ?_>Hw^$s{mV;lCDvot5{1ossFfeQ zBNOvHD9Mh+Ov4c%WRnhqM1jb}Y>@dtFD_Dnu92InUL3qQV)%$PzV%DYB7Zk$xtU6q@<6cXm&3M{YF~pCQGA zzjN5#d-d9aiw9HLkp#9cgY9EB|5vsXSegY(#s4Rk%3-;_88*!LoBiHV8R6ADdwD4g?OKdsB(C( zF9y{pOutXO0b{dSVr*Q)+>`|%Diy8f-b3|4vGAur?X4^_<$h$&`CW)cSlZ}tS~1~{ zs6SrAh-%MBf?e=-On4W*iYor$^-iv_&19^r)YFd%Tn@!r?LE|ouo#{M)GlI?Jy3`~ zOt|eRnhnl<(sZFq?4Ijf%W~&7Cfus8rm7zn(bGb_F2n~ye9MFh)340o9CnuSx`2~jIVNP6HfUk@D1 zTr}7N4UyZ2(~t-RKTN^569+!lZwY&#o(^w<>Jn5HrmE~f|NiG{+zty|lc8`J$Ub>~F9*j_2-?lRmZp<6is_p;W5{f`9{*J|-g z%)n#)&+&^WM8p?@EC zh^KO6=Yj6ege*z zzVgJR(2IWUm0*qVq|=f@pZkTh?znT`uVShlp2R~;L+UzcAF6UFE@|d?_ox4CRS_<#WNBYPUkTFer3;Wo2DUpF{aEzw+XkrJo>t+b@h) z6YYxk2>68;4VBbCA7AU$NjO@!j{bmKeH8opo|6>n4A7GkO~7*e!nk1T7p}`aL|O^q zId^zd+7#M6v3|VUjW~Zf)~kPuyU9?uHFz9#D31rU5LFvtxRbdO>=CnMYEbe|yOvP# zK773zY74VU{eD<8d@8Df`1H~l)6*wU7@Hop?etmaoPFWhXLg+Kj2l0uq~qiXQ%Yy0 zpP6=M+S%z7rr489$2lQay*?&=?1YjTK5_bt*_e%HOq)ER#Oa)7Q&wh-EuApAq~nAs z?zdbsO2&Za8xIZx_4 zRqbO|@>#gaZ=~L;N>VmhJySO5{mRNXDo=N)QR8pdN2*_1>gSHAO}@kVHM!8bi~gq+ zK6oIxQ16^%RTmD=E$r4q=jIn~v{G~@tHpdhc$c1CtCzL3O4J^;rzQTopL$7BElBHU+)_f(buML-e{e1 z>y>(TMj!orC{6!1a9P!i()8(T@u7F7mpo(LH0vGx+@Ll3hV)uzm3}=`o3b}WPtDiI zTB$Qn{dK^XuT!H>*Nv*%=s7idbd6pxXqjFOU#~r8zmANqP3=*Td7Peif`w%?{ri>$ ztMs~xW%^xwcehG6DjBgi#rn?rcKHf@LXG~lJn00be+uR6s)`K#W2jhPQ<0Cq8Ed-wovI!qZFi7^@_zQzK7V>-4n)OZ3N`YIXBk zonNinW$1h>P5&#hJ^BE`+0AN^+A}&zuTv%0I5|11^^4^t`ncNG8#m}yC3@nr4Vg1$ zKBk*S^u-Y(d+6fYls)<*tM>S;%=8VpQN6zLw$@u_UcKSVC#}YX7gtz|)u71m9xU3zBP%&tBA^(-jOd`!2lMISe*w!+(U z`awJ^dy!7AO)0!xmnEI9bfb*5dNzXbTe|MKO&^h#tEXh(kDi*XTNF=DIwv`ITux^9 z(q8&%mDF98pP~1aS1))yX=rk3R`<-SpVjBA(T$h&xb?>I1=GT#tWO5%IT^ZX+AAxz zY|$T*LSIs6;_TOZMD!nmUSI)`7ynY>80N*uho^xD$%!9)INeRz8H$=(>CkZ z%dIpNsZk}%^)zeQb$W4ywM-wr3@&z7eXOVS;gRUMdQS1V%OBjCbV{<5+1=V>InNC& zw6^N8X!o>;Zf6ziSxN0xUtLf#!P@e-6)h;uT7F*7uI=?Vp>6sJGC0ag)jL8FE9Xu9 zbj7yWmaP}5YTYDFmuBcD#gmfGNX{Lenb|$l$?2h+Bwe5;b?LqRS?i)vx?h@htl}JJ z)r`!Jr;~|^7mw6go0oqJXY@r@wobJ&_UH>sbZUmaC_^8gG2-;X?%@eYm~4GC{5uc- zJ6XG)(dkykX$$)G)B`f~C!v}n%PvP2oVx*SNYkmiZqZ{l>*KO@%lveGL9sri);j5x zQa!YKf7XsCKD0{p(Yv&>IcG+uH6l90I?+llI9i`-W#o>C?$yWbYWZc(E9qIK{jHDF zovNJf>FJxgXUux^_YxR zx@~b*w+Wpt7!JW<%SN19l-WZ!%C@R><5WE-Kl6;t9(fbH_OvqFj>zmWV8kRVddi4y z6M78nX{|ab6N-9fMo#a}=jq19V|!UWb+d?Wo~kcFDwXIN+4}H|0X_7Gp&EUEMK$Wo z>w!Uzo;ZKo>Vgqr{9c=te`Nb!L-U5_%^#7w=jGC*bDC#n?Hi!)Q%IerN|zwBveUOv zi%WOtIcfWJquQ3bQL&y~a-lAPp{B^?8PIK(v0yvu+ta1@qTc#NwQW{Tba}U`Xf(63 zN4GOOR_QN8)vfiM>~r-k70awyKQ0`jzY6Wj%sIDIKT={X8xXcu<@8&tUuj~s=-tKo zmo7=m(f2g6mgTI<+JXOiQNwLT{RZeGBG&18O5}29R=28f#jVlYEDFF)4Xm`3@vB1HM2GPm`I*XsGiFPn%Ns9GN-`7HGlx|#W{;$LI+h|*^)#^oSz}@<01-NB~ez?iz6utC} z+LX*!JCtp?Xy^iK`z<}4Rn~o-I;^+89=$f%%G3u!HB|-HiSJ#TmD#aCS0}A$ecr%H z6RVys(1&LiM3E$&Kc^v{=bYxRRk)~*x#^-N!# zGcPCSIP2n;(aerHr9FoY(2Z+O8rrMyR#11&P17GIRqH$EX6O%-mf>%zj%q9aLv-3` z>x8V#1=jQ)D+~MUbq%Vm0lIk&&9&Emh%kMByIQ8N{SdP(s0_V!O?iHmzNlmsP279l zRn^aE+gh`sv_P+0Q=Xw;c~@nWRykq4k+>J$RV73%OGgQ;N_y|Rs#q^s17j$P1m3J$ zTP54OXNL6xOl_%p$sMR{&j*k%7?h^3*s3xL_5S<8UWGMyWRI9efXY{HMfV+E zq9^C~aCCBso|2!5TASDCX&4mw`c+kX!oZ|<$+z)56gUbObg2R=!3rQMFY) zv8ZI|w1^&@pOZ6hV7~>rT{cFe)oxG0UftA6v(B{IhC62JrnP&b*JR~n>f0+eVut}s~i=MMaugC2BHiny?uq&)rC@VWgN4~GZp?YEcj(vN?rYImML>cP%>wv`dinS?*sgWO)8t)Kc39k8Q8(n)Hj z6&;Z|B4@;{*2vpVtJ+YdXGaS3!^%oaUYoN@e=({=f7PJG+Mw6BDb`!Y6ytB2`xn2H z)=uf=rzUk$NZ+$=(=%)I&g)_N&To(#yU`q9ZZ&Z!$P(2>AwSKw*X8UF}`pt=KI+*&uC(-h64s+4|uI);2xw zw3-3fi@h_sL_e6Eq2HcdjK6943xyqblw+BD<45H9BUR=3dh3s9fqs2*wSM$SwE3{w zRoyeKPWp||<`eq&I73%2fump6s%(AplJZpjNv+zv10%QTwj)>TPQ@)J>bGZ9=gvA$ zKePnN`gX0#zz`-f`nO8zppy0bXh|wk^Y^(mddd8xHH8BopTFQ({fD*dwxQX*3Oc5r z{+fQSp_SUQM`dn$`rvB{^!N-aTipzQ1wOX(~Aj`=kvyr2{a9uEBn}YWsM-H>o=5#FYNyb(32C z`*v7Zcn@Zn-?q<1{6J<9nNL(UQQ7*ByOT1q^nx9jivGMCnvJuQPHHx-XLQkcy;GwP zXmnuKJ`A&VN<_~rIcvhPJ@xGD4cB2Gm6fwWH!s%DG%P*^P@k$C-DS=7*q^nqCWhzg zJ1eXfTh{8&L)ld`uGQn$tktcMr~t8759e&x>5-K27}ce^ZKU&%qNEd&SFIh^^R&l0 z7Ffy2)>pHv&|Z?(Rr#A-2KKb%y1 zWa<2FxgEymbWFcGvwM#P`tMM!K0@iK*zaZZFSNSn3>aBx<&4os)xzD9KGD)~Ju3!U zt#osh8O^x{TgS%LdR9Ibx$!zbTer`)O0k=0iivP`c5Y_ofV@uq3r6I;KK!>+qL~Fb z4_M*5Fh}JSWDXdWUeN!FqaU8GTkT55mH@(yR>AVD96cdTA5&tTw5s51Yr*%?Y8a&@uDA{&~7hMlRM(t2%iYRz$1%B>imUkZfyv z)d0QW&p9Rf#mFHMqSEy9kwc30razHuujp-7K~~R#4fEmeGLUEJWp`r3Uo|XS|I|JM ze@pa+OVjj=4YKh!L*I3k%73MQuC6{%Zsnh@*I$}(14c78mDUdZ#{z6eVB+)w{nDKk z+2Nd=3ogcPef*}8`qrJH?D_gRbZqhHaA~(5xw&EM1nbh=0)6)fp%Pj*$ET0P9z7RZ z%R)>}+w|eJ)@`{x3arTs^c-x$OWovX-LWw1+XZ?>L#w9qkZ*IBZtPyLs$;r!{PONr zXT9hUYgzJM{b0C6ztuXT9|~vd1;-|3DkNgg^sMna^qvV;jb3zO?Z~e0zu40nzckk> zNZC72Kb;auF6h{)V>qdEO6F<$jm9Oa?;F@8Z)~txAFiyz_eWxblH0w?I$`^fIfaFD zblIBu`}E?Q=SGreUag!8!`ah|Ca^_dJr}mD1rCa4& z1v)vByE0c_QfsAmOh4=MdGBQwjIz$(Li@WkrJrtEd+F3XEKX+*%PB3@jg~FYUGg8% zjnfLkdVNL4UMwV~x=V@9%FtcX2F#x^KUa^;N7l^I7sG>@wb4m>YBfH7Qq|kD!rQ~| zjkl0E(=)cp|4Oi$vtwy`l+N0wE$-rs!SiTOj#53$Dw7qk=pa~BSZC;P^~JvE@k_fDPLOY zdcDF)VA3g=71DIGV*N1oMeoqwC0kEJ`WLQFYI~%9{Ikm<`ps&Mb@`FcF0*!pH|nk6 z@{{)`Hf>C zYF)Kem+0O1Uxtn1R=rIhw+v@po2&E{KVOO|e`$j?^RW%N2xoHH__T6z^zk)Y3c6=* z8IgJI{297wzAmi}&+M!Dp?C>KxdUb;ut5>vR4l4e!L1ayV zh06)wUs|JYSSDthC(RVYzzd8tiMV%X4yb zhU=y^gK#E{1^Mr$HP`6B%JZ$9%;BSO?i?wNMxzTbJ?}1GW*tx1G8H+{@|TpEdU4XS zy;auus6H=(6YJVST~o1U4-S1qZLSrz7L0$QT(>V-H6OXQOE-?_t17k)?1F!pIaOBf z<5je`$LaqO8M|Fm&tp6J-zG5bZh(mQ;X(y#yp&z`~c3U@~xC^ zJ#gBbbYjZ_Tr;p9(obK1S%!Z08=bG8zy7i{Idnn=4nr7%Vj|OYS%z-3ImYMf>6`VE zBj^IiCD{d~bPZw({cWD6FQ&gO(r|iIh=9(lDJVTlH!Z;!F5J#svl48jg}YRz?3$mY zM`HM%yhayb8*<8KY@{ySjBTVYvPy1Ph0$L6vA)x?($?#Fv({kYoL!>}v-Qc@Td*hGA7@n_BEw0idQ+3wYVgfP3Nk!GYYC!MD=0S`u{QZCh$#^>)SBN&GLXE(goC`SU@}?G-*KvnoJ5R z&}7nr2sD$nxIvN@H)zrpy3tHpP`0Ek2nb1A1Q(J5;sQxo1eX*9mm_HbL4me_xTb7w z@Lf+i=ltLI{l542`#gtqGMSmo@;vu)UDti*YPYcKsXXfKe}tZoVr)`@g$;rIH*sX6 zxvQ}3MV^7v>!bGkZ2U}WJZW>LN!FAMEfJrbQF*z~(_YdS=v5f4)y(uOF#4EJrJ z0;WZ#9Sb-7(O<=i_D`|`;$+WnA{&wA0N&%E19EqO54-;=PFSARiH~UOvhK{QC|c1( z@0TlwDI5V-DI%z%{oR1E{83JKIODGckTo!;HNa}%szd-MfQojM)9Sv_*qmfq;MTk7 zt6@%={J3e~3{$Z!wB2m?45x>pcNB<%Lu9)aX454+{;RPQLf*qi;s-tpx71X1;wpaOCD1|V&6KD7rG?rJ)Z34dD~i*2FzJ}wTX zQgaA?{{4@O-MKQqA)ki2M`_o`#a{XCEDs;3M?>8)P`7+sY^T2wtOU?v(RZQlTE1jRqFYS!QU%t|kCV?V8Y}H>!p;|1Y@jj4NFN<2RtdTQhQE(KUdOtewSoN?70KdSi%CZ(?_MJFnU#`5zxvxo2D{ixVbmJLY4N2mCT zHB<5YiI)tb?4pggGZn{8lgH!W*AVuV(!@0yZNH;wXc%jW=qXC9N zX3BNakuSS-VF=<|<0r9UX7JVDkH$vxfI;pgO*~!G6)VqyV zA#FOY4AMsA6DO4x+FTl;ALL?OeZ>t7y+Yg$3nB~pTdBNXfoD%c-DE?qsuu$YMk>xN zw2-{Ehl*|q!w|%<<$;jd$|f+K-b!{a#}zJgEDRsa7u9vNY+aA2%c{ve=0Ga%p77FW z%8#(Y8o^PhNgpE=VK&pzp5a&wTLgHX_9rG~&{wfRgivZJy@2~)I~*9ZgAT|UGeK%* zMIV1w;-aFUkZG->w|Ye#HqErX69o?&IgK82CtPsQ@nZhauBL~Xeel+8H5eBTKnXt~ z)LH9ZXc6lrK7mjF(gPFtmNtnNsOY`!?xYl3JH2xnNd>id6)JlBH1hKI-zjG9)GpA` zN1q+#Q$FHVgxM9k&ChbioOos~hKHn+kucd2nPmZf#m4m4ZT^$+F~Xy;lWI}2*}iF_ zmTu7m!Lgk_y;fps&Zpgr;c!LpI!Sc6dmD?}ogdi#tSFit1&%J~YoJ0C234Sre#8C9 z!H5ZdhL9Yy&rb^?Pl=70jsnco4;@Hm-N@(3hJ^PH6$fP93Z6jAy`u4~NGfu4H~>H8 z;}HcBic6Y;w7m2J5||-rq*F&#XG>X3*Ze=VUa9@e_-Xo+7POtn4}x) zl~FozXEb@-ZZ#A09TjsAOrVX$L0bweX|p&7)XcAML(oy9Np$j2K*^oHJHrS0$SS}j8-bi7VvJ7uf#{{D+cW6qw0*9Nx#X*cFZ+(hwi znhPv|;s7VWkM~86&BBz8OJaU1P(GyifbMgXSK(*2DW%{dtf5T4&-12`hgk(lV$(mm z=mCes#LzeN4+G6HQGyAs-_fSj#vkN?}70p6vP` zqA*{8M)(^7^tAs_O>KZCSvCehC-|{?rr(OB#V^rMWx%fuJCygu0!~>5O!`|OU~d2} zdq6ou0Ra9j^6Xe@^rR|5F>4IJspa%2m40cIbsdxUuuq8r=;EiE_DWo)*rJc6NO=Nw=RO>V>Ie4^fm8vF4BXaH-grGCiOwv;3Jd0sh6 zfqeiy%xJ6bpj&~Gk;Pk0bCf9x&YtZDA){2?21|on{kQ^aK~zK)*A(;>JeB-z5n!;x zy;QW~T?8Qxdq_y(DUsdYf`!{KAP)Dk)ADzL5@E?gkC^C*$PslSu*l1FrE5gYyNmsBz5L>+^|gTJ$;zNZV*u=E(gQ{R=tEt%k9AYTp8fXrrq;am}@# z^}?-%SyZt$mOUviXA;g0F->2*-GoEGB8d*`LXqW{1rQ=I)$s?j)y;F+j6d%5(N7#7 z#;xyi^Jaa~WVK^{rJ4G0IOz?b`tL{GTiP{QqA0 zRk#25ra3eNE2oJ^-m0YIAW!WUO0zpK-l*x>V-sk6yUgD0IuPRvnLni zH-bk7>dxP#Ip%LQvsdGgpev@)7$DdnD%gNYqa;D!Y-SskL-`$liu|B12Gh|JX33(< z4M=<4C%c>I*9L@PYgd4Jzj~yHAvvptTHh>+P@uJ!-&M`Nr~K$;a&KQ4r4DfQ%l$nJ zw4A?N{dEt(0g9&+04XCugn8ca2BPtrS3o_5zV6|tPXY*)umlt^u+YtyRNsm=dn~T9o9YYF_CBzoTaAsbGc7T|?PNF@xGVh%Z99J&-iykmAC-^Tr6=0&<@ z@Gu7$+&;%!Rn#wGgM-J-wStkxs9yxWcC|!CY<8equs$FpwwulQ4jcbx z%XdumiA;C=WuRmj-)0UpE7zE1$svjQHs?v@VkxOEzKU0gMN{9xG(JzFa;J&W3h-zV3T4z)o`%%7jeRf z90s~20l|!N*c~1TJ~ts`OH6-4LZ(YG(K^Ta0zFR!ZJCY=F`HiWa(nbrRL{oKJyBnZ zLrmgZIL!5#`Nj$aFy0Lg4=_tEb4gI-QnEL$j^0&R0F-N7HFYC(NqPy95dxEi#x8|} zkIrjIstwqGFlk_|WZtu>tMIt@rq+xDEcLe|fB|i5v#-u1NMrl#b?y%1MC z*TC*=pf?l-j5Np27UD5EJAm}Usr2TCqzEw@a?k%c z=l7I;U~LZ9ngN~cD4s_VL=>*qIX+XM(%X16InbUURQp^Y;2r$GoP<=#bpg{PYD^U` zh@tcJAb{a|dY~(+@8xb}MjxFni;z#@u7VLM=2>zd_nZK|k`|t7rmdxRV-D^9sGA*Z zws?6XX5p*@(|dN>>AfWr|dWr!22zvndT>q=&~0(g(F5Tz_oet!P!o9<>Yv3qOM z+i4+kN(8_Nl#wcl4hEkFyB;@kd_5m2NdTRmUibNkEZ{(KQ^Z^to&+A8-DgS{IT3Qd zlOzNL!%d;a#@N)6I^e9p=%kSuDMmHh%jwqMVW=nyS)jxE80g+evrRyo zU_=ryb%5Izngl?7ra0Y57qC+;pYTbZN|3&mu7UM?H@HpoRBmQpP8X%mVWQ|313O3H z6c3c*u^J#fvOA2$W5i|`LSiiquuxtC4N&nd;!OWuKBjcqsULvhHp+KGsK6&Ke}z(| z?b&}HwhypFoagPzZ9NcTRrO|;=4yCusr`d5Bp2PuoQiZh)-yQ3$_}&bEa#cURe<+G zo$S33aBh}R2_y1uWs7f)i1ikz9RT_B*SjGGV+9&KaF)eln>D~?xAcz08);9kASliN zgkSCJmB>mqzv76Bh$vpG@8zf4R5aguGWzZYrYRcL5|z z8d<$(wkXr{@SNX)CB9Dq0SRCv4{bPwkm+tWQbJ@W{c)_KuuQ*h09}x$;I}p}p_uyH zxjd%7Nu3JX5YNBAseLzJGSGd|x{<9Qj3m8!H2avUoFzz1xh|}e4j%-u)t6_(ZTxZ6 zmYY0mFb2s$B(WBHtK82V6A?qxEG-Q&&@j~@#3>fBK+H5l-NAv4P`QacM3=ZIBYwnS zU7b%;u?m73$6WgGgL33CfNmbffNi@B5J%ED9&D#O+hk0GN_yU%pq3p}SA{70``;C~ zpnVSjzCgH%R1yF@sQunrWyW1ALmGg|;t1-kqANR#SvW2wLHE!o0Iw{&Y-$FrsV()6 z8k^k$rJ~HTMpUjF1rC7bMuQn4{`T2Xlo9NT3NZ!}U`ZBZv}2THNI!I?Gf0sZ*iXYd ztPZ_H-~85-#bnHx!BXLeKw2OV<*z2XS5<)#7emwB?HX%HBel~AJEcbeZ<**xFJ?_V z3o@BAEe@kIBkM z;;j?MPog5YbOWnl)w;2xMi|*Jj?n3tJ$Xdoj4Un*(@QivGDiX#d~%{Fa^7o#8-B_m zm>a2YFBGKdjcLA$(G*Bz+6bPApgu&$ zRztUuknEF^Y2(+>RDtP*GUFEJ-Are0@y-rVon4zxr*AQk&u+qBQ%ECh%-4x?$Gr?m z)j4Eut!tDp`)_g@J+emW�%3=SrRQ9adBQIcRXOr1j9*4s5V_tTPm)hNv%4 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Ⓢ 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

      Uec!I7spIDkCJ)+g#r{?MY@ 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�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%0Ap2SEhvH&GRM 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
    1. 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

      EC}+{?7K_&-UZ9-JGwV?)}>w z&kyG~ek|KE{(t_A@ooP8JM+2^X8Yc3-F zvi-VmkH5bq+po&@PiOnZ+5V|)xAS-N{QJ%M_pi_P|LNylXFonO+uxq;7eAwaulM?Y zmiKv>;6Hx&;J_zdVjVb zm+dEJ`w#QFD*xW>-$(m?|7zoToBi2*{xANk(f?nX?HB*G_-%N-_g7~7i@qr&_EpZ?e5`?5|y-TQO#x1zs4^0%XXkaAz<=O6t2`1}{- z=l|E=i@%@b=Vd;BI6wbL^Z9+>8^15}xj8@oe}7_relX|hr_202t3RLj2Ic2hrC$A- zY>WPVa{j$J{&(l|{#>@NS6+WCfA=?2-ap#+|M_{}cmKcS{-5^!clG&g`S)+k_LH;y zud*%Ud*K=5+x-4n>+>_yp8UbQZ?PvI>G_-MwfVfC$ouW2efqxq`v3093Kbvy> z^(m*D<1O~H=;KGSzb~X76@RvQzc0-1|7y1H`@10z#h#b@e`$WcY2Uy9Bi#R!(~mxv z?dJX8m!FsW&+_kOwr|PyEZfcgKkNQ~KmE}sX21X2Y(G}_|1}?_`~Tg%&(F^Oe^>tf zH?uAC_x}9*P1*j6Y=2?4za-l-{!hxkpEds9{F9vDpKkqoSI*OalkIQI_8YS8XZvcl zoAUEUfB(-@{{LmRMb3-d{zo~lMNWSrulpI#nD3AF{eIow2z@U2wBWd6my6vkIPbF) zcN9DGmb60!mu=49$NK&!ALIUiYu^6@*?w~Rr7}O4=||q1?dJIZ#YX==(tMTce=L9Z z6WRW!e>2wUS@-|RUjK0!=ahJ-*ztnfU&{4;lI@?^h-ZFx{{3ayZuaM6egEH^@zWp9 zw)C^e<&PxpDB~#cS(*3G{|NEdPxbvvf4(F8wK<=g{rO1O|MpzpFV1+o#8Cw|7debohd|Ho>o7>UDX3{LH#cShcIeKC1ayi?( zUOsFVe6*~W{mawpmGjYjbTB_2@zL#Wzv@3(j2<-8Wi{XtCv|^3dN>=4Gn>$* z!}EGEI(a&)+V-e9J6~4!8O+Y*d@-Bn)w`q9`f|M7zFgew)Z=l#9$Zw@M|E2b=A(K! z>YZLr2g_zQ?Oi=zjSj}c@{rzqwBUEWcE%`1^QzgsoJ?-2=Hb=2np_{&XQOILua8Fc za5Q(1b;a{lZ~vgjg!D$!VbvTnJM^Zy-toh#c6xAnx){aO-R3kOUru(G*X6nV=(2y$ z|9`$}Z(pv*m!qnkH?w(fP_8L`yYiPz!GqcIQ)98pC41NHTnn^wJ{nv+98J%b=T*Bu zZI+KNm!s>dZh1;|b-L(XPFZj+)DZWF*Xr%`VKcp`u7>^5qtX0qv^PC#rYz4&01gNB z;C!?@pS8>f-%V##vom9{Z;zMrW_ni5`p5OM8ZDL&XJ=JC-F?U(lXiKt%SR{tSDiM~ z;lAc?e|pN|?T+Tn)o3;M!_i<|&quwhW!-1;%DPQPliB>Hcg{*bW$otGgZhfcoy;tK zn#AdDGhg0ReM^Yv+_G2Q+)Ng&g_UJ{G@4ZHHlvq z{Z9S}}FHeq_j1V1}jjzyqbYT1D zWHg_g%!=eylluB-Hd`K^As&P2l7*=1lSzwIA56zL$XdmEzB-?dk8h@k_OhNY_g<@- zZRF#4FqqONN0aQyv^5B+ep-)hsARFKxn#iVvpah_EpycC zk7s>JW-~#8yuzVc0FUhur1=Mn}I76E!u3nxWv`pA+ z{8;Nbxn}B`0qb%;X}LphcG>;1zQu60&3JUs+6<0I1KKT(XFjPGv(shod{no+u?+58 zUn~#oX~;b^mzA<4+P;JdL+D2>BN$w?=o{wkY(9H>(1tOc?k++G+jd_XlLI)KJ#B`p z{bD(tAjg@;Yqh^a6E{g|r=G1s-#!s(EFO zA3{!%no&DnNr-2ut)*2Awl~#kprYX#hJCt&W-ms)FeDZ7ax%ZMCGa5IlX`JcEiqNt z1pfcL|NlbO9?oZH$ohhgS54|iPD042C9YXK9Gzl_u`4|Ep8of|{`W#RG8=3!FF!=_~P*lGp<{{v${SSdCHoF<)gZOGG%$?FJnkY<+st5 zbTLmB(vlXRdW21#O}(lT=N-(4z(oiYgR^=hfx3x!%RnO;D8C*t4vU(1#HcRK|*xR?mB=B)UJkZpUb+490AMz{hH%1a>Mi z<%g3x?vF8Q@E|#YgT=bHmY?>tR13WJq`pr#(c#NU=U#A#Hk9S}0kGr*??9;+-Z8q7 zzdksP+gbR^Z+gI*UX3N3&6$zT&>Sq%Kb|xbDLKPxF&j7d$8n8`l+iS3dj!~OfQ3@T z)z8a>*lKg_l?BRU?);2IY=5!U0%3;&n$LA^S>Tr#}JmyE+0nws9}LU2NphPd5(YXyW1iSOSB0^zdTt?{_r8e6%c#res(Zd~2&o{qJ&V?@R}WxtP)8&r)36BciOnC35qdVe~Y zOT1a%ixECTKDZiSw`D^P5xqu6{C+cMTH2|VTuW15V$h~jykX7}R_O}OnQjZp)YMYYnL;OV@?FN6A#cs$Vc=3O?4leRXtU3`Vc>do6+K5F1)4y zc%e|u@$t05ek|{U`>L(WYtP87=eJLH>$wc(a=tYf*lJ>GSx5N+ujwU_qysZB_RdzH#&xa9mW7B%GQ)~fYT=nM5 z#r(}YwI08jNp0t|>zfzeOho-=;Vp&gd_29peses?1M__wj5b;sVWjYh!k+4O8z@w@ zk7wxbn)M_)d0HmZYfDJ9GRXE5+c&69)$6qln6!$>dm_JF)&QvGC9Z~-?Pw@Vjj6dD z7@Aaq27#d@U+vCfjVhHp5qO1oO0OQXnr`ZZ}g3ffWv;FBbomgwOoV% zGvZ(F_ACt7+Mft^pw~N4>s9zcGn{ z=a>*jvOtF z_=1e;JcSzm{-hljzoy6#Hy6^=KAc}V;GZ5tE>u#tGCtWF8_Ngv7;}q+f_QOv@+Pu` zw=zt!vUXt2UfW^FtubA6XoS(kj0;fbq#a%2oCrDQ3XJMArZm4m?rkE&n&|$_W{@M> zaDN+TyvNETlAT_JIGNFXCV5`I9nn~zZTT3;UzgcN4 zvGfzx3fkz zU#)PyiZC+;06_*iYD#C+Gz^Bo=hmTU-v#P0|9<%lwrg$d!d*Slo3PJ=13$f|e$C2sDQ;EeXjU zGaQ>Xd?AZz+qT#fU0F>*4}vgl8;AgQF#_bn8K55{v7Gfz?}T2*^MNd6Xn?G^ydA4I zL-yMJ#bcbeoGy$aIIu5oZ-ctHHR{a1*=(Dm1MNT+o!$+@tl-N@?;OgPCGFcMtq%(u zge=T!6KhE_7;`Ez>kZcF@fYM>1K=Kwo`Ri(JZFosJWu1f%`AZC&krJWlDZz7f5@ly z_^^kdjYqvfzZxblbW}eDvnwtoE?l?AT8|@4aeFG$t%zCXXAw*<$pPXbXs4iBp&qb> z$uQa`7j~|yA)Uw7K1hkq0y%UyFOQax{vz?IY1vKl0gXmdwNDoE`*;+7i_;L*AMwm| z20K(Sd(#DO&xQ_(C7&>%&-L(84eaa}=f|qna+e|tg*y%Z^mtvWb&AzZ0zr%}H+#RC)%pq7bCFq9bR5!MCdFgTx{9bObo=*e2f3RLubIGb2m z)Bh5ZLv{xpmQ!Kdf_|4AifkiL+PM;8p4$iY4aO1Eu(%DYtx?^LLt4p!v`0i|Pj*sM zSk<>cN~3VR8>1EQ4oCC0D##zcKObRm<>`C#EfXq8FUl6#7(X73U?HoKGFEq@fCD_FWG?i+Nb%xkp8KyBD8B8@e>s22{dVpVY>2oHYj;55R%>h$7-3CA_%dNv1Fr{m*RbcZG} z3@A4>CDmE+Bv+0`r`7eRUg8g%!#OV3n1u*+cF}a+%YZ~d$E|Y;Ug{jf3bC_l%&RZ; zB-P@&9E}IDz&*(b$d&B&A0VxA57Ei#!!TO%u3n6X1VE#}zl!WkHYEAS)uPioq^k8#}}jUftg326G(eAIynE8Q#jf4QbsEQWcAPTxFI ziE%ZY^&lGvlIn3M9x?US$-oTVJQqsI?m1^|jmO5EcO)XjJcO2zhqwS%_f%qm*O+f% ze1P72kn0!av+a;DlnU>Oz%E`DwgOfM6JP5-T7Q9Bbogv^2%!K%TF$YA-4tqeR)hp! zYMqOKCcv1*3YL%WbJIr)EXaT`OL#{1)eDCJgpLy=DY3=h_9(PU%|zDLHtW`br+9i? z*Z5}ZRBjCq*h&b32Hrn?G9{40ZP~9h7M6Q4=)-z>eymgw>aU!iJPP)0DGG(0987)0 z;DQP*n7O&Fg*pL@SmFE4H4v|i5epz5kuehTMi_Rz?%^E#i0;K?$+X0fYjZ&84656b zWeQ1d7DP$(sab^5k&7I{(4JvNY@kdRjxf`@-}Y$vRM^|hRCru~dQfMC2|NePs;or^ znnjQgXQk&hslo{_C)<%Dk{d8>7?vz%LIz(M#qwicl&qXUyh(u_O@VyC&I~@ITq?`Q z7Cm2Pmuc1nKdzq*P zr7TA*f8R0~iChfM92>ZLsw#!X?dq z$d}m{I~j5(kV!KB`0OXrvh47|Vs{+)qwVm#LY@i;IlRQB)R?1#3((1NeVRU#`@E)` zVSA2NNy`v1SV8?l(^4J*S|+ex$A%glW)*6n80v*p3qzGrQTq}uu^XHnj4YWKRN0E8 z0T;)EnyxPPNdnJD397}D2@=bzPLG_C$-zprmBk6WfUi+loXHi#r35Z-xqYMx%?Z>Ck|?>+rf!ortw0pDIH!=HUc-Mkb4DaOnZfBc|D2 z9-kAw-TpK-WPtKHaDK>=M(UcC8JP`JYh|3Zo+FjnJi?To{6w*}f%XolFU`>-7 zM4BMebaW>2b&8{{nn$D&x51#{N_NK z73QAGHB1S*nZ#456V-m?Edn|ra2NN*U$s#zVV<2|TrXuU&^ZR6K|R`sPXL`WCdHj1 z(gHy{C_9edKqG~6chs&IXPwBqEY1h#5Hg<{aJMv{l!ei#7bNBlnZP^ux=nYI4C znB``%eK|&90BhXCu!>Ag%)}QZ43#Bbbr4 zb<7}ZSzX(Q!h_et=R}9s!+X(C2ByDWh~~v;-lEhmNLSP_*dDGCI)Dj@dXADT7%*4K zDKN`Q7K6ov(dBHIJui`{a$pWUrBIC2g@|gDS=m&~7;=L=zt+2l__%h<45fKE0Aw?K z*Q4DsF?L0sOh{HLGs@?NtX64-cNV{(mnxEy!|~|x{o_&_K#29ufdk2^5i~xq<-zmr zcRozY2PkSzZxnM4lZTaDGCV8=ep<#CPbs`8R3WiHn7?ewz4WQDi+fXQ!&Z{pNoW}1 zimWD_C)GWJ^8><6+4RAMEZmwN2jOAsnV+UaDgSeY6H3%PmC0k$5qwA!O}fJFliB{` zYO$6a+a*Y?BON4O^uhU~$#EBN7$9}jRrhfTLxND2$yTR8!|JO3xqZ_GZ0$)uQoh+) zDcL*)TF^LBMOQQ8tkdLkk&apWct^&7#W68s&g-;h5u^awqCjpTe}n{;X?K1EpJRhyn~^CKjnUyWKF;XIu5V>YsAoi| z!$zw>)b_h)=i4!7%ycl!QD8&KZRAvqPy2`WKU- zdQ6rXgf<+#M2FYohx@j^NmwOYgi{9Y_$qK@Nq;TRArQoO2}=gaK?GHgZzy>=qaf-G z;{ZmEN3KCCxj4s7{48j~5hEa0K3l-`z+p*j%p7c>^YD$!!xxhbDTBL@40J#yBUMM) z2)rvMpzKshSk@Q_5|us*o-+I%4o_y?&>}a(d^!wndE6sK|gP+6;_0U-Oz7a%=l?H1taCOI!`pL673=s|?Ag~p{LaOn@7W&`rps){Itg1qg z8Wo#VWU>Hg3dWc(@vXQjiU6mXRtjeu%%G>M3{oAIVYRU-A37#J=)a0B@QaJ&$^VhHQ(F>a0P%d*+;I0cKyJ06ecVP6f5w{OunZ)ODd*2 zJFuw60!VlA1d&etkeW`jG=8Y%$$yG}lD)HV$t3m;_KAj*qB?X`NE|;a@K#g+cxHdh_Q* zd{Z(&RFss2d@6s8=40^qRNELZKEMDXCW0!K01+d+Qcca1=^A;bu5K;GLx}t0I&3Ni z=%xAWDZGc)?-1p{T%4et3yif`cNhHxsmi_qBI6u9?C+WEm3gOP$n6C!bGBCj?;I6_ zCxsj)aylhs-WoUcqUwLT>T|t3CCe-W@SI7_dsQtPsh{>m86s>-J~zT-Bjb?K-2a@9 z`j;e0?aletR+pqCI}8X_M+{sbk6{ywpqgb6XvvY7Ak1m-h2;xT3ucbmgKbS)`8;%f ztwxQJFU5yESN?I&PeaeM&<-;f9G$|%9SrH{HLOu}O?W7{4bOb{AT zVPr5Qd~0t15I05=F&$dY7ur+e{dQ(WZu)_nK z?p-M;s;{7$b4LXx;$;%)+RKwQ1atir!RJj*+p=XCFkLo69&Hzc#jH4N;=)YQod!&~~#04uN6~%4I9VM6uT* z+!?KS{p0b7qUH$n049t0vn@GW5JV!t)*jDh2<8?9?uw zRopvenbD&qX}i2g{j@A``yCi|Ks%Yf5#{_!ftyf_r*09>9$_oYd9WyWUBkIfdQ@}f*SR`v2wUtVo zMSUP!jx(){n_xDzZ3b`ddgSb@k}ju&*loxbWy+w!=Z$ob%!?5b3h5dWDn^#*OqLv^ zeZq*8swauD7<4CjjmdH>b#q07g3LKPT)w9Ks`JM>IvaQS<@Vh z!LYq?1?a>CIOOO=y55%^>+S`6J*2NBWIQL*uN-OGKe?q~8$(|#UFVZy^1h>qP>BFs zJ&Z5&r`#o0G5WXdG7%uHRnxkfUk|Ub({sGs8S&n&D2%g~LPm4>cefPn?%m&d^6;c| zPWTuafOXD0?GSO7FImr6vsPx{P(GQfY;k&;U^W0!u~=N>B~ z`P@IfUyoJn!OdWNA{FJ`AsE+Y_^Fq8=P1Y-y%xl6PO^pcu)dMR-XFnZl;Qh}$afG4 z*A+pSwNg=@mTE+KaY$R#0020<0%382-ow%h1_!!jE{QMqE_}o^Li8GiB|GJ4k7`9f zMo>4H6Ni*8A=h3C+YD3L_30^q;`9^}AwzV6!+OpLn)KF1*=U0(=nY3>;0Wu@6n&Z_ zkTMP64G59q4M}EzQrr;<@Ifc&>?YXiLzuvIlyauqCu}KAs*Q34l{wFLq=l5+b*`Ol znhQ1)ChyR8HIW#Y6Rhv;3~+YZfQ_a?NP*KFzGVL-sg_Y9876@ZUmdxF&Hzws-Af^f z7GAM5=+8T$uzit!2eQk>%?&!s^n~v!q;w=a4rfpAJ%@2qfVC}P*S-ayf`-9aG7_j( zyW10UFtWU5X@w$(f|KQgmqw&605EtYWLX=)994DQ7b_UWc&f#Th@jCjn<~QFVqll& z2SFnt-@%VYFMC0Wu*FKdi5Jf!AnYo|NKcQ4CmWv3^}A1(cQKMp;tzzM{T;S%ZpQ8_RPZPYGU5W3%W@MdbCpvDKStW74NiGlbP7 zl`vA2kPpa}D2lztE@|vw_l~54O$tBn60TN$t+&h_gmB0be|J5;0hLjLWglYmjoed3 z2^m~U<}0xgU~unsEh{EXHkzes_jd0!WdAn2M|M+q5BTeyG>~O?LpQrd2gXRVX{-EI z?BgZrc*p!`^*f>j?*SN=Yp{qMg&!K)JzU#XP9cD;20O}EXyJgXqif&?+bHHJrwVx^ z#~B42a4t{NOe%Sg$zI7}=5$LW=g4Dn{YWtu7%(X3%)&vOY1CPQDeJGGSTRf&(<&t4 zVF@O>xfJ;7Ohr3T5L3RBZ6|o8`X;A{I7NjYKn_WQLnhF2ZaKKQQQ%OsVH0jiTRNJ( zoO#18&3i@`40O)^a)r5lZ9MKl_@>2WJ(=NK$|B5XsMzUb7Rd>?3GpXAInKAfNTTPK z`4^^TZ?4j&Lm<$T=>prwKg*g*{%^oe-U`oQ_AI_gfhNS$gNF z&W`9JBV2B&*`|j9lg} zwFo0rlcd2BV1F2fg(z|yR5WQQb7|@ z#gJLsu%_%B$BHP?&LSWuZL1mySyzk~;wis{uv6P_TC~ukRtTJq^#mE>Vw29kbo`Xs zy2J*++ErM|l3?4}tvH(Fo0X{_;8Yd~1+0J!=6u;(j49rsgpm?6WynV-1dL(#m3q(2 zOxxZErKYxUM|ld_AZ=#XmP2`k-P{}1W$0Duh=0NaJ(cL8bS4@kW2BC4$1q+|3JlE` z-ZP<7ApIgIP&;Mc57yUP;Ot0c-Jk(Aafn|Rt*!J8b1pEmUa^v2%J1KO$VxR6UogRx z8b>JEVQ?FTmEXtTseT@L6xcBnCRJsrk4S+TVMt`H(#rGgO~o2P_Fm?eKzCp=}lfTxMQu37r9Mn~2+GPJ3Bw7;%Fr2xmmo)h8J7_P`HExsr#XH0VSiSUood zh|#(=Qeoi`j4Y)AORGXnBaN)M(eiXQ#za^;6>fx{uFbL+8atPqeSV`5Np_>RT6u4f zDPNmGRicRrQl0a$JmXSnv%DglS~=r@gB=)#9g;0$^fD>HYX-pMv{9k_8sn#w4#QZ2 zDT1U<<449uT#xp&fDE4}cO}Tt&dGmcCc^uus3mn9>w=kOMdi!$7>-*ZeIPwH<gB1QJCMn~mmS0&?Ionwrz(QG6!ClzJICHc7)? zOTAkeC$m&WlRvk#$&6gKF6XA_Q8#nj?eD5i#r(N|l2oKueSve8b<>I~&8FfE#W^t~ z)*Po)1yqG0fW&#w42Pot^wxr=z1W^Dm&%Gq9C8A66e@?w#cvIGPv2HXBItFg zG?vbnVV&6dQNFUc$p#C53Ec>!MlxMp$D6%otkOn_9){B~0uh`Ip1h+rtw#O;Ie9LN zbo^s>oX%9MfiGfgUM@TeRYya7g67T!N|$OUPFD15&#r2_AVazw?S9nBAlWL6W14IV z>tH^sDW1jF&?OG5^L2WcVg4nGI}{rkPKmN&<{?k-OaUUJ*^O8sCByI{Ju(rO;HH#& ztW?YNWjieqAMAaOVoN~}w&_QBE|27>Flx5+*qFjd4P6)9s~B2N`ldJ29@l{SKJkTa z3IX~U6FIT;7njQyoy-vju4%AQZCyXdGDwu7uu>$tt)U!T*%hz;8^o+siEJX3HPqLv zgJTc9#1Rfx*?lYgAv;K?STf?UiOr9zA5RVld*93?@Gs1wzV(ko36z(65I z9RJ|#xEQm&F_s2bfST}#s4NX5L_)W0p$|UF3r=+a`>?eQ5(}>h32Q^a({_z6+oiy+ z6Jj;7$$Bb*rHE5$hSE)pt%Se2%c+%}llR`L@-9U_E``ojfQbW8fyuifIdT*1&BInA z-bE{rYcvnjfkCqkKvgvA1jbqzMhPWQkTSZ3aO-N!1@o8I7} z!}_)MPR4;N5_sllna7kLkg1?9&}la-h)TSoZm8< zc#X(lu*BF~m2+Z5Ws@l4_r^{Ygd=Nt|D>`%3^QOGeN4=N4>wbND}XRwKSVBhB7C9K zfPHUWmGH|N2`u0Zo-a>IH}C0iF`}$@cOI6cFx^swhXB2G(a?EFs}r7NfTA!V!o#Y+ zcCL%eAczymPpJuZQLZc8??+R4Q>bXR$x96753*8>6LQyn-_O(Cvi0WkqAAB%*AkvYd88XLQw z7vVrx70k>~8z2?-+~D4sk2nRWsi_!(eq(P+mqsuke8uNq1xV6{-7`)^D?+viIzEI! zf(n2p-4f}jW{BZ>+FhJ!u(?vBT?VJz$+~xN;jx08&+EngcdV!NWC8Joh>Q#!nkS^c z6&f*Y8FN@GrJjp_odq`yJb}=fc zfv6KgkM^f_wKjZ+4hk;_doq)IB&N`gXMqa*gD`DQ6^ivjZo-MNFg3_w`Px#xS86$^ z3-C0F0z##bCixT3eRsn`UK&iSHU%Sw+p`(wtJ{v>nlx-z%D&B=u37nppxnd@98 z3wfMBh#hfM*8#GM5GR2D?TIHTyT@rnNC5!L%x9eNr=)<6`4D!c79`+yu-&%0Q;>{t za2yMl+i8zRQFIa|BRZMoNk=Zq6d_%F=4Z>wbeu(5tZ*?wYSo^MAZrtIb#nl`!Pwvd zETzOB<*))oM>`XwS60HR1=zWqzSkoUbw=z;3R3JPyON!5d}fKC)K(o-h%Z>F4uf7o z5!Uca^u1Ho^h0Q$6iDbNYR8E*Io<)SMqU=K7;E?-2wl6YTfBa!4{(6g|3q}KoHq#j zDk@7*$z0}%h~m)KD0?ZVEqUr}UlgzmREUcCWF%;~Y z7J%)s0a%vi?g?82J^}zTh49C5q*->O*pB34FjJEqa*aAwDKPKic}L!v-Vad zU)X4G2I0NJRvqkg9CC<-QI33Lv|uT@gdjI2qshIfR5*_;kC2|LHfo(_x~QJ!2C~vu z0TG9;rx!leFh3_)r}T&rBuo4kw~7=nKoH+2xdC06GB1z#StqsJO)u{q9UUC)JlNZL zNAK~WPMpMx-K{9JZbh(4SA(I;n_46kc*lxFk!diHl8TD5GCXx0PtfRy3%m!L7vne) z9nWQ|!CIvd9dZR3?i^6;*2}|Dh(-pKX?bDH?U0n7?x8P1)!o6`$XpUxaV|mjR+e%e zCtC=6%NT@}a#-Xo2g>VIEt!7`vZxopyatV2W)Vh)LwK|yilnB+_|vtWmEWweS3d3j zMVi2Fu7naIEChgT&j{!6<78=cYEmLcZyC?}|KSYb!@2v!JM26AUZ;XE7}kjs=v$>% zfh=sfkx*tbA8Grk><4*o9)xd>Z7*nq4$gCzgC~=vI_b!(sP$#7w))@EM+p13QB^^VZ%@EfL(LNpfLO$%tuLAxz+~<41)xGk(>!u+QaK+4# zxNP^aObc6&1d7=I4hu+fQ5v+GRe{VkqP+clj5Nzz(XQM_sc^7$f1dsNL=xI_S z4O3uL4oa3!r}4^Ua>lL>KfVHfJei8LFKY(oF%(#k-++@Wq4BlMcR4*NHd^Pr0*4&3 z-pPXS;cnl3&8zUVz%jcv=ex9KCo{8J&Wm_ewP8nIC#W4}#%H*&<3X<4Gm2Pls|J50Ji~Nu+tRQ}^3Ad`hlDUYO&4FsVFIML-C?(1wc2 zVsBD6wNPr+89C)5TjuLi|ap{gtjFMjLy~1)!tcfm^BY-+u zop=_~gCP~!;aSxsa)lkM#1F7i0o>!TGb=?7o8&2*Jn??v-4eTUxUx1;X)&>!&$qLu zZ+*d(DSasC+DTfNZLFC*4U#9Sq~&1k6-cp}W9{^rJ!L*LVbzdxG}Ei(&9q4V5kf2F z*Ax>cAsS?W4AzG%9k5wJ1bL`#^}KQl=&W_!$Hh>y=@s3;B*S#nXc5IRq|DaPcK9in zv2p~gYBTqoB^r>m-@+ur4l%9k!*G6BQ0ZjGhU{1v&U^`5q8h4pJ{mMGmXXS)1KsDzRKBIS{$2~VtO1Gmo3u5^g3WcEO@!Krti>}xtqP@ z-y~Q@26!Au434uEjA|&ih?CBQX?8h+X}~Gd?Cyo@n@fYp%E?fn-0{+Z?8*L=WoT@( z9qlzQvF)*&TB-58t0WpSGuV9QMPcmPIcBlB;}$ho8$nb+VJt8zoT8DCEFa6M$=31w zldF(72Z#tE$CN6cf|m`NbVbO%%)I49@e_hVl;EEKPjMjset{FVk~XXj5c2+%tNAQu zhVz^$cG1aEA_&Z->;X9_)M5F_T~7dj5+Nh2)p0BK37E^p=v_BAH;*Q}Kxp+)h)`j( zm~yR_SOCK(*@CjbE>~o&G&v^sbnEcNKK1PmBnxy20F|xJ4odjKgp5eg z)%{YR$fX!O9bwN-DFIfoD&^McJo)uRRVehI(=tz)QLTpwA5B40jr$NVoVzIIHivKZ z!gyq=$^d5}PBm*EUA?gx++a%L9THKE`C)AYMqxc~$3|Qo&0U@Q?H&iG5*@9J zqbBuWAyM@tikZUTiM#j9I6d0NOKCKVofbX7L9J_2sGM$Pxl}C{CNGbt6c-q^hIQF< zQPpe64DFbqMc7Z`1&(a#3~&)wSDod0A*l`qurWlx1mHyEC$cQ^#VV9hCNEPtx+AZl z@z3qRfM*~!*@l@aIP#W;F^VejG_K8~7fx&lYA#>vHnyHlkTI!2}8NO6#+OXw^J#Yy%HtX+T&nPFQ3K;PDM$r7e;Gi zmRJic-db9c%wgbqZDLRc0AyFddd!>lP=v7|>|k{`;k9+?w5)M#a8!0B_EZ+$PnH0D zCwyErS^S`*9pBU?4R8IT!#VVY&(8H&i<)Z6LnDh&atkxg(C|1@pmFb z#ZP0KLsw+0boPenKYjzSuu%%;he(goC>OomkvGZK{*+olm)1zrT_)kB)>1);2}EeO zP97x)xOPE5fQrG(S!L+JAHF6$Kr9b~-_voGPTcv7 zayC6J^=%;%UCQhMlWD)>In{l=a3c%s;)!hd1EtmT@r{qf=*!%Bs>LmeZOop*;F`%> z0ItZ+Igu%%$)!7a%@ejT%t@#DAX}{z?@w3|8tZ*j5$VS>F{`o%k=V@N%Ejz3th;5P zMw)`bSp^Dh!fT*p2@!17QgBu(l{DAKMwwExg4&A0LV~P#U3(giHduc%fNXr}0~2Ho zif!oFMLT9iLvXy;v1yBJmCt8zrHS%~4i~|B4wxnVfo5DOclcdY>r6>rmY$6Jl=CR^3r$cEe2&)$Q_Km=ID}cv>(XOKgzh_Y zfN{q)BVqKA_vfguGn80yHCR554;bRt31W;;g?=_q@nbtW#cRa+LClt+S)rr~c;F1| zjp@txy=zLk$b*9pV#ZXGmHN39Cn#kIA0V^vJW*s=0*OESBuKh)I#!Nv{S+V`b^z<5 z?6~?+E>X#fcyUPy)>{%-g5b=_)di5$I!I6teW;#C>Pfz?);ogA{nWkWab(*_ekiTK z@g^cUnte9>V$P#L1-lI!nZk=4`*{C~2rK!K9FKH0q;D(VTHr(Dkw>3oq!-pmiZm9I z)A3uEY*C!}Jg`#ffV`DO%>MfhnYZmMRmLZXi;DmB4kTnDvmZ`Sm%D%jDHrPX*nTjq z5VNq9YrT!qi@cvQ&xW>*&xp(esLQ=989u$+y0hiFd4l+^%U*SR;;9bFzqUB6R7+YH zu~)7AVZEVtG;!tcC_JeCsOlF-B`gULy$2f3YsUknXue_9a7aaCN#qo%?O_Gav zQ(>$sVS|@fa2JS$z(HdoZX?GN_%H<~d z%+NY}A_jyxWGh_(EZspjX-&&=W2@yzltp#rvCI;;NB$46JhIExbgpyELC8Z@AcWoD zq~O-8mU%eJsY3JuG3#UK5b&8r7ZlVg2#ksVUXI2_Ei5WFgZF6}!@0^phdW%8X5-Ll zA0s5}$njD_x`Y~?3loa(!p1wV<7$qtR>xk1jWre7-**Y>ik2$#VP20qDOO!Uz1?;8 zKa{&6%3yb}&YpW)*#M<9u1W%;$bonwPq#4QXoQ5EviuNa^O(~Fy%iV4bbU`%w&m~E zFD0n$+yRGixF-?=2e4Xl6_KsG7k1nT3}7piiB-z6+oEfGcYHVAeY*dl&PZ-V?^er` zEiJaZCBsFR#?>Z|5KY()F;2pqie~nSJ+*8c^?3Mv^(tpf%N&y7FY~Gse?T*R_6@aL z4Lj*4aVQ*B0#_7ycO04>@^x45nLn2=I)1teq)2aIUr;#+Dr#a23y;+U>NT;~KvvG@ z&asSGfHTo3sIX!Q;fqFx$uXl;V0G!1TPu=Ii&m~-Ro55UbmMjfJy9oIhNiw5KKZmv zZf~6@X4^Df@|59FQ`^{XwGi_jUzi~j26ePT@#<8ueL`z{B9Q@(cf*#ULf%KmEnaR2 za=<1kNLqilt`P*>>cOeuI2+D}Yx@-ZSp&nwJ7M|%YO%0qBAeiiXYx*jyS2}LLCLz3 zJlU<>nYKExOD8WXeMFq7dW%(oi6SW4Gj#Wef+01o)Xck^DmidP^9uHc+XfBp)|$D;x}(rUy7#%eBIUj?*(l z(d+D@HxRDc>!lQIdJ}xYX}5)dVx={mfE_bt2M&Uz$nT(NW>hg>@rt4@o6!%eUIwe# zRoG3YOlXioL@wrx5|UC;dnxc&xI<3{nj6EQSvyg@9JV;F5jHm?4}6zE?+^ z=+FkB?Zlk7XC2wm^EQIBxv5>yVQ1>V{k^#rhJP+~%#wNj@}h5&42uMkwCy zrk@&Ks8BdeLC{d%NW~*n4pHt<-fO#hRSLDo-t`M0lV2gbk37lbN zTcFTOCPBa8QV|_1tjv2Bn0H>(!Rsxw*UN@-^(xZrih>ond)yL40yyU?{Lcz++4>H| z_IrBS{68M6Hf?>3sFv9lUm?x0Wz;RL!4x3T3vKNe<-?kYV(xH4gyHenGC_A^W5iUM zsBNPYNmC$mOTKAG`CQ44C=nf=v%nGFF<|Q8vLuhSCoa;>&MX*h%G%={lx0p#3psQq zS&03bdoq#&LWhIuy40FzvxSBvFsr};W4b>jqw5nu#BW;vxMi6w&jt~Mb~lyiLQl5k zEB*(pF6b2f&;1;%H2OL6d+J04GvH7h{((hjNnCL;d=eWv#yZcBqNRyS%m_|+%UB!> z%n+HiDRn6Yxx=BQcCQMZb9xo7ct@7dx6f3+9`Hg=Z`};M9pD^eqjPOrj%rZ`fx}pe za0ve2No+~|tj;7Z11MHxKfz-%tW%PW6bdg-*(Vtn^Ku^99nWMgt)__Sl7EkL17!ac5v_fX3FCn% zhcT}ozE$Boy*H+sT--TcTy-Eo0nvEuJ6}}+vyM=!ypt6$&Of?6Saw=LNJIr>a&wJ6 zfySXqHrpYI*ovy3GSofcUY!@OiGEc{!Px1}KVK*#h>5?D`KwAX|tD2LXjH6333Vv}IeD6S6bmT_%%BzwWvB4P452etdM+DvF_vT$yQWtJ3 zNaMbWfbzHZ8DUq=3~G^sCs<(1n~pcFwX;aCecZ;8f?+tSI!gp(F!4C3w@d=e6<>C$SMNn_FN4jWd|a7ccIGWt&Rj#GVOH}6;xF||T z%ZikOY}Kn!2<4oC;hd_zhS$0uGYZA2&;gr6jg9HkICaw%Gb;2cw_|(ra;{+Z3~Z_t zPWi%88n((aph0yYYXbu4eL4B|w*->V{(xFIr==i&(juyg!Kh(}FcWxQSfRDW1F{{o z&wa=zT?C>9_BCv8K>ZKwfZj$ilc^~t;fF0894 z0azixz+X@jfOK8fa9b`ljt~)!mH^Z4CbIXkvQ9>oJ~CXUoUBlagA@X{DRVgHY#Y65 zU57{3_B(5uC#$L$2M~g2=NIU>kCGCzY~aB0Z0ah7(R%H*&&*U@R$R9!{Ct~%&nV9O zh`rQ79{Fdy{46*VSA@x7jOc)raup0zb3q6lIw!^_e``tpkn~qO^_&rZv4KUrrHvd+ z4zFj+7eP>_Rx~VcCAHS6$+8wi6>L_7FB&MayLVSB;xw?s8P+WPSp@rr@K3Y!O>5!| z0B9=?8X+WJ*bq!rJ5*jovleDtmvl}UTk>L>WZcdSyqi7k0u4DRYtB?r76%*vn!A0w z5ZA6)XmlzeevljV#F>`6$iQNnWj-by3eAHn)cw>zz?35@Wv?v}*$F8Hj%=IN7zRjh z`@l1(dtm_)yg~O9%2RwpWuE36#*suG)LQ9;?!w?W*9?i*Tw1!q3j6ec!2;G>lGBT%#cPc1SAw9FJrkH+&PpkR@34XJz2h?mV-; z<=>90hK|UcMb!1d66FuH2^GL0qh{iIo_pZRTBYQc+&~`bJQyU}DOn?X1My!WXxe?2 zQlv8}D5sqH%uT-um;AI;gDN#%2#g=Df{l%6HSE5qTL^r_hSiRGY`wP<+#U%`A3m7d z^tMU_Rk{pv#I^Hy=f84GpTa>lm6qdyjuc^+AJ`LH4)od^kw+2OuAP+POITUGVhX7( zzZAVlIrQ{q!fPTO_SsXkw>FA_E>^-x2LdH4tS%2s;-b5S* zx@exVOdR2QbEBQHM3Hh3Y!hcBR^Vc>=o8RHmI)%SmO)cuTRfn9Wk^aXBh*OA7Q0k` zWvwXpDN?FhvAi#7iQv)N6nn`MQR!-YMFwR8_0HQ`+8=h1x6Q^sG-AbM+h^VByLtb> zLoq1Om1nt}@aFTpYac*@x0CB~c+l4>=Bz;5m5mZziY9E6*W8+dA;+5qSX$2QO!DEn z9bkr7Z{1K4B(r}!p}Py}rYf!|GvXd|&kQRb&%7I}s(s^h+3Sc;x?~r9e^nziM&8zt zqpL1ekweA-dIC%cNM$_6Tyw?f;2PcMp!J$-4g4JjkAS!ItYBCi!cy!Olja8pEjedT z8qp~A?(y<=?W%N-tPK#*DymEMHT1Z0>i zMYtI-qeE-w8{4iZ3u-wr84h1yb;k3_nGFmR!WcD&auuyAcG+#FbfLmN_(+|Sg_^R_ z)n(gwR2yck*ZyMn!@YJTYd~bII!?xRvkb)5RJafnHQ`N>?7(GZ`qHr8mEJAC0Woxi z2#u9rvn4XFR_FYUEnHlia$NfGgk7zdz?-hBf+`jQowwQDtUSfK37wdKGTtZPqPno5EiU5J&LEpkX^ErRF?d zjOv9X=@GJ8wt;0)eY|)9VP`Cql9`y{UOv4 z8}X(RlJHxR`>>5C7=VSnQ{sjZ;k>(!IVjlz z_ZG6TGg2B71pA}57NNHLvab>nxpH1$Woy>Q&&L?J1!>}BjhRdS5@QN39 zAva0A88|yO^b(?spbOal>%Lg4qzFGv&nA!eFgKBnz*lRFYJM1;;Kd&q1_n zkorD}%RDy@BQHDaRjs3Z+g748EHELE

      1eaNj=DdDUXL}2#NuhXQY|f2sl|szuKd<>1 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

      #%pKX3CAGi4R{ST5KKK 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≥aZhMy57CQdd6y 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 z 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


      7*s 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≧M=1exiS)ap@n6o?YaAJ9OQB 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
      +** assert( sqlite3_libversion_number()==SQLITE_VERSION_NUMBER );
      +** assert( strncmp(sqlite3_sourceid(),SQLITE_SOURCE_ID,80)==0 );
      +** 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 returns +** a pointer to a string constant whose value is the same as the +** [SQLITE_SOURCE_ID] C preprocessor macro. Except if SQLite is built +** using an edited copy of [the amalgamation], then the last four characters +** of the hash might be different from [SQLITE_SOURCE_ID].)^ +** +** See also: [sqlite_version()] and [sqlite_source_id()]. +*/ +SQLITE_API SQLITE_EXTERN const char sqlite3_version[]; +SQLITE_API const char *sqlite3_libversion(void); +SQLITE_API const char *sqlite3_sourceid(void); +SQLITE_API int sqlite3_libversion_number(void); + +/* +** CAPI3REF: Run-Time Library Compilation Options Diagnostics +** +** ^The sqlite3_compileoption_used() function returns 0 or 1 +** indicating whether the specified option was defined at +** compile time. ^The SQLITE_ prefix may be omitted from the +** option name passed to sqlite3_compileoption_used(). +** +** ^The sqlite3_compileoption_get() function allows iterating +** over the list of options that were defined at compile time by +** returning the N-th compile time option string. ^If N is out of range, +** sqlite3_compileoption_get() returns a NULL pointer. ^The SQLITE_ +** prefix is omitted from any strings returned by +** sqlite3_compileoption_get(). +** +** ^Support for the diagnostic functions sqlite3_compileoption_used() +** and sqlite3_compileoption_get() may be omitted by specifying the +** [SQLITE_OMIT_COMPILEOPTION_DIAGS] option at compile time. +** +** See also: SQL functions [sqlite_compileoption_used()] and +** [sqlite_compileoption_get()] and the [compile_options pragma]. +*/ +#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS +SQLITE_API int sqlite3_compileoption_used(const char *zOptName); +SQLITE_API const char *sqlite3_compileoption_get(int N); +#endif + +/* +** CAPI3REF: Test To See If The Library Is Threadsafe +** +** ^The sqlite3_threadsafe() function returns zero if and only if +** SQLite was compiled with 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 +** are enabled and SQLite is threadsafe. When the +** [SQLITE_THREADSAFE] macro is 0, +** the mutexes are omitted. Without the mutexes, it is not safe +** to use SQLite concurrently from more than one thread. +** +** 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. +** +** This interface can be used by an application to make sure that the +** version of SQLite that it is linking against was compiled with +** the desired setting of the [SQLITE_THREADSAFE] macro. +** +** This interface only reports on the compile-time mutex setting +** of the [SQLITE_THREADSAFE] flag. If SQLite is compiled with +** 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_SERIALIZED]. ^(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. +*/ +SQLITE_API int sqlite3_threadsafe(void); + +/* +** CAPI3REF: Database Connection Handle +** KEYWORDS: {database connection} {database connections} +** +** Each open SQLite database is represented by a pointer to an instance of +** the opaque structure named "sqlite3". It is useful to think of an sqlite3 +** pointer as an object. The [sqlite3_open()], [sqlite3_open16()], and +** [sqlite3_open_v2()] interfaces are its constructors, and [sqlite3_close()] +** and [sqlite3_close_v2()] are its destructors. There are many other +** interfaces (such as +** [sqlite3_prepare_v2()], [sqlite3_create_function()], and +** [sqlite3_busy_timeout()] to name but three) that are methods on an +** sqlite3 object. +*/ +typedef struct sqlite3 sqlite3; + +/* +** CAPI3REF: 64-Bit Integer Types +** KEYWORDS: sqlite_int64 sqlite_uint64 +** +** Because there is no cross-platform way to specify 64-bit integer types +** SQLite includes typedefs for 64-bit signed and unsigned integers. +** +** The sqlite3_int64 and sqlite3_uint64 are the preferred type definitions. +** The sqlite_int64 and sqlite_uint64 types are supported for backwards +** compatibility only. +** +** ^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; +# ifdef SQLITE_UINT64_TYPE + typedef SQLITE_UINT64_TYPE sqlite_uint64; +# else + typedef unsigned SQLITE_INT64_TYPE sqlite_uint64; +# endif +#elif defined(_MSC_VER) || defined(__BORLANDC__) + typedef __int64 sqlite_int64; + typedef unsigned __int64 sqlite_uint64; +#else + typedef long long int sqlite_int64; + typedef unsigned long long int sqlite_uint64; +#endif +typedef sqlite_int64 sqlite3_int64; +typedef sqlite_uint64 sqlite3_uint64; + +/* +** If compiling for a processor that lacks floating point support, +** substitute integer for floating-point. +*/ +#ifdef SQLITE_OMIT_FLOATING_POINT +# define double sqlite3_int64 +#endif + +/* +** CAPI3REF: Closing A Database Connection +** DESTRUCTOR: sqlite3 +** +** ^The sqlite3_close() and sqlite3_close_v2() routines are destructors +** for the [sqlite3] object. +** ^Calls to sqlite3_close() and sqlite3_close_v2() return [SQLITE_OK] if +** the [sqlite3] object is successfully destroyed and all associated +** resources are deallocated. +** +** ^If the database connection is associated with unfinalized prepared +** statements or unfinished sqlite3_backup objects then sqlite3_close() +** will leave the database connection open and return [SQLITE_BUSY]. +** ^If sqlite3_close_v2() is called with unfinalized prepared statements +** and/or unfinished sqlite3_backups, then the database connection becomes +** an unusable "zombie" which will automatically be deallocated when the +** last prepared statement is finalized or the last sqlite3_backup is +** finished. The sqlite3_close_v2() interface is intended for use with +** host languages that are garbage collected, and where the order in which +** destructors are called is arbitrary. +** +** Applications should [sqlite3_finalize | finalize] all [prepared statements], +** [sqlite3_blob_close | close] all [BLOB handles], and +** [sqlite3_backup_finish | finish] all [sqlite3_backup] objects associated +** with the [sqlite3] object prior to attempting to close the object. ^If +** sqlite3_close_v2() is called on a [database connection] that still has +** outstanding [prepared statements], [BLOB handles], and/or +** [sqlite3_backup] objects then it returns [SQLITE_OK] and the deallocation +** of resources is deferred until all [prepared statements], [BLOB handles], +** and [sqlite3_backup] objects are also destroyed. +** +** ^If an [sqlite3] object is destroyed while a transaction is open, +** the transaction is automatically rolled back. +** +** The C parameter to [sqlite3_close(C)] and [sqlite3_close_v2(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. +** ^Calling sqlite3_close() or sqlite3_close_v2() with a NULL pointer +** argument is a harmless no-op. +*/ +SQLITE_API int sqlite3_close(sqlite3*); +SQLITE_API int sqlite3_close_v2(sqlite3*); + +/* +** The type for a callback function. +** This is legacy and deprecated. It is included for historical +** compatibility and is not documented. +*/ +typedef int (*sqlite3_callback)(void*,int,char**, char**); + +/* +** CAPI3REF: One-Step Query Execution Interface +** METHOD: sqlite3 +** +** 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 +** 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 +** 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 application must ensure that the 1st parameter to sqlite3_exec() +** is a valid and open [database connection]. +**
      • The application must not close the [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 */ + const char *sql, /* SQL to be evaluated */ + int (*callback)(void*,int,char**,char**), /* Callback function */ + void *, /* 1st argument to callback */ + char **errmsg /* Error msg written here */ +); + +/* +** CAPI3REF: Result Codes +** KEYWORDS: {result code definitions} +** +** Many SQLite functions return an integer result code from the set shown +** here in order to indicate success or failure. +** +** New error codes may be added in future versions of SQLite. +** +** See also: [extended result code definitions] +*/ +#define SQLITE_OK 0 /* Successful result */ +/* beginning-of-error-codes */ +#define SQLITE_ERROR 1 /* Generic error */ +#define SQLITE_INTERNAL 2 /* Internal logic error in SQLite */ +#define SQLITE_PERM 3 /* Access permission denied */ +#define SQLITE_ABORT 4 /* Callback routine requested an abort */ +#define SQLITE_BUSY 5 /* The database file is locked */ +#define SQLITE_LOCKED 6 /* A table in the database is locked */ +#define SQLITE_NOMEM 7 /* A malloc() failed */ +#define SQLITE_READONLY 8 /* Attempt to write a readonly database */ +#define SQLITE_INTERRUPT 9 /* Operation terminated by sqlite3_interrupt()*/ +#define SQLITE_IOERR 10 /* Some kind of disk I/O error occurred */ +#define SQLITE_CORRUPT 11 /* The database disk image is malformed */ +#define SQLITE_NOTFOUND 12 /* Unknown opcode in sqlite3_file_control() */ +#define SQLITE_FULL 13 /* Insertion failed because database is full */ +#define SQLITE_CANTOPEN 14 /* Unable to open the database file */ +#define SQLITE_PROTOCOL 15 /* Database lock protocol error */ +#define SQLITE_EMPTY 16 /* Internal use only */ +#define SQLITE_SCHEMA 17 /* The database schema changed */ +#define SQLITE_TOOBIG 18 /* String or BLOB exceeds size limit */ +#define SQLITE_CONSTRAINT 19 /* Abort due to constraint violation */ +#define SQLITE_MISMATCH 20 /* Data type mismatch */ +#define SQLITE_MISUSE 21 /* Library used incorrectly */ +#define SQLITE_NOLFS 22 /* Uses OS features not supported on host */ +#define SQLITE_AUTH 23 /* Authorization denied */ +#define SQLITE_FORMAT 24 /* Not used */ +#define SQLITE_RANGE 25 /* 2nd parameter to sqlite3_bind out of range */ +#define SQLITE_NOTADB 26 /* File opened that is not a database file */ +#define SQLITE_NOTICE 27 /* Notifications from sqlite3_log() */ +#define SQLITE_WARNING 28 /* Warnings from sqlite3_log() */ +#define SQLITE_ROW 100 /* sqlite3_step() has another row ready */ +#define SQLITE_DONE 101 /* sqlite3_step() has finished executing */ +/* end-of-error-codes */ + +/* +** CAPI3REF: Extended Result Codes +** KEYWORDS: {extended result code definitions} +** +** In its default configuration, SQLite API routines return one of 30 integer +** [result codes]. However, experience has shown that many of +** these result codes are too coarse-grained. They do not provide as +** much information about problems as programmers might like. In an effort to +** address this, newer versions of SQLite (version 3.3.8 [dateof:3.3.8] +** and later) include +** support for additional result codes that provide more detailed information +** about errors. These [extended result codes] are enabled or disabled +** on a per database connection basis using the +** [sqlite3_extended_result_codes()] API. Or, the extended code for +** the most recent error can be obtained using +** [sqlite3_extended_errcode()]. +*/ +#define SQLITE_ERROR_MISSING_COLLSEQ (SQLITE_ERROR | (1<<8)) +#define SQLITE_ERROR_RETRY (SQLITE_ERROR | (2<<8)) +#define SQLITE_IOERR_READ (SQLITE_IOERR | (1<<8)) +#define SQLITE_IOERR_SHORT_READ (SQLITE_IOERR | (2<<8)) +#define SQLITE_IOERR_WRITE (SQLITE_IOERR | (3<<8)) +#define SQLITE_IOERR_FSYNC (SQLITE_IOERR | (4<<8)) +#define SQLITE_IOERR_DIR_FSYNC (SQLITE_IOERR | (5<<8)) +#define SQLITE_IOERR_TRUNCATE (SQLITE_IOERR | (6<<8)) +#define SQLITE_IOERR_FSTAT (SQLITE_IOERR | (7<<8)) +#define SQLITE_IOERR_UNLOCK (SQLITE_IOERR | (8<<8)) +#define SQLITE_IOERR_RDLOCK (SQLITE_IOERR | (9<<8)) +#define SQLITE_IOERR_DELETE (SQLITE_IOERR | (10<<8)) +#define SQLITE_IOERR_BLOCKED (SQLITE_IOERR | (11<<8)) +#define SQLITE_IOERR_NOMEM (SQLITE_IOERR | (12<<8)) +#define SQLITE_IOERR_ACCESS (SQLITE_IOERR | (13<<8)) +#define SQLITE_IOERR_CHECKRESERVEDLOCK (SQLITE_IOERR | (14<<8)) +#define SQLITE_IOERR_LOCK (SQLITE_IOERR | (15<<8)) +#define SQLITE_IOERR_CLOSE (SQLITE_IOERR | (16<<8)) +#define SQLITE_IOERR_DIR_CLOSE (SQLITE_IOERR | (17<<8)) +#define SQLITE_IOERR_SHMOPEN (SQLITE_IOERR | (18<<8)) +#define SQLITE_IOERR_SHMSIZE (SQLITE_IOERR | (19<<8)) +#define SQLITE_IOERR_SHMLOCK (SQLITE_IOERR | (20<<8)) +#define SQLITE_IOERR_SHMMAP (SQLITE_IOERR | (21<<8)) +#define SQLITE_IOERR_SEEK (SQLITE_IOERR | (22<<8)) +#define SQLITE_IOERR_DELETE_NOENT (SQLITE_IOERR | (23<<8)) +#define SQLITE_IOERR_MMAP (SQLITE_IOERR | (24<<8)) +#define SQLITE_IOERR_GETTEMPPATH (SQLITE_IOERR | (25<<8)) +#define SQLITE_IOERR_CONVPATH (SQLITE_IOERR | (26<<8)) +#define SQLITE_IOERR_VNODE (SQLITE_IOERR | (27<<8)) +#define SQLITE_IOERR_AUTH (SQLITE_IOERR | (28<<8)) +#define SQLITE_IOERR_BEGIN_ATOMIC (SQLITE_IOERR | (29<<8)) +#define SQLITE_IOERR_COMMIT_ATOMIC (SQLITE_IOERR | (30<<8)) +#define SQLITE_IOERR_ROLLBACK_ATOMIC (SQLITE_IOERR | (31<<8)) +#define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8)) +#define SQLITE_BUSY_RECOVERY (SQLITE_BUSY | (1<<8)) +#define SQLITE_BUSY_SNAPSHOT (SQLITE_BUSY | (2<<8)) +#define SQLITE_CANTOPEN_NOTEMPDIR (SQLITE_CANTOPEN | (1<<8)) +#define SQLITE_CANTOPEN_ISDIR (SQLITE_CANTOPEN | (2<<8)) +#define SQLITE_CANTOPEN_FULLPATH (SQLITE_CANTOPEN | (3<<8)) +#define SQLITE_CANTOPEN_CONVPATH (SQLITE_CANTOPEN | (4<<8)) +#define SQLITE_CORRUPT_VTAB (SQLITE_CORRUPT | (1<<8)) +#define SQLITE_READONLY_RECOVERY (SQLITE_READONLY | (1<<8)) +#define SQLITE_READONLY_CANTLOCK (SQLITE_READONLY | (2<<8)) +#define SQLITE_READONLY_ROLLBACK (SQLITE_READONLY | (3<<8)) +#define SQLITE_READONLY_DBMOVED (SQLITE_READONLY | (4<<8)) +#define SQLITE_READONLY_CANTINIT (SQLITE_READONLY | (5<<8)) +#define SQLITE_READONLY_DIRECTORY (SQLITE_READONLY | (6<<8)) +#define SQLITE_ABORT_ROLLBACK (SQLITE_ABORT | (2<<8)) +#define SQLITE_CONSTRAINT_CHECK (SQLITE_CONSTRAINT | (1<<8)) +#define SQLITE_CONSTRAINT_COMMITHOOK (SQLITE_CONSTRAINT | (2<<8)) +#define SQLITE_CONSTRAINT_FOREIGNKEY (SQLITE_CONSTRAINT | (3<<8)) +#define SQLITE_CONSTRAINT_FUNCTION (SQLITE_CONSTRAINT | (4<<8)) +#define SQLITE_CONSTRAINT_NOTNULL (SQLITE_CONSTRAINT | (5<<8)) +#define SQLITE_CONSTRAINT_PRIMARYKEY (SQLITE_CONSTRAINT | (6<<8)) +#define SQLITE_CONSTRAINT_TRIGGER (SQLITE_CONSTRAINT | (7<<8)) +#define SQLITE_CONSTRAINT_UNIQUE (SQLITE_CONSTRAINT | (8<<8)) +#define SQLITE_CONSTRAINT_VTAB (SQLITE_CONSTRAINT | (9<<8)) +#define SQLITE_CONSTRAINT_ROWID (SQLITE_CONSTRAINT |(10<<8)) +#define SQLITE_NOTICE_RECOVER_WAL (SQLITE_NOTICE | (1<<8)) +#define SQLITE_NOTICE_RECOVER_ROLLBACK (SQLITE_NOTICE | (2<<8)) +#define SQLITE_WARNING_AUTOINDEX (SQLITE_WARNING | (1<<8)) +#define SQLITE_AUTH_USER (SQLITE_AUTH | (1<<8)) +#define SQLITE_OK_LOAD_PERMANENTLY (SQLITE_OK | (1<<8)) + +/* +** CAPI3REF: Flags For File Open Operations +** +** These bit values are intended for use in the +** 3rd parameter to the [sqlite3_open_v2()] interface and +** in the 4th parameter to the [sqlite3_vfs.xOpen] method. +*/ +#define SQLITE_OPEN_READONLY 0x00000001 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_READWRITE 0x00000002 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_CREATE 0x00000004 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_DELETEONCLOSE 0x00000008 /* VFS only */ +#define SQLITE_OPEN_EXCLUSIVE 0x00000010 /* VFS only */ +#define SQLITE_OPEN_AUTOPROXY 0x00000020 /* VFS only */ +#define SQLITE_OPEN_URI 0x00000040 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_MEMORY 0x00000080 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_MAIN_DB 0x00000100 /* VFS only */ +#define SQLITE_OPEN_TEMP_DB 0x00000200 /* VFS only */ +#define SQLITE_OPEN_TRANSIENT_DB 0x00000400 /* VFS only */ +#define SQLITE_OPEN_MAIN_JOURNAL 0x00000800 /* VFS only */ +#define SQLITE_OPEN_TEMP_JOURNAL 0x00001000 /* VFS only */ +#define SQLITE_OPEN_SUBJOURNAL 0x00002000 /* VFS only */ +#define SQLITE_OPEN_MASTER_JOURNAL 0x00004000 /* VFS only */ +#define SQLITE_OPEN_NOMUTEX 0x00008000 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_FULLMUTEX 0x00010000 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_SHAREDCACHE 0x00020000 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_PRIVATECACHE 0x00040000 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_WAL 0x00080000 /* VFS only */ + +/* Reserved: 0x00F00000 */ + +/* +** CAPI3REF: Device Characteristics +** +** The xDeviceCharacteristics method of the [sqlite3_io_methods] +** object returns an integer which is a vector of these +** bit values expressing I/O characteristics of the mass storage +** device that holds the file that the [sqlite3_io_methods] +** refers to. +** +** The SQLITE_IOCAP_ATOMIC property means that all writes of +** any size are atomic. The SQLITE_IOCAP_ATOMICnnn values +** mean that writes of blocks that are nnn bytes in size and +** are aligned to an address which is an integer multiple of +** nnn are atomic. The SQLITE_IOCAP_SAFE_APPEND value means +** that when data is appended to a file, the data is appended +** first then the size of the file is extended, never the other +** way around. The SQLITE_IOCAP_SEQUENTIAL property means that +** information is written to disk in the same order as calls +** to xWrite(). The SQLITE_IOCAP_POWERSAFE_OVERWRITE property means that +** after reboot following a crash or power loss, the only bytes in a +** file that were written at the application level might have changed +** and that adjacent bytes, even bytes within the same sector are +** guaranteed to be unchanged. The SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN +** flag indicates that a file cannot be deleted when open. The +** SQLITE_IOCAP_IMMUTABLE flag indicates that the file is on +** read-only media and cannot be changed even by processes with +** elevated privileges. +** +** The SQLITE_IOCAP_BATCH_ATOMIC property means that the underlying +** filesystem supports doing multiple write operations atomically when those +** write operations are bracketed by [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE] and +** [SQLITE_FCNTL_COMMIT_ATOMIC_WRITE]. +*/ +#define SQLITE_IOCAP_ATOMIC 0x00000001 +#define SQLITE_IOCAP_ATOMIC512 0x00000002 +#define SQLITE_IOCAP_ATOMIC1K 0x00000004 +#define SQLITE_IOCAP_ATOMIC2K 0x00000008 +#define SQLITE_IOCAP_ATOMIC4K 0x00000010 +#define SQLITE_IOCAP_ATOMIC8K 0x00000020 +#define SQLITE_IOCAP_ATOMIC16K 0x00000040 +#define SQLITE_IOCAP_ATOMIC32K 0x00000080 +#define SQLITE_IOCAP_ATOMIC64K 0x00000100 +#define SQLITE_IOCAP_SAFE_APPEND 0x00000200 +#define SQLITE_IOCAP_SEQUENTIAL 0x00000400 +#define SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN 0x00000800 +#define SQLITE_IOCAP_POWERSAFE_OVERWRITE 0x00001000 +#define SQLITE_IOCAP_IMMUTABLE 0x00002000 +#define SQLITE_IOCAP_BATCH_ATOMIC 0x00004000 + +/* +** 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 +** of an [sqlite3_io_methods] object. +*/ +#define SQLITE_LOCK_NONE 0 +#define SQLITE_LOCK_SHARED 1 +#define SQLITE_LOCK_RESERVED 2 +#define SQLITE_LOCK_PENDING 3 +#define SQLITE_LOCK_EXCLUSIVE 4 + +/* +** CAPI3REF: Synchronization Type Flags +** +** When SQLite invokes the xSync() method of an +** [sqlite3_io_methods] object it uses a combination of +** these integer values as the second argument. +** +** When the SQLITE_SYNC_DATAONLY flag is used, it means that the +** sync operation only needs to flush data to mass storage. Inode +** information need not be flushed. If the lower four bits of the flag +** equal SQLITE_SYNC_NORMAL, that means to use normal fsync() semantics. +** If the lower four bits equal SQLITE_SYNC_FULL, that means +** to use Mac OS X style fullsync instead of fsync(). +** +** Do not confuse the SQLITE_SYNC_NORMAL and SQLITE_SYNC_FULL flags +** with the [PRAGMA synchronous]=NORMAL and [PRAGMA synchronous]=FULL +** settings. The [synchronous pragma] determines when calls to the +** xSync VFS method occur and applies uniformly across all platforms. +** The SQLITE_SYNC_NORMAL and SQLITE_SYNC_FULL flags determine how +** energetic or rigorous or forceful the sync operations are and +** only make a difference on Mac OSX for the default SQLite code. +** (Third-party VFS implementations might also make the distinction +** between SQLITE_SYNC_NORMAL and SQLITE_SYNC_FULL, but among the +** operating systems natively supported by SQLite, only Mac OSX +** cares about the difference.) +*/ +#define SQLITE_SYNC_NORMAL 0x00002 +#define SQLITE_SYNC_FULL 0x00003 +#define SQLITE_SYNC_DATAONLY 0x00010 + +/* +** CAPI3REF: OS Interface Open File Handle +** +** An [sqlite3_file] object represents an open file in the +** [sqlite3_vfs | OS interface layer]. Individual OS interface +** implementations will +** want to subclass this object by appending additional fields +** for their own use. The pMethods entry is a pointer to an +** [sqlite3_io_methods] object that defines methods for performing +** I/O operations on the open file. +*/ +typedef struct sqlite3_file sqlite3_file; +struct sqlite3_file { + const struct sqlite3_io_methods *pMethods; /* Methods for an open file */ +}; + +/* +** 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 +** [sqlite3_file] object) with a pointer to an instance of this object. +** This object defines the methods used to perform various operations +** against the open file represented by the [sqlite3_file] object. +** +** If the [sqlite3_vfs.xOpen] method sets the sqlite3_file.pMethods element +** to a non-NULL pointer, then the sqlite3_io_methods.xClose method +** may be invoked even if the [sqlite3_vfs.xOpen] reported that it failed. The +** only way to prevent a call to xClose following a failed [sqlite3_vfs.xOpen] +** is for the [sqlite3_vfs.xOpen] to set the sqlite3_file.pMethods element +** to NULL. +** +** The flags argument to xSync may be one of [SQLITE_SYNC_NORMAL] or +** [SQLITE_SYNC_FULL]. The first choice is the normal fsync(). +** The second choice is a Mac OS X style fullsync. The [SQLITE_SYNC_DATAONLY] +** flag may be ORed in to indicate that only the data of the file +** and not its inode needs to be synced. +** +** The integer values to xLock() and xUnlock() are one of +**
        +**
      • [SQLITE_LOCK_NONE], +**
      • [SQLITE_LOCK_SHARED], +**
      • [SQLITE_LOCK_RESERVED], +**
      • [SQLITE_LOCK_PENDING], or +**
      • [SQLITE_LOCK_EXCLUSIVE]. +**
      +** xLock() increases the lock. xUnlock() decreases the lock. +** The xCheckReservedLock() method checks whether any database connection, +** either in this process or in some other process, is holding a RESERVED, +** PENDING, or EXCLUSIVE lock on the file. It returns true +** if such a lock exists and false otherwise. +** +** The xFileControl() method is a generic interface that allows custom +** VFS implementations to directly control an open file using the +** [sqlite3_file_control()] interface. The second "op" argument is an +** integer opcode. The third argument is a generic pointer intended to +** point to a structure that may contain arguments or space in which to +** write return values. Potential uses for xFileControl() might be +** functions to enable blocking locks with timeouts, to change the +** locking strategy (for example to use dot-file locks), to inquire +** about the status of a lock, or to break stale locks. The SQLite +** core reserves all opcodes less than 100 for its own use. +** A [file control opcodes | list of opcodes] less than 100 is available. +** Applications that define a custom xFileControl method should use opcodes +** greater than 100 to avoid conflicts. VFS implementations should +** return [SQLITE_NOTFOUND] for file control opcodes that they do not +** recognize. +** +** The xSectorSize() method returns the sector size of the +** device that underlies the file. The sector size is the +** minimum write that can be performed without disturbing +** other bytes in the file. The xDeviceCharacteristics() +** method returns a bit vector describing behaviors of the +** underlying device: +** +**
        +**
      • [SQLITE_IOCAP_ATOMIC] +**
      • [SQLITE_IOCAP_ATOMIC512] +**
      • [SQLITE_IOCAP_ATOMIC1K] +**
      • [SQLITE_IOCAP_ATOMIC2K] +**
      • [SQLITE_IOCAP_ATOMIC4K] +**
      • [SQLITE_IOCAP_ATOMIC8K] +**
      • [SQLITE_IOCAP_ATOMIC16K] +**
      • [SQLITE_IOCAP_ATOMIC32K] +**
      • [SQLITE_IOCAP_ATOMIC64K] +**
      • [SQLITE_IOCAP_SAFE_APPEND] +**
      • [SQLITE_IOCAP_SEQUENTIAL] +**
      • [SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN] +**
      • [SQLITE_IOCAP_POWERSAFE_OVERWRITE] +**
      • [SQLITE_IOCAP_IMMUTABLE] +**
      • [SQLITE_IOCAP_BATCH_ATOMIC] +**
      +** +** The SQLITE_IOCAP_ATOMIC property means that all writes of +** any size are atomic. The SQLITE_IOCAP_ATOMICnnn values +** mean that writes of blocks that are nnn bytes in size and +** are aligned to an address which is an integer multiple of +** nnn are atomic. The SQLITE_IOCAP_SAFE_APPEND value means +** that when data is appended to a file, the data is appended +** first then the size of the file is extended, never the other +** way around. The SQLITE_IOCAP_SEQUENTIAL property means that +** information is written to disk in the same order as calls +** to xWrite(). +** +** If xRead() returns SQLITE_IOERR_SHORT_READ it must also fill +** in the unread portions of the buffer with zeros. A VFS that +** fails to zero-fill short reads might seem to work. However, +** failure to zero-fill short reads will eventually lead to +** database corruption. +*/ +typedef struct sqlite3_io_methods sqlite3_io_methods; +struct sqlite3_io_methods { + int iVersion; + int (*xClose)(sqlite3_file*); + int (*xRead)(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst); + int (*xWrite)(sqlite3_file*, const void*, int iAmt, sqlite3_int64 iOfst); + int (*xTruncate)(sqlite3_file*, sqlite3_int64 size); + int (*xSync)(sqlite3_file*, int flags); + int (*xFileSize)(sqlite3_file*, sqlite3_int64 *pSize); + int (*xLock)(sqlite3_file*, int); + int (*xUnlock)(sqlite3_file*, int); + int (*xCheckReservedLock)(sqlite3_file*, int *pResOut); + int (*xFileControl)(sqlite3_file*, int op, void *pArg); + int (*xSectorSize)(sqlite3_file*); + int (*xDeviceCharacteristics)(sqlite3_file*); + /* Methods above are valid for version 1 */ + int (*xShmMap)(sqlite3_file*, int iPg, int pgsz, int, void volatile**); + int (*xShmLock)(sqlite3_file*, int offset, int n, int flags); + void (*xShmBarrier)(sqlite3_file*); + int (*xShmUnmap)(sqlite3_file*, int deleteFlag); + /* Methods above are valid for version 2 */ + int (*xFetch)(sqlite3_file*, sqlite3_int64 iOfst, int iAmt, void **pp); + int (*xUnfetch)(sqlite3_file*, sqlite3_int64 iOfst, void *p); + /* Methods above are valid for version 3 */ + /* Additional methods may be added in future releases */ +}; + +/* +** CAPI3REF: Standard File Control Opcodes +** KEYWORDS: {file control opcodes} {file control opcode} +** +** These integer constants are opcodes for the xFileControl method +** of the [sqlite3_io_methods] object and for the [sqlite3_file_control()] +** interface. +** +**
        +**
      • [[SQLITE_FCNTL_LOCKSTATE]] +** The [SQLITE_FCNTL_LOCKSTATE] opcode is used for debugging. This +** opcode causes the xFileControl method to write the current state of +** the lock (one of [SQLITE_LOCK_NONE], [SQLITE_LOCK_SHARED], +** [SQLITE_LOCK_RESERVED], [SQLITE_LOCK_PENDING], or [SQLITE_LOCK_EXCLUSIVE]) +** into an integer that the pArg argument points to. This capability +** is used during testing and is only available when the SQLITE_TEST +** compile-time option is used. +** +**
      • [[SQLITE_FCNTL_SIZE_HINT]] +** The [SQLITE_FCNTL_SIZE_HINT] opcode is used by SQLite to give the VFS +** layer a hint of how large the database file will grow to be during the +** current transaction. This hint is not guaranteed to be accurate but it +** is often close. The underlying VFS might choose to preallocate database +** file space based on this hint in order to help writes to the database +** file run faster. +** +**
      • [[SQLITE_FCNTL_CHUNK_SIZE]] +** The [SQLITE_FCNTL_CHUNK_SIZE] opcode is used to request that the VFS +** extends and truncates the database file in chunks of a size specified +** by the user. The fourth argument to [sqlite3_file_control()] should +** point to an integer (type int) containing the new chunk-size to use +** for the nominated database. Allocating database file space in large +** chunks (say 1MB at a time), may reduce file-system fragmentation and +** improve performance on some systems. +** +**
      • [[SQLITE_FCNTL_FILE_POINTER]] +** The [SQLITE_FCNTL_FILE_POINTER] opcode is used to obtain a pointer +** to the [sqlite3_file] object associated with a particular database +** connection. See also [SQLITE_FCNTL_JOURNAL_POINTER]. +** +**
      • [[SQLITE_FCNTL_JOURNAL_POINTER]] +** The [SQLITE_FCNTL_JOURNAL_POINTER] opcode is used to obtain a pointer +** to the [sqlite3_file] object associated with the journal file (either +** the [rollback journal] or the [write-ahead log]) for a particular database +** connection. See also [SQLITE_FCNTL_FILE_POINTER]. +** +**
      • [[SQLITE_FCNTL_SYNC_OMITTED]] +** No longer in use. +** +**
      • [[SQLITE_FCNTL_SYNC]] +** The [SQLITE_FCNTL_SYNC] opcode is generated internally by SQLite and +** sent to the VFS immediately before the xSync method is invoked on a +** database file descriptor. Or, if the xSync method is not invoked +** because the user has configured SQLite with +** [PRAGMA synchronous | PRAGMA synchronous=OFF] it is invoked in place +** of the xSync method. In most cases, the pointer argument passed with +** this file-control is NULL. However, if the database file is being synced +** as part of a multi-database commit, the argument points to a nul-terminated +** string containing the transactions master-journal file name. VFSes that +** do not need this signal should silently ignore this opcode. Applications +** should not call [sqlite3_file_control()] with this opcode as doing so may +** disrupt the operation of the specialized VFSes that do require it. +** +**
      • [[SQLITE_FCNTL_COMMIT_PHASETWO]] +** The [SQLITE_FCNTL_COMMIT_PHASETWO] opcode is generated internally by SQLite +** and sent to the VFS after a transaction has been committed immediately +** but before the database is unlocked. VFSes that do not need this signal +** should silently ignore this opcode. Applications should not call +** [sqlite3_file_control()] with this opcode as doing so may disrupt the +** operation of the specialized VFSes that do require it. +** +**
      • [[SQLITE_FCNTL_WIN32_AV_RETRY]] +** ^The [SQLITE_FCNTL_WIN32_AV_RETRY] opcode is used to configure automatic +** retry counts and intervals for certain disk I/O operations for the +** windows [VFS] in order to provide robustness in the presence of +** anti-virus programs. By default, the windows VFS will retry file read, +** file write, and file delete operations up to 10 times, with a delay +** of 25 milliseconds before the first retry and with the delay increasing +** by an additional 25 milliseconds with each subsequent retry. This +** opcode allows these two values (10 retries and 25 milliseconds of delay) +** to be adjusted. The values are changed for all database connections +** within the same process. The argument is a pointer to an array of two +** integers where the first integer is the new retry count and the second +** integer is the delay. If either integer is negative, then the setting +** is not changed but instead the prior value of that setting is written +** into the array entry, allowing the current retry settings to be +** interrogated. The zDbName parameter is ignored. +** +**
      • [[SQLITE_FCNTL_PERSIST_WAL]] +** ^The [SQLITE_FCNTL_PERSIST_WAL] opcode is used to set or query the +** persistent [WAL | Write Ahead Log] setting. By default, the auxiliary +** write ahead log and shared memory files used for transaction control +** are automatically deleted when the latest connection to the database +** closes. Setting persistent WAL mode causes those files to persist after +** close. Persisting the files is useful when other processes that do not +** have write permission on the directory containing the database file want +** to read the database file, as the WAL and shared memory files must exist +** in order for the database to be readable. The fourth parameter to +** [sqlite3_file_control()] for this opcode should be a pointer to an integer. +** That integer is 0 to disable persistent WAL mode or 1 to enable persistent +** WAL mode. If the integer is -1, then it is overwritten with the current +** WAL persistence setting. +** +**
      • [[SQLITE_FCNTL_POWERSAFE_OVERWRITE]] +** ^The [SQLITE_FCNTL_POWERSAFE_OVERWRITE] opcode is used to set or query the +** persistent "powersafe-overwrite" or "PSOW" setting. The PSOW setting +** determines the [SQLITE_IOCAP_POWERSAFE_OVERWRITE] bit of the +** xDeviceCharacteristics methods. The fourth parameter to +** [sqlite3_file_control()] for this opcode should be a pointer to an integer. +** That integer is 0 to disable zero-damage mode or 1 to enable zero-damage +** mode. If the integer is -1, then it is overwritten with the current +** zero-damage mode setting. +** +**
      • [[SQLITE_FCNTL_OVERWRITE]] +** ^The [SQLITE_FCNTL_OVERWRITE] opcode is invoked by SQLite after opening +** a write transaction to indicate that, unless it is rolled back for some +** reason, the entire database file will be overwritten by the current +** transaction. This is used by VACUUM operations. +** +**
      • [[SQLITE_FCNTL_VFSNAME]] +** ^The [SQLITE_FCNTL_VFSNAME] opcode can be used to obtain the names of +** all [VFSes] in the VFS stack. The names are of all VFS shims and the +** final bottom-level VFS are written into memory obtained from +** [sqlite3_malloc()] and the result is stored in the char* variable +** that the fourth parameter of [sqlite3_file_control()] points to. +** The caller is responsible for freeing the memory when done. As with +** all file-control actions, there is no guarantee that this will actually +** do anything. Callers should initialize the char* variable to a NULL +** pointer in case this file-control is not implemented. This file-control +** is intended for diagnostic use only. +** +**
      • [[SQLITE_FCNTL_VFS_POINTER]] +** ^The [SQLITE_FCNTL_VFS_POINTER] opcode finds a pointer to the top-level +** [VFSes] currently in use. ^(The argument X in +** sqlite3_file_control(db,SQLITE_FCNTL_VFS_POINTER,X) must be +** of type "[sqlite3_vfs] **". This opcodes will set *X +** to a pointer to the top-level VFS.)^ +** ^When there are multiple VFS shims in the stack, this opcode finds the +** upper-most shim only. +** +**
      • [[SQLITE_FCNTL_PRAGMA]] +** ^Whenever a [PRAGMA] statement is parsed, an [SQLITE_FCNTL_PRAGMA] +** file control is sent to the open [sqlite3_file] object corresponding +** to the database file to which the pragma statement refers. ^The argument +** to the [SQLITE_FCNTL_PRAGMA] file control is an array of +** pointers to strings (char**) in which the second element of the array +** is the name of the pragma and the third element is the argument to the +** pragma or NULL if the pragma has no argument. ^The handler for an +** [SQLITE_FCNTL_PRAGMA] file control can optionally make the first element +** of the char** argument point to a string obtained from [sqlite3_mprintf()] +** or the equivalent and that string will become the result of the pragma or +** the error message if the pragma fails. ^If the +** [SQLITE_FCNTL_PRAGMA] file control returns [SQLITE_NOTFOUND], then normal +** [PRAGMA] processing continues. ^If the [SQLITE_FCNTL_PRAGMA] +** file control returns [SQLITE_OK], then the parser assumes that the +** VFS has handled the PRAGMA itself and the parser generates a no-op +** prepared statement if result string is NULL, or that returns a copy +** of the result string if the string is non-NULL. +** ^If the [SQLITE_FCNTL_PRAGMA] file control returns +** any result code other than [SQLITE_OK] or [SQLITE_NOTFOUND], that means +** that the VFS encountered an error while handling the [PRAGMA] and the +** compilation of the PRAGMA fails with an error. ^The [SQLITE_FCNTL_PRAGMA] +** file control occurs at the beginning of pragma statement analysis and so +** it is able to override built-in [PRAGMA] statements. +** +**
      • [[SQLITE_FCNTL_BUSYHANDLER]] +** ^The [SQLITE_FCNTL_BUSYHANDLER] +** file-control may be invoked by SQLite on the database file handle +** shortly after it is opened in order to provide a custom VFS with access +** to the connections busy-handler callback. The argument is of type (void **) +** - an array of two (void *) values. The first (void *) actually points +** to a function of type (int (*)(void *)). In order to invoke the connections +** busy-handler, this function should be invoked with the second (void *) in +** the array as the only argument. If it returns non-zero, then the operation +** should be retried. If it returns zero, the custom VFS should abandon the +** current operation. +** +**
      • [[SQLITE_FCNTL_TEMPFILENAME]] +** ^Application can invoke the [SQLITE_FCNTL_TEMPFILENAME] file-control +** to have SQLite generate a +** temporary filename using the same algorithm that is followed to generate +** temporary filenames for TEMP tables and other internal uses. The +** argument should be a char** which will be filled with the filename +** written into memory obtained from [sqlite3_malloc()]. The caller should +** invoke [sqlite3_free()] on the result to avoid a memory leak. +** +**
      • [[SQLITE_FCNTL_MMAP_SIZE]] +** The [SQLITE_FCNTL_MMAP_SIZE] file control is used to query or set the +** maximum number of bytes that will be used for memory-mapped I/O. +** The argument is a pointer to a value of type sqlite3_int64 that +** is an advisory maximum number of bytes in the file to memory map. The +** pointer is overwritten with the old value. The limit is not changed if +** the value originally pointed to is negative, and so the current limit +** can be queried by passing in a pointer to a negative number. This +** file-control is used internally to implement [PRAGMA mmap_size]. +** +**
      • [[SQLITE_FCNTL_TRACE]] +** The [SQLITE_FCNTL_TRACE] file control provides advisory information +** to the VFS about what the higher layers of the SQLite stack are doing. +** This file control is used by some VFS activity tracing [shims]. +** The argument is a zero-terminated string. Higher layers in the +** SQLite stack may generate instances of this file control if +** the [SQLITE_USE_FCNTL_TRACE] compile-time option is enabled. +** +**
      • [[SQLITE_FCNTL_HAS_MOVED]] +** The [SQLITE_FCNTL_HAS_MOVED] file control interprets its argument as a +** pointer to an integer and it writes a boolean into that integer depending +** on whether or not the file has been renamed, moved, or deleted since it +** was first opened. +** +**
      • [[SQLITE_FCNTL_WIN32_GET_HANDLE]] +** The [SQLITE_FCNTL_WIN32_GET_HANDLE] opcode can be used to obtain the +** underlying native file handle associated with a file handle. This file +** control interprets its argument as a pointer to a native file handle and +** writes the resulting value there. +** +**
      • [[SQLITE_FCNTL_WIN32_SET_HANDLE]] +** The [SQLITE_FCNTL_WIN32_SET_HANDLE] opcode is used for debugging. This +** opcode causes the xFileControl method to swap the file handle with the one +** pointed to by the pArg argument. This capability is used during testing +** and only needs to be supported when SQLITE_TEST is defined. +** +**
      • [[SQLITE_FCNTL_WAL_BLOCK]] +** The [SQLITE_FCNTL_WAL_BLOCK] is a signal to the VFS layer that it might +** be advantageous to block on the next WAL lock if the lock is not immediately +** available. The WAL subsystem issues this signal during rare +** circumstances in order to fix a problem with priority inversion. +** Applications should not use this file-control. +** +**
      • [[SQLITE_FCNTL_ZIPVFS]] +** The [SQLITE_FCNTL_ZIPVFS] opcode is implemented by zipvfs only. All other +** VFS should return SQLITE_NOTFOUND for this opcode. +** +**
      • [[SQLITE_FCNTL_RBU]] +** The [SQLITE_FCNTL_RBU] opcode is implemented by the special VFS used by +** the RBU extension only. All other VFS should return SQLITE_NOTFOUND for +** this opcode. +** +**
      • [[SQLITE_FCNTL_BEGIN_ATOMIC_WRITE]] +** If the [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE] opcode returns SQLITE_OK, then +** the file descriptor is placed in "batch write mode", which +** means all subsequent write operations will be deferred and done +** atomically at the next [SQLITE_FCNTL_COMMIT_ATOMIC_WRITE]. Systems +** that do not support batch atomic writes will return SQLITE_NOTFOUND. +** ^Following a successful SQLITE_FCNTL_BEGIN_ATOMIC_WRITE and prior to +** the closing [SQLITE_FCNTL_COMMIT_ATOMIC_WRITE] or +** [SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE], SQLite will make +** no VFS interface calls on the same [sqlite3_file] file descriptor +** except for calls to the xWrite method and the xFileControl method +** with [SQLITE_FCNTL_SIZE_HINT]. +** +**
      • [[SQLITE_FCNTL_COMMIT_ATOMIC_WRITE]] +** The [SQLITE_FCNTL_COMMIT_ATOMIC_WRITE] opcode causes all write +** operations since the previous successful call to +** [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE] to be performed atomically. +** This file control returns [SQLITE_OK] if and only if the writes were +** all performed successfully and have been committed to persistent storage. +** ^Regardless of whether or not it is successful, this file control takes +** the file descriptor out of batch write mode so that all subsequent +** write operations are independent. +** ^SQLite will never invoke SQLITE_FCNTL_COMMIT_ATOMIC_WRITE without +** a prior successful call to [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE]. +** +**
      • [[SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE]] +** The [SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE] opcode causes all write +** operations since the previous successful call to +** [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE] to be rolled back. +** ^This file control takes the file descriptor out of batch write mode +** so that all subsequent write operations are independent. +** ^SQLite will never invoke SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE without +** a prior successful call to [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE]. +**
      +*/ +#define SQLITE_FCNTL_LOCKSTATE 1 +#define SQLITE_FCNTL_GET_LOCKPROXYFILE 2 +#define SQLITE_FCNTL_SET_LOCKPROXYFILE 3 +#define SQLITE_FCNTL_LAST_ERRNO 4 +#define SQLITE_FCNTL_SIZE_HINT 5 +#define SQLITE_FCNTL_CHUNK_SIZE 6 +#define SQLITE_FCNTL_FILE_POINTER 7 +#define SQLITE_FCNTL_SYNC_OMITTED 8 +#define SQLITE_FCNTL_WIN32_AV_RETRY 9 +#define SQLITE_FCNTL_PERSIST_WAL 10 +#define SQLITE_FCNTL_OVERWRITE 11 +#define SQLITE_FCNTL_VFSNAME 12 +#define SQLITE_FCNTL_POWERSAFE_OVERWRITE 13 +#define SQLITE_FCNTL_PRAGMA 14 +#define SQLITE_FCNTL_BUSYHANDLER 15 +#define SQLITE_FCNTL_TEMPFILENAME 16 +#define SQLITE_FCNTL_MMAP_SIZE 18 +#define SQLITE_FCNTL_TRACE 19 +#define SQLITE_FCNTL_HAS_MOVED 20 +#define SQLITE_FCNTL_SYNC 21 +#define SQLITE_FCNTL_COMMIT_PHASETWO 22 +#define SQLITE_FCNTL_WIN32_SET_HANDLE 23 +#define SQLITE_FCNTL_WAL_BLOCK 24 +#define SQLITE_FCNTL_ZIPVFS 25 +#define SQLITE_FCNTL_RBU 26 +#define SQLITE_FCNTL_VFS_POINTER 27 +#define SQLITE_FCNTL_JOURNAL_POINTER 28 +#define SQLITE_FCNTL_WIN32_GET_HANDLE 29 +#define SQLITE_FCNTL_PDB 30 +#define SQLITE_FCNTL_BEGIN_ATOMIC_WRITE 31 +#define SQLITE_FCNTL_COMMIT_ATOMIC_WRITE 32 +#define SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE 33 + +/* deprecated names */ +#define SQLITE_GET_LOCKPROXYFILE SQLITE_FCNTL_GET_LOCKPROXYFILE +#define SQLITE_SET_LOCKPROXYFILE SQLITE_FCNTL_SET_LOCKPROXYFILE +#define SQLITE_LAST_ERRNO SQLITE_FCNTL_LAST_ERRNO + + +/* +** 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 +** at the internal representation of an [sqlite3_mutex]. It only +** deals with pointers to the [sqlite3_mutex] object. +** +** Mutexes are created using [sqlite3_mutex_alloc()]. +*/ +typedef struct sqlite3_mutex sqlite3_mutex; + +/* +** CAPI3REF: Loadable Extension Thunk +** +** A pointer to the opaque sqlite3_api_routines structure is passed as +** the third parameter to entry points of [loadable extensions]. This +** structure must be typedefed in order to work around compiler warnings +** on some platforms. +*/ +typedef struct sqlite3_api_routines sqlite3_api_routines; + +/* +** 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" +** in the name of the object stands for "virtual file system". See +** the [VFS | VFS documentation] for further information. +** +** The VFS interface is sometimes extended by adding new methods onto +** the end. Each time such an extension occurs, the iVersion field +** is incremented. The iVersion value started out as 1 in +** SQLite [version 3.5.0] on [dateof:3.5.0], then increased to 2 +** with SQLite [version 3.7.0] on [dateof:3.7.0], and then increased +** to 3 with SQLite [version 3.7.6] on [dateof:3.7.6]. Additional fields +** may be appended to the sqlite3_vfs object and the iVersion value +** may increase again in future versions of SQLite. +** Note that the structure +** of the sqlite3_vfs object changes in the transition from +** SQLite [version 3.5.9] to [version 3.6.0] on [dateof:3.6.0] +** and yet the iVersion field was not modified. +** +** The szOsFile field is the size of the subclassed [sqlite3_file] +** structure used by this VFS. mxPathname is the maximum length of +** a pathname in this VFS. +** +** Registered sqlite3_vfs objects are kept on a linked list formed by +** the pNext pointer. The [sqlite3_vfs_register()] +** and [sqlite3_vfs_unregister()] interfaces manage this list +** in a thread-safe way. The [sqlite3_vfs_find()] interface +** searches the list. Neither the application code nor the VFS +** implementation should use the pNext pointer. +** +** The pNext field is the only field in the sqlite3_vfs +** structure that SQLite will ever modify. SQLite will only access +** or modify this field while holding a particular static mutex. +** The application should never modify anything within the sqlite3_vfs +** object once the object has been registered. +** +** The zName field holds the name of the VFS module. The name must +** be unique across all VFS modules. +** +** [[sqlite3_vfs.xOpen]] +** ^SQLite guarantees that the zFilename parameter to xOpen +** is either a NULL pointer or string obtained +** from xFullPathname() with an optional suffix added. +** ^If a suffix is added to the zFilename parameter, it will +** consist of a single "-" character followed by no more than +** 11 alphanumeric and/or "-" characters. +** ^SQLite further guarantees that +** the string will be valid and unchanged until xClose() is +** called. Because of the previous sentence, +** the [sqlite3_file] can safely store a pointer to the +** filename if it needs to remember the filename for some reason. +** If the zFilename parameter to xOpen is a NULL pointer then xOpen +** must invent its own temporary name for the file. ^Whenever the +** xFilename parameter is NULL it will also be the case that the +** flags parameter will include [SQLITE_OPEN_DELETEONCLOSE]. +** +** The flags argument to xOpen() includes all bits set in +** the flags argument to [sqlite3_open_v2()]. Or if [sqlite3_open()] +** or [sqlite3_open16()] is used, then flags includes at least +** [SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE]. +** If xOpen() opens a file read-only then it sets *pOutFlags to +** include [SQLITE_OPEN_READONLY]. Other bits in *pOutFlags may be set. +** +** ^(SQLite will also add one of the following flags to the xOpen() +** call, depending on the object being opened: +** +**
        +**
      • [SQLITE_OPEN_MAIN_DB] +**
      • [SQLITE_OPEN_MAIN_JOURNAL] +**
      • [SQLITE_OPEN_TEMP_DB] +**
      • [SQLITE_OPEN_TEMP_JOURNAL] +**
      • [SQLITE_OPEN_TRANSIENT_DB] +**
      • [SQLITE_OPEN_SUBJOURNAL] +**
      • [SQLITE_OPEN_MASTER_JOURNAL] +**
      • [SQLITE_OPEN_WAL] +**
      )^ +** +** The file I/O implementation can use the object type flags to +** change the way it deals with files. For example, an application +** that does not care about crash recovery or rollback might make +** the open of a journal file a no-op. Writes to this journal would +** also be no-ops, and any attempt to read the journal would return +** SQLITE_IOERR. Or the implementation might recognize that a database +** file will be doing page-aligned sector reads and writes in a random +** order and set up its I/O subsystem accordingly. +** +** SQLite might also add one of the following flags to the xOpen method: +** +**
        +**
      • [SQLITE_OPEN_DELETEONCLOSE] +**
      • [SQLITE_OPEN_EXCLUSIVE] +**
      +** +** The [SQLITE_OPEN_DELETEONCLOSE] flag means the file should be +** deleted when it is closed. ^The [SQLITE_OPEN_DELETEONCLOSE] +** will be set for TEMP databases and their journals, transient +** databases, and subjournals. +** +** ^The [SQLITE_OPEN_EXCLUSIVE] flag is always used in conjunction +** with the [SQLITE_OPEN_CREATE] flag, which are both directly +** analogous to the O_EXCL and O_CREAT flags of the POSIX open() +** API. The SQLITE_OPEN_EXCLUSIVE flag, when paired with the +** SQLITE_OPEN_CREATE, is used to indicate that file should always +** be created, and that it is an error if it already exists. +** It is not used to indicate the file should be opened +** for exclusive access. +** +** ^At least szOsFile bytes of memory are allocated by SQLite +** to hold the [sqlite3_file] structure passed as the third +** argument to xOpen. The xOpen method does not have to +** allocate the structure; it should just fill it in. Note that +** the xOpen method must set the sqlite3_file.pMethods to either +** a valid [sqlite3_io_methods] object or to NULL. xOpen must do +** this even if the open fails. SQLite expects that the sqlite3_file.pMethods +** element will be valid after xOpen returns regardless of the success +** or failure of the xOpen call. +** +** [[sqlite3_vfs.xAccess]] +** ^The flags argument to xAccess() may be [SQLITE_ACCESS_EXISTS] +** to test for the existence of a file, or [SQLITE_ACCESS_READWRITE] to +** test whether a file is readable and writable, or [SQLITE_ACCESS_READ] +** to test whether a file is at least readable. The file can be a +** directory. +** +** ^SQLite will always allocate at least mxPathname+1 bytes for the +** output buffer xFullPathname. The exact size of the output buffer +** is also passed as a parameter to both methods. If the output buffer +** is not large enough, [SQLITE_CANTOPEN] should be returned. Since this is +** handled as a fatal error by SQLite, vfs implementations should endeavor +** to prevent this by setting mxPathname to a sufficiently large value. +** +** The xRandomness(), xSleep(), xCurrentTime(), and xCurrentTimeInt64() +** interfaces are not strictly a part of the filesystem, but they are +** included in the VFS structure for completeness. +** The xRandomness() function attempts to return nBytes bytes +** of good-quality randomness into zOut. The return value is +** the actual number of bytes of randomness obtained. +** The xSleep() method causes the calling thread to sleep for at +** least the number of microseconds given. ^The xCurrentTime() +** method returns a Julian Day Number for the current date and time as +** a floating point value. +** ^The xCurrentTimeInt64() method returns, as an integer, the Julian +** Day Number multiplied by 86400000 (the number of milliseconds in +** a 24-hour day). +** ^SQLite will use the xCurrentTimeInt64() method to get the current +** date and time if that method is available (if iVersion is 2 or +** greater and the function pointer is not NULL) and will fall back +** to xCurrentTime() if xCurrentTimeInt64() is unavailable. +** +** ^The xSetSystemCall(), xGetSystemCall(), and xNestSystemCall() interfaces +** are not used by the SQLite core. These optional interfaces are provided +** by some VFSes to facilitate testing of the VFS code. By overriding +** system calls with functions under its control, a test program can +** simulate faults and error conditions that would otherwise be difficult +** or impossible to induce. The set of system calls that can be overridden +** varies from one VFS to another, and from one version of the same VFS to the +** next. Applications that use these interfaces must be prepared for any +** or all of these interfaces to be NULL or for their behavior to change +** from one release to the next. Applications must not attempt to access +** any of these methods if the iVersion of the VFS is less than 3. +*/ +typedef struct sqlite3_vfs sqlite3_vfs; +typedef void (*sqlite3_syscall_ptr)(void); +struct sqlite3_vfs { + int iVersion; /* Structure version number (currently 3) */ + int szOsFile; /* Size of subclassed sqlite3_file */ + int mxPathname; /* Maximum file pathname length */ + sqlite3_vfs *pNext; /* Next registered VFS */ + const char *zName; /* Name of this virtual file system */ + void *pAppData; /* Pointer to application-specific data */ + int (*xOpen)(sqlite3_vfs*, const char *zName, sqlite3_file*, + int flags, int *pOutFlags); + int (*xDelete)(sqlite3_vfs*, const char *zName, int syncDir); + int (*xAccess)(sqlite3_vfs*, const char *zName, int flags, int *pResOut); + int (*xFullPathname)(sqlite3_vfs*, const char *zName, int nOut, char *zOut); + void *(*xDlOpen)(sqlite3_vfs*, const char *zFilename); + void (*xDlError)(sqlite3_vfs*, int nByte, char *zErrMsg); + void (*(*xDlSym)(sqlite3_vfs*,void*, const char *zSymbol))(void); + void (*xDlClose)(sqlite3_vfs*, void*); + int (*xRandomness)(sqlite3_vfs*, int nByte, char *zOut); + int (*xSleep)(sqlite3_vfs*, int microseconds); + int (*xCurrentTime)(sqlite3_vfs*, double*); + int (*xGetLastError)(sqlite3_vfs*, int, char *); + /* + ** The methods above are in version 1 of the sqlite_vfs object + ** definition. Those that follow are added in version 2 or later + */ + int (*xCurrentTimeInt64)(sqlite3_vfs*, sqlite3_int64*); + /* + ** The methods above are in versions 1 and 2 of the sqlite_vfs object. + ** Those below are for version 3 and greater. + */ + int (*xSetSystemCall)(sqlite3_vfs*, const char *zName, sqlite3_syscall_ptr); + sqlite3_syscall_ptr (*xGetSystemCall)(sqlite3_vfs*, const char *zName); + const char *(*xNextSystemCall)(sqlite3_vfs*, const char *zName); + /* + ** The methods above are in versions 1 through 3 of the sqlite_vfs object. + ** New fields may be appended in future versions. The iVersion + ** value will increment whenever this happens. + */ +}; + +/* +** 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. 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. +** With SQLITE_ACCESS_READWRITE, the xAccess method +** checks whether the named directory is both readable and writable +** (in other words, if files can be added, removed, and renamed within +** the directory). +** The SQLITE_ACCESS_READWRITE constant is currently used only by the +** [temp_store_directory pragma], though this could change in a future +** release of SQLite. +** With SQLITE_ACCESS_READ, the xAccess method +** checks whether the file is readable. The SQLITE_ACCESS_READ constant is +** currently unused, though it might be used in a future release of +** SQLite. +*/ +#define SQLITE_ACCESS_EXISTS 0 +#define SQLITE_ACCESS_READWRITE 1 /* Used by PRAGMA temp_store_directory */ +#define SQLITE_ACCESS_READ 2 /* Unused */ + +/* +** CAPI3REF: Flags for the xShmLock VFS method +** +** These integer constants define the various locking operations +** allowed by the xShmLock method of [sqlite3_io_methods]. The +** following are the only legal combinations of flags to the +** xShmLock method: +** +**
        +**
      • SQLITE_SHM_LOCK | SQLITE_SHM_SHARED +**
      • SQLITE_SHM_LOCK | SQLITE_SHM_EXCLUSIVE +**
      • SQLITE_SHM_UNLOCK | SQLITE_SHM_SHARED +**
      • SQLITE_SHM_UNLOCK | SQLITE_SHM_EXCLUSIVE +**
      +** +** When unlocking, the same SHARED or EXCLUSIVE flag must be supplied as +** was given on the corresponding lock. +** +** The xShmLock method can transition between unlocked and SHARED or +** between unlocked and EXCLUSIVE. It cannot transition between SHARED +** and EXCLUSIVE. +*/ +#define SQLITE_SHM_UNLOCK 1 +#define SQLITE_SHM_LOCK 2 +#define SQLITE_SHM_SHARED 4 +#define SQLITE_SHM_EXCLUSIVE 8 + +/* +** CAPI3REF: Maximum xShmLock index +** +** The xShmLock method on [sqlite3_io_methods] may use values +** between 0 and this upper bound as its "offset" argument. +** The SQLite core will never attempt to acquire or release a +** lock outside of this range +*/ +#define SQLITE_SHM_NLOCK 8 + + +/* +** CAPI3REF: Initialize The SQLite Library +** +** ^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 +** of sqlite3_initialize() does any initialization. All other calls +** 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 +** an effective call to sqlite3_shutdown() does any deinitialization. +** 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() 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 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 +** 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] +** 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, +** it is recommended that applications always invoke sqlite3_initialize() +** directly prior to using any other SQLite interface. Future releases +** of SQLite may require this. In other words, the behavior exhibited +** when SQLite is compiled with [SQLITE_OMIT_AUTOINIT] might become the +** default behavior in some future release of SQLite. +** +** The sqlite3_os_init() routine does operating-system specific +** initialization of the SQLite library. The sqlite3_os_end() +** routine undoes the effect of sqlite3_os_init(). Typical tasks +** performed by these routines include allocation or deallocation +** of static resources, initialization of global variables, +** setting up a default [sqlite3_vfs] module, or setting up +** a default configuration using [sqlite3_config()]. +** +** The application should never invoke either sqlite3_os_init() +** or sqlite3_os_end() directly. The application should only invoke +** sqlite3_initialize() and sqlite3_shutdown(). The sqlite3_os_init() +** interface is called automatically by sqlite3_initialize() and +** sqlite3_os_end() is called by sqlite3_shutdown(). Appropriate +** implementations for sqlite3_os_init() and sqlite3_os_end() +** are built into SQLite when it is compiled for Unix, Windows, or OS/2. +** When [custom builds | built for other platforms] +** (using the [SQLITE_OS_OTHER=1] compile-time +** option) the application must supply a suitable implementation for +** sqlite3_os_init() and sqlite3_os_end(). An application-supplied +** implementation of sqlite3_os_init() or sqlite3_os_end() +** must return [SQLITE_OK] on success and some other [error code] upon +** failure. +*/ +SQLITE_API int sqlite3_initialize(void); +SQLITE_API int sqlite3_shutdown(void); +SQLITE_API int sqlite3_os_init(void); +SQLITE_API int sqlite3_os_end(void); + +/* +** CAPI3REF: Configuring The SQLite Library +** +** The sqlite3_config() interface is used to make global configuration +** changes to SQLite in order to tune SQLite to the specific needs of +** the application. The default configuration is recommended for most +** applications and so this routine is usually not necessary. It is +** provided to support rare applications with unusual needs. +** +** The sqlite3_config() interface is not threadsafe. The application +** must ensure that no other SQLite interfaces are invoked by other +** threads while sqlite3_config() is running. +** +** The sqlite3_config() interface +** may only be invoked prior to library initialization using +** [sqlite3_initialize()] or after shutdown by [sqlite3_shutdown()]. +** ^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 +** [configuration option] that determines +** what property of SQLite is to be configured. Subsequent arguments +** vary depending on the [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 +** then this routine returns a non-zero [error code]. +*/ +SQLITE_API int sqlite3_config(int, ...); + +/* +** CAPI3REF: Configure database connections +** METHOD: sqlite3 +** +** 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 second argument to sqlite3_db_config(D,V,...) is the +** [SQLITE_DBCONFIG_LOOKASIDE | configuration verb] - an integer code +** that indicates what aspect of the [database connection] is being configured. +** Subsequent arguments vary depending on the configuration verb. +** +** ^Calls to sqlite3_db_config() return SQLITE_OK if and only if +** the call is considered successful. +*/ +SQLITE_API int sqlite3_db_config(sqlite3*, int op, ...); + +/* +** CAPI3REF: Memory Allocation Routines +** +** An instance of this object defines the interface between SQLite +** and low-level memory allocation routines. +** +** This object is used in only one place in the SQLite interface. +** A pointer to an instance of this object is the argument to +** [sqlite3_config()] when the configuration option is +** [SQLITE_CONFIG_MALLOC] or [SQLITE_CONFIG_GETMALLOC]. +** By creating an instance of this object +** and passing it to [sqlite3_config]([SQLITE_CONFIG_MALLOC]) +** during configuration, an application can specify an alternative +** memory allocation subsystem for SQLite to use for all of its +** dynamic memory needs. +** +** Note that SQLite comes with several [built-in memory allocators] +** that are perfectly adequate for the overwhelming majority of applications +** and that this object is only useful to a tiny minority of applications +** with specialized memory allocation requirements. This object is +** also used during testing of SQLite in order to specify an alternative +** memory allocator that simulates memory out-of-memory conditions in +** order to verify that SQLite recovers gracefully from such +** conditions. +** +** The xMalloc, xRealloc, and xFree methods must work like the +** malloc(), realloc() and free() functions from the standard C library. +** ^SQLite guarantees that the second argument to +** xRealloc is always a value returned by a prior call to xRoundup. +** +** xSize should return the allocated size of a memory allocation +** previously obtained from xMalloc or xRealloc. The allocated size +** is always at least as big as the requested size but may be larger. +** +** The xRoundup method returns what would be the allocated size of +** a memory allocation given a particular requested size. Most memory +** allocators round up memory allocations at least to the next multiple +** of 8. Some allocators round up to a larger multiple or to a power of 2. +** Every memory allocation request coming in through [sqlite3_malloc()] +** or [sqlite3_realloc()] first calls xRoundup. If xRoundup returns 0, +** that causes the corresponding memory allocation to fail. +** +** The xInit method initializes the memory allocator. For example, +** it might allocate any require mutexes or initialize internal data +** structures. The xShutdown method is invoked (indirectly) by +** [sqlite3_shutdown()] and should deallocate any resources acquired +** by xInit. The pAppData pointer is used as the only parameter to +** xInit and xShutdown. +** +** SQLite holds the [SQLITE_MUTEX_STATIC_MASTER] 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. For all other methods, SQLite +** holds the [SQLITE_MUTEX_STATIC_MEM] mutex as long as the +** [SQLITE_CONFIG_MEMSTATUS] configuration option is turned on (which +** it is by default) and so the methods are automatically serialized. +** However, if [SQLITE_CONFIG_MEMSTATUS] is disabled, then the other +** methods must be threadsafe or else make their own arrangements for +** serialization. +** +** SQLite will never invoke xInit() more than once without an intervening +** call to xShutdown(). +*/ +typedef struct sqlite3_mem_methods sqlite3_mem_methods; +struct sqlite3_mem_methods { + void *(*xMalloc)(int); /* Memory allocation function */ + void (*xFree)(void*); /* Free a prior allocation */ + void *(*xRealloc)(void*,int); /* Resize an allocation */ + int (*xSize)(void*); /* Return the size of an allocation */ + int (*xRoundup)(int); /* Round up request size to allocation size */ + int (*xInit)(void*); /* Initialize the memory allocator */ + void (*xShutdown)(void*); /* Deinitialize the memory allocator */ + void *pAppData; /* Argument to xInit() and xShutdown() */ +}; + +/* +** CAPI3REF: Configuration Options +** KEYWORDS: {configuration option} +** +** These constants are the available integer configuration options that +** can be passed as the first argument to the [sqlite3_config()] interface. +** +** 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_config()] to make sure that +** the call worked. The [sqlite3_config()] interface will return a +** non-zero [error code] if a discontinued or unsupported configuration option +** is invoked. +** +**
      +** [[SQLITE_CONFIG_SINGLETHREAD]]
      SQLITE_CONFIG_SINGLETHREAD
      +**
      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. ^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]]
      SQLITE_CONFIG_MULTITHREAD
      +**
      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. ^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]]
      SQLITE_CONFIG_SERIALIZED
      +**
      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 +** [SQLITE_THREADSAFE=1]) the SQLite library will itself serialize access +** 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. +** ^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]]
      SQLITE_CONFIG_MALLOC
      +**
      ^(The SQLITE_CONFIG_MALLOC 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.)^ ^SQLite makes +** its own private copy of the content of the [sqlite3_mem_methods] structure +** before the [sqlite3_config()] call returns.
      +** +** [[SQLITE_CONFIG_GETMALLOC]]
      SQLITE_CONFIG_GETMALLOC
      +**
      ^(The SQLITE_CONFIG_GETMALLOC 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.)^ +** 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.
      +** +** [[SQLITE_CONFIG_SMALL_MALLOC]]
      SQLITE_CONFIG_SMALL_MALLOC
      +**
      ^The SQLITE_CONFIG_SMALL_MALLOC option takes single argument of +** type int, interpreted as a boolean, which if true provides a hint to +** SQLite that it should avoid large memory allocations if possible. +** SQLite will run faster if it is free to make large memory allocations, +** but some application might prefer to run slower in exchange for +** guarantees about memory fragmentation that are possible if large +** allocations are avoided. This hint is normally off. +**
      +** +** [[SQLITE_CONFIG_MEMSTATUS]]
      SQLITE_CONFIG_MEMSTATUS
      +**
      ^The SQLITE_CONFIG_MEMSTATUS option takes single argument of type int, +** interpreted as a boolean, which enables or disables the collection of +** memory allocation statistics. ^(When memory allocation statistics are +** disabled, the following SQLite interfaces become non-operational: +**
        +**
      • [sqlite3_memory_used()] +**
      • [sqlite3_memory_highwater()] +**
      • [sqlite3_soft_heap_limit64()] +**
      • [sqlite3_status64()] +**
      )^ +** ^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]]
      SQLITE_CONFIG_SCRATCH
      +**
      The SQLITE_CONFIG_SCRATCH option is no longer used. +**
      +** +** [[SQLITE_CONFIG_PAGECACHE]]
      SQLITE_CONFIG_PAGECACHE
      +**
      ^The SQLITE_CONFIG_PAGECACHE option specifies a memory pool +** that SQLite can use for the database page cache with the default page +** cache implementation. +** This configuration option is a no-op if an application-define page +** cache implementation is loaded using the [SQLITE_CONFIG_PCACHE2]. +** ^There are three arguments to SQLITE_CONFIG_PAGECACHE: A pointer to +** 8-byte aligned memory (pMem), the size of each page cache line (sz), +** and the number of cache lines (N). +** The sz argument should be the size of the largest database page +** (a power of two between 512 and 65536) plus some extra bytes for each +** page header. ^The number of extra bytes needed by the page header +** can be determined using [SQLITE_CONFIG_PCACHE_HDRSZ]. +** ^It is harmless, apart from the wasted memory, +** for the sz parameter to be larger than necessary. The pMem +** argument must be either a NULL pointer or a pointer to an 8-byte +** aligned block of memory of at least sz*N bytes, otherwise +** subsequent behavior is undefined. +** ^When pMem is not NULL, SQLite will strive to use the memory provided +** to satisfy page cache needs, falling back to [sqlite3_malloc()] if +** a page cache line is larger than sz bytes or if all of the pMem buffer +** is exhausted. +** ^If pMem is NULL and N is non-zero, then each database connection +** does an initial bulk allocation for page cache memory +** from [sqlite3_malloc()] sufficient for N cache lines if N is positive or +** of -1024*N bytes if N is negative, . ^If additional +** page cache memory is needed beyond what is provided by the initial +** allocation, then SQLite goes to [sqlite3_malloc()] separately for each +** additional cache line.
      +** +** [[SQLITE_CONFIG_HEAP]]
      SQLITE_CONFIG_HEAP
      +**
      ^The SQLITE_CONFIG_HEAP 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_PAGECACHE]. +** ^The SQLITE_CONFIG_HEAP option is only available if SQLite is compiled +** with either [SQLITE_ENABLE_MEMSYS3] or [SQLITE_ENABLE_MEMSYS5] and returns +** [SQLITE_ERROR] if invoked otherwise. +** ^There are three arguments to SQLITE_CONFIG_HEAP: +** 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 +** to using its default memory allocator (the system malloc() implementation), +** undoing any prior invocation of [SQLITE_CONFIG_MALLOC]. ^If the +** memory pointer is not NULL then the alternative memory +** allocator is engaged to handle all of SQLites memory allocation needs. +** The first pointer (the memory pointer) must be aligned to an 8-byte +** boundary or subsequent behavior of SQLite will be undefined. +** The minimum allocation size is capped at 2**12. Reasonable values +** for the minimum allocation size are 2**5 through 2**8.
      +** +** [[SQLITE_CONFIG_MUTEX]]
      SQLITE_CONFIG_MUTEX
      +**
      ^(The SQLITE_CONFIG_MUTEX 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.)^ ^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]]
      SQLITE_CONFIG_GETMUTEX
      +**
      ^(The SQLITE_CONFIG_GETMUTEX 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.)^ +** 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. ^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]]
      SQLITE_CONFIG_LOOKASIDE
      +**
      ^(The SQLITE_CONFIG_LOOKASIDE option takes two arguments that determine +** the default size of lookaside memory 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.)^ ^(SQLITE_CONFIG_LOOKASIDE +** sets the default lookaside size. The [SQLITE_DBCONFIG_LOOKASIDE] +** option to [sqlite3_db_config()] can be used to change the lookaside +** configuration on individual connections.)^
      +** +** [[SQLITE_CONFIG_PCACHE2]]
      SQLITE_CONFIG_PCACHE2
      +**
      ^(The SQLITE_CONFIG_PCACHE2 option takes a single argument which is +** a pointer to an [sqlite3_pcache_methods2] object. This object specifies +** the interface to a custom page cache implementation.)^ +** ^SQLite makes a copy of the [sqlite3_pcache_methods2] object.
      +** +** [[SQLITE_CONFIG_GETPCACHE2]]
      SQLITE_CONFIG_GETPCACHE2
      +**
      ^(The SQLITE_CONFIG_GETPCACHE2 option takes a single argument which +** is a pointer to an [sqlite3_pcache_methods2] object. SQLite copies of +** the current page cache implementation into that object.)^
      +** +** [[SQLITE_CONFIG_LOG]]
      SQLITE_CONFIG_LOG
      +**
      The SQLITE_CONFIG_LOG option is used to configure the SQLite +** global [error log]. +** (^The SQLITE_CONFIG_LOG option takes two arguments: a pointer to a +** function with a call signature of void(*)(void*,int,const char*), +** and a pointer to void. ^If the function pointer is not NULL, it is +** invoked by [sqlite3_log()] to process each logging event. ^If the +** function pointer is NULL, the [sqlite3_log()] interface becomes a no-op. +** ^The void pointer that is the second argument to SQLITE_CONFIG_LOG is +** passed through as the first parameter to the application-defined logger +** function whenever that function is invoked. ^The second parameter to +** the logger function is a copy of the first parameter to the corresponding +** [sqlite3_log()] call and is intended to be a [result code] or an +** [extended result code]. ^The third parameter passed to the logger is +** log message after formatting via [sqlite3_snprintf()]. +** The SQLite logging interface is not reentrant; the logger function +** supplied by the application must not invoke any SQLite interface. +** In a multi-threaded application, the application-defined logger +** function must be threadsafe.
      +** +** [[SQLITE_CONFIG_URI]]
      SQLITE_CONFIG_URI +**
      ^(The SQLITE_CONFIG_URI option takes a single argument of type int. +** If non-zero, then URI handling is globally enabled. If the parameter is zero, +** then URI handling is globally disabled.)^ ^If URI handling is globally +** enabled, all filenames passed to [sqlite3_open()], [sqlite3_open_v2()], +** [sqlite3_open16()] or +** specified as part of [ATTACH] commands are interpreted as URIs, regardless +** of whether or not the [SQLITE_OPEN_URI] flag is set when the database +** connection is opened. ^If it is globally disabled, filenames are +** only interpreted as URIs if the SQLITE_OPEN_URI flag is set when the +** database connection is opened. ^(By default, URI handling is globally +** disabled. The default value may be changed by compiling with the +** [SQLITE_USE_URI] symbol defined.)^ +** +** [[SQLITE_CONFIG_COVERING_INDEX_SCAN]]
      SQLITE_CONFIG_COVERING_INDEX_SCAN +**
      ^The SQLITE_CONFIG_COVERING_INDEX_SCAN option takes a single integer +** argument which is interpreted as a boolean in order to enable or disable +** the use of covering indices for full table scans in the query optimizer. +** ^The default setting is determined +** by the [SQLITE_ALLOW_COVERING_INDEX_SCAN] compile-time option, or is "on" +** if that compile-time option is omitted. +** The ability to disable the use of covering indices for full table scans +** is because some incorrectly coded legacy applications might malfunction +** when the optimization is enabled. Providing the ability to +** disable the optimization allows the older, buggy application code to work +** without change even with newer versions of SQLite. +** +** [[SQLITE_CONFIG_PCACHE]] [[SQLITE_CONFIG_GETPCACHE]] +**
      SQLITE_CONFIG_PCACHE and SQLITE_CONFIG_GETPCACHE +**
      These options are obsolete and should not be used by new code. +** They are retained for backwards compatibility but are now no-ops. +**
      +** +** [[SQLITE_CONFIG_SQLLOG]] +**
      SQLITE_CONFIG_SQLLOG +**
      This option is only available if sqlite is compiled with the +** [SQLITE_ENABLE_SQLLOG] pre-processor macro defined. The first argument should +** be a pointer to a function of type void(*)(void*,sqlite3*,const char*, int). +** The second should be of type (void*). The callback is invoked by the library +** in three separate circumstances, identified by the value passed as the +** fourth parameter. If the fourth parameter is 0, then the database connection +** passed as the second argument has just been opened. The third argument +** points to a buffer containing the name of the main database file. If the +** fourth parameter is 1, then the SQL statement that the third parameter +** points to has just been executed. Or, if the fourth parameter is 2, then +** the connection being passed as the second parameter is being closed. The +** third parameter is passed NULL In this case. An example of using this +** configuration option can be seen in the "test_sqllog.c" source file in +** the canonical SQLite source tree.
      +** +** [[SQLITE_CONFIG_MMAP_SIZE]] +**
      SQLITE_CONFIG_MMAP_SIZE +**
      ^SQLITE_CONFIG_MMAP_SIZE takes two 64-bit integer (sqlite3_int64) values +** that are the default mmap size limit (the default setting for +** [PRAGMA mmap_size]) and the maximum allowed mmap size limit. +** ^The default setting can be overridden by each database connection using +** either the [PRAGMA mmap_size] command, or by using the +** [SQLITE_FCNTL_MMAP_SIZE] file control. ^(The maximum allowed mmap size +** will be silently truncated if necessary so that it does not exceed the +** compile-time maximum mmap size set by the +** [SQLITE_MAX_MMAP_SIZE] compile-time option.)^ +** ^If either argument to this option is negative, then that argument is +** changed to its compile-time default. +** +** [[SQLITE_CONFIG_WIN32_HEAPSIZE]] +**
      SQLITE_CONFIG_WIN32_HEAPSIZE +**
      ^The SQLITE_CONFIG_WIN32_HEAPSIZE option is only available if SQLite is +** compiled for Windows with the [SQLITE_WIN32_MALLOC] pre-processor macro +** defined. ^SQLITE_CONFIG_WIN32_HEAPSIZE takes a 32-bit unsigned integer value +** that specifies the maximum size of the created heap. +** +** [[SQLITE_CONFIG_PCACHE_HDRSZ]] +**
      SQLITE_CONFIG_PCACHE_HDRSZ +**
      ^The SQLITE_CONFIG_PCACHE_HDRSZ option takes a single parameter which +** is a pointer to an integer and writes into that integer the number of extra +** bytes per page required for each page in [SQLITE_CONFIG_PAGECACHE]. +** The amount of extra space required can change depending on the compiler, +** target platform, and SQLite version. +** +** [[SQLITE_CONFIG_PMASZ]] +**
      SQLITE_CONFIG_PMASZ +**
      ^The SQLITE_CONFIG_PMASZ option takes a single parameter which +** is an unsigned integer and sets the "Minimum PMA Size" for the multithreaded +** sorter to that integer. The default minimum PMA Size is set by the +** [SQLITE_SORTER_PMASZ] compile-time option. New threads are launched +** to help with sort operations when multithreaded sorting +** is enabled (using the [PRAGMA threads] command) and the amount of content +** to be sorted exceeds the page size times the minimum of the +** [PRAGMA cache_size] setting and this value. +** +** [[SQLITE_CONFIG_STMTJRNL_SPILL]] +**
      SQLITE_CONFIG_STMTJRNL_SPILL +**
      ^The SQLITE_CONFIG_STMTJRNL_SPILL option takes a single parameter which +** becomes the [statement journal] spill-to-disk threshold. +** [Statement journals] are held in memory until their size (in bytes) +** exceeds this threshold, at which point they are written to disk. +** Or if the threshold is -1, statement journals are always held +** exclusively in memory. +** Since many statement journals never become large, setting the spill +** threshold to a value such as 64KiB can greatly reduce the amount of +** I/O required to support statement rollback. +** The default value for this setting is controlled by the +** [SQLITE_STMTJRNL_SPILL] compile-time option. +**
      +*/ +#define SQLITE_CONFIG_SINGLETHREAD 1 /* nil */ +#define SQLITE_CONFIG_MULTITHREAD 2 /* nil */ +#define SQLITE_CONFIG_SERIALIZED 3 /* nil */ +#define SQLITE_CONFIG_MALLOC 4 /* sqlite3_mem_methods* */ +#define SQLITE_CONFIG_GETMALLOC 5 /* sqlite3_mem_methods* */ +#define SQLITE_CONFIG_SCRATCH 6 /* No longer used */ +#define SQLITE_CONFIG_PAGECACHE 7 /* void*, int sz, int N */ +#define SQLITE_CONFIG_HEAP 8 /* void*, int nByte, int min */ +#define SQLITE_CONFIG_MEMSTATUS 9 /* boolean */ +#define SQLITE_CONFIG_MUTEX 10 /* sqlite3_mutex_methods* */ +#define SQLITE_CONFIG_GETMUTEX 11 /* sqlite3_mutex_methods* */ +/* previously SQLITE_CONFIG_CHUNKALLOC 12 which is now unused. */ +#define SQLITE_CONFIG_LOOKASIDE 13 /* int int */ +#define SQLITE_CONFIG_PCACHE 14 /* no-op */ +#define SQLITE_CONFIG_GETPCACHE 15 /* no-op */ +#define SQLITE_CONFIG_LOG 16 /* xFunc, void* */ +#define SQLITE_CONFIG_URI 17 /* int */ +#define SQLITE_CONFIG_PCACHE2 18 /* sqlite3_pcache_methods2* */ +#define SQLITE_CONFIG_GETPCACHE2 19 /* sqlite3_pcache_methods2* */ +#define SQLITE_CONFIG_COVERING_INDEX_SCAN 20 /* int */ +#define SQLITE_CONFIG_SQLLOG 21 /* xSqllog, void* */ +#define SQLITE_CONFIG_MMAP_SIZE 22 /* sqlite3_int64, sqlite3_int64 */ +#define SQLITE_CONFIG_WIN32_HEAPSIZE 23 /* int nByte */ +#define SQLITE_CONFIG_PCACHE_HDRSZ 24 /* int *psz */ +#define SQLITE_CONFIG_PMASZ 25 /* unsigned int szPma */ +#define SQLITE_CONFIG_STMTJRNL_SPILL 26 /* int nByte */ +#define SQLITE_CONFIG_SMALL_MALLOC 27 /* boolean */ + +/* +** CAPI3REF: Database Connection Configuration Options +** +** These constants are the available integer configuration options that +** can be passed as the second argument to the [sqlite3_db_config()] interface. +** +** 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 +** 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 +** [lookaside memory allocator] configuration for the [database connection]. +** ^The first argument (the third parameter to [sqlite3_db_config()] is a +** pointer to a memory buffer to use for lookaside memory. +** ^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 to +** SQLITE_DBCONFIG_LOOKASIDE is not a multiple of 8, it is internally +** rounded down to the next smaller multiple of 8. ^(The lookaside memory +** configuration for a database connection can only be changed when that +** connection is not currently using lookaside memory, or in other words +** when the "current value" returned by +** [sqlite3_db_status](D,[SQLITE_CONFIG_LOOKASIDE],...) is zero. +** Any attempt to change the lookaside memory configuration when lookaside +** memory is in use leaves the configuration unchanged and returns +** [SQLITE_BUSY].)^
      +** +**
      SQLITE_DBCONFIG_ENABLE_FKEY
      +**
      ^This option is used to enable or disable the enforcement of +** [foreign key constraints]. There should be two additional arguments. +** The first argument is an integer which is 0 to disable FK enforcement, +** positive to enable FK enforcement or negative to leave FK enforcement +** unchanged. The second parameter is a pointer to an integer into which +** is written 0 or 1 to indicate whether FK enforcement is off or on +** following this call. The second parameter may be a NULL pointer, in +** which case the FK enforcement setting is not reported back.
      +** +**
      SQLITE_DBCONFIG_ENABLE_TRIGGER
      +**
      ^This option is used to enable or disable [CREATE TRIGGER | triggers]. +** There should be two additional arguments. +** The first argument is an integer which is 0 to disable triggers, +** positive to enable triggers or negative to leave the setting unchanged. +** The second parameter is a pointer to an integer into which +** is written 0 or 1 to indicate whether triggers are disabled or enabled +** following this call. The second parameter may be a NULL pointer, in +** which case the trigger setting is not reported back.
      +** +**
      SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER
      +**
      ^This option is used to enable or disable the two-argument +** version of the [fts3_tokenizer()] function which is part of the +** [FTS3] full-text search engine extension. +** There should be two additional arguments. +** The first argument is an integer which is 0 to disable fts3_tokenizer() or +** positive to enable fts3_tokenizer() or negative to leave the setting +** unchanged. +** The second parameter is a pointer to an integer into which +** is written 0 or 1 to indicate whether fts3_tokenizer is disabled or enabled +** following this call. The second parameter may be a NULL pointer, in +** which case the new setting is not reported back.
      +** +**
      SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION
      +**
      ^This option is used to enable or disable the [sqlite3_load_extension()] +** interface independently of the [load_extension()] SQL function. +** The [sqlite3_enable_load_extension()] API enables or disables both the +** C-API [sqlite3_load_extension()] and the SQL function [load_extension()]. +** There should be two additional arguments. +** When the first argument to this interface is 1, then only the C-API is +** enabled and the SQL function remains disabled. If the first argument to +** this interface is 0, then both the C-API and the SQL function are disabled. +** If the first argument is -1, then no changes are made to state of either the +** C-API or the SQL function. +** The second parameter is a pointer to an integer into which +** is written 0 or 1 to indicate whether [sqlite3_load_extension()] interface +** is disabled or enabled following this call. The second parameter may +** be a NULL pointer, in which case the new setting is not reported back. +**
      +** +**
      SQLITE_DBCONFIG_MAINDBNAME
      +**
      ^This option is used to change the name of the "main" database +** schema. ^The sole argument is a pointer to a constant UTF8 string +** which will become the new schema name in place of "main". ^SQLite +** does not make a copy of the new main schema name string, so the application +** must ensure that the argument passed into this DBCONFIG option is unchanged +** until after the database connection closes. +**
      +** +**
      SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE
      +**
      Usually, when a database in wal mode is closed or detached from a +** database handle, SQLite checks if this will mean that there are now no +** connections at all to the database. If so, it performs a checkpoint +** operation before closing the connection. This option may be used to +** override this behaviour. The first parameter passed to this operation +** is an integer - non-zero to disable checkpoints-on-close, or zero (the +** default) to enable them. The second parameter is a pointer to an integer +** into which is written 0 or 1 to indicate whether checkpoints-on-close +** have been disabled - 0 if they are not disabled, 1 if they are. +**
      +**
      SQLITE_DBCONFIG_ENABLE_QPSG
      +**
      ^(The SQLITE_DBCONFIG_ENABLE_QPSG option activates or deactivates +** the [query planner stability guarantee] (QPSG). When the QPSG is active, +** a single SQL query statement will always use the same algorithm regardless +** of values of [bound parameters].)^ The QPSG disables some query optimizations +** that look at the values of bound parameters, which can make some queries +** slower. But the QPSG has the advantage of more predictable behavior. With +** the QPSG active, SQLite will always use the same query plan in the field as +** was used during testing in the lab. +**
      +**
      SQLITE_DBCONFIG_TRIGGER_EQP
      +**
      By default, the output of EXPLAIN QUERY PLAN commands does not +** include output for any operations performed by trigger programs. This +** option is used to set or clear (the default) a flag that governs this +** behavior. The first parameter passed to this operation is an integer - +** non-zero to enable output for trigger programs, or zero to disable it. +** The second parameter is a pointer to an integer into which is written +** 0 or 1 to indicate whether output-for-triggers has been disabled - 0 if +** it is not disabled, 1 if it is. +**
      +**
      +*/ +#define SQLITE_DBCONFIG_MAINDBNAME 1000 /* const char* */ +#define SQLITE_DBCONFIG_LOOKASIDE 1001 /* void* int int */ +#define SQLITE_DBCONFIG_ENABLE_FKEY 1002 /* int int* */ +#define SQLITE_DBCONFIG_ENABLE_TRIGGER 1003 /* int int* */ +#define SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER 1004 /* int int* */ +#define SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION 1005 /* int int* */ +#define SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE 1006 /* int int* */ +#define SQLITE_DBCONFIG_ENABLE_QPSG 1007 /* int int* */ +#define SQLITE_DBCONFIG_TRIGGER_EQP 1008 /* int int* */ +#define SQLITE_DBCONFIG_MAX 1008 /* Largest DBCONFIG */ + +/* +** CAPI3REF: Enable Or Disable Extended Result Codes +** METHOD: sqlite3 +** +** ^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 +** METHOD: sqlite3 +** +** ^Each entry in most SQLite tables (except for [WITHOUT ROWID] tables) +** 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 +** the table has a column of type [INTEGER PRIMARY KEY] then that column +** is another alias for the rowid. +** +** ^The sqlite3_last_insert_rowid(D) interface usually returns the [rowid] of +** the most recent successful [INSERT] into a rowid table or [virtual table] +** on database connection D. ^Inserts into [WITHOUT ROWID] tables are not +** recorded. ^If no successful [INSERT]s into rowid tables have ever occurred +** on the database connection D, then sqlite3_last_insert_rowid(D) returns +** zero. +** +** As well as being set automatically as rows are inserted into database +** tables, the value returned by this function may be set explicitly by +** [sqlite3_set_last_insert_rowid()] +** +** Some virtual table implementations may INSERT rows into rowid tables as +** part of committing a transaction (e.g. to flush data accumulated in memory +** to disk). In this case subsequent calls to this function return the rowid +** associated with these internal INSERT operations, which leads to +** unintuitive results. Virtual table implementations that do write to rowid +** tables in this way can avoid this problem by restoring the original +** rowid value using [sqlite3_set_last_insert_rowid()] before returning +** control to the user. +** +** ^(If an [INSERT] occurs within a trigger then this routine will +** return the [rowid] of the inserted row as long as the trigger is +** running. Once the trigger program ends, the value returned +** by this routine reverts to what it was before the trigger was fired.)^ +** +** ^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, +** and INSERT OR ABORT make no changes to the return value of this +** 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.)^ +** +** ^For the purposes of this routine, an [INSERT] is considered to +** be successful even if it is subsequently rolled back. +** +** 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()] +** function is running and thus changes the last insert [rowid], +** then the value returned by [sqlite3_last_insert_rowid()] is +** unpredictable and might not equal either the old or the new +** last insert [rowid]. +*/ +SQLITE_API sqlite3_int64 sqlite3_last_insert_rowid(sqlite3*); + +/* +** CAPI3REF: Set the Last Insert Rowid value. +** METHOD: sqlite3 +** +** The sqlite3_set_last_insert_rowid(D, R) method allows the application to +** set the value returned by calling sqlite3_last_insert_rowid(D) to R +** without inserting a row into the database. +*/ +SQLITE_API void sqlite3_set_last_insert_rowid(sqlite3*,sqlite3_int64); + +/* +** CAPI3REF: Count The Number Of Rows Modified +** METHOD: sqlite3 +** +** ^This function returns the number of rows modified, inserted or +** deleted by the most recently completed INSERT, UPDATE or DELETE +** statement on the database connection specified by the only parameter. +** ^Executing any other type of SQL statement does not modify the value +** returned by this function. +** +** ^Only changes made directly by the INSERT, UPDATE or DELETE statement are +** considered - auxiliary changes caused by [CREATE TRIGGER | triggers], +** [foreign key actions] or [REPLACE] constraint resolution are not counted. +** +** Changes to a view that are intercepted by +** [INSTEAD OF trigger | INSTEAD OF triggers] are not counted. ^The value +** returned by sqlite3_changes() immediately after an INSERT, UPDATE or +** DELETE statement run on a view is always zero. Only changes made to real +** tables are counted. +** +** Things are more complicated if the sqlite3_changes() function is +** executed while a trigger program is running. This may happen if the +** program uses the [changes() SQL function], or if some other callback +** function invokes sqlite3_changes() directly. Essentially: +** +**
        +**
      • ^(Before entering a trigger program the value returned by +** sqlite3_changes() function is saved. After the trigger program +** has finished, the original value is restored.)^ +** +**
      • ^(Within a trigger program each INSERT, UPDATE and DELETE +** statement sets the value returned by sqlite3_changes() +** upon completion as normal. Of course, this value will not include +** any changes performed by sub-triggers, as the sqlite3_changes() +** value will be saved and restored after each sub-trigger has run.)^ +**
      +** +** ^This means that if the changes() SQL function (or similar) is used +** by the first INSERT, UPDATE or DELETE statement within a trigger, it +** returns the value as set when the calling statement began executing. +** ^If it is used by the second or subsequent such statement within a trigger +** program, the value returned reflects the number of rows modified by the +** previous INSERT, UPDATE or DELETE statement within the same trigger. +** +** 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 +** is unpredictable and not meaningful. +*/ +SQLITE_API int sqlite3_changes(sqlite3*); + +/* +** CAPI3REF: Total Number Of Rows Modified +** METHOD: sqlite3 +** +** ^This function returns the total number of rows inserted, modified or +** deleted by all [INSERT], [UPDATE] or [DELETE] statements completed +** since the database connection was opened, including those executed as +** part of trigger programs. ^Executing any other type of SQL statement +** does not affect the value returned by sqlite3_total_changes(). +** +** ^Changes made as part of [foreign key actions] are included in the +** count, but those made as part of REPLACE constraint resolution are +** not. ^Changes to a view that are intercepted by INSTEAD OF triggers +** are not counted. +** +** 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 +** returned is unpredictable and not meaningful. +*/ +SQLITE_API int sqlite3_total_changes(sqlite3*); + +/* +** CAPI3REF: Interrupt A Long-Running Query +** METHOD: sqlite3 +** +** ^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 +** 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 +** 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 +** 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 +** 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 +** 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 +** SQL statements is a no-op and has no effect on SQL statements +** that are started after the sqlite3_interrupt() call returns. +*/ +SQLITE_API void sqlite3_interrupt(sqlite3*); + +/* +** 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 +** 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 +** 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 +** and comments that follow the final semicolon are ignored. +** +** ^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 +** will not detect syntactically incorrect SQL. +** +** ^(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.)^ +** +** The input to [sqlite3_complete()] must be a zero-terminated +** UTF-8 string. +** +** The input to [sqlite3_complete16()] must be a zero-terminated +** UTF-16 string in native byte order. +*/ +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 +** KEYWORDS: {busy-handler callback} {busy handler} +** METHOD: sqlite3 +** +** ^The sqlite3_busy_handler(D,X,P) routine sets a callback function X +** that might be invoked with argument P whenever +** an attempt is made to access a database table associated with +** [database connection] D when another thread +** or process has the table locked. +** The sqlite3_busy_handler() interface is used to implement +** [sqlite3_busy_timeout()] and [PRAGMA busy_timeout]. +** +** ^If the busy callback is NULL, then [SQLITE_BUSY] +** 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 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 previously for the same locking event. ^If the +** busy callback returns 0, then no additional attempts are made to +** access the database and [SQLITE_BUSY] is returned +** to the application. +** ^If the callback returns non-zero, then another attempt +** is made to access the database 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 +** handler could result in a deadlock, it will go ahead and return [SQLITE_BUSY] +** to the application instead of invoking the +** busy handler. +** Consider a scenario where one process is holding a read lock that +** it is trying to promote to a reserved lock and +** a second process is holding a reserved lock that it is trying +** to promote to an exclusive lock. The first process cannot proceed +** because it is blocked by the second and the second process cannot +** proceed because it is blocked by the first. If both processes +** invoke the busy handlers, neither will make any progress. Therefore, +** SQLite returns [SQLITE_BUSY] for the first process, hoping that this +** will induce the first process to release its read lock and allow +** the second process to proceed. +** +** ^The default busy callback is NULL. +** +** ^(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()] +** or evaluating [PRAGMA busy_timeout=N] will change the +** busy handler and thus clear any previously set busy handler. +** +** The busy callback should not take any actions which modify the +** database connection that invoked the busy handler. In other words, +** the busy handler is not reentrant. Any such actions +** result in undefined behavior. +** +** 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 +** METHOD: sqlite3 +** +** ^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. ^After at least "ms" milliseconds of sleeping, +** the handler returns 0 which causes [sqlite3_step()] to return +** [SQLITE_BUSY]. +** +** ^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 +** [database connection] at any given moment. If another busy handler +** was defined (using [sqlite3_busy_handler()]) prior to calling +** this routine, that other busy handler is cleared.)^ +** +** See also: [PRAGMA busy_timeout] +*/ +SQLITE_API int sqlite3_busy_timeout(sqlite3*, int ms); + +/* +** CAPI3REF: Convenience Routines For Running Queries +** METHOD: sqlite3 +** +** This is a legacy interface that is preserved for backwards compatibility. +** Use of this interface is not recommended. +** +** Definition: A result table is memory data structure created by the +** [sqlite3_get_table()] interface. A result table records the +** complete query results from one or more queries. +** +** The table conceptually has a number of rows and columns. But +** these numbers are not part of the result table itself. These +** numbers are obtained separately. Let N be the number of rows +** and M be the number of columns. +** +** A result table is an array of pointers to zero-terminated UTF-8 strings. +** There are (N+1)*M elements in the array. The first M pointers point +** to zero-terminated strings that contain the names of the columns. +** The remaining entries all point to query results. NULL values result +** in NULL pointers. All other values are in their UTF-8 zero-terminated +** string representation as returned by [sqlite3_column_text()]. +** +** A result table might consist of one or more memory allocations. +** It is not safe to pass a result table directly to [sqlite3_free()]. +** A result table should be deallocated using [sqlite3_free_table()]. +** +** ^(As an example of the result table format, suppose a query result +** is as follows: +** +**
      +**        Name        | Age
      +**        -----------------------
      +**        Alice       | 43
      +**        Bob         | 28
      +**        Cindy       | 21
      +** 
      +** +** There are two column (M==2) and three rows (N==3). Thus the +** result table has 8 entries. Suppose the result table is stored +** in an array names azResult. Then azResult holds this content: +** +**
      +**        azResult[0] = "Name";
      +**        azResult[1] = "Age";
      +**        azResult[2] = "Alice";
      +**        azResult[3] = "43";
      +**        azResult[4] = "Bob";
      +**        azResult[5] = "28";
      +**        azResult[6] = "Cindy";
      +**        azResult[7] = "21";
      +** 
      )^ +** +** ^The sqlite3_get_table() function evaluates one or more +** semicolon-separated SQL statements in the zero-terminated UTF-8 +** string of its 2nd parameter and returns a result table to the +** pointer given in its 3rd parameter. +** +** After the application has finished with the result from sqlite3_get_table(), +** it must 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 +** [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()]. +*/ +SQLITE_API int sqlite3_get_table( + sqlite3 *db, /* An open database */ + const char *zSql, /* SQL to be evaluated */ + char ***pazResult, /* Results of the query */ + int *pnRow, /* Number of result rows written here */ + int *pnColumn, /* Number of result columns written here */ + char **pzErrmsg /* Error msg written here */ +); +SQLITE_API void sqlite3_free_table(char **result); + +/* +** CAPI3REF: Formatted String Printing Functions +** +** These routines are work-alikes of the "printf()" family of functions +** from the standard C library. +** These routines understand most of the common K&R formatting options, +** plus some additional non-standard formats, detailed below. +** Note that some of the more obscure formatting options from recent +** C-library standards are omitted from this implementation. +** +** ^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 +** NULL pointer if [sqlite3_malloc()] is unable to allocate enough +** memory to hold the resulting string. +** +** ^(The 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 +** historical accident that cannot be fixed without breaking +** 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 +** 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 +** 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. +** +** ^The sqlite3_vsnprintf() routine is a varargs version of sqlite3_snprintf(). +** +** These routines all implement some additional formatting +** options that are useful for constructing SQL statements. +** All of the usual printf() formatting options apply. In addition, there +** is are "%q", "%Q", "%w" and "%z" options. +** +** ^(The %q option works like %s in that it substitutes a nul-terminated +** string from the argument list. But %q also doubles every '\'' character. +** %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. +** +** For example, assume the string variable zText contains text as follows: +** +**
      +**  char *zText = "It's a happy day!";
      +** 
      +** +** One can use this text in an SQL statement as follows: +** +**
      +**  char *zSQL = sqlite3_mprintf("INSERT INTO table VALUES('%q')", zText);
      +**  sqlite3_exec(db, zSQL, 0, 0, 0);
      +**  sqlite3_free(zSQL);
      +** 
      +** +** Because the %q format string is used, the '\'' character in zText +** is escaped and the SQL generated is as follows: +** +**
      +**  INSERT INTO table1 VALUES('It''s a happy day!')
      +** 
      +** +** This is correct. Had we used %s instead of %q, the generated SQL +** would have looked like this: +** +**
      +**  INSERT INTO table1 VALUES('It's a happy day!');
      +** 
      +** +** 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 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).)^ So, for example, one could say: +** +**
      +**  char *zSQL = sqlite3_mprintf("INSERT INTO table VALUES(%Q)", zText);
      +**  sqlite3_exec(db, zSQL, 0, 0, 0);
      +**  sqlite3_free(zSQL);
      +** 
      +** +** The code above will render a correct SQL statement in the zSQL +** variable even if the zText variable is a NULL pointer. +** +** ^(The "%w" formatting option is like "%q" except that it expects to +** be contained within double-quotes instead of single quotes, and it +** escapes the double-quote character instead of the single-quote +** character.)^ The "%w" formatting option is intended for safely inserting +** table and column names into a constructed SQL statement. +** +** ^(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.)^ +*/ +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*, ...); +SQLITE_API char *sqlite3_vsnprintf(int,char*,const char*, va_list); + +/* +** CAPI3REF: Memory Allocation Subsystem +** +** 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 +** 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 +** sqlite3_malloc() is zero or negative then sqlite3_malloc() returns +** a NULL pointer. +** +** ^The sqlite3_malloc64(N) routine works just like +** sqlite3_malloc(N) except that N is an unsigned 64-bit integer instead +** of a signed 32-bit integer. +** +** ^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 +** 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 +** memory might result in a segmentation fault or other severe error. +** Memory corruption, a segmentation fault, or other severe error +** 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(X,N) interface attempts to resize a +** prior memory allocation X to be at least N bytes. +** ^If the X parameter to sqlite3_realloc(X,N) +** is a NULL pointer then its behavior is identical to calling +** sqlite3_malloc(N). +** ^If the N parameter to sqlite3_realloc(X,N) is zero or +** negative then the behavior is exactly the same as calling +** sqlite3_free(X). +** ^sqlite3_realloc(X,N) returns a pointer to a memory allocation +** of at least N bytes in size or NULL if insufficient memory is available. +** ^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(X,N) and the prior allocation is freed. +** ^If sqlite3_realloc(X,N) returns NULL and N is positive, then the +** prior allocation is not freed. +** +** ^The sqlite3_realloc64(X,N) interfaces works the same as +** sqlite3_realloc(X,N) except that N is a 64-bit unsigned integer instead +** of a 32-bit signed integer. +** +** ^If X is a memory allocation previously obtained from sqlite3_malloc(), +** sqlite3_malloc64(), sqlite3_realloc(), or sqlite3_realloc64(), then +** sqlite3_msize(X) returns the size of that memory allocation in bytes. +** ^The value returned by sqlite3_msize(X) might be larger than the number +** of bytes requested when X was allocated. ^If X is a NULL pointer then +** sqlite3_msize(X) returns zero. If X points to something that is not +** the beginning of memory allocation, or if it points to a formerly +** valid memory allocation that has now been freed, then the behavior +** of sqlite3_msize(X) is undefined and possibly harmful. +** +** ^The memory returned by sqlite3_malloc(), sqlite3_realloc(), +** sqlite3_malloc64(), and sqlite3_realloc64() +** is always aligned to at least an 8 byte boundary, or to a +** 4 byte boundary if the [SQLITE_4_BYTE_ALIGNED_MALLOC] compile-time +** option is used. +** +** 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 +** implementation of these routines to be omitted. That capability +** is no longer provided. Only built-in memory allocators can be used. +** +** Prior to SQLite version 3.7.10, the Windows OS interface layer called +** the system malloc() and free() directly when converting +** filenames between the UTF-8 encoding used by SQLite +** and whatever filename encoding is used by the particular Windows +** installation. Memory allocation errors were detected, but +** they were reported back as [SQLITE_CANTOPEN] or +** [SQLITE_IOERR] rather than [SQLITE_NOMEM]. +** +** 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 +** not yet been released. +** +** The application must not read or write any part of +** a block of memory after it has been released using +** [sqlite3_free()] or [sqlite3_realloc()]. +*/ +SQLITE_API void *sqlite3_malloc(int); +SQLITE_API void *sqlite3_malloc64(sqlite3_uint64); +SQLITE_API void *sqlite3_realloc(void*, int); +SQLITE_API void *sqlite3_realloc64(void*, sqlite3_uint64); +SQLITE_API void sqlite3_free(void*); +SQLITE_API sqlite3_uint64 sqlite3_msize(void*); + +/* +** 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. +** +** ^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 +** +** SQLite contains a high-quality pseudo-random number generator (PRNG) used to +** select random [ROWID | ROWIDs] when inserting new records into a table that +** already uses the largest possible [ROWID]. The PRNG is also used for +** 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. +** ^The P parameter can be a NULL pointer. +** +** ^If this routine has not been previously called or if the previous +** call had N less than one or a NULL pointer for P, then the PRNG is +** seeded using randomness obtained from the xRandomness method of +** the default [sqlite3_vfs] object. +** ^If the previous call to this routine had an N of 1 or more and a +** non-NULL P then the pseudo-randomness is generated +** internally and without recourse to the [sqlite3_vfs] xRandomness +** method. +*/ +SQLITE_API void sqlite3_randomness(int N, void *P); + +/* +** CAPI3REF: Compile-Time Authorization Callbacks +** METHOD: sqlite3 +** KEYWORDS: {authorizer callback} +** +** ^This routine registers an authorizer callback with a particular +** [database connection], supplied in the first argument. +** ^The authorizer callback is invoked as SQL statements are being compiled +** by [sqlite3_prepare()] or its variants [sqlite3_prepare_v2()], +** [sqlite3_prepare_v3()], [sqlite3_prepare16()], [sqlite3_prepare16_v2()], +** and [sqlite3_prepare16_v3()]. ^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 +** 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 +** 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 +** [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 +** to the callback is an integer [SQLITE_COPY | action code] that specifies +** the particular action to be authorized. ^The third through sixth parameters +** to the callback are either NULL pointers or zero-terminated strings +** that contain additional details about the action to be authorized. +** Applications must always be prepared to encounter a NULL pointer in any +** of the third through the sixth parameters of the authorization callback. +** +** ^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. +** ^When a table is referenced by a [SELECT] but no column values are +** extracted from that table (for example in a query like +** "SELECT count(*) FROM tab") then the [SQLITE_READ] authorizer callback +** is invoked once for that table with a column name that is an empty string. +** ^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. +** +** An authorizer is used when [sqlite3_prepare | preparing] +** SQL statements from an untrusted source, to ensure that the SQL statements +** do not try to access data they are not allowed to see, or that they do not +** try to execute malicious statements that damage the database. For +** example, an application may allow a user to enter arbitrary +** SQL queries for evaluation by a database. But the application does +** not want the user to be able to make arbitrary changes to the +** database. An authorizer could then be put in place while the +** user-entered SQL is being [sqlite3_prepare | prepared] that +** disallows everything except [SELECT] statements. +** +** Applications that need to process SQL from untrusted sources +** might also consider lowering resource limits using [sqlite3_limit()] +** 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 +** at a time. Each call to sqlite3_set_authorizer overrides the +** 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 +** the database connection that invoked the authorizer callback. +** 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 +** 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 +** [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. +*/ +SQLITE_API int sqlite3_set_authorizer( + sqlite3*, + int (*xAuth)(void*,int,const char*,const char*,const char*,const char*), + void *pUserData +); + +/* +** CAPI3REF: Authorizer Return Codes +** +** The [sqlite3_set_authorizer | authorizer callback function] must +** return either [SQLITE_OK] or one of these two constants in order +** to signal SQLite whether or not the action is permitted. See the +** [sqlite3_set_authorizer | authorizer documentation] for additional +** information. +** +** Note that SQLITE_IGNORE is also used as a [conflict resolution mode] +** returned from the [sqlite3_vtab_on_conflict()] interface. +*/ +#define SQLITE_DENY 1 /* Abort the SQL statement with an error */ +#define SQLITE_IGNORE 2 /* Don't allow access, but don't generate an error */ + +/* +** CAPI3REF: Authorizer Action Codes +** +** The [sqlite3_set_authorizer()] interface registers a callback function +** that is invoked to authorize certain SQL statement actions. The +** second parameter to the callback is an integer code that specifies +** what action is being authorized. These are the integer action codes that +** the authorizer callback may be passed. +** +** 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 +** authorizer callback is the name of the database ("main", "temp", +** 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. +*/ +/******************************************* 3rd ************ 4th ***********/ +#define SQLITE_CREATE_INDEX 1 /* Index Name Table Name */ +#define SQLITE_CREATE_TABLE 2 /* Table Name NULL */ +#define SQLITE_CREATE_TEMP_INDEX 3 /* Index Name Table Name */ +#define SQLITE_CREATE_TEMP_TABLE 4 /* Table Name NULL */ +#define SQLITE_CREATE_TEMP_TRIGGER 5 /* Trigger Name Table Name */ +#define SQLITE_CREATE_TEMP_VIEW 6 /* View Name NULL */ +#define SQLITE_CREATE_TRIGGER 7 /* Trigger Name Table Name */ +#define SQLITE_CREATE_VIEW 8 /* View Name NULL */ +#define SQLITE_DELETE 9 /* Table Name NULL */ +#define SQLITE_DROP_INDEX 10 /* Index Name Table Name */ +#define SQLITE_DROP_TABLE 11 /* Table Name NULL */ +#define SQLITE_DROP_TEMP_INDEX 12 /* Index Name Table Name */ +#define SQLITE_DROP_TEMP_TABLE 13 /* Table Name NULL */ +#define SQLITE_DROP_TEMP_TRIGGER 14 /* Trigger Name Table Name */ +#define SQLITE_DROP_TEMP_VIEW 15 /* View Name NULL */ +#define SQLITE_DROP_TRIGGER 16 /* Trigger Name Table Name */ +#define SQLITE_DROP_VIEW 17 /* View Name NULL */ +#define SQLITE_INSERT 18 /* Table Name NULL */ +#define SQLITE_PRAGMA 19 /* Pragma Name 1st arg or NULL */ +#define SQLITE_READ 20 /* Table Name Column Name */ +#define SQLITE_SELECT 21 /* NULL NULL */ +#define SQLITE_TRANSACTION 22 /* Operation NULL */ +#define SQLITE_UPDATE 23 /* Table Name Column Name */ +#define SQLITE_ATTACH 24 /* Filename NULL */ +#define SQLITE_DETACH 25 /* Database Name NULL */ +#define SQLITE_ALTER_TABLE 26 /* Database Name Table Name */ +#define SQLITE_REINDEX 27 /* Index Name NULL */ +#define SQLITE_ANALYZE 28 /* Table Name NULL */ +#define SQLITE_CREATE_VTABLE 29 /* Table Name Module Name */ +#define SQLITE_DROP_VTABLE 30 /* Table Name Module Name */ +#define SQLITE_FUNCTION 31 /* NULL Function Name */ +#define SQLITE_SAVEPOINT 32 /* Operation Savepoint Name */ +#define SQLITE_COPY 0 /* No longer used */ +#define SQLITE_RECURSIVE 33 /* NULL NULL */ + +/* +** CAPI3REF: Tracing And Profiling Functions +** METHOD: sqlite3 +** +** These routines are deprecated. Use the [sqlite3_trace_v2()] interface +** instead of the routines described here. +** +** 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 +** various times when an SQL statement is being run by [sqlite3_step()]. +** ^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.)^ +** +** The [SQLITE_TRACE_SIZE_LIMIT] compile-time option can be used to limit +** the length of [bound parameter] expansion in the output of sqlite3_trace(). +** +** ^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. ^The profile callback +** time is in units of nanoseconds, however the current implementation +** is only capable of millisecond resolution so the six least significant +** digits in the time are meaningless. Future versions of SQLite +** might provide greater resolution on the profiler callback. The +** sqlite3_profile() function is considered experimental and is +** subject to change in future versions of SQLite. +*/ +SQLITE_API SQLITE_DEPRECATED void *sqlite3_trace(sqlite3*, + void(*xTrace)(void*,const char*), void*); +SQLITE_API SQLITE_DEPRECATED void *sqlite3_profile(sqlite3*, + void(*xProfile)(void*,const char*,sqlite3_uint64), void*); + +/* +** CAPI3REF: SQL Trace Event Codes +** KEYWORDS: SQLITE_TRACE +** +** These constants identify classes of events that can be monitored +** using the [sqlite3_trace_v2()] tracing logic. The M argument +** to [sqlite3_trace_v2(D,M,X,P)] is an OR-ed combination of one or more of +** the following constants. ^The first argument to the trace callback +** is one of the following constants. +** +** New tracing constants may be added in future releases. +** +** ^A trace callback has four arguments: xCallback(T,C,P,X). +** ^The T argument is one of the integer type codes above. +** ^The C argument is a copy of the context pointer passed in as the +** fourth argument to [sqlite3_trace_v2()]. +** The P and X arguments are pointers whose meanings depend on T. +** +**
      +** [[SQLITE_TRACE_STMT]]
      SQLITE_TRACE_STMT
      +**
      ^An SQLITE_TRACE_STMT callback is invoked when a prepared statement +** first begins running and possibly at other times during the +** execution of the prepared statement, such as at the start of each +** trigger subprogram. ^The P argument is a pointer to the +** [prepared statement]. ^The X argument is a pointer to a string which +** is the unexpanded SQL text of the prepared statement or an SQL comment +** that indicates the invocation of a trigger. ^The callback can compute +** the same text that would have been returned by the legacy [sqlite3_trace()] +** interface by using the X argument when X begins with "--" and invoking +** [sqlite3_expanded_sql(P)] otherwise. +** +** [[SQLITE_TRACE_PROFILE]]
      SQLITE_TRACE_PROFILE
      +**
      ^An SQLITE_TRACE_PROFILE callback provides approximately the same +** information as is provided by the [sqlite3_profile()] callback. +** ^The P argument is a pointer to the [prepared statement] and the +** X argument points to a 64-bit integer which is the estimated of +** the number of nanosecond that the prepared statement took to run. +** ^The SQLITE_TRACE_PROFILE callback is invoked when the statement finishes. +** +** [[SQLITE_TRACE_ROW]]
      SQLITE_TRACE_ROW
      +**
      ^An SQLITE_TRACE_ROW callback is invoked whenever a prepared +** statement generates a single row of result. +** ^The P argument is a pointer to the [prepared statement] and the +** X argument is unused. +** +** [[SQLITE_TRACE_CLOSE]]
      SQLITE_TRACE_CLOSE
      +**
      ^An SQLITE_TRACE_CLOSE callback is invoked when a database +** connection closes. +** ^The P argument is a pointer to the [database connection] object +** and the X argument is unused. +**
      +*/ +#define SQLITE_TRACE_STMT 0x01 +#define SQLITE_TRACE_PROFILE 0x02 +#define SQLITE_TRACE_ROW 0x04 +#define SQLITE_TRACE_CLOSE 0x08 + +/* +** CAPI3REF: SQL Trace Hook +** METHOD: sqlite3 +** +** ^The sqlite3_trace_v2(D,M,X,P) interface registers a trace callback +** function X against [database connection] D, using property mask M +** and context pointer P. ^If the X callback is +** NULL or if the M mask is zero, then tracing is disabled. The +** M argument should be the bitwise OR-ed combination of +** zero or more [SQLITE_TRACE] constants. +** +** ^Each call to either sqlite3_trace() or sqlite3_trace_v2() overrides +** (cancels) any prior calls to sqlite3_trace() or sqlite3_trace_v2(). +** +** ^The X callback is invoked whenever any of the events identified by +** mask M occur. ^The integer return value from the callback is currently +** ignored, though this may change in future releases. Callback +** implementations should return zero to ensure future compatibility. +** +** ^A trace callback is invoked with four arguments: callback(T,C,P,X). +** ^The T argument is one of the [SQLITE_TRACE] +** constants to indicate why the callback was invoked. +** ^The C argument is a copy of the context pointer. +** The P and X arguments are pointers whose meanings depend on T. +** +** The sqlite3_trace_v2() interface is intended to replace the legacy +** interfaces [sqlite3_trace()] and [sqlite3_profile()], both of which +** are deprecated. +*/ +SQLITE_API int sqlite3_trace_v2( + sqlite3*, + unsigned uMask, + int(*xCallback)(unsigned,void*,void*,void*), + void *pCtx +); + +/* +** CAPI3REF: Query Progress Callbacks +** METHOD: sqlite3 +** +** ^The sqlite3_progress_handler(D,N,X,P) interface causes the callback +** function X to be invoked periodically during long running calls to +** [sqlite3_exec()], [sqlite3_step()] and [sqlite3_get_table()] for +** database connection D. An example use for this +** interface is to keep a GUI updated during a large query. +** +** ^The parameter P is passed through as the only parameter to the +** callback function X. ^The parameter N is the approximate number of +** [virtual machine instructions] that are evaluated between successive +** invocations of the callback X. ^If N is less than one then the progress +** handler is disabled. +** +** ^Only a single progress handler may be defined at one time per +** [database connection]; setting a new progress handler cancels the +** old one. ^Setting parameter X to NULL disables the progress handler. +** ^The progress handler is also disabled by setting N to a value less +** than 1. +** +** ^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. +** +** The progress handler callback must not do anything that will modify +** the database connection that invoked the progress handler. +** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their +** database connections for the meaning of "modify" in this paragraph. +** +*/ +SQLITE_API void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); + +/* +** CAPI3REF: Opening A New Database Connection +** CONSTRUCTOR: sqlite3 +** +** ^These routines open an SQLite database file as specified 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 +** 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 +** [sqlite3_errmsg()] or [sqlite3_errmsg16()] routines can be used to obtain +** an English language description of the error following a failure of any +** of the sqlite3_open() routines. +** +** ^The default encoding will be UTF-8 for databases created using +** sqlite3_open() or sqlite3_open_v2(). ^The default encoding for databases +** created using sqlite3_open16() will be UTF-16 in the native byte order. +** +** Whether or not an error occurs when it is opened, resources +** associated with the [database connection] handle should be released by +** passing it to [sqlite3_close()] when it is no longer required. +** +** 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 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], +** [SQLITE_OPEN_PRIVATECACHE], and/or [SQLITE_OPEN_URI] flags:)^ +** +**
      +** ^(
      [SQLITE_OPEN_READONLY]
      +**
      The database is opened in read-only mode. If the database does not +** already exist, an error is returned.
      )^ +** +** ^(
      [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.
      )^ +** +** ^(
      [SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE]
      +**
      The database is opened for reading and writing, and is created if +** it does not already exist. This is the behavior that is always used for +** sqlite3_open() and sqlite3_open16().
      )^ +**
      +** +** If the 3rd parameter to sqlite3_open_v2() is not one of the +** combinations shown above optionally combined with other +** [SQLITE_OPEN_READONLY | SQLITE_OPEN_* bits] +** then the behavior is undefined. +** +** ^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 +** [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 +** eligible to use [shared cache mode], regardless of whether or not shared +** 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. +** +** ^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 +** a NULL pointer then the default [sqlite3_vfs] object is used. +** +** ^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 +** automatically deleted as soon as the database connection is closed. +** +** [[URI filenames in sqlite3_open()]]

      URI Filenames

      +** +** ^If [URI filename] interpretation is enabled, and the filename argument +** begins with "file:", then the filename is interpreted as a URI. ^URI +** filename interpretation is enabled if the [SQLITE_OPEN_URI] flag is +** set in the third argument to sqlite3_open_v2(), or if it has +** been enabled globally using the [SQLITE_CONFIG_URI] option with the +** [sqlite3_config()] method or by the [SQLITE_USE_URI] compile-time option. +** URI filename interpretation is turned off +** by default, but future releases of SQLite might enable URI filename +** interpretation by default. See "[URI filenames]" for additional +** information. +** +** URI filenames are parsed according to RFC 3986. ^If the URI contains an +** authority, then it must be either an empty string or the string +** "localhost". ^If the authority is not an empty string or "localhost", an +** error is returned to the caller. ^The fragment component of a URI, if +** present, is ignored. +** +** ^SQLite uses the path component of the URI as the name of the disk file +** which contains the database. ^If the path begins with a '/' character, +** then it is interpreted as an absolute path. ^If the path does not begin +** with a '/' (meaning that the authority section is omitted from the URI) +** then the path is interpreted as a relative path. +** ^(On windows, the first component of an absolute path +** is a drive specification (e.g. "C:").)^ +** +** [[core URI query parameters]] +** The query component of a URI may contain parameters that are interpreted +** either by SQLite itself, or by a [VFS | custom VFS implementation]. +** SQLite and its built-in [VFSes] interpret the +** following query parameters: +** +**
        +**
      • vfs: ^The "vfs" parameter may be used to specify the name of +** a VFS object that provides the operating system interface that should +** be used to access the database file on disk. ^If this option is set to +** an empty string the default VFS object is used. ^Specifying an unknown +** VFS is an error. ^If sqlite3_open_v2() is used and the vfs option is +** present, then the VFS specified by the option takes precedence over +** the value passed as the fourth parameter to sqlite3_open_v2(). +** +**
      • mode: ^(The mode parameter may be set to either "ro", "rw", +** "rwc", or "memory". Attempting to set it to any other value is +** an error)^. +** ^If "ro" is specified, then the database is opened for read-only +** access, just as if the [SQLITE_OPEN_READONLY] flag had been set in the +** third argument to sqlite3_open_v2(). ^If the mode option is set to +** "rw", then the database is opened for read-write (but not create) +** access, as if SQLITE_OPEN_READWRITE (but not SQLITE_OPEN_CREATE) had +** been set. ^Value "rwc" is equivalent to setting both +** SQLITE_OPEN_READWRITE and SQLITE_OPEN_CREATE. ^If the mode option is +** set to "memory" then a pure [in-memory database] that never reads +** or writes from disk is used. ^It is an error to specify a value for +** the mode parameter that is less restrictive than that specified by +** the flags passed in the third parameter to sqlite3_open_v2(). +** +**
      • cache: ^The cache parameter may be set to either "shared" or +** "private". ^Setting it to "shared" is equivalent to setting the +** SQLITE_OPEN_SHAREDCACHE bit in the flags argument passed to +** sqlite3_open_v2(). ^Setting the cache parameter to "private" is +** equivalent to setting the SQLITE_OPEN_PRIVATECACHE bit. +** ^If sqlite3_open_v2() is used and the "cache" parameter is present in +** a URI filename, its value overrides any behavior requested by setting +** SQLITE_OPEN_PRIVATECACHE or SQLITE_OPEN_SHAREDCACHE flag. +** +**
      • psow: ^The psow parameter indicates whether or not the +** [powersafe overwrite] property does or does not apply to the +** storage media on which the database file resides. +** +**
      • nolock: ^The nolock parameter is a boolean query parameter +** which if set disables file locking in rollback journal modes. This +** is useful for accessing a database on a filesystem that does not +** support locking. Caution: Database corruption might result if two +** or more processes write to the same database and any one of those +** processes uses nolock=1. +** +**
      • immutable: ^The immutable parameter is a boolean query +** parameter that indicates that the database file is stored on +** read-only media. ^When immutable is set, SQLite assumes that the +** database file cannot be changed, even by a process with higher +** privilege, and so the database is opened read-only and all locking +** and change detection is disabled. Caution: Setting the immutable +** property on a database file that does in fact change can result +** in incorrect query results and/or [SQLITE_CORRUPT] errors. +** See also: [SQLITE_IOCAP_IMMUTABLE]. +** +**
      +** +** ^Specifying an unknown parameter in the query component of a URI is not an +** error. Future versions of SQLite might understand additional query +** parameters. See "[query parameters with special meaning to SQLite]" for +** additional information. +** +** [[URI filename examples]]

      URI filename examples

      +** +** +**
      URI filenames Results +**
      file:data.db +** Open the file "data.db" in the current directory. +**
      file:/home/fred/data.db
      +** file:///home/fred/data.db
      +** file://localhost/home/fred/data.db
      +** Open the database file "/home/fred/data.db". +**
      file://darkstar/home/fred/data.db +** An error. "darkstar" is not a recognized authority. +**
      +** file:///C:/Documents%20and%20Settings/fred/Desktop/data.db +** Windows only: Open the file "data.db" on fred's desktop on drive +** C:. Note that the %20 escaping in this example is not strictly +** necessary - space characters can be used literally +** in URI filenames. +**
      file:data.db?mode=ro&cache=private +** Open file "data.db" in the current directory for read-only access. +** Regardless of whether or not shared-cache mode is enabled by +** default, use a private cache. +**
      file:/home/fred/data.db?vfs=unix-dotfile +** Open file "/home/fred/data.db". Use the special VFS "unix-dotfile" +** that uses dot-files in place of posix advisory locking. +**
      file:data.db?mode=readonly +** An error. "readonly" is not a valid option for the "mode" parameter. +**
      +** +** ^URI hexadecimal escape sequences (%HH) are supported within the path and +** query components of a URI. A hexadecimal escape sequence consists of a +** percent sign - "%" - followed by exactly two hexadecimal digits +** specifying an octet value. ^Before the path or query components of a +** URI filename are interpreted, they are encoded using UTF-8 and all +** hexadecimal escape sequences replaced by a single byte containing the +** corresponding octet. If this process generates an invalid UTF-8 encoding, +** the results are undefined. +** +** Note to Windows users: The encoding used for the filename argument +** of sqlite3_open() and sqlite3_open_v2() must be UTF-8, not whatever +** 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(). +** +** Note to Windows Runtime users: The temporary directory must be set +** prior to calling sqlite3_open() or sqlite3_open_v2(). Otherwise, various +** features that require the use of temporary files may fail. +** +** See also: [sqlite3_temp_directory] +*/ +SQLITE_API int sqlite3_open( + const char *filename, /* Database filename (UTF-8) */ + sqlite3 **ppDb /* OUT: SQLite db handle */ +); +SQLITE_API int sqlite3_open16( + const void *filename, /* Database filename (UTF-16) */ + sqlite3 **ppDb /* OUT: SQLite db handle */ +); +SQLITE_API int sqlite3_open_v2( + const char *filename, /* Database filename (UTF-8) */ + sqlite3 **ppDb, /* OUT: SQLite db handle */ + int flags, /* Flags */ + const char *zVfs /* Name of VFS module to use */ +); + +/* +** CAPI3REF: Obtain Values For URI Parameters +** +** These are utility routines, useful to VFS implementations, that check +** to see if a database file was a URI that contained a specific query +** parameter, and if so obtains the value of that query parameter. +** +** If F is the database filename pointer passed into the xOpen() method of +** a VFS implementation when the flags parameter to xOpen() has one or +** more of the [SQLITE_OPEN_URI] or [SQLITE_OPEN_MAIN_DB] bits set and +** P is the name of the query parameter, then +** sqlite3_uri_parameter(F,P) returns the value of the P +** parameter if it exists or a NULL pointer if P does not appear as a +** query parameter on F. If P is a query parameter of F +** has no explicit value, then sqlite3_uri_parameter(F,P) returns +** a pointer to an empty string. +** +** The sqlite3_uri_boolean(F,P,B) routine assumes that P is a boolean +** parameter and returns true (1) or false (0) according to the value +** of P. The sqlite3_uri_boolean(F,P,B) routine returns true (1) if the +** value of query parameter P is one of "yes", "true", or "on" in any +** case or if the value begins with a non-zero number. The +** sqlite3_uri_boolean(F,P,B) routines returns false (0) if the value of +** query parameter P is one of "no", "false", or "off" in any case or +** if the value begins with a numeric zero. If P is not a query +** parameter on F or if the value of P is does not match any of the +** above, then sqlite3_uri_boolean(F,P,B) returns (B!=0). +** +** The sqlite3_uri_int64(F,P,D) routine converts the value of P into a +** 64-bit signed integer and returns that integer, or D if P does not +** exist. If the value of P is something other than an integer, then +** zero is returned. +** +** If F is a NULL pointer, then sqlite3_uri_parameter(F,P) returns NULL and +** sqlite3_uri_boolean(F,P,B) returns B. If F is not a NULL pointer and +** is not a database file pathname pointer that SQLite passed into the xOpen +** VFS method, then the behavior of this routine is undefined and probably +** undesirable. +*/ +SQLITE_API const char *sqlite3_uri_parameter(const char *zFilename, const char *zParam); +SQLITE_API int sqlite3_uri_boolean(const char *zFile, const char *zParam, int bDefault); +SQLITE_API sqlite3_int64 sqlite3_uri_int64(const char*, const char*, sqlite3_int64); + + +/* +** CAPI3REF: Error Codes And Messages +** METHOD: sqlite3 +** +** ^If the most recent sqlite3_* API call associated with +** [database connection] D failed, then the sqlite3_errcode(D) interface +** returns the numeric [result code] or [extended result code] for that +** API call. +** If the most recent API call was successful, +** then the return value from 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 +** text that describes the error, as either UTF-8 or UTF-16 respectively. +** ^(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.)^ +** +** ^The sqlite3_errstr() interface returns the English-language text +** that describes the [result code], as UTF-8. +** ^(Memory to hold the error message string is managed internally +** and must not be freed by the application)^. +** +** When the serialized [threading mode] is in use, it might be the +** case that a second error occurs on a separate thread in between +** the time of the first error and the call to these interfaces. +** When that happens, the second error will be reported since these +** interfaces always report the most recent result. To avoid +** this, each thread can obtain exclusive use of the [database connection] D +** by invoking [sqlite3_mutex_enter]([sqlite3_db_mutex](D)) before beginning +** to use D and invoking [sqlite3_mutex_leave]([sqlite3_db_mutex](D)) after +** all calls to the interfaces listed here are completed. +** +** 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. +*/ +SQLITE_API int sqlite3_errcode(sqlite3 *db); +SQLITE_API int sqlite3_extended_errcode(sqlite3 *db); +SQLITE_API const char *sqlite3_errmsg(sqlite3*); +SQLITE_API const void *sqlite3_errmsg16(sqlite3*); +SQLITE_API const char *sqlite3_errstr(int); + +/* +** CAPI3REF: Prepared Statement Object +** KEYWORDS: {prepared statement} {prepared statements} +** +** An instance of this object represents a single SQL statement that +** has been compiled into binary form and is ready to be evaluated. +** +** Think of each SQL statement as a separate computer program. The +** original SQL text is source code. A prepared statement object +** is the compiled object code. All SQL must be converted into a +** prepared statement before it can be run. +** +** The life-cycle of a prepared statement object usually goes like this: +** +**
        +**
      1. Create the prepared statement object using [sqlite3_prepare_v2()]. +**
      2. Bind values to [parameters] using the sqlite3_bind_*() +** interfaces. +**
      3. Run the SQL by calling [sqlite3_step()] one or more times. +**
      4. Reset the prepared statement using [sqlite3_reset()] then go back +** to step 2. Do this zero or more times. +**
      5. Destroy the object using [sqlite3_finalize()]. +**
      +*/ +typedef struct sqlite3_stmt sqlite3_stmt; + +/* +** CAPI3REF: Run-time Limits +** METHOD: sqlite3 +** +** ^(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.)^ +** +** ^If the new limit is a negative number, the limit is unchanged. +** ^(For each limit category SQLITE_LIMIT_NAME there is a +** [limits | hard upper bound] +** set at compile-time by a C preprocessor macro called +** [limits | SQLITE_MAX_NAME]. +** (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. +** +** ^Regardless of whether or not the limit was changed, the +** [sqlite3_limit()] interface returns the prior value of the limit. +** ^Hence, to find the current value of a limit without changing it, +** simply invoke this interface with the third parameter set to -1. +** +** 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 +** separate databases controlled by JavaScript applications downloaded +** off the Internet. The internal databases can be given the +** large, default limits. Databases managed by external sources can +** be given much smaller limits designed to prevent a denial of service +** attack. Developers might also want to use the [sqlite3_set_authorizer()] +** interface to further control untrusted SQL. The size of the database +** created by an untrusted script can be contained using the +** [max_page_count] [PRAGMA]. +** +** New run-time limit categories may be added in future releases. +*/ +SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal); + +/* +** 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()]. +** The synopsis of the meanings of the various limits is shown below. +** Additional information is available at [limits | Limits in SQLite]. +** +**
      +** [[SQLITE_LIMIT_LENGTH]] ^(
      SQLITE_LIMIT_LENGTH
      +**
      The maximum size of any string or BLOB or table row, in bytes.
      )^ +** +** [[SQLITE_LIMIT_SQL_LENGTH]] ^(
      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.
      )^ +** +** [[SQLITE_LIMIT_EXPR_DEPTH]] ^(
      SQLITE_LIMIT_EXPR_DEPTH
      +**
      The maximum depth of the parse tree on any expression.
      )^ +** +** [[SQLITE_LIMIT_COMPOUND_SELECT]] ^(
      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. If [sqlite3_prepare_v2()] or +** the equivalent tries to allocate space for more than this many opcodes +** in a single prepared statement, an SQLITE_NOMEM error is returned.
      )^ +** +** [[SQLITE_LIMIT_FUNCTION_ARG]] ^(
      SQLITE_LIMIT_FUNCTION_ARG
      +**
      The maximum number of arguments on a function.
      )^ +** +** [[SQLITE_LIMIT_ATTACHED]] ^(
      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.
      )^ +** +** [[SQLITE_LIMIT_VARIABLE_NUMBER]] +** ^(
      SQLITE_LIMIT_VARIABLE_NUMBER
      +**
      The maximum index number of any [parameter] in an SQL statement.)^ +** +** [[SQLITE_LIMIT_TRIGGER_DEPTH]] ^(
      SQLITE_LIMIT_TRIGGER_DEPTH
      +**
      The maximum depth of recursion for triggers.
      )^ +** +** [[SQLITE_LIMIT_WORKER_THREADS]] ^(
      SQLITE_LIMIT_WORKER_THREADS
      +**
      The maximum number of auxiliary worker threads that a single +** [prepared statement] may start.
      )^ +**
      +*/ +#define SQLITE_LIMIT_LENGTH 0 +#define SQLITE_LIMIT_SQL_LENGTH 1 +#define SQLITE_LIMIT_COLUMN 2 +#define SQLITE_LIMIT_EXPR_DEPTH 3 +#define SQLITE_LIMIT_COMPOUND_SELECT 4 +#define SQLITE_LIMIT_VDBE_OP 5 +#define SQLITE_LIMIT_FUNCTION_ARG 6 +#define SQLITE_LIMIT_ATTACHED 7 +#define SQLITE_LIMIT_LIKE_PATTERN_LENGTH 8 +#define SQLITE_LIMIT_VARIABLE_NUMBER 9 +#define SQLITE_LIMIT_TRIGGER_DEPTH 10 +#define SQLITE_LIMIT_WORKER_THREADS 11 + +/* +** CAPI3REF: Prepare Flags +** +** These constants define various flags that can be passed into +** "prepFlags" parameter of the [sqlite3_prepare_v3()] and +** [sqlite3_prepare16_v3()] interfaces. +** +** New flags may be added in future releases of SQLite. +** +**
      +** [[SQLITE_PREPARE_PERSISTENT]] ^(
      SQLITE_PREPARE_PERSISTENT
      +**
      The SQLITE_PREPARE_PERSISTENT flag is a hint to the query planner +** that the prepared statement will be retained for a long time and +** probably reused many times.)^ ^Without this flag, [sqlite3_prepare_v3()] +** and [sqlite3_prepare16_v3()] assume that the prepared statement will +** be used just once or at most a few times and then destroyed using +** [sqlite3_finalize()] relatively soon. The current implementation acts +** on this hint by avoiding the use of [lookaside memory] so as not to +** deplete the limited store of lookaside memory. Future versions of +** SQLite may act on this hint differently. +**
      +*/ +#define SQLITE_PREPARE_PERSISTENT 0x01 + +/* +** CAPI3REF: Compiling An SQL Statement +** KEYWORDS: {SQL statement compiler} +** METHOD: sqlite3 +** CONSTRUCTOR: sqlite3_stmt +** +** To execute an SQL statement, it must first be compiled into a byte-code +** program using one of these routines. Or, in other words, these routines +** are constructors for the [prepared statement] object. +** +** The preferred routine to use is [sqlite3_prepare_v2()]. The +** [sqlite3_prepare()] interface is legacy and should be avoided. +** [sqlite3_prepare_v3()] has an extra "prepFlags" option that is used +** for special purposes. +** +** The use of the UTF-8 interfaces is preferred, as SQLite currently +** does all parsing using UTF-8. The UTF-16 interfaces are provided +** as a convenience. The UTF-16 interfaces work by converting the +** input text into UTF-8, then invoking the corresponding UTF-8 interface. +** +** The first argument, "db", is a [database connection] obtained from a +** prior successful call to [sqlite3_open()], [sqlite3_open_v2()] or +** [sqlite3_open16()]. The database connection must not have been closed. +** +** The second argument, "zSql", is the statement to be compiled, encoded +** as either UTF-8 or UTF-16. The sqlite3_prepare(), sqlite3_prepare_v2(), +** and sqlite3_prepare_v3() +** interfaces use UTF-8, and sqlite3_prepare16(), sqlite3_prepare16_v2(), +** and sqlite3_prepare16_v3() use UTF-16. +** +** ^If the nByte argument is negative, then zSql is read up to the +** first zero terminator. ^If nByte is positive, then it is the +** number of bytes read from zSql. ^If nByte is zero, then no prepared +** statement is generated. +** If the caller knows that the supplied string is nul-terminated, then +** there is a small performance advantage to passing an nByte parameter that +** is the number of bytes in the input string including +** the nul-terminator. +** +** ^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 +** 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, the sqlite3_prepare() family of routines return [SQLITE_OK]; +** otherwise an [error code] is returned. +** +** The sqlite3_prepare_v2(), sqlite3_prepare_v3(), sqlite3_prepare16_v2(), +** and sqlite3_prepare16_v3() interfaces are recommended for all new programs. +** The older interfaces (sqlite3_prepare() and sqlite3_prepare16()) +** are retained for backwards compatibility, but their use is discouraged. +** ^In the "vX" 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 differently in three ways: +** +**
        +**
      1. +** ^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. As many as [SQLITE_MAX_SCHEMA_RETRY] +** retries will occur before sqlite3_step() gives up and returns an error. +**
      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 +** [sqlite3_step()] would only return a generic [SQLITE_ERROR] result code +** 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. +** +**
      5. +** ^If the specific value bound to [parameter | host parameter] in the +** WHERE clause might influence the choice of query plan for a statement, +** then the statement will 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 that [parameter]. +** ^The specific value of WHERE-clause [parameter] might influence the +** choice of query plan if the parameter is the left-hand side of a [LIKE] +** or [GLOB] operator or if the parameter is compared to an indexed column +** and the [SQLITE_ENABLE_STAT3] compile-time option is enabled. +**
      6. +** +**

        ^sqlite3_prepare_v3() differs from sqlite3_prepare_v2() only in having +** the extra prepFlags parameter, which is a bit array consisting of zero or +** more of the [SQLITE_PREPARE_PERSISTENT|SQLITE_PREPARE_*] flags. ^The +** sqlite3_prepare_v2() interface works exactly the same as +** sqlite3_prepare_v3() with a zero prepFlags parameter. +**

      +*/ +SQLITE_API int sqlite3_prepare( + sqlite3 *db, /* Database handle */ + const char *zSql, /* SQL statement, UTF-8 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const char **pzTail /* OUT: Pointer to unused portion of zSql */ +); +SQLITE_API int sqlite3_prepare_v2( + sqlite3 *db, /* Database handle */ + const char *zSql, /* SQL statement, UTF-8 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const char **pzTail /* OUT: Pointer to unused portion of zSql */ +); +SQLITE_API int sqlite3_prepare_v3( + sqlite3 *db, /* Database handle */ + const char *zSql, /* SQL statement, UTF-8 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + unsigned int prepFlags, /* Zero or more SQLITE_PREPARE_ flags */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const char **pzTail /* OUT: Pointer to unused portion of zSql */ +); +SQLITE_API int sqlite3_prepare16( + sqlite3 *db, /* Database handle */ + const void *zSql, /* SQL statement, UTF-16 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const void **pzTail /* OUT: Pointer to unused portion of zSql */ +); +SQLITE_API int sqlite3_prepare16_v2( + sqlite3 *db, /* Database handle */ + const void *zSql, /* SQL statement, UTF-16 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const void **pzTail /* OUT: Pointer to unused portion of zSql */ +); +SQLITE_API int sqlite3_prepare16_v3( + sqlite3 *db, /* Database handle */ + const void *zSql, /* SQL statement, UTF-16 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + unsigned int prepFlags, /* Zero or more SQLITE_PREPARE_ flags */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const void **pzTail /* OUT: Pointer to unused portion of zSql */ +); + +/* +** CAPI3REF: Retrieving Statement SQL +** METHOD: sqlite3_stmt +** +** ^The sqlite3_sql(P) interface returns a pointer to a copy of the UTF-8 +** SQL text used to create [prepared statement] P if P was +** created by [sqlite3_prepare_v2()], [sqlite3_prepare_v3()], +** [sqlite3_prepare16_v2()], or [sqlite3_prepare16_v3()]. +** ^The sqlite3_expanded_sql(P) interface returns a pointer to a UTF-8 +** string containing the SQL text of prepared statement P with +** [bound parameters] expanded. +** +** ^(For example, if a prepared statement is created using the SQL +** text "SELECT $abc,:xyz" and if parameter $abc is bound to integer 2345 +** and parameter :xyz is unbound, then sqlite3_sql() will return +** the original string, "SELECT $abc,:xyz" but sqlite3_expanded_sql() +** will return "SELECT 2345,NULL".)^ +** +** ^The sqlite3_expanded_sql() interface returns NULL if insufficient memory +** is available to hold the result, or if the result would exceed the +** the maximum string length determined by the [SQLITE_LIMIT_LENGTH]. +** +** ^The [SQLITE_TRACE_SIZE_LIMIT] compile-time option limits the size of +** bound parameter expansions. ^The [SQLITE_OMIT_TRACE] compile-time +** option causes sqlite3_expanded_sql() to always return NULL. +** +** ^The string returned by sqlite3_sql(P) is managed by SQLite and is +** automatically freed when the prepared statement is finalized. +** ^The string returned by sqlite3_expanded_sql(P), on the other hand, +** is obtained from [sqlite3_malloc()] and must be free by the application +** by passing it to [sqlite3_free()]. +*/ +SQLITE_API const char *sqlite3_sql(sqlite3_stmt *pStmt); +SQLITE_API char *sqlite3_expanded_sql(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Determine If An SQL Statement Writes The Database +** METHOD: sqlite3_stmt +** +** ^The sqlite3_stmt_readonly(X) interface returns true (non-zero) if +** and only if the [prepared statement] X makes no direct changes to +** the content of the database file. +** +** Note that [application-defined SQL functions] or +** [virtual tables] might change the database indirectly as a side effect. +** ^(For example, if an application defines a function "eval()" that +** calls [sqlite3_exec()], then the following SQL statement would +** change the database file through side-effects: +** +**
      +**    SELECT eval('DELETE FROM t1') FROM t2;
      +** 
      +** +** But because the [SELECT] statement does not change the database file +** directly, sqlite3_stmt_readonly() would still return true.)^ +** +** ^Transaction control statements such as [BEGIN], [COMMIT], [ROLLBACK], +** [SAVEPOINT], and [RELEASE] cause sqlite3_stmt_readonly() to return true, +** since the statements themselves do not actually modify the database but +** rather they control the timing of when other statements modify the +** database. ^The [ATTACH] and [DETACH] statements also cause +** sqlite3_stmt_readonly() to return true since, while those statements +** change the configuration of a database connection, they do not make +** changes to the content of the database files on disk. +** ^The sqlite3_stmt_readonly() interface returns true for [BEGIN] since +** [BEGIN] merely sets internal flags, but the [BEGIN|BEGIN IMMEDIATE] and +** [BEGIN|BEGIN EXCLUSIVE] commands do touch the database and so +** sqlite3_stmt_readonly() returns false for those commands. +*/ +SQLITE_API int sqlite3_stmt_readonly(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Determine If A Prepared Statement Has Been Reset +** METHOD: sqlite3_stmt +** +** ^The sqlite3_stmt_busy(S) interface returns true (non-zero) if the +** [prepared statement] S has been stepped at least once using +** [sqlite3_step(S)] but has neither run to completion (returned +** [SQLITE_DONE] from [sqlite3_step(S)]) nor +** been reset using [sqlite3_reset(S)]. ^The sqlite3_stmt_busy(S) +** interface returns false if S is a NULL pointer. If S is not a +** NULL pointer and is not a pointer to a valid [prepared statement] +** object, then the behavior is undefined and probably undesirable. +** +** This interface can be used in combination [sqlite3_next_stmt()] +** to locate all prepared statements associated with a database +** connection that are in need of being reset. This can be used, +** for example, in diagnostic routines to search for prepared +** statements that are holding a transaction open. +*/ +SQLITE_API int sqlite3_stmt_busy(sqlite3_stmt*); + +/* +** 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 +** can be integers, floating point values, strings, BLOBs, or NULL. +** +** An sqlite3_value object may be either "protected" or "unprotected". +** Some interfaces require a protected sqlite3_value. Other interfaces +** will accept either a protected or an unprotected sqlite3_value. +** Every interface that accepts sqlite3_value arguments specifies +** whether or not it requires a protected sqlite3_value. The +** [sqlite3_value_dup()] interface can be used to construct a new +** protected sqlite3_value from an unprotected sqlite3_value. +** +** The terms "protected" and "unprotected" refer to whether or not +** a mutex is held. An internal mutex is held for a protected +** sqlite3_value object but no mutex is held for an unprotected +** sqlite3_value object. If SQLite is compiled to be single-threaded +** (with [SQLITE_THREADSAFE=0] and with [sqlite3_threadsafe()] returning 0) +** or if SQLite is run in one of reduced mutex modes +** [SQLITE_CONFIG_SINGLETHREAD] or [SQLITE_CONFIG_MULTITHREAD] +** then there is no distinction between protected and unprotected +** sqlite3_value objects and they can be used interchangeably. However, +** for maximum code portability it is recommended that applications +** still make the distinction between protected and unprotected +** sqlite3_value objects even when not strictly required. +** +** ^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 +** [sqlite3_column_value()] is unprotected. +** Unprotected sqlite3_value objects may only be used as arguments +** to [sqlite3_result_value()], [sqlite3_bind_value()], and +** [sqlite3_value_dup()]. +** The [sqlite3_value_blob | sqlite3_value_type()] family of +** interfaces require protected sqlite3_value objects. +*/ +typedef struct sqlite3_value sqlite3_value; + +/* +** 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 +** 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()], +** [sqlite3_aggregate_context()], [sqlite3_user_data()], +** [sqlite3_context_db_handle()], [sqlite3_get_auxdata()], +** and/or [sqlite3_set_auxdata()]. +*/ +typedef struct sqlite3_context sqlite3_context; + +/* +** CAPI3REF: Binding Values To Prepared Statements +** KEYWORDS: {host parameter} {host parameters} {host parameter name} +** KEYWORDS: {SQL parameter} {SQL parameters} {parameter binding} +** METHOD: sqlite3_stmt +** +** ^(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: +** +**
        +**
      • ? +**
      • ?NNN +**
      • :VVV +**
      • @VVV +**
      • $VVV +**
      +** +** In the templates above, NNN represents an integer literal, +** and VVV represents an alphanumeric identifier.)^ ^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 +** 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 +** 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 +** for "?NNN" parameters is the value of NNN. +** ^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. +** ^If the third parameter to sqlite3_bind_text() or sqlite3_bind_text16() +** or sqlite3_bind_blob() is a NULL pointer then the fourth parameter +** is ignored and the end result is the same as sqlite3_bind_null(). +** +** ^(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 to sqlite3_bind_text() or sqlite3_bind_text16() +** is negative, then the length of the string is +** the number of bytes up to the first zero terminator. +** If the fourth parameter to sqlite3_bind_blob() is negative, then +** the behavior is undefined. +** If a non-negative fourth parameter is provided to sqlite3_bind_text() +** or sqlite3_bind_text16() or sqlite3_bind_text64() then +** that parameter must be the byte offset +** where the NUL terminator would occur assuming the string were NUL +** terminated. If any NUL characters occur at byte offsets less than +** the value of the fourth parameter then the resulting string value will +** contain embedded NULs. The result of expressions involving strings +** with embedded NULs is undefined. +** +** ^The fifth argument to the BLOB and string binding interfaces +** is a destructor used to dispose of the BLOB or +** string after SQLite has finished with it. ^The destructor is called +** to dispose of the BLOB or string even if the call to bind API fails. +** ^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 +** SQLite makes its own private copy of the data immediately, before +** the sqlite3_bind_*() routine returns. +** +** ^The sixth argument to sqlite3_bind_text64() must be one of +** [SQLITE_UTF8], [SQLITE_UTF16], [SQLITE_UTF16BE], or [SQLITE_UTF16LE] +** to specify the encoding of the text in the third parameter. If +** the sixth argument to sqlite3_bind_text64() is not one of the +** allowed values shown above, or if the text encoding is different +** from the encoding specified by the sixth parameter, then the behavior +** is undefined. +** +** ^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_pointer(S,I,P,T,D) routine causes the I-th parameter in +** [prepared statement] S to have an SQL value of NULL, but to also be +** associated with the pointer P of type T. ^D is either a NULL pointer or +** a pointer to a destructor function for P. ^SQLite will invoke the +** destructor D with a single argument of P when it is finished using +** P. The T parameter should be a static string, preferably a string +** literal. The sqlite3_bind_pointer() routine is part of the +** [pointer passing interface] added for SQLite 3.20.0. +** +** ^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. +** +** ^The sqlite3_bind_* routines return [SQLITE_OK] on success or an +** [error code] if anything goes wrong. +** ^[SQLITE_TOOBIG] might be returned if the size of a string or BLOB +** exceeds limits imposed by [sqlite3_limit]([SQLITE_LIMIT_LENGTH]) or +** [SQLITE_MAX_LENGTH]. +** ^[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_blob64(sqlite3_stmt*, int, const void*, sqlite3_uint64, + void(*)(void*)); +SQLITE_API int sqlite3_bind_double(sqlite3_stmt*, int, double); +SQLITE_API int sqlite3_bind_int(sqlite3_stmt*, int, int); +SQLITE_API int sqlite3_bind_int64(sqlite3_stmt*, int, sqlite3_int64); +SQLITE_API int sqlite3_bind_null(sqlite3_stmt*, int); +SQLITE_API int sqlite3_bind_text(sqlite3_stmt*,int,const char*,int,void(*)(void*)); +SQLITE_API int sqlite3_bind_text16(sqlite3_stmt*, int, const void*, int, void(*)(void*)); +SQLITE_API int sqlite3_bind_text64(sqlite3_stmt*, int, const char*, sqlite3_uint64, + void(*)(void*), unsigned char encoding); +SQLITE_API int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*); +SQLITE_API int sqlite3_bind_pointer(sqlite3_stmt*, int, void*, const char*,void(*)(void*)); +SQLITE_API int sqlite3_bind_zeroblob(sqlite3_stmt*, int, int n); +SQLITE_API int sqlite3_bind_zeroblob64(sqlite3_stmt*, int, sqlite3_uint64); + +/* +** CAPI3REF: Number Of SQL Parameters +** METHOD: sqlite3_stmt +** +** ^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) +** parameter. For all forms except ?NNN, this will correspond to the +** 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()]. +*/ +SQLITE_API int sqlite3_bind_parameter_count(sqlite3_stmt*); + +/* +** CAPI3REF: Name Of A Host Parameter +** METHOD: sqlite3_stmt +** +** ^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 referred to as "nameless" or "anonymous parameters". +** +** ^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 +** always in UTF-8 encoding even if the named parameter was +** originally specified as UTF-16 in [sqlite3_prepare16()], +** [sqlite3_prepare16_v2()], or [sqlite3_prepare16_v3()]. +** +** See also: [sqlite3_bind_blob|sqlite3_bind()], +** [sqlite3_bind_parameter_count()], and +** [sqlite3_bind_parameter_index()]. +*/ +SQLITE_API const char *sqlite3_bind_parameter_name(sqlite3_stmt*, int); + +/* +** CAPI3REF: Index Of A Parameter With A Given Name +** METHOD: sqlite3_stmt +** +** ^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 +** name must be given in UTF-8 even if the original statement +** was prepared from UTF-16 text using [sqlite3_prepare16_v2()] or +** [sqlite3_prepare16_v3()]. +** +** See also: [sqlite3_bind_blob|sqlite3_bind()], +** [sqlite3_bind_parameter_count()], and +** [sqlite3_bind_parameter_name()]. +*/ +SQLITE_API int sqlite3_bind_parameter_index(sqlite3_stmt*, const char *zName); + +/* +** CAPI3REF: Reset All Bindings On A Prepared Statement +** METHOD: sqlite3_stmt +** +** ^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. +*/ +SQLITE_API int sqlite3_clear_bindings(sqlite3_stmt*); + +/* +** CAPI3REF: Number Of Columns In A Result Set +** METHOD: sqlite3_stmt +** +** ^Return the number of columns in the result set returned by the +** [prepared statement]. ^If this routine returns 0, that means the +** [prepared statement] returns no data (for example an [UPDATE]). +** ^However, just because this routine returns a positive number does not +** mean that one or more rows of data will be returned. ^A SELECT statement +** will always have a positive sqlite3_column_count() but depending on the +** WHERE clause constraints and the table content, it might return no rows. +** +** See also: [sqlite3_data_count()] +*/ +SQLITE_API int sqlite3_column_count(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Column Names In A Result Set +** METHOD: sqlite3_stmt +** +** ^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. +** +** ^The returned string pointer is valid until either the [prepared statement] +** is destroyed by [sqlite3_finalize()] or until the statement is automatically +** reprepared by the first call to [sqlite3_step()] for a particular run +** 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 +** (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 +** 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. +*/ +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 +** METHOD: sqlite3_stmt +** +** ^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 +** using [sqlite3_finalize()] or until the statement is automatically +** reprepared by the first call to [sqlite3_step()] for a particular run +** or until the same information is requested +** again in a different encoding. +** +** ^The names returned are the original un-aliased names of the +** database, table, and column. +** +** ^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 +** 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, +** or column that query result column was extracted from. +** +** ^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. +** +** 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. +** +** If two or more threads call one or more +** [sqlite3_column_database_name | column metadata interfaces] +** for the same [prepared statement] and result column +** at the same time then the results are undefined. +*/ +SQLITE_API const char *sqlite3_column_database_name(sqlite3_stmt*,int); +SQLITE_API const void *sqlite3_column_database_name16(sqlite3_stmt*,int); +SQLITE_API const char *sqlite3_column_table_name(sqlite3_stmt*,int); +SQLITE_API const void *sqlite3_column_table_name16(sqlite3_stmt*,int); +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 +** METHOD: sqlite3_stmt +** +** ^(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 +** expression or subquery, then a NULL pointer is returned. +** ^The returned string is always UTF-8 encoded. +** +** ^(For example, given the database schema: +** +** CREATE TABLE t1(c1 VARIANT); +** +** and the following statement to be compiled: +** +** 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).)^ +** +** ^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 +** is associated with individual values, not with the containers +** used to hold those values. +*/ +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 +** METHOD: sqlite3_stmt +** +** After a [prepared statement] has been prepared using any of +** [sqlite3_prepare_v2()], [sqlite3_prepare_v3()], [sqlite3_prepare16_v2()], +** or [sqlite3_prepare16_v3()] or one of the legacy +** interfaces [sqlite3_prepare()] or [sqlite3_prepare16()], this function +** must be called one or more times to evaluate the statement. +** +** The details of the behavior of the sqlite3_step() interface depend +** on whether the statement was prepared using the newer "vX" interfaces +** [sqlite3_prepare_v3()], [sqlite3_prepare_v2()], [sqlite3_prepare16_v3()], +** [sqlite3_prepare16_v2()] or the older legacy +** interfaces [sqlite3_prepare()] and [sqlite3_prepare16()]. The use of the +** new "vX" 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], +** [SQLITE_DONE], [SQLITE_ROW], [SQLITE_ERROR], or [SQLITE_MISUSE]. +** ^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] +** or occurs outside of an explicit transaction, then you can retry the +** statement. If the statement is not a [COMMIT] and occurs within an +** explicit transaction then you should rollback the transaction before +** continuing. +** +** ^[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] +** 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 +** 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, +** [SQLITE_INTERRUPT], [SQLITE_SCHEMA], [SQLITE_CORRUPT], and so forth) +** can be obtained by calling [sqlite3_reset()] on the +** [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. +** Perhaps it was called on a [prepared statement] that has +** already been [sqlite3_finalize | finalized] or on one that had +** previously returned [SQLITE_ERROR] or [SQLITE_DONE]. Or it could +** be the case that the same database connection is being used by two or +** more threads at the same moment in time. +** +** For all versions of SQLite up to and including 3.6.23.1, a call to +** [sqlite3_reset()] was required after sqlite3_step() returned anything +** other than [SQLITE_ROW] before any subsequent invocation of +** sqlite3_step(). Failure to reset the prepared statement using +** [sqlite3_reset()] would result in an [SQLITE_MISUSE] return from +** sqlite3_step(). But after [version 3.6.23.1] ([dateof:3.6.23.1], +** sqlite3_step() began +** calling [sqlite3_reset()] automatically in this circumstance rather +** than returning [SQLITE_MISUSE]. This is not considered a compatibility +** break because any application that ever receives an SQLITE_MISUSE error +** is broken by definition. The [SQLITE_OMIT_AUTORESET] compile-time option +** can be used to restore the legacy behavior. +** +** Goofy Interface Alert: In the legacy interface, the sqlite3_step() +** API always returns a generic error code, [SQLITE_ERROR], following any +** error other than [SQLITE_BUSY] and [SQLITE_MISUSE]. You must call +** [sqlite3_reset()] or [sqlite3_finalize()] in order to find one of the +** specific [error codes] that better describes the error. +** We admit that this is a goofy design. The problem has been fixed +** with the "v2" interface. If you prepare all of your SQL statements +** using [sqlite3_prepare_v3()] or [sqlite3_prepare_v2()] +** or [sqlite3_prepare16_v2()] or [sqlite3_prepare16_v3()] instead +** 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 "vX" interfaces is recommended. +*/ +SQLITE_API int sqlite3_step(sqlite3_stmt*); + +/* +** CAPI3REF: Number of columns in a result set +** METHOD: sqlite3_stmt +** +** ^The sqlite3_data_count(P) interface returns the number of columns in the +** current row of the result set of [prepared statement] P. +** ^If prepared statement P does not have results ready to return +** (via calls to the [sqlite3_column_int | sqlite3_column_*()] of +** interfaces) then sqlite3_data_count(P) returns 0. +** ^The sqlite3_data_count(P) routine also returns 0 if P is a NULL pointer. +** ^The sqlite3_data_count(P) routine returns 0 if the previous call to +** [sqlite3_step](P) returned [SQLITE_DONE]. ^The sqlite3_data_count(P) +** will return non-zero if previous call to [sqlite3_step](P) returned +** [SQLITE_ROW], except in the case of the [PRAGMA incremental_vacuum] +** where it always returns zero since each step of that multi-step +** pragma returns 0 columns of data. +** +** See also: [sqlite3_column_count()] +*/ +SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Fundamental Datatypes +** KEYWORDS: SQLITE_TEXT +** +** ^(Every value in SQLite has one of five fundamental datatypes: +** +**
        +**
      • 64-bit signed integer +**
      • 64-bit IEEE floating point number +**
      • string +**
      • BLOB +**
      • NULL +**
      )^ +** +** These constants are codes for each of those types. +** +** Note that the SQLITE_TEXT constant was also used in SQLite version 2 +** for a completely different meaning. Software that links against both +** SQLite version 2 and SQLite version 3 should use SQLITE3_TEXT, not +** SQLITE_TEXT. +*/ +#define SQLITE_INTEGER 1 +#define SQLITE_FLOAT 2 +#define SQLITE_BLOB 4 +#define SQLITE_NULL 5 +#ifdef SQLITE_TEXT +# undef SQLITE_TEXT +#else +# define SQLITE_TEXT 3 +#endif +#define SQLITE3_TEXT 3 + +/* +** CAPI3REF: Result Values From A Query +** KEYWORDS: {column access functions} +** METHOD: sqlite3_stmt +** +** Summary: +**
      +**
      sqlite3_column_blobBLOB result +**
      sqlite3_column_doubleREAL result +**
      sqlite3_column_int32-bit INTEGER result +**
      sqlite3_column_int6464-bit INTEGER result +**
      sqlite3_column_textUTF-8 TEXT result +**
      sqlite3_column_text16UTF-16 TEXT result +**
      sqlite3_column_valueThe result as an +** [sqlite3_value|unprotected sqlite3_value] object. +**
          +**
      sqlite3_column_bytesSize of a BLOB +** or a UTF-8 TEXT result in bytes +**
      sqlite3_column_bytes16   +** →  Size of UTF-16 +** TEXT in bytes +**
      sqlite3_column_typeDefault +** datatype of the result +**
      +** +** Details: +** +** ^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. +** ^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. +** These routines may only be called when the most recent call to +** [sqlite3_step()] has returned [SQLITE_ROW] and neither +** [sqlite3_reset()] nor [sqlite3_finalize()] have been called subsequently. +** If any of these routines are called after [sqlite3_reset()] or +** [sqlite3_finalize()] or after [sqlite3_step()] has returned +** something other than [SQLITE_ROW], the results are undefined. +** If [sqlite3_step()] or [sqlite3_reset()] or [sqlite3_finalize()] +** are called from a different thread while any of these routines +** are pending, then the results are undefined. +** +** The first six interfaces (_blob, _double, _int, _int64, _text, and _text16) +** each return the value of a result column in a specific data format. If +** the result column is not initially in the requested format (for example, +** if the query returns an integer but the sqlite3_column_text() interface +** is used to extract the value) then an automatic type conversion is performed. +** +** ^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], +** [SQLITE_FLOAT], [SQLITE_TEXT], [SQLITE_BLOB], or [SQLITE_NULL]. +** The return value of sqlite3_column_type() can be used to decide which +** of the first six interface should be used to extract the column value. +** The value returned by sqlite3_column_type() is only meaningful if no +** automatic type conversions have occurred for the value in question. +** After a type conversion, the result of calling sqlite3_column_type() +** is undefined, though harmless. Future +** versions of SQLite may change the behavior of sqlite3_column_type() +** following a type conversion. +** +** If the result is a BLOB or a TEXT string, then the sqlite3_column_bytes() +** or sqlite3_column_bytes16() interfaces can be used to determine the size +** of that BLOB or string. +** +** ^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 +** the string to UTF-8 and then returns the number of bytes. +** ^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. +** ^If the result is NULL, then sqlite3_column_bytes() returns zero. +** +** ^If the result is a BLOB or UTF-16 string then the sqlite3_column_bytes16() +** routine returns the number of bytes in that BLOB or string. +** ^If the result is a UTF-8 string, then sqlite3_column_bytes16() converts +** the string to UTF-16 and then returns the number of bytes. +** ^If the result is a numeric value then sqlite3_column_bytes16() uses +** [sqlite3_snprintf()] to convert that value to a UTF-16 string and returns +** the number of bytes in that string. +** ^If the result is NULL, then sqlite3_column_bytes16() returns zero. +** +** ^The values returned by [sqlite3_column_bytes()] and +** [sqlite3_column_bytes16()] do not include the zero terminators at the end +** of the string. ^For clarity: the values returned by +** [sqlite3_column_bytes()] and [sqlite3_column_bytes16()] are 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 +** value from sqlite3_column_blob() for a zero-length BLOB is a NULL pointer. +** +** Warning: ^The object returned by [sqlite3_column_value()] is an +** [unprotected sqlite3_value] object. In a multithreaded environment, +** an unprotected sqlite3_value object may only be used safely with +** [sqlite3_bind_value()] and [sqlite3_result_value()]. +** If the [unprotected sqlite3_value] object returned by +** [sqlite3_column_value()] is used in any other way, including calls +** to routines like [sqlite3_value_int()], [sqlite3_value_text()], +** or [sqlite3_value_bytes()], the behavior is not threadsafe. +** Hence, the sqlite3_column_value() interface +** is normally only useful within the implementation of +** [application-defined SQL functions] or [virtual tables], not within +** top-level application code. +** +** The these routines may attempt to convert the datatype of the result. +** ^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 +** that are applied: +** +**
      +** +**
      Internal
      Type
      Requested
      Type
      Conversion +** +**
      NULL INTEGER Result is 0 +**
      NULL FLOAT Result is 0.0 +**
      NULL TEXT Result is a NULL pointer +**
      NULL BLOB Result is a NULL pointer +**
      INTEGER FLOAT Convert from integer to float +**
      INTEGER TEXT ASCII rendering of the integer +**
      INTEGER BLOB Same as INTEGER->TEXT +**
      FLOAT INTEGER [CAST] to INTEGER +**
      FLOAT TEXT ASCII rendering of the float +**
      FLOAT BLOB [CAST] to BLOB +**
      TEXT INTEGER [CAST] to INTEGER +**
      TEXT FLOAT [CAST] to REAL +**
      TEXT BLOB No change +**
      BLOB INTEGER [CAST] to INTEGER +**
      BLOB FLOAT [CAST] to REAL +**
      BLOB TEXT Add a zero terminator if needed +**
      +**
      )^ +** +** 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 +** in the following cases: +** +**
        +**
      • The initial content is a BLOB and sqlite3_column_text() or +** sqlite3_column_text16() is called. A zero-terminator might +** need to be added to the string.
      • +**
      • The initial content is UTF-8 text and sqlite3_column_bytes16() or +** sqlite3_column_text16() is called. The content must be converted +** to UTF-16.
      • +**
      • 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 +** not invalidate a prior pointer, though of course the content of the buffer +** that the prior pointer references 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 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 +** into the desired format, then invoke sqlite3_column_bytes() or +** sqlite3_column_bytes16() to find the size of the result. Do not mix calls +** to sqlite3_column_text() or sqlite3_column_blob() with calls to +** 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 +** described above, or until [sqlite3_step()] or [sqlite3_reset()] or +** [sqlite3_finalize()] is called. ^The memory space used to hold strings +** and BLOBs is freed automatically. Do not pass the pointers returned +** from [sqlite3_column_blob()], [sqlite3_column_text()], etc. into +** [sqlite3_free()]. +** +** ^(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].)^ +*/ +SQLITE_API const void *sqlite3_column_blob(sqlite3_stmt*, int iCol); +SQLITE_API double sqlite3_column_double(sqlite3_stmt*, int iCol); +SQLITE_API int sqlite3_column_int(sqlite3_stmt*, int iCol); +SQLITE_API sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol); +SQLITE_API const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol); +SQLITE_API const void *sqlite3_column_text16(sqlite3_stmt*, int iCol); +SQLITE_API sqlite3_value *sqlite3_column_value(sqlite3_stmt*, int iCol); +SQLITE_API int sqlite3_column_bytes(sqlite3_stmt*, int iCol); +SQLITE_API int sqlite3_column_bytes16(sqlite3_stmt*, int iCol); +SQLITE_API int sqlite3_column_type(sqlite3_stmt*, int iCol); + +/* +** CAPI3REF: Destroy A Prepared Statement Object +** DESTRUCTOR: sqlite3_stmt +** +** ^The sqlite3_finalize() function is called to delete a [prepared statement]. +** ^If the most recent evaluation of the statement encountered no errors +** or if the statement is never been evaluated, then sqlite3_finalize() returns +** SQLITE_OK. ^If the most recent evaluation of statement S failed, then +** sqlite3_finalize(S) returns the appropriate [error code] or +** [extended error code]. +** +** ^The sqlite3_finalize(S) routine can be called at any point during +** the life cycle of [prepared statement] S: +** before statement S is ever evaluated, after +** one or more calls to [sqlite3_reset()], or after any call +** to [sqlite3_step()] regardless of whether or not the statement has +** completed execution. +** +** ^Invoking sqlite3_finalize() on a NULL pointer is a harmless no-op. +** +** The application must finalize every [prepared statement] in order to avoid +** resource leaks. It is a grievous error for the application to try to use +** a prepared statement after it has been finalized. Any use of a prepared +** statement after it has been finalized can result in undefined and +** undesirable behavior such as segfaults and heap corruption. +*/ +SQLITE_API int sqlite3_finalize(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Reset A Prepared Statement Object +** METHOD: sqlite3_stmt +** +** 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 +** the [sqlite3_bind_blob | sqlite3_bind_*() API] retain their values. +** Use [sqlite3_clear_bindings()] to reset the bindings. +** +** ^The [sqlite3_reset(S)] interface resets the [prepared statement] S +** back to the beginning of its program. +** +** ^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 indicated an error, then +** [sqlite3_reset(S)] returns an appropriate [error code]. +** +** ^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 +** KEYWORDS: {function creation routines} +** KEYWORDS: {application-defined SQL function} +** KEYWORDS: {application-defined SQL functions} +** METHOD: sqlite3 +** +** ^These 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 differences between +** these routines are the text encoding expected for +** the second parameter (the name of the function being created) +** and the presence or absence of a destructor callback for +** the application data pointer. +** +** ^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 in a UTF-8 +** representation, exclusive of the zero-terminator. ^Note that the name +** length limit is in UTF-8 bytes, not characters nor UTF-16 bytes. +** ^Any attempt to create a function with a longer name +** will result in [SQLITE_MISUSE] being returned. +** +** ^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 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 +** undefined. +** +** ^The fourth parameter, eTextRep, specifies what +** [SQLITE_UTF8 | text encoding] this SQL function prefers for +** its parameters. The application should set this parameter to +** [SQLITE_UTF16LE] if the function implementation invokes +** [sqlite3_value_text16le()] on an input, or [SQLITE_UTF16BE] if the +** implementation invokes [sqlite3_value_text16be()] on an input, or +** [SQLITE_UTF16] if [sqlite3_value_text16()] is used, or [SQLITE_UTF8] +** otherwise. ^The same SQL function may be registered multiple times using +** different preferred text encodings, with different implementations for +** each encoding. +** ^When multiple implementations of the same function are available, SQLite +** will pick the one that involves the least amount of data conversion. +** +** ^The fourth parameter may optionally be ORed with [SQLITE_DETERMINISTIC] +** to signal that the function will always return the same result given +** the same inputs within a single SQL statement. Most SQL functions are +** deterministic. The built-in [random()] SQL function is an example of a +** function that is not deterministic. The SQLite query planner is able to +** perform additional optimizations on deterministic functions, so use +** of the [SQLITE_DETERMINISTIC] flag is recommended where possible. +** +** ^(The fifth parameter is an arbitrary pointer. The implementation of the +** function can gain access to this pointer using [sqlite3_user_data()].)^ +** +** ^The sixth, seventh and eighth 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 must be passed as the xStep and xFinal +** parameters. ^An aggregate SQL function requires an implementation of xStep +** and xFinal and NULL pointer must be passed for xFunc. ^To delete an existing +** SQL function or aggregate, pass NULL pointers for all three function +** callbacks. +** +** ^(If the ninth parameter to sqlite3_create_function_v2() is not NULL, +** then it is destructor for the application data pointer. +** The destructor is invoked when the function is deleted, either by being +** overloaded or when the database connection closes.)^ +** ^The destructor is also invoked if the call to +** sqlite3_create_function_v2() fails. +** ^When the destructor callback of the tenth parameter is invoked, it +** is passed a single argument which is a copy of the application data +** pointer which was the fifth parameter to sqlite3_create_function_v2(). +** +** ^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 +** the implementation that most closely matches the way in which the +** 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 +** 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 +** 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. +** +** ^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. +*/ +SQLITE_API int sqlite3_create_function( + sqlite3 *db, + const char *zFunctionName, + int nArg, + int eTextRep, + void *pApp, + void (*xFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*) +); +SQLITE_API int sqlite3_create_function16( + sqlite3 *db, + const void *zFunctionName, + int nArg, + int eTextRep, + void *pApp, + void (*xFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*) +); +SQLITE_API int sqlite3_create_function_v2( + sqlite3 *db, + const char *zFunctionName, + int nArg, + int eTextRep, + void *pApp, + void (*xFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*), + void(*xDestroy)(void*) +); + +/* +** CAPI3REF: Text Encodings +** +** These constant define integer codes that represent the various +** text encodings supported by SQLite. +*/ +#define SQLITE_UTF8 1 /* IMP: R-37514-35566 */ +#define SQLITE_UTF16LE 2 /* IMP: R-03371-37637 */ +#define SQLITE_UTF16BE 3 /* IMP: R-51971-34154 */ +#define SQLITE_UTF16 4 /* Use native byte order */ +#define SQLITE_ANY 5 /* Deprecated */ +#define SQLITE_UTF16_ALIGNED 8 /* sqlite3_create_collation only */ + +/* +** CAPI3REF: Function Flags +** +** These constants may be ORed together with the +** [SQLITE_UTF8 | preferred text encoding] as the fourth argument +** to [sqlite3_create_function()], [sqlite3_create_function16()], or +** [sqlite3_create_function_v2()]. +*/ +#define SQLITE_DETERMINISTIC 0x800 + +/* +** CAPI3REF: Deprecated Functions +** DEPRECATED +** +** These functions are [deprecated]. In order to maintain +** backwards compatibility with older code, these functions continue +** to be supported. However, new applications should avoid +** the use of these functions. To encourage programmers to avoid +** these functions, we will not explain what they do. +*/ +#ifndef SQLITE_OMIT_DEPRECATED +SQLITE_API SQLITE_DEPRECATED int sqlite3_aggregate_count(sqlite3_context*); +SQLITE_API SQLITE_DEPRECATED int sqlite3_expired(sqlite3_stmt*); +SQLITE_API SQLITE_DEPRECATED int sqlite3_transfer_bindings(sqlite3_stmt*, sqlite3_stmt*); +SQLITE_API SQLITE_DEPRECATED int sqlite3_global_recover(void); +SQLITE_API SQLITE_DEPRECATED void sqlite3_thread_cleanup(void); +SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void(*)(void*,sqlite3_int64,int), + void*,sqlite3_int64); +#endif + +/* +** CAPI3REF: Obtaining SQL Values +** METHOD: sqlite3_value +** +** Summary: +**
      +**
      sqlite3_value_blobBLOB value +**
      sqlite3_value_doubleREAL value +**
      sqlite3_value_int32-bit INTEGER value +**
      sqlite3_value_int6464-bit INTEGER value +**
      sqlite3_value_pointerPointer value +**
      sqlite3_value_textUTF-8 TEXT value +**
      sqlite3_value_text16UTF-16 TEXT value in +** the native byteorder +**
      sqlite3_value_text16beUTF-16be TEXT value +**
      sqlite3_value_text16leUTF-16le TEXT value +**
          +**
      sqlite3_value_bytesSize of a BLOB +** or a UTF-8 TEXT in bytes +**
      sqlite3_value_bytes16   +** →  Size of UTF-16 +** TEXT in bytes +**
      sqlite3_value_typeDefault +** datatype of the value +**
      sqlite3_value_numeric_type   +** →  Best numeric datatype of the value +**
      sqlite3_value_nochange   +** →  True if the column is unchanged in an UPDATE +** against a virtual table. +**
      +** +** Details: +** +** These routines extract type, size, and content information from +** [protected sqlite3_value] objects. Protected sqlite3_value objects +** are used to pass parameter information into implementation of +** [application-defined SQL functions] and [virtual tables]. +** +** These routines work only with [protected sqlite3_value] objects. +** Any attempt to use these routines on an [unprotected sqlite3_value] +** is not threadsafe. +** +** ^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 +** sqlite3_value_text16be() and sqlite3_value_text16le() interfaces +** extract UTF-16 strings as big-endian and little-endian respectively. +** +** ^If [sqlite3_value] object V was initialized +** using [sqlite3_bind_pointer(S,I,P,X,D)] or [sqlite3_result_pointer(C,P,X,D)] +** and if X and Y are strings that compare equal according to strcmp(X,Y), +** then sqlite3_value_pointer(V,Y) will return the pointer P. ^Otherwise, +** sqlite3_value_pointer(V,Y) returns a NULL. The sqlite3_bind_pointer() +** routine is part of the [pointer passing interface] added for SQLite 3.20.0. +** +** ^(The sqlite3_value_type(V) interface returns the +** [SQLITE_INTEGER | datatype code] for the initial datatype of the +** [sqlite3_value] object V. The returned value is one of [SQLITE_INTEGER], +** [SQLITE_FLOAT], [SQLITE_TEXT], [SQLITE_BLOB], or [SQLITE_NULL].)^ +** Other interfaces might change the datatype for an sqlite3_value object. +** For example, if the datatype is initially SQLITE_INTEGER and +** sqlite3_value_text(V) is called to extract a text value for that +** integer, then subsequent calls to sqlite3_value_type(V) might return +** SQLITE_TEXT. Whether or not a persistent internal datatype conversion +** occurs is undefined and may change from one release of SQLite to the next. +** +** ^(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.)^ +** +** ^Within the [xUpdate] method of a [virtual table], the +** sqlite3_value_nochange(X) interface returns true if and only if +** the column corresponding to X is unchanged by the UPDATE operation +** that the xUpdate method call was invoked to implement and if +** and the prior [xColumn] method call that was invoked to extracted +** the value for that column returned without setting a result (probably +** because it queried [sqlite3_vtab_nochange()] and found that the column +** was unchanging). ^Within an [xUpdate] method, any value for which +** sqlite3_value_nochange(X) is true will in all other respects appear +** to be a NULL value. If sqlite3_value_nochange(X) is invoked anywhere other +** than within an [xUpdate] method call for an UPDATE statement, then +** the return value is arbitrary and meaningless. +** +** Please pay particular attention to the fact that the pointer returned +** from [sqlite3_value_blob()], [sqlite3_value_text()], or +** [sqlite3_value_text16()] can be invalidated by a subsequent call to +** [sqlite3_value_bytes()], [sqlite3_value_bytes16()], [sqlite3_value_text()], +** or [sqlite3_value_text16()]. +** +** These routines must be called from the same thread as +** the SQL function that supplied the [sqlite3_value*] parameters. +*/ +SQLITE_API const void *sqlite3_value_blob(sqlite3_value*); +SQLITE_API double sqlite3_value_double(sqlite3_value*); +SQLITE_API int sqlite3_value_int(sqlite3_value*); +SQLITE_API sqlite3_int64 sqlite3_value_int64(sqlite3_value*); +SQLITE_API void *sqlite3_value_pointer(sqlite3_value*, const char*); +SQLITE_API const unsigned char *sqlite3_value_text(sqlite3_value*); +SQLITE_API const void *sqlite3_value_text16(sqlite3_value*); +SQLITE_API const void *sqlite3_value_text16le(sqlite3_value*); +SQLITE_API const void *sqlite3_value_text16be(sqlite3_value*); +SQLITE_API int sqlite3_value_bytes(sqlite3_value*); +SQLITE_API int sqlite3_value_bytes16(sqlite3_value*); +SQLITE_API int sqlite3_value_type(sqlite3_value*); +SQLITE_API int sqlite3_value_numeric_type(sqlite3_value*); +SQLITE_API int sqlite3_value_nochange(sqlite3_value*); + +/* +** CAPI3REF: Finding The Subtype Of SQL Values +** METHOD: sqlite3_value +** +** The sqlite3_value_subtype(V) function returns the subtype for +** an [application-defined SQL function] argument V. The subtype +** information can be used to pass a limited amount of context from +** one SQL function to another. Use the [sqlite3_result_subtype()] +** routine to set the subtype for the return value of an SQL function. +*/ +SQLITE_API unsigned int sqlite3_value_subtype(sqlite3_value*); + +/* +** CAPI3REF: Copy And Free SQL Values +** METHOD: sqlite3_value +** +** ^The sqlite3_value_dup(V) interface makes a copy of the [sqlite3_value] +** object D and returns a pointer to that copy. ^The [sqlite3_value] returned +** is a [protected sqlite3_value] object even if the input is not. +** ^The sqlite3_value_dup(V) interface returns NULL if V is NULL or if a +** memory allocation fails. +** +** ^The sqlite3_value_free(V) interface frees an [sqlite3_value] object +** previously obtained from [sqlite3_value_dup()]. ^If V is a NULL pointer +** then sqlite3_value_free(V) is a harmless no-op. +*/ +SQLITE_API sqlite3_value *sqlite3_value_dup(const sqlite3_value*); +SQLITE_API void sqlite3_value_free(sqlite3_value*); + +/* +** CAPI3REF: Obtain Aggregate Function Context +** METHOD: sqlite3_context +** +** Implementations 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 sqlite3_aggregate_context(C,N) routine returns a NULL pointer +** when first called if N is less than or equal to zero or if a memory +** allocate error occurs. +** +** ^(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.)^ Within the xFinal callback, it is customary to set +** N=0 in calls to sqlite3_aggregate_context(C,N) so that no +** pointless memory allocations occur. +** +** ^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 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. +*/ +SQLITE_API void *sqlite3_aggregate_context(sqlite3_context*, int nBytes); + +/* +** CAPI3REF: User Data For Functions +** METHOD: sqlite3_context +** +** ^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. +** +** This routine must be called from the same thread in which +** the application-defined function is running. +*/ +SQLITE_API void *sqlite3_user_data(sqlite3_context*); + +/* +** CAPI3REF: Database Connection For Functions +** METHOD: sqlite3_context +** +** ^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. +*/ +SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context*); + +/* +** CAPI3REF: Function Auxiliary Data +** METHOD: sqlite3_context +** +** These functions may be used by (non-aggregate) SQL functions to +** associate metadata with argument values. If the same value is passed to +** multiple invocations of the same SQL function during query execution, under +** some circumstances the associated metadata may be preserved. An example +** of where this might be useful is in a regular-expression matching +** function. The compiled version of the regular expression can be stored as +** metadata associated with the pattern string. +** Then as long as the pattern string remains the same, +** the compiled regular expression can be reused on multiple +** invocations of the same function. +** +** ^The sqlite3_get_auxdata(C,N) interface returns a pointer to the metadata +** associated by the sqlite3_set_auxdata(C,N,P,X) function with the Nth argument +** value to the application-defined function. ^N is zero for the left-most +** function argument. ^If there is no metadata +** associated with the function argument, the sqlite3_get_auxdata(C,N) interface +** returns a NULL pointer. +** +** ^The sqlite3_set_auxdata(C,N,P,X) interface saves P as metadata for the N-th +** argument of the application-defined function. ^Subsequent +** calls to sqlite3_get_auxdata(C,N) return P from the most recent +** sqlite3_set_auxdata(C,N,P,X) call if the metadata is still valid or +** NULL if the metadata has been discarded. +** ^After each call to sqlite3_set_auxdata(C,N,P,X) where X is not NULL, +** SQLite will invoke the destructor function X with parameter P exactly +** once, when the metadata is discarded. +** SQLite is free to discard the metadata at any time, including:
        +**
      • ^(when the corresponding function parameter changes)^, or +**
      • ^(when [sqlite3_reset()] or [sqlite3_finalize()] is called for the +** SQL statement)^, or +**
      • ^(when sqlite3_set_auxdata() is invoked again on the same +** parameter)^, or +**
      • ^(during the original sqlite3_set_auxdata() call when a memory +** allocation error occurs.)^
      +** +** Note the last bullet in particular. The destructor X in +** sqlite3_set_auxdata(C,N,P,X) might be called immediately, before the +** sqlite3_set_auxdata() interface even returns. Hence sqlite3_set_auxdata() +** should be called near the end of the function implementation and the +** function implementation should not make any use of P after +** sqlite3_set_auxdata() has been called. +** +** ^(In practice, metadata is preserved between function calls for +** function parameters that are compile-time constants, including literal +** values and [parameters] and expressions composed from the same.)^ +** +** The value of the N parameter to these interfaces should be non-negative. +** Future enhancements may make use of negative N values to define new +** kinds of function caching behavior. +** +** These routines must be called from the same thread in which +** the SQL function is running. +*/ +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 +** +** These are special values for the destructor that is passed in as the +** 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 +** 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. +** +** The typedef is necessary to work around problems in certain +** C++ compilers. +*/ +typedef void (*sqlite3_destructor_type)(void*); +#define SQLITE_STATIC ((sqlite3_destructor_type)0) +#define SQLITE_TRANSIENT ((sqlite3_destructor_type)-1) + +/* +** CAPI3REF: Setting The Result Of An SQL Function +** METHOD: sqlite3_context +** +** These routines are used by the xFunc or xFinal callbacks that +** implement SQL functions and aggregates. See +** [sqlite3_create_function()] and [sqlite3_create_function16()] +** for additional information. +** +** These functions work very much like the [parameter binding] family of +** 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 +** 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(C,N) and sqlite3_result_zeroblob64(C,N) +** interfaces set the result of the application-defined function to be +** a BLOB containing all zero bytes and N bytes in size. +** +** ^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 +** cause the implemented SQL function to throw an exception. +** ^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 +** interprets the string from sqlite3_result_error16() as UTF-16 in native +** 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 +** 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() +** 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() +** or sqlite3_result_error16() resets the error code to SQLITE_ERROR. +** +** ^The sqlite3_result_error_toobig() interface causes SQLite to throw an +** error indicating that a string or BLOB is too long to represent. +** +** ^The sqlite3_result_error_nomem() interface causes SQLite to throw an +** error indicating that a memory allocation failed. +** +** ^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 +** 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 +** of the application-defined function to be NULL. +** +** ^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. +** ^The sqlite3_result_text64() interface sets the return value of an +** application-defined function to be a text string in an encoding +** specified by the fifth (and last) parameter, which must be one +** of [SQLITE_UTF8], [SQLITE_UTF16], [SQLITE_UTF16BE], or [SQLITE_UTF16LE]. +** ^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 +** 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 +** 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 3rd parameter is non-negative, then it +** must be the byte offset into the string where the NUL terminator would +** appear if the string where NUL terminated. If any NUL characters occur +** in the string at a byte offset that is less than the value of the 3rd +** parameter, then the resulting string will contain embedded NULs and the +** result of expressions operating on strings with embedded NULs is undefined. +** ^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 +** 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 +** or sqlite3_result_blob is the special constant SQLITE_TRANSIENT +** then SQLite makes a copy of the result into space obtained +** from [sqlite3_malloc()] before it returns. +** +** ^The sqlite3_result_value() interface sets the result of +** the application-defined function to be a copy of 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 +** [unprotected sqlite3_value] object is required, so either +** kind of [sqlite3_value] object can be used with this interface. +** +** ^The sqlite3_result_pointer(C,P,T,D) interface sets the result to an +** SQL NULL value, just like [sqlite3_result_null(C)], except that it +** also associates the host-language pointer P or type T with that +** NULL value such that the pointer can be retrieved within an +** [application-defined SQL function] using [sqlite3_value_pointer()]. +** ^If the D parameter is not NULL, then it is a pointer to a destructor +** for the P parameter. ^SQLite invokes D with P as its only argument +** when SQLite is finished with P. The T parameter should be a static +** string and preferably a string literal. The sqlite3_result_pointer() +** routine is part of the [pointer passing interface] added for SQLite 3.20.0. +** +** 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. +*/ +SQLITE_API void sqlite3_result_blob(sqlite3_context*, const void*, int, void(*)(void*)); +SQLITE_API void sqlite3_result_blob64(sqlite3_context*,const void*, + sqlite3_uint64,void(*)(void*)); +SQLITE_API void sqlite3_result_double(sqlite3_context*, double); +SQLITE_API void sqlite3_result_error(sqlite3_context*, const char*, int); +SQLITE_API void sqlite3_result_error16(sqlite3_context*, const void*, int); +SQLITE_API void sqlite3_result_error_toobig(sqlite3_context*); +SQLITE_API void sqlite3_result_error_nomem(sqlite3_context*); +SQLITE_API void sqlite3_result_error_code(sqlite3_context*, int); +SQLITE_API void sqlite3_result_int(sqlite3_context*, int); +SQLITE_API void sqlite3_result_int64(sqlite3_context*, sqlite3_int64); +SQLITE_API void sqlite3_result_null(sqlite3_context*); +SQLITE_API void sqlite3_result_text(sqlite3_context*, const char*, int, void(*)(void*)); +SQLITE_API void sqlite3_result_text64(sqlite3_context*, const char*,sqlite3_uint64, + void(*)(void*), unsigned char encoding); +SQLITE_API void sqlite3_result_text16(sqlite3_context*, const void*, int, void(*)(void*)); +SQLITE_API void sqlite3_result_text16le(sqlite3_context*, const void*, int,void(*)(void*)); +SQLITE_API void sqlite3_result_text16be(sqlite3_context*, const void*, int,void(*)(void*)); +SQLITE_API void sqlite3_result_value(sqlite3_context*, sqlite3_value*); +SQLITE_API void sqlite3_result_pointer(sqlite3_context*, void*,const char*,void(*)(void*)); +SQLITE_API void sqlite3_result_zeroblob(sqlite3_context*, int n); +SQLITE_API int sqlite3_result_zeroblob64(sqlite3_context*, sqlite3_uint64 n); + + +/* +** CAPI3REF: Setting The Subtype Of An SQL Function +** METHOD: sqlite3_context +** +** The sqlite3_result_subtype(C,T) function causes the subtype of +** the result from the [application-defined SQL function] with +** [sqlite3_context] C to be the value T. Only the lower 8 bits +** of the subtype T are preserved in current versions of SQLite; +** higher order bits are discarded. +** The number of subtype bytes preserved by SQLite might increase +** in future releases of SQLite. +*/ +SQLITE_API void sqlite3_result_subtype(sqlite3_context*,unsigned int); + +/* +** CAPI3REF: Define New Collating Sequences +** METHOD: sqlite3 +** +** ^These functions add, remove, or modify a [collation] associated +** with the [database connection] specified as the first argument. +** +** ^The name of the collation is a UTF-8 string +** for sqlite3_create_collation() and sqlite3_create_collation_v2() +** and a UTF-16 string in native byte order for sqlite3_create_collation16(). +** ^Collation names that compare equal according to [sqlite3_strnicmp()] are +** considered to be the same name. +** +** ^(The third argument (eTextRep) must be one of the constants: +**
        +**
      • [SQLITE_UTF8], +**
      • [SQLITE_UTF16LE], +**
      • [SQLITE_UTF16BE], +**
      • [SQLITE_UTF16], or +**
      • [SQLITE_UTF16_ALIGNED]. +**
      )^ +** ^The eTextRep argument determines the encoding of strings passed +** to the collating function callback, xCallback. +** ^The [SQLITE_UTF16] and [SQLITE_UTF16_ALIGNED] values for eTextRep +** force strings to be UTF16 with native byte order. +** ^The [SQLITE_UTF16_ALIGNED] value for eTextRep forces strings to begin +** on an even byte address. +** +** ^The fourth argument, pArg, is an application data pointer that is passed +** through as the first argument to the collating function callback. +** +** ^The fifth argument, xCallback, is a pointer to the collating function. +** ^Multiple collating functions can be registered using the same name but +** with different eTextRep parameters and SQLite will use whichever +** function requires the least amount of data transformation. +** ^If the xCallback argument is NULL then the collating function is +** deleted. ^When all collating functions having the same name are deleted, +** that collation is no longer usable. +** +** ^The collating function callback is invoked with a copy of the pArg +** application data pointer and with two strings in the encoding specified +** by the eTextRep argument. The collating function must return an +** integer that is negative, zero, or positive +** if the first string is less than, equal to, or greater than the second, +** respectively. A collating function must always return the same answer +** given the same inputs. If two or more collating functions are registered +** to the same collation name (using different eTextRep values) then all +** must give an equivalent answer when invoked with equivalent strings. +** The collating function must obey the following properties for all +** strings A, B, and C: +** +**
        +**
      1. If A==B then B==A. +**
      2. If A==B and B==C then A==C. +**
      3. If A<B THEN B>A. +**
      4. If A<B and B<C then A<C. +**
      +** +** If a collating function fails any of the above constraints and that +** collating function is registered and used, then the behavior of SQLite +** is undefined. +** +** ^The sqlite3_create_collation_v2() works like sqlite3_create_collation() +** with the addition that the xDestroy callback is invoked on pArg when +** the collating function is deleted. +** ^Collating functions are deleted when they are overridden by later +** calls to the collation creation functions or when the +** [database connection] is closed using [sqlite3_close()]. +** +** ^The xDestroy callback is not called if the +** sqlite3_create_collation_v2() function fails. Applications that invoke +** sqlite3_create_collation_v2() with a non-NULL xDestroy argument should +** check the return code and dispose of the application data pointer +** themselves rather than expecting SQLite to deal with it for them. +** This is different from every other SQLite interface. The inconsistency +** is unfortunate but cannot be changed without breaking backwards +** compatibility. +** +** See also: [sqlite3_collation_needed()] and [sqlite3_collation_needed16()]. +*/ +SQLITE_API int sqlite3_create_collation( + sqlite3*, + const char *zName, + int eTextRep, + void *pArg, + int(*xCompare)(void*,int,const void*,int,const void*) +); +SQLITE_API int sqlite3_create_collation_v2( + sqlite3*, + const char *zName, + int eTextRep, + void *pArg, + int(*xCompare)(void*,int,const void*,int,const void*), + void(*xDestroy)(void*) +); +SQLITE_API int sqlite3_create_collation16( + sqlite3*, + const void *zName, + int eTextRep, + void *pArg, + int(*xCompare)(void*,int,const void*,int,const void*) +); + +/* +** CAPI3REF: Collation Needed Callbacks +** METHOD: sqlite3 +** +** ^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 invoked whenever an undefined collation +** sequence is required. +** +** ^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. ^If sqlite3_collation_needed16() is used, +** the names are passed as UTF-16 in machine native byte order. +** ^A call to either function replaces the existing collation-needed callback. +** +** ^(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.)^ +** +** The callback function should register the desired collation using +** [sqlite3_create_collation()], [sqlite3_create_collation16()], or +** [sqlite3_create_collation_v2()]. +*/ +SQLITE_API int sqlite3_collation_needed( + sqlite3*, + void*, + void(*)(void*,sqlite3*,int eTextRep,const char*) +); +SQLITE_API int sqlite3_collation_needed16( + sqlite3*, + void*, + void(*)(void*,sqlite3*,int eTextRep,const void*) +); + +#ifdef SQLITE_HAS_CODEC +/* +** Specify the key for an encrypted database. This routine should be +** called right after sqlite3_open(). +** +** The code to implement this API is not available in the public release +** of SQLite. +*/ +SQLITE_API int sqlite3_key( + sqlite3 *db, /* Database to be rekeyed */ + const void *pKey, int nKey /* The key */ +); +SQLITE_API int sqlite3_key_v2( + sqlite3 *db, /* Database to be rekeyed */ + const char *zDbName, /* Name of the database */ + const void *pKey, int nKey /* The key */ +); + +/* +** Change the key on an open database. If the current database is not +** encrypted, this routine will encrypt it. If pNew==0 or nNew==0, the +** database is decrypted. +** +** The code to implement this API is not available in the public release +** of SQLite. +*/ +SQLITE_API int sqlite3_rekey( + sqlite3 *db, /* Database to be rekeyed */ + const void *pKey, int nKey /* The new key */ +); +SQLITE_API int sqlite3_rekey_v2( + sqlite3 *db, /* Database to be rekeyed */ + const char *zDbName, /* Name of the database */ + const void *pKey, int nKey /* The new key */ +); + +/* +** Specify the activation key for a SEE database. Unless +** activated, none of the SEE routines will work. +*/ +SQLITE_API void sqlite3_activate_see( + const char *zPassPhrase /* Activation phrase */ +); +#endif + +#ifdef SQLITE_ENABLE_CEROD +/* +** Specify the activation key for a CEROD database. Unless +** activated, none of the CEROD routines will work. +*/ +SQLITE_API void sqlite3_activate_cerod( + const char *zPassPhrase /* Activation phrase */ +); +#endif + +/* +** CAPI3REF: Suspend Execution For A Short Time +** +** 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 +** millisecond time resolution, then the time will be rounded up to +** 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() +** method of the default [sqlite3_vfs] object. If the xSleep() method +** of the default VFS is not implemented correctly, or not implemented at +** all, then the behavior of sqlite3_sleep() may deviate from the description +** in the previous paragraphs. +*/ +SQLITE_API int sqlite3_sleep(int); + +/* +** CAPI3REF: Name Of The Folder Holding Temporary Files +** +** ^(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 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. +** +** Applications are strongly discouraged from using this global variable. +** It is required to set a temporary folder on Windows Runtime (WinRT). +** But for all other platforms, it is highly recommended that applications +** neither read nor write this variable. This global variable is a relic +** that exists for backwards compatibility of legacy applications and should +** be avoided in new projects. +** +** It is not safe to read or modify this variable in more than one +** thread at a time. It is not safe to read or modify this variable +** if a [database connection] is being used at the same time in a separate +** thread. +** It is intended that this variable be set once +** as part of process initialization and before any SQLite interface +** 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] 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 +** using [sqlite3_free]. +** Hence, if this variable is modified directly, either it should be +** made NULL or made to point to memory obtained from [sqlite3_malloc] +** or else the use of the [temp_store_directory pragma] should be avoided. +** Except when requested by the [temp_store_directory pragma], SQLite +** does not free the memory that sqlite3_temp_directory points to. If +** the application wants that memory to be freed, it must do +** so itself, taking care to only do so after all [database connection] +** objects have been destroyed. +** +** Note to Windows Runtime users: The temporary directory must be set +** prior to calling [sqlite3_open] or [sqlite3_open_v2]. Otherwise, various +** features that require the use of temporary files may fail. Here is an +** example of how to do this using C++ with the Windows Runtime: +** +**
      +** LPCWSTR zPath = Windows::Storage::ApplicationData::Current->
      +**       TemporaryFolder->Path->Data();
      +** char zPathBuf[MAX_PATH + 1];
      +** memset(zPathBuf, 0, sizeof(zPathBuf));
      +** WideCharToMultiByte(CP_UTF8, 0, zPath, -1, zPathBuf, sizeof(zPathBuf),
      +**       NULL, NULL);
      +** sqlite3_temp_directory = sqlite3_mprintf("%s", zPathBuf);
      +** 
      +*/ +SQLITE_API SQLITE_EXTERN char *sqlite3_temp_directory; + +/* +** CAPI3REF: Name Of The Folder Holding Database Files +** +** ^(If this global variable is made to point to a string which is +** the name of a folder (a.k.a. directory), then all database files +** specified with a relative pathname and created or accessed by +** SQLite when using a built-in windows [sqlite3_vfs | VFS] will be assumed +** to be relative to that directory.)^ ^If this variable is a NULL +** pointer, then SQLite assumes that all database files specified +** with a relative pathname are relative to the current directory +** for the process. Only the windows VFS makes use of this global +** variable; it is ignored by the unix VFS. +** +** Changing the value of this variable while a database connection is +** open can result in a corrupt database. +** +** It is not safe to read or modify this variable in more than one +** thread at a time. It is not safe to read or modify this variable +** if a [database connection] is being used at the same time in a separate +** thread. +** It is intended that this variable be set once +** as part of process initialization and before any SQLite interface +** routines have been called and that this variable remain unchanged +** thereafter. +** +** ^The [data_store_directory pragma] may modify this variable and cause +** it to point to memory obtained from [sqlite3_malloc]. ^Furthermore, +** the [data_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 +** using [sqlite3_free]. +** Hence, if this variable is modified directly, either it should be +** made NULL or made to point to memory obtained from [sqlite3_malloc] +** or else the use of the [data_store_directory pragma] should be avoided. +*/ +SQLITE_API SQLITE_EXTERN char *sqlite3_data_directory; + +/* +** CAPI3REF: Test For Auto-Commit Mode +** KEYWORDS: {autocommit mode} +** METHOD: sqlite3 +** +** ^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]. +** +** If certain kinds of errors occur on a statement within a multi-statement +** transaction (errors including [SQLITE_FULL], [SQLITE_IOERR], +** [SQLITE_NOMEM], [SQLITE_BUSY], and [SQLITE_INTERRUPT]) then the +** transaction might be rolled back automatically. The only way to +** find out whether SQLite automatically rolled back the transaction after +** an error is to use this function. +** +** If another thread changes the autocommit status of the database +** connection while this routine is running, then the return value +** is undefined. +*/ +SQLITE_API int sqlite3_get_autocommit(sqlite3*); + +/* +** CAPI3REF: Find The Database Handle Of A Prepared Statement +** METHOD: sqlite3_stmt +** +** ^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. +*/ +SQLITE_API sqlite3 *sqlite3_db_handle(sqlite3_stmt*); + +/* +** CAPI3REF: Return The Filename For A Database Connection +** METHOD: sqlite3 +** +** ^The sqlite3_db_filename(D,N) interface returns a pointer to a filename +** associated with database N of connection D. ^The main database file +** has the name "main". If there is no attached database N on the database +** connection D, or if database N is a temporary or in-memory database, then +** a NULL pointer is returned. +** +** ^The filename returned by this function is the output of the +** xFullPathname method of the [VFS]. ^In other words, the filename +** will be an absolute pathname, even if the filename used +** to open the database originally was a URI or relative pathname. +*/ +SQLITE_API const char *sqlite3_db_filename(sqlite3 *db, const char *zDbName); + +/* +** CAPI3REF: Determine if a database is read-only +** METHOD: sqlite3 +** +** ^The sqlite3_db_readonly(D,N) interface returns 1 if the database N +** of connection D is read-only, 0 if it is read/write, or -1 if N is not +** the name of a database on connection D. +*/ +SQLITE_API int sqlite3_db_readonly(sqlite3 *db, const char *zDbName); + +/* +** CAPI3REF: Find the next prepared statement +** METHOD: sqlite3 +** +** ^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 +** 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. +*/ +SQLITE_API sqlite3_stmt *sqlite3_next_stmt(sqlite3 *pDb, sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Commit And Rollback Notification Callbacks +** METHOD: sqlite3 +** +** ^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() +** for the same database connection is overridden. +** ^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_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, +** then the commit is converted into a rollback. +** +** ^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 commit and rollback hook callbacks are not reentrant. +** The callback implementation must not do anything that will modify +** the database connection that invoked the callback. Any actions +** to modify the database connection must be deferred until after the +** completion of the [sqlite3_step()] call that triggered the commit +** or rollback hook in the first place. +** Note that running any other SQL statements, including SELECT statements, +** or merely calling [sqlite3_prepare_v2()] and [sqlite3_step()] will modify +** the database connections for the meaning of "modify" in this paragraph. +** +** ^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 +** returns non-zero, then the [COMMIT] is converted into a [ROLLBACK]. +** ^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 +** 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 +** automatically rolled back because the database connection is closed. +** +** See also the [sqlite3_update_hook()] interface. +*/ +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 +** METHOD: sqlite3 +** +** ^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 in +** a [rowid table]. +** ^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 +** row is updated, inserted or deleted in a rowid table. +** ^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], +** 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 +** 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 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 [WITHOUT ROWID] tables are modified. +** +** ^In the current implementation, the update hook +** is not invoked when conflicting rows are deleted because of an +** [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. +** +** The update hook implementation must not do anything that will modify +** the database connection that invoked the update hook. Any actions +** to modify the database connection must be deferred until after the +** completion of the [sqlite3_step()] call that triggered the update hook. +** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their +** database connections for the meaning of "modify" in this paragraph. +** +** ^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()], [sqlite3_rollback_hook()], +** and [sqlite3_preupdate_hook()] interfaces. +*/ +SQLITE_API void *sqlite3_update_hook( + sqlite3*, + void(*)(void *,int ,char const *,char const *,sqlite3_int64), + void* +); + +/* +** CAPI3REF: Enable Or Disable Shared Pager 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.)^ +** +** ^Cache sharing is enabled and disabled for an entire process. +** This is a change as of SQLite [version 3.5.0] ([dateof: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 +** 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.)^ +** +** ^(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 +** future releases of SQLite. Applications that care about shared +** cache setting should set it explicitly. +** +** Note: This method is disabled on MacOS X 10.7 and iOS version 5.0 +** and will always return SQLITE_MISUSE. On those systems, +** shared cache mode should be enabled per-database connection via +** [sqlite3_open_v2()] with [SQLITE_OPEN_SHAREDCACHE]. +** +** This interface is threadsafe on processors where writing a +** 32-bit integer is atomic. +** +** See Also: [SQLite Shared-Cache Mode] +*/ +SQLITE_API int sqlite3_enable_shared_cache(int); + +/* +** CAPI3REF: Attempt To Free Heap Memory +** +** ^The sqlite3_release_memory() interface attempts to free N bytes +** of heap memory by deallocating non-essential memory allocations +** 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, +** which might be more or less than the amount requested. +** ^The sqlite3_release_memory() routine is a no-op returning zero +** if SQLite is not compiled with [SQLITE_ENABLE_MEMORY_MANAGEMENT]. +** +** See also: [sqlite3_db_release_memory()] +*/ +SQLITE_API int sqlite3_release_memory(int); + +/* +** CAPI3REF: Free Memory Used By A Database Connection +** METHOD: sqlite3 +** +** ^The sqlite3_db_release_memory(D) interface attempts to free as much heap +** memory as possible from database connection D. Unlike the +** [sqlite3_release_memory()] interface, this interface is in effect even +** when the [SQLITE_ENABLE_MEMORY_MANAGEMENT] compile-time option is +** omitted. +** +** See also: [sqlite3_release_memory()] +*/ +SQLITE_API int sqlite3_db_release_memory(sqlite3*); + +/* +** CAPI3REF: Impose A Limit On Heap Size +** +** ^The sqlite3_soft_heap_limit64() interface sets and/or queries the +** soft limit on the amount of heap memory that may be allocated by SQLite. +** ^SQLite strives to keep heap memory utilization below the soft heap +** limit by reducing the number of pages held in the page cache +** as heap memory usages approaches the limit. +** ^The soft heap limit is "soft" because even though SQLite strives to stay +** below the limit, it will exceed the limit rather than generate +** an [SQLITE_NOMEM] error. In other words, the soft heap limit +** is advisory only. +** +** ^The return value from sqlite3_soft_heap_limit64() is the size of +** the soft heap limit prior to the call, or negative in the case of an +** error. ^If the argument N is negative +** then no change is made to the soft heap limit. Hence, the current +** size of the soft heap limit can be determined by invoking +** sqlite3_soft_heap_limit64() with a negative argument. +** +** ^If the argument N is zero then the soft heap limit is disabled. +** +** ^(The soft heap limit is not enforced in the current implementation +** if one or more of following conditions are true: +** +**
        +**
      • The soft heap limit is set to zero. +**
      • Memory accounting is disabled using a combination of the +** [sqlite3_config]([SQLITE_CONFIG_MEMSTATUS],...) start-time option and +** the [SQLITE_DEFAULT_MEMSTATUS] compile-time option. +**
      • An alternative page cache implementation is specified using +** [sqlite3_config]([SQLITE_CONFIG_PCACHE2],...). +**
      • The page cache allocates from its own memory pool supplied +** by [sqlite3_config]([SQLITE_CONFIG_PAGECACHE],...) rather than +** from the heap. +**
      )^ +** +** Beginning with SQLite [version 3.7.3] ([dateof:3.7.3]), +** the soft heap limit is enforced +** regardless of whether or not the [SQLITE_ENABLE_MEMORY_MANAGEMENT] +** compile-time option is invoked. With [SQLITE_ENABLE_MEMORY_MANAGEMENT], +** the soft heap limit is enforced on every memory allocation. Without +** [SQLITE_ENABLE_MEMORY_MANAGEMENT], the soft heap limit is only enforced +** when memory is allocated by the page cache. Testing suggests that because +** the page cache is the predominate memory user in SQLite, most +** applications will achieve adequate soft heap limit enforcement without +** the use of [SQLITE_ENABLE_MEMORY_MANAGEMENT]. +** +** The circumstances under which SQLite will enforce the soft heap limit may +** changes in future releases of SQLite. +*/ +SQLITE_API sqlite3_int64 sqlite3_soft_heap_limit64(sqlite3_int64 N); + +/* +** CAPI3REF: Deprecated Soft Heap Limit Interface +** DEPRECATED +** +** This is a deprecated version of the [sqlite3_soft_heap_limit64()] +** interface. This routine is provided for historical compatibility +** only. All new applications should use the +** [sqlite3_soft_heap_limit64()] interface rather than this one. +*/ +SQLITE_API SQLITE_DEPRECATED void sqlite3_soft_heap_limit(int N); + + +/* +** CAPI3REF: Extract Metadata About A Column Of A Table +** METHOD: sqlite3 +** +** ^(The sqlite3_table_column_metadata(X,D,T,C,....) routine returns +** information about column C of table T in database D +** on [database connection] X.)^ ^The sqlite3_table_column_metadata() +** interface returns SQLITE_OK and fills in the non-NULL pointers in +** the final five arguments with appropriate values if the specified +** column exists. ^The sqlite3_table_column_metadata() interface returns +** SQLITE_ERROR and if the specified column does not exist. +** ^If the column-name parameter to sqlite3_table_column_metadata() is a +** NULL pointer, then this routine simply checks for the existence of the +** table and returns SQLITE_OK if the table exists and SQLITE_ERROR if it +** does not. If the table name parameter T in a call to +** sqlite3_table_column_metadata(X,D,T,C,...) is NULL then the result is +** undefined behavior. +** +** ^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 +** name of the desired column, respectively. +** +** ^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 +** +**
      5th const char* Data type +**
      6th const char* Name of default collation sequence +**
      7th int True if column has a NOT NULL constraint +**
      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 +** declaration type and collation sequence is valid 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 column is "rowid", "oid" or "_rowid_" and the table +** is not a [WITHOUT ROWID] table 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 +** [INTEGER PRIMARY KEY] column, then the outputs +** for the [rowid] are set as follows: +** +**
      +**     data type: "INTEGER"
      +**     collation sequence: "BINARY"
      +**     not null: 0
      +**     primary key: 1
      +**     auto increment: 0
      +** 
      )^ +** +** ^This function causes all database schemas to be read from disk and +** parsed, if that has not already been done, and returns an error if +** any errors are encountered while loading the schema. +*/ +SQLITE_API int sqlite3_table_column_metadata( + sqlite3 *db, /* Connection handle */ + const char *zDbName, /* Database name or NULL */ + const char *zTableName, /* Table name */ + const char *zColumnName, /* Column name */ + char const **pzDataType, /* OUTPUT: Declared data type */ + char const **pzCollSeq, /* OUTPUT: Collation sequence name */ + int *pNotNull, /* OUTPUT: True if NOT NULL constraint exists */ + int *pPrimaryKey, /* OUTPUT: True if column part of PK */ + int *pAutoinc /* OUTPUT: True if column is auto-increment */ +); + +/* +** CAPI3REF: Load An Extension +** METHOD: sqlite3 +** +** ^This interface loads an SQLite extension library from the named file. +** +** ^The sqlite3_load_extension() interface attempts to load an +** [SQLite extension] library contained in the file zFile. If +** the file cannot be loaded directly, attempts are made to load +** with various operating-system specific extensions added. +** So for example, if "samplelib" cannot be loaded, then names like +** "samplelib.so" or "samplelib.dylib" or "samplelib.dll" might +** be tried also. +** +** ^The entry point is zProc. +** ^(zProc may be 0, in which case SQLite will try to come up with an +** entry point name on its own. It first tries "sqlite3_extension_init". +** If that does not work, it constructs a name "sqlite3_X_init" where the +** X is consists of the lower-case equivalent of all ASCII alphabetic +** characters in the filename from the last "/" to the first following +** "." and omitting any initial "lib".)^ +** ^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()]. +** +** ^Extension loading must be enabled using +** [sqlite3_enable_load_extension()] or +** [sqlite3_db_config](db,[SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION],1,NULL) +** prior to calling this API, +** otherwise an error will be returned. +** +** Security warning: It is recommended that the +** [SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION] method be used to enable only this +** interface. The use of the [sqlite3_enable_load_extension()] interface +** should be avoided. This will keep the SQL function [load_extension()] +** disabled and prevent SQL injections from giving attackers +** access to extension loading capabilities. +** +** See also the [load_extension() SQL function]. +*/ +SQLITE_API int sqlite3_load_extension( + sqlite3 *db, /* Load the extension into this database connection */ + const char *zFile, /* Name of the shared library containing extension */ + const char *zProc, /* Entry point. Derived from zFile if 0 */ + char **pzErrMsg /* Put error message here if not 0 */ +); + +/* +** CAPI3REF: Enable Or Disable Extension Loading +** METHOD: sqlite3 +** +** ^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. +** ^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. +** +** ^This interface enables or disables both the C-API +** [sqlite3_load_extension()] and the SQL function [load_extension()]. +** ^(Use [sqlite3_db_config](db,[SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION],..) +** to enable or disable only the C-API.)^ +** +** Security warning: It is recommended that extension loading +** be disabled using the [SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION] method +** rather than this interface, so the [load_extension()] SQL function +** remains disabled. This will prevent SQL injections from giving attackers +** access to extension loading capabilities. +*/ +SQLITE_API int sqlite3_enable_load_extension(sqlite3 *db, int onoff); + +/* +** CAPI3REF: Automatically Load Statically Linked Extensions +** +** ^This interface causes the xEntryPoint() function to be invoked for +** each new [database connection] that is created. The idea here is that +** xEntryPoint() is the entry point for a statically linked [SQLite extension] +** that is to be automatically loaded into all new database connections. +** +** ^(Even though the function prototype shows that xEntryPoint() takes +** no arguments and returns void, SQLite invokes xEntryPoint() with three +** arguments and expects an integer result as if the signature of the +** entry point where as follows: +** +**
      +**    int xEntryPoint(
      +**      sqlite3 *db,
      +**      const char **pzErrMsg,
      +**      const struct sqlite3_api_routines *pThunk
      +**    );
      +** 
      )^ +** +** If the xEntryPoint routine encounters an error, it should make *pzErrMsg +** point to an appropriate error message (obtained from [sqlite3_mprintf()]) +** and return an appropriate [error code]. ^SQLite ensures that *pzErrMsg +** is NULL before calling the xEntryPoint(). ^SQLite will invoke +** [sqlite3_free()] on *pzErrMsg after xEntryPoint() returns. ^If any +** xEntryPoint() returns an error, the [sqlite3_open()], [sqlite3_open16()], +** or [sqlite3_open_v2()] call that provoked the xEntryPoint() will fail. +** +** ^Calling sqlite3_auto_extension(X) with an entry point X that is already +** on the list of automatic extensions is a harmless no-op. ^No entry point +** will be called more than once for each database connection that is opened. +** +** See also: [sqlite3_reset_auto_extension()] +** and [sqlite3_cancel_auto_extension()] +*/ +SQLITE_API int sqlite3_auto_extension(void(*xEntryPoint)(void)); + +/* +** CAPI3REF: Cancel Automatic Extension Loading +** +** ^The [sqlite3_cancel_auto_extension(X)] interface unregisters the +** initialization routine X that was registered using a prior call to +** [sqlite3_auto_extension(X)]. ^The [sqlite3_cancel_auto_extension(X)] +** routine returns 1 if initialization routine X was successfully +** unregistered and it returns 0 if X was not on the list of initialization +** routines. +*/ +SQLITE_API int sqlite3_cancel_auto_extension(void(*xEntryPoint)(void)); + +/* +** CAPI3REF: Reset Automatic Extension Loading +** +** ^This interface disables all automatic extensions previously +** registered using [sqlite3_auto_extension()]. +*/ +SQLITE_API void sqlite3_reset_auto_extension(void); + +/* +** The interface to the virtual-table mechanism is currently considered +** to be experimental. The interface might change in incompatible ways. +** If this is a problem for you, do not use the interface at this time. +** +** When the virtual-table mechanism stabilizes, we will declare the +** interface fixed, support it indefinitely, and remove this comment. +*/ + +/* +** Structures used by the virtual table interface +*/ +typedef struct sqlite3_vtab sqlite3_vtab; +typedef struct sqlite3_index_info sqlite3_index_info; +typedef struct sqlite3_vtab_cursor sqlite3_vtab_cursor; +typedef struct sqlite3_module sqlite3_module; + +/* +** CAPI3REF: Virtual Table Object +** KEYWORDS: sqlite3_module {virtual table module} +** +** This structure, sometimes called a "virtual table 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 +** 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 +** module or until the [database connection] closes. The content +** of this structure must not change while it is registered with +** any database connection. +*/ +struct sqlite3_module { + int iVersion; + int (*xCreate)(sqlite3*, void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVTab, char**); + int (*xConnect)(sqlite3*, void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVTab, char**); + int (*xBestIndex)(sqlite3_vtab *pVTab, sqlite3_index_info*); + int (*xDisconnect)(sqlite3_vtab *pVTab); + int (*xDestroy)(sqlite3_vtab *pVTab); + int (*xOpen)(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor); + int (*xClose)(sqlite3_vtab_cursor*); + int (*xFilter)(sqlite3_vtab_cursor*, int idxNum, const char *idxStr, + int argc, sqlite3_value **argv); + int (*xNext)(sqlite3_vtab_cursor*); + int (*xEof)(sqlite3_vtab_cursor*); + int (*xColumn)(sqlite3_vtab_cursor*, sqlite3_context*, int); + int (*xRowid)(sqlite3_vtab_cursor*, sqlite3_int64 *pRowid); + int (*xUpdate)(sqlite3_vtab *, int, sqlite3_value **, sqlite3_int64 *); + int (*xBegin)(sqlite3_vtab *pVTab); + int (*xSync)(sqlite3_vtab *pVTab); + int (*xCommit)(sqlite3_vtab *pVTab); + int (*xRollback)(sqlite3_vtab *pVTab); + int (*xFindFunction)(sqlite3_vtab *pVtab, int nArg, const char *zName, + void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), + void **ppArg); + int (*xRename)(sqlite3_vtab *pVtab, const char *zNew); + /* The methods above are in version 1 of the sqlite_module object. Those + ** below are for version 2 and greater. */ + int (*xSavepoint)(sqlite3_vtab *pVTab, int); + int (*xRelease)(sqlite3_vtab *pVTab, int); + int (*xRollbackTo)(sqlite3_vtab *pVTab, int); +}; + +/* +** CAPI3REF: Virtual Table Indexing Information +** KEYWORDS: sqlite3_index_info +** +** The sqlite3_index_info structure and its substructures is used as part +** of the [virtual table] interface to +** pass information into and receive the reply from the [xBestIndex] +** method of a [virtual table module]. The fields under **Inputs** are the +** 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: +** +**
      column OP expr
      +** +** where OP is =, <, <=, >, or >=.)^ ^(The particular operator is +** stored in aConstraint[].op using one of the +** [SQLITE_INDEX_CONSTRAINT_EQ | SQLITE_INDEX_CONSTRAINT_ values].)^ +** ^(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.)^ +** +** ^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 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. +** +** The colUsed field indicates which columns of the virtual table may be +** required by the current scan. Virtual table columns are numbered from +** zero in the order in which they appear within the CREATE TABLE statement +** passed to sqlite3_declare_vtab(). For the first 63 columns (columns 0-62), +** the corresponding bit is set within the colUsed mask if the column may be +** required by SQLite. If the table has at least 64 columns and any column +** to the right of the first 63 is required, then bit 63 of colUsed is also +** set. In other words, column iCol may be required if the expression +** (colUsed & ((sqlite3_uint64)1 << (iCol>=63 ? 63 : iCol))) evaluates to +** non-zero. +** +** The [xBestIndex] method must fill aConstraintUsage[] with information +** 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 +** is true, then the constraint is assumed to be fully handled by the +** virtual table and is not checked again by SQLite.)^ +** +** ^The idxNum and idxPtr values are recorded and passed into the +** [xFilter] method. +** ^[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 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 a particular +** strategy. A cost of N indicates that the cost of the strategy is similar +** to a linear scan of an SQLite table with N rows. A cost of log(N) +** indicates that the expense of the operation is similar to that of a +** binary search on a unique indexed field of an SQLite table with N rows. +** +** ^The estimatedRows value is an estimate of the number of rows that +** will be returned by the strategy. +** +** The xBestIndex method may optionally populate the idxFlags field with a +** mask of SQLITE_INDEX_SCAN_* flags. Currently there is only one such flag - +** SQLITE_INDEX_SCAN_UNIQUE. If the xBestIndex method sets this flag, SQLite +** assumes that the strategy may visit at most one row. +** +** Additionally, if xBestIndex sets the SQLITE_INDEX_SCAN_UNIQUE flag, then +** SQLite also assumes that if a call to the xUpdate() method is made as +** part of the same statement to delete or update a virtual table row and the +** implementation returns SQLITE_CONSTRAINT, then there is no need to rollback +** any database changes. In other words, if the xUpdate() returns +** SQLITE_CONSTRAINT, the database contents must be exactly as they were +** before xUpdate was called. By contrast, if SQLITE_INDEX_SCAN_UNIQUE is not +** set and xUpdate returns SQLITE_CONSTRAINT, any database changes made by +** the xUpdate method are automatically rolled back by SQLite. +** +** IMPORTANT: The estimatedRows field was added to the sqlite3_index_info +** structure for SQLite [version 3.8.2] ([dateof:3.8.2]). +** If a virtual table extension is +** used with an SQLite version earlier than 3.8.2, the results of attempting +** to read or write the estimatedRows field are undefined (but are likely +** to included crashing the application). The estimatedRows field should +** therefore only be used if [sqlite3_libversion_number()] returns a +** value greater than or equal to 3008002. Similarly, the idxFlags field +** was added for [version 3.9.0] ([dateof:3.9.0]). +** It may therefore only be used if +** sqlite3_libversion_number() returns a value greater than or equal to +** 3009000. +*/ +struct sqlite3_index_info { + /* Inputs */ + int nConstraint; /* Number of entries in aConstraint */ + struct sqlite3_index_constraint { + int iColumn; /* Column constrained. -1 for ROWID */ + unsigned char op; /* Constraint operator */ + unsigned char usable; /* True if this constraint is usable */ + int iTermOffset; /* Used internally - xBestIndex should ignore */ + } *aConstraint; /* Table of WHERE clause constraints */ + int nOrderBy; /* Number of terms in the ORDER BY clause */ + struct sqlite3_index_orderby { + int iColumn; /* Column number */ + unsigned char desc; /* True for DESC. False for ASC. */ + } *aOrderBy; /* The ORDER BY clause */ + /* Outputs */ + struct sqlite3_index_constraint_usage { + int argvIndex; /* if >0, constraint is part of argv to xFilter */ + unsigned char omit; /* Do not code a test for this constraint */ + } *aConstraintUsage; + int idxNum; /* Number used to identify the index */ + char *idxStr; /* String, possibly obtained from sqlite3_malloc */ + int needToFreeIdxStr; /* Free idxStr using sqlite3_free() if true */ + int orderByConsumed; /* True if output is already ordered */ + double estimatedCost; /* Estimated cost of using this index */ + /* Fields below are only available in SQLite 3.8.2 and later */ + sqlite3_int64 estimatedRows; /* Estimated number of rows returned */ + /* Fields below are only available in SQLite 3.9.0 and later */ + int idxFlags; /* Mask of SQLITE_INDEX_SCAN_* flags */ + /* Fields below are only available in SQLite 3.10.0 and later */ + sqlite3_uint64 colUsed; /* Input: Mask of columns used by statement */ +}; + +/* +** CAPI3REF: Virtual Table Scan Flags +*/ +#define SQLITE_INDEX_SCAN_UNIQUE 1 /* Scan visits at most 1 row */ + +/* +** CAPI3REF: Virtual Table Constraint Operator Codes +** +** These macros defined the allowed values for the +** [sqlite3_index_info].aConstraint[].op field. Each value represents +** an operator that is part of a constraint term in the wHERE clause of +** a query that uses a [virtual table]. +*/ +#define SQLITE_INDEX_CONSTRAINT_EQ 2 +#define SQLITE_INDEX_CONSTRAINT_GT 4 +#define SQLITE_INDEX_CONSTRAINT_LE 8 +#define SQLITE_INDEX_CONSTRAINT_LT 16 +#define SQLITE_INDEX_CONSTRAINT_GE 32 +#define SQLITE_INDEX_CONSTRAINT_MATCH 64 +#define SQLITE_INDEX_CONSTRAINT_LIKE 65 +#define SQLITE_INDEX_CONSTRAINT_GLOB 66 +#define SQLITE_INDEX_CONSTRAINT_REGEXP 67 +#define SQLITE_INDEX_CONSTRAINT_NE 68 +#define SQLITE_INDEX_CONSTRAINT_ISNOT 69 +#define SQLITE_INDEX_CONSTRAINT_ISNOTNULL 70 +#define SQLITE_INDEX_CONSTRAINT_ISNULL 71 +#define SQLITE_INDEX_CONSTRAINT_IS 72 + +/* +** CAPI3REF: Register A Virtual Table Implementation +** METHOD: sqlite3 +** +** ^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 +** 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. +** +** ^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 destructor will also +** be invoked if the call to sqlite3_create_module_v2() fails. +** ^The sqlite3_create_module() +** interface is equivalent to sqlite3_create_module_v2() with a NULL +** destructor. +*/ +SQLITE_API int sqlite3_create_module( + sqlite3 *db, /* SQLite connection to register module with */ + const char *zName, /* Name of the module */ + const sqlite3_module *p, /* Methods for the module */ + void *pClientData /* Client data for xCreate/xConnect */ +); +SQLITE_API int sqlite3_create_module_v2( + sqlite3 *db, /* SQLite connection to register module with */ + const char *zName, /* Name of the module */ + const sqlite3_module *p, /* Methods for the module */ + void *pClientData, /* Client data for xCreate/xConnect */ + void(*xDestroy)(void*) /* Module destructor function */ +); + +/* +** CAPI3REF: Virtual Table Instance Object +** KEYWORDS: sqlite3_vtab +** +** Every [virtual table module] implementation uses a subclass +** 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 +** 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 +** is delivered up to the client application, the string will be automatically +** freed by sqlite3_free() and the zErrMsg field will be zeroed. +*/ +struct sqlite3_vtab { + const sqlite3_module *pModule; /* The module for this virtual table */ + int nRef; /* Number of open cursors */ + char *zErrMsg; /* Error message from sqlite3_mprintf() */ + /* Virtual table implementations will typically add additional fields */ +}; + +/* +** CAPI3REF: Virtual Table Cursor Object +** KEYWORDS: sqlite3_vtab_cursor {virtual table cursor} +** +** Every [virtual table module] implementation uses a subclass of the +** following structure to describe cursors that point into the +** [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. 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. +** +** This superclass exists in order to define fields of the cursor that +** are common to all implementations. +*/ +struct sqlite3_vtab_cursor { + sqlite3_vtab *pVtab; /* Virtual table of this cursor */ + /* Virtual table implementations will typically add additional fields */ +}; + +/* +** CAPI3REF: Declare The Schema Of A Virtual Table +** +** ^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. +*/ +SQLITE_API int sqlite3_declare_vtab(sqlite3*, const char *zSQL); + +/* +** CAPI3REF: Overload A Function For A Virtual Table +** METHOD: sqlite3 +** +** ^(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.)^ +** +** ^(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 +** 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 +** by a [virtual table]. +*/ +SQLITE_API int sqlite3_overload_function(sqlite3*, const char *zFuncName, int nArg); + +/* +** The interface to the virtual-table mechanism defined above (back up +** to a comment remarkably similar to this one) is currently considered +** to be experimental. The interface might change in incompatible ways. +** If this is a problem for you, do not use the interface at this time. +** +** When the virtual-table mechanism stabilizes, we will declare the +** interface fixed, support it indefinitely, and remove this comment. +*/ + +/* +** 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()] +** and destroyed by [sqlite3_blob_close()]. +** ^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. +*/ +typedef struct sqlite3_blob sqlite3_blob; + +/* +** CAPI3REF: Open A BLOB For Incremental I/O +** METHOD: sqlite3 +** CONSTRUCTOR: sqlite3_blob +** +** ^(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;
      +** 
      )^ +** +** ^(Parameter zDb is not the filename that contains the database, but +** rather the symbolic name of the database. For attached databases, this is +** the name that appears after the AS keyword in the [ATTACH] statement. +** For the main database file, the database name is "main". For TEMP +** tables, the database name is "temp".)^ +** +** ^If the flags parameter is non-zero, then the BLOB is opened for read +** and write access. ^If the flags parameter is zero, the BLOB is opened for +** read-only access. +** +** ^(On success, [SQLITE_OK] is returned and the new [BLOB handle] is stored +** in *ppBlob. Otherwise an [error code] is returned and, unless the error +** code is SQLITE_MISUSE, *ppBlob is set to NULL.)^ ^This means that, provided +** the API is not misused, it is always safe to call [sqlite3_blob_close()] +** on *ppBlob after this function it returns. +** +** This function fails with SQLITE_ERROR if any of the following are true: +**
        +**
      • ^(Database zDb does not exist)^, +**
      • ^(Table zTable does not exist within database zDb)^, +**
      • ^(Table zTable is a WITHOUT ROWID table)^, +**
      • ^(Column zColumn does not exist)^, +**
      • ^(Row iRow is not present in the table)^, +**
      • ^(The specified column of row iRow contains a value that is not +** a TEXT or BLOB value)^, +**
      • ^(Column zColumn is part of an index, PRIMARY KEY or UNIQUE +** constraint and the blob is being opened for read/write access)^, +**
      • ^([foreign key constraints | Foreign key constraints] are enabled, +** column zColumn is part of a [child key] definition and the blob is +** being opened for read/write access)^. +**
      +** +** ^Unless it returns SQLITE_MISUSE, this function sets the +** [database connection] error code and message accessible via +** [sqlite3_errcode()] and [sqlite3_errmsg()] and related functions. +** +** A BLOB referenced by sqlite3_blob_open() may be read using the +** [sqlite3_blob_read()] interface and modified by using +** [sqlite3_blob_write()]. The [BLOB handle] can be moved to a +** different row of the same table using the [sqlite3_blob_reopen()] +** interface. However, the column, table, or database of a [BLOB handle] +** cannot be changed after the [BLOB handle] is opened. +** +** ^(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 +** an expired BLOB handle fail with a return code of [SQLITE_ABORT]. +** ^(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 +** interface. Use the [UPDATE] SQL command to change the size of a +** blob. +** +** ^The [sqlite3_bind_zeroblob()] and [sqlite3_result_zeroblob()] interfaces +** and the built-in [zeroblob] SQL function may be used to create a +** zero-filled blob to read or write using the incremental-blob interface. +** +** To avoid a resource leak, every open [BLOB handle] should eventually +** be released by a call to [sqlite3_blob_close()]. +** +** See also: [sqlite3_blob_close()], +** [sqlite3_blob_reopen()], [sqlite3_blob_read()], +** [sqlite3_blob_bytes()], [sqlite3_blob_write()]. +*/ +SQLITE_API int sqlite3_blob_open( + sqlite3*, + const char *zDb, + const char *zTable, + const char *zColumn, + sqlite3_int64 iRow, + int flags, + sqlite3_blob **ppBlob +); + +/* +** CAPI3REF: Move a BLOB Handle to a New Row +** METHOD: sqlite3_blob +** +** ^This function is used to move an existing [BLOB handle] so that it points +** to a different row of the same database table. ^The new row is identified +** by the rowid value passed as the second argument. Only the row can be +** changed. ^The database, table and column on which the blob handle is open +** remain the same. Moving an existing [BLOB handle] to a new row is +** faster than closing the existing handle and opening a new one. +** +** ^(The new row must meet the same criteria as for [sqlite3_blob_open()] - +** it must exist and there must be either a blob or text value stored in +** the nominated column.)^ ^If the new row is not present in the table, or if +** it does not contain a blob or text value, or if another error occurs, an +** SQLite error code is returned and the blob handle is considered aborted. +** ^All subsequent calls to [sqlite3_blob_read()], [sqlite3_blob_write()] or +** [sqlite3_blob_reopen()] on an aborted blob handle immediately return +** SQLITE_ABORT. ^Calling [sqlite3_blob_bytes()] on an aborted blob handle +** always returns zero. +** +** ^This function sets the database handle error code and message. +*/ +SQLITE_API int sqlite3_blob_reopen(sqlite3_blob *, sqlite3_int64); + +/* +** CAPI3REF: Close A BLOB Handle +** DESTRUCTOR: sqlite3_blob +** +** ^This function closes an open [BLOB handle]. ^(The BLOB handle is closed +** unconditionally. Even if this routine returns an error code, the +** handle is still closed.)^ +** +** ^If the blob handle being closed was opened for read-write access, and if +** the database is in auto-commit mode and there are no other open read-write +** blob handles or active write statements, the current transaction is +** committed. ^If an error occurs while committing the transaction, an error +** code is returned and the transaction rolled back. +** +** Calling this function with an argument that is not a NULL pointer or an +** open blob handle results in undefined behaviour. ^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. ^Otherwise, if this function +** is passed a valid open blob handle, the values returned by the +** sqlite3_errcode() and sqlite3_errmsg() functions are set before returning. +*/ +SQLITE_API int sqlite3_blob_close(sqlite3_blob *); + +/* +** CAPI3REF: Return The Size Of An Open BLOB +** METHOD: sqlite3_blob +** +** ^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. +** +** 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 +** been closed by [sqlite3_blob_close()]. Passing any other pointer in +** to this routine results in undefined and probably undesirable behavior. +*/ +SQLITE_API int sqlite3_blob_bytes(sqlite3_blob *); + +/* +** CAPI3REF: Read Data From A BLOB Incrementally +** METHOD: sqlite3_blob +** +** ^(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.)^ +** +** ^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) +** can be determined using the [sqlite3_blob_bytes()] interface. +** +** ^An attempt to read from an expired [BLOB handle] fails with an +** error code of [SQLITE_ABORT]. +** +** ^(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 +** been closed by [sqlite3_blob_close()]. Passing any other pointer in +** to this routine results in undefined and probably undesirable behavior. +** +** See also: [sqlite3_blob_write()]. +*/ +SQLITE_API int sqlite3_blob_read(sqlite3_blob *, void *Z, int N, int iOffset); + +/* +** CAPI3REF: Write Data Into A BLOB Incrementally +** METHOD: sqlite3_blob +** +** ^(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.)^ +** +** ^(On success, sqlite3_blob_write() returns SQLITE_OK. +** Otherwise, an [error code] or an [extended error code] is returned.)^ +** ^Unless SQLITE_MISUSE is returned, this function sets the +** [database connection] error code and message accessible via +** [sqlite3_errcode()] and [sqlite3_errmsg()] and related functions. +** +** ^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 +** 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. The size of the +** BLOB (and hence the maximum value of N+iOffset) can be determined +** using the [sqlite3_blob_bytes()] interface. ^If N or iOffset are less +** than zero [SQLITE_ERROR] is returned and no data is written. +** +** ^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. +** +** 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 +** been closed by [sqlite3_blob_close()]. Passing any other pointer in +** to this routine results in undefined and probably undesirable behavior. +** +** See also: [sqlite3_blob_read()]. +*/ +SQLITE_API int sqlite3_blob_write(sqlite3_blob *, const void *z, int n, int iOffset); + +/* +** CAPI3REF: Virtual File System Objects +** +** A virtual filesystem (VFS) is an [sqlite3_vfs] object +** that SQLite uses to interact +** with the underlying operating system. Most SQLite builds come with a +** single default VFS that is appropriate for the host computer. +** 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. +** +** ^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.)^ +*/ +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 +** +** The SQLite core uses these routines for thread +** synchronization. Though they are intended for internal +** use by SQLite, code that links against SQLite is +** permitted to use any of these routines. +** +** The SQLite source code contains multiple implementations +** of these mutex routines. An appropriate implementation +** is selected automatically at compile-time. The following +** implementations are available in the SQLite core: +** +**
        +**
      • SQLITE_MUTEX_PTHREADS +**
      • SQLITE_MUTEX_W32 +**
      • SQLITE_MUTEX_NOOP +**
      +** +** 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_PTHREADS and +** SQLITE_MUTEX_W32 implementations are appropriate for use on Unix +** and Windows. +** +** 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(). +** +** ^The sqlite3_mutex_alloc() routine allocates a new +** mutex and returns a pointer to it. ^The sqlite3_mutex_alloc() +** routine returns NULL if it is unable to allocate the requested +** mutex. The argument to sqlite3_mutex_alloc() must one of these +** integer constants: +** +**
        +**
      • SQLITE_MUTEX_FAST +**
      • SQLITE_MUTEX_RECURSIVE +**
      • SQLITE_MUTEX_STATIC_MASTER +**
      • SQLITE_MUTEX_STATIC_MEM +**
      • SQLITE_MUTEX_STATIC_OPEN +**
      • SQLITE_MUTEX_STATIC_PRNG +**
      • SQLITE_MUTEX_STATIC_LRU +**
      • SQLITE_MUTEX_STATIC_PMEM +**
      • SQLITE_MUTEX_STATIC_APP1 +**
      • SQLITE_MUTEX_STATIC_APP2 +**
      • SQLITE_MUTEX_STATIC_APP3 +**
      • SQLITE_MUTEX_STATIC_VFS1 +**
      • SQLITE_MUTEX_STATIC_VFS2 +**
      • SQLITE_MUTEX_STATIC_VFS3 +**
      +** +** ^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. 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. +** +** ^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. ^Nine 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. +** +** ^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. ^For the static +** mutex types, the same mutex is returned on every call that has +** the same type number. +** +** ^The sqlite3_mutex_free() routine deallocates a previously +** allocated dynamic mutex. Attempting to deallocate a static +** mutex results in undefined behavior. +** +** ^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 mutex other +** than an SQLITE_MUTEX_RECURSIVE more than once, the behavior is undefined. +** +** ^(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. The SQLite core only ever uses +** sqlite3_mutex_try() as an optimization so this is acceptable +** 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. +** +** ^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. +** +** See also: [sqlite3_mutex_held()] and [sqlite3_mutex_notheld()]. +*/ +SQLITE_API sqlite3_mutex *sqlite3_mutex_alloc(int); +SQLITE_API void sqlite3_mutex_free(sqlite3_mutex*); +SQLITE_API void sqlite3_mutex_enter(sqlite3_mutex*); +SQLITE_API int sqlite3_mutex_try(sqlite3_mutex*); +SQLITE_API void sqlite3_mutex_leave(sqlite3_mutex*); + +/* +** CAPI3REF: Mutex Methods Object +** +** An instance of this structure defines the low-level routines +** used to allocate and use mutexes. +** +** Usually, the default mutex implementations provided by SQLite are +** sufficient, however the application has the option of substituting a custom +** implementation for specialized deployments or systems for which SQLite +** does not provide a suitable implementation. In this case, the application +** creates and populates an instance of this structure to pass +** to sqlite3_config() along with the [SQLITE_CONFIG_MUTEX] option. +** Additionally, an instance of this structure can be used as an +** 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 +** part of system initialization by the sqlite3_initialize() function. +** ^The xMutexInit routine is called by SQLite exactly once for each +** effective call to [sqlite3_initialize()]. +** +** ^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. ^The xMutexEnd() +** interface is invoked exactly once for each call to [sqlite3_shutdown()]. +** +** ^(The remaining seven methods defined by this structure (xMutexAlloc, +** xMutexFree, xMutexEnter, xMutexTry, xMutexLeave, xMutexHeld and +** xMutexNotheld) implement the following interfaces (respectively): +** +**
        +**
      • [sqlite3_mutex_alloc()]
      • +**
      • [sqlite3_mutex_free()]
      • +**
      • [sqlite3_mutex_enter()]
      • +**
      • [sqlite3_mutex_try()]
      • +**
      • [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 +** of a valid mutex handle. The implementations of the methods defined +** by this structure are not required to handle this case, the results +** of passing a NULL pointer instead of a valid mutex handle are undefined +** (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 +** invoke xMutexInit() multiple 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 +** memory allocation for a fast or recursive mutex. +** +** ^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. +*/ +typedef struct sqlite3_mutex_methods sqlite3_mutex_methods; +struct sqlite3_mutex_methods { + int (*xMutexInit)(void); + int (*xMutexEnd)(void); + sqlite3_mutex *(*xMutexAlloc)(int); + void (*xMutexFree)(sqlite3_mutex *); + void (*xMutexEnter)(sqlite3_mutex *); + int (*xMutexTry)(sqlite3_mutex *); + void (*xMutexLeave)(sqlite3_mutex *); + int (*xMutexHeld)(sqlite3_mutex *); + int (*xMutexNotheld)(sqlite3_mutex *); +}; + +/* +** CAPI3REF: Mutex Verification Routines +** +** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routines +** 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. The SQLite core only +** provides implementations for these routines when it is compiled +** 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. +** +** These routines should return true if the mutex in their argument +** is held or not held, respectively, by the calling thread. +** +** The implementation is not required to provide 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. +** +** 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 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. 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 +** +** The [sqlite3_mutex_alloc()] interface takes a single argument +** which is one of these integer constants. +** +** The set of static mutexes may change from one SQLite release to the +** next. Applications that override the built-in mutex logic must be +** prepared to accommodate additional static mutexes. +*/ +#define SQLITE_MUTEX_FAST 0 +#define SQLITE_MUTEX_RECURSIVE 1 +#define SQLITE_MUTEX_STATIC_MASTER 2 +#define SQLITE_MUTEX_STATIC_MEM 3 /* sqlite3_malloc() */ +#define SQLITE_MUTEX_STATIC_MEM2 4 /* NOT USED */ +#define SQLITE_MUTEX_STATIC_OPEN 4 /* sqlite3BtreeOpen() */ +#define SQLITE_MUTEX_STATIC_PRNG 5 /* sqlite3_randomness() */ +#define SQLITE_MUTEX_STATIC_LRU 6 /* lru page list */ +#define SQLITE_MUTEX_STATIC_LRU2 7 /* NOT USED */ +#define SQLITE_MUTEX_STATIC_PMEM 7 /* sqlite3PageMalloc() */ +#define SQLITE_MUTEX_STATIC_APP1 8 /* For use by application */ +#define SQLITE_MUTEX_STATIC_APP2 9 /* For use by application */ +#define SQLITE_MUTEX_STATIC_APP3 10 /* For use by application */ +#define SQLITE_MUTEX_STATIC_VFS1 11 /* For use by built-in VFS */ +#define SQLITE_MUTEX_STATIC_VFS2 12 /* For use by extension VFS */ +#define SQLITE_MUTEX_STATIC_VFS3 13 /* For use by application VFS */ + +/* +** CAPI3REF: Retrieve the mutex for a database connection +** METHOD: sqlite3 +** +** ^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 +** routine returns a NULL pointer. +*/ +SQLITE_API sqlite3_mutex *sqlite3_db_mutex(sqlite3*); + +/* +** CAPI3REF: Low-Level Control Of Database Files +** METHOD: sqlite3 +** +** ^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. ^The +** name of the database is "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. ^The return value of the xFileControl +** method becomes the return value of this routine. +** +** ^The [SQLITE_FCNTL_FILE_POINTER] value for the op parameter causes +** a pointer to the underlying [sqlite3_file] object to be written into +** the space pointed to by the 4th parameter. ^The [SQLITE_FCNTL_FILE_POINTER] +** case is a short-circuit path which does not actually invoke the +** underlying sqlite3_io_methods.xFileControl method. +** +** ^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()]. 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. +** +** See also: [file control opcodes] +*/ +SQLITE_API int sqlite3_file_control(sqlite3*, const char *zDbName, int op, void*); + +/* +** CAPI3REF: Testing Interface +** +** ^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 +** the number, meaning, and operation of all subsequent parameters. +** +** This interface is not for use by applications. It exists solely +** for verifying the correct operation of the SQLite library. Depending +** on how the SQLite library is compiled, this interface might not exist. +** +** The details of the operation codes, their meanings, the parameters +** they take, and what they do are all subject to change without notice. +** Unlike most of the SQLite API, this function is not guaranteed to +** operate consistently from one release to the next. +*/ +SQLITE_API int sqlite3_test_control(int op, ...); + +/* +** CAPI3REF: Testing Interface Operation Codes +** +** These constants are the valid operation code parameters used +** as the first argument to [sqlite3_test_control()]. +** +** These parameters and their meanings are subject to change +** without notice. These values are for testing purposes only. +** 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 +#define SQLITE_TESTCTRL_BITVEC_TEST 8 +#define SQLITE_TESTCTRL_FAULT_INSTALL 9 +#define SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS 10 +#define SQLITE_TESTCTRL_PENDING_BYTE 11 +#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_SCRATCHMALLOC 17 /* NOT USED */ +#define SQLITE_TESTCTRL_LOCALTIME_FAULT 18 +#define SQLITE_TESTCTRL_EXPLAIN_STMT 19 /* NOT USED */ +#define SQLITE_TESTCTRL_ONCE_RESET_THRESHOLD 19 +#define SQLITE_TESTCTRL_NEVER_CORRUPT 20 +#define SQLITE_TESTCTRL_VDBE_COVERAGE 21 +#define SQLITE_TESTCTRL_BYTEORDER 22 +#define SQLITE_TESTCTRL_ISINIT 23 +#define SQLITE_TESTCTRL_SORTER_MMAP 24 +#define SQLITE_TESTCTRL_IMPOSTER 25 +#define SQLITE_TESTCTRL_PARSER_COVERAGE 26 +#define SQLITE_TESTCTRL_LAST 26 /* Largest TESTCTRL */ + +/* +** CAPI3REF: SQLite Runtime Status +** +** ^These interfaces are used to retrieve runtime status information +** about the performance 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 [status parameters | 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 +** 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.)^ +** +** ^The sqlite3_status() and sqlite3_status64() routines return +** SQLITE_OK on success and a non-zero [error code] on failure. +** +** If either the current value or the highwater mark is too large to +** be represented by a 32-bit integer, then the values returned by +** sqlite3_status() are undefined. +** +** See also: [sqlite3_db_status()] +*/ +SQLITE_API int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetFlag); +SQLITE_API int sqlite3_status64( + int op, + sqlite3_int64 *pCurrent, + sqlite3_int64 *pHighwater, + int resetFlag +); + + +/* +** CAPI3REF: Status Parameters +** KEYWORDS: {status parameters} +** +** 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 +** and internal memory usage by the SQLite library. 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].
      )^ +** +** [[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.
      )^ +** +** [[SQLITE_STATUS_MALLOC_COUNT]] ^(
      SQLITE_STATUS_MALLOC_COUNT
      +**
      This parameter records the number of separate memory allocations +** currently checked out.
      )^ +** +** [[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.
      )^ +** +** [[SQLITE_STATUS_PAGECACHE_OVERFLOW]] +** ^(
      SQLITE_STATUS_PAGECACHE_OVERFLOW
      +**
      This parameter returns the number of bytes of page cache +** allocation which could not be satisfied 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.
      )^ +** +** [[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.
      )^ +** +** [[SQLITE_STATUS_SCRATCH_USED]]
      SQLITE_STATUS_SCRATCH_USED
      +**
      No longer used.
      +** +** [[SQLITE_STATUS_SCRATCH_OVERFLOW]] ^(
      SQLITE_STATUS_SCRATCH_OVERFLOW
      +**
      No longer used.
      +** +** [[SQLITE_STATUS_SCRATCH_SIZE]]
      SQLITE_STATUS_SCRATCH_SIZE
      +**
      No longer used.
      +** +** [[SQLITE_STATUS_PARSER_STACK]] ^(
      SQLITE_STATUS_PARSER_STACK
      +**
      The *pHighwater parameter records the deepest parser stack. +** The *pCurrent value is undefined. The *pHighwater value is only +** meaningful if SQLite is compiled with [YYTRACKMAXSTACKDEPTH].
      )^ +**
      +** +** New status parameters may be added from time to time. +*/ +#define SQLITE_STATUS_MEMORY_USED 0 +#define SQLITE_STATUS_PAGECACHE_USED 1 +#define SQLITE_STATUS_PAGECACHE_OVERFLOW 2 +#define SQLITE_STATUS_SCRATCH_USED 3 /* NOT USED */ +#define SQLITE_STATUS_SCRATCH_OVERFLOW 4 /* NOT USED */ +#define SQLITE_STATUS_MALLOC_SIZE 5 +#define SQLITE_STATUS_PARSER_STACK 6 +#define SQLITE_STATUS_PAGECACHE_SIZE 7 +#define SQLITE_STATUS_SCRATCH_SIZE 8 /* NOT USED */ +#define SQLITE_STATUS_MALLOC_COUNT 9 + +/* +** CAPI3REF: Database Connection Status +** METHOD: sqlite3 +** +** ^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 an integer constant, taken from the set of +** [SQLITE_DBSTATUS options], that +** determines the parameter to interrogate. The set of +** [SQLITE_DBSTATUS options] is likely +** to grow 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 resetFlg is true, then the highest instantaneous value is +** reset back down to the current value. +** +** ^The sqlite3_db_status() routine returns SQLITE_OK on success and a +** non-zero [error code] on failure. +** +** See also: [sqlite3_status()] and [sqlite3_stmt_status()]. +*/ +SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int resetFlg); + +/* +** CAPI3REF: Status Parameters for database connections +** KEYWORDS: {SQLITE_DBSTATUS options} +** +** These constants are the available integer "verbs" that can be passed as +** the second argument to the [sqlite3_db_status()] interface. +** +** New verbs may be added in future releases of SQLite. Existing verbs +** might be discontinued. Applications should check the return code from +** [sqlite3_db_status()] to make sure that the call worked. +** The [sqlite3_db_status()] interface will return a non-zero error code +** 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.
      )^ +** +** [[SQLITE_DBSTATUS_LOOKASIDE_HIT]] ^(
      SQLITE_DBSTATUS_LOOKASIDE_HIT
      +**
      This parameter returns the number malloc attempts that were +** satisfied using lookaside memory. Only the high-water value is meaningful; +** the current value is always zero.)^ +** +** [[SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE]] +** ^(
      SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE
      +**
      This parameter returns the number malloc attempts that might have +** been satisfied using lookaside memory but failed due to the amount of +** memory requested being larger than the lookaside slot size. +** Only the high-water value is meaningful; +** the current value is always zero.)^ +** +** [[SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL]] +** ^(
      SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL
      +**
      This parameter returns the number malloc attempts that might have +** been satisfied using lookaside memory but failed due to all lookaside +** memory already being in use. +** Only the high-water value is meaningful; +** the current value is always zero.)^ +** +** [[SQLITE_DBSTATUS_CACHE_USED]] ^(
      SQLITE_DBSTATUS_CACHE_USED
      +**
      This parameter returns the approximate number of bytes of heap +** memory used by all pager caches associated with the database connection.)^ +** ^The highwater mark associated with SQLITE_DBSTATUS_CACHE_USED is always 0. +** +** [[SQLITE_DBSTATUS_CACHE_USED_SHARED]] +** ^(
      SQLITE_DBSTATUS_CACHE_USED_SHARED
      +**
      This parameter is similar to DBSTATUS_CACHE_USED, except that if a +** pager cache is shared between two or more connections the bytes of heap +** memory used by that pager cache is divided evenly between the attached +** connections.)^ In other words, if none of the pager caches associated +** with the database connection are shared, this request returns the same +** value as DBSTATUS_CACHE_USED. Or, if one or more or the pager caches are +** shared, the value returned by this call will be smaller than that returned +** by DBSTATUS_CACHE_USED. ^The highwater mark associated with +** SQLITE_DBSTATUS_CACHE_USED_SHARED is always 0. +** +** [[SQLITE_DBSTATUS_SCHEMA_USED]] ^(
      SQLITE_DBSTATUS_SCHEMA_USED
      +**
      This parameter returns the approximate number of bytes of heap +** memory used to store the schema for all databases associated +** with the connection - main, temp, and any [ATTACH]-ed databases.)^ +** ^The full amount of memory used by the schemas is reported, even if the +** schema memory is shared with other database connections due to +** [shared cache mode] being enabled. +** ^The highwater mark associated with SQLITE_DBSTATUS_SCHEMA_USED is always 0. +** +** [[SQLITE_DBSTATUS_STMT_USED]] ^(
      SQLITE_DBSTATUS_STMT_USED
      +**
      This parameter returns the approximate number of bytes of heap +** and lookaside memory used by all prepared statements associated with +** the database connection.)^ +** ^The highwater mark associated with SQLITE_DBSTATUS_STMT_USED is always 0. +**
      +** +** [[SQLITE_DBSTATUS_CACHE_HIT]] ^(
      SQLITE_DBSTATUS_CACHE_HIT
      +**
      This parameter returns the number of pager cache hits that have +** occurred.)^ ^The highwater mark associated with SQLITE_DBSTATUS_CACHE_HIT +** is always 0. +**
      +** +** [[SQLITE_DBSTATUS_CACHE_MISS]] ^(
      SQLITE_DBSTATUS_CACHE_MISS
      +**
      This parameter returns the number of pager cache misses that have +** occurred.)^ ^The highwater mark associated with SQLITE_DBSTATUS_CACHE_MISS +** is always 0. +**
      +** +** [[SQLITE_DBSTATUS_CACHE_WRITE]] ^(
      SQLITE_DBSTATUS_CACHE_WRITE
      +**
      This parameter returns the number of dirty cache entries that have +** been written to disk. Specifically, the number of pages written to the +** wal file in wal mode databases, or the number of pages written to the +** database file in rollback mode databases. Any pages written as part of +** transaction rollback or database recovery operations are not included. +** If an IO or other error occurs while writing a page to disk, the effect +** on subsequent SQLITE_DBSTATUS_CACHE_WRITE requests is undefined.)^ ^The +** highwater mark associated with SQLITE_DBSTATUS_CACHE_WRITE is always 0. +**
      +** +** [[SQLITE_DBSTATUS_DEFERRED_FKS]] ^(
      SQLITE_DBSTATUS_DEFERRED_FKS
      +**
      This parameter returns zero for the current value if and only if +** all foreign key constraints (deferred or immediate) have been +** resolved.)^ ^The highwater mark is always 0. +**
      +**
      +*/ +#define SQLITE_DBSTATUS_LOOKASIDE_USED 0 +#define SQLITE_DBSTATUS_CACHE_USED 1 +#define SQLITE_DBSTATUS_SCHEMA_USED 2 +#define SQLITE_DBSTATUS_STMT_USED 3 +#define SQLITE_DBSTATUS_LOOKASIDE_HIT 4 +#define SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE 5 +#define SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL 6 +#define SQLITE_DBSTATUS_CACHE_HIT 7 +#define SQLITE_DBSTATUS_CACHE_MISS 8 +#define SQLITE_DBSTATUS_CACHE_WRITE 9 +#define SQLITE_DBSTATUS_DEFERRED_FKS 10 +#define SQLITE_DBSTATUS_CACHE_USED_SHARED 11 +#define SQLITE_DBSTATUS_MAX 11 /* Largest defined DBSTATUS */ + + +/* +** CAPI3REF: Prepared Statement Status +** METHOD: sqlite3_stmt +** +** ^(Each prepared statement maintains various +** [SQLITE_STMTSTATUS counters] that measure the number +** 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 +** 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 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 +** interface call returns. +** +** See also: [sqlite3_status()] and [sqlite3_db_status()]. +*/ +SQLITE_API int sqlite3_stmt_status(sqlite3_stmt*, int op,int resetFlg); + +/* +** CAPI3REF: Status Parameters for prepared statements +** KEYWORDS: {SQLITE_STMTSTATUS counter} {SQLITE_STMTSTATUS counters} +** +** These preprocessor macros define integer codes that name counter +** values associated with the [sqlite3_stmt_status()] interface. +** The meanings of the various counters are as follows: +** +**
      +** [[SQLITE_STMTSTATUS_FULLSCAN_STEP]]
      SQLITE_STMTSTATUS_FULLSCAN_STEP
      +**
      ^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]]
      SQLITE_STMTSTATUS_SORT
      +**
      ^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.
      +** +** [[SQLITE_STMTSTATUS_AUTOINDEX]]
      SQLITE_STMTSTATUS_AUTOINDEX
      +**
      ^This is the number of rows inserted into transient indices that +** were created automatically in order to help joins run faster. +** A non-zero value in this counter may indicate an opportunity to +** improvement performance by adding permanent indices that do not +** need to be reinitialized each time the statement is run.
      +** +** [[SQLITE_STMTSTATUS_VM_STEP]]
      SQLITE_STMTSTATUS_VM_STEP
      +**
      ^This is the number of virtual machine operations executed +** by the prepared statement if that number is less than or equal +** to 2147483647. The number of virtual machine operations can be +** used as a proxy for the total work done by the prepared statement. +** If the number of virtual machine operations exceeds 2147483647 +** then the value returned by this statement status code is undefined. +** +** [[SQLITE_STMTSTATUS_REPREPARE]]
      SQLITE_STMTSTATUS_REPREPARE
      +**
      ^This is the number of times that the prepare statement has been +** automatically regenerated due to schema changes or change to +** [bound parameters] that might affect the query plan. +** +** [[SQLITE_STMTSTATUS_RUN]]
      SQLITE_STMTSTATUS_RUN
      +**
      ^This is the number of times that the prepared statement has +** been run. A single "run" for the purposes of this counter is one +** or more calls to [sqlite3_step()] followed by a call to [sqlite3_reset()]. +** The counter is incremented on the first [sqlite3_step()] call of each +** cycle. +** +** [[SQLITE_STMTSTATUS_MEMUSED]]
      SQLITE_STMTSTATUS_MEMUSED
      +**
      ^This is the approximate number of bytes of heap memory +** used to store the prepared statement. ^This value is not actually +** a counter, and so the resetFlg parameter to sqlite3_stmt_status() +** is ignored when the opcode is SQLITE_STMTSTATUS_MEMUSED. +**
      +**
      +*/ +#define SQLITE_STMTSTATUS_FULLSCAN_STEP 1 +#define SQLITE_STMTSTATUS_SORT 2 +#define SQLITE_STMTSTATUS_AUTOINDEX 3 +#define SQLITE_STMTSTATUS_VM_STEP 4 +#define SQLITE_STMTSTATUS_REPREPARE 5 +#define SQLITE_STMTSTATUS_RUN 6 +#define SQLITE_STMTSTATUS_MEMUSED 99 + +/* +** CAPI3REF: Custom Page Cache Object +** +** The sqlite3_pcache type is opaque. It is implemented by +** the pluggable module. The SQLite core has no knowledge of +** its size or internal structure and never deals with the +** sqlite3_pcache object except by holding and passing pointers +** to the object. +** +** See [sqlite3_pcache_methods2] for additional information. +*/ +typedef struct sqlite3_pcache sqlite3_pcache; + +/* +** CAPI3REF: Custom Page Cache Object +** +** The sqlite3_pcache_page object represents a single page in the +** page cache. The page cache will allocate instances of this +** object. Various methods of the page cache use pointers to instances +** of this object as parameters or as their return value. +** +** See [sqlite3_pcache_methods2] for additional information. +*/ +typedef struct sqlite3_pcache_page sqlite3_pcache_page; +struct sqlite3_pcache_page { + void *pBuf; /* The content of the page */ + void *pExtra; /* Extra information associated with the page */ +}; + +/* +** CAPI3REF: Application Defined Page Cache. +** KEYWORDS: {page cache} +** +** ^(The [sqlite3_config]([SQLITE_CONFIG_PCACHE2], ...) interface can +** register an alternative page cache implementation by passing in an +** instance of the sqlite3_pcache_methods2 structure.)^ +** In many applications, most of the heap memory allocated by +** SQLite is used for the page cache. +** By implementing a +** custom page cache using this API, an application can better control +** the amount of memory consumed by SQLite, the way in which +** that memory is allocated and released, and the policies used to +** determine exactly which parts of a database file are cached and for +** how long. +** +** The alternative page cache mechanism is an +** extreme measure that is only needed by the most demanding applications. +** The built-in page cache is recommended for most uses. +** +** ^(The contents of the sqlite3_pcache_methods2 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.)^ +** +** [[the xInit() page cache method]] +** ^(The xInit() method is called once for each effective +** call to [sqlite3_initialize()])^ +** (usually only once during the lifetime of the process). ^(The xInit() +** method is passed a copy of the sqlite3_pcache_methods2.pArg value.)^ +** The intent of the xInit() method is to set up global data structures +** required by the custom page cache implementation. +** ^(If the xInit() method is NULL, then the +** built-in default page cache is used instead of the application defined +** page cache.)^ +** +** [[the xShutdown() page cache method]] +** ^The xShutdown() method is called by [sqlite3_shutdown()]. +** It can be used to clean up +** any outstanding resources before process shutdown, if required. +** ^The xShutdown() method may be NULL. +** +** ^SQLite automatically serializes calls to 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 +** call to xShutdown(). +** +** [[the xCreate() page cache methods]] +** ^SQLite invokes the xCreate() method to construct a new cache instance. +** SQLite will typically create one cache instance for each open database file, +** 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 always a power of two. ^The +** second parameter szExtra is a number of bytes of extra storage +** associated with each page cache entry. ^The szExtra parameter will +** a number less than 250. SQLite will use the +** extra szExtra bytes on each page to store metadata about the underlying +** database page on disk. The value passed into szExtra depends +** on the SQLite version, the target platform, and how SQLite was compiled. +** ^The third 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 +** 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 +** never invoke xUnpin() except to deliberately delete a page. +** ^In other words, calls to xUnpin() on a cache with bPurgeable set to +** false will always have the "discard" flag set to true. +** ^Hence, a cache created with bPurgeable false will +** never contain any unpinned pages. +** +** [[the xCachesize() page cache method]] +** ^(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 +** value; it is advisory only. +** +** [[the xPagecount() page cache methods]] +** The xPagecount() method must return the number of pages currently +** stored in the cache, both pinned and unpinned. +** +** [[the xFetch() page cache methods]] +** The xFetch() method locates a page in the cache and returns a pointer to +** an sqlite3_pcache_page object associated with that page, or a NULL pointer. +** The pBuf element of the returned sqlite3_pcache_page object will be a +** pointer to a buffer of szPage bytes used to store the content of a +** single database page. The pExtra element of sqlite3_pcache_page will be +** a pointer to the szExtra bytes of extra storage that SQLite has requested +** for each entry in the page cache. +** +** The page to be fetched is determined by the key. ^The minimum 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 +** 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 +** cache implementation should use the value of the createFlag +** parameter to help it determined what action to take: +** +** +**
      createFlag Behavior when page is not already in cache +**
      0 Do not allocate a new page. Return NULL. +**
      1 Allocate a new page if it easy and convenient to do so. +** 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. SQLite +** will only use a createFlag of 2 after a prior call with a createFlag of 1 +** failed.)^ In between the to xFetch() calls, SQLite may +** attempt to unpin one or more cache pages by spilling the content of +** pinned pages to disk and synching the operating system disk cache. +** +** [[the xUnpin() page cache method]] +** ^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 must be evicted from the cache. +** ^If the discard parameter is +** zero, then the page may be discarded or retained at the discretion of +** page cache implementation. ^The page cache implementation +** may choose to evict unpinned pages at any time. +** +** The cache must not perform any reference counting. A single +** call to xUnpin() unpins the page regardless of the number of prior calls +** to xFetch(). +** +** [[the xRekey() page cache methods]] +** The xRekey() method is used to change the key value associated with the +** page passed as the second argument. If the cache +** previously contains an entry associated with newKey, it must be +** 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 +** existing cache entries with page numbers (keys) greater than or equal +** 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() page cache method]] +** ^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_methods2 +** functions. +** +** [[the xShrink() page cache method]] +** ^SQLite invokes the xShrink() method when it wants the page cache to +** free up as much of heap memory as possible. The page cache implementation +** is not obligated to free any memory, but well-behaved implementations should +** do their best. +*/ +typedef struct sqlite3_pcache_methods2 sqlite3_pcache_methods2; +struct sqlite3_pcache_methods2 { + int iVersion; + void *pArg; + int (*xInit)(void*); + void (*xShutdown)(void*); + sqlite3_pcache *(*xCreate)(int szPage, int szExtra, int bPurgeable); + void (*xCachesize)(sqlite3_pcache*, int nCachesize); + int (*xPagecount)(sqlite3_pcache*); + sqlite3_pcache_page *(*xFetch)(sqlite3_pcache*, unsigned key, int createFlag); + void (*xUnpin)(sqlite3_pcache*, sqlite3_pcache_page*, int discard); + void (*xRekey)(sqlite3_pcache*, sqlite3_pcache_page*, + unsigned oldKey, unsigned newKey); + void (*xTruncate)(sqlite3_pcache*, unsigned iLimit); + void (*xDestroy)(sqlite3_pcache*); + void (*xShrink)(sqlite3_pcache*); +}; + +/* +** This is the obsolete pcache_methods object that has now been replaced +** by sqlite3_pcache_methods2. This object is not used by SQLite. It is +** retained in the header file for backwards compatibility only. +*/ +typedef struct sqlite3_pcache_methods sqlite3_pcache_methods; +struct sqlite3_pcache_methods { + void *pArg; + int (*xInit)(void*); + void (*xShutdown)(void*); + sqlite3_pcache *(*xCreate)(int szPage, int bPurgeable); + void (*xCachesize)(sqlite3_pcache*, int nCachesize); + int (*xPagecount)(sqlite3_pcache*); + void *(*xFetch)(sqlite3_pcache*, unsigned key, int createFlag); + void (*xUnpin)(sqlite3_pcache*, void*, int discard); + void (*xRekey)(sqlite3_pcache*, void*, unsigned oldKey, unsigned newKey); + void (*xTruncate)(sqlite3_pcache*, unsigned iLimit); + void (*xDestroy)(sqlite3_pcache*); +}; + + +/* +** CAPI3REF: Online Backup Object +** +** The sqlite3_backup object records state information about an ongoing +** 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()]. +** +** See Also: [Using the SQLite Online Backup API] +*/ +typedef struct sqlite3_backup sqlite3_backup; + +/* +** CAPI3REF: Online Backup API. +** +** 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] +** +** ^SQLite holds a write transaction open on the destination database file +** for the duration of the backup operation. +** ^The source database is read-locked only while it is 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 database connections from +** reading or writing to the source database while the backup is underway. +** +** ^(To perform a backup operation: +**
        +**
      1. sqlite3_backup_init() is called once to initialize the +** backup, +**
      2. sqlite3_backup_step() is called one or more times to transfer +** the data between the two databases, and finally +**
      3. 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()]] sqlite3_backup_init() +** +** ^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 fail with +** an error. +** +** ^A call to sqlite3_backup_init() will fail, returning NULL, if +** there is already a read or read-write transaction open on the +** destination database. +** +** ^If an error occurs within sqlite3_backup_init(D,N,S,M), then NULL is +** returned and an error code and error message are stored 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()]] sqlite3_backup_step() +** +** ^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 returns [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. +** +** ^(The sqlite3_backup_step() might return [SQLITE_READONLY] if +**
        +**
      1. the destination database was opened read-only, or +**
      2. the destination database is using write-ahead-log journaling +** and the destination and source page sizes differ, or +**
      3. the destination database is an in-memory database and the +** destination and source page sizes differ. +**
      )^ +** +** ^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 +** 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 +** [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 +** [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.)^ 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. +** +** ^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]. ^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 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 automatically +** updated at the same time. +** +** [[sqlite3_backup_finish()]] sqlite3_backup_finish() +** +** 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 +** 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()]] +** sqlite3_backup_remaining() and sqlite3_backup_pagecount() +** +** ^The sqlite3_backup_remaining() routine returns the number of pages still +** to be backed up at the conclusion of the most recent sqlite3_backup_step(). +** ^The sqlite3_backup_pagecount() routine returns the total number of pages +** in the source database at the conclusion of the most recent +** sqlite3_backup_step(). +** ^(The values returned by these functions are only updated by +** sqlite3_backup_step(). If the source database is modified in a way that +** changes the size of the source database or the number of pages remaining, +** those changes are not reflected in the output of sqlite3_backup_pagecount() +** and sqlite3_backup_remaining() until after the next +** sqlite3_backup_step().)^ +** +** Concurrent Usage of Database Handles +** +** ^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 +** connections, then the source database connection may be used concurrently +** from within other threads. +** +** 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(). 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 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(). +** +** The [sqlite3_backup] object itself is partially threadsafe. Multiple +** threads may safely make multiple concurrent calls to sqlite3_backup_step(). +** However, the sqlite3_backup_remaining() and sqlite3_backup_pagecount() +** APIs are not strictly speaking threadsafe. If they are invoked at the +** same time as another thread is invoking sqlite3_backup_step() it is +** possible that they return invalid values. +*/ +SQLITE_API sqlite3_backup *sqlite3_backup_init( + sqlite3 *pDest, /* Destination database handle */ + const char *zDestName, /* Destination database name */ + sqlite3 *pSource, /* Source database handle */ + const char *zSourceName /* Source database name */ +); +SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage); +SQLITE_API int sqlite3_backup_finish(sqlite3_backup *p); +SQLITE_API int sqlite3_backup_remaining(sqlite3_backup *p); +SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p); + +/* +** CAPI3REF: Unlock Notification +** METHOD: sqlite3 +** +** ^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 +** when the connection currently holding the required lock relinquishes it. +** ^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 +** its current transaction, either by committing it or rolling it back. +** +** ^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 +** 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 +** 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, +** 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().)^ +** +** ^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 +** 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 +** called with a NULL pointer as its second argument, then any existing +** unlock-notify callback is canceled. ^The blocked connections +** unlock-notify callback may also be canceled by closing the blocked +** connection using [sqlite3_close()]. +** +** The unlock-notify callback is not reentrant. If an application invokes +** 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 +** returns SQLITE_OK. +** +** Callback Invocation Details +** +** When an unlock-notify callback is registered, the application provides a +** single void* pointer that is passed to the callback when it is invoked. +** However, the signature of the callback function allows SQLite to pass +** it an array of void* context pointers. The first argument passed to +** an unlock-notify callback is a pointer to an array of void* pointers, +** and the second is the number of entries in the array. +** +** 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 +** 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. +** This gives the application an opportunity to prioritize any actions +** related to the set of unblocked database connections. +** +** Deadlock Detection +** +** Assuming that after registering for an unlock-notify callback a +** database waits for the callback to be issued before taking any further +** action (a reasonable assumption), then using this API may cause the +** application to deadlock. For example, if connection X is waiting for +** connection Y's transaction to be concluded, and similarly connection +** Y is waiting on connection X's transaction, then neither connection +** 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 +** 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 +** 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 +** number of levels of indirection are allowed. +** +** The "DROP TABLE" Exception +** +** When a call to [sqlite3_step()] returns SQLITE_LOCKED, it is almost +** always appropriate to call sqlite3_unlock_notify(). There is however, +** one exception. When executing a "DROP TABLE" or "DROP INDEX" statement, +** SQLite checks if there are any currently executing SELECT statements +** that belong to the same connection. If there are, SQLITE_LOCKED is +** returned. In this case there is no "blocking connection", so invoking +** sqlite3_unlock_notify() results in the unlock-notify callback being +** invoked immediately. If the application then re-attempts the "DROP TABLE" +** 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 +** 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_API int sqlite3_unlock_notify( + sqlite3 *pBlocked, /* Waiting connection */ + void (*xNotify)(void **apArg, int nArg), /* Callback function to invoke */ + void *pNotifyArg /* Argument to pass to xNotify */ +); + + +/* +** CAPI3REF: String Comparison +** +** ^The [sqlite3_stricmp()] and [sqlite3_strnicmp()] APIs allow applications +** and extensions to compare the contents of two buffers containing UTF-8 +** strings in a case-independent fashion, using the same definition of "case +** independence" that SQLite uses internally when comparing identifiers. +*/ +SQLITE_API int sqlite3_stricmp(const char *, const char *); +SQLITE_API int sqlite3_strnicmp(const char *, const char *, int); + +/* +** CAPI3REF: String Globbing +* +** ^The [sqlite3_strglob(P,X)] interface returns zero if and only if +** string X matches the [GLOB] pattern P. +** ^The definition of [GLOB] pattern matching used in +** [sqlite3_strglob(P,X)] is the same as for the "X GLOB P" operator in the +** SQL dialect understood by SQLite. ^The [sqlite3_strglob(P,X)] function +** is case sensitive. +** +** Note that this routine returns zero on a match and non-zero if the strings +** do not match, the same as [sqlite3_stricmp()] and [sqlite3_strnicmp()]. +** +** See also: [sqlite3_strlike()]. +*/ +SQLITE_API int sqlite3_strglob(const char *zGlob, const char *zStr); + +/* +** CAPI3REF: String LIKE Matching +* +** ^The [sqlite3_strlike(P,X,E)] interface returns zero if and only if +** string X matches the [LIKE] pattern P with escape character E. +** ^The definition of [LIKE] pattern matching used in +** [sqlite3_strlike(P,X,E)] is the same as for the "X LIKE P ESCAPE E" +** operator in the SQL dialect understood by SQLite. ^For "X LIKE P" without +** the ESCAPE clause, set the E parameter of [sqlite3_strlike(P,X,E)] to 0. +** ^As with the LIKE operator, the [sqlite3_strlike(P,X,E)] function is case +** insensitive - equivalent upper and lower case ASCII characters match +** one another. +** +** ^The [sqlite3_strlike(P,X,E)] function matches Unicode characters, though +** only ASCII characters are case folded. +** +** Note that this routine returns zero on a match and non-zero if the strings +** do not match, the same as [sqlite3_stricmp()] and [sqlite3_strnicmp()]. +** +** See also: [sqlite3_strglob()]. +*/ +SQLITE_API int sqlite3_strlike(const char *zGlob, const char *zStr, unsigned int cEsc); + +/* +** CAPI3REF: Error Logging Interface +** +** ^The [sqlite3_log()] interface writes a message into the [error log] +** established by the [SQLITE_CONFIG_LOG] option to [sqlite3_config()]. +** ^If logging is enabled, the zFormat string and subsequent arguments are +** used with [sqlite3_snprintf()] to generate the final output string. +** +** The sqlite3_log() interface is intended for use by extensions such as +** virtual tables, collating functions, and SQL functions. While there is +** nothing to prevent an application from calling sqlite3_log(), doing so +** is considered bad form. +** +** The zFormat string must not be NULL. +** +** To avoid deadlocks and other threading problems, the sqlite3_log() routine +** will not use dynamically allocated memory. The log message is stored in +** a fixed-length buffer on the stack. If the log message is longer than +** a few hundred characters, it will be truncated to the length of the +** buffer. +*/ +SQLITE_API void sqlite3_log(int iErrCode, const char *zFormat, ...); + +/* +** CAPI3REF: Write-Ahead Log Commit Hook +** METHOD: sqlite3 +** +** ^The [sqlite3_wal_hook()] function is used to register a callback that +** is invoked each time data is committed to a database in wal mode. +** +** ^(The callback is invoked by SQLite after the commit has taken place and +** the associated write-lock on the database released)^, so the implementation +** may read, write or [checkpoint] the database as required. +** +** ^The first parameter passed to the callback function when it is invoked +** is a copy of the third parameter passed to sqlite3_wal_hook() when +** registering the callback. ^The second is a copy of the database handle. +** ^The third parameter is the name of the database that was written to - +** either "main" or the name of an [ATTACH]-ed database. ^The fourth parameter +** is the number of pages currently in the write-ahead log file, +** including those that were just committed. +** +** The callback function should normally return [SQLITE_OK]. ^If an error +** code is returned, that error will propagate back up through the +** SQLite code base to cause the statement that provoked the callback +** to report an error, though the commit will have still occurred. If the +** callback returns [SQLITE_ROW] or [SQLITE_DONE], or if it returns a value +** that does not correspond to any valid SQLite error code, the results +** are undefined. +** +** A single database handle may have at most a single write-ahead log callback +** registered at one time. ^Calling [sqlite3_wal_hook()] replaces any +** previously registered write-ahead log callback. ^Note that the +** [sqlite3_wal_autocheckpoint()] interface and the +** [wal_autocheckpoint pragma] both invoke [sqlite3_wal_hook()] and will +** overwrite any prior [sqlite3_wal_hook()] settings. +*/ +SQLITE_API void *sqlite3_wal_hook( + sqlite3*, + int(*)(void *,sqlite3*,const char*,int), + void* +); + +/* +** CAPI3REF: Configure an auto-checkpoint +** METHOD: sqlite3 +** +** ^The [sqlite3_wal_autocheckpoint(D,N)] is a wrapper around +** [sqlite3_wal_hook()] that causes any database on [database connection] D +** to automatically [checkpoint] +** after committing a transaction if there are N or +** more frames in the [write-ahead log] file. ^Passing zero or +** a negative value as the nFrame parameter disables automatic +** checkpoints entirely. +** +** ^The callback registered by this function replaces any existing callback +** registered using [sqlite3_wal_hook()]. ^Likewise, registering a callback +** using [sqlite3_wal_hook()] disables the automatic checkpoint mechanism +** configured by this function. +** +** ^The [wal_autocheckpoint pragma] can be used to invoke this interface +** from SQL. +** +** ^Checkpoints initiated by this mechanism are +** [sqlite3_wal_checkpoint_v2|PASSIVE]. +** +** ^Every new [database connection] defaults to having the auto-checkpoint +** enabled with a threshold of 1000 or [SQLITE_DEFAULT_WAL_AUTOCHECKPOINT] +** pages. The use of this interface +** is only necessary if the default setting is found to be suboptimal +** for a particular application. +*/ +SQLITE_API int sqlite3_wal_autocheckpoint(sqlite3 *db, int N); + +/* +** CAPI3REF: Checkpoint a database +** METHOD: sqlite3 +** +** ^(The sqlite3_wal_checkpoint(D,X) is equivalent to +** [sqlite3_wal_checkpoint_v2](D,X,[SQLITE_CHECKPOINT_PASSIVE],0,0).)^ +** +** In brief, sqlite3_wal_checkpoint(D,X) causes the content in the +** [write-ahead log] for database X on [database connection] D to be +** transferred into the database file and for the write-ahead log to +** be reset. See the [checkpointing] documentation for addition +** information. +** +** This interface used to be the only way to cause a checkpoint to +** occur. But then the newer and more powerful [sqlite3_wal_checkpoint_v2()] +** interface was added. This interface is retained for backwards +** compatibility and as a convenience for applications that need to manually +** start a callback but which do not need the full power (and corresponding +** complication) of [sqlite3_wal_checkpoint_v2()]. +*/ +SQLITE_API int sqlite3_wal_checkpoint(sqlite3 *db, const char *zDb); + +/* +** CAPI3REF: Checkpoint a database +** METHOD: sqlite3 +** +** ^(The sqlite3_wal_checkpoint_v2(D,X,M,L,C) interface runs a checkpoint +** operation on database X of [database connection] D in mode M. Status +** information is written back into integers pointed to by L and C.)^ +** ^(The M parameter must be a valid [checkpoint mode]:)^ +** +**
      +**
      SQLITE_CHECKPOINT_PASSIVE
      +** ^Checkpoint as many frames as possible without waiting for any database +** readers or writers to finish, then sync the database file if all frames +** in the log were checkpointed. ^The [busy-handler callback] +** is never invoked in the SQLITE_CHECKPOINT_PASSIVE mode. +** ^On the other hand, passive mode might leave the checkpoint unfinished +** if there are concurrent readers or writers. +** +**
      SQLITE_CHECKPOINT_FULL
      +** ^This mode blocks (it invokes the +** [sqlite3_busy_handler|busy-handler callback]) until there is no +** database writer and all readers are reading from the most recent database +** snapshot. ^It then checkpoints all frames in the log file and syncs the +** database file. ^This mode blocks new database writers while it is pending, +** but new database readers are allowed to continue unimpeded. +** +**
      SQLITE_CHECKPOINT_RESTART
      +** ^This mode works the same way as SQLITE_CHECKPOINT_FULL with the addition +** that after checkpointing the log file it blocks (calls the +** [busy-handler callback]) +** until all readers are reading from the database file only. ^This ensures +** that the next writer will restart the log file from the beginning. +** ^Like SQLITE_CHECKPOINT_FULL, this mode blocks new +** database writer attempts while it is pending, but does not impede readers. +** +**
      SQLITE_CHECKPOINT_TRUNCATE
      +** ^This mode works the same way as SQLITE_CHECKPOINT_RESTART with the +** addition that it also truncates the log file to zero bytes just prior +** to a successful return. +**
      +** +** ^If pnLog is not NULL, then *pnLog is set to the total number of frames in +** the log file or to -1 if the checkpoint could not run because +** of an error or because the database is not in [WAL mode]. ^If pnCkpt is not +** NULL,then *pnCkpt is set to the total number of checkpointed frames in the +** log file (including any that were already checkpointed before the function +** was called) or to -1 if the checkpoint could not run due to an error or +** because the database is not in WAL mode. ^Note that upon successful +** completion of an SQLITE_CHECKPOINT_TRUNCATE, the log file will have been +** truncated to zero bytes and so both *pnLog and *pnCkpt will be set to zero. +** +** ^All calls obtain an exclusive "checkpoint" lock on the database file. ^If +** any other process is running a checkpoint operation at the same time, the +** lock cannot be obtained and SQLITE_BUSY is returned. ^Even if there is a +** busy-handler configured, it will not be invoked in this case. +** +** ^The SQLITE_CHECKPOINT_FULL, RESTART and TRUNCATE modes also obtain the +** exclusive "writer" lock on the database file. ^If the writer lock cannot be +** obtained immediately, and a busy-handler is configured, it is invoked and +** the writer lock retried until either the busy-handler returns 0 or the lock +** is successfully obtained. ^The busy-handler is also invoked while waiting for +** database readers as described above. ^If the busy-handler returns 0 before +** the writer lock is obtained or while waiting for database readers, the +** checkpoint operation proceeds from that point in the same way as +** SQLITE_CHECKPOINT_PASSIVE - checkpointing as many frames as possible +** without blocking any further. ^SQLITE_BUSY is returned in this case. +** +** ^If parameter zDb is NULL or points to a zero length string, then the +** specified operation is attempted on all WAL databases [attached] to +** [database connection] db. In this case the +** values written to output parameters *pnLog and *pnCkpt are undefined. ^If +** an SQLITE_BUSY error is encountered when processing one or more of the +** attached WAL databases, the operation is still attempted on any remaining +** attached databases and SQLITE_BUSY is returned at the end. ^If any other +** error occurs while processing an attached database, processing is abandoned +** and the error code is returned to the caller immediately. ^If no error +** (SQLITE_BUSY or otherwise) is encountered while processing the attached +** databases, SQLITE_OK is returned. +** +** ^If database zDb is the name of an attached database that is not in WAL +** mode, SQLITE_OK is returned and both *pnLog and *pnCkpt set to -1. ^If +** zDb is not NULL (or a zero length string) and is not the name of any +** attached database, SQLITE_ERROR is returned to the caller. +** +** ^Unless it returns SQLITE_MISUSE, +** the sqlite3_wal_checkpoint_v2() interface +** sets the error information that is queried by +** [sqlite3_errcode()] and [sqlite3_errmsg()]. +** +** ^The [PRAGMA wal_checkpoint] command can be used to invoke this interface +** from SQL. +*/ +SQLITE_API int sqlite3_wal_checkpoint_v2( + sqlite3 *db, /* Database handle */ + const char *zDb, /* Name of attached database (or NULL) */ + int eMode, /* SQLITE_CHECKPOINT_* value */ + int *pnLog, /* OUT: Size of WAL log in frames */ + int *pnCkpt /* OUT: Total number of frames checkpointed */ +); + +/* +** CAPI3REF: Checkpoint Mode Values +** KEYWORDS: {checkpoint mode} +** +** These constants define all valid values for the "checkpoint mode" passed +** as the third parameter to the [sqlite3_wal_checkpoint_v2()] interface. +** See the [sqlite3_wal_checkpoint_v2()] documentation for details on the +** meaning of each of these checkpoint modes. +*/ +#define SQLITE_CHECKPOINT_PASSIVE 0 /* Do as much as possible w/o blocking */ +#define SQLITE_CHECKPOINT_FULL 1 /* Wait for writers, then checkpoint */ +#define SQLITE_CHECKPOINT_RESTART 2 /* Like FULL but wait for for readers */ +#define SQLITE_CHECKPOINT_TRUNCATE 3 /* Like RESTART but also truncate WAL */ + +/* +** CAPI3REF: Virtual Table Interface Configuration +** +** This function may be called by either the [xConnect] or [xCreate] method +** of a [virtual table] implementation to configure +** various facets of the virtual table interface. +** +** If this interface is invoked outside the context of an xConnect or +** xCreate virtual table method then the behavior is undefined. +** +** At present, there is only one option that may be configured using +** this function. (See [SQLITE_VTAB_CONSTRAINT_SUPPORT].) Further options +** may be added in the future. +*/ +SQLITE_API int sqlite3_vtab_config(sqlite3*, int op, ...); + +/* +** CAPI3REF: Virtual Table Configuration Options +** +** These macros define the various options to the +** [sqlite3_vtab_config()] interface that [virtual table] implementations +** can use to customize and optimize their behavior. +** +**
      +**
      SQLITE_VTAB_CONSTRAINT_SUPPORT +**
      Calls of the form +** [sqlite3_vtab_config](db,SQLITE_VTAB_CONSTRAINT_SUPPORT,X) are supported, +** where X is an integer. If X is zero, then the [virtual table] whose +** [xCreate] or [xConnect] method invoked [sqlite3_vtab_config()] does not +** support constraints. In this configuration (which is the default) if +** a call to the [xUpdate] method returns [SQLITE_CONSTRAINT], then the entire +** statement is rolled back as if [ON CONFLICT | OR ABORT] had been +** specified as part of the users SQL statement, regardless of the actual +** ON CONFLICT mode specified. +** +** If X is non-zero, then the virtual table implementation guarantees +** that if [xUpdate] returns [SQLITE_CONSTRAINT], it will do so before +** any modifications to internal or persistent data structures have been made. +** If the [ON CONFLICT] mode is ABORT, FAIL, IGNORE or ROLLBACK, SQLite +** is able to roll back a statement or database transaction, and abandon +** or continue processing the current SQL statement as appropriate. +** If the ON CONFLICT mode is REPLACE and the [xUpdate] method returns +** [SQLITE_CONSTRAINT], SQLite handles this as if the ON CONFLICT mode +** had been ABORT. +** +** Virtual table implementations that are required to handle OR REPLACE +** must do so within the [xUpdate] method. If a call to the +** [sqlite3_vtab_on_conflict()] function indicates that the current ON +** CONFLICT policy is REPLACE, the virtual table implementation should +** silently replace the appropriate rows within the xUpdate callback and +** return SQLITE_OK. Or, if this is not possible, it may return +** SQLITE_CONSTRAINT, in which case SQLite falls back to OR ABORT +** constraint handling. +**
      +*/ +#define SQLITE_VTAB_CONSTRAINT_SUPPORT 1 + +/* +** CAPI3REF: Determine The Virtual Table Conflict Policy +** +** This function may only be called from within a call to the [xUpdate] method +** of a [virtual table] implementation for an INSERT or UPDATE operation. ^The +** value returned is one of [SQLITE_ROLLBACK], [SQLITE_IGNORE], [SQLITE_FAIL], +** [SQLITE_ABORT], or [SQLITE_REPLACE], according to the [ON CONFLICT] mode +** of the SQL statement that triggered the call to the [xUpdate] method of the +** [virtual table]. +*/ +SQLITE_API int sqlite3_vtab_on_conflict(sqlite3 *); + +/* +** CAPI3REF: Determine If Virtual Table Column Access Is For UPDATE +** +** If the sqlite3_vtab_nochange(X) routine is called within the [xColumn] +** method of a [virtual table], then it returns true if and only if the +** column is being fetched as part of an UPDATE operation during which the +** column value will not change. Applications might use this to substitute +** a lighter-weight value to return that the corresponding [xUpdate] method +** understands as a "no-change" value. +** +** If the [xColumn] method calls sqlite3_vtab_nochange() and finds that +** the column is not changed by the UPDATE statement, they the xColumn +** method can optionally return without setting a result, without calling +** any of the [sqlite3_result_int|sqlite3_result_xxxxx() interfaces]. +** In that case, [sqlite3_value_nochange(X)] will return true for the +** same column in the [xUpdate] method. +*/ +SQLITE_API int sqlite3_vtab_nochange(sqlite3_context*); + +/* +** CAPI3REF: Determine The Collation For a Virtual Table Constraint +** +** This function may only be called from within a call to the [xBestIndex] +** method of a [virtual table]. +** +** The first argument must be the sqlite3_index_info object that is the +** first parameter to the xBestIndex() method. The second argument must be +** an index into the aConstraint[] array belonging to the sqlite3_index_info +** structure passed to xBestIndex. This function returns a pointer to a buffer +** containing the name of the collation sequence for the corresponding +** constraint. +*/ +SQLITE_API SQLITE_EXPERIMENTAL const char *sqlite3_vtab_collation(sqlite3_index_info*,int); + +/* +** CAPI3REF: Conflict resolution modes +** KEYWORDS: {conflict resolution mode} +** +** These constants are returned by [sqlite3_vtab_on_conflict()] to +** inform a [virtual table] implementation what the [ON CONFLICT] mode +** is for the SQL statement being evaluated. +** +** Note that the [SQLITE_IGNORE] constant is also used as a potential +** return value from the [sqlite3_set_authorizer()] callback and that +** [SQLITE_ABORT] is also a [result code]. +*/ +#define SQLITE_ROLLBACK 1 +/* #define SQLITE_IGNORE 2 // Also used by sqlite3_authorizer() callback */ +#define SQLITE_FAIL 3 +/* #define SQLITE_ABORT 4 // Also an error code */ +#define SQLITE_REPLACE 5 + +/* +** CAPI3REF: Prepared Statement Scan Status Opcodes +** KEYWORDS: {scanstatus options} +** +** The following constants can be used for the T parameter to the +** [sqlite3_stmt_scanstatus(S,X,T,V)] interface. Each constant designates a +** different metric for sqlite3_stmt_scanstatus() to return. +** +** When the value returned to V is a string, space to hold that string is +** managed by the prepared statement S and will be automatically freed when +** S is finalized. +** +**
      +** [[SQLITE_SCANSTAT_NLOOP]]
      SQLITE_SCANSTAT_NLOOP
      +**
      ^The [sqlite3_int64] variable pointed to by the T parameter will be +** set to the total number of times that the X-th loop has run.
      +** +** [[SQLITE_SCANSTAT_NVISIT]]
      SQLITE_SCANSTAT_NVISIT
      +**
      ^The [sqlite3_int64] variable pointed to by the T parameter will be set +** to the total number of rows examined by all iterations of the X-th loop.
      +** +** [[SQLITE_SCANSTAT_EST]]
      SQLITE_SCANSTAT_EST
      +**
      ^The "double" variable pointed to by the T parameter will be set to the +** query planner's estimate for the average number of rows output from each +** iteration of the X-th loop. If the query planner's estimates was accurate, +** then this value will approximate the quotient NVISIT/NLOOP and the +** product of this value for all prior loops with the same SELECTID will +** be the NLOOP value for the current loop. +** +** [[SQLITE_SCANSTAT_NAME]]
      SQLITE_SCANSTAT_NAME
      +**
      ^The "const char *" variable pointed to by the T parameter will be set +** to a zero-terminated UTF-8 string containing the name of the index or table +** used for the X-th loop. +** +** [[SQLITE_SCANSTAT_EXPLAIN]]
      SQLITE_SCANSTAT_EXPLAIN
      +**
      ^The "const char *" variable pointed to by the T parameter will be set +** to a zero-terminated UTF-8 string containing the [EXPLAIN QUERY PLAN] +** description for the X-th loop. +** +** [[SQLITE_SCANSTAT_SELECTID]]
      SQLITE_SCANSTAT_SELECT
      +**
      ^The "int" variable pointed to by the T parameter will be set to the +** "select-id" for the X-th loop. The select-id identifies which query or +** subquery the loop is part of. The main query has a select-id of zero. +** The select-id is the same value as is output in the first column +** of an [EXPLAIN QUERY PLAN] query. +**
      +*/ +#define SQLITE_SCANSTAT_NLOOP 0 +#define SQLITE_SCANSTAT_NVISIT 1 +#define SQLITE_SCANSTAT_EST 2 +#define SQLITE_SCANSTAT_NAME 3 +#define SQLITE_SCANSTAT_EXPLAIN 4 +#define SQLITE_SCANSTAT_SELECTID 5 + +/* +** CAPI3REF: Prepared Statement Scan Status +** METHOD: sqlite3_stmt +** +** This interface returns information about the predicted and measured +** performance for pStmt. Advanced applications can use this +** interface to compare the predicted and the measured performance and +** issue warnings and/or rerun [ANALYZE] if discrepancies are found. +** +** Since this interface is expected to be rarely used, it is only +** available if SQLite is compiled using the [SQLITE_ENABLE_STMT_SCANSTATUS] +** compile-time option. +** +** The "iScanStatusOp" parameter determines which status information to return. +** The "iScanStatusOp" must be one of the [scanstatus options] or the behavior +** of this interface is undefined. +** ^The requested measurement is written into a variable pointed to by +** the "pOut" parameter. +** Parameter "idx" identifies the specific loop to retrieve statistics for. +** Loops are numbered starting from zero. ^If idx is out of range - less than +** zero or greater than or equal to the total number of loops used to implement +** the statement - a non-zero value is returned and the variable that pOut +** points to is unchanged. +** +** ^Statistics might not be available for all loops in all statements. ^In cases +** where there exist loops with no available statistics, this function behaves +** as if the loop did not exist - it returns non-zero and leave the variable +** that pOut points to unchanged. +** +** See also: [sqlite3_stmt_scanstatus_reset()] +*/ +SQLITE_API int sqlite3_stmt_scanstatus( + sqlite3_stmt *pStmt, /* Prepared statement for which info desired */ + int idx, /* Index of loop to report on */ + int iScanStatusOp, /* Information desired. SQLITE_SCANSTAT_* */ + void *pOut /* Result written here */ +); + +/* +** CAPI3REF: Zero Scan-Status Counters +** METHOD: sqlite3_stmt +** +** ^Zero all [sqlite3_stmt_scanstatus()] related event counters. +** +** This API is only available if the library is built with pre-processor +** symbol [SQLITE_ENABLE_STMT_SCANSTATUS] defined. +*/ +SQLITE_API void sqlite3_stmt_scanstatus_reset(sqlite3_stmt*); + +/* +** CAPI3REF: Flush caches to disk mid-transaction +** +** ^If a write-transaction is open on [database connection] D when the +** [sqlite3_db_cacheflush(D)] interface invoked, any dirty +** pages in the pager-cache that are not currently in use are written out +** to disk. A dirty page may be in use if a database cursor created by an +** active SQL statement is reading from it, or if it is page 1 of a database +** file (page 1 is always "in use"). ^The [sqlite3_db_cacheflush(D)] +** interface flushes caches for all schemas - "main", "temp", and +** any [attached] databases. +** +** ^If this function needs to obtain extra database locks before dirty pages +** can be flushed to disk, it does so. ^If those locks cannot be obtained +** immediately and there is a busy-handler callback configured, it is invoked +** in the usual manner. ^If the required lock still cannot be obtained, then +** the database is skipped and an attempt made to flush any dirty pages +** belonging to the next (if any) database. ^If any databases are skipped +** because locks cannot be obtained, but no other error occurs, this +** function returns SQLITE_BUSY. +** +** ^If any other error occurs while flushing dirty pages to disk (for +** example an IO error or out-of-memory condition), then processing is +** abandoned and an SQLite [error code] is returned to the caller immediately. +** +** ^Otherwise, if no error occurs, [sqlite3_db_cacheflush()] returns SQLITE_OK. +** +** ^This function does not set the database handle error code or message +** returned by the [sqlite3_errcode()] and [sqlite3_errmsg()] functions. +*/ +SQLITE_API int sqlite3_db_cacheflush(sqlite3*); + +/* +** CAPI3REF: The pre-update hook. +** +** ^These interfaces are only available if SQLite is compiled using the +** [SQLITE_ENABLE_PREUPDATE_HOOK] compile-time option. +** +** ^The [sqlite3_preupdate_hook()] interface registers a callback function +** that is invoked prior to each [INSERT], [UPDATE], and [DELETE] operation +** on a database table. +** ^At most one preupdate hook may be registered at a time on a single +** [database connection]; each call to [sqlite3_preupdate_hook()] overrides +** the previous setting. +** ^The preupdate hook is disabled by invoking [sqlite3_preupdate_hook()] +** with a NULL pointer as the second parameter. +** ^The third parameter to [sqlite3_preupdate_hook()] is passed through as +** the first parameter to callbacks. +** +** ^The preupdate hook only fires for changes to real database tables; the +** preupdate hook is not invoked for changes to [virtual tables] or to +** system tables like sqlite_master or sqlite_stat1. +** +** ^The second parameter to the preupdate callback is a pointer to +** the [database connection] that registered the preupdate hook. +** ^The third parameter to the preupdate callback is one of the constants +** [SQLITE_INSERT], [SQLITE_DELETE], or [SQLITE_UPDATE] to identify the +** kind of update operation that is about to occur. +** ^(The fourth parameter to the preupdate callback is the name of the +** database within the database connection that is being modified. This +** will be "main" for the main database or "temp" for TEMP tables or +** the name given after the AS keyword in the [ATTACH] statement for attached +** databases.)^ +** ^The fifth parameter to the preupdate callback is the name of the +** table that is being modified. +** +** For an UPDATE or DELETE operation on a [rowid table], the sixth +** parameter passed to the preupdate callback is the initial [rowid] of the +** row being modified or deleted. For an INSERT operation on a rowid table, +** or any operation on a WITHOUT ROWID table, the value of the sixth +** parameter is undefined. For an INSERT or UPDATE on a rowid table the +** seventh parameter is the final rowid value of the row being inserted +** or updated. The value of the seventh parameter passed to the callback +** function is not defined for operations on WITHOUT ROWID tables, or for +** INSERT operations on rowid tables. +** +** The [sqlite3_preupdate_old()], [sqlite3_preupdate_new()], +** [sqlite3_preupdate_count()], and [sqlite3_preupdate_depth()] interfaces +** provide additional information about a preupdate event. These routines +** may only be called from within a preupdate callback. Invoking any of +** these routines from outside of a preupdate callback or with a +** [database connection] pointer that is different from the one supplied +** to the preupdate callback results in undefined and probably undesirable +** behavior. +** +** ^The [sqlite3_preupdate_count(D)] interface returns the number of columns +** in the row that is being inserted, updated, or deleted. +** +** ^The [sqlite3_preupdate_old(D,N,P)] interface writes into P a pointer to +** a [protected sqlite3_value] that contains the value of the Nth column of +** the table row before it is updated. The N parameter must be between 0 +** and one less than the number of columns or the behavior will be +** undefined. This must only be used within SQLITE_UPDATE and SQLITE_DELETE +** preupdate callbacks; if it is used by an SQLITE_INSERT callback then the +** behavior is undefined. The [sqlite3_value] that P points to +** will be destroyed when the preupdate callback returns. +** +** ^The [sqlite3_preupdate_new(D,N,P)] interface writes into P a pointer to +** a [protected sqlite3_value] that contains the value of the Nth column of +** the table row after it is updated. The N parameter must be between 0 +** and one less than the number of columns or the behavior will be +** undefined. This must only be used within SQLITE_INSERT and SQLITE_UPDATE +** preupdate callbacks; if it is used by an SQLITE_DELETE callback then the +** behavior is undefined. The [sqlite3_value] that P points to +** will be destroyed when the preupdate callback returns. +** +** ^The [sqlite3_preupdate_depth(D)] interface returns 0 if the preupdate +** callback was invoked as a result of a direct insert, update, or delete +** operation; or 1 for inserts, updates, or deletes invoked by top-level +** triggers; or 2 for changes resulting from triggers called by top-level +** triggers; and so forth. +** +** See also: [sqlite3_update_hook()] +*/ +#if defined(SQLITE_ENABLE_PREUPDATE_HOOK) +SQLITE_API void *sqlite3_preupdate_hook( + sqlite3 *db, + void(*xPreUpdate)( + void *pCtx, /* Copy of third arg to preupdate_hook() */ + sqlite3 *db, /* Database handle */ + int op, /* SQLITE_UPDATE, DELETE or INSERT */ + char const *zDb, /* Database name */ + char const *zName, /* Table name */ + sqlite3_int64 iKey1, /* Rowid of row about to be deleted/updated */ + sqlite3_int64 iKey2 /* New rowid value (for a rowid UPDATE) */ + ), + void* +); +SQLITE_API int sqlite3_preupdate_old(sqlite3 *, int, sqlite3_value **); +SQLITE_API int sqlite3_preupdate_count(sqlite3 *); +SQLITE_API int sqlite3_preupdate_depth(sqlite3 *); +SQLITE_API int sqlite3_preupdate_new(sqlite3 *, int, sqlite3_value **); +#endif + +/* +** CAPI3REF: Low-level system error code +** +** ^Attempt to return the underlying operating system error code or error +** number that caused the most recent I/O error or failure to open a file. +** The return value is OS-dependent. For example, on unix systems, after +** [sqlite3_open_v2()] returns [SQLITE_CANTOPEN], this interface could be +** called to get back the underlying "errno" that caused the problem, such +** as ENOSPC, EAUTH, EISDIR, and so forth. +*/ +SQLITE_API int sqlite3_system_errno(sqlite3*); + +/* +** CAPI3REF: Database Snapshot +** KEYWORDS: {snapshot} {sqlite3_snapshot} +** EXPERIMENTAL +** +** An instance of the snapshot object records the state of a [WAL mode] +** database for some specific point in history. +** +** In [WAL mode], multiple [database connections] that are open on the +** same database file can each be reading a different historical version +** of the database file. When a [database connection] begins a read +** transaction, that connection sees an unchanging copy of the database +** as it existed for the point in time when the transaction first started. +** Subsequent changes to the database from other connections are not seen +** by the reader until a new read transaction is started. +** +** The sqlite3_snapshot object records state information about an historical +** version of the database file so that it is possible to later open a new read +** transaction that sees that historical version of the database rather than +** the most recent version. +** +** The constructor for this object is [sqlite3_snapshot_get()]. The +** [sqlite3_snapshot_open()] method causes a fresh read transaction to refer +** to an historical snapshot (if possible). The destructor for +** sqlite3_snapshot objects is [sqlite3_snapshot_free()]. +*/ +typedef struct sqlite3_snapshot { + unsigned char hidden[48]; +} sqlite3_snapshot; + +/* +** CAPI3REF: Record A Database Snapshot +** EXPERIMENTAL +** +** ^The [sqlite3_snapshot_get(D,S,P)] interface attempts to make a +** new [sqlite3_snapshot] object that records the current state of +** schema S in database connection D. ^On success, the +** [sqlite3_snapshot_get(D,S,P)] interface writes a pointer to the newly +** created [sqlite3_snapshot] object into *P and returns SQLITE_OK. +** If there is not already a read-transaction open on schema S when +** this function is called, one is opened automatically. +** +** The following must be true for this function to succeed. If any of +** the following statements are false when sqlite3_snapshot_get() is +** called, SQLITE_ERROR is returned. The final value of *P is undefined +** in this case. +** +**
        +**
      • The database handle must be in [autocommit mode]. +** +**
      • Schema S of [database connection] D must be a [WAL mode] database. +** +**
      • There must not be a write transaction open on schema S of database +** connection D. +** +**
      • One or more transactions must have been written to the current wal +** file since it was created on disk (by any connection). This means +** that a snapshot cannot be taken on a wal mode database with no wal +** file immediately after it is first opened. At least one transaction +** must be written to it first. +**
      +** +** This function may also return SQLITE_NOMEM. If it is called with the +** database handle in autocommit mode but fails for some other reason, +** whether or not a read transaction is opened on schema S is undefined. +** +** The [sqlite3_snapshot] object returned from a successful call to +** [sqlite3_snapshot_get()] must be freed using [sqlite3_snapshot_free()] +** to avoid a memory leak. +** +** The [sqlite3_snapshot_get()] interface is only available when the +** SQLITE_ENABLE_SNAPSHOT compile-time option is used. +*/ +SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_get( + sqlite3 *db, + const char *zSchema, + sqlite3_snapshot **ppSnapshot +); + +/* +** CAPI3REF: Start a read transaction on an historical snapshot +** EXPERIMENTAL +** +** ^The [sqlite3_snapshot_open(D,S,P)] interface starts a +** read transaction for schema S of +** [database connection] D such that the read transaction +** refers to historical [snapshot] P, rather than the most +** recent change to the database. +** ^The [sqlite3_snapshot_open()] interface returns SQLITE_OK on success +** or an appropriate [error code] if it fails. +** +** ^In order to succeed, a call to [sqlite3_snapshot_open(D,S,P)] must be +** the first operation following the [BEGIN] that takes the schema S +** out of [autocommit mode]. +** ^In other words, schema S must not currently be in +** a transaction for [sqlite3_snapshot_open(D,S,P)] to work, but the +** database connection D must be out of [autocommit mode]. +** ^A [snapshot] will fail to open if it has been overwritten by a +** [checkpoint]. +** ^(A call to [sqlite3_snapshot_open(D,S,P)] will fail if the +** database connection D does not know that the database file for +** schema S is in [WAL mode]. A database connection might not know +** that the database file is in [WAL mode] if there has been no prior +** I/O on that database connection, or if the database entered [WAL mode] +** after the most recent I/O on the database connection.)^ +** (Hint: Run "[PRAGMA application_id]" against a newly opened +** database connection in order to make it ready to use snapshots.) +** +** The [sqlite3_snapshot_open()] interface is only available when the +** SQLITE_ENABLE_SNAPSHOT compile-time option is used. +*/ +SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_open( + sqlite3 *db, + const char *zSchema, + sqlite3_snapshot *pSnapshot +); + +/* +** CAPI3REF: Destroy a snapshot +** EXPERIMENTAL +** +** ^The [sqlite3_snapshot_free(P)] interface destroys [sqlite3_snapshot] P. +** The application must eventually free every [sqlite3_snapshot] object +** using this routine to avoid a memory leak. +** +** The [sqlite3_snapshot_free()] interface is only available when the +** SQLITE_ENABLE_SNAPSHOT compile-time option is used. +*/ +SQLITE_API SQLITE_EXPERIMENTAL void sqlite3_snapshot_free(sqlite3_snapshot*); + +/* +** CAPI3REF: Compare the ages of two snapshot handles. +** EXPERIMENTAL +** +** The sqlite3_snapshot_cmp(P1, P2) interface is used to compare the ages +** of two valid snapshot handles. +** +** If the two snapshot handles are not associated with the same database +** file, the result of the comparison is undefined. +** +** Additionally, the result of the comparison is only valid if both of the +** snapshot handles were obtained by calling sqlite3_snapshot_get() since the +** last time the wal file was deleted. The wal file is deleted when the +** database is changed back to rollback mode or when the number of database +** clients drops to zero. If either snapshot handle was obtained before the +** wal file was last deleted, the value returned by this function +** is undefined. +** +** Otherwise, this API returns a negative value if P1 refers to an older +** snapshot than P2, zero if the two handles refer to the same database +** snapshot, and a positive value if P1 is a newer snapshot than P2. +*/ +SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_cmp( + sqlite3_snapshot *p1, + sqlite3_snapshot *p2 +); + +/* +** CAPI3REF: Recover snapshots from a wal file +** EXPERIMENTAL +** +** If all connections disconnect from a database file but do not perform +** a checkpoint, the existing wal file is opened along with the database +** file the next time the database is opened. At this point it is only +** possible to successfully call sqlite3_snapshot_open() to open the most +** recent snapshot of the database (the one at the head of the wal file), +** even though the wal file may contain other valid snapshots for which +** clients have sqlite3_snapshot handles. +** +** This function attempts to scan the wal file associated with database zDb +** of database handle db and make all valid snapshots available to +** sqlite3_snapshot_open(). It is an error if there is already a read +** transaction open on the database, or if the database is not a wal mode +** database. +** +** SQLITE_OK is returned if successful, or an SQLite error code otherwise. +*/ +SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_recover(sqlite3 *db, const char *zDb); + +/* +** Undo the hack that converts floating point types to integer for +** builds on processors without floating point support. +*/ +#ifdef SQLITE_OMIT_FLOATING_POINT +# undef double +#endif + +#ifdef __cplusplus +} /* End of the 'extern "C"' block */ +#endif +#endif /* SQLITE3_H */ + +/******** Begin file sqlite3rtree.h *********/ +/* +** 2010 August 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. +** +************************************************************************* +*/ + +#ifndef _SQLITE3RTREE_H_ +#define _SQLITE3RTREE_H_ + + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct sqlite3_rtree_geometry sqlite3_rtree_geometry; +typedef struct sqlite3_rtree_query_info sqlite3_rtree_query_info; + +/* The double-precision datatype used by RTree depends on the +** SQLITE_RTREE_INT_ONLY compile-time option. +*/ +#ifdef SQLITE_RTREE_INT_ONLY + typedef sqlite3_int64 sqlite3_rtree_dbl; +#else + typedef double sqlite3_rtree_dbl; +#endif + +/* +** Register a geometry callback named zGeom that can be used as part of an +** R-Tree geometry query as follows: +** +** SELECT ... FROM WHERE MATCH $zGeom(... params ...) +*/ +SQLITE_API int sqlite3_rtree_geometry_callback( + sqlite3 *db, + const char *zGeom, + int (*xGeom)(sqlite3_rtree_geometry*, int, sqlite3_rtree_dbl*,int*), + void *pContext +); + + +/* +** A pointer to a structure of the following type is passed as the first +** argument to callbacks registered using rtree_geometry_callback(). +*/ +struct sqlite3_rtree_geometry { + void *pContext; /* Copy of pContext passed to s_r_g_c() */ + int nParam; /* Size of array aParam[] */ + sqlite3_rtree_dbl *aParam; /* Parameters passed to SQL geom function */ + void *pUser; /* Callback implementation user data */ + void (*xDelUser)(void *); /* Called by SQLite to clean up pUser */ +}; + +/* +** Register a 2nd-generation geometry callback named zScore that can be +** used as part of an R-Tree geometry query as follows: +** +** SELECT ... FROM WHERE MATCH $zQueryFunc(... params ...) +*/ +SQLITE_API int sqlite3_rtree_query_callback( + sqlite3 *db, + const char *zQueryFunc, + int (*xQueryFunc)(sqlite3_rtree_query_info*), + void *pContext, + void (*xDestructor)(void*) +); + + +/* +** A pointer to a structure of the following type is passed as the +** argument to scored geometry callback registered using +** sqlite3_rtree_query_callback(). +** +** Note that the first 5 fields of this structure are identical to +** sqlite3_rtree_geometry. This structure is a subclass of +** sqlite3_rtree_geometry. +*/ +struct sqlite3_rtree_query_info { + void *pContext; /* pContext from when function registered */ + int nParam; /* Number of function parameters */ + sqlite3_rtree_dbl *aParam; /* value of function parameters */ + void *pUser; /* callback can use this, if desired */ + void (*xDelUser)(void*); /* function to free pUser */ + sqlite3_rtree_dbl *aCoord; /* Coordinates of node or entry to check */ + unsigned int *anQueue; /* Number of pending entries in the queue */ + int nCoord; /* Number of coordinates */ + int iLevel; /* Level of current node or entry */ + int mxLevel; /* The largest iLevel value in the tree */ + sqlite3_int64 iRowid; /* Rowid for current entry */ + sqlite3_rtree_dbl rParentScore; /* Score of parent node */ + int eParentWithin; /* Visibility of parent node */ + int eWithin; /* OUT: Visiblity */ + sqlite3_rtree_dbl rScore; /* OUT: Write the score here */ + /* The following fields are only available in 3.8.11 and later */ + sqlite3_value **apSqlParam; /* Original SQL values of parameters */ +}; + +/* +** Allowed values for sqlite3_rtree_query.eWithin and .eParentWithin. +*/ +#define NOT_WITHIN 0 /* Object completely outside of query region */ +#define PARTLY_WITHIN 1 /* Object partially overlaps query region */ +#define FULLY_WITHIN 2 /* Object fully contained within query region */ + + +#ifdef __cplusplus +} /* end of the 'extern "C"' block */ +#endif + +#endif /* ifndef _SQLITE3RTREE_H_ */ + +/******** End of sqlite3rtree.h *********/ +/******** Begin file sqlite3session.h *********/ + +#if !defined(__SQLITESESSION_H_) && defined(SQLITE_ENABLE_SESSION) +#define __SQLITESESSION_H_ 1 + +/* +** Make sure we can call this stuff from C++. +*/ +#ifdef __cplusplus +extern "C" { +#endif + + +/* +** CAPI3REF: Session Object Handle +*/ +typedef struct sqlite3_session sqlite3_session; + +/* +** CAPI3REF: Changeset Iterator Handle +*/ +typedef struct sqlite3_changeset_iter sqlite3_changeset_iter; + +/* +** CAPI3REF: Create A New Session Object +** +** Create a new session object attached to database handle db. If successful, +** a pointer to the new object is written to *ppSession and SQLITE_OK is +** returned. If an error occurs, *ppSession is set to NULL and an SQLite +** error code (e.g. SQLITE_NOMEM) is returned. +** +** It is possible to create multiple session objects attached to a single +** database handle. +** +** Session objects created using this function should be deleted using the +** [sqlite3session_delete()] function before the database handle that they +** are attached to is itself closed. If the database handle is closed before +** the session object is deleted, then the results of calling any session +** module function, including [sqlite3session_delete()] on the session object +** are undefined. +** +** Because the session module uses the [sqlite3_preupdate_hook()] API, it +** is not possible for an application to register a pre-update hook on a +** database handle that has one or more session objects attached. Nor is +** it possible to create a session object attached to a database handle for +** which a pre-update hook is already defined. The results of attempting +** either of these things are undefined. +** +** The session object will be used to create changesets for tables in +** database zDb, where zDb is either "main", or "temp", or the name of an +** attached database. It is not an error if database zDb is not attached +** to the database when the session object is created. +*/ +SQLITE_API int sqlite3session_create( + sqlite3 *db, /* Database handle */ + const char *zDb, /* Name of db (e.g. "main") */ + sqlite3_session **ppSession /* OUT: New session object */ +); + +/* +** CAPI3REF: Delete A Session Object +** +** Delete a session object previously allocated using +** [sqlite3session_create()]. Once a session object has been deleted, the +** results of attempting to use pSession with any other session module +** function are undefined. +** +** Session objects must be deleted before the database handle to which they +** are attached is closed. Refer to the documentation for +** [sqlite3session_create()] for details. +*/ +SQLITE_API void sqlite3session_delete(sqlite3_session *pSession); + + +/* +** CAPI3REF: Enable Or Disable A Session Object +** +** Enable or disable the recording of changes by a session object. When +** enabled, a session object records changes made to the database. When +** disabled - it does not. A newly created session object is enabled. +** Refer to the documentation for [sqlite3session_changeset()] for further +** details regarding how enabling and disabling a session object affects +** the eventual changesets. +** +** Passing zero to this function disables the session. Passing a value +** greater than zero enables it. Passing a value less than zero is a +** no-op, and may be used to query the current state of the session. +** +** The return value indicates the final state of the session object: 0 if +** the session is disabled, or 1 if it is enabled. +*/ +SQLITE_API int sqlite3session_enable(sqlite3_session *pSession, int bEnable); + +/* +** CAPI3REF: Set Or Clear the Indirect Change Flag +** +** Each change recorded by a session object is marked as either direct or +** indirect. A change is marked as indirect if either: +** +**
        +**
      • The session object "indirect" flag is set when the change is +** made, or +**
      • The change is made by an SQL trigger or foreign key action +** instead of directly as a result of a users SQL statement. +**
      +** +** If a single row is affected by more than one operation within a session, +** then the change is considered indirect if all operations meet the criteria +** for an indirect change above, or direct otherwise. +** +** This function is used to set, clear or query the session object indirect +** flag. If the second argument passed to this function is zero, then the +** indirect flag is cleared. If it is greater than zero, the indirect flag +** is set. Passing a value less than zero does not modify the current value +** of the indirect flag, and may be used to query the current state of the +** indirect flag for the specified session object. +** +** The return value indicates the final state of the indirect flag: 0 if +** it is clear, or 1 if it is set. +*/ +SQLITE_API int sqlite3session_indirect(sqlite3_session *pSession, int bIndirect); + +/* +** CAPI3REF: Attach A Table To A Session Object +** +** If argument zTab is not NULL, then it is the name of a table to attach +** to the session object passed as the first argument. All subsequent changes +** made to the table while the session object is enabled will be recorded. See +** documentation for [sqlite3session_changeset()] for further details. +** +** Or, if argument zTab is NULL, then changes are recorded for all tables +** in the database. If additional tables are added to the database (by +** executing "CREATE TABLE" statements) after this call is made, changes for +** the new tables are also recorded. +** +** Changes can only be recorded for tables that have a PRIMARY KEY explicitly +** defined as part of their CREATE TABLE statement. It does not matter if the +** PRIMARY KEY is an "INTEGER PRIMARY KEY" (rowid alias) or not. The PRIMARY +** KEY may consist of a single column, or may be a composite key. +** +** It is not an error if the named table does not exist in the database. Nor +** is it an error if the named table does not have a PRIMARY KEY. However, +** no changes will be recorded in either of these scenarios. +** +** Changes are not recorded for individual rows that have NULL values stored +** in one or more of their PRIMARY KEY columns. +** +** SQLITE_OK is returned if the call completes without error. Or, if an error +** occurs, an SQLite error code (e.g. SQLITE_NOMEM) is returned. +** +**

      Special sqlite_stat1 Handling

      +** +** As of SQLite version 3.22.0, the "sqlite_stat1" table is an exception to +** some of the rules above. In SQLite, the schema of sqlite_stat1 is: +**
      +**        CREATE TABLE sqlite_stat1(tbl,idx,stat)  
      +**  
      +** +** Even though sqlite_stat1 does not have a PRIMARY KEY, changes are +** recorded for it as if the PRIMARY KEY is (tbl,idx). Additionally, changes +** are recorded for rows for which (idx IS NULL) is true. However, for such +** rows a zero-length blob (SQL value X'') is stored in the changeset or +** patchset instead of a NULL value. This allows such changesets to be +** manipulated by legacy implementations of sqlite3changeset_invert(), +** concat() and similar. +** +** The sqlite3changeset_apply() function automatically converts the +** zero-length blob back to a NULL value when updating the sqlite_stat1 +** table. However, if the application calls sqlite3changeset_new(), +** sqlite3changeset_old() or sqlite3changeset_conflict on a changeset +** iterator directly (including on a changeset iterator passed to a +** conflict-handler callback) then the X'' value is returned. The application +** must translate X'' to NULL itself if required. +** +** Legacy (older than 3.22.0) versions of the sessions module cannot capture +** changes made to the sqlite_stat1 table. Legacy versions of the +** sqlite3changeset_apply() function silently ignore any modifications to the +** sqlite_stat1 table that are part of a changeset or patchset. +*/ +SQLITE_API int sqlite3session_attach( + sqlite3_session *pSession, /* Session object */ + const char *zTab /* Table name */ +); + +/* +** CAPI3REF: Set a table filter on a Session Object. +** +** The second argument (xFilter) is the "filter callback". For changes to rows +** in tables that are not attached to the Session object, the filter is called +** to determine whether changes to the table's rows should be tracked or not. +** If xFilter returns 0, changes is not tracked. Note that once a table is +** attached, xFilter will not be called again. +*/ +SQLITE_API void sqlite3session_table_filter( + sqlite3_session *pSession, /* Session object */ + int(*xFilter)( + void *pCtx, /* Copy of third arg to _filter_table() */ + const char *zTab /* Table name */ + ), + void *pCtx /* First argument passed to xFilter */ +); + +/* +** CAPI3REF: Generate A Changeset From A Session Object +** +** Obtain a changeset containing changes to the tables attached to the +** session object passed as the first argument. If successful, +** set *ppChangeset to point to a buffer containing the changeset +** and *pnChangeset to the size of the changeset in bytes before returning +** SQLITE_OK. If an error occurs, set both *ppChangeset and *pnChangeset to +** zero and return an SQLite error code. +** +** A changeset consists of zero or more INSERT, UPDATE and/or DELETE changes, +** each representing a change to a single row of an attached table. An INSERT +** change contains the values of each field of a new database row. A DELETE +** contains the original values of each field of a deleted database row. An +** UPDATE change contains the original values of each field of an updated +** database row along with the updated values for each updated non-primary-key +** column. It is not possible for an UPDATE change to represent a change that +** modifies the values of primary key columns. If such a change is made, it +** is represented in a changeset as a DELETE followed by an INSERT. +** +** Changes are not recorded for rows that have NULL values stored in one or +** more of their PRIMARY KEY columns. If such a row is inserted or deleted, +** no corresponding change is present in the changesets returned by this +** function. If an existing row with one or more NULL values stored in +** PRIMARY KEY columns is updated so that all PRIMARY KEY columns are non-NULL, +** only an INSERT is appears in the changeset. Similarly, if an existing row +** with non-NULL PRIMARY KEY values is updated so that one or more of its +** PRIMARY KEY columns are set to NULL, the resulting changeset contains a +** DELETE change only. +** +** The contents of a changeset may be traversed using an iterator created +** using the [sqlite3changeset_start()] API. A changeset may be applied to +** a database with a compatible schema using the [sqlite3changeset_apply()] +** API. +** +** Within a changeset generated by this function, all changes related to a +** single table are grouped together. In other words, when iterating through +** a changeset or when applying a changeset to a database, all changes related +** to a single table are processed before moving on to the next table. Tables +** are sorted in the same order in which they were attached (or auto-attached) +** to the sqlite3_session object. The order in which the changes related to +** a single table are stored is undefined. +** +** Following a successful call to this function, it is the responsibility of +** the caller to eventually free the buffer that *ppChangeset points to using +** [sqlite3_free()]. +** +**

      Changeset Generation

      +** +** Once a table has been attached to a session object, the session object +** records the primary key values of all new rows inserted into the table. +** It also records the original primary key and other column values of any +** deleted or updated rows. For each unique primary key value, data is only +** recorded once - the first time a row with said primary key is inserted, +** updated or deleted in the lifetime of the session. +** +** There is one exception to the previous paragraph: when a row is inserted, +** updated or deleted, if one or more of its primary key columns contain a +** NULL value, no record of the change is made. +** +** The session object therefore accumulates two types of records - those +** that consist of primary key values only (created when the user inserts +** a new record) and those that consist of the primary key values and the +** original values of other table columns (created when the users deletes +** or updates a record). +** +** When this function is called, the requested changeset is created using +** both the accumulated records and the current contents of the database +** file. Specifically: +** +**
        +**
      • For each record generated by an insert, the database is queried +** for a row with a matching primary key. If one is found, an INSERT +** change is added to the changeset. If no such row is found, no change +** is added to the changeset. +** +**
      • For each record generated by an update or delete, the database is +** queried for a row with a matching primary key. If such a row is +** found and one or more of the non-primary key fields have been +** modified from their original values, an UPDATE change is added to +** the changeset. Or, if no such row is found in the table, a DELETE +** change is added to the changeset. If there is a row with a matching +** primary key in the database, but all fields contain their original +** values, no change is added to the changeset. +**
      +** +** This means, amongst other things, that if a row is inserted and then later +** deleted while a session object is active, neither the insert nor the delete +** will be present in the changeset. Or if a row is deleted and then later a +** row with the same primary key values inserted while a session object is +** active, the resulting changeset will contain an UPDATE change instead of +** a DELETE and an INSERT. +** +** When a session object is disabled (see the [sqlite3session_enable()] API), +** it does not accumulate records when rows are inserted, updated or deleted. +** This may appear to have some counter-intuitive effects if a single row +** is written to more than once during a session. For example, if a row +** is inserted while a session object is enabled, then later deleted while +** the same session object is disabled, no INSERT record will appear in the +** changeset, even though the delete took place while the session was disabled. +** Or, if one field of a row is updated while a session is disabled, and +** another field of the same row is updated while the session is enabled, the +** resulting changeset will contain an UPDATE change that updates both fields. +*/ +SQLITE_API int sqlite3session_changeset( + sqlite3_session *pSession, /* Session object */ + int *pnChangeset, /* OUT: Size of buffer at *ppChangeset */ + void **ppChangeset /* OUT: Buffer containing changeset */ +); + +/* +** CAPI3REF: Load The Difference Between Tables Into A Session +** +** If it is not already attached to the session object passed as the first +** argument, this function attaches table zTbl in the same manner as the +** [sqlite3session_attach()] function. If zTbl does not exist, or if it +** does not have a primary key, this function is a no-op (but does not return +** an error). +** +** Argument zFromDb must be the name of a database ("main", "temp" etc.) +** attached to the same database handle as the session object that contains +** a table compatible with the table attached to the session by this function. +** A table is considered compatible if it: +** +**
        +**
      • Has the same name, +**
      • Has the same set of columns declared in the same order, and +**
      • Has the same PRIMARY KEY definition. +**
      +** +** If the tables are not compatible, SQLITE_SCHEMA is returned. If the tables +** are compatible but do not have any PRIMARY KEY columns, it is not an error +** but no changes are added to the session object. As with other session +** APIs, tables without PRIMARY KEYs are simply ignored. +** +** This function adds a set of changes to the session object that could be +** used to update the table in database zFrom (call this the "from-table") +** so that its content is the same as the table attached to the session +** object (call this the "to-table"). Specifically: +** +**
        +**
      • For each row (primary key) that exists in the to-table but not in +** the from-table, an INSERT record is added to the session object. +** +**
      • For each row (primary key) that exists in the to-table but not in +** the from-table, a DELETE record is added to the session object. +** +**
      • For each row (primary key) that exists in both tables, but features +** different non-PK values in each, an UPDATE record is added to the +** session. +**
      +** +** To clarify, if this function is called and then a changeset constructed +** using [sqlite3session_changeset()], then after applying that changeset to +** database zFrom the contents of the two compatible tables would be +** identical. +** +** It an error if database zFrom does not exist or does not contain the +** required compatible table. +** +** If the operation successful, SQLITE_OK is returned. Otherwise, an SQLite +** error code. In this case, if argument pzErrMsg is not NULL, *pzErrMsg +** may be set to point to a buffer containing an English language error +** message. It is the responsibility of the caller to free this buffer using +** sqlite3_free(). +*/ +SQLITE_API int sqlite3session_diff( + sqlite3_session *pSession, + const char *zFromDb, + const char *zTbl, + char **pzErrMsg +); + + +/* +** CAPI3REF: Generate A Patchset From A Session Object +** +** The differences between a patchset and a changeset are that: +** +**
        +**
      • DELETE records consist of the primary key fields only. The +** original values of other fields are omitted. +**
      • The original values of any modified fields are omitted from +** UPDATE records. +**
      +** +** A patchset blob may be used with up to date versions of all +** sqlite3changeset_xxx API functions except for sqlite3changeset_invert(), +** which returns SQLITE_CORRUPT if it is passed a patchset. Similarly, +** attempting to use a patchset blob with old versions of the +** sqlite3changeset_xxx APIs also provokes an SQLITE_CORRUPT error. +** +** Because the non-primary key "old.*" fields are omitted, no +** SQLITE_CHANGESET_DATA conflicts can be detected or reported if a patchset +** is passed to the sqlite3changeset_apply() API. Other conflict types work +** in the same way as for changesets. +** +** Changes within a patchset are ordered in the same way as for changesets +** generated by the sqlite3session_changeset() function (i.e. all changes for +** a single table are grouped together, tables appear in the order in which +** they were attached to the session object). +*/ +SQLITE_API int sqlite3session_patchset( + sqlite3_session *pSession, /* Session object */ + int *pnPatchset, /* OUT: Size of buffer at *ppPatchset */ + void **ppPatchset /* OUT: Buffer containing patchset */ +); + +/* +** CAPI3REF: Test if a changeset has recorded any changes. +** +** Return non-zero if no changes to attached tables have been recorded by +** the session object passed as the first argument. Otherwise, if one or +** more changes have been recorded, return zero. +** +** Even if this function returns zero, it is possible that calling +** [sqlite3session_changeset()] on the session handle may still return a +** changeset that contains no changes. This can happen when a row in +** an attached table is modified and then later on the original values +** are restored. However, if this function returns non-zero, then it is +** guaranteed that a call to sqlite3session_changeset() will return a +** changeset containing zero changes. +*/ +SQLITE_API int sqlite3session_isempty(sqlite3_session *pSession); + +/* +** CAPI3REF: Create An Iterator To Traverse A Changeset +** +** Create an iterator used to iterate through the contents of a changeset. +** If successful, *pp is set to point to the iterator handle and SQLITE_OK +** is returned. Otherwise, if an error occurs, *pp is set to zero and an +** SQLite error code is returned. +** +** The following functions can be used to advance and query a changeset +** iterator created by this function: +** +**
        +**
      • [sqlite3changeset_next()] +**
      • [sqlite3changeset_op()] +**
      • [sqlite3changeset_new()] +**
      • [sqlite3changeset_old()] +**
      +** +** It is the responsibility of the caller to eventually destroy the iterator +** by passing it to [sqlite3changeset_finalize()]. The buffer containing the +** changeset (pChangeset) must remain valid until after the iterator is +** destroyed. +** +** Assuming the changeset blob was created by one of the +** [sqlite3session_changeset()], [sqlite3changeset_concat()] or +** [sqlite3changeset_invert()] functions, all changes within the changeset +** that apply to a single table are grouped together. This means that when +** an application iterates through a changeset using an iterator created by +** this function, all changes that relate to a single table are visited +** consecutively. There is no chance that the iterator will visit a change +** the applies to table X, then one for table Y, and then later on visit +** another change for table X. +*/ +SQLITE_API int sqlite3changeset_start( + sqlite3_changeset_iter **pp, /* OUT: New changeset iterator handle */ + int nChangeset, /* Size of changeset blob in bytes */ + void *pChangeset /* Pointer to blob containing changeset */ +); + + +/* +** CAPI3REF: Advance A Changeset Iterator +** +** This function may only be used with iterators created by function +** [sqlite3changeset_start()]. If it is called on an iterator passed to +** a conflict-handler callback by [sqlite3changeset_apply()], SQLITE_MISUSE +** is returned and the call has no effect. +** +** Immediately after an iterator is created by sqlite3changeset_start(), it +** does not point to any change in the changeset. Assuming the changeset +** is not empty, the first call to this function advances the iterator to +** point to the first change in the changeset. Each subsequent call advances +** the iterator to point to the next change in the changeset (if any). If +** no error occurs and the iterator points to a valid change after a call +** to sqlite3changeset_next() has advanced it, SQLITE_ROW is returned. +** Otherwise, if all changes in the changeset have already been visited, +** SQLITE_DONE is returned. +** +** If an error occurs, an SQLite error code is returned. Possible error +** codes include SQLITE_CORRUPT (if the changeset buffer is corrupt) or +** SQLITE_NOMEM. +*/ +SQLITE_API int sqlite3changeset_next(sqlite3_changeset_iter *pIter); + +/* +** CAPI3REF: Obtain The Current Operation From A Changeset Iterator +** +** The pIter argument passed to this function may either be an iterator +** passed to a conflict-handler by [sqlite3changeset_apply()], or an iterator +** created by [sqlite3changeset_start()]. In the latter case, the most recent +** call to [sqlite3changeset_next()] must have returned [SQLITE_ROW]. If this +** is not the case, this function returns [SQLITE_MISUSE]. +** +** If argument pzTab is not NULL, then *pzTab is set to point to a +** nul-terminated utf-8 encoded string containing the name of the table +** affected by the current change. The buffer remains valid until either +** sqlite3changeset_next() is called on the iterator or until the +** conflict-handler function returns. If pnCol is not NULL, then *pnCol is +** set to the number of columns in the table affected by the change. If +** pbIncorrect is not NULL, then *pbIndirect is set to true (1) if the change +** is an indirect change, or false (0) otherwise. See the documentation for +** [sqlite3session_indirect()] for a description of direct and indirect +** changes. Finally, if pOp is not NULL, then *pOp is set to one of +** [SQLITE_INSERT], [SQLITE_DELETE] or [SQLITE_UPDATE], depending on the +** type of change that the iterator currently points to. +** +** If no error occurs, SQLITE_OK is returned. If an error does occur, an +** SQLite error code is returned. The values of the output variables may not +** be trusted in this case. +*/ +SQLITE_API int sqlite3changeset_op( + sqlite3_changeset_iter *pIter, /* Iterator object */ + const char **pzTab, /* OUT: Pointer to table name */ + int *pnCol, /* OUT: Number of columns in table */ + int *pOp, /* OUT: SQLITE_INSERT, DELETE or UPDATE */ + int *pbIndirect /* OUT: True for an 'indirect' change */ +); + +/* +** CAPI3REF: Obtain The Primary Key Definition Of A Table +** +** For each modified table, a changeset includes the following: +** +**
        +**
      • The number of columns in the table, and +**
      • Which of those columns make up the tables PRIMARY KEY. +**
      +** +** This function is used to find which columns comprise the PRIMARY KEY of +** the table modified by the change that iterator pIter currently points to. +** If successful, *pabPK is set to point to an array of nCol entries, where +** nCol is the number of columns in the table. Elements of *pabPK are set to +** 0x01 if the corresponding column is part of the tables primary key, or +** 0x00 if it is not. +** +** If argument pnCol is not NULL, then *pnCol is set to the number of columns +** in the table. +** +** If this function is called when the iterator does not point to a valid +** entry, SQLITE_MISUSE is returned and the output variables zeroed. Otherwise, +** SQLITE_OK is returned and the output variables populated as described +** above. +*/ +SQLITE_API int sqlite3changeset_pk( + sqlite3_changeset_iter *pIter, /* Iterator object */ + unsigned char **pabPK, /* OUT: Array of boolean - true for PK cols */ + int *pnCol /* OUT: Number of entries in output array */ +); + +/* +** CAPI3REF: Obtain old.* Values From A Changeset Iterator +** +** The pIter argument passed to this function may either be an iterator +** passed to a conflict-handler by [sqlite3changeset_apply()], or an iterator +** created by [sqlite3changeset_start()]. In the latter case, the most recent +** call to [sqlite3changeset_next()] must have returned SQLITE_ROW. +** Furthermore, it may only be called if the type of change that the iterator +** currently points to is either [SQLITE_DELETE] or [SQLITE_UPDATE]. Otherwise, +** this function returns [SQLITE_MISUSE] and sets *ppValue to NULL. +** +** Argument iVal must be greater than or equal to 0, and less than the number +** of columns in the table affected by the current change. Otherwise, +** [SQLITE_RANGE] is returned and *ppValue is set to NULL. +** +** If successful, this function sets *ppValue to point to a protected +** sqlite3_value object containing the iVal'th value from the vector of +** original row values stored as part of the UPDATE or DELETE change and +** returns SQLITE_OK. The name of the function comes from the fact that this +** is similar to the "old.*" columns available to update or delete triggers. +** +** If some other error occurs (e.g. an OOM condition), an SQLite error code +** is returned and *ppValue is set to NULL. +*/ +SQLITE_API int sqlite3changeset_old( + sqlite3_changeset_iter *pIter, /* Changeset iterator */ + int iVal, /* Column number */ + sqlite3_value **ppValue /* OUT: Old value (or NULL pointer) */ +); + +/* +** CAPI3REF: Obtain new.* Values From A Changeset Iterator +** +** The pIter argument passed to this function may either be an iterator +** passed to a conflict-handler by [sqlite3changeset_apply()], or an iterator +** created by [sqlite3changeset_start()]. In the latter case, the most recent +** call to [sqlite3changeset_next()] must have returned SQLITE_ROW. +** Furthermore, it may only be called if the type of change that the iterator +** currently points to is either [SQLITE_UPDATE] or [SQLITE_INSERT]. Otherwise, +** this function returns [SQLITE_MISUSE] and sets *ppValue to NULL. +** +** Argument iVal must be greater than or equal to 0, and less than the number +** of columns in the table affected by the current change. Otherwise, +** [SQLITE_RANGE] is returned and *ppValue is set to NULL. +** +** If successful, this function sets *ppValue to point to a protected +** sqlite3_value object containing the iVal'th value from the vector of +** new row values stored as part of the UPDATE or INSERT change and +** returns SQLITE_OK. If the change is an UPDATE and does not include +** a new value for the requested column, *ppValue is set to NULL and +** SQLITE_OK returned. The name of the function comes from the fact that +** this is similar to the "new.*" columns available to update or delete +** triggers. +** +** If some other error occurs (e.g. an OOM condition), an SQLite error code +** is returned and *ppValue is set to NULL. +*/ +SQLITE_API int sqlite3changeset_new( + sqlite3_changeset_iter *pIter, /* Changeset iterator */ + int iVal, /* Column number */ + sqlite3_value **ppValue /* OUT: New value (or NULL pointer) */ +); + +/* +** CAPI3REF: Obtain Conflicting Row Values From A Changeset Iterator +** +** This function should only be used with iterator objects passed to a +** conflict-handler callback by [sqlite3changeset_apply()] with either +** [SQLITE_CHANGESET_DATA] or [SQLITE_CHANGESET_CONFLICT]. If this function +** is called on any other iterator, [SQLITE_MISUSE] is returned and *ppValue +** is set to NULL. +** +** Argument iVal must be greater than or equal to 0, and less than the number +** of columns in the table affected by the current change. Otherwise, +** [SQLITE_RANGE] is returned and *ppValue is set to NULL. +** +** If successful, this function sets *ppValue to point to a protected +** sqlite3_value object containing the iVal'th value from the +** "conflicting row" associated with the current conflict-handler callback +** and returns SQLITE_OK. +** +** If some other error occurs (e.g. an OOM condition), an SQLite error code +** is returned and *ppValue is set to NULL. +*/ +SQLITE_API int sqlite3changeset_conflict( + sqlite3_changeset_iter *pIter, /* Changeset iterator */ + int iVal, /* Column number */ + sqlite3_value **ppValue /* OUT: Value from conflicting row */ +); + +/* +** CAPI3REF: Determine The Number Of Foreign Key Constraint Violations +** +** This function may only be called with an iterator passed to an +** SQLITE_CHANGESET_FOREIGN_KEY conflict handler callback. In this case +** it sets the output variable to the total number of known foreign key +** violations in the destination database and returns SQLITE_OK. +** +** In all other cases this function returns SQLITE_MISUSE. +*/ +SQLITE_API int sqlite3changeset_fk_conflicts( + sqlite3_changeset_iter *pIter, /* Changeset iterator */ + int *pnOut /* OUT: Number of FK violations */ +); + + +/* +** CAPI3REF: Finalize A Changeset Iterator +** +** This function is used to finalize an iterator allocated with +** [sqlite3changeset_start()]. +** +** This function should only be called on iterators created using the +** [sqlite3changeset_start()] function. If an application calls this +** function with an iterator passed to a conflict-handler by +** [sqlite3changeset_apply()], [SQLITE_MISUSE] is immediately returned and the +** call has no effect. +** +** If an error was encountered within a call to an sqlite3changeset_xxx() +** function (for example an [SQLITE_CORRUPT] in [sqlite3changeset_next()] or an +** [SQLITE_NOMEM] in [sqlite3changeset_new()]) then an error code corresponding +** to that error is returned by this function. Otherwise, SQLITE_OK is +** returned. This is to allow the following pattern (pseudo-code): +** +** sqlite3changeset_start(); +** while( SQLITE_ROW==sqlite3changeset_next() ){ +** // Do something with change. +** } +** rc = sqlite3changeset_finalize(); +** if( rc!=SQLITE_OK ){ +** // An error has occurred +** } +*/ +SQLITE_API int sqlite3changeset_finalize(sqlite3_changeset_iter *pIter); + +/* +** CAPI3REF: Invert A Changeset +** +** This function is used to "invert" a changeset object. Applying an inverted +** changeset to a database reverses the effects of applying the uninverted +** changeset. Specifically: +** +**
        +**
      • Each DELETE change is changed to an INSERT, and +**
      • Each INSERT change is changed to a DELETE, and +**
      • For each UPDATE change, the old.* and new.* values are exchanged. +**
      +** +** This function does not change the order in which changes appear within +** the changeset. It merely reverses the sense of each individual change. +** +** If successful, a pointer to a buffer containing the inverted changeset +** is stored in *ppOut, the size of the same buffer is stored in *pnOut, and +** SQLITE_OK is returned. If an error occurs, both *pnOut and *ppOut are +** zeroed and an SQLite error code returned. +** +** It is the responsibility of the caller to eventually call sqlite3_free() +** on the *ppOut pointer to free the buffer allocation following a successful +** call to this function. +** +** WARNING/TODO: This function currently assumes that the input is a valid +** changeset. If it is not, the results are undefined. +*/ +SQLITE_API int sqlite3changeset_invert( + int nIn, const void *pIn, /* Input changeset */ + int *pnOut, void **ppOut /* OUT: Inverse of input */ +); + +/* +** CAPI3REF: Concatenate Two Changeset Objects +** +** This function is used to concatenate two changesets, A and B, into a +** single changeset. The result is a changeset equivalent to applying +** changeset A followed by changeset B. +** +** This function combines the two input changesets using an +** sqlite3_changegroup object. Calling it produces similar results as the +** following code fragment: +** +** sqlite3_changegroup *pGrp; +** rc = sqlite3_changegroup_new(&pGrp); +** if( rc==SQLITE_OK ) rc = sqlite3changegroup_add(pGrp, nA, pA); +** if( rc==SQLITE_OK ) rc = sqlite3changegroup_add(pGrp, nB, pB); +** if( rc==SQLITE_OK ){ +** rc = sqlite3changegroup_output(pGrp, pnOut, ppOut); +** }else{ +** *ppOut = 0; +** *pnOut = 0; +** } +** +** Refer to the sqlite3_changegroup documentation below for details. +*/ +SQLITE_API int sqlite3changeset_concat( + int nA, /* Number of bytes in buffer pA */ + void *pA, /* Pointer to buffer containing changeset A */ + int nB, /* Number of bytes in buffer pB */ + void *pB, /* Pointer to buffer containing changeset B */ + int *pnOut, /* OUT: Number of bytes in output changeset */ + void **ppOut /* OUT: Buffer containing output changeset */ +); + + +/* +** CAPI3REF: Changegroup Handle +*/ +typedef struct sqlite3_changegroup sqlite3_changegroup; + +/* +** CAPI3REF: Create A New Changegroup Object +** +** An sqlite3_changegroup object is used to combine two or more changesets +** (or patchsets) into a single changeset (or patchset). A single changegroup +** object may combine changesets or patchsets, but not both. The output is +** always in the same format as the input. +** +** If successful, this function returns SQLITE_OK and populates (*pp) with +** a pointer to a new sqlite3_changegroup object before returning. The caller +** should eventually free the returned object using a call to +** sqlite3changegroup_delete(). If an error occurs, an SQLite error code +** (i.e. SQLITE_NOMEM) is returned and *pp is set to NULL. +** +** The usual usage pattern for an sqlite3_changegroup object is as follows: +** +**
        +**
      • It is created using a call to sqlite3changegroup_new(). +** +**
      • Zero or more changesets (or patchsets) are added to the object +** by calling sqlite3changegroup_add(). +** +**
      • The result of combining all input changesets together is obtained +** by the application via a call to sqlite3changegroup_output(). +** +**
      • The object is deleted using a call to sqlite3changegroup_delete(). +**
      +** +** Any number of calls to add() and output() may be made between the calls to +** new() and delete(), and in any order. +** +** As well as the regular sqlite3changegroup_add() and +** sqlite3changegroup_output() functions, also available are the streaming +** versions sqlite3changegroup_add_strm() and sqlite3changegroup_output_strm(). +*/ +SQLITE_API int sqlite3changegroup_new(sqlite3_changegroup **pp); + +/* +** CAPI3REF: Add A Changeset To A Changegroup +** +** Add all changes within the changeset (or patchset) in buffer pData (size +** nData bytes) to the changegroup. +** +** If the buffer contains a patchset, then all prior calls to this function +** on the same changegroup object must also have specified patchsets. Or, if +** the buffer contains a changeset, so must have the earlier calls to this +** function. Otherwise, SQLITE_ERROR is returned and no changes are added +** to the changegroup. +** +** Rows within the changeset and changegroup are identified by the values in +** their PRIMARY KEY columns. A change in the changeset is considered to +** apply to the same row as a change already present in the changegroup if +** the two rows have the same primary key. +** +** Changes to rows that do not already appear in the changegroup are +** simply copied into it. Or, if both the new changeset and the changegroup +** contain changes that apply to a single row, the final contents of the +** changegroup depends on the type of each change, as follows: +** +** +** +** +**
      Existing Change New Change Output Change +**
      INSERT INSERT +** The new change is ignored. This case does not occur if the new +** changeset was recorded immediately after the changesets already +** added to the changegroup. +**
      INSERT UPDATE +** The INSERT change remains in the changegroup. The values in the +** INSERT change are modified as if the row was inserted by the +** existing change and then updated according to the new change. +**
      INSERT DELETE +** The existing INSERT is removed from the changegroup. The DELETE is +** not added. +**
      UPDATE INSERT +** The new change is ignored. This case does not occur if the new +** changeset was recorded immediately after the changesets already +** added to the changegroup. +**
      UPDATE UPDATE +** The existing UPDATE remains within the changegroup. It is amended +** so that the accompanying values are as if the row was updated once +** by the existing change and then again by the new change. +**
      UPDATE DELETE +** The existing UPDATE is replaced by the new DELETE within the +** changegroup. +**
      DELETE INSERT +** If one or more of the column values in the row inserted by the +** new change differ from those in the row deleted by the existing +** change, the existing DELETE is replaced by an UPDATE within the +** changegroup. Otherwise, if the inserted row is exactly the same +** as the deleted row, the existing DELETE is simply discarded. +**
      DELETE UPDATE +** The new change is ignored. This case does not occur if the new +** changeset was recorded immediately after the changesets already +** added to the changegroup. +**
      DELETE DELETE +** The new change is ignored. This case does not occur if the new +** changeset was recorded immediately after the changesets already +** added to the changegroup. +**
      +** +** If the new changeset contains changes to a table that is already present +** in the changegroup, then the number of columns and the position of the +** primary key columns for the table must be consistent. If this is not the +** case, this function fails with SQLITE_SCHEMA. If the input changeset +** appears to be corrupt and the corruption is detected, SQLITE_CORRUPT is +** returned. Or, if an out-of-memory condition occurs during processing, this +** function returns SQLITE_NOMEM. In all cases, if an error occurs the +** final contents of the changegroup is undefined. +** +** If no error occurs, SQLITE_OK is returned. +*/ +SQLITE_API int sqlite3changegroup_add(sqlite3_changegroup*, int nData, void *pData); + +/* +** CAPI3REF: Obtain A Composite Changeset From A Changegroup +** +** Obtain a buffer containing a changeset (or patchset) representing the +** current contents of the changegroup. If the inputs to the changegroup +** were themselves changesets, the output is a changeset. Or, if the +** inputs were patchsets, the output is also a patchset. +** +** As with the output of the sqlite3session_changeset() and +** sqlite3session_patchset() functions, all changes related to a single +** table are grouped together in the output of this function. Tables appear +** in the same order as for the very first changeset added to the changegroup. +** If the second or subsequent changesets added to the changegroup contain +** changes for tables that do not appear in the first changeset, they are +** appended onto the end of the output changeset, again in the order in +** which they are first encountered. +** +** If an error occurs, an SQLite error code is returned and the output +** variables (*pnData) and (*ppData) are set to 0. Otherwise, SQLITE_OK +** is returned and the output variables are set to the size of and a +** pointer to the output buffer, respectively. In this case it is the +** responsibility of the caller to eventually free the buffer using a +** call to sqlite3_free(). +*/ +SQLITE_API int sqlite3changegroup_output( + sqlite3_changegroup*, + int *pnData, /* OUT: Size of output buffer in bytes */ + void **ppData /* OUT: Pointer to output buffer */ +); + +/* +** CAPI3REF: Delete A Changegroup Object +*/ +SQLITE_API void sqlite3changegroup_delete(sqlite3_changegroup*); + +/* +** CAPI3REF: Apply A Changeset To A Database +** +** Apply a changeset to a database. This function attempts to update the +** "main" database attached to handle db with the changes found in the +** changeset passed via the second and third arguments. +** +** The fourth argument (xFilter) passed to this function is the "filter +** callback". If it is not NULL, then for each table affected by at least one +** change in the changeset, the filter callback is invoked with +** the table name as the second argument, and a copy of the context pointer +** passed as the sixth argument to this function as the first. If the "filter +** callback" returns zero, then no attempt is made to apply any changes to +** the table. Otherwise, if the return value is non-zero or the xFilter +** argument to this function is NULL, all changes related to the table are +** attempted. +** +** For each table that is not excluded by the filter callback, this function +** tests that the target database contains a compatible table. A table is +** considered compatible if all of the following are true: +** +**
        +**
      • The table has the same name as the name recorded in the +** changeset, and +**
      • The table has at least as many columns as recorded in the +** changeset, and +**
      • The table has primary key columns in the same position as +** recorded in the changeset. +**
      +** +** If there is no compatible table, it is not an error, but none of the +** changes associated with the table are applied. A warning message is issued +** via the sqlite3_log() mechanism with the error code SQLITE_SCHEMA. At most +** one such warning is issued for each table in the changeset. +** +** For each change for which there is a compatible table, an attempt is made +** to modify the table contents according to the UPDATE, INSERT or DELETE +** change. If a change cannot be applied cleanly, the conflict handler +** function passed as the fifth argument to sqlite3changeset_apply() may be +** invoked. A description of exactly when the conflict handler is invoked for +** each type of change is below. +** +** Unlike the xFilter argument, xConflict may not be passed NULL. The results +** of passing anything other than a valid function pointer as the xConflict +** argument are undefined. +** +** Each time the conflict handler function is invoked, it must return one +** of [SQLITE_CHANGESET_OMIT], [SQLITE_CHANGESET_ABORT] or +** [SQLITE_CHANGESET_REPLACE]. SQLITE_CHANGESET_REPLACE may only be returned +** if the second argument passed to the conflict handler is either +** SQLITE_CHANGESET_DATA or SQLITE_CHANGESET_CONFLICT. If the conflict-handler +** returns an illegal value, any changes already made are rolled back and +** the call to sqlite3changeset_apply() returns SQLITE_MISUSE. Different +** actions are taken by sqlite3changeset_apply() depending on the value +** returned by each invocation of the conflict-handler function. Refer to +** the documentation for the three +** [SQLITE_CHANGESET_OMIT|available return values] for details. +** +**
      +**
      DELETE Changes
      +** For each DELETE change, this function checks if the target database +** contains a row with the same primary key value (or values) as the +** original row values stored in the changeset. If it does, and the values +** stored in all non-primary key columns also match the values stored in +** the changeset the row is deleted from the target database. +** +** If a row with matching primary key values is found, but one or more of +** the non-primary key fields contains a value different from the original +** row value stored in the changeset, the conflict-handler function is +** invoked with [SQLITE_CHANGESET_DATA] as the second argument. If the +** database table has more columns than are recorded in the changeset, +** only the values of those non-primary key fields are compared against +** the current database contents - any trailing database table columns +** are ignored. +** +** If no row with matching primary key values is found in the database, +** the conflict-handler function is invoked with [SQLITE_CHANGESET_NOTFOUND] +** passed as the second argument. +** +** If the DELETE operation is attempted, but SQLite returns SQLITE_CONSTRAINT +** (which can only happen if a foreign key constraint is violated), the +** conflict-handler function is invoked with [SQLITE_CHANGESET_CONSTRAINT] +** passed as the second argument. This includes the case where the DELETE +** operation is attempted because an earlier call to the conflict handler +** function returned [SQLITE_CHANGESET_REPLACE]. +** +**
      INSERT Changes
      +** For each INSERT change, an attempt is made to insert the new row into +** the database. If the changeset row contains fewer fields than the +** database table, the trailing fields are populated with their default +** values. +** +** If the attempt to insert the row fails because the database already +** contains a row with the same primary key values, the conflict handler +** function is invoked with the second argument set to +** [SQLITE_CHANGESET_CONFLICT]. +** +** If the attempt to insert the row fails because of some other constraint +** violation (e.g. NOT NULL or UNIQUE), the conflict handler function is +** invoked with the second argument set to [SQLITE_CHANGESET_CONSTRAINT]. +** This includes the case where the INSERT operation is re-attempted because +** an earlier call to the conflict handler function returned +** [SQLITE_CHANGESET_REPLACE]. +** +**
      UPDATE Changes
      +** For each UPDATE change, this function checks if the target database +** contains a row with the same primary key value (or values) as the +** original row values stored in the changeset. If it does, and the values +** stored in all modified non-primary key columns also match the values +** stored in the changeset the row is updated within the target database. +** +** If a row with matching primary key values is found, but one or more of +** the modified non-primary key fields contains a value different from an +** original row value stored in the changeset, the conflict-handler function +** is invoked with [SQLITE_CHANGESET_DATA] as the second argument. Since +** UPDATE changes only contain values for non-primary key fields that are +** to be modified, only those fields need to match the original values to +** avoid the SQLITE_CHANGESET_DATA conflict-handler callback. +** +** If no row with matching primary key values is found in the database, +** the conflict-handler function is invoked with [SQLITE_CHANGESET_NOTFOUND] +** passed as the second argument. +** +** If the UPDATE operation is attempted, but SQLite returns +** SQLITE_CONSTRAINT, the conflict-handler function is invoked with +** [SQLITE_CHANGESET_CONSTRAINT] passed as the second argument. +** This includes the case where the UPDATE operation is attempted after +** an earlier call to the conflict handler function returned +** [SQLITE_CHANGESET_REPLACE]. +**
      +** +** It is safe to execute SQL statements, including those that write to the +** table that the callback related to, from within the xConflict callback. +** This can be used to further customize the applications conflict +** resolution strategy. +** +** All changes made by this function are enclosed in a savepoint transaction. +** If any other error (aside from a constraint failure when attempting to +** write to the target database) occurs, then the savepoint transaction is +** rolled back, restoring the target database to its original state, and an +** SQLite error code returned. +*/ +SQLITE_API int sqlite3changeset_apply( + sqlite3 *db, /* Apply change to "main" db of this handle */ + int nChangeset, /* Size of changeset in bytes */ + void *pChangeset, /* Changeset blob */ + int(*xFilter)( + void *pCtx, /* Copy of sixth arg to _apply() */ + const char *zTab /* Table name */ + ), + int(*xConflict)( + void *pCtx, /* Copy of sixth arg to _apply() */ + int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */ + sqlite3_changeset_iter *p /* Handle describing change and conflict */ + ), + void *pCtx /* First argument passed to xConflict */ +); + +/* +** CAPI3REF: Constants Passed To The Conflict Handler +** +** Values that may be passed as the second argument to a conflict-handler. +** +**
      +**
      SQLITE_CHANGESET_DATA
      +** The conflict handler is invoked with CHANGESET_DATA as the second argument +** when processing a DELETE or UPDATE change if a row with the required +** PRIMARY KEY fields is present in the database, but one or more other +** (non primary-key) fields modified by the update do not contain the +** expected "before" values. +** +** The conflicting row, in this case, is the database row with the matching +** primary key. +** +**
      SQLITE_CHANGESET_NOTFOUND
      +** The conflict handler is invoked with CHANGESET_NOTFOUND as the second +** argument when processing a DELETE or UPDATE change if a row with the +** required PRIMARY KEY fields is not present in the database. +** +** There is no conflicting row in this case. The results of invoking the +** sqlite3changeset_conflict() API are undefined. +** +**
      SQLITE_CHANGESET_CONFLICT
      +** CHANGESET_CONFLICT is passed as the second argument to the conflict +** handler while processing an INSERT change if the operation would result +** in duplicate primary key values. +** +** The conflicting row in this case is the database row with the matching +** primary key. +** +**
      SQLITE_CHANGESET_FOREIGN_KEY
      +** If foreign key handling is enabled, and applying a changeset leaves the +** database in a state containing foreign key violations, the conflict +** handler is invoked with CHANGESET_FOREIGN_KEY as the second argument +** exactly once before the changeset is committed. If the conflict handler +** returns CHANGESET_OMIT, the changes, including those that caused the +** foreign key constraint violation, are committed. Or, if it returns +** CHANGESET_ABORT, the changeset is rolled back. +** +** No current or conflicting row information is provided. The only function +** it is possible to call on the supplied sqlite3_changeset_iter handle +** is sqlite3changeset_fk_conflicts(). +** +**
      SQLITE_CHANGESET_CONSTRAINT
      +** If any other constraint violation occurs while applying a change (i.e. +** a UNIQUE, CHECK or NOT NULL constraint), the conflict handler is +** invoked with CHANGESET_CONSTRAINT as the second argument. +** +** There is no conflicting row in this case. The results of invoking the +** sqlite3changeset_conflict() API are undefined. +** +**
      +*/ +#define SQLITE_CHANGESET_DATA 1 +#define SQLITE_CHANGESET_NOTFOUND 2 +#define SQLITE_CHANGESET_CONFLICT 3 +#define SQLITE_CHANGESET_CONSTRAINT 4 +#define SQLITE_CHANGESET_FOREIGN_KEY 5 + +/* +** CAPI3REF: Constants Returned By The Conflict Handler +** +** A conflict handler callback must return one of the following three values. +** +**
      +**
      SQLITE_CHANGESET_OMIT
      +** If a conflict handler returns this value no special action is taken. The +** change that caused the conflict is not applied. The session module +** continues to the next change in the changeset. +** +**
      SQLITE_CHANGESET_REPLACE
      +** This value may only be returned if the second argument to the conflict +** handler was SQLITE_CHANGESET_DATA or SQLITE_CHANGESET_CONFLICT. If this +** is not the case, any changes applied so far are rolled back and the +** call to sqlite3changeset_apply() returns SQLITE_MISUSE. +** +** If CHANGESET_REPLACE is returned by an SQLITE_CHANGESET_DATA conflict +** handler, then the conflicting row is either updated or deleted, depending +** on the type of change. +** +** If CHANGESET_REPLACE is returned by an SQLITE_CHANGESET_CONFLICT conflict +** handler, then the conflicting row is removed from the database and a +** second attempt to apply the change is made. If this second attempt fails, +** the original row is restored to the database before continuing. +** +**
      SQLITE_CHANGESET_ABORT
      +** If this value is returned, any changes applied so far are rolled back +** and the call to sqlite3changeset_apply() returns SQLITE_ABORT. +**
      +*/ +#define SQLITE_CHANGESET_OMIT 0 +#define SQLITE_CHANGESET_REPLACE 1 +#define SQLITE_CHANGESET_ABORT 2 + +/* +** CAPI3REF: Streaming Versions of API functions. +** +** The six streaming API xxx_strm() functions serve similar purposes to the +** corresponding non-streaming API functions: +** +** +** +**
      Streaming functionNon-streaming equivalent
      sqlite3changeset_apply_strm[sqlite3changeset_apply] +**
      sqlite3changeset_concat_strm[sqlite3changeset_concat] +**
      sqlite3changeset_invert_strm[sqlite3changeset_invert] +**
      sqlite3changeset_start_strm[sqlite3changeset_start] +**
      sqlite3session_changeset_strm[sqlite3session_changeset] +**
      sqlite3session_patchset_strm[sqlite3session_patchset] +**
      +** +** Non-streaming functions that accept changesets (or patchsets) as input +** require that the entire changeset be stored in a single buffer in memory. +** Similarly, those that return a changeset or patchset do so by returning +** a pointer to a single large buffer allocated using sqlite3_malloc(). +** Normally this is convenient. However, if an application running in a +** low-memory environment is required to handle very large changesets, the +** large contiguous memory allocations required can become onerous. +** +** In order to avoid this problem, instead of a single large buffer, input +** is passed to a streaming API functions by way of a callback function that +** the sessions module invokes to incrementally request input data as it is +** required. In all cases, a pair of API function parameters such as +** +**
      +**        int nChangeset,
      +**        void *pChangeset,
      +**  
      +** +** Is replaced by: +** +**
      +**        int (*xInput)(void *pIn, void *pData, int *pnData),
      +**        void *pIn,
      +**  
      +** +** Each time the xInput callback is invoked by the sessions module, the first +** argument passed is a copy of the supplied pIn context pointer. The second +** argument, pData, points to a buffer (*pnData) bytes in size. Assuming no +** error occurs the xInput method should copy up to (*pnData) bytes of data +** into the buffer and set (*pnData) to the actual number of bytes copied +** before returning SQLITE_OK. If the input is completely exhausted, (*pnData) +** should be set to zero to indicate this. Or, if an error occurs, an SQLite +** error code should be returned. In all cases, if an xInput callback returns +** an error, all processing is abandoned and the streaming API function +** returns a copy of the error code to the caller. +** +** In the case of sqlite3changeset_start_strm(), the xInput callback may be +** invoked by the sessions module at any point during the lifetime of the +** iterator. If such an xInput callback returns an error, the iterator enters +** an error state, whereby all subsequent calls to iterator functions +** immediately fail with the same error code as returned by xInput. +** +** Similarly, streaming API functions that return changesets (or patchsets) +** return them in chunks by way of a callback function instead of via a +** pointer to a single large buffer. In this case, a pair of parameters such +** as: +** +**
      +**        int *pnChangeset,
      +**        void **ppChangeset,
      +**  
      +** +** Is replaced by: +** +**
      +**        int (*xOutput)(void *pOut, const void *pData, int nData),
      +**        void *pOut
      +**  
      +** +** The xOutput callback is invoked zero or more times to return data to +** the application. The first parameter passed to each call is a copy of the +** pOut pointer supplied by the application. The second parameter, pData, +** points to a buffer nData bytes in size containing the chunk of output +** data being returned. If the xOutput callback successfully processes the +** supplied data, it should return SQLITE_OK to indicate success. Otherwise, +** it should return some other SQLite error code. In this case processing +** is immediately abandoned and the streaming API function returns a copy +** of the xOutput error code to the application. +** +** The sessions module never invokes an xOutput callback with the third +** parameter set to a value less than or equal to zero. Other than this, +** no guarantees are made as to the size of the chunks of data returned. +*/ +SQLITE_API int sqlite3changeset_apply_strm( + sqlite3 *db, /* Apply change to "main" db of this handle */ + int (*xInput)(void *pIn, void *pData, int *pnData), /* Input function */ + void *pIn, /* First arg for xInput */ + int(*xFilter)( + void *pCtx, /* Copy of sixth arg to _apply() */ + const char *zTab /* Table name */ + ), + int(*xConflict)( + void *pCtx, /* Copy of sixth arg to _apply() */ + int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */ + sqlite3_changeset_iter *p /* Handle describing change and conflict */ + ), + void *pCtx /* First argument passed to xConflict */ +); +SQLITE_API int sqlite3changeset_concat_strm( + int (*xInputA)(void *pIn, void *pData, int *pnData), + void *pInA, + int (*xInputB)(void *pIn, void *pData, int *pnData), + void *pInB, + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut +); +SQLITE_API int sqlite3changeset_invert_strm( + int (*xInput)(void *pIn, void *pData, int *pnData), + void *pIn, + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut +); +SQLITE_API int sqlite3changeset_start_strm( + sqlite3_changeset_iter **pp, + int (*xInput)(void *pIn, void *pData, int *pnData), + void *pIn +); +SQLITE_API int sqlite3session_changeset_strm( + sqlite3_session *pSession, + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut +); +SQLITE_API int sqlite3session_patchset_strm( + sqlite3_session *pSession, + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut +); +SQLITE_API int sqlite3changegroup_add_strm(sqlite3_changegroup*, + int (*xInput)(void *pIn, void *pData, int *pnData), + void *pIn +); +SQLITE_API int sqlite3changegroup_output_strm(sqlite3_changegroup*, + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut +); + + +/* +** Make sure we can call this stuff from C++. +*/ +#ifdef __cplusplus +} +#endif + +#endif /* !defined(__SQLITESESSION_H_) && defined(SQLITE_ENABLE_SESSION) */ + +/******** End of sqlite3session.h *********/ +/******** Begin file fts5.h *********/ +/* +** 2014 May 31 +** +** 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. +** +****************************************************************************** +** +** Interfaces to extend FTS5. Using the interfaces defined in this file, +** FTS5 may be extended with: +** +** * custom tokenizers, and +** * custom auxiliary functions. +*/ + + +#ifndef _FTS5_H +#define _FTS5_H + + +#ifdef __cplusplus +extern "C" { +#endif + +/************************************************************************* +** CUSTOM AUXILIARY FUNCTIONS +** +** Virtual table implementations may overload SQL functions by implementing +** the sqlite3_module.xFindFunction() method. +*/ + +typedef struct Fts5ExtensionApi Fts5ExtensionApi; +typedef struct Fts5Context Fts5Context; +typedef struct Fts5PhraseIter Fts5PhraseIter; + +typedef void (*fts5_extension_function)( + const Fts5ExtensionApi *pApi, /* API offered by current FTS version */ + Fts5Context *pFts, /* First arg to pass to pApi functions */ + sqlite3_context *pCtx, /* Context for returning result/error */ + int nVal, /* Number of values in apVal[] array */ + sqlite3_value **apVal /* Array of trailing arguments */ +); + +struct Fts5PhraseIter { + const unsigned char *a; + const unsigned char *b; +}; + +/* +** EXTENSION API FUNCTIONS +** +** xUserData(pFts): +** Return a copy of the context pointer the extension function was +** registered with. +** +** xColumnTotalSize(pFts, iCol, pnToken): +** If parameter iCol is less than zero, set output variable *pnToken +** to the total number of tokens in the FTS5 table. Or, if iCol is +** non-negative but less than the number of columns in the table, return +** the total number of tokens in column iCol, considering all rows in +** the FTS5 table. +** +** If parameter iCol is greater than or equal to the number of columns +** in the table, SQLITE_RANGE is returned. Or, if an error occurs (e.g. +** an OOM condition or IO error), an appropriate SQLite error code is +** returned. +** +** xColumnCount(pFts): +** Return the number of columns in the table. +** +** xColumnSize(pFts, iCol, pnToken): +** If parameter iCol is less than zero, set output variable *pnToken +** to the total number of tokens in the current row. Or, if iCol is +** non-negative but less than the number of columns in the table, set +** *pnToken to the number of tokens in column iCol of the current row. +** +** If parameter iCol is greater than or equal to the number of columns +** in the table, SQLITE_RANGE is returned. Or, if an error occurs (e.g. +** an OOM condition or IO error), an appropriate SQLite error code is +** returned. +** +** This function may be quite inefficient if used with an FTS5 table +** created with the "columnsize=0" option. +** +** xColumnText: +** This function attempts to retrieve the text of column iCol of the +** current document. If successful, (*pz) is set to point to a buffer +** containing the text in utf-8 encoding, (*pn) is set to the size in bytes +** (not characters) of the buffer and SQLITE_OK is returned. Otherwise, +** if an error occurs, an SQLite error code is returned and the final values +** of (*pz) and (*pn) are undefined. +** +** xPhraseCount: +** Returns the number of phrases in the current query expression. +** +** xPhraseSize: +** Returns the number of tokens in phrase iPhrase of the query. Phrases +** are numbered starting from zero. +** +** xInstCount: +** Set *pnInst to the total number of occurrences of all phrases within +** the query within the current row. Return SQLITE_OK if successful, or +** an error code (i.e. SQLITE_NOMEM) if an error occurs. +** +** This API can be quite slow if used with an FTS5 table created with the +** "detail=none" or "detail=column" option. If the FTS5 table is created +** with either "detail=none" or "detail=column" and "content=" option +** (i.e. if it is a contentless table), then this API always returns 0. +** +** xInst: +** Query for the details of phrase match iIdx within the current row. +** Phrase matches are numbered starting from zero, so the iIdx argument +** should be greater than or equal to zero and smaller than the value +** output by xInstCount(). +** +** Usually, output parameter *piPhrase is set to the phrase number, *piCol +** to the column in which it occurs and *piOff the token offset of the +** first token of the phrase. The exception is if the table was created +** with the offsets=0 option specified. In this case *piOff is always +** set to -1. +** +** Returns SQLITE_OK if successful, or an error code (i.e. SQLITE_NOMEM) +** if an error occurs. +** +** This API can be quite slow if used with an FTS5 table created with the +** "detail=none" or "detail=column" option. +** +** xRowid: +** Returns the rowid of the current row. +** +** xTokenize: +** Tokenize text using the tokenizer belonging to the FTS5 table. +** +** xQueryPhrase(pFts5, iPhrase, pUserData, xCallback): +** This API function is used to query the FTS table for phrase iPhrase +** of the current query. Specifically, a query equivalent to: +** +** ... FROM ftstable WHERE ftstable MATCH $p ORDER BY rowid +** +** with $p set to a phrase equivalent to the phrase iPhrase of the +** current query is executed. Any column filter that applies to +** phrase iPhrase of the current query is included in $p. For each +** row visited, the callback function passed as the fourth argument +** is invoked. The context and API objects passed to the callback +** function may be used to access the properties of each matched row. +** Invoking Api.xUserData() returns a copy of the pointer passed as +** the third argument to pUserData. +** +** If the callback function returns any value other than SQLITE_OK, the +** query is abandoned and the xQueryPhrase function returns immediately. +** If the returned value is SQLITE_DONE, xQueryPhrase returns SQLITE_OK. +** Otherwise, the error code is propagated upwards. +** +** If the query runs to completion without incident, SQLITE_OK is returned. +** Or, if some error occurs before the query completes or is aborted by +** the callback, an SQLite error code is returned. +** +** +** xSetAuxdata(pFts5, pAux, xDelete) +** +** Save the pointer passed as the second argument as the extension functions +** "auxiliary data". The pointer may then be retrieved by the current or any +** future invocation of the same fts5 extension function made as part of +** of the same MATCH query using the xGetAuxdata() API. +** +** Each extension function is allocated a single auxiliary data slot for +** each FTS query (MATCH expression). If the extension function is invoked +** more than once for a single FTS query, then all invocations share a +** single auxiliary data context. +** +** If there is already an auxiliary data pointer when this function is +** invoked, then it is replaced by the new pointer. If an xDelete callback +** was specified along with the original pointer, it is invoked at this +** point. +** +** The xDelete callback, if one is specified, is also invoked on the +** auxiliary data pointer after the FTS5 query has finished. +** +** If an error (e.g. an OOM condition) occurs within this function, an +** the auxiliary data is set to NULL and an error code returned. If the +** xDelete parameter was not NULL, it is invoked on the auxiliary data +** pointer before returning. +** +** +** xGetAuxdata(pFts5, bClear) +** +** Returns the current auxiliary data pointer for the fts5 extension +** function. See the xSetAuxdata() method for details. +** +** If the bClear argument is non-zero, then the auxiliary data is cleared +** (set to NULL) before this function returns. In this case the xDelete, +** if any, is not invoked. +** +** +** xRowCount(pFts5, pnRow) +** +** This function is used to retrieve the total number of rows in the table. +** In other words, the same value that would be returned by: +** +** SELECT count(*) FROM ftstable; +** +** xPhraseFirst() +** This function is used, along with type Fts5PhraseIter and the xPhraseNext +** method, to iterate through all instances of a single query phrase within +** the current row. This is the same information as is accessible via the +** xInstCount/xInst APIs. While the xInstCount/xInst APIs are more convenient +** to use, this API may be faster under some circumstances. To iterate +** through instances of phrase iPhrase, use the following code: +** +** Fts5PhraseIter iter; +** int iCol, iOff; +** for(pApi->xPhraseFirst(pFts, iPhrase, &iter, &iCol, &iOff); +** iCol>=0; +** pApi->xPhraseNext(pFts, &iter, &iCol, &iOff) +** ){ +** // An instance of phrase iPhrase at offset iOff of column iCol +** } +** +** The Fts5PhraseIter structure is defined above. Applications should not +** modify this structure directly - it should only be used as shown above +** with the xPhraseFirst() and xPhraseNext() API methods (and by +** xPhraseFirstColumn() and xPhraseNextColumn() as illustrated below). +** +** This API can be quite slow if used with an FTS5 table created with the +** "detail=none" or "detail=column" option. If the FTS5 table is created +** with either "detail=none" or "detail=column" and "content=" option +** (i.e. if it is a contentless table), then this API always iterates +** through an empty set (all calls to xPhraseFirst() set iCol to -1). +** +** xPhraseNext() +** See xPhraseFirst above. +** +** xPhraseFirstColumn() +** This function and xPhraseNextColumn() are similar to the xPhraseFirst() +** and xPhraseNext() APIs described above. The difference is that instead +** of iterating through all instances of a phrase in the current row, these +** APIs are used to iterate through the set of columns in the current row +** that contain one or more instances of a specified phrase. For example: +** +** Fts5PhraseIter iter; +** int iCol; +** for(pApi->xPhraseFirstColumn(pFts, iPhrase, &iter, &iCol); +** iCol>=0; +** pApi->xPhraseNextColumn(pFts, &iter, &iCol) +** ){ +** // Column iCol contains at least one instance of phrase iPhrase +** } +** +** This API can be quite slow if used with an FTS5 table created with the +** "detail=none" option. If the FTS5 table is created with either +** "detail=none" "content=" option (i.e. if it is a contentless table), +** then this API always iterates through an empty set (all calls to +** xPhraseFirstColumn() set iCol to -1). +** +** The information accessed using this API and its companion +** xPhraseFirstColumn() may also be obtained using xPhraseFirst/xPhraseNext +** (or xInst/xInstCount). The chief advantage of this API is that it is +** significantly more efficient than those alternatives when used with +** "detail=column" tables. +** +** xPhraseNextColumn() +** See xPhraseFirstColumn above. +*/ +struct Fts5ExtensionApi { + int iVersion; /* Currently always set to 3 */ + + void *(*xUserData)(Fts5Context*); + + int (*xColumnCount)(Fts5Context*); + int (*xRowCount)(Fts5Context*, sqlite3_int64 *pnRow); + int (*xColumnTotalSize)(Fts5Context*, int iCol, sqlite3_int64 *pnToken); + + int (*xTokenize)(Fts5Context*, + const char *pText, int nText, /* Text to tokenize */ + void *pCtx, /* Context passed to xToken() */ + int (*xToken)(void*, int, const char*, int, int, int) /* Callback */ + ); + + int (*xPhraseCount)(Fts5Context*); + int (*xPhraseSize)(Fts5Context*, int iPhrase); + + int (*xInstCount)(Fts5Context*, int *pnInst); + int (*xInst)(Fts5Context*, int iIdx, int *piPhrase, int *piCol, int *piOff); + + sqlite3_int64 (*xRowid)(Fts5Context*); + int (*xColumnText)(Fts5Context*, int iCol, const char **pz, int *pn); + int (*xColumnSize)(Fts5Context*, int iCol, int *pnToken); + + int (*xQueryPhrase)(Fts5Context*, int iPhrase, void *pUserData, + int(*)(const Fts5ExtensionApi*,Fts5Context*,void*) + ); + int (*xSetAuxdata)(Fts5Context*, void *pAux, void(*xDelete)(void*)); + void *(*xGetAuxdata)(Fts5Context*, int bClear); + + int (*xPhraseFirst)(Fts5Context*, int iPhrase, Fts5PhraseIter*, int*, int*); + void (*xPhraseNext)(Fts5Context*, Fts5PhraseIter*, int *piCol, int *piOff); + + int (*xPhraseFirstColumn)(Fts5Context*, int iPhrase, Fts5PhraseIter*, int*); + void (*xPhraseNextColumn)(Fts5Context*, Fts5PhraseIter*, int *piCol); +}; + +/* +** CUSTOM AUXILIARY FUNCTIONS +*************************************************************************/ + +/************************************************************************* +** CUSTOM TOKENIZERS +** +** Applications may also register custom tokenizer types. A tokenizer +** is registered by providing fts5 with a populated instance of the +** following structure. All structure methods must be defined, setting +** any member of the fts5_tokenizer struct to NULL leads to undefined +** behaviour. The structure methods are expected to function as follows: +** +** xCreate: +** This function is used to allocate and initialize a tokenizer instance. +** A tokenizer instance is required to actually tokenize text. +** +** The first argument passed to this function is a copy of the (void*) +** pointer provided by the application when the fts5_tokenizer object +** was registered with FTS5 (the third argument to xCreateTokenizer()). +** The second and third arguments are an array of nul-terminated strings +** containing the tokenizer arguments, if any, specified following the +** tokenizer name as part of the CREATE VIRTUAL TABLE statement used +** to create the FTS5 table. +** +** The final argument is an output variable. If successful, (*ppOut) +** should be set to point to the new tokenizer handle and SQLITE_OK +** returned. If an error occurs, some value other than SQLITE_OK should +** be returned. In this case, fts5 assumes that the final value of *ppOut +** is undefined. +** +** xDelete: +** This function is invoked to delete a tokenizer handle previously +** allocated using xCreate(). Fts5 guarantees that this function will +** be invoked exactly once for each successful call to xCreate(). +** +** xTokenize: +** This function is expected to tokenize the nText byte string indicated +** by argument pText. pText may or may not be nul-terminated. The first +** argument passed to this function is a pointer to an Fts5Tokenizer object +** returned by an earlier call to xCreate(). +** +** The second argument indicates the reason that FTS5 is requesting +** tokenization of the supplied text. This is always one of the following +** four values: +** +**
      • FTS5_TOKENIZE_DOCUMENT - A document is being inserted into +** or removed from the FTS table. The tokenizer is being invoked to +** determine the set of tokens to add to (or delete from) the +** FTS index. +** +**
      • FTS5_TOKENIZE_QUERY - A MATCH query is being executed +** against the FTS index. The tokenizer is being called to tokenize +** a bareword or quoted string specified as part of the query. +** +**
      • (FTS5_TOKENIZE_QUERY | FTS5_TOKENIZE_PREFIX) - Same as +** FTS5_TOKENIZE_QUERY, except that the bareword or quoted string is +** followed by a "*" character, indicating that the last token +** returned by the tokenizer will be treated as a token prefix. +** +**
      • FTS5_TOKENIZE_AUX - The tokenizer is being invoked to +** satisfy an fts5_api.xTokenize() request made by an auxiliary +** function. Or an fts5_api.xColumnSize() request made by the same +** on a columnsize=0 database. +**
      +** +** For each token in the input string, the supplied callback xToken() must +** be invoked. The first argument to it should be a copy of the pointer +** passed as the second argument to xTokenize(). The third and fourth +** arguments are a pointer to a buffer containing the token text, and the +** size of the token in bytes. The 4th and 5th arguments are the byte offsets +** of the first byte of and first byte immediately following the text from +** which the token is derived within the input. +** +** The second argument passed to the xToken() callback ("tflags") should +** normally be set to 0. The exception is if the tokenizer supports +** synonyms. In this case see the discussion below for details. +** +** FTS5 assumes the xToken() callback is invoked for each token in the +** order that they occur within the input text. +** +** If an xToken() callback returns any value other than SQLITE_OK, then +** the tokenization should be abandoned and the xTokenize() method should +** immediately return a copy of the xToken() return value. Or, if the +** input buffer is exhausted, xTokenize() should return SQLITE_OK. Finally, +** if an error occurs with the xTokenize() implementation itself, it +** may abandon the tokenization and return any error code other than +** SQLITE_OK or SQLITE_DONE. +** +** SYNONYM SUPPORT +** +** Custom tokenizers may also support synonyms. Consider a case in which a +** user wishes to query for a phrase such as "first place". Using the +** built-in tokenizers, the FTS5 query 'first + place' will match instances +** of "first place" within the document set, but not alternative forms +** such as "1st place". In some applications, it would be better to match +** all instances of "first place" or "1st place" regardless of which form +** the user specified in the MATCH query text. +** +** There are several ways to approach this in FTS5: +** +**
      1. By mapping all synonyms to a single token. In this case, the +** In the above example, this means that the tokenizer returns the +** same token for inputs "first" and "1st". Say that token is in +** fact "first", so that when the user inserts the document "I won +** 1st place" entries are added to the index for tokens "i", "won", +** "first" and "place". If the user then queries for '1st + place', +** the tokenizer substitutes "first" for "1st" and the query works +** as expected. +** +**
      2. By adding multiple synonyms for a single term to the FTS index. +** In this case, when tokenizing query text, the tokenizer may +** provide multiple synonyms for a single term within the document. +** FTS5 then queries the index for each synonym individually. For +** example, faced with the query: +** +** +** ... MATCH 'first place' +** +** the tokenizer offers both "1st" and "first" as synonyms for the +** first token in the MATCH query and FTS5 effectively runs a query +** similar to: +** +** +** ... MATCH '(first OR 1st) place' +** +** except that, for the purposes of auxiliary functions, the query +** still appears to contain just two phrases - "(first OR 1st)" +** being treated as a single phrase. +** +**
      3. By adding multiple synonyms for a single term to the FTS index. +** Using this method, when tokenizing document text, the tokenizer +** provides multiple synonyms for each token. So that when a +** document such as "I won first place" is tokenized, entries are +** added to the FTS index for "i", "won", "first", "1st" and +** "place". +** +** This way, even if the tokenizer does not provide synonyms +** when tokenizing query text (it should not - to do would be +** inefficient), it doesn't matter if the user queries for +** 'first + place' or '1st + place', as there are entires in the +** FTS index corresponding to both forms of the first token. +**
      +** +** Whether it is parsing document or query text, any call to xToken that +** specifies a tflags argument with the FTS5_TOKEN_COLOCATED bit +** is considered to supply a synonym for the previous token. For example, +** when parsing the document "I won first place", a tokenizer that supports +** synonyms would call xToken() 5 times, as follows: +** +** +** xToken(pCtx, 0, "i", 1, 0, 1); +** xToken(pCtx, 0, "won", 3, 2, 5); +** xToken(pCtx, 0, "first", 5, 6, 11); +** xToken(pCtx, FTS5_TOKEN_COLOCATED, "1st", 3, 6, 11); +** xToken(pCtx, 0, "place", 5, 12, 17); +** +** +** It is an error to specify the FTS5_TOKEN_COLOCATED flag the first time +** xToken() is called. Multiple synonyms may be specified for a single token +** by making multiple calls to xToken(FTS5_TOKEN_COLOCATED) in sequence. +** There is no limit to the number of synonyms that may be provided for a +** single token. +** +** In many cases, method (1) above is the best approach. It does not add +** extra data to the FTS index or require FTS5 to query for multiple terms, +** so it is efficient in terms of disk space and query speed. However, it +** does not support prefix queries very well. If, as suggested above, the +** token "first" is subsituted for "1st" by the tokenizer, then the query: +** +** +** ... MATCH '1s*' +** +** will not match documents that contain the token "1st" (as the tokenizer +** will probably not map "1s" to any prefix of "first"). +** +** For full prefix support, method (3) may be preferred. In this case, +** because the index contains entries for both "first" and "1st", prefix +** queries such as 'fi*' or '1s*' will match correctly. However, because +** extra entries are added to the FTS index, this method uses more space +** within the database. +** +** Method (2) offers a midpoint between (1) and (3). Using this method, +** a query such as '1s*' will match documents that contain the literal +** token "1st", but not "first" (assuming the tokenizer is not able to +** provide synonyms for prefixes). However, a non-prefix query like '1st' +** will match against "1st" and "first". This method does not require +** extra disk space, as no extra entries are added to the FTS index. +** On the other hand, it may require more CPU cycles to run MATCH queries, +** as separate queries of the FTS index are required for each synonym. +** +** When using methods (2) or (3), it is important that the tokenizer only +** provide synonyms when tokenizing document text (method (2)) or query +** text (method (3)), not both. Doing so will not cause any errors, but is +** inefficient. +*/ +typedef struct Fts5Tokenizer Fts5Tokenizer; +typedef struct fts5_tokenizer fts5_tokenizer; +struct fts5_tokenizer { + int (*xCreate)(void*, const char **azArg, int nArg, Fts5Tokenizer **ppOut); + void (*xDelete)(Fts5Tokenizer*); + int (*xTokenize)(Fts5Tokenizer*, + void *pCtx, + int flags, /* Mask of FTS5_TOKENIZE_* flags */ + const char *pText, int nText, + int (*xToken)( + void *pCtx, /* Copy of 2nd argument to xTokenize() */ + int tflags, /* Mask of FTS5_TOKEN_* flags */ + const char *pToken, /* Pointer to buffer containing token */ + int nToken, /* Size of token in bytes */ + int iStart, /* Byte offset of token within input text */ + int iEnd /* Byte offset of end of token within input text */ + ) + ); +}; + +/* Flags that may be passed as the third argument to xTokenize() */ +#define FTS5_TOKENIZE_QUERY 0x0001 +#define FTS5_TOKENIZE_PREFIX 0x0002 +#define FTS5_TOKENIZE_DOCUMENT 0x0004 +#define FTS5_TOKENIZE_AUX 0x0008 + +/* Flags that may be passed by the tokenizer implementation back to FTS5 +** as the third argument to the supplied xToken callback. */ +#define FTS5_TOKEN_COLOCATED 0x0001 /* Same position as prev. token */ + +/* +** END OF CUSTOM TOKENIZERS +*************************************************************************/ + +/************************************************************************* +** FTS5 EXTENSION REGISTRATION API +*/ +typedef struct fts5_api fts5_api; +struct fts5_api { + int iVersion; /* Currently always set to 2 */ + + /* Create a new tokenizer */ + int (*xCreateTokenizer)( + fts5_api *pApi, + const char *zName, + void *pContext, + fts5_tokenizer *pTokenizer, + void (*xDestroy)(void*) + ); + + /* Find an existing tokenizer */ + int (*xFindTokenizer)( + fts5_api *pApi, + const char *zName, + void **ppContext, + fts5_tokenizer *pTokenizer + ); + + /* Create a new auxiliary function */ + int (*xCreateFunction)( + fts5_api *pApi, + const char *zName, + void *pContext, + fts5_extension_function xFunction, + void (*xDestroy)(void*) + ); +}; + +/* +** END OF REGISTRATION API +*************************************************************************/ + +#ifdef __cplusplus +} /* end of the 'extern "C"' block */ +#endif + +#endif /* _FTS5_H */ + +/******** End of fts5.h *********/ diff --git a/hdssd/external/linux/sqlite-3.22.0/sqlite3ext.h b/hdssd/external/linux/sqlite-3.22.0/sqlite3ext.h new file mode 100644 index 0000000..ac92a74 --- /dev/null +++ b/hdssd/external/linux/sqlite-3.22.0/sqlite3ext.h @@ -0,0 +1,585 @@ +/* +** 2006 June 7 +** +** 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 header file defines the SQLite interface for use by +** shared libraries that want to be imported as extensions into +** an SQLite instance. Shared libraries that intend to be loaded +** as extensions by SQLite should #include this file instead of +** sqlite3.h. +*/ +#ifndef SQLITE3EXT_H +#define SQLITE3EXT_H +#include "sqlite3.h" + +/* +** The following structure holds pointers to all of the SQLite API +** routines. +** +** WARNING: In order to maintain backwards compatibility, add new +** interfaces to the end of this structure only. If you insert new +** interfaces in the middle of this structure, then older different +** versions of SQLite will not be able to load each other's shared +** libraries! +*/ +struct sqlite3_api_routines { + void * (*aggregate_context)(sqlite3_context*,int nBytes); + int (*aggregate_count)(sqlite3_context*); + int (*bind_blob)(sqlite3_stmt*,int,const void*,int n,void(*)(void*)); + int (*bind_double)(sqlite3_stmt*,int,double); + int (*bind_int)(sqlite3_stmt*,int,int); + int (*bind_int64)(sqlite3_stmt*,int,sqlite_int64); + int (*bind_null)(sqlite3_stmt*,int); + int (*bind_parameter_count)(sqlite3_stmt*); + int (*bind_parameter_index)(sqlite3_stmt*,const char*zName); + const char * (*bind_parameter_name)(sqlite3_stmt*,int); + int (*bind_text)(sqlite3_stmt*,int,const char*,int n,void(*)(void*)); + int (*bind_text16)(sqlite3_stmt*,int,const void*,int,void(*)(void*)); + int (*bind_value)(sqlite3_stmt*,int,const sqlite3_value*); + int (*busy_handler)(sqlite3*,int(*)(void*,int),void*); + int (*busy_timeout)(sqlite3*,int ms); + int (*changes)(sqlite3*); + int (*close)(sqlite3*); + int (*collation_needed)(sqlite3*,void*,void(*)(void*,sqlite3*, + int eTextRep,const char*)); + int (*collation_needed16)(sqlite3*,void*,void(*)(void*,sqlite3*, + int eTextRep,const void*)); + const void * (*column_blob)(sqlite3_stmt*,int iCol); + int (*column_bytes)(sqlite3_stmt*,int iCol); + int (*column_bytes16)(sqlite3_stmt*,int iCol); + int (*column_count)(sqlite3_stmt*pStmt); + const char * (*column_database_name)(sqlite3_stmt*,int); + const void * (*column_database_name16)(sqlite3_stmt*,int); + const char * (*column_decltype)(sqlite3_stmt*,int i); + const void * (*column_decltype16)(sqlite3_stmt*,int); + double (*column_double)(sqlite3_stmt*,int iCol); + int (*column_int)(sqlite3_stmt*,int iCol); + sqlite_int64 (*column_int64)(sqlite3_stmt*,int iCol); + const char * (*column_name)(sqlite3_stmt*,int); + const void * (*column_name16)(sqlite3_stmt*,int); + const char * (*column_origin_name)(sqlite3_stmt*,int); + const void * (*column_origin_name16)(sqlite3_stmt*,int); + const char * (*column_table_name)(sqlite3_stmt*,int); + const void * (*column_table_name16)(sqlite3_stmt*,int); + const unsigned char * (*column_text)(sqlite3_stmt*,int iCol); + const void * (*column_text16)(sqlite3_stmt*,int iCol); + int (*column_type)(sqlite3_stmt*,int iCol); + sqlite3_value* (*column_value)(sqlite3_stmt*,int iCol); + void * (*commit_hook)(sqlite3*,int(*)(void*),void*); + int (*complete)(const char*sql); + int (*complete16)(const void*sql); + int (*create_collation)(sqlite3*,const char*,int,void*, + int(*)(void*,int,const void*,int,const void*)); + int (*create_collation16)(sqlite3*,const void*,int,void*, + int(*)(void*,int,const void*,int,const void*)); + int (*create_function)(sqlite3*,const char*,int,int,void*, + void (*xFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*)); + int (*create_function16)(sqlite3*,const void*,int,int,void*, + void (*xFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*)); + int (*create_module)(sqlite3*,const char*,const sqlite3_module*,void*); + int (*data_count)(sqlite3_stmt*pStmt); + sqlite3 * (*db_handle)(sqlite3_stmt*); + int (*declare_vtab)(sqlite3*,const char*); + int (*enable_shared_cache)(int); + int (*errcode)(sqlite3*db); + const char * (*errmsg)(sqlite3*); + const void * (*errmsg16)(sqlite3*); + int (*exec)(sqlite3*,const char*,sqlite3_callback,void*,char**); + int (*expired)(sqlite3_stmt*); + int (*finalize)(sqlite3_stmt*pStmt); + void (*free)(void*); + void (*free_table)(char**result); + int (*get_autocommit)(sqlite3*); + void * (*get_auxdata)(sqlite3_context*,int); + int (*get_table)(sqlite3*,const char*,char***,int*,int*,char**); + int (*global_recover)(void); + void (*interruptx)(sqlite3*); + sqlite_int64 (*last_insert_rowid)(sqlite3*); + const char * (*libversion)(void); + int (*libversion_number)(void); + void *(*malloc)(int); + char * (*mprintf)(const char*,...); + int (*open)(const char*,sqlite3**); + int (*open16)(const void*,sqlite3**); + int (*prepare)(sqlite3*,const char*,int,sqlite3_stmt**,const char**); + int (*prepare16)(sqlite3*,const void*,int,sqlite3_stmt**,const void**); + void * (*profile)(sqlite3*,void(*)(void*,const char*,sqlite_uint64),void*); + void (*progress_handler)(sqlite3*,int,int(*)(void*),void*); + void *(*realloc)(void*,int); + int (*reset)(sqlite3_stmt*pStmt); + void (*result_blob)(sqlite3_context*,const void*,int,void(*)(void*)); + void (*result_double)(sqlite3_context*,double); + void (*result_error)(sqlite3_context*,const char*,int); + void (*result_error16)(sqlite3_context*,const void*,int); + void (*result_int)(sqlite3_context*,int); + void (*result_int64)(sqlite3_context*,sqlite_int64); + void (*result_null)(sqlite3_context*); + void (*result_text)(sqlite3_context*,const char*,int,void(*)(void*)); + void (*result_text16)(sqlite3_context*,const void*,int,void(*)(void*)); + void (*result_text16be)(sqlite3_context*,const void*,int,void(*)(void*)); + void (*result_text16le)(sqlite3_context*,const void*,int,void(*)(void*)); + void (*result_value)(sqlite3_context*,sqlite3_value*); + void * (*rollback_hook)(sqlite3*,void(*)(void*),void*); + int (*set_authorizer)(sqlite3*,int(*)(void*,int,const char*,const char*, + const char*,const char*),void*); + void (*set_auxdata)(sqlite3_context*,int,void*,void (*)(void*)); + char * (*xsnprintf)(int,char*,const char*,...); + int (*step)(sqlite3_stmt*); + int (*table_column_metadata)(sqlite3*,const char*,const char*,const char*, + char const**,char const**,int*,int*,int*); + void (*thread_cleanup)(void); + int (*total_changes)(sqlite3*); + void * (*trace)(sqlite3*,void(*xTrace)(void*,const char*),void*); + int (*transfer_bindings)(sqlite3_stmt*,sqlite3_stmt*); + void * (*update_hook)(sqlite3*,void(*)(void*,int ,char const*,char const*, + sqlite_int64),void*); + void * (*user_data)(sqlite3_context*); + const void * (*value_blob)(sqlite3_value*); + int (*value_bytes)(sqlite3_value*); + int (*value_bytes16)(sqlite3_value*); + double (*value_double)(sqlite3_value*); + int (*value_int)(sqlite3_value*); + sqlite_int64 (*value_int64)(sqlite3_value*); + int (*value_numeric_type)(sqlite3_value*); + const unsigned char * (*value_text)(sqlite3_value*); + const void * (*value_text16)(sqlite3_value*); + const void * (*value_text16be)(sqlite3_value*); + const void * (*value_text16le)(sqlite3_value*); + int (*value_type)(sqlite3_value*); + char *(*vmprintf)(const char*,va_list); + /* Added ??? */ + int (*overload_function)(sqlite3*, const char *zFuncName, int nArg); + /* Added by 3.3.13 */ + int (*prepare_v2)(sqlite3*,const char*,int,sqlite3_stmt**,const char**); + int (*prepare16_v2)(sqlite3*,const void*,int,sqlite3_stmt**,const void**); + int (*clear_bindings)(sqlite3_stmt*); + /* Added by 3.4.1 */ + int (*create_module_v2)(sqlite3*,const char*,const sqlite3_module*,void*, + void (*xDestroy)(void *)); + /* Added by 3.5.0 */ + int (*bind_zeroblob)(sqlite3_stmt*,int,int); + int (*blob_bytes)(sqlite3_blob*); + int (*blob_close)(sqlite3_blob*); + int (*blob_open)(sqlite3*,const char*,const char*,const char*,sqlite3_int64, + int,sqlite3_blob**); + int (*blob_read)(sqlite3_blob*,void*,int,int); + int (*blob_write)(sqlite3_blob*,const void*,int,int); + int (*create_collation_v2)(sqlite3*,const char*,int,void*, + int(*)(void*,int,const void*,int,const void*), + void(*)(void*)); + int (*file_control)(sqlite3*,const char*,int,void*); + sqlite3_int64 (*memory_highwater)(int); + sqlite3_int64 (*memory_used)(void); + sqlite3_mutex *(*mutex_alloc)(int); + void (*mutex_enter)(sqlite3_mutex*); + void (*mutex_free)(sqlite3_mutex*); + void (*mutex_leave)(sqlite3_mutex*); + int (*mutex_try)(sqlite3_mutex*); + int (*open_v2)(const char*,sqlite3**,int,const char*); + int (*release_memory)(int); + void (*result_error_nomem)(sqlite3_context*); + void (*result_error_toobig)(sqlite3_context*); + int (*sleep)(int); + void (*soft_heap_limit)(int); + sqlite3_vfs *(*vfs_find)(const char*); + int (*vfs_register)(sqlite3_vfs*,int); + int (*vfs_unregister)(sqlite3_vfs*); + int (*xthreadsafe)(void); + void (*result_zeroblob)(sqlite3_context*,int); + void (*result_error_code)(sqlite3_context*,int); + int (*test_control)(int, ...); + void (*randomness)(int,void*); + sqlite3 *(*context_db_handle)(sqlite3_context*); + int (*extended_result_codes)(sqlite3*,int); + int (*limit)(sqlite3*,int,int); + sqlite3_stmt *(*next_stmt)(sqlite3*,sqlite3_stmt*); + const char *(*sql)(sqlite3_stmt*); + int (*status)(int,int*,int*,int); + int (*backup_finish)(sqlite3_backup*); + sqlite3_backup *(*backup_init)(sqlite3*,const char*,sqlite3*,const char*); + int (*backup_pagecount)(sqlite3_backup*); + int (*backup_remaining)(sqlite3_backup*); + int (*backup_step)(sqlite3_backup*,int); + const char *(*compileoption_get)(int); + int (*compileoption_used)(const char*); + int (*create_function_v2)(sqlite3*,const char*,int,int,void*, + void (*xFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*), + void(*xDestroy)(void*)); + int (*db_config)(sqlite3*,int,...); + sqlite3_mutex *(*db_mutex)(sqlite3*); + int (*db_status)(sqlite3*,int,int*,int*,int); + int (*extended_errcode)(sqlite3*); + void (*log)(int,const char*,...); + sqlite3_int64 (*soft_heap_limit64)(sqlite3_int64); + const char *(*sourceid)(void); + int (*stmt_status)(sqlite3_stmt*,int,int); + int (*strnicmp)(const char*,const char*,int); + int (*unlock_notify)(sqlite3*,void(*)(void**,int),void*); + int (*wal_autocheckpoint)(sqlite3*,int); + int (*wal_checkpoint)(sqlite3*,const char*); + void *(*wal_hook)(sqlite3*,int(*)(void*,sqlite3*,const char*,int),void*); + int (*blob_reopen)(sqlite3_blob*,sqlite3_int64); + int (*vtab_config)(sqlite3*,int op,...); + int (*vtab_on_conflict)(sqlite3*); + /* Version 3.7.16 and later */ + int (*close_v2)(sqlite3*); + const char *(*db_filename)(sqlite3*,const char*); + int (*db_readonly)(sqlite3*,const char*); + int (*db_release_memory)(sqlite3*); + const char *(*errstr)(int); + int (*stmt_busy)(sqlite3_stmt*); + int (*stmt_readonly)(sqlite3_stmt*); + int (*stricmp)(const char*,const char*); + int (*uri_boolean)(const char*,const char*,int); + sqlite3_int64 (*uri_int64)(const char*,const char*,sqlite3_int64); + const char *(*uri_parameter)(const char*,const char*); + char *(*xvsnprintf)(int,char*,const char*,va_list); + int (*wal_checkpoint_v2)(sqlite3*,const char*,int,int*,int*); + /* Version 3.8.7 and later */ + int (*auto_extension)(void(*)(void)); + int (*bind_blob64)(sqlite3_stmt*,int,const void*,sqlite3_uint64, + void(*)(void*)); + int (*bind_text64)(sqlite3_stmt*,int,const char*,sqlite3_uint64, + void(*)(void*),unsigned char); + int (*cancel_auto_extension)(void(*)(void)); + int (*load_extension)(sqlite3*,const char*,const char*,char**); + void *(*malloc64)(sqlite3_uint64); + sqlite3_uint64 (*msize)(void*); + void *(*realloc64)(void*,sqlite3_uint64); + void (*reset_auto_extension)(void); + void (*result_blob64)(sqlite3_context*,const void*,sqlite3_uint64, + void(*)(void*)); + void (*result_text64)(sqlite3_context*,const char*,sqlite3_uint64, + void(*)(void*), unsigned char); + int (*strglob)(const char*,const char*); + /* Version 3.8.11 and later */ + sqlite3_value *(*value_dup)(const sqlite3_value*); + void (*value_free)(sqlite3_value*); + int (*result_zeroblob64)(sqlite3_context*,sqlite3_uint64); + int (*bind_zeroblob64)(sqlite3_stmt*, int, sqlite3_uint64); + /* Version 3.9.0 and later */ + unsigned int (*value_subtype)(sqlite3_value*); + void (*result_subtype)(sqlite3_context*,unsigned int); + /* Version 3.10.0 and later */ + int (*status64)(int,sqlite3_int64*,sqlite3_int64*,int); + int (*strlike)(const char*,const char*,unsigned int); + int (*db_cacheflush)(sqlite3*); + /* Version 3.12.0 and later */ + int (*system_errno)(sqlite3*); + /* Version 3.14.0 and later */ + int (*trace_v2)(sqlite3*,unsigned,int(*)(unsigned,void*,void*,void*),void*); + char *(*expanded_sql)(sqlite3_stmt*); + /* Version 3.18.0 and later */ + void (*set_last_insert_rowid)(sqlite3*,sqlite3_int64); + /* Version 3.20.0 and later */ + int (*prepare_v3)(sqlite3*,const char*,int,unsigned int, + sqlite3_stmt**,const char**); + int (*prepare16_v3)(sqlite3*,const void*,int,unsigned int, + sqlite3_stmt**,const void**); + int (*bind_pointer)(sqlite3_stmt*,int,void*,const char*,void(*)(void*)); + void (*result_pointer)(sqlite3_context*,void*,const char*,void(*)(void*)); + void *(*value_pointer)(sqlite3_value*,const char*); + int (*vtab_nochange)(sqlite3_context*); + int (*value_nochange)(sqlite3_value*); + const char *(*vtab_collation)(sqlite3_index_info*,int); +}; + +/* +** This is the function signature used for all extension entry points. It +** is also defined in the file "loadext.c". +*/ +typedef int (*sqlite3_loadext_entry)( + sqlite3 *db, /* Handle to the database. */ + char **pzErrMsg, /* Used to set error string on failure. */ + const sqlite3_api_routines *pThunk /* Extension API function pointers. */ +); + +/* +** The following macros redefine the API routines so that they are +** redirected through the global sqlite3_api structure. +** +** This header file is also used by the loadext.c source file +** (part of the main SQLite library - not an extension) so that +** it can get access to the sqlite3_api_routines structure +** definition. But the main library does not want to redefine +** the API. So the redefinition macros are only valid if the +** SQLITE_CORE macros is undefined. +*/ +#if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) +#define sqlite3_aggregate_context sqlite3_api->aggregate_context +#ifndef SQLITE_OMIT_DEPRECATED +#define sqlite3_aggregate_count sqlite3_api->aggregate_count +#endif +#define sqlite3_bind_blob sqlite3_api->bind_blob +#define sqlite3_bind_double sqlite3_api->bind_double +#define sqlite3_bind_int sqlite3_api->bind_int +#define sqlite3_bind_int64 sqlite3_api->bind_int64 +#define sqlite3_bind_null sqlite3_api->bind_null +#define sqlite3_bind_parameter_count sqlite3_api->bind_parameter_count +#define sqlite3_bind_parameter_index sqlite3_api->bind_parameter_index +#define sqlite3_bind_parameter_name sqlite3_api->bind_parameter_name +#define sqlite3_bind_text sqlite3_api->bind_text +#define sqlite3_bind_text16 sqlite3_api->bind_text16 +#define sqlite3_bind_value sqlite3_api->bind_value +#define sqlite3_busy_handler sqlite3_api->busy_handler +#define sqlite3_busy_timeout sqlite3_api->busy_timeout +#define sqlite3_changes sqlite3_api->changes +#define sqlite3_close sqlite3_api->close +#define sqlite3_collation_needed sqlite3_api->collation_needed +#define sqlite3_collation_needed16 sqlite3_api->collation_needed16 +#define sqlite3_column_blob sqlite3_api->column_blob +#define sqlite3_column_bytes sqlite3_api->column_bytes +#define sqlite3_column_bytes16 sqlite3_api->column_bytes16 +#define sqlite3_column_count sqlite3_api->column_count +#define sqlite3_column_database_name sqlite3_api->column_database_name +#define sqlite3_column_database_name16 sqlite3_api->column_database_name16 +#define sqlite3_column_decltype sqlite3_api->column_decltype +#define sqlite3_column_decltype16 sqlite3_api->column_decltype16 +#define sqlite3_column_double sqlite3_api->column_double +#define sqlite3_column_int sqlite3_api->column_int +#define sqlite3_column_int64 sqlite3_api->column_int64 +#define sqlite3_column_name sqlite3_api->column_name +#define sqlite3_column_name16 sqlite3_api->column_name16 +#define sqlite3_column_origin_name sqlite3_api->column_origin_name +#define sqlite3_column_origin_name16 sqlite3_api->column_origin_name16 +#define sqlite3_column_table_name sqlite3_api->column_table_name +#define sqlite3_column_table_name16 sqlite3_api->column_table_name16 +#define sqlite3_column_text sqlite3_api->column_text +#define sqlite3_column_text16 sqlite3_api->column_text16 +#define sqlite3_column_type sqlite3_api->column_type +#define sqlite3_column_value sqlite3_api->column_value +#define sqlite3_commit_hook sqlite3_api->commit_hook +#define sqlite3_complete sqlite3_api->complete +#define sqlite3_complete16 sqlite3_api->complete16 +#define sqlite3_create_collation sqlite3_api->create_collation +#define sqlite3_create_collation16 sqlite3_api->create_collation16 +#define sqlite3_create_function sqlite3_api->create_function +#define sqlite3_create_function16 sqlite3_api->create_function16 +#define sqlite3_create_module sqlite3_api->create_module +#define sqlite3_create_module_v2 sqlite3_api->create_module_v2 +#define sqlite3_data_count sqlite3_api->data_count +#define sqlite3_db_handle sqlite3_api->db_handle +#define sqlite3_declare_vtab sqlite3_api->declare_vtab +#define sqlite3_enable_shared_cache sqlite3_api->enable_shared_cache +#define sqlite3_errcode sqlite3_api->errcode +#define sqlite3_errmsg sqlite3_api->errmsg +#define sqlite3_errmsg16 sqlite3_api->errmsg16 +#define sqlite3_exec sqlite3_api->exec +#ifndef SQLITE_OMIT_DEPRECATED +#define sqlite3_expired sqlite3_api->expired +#endif +#define sqlite3_finalize sqlite3_api->finalize +#define sqlite3_free sqlite3_api->free +#define sqlite3_free_table sqlite3_api->free_table +#define sqlite3_get_autocommit sqlite3_api->get_autocommit +#define sqlite3_get_auxdata sqlite3_api->get_auxdata +#define sqlite3_get_table sqlite3_api->get_table +#ifndef SQLITE_OMIT_DEPRECATED +#define sqlite3_global_recover sqlite3_api->global_recover +#endif +#define sqlite3_interrupt sqlite3_api->interruptx +#define sqlite3_last_insert_rowid sqlite3_api->last_insert_rowid +#define sqlite3_libversion sqlite3_api->libversion +#define sqlite3_libversion_number sqlite3_api->libversion_number +#define sqlite3_malloc sqlite3_api->malloc +#define sqlite3_mprintf sqlite3_api->mprintf +#define sqlite3_open sqlite3_api->open +#define sqlite3_open16 sqlite3_api->open16 +#define sqlite3_prepare sqlite3_api->prepare +#define sqlite3_prepare16 sqlite3_api->prepare16 +#define sqlite3_prepare_v2 sqlite3_api->prepare_v2 +#define sqlite3_prepare16_v2 sqlite3_api->prepare16_v2 +#define sqlite3_profile sqlite3_api->profile +#define sqlite3_progress_handler sqlite3_api->progress_handler +#define sqlite3_realloc sqlite3_api->realloc +#define sqlite3_reset sqlite3_api->reset +#define sqlite3_result_blob sqlite3_api->result_blob +#define sqlite3_result_double sqlite3_api->result_double +#define sqlite3_result_error sqlite3_api->result_error +#define sqlite3_result_error16 sqlite3_api->result_error16 +#define sqlite3_result_int sqlite3_api->result_int +#define sqlite3_result_int64 sqlite3_api->result_int64 +#define sqlite3_result_null sqlite3_api->result_null +#define sqlite3_result_text sqlite3_api->result_text +#define sqlite3_result_text16 sqlite3_api->result_text16 +#define sqlite3_result_text16be sqlite3_api->result_text16be +#define sqlite3_result_text16le sqlite3_api->result_text16le +#define sqlite3_result_value sqlite3_api->result_value +#define sqlite3_rollback_hook sqlite3_api->rollback_hook +#define sqlite3_set_authorizer sqlite3_api->set_authorizer +#define sqlite3_set_auxdata sqlite3_api->set_auxdata +#define sqlite3_snprintf sqlite3_api->xsnprintf +#define sqlite3_step sqlite3_api->step +#define sqlite3_table_column_metadata sqlite3_api->table_column_metadata +#define sqlite3_thread_cleanup sqlite3_api->thread_cleanup +#define sqlite3_total_changes sqlite3_api->total_changes +#define sqlite3_trace sqlite3_api->trace +#ifndef SQLITE_OMIT_DEPRECATED +#define sqlite3_transfer_bindings sqlite3_api->transfer_bindings +#endif +#define sqlite3_update_hook sqlite3_api->update_hook +#define sqlite3_user_data sqlite3_api->user_data +#define sqlite3_value_blob sqlite3_api->value_blob +#define sqlite3_value_bytes sqlite3_api->value_bytes +#define sqlite3_value_bytes16 sqlite3_api->value_bytes16 +#define sqlite3_value_double sqlite3_api->value_double +#define sqlite3_value_int sqlite3_api->value_int +#define sqlite3_value_int64 sqlite3_api->value_int64 +#define sqlite3_value_numeric_type sqlite3_api->value_numeric_type +#define sqlite3_value_text sqlite3_api->value_text +#define sqlite3_value_text16 sqlite3_api->value_text16 +#define sqlite3_value_text16be sqlite3_api->value_text16be +#define sqlite3_value_text16le sqlite3_api->value_text16le +#define sqlite3_value_type sqlite3_api->value_type +#define sqlite3_vmprintf sqlite3_api->vmprintf +#define sqlite3_vsnprintf sqlite3_api->xvsnprintf +#define sqlite3_overload_function sqlite3_api->overload_function +#define sqlite3_prepare_v2 sqlite3_api->prepare_v2 +#define sqlite3_prepare16_v2 sqlite3_api->prepare16_v2 +#define sqlite3_clear_bindings sqlite3_api->clear_bindings +#define sqlite3_bind_zeroblob sqlite3_api->bind_zeroblob +#define sqlite3_blob_bytes sqlite3_api->blob_bytes +#define sqlite3_blob_close sqlite3_api->blob_close +#define sqlite3_blob_open sqlite3_api->blob_open +#define sqlite3_blob_read sqlite3_api->blob_read +#define sqlite3_blob_write sqlite3_api->blob_write +#define sqlite3_create_collation_v2 sqlite3_api->create_collation_v2 +#define sqlite3_file_control sqlite3_api->file_control +#define sqlite3_memory_highwater sqlite3_api->memory_highwater +#define sqlite3_memory_used sqlite3_api->memory_used +#define sqlite3_mutex_alloc sqlite3_api->mutex_alloc +#define sqlite3_mutex_enter sqlite3_api->mutex_enter +#define sqlite3_mutex_free sqlite3_api->mutex_free +#define sqlite3_mutex_leave sqlite3_api->mutex_leave +#define sqlite3_mutex_try sqlite3_api->mutex_try +#define sqlite3_open_v2 sqlite3_api->open_v2 +#define sqlite3_release_memory sqlite3_api->release_memory +#define sqlite3_result_error_nomem sqlite3_api->result_error_nomem +#define sqlite3_result_error_toobig sqlite3_api->result_error_toobig +#define sqlite3_sleep sqlite3_api->sleep +#define sqlite3_soft_heap_limit sqlite3_api->soft_heap_limit +#define sqlite3_vfs_find sqlite3_api->vfs_find +#define sqlite3_vfs_register sqlite3_api->vfs_register +#define sqlite3_vfs_unregister sqlite3_api->vfs_unregister +#define sqlite3_threadsafe sqlite3_api->xthreadsafe +#define sqlite3_result_zeroblob sqlite3_api->result_zeroblob +#define sqlite3_result_error_code sqlite3_api->result_error_code +#define sqlite3_test_control sqlite3_api->test_control +#define sqlite3_randomness sqlite3_api->randomness +#define sqlite3_context_db_handle sqlite3_api->context_db_handle +#define sqlite3_extended_result_codes sqlite3_api->extended_result_codes +#define sqlite3_limit sqlite3_api->limit +#define sqlite3_next_stmt sqlite3_api->next_stmt +#define sqlite3_sql sqlite3_api->sql +#define sqlite3_status sqlite3_api->status +#define sqlite3_backup_finish sqlite3_api->backup_finish +#define sqlite3_backup_init sqlite3_api->backup_init +#define sqlite3_backup_pagecount sqlite3_api->backup_pagecount +#define sqlite3_backup_remaining sqlite3_api->backup_remaining +#define sqlite3_backup_step sqlite3_api->backup_step +#define sqlite3_compileoption_get sqlite3_api->compileoption_get +#define sqlite3_compileoption_used sqlite3_api->compileoption_used +#define sqlite3_create_function_v2 sqlite3_api->create_function_v2 +#define sqlite3_db_config sqlite3_api->db_config +#define sqlite3_db_mutex sqlite3_api->db_mutex +#define sqlite3_db_status sqlite3_api->db_status +#define sqlite3_extended_errcode sqlite3_api->extended_errcode +#define sqlite3_log sqlite3_api->log +#define sqlite3_soft_heap_limit64 sqlite3_api->soft_heap_limit64 +#define sqlite3_sourceid sqlite3_api->sourceid +#define sqlite3_stmt_status sqlite3_api->stmt_status +#define sqlite3_strnicmp sqlite3_api->strnicmp +#define sqlite3_unlock_notify sqlite3_api->unlock_notify +#define sqlite3_wal_autocheckpoint sqlite3_api->wal_autocheckpoint +#define sqlite3_wal_checkpoint sqlite3_api->wal_checkpoint +#define sqlite3_wal_hook sqlite3_api->wal_hook +#define sqlite3_blob_reopen sqlite3_api->blob_reopen +#define sqlite3_vtab_config sqlite3_api->vtab_config +#define sqlite3_vtab_on_conflict sqlite3_api->vtab_on_conflict +/* Version 3.7.16 and later */ +#define sqlite3_close_v2 sqlite3_api->close_v2 +#define sqlite3_db_filename sqlite3_api->db_filename +#define sqlite3_db_readonly sqlite3_api->db_readonly +#define sqlite3_db_release_memory sqlite3_api->db_release_memory +#define sqlite3_errstr sqlite3_api->errstr +#define sqlite3_stmt_busy sqlite3_api->stmt_busy +#define sqlite3_stmt_readonly sqlite3_api->stmt_readonly +#define sqlite3_stricmp sqlite3_api->stricmp +#define sqlite3_uri_boolean sqlite3_api->uri_boolean +#define sqlite3_uri_int64 sqlite3_api->uri_int64 +#define sqlite3_uri_parameter sqlite3_api->uri_parameter +#define sqlite3_uri_vsnprintf sqlite3_api->xvsnprintf +#define sqlite3_wal_checkpoint_v2 sqlite3_api->wal_checkpoint_v2 +/* Version 3.8.7 and later */ +#define sqlite3_auto_extension sqlite3_api->auto_extension +#define sqlite3_bind_blob64 sqlite3_api->bind_blob64 +#define sqlite3_bind_text64 sqlite3_api->bind_text64 +#define sqlite3_cancel_auto_extension sqlite3_api->cancel_auto_extension +#define sqlite3_load_extension sqlite3_api->load_extension +#define sqlite3_malloc64 sqlite3_api->malloc64 +#define sqlite3_msize sqlite3_api->msize +#define sqlite3_realloc64 sqlite3_api->realloc64 +#define sqlite3_reset_auto_extension sqlite3_api->reset_auto_extension +#define sqlite3_result_blob64 sqlite3_api->result_blob64 +#define sqlite3_result_text64 sqlite3_api->result_text64 +#define sqlite3_strglob sqlite3_api->strglob +/* Version 3.8.11 and later */ +#define sqlite3_value_dup sqlite3_api->value_dup +#define sqlite3_value_free sqlite3_api->value_free +#define sqlite3_result_zeroblob64 sqlite3_api->result_zeroblob64 +#define sqlite3_bind_zeroblob64 sqlite3_api->bind_zeroblob64 +/* Version 3.9.0 and later */ +#define sqlite3_value_subtype sqlite3_api->value_subtype +#define sqlite3_result_subtype sqlite3_api->result_subtype +/* Version 3.10.0 and later */ +#define sqlite3_status64 sqlite3_api->status64 +#define sqlite3_strlike sqlite3_api->strlike +#define sqlite3_db_cacheflush sqlite3_api->db_cacheflush +/* Version 3.12.0 and later */ +#define sqlite3_system_errno sqlite3_api->system_errno +/* Version 3.14.0 and later */ +#define sqlite3_trace_v2 sqlite3_api->trace_v2 +#define sqlite3_expanded_sql sqlite3_api->expanded_sql +/* Version 3.18.0 and later */ +#define sqlite3_set_last_insert_rowid sqlite3_api->set_last_insert_rowid +/* Version 3.20.0 and later */ +#define sqlite3_prepare_v3 sqlite3_api->prepare_v3 +#define sqlite3_prepare16_v3 sqlite3_api->prepare16_v3 +#define sqlite3_bind_pointer sqlite3_api->bind_pointer +#define sqlite3_result_pointer sqlite3_api->result_pointer +#define sqlite3_value_pointer sqlite3_api->value_pointer +/* Version 3.22.0 and later */ +#define sqlite3_vtab_nochange sqlite3_api->vtab_nochange +#define sqlite3_value_nochange sqltie3_api->value_nochange +#define sqlite3_vtab_collation sqltie3_api->vtab_collation +#endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */ + +#if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) + /* This case when the file really is being compiled as a loadable + ** extension */ +# define SQLITE_EXTENSION_INIT1 const sqlite3_api_routines *sqlite3_api=0; +# define SQLITE_EXTENSION_INIT2(v) sqlite3_api=v; +# define SQLITE_EXTENSION_INIT3 \ + extern const sqlite3_api_routines *sqlite3_api; +#else + /* This case when the file is being statically linked into the + ** application */ +# define SQLITE_EXTENSION_INIT1 /*no-op*/ +# define SQLITE_EXTENSION_INIT2(v) (void)v; /* unused parameter */ +# define SQLITE_EXTENSION_INIT3 /*no-op*/ +#endif + +#endif /* SQLITE3EXT_H */ diff --git a/hdssd/external/linux/zlib-1.2.11/crc32.h b/hdssd/external/linux/zlib-1.2.11/crc32.h new file mode 100644 index 0000000..9e0c778 --- /dev/null +++ b/hdssd/external/linux/zlib-1.2.11/crc32.h @@ -0,0 +1,441 @@ +/* crc32.h -- tables for rapid CRC calculation + * Generated automatically by crc32.c + */ + +local const z_crc_t FAR crc_table[TBLS][256] = +{ + { + 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL, + 0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL, + 0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL, + 0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL, + 0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL, + 0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL, + 0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL, + 0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL, + 0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL, + 0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL, + 0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL, + 0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL, + 0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL, + 0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL, + 0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL, + 0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL, + 0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL, + 0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL, + 0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL, + 0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL, + 0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL, + 0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL, + 0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL, + 0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL, + 0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL, + 0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL, + 0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL, + 0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL, + 0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL, + 0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL, + 0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL, + 0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL, + 0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL, + 0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL, + 0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL, + 0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL, + 0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL, + 0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL, + 0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL, + 0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL, + 0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL, + 0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL, + 0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL, + 0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL, + 0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL, + 0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL, + 0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL, + 0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL, + 0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL, + 0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL, + 0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL, + 0x2d02ef8dUL +#ifdef BYFOUR + }, + { + 0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL, + 0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL, + 0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL, + 0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL, + 0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL, + 0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL, + 0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL, + 0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL, + 0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL, + 0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL, + 0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL, + 0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL, + 0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL, + 0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL, + 0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL, + 0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL, + 0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL, + 0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL, + 0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL, + 0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL, + 0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL, + 0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL, + 0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL, + 0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL, + 0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL, + 0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL, + 0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL, + 0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL, + 0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL, + 0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL, + 0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL, + 0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL, + 0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL, + 0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL, + 0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL, + 0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL, + 0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL, + 0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL, + 0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL, + 0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL, + 0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL, + 0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL, + 0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL, + 0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL, + 0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL, + 0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL, + 0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL, + 0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL, + 0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL, + 0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL, + 0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL, + 0x9324fd72UL + }, + { + 0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL, + 0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL, + 0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL, + 0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL, + 0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL, + 0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL, + 0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL, + 0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL, + 0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL, + 0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL, + 0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL, + 0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL, + 0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL, + 0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL, + 0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL, + 0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL, + 0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL, + 0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL, + 0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL, + 0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL, + 0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL, + 0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL, + 0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL, + 0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL, + 0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL, + 0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL, + 0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL, + 0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL, + 0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL, + 0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL, + 0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL, + 0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL, + 0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL, + 0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL, + 0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL, + 0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL, + 0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL, + 0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL, + 0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL, + 0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL, + 0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL, + 0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL, + 0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL, + 0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL, + 0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL, + 0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL, + 0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL, + 0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL, + 0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL, + 0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL, + 0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL, + 0xbe9834edUL + }, + { + 0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL, + 0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL, + 0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL, + 0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL, + 0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL, + 0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL, + 0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL, + 0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL, + 0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL, + 0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL, + 0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL, + 0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL, + 0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL, + 0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL, + 0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL, + 0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL, + 0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL, + 0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL, + 0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL, + 0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL, + 0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL, + 0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL, + 0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL, + 0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL, + 0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL, + 0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL, + 0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL, + 0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL, + 0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL, + 0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL, + 0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL, + 0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL, + 0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL, + 0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL, + 0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL, + 0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL, + 0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL, + 0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL, + 0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL, + 0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL, + 0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL, + 0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL, + 0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL, + 0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL, + 0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL, + 0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL, + 0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL, + 0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL, + 0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL, + 0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL, + 0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL, + 0xde0506f1UL + }, + { + 0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL, + 0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL, + 0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL, + 0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL, + 0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL, + 0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL, + 0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL, + 0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL, + 0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL, + 0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL, + 0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL, + 0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL, + 0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL, + 0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL, + 0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL, + 0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL, + 0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL, + 0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL, + 0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL, + 0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL, + 0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL, + 0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL, + 0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL, + 0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL, + 0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL, + 0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL, + 0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL, + 0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL, + 0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL, + 0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL, + 0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL, + 0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL, + 0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL, + 0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL, + 0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL, + 0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL, + 0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL, + 0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL, + 0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL, + 0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL, + 0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL, + 0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL, + 0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL, + 0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL, + 0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL, + 0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL, + 0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL, + 0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL, + 0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL, + 0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL, + 0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL, + 0x8def022dUL + }, + { + 0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL, + 0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL, + 0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL, + 0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL, + 0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL, + 0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL, + 0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL, + 0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL, + 0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL, + 0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL, + 0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL, + 0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL, + 0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL, + 0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL, + 0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL, + 0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL, + 0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL, + 0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL, + 0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL, + 0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL, + 0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL, + 0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL, + 0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL, + 0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL, + 0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL, + 0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL, + 0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL, + 0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL, + 0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL, + 0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL, + 0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL, + 0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL, + 0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL, + 0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL, + 0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL, + 0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL, + 0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL, + 0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL, + 0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL, + 0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL, + 0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL, + 0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL, + 0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL, + 0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL, + 0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL, + 0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL, + 0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL, + 0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL, + 0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL, + 0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL, + 0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL, + 0x72fd2493UL + }, + { + 0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL, + 0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL, + 0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL, + 0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL, + 0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL, + 0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL, + 0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL, + 0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL, + 0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL, + 0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL, + 0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL, + 0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL, + 0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL, + 0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL, + 0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL, + 0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL, + 0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL, + 0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL, + 0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL, + 0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL, + 0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL, + 0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL, + 0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL, + 0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL, + 0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL, + 0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL, + 0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL, + 0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL, + 0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL, + 0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL, + 0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL, + 0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL, + 0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL, + 0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL, + 0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL, + 0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL, + 0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL, + 0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL, + 0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL, + 0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL, + 0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL, + 0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL, + 0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL, + 0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL, + 0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL, + 0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL, + 0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL, + 0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL, + 0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL, + 0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL, + 0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL, + 0xed3498beUL + }, + { + 0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL, + 0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL, + 0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL, + 0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL, + 0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL, + 0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL, + 0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL, + 0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL, + 0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL, + 0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL, + 0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL, + 0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL, + 0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL, + 0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL, + 0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL, + 0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL, + 0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL, + 0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL, + 0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL, + 0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL, + 0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL, + 0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL, + 0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL, + 0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL, + 0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL, + 0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL, + 0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL, + 0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL, + 0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL, + 0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL, + 0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL, + 0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL, + 0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL, + 0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL, + 0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL, + 0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL, + 0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL, + 0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL, + 0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL, + 0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL, + 0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL, + 0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL, + 0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL, + 0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL, + 0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL, + 0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL, + 0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL, + 0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL, + 0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL, + 0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL, + 0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL, + 0xf10605deUL +#endif + } +}; diff --git a/hdssd/external/linux/zlib-1.2.11/deflate.h b/hdssd/external/linux/zlib-1.2.11/deflate.h new file mode 100644 index 0000000..23ecdd3 --- /dev/null +++ b/hdssd/external/linux/zlib-1.2.11/deflate.h @@ -0,0 +1,349 @@ +/* deflate.h -- internal compression state + * Copyright (C) 1995-2016 Jean-loup Gailly + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* @(#) $Id$ */ + +#ifndef DEFLATE_H +#define DEFLATE_H + +#include "zutil.h" + +/* define NO_GZIP when compiling if you want to disable gzip header and + trailer creation by deflate(). NO_GZIP would be used to avoid linking in + the crc code when it is not needed. For shared libraries, gzip encoding + should be left enabled. */ +#ifndef NO_GZIP +# define GZIP +#endif + +/* =========================================================================== + * Internal compression state. + */ + +#define LENGTH_CODES 29 +/* number of length codes, not counting the special END_BLOCK code */ + +#define LITERALS 256 +/* number of literal bytes 0..255 */ + +#define L_CODES (LITERALS+1+LENGTH_CODES) +/* number of Literal or Length codes, including the END_BLOCK code */ + +#define D_CODES 30 +/* number of distance codes */ + +#define BL_CODES 19 +/* number of codes used to transfer the bit lengths */ + +#define HEAP_SIZE (2*L_CODES+1) +/* maximum heap size */ + +#define MAX_BITS 15 +/* All codes must not exceed MAX_BITS bits */ + +#define Buf_size 16 +/* size of bit buffer in bi_buf */ + +#define INIT_STATE 42 /* zlib header -> BUSY_STATE */ +#ifdef GZIP +# define GZIP_STATE 57 /* gzip header -> BUSY_STATE | EXTRA_STATE */ +#endif +#define EXTRA_STATE 69 /* gzip extra block -> NAME_STATE */ +#define NAME_STATE 73 /* gzip file name -> COMMENT_STATE */ +#define COMMENT_STATE 91 /* gzip comment -> HCRC_STATE */ +#define HCRC_STATE 103 /* gzip header CRC -> BUSY_STATE */ +#define BUSY_STATE 113 /* deflate -> FINISH_STATE */ +#define FINISH_STATE 666 /* stream complete */ +/* Stream status */ + + +/* Data structure describing a single value and its code string. */ +typedef struct ct_data_s { + union { + ush freq; /* frequency count */ + ush code; /* bit string */ + } fc; + union { + ush dad; /* father node in Huffman tree */ + ush len; /* length of bit string */ + } dl; +} FAR ct_data; + +#define Freq fc.freq +#define Code fc.code +#define Dad dl.dad +#define Len dl.len + +typedef struct static_tree_desc_s static_tree_desc; + +typedef struct tree_desc_s { + ct_data *dyn_tree; /* the dynamic tree */ + int max_code; /* largest code with non zero frequency */ + const static_tree_desc *stat_desc; /* the corresponding static tree */ +} FAR tree_desc; + +typedef ush Pos; +typedef Pos FAR Posf; +typedef unsigned IPos; + +/* A Pos is an index in the character window. We use short instead of int to + * save space in the various tables. IPos is used only for parameter passing. + */ + +typedef struct internal_state { + z_streamp strm; /* pointer back to this zlib stream */ + int status; /* as the name implies */ + Bytef *pending_buf; /* output still pending */ + ulg pending_buf_size; /* size of pending_buf */ + Bytef *pending_out; /* next pending byte to output to the stream */ + ulg pending; /* nb of bytes in the pending buffer */ + int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ + gz_headerp gzhead; /* gzip header information to write */ + ulg gzindex; /* where in extra, name, or comment */ + Byte method; /* can only be DEFLATED */ + int last_flush; /* value of flush param for previous deflate call */ + + /* used by deflate.c: */ + + uInt w_size; /* LZ77 window size (32K by default) */ + uInt w_bits; /* log2(w_size) (8..16) */ + uInt w_mask; /* w_size - 1 */ + + Bytef *window; + /* Sliding window. Input bytes are read into the second half of the window, + * and move to the first half later to keep a dictionary of at least wSize + * bytes. With this organization, matches are limited to a distance of + * wSize-MAX_MATCH bytes, but this ensures that IO is always + * performed with a length multiple of the block size. Also, it limits + * the window size to 64K, which is quite useful on MSDOS. + * To do: use the user input buffer as sliding window. + */ + + ulg window_size; + /* Actual size of window: 2*wSize, except when the user input buffer + * is directly used as sliding window. + */ + + Posf *prev; + /* Link to older string with same hash index. To limit the size of this + * array to 64K, this link is maintained only for the last 32K strings. + * An index in this array is thus a window index modulo 32K. + */ + + Posf *head; /* Heads of the hash chains or NIL. */ + + uInt ins_h; /* hash index of string to be inserted */ + uInt hash_size; /* number of elements in hash table */ + uInt hash_bits; /* log2(hash_size) */ + uInt hash_mask; /* hash_size-1 */ + + uInt hash_shift; + /* Number of bits by which ins_h must be shifted at each input + * step. It must be such that after MIN_MATCH steps, the oldest + * byte no longer takes part in the hash key, that is: + * hash_shift * MIN_MATCH >= hash_bits + */ + + long block_start; + /* Window position at the beginning of the current output block. Gets + * negative when the window is moved backwards. + */ + + uInt match_length; /* length of best match */ + IPos prev_match; /* previous match */ + int match_available; /* set if previous match exists */ + uInt strstart; /* start of string to insert */ + uInt match_start; /* start of matching string */ + uInt lookahead; /* number of valid bytes ahead in window */ + + uInt prev_length; + /* Length of the best match at previous step. Matches not greater than this + * are discarded. This is used in the lazy match evaluation. + */ + + uInt max_chain_length; + /* To speed up deflation, hash chains are never searched beyond this + * length. A higher limit improves compression ratio but degrades the + * speed. + */ + + uInt max_lazy_match; + /* Attempt to find a better match only when the current match is strictly + * smaller than this value. This mechanism is used only for compression + * levels >= 4. + */ +# define max_insert_length max_lazy_match + /* Insert new strings in the hash table only if the match length is not + * greater than this length. This saves time but degrades compression. + * max_insert_length is used only for compression levels <= 3. + */ + + int level; /* compression level (1..9) */ + int strategy; /* favor or force Huffman coding*/ + + uInt good_match; + /* Use a faster search when the previous match is longer than this */ + + int nice_match; /* Stop searching when current match exceeds this */ + + /* used by trees.c: */ + /* Didn't use ct_data typedef below to suppress compiler warning */ + struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ + struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ + struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ + + struct tree_desc_s l_desc; /* desc. for literal tree */ + struct tree_desc_s d_desc; /* desc. for distance tree */ + struct tree_desc_s bl_desc; /* desc. for bit length tree */ + + ush bl_count[MAX_BITS+1]; + /* number of codes at each bit length for an optimal tree */ + + int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ + int heap_len; /* number of elements in the heap */ + int heap_max; /* element of largest frequency */ + /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. + * The same heap array is used to build all trees. + */ + + uch depth[2*L_CODES+1]; + /* Depth of each subtree used as tie breaker for trees of equal frequency + */ + + uchf *l_buf; /* buffer for literals or lengths */ + + uInt lit_bufsize; + /* Size of match buffer for literals/lengths. There are 4 reasons for + * limiting lit_bufsize to 64K: + * - frequencies can be kept in 16 bit counters + * - if compression is not successful for the first block, all input + * data is still in the window so we can still emit a stored block even + * when input comes from standard input. (This can also be done for + * all blocks if lit_bufsize is not greater than 32K.) + * - if compression is not successful for a file smaller than 64K, we can + * even emit a stored file instead of a stored block (saving 5 bytes). + * This is applicable only for zip (not gzip or zlib). + * - creating new Huffman trees less frequently may not provide fast + * adaptation to changes in the input data statistics. (Take for + * example a binary file with poorly compressible code followed by + * a highly compressible string table.) Smaller buffer sizes give + * fast adaptation but have of course the overhead of transmitting + * trees more frequently. + * - I can't count above 4 + */ + + uInt last_lit; /* running index in l_buf */ + + ushf *d_buf; + /* Buffer for distances. To simplify the code, d_buf and l_buf have + * the same number of elements. To use different lengths, an extra flag + * array would be necessary. + */ + + ulg opt_len; /* bit length of current block with optimal trees */ + ulg static_len; /* bit length of current block with static trees */ + uInt matches; /* number of string matches in current block */ + uInt insert; /* bytes at end of window left to insert */ + +#ifdef ZLIB_DEBUG + ulg compressed_len; /* total bit length of compressed file mod 2^32 */ + ulg bits_sent; /* bit length of compressed data sent mod 2^32 */ +#endif + + ush bi_buf; + /* Output buffer. bits are inserted starting at the bottom (least + * significant bits). + */ + int bi_valid; + /* Number of valid bits in bi_buf. All bits above the last valid bit + * are always zero. + */ + + ulg high_water; + /* High water mark offset in window for initialized bytes -- bytes above + * this are set to zero in order to avoid memory check warnings when + * longest match routines access bytes past the input. This is then + * updated to the new high water mark. + */ + +} FAR deflate_state; + +/* Output a byte on the stream. + * IN assertion: there is enough room in pending_buf. + */ +#define put_byte(s, c) {s->pending_buf[s->pending++] = (Bytef)(c);} + + +#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) +/* Minimum amount of lookahead, except at the end of the input file. + * See deflate.c for comments about the MIN_MATCH+1. + */ + +#define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD) +/* In order to simplify the code, particularly on 16 bit machines, match + * distances are limited to MAX_DIST instead of WSIZE. + */ + +#define WIN_INIT MAX_MATCH +/* Number of bytes after end of data in window to initialize in order to avoid + memory checker errors from longest match routines */ + + /* in trees.c */ +void ZLIB_INTERNAL _tr_init OF((deflate_state *s)); +int ZLIB_INTERNAL _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); +void ZLIB_INTERNAL _tr_flush_block OF((deflate_state *s, charf *buf, + ulg stored_len, int last)); +void ZLIB_INTERNAL _tr_flush_bits OF((deflate_state *s)); +void ZLIB_INTERNAL _tr_align OF((deflate_state *s)); +void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf, + ulg stored_len, int last)); + +#define d_code(dist) \ + ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)]) +/* Mapping from a distance to a distance code. dist is the distance - 1 and + * must not have side effects. _dist_code[256] and _dist_code[257] are never + * used. + */ + +#ifndef ZLIB_DEBUG +/* Inline versions of _tr_tally for speed: */ + +#if defined(GEN_TREES_H) || !defined(STDC) + extern uch ZLIB_INTERNAL _length_code[]; + extern uch ZLIB_INTERNAL _dist_code[]; +#else + extern const uch ZLIB_INTERNAL _length_code[]; + extern const uch ZLIB_INTERNAL _dist_code[]; +#endif + +# define _tr_tally_lit(s, c, flush) \ + { uch cc = (c); \ + s->d_buf[s->last_lit] = 0; \ + s->l_buf[s->last_lit++] = cc; \ + s->dyn_ltree[cc].Freq++; \ + flush = (s->last_lit == s->lit_bufsize-1); \ + } +# define _tr_tally_dist(s, distance, length, flush) \ + { uch len = (uch)(length); \ + ush dist = (ush)(distance); \ + s->d_buf[s->last_lit] = dist; \ + s->l_buf[s->last_lit++] = len; \ + dist--; \ + s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ + s->dyn_dtree[d_code(dist)].Freq++; \ + flush = (s->last_lit == s->lit_bufsize-1); \ + } +#else +# define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) +# define _tr_tally_dist(s, distance, length, flush) \ + flush = _tr_tally(s, distance, length) +#endif + +#endif /* DEFLATE_H */ diff --git a/hdssd/external/linux/zlib-1.2.11/gzguts.h b/hdssd/external/linux/zlib-1.2.11/gzguts.h new file mode 100644 index 0000000..990a4d2 --- /dev/null +++ b/hdssd/external/linux/zlib-1.2.11/gzguts.h @@ -0,0 +1,218 @@ +/* gzguts.h -- zlib internal header definitions for gz* operations + * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013, 2016 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#ifdef _LARGEFILE64_SOURCE +# ifndef _LARGEFILE_SOURCE +# define _LARGEFILE_SOURCE 1 +# endif +# ifdef _FILE_OFFSET_BITS +# undef _FILE_OFFSET_BITS +# endif +#endif + +#ifdef HAVE_HIDDEN +# define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) +#else +# define ZLIB_INTERNAL +#endif + +#include +#include "zlib.h" +#ifdef STDC +# include +# include +# include +#endif + +#ifndef _POSIX_SOURCE +# define _POSIX_SOURCE +#endif +#include + +#ifdef _WIN32 +# include +#endif + +#if defined(__TURBOC__) || defined(_MSC_VER) || defined(_WIN32) +# include +#endif + +#if defined(_WIN32) || defined(__CYGWIN__) +# define WIDECHAR +#endif + +#ifdef WINAPI_FAMILY +# define open _open +# define read _read +# define write _write +# define close _close +#endif + +#ifdef NO_DEFLATE /* for compatibility with old definition */ +# define NO_GZCOMPRESS +#endif + +#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif + +#if defined(__CYGWIN__) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif + +#if defined(MSDOS) && defined(__BORLANDC__) && (BORLANDC > 0x410) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif + +#ifndef HAVE_VSNPRINTF +# ifdef MSDOS +/* vsnprintf may exist on some MS-DOS compilers (DJGPP?), + but for now we just assume it doesn't. */ +# define NO_vsnprintf +# endif +# ifdef __TURBOC__ +# define NO_vsnprintf +# endif +# ifdef WIN32 +/* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */ +# if !defined(vsnprintf) && !defined(NO_vsnprintf) +# if !defined(_MSC_VER) || ( defined(_MSC_VER) && _MSC_VER < 1500 ) +# define vsnprintf _vsnprintf +# endif +# endif +# endif +# ifdef __SASC +# define NO_vsnprintf +# endif +# ifdef VMS +# define NO_vsnprintf +# endif +# ifdef __OS400__ +# define NO_vsnprintf +# endif +# ifdef __MVS__ +# define NO_vsnprintf +# endif +#endif + +/* unlike snprintf (which is required in C99), _snprintf does not guarantee + null termination of the result -- however this is only used in gzlib.c where + the result is assured to fit in the space provided */ +#if defined(_MSC_VER) && _MSC_VER < 1900 +# define snprintf _snprintf +#endif + +#ifndef local +# define local static +#endif +/* since "static" is used to mean two completely different things in C, we + define "local" for the non-static meaning of "static", for readability + (compile with -Dlocal if your debugger can't find static symbols) */ + +/* gz* functions always use library allocation functions */ +#ifndef STDC + extern voidp malloc OF((uInt size)); + extern void free OF((voidpf ptr)); +#endif + +/* get errno and strerror definition */ +#if defined UNDER_CE +# include +# define zstrerror() gz_strwinerror((DWORD)GetLastError()) +#else +# ifndef NO_STRERROR +# include +# define zstrerror() strerror(errno) +# else +# define zstrerror() "stdio error (consult errno)" +# endif +#endif + +/* provide prototypes for these when building zlib without LFS */ +#if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0 + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); + ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); +#endif + +/* default memLevel */ +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif + +/* default i/o buffer size -- double this for output when reading (this and + twice this must be able to fit in an unsigned type) */ +#define GZBUFSIZE 8192 + +/* gzip modes, also provide a little integrity check on the passed structure */ +#define GZ_NONE 0 +#define GZ_READ 7247 +#define GZ_WRITE 31153 +#define GZ_APPEND 1 /* mode set to GZ_WRITE after the file is opened */ + +/* values for gz_state how */ +#define LOOK 0 /* look for a gzip header */ +#define COPY 1 /* copy input directly */ +#define GZIP 2 /* decompress a gzip stream */ + +/* internal gzip file state data structure */ +typedef struct { + /* exposed contents for gzgetc() macro */ + struct gzFile_s x; /* "x" for exposed */ + /* x.have: number of bytes available at x.next */ + /* x.next: next output data to deliver or write */ + /* x.pos: current position in uncompressed data */ + /* used for both reading and writing */ + int mode; /* see gzip modes above */ + int fd; /* file descriptor */ + char *path; /* path or fd for error messages */ + unsigned size; /* buffer size, zero if not allocated yet */ + unsigned want; /* requested buffer size, default is GZBUFSIZE */ + unsigned char *in; /* input buffer (double-sized when writing) */ + unsigned char *out; /* output buffer (double-sized when reading) */ + int direct; /* 0 if processing gzip, 1 if transparent */ + /* just for reading */ + int how; /* 0: get header, 1: copy, 2: decompress */ + z_off64_t start; /* where the gzip data started, for rewinding */ + int eof; /* true if end of input file reached */ + int past; /* true if read requested past end */ + /* just for writing */ + int level; /* compression level */ + int strategy; /* compression strategy */ + /* seek request */ + z_off64_t skip; /* amount to skip (already rewound if backwards) */ + int seek; /* true if seek request pending */ + /* error information */ + int err; /* error code */ + char *msg; /* error message */ + /* zlib inflate or deflate stream */ + z_stream strm; /* stream structure in-place (not a pointer) */ +} gz_state; +typedef gz_state FAR *gz_statep; + +/* shared functions */ +void ZLIB_INTERNAL gz_error OF((gz_statep, int, const char *)); +#if defined UNDER_CE +char ZLIB_INTERNAL *gz_strwinerror OF((DWORD error)); +#endif + +/* GT_OFF(x), where x is an unsigned value, is true if x > maximum z_off64_t + value -- needed when comparing unsigned to z_off64_t, which is signed + (possible z_off64_t types off_t, off64_t, and long are all signed) */ +#ifdef INT_MAX +# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > INT_MAX) +#else +unsigned ZLIB_INTERNAL gz_intmax OF((void)); +# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax()) +#endif diff --git a/hdssd/external/linux/zlib-1.2.11/inffast.h b/hdssd/external/linux/zlib-1.2.11/inffast.h new file mode 100644 index 0000000..e5c1aa4 --- /dev/null +++ b/hdssd/external/linux/zlib-1.2.11/inffast.h @@ -0,0 +1,11 @@ +/* inffast.h -- header to use inffast.c + * Copyright (C) 1995-2003, 2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +void ZLIB_INTERNAL inflate_fast OF((z_streamp strm, unsigned start)); diff --git a/hdssd/external/linux/zlib-1.2.11/inffixed.h b/hdssd/external/linux/zlib-1.2.11/inffixed.h new file mode 100644 index 0000000..d628327 --- /dev/null +++ b/hdssd/external/linux/zlib-1.2.11/inffixed.h @@ -0,0 +1,94 @@ + /* inffixed.h -- table for decoding fixed codes + * Generated automatically by makefixed(). + */ + + /* WARNING: this file should *not* be used by applications. + It is part of the implementation of this library and is + subject to change. Applications should only use zlib.h. + */ + + static const code lenfix[512] = { + {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48}, + {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128}, + {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59}, + {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176}, + {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20}, + {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100}, + {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8}, + {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216}, + {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76}, + {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114}, + {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2}, + {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148}, + {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42}, + {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86}, + {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15}, + {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236}, + {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62}, + {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142}, + {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31}, + {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162}, + {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25}, + {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105}, + {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4}, + {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202}, + {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69}, + {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125}, + {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13}, + {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195}, + {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35}, + {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91}, + {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19}, + {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246}, + {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55}, + {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135}, + {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99}, + {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190}, + {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16}, + {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96}, + {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6}, + {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209}, + {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72}, + {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116}, + {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4}, + {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153}, + {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44}, + {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82}, + {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11}, + {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229}, + {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58}, + {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138}, + {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51}, + {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173}, + {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30}, + {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110}, + {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0}, + {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195}, + {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65}, + {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121}, + {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9}, + {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258}, + {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37}, + {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93}, + {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23}, + {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251}, + {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51}, + {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131}, + {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67}, + {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183}, + {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23}, + {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103}, + {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9}, + {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223}, + {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79}, + {0,9,255} + }; + + static const code distfix[32] = { + {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025}, + {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193}, + {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385}, + {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577}, + {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073}, + {22,5,193},{64,5,0} + }; diff --git a/hdssd/external/linux/zlib-1.2.11/inflate.h b/hdssd/external/linux/zlib-1.2.11/inflate.h new file mode 100644 index 0000000..a46cce6 --- /dev/null +++ b/hdssd/external/linux/zlib-1.2.11/inflate.h @@ -0,0 +1,125 @@ +/* inflate.h -- internal inflate state definition + * Copyright (C) 1995-2016 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* define NO_GZIP when compiling if you want to disable gzip header and + trailer decoding by inflate(). NO_GZIP would be used to avoid linking in + the crc code when it is not needed. For shared libraries, gzip decoding + should be left enabled. */ +#ifndef NO_GZIP +# define GUNZIP +#endif + +/* Possible inflate modes between inflate() calls */ +typedef enum { + HEAD = 16180, /* i: waiting for magic header */ + FLAGS, /* i: waiting for method and flags (gzip) */ + TIME, /* i: waiting for modification time (gzip) */ + OS, /* i: waiting for extra flags and operating system (gzip) */ + EXLEN, /* i: waiting for extra length (gzip) */ + EXTRA, /* i: waiting for extra bytes (gzip) */ + NAME, /* i: waiting for end of file name (gzip) */ + COMMENT, /* i: waiting for end of comment (gzip) */ + HCRC, /* i: waiting for header crc (gzip) */ + DICTID, /* i: waiting for dictionary check value */ + DICT, /* waiting for inflateSetDictionary() call */ + TYPE, /* i: waiting for type bits, including last-flag bit */ + TYPEDO, /* i: same, but skip check to exit inflate on new block */ + STORED, /* i: waiting for stored size (length and complement) */ + COPY_, /* i/o: same as COPY below, but only first time in */ + COPY, /* i/o: waiting for input or output to copy stored block */ + TABLE, /* i: waiting for dynamic block table lengths */ + LENLENS, /* i: waiting for code length code lengths */ + CODELENS, /* i: waiting for length/lit and distance code lengths */ + LEN_, /* i: same as LEN below, but only first time in */ + LEN, /* i: waiting for length/lit/eob code */ + LENEXT, /* i: waiting for length extra bits */ + DIST, /* i: waiting for distance code */ + DISTEXT, /* i: waiting for distance extra bits */ + MATCH, /* o: waiting for output space to copy string */ + LIT, /* o: waiting for output space to write literal */ + CHECK, /* i: waiting for 32-bit check value */ + LENGTH, /* i: waiting for 32-bit length (gzip) */ + DONE, /* finished check, done -- remain here until reset */ + BAD, /* got a data error -- remain here until reset */ + MEM, /* got an inflate() memory error -- remain here until reset */ + SYNC /* looking for synchronization bytes to restart inflate() */ +} inflate_mode; + +/* + State transitions between above modes - + + (most modes can go to BAD or MEM on error -- not shown for clarity) + + Process header: + HEAD -> (gzip) or (zlib) or (raw) + (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME -> COMMENT -> + HCRC -> TYPE + (zlib) -> DICTID or TYPE + DICTID -> DICT -> TYPE + (raw) -> TYPEDO + Read deflate blocks: + TYPE -> TYPEDO -> STORED or TABLE or LEN_ or CHECK + STORED -> COPY_ -> COPY -> TYPE + TABLE -> LENLENS -> CODELENS -> LEN_ + LEN_ -> LEN + Read deflate codes in fixed or dynamic block: + LEN -> LENEXT or LIT or TYPE + LENEXT -> DIST -> DISTEXT -> MATCH -> LEN + LIT -> LEN + Process trailer: + CHECK -> LENGTH -> DONE + */ + +/* State maintained between inflate() calls -- approximately 7K bytes, not + including the allocated sliding window, which is up to 32K bytes. */ +struct inflate_state { + z_streamp strm; /* pointer back to this zlib stream */ + inflate_mode mode; /* current inflate mode */ + int last; /* true if processing last block */ + int wrap; /* bit 0 true for zlib, bit 1 true for gzip, + bit 2 true to validate check value */ + int havedict; /* true if dictionary provided */ + int flags; /* gzip header method and flags (0 if zlib) */ + unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */ + unsigned long check; /* protected copy of check value */ + unsigned long total; /* protected copy of output count */ + gz_headerp head; /* where to save gzip header information */ + /* sliding window */ + unsigned wbits; /* log base 2 of requested window size */ + unsigned wsize; /* window size or zero if not using window */ + unsigned whave; /* valid bytes in the window */ + unsigned wnext; /* window write index */ + unsigned char FAR *window; /* allocated sliding window, if needed */ + /* bit accumulator */ + unsigned long hold; /* input bit accumulator */ + unsigned bits; /* number of bits in "in" */ + /* for string and stored block copying */ + unsigned length; /* literal or length of data to copy */ + unsigned offset; /* distance back to copy string from */ + /* for table and code decoding */ + unsigned extra; /* extra bits needed */ + /* fixed and dynamic code tables */ + code const FAR *lencode; /* starting table for length/literal codes */ + code const FAR *distcode; /* starting table for distance codes */ + unsigned lenbits; /* index bits for lencode */ + unsigned distbits; /* index bits for distcode */ + /* dynamic table building */ + unsigned ncode; /* number of code length code lengths */ + unsigned nlen; /* number of length code lengths */ + unsigned ndist; /* number of distance code lengths */ + unsigned have; /* number of code lengths in lens[] */ + code FAR *next; /* next available space in codes[] */ + unsigned short lens[320]; /* temporary storage for code lengths */ + unsigned short work[288]; /* work area for code table building */ + code codes[ENOUGH]; /* space for code tables */ + int sane; /* if false, allow invalid distance too far */ + int back; /* bits back of last unprocessed length/lit */ + unsigned was; /* initial length of match */ +}; diff --git a/hdssd/external/linux/zlib-1.2.11/inftrees.h b/hdssd/external/linux/zlib-1.2.11/inftrees.h new file mode 100644 index 0000000..baa53a0 --- /dev/null +++ b/hdssd/external/linux/zlib-1.2.11/inftrees.h @@ -0,0 +1,62 @@ +/* inftrees.h -- header to use inftrees.c + * Copyright (C) 1995-2005, 2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* Structure for decoding tables. Each entry provides either the + information needed to do the operation requested by the code that + indexed that table entry, or it provides a pointer to another + table that indexes more bits of the code. op indicates whether + the entry is a pointer to another table, a literal, a length or + distance, an end-of-block, or an invalid code. For a table + pointer, the low four bits of op is the number of index bits of + that table. For a length or distance, the low four bits of op + is the number of extra bits to get after the code. bits is + the number of bits in this code or part of the code to drop off + of the bit buffer. val is the actual byte to output in the case + of a literal, the base length or distance, or the offset from + the current table to the next table. Each entry is four bytes. */ +typedef struct { + unsigned char op; /* operation, extra bits, table bits */ + unsigned char bits; /* bits in this part of the code */ + unsigned short val; /* offset in table or code value */ +} code; + +/* op values as set by inflate_table(): + 00000000 - literal + 0000tttt - table link, tttt != 0 is the number of table index bits + 0001eeee - length or distance, eeee is the number of extra bits + 01100000 - end of block + 01000000 - invalid code + */ + +/* Maximum size of the dynamic table. The maximum number of code structures is + 1444, which is the sum of 852 for literal/length codes and 592 for distance + codes. These values were found by exhaustive searches using the program + examples/enough.c found in the zlib distribtution. The arguments to that + program are the number of symbols, the initial root table size, and the + maximum bit length of a code. "enough 286 9 15" for literal/length codes + returns returns 852, and "enough 30 6 15" for distance codes returns 592. + The initial root table size (9 or 6) is found in the fifth argument of the + inflate_table() calls in inflate.c and infback.c. If the root table size is + changed, then these maximum sizes would be need to be recalculated and + updated. */ +#define ENOUGH_LENS 852 +#define ENOUGH_DISTS 592 +#define ENOUGH (ENOUGH_LENS+ENOUGH_DISTS) + +/* Type of code to build for inflate_table() */ +typedef enum { + CODES, + LENS, + DISTS +} codetype; + +int ZLIB_INTERNAL inflate_table OF((codetype type, unsigned short FAR *lens, + unsigned codes, code FAR * FAR *table, + unsigned FAR *bits, unsigned short FAR *work)); diff --git a/hdssd/external/linux/zlib-1.2.11/libz.a b/hdssd/external/linux/zlib-1.2.11/libz.a new file mode 100644 index 0000000000000000000000000000000000000000..0825f494fed8f5f7e5098c3ca2674966ea539fca GIT binary patch literal 135146 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⪙77Dx;E;gGaVbAKNC&JFwF?X`)r4LGt2{ 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ʌ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 literal 0 HcmV?d00001 diff --git a/hdssd/external/linux/zlib-1.2.11/trees.h b/hdssd/external/linux/zlib-1.2.11/trees.h new file mode 100644 index 0000000..d35639d --- /dev/null +++ b/hdssd/external/linux/zlib-1.2.11/trees.h @@ -0,0 +1,128 @@ +/* header created automatically with -DGEN_TREES_H */ + +local const ct_data static_ltree[L_CODES+2] = { +{{ 12},{ 8}}, {{140},{ 8}}, {{ 76},{ 8}}, {{204},{ 8}}, {{ 44},{ 8}}, +{{172},{ 8}}, {{108},{ 8}}, {{236},{ 8}}, {{ 28},{ 8}}, {{156},{ 8}}, +{{ 92},{ 8}}, {{220},{ 8}}, {{ 60},{ 8}}, {{188},{ 8}}, {{124},{ 8}}, +{{252},{ 8}}, {{ 2},{ 8}}, {{130},{ 8}}, {{ 66},{ 8}}, {{194},{ 8}}, +{{ 34},{ 8}}, {{162},{ 8}}, {{ 98},{ 8}}, {{226},{ 8}}, {{ 18},{ 8}}, +{{146},{ 8}}, {{ 82},{ 8}}, {{210},{ 8}}, {{ 50},{ 8}}, {{178},{ 8}}, +{{114},{ 8}}, {{242},{ 8}}, {{ 10},{ 8}}, {{138},{ 8}}, {{ 74},{ 8}}, +{{202},{ 8}}, {{ 42},{ 8}}, {{170},{ 8}}, {{106},{ 8}}, {{234},{ 8}}, +{{ 26},{ 8}}, {{154},{ 8}}, {{ 90},{ 8}}, {{218},{ 8}}, {{ 58},{ 8}}, +{{186},{ 8}}, {{122},{ 8}}, {{250},{ 8}}, {{ 6},{ 8}}, {{134},{ 8}}, +{{ 70},{ 8}}, {{198},{ 8}}, {{ 38},{ 8}}, {{166},{ 8}}, {{102},{ 8}}, +{{230},{ 8}}, {{ 22},{ 8}}, {{150},{ 8}}, {{ 86},{ 8}}, {{214},{ 8}}, +{{ 54},{ 8}}, {{182},{ 8}}, {{118},{ 8}}, {{246},{ 8}}, {{ 14},{ 8}}, +{{142},{ 8}}, {{ 78},{ 8}}, {{206},{ 8}}, {{ 46},{ 8}}, {{174},{ 8}}, +{{110},{ 8}}, {{238},{ 8}}, {{ 30},{ 8}}, {{158},{ 8}}, {{ 94},{ 8}}, +{{222},{ 8}}, {{ 62},{ 8}}, {{190},{ 8}}, {{126},{ 8}}, {{254},{ 8}}, +{{ 1},{ 8}}, {{129},{ 8}}, {{ 65},{ 8}}, {{193},{ 8}}, {{ 33},{ 8}}, +{{161},{ 8}}, {{ 97},{ 8}}, {{225},{ 8}}, {{ 17},{ 8}}, {{145},{ 8}}, +{{ 81},{ 8}}, {{209},{ 8}}, {{ 49},{ 8}}, {{177},{ 8}}, {{113},{ 8}}, +{{241},{ 8}}, {{ 9},{ 8}}, {{137},{ 8}}, {{ 73},{ 8}}, {{201},{ 8}}, +{{ 41},{ 8}}, {{169},{ 8}}, {{105},{ 8}}, {{233},{ 8}}, {{ 25},{ 8}}, +{{153},{ 8}}, {{ 89},{ 8}}, {{217},{ 8}}, {{ 57},{ 8}}, {{185},{ 8}}, +{{121},{ 8}}, {{249},{ 8}}, {{ 5},{ 8}}, {{133},{ 8}}, {{ 69},{ 8}}, +{{197},{ 8}}, {{ 37},{ 8}}, {{165},{ 8}}, {{101},{ 8}}, {{229},{ 8}}, +{{ 21},{ 8}}, {{149},{ 8}}, {{ 85},{ 8}}, {{213},{ 8}}, {{ 53},{ 8}}, +{{181},{ 8}}, {{117},{ 8}}, {{245},{ 8}}, {{ 13},{ 8}}, {{141},{ 8}}, +{{ 77},{ 8}}, {{205},{ 8}}, {{ 45},{ 8}}, {{173},{ 8}}, {{109},{ 8}}, +{{237},{ 8}}, {{ 29},{ 8}}, {{157},{ 8}}, {{ 93},{ 8}}, {{221},{ 8}}, +{{ 61},{ 8}}, {{189},{ 8}}, {{125},{ 8}}, {{253},{ 8}}, {{ 19},{ 9}}, +{{275},{ 9}}, {{147},{ 9}}, {{403},{ 9}}, {{ 83},{ 9}}, {{339},{ 9}}, +{{211},{ 9}}, {{467},{ 9}}, {{ 51},{ 9}}, {{307},{ 9}}, {{179},{ 9}}, +{{435},{ 9}}, {{115},{ 9}}, {{371},{ 9}}, {{243},{ 9}}, {{499},{ 9}}, +{{ 11},{ 9}}, {{267},{ 9}}, {{139},{ 9}}, {{395},{ 9}}, {{ 75},{ 9}}, +{{331},{ 9}}, {{203},{ 9}}, {{459},{ 9}}, {{ 43},{ 9}}, {{299},{ 9}}, +{{171},{ 9}}, {{427},{ 9}}, {{107},{ 9}}, {{363},{ 9}}, {{235},{ 9}}, +{{491},{ 9}}, {{ 27},{ 9}}, {{283},{ 9}}, {{155},{ 9}}, {{411},{ 9}}, +{{ 91},{ 9}}, {{347},{ 9}}, {{219},{ 9}}, {{475},{ 9}}, {{ 59},{ 9}}, +{{315},{ 9}}, {{187},{ 9}}, {{443},{ 9}}, {{123},{ 9}}, {{379},{ 9}}, +{{251},{ 9}}, {{507},{ 9}}, {{ 7},{ 9}}, {{263},{ 9}}, {{135},{ 9}}, +{{391},{ 9}}, {{ 71},{ 9}}, {{327},{ 9}}, {{199},{ 9}}, {{455},{ 9}}, +{{ 39},{ 9}}, {{295},{ 9}}, {{167},{ 9}}, {{423},{ 9}}, {{103},{ 9}}, +{{359},{ 9}}, {{231},{ 9}}, {{487},{ 9}}, {{ 23},{ 9}}, {{279},{ 9}}, +{{151},{ 9}}, {{407},{ 9}}, {{ 87},{ 9}}, {{343},{ 9}}, {{215},{ 9}}, +{{471},{ 9}}, {{ 55},{ 9}}, {{311},{ 9}}, {{183},{ 9}}, {{439},{ 9}}, +{{119},{ 9}}, {{375},{ 9}}, {{247},{ 9}}, {{503},{ 9}}, {{ 15},{ 9}}, +{{271},{ 9}}, {{143},{ 9}}, {{399},{ 9}}, {{ 79},{ 9}}, {{335},{ 9}}, +{{207},{ 9}}, {{463},{ 9}}, {{ 47},{ 9}}, {{303},{ 9}}, {{175},{ 9}}, +{{431},{ 9}}, {{111},{ 9}}, {{367},{ 9}}, {{239},{ 9}}, {{495},{ 9}}, +{{ 31},{ 9}}, {{287},{ 9}}, {{159},{ 9}}, {{415},{ 9}}, {{ 95},{ 9}}, +{{351},{ 9}}, {{223},{ 9}}, {{479},{ 9}}, {{ 63},{ 9}}, {{319},{ 9}}, +{{191},{ 9}}, {{447},{ 9}}, {{127},{ 9}}, {{383},{ 9}}, {{255},{ 9}}, +{{511},{ 9}}, {{ 0},{ 7}}, {{ 64},{ 7}}, {{ 32},{ 7}}, {{ 96},{ 7}}, +{{ 16},{ 7}}, {{ 80},{ 7}}, {{ 48},{ 7}}, {{112},{ 7}}, {{ 8},{ 7}}, +{{ 72},{ 7}}, {{ 40},{ 7}}, {{104},{ 7}}, {{ 24},{ 7}}, {{ 88},{ 7}}, +{{ 56},{ 7}}, {{120},{ 7}}, {{ 4},{ 7}}, {{ 68},{ 7}}, {{ 36},{ 7}}, +{{100},{ 7}}, {{ 20},{ 7}}, {{ 84},{ 7}}, {{ 52},{ 7}}, {{116},{ 7}}, +{{ 3},{ 8}}, {{131},{ 8}}, {{ 67},{ 8}}, {{195},{ 8}}, {{ 35},{ 8}}, +{{163},{ 8}}, {{ 99},{ 8}}, {{227},{ 8}} +}; + +local const ct_data static_dtree[D_CODES] = { +{{ 0},{ 5}}, {{16},{ 5}}, {{ 8},{ 5}}, {{24},{ 5}}, {{ 4},{ 5}}, +{{20},{ 5}}, {{12},{ 5}}, {{28},{ 5}}, {{ 2},{ 5}}, {{18},{ 5}}, +{{10},{ 5}}, {{26},{ 5}}, {{ 6},{ 5}}, {{22},{ 5}}, {{14},{ 5}}, +{{30},{ 5}}, {{ 1},{ 5}}, {{17},{ 5}}, {{ 9},{ 5}}, {{25},{ 5}}, +{{ 5},{ 5}}, {{21},{ 5}}, {{13},{ 5}}, {{29},{ 5}}, {{ 3},{ 5}}, +{{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}} +}; + +const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = { + 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, + 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, +10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, +11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, +12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, +13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, +13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, +15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, +15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, +15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 16, 17, +18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, +23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, +26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, +26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, +27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29 +}; + +const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, +13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, +17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, +19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, +21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, +22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, +23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, +25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, +26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, +26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28 +}; + +local const int base_length[LENGTH_CODES] = { +0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, +64, 80, 96, 112, 128, 160, 192, 224, 0 +}; + +local const int base_dist[D_CODES] = { + 0, 1, 2, 3, 4, 6, 8, 12, 16, 24, + 32, 48, 64, 96, 128, 192, 256, 384, 512, 768, + 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576 +}; + diff --git a/hdssd/external/linux/zlib-1.2.11/zconf.h b/hdssd/external/linux/zlib-1.2.11/zconf.h new file mode 100644 index 0000000..77398c1 --- /dev/null +++ b/hdssd/external/linux/zlib-1.2.11/zconf.h @@ -0,0 +1,534 @@ +/* zconf.h -- configuration of the zlib compression library + * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#ifndef ZCONF_H +#define ZCONF_H + +/* + * If you *really* need a unique prefix for all types and library functions, + * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. + * Even better than compiling with -DZ_PREFIX would be to use configure to set + * this permanently in zconf.h using "./configure --zprefix". + */ +#ifdef Z_PREFIX /* may be set to #if 1 by ./configure */ +# define Z_PREFIX_SET + +/* all linked symbols and init macros */ +# define _dist_code z__dist_code +# define _length_code z__length_code +# define _tr_align z__tr_align +# define _tr_flush_bits z__tr_flush_bits +# define _tr_flush_block z__tr_flush_block +# define _tr_init z__tr_init +# define _tr_stored_block z__tr_stored_block +# define _tr_tally z__tr_tally +# define adler32 z_adler32 +# define adler32_combine z_adler32_combine +# define adler32_combine64 z_adler32_combine64 +# define adler32_z z_adler32_z +# ifndef Z_SOLO +# define compress z_compress +# define compress2 z_compress2 +# define compressBound z_compressBound +# endif +# define crc32 z_crc32 +# define crc32_combine z_crc32_combine +# define crc32_combine64 z_crc32_combine64 +# define crc32_z z_crc32_z +# define deflate z_deflate +# define deflateBound z_deflateBound +# define deflateCopy z_deflateCopy +# define deflateEnd z_deflateEnd +# define deflateGetDictionary z_deflateGetDictionary +# define deflateInit z_deflateInit +# define deflateInit2 z_deflateInit2 +# define deflateInit2_ z_deflateInit2_ +# define deflateInit_ z_deflateInit_ +# define deflateParams z_deflateParams +# define deflatePending z_deflatePending +# define deflatePrime z_deflatePrime +# define deflateReset z_deflateReset +# define deflateResetKeep z_deflateResetKeep +# define deflateSetDictionary z_deflateSetDictionary +# define deflateSetHeader z_deflateSetHeader +# define deflateTune z_deflateTune +# define deflate_copyright z_deflate_copyright +# define get_crc_table z_get_crc_table +# ifndef Z_SOLO +# define gz_error z_gz_error +# define gz_intmax z_gz_intmax +# define gz_strwinerror z_gz_strwinerror +# define gzbuffer z_gzbuffer +# define gzclearerr z_gzclearerr +# define gzclose z_gzclose +# define gzclose_r z_gzclose_r +# define gzclose_w z_gzclose_w +# define gzdirect z_gzdirect +# define gzdopen z_gzdopen +# define gzeof z_gzeof +# define gzerror z_gzerror +# define gzflush z_gzflush +# define gzfread z_gzfread +# define gzfwrite z_gzfwrite +# define gzgetc z_gzgetc +# define gzgetc_ z_gzgetc_ +# define gzgets z_gzgets +# define gzoffset z_gzoffset +# define gzoffset64 z_gzoffset64 +# define gzopen z_gzopen +# define gzopen64 z_gzopen64 +# ifdef _WIN32 +# define gzopen_w z_gzopen_w +# endif +# define gzprintf z_gzprintf +# define gzputc z_gzputc +# define gzputs z_gzputs +# define gzread z_gzread +# define gzrewind z_gzrewind +# define gzseek z_gzseek +# define gzseek64 z_gzseek64 +# define gzsetparams z_gzsetparams +# define gztell z_gztell +# define gztell64 z_gztell64 +# define gzungetc z_gzungetc +# define gzvprintf z_gzvprintf +# define gzwrite z_gzwrite +# endif +# define inflate z_inflate +# define inflateBack z_inflateBack +# define inflateBackEnd z_inflateBackEnd +# define inflateBackInit z_inflateBackInit +# define inflateBackInit_ z_inflateBackInit_ +# define inflateCodesUsed z_inflateCodesUsed +# define inflateCopy z_inflateCopy +# define inflateEnd z_inflateEnd +# define inflateGetDictionary z_inflateGetDictionary +# define inflateGetHeader z_inflateGetHeader +# define inflateInit z_inflateInit +# define inflateInit2 z_inflateInit2 +# define inflateInit2_ z_inflateInit2_ +# define inflateInit_ z_inflateInit_ +# define inflateMark z_inflateMark +# define inflatePrime z_inflatePrime +# define inflateReset z_inflateReset +# define inflateReset2 z_inflateReset2 +# define inflateResetKeep z_inflateResetKeep +# define inflateSetDictionary z_inflateSetDictionary +# define inflateSync z_inflateSync +# define inflateSyncPoint z_inflateSyncPoint +# define inflateUndermine z_inflateUndermine +# define inflateValidate z_inflateValidate +# define inflate_copyright z_inflate_copyright +# define inflate_fast z_inflate_fast +# define inflate_table z_inflate_table +# ifndef Z_SOLO +# define uncompress z_uncompress +# define uncompress2 z_uncompress2 +# endif +# define zError z_zError +# ifndef Z_SOLO +# define zcalloc z_zcalloc +# define zcfree z_zcfree +# endif +# define zlibCompileFlags z_zlibCompileFlags +# define zlibVersion z_zlibVersion + +/* all zlib typedefs in zlib.h and zconf.h */ +# define Byte z_Byte +# define Bytef z_Bytef +# define alloc_func z_alloc_func +# define charf z_charf +# define free_func z_free_func +# ifndef Z_SOLO +# define gzFile z_gzFile +# endif +# define gz_header z_gz_header +# define gz_headerp z_gz_headerp +# define in_func z_in_func +# define intf z_intf +# define out_func z_out_func +# define uInt z_uInt +# define uIntf z_uIntf +# define uLong z_uLong +# define uLongf z_uLongf +# define voidp z_voidp +# define voidpc z_voidpc +# define voidpf z_voidpf + +/* all zlib structs in zlib.h and zconf.h */ +# define gz_header_s z_gz_header_s +# define internal_state z_internal_state + +#endif + +#if defined(__MSDOS__) && !defined(MSDOS) +# define MSDOS +#endif +#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) +# define OS2 +#endif +#if defined(_WINDOWS) && !defined(WINDOWS) +# define WINDOWS +#endif +#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) +# ifndef WIN32 +# define WIN32 +# endif +#endif +#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) +# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) +# ifndef SYS16BIT +# define SYS16BIT +# endif +# endif +#endif + +/* + * Compile with -DMAXSEG_64K if the alloc function cannot allocate more + * than 64k bytes at a time (needed on systems with 16-bit int). + */ +#ifdef SYS16BIT +# define MAXSEG_64K +#endif +#ifdef MSDOS +# define UNALIGNED_OK +#endif + +#ifdef __STDC_VERSION__ +# ifndef STDC +# define STDC +# endif +# if __STDC_VERSION__ >= 199901L +# ifndef STDC99 +# define STDC99 +# endif +# endif +#endif +#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) +# define STDC +#endif +#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) +# define STDC +#endif +#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) +# define STDC +#endif +#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) +# define STDC +#endif + +#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ +# define STDC +#endif + +#ifndef STDC +# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ +# define const /* note: need a more gentle solution here */ +# endif +#endif + +#if defined(ZLIB_CONST) && !defined(z_const) +# define z_const const +#else +# define z_const +#endif + +#ifdef Z_SOLO + typedef unsigned long z_size_t; +#else +# define z_longlong long long +# if defined(NO_SIZE_T) + typedef unsigned NO_SIZE_T z_size_t; +# elif defined(STDC) +# include + typedef size_t z_size_t; +# else + typedef unsigned long z_size_t; +# endif +# undef z_longlong +#endif + +/* Maximum value for memLevel in deflateInit2 */ +#ifndef MAX_MEM_LEVEL +# ifdef MAXSEG_64K +# define MAX_MEM_LEVEL 8 +# else +# define MAX_MEM_LEVEL 9 +# endif +#endif + +/* Maximum value for windowBits in deflateInit2 and inflateInit2. + * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files + * created by gzip. (Files created by minigzip can still be extracted by + * gzip.) + */ +#ifndef MAX_WBITS +# define MAX_WBITS 15 /* 32K LZ77 window */ +#endif + +/* The memory requirements for deflate are (in bytes): + (1 << (windowBits+2)) + (1 << (memLevel+9)) + that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) + plus a few kilobytes for small objects. For example, if you want to reduce + the default memory requirements from 256K to 128K, compile with + make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" + Of course this will generally degrade compression (there's no free lunch). + + The memory requirements for inflate are (in bytes) 1 << windowBits + that is, 32K for windowBits=15 (default value) plus about 7 kilobytes + for small objects. +*/ + + /* Type declarations */ + +#ifndef OF /* function prototypes */ +# ifdef STDC +# define OF(args) args +# else +# define OF(args) () +# endif +#endif + +#ifndef Z_ARG /* function prototypes for stdarg */ +# if defined(STDC) || defined(Z_HAVE_STDARG_H) +# define Z_ARG(args) args +# else +# define Z_ARG(args) () +# endif +#endif + +/* The following definitions for FAR are needed only for MSDOS mixed + * model programming (small or medium model with some far allocations). + * This was tested only with MSC; for other MSDOS compilers you may have + * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, + * just define FAR to be empty. + */ +#ifdef SYS16BIT +# if defined(M_I86SM) || defined(M_I86MM) + /* MSC small or medium model */ +# define SMALL_MEDIUM +# ifdef _MSC_VER +# define FAR _far +# else +# define FAR far +# endif +# endif +# if (defined(__SMALL__) || defined(__MEDIUM__)) + /* Turbo C small or medium model */ +# define SMALL_MEDIUM +# ifdef __BORLANDC__ +# define FAR _far +# else +# define FAR far +# endif +# endif +#endif + +#if defined(WINDOWS) || defined(WIN32) + /* If building or using zlib as a DLL, define ZLIB_DLL. + * This is not mandatory, but it offers a little performance increase. + */ +# ifdef ZLIB_DLL +# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) +# ifdef ZLIB_INTERNAL +# define ZEXTERN extern __declspec(dllexport) +# else +# define ZEXTERN extern __declspec(dllimport) +# endif +# endif +# endif /* ZLIB_DLL */ + /* If building or using zlib with the WINAPI/WINAPIV calling convention, + * define ZLIB_WINAPI. + * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. + */ +# ifdef ZLIB_WINAPI +# ifdef FAR +# undef FAR +# endif +# include + /* No need for _export, use ZLIB.DEF instead. */ + /* For complete Windows compatibility, use WINAPI, not __stdcall. */ +# define ZEXPORT WINAPI +# ifdef WIN32 +# define ZEXPORTVA WINAPIV +# else +# define ZEXPORTVA FAR CDECL +# endif +# endif +#endif + +#if defined (__BEOS__) +# ifdef ZLIB_DLL +# ifdef ZLIB_INTERNAL +# define ZEXPORT __declspec(dllexport) +# define ZEXPORTVA __declspec(dllexport) +# else +# define ZEXPORT __declspec(dllimport) +# define ZEXPORTVA __declspec(dllimport) +# endif +# endif +#endif + +#ifndef ZEXTERN +# define ZEXTERN extern +#endif +#ifndef ZEXPORT +# define ZEXPORT +#endif +#ifndef ZEXPORTVA +# define ZEXPORTVA +#endif + +#ifndef FAR +# define FAR +#endif + +#if !defined(__MACTYPES__) +typedef unsigned char Byte; /* 8 bits */ +#endif +typedef unsigned int uInt; /* 16 bits or more */ +typedef unsigned long uLong; /* 32 bits or more */ + +#ifdef SMALL_MEDIUM + /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ +# define Bytef Byte FAR +#else + typedef Byte FAR Bytef; +#endif +typedef char FAR charf; +typedef int FAR intf; +typedef uInt FAR uIntf; +typedef uLong FAR uLongf; + +#ifdef STDC + typedef void const *voidpc; + typedef void FAR *voidpf; + typedef void *voidp; +#else + typedef Byte const *voidpc; + typedef Byte FAR *voidpf; + typedef Byte *voidp; +#endif + +#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC) +# include +# if (UINT_MAX == 0xffffffffUL) +# define Z_U4 unsigned +# elif (ULONG_MAX == 0xffffffffUL) +# define Z_U4 unsigned long +# elif (USHRT_MAX == 0xffffffffUL) +# define Z_U4 unsigned short +# endif +#endif + +#ifdef Z_U4 + typedef Z_U4 z_crc_t; +#else + typedef unsigned long z_crc_t; +#endif + +#if 1 /* was set to #if 1 by ./configure */ +# define Z_HAVE_UNISTD_H +#endif + +#if 1 /* was set to #if 1 by ./configure */ +# define Z_HAVE_STDARG_H +#endif + +#ifdef STDC +# ifndef Z_SOLO +# include /* for off_t */ +# endif +#endif + +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifndef Z_SOLO +# include /* for va_list */ +# endif +#endif + +#ifdef _WIN32 +# ifndef Z_SOLO +# include /* for wchar_t */ +# endif +#endif + +/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and + * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even + * though the former does not conform to the LFS document), but considering + * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as + * equivalently requesting no 64-bit operations + */ +#if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1 +# undef _LARGEFILE64_SOURCE +#endif + +#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H) +# define Z_HAVE_UNISTD_H +#endif +#ifndef Z_SOLO +# if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) +# include /* for SEEK_*, off_t, and _LFS64_LARGEFILE */ +# ifdef VMS +# include /* for off_t */ +# endif +# ifndef z_off_t +# define z_off_t off_t +# endif +# endif +#endif + +#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0 +# define Z_LFS64 +#endif + +#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64) +# define Z_LARGE64 +#endif + +#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64) +# define Z_WANT64 +#endif + +#if !defined(SEEK_SET) && !defined(Z_SOLO) +# define SEEK_SET 0 /* Seek from beginning of file. */ +# define SEEK_CUR 1 /* Seek from current position. */ +# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ +#endif + +#ifndef z_off_t +# define z_off_t long +#endif + +#if !defined(_WIN32) && defined(Z_LARGE64) +# define z_off64_t off64_t +#else +# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO) +# define z_off64_t __int64 +# else +# define z_off64_t z_off_t +# endif +#endif + +/* MVS linker does not support external names larger than 8 bytes */ +#if defined(__MVS__) + #pragma map(deflateInit_,"DEIN") + #pragma map(deflateInit2_,"DEIN2") + #pragma map(deflateEnd,"DEEND") + #pragma map(deflateBound,"DEBND") + #pragma map(inflateInit_,"ININ") + #pragma map(inflateInit2_,"ININ2") + #pragma map(inflateEnd,"INEND") + #pragma map(inflateSync,"INSY") + #pragma map(inflateSetDictionary,"INSEDI") + #pragma map(compressBound,"CMBND") + #pragma map(inflate_table,"INTABL") + #pragma map(inflate_fast,"INFA") + #pragma map(inflate_copyright,"INCOPY") +#endif + +#endif /* ZCONF_H */ diff --git a/hdssd/external/linux/zlib-1.2.11/zlib.h b/hdssd/external/linux/zlib-1.2.11/zlib.h new file mode 100644 index 0000000..f09cdaf --- /dev/null +++ b/hdssd/external/linux/zlib-1.2.11/zlib.h @@ -0,0 +1,1912 @@ +/* zlib.h -- interface of the 'zlib' general purpose compression library + version 1.2.11, January 15th, 2017 + + Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + + + The data format used by the zlib library is described by RFCs (Request for + Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950 + (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format). +*/ + +#ifndef ZLIB_H +#define ZLIB_H + +#include "zconf.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define ZLIB_VERSION "1.2.11" +#define ZLIB_VERNUM 0x12b0 +#define ZLIB_VER_MAJOR 1 +#define ZLIB_VER_MINOR 2 +#define ZLIB_VER_REVISION 11 +#define ZLIB_VER_SUBREVISION 0 + +/* + The 'zlib' compression library provides in-memory compression and + decompression functions, including integrity checks of the uncompressed data. + This version of the library supports only one compression method (deflation) + but other algorithms will be added later and will have the same stream + interface. + + Compression can be done in a single step if the buffers are large enough, + or can be done by repeated calls of the compression function. In the latter + case, the application must provide more input and/or consume the output + (providing more output space) before each call. + + The compressed data format used by default by the in-memory functions is + the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped + around a deflate stream, which is itself documented in RFC 1951. + + The library also supports reading and writing files in gzip (.gz) format + with an interface similar to that of stdio using the functions that start + with "gz". The gzip format is different from the zlib format. gzip is a + gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. + + This library can optionally read and write gzip and raw deflate streams in + memory as well. + + The zlib format was designed to be compact and fast for use in memory + and on communications channels. The gzip format was designed for single- + file compression on file systems, has a larger header than zlib to maintain + directory information, and uses a different, slower check method than zlib. + + The library does not install any signal handler. The decoder checks + the consistency of the compressed data, so the library should never crash + even in the case of corrupted input. +*/ + +typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); +typedef void (*free_func) OF((voidpf opaque, voidpf address)); + +struct internal_state; + +typedef struct z_stream_s { + z_const Bytef *next_in; /* next input byte */ + uInt avail_in; /* number of bytes available at next_in */ + uLong total_in; /* total number of input bytes read so far */ + + Bytef *next_out; /* next output byte will go here */ + uInt avail_out; /* remaining free space at next_out */ + uLong total_out; /* total number of bytes output so far */ + + z_const char *msg; /* last error message, NULL if no error */ + struct internal_state FAR *state; /* not visible by applications */ + + alloc_func zalloc; /* used to allocate the internal state */ + free_func zfree; /* used to free the internal state */ + voidpf opaque; /* private data object passed to zalloc and zfree */ + + int data_type; /* best guess about the data type: binary or text + for deflate, or the decoding state for inflate */ + uLong adler; /* Adler-32 or CRC-32 value of the uncompressed data */ + uLong reserved; /* reserved for future use */ +} z_stream; + +typedef z_stream FAR *z_streamp; + +/* + gzip header information passed to and from zlib routines. See RFC 1952 + for more details on the meanings of these fields. +*/ +typedef struct gz_header_s { + int text; /* true if compressed data believed to be text */ + uLong time; /* modification time */ + int xflags; /* extra flags (not used when writing a gzip file) */ + int os; /* operating system */ + Bytef *extra; /* pointer to extra field or Z_NULL if none */ + uInt extra_len; /* extra field length (valid if extra != Z_NULL) */ + uInt extra_max; /* space at extra (only when reading header) */ + Bytef *name; /* pointer to zero-terminated file name or Z_NULL */ + uInt name_max; /* space at name (only when reading header) */ + Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */ + uInt comm_max; /* space at comment (only when reading header) */ + int hcrc; /* true if there was or will be a header crc */ + int done; /* true when done reading gzip header (not used + when writing a gzip file) */ +} gz_header; + +typedef gz_header FAR *gz_headerp; + +/* + The application must update next_in and avail_in when avail_in has dropped + to zero. It must update next_out and avail_out when avail_out has dropped + to zero. The application must initialize zalloc, zfree and opaque before + calling the init function. All other fields are set by the compression + library and must not be updated by the application. + + The opaque value provided by the application will be passed as the first + parameter for calls of zalloc and zfree. This can be useful for custom + memory management. The compression library attaches no meaning to the + opaque value. + + zalloc must return Z_NULL if there is not enough memory for the object. + If zlib is used in a multi-threaded application, zalloc and zfree must be + thread safe. In that case, zlib is thread-safe. When zalloc and zfree are + Z_NULL on entry to the initialization function, they are set to internal + routines that use the standard library functions malloc() and free(). + + On 16-bit systems, the functions zalloc and zfree must be able to allocate + exactly 65536 bytes, but will not be required to allocate more than this if + the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, pointers + returned by zalloc for objects of exactly 65536 bytes *must* have their + offset normalized to zero. The default allocation function provided by this + library ensures this (see zutil.c). To reduce memory requirements and avoid + any allocation of 64K objects, at the expense of compression ratio, compile + the library with -DMAX_WBITS=14 (see zconf.h). + + The fields total_in and total_out can be used for statistics or progress + reports. After compression, total_in holds the total size of the + uncompressed data and may be saved for use by the decompressor (particularly + if the decompressor wants to decompress everything in a single step). +*/ + + /* constants */ + +#define Z_NO_FLUSH 0 +#define Z_PARTIAL_FLUSH 1 +#define Z_SYNC_FLUSH 2 +#define Z_FULL_FLUSH 3 +#define Z_FINISH 4 +#define Z_BLOCK 5 +#define Z_TREES 6 +/* Allowed flush values; see deflate() and inflate() below for details */ + +#define Z_OK 0 +#define Z_STREAM_END 1 +#define Z_NEED_DICT 2 +#define Z_ERRNO (-1) +#define Z_STREAM_ERROR (-2) +#define Z_DATA_ERROR (-3) +#define Z_MEM_ERROR (-4) +#define Z_BUF_ERROR (-5) +#define Z_VERSION_ERROR (-6) +/* Return codes for the compression/decompression functions. Negative values + * are errors, positive values are used for special but normal events. + */ + +#define Z_NO_COMPRESSION 0 +#define Z_BEST_SPEED 1 +#define Z_BEST_COMPRESSION 9 +#define Z_DEFAULT_COMPRESSION (-1) +/* compression levels */ + +#define Z_FILTERED 1 +#define Z_HUFFMAN_ONLY 2 +#define Z_RLE 3 +#define Z_FIXED 4 +#define Z_DEFAULT_STRATEGY 0 +/* compression strategy; see deflateInit2() below for details */ + +#define Z_BINARY 0 +#define Z_TEXT 1 +#define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */ +#define Z_UNKNOWN 2 +/* Possible values of the data_type field for deflate() */ + +#define Z_DEFLATED 8 +/* The deflate compression method (the only one supported in this version) */ + +#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ + +#define zlib_version zlibVersion() +/* for compatibility with versions < 1.0.2 */ + + + /* basic functions */ + +ZEXTERN const char * ZEXPORT zlibVersion OF((void)); +/* The application can compare zlibVersion and ZLIB_VERSION for consistency. + If the first character differs, the library code actually used is not + compatible with the zlib.h header file used by the application. This check + is automatically made by deflateInit and inflateInit. + */ + +/* +ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); + + Initializes the internal stream state for compression. The fields + zalloc, zfree and opaque must be initialized before by the caller. If + zalloc and zfree are set to Z_NULL, deflateInit updates them to use default + allocation functions. + + The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: + 1 gives best speed, 9 gives best compression, 0 gives no compression at all + (the input data is simply copied a block at a time). Z_DEFAULT_COMPRESSION + requests a default compromise between speed and compression (currently + equivalent to level 6). + + deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if level is not a valid compression level, or + Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible + with the version assumed by the caller (ZLIB_VERSION). msg is set to null + if there is no error message. deflateInit does not perform any compression: + this will be done by deflate(). +*/ + + +ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); +/* + deflate compresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce + some output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. deflate performs one or both of the + following actions: + + - Compress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in and avail_in are updated and + processing will resume at this point for the next call of deflate(). + + - Generate more output starting at next_out and update next_out and avail_out + accordingly. This action is forced if the parameter flush is non zero. + Forcing flush frequently degrades the compression ratio, so this parameter + should be set only when necessary. Some output may be provided even if + flush is zero. + + Before the call of deflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming more + output, and updating avail_in or avail_out accordingly; avail_out should + never be zero before the call. The application can consume the compressed + output when it wants, for example when the output buffer is full (avail_out + == 0), or after each call of deflate(). If deflate returns Z_OK and with + zero avail_out, it must be called again after making room in the output + buffer because there might be more output pending. See deflatePending(), + which can be used if desired to determine whether or not there is more ouput + in that case. + + Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to + decide how much data to accumulate before producing output, in order to + maximize compression. + + If the parameter flush is set to Z_SYNC_FLUSH, all pending output is + flushed to the output buffer and the output is aligned on a byte boundary, so + that the decompressor can get all input data available so far. (In + particular avail_in is zero after the call if enough output space has been + provided before the call.) Flushing may degrade compression for some + compression algorithms and so it should be used only when necessary. This + completes the current deflate block and follows it with an empty stored block + that is three bits plus filler bits to the next byte, followed by four bytes + (00 00 ff ff). + + If flush is set to Z_PARTIAL_FLUSH, all pending output is flushed to the + output buffer, but the output is not aligned to a byte boundary. All of the + input data so far will be available to the decompressor, as for Z_SYNC_FLUSH. + This completes the current deflate block and follows it with an empty fixed + codes block that is 10 bits long. This assures that enough bytes are output + in order for the decompressor to finish the block before the empty fixed + codes block. + + If flush is set to Z_BLOCK, a deflate block is completed and emitted, as + for Z_SYNC_FLUSH, but the output is not aligned on a byte boundary, and up to + seven bits of the current block are held to be written as the next byte after + the next deflate block is completed. In this case, the decompressor may not + be provided enough bits at this point in order to complete decompression of + the data provided so far to the compressor. It may need to wait for the next + block to be emitted. This is for advanced applications that need to control + the emission of deflate blocks. + + If flush is set to Z_FULL_FLUSH, all output is flushed as with + Z_SYNC_FLUSH, and the compression state is reset so that decompression can + restart from this point if previous compressed data has been damaged or if + random access is desired. Using Z_FULL_FLUSH too often can seriously degrade + compression. + + If deflate returns with avail_out == 0, this function must be called again + with the same value of the flush parameter and more output space (updated + avail_out), until the flush is complete (deflate returns with non-zero + avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that + avail_out is greater than six to avoid repeated flush markers due to + avail_out == 0 on return. + + If the parameter flush is set to Z_FINISH, pending input is processed, + pending output is flushed and deflate returns with Z_STREAM_END if there was + enough output space. If deflate returns with Z_OK or Z_BUF_ERROR, this + function must be called again with Z_FINISH and more output space (updated + avail_out) but no more input data, until it returns with Z_STREAM_END or an + error. After deflate has returned Z_STREAM_END, the only possible operations + on the stream are deflateReset or deflateEnd. + + Z_FINISH can be used in the first deflate call after deflateInit if all the + compression is to be done in a single step. In order to complete in one + call, avail_out must be at least the value returned by deflateBound (see + below). Then deflate is guaranteed to return Z_STREAM_END. If not enough + output space is provided, deflate will not return Z_STREAM_END, and it must + be called again as described above. + + deflate() sets strm->adler to the Adler-32 checksum of all input read + so far (that is, total_in bytes). If a gzip stream is being generated, then + strm->adler will be the CRC-32 checksum of the input read so far. (See + deflateInit2 below.) + + deflate() may update strm->data_type if it can make a good guess about + the input data type (Z_BINARY or Z_TEXT). If in doubt, the data is + considered binary. This field is only for information purposes and does not + affect the compression algorithm in any manner. + + deflate() returns Z_OK if some progress has been made (more input + processed or more output produced), Z_STREAM_END if all input has been + consumed and all output has been produced (only when flush is set to + Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example + if next_in or next_out was Z_NULL or the state was inadvertently written over + by the application), or Z_BUF_ERROR if no progress is possible (for example + avail_in or avail_out was zero). Note that Z_BUF_ERROR is not fatal, and + deflate() can be called again with more input and more output space to + continue compressing. +*/ + + +ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any pending + output. + + deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the + stream state was inconsistent, Z_DATA_ERROR if the stream was freed + prematurely (some input or output was discarded). In the error case, msg + may be set but then points to a static string (which must not be + deallocated). +*/ + + +/* +ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); + + Initializes the internal stream state for decompression. The fields + next_in, avail_in, zalloc, zfree and opaque must be initialized before by + the caller. In the current version of inflate, the provided input is not + read or consumed. The allocation of a sliding window will be deferred to + the first call of inflate (if the decompression does not complete on the + first call). If zalloc and zfree are set to Z_NULL, inflateInit updates + them to use default allocation functions. + + inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller, or Z_STREAM_ERROR if the parameters are + invalid, such as a null pointer to the structure. msg is set to null if + there is no error message. inflateInit does not perform any decompression. + Actual decompression will be done by inflate(). So next_in, and avail_in, + next_out, and avail_out are unused and unchanged. The current + implementation of inflateInit() does not process any header information -- + that is deferred until inflate() is called. +*/ + + +ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); +/* + inflate decompresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce + some output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. inflate performs one or both of the + following actions: + + - Decompress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), then next_in and avail_in are updated + accordingly, and processing will resume at this point for the next call of + inflate(). + + - Generate more output starting at next_out and update next_out and avail_out + accordingly. inflate() provides as much output as possible, until there is + no more input data or no more space in the output buffer (see below about + the flush parameter). + + Before the call of inflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming more + output, and updating the next_* and avail_* values accordingly. If the + caller of inflate() does not provide both available input and available + output space, it is possible that there will be no progress made. The + application can consume the uncompressed output when it wants, for example + when the output buffer is full (avail_out == 0), or after each call of + inflate(). If inflate returns Z_OK and with zero avail_out, it must be + called again after making room in the output buffer because there might be + more output pending. + + The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FINISH, + Z_BLOCK, or Z_TREES. Z_SYNC_FLUSH requests that inflate() flush as much + output as possible to the output buffer. Z_BLOCK requests that inflate() + stop if and when it gets to the next deflate block boundary. When decoding + the zlib or gzip format, this will cause inflate() to return immediately + after the header and before the first block. When doing a raw inflate, + inflate() will go ahead and process the first block, and will return when it + gets to the end of that block, or when it runs out of data. + + The Z_BLOCK option assists in appending to or combining deflate streams. + To assist in this, on return inflate() always sets strm->data_type to the + number of unused bits in the last byte taken from strm->next_in, plus 64 if + inflate() is currently decoding the last block in the deflate stream, plus + 128 if inflate() returned immediately after decoding an end-of-block code or + decoding the complete header up to just before the first byte of the deflate + stream. The end-of-block will not be indicated until all of the uncompressed + data from that block has been written to strm->next_out. The number of + unused bits may in general be greater than seven, except when bit 7 of + data_type is set, in which case the number of unused bits will be less than + eight. data_type is set as noted here every time inflate() returns for all + flush options, and so can be used to determine the amount of currently + consumed input in bits. + + The Z_TREES option behaves as Z_BLOCK does, but it also returns when the + end of each deflate block header is reached, before any actual data in that + block is decoded. This allows the caller to determine the length of the + deflate block header for later use in random access within a deflate block. + 256 is added to the value of strm->data_type when inflate() returns + immediately after reaching the end of the deflate block header. + + inflate() should normally be called until it returns Z_STREAM_END or an + error. However if all decompression is to be performed in a single step (a + single call of inflate), the parameter flush should be set to Z_FINISH. In + this case all pending input is processed and all pending output is flushed; + avail_out must be large enough to hold all of the uncompressed data for the + operation to complete. (The size of the uncompressed data may have been + saved by the compressor for this purpose.) The use of Z_FINISH is not + required to perform an inflation in one step. However it may be used to + inform inflate that a faster approach can be used for the single inflate() + call. Z_FINISH also informs inflate to not maintain a sliding window if the + stream completes, which reduces inflate's memory footprint. If the stream + does not complete, either because not all of the stream is provided or not + enough output space is provided, then a sliding window will be allocated and + inflate() can be called again to continue the operation as if Z_NO_FLUSH had + been used. + + In this implementation, inflate() always flushes as much output as + possible to the output buffer, and always uses the faster approach on the + first call. So the effects of the flush parameter in this implementation are + on the return value of inflate() as noted below, when inflate() returns early + when Z_BLOCK or Z_TREES is used, and when inflate() avoids the allocation of + memory for a sliding window when Z_FINISH is used. + + If a preset dictionary is needed after this call (see inflateSetDictionary + below), inflate sets strm->adler to the Adler-32 checksum of the dictionary + chosen by the compressor and returns Z_NEED_DICT; otherwise it sets + strm->adler to the Adler-32 checksum of all output produced so far (that is, + total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described + below. At the end of the stream, inflate() checks that its computed Adler-32 + checksum is equal to that saved by the compressor and returns Z_STREAM_END + only if the checksum is correct. + + inflate() can decompress and check either zlib-wrapped or gzip-wrapped + deflate data. The header type is detected automatically, if requested when + initializing with inflateInit2(). Any information contained in the gzip + header is not retained unless inflateGetHeader() is used. When processing + gzip-wrapped deflate data, strm->adler32 is set to the CRC-32 of the output + produced so far. The CRC-32 is checked against the gzip trailer, as is the + uncompressed length, modulo 2^32. + + inflate() returns Z_OK if some progress has been made (more input processed + or more output produced), Z_STREAM_END if the end of the compressed data has + been reached and all uncompressed output has been produced, Z_NEED_DICT if a + preset dictionary is needed at this point, Z_DATA_ERROR if the input data was + corrupted (input stream not conforming to the zlib format or incorrect check + value, in which case strm->msg points to a string with a more specific + error), Z_STREAM_ERROR if the stream structure was inconsistent (for example + next_in or next_out was Z_NULL, or the state was inadvertently written over + by the application), Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR + if no progress was possible or if there was not enough room in the output + buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and + inflate() can be called again with more input and more output space to + continue decompressing. If Z_DATA_ERROR is returned, the application may + then call inflateSync() to look for a good compression block if a partial + recovery of the data is to be attempted. +*/ + + +ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any pending + output. + + inflateEnd returns Z_OK if success, or Z_STREAM_ERROR if the stream state + was inconsistent. +*/ + + + /* Advanced functions */ + +/* + The following functions are needed only in some special applications. +*/ + +/* +ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, + int level, + int method, + int windowBits, + int memLevel, + int strategy)); + + This is another version of deflateInit with more compression options. The + fields next_in, zalloc, zfree and opaque must be initialized before by the + caller. + + The method parameter is the compression method. It must be Z_DEFLATED in + this version of the library. + + The windowBits parameter is the base two logarithm of the window size + (the size of the history buffer). It should be in the range 8..15 for this + version of the library. Larger values of this parameter result in better + compression at the expense of memory usage. The default value is 15 if + deflateInit is used instead. + + For the current implementation of deflate(), a windowBits value of 8 (a + window size of 256 bytes) is not supported. As a result, a request for 8 + will result in 9 (a 512-byte window). In that case, providing 8 to + inflateInit2() will result in an error when the zlib header with 9 is + checked against the initialization of inflate(). The remedy is to not use 8 + with deflateInit2() with this initialization, or at least in that case use 9 + with inflateInit2(). + + windowBits can also be -8..-15 for raw deflate. In this case, -windowBits + determines the window size. deflate() will then generate raw deflate data + with no zlib header or trailer, and will not compute a check value. + + windowBits can also be greater than 15 for optional gzip encoding. Add + 16 to windowBits to write a simple gzip header and trailer around the + compressed data instead of a zlib wrapper. The gzip header will have no + file name, no extra data, no comment, no modification time (set to zero), no + header crc, and the operating system will be set to the appropriate value, + if the operating system was determined at compile time. If a gzip stream is + being written, strm->adler is a CRC-32 instead of an Adler-32. + + For raw deflate or gzip encoding, a request for a 256-byte window is + rejected as invalid, since only the zlib header provides a means of + transmitting the window size to the decompressor. + + The memLevel parameter specifies how much memory should be allocated + for the internal compression state. memLevel=1 uses minimum memory but is + slow and reduces compression ratio; memLevel=9 uses maximum memory for + optimal speed. The default value is 8. See zconf.h for total memory usage + as a function of windowBits and memLevel. + + The strategy parameter is used to tune the compression algorithm. Use the + value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a + filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no + string match), or Z_RLE to limit match distances to one (run-length + encoding). Filtered data consists mostly of small values with a somewhat + random distribution. In this case, the compression algorithm is tuned to + compress them better. The effect of Z_FILTERED is to force more Huffman + coding and less string matching; it is somewhat intermediate between + Z_DEFAULT_STRATEGY and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as + fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data. The + strategy parameter only affects the compression ratio but not the + correctness of the compressed output even if it is not set appropriately. + Z_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler + decoder for special applications. + + deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if any parameter is invalid (such as an invalid + method), or Z_VERSION_ERROR if the zlib library version (zlib_version) is + incompatible with the version assumed by the caller (ZLIB_VERSION). msg is + set to null if there is no error message. deflateInit2 does not perform any + compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the compression dictionary from the given byte sequence + without producing any compressed output. When using the zlib format, this + function must be called immediately after deflateInit, deflateInit2 or + deflateReset, and before any call of deflate. When doing raw deflate, this + function must be called either before any call of deflate, or immediately + after the completion of a deflate block, i.e. after all input has been + consumed and all output has been delivered when using any of the flush + options Z_BLOCK, Z_PARTIAL_FLUSH, Z_SYNC_FLUSH, or Z_FULL_FLUSH. The + compressor and decompressor must use exactly the same dictionary (see + inflateSetDictionary). + + The dictionary should consist of strings (byte sequences) that are likely + to be encountered later in the data to be compressed, with the most commonly + used strings preferably put towards the end of the dictionary. Using a + dictionary is most useful when the data to be compressed is short and can be + predicted with good accuracy; the data can then be compressed better than + with the default empty dictionary. + + Depending on the size of the compression data structures selected by + deflateInit or deflateInit2, a part of the dictionary may in effect be + discarded, for example if the dictionary is larger than the window size + provided in deflateInit or deflateInit2. Thus the strings most likely to be + useful should be put at the end of the dictionary, not at the front. In + addition, the current implementation of deflate will use at most the window + size minus 262 bytes of the provided dictionary. + + Upon return of this function, strm->adler is set to the Adler-32 value + of the dictionary; the decompressor may later use this value to determine + which dictionary has been used by the compressor. (The Adler-32 value + applies to the whole dictionary even if only a subset of the dictionary is + actually used by the compressor.) If a raw deflate was requested, then the + Adler-32 value is not computed and strm->adler is not set. + + deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a + parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is + inconsistent (for example if deflate has already been called for this stream + or if not at a block boundary for raw deflate). deflateSetDictionary does + not perform any compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateGetDictionary OF((z_streamp strm, + Bytef *dictionary, + uInt *dictLength)); +/* + Returns the sliding dictionary being maintained by deflate. dictLength is + set to the number of bytes in the dictionary, and that many bytes are copied + to dictionary. dictionary must have enough space, where 32768 bytes is + always enough. If deflateGetDictionary() is called with dictionary equal to + Z_NULL, then only the dictionary length is returned, and nothing is copied. + Similary, if dictLength is Z_NULL, then it is not set. + + deflateGetDictionary() may return a length less than the window size, even + when more than the window size in input has been provided. It may return up + to 258 bytes less in that case, due to how zlib's implementation of deflate + manages the sliding window and lookahead for matches, where matches can be + up to 258 bytes long. If the application needs the last window-size bytes of + input, then that would need to be saved by the application outside of zlib. + + deflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the + stream state is inconsistent. +*/ + +ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when several compression strategies will be + tried, for example when there are several ways of pre-processing the input + data with a filter. The streams that will be discarded should then be freed + by calling deflateEnd. Note that deflateCopy duplicates the internal + compression state which can be quite large, so this strategy is slow and can + consume lots of memory. + + deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being Z_NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); +/* + This function is equivalent to deflateEnd followed by deflateInit, but + does not free and reallocate the internal compression state. The stream + will leave the compression level and any other attributes that may have been + set unchanged. + + deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL). +*/ + +ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, + int level, + int strategy)); +/* + Dynamically update the compression level and compression strategy. The + interpretation of level and strategy is as in deflateInit2(). This can be + used to switch between compression and straight copy of the input data, or + to switch to a different kind of input data requiring a different strategy. + If the compression approach (which is a function of the level) or the + strategy is changed, and if any input has been consumed in a previous + deflate() call, then the input available so far is compressed with the old + level and strategy using deflate(strm, Z_BLOCK). There are three approaches + for the compression levels 0, 1..3, and 4..9 respectively. The new level + and strategy will take effect at the next call of deflate(). + + If a deflate(strm, Z_BLOCK) is performed by deflateParams(), and it does + not have enough output space to complete, then the parameter change will not + take effect. In this case, deflateParams() can be called again with the + same parameters and more output space to try again. + + In order to assure a change in the parameters on the first try, the + deflate stream should be flushed using deflate() with Z_BLOCK or other flush + request until strm.avail_out is not zero, before calling deflateParams(). + Then no more input data should be provided before the deflateParams() call. + If this is done, the old level and strategy will be applied to the data + compressed before deflateParams(), and the new level and strategy will be + applied to the the data compressed after deflateParams(). + + deflateParams returns Z_OK on success, Z_STREAM_ERROR if the source stream + state was inconsistent or if a parameter was invalid, or Z_BUF_ERROR if + there was not enough output space to complete the compression of the + available input data before a change in the strategy or approach. Note that + in the case of a Z_BUF_ERROR, the parameters are not changed. A return + value of Z_BUF_ERROR is not fatal, in which case deflateParams() can be + retried with more output space. +*/ + +ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, + int good_length, + int max_lazy, + int nice_length, + int max_chain)); +/* + Fine tune deflate's internal compression parameters. This should only be + used by someone who understands the algorithm used by zlib's deflate for + searching for the best matching string, and even then only by the most + fanatic optimizer trying to squeeze out the last compressed bit for their + specific input data. Read the deflate.c source code for the meaning of the + max_lazy, good_length, nice_length, and max_chain parameters. + + deflateTune() can be called after deflateInit() or deflateInit2(), and + returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. + */ + +ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, + uLong sourceLen)); +/* + deflateBound() returns an upper bound on the compressed size after + deflation of sourceLen bytes. It must be called after deflateInit() or + deflateInit2(), and after deflateSetHeader(), if used. This would be used + to allocate an output buffer for deflation in a single pass, and so would be + called before deflate(). If that first deflate() call is provided the + sourceLen input bytes, an output buffer allocated to the size returned by + deflateBound(), and the flush value Z_FINISH, then deflate() is guaranteed + to return Z_STREAM_END. Note that it is possible for the compressed size to + be larger than the value returned by deflateBound() if flush options other + than Z_FINISH or Z_NO_FLUSH are used. +*/ + +ZEXTERN int ZEXPORT deflatePending OF((z_streamp strm, + unsigned *pending, + int *bits)); +/* + deflatePending() returns the number of bytes and bits of output that have + been generated, but not yet provided in the available output. The bytes not + provided would be due to the available output space having being consumed. + The number of bits of output not provided are between 0 and 7, where they + await more bits to join them in order to fill out a full byte. If pending + or bits are Z_NULL, then those values are not set. + + deflatePending returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. + */ + +ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + deflatePrime() inserts bits in the deflate output stream. The intent + is that this function is used to start off the deflate output with the bits + leftover from a previous deflate stream when appending to it. As such, this + function can only be used for raw deflate, and must be used before the first + deflate() call after a deflateInit2() or deflateReset(). bits must be less + than or equal to 16, and that many of the least significant bits of value + will be inserted in the output. + + deflatePrime returns Z_OK if success, Z_BUF_ERROR if there was not enough + room in the internal buffer to insert the bits, or Z_STREAM_ERROR if the + source stream state was inconsistent. +*/ + +ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, + gz_headerp head)); +/* + deflateSetHeader() provides gzip header information for when a gzip + stream is requested by deflateInit2(). deflateSetHeader() may be called + after deflateInit2() or deflateReset() and before the first call of + deflate(). The text, time, os, extra field, name, and comment information + in the provided gz_header structure are written to the gzip header (xflag is + ignored -- the extra flags are set according to the compression level). The + caller must assure that, if not Z_NULL, name and comment are terminated with + a zero byte, and that if extra is not Z_NULL, that extra_len bytes are + available there. If hcrc is true, a gzip header crc is included. Note that + the current versions of the command-line version of gzip (up through version + 1.3.x) do not support header crc's, and will report that it is a "multi-part + gzip file" and give up. + + If deflateSetHeader is not used, the default gzip header has text false, + the time set to zero, and os set to 255, with no extra, name, or comment + fields. The gzip header is returned to the default state by deflateReset(). + + deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, + int windowBits)); + + This is another version of inflateInit with an extra parameter. The + fields next_in, avail_in, zalloc, zfree and opaque must be initialized + before by the caller. + + The windowBits parameter is the base two logarithm of the maximum window + size (the size of the history buffer). It should be in the range 8..15 for + this version of the library. The default value is 15 if inflateInit is used + instead. windowBits must be greater than or equal to the windowBits value + provided to deflateInit2() while compressing, or it must be equal to 15 if + deflateInit2() was not used. If a compressed stream with a larger window + size is given as input, inflate() will return with the error code + Z_DATA_ERROR instead of trying to allocate a larger window. + + windowBits can also be zero to request that inflate use the window size in + the zlib header of the compressed stream. + + windowBits can also be -8..-15 for raw inflate. In this case, -windowBits + determines the window size. inflate() will then process raw deflate data, + not looking for a zlib or gzip header, not generating a check value, and not + looking for any check values for comparison at the end of the stream. This + is for use with other formats that use the deflate compressed data format + such as zip. Those formats provide their own check values. If a custom + format is developed using the raw deflate format for compressed data, it is + recommended that a check value such as an Adler-32 or a CRC-32 be applied to + the uncompressed data as is done in the zlib, gzip, and zip formats. For + most applications, the zlib format should be used as is. Note that comments + above on the use in deflateInit2() applies to the magnitude of windowBits. + + windowBits can also be greater than 15 for optional gzip decoding. Add + 32 to windowBits to enable zlib and gzip decoding with automatic header + detection, or add 16 to decode only the gzip format (the zlib format will + return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a + CRC-32 instead of an Adler-32. Unlike the gunzip utility and gzread() (see + below), inflate() will not automatically decode concatenated gzip streams. + inflate() will return Z_STREAM_END at the end of the gzip stream. The state + would need to be reset to continue decoding a subsequent gzip stream. + + inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller, or Z_STREAM_ERROR if the parameters are + invalid, such as a null pointer to the structure. msg is set to null if + there is no error message. inflateInit2 does not perform any decompression + apart from possibly reading the zlib header if present: actual decompression + will be done by inflate(). (So next_in and avail_in may be modified, but + next_out and avail_out are unused and unchanged.) The current implementation + of inflateInit2() does not process any header information -- that is + deferred until inflate() is called. +*/ + +ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the decompression dictionary from the given uncompressed byte + sequence. This function must be called immediately after a call of inflate, + if that call returned Z_NEED_DICT. The dictionary chosen by the compressor + can be determined from the Adler-32 value returned by that call of inflate. + The compressor and decompressor must use exactly the same dictionary (see + deflateSetDictionary). For raw inflate, this function can be called at any + time to set the dictionary. If the provided dictionary is smaller than the + window and there is already data in the window, then the provided dictionary + will amend what's there. The application must insure that the dictionary + that was used for compression is provided. + + inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a + parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is + inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the + expected one (incorrect Adler-32 value). inflateSetDictionary does not + perform any decompression: this will be done by subsequent calls of + inflate(). +*/ + +ZEXTERN int ZEXPORT inflateGetDictionary OF((z_streamp strm, + Bytef *dictionary, + uInt *dictLength)); +/* + Returns the sliding dictionary being maintained by inflate. dictLength is + set to the number of bytes in the dictionary, and that many bytes are copied + to dictionary. dictionary must have enough space, where 32768 bytes is + always enough. If inflateGetDictionary() is called with dictionary equal to + Z_NULL, then only the dictionary length is returned, and nothing is copied. + Similary, if dictLength is Z_NULL, then it is not set. + + inflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the + stream state is inconsistent. +*/ + +ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); +/* + Skips invalid compressed data until a possible full flush point (see above + for the description of deflate with Z_FULL_FLUSH) can be found, or until all + available input is skipped. No output is provided. + + inflateSync searches for a 00 00 FF FF pattern in the compressed data. + All full flush points have this pattern, but not all occurrences of this + pattern are full flush points. + + inflateSync returns Z_OK if a possible full flush point has been found, + Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point + has been found, or Z_STREAM_ERROR if the stream structure was inconsistent. + In the success case, the application may save the current current value of + total_in which indicates where valid compressed data was found. In the + error case, the application may repeatedly call inflateSync, providing more + input each time, until success or end of the input data. +*/ + +ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when randomly accessing a large stream. The + first pass through the stream can periodically record the inflate state, + allowing restarting inflate at those points when randomly accessing the + stream. + + inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being Z_NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); +/* + This function is equivalent to inflateEnd followed by inflateInit, + but does not free and reallocate the internal decompression state. The + stream will keep attributes that may have been set by inflateInit2. + + inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL). +*/ + +ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm, + int windowBits)); +/* + This function is the same as inflateReset, but it also permits changing + the wrap and window size requests. The windowBits parameter is interpreted + the same as it is for inflateInit2. If the window size is changed, then the + memory allocated for the window is freed, and the window will be reallocated + by inflate() if needed. + + inflateReset2 returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL), or if + the windowBits parameter is invalid. +*/ + +ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + This function inserts bits in the inflate input stream. The intent is + that this function is used to start inflating at a bit position in the + middle of a byte. The provided bits will be used before any bytes are used + from next_in. This function should only be used with raw inflate, and + should be used before the first inflate() call after inflateInit2() or + inflateReset(). bits must be less than or equal to 16, and that many of the + least significant bits of value will be inserted in the input. + + If bits is negative, then the input stream bit buffer is emptied. Then + inflatePrime() can be called again to put bits in the buffer. This is used + to clear out bits leftover after feeding inflate a block description prior + to feeding inflate codes. + + inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm)); +/* + This function returns two values, one in the lower 16 bits of the return + value, and the other in the remaining upper bits, obtained by shifting the + return value down 16 bits. If the upper value is -1 and the lower value is + zero, then inflate() is currently decoding information outside of a block. + If the upper value is -1 and the lower value is non-zero, then inflate is in + the middle of a stored block, with the lower value equaling the number of + bytes from the input remaining to copy. If the upper value is not -1, then + it is the number of bits back from the current bit position in the input of + the code (literal or length/distance pair) currently being processed. In + that case the lower value is the number of bytes already emitted for that + code. + + A code is being processed if inflate is waiting for more input to complete + decoding of the code, or if it has completed decoding but is waiting for + more output space to write the literal or match data. + + inflateMark() is used to mark locations in the input data for random + access, which may be at bit positions, and to note those cases where the + output of a code may span boundaries of random access blocks. The current + location in the input stream can be determined from avail_in and data_type + as noted in the description for the Z_BLOCK flush parameter for inflate. + + inflateMark returns the value noted above, or -65536 if the provided + source stream state was inconsistent. +*/ + +ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, + gz_headerp head)); +/* + inflateGetHeader() requests that gzip header information be stored in the + provided gz_header structure. inflateGetHeader() may be called after + inflateInit2() or inflateReset(), and before the first call of inflate(). + As inflate() processes the gzip stream, head->done is zero until the header + is completed, at which time head->done is set to one. If a zlib stream is + being decoded, then head->done is set to -1 to indicate that there will be + no gzip header information forthcoming. Note that Z_BLOCK or Z_TREES can be + used to force inflate() to return immediately after header processing is + complete and before any actual data is decompressed. + + The text, time, xflags, and os fields are filled in with the gzip header + contents. hcrc is set to true if there is a header CRC. (The header CRC + was valid if done is set to one.) If extra is not Z_NULL, then extra_max + contains the maximum number of bytes to write to extra. Once done is true, + extra_len contains the actual extra field length, and extra contains the + extra field, or that field truncated if extra_max is less than extra_len. + If name is not Z_NULL, then up to name_max characters are written there, + terminated with a zero unless the length is greater than name_max. If + comment is not Z_NULL, then up to comm_max characters are written there, + terminated with a zero unless the length is greater than comm_max. When any + of extra, name, or comment are not Z_NULL and the respective field is not + present in the header, then that field is set to Z_NULL to signal its + absence. This allows the use of deflateSetHeader() with the returned + structure to duplicate the header. However if those fields are set to + allocated memory, then the application will need to save those pointers + elsewhere so that they can be eventually freed. + + If inflateGetHeader is not used, then the header information is simply + discarded. The header is always checked for validity, including the header + CRC if present. inflateReset() will reset the process to discard the header + information. The application would need to call inflateGetHeader() again to + retrieve the header from the next gzip stream. + + inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, + unsigned char FAR *window)); + + Initialize the internal stream state for decompression using inflateBack() + calls. The fields zalloc, zfree and opaque in strm must be initialized + before the call. If zalloc and zfree are Z_NULL, then the default library- + derived memory allocation routines are used. windowBits is the base two + logarithm of the window size, in the range 8..15. window is a caller + supplied buffer of that size. Except for special applications where it is + assured that deflate was used with small window sizes, windowBits must be 15 + and a 32K byte window must be supplied to be able to decompress general + deflate streams. + + See inflateBack() for the usage of these routines. + + inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of + the parameters are invalid, Z_MEM_ERROR if the internal state could not be + allocated, or Z_VERSION_ERROR if the version of the library does not match + the version of the header file. +*/ + +typedef unsigned (*in_func) OF((void FAR *, + z_const unsigned char FAR * FAR *)); +typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); + +ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, + in_func in, void FAR *in_desc, + out_func out, void FAR *out_desc)); +/* + inflateBack() does a raw inflate with a single call using a call-back + interface for input and output. This is potentially more efficient than + inflate() for file i/o applications, in that it avoids copying between the + output and the sliding window by simply making the window itself the output + buffer. inflate() can be faster on modern CPUs when used with large + buffers. inflateBack() trusts the application to not change the output + buffer passed by the output function, at least until inflateBack() returns. + + inflateBackInit() must be called first to allocate the internal state + and to initialize the state with the user-provided window buffer. + inflateBack() may then be used multiple times to inflate a complete, raw + deflate stream with each call. inflateBackEnd() is then called to free the + allocated state. + + A raw deflate stream is one with no zlib or gzip header or trailer. + This routine would normally be used in a utility that reads zip or gzip + files and writes out uncompressed files. The utility would decode the + header and process the trailer on its own, hence this routine expects only + the raw deflate stream to decompress. This is different from the default + behavior of inflate(), which expects a zlib header and trailer around the + deflate stream. + + inflateBack() uses two subroutines supplied by the caller that are then + called by inflateBack() for input and output. inflateBack() calls those + routines until it reads a complete deflate stream and writes out all of the + uncompressed data, or until it encounters an error. The function's + parameters and return types are defined above in the in_func and out_func + typedefs. inflateBack() will call in(in_desc, &buf) which should return the + number of bytes of provided input, and a pointer to that input in buf. If + there is no input available, in() must return zero -- buf is ignored in that + case -- and inflateBack() will return a buffer error. inflateBack() will + call out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. + out() should return zero on success, or non-zero on failure. If out() + returns non-zero, inflateBack() will return with an error. Neither in() nor + out() are permitted to change the contents of the window provided to + inflateBackInit(), which is also the buffer that out() uses to write from. + The length written by out() will be at most the window size. Any non-zero + amount of input may be provided by in(). + + For convenience, inflateBack() can be provided input on the first call by + setting strm->next_in and strm->avail_in. If that input is exhausted, then + in() will be called. Therefore strm->next_in must be initialized before + calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called + immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in + must also be initialized, and then if strm->avail_in is not zero, input will + initially be taken from strm->next_in[0 .. strm->avail_in - 1]. + + The in_desc and out_desc parameters of inflateBack() is passed as the + first parameter of in() and out() respectively when they are called. These + descriptors can be optionally used to pass any information that the caller- + supplied in() and out() functions need to do their job. + + On return, inflateBack() will set strm->next_in and strm->avail_in to + pass back any unused input that was provided by the last in() call. The + return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR + if in() or out() returned an error, Z_DATA_ERROR if there was a format error + in the deflate stream (in which case strm->msg is set to indicate the nature + of the error), or Z_STREAM_ERROR if the stream was not properly initialized. + In the case of Z_BUF_ERROR, an input or output error can be distinguished + using strm->next_in which will be Z_NULL only if in() returned an error. If + strm->next_in is not Z_NULL, then the Z_BUF_ERROR was due to out() returning + non-zero. (in() will always be called before out(), so strm->next_in is + assured to be defined if out() returns non-zero.) Note that inflateBack() + cannot return Z_OK. +*/ + +ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); +/* + All memory allocated by inflateBackInit() is freed. + + inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream + state was inconsistent. +*/ + +ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); +/* Return flags indicating compile-time options. + + Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: + 1.0: size of uInt + 3.2: size of uLong + 5.4: size of voidpf (pointer) + 7.6: size of z_off_t + + Compiler, assembler, and debug options: + 8: ZLIB_DEBUG + 9: ASMV or ASMINF -- use ASM code + 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention + 11: 0 (reserved) + + One-time table building (smaller code, but not thread-safe if true): + 12: BUILDFIXED -- build static block decoding tables when needed + 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed + 14,15: 0 (reserved) + + Library content (indicates missing functionality): + 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking + deflate code when not needed) + 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect + and decode gzip streams (to avoid linking crc code) + 18-19: 0 (reserved) + + Operation variations (changes in library functionality): + 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate + 21: FASTEST -- deflate algorithm with only one, lowest compression level + 22,23: 0 (reserved) + + The sprintf variant used by gzprintf (zero is best): + 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format + 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! + 26: 0 = returns value, 1 = void -- 1 means inferred string length returned + + Remainder: + 27-31: 0 (reserved) + */ + +#ifndef Z_SOLO + + /* utility functions */ + +/* + The following utility functions are implemented on top of the basic + stream-oriented functions. To simplify the interface, some default options + are assumed (compression level and memory usage, standard memory allocation + functions). The source code of these utility functions can be modified if + you need special options. +*/ + +ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Compresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total size + of the destination buffer, which must be at least the value returned by + compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed data. compress() is equivalent to compress2() with a level + parameter of Z_DEFAULT_COMPRESSION. + + compress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer. +*/ + +ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen, + int level)); +/* + Compresses the source buffer into the destination buffer. The level + parameter has the same meaning as in deflateInit. sourceLen is the byte + length of the source buffer. Upon entry, destLen is the total size of the + destination buffer, which must be at least the value returned by + compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed data. + + compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, + Z_STREAM_ERROR if the level parameter is invalid. +*/ + +ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); +/* + compressBound() returns an upper bound on the compressed size after + compress() or compress2() on sourceLen bytes. It would be used before a + compress() or compress2() call to allocate the destination buffer. +*/ + +ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Decompresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total size + of the destination buffer, which must be large enough to hold the entire + uncompressed data. (The size of the uncompressed data must have been saved + previously by the compressor and transmitted to the decompressor by some + mechanism outside the scope of this compression library.) Upon exit, destLen + is the actual size of the uncompressed data. + + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. In + the case where there is not enough room, uncompress() will fill the output + buffer with the uncompressed data up to that point. +*/ + +ZEXTERN int ZEXPORT uncompress2 OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong *sourceLen)); +/* + Same as uncompress, except that sourceLen is a pointer, where the + length of the source is *sourceLen. On return, *sourceLen is the number of + source bytes consumed. +*/ + + /* gzip file access functions */ + +/* + This library supports reading and writing files in gzip (.gz) format with + an interface similar to that of stdio, using the functions that start with + "gz". The gzip format is different from the zlib format. gzip is a gzip + wrapper, documented in RFC 1952, wrapped around a deflate stream. +*/ + +typedef struct gzFile_s *gzFile; /* semi-opaque gzip file descriptor */ + +/* +ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); + + Opens a gzip (.gz) file for reading or writing. The mode parameter is as + in fopen ("rb" or "wb") but can also include a compression level ("wb9") or + a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only + compression as in "wb1h", 'R' for run-length encoding as in "wb1R", or 'F' + for fixed code compression as in "wb9F". (See the description of + deflateInit2 for more information about the strategy parameter.) 'T' will + request transparent writing or appending with no compression and not using + the gzip format. + + "a" can be used instead of "w" to request that the gzip stream that will + be written be appended to the file. "+" will result in an error, since + reading and writing to the same gzip file is not supported. The addition of + "x" when writing will create the file exclusively, which fails if the file + already exists. On systems that support it, the addition of "e" when + reading or writing will set the flag to close the file on an execve() call. + + These functions, as well as gzip, will read and decode a sequence of gzip + streams in a file. The append function of gzopen() can be used to create + such a file. (Also see gzflush() for another way to do this.) When + appending, gzopen does not test whether the file begins with a gzip stream, + nor does it look for the end of the gzip streams to begin appending. gzopen + will simply append a gzip stream to the existing file. + + gzopen can be used to read a file which is not in gzip format; in this + case gzread will directly read from the file without decompression. When + reading, this will be detected automatically by looking for the magic two- + byte gzip header. + + gzopen returns NULL if the file could not be opened, if there was + insufficient memory to allocate the gzFile state, or if an invalid mode was + specified (an 'r', 'w', or 'a' was not provided, or '+' was provided). + errno can be checked to determine if the reason gzopen failed was that the + file could not be opened. +*/ + +ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); +/* + gzdopen associates a gzFile with the file descriptor fd. File descriptors + are obtained from calls like open, dup, creat, pipe or fileno (if the file + has been previously opened with fopen). The mode parameter is as in gzopen. + + The next call of gzclose on the returned gzFile will also close the file + descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor + fd. If you want to keep fd open, use fd = dup(fd_keep); gz = gzdopen(fd, + mode);. The duplicated descriptor should be saved to avoid a leak, since + gzdopen does not close fd if it fails. If you are using fileno() to get the + file descriptor from a FILE *, then you will have to use dup() to avoid + double-close()ing the file descriptor. Both gzclose() and fclose() will + close the associated file descriptor, so they need to have different file + descriptors. + + gzdopen returns NULL if there was insufficient memory to allocate the + gzFile state, if an invalid mode was specified (an 'r', 'w', or 'a' was not + provided, or '+' was provided), or if fd is -1. The file descriptor is not + used until the next gz* read, write, seek, or close operation, so gzdopen + will not detect if fd is invalid (unless fd is -1). +*/ + +ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); +/* + Set the internal buffer size used by this library's functions. The + default buffer size is 8192 bytes. This function must be called after + gzopen() or gzdopen(), and before any other calls that read or write the + file. The buffer memory allocation is always deferred to the first read or + write. Three times that size in buffer space is allocated. A larger buffer + size of, for example, 64K or 128K bytes will noticeably increase the speed + of decompression (reading). + + The new buffer size also affects the maximum length for gzprintf(). + + gzbuffer() returns 0 on success, or -1 on failure, such as being called + too late. +*/ + +ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); +/* + Dynamically update the compression level or strategy. See the description + of deflateInit2 for the meaning of these parameters. Previously provided + data is flushed before the parameter change. + + gzsetparams returns Z_OK if success, Z_STREAM_ERROR if the file was not + opened for writing, Z_ERRNO if there is an error writing the flushed data, + or Z_MEM_ERROR if there is a memory allocation error. +*/ + +ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); +/* + Reads the given number of uncompressed bytes from the compressed file. If + the input file is not in gzip format, gzread copies the given number of + bytes into the buffer directly from the file. + + After reaching the end of a gzip stream in the input, gzread will continue + to read, looking for another gzip stream. Any number of gzip streams may be + concatenated in the input file, and will all be decompressed by gzread(). + If something other than a gzip stream is encountered after a gzip stream, + that remaining trailing garbage is ignored (and no error is returned). + + gzread can be used to read a gzip file that is being concurrently written. + Upon reaching the end of the input, gzread will return with the available + data. If the error code returned by gzerror is Z_OK or Z_BUF_ERROR, then + gzclearerr can be used to clear the end of file indicator in order to permit + gzread to be tried again. Z_OK indicates that a gzip stream was completed + on the last gzread. Z_BUF_ERROR indicates that the input file ended in the + middle of a gzip stream. Note that gzread does not return -1 in the event + of an incomplete gzip stream. This error is deferred until gzclose(), which + will return Z_BUF_ERROR if the last gzread ended in the middle of a gzip + stream. Alternatively, gzerror can be used before gzclose to detect this + case. + + gzread returns the number of uncompressed bytes actually read, less than + len for end of file, or -1 for error. If len is too large to fit in an int, + then nothing is read, -1 is returned, and the error state is set to + Z_STREAM_ERROR. +*/ + +ZEXTERN z_size_t ZEXPORT gzfread OF((voidp buf, z_size_t size, z_size_t nitems, + gzFile file)); +/* + Read up to nitems items of size size from file to buf, otherwise operating + as gzread() does. This duplicates the interface of stdio's fread(), with + size_t request and return types. If the library defines size_t, then + z_size_t is identical to size_t. If not, then z_size_t is an unsigned + integer type that can contain a pointer. + + gzfread() returns the number of full items read of size size, or zero if + the end of the file was reached and a full item could not be read, or if + there was an error. gzerror() must be consulted if zero is returned in + order to determine if there was an error. If the multiplication of size and + nitems overflows, i.e. the product does not fit in a z_size_t, then nothing + is read, zero is returned, and the error state is set to Z_STREAM_ERROR. + + In the event that the end of file is reached and only a partial item is + available at the end, i.e. the remaining uncompressed data length is not a + multiple of size, then the final partial item is nevetheless read into buf + and the end-of-file flag is set. The length of the partial item read is not + provided, but could be inferred from the result of gztell(). This behavior + is the same as the behavior of fread() implementations in common libraries, + but it prevents the direct use of gzfread() to read a concurrently written + file, reseting and retrying on end-of-file, when size is not 1. +*/ + +ZEXTERN int ZEXPORT gzwrite OF((gzFile file, + voidpc buf, unsigned len)); +/* + Writes the given number of uncompressed bytes into the compressed file. + gzwrite returns the number of uncompressed bytes written or 0 in case of + error. +*/ + +ZEXTERN z_size_t ZEXPORT gzfwrite OF((voidpc buf, z_size_t size, + z_size_t nitems, gzFile file)); +/* + gzfwrite() writes nitems items of size size from buf to file, duplicating + the interface of stdio's fwrite(), with size_t request and return types. If + the library defines size_t, then z_size_t is identical to size_t. If not, + then z_size_t is an unsigned integer type that can contain a pointer. + + gzfwrite() returns the number of full items written of size size, or zero + if there was an error. If the multiplication of size and nitems overflows, + i.e. the product does not fit in a z_size_t, then nothing is written, zero + is returned, and the error state is set to Z_STREAM_ERROR. +*/ + +ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...)); +/* + Converts, formats, and writes the arguments to the compressed file under + control of the format string, as in fprintf. gzprintf returns the number of + uncompressed bytes actually written, or a negative zlib error code in case + of error. The number of uncompressed bytes written is limited to 8191, or + one less than the buffer size given to gzbuffer(). The caller should assure + that this limit is not exceeded. If it is exceeded, then gzprintf() will + return an error (0) with nothing written. In this case, there may also be a + buffer overflow with unpredictable consequences, which is possible only if + zlib was compiled with the insecure functions sprintf() or vsprintf() + because the secure snprintf() or vsnprintf() functions were not available. + This can be determined using zlibCompileFlags(). +*/ + +ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); +/* + Writes the given null-terminated string to the compressed file, excluding + the terminating null character. + + gzputs returns the number of characters written, or -1 in case of error. +*/ + +ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); +/* + Reads bytes from the compressed file until len-1 characters are read, or a + newline character is read and transferred to buf, or an end-of-file + condition is encountered. If any characters are read or if len == 1, the + string is terminated with a null character. If no characters are read due + to an end-of-file or len < 1, then the buffer is left untouched. + + gzgets returns buf which is a null-terminated string, or it returns NULL + for end-of-file or in case of error. If there was an error, the contents at + buf are indeterminate. +*/ + +ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); +/* + Writes c, converted to an unsigned char, into the compressed file. gzputc + returns the value that was written, or -1 in case of error. +*/ + +ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); +/* + Reads one byte from the compressed file. gzgetc returns this byte or -1 + in case of end of file or error. This is implemented as a macro for speed. + As such, it does not do all of the checking the other functions do. I.e. + it does not check to see if file is NULL, nor whether the structure file + points to has been clobbered or not. +*/ + +ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); +/* + Push one character back onto the stream to be read as the first character + on the next read. At least one character of push-back is allowed. + gzungetc() returns the character pushed, or -1 on failure. gzungetc() will + fail if c is -1, and may fail if a character has been pushed but not read + yet. If gzungetc is used immediately after gzopen or gzdopen, at least the + output buffer size of pushed characters is allowed. (See gzbuffer above.) + The pushed character will be discarded if the stream is repositioned with + gzseek() or gzrewind(). +*/ + +ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); +/* + Flushes all pending output into the compressed file. The parameter flush + is as in the deflate() function. The return value is the zlib error number + (see function gzerror below). gzflush is only permitted when writing. + + If the flush parameter is Z_FINISH, the remaining data is written and the + gzip stream is completed in the output. If gzwrite() is called again, a new + gzip stream will be started in the output. gzread() is able to read such + concatenated gzip streams. + + gzflush should be called only when strictly necessary because it will + degrade compression if called too often. +*/ + +/* +ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, + z_off_t offset, int whence)); + + Sets the starting position for the next gzread or gzwrite on the given + compressed file. The offset represents a number of bytes in the + uncompressed data stream. The whence parameter is defined as in lseek(2); + the value SEEK_END is not supported. + + If the file is opened for reading, this function is emulated but can be + extremely slow. If the file is opened for writing, only forward seeks are + supported; gzseek then compresses a sequence of zeroes up to the new + starting position. + + gzseek returns the resulting offset location as measured in bytes from + the beginning of the uncompressed stream, or -1 in case of error, in + particular if the file is opened for writing and the new starting position + would be before the current position. +*/ + +ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); +/* + Rewinds the given file. This function is supported only for reading. + + gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) +*/ + +/* +ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); + + Returns the starting position for the next gzread or gzwrite on the given + compressed file. This position represents a number of bytes in the + uncompressed data stream, and is zero when starting, even if appending or + reading a gzip stream from the middle of a file using gzdopen(). + + gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) +*/ + +/* +ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file)); + + Returns the current offset in the file being read or written. This offset + includes the count of bytes that precede the gzip stream, for example when + appending or when using gzdopen() for reading. When reading, the offset + does not include as yet unused buffered input. This information can be used + for a progress indicator. On error, gzoffset() returns -1. +*/ + +ZEXTERN int ZEXPORT gzeof OF((gzFile file)); +/* + Returns true (1) if the end-of-file indicator has been set while reading, + false (0) otherwise. Note that the end-of-file indicator is set only if the + read tried to go past the end of the input, but came up short. Therefore, + just like feof(), gzeof() may return false even if there is no more data to + read, in the event that the last read request was for the exact number of + bytes remaining in the input file. This will happen if the input file size + is an exact multiple of the buffer size. + + If gzeof() returns true, then the read functions will return no more data, + unless the end-of-file indicator is reset by gzclearerr() and the input file + has grown since the previous end of file was detected. +*/ + +ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); +/* + Returns true (1) if file is being copied directly while reading, or false + (0) if file is a gzip stream being decompressed. + + If the input file is empty, gzdirect() will return true, since the input + does not contain a gzip stream. + + If gzdirect() is used immediately after gzopen() or gzdopen() it will + cause buffers to be allocated to allow reading the file to determine if it + is a gzip file. Therefore if gzbuffer() is used, it should be called before + gzdirect(). + + When writing, gzdirect() returns true (1) if transparent writing was + requested ("wT" for the gzopen() mode), or false (0) otherwise. (Note: + gzdirect() is not needed when writing. Transparent writing must be + explicitly requested, so the application already knows the answer. When + linking statically, using gzdirect() will include all of the zlib code for + gzip file reading and decompression, which may not be desired.) +*/ + +ZEXTERN int ZEXPORT gzclose OF((gzFile file)); +/* + Flushes all pending output if necessary, closes the compressed file and + deallocates the (de)compression state. Note that once file is closed, you + cannot call gzerror with file, since its structures have been deallocated. + gzclose must not be called more than once on the same file, just as free + must not be called more than once on the same allocation. + + gzclose will return Z_STREAM_ERROR if file is not valid, Z_ERRNO on a + file operation error, Z_MEM_ERROR if out of memory, Z_BUF_ERROR if the + last read ended in the middle of a gzip stream, or Z_OK on success. +*/ + +ZEXTERN int ZEXPORT gzclose_r OF((gzFile file)); +ZEXTERN int ZEXPORT gzclose_w OF((gzFile file)); +/* + Same as gzclose(), but gzclose_r() is only for use when reading, and + gzclose_w() is only for use when writing or appending. The advantage to + using these instead of gzclose() is that they avoid linking in zlib + compression or decompression code that is not used when only reading or only + writing respectively. If gzclose() is used, then both compression and + decompression code will be included the application when linking to a static + zlib library. +*/ + +ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); +/* + Returns the error message for the last error which occurred on the given + compressed file. errnum is set to zlib error number. If an error occurred + in the file system and not in the compression library, errnum is set to + Z_ERRNO and the application may consult errno to get the exact error code. + + The application must not modify the returned string. Future calls to + this function may invalidate the previously returned string. If file is + closed, then the string previously returned by gzerror will no longer be + available. + + gzerror() should be used to distinguish errors from end-of-file for those + functions above that do not distinguish those cases in their return values. +*/ + +ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); +/* + Clears the error and end-of-file flags for file. This is analogous to the + clearerr() function in stdio. This is useful for continuing to read a gzip + file that is being written concurrently. +*/ + +#endif /* !Z_SOLO */ + + /* checksum functions */ + +/* + These functions are not related to compression but are exported + anyway because they might be useful in applications using the compression + library. +*/ + +ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); +/* + Update a running Adler-32 checksum with the bytes buf[0..len-1] and + return the updated checksum. If buf is Z_NULL, this function returns the + required initial value for the checksum. + + An Adler-32 checksum is almost as reliable as a CRC-32 but can be computed + much faster. + + Usage example: + + uLong adler = adler32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + adler = adler32(adler, buffer, length); + } + if (adler != original_adler) error(); +*/ + +ZEXTERN uLong ZEXPORT adler32_z OF((uLong adler, const Bytef *buf, + z_size_t len)); +/* + Same as adler32(), but with a size_t length. +*/ + +/* +ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, + z_off_t len2)); + + Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 + and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for + each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of + seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. Note + that the z_off_t type (like off_t) is a signed integer. If len2 is + negative, the result has no meaning or utility. +*/ + +ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); +/* + Update a running CRC-32 with the bytes buf[0..len-1] and return the + updated CRC-32. If buf is Z_NULL, this function returns the required + initial value for the crc. Pre- and post-conditioning (one's complement) is + performed within this function so it shouldn't be done by the application. + + Usage example: + + uLong crc = crc32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + crc = crc32(crc, buffer, length); + } + if (crc != original_crc) error(); +*/ + +ZEXTERN uLong ZEXPORT crc32_z OF((uLong adler, const Bytef *buf, + z_size_t len)); +/* + Same as crc32(), but with a size_t length. +*/ + +/* +ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); + + Combine two CRC-32 check values into one. For two sequences of bytes, + seq1 and seq2 with lengths len1 and len2, CRC-32 check values were + calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 + check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and + len2. +*/ + + + /* various hacks, don't look :) */ + +/* deflateInit and inflateInit are macros to allow checking the zlib version + * and the compiler's view of z_stream: + */ +ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, + int windowBits, int memLevel, + int strategy, const char *version, + int stream_size)); +ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, + unsigned char FAR *window, + const char *version, + int stream_size)); +#ifdef Z_PREFIX_SET +# define z_deflateInit(strm, level) \ + deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream)) +# define z_inflateInit(strm) \ + inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream)) +# define z_deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ + deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ + (strategy), ZLIB_VERSION, (int)sizeof(z_stream)) +# define z_inflateInit2(strm, windowBits) \ + inflateInit2_((strm), (windowBits), ZLIB_VERSION, \ + (int)sizeof(z_stream)) +# define z_inflateBackInit(strm, windowBits, window) \ + inflateBackInit_((strm), (windowBits), (window), \ + ZLIB_VERSION, (int)sizeof(z_stream)) +#else +# define deflateInit(strm, level) \ + deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream)) +# define inflateInit(strm) \ + inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream)) +# define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ + deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ + (strategy), ZLIB_VERSION, (int)sizeof(z_stream)) +# define inflateInit2(strm, windowBits) \ + inflateInit2_((strm), (windowBits), ZLIB_VERSION, \ + (int)sizeof(z_stream)) +# define inflateBackInit(strm, windowBits, window) \ + inflateBackInit_((strm), (windowBits), (window), \ + ZLIB_VERSION, (int)sizeof(z_stream)) +#endif + +#ifndef Z_SOLO + +/* gzgetc() macro and its supporting function and exposed data structure. Note + * that the real internal state is much larger than the exposed structure. + * This abbreviated structure exposes just enough for the gzgetc() macro. The + * user should not mess with these exposed elements, since their names or + * behavior could change in the future, perhaps even capriciously. They can + * only be used by the gzgetc() macro. You have been warned. + */ +struct gzFile_s { + unsigned have; + unsigned char *next; + z_off64_t pos; +}; +ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ +#ifdef Z_PREFIX_SET +# undef z_gzgetc +# define z_gzgetc(g) \ + ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : (gzgetc)(g)) +#else +# define gzgetc(g) \ + ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : (gzgetc)(g)) +#endif + +/* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or + * change the regular functions to 64 bits if _FILE_OFFSET_BITS is 64 (if + * both are true, the application gets the *64 functions, and the regular + * functions are changed to 64 bits) -- in case these are set on systems + * without large file support, _LFS64_LARGEFILE must also be true + */ +#ifdef Z_LARGE64 + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); + ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t)); +#endif + +#if !defined(ZLIB_INTERNAL) && defined(Z_WANT64) +# ifdef Z_PREFIX_SET +# define z_gzopen z_gzopen64 +# define z_gzseek z_gzseek64 +# define z_gztell z_gztell64 +# define z_gzoffset z_gzoffset64 +# define z_adler32_combine z_adler32_combine64 +# define z_crc32_combine z_crc32_combine64 +# else +# define gzopen gzopen64 +# define gzseek gzseek64 +# define gztell gztell64 +# define gzoffset gzoffset64 +# define adler32_combine adler32_combine64 +# define crc32_combine crc32_combine64 +# endif +# ifndef Z_LARGE64 + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN z_off_t ZEXPORT gzseek64 OF((gzFile, z_off_t, int)); + ZEXTERN z_off_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN z_off_t ZEXPORT gzoffset64 OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); +# endif +#else + ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *)); + ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int)); + ZEXTERN z_off_t ZEXPORT gztell OF((gzFile)); + ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); +#endif + +#else /* Z_SOLO */ + + ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); + +#endif /* !Z_SOLO */ + +/* undocumented functions */ +ZEXTERN const char * ZEXPORT zError OF((int)); +ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp)); +ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table OF((void)); +ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int)); +ZEXTERN int ZEXPORT inflateValidate OF((z_streamp, int)); +ZEXTERN unsigned long ZEXPORT inflateCodesUsed OF ((z_streamp)); +ZEXTERN int ZEXPORT inflateResetKeep OF((z_streamp)); +ZEXTERN int ZEXPORT deflateResetKeep OF((z_streamp)); +#if (defined(_WIN32) || defined(__CYGWIN__)) && !defined(Z_SOLO) +ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path, + const char *mode)); +#endif +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifndef Z_SOLO +ZEXTERN int ZEXPORTVA gzvprintf Z_ARG((gzFile file, + const char *format, + va_list va)); +# endif +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* ZLIB_H */ diff --git a/hdssd/external/linux/zlib-1.2.11/zutil.h b/hdssd/external/linux/zlib-1.2.11/zutil.h new file mode 100644 index 0000000..b079ea6 --- /dev/null +++ b/hdssd/external/linux/zlib-1.2.11/zutil.h @@ -0,0 +1,271 @@ +/* zutil.h -- internal interface and configuration of the compression library + * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* @(#) $Id$ */ + +#ifndef ZUTIL_H +#define ZUTIL_H + +#ifdef HAVE_HIDDEN +# define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) +#else +# define ZLIB_INTERNAL +#endif + +#include "zlib.h" + +#if defined(STDC) && !defined(Z_SOLO) +# if !(defined(_WIN32_WCE) && defined(_MSC_VER)) +# include +# endif +# include +# include +#endif + +#ifdef Z_SOLO + typedef long ptrdiff_t; /* guess -- will be caught if guess is wrong */ +#endif + +#ifndef local +# define local static +#endif +/* since "static" is used to mean two completely different things in C, we + define "local" for the non-static meaning of "static", for readability + (compile with -Dlocal if your debugger can't find static symbols) */ + +typedef unsigned char uch; +typedef uch FAR uchf; +typedef unsigned short ush; +typedef ush FAR ushf; +typedef unsigned long ulg; + +extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ +/* (size given to avoid silly warnings with Visual C++) */ + +#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] + +#define ERR_RETURN(strm,err) \ + return (strm->msg = ERR_MSG(err), (err)) +/* To be used only when the state is known to be valid */ + + /* common constants */ + +#ifndef DEF_WBITS +# define DEF_WBITS MAX_WBITS +#endif +/* default windowBits for decompression. MAX_WBITS is for compression only */ + +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif +/* default memLevel */ + +#define STORED_BLOCK 0 +#define STATIC_TREES 1 +#define DYN_TREES 2 +/* The three kinds of block type */ + +#define MIN_MATCH 3 +#define MAX_MATCH 258 +/* The minimum and maximum match lengths */ + +#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ + + /* target dependencies */ + +#if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) +# define OS_CODE 0x00 +# ifndef Z_SOLO +# if defined(__TURBOC__) || defined(__BORLANDC__) +# if (__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) + /* Allow compilation with ANSI keywords only enabled */ + void _Cdecl farfree( void *block ); + void *_Cdecl farmalloc( unsigned long nbytes ); +# else +# include +# endif +# else /* MSC or DJGPP */ +# include +# endif +# endif +#endif + +#ifdef AMIGA +# define OS_CODE 1 +#endif + +#if defined(VAXC) || defined(VMS) +# define OS_CODE 2 +# define F_OPEN(name, mode) \ + fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") +#endif + +#ifdef __370__ +# if __TARGET_LIB__ < 0x20000000 +# define OS_CODE 4 +# elif __TARGET_LIB__ < 0x40000000 +# define OS_CODE 11 +# else +# define OS_CODE 8 +# endif +#endif + +#if defined(ATARI) || defined(atarist) +# define OS_CODE 5 +#endif + +#ifdef OS2 +# define OS_CODE 6 +# if defined(M_I86) && !defined(Z_SOLO) +# include +# endif +#endif + +#if defined(MACOS) || defined(TARGET_OS_MAC) +# define OS_CODE 7 +# ifndef Z_SOLO +# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os +# include /* for fdopen */ +# else +# ifndef fdopen +# define fdopen(fd,mode) NULL /* No fdopen() */ +# endif +# endif +# endif +#endif + +#ifdef __acorn +# define OS_CODE 13 +#endif + +#if defined(WIN32) && !defined(__CYGWIN__) +# define OS_CODE 10 +#endif + +#ifdef _BEOS_ +# define OS_CODE 16 +#endif + +#ifdef __TOS_OS400__ +# define OS_CODE 18 +#endif + +#ifdef __APPLE__ +# define OS_CODE 19 +#endif + +#if defined(_BEOS_) || defined(RISCOS) +# define fdopen(fd,mode) NULL /* No fdopen() */ +#endif + +#if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX +# if defined(_WIN32_WCE) +# define fdopen(fd,mode) NULL /* No fdopen() */ +# ifndef _PTRDIFF_T_DEFINED + typedef int ptrdiff_t; +# define _PTRDIFF_T_DEFINED +# endif +# else +# define fdopen(fd,type) _fdopen(fd,type) +# endif +#endif + +#if defined(__BORLANDC__) && !defined(MSDOS) + #pragma warn -8004 + #pragma warn -8008 + #pragma warn -8066 +#endif + +/* provide prototypes for these when building zlib without LFS */ +#if !defined(_WIN32) && \ + (!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0) + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); +#endif + + /* common defaults */ + +#ifndef OS_CODE +# define OS_CODE 3 /* assume Unix */ +#endif + +#ifndef F_OPEN +# define F_OPEN(name, mode) fopen((name), (mode)) +#endif + + /* functions */ + +#if defined(pyr) || defined(Z_SOLO) +# define NO_MEMCPY +#endif +#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) + /* Use our own functions for small and medium model with MSC <= 5.0. + * You may have to use the same strategy for Borland C (untested). + * The __SC__ check is for Symantec. + */ +# define NO_MEMCPY +#endif +#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY) +# define HAVE_MEMCPY +#endif +#ifdef HAVE_MEMCPY +# ifdef SMALL_MEDIUM /* MSDOS small or medium model */ +# define zmemcpy _fmemcpy +# define zmemcmp _fmemcmp +# define zmemzero(dest, len) _fmemset(dest, 0, len) +# else +# define zmemcpy memcpy +# define zmemcmp memcmp +# define zmemzero(dest, len) memset(dest, 0, len) +# endif +#else + void ZLIB_INTERNAL zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); + int ZLIB_INTERNAL zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); + void ZLIB_INTERNAL zmemzero OF((Bytef* dest, uInt len)); +#endif + +/* Diagnostic functions */ +#ifdef ZLIB_DEBUG +# include + extern int ZLIB_INTERNAL z_verbose; + extern void ZLIB_INTERNAL z_error OF((char *m)); +# define Assert(cond,msg) {if(!(cond)) z_error(msg);} +# define Trace(x) {if (z_verbose>=0) fprintf x ;} +# define Tracev(x) {if (z_verbose>0) fprintf x ;} +# define Tracevv(x) {if (z_verbose>1) fprintf x ;} +# define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;} +# define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;} +#else +# define Assert(cond,msg) +# define Trace(x) +# define Tracev(x) +# define Tracevv(x) +# define Tracec(c,x) +# define Tracecv(c,x) +#endif + +#ifndef Z_SOLO + voidpf ZLIB_INTERNAL zcalloc OF((voidpf opaque, unsigned items, + unsigned size)); + void ZLIB_INTERNAL zcfree OF((voidpf opaque, voidpf ptr)); +#endif + +#define ZALLOC(strm, items, size) \ + (*((strm)->zalloc))((strm)->opaque, (items), (size)) +#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) +#define TRY_FREE(s, p) {if (p) ZFREE(s, p);} + +/* Reverse the bytes in a 32-bit value */ +#define ZSWAP32(q) ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ + (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) + +#endif /* ZUTIL_H */ diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/aes.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/aes.h new file mode 100644 index 0000000..faa66c4 --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/aes.h @@ -0,0 +1,149 @@ +/* crypto/aes/aes.h */ +/* ==================================================================== + * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + */ + +#ifndef HEADER_AES_H +# define HEADER_AES_H + +# include + +# ifdef OPENSSL_NO_AES +# error AES is disabled. +# endif + +# include + +# define AES_ENCRYPT 1 +# define AES_DECRYPT 0 + +/* + * Because array size can't be a const in C, the following two are macros. + * Both sizes are in bytes. + */ +# define AES_MAXNR 14 +# define AES_BLOCK_SIZE 16 + +#ifdef __cplusplus +extern "C" { +#endif + +/* This should be a hidden type, but EVP requires that the size be known */ +struct aes_key_st { +# ifdef AES_LONG + unsigned long rd_key[4 * (AES_MAXNR + 1)]; +# else + unsigned int rd_key[4 * (AES_MAXNR + 1)]; +# endif + int rounds; +}; +typedef struct aes_key_st AES_KEY; + +const char *AES_options(void); + +int AES_set_encrypt_key(const unsigned char *userKey, const int bits, + AES_KEY *key); +int AES_set_decrypt_key(const unsigned char *userKey, const int bits, + AES_KEY *key); + +int private_AES_set_encrypt_key(const unsigned char *userKey, const int bits, + AES_KEY *key); +int private_AES_set_decrypt_key(const unsigned char *userKey, const int bits, + AES_KEY *key); + +void AES_encrypt(const unsigned char *in, unsigned char *out, + const AES_KEY *key); +void AES_decrypt(const unsigned char *in, unsigned char *out, + const AES_KEY *key); + +void AES_ecb_encrypt(const unsigned char *in, unsigned char *out, + const AES_KEY *key, const int enc); +void AES_cbc_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const AES_KEY *key, + unsigned char *ivec, const int enc); +void AES_cfb128_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const AES_KEY *key, + unsigned char *ivec, int *num, const int enc); +void AES_cfb1_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const AES_KEY *key, + unsigned char *ivec, int *num, const int enc); +void AES_cfb8_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const AES_KEY *key, + unsigned char *ivec, int *num, const int enc); +void AES_ofb128_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const AES_KEY *key, + unsigned char *ivec, int *num); +void AES_ctr128_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const AES_KEY *key, + unsigned char ivec[AES_BLOCK_SIZE], + unsigned char ecount_buf[AES_BLOCK_SIZE], + unsigned int *num); +/* NB: the IV is _two_ blocks long */ +void AES_ige_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const AES_KEY *key, + unsigned char *ivec, const int enc); +/* NB: the IV is _four_ blocks long */ +void AES_bi_ige_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const AES_KEY *key, + const AES_KEY *key2, const unsigned char *ivec, + const int enc); + +int AES_wrap_key(AES_KEY *key, const unsigned char *iv, + unsigned char *out, + const unsigned char *in, unsigned int inlen); +int AES_unwrap_key(AES_KEY *key, const unsigned char *iv, + unsigned char *out, + const unsigned char *in, unsigned int inlen); + + +#ifdef __cplusplus +} +#endif + +#endif /* !HEADER_AES_H */ diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/asn1.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/asn1.h new file mode 100644 index 0000000..68e791f --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/asn1.h @@ -0,0 +1,1419 @@ +/* crypto/asn1/asn1.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_ASN1_H +# define HEADER_ASN1_H + +# include +# include +# ifndef OPENSSL_NO_BIO +# include +# endif +# include +# include + +# include + +# include +# ifndef OPENSSL_NO_DEPRECATED +# include +# endif + +# ifdef OPENSSL_BUILD_SHLIBCRYPTO +# undef OPENSSL_EXTERN +# define OPENSSL_EXTERN OPENSSL_EXPORT +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +# define V_ASN1_UNIVERSAL 0x00 +# define V_ASN1_APPLICATION 0x40 +# define V_ASN1_CONTEXT_SPECIFIC 0x80 +# define V_ASN1_PRIVATE 0xc0 + +# define V_ASN1_CONSTRUCTED 0x20 +# define V_ASN1_PRIMITIVE_TAG 0x1f +# define V_ASN1_PRIMATIVE_TAG 0x1f + +# define V_ASN1_APP_CHOOSE -2/* let the recipient choose */ +# define V_ASN1_OTHER -3/* used in ASN1_TYPE */ +# define V_ASN1_ANY -4/* used in ASN1 template code */ + +# define V_ASN1_NEG 0x100/* negative flag */ + +# define V_ASN1_UNDEF -1 +# define V_ASN1_EOC 0 +# define V_ASN1_BOOLEAN 1 /**/ +# define V_ASN1_INTEGER 2 +# define V_ASN1_NEG_INTEGER (2 | V_ASN1_NEG) +# define V_ASN1_BIT_STRING 3 +# define V_ASN1_OCTET_STRING 4 +# define V_ASN1_NULL 5 +# define V_ASN1_OBJECT 6 +# define V_ASN1_OBJECT_DESCRIPTOR 7 +# define V_ASN1_EXTERNAL 8 +# define V_ASN1_REAL 9 +# define V_ASN1_ENUMERATED 10 +# define V_ASN1_NEG_ENUMERATED (10 | V_ASN1_NEG) +# define V_ASN1_UTF8STRING 12 +# define V_ASN1_SEQUENCE 16 +# define V_ASN1_SET 17 +# define V_ASN1_NUMERICSTRING 18 /**/ +# define V_ASN1_PRINTABLESTRING 19 +# define V_ASN1_T61STRING 20 +# define V_ASN1_TELETEXSTRING 20/* alias */ +# define V_ASN1_VIDEOTEXSTRING 21 /**/ +# define V_ASN1_IA5STRING 22 +# define V_ASN1_UTCTIME 23 +# define V_ASN1_GENERALIZEDTIME 24 /**/ +# define V_ASN1_GRAPHICSTRING 25 /**/ +# define V_ASN1_ISO64STRING 26 /**/ +# define V_ASN1_VISIBLESTRING 26/* alias */ +# define V_ASN1_GENERALSTRING 27 /**/ +# define V_ASN1_UNIVERSALSTRING 28 /**/ +# define V_ASN1_BMPSTRING 30 +/* For use with d2i_ASN1_type_bytes() */ +# define B_ASN1_NUMERICSTRING 0x0001 +# define B_ASN1_PRINTABLESTRING 0x0002 +# define B_ASN1_T61STRING 0x0004 +# define B_ASN1_TELETEXSTRING 0x0004 +# define B_ASN1_VIDEOTEXSTRING 0x0008 +# define B_ASN1_IA5STRING 0x0010 +# define B_ASN1_GRAPHICSTRING 0x0020 +# define B_ASN1_ISO64STRING 0x0040 +# define B_ASN1_VISIBLESTRING 0x0040 +# define B_ASN1_GENERALSTRING 0x0080 +# define B_ASN1_UNIVERSALSTRING 0x0100 +# define B_ASN1_OCTET_STRING 0x0200 +# define B_ASN1_BIT_STRING 0x0400 +# define B_ASN1_BMPSTRING 0x0800 +# define B_ASN1_UNKNOWN 0x1000 +# define B_ASN1_UTF8STRING 0x2000 +# define B_ASN1_UTCTIME 0x4000 +# define B_ASN1_GENERALIZEDTIME 0x8000 +# define B_ASN1_SEQUENCE 0x10000 +/* For use with ASN1_mbstring_copy() */ +# define MBSTRING_FLAG 0x1000 +# define MBSTRING_UTF8 (MBSTRING_FLAG) +# define MBSTRING_ASC (MBSTRING_FLAG|1) +# define MBSTRING_BMP (MBSTRING_FLAG|2) +# define MBSTRING_UNIV (MBSTRING_FLAG|4) +# define SMIME_OLDMIME 0x400 +# define SMIME_CRLFEOL 0x800 +# define SMIME_STREAM 0x1000 + struct X509_algor_st; +DECLARE_STACK_OF(X509_ALGOR) + +# define DECLARE_ASN1_SET_OF(type)/* filled in by mkstack.pl */ +# define IMPLEMENT_ASN1_SET_OF(type)/* nothing, no longer needed */ + +/* + * We MUST make sure that, except for constness, asn1_ctx_st and + * asn1_const_ctx are exactly the same. Fortunately, as soon as the old ASN1 + * parsing macros are gone, we can throw this away as well... + */ +typedef struct asn1_ctx_st { + unsigned char *p; /* work char pointer */ + int eos; /* end of sequence read for indefinite + * encoding */ + int error; /* error code to use when returning an error */ + int inf; /* constructed if 0x20, indefinite is 0x21 */ + int tag; /* tag from last 'get object' */ + int xclass; /* class from last 'get object' */ + long slen; /* length of last 'get object' */ + unsigned char *max; /* largest value of p allowed */ + unsigned char *q; /* temporary variable */ + unsigned char **pp; /* variable */ + int line; /* used in error processing */ +} ASN1_CTX; + +typedef struct asn1_const_ctx_st { + const unsigned char *p; /* work char pointer */ + int eos; /* end of sequence read for indefinite + * encoding */ + int error; /* error code to use when returning an error */ + int inf; /* constructed if 0x20, indefinite is 0x21 */ + int tag; /* tag from last 'get object' */ + int xclass; /* class from last 'get object' */ + long slen; /* length of last 'get object' */ + const unsigned char *max; /* largest value of p allowed */ + const unsigned char *q; /* temporary variable */ + const unsigned char **pp; /* variable */ + int line; /* used in error processing */ +} ASN1_const_CTX; + +/* + * These are used internally in the ASN1_OBJECT to keep track of whether the + * names and data need to be free()ed + */ +# define ASN1_OBJECT_FLAG_DYNAMIC 0x01/* internal use */ +# define ASN1_OBJECT_FLAG_CRITICAL 0x02/* critical x509v3 object id */ +# define ASN1_OBJECT_FLAG_DYNAMIC_STRINGS 0x04/* internal use */ +# define ASN1_OBJECT_FLAG_DYNAMIC_DATA 0x08/* internal use */ +struct asn1_object_st { + const char *sn, *ln; + int nid; + int length; + const unsigned char *data; /* data remains const after init */ + int flags; /* Should we free this one */ +}; + +# define ASN1_STRING_FLAG_BITS_LEFT 0x08/* Set if 0x07 has bits left value */ +/* + * This indicates that the ASN1_STRING is not a real value but just a place + * holder for the location where indefinite length constructed data should be + * inserted in the memory buffer + */ +# define ASN1_STRING_FLAG_NDEF 0x010 + +/* + * This flag is used by the CMS code to indicate that a string is not + * complete and is a place holder for content when it had all been accessed. + * The flag will be reset when content has been written to it. + */ + +# define ASN1_STRING_FLAG_CONT 0x020 +/* + * This flag is used by ASN1 code to indicate an ASN1_STRING is an MSTRING + * type. + */ +# define ASN1_STRING_FLAG_MSTRING 0x040 +/* This is the base type that holds just about everything :-) */ +struct asn1_string_st { + int length; + int type; + unsigned char *data; + /* + * The value of the following field depends on the type being held. It + * is mostly being used for BIT_STRING so if the input data has a + * non-zero 'unused bits' value, it will be handled correctly + */ + long flags; +}; + +/* + * ASN1_ENCODING structure: this is used to save the received encoding of an + * ASN1 type. This is useful to get round problems with invalid encodings + * which can break signatures. + */ + +typedef struct ASN1_ENCODING_st { + unsigned char *enc; /* DER encoding */ + long len; /* Length of encoding */ + int modified; /* set to 1 if 'enc' is invalid */ +} ASN1_ENCODING; + +/* Used with ASN1 LONG type: if a long is set to this it is omitted */ +# define ASN1_LONG_UNDEF 0x7fffffffL + +# define STABLE_FLAGS_MALLOC 0x01 +# define STABLE_NO_MASK 0x02 +# define DIRSTRING_TYPE \ + (B_ASN1_PRINTABLESTRING|B_ASN1_T61STRING|B_ASN1_BMPSTRING|B_ASN1_UTF8STRING) +# define PKCS9STRING_TYPE (DIRSTRING_TYPE|B_ASN1_IA5STRING) + +typedef struct asn1_string_table_st { + int nid; + long minsize; + long maxsize; + unsigned long mask; + unsigned long flags; +} ASN1_STRING_TABLE; + +DECLARE_STACK_OF(ASN1_STRING_TABLE) + +/* size limits: this stuff is taken straight from RFC2459 */ + +# define ub_name 32768 +# define ub_common_name 64 +# define ub_locality_name 128 +# define ub_state_name 128 +# define ub_organization_name 64 +# define ub_organization_unit_name 64 +# define ub_title 64 +# define ub_email_address 128 + +/* + * Declarations for template structures: for full definitions see asn1t.h + */ +typedef struct ASN1_TEMPLATE_st ASN1_TEMPLATE; +typedef struct ASN1_TLC_st ASN1_TLC; +/* This is just an opaque pointer */ +typedef struct ASN1_VALUE_st ASN1_VALUE; + +/* Declare ASN1 functions: the implement macro in in asn1t.h */ + +# define DECLARE_ASN1_FUNCTIONS(type) DECLARE_ASN1_FUNCTIONS_name(type, type) + +# define DECLARE_ASN1_ALLOC_FUNCTIONS(type) \ + DECLARE_ASN1_ALLOC_FUNCTIONS_name(type, type) + +# define DECLARE_ASN1_FUNCTIONS_name(type, name) \ + DECLARE_ASN1_ALLOC_FUNCTIONS_name(type, name) \ + DECLARE_ASN1_ENCODE_FUNCTIONS(type, name, name) + +# define DECLARE_ASN1_FUNCTIONS_fname(type, itname, name) \ + DECLARE_ASN1_ALLOC_FUNCTIONS_name(type, name) \ + DECLARE_ASN1_ENCODE_FUNCTIONS(type, itname, name) + +# define DECLARE_ASN1_ENCODE_FUNCTIONS(type, itname, name) \ + type *d2i_##name(type **a, const unsigned char **in, long len); \ + int i2d_##name(type *a, unsigned char **out); \ + DECLARE_ASN1_ITEM(itname) + +# define DECLARE_ASN1_ENCODE_FUNCTIONS_const(type, name) \ + type *d2i_##name(type **a, const unsigned char **in, long len); \ + int i2d_##name(const type *a, unsigned char **out); \ + DECLARE_ASN1_ITEM(name) + +# define DECLARE_ASN1_NDEF_FUNCTION(name) \ + int i2d_##name##_NDEF(name *a, unsigned char **out); + +# define DECLARE_ASN1_FUNCTIONS_const(name) \ + DECLARE_ASN1_ALLOC_FUNCTIONS(name) \ + DECLARE_ASN1_ENCODE_FUNCTIONS_const(name, name) + +# define DECLARE_ASN1_ALLOC_FUNCTIONS_name(type, name) \ + type *name##_new(void); \ + void name##_free(type *a); + +# define DECLARE_ASN1_PRINT_FUNCTION(stname) \ + DECLARE_ASN1_PRINT_FUNCTION_fname(stname, stname) + +# define DECLARE_ASN1_PRINT_FUNCTION_fname(stname, fname) \ + int fname##_print_ctx(BIO *out, stname *x, int indent, \ + const ASN1_PCTX *pctx); + +# define D2I_OF(type) type *(*)(type **,const unsigned char **,long) +# define I2D_OF(type) int (*)(type *,unsigned char **) +# define I2D_OF_const(type) int (*)(const type *,unsigned char **) + +# define CHECKED_D2I_OF(type, d2i) \ + ((d2i_of_void*) (1 ? d2i : ((D2I_OF(type))0))) +# define CHECKED_I2D_OF(type, i2d) \ + ((i2d_of_void*) (1 ? i2d : ((I2D_OF(type))0))) +# define CHECKED_NEW_OF(type, xnew) \ + ((void *(*)(void)) (1 ? xnew : ((type *(*)(void))0))) +# define CHECKED_PTR_OF(type, p) \ + ((void*) (1 ? p : (type*)0)) +# define CHECKED_PPTR_OF(type, p) \ + ((void**) (1 ? p : (type**)0)) + +# define TYPEDEF_D2I_OF(type) typedef type *d2i_of_##type(type **,const unsigned char **,long) +# define TYPEDEF_I2D_OF(type) typedef int i2d_of_##type(type *,unsigned char **) +# define TYPEDEF_D2I2D_OF(type) TYPEDEF_D2I_OF(type); TYPEDEF_I2D_OF(type) + +TYPEDEF_D2I2D_OF(void); + +/*- + * The following macros and typedefs allow an ASN1_ITEM + * to be embedded in a structure and referenced. Since + * the ASN1_ITEM pointers need to be globally accessible + * (possibly from shared libraries) they may exist in + * different forms. On platforms that support it the + * ASN1_ITEM structure itself will be globally exported. + * Other platforms will export a function that returns + * an ASN1_ITEM pointer. + * + * To handle both cases transparently the macros below + * should be used instead of hard coding an ASN1_ITEM + * pointer in a structure. + * + * The structure will look like this: + * + * typedef struct SOMETHING_st { + * ... + * ASN1_ITEM_EXP *iptr; + * ... + * } SOMETHING; + * + * It would be initialised as e.g.: + * + * SOMETHING somevar = {...,ASN1_ITEM_ref(X509),...}; + * + * and the actual pointer extracted with: + * + * const ASN1_ITEM *it = ASN1_ITEM_ptr(somevar.iptr); + * + * Finally an ASN1_ITEM pointer can be extracted from an + * appropriate reference with: ASN1_ITEM_rptr(X509). This + * would be used when a function takes an ASN1_ITEM * argument. + * + */ + +# ifndef OPENSSL_EXPORT_VAR_AS_FUNCTION + +/* ASN1_ITEM pointer exported type */ +typedef const ASN1_ITEM ASN1_ITEM_EXP; + +/* Macro to obtain ASN1_ITEM pointer from exported type */ +# define ASN1_ITEM_ptr(iptr) (iptr) + +/* Macro to include ASN1_ITEM pointer from base type */ +# define ASN1_ITEM_ref(iptr) (&(iptr##_it)) + +# define ASN1_ITEM_rptr(ref) (&(ref##_it)) + +# define DECLARE_ASN1_ITEM(name) \ + OPENSSL_EXTERN const ASN1_ITEM name##_it; + +# else + +/* + * Platforms that can't easily handle shared global variables are declared as + * functions returning ASN1_ITEM pointers. + */ + +/* ASN1_ITEM pointer exported type */ +typedef const ASN1_ITEM *ASN1_ITEM_EXP (void); + +/* Macro to obtain ASN1_ITEM pointer from exported type */ +# define ASN1_ITEM_ptr(iptr) (iptr()) + +/* Macro to include ASN1_ITEM pointer from base type */ +# define ASN1_ITEM_ref(iptr) (iptr##_it) + +# define ASN1_ITEM_rptr(ref) (ref##_it()) + +# define DECLARE_ASN1_ITEM(name) \ + const ASN1_ITEM * name##_it(void); + +# endif + +/* Parameters used by ASN1_STRING_print_ex() */ + +/* + * These determine which characters to escape: RFC2253 special characters, + * control characters and MSB set characters + */ + +# define ASN1_STRFLGS_ESC_2253 1 +# define ASN1_STRFLGS_ESC_CTRL 2 +# define ASN1_STRFLGS_ESC_MSB 4 + +/* + * This flag determines how we do escaping: normally RC2253 backslash only, + * set this to use backslash and quote. + */ + +# define ASN1_STRFLGS_ESC_QUOTE 8 + +/* These three flags are internal use only. */ + +/* Character is a valid PrintableString character */ +# define CHARTYPE_PRINTABLESTRING 0x10 +/* Character needs escaping if it is the first character */ +# define CHARTYPE_FIRST_ESC_2253 0x20 +/* Character needs escaping if it is the last character */ +# define CHARTYPE_LAST_ESC_2253 0x40 + +/* + * NB the internal flags are safely reused below by flags handled at the top + * level. + */ + +/* + * If this is set we convert all character strings to UTF8 first + */ + +# define ASN1_STRFLGS_UTF8_CONVERT 0x10 + +/* + * If this is set we don't attempt to interpret content: just assume all + * strings are 1 byte per character. This will produce some pretty odd + * looking output! + */ + +# define ASN1_STRFLGS_IGNORE_TYPE 0x20 + +/* If this is set we include the string type in the output */ +# define ASN1_STRFLGS_SHOW_TYPE 0x40 + +/* + * This determines which strings to display and which to 'dump' (hex dump of + * content octets or DER encoding). We can only dump non character strings or + * everything. If we don't dump 'unknown' they are interpreted as character + * strings with 1 octet per character and are subject to the usual escaping + * options. + */ + +# define ASN1_STRFLGS_DUMP_ALL 0x80 +# define ASN1_STRFLGS_DUMP_UNKNOWN 0x100 + +/* + * These determine what 'dumping' does, we can dump the content octets or the + * DER encoding: both use the RFC2253 #XXXXX notation. + */ + +# define ASN1_STRFLGS_DUMP_DER 0x200 + +/* + * All the string flags consistent with RFC2253, escaping control characters + * isn't essential in RFC2253 but it is advisable anyway. + */ + +# define ASN1_STRFLGS_RFC2253 (ASN1_STRFLGS_ESC_2253 | \ + ASN1_STRFLGS_ESC_CTRL | \ + ASN1_STRFLGS_ESC_MSB | \ + ASN1_STRFLGS_UTF8_CONVERT | \ + ASN1_STRFLGS_DUMP_UNKNOWN | \ + ASN1_STRFLGS_DUMP_DER) + +DECLARE_STACK_OF(ASN1_INTEGER) +DECLARE_ASN1_SET_OF(ASN1_INTEGER) + +DECLARE_STACK_OF(ASN1_GENERALSTRING) + +typedef struct asn1_type_st { + int type; + union { + char *ptr; + ASN1_BOOLEAN boolean; + ASN1_STRING *asn1_string; + ASN1_OBJECT *object; + ASN1_INTEGER *integer; + ASN1_ENUMERATED *enumerated; + ASN1_BIT_STRING *bit_string; + ASN1_OCTET_STRING *octet_string; + ASN1_PRINTABLESTRING *printablestring; + ASN1_T61STRING *t61string; + ASN1_IA5STRING *ia5string; + ASN1_GENERALSTRING *generalstring; + ASN1_BMPSTRING *bmpstring; + ASN1_UNIVERSALSTRING *universalstring; + ASN1_UTCTIME *utctime; + ASN1_GENERALIZEDTIME *generalizedtime; + ASN1_VISIBLESTRING *visiblestring; + ASN1_UTF8STRING *utf8string; + /* + * set and sequence are left complete and still contain the set or + * sequence bytes + */ + ASN1_STRING *set; + ASN1_STRING *sequence; + ASN1_VALUE *asn1_value; + } value; +} ASN1_TYPE; + +DECLARE_STACK_OF(ASN1_TYPE) +DECLARE_ASN1_SET_OF(ASN1_TYPE) + +typedef STACK_OF(ASN1_TYPE) ASN1_SEQUENCE_ANY; + +DECLARE_ASN1_ENCODE_FUNCTIONS_const(ASN1_SEQUENCE_ANY, ASN1_SEQUENCE_ANY) +DECLARE_ASN1_ENCODE_FUNCTIONS_const(ASN1_SEQUENCE_ANY, ASN1_SET_ANY) + +typedef struct NETSCAPE_X509_st { + ASN1_OCTET_STRING *header; + X509 *cert; +} NETSCAPE_X509; + +/* This is used to contain a list of bit names */ +typedef struct BIT_STRING_BITNAME_st { + int bitnum; + const char *lname; + const char *sname; +} BIT_STRING_BITNAME; + +# define M_ASN1_STRING_length(x) ((x)->length) +# define M_ASN1_STRING_length_set(x, n) ((x)->length = (n)) +# define M_ASN1_STRING_type(x) ((x)->type) +# define M_ASN1_STRING_data(x) ((x)->data) + +/* Macros for string operations */ +# define M_ASN1_BIT_STRING_new() (ASN1_BIT_STRING *)\ + ASN1_STRING_type_new(V_ASN1_BIT_STRING) +# define M_ASN1_BIT_STRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_ASN1_BIT_STRING_dup(a) (ASN1_BIT_STRING *)\ + ASN1_STRING_dup((const ASN1_STRING *)a) +# define M_ASN1_BIT_STRING_cmp(a,b) ASN1_STRING_cmp(\ + (const ASN1_STRING *)a,(const ASN1_STRING *)b) +# define M_ASN1_BIT_STRING_set(a,b,c) ASN1_STRING_set((ASN1_STRING *)a,b,c) + +# define M_ASN1_INTEGER_new() (ASN1_INTEGER *)\ + ASN1_STRING_type_new(V_ASN1_INTEGER) +# define M_ASN1_INTEGER_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_ASN1_INTEGER_dup(a) (ASN1_INTEGER *)\ + ASN1_STRING_dup((const ASN1_STRING *)a) +# define M_ASN1_INTEGER_cmp(a,b) ASN1_STRING_cmp(\ + (const ASN1_STRING *)a,(const ASN1_STRING *)b) + +# define M_ASN1_ENUMERATED_new() (ASN1_ENUMERATED *)\ + ASN1_STRING_type_new(V_ASN1_ENUMERATED) +# define M_ASN1_ENUMERATED_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_ASN1_ENUMERATED_dup(a) (ASN1_ENUMERATED *)\ + ASN1_STRING_dup((const ASN1_STRING *)a) +# define M_ASN1_ENUMERATED_cmp(a,b) ASN1_STRING_cmp(\ + (const ASN1_STRING *)a,(const ASN1_STRING *)b) + +# define M_ASN1_OCTET_STRING_new() (ASN1_OCTET_STRING *)\ + ASN1_STRING_type_new(V_ASN1_OCTET_STRING) +# define M_ASN1_OCTET_STRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_ASN1_OCTET_STRING_dup(a) (ASN1_OCTET_STRING *)\ + ASN1_STRING_dup((const ASN1_STRING *)a) +# define M_ASN1_OCTET_STRING_cmp(a,b) ASN1_STRING_cmp(\ + (const ASN1_STRING *)a,(const ASN1_STRING *)b) +# define M_ASN1_OCTET_STRING_set(a,b,c) ASN1_STRING_set((ASN1_STRING *)a,b,c) +# define M_ASN1_OCTET_STRING_print(a,b) ASN1_STRING_print(a,(ASN1_STRING *)b) +# define M_i2d_ASN1_OCTET_STRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_OCTET_STRING,\ + V_ASN1_UNIVERSAL) + +# define B_ASN1_TIME \ + B_ASN1_UTCTIME | \ + B_ASN1_GENERALIZEDTIME + +# define B_ASN1_PRINTABLE \ + B_ASN1_NUMERICSTRING| \ + B_ASN1_PRINTABLESTRING| \ + B_ASN1_T61STRING| \ + B_ASN1_IA5STRING| \ + B_ASN1_BIT_STRING| \ + B_ASN1_UNIVERSALSTRING|\ + B_ASN1_BMPSTRING|\ + B_ASN1_UTF8STRING|\ + B_ASN1_SEQUENCE|\ + B_ASN1_UNKNOWN + +# define B_ASN1_DIRECTORYSTRING \ + B_ASN1_PRINTABLESTRING| \ + B_ASN1_TELETEXSTRING|\ + B_ASN1_BMPSTRING|\ + B_ASN1_UNIVERSALSTRING|\ + B_ASN1_UTF8STRING + +# define B_ASN1_DISPLAYTEXT \ + B_ASN1_IA5STRING| \ + B_ASN1_VISIBLESTRING| \ + B_ASN1_BMPSTRING|\ + B_ASN1_UTF8STRING + +# define M_ASN1_PRINTABLE_new() ASN1_STRING_type_new(V_ASN1_T61STRING) +# define M_ASN1_PRINTABLE_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_i2d_ASN1_PRINTABLE(a,pp) i2d_ASN1_bytes((ASN1_STRING *)a,\ + pp,a->type,V_ASN1_UNIVERSAL) +# define M_d2i_ASN1_PRINTABLE(a,pp,l) \ + d2i_ASN1_type_bytes((ASN1_STRING **)a,pp,l, \ + B_ASN1_PRINTABLE) + +# define M_DIRECTORYSTRING_new() ASN1_STRING_type_new(V_ASN1_PRINTABLESTRING) +# define M_DIRECTORYSTRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_i2d_DIRECTORYSTRING(a,pp) i2d_ASN1_bytes((ASN1_STRING *)a,\ + pp,a->type,V_ASN1_UNIVERSAL) +# define M_d2i_DIRECTORYSTRING(a,pp,l) \ + d2i_ASN1_type_bytes((ASN1_STRING **)a,pp,l, \ + B_ASN1_DIRECTORYSTRING) + +# define M_DISPLAYTEXT_new() ASN1_STRING_type_new(V_ASN1_VISIBLESTRING) +# define M_DISPLAYTEXT_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_i2d_DISPLAYTEXT(a,pp) i2d_ASN1_bytes((ASN1_STRING *)a,\ + pp,a->type,V_ASN1_UNIVERSAL) +# define M_d2i_DISPLAYTEXT(a,pp,l) \ + d2i_ASN1_type_bytes((ASN1_STRING **)a,pp,l, \ + B_ASN1_DISPLAYTEXT) + +# define M_ASN1_PRINTABLESTRING_new() (ASN1_PRINTABLESTRING *)\ + ASN1_STRING_type_new(V_ASN1_PRINTABLESTRING) +# define M_ASN1_PRINTABLESTRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_i2d_ASN1_PRINTABLESTRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_PRINTABLESTRING,\ + V_ASN1_UNIVERSAL) +# define M_d2i_ASN1_PRINTABLESTRING(a,pp,l) \ + (ASN1_PRINTABLESTRING *)d2i_ASN1_type_bytes\ + ((ASN1_STRING **)a,pp,l,B_ASN1_PRINTABLESTRING) + +# define M_ASN1_T61STRING_new() (ASN1_T61STRING *)\ + ASN1_STRING_type_new(V_ASN1_T61STRING) +# define M_ASN1_T61STRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_i2d_ASN1_T61STRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_T61STRING,\ + V_ASN1_UNIVERSAL) +# define M_d2i_ASN1_T61STRING(a,pp,l) \ + (ASN1_T61STRING *)d2i_ASN1_type_bytes\ + ((ASN1_STRING **)a,pp,l,B_ASN1_T61STRING) + +# define M_ASN1_IA5STRING_new() (ASN1_IA5STRING *)\ + ASN1_STRING_type_new(V_ASN1_IA5STRING) +# define M_ASN1_IA5STRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_ASN1_IA5STRING_dup(a) \ + (ASN1_IA5STRING *)ASN1_STRING_dup((const ASN1_STRING *)a) +# define M_i2d_ASN1_IA5STRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_IA5STRING,\ + V_ASN1_UNIVERSAL) +# define M_d2i_ASN1_IA5STRING(a,pp,l) \ + (ASN1_IA5STRING *)d2i_ASN1_type_bytes((ASN1_STRING **)a,pp,l,\ + B_ASN1_IA5STRING) + +# define M_ASN1_UTCTIME_new() (ASN1_UTCTIME *)\ + ASN1_STRING_type_new(V_ASN1_UTCTIME) +# define M_ASN1_UTCTIME_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_ASN1_UTCTIME_dup(a) (ASN1_UTCTIME *)\ + ASN1_STRING_dup((const ASN1_STRING *)a) + +# define M_ASN1_GENERALIZEDTIME_new() (ASN1_GENERALIZEDTIME *)\ + ASN1_STRING_type_new(V_ASN1_GENERALIZEDTIME) +# define M_ASN1_GENERALIZEDTIME_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_ASN1_GENERALIZEDTIME_dup(a) (ASN1_GENERALIZEDTIME *)ASN1_STRING_dup(\ + (const ASN1_STRING *)a) + +# define M_ASN1_TIME_new() (ASN1_TIME *)\ + ASN1_STRING_type_new(V_ASN1_UTCTIME) +# define M_ASN1_TIME_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_ASN1_TIME_dup(a) (ASN1_TIME *)\ + ASN1_STRING_dup((const ASN1_STRING *)a) + +# define M_ASN1_GENERALSTRING_new() (ASN1_GENERALSTRING *)\ + ASN1_STRING_type_new(V_ASN1_GENERALSTRING) +# define M_ASN1_GENERALSTRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_i2d_ASN1_GENERALSTRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_GENERALSTRING,\ + V_ASN1_UNIVERSAL) +# define M_d2i_ASN1_GENERALSTRING(a,pp,l) \ + (ASN1_GENERALSTRING *)d2i_ASN1_type_bytes\ + ((ASN1_STRING **)a,pp,l,B_ASN1_GENERALSTRING) + +# define M_ASN1_UNIVERSALSTRING_new() (ASN1_UNIVERSALSTRING *)\ + ASN1_STRING_type_new(V_ASN1_UNIVERSALSTRING) +# define M_ASN1_UNIVERSALSTRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_i2d_ASN1_UNIVERSALSTRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_UNIVERSALSTRING,\ + V_ASN1_UNIVERSAL) +# define M_d2i_ASN1_UNIVERSALSTRING(a,pp,l) \ + (ASN1_UNIVERSALSTRING *)d2i_ASN1_type_bytes\ + ((ASN1_STRING **)a,pp,l,B_ASN1_UNIVERSALSTRING) + +# define M_ASN1_BMPSTRING_new() (ASN1_BMPSTRING *)\ + ASN1_STRING_type_new(V_ASN1_BMPSTRING) +# define M_ASN1_BMPSTRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_i2d_ASN1_BMPSTRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_BMPSTRING,\ + V_ASN1_UNIVERSAL) +# define M_d2i_ASN1_BMPSTRING(a,pp,l) \ + (ASN1_BMPSTRING *)d2i_ASN1_type_bytes\ + ((ASN1_STRING **)a,pp,l,B_ASN1_BMPSTRING) + +# define M_ASN1_VISIBLESTRING_new() (ASN1_VISIBLESTRING *)\ + ASN1_STRING_type_new(V_ASN1_VISIBLESTRING) +# define M_ASN1_VISIBLESTRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_i2d_ASN1_VISIBLESTRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_VISIBLESTRING,\ + V_ASN1_UNIVERSAL) +# define M_d2i_ASN1_VISIBLESTRING(a,pp,l) \ + (ASN1_VISIBLESTRING *)d2i_ASN1_type_bytes\ + ((ASN1_STRING **)a,pp,l,B_ASN1_VISIBLESTRING) + +# define M_ASN1_UTF8STRING_new() (ASN1_UTF8STRING *)\ + ASN1_STRING_type_new(V_ASN1_UTF8STRING) +# define M_ASN1_UTF8STRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_i2d_ASN1_UTF8STRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_UTF8STRING,\ + V_ASN1_UNIVERSAL) +# define M_d2i_ASN1_UTF8STRING(a,pp,l) \ + (ASN1_UTF8STRING *)d2i_ASN1_type_bytes\ + ((ASN1_STRING **)a,pp,l,B_ASN1_UTF8STRING) + + /* for the is_set parameter to i2d_ASN1_SET */ +# define IS_SEQUENCE 0 +# define IS_SET 1 + +DECLARE_ASN1_FUNCTIONS_fname(ASN1_TYPE, ASN1_ANY, ASN1_TYPE) + +int ASN1_TYPE_get(ASN1_TYPE *a); +void ASN1_TYPE_set(ASN1_TYPE *a, int type, void *value); +int ASN1_TYPE_set1(ASN1_TYPE *a, int type, const void *value); +int ASN1_TYPE_cmp(const ASN1_TYPE *a, const ASN1_TYPE *b); + +ASN1_OBJECT *ASN1_OBJECT_new(void); +void ASN1_OBJECT_free(ASN1_OBJECT *a); +int i2d_ASN1_OBJECT(ASN1_OBJECT *a, unsigned char **pp); +ASN1_OBJECT *c2i_ASN1_OBJECT(ASN1_OBJECT **a, const unsigned char **pp, + long length); +ASN1_OBJECT *d2i_ASN1_OBJECT(ASN1_OBJECT **a, const unsigned char **pp, + long length); + +DECLARE_ASN1_ITEM(ASN1_OBJECT) + +DECLARE_STACK_OF(ASN1_OBJECT) +DECLARE_ASN1_SET_OF(ASN1_OBJECT) + +ASN1_STRING *ASN1_STRING_new(void); +void ASN1_STRING_free(ASN1_STRING *a); +void ASN1_STRING_clear_free(ASN1_STRING *a); +int ASN1_STRING_copy(ASN1_STRING *dst, const ASN1_STRING *str); +ASN1_STRING *ASN1_STRING_dup(const ASN1_STRING *a); +ASN1_STRING *ASN1_STRING_type_new(int type); +int ASN1_STRING_cmp(const ASN1_STRING *a, const ASN1_STRING *b); + /* + * Since this is used to store all sorts of things, via macros, for now, + * make its data void * + */ +int ASN1_STRING_set(ASN1_STRING *str, const void *data, int len); +void ASN1_STRING_set0(ASN1_STRING *str, void *data, int len); +int ASN1_STRING_length(const ASN1_STRING *x); +void ASN1_STRING_length_set(ASN1_STRING *x, int n); +int ASN1_STRING_type(ASN1_STRING *x); +unsigned char *ASN1_STRING_data(ASN1_STRING *x); + +DECLARE_ASN1_FUNCTIONS(ASN1_BIT_STRING) +int i2c_ASN1_BIT_STRING(ASN1_BIT_STRING *a, unsigned char **pp); +ASN1_BIT_STRING *c2i_ASN1_BIT_STRING(ASN1_BIT_STRING **a, + const unsigned char **pp, long length); +int ASN1_BIT_STRING_set(ASN1_BIT_STRING *a, unsigned char *d, int length); +int ASN1_BIT_STRING_set_bit(ASN1_BIT_STRING *a, int n, int value); +int ASN1_BIT_STRING_get_bit(ASN1_BIT_STRING *a, int n); +int ASN1_BIT_STRING_check(ASN1_BIT_STRING *a, + unsigned char *flags, int flags_len); + +# ifndef OPENSSL_NO_BIO +int ASN1_BIT_STRING_name_print(BIO *out, ASN1_BIT_STRING *bs, + BIT_STRING_BITNAME *tbl, int indent); +# endif +int ASN1_BIT_STRING_num_asc(char *name, BIT_STRING_BITNAME *tbl); +int ASN1_BIT_STRING_set_asc(ASN1_BIT_STRING *bs, char *name, int value, + BIT_STRING_BITNAME *tbl); + +int i2d_ASN1_BOOLEAN(int a, unsigned char **pp); +int d2i_ASN1_BOOLEAN(int *a, const unsigned char **pp, long length); + +DECLARE_ASN1_FUNCTIONS(ASN1_INTEGER) +int i2c_ASN1_INTEGER(ASN1_INTEGER *a, unsigned char **pp); +ASN1_INTEGER *c2i_ASN1_INTEGER(ASN1_INTEGER **a, const unsigned char **pp, + long length); +ASN1_INTEGER *d2i_ASN1_UINTEGER(ASN1_INTEGER **a, const unsigned char **pp, + long length); +ASN1_INTEGER *ASN1_INTEGER_dup(const ASN1_INTEGER *x); +int ASN1_INTEGER_cmp(const ASN1_INTEGER *x, const ASN1_INTEGER *y); + +DECLARE_ASN1_FUNCTIONS(ASN1_ENUMERATED) + +int ASN1_UTCTIME_check(const ASN1_UTCTIME *a); +ASN1_UTCTIME *ASN1_UTCTIME_set(ASN1_UTCTIME *s, time_t t); +ASN1_UTCTIME *ASN1_UTCTIME_adj(ASN1_UTCTIME *s, time_t t, + int offset_day, long offset_sec); +int ASN1_UTCTIME_set_string(ASN1_UTCTIME *s, const char *str); +int ASN1_UTCTIME_cmp_time_t(const ASN1_UTCTIME *s, time_t t); +# if 0 +time_t ASN1_UTCTIME_get(const ASN1_UTCTIME *s); +# endif + +int ASN1_GENERALIZEDTIME_check(const ASN1_GENERALIZEDTIME *a); +ASN1_GENERALIZEDTIME *ASN1_GENERALIZEDTIME_set(ASN1_GENERALIZEDTIME *s, + time_t t); +ASN1_GENERALIZEDTIME *ASN1_GENERALIZEDTIME_adj(ASN1_GENERALIZEDTIME *s, + time_t t, int offset_day, + long offset_sec); +int ASN1_GENERALIZEDTIME_set_string(ASN1_GENERALIZEDTIME *s, const char *str); +int ASN1_TIME_diff(int *pday, int *psec, + const ASN1_TIME *from, const ASN1_TIME *to); + +DECLARE_ASN1_FUNCTIONS(ASN1_OCTET_STRING) +ASN1_OCTET_STRING *ASN1_OCTET_STRING_dup(const ASN1_OCTET_STRING *a); +int ASN1_OCTET_STRING_cmp(const ASN1_OCTET_STRING *a, + const ASN1_OCTET_STRING *b); +int ASN1_OCTET_STRING_set(ASN1_OCTET_STRING *str, const unsigned char *data, + int len); + +DECLARE_ASN1_FUNCTIONS(ASN1_VISIBLESTRING) +DECLARE_ASN1_FUNCTIONS(ASN1_UNIVERSALSTRING) +DECLARE_ASN1_FUNCTIONS(ASN1_UTF8STRING) +DECLARE_ASN1_FUNCTIONS(ASN1_NULL) +DECLARE_ASN1_FUNCTIONS(ASN1_BMPSTRING) + +int UTF8_getc(const unsigned char *str, int len, unsigned long *val); +int UTF8_putc(unsigned char *str, int len, unsigned long value); + +DECLARE_ASN1_FUNCTIONS_name(ASN1_STRING, ASN1_PRINTABLE) + +DECLARE_ASN1_FUNCTIONS_name(ASN1_STRING, DIRECTORYSTRING) +DECLARE_ASN1_FUNCTIONS_name(ASN1_STRING, DISPLAYTEXT) +DECLARE_ASN1_FUNCTIONS(ASN1_PRINTABLESTRING) +DECLARE_ASN1_FUNCTIONS(ASN1_T61STRING) +DECLARE_ASN1_FUNCTIONS(ASN1_IA5STRING) +DECLARE_ASN1_FUNCTIONS(ASN1_GENERALSTRING) +DECLARE_ASN1_FUNCTIONS(ASN1_UTCTIME) +DECLARE_ASN1_FUNCTIONS(ASN1_GENERALIZEDTIME) +DECLARE_ASN1_FUNCTIONS(ASN1_TIME) + +DECLARE_ASN1_ITEM(ASN1_OCTET_STRING_NDEF) + +ASN1_TIME *ASN1_TIME_set(ASN1_TIME *s, time_t t); +ASN1_TIME *ASN1_TIME_adj(ASN1_TIME *s, time_t t, + int offset_day, long offset_sec); +int ASN1_TIME_check(ASN1_TIME *t); +ASN1_GENERALIZEDTIME *ASN1_TIME_to_generalizedtime(ASN1_TIME *t, ASN1_GENERALIZEDTIME + **out); +int ASN1_TIME_set_string(ASN1_TIME *s, const char *str); + +int i2d_ASN1_SET(STACK_OF(OPENSSL_BLOCK) *a, unsigned char **pp, + i2d_of_void *i2d, int ex_tag, int ex_class, int is_set); +STACK_OF(OPENSSL_BLOCK) *d2i_ASN1_SET(STACK_OF(OPENSSL_BLOCK) **a, + const unsigned char **pp, + long length, d2i_of_void *d2i, + void (*free_func) (OPENSSL_BLOCK), + int ex_tag, int ex_class); + +# ifndef OPENSSL_NO_BIO +int i2a_ASN1_INTEGER(BIO *bp, ASN1_INTEGER *a); +int a2i_ASN1_INTEGER(BIO *bp, ASN1_INTEGER *bs, char *buf, int size); +int i2a_ASN1_ENUMERATED(BIO *bp, ASN1_ENUMERATED *a); +int a2i_ASN1_ENUMERATED(BIO *bp, ASN1_ENUMERATED *bs, char *buf, int size); +int i2a_ASN1_OBJECT(BIO *bp, ASN1_OBJECT *a); +int a2i_ASN1_STRING(BIO *bp, ASN1_STRING *bs, char *buf, int size); +int i2a_ASN1_STRING(BIO *bp, ASN1_STRING *a, int type); +# endif +int i2t_ASN1_OBJECT(char *buf, int buf_len, ASN1_OBJECT *a); + +int a2d_ASN1_OBJECT(unsigned char *out, int olen, const char *buf, int num); +ASN1_OBJECT *ASN1_OBJECT_create(int nid, unsigned char *data, int len, + const char *sn, const char *ln); + +int ASN1_INTEGER_set(ASN1_INTEGER *a, long v); +long ASN1_INTEGER_get(const ASN1_INTEGER *a); +ASN1_INTEGER *BN_to_ASN1_INTEGER(const BIGNUM *bn, ASN1_INTEGER *ai); +BIGNUM *ASN1_INTEGER_to_BN(const ASN1_INTEGER *ai, BIGNUM *bn); + +int ASN1_ENUMERATED_set(ASN1_ENUMERATED *a, long v); +long ASN1_ENUMERATED_get(ASN1_ENUMERATED *a); +ASN1_ENUMERATED *BN_to_ASN1_ENUMERATED(BIGNUM *bn, ASN1_ENUMERATED *ai); +BIGNUM *ASN1_ENUMERATED_to_BN(ASN1_ENUMERATED *ai, BIGNUM *bn); + +/* General */ +/* given a string, return the correct type, max is the maximum length */ +int ASN1_PRINTABLE_type(const unsigned char *s, int max); + +int i2d_ASN1_bytes(ASN1_STRING *a, unsigned char **pp, int tag, int xclass); +ASN1_STRING *d2i_ASN1_bytes(ASN1_STRING **a, const unsigned char **pp, + long length, int Ptag, int Pclass); +unsigned long ASN1_tag2bit(int tag); +/* type is one or more of the B_ASN1_ values. */ +ASN1_STRING *d2i_ASN1_type_bytes(ASN1_STRING **a, const unsigned char **pp, + long length, int type); + +/* PARSING */ +int asn1_Finish(ASN1_CTX *c); +int asn1_const_Finish(ASN1_const_CTX *c); + +/* SPECIALS */ +int ASN1_get_object(const unsigned char **pp, long *plength, int *ptag, + int *pclass, long omax); +int ASN1_check_infinite_end(unsigned char **p, long len); +int ASN1_const_check_infinite_end(const unsigned char **p, long len); +void ASN1_put_object(unsigned char **pp, int constructed, int length, + int tag, int xclass); +int ASN1_put_eoc(unsigned char **pp); +int ASN1_object_size(int constructed, int length, int tag); + +/* Used to implement other functions */ +void *ASN1_dup(i2d_of_void *i2d, d2i_of_void *d2i, void *x); + +# define ASN1_dup_of(type,i2d,d2i,x) \ + ((type*)ASN1_dup(CHECKED_I2D_OF(type, i2d), \ + CHECKED_D2I_OF(type, d2i), \ + CHECKED_PTR_OF(type, x))) + +# define ASN1_dup_of_const(type,i2d,d2i,x) \ + ((type*)ASN1_dup(CHECKED_I2D_OF(const type, i2d), \ + CHECKED_D2I_OF(type, d2i), \ + CHECKED_PTR_OF(const type, x))) + +void *ASN1_item_dup(const ASN1_ITEM *it, void *x); + +/* ASN1 alloc/free macros for when a type is only used internally */ + +# define M_ASN1_new_of(type) (type *)ASN1_item_new(ASN1_ITEM_rptr(type)) +# define M_ASN1_free_of(x, type) \ + ASN1_item_free(CHECKED_PTR_OF(type, x), ASN1_ITEM_rptr(type)) + +# ifndef OPENSSL_NO_FP_API +void *ASN1_d2i_fp(void *(*xnew) (void), d2i_of_void *d2i, FILE *in, void **x); + +# define ASN1_d2i_fp_of(type,xnew,d2i,in,x) \ + ((type*)ASN1_d2i_fp(CHECKED_NEW_OF(type, xnew), \ + CHECKED_D2I_OF(type, d2i), \ + in, \ + CHECKED_PPTR_OF(type, x))) + +void *ASN1_item_d2i_fp(const ASN1_ITEM *it, FILE *in, void *x); +int ASN1_i2d_fp(i2d_of_void *i2d, FILE *out, void *x); + +# define ASN1_i2d_fp_of(type,i2d,out,x) \ + (ASN1_i2d_fp(CHECKED_I2D_OF(type, i2d), \ + out, \ + CHECKED_PTR_OF(type, x))) + +# define ASN1_i2d_fp_of_const(type,i2d,out,x) \ + (ASN1_i2d_fp(CHECKED_I2D_OF(const type, i2d), \ + out, \ + CHECKED_PTR_OF(const type, x))) + +int ASN1_item_i2d_fp(const ASN1_ITEM *it, FILE *out, void *x); +int ASN1_STRING_print_ex_fp(FILE *fp, ASN1_STRING *str, unsigned long flags); +# endif + +int ASN1_STRING_to_UTF8(unsigned char **out, ASN1_STRING *in); + +# ifndef OPENSSL_NO_BIO +void *ASN1_d2i_bio(void *(*xnew) (void), d2i_of_void *d2i, BIO *in, void **x); + +# define ASN1_d2i_bio_of(type,xnew,d2i,in,x) \ + ((type*)ASN1_d2i_bio( CHECKED_NEW_OF(type, xnew), \ + CHECKED_D2I_OF(type, d2i), \ + in, \ + CHECKED_PPTR_OF(type, x))) + +void *ASN1_item_d2i_bio(const ASN1_ITEM *it, BIO *in, void *x); +int ASN1_i2d_bio(i2d_of_void *i2d, BIO *out, unsigned char *x); + +# define ASN1_i2d_bio_of(type,i2d,out,x) \ + (ASN1_i2d_bio(CHECKED_I2D_OF(type, i2d), \ + out, \ + CHECKED_PTR_OF(type, x))) + +# define ASN1_i2d_bio_of_const(type,i2d,out,x) \ + (ASN1_i2d_bio(CHECKED_I2D_OF(const type, i2d), \ + out, \ + CHECKED_PTR_OF(const type, x))) + +int ASN1_item_i2d_bio(const ASN1_ITEM *it, BIO *out, void *x); +int ASN1_UTCTIME_print(BIO *fp, const ASN1_UTCTIME *a); +int ASN1_GENERALIZEDTIME_print(BIO *fp, const ASN1_GENERALIZEDTIME *a); +int ASN1_TIME_print(BIO *fp, const ASN1_TIME *a); +int ASN1_STRING_print(BIO *bp, const ASN1_STRING *v); +int ASN1_STRING_print_ex(BIO *out, ASN1_STRING *str, unsigned long flags); +int ASN1_bn_print(BIO *bp, const char *number, const BIGNUM *num, + unsigned char *buf, int off); +int ASN1_parse(BIO *bp, const unsigned char *pp, long len, int indent); +int ASN1_parse_dump(BIO *bp, const unsigned char *pp, long len, int indent, + int dump); +# endif +const char *ASN1_tag2str(int tag); + +/* Used to load and write netscape format cert */ + +DECLARE_ASN1_FUNCTIONS(NETSCAPE_X509) + +int ASN1_UNIVERSALSTRING_to_string(ASN1_UNIVERSALSTRING *s); + +int ASN1_TYPE_set_octetstring(ASN1_TYPE *a, unsigned char *data, int len); +int ASN1_TYPE_get_octetstring(ASN1_TYPE *a, unsigned char *data, int max_len); +int ASN1_TYPE_set_int_octetstring(ASN1_TYPE *a, long num, + unsigned char *data, int len); +int ASN1_TYPE_get_int_octetstring(ASN1_TYPE *a, long *num, + unsigned char *data, int max_len); + +STACK_OF(OPENSSL_BLOCK) *ASN1_seq_unpack(const unsigned char *buf, int len, + d2i_of_void *d2i, + void (*free_func) (OPENSSL_BLOCK)); +unsigned char *ASN1_seq_pack(STACK_OF(OPENSSL_BLOCK) *safes, i2d_of_void *i2d, + unsigned char **buf, int *len); +void *ASN1_unpack_string(ASN1_STRING *oct, d2i_of_void *d2i); +void *ASN1_item_unpack(ASN1_STRING *oct, const ASN1_ITEM *it); +ASN1_STRING *ASN1_pack_string(void *obj, i2d_of_void *i2d, + ASN1_OCTET_STRING **oct); + +# define ASN1_pack_string_of(type,obj,i2d,oct) \ + (ASN1_pack_string(CHECKED_PTR_OF(type, obj), \ + CHECKED_I2D_OF(type, i2d), \ + oct)) + +ASN1_STRING *ASN1_item_pack(void *obj, const ASN1_ITEM *it, + ASN1_OCTET_STRING **oct); + +void ASN1_STRING_set_default_mask(unsigned long mask); +int ASN1_STRING_set_default_mask_asc(const char *p); +unsigned long ASN1_STRING_get_default_mask(void); +int ASN1_mbstring_copy(ASN1_STRING **out, const unsigned char *in, int len, + int inform, unsigned long mask); +int ASN1_mbstring_ncopy(ASN1_STRING **out, const unsigned char *in, int len, + int inform, unsigned long mask, + long minsize, long maxsize); + +ASN1_STRING *ASN1_STRING_set_by_NID(ASN1_STRING **out, + const unsigned char *in, int inlen, + int inform, int nid); +ASN1_STRING_TABLE *ASN1_STRING_TABLE_get(int nid); +int ASN1_STRING_TABLE_add(int, long, long, unsigned long, unsigned long); +void ASN1_STRING_TABLE_cleanup(void); + +/* ASN1 template functions */ + +/* Old API compatible functions */ +ASN1_VALUE *ASN1_item_new(const ASN1_ITEM *it); +void ASN1_item_free(ASN1_VALUE *val, const ASN1_ITEM *it); +ASN1_VALUE *ASN1_item_d2i(ASN1_VALUE **val, const unsigned char **in, + long len, const ASN1_ITEM *it); +int ASN1_item_i2d(ASN1_VALUE *val, unsigned char **out, const ASN1_ITEM *it); +int ASN1_item_ndef_i2d(ASN1_VALUE *val, unsigned char **out, + const ASN1_ITEM *it); + +void ASN1_add_oid_module(void); + +ASN1_TYPE *ASN1_generate_nconf(char *str, CONF *nconf); +ASN1_TYPE *ASN1_generate_v3(char *str, X509V3_CTX *cnf); + +/* ASN1 Print flags */ + +/* Indicate missing OPTIONAL fields */ +# define ASN1_PCTX_FLAGS_SHOW_ABSENT 0x001 +/* Mark start and end of SEQUENCE */ +# define ASN1_PCTX_FLAGS_SHOW_SEQUENCE 0x002 +/* Mark start and end of SEQUENCE/SET OF */ +# define ASN1_PCTX_FLAGS_SHOW_SSOF 0x004 +/* Show the ASN1 type of primitives */ +# define ASN1_PCTX_FLAGS_SHOW_TYPE 0x008 +/* Don't show ASN1 type of ANY */ +# define ASN1_PCTX_FLAGS_NO_ANY_TYPE 0x010 +/* Don't show ASN1 type of MSTRINGs */ +# define ASN1_PCTX_FLAGS_NO_MSTRING_TYPE 0x020 +/* Don't show field names in SEQUENCE */ +# define ASN1_PCTX_FLAGS_NO_FIELD_NAME 0x040 +/* Show structure names of each SEQUENCE field */ +# define ASN1_PCTX_FLAGS_SHOW_FIELD_STRUCT_NAME 0x080 +/* Don't show structure name even at top level */ +# define ASN1_PCTX_FLAGS_NO_STRUCT_NAME 0x100 + +int ASN1_item_print(BIO *out, ASN1_VALUE *ifld, int indent, + const ASN1_ITEM *it, const ASN1_PCTX *pctx); +ASN1_PCTX *ASN1_PCTX_new(void); +void ASN1_PCTX_free(ASN1_PCTX *p); +unsigned long ASN1_PCTX_get_flags(ASN1_PCTX *p); +void ASN1_PCTX_set_flags(ASN1_PCTX *p, unsigned long flags); +unsigned long ASN1_PCTX_get_nm_flags(ASN1_PCTX *p); +void ASN1_PCTX_set_nm_flags(ASN1_PCTX *p, unsigned long flags); +unsigned long ASN1_PCTX_get_cert_flags(ASN1_PCTX *p); +void ASN1_PCTX_set_cert_flags(ASN1_PCTX *p, unsigned long flags); +unsigned long ASN1_PCTX_get_oid_flags(ASN1_PCTX *p); +void ASN1_PCTX_set_oid_flags(ASN1_PCTX *p, unsigned long flags); +unsigned long ASN1_PCTX_get_str_flags(ASN1_PCTX *p); +void ASN1_PCTX_set_str_flags(ASN1_PCTX *p, unsigned long flags); + +BIO_METHOD *BIO_f_asn1(void); + +BIO *BIO_new_NDEF(BIO *out, ASN1_VALUE *val, const ASN1_ITEM *it); + +int i2d_ASN1_bio_stream(BIO *out, ASN1_VALUE *val, BIO *in, int flags, + const ASN1_ITEM *it); +int PEM_write_bio_ASN1_stream(BIO *out, ASN1_VALUE *val, BIO *in, int flags, + const char *hdr, const ASN1_ITEM *it); +int SMIME_write_ASN1(BIO *bio, ASN1_VALUE *val, BIO *data, int flags, + int ctype_nid, int econt_nid, + STACK_OF(X509_ALGOR) *mdalgs, const ASN1_ITEM *it); +ASN1_VALUE *SMIME_read_ASN1(BIO *bio, BIO **bcont, const ASN1_ITEM *it); +int SMIME_crlf_copy(BIO *in, BIO *out, int flags); +int SMIME_text(BIO *in, BIO *out); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_ASN1_strings(void); + +/* Error codes for the ASN1 functions. */ + +/* Function codes. */ +# define ASN1_F_A2D_ASN1_OBJECT 100 +# define ASN1_F_A2I_ASN1_ENUMERATED 101 +# define ASN1_F_A2I_ASN1_INTEGER 102 +# define ASN1_F_A2I_ASN1_STRING 103 +# define ASN1_F_APPEND_EXP 176 +# define ASN1_F_ASN1_BIT_STRING_SET_BIT 183 +# define ASN1_F_ASN1_CB 177 +# define ASN1_F_ASN1_CHECK_TLEN 104 +# define ASN1_F_ASN1_COLLATE_PRIMITIVE 105 +# define ASN1_F_ASN1_COLLECT 106 +# define ASN1_F_ASN1_D2I_EX_PRIMITIVE 108 +# define ASN1_F_ASN1_D2I_FP 109 +# define ASN1_F_ASN1_D2I_READ_BIO 107 +# define ASN1_F_ASN1_DIGEST 184 +# define ASN1_F_ASN1_DO_ADB 110 +# define ASN1_F_ASN1_DUP 111 +# define ASN1_F_ASN1_ENUMERATED_SET 112 +# define ASN1_F_ASN1_ENUMERATED_TO_BN 113 +# define ASN1_F_ASN1_EX_C2I 204 +# define ASN1_F_ASN1_FIND_END 190 +# define ASN1_F_ASN1_GENERALIZEDTIME_ADJ 216 +# define ASN1_F_ASN1_GENERALIZEDTIME_SET 185 +# define ASN1_F_ASN1_GENERATE_V3 178 +# define ASN1_F_ASN1_GET_OBJECT 114 +# define ASN1_F_ASN1_HEADER_NEW 115 +# define ASN1_F_ASN1_I2D_BIO 116 +# define ASN1_F_ASN1_I2D_FP 117 +# define ASN1_F_ASN1_INTEGER_SET 118 +# define ASN1_F_ASN1_INTEGER_TO_BN 119 +# define ASN1_F_ASN1_ITEM_D2I_FP 206 +# define ASN1_F_ASN1_ITEM_DUP 191 +# define ASN1_F_ASN1_ITEM_EX_COMBINE_NEW 121 +# define ASN1_F_ASN1_ITEM_EX_D2I 120 +# define ASN1_F_ASN1_ITEM_I2D_BIO 192 +# define ASN1_F_ASN1_ITEM_I2D_FP 193 +# define ASN1_F_ASN1_ITEM_PACK 198 +# define ASN1_F_ASN1_ITEM_SIGN 195 +# define ASN1_F_ASN1_ITEM_SIGN_CTX 220 +# define ASN1_F_ASN1_ITEM_UNPACK 199 +# define ASN1_F_ASN1_ITEM_VERIFY 197 +# define ASN1_F_ASN1_MBSTRING_NCOPY 122 +# define ASN1_F_ASN1_OBJECT_NEW 123 +# define ASN1_F_ASN1_OUTPUT_DATA 214 +# define ASN1_F_ASN1_PACK_STRING 124 +# define ASN1_F_ASN1_PCTX_NEW 205 +# define ASN1_F_ASN1_PKCS5_PBE_SET 125 +# define ASN1_F_ASN1_SEQ_PACK 126 +# define ASN1_F_ASN1_SEQ_UNPACK 127 +# define ASN1_F_ASN1_SIGN 128 +# define ASN1_F_ASN1_STR2TYPE 179 +# define ASN1_F_ASN1_STRING_SET 186 +# define ASN1_F_ASN1_STRING_TABLE_ADD 129 +# define ASN1_F_ASN1_STRING_TYPE_NEW 130 +# define ASN1_F_ASN1_TEMPLATE_EX_D2I 132 +# define ASN1_F_ASN1_TEMPLATE_NEW 133 +# define ASN1_F_ASN1_TEMPLATE_NOEXP_D2I 131 +# define ASN1_F_ASN1_TIME_ADJ 217 +# define ASN1_F_ASN1_TIME_SET 175 +# define ASN1_F_ASN1_TYPE_GET_INT_OCTETSTRING 134 +# define ASN1_F_ASN1_TYPE_GET_OCTETSTRING 135 +# define ASN1_F_ASN1_UNPACK_STRING 136 +# define ASN1_F_ASN1_UTCTIME_ADJ 218 +# define ASN1_F_ASN1_UTCTIME_SET 187 +# define ASN1_F_ASN1_VERIFY 137 +# define ASN1_F_B64_READ_ASN1 209 +# define ASN1_F_B64_WRITE_ASN1 210 +# define ASN1_F_BIO_NEW_NDEF 208 +# define ASN1_F_BITSTR_CB 180 +# define ASN1_F_BN_TO_ASN1_ENUMERATED 138 +# define ASN1_F_BN_TO_ASN1_INTEGER 139 +# define ASN1_F_C2I_ASN1_BIT_STRING 189 +# define ASN1_F_C2I_ASN1_INTEGER 194 +# define ASN1_F_C2I_ASN1_OBJECT 196 +# define ASN1_F_COLLECT_DATA 140 +# define ASN1_F_D2I_ASN1_BIT_STRING 141 +# define ASN1_F_D2I_ASN1_BOOLEAN 142 +# define ASN1_F_D2I_ASN1_BYTES 143 +# define ASN1_F_D2I_ASN1_GENERALIZEDTIME 144 +# define ASN1_F_D2I_ASN1_HEADER 145 +# define ASN1_F_D2I_ASN1_INTEGER 146 +# define ASN1_F_D2I_ASN1_OBJECT 147 +# define ASN1_F_D2I_ASN1_SET 148 +# define ASN1_F_D2I_ASN1_TYPE_BYTES 149 +# define ASN1_F_D2I_ASN1_UINTEGER 150 +# define ASN1_F_D2I_ASN1_UTCTIME 151 +# define ASN1_F_D2I_AUTOPRIVATEKEY 207 +# define ASN1_F_D2I_NETSCAPE_RSA 152 +# define ASN1_F_D2I_NETSCAPE_RSA_2 153 +# define ASN1_F_D2I_PRIVATEKEY 154 +# define ASN1_F_D2I_PUBLICKEY 155 +# define ASN1_F_D2I_RSA_NET 200 +# define ASN1_F_D2I_RSA_NET_2 201 +# define ASN1_F_D2I_X509 156 +# define ASN1_F_D2I_X509_CINF 157 +# define ASN1_F_D2I_X509_PKEY 159 +# define ASN1_F_I2D_ASN1_BIO_STREAM 211 +# define ASN1_F_I2D_ASN1_SET 188 +# define ASN1_F_I2D_ASN1_TIME 160 +# define ASN1_F_I2D_DSA_PUBKEY 161 +# define ASN1_F_I2D_EC_PUBKEY 181 +# define ASN1_F_I2D_PRIVATEKEY 163 +# define ASN1_F_I2D_PUBLICKEY 164 +# define ASN1_F_I2D_RSA_NET 162 +# define ASN1_F_I2D_RSA_PUBKEY 165 +# define ASN1_F_LONG_C2I 166 +# define ASN1_F_OID_MODULE_INIT 174 +# define ASN1_F_PARSE_TAGGING 182 +# define ASN1_F_PKCS5_PBE2_SET_IV 167 +# define ASN1_F_PKCS5_PBE_SET 202 +# define ASN1_F_PKCS5_PBE_SET0_ALGOR 215 +# define ASN1_F_PKCS5_PBKDF2_SET 219 +# define ASN1_F_SMIME_READ_ASN1 212 +# define ASN1_F_SMIME_TEXT 213 +# define ASN1_F_X509_CINF_NEW 168 +# define ASN1_F_X509_CRL_ADD0_REVOKED 169 +# define ASN1_F_X509_INFO_NEW 170 +# define ASN1_F_X509_NAME_ENCODE 203 +# define ASN1_F_X509_NAME_EX_D2I 158 +# define ASN1_F_X509_NAME_EX_NEW 171 +# define ASN1_F_X509_NEW 172 +# define ASN1_F_X509_PKEY_NEW 173 + +/* Reason codes. */ +# define ASN1_R_ADDING_OBJECT 171 +# define ASN1_R_ASN1_PARSE_ERROR 203 +# define ASN1_R_ASN1_SIG_PARSE_ERROR 204 +# define ASN1_R_AUX_ERROR 100 +# define ASN1_R_BAD_CLASS 101 +# define ASN1_R_BAD_OBJECT_HEADER 102 +# define ASN1_R_BAD_PASSWORD_READ 103 +# define ASN1_R_BAD_TAG 104 +# define ASN1_R_BMPSTRING_IS_WRONG_LENGTH 214 +# define ASN1_R_BN_LIB 105 +# define ASN1_R_BOOLEAN_IS_WRONG_LENGTH 106 +# define ASN1_R_BUFFER_TOO_SMALL 107 +# define ASN1_R_CIPHER_HAS_NO_OBJECT_IDENTIFIER 108 +# define ASN1_R_CONTEXT_NOT_INITIALISED 217 +# define ASN1_R_DATA_IS_WRONG 109 +# define ASN1_R_DECODE_ERROR 110 +# define ASN1_R_DECODING_ERROR 111 +# define ASN1_R_DEPTH_EXCEEDED 174 +# define ASN1_R_DIGEST_AND_KEY_TYPE_NOT_SUPPORTED 198 +# define ASN1_R_ENCODE_ERROR 112 +# define ASN1_R_ERROR_GETTING_TIME 173 +# define ASN1_R_ERROR_LOADING_SECTION 172 +# define ASN1_R_ERROR_PARSING_SET_ELEMENT 113 +# define ASN1_R_ERROR_SETTING_CIPHER_PARAMS 114 +# define ASN1_R_EXPECTING_AN_INTEGER 115 +# define ASN1_R_EXPECTING_AN_OBJECT 116 +# define ASN1_R_EXPECTING_A_BOOLEAN 117 +# define ASN1_R_EXPECTING_A_TIME 118 +# define ASN1_R_EXPLICIT_LENGTH_MISMATCH 119 +# define ASN1_R_EXPLICIT_TAG_NOT_CONSTRUCTED 120 +# define ASN1_R_FIELD_MISSING 121 +# define ASN1_R_FIRST_NUM_TOO_LARGE 122 +# define ASN1_R_HEADER_TOO_LONG 123 +# define ASN1_R_ILLEGAL_BITSTRING_FORMAT 175 +# define ASN1_R_ILLEGAL_BOOLEAN 176 +# define ASN1_R_ILLEGAL_CHARACTERS 124 +# define ASN1_R_ILLEGAL_FORMAT 177 +# define ASN1_R_ILLEGAL_HEX 178 +# define ASN1_R_ILLEGAL_IMPLICIT_TAG 179 +# define ASN1_R_ILLEGAL_INTEGER 180 +# define ASN1_R_ILLEGAL_NESTED_TAGGING 181 +# define ASN1_R_ILLEGAL_NULL 125 +# define ASN1_R_ILLEGAL_NULL_VALUE 182 +# define ASN1_R_ILLEGAL_OBJECT 183 +# define ASN1_R_ILLEGAL_OPTIONAL_ANY 126 +# define ASN1_R_ILLEGAL_OPTIONS_ON_ITEM_TEMPLATE 170 +# define ASN1_R_ILLEGAL_TAGGED_ANY 127 +# define ASN1_R_ILLEGAL_TIME_VALUE 184 +# define ASN1_R_INTEGER_NOT_ASCII_FORMAT 185 +# define ASN1_R_INTEGER_TOO_LARGE_FOR_LONG 128 +# define ASN1_R_INVALID_BIT_STRING_BITS_LEFT 220 +# define ASN1_R_INVALID_BMPSTRING_LENGTH 129 +# define ASN1_R_INVALID_DIGIT 130 +# define ASN1_R_INVALID_MIME_TYPE 205 +# define ASN1_R_INVALID_MODIFIER 186 +# define ASN1_R_INVALID_NUMBER 187 +# define ASN1_R_INVALID_OBJECT_ENCODING 216 +# define ASN1_R_INVALID_SEPARATOR 131 +# define ASN1_R_INVALID_TIME_FORMAT 132 +# define ASN1_R_INVALID_UNIVERSALSTRING_LENGTH 133 +# define ASN1_R_INVALID_UTF8STRING 134 +# define ASN1_R_IV_TOO_LARGE 135 +# define ASN1_R_LENGTH_ERROR 136 +# define ASN1_R_LIST_ERROR 188 +# define ASN1_R_MIME_NO_CONTENT_TYPE 206 +# define ASN1_R_MIME_PARSE_ERROR 207 +# define ASN1_R_MIME_SIG_PARSE_ERROR 208 +# define ASN1_R_MISSING_EOC 137 +# define ASN1_R_MISSING_SECOND_NUMBER 138 +# define ASN1_R_MISSING_VALUE 189 +# define ASN1_R_MSTRING_NOT_UNIVERSAL 139 +# define ASN1_R_MSTRING_WRONG_TAG 140 +# define ASN1_R_NESTED_ASN1_STRING 197 +# define ASN1_R_NON_HEX_CHARACTERS 141 +# define ASN1_R_NOT_ASCII_FORMAT 190 +# define ASN1_R_NOT_ENOUGH_DATA 142 +# define ASN1_R_NO_CONTENT_TYPE 209 +# define ASN1_R_NO_DEFAULT_DIGEST 201 +# define ASN1_R_NO_MATCHING_CHOICE_TYPE 143 +# define ASN1_R_NO_MULTIPART_BODY_FAILURE 210 +# define ASN1_R_NO_MULTIPART_BOUNDARY 211 +# define ASN1_R_NO_SIG_CONTENT_TYPE 212 +# define ASN1_R_NULL_IS_WRONG_LENGTH 144 +# define ASN1_R_OBJECT_NOT_ASCII_FORMAT 191 +# define ASN1_R_ODD_NUMBER_OF_CHARS 145 +# define ASN1_R_PRIVATE_KEY_HEADER_MISSING 146 +# define ASN1_R_SECOND_NUMBER_TOO_LARGE 147 +# define ASN1_R_SEQUENCE_LENGTH_MISMATCH 148 +# define ASN1_R_SEQUENCE_NOT_CONSTRUCTED 149 +# define ASN1_R_SEQUENCE_OR_SET_NEEDS_CONFIG 192 +# define ASN1_R_SHORT_LINE 150 +# define ASN1_R_SIG_INVALID_MIME_TYPE 213 +# define ASN1_R_STREAMING_NOT_SUPPORTED 202 +# define ASN1_R_STRING_TOO_LONG 151 +# define ASN1_R_STRING_TOO_SHORT 152 +# define ASN1_R_TAG_VALUE_TOO_HIGH 153 +# define ASN1_R_THE_ASN1_OBJECT_IDENTIFIER_IS_NOT_KNOWN_FOR_THIS_MD 154 +# define ASN1_R_TIME_NOT_ASCII_FORMAT 193 +# define ASN1_R_TOO_LONG 155 +# define ASN1_R_TYPE_NOT_CONSTRUCTED 156 +# define ASN1_R_TYPE_NOT_PRIMITIVE 218 +# define ASN1_R_UNABLE_TO_DECODE_RSA_KEY 157 +# define ASN1_R_UNABLE_TO_DECODE_RSA_PRIVATE_KEY 158 +# define ASN1_R_UNEXPECTED_EOC 159 +# define ASN1_R_UNIVERSALSTRING_IS_WRONG_LENGTH 215 +# define ASN1_R_UNKNOWN_FORMAT 160 +# define ASN1_R_UNKNOWN_MESSAGE_DIGEST_ALGORITHM 161 +# define ASN1_R_UNKNOWN_OBJECT_TYPE 162 +# define ASN1_R_UNKNOWN_PUBLIC_KEY_TYPE 163 +# define ASN1_R_UNKNOWN_SIGNATURE_ALGORITHM 199 +# define ASN1_R_UNKNOWN_TAG 194 +# define ASN1_R_UNKOWN_FORMAT 195 +# define ASN1_R_UNSUPPORTED_ANY_DEFINED_BY_TYPE 164 +# define ASN1_R_UNSUPPORTED_CIPHER 165 +# define ASN1_R_UNSUPPORTED_ENCRYPTION_ALGORITHM 166 +# define ASN1_R_UNSUPPORTED_PUBLIC_KEY_TYPE 167 +# define ASN1_R_UNSUPPORTED_TYPE 196 +# define ASN1_R_WRONG_PUBLIC_KEY_TYPE 200 +# define ASN1_R_WRONG_TAG 168 +# define ASN1_R_WRONG_TYPE 169 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/asn1_mac.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/asn1_mac.h new file mode 100644 index 0000000..abc6dc3 --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/asn1_mac.h @@ -0,0 +1,579 @@ +/* crypto/asn1/asn1_mac.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_ASN1_MAC_H +# define HEADER_ASN1_MAC_H + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# ifndef ASN1_MAC_ERR_LIB +# define ASN1_MAC_ERR_LIB ERR_LIB_ASN1 +# endif + +# define ASN1_MAC_H_err(f,r,line) \ + ERR_PUT_error(ASN1_MAC_ERR_LIB,(f),(r),__FILE__,(line)) + +# define M_ASN1_D2I_vars(a,type,func) \ + ASN1_const_CTX c; \ + type ret=NULL; \ + \ + c.pp=(const unsigned char **)pp; \ + c.q= *(const unsigned char **)pp; \ + c.error=ERR_R_NESTED_ASN1_ERROR; \ + if ((a == NULL) || ((*a) == NULL)) \ + { if ((ret=(type)func()) == NULL) \ + { c.line=__LINE__; goto err; } } \ + else ret=(*a); + +# define M_ASN1_D2I_Init() \ + c.p= *(const unsigned char **)pp; \ + c.max=(length == 0)?0:(c.p+length); + +# define M_ASN1_D2I_Finish_2(a) \ + if (!asn1_const_Finish(&c)) \ + { c.line=__LINE__; goto err; } \ + *(const unsigned char **)pp=c.p; \ + if (a != NULL) (*a)=ret; \ + return(ret); + +# define M_ASN1_D2I_Finish(a,func,e) \ + M_ASN1_D2I_Finish_2(a); \ +err:\ + ASN1_MAC_H_err((e),c.error,c.line); \ + asn1_add_error(*(const unsigned char **)pp,(int)(c.q- *pp)); \ + if ((ret != NULL) && ((a == NULL) || (*a != ret))) func(ret); \ + return(NULL) + +# define M_ASN1_D2I_start_sequence() \ + if (!asn1_GetSequence(&c,&length)) \ + { c.line=__LINE__; goto err; } +/* Begin reading ASN1 without a surrounding sequence */ +# define M_ASN1_D2I_begin() \ + c.slen = length; + +/* End reading ASN1 with no check on length */ +# define M_ASN1_D2I_Finish_nolen(a, func, e) \ + *pp=c.p; \ + if (a != NULL) (*a)=ret; \ + return(ret); \ +err:\ + ASN1_MAC_H_err((e),c.error,c.line); \ + asn1_add_error(*pp,(int)(c.q- *pp)); \ + if ((ret != NULL) && ((a == NULL) || (*a != ret))) func(ret); \ + return(NULL) + +# define M_ASN1_D2I_end_sequence() \ + (((c.inf&1) == 0)?(c.slen <= 0): \ + (c.eos=ASN1_const_check_infinite_end(&c.p,c.slen))) + +/* Don't use this with d2i_ASN1_BOOLEAN() */ +# define M_ASN1_D2I_get(b, func) \ + c.q=c.p; \ + if (func(&(b),&c.p,c.slen) == NULL) \ + {c.line=__LINE__; goto err; } \ + c.slen-=(c.p-c.q); + +/* Don't use this with d2i_ASN1_BOOLEAN() */ +# define M_ASN1_D2I_get_x(type,b,func) \ + c.q=c.p; \ + if (((D2I_OF(type))func)(&(b),&c.p,c.slen) == NULL) \ + {c.line=__LINE__; goto err; } \ + c.slen-=(c.p-c.q); + +/* use this instead () */ +# define M_ASN1_D2I_get_int(b,func) \ + c.q=c.p; \ + if (func(&(b),&c.p,c.slen) < 0) \ + {c.line=__LINE__; goto err; } \ + c.slen-=(c.p-c.q); + +# define M_ASN1_D2I_get_opt(b,func,type) \ + if ((c.slen != 0) && ((M_ASN1_next & (~V_ASN1_CONSTRUCTED)) \ + == (V_ASN1_UNIVERSAL|(type)))) \ + { \ + M_ASN1_D2I_get(b,func); \ + } + +# define M_ASN1_D2I_get_int_opt(b,func,type) \ + if ((c.slen != 0) && ((M_ASN1_next & (~V_ASN1_CONSTRUCTED)) \ + == (V_ASN1_UNIVERSAL|(type)))) \ + { \ + M_ASN1_D2I_get_int(b,func); \ + } + +# define M_ASN1_D2I_get_imp(b,func, type) \ + M_ASN1_next=(_tmp& V_ASN1_CONSTRUCTED)|type; \ + c.q=c.p; \ + if (func(&(b),&c.p,c.slen) == NULL) \ + {c.line=__LINE__; M_ASN1_next_prev = _tmp; goto err; } \ + c.slen-=(c.p-c.q);\ + M_ASN1_next_prev=_tmp; + +# define M_ASN1_D2I_get_IMP_opt(b,func,tag,type) \ + if ((c.slen != 0) && ((M_ASN1_next & (~V_ASN1_CONSTRUCTED)) == \ + (V_ASN1_CONTEXT_SPECIFIC|(tag)))) \ + { \ + unsigned char _tmp = M_ASN1_next; \ + M_ASN1_D2I_get_imp(b,func, type);\ + } + +# define M_ASN1_D2I_get_set(r,func,free_func) \ + M_ASN1_D2I_get_imp_set(r,func,free_func, \ + V_ASN1_SET,V_ASN1_UNIVERSAL); + +# define M_ASN1_D2I_get_set_type(type,r,func,free_func) \ + M_ASN1_D2I_get_imp_set_type(type,r,func,free_func, \ + V_ASN1_SET,V_ASN1_UNIVERSAL); + +# define M_ASN1_D2I_get_set_opt(r,func,free_func) \ + if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \ + V_ASN1_CONSTRUCTED|V_ASN1_SET)))\ + { M_ASN1_D2I_get_set(r,func,free_func); } + +# define M_ASN1_D2I_get_set_opt_type(type,r,func,free_func) \ + if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \ + V_ASN1_CONSTRUCTED|V_ASN1_SET)))\ + { M_ASN1_D2I_get_set_type(type,r,func,free_func); } + +# define M_ASN1_I2D_len_SET_opt(a,f) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + M_ASN1_I2D_len_SET(a,f); + +# define M_ASN1_I2D_put_SET_opt(a,f) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + M_ASN1_I2D_put_SET(a,f); + +# define M_ASN1_I2D_put_SEQUENCE_opt(a,f) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + M_ASN1_I2D_put_SEQUENCE(a,f); + +# define M_ASN1_I2D_put_SEQUENCE_opt_type(type,a,f) \ + if ((a != NULL) && (sk_##type##_num(a) != 0)) \ + M_ASN1_I2D_put_SEQUENCE_type(type,a,f); + +# define M_ASN1_D2I_get_IMP_set_opt(b,func,free_func,tag) \ + if ((c.slen != 0) && \ + (M_ASN1_next == \ + (V_ASN1_CONTEXT_SPECIFIC|V_ASN1_CONSTRUCTED|(tag))))\ + { \ + M_ASN1_D2I_get_imp_set(b,func,free_func,\ + tag,V_ASN1_CONTEXT_SPECIFIC); \ + } + +# define M_ASN1_D2I_get_IMP_set_opt_type(type,b,func,free_func,tag) \ + if ((c.slen != 0) && \ + (M_ASN1_next == \ + (V_ASN1_CONTEXT_SPECIFIC|V_ASN1_CONSTRUCTED|(tag))))\ + { \ + M_ASN1_D2I_get_imp_set_type(type,b,func,free_func,\ + tag,V_ASN1_CONTEXT_SPECIFIC); \ + } + +# define M_ASN1_D2I_get_seq(r,func,free_func) \ + M_ASN1_D2I_get_imp_set(r,func,free_func,\ + V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL); + +# define M_ASN1_D2I_get_seq_type(type,r,func,free_func) \ + M_ASN1_D2I_get_imp_set_type(type,r,func,free_func,\ + V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL) + +# define M_ASN1_D2I_get_seq_opt(r,func,free_func) \ + if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \ + V_ASN1_CONSTRUCTED|V_ASN1_SEQUENCE)))\ + { M_ASN1_D2I_get_seq(r,func,free_func); } + +# define M_ASN1_D2I_get_seq_opt_type(type,r,func,free_func) \ + if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \ + V_ASN1_CONSTRUCTED|V_ASN1_SEQUENCE)))\ + { M_ASN1_D2I_get_seq_type(type,r,func,free_func); } + +# define M_ASN1_D2I_get_IMP_set(r,func,free_func,x) \ + M_ASN1_D2I_get_imp_set(r,func,free_func,\ + x,V_ASN1_CONTEXT_SPECIFIC); + +# define M_ASN1_D2I_get_IMP_set_type(type,r,func,free_func,x) \ + M_ASN1_D2I_get_imp_set_type(type,r,func,free_func,\ + x,V_ASN1_CONTEXT_SPECIFIC); + +# define M_ASN1_D2I_get_imp_set(r,func,free_func,a,b) \ + c.q=c.p; \ + if (d2i_ASN1_SET(&(r),&c.p,c.slen,(char *(*)())func,\ + (void (*)())free_func,a,b) == NULL) \ + { c.line=__LINE__; goto err; } \ + c.slen-=(c.p-c.q); + +# define M_ASN1_D2I_get_imp_set_type(type,r,func,free_func,a,b) \ + c.q=c.p; \ + if (d2i_ASN1_SET_OF_##type(&(r),&c.p,c.slen,func,\ + free_func,a,b) == NULL) \ + { c.line=__LINE__; goto err; } \ + c.slen-=(c.p-c.q); + +# define M_ASN1_D2I_get_set_strings(r,func,a,b) \ + c.q=c.p; \ + if (d2i_ASN1_STRING_SET(&(r),&c.p,c.slen,a,b) == NULL) \ + { c.line=__LINE__; goto err; } \ + c.slen-=(c.p-c.q); + +# define M_ASN1_D2I_get_EXP_opt(r,func,tag) \ + if ((c.slen != 0L) && (M_ASN1_next == \ + (V_ASN1_CONSTRUCTED|V_ASN1_CONTEXT_SPECIFIC|tag))) \ + { \ + int Tinf,Ttag,Tclass; \ + long Tlen; \ + \ + c.q=c.p; \ + Tinf=ASN1_get_object(&c.p,&Tlen,&Ttag,&Tclass,c.slen); \ + if (Tinf & 0x80) \ + { c.error=ERR_R_BAD_ASN1_OBJECT_HEADER; \ + c.line=__LINE__; goto err; } \ + if (Tinf == (V_ASN1_CONSTRUCTED+1)) \ + Tlen = c.slen - (c.p - c.q) - 2; \ + if (func(&(r),&c.p,Tlen) == NULL) \ + { c.line=__LINE__; goto err; } \ + if (Tinf == (V_ASN1_CONSTRUCTED+1)) { \ + Tlen = c.slen - (c.p - c.q); \ + if(!ASN1_const_check_infinite_end(&c.p, Tlen)) \ + { c.error=ERR_R_MISSING_ASN1_EOS; \ + c.line=__LINE__; goto err; } \ + }\ + c.slen-=(c.p-c.q); \ + } + +# define M_ASN1_D2I_get_EXP_set_opt(r,func,free_func,tag,b) \ + if ((c.slen != 0) && (M_ASN1_next == \ + (V_ASN1_CONSTRUCTED|V_ASN1_CONTEXT_SPECIFIC|tag))) \ + { \ + int Tinf,Ttag,Tclass; \ + long Tlen; \ + \ + c.q=c.p; \ + Tinf=ASN1_get_object(&c.p,&Tlen,&Ttag,&Tclass,c.slen); \ + if (Tinf & 0x80) \ + { c.error=ERR_R_BAD_ASN1_OBJECT_HEADER; \ + c.line=__LINE__; goto err; } \ + if (Tinf == (V_ASN1_CONSTRUCTED+1)) \ + Tlen = c.slen - (c.p - c.q) - 2; \ + if (d2i_ASN1_SET(&(r),&c.p,Tlen,(char *(*)())func, \ + (void (*)())free_func, \ + b,V_ASN1_UNIVERSAL) == NULL) \ + { c.line=__LINE__; goto err; } \ + if (Tinf == (V_ASN1_CONSTRUCTED+1)) { \ + Tlen = c.slen - (c.p - c.q); \ + if(!ASN1_check_infinite_end(&c.p, Tlen)) \ + { c.error=ERR_R_MISSING_ASN1_EOS; \ + c.line=__LINE__; goto err; } \ + }\ + c.slen-=(c.p-c.q); \ + } + +# define M_ASN1_D2I_get_EXP_set_opt_type(type,r,func,free_func,tag,b) \ + if ((c.slen != 0) && (M_ASN1_next == \ + (V_ASN1_CONSTRUCTED|V_ASN1_CONTEXT_SPECIFIC|tag))) \ + { \ + int Tinf,Ttag,Tclass; \ + long Tlen; \ + \ + c.q=c.p; \ + Tinf=ASN1_get_object(&c.p,&Tlen,&Ttag,&Tclass,c.slen); \ + if (Tinf & 0x80) \ + { c.error=ERR_R_BAD_ASN1_OBJECT_HEADER; \ + c.line=__LINE__; goto err; } \ + if (Tinf == (V_ASN1_CONSTRUCTED+1)) \ + Tlen = c.slen - (c.p - c.q) - 2; \ + if (d2i_ASN1_SET_OF_##type(&(r),&c.p,Tlen,func, \ + free_func,b,V_ASN1_UNIVERSAL) == NULL) \ + { c.line=__LINE__; goto err; } \ + if (Tinf == (V_ASN1_CONSTRUCTED+1)) { \ + Tlen = c.slen - (c.p - c.q); \ + if(!ASN1_check_infinite_end(&c.p, Tlen)) \ + { c.error=ERR_R_MISSING_ASN1_EOS; \ + c.line=__LINE__; goto err; } \ + }\ + c.slen-=(c.p-c.q); \ + } + +/* New macros */ +# define M_ASN1_New_Malloc(ret,type) \ + if ((ret=(type *)OPENSSL_malloc(sizeof(type))) == NULL) \ + { c.line=__LINE__; goto err2; } + +# define M_ASN1_New(arg,func) \ + if (((arg)=func()) == NULL) return(NULL) + +# define M_ASN1_New_Error(a) \ +/*- err: ASN1_MAC_H_err((a),ERR_R_NESTED_ASN1_ERROR,c.line); \ + return(NULL);*/ \ + err2: ASN1_MAC_H_err((a),ERR_R_MALLOC_FAILURE,c.line); \ + return(NULL) + +/* + * BIG UGLY WARNING! This is so damn ugly I wanna puke. Unfortunately, some + * macros that use ASN1_const_CTX still insist on writing in the input + * stream. ARGH! ARGH! ARGH! Let's get rid of this macro package. Please? -- + * Richard Levitte + */ +# define M_ASN1_next (*((unsigned char *)(c.p))) +# define M_ASN1_next_prev (*((unsigned char *)(c.q))) + +/*************************************************/ + +# define M_ASN1_I2D_vars(a) int r=0,ret=0; \ + unsigned char *p; \ + if (a == NULL) return(0) + +/* Length Macros */ +# define M_ASN1_I2D_len(a,f) ret+=f(a,NULL) +# define M_ASN1_I2D_len_IMP_opt(a,f) if (a != NULL) M_ASN1_I2D_len(a,f) + +# define M_ASN1_I2D_len_SET(a,f) \ + ret+=i2d_ASN1_SET(a,NULL,f,V_ASN1_SET,V_ASN1_UNIVERSAL,IS_SET); + +# define M_ASN1_I2D_len_SET_type(type,a,f) \ + ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,V_ASN1_SET, \ + V_ASN1_UNIVERSAL,IS_SET); + +# define M_ASN1_I2D_len_SEQUENCE(a,f) \ + ret+=i2d_ASN1_SET(a,NULL,f,V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL, \ + IS_SEQUENCE); + +# define M_ASN1_I2D_len_SEQUENCE_type(type,a,f) \ + ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,V_ASN1_SEQUENCE, \ + V_ASN1_UNIVERSAL,IS_SEQUENCE) + +# define M_ASN1_I2D_len_SEQUENCE_opt(a,f) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + M_ASN1_I2D_len_SEQUENCE(a,f); + +# define M_ASN1_I2D_len_SEQUENCE_opt_type(type,a,f) \ + if ((a != NULL) && (sk_##type##_num(a) != 0)) \ + M_ASN1_I2D_len_SEQUENCE_type(type,a,f); + +# define M_ASN1_I2D_len_IMP_SET(a,f,x) \ + ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC,IS_SET); + +# define M_ASN1_I2D_len_IMP_SET_type(type,a,f,x) \ + ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,x, \ + V_ASN1_CONTEXT_SPECIFIC,IS_SET); + +# define M_ASN1_I2D_len_IMP_SET_opt(a,f,x) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC, \ + IS_SET); + +# define M_ASN1_I2D_len_IMP_SET_opt_type(type,a,f,x) \ + if ((a != NULL) && (sk_##type##_num(a) != 0)) \ + ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,x, \ + V_ASN1_CONTEXT_SPECIFIC,IS_SET); + +# define M_ASN1_I2D_len_IMP_SEQUENCE(a,f,x) \ + ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC, \ + IS_SEQUENCE); + +# define M_ASN1_I2D_len_IMP_SEQUENCE_opt(a,f,x) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC, \ + IS_SEQUENCE); + +# define M_ASN1_I2D_len_IMP_SEQUENCE_opt_type(type,a,f,x) \ + if ((a != NULL) && (sk_##type##_num(a) != 0)) \ + ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,x, \ + V_ASN1_CONTEXT_SPECIFIC, \ + IS_SEQUENCE); + +# define M_ASN1_I2D_len_EXP_opt(a,f,mtag,v) \ + if (a != NULL)\ + { \ + v=f(a,NULL); \ + ret+=ASN1_object_size(1,v,mtag); \ + } + +# define M_ASN1_I2D_len_EXP_SET_opt(a,f,mtag,tag,v) \ + if ((a != NULL) && (sk_num(a) != 0))\ + { \ + v=i2d_ASN1_SET(a,NULL,f,tag,V_ASN1_UNIVERSAL,IS_SET); \ + ret+=ASN1_object_size(1,v,mtag); \ + } + +# define M_ASN1_I2D_len_EXP_SEQUENCE_opt(a,f,mtag,tag,v) \ + if ((a != NULL) && (sk_num(a) != 0))\ + { \ + v=i2d_ASN1_SET(a,NULL,f,tag,V_ASN1_UNIVERSAL, \ + IS_SEQUENCE); \ + ret+=ASN1_object_size(1,v,mtag); \ + } + +# define M_ASN1_I2D_len_EXP_SEQUENCE_opt_type(type,a,f,mtag,tag,v) \ + if ((a != NULL) && (sk_##type##_num(a) != 0))\ + { \ + v=i2d_ASN1_SET_OF_##type(a,NULL,f,tag, \ + V_ASN1_UNIVERSAL, \ + IS_SEQUENCE); \ + ret+=ASN1_object_size(1,v,mtag); \ + } + +/* Put Macros */ +# define M_ASN1_I2D_put(a,f) f(a,&p) + +# define M_ASN1_I2D_put_IMP_opt(a,f,t) \ + if (a != NULL) \ + { \ + unsigned char *q=p; \ + f(a,&p); \ + *q=(V_ASN1_CONTEXT_SPECIFIC|t|(*q&V_ASN1_CONSTRUCTED));\ + } + +# define M_ASN1_I2D_put_SET(a,f) i2d_ASN1_SET(a,&p,f,V_ASN1_SET,\ + V_ASN1_UNIVERSAL,IS_SET) +# define M_ASN1_I2D_put_SET_type(type,a,f) \ + i2d_ASN1_SET_OF_##type(a,&p,f,V_ASN1_SET,V_ASN1_UNIVERSAL,IS_SET) +# define M_ASN1_I2D_put_IMP_SET(a,f,x) i2d_ASN1_SET(a,&p,f,x,\ + V_ASN1_CONTEXT_SPECIFIC,IS_SET) +# define M_ASN1_I2D_put_IMP_SET_type(type,a,f,x) \ + i2d_ASN1_SET_OF_##type(a,&p,f,x,V_ASN1_CONTEXT_SPECIFIC,IS_SET) +# define M_ASN1_I2D_put_IMP_SEQUENCE(a,f,x) i2d_ASN1_SET(a,&p,f,x,\ + V_ASN1_CONTEXT_SPECIFIC,IS_SEQUENCE) + +# define M_ASN1_I2D_put_SEQUENCE(a,f) i2d_ASN1_SET(a,&p,f,V_ASN1_SEQUENCE,\ + V_ASN1_UNIVERSAL,IS_SEQUENCE) + +# define M_ASN1_I2D_put_SEQUENCE_type(type,a,f) \ + i2d_ASN1_SET_OF_##type(a,&p,f,V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL, \ + IS_SEQUENCE) + +# define M_ASN1_I2D_put_SEQUENCE_opt(a,f) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + M_ASN1_I2D_put_SEQUENCE(a,f); + +# define M_ASN1_I2D_put_IMP_SET_opt(a,f,x) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + { i2d_ASN1_SET(a,&p,f,x,V_ASN1_CONTEXT_SPECIFIC, \ + IS_SET); } + +# define M_ASN1_I2D_put_IMP_SET_opt_type(type,a,f,x) \ + if ((a != NULL) && (sk_##type##_num(a) != 0)) \ + { i2d_ASN1_SET_OF_##type(a,&p,f,x, \ + V_ASN1_CONTEXT_SPECIFIC, \ + IS_SET); } + +# define M_ASN1_I2D_put_IMP_SEQUENCE_opt(a,f,x) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + { i2d_ASN1_SET(a,&p,f,x,V_ASN1_CONTEXT_SPECIFIC, \ + IS_SEQUENCE); } + +# define M_ASN1_I2D_put_IMP_SEQUENCE_opt_type(type,a,f,x) \ + if ((a != NULL) && (sk_##type##_num(a) != 0)) \ + { i2d_ASN1_SET_OF_##type(a,&p,f,x, \ + V_ASN1_CONTEXT_SPECIFIC, \ + IS_SEQUENCE); } + +# define M_ASN1_I2D_put_EXP_opt(a,f,tag,v) \ + if (a != NULL) \ + { \ + ASN1_put_object(&p,1,v,tag,V_ASN1_CONTEXT_SPECIFIC); \ + f(a,&p); \ + } + +# define M_ASN1_I2D_put_EXP_SET_opt(a,f,mtag,tag,v) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + { \ + ASN1_put_object(&p,1,v,mtag,V_ASN1_CONTEXT_SPECIFIC); \ + i2d_ASN1_SET(a,&p,f,tag,V_ASN1_UNIVERSAL,IS_SET); \ + } + +# define M_ASN1_I2D_put_EXP_SEQUENCE_opt(a,f,mtag,tag,v) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + { \ + ASN1_put_object(&p,1,v,mtag,V_ASN1_CONTEXT_SPECIFIC); \ + i2d_ASN1_SET(a,&p,f,tag,V_ASN1_UNIVERSAL,IS_SEQUENCE); \ + } + +# define M_ASN1_I2D_put_EXP_SEQUENCE_opt_type(type,a,f,mtag,tag,v) \ + if ((a != NULL) && (sk_##type##_num(a) != 0)) \ + { \ + ASN1_put_object(&p,1,v,mtag,V_ASN1_CONTEXT_SPECIFIC); \ + i2d_ASN1_SET_OF_##type(a,&p,f,tag,V_ASN1_UNIVERSAL, \ + IS_SEQUENCE); \ + } + +# define M_ASN1_I2D_seq_total() \ + r=ASN1_object_size(1,ret,V_ASN1_SEQUENCE); \ + if (pp == NULL) return(r); \ + p= *pp; \ + ASN1_put_object(&p,1,ret,V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL) + +# define M_ASN1_I2D_INF_seq_start(tag,ctx) \ + *(p++)=(V_ASN1_CONSTRUCTED|(tag)|(ctx)); \ + *(p++)=0x80 + +# define M_ASN1_I2D_INF_seq_end() *(p++)=0x00; *(p++)=0x00 + +# define M_ASN1_I2D_finish() *pp=p; \ + return(r); + +int asn1_GetSequence(ASN1_const_CTX *c, long *length); +void asn1_add_error(const unsigned char *address, int offset); +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/asn1t.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/asn1t.h new file mode 100644 index 0000000..99bc0ee --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/asn1t.h @@ -0,0 +1,973 @@ +/* asn1t.h */ +/* + * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project + * 2000. + */ +/* ==================================================================== + * Copyright (c) 2000-2005 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +#ifndef HEADER_ASN1T_H +# define HEADER_ASN1T_H + +# include +# include +# include + +# ifdef OPENSSL_BUILD_SHLIBCRYPTO +# undef OPENSSL_EXTERN +# define OPENSSL_EXTERN OPENSSL_EXPORT +# endif + +/* ASN1 template defines, structures and functions */ + +#ifdef __cplusplus +extern "C" { +#endif + +# ifndef OPENSSL_EXPORT_VAR_AS_FUNCTION + +/* Macro to obtain ASN1_ADB pointer from a type (only used internally) */ +# define ASN1_ADB_ptr(iptr) ((const ASN1_ADB *)(iptr)) + +/* Macros for start and end of ASN1_ITEM definition */ + +# define ASN1_ITEM_start(itname) \ + OPENSSL_GLOBAL const ASN1_ITEM itname##_it = { + +# define ASN1_ITEM_end(itname) \ + }; + +# else + +/* Macro to obtain ASN1_ADB pointer from a type (only used internally) */ +# define ASN1_ADB_ptr(iptr) ((const ASN1_ADB *)(iptr())) + +/* Macros for start and end of ASN1_ITEM definition */ + +# define ASN1_ITEM_start(itname) \ + const ASN1_ITEM * itname##_it(void) \ + { \ + static const ASN1_ITEM local_it = { + +# define ASN1_ITEM_end(itname) \ + }; \ + return &local_it; \ + } + +# endif + +/* Macros to aid ASN1 template writing */ + +# define ASN1_ITEM_TEMPLATE(tname) \ + static const ASN1_TEMPLATE tname##_item_tt + +# define ASN1_ITEM_TEMPLATE_END(tname) \ + ;\ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_PRIMITIVE,\ + -1,\ + &tname##_item_tt,\ + 0,\ + NULL,\ + 0,\ + #tname \ + ASN1_ITEM_end(tname) + +/* This is a ASN1 type which just embeds a template */ + +/*- + * This pair helps declare a SEQUENCE. We can do: + * + * ASN1_SEQUENCE(stname) = { + * ... SEQUENCE components ... + * } ASN1_SEQUENCE_END(stname) + * + * This will produce an ASN1_ITEM called stname_it + * for a structure called stname. + * + * If you want the same structure but a different + * name then use: + * + * ASN1_SEQUENCE(itname) = { + * ... SEQUENCE components ... + * } ASN1_SEQUENCE_END_name(stname, itname) + * + * This will create an item called itname_it using + * a structure called stname. + */ + +# define ASN1_SEQUENCE(tname) \ + static const ASN1_TEMPLATE tname##_seq_tt[] + +# define ASN1_SEQUENCE_END(stname) ASN1_SEQUENCE_END_name(stname, stname) + +# define ASN1_SEQUENCE_END_name(stname, tname) \ + ;\ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_SEQUENCE,\ + V_ASN1_SEQUENCE,\ + tname##_seq_tt,\ + sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ + NULL,\ + sizeof(stname),\ + #stname \ + ASN1_ITEM_end(tname) + +# define ASN1_NDEF_SEQUENCE(tname) \ + ASN1_SEQUENCE(tname) + +# define ASN1_NDEF_SEQUENCE_cb(tname, cb) \ + ASN1_SEQUENCE_cb(tname, cb) + +# define ASN1_SEQUENCE_cb(tname, cb) \ + static const ASN1_AUX tname##_aux = {NULL, 0, 0, 0, cb, 0}; \ + ASN1_SEQUENCE(tname) + +# define ASN1_BROKEN_SEQUENCE(tname) \ + static const ASN1_AUX tname##_aux = {NULL, ASN1_AFLG_BROKEN, 0, 0, 0, 0}; \ + ASN1_SEQUENCE(tname) + +# define ASN1_SEQUENCE_ref(tname, cb, lck) \ + static const ASN1_AUX tname##_aux = {NULL, ASN1_AFLG_REFCOUNT, offsetof(tname, references), lck, cb, 0}; \ + ASN1_SEQUENCE(tname) + +# define ASN1_SEQUENCE_enc(tname, enc, cb) \ + static const ASN1_AUX tname##_aux = {NULL, ASN1_AFLG_ENCODING, 0, 0, cb, offsetof(tname, enc)}; \ + ASN1_SEQUENCE(tname) + +# define ASN1_NDEF_SEQUENCE_END(tname) \ + ;\ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_NDEF_SEQUENCE,\ + V_ASN1_SEQUENCE,\ + tname##_seq_tt,\ + sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ + NULL,\ + sizeof(tname),\ + #tname \ + ASN1_ITEM_end(tname) + +# define ASN1_BROKEN_SEQUENCE_END(stname) ASN1_SEQUENCE_END_ref(stname, stname) + +# define ASN1_SEQUENCE_END_enc(stname, tname) ASN1_SEQUENCE_END_ref(stname, tname) + +# define ASN1_SEQUENCE_END_cb(stname, tname) ASN1_SEQUENCE_END_ref(stname, tname) + +# define ASN1_SEQUENCE_END_ref(stname, tname) \ + ;\ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_SEQUENCE,\ + V_ASN1_SEQUENCE,\ + tname##_seq_tt,\ + sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ + &tname##_aux,\ + sizeof(stname),\ + #stname \ + ASN1_ITEM_end(tname) + +# define ASN1_NDEF_SEQUENCE_END_cb(stname, tname) \ + ;\ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_NDEF_SEQUENCE,\ + V_ASN1_SEQUENCE,\ + tname##_seq_tt,\ + sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ + &tname##_aux,\ + sizeof(stname),\ + #stname \ + ASN1_ITEM_end(tname) + +/*- + * This pair helps declare a CHOICE type. We can do: + * + * ASN1_CHOICE(chname) = { + * ... CHOICE options ... + * ASN1_CHOICE_END(chname) + * + * This will produce an ASN1_ITEM called chname_it + * for a structure called chname. The structure + * definition must look like this: + * typedef struct { + * int type; + * union { + * ASN1_SOMETHING *opt1; + * ASN1_SOMEOTHER *opt2; + * } value; + * } chname; + * + * the name of the selector must be 'type'. + * to use an alternative selector name use the + * ASN1_CHOICE_END_selector() version. + */ + +# define ASN1_CHOICE(tname) \ + static const ASN1_TEMPLATE tname##_ch_tt[] + +# define ASN1_CHOICE_cb(tname, cb) \ + static const ASN1_AUX tname##_aux = {NULL, 0, 0, 0, cb, 0}; \ + ASN1_CHOICE(tname) + +# define ASN1_CHOICE_END(stname) ASN1_CHOICE_END_name(stname, stname) + +# define ASN1_CHOICE_END_name(stname, tname) ASN1_CHOICE_END_selector(stname, tname, type) + +# define ASN1_CHOICE_END_selector(stname, tname, selname) \ + ;\ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_CHOICE,\ + offsetof(stname,selname) ,\ + tname##_ch_tt,\ + sizeof(tname##_ch_tt) / sizeof(ASN1_TEMPLATE),\ + NULL,\ + sizeof(stname),\ + #stname \ + ASN1_ITEM_end(tname) + +# define ASN1_CHOICE_END_cb(stname, tname, selname) \ + ;\ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_CHOICE,\ + offsetof(stname,selname) ,\ + tname##_ch_tt,\ + sizeof(tname##_ch_tt) / sizeof(ASN1_TEMPLATE),\ + &tname##_aux,\ + sizeof(stname),\ + #stname \ + ASN1_ITEM_end(tname) + +/* This helps with the template wrapper form of ASN1_ITEM */ + +# define ASN1_EX_TEMPLATE_TYPE(flags, tag, name, type) { \ + (flags), (tag), 0,\ + #name, ASN1_ITEM_ref(type) } + +/* These help with SEQUENCE or CHOICE components */ + +/* used to declare other types */ + +# define ASN1_EX_TYPE(flags, tag, stname, field, type) { \ + (flags), (tag), offsetof(stname, field),\ + #field, ASN1_ITEM_ref(type) } + +/* used when the structure is combined with the parent */ + +# define ASN1_EX_COMBINE(flags, tag, type) { \ + (flags)|ASN1_TFLG_COMBINE, (tag), 0, NULL, ASN1_ITEM_ref(type) } + +/* implicit and explicit helper macros */ + +# define ASN1_IMP_EX(stname, field, type, tag, ex) \ + ASN1_EX_TYPE(ASN1_TFLG_IMPLICIT | ex, tag, stname, field, type) + +# define ASN1_EXP_EX(stname, field, type, tag, ex) \ + ASN1_EX_TYPE(ASN1_TFLG_EXPLICIT | ex, tag, stname, field, type) + +/* Any defined by macros: the field used is in the table itself */ + +# ifndef OPENSSL_EXPORT_VAR_AS_FUNCTION +# define ASN1_ADB_OBJECT(tblname) { ASN1_TFLG_ADB_OID, -1, 0, #tblname, (const ASN1_ITEM *)&(tblname##_adb) } +# define ASN1_ADB_INTEGER(tblname) { ASN1_TFLG_ADB_INT, -1, 0, #tblname, (const ASN1_ITEM *)&(tblname##_adb) } +# else +# define ASN1_ADB_OBJECT(tblname) { ASN1_TFLG_ADB_OID, -1, 0, #tblname, tblname##_adb } +# define ASN1_ADB_INTEGER(tblname) { ASN1_TFLG_ADB_INT, -1, 0, #tblname, tblname##_adb } +# endif +/* Plain simple type */ +# define ASN1_SIMPLE(stname, field, type) ASN1_EX_TYPE(0,0, stname, field, type) + +/* OPTIONAL simple type */ +# define ASN1_OPT(stname, field, type) ASN1_EX_TYPE(ASN1_TFLG_OPTIONAL, 0, stname, field, type) + +/* IMPLICIT tagged simple type */ +# define ASN1_IMP(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, 0) + +/* IMPLICIT tagged OPTIONAL simple type */ +# define ASN1_IMP_OPT(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL) + +/* Same as above but EXPLICIT */ + +# define ASN1_EXP(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, 0) +# define ASN1_EXP_OPT(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL) + +/* SEQUENCE OF type */ +# define ASN1_SEQUENCE_OF(stname, field, type) \ + ASN1_EX_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, stname, field, type) + +/* OPTIONAL SEQUENCE OF */ +# define ASN1_SEQUENCE_OF_OPT(stname, field, type) \ + ASN1_EX_TYPE(ASN1_TFLG_SEQUENCE_OF|ASN1_TFLG_OPTIONAL, 0, stname, field, type) + +/* Same as above but for SET OF */ + +# define ASN1_SET_OF(stname, field, type) \ + ASN1_EX_TYPE(ASN1_TFLG_SET_OF, 0, stname, field, type) + +# define ASN1_SET_OF_OPT(stname, field, type) \ + ASN1_EX_TYPE(ASN1_TFLG_SET_OF|ASN1_TFLG_OPTIONAL, 0, stname, field, type) + +/* Finally compound types of SEQUENCE, SET, IMPLICIT, EXPLICIT and OPTIONAL */ + +# define ASN1_IMP_SET_OF(stname, field, type, tag) \ + ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF) + +# define ASN1_EXP_SET_OF(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF) + +# define ASN1_IMP_SET_OF_OPT(stname, field, type, tag) \ + ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF|ASN1_TFLG_OPTIONAL) + +# define ASN1_EXP_SET_OF_OPT(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF|ASN1_TFLG_OPTIONAL) + +# define ASN1_IMP_SEQUENCE_OF(stname, field, type, tag) \ + ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF) + +# define ASN1_IMP_SEQUENCE_OF_OPT(stname, field, type, tag) \ + ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF|ASN1_TFLG_OPTIONAL) + +# define ASN1_EXP_SEQUENCE_OF(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF) + +# define ASN1_EXP_SEQUENCE_OF_OPT(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF|ASN1_TFLG_OPTIONAL) + +/* EXPLICIT using indefinite length constructed form */ +# define ASN1_NDEF_EXP(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_NDEF) + +/* EXPLICIT OPTIONAL using indefinite length constructed form */ +# define ASN1_NDEF_EXP_OPT(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL|ASN1_TFLG_NDEF) + +/* Macros for the ASN1_ADB structure */ + +# define ASN1_ADB(name) \ + static const ASN1_ADB_TABLE name##_adbtbl[] + +# ifndef OPENSSL_EXPORT_VAR_AS_FUNCTION + +# define ASN1_ADB_END(name, flags, field, app_table, def, none) \ + ;\ + static const ASN1_ADB name##_adb = {\ + flags,\ + offsetof(name, field),\ + app_table,\ + name##_adbtbl,\ + sizeof(name##_adbtbl) / sizeof(ASN1_ADB_TABLE),\ + def,\ + none\ + } + +# else + +# define ASN1_ADB_END(name, flags, field, app_table, def, none) \ + ;\ + static const ASN1_ITEM *name##_adb(void) \ + { \ + static const ASN1_ADB internal_adb = \ + {\ + flags,\ + offsetof(name, field),\ + app_table,\ + name##_adbtbl,\ + sizeof(name##_adbtbl) / sizeof(ASN1_ADB_TABLE),\ + def,\ + none\ + }; \ + return (const ASN1_ITEM *) &internal_adb; \ + } \ + void dummy_function(void) + +# endif + +# define ADB_ENTRY(val, template) {val, template} + +# define ASN1_ADB_TEMPLATE(name) \ + static const ASN1_TEMPLATE name##_tt + +/* + * This is the ASN1 template structure that defines a wrapper round the + * actual type. It determines the actual position of the field in the value + * structure, various flags such as OPTIONAL and the field name. + */ + +struct ASN1_TEMPLATE_st { + unsigned long flags; /* Various flags */ + long tag; /* tag, not used if no tagging */ + unsigned long offset; /* Offset of this field in structure */ +# ifndef NO_ASN1_FIELD_NAMES + const char *field_name; /* Field name */ +# endif + ASN1_ITEM_EXP *item; /* Relevant ASN1_ITEM or ASN1_ADB */ +}; + +/* Macro to extract ASN1_ITEM and ASN1_ADB pointer from ASN1_TEMPLATE */ + +# define ASN1_TEMPLATE_item(t) (t->item_ptr) +# define ASN1_TEMPLATE_adb(t) (t->item_ptr) + +typedef struct ASN1_ADB_TABLE_st ASN1_ADB_TABLE; +typedef struct ASN1_ADB_st ASN1_ADB; + +struct ASN1_ADB_st { + unsigned long flags; /* Various flags */ + unsigned long offset; /* Offset of selector field */ + STACK_OF(ASN1_ADB_TABLE) **app_items; /* Application defined items */ + const ASN1_ADB_TABLE *tbl; /* Table of possible types */ + long tblcount; /* Number of entries in tbl */ + const ASN1_TEMPLATE *default_tt; /* Type to use if no match */ + const ASN1_TEMPLATE *null_tt; /* Type to use if selector is NULL */ +}; + +struct ASN1_ADB_TABLE_st { + long value; /* NID for an object or value for an int */ + const ASN1_TEMPLATE tt; /* item for this value */ +}; + +/* template flags */ + +/* Field is optional */ +# define ASN1_TFLG_OPTIONAL (0x1) + +/* Field is a SET OF */ +# define ASN1_TFLG_SET_OF (0x1 << 1) + +/* Field is a SEQUENCE OF */ +# define ASN1_TFLG_SEQUENCE_OF (0x2 << 1) + +/* + * Special case: this refers to a SET OF that will be sorted into DER order + * when encoded *and* the corresponding STACK will be modified to match the + * new order. + */ +# define ASN1_TFLG_SET_ORDER (0x3 << 1) + +/* Mask for SET OF or SEQUENCE OF */ +# define ASN1_TFLG_SK_MASK (0x3 << 1) + +/* + * These flags mean the tag should be taken from the tag field. If EXPLICIT + * then the underlying type is used for the inner tag. + */ + +/* IMPLICIT tagging */ +# define ASN1_TFLG_IMPTAG (0x1 << 3) + +/* EXPLICIT tagging, inner tag from underlying type */ +# define ASN1_TFLG_EXPTAG (0x2 << 3) + +# define ASN1_TFLG_TAG_MASK (0x3 << 3) + +/* context specific IMPLICIT */ +# define ASN1_TFLG_IMPLICIT ASN1_TFLG_IMPTAG|ASN1_TFLG_CONTEXT + +/* context specific EXPLICIT */ +# define ASN1_TFLG_EXPLICIT ASN1_TFLG_EXPTAG|ASN1_TFLG_CONTEXT + +/* + * If tagging is in force these determine the type of tag to use. Otherwise + * the tag is determined by the underlying type. These values reflect the + * actual octet format. + */ + +/* Universal tag */ +# define ASN1_TFLG_UNIVERSAL (0x0<<6) +/* Application tag */ +# define ASN1_TFLG_APPLICATION (0x1<<6) +/* Context specific tag */ +# define ASN1_TFLG_CONTEXT (0x2<<6) +/* Private tag */ +# define ASN1_TFLG_PRIVATE (0x3<<6) + +# define ASN1_TFLG_TAG_CLASS (0x3<<6) + +/* + * These are for ANY DEFINED BY type. In this case the 'item' field points to + * an ASN1_ADB structure which contains a table of values to decode the + * relevant type + */ + +# define ASN1_TFLG_ADB_MASK (0x3<<8) + +# define ASN1_TFLG_ADB_OID (0x1<<8) + +# define ASN1_TFLG_ADB_INT (0x1<<9) + +/* + * This flag means a parent structure is passed instead of the field: this is + * useful is a SEQUENCE is being combined with a CHOICE for example. Since + * this means the structure and item name will differ we need to use the + * ASN1_CHOICE_END_name() macro for example. + */ + +# define ASN1_TFLG_COMBINE (0x1<<10) + +/* + * This flag when present in a SEQUENCE OF, SET OF or EXPLICIT causes + * indefinite length constructed encoding to be used if required. + */ + +# define ASN1_TFLG_NDEF (0x1<<11) + +/* This is the actual ASN1 item itself */ + +struct ASN1_ITEM_st { + char itype; /* The item type, primitive, SEQUENCE, CHOICE + * or extern */ + long utype; /* underlying type */ + const ASN1_TEMPLATE *templates; /* If SEQUENCE or CHOICE this contains + * the contents */ + long tcount; /* Number of templates if SEQUENCE or CHOICE */ + const void *funcs; /* functions that handle this type */ + long size; /* Structure size (usually) */ +# ifndef NO_ASN1_FIELD_NAMES + const char *sname; /* Structure name */ +# endif +}; + +/*- + * These are values for the itype field and + * determine how the type is interpreted. + * + * For PRIMITIVE types the underlying type + * determines the behaviour if items is NULL. + * + * Otherwise templates must contain a single + * template and the type is treated in the + * same way as the type specified in the template. + * + * For SEQUENCE types the templates field points + * to the members, the size field is the + * structure size. + * + * For CHOICE types the templates field points + * to each possible member (typically a union) + * and the 'size' field is the offset of the + * selector. + * + * The 'funcs' field is used for application + * specific functions. + * + * For COMPAT types the funcs field gives a + * set of functions that handle this type, this + * supports the old d2i, i2d convention. + * + * The EXTERN type uses a new style d2i/i2d. + * The new style should be used where possible + * because it avoids things like the d2i IMPLICIT + * hack. + * + * MSTRING is a multiple string type, it is used + * for a CHOICE of character strings where the + * actual strings all occupy an ASN1_STRING + * structure. In this case the 'utype' field + * has a special meaning, it is used as a mask + * of acceptable types using the B_ASN1 constants. + * + * NDEF_SEQUENCE is the same as SEQUENCE except + * that it will use indefinite length constructed + * encoding if requested. + * + */ + +# define ASN1_ITYPE_PRIMITIVE 0x0 + +# define ASN1_ITYPE_SEQUENCE 0x1 + +# define ASN1_ITYPE_CHOICE 0x2 + +# define ASN1_ITYPE_COMPAT 0x3 + +# define ASN1_ITYPE_EXTERN 0x4 + +# define ASN1_ITYPE_MSTRING 0x5 + +# define ASN1_ITYPE_NDEF_SEQUENCE 0x6 + +/* + * Cache for ASN1 tag and length, so we don't keep re-reading it for things + * like CHOICE + */ + +struct ASN1_TLC_st { + char valid; /* Values below are valid */ + int ret; /* return value */ + long plen; /* length */ + int ptag; /* class value */ + int pclass; /* class value */ + int hdrlen; /* header length */ +}; + +/* Typedefs for ASN1 function pointers */ + +typedef ASN1_VALUE *ASN1_new_func(void); +typedef void ASN1_free_func(ASN1_VALUE *a); +typedef ASN1_VALUE *ASN1_d2i_func(ASN1_VALUE **a, const unsigned char **in, + long length); +typedef int ASN1_i2d_func(ASN1_VALUE *a, unsigned char **in); + +typedef int ASN1_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, + const ASN1_ITEM *it, int tag, int aclass, char opt, + ASN1_TLC *ctx); + +typedef int ASN1_ex_i2d(ASN1_VALUE **pval, unsigned char **out, + const ASN1_ITEM *it, int tag, int aclass); +typedef int ASN1_ex_new_func(ASN1_VALUE **pval, const ASN1_ITEM *it); +typedef void ASN1_ex_free_func(ASN1_VALUE **pval, const ASN1_ITEM *it); + +typedef int ASN1_ex_print_func(BIO *out, ASN1_VALUE **pval, + int indent, const char *fname, + const ASN1_PCTX *pctx); + +typedef int ASN1_primitive_i2c(ASN1_VALUE **pval, unsigned char *cont, + int *putype, const ASN1_ITEM *it); +typedef int ASN1_primitive_c2i(ASN1_VALUE **pval, const unsigned char *cont, + int len, int utype, char *free_cont, + const ASN1_ITEM *it); +typedef int ASN1_primitive_print(BIO *out, ASN1_VALUE **pval, + const ASN1_ITEM *it, int indent, + const ASN1_PCTX *pctx); + +typedef struct ASN1_COMPAT_FUNCS_st { + ASN1_new_func *asn1_new; + ASN1_free_func *asn1_free; + ASN1_d2i_func *asn1_d2i; + ASN1_i2d_func *asn1_i2d; +} ASN1_COMPAT_FUNCS; + +typedef struct ASN1_EXTERN_FUNCS_st { + void *app_data; + ASN1_ex_new_func *asn1_ex_new; + ASN1_ex_free_func *asn1_ex_free; + ASN1_ex_free_func *asn1_ex_clear; + ASN1_ex_d2i *asn1_ex_d2i; + ASN1_ex_i2d *asn1_ex_i2d; + ASN1_ex_print_func *asn1_ex_print; +} ASN1_EXTERN_FUNCS; + +typedef struct ASN1_PRIMITIVE_FUNCS_st { + void *app_data; + unsigned long flags; + ASN1_ex_new_func *prim_new; + ASN1_ex_free_func *prim_free; + ASN1_ex_free_func *prim_clear; + ASN1_primitive_c2i *prim_c2i; + ASN1_primitive_i2c *prim_i2c; + ASN1_primitive_print *prim_print; +} ASN1_PRIMITIVE_FUNCS; + +/* + * This is the ASN1_AUX structure: it handles various miscellaneous + * requirements. For example the use of reference counts and an informational + * callback. The "informational callback" is called at various points during + * the ASN1 encoding and decoding. It can be used to provide minor + * customisation of the structures used. This is most useful where the + * supplied routines *almost* do the right thing but need some extra help at + * a few points. If the callback returns zero then it is assumed a fatal + * error has occurred and the main operation should be abandoned. If major + * changes in the default behaviour are required then an external type is + * more appropriate. + */ + +typedef int ASN1_aux_cb(int operation, ASN1_VALUE **in, const ASN1_ITEM *it, + void *exarg); + +typedef struct ASN1_AUX_st { + void *app_data; + int flags; + int ref_offset; /* Offset of reference value */ + int ref_lock; /* Lock type to use */ + ASN1_aux_cb *asn1_cb; + int enc_offset; /* Offset of ASN1_ENCODING structure */ +} ASN1_AUX; + +/* For print related callbacks exarg points to this structure */ +typedef struct ASN1_PRINT_ARG_st { + BIO *out; + int indent; + const ASN1_PCTX *pctx; +} ASN1_PRINT_ARG; + +/* For streaming related callbacks exarg points to this structure */ +typedef struct ASN1_STREAM_ARG_st { + /* BIO to stream through */ + BIO *out; + /* BIO with filters appended */ + BIO *ndef_bio; + /* Streaming I/O boundary */ + unsigned char **boundary; +} ASN1_STREAM_ARG; + +/* Flags in ASN1_AUX */ + +/* Use a reference count */ +# define ASN1_AFLG_REFCOUNT 1 +/* Save the encoding of structure (useful for signatures) */ +# define ASN1_AFLG_ENCODING 2 +/* The Sequence length is invalid */ +# define ASN1_AFLG_BROKEN 4 + +/* operation values for asn1_cb */ + +# define ASN1_OP_NEW_PRE 0 +# define ASN1_OP_NEW_POST 1 +# define ASN1_OP_FREE_PRE 2 +# define ASN1_OP_FREE_POST 3 +# define ASN1_OP_D2I_PRE 4 +# define ASN1_OP_D2I_POST 5 +# define ASN1_OP_I2D_PRE 6 +# define ASN1_OP_I2D_POST 7 +# define ASN1_OP_PRINT_PRE 8 +# define ASN1_OP_PRINT_POST 9 +# define ASN1_OP_STREAM_PRE 10 +# define ASN1_OP_STREAM_POST 11 +# define ASN1_OP_DETACHED_PRE 12 +# define ASN1_OP_DETACHED_POST 13 + +/* Macro to implement a primitive type */ +# define IMPLEMENT_ASN1_TYPE(stname) IMPLEMENT_ASN1_TYPE_ex(stname, stname, 0) +# define IMPLEMENT_ASN1_TYPE_ex(itname, vname, ex) \ + ASN1_ITEM_start(itname) \ + ASN1_ITYPE_PRIMITIVE, V_##vname, NULL, 0, NULL, ex, #itname \ + ASN1_ITEM_end(itname) + +/* Macro to implement a multi string type */ +# define IMPLEMENT_ASN1_MSTRING(itname, mask) \ + ASN1_ITEM_start(itname) \ + ASN1_ITYPE_MSTRING, mask, NULL, 0, NULL, sizeof(ASN1_STRING), #itname \ + ASN1_ITEM_end(itname) + +/* Macro to implement an ASN1_ITEM in terms of old style funcs */ + +# define IMPLEMENT_COMPAT_ASN1(sname) IMPLEMENT_COMPAT_ASN1_type(sname, V_ASN1_SEQUENCE) + +# define IMPLEMENT_COMPAT_ASN1_type(sname, tag) \ + static const ASN1_COMPAT_FUNCS sname##_ff = { \ + (ASN1_new_func *)sname##_new, \ + (ASN1_free_func *)sname##_free, \ + (ASN1_d2i_func *)d2i_##sname, \ + (ASN1_i2d_func *)i2d_##sname, \ + }; \ + ASN1_ITEM_start(sname) \ + ASN1_ITYPE_COMPAT, \ + tag, \ + NULL, \ + 0, \ + &sname##_ff, \ + 0, \ + #sname \ + ASN1_ITEM_end(sname) + +# define IMPLEMENT_EXTERN_ASN1(sname, tag, fptrs) \ + ASN1_ITEM_start(sname) \ + ASN1_ITYPE_EXTERN, \ + tag, \ + NULL, \ + 0, \ + &fptrs, \ + 0, \ + #sname \ + ASN1_ITEM_end(sname) + +/* Macro to implement standard functions in terms of ASN1_ITEM structures */ + +# define IMPLEMENT_ASN1_FUNCTIONS(stname) IMPLEMENT_ASN1_FUNCTIONS_fname(stname, stname, stname) + +# define IMPLEMENT_ASN1_FUNCTIONS_name(stname, itname) IMPLEMENT_ASN1_FUNCTIONS_fname(stname, itname, itname) + +# define IMPLEMENT_ASN1_FUNCTIONS_ENCODE_name(stname, itname) \ + IMPLEMENT_ASN1_FUNCTIONS_ENCODE_fname(stname, itname, itname) + +# define IMPLEMENT_STATIC_ASN1_ALLOC_FUNCTIONS(stname) \ + IMPLEMENT_ASN1_ALLOC_FUNCTIONS_pfname(static, stname, stname, stname) + +# define IMPLEMENT_ASN1_ALLOC_FUNCTIONS(stname) \ + IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, stname, stname) + +# define IMPLEMENT_ASN1_ALLOC_FUNCTIONS_pfname(pre, stname, itname, fname) \ + pre stname *fname##_new(void) \ + { \ + return (stname *)ASN1_item_new(ASN1_ITEM_rptr(itname)); \ + } \ + pre void fname##_free(stname *a) \ + { \ + ASN1_item_free((ASN1_VALUE *)a, ASN1_ITEM_rptr(itname)); \ + } + +# define IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname) \ + stname *fname##_new(void) \ + { \ + return (stname *)ASN1_item_new(ASN1_ITEM_rptr(itname)); \ + } \ + void fname##_free(stname *a) \ + { \ + ASN1_item_free((ASN1_VALUE *)a, ASN1_ITEM_rptr(itname)); \ + } + +# define IMPLEMENT_ASN1_FUNCTIONS_fname(stname, itname, fname) \ + IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(stname, itname, fname) \ + IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname) + +# define IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(stname, itname, fname) \ + stname *d2i_##fname(stname **a, const unsigned char **in, long len) \ + { \ + return (stname *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, ASN1_ITEM_rptr(itname));\ + } \ + int i2d_##fname(stname *a, unsigned char **out) \ + { \ + return ASN1_item_i2d((ASN1_VALUE *)a, out, ASN1_ITEM_rptr(itname));\ + } + +# define IMPLEMENT_ASN1_NDEF_FUNCTION(stname) \ + int i2d_##stname##_NDEF(stname *a, unsigned char **out) \ + { \ + return ASN1_item_ndef_i2d((ASN1_VALUE *)a, out, ASN1_ITEM_rptr(stname));\ + } + +/* + * This includes evil casts to remove const: they will go away when full ASN1 + * constification is done. + */ +# define IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(stname, itname, fname) \ + stname *d2i_##fname(stname **a, const unsigned char **in, long len) \ + { \ + return (stname *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, ASN1_ITEM_rptr(itname));\ + } \ + int i2d_##fname(const stname *a, unsigned char **out) \ + { \ + return ASN1_item_i2d((ASN1_VALUE *)a, out, ASN1_ITEM_rptr(itname));\ + } + +# define IMPLEMENT_ASN1_DUP_FUNCTION(stname) \ + stname * stname##_dup(stname *x) \ + { \ + return ASN1_item_dup(ASN1_ITEM_rptr(stname), x); \ + } + +# define IMPLEMENT_ASN1_PRINT_FUNCTION(stname) \ + IMPLEMENT_ASN1_PRINT_FUNCTION_fname(stname, stname, stname) + +# define IMPLEMENT_ASN1_PRINT_FUNCTION_fname(stname, itname, fname) \ + int fname##_print_ctx(BIO *out, stname *x, int indent, \ + const ASN1_PCTX *pctx) \ + { \ + return ASN1_item_print(out, (ASN1_VALUE *)x, indent, \ + ASN1_ITEM_rptr(itname), pctx); \ + } + +# define IMPLEMENT_ASN1_FUNCTIONS_const(name) \ + IMPLEMENT_ASN1_FUNCTIONS_const_fname(name, name, name) + +# define IMPLEMENT_ASN1_FUNCTIONS_const_fname(stname, itname, fname) \ + IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(stname, itname, fname) \ + IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname) + +/* external definitions for primitive types */ + +DECLARE_ASN1_ITEM(ASN1_BOOLEAN) +DECLARE_ASN1_ITEM(ASN1_TBOOLEAN) +DECLARE_ASN1_ITEM(ASN1_FBOOLEAN) +DECLARE_ASN1_ITEM(ASN1_SEQUENCE) +DECLARE_ASN1_ITEM(CBIGNUM) +DECLARE_ASN1_ITEM(BIGNUM) +DECLARE_ASN1_ITEM(LONG) +DECLARE_ASN1_ITEM(ZLONG) + +DECLARE_STACK_OF(ASN1_VALUE) + +/* Functions used internally by the ASN1 code */ + +int ASN1_item_ex_new(ASN1_VALUE **pval, const ASN1_ITEM *it); +void ASN1_item_ex_free(ASN1_VALUE **pval, const ASN1_ITEM *it); +int ASN1_template_new(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt); +int ASN1_primitive_new(ASN1_VALUE **pval, const ASN1_ITEM *it); + +void ASN1_template_free(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt); +int ASN1_template_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, + const ASN1_TEMPLATE *tt); +int ASN1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, + const ASN1_ITEM *it, int tag, int aclass, char opt, + ASN1_TLC *ctx); + +int ASN1_item_ex_i2d(ASN1_VALUE **pval, unsigned char **out, + const ASN1_ITEM *it, int tag, int aclass); +int ASN1_template_i2d(ASN1_VALUE **pval, unsigned char **out, + const ASN1_TEMPLATE *tt); +void ASN1_primitive_free(ASN1_VALUE **pval, const ASN1_ITEM *it); + +int asn1_ex_i2c(ASN1_VALUE **pval, unsigned char *cont, int *putype, + const ASN1_ITEM *it); +int asn1_ex_c2i(ASN1_VALUE **pval, const unsigned char *cont, int len, + int utype, char *free_cont, const ASN1_ITEM *it); + +int asn1_get_choice_selector(ASN1_VALUE **pval, const ASN1_ITEM *it); +int asn1_set_choice_selector(ASN1_VALUE **pval, int value, + const ASN1_ITEM *it); + +ASN1_VALUE **asn1_get_field_ptr(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt); + +const ASN1_TEMPLATE *asn1_do_adb(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt, + int nullerr); + +int asn1_do_lock(ASN1_VALUE **pval, int op, const ASN1_ITEM *it); + +void asn1_enc_init(ASN1_VALUE **pval, const ASN1_ITEM *it); +void asn1_enc_free(ASN1_VALUE **pval, const ASN1_ITEM *it); +int asn1_enc_restore(int *len, unsigned char **out, ASN1_VALUE **pval, + const ASN1_ITEM *it); +int asn1_enc_save(ASN1_VALUE **pval, const unsigned char *in, int inlen, + const ASN1_ITEM *it); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/bio.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/bio.h new file mode 100644 index 0000000..8f2438c --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/bio.h @@ -0,0 +1,883 @@ +/* crypto/bio/bio.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_BIO_H +# define HEADER_BIO_H + +# include + +# ifndef OPENSSL_NO_FP_API +# include +# endif +# include + +# include + +# ifndef OPENSSL_NO_SCTP +# ifndef OPENSSL_SYS_VMS +# include +# else +# include +# endif +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* These are the 'types' of BIOs */ +# define BIO_TYPE_NONE 0 +# define BIO_TYPE_MEM (1|0x0400) +# define BIO_TYPE_FILE (2|0x0400) + +# define BIO_TYPE_FD (4|0x0400|0x0100) +# define BIO_TYPE_SOCKET (5|0x0400|0x0100) +# define BIO_TYPE_NULL (6|0x0400) +# define BIO_TYPE_SSL (7|0x0200) +# define BIO_TYPE_MD (8|0x0200)/* passive filter */ +# define BIO_TYPE_BUFFER (9|0x0200)/* filter */ +# define BIO_TYPE_CIPHER (10|0x0200)/* filter */ +# define BIO_TYPE_BASE64 (11|0x0200)/* filter */ +# define BIO_TYPE_CONNECT (12|0x0400|0x0100)/* socket - connect */ +# define BIO_TYPE_ACCEPT (13|0x0400|0x0100)/* socket for accept */ +# define BIO_TYPE_PROXY_CLIENT (14|0x0200)/* client proxy BIO */ +# define BIO_TYPE_PROXY_SERVER (15|0x0200)/* server proxy BIO */ +# define BIO_TYPE_NBIO_TEST (16|0x0200)/* server proxy BIO */ +# define BIO_TYPE_NULL_FILTER (17|0x0200) +# define BIO_TYPE_BER (18|0x0200)/* BER -> bin filter */ +# define BIO_TYPE_BIO (19|0x0400)/* (half a) BIO pair */ +# define BIO_TYPE_LINEBUFFER (20|0x0200)/* filter */ +# define BIO_TYPE_DGRAM (21|0x0400|0x0100) +# ifndef OPENSSL_NO_SCTP +# define BIO_TYPE_DGRAM_SCTP (24|0x0400|0x0100) +# endif +# define BIO_TYPE_ASN1 (22|0x0200)/* filter */ +# define BIO_TYPE_COMP (23|0x0200)/* filter */ + +# define BIO_TYPE_DESCRIPTOR 0x0100/* socket, fd, connect or accept */ +# define BIO_TYPE_FILTER 0x0200 +# define BIO_TYPE_SOURCE_SINK 0x0400 + +/* + * BIO_FILENAME_READ|BIO_CLOSE to open or close on free. + * BIO_set_fp(in,stdin,BIO_NOCLOSE); + */ +# define BIO_NOCLOSE 0x00 +# define BIO_CLOSE 0x01 + +/* + * These are used in the following macros and are passed to BIO_ctrl() + */ +# define BIO_CTRL_RESET 1/* opt - rewind/zero etc */ +# define BIO_CTRL_EOF 2/* opt - are we at the eof */ +# define BIO_CTRL_INFO 3/* opt - extra tit-bits */ +# define BIO_CTRL_SET 4/* man - set the 'IO' type */ +# define BIO_CTRL_GET 5/* man - get the 'IO' type */ +# define BIO_CTRL_PUSH 6/* opt - internal, used to signify change */ +# define BIO_CTRL_POP 7/* opt - internal, used to signify change */ +# define BIO_CTRL_GET_CLOSE 8/* man - set the 'close' on free */ +# define BIO_CTRL_SET_CLOSE 9/* man - set the 'close' on free */ +# define BIO_CTRL_PENDING 10/* opt - is their more data buffered */ +# define BIO_CTRL_FLUSH 11/* opt - 'flush' buffered output */ +# define BIO_CTRL_DUP 12/* man - extra stuff for 'duped' BIO */ +# define BIO_CTRL_WPENDING 13/* opt - number of bytes still to write */ +/* callback is int cb(BIO *bio,state,ret); */ +# define BIO_CTRL_SET_CALLBACK 14/* opt - set callback function */ +# define BIO_CTRL_GET_CALLBACK 15/* opt - set callback function */ + +# define BIO_CTRL_SET_FILENAME 30/* BIO_s_file special */ + +/* dgram BIO stuff */ +# define BIO_CTRL_DGRAM_CONNECT 31/* BIO dgram special */ +# define BIO_CTRL_DGRAM_SET_CONNECTED 32/* allow for an externally connected + * socket to be passed in */ +# define BIO_CTRL_DGRAM_SET_RECV_TIMEOUT 33/* setsockopt, essentially */ +# define BIO_CTRL_DGRAM_GET_RECV_TIMEOUT 34/* getsockopt, essentially */ +# define BIO_CTRL_DGRAM_SET_SEND_TIMEOUT 35/* setsockopt, essentially */ +# define BIO_CTRL_DGRAM_GET_SEND_TIMEOUT 36/* getsockopt, essentially */ + +# define BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP 37/* flag whether the last */ +# define BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP 38/* I/O operation tiemd out */ + +/* #ifdef IP_MTU_DISCOVER */ +# define BIO_CTRL_DGRAM_MTU_DISCOVER 39/* set DF bit on egress packets */ +/* #endif */ + +# define BIO_CTRL_DGRAM_QUERY_MTU 40/* as kernel for current MTU */ +# define BIO_CTRL_DGRAM_GET_FALLBACK_MTU 47 +# define BIO_CTRL_DGRAM_GET_MTU 41/* get cached value for MTU */ +# define BIO_CTRL_DGRAM_SET_MTU 42/* set cached value for MTU. + * want to use this if asking + * the kernel fails */ + +# define BIO_CTRL_DGRAM_MTU_EXCEEDED 43/* check whether the MTU was + * exceed in the previous write + * operation */ + +# define BIO_CTRL_DGRAM_GET_PEER 46 +# define BIO_CTRL_DGRAM_SET_PEER 44/* Destination for the data */ + +# define BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT 45/* Next DTLS handshake timeout + * to adjust socket timeouts */ +# define BIO_CTRL_DGRAM_SET_DONT_FRAG 48 + +# define BIO_CTRL_DGRAM_GET_MTU_OVERHEAD 49 + +# ifndef OPENSSL_NO_SCTP +/* SCTP stuff */ +# define BIO_CTRL_DGRAM_SCTP_SET_IN_HANDSHAKE 50 +# define BIO_CTRL_DGRAM_SCTP_ADD_AUTH_KEY 51 +# define BIO_CTRL_DGRAM_SCTP_NEXT_AUTH_KEY 52 +# define BIO_CTRL_DGRAM_SCTP_AUTH_CCS_RCVD 53 +# define BIO_CTRL_DGRAM_SCTP_GET_SNDINFO 60 +# define BIO_CTRL_DGRAM_SCTP_SET_SNDINFO 61 +# define BIO_CTRL_DGRAM_SCTP_GET_RCVINFO 62 +# define BIO_CTRL_DGRAM_SCTP_SET_RCVINFO 63 +# define BIO_CTRL_DGRAM_SCTP_GET_PRINFO 64 +# define BIO_CTRL_DGRAM_SCTP_SET_PRINFO 65 +# define BIO_CTRL_DGRAM_SCTP_SAVE_SHUTDOWN 70 +# endif + +/* modifiers */ +# define BIO_FP_READ 0x02 +# define BIO_FP_WRITE 0x04 +# define BIO_FP_APPEND 0x08 +# define BIO_FP_TEXT 0x10 + +# define BIO_FLAGS_READ 0x01 +# define BIO_FLAGS_WRITE 0x02 +# define BIO_FLAGS_IO_SPECIAL 0x04 +# define BIO_FLAGS_RWS (BIO_FLAGS_READ|BIO_FLAGS_WRITE|BIO_FLAGS_IO_SPECIAL) +# define BIO_FLAGS_SHOULD_RETRY 0x08 +# ifndef BIO_FLAGS_UPLINK +/* + * "UPLINK" flag denotes file descriptors provided by application. It + * defaults to 0, as most platforms don't require UPLINK interface. + */ +# define BIO_FLAGS_UPLINK 0 +# endif + +/* Used in BIO_gethostbyname() */ +# define BIO_GHBN_CTRL_HITS 1 +# define BIO_GHBN_CTRL_MISSES 2 +# define BIO_GHBN_CTRL_CACHE_SIZE 3 +# define BIO_GHBN_CTRL_GET_ENTRY 4 +# define BIO_GHBN_CTRL_FLUSH 5 + +/* Mostly used in the SSL BIO */ +/*- + * Not used anymore + * #define BIO_FLAGS_PROTOCOL_DELAYED_READ 0x10 + * #define BIO_FLAGS_PROTOCOL_DELAYED_WRITE 0x20 + * #define BIO_FLAGS_PROTOCOL_STARTUP 0x40 + */ + +# define BIO_FLAGS_BASE64_NO_NL 0x100 + +/* + * This is used with memory BIOs: it means we shouldn't free up or change the + * data in any way. + */ +# define BIO_FLAGS_MEM_RDONLY 0x200 + +typedef struct bio_st BIO; + +void BIO_set_flags(BIO *b, int flags); +int BIO_test_flags(const BIO *b, int flags); +void BIO_clear_flags(BIO *b, int flags); + +# define BIO_get_flags(b) BIO_test_flags(b, ~(0x0)) +# define BIO_set_retry_special(b) \ + BIO_set_flags(b, (BIO_FLAGS_IO_SPECIAL|BIO_FLAGS_SHOULD_RETRY)) +# define BIO_set_retry_read(b) \ + BIO_set_flags(b, (BIO_FLAGS_READ|BIO_FLAGS_SHOULD_RETRY)) +# define BIO_set_retry_write(b) \ + BIO_set_flags(b, (BIO_FLAGS_WRITE|BIO_FLAGS_SHOULD_RETRY)) + +/* These are normally used internally in BIOs */ +# define BIO_clear_retry_flags(b) \ + BIO_clear_flags(b, (BIO_FLAGS_RWS|BIO_FLAGS_SHOULD_RETRY)) +# define BIO_get_retry_flags(b) \ + BIO_test_flags(b, (BIO_FLAGS_RWS|BIO_FLAGS_SHOULD_RETRY)) + +/* These should be used by the application to tell why we should retry */ +# define BIO_should_read(a) BIO_test_flags(a, BIO_FLAGS_READ) +# define BIO_should_write(a) BIO_test_flags(a, BIO_FLAGS_WRITE) +# define BIO_should_io_special(a) BIO_test_flags(a, BIO_FLAGS_IO_SPECIAL) +# define BIO_retry_type(a) BIO_test_flags(a, BIO_FLAGS_RWS) +# define BIO_should_retry(a) BIO_test_flags(a, BIO_FLAGS_SHOULD_RETRY) + +/* + * The next three are used in conjunction with the BIO_should_io_special() + * condition. After this returns true, BIO *BIO_get_retry_BIO(BIO *bio, int + * *reason); will walk the BIO stack and return the 'reason' for the special + * and the offending BIO. Given a BIO, BIO_get_retry_reason(bio) will return + * the code. + */ +/* + * Returned from the SSL bio when the certificate retrieval code had an error + */ +# define BIO_RR_SSL_X509_LOOKUP 0x01 +/* Returned from the connect BIO when a connect would have blocked */ +# define BIO_RR_CONNECT 0x02 +/* Returned from the accept BIO when an accept would have blocked */ +# define BIO_RR_ACCEPT 0x03 + +/* These are passed by the BIO callback */ +# define BIO_CB_FREE 0x01 +# define BIO_CB_READ 0x02 +# define BIO_CB_WRITE 0x03 +# define BIO_CB_PUTS 0x04 +# define BIO_CB_GETS 0x05 +# define BIO_CB_CTRL 0x06 + +/* + * The callback is called before and after the underling operation, The + * BIO_CB_RETURN flag indicates if it is after the call + */ +# define BIO_CB_RETURN 0x80 +# define BIO_CB_return(a) ((a)|BIO_CB_RETURN) +# define BIO_cb_pre(a) (!((a)&BIO_CB_RETURN)) +# define BIO_cb_post(a) ((a)&BIO_CB_RETURN) + +long (*BIO_get_callback(const BIO *b)) (struct bio_st *, int, const char *, + int, long, long); +void BIO_set_callback(BIO *b, + long (*callback) (struct bio_st *, int, const char *, + int, long, long)); +char *BIO_get_callback_arg(const BIO *b); +void BIO_set_callback_arg(BIO *b, char *arg); + +const char *BIO_method_name(const BIO *b); +int BIO_method_type(const BIO *b); + +typedef void bio_info_cb (struct bio_st *, int, const char *, int, long, + long); + +typedef struct bio_method_st { + int type; + const char *name; + int (*bwrite) (BIO *, const char *, int); + int (*bread) (BIO *, char *, int); + int (*bputs) (BIO *, const char *); + int (*bgets) (BIO *, char *, int); + long (*ctrl) (BIO *, int, long, void *); + int (*create) (BIO *); + int (*destroy) (BIO *); + long (*callback_ctrl) (BIO *, int, bio_info_cb *); +} BIO_METHOD; + +struct bio_st { + BIO_METHOD *method; + /* bio, mode, argp, argi, argl, ret */ + long (*callback) (struct bio_st *, int, const char *, int, long, long); + char *cb_arg; /* first argument for the callback */ + int init; + int shutdown; + int flags; /* extra storage */ + int retry_reason; + int num; + void *ptr; + struct bio_st *next_bio; /* used by filter BIOs */ + struct bio_st *prev_bio; /* used by filter BIOs */ + int references; + unsigned long num_read; + unsigned long num_write; + CRYPTO_EX_DATA ex_data; +}; + +DECLARE_STACK_OF(BIO) + +typedef struct bio_f_buffer_ctx_struct { + /*- + * Buffers are setup like this: + * + * <---------------------- size -----------------------> + * +---------------------------------------------------+ + * | consumed | remaining | free space | + * +---------------------------------------------------+ + * <-- off --><------- len -------> + */ + /*- BIO *bio; *//* + * this is now in the BIO struct + */ + int ibuf_size; /* how big is the input buffer */ + int obuf_size; /* how big is the output buffer */ + char *ibuf; /* the char array */ + int ibuf_len; /* how many bytes are in it */ + int ibuf_off; /* write/read offset */ + char *obuf; /* the char array */ + int obuf_len; /* how many bytes are in it */ + int obuf_off; /* write/read offset */ +} BIO_F_BUFFER_CTX; + +/* Prefix and suffix callback in ASN1 BIO */ +typedef int asn1_ps_func (BIO *b, unsigned char **pbuf, int *plen, + void *parg); + +# ifndef OPENSSL_NO_SCTP +/* SCTP parameter structs */ +struct bio_dgram_sctp_sndinfo { + uint16_t snd_sid; + uint16_t snd_flags; + uint32_t snd_ppid; + uint32_t snd_context; +}; + +struct bio_dgram_sctp_rcvinfo { + uint16_t rcv_sid; + uint16_t rcv_ssn; + uint16_t rcv_flags; + uint32_t rcv_ppid; + uint32_t rcv_tsn; + uint32_t rcv_cumtsn; + uint32_t rcv_context; +}; + +struct bio_dgram_sctp_prinfo { + uint16_t pr_policy; + uint32_t pr_value; +}; +# endif + +/* connect BIO stuff */ +# define BIO_CONN_S_BEFORE 1 +# define BIO_CONN_S_GET_IP 2 +# define BIO_CONN_S_GET_PORT 3 +# define BIO_CONN_S_CREATE_SOCKET 4 +# define BIO_CONN_S_CONNECT 5 +# define BIO_CONN_S_OK 6 +# define BIO_CONN_S_BLOCKED_CONNECT 7 +# define BIO_CONN_S_NBIO 8 +/* + * #define BIO_CONN_get_param_hostname BIO_ctrl + */ + +# define BIO_C_SET_CONNECT 100 +# define BIO_C_DO_STATE_MACHINE 101 +# define BIO_C_SET_NBIO 102 +# define BIO_C_SET_PROXY_PARAM 103 +# define BIO_C_SET_FD 104 +# define BIO_C_GET_FD 105 +# define BIO_C_SET_FILE_PTR 106 +# define BIO_C_GET_FILE_PTR 107 +# define BIO_C_SET_FILENAME 108 +# define BIO_C_SET_SSL 109 +# define BIO_C_GET_SSL 110 +# define BIO_C_SET_MD 111 +# define BIO_C_GET_MD 112 +# define BIO_C_GET_CIPHER_STATUS 113 +# define BIO_C_SET_BUF_MEM 114 +# define BIO_C_GET_BUF_MEM_PTR 115 +# define BIO_C_GET_BUFF_NUM_LINES 116 +# define BIO_C_SET_BUFF_SIZE 117 +# define BIO_C_SET_ACCEPT 118 +# define BIO_C_SSL_MODE 119 +# define BIO_C_GET_MD_CTX 120 +# define BIO_C_GET_PROXY_PARAM 121 +# define BIO_C_SET_BUFF_READ_DATA 122/* data to read first */ +# define BIO_C_GET_CONNECT 123 +# define BIO_C_GET_ACCEPT 124 +# define BIO_C_SET_SSL_RENEGOTIATE_BYTES 125 +# define BIO_C_GET_SSL_NUM_RENEGOTIATES 126 +# define BIO_C_SET_SSL_RENEGOTIATE_TIMEOUT 127 +# define BIO_C_FILE_SEEK 128 +# define BIO_C_GET_CIPHER_CTX 129 +# define BIO_C_SET_BUF_MEM_EOF_RETURN 130/* return end of input + * value */ +# define BIO_C_SET_BIND_MODE 131 +# define BIO_C_GET_BIND_MODE 132 +# define BIO_C_FILE_TELL 133 +# define BIO_C_GET_SOCKS 134 +# define BIO_C_SET_SOCKS 135 + +# define BIO_C_SET_WRITE_BUF_SIZE 136/* for BIO_s_bio */ +# define BIO_C_GET_WRITE_BUF_SIZE 137 +# define BIO_C_MAKE_BIO_PAIR 138 +# define BIO_C_DESTROY_BIO_PAIR 139 +# define BIO_C_GET_WRITE_GUARANTEE 140 +# define BIO_C_GET_READ_REQUEST 141 +# define BIO_C_SHUTDOWN_WR 142 +# define BIO_C_NREAD0 143 +# define BIO_C_NREAD 144 +# define BIO_C_NWRITE0 145 +# define BIO_C_NWRITE 146 +# define BIO_C_RESET_READ_REQUEST 147 +# define BIO_C_SET_MD_CTX 148 + +# define BIO_C_SET_PREFIX 149 +# define BIO_C_GET_PREFIX 150 +# define BIO_C_SET_SUFFIX 151 +# define BIO_C_GET_SUFFIX 152 + +# define BIO_C_SET_EX_ARG 153 +# define BIO_C_GET_EX_ARG 154 + +# define BIO_set_app_data(s,arg) BIO_set_ex_data(s,0,arg) +# define BIO_get_app_data(s) BIO_get_ex_data(s,0) + +/* BIO_s_connect() and BIO_s_socks4a_connect() */ +# define BIO_set_conn_hostname(b,name) BIO_ctrl(b,BIO_C_SET_CONNECT,0,(char *)name) +# define BIO_set_conn_port(b,port) BIO_ctrl(b,BIO_C_SET_CONNECT,1,(char *)port) +# define BIO_set_conn_ip(b,ip) BIO_ctrl(b,BIO_C_SET_CONNECT,2,(char *)ip) +# define BIO_set_conn_int_port(b,port) BIO_ctrl(b,BIO_C_SET_CONNECT,3,(char *)port) +# define BIO_get_conn_hostname(b) BIO_ptr_ctrl(b,BIO_C_GET_CONNECT,0) +# define BIO_get_conn_port(b) BIO_ptr_ctrl(b,BIO_C_GET_CONNECT,1) +# define BIO_get_conn_ip(b) BIO_ptr_ctrl(b,BIO_C_GET_CONNECT,2) +# define BIO_get_conn_int_port(b) BIO_ctrl(b,BIO_C_GET_CONNECT,3,NULL) + +# define BIO_set_nbio(b,n) BIO_ctrl(b,BIO_C_SET_NBIO,(n),NULL) + +/* BIO_s_accept() */ +# define BIO_set_accept_port(b,name) BIO_ctrl(b,BIO_C_SET_ACCEPT,0,(char *)name) +# define BIO_get_accept_port(b) BIO_ptr_ctrl(b,BIO_C_GET_ACCEPT,0) +/* #define BIO_set_nbio(b,n) BIO_ctrl(b,BIO_C_SET_NBIO,(n),NULL) */ +# define BIO_set_nbio_accept(b,n) BIO_ctrl(b,BIO_C_SET_ACCEPT,1,(n)?(void *)"a":NULL) +# define BIO_set_accept_bios(b,bio) BIO_ctrl(b,BIO_C_SET_ACCEPT,2,(char *)bio) + +# define BIO_BIND_NORMAL 0 +# define BIO_BIND_REUSEADDR_IF_UNUSED 1 +# define BIO_BIND_REUSEADDR 2 +# define BIO_set_bind_mode(b,mode) BIO_ctrl(b,BIO_C_SET_BIND_MODE,mode,NULL) +# define BIO_get_bind_mode(b,mode) BIO_ctrl(b,BIO_C_GET_BIND_MODE,0,NULL) + +/* BIO_s_accept() and BIO_s_connect() */ +# define BIO_do_connect(b) BIO_do_handshake(b) +# define BIO_do_accept(b) BIO_do_handshake(b) +# define BIO_do_handshake(b) BIO_ctrl(b,BIO_C_DO_STATE_MACHINE,0,NULL) + +/* BIO_s_proxy_client() */ +# define BIO_set_url(b,url) BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,0,(char *)(url)) +# define BIO_set_proxies(b,p) BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,1,(char *)(p)) +/* BIO_set_nbio(b,n) */ +# define BIO_set_filter_bio(b,s) BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,2,(char *)(s)) +/* BIO *BIO_get_filter_bio(BIO *bio); */ +# define BIO_set_proxy_cb(b,cb) BIO_callback_ctrl(b,BIO_C_SET_PROXY_PARAM,3,(void *(*cb)())) +# define BIO_set_proxy_header(b,sk) BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,4,(char *)sk) +# define BIO_set_no_connect_return(b,bool) BIO_int_ctrl(b,BIO_C_SET_PROXY_PARAM,5,bool) + +# define BIO_get_proxy_header(b,skp) BIO_ctrl(b,BIO_C_GET_PROXY_PARAM,0,(char *)skp) +# define BIO_get_proxies(b,pxy_p) BIO_ctrl(b,BIO_C_GET_PROXY_PARAM,1,(char *)(pxy_p)) +# define BIO_get_url(b,url) BIO_ctrl(b,BIO_C_GET_PROXY_PARAM,2,(char *)(url)) +# define BIO_get_no_connect_return(b) BIO_ctrl(b,BIO_C_GET_PROXY_PARAM,5,NULL) + +/* BIO_s_datagram(), BIO_s_fd(), BIO_s_socket(), BIO_s_accept() and BIO_s_connect() */ +# define BIO_set_fd(b,fd,c) BIO_int_ctrl(b,BIO_C_SET_FD,c,fd) +# define BIO_get_fd(b,c) BIO_ctrl(b,BIO_C_GET_FD,0,(char *)c) + +/* BIO_s_file() */ +# define BIO_set_fp(b,fp,c) BIO_ctrl(b,BIO_C_SET_FILE_PTR,c,(char *)fp) +# define BIO_get_fp(b,fpp) BIO_ctrl(b,BIO_C_GET_FILE_PTR,0,(char *)fpp) + +/* BIO_s_fd() and BIO_s_file() */ +# define BIO_seek(b,ofs) (int)BIO_ctrl(b,BIO_C_FILE_SEEK,ofs,NULL) +# define BIO_tell(b) (int)BIO_ctrl(b,BIO_C_FILE_TELL,0,NULL) + +/* + * name is cast to lose const, but might be better to route through a + * function so we can do it safely + */ +# ifdef CONST_STRICT +/* + * If you are wondering why this isn't defined, its because CONST_STRICT is + * purely a compile-time kludge to allow const to be checked. + */ +int BIO_read_filename(BIO *b, const char *name); +# else +# define BIO_read_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \ + BIO_CLOSE|BIO_FP_READ,(char *)name) +# endif +# define BIO_write_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \ + BIO_CLOSE|BIO_FP_WRITE,name) +# define BIO_append_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \ + BIO_CLOSE|BIO_FP_APPEND,name) +# define BIO_rw_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \ + BIO_CLOSE|BIO_FP_READ|BIO_FP_WRITE,name) + +/* + * WARNING WARNING, this ups the reference count on the read bio of the SSL + * structure. This is because the ssl read BIO is now pointed to by the + * next_bio field in the bio. So when you free the BIO, make sure you are + * doing a BIO_free_all() to catch the underlying BIO. + */ +# define BIO_set_ssl(b,ssl,c) BIO_ctrl(b,BIO_C_SET_SSL,c,(char *)ssl) +# define BIO_get_ssl(b,sslp) BIO_ctrl(b,BIO_C_GET_SSL,0,(char *)sslp) +# define BIO_set_ssl_mode(b,client) BIO_ctrl(b,BIO_C_SSL_MODE,client,NULL) +# define BIO_set_ssl_renegotiate_bytes(b,num) \ + BIO_ctrl(b,BIO_C_SET_SSL_RENEGOTIATE_BYTES,num,NULL) +# define BIO_get_num_renegotiates(b) \ + BIO_ctrl(b,BIO_C_GET_SSL_NUM_RENEGOTIATES,0,NULL) +# define BIO_set_ssl_renegotiate_timeout(b,seconds) \ + BIO_ctrl(b,BIO_C_SET_SSL_RENEGOTIATE_TIMEOUT,seconds,NULL) + +/* defined in evp.h */ +/* #define BIO_set_md(b,md) BIO_ctrl(b,BIO_C_SET_MD,1,(char *)md) */ + +# define BIO_get_mem_data(b,pp) BIO_ctrl(b,BIO_CTRL_INFO,0,(char *)pp) +# define BIO_set_mem_buf(b,bm,c) BIO_ctrl(b,BIO_C_SET_BUF_MEM,c,(char *)bm) +# define BIO_get_mem_ptr(b,pp) BIO_ctrl(b,BIO_C_GET_BUF_MEM_PTR,0,(char *)pp) +# define BIO_set_mem_eof_return(b,v) \ + BIO_ctrl(b,BIO_C_SET_BUF_MEM_EOF_RETURN,v,NULL) + +/* For the BIO_f_buffer() type */ +# define BIO_get_buffer_num_lines(b) BIO_ctrl(b,BIO_C_GET_BUFF_NUM_LINES,0,NULL) +# define BIO_set_buffer_size(b,size) BIO_ctrl(b,BIO_C_SET_BUFF_SIZE,size,NULL) +# define BIO_set_read_buffer_size(b,size) BIO_int_ctrl(b,BIO_C_SET_BUFF_SIZE,size,0) +# define BIO_set_write_buffer_size(b,size) BIO_int_ctrl(b,BIO_C_SET_BUFF_SIZE,size,1) +# define BIO_set_buffer_read_data(b,buf,num) BIO_ctrl(b,BIO_C_SET_BUFF_READ_DATA,num,buf) + +/* Don't use the next one unless you know what you are doing :-) */ +# define BIO_dup_state(b,ret) BIO_ctrl(b,BIO_CTRL_DUP,0,(char *)(ret)) + +# define BIO_reset(b) (int)BIO_ctrl(b,BIO_CTRL_RESET,0,NULL) +# define BIO_eof(b) (int)BIO_ctrl(b,BIO_CTRL_EOF,0,NULL) +# define BIO_set_close(b,c) (int)BIO_ctrl(b,BIO_CTRL_SET_CLOSE,(c),NULL) +# define BIO_get_close(b) (int)BIO_ctrl(b,BIO_CTRL_GET_CLOSE,0,NULL) +# define BIO_pending(b) (int)BIO_ctrl(b,BIO_CTRL_PENDING,0,NULL) +# define BIO_wpending(b) (int)BIO_ctrl(b,BIO_CTRL_WPENDING,0,NULL) +/* ...pending macros have inappropriate return type */ +size_t BIO_ctrl_pending(BIO *b); +size_t BIO_ctrl_wpending(BIO *b); +# define BIO_flush(b) (int)BIO_ctrl(b,BIO_CTRL_FLUSH,0,NULL) +# define BIO_get_info_callback(b,cbp) (int)BIO_ctrl(b,BIO_CTRL_GET_CALLBACK,0, \ + cbp) +# define BIO_set_info_callback(b,cb) (int)BIO_callback_ctrl(b,BIO_CTRL_SET_CALLBACK,cb) + +/* For the BIO_f_buffer() type */ +# define BIO_buffer_get_num_lines(b) BIO_ctrl(b,BIO_CTRL_GET,0,NULL) + +/* For BIO_s_bio() */ +# define BIO_set_write_buf_size(b,size) (int)BIO_ctrl(b,BIO_C_SET_WRITE_BUF_SIZE,size,NULL) +# define BIO_get_write_buf_size(b,size) (size_t)BIO_ctrl(b,BIO_C_GET_WRITE_BUF_SIZE,size,NULL) +# define BIO_make_bio_pair(b1,b2) (int)BIO_ctrl(b1,BIO_C_MAKE_BIO_PAIR,0,b2) +# define BIO_destroy_bio_pair(b) (int)BIO_ctrl(b,BIO_C_DESTROY_BIO_PAIR,0,NULL) +# define BIO_shutdown_wr(b) (int)BIO_ctrl(b, BIO_C_SHUTDOWN_WR, 0, NULL) +/* macros with inappropriate type -- but ...pending macros use int too: */ +# define BIO_get_write_guarantee(b) (int)BIO_ctrl(b,BIO_C_GET_WRITE_GUARANTEE,0,NULL) +# define BIO_get_read_request(b) (int)BIO_ctrl(b,BIO_C_GET_READ_REQUEST,0,NULL) +size_t BIO_ctrl_get_write_guarantee(BIO *b); +size_t BIO_ctrl_get_read_request(BIO *b); +int BIO_ctrl_reset_read_request(BIO *b); + +/* ctrl macros for dgram */ +# define BIO_ctrl_dgram_connect(b,peer) \ + (int)BIO_ctrl(b,BIO_CTRL_DGRAM_CONNECT,0, (char *)peer) +# define BIO_ctrl_set_connected(b, state, peer) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_SET_CONNECTED, state, (char *)peer) +# define BIO_dgram_recv_timedout(b) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP, 0, NULL) +# define BIO_dgram_send_timedout(b) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP, 0, NULL) +# define BIO_dgram_get_peer(b,peer) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_GET_PEER, 0, (char *)peer) +# define BIO_dgram_set_peer(b,peer) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_SET_PEER, 0, (char *)peer) +# define BIO_dgram_get_mtu_overhead(b) \ + (unsigned int)BIO_ctrl((b), BIO_CTRL_DGRAM_GET_MTU_OVERHEAD, 0, NULL) + +/* These two aren't currently implemented */ +/* int BIO_get_ex_num(BIO *bio); */ +/* void BIO_set_ex_free_func(BIO *bio,int idx,void (*cb)()); */ +int BIO_set_ex_data(BIO *bio, int idx, void *data); +void *BIO_get_ex_data(BIO *bio, int idx); +int BIO_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); +unsigned long BIO_number_read(BIO *bio); +unsigned long BIO_number_written(BIO *bio); + +/* For BIO_f_asn1() */ +int BIO_asn1_set_prefix(BIO *b, asn1_ps_func *prefix, + asn1_ps_func *prefix_free); +int BIO_asn1_get_prefix(BIO *b, asn1_ps_func **pprefix, + asn1_ps_func **pprefix_free); +int BIO_asn1_set_suffix(BIO *b, asn1_ps_func *suffix, + asn1_ps_func *suffix_free); +int BIO_asn1_get_suffix(BIO *b, asn1_ps_func **psuffix, + asn1_ps_func **psuffix_free); + +# ifndef OPENSSL_NO_FP_API +BIO_METHOD *BIO_s_file(void); +BIO *BIO_new_file(const char *filename, const char *mode); +BIO *BIO_new_fp(FILE *stream, int close_flag); +# define BIO_s_file_internal BIO_s_file +# endif +BIO *BIO_new(BIO_METHOD *type); +int BIO_set(BIO *a, BIO_METHOD *type); +int BIO_free(BIO *a); +void BIO_vfree(BIO *a); +int BIO_read(BIO *b, void *data, int len); +int BIO_gets(BIO *bp, char *buf, int size); +int BIO_write(BIO *b, const void *data, int len); +int BIO_puts(BIO *bp, const char *buf); +int BIO_indent(BIO *b, int indent, int max); +long BIO_ctrl(BIO *bp, int cmd, long larg, void *parg); +long BIO_callback_ctrl(BIO *b, int cmd, + void (*fp) (struct bio_st *, int, const char *, int, + long, long)); +char *BIO_ptr_ctrl(BIO *bp, int cmd, long larg); +long BIO_int_ctrl(BIO *bp, int cmd, long larg, int iarg); +BIO *BIO_push(BIO *b, BIO *append); +BIO *BIO_pop(BIO *b); +void BIO_free_all(BIO *a); +BIO *BIO_find_type(BIO *b, int bio_type); +BIO *BIO_next(BIO *b); +BIO *BIO_get_retry_BIO(BIO *bio, int *reason); +int BIO_get_retry_reason(BIO *bio); +BIO *BIO_dup_chain(BIO *in); + +int BIO_nread0(BIO *bio, char **buf); +int BIO_nread(BIO *bio, char **buf, int num); +int BIO_nwrite0(BIO *bio, char **buf); +int BIO_nwrite(BIO *bio, char **buf, int num); + +long BIO_debug_callback(BIO *bio, int cmd, const char *argp, int argi, + long argl, long ret); + +BIO_METHOD *BIO_s_mem(void); +BIO *BIO_new_mem_buf(const void *buf, int len); +BIO_METHOD *BIO_s_socket(void); +BIO_METHOD *BIO_s_connect(void); +BIO_METHOD *BIO_s_accept(void); +BIO_METHOD *BIO_s_fd(void); +# ifndef OPENSSL_SYS_OS2 +BIO_METHOD *BIO_s_log(void); +# endif +BIO_METHOD *BIO_s_bio(void); +BIO_METHOD *BIO_s_null(void); +BIO_METHOD *BIO_f_null(void); +BIO_METHOD *BIO_f_buffer(void); +# ifdef OPENSSL_SYS_VMS +BIO_METHOD *BIO_f_linebuffer(void); +# endif +BIO_METHOD *BIO_f_nbio_test(void); +# ifndef OPENSSL_NO_DGRAM +BIO_METHOD *BIO_s_datagram(void); +# ifndef OPENSSL_NO_SCTP +BIO_METHOD *BIO_s_datagram_sctp(void); +# endif +# endif + +/* BIO_METHOD *BIO_f_ber(void); */ + +int BIO_sock_should_retry(int i); +int BIO_sock_non_fatal_error(int error); +int BIO_dgram_non_fatal_error(int error); + +int BIO_fd_should_retry(int i); +int BIO_fd_non_fatal_error(int error); +int BIO_dump_cb(int (*cb) (const void *data, size_t len, void *u), + void *u, const char *s, int len); +int BIO_dump_indent_cb(int (*cb) (const void *data, size_t len, void *u), + void *u, const char *s, int len, int indent); +int BIO_dump(BIO *b, const char *bytes, int len); +int BIO_dump_indent(BIO *b, const char *bytes, int len, int indent); +# ifndef OPENSSL_NO_FP_API +int BIO_dump_fp(FILE *fp, const char *s, int len); +int BIO_dump_indent_fp(FILE *fp, const char *s, int len, int indent); +# endif +int BIO_hex_string(BIO *out, int indent, int width, unsigned char *data, + int datalen); + +struct hostent *BIO_gethostbyname(const char *name); +/*- + * We might want a thread-safe interface too: + * struct hostent *BIO_gethostbyname_r(const char *name, + * struct hostent *result, void *buffer, size_t buflen); + * or something similar (caller allocates a struct hostent, + * pointed to by "result", and additional buffer space for the various + * substructures; if the buffer does not suffice, NULL is returned + * and an appropriate error code is set). + */ +int BIO_sock_error(int sock); +int BIO_socket_ioctl(int fd, long type, void *arg); +int BIO_socket_nbio(int fd, int mode); +int BIO_get_port(const char *str, unsigned short *port_ptr); +int BIO_get_host_ip(const char *str, unsigned char *ip); +int BIO_get_accept_socket(char *host_port, int mode); +int BIO_accept(int sock, char **ip_port); +int BIO_sock_init(void); +void BIO_sock_cleanup(void); +int BIO_set_tcp_ndelay(int sock, int turn_on); + +BIO *BIO_new_socket(int sock, int close_flag); +BIO *BIO_new_dgram(int fd, int close_flag); +# ifndef OPENSSL_NO_SCTP +BIO *BIO_new_dgram_sctp(int fd, int close_flag); +int BIO_dgram_is_sctp(BIO *bio); +int BIO_dgram_sctp_notification_cb(BIO *b, + void (*handle_notifications) (BIO *bio, + void + *context, + void *buf), + void *context); +int BIO_dgram_sctp_wait_for_dry(BIO *b); +int BIO_dgram_sctp_msg_waiting(BIO *b); +# endif +BIO *BIO_new_fd(int fd, int close_flag); +BIO *BIO_new_connect(const char *host_port); +BIO *BIO_new_accept(const char *host_port); + +int BIO_new_bio_pair(BIO **bio1, size_t writebuf1, + BIO **bio2, size_t writebuf2); +/* + * If successful, returns 1 and in *bio1, *bio2 two BIO pair endpoints. + * Otherwise returns 0 and sets *bio1 and *bio2 to NULL. Size 0 uses default + * value. + */ + +void BIO_copy_next_retry(BIO *b); + +/* + * long BIO_ghbn_ctrl(int cmd,int iarg,char *parg); + */ + +# ifdef __GNUC__ +# define __bio_h__attr__ __attribute__ +# else +# define __bio_h__attr__(x) +# endif +int BIO_printf(BIO *bio, const char *format, ...) +__bio_h__attr__((__format__(__printf__, 2, 3))); +int BIO_vprintf(BIO *bio, const char *format, va_list args) +__bio_h__attr__((__format__(__printf__, 2, 0))); +int BIO_snprintf(char *buf, size_t n, const char *format, ...) +__bio_h__attr__((__format__(__printf__, 3, 4))); +int BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args) +__bio_h__attr__((__format__(__printf__, 3, 0))); +# undef __bio_h__attr__ + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_BIO_strings(void); + +/* Error codes for the BIO functions. */ + +/* Function codes. */ +# define BIO_F_ACPT_STATE 100 +# define BIO_F_BIO_ACCEPT 101 +# define BIO_F_BIO_BER_GET_HEADER 102 +# define BIO_F_BIO_CALLBACK_CTRL 131 +# define BIO_F_BIO_CTRL 103 +# define BIO_F_BIO_GETHOSTBYNAME 120 +# define BIO_F_BIO_GETS 104 +# define BIO_F_BIO_GET_ACCEPT_SOCKET 105 +# define BIO_F_BIO_GET_HOST_IP 106 +# define BIO_F_BIO_GET_PORT 107 +# define BIO_F_BIO_MAKE_PAIR 121 +# define BIO_F_BIO_NEW 108 +# define BIO_F_BIO_NEW_FILE 109 +# define BIO_F_BIO_NEW_MEM_BUF 126 +# define BIO_F_BIO_NREAD 123 +# define BIO_F_BIO_NREAD0 124 +# define BIO_F_BIO_NWRITE 125 +# define BIO_F_BIO_NWRITE0 122 +# define BIO_F_BIO_PUTS 110 +# define BIO_F_BIO_READ 111 +# define BIO_F_BIO_SOCK_INIT 112 +# define BIO_F_BIO_WRITE 113 +# define BIO_F_BUFFER_CTRL 114 +# define BIO_F_CONN_CTRL 127 +# define BIO_F_CONN_STATE 115 +# define BIO_F_DGRAM_SCTP_READ 132 +# define BIO_F_DGRAM_SCTP_WRITE 133 +# define BIO_F_FILE_CTRL 116 +# define BIO_F_FILE_READ 130 +# define BIO_F_LINEBUFFER_CTRL 129 +# define BIO_F_MEM_READ 128 +# define BIO_F_MEM_WRITE 117 +# define BIO_F_SSL_NEW 118 +# define BIO_F_WSASTARTUP 119 + +/* Reason codes. */ +# define BIO_R_ACCEPT_ERROR 100 +# define BIO_R_BAD_FOPEN_MODE 101 +# define BIO_R_BAD_HOSTNAME_LOOKUP 102 +# define BIO_R_BROKEN_PIPE 124 +# define BIO_R_CONNECT_ERROR 103 +# define BIO_R_EOF_ON_MEMORY_BIO 127 +# define BIO_R_ERROR_SETTING_NBIO 104 +# define BIO_R_ERROR_SETTING_NBIO_ON_ACCEPTED_SOCKET 105 +# define BIO_R_ERROR_SETTING_NBIO_ON_ACCEPT_SOCKET 106 +# define BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET 107 +# define BIO_R_INVALID_ARGUMENT 125 +# define BIO_R_INVALID_IP_ADDRESS 108 +# define BIO_R_IN_USE 123 +# define BIO_R_KEEPALIVE 109 +# define BIO_R_NBIO_CONNECT_ERROR 110 +# define BIO_R_NO_ACCEPT_PORT_SPECIFIED 111 +# define BIO_R_NO_HOSTNAME_SPECIFIED 112 +# define BIO_R_NO_PORT_DEFINED 113 +# define BIO_R_NO_PORT_SPECIFIED 114 +# define BIO_R_NO_SUCH_FILE 128 +# define BIO_R_NULL_PARAMETER 115 +# define BIO_R_TAG_MISMATCH 116 +# define BIO_R_UNABLE_TO_BIND_SOCKET 117 +# define BIO_R_UNABLE_TO_CREATE_SOCKET 118 +# define BIO_R_UNABLE_TO_LISTEN_SOCKET 119 +# define BIO_R_UNINITIALIZED 120 +# define BIO_R_UNSUPPORTED_METHOD 121 +# define BIO_R_WRITE_TO_READ_ONLY_BIO 126 +# define BIO_R_WSASTARTUP 122 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/blowfish.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/blowfish.h new file mode 100644 index 0000000..8329302 --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/blowfish.h @@ -0,0 +1,130 @@ +/* crypto/bf/blowfish.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_BLOWFISH_H +# define HEADER_BLOWFISH_H + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# ifdef OPENSSL_NO_BF +# error BF is disabled. +# endif + +# define BF_ENCRYPT 1 +# define BF_DECRYPT 0 + +/*- + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + * ! BF_LONG has to be at least 32 bits wide. If it's wider, then ! + * ! BF_LONG_LOG2 has to be defined along. ! + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + */ + +# if defined(__LP32__) +# define BF_LONG unsigned long +# elif defined(OPENSSL_SYS_CRAY) || defined(__ILP64__) +# define BF_LONG unsigned long +# define BF_LONG_LOG2 3 +/* + * _CRAY note. I could declare short, but I have no idea what impact + * does it have on performance on none-T3E machines. I could declare + * int, but at least on C90 sizeof(int) can be chosen at compile time. + * So I've chosen long... + * + */ +# else +# define BF_LONG unsigned int +# endif + +# define BF_ROUNDS 16 +# define BF_BLOCK 8 + +typedef struct bf_key_st { + BF_LONG P[BF_ROUNDS + 2]; + BF_LONG S[4 * 256]; +} BF_KEY; + +# ifdef OPENSSL_FIPS +void private_BF_set_key(BF_KEY *key, int len, const unsigned char *data); +# endif +void BF_set_key(BF_KEY *key, int len, const unsigned char *data); + +void BF_encrypt(BF_LONG *data, const BF_KEY *key); +void BF_decrypt(BF_LONG *data, const BF_KEY *key); + +void BF_ecb_encrypt(const unsigned char *in, unsigned char *out, + const BF_KEY *key, int enc); +void BF_cbc_encrypt(const unsigned char *in, unsigned char *out, long length, + const BF_KEY *schedule, unsigned char *ivec, int enc); +void BF_cfb64_encrypt(const unsigned char *in, unsigned char *out, + long length, const BF_KEY *schedule, + unsigned char *ivec, int *num, int enc); +void BF_ofb64_encrypt(const unsigned char *in, unsigned char *out, + long length, const BF_KEY *schedule, + unsigned char *ivec, int *num); +const char *BF_options(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/bn.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/bn.h new file mode 100644 index 0000000..633d1b1 --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/bn.h @@ -0,0 +1,951 @@ +/* crypto/bn/bn.h */ +/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ +/* ==================================================================== + * Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * + * Portions of the attached software ("Contribution") are developed by + * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project. + * + * The Contribution is licensed pursuant to the Eric Young open source + * license provided above. + * + * The binary polynomial arithmetic software is originally written by + * Sheueling Chang Shantz and Douglas Stebila of Sun Microsystems Laboratories. + * + */ + +#ifndef HEADER_BN_H +# define HEADER_BN_H + +# include +# include +# ifndef OPENSSL_NO_FP_API +# include /* FILE */ +# endif +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * These preprocessor symbols control various aspects of the bignum headers + * and library code. They're not defined by any "normal" configuration, as + * they are intended for development and testing purposes. NB: defining all + * three can be useful for debugging application code as well as openssl + * itself. BN_DEBUG - turn on various debugging alterations to the bignum + * code BN_DEBUG_RAND - uses random poisoning of unused words to trip up + * mismanagement of bignum internals. You must also define BN_DEBUG. + */ +/* #define BN_DEBUG */ +/* #define BN_DEBUG_RAND */ + +# ifndef OPENSSL_SMALL_FOOTPRINT +# define BN_MUL_COMBA +# define BN_SQR_COMBA +# define BN_RECURSION +# endif + +/* + * This next option uses the C libraries (2 word)/(1 word) function. If it is + * not defined, I use my C version (which is slower). The reason for this + * flag is that when the particular C compiler library routine is used, and + * the library is linked with a different compiler, the library is missing. + * This mostly happens when the library is built with gcc and then linked + * using normal cc. This would be a common occurrence because gcc normally + * produces code that is 2 times faster than system compilers for the big + * number stuff. For machines with only one compiler (or shared libraries), + * this should be on. Again this in only really a problem on machines using + * "long long's", are 32bit, and are not using my assembler code. + */ +# if defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_WINDOWS) || \ + defined(OPENSSL_SYS_WIN32) || defined(linux) +# ifndef BN_DIV2W +# define BN_DIV2W +# endif +# endif + +/* + * assuming long is 64bit - this is the DEC Alpha unsigned long long is only + * 64 bits :-(, don't define BN_LLONG for the DEC Alpha + */ +# ifdef SIXTY_FOUR_BIT_LONG +# define BN_ULLONG unsigned long long +# define BN_ULONG unsigned long +# define BN_LONG long +# define BN_BITS 128 +# define BN_BYTES 8 +# define BN_BITS2 64 +# define BN_BITS4 32 +# define BN_MASK (0xffffffffffffffffffffffffffffffffLL) +# define BN_MASK2 (0xffffffffffffffffL) +# define BN_MASK2l (0xffffffffL) +# define BN_MASK2h (0xffffffff00000000L) +# define BN_MASK2h1 (0xffffffff80000000L) +# define BN_TBIT (0x8000000000000000L) +# define BN_DEC_CONV (10000000000000000000UL) +# define BN_DEC_FMT1 "%lu" +# define BN_DEC_FMT2 "%019lu" +# define BN_DEC_NUM 19 +# define BN_HEX_FMT1 "%lX" +# define BN_HEX_FMT2 "%016lX" +# endif + +/* + * This is where the long long data type is 64 bits, but long is 32. For + * machines where there are 64bit registers, this is the mode to use. IRIX, + * on R4000 and above should use this mode, along with the relevant assembler + * code :-). Do NOT define BN_LLONG. + */ +# ifdef SIXTY_FOUR_BIT +# undef BN_LLONG +# undef BN_ULLONG +# define BN_ULONG unsigned long long +# define BN_LONG long long +# define BN_BITS 128 +# define BN_BYTES 8 +# define BN_BITS2 64 +# define BN_BITS4 32 +# define BN_MASK2 (0xffffffffffffffffLL) +# define BN_MASK2l (0xffffffffL) +# define BN_MASK2h (0xffffffff00000000LL) +# define BN_MASK2h1 (0xffffffff80000000LL) +# define BN_TBIT (0x8000000000000000LL) +# define BN_DEC_CONV (10000000000000000000ULL) +# define BN_DEC_FMT1 "%llu" +# define BN_DEC_FMT2 "%019llu" +# define BN_DEC_NUM 19 +# define BN_HEX_FMT1 "%llX" +# define BN_HEX_FMT2 "%016llX" +# endif + +# ifdef THIRTY_TWO_BIT +# ifdef BN_LLONG +# if defined(_WIN32) && !defined(__GNUC__) +# define BN_ULLONG unsigned __int64 +# define BN_MASK (0xffffffffffffffffI64) +# else +# define BN_ULLONG unsigned long long +# define BN_MASK (0xffffffffffffffffLL) +# endif +# endif +# define BN_ULONG unsigned int +# define BN_LONG int +# define BN_BITS 64 +# define BN_BYTES 4 +# define BN_BITS2 32 +# define BN_BITS4 16 +# define BN_MASK2 (0xffffffffL) +# define BN_MASK2l (0xffff) +# define BN_MASK2h1 (0xffff8000L) +# define BN_MASK2h (0xffff0000L) +# define BN_TBIT (0x80000000L) +# define BN_DEC_CONV (1000000000L) +# define BN_DEC_FMT1 "%u" +# define BN_DEC_FMT2 "%09u" +# define BN_DEC_NUM 9 +# define BN_HEX_FMT1 "%X" +# define BN_HEX_FMT2 "%08X" +# endif + +# define BN_DEFAULT_BITS 1280 + +# define BN_FLG_MALLOCED 0x01 +# define BN_FLG_STATIC_DATA 0x02 + +/* + * avoid leaking exponent information through timing, + * BN_mod_exp_mont() will call BN_mod_exp_mont_consttime, + * BN_div() will call BN_div_no_branch, + * BN_mod_inverse() will call BN_mod_inverse_no_branch. + */ +# define BN_FLG_CONSTTIME 0x04 + +# ifdef OPENSSL_NO_DEPRECATED +/* deprecated name for the flag */ +# define BN_FLG_EXP_CONSTTIME BN_FLG_CONSTTIME +/* + * avoid leaking exponent information through timings + * (BN_mod_exp_mont() will call BN_mod_exp_mont_consttime) + */ +# endif + +# ifndef OPENSSL_NO_DEPRECATED +# define BN_FLG_FREE 0x8000 + /* used for debuging */ +# endif +# define BN_set_flags(b,n) ((b)->flags|=(n)) +# define BN_get_flags(b,n) ((b)->flags&(n)) + +/* + * get a clone of a BIGNUM with changed flags, for *temporary* use only (the + * two BIGNUMs cannot not be used in parallel!) + */ +# define BN_with_flags(dest,b,n) ((dest)->d=(b)->d, \ + (dest)->top=(b)->top, \ + (dest)->dmax=(b)->dmax, \ + (dest)->neg=(b)->neg, \ + (dest)->flags=(((dest)->flags & BN_FLG_MALLOCED) \ + | ((b)->flags & ~BN_FLG_MALLOCED) \ + | BN_FLG_STATIC_DATA \ + | (n))) + +/* Already declared in ossl_typ.h */ +# if 0 +typedef struct bignum_st BIGNUM; +/* Used for temp variables (declaration hidden in bn_lcl.h) */ +typedef struct bignum_ctx BN_CTX; +typedef struct bn_blinding_st BN_BLINDING; +typedef struct bn_mont_ctx_st BN_MONT_CTX; +typedef struct bn_recp_ctx_st BN_RECP_CTX; +typedef struct bn_gencb_st BN_GENCB; +# endif + +struct bignum_st { + BN_ULONG *d; /* Pointer to an array of 'BN_BITS2' bit + * chunks. */ + int top; /* Index of last used d +1. */ + /* The next are internal book keeping for bn_expand. */ + int dmax; /* Size of the d array. */ + int neg; /* one if the number is negative */ + int flags; +}; + +/* Used for montgomery multiplication */ +struct bn_mont_ctx_st { + int ri; /* number of bits in R */ + BIGNUM RR; /* used to convert to montgomery form */ + BIGNUM N; /* The modulus */ + BIGNUM Ni; /* R*(1/R mod N) - N*Ni = 1 (Ni is only + * stored for bignum algorithm) */ + BN_ULONG n0[2]; /* least significant word(s) of Ni; (type + * changed with 0.9.9, was "BN_ULONG n0;" + * before) */ + int flags; +}; + +/* + * Used for reciprocal division/mod functions It cannot be shared between + * threads + */ +struct bn_recp_ctx_st { + BIGNUM N; /* the divisor */ + BIGNUM Nr; /* the reciprocal */ + int num_bits; + int shift; + int flags; +}; + +/* Used for slow "generation" functions. */ +struct bn_gencb_st { + unsigned int ver; /* To handle binary (in)compatibility */ + void *arg; /* callback-specific data */ + union { + /* if(ver==1) - handles old style callbacks */ + void (*cb_1) (int, int, void *); + /* if(ver==2) - new callback style */ + int (*cb_2) (int, int, BN_GENCB *); + } cb; +}; +/* Wrapper function to make using BN_GENCB easier, */ +int BN_GENCB_call(BN_GENCB *cb, int a, int b); +/* Macro to populate a BN_GENCB structure with an "old"-style callback */ +# define BN_GENCB_set_old(gencb, callback, cb_arg) { \ + BN_GENCB *tmp_gencb = (gencb); \ + tmp_gencb->ver = 1; \ + tmp_gencb->arg = (cb_arg); \ + tmp_gencb->cb.cb_1 = (callback); } +/* Macro to populate a BN_GENCB structure with a "new"-style callback */ +# define BN_GENCB_set(gencb, callback, cb_arg) { \ + BN_GENCB *tmp_gencb = (gencb); \ + tmp_gencb->ver = 2; \ + tmp_gencb->arg = (cb_arg); \ + tmp_gencb->cb.cb_2 = (callback); } + +# define BN_prime_checks 0 /* default: select number of iterations based + * on the size of the number */ + +/* + * number of Miller-Rabin iterations for an error rate of less than 2^-80 for + * random 'b'-bit input, b >= 100 (taken from table 4.4 in the Handbook of + * Applied Cryptography [Menezes, van Oorschot, Vanstone; CRC Press 1996]; + * original paper: Damgaard, Landrock, Pomerance: Average case error + * estimates for the strong probable prime test. -- Math. Comp. 61 (1993) + * 177-194) + */ +# define BN_prime_checks_for_size(b) ((b) >= 1300 ? 2 : \ + (b) >= 850 ? 3 : \ + (b) >= 650 ? 4 : \ + (b) >= 550 ? 5 : \ + (b) >= 450 ? 6 : \ + (b) >= 400 ? 7 : \ + (b) >= 350 ? 8 : \ + (b) >= 300 ? 9 : \ + (b) >= 250 ? 12 : \ + (b) >= 200 ? 15 : \ + (b) >= 150 ? 18 : \ + /* b >= 100 */ 27) + +# define BN_num_bytes(a) ((BN_num_bits(a)+7)/8) + +/* Note that BN_abs_is_word didn't work reliably for w == 0 until 0.9.8 */ +# define BN_abs_is_word(a,w) ((((a)->top == 1) && ((a)->d[0] == (BN_ULONG)(w))) || \ + (((w) == 0) && ((a)->top == 0))) +# define BN_is_zero(a) ((a)->top == 0) +# define BN_is_one(a) (BN_abs_is_word((a),1) && !(a)->neg) +# define BN_is_word(a,w) (BN_abs_is_word((a),(w)) && (!(w) || !(a)->neg)) +# define BN_is_odd(a) (((a)->top > 0) && ((a)->d[0] & 1)) + +# define BN_one(a) (BN_set_word((a),1)) +# define BN_zero_ex(a) \ + do { \ + BIGNUM *_tmp_bn = (a); \ + _tmp_bn->top = 0; \ + _tmp_bn->neg = 0; \ + } while(0) +# ifdef OPENSSL_NO_DEPRECATED +# define BN_zero(a) BN_zero_ex(a) +# else +# define BN_zero(a) (BN_set_word((a),0)) +# endif + +const BIGNUM *BN_value_one(void); +char *BN_options(void); +BN_CTX *BN_CTX_new(void); +# ifndef OPENSSL_NO_DEPRECATED +void BN_CTX_init(BN_CTX *c); +# endif +void BN_CTX_free(BN_CTX *c); +void BN_CTX_start(BN_CTX *ctx); +BIGNUM *BN_CTX_get(BN_CTX *ctx); +void BN_CTX_end(BN_CTX *ctx); +int BN_rand(BIGNUM *rnd, int bits, int top, int bottom); +int BN_pseudo_rand(BIGNUM *rnd, int bits, int top, int bottom); +int BN_rand_range(BIGNUM *rnd, const BIGNUM *range); +int BN_pseudo_rand_range(BIGNUM *rnd, const BIGNUM *range); +int BN_num_bits(const BIGNUM *a); +int BN_num_bits_word(BN_ULONG); +BIGNUM *BN_new(void); +void BN_init(BIGNUM *); +void BN_clear_free(BIGNUM *a); +BIGNUM *BN_copy(BIGNUM *a, const BIGNUM *b); +void BN_swap(BIGNUM *a, BIGNUM *b); +BIGNUM *BN_bin2bn(const unsigned char *s, int len, BIGNUM *ret); +int BN_bn2bin(const BIGNUM *a, unsigned char *to); +BIGNUM *BN_mpi2bn(const unsigned char *s, int len, BIGNUM *ret); +int BN_bn2mpi(const BIGNUM *a, unsigned char *to); +int BN_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); +int BN_usub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); +int BN_uadd(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); +int BN_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); +int BN_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx); +int BN_sqr(BIGNUM *r, const BIGNUM *a, BN_CTX *ctx); +/** BN_set_negative sets sign of a BIGNUM + * \param b pointer to the BIGNUM object + * \param n 0 if the BIGNUM b should be positive and a value != 0 otherwise + */ +void BN_set_negative(BIGNUM *b, int n); +/** BN_is_negative returns 1 if the BIGNUM is negative + * \param a pointer to the BIGNUM object + * \return 1 if a < 0 and 0 otherwise + */ +# define BN_is_negative(a) ((a)->neg != 0) + +int BN_div(BIGNUM *dv, BIGNUM *rem, const BIGNUM *m, const BIGNUM *d, + BN_CTX *ctx); +# define BN_mod(rem,m,d,ctx) BN_div(NULL,(rem),(m),(d),(ctx)) +int BN_nnmod(BIGNUM *r, const BIGNUM *m, const BIGNUM *d, BN_CTX *ctx); +int BN_mod_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, + BN_CTX *ctx); +int BN_mod_add_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const BIGNUM *m); +int BN_mod_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, + BN_CTX *ctx); +int BN_mod_sub_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const BIGNUM *m); +int BN_mod_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, + BN_CTX *ctx); +int BN_mod_sqr(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx); +int BN_mod_lshift1(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx); +int BN_mod_lshift1_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *m); +int BN_mod_lshift(BIGNUM *r, const BIGNUM *a, int n, const BIGNUM *m, + BN_CTX *ctx); +int BN_mod_lshift_quick(BIGNUM *r, const BIGNUM *a, int n, const BIGNUM *m); + +BN_ULONG BN_mod_word(const BIGNUM *a, BN_ULONG w); +BN_ULONG BN_div_word(BIGNUM *a, BN_ULONG w); +int BN_mul_word(BIGNUM *a, BN_ULONG w); +int BN_add_word(BIGNUM *a, BN_ULONG w); +int BN_sub_word(BIGNUM *a, BN_ULONG w); +int BN_set_word(BIGNUM *a, BN_ULONG w); +BN_ULONG BN_get_word(const BIGNUM *a); + +int BN_cmp(const BIGNUM *a, const BIGNUM *b); +void BN_free(BIGNUM *a); +int BN_is_bit_set(const BIGNUM *a, int n); +int BN_lshift(BIGNUM *r, const BIGNUM *a, int n); +int BN_lshift1(BIGNUM *r, const BIGNUM *a); +int BN_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); + +int BN_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx); +int BN_mod_exp_mont(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx); +int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx, + BN_MONT_CTX *in_mont); +int BN_mod_exp_mont_word(BIGNUM *r, BN_ULONG a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx); +int BN_mod_exp2_mont(BIGNUM *r, const BIGNUM *a1, const BIGNUM *p1, + const BIGNUM *a2, const BIGNUM *p2, const BIGNUM *m, + BN_CTX *ctx, BN_MONT_CTX *m_ctx); +int BN_mod_exp_simple(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx); + +int BN_mask_bits(BIGNUM *a, int n); +# ifndef OPENSSL_NO_FP_API +int BN_print_fp(FILE *fp, const BIGNUM *a); +# endif +# ifdef HEADER_BIO_H +int BN_print(BIO *fp, const BIGNUM *a); +# else +int BN_print(void *fp, const BIGNUM *a); +# endif +int BN_reciprocal(BIGNUM *r, const BIGNUM *m, int len, BN_CTX *ctx); +int BN_rshift(BIGNUM *r, const BIGNUM *a, int n); +int BN_rshift1(BIGNUM *r, const BIGNUM *a); +void BN_clear(BIGNUM *a); +BIGNUM *BN_dup(const BIGNUM *a); +int BN_ucmp(const BIGNUM *a, const BIGNUM *b); +int BN_set_bit(BIGNUM *a, int n); +int BN_clear_bit(BIGNUM *a, int n); +char *BN_bn2hex(const BIGNUM *a); +char *BN_bn2dec(const BIGNUM *a); +int BN_hex2bn(BIGNUM **a, const char *str); +int BN_dec2bn(BIGNUM **a, const char *str); +int BN_asc2bn(BIGNUM **a, const char *str); +int BN_gcd(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx); +int BN_kronecker(const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx); /* returns + * -2 for + * error */ +BIGNUM *BN_mod_inverse(BIGNUM *ret, + const BIGNUM *a, const BIGNUM *n, BN_CTX *ctx); +BIGNUM *BN_mod_sqrt(BIGNUM *ret, + const BIGNUM *a, const BIGNUM *n, BN_CTX *ctx); + +void BN_consttime_swap(BN_ULONG swap, BIGNUM *a, BIGNUM *b, int nwords); + +/* Deprecated versions */ +# ifndef OPENSSL_NO_DEPRECATED +BIGNUM *BN_generate_prime(BIGNUM *ret, int bits, int safe, + const BIGNUM *add, const BIGNUM *rem, + void (*callback) (int, int, void *), void *cb_arg); +int BN_is_prime(const BIGNUM *p, int nchecks, + void (*callback) (int, int, void *), + BN_CTX *ctx, void *cb_arg); +int BN_is_prime_fasttest(const BIGNUM *p, int nchecks, + void (*callback) (int, int, void *), BN_CTX *ctx, + void *cb_arg, int do_trial_division); +# endif /* !defined(OPENSSL_NO_DEPRECATED) */ + +/* Newer versions */ +int BN_generate_prime_ex(BIGNUM *ret, int bits, int safe, const BIGNUM *add, + const BIGNUM *rem, BN_GENCB *cb); +int BN_is_prime_ex(const BIGNUM *p, int nchecks, BN_CTX *ctx, BN_GENCB *cb); +int BN_is_prime_fasttest_ex(const BIGNUM *p, int nchecks, BN_CTX *ctx, + int do_trial_division, BN_GENCB *cb); + +int BN_X931_generate_Xpq(BIGNUM *Xp, BIGNUM *Xq, int nbits, BN_CTX *ctx); + +int BN_X931_derive_prime_ex(BIGNUM *p, BIGNUM *p1, BIGNUM *p2, + const BIGNUM *Xp, const BIGNUM *Xp1, + const BIGNUM *Xp2, const BIGNUM *e, BN_CTX *ctx, + BN_GENCB *cb); +int BN_X931_generate_prime_ex(BIGNUM *p, BIGNUM *p1, BIGNUM *p2, BIGNUM *Xp1, + BIGNUM *Xp2, const BIGNUM *Xp, const BIGNUM *e, + BN_CTX *ctx, BN_GENCB *cb); + +BN_MONT_CTX *BN_MONT_CTX_new(void); +void BN_MONT_CTX_init(BN_MONT_CTX *ctx); +int BN_mod_mul_montgomery(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + BN_MONT_CTX *mont, BN_CTX *ctx); +# define BN_to_montgomery(r,a,mont,ctx) BN_mod_mul_montgomery(\ + (r),(a),&((mont)->RR),(mont),(ctx)) +int BN_from_montgomery(BIGNUM *r, const BIGNUM *a, + BN_MONT_CTX *mont, BN_CTX *ctx); +void BN_MONT_CTX_free(BN_MONT_CTX *mont); +int BN_MONT_CTX_set(BN_MONT_CTX *mont, const BIGNUM *mod, BN_CTX *ctx); +BN_MONT_CTX *BN_MONT_CTX_copy(BN_MONT_CTX *to, BN_MONT_CTX *from); +BN_MONT_CTX *BN_MONT_CTX_set_locked(BN_MONT_CTX **pmont, int lock, + const BIGNUM *mod, BN_CTX *ctx); + +/* BN_BLINDING flags */ +# define BN_BLINDING_NO_UPDATE 0x00000001 +# define BN_BLINDING_NO_RECREATE 0x00000002 + +BN_BLINDING *BN_BLINDING_new(const BIGNUM *A, const BIGNUM *Ai, BIGNUM *mod); +void BN_BLINDING_free(BN_BLINDING *b); +int BN_BLINDING_update(BN_BLINDING *b, BN_CTX *ctx); +int BN_BLINDING_convert(BIGNUM *n, BN_BLINDING *b, BN_CTX *ctx); +int BN_BLINDING_invert(BIGNUM *n, BN_BLINDING *b, BN_CTX *ctx); +int BN_BLINDING_convert_ex(BIGNUM *n, BIGNUM *r, BN_BLINDING *b, BN_CTX *); +int BN_BLINDING_invert_ex(BIGNUM *n, const BIGNUM *r, BN_BLINDING *b, + BN_CTX *); +# ifndef OPENSSL_NO_DEPRECATED +unsigned long BN_BLINDING_get_thread_id(const BN_BLINDING *); +void BN_BLINDING_set_thread_id(BN_BLINDING *, unsigned long); +# endif +CRYPTO_THREADID *BN_BLINDING_thread_id(BN_BLINDING *); +unsigned long BN_BLINDING_get_flags(const BN_BLINDING *); +void BN_BLINDING_set_flags(BN_BLINDING *, unsigned long); +BN_BLINDING *BN_BLINDING_create_param(BN_BLINDING *b, + const BIGNUM *e, BIGNUM *m, BN_CTX *ctx, + int (*bn_mod_exp) (BIGNUM *r, + const BIGNUM *a, + const BIGNUM *p, + const BIGNUM *m, + BN_CTX *ctx, + BN_MONT_CTX *m_ctx), + BN_MONT_CTX *m_ctx); + +# ifndef OPENSSL_NO_DEPRECATED +void BN_set_params(int mul, int high, int low, int mont); +int BN_get_params(int which); /* 0, mul, 1 high, 2 low, 3 mont */ +# endif + +void BN_RECP_CTX_init(BN_RECP_CTX *recp); +BN_RECP_CTX *BN_RECP_CTX_new(void); +void BN_RECP_CTX_free(BN_RECP_CTX *recp); +int BN_RECP_CTX_set(BN_RECP_CTX *recp, const BIGNUM *rdiv, BN_CTX *ctx); +int BN_mod_mul_reciprocal(BIGNUM *r, const BIGNUM *x, const BIGNUM *y, + BN_RECP_CTX *recp, BN_CTX *ctx); +int BN_mod_exp_recp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx); +int BN_div_recp(BIGNUM *dv, BIGNUM *rem, const BIGNUM *m, + BN_RECP_CTX *recp, BN_CTX *ctx); + +# ifndef OPENSSL_NO_EC2M + +/* + * Functions for arithmetic over binary polynomials represented by BIGNUMs. + * The BIGNUM::neg property of BIGNUMs representing binary polynomials is + * ignored. Note that input arguments are not const so that their bit arrays + * can be expanded to the appropriate size if needed. + */ + +/* + * r = a + b + */ +int BN_GF2m_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); +# define BN_GF2m_sub(r, a, b) BN_GF2m_add(r, a, b) +/* + * r=a mod p + */ +int BN_GF2m_mod(BIGNUM *r, const BIGNUM *a, const BIGNUM *p); +/* r = (a * b) mod p */ +int BN_GF2m_mod_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const BIGNUM *p, BN_CTX *ctx); +/* r = (a * a) mod p */ +int BN_GF2m_mod_sqr(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); +/* r = (1 / b) mod p */ +int BN_GF2m_mod_inv(BIGNUM *r, const BIGNUM *b, const BIGNUM *p, BN_CTX *ctx); +/* r = (a / b) mod p */ +int BN_GF2m_mod_div(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const BIGNUM *p, BN_CTX *ctx); +/* r = (a ^ b) mod p */ +int BN_GF2m_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const BIGNUM *p, BN_CTX *ctx); +/* r = sqrt(a) mod p */ +int BN_GF2m_mod_sqrt(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + BN_CTX *ctx); +/* r^2 + r = a mod p */ +int BN_GF2m_mod_solve_quad(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + BN_CTX *ctx); +# define BN_GF2m_cmp(a, b) BN_ucmp((a), (b)) +/*- + * Some functions allow for representation of the irreducible polynomials + * as an unsigned int[], say p. The irreducible f(t) is then of the form: + * t^p[0] + t^p[1] + ... + t^p[k] + * where m = p[0] > p[1] > ... > p[k] = 0. + */ +/* r = a mod p */ +int BN_GF2m_mod_arr(BIGNUM *r, const BIGNUM *a, const int p[]); +/* r = (a * b) mod p */ +int BN_GF2m_mod_mul_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const int p[], BN_CTX *ctx); +/* r = (a * a) mod p */ +int BN_GF2m_mod_sqr_arr(BIGNUM *r, const BIGNUM *a, const int p[], + BN_CTX *ctx); +/* r = (1 / b) mod p */ +int BN_GF2m_mod_inv_arr(BIGNUM *r, const BIGNUM *b, const int p[], + BN_CTX *ctx); +/* r = (a / b) mod p */ +int BN_GF2m_mod_div_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const int p[], BN_CTX *ctx); +/* r = (a ^ b) mod p */ +int BN_GF2m_mod_exp_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const int p[], BN_CTX *ctx); +/* r = sqrt(a) mod p */ +int BN_GF2m_mod_sqrt_arr(BIGNUM *r, const BIGNUM *a, + const int p[], BN_CTX *ctx); +/* r^2 + r = a mod p */ +int BN_GF2m_mod_solve_quad_arr(BIGNUM *r, const BIGNUM *a, + const int p[], BN_CTX *ctx); +int BN_GF2m_poly2arr(const BIGNUM *a, int p[], int max); +int BN_GF2m_arr2poly(const int p[], BIGNUM *a); + +# endif + +/* + * faster mod functions for the 'NIST primes' 0 <= a < p^2 + */ +int BN_nist_mod_192(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); +int BN_nist_mod_224(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); +int BN_nist_mod_256(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); +int BN_nist_mod_384(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); +int BN_nist_mod_521(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); + +const BIGNUM *BN_get0_nist_prime_192(void); +const BIGNUM *BN_get0_nist_prime_224(void); +const BIGNUM *BN_get0_nist_prime_256(void); +const BIGNUM *BN_get0_nist_prime_384(void); +const BIGNUM *BN_get0_nist_prime_521(void); + +/* library internal functions */ + +# define bn_expand(a,bits) \ + ( \ + bits > (INT_MAX - BN_BITS2 + 1) ? \ + NULL \ + : \ + (((bits+BN_BITS2-1)/BN_BITS2) <= (a)->dmax) ? \ + (a) \ + : \ + bn_expand2((a),(bits+BN_BITS2-1)/BN_BITS2) \ + ) + +# define bn_wexpand(a,words) (((words) <= (a)->dmax)?(a):bn_expand2((a),(words))) +BIGNUM *bn_expand2(BIGNUM *a, int words); +# ifndef OPENSSL_NO_DEPRECATED +BIGNUM *bn_dup_expand(const BIGNUM *a, int words); /* unused */ +# endif + +/*- + * Bignum consistency macros + * There is one "API" macro, bn_fix_top(), for stripping leading zeroes from + * bignum data after direct manipulations on the data. There is also an + * "internal" macro, bn_check_top(), for verifying that there are no leading + * zeroes. Unfortunately, some auditing is required due to the fact that + * bn_fix_top() has become an overabused duct-tape because bignum data is + * occasionally passed around in an inconsistent state. So the following + * changes have been made to sort this out; + * - bn_fix_top()s implementation has been moved to bn_correct_top() + * - if BN_DEBUG isn't defined, bn_fix_top() maps to bn_correct_top(), and + * bn_check_top() is as before. + * - if BN_DEBUG *is* defined; + * - bn_check_top() tries to pollute unused words even if the bignum 'top' is + * consistent. (ed: only if BN_DEBUG_RAND is defined) + * - bn_fix_top() maps to bn_check_top() rather than "fixing" anything. + * The idea is to have debug builds flag up inconsistent bignums when they + * occur. If that occurs in a bn_fix_top(), we examine the code in question; if + * the use of bn_fix_top() was appropriate (ie. it follows directly after code + * that manipulates the bignum) it is converted to bn_correct_top(), and if it + * was not appropriate, we convert it permanently to bn_check_top() and track + * down the cause of the bug. Eventually, no internal code should be using the + * bn_fix_top() macro. External applications and libraries should try this with + * their own code too, both in terms of building against the openssl headers + * with BN_DEBUG defined *and* linking with a version of OpenSSL built with it + * defined. This not only improves external code, it provides more test + * coverage for openssl's own code. + */ + +# ifdef BN_DEBUG + +/* We only need assert() when debugging */ +# include + +# ifdef BN_DEBUG_RAND +/* To avoid "make update" cvs wars due to BN_DEBUG, use some tricks */ +# ifndef RAND_pseudo_bytes +int RAND_pseudo_bytes(unsigned char *buf, int num); +# define BN_DEBUG_TRIX +# endif +# define bn_pollute(a) \ + do { \ + const BIGNUM *_bnum1 = (a); \ + if(_bnum1->top < _bnum1->dmax) { \ + unsigned char _tmp_char; \ + /* We cast away const without the compiler knowing, any \ + * *genuinely* constant variables that aren't mutable \ + * wouldn't be constructed with top!=dmax. */ \ + BN_ULONG *_not_const; \ + memcpy(&_not_const, &_bnum1->d, sizeof(BN_ULONG*)); \ + /* Debug only - safe to ignore error return */ \ + RAND_pseudo_bytes(&_tmp_char, 1); \ + memset((unsigned char *)(_not_const + _bnum1->top), _tmp_char, \ + (_bnum1->dmax - _bnum1->top) * sizeof(BN_ULONG)); \ + } \ + } while(0) +# ifdef BN_DEBUG_TRIX +# undef RAND_pseudo_bytes +# endif +# else +# define bn_pollute(a) +# endif +# define bn_check_top(a) \ + do { \ + const BIGNUM *_bnum2 = (a); \ + if (_bnum2 != NULL) { \ + assert((_bnum2->top == 0) || \ + (_bnum2->d[_bnum2->top - 1] != 0)); \ + bn_pollute(_bnum2); \ + } \ + } while(0) + +# define bn_fix_top(a) bn_check_top(a) + +# define bn_check_size(bn, bits) bn_wcheck_size(bn, ((bits+BN_BITS2-1))/BN_BITS2) +# define bn_wcheck_size(bn, words) \ + do { \ + const BIGNUM *_bnum2 = (bn); \ + assert((words) <= (_bnum2)->dmax && (words) >= (_bnum2)->top); \ + /* avoid unused variable warning with NDEBUG */ \ + (void)(_bnum2); \ + } while(0) + +# else /* !BN_DEBUG */ + +# define bn_pollute(a) +# define bn_check_top(a) +# define bn_fix_top(a) bn_correct_top(a) +# define bn_check_size(bn, bits) +# define bn_wcheck_size(bn, words) + +# endif + +# define bn_correct_top(a) \ + { \ + BN_ULONG *ftl; \ + int tmp_top = (a)->top; \ + if (tmp_top > 0) \ + { \ + for (ftl= &((a)->d[tmp_top-1]); tmp_top > 0; tmp_top--) \ + if (*(ftl--)) break; \ + (a)->top = tmp_top; \ + } \ + if ((a)->top == 0) \ + (a)->neg = 0; \ + bn_pollute(a); \ + } + +BN_ULONG bn_mul_add_words(BN_ULONG *rp, const BN_ULONG *ap, int num, + BN_ULONG w); +BN_ULONG bn_mul_words(BN_ULONG *rp, const BN_ULONG *ap, int num, BN_ULONG w); +void bn_sqr_words(BN_ULONG *rp, const BN_ULONG *ap, int num); +BN_ULONG bn_div_words(BN_ULONG h, BN_ULONG l, BN_ULONG d); +BN_ULONG bn_add_words(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp, + int num); +BN_ULONG bn_sub_words(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp, + int num); + +/* Primes from RFC 2409 */ +BIGNUM *get_rfc2409_prime_768(BIGNUM *bn); +BIGNUM *get_rfc2409_prime_1024(BIGNUM *bn); + +/* Primes from RFC 3526 */ +BIGNUM *get_rfc3526_prime_1536(BIGNUM *bn); +BIGNUM *get_rfc3526_prime_2048(BIGNUM *bn); +BIGNUM *get_rfc3526_prime_3072(BIGNUM *bn); +BIGNUM *get_rfc3526_prime_4096(BIGNUM *bn); +BIGNUM *get_rfc3526_prime_6144(BIGNUM *bn); +BIGNUM *get_rfc3526_prime_8192(BIGNUM *bn); + +int BN_bntest_rand(BIGNUM *rnd, int bits, int top, int bottom); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_BN_strings(void); + +/* Error codes for the BN functions. */ + +/* Function codes. */ +# define BN_F_BNRAND 127 +# define BN_F_BN_BLINDING_CONVERT_EX 100 +# define BN_F_BN_BLINDING_CREATE_PARAM 128 +# define BN_F_BN_BLINDING_INVERT_EX 101 +# define BN_F_BN_BLINDING_NEW 102 +# define BN_F_BN_BLINDING_UPDATE 103 +# define BN_F_BN_BN2DEC 104 +# define BN_F_BN_BN2HEX 105 +# define BN_F_BN_CTX_GET 116 +# define BN_F_BN_CTX_NEW 106 +# define BN_F_BN_CTX_START 129 +# define BN_F_BN_DIV 107 +# define BN_F_BN_DIV_NO_BRANCH 138 +# define BN_F_BN_DIV_RECP 130 +# define BN_F_BN_EXP 123 +# define BN_F_BN_EXPAND2 108 +# define BN_F_BN_EXPAND_INTERNAL 120 +# define BN_F_BN_GF2M_MOD 131 +# define BN_F_BN_GF2M_MOD_EXP 132 +# define BN_F_BN_GF2M_MOD_MUL 133 +# define BN_F_BN_GF2M_MOD_SOLVE_QUAD 134 +# define BN_F_BN_GF2M_MOD_SOLVE_QUAD_ARR 135 +# define BN_F_BN_GF2M_MOD_SQR 136 +# define BN_F_BN_GF2M_MOD_SQRT 137 +# define BN_F_BN_LSHIFT 145 +# define BN_F_BN_MOD_EXP2_MONT 118 +# define BN_F_BN_MOD_EXP_MONT 109 +# define BN_F_BN_MOD_EXP_MONT_CONSTTIME 124 +# define BN_F_BN_MOD_EXP_MONT_WORD 117 +# define BN_F_BN_MOD_EXP_RECP 125 +# define BN_F_BN_MOD_EXP_SIMPLE 126 +# define BN_F_BN_MOD_INVERSE 110 +# define BN_F_BN_MOD_INVERSE_NO_BRANCH 139 +# define BN_F_BN_MOD_LSHIFT_QUICK 119 +# define BN_F_BN_MOD_MUL_RECIPROCAL 111 +# define BN_F_BN_MOD_SQRT 121 +# define BN_F_BN_MPI2BN 112 +# define BN_F_BN_NEW 113 +# define BN_F_BN_RAND 114 +# define BN_F_BN_RAND_RANGE 122 +# define BN_F_BN_RSHIFT 146 +# define BN_F_BN_USUB 115 + +/* Reason codes. */ +# define BN_R_ARG2_LT_ARG3 100 +# define BN_R_BAD_RECIPROCAL 101 +# define BN_R_BIGNUM_TOO_LONG 114 +# define BN_R_BITS_TOO_SMALL 118 +# define BN_R_CALLED_WITH_EVEN_MODULUS 102 +# define BN_R_DIV_BY_ZERO 103 +# define BN_R_ENCODING_ERROR 104 +# define BN_R_EXPAND_ON_STATIC_BIGNUM_DATA 105 +# define BN_R_INPUT_NOT_REDUCED 110 +# define BN_R_INVALID_LENGTH 106 +# define BN_R_INVALID_RANGE 115 +# define BN_R_INVALID_SHIFT 119 +# define BN_R_NOT_A_SQUARE 111 +# define BN_R_NOT_INITIALIZED 107 +# define BN_R_NO_INVERSE 108 +# define BN_R_NO_SOLUTION 116 +# define BN_R_P_IS_NOT_PRIME 112 +# define BN_R_TOO_MANY_ITERATIONS 113 +# define BN_R_TOO_MANY_TEMPORARY_VARIABLES 109 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/buffer.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/buffer.h new file mode 100644 index 0000000..efd240a --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/buffer.h @@ -0,0 +1,125 @@ +/* crypto/buffer/buffer.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_BUFFER_H +# define HEADER_BUFFER_H + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# include + +# if !defined(NO_SYS_TYPES_H) +# include +# endif + +/* Already declared in ossl_typ.h */ +/* typedef struct buf_mem_st BUF_MEM; */ + +struct buf_mem_st { + size_t length; /* current number of bytes */ + char *data; + size_t max; /* size of buffer */ +}; + +BUF_MEM *BUF_MEM_new(void); +void BUF_MEM_free(BUF_MEM *a); +int BUF_MEM_grow(BUF_MEM *str, size_t len); +int BUF_MEM_grow_clean(BUF_MEM *str, size_t len); +size_t BUF_strnlen(const char *str, size_t maxlen); +char *BUF_strdup(const char *str); + +/* + * Like strndup, but in addition, explicitly guarantees to never read past the + * first |siz| bytes of |str|. + */ +char *BUF_strndup(const char *str, size_t siz); + +void *BUF_memdup(const void *data, size_t siz); +void BUF_reverse(unsigned char *out, const unsigned char *in, size_t siz); + +/* safe string functions */ +size_t BUF_strlcpy(char *dst, const char *src, size_t siz); +size_t BUF_strlcat(char *dst, const char *src, size_t siz); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_BUF_strings(void); + +/* Error codes for the BUF functions. */ + +/* Function codes. */ +# define BUF_F_BUF_MEMDUP 103 +# define BUF_F_BUF_MEM_GROW 100 +# define BUF_F_BUF_MEM_GROW_CLEAN 105 +# define BUF_F_BUF_MEM_NEW 101 +# define BUF_F_BUF_STRDUP 102 +# define BUF_F_BUF_STRNDUP 104 + +/* Reason codes. */ + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/camellia.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/camellia.h new file mode 100644 index 0000000..45e8d25 --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/camellia.h @@ -0,0 +1,132 @@ +/* crypto/camellia/camellia.h */ +/* ==================================================================== + * Copyright (c) 2006 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + */ + +#ifndef HEADER_CAMELLIA_H +# define HEADER_CAMELLIA_H + +# include + +# ifdef OPENSSL_NO_CAMELLIA +# error CAMELLIA is disabled. +# endif + +# include + +# define CAMELLIA_ENCRYPT 1 +# define CAMELLIA_DECRYPT 0 + +/* + * Because array size can't be a const in C, the following two are macros. + * Both sizes are in bytes. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* This should be a hidden type, but EVP requires that the size be known */ + +# define CAMELLIA_BLOCK_SIZE 16 +# define CAMELLIA_TABLE_BYTE_LEN 272 +# define CAMELLIA_TABLE_WORD_LEN (CAMELLIA_TABLE_BYTE_LEN / 4) + +typedef unsigned int KEY_TABLE_TYPE[CAMELLIA_TABLE_WORD_LEN]; /* to match + * with WORD */ + +struct camellia_key_st { + union { + double d; /* ensures 64-bit align */ + KEY_TABLE_TYPE rd_key; + } u; + int grand_rounds; +}; +typedef struct camellia_key_st CAMELLIA_KEY; + +# ifdef OPENSSL_FIPS +int private_Camellia_set_key(const unsigned char *userKey, const int bits, + CAMELLIA_KEY *key); +# endif +int Camellia_set_key(const unsigned char *userKey, const int bits, + CAMELLIA_KEY *key); + +void Camellia_encrypt(const unsigned char *in, unsigned char *out, + const CAMELLIA_KEY *key); +void Camellia_decrypt(const unsigned char *in, unsigned char *out, + const CAMELLIA_KEY *key); + +void Camellia_ecb_encrypt(const unsigned char *in, unsigned char *out, + const CAMELLIA_KEY *key, const int enc); +void Camellia_cbc_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const CAMELLIA_KEY *key, + unsigned char *ivec, const int enc); +void Camellia_cfb128_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const CAMELLIA_KEY *key, + unsigned char *ivec, int *num, const int enc); +void Camellia_cfb1_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const CAMELLIA_KEY *key, + unsigned char *ivec, int *num, const int enc); +void Camellia_cfb8_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const CAMELLIA_KEY *key, + unsigned char *ivec, int *num, const int enc); +void Camellia_ofb128_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const CAMELLIA_KEY *key, + unsigned char *ivec, int *num); +void Camellia_ctr128_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const CAMELLIA_KEY *key, + unsigned char ivec[CAMELLIA_BLOCK_SIZE], + unsigned char ecount_buf[CAMELLIA_BLOCK_SIZE], + unsigned int *num); + +#ifdef __cplusplus +} +#endif + +#endif /* !HEADER_Camellia_H */ diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/cast.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/cast.h new file mode 100644 index 0000000..0003ec9 --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/cast.h @@ -0,0 +1,107 @@ +/* crypto/cast/cast.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_CAST_H +# define HEADER_CAST_H + +#ifdef __cplusplus +extern "C" { +#endif + +# include + +# ifdef OPENSSL_NO_CAST +# error CAST is disabled. +# endif + +# define CAST_ENCRYPT 1 +# define CAST_DECRYPT 0 + +# define CAST_LONG unsigned int + +# define CAST_BLOCK 8 +# define CAST_KEY_LENGTH 16 + +typedef struct cast_key_st { + CAST_LONG data[32]; + int short_key; /* Use reduced rounds for short key */ +} CAST_KEY; + +# ifdef OPENSSL_FIPS +void private_CAST_set_key(CAST_KEY *key, int len, const unsigned char *data); +# endif +void CAST_set_key(CAST_KEY *key, int len, const unsigned char *data); +void CAST_ecb_encrypt(const unsigned char *in, unsigned char *out, + const CAST_KEY *key, int enc); +void CAST_encrypt(CAST_LONG *data, const CAST_KEY *key); +void CAST_decrypt(CAST_LONG *data, const CAST_KEY *key); +void CAST_cbc_encrypt(const unsigned char *in, unsigned char *out, + long length, const CAST_KEY *ks, unsigned char *iv, + int enc); +void CAST_cfb64_encrypt(const unsigned char *in, unsigned char *out, + long length, const CAST_KEY *schedule, + unsigned char *ivec, int *num, int enc); +void CAST_ofb64_encrypt(const unsigned char *in, unsigned char *out, + long length, const CAST_KEY *schedule, + unsigned char *ivec, int *num); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/cmac.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/cmac.h new file mode 100644 index 0000000..175be83 --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/cmac.h @@ -0,0 +1,82 @@ +/* crypto/cmac/cmac.h */ +/* + * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL + * project. + */ +/* ==================================================================== + * Copyright (c) 2010 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + */ + +#ifndef HEADER_CMAC_H +# define HEADER_CMAC_H + +#ifdef __cplusplus +extern "C" { +#endif + +# include + +/* Opaque */ +typedef struct CMAC_CTX_st CMAC_CTX; + +CMAC_CTX *CMAC_CTX_new(void); +void CMAC_CTX_cleanup(CMAC_CTX *ctx); +void CMAC_CTX_free(CMAC_CTX *ctx); +EVP_CIPHER_CTX *CMAC_CTX_get0_cipher_ctx(CMAC_CTX *ctx); +int CMAC_CTX_copy(CMAC_CTX *out, const CMAC_CTX *in); + +int CMAC_Init(CMAC_CTX *ctx, const void *key, size_t keylen, + const EVP_CIPHER *cipher, ENGINE *impl); +int CMAC_Update(CMAC_CTX *ctx, const void *data, size_t dlen); +int CMAC_Final(CMAC_CTX *ctx, unsigned char *out, size_t *poutlen); +int CMAC_resume(CMAC_CTX *ctx); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/cms.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/cms.h new file mode 100644 index 0000000..e6c7f96 --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/cms.h @@ -0,0 +1,555 @@ +/* crypto/cms/cms.h */ +/* + * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL + * project. + */ +/* ==================================================================== + * Copyright (c) 2008 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + */ + +#ifndef HEADER_CMS_H +# define HEADER_CMS_H + +# include + +# ifdef OPENSSL_NO_CMS +# error CMS is disabled. +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct CMS_ContentInfo_st CMS_ContentInfo; +typedef struct CMS_SignerInfo_st CMS_SignerInfo; +typedef struct CMS_CertificateChoices CMS_CertificateChoices; +typedef struct CMS_RevocationInfoChoice_st CMS_RevocationInfoChoice; +typedef struct CMS_RecipientInfo_st CMS_RecipientInfo; +typedef struct CMS_ReceiptRequest_st CMS_ReceiptRequest; +typedef struct CMS_Receipt_st CMS_Receipt; +typedef struct CMS_RecipientEncryptedKey_st CMS_RecipientEncryptedKey; +typedef struct CMS_OtherKeyAttribute_st CMS_OtherKeyAttribute; + +DECLARE_STACK_OF(CMS_SignerInfo) +DECLARE_STACK_OF(GENERAL_NAMES) +DECLARE_STACK_OF(CMS_RecipientEncryptedKey) +DECLARE_ASN1_FUNCTIONS(CMS_ContentInfo) +DECLARE_ASN1_FUNCTIONS(CMS_ReceiptRequest) +DECLARE_ASN1_PRINT_FUNCTION(CMS_ContentInfo) + +# define CMS_SIGNERINFO_ISSUER_SERIAL 0 +# define CMS_SIGNERINFO_KEYIDENTIFIER 1 + +# define CMS_RECIPINFO_NONE -1 +# define CMS_RECIPINFO_TRANS 0 +# define CMS_RECIPINFO_AGREE 1 +# define CMS_RECIPINFO_KEK 2 +# define CMS_RECIPINFO_PASS 3 +# define CMS_RECIPINFO_OTHER 4 + +/* S/MIME related flags */ + +# define CMS_TEXT 0x1 +# define CMS_NOCERTS 0x2 +# define CMS_NO_CONTENT_VERIFY 0x4 +# define CMS_NO_ATTR_VERIFY 0x8 +# define CMS_NOSIGS \ + (CMS_NO_CONTENT_VERIFY|CMS_NO_ATTR_VERIFY) +# define CMS_NOINTERN 0x10 +# define CMS_NO_SIGNER_CERT_VERIFY 0x20 +# define CMS_NOVERIFY 0x20 +# define CMS_DETACHED 0x40 +# define CMS_BINARY 0x80 +# define CMS_NOATTR 0x100 +# define CMS_NOSMIMECAP 0x200 +# define CMS_NOOLDMIMETYPE 0x400 +# define CMS_CRLFEOL 0x800 +# define CMS_STREAM 0x1000 +# define CMS_NOCRL 0x2000 +# define CMS_PARTIAL 0x4000 +# define CMS_REUSE_DIGEST 0x8000 +# define CMS_USE_KEYID 0x10000 +# define CMS_DEBUG_DECRYPT 0x20000 +# define CMS_KEY_PARAM 0x40000 + +const ASN1_OBJECT *CMS_get0_type(CMS_ContentInfo *cms); + +BIO *CMS_dataInit(CMS_ContentInfo *cms, BIO *icont); +int CMS_dataFinal(CMS_ContentInfo *cms, BIO *bio); + +ASN1_OCTET_STRING **CMS_get0_content(CMS_ContentInfo *cms); +int CMS_is_detached(CMS_ContentInfo *cms); +int CMS_set_detached(CMS_ContentInfo *cms, int detached); + +# ifdef HEADER_PEM_H +DECLARE_PEM_rw_const(CMS, CMS_ContentInfo) +# endif +int CMS_stream(unsigned char ***boundary, CMS_ContentInfo *cms); +CMS_ContentInfo *d2i_CMS_bio(BIO *bp, CMS_ContentInfo **cms); +int i2d_CMS_bio(BIO *bp, CMS_ContentInfo *cms); + +BIO *BIO_new_CMS(BIO *out, CMS_ContentInfo *cms); +int i2d_CMS_bio_stream(BIO *out, CMS_ContentInfo *cms, BIO *in, int flags); +int PEM_write_bio_CMS_stream(BIO *out, CMS_ContentInfo *cms, BIO *in, + int flags); +CMS_ContentInfo *SMIME_read_CMS(BIO *bio, BIO **bcont); +int SMIME_write_CMS(BIO *bio, CMS_ContentInfo *cms, BIO *data, int flags); + +int CMS_final(CMS_ContentInfo *cms, BIO *data, BIO *dcont, + unsigned int flags); + +CMS_ContentInfo *CMS_sign(X509 *signcert, EVP_PKEY *pkey, + STACK_OF(X509) *certs, BIO *data, + unsigned int flags); + +CMS_ContentInfo *CMS_sign_receipt(CMS_SignerInfo *si, + X509 *signcert, EVP_PKEY *pkey, + STACK_OF(X509) *certs, unsigned int flags); + +int CMS_data(CMS_ContentInfo *cms, BIO *out, unsigned int flags); +CMS_ContentInfo *CMS_data_create(BIO *in, unsigned int flags); + +int CMS_digest_verify(CMS_ContentInfo *cms, BIO *dcont, BIO *out, + unsigned int flags); +CMS_ContentInfo *CMS_digest_create(BIO *in, const EVP_MD *md, + unsigned int flags); + +int CMS_EncryptedData_decrypt(CMS_ContentInfo *cms, + const unsigned char *key, size_t keylen, + BIO *dcont, BIO *out, unsigned int flags); + +CMS_ContentInfo *CMS_EncryptedData_encrypt(BIO *in, const EVP_CIPHER *cipher, + const unsigned char *key, + size_t keylen, unsigned int flags); + +int CMS_EncryptedData_set1_key(CMS_ContentInfo *cms, const EVP_CIPHER *ciph, + const unsigned char *key, size_t keylen); + +int CMS_verify(CMS_ContentInfo *cms, STACK_OF(X509) *certs, + X509_STORE *store, BIO *dcont, BIO *out, unsigned int flags); + +int CMS_verify_receipt(CMS_ContentInfo *rcms, CMS_ContentInfo *ocms, + STACK_OF(X509) *certs, + X509_STORE *store, unsigned int flags); + +STACK_OF(X509) *CMS_get0_signers(CMS_ContentInfo *cms); + +CMS_ContentInfo *CMS_encrypt(STACK_OF(X509) *certs, BIO *in, + const EVP_CIPHER *cipher, unsigned int flags); + +int CMS_decrypt(CMS_ContentInfo *cms, EVP_PKEY *pkey, X509 *cert, + BIO *dcont, BIO *out, unsigned int flags); + +int CMS_decrypt_set1_pkey(CMS_ContentInfo *cms, EVP_PKEY *pk, X509 *cert); +int CMS_decrypt_set1_key(CMS_ContentInfo *cms, + unsigned char *key, size_t keylen, + unsigned char *id, size_t idlen); +int CMS_decrypt_set1_password(CMS_ContentInfo *cms, + unsigned char *pass, ossl_ssize_t passlen); + +STACK_OF(CMS_RecipientInfo) *CMS_get0_RecipientInfos(CMS_ContentInfo *cms); +int CMS_RecipientInfo_type(CMS_RecipientInfo *ri); +EVP_PKEY_CTX *CMS_RecipientInfo_get0_pkey_ctx(CMS_RecipientInfo *ri); +CMS_ContentInfo *CMS_EnvelopedData_create(const EVP_CIPHER *cipher); +CMS_RecipientInfo *CMS_add1_recipient_cert(CMS_ContentInfo *cms, + X509 *recip, unsigned int flags); +int CMS_RecipientInfo_set0_pkey(CMS_RecipientInfo *ri, EVP_PKEY *pkey); +int CMS_RecipientInfo_ktri_cert_cmp(CMS_RecipientInfo *ri, X509 *cert); +int CMS_RecipientInfo_ktri_get0_algs(CMS_RecipientInfo *ri, + EVP_PKEY **pk, X509 **recip, + X509_ALGOR **palg); +int CMS_RecipientInfo_ktri_get0_signer_id(CMS_RecipientInfo *ri, + ASN1_OCTET_STRING **keyid, + X509_NAME **issuer, + ASN1_INTEGER **sno); + +CMS_RecipientInfo *CMS_add0_recipient_key(CMS_ContentInfo *cms, int nid, + unsigned char *key, size_t keylen, + unsigned char *id, size_t idlen, + ASN1_GENERALIZEDTIME *date, + ASN1_OBJECT *otherTypeId, + ASN1_TYPE *otherType); + +int CMS_RecipientInfo_kekri_get0_id(CMS_RecipientInfo *ri, + X509_ALGOR **palg, + ASN1_OCTET_STRING **pid, + ASN1_GENERALIZEDTIME **pdate, + ASN1_OBJECT **potherid, + ASN1_TYPE **pothertype); + +int CMS_RecipientInfo_set0_key(CMS_RecipientInfo *ri, + unsigned char *key, size_t keylen); + +int CMS_RecipientInfo_kekri_id_cmp(CMS_RecipientInfo *ri, + const unsigned char *id, size_t idlen); + +int CMS_RecipientInfo_set0_password(CMS_RecipientInfo *ri, + unsigned char *pass, + ossl_ssize_t passlen); + +CMS_RecipientInfo *CMS_add0_recipient_password(CMS_ContentInfo *cms, + int iter, int wrap_nid, + int pbe_nid, + unsigned char *pass, + ossl_ssize_t passlen, + const EVP_CIPHER *kekciph); + +int CMS_RecipientInfo_decrypt(CMS_ContentInfo *cms, CMS_RecipientInfo *ri); +int CMS_RecipientInfo_encrypt(CMS_ContentInfo *cms, CMS_RecipientInfo *ri); + +int CMS_uncompress(CMS_ContentInfo *cms, BIO *dcont, BIO *out, + unsigned int flags); +CMS_ContentInfo *CMS_compress(BIO *in, int comp_nid, unsigned int flags); + +int CMS_set1_eContentType(CMS_ContentInfo *cms, const ASN1_OBJECT *oid); +const ASN1_OBJECT *CMS_get0_eContentType(CMS_ContentInfo *cms); + +CMS_CertificateChoices *CMS_add0_CertificateChoices(CMS_ContentInfo *cms); +int CMS_add0_cert(CMS_ContentInfo *cms, X509 *cert); +int CMS_add1_cert(CMS_ContentInfo *cms, X509 *cert); +STACK_OF(X509) *CMS_get1_certs(CMS_ContentInfo *cms); + +CMS_RevocationInfoChoice *CMS_add0_RevocationInfoChoice(CMS_ContentInfo *cms); +int CMS_add0_crl(CMS_ContentInfo *cms, X509_CRL *crl); +int CMS_add1_crl(CMS_ContentInfo *cms, X509_CRL *crl); +STACK_OF(X509_CRL) *CMS_get1_crls(CMS_ContentInfo *cms); + +int CMS_SignedData_init(CMS_ContentInfo *cms); +CMS_SignerInfo *CMS_add1_signer(CMS_ContentInfo *cms, + X509 *signer, EVP_PKEY *pk, const EVP_MD *md, + unsigned int flags); +EVP_PKEY_CTX *CMS_SignerInfo_get0_pkey_ctx(CMS_SignerInfo *si); +EVP_MD_CTX *CMS_SignerInfo_get0_md_ctx(CMS_SignerInfo *si); +STACK_OF(CMS_SignerInfo) *CMS_get0_SignerInfos(CMS_ContentInfo *cms); + +void CMS_SignerInfo_set1_signer_cert(CMS_SignerInfo *si, X509 *signer); +int CMS_SignerInfo_get0_signer_id(CMS_SignerInfo *si, + ASN1_OCTET_STRING **keyid, + X509_NAME **issuer, ASN1_INTEGER **sno); +int CMS_SignerInfo_cert_cmp(CMS_SignerInfo *si, X509 *cert); +int CMS_set1_signers_certs(CMS_ContentInfo *cms, STACK_OF(X509) *certs, + unsigned int flags); +void CMS_SignerInfo_get0_algs(CMS_SignerInfo *si, EVP_PKEY **pk, + X509 **signer, X509_ALGOR **pdig, + X509_ALGOR **psig); +ASN1_OCTET_STRING *CMS_SignerInfo_get0_signature(CMS_SignerInfo *si); +int CMS_SignerInfo_sign(CMS_SignerInfo *si); +int CMS_SignerInfo_verify(CMS_SignerInfo *si); +int CMS_SignerInfo_verify_content(CMS_SignerInfo *si, BIO *chain); + +int CMS_add_smimecap(CMS_SignerInfo *si, STACK_OF(X509_ALGOR) *algs); +int CMS_add_simple_smimecap(STACK_OF(X509_ALGOR) **algs, + int algnid, int keysize); +int CMS_add_standard_smimecap(STACK_OF(X509_ALGOR) **smcap); + +int CMS_signed_get_attr_count(const CMS_SignerInfo *si); +int CMS_signed_get_attr_by_NID(const CMS_SignerInfo *si, int nid, + int lastpos); +int CMS_signed_get_attr_by_OBJ(const CMS_SignerInfo *si, ASN1_OBJECT *obj, + int lastpos); +X509_ATTRIBUTE *CMS_signed_get_attr(const CMS_SignerInfo *si, int loc); +X509_ATTRIBUTE *CMS_signed_delete_attr(CMS_SignerInfo *si, int loc); +int CMS_signed_add1_attr(CMS_SignerInfo *si, X509_ATTRIBUTE *attr); +int CMS_signed_add1_attr_by_OBJ(CMS_SignerInfo *si, + const ASN1_OBJECT *obj, int type, + const void *bytes, int len); +int CMS_signed_add1_attr_by_NID(CMS_SignerInfo *si, + int nid, int type, + const void *bytes, int len); +int CMS_signed_add1_attr_by_txt(CMS_SignerInfo *si, + const char *attrname, int type, + const void *bytes, int len); +void *CMS_signed_get0_data_by_OBJ(CMS_SignerInfo *si, ASN1_OBJECT *oid, + int lastpos, int type); + +int CMS_unsigned_get_attr_count(const CMS_SignerInfo *si); +int CMS_unsigned_get_attr_by_NID(const CMS_SignerInfo *si, int nid, + int lastpos); +int CMS_unsigned_get_attr_by_OBJ(const CMS_SignerInfo *si, ASN1_OBJECT *obj, + int lastpos); +X509_ATTRIBUTE *CMS_unsigned_get_attr(const CMS_SignerInfo *si, int loc); +X509_ATTRIBUTE *CMS_unsigned_delete_attr(CMS_SignerInfo *si, int loc); +int CMS_unsigned_add1_attr(CMS_SignerInfo *si, X509_ATTRIBUTE *attr); +int CMS_unsigned_add1_attr_by_OBJ(CMS_SignerInfo *si, + const ASN1_OBJECT *obj, int type, + const void *bytes, int len); +int CMS_unsigned_add1_attr_by_NID(CMS_SignerInfo *si, + int nid, int type, + const void *bytes, int len); +int CMS_unsigned_add1_attr_by_txt(CMS_SignerInfo *si, + const char *attrname, int type, + const void *bytes, int len); +void *CMS_unsigned_get0_data_by_OBJ(CMS_SignerInfo *si, ASN1_OBJECT *oid, + int lastpos, int type); + +# ifdef HEADER_X509V3_H + +int CMS_get1_ReceiptRequest(CMS_SignerInfo *si, CMS_ReceiptRequest **prr); +CMS_ReceiptRequest *CMS_ReceiptRequest_create0(unsigned char *id, int idlen, + int allorfirst, + STACK_OF(GENERAL_NAMES) + *receiptList, STACK_OF(GENERAL_NAMES) + *receiptsTo); +int CMS_add1_ReceiptRequest(CMS_SignerInfo *si, CMS_ReceiptRequest *rr); +void CMS_ReceiptRequest_get0_values(CMS_ReceiptRequest *rr, + ASN1_STRING **pcid, + int *pallorfirst, + STACK_OF(GENERAL_NAMES) **plist, + STACK_OF(GENERAL_NAMES) **prto); +# endif +int CMS_RecipientInfo_kari_get0_alg(CMS_RecipientInfo *ri, + X509_ALGOR **palg, + ASN1_OCTET_STRING **pukm); +STACK_OF(CMS_RecipientEncryptedKey) +*CMS_RecipientInfo_kari_get0_reks(CMS_RecipientInfo *ri); + +int CMS_RecipientInfo_kari_get0_orig_id(CMS_RecipientInfo *ri, + X509_ALGOR **pubalg, + ASN1_BIT_STRING **pubkey, + ASN1_OCTET_STRING **keyid, + X509_NAME **issuer, + ASN1_INTEGER **sno); + +int CMS_RecipientInfo_kari_orig_id_cmp(CMS_RecipientInfo *ri, X509 *cert); + +int CMS_RecipientEncryptedKey_get0_id(CMS_RecipientEncryptedKey *rek, + ASN1_OCTET_STRING **keyid, + ASN1_GENERALIZEDTIME **tm, + CMS_OtherKeyAttribute **other, + X509_NAME **issuer, ASN1_INTEGER **sno); +int CMS_RecipientEncryptedKey_cert_cmp(CMS_RecipientEncryptedKey *rek, + X509 *cert); +int CMS_RecipientInfo_kari_set0_pkey(CMS_RecipientInfo *ri, EVP_PKEY *pk); +EVP_CIPHER_CTX *CMS_RecipientInfo_kari_get0_ctx(CMS_RecipientInfo *ri); +int CMS_RecipientInfo_kari_decrypt(CMS_ContentInfo *cms, + CMS_RecipientInfo *ri, + CMS_RecipientEncryptedKey *rek); + +int CMS_SharedInfo_encode(unsigned char **pder, X509_ALGOR *kekalg, + ASN1_OCTET_STRING *ukm, int keylen); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_CMS_strings(void); + +/* Error codes for the CMS functions. */ + +/* Function codes. */ +# define CMS_F_CHECK_CONTENT 99 +# define CMS_F_CMS_ADD0_CERT 164 +# define CMS_F_CMS_ADD0_RECIPIENT_KEY 100 +# define CMS_F_CMS_ADD0_RECIPIENT_PASSWORD 165 +# define CMS_F_CMS_ADD1_RECEIPTREQUEST 158 +# define CMS_F_CMS_ADD1_RECIPIENT_CERT 101 +# define CMS_F_CMS_ADD1_SIGNER 102 +# define CMS_F_CMS_ADD1_SIGNINGTIME 103 +# define CMS_F_CMS_COMPRESS 104 +# define CMS_F_CMS_COMPRESSEDDATA_CREATE 105 +# define CMS_F_CMS_COMPRESSEDDATA_INIT_BIO 106 +# define CMS_F_CMS_COPY_CONTENT 107 +# define CMS_F_CMS_COPY_MESSAGEDIGEST 108 +# define CMS_F_CMS_DATA 109 +# define CMS_F_CMS_DATAFINAL 110 +# define CMS_F_CMS_DATAINIT 111 +# define CMS_F_CMS_DECRYPT 112 +# define CMS_F_CMS_DECRYPT_SET1_KEY 113 +# define CMS_F_CMS_DECRYPT_SET1_PASSWORD 166 +# define CMS_F_CMS_DECRYPT_SET1_PKEY 114 +# define CMS_F_CMS_DIGESTALGORITHM_FIND_CTX 115 +# define CMS_F_CMS_DIGESTALGORITHM_INIT_BIO 116 +# define CMS_F_CMS_DIGESTEDDATA_DO_FINAL 117 +# define CMS_F_CMS_DIGEST_VERIFY 118 +# define CMS_F_CMS_ENCODE_RECEIPT 161 +# define CMS_F_CMS_ENCRYPT 119 +# define CMS_F_CMS_ENCRYPTEDCONTENT_INIT_BIO 120 +# define CMS_F_CMS_ENCRYPTEDDATA_DECRYPT 121 +# define CMS_F_CMS_ENCRYPTEDDATA_ENCRYPT 122 +# define CMS_F_CMS_ENCRYPTEDDATA_SET1_KEY 123 +# define CMS_F_CMS_ENVELOPEDDATA_CREATE 124 +# define CMS_F_CMS_ENVELOPEDDATA_INIT_BIO 125 +# define CMS_F_CMS_ENVELOPED_DATA_INIT 126 +# define CMS_F_CMS_ENV_ASN1_CTRL 171 +# define CMS_F_CMS_FINAL 127 +# define CMS_F_CMS_GET0_CERTIFICATE_CHOICES 128 +# define CMS_F_CMS_GET0_CONTENT 129 +# define CMS_F_CMS_GET0_ECONTENT_TYPE 130 +# define CMS_F_CMS_GET0_ENVELOPED 131 +# define CMS_F_CMS_GET0_REVOCATION_CHOICES 132 +# define CMS_F_CMS_GET0_SIGNED 133 +# define CMS_F_CMS_MSGSIGDIGEST_ADD1 162 +# define CMS_F_CMS_RECEIPTREQUEST_CREATE0 159 +# define CMS_F_CMS_RECEIPT_VERIFY 160 +# define CMS_F_CMS_RECIPIENTINFO_DECRYPT 134 +# define CMS_F_CMS_RECIPIENTINFO_ENCRYPT 169 +# define CMS_F_CMS_RECIPIENTINFO_KARI_ENCRYPT 178 +# define CMS_F_CMS_RECIPIENTINFO_KARI_GET0_ALG 175 +# define CMS_F_CMS_RECIPIENTINFO_KARI_GET0_ORIG_ID 173 +# define CMS_F_CMS_RECIPIENTINFO_KARI_GET0_REKS 172 +# define CMS_F_CMS_RECIPIENTINFO_KARI_ORIG_ID_CMP 174 +# define CMS_F_CMS_RECIPIENTINFO_KEKRI_DECRYPT 135 +# define CMS_F_CMS_RECIPIENTINFO_KEKRI_ENCRYPT 136 +# define CMS_F_CMS_RECIPIENTINFO_KEKRI_GET0_ID 137 +# define CMS_F_CMS_RECIPIENTINFO_KEKRI_ID_CMP 138 +# define CMS_F_CMS_RECIPIENTINFO_KTRI_CERT_CMP 139 +# define CMS_F_CMS_RECIPIENTINFO_KTRI_DECRYPT 140 +# define CMS_F_CMS_RECIPIENTINFO_KTRI_ENCRYPT 141 +# define CMS_F_CMS_RECIPIENTINFO_KTRI_GET0_ALGS 142 +# define CMS_F_CMS_RECIPIENTINFO_KTRI_GET0_SIGNER_ID 143 +# define CMS_F_CMS_RECIPIENTINFO_PWRI_CRYPT 167 +# define CMS_F_CMS_RECIPIENTINFO_SET0_KEY 144 +# define CMS_F_CMS_RECIPIENTINFO_SET0_PASSWORD 168 +# define CMS_F_CMS_RECIPIENTINFO_SET0_PKEY 145 +# define CMS_F_CMS_SD_ASN1_CTRL 170 +# define CMS_F_CMS_SET1_IAS 176 +# define CMS_F_CMS_SET1_KEYID 177 +# define CMS_F_CMS_SET1_SIGNERIDENTIFIER 146 +# define CMS_F_CMS_SET_DETACHED 147 +# define CMS_F_CMS_SIGN 148 +# define CMS_F_CMS_SIGNED_DATA_INIT 149 +# define CMS_F_CMS_SIGNERINFO_CONTENT_SIGN 150 +# define CMS_F_CMS_SIGNERINFO_SIGN 151 +# define CMS_F_CMS_SIGNERINFO_VERIFY 152 +# define CMS_F_CMS_SIGNERINFO_VERIFY_CERT 153 +# define CMS_F_CMS_SIGNERINFO_VERIFY_CONTENT 154 +# define CMS_F_CMS_SIGN_RECEIPT 163 +# define CMS_F_CMS_STREAM 155 +# define CMS_F_CMS_UNCOMPRESS 156 +# define CMS_F_CMS_VERIFY 157 + +/* Reason codes. */ +# define CMS_R_ADD_SIGNER_ERROR 99 +# define CMS_R_CERTIFICATE_ALREADY_PRESENT 175 +# define CMS_R_CERTIFICATE_HAS_NO_KEYID 160 +# define CMS_R_CERTIFICATE_VERIFY_ERROR 100 +# define CMS_R_CIPHER_INITIALISATION_ERROR 101 +# define CMS_R_CIPHER_PARAMETER_INITIALISATION_ERROR 102 +# define CMS_R_CMS_DATAFINAL_ERROR 103 +# define CMS_R_CMS_LIB 104 +# define CMS_R_CONTENTIDENTIFIER_MISMATCH 170 +# define CMS_R_CONTENT_NOT_FOUND 105 +# define CMS_R_CONTENT_TYPE_MISMATCH 171 +# define CMS_R_CONTENT_TYPE_NOT_COMPRESSED_DATA 106 +# define CMS_R_CONTENT_TYPE_NOT_ENVELOPED_DATA 107 +# define CMS_R_CONTENT_TYPE_NOT_SIGNED_DATA 108 +# define CMS_R_CONTENT_VERIFY_ERROR 109 +# define CMS_R_CTRL_ERROR 110 +# define CMS_R_CTRL_FAILURE 111 +# define CMS_R_DECRYPT_ERROR 112 +# define CMS_R_DIGEST_ERROR 161 +# define CMS_R_ERROR_GETTING_PUBLIC_KEY 113 +# define CMS_R_ERROR_READING_MESSAGEDIGEST_ATTRIBUTE 114 +# define CMS_R_ERROR_SETTING_KEY 115 +# define CMS_R_ERROR_SETTING_RECIPIENTINFO 116 +# define CMS_R_INVALID_ENCRYPTED_KEY_LENGTH 117 +# define CMS_R_INVALID_KEY_ENCRYPTION_PARAMETER 176 +# define CMS_R_INVALID_KEY_LENGTH 118 +# define CMS_R_MD_BIO_INIT_ERROR 119 +# define CMS_R_MESSAGEDIGEST_ATTRIBUTE_WRONG_LENGTH 120 +# define CMS_R_MESSAGEDIGEST_WRONG_LENGTH 121 +# define CMS_R_MSGSIGDIGEST_ERROR 172 +# define CMS_R_MSGSIGDIGEST_VERIFICATION_FAILURE 162 +# define CMS_R_MSGSIGDIGEST_WRONG_LENGTH 163 +# define CMS_R_NEED_ONE_SIGNER 164 +# define CMS_R_NOT_A_SIGNED_RECEIPT 165 +# define CMS_R_NOT_ENCRYPTED_DATA 122 +# define CMS_R_NOT_KEK 123 +# define CMS_R_NOT_KEY_AGREEMENT 181 +# define CMS_R_NOT_KEY_TRANSPORT 124 +# define CMS_R_NOT_PWRI 177 +# define CMS_R_NOT_SUPPORTED_FOR_THIS_KEY_TYPE 125 +# define CMS_R_NO_CIPHER 126 +# define CMS_R_NO_CONTENT 127 +# define CMS_R_NO_CONTENT_TYPE 173 +# define CMS_R_NO_DEFAULT_DIGEST 128 +# define CMS_R_NO_DIGEST_SET 129 +# define CMS_R_NO_KEY 130 +# define CMS_R_NO_KEY_OR_CERT 174 +# define CMS_R_NO_MATCHING_DIGEST 131 +# define CMS_R_NO_MATCHING_RECIPIENT 132 +# define CMS_R_NO_MATCHING_SIGNATURE 166 +# define CMS_R_NO_MSGSIGDIGEST 167 +# define CMS_R_NO_PASSWORD 178 +# define CMS_R_NO_PRIVATE_KEY 133 +# define CMS_R_NO_PUBLIC_KEY 134 +# define CMS_R_NO_RECEIPT_REQUEST 168 +# define CMS_R_NO_SIGNERS 135 +# define CMS_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE 136 +# define CMS_R_RECEIPT_DECODE_ERROR 169 +# define CMS_R_RECIPIENT_ERROR 137 +# define CMS_R_SIGNER_CERTIFICATE_NOT_FOUND 138 +# define CMS_R_SIGNFINAL_ERROR 139 +# define CMS_R_SMIME_TEXT_ERROR 140 +# define CMS_R_STORE_INIT_ERROR 141 +# define CMS_R_TYPE_NOT_COMPRESSED_DATA 142 +# define CMS_R_TYPE_NOT_DATA 143 +# define CMS_R_TYPE_NOT_DIGESTED_DATA 144 +# define CMS_R_TYPE_NOT_ENCRYPTED_DATA 145 +# define CMS_R_TYPE_NOT_ENVELOPED_DATA 146 +# define CMS_R_UNABLE_TO_FINALIZE_CONTEXT 147 +# define CMS_R_UNKNOWN_CIPHER 148 +# define CMS_R_UNKNOWN_DIGEST_ALGORIHM 149 +# define CMS_R_UNKNOWN_ID 150 +# define CMS_R_UNSUPPORTED_COMPRESSION_ALGORITHM 151 +# define CMS_R_UNSUPPORTED_CONTENT_TYPE 152 +# define CMS_R_UNSUPPORTED_KEK_ALGORITHM 153 +# define CMS_R_UNSUPPORTED_KEY_ENCRYPTION_ALGORITHM 179 +# define CMS_R_UNSUPPORTED_RECIPIENT_TYPE 154 +# define CMS_R_UNSUPPORTED_RECPIENTINFO_TYPE 155 +# define CMS_R_UNSUPPORTED_TYPE 156 +# define CMS_R_UNWRAP_ERROR 157 +# define CMS_R_UNWRAP_FAILURE 180 +# define CMS_R_VERIFICATION_FAILURE 158 +# define CMS_R_WRAP_ERROR 159 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/comp.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/comp.h new file mode 100644 index 0000000..df599ba --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/comp.h @@ -0,0 +1,83 @@ + +#ifndef HEADER_COMP_H +# define HEADER_COMP_H + +# include + +# ifdef OPENSSL_NO_COMP +# error COMP is disabled. +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct comp_ctx_st COMP_CTX; + +struct comp_method_st { + int type; /* NID for compression library */ + const char *name; /* A text string to identify the library */ + int (*init) (COMP_CTX *ctx); + void (*finish) (COMP_CTX *ctx); + int (*compress) (COMP_CTX *ctx, + unsigned char *out, unsigned int olen, + unsigned char *in, unsigned int ilen); + int (*expand) (COMP_CTX *ctx, + unsigned char *out, unsigned int olen, + unsigned char *in, unsigned int ilen); + /* + * The following two do NOTHING, but are kept for backward compatibility + */ + long (*ctrl) (void); + long (*callback_ctrl) (void); +}; + +struct comp_ctx_st { + COMP_METHOD *meth; + unsigned long compress_in; + unsigned long compress_out; + unsigned long expand_in; + unsigned long expand_out; + CRYPTO_EX_DATA ex_data; +}; + +COMP_CTX *COMP_CTX_new(COMP_METHOD *meth); +void COMP_CTX_free(COMP_CTX *ctx); +int COMP_compress_block(COMP_CTX *ctx, unsigned char *out, int olen, + unsigned char *in, int ilen); +int COMP_expand_block(COMP_CTX *ctx, unsigned char *out, int olen, + unsigned char *in, int ilen); +COMP_METHOD *COMP_rle(void); +COMP_METHOD *COMP_zlib(void); +void COMP_zlib_cleanup(void); + +# ifdef HEADER_BIO_H +# ifdef ZLIB +BIO_METHOD *BIO_f_zlib(void); +# endif +# endif + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_COMP_strings(void); + +/* Error codes for the COMP functions. */ + +/* Function codes. */ +# define COMP_F_BIO_ZLIB_FLUSH 99 +# define COMP_F_BIO_ZLIB_NEW 100 +# define COMP_F_BIO_ZLIB_READ 101 +# define COMP_F_BIO_ZLIB_WRITE 102 + +/* Reason codes. */ +# define COMP_R_ZLIB_DEFLATE_ERROR 99 +# define COMP_R_ZLIB_INFLATE_ERROR 100 +# define COMP_R_ZLIB_NOT_SUPPORTED 101 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/conf.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/conf.h new file mode 100644 index 0000000..8d926d5 --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/conf.h @@ -0,0 +1,267 @@ +/* crypto/conf/conf.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_CONF_H +# define HEADER_CONF_H + +# include +# include +# include +# include +# include + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + char *section; + char *name; + char *value; +} CONF_VALUE; + +DECLARE_STACK_OF(CONF_VALUE) +DECLARE_LHASH_OF(CONF_VALUE); + +struct conf_st; +struct conf_method_st; +typedef struct conf_method_st CONF_METHOD; + +struct conf_method_st { + const char *name; + CONF *(*create) (CONF_METHOD *meth); + int (*init) (CONF *conf); + int (*destroy) (CONF *conf); + int (*destroy_data) (CONF *conf); + int (*load_bio) (CONF *conf, BIO *bp, long *eline); + int (*dump) (const CONF *conf, BIO *bp); + int (*is_number) (const CONF *conf, char c); + int (*to_int) (const CONF *conf, char c); + int (*load) (CONF *conf, const char *name, long *eline); +}; + +/* Module definitions */ + +typedef struct conf_imodule_st CONF_IMODULE; +typedef struct conf_module_st CONF_MODULE; + +DECLARE_STACK_OF(CONF_MODULE) +DECLARE_STACK_OF(CONF_IMODULE) + +/* DSO module function typedefs */ +typedef int conf_init_func (CONF_IMODULE *md, const CONF *cnf); +typedef void conf_finish_func (CONF_IMODULE *md); + +# define CONF_MFLAGS_IGNORE_ERRORS 0x1 +# define CONF_MFLAGS_IGNORE_RETURN_CODES 0x2 +# define CONF_MFLAGS_SILENT 0x4 +# define CONF_MFLAGS_NO_DSO 0x8 +# define CONF_MFLAGS_IGNORE_MISSING_FILE 0x10 +# define CONF_MFLAGS_DEFAULT_SECTION 0x20 + +int CONF_set_default_method(CONF_METHOD *meth); +void CONF_set_nconf(CONF *conf, LHASH_OF(CONF_VALUE) *hash); +LHASH_OF(CONF_VALUE) *CONF_load(LHASH_OF(CONF_VALUE) *conf, const char *file, + long *eline); +# ifndef OPENSSL_NO_FP_API +LHASH_OF(CONF_VALUE) *CONF_load_fp(LHASH_OF(CONF_VALUE) *conf, FILE *fp, + long *eline); +# endif +LHASH_OF(CONF_VALUE) *CONF_load_bio(LHASH_OF(CONF_VALUE) *conf, BIO *bp, + long *eline); +STACK_OF(CONF_VALUE) *CONF_get_section(LHASH_OF(CONF_VALUE) *conf, + const char *section); +char *CONF_get_string(LHASH_OF(CONF_VALUE) *conf, const char *group, + const char *name); +long CONF_get_number(LHASH_OF(CONF_VALUE) *conf, const char *group, + const char *name); +void CONF_free(LHASH_OF(CONF_VALUE) *conf); +int CONF_dump_fp(LHASH_OF(CONF_VALUE) *conf, FILE *out); +int CONF_dump_bio(LHASH_OF(CONF_VALUE) *conf, BIO *out); + +void OPENSSL_config(const char *config_name); +void OPENSSL_no_config(void); + +/* + * New conf code. The semantics are different from the functions above. If + * that wasn't the case, the above functions would have been replaced + */ + +struct conf_st { + CONF_METHOD *meth; + void *meth_data; + LHASH_OF(CONF_VALUE) *data; +}; + +CONF *NCONF_new(CONF_METHOD *meth); +CONF_METHOD *NCONF_default(void); +CONF_METHOD *NCONF_WIN32(void); +# if 0 /* Just to give you an idea of what I have in + * mind */ +CONF_METHOD *NCONF_XML(void); +# endif +void NCONF_free(CONF *conf); +void NCONF_free_data(CONF *conf); + +int NCONF_load(CONF *conf, const char *file, long *eline); +# ifndef OPENSSL_NO_FP_API +int NCONF_load_fp(CONF *conf, FILE *fp, long *eline); +# endif +int NCONF_load_bio(CONF *conf, BIO *bp, long *eline); +STACK_OF(CONF_VALUE) *NCONF_get_section(const CONF *conf, + const char *section); +char *NCONF_get_string(const CONF *conf, const char *group, const char *name); +int NCONF_get_number_e(const CONF *conf, const char *group, const char *name, + long *result); +int NCONF_dump_fp(const CONF *conf, FILE *out); +int NCONF_dump_bio(const CONF *conf, BIO *out); + +# if 0 /* The following function has no error + * checking, and should therefore be avoided */ +long NCONF_get_number(CONF *conf, char *group, char *name); +# else +# define NCONF_get_number(c,g,n,r) NCONF_get_number_e(c,g,n,r) +# endif + +/* Module functions */ + +int CONF_modules_load(const CONF *cnf, const char *appname, + unsigned long flags); +int CONF_modules_load_file(const char *filename, const char *appname, + unsigned long flags); +void CONF_modules_unload(int all); +void CONF_modules_finish(void); +void CONF_modules_free(void); +int CONF_module_add(const char *name, conf_init_func *ifunc, + conf_finish_func *ffunc); + +const char *CONF_imodule_get_name(const CONF_IMODULE *md); +const char *CONF_imodule_get_value(const CONF_IMODULE *md); +void *CONF_imodule_get_usr_data(const CONF_IMODULE *md); +void CONF_imodule_set_usr_data(CONF_IMODULE *md, void *usr_data); +CONF_MODULE *CONF_imodule_get_module(const CONF_IMODULE *md); +unsigned long CONF_imodule_get_flags(const CONF_IMODULE *md); +void CONF_imodule_set_flags(CONF_IMODULE *md, unsigned long flags); +void *CONF_module_get_usr_data(CONF_MODULE *pmod); +void CONF_module_set_usr_data(CONF_MODULE *pmod, void *usr_data); + +char *CONF_get1_default_config_file(void); + +int CONF_parse_list(const char *list, int sep, int nospc, + int (*list_cb) (const char *elem, int len, void *usr), + void *arg); + +void OPENSSL_load_builtin_modules(void); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_CONF_strings(void); + +/* Error codes for the CONF functions. */ + +/* Function codes. */ +# define CONF_F_CONF_DUMP_FP 104 +# define CONF_F_CONF_LOAD 100 +# define CONF_F_CONF_LOAD_BIO 102 +# define CONF_F_CONF_LOAD_FP 103 +# define CONF_F_CONF_MODULES_LOAD 116 +# define CONF_F_CONF_PARSE_LIST 119 +# define CONF_F_DEF_LOAD 120 +# define CONF_F_DEF_LOAD_BIO 121 +# define CONF_F_MODULE_INIT 115 +# define CONF_F_MODULE_LOAD_DSO 117 +# define CONF_F_MODULE_RUN 118 +# define CONF_F_NCONF_DUMP_BIO 105 +# define CONF_F_NCONF_DUMP_FP 106 +# define CONF_F_NCONF_GET_NUMBER 107 +# define CONF_F_NCONF_GET_NUMBER_E 112 +# define CONF_F_NCONF_GET_SECTION 108 +# define CONF_F_NCONF_GET_STRING 109 +# define CONF_F_NCONF_LOAD 113 +# define CONF_F_NCONF_LOAD_BIO 110 +# define CONF_F_NCONF_LOAD_FP 114 +# define CONF_F_NCONF_NEW 111 +# define CONF_F_STR_COPY 101 + +/* Reason codes. */ +# define CONF_R_ERROR_LOADING_DSO 110 +# define CONF_R_LIST_CANNOT_BE_NULL 115 +# define CONF_R_MISSING_CLOSE_SQUARE_BRACKET 100 +# define CONF_R_MISSING_EQUAL_SIGN 101 +# define CONF_R_MISSING_FINISH_FUNCTION 111 +# define CONF_R_MISSING_INIT_FUNCTION 112 +# define CONF_R_MODULE_INITIALIZATION_ERROR 109 +# define CONF_R_NO_CLOSE_BRACE 102 +# define CONF_R_NO_CONF 105 +# define CONF_R_NO_CONF_OR_ENVIRONMENT_VARIABLE 106 +# define CONF_R_NO_SECTION 107 +# define CONF_R_NO_SUCH_FILE 114 +# define CONF_R_NO_VALUE 108 +# define CONF_R_UNABLE_TO_CREATE_NEW_SECTION 103 +# define CONF_R_UNKNOWN_MODULE_NAME 113 +# define CONF_R_VARIABLE_HAS_NO_VALUE 104 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/conf_api.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/conf_api.h new file mode 100644 index 0000000..e478f7d --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/conf_api.h @@ -0,0 +1,89 @@ +/* conf_api.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_CONF_API_H +# define HEADER_CONF_API_H + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Up until OpenSSL 0.9.5a, this was new_section */ +CONF_VALUE *_CONF_new_section(CONF *conf, const char *section); +/* Up until OpenSSL 0.9.5a, this was get_section */ +CONF_VALUE *_CONF_get_section(const CONF *conf, const char *section); +/* Up until OpenSSL 0.9.5a, this was CONF_get_section */ +STACK_OF(CONF_VALUE) *_CONF_get_section_values(const CONF *conf, + const char *section); + +int _CONF_add_string(CONF *conf, CONF_VALUE *section, CONF_VALUE *value); +char *_CONF_get_string(const CONF *conf, const char *section, + const char *name); +long _CONF_get_number(const CONF *conf, const char *section, + const char *name); + +int _CONF_new_data(CONF *conf); +void _CONF_free_data(CONF *conf); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/crypto.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/crypto.h new file mode 100644 index 0000000..6c644ce --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/crypto.h @@ -0,0 +1,661 @@ +/* crypto/crypto.h */ +/* ==================================================================== + * Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * ECDH support in OpenSSL originally developed by + * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project. + */ + +#ifndef HEADER_CRYPTO_H +# define HEADER_CRYPTO_H + +# include + +# include + +# ifndef OPENSSL_NO_FP_API +# include +# endif + +# include +# include +# include +# include + +# ifdef CHARSET_EBCDIC +# include +# endif + +/* + * Resolve problems on some operating systems with symbol names that clash + * one way or another + */ +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Backward compatibility to SSLeay */ +/* + * This is more to be used to check the correct DLL is being used in the MS + * world. + */ +# define SSLEAY_VERSION_NUMBER OPENSSL_VERSION_NUMBER +# define SSLEAY_VERSION 0 +/* #define SSLEAY_OPTIONS 1 no longer supported */ +# define SSLEAY_CFLAGS 2 +# define SSLEAY_BUILT_ON 3 +# define SSLEAY_PLATFORM 4 +# define SSLEAY_DIR 5 + +/* Already declared in ossl_typ.h */ +# if 0 +typedef struct crypto_ex_data_st CRYPTO_EX_DATA; +/* Called when a new object is created */ +typedef int CRYPTO_EX_new (void *parent, void *ptr, CRYPTO_EX_DATA *ad, + int idx, long argl, void *argp); +/* Called when an object is free()ed */ +typedef void CRYPTO_EX_free (void *parent, void *ptr, CRYPTO_EX_DATA *ad, + int idx, long argl, void *argp); +/* Called when we need to dup an object */ +typedef int CRYPTO_EX_dup (CRYPTO_EX_DATA *to, CRYPTO_EX_DATA *from, + void *from_d, int idx, long argl, void *argp); +# endif + +/* A generic structure to pass assorted data in a expandable way */ +typedef struct openssl_item_st { + int code; + void *value; /* Not used for flag attributes */ + size_t value_size; /* Max size of value for output, length for + * input */ + size_t *value_length; /* Returned length of value for output */ +} OPENSSL_ITEM; + +/* + * When changing the CRYPTO_LOCK_* list, be sure to maintin the text lock + * names in cryptlib.c + */ + +# define CRYPTO_LOCK_ERR 1 +# define CRYPTO_LOCK_EX_DATA 2 +# define CRYPTO_LOCK_X509 3 +# define CRYPTO_LOCK_X509_INFO 4 +# define CRYPTO_LOCK_X509_PKEY 5 +# define CRYPTO_LOCK_X509_CRL 6 +# define CRYPTO_LOCK_X509_REQ 7 +# define CRYPTO_LOCK_DSA 8 +# define CRYPTO_LOCK_RSA 9 +# define CRYPTO_LOCK_EVP_PKEY 10 +# define CRYPTO_LOCK_X509_STORE 11 +# define CRYPTO_LOCK_SSL_CTX 12 +# define CRYPTO_LOCK_SSL_CERT 13 +# define CRYPTO_LOCK_SSL_SESSION 14 +# define CRYPTO_LOCK_SSL_SESS_CERT 15 +# define CRYPTO_LOCK_SSL 16 +# define CRYPTO_LOCK_SSL_METHOD 17 +# define CRYPTO_LOCK_RAND 18 +# define CRYPTO_LOCK_RAND2 19 +# define CRYPTO_LOCK_MALLOC 20 +# define CRYPTO_LOCK_BIO 21 +# define CRYPTO_LOCK_GETHOSTBYNAME 22 +# define CRYPTO_LOCK_GETSERVBYNAME 23 +# define CRYPTO_LOCK_READDIR 24 +# define CRYPTO_LOCK_RSA_BLINDING 25 +# define CRYPTO_LOCK_DH 26 +# define CRYPTO_LOCK_MALLOC2 27 +# define CRYPTO_LOCK_DSO 28 +# define CRYPTO_LOCK_DYNLOCK 29 +# define CRYPTO_LOCK_ENGINE 30 +# define CRYPTO_LOCK_UI 31 +# define CRYPTO_LOCK_ECDSA 32 +# define CRYPTO_LOCK_EC 33 +# define CRYPTO_LOCK_ECDH 34 +# define CRYPTO_LOCK_BN 35 +# define CRYPTO_LOCK_EC_PRE_COMP 36 +# define CRYPTO_LOCK_STORE 37 +# define CRYPTO_LOCK_COMP 38 +# define CRYPTO_LOCK_FIPS 39 +# define CRYPTO_LOCK_FIPS2 40 +# define CRYPTO_NUM_LOCKS 41 + +# define CRYPTO_LOCK 1 +# define CRYPTO_UNLOCK 2 +# define CRYPTO_READ 4 +# define CRYPTO_WRITE 8 + +# ifndef OPENSSL_NO_LOCKING +# ifndef CRYPTO_w_lock +# define CRYPTO_w_lock(type) \ + CRYPTO_lock(CRYPTO_LOCK|CRYPTO_WRITE,type,__FILE__,__LINE__) +# define CRYPTO_w_unlock(type) \ + CRYPTO_lock(CRYPTO_UNLOCK|CRYPTO_WRITE,type,__FILE__,__LINE__) +# define CRYPTO_r_lock(type) \ + CRYPTO_lock(CRYPTO_LOCK|CRYPTO_READ,type,__FILE__,__LINE__) +# define CRYPTO_r_unlock(type) \ + CRYPTO_lock(CRYPTO_UNLOCK|CRYPTO_READ,type,__FILE__,__LINE__) +# define CRYPTO_add(addr,amount,type) \ + CRYPTO_add_lock(addr,amount,type,__FILE__,__LINE__) +# endif +# else +# define CRYPTO_w_lock(a) +# define CRYPTO_w_unlock(a) +# define CRYPTO_r_lock(a) +# define CRYPTO_r_unlock(a) +# define CRYPTO_add(a,b,c) ((*(a))+=(b)) +# endif + +/* + * Some applications as well as some parts of OpenSSL need to allocate and + * deallocate locks in a dynamic fashion. The following typedef makes this + * possible in a type-safe manner. + */ +/* struct CRYPTO_dynlock_value has to be defined by the application. */ +typedef struct { + int references; + struct CRYPTO_dynlock_value *data; +} CRYPTO_dynlock; + +/* + * The following can be used to detect memory leaks in the SSLeay library. It + * used, it turns on malloc checking + */ + +# define CRYPTO_MEM_CHECK_OFF 0x0/* an enume */ +# define CRYPTO_MEM_CHECK_ON 0x1/* a bit */ +# define CRYPTO_MEM_CHECK_ENABLE 0x2/* a bit */ +# define CRYPTO_MEM_CHECK_DISABLE 0x3/* an enume */ + +/* + * The following are bit values to turn on or off options connected to the + * malloc checking functionality + */ + +/* Adds time to the memory checking information */ +# define V_CRYPTO_MDEBUG_TIME 0x1/* a bit */ +/* Adds thread number to the memory checking information */ +# define V_CRYPTO_MDEBUG_THREAD 0x2/* a bit */ + +# define V_CRYPTO_MDEBUG_ALL (V_CRYPTO_MDEBUG_TIME | V_CRYPTO_MDEBUG_THREAD) + +/* predec of the BIO type */ +typedef struct bio_st BIO_dummy; + +struct crypto_ex_data_st { + STACK_OF(void) *sk; + /* gcc is screwing up this data structure :-( */ + int dummy; +}; +DECLARE_STACK_OF(void) + +/* + * This stuff is basically class callback functions The current classes are + * SSL_CTX, SSL, SSL_SESSION, and a few more + */ + +typedef struct crypto_ex_data_func_st { + long argl; /* Arbitary long */ + void *argp; /* Arbitary void * */ + CRYPTO_EX_new *new_func; + CRYPTO_EX_free *free_func; + CRYPTO_EX_dup *dup_func; +} CRYPTO_EX_DATA_FUNCS; + +DECLARE_STACK_OF(CRYPTO_EX_DATA_FUNCS) + +/* + * Per class, we have a STACK of CRYPTO_EX_DATA_FUNCS for each CRYPTO_EX_DATA + * entry. + */ + +# define CRYPTO_EX_INDEX_BIO 0 +# define CRYPTO_EX_INDEX_SSL 1 +# define CRYPTO_EX_INDEX_SSL_CTX 2 +# define CRYPTO_EX_INDEX_SSL_SESSION 3 +# define CRYPTO_EX_INDEX_X509_STORE 4 +# define CRYPTO_EX_INDEX_X509_STORE_CTX 5 +# define CRYPTO_EX_INDEX_RSA 6 +# define CRYPTO_EX_INDEX_DSA 7 +# define CRYPTO_EX_INDEX_DH 8 +# define CRYPTO_EX_INDEX_ENGINE 9 +# define CRYPTO_EX_INDEX_X509 10 +# define CRYPTO_EX_INDEX_UI 11 +# define CRYPTO_EX_INDEX_ECDSA 12 +# define CRYPTO_EX_INDEX_ECDH 13 +# define CRYPTO_EX_INDEX_COMP 14 +# define CRYPTO_EX_INDEX_STORE 15 + +/* + * Dynamically assigned indexes start from this value (don't use directly, + * use via CRYPTO_ex_data_new_class). + */ +# define CRYPTO_EX_INDEX_USER 100 + +/* + * This is the default callbacks, but we can have others as well: this is + * needed in Win32 where the application malloc and the library malloc may + * not be the same. + */ +# define CRYPTO_malloc_init() CRYPTO_set_mem_functions(\ + malloc, realloc, free) + +# if defined CRYPTO_MDEBUG_ALL || defined CRYPTO_MDEBUG_TIME || defined CRYPTO_MDEBUG_THREAD +# ifndef CRYPTO_MDEBUG /* avoid duplicate #define */ +# define CRYPTO_MDEBUG +# endif +# endif + +/* + * Set standard debugging functions (not done by default unless CRYPTO_MDEBUG + * is defined) + */ +# define CRYPTO_malloc_debug_init() do {\ + CRYPTO_set_mem_debug_functions(\ + CRYPTO_dbg_malloc,\ + CRYPTO_dbg_realloc,\ + CRYPTO_dbg_free,\ + CRYPTO_dbg_set_options,\ + CRYPTO_dbg_get_options);\ + } while(0) + +int CRYPTO_mem_ctrl(int mode); +int CRYPTO_is_mem_check_on(void); + +/* for applications */ +# define MemCheck_start() CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON) +# define MemCheck_stop() CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_OFF) + +/* for library-internal use */ +# define MemCheck_on() CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ENABLE) +# define MemCheck_off() CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_DISABLE) +# define is_MemCheck_on() CRYPTO_is_mem_check_on() + +# define OPENSSL_malloc(num) CRYPTO_malloc((int)num,__FILE__,__LINE__) +# define OPENSSL_strdup(str) CRYPTO_strdup((str),__FILE__,__LINE__) +# define OPENSSL_realloc(addr,num) \ + CRYPTO_realloc((char *)addr,(int)num,__FILE__,__LINE__) +# define OPENSSL_realloc_clean(addr,old_num,num) \ + CRYPTO_realloc_clean(addr,old_num,num,__FILE__,__LINE__) +# define OPENSSL_remalloc(addr,num) \ + CRYPTO_remalloc((char **)addr,(int)num,__FILE__,__LINE__) +# define OPENSSL_freeFunc CRYPTO_free +# define OPENSSL_free(addr) CRYPTO_free(addr) + +# define OPENSSL_malloc_locked(num) \ + CRYPTO_malloc_locked((int)num,__FILE__,__LINE__) +# define OPENSSL_free_locked(addr) CRYPTO_free_locked(addr) + +const char *SSLeay_version(int type); +unsigned long SSLeay(void); + +int OPENSSL_issetugid(void); + +/* An opaque type representing an implementation of "ex_data" support */ +typedef struct st_CRYPTO_EX_DATA_IMPL CRYPTO_EX_DATA_IMPL; +/* Return an opaque pointer to the current "ex_data" implementation */ +const CRYPTO_EX_DATA_IMPL *CRYPTO_get_ex_data_implementation(void); +/* Sets the "ex_data" implementation to be used (if it's not too late) */ +int CRYPTO_set_ex_data_implementation(const CRYPTO_EX_DATA_IMPL *i); +/* Get a new "ex_data" class, and return the corresponding "class_index" */ +int CRYPTO_ex_data_new_class(void); +/* Within a given class, get/register a new index */ +int CRYPTO_get_ex_new_index(int class_index, long argl, void *argp, + CRYPTO_EX_new *new_func, CRYPTO_EX_dup *dup_func, + CRYPTO_EX_free *free_func); +/* + * Initialise/duplicate/free CRYPTO_EX_DATA variables corresponding to a + * given class (invokes whatever per-class callbacks are applicable) + */ +int CRYPTO_new_ex_data(int class_index, void *obj, CRYPTO_EX_DATA *ad); +int CRYPTO_dup_ex_data(int class_index, CRYPTO_EX_DATA *to, + CRYPTO_EX_DATA *from); +void CRYPTO_free_ex_data(int class_index, void *obj, CRYPTO_EX_DATA *ad); +/* + * Get/set data in a CRYPTO_EX_DATA variable corresponding to a particular + * index (relative to the class type involved) + */ +int CRYPTO_set_ex_data(CRYPTO_EX_DATA *ad, int idx, void *val); +void *CRYPTO_get_ex_data(const CRYPTO_EX_DATA *ad, int idx); +/* + * This function cleans up all "ex_data" state. It mustn't be called under + * potential race-conditions. + */ +void CRYPTO_cleanup_all_ex_data(void); + +int CRYPTO_get_new_lockid(char *name); + +int CRYPTO_num_locks(void); /* return CRYPTO_NUM_LOCKS (shared libs!) */ +void CRYPTO_lock(int mode, int type, const char *file, int line); +void CRYPTO_set_locking_callback(void (*func) (int mode, int type, + const char *file, int line)); +void (*CRYPTO_get_locking_callback(void)) (int mode, int type, + const char *file, int line); +void CRYPTO_set_add_lock_callback(int (*func) + (int *num, int mount, int type, + const char *file, int line)); +int (*CRYPTO_get_add_lock_callback(void)) (int *num, int mount, int type, + const char *file, int line); + +/* Don't use this structure directly. */ +typedef struct crypto_threadid_st { + void *ptr; + unsigned long val; +} CRYPTO_THREADID; +/* Only use CRYPTO_THREADID_set_[numeric|pointer]() within callbacks */ +void CRYPTO_THREADID_set_numeric(CRYPTO_THREADID *id, unsigned long val); +void CRYPTO_THREADID_set_pointer(CRYPTO_THREADID *id, void *ptr); +int CRYPTO_THREADID_set_callback(void (*threadid_func) (CRYPTO_THREADID *)); +void (*CRYPTO_THREADID_get_callback(void)) (CRYPTO_THREADID *); +void CRYPTO_THREADID_current(CRYPTO_THREADID *id); +int CRYPTO_THREADID_cmp(const CRYPTO_THREADID *a, const CRYPTO_THREADID *b); +void CRYPTO_THREADID_cpy(CRYPTO_THREADID *dest, const CRYPTO_THREADID *src); +unsigned long CRYPTO_THREADID_hash(const CRYPTO_THREADID *id); +# ifndef OPENSSL_NO_DEPRECATED +void CRYPTO_set_id_callback(unsigned long (*func) (void)); +unsigned long (*CRYPTO_get_id_callback(void)) (void); +unsigned long CRYPTO_thread_id(void); +# endif + +const char *CRYPTO_get_lock_name(int type); +int CRYPTO_add_lock(int *pointer, int amount, int type, const char *file, + int line); + +int CRYPTO_get_new_dynlockid(void); +void CRYPTO_destroy_dynlockid(int i); +struct CRYPTO_dynlock_value *CRYPTO_get_dynlock_value(int i); +void CRYPTO_set_dynlock_create_callback(struct CRYPTO_dynlock_value + *(*dyn_create_function) (const char + *file, + int line)); +void CRYPTO_set_dynlock_lock_callback(void (*dyn_lock_function) + (int mode, + struct CRYPTO_dynlock_value *l, + const char *file, int line)); +void CRYPTO_set_dynlock_destroy_callback(void (*dyn_destroy_function) + (struct CRYPTO_dynlock_value *l, + const char *file, int line)); +struct CRYPTO_dynlock_value +*(*CRYPTO_get_dynlock_create_callback(void)) (const char *file, int line); +void (*CRYPTO_get_dynlock_lock_callback(void)) (int mode, + struct CRYPTO_dynlock_value + *l, const char *file, + int line); +void (*CRYPTO_get_dynlock_destroy_callback(void)) (struct CRYPTO_dynlock_value + *l, const char *file, + int line); + +/* + * CRYPTO_set_mem_functions includes CRYPTO_set_locked_mem_functions -- call + * the latter last if you need different functions + */ +int CRYPTO_set_mem_functions(void *(*m) (size_t), void *(*r) (void *, size_t), + void (*f) (void *)); +int CRYPTO_set_locked_mem_functions(void *(*m) (size_t), + void (*free_func) (void *)); +int CRYPTO_set_mem_ex_functions(void *(*m) (size_t, const char *, int), + void *(*r) (void *, size_t, const char *, + int), void (*f) (void *)); +int CRYPTO_set_locked_mem_ex_functions(void *(*m) (size_t, const char *, int), + void (*free_func) (void *)); +int CRYPTO_set_mem_debug_functions(void (*m) + (void *, int, const char *, int, int), + void (*r) (void *, void *, int, + const char *, int, int), + void (*f) (void *, int), void (*so) (long), + long (*go) (void)); +void CRYPTO_get_mem_functions(void *(**m) (size_t), + void *(**r) (void *, size_t), + void (**f) (void *)); +void CRYPTO_get_locked_mem_functions(void *(**m) (size_t), + void (**f) (void *)); +void CRYPTO_get_mem_ex_functions(void *(**m) (size_t, const char *, int), + void *(**r) (void *, size_t, const char *, + int), void (**f) (void *)); +void CRYPTO_get_locked_mem_ex_functions(void + *(**m) (size_t, const char *, int), + void (**f) (void *)); +void CRYPTO_get_mem_debug_functions(void (**m) + (void *, int, const char *, int, int), + void (**r) (void *, void *, int, + const char *, int, int), + void (**f) (void *, int), + void (**so) (long), long (**go) (void)); + +void *CRYPTO_malloc_locked(int num, const char *file, int line); +void CRYPTO_free_locked(void *ptr); +void *CRYPTO_malloc(int num, const char *file, int line); +char *CRYPTO_strdup(const char *str, const char *file, int line); +void CRYPTO_free(void *ptr); +void *CRYPTO_realloc(void *addr, int num, const char *file, int line); +void *CRYPTO_realloc_clean(void *addr, int old_num, int num, const char *file, + int line); +void *CRYPTO_remalloc(void *addr, int num, const char *file, int line); + +void OPENSSL_cleanse(void *ptr, size_t len); + +void CRYPTO_set_mem_debug_options(long bits); +long CRYPTO_get_mem_debug_options(void); + +# define CRYPTO_push_info(info) \ + CRYPTO_push_info_(info, __FILE__, __LINE__); +int CRYPTO_push_info_(const char *info, const char *file, int line); +int CRYPTO_pop_info(void); +int CRYPTO_remove_all_info(void); + +/* + * Default debugging functions (enabled by CRYPTO_malloc_debug_init() macro; + * used as default in CRYPTO_MDEBUG compilations): + */ +/*- + * The last argument has the following significance: + * + * 0: called before the actual memory allocation has taken place + * 1: called after the actual memory allocation has taken place + */ +void CRYPTO_dbg_malloc(void *addr, int num, const char *file, int line, + int before_p); +void CRYPTO_dbg_realloc(void *addr1, void *addr2, int num, const char *file, + int line, int before_p); +void CRYPTO_dbg_free(void *addr, int before_p); +/*- + * Tell the debugging code about options. By default, the following values + * apply: + * + * 0: Clear all options. + * V_CRYPTO_MDEBUG_TIME (1): Set the "Show Time" option. + * V_CRYPTO_MDEBUG_THREAD (2): Set the "Show Thread Number" option. + * V_CRYPTO_MDEBUG_ALL (3): 1 + 2 + */ +void CRYPTO_dbg_set_options(long bits); +long CRYPTO_dbg_get_options(void); + +# ifndef OPENSSL_NO_FP_API +void CRYPTO_mem_leaks_fp(FILE *); +# endif +void CRYPTO_mem_leaks(struct bio_st *bio); +/* unsigned long order, char *file, int line, int num_bytes, char *addr */ +typedef void *CRYPTO_MEM_LEAK_CB (unsigned long, const char *, int, int, + void *); +void CRYPTO_mem_leaks_cb(CRYPTO_MEM_LEAK_CB *cb); + +/* die if we have to */ +void OpenSSLDie(const char *file, int line, const char *assertion); +# define OPENSSL_assert(e) (void)((e) ? 0 : (OpenSSLDie(__FILE__, __LINE__, #e),1)) + +unsigned long *OPENSSL_ia32cap_loc(void); +# define OPENSSL_ia32cap (*(OPENSSL_ia32cap_loc())) +int OPENSSL_isservice(void); + +int FIPS_mode(void); +int FIPS_mode_set(int r); + +void OPENSSL_init(void); + +# define fips_md_init(alg) fips_md_init_ctx(alg, alg) + +# ifdef OPENSSL_FIPS +# define fips_md_init_ctx(alg, cx) \ + int alg##_Init(cx##_CTX *c) \ + { \ + if (FIPS_mode()) OpenSSLDie(__FILE__, __LINE__, \ + "Low level API call to digest " #alg " forbidden in FIPS mode!"); \ + return private_##alg##_Init(c); \ + } \ + int private_##alg##_Init(cx##_CTX *c) + +# define fips_cipher_abort(alg) \ + if (FIPS_mode()) OpenSSLDie(__FILE__, __LINE__, \ + "Low level API call to cipher " #alg " forbidden in FIPS mode!") + +# else +# define fips_md_init_ctx(alg, cx) \ + int alg##_Init(cx##_CTX *c) +# define fips_cipher_abort(alg) while(0) +# endif + +/* + * CRYPTO_memcmp returns zero iff the |len| bytes at |a| and |b| are equal. + * It takes an amount of time dependent on |len|, but independent of the + * contents of |a| and |b|. Unlike memcmp, it cannot be used to put elements + * into a defined order as the return value when a != b is undefined, other + * than to be non-zero. + */ +int CRYPTO_memcmp(const volatile void *a, const volatile void *b, size_t len); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_CRYPTO_strings(void); + +/* Error codes for the CRYPTO functions. */ + +/* Function codes. */ +# define CRYPTO_F_CRYPTO_GET_EX_NEW_INDEX 100 +# define CRYPTO_F_CRYPTO_GET_NEW_DYNLOCKID 103 +# define CRYPTO_F_CRYPTO_GET_NEW_LOCKID 101 +# define CRYPTO_F_CRYPTO_SET_EX_DATA 102 +# define CRYPTO_F_DEF_ADD_INDEX 104 +# define CRYPTO_F_DEF_GET_CLASS 105 +# define CRYPTO_F_FIPS_MODE_SET 109 +# define CRYPTO_F_INT_DUP_EX_DATA 106 +# define CRYPTO_F_INT_FREE_EX_DATA 107 +# define CRYPTO_F_INT_NEW_EX_DATA 108 + +/* Reason codes. */ +# define CRYPTO_R_FIPS_MODE_NOT_SUPPORTED 101 +# define CRYPTO_R_NO_DYNLOCK_CREATE_CALLBACK 100 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/des.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/des.h new file mode 100644 index 0000000..1b40144 --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/des.h @@ -0,0 +1,257 @@ +/* crypto/des/des.h */ +/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_NEW_DES_H +# define HEADER_NEW_DES_H + +# include /* OPENSSL_EXTERN, OPENSSL_NO_DES, DES_LONG + * (via openssl/opensslconf.h */ + +# ifdef OPENSSL_NO_DES +# error DES is disabled. +# endif + +# ifdef OPENSSL_BUILD_SHLIBCRYPTO +# undef OPENSSL_EXTERN +# define OPENSSL_EXTERN OPENSSL_EXPORT +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef unsigned char DES_cblock[8]; +typedef /* const */ unsigned char const_DES_cblock[8]; +/* + * With "const", gcc 2.8.1 on Solaris thinks that DES_cblock * and + * const_DES_cblock * are incompatible pointer types. + */ + +typedef struct DES_ks { + union { + DES_cblock cblock; + /* + * make sure things are correct size on machines with 8 byte longs + */ + DES_LONG deslong[2]; + } ks[16]; +} DES_key_schedule; + +# ifndef OPENSSL_DISABLE_OLD_DES_SUPPORT +# ifndef OPENSSL_ENABLE_OLD_DES_SUPPORT +# define OPENSSL_ENABLE_OLD_DES_SUPPORT +# endif +# endif + +# ifdef OPENSSL_ENABLE_OLD_DES_SUPPORT +# include +# endif + +# define DES_KEY_SZ (sizeof(DES_cblock)) +# define DES_SCHEDULE_SZ (sizeof(DES_key_schedule)) + +# define DES_ENCRYPT 1 +# define DES_DECRYPT 0 + +# define DES_CBC_MODE 0 +# define DES_PCBC_MODE 1 + +# define DES_ecb2_encrypt(i,o,k1,k2,e) \ + DES_ecb3_encrypt((i),(o),(k1),(k2),(k1),(e)) + +# define DES_ede2_cbc_encrypt(i,o,l,k1,k2,iv,e) \ + DES_ede3_cbc_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(e)) + +# define DES_ede2_cfb64_encrypt(i,o,l,k1,k2,iv,n,e) \ + DES_ede3_cfb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n),(e)) + +# define DES_ede2_ofb64_encrypt(i,o,l,k1,k2,iv,n) \ + DES_ede3_ofb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n)) + +OPENSSL_DECLARE_GLOBAL(int, DES_check_key); /* defaults to false */ +# define DES_check_key OPENSSL_GLOBAL_REF(DES_check_key) +OPENSSL_DECLARE_GLOBAL(int, DES_rw_mode); /* defaults to DES_PCBC_MODE */ +# define DES_rw_mode OPENSSL_GLOBAL_REF(DES_rw_mode) + +const char *DES_options(void); +void DES_ecb3_encrypt(const_DES_cblock *input, DES_cblock *output, + DES_key_schedule *ks1, DES_key_schedule *ks2, + DES_key_schedule *ks3, int enc); +DES_LONG DES_cbc_cksum(const unsigned char *input, DES_cblock *output, + long length, DES_key_schedule *schedule, + const_DES_cblock *ivec); +/* DES_cbc_encrypt does not update the IV! Use DES_ncbc_encrypt instead. */ +void DES_cbc_encrypt(const unsigned char *input, unsigned char *output, + long length, DES_key_schedule *schedule, + DES_cblock *ivec, int enc); +void DES_ncbc_encrypt(const unsigned char *input, unsigned char *output, + long length, DES_key_schedule *schedule, + DES_cblock *ivec, int enc); +void DES_xcbc_encrypt(const unsigned char *input, unsigned char *output, + long length, DES_key_schedule *schedule, + DES_cblock *ivec, const_DES_cblock *inw, + const_DES_cblock *outw, int enc); +void DES_cfb_encrypt(const unsigned char *in, unsigned char *out, int numbits, + long length, DES_key_schedule *schedule, + DES_cblock *ivec, int enc); +void DES_ecb_encrypt(const_DES_cblock *input, DES_cblock *output, + DES_key_schedule *ks, int enc); + +/* + * This is the DES encryption function that gets called by just about every + * other DES routine in the library. You should not use this function except + * to implement 'modes' of DES. I say this because the functions that call + * this routine do the conversion from 'char *' to long, and this needs to be + * done to make sure 'non-aligned' memory access do not occur. The + * characters are loaded 'little endian'. Data is a pointer to 2 unsigned + * long's and ks is the DES_key_schedule to use. enc, is non zero specifies + * encryption, zero if decryption. + */ +void DES_encrypt1(DES_LONG *data, DES_key_schedule *ks, int enc); + +/* + * This functions is the same as DES_encrypt1() except that the DES initial + * permutation (IP) and final permutation (FP) have been left out. As for + * DES_encrypt1(), you should not use this function. It is used by the + * routines in the library that implement triple DES. IP() DES_encrypt2() + * DES_encrypt2() DES_encrypt2() FP() is the same as DES_encrypt1() + * DES_encrypt1() DES_encrypt1() except faster :-). + */ +void DES_encrypt2(DES_LONG *data, DES_key_schedule *ks, int enc); + +void DES_encrypt3(DES_LONG *data, DES_key_schedule *ks1, + DES_key_schedule *ks2, DES_key_schedule *ks3); +void DES_decrypt3(DES_LONG *data, DES_key_schedule *ks1, + DES_key_schedule *ks2, DES_key_schedule *ks3); +void DES_ede3_cbc_encrypt(const unsigned char *input, unsigned char *output, + long length, + DES_key_schedule *ks1, DES_key_schedule *ks2, + DES_key_schedule *ks3, DES_cblock *ivec, int enc); +void DES_ede3_cbcm_encrypt(const unsigned char *in, unsigned char *out, + long length, + DES_key_schedule *ks1, DES_key_schedule *ks2, + DES_key_schedule *ks3, + DES_cblock *ivec1, DES_cblock *ivec2, int enc); +void DES_ede3_cfb64_encrypt(const unsigned char *in, unsigned char *out, + long length, DES_key_schedule *ks1, + DES_key_schedule *ks2, DES_key_schedule *ks3, + DES_cblock *ivec, int *num, int enc); +void DES_ede3_cfb_encrypt(const unsigned char *in, unsigned char *out, + int numbits, long length, DES_key_schedule *ks1, + DES_key_schedule *ks2, DES_key_schedule *ks3, + DES_cblock *ivec, int enc); +void DES_ede3_ofb64_encrypt(const unsigned char *in, unsigned char *out, + long length, DES_key_schedule *ks1, + DES_key_schedule *ks2, DES_key_schedule *ks3, + DES_cblock *ivec, int *num); +# if 0 +void DES_xwhite_in2out(const_DES_cblock *DES_key, const_DES_cblock *in_white, + DES_cblock *out_white); +# endif + +int DES_enc_read(int fd, void *buf, int len, DES_key_schedule *sched, + DES_cblock *iv); +int DES_enc_write(int fd, const void *buf, int len, DES_key_schedule *sched, + DES_cblock *iv); +char *DES_fcrypt(const char *buf, const char *salt, char *ret); +char *DES_crypt(const char *buf, const char *salt); +void DES_ofb_encrypt(const unsigned char *in, unsigned char *out, int numbits, + long length, DES_key_schedule *schedule, + DES_cblock *ivec); +void DES_pcbc_encrypt(const unsigned char *input, unsigned char *output, + long length, DES_key_schedule *schedule, + DES_cblock *ivec, int enc); +DES_LONG DES_quad_cksum(const unsigned char *input, DES_cblock output[], + long length, int out_count, DES_cblock *seed); +int DES_random_key(DES_cblock *ret); +void DES_set_odd_parity(DES_cblock *key); +int DES_check_key_parity(const_DES_cblock *key); +int DES_is_weak_key(const_DES_cblock *key); +/* + * DES_set_key (= set_key = DES_key_sched = key_sched) calls + * DES_set_key_checked if global variable DES_check_key is set, + * DES_set_key_unchecked otherwise. + */ +int DES_set_key(const_DES_cblock *key, DES_key_schedule *schedule); +int DES_key_sched(const_DES_cblock *key, DES_key_schedule *schedule); +int DES_set_key_checked(const_DES_cblock *key, DES_key_schedule *schedule); +void DES_set_key_unchecked(const_DES_cblock *key, DES_key_schedule *schedule); +# ifdef OPENSSL_FIPS +void private_DES_set_key_unchecked(const_DES_cblock *key, + DES_key_schedule *schedule); +# endif +void DES_string_to_key(const char *str, DES_cblock *key); +void DES_string_to_2keys(const char *str, DES_cblock *key1, DES_cblock *key2); +void DES_cfb64_encrypt(const unsigned char *in, unsigned char *out, + long length, DES_key_schedule *schedule, + DES_cblock *ivec, int *num, int enc); +void DES_ofb64_encrypt(const unsigned char *in, unsigned char *out, + long length, DES_key_schedule *schedule, + DES_cblock *ivec, int *num); + +int DES_read_password(DES_cblock *key, const char *prompt, int verify); +int DES_read_2passwords(DES_cblock *key1, DES_cblock *key2, + const char *prompt, int verify); + +# define DES_fixup_key_parity DES_set_odd_parity + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/des_old.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/des_old.h new file mode 100644 index 0000000..ee7607a --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/des_old.h @@ -0,0 +1,497 @@ +/* crypto/des/des_old.h */ + +/*- + * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING + * + * The function names in here are deprecated and are only present to + * provide an interface compatible with openssl 0.9.6 and older as + * well as libdes. OpenSSL now provides functions where "des_" has + * been replaced with "DES_" in the names, to make it possible to + * make incompatible changes that are needed for C type security and + * other stuff. + * + * This include files has two compatibility modes: + * + * - If OPENSSL_DES_LIBDES_COMPATIBILITY is defined, you get an API + * that is compatible with libdes and SSLeay. + * - If OPENSSL_DES_LIBDES_COMPATIBILITY isn't defined, you get an + * API that is compatible with OpenSSL 0.9.5x to 0.9.6x. + * + * Note that these modes break earlier snapshots of OpenSSL, where + * libdes compatibility was the only available mode or (later on) the + * prefered compatibility mode. However, after much consideration + * (and more or less violent discussions with external parties), it + * was concluded that OpenSSL should be compatible with earlier versions + * of itself before anything else. Also, in all honesty, libdes is + * an old beast that shouldn't really be used any more. + * + * Please consider starting to use the DES_ functions rather than the + * des_ ones. The des_ functions will disappear completely before + * OpenSSL 1.0! + * + * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING + */ + +/* + * Written by Richard Levitte (richard@levitte.org) for the OpenSSL project + * 2001. + */ +/* ==================================================================== + * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_DES_H +# define HEADER_DES_H + +# include /* OPENSSL_EXTERN, OPENSSL_NO_DES, DES_LONG */ + +# ifdef OPENSSL_NO_DES +# error DES is disabled. +# endif + +# ifndef HEADER_NEW_DES_H +# error You must include des.h, not des_old.h directly. +# endif + +# ifdef _KERBEROS_DES_H +# error replaces . +# endif + +# include + +# ifdef OPENSSL_BUILD_SHLIBCRYPTO +# undef OPENSSL_EXTERN +# define OPENSSL_EXTERN OPENSSL_EXPORT +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +# ifdef _ +# undef _ +# endif + +typedef unsigned char _ossl_old_des_cblock[8]; +typedef struct _ossl_old_des_ks_struct { + union { + _ossl_old_des_cblock _; + /* + * make sure things are correct size on machines with 8 byte longs + */ + DES_LONG pad[2]; + } ks; +} _ossl_old_des_key_schedule[16]; + +# ifndef OPENSSL_DES_LIBDES_COMPATIBILITY +# define des_cblock DES_cblock +# define const_des_cblock const_DES_cblock +# define des_key_schedule DES_key_schedule +# define des_ecb3_encrypt(i,o,k1,k2,k3,e)\ + DES_ecb3_encrypt((i),(o),&(k1),&(k2),&(k3),(e)) +# define des_ede3_cbc_encrypt(i,o,l,k1,k2,k3,iv,e)\ + DES_ede3_cbc_encrypt((i),(o),(l),&(k1),&(k2),&(k3),(iv),(e)) +# define des_ede3_cbcm_encrypt(i,o,l,k1,k2,k3,iv1,iv2,e)\ + DES_ede3_cbcm_encrypt((i),(o),(l),&(k1),&(k2),&(k3),(iv1),(iv2),(e)) +# define des_ede3_cfb64_encrypt(i,o,l,k1,k2,k3,iv,n,e)\ + DES_ede3_cfb64_encrypt((i),(o),(l),&(k1),&(k2),&(k3),(iv),(n),(e)) +# define des_ede3_ofb64_encrypt(i,o,l,k1,k2,k3,iv,n)\ + DES_ede3_ofb64_encrypt((i),(o),(l),&(k1),&(k2),&(k3),(iv),(n)) +# define des_options()\ + DES_options() +# define des_cbc_cksum(i,o,l,k,iv)\ + DES_cbc_cksum((i),(o),(l),&(k),(iv)) +# define des_cbc_encrypt(i,o,l,k,iv,e)\ + DES_cbc_encrypt((i),(o),(l),&(k),(iv),(e)) +# define des_ncbc_encrypt(i,o,l,k,iv,e)\ + DES_ncbc_encrypt((i),(o),(l),&(k),(iv),(e)) +# define des_xcbc_encrypt(i,o,l,k,iv,inw,outw,e)\ + DES_xcbc_encrypt((i),(o),(l),&(k),(iv),(inw),(outw),(e)) +# define des_cfb_encrypt(i,o,n,l,k,iv,e)\ + DES_cfb_encrypt((i),(o),(n),(l),&(k),(iv),(e)) +# define des_ecb_encrypt(i,o,k,e)\ + DES_ecb_encrypt((i),(o),&(k),(e)) +# define des_encrypt1(d,k,e)\ + DES_encrypt1((d),&(k),(e)) +# define des_encrypt2(d,k,e)\ + DES_encrypt2((d),&(k),(e)) +# define des_encrypt3(d,k1,k2,k3)\ + DES_encrypt3((d),&(k1),&(k2),&(k3)) +# define des_decrypt3(d,k1,k2,k3)\ + DES_decrypt3((d),&(k1),&(k2),&(k3)) +# define des_xwhite_in2out(k,i,o)\ + DES_xwhite_in2out((k),(i),(o)) +# define des_enc_read(f,b,l,k,iv)\ + DES_enc_read((f),(b),(l),&(k),(iv)) +# define des_enc_write(f,b,l,k,iv)\ + DES_enc_write((f),(b),(l),&(k),(iv)) +# define des_fcrypt(b,s,r)\ + DES_fcrypt((b),(s),(r)) +# if 0 +# define des_crypt(b,s)\ + DES_crypt((b),(s)) +# if !defined(PERL5) && !defined(__FreeBSD__) && !defined(NeXT) && !defined(__OpenBSD__) +# define crypt(b,s)\ + DES_crypt((b),(s)) +# endif +# endif +# define des_ofb_encrypt(i,o,n,l,k,iv)\ + DES_ofb_encrypt((i),(o),(n),(l),&(k),(iv)) +# define des_pcbc_encrypt(i,o,l,k,iv,e)\ + DES_pcbc_encrypt((i),(o),(l),&(k),(iv),(e)) +# define des_quad_cksum(i,o,l,c,s)\ + DES_quad_cksum((i),(o),(l),(c),(s)) +# define des_random_seed(k)\ + _ossl_096_des_random_seed((k)) +# define des_random_key(r)\ + DES_random_key((r)) +# define des_read_password(k,p,v) \ + DES_read_password((k),(p),(v)) +# define des_read_2passwords(k1,k2,p,v) \ + DES_read_2passwords((k1),(k2),(p),(v)) +# define des_set_odd_parity(k)\ + DES_set_odd_parity((k)) +# define des_check_key_parity(k)\ + DES_check_key_parity((k)) +# define des_is_weak_key(k)\ + DES_is_weak_key((k)) +# define des_set_key(k,ks)\ + DES_set_key((k),&(ks)) +# define des_key_sched(k,ks)\ + DES_key_sched((k),&(ks)) +# define des_set_key_checked(k,ks)\ + DES_set_key_checked((k),&(ks)) +# define des_set_key_unchecked(k,ks)\ + DES_set_key_unchecked((k),&(ks)) +# define des_string_to_key(s,k)\ + DES_string_to_key((s),(k)) +# define des_string_to_2keys(s,k1,k2)\ + DES_string_to_2keys((s),(k1),(k2)) +# define des_cfb64_encrypt(i,o,l,ks,iv,n,e)\ + DES_cfb64_encrypt((i),(o),(l),&(ks),(iv),(n),(e)) +# define des_ofb64_encrypt(i,o,l,ks,iv,n)\ + DES_ofb64_encrypt((i),(o),(l),&(ks),(iv),(n)) + +# define des_ecb2_encrypt(i,o,k1,k2,e) \ + des_ecb3_encrypt((i),(o),(k1),(k2),(k1),(e)) + +# define des_ede2_cbc_encrypt(i,o,l,k1,k2,iv,e) \ + des_ede3_cbc_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(e)) + +# define des_ede2_cfb64_encrypt(i,o,l,k1,k2,iv,n,e) \ + des_ede3_cfb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n),(e)) + +# define des_ede2_ofb64_encrypt(i,o,l,k1,k2,iv,n) \ + des_ede3_ofb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n)) + +# define des_check_key DES_check_key +# define des_rw_mode DES_rw_mode +# else /* libdes compatibility */ +/* + * Map all symbol names to _ossl_old_des_* form, so we avoid all clashes with + * libdes + */ +# define des_cblock _ossl_old_des_cblock +# define des_key_schedule _ossl_old_des_key_schedule +# define des_ecb3_encrypt(i,o,k1,k2,k3,e)\ + _ossl_old_des_ecb3_encrypt((i),(o),(k1),(k2),(k3),(e)) +# define des_ede3_cbc_encrypt(i,o,l,k1,k2,k3,iv,e)\ + _ossl_old_des_ede3_cbc_encrypt((i),(o),(l),(k1),(k2),(k3),(iv),(e)) +# define des_ede3_cfb64_encrypt(i,o,l,k1,k2,k3,iv,n,e)\ + _ossl_old_des_ede3_cfb64_encrypt((i),(o),(l),(k1),(k2),(k3),(iv),(n),(e)) +# define des_ede3_ofb64_encrypt(i,o,l,k1,k2,k3,iv,n)\ + _ossl_old_des_ede3_ofb64_encrypt((i),(o),(l),(k1),(k2),(k3),(iv),(n)) +# define des_options()\ + _ossl_old_des_options() +# define des_cbc_cksum(i,o,l,k,iv)\ + _ossl_old_des_cbc_cksum((i),(o),(l),(k),(iv)) +# define des_cbc_encrypt(i,o,l,k,iv,e)\ + _ossl_old_des_cbc_encrypt((i),(o),(l),(k),(iv),(e)) +# define des_ncbc_encrypt(i,o,l,k,iv,e)\ + _ossl_old_des_ncbc_encrypt((i),(o),(l),(k),(iv),(e)) +# define des_xcbc_encrypt(i,o,l,k,iv,inw,outw,e)\ + _ossl_old_des_xcbc_encrypt((i),(o),(l),(k),(iv),(inw),(outw),(e)) +# define des_cfb_encrypt(i,o,n,l,k,iv,e)\ + _ossl_old_des_cfb_encrypt((i),(o),(n),(l),(k),(iv),(e)) +# define des_ecb_encrypt(i,o,k,e)\ + _ossl_old_des_ecb_encrypt((i),(o),(k),(e)) +# define des_encrypt(d,k,e)\ + _ossl_old_des_encrypt((d),(k),(e)) +# define des_encrypt2(d,k,e)\ + _ossl_old_des_encrypt2((d),(k),(e)) +# define des_encrypt3(d,k1,k2,k3)\ + _ossl_old_des_encrypt3((d),(k1),(k2),(k3)) +# define des_decrypt3(d,k1,k2,k3)\ + _ossl_old_des_decrypt3((d),(k1),(k2),(k3)) +# define des_xwhite_in2out(k,i,o)\ + _ossl_old_des_xwhite_in2out((k),(i),(o)) +# define des_enc_read(f,b,l,k,iv)\ + _ossl_old_des_enc_read((f),(b),(l),(k),(iv)) +# define des_enc_write(f,b,l,k,iv)\ + _ossl_old_des_enc_write((f),(b),(l),(k),(iv)) +# define des_fcrypt(b,s,r)\ + _ossl_old_des_fcrypt((b),(s),(r)) +# define des_crypt(b,s)\ + _ossl_old_des_crypt((b),(s)) +# if 0 +# define crypt(b,s)\ + _ossl_old_crypt((b),(s)) +# endif +# define des_ofb_encrypt(i,o,n,l,k,iv)\ + _ossl_old_des_ofb_encrypt((i),(o),(n),(l),(k),(iv)) +# define des_pcbc_encrypt(i,o,l,k,iv,e)\ + _ossl_old_des_pcbc_encrypt((i),(o),(l),(k),(iv),(e)) +# define des_quad_cksum(i,o,l,c,s)\ + _ossl_old_des_quad_cksum((i),(o),(l),(c),(s)) +# define des_random_seed(k)\ + _ossl_old_des_random_seed((k)) +# define des_random_key(r)\ + _ossl_old_des_random_key((r)) +# define des_read_password(k,p,v) \ + _ossl_old_des_read_password((k),(p),(v)) +# define des_read_2passwords(k1,k2,p,v) \ + _ossl_old_des_read_2passwords((k1),(k2),(p),(v)) +# define des_set_odd_parity(k)\ + _ossl_old_des_set_odd_parity((k)) +# define des_is_weak_key(k)\ + _ossl_old_des_is_weak_key((k)) +# define des_set_key(k,ks)\ + _ossl_old_des_set_key((k),(ks)) +# define des_key_sched(k,ks)\ + _ossl_old_des_key_sched((k),(ks)) +# define des_string_to_key(s,k)\ + _ossl_old_des_string_to_key((s),(k)) +# define des_string_to_2keys(s,k1,k2)\ + _ossl_old_des_string_to_2keys((s),(k1),(k2)) +# define des_cfb64_encrypt(i,o,l,ks,iv,n,e)\ + _ossl_old_des_cfb64_encrypt((i),(o),(l),(ks),(iv),(n),(e)) +# define des_ofb64_encrypt(i,o,l,ks,iv,n)\ + _ossl_old_des_ofb64_encrypt((i),(o),(l),(ks),(iv),(n)) + +# define des_ecb2_encrypt(i,o,k1,k2,e) \ + des_ecb3_encrypt((i),(o),(k1),(k2),(k1),(e)) + +# define des_ede2_cbc_encrypt(i,o,l,k1,k2,iv,e) \ + des_ede3_cbc_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(e)) + +# define des_ede2_cfb64_encrypt(i,o,l,k1,k2,iv,n,e) \ + des_ede3_cfb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n),(e)) + +# define des_ede2_ofb64_encrypt(i,o,l,k1,k2,iv,n) \ + des_ede3_ofb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n)) + +# define des_check_key DES_check_key +# define des_rw_mode DES_rw_mode +# endif + +const char *_ossl_old_des_options(void); +void _ossl_old_des_ecb3_encrypt(_ossl_old_des_cblock *input, + _ossl_old_des_cblock *output, + _ossl_old_des_key_schedule ks1, + _ossl_old_des_key_schedule ks2, + _ossl_old_des_key_schedule ks3, int enc); +DES_LONG _ossl_old_des_cbc_cksum(_ossl_old_des_cblock *input, + _ossl_old_des_cblock *output, long length, + _ossl_old_des_key_schedule schedule, + _ossl_old_des_cblock *ivec); +void _ossl_old_des_cbc_encrypt(_ossl_old_des_cblock *input, + _ossl_old_des_cblock *output, long length, + _ossl_old_des_key_schedule schedule, + _ossl_old_des_cblock *ivec, int enc); +void _ossl_old_des_ncbc_encrypt(_ossl_old_des_cblock *input, + _ossl_old_des_cblock *output, long length, + _ossl_old_des_key_schedule schedule, + _ossl_old_des_cblock *ivec, int enc); +void _ossl_old_des_xcbc_encrypt(_ossl_old_des_cblock *input, + _ossl_old_des_cblock *output, long length, + _ossl_old_des_key_schedule schedule, + _ossl_old_des_cblock *ivec, + _ossl_old_des_cblock *inw, + _ossl_old_des_cblock *outw, int enc); +void _ossl_old_des_cfb_encrypt(unsigned char *in, unsigned char *out, + int numbits, long length, + _ossl_old_des_key_schedule schedule, + _ossl_old_des_cblock *ivec, int enc); +void _ossl_old_des_ecb_encrypt(_ossl_old_des_cblock *input, + _ossl_old_des_cblock *output, + _ossl_old_des_key_schedule ks, int enc); +void _ossl_old_des_encrypt(DES_LONG *data, _ossl_old_des_key_schedule ks, + int enc); +void _ossl_old_des_encrypt2(DES_LONG *data, _ossl_old_des_key_schedule ks, + int enc); +void _ossl_old_des_encrypt3(DES_LONG *data, _ossl_old_des_key_schedule ks1, + _ossl_old_des_key_schedule ks2, + _ossl_old_des_key_schedule ks3); +void _ossl_old_des_decrypt3(DES_LONG *data, _ossl_old_des_key_schedule ks1, + _ossl_old_des_key_schedule ks2, + _ossl_old_des_key_schedule ks3); +void _ossl_old_des_ede3_cbc_encrypt(_ossl_old_des_cblock *input, + _ossl_old_des_cblock *output, long length, + _ossl_old_des_key_schedule ks1, + _ossl_old_des_key_schedule ks2, + _ossl_old_des_key_schedule ks3, + _ossl_old_des_cblock *ivec, int enc); +void _ossl_old_des_ede3_cfb64_encrypt(unsigned char *in, unsigned char *out, + long length, + _ossl_old_des_key_schedule ks1, + _ossl_old_des_key_schedule ks2, + _ossl_old_des_key_schedule ks3, + _ossl_old_des_cblock *ivec, int *num, + int enc); +void _ossl_old_des_ede3_ofb64_encrypt(unsigned char *in, unsigned char *out, + long length, + _ossl_old_des_key_schedule ks1, + _ossl_old_des_key_schedule ks2, + _ossl_old_des_key_schedule ks3, + _ossl_old_des_cblock *ivec, int *num); +# if 0 +void _ossl_old_des_xwhite_in2out(_ossl_old_des_cblock (*des_key), + _ossl_old_des_cblock (*in_white), + _ossl_old_des_cblock (*out_white)); +# endif + +int _ossl_old_des_enc_read(int fd, char *buf, int len, + _ossl_old_des_key_schedule sched, + _ossl_old_des_cblock *iv); +int _ossl_old_des_enc_write(int fd, char *buf, int len, + _ossl_old_des_key_schedule sched, + _ossl_old_des_cblock *iv); +char *_ossl_old_des_fcrypt(const char *buf, const char *salt, char *ret); +char *_ossl_old_des_crypt(const char *buf, const char *salt); +# if !defined(PERL5) && !defined(NeXT) +char *_ossl_old_crypt(const char *buf, const char *salt); +# endif +void _ossl_old_des_ofb_encrypt(unsigned char *in, unsigned char *out, + int numbits, long length, + _ossl_old_des_key_schedule schedule, + _ossl_old_des_cblock *ivec); +void _ossl_old_des_pcbc_encrypt(_ossl_old_des_cblock *input, + _ossl_old_des_cblock *output, long length, + _ossl_old_des_key_schedule schedule, + _ossl_old_des_cblock *ivec, int enc); +DES_LONG _ossl_old_des_quad_cksum(_ossl_old_des_cblock *input, + _ossl_old_des_cblock *output, long length, + int out_count, _ossl_old_des_cblock *seed); +void _ossl_old_des_random_seed(_ossl_old_des_cblock key); +void _ossl_old_des_random_key(_ossl_old_des_cblock ret); +int _ossl_old_des_read_password(_ossl_old_des_cblock *key, const char *prompt, + int verify); +int _ossl_old_des_read_2passwords(_ossl_old_des_cblock *key1, + _ossl_old_des_cblock *key2, + const char *prompt, int verify); +void _ossl_old_des_set_odd_parity(_ossl_old_des_cblock *key); +int _ossl_old_des_is_weak_key(_ossl_old_des_cblock *key); +int _ossl_old_des_set_key(_ossl_old_des_cblock *key, + _ossl_old_des_key_schedule schedule); +int _ossl_old_des_key_sched(_ossl_old_des_cblock *key, + _ossl_old_des_key_schedule schedule); +void _ossl_old_des_string_to_key(char *str, _ossl_old_des_cblock *key); +void _ossl_old_des_string_to_2keys(char *str, _ossl_old_des_cblock *key1, + _ossl_old_des_cblock *key2); +void _ossl_old_des_cfb64_encrypt(unsigned char *in, unsigned char *out, + long length, + _ossl_old_des_key_schedule schedule, + _ossl_old_des_cblock *ivec, int *num, + int enc); +void _ossl_old_des_ofb64_encrypt(unsigned char *in, unsigned char *out, + long length, + _ossl_old_des_key_schedule schedule, + _ossl_old_des_cblock *ivec, int *num); + +void _ossl_096_des_random_seed(des_cblock *key); + +/* + * The following definitions provide compatibility with the MIT Kerberos + * library. The _ossl_old_des_key_schedule structure is not binary + * compatible. + */ + +# define _KERBEROS_DES_H + +# define KRBDES_ENCRYPT DES_ENCRYPT +# define KRBDES_DECRYPT DES_DECRYPT + +# ifdef KERBEROS +# define ENCRYPT DES_ENCRYPT +# define DECRYPT DES_DECRYPT +# endif + +# ifndef NCOMPAT +# define C_Block des_cblock +# define Key_schedule des_key_schedule +# define KEY_SZ DES_KEY_SZ +# define string_to_key des_string_to_key +# define read_pw_string des_read_pw_string +# define random_key des_random_key +# define pcbc_encrypt des_pcbc_encrypt +# define set_key des_set_key +# define key_sched des_key_sched +# define ecb_encrypt des_ecb_encrypt +# define cbc_encrypt des_cbc_encrypt +# define ncbc_encrypt des_ncbc_encrypt +# define xcbc_encrypt des_xcbc_encrypt +# define cbc_cksum des_cbc_cksum +# define quad_cksum des_quad_cksum +# define check_parity des_check_key_parity +# endif + +# define des_fixup_key_parity DES_fixup_key_parity + +#ifdef __cplusplus +} +#endif + +/* for DES_read_pw_string et al */ +# include + +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/dh.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/dh.h new file mode 100644 index 0000000..a5bd901 --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/dh.h @@ -0,0 +1,393 @@ +/* crypto/dh/dh.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_DH_H +# define HEADER_DH_H + +# include + +# ifdef OPENSSL_NO_DH +# error DH is disabled. +# endif + +# ifndef OPENSSL_NO_BIO +# include +# endif +# include +# ifndef OPENSSL_NO_DEPRECATED +# include +# endif + +# ifndef OPENSSL_DH_MAX_MODULUS_BITS +# define OPENSSL_DH_MAX_MODULUS_BITS 10000 +# endif + +# define DH_FLAG_CACHE_MONT_P 0x01 + +/* + * new with 0.9.7h; the built-in DH + * implementation now uses constant time + * modular exponentiation for secret exponents + * by default. This flag causes the + * faster variable sliding window method to + * be used for all exponents. + */ +# define DH_FLAG_NO_EXP_CONSTTIME 0x02 + +/* + * If this flag is set the DH method is FIPS compliant and can be used in + * FIPS mode. This is set in the validated module method. If an application + * sets this flag in its own methods it is its reposibility to ensure the + * result is compliant. + */ + +# define DH_FLAG_FIPS_METHOD 0x0400 + +/* + * If this flag is set the operations normally disabled in FIPS mode are + * permitted it is then the applications responsibility to ensure that the + * usage is compliant. + */ + +# define DH_FLAG_NON_FIPS_ALLOW 0x0400 + +#ifdef __cplusplus +extern "C" { +#endif + +/* Already defined in ossl_typ.h */ +/* typedef struct dh_st DH; */ +/* typedef struct dh_method DH_METHOD; */ + +struct dh_method { + const char *name; + /* Methods here */ + int (*generate_key) (DH *dh); + int (*compute_key) (unsigned char *key, const BIGNUM *pub_key, DH *dh); + /* Can be null */ + int (*bn_mod_exp) (const DH *dh, BIGNUM *r, const BIGNUM *a, + const BIGNUM *p, const BIGNUM *m, BN_CTX *ctx, + BN_MONT_CTX *m_ctx); + int (*init) (DH *dh); + int (*finish) (DH *dh); + int flags; + char *app_data; + /* If this is non-NULL, it will be used to generate parameters */ + int (*generate_params) (DH *dh, int prime_len, int generator, + BN_GENCB *cb); +}; + +struct dh_st { + /* + * This first argument is used to pick up errors when a DH is passed + * instead of a EVP_PKEY + */ + int pad; + int version; + BIGNUM *p; + BIGNUM *g; + long length; /* optional */ + BIGNUM *pub_key; /* g^x % p */ + BIGNUM *priv_key; /* x */ + int flags; + BN_MONT_CTX *method_mont_p; + /* Place holders if we want to do X9.42 DH */ + BIGNUM *q; + BIGNUM *j; + unsigned char *seed; + int seedlen; + BIGNUM *counter; + int references; + CRYPTO_EX_DATA ex_data; + const DH_METHOD *meth; + ENGINE *engine; +}; + +# define DH_GENERATOR_2 2 +/* #define DH_GENERATOR_3 3 */ +# define DH_GENERATOR_5 5 + +/* DH_check error codes */ +# define DH_CHECK_P_NOT_PRIME 0x01 +# define DH_CHECK_P_NOT_SAFE_PRIME 0x02 +# define DH_UNABLE_TO_CHECK_GENERATOR 0x04 +# define DH_NOT_SUITABLE_GENERATOR 0x08 +# define DH_CHECK_Q_NOT_PRIME 0x10 +# define DH_CHECK_INVALID_Q_VALUE 0x20 +# define DH_CHECK_INVALID_J_VALUE 0x40 + +/* DH_check_pub_key error codes */ +# define DH_CHECK_PUBKEY_TOO_SMALL 0x01 +# define DH_CHECK_PUBKEY_TOO_LARGE 0x02 +# define DH_CHECK_PUBKEY_INVALID 0x04 + +/* + * primes p where (p-1)/2 is prime too are called "safe"; we define this for + * backward compatibility: + */ +# define DH_CHECK_P_NOT_STRONG_PRIME DH_CHECK_P_NOT_SAFE_PRIME + +# define d2i_DHparams_fp(fp,x) (DH *)ASN1_d2i_fp((char *(*)())DH_new, \ + (char *(*)())d2i_DHparams,(fp),(unsigned char **)(x)) +# define i2d_DHparams_fp(fp,x) ASN1_i2d_fp(i2d_DHparams,(fp), \ + (unsigned char *)(x)) +# define d2i_DHparams_bio(bp,x) ASN1_d2i_bio_of(DH,DH_new,d2i_DHparams,bp,x) +# define i2d_DHparams_bio(bp,x) ASN1_i2d_bio_of_const(DH,i2d_DHparams,bp,x) + +DH *DHparams_dup(DH *); + +const DH_METHOD *DH_OpenSSL(void); + +void DH_set_default_method(const DH_METHOD *meth); +const DH_METHOD *DH_get_default_method(void); +int DH_set_method(DH *dh, const DH_METHOD *meth); +DH *DH_new_method(ENGINE *engine); + +DH *DH_new(void); +void DH_free(DH *dh); +int DH_up_ref(DH *dh); +int DH_size(const DH *dh); +int DH_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); +int DH_set_ex_data(DH *d, int idx, void *arg); +void *DH_get_ex_data(DH *d, int idx); + +/* Deprecated version */ +# ifndef OPENSSL_NO_DEPRECATED +DH *DH_generate_parameters(int prime_len, int generator, + void (*callback) (int, int, void *), void *cb_arg); +# endif /* !defined(OPENSSL_NO_DEPRECATED) */ + +/* New version */ +int DH_generate_parameters_ex(DH *dh, int prime_len, int generator, + BN_GENCB *cb); + +int DH_check(const DH *dh, int *codes); +int DH_check_pub_key(const DH *dh, const BIGNUM *pub_key, int *codes); +int DH_generate_key(DH *dh); +int DH_compute_key(unsigned char *key, const BIGNUM *pub_key, DH *dh); +int DH_compute_key_padded(unsigned char *key, const BIGNUM *pub_key, DH *dh); +DH *d2i_DHparams(DH **a, const unsigned char **pp, long length); +int i2d_DHparams(const DH *a, unsigned char **pp); +DH *d2i_DHxparams(DH **a, const unsigned char **pp, long length); +int i2d_DHxparams(const DH *a, unsigned char **pp); +# ifndef OPENSSL_NO_FP_API +int DHparams_print_fp(FILE *fp, const DH *x); +# endif +# ifndef OPENSSL_NO_BIO +int DHparams_print(BIO *bp, const DH *x); +# else +int DHparams_print(char *bp, const DH *x); +# endif + +/* RFC 5114 parameters */ +DH *DH_get_1024_160(void); +DH *DH_get_2048_224(void); +DH *DH_get_2048_256(void); + +/* RFC2631 KDF */ +int DH_KDF_X9_42(unsigned char *out, size_t outlen, + const unsigned char *Z, size_t Zlen, + ASN1_OBJECT *key_oid, + const unsigned char *ukm, size_t ukmlen, const EVP_MD *md); + +# define EVP_PKEY_CTX_set_dh_paramgen_prime_len(ctx, len) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DH, EVP_PKEY_OP_PARAMGEN, \ + EVP_PKEY_CTRL_DH_PARAMGEN_PRIME_LEN, len, NULL) + +# define EVP_PKEY_CTX_set_dh_paramgen_subprime_len(ctx, len) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DH, EVP_PKEY_OP_PARAMGEN, \ + EVP_PKEY_CTRL_DH_PARAMGEN_SUBPRIME_LEN, len, NULL) + +# define EVP_PKEY_CTX_set_dh_paramgen_type(ctx, typ) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DH, EVP_PKEY_OP_PARAMGEN, \ + EVP_PKEY_CTRL_DH_PARAMGEN_TYPE, typ, NULL) + +# define EVP_PKEY_CTX_set_dh_paramgen_generator(ctx, gen) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DH, EVP_PKEY_OP_PARAMGEN, \ + EVP_PKEY_CTRL_DH_PARAMGEN_GENERATOR, gen, NULL) + +# define EVP_PKEY_CTX_set_dh_rfc5114(ctx, gen) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, EVP_PKEY_OP_PARAMGEN, \ + EVP_PKEY_CTRL_DH_RFC5114, gen, NULL) + +# define EVP_PKEY_CTX_set_dhx_rfc5114(ctx, gen) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, EVP_PKEY_OP_PARAMGEN, \ + EVP_PKEY_CTRL_DH_RFC5114, gen, NULL) + +# define EVP_PKEY_CTX_set_dh_kdf_type(ctx, kdf) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_DH_KDF_TYPE, kdf, NULL) + +# define EVP_PKEY_CTX_get_dh_kdf_type(ctx) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_DH_KDF_TYPE, -2, NULL) + +# define EVP_PKEY_CTX_set0_dh_kdf_oid(ctx, oid) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_DH_KDF_OID, 0, (void *)oid) + +# define EVP_PKEY_CTX_get0_dh_kdf_oid(ctx, poid) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_GET_DH_KDF_OID, 0, (void *)poid) + +# define EVP_PKEY_CTX_set_dh_kdf_md(ctx, md) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_DH_KDF_MD, 0, (void *)md) + +# define EVP_PKEY_CTX_get_dh_kdf_md(ctx, pmd) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_GET_DH_KDF_MD, 0, (void *)pmd) + +# define EVP_PKEY_CTX_set_dh_kdf_outlen(ctx, len) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_DH_KDF_OUTLEN, len, NULL) + +# define EVP_PKEY_CTX_get_dh_kdf_outlen(ctx, plen) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_GET_DH_KDF_OUTLEN, 0, (void *)plen) + +# define EVP_PKEY_CTX_set0_dh_kdf_ukm(ctx, p, plen) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_DH_KDF_UKM, plen, (void *)p) + +# define EVP_PKEY_CTX_get0_dh_kdf_ukm(ctx, p) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_GET_DH_KDF_UKM, 0, (void *)p) + +# define EVP_PKEY_CTRL_DH_PARAMGEN_PRIME_LEN (EVP_PKEY_ALG_CTRL + 1) +# define EVP_PKEY_CTRL_DH_PARAMGEN_GENERATOR (EVP_PKEY_ALG_CTRL + 2) +# define EVP_PKEY_CTRL_DH_RFC5114 (EVP_PKEY_ALG_CTRL + 3) +# define EVP_PKEY_CTRL_DH_PARAMGEN_SUBPRIME_LEN (EVP_PKEY_ALG_CTRL + 4) +# define EVP_PKEY_CTRL_DH_PARAMGEN_TYPE (EVP_PKEY_ALG_CTRL + 5) +# define EVP_PKEY_CTRL_DH_KDF_TYPE (EVP_PKEY_ALG_CTRL + 6) +# define EVP_PKEY_CTRL_DH_KDF_MD (EVP_PKEY_ALG_CTRL + 7) +# define EVP_PKEY_CTRL_GET_DH_KDF_MD (EVP_PKEY_ALG_CTRL + 8) +# define EVP_PKEY_CTRL_DH_KDF_OUTLEN (EVP_PKEY_ALG_CTRL + 9) +# define EVP_PKEY_CTRL_GET_DH_KDF_OUTLEN (EVP_PKEY_ALG_CTRL + 10) +# define EVP_PKEY_CTRL_DH_KDF_UKM (EVP_PKEY_ALG_CTRL + 11) +# define EVP_PKEY_CTRL_GET_DH_KDF_UKM (EVP_PKEY_ALG_CTRL + 12) +# define EVP_PKEY_CTRL_DH_KDF_OID (EVP_PKEY_ALG_CTRL + 13) +# define EVP_PKEY_CTRL_GET_DH_KDF_OID (EVP_PKEY_ALG_CTRL + 14) + +/* KDF types */ +# define EVP_PKEY_DH_KDF_NONE 1 +# define EVP_PKEY_DH_KDF_X9_42 2 + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_DH_strings(void); + +/* Error codes for the DH functions. */ + +/* Function codes. */ +# define DH_F_COMPUTE_KEY 102 +# define DH_F_DHPARAMS_PRINT_FP 101 +# define DH_F_DH_BUILTIN_GENPARAMS 106 +# define DH_F_DH_CMS_DECRYPT 117 +# define DH_F_DH_CMS_SET_PEERKEY 118 +# define DH_F_DH_CMS_SET_SHARED_INFO 119 +# define DH_F_DH_COMPUTE_KEY 114 +# define DH_F_DH_GENERATE_KEY 115 +# define DH_F_DH_GENERATE_PARAMETERS_EX 116 +# define DH_F_DH_NEW_METHOD 105 +# define DH_F_DH_PARAM_DECODE 107 +# define DH_F_DH_PRIV_DECODE 110 +# define DH_F_DH_PRIV_ENCODE 111 +# define DH_F_DH_PUB_DECODE 108 +# define DH_F_DH_PUB_ENCODE 109 +# define DH_F_DO_DH_PRINT 100 +# define DH_F_GENERATE_KEY 103 +# define DH_F_GENERATE_PARAMETERS 104 +# define DH_F_PKEY_DH_DERIVE 112 +# define DH_F_PKEY_DH_KEYGEN 113 + +/* Reason codes. */ +# define DH_R_BAD_GENERATOR 101 +# define DH_R_BN_DECODE_ERROR 109 +# define DH_R_BN_ERROR 106 +# define DH_R_DECODE_ERROR 104 +# define DH_R_INVALID_PUBKEY 102 +# define DH_R_KDF_PARAMETER_ERROR 112 +# define DH_R_KEYS_NOT_SET 108 +# define DH_R_KEY_SIZE_TOO_SMALL 110 +# define DH_R_MODULUS_TOO_LARGE 103 +# define DH_R_NON_FIPS_METHOD 111 +# define DH_R_NO_PARAMETERS_SET 107 +# define DH_R_NO_PRIVATE_VALUE 100 +# define DH_R_PARAMETER_ENCODING_ERROR 105 +# define DH_R_PEER_KEY_ERROR 113 +# define DH_R_SHARED_INFO_ERROR 114 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/dsa.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/dsa.h new file mode 100644 index 0000000..545358f --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/dsa.h @@ -0,0 +1,332 @@ +/* crypto/dsa/dsa.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +/* + * The DSS routines are based on patches supplied by + * Steven Schoch . He basically did the + * work and I have just tweaked them a little to fit into my + * stylistic vision for SSLeay :-) */ + +#ifndef HEADER_DSA_H +# define HEADER_DSA_H + +# include + +# ifdef OPENSSL_NO_DSA +# error DSA is disabled. +# endif + +# ifndef OPENSSL_NO_BIO +# include +# endif +# include +# include + +# ifndef OPENSSL_NO_DEPRECATED +# include +# ifndef OPENSSL_NO_DH +# include +# endif +# endif + +# ifndef OPENSSL_DSA_MAX_MODULUS_BITS +# define OPENSSL_DSA_MAX_MODULUS_BITS 10000 +# endif + +# define DSA_FLAG_CACHE_MONT_P 0x01 +/* + * new with 0.9.7h; the built-in DSA implementation now uses constant time + * modular exponentiation for secret exponents by default. This flag causes + * the faster variable sliding window method to be used for all exponents. + */ +# define DSA_FLAG_NO_EXP_CONSTTIME 0x02 + +/* + * If this flag is set the DSA method is FIPS compliant and can be used in + * FIPS mode. This is set in the validated module method. If an application + * sets this flag in its own methods it is its reposibility to ensure the + * result is compliant. + */ + +# define DSA_FLAG_FIPS_METHOD 0x0400 + +/* + * If this flag is set the operations normally disabled in FIPS mode are + * permitted it is then the applications responsibility to ensure that the + * usage is compliant. + */ + +# define DSA_FLAG_NON_FIPS_ALLOW 0x0400 + +#ifdef __cplusplus +extern "C" { +#endif + +/* Already defined in ossl_typ.h */ +/* typedef struct dsa_st DSA; */ +/* typedef struct dsa_method DSA_METHOD; */ + +typedef struct DSA_SIG_st { + BIGNUM *r; + BIGNUM *s; +} DSA_SIG; + +struct dsa_method { + const char *name; + DSA_SIG *(*dsa_do_sign) (const unsigned char *dgst, int dlen, DSA *dsa); + int (*dsa_sign_setup) (DSA *dsa, BN_CTX *ctx_in, BIGNUM **kinvp, + BIGNUM **rp); + int (*dsa_do_verify) (const unsigned char *dgst, int dgst_len, + DSA_SIG *sig, DSA *dsa); + int (*dsa_mod_exp) (DSA *dsa, BIGNUM *rr, BIGNUM *a1, BIGNUM *p1, + BIGNUM *a2, BIGNUM *p2, BIGNUM *m, BN_CTX *ctx, + BN_MONT_CTX *in_mont); + /* Can be null */ + int (*bn_mod_exp) (DSA *dsa, BIGNUM *r, BIGNUM *a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx); + int (*init) (DSA *dsa); + int (*finish) (DSA *dsa); + int flags; + char *app_data; + /* If this is non-NULL, it is used to generate DSA parameters */ + int (*dsa_paramgen) (DSA *dsa, int bits, + const unsigned char *seed, int seed_len, + int *counter_ret, unsigned long *h_ret, + BN_GENCB *cb); + /* If this is non-NULL, it is used to generate DSA keys */ + int (*dsa_keygen) (DSA *dsa); +}; + +struct dsa_st { + /* + * This first variable is used to pick up errors where a DSA is passed + * instead of of a EVP_PKEY + */ + int pad; + long version; + int write_params; + BIGNUM *p; + BIGNUM *q; /* == 20 */ + BIGNUM *g; + BIGNUM *pub_key; /* y public key */ + BIGNUM *priv_key; /* x private key */ + BIGNUM *kinv; /* Signing pre-calc */ + BIGNUM *r; /* Signing pre-calc */ + int flags; + /* Normally used to cache montgomery values */ + BN_MONT_CTX *method_mont_p; + int references; + CRYPTO_EX_DATA ex_data; + const DSA_METHOD *meth; + /* functional reference if 'meth' is ENGINE-provided */ + ENGINE *engine; +}; + +# define d2i_DSAparams_fp(fp,x) (DSA *)ASN1_d2i_fp((char *(*)())DSA_new, \ + (char *(*)())d2i_DSAparams,(fp),(unsigned char **)(x)) +# define i2d_DSAparams_fp(fp,x) ASN1_i2d_fp(i2d_DSAparams,(fp), \ + (unsigned char *)(x)) +# define d2i_DSAparams_bio(bp,x) ASN1_d2i_bio_of(DSA,DSA_new,d2i_DSAparams,bp,x) +# define i2d_DSAparams_bio(bp,x) ASN1_i2d_bio_of_const(DSA,i2d_DSAparams,bp,x) + +DSA *DSAparams_dup(DSA *x); +DSA_SIG *DSA_SIG_new(void); +void DSA_SIG_free(DSA_SIG *a); +int i2d_DSA_SIG(const DSA_SIG *a, unsigned char **pp); +DSA_SIG *d2i_DSA_SIG(DSA_SIG **v, const unsigned char **pp, long length); + +DSA_SIG *DSA_do_sign(const unsigned char *dgst, int dlen, DSA *dsa); +int DSA_do_verify(const unsigned char *dgst, int dgst_len, + DSA_SIG *sig, DSA *dsa); + +const DSA_METHOD *DSA_OpenSSL(void); + +void DSA_set_default_method(const DSA_METHOD *); +const DSA_METHOD *DSA_get_default_method(void); +int DSA_set_method(DSA *dsa, const DSA_METHOD *); + +DSA *DSA_new(void); +DSA *DSA_new_method(ENGINE *engine); +void DSA_free(DSA *r); +/* "up" the DSA object's reference count */ +int DSA_up_ref(DSA *r); +int DSA_size(const DSA *); + /* next 4 return -1 on error */ +int DSA_sign_setup(DSA *dsa, BN_CTX *ctx_in, BIGNUM **kinvp, BIGNUM **rp); +int DSA_sign(int type, const unsigned char *dgst, int dlen, + unsigned char *sig, unsigned int *siglen, DSA *dsa); +int DSA_verify(int type, const unsigned char *dgst, int dgst_len, + const unsigned char *sigbuf, int siglen, DSA *dsa); +int DSA_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); +int DSA_set_ex_data(DSA *d, int idx, void *arg); +void *DSA_get_ex_data(DSA *d, int idx); + +DSA *d2i_DSAPublicKey(DSA **a, const unsigned char **pp, long length); +DSA *d2i_DSAPrivateKey(DSA **a, const unsigned char **pp, long length); +DSA *d2i_DSAparams(DSA **a, const unsigned char **pp, long length); + +/* Deprecated version */ +# ifndef OPENSSL_NO_DEPRECATED +DSA *DSA_generate_parameters(int bits, + unsigned char *seed, int seed_len, + int *counter_ret, unsigned long *h_ret, void + (*callback) (int, int, void *), void *cb_arg); +# endif /* !defined(OPENSSL_NO_DEPRECATED) */ + +/* New version */ +int DSA_generate_parameters_ex(DSA *dsa, int bits, + const unsigned char *seed, int seed_len, + int *counter_ret, unsigned long *h_ret, + BN_GENCB *cb); + +int DSA_generate_key(DSA *a); +int i2d_DSAPublicKey(const DSA *a, unsigned char **pp); +int i2d_DSAPrivateKey(const DSA *a, unsigned char **pp); +int i2d_DSAparams(const DSA *a, unsigned char **pp); + +# ifndef OPENSSL_NO_BIO +int DSAparams_print(BIO *bp, const DSA *x); +int DSA_print(BIO *bp, const DSA *x, int off); +# endif +# ifndef OPENSSL_NO_FP_API +int DSAparams_print_fp(FILE *fp, const DSA *x); +int DSA_print_fp(FILE *bp, const DSA *x, int off); +# endif + +# define DSS_prime_checks 50 +/* + * Primality test according to FIPS PUB 186[-1], Appendix 2.1: 50 rounds of + * Rabin-Miller + */ +# define DSA_is_prime(n, callback, cb_arg) \ + BN_is_prime(n, DSS_prime_checks, callback, NULL, cb_arg) + +# ifndef OPENSSL_NO_DH +/* + * Convert DSA structure (key or just parameters) into DH structure (be + * careful to avoid small subgroup attacks when using this!) + */ +DH *DSA_dup_DH(const DSA *r); +# endif + +# define EVP_PKEY_CTX_set_dsa_paramgen_bits(ctx, nbits) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DSA, EVP_PKEY_OP_PARAMGEN, \ + EVP_PKEY_CTRL_DSA_PARAMGEN_BITS, nbits, NULL) + +# define EVP_PKEY_CTRL_DSA_PARAMGEN_BITS (EVP_PKEY_ALG_CTRL + 1) +# define EVP_PKEY_CTRL_DSA_PARAMGEN_Q_BITS (EVP_PKEY_ALG_CTRL + 2) +# define EVP_PKEY_CTRL_DSA_PARAMGEN_MD (EVP_PKEY_ALG_CTRL + 3) + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_DSA_strings(void); + +/* Error codes for the DSA functions. */ + +/* Function codes. */ +# define DSA_F_D2I_DSA_SIG 110 +# define DSA_F_DO_DSA_PRINT 104 +# define DSA_F_DSAPARAMS_PRINT 100 +# define DSA_F_DSAPARAMS_PRINT_FP 101 +# define DSA_F_DSA_BUILTIN_PARAMGEN2 126 +# define DSA_F_DSA_DO_SIGN 112 +# define DSA_F_DSA_DO_VERIFY 113 +# define DSA_F_DSA_GENERATE_KEY 124 +# define DSA_F_DSA_GENERATE_PARAMETERS_EX 123 +# define DSA_F_DSA_NEW_METHOD 103 +# define DSA_F_DSA_PARAM_DECODE 119 +# define DSA_F_DSA_PRINT_FP 105 +# define DSA_F_DSA_PRIV_DECODE 115 +# define DSA_F_DSA_PRIV_ENCODE 116 +# define DSA_F_DSA_PUB_DECODE 117 +# define DSA_F_DSA_PUB_ENCODE 118 +# define DSA_F_DSA_SIGN 106 +# define DSA_F_DSA_SIGN_SETUP 107 +# define DSA_F_DSA_SIG_NEW 109 +# define DSA_F_DSA_SIG_PRINT 125 +# define DSA_F_DSA_VERIFY 108 +# define DSA_F_I2D_DSA_SIG 111 +# define DSA_F_OLD_DSA_PRIV_DECODE 122 +# define DSA_F_PKEY_DSA_CTRL 120 +# define DSA_F_PKEY_DSA_KEYGEN 121 +# define DSA_F_SIG_CB 114 + +/* Reason codes. */ +# define DSA_R_BAD_Q_VALUE 102 +# define DSA_R_BN_DECODE_ERROR 108 +# define DSA_R_BN_ERROR 109 +# define DSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE 100 +# define DSA_R_DECODE_ERROR 104 +# define DSA_R_INVALID_DIGEST_TYPE 106 +# define DSA_R_INVALID_PARAMETERS 112 +# define DSA_R_MISSING_PARAMETERS 101 +# define DSA_R_MODULUS_TOO_LARGE 103 +# define DSA_R_NEED_NEW_SETUP_VALUES 110 +# define DSA_R_NON_FIPS_DSA_METHOD 111 +# define DSA_R_NO_PARAMETERS_SET 107 +# define DSA_R_PARAMETER_ENCODING_ERROR 105 +# define DSA_R_Q_NOT_PRIME 113 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/dso.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/dso.h new file mode 100644 index 0000000..c9013f5 --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/dso.h @@ -0,0 +1,451 @@ +/* dso.h */ +/* + * Written by Geoff Thorpe (geoff@geoffthorpe.net) for the OpenSSL project + * 2000. + */ +/* ==================================================================== + * Copyright (c) 2000 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_DSO_H +# define HEADER_DSO_H + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* These values are used as commands to DSO_ctrl() */ +# define DSO_CTRL_GET_FLAGS 1 +# define DSO_CTRL_SET_FLAGS 2 +# define DSO_CTRL_OR_FLAGS 3 + +/* + * By default, DSO_load() will translate the provided filename into a form + * typical for the platform (more specifically the DSO_METHOD) using the + * dso_name_converter function of the method. Eg. win32 will transform "blah" + * into "blah.dll", and dlfcn will transform it into "libblah.so". The + * behaviour can be overriden by setting the name_converter callback in the + * DSO object (using DSO_set_name_converter()). This callback could even + * utilise the DSO_METHOD's converter too if it only wants to override + * behaviour for one or two possible DSO methods. However, the following flag + * can be set in a DSO to prevent *any* native name-translation at all - eg. + * if the caller has prompted the user for a path to a driver library so the + * filename should be interpreted as-is. + */ +# define DSO_FLAG_NO_NAME_TRANSLATION 0x01 +/* + * An extra flag to give if only the extension should be added as + * translation. This is obviously only of importance on Unix and other + * operating systems where the translation also may prefix the name with + * something, like 'lib', and ignored everywhere else. This flag is also + * ignored if DSO_FLAG_NO_NAME_TRANSLATION is used at the same time. + */ +# define DSO_FLAG_NAME_TRANSLATION_EXT_ONLY 0x02 + +/* + * The following flag controls the translation of symbol names to upper case. + * This is currently only being implemented for OpenVMS. + */ +# define DSO_FLAG_UPCASE_SYMBOL 0x10 + +/* + * This flag loads the library with public symbols. Meaning: The exported + * symbols of this library are public to all libraries loaded after this + * library. At the moment only implemented in unix. + */ +# define DSO_FLAG_GLOBAL_SYMBOLS 0x20 + +typedef void (*DSO_FUNC_TYPE) (void); + +typedef struct dso_st DSO; + +/* + * The function prototype used for method functions (or caller-provided + * callbacks) that transform filenames. They are passed a DSO structure + * pointer (or NULL if they are to be used independantly of a DSO object) and + * a filename to transform. They should either return NULL (if there is an + * error condition) or a newly allocated string containing the transformed + * form that the caller will need to free with OPENSSL_free() when done. + */ +typedef char *(*DSO_NAME_CONVERTER_FUNC)(DSO *, const char *); +/* + * The function prototype used for method functions (or caller-provided + * callbacks) that merge two file specifications. They are passed a DSO + * structure pointer (or NULL if they are to be used independantly of a DSO + * object) and two file specifications to merge. They should either return + * NULL (if there is an error condition) or a newly allocated string + * containing the result of merging that the caller will need to free with + * OPENSSL_free() when done. Here, merging means that bits and pieces are + * taken from each of the file specifications and added together in whatever + * fashion that is sensible for the DSO method in question. The only rule + * that really applies is that if the two specification contain pieces of the + * same type, the copy from the first string takes priority. One could see + * it as the first specification is the one given by the user and the second + * being a bunch of defaults to add on if they're missing in the first. + */ +typedef char *(*DSO_MERGER_FUNC)(DSO *, const char *, const char *); + +typedef struct dso_meth_st { + const char *name; + /* + * Loads a shared library, NB: new DSO_METHODs must ensure that a + * successful load populates the loaded_filename field, and likewise a + * successful unload OPENSSL_frees and NULLs it out. + */ + int (*dso_load) (DSO *dso); + /* Unloads a shared library */ + int (*dso_unload) (DSO *dso); + /* Binds a variable */ + void *(*dso_bind_var) (DSO *dso, const char *symname); + /* + * Binds a function - assumes a return type of DSO_FUNC_TYPE. This should + * be cast to the real function prototype by the caller. Platforms that + * don't have compatible representations for different prototypes (this + * is possible within ANSI C) are highly unlikely to have shared + * libraries at all, let alone a DSO_METHOD implemented for them. + */ + DSO_FUNC_TYPE (*dso_bind_func) (DSO *dso, const char *symname); +/* I don't think this would actually be used in any circumstances. */ +# if 0 + /* Unbinds a variable */ + int (*dso_unbind_var) (DSO *dso, char *symname, void *symptr); + /* Unbinds a function */ + int (*dso_unbind_func) (DSO *dso, char *symname, DSO_FUNC_TYPE symptr); +# endif + /* + * The generic (yuck) "ctrl()" function. NB: Negative return values + * (rather than zero) indicate errors. + */ + long (*dso_ctrl) (DSO *dso, int cmd, long larg, void *parg); + /* + * The default DSO_METHOD-specific function for converting filenames to a + * canonical native form. + */ + DSO_NAME_CONVERTER_FUNC dso_name_converter; + /* + * The default DSO_METHOD-specific function for converting filenames to a + * canonical native form. + */ + DSO_MERGER_FUNC dso_merger; + /* [De]Initialisation handlers. */ + int (*init) (DSO *dso); + int (*finish) (DSO *dso); + /* Return pathname of the module containing location */ + int (*pathbyaddr) (void *addr, char *path, int sz); + /* Perform global symbol lookup, i.e. among *all* modules */ + void *(*globallookup) (const char *symname); +} DSO_METHOD; + +/**********************************************************************/ +/* The low-level handle type used to refer to a loaded shared library */ + +struct dso_st { + DSO_METHOD *meth; + /* + * Standard dlopen uses a (void *). Win32 uses a HANDLE. VMS doesn't use + * anything but will need to cache the filename for use in the dso_bind + * handler. All in all, let each method control its own destiny. + * "Handles" and such go in a STACK. + */ + STACK_OF(void) *meth_data; + int references; + int flags; + /* + * For use by applications etc ... use this for your bits'n'pieces, don't + * touch meth_data! + */ + CRYPTO_EX_DATA ex_data; + /* + * If this callback function pointer is set to non-NULL, then it will be + * used in DSO_load() in place of meth->dso_name_converter. NB: This + * should normally set using DSO_set_name_converter(). + */ + DSO_NAME_CONVERTER_FUNC name_converter; + /* + * If this callback function pointer is set to non-NULL, then it will be + * used in DSO_load() in place of meth->dso_merger. NB: This should + * normally set using DSO_set_merger(). + */ + DSO_MERGER_FUNC merger; + /* + * This is populated with (a copy of) the platform-independant filename + * used for this DSO. + */ + char *filename; + /* + * This is populated with (a copy of) the translated filename by which + * the DSO was actually loaded. It is NULL iff the DSO is not currently + * loaded. NB: This is here because the filename translation process may + * involve a callback being invoked more than once not only to convert to + * a platform-specific form, but also to try different filenames in the + * process of trying to perform a load. As such, this variable can be + * used to indicate (a) whether this DSO structure corresponds to a + * loaded library or not, and (b) the filename with which it was actually + * loaded. + */ + char *loaded_filename; +}; + +DSO *DSO_new(void); +DSO *DSO_new_method(DSO_METHOD *method); +int DSO_free(DSO *dso); +int DSO_flags(DSO *dso); +int DSO_up_ref(DSO *dso); +long DSO_ctrl(DSO *dso, int cmd, long larg, void *parg); + +/* + * This function sets the DSO's name_converter callback. If it is non-NULL, + * then it will be used instead of the associated DSO_METHOD's function. If + * oldcb is non-NULL then it is set to the function pointer value being + * replaced. Return value is non-zero for success. + */ +int DSO_set_name_converter(DSO *dso, DSO_NAME_CONVERTER_FUNC cb, + DSO_NAME_CONVERTER_FUNC *oldcb); +/* + * These functions can be used to get/set the platform-independant filename + * used for a DSO. NB: set will fail if the DSO is already loaded. + */ +const char *DSO_get_filename(DSO *dso); +int DSO_set_filename(DSO *dso, const char *filename); +/* + * This function will invoke the DSO's name_converter callback to translate a + * filename, or if the callback isn't set it will instead use the DSO_METHOD's + * converter. If "filename" is NULL, the "filename" in the DSO itself will be + * used. If the DSO_FLAG_NO_NAME_TRANSLATION flag is set, then the filename is + * simply duplicated. NB: This function is usually called from within a + * DSO_METHOD during the processing of a DSO_load() call, and is exposed so + * that caller-created DSO_METHODs can do the same thing. A non-NULL return + * value will need to be OPENSSL_free()'d. + */ +char *DSO_convert_filename(DSO *dso, const char *filename); +/* + * This function will invoke the DSO's merger callback to merge two file + * specifications, or if the callback isn't set it will instead use the + * DSO_METHOD's merger. A non-NULL return value will need to be + * OPENSSL_free()'d. + */ +char *DSO_merge(DSO *dso, const char *filespec1, const char *filespec2); +/* + * If the DSO is currently loaded, this returns the filename that it was + * loaded under, otherwise it returns NULL. So it is also useful as a test as + * to whether the DSO is currently loaded. NB: This will not necessarily + * return the same value as DSO_convert_filename(dso, dso->filename), because + * the DSO_METHOD's load function may have tried a variety of filenames (with + * and/or without the aid of the converters) before settling on the one it + * actually loaded. + */ +const char *DSO_get_loaded_filename(DSO *dso); + +void DSO_set_default_method(DSO_METHOD *meth); +DSO_METHOD *DSO_get_default_method(void); +DSO_METHOD *DSO_get_method(DSO *dso); +DSO_METHOD *DSO_set_method(DSO *dso, DSO_METHOD *meth); + +/* + * The all-singing all-dancing load function, you normally pass NULL for the + * first and third parameters. Use DSO_up and DSO_free for subsequent + * reference count handling. Any flags passed in will be set in the + * constructed DSO after its init() function but before the load operation. + * If 'dso' is non-NULL, 'flags' is ignored. + */ +DSO *DSO_load(DSO *dso, const char *filename, DSO_METHOD *meth, int flags); + +/* This function binds to a variable inside a shared library. */ +void *DSO_bind_var(DSO *dso, const char *symname); + +/* This function binds to a function inside a shared library. */ +DSO_FUNC_TYPE DSO_bind_func(DSO *dso, const char *symname); + +/* + * This method is the default, but will beg, borrow, or steal whatever method + * should be the default on any particular platform (including + * DSO_METH_null() if necessary). + */ +DSO_METHOD *DSO_METHOD_openssl(void); + +/* + * This method is defined for all platforms - if a platform has no DSO + * support then this will be the only method! + */ +DSO_METHOD *DSO_METHOD_null(void); + +/* + * If DSO_DLFCN is defined, the standard dlfcn.h-style functions (dlopen, + * dlclose, dlsym, etc) will be used and incorporated into this method. If + * not, this method will return NULL. + */ +DSO_METHOD *DSO_METHOD_dlfcn(void); + +/* + * If DSO_DL is defined, the standard dl.h-style functions (shl_load, + * shl_unload, shl_findsym, etc) will be used and incorporated into this + * method. If not, this method will return NULL. + */ +DSO_METHOD *DSO_METHOD_dl(void); + +/* If WIN32 is defined, use DLLs. If not, return NULL. */ +DSO_METHOD *DSO_METHOD_win32(void); + +/* If VMS is defined, use shared images. If not, return NULL. */ +DSO_METHOD *DSO_METHOD_vms(void); + +/* + * This function writes null-terminated pathname of DSO module containing + * 'addr' into 'sz' large caller-provided 'path' and returns the number of + * characters [including trailing zero] written to it. If 'sz' is 0 or + * negative, 'path' is ignored and required amount of charachers [including + * trailing zero] to accomodate pathname is returned. If 'addr' is NULL, then + * pathname of cryptolib itself is returned. Negative or zero return value + * denotes error. + */ +int DSO_pathbyaddr(void *addr, char *path, int sz); + +/* + * This function should be used with caution! It looks up symbols in *all* + * loaded modules and if module gets unloaded by somebody else attempt to + * dereference the pointer is doomed to have fatal consequences. Primary + * usage for this function is to probe *core* system functionality, e.g. + * check if getnameinfo(3) is available at run-time without bothering about + * OS-specific details such as libc.so.versioning or where does it actually + * reside: in libc itself or libsocket. + */ +void *DSO_global_lookup(const char *name); + +/* If BeOS is defined, use shared images. If not, return NULL. */ +DSO_METHOD *DSO_METHOD_beos(void); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_DSO_strings(void); + +/* Error codes for the DSO functions. */ + +/* Function codes. */ +# define DSO_F_BEOS_BIND_FUNC 144 +# define DSO_F_BEOS_BIND_VAR 145 +# define DSO_F_BEOS_LOAD 146 +# define DSO_F_BEOS_NAME_CONVERTER 147 +# define DSO_F_BEOS_UNLOAD 148 +# define DSO_F_DLFCN_BIND_FUNC 100 +# define DSO_F_DLFCN_BIND_VAR 101 +# define DSO_F_DLFCN_LOAD 102 +# define DSO_F_DLFCN_MERGER 130 +# define DSO_F_DLFCN_NAME_CONVERTER 123 +# define DSO_F_DLFCN_UNLOAD 103 +# define DSO_F_DL_BIND_FUNC 104 +# define DSO_F_DL_BIND_VAR 105 +# define DSO_F_DL_LOAD 106 +# define DSO_F_DL_MERGER 131 +# define DSO_F_DL_NAME_CONVERTER 124 +# define DSO_F_DL_UNLOAD 107 +# define DSO_F_DSO_BIND_FUNC 108 +# define DSO_F_DSO_BIND_VAR 109 +# define DSO_F_DSO_CONVERT_FILENAME 126 +# define DSO_F_DSO_CTRL 110 +# define DSO_F_DSO_FREE 111 +# define DSO_F_DSO_GET_FILENAME 127 +# define DSO_F_DSO_GET_LOADED_FILENAME 128 +# define DSO_F_DSO_GLOBAL_LOOKUP 139 +# define DSO_F_DSO_LOAD 112 +# define DSO_F_DSO_MERGE 132 +# define DSO_F_DSO_NEW_METHOD 113 +# define DSO_F_DSO_PATHBYADDR 140 +# define DSO_F_DSO_SET_FILENAME 129 +# define DSO_F_DSO_SET_NAME_CONVERTER 122 +# define DSO_F_DSO_UP_REF 114 +# define DSO_F_GLOBAL_LOOKUP_FUNC 138 +# define DSO_F_PATHBYADDR 137 +# define DSO_F_VMS_BIND_SYM 115 +# define DSO_F_VMS_LOAD 116 +# define DSO_F_VMS_MERGER 133 +# define DSO_F_VMS_UNLOAD 117 +# define DSO_F_WIN32_BIND_FUNC 118 +# define DSO_F_WIN32_BIND_VAR 119 +# define DSO_F_WIN32_GLOBALLOOKUP 142 +# define DSO_F_WIN32_GLOBALLOOKUP_FUNC 143 +# define DSO_F_WIN32_JOINER 135 +# define DSO_F_WIN32_LOAD 120 +# define DSO_F_WIN32_MERGER 134 +# define DSO_F_WIN32_NAME_CONVERTER 125 +# define DSO_F_WIN32_PATHBYADDR 141 +# define DSO_F_WIN32_SPLITTER 136 +# define DSO_F_WIN32_UNLOAD 121 + +/* Reason codes. */ +# define DSO_R_CTRL_FAILED 100 +# define DSO_R_DSO_ALREADY_LOADED 110 +# define DSO_R_EMPTY_FILE_STRUCTURE 113 +# define DSO_R_FAILURE 114 +# define DSO_R_FILENAME_TOO_BIG 101 +# define DSO_R_FINISH_FAILED 102 +# define DSO_R_INCORRECT_FILE_SYNTAX 115 +# define DSO_R_LOAD_FAILED 103 +# define DSO_R_NAME_TRANSLATION_FAILED 109 +# define DSO_R_NO_FILENAME 111 +# define DSO_R_NO_FILE_SPECIFICATION 116 +# define DSO_R_NULL_HANDLE 104 +# define DSO_R_SET_FILENAME_FAILED 112 +# define DSO_R_STACK_ERROR 105 +# define DSO_R_SYM_FAILURE 106 +# define DSO_R_UNLOAD_FAILED 107 +# define DSO_R_UNSUPPORTED 108 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/dtls1.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/dtls1.h new file mode 100644 index 0000000..30bbcf2 --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/dtls1.h @@ -0,0 +1,272 @@ +/* ssl/dtls1.h */ +/* + * DTLS implementation written by Nagendra Modadugu + * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. + */ +/* ==================================================================== + * Copyright (c) 1999-2005 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_DTLS1_H +# define HEADER_DTLS1_H + +# include +# include +# ifdef OPENSSL_SYS_VMS +# include +# include +# endif +# ifdef OPENSSL_SYS_WIN32 +/* Needed for struct timeval */ +# include +# elif defined(OPENSSL_SYS_NETWARE) && !defined(_WINSOCK2API_) +# include +# else +# if defined(OPENSSL_SYS_VXWORKS) +# include +# else +# include +# endif +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +# define DTLS1_VERSION 0xFEFF +# define DTLS1_2_VERSION 0xFEFD +# define DTLS_MAX_VERSION DTLS1_2_VERSION +# define DTLS1_VERSION_MAJOR 0xFE + +# define DTLS1_BAD_VER 0x0100 + +/* Special value for method supporting multiple versions */ +# define DTLS_ANY_VERSION 0x1FFFF + +# if 0 +/* this alert description is not specified anywhere... */ +# define DTLS1_AD_MISSING_HANDSHAKE_MESSAGE 110 +# endif + +/* lengths of messages */ +# define DTLS1_COOKIE_LENGTH 256 + +# define DTLS1_RT_HEADER_LENGTH 13 + +# define DTLS1_HM_HEADER_LENGTH 12 + +# define DTLS1_HM_BAD_FRAGMENT -2 +# define DTLS1_HM_FRAGMENT_RETRY -3 + +# define DTLS1_CCS_HEADER_LENGTH 1 + +# ifdef DTLS1_AD_MISSING_HANDSHAKE_MESSAGE +# define DTLS1_AL_HEADER_LENGTH 7 +# else +# define DTLS1_AL_HEADER_LENGTH 2 +# endif + +# ifndef OPENSSL_NO_SSL_INTERN + +# ifndef OPENSSL_NO_SCTP +# define DTLS1_SCTP_AUTH_LABEL "EXPORTER_DTLS_OVER_SCTP" +# endif + +/* Max MTU overhead we know about so far is 40 for IPv6 + 8 for UDP */ +# define DTLS1_MAX_MTU_OVERHEAD 48 + +typedef struct dtls1_bitmap_st { + unsigned long map; /* track 32 packets on 32-bit systems and 64 + * - on 64-bit systems */ + unsigned char max_seq_num[8]; /* max record number seen so far, 64-bit + * value in big-endian encoding */ +} DTLS1_BITMAP; + +struct dtls1_retransmit_state { + EVP_CIPHER_CTX *enc_write_ctx; /* cryptographic state */ + EVP_MD_CTX *write_hash; /* used for mac generation */ +# ifndef OPENSSL_NO_COMP + COMP_CTX *compress; /* compression */ +# else + char *compress; +# endif + SSL_SESSION *session; + unsigned short epoch; +}; + +struct hm_header_st { + unsigned char type; + unsigned long msg_len; + unsigned short seq; + unsigned long frag_off; + unsigned long frag_len; + unsigned int is_ccs; + struct dtls1_retransmit_state saved_retransmit_state; +}; + +struct ccs_header_st { + unsigned char type; + unsigned short seq; +}; + +struct dtls1_timeout_st { + /* Number of read timeouts so far */ + unsigned int read_timeouts; + /* Number of write timeouts so far */ + unsigned int write_timeouts; + /* Number of alerts received so far */ + unsigned int num_alerts; +}; + +typedef struct record_pqueue_st { + unsigned short epoch; + pqueue q; +} record_pqueue; + +typedef struct hm_fragment_st { + struct hm_header_st msg_header; + unsigned char *fragment; + unsigned char *reassembly; +} hm_fragment; + +typedef struct dtls1_state_st { + unsigned int send_cookie; + unsigned char cookie[DTLS1_COOKIE_LENGTH]; + unsigned char rcvd_cookie[DTLS1_COOKIE_LENGTH]; + unsigned int cookie_len; + /* + * The current data and handshake epoch. This is initially + * undefined, and starts at zero once the initial handshake is + * completed + */ + unsigned short r_epoch; + unsigned short w_epoch; + /* records being received in the current epoch */ + DTLS1_BITMAP bitmap; + /* renegotiation starts a new set of sequence numbers */ + DTLS1_BITMAP next_bitmap; + /* handshake message numbers */ + unsigned short handshake_write_seq; + unsigned short next_handshake_write_seq; + unsigned short handshake_read_seq; + /* save last sequence number for retransmissions */ + unsigned char last_write_sequence[8]; + /* Received handshake records (processed and unprocessed) */ + record_pqueue unprocessed_rcds; + record_pqueue processed_rcds; + /* Buffered handshake messages */ + pqueue buffered_messages; + /* Buffered (sent) handshake records */ + pqueue sent_messages; + /* + * Buffered application records. Only for records between CCS and + * Finished to prevent either protocol violation or unnecessary message + * loss. + */ + record_pqueue buffered_app_data; + /* Is set when listening for new connections with dtls1_listen() */ + unsigned int listen; + unsigned int link_mtu; /* max on-the-wire DTLS packet size */ + unsigned int mtu; /* max DTLS packet size */ + struct hm_header_st w_msg_hdr; + struct hm_header_st r_msg_hdr; + struct dtls1_timeout_st timeout; + /* + * Indicates when the last handshake msg or heartbeat sent will timeout + */ + struct timeval next_timeout; + /* Timeout duration */ + unsigned short timeout_duration; + /* + * storage for Alert/Handshake protocol data received but not yet + * processed by ssl3_read_bytes: + */ + unsigned char alert_fragment[DTLS1_AL_HEADER_LENGTH]; + unsigned int alert_fragment_len; + unsigned char handshake_fragment[DTLS1_HM_HEADER_LENGTH]; + unsigned int handshake_fragment_len; + unsigned int retransmitting; + /* + * Set when the handshake is ready to process peer's ChangeCipherSpec message. + * Cleared after the message has been processed. + */ + unsigned int change_cipher_spec_ok; +# ifndef OPENSSL_NO_SCTP + /* used when SSL_ST_XX_FLUSH is entered */ + int next_state; + int shutdown_received; +# endif +} DTLS1_STATE; + +typedef struct dtls1_record_data_st { + unsigned char *packet; + unsigned int packet_length; + SSL3_BUFFER rbuf; + SSL3_RECORD rrec; +# ifndef OPENSSL_NO_SCTP + struct bio_dgram_sctp_rcvinfo recordinfo; +# endif +} DTLS1_RECORD_DATA; + +# endif + +/* Timeout multipliers (timeout slice is defined in apps/timeouts.h */ +# define DTLS1_TMO_READ_COUNT 2 +# define DTLS1_TMO_WRITE_COUNT 2 + +# define DTLS1_TMO_ALERT_COUNT 12 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/e_os2.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/e_os2.h new file mode 100644 index 0000000..7be9989 --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/e_os2.h @@ -0,0 +1,328 @@ +/* e_os2.h */ +/* ==================================================================== + * Copyright (c) 1998-2000 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#include + +#ifndef HEADER_E_OS2_H +# define HEADER_E_OS2_H + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************************************************** + * Detect operating systems. This probably needs completing. + * The result is that at least one OPENSSL_SYS_os macro should be defined. + * However, if none is defined, Unix is assumed. + **/ + +# define OPENSSL_SYS_UNIX + +/* ---------------------- Macintosh, before MacOS X ----------------------- */ +# if defined(__MWERKS__) && defined(macintosh) || defined(OPENSSL_SYSNAME_MAC) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_MACINTOSH_CLASSIC +# endif + +/* ---------------------- NetWare ----------------------------------------- */ +# if defined(NETWARE) || defined(OPENSSL_SYSNAME_NETWARE) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_NETWARE +# endif + +/* --------------------- Microsoft operating systems ---------------------- */ + +/* + * Note that MSDOS actually denotes 32-bit environments running on top of + * MS-DOS, such as DJGPP one. + */ +# if defined(OPENSSL_SYSNAME_MSDOS) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_MSDOS +# endif + +/* + * For 32 bit environment, there seems to be the CygWin environment and then + * all the others that try to do the same thing Microsoft does... + */ +# if defined(OPENSSL_SYSNAME_UWIN) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_WIN32_UWIN +# else +# if defined(__CYGWIN__) || defined(OPENSSL_SYSNAME_CYGWIN) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_WIN32_CYGWIN +# else +# if defined(_WIN32) || defined(OPENSSL_SYSNAME_WIN32) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_WIN32 +# endif +# if defined(_WIN64) || defined(OPENSSL_SYSNAME_WIN64) +# undef OPENSSL_SYS_UNIX +# if !defined(OPENSSL_SYS_WIN64) +# define OPENSSL_SYS_WIN64 +# endif +# endif +# if defined(OPENSSL_SYSNAME_WINNT) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_WINNT +# endif +# if defined(OPENSSL_SYSNAME_WINCE) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_WINCE +# endif +# endif +# endif + +/* Anything that tries to look like Microsoft is "Windows" */ +# if defined(OPENSSL_SYS_WIN32) || defined(OPENSSL_SYS_WIN64) || defined(OPENSSL_SYS_WINNT) || defined(OPENSSL_SYS_WINCE) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_WINDOWS +# ifndef OPENSSL_SYS_MSDOS +# define OPENSSL_SYS_MSDOS +# endif +# endif + +/* + * DLL settings. This part is a bit tough, because it's up to the + * application implementor how he or she will link the application, so it + * requires some macro to be used. + */ +# ifdef OPENSSL_SYS_WINDOWS +# ifndef OPENSSL_OPT_WINDLL +# if defined(_WINDLL) /* This is used when building OpenSSL to + * indicate that DLL linkage should be used */ +# define OPENSSL_OPT_WINDLL +# endif +# endif +# endif + +/* ------------------------------- OpenVMS -------------------------------- */ +# if defined(__VMS) || defined(VMS) || defined(OPENSSL_SYSNAME_VMS) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_VMS +# if defined(__DECC) +# define OPENSSL_SYS_VMS_DECC +# elif defined(__DECCXX) +# define OPENSSL_SYS_VMS_DECC +# define OPENSSL_SYS_VMS_DECCXX +# else +# define OPENSSL_SYS_VMS_NODECC +# endif +# endif + +/* -------------------------------- OS/2 ---------------------------------- */ +# if defined(__EMX__) || defined(__OS2__) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_OS2 +# endif + +/* -------------------------------- Unix ---------------------------------- */ +# ifdef OPENSSL_SYS_UNIX +# if defined(linux) || defined(__linux__) || defined(OPENSSL_SYSNAME_LINUX) +# define OPENSSL_SYS_LINUX +# endif +# ifdef OPENSSL_SYSNAME_MPE +# define OPENSSL_SYS_MPE +# endif +# ifdef OPENSSL_SYSNAME_SNI +# define OPENSSL_SYS_SNI +# endif +# ifdef OPENSSL_SYSNAME_ULTRASPARC +# define OPENSSL_SYS_ULTRASPARC +# endif +# ifdef OPENSSL_SYSNAME_NEWS4 +# define OPENSSL_SYS_NEWS4 +# endif +# ifdef OPENSSL_SYSNAME_MACOSX +# define OPENSSL_SYS_MACOSX +# endif +# ifdef OPENSSL_SYSNAME_MACOSX_RHAPSODY +# define OPENSSL_SYS_MACOSX_RHAPSODY +# define OPENSSL_SYS_MACOSX +# endif +# ifdef OPENSSL_SYSNAME_SUNOS +# define OPENSSL_SYS_SUNOS +# endif +# if defined(_CRAY) || defined(OPENSSL_SYSNAME_CRAY) +# define OPENSSL_SYS_CRAY +# endif +# if defined(_AIX) || defined(OPENSSL_SYSNAME_AIX) +# define OPENSSL_SYS_AIX +# endif +# endif + +/* -------------------------------- VOS ----------------------------------- */ +# if defined(__VOS__) || defined(OPENSSL_SYSNAME_VOS) +# define OPENSSL_SYS_VOS +# ifdef __HPPA__ +# define OPENSSL_SYS_VOS_HPPA +# endif +# ifdef __IA32__ +# define OPENSSL_SYS_VOS_IA32 +# endif +# endif + +/* ------------------------------ VxWorks --------------------------------- */ +# ifdef OPENSSL_SYSNAME_VXWORKS +# define OPENSSL_SYS_VXWORKS +# endif + +/* -------------------------------- BeOS ---------------------------------- */ +# if defined(__BEOS__) +# define OPENSSL_SYS_BEOS +# include +# if defined(BONE_VERSION) +# define OPENSSL_SYS_BEOS_BONE +# else +# define OPENSSL_SYS_BEOS_R5 +# endif +# endif + +/** + * That's it for OS-specific stuff + *****************************************************************************/ + +/* Specials for I/O an exit */ +# ifdef OPENSSL_SYS_MSDOS +# define OPENSSL_UNISTD_IO +# define OPENSSL_DECLARE_EXIT extern void exit(int); +# else +# define OPENSSL_UNISTD_IO OPENSSL_UNISTD +# define OPENSSL_DECLARE_EXIT /* declared in unistd.h */ +# endif + +/*- + * Definitions of OPENSSL_GLOBAL and OPENSSL_EXTERN, to define and declare + * certain global symbols that, with some compilers under VMS, have to be + * defined and declared explicitely with globaldef and globalref. + * Definitions of OPENSSL_EXPORT and OPENSSL_IMPORT, to define and declare + * DLL exports and imports for compilers under Win32. These are a little + * more complicated to use. Basically, for any library that exports some + * global variables, the following code must be present in the header file + * that declares them, before OPENSSL_EXTERN is used: + * + * #ifdef SOME_BUILD_FLAG_MACRO + * # undef OPENSSL_EXTERN + * # define OPENSSL_EXTERN OPENSSL_EXPORT + * #endif + * + * The default is to have OPENSSL_EXPORT, OPENSSL_IMPORT and OPENSSL_GLOBAL + * have some generally sensible values, and for OPENSSL_EXTERN to have the + * value OPENSSL_IMPORT. + */ + +# if defined(OPENSSL_SYS_VMS_NODECC) +# define OPENSSL_EXPORT globalref +# define OPENSSL_IMPORT globalref +# define OPENSSL_GLOBAL globaldef +# elif defined(OPENSSL_SYS_WINDOWS) && defined(OPENSSL_OPT_WINDLL) +# define OPENSSL_EXPORT extern __declspec(dllexport) +# define OPENSSL_IMPORT extern __declspec(dllimport) +# define OPENSSL_GLOBAL +# else +# define OPENSSL_EXPORT extern +# define OPENSSL_IMPORT extern +# define OPENSSL_GLOBAL +# endif +# define OPENSSL_EXTERN OPENSSL_IMPORT + +/*- + * Macros to allow global variables to be reached through function calls when + * required (if a shared library version requires it, for example. + * The way it's done allows definitions like this: + * + * // in foobar.c + * OPENSSL_IMPLEMENT_GLOBAL(int,foobar,0) + * // in foobar.h + * OPENSSL_DECLARE_GLOBAL(int,foobar); + * #define foobar OPENSSL_GLOBAL_REF(foobar) + */ +# ifdef OPENSSL_EXPORT_VAR_AS_FUNCTION +# define OPENSSL_IMPLEMENT_GLOBAL(type,name,value) \ + type *_shadow_##name(void) \ + { static type _hide_##name=value; return &_hide_##name; } +# define OPENSSL_DECLARE_GLOBAL(type,name) type *_shadow_##name(void) +# define OPENSSL_GLOBAL_REF(name) (*(_shadow_##name())) +# else +# define OPENSSL_IMPLEMENT_GLOBAL(type,name,value) OPENSSL_GLOBAL type _shadow_##name=value; +# define OPENSSL_DECLARE_GLOBAL(type,name) OPENSSL_EXPORT type _shadow_##name +# define OPENSSL_GLOBAL_REF(name) _shadow_##name +# endif + +# if defined(OPENSSL_SYS_MACINTOSH_CLASSIC) && macintosh==1 && !defined(MAC_OS_GUSI_SOURCE) +# define ossl_ssize_t long +# endif + +# ifdef OPENSSL_SYS_MSDOS +# define ossl_ssize_t long +# endif + +# if defined(NeXT) || defined(OPENSSL_SYS_NEWS4) || defined(OPENSSL_SYS_SUNOS) +# define ssize_t int +# endif + +# if defined(__ultrix) && !defined(ssize_t) +# define ossl_ssize_t int +# endif + +# ifndef ossl_ssize_t +# define ossl_ssize_t ssize_t +# endif + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/ebcdic.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/ebcdic.h new file mode 100644 index 0000000..4cbdfeb --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/ebcdic.h @@ -0,0 +1,26 @@ +/* crypto/ebcdic.h */ + +#ifndef HEADER_EBCDIC_H +# define HEADER_EBCDIC_H + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Avoid name clashes with other applications */ +# define os_toascii _openssl_os_toascii +# define os_toebcdic _openssl_os_toebcdic +# define ebcdic2ascii _openssl_ebcdic2ascii +# define ascii2ebcdic _openssl_ascii2ebcdic + +extern const unsigned char os_toascii[256]; +extern const unsigned char os_toebcdic[256]; +void *ebcdic2ascii(void *dest, const void *srce, size_t count); +void *ascii2ebcdic(void *dest, const void *srce, size_t count); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/ec.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/ec.h new file mode 100644 index 0000000..81e6faf --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/ec.h @@ -0,0 +1,1282 @@ +/* crypto/ec/ec.h */ +/* + * Originally written by Bodo Moeller for the OpenSSL project. + */ +/** + * \file crypto/ec/ec.h Include file for the OpenSSL EC functions + * \author Originally written by Bodo Moeller for the OpenSSL project + */ +/* ==================================================================== + * Copyright (c) 1998-2005 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * + * Portions of the attached software ("Contribution") are developed by + * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project. + * + * The Contribution is licensed pursuant to the OpenSSL open source + * license provided above. + * + * The elliptic curve binary polynomial software is originally written by + * Sheueling Chang Shantz and Douglas Stebila of Sun Microsystems Laboratories. + * + */ + +#ifndef HEADER_EC_H +# define HEADER_EC_H + +# include + +# ifdef OPENSSL_NO_EC +# error EC is disabled. +# endif + +# include +# include +# ifndef OPENSSL_NO_DEPRECATED +# include +# endif + +# ifdef __cplusplus +extern "C" { +# elif defined(__SUNPRO_C) +# if __SUNPRO_C >= 0x520 +# pragma error_messages (off,E_ARRAY_OF_INCOMPLETE_NONAME,E_ARRAY_OF_INCOMPLETE) +# endif +# endif + +# ifndef OPENSSL_ECC_MAX_FIELD_BITS +# define OPENSSL_ECC_MAX_FIELD_BITS 661 +# endif + +/** Enum for the point conversion form as defined in X9.62 (ECDSA) + * for the encoding of a elliptic curve point (x,y) */ +typedef enum { + /** the point is encoded as z||x, where the octet z specifies + * which solution of the quadratic equation y is */ + POINT_CONVERSION_COMPRESSED = 2, + /** the point is encoded as z||x||y, where z is the octet 0x04 */ + POINT_CONVERSION_UNCOMPRESSED = 4, + /** the point is encoded as z||x||y, where the octet z specifies + * which solution of the quadratic equation y is */ + POINT_CONVERSION_HYBRID = 6 +} point_conversion_form_t; + +typedef struct ec_method_st EC_METHOD; + +typedef struct ec_group_st + /*- + EC_METHOD *meth; + -- field definition + -- curve coefficients + -- optional generator with associated information (order, cofactor) + -- optional extra data (precomputed table for fast computation of multiples of generator) + -- ASN1 stuff + */ + EC_GROUP; + +typedef struct ec_point_st EC_POINT; + +/********************************************************************/ +/* EC_METHODs for curves over GF(p) */ +/********************************************************************/ + +/** Returns the basic GFp ec methods which provides the basis for the + * optimized methods. + * \return EC_METHOD object + */ +const EC_METHOD *EC_GFp_simple_method(void); + +/** Returns GFp methods using montgomery multiplication. + * \return EC_METHOD object + */ +const EC_METHOD *EC_GFp_mont_method(void); + +/** Returns GFp methods using optimized methods for NIST recommended curves + * \return EC_METHOD object + */ +const EC_METHOD *EC_GFp_nist_method(void); + +# ifndef OPENSSL_NO_EC_NISTP_64_GCC_128 +/** Returns 64-bit optimized methods for nistp224 + * \return EC_METHOD object + */ +const EC_METHOD *EC_GFp_nistp224_method(void); + +/** Returns 64-bit optimized methods for nistp256 + * \return EC_METHOD object + */ +const EC_METHOD *EC_GFp_nistp256_method(void); + +/** Returns 64-bit optimized methods for nistp521 + * \return EC_METHOD object + */ +const EC_METHOD *EC_GFp_nistp521_method(void); +# endif + +# ifndef OPENSSL_NO_EC2M +/********************************************************************/ +/* EC_METHOD for curves over GF(2^m) */ +/********************************************************************/ + +/** Returns the basic GF2m ec method + * \return EC_METHOD object + */ +const EC_METHOD *EC_GF2m_simple_method(void); + +# endif + +/********************************************************************/ +/* EC_GROUP functions */ +/********************************************************************/ + +/** Creates a new EC_GROUP object + * \param meth EC_METHOD to use + * \return newly created EC_GROUP object or NULL in case of an error. + */ +EC_GROUP *EC_GROUP_new(const EC_METHOD *meth); + +/** Frees a EC_GROUP object + * \param group EC_GROUP object to be freed. + */ +void EC_GROUP_free(EC_GROUP *group); + +/** Clears and frees a EC_GROUP object + * \param group EC_GROUP object to be cleared and freed. + */ +void EC_GROUP_clear_free(EC_GROUP *group); + +/** Copies EC_GROUP objects. Note: both EC_GROUPs must use the same EC_METHOD. + * \param dst destination EC_GROUP object + * \param src source EC_GROUP object + * \return 1 on success and 0 if an error occurred. + */ +int EC_GROUP_copy(EC_GROUP *dst, const EC_GROUP *src); + +/** Creates a new EC_GROUP object and copies the copies the content + * form src to the newly created EC_KEY object + * \param src source EC_GROUP object + * \return newly created EC_GROUP object or NULL in case of an error. + */ +EC_GROUP *EC_GROUP_dup(const EC_GROUP *src); + +/** Returns the EC_METHOD of the EC_GROUP object. + * \param group EC_GROUP object + * \return EC_METHOD used in this EC_GROUP object. + */ +const EC_METHOD *EC_GROUP_method_of(const EC_GROUP *group); + +/** Returns the field type of the EC_METHOD. + * \param meth EC_METHOD object + * \return NID of the underlying field type OID. + */ +int EC_METHOD_get_field_type(const EC_METHOD *meth); + +/** Sets the generator and it's order/cofactor of a EC_GROUP object. + * \param group EC_GROUP object + * \param generator EC_POINT object with the generator. + * \param order the order of the group generated by the generator. + * \param cofactor the index of the sub-group generated by the generator + * in the group of all points on the elliptic curve. + * \return 1 on success and 0 if an error occured + */ +int EC_GROUP_set_generator(EC_GROUP *group, const EC_POINT *generator, + const BIGNUM *order, const BIGNUM *cofactor); + +/** Returns the generator of a EC_GROUP object. + * \param group EC_GROUP object + * \return the currently used generator (possibly NULL). + */ +const EC_POINT *EC_GROUP_get0_generator(const EC_GROUP *group); + +/** Returns the montgomery data for order(Generator) + * \param group EC_GROUP object + * \return the currently used generator (possibly NULL). +*/ +BN_MONT_CTX *EC_GROUP_get_mont_data(const EC_GROUP *group); + +/** Gets the order of a EC_GROUP + * \param group EC_GROUP object + * \param order BIGNUM to which the order is copied + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_GROUP_get_order(const EC_GROUP *group, BIGNUM *order, BN_CTX *ctx); + +/** Gets the cofactor of a EC_GROUP + * \param group EC_GROUP object + * \param cofactor BIGNUM to which the cofactor is copied + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_GROUP_get_cofactor(const EC_GROUP *group, BIGNUM *cofactor, + BN_CTX *ctx); + +/** Sets the name of a EC_GROUP object + * \param group EC_GROUP object + * \param nid NID of the curve name OID + */ +void EC_GROUP_set_curve_name(EC_GROUP *group, int nid); + +/** Returns the curve name of a EC_GROUP object + * \param group EC_GROUP object + * \return NID of the curve name OID or 0 if not set. + */ +int EC_GROUP_get_curve_name(const EC_GROUP *group); + +void EC_GROUP_set_asn1_flag(EC_GROUP *group, int flag); +int EC_GROUP_get_asn1_flag(const EC_GROUP *group); + +void EC_GROUP_set_point_conversion_form(EC_GROUP *group, + point_conversion_form_t form); +point_conversion_form_t EC_GROUP_get_point_conversion_form(const EC_GROUP *); + +unsigned char *EC_GROUP_get0_seed(const EC_GROUP *x); +size_t EC_GROUP_get_seed_len(const EC_GROUP *); +size_t EC_GROUP_set_seed(EC_GROUP *, const unsigned char *, size_t len); + +/** Sets the parameter of a ec over GFp defined by y^2 = x^3 + a*x + b + * \param group EC_GROUP object + * \param p BIGNUM with the prime number + * \param a BIGNUM with parameter a of the equation + * \param b BIGNUM with parameter b of the equation + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_GROUP_set_curve_GFp(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a, + const BIGNUM *b, BN_CTX *ctx); + +/** Gets the parameter of the ec over GFp defined by y^2 = x^3 + a*x + b + * \param group EC_GROUP object + * \param p BIGNUM for the prime number + * \param a BIGNUM for parameter a of the equation + * \param b BIGNUM for parameter b of the equation + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_GROUP_get_curve_GFp(const EC_GROUP *group, BIGNUM *p, BIGNUM *a, + BIGNUM *b, BN_CTX *ctx); + +# ifndef OPENSSL_NO_EC2M +/** Sets the parameter of a ec over GF2m defined by y^2 + x*y = x^3 + a*x^2 + b + * \param group EC_GROUP object + * \param p BIGNUM with the polynomial defining the underlying field + * \param a BIGNUM with parameter a of the equation + * \param b BIGNUM with parameter b of the equation + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_GROUP_set_curve_GF2m(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a, + const BIGNUM *b, BN_CTX *ctx); + +/** Gets the parameter of the ec over GF2m defined by y^2 + x*y = x^3 + a*x^2 + b + * \param group EC_GROUP object + * \param p BIGNUM for the polynomial defining the underlying field + * \param a BIGNUM for parameter a of the equation + * \param b BIGNUM for parameter b of the equation + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_GROUP_get_curve_GF2m(const EC_GROUP *group, BIGNUM *p, BIGNUM *a, + BIGNUM *b, BN_CTX *ctx); +# endif +/** Returns the number of bits needed to represent a field element + * \param group EC_GROUP object + * \return number of bits needed to represent a field element + */ +int EC_GROUP_get_degree(const EC_GROUP *group); + +/** Checks whether the parameter in the EC_GROUP define a valid ec group + * \param group EC_GROUP object + * \param ctx BN_CTX object (optional) + * \return 1 if group is a valid ec group and 0 otherwise + */ +int EC_GROUP_check(const EC_GROUP *group, BN_CTX *ctx); + +/** Checks whether the discriminant of the elliptic curve is zero or not + * \param group EC_GROUP object + * \param ctx BN_CTX object (optional) + * \return 1 if the discriminant is not zero and 0 otherwise + */ +int EC_GROUP_check_discriminant(const EC_GROUP *group, BN_CTX *ctx); + +/** Compares two EC_GROUP objects + * \param a first EC_GROUP object + * \param b second EC_GROUP object + * \param ctx BN_CTX object (optional) + * \return 0 if both groups are equal and 1 otherwise + */ +int EC_GROUP_cmp(const EC_GROUP *a, const EC_GROUP *b, BN_CTX *ctx); + +/* + * EC_GROUP_new_GF*() calls EC_GROUP_new() and EC_GROUP_set_GF*() after + * choosing an appropriate EC_METHOD + */ + +/** Creates a new EC_GROUP object with the specified parameters defined + * over GFp (defined by the equation y^2 = x^3 + a*x + b) + * \param p BIGNUM with the prime number + * \param a BIGNUM with the parameter a of the equation + * \param b BIGNUM with the parameter b of the equation + * \param ctx BN_CTX object (optional) + * \return newly created EC_GROUP object with the specified parameters + */ +EC_GROUP *EC_GROUP_new_curve_GFp(const BIGNUM *p, const BIGNUM *a, + const BIGNUM *b, BN_CTX *ctx); +# ifndef OPENSSL_NO_EC2M +/** Creates a new EC_GROUP object with the specified parameters defined + * over GF2m (defined by the equation y^2 + x*y = x^3 + a*x^2 + b) + * \param p BIGNUM with the polynomial defining the underlying field + * \param a BIGNUM with the parameter a of the equation + * \param b BIGNUM with the parameter b of the equation + * \param ctx BN_CTX object (optional) + * \return newly created EC_GROUP object with the specified parameters + */ +EC_GROUP *EC_GROUP_new_curve_GF2m(const BIGNUM *p, const BIGNUM *a, + const BIGNUM *b, BN_CTX *ctx); +# endif +/** Creates a EC_GROUP object with a curve specified by a NID + * \param nid NID of the OID of the curve name + * \return newly created EC_GROUP object with specified curve or NULL + * if an error occurred + */ +EC_GROUP *EC_GROUP_new_by_curve_name(int nid); + +/********************************************************************/ +/* handling of internal curves */ +/********************************************************************/ + +typedef struct { + int nid; + const char *comment; +} EC_builtin_curve; + +/* + * EC_builtin_curves(EC_builtin_curve *r, size_t size) returns number of all + * available curves or zero if a error occurred. In case r ist not zero + * nitems EC_builtin_curve structures are filled with the data of the first + * nitems internal groups + */ +size_t EC_get_builtin_curves(EC_builtin_curve *r, size_t nitems); + +const char *EC_curve_nid2nist(int nid); +int EC_curve_nist2nid(const char *name); + +/********************************************************************/ +/* EC_POINT functions */ +/********************************************************************/ + +/** Creates a new EC_POINT object for the specified EC_GROUP + * \param group EC_GROUP the underlying EC_GROUP object + * \return newly created EC_POINT object or NULL if an error occurred + */ +EC_POINT *EC_POINT_new(const EC_GROUP *group); + +/** Frees a EC_POINT object + * \param point EC_POINT object to be freed + */ +void EC_POINT_free(EC_POINT *point); + +/** Clears and frees a EC_POINT object + * \param point EC_POINT object to be cleared and freed + */ +void EC_POINT_clear_free(EC_POINT *point); + +/** Copies EC_POINT object + * \param dst destination EC_POINT object + * \param src source EC_POINT object + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_copy(EC_POINT *dst, const EC_POINT *src); + +/** Creates a new EC_POINT object and copies the content of the supplied + * EC_POINT + * \param src source EC_POINT object + * \param group underlying the EC_GROUP object + * \return newly created EC_POINT object or NULL if an error occurred + */ +EC_POINT *EC_POINT_dup(const EC_POINT *src, const EC_GROUP *group); + +/** Returns the EC_METHOD used in EC_POINT object + * \param point EC_POINT object + * \return the EC_METHOD used + */ +const EC_METHOD *EC_POINT_method_of(const EC_POINT *point); + +/** Sets a point to infinity (neutral element) + * \param group underlying EC_GROUP object + * \param point EC_POINT to set to infinity + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_set_to_infinity(const EC_GROUP *group, EC_POINT *point); + +/** Sets the jacobian projective coordinates of a EC_POINT over GFp + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param x BIGNUM with the x-coordinate + * \param y BIGNUM with the y-coordinate + * \param z BIGNUM with the z-coordinate + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_set_Jprojective_coordinates_GFp(const EC_GROUP *group, + EC_POINT *p, const BIGNUM *x, + const BIGNUM *y, const BIGNUM *z, + BN_CTX *ctx); + +/** Gets the jacobian projective coordinates of a EC_POINT over GFp + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param x BIGNUM for the x-coordinate + * \param y BIGNUM for the y-coordinate + * \param z BIGNUM for the z-coordinate + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_get_Jprojective_coordinates_GFp(const EC_GROUP *group, + const EC_POINT *p, BIGNUM *x, + BIGNUM *y, BIGNUM *z, + BN_CTX *ctx); + +/** Sets the affine coordinates of a EC_POINT over GFp + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param x BIGNUM with the x-coordinate + * \param y BIGNUM with the y-coordinate + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_set_affine_coordinates_GFp(const EC_GROUP *group, EC_POINT *p, + const BIGNUM *x, const BIGNUM *y, + BN_CTX *ctx); + +/** Gets the affine coordinates of a EC_POINT over GFp + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param x BIGNUM for the x-coordinate + * \param y BIGNUM for the y-coordinate + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_get_affine_coordinates_GFp(const EC_GROUP *group, + const EC_POINT *p, BIGNUM *x, + BIGNUM *y, BN_CTX *ctx); + +/** Sets the x9.62 compressed coordinates of a EC_POINT over GFp + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param x BIGNUM with x-coordinate + * \param y_bit integer with the y-Bit (either 0 or 1) + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_set_compressed_coordinates_GFp(const EC_GROUP *group, + EC_POINT *p, const BIGNUM *x, + int y_bit, BN_CTX *ctx); +# ifndef OPENSSL_NO_EC2M +/** Sets the affine coordinates of a EC_POINT over GF2m + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param x BIGNUM with the x-coordinate + * \param y BIGNUM with the y-coordinate + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_set_affine_coordinates_GF2m(const EC_GROUP *group, EC_POINT *p, + const BIGNUM *x, const BIGNUM *y, + BN_CTX *ctx); + +/** Gets the affine coordinates of a EC_POINT over GF2m + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param x BIGNUM for the x-coordinate + * \param y BIGNUM for the y-coordinate + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_get_affine_coordinates_GF2m(const EC_GROUP *group, + const EC_POINT *p, BIGNUM *x, + BIGNUM *y, BN_CTX *ctx); + +/** Sets the x9.62 compressed coordinates of a EC_POINT over GF2m + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param x BIGNUM with x-coordinate + * \param y_bit integer with the y-Bit (either 0 or 1) + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_set_compressed_coordinates_GF2m(const EC_GROUP *group, + EC_POINT *p, const BIGNUM *x, + int y_bit, BN_CTX *ctx); +# endif +/** Encodes a EC_POINT object to a octet string + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param form point conversion form + * \param buf memory buffer for the result. If NULL the function returns + * required buffer size. + * \param len length of the memory buffer + * \param ctx BN_CTX object (optional) + * \return the length of the encoded octet string or 0 if an error occurred + */ +size_t EC_POINT_point2oct(const EC_GROUP *group, const EC_POINT *p, + point_conversion_form_t form, + unsigned char *buf, size_t len, BN_CTX *ctx); + +/** Decodes a EC_POINT from a octet string + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param buf memory buffer with the encoded ec point + * \param len length of the encoded ec point + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_oct2point(const EC_GROUP *group, EC_POINT *p, + const unsigned char *buf, size_t len, BN_CTX *ctx); + +/* other interfaces to point2oct/oct2point: */ +BIGNUM *EC_POINT_point2bn(const EC_GROUP *, const EC_POINT *, + point_conversion_form_t form, BIGNUM *, BN_CTX *); +EC_POINT *EC_POINT_bn2point(const EC_GROUP *, const BIGNUM *, + EC_POINT *, BN_CTX *); +char *EC_POINT_point2hex(const EC_GROUP *, const EC_POINT *, + point_conversion_form_t form, BN_CTX *); +EC_POINT *EC_POINT_hex2point(const EC_GROUP *, const char *, + EC_POINT *, BN_CTX *); + +/********************************************************************/ +/* functions for doing EC_POINT arithmetic */ +/********************************************************************/ + +/** Computes the sum of two EC_POINT + * \param group underlying EC_GROUP object + * \param r EC_POINT object for the result (r = a + b) + * \param a EC_POINT object with the first summand + * \param b EC_POINT object with the second summand + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, + const EC_POINT *b, BN_CTX *ctx); + +/** Computes the double of a EC_POINT + * \param group underlying EC_GROUP object + * \param r EC_POINT object for the result (r = 2 * a) + * \param a EC_POINT object + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_dbl(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, + BN_CTX *ctx); + +/** Computes the inverse of a EC_POINT + * \param group underlying EC_GROUP object + * \param a EC_POINT object to be inverted (it's used for the result as well) + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_invert(const EC_GROUP *group, EC_POINT *a, BN_CTX *ctx); + +/** Checks whether the point is the neutral element of the group + * \param group the underlying EC_GROUP object + * \param p EC_POINT object + * \return 1 if the point is the neutral element and 0 otherwise + */ +int EC_POINT_is_at_infinity(const EC_GROUP *group, const EC_POINT *p); + +/** Checks whether the point is on the curve + * \param group underlying EC_GROUP object + * \param point EC_POINT object to check + * \param ctx BN_CTX object (optional) + * \return 1 if point if on the curve and 0 otherwise + */ +int EC_POINT_is_on_curve(const EC_GROUP *group, const EC_POINT *point, + BN_CTX *ctx); + +/** Compares two EC_POINTs + * \param group underlying EC_GROUP object + * \param a first EC_POINT object + * \param b second EC_POINT object + * \param ctx BN_CTX object (optional) + * \return 0 if both points are equal and a value != 0 otherwise + */ +int EC_POINT_cmp(const EC_GROUP *group, const EC_POINT *a, const EC_POINT *b, + BN_CTX *ctx); + +int EC_POINT_make_affine(const EC_GROUP *group, EC_POINT *point, BN_CTX *ctx); +int EC_POINTs_make_affine(const EC_GROUP *group, size_t num, + EC_POINT *points[], BN_CTX *ctx); + +/** Computes r = generator * n sum_{i=0}^{num-1} p[i] * m[i] + * \param group underlying EC_GROUP object + * \param r EC_POINT object for the result + * \param n BIGNUM with the multiplier for the group generator (optional) + * \param num number futher summands + * \param p array of size num of EC_POINT objects + * \param m array of size num of BIGNUM objects + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINTs_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *n, + size_t num, const EC_POINT *p[], const BIGNUM *m[], + BN_CTX *ctx); + +/** Computes r = generator * n + q * m + * \param group underlying EC_GROUP object + * \param r EC_POINT object for the result + * \param n BIGNUM with the multiplier for the group generator (optional) + * \param q EC_POINT object with the first factor of the second summand + * \param m BIGNUM with the second factor of the second summand + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *n, + const EC_POINT *q, const BIGNUM *m, BN_CTX *ctx); + +/** Stores multiples of generator for faster point multiplication + * \param group EC_GROUP object + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_GROUP_precompute_mult(EC_GROUP *group, BN_CTX *ctx); + +/** Reports whether a precomputation has been done + * \param group EC_GROUP object + * \return 1 if a pre-computation has been done and 0 otherwise + */ +int EC_GROUP_have_precompute_mult(const EC_GROUP *group); + +/********************************************************************/ +/* ASN1 stuff */ +/********************************************************************/ + +/* + * EC_GROUP_get_basis_type() returns the NID of the basis type used to + * represent the field elements + */ +int EC_GROUP_get_basis_type(const EC_GROUP *); +# ifndef OPENSSL_NO_EC2M +int EC_GROUP_get_trinomial_basis(const EC_GROUP *, unsigned int *k); +int EC_GROUP_get_pentanomial_basis(const EC_GROUP *, unsigned int *k1, + unsigned int *k2, unsigned int *k3); +# endif + +# define OPENSSL_EC_NAMED_CURVE 0x001 + +typedef struct ecpk_parameters_st ECPKPARAMETERS; + +EC_GROUP *d2i_ECPKParameters(EC_GROUP **, const unsigned char **in, long len); +int i2d_ECPKParameters(const EC_GROUP *, unsigned char **out); + +# define d2i_ECPKParameters_bio(bp,x) ASN1_d2i_bio_of(EC_GROUP,NULL,d2i_ECPKParameters,bp,x) +# define i2d_ECPKParameters_bio(bp,x) ASN1_i2d_bio_of_const(EC_GROUP,i2d_ECPKParameters,bp,x) +# define d2i_ECPKParameters_fp(fp,x) (EC_GROUP *)ASN1_d2i_fp(NULL, \ + (char *(*)())d2i_ECPKParameters,(fp),(unsigned char **)(x)) +# define i2d_ECPKParameters_fp(fp,x) ASN1_i2d_fp(i2d_ECPKParameters,(fp), \ + (unsigned char *)(x)) + +# ifndef OPENSSL_NO_BIO +int ECPKParameters_print(BIO *bp, const EC_GROUP *x, int off); +# endif +# ifndef OPENSSL_NO_FP_API +int ECPKParameters_print_fp(FILE *fp, const EC_GROUP *x, int off); +# endif + +/********************************************************************/ +/* EC_KEY functions */ +/********************************************************************/ + +typedef struct ec_key_st EC_KEY; + +/* some values for the encoding_flag */ +# define EC_PKEY_NO_PARAMETERS 0x001 +# define EC_PKEY_NO_PUBKEY 0x002 + +/* some values for the flags field */ +# define EC_FLAG_NON_FIPS_ALLOW 0x1 +# define EC_FLAG_FIPS_CHECKED 0x2 + +/** Creates a new EC_KEY object. + * \return EC_KEY object or NULL if an error occurred. + */ +EC_KEY *EC_KEY_new(void); + +int EC_KEY_get_flags(const EC_KEY *key); + +void EC_KEY_set_flags(EC_KEY *key, int flags); + +void EC_KEY_clear_flags(EC_KEY *key, int flags); + +/** Creates a new EC_KEY object using a named curve as underlying + * EC_GROUP object. + * \param nid NID of the named curve. + * \return EC_KEY object or NULL if an error occurred. + */ +EC_KEY *EC_KEY_new_by_curve_name(int nid); + +/** Frees a EC_KEY object. + * \param key EC_KEY object to be freed. + */ +void EC_KEY_free(EC_KEY *key); + +/** Copies a EC_KEY object. + * \param dst destination EC_KEY object + * \param src src EC_KEY object + * \return dst or NULL if an error occurred. + */ +EC_KEY *EC_KEY_copy(EC_KEY *dst, const EC_KEY *src); + +/** Creates a new EC_KEY object and copies the content from src to it. + * \param src the source EC_KEY object + * \return newly created EC_KEY object or NULL if an error occurred. + */ +EC_KEY *EC_KEY_dup(const EC_KEY *src); + +/** Increases the internal reference count of a EC_KEY object. + * \param key EC_KEY object + * \return 1 on success and 0 if an error occurred. + */ +int EC_KEY_up_ref(EC_KEY *key); + +/** Returns the EC_GROUP object of a EC_KEY object + * \param key EC_KEY object + * \return the EC_GROUP object (possibly NULL). + */ +const EC_GROUP *EC_KEY_get0_group(const EC_KEY *key); + +/** Sets the EC_GROUP of a EC_KEY object. + * \param key EC_KEY object + * \param group EC_GROUP to use in the EC_KEY object (note: the EC_KEY + * object will use an own copy of the EC_GROUP). + * \return 1 on success and 0 if an error occurred. + */ +int EC_KEY_set_group(EC_KEY *key, const EC_GROUP *group); + +/** Returns the private key of a EC_KEY object. + * \param key EC_KEY object + * \return a BIGNUM with the private key (possibly NULL). + */ +const BIGNUM *EC_KEY_get0_private_key(const EC_KEY *key); + +/** Sets the private key of a EC_KEY object. + * \param key EC_KEY object + * \param prv BIGNUM with the private key (note: the EC_KEY object + * will use an own copy of the BIGNUM). + * \return 1 on success and 0 if an error occurred. + */ +int EC_KEY_set_private_key(EC_KEY *key, const BIGNUM *prv); + +/** Returns the public key of a EC_KEY object. + * \param key the EC_KEY object + * \return a EC_POINT object with the public key (possibly NULL) + */ +const EC_POINT *EC_KEY_get0_public_key(const EC_KEY *key); + +/** Sets the public key of a EC_KEY object. + * \param key EC_KEY object + * \param pub EC_POINT object with the public key (note: the EC_KEY object + * will use an own copy of the EC_POINT object). + * \return 1 on success and 0 if an error occurred. + */ +int EC_KEY_set_public_key(EC_KEY *key, const EC_POINT *pub); + +unsigned EC_KEY_get_enc_flags(const EC_KEY *key); +void EC_KEY_set_enc_flags(EC_KEY *eckey, unsigned int flags); +point_conversion_form_t EC_KEY_get_conv_form(const EC_KEY *key); +void EC_KEY_set_conv_form(EC_KEY *eckey, point_conversion_form_t cform); +/* functions to set/get method specific data */ +void *EC_KEY_get_key_method_data(EC_KEY *key, + void *(*dup_func) (void *), + void (*free_func) (void *), + void (*clear_free_func) (void *)); +/** Sets the key method data of an EC_KEY object, if none has yet been set. + * \param key EC_KEY object + * \param data opaque data to install. + * \param dup_func a function that duplicates |data|. + * \param free_func a function that frees |data|. + * \param clear_free_func a function that wipes and frees |data|. + * \return the previously set data pointer, or NULL if |data| was inserted. + */ +void *EC_KEY_insert_key_method_data(EC_KEY *key, void *data, + void *(*dup_func) (void *), + void (*free_func) (void *), + void (*clear_free_func) (void *)); +/* wrapper functions for the underlying EC_GROUP object */ +void EC_KEY_set_asn1_flag(EC_KEY *eckey, int asn1_flag); + +/** Creates a table of pre-computed multiples of the generator to + * accelerate further EC_KEY operations. + * \param key EC_KEY object + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occurred. + */ +int EC_KEY_precompute_mult(EC_KEY *key, BN_CTX *ctx); + +/** Creates a new ec private (and optional a new public) key. + * \param key EC_KEY object + * \return 1 on success and 0 if an error occurred. + */ +int EC_KEY_generate_key(EC_KEY *key); + +/** Verifies that a private and/or public key is valid. + * \param key the EC_KEY object + * \return 1 on success and 0 otherwise. + */ +int EC_KEY_check_key(const EC_KEY *key); + +/** Sets a public key from affine coordindates performing + * neccessary NIST PKV tests. + * \param key the EC_KEY object + * \param x public key x coordinate + * \param y public key y coordinate + * \return 1 on success and 0 otherwise. + */ +int EC_KEY_set_public_key_affine_coordinates(EC_KEY *key, BIGNUM *x, + BIGNUM *y); + +/********************************************************************/ +/* de- and encoding functions for SEC1 ECPrivateKey */ +/********************************************************************/ + +/** Decodes a private key from a memory buffer. + * \param key a pointer to a EC_KEY object which should be used (or NULL) + * \param in pointer to memory with the DER encoded private key + * \param len length of the DER encoded private key + * \return the decoded private key or NULL if an error occurred. + */ +EC_KEY *d2i_ECPrivateKey(EC_KEY **key, const unsigned char **in, long len); + +/** Encodes a private key object and stores the result in a buffer. + * \param key the EC_KEY object to encode + * \param out the buffer for the result (if NULL the function returns number + * of bytes needed). + * \return 1 on success and 0 if an error occurred. + */ +int i2d_ECPrivateKey(EC_KEY *key, unsigned char **out); + +/********************************************************************/ +/* de- and encoding functions for EC parameters */ +/********************************************************************/ + +/** Decodes ec parameter from a memory buffer. + * \param key a pointer to a EC_KEY object which should be used (or NULL) + * \param in pointer to memory with the DER encoded ec parameters + * \param len length of the DER encoded ec parameters + * \return a EC_KEY object with the decoded parameters or NULL if an error + * occurred. + */ +EC_KEY *d2i_ECParameters(EC_KEY **key, const unsigned char **in, long len); + +/** Encodes ec parameter and stores the result in a buffer. + * \param key the EC_KEY object with ec paramters to encode + * \param out the buffer for the result (if NULL the function returns number + * of bytes needed). + * \return 1 on success and 0 if an error occurred. + */ +int i2d_ECParameters(EC_KEY *key, unsigned char **out); + +/********************************************************************/ +/* de- and encoding functions for EC public key */ +/* (octet string, not DER -- hence 'o2i' and 'i2o') */ +/********************************************************************/ + +/** Decodes a ec public key from a octet string. + * \param key a pointer to a EC_KEY object which should be used + * \param in memory buffer with the encoded public key + * \param len length of the encoded public key + * \return EC_KEY object with decoded public key or NULL if an error + * occurred. + */ +EC_KEY *o2i_ECPublicKey(EC_KEY **key, const unsigned char **in, long len); + +/** Encodes a ec public key in an octet string. + * \param key the EC_KEY object with the public key + * \param out the buffer for the result (if NULL the function returns number + * of bytes needed). + * \return 1 on success and 0 if an error occurred + */ +int i2o_ECPublicKey(EC_KEY *key, unsigned char **out); + +# ifndef OPENSSL_NO_BIO +/** Prints out the ec parameters on human readable form. + * \param bp BIO object to which the information is printed + * \param key EC_KEY object + * \return 1 on success and 0 if an error occurred + */ +int ECParameters_print(BIO *bp, const EC_KEY *key); + +/** Prints out the contents of a EC_KEY object + * \param bp BIO object to which the information is printed + * \param key EC_KEY object + * \param off line offset + * \return 1 on success and 0 if an error occurred + */ +int EC_KEY_print(BIO *bp, const EC_KEY *key, int off); + +# endif +# ifndef OPENSSL_NO_FP_API +/** Prints out the ec parameters on human readable form. + * \param fp file descriptor to which the information is printed + * \param key EC_KEY object + * \return 1 on success and 0 if an error occurred + */ +int ECParameters_print_fp(FILE *fp, const EC_KEY *key); + +/** Prints out the contents of a EC_KEY object + * \param fp file descriptor to which the information is printed + * \param key EC_KEY object + * \param off line offset + * \return 1 on success and 0 if an error occurred + */ +int EC_KEY_print_fp(FILE *fp, const EC_KEY *key, int off); + +# endif + +# define ECParameters_dup(x) ASN1_dup_of(EC_KEY,i2d_ECParameters,d2i_ECParameters,x) + +# ifndef __cplusplus +# if defined(__SUNPRO_C) +# if __SUNPRO_C >= 0x520 +# pragma error_messages (default,E_ARRAY_OF_INCOMPLETE_NONAME,E_ARRAY_OF_INCOMPLETE) +# endif +# endif +# endif + +# define EVP_PKEY_CTX_set_ec_paramgen_curve_nid(ctx, nid) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_PARAMGEN|EVP_PKEY_OP_KEYGEN, \ + EVP_PKEY_CTRL_EC_PARAMGEN_CURVE_NID, nid, NULL) + +# define EVP_PKEY_CTX_set_ec_param_enc(ctx, flag) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_PARAMGEN|EVP_PKEY_OP_KEYGEN, \ + EVP_PKEY_CTRL_EC_PARAM_ENC, flag, NULL) + +# define EVP_PKEY_CTX_set_ecdh_cofactor_mode(ctx, flag) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_EC_ECDH_COFACTOR, flag, NULL) + +# define EVP_PKEY_CTX_get_ecdh_cofactor_mode(ctx) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_EC_ECDH_COFACTOR, -2, NULL) + +# define EVP_PKEY_CTX_set_ecdh_kdf_type(ctx, kdf) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_EC_KDF_TYPE, kdf, NULL) + +# define EVP_PKEY_CTX_get_ecdh_kdf_type(ctx) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_EC_KDF_TYPE, -2, NULL) + +# define EVP_PKEY_CTX_set_ecdh_kdf_md(ctx, md) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_EC_KDF_MD, 0, (void *)md) + +# define EVP_PKEY_CTX_get_ecdh_kdf_md(ctx, pmd) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_GET_EC_KDF_MD, 0, (void *)pmd) + +# define EVP_PKEY_CTX_set_ecdh_kdf_outlen(ctx, len) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_EC_KDF_OUTLEN, len, NULL) + +# define EVP_PKEY_CTX_get_ecdh_kdf_outlen(ctx, plen) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_GET_EC_KDF_OUTLEN, 0, (void *)plen) + +# define EVP_PKEY_CTX_set0_ecdh_kdf_ukm(ctx, p, plen) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_EC_KDF_UKM, plen, (void *)p) + +# define EVP_PKEY_CTX_get0_ecdh_kdf_ukm(ctx, p) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_GET_EC_KDF_UKM, 0, (void *)p) + +# define EVP_PKEY_CTRL_EC_PARAMGEN_CURVE_NID (EVP_PKEY_ALG_CTRL + 1) +# define EVP_PKEY_CTRL_EC_PARAM_ENC (EVP_PKEY_ALG_CTRL + 2) +# define EVP_PKEY_CTRL_EC_ECDH_COFACTOR (EVP_PKEY_ALG_CTRL + 3) +# define EVP_PKEY_CTRL_EC_KDF_TYPE (EVP_PKEY_ALG_CTRL + 4) +# define EVP_PKEY_CTRL_EC_KDF_MD (EVP_PKEY_ALG_CTRL + 5) +# define EVP_PKEY_CTRL_GET_EC_KDF_MD (EVP_PKEY_ALG_CTRL + 6) +# define EVP_PKEY_CTRL_EC_KDF_OUTLEN (EVP_PKEY_ALG_CTRL + 7) +# define EVP_PKEY_CTRL_GET_EC_KDF_OUTLEN (EVP_PKEY_ALG_CTRL + 8) +# define EVP_PKEY_CTRL_EC_KDF_UKM (EVP_PKEY_ALG_CTRL + 9) +# define EVP_PKEY_CTRL_GET_EC_KDF_UKM (EVP_PKEY_ALG_CTRL + 10) +/* KDF types */ +# define EVP_PKEY_ECDH_KDF_NONE 1 +# define EVP_PKEY_ECDH_KDF_X9_62 2 + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_EC_strings(void); + +/* Error codes for the EC functions. */ + +/* Function codes. */ +# define EC_F_BN_TO_FELEM 224 +# define EC_F_COMPUTE_WNAF 143 +# define EC_F_D2I_ECPARAMETERS 144 +# define EC_F_D2I_ECPKPARAMETERS 145 +# define EC_F_D2I_ECPRIVATEKEY 146 +# define EC_F_DO_EC_KEY_PRINT 221 +# define EC_F_ECDH_CMS_DECRYPT 238 +# define EC_F_ECDH_CMS_SET_SHARED_INFO 239 +# define EC_F_ECKEY_PARAM2TYPE 223 +# define EC_F_ECKEY_PARAM_DECODE 212 +# define EC_F_ECKEY_PRIV_DECODE 213 +# define EC_F_ECKEY_PRIV_ENCODE 214 +# define EC_F_ECKEY_PUB_DECODE 215 +# define EC_F_ECKEY_PUB_ENCODE 216 +# define EC_F_ECKEY_TYPE2PARAM 220 +# define EC_F_ECPARAMETERS_PRINT 147 +# define EC_F_ECPARAMETERS_PRINT_FP 148 +# define EC_F_ECPKPARAMETERS_PRINT 149 +# define EC_F_ECPKPARAMETERS_PRINT_FP 150 +# define EC_F_ECP_NISTZ256_GET_AFFINE 240 +# define EC_F_ECP_NISTZ256_MULT_PRECOMPUTE 243 +# define EC_F_ECP_NISTZ256_POINTS_MUL 241 +# define EC_F_ECP_NISTZ256_PRE_COMP_NEW 244 +# define EC_F_ECP_NISTZ256_SET_WORDS 245 +# define EC_F_ECP_NISTZ256_WINDOWED_MUL 242 +# define EC_F_ECP_NIST_MOD_192 203 +# define EC_F_ECP_NIST_MOD_224 204 +# define EC_F_ECP_NIST_MOD_256 205 +# define EC_F_ECP_NIST_MOD_521 206 +# define EC_F_EC_ASN1_GROUP2CURVE 153 +# define EC_F_EC_ASN1_GROUP2FIELDID 154 +# define EC_F_EC_ASN1_GROUP2PARAMETERS 155 +# define EC_F_EC_ASN1_GROUP2PKPARAMETERS 156 +# define EC_F_EC_ASN1_PARAMETERS2GROUP 157 +# define EC_F_EC_ASN1_PKPARAMETERS2GROUP 158 +# define EC_F_EC_EX_DATA_SET_DATA 211 +# define EC_F_EC_GF2M_MONTGOMERY_POINT_MULTIPLY 208 +# define EC_F_EC_GF2M_SIMPLE_GROUP_CHECK_DISCRIMINANT 159 +# define EC_F_EC_GF2M_SIMPLE_GROUP_SET_CURVE 195 +# define EC_F_EC_GF2M_SIMPLE_OCT2POINT 160 +# define EC_F_EC_GF2M_SIMPLE_POINT2OCT 161 +# define EC_F_EC_GF2M_SIMPLE_POINT_GET_AFFINE_COORDINATES 162 +# define EC_F_EC_GF2M_SIMPLE_POINT_SET_AFFINE_COORDINATES 163 +# define EC_F_EC_GF2M_SIMPLE_SET_COMPRESSED_COORDINATES 164 +# define EC_F_EC_GFP_MONT_FIELD_DECODE 133 +# define EC_F_EC_GFP_MONT_FIELD_ENCODE 134 +# define EC_F_EC_GFP_MONT_FIELD_MUL 131 +# define EC_F_EC_GFP_MONT_FIELD_SET_TO_ONE 209 +# define EC_F_EC_GFP_MONT_FIELD_SQR 132 +# define EC_F_EC_GFP_MONT_GROUP_SET_CURVE 189 +# define EC_F_EC_GFP_MONT_GROUP_SET_CURVE_GFP 135 +# define EC_F_EC_GFP_NISTP224_GROUP_SET_CURVE 225 +# define EC_F_EC_GFP_NISTP224_POINTS_MUL 228 +# define EC_F_EC_GFP_NISTP224_POINT_GET_AFFINE_COORDINATES 226 +# define EC_F_EC_GFP_NISTP256_GROUP_SET_CURVE 230 +# define EC_F_EC_GFP_NISTP256_POINTS_MUL 231 +# define EC_F_EC_GFP_NISTP256_POINT_GET_AFFINE_COORDINATES 232 +# define EC_F_EC_GFP_NISTP521_GROUP_SET_CURVE 233 +# define EC_F_EC_GFP_NISTP521_POINTS_MUL 234 +# define EC_F_EC_GFP_NISTP521_POINT_GET_AFFINE_COORDINATES 235 +# define EC_F_EC_GFP_NIST_FIELD_MUL 200 +# define EC_F_EC_GFP_NIST_FIELD_SQR 201 +# define EC_F_EC_GFP_NIST_GROUP_SET_CURVE 202 +# define EC_F_EC_GFP_SIMPLE_GROUP_CHECK_DISCRIMINANT 165 +# define EC_F_EC_GFP_SIMPLE_GROUP_SET_CURVE 166 +# define EC_F_EC_GFP_SIMPLE_GROUP_SET_CURVE_GFP 100 +# define EC_F_EC_GFP_SIMPLE_GROUP_SET_GENERATOR 101 +# define EC_F_EC_GFP_SIMPLE_MAKE_AFFINE 102 +# define EC_F_EC_GFP_SIMPLE_OCT2POINT 103 +# define EC_F_EC_GFP_SIMPLE_POINT2OCT 104 +# define EC_F_EC_GFP_SIMPLE_POINTS_MAKE_AFFINE 137 +# define EC_F_EC_GFP_SIMPLE_POINT_GET_AFFINE_COORDINATES 167 +# define EC_F_EC_GFP_SIMPLE_POINT_GET_AFFINE_COORDINATES_GFP 105 +# define EC_F_EC_GFP_SIMPLE_POINT_SET_AFFINE_COORDINATES 168 +# define EC_F_EC_GFP_SIMPLE_POINT_SET_AFFINE_COORDINATES_GFP 128 +# define EC_F_EC_GFP_SIMPLE_SET_COMPRESSED_COORDINATES 169 +# define EC_F_EC_GFP_SIMPLE_SET_COMPRESSED_COORDINATES_GFP 129 +# define EC_F_EC_GROUP_CHECK 170 +# define EC_F_EC_GROUP_CHECK_DISCRIMINANT 171 +# define EC_F_EC_GROUP_COPY 106 +# define EC_F_EC_GROUP_GET0_GENERATOR 139 +# define EC_F_EC_GROUP_GET_COFACTOR 140 +# define EC_F_EC_GROUP_GET_CURVE_GF2M 172 +# define EC_F_EC_GROUP_GET_CURVE_GFP 130 +# define EC_F_EC_GROUP_GET_DEGREE 173 +# define EC_F_EC_GROUP_GET_ORDER 141 +# define EC_F_EC_GROUP_GET_PENTANOMIAL_BASIS 193 +# define EC_F_EC_GROUP_GET_TRINOMIAL_BASIS 194 +# define EC_F_EC_GROUP_NEW 108 +# define EC_F_EC_GROUP_NEW_BY_CURVE_NAME 174 +# define EC_F_EC_GROUP_NEW_FROM_DATA 175 +# define EC_F_EC_GROUP_PRECOMPUTE_MULT 142 +# define EC_F_EC_GROUP_SET_CURVE_GF2M 176 +# define EC_F_EC_GROUP_SET_CURVE_GFP 109 +# define EC_F_EC_GROUP_SET_EXTRA_DATA 110 +# define EC_F_EC_GROUP_SET_GENERATOR 111 +# define EC_F_EC_KEY_CHECK_KEY 177 +# define EC_F_EC_KEY_COPY 178 +# define EC_F_EC_KEY_GENERATE_KEY 179 +# define EC_F_EC_KEY_NEW 182 +# define EC_F_EC_KEY_PRINT 180 +# define EC_F_EC_KEY_PRINT_FP 181 +# define EC_F_EC_KEY_SET_PUBLIC_KEY_AFFINE_COORDINATES 229 +# define EC_F_EC_POINTS_MAKE_AFFINE 136 +# define EC_F_EC_POINT_ADD 112 +# define EC_F_EC_POINT_CMP 113 +# define EC_F_EC_POINT_COPY 114 +# define EC_F_EC_POINT_DBL 115 +# define EC_F_EC_POINT_GET_AFFINE_COORDINATES_GF2M 183 +# define EC_F_EC_POINT_GET_AFFINE_COORDINATES_GFP 116 +# define EC_F_EC_POINT_GET_JPROJECTIVE_COORDINATES_GFP 117 +# define EC_F_EC_POINT_INVERT 210 +# define EC_F_EC_POINT_IS_AT_INFINITY 118 +# define EC_F_EC_POINT_IS_ON_CURVE 119 +# define EC_F_EC_POINT_MAKE_AFFINE 120 +# define EC_F_EC_POINT_MUL 184 +# define EC_F_EC_POINT_NEW 121 +# define EC_F_EC_POINT_OCT2POINT 122 +# define EC_F_EC_POINT_POINT2OCT 123 +# define EC_F_EC_POINT_SET_AFFINE_COORDINATES_GF2M 185 +# define EC_F_EC_POINT_SET_AFFINE_COORDINATES_GFP 124 +# define EC_F_EC_POINT_SET_COMPRESSED_COORDINATES_GF2M 186 +# define EC_F_EC_POINT_SET_COMPRESSED_COORDINATES_GFP 125 +# define EC_F_EC_POINT_SET_JPROJECTIVE_COORDINATES_GFP 126 +# define EC_F_EC_POINT_SET_TO_INFINITY 127 +# define EC_F_EC_PRE_COMP_DUP 207 +# define EC_F_EC_PRE_COMP_NEW 196 +# define EC_F_EC_WNAF_MUL 187 +# define EC_F_EC_WNAF_PRECOMPUTE_MULT 188 +# define EC_F_I2D_ECPARAMETERS 190 +# define EC_F_I2D_ECPKPARAMETERS 191 +# define EC_F_I2D_ECPRIVATEKEY 192 +# define EC_F_I2O_ECPUBLICKEY 151 +# define EC_F_NISTP224_PRE_COMP_NEW 227 +# define EC_F_NISTP256_PRE_COMP_NEW 236 +# define EC_F_NISTP521_PRE_COMP_NEW 237 +# define EC_F_O2I_ECPUBLICKEY 152 +# define EC_F_OLD_EC_PRIV_DECODE 222 +# define EC_F_PKEY_EC_CTRL 197 +# define EC_F_PKEY_EC_CTRL_STR 198 +# define EC_F_PKEY_EC_DERIVE 217 +# define EC_F_PKEY_EC_KEYGEN 199 +# define EC_F_PKEY_EC_PARAMGEN 219 +# define EC_F_PKEY_EC_SIGN 218 + +/* Reason codes. */ +# define EC_R_ASN1_ERROR 115 +# define EC_R_ASN1_UNKNOWN_FIELD 116 +# define EC_R_BIGNUM_OUT_OF_RANGE 144 +# define EC_R_BUFFER_TOO_SMALL 100 +# define EC_R_COORDINATES_OUT_OF_RANGE 146 +# define EC_R_D2I_ECPKPARAMETERS_FAILURE 117 +# define EC_R_DECODE_ERROR 142 +# define EC_R_DISCRIMINANT_IS_ZERO 118 +# define EC_R_EC_GROUP_NEW_BY_NAME_FAILURE 119 +# define EC_R_FIELD_TOO_LARGE 143 +# define EC_R_GF2M_NOT_SUPPORTED 147 +# define EC_R_GROUP2PKPARAMETERS_FAILURE 120 +# define EC_R_I2D_ECPKPARAMETERS_FAILURE 121 +# define EC_R_INCOMPATIBLE_OBJECTS 101 +# define EC_R_INVALID_ARGUMENT 112 +# define EC_R_INVALID_COMPRESSED_POINT 110 +# define EC_R_INVALID_COMPRESSION_BIT 109 +# define EC_R_INVALID_CURVE 141 +# define EC_R_INVALID_DIGEST 151 +# define EC_R_INVALID_DIGEST_TYPE 138 +# define EC_R_INVALID_ENCODING 102 +# define EC_R_INVALID_FIELD 103 +# define EC_R_INVALID_FORM 104 +# define EC_R_INVALID_GROUP_ORDER 122 +# define EC_R_INVALID_PENTANOMIAL_BASIS 132 +# define EC_R_INVALID_PRIVATE_KEY 123 +# define EC_R_INVALID_TRINOMIAL_BASIS 137 +# define EC_R_KDF_PARAMETER_ERROR 148 +# define EC_R_KEYS_NOT_SET 140 +# define EC_R_MISSING_PARAMETERS 124 +# define EC_R_MISSING_PRIVATE_KEY 125 +# define EC_R_NOT_A_NIST_PRIME 135 +# define EC_R_NOT_A_SUPPORTED_NIST_PRIME 136 +# define EC_R_NOT_IMPLEMENTED 126 +# define EC_R_NOT_INITIALIZED 111 +# define EC_R_NO_FIELD_MOD 133 +# define EC_R_NO_PARAMETERS_SET 139 +# define EC_R_PASSED_NULL_PARAMETER 134 +# define EC_R_PEER_KEY_ERROR 149 +# define EC_R_PKPARAMETERS2GROUP_FAILURE 127 +# define EC_R_POINT_AT_INFINITY 106 +# define EC_R_POINT_IS_NOT_ON_CURVE 107 +# define EC_R_SHARED_INFO_ERROR 150 +# define EC_R_SLOT_FULL 108 +# define EC_R_UNDEFINED_GENERATOR 113 +# define EC_R_UNDEFINED_ORDER 128 +# define EC_R_UNKNOWN_GROUP 129 +# define EC_R_UNKNOWN_ORDER 114 +# define EC_R_UNSUPPORTED_FIELD 131 +# define EC_R_WRONG_CURVE_PARAMETERS 145 +# define EC_R_WRONG_ORDER 130 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/ecdh.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/ecdh.h new file mode 100644 index 0000000..25348b3 --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/ecdh.h @@ -0,0 +1,134 @@ +/* crypto/ecdh/ecdh.h */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * + * The Elliptic Curve Public-Key Crypto Library (ECC Code) included + * herein is developed by SUN MICROSYSTEMS, INC., and is contributed + * to the OpenSSL project. + * + * The ECC Code is licensed pursuant to the OpenSSL open source + * license provided below. + * + * The ECDH software is originally written by Douglas Stebila of + * Sun Microsystems Laboratories. + * + */ +/* ==================================================================== + * Copyright (c) 2000-2002 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +#ifndef HEADER_ECDH_H +# define HEADER_ECDH_H + +# include + +# ifdef OPENSSL_NO_ECDH +# error ECDH is disabled. +# endif + +# include +# include +# ifndef OPENSSL_NO_DEPRECATED +# include +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +# define EC_FLAG_COFACTOR_ECDH 0x1000 + +const ECDH_METHOD *ECDH_OpenSSL(void); + +void ECDH_set_default_method(const ECDH_METHOD *); +const ECDH_METHOD *ECDH_get_default_method(void); +int ECDH_set_method(EC_KEY *, const ECDH_METHOD *); + +int ECDH_compute_key(void *out, size_t outlen, const EC_POINT *pub_key, + EC_KEY *ecdh, void *(*KDF) (const void *in, size_t inlen, + void *out, size_t *outlen)); + +int ECDH_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new + *new_func, CRYPTO_EX_dup *dup_func, + CRYPTO_EX_free *free_func); +int ECDH_set_ex_data(EC_KEY *d, int idx, void *arg); +void *ECDH_get_ex_data(EC_KEY *d, int idx); + +int ECDH_KDF_X9_62(unsigned char *out, size_t outlen, + const unsigned char *Z, size_t Zlen, + const unsigned char *sinfo, size_t sinfolen, + const EVP_MD *md); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_ECDH_strings(void); + +/* Error codes for the ECDH functions. */ + +/* Function codes. */ +# define ECDH_F_ECDH_CHECK 102 +# define ECDH_F_ECDH_COMPUTE_KEY 100 +# define ECDH_F_ECDH_DATA_NEW_METHOD 101 + +/* Reason codes. */ +# define ECDH_R_KDF_FAILED 102 +# define ECDH_R_NON_FIPS_METHOD 103 +# define ECDH_R_NO_PRIVATE_VALUE 100 +# define ECDH_R_POINT_ARITHMETIC_FAILURE 101 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/ecdsa.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/ecdsa.h new file mode 100644 index 0000000..a6f0930 --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/ecdsa.h @@ -0,0 +1,335 @@ +/* crypto/ecdsa/ecdsa.h */ +/** + * \file crypto/ecdsa/ecdsa.h Include file for the OpenSSL ECDSA functions + * \author Written by Nils Larsch for the OpenSSL project + */ +/* ==================================================================== + * Copyright (c) 2000-2005 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +#ifndef HEADER_ECDSA_H +# define HEADER_ECDSA_H + +# include + +# ifdef OPENSSL_NO_ECDSA +# error ECDSA is disabled. +# endif + +# include +# include +# ifndef OPENSSL_NO_DEPRECATED +# include +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct ECDSA_SIG_st { + BIGNUM *r; + BIGNUM *s; +} ECDSA_SIG; + +/** Allocates and initialize a ECDSA_SIG structure + * \return pointer to a ECDSA_SIG structure or NULL if an error occurred + */ +ECDSA_SIG *ECDSA_SIG_new(void); + +/** frees a ECDSA_SIG structure + * \param sig pointer to the ECDSA_SIG structure + */ +void ECDSA_SIG_free(ECDSA_SIG *sig); + +/** DER encode content of ECDSA_SIG object (note: this function modifies *pp + * (*pp += length of the DER encoded signature)). + * \param sig pointer to the ECDSA_SIG object + * \param pp pointer to a unsigned char pointer for the output or NULL + * \return the length of the DER encoded ECDSA_SIG object or 0 + */ +int i2d_ECDSA_SIG(const ECDSA_SIG *sig, unsigned char **pp); + +/** Decodes a DER encoded ECDSA signature (note: this function changes *pp + * (*pp += len)). + * \param sig pointer to ECDSA_SIG pointer (may be NULL) + * \param pp memory buffer with the DER encoded signature + * \param len length of the buffer + * \return pointer to the decoded ECDSA_SIG structure (or NULL) + */ +ECDSA_SIG *d2i_ECDSA_SIG(ECDSA_SIG **sig, const unsigned char **pp, long len); + +/** Computes the ECDSA signature of the given hash value using + * the supplied private key and returns the created signature. + * \param dgst pointer to the hash value + * \param dgst_len length of the hash value + * \param eckey EC_KEY object containing a private EC key + * \return pointer to a ECDSA_SIG structure or NULL if an error occurred + */ +ECDSA_SIG *ECDSA_do_sign(const unsigned char *dgst, int dgst_len, + EC_KEY *eckey); + +/** Computes ECDSA signature of a given hash value using the supplied + * private key (note: sig must point to ECDSA_size(eckey) bytes of memory). + * \param dgst pointer to the hash value to sign + * \param dgstlen length of the hash value + * \param kinv BIGNUM with a pre-computed inverse k (optional) + * \param rp BIGNUM with a pre-computed rp value (optioanl), + * see ECDSA_sign_setup + * \param eckey EC_KEY object containing a private EC key + * \return pointer to a ECDSA_SIG structure or NULL if an error occurred + */ +ECDSA_SIG *ECDSA_do_sign_ex(const unsigned char *dgst, int dgstlen, + const BIGNUM *kinv, const BIGNUM *rp, + EC_KEY *eckey); + +/** Verifies that the supplied signature is a valid ECDSA + * signature of the supplied hash value using the supplied public key. + * \param dgst pointer to the hash value + * \param dgst_len length of the hash value + * \param sig ECDSA_SIG structure + * \param eckey EC_KEY object containing a public EC key + * \return 1 if the signature is valid, 0 if the signature is invalid + * and -1 on error + */ +int ECDSA_do_verify(const unsigned char *dgst, int dgst_len, + const ECDSA_SIG *sig, EC_KEY *eckey); + +const ECDSA_METHOD *ECDSA_OpenSSL(void); + +/** Sets the default ECDSA method + * \param meth new default ECDSA_METHOD + */ +void ECDSA_set_default_method(const ECDSA_METHOD *meth); + +/** Returns the default ECDSA method + * \return pointer to ECDSA_METHOD structure containing the default method + */ +const ECDSA_METHOD *ECDSA_get_default_method(void); + +/** Sets method to be used for the ECDSA operations + * \param eckey EC_KEY object + * \param meth new method + * \return 1 on success and 0 otherwise + */ +int ECDSA_set_method(EC_KEY *eckey, const ECDSA_METHOD *meth); + +/** Returns the maximum length of the DER encoded signature + * \param eckey EC_KEY object + * \return numbers of bytes required for the DER encoded signature + */ +int ECDSA_size(const EC_KEY *eckey); + +/** Precompute parts of the signing operation + * \param eckey EC_KEY object containing a private EC key + * \param ctx BN_CTX object (optional) + * \param kinv BIGNUM pointer for the inverse of k + * \param rp BIGNUM pointer for x coordinate of k * generator + * \return 1 on success and 0 otherwise + */ +int ECDSA_sign_setup(EC_KEY *eckey, BN_CTX *ctx, BIGNUM **kinv, BIGNUM **rp); + +/** Computes ECDSA signature of a given hash value using the supplied + * private key (note: sig must point to ECDSA_size(eckey) bytes of memory). + * \param type this parameter is ignored + * \param dgst pointer to the hash value to sign + * \param dgstlen length of the hash value + * \param sig memory for the DER encoded created signature + * \param siglen pointer to the length of the returned signature + * \param eckey EC_KEY object containing a private EC key + * \return 1 on success and 0 otherwise + */ +int ECDSA_sign(int type, const unsigned char *dgst, int dgstlen, + unsigned char *sig, unsigned int *siglen, EC_KEY *eckey); + +/** Computes ECDSA signature of a given hash value using the supplied + * private key (note: sig must point to ECDSA_size(eckey) bytes of memory). + * \param type this parameter is ignored + * \param dgst pointer to the hash value to sign + * \param dgstlen length of the hash value + * \param sig buffer to hold the DER encoded signature + * \param siglen pointer to the length of the returned signature + * \param kinv BIGNUM with a pre-computed inverse k (optional) + * \param rp BIGNUM with a pre-computed rp value (optioanl), + * see ECDSA_sign_setup + * \param eckey EC_KEY object containing a private EC key + * \return 1 on success and 0 otherwise + */ +int ECDSA_sign_ex(int type, const unsigned char *dgst, int dgstlen, + unsigned char *sig, unsigned int *siglen, + const BIGNUM *kinv, const BIGNUM *rp, EC_KEY *eckey); + +/** Verifies that the given signature is valid ECDSA signature + * of the supplied hash value using the specified public key. + * \param type this parameter is ignored + * \param dgst pointer to the hash value + * \param dgstlen length of the hash value + * \param sig pointer to the DER encoded signature + * \param siglen length of the DER encoded signature + * \param eckey EC_KEY object containing a public EC key + * \return 1 if the signature is valid, 0 if the signature is invalid + * and -1 on error + */ +int ECDSA_verify(int type, const unsigned char *dgst, int dgstlen, + const unsigned char *sig, int siglen, EC_KEY *eckey); + +/* the standard ex_data functions */ +int ECDSA_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new + *new_func, CRYPTO_EX_dup *dup_func, + CRYPTO_EX_free *free_func); +int ECDSA_set_ex_data(EC_KEY *d, int idx, void *arg); +void *ECDSA_get_ex_data(EC_KEY *d, int idx); + +/** Allocates and initialize a ECDSA_METHOD structure + * \param ecdsa_method pointer to ECDSA_METHOD to copy. (May be NULL) + * \return pointer to a ECDSA_METHOD structure or NULL if an error occurred + */ + +ECDSA_METHOD *ECDSA_METHOD_new(const ECDSA_METHOD *ecdsa_method); + +/** frees a ECDSA_METHOD structure + * \param ecdsa_method pointer to the ECDSA_METHOD structure + */ +void ECDSA_METHOD_free(ECDSA_METHOD *ecdsa_method); + +/** Sets application specific data in the ECDSA_METHOD + * \param ecdsa_method pointer to existing ECDSA_METHOD + * \param app application specific data to set + */ + +void ECDSA_METHOD_set_app_data(ECDSA_METHOD *ecdsa_method, void *app); + +/** Returns application specific data from a ECDSA_METHOD structure + * \param ecdsa_method pointer to ECDSA_METHOD structure + * \return pointer to application specific data. + */ + +void *ECDSA_METHOD_get_app_data(ECDSA_METHOD *ecdsa_method); + +/** Set the ECDSA_do_sign function in the ECDSA_METHOD + * \param ecdsa_method pointer to existing ECDSA_METHOD + * \param ecdsa_do_sign a funtion of type ECDSA_do_sign + */ + +void ECDSA_METHOD_set_sign(ECDSA_METHOD *ecdsa_method, + ECDSA_SIG *(*ecdsa_do_sign) (const unsigned char + *dgst, int dgst_len, + const BIGNUM *inv, + const BIGNUM *rp, + EC_KEY *eckey)); + +/** Set the ECDSA_sign_setup function in the ECDSA_METHOD + * \param ecdsa_method pointer to existing ECDSA_METHOD + * \param ecdsa_sign_setup a funtion of type ECDSA_sign_setup + */ + +void ECDSA_METHOD_set_sign_setup(ECDSA_METHOD *ecdsa_method, + int (*ecdsa_sign_setup) (EC_KEY *eckey, + BN_CTX *ctx, + BIGNUM **kinv, + BIGNUM **r)); + +/** Set the ECDSA_do_verify function in the ECDSA_METHOD + * \param ecdsa_method pointer to existing ECDSA_METHOD + * \param ecdsa_do_verify a funtion of type ECDSA_do_verify + */ + +void ECDSA_METHOD_set_verify(ECDSA_METHOD *ecdsa_method, + int (*ecdsa_do_verify) (const unsigned char + *dgst, int dgst_len, + const ECDSA_SIG *sig, + EC_KEY *eckey)); + +void ECDSA_METHOD_set_flags(ECDSA_METHOD *ecdsa_method, int flags); + +/** Set the flags field in the ECDSA_METHOD + * \param ecdsa_method pointer to existing ECDSA_METHOD + * \param flags flags value to set + */ + +void ECDSA_METHOD_set_name(ECDSA_METHOD *ecdsa_method, char *name); + +/** Set the name field in the ECDSA_METHOD + * \param ecdsa_method pointer to existing ECDSA_METHOD + * \param name name to set + */ + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_ECDSA_strings(void); + +/* Error codes for the ECDSA functions. */ + +/* Function codes. */ +# define ECDSA_F_ECDSA_CHECK 104 +# define ECDSA_F_ECDSA_DATA_NEW_METHOD 100 +# define ECDSA_F_ECDSA_DO_SIGN 101 +# define ECDSA_F_ECDSA_DO_VERIFY 102 +# define ECDSA_F_ECDSA_METHOD_NEW 105 +# define ECDSA_F_ECDSA_SIGN_SETUP 103 + +/* Reason codes. */ +# define ECDSA_R_BAD_SIGNATURE 100 +# define ECDSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE 101 +# define ECDSA_R_ERR_EC_LIB 102 +# define ECDSA_R_MISSING_PARAMETERS 103 +# define ECDSA_R_NEED_NEW_SETUP_VALUES 106 +# define ECDSA_R_NON_FIPS_METHOD 107 +# define ECDSA_R_RANDOM_NUMBER_GENERATION_FAILED 104 +# define ECDSA_R_SIGNATURE_MALLOC_FAILED 105 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/engine.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/engine.h new file mode 100644 index 0000000..bd7b591 --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/engine.h @@ -0,0 +1,960 @@ +/* openssl/engine.h */ +/* + * Written by Geoff Thorpe (geoff@geoffthorpe.net) for the OpenSSL project + * 2000. + */ +/* ==================================================================== + * Copyright (c) 1999-2004 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * ECDH support in OpenSSL originally developed by + * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project. + */ + +#ifndef HEADER_ENGINE_H +# define HEADER_ENGINE_H + +# include + +# ifdef OPENSSL_NO_ENGINE +# error ENGINE is disabled. +# endif + +# ifndef OPENSSL_NO_DEPRECATED +# include +# ifndef OPENSSL_NO_RSA +# include +# endif +# ifndef OPENSSL_NO_DSA +# include +# endif +# ifndef OPENSSL_NO_DH +# include +# endif +# ifndef OPENSSL_NO_ECDH +# include +# endif +# ifndef OPENSSL_NO_ECDSA +# include +# endif +# include +# include +# include +# endif + +# include +# include + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * These flags are used to control combinations of algorithm (methods) by + * bitwise "OR"ing. + */ +# define ENGINE_METHOD_RSA (unsigned int)0x0001 +# define ENGINE_METHOD_DSA (unsigned int)0x0002 +# define ENGINE_METHOD_DH (unsigned int)0x0004 +# define ENGINE_METHOD_RAND (unsigned int)0x0008 +# define ENGINE_METHOD_ECDH (unsigned int)0x0010 +# define ENGINE_METHOD_ECDSA (unsigned int)0x0020 +# define ENGINE_METHOD_CIPHERS (unsigned int)0x0040 +# define ENGINE_METHOD_DIGESTS (unsigned int)0x0080 +# define ENGINE_METHOD_STORE (unsigned int)0x0100 +# define ENGINE_METHOD_PKEY_METHS (unsigned int)0x0200 +# define ENGINE_METHOD_PKEY_ASN1_METHS (unsigned int)0x0400 +/* Obvious all-or-nothing cases. */ +# define ENGINE_METHOD_ALL (unsigned int)0xFFFF +# define ENGINE_METHOD_NONE (unsigned int)0x0000 + +/* + * This(ese) flag(s) controls behaviour of the ENGINE_TABLE mechanism used + * internally to control registration of ENGINE implementations, and can be + * set by ENGINE_set_table_flags(). The "NOINIT" flag prevents attempts to + * initialise registered ENGINEs if they are not already initialised. + */ +# define ENGINE_TABLE_FLAG_NOINIT (unsigned int)0x0001 + +/* ENGINE flags that can be set by ENGINE_set_flags(). */ +/* Not used */ +/* #define ENGINE_FLAGS_MALLOCED 0x0001 */ + +/* + * This flag is for ENGINEs that wish to handle the various 'CMD'-related + * control commands on their own. Without this flag, ENGINE_ctrl() handles + * these control commands on behalf of the ENGINE using their "cmd_defns" + * data. + */ +# define ENGINE_FLAGS_MANUAL_CMD_CTRL (int)0x0002 + +/* + * This flag is for ENGINEs who return new duplicate structures when found + * via "ENGINE_by_id()". When an ENGINE must store state (eg. if + * ENGINE_ctrl() commands are called in sequence as part of some stateful + * process like key-generation setup and execution), it can set this flag - + * then each attempt to obtain the ENGINE will result in it being copied into + * a new structure. Normally, ENGINEs don't declare this flag so + * ENGINE_by_id() just increments the existing ENGINE's structural reference + * count. + */ +# define ENGINE_FLAGS_BY_ID_COPY (int)0x0004 + +/* + * This flag if for an ENGINE that does not want its methods registered as + * part of ENGINE_register_all_complete() for example if the methods are not + * usable as default methods. + */ + +# define ENGINE_FLAGS_NO_REGISTER_ALL (int)0x0008 + +/* + * ENGINEs can support their own command types, and these flags are used in + * ENGINE_CTRL_GET_CMD_FLAGS to indicate to the caller what kind of input + * each command expects. Currently only numeric and string input is + * supported. If a control command supports none of the _NUMERIC, _STRING, or + * _NO_INPUT options, then it is regarded as an "internal" control command - + * and not for use in config setting situations. As such, they're not + * available to the ENGINE_ctrl_cmd_string() function, only raw ENGINE_ctrl() + * access. Changes to this list of 'command types' should be reflected + * carefully in ENGINE_cmd_is_executable() and ENGINE_ctrl_cmd_string(). + */ + +/* accepts a 'long' input value (3rd parameter to ENGINE_ctrl) */ +# define ENGINE_CMD_FLAG_NUMERIC (unsigned int)0x0001 +/* + * accepts string input (cast from 'void*' to 'const char *', 4th parameter + * to ENGINE_ctrl) + */ +# define ENGINE_CMD_FLAG_STRING (unsigned int)0x0002 +/* + * Indicates that the control command takes *no* input. Ie. the control + * command is unparameterised. + */ +# define ENGINE_CMD_FLAG_NO_INPUT (unsigned int)0x0004 +/* + * Indicates that the control command is internal. This control command won't + * be shown in any output, and is only usable through the ENGINE_ctrl_cmd() + * function. + */ +# define ENGINE_CMD_FLAG_INTERNAL (unsigned int)0x0008 + +/* + * NB: These 3 control commands are deprecated and should not be used. + * ENGINEs relying on these commands should compile conditional support for + * compatibility (eg. if these symbols are defined) but should also migrate + * the same functionality to their own ENGINE-specific control functions that + * can be "discovered" by calling applications. The fact these control + * commands wouldn't be "executable" (ie. usable by text-based config) + * doesn't change the fact that application code can find and use them + * without requiring per-ENGINE hacking. + */ + +/* + * These flags are used to tell the ctrl function what should be done. All + * command numbers are shared between all engines, even if some don't make + * sense to some engines. In such a case, they do nothing but return the + * error ENGINE_R_CTRL_COMMAND_NOT_IMPLEMENTED. + */ +# define ENGINE_CTRL_SET_LOGSTREAM 1 +# define ENGINE_CTRL_SET_PASSWORD_CALLBACK 2 +# define ENGINE_CTRL_HUP 3/* Close and reinitialise + * any handles/connections + * etc. */ +# define ENGINE_CTRL_SET_USER_INTERFACE 4/* Alternative to callback */ +# define ENGINE_CTRL_SET_CALLBACK_DATA 5/* User-specific data, used + * when calling the password + * callback and the user + * interface */ +# define ENGINE_CTRL_LOAD_CONFIGURATION 6/* Load a configuration, + * given a string that + * represents a file name + * or so */ +# define ENGINE_CTRL_LOAD_SECTION 7/* Load data from a given + * section in the already + * loaded configuration */ + +/* + * These control commands allow an application to deal with an arbitrary + * engine in a dynamic way. Warn: Negative return values indicate errors FOR + * THESE COMMANDS because zero is used to indicate 'end-of-list'. Other + * commands, including ENGINE-specific command types, return zero for an + * error. An ENGINE can choose to implement these ctrl functions, and can + * internally manage things however it chooses - it does so by setting the + * ENGINE_FLAGS_MANUAL_CMD_CTRL flag (using ENGINE_set_flags()). Otherwise + * the ENGINE_ctrl() code handles this on the ENGINE's behalf using the + * cmd_defns data (set using ENGINE_set_cmd_defns()). This means an ENGINE's + * ctrl() handler need only implement its own commands - the above "meta" + * commands will be taken care of. + */ + +/* + * Returns non-zero if the supplied ENGINE has a ctrl() handler. If "not", + * then all the remaining control commands will return failure, so it is + * worth checking this first if the caller is trying to "discover" the + * engine's capabilities and doesn't want errors generated unnecessarily. + */ +# define ENGINE_CTRL_HAS_CTRL_FUNCTION 10 +/* + * Returns a positive command number for the first command supported by the + * engine. Returns zero if no ctrl commands are supported. + */ +# define ENGINE_CTRL_GET_FIRST_CMD_TYPE 11 +/* + * The 'long' argument specifies a command implemented by the engine, and the + * return value is the next command supported, or zero if there are no more. + */ +# define ENGINE_CTRL_GET_NEXT_CMD_TYPE 12 +/* + * The 'void*' argument is a command name (cast from 'const char *'), and the + * return value is the command that corresponds to it. + */ +# define ENGINE_CTRL_GET_CMD_FROM_NAME 13 +/* + * The next two allow a command to be converted into its corresponding string + * form. In each case, the 'long' argument supplies the command. In the + * NAME_LEN case, the return value is the length of the command name (not + * counting a trailing EOL). In the NAME case, the 'void*' argument must be a + * string buffer large enough, and it will be populated with the name of the + * command (WITH a trailing EOL). + */ +# define ENGINE_CTRL_GET_NAME_LEN_FROM_CMD 14 +# define ENGINE_CTRL_GET_NAME_FROM_CMD 15 +/* The next two are similar but give a "short description" of a command. */ +# define ENGINE_CTRL_GET_DESC_LEN_FROM_CMD 16 +# define ENGINE_CTRL_GET_DESC_FROM_CMD 17 +/* + * With this command, the return value is the OR'd combination of + * ENGINE_CMD_FLAG_*** values that indicate what kind of input a given + * engine-specific ctrl command expects. + */ +# define ENGINE_CTRL_GET_CMD_FLAGS 18 + +/* + * ENGINE implementations should start the numbering of their own control + * commands from this value. (ie. ENGINE_CMD_BASE, ENGINE_CMD_BASE + 1, etc). + */ +# define ENGINE_CMD_BASE 200 + +/* + * NB: These 2 nCipher "chil" control commands are deprecated, and their + * functionality is now available through ENGINE-specific control commands + * (exposed through the above-mentioned 'CMD'-handling). Code using these 2 + * commands should be migrated to the more general command handling before + * these are removed. + */ + +/* Flags specific to the nCipher "chil" engine */ +# define ENGINE_CTRL_CHIL_SET_FORKCHECK 100 + /* + * Depending on the value of the (long)i argument, this sets or + * unsets the SimpleForkCheck flag in the CHIL API to enable or + * disable checking and workarounds for applications that fork(). + */ +# define ENGINE_CTRL_CHIL_NO_LOCKING 101 + /* + * This prevents the initialisation function from providing mutex + * callbacks to the nCipher library. + */ + +/* + * If an ENGINE supports its own specific control commands and wishes the + * framework to handle the above 'ENGINE_CMD_***'-manipulation commands on + * its behalf, it should supply a null-terminated array of ENGINE_CMD_DEFN + * entries to ENGINE_set_cmd_defns(). It should also implement a ctrl() + * handler that supports the stated commands (ie. the "cmd_num" entries as + * described by the array). NB: The array must be ordered in increasing order + * of cmd_num. "null-terminated" means that the last ENGINE_CMD_DEFN element + * has cmd_num set to zero and/or cmd_name set to NULL. + */ +typedef struct ENGINE_CMD_DEFN_st { + unsigned int cmd_num; /* The command number */ + const char *cmd_name; /* The command name itself */ + const char *cmd_desc; /* A short description of the command */ + unsigned int cmd_flags; /* The input the command expects */ +} ENGINE_CMD_DEFN; + +/* Generic function pointer */ +typedef int (*ENGINE_GEN_FUNC_PTR) (void); +/* Generic function pointer taking no arguments */ +typedef int (*ENGINE_GEN_INT_FUNC_PTR) (ENGINE *); +/* Specific control function pointer */ +typedef int (*ENGINE_CTRL_FUNC_PTR) (ENGINE *, int, long, void *, + void (*f) (void)); +/* Generic load_key function pointer */ +typedef EVP_PKEY *(*ENGINE_LOAD_KEY_PTR)(ENGINE *, const char *, + UI_METHOD *ui_method, + void *callback_data); +typedef int (*ENGINE_SSL_CLIENT_CERT_PTR) (ENGINE *, SSL *ssl, + STACK_OF(X509_NAME) *ca_dn, + X509 **pcert, EVP_PKEY **pkey, + STACK_OF(X509) **pother, + UI_METHOD *ui_method, + void *callback_data); +/*- + * These callback types are for an ENGINE's handler for cipher and digest logic. + * These handlers have these prototypes; + * int foo(ENGINE *e, const EVP_CIPHER **cipher, const int **nids, int nid); + * int foo(ENGINE *e, const EVP_MD **digest, const int **nids, int nid); + * Looking at how to implement these handlers in the case of cipher support, if + * the framework wants the EVP_CIPHER for 'nid', it will call; + * foo(e, &p_evp_cipher, NULL, nid); (return zero for failure) + * If the framework wants a list of supported 'nid's, it will call; + * foo(e, NULL, &p_nids, 0); (returns number of 'nids' or -1 for error) + */ +/* + * Returns to a pointer to the array of supported cipher 'nid's. If the + * second parameter is non-NULL it is set to the size of the returned array. + */ +typedef int (*ENGINE_CIPHERS_PTR) (ENGINE *, const EVP_CIPHER **, + const int **, int); +typedef int (*ENGINE_DIGESTS_PTR) (ENGINE *, const EVP_MD **, const int **, + int); +typedef int (*ENGINE_PKEY_METHS_PTR) (ENGINE *, EVP_PKEY_METHOD **, + const int **, int); +typedef int (*ENGINE_PKEY_ASN1_METHS_PTR) (ENGINE *, EVP_PKEY_ASN1_METHOD **, + const int **, int); +/* + * STRUCTURE functions ... all of these functions deal with pointers to + * ENGINE structures where the pointers have a "structural reference". This + * means that their reference is to allowed access to the structure but it + * does not imply that the structure is functional. To simply increment or + * decrement the structural reference count, use ENGINE_by_id and + * ENGINE_free. NB: This is not required when iterating using ENGINE_get_next + * as it will automatically decrement the structural reference count of the + * "current" ENGINE and increment the structural reference count of the + * ENGINE it returns (unless it is NULL). + */ + +/* Get the first/last "ENGINE" type available. */ +ENGINE *ENGINE_get_first(void); +ENGINE *ENGINE_get_last(void); +/* Iterate to the next/previous "ENGINE" type (NULL = end of the list). */ +ENGINE *ENGINE_get_next(ENGINE *e); +ENGINE *ENGINE_get_prev(ENGINE *e); +/* Add another "ENGINE" type into the array. */ +int ENGINE_add(ENGINE *e); +/* Remove an existing "ENGINE" type from the array. */ +int ENGINE_remove(ENGINE *e); +/* Retrieve an engine from the list by its unique "id" value. */ +ENGINE *ENGINE_by_id(const char *id); +/* Add all the built-in engines. */ +void ENGINE_load_openssl(void); +void ENGINE_load_dynamic(void); +# ifndef OPENSSL_NO_STATIC_ENGINE +void ENGINE_load_4758cca(void); +void ENGINE_load_aep(void); +void ENGINE_load_atalla(void); +void ENGINE_load_chil(void); +void ENGINE_load_cswift(void); +void ENGINE_load_nuron(void); +void ENGINE_load_sureware(void); +void ENGINE_load_ubsec(void); +void ENGINE_load_padlock(void); +void ENGINE_load_capi(void); +# ifndef OPENSSL_NO_GMP +void ENGINE_load_gmp(void); +# endif +# ifndef OPENSSL_NO_GOST +void ENGINE_load_gost(void); +# endif +# endif +void ENGINE_load_cryptodev(void); +void ENGINE_load_rdrand(void); +void ENGINE_load_builtin_engines(void); + +/* + * Get and set global flags (ENGINE_TABLE_FLAG_***) for the implementation + * "registry" handling. + */ +unsigned int ENGINE_get_table_flags(void); +void ENGINE_set_table_flags(unsigned int flags); + +/*- Manage registration of ENGINEs per "table". For each type, there are 3 + * functions; + * ENGINE_register_***(e) - registers the implementation from 'e' (if it has one) + * ENGINE_unregister_***(e) - unregister the implementation from 'e' + * ENGINE_register_all_***() - call ENGINE_register_***() for each 'e' in the list + * Cleanup is automatically registered from each table when required, so + * ENGINE_cleanup() will reverse any "register" operations. + */ + +int ENGINE_register_RSA(ENGINE *e); +void ENGINE_unregister_RSA(ENGINE *e); +void ENGINE_register_all_RSA(void); + +int ENGINE_register_DSA(ENGINE *e); +void ENGINE_unregister_DSA(ENGINE *e); +void ENGINE_register_all_DSA(void); + +int ENGINE_register_ECDH(ENGINE *e); +void ENGINE_unregister_ECDH(ENGINE *e); +void ENGINE_register_all_ECDH(void); + +int ENGINE_register_ECDSA(ENGINE *e); +void ENGINE_unregister_ECDSA(ENGINE *e); +void ENGINE_register_all_ECDSA(void); + +int ENGINE_register_DH(ENGINE *e); +void ENGINE_unregister_DH(ENGINE *e); +void ENGINE_register_all_DH(void); + +int ENGINE_register_RAND(ENGINE *e); +void ENGINE_unregister_RAND(ENGINE *e); +void ENGINE_register_all_RAND(void); + +int ENGINE_register_STORE(ENGINE *e); +void ENGINE_unregister_STORE(ENGINE *e); +void ENGINE_register_all_STORE(void); + +int ENGINE_register_ciphers(ENGINE *e); +void ENGINE_unregister_ciphers(ENGINE *e); +void ENGINE_register_all_ciphers(void); + +int ENGINE_register_digests(ENGINE *e); +void ENGINE_unregister_digests(ENGINE *e); +void ENGINE_register_all_digests(void); + +int ENGINE_register_pkey_meths(ENGINE *e); +void ENGINE_unregister_pkey_meths(ENGINE *e); +void ENGINE_register_all_pkey_meths(void); + +int ENGINE_register_pkey_asn1_meths(ENGINE *e); +void ENGINE_unregister_pkey_asn1_meths(ENGINE *e); +void ENGINE_register_all_pkey_asn1_meths(void); + +/* + * These functions register all support from the above categories. Note, use + * of these functions can result in static linkage of code your application + * may not need. If you only need a subset of functionality, consider using + * more selective initialisation. + */ +int ENGINE_register_complete(ENGINE *e); +int ENGINE_register_all_complete(void); + +/* + * Send parametrised control commands to the engine. The possibilities to + * send down an integer, a pointer to data or a function pointer are + * provided. Any of the parameters may or may not be NULL, depending on the + * command number. In actuality, this function only requires a structural + * (rather than functional) reference to an engine, but many control commands + * may require the engine be functional. The caller should be aware of trying + * commands that require an operational ENGINE, and only use functional + * references in such situations. + */ +int ENGINE_ctrl(ENGINE *e, int cmd, long i, void *p, void (*f) (void)); + +/* + * This function tests if an ENGINE-specific command is usable as a + * "setting". Eg. in an application's config file that gets processed through + * ENGINE_ctrl_cmd_string(). If this returns zero, it is not available to + * ENGINE_ctrl_cmd_string(), only ENGINE_ctrl(). + */ +int ENGINE_cmd_is_executable(ENGINE *e, int cmd); + +/* + * This function works like ENGINE_ctrl() with the exception of taking a + * command name instead of a command number, and can handle optional + * commands. See the comment on ENGINE_ctrl_cmd_string() for an explanation + * on how to use the cmd_name and cmd_optional. + */ +int ENGINE_ctrl_cmd(ENGINE *e, const char *cmd_name, + long i, void *p, void (*f) (void), int cmd_optional); + +/* + * This function passes a command-name and argument to an ENGINE. The + * cmd_name is converted to a command number and the control command is + * called using 'arg' as an argument (unless the ENGINE doesn't support such + * a command, in which case no control command is called). The command is + * checked for input flags, and if necessary the argument will be converted + * to a numeric value. If cmd_optional is non-zero, then if the ENGINE + * doesn't support the given cmd_name the return value will be success + * anyway. This function is intended for applications to use so that users + * (or config files) can supply engine-specific config data to the ENGINE at + * run-time to control behaviour of specific engines. As such, it shouldn't + * be used for calling ENGINE_ctrl() functions that return data, deal with + * binary data, or that are otherwise supposed to be used directly through + * ENGINE_ctrl() in application code. Any "return" data from an ENGINE_ctrl() + * operation in this function will be lost - the return value is interpreted + * as failure if the return value is zero, success otherwise, and this + * function returns a boolean value as a result. In other words, vendors of + * 'ENGINE'-enabled devices should write ENGINE implementations with + * parameterisations that work in this scheme, so that compliant ENGINE-based + * applications can work consistently with the same configuration for the + * same ENGINE-enabled devices, across applications. + */ +int ENGINE_ctrl_cmd_string(ENGINE *e, const char *cmd_name, const char *arg, + int cmd_optional); + +/* + * These functions are useful for manufacturing new ENGINE structures. They + * don't address reference counting at all - one uses them to populate an + * ENGINE structure with personalised implementations of things prior to + * using it directly or adding it to the builtin ENGINE list in OpenSSL. + * These are also here so that the ENGINE structure doesn't have to be + * exposed and break binary compatibility! + */ +ENGINE *ENGINE_new(void); +int ENGINE_free(ENGINE *e); +int ENGINE_up_ref(ENGINE *e); +int ENGINE_set_id(ENGINE *e, const char *id); +int ENGINE_set_name(ENGINE *e, const char *name); +int ENGINE_set_RSA(ENGINE *e, const RSA_METHOD *rsa_meth); +int ENGINE_set_DSA(ENGINE *e, const DSA_METHOD *dsa_meth); +int ENGINE_set_ECDH(ENGINE *e, const ECDH_METHOD *ecdh_meth); +int ENGINE_set_ECDSA(ENGINE *e, const ECDSA_METHOD *ecdsa_meth); +int ENGINE_set_DH(ENGINE *e, const DH_METHOD *dh_meth); +int ENGINE_set_RAND(ENGINE *e, const RAND_METHOD *rand_meth); +int ENGINE_set_STORE(ENGINE *e, const STORE_METHOD *store_meth); +int ENGINE_set_destroy_function(ENGINE *e, ENGINE_GEN_INT_FUNC_PTR destroy_f); +int ENGINE_set_init_function(ENGINE *e, ENGINE_GEN_INT_FUNC_PTR init_f); +int ENGINE_set_finish_function(ENGINE *e, ENGINE_GEN_INT_FUNC_PTR finish_f); +int ENGINE_set_ctrl_function(ENGINE *e, ENGINE_CTRL_FUNC_PTR ctrl_f); +int ENGINE_set_load_privkey_function(ENGINE *e, + ENGINE_LOAD_KEY_PTR loadpriv_f); +int ENGINE_set_load_pubkey_function(ENGINE *e, ENGINE_LOAD_KEY_PTR loadpub_f); +int ENGINE_set_load_ssl_client_cert_function(ENGINE *e, + ENGINE_SSL_CLIENT_CERT_PTR + loadssl_f); +int ENGINE_set_ciphers(ENGINE *e, ENGINE_CIPHERS_PTR f); +int ENGINE_set_digests(ENGINE *e, ENGINE_DIGESTS_PTR f); +int ENGINE_set_pkey_meths(ENGINE *e, ENGINE_PKEY_METHS_PTR f); +int ENGINE_set_pkey_asn1_meths(ENGINE *e, ENGINE_PKEY_ASN1_METHS_PTR f); +int ENGINE_set_flags(ENGINE *e, int flags); +int ENGINE_set_cmd_defns(ENGINE *e, const ENGINE_CMD_DEFN *defns); +/* These functions allow control over any per-structure ENGINE data. */ +int ENGINE_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, + CRYPTO_EX_free *free_func); +int ENGINE_set_ex_data(ENGINE *e, int idx, void *arg); +void *ENGINE_get_ex_data(const ENGINE *e, int idx); + +/* + * This function cleans up anything that needs it. Eg. the ENGINE_add() + * function automatically ensures the list cleanup function is registered to + * be called from ENGINE_cleanup(). Similarly, all ENGINE_register_*** + * functions ensure ENGINE_cleanup() will clean up after them. + */ +void ENGINE_cleanup(void); + +/* + * These return values from within the ENGINE structure. These can be useful + * with functional references as well as structural references - it depends + * which you obtained. Using the result for functional purposes if you only + * obtained a structural reference may be problematic! + */ +const char *ENGINE_get_id(const ENGINE *e); +const char *ENGINE_get_name(const ENGINE *e); +const RSA_METHOD *ENGINE_get_RSA(const ENGINE *e); +const DSA_METHOD *ENGINE_get_DSA(const ENGINE *e); +const ECDH_METHOD *ENGINE_get_ECDH(const ENGINE *e); +const ECDSA_METHOD *ENGINE_get_ECDSA(const ENGINE *e); +const DH_METHOD *ENGINE_get_DH(const ENGINE *e); +const RAND_METHOD *ENGINE_get_RAND(const ENGINE *e); +const STORE_METHOD *ENGINE_get_STORE(const ENGINE *e); +ENGINE_GEN_INT_FUNC_PTR ENGINE_get_destroy_function(const ENGINE *e); +ENGINE_GEN_INT_FUNC_PTR ENGINE_get_init_function(const ENGINE *e); +ENGINE_GEN_INT_FUNC_PTR ENGINE_get_finish_function(const ENGINE *e); +ENGINE_CTRL_FUNC_PTR ENGINE_get_ctrl_function(const ENGINE *e); +ENGINE_LOAD_KEY_PTR ENGINE_get_load_privkey_function(const ENGINE *e); +ENGINE_LOAD_KEY_PTR ENGINE_get_load_pubkey_function(const ENGINE *e); +ENGINE_SSL_CLIENT_CERT_PTR ENGINE_get_ssl_client_cert_function(const ENGINE + *e); +ENGINE_CIPHERS_PTR ENGINE_get_ciphers(const ENGINE *e); +ENGINE_DIGESTS_PTR ENGINE_get_digests(const ENGINE *e); +ENGINE_PKEY_METHS_PTR ENGINE_get_pkey_meths(const ENGINE *e); +ENGINE_PKEY_ASN1_METHS_PTR ENGINE_get_pkey_asn1_meths(const ENGINE *e); +const EVP_CIPHER *ENGINE_get_cipher(ENGINE *e, int nid); +const EVP_MD *ENGINE_get_digest(ENGINE *e, int nid); +const EVP_PKEY_METHOD *ENGINE_get_pkey_meth(ENGINE *e, int nid); +const EVP_PKEY_ASN1_METHOD *ENGINE_get_pkey_asn1_meth(ENGINE *e, int nid); +const EVP_PKEY_ASN1_METHOD *ENGINE_get_pkey_asn1_meth_str(ENGINE *e, + const char *str, + int len); +const EVP_PKEY_ASN1_METHOD *ENGINE_pkey_asn1_find_str(ENGINE **pe, + const char *str, + int len); +const ENGINE_CMD_DEFN *ENGINE_get_cmd_defns(const ENGINE *e); +int ENGINE_get_flags(const ENGINE *e); + +/* + * FUNCTIONAL functions. These functions deal with ENGINE structures that + * have (or will) be initialised for use. Broadly speaking, the structural + * functions are useful for iterating the list of available engine types, + * creating new engine types, and other "list" operations. These functions + * actually deal with ENGINEs that are to be used. As such these functions + * can fail (if applicable) when particular engines are unavailable - eg. if + * a hardware accelerator is not attached or not functioning correctly. Each + * ENGINE has 2 reference counts; structural and functional. Every time a + * functional reference is obtained or released, a corresponding structural + * reference is automatically obtained or released too. + */ + +/* + * Initialise a engine type for use (or up its reference count if it's + * already in use). This will fail if the engine is not currently operational + * and cannot initialise. + */ +int ENGINE_init(ENGINE *e); +/* + * Free a functional reference to a engine type. This does not require a + * corresponding call to ENGINE_free as it also releases a structural + * reference. + */ +int ENGINE_finish(ENGINE *e); + +/* + * The following functions handle keys that are stored in some secondary + * location, handled by the engine. The storage may be on a card or + * whatever. + */ +EVP_PKEY *ENGINE_load_private_key(ENGINE *e, const char *key_id, + UI_METHOD *ui_method, void *callback_data); +EVP_PKEY *ENGINE_load_public_key(ENGINE *e, const char *key_id, + UI_METHOD *ui_method, void *callback_data); +int ENGINE_load_ssl_client_cert(ENGINE *e, SSL *s, + STACK_OF(X509_NAME) *ca_dn, X509 **pcert, + EVP_PKEY **ppkey, STACK_OF(X509) **pother, + UI_METHOD *ui_method, void *callback_data); + +/* + * This returns a pointer for the current ENGINE structure that is (by + * default) performing any RSA operations. The value returned is an + * incremented reference, so it should be free'd (ENGINE_finish) before it is + * discarded. + */ +ENGINE *ENGINE_get_default_RSA(void); +/* Same for the other "methods" */ +ENGINE *ENGINE_get_default_DSA(void); +ENGINE *ENGINE_get_default_ECDH(void); +ENGINE *ENGINE_get_default_ECDSA(void); +ENGINE *ENGINE_get_default_DH(void); +ENGINE *ENGINE_get_default_RAND(void); +/* + * These functions can be used to get a functional reference to perform + * ciphering or digesting corresponding to "nid". + */ +ENGINE *ENGINE_get_cipher_engine(int nid); +ENGINE *ENGINE_get_digest_engine(int nid); +ENGINE *ENGINE_get_pkey_meth_engine(int nid); +ENGINE *ENGINE_get_pkey_asn1_meth_engine(int nid); + +/* + * This sets a new default ENGINE structure for performing RSA operations. If + * the result is non-zero (success) then the ENGINE structure will have had + * its reference count up'd so the caller should still free their own + * reference 'e'. + */ +int ENGINE_set_default_RSA(ENGINE *e); +int ENGINE_set_default_string(ENGINE *e, const char *def_list); +/* Same for the other "methods" */ +int ENGINE_set_default_DSA(ENGINE *e); +int ENGINE_set_default_ECDH(ENGINE *e); +int ENGINE_set_default_ECDSA(ENGINE *e); +int ENGINE_set_default_DH(ENGINE *e); +int ENGINE_set_default_RAND(ENGINE *e); +int ENGINE_set_default_ciphers(ENGINE *e); +int ENGINE_set_default_digests(ENGINE *e); +int ENGINE_set_default_pkey_meths(ENGINE *e); +int ENGINE_set_default_pkey_asn1_meths(ENGINE *e); + +/* + * The combination "set" - the flags are bitwise "OR"d from the + * ENGINE_METHOD_*** defines above. As with the "ENGINE_register_complete()" + * function, this function can result in unnecessary static linkage. If your + * application requires only specific functionality, consider using more + * selective functions. + */ +int ENGINE_set_default(ENGINE *e, unsigned int flags); + +void ENGINE_add_conf_module(void); + +/* Deprecated functions ... */ +/* int ENGINE_clear_defaults(void); */ + +/**************************/ +/* DYNAMIC ENGINE SUPPORT */ +/**************************/ + +/* Binary/behaviour compatibility levels */ +# define OSSL_DYNAMIC_VERSION (unsigned long)0x00020000 +/* + * Binary versions older than this are too old for us (whether we're a loader + * or a loadee) + */ +# define OSSL_DYNAMIC_OLDEST (unsigned long)0x00020000 + +/* + * When compiling an ENGINE entirely as an external shared library, loadable + * by the "dynamic" ENGINE, these types are needed. The 'dynamic_fns' + * structure type provides the calling application's (or library's) error + * functionality and memory management function pointers to the loaded + * library. These should be used/set in the loaded library code so that the + * loading application's 'state' will be used/changed in all operations. The + * 'static_state' pointer allows the loaded library to know if it shares the + * same static data as the calling application (or library), and thus whether + * these callbacks need to be set or not. + */ +typedef void *(*dyn_MEM_malloc_cb) (size_t); +typedef void *(*dyn_MEM_realloc_cb) (void *, size_t); +typedef void (*dyn_MEM_free_cb) (void *); +typedef struct st_dynamic_MEM_fns { + dyn_MEM_malloc_cb malloc_cb; + dyn_MEM_realloc_cb realloc_cb; + dyn_MEM_free_cb free_cb; +} dynamic_MEM_fns; +/* + * FIXME: Perhaps the memory and locking code (crypto.h) should declare and + * use these types so we (and any other dependant code) can simplify a bit?? + */ +typedef void (*dyn_lock_locking_cb) (int, int, const char *, int); +typedef int (*dyn_lock_add_lock_cb) (int *, int, int, const char *, int); +typedef struct CRYPTO_dynlock_value *(*dyn_dynlock_create_cb) (const char *, + int); +typedef void (*dyn_dynlock_lock_cb) (int, struct CRYPTO_dynlock_value *, + const char *, int); +typedef void (*dyn_dynlock_destroy_cb) (struct CRYPTO_dynlock_value *, + const char *, int); +typedef struct st_dynamic_LOCK_fns { + dyn_lock_locking_cb lock_locking_cb; + dyn_lock_add_lock_cb lock_add_lock_cb; + dyn_dynlock_create_cb dynlock_create_cb; + dyn_dynlock_lock_cb dynlock_lock_cb; + dyn_dynlock_destroy_cb dynlock_destroy_cb; +} dynamic_LOCK_fns; +/* The top-level structure */ +typedef struct st_dynamic_fns { + void *static_state; + const ERR_FNS *err_fns; + const CRYPTO_EX_DATA_IMPL *ex_data_fns; + dynamic_MEM_fns mem_fns; + dynamic_LOCK_fns lock_fns; +} dynamic_fns; + +/* + * The version checking function should be of this prototype. NB: The + * ossl_version value passed in is the OSSL_DYNAMIC_VERSION of the loading + * code. If this function returns zero, it indicates a (potential) version + * incompatibility and the loaded library doesn't believe it can proceed. + * Otherwise, the returned value is the (latest) version supported by the + * loading library. The loader may still decide that the loaded code's + * version is unsatisfactory and could veto the load. The function is + * expected to be implemented with the symbol name "v_check", and a default + * implementation can be fully instantiated with + * IMPLEMENT_DYNAMIC_CHECK_FN(). + */ +typedef unsigned long (*dynamic_v_check_fn) (unsigned long ossl_version); +# define IMPLEMENT_DYNAMIC_CHECK_FN() \ + OPENSSL_EXPORT unsigned long v_check(unsigned long v); \ + OPENSSL_EXPORT unsigned long v_check(unsigned long v) { \ + if(v >= OSSL_DYNAMIC_OLDEST) return OSSL_DYNAMIC_VERSION; \ + return 0; } + +/* + * This function is passed the ENGINE structure to initialise with its own + * function and command settings. It should not adjust the structural or + * functional reference counts. If this function returns zero, (a) the load + * will be aborted, (b) the previous ENGINE state will be memcpy'd back onto + * the structure, and (c) the shared library will be unloaded. So + * implementations should do their own internal cleanup in failure + * circumstances otherwise they could leak. The 'id' parameter, if non-NULL, + * represents the ENGINE id that the loader is looking for. If this is NULL, + * the shared library can choose to return failure or to initialise a + * 'default' ENGINE. If non-NULL, the shared library must initialise only an + * ENGINE matching the passed 'id'. The function is expected to be + * implemented with the symbol name "bind_engine". A standard implementation + * can be instantiated with IMPLEMENT_DYNAMIC_BIND_FN(fn) where the parameter + * 'fn' is a callback function that populates the ENGINE structure and + * returns an int value (zero for failure). 'fn' should have prototype; + * [static] int fn(ENGINE *e, const char *id); + */ +typedef int (*dynamic_bind_engine) (ENGINE *e, const char *id, + const dynamic_fns *fns); +# define IMPLEMENT_DYNAMIC_BIND_FN(fn) \ + OPENSSL_EXPORT \ + int bind_engine(ENGINE *e, const char *id, const dynamic_fns *fns); \ + OPENSSL_EXPORT \ + int bind_engine(ENGINE *e, const char *id, const dynamic_fns *fns) { \ + if(ENGINE_get_static_state() == fns->static_state) goto skip_cbs; \ + if(!CRYPTO_set_mem_functions(fns->mem_fns.malloc_cb, \ + fns->mem_fns.realloc_cb, fns->mem_fns.free_cb)) \ + return 0; \ + CRYPTO_set_locking_callback(fns->lock_fns.lock_locking_cb); \ + CRYPTO_set_add_lock_callback(fns->lock_fns.lock_add_lock_cb); \ + CRYPTO_set_dynlock_create_callback(fns->lock_fns.dynlock_create_cb); \ + CRYPTO_set_dynlock_lock_callback(fns->lock_fns.dynlock_lock_cb); \ + CRYPTO_set_dynlock_destroy_callback(fns->lock_fns.dynlock_destroy_cb); \ + if(!CRYPTO_set_ex_data_implementation(fns->ex_data_fns)) \ + return 0; \ + if(!ERR_set_implementation(fns->err_fns)) return 0; \ + skip_cbs: \ + if(!fn(e,id)) return 0; \ + return 1; } + +/* + * If the loading application (or library) and the loaded ENGINE library + * share the same static data (eg. they're both dynamically linked to the + * same libcrypto.so) we need a way to avoid trying to set system callbacks - + * this would fail, and for the same reason that it's unnecessary to try. If + * the loaded ENGINE has (or gets from through the loader) its own copy of + * the libcrypto static data, we will need to set the callbacks. The easiest + * way to detect this is to have a function that returns a pointer to some + * static data and let the loading application and loaded ENGINE compare + * their respective values. + */ +void *ENGINE_get_static_state(void); + +# if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(HAVE_CRYPTODEV) +void ENGINE_setup_bsd_cryptodev(void); +# endif + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_ENGINE_strings(void); + +/* Error codes for the ENGINE functions. */ + +/* Function codes. */ +# define ENGINE_F_DYNAMIC_CTRL 180 +# define ENGINE_F_DYNAMIC_GET_DATA_CTX 181 +# define ENGINE_F_DYNAMIC_LOAD 182 +# define ENGINE_F_DYNAMIC_SET_DATA_CTX 183 +# define ENGINE_F_ENGINE_ADD 105 +# define ENGINE_F_ENGINE_BY_ID 106 +# define ENGINE_F_ENGINE_CMD_IS_EXECUTABLE 170 +# define ENGINE_F_ENGINE_CTRL 142 +# define ENGINE_F_ENGINE_CTRL_CMD 178 +# define ENGINE_F_ENGINE_CTRL_CMD_STRING 171 +# define ENGINE_F_ENGINE_FINISH 107 +# define ENGINE_F_ENGINE_FREE_UTIL 108 +# define ENGINE_F_ENGINE_GET_CIPHER 185 +# define ENGINE_F_ENGINE_GET_DEFAULT_TYPE 177 +# define ENGINE_F_ENGINE_GET_DIGEST 186 +# define ENGINE_F_ENGINE_GET_NEXT 115 +# define ENGINE_F_ENGINE_GET_PKEY_ASN1_METH 193 +# define ENGINE_F_ENGINE_GET_PKEY_METH 192 +# define ENGINE_F_ENGINE_GET_PREV 116 +# define ENGINE_F_ENGINE_INIT 119 +# define ENGINE_F_ENGINE_LIST_ADD 120 +# define ENGINE_F_ENGINE_LIST_REMOVE 121 +# define ENGINE_F_ENGINE_LOAD_PRIVATE_KEY 150 +# define ENGINE_F_ENGINE_LOAD_PUBLIC_KEY 151 +# define ENGINE_F_ENGINE_LOAD_SSL_CLIENT_CERT 194 +# define ENGINE_F_ENGINE_NEW 122 +# define ENGINE_F_ENGINE_REMOVE 123 +# define ENGINE_F_ENGINE_SET_DEFAULT_STRING 189 +# define ENGINE_F_ENGINE_SET_DEFAULT_TYPE 126 +# define ENGINE_F_ENGINE_SET_ID 129 +# define ENGINE_F_ENGINE_SET_NAME 130 +# define ENGINE_F_ENGINE_TABLE_REGISTER 184 +# define ENGINE_F_ENGINE_UNLOAD_KEY 152 +# define ENGINE_F_ENGINE_UNLOCKED_FINISH 191 +# define ENGINE_F_ENGINE_UP_REF 190 +# define ENGINE_F_INT_CTRL_HELPER 172 +# define ENGINE_F_INT_ENGINE_CONFIGURE 188 +# define ENGINE_F_INT_ENGINE_MODULE_INIT 187 +# define ENGINE_F_LOG_MESSAGE 141 + +/* Reason codes. */ +# define ENGINE_R_ALREADY_LOADED 100 +# define ENGINE_R_ARGUMENT_IS_NOT_A_NUMBER 133 +# define ENGINE_R_CMD_NOT_EXECUTABLE 134 +# define ENGINE_R_COMMAND_TAKES_INPUT 135 +# define ENGINE_R_COMMAND_TAKES_NO_INPUT 136 +# define ENGINE_R_CONFLICTING_ENGINE_ID 103 +# define ENGINE_R_CTRL_COMMAND_NOT_IMPLEMENTED 119 +# define ENGINE_R_DH_NOT_IMPLEMENTED 139 +# define ENGINE_R_DSA_NOT_IMPLEMENTED 140 +# define ENGINE_R_DSO_FAILURE 104 +# define ENGINE_R_DSO_NOT_FOUND 132 +# define ENGINE_R_ENGINES_SECTION_ERROR 148 +# define ENGINE_R_ENGINE_CONFIGURATION_ERROR 102 +# define ENGINE_R_ENGINE_IS_NOT_IN_LIST 105 +# define ENGINE_R_ENGINE_SECTION_ERROR 149 +# define ENGINE_R_FAILED_LOADING_PRIVATE_KEY 128 +# define ENGINE_R_FAILED_LOADING_PUBLIC_KEY 129 +# define ENGINE_R_FINISH_FAILED 106 +# define ENGINE_R_GET_HANDLE_FAILED 107 +# define ENGINE_R_ID_OR_NAME_MISSING 108 +# define ENGINE_R_INIT_FAILED 109 +# define ENGINE_R_INTERNAL_LIST_ERROR 110 +# define ENGINE_R_INVALID_ARGUMENT 143 +# define ENGINE_R_INVALID_CMD_NAME 137 +# define ENGINE_R_INVALID_CMD_NUMBER 138 +# define ENGINE_R_INVALID_INIT_VALUE 151 +# define ENGINE_R_INVALID_STRING 150 +# define ENGINE_R_NOT_INITIALISED 117 +# define ENGINE_R_NOT_LOADED 112 +# define ENGINE_R_NO_CONTROL_FUNCTION 120 +# define ENGINE_R_NO_INDEX 144 +# define ENGINE_R_NO_LOAD_FUNCTION 125 +# define ENGINE_R_NO_REFERENCE 130 +# define ENGINE_R_NO_SUCH_ENGINE 116 +# define ENGINE_R_NO_UNLOAD_FUNCTION 126 +# define ENGINE_R_PROVIDE_PARAMETERS 113 +# define ENGINE_R_RSA_NOT_IMPLEMENTED 141 +# define ENGINE_R_UNIMPLEMENTED_CIPHER 146 +# define ENGINE_R_UNIMPLEMENTED_DIGEST 147 +# define ENGINE_R_UNIMPLEMENTED_PUBLIC_KEY_METHOD 101 +# define ENGINE_R_VERSION_INCOMPATIBILITY 145 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/err.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/err.h new file mode 100644 index 0000000..585aa8b --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/err.h @@ -0,0 +1,389 @@ +/* crypto/err/err.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ +/* ==================================================================== + * Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_ERR_H +# define HEADER_ERR_H + +# include + +# ifndef OPENSSL_NO_FP_API +# include +# include +# endif + +# include +# ifndef OPENSSL_NO_BIO +# include +# endif +# ifndef OPENSSL_NO_LHASH +# include +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +# ifndef OPENSSL_NO_ERR +# define ERR_PUT_error(a,b,c,d,e) ERR_put_error(a,b,c,d,e) +# else +# define ERR_PUT_error(a,b,c,d,e) ERR_put_error(a,b,c,NULL,0) +# endif + +# include + +# define ERR_TXT_MALLOCED 0x01 +# define ERR_TXT_STRING 0x02 + +# define ERR_FLAG_MARK 0x01 + +# define ERR_NUM_ERRORS 16 +typedef struct err_state_st { + CRYPTO_THREADID tid; + int err_flags[ERR_NUM_ERRORS]; + unsigned long err_buffer[ERR_NUM_ERRORS]; + char *err_data[ERR_NUM_ERRORS]; + int err_data_flags[ERR_NUM_ERRORS]; + const char *err_file[ERR_NUM_ERRORS]; + int err_line[ERR_NUM_ERRORS]; + int top, bottom; +} ERR_STATE; + +/* library */ +# define ERR_LIB_NONE 1 +# define ERR_LIB_SYS 2 +# define ERR_LIB_BN 3 +# define ERR_LIB_RSA 4 +# define ERR_LIB_DH 5 +# define ERR_LIB_EVP 6 +# define ERR_LIB_BUF 7 +# define ERR_LIB_OBJ 8 +# define ERR_LIB_PEM 9 +# define ERR_LIB_DSA 10 +# define ERR_LIB_X509 11 +/* #define ERR_LIB_METH 12 */ +# define ERR_LIB_ASN1 13 +# define ERR_LIB_CONF 14 +# define ERR_LIB_CRYPTO 15 +# define ERR_LIB_EC 16 +# define ERR_LIB_SSL 20 +/* #define ERR_LIB_SSL23 21 */ +/* #define ERR_LIB_SSL2 22 */ +/* #define ERR_LIB_SSL3 23 */ +/* #define ERR_LIB_RSAREF 30 */ +/* #define ERR_LIB_PROXY 31 */ +# define ERR_LIB_BIO 32 +# define ERR_LIB_PKCS7 33 +# define ERR_LIB_X509V3 34 +# define ERR_LIB_PKCS12 35 +# define ERR_LIB_RAND 36 +# define ERR_LIB_DSO 37 +# define ERR_LIB_ENGINE 38 +# define ERR_LIB_OCSP 39 +# define ERR_LIB_UI 40 +# define ERR_LIB_COMP 41 +# define ERR_LIB_ECDSA 42 +# define ERR_LIB_ECDH 43 +# define ERR_LIB_STORE 44 +# define ERR_LIB_FIPS 45 +# define ERR_LIB_CMS 46 +# define ERR_LIB_TS 47 +# define ERR_LIB_HMAC 48 +# define ERR_LIB_JPAKE 49 + +# define ERR_LIB_USER 128 + +# define SYSerr(f,r) ERR_PUT_error(ERR_LIB_SYS,(f),(r),__FILE__,__LINE__) +# define BNerr(f,r) ERR_PUT_error(ERR_LIB_BN,(f),(r),__FILE__,__LINE__) +# define RSAerr(f,r) ERR_PUT_error(ERR_LIB_RSA,(f),(r),__FILE__,__LINE__) +# define DHerr(f,r) ERR_PUT_error(ERR_LIB_DH,(f),(r),__FILE__,__LINE__) +# define EVPerr(f,r) ERR_PUT_error(ERR_LIB_EVP,(f),(r),__FILE__,__LINE__) +# define BUFerr(f,r) ERR_PUT_error(ERR_LIB_BUF,(f),(r),__FILE__,__LINE__) +# define OBJerr(f,r) ERR_PUT_error(ERR_LIB_OBJ,(f),(r),__FILE__,__LINE__) +# define PEMerr(f,r) ERR_PUT_error(ERR_LIB_PEM,(f),(r),__FILE__,__LINE__) +# define DSAerr(f,r) ERR_PUT_error(ERR_LIB_DSA,(f),(r),__FILE__,__LINE__) +# define X509err(f,r) ERR_PUT_error(ERR_LIB_X509,(f),(r),__FILE__,__LINE__) +# define ASN1err(f,r) ERR_PUT_error(ERR_LIB_ASN1,(f),(r),__FILE__,__LINE__) +# define CONFerr(f,r) ERR_PUT_error(ERR_LIB_CONF,(f),(r),__FILE__,__LINE__) +# define CRYPTOerr(f,r) ERR_PUT_error(ERR_LIB_CRYPTO,(f),(r),__FILE__,__LINE__) +# define ECerr(f,r) ERR_PUT_error(ERR_LIB_EC,(f),(r),__FILE__,__LINE__) +# define SSLerr(f,r) ERR_PUT_error(ERR_LIB_SSL,(f),(r),__FILE__,__LINE__) +# define BIOerr(f,r) ERR_PUT_error(ERR_LIB_BIO,(f),(r),__FILE__,__LINE__) +# define PKCS7err(f,r) ERR_PUT_error(ERR_LIB_PKCS7,(f),(r),__FILE__,__LINE__) +# define X509V3err(f,r) ERR_PUT_error(ERR_LIB_X509V3,(f),(r),__FILE__,__LINE__) +# define PKCS12err(f,r) ERR_PUT_error(ERR_LIB_PKCS12,(f),(r),__FILE__,__LINE__) +# define RANDerr(f,r) ERR_PUT_error(ERR_LIB_RAND,(f),(r),__FILE__,__LINE__) +# define DSOerr(f,r) ERR_PUT_error(ERR_LIB_DSO,(f),(r),__FILE__,__LINE__) +# define ENGINEerr(f,r) ERR_PUT_error(ERR_LIB_ENGINE,(f),(r),__FILE__,__LINE__) +# define OCSPerr(f,r) ERR_PUT_error(ERR_LIB_OCSP,(f),(r),__FILE__,__LINE__) +# define UIerr(f,r) ERR_PUT_error(ERR_LIB_UI,(f),(r),__FILE__,__LINE__) +# define COMPerr(f,r) ERR_PUT_error(ERR_LIB_COMP,(f),(r),__FILE__,__LINE__) +# define ECDSAerr(f,r) ERR_PUT_error(ERR_LIB_ECDSA,(f),(r),__FILE__,__LINE__) +# define ECDHerr(f,r) ERR_PUT_error(ERR_LIB_ECDH,(f),(r),__FILE__,__LINE__) +# define STOREerr(f,r) ERR_PUT_error(ERR_LIB_STORE,(f),(r),__FILE__,__LINE__) +# define FIPSerr(f,r) ERR_PUT_error(ERR_LIB_FIPS,(f),(r),__FILE__,__LINE__) +# define CMSerr(f,r) ERR_PUT_error(ERR_LIB_CMS,(f),(r),__FILE__,__LINE__) +# define TSerr(f,r) ERR_PUT_error(ERR_LIB_TS,(f),(r),__FILE__,__LINE__) +# define HMACerr(f,r) ERR_PUT_error(ERR_LIB_HMAC,(f),(r),__FILE__,__LINE__) +# define JPAKEerr(f,r) ERR_PUT_error(ERR_LIB_JPAKE,(f),(r),__FILE__,__LINE__) + +/* + * Borland C seems too stupid to be able to shift and do longs in the + * pre-processor :-( + */ +# define ERR_PACK(l,f,r) (((((unsigned long)l)&0xffL)*0x1000000)| \ + ((((unsigned long)f)&0xfffL)*0x1000)| \ + ((((unsigned long)r)&0xfffL))) +# define ERR_GET_LIB(l) (int)((((unsigned long)l)>>24L)&0xffL) +# define ERR_GET_FUNC(l) (int)((((unsigned long)l)>>12L)&0xfffL) +# define ERR_GET_REASON(l) (int)((l)&0xfffL) +# define ERR_FATAL_ERROR(l) (int)((l)&ERR_R_FATAL) + +/* OS functions */ +# define SYS_F_FOPEN 1 +# define SYS_F_CONNECT 2 +# define SYS_F_GETSERVBYNAME 3 +# define SYS_F_SOCKET 4 +# define SYS_F_IOCTLSOCKET 5 +# define SYS_F_BIND 6 +# define SYS_F_LISTEN 7 +# define SYS_F_ACCEPT 8 +# define SYS_F_WSASTARTUP 9/* Winsock stuff */ +# define SYS_F_OPENDIR 10 +# define SYS_F_FREAD 11 + +/* reasons */ +# define ERR_R_SYS_LIB ERR_LIB_SYS/* 2 */ +# define ERR_R_BN_LIB ERR_LIB_BN/* 3 */ +# define ERR_R_RSA_LIB ERR_LIB_RSA/* 4 */ +# define ERR_R_DH_LIB ERR_LIB_DH/* 5 */ +# define ERR_R_EVP_LIB ERR_LIB_EVP/* 6 */ +# define ERR_R_BUF_LIB ERR_LIB_BUF/* 7 */ +# define ERR_R_OBJ_LIB ERR_LIB_OBJ/* 8 */ +# define ERR_R_PEM_LIB ERR_LIB_PEM/* 9 */ +# define ERR_R_DSA_LIB ERR_LIB_DSA/* 10 */ +# define ERR_R_X509_LIB ERR_LIB_X509/* 11 */ +# define ERR_R_ASN1_LIB ERR_LIB_ASN1/* 13 */ +# define ERR_R_CONF_LIB ERR_LIB_CONF/* 14 */ +# define ERR_R_CRYPTO_LIB ERR_LIB_CRYPTO/* 15 */ +# define ERR_R_EC_LIB ERR_LIB_EC/* 16 */ +# define ERR_R_SSL_LIB ERR_LIB_SSL/* 20 */ +# define ERR_R_BIO_LIB ERR_LIB_BIO/* 32 */ +# define ERR_R_PKCS7_LIB ERR_LIB_PKCS7/* 33 */ +# define ERR_R_X509V3_LIB ERR_LIB_X509V3/* 34 */ +# define ERR_R_PKCS12_LIB ERR_LIB_PKCS12/* 35 */ +# define ERR_R_RAND_LIB ERR_LIB_RAND/* 36 */ +# define ERR_R_DSO_LIB ERR_LIB_DSO/* 37 */ +# define ERR_R_ENGINE_LIB ERR_LIB_ENGINE/* 38 */ +# define ERR_R_OCSP_LIB ERR_LIB_OCSP/* 39 */ +# define ERR_R_UI_LIB ERR_LIB_UI/* 40 */ +# define ERR_R_COMP_LIB ERR_LIB_COMP/* 41 */ +# define ERR_R_ECDSA_LIB ERR_LIB_ECDSA/* 42 */ +# define ERR_R_ECDH_LIB ERR_LIB_ECDH/* 43 */ +# define ERR_R_STORE_LIB ERR_LIB_STORE/* 44 */ +# define ERR_R_TS_LIB ERR_LIB_TS/* 45 */ + +# define ERR_R_NESTED_ASN1_ERROR 58 +# define ERR_R_BAD_ASN1_OBJECT_HEADER 59 +# define ERR_R_BAD_GET_ASN1_OBJECT_CALL 60 +# define ERR_R_EXPECTING_AN_ASN1_SEQUENCE 61 +# define ERR_R_ASN1_LENGTH_MISMATCH 62 +# define ERR_R_MISSING_ASN1_EOS 63 + +/* fatal error */ +# define ERR_R_FATAL 64 +# define ERR_R_MALLOC_FAILURE (1|ERR_R_FATAL) +# define ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED (2|ERR_R_FATAL) +# define ERR_R_PASSED_NULL_PARAMETER (3|ERR_R_FATAL) +# define ERR_R_INTERNAL_ERROR (4|ERR_R_FATAL) +# define ERR_R_DISABLED (5|ERR_R_FATAL) + +/* + * 99 is the maximum possible ERR_R_... code, higher values are reserved for + * the individual libraries + */ + +typedef struct ERR_string_data_st { + unsigned long error; + const char *string; +} ERR_STRING_DATA; + +void ERR_put_error(int lib, int func, int reason, const char *file, int line); +void ERR_set_error_data(char *data, int flags); + +unsigned long ERR_get_error(void); +unsigned long ERR_get_error_line(const char **file, int *line); +unsigned long ERR_get_error_line_data(const char **file, int *line, + const char **data, int *flags); +unsigned long ERR_peek_error(void); +unsigned long ERR_peek_error_line(const char **file, int *line); +unsigned long ERR_peek_error_line_data(const char **file, int *line, + const char **data, int *flags); +unsigned long ERR_peek_last_error(void); +unsigned long ERR_peek_last_error_line(const char **file, int *line); +unsigned long ERR_peek_last_error_line_data(const char **file, int *line, + const char **data, int *flags); +void ERR_clear_error(void); +char *ERR_error_string(unsigned long e, char *buf); +void ERR_error_string_n(unsigned long e, char *buf, size_t len); +const char *ERR_lib_error_string(unsigned long e); +const char *ERR_func_error_string(unsigned long e); +const char *ERR_reason_error_string(unsigned long e); +void ERR_print_errors_cb(int (*cb) (const char *str, size_t len, void *u), + void *u); +# ifndef OPENSSL_NO_FP_API +void ERR_print_errors_fp(FILE *fp); +# endif +# ifndef OPENSSL_NO_BIO +void ERR_print_errors(BIO *bp); +# endif +void ERR_add_error_data(int num, ...); +void ERR_add_error_vdata(int num, va_list args); +void ERR_load_strings(int lib, ERR_STRING_DATA str[]); +void ERR_unload_strings(int lib, ERR_STRING_DATA str[]); +void ERR_load_ERR_strings(void); +void ERR_load_crypto_strings(void); +void ERR_free_strings(void); + +void ERR_remove_thread_state(const CRYPTO_THREADID *tid); +# ifndef OPENSSL_NO_DEPRECATED +void ERR_remove_state(unsigned long pid); /* if zero we look it up */ +# endif +ERR_STATE *ERR_get_state(void); + +# ifndef OPENSSL_NO_LHASH +LHASH_OF(ERR_STRING_DATA) *ERR_get_string_table(void); +LHASH_OF(ERR_STATE) *ERR_get_err_state_table(void); +void ERR_release_err_state_table(LHASH_OF(ERR_STATE) **hash); +# endif + +int ERR_get_next_error_library(void); + +int ERR_set_mark(void); +int ERR_pop_to_mark(void); + +/* Already defined in ossl_typ.h */ +/* typedef struct st_ERR_FNS ERR_FNS; */ +/* + * An application can use this function and provide the return value to + * loaded modules that should use the application's ERR state/functionality + */ +const ERR_FNS *ERR_get_implementation(void); +/* + * A loaded module should call this function prior to any ERR operations + * using the application's "ERR_FNS". + */ +int ERR_set_implementation(const ERR_FNS *fns); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/evp.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/evp.h new file mode 100644 index 0000000..39ab793 --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/evp.h @@ -0,0 +1,1534 @@ +/* crypto/evp/evp.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_ENVELOPE_H +# define HEADER_ENVELOPE_H + +# ifdef OPENSSL_ALGORITHM_DEFINES +# include +# else +# define OPENSSL_ALGORITHM_DEFINES +# include +# undef OPENSSL_ALGORITHM_DEFINES +# endif + +# include + +# include + +# ifndef OPENSSL_NO_BIO +# include +# endif + +/*- +#define EVP_RC2_KEY_SIZE 16 +#define EVP_RC4_KEY_SIZE 16 +#define EVP_BLOWFISH_KEY_SIZE 16 +#define EVP_CAST5_KEY_SIZE 16 +#define EVP_RC5_32_12_16_KEY_SIZE 16 +*/ +# define EVP_MAX_MD_SIZE 64/* longest known is SHA512 */ +# define EVP_MAX_KEY_LENGTH 64 +# define EVP_MAX_IV_LENGTH 16 +# define EVP_MAX_BLOCK_LENGTH 32 + +# define PKCS5_SALT_LEN 8 +/* Default PKCS#5 iteration count */ +# define PKCS5_DEFAULT_ITER 2048 + +# include + +# define EVP_PK_RSA 0x0001 +# define EVP_PK_DSA 0x0002 +# define EVP_PK_DH 0x0004 +# define EVP_PK_EC 0x0008 +# define EVP_PKT_SIGN 0x0010 +# define EVP_PKT_ENC 0x0020 +# define EVP_PKT_EXCH 0x0040 +# define EVP_PKS_RSA 0x0100 +# define EVP_PKS_DSA 0x0200 +# define EVP_PKS_EC 0x0400 + +# define EVP_PKEY_NONE NID_undef +# define EVP_PKEY_RSA NID_rsaEncryption +# define EVP_PKEY_RSA2 NID_rsa +# define EVP_PKEY_DSA NID_dsa +# define EVP_PKEY_DSA1 NID_dsa_2 +# define EVP_PKEY_DSA2 NID_dsaWithSHA +# define EVP_PKEY_DSA3 NID_dsaWithSHA1 +# define EVP_PKEY_DSA4 NID_dsaWithSHA1_2 +# define EVP_PKEY_DH NID_dhKeyAgreement +# define EVP_PKEY_DHX NID_dhpublicnumber +# define EVP_PKEY_EC NID_X9_62_id_ecPublicKey +# define EVP_PKEY_HMAC NID_hmac +# define EVP_PKEY_CMAC NID_cmac + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Type needs to be a bit field Sub-type needs to be for variations on the + * method, as in, can it do arbitrary encryption.... + */ +struct evp_pkey_st { + int type; + int save_type; + int references; + const EVP_PKEY_ASN1_METHOD *ameth; + ENGINE *engine; + union { + char *ptr; +# ifndef OPENSSL_NO_RSA + struct rsa_st *rsa; /* RSA */ +# endif +# ifndef OPENSSL_NO_DSA + struct dsa_st *dsa; /* DSA */ +# endif +# ifndef OPENSSL_NO_DH + struct dh_st *dh; /* DH */ +# endif +# ifndef OPENSSL_NO_EC + struct ec_key_st *ec; /* ECC */ +# endif + } pkey; + int save_parameters; + STACK_OF(X509_ATTRIBUTE) *attributes; /* [ 0 ] */ +} /* EVP_PKEY */ ; + +# define EVP_PKEY_MO_SIGN 0x0001 +# define EVP_PKEY_MO_VERIFY 0x0002 +# define EVP_PKEY_MO_ENCRYPT 0x0004 +# define EVP_PKEY_MO_DECRYPT 0x0008 + +# ifndef EVP_MD +struct env_md_st { + int type; + int pkey_type; + int md_size; + unsigned long flags; + int (*init) (EVP_MD_CTX *ctx); + int (*update) (EVP_MD_CTX *ctx, const void *data, size_t count); + int (*final) (EVP_MD_CTX *ctx, unsigned char *md); + int (*copy) (EVP_MD_CTX *to, const EVP_MD_CTX *from); + int (*cleanup) (EVP_MD_CTX *ctx); + /* FIXME: prototype these some day */ + int (*sign) (int type, const unsigned char *m, unsigned int m_length, + unsigned char *sigret, unsigned int *siglen, void *key); + int (*verify) (int type, const unsigned char *m, unsigned int m_length, + const unsigned char *sigbuf, unsigned int siglen, + void *key); + int required_pkey_type[5]; /* EVP_PKEY_xxx */ + int block_size; + int ctx_size; /* how big does the ctx->md_data need to be */ + /* control function */ + int (*md_ctrl) (EVP_MD_CTX *ctx, int cmd, int p1, void *p2); +} /* EVP_MD */ ; + +typedef int evp_sign_method(int type, const unsigned char *m, + unsigned int m_length, unsigned char *sigret, + unsigned int *siglen, void *key); +typedef int evp_verify_method(int type, const unsigned char *m, + unsigned int m_length, + const unsigned char *sigbuf, + unsigned int siglen, void *key); + +/* digest can only handle a single block */ +# define EVP_MD_FLAG_ONESHOT 0x0001 + +/* + * digest is a "clone" digest used + * which is a copy of an existing + * one for a specific public key type. + * EVP_dss1() etc + */ +# define EVP_MD_FLAG_PKEY_DIGEST 0x0002 + +/* Digest uses EVP_PKEY_METHOD for signing instead of MD specific signing */ + +# define EVP_MD_FLAG_PKEY_METHOD_SIGNATURE 0x0004 + +/* DigestAlgorithmIdentifier flags... */ + +# define EVP_MD_FLAG_DIGALGID_MASK 0x0018 + +/* NULL or absent parameter accepted. Use NULL */ + +# define EVP_MD_FLAG_DIGALGID_NULL 0x0000 + +/* NULL or absent parameter accepted. Use NULL for PKCS#1 otherwise absent */ + +# define EVP_MD_FLAG_DIGALGID_ABSENT 0x0008 + +/* Custom handling via ctrl */ + +# define EVP_MD_FLAG_DIGALGID_CUSTOM 0x0018 + +/* Note if suitable for use in FIPS mode */ +# define EVP_MD_FLAG_FIPS 0x0400 + +/* Digest ctrls */ + +# define EVP_MD_CTRL_DIGALGID 0x1 +# define EVP_MD_CTRL_MICALG 0x2 + +/* Minimum Algorithm specific ctrl value */ + +# define EVP_MD_CTRL_ALG_CTRL 0x1000 + +# define EVP_PKEY_NULL_method NULL,NULL,{0,0,0,0} + +# ifndef OPENSSL_NO_DSA +# define EVP_PKEY_DSA_method (evp_sign_method *)DSA_sign, \ + (evp_verify_method *)DSA_verify, \ + {EVP_PKEY_DSA,EVP_PKEY_DSA2,EVP_PKEY_DSA3, \ + EVP_PKEY_DSA4,0} +# else +# define EVP_PKEY_DSA_method EVP_PKEY_NULL_method +# endif + +# ifndef OPENSSL_NO_ECDSA +# define EVP_PKEY_ECDSA_method (evp_sign_method *)ECDSA_sign, \ + (evp_verify_method *)ECDSA_verify, \ + {EVP_PKEY_EC,0,0,0} +# else +# define EVP_PKEY_ECDSA_method EVP_PKEY_NULL_method +# endif + +# ifndef OPENSSL_NO_RSA +# define EVP_PKEY_RSA_method (evp_sign_method *)RSA_sign, \ + (evp_verify_method *)RSA_verify, \ + {EVP_PKEY_RSA,EVP_PKEY_RSA2,0,0} +# define EVP_PKEY_RSA_ASN1_OCTET_STRING_method \ + (evp_sign_method *)RSA_sign_ASN1_OCTET_STRING, \ + (evp_verify_method *)RSA_verify_ASN1_OCTET_STRING, \ + {EVP_PKEY_RSA,EVP_PKEY_RSA2,0,0} +# else +# define EVP_PKEY_RSA_method EVP_PKEY_NULL_method +# define EVP_PKEY_RSA_ASN1_OCTET_STRING_method EVP_PKEY_NULL_method +# endif + +# endif /* !EVP_MD */ + +struct env_md_ctx_st { + const EVP_MD *digest; + ENGINE *engine; /* functional reference if 'digest' is + * ENGINE-provided */ + unsigned long flags; + void *md_data; + /* Public key context for sign/verify */ + EVP_PKEY_CTX *pctx; + /* Update function: usually copied from EVP_MD */ + int (*update) (EVP_MD_CTX *ctx, const void *data, size_t count); +} /* EVP_MD_CTX */ ; + +/* values for EVP_MD_CTX flags */ + +# define EVP_MD_CTX_FLAG_ONESHOT 0x0001/* digest update will be + * called once only */ +# define EVP_MD_CTX_FLAG_CLEANED 0x0002/* context has already been + * cleaned */ +# define EVP_MD_CTX_FLAG_REUSE 0x0004/* Don't free up ctx->md_data + * in EVP_MD_CTX_cleanup */ +/* + * FIPS and pad options are ignored in 1.0.0, definitions are here so we + * don't accidentally reuse the values for other purposes. + */ + +# define EVP_MD_CTX_FLAG_NON_FIPS_ALLOW 0x0008/* Allow use of non FIPS + * digest in FIPS mode */ + +/* + * The following PAD options are also currently ignored in 1.0.0, digest + * parameters are handled through EVP_DigestSign*() and EVP_DigestVerify*() + * instead. + */ +# define EVP_MD_CTX_FLAG_PAD_MASK 0xF0/* RSA mode to use */ +# define EVP_MD_CTX_FLAG_PAD_PKCS1 0x00/* PKCS#1 v1.5 mode */ +# define EVP_MD_CTX_FLAG_PAD_X931 0x10/* X9.31 mode */ +# define EVP_MD_CTX_FLAG_PAD_PSS 0x20/* PSS mode */ + +# define EVP_MD_CTX_FLAG_NO_INIT 0x0100/* Don't initialize md_data */ + +struct evp_cipher_st { + int nid; + int block_size; + /* Default value for variable length ciphers */ + int key_len; + int iv_len; + /* Various flags */ + unsigned long flags; + /* init key */ + int (*init) (EVP_CIPHER_CTX *ctx, const unsigned char *key, + const unsigned char *iv, int enc); + /* encrypt/decrypt data */ + int (*do_cipher) (EVP_CIPHER_CTX *ctx, unsigned char *out, + const unsigned char *in, size_t inl); + /* cleanup ctx */ + int (*cleanup) (EVP_CIPHER_CTX *); + /* how big ctx->cipher_data needs to be */ + int ctx_size; + /* Populate a ASN1_TYPE with parameters */ + int (*set_asn1_parameters) (EVP_CIPHER_CTX *, ASN1_TYPE *); + /* Get parameters from a ASN1_TYPE */ + int (*get_asn1_parameters) (EVP_CIPHER_CTX *, ASN1_TYPE *); + /* Miscellaneous operations */ + int (*ctrl) (EVP_CIPHER_CTX *, int type, int arg, void *ptr); + /* Application data */ + void *app_data; +} /* EVP_CIPHER */ ; + +/* Values for cipher flags */ + +/* Modes for ciphers */ + +# define EVP_CIPH_STREAM_CIPHER 0x0 +# define EVP_CIPH_ECB_MODE 0x1 +# define EVP_CIPH_CBC_MODE 0x2 +# define EVP_CIPH_CFB_MODE 0x3 +# define EVP_CIPH_OFB_MODE 0x4 +# define EVP_CIPH_CTR_MODE 0x5 +# define EVP_CIPH_GCM_MODE 0x6 +# define EVP_CIPH_CCM_MODE 0x7 +# define EVP_CIPH_XTS_MODE 0x10001 +# define EVP_CIPH_WRAP_MODE 0x10002 +# define EVP_CIPH_MODE 0xF0007 +/* Set if variable length cipher */ +# define EVP_CIPH_VARIABLE_LENGTH 0x8 +/* Set if the iv handling should be done by the cipher itself */ +# define EVP_CIPH_CUSTOM_IV 0x10 +/* Set if the cipher's init() function should be called if key is NULL */ +# define EVP_CIPH_ALWAYS_CALL_INIT 0x20 +/* Call ctrl() to init cipher parameters */ +# define EVP_CIPH_CTRL_INIT 0x40 +/* Don't use standard key length function */ +# define EVP_CIPH_CUSTOM_KEY_LENGTH 0x80 +/* Don't use standard block padding */ +# define EVP_CIPH_NO_PADDING 0x100 +/* cipher handles random key generation */ +# define EVP_CIPH_RAND_KEY 0x200 +/* cipher has its own additional copying logic */ +# define EVP_CIPH_CUSTOM_COPY 0x400 +/* Allow use default ASN1 get/set iv */ +# define EVP_CIPH_FLAG_DEFAULT_ASN1 0x1000 +/* Buffer length in bits not bytes: CFB1 mode only */ +# define EVP_CIPH_FLAG_LENGTH_BITS 0x2000 +/* Note if suitable for use in FIPS mode */ +# define EVP_CIPH_FLAG_FIPS 0x4000 +/* Allow non FIPS cipher in FIPS mode */ +# define EVP_CIPH_FLAG_NON_FIPS_ALLOW 0x8000 +/* + * Cipher handles any and all padding logic as well as finalisation. + */ +# define EVP_CIPH_FLAG_CUSTOM_CIPHER 0x100000 +# define EVP_CIPH_FLAG_AEAD_CIPHER 0x200000 +# define EVP_CIPH_FLAG_TLS1_1_MULTIBLOCK 0x400000 + +/* + * Cipher context flag to indicate we can handle wrap mode: if allowed in + * older applications it could overflow buffers. + */ + +# define EVP_CIPHER_CTX_FLAG_WRAP_ALLOW 0x1 + +/* ctrl() values */ + +# define EVP_CTRL_INIT 0x0 +# define EVP_CTRL_SET_KEY_LENGTH 0x1 +# define EVP_CTRL_GET_RC2_KEY_BITS 0x2 +# define EVP_CTRL_SET_RC2_KEY_BITS 0x3 +# define EVP_CTRL_GET_RC5_ROUNDS 0x4 +# define EVP_CTRL_SET_RC5_ROUNDS 0x5 +# define EVP_CTRL_RAND_KEY 0x6 +# define EVP_CTRL_PBE_PRF_NID 0x7 +# define EVP_CTRL_COPY 0x8 +# define EVP_CTRL_GCM_SET_IVLEN 0x9 +# define EVP_CTRL_GCM_GET_TAG 0x10 +# define EVP_CTRL_GCM_SET_TAG 0x11 +# define EVP_CTRL_GCM_SET_IV_FIXED 0x12 +# define EVP_CTRL_GCM_IV_GEN 0x13 +# define EVP_CTRL_CCM_SET_IVLEN EVP_CTRL_GCM_SET_IVLEN +# define EVP_CTRL_CCM_GET_TAG EVP_CTRL_GCM_GET_TAG +# define EVP_CTRL_CCM_SET_TAG EVP_CTRL_GCM_SET_TAG +# define EVP_CTRL_CCM_SET_L 0x14 +# define EVP_CTRL_CCM_SET_MSGLEN 0x15 +/* + * AEAD cipher deduces payload length and returns number of bytes required to + * store MAC and eventual padding. Subsequent call to EVP_Cipher even + * appends/verifies MAC. + */ +# define EVP_CTRL_AEAD_TLS1_AAD 0x16 +/* Used by composite AEAD ciphers, no-op in GCM, CCM... */ +# define EVP_CTRL_AEAD_SET_MAC_KEY 0x17 +/* Set the GCM invocation field, decrypt only */ +# define EVP_CTRL_GCM_SET_IV_INV 0x18 + +# define EVP_CTRL_TLS1_1_MULTIBLOCK_AAD 0x19 +# define EVP_CTRL_TLS1_1_MULTIBLOCK_ENCRYPT 0x1a +# define EVP_CTRL_TLS1_1_MULTIBLOCK_DECRYPT 0x1b +# define EVP_CTRL_TLS1_1_MULTIBLOCK_MAX_BUFSIZE 0x1c + +/* RFC 5246 defines additional data to be 13 bytes in length */ +# define EVP_AEAD_TLS1_AAD_LEN 13 + +typedef struct { + unsigned char *out; + const unsigned char *inp; + size_t len; + unsigned int interleave; +} EVP_CTRL_TLS1_1_MULTIBLOCK_PARAM; + +/* GCM TLS constants */ +/* Length of fixed part of IV derived from PRF */ +# define EVP_GCM_TLS_FIXED_IV_LEN 4 +/* Length of explicit part of IV part of TLS records */ +# define EVP_GCM_TLS_EXPLICIT_IV_LEN 8 +/* Length of tag for TLS */ +# define EVP_GCM_TLS_TAG_LEN 16 + +typedef struct evp_cipher_info_st { + const EVP_CIPHER *cipher; + unsigned char iv[EVP_MAX_IV_LENGTH]; +} EVP_CIPHER_INFO; + +struct evp_cipher_ctx_st { + const EVP_CIPHER *cipher; + ENGINE *engine; /* functional reference if 'cipher' is + * ENGINE-provided */ + int encrypt; /* encrypt or decrypt */ + int buf_len; /* number we have left */ + unsigned char oiv[EVP_MAX_IV_LENGTH]; /* original iv */ + unsigned char iv[EVP_MAX_IV_LENGTH]; /* working iv */ + unsigned char buf[EVP_MAX_BLOCK_LENGTH]; /* saved partial block */ + int num; /* used by cfb/ofb/ctr mode */ + void *app_data; /* application stuff */ + int key_len; /* May change for variable length cipher */ + unsigned long flags; /* Various flags */ + void *cipher_data; /* per EVP data */ + int final_used; + int block_mask; + unsigned char final[EVP_MAX_BLOCK_LENGTH]; /* possible final block */ +} /* EVP_CIPHER_CTX */ ; + +typedef struct evp_Encode_Ctx_st { + /* number saved in a partial encode/decode */ + int num; + /* + * The length is either the output line length (in input bytes) or the + * shortest input line length that is ok. Once decoding begins, the + * length is adjusted up each time a longer line is decoded + */ + int length; + /* data to encode */ + unsigned char enc_data[80]; + /* number read on current line */ + int line_num; + int expect_nl; +} EVP_ENCODE_CTX; + +/* Password based encryption function */ +typedef int (EVP_PBE_KEYGEN) (EVP_CIPHER_CTX *ctx, const char *pass, + int passlen, ASN1_TYPE *param, + const EVP_CIPHER *cipher, const EVP_MD *md, + int en_de); + +# ifndef OPENSSL_NO_RSA +# define EVP_PKEY_assign_RSA(pkey,rsa) EVP_PKEY_assign((pkey),EVP_PKEY_RSA,\ + (char *)(rsa)) +# endif + +# ifndef OPENSSL_NO_DSA +# define EVP_PKEY_assign_DSA(pkey,dsa) EVP_PKEY_assign((pkey),EVP_PKEY_DSA,\ + (char *)(dsa)) +# endif + +# ifndef OPENSSL_NO_DH +# define EVP_PKEY_assign_DH(pkey,dh) EVP_PKEY_assign((pkey),EVP_PKEY_DH,\ + (char *)(dh)) +# endif + +# ifndef OPENSSL_NO_EC +# define EVP_PKEY_assign_EC_KEY(pkey,eckey) EVP_PKEY_assign((pkey),EVP_PKEY_EC,\ + (char *)(eckey)) +# endif + +/* Add some extra combinations */ +# define EVP_get_digestbynid(a) EVP_get_digestbyname(OBJ_nid2sn(a)) +# define EVP_get_digestbyobj(a) EVP_get_digestbynid(OBJ_obj2nid(a)) +# define EVP_get_cipherbynid(a) EVP_get_cipherbyname(OBJ_nid2sn(a)) +# define EVP_get_cipherbyobj(a) EVP_get_cipherbynid(OBJ_obj2nid(a)) + +int EVP_MD_type(const EVP_MD *md); +# define EVP_MD_nid(e) EVP_MD_type(e) +# define EVP_MD_name(e) OBJ_nid2sn(EVP_MD_nid(e)) +int EVP_MD_pkey_type(const EVP_MD *md); +int EVP_MD_size(const EVP_MD *md); +int EVP_MD_block_size(const EVP_MD *md); +unsigned long EVP_MD_flags(const EVP_MD *md); + +const EVP_MD *EVP_MD_CTX_md(const EVP_MD_CTX *ctx); +# define EVP_MD_CTX_size(e) EVP_MD_size(EVP_MD_CTX_md(e)) +# define EVP_MD_CTX_block_size(e) EVP_MD_block_size(EVP_MD_CTX_md(e)) +# define EVP_MD_CTX_type(e) EVP_MD_type(EVP_MD_CTX_md(e)) + +int EVP_CIPHER_nid(const EVP_CIPHER *cipher); +# define EVP_CIPHER_name(e) OBJ_nid2sn(EVP_CIPHER_nid(e)) +int EVP_CIPHER_block_size(const EVP_CIPHER *cipher); +int EVP_CIPHER_key_length(const EVP_CIPHER *cipher); +int EVP_CIPHER_iv_length(const EVP_CIPHER *cipher); +unsigned long EVP_CIPHER_flags(const EVP_CIPHER *cipher); +# define EVP_CIPHER_mode(e) (EVP_CIPHER_flags(e) & EVP_CIPH_MODE) + +const EVP_CIPHER *EVP_CIPHER_CTX_cipher(const EVP_CIPHER_CTX *ctx); +int EVP_CIPHER_CTX_nid(const EVP_CIPHER_CTX *ctx); +int EVP_CIPHER_CTX_block_size(const EVP_CIPHER_CTX *ctx); +int EVP_CIPHER_CTX_key_length(const EVP_CIPHER_CTX *ctx); +int EVP_CIPHER_CTX_iv_length(const EVP_CIPHER_CTX *ctx); +int EVP_CIPHER_CTX_copy(EVP_CIPHER_CTX *out, const EVP_CIPHER_CTX *in); +void *EVP_CIPHER_CTX_get_app_data(const EVP_CIPHER_CTX *ctx); +void EVP_CIPHER_CTX_set_app_data(EVP_CIPHER_CTX *ctx, void *data); +# define EVP_CIPHER_CTX_type(c) EVP_CIPHER_type(EVP_CIPHER_CTX_cipher(c)) +unsigned long EVP_CIPHER_CTX_flags(const EVP_CIPHER_CTX *ctx); +# define EVP_CIPHER_CTX_mode(e) (EVP_CIPHER_CTX_flags(e) & EVP_CIPH_MODE) + +# define EVP_ENCODE_LENGTH(l) (((l+2)/3*4)+(l/48+1)*2+80) +# define EVP_DECODE_LENGTH(l) ((l+3)/4*3+80) + +# define EVP_SignInit_ex(a,b,c) EVP_DigestInit_ex(a,b,c) +# define EVP_SignInit(a,b) EVP_DigestInit(a,b) +# define EVP_SignUpdate(a,b,c) EVP_DigestUpdate(a,b,c) +# define EVP_VerifyInit_ex(a,b,c) EVP_DigestInit_ex(a,b,c) +# define EVP_VerifyInit(a,b) EVP_DigestInit(a,b) +# define EVP_VerifyUpdate(a,b,c) EVP_DigestUpdate(a,b,c) +# define EVP_OpenUpdate(a,b,c,d,e) EVP_DecryptUpdate(a,b,c,d,e) +# define EVP_SealUpdate(a,b,c,d,e) EVP_EncryptUpdate(a,b,c,d,e) +# define EVP_DigestSignUpdate(a,b,c) EVP_DigestUpdate(a,b,c) +# define EVP_DigestVerifyUpdate(a,b,c) EVP_DigestUpdate(a,b,c) + +# ifdef CONST_STRICT +void BIO_set_md(BIO *, const EVP_MD *md); +# else +# define BIO_set_md(b,md) BIO_ctrl(b,BIO_C_SET_MD,0,(char *)md) +# endif +# define BIO_get_md(b,mdp) BIO_ctrl(b,BIO_C_GET_MD,0,(char *)mdp) +# define BIO_get_md_ctx(b,mdcp) BIO_ctrl(b,BIO_C_GET_MD_CTX,0,(char *)mdcp) +# define BIO_set_md_ctx(b,mdcp) BIO_ctrl(b,BIO_C_SET_MD_CTX,0,(char *)mdcp) +# define BIO_get_cipher_status(b) BIO_ctrl(b,BIO_C_GET_CIPHER_STATUS,0,NULL) +# define BIO_get_cipher_ctx(b,c_pp) BIO_ctrl(b,BIO_C_GET_CIPHER_CTX,0,(char *)c_pp) + +int EVP_Cipher(EVP_CIPHER_CTX *c, + unsigned char *out, const unsigned char *in, unsigned int inl); + +# define EVP_add_cipher_alias(n,alias) \ + OBJ_NAME_add((alias),OBJ_NAME_TYPE_CIPHER_METH|OBJ_NAME_ALIAS,(n)) +# define EVP_add_digest_alias(n,alias) \ + OBJ_NAME_add((alias),OBJ_NAME_TYPE_MD_METH|OBJ_NAME_ALIAS,(n)) +# define EVP_delete_cipher_alias(alias) \ + OBJ_NAME_remove(alias,OBJ_NAME_TYPE_CIPHER_METH|OBJ_NAME_ALIAS); +# define EVP_delete_digest_alias(alias) \ + OBJ_NAME_remove(alias,OBJ_NAME_TYPE_MD_METH|OBJ_NAME_ALIAS); + +void EVP_MD_CTX_init(EVP_MD_CTX *ctx); +int EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx); +EVP_MD_CTX *EVP_MD_CTX_create(void); +void EVP_MD_CTX_destroy(EVP_MD_CTX *ctx); +int EVP_MD_CTX_copy_ex(EVP_MD_CTX *out, const EVP_MD_CTX *in); +void EVP_MD_CTX_set_flags(EVP_MD_CTX *ctx, int flags); +void EVP_MD_CTX_clear_flags(EVP_MD_CTX *ctx, int flags); +int EVP_MD_CTX_test_flags(const EVP_MD_CTX *ctx, int flags); +int EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl); +int EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *d, size_t cnt); +int EVP_DigestFinal_ex(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *s); +int EVP_Digest(const void *data, size_t count, + unsigned char *md, unsigned int *size, const EVP_MD *type, + ENGINE *impl); + +int EVP_MD_CTX_copy(EVP_MD_CTX *out, const EVP_MD_CTX *in); +int EVP_DigestInit(EVP_MD_CTX *ctx, const EVP_MD *type); +int EVP_DigestFinal(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *s); + +int EVP_read_pw_string(char *buf, int length, const char *prompt, int verify); +int EVP_read_pw_string_min(char *buf, int minlen, int maxlen, + const char *prompt, int verify); +void EVP_set_pw_prompt(const char *prompt); +char *EVP_get_pw_prompt(void); + +int EVP_BytesToKey(const EVP_CIPHER *type, const EVP_MD *md, + const unsigned char *salt, const unsigned char *data, + int datal, int count, unsigned char *key, + unsigned char *iv); + +void EVP_CIPHER_CTX_set_flags(EVP_CIPHER_CTX *ctx, int flags); +void EVP_CIPHER_CTX_clear_flags(EVP_CIPHER_CTX *ctx, int flags); +int EVP_CIPHER_CTX_test_flags(const EVP_CIPHER_CTX *ctx, int flags); + +int EVP_EncryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, + const unsigned char *key, const unsigned char *iv); +int EVP_EncryptInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, + ENGINE *impl, const unsigned char *key, + const unsigned char *iv); +int EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, + const unsigned char *in, int inl); +int EVP_EncryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl); +int EVP_EncryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl); + +int EVP_DecryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, + const unsigned char *key, const unsigned char *iv); +int EVP_DecryptInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, + ENGINE *impl, const unsigned char *key, + const unsigned char *iv); +int EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, + const unsigned char *in, int inl); +int EVP_DecryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *outm, int *outl); +int EVP_DecryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *outm, int *outl); + +int EVP_CipherInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, + const unsigned char *key, const unsigned char *iv, + int enc); +int EVP_CipherInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, + ENGINE *impl, const unsigned char *key, + const unsigned char *iv, int enc); +int EVP_CipherUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, + const unsigned char *in, int inl); +int EVP_CipherFinal(EVP_CIPHER_CTX *ctx, unsigned char *outm, int *outl); +int EVP_CipherFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *outm, int *outl); + +int EVP_SignFinal(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *s, + EVP_PKEY *pkey); + +int EVP_VerifyFinal(EVP_MD_CTX *ctx, const unsigned char *sigbuf, + unsigned int siglen, EVP_PKEY *pkey); + +int EVP_DigestSignInit(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx, + const EVP_MD *type, ENGINE *e, EVP_PKEY *pkey); +int EVP_DigestSignFinal(EVP_MD_CTX *ctx, + unsigned char *sigret, size_t *siglen); + +int EVP_DigestVerifyInit(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx, + const EVP_MD *type, ENGINE *e, EVP_PKEY *pkey); +int EVP_DigestVerifyFinal(EVP_MD_CTX *ctx, + const unsigned char *sig, size_t siglen); + +int EVP_OpenInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type, + const unsigned char *ek, int ekl, const unsigned char *iv, + EVP_PKEY *priv); +int EVP_OpenFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl); + +int EVP_SealInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type, + unsigned char **ek, int *ekl, unsigned char *iv, + EVP_PKEY **pubk, int npubk); +int EVP_SealFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl); + +void EVP_EncodeInit(EVP_ENCODE_CTX *ctx); +void EVP_EncodeUpdate(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl, + const unsigned char *in, int inl); +void EVP_EncodeFinal(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl); +int EVP_EncodeBlock(unsigned char *t, const unsigned char *f, int n); + +void EVP_DecodeInit(EVP_ENCODE_CTX *ctx); +int EVP_DecodeUpdate(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl, + const unsigned char *in, int inl); +int EVP_DecodeFinal(EVP_ENCODE_CTX *ctx, unsigned + char *out, int *outl); +int EVP_DecodeBlock(unsigned char *t, const unsigned char *f, int n); + +void EVP_CIPHER_CTX_init(EVP_CIPHER_CTX *a); +int EVP_CIPHER_CTX_cleanup(EVP_CIPHER_CTX *a); +EVP_CIPHER_CTX *EVP_CIPHER_CTX_new(void); +void EVP_CIPHER_CTX_free(EVP_CIPHER_CTX *a); +int EVP_CIPHER_CTX_set_key_length(EVP_CIPHER_CTX *x, int keylen); +int EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX *c, int pad); +int EVP_CIPHER_CTX_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr); +int EVP_CIPHER_CTX_rand_key(EVP_CIPHER_CTX *ctx, unsigned char *key); + +# ifndef OPENSSL_NO_BIO +BIO_METHOD *BIO_f_md(void); +BIO_METHOD *BIO_f_base64(void); +BIO_METHOD *BIO_f_cipher(void); +BIO_METHOD *BIO_f_reliable(void); +void BIO_set_cipher(BIO *b, const EVP_CIPHER *c, const unsigned char *k, + const unsigned char *i, int enc); +# endif + +const EVP_MD *EVP_md_null(void); +# ifndef OPENSSL_NO_MD2 +const EVP_MD *EVP_md2(void); +# endif +# ifndef OPENSSL_NO_MD4 +const EVP_MD *EVP_md4(void); +# endif +# ifndef OPENSSL_NO_MD5 +const EVP_MD *EVP_md5(void); +# endif +# ifndef OPENSSL_NO_SHA +const EVP_MD *EVP_sha(void); +const EVP_MD *EVP_sha1(void); +const EVP_MD *EVP_dss(void); +const EVP_MD *EVP_dss1(void); +const EVP_MD *EVP_ecdsa(void); +# endif +# ifndef OPENSSL_NO_SHA256 +const EVP_MD *EVP_sha224(void); +const EVP_MD *EVP_sha256(void); +# endif +# ifndef OPENSSL_NO_SHA512 +const EVP_MD *EVP_sha384(void); +const EVP_MD *EVP_sha512(void); +# endif +# ifndef OPENSSL_NO_MDC2 +const EVP_MD *EVP_mdc2(void); +# endif +# ifndef OPENSSL_NO_RIPEMD +const EVP_MD *EVP_ripemd160(void); +# endif +# ifndef OPENSSL_NO_WHIRLPOOL +const EVP_MD *EVP_whirlpool(void); +# endif +const EVP_CIPHER *EVP_enc_null(void); /* does nothing :-) */ +# ifndef OPENSSL_NO_DES +const EVP_CIPHER *EVP_des_ecb(void); +const EVP_CIPHER *EVP_des_ede(void); +const EVP_CIPHER *EVP_des_ede3(void); +const EVP_CIPHER *EVP_des_ede_ecb(void); +const EVP_CIPHER *EVP_des_ede3_ecb(void); +const EVP_CIPHER *EVP_des_cfb64(void); +# define EVP_des_cfb EVP_des_cfb64 +const EVP_CIPHER *EVP_des_cfb1(void); +const EVP_CIPHER *EVP_des_cfb8(void); +const EVP_CIPHER *EVP_des_ede_cfb64(void); +# define EVP_des_ede_cfb EVP_des_ede_cfb64 +# if 0 +const EVP_CIPHER *EVP_des_ede_cfb1(void); +const EVP_CIPHER *EVP_des_ede_cfb8(void); +# endif +const EVP_CIPHER *EVP_des_ede3_cfb64(void); +# define EVP_des_ede3_cfb EVP_des_ede3_cfb64 +const EVP_CIPHER *EVP_des_ede3_cfb1(void); +const EVP_CIPHER *EVP_des_ede3_cfb8(void); +const EVP_CIPHER *EVP_des_ofb(void); +const EVP_CIPHER *EVP_des_ede_ofb(void); +const EVP_CIPHER *EVP_des_ede3_ofb(void); +const EVP_CIPHER *EVP_des_cbc(void); +const EVP_CIPHER *EVP_des_ede_cbc(void); +const EVP_CIPHER *EVP_des_ede3_cbc(void); +const EVP_CIPHER *EVP_desx_cbc(void); +const EVP_CIPHER *EVP_des_ede3_wrap(void); +/* + * This should now be supported through the dev_crypto ENGINE. But also, why + * are rc4 and md5 declarations made here inside a "NO_DES" precompiler + * branch? + */ +# if 0 +# ifdef OPENSSL_OPENBSD_DEV_CRYPTO +const EVP_CIPHER *EVP_dev_crypto_des_ede3_cbc(void); +const EVP_CIPHER *EVP_dev_crypto_rc4(void); +const EVP_MD *EVP_dev_crypto_md5(void); +# endif +# endif +# endif +# ifndef OPENSSL_NO_RC4 +const EVP_CIPHER *EVP_rc4(void); +const EVP_CIPHER *EVP_rc4_40(void); +# ifndef OPENSSL_NO_MD5 +const EVP_CIPHER *EVP_rc4_hmac_md5(void); +# endif +# endif +# ifndef OPENSSL_NO_IDEA +const EVP_CIPHER *EVP_idea_ecb(void); +const EVP_CIPHER *EVP_idea_cfb64(void); +# define EVP_idea_cfb EVP_idea_cfb64 +const EVP_CIPHER *EVP_idea_ofb(void); +const EVP_CIPHER *EVP_idea_cbc(void); +# endif +# ifndef OPENSSL_NO_RC2 +const EVP_CIPHER *EVP_rc2_ecb(void); +const EVP_CIPHER *EVP_rc2_cbc(void); +const EVP_CIPHER *EVP_rc2_40_cbc(void); +const EVP_CIPHER *EVP_rc2_64_cbc(void); +const EVP_CIPHER *EVP_rc2_cfb64(void); +# define EVP_rc2_cfb EVP_rc2_cfb64 +const EVP_CIPHER *EVP_rc2_ofb(void); +# endif +# ifndef OPENSSL_NO_BF +const EVP_CIPHER *EVP_bf_ecb(void); +const EVP_CIPHER *EVP_bf_cbc(void); +const EVP_CIPHER *EVP_bf_cfb64(void); +# define EVP_bf_cfb EVP_bf_cfb64 +const EVP_CIPHER *EVP_bf_ofb(void); +# endif +# ifndef OPENSSL_NO_CAST +const EVP_CIPHER *EVP_cast5_ecb(void); +const EVP_CIPHER *EVP_cast5_cbc(void); +const EVP_CIPHER *EVP_cast5_cfb64(void); +# define EVP_cast5_cfb EVP_cast5_cfb64 +const EVP_CIPHER *EVP_cast5_ofb(void); +# endif +# ifndef OPENSSL_NO_RC5 +const EVP_CIPHER *EVP_rc5_32_12_16_cbc(void); +const EVP_CIPHER *EVP_rc5_32_12_16_ecb(void); +const EVP_CIPHER *EVP_rc5_32_12_16_cfb64(void); +# define EVP_rc5_32_12_16_cfb EVP_rc5_32_12_16_cfb64 +const EVP_CIPHER *EVP_rc5_32_12_16_ofb(void); +# endif +# ifndef OPENSSL_NO_AES +const EVP_CIPHER *EVP_aes_128_ecb(void); +const EVP_CIPHER *EVP_aes_128_cbc(void); +const EVP_CIPHER *EVP_aes_128_cfb1(void); +const EVP_CIPHER *EVP_aes_128_cfb8(void); +const EVP_CIPHER *EVP_aes_128_cfb128(void); +# define EVP_aes_128_cfb EVP_aes_128_cfb128 +const EVP_CIPHER *EVP_aes_128_ofb(void); +const EVP_CIPHER *EVP_aes_128_ctr(void); +const EVP_CIPHER *EVP_aes_128_ccm(void); +const EVP_CIPHER *EVP_aes_128_gcm(void); +const EVP_CIPHER *EVP_aes_128_xts(void); +const EVP_CIPHER *EVP_aes_128_wrap(void); +const EVP_CIPHER *EVP_aes_192_ecb(void); +const EVP_CIPHER *EVP_aes_192_cbc(void); +const EVP_CIPHER *EVP_aes_192_cfb1(void); +const EVP_CIPHER *EVP_aes_192_cfb8(void); +const EVP_CIPHER *EVP_aes_192_cfb128(void); +# define EVP_aes_192_cfb EVP_aes_192_cfb128 +const EVP_CIPHER *EVP_aes_192_ofb(void); +const EVP_CIPHER *EVP_aes_192_ctr(void); +const EVP_CIPHER *EVP_aes_192_ccm(void); +const EVP_CIPHER *EVP_aes_192_gcm(void); +const EVP_CIPHER *EVP_aes_192_wrap(void); +const EVP_CIPHER *EVP_aes_256_ecb(void); +const EVP_CIPHER *EVP_aes_256_cbc(void); +const EVP_CIPHER *EVP_aes_256_cfb1(void); +const EVP_CIPHER *EVP_aes_256_cfb8(void); +const EVP_CIPHER *EVP_aes_256_cfb128(void); +# define EVP_aes_256_cfb EVP_aes_256_cfb128 +const EVP_CIPHER *EVP_aes_256_ofb(void); +const EVP_CIPHER *EVP_aes_256_ctr(void); +const EVP_CIPHER *EVP_aes_256_ccm(void); +const EVP_CIPHER *EVP_aes_256_gcm(void); +const EVP_CIPHER *EVP_aes_256_xts(void); +const EVP_CIPHER *EVP_aes_256_wrap(void); +# if !defined(OPENSSL_NO_SHA) && !defined(OPENSSL_NO_SHA1) +const EVP_CIPHER *EVP_aes_128_cbc_hmac_sha1(void); +const EVP_CIPHER *EVP_aes_256_cbc_hmac_sha1(void); +# endif +# ifndef OPENSSL_NO_SHA256 +const EVP_CIPHER *EVP_aes_128_cbc_hmac_sha256(void); +const EVP_CIPHER *EVP_aes_256_cbc_hmac_sha256(void); +# endif +# endif +# ifndef OPENSSL_NO_CAMELLIA +const EVP_CIPHER *EVP_camellia_128_ecb(void); +const EVP_CIPHER *EVP_camellia_128_cbc(void); +const EVP_CIPHER *EVP_camellia_128_cfb1(void); +const EVP_CIPHER *EVP_camellia_128_cfb8(void); +const EVP_CIPHER *EVP_camellia_128_cfb128(void); +# define EVP_camellia_128_cfb EVP_camellia_128_cfb128 +const EVP_CIPHER *EVP_camellia_128_ofb(void); +const EVP_CIPHER *EVP_camellia_192_ecb(void); +const EVP_CIPHER *EVP_camellia_192_cbc(void); +const EVP_CIPHER *EVP_camellia_192_cfb1(void); +const EVP_CIPHER *EVP_camellia_192_cfb8(void); +const EVP_CIPHER *EVP_camellia_192_cfb128(void); +# define EVP_camellia_192_cfb EVP_camellia_192_cfb128 +const EVP_CIPHER *EVP_camellia_192_ofb(void); +const EVP_CIPHER *EVP_camellia_256_ecb(void); +const EVP_CIPHER *EVP_camellia_256_cbc(void); +const EVP_CIPHER *EVP_camellia_256_cfb1(void); +const EVP_CIPHER *EVP_camellia_256_cfb8(void); +const EVP_CIPHER *EVP_camellia_256_cfb128(void); +# define EVP_camellia_256_cfb EVP_camellia_256_cfb128 +const EVP_CIPHER *EVP_camellia_256_ofb(void); +# endif + +# ifndef OPENSSL_NO_SEED +const EVP_CIPHER *EVP_seed_ecb(void); +const EVP_CIPHER *EVP_seed_cbc(void); +const EVP_CIPHER *EVP_seed_cfb128(void); +# define EVP_seed_cfb EVP_seed_cfb128 +const EVP_CIPHER *EVP_seed_ofb(void); +# endif + +void OPENSSL_add_all_algorithms_noconf(void); +void OPENSSL_add_all_algorithms_conf(void); + +# ifdef OPENSSL_LOAD_CONF +# define OpenSSL_add_all_algorithms() \ + OPENSSL_add_all_algorithms_conf() +# else +# define OpenSSL_add_all_algorithms() \ + OPENSSL_add_all_algorithms_noconf() +# endif + +void OpenSSL_add_all_ciphers(void); +void OpenSSL_add_all_digests(void); +# define SSLeay_add_all_algorithms() OpenSSL_add_all_algorithms() +# define SSLeay_add_all_ciphers() OpenSSL_add_all_ciphers() +# define SSLeay_add_all_digests() OpenSSL_add_all_digests() + +int EVP_add_cipher(const EVP_CIPHER *cipher); +int EVP_add_digest(const EVP_MD *digest); + +const EVP_CIPHER *EVP_get_cipherbyname(const char *name); +const EVP_MD *EVP_get_digestbyname(const char *name); +void EVP_cleanup(void); + +void EVP_CIPHER_do_all(void (*fn) (const EVP_CIPHER *ciph, + const char *from, const char *to, void *x), + void *arg); +void EVP_CIPHER_do_all_sorted(void (*fn) + (const EVP_CIPHER *ciph, const char *from, + const char *to, void *x), void *arg); + +void EVP_MD_do_all(void (*fn) (const EVP_MD *ciph, + const char *from, const char *to, void *x), + void *arg); +void EVP_MD_do_all_sorted(void (*fn) + (const EVP_MD *ciph, const char *from, + const char *to, void *x), void *arg); + +int EVP_PKEY_decrypt_old(unsigned char *dec_key, + const unsigned char *enc_key, int enc_key_len, + EVP_PKEY *private_key); +int EVP_PKEY_encrypt_old(unsigned char *enc_key, + const unsigned char *key, int key_len, + EVP_PKEY *pub_key); +int EVP_PKEY_type(int type); +int EVP_PKEY_id(const EVP_PKEY *pkey); +int EVP_PKEY_base_id(const EVP_PKEY *pkey); +int EVP_PKEY_bits(EVP_PKEY *pkey); +int EVP_PKEY_size(EVP_PKEY *pkey); +int EVP_PKEY_set_type(EVP_PKEY *pkey, int type); +int EVP_PKEY_set_type_str(EVP_PKEY *pkey, const char *str, int len); +int EVP_PKEY_assign(EVP_PKEY *pkey, int type, void *key); +void *EVP_PKEY_get0(EVP_PKEY *pkey); + +# ifndef OPENSSL_NO_RSA +struct rsa_st; +int EVP_PKEY_set1_RSA(EVP_PKEY *pkey, struct rsa_st *key); +struct rsa_st *EVP_PKEY_get1_RSA(EVP_PKEY *pkey); +# endif +# ifndef OPENSSL_NO_DSA +struct dsa_st; +int EVP_PKEY_set1_DSA(EVP_PKEY *pkey, struct dsa_st *key); +struct dsa_st *EVP_PKEY_get1_DSA(EVP_PKEY *pkey); +# endif +# ifndef OPENSSL_NO_DH +struct dh_st; +int EVP_PKEY_set1_DH(EVP_PKEY *pkey, struct dh_st *key); +struct dh_st *EVP_PKEY_get1_DH(EVP_PKEY *pkey); +# endif +# ifndef OPENSSL_NO_EC +struct ec_key_st; +int EVP_PKEY_set1_EC_KEY(EVP_PKEY *pkey, struct ec_key_st *key); +struct ec_key_st *EVP_PKEY_get1_EC_KEY(EVP_PKEY *pkey); +# endif + +EVP_PKEY *EVP_PKEY_new(void); +void EVP_PKEY_free(EVP_PKEY *pkey); + +EVP_PKEY *d2i_PublicKey(int type, EVP_PKEY **a, const unsigned char **pp, + long length); +int i2d_PublicKey(EVP_PKEY *a, unsigned char **pp); + +EVP_PKEY *d2i_PrivateKey(int type, EVP_PKEY **a, const unsigned char **pp, + long length); +EVP_PKEY *d2i_AutoPrivateKey(EVP_PKEY **a, const unsigned char **pp, + long length); +int i2d_PrivateKey(EVP_PKEY *a, unsigned char **pp); + +int EVP_PKEY_copy_parameters(EVP_PKEY *to, const EVP_PKEY *from); +int EVP_PKEY_missing_parameters(const EVP_PKEY *pkey); +int EVP_PKEY_save_parameters(EVP_PKEY *pkey, int mode); +int EVP_PKEY_cmp_parameters(const EVP_PKEY *a, const EVP_PKEY *b); + +int EVP_PKEY_cmp(const EVP_PKEY *a, const EVP_PKEY *b); + +int EVP_PKEY_print_public(BIO *out, const EVP_PKEY *pkey, + int indent, ASN1_PCTX *pctx); +int EVP_PKEY_print_private(BIO *out, const EVP_PKEY *pkey, + int indent, ASN1_PCTX *pctx); +int EVP_PKEY_print_params(BIO *out, const EVP_PKEY *pkey, + int indent, ASN1_PCTX *pctx); + +int EVP_PKEY_get_default_digest_nid(EVP_PKEY *pkey, int *pnid); + +int EVP_CIPHER_type(const EVP_CIPHER *ctx); + +/* calls methods */ +int EVP_CIPHER_param_to_asn1(EVP_CIPHER_CTX *c, ASN1_TYPE *type); +int EVP_CIPHER_asn1_to_param(EVP_CIPHER_CTX *c, ASN1_TYPE *type); + +/* These are used by EVP_CIPHER methods */ +int EVP_CIPHER_set_asn1_iv(EVP_CIPHER_CTX *c, ASN1_TYPE *type); +int EVP_CIPHER_get_asn1_iv(EVP_CIPHER_CTX *c, ASN1_TYPE *type); + +/* PKCS5 password based encryption */ +int PKCS5_PBE_keyivgen(EVP_CIPHER_CTX *ctx, const char *pass, int passlen, + ASN1_TYPE *param, const EVP_CIPHER *cipher, + const EVP_MD *md, int en_de); +int PKCS5_PBKDF2_HMAC_SHA1(const char *pass, int passlen, + const unsigned char *salt, int saltlen, int iter, + int keylen, unsigned char *out); +int PKCS5_PBKDF2_HMAC(const char *pass, int passlen, + const unsigned char *salt, int saltlen, int iter, + const EVP_MD *digest, int keylen, unsigned char *out); +int PKCS5_v2_PBE_keyivgen(EVP_CIPHER_CTX *ctx, const char *pass, int passlen, + ASN1_TYPE *param, const EVP_CIPHER *cipher, + const EVP_MD *md, int en_de); + +void PKCS5_PBE_add(void); + +int EVP_PBE_CipherInit(ASN1_OBJECT *pbe_obj, const char *pass, int passlen, + ASN1_TYPE *param, EVP_CIPHER_CTX *ctx, int en_de); + +/* PBE type */ + +/* Can appear as the outermost AlgorithmIdentifier */ +# define EVP_PBE_TYPE_OUTER 0x0 +/* Is an PRF type OID */ +# define EVP_PBE_TYPE_PRF 0x1 + +int EVP_PBE_alg_add_type(int pbe_type, int pbe_nid, int cipher_nid, + int md_nid, EVP_PBE_KEYGEN *keygen); +int EVP_PBE_alg_add(int nid, const EVP_CIPHER *cipher, const EVP_MD *md, + EVP_PBE_KEYGEN *keygen); +int EVP_PBE_find(int type, int pbe_nid, int *pcnid, int *pmnid, + EVP_PBE_KEYGEN **pkeygen); +void EVP_PBE_cleanup(void); + +# define ASN1_PKEY_ALIAS 0x1 +# define ASN1_PKEY_DYNAMIC 0x2 +# define ASN1_PKEY_SIGPARAM_NULL 0x4 + +# define ASN1_PKEY_CTRL_PKCS7_SIGN 0x1 +# define ASN1_PKEY_CTRL_PKCS7_ENCRYPT 0x2 +# define ASN1_PKEY_CTRL_DEFAULT_MD_NID 0x3 +# define ASN1_PKEY_CTRL_CMS_SIGN 0x5 +# define ASN1_PKEY_CTRL_CMS_ENVELOPE 0x7 +# define ASN1_PKEY_CTRL_CMS_RI_TYPE 0x8 + +int EVP_PKEY_asn1_get_count(void); +const EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_get0(int idx); +const EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_find(ENGINE **pe, int type); +const EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_find_str(ENGINE **pe, + const char *str, int len); +int EVP_PKEY_asn1_add0(const EVP_PKEY_ASN1_METHOD *ameth); +int EVP_PKEY_asn1_add_alias(int to, int from); +int EVP_PKEY_asn1_get0_info(int *ppkey_id, int *pkey_base_id, + int *ppkey_flags, const char **pinfo, + const char **ppem_str, + const EVP_PKEY_ASN1_METHOD *ameth); + +const EVP_PKEY_ASN1_METHOD *EVP_PKEY_get0_asn1(EVP_PKEY *pkey); +EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_new(int id, int flags, + const char *pem_str, + const char *info); +void EVP_PKEY_asn1_copy(EVP_PKEY_ASN1_METHOD *dst, + const EVP_PKEY_ASN1_METHOD *src); +void EVP_PKEY_asn1_free(EVP_PKEY_ASN1_METHOD *ameth); +void EVP_PKEY_asn1_set_public(EVP_PKEY_ASN1_METHOD *ameth, + int (*pub_decode) (EVP_PKEY *pk, + X509_PUBKEY *pub), + int (*pub_encode) (X509_PUBKEY *pub, + const EVP_PKEY *pk), + int (*pub_cmp) (const EVP_PKEY *a, + const EVP_PKEY *b), + int (*pub_print) (BIO *out, + const EVP_PKEY *pkey, + int indent, ASN1_PCTX *pctx), + int (*pkey_size) (const EVP_PKEY *pk), + int (*pkey_bits) (const EVP_PKEY *pk)); +void EVP_PKEY_asn1_set_private(EVP_PKEY_ASN1_METHOD *ameth, + int (*priv_decode) (EVP_PKEY *pk, + PKCS8_PRIV_KEY_INFO + *p8inf), + int (*priv_encode) (PKCS8_PRIV_KEY_INFO *p8, + const EVP_PKEY *pk), + int (*priv_print) (BIO *out, + const EVP_PKEY *pkey, + int indent, + ASN1_PCTX *pctx)); +void EVP_PKEY_asn1_set_param(EVP_PKEY_ASN1_METHOD *ameth, + int (*param_decode) (EVP_PKEY *pkey, + const unsigned char **pder, + int derlen), + int (*param_encode) (const EVP_PKEY *pkey, + unsigned char **pder), + int (*param_missing) (const EVP_PKEY *pk), + int (*param_copy) (EVP_PKEY *to, + const EVP_PKEY *from), + int (*param_cmp) (const EVP_PKEY *a, + const EVP_PKEY *b), + int (*param_print) (BIO *out, + const EVP_PKEY *pkey, + int indent, + ASN1_PCTX *pctx)); + +void EVP_PKEY_asn1_set_free(EVP_PKEY_ASN1_METHOD *ameth, + void (*pkey_free) (EVP_PKEY *pkey)); +void EVP_PKEY_asn1_set_ctrl(EVP_PKEY_ASN1_METHOD *ameth, + int (*pkey_ctrl) (EVP_PKEY *pkey, int op, + long arg1, void *arg2)); +void EVP_PKEY_asn1_set_item(EVP_PKEY_ASN1_METHOD *ameth, + int (*item_verify) (EVP_MD_CTX *ctx, + const ASN1_ITEM *it, + void *asn, + X509_ALGOR *a, + ASN1_BIT_STRING *sig, + EVP_PKEY *pkey), + int (*item_sign) (EVP_MD_CTX *ctx, + const ASN1_ITEM *it, + void *asn, + X509_ALGOR *alg1, + X509_ALGOR *alg2, + ASN1_BIT_STRING *sig)); + +# define EVP_PKEY_OP_UNDEFINED 0 +# define EVP_PKEY_OP_PARAMGEN (1<<1) +# define EVP_PKEY_OP_KEYGEN (1<<2) +# define EVP_PKEY_OP_SIGN (1<<3) +# define EVP_PKEY_OP_VERIFY (1<<4) +# define EVP_PKEY_OP_VERIFYRECOVER (1<<5) +# define EVP_PKEY_OP_SIGNCTX (1<<6) +# define EVP_PKEY_OP_VERIFYCTX (1<<7) +# define EVP_PKEY_OP_ENCRYPT (1<<8) +# define EVP_PKEY_OP_DECRYPT (1<<9) +# define EVP_PKEY_OP_DERIVE (1<<10) + +# define EVP_PKEY_OP_TYPE_SIG \ + (EVP_PKEY_OP_SIGN | EVP_PKEY_OP_VERIFY | EVP_PKEY_OP_VERIFYRECOVER \ + | EVP_PKEY_OP_SIGNCTX | EVP_PKEY_OP_VERIFYCTX) + +# define EVP_PKEY_OP_TYPE_CRYPT \ + (EVP_PKEY_OP_ENCRYPT | EVP_PKEY_OP_DECRYPT) + +# define EVP_PKEY_OP_TYPE_NOGEN \ + (EVP_PKEY_OP_SIG | EVP_PKEY_OP_CRYPT | EVP_PKEY_OP_DERIVE) + +# define EVP_PKEY_OP_TYPE_GEN \ + (EVP_PKEY_OP_PARAMGEN | EVP_PKEY_OP_KEYGEN) + +# define EVP_PKEY_CTX_set_signature_md(ctx, md) \ + EVP_PKEY_CTX_ctrl(ctx, -1, EVP_PKEY_OP_TYPE_SIG, \ + EVP_PKEY_CTRL_MD, 0, (void *)md) + +# define EVP_PKEY_CTX_get_signature_md(ctx, pmd) \ + EVP_PKEY_CTX_ctrl(ctx, -1, EVP_PKEY_OP_TYPE_SIG, \ + EVP_PKEY_CTRL_GET_MD, 0, (void *)pmd) + +# define EVP_PKEY_CTRL_MD 1 +# define EVP_PKEY_CTRL_PEER_KEY 2 + +# define EVP_PKEY_CTRL_PKCS7_ENCRYPT 3 +# define EVP_PKEY_CTRL_PKCS7_DECRYPT 4 + +# define EVP_PKEY_CTRL_PKCS7_SIGN 5 + +# define EVP_PKEY_CTRL_SET_MAC_KEY 6 + +# define EVP_PKEY_CTRL_DIGESTINIT 7 + +/* Used by GOST key encryption in TLS */ +# define EVP_PKEY_CTRL_SET_IV 8 + +# define EVP_PKEY_CTRL_CMS_ENCRYPT 9 +# define EVP_PKEY_CTRL_CMS_DECRYPT 10 +# define EVP_PKEY_CTRL_CMS_SIGN 11 + +# define EVP_PKEY_CTRL_CIPHER 12 + +# define EVP_PKEY_CTRL_GET_MD 13 + +# define EVP_PKEY_ALG_CTRL 0x1000 + +# define EVP_PKEY_FLAG_AUTOARGLEN 2 +/* + * Method handles all operations: don't assume any digest related defaults. + */ +# define EVP_PKEY_FLAG_SIGCTX_CUSTOM 4 + +const EVP_PKEY_METHOD *EVP_PKEY_meth_find(int type); +EVP_PKEY_METHOD *EVP_PKEY_meth_new(int id, int flags); +void EVP_PKEY_meth_get0_info(int *ppkey_id, int *pflags, + const EVP_PKEY_METHOD *meth); +void EVP_PKEY_meth_copy(EVP_PKEY_METHOD *dst, const EVP_PKEY_METHOD *src); +void EVP_PKEY_meth_free(EVP_PKEY_METHOD *pmeth); +int EVP_PKEY_meth_add0(const EVP_PKEY_METHOD *pmeth); + +EVP_PKEY_CTX *EVP_PKEY_CTX_new(EVP_PKEY *pkey, ENGINE *e); +EVP_PKEY_CTX *EVP_PKEY_CTX_new_id(int id, ENGINE *e); +EVP_PKEY_CTX *EVP_PKEY_CTX_dup(EVP_PKEY_CTX *ctx); +void EVP_PKEY_CTX_free(EVP_PKEY_CTX *ctx); + +int EVP_PKEY_CTX_ctrl(EVP_PKEY_CTX *ctx, int keytype, int optype, + int cmd, int p1, void *p2); +int EVP_PKEY_CTX_ctrl_str(EVP_PKEY_CTX *ctx, const char *type, + const char *value); + +int EVP_PKEY_CTX_get_operation(EVP_PKEY_CTX *ctx); +void EVP_PKEY_CTX_set0_keygen_info(EVP_PKEY_CTX *ctx, int *dat, int datlen); + +EVP_PKEY *EVP_PKEY_new_mac_key(int type, ENGINE *e, + const unsigned char *key, int keylen); + +void EVP_PKEY_CTX_set_data(EVP_PKEY_CTX *ctx, void *data); +void *EVP_PKEY_CTX_get_data(EVP_PKEY_CTX *ctx); +EVP_PKEY *EVP_PKEY_CTX_get0_pkey(EVP_PKEY_CTX *ctx); + +EVP_PKEY *EVP_PKEY_CTX_get0_peerkey(EVP_PKEY_CTX *ctx); + +void EVP_PKEY_CTX_set_app_data(EVP_PKEY_CTX *ctx, void *data); +void *EVP_PKEY_CTX_get_app_data(EVP_PKEY_CTX *ctx); + +int EVP_PKEY_sign_init(EVP_PKEY_CTX *ctx); +int EVP_PKEY_sign(EVP_PKEY_CTX *ctx, + unsigned char *sig, size_t *siglen, + const unsigned char *tbs, size_t tbslen); +int EVP_PKEY_verify_init(EVP_PKEY_CTX *ctx); +int EVP_PKEY_verify(EVP_PKEY_CTX *ctx, + const unsigned char *sig, size_t siglen, + const unsigned char *tbs, size_t tbslen); +int EVP_PKEY_verify_recover_init(EVP_PKEY_CTX *ctx); +int EVP_PKEY_verify_recover(EVP_PKEY_CTX *ctx, + unsigned char *rout, size_t *routlen, + const unsigned char *sig, size_t siglen); +int EVP_PKEY_encrypt_init(EVP_PKEY_CTX *ctx); +int EVP_PKEY_encrypt(EVP_PKEY_CTX *ctx, + unsigned char *out, size_t *outlen, + const unsigned char *in, size_t inlen); +int EVP_PKEY_decrypt_init(EVP_PKEY_CTX *ctx); +int EVP_PKEY_decrypt(EVP_PKEY_CTX *ctx, + unsigned char *out, size_t *outlen, + const unsigned char *in, size_t inlen); + +int EVP_PKEY_derive_init(EVP_PKEY_CTX *ctx); +int EVP_PKEY_derive_set_peer(EVP_PKEY_CTX *ctx, EVP_PKEY *peer); +int EVP_PKEY_derive(EVP_PKEY_CTX *ctx, unsigned char *key, size_t *keylen); + +typedef int EVP_PKEY_gen_cb (EVP_PKEY_CTX *ctx); + +int EVP_PKEY_paramgen_init(EVP_PKEY_CTX *ctx); +int EVP_PKEY_paramgen(EVP_PKEY_CTX *ctx, EVP_PKEY **ppkey); +int EVP_PKEY_keygen_init(EVP_PKEY_CTX *ctx); +int EVP_PKEY_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY **ppkey); + +void EVP_PKEY_CTX_set_cb(EVP_PKEY_CTX *ctx, EVP_PKEY_gen_cb *cb); +EVP_PKEY_gen_cb *EVP_PKEY_CTX_get_cb(EVP_PKEY_CTX *ctx); + +int EVP_PKEY_CTX_get_keygen_info(EVP_PKEY_CTX *ctx, int idx); + +void EVP_PKEY_meth_set_init(EVP_PKEY_METHOD *pmeth, + int (*init) (EVP_PKEY_CTX *ctx)); + +void EVP_PKEY_meth_set_copy(EVP_PKEY_METHOD *pmeth, + int (*copy) (EVP_PKEY_CTX *dst, + EVP_PKEY_CTX *src)); + +void EVP_PKEY_meth_set_cleanup(EVP_PKEY_METHOD *pmeth, + void (*cleanup) (EVP_PKEY_CTX *ctx)); + +void EVP_PKEY_meth_set_paramgen(EVP_PKEY_METHOD *pmeth, + int (*paramgen_init) (EVP_PKEY_CTX *ctx), + int (*paramgen) (EVP_PKEY_CTX *ctx, + EVP_PKEY *pkey)); + +void EVP_PKEY_meth_set_keygen(EVP_PKEY_METHOD *pmeth, + int (*keygen_init) (EVP_PKEY_CTX *ctx), + int (*keygen) (EVP_PKEY_CTX *ctx, + EVP_PKEY *pkey)); + +void EVP_PKEY_meth_set_sign(EVP_PKEY_METHOD *pmeth, + int (*sign_init) (EVP_PKEY_CTX *ctx), + int (*sign) (EVP_PKEY_CTX *ctx, + unsigned char *sig, size_t *siglen, + const unsigned char *tbs, + size_t tbslen)); + +void EVP_PKEY_meth_set_verify(EVP_PKEY_METHOD *pmeth, + int (*verify_init) (EVP_PKEY_CTX *ctx), + int (*verify) (EVP_PKEY_CTX *ctx, + const unsigned char *sig, + size_t siglen, + const unsigned char *tbs, + size_t tbslen)); + +void EVP_PKEY_meth_set_verify_recover(EVP_PKEY_METHOD *pmeth, + int (*verify_recover_init) (EVP_PKEY_CTX + *ctx), + int (*verify_recover) (EVP_PKEY_CTX + *ctx, + unsigned char + *sig, + size_t *siglen, + const unsigned + char *tbs, + size_t tbslen)); + +void EVP_PKEY_meth_set_signctx(EVP_PKEY_METHOD *pmeth, + int (*signctx_init) (EVP_PKEY_CTX *ctx, + EVP_MD_CTX *mctx), + int (*signctx) (EVP_PKEY_CTX *ctx, + unsigned char *sig, + size_t *siglen, + EVP_MD_CTX *mctx)); + +void EVP_PKEY_meth_set_verifyctx(EVP_PKEY_METHOD *pmeth, + int (*verifyctx_init) (EVP_PKEY_CTX *ctx, + EVP_MD_CTX *mctx), + int (*verifyctx) (EVP_PKEY_CTX *ctx, + const unsigned char *sig, + int siglen, + EVP_MD_CTX *mctx)); + +void EVP_PKEY_meth_set_encrypt(EVP_PKEY_METHOD *pmeth, + int (*encrypt_init) (EVP_PKEY_CTX *ctx), + int (*encryptfn) (EVP_PKEY_CTX *ctx, + unsigned char *out, + size_t *outlen, + const unsigned char *in, + size_t inlen)); + +void EVP_PKEY_meth_set_decrypt(EVP_PKEY_METHOD *pmeth, + int (*decrypt_init) (EVP_PKEY_CTX *ctx), + int (*decrypt) (EVP_PKEY_CTX *ctx, + unsigned char *out, + size_t *outlen, + const unsigned char *in, + size_t inlen)); + +void EVP_PKEY_meth_set_derive(EVP_PKEY_METHOD *pmeth, + int (*derive_init) (EVP_PKEY_CTX *ctx), + int (*derive) (EVP_PKEY_CTX *ctx, + unsigned char *key, + size_t *keylen)); + +void EVP_PKEY_meth_set_ctrl(EVP_PKEY_METHOD *pmeth, + int (*ctrl) (EVP_PKEY_CTX *ctx, int type, int p1, + void *p2), + int (*ctrl_str) (EVP_PKEY_CTX *ctx, + const char *type, + const char *value)); + +void EVP_add_alg_module(void); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_EVP_strings(void); + +/* Error codes for the EVP functions. */ + +/* Function codes. */ +# define EVP_F_AESNI_INIT_KEY 165 +# define EVP_F_AESNI_XTS_CIPHER 176 +# define EVP_F_AES_INIT_KEY 133 +# define EVP_F_AES_T4_INIT_KEY 178 +# define EVP_F_AES_XTS 172 +# define EVP_F_AES_XTS_CIPHER 175 +# define EVP_F_ALG_MODULE_INIT 177 +# define EVP_F_CAMELLIA_INIT_KEY 159 +# define EVP_F_CMAC_INIT 173 +# define EVP_F_CMLL_T4_INIT_KEY 179 +# define EVP_F_D2I_PKEY 100 +# define EVP_F_DO_SIGVER_INIT 161 +# define EVP_F_DSAPKEY2PKCS8 134 +# define EVP_F_DSA_PKEY2PKCS8 135 +# define EVP_F_ECDSA_PKEY2PKCS8 129 +# define EVP_F_ECKEY_PKEY2PKCS8 132 +# define EVP_F_EVP_CIPHERINIT_EX 123 +# define EVP_F_EVP_CIPHER_CTX_COPY 163 +# define EVP_F_EVP_CIPHER_CTX_CTRL 124 +# define EVP_F_EVP_CIPHER_CTX_SET_KEY_LENGTH 122 +# define EVP_F_EVP_DECRYPTFINAL_EX 101 +# define EVP_F_EVP_DIGESTINIT_EX 128 +# define EVP_F_EVP_ENCRYPTFINAL_EX 127 +# define EVP_F_EVP_MD_CTX_COPY_EX 110 +# define EVP_F_EVP_MD_SIZE 162 +# define EVP_F_EVP_OPENINIT 102 +# define EVP_F_EVP_PBE_ALG_ADD 115 +# define EVP_F_EVP_PBE_ALG_ADD_TYPE 160 +# define EVP_F_EVP_PBE_CIPHERINIT 116 +# define EVP_F_EVP_PKCS82PKEY 111 +# define EVP_F_EVP_PKCS82PKEY_BROKEN 136 +# define EVP_F_EVP_PKEY2PKCS8_BROKEN 113 +# define EVP_F_EVP_PKEY_COPY_PARAMETERS 103 +# define EVP_F_EVP_PKEY_CTX_CTRL 137 +# define EVP_F_EVP_PKEY_CTX_CTRL_STR 150 +# define EVP_F_EVP_PKEY_CTX_DUP 156 +# define EVP_F_EVP_PKEY_DECRYPT 104 +# define EVP_F_EVP_PKEY_DECRYPT_INIT 138 +# define EVP_F_EVP_PKEY_DECRYPT_OLD 151 +# define EVP_F_EVP_PKEY_DERIVE 153 +# define EVP_F_EVP_PKEY_DERIVE_INIT 154 +# define EVP_F_EVP_PKEY_DERIVE_SET_PEER 155 +# define EVP_F_EVP_PKEY_ENCRYPT 105 +# define EVP_F_EVP_PKEY_ENCRYPT_INIT 139 +# define EVP_F_EVP_PKEY_ENCRYPT_OLD 152 +# define EVP_F_EVP_PKEY_GET1_DH 119 +# define EVP_F_EVP_PKEY_GET1_DSA 120 +# define EVP_F_EVP_PKEY_GET1_ECDSA 130 +# define EVP_F_EVP_PKEY_GET1_EC_KEY 131 +# define EVP_F_EVP_PKEY_GET1_RSA 121 +# define EVP_F_EVP_PKEY_KEYGEN 146 +# define EVP_F_EVP_PKEY_KEYGEN_INIT 147 +# define EVP_F_EVP_PKEY_NEW 106 +# define EVP_F_EVP_PKEY_PARAMGEN 148 +# define EVP_F_EVP_PKEY_PARAMGEN_INIT 149 +# define EVP_F_EVP_PKEY_SIGN 140 +# define EVP_F_EVP_PKEY_SIGN_INIT 141 +# define EVP_F_EVP_PKEY_VERIFY 142 +# define EVP_F_EVP_PKEY_VERIFY_INIT 143 +# define EVP_F_EVP_PKEY_VERIFY_RECOVER 144 +# define EVP_F_EVP_PKEY_VERIFY_RECOVER_INIT 145 +# define EVP_F_EVP_RIJNDAEL 126 +# define EVP_F_EVP_SIGNFINAL 107 +# define EVP_F_EVP_VERIFYFINAL 108 +# define EVP_F_FIPS_CIPHERINIT 166 +# define EVP_F_FIPS_CIPHER_CTX_COPY 170 +# define EVP_F_FIPS_CIPHER_CTX_CTRL 167 +# define EVP_F_FIPS_CIPHER_CTX_SET_KEY_LENGTH 171 +# define EVP_F_FIPS_DIGESTINIT 168 +# define EVP_F_FIPS_MD_CTX_COPY 169 +# define EVP_F_HMAC_INIT_EX 174 +# define EVP_F_INT_CTX_NEW 157 +# define EVP_F_PKCS5_PBE_KEYIVGEN 117 +# define EVP_F_PKCS5_V2_PBE_KEYIVGEN 118 +# define EVP_F_PKCS5_V2_PBKDF2_KEYIVGEN 164 +# define EVP_F_PKCS8_SET_BROKEN 112 +# define EVP_F_PKEY_SET_TYPE 158 +# define EVP_F_RC2_MAGIC_TO_METH 109 +# define EVP_F_RC5_CTRL 125 + +/* Reason codes. */ +# define EVP_R_AES_IV_SETUP_FAILED 162 +# define EVP_R_AES_KEY_SETUP_FAILED 143 +# define EVP_R_ASN1_LIB 140 +# define EVP_R_BAD_BLOCK_LENGTH 136 +# define EVP_R_BAD_DECRYPT 100 +# define EVP_R_BAD_KEY_LENGTH 137 +# define EVP_R_BN_DECODE_ERROR 112 +# define EVP_R_BN_PUBKEY_ERROR 113 +# define EVP_R_BUFFER_TOO_SMALL 155 +# define EVP_R_CAMELLIA_KEY_SETUP_FAILED 157 +# define EVP_R_CIPHER_PARAMETER_ERROR 122 +# define EVP_R_COMMAND_NOT_SUPPORTED 147 +# define EVP_R_CTRL_NOT_IMPLEMENTED 132 +# define EVP_R_CTRL_OPERATION_NOT_IMPLEMENTED 133 +# define EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH 138 +# define EVP_R_DECODE_ERROR 114 +# define EVP_R_DIFFERENT_KEY_TYPES 101 +# define EVP_R_DIFFERENT_PARAMETERS 153 +# define EVP_R_DISABLED_FOR_FIPS 163 +# define EVP_R_ENCODE_ERROR 115 +# define EVP_R_ERROR_LOADING_SECTION 165 +# define EVP_R_ERROR_SETTING_FIPS_MODE 166 +# define EVP_R_EVP_PBE_CIPHERINIT_ERROR 119 +# define EVP_R_EXPECTING_AN_RSA_KEY 127 +# define EVP_R_EXPECTING_A_DH_KEY 128 +# define EVP_R_EXPECTING_A_DSA_KEY 129 +# define EVP_R_EXPECTING_A_ECDSA_KEY 141 +# define EVP_R_EXPECTING_A_EC_KEY 142 +# define EVP_R_FIPS_MODE_NOT_SUPPORTED 167 +# define EVP_R_INITIALIZATION_ERROR 134 +# define EVP_R_INPUT_NOT_INITIALIZED 111 +# define EVP_R_INVALID_DIGEST 152 +# define EVP_R_INVALID_FIPS_MODE 168 +# define EVP_R_INVALID_KEY_LENGTH 130 +# define EVP_R_INVALID_OPERATION 148 +# define EVP_R_IV_TOO_LARGE 102 +# define EVP_R_KEYGEN_FAILURE 120 +# define EVP_R_MESSAGE_DIGEST_IS_NULL 159 +# define EVP_R_METHOD_NOT_SUPPORTED 144 +# define EVP_R_MISSING_PARAMETERS 103 +# define EVP_R_NO_CIPHER_SET 131 +# define EVP_R_NO_DEFAULT_DIGEST 158 +# define EVP_R_NO_DIGEST_SET 139 +# define EVP_R_NO_DSA_PARAMETERS 116 +# define EVP_R_NO_KEY_SET 154 +# define EVP_R_NO_OPERATION_SET 149 +# define EVP_R_NO_SIGN_FUNCTION_CONFIGURED 104 +# define EVP_R_NO_VERIFY_FUNCTION_CONFIGURED 105 +# define EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE 150 +# define EVP_R_OPERATON_NOT_INITIALIZED 151 +# define EVP_R_PKCS8_UNKNOWN_BROKEN_TYPE 117 +# define EVP_R_PRIVATE_KEY_DECODE_ERROR 145 +# define EVP_R_PRIVATE_KEY_ENCODE_ERROR 146 +# define EVP_R_PUBLIC_KEY_NOT_RSA 106 +# define EVP_R_TOO_LARGE 164 +# define EVP_R_UNKNOWN_CIPHER 160 +# define EVP_R_UNKNOWN_DIGEST 161 +# define EVP_R_UNKNOWN_OPTION 169 +# define EVP_R_UNKNOWN_PBE_ALGORITHM 121 +# define EVP_R_UNSUPORTED_NUMBER_OF_ROUNDS 135 +# define EVP_R_UNSUPPORTED_ALGORITHM 156 +# define EVP_R_UNSUPPORTED_CIPHER 107 +# define EVP_R_UNSUPPORTED_KEYLENGTH 123 +# define EVP_R_UNSUPPORTED_KEY_DERIVATION_FUNCTION 124 +# define EVP_R_UNSUPPORTED_KEY_SIZE 108 +# define EVP_R_UNSUPPORTED_PRF 125 +# define EVP_R_UNSUPPORTED_PRIVATE_KEY_ALGORITHM 118 +# define EVP_R_UNSUPPORTED_SALT_TYPE 126 +# define EVP_R_WRAP_MODE_NOT_ALLOWED 170 +# define EVP_R_WRONG_FINAL_BLOCK_LENGTH 109 +# define EVP_R_WRONG_PUBLIC_KEY_TYPE 110 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/hmac.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/hmac.h new file mode 100644 index 0000000..b8b55cd --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/hmac.h @@ -0,0 +1,109 @@ +/* crypto/hmac/hmac.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ +#ifndef HEADER_HMAC_H +# define HEADER_HMAC_H + +# include + +# ifdef OPENSSL_NO_HMAC +# error HMAC is disabled. +# endif + +# include + +# define HMAC_MAX_MD_CBLOCK 128/* largest known is SHA512 */ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct hmac_ctx_st { + const EVP_MD *md; + EVP_MD_CTX md_ctx; + EVP_MD_CTX i_ctx; + EVP_MD_CTX o_ctx; + unsigned int key_length; + unsigned char key[HMAC_MAX_MD_CBLOCK]; +} HMAC_CTX; + +# define HMAC_size(e) (EVP_MD_size((e)->md)) + +void HMAC_CTX_init(HMAC_CTX *ctx); +void HMAC_CTX_cleanup(HMAC_CTX *ctx); + +/* deprecated */ +# define HMAC_cleanup(ctx) HMAC_CTX_cleanup(ctx) + +/* deprecated */ +int HMAC_Init(HMAC_CTX *ctx, const void *key, int len, const EVP_MD *md); +int HMAC_Init_ex(HMAC_CTX *ctx, const void *key, int len, + const EVP_MD *md, ENGINE *impl); +int HMAC_Update(HMAC_CTX *ctx, const unsigned char *data, size_t len); +int HMAC_Final(HMAC_CTX *ctx, unsigned char *md, unsigned int *len); +unsigned char *HMAC(const EVP_MD *evp_md, const void *key, int key_len, + const unsigned char *d, size_t n, unsigned char *md, + unsigned int *md_len); +int HMAC_CTX_copy(HMAC_CTX *dctx, HMAC_CTX *sctx); + +void HMAC_CTX_set_flags(HMAC_CTX *ctx, unsigned long flags); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/idea.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/idea.h new file mode 100644 index 0000000..6075984 --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/idea.h @@ -0,0 +1,105 @@ +/* crypto/idea/idea.h */ +/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_IDEA_H +# define HEADER_IDEA_H + +# include /* IDEA_INT, OPENSSL_NO_IDEA */ + +# ifdef OPENSSL_NO_IDEA +# error IDEA is disabled. +# endif + +# define IDEA_ENCRYPT 1 +# define IDEA_DECRYPT 0 + +# define IDEA_BLOCK 8 +# define IDEA_KEY_LENGTH 16 + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct idea_key_st { + IDEA_INT data[9][6]; +} IDEA_KEY_SCHEDULE; + +const char *idea_options(void); +void idea_ecb_encrypt(const unsigned char *in, unsigned char *out, + IDEA_KEY_SCHEDULE *ks); +# ifdef OPENSSL_FIPS +void private_idea_set_encrypt_key(const unsigned char *key, + IDEA_KEY_SCHEDULE *ks); +# endif +void idea_set_encrypt_key(const unsigned char *key, IDEA_KEY_SCHEDULE *ks); +void idea_set_decrypt_key(IDEA_KEY_SCHEDULE *ek, IDEA_KEY_SCHEDULE *dk); +void idea_cbc_encrypt(const unsigned char *in, unsigned char *out, + long length, IDEA_KEY_SCHEDULE *ks, unsigned char *iv, + int enc); +void idea_cfb64_encrypt(const unsigned char *in, unsigned char *out, + long length, IDEA_KEY_SCHEDULE *ks, unsigned char *iv, + int *num, int enc); +void idea_ofb64_encrypt(const unsigned char *in, unsigned char *out, + long length, IDEA_KEY_SCHEDULE *ks, unsigned char *iv, + int *num); +void idea_encrypt(unsigned long *in, IDEA_KEY_SCHEDULE *ks); +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/krb5_asn.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/krb5_asn.h new file mode 100644 index 0000000..9cf5a26 --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/krb5_asn.h @@ -0,0 +1,240 @@ +/* krb5_asn.h */ +/* + * Written by Vern Staats for the OpenSSL project, ** + * using ocsp/{*.h,*asn*.c} as a starting point + */ + +/* ==================================================================== + * Copyright (c) 1998-2000 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_KRB5_ASN_H +# define HEADER_KRB5_ASN_H + +/* + * #include + */ +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * ASN.1 from Kerberos RFC 1510 + */ + +/*- EncryptedData ::= SEQUENCE { + * etype[0] INTEGER, -- EncryptionType + * kvno[1] INTEGER OPTIONAL, + * cipher[2] OCTET STRING -- ciphertext + * } + */ +typedef struct krb5_encdata_st { + ASN1_INTEGER *etype; + ASN1_INTEGER *kvno; + ASN1_OCTET_STRING *cipher; +} KRB5_ENCDATA; + +DECLARE_STACK_OF(KRB5_ENCDATA) + +/*- PrincipalName ::= SEQUENCE { + * name-type[0] INTEGER, + * name-string[1] SEQUENCE OF GeneralString + * } + */ +typedef struct krb5_princname_st { + ASN1_INTEGER *nametype; + STACK_OF(ASN1_GENERALSTRING) *namestring; +} KRB5_PRINCNAME; + +DECLARE_STACK_OF(KRB5_PRINCNAME) + +/*- Ticket ::= [APPLICATION 1] SEQUENCE { + * tkt-vno[0] INTEGER, + * realm[1] Realm, + * sname[2] PrincipalName, + * enc-part[3] EncryptedData + * } + */ +typedef struct krb5_tktbody_st { + ASN1_INTEGER *tktvno; + ASN1_GENERALSTRING *realm; + KRB5_PRINCNAME *sname; + KRB5_ENCDATA *encdata; +} KRB5_TKTBODY; + +typedef STACK_OF(KRB5_TKTBODY) KRB5_TICKET; +DECLARE_STACK_OF(KRB5_TKTBODY) + +/*- AP-REQ ::= [APPLICATION 14] SEQUENCE { + * pvno[0] INTEGER, + * msg-type[1] INTEGER, + * ap-options[2] APOptions, + * ticket[3] Ticket, + * authenticator[4] EncryptedData + * } + * + * APOptions ::= BIT STRING { + * reserved(0), use-session-key(1), mutual-required(2) } + */ +typedef struct krb5_ap_req_st { + ASN1_INTEGER *pvno; + ASN1_INTEGER *msgtype; + ASN1_BIT_STRING *apoptions; + KRB5_TICKET *ticket; + KRB5_ENCDATA *authenticator; +} KRB5_APREQBODY; + +typedef STACK_OF(KRB5_APREQBODY) KRB5_APREQ; +DECLARE_STACK_OF(KRB5_APREQBODY) + +/* Authenticator Stuff */ + +/*- Checksum ::= SEQUENCE { + * cksumtype[0] INTEGER, + * checksum[1] OCTET STRING + * } + */ +typedef struct krb5_checksum_st { + ASN1_INTEGER *ctype; + ASN1_OCTET_STRING *checksum; +} KRB5_CHECKSUM; + +DECLARE_STACK_OF(KRB5_CHECKSUM) + +/*- EncryptionKey ::= SEQUENCE { + * keytype[0] INTEGER, + * keyvalue[1] OCTET STRING + * } + */ +typedef struct krb5_encryptionkey_st { + ASN1_INTEGER *ktype; + ASN1_OCTET_STRING *keyvalue; +} KRB5_ENCKEY; + +DECLARE_STACK_OF(KRB5_ENCKEY) + +/*- AuthorizationData ::= SEQUENCE OF SEQUENCE { + * ad-type[0] INTEGER, + * ad-data[1] OCTET STRING + * } + */ +typedef struct krb5_authorization_st { + ASN1_INTEGER *adtype; + ASN1_OCTET_STRING *addata; +} KRB5_AUTHDATA; + +DECLARE_STACK_OF(KRB5_AUTHDATA) + +/*- -- Unencrypted authenticator + * Authenticator ::= [APPLICATION 2] SEQUENCE { + * authenticator-vno[0] INTEGER, + * crealm[1] Realm, + * cname[2] PrincipalName, + * cksum[3] Checksum OPTIONAL, + * cusec[4] INTEGER, + * ctime[5] KerberosTime, + * subkey[6] EncryptionKey OPTIONAL, + * seq-number[7] INTEGER OPTIONAL, + * authorization-data[8] AuthorizationData OPTIONAL + * } + */ +typedef struct krb5_authenticator_st { + ASN1_INTEGER *avno; + ASN1_GENERALSTRING *crealm; + KRB5_PRINCNAME *cname; + KRB5_CHECKSUM *cksum; + ASN1_INTEGER *cusec; + ASN1_GENERALIZEDTIME *ctime; + KRB5_ENCKEY *subkey; + ASN1_INTEGER *seqnum; + KRB5_AUTHDATA *authorization; +} KRB5_AUTHENTBODY; + +typedef STACK_OF(KRB5_AUTHENTBODY) KRB5_AUTHENT; +DECLARE_STACK_OF(KRB5_AUTHENTBODY) + +/*- DECLARE_ASN1_FUNCTIONS(type) = DECLARE_ASN1_FUNCTIONS_name(type, type) = + * type *name##_new(void); + * void name##_free(type *a); + * DECLARE_ASN1_ENCODE_FUNCTIONS(type, name, name) = + * DECLARE_ASN1_ENCODE_FUNCTIONS(type, itname, name) = + * type *d2i_##name(type **a, const unsigned char **in, long len); + * int i2d_##name(type *a, unsigned char **out); + * DECLARE_ASN1_ITEM(itname) = OPENSSL_EXTERN const ASN1_ITEM itname##_it + */ + +DECLARE_ASN1_FUNCTIONS(KRB5_ENCDATA) +DECLARE_ASN1_FUNCTIONS(KRB5_PRINCNAME) +DECLARE_ASN1_FUNCTIONS(KRB5_TKTBODY) +DECLARE_ASN1_FUNCTIONS(KRB5_APREQBODY) +DECLARE_ASN1_FUNCTIONS(KRB5_TICKET) +DECLARE_ASN1_FUNCTIONS(KRB5_APREQ) + +DECLARE_ASN1_FUNCTIONS(KRB5_CHECKSUM) +DECLARE_ASN1_FUNCTIONS(KRB5_ENCKEY) +DECLARE_ASN1_FUNCTIONS(KRB5_AUTHDATA) +DECLARE_ASN1_FUNCTIONS(KRB5_AUTHENTBODY) +DECLARE_ASN1_FUNCTIONS(KRB5_AUTHENT) + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/kssl.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/kssl.h new file mode 100644 index 0000000..ae8a51f --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/kssl.h @@ -0,0 +1,197 @@ +/* ssl/kssl.h */ +/* + * Written by Vern Staats for the OpenSSL project + * 2000. project 2000. + */ +/* ==================================================================== + * Copyright (c) 2000 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +/* + ** 19990701 VRS Started. + */ + +#ifndef KSSL_H +# define KSSL_H + +# include + +# ifndef OPENSSL_NO_KRB5 + +# include +# include +# include +# ifdef OPENSSL_SYS_WIN32 +/* + * These can sometimes get redefined indirectly by krb5 header files after + * they get undefed in ossl_typ.h + */ +# undef X509_NAME +# undef X509_EXTENSIONS +# undef OCSP_REQUEST +# undef OCSP_RESPONSE +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Depending on which KRB5 implementation used, some types from + * the other may be missing. Resolve that here and now + */ +# ifdef KRB5_HEIMDAL +typedef unsigned char krb5_octet; +# define FAR +# else + +# ifndef FAR +# define FAR +# endif + +# endif + +/*- + * Uncomment this to debug kssl problems or + * to trace usage of the Kerberos session key + * + * #define KSSL_DEBUG + */ + +# ifndef KRB5SVC +# define KRB5SVC "host" +# endif + +# ifndef KRB5KEYTAB +# define KRB5KEYTAB "/etc/krb5.keytab" +# endif + +# ifndef KRB5SENDAUTH +# define KRB5SENDAUTH 1 +# endif + +# ifndef KRB5CHECKAUTH +# define KRB5CHECKAUTH 1 +# endif + +# ifndef KSSL_CLOCKSKEW +# define KSSL_CLOCKSKEW 300; +# endif + +# define KSSL_ERR_MAX 255 +typedef struct kssl_err_st { + int reason; + char text[KSSL_ERR_MAX + 1]; +} KSSL_ERR; + +/*- Context for passing + * (1) Kerberos session key to SSL, and + * (2) Config data between application and SSL lib + */ +typedef struct kssl_ctx_st { + /* used by: disposition: */ + char *service_name; /* C,S default ok (kssl) */ + char *service_host; /* C input, REQUIRED */ + char *client_princ; /* S output from krb5 ticket */ + char *keytab_file; /* S NULL (/etc/krb5.keytab) */ + char *cred_cache; /* C NULL (default) */ + krb5_enctype enctype; + int length; + krb5_octet FAR *key; +} KSSL_CTX; + +# define KSSL_CLIENT 1 +# define KSSL_SERVER 2 +# define KSSL_SERVICE 3 +# define KSSL_KEYTAB 4 + +# define KSSL_CTX_OK 0 +# define KSSL_CTX_ERR 1 +# define KSSL_NOMEM 2 + +/* Public (for use by applications that use OpenSSL with Kerberos 5 support */ +krb5_error_code kssl_ctx_setstring(KSSL_CTX *kssl_ctx, int which, char *text); +KSSL_CTX *kssl_ctx_new(void); +KSSL_CTX *kssl_ctx_free(KSSL_CTX *kssl_ctx); +void kssl_ctx_show(KSSL_CTX *kssl_ctx); +krb5_error_code kssl_ctx_setprinc(KSSL_CTX *kssl_ctx, int which, + krb5_data *realm, krb5_data *entity, + int nentities); +krb5_error_code kssl_cget_tkt(KSSL_CTX *kssl_ctx, krb5_data **enc_tktp, + krb5_data *authenp, KSSL_ERR *kssl_err); +krb5_error_code kssl_sget_tkt(KSSL_CTX *kssl_ctx, krb5_data *indata, + krb5_ticket_times *ttimes, KSSL_ERR *kssl_err); +krb5_error_code kssl_ctx_setkey(KSSL_CTX *kssl_ctx, krb5_keyblock *session); +void kssl_err_set(KSSL_ERR *kssl_err, int reason, char *text); +void kssl_krb5_free_data_contents(krb5_context context, krb5_data *data); +krb5_error_code kssl_build_principal_2(krb5_context context, + krb5_principal *princ, int rlen, + const char *realm, int slen, + const char *svc, int hlen, + const char *host); +krb5_error_code kssl_validate_times(krb5_timestamp atime, + krb5_ticket_times *ttimes); +krb5_error_code kssl_check_authent(KSSL_CTX *kssl_ctx, krb5_data *authentp, + krb5_timestamp *atimep, + KSSL_ERR *kssl_err); +unsigned char *kssl_skip_confound(krb5_enctype enctype, unsigned char *authn); + +void SSL_set0_kssl_ctx(SSL *s, KSSL_CTX *kctx); +KSSL_CTX *SSL_get0_kssl_ctx(SSL *s); +char *kssl_ctx_get0_client_princ(KSSL_CTX *kctx); + +#ifdef __cplusplus +} +#endif +# endif /* OPENSSL_NO_KRB5 */ +#endif /* KSSL_H */ diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/lhash.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/lhash.h new file mode 100644 index 0000000..b6c328b --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/lhash.h @@ -0,0 +1,240 @@ +/* crypto/lhash/lhash.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +/* + * Header for dynamic hash table routines Author - Eric Young + */ + +#ifndef HEADER_LHASH_H +# define HEADER_LHASH_H + +# include +# ifndef OPENSSL_NO_FP_API +# include +# endif + +# ifndef OPENSSL_NO_BIO +# include +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct lhash_node_st { + void *data; + struct lhash_node_st *next; +# ifndef OPENSSL_NO_HASH_COMP + unsigned long hash; +# endif +} LHASH_NODE; + +typedef int (*LHASH_COMP_FN_TYPE) (const void *, const void *); +typedef unsigned long (*LHASH_HASH_FN_TYPE) (const void *); +typedef void (*LHASH_DOALL_FN_TYPE) (void *); +typedef void (*LHASH_DOALL_ARG_FN_TYPE) (void *, void *); + +/* + * Macros for declaring and implementing type-safe wrappers for LHASH + * callbacks. This way, callbacks can be provided to LHASH structures without + * function pointer casting and the macro-defined callbacks provide + * per-variable casting before deferring to the underlying type-specific + * callbacks. NB: It is possible to place a "static" in front of both the + * DECLARE and IMPLEMENT macros if the functions are strictly internal. + */ + +/* First: "hash" functions */ +# define DECLARE_LHASH_HASH_FN(name, o_type) \ + unsigned long name##_LHASH_HASH(const void *); +# define IMPLEMENT_LHASH_HASH_FN(name, o_type) \ + unsigned long name##_LHASH_HASH(const void *arg) { \ + const o_type *a = arg; \ + return name##_hash(a); } +# define LHASH_HASH_FN(name) name##_LHASH_HASH + +/* Second: "compare" functions */ +# define DECLARE_LHASH_COMP_FN(name, o_type) \ + int name##_LHASH_COMP(const void *, const void *); +# define IMPLEMENT_LHASH_COMP_FN(name, o_type) \ + int name##_LHASH_COMP(const void *arg1, const void *arg2) { \ + const o_type *a = arg1; \ + const o_type *b = arg2; \ + return name##_cmp(a,b); } +# define LHASH_COMP_FN(name) name##_LHASH_COMP + +/* Third: "doall" functions */ +# define DECLARE_LHASH_DOALL_FN(name, o_type) \ + void name##_LHASH_DOALL(void *); +# define IMPLEMENT_LHASH_DOALL_FN(name, o_type) \ + void name##_LHASH_DOALL(void *arg) { \ + o_type *a = arg; \ + name##_doall(a); } +# define LHASH_DOALL_FN(name) name##_LHASH_DOALL + +/* Fourth: "doall_arg" functions */ +# define DECLARE_LHASH_DOALL_ARG_FN(name, o_type, a_type) \ + void name##_LHASH_DOALL_ARG(void *, void *); +# define IMPLEMENT_LHASH_DOALL_ARG_FN(name, o_type, a_type) \ + void name##_LHASH_DOALL_ARG(void *arg1, void *arg2) { \ + o_type *a = arg1; \ + a_type *b = arg2; \ + name##_doall_arg(a, b); } +# define LHASH_DOALL_ARG_FN(name) name##_LHASH_DOALL_ARG + +typedef struct lhash_st { + LHASH_NODE **b; + LHASH_COMP_FN_TYPE comp; + LHASH_HASH_FN_TYPE hash; + unsigned int num_nodes; + unsigned int num_alloc_nodes; + unsigned int p; + unsigned int pmax; + unsigned long up_load; /* load times 256 */ + unsigned long down_load; /* load times 256 */ + unsigned long num_items; + unsigned long num_expands; + unsigned long num_expand_reallocs; + unsigned long num_contracts; + unsigned long num_contract_reallocs; + unsigned long num_hash_calls; + unsigned long num_comp_calls; + unsigned long num_insert; + unsigned long num_replace; + unsigned long num_delete; + unsigned long num_no_delete; + unsigned long num_retrieve; + unsigned long num_retrieve_miss; + unsigned long num_hash_comps; + int error; +} _LHASH; /* Do not use _LHASH directly, use LHASH_OF + * and friends */ + +# define LH_LOAD_MULT 256 + +/* + * Indicates a malloc() error in the last call, this is only bad in + * lh_insert(). + */ +# define lh_error(lh) ((lh)->error) + +_LHASH *lh_new(LHASH_HASH_FN_TYPE h, LHASH_COMP_FN_TYPE c); +void lh_free(_LHASH *lh); +void *lh_insert(_LHASH *lh, void *data); +void *lh_delete(_LHASH *lh, const void *data); +void *lh_retrieve(_LHASH *lh, const void *data); +void lh_doall(_LHASH *lh, LHASH_DOALL_FN_TYPE func); +void lh_doall_arg(_LHASH *lh, LHASH_DOALL_ARG_FN_TYPE func, void *arg); +unsigned long lh_strhash(const char *c); +unsigned long lh_num_items(const _LHASH *lh); + +# ifndef OPENSSL_NO_FP_API +void lh_stats(const _LHASH *lh, FILE *out); +void lh_node_stats(const _LHASH *lh, FILE *out); +void lh_node_usage_stats(const _LHASH *lh, FILE *out); +# endif + +# ifndef OPENSSL_NO_BIO +void lh_stats_bio(const _LHASH *lh, BIO *out); +void lh_node_stats_bio(const _LHASH *lh, BIO *out); +void lh_node_usage_stats_bio(const _LHASH *lh, BIO *out); +# endif + +/* Type checking... */ + +# define LHASH_OF(type) struct lhash_st_##type + +# define DECLARE_LHASH_OF(type) LHASH_OF(type) { int dummy; } + +# define CHECKED_LHASH_OF(type,lh) \ + ((_LHASH *)CHECKED_PTR_OF(LHASH_OF(type),lh)) + +/* Define wrapper functions. */ +# define LHM_lh_new(type, name) \ + ((LHASH_OF(type) *)lh_new(LHASH_HASH_FN(name), LHASH_COMP_FN(name))) +# define LHM_lh_error(type, lh) \ + lh_error(CHECKED_LHASH_OF(type,lh)) +# define LHM_lh_insert(type, lh, inst) \ + ((type *)lh_insert(CHECKED_LHASH_OF(type, lh), \ + CHECKED_PTR_OF(type, inst))) +# define LHM_lh_retrieve(type, lh, inst) \ + ((type *)lh_retrieve(CHECKED_LHASH_OF(type, lh), \ + CHECKED_PTR_OF(type, inst))) +# define LHM_lh_delete(type, lh, inst) \ + ((type *)lh_delete(CHECKED_LHASH_OF(type, lh), \ + CHECKED_PTR_OF(type, inst))) +# define LHM_lh_doall(type, lh,fn) lh_doall(CHECKED_LHASH_OF(type, lh), fn) +# define LHM_lh_doall_arg(type, lh, fn, arg_type, arg) \ + lh_doall_arg(CHECKED_LHASH_OF(type, lh), fn, CHECKED_PTR_OF(arg_type, arg)) +# define LHM_lh_num_items(type, lh) lh_num_items(CHECKED_LHASH_OF(type, lh)) +# define LHM_lh_down_load(type, lh) (CHECKED_LHASH_OF(type, lh)->down_load) +# define LHM_lh_node_stats_bio(type, lh, out) \ + lh_node_stats_bio(CHECKED_LHASH_OF(type, lh), out) +# define LHM_lh_node_usage_stats_bio(type, lh, out) \ + lh_node_usage_stats_bio(CHECKED_LHASH_OF(type, lh), out) +# define LHM_lh_stats_bio(type, lh, out) \ + lh_stats_bio(CHECKED_LHASH_OF(type, lh), out) +# define LHM_lh_free(type, lh) lh_free(CHECKED_LHASH_OF(type, lh)) + +DECLARE_LHASH_OF(OPENSSL_STRING); +DECLARE_LHASH_OF(OPENSSL_CSTRING); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/md4.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/md4.h new file mode 100644 index 0000000..11fd712 --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/md4.h @@ -0,0 +1,119 @@ +/* crypto/md4/md4.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_MD4_H +# define HEADER_MD4_H + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# ifdef OPENSSL_NO_MD4 +# error MD4 is disabled. +# endif + +/*- + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + * ! MD4_LONG has to be at least 32 bits wide. If it's wider, then ! + * ! MD4_LONG_LOG2 has to be defined along. ! + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + */ + +# if defined(__LP32__) +# define MD4_LONG unsigned long +# elif defined(OPENSSL_SYS_CRAY) || defined(__ILP64__) +# define MD4_LONG unsigned long +# define MD4_LONG_LOG2 3 +/* + * _CRAY note. I could declare short, but I have no idea what impact + * does it have on performance on none-T3E machines. I could declare + * int, but at least on C90 sizeof(int) can be chosen at compile time. + * So I've chosen long... + * + */ +# else +# define MD4_LONG unsigned int +# endif + +# define MD4_CBLOCK 64 +# define MD4_LBLOCK (MD4_CBLOCK/4) +# define MD4_DIGEST_LENGTH 16 + +typedef struct MD4state_st { + MD4_LONG A, B, C, D; + MD4_LONG Nl, Nh; + MD4_LONG data[MD4_LBLOCK]; + unsigned int num; +} MD4_CTX; + +# ifdef OPENSSL_FIPS +int private_MD4_Init(MD4_CTX *c); +# endif +int MD4_Init(MD4_CTX *c); +int MD4_Update(MD4_CTX *c, const void *data, size_t len); +int MD4_Final(unsigned char *md, MD4_CTX *c); +unsigned char *MD4(const unsigned char *d, size_t n, unsigned char *md); +void MD4_Transform(MD4_CTX *c, const unsigned char *b); +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/md5.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/md5.h new file mode 100644 index 0000000..2659038 --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/md5.h @@ -0,0 +1,119 @@ +/* crypto/md5/md5.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_MD5_H +# define HEADER_MD5_H + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# ifdef OPENSSL_NO_MD5 +# error MD5 is disabled. +# endif + +/* + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + * ! MD5_LONG has to be at least 32 bits wide. If it's wider, then ! + * ! MD5_LONG_LOG2 has to be defined along. ! + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + */ + +# if defined(__LP32__) +# define MD5_LONG unsigned long +# elif defined(OPENSSL_SYS_CRAY) || defined(__ILP64__) +# define MD5_LONG unsigned long +# define MD5_LONG_LOG2 3 +/* + * _CRAY note. I could declare short, but I have no idea what impact + * does it have on performance on none-T3E machines. I could declare + * int, but at least on C90 sizeof(int) can be chosen at compile time. + * So I've chosen long... + * + */ +# else +# define MD5_LONG unsigned int +# endif + +# define MD5_CBLOCK 64 +# define MD5_LBLOCK (MD5_CBLOCK/4) +# define MD5_DIGEST_LENGTH 16 + +typedef struct MD5state_st { + MD5_LONG A, B, C, D; + MD5_LONG Nl, Nh; + MD5_LONG data[MD5_LBLOCK]; + unsigned int num; +} MD5_CTX; + +# ifdef OPENSSL_FIPS +int private_MD5_Init(MD5_CTX *c); +# endif +int MD5_Init(MD5_CTX *c); +int MD5_Update(MD5_CTX *c, const void *data, size_t len); +int MD5_Final(unsigned char *md, MD5_CTX *c); +unsigned char *MD5(const unsigned char *d, size_t n, unsigned char *md); +void MD5_Transform(MD5_CTX *c, const unsigned char *b); +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/mdc2.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/mdc2.h new file mode 100644 index 0000000..7efe53b --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/mdc2.h @@ -0,0 +1,94 @@ +/* crypto/mdc2/mdc2.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_MDC2_H +# define HEADER_MDC2_H + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# ifdef OPENSSL_NO_MDC2 +# error MDC2 is disabled. +# endif + +# define MDC2_BLOCK 8 +# define MDC2_DIGEST_LENGTH 16 + +typedef struct mdc2_ctx_st { + unsigned int num; + unsigned char data[MDC2_BLOCK]; + DES_cblock h, hh; + int pad_type; /* either 1 or 2, default 1 */ +} MDC2_CTX; + +# ifdef OPENSSL_FIPS +int private_MDC2_Init(MDC2_CTX *c); +# endif +int MDC2_Init(MDC2_CTX *c); +int MDC2_Update(MDC2_CTX *c, const unsigned char *data, size_t len); +int MDC2_Final(unsigned char *md, MDC2_CTX *c); +unsigned char *MDC2(const unsigned char *d, size_t n, unsigned char *md); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/modes.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/modes.h new file mode 100644 index 0000000..fd48849 --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/modes.h @@ -0,0 +1,163 @@ +/* ==================================================================== + * Copyright (c) 2008 The OpenSSL Project. All rights reserved. + * + * Rights for redistribution and usage in source and binary + * forms are granted according to the OpenSSL license. + */ + +#include + +#ifdef __cplusplus +extern "C" { +#endif +typedef void (*block128_f) (const unsigned char in[16], + unsigned char out[16], const void *key); + +typedef void (*cbc128_f) (const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], int enc); + +typedef void (*ctr128_f) (const unsigned char *in, unsigned char *out, + size_t blocks, const void *key, + const unsigned char ivec[16]); + +typedef void (*ccm128_f) (const unsigned char *in, unsigned char *out, + size_t blocks, const void *key, + const unsigned char ivec[16], + unsigned char cmac[16]); + +void CRYPTO_cbc128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], block128_f block); +void CRYPTO_cbc128_decrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], block128_f block); + +void CRYPTO_ctr128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], + unsigned char ecount_buf[16], unsigned int *num, + block128_f block); + +void CRYPTO_ctr128_encrypt_ctr32(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], + unsigned char ecount_buf[16], + unsigned int *num, ctr128_f ctr); + +void CRYPTO_ofb128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], int *num, + block128_f block); + +void CRYPTO_cfb128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], int *num, + int enc, block128_f block); +void CRYPTO_cfb128_8_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const void *key, + unsigned char ivec[16], int *num, + int enc, block128_f block); +void CRYPTO_cfb128_1_encrypt(const unsigned char *in, unsigned char *out, + size_t bits, const void *key, + unsigned char ivec[16], int *num, + int enc, block128_f block); + +size_t CRYPTO_cts128_encrypt_block(const unsigned char *in, + unsigned char *out, size_t len, + const void *key, unsigned char ivec[16], + block128_f block); +size_t CRYPTO_cts128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], cbc128_f cbc); +size_t CRYPTO_cts128_decrypt_block(const unsigned char *in, + unsigned char *out, size_t len, + const void *key, unsigned char ivec[16], + block128_f block); +size_t CRYPTO_cts128_decrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], cbc128_f cbc); + +size_t CRYPTO_nistcts128_encrypt_block(const unsigned char *in, + unsigned char *out, size_t len, + const void *key, + unsigned char ivec[16], + block128_f block); +size_t CRYPTO_nistcts128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], cbc128_f cbc); +size_t CRYPTO_nistcts128_decrypt_block(const unsigned char *in, + unsigned char *out, size_t len, + const void *key, + unsigned char ivec[16], + block128_f block); +size_t CRYPTO_nistcts128_decrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], cbc128_f cbc); + +typedef struct gcm128_context GCM128_CONTEXT; + +GCM128_CONTEXT *CRYPTO_gcm128_new(void *key, block128_f block); +void CRYPTO_gcm128_init(GCM128_CONTEXT *ctx, void *key, block128_f block); +void CRYPTO_gcm128_setiv(GCM128_CONTEXT *ctx, const unsigned char *iv, + size_t len); +int CRYPTO_gcm128_aad(GCM128_CONTEXT *ctx, const unsigned char *aad, + size_t len); +int CRYPTO_gcm128_encrypt(GCM128_CONTEXT *ctx, + const unsigned char *in, unsigned char *out, + size_t len); +int CRYPTO_gcm128_decrypt(GCM128_CONTEXT *ctx, + const unsigned char *in, unsigned char *out, + size_t len); +int CRYPTO_gcm128_encrypt_ctr32(GCM128_CONTEXT *ctx, + const unsigned char *in, unsigned char *out, + size_t len, ctr128_f stream); +int CRYPTO_gcm128_decrypt_ctr32(GCM128_CONTEXT *ctx, + const unsigned char *in, unsigned char *out, + size_t len, ctr128_f stream); +int CRYPTO_gcm128_finish(GCM128_CONTEXT *ctx, const unsigned char *tag, + size_t len); +void CRYPTO_gcm128_tag(GCM128_CONTEXT *ctx, unsigned char *tag, size_t len); +void CRYPTO_gcm128_release(GCM128_CONTEXT *ctx); + +typedef struct ccm128_context CCM128_CONTEXT; + +void CRYPTO_ccm128_init(CCM128_CONTEXT *ctx, + unsigned int M, unsigned int L, void *key, + block128_f block); +int CRYPTO_ccm128_setiv(CCM128_CONTEXT *ctx, const unsigned char *nonce, + size_t nlen, size_t mlen); +void CRYPTO_ccm128_aad(CCM128_CONTEXT *ctx, const unsigned char *aad, + size_t alen); +int CRYPTO_ccm128_encrypt(CCM128_CONTEXT *ctx, const unsigned char *inp, + unsigned char *out, size_t len); +int CRYPTO_ccm128_decrypt(CCM128_CONTEXT *ctx, const unsigned char *inp, + unsigned char *out, size_t len); +int CRYPTO_ccm128_encrypt_ccm64(CCM128_CONTEXT *ctx, const unsigned char *inp, + unsigned char *out, size_t len, + ccm128_f stream); +int CRYPTO_ccm128_decrypt_ccm64(CCM128_CONTEXT *ctx, const unsigned char *inp, + unsigned char *out, size_t len, + ccm128_f stream); +size_t CRYPTO_ccm128_tag(CCM128_CONTEXT *ctx, unsigned char *tag, size_t len); + +typedef struct xts128_context XTS128_CONTEXT; + +int CRYPTO_xts128_encrypt(const XTS128_CONTEXT *ctx, + const unsigned char iv[16], + const unsigned char *inp, unsigned char *out, + size_t len, int enc); + +size_t CRYPTO_128_wrap(void *key, const unsigned char *iv, + unsigned char *out, + const unsigned char *in, size_t inlen, + block128_f block); + +size_t CRYPTO_128_unwrap(void *key, const unsigned char *iv, + unsigned char *out, + const unsigned char *in, size_t inlen, + block128_f block); + +#ifdef __cplusplus +} +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/obj_mac.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/obj_mac.h new file mode 100644 index 0000000..779c309 --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/obj_mac.h @@ -0,0 +1,4194 @@ +/* crypto/objects/obj_mac.h */ + +/* + * THIS FILE IS GENERATED FROM objects.txt by objects.pl via the following + * command: perl objects.pl objects.txt obj_mac.num obj_mac.h + */ + +/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#define SN_undef "UNDEF" +#define LN_undef "undefined" +#define NID_undef 0 +#define OBJ_undef 0L + +#define SN_itu_t "ITU-T" +#define LN_itu_t "itu-t" +#define NID_itu_t 645 +#define OBJ_itu_t 0L + +#define NID_ccitt 404 +#define OBJ_ccitt OBJ_itu_t + +#define SN_iso "ISO" +#define LN_iso "iso" +#define NID_iso 181 +#define OBJ_iso 1L + +#define SN_joint_iso_itu_t "JOINT-ISO-ITU-T" +#define LN_joint_iso_itu_t "joint-iso-itu-t" +#define NID_joint_iso_itu_t 646 +#define OBJ_joint_iso_itu_t 2L + +#define NID_joint_iso_ccitt 393 +#define OBJ_joint_iso_ccitt OBJ_joint_iso_itu_t + +#define SN_member_body "member-body" +#define LN_member_body "ISO Member Body" +#define NID_member_body 182 +#define OBJ_member_body OBJ_iso,2L + +#define SN_identified_organization "identified-organization" +#define NID_identified_organization 676 +#define OBJ_identified_organization OBJ_iso,3L + +#define SN_hmac_md5 "HMAC-MD5" +#define LN_hmac_md5 "hmac-md5" +#define NID_hmac_md5 780 +#define OBJ_hmac_md5 OBJ_identified_organization,6L,1L,5L,5L,8L,1L,1L + +#define SN_hmac_sha1 "HMAC-SHA1" +#define LN_hmac_sha1 "hmac-sha1" +#define NID_hmac_sha1 781 +#define OBJ_hmac_sha1 OBJ_identified_organization,6L,1L,5L,5L,8L,1L,2L + +#define SN_certicom_arc "certicom-arc" +#define NID_certicom_arc 677 +#define OBJ_certicom_arc OBJ_identified_organization,132L + +#define SN_international_organizations "international-organizations" +#define LN_international_organizations "International Organizations" +#define NID_international_organizations 647 +#define OBJ_international_organizations OBJ_joint_iso_itu_t,23L + +#define SN_wap "wap" +#define NID_wap 678 +#define OBJ_wap OBJ_international_organizations,43L + +#define SN_wap_wsg "wap-wsg" +#define NID_wap_wsg 679 +#define OBJ_wap_wsg OBJ_wap,1L + +#define SN_selected_attribute_types "selected-attribute-types" +#define LN_selected_attribute_types "Selected Attribute Types" +#define NID_selected_attribute_types 394 +#define OBJ_selected_attribute_types OBJ_joint_iso_itu_t,5L,1L,5L + +#define SN_clearance "clearance" +#define NID_clearance 395 +#define OBJ_clearance OBJ_selected_attribute_types,55L + +#define SN_ISO_US "ISO-US" +#define LN_ISO_US "ISO US Member Body" +#define NID_ISO_US 183 +#define OBJ_ISO_US OBJ_member_body,840L + +#define SN_X9_57 "X9-57" +#define LN_X9_57 "X9.57" +#define NID_X9_57 184 +#define OBJ_X9_57 OBJ_ISO_US,10040L + +#define SN_X9cm "X9cm" +#define LN_X9cm "X9.57 CM ?" +#define NID_X9cm 185 +#define OBJ_X9cm OBJ_X9_57,4L + +#define SN_dsa "DSA" +#define LN_dsa "dsaEncryption" +#define NID_dsa 116 +#define OBJ_dsa OBJ_X9cm,1L + +#define SN_dsaWithSHA1 "DSA-SHA1" +#define LN_dsaWithSHA1 "dsaWithSHA1" +#define NID_dsaWithSHA1 113 +#define OBJ_dsaWithSHA1 OBJ_X9cm,3L + +#define SN_ansi_X9_62 "ansi-X9-62" +#define LN_ansi_X9_62 "ANSI X9.62" +#define NID_ansi_X9_62 405 +#define OBJ_ansi_X9_62 OBJ_ISO_US,10045L + +#define OBJ_X9_62_id_fieldType OBJ_ansi_X9_62,1L + +#define SN_X9_62_prime_field "prime-field" +#define NID_X9_62_prime_field 406 +#define OBJ_X9_62_prime_field OBJ_X9_62_id_fieldType,1L + +#define SN_X9_62_characteristic_two_field "characteristic-two-field" +#define NID_X9_62_characteristic_two_field 407 +#define OBJ_X9_62_characteristic_two_field OBJ_X9_62_id_fieldType,2L + +#define SN_X9_62_id_characteristic_two_basis "id-characteristic-two-basis" +#define NID_X9_62_id_characteristic_two_basis 680 +#define OBJ_X9_62_id_characteristic_two_basis OBJ_X9_62_characteristic_two_field,3L + +#define SN_X9_62_onBasis "onBasis" +#define NID_X9_62_onBasis 681 +#define OBJ_X9_62_onBasis OBJ_X9_62_id_characteristic_two_basis,1L + +#define SN_X9_62_tpBasis "tpBasis" +#define NID_X9_62_tpBasis 682 +#define OBJ_X9_62_tpBasis OBJ_X9_62_id_characteristic_two_basis,2L + +#define SN_X9_62_ppBasis "ppBasis" +#define NID_X9_62_ppBasis 683 +#define OBJ_X9_62_ppBasis OBJ_X9_62_id_characteristic_two_basis,3L + +#define OBJ_X9_62_id_publicKeyType OBJ_ansi_X9_62,2L + +#define SN_X9_62_id_ecPublicKey "id-ecPublicKey" +#define NID_X9_62_id_ecPublicKey 408 +#define OBJ_X9_62_id_ecPublicKey OBJ_X9_62_id_publicKeyType,1L + +#define OBJ_X9_62_ellipticCurve OBJ_ansi_X9_62,3L + +#define OBJ_X9_62_c_TwoCurve OBJ_X9_62_ellipticCurve,0L + +#define SN_X9_62_c2pnb163v1 "c2pnb163v1" +#define NID_X9_62_c2pnb163v1 684 +#define OBJ_X9_62_c2pnb163v1 OBJ_X9_62_c_TwoCurve,1L + +#define SN_X9_62_c2pnb163v2 "c2pnb163v2" +#define NID_X9_62_c2pnb163v2 685 +#define OBJ_X9_62_c2pnb163v2 OBJ_X9_62_c_TwoCurve,2L + +#define SN_X9_62_c2pnb163v3 "c2pnb163v3" +#define NID_X9_62_c2pnb163v3 686 +#define OBJ_X9_62_c2pnb163v3 OBJ_X9_62_c_TwoCurve,3L + +#define SN_X9_62_c2pnb176v1 "c2pnb176v1" +#define NID_X9_62_c2pnb176v1 687 +#define OBJ_X9_62_c2pnb176v1 OBJ_X9_62_c_TwoCurve,4L + +#define SN_X9_62_c2tnb191v1 "c2tnb191v1" +#define NID_X9_62_c2tnb191v1 688 +#define OBJ_X9_62_c2tnb191v1 OBJ_X9_62_c_TwoCurve,5L + +#define SN_X9_62_c2tnb191v2 "c2tnb191v2" +#define NID_X9_62_c2tnb191v2 689 +#define OBJ_X9_62_c2tnb191v2 OBJ_X9_62_c_TwoCurve,6L + +#define SN_X9_62_c2tnb191v3 "c2tnb191v3" +#define NID_X9_62_c2tnb191v3 690 +#define OBJ_X9_62_c2tnb191v3 OBJ_X9_62_c_TwoCurve,7L + +#define SN_X9_62_c2onb191v4 "c2onb191v4" +#define NID_X9_62_c2onb191v4 691 +#define OBJ_X9_62_c2onb191v4 OBJ_X9_62_c_TwoCurve,8L + +#define SN_X9_62_c2onb191v5 "c2onb191v5" +#define NID_X9_62_c2onb191v5 692 +#define OBJ_X9_62_c2onb191v5 OBJ_X9_62_c_TwoCurve,9L + +#define SN_X9_62_c2pnb208w1 "c2pnb208w1" +#define NID_X9_62_c2pnb208w1 693 +#define OBJ_X9_62_c2pnb208w1 OBJ_X9_62_c_TwoCurve,10L + +#define SN_X9_62_c2tnb239v1 "c2tnb239v1" +#define NID_X9_62_c2tnb239v1 694 +#define OBJ_X9_62_c2tnb239v1 OBJ_X9_62_c_TwoCurve,11L + +#define SN_X9_62_c2tnb239v2 "c2tnb239v2" +#define NID_X9_62_c2tnb239v2 695 +#define OBJ_X9_62_c2tnb239v2 OBJ_X9_62_c_TwoCurve,12L + +#define SN_X9_62_c2tnb239v3 "c2tnb239v3" +#define NID_X9_62_c2tnb239v3 696 +#define OBJ_X9_62_c2tnb239v3 OBJ_X9_62_c_TwoCurve,13L + +#define SN_X9_62_c2onb239v4 "c2onb239v4" +#define NID_X9_62_c2onb239v4 697 +#define OBJ_X9_62_c2onb239v4 OBJ_X9_62_c_TwoCurve,14L + +#define SN_X9_62_c2onb239v5 "c2onb239v5" +#define NID_X9_62_c2onb239v5 698 +#define OBJ_X9_62_c2onb239v5 OBJ_X9_62_c_TwoCurve,15L + +#define SN_X9_62_c2pnb272w1 "c2pnb272w1" +#define NID_X9_62_c2pnb272w1 699 +#define OBJ_X9_62_c2pnb272w1 OBJ_X9_62_c_TwoCurve,16L + +#define SN_X9_62_c2pnb304w1 "c2pnb304w1" +#define NID_X9_62_c2pnb304w1 700 +#define OBJ_X9_62_c2pnb304w1 OBJ_X9_62_c_TwoCurve,17L + +#define SN_X9_62_c2tnb359v1 "c2tnb359v1" +#define NID_X9_62_c2tnb359v1 701 +#define OBJ_X9_62_c2tnb359v1 OBJ_X9_62_c_TwoCurve,18L + +#define SN_X9_62_c2pnb368w1 "c2pnb368w1" +#define NID_X9_62_c2pnb368w1 702 +#define OBJ_X9_62_c2pnb368w1 OBJ_X9_62_c_TwoCurve,19L + +#define SN_X9_62_c2tnb431r1 "c2tnb431r1" +#define NID_X9_62_c2tnb431r1 703 +#define OBJ_X9_62_c2tnb431r1 OBJ_X9_62_c_TwoCurve,20L + +#define OBJ_X9_62_primeCurve OBJ_X9_62_ellipticCurve,1L + +#define SN_X9_62_prime192v1 "prime192v1" +#define NID_X9_62_prime192v1 409 +#define OBJ_X9_62_prime192v1 OBJ_X9_62_primeCurve,1L + +#define SN_X9_62_prime192v2 "prime192v2" +#define NID_X9_62_prime192v2 410 +#define OBJ_X9_62_prime192v2 OBJ_X9_62_primeCurve,2L + +#define SN_X9_62_prime192v3 "prime192v3" +#define NID_X9_62_prime192v3 411 +#define OBJ_X9_62_prime192v3 OBJ_X9_62_primeCurve,3L + +#define SN_X9_62_prime239v1 "prime239v1" +#define NID_X9_62_prime239v1 412 +#define OBJ_X9_62_prime239v1 OBJ_X9_62_primeCurve,4L + +#define SN_X9_62_prime239v2 "prime239v2" +#define NID_X9_62_prime239v2 413 +#define OBJ_X9_62_prime239v2 OBJ_X9_62_primeCurve,5L + +#define SN_X9_62_prime239v3 "prime239v3" +#define NID_X9_62_prime239v3 414 +#define OBJ_X9_62_prime239v3 OBJ_X9_62_primeCurve,6L + +#define SN_X9_62_prime256v1 "prime256v1" +#define NID_X9_62_prime256v1 415 +#define OBJ_X9_62_prime256v1 OBJ_X9_62_primeCurve,7L + +#define OBJ_X9_62_id_ecSigType OBJ_ansi_X9_62,4L + +#define SN_ecdsa_with_SHA1 "ecdsa-with-SHA1" +#define NID_ecdsa_with_SHA1 416 +#define OBJ_ecdsa_with_SHA1 OBJ_X9_62_id_ecSigType,1L + +#define SN_ecdsa_with_Recommended "ecdsa-with-Recommended" +#define NID_ecdsa_with_Recommended 791 +#define OBJ_ecdsa_with_Recommended OBJ_X9_62_id_ecSigType,2L + +#define SN_ecdsa_with_Specified "ecdsa-with-Specified" +#define NID_ecdsa_with_Specified 792 +#define OBJ_ecdsa_with_Specified OBJ_X9_62_id_ecSigType,3L + +#define SN_ecdsa_with_SHA224 "ecdsa-with-SHA224" +#define NID_ecdsa_with_SHA224 793 +#define OBJ_ecdsa_with_SHA224 OBJ_ecdsa_with_Specified,1L + +#define SN_ecdsa_with_SHA256 "ecdsa-with-SHA256" +#define NID_ecdsa_with_SHA256 794 +#define OBJ_ecdsa_with_SHA256 OBJ_ecdsa_with_Specified,2L + +#define SN_ecdsa_with_SHA384 "ecdsa-with-SHA384" +#define NID_ecdsa_with_SHA384 795 +#define OBJ_ecdsa_with_SHA384 OBJ_ecdsa_with_Specified,3L + +#define SN_ecdsa_with_SHA512 "ecdsa-with-SHA512" +#define NID_ecdsa_with_SHA512 796 +#define OBJ_ecdsa_with_SHA512 OBJ_ecdsa_with_Specified,4L + +#define OBJ_secg_ellipticCurve OBJ_certicom_arc,0L + +#define SN_secp112r1 "secp112r1" +#define NID_secp112r1 704 +#define OBJ_secp112r1 OBJ_secg_ellipticCurve,6L + +#define SN_secp112r2 "secp112r2" +#define NID_secp112r2 705 +#define OBJ_secp112r2 OBJ_secg_ellipticCurve,7L + +#define SN_secp128r1 "secp128r1" +#define NID_secp128r1 706 +#define OBJ_secp128r1 OBJ_secg_ellipticCurve,28L + +#define SN_secp128r2 "secp128r2" +#define NID_secp128r2 707 +#define OBJ_secp128r2 OBJ_secg_ellipticCurve,29L + +#define SN_secp160k1 "secp160k1" +#define NID_secp160k1 708 +#define OBJ_secp160k1 OBJ_secg_ellipticCurve,9L + +#define SN_secp160r1 "secp160r1" +#define NID_secp160r1 709 +#define OBJ_secp160r1 OBJ_secg_ellipticCurve,8L + +#define SN_secp160r2 "secp160r2" +#define NID_secp160r2 710 +#define OBJ_secp160r2 OBJ_secg_ellipticCurve,30L + +#define SN_secp192k1 "secp192k1" +#define NID_secp192k1 711 +#define OBJ_secp192k1 OBJ_secg_ellipticCurve,31L + +#define SN_secp224k1 "secp224k1" +#define NID_secp224k1 712 +#define OBJ_secp224k1 OBJ_secg_ellipticCurve,32L + +#define SN_secp224r1 "secp224r1" +#define NID_secp224r1 713 +#define OBJ_secp224r1 OBJ_secg_ellipticCurve,33L + +#define SN_secp256k1 "secp256k1" +#define NID_secp256k1 714 +#define OBJ_secp256k1 OBJ_secg_ellipticCurve,10L + +#define SN_secp384r1 "secp384r1" +#define NID_secp384r1 715 +#define OBJ_secp384r1 OBJ_secg_ellipticCurve,34L + +#define SN_secp521r1 "secp521r1" +#define NID_secp521r1 716 +#define OBJ_secp521r1 OBJ_secg_ellipticCurve,35L + +#define SN_sect113r1 "sect113r1" +#define NID_sect113r1 717 +#define OBJ_sect113r1 OBJ_secg_ellipticCurve,4L + +#define SN_sect113r2 "sect113r2" +#define NID_sect113r2 718 +#define OBJ_sect113r2 OBJ_secg_ellipticCurve,5L + +#define SN_sect131r1 "sect131r1" +#define NID_sect131r1 719 +#define OBJ_sect131r1 OBJ_secg_ellipticCurve,22L + +#define SN_sect131r2 "sect131r2" +#define NID_sect131r2 720 +#define OBJ_sect131r2 OBJ_secg_ellipticCurve,23L + +#define SN_sect163k1 "sect163k1" +#define NID_sect163k1 721 +#define OBJ_sect163k1 OBJ_secg_ellipticCurve,1L + +#define SN_sect163r1 "sect163r1" +#define NID_sect163r1 722 +#define OBJ_sect163r1 OBJ_secg_ellipticCurve,2L + +#define SN_sect163r2 "sect163r2" +#define NID_sect163r2 723 +#define OBJ_sect163r2 OBJ_secg_ellipticCurve,15L + +#define SN_sect193r1 "sect193r1" +#define NID_sect193r1 724 +#define OBJ_sect193r1 OBJ_secg_ellipticCurve,24L + +#define SN_sect193r2 "sect193r2" +#define NID_sect193r2 725 +#define OBJ_sect193r2 OBJ_secg_ellipticCurve,25L + +#define SN_sect233k1 "sect233k1" +#define NID_sect233k1 726 +#define OBJ_sect233k1 OBJ_secg_ellipticCurve,26L + +#define SN_sect233r1 "sect233r1" +#define NID_sect233r1 727 +#define OBJ_sect233r1 OBJ_secg_ellipticCurve,27L + +#define SN_sect239k1 "sect239k1" +#define NID_sect239k1 728 +#define OBJ_sect239k1 OBJ_secg_ellipticCurve,3L + +#define SN_sect283k1 "sect283k1" +#define NID_sect283k1 729 +#define OBJ_sect283k1 OBJ_secg_ellipticCurve,16L + +#define SN_sect283r1 "sect283r1" +#define NID_sect283r1 730 +#define OBJ_sect283r1 OBJ_secg_ellipticCurve,17L + +#define SN_sect409k1 "sect409k1" +#define NID_sect409k1 731 +#define OBJ_sect409k1 OBJ_secg_ellipticCurve,36L + +#define SN_sect409r1 "sect409r1" +#define NID_sect409r1 732 +#define OBJ_sect409r1 OBJ_secg_ellipticCurve,37L + +#define SN_sect571k1 "sect571k1" +#define NID_sect571k1 733 +#define OBJ_sect571k1 OBJ_secg_ellipticCurve,38L + +#define SN_sect571r1 "sect571r1" +#define NID_sect571r1 734 +#define OBJ_sect571r1 OBJ_secg_ellipticCurve,39L + +#define OBJ_wap_wsg_idm_ecid OBJ_wap_wsg,4L + +#define SN_wap_wsg_idm_ecid_wtls1 "wap-wsg-idm-ecid-wtls1" +#define NID_wap_wsg_idm_ecid_wtls1 735 +#define OBJ_wap_wsg_idm_ecid_wtls1 OBJ_wap_wsg_idm_ecid,1L + +#define SN_wap_wsg_idm_ecid_wtls3 "wap-wsg-idm-ecid-wtls3" +#define NID_wap_wsg_idm_ecid_wtls3 736 +#define OBJ_wap_wsg_idm_ecid_wtls3 OBJ_wap_wsg_idm_ecid,3L + +#define SN_wap_wsg_idm_ecid_wtls4 "wap-wsg-idm-ecid-wtls4" +#define NID_wap_wsg_idm_ecid_wtls4 737 +#define OBJ_wap_wsg_idm_ecid_wtls4 OBJ_wap_wsg_idm_ecid,4L + +#define SN_wap_wsg_idm_ecid_wtls5 "wap-wsg-idm-ecid-wtls5" +#define NID_wap_wsg_idm_ecid_wtls5 738 +#define OBJ_wap_wsg_idm_ecid_wtls5 OBJ_wap_wsg_idm_ecid,5L + +#define SN_wap_wsg_idm_ecid_wtls6 "wap-wsg-idm-ecid-wtls6" +#define NID_wap_wsg_idm_ecid_wtls6 739 +#define OBJ_wap_wsg_idm_ecid_wtls6 OBJ_wap_wsg_idm_ecid,6L + +#define SN_wap_wsg_idm_ecid_wtls7 "wap-wsg-idm-ecid-wtls7" +#define NID_wap_wsg_idm_ecid_wtls7 740 +#define OBJ_wap_wsg_idm_ecid_wtls7 OBJ_wap_wsg_idm_ecid,7L + +#define SN_wap_wsg_idm_ecid_wtls8 "wap-wsg-idm-ecid-wtls8" +#define NID_wap_wsg_idm_ecid_wtls8 741 +#define OBJ_wap_wsg_idm_ecid_wtls8 OBJ_wap_wsg_idm_ecid,8L + +#define SN_wap_wsg_idm_ecid_wtls9 "wap-wsg-idm-ecid-wtls9" +#define NID_wap_wsg_idm_ecid_wtls9 742 +#define OBJ_wap_wsg_idm_ecid_wtls9 OBJ_wap_wsg_idm_ecid,9L + +#define SN_wap_wsg_idm_ecid_wtls10 "wap-wsg-idm-ecid-wtls10" +#define NID_wap_wsg_idm_ecid_wtls10 743 +#define OBJ_wap_wsg_idm_ecid_wtls10 OBJ_wap_wsg_idm_ecid,10L + +#define SN_wap_wsg_idm_ecid_wtls11 "wap-wsg-idm-ecid-wtls11" +#define NID_wap_wsg_idm_ecid_wtls11 744 +#define OBJ_wap_wsg_idm_ecid_wtls11 OBJ_wap_wsg_idm_ecid,11L + +#define SN_wap_wsg_idm_ecid_wtls12 "wap-wsg-idm-ecid-wtls12" +#define NID_wap_wsg_idm_ecid_wtls12 745 +#define OBJ_wap_wsg_idm_ecid_wtls12 OBJ_wap_wsg_idm_ecid,12L + +#define SN_cast5_cbc "CAST5-CBC" +#define LN_cast5_cbc "cast5-cbc" +#define NID_cast5_cbc 108 +#define OBJ_cast5_cbc OBJ_ISO_US,113533L,7L,66L,10L + +#define SN_cast5_ecb "CAST5-ECB" +#define LN_cast5_ecb "cast5-ecb" +#define NID_cast5_ecb 109 + +#define SN_cast5_cfb64 "CAST5-CFB" +#define LN_cast5_cfb64 "cast5-cfb" +#define NID_cast5_cfb64 110 + +#define SN_cast5_ofb64 "CAST5-OFB" +#define LN_cast5_ofb64 "cast5-ofb" +#define NID_cast5_ofb64 111 + +#define LN_pbeWithMD5AndCast5_CBC "pbeWithMD5AndCast5CBC" +#define NID_pbeWithMD5AndCast5_CBC 112 +#define OBJ_pbeWithMD5AndCast5_CBC OBJ_ISO_US,113533L,7L,66L,12L + +#define SN_id_PasswordBasedMAC "id-PasswordBasedMAC" +#define LN_id_PasswordBasedMAC "password based MAC" +#define NID_id_PasswordBasedMAC 782 +#define OBJ_id_PasswordBasedMAC OBJ_ISO_US,113533L,7L,66L,13L + +#define SN_id_DHBasedMac "id-DHBasedMac" +#define LN_id_DHBasedMac "Diffie-Hellman based MAC" +#define NID_id_DHBasedMac 783 +#define OBJ_id_DHBasedMac OBJ_ISO_US,113533L,7L,66L,30L + +#define SN_rsadsi "rsadsi" +#define LN_rsadsi "RSA Data Security, Inc." +#define NID_rsadsi 1 +#define OBJ_rsadsi OBJ_ISO_US,113549L + +#define SN_pkcs "pkcs" +#define LN_pkcs "RSA Data Security, Inc. PKCS" +#define NID_pkcs 2 +#define OBJ_pkcs OBJ_rsadsi,1L + +#define SN_pkcs1 "pkcs1" +#define NID_pkcs1 186 +#define OBJ_pkcs1 OBJ_pkcs,1L + +#define LN_rsaEncryption "rsaEncryption" +#define NID_rsaEncryption 6 +#define OBJ_rsaEncryption OBJ_pkcs1,1L + +#define SN_md2WithRSAEncryption "RSA-MD2" +#define LN_md2WithRSAEncryption "md2WithRSAEncryption" +#define NID_md2WithRSAEncryption 7 +#define OBJ_md2WithRSAEncryption OBJ_pkcs1,2L + +#define SN_md4WithRSAEncryption "RSA-MD4" +#define LN_md4WithRSAEncryption "md4WithRSAEncryption" +#define NID_md4WithRSAEncryption 396 +#define OBJ_md4WithRSAEncryption OBJ_pkcs1,3L + +#define SN_md5WithRSAEncryption "RSA-MD5" +#define LN_md5WithRSAEncryption "md5WithRSAEncryption" +#define NID_md5WithRSAEncryption 8 +#define OBJ_md5WithRSAEncryption OBJ_pkcs1,4L + +#define SN_sha1WithRSAEncryption "RSA-SHA1" +#define LN_sha1WithRSAEncryption "sha1WithRSAEncryption" +#define NID_sha1WithRSAEncryption 65 +#define OBJ_sha1WithRSAEncryption OBJ_pkcs1,5L + +#define SN_rsaesOaep "RSAES-OAEP" +#define LN_rsaesOaep "rsaesOaep" +#define NID_rsaesOaep 919 +#define OBJ_rsaesOaep OBJ_pkcs1,7L + +#define SN_mgf1 "MGF1" +#define LN_mgf1 "mgf1" +#define NID_mgf1 911 +#define OBJ_mgf1 OBJ_pkcs1,8L + +#define SN_pSpecified "PSPECIFIED" +#define LN_pSpecified "pSpecified" +#define NID_pSpecified 935 +#define OBJ_pSpecified OBJ_pkcs1,9L + +#define SN_rsassaPss "RSASSA-PSS" +#define LN_rsassaPss "rsassaPss" +#define NID_rsassaPss 912 +#define OBJ_rsassaPss OBJ_pkcs1,10L + +#define SN_sha256WithRSAEncryption "RSA-SHA256" +#define LN_sha256WithRSAEncryption "sha256WithRSAEncryption" +#define NID_sha256WithRSAEncryption 668 +#define OBJ_sha256WithRSAEncryption OBJ_pkcs1,11L + +#define SN_sha384WithRSAEncryption "RSA-SHA384" +#define LN_sha384WithRSAEncryption "sha384WithRSAEncryption" +#define NID_sha384WithRSAEncryption 669 +#define OBJ_sha384WithRSAEncryption OBJ_pkcs1,12L + +#define SN_sha512WithRSAEncryption "RSA-SHA512" +#define LN_sha512WithRSAEncryption "sha512WithRSAEncryption" +#define NID_sha512WithRSAEncryption 670 +#define OBJ_sha512WithRSAEncryption OBJ_pkcs1,13L + +#define SN_sha224WithRSAEncryption "RSA-SHA224" +#define LN_sha224WithRSAEncryption "sha224WithRSAEncryption" +#define NID_sha224WithRSAEncryption 671 +#define OBJ_sha224WithRSAEncryption OBJ_pkcs1,14L + +#define SN_pkcs3 "pkcs3" +#define NID_pkcs3 27 +#define OBJ_pkcs3 OBJ_pkcs,3L + +#define LN_dhKeyAgreement "dhKeyAgreement" +#define NID_dhKeyAgreement 28 +#define OBJ_dhKeyAgreement OBJ_pkcs3,1L + +#define SN_pkcs5 "pkcs5" +#define NID_pkcs5 187 +#define OBJ_pkcs5 OBJ_pkcs,5L + +#define SN_pbeWithMD2AndDES_CBC "PBE-MD2-DES" +#define LN_pbeWithMD2AndDES_CBC "pbeWithMD2AndDES-CBC" +#define NID_pbeWithMD2AndDES_CBC 9 +#define OBJ_pbeWithMD2AndDES_CBC OBJ_pkcs5,1L + +#define SN_pbeWithMD5AndDES_CBC "PBE-MD5-DES" +#define LN_pbeWithMD5AndDES_CBC "pbeWithMD5AndDES-CBC" +#define NID_pbeWithMD5AndDES_CBC 10 +#define OBJ_pbeWithMD5AndDES_CBC OBJ_pkcs5,3L + +#define SN_pbeWithMD2AndRC2_CBC "PBE-MD2-RC2-64" +#define LN_pbeWithMD2AndRC2_CBC "pbeWithMD2AndRC2-CBC" +#define NID_pbeWithMD2AndRC2_CBC 168 +#define OBJ_pbeWithMD2AndRC2_CBC OBJ_pkcs5,4L + +#define SN_pbeWithMD5AndRC2_CBC "PBE-MD5-RC2-64" +#define LN_pbeWithMD5AndRC2_CBC "pbeWithMD5AndRC2-CBC" +#define NID_pbeWithMD5AndRC2_CBC 169 +#define OBJ_pbeWithMD5AndRC2_CBC OBJ_pkcs5,6L + +#define SN_pbeWithSHA1AndDES_CBC "PBE-SHA1-DES" +#define LN_pbeWithSHA1AndDES_CBC "pbeWithSHA1AndDES-CBC" +#define NID_pbeWithSHA1AndDES_CBC 170 +#define OBJ_pbeWithSHA1AndDES_CBC OBJ_pkcs5,10L + +#define SN_pbeWithSHA1AndRC2_CBC "PBE-SHA1-RC2-64" +#define LN_pbeWithSHA1AndRC2_CBC "pbeWithSHA1AndRC2-CBC" +#define NID_pbeWithSHA1AndRC2_CBC 68 +#define OBJ_pbeWithSHA1AndRC2_CBC OBJ_pkcs5,11L + +#define LN_id_pbkdf2 "PBKDF2" +#define NID_id_pbkdf2 69 +#define OBJ_id_pbkdf2 OBJ_pkcs5,12L + +#define LN_pbes2 "PBES2" +#define NID_pbes2 161 +#define OBJ_pbes2 OBJ_pkcs5,13L + +#define LN_pbmac1 "PBMAC1" +#define NID_pbmac1 162 +#define OBJ_pbmac1 OBJ_pkcs5,14L + +#define SN_pkcs7 "pkcs7" +#define NID_pkcs7 20 +#define OBJ_pkcs7 OBJ_pkcs,7L + +#define LN_pkcs7_data "pkcs7-data" +#define NID_pkcs7_data 21 +#define OBJ_pkcs7_data OBJ_pkcs7,1L + +#define LN_pkcs7_signed "pkcs7-signedData" +#define NID_pkcs7_signed 22 +#define OBJ_pkcs7_signed OBJ_pkcs7,2L + +#define LN_pkcs7_enveloped "pkcs7-envelopedData" +#define NID_pkcs7_enveloped 23 +#define OBJ_pkcs7_enveloped OBJ_pkcs7,3L + +#define LN_pkcs7_signedAndEnveloped "pkcs7-signedAndEnvelopedData" +#define NID_pkcs7_signedAndEnveloped 24 +#define OBJ_pkcs7_signedAndEnveloped OBJ_pkcs7,4L + +#define LN_pkcs7_digest "pkcs7-digestData" +#define NID_pkcs7_digest 25 +#define OBJ_pkcs7_digest OBJ_pkcs7,5L + +#define LN_pkcs7_encrypted "pkcs7-encryptedData" +#define NID_pkcs7_encrypted 26 +#define OBJ_pkcs7_encrypted OBJ_pkcs7,6L + +#define SN_pkcs9 "pkcs9" +#define NID_pkcs9 47 +#define OBJ_pkcs9 OBJ_pkcs,9L + +#define LN_pkcs9_emailAddress "emailAddress" +#define NID_pkcs9_emailAddress 48 +#define OBJ_pkcs9_emailAddress OBJ_pkcs9,1L + +#define LN_pkcs9_unstructuredName "unstructuredName" +#define NID_pkcs9_unstructuredName 49 +#define OBJ_pkcs9_unstructuredName OBJ_pkcs9,2L + +#define LN_pkcs9_contentType "contentType" +#define NID_pkcs9_contentType 50 +#define OBJ_pkcs9_contentType OBJ_pkcs9,3L + +#define LN_pkcs9_messageDigest "messageDigest" +#define NID_pkcs9_messageDigest 51 +#define OBJ_pkcs9_messageDigest OBJ_pkcs9,4L + +#define LN_pkcs9_signingTime "signingTime" +#define NID_pkcs9_signingTime 52 +#define OBJ_pkcs9_signingTime OBJ_pkcs9,5L + +#define LN_pkcs9_countersignature "countersignature" +#define NID_pkcs9_countersignature 53 +#define OBJ_pkcs9_countersignature OBJ_pkcs9,6L + +#define LN_pkcs9_challengePassword "challengePassword" +#define NID_pkcs9_challengePassword 54 +#define OBJ_pkcs9_challengePassword OBJ_pkcs9,7L + +#define LN_pkcs9_unstructuredAddress "unstructuredAddress" +#define NID_pkcs9_unstructuredAddress 55 +#define OBJ_pkcs9_unstructuredAddress OBJ_pkcs9,8L + +#define LN_pkcs9_extCertAttributes "extendedCertificateAttributes" +#define NID_pkcs9_extCertAttributes 56 +#define OBJ_pkcs9_extCertAttributes OBJ_pkcs9,9L + +#define SN_ext_req "extReq" +#define LN_ext_req "Extension Request" +#define NID_ext_req 172 +#define OBJ_ext_req OBJ_pkcs9,14L + +#define SN_SMIMECapabilities "SMIME-CAPS" +#define LN_SMIMECapabilities "S/MIME Capabilities" +#define NID_SMIMECapabilities 167 +#define OBJ_SMIMECapabilities OBJ_pkcs9,15L + +#define SN_SMIME "SMIME" +#define LN_SMIME "S/MIME" +#define NID_SMIME 188 +#define OBJ_SMIME OBJ_pkcs9,16L + +#define SN_id_smime_mod "id-smime-mod" +#define NID_id_smime_mod 189 +#define OBJ_id_smime_mod OBJ_SMIME,0L + +#define SN_id_smime_ct "id-smime-ct" +#define NID_id_smime_ct 190 +#define OBJ_id_smime_ct OBJ_SMIME,1L + +#define SN_id_smime_aa "id-smime-aa" +#define NID_id_smime_aa 191 +#define OBJ_id_smime_aa OBJ_SMIME,2L + +#define SN_id_smime_alg "id-smime-alg" +#define NID_id_smime_alg 192 +#define OBJ_id_smime_alg OBJ_SMIME,3L + +#define SN_id_smime_cd "id-smime-cd" +#define NID_id_smime_cd 193 +#define OBJ_id_smime_cd OBJ_SMIME,4L + +#define SN_id_smime_spq "id-smime-spq" +#define NID_id_smime_spq 194 +#define OBJ_id_smime_spq OBJ_SMIME,5L + +#define SN_id_smime_cti "id-smime-cti" +#define NID_id_smime_cti 195 +#define OBJ_id_smime_cti OBJ_SMIME,6L + +#define SN_id_smime_mod_cms "id-smime-mod-cms" +#define NID_id_smime_mod_cms 196 +#define OBJ_id_smime_mod_cms OBJ_id_smime_mod,1L + +#define SN_id_smime_mod_ess "id-smime-mod-ess" +#define NID_id_smime_mod_ess 197 +#define OBJ_id_smime_mod_ess OBJ_id_smime_mod,2L + +#define SN_id_smime_mod_oid "id-smime-mod-oid" +#define NID_id_smime_mod_oid 198 +#define OBJ_id_smime_mod_oid OBJ_id_smime_mod,3L + +#define SN_id_smime_mod_msg_v3 "id-smime-mod-msg-v3" +#define NID_id_smime_mod_msg_v3 199 +#define OBJ_id_smime_mod_msg_v3 OBJ_id_smime_mod,4L + +#define SN_id_smime_mod_ets_eSignature_88 "id-smime-mod-ets-eSignature-88" +#define NID_id_smime_mod_ets_eSignature_88 200 +#define OBJ_id_smime_mod_ets_eSignature_88 OBJ_id_smime_mod,5L + +#define SN_id_smime_mod_ets_eSignature_97 "id-smime-mod-ets-eSignature-97" +#define NID_id_smime_mod_ets_eSignature_97 201 +#define OBJ_id_smime_mod_ets_eSignature_97 OBJ_id_smime_mod,6L + +#define SN_id_smime_mod_ets_eSigPolicy_88 "id-smime-mod-ets-eSigPolicy-88" +#define NID_id_smime_mod_ets_eSigPolicy_88 202 +#define OBJ_id_smime_mod_ets_eSigPolicy_88 OBJ_id_smime_mod,7L + +#define SN_id_smime_mod_ets_eSigPolicy_97 "id-smime-mod-ets-eSigPolicy-97" +#define NID_id_smime_mod_ets_eSigPolicy_97 203 +#define OBJ_id_smime_mod_ets_eSigPolicy_97 OBJ_id_smime_mod,8L + +#define SN_id_smime_ct_receipt "id-smime-ct-receipt" +#define NID_id_smime_ct_receipt 204 +#define OBJ_id_smime_ct_receipt OBJ_id_smime_ct,1L + +#define SN_id_smime_ct_authData "id-smime-ct-authData" +#define NID_id_smime_ct_authData 205 +#define OBJ_id_smime_ct_authData OBJ_id_smime_ct,2L + +#define SN_id_smime_ct_publishCert "id-smime-ct-publishCert" +#define NID_id_smime_ct_publishCert 206 +#define OBJ_id_smime_ct_publishCert OBJ_id_smime_ct,3L + +#define SN_id_smime_ct_TSTInfo "id-smime-ct-TSTInfo" +#define NID_id_smime_ct_TSTInfo 207 +#define OBJ_id_smime_ct_TSTInfo OBJ_id_smime_ct,4L + +#define SN_id_smime_ct_TDTInfo "id-smime-ct-TDTInfo" +#define NID_id_smime_ct_TDTInfo 208 +#define OBJ_id_smime_ct_TDTInfo OBJ_id_smime_ct,5L + +#define SN_id_smime_ct_contentInfo "id-smime-ct-contentInfo" +#define NID_id_smime_ct_contentInfo 209 +#define OBJ_id_smime_ct_contentInfo OBJ_id_smime_ct,6L + +#define SN_id_smime_ct_DVCSRequestData "id-smime-ct-DVCSRequestData" +#define NID_id_smime_ct_DVCSRequestData 210 +#define OBJ_id_smime_ct_DVCSRequestData OBJ_id_smime_ct,7L + +#define SN_id_smime_ct_DVCSResponseData "id-smime-ct-DVCSResponseData" +#define NID_id_smime_ct_DVCSResponseData 211 +#define OBJ_id_smime_ct_DVCSResponseData OBJ_id_smime_ct,8L + +#define SN_id_smime_ct_compressedData "id-smime-ct-compressedData" +#define NID_id_smime_ct_compressedData 786 +#define OBJ_id_smime_ct_compressedData OBJ_id_smime_ct,9L + +#define SN_id_ct_asciiTextWithCRLF "id-ct-asciiTextWithCRLF" +#define NID_id_ct_asciiTextWithCRLF 787 +#define OBJ_id_ct_asciiTextWithCRLF OBJ_id_smime_ct,27L + +#define SN_id_smime_aa_receiptRequest "id-smime-aa-receiptRequest" +#define NID_id_smime_aa_receiptRequest 212 +#define OBJ_id_smime_aa_receiptRequest OBJ_id_smime_aa,1L + +#define SN_id_smime_aa_securityLabel "id-smime-aa-securityLabel" +#define NID_id_smime_aa_securityLabel 213 +#define OBJ_id_smime_aa_securityLabel OBJ_id_smime_aa,2L + +#define SN_id_smime_aa_mlExpandHistory "id-smime-aa-mlExpandHistory" +#define NID_id_smime_aa_mlExpandHistory 214 +#define OBJ_id_smime_aa_mlExpandHistory OBJ_id_smime_aa,3L + +#define SN_id_smime_aa_contentHint "id-smime-aa-contentHint" +#define NID_id_smime_aa_contentHint 215 +#define OBJ_id_smime_aa_contentHint OBJ_id_smime_aa,4L + +#define SN_id_smime_aa_msgSigDigest "id-smime-aa-msgSigDigest" +#define NID_id_smime_aa_msgSigDigest 216 +#define OBJ_id_smime_aa_msgSigDigest OBJ_id_smime_aa,5L + +#define SN_id_smime_aa_encapContentType "id-smime-aa-encapContentType" +#define NID_id_smime_aa_encapContentType 217 +#define OBJ_id_smime_aa_encapContentType OBJ_id_smime_aa,6L + +#define SN_id_smime_aa_contentIdentifier "id-smime-aa-contentIdentifier" +#define NID_id_smime_aa_contentIdentifier 218 +#define OBJ_id_smime_aa_contentIdentifier OBJ_id_smime_aa,7L + +#define SN_id_smime_aa_macValue "id-smime-aa-macValue" +#define NID_id_smime_aa_macValue 219 +#define OBJ_id_smime_aa_macValue OBJ_id_smime_aa,8L + +#define SN_id_smime_aa_equivalentLabels "id-smime-aa-equivalentLabels" +#define NID_id_smime_aa_equivalentLabels 220 +#define OBJ_id_smime_aa_equivalentLabels OBJ_id_smime_aa,9L + +#define SN_id_smime_aa_contentReference "id-smime-aa-contentReference" +#define NID_id_smime_aa_contentReference 221 +#define OBJ_id_smime_aa_contentReference OBJ_id_smime_aa,10L + +#define SN_id_smime_aa_encrypKeyPref "id-smime-aa-encrypKeyPref" +#define NID_id_smime_aa_encrypKeyPref 222 +#define OBJ_id_smime_aa_encrypKeyPref OBJ_id_smime_aa,11L + +#define SN_id_smime_aa_signingCertificate "id-smime-aa-signingCertificate" +#define NID_id_smime_aa_signingCertificate 223 +#define OBJ_id_smime_aa_signingCertificate OBJ_id_smime_aa,12L + +#define SN_id_smime_aa_smimeEncryptCerts "id-smime-aa-smimeEncryptCerts" +#define NID_id_smime_aa_smimeEncryptCerts 224 +#define OBJ_id_smime_aa_smimeEncryptCerts OBJ_id_smime_aa,13L + +#define SN_id_smime_aa_timeStampToken "id-smime-aa-timeStampToken" +#define NID_id_smime_aa_timeStampToken 225 +#define OBJ_id_smime_aa_timeStampToken OBJ_id_smime_aa,14L + +#define SN_id_smime_aa_ets_sigPolicyId "id-smime-aa-ets-sigPolicyId" +#define NID_id_smime_aa_ets_sigPolicyId 226 +#define OBJ_id_smime_aa_ets_sigPolicyId OBJ_id_smime_aa,15L + +#define SN_id_smime_aa_ets_commitmentType "id-smime-aa-ets-commitmentType" +#define NID_id_smime_aa_ets_commitmentType 227 +#define OBJ_id_smime_aa_ets_commitmentType OBJ_id_smime_aa,16L + +#define SN_id_smime_aa_ets_signerLocation "id-smime-aa-ets-signerLocation" +#define NID_id_smime_aa_ets_signerLocation 228 +#define OBJ_id_smime_aa_ets_signerLocation OBJ_id_smime_aa,17L + +#define SN_id_smime_aa_ets_signerAttr "id-smime-aa-ets-signerAttr" +#define NID_id_smime_aa_ets_signerAttr 229 +#define OBJ_id_smime_aa_ets_signerAttr OBJ_id_smime_aa,18L + +#define SN_id_smime_aa_ets_otherSigCert "id-smime-aa-ets-otherSigCert" +#define NID_id_smime_aa_ets_otherSigCert 230 +#define OBJ_id_smime_aa_ets_otherSigCert OBJ_id_smime_aa,19L + +#define SN_id_smime_aa_ets_contentTimestamp "id-smime-aa-ets-contentTimestamp" +#define NID_id_smime_aa_ets_contentTimestamp 231 +#define OBJ_id_smime_aa_ets_contentTimestamp OBJ_id_smime_aa,20L + +#define SN_id_smime_aa_ets_CertificateRefs "id-smime-aa-ets-CertificateRefs" +#define NID_id_smime_aa_ets_CertificateRefs 232 +#define OBJ_id_smime_aa_ets_CertificateRefs OBJ_id_smime_aa,21L + +#define SN_id_smime_aa_ets_RevocationRefs "id-smime-aa-ets-RevocationRefs" +#define NID_id_smime_aa_ets_RevocationRefs 233 +#define OBJ_id_smime_aa_ets_RevocationRefs OBJ_id_smime_aa,22L + +#define SN_id_smime_aa_ets_certValues "id-smime-aa-ets-certValues" +#define NID_id_smime_aa_ets_certValues 234 +#define OBJ_id_smime_aa_ets_certValues OBJ_id_smime_aa,23L + +#define SN_id_smime_aa_ets_revocationValues "id-smime-aa-ets-revocationValues" +#define NID_id_smime_aa_ets_revocationValues 235 +#define OBJ_id_smime_aa_ets_revocationValues OBJ_id_smime_aa,24L + +#define SN_id_smime_aa_ets_escTimeStamp "id-smime-aa-ets-escTimeStamp" +#define NID_id_smime_aa_ets_escTimeStamp 236 +#define OBJ_id_smime_aa_ets_escTimeStamp OBJ_id_smime_aa,25L + +#define SN_id_smime_aa_ets_certCRLTimestamp "id-smime-aa-ets-certCRLTimestamp" +#define NID_id_smime_aa_ets_certCRLTimestamp 237 +#define OBJ_id_smime_aa_ets_certCRLTimestamp OBJ_id_smime_aa,26L + +#define SN_id_smime_aa_ets_archiveTimeStamp "id-smime-aa-ets-archiveTimeStamp" +#define NID_id_smime_aa_ets_archiveTimeStamp 238 +#define OBJ_id_smime_aa_ets_archiveTimeStamp OBJ_id_smime_aa,27L + +#define SN_id_smime_aa_signatureType "id-smime-aa-signatureType" +#define NID_id_smime_aa_signatureType 239 +#define OBJ_id_smime_aa_signatureType OBJ_id_smime_aa,28L + +#define SN_id_smime_aa_dvcs_dvc "id-smime-aa-dvcs-dvc" +#define NID_id_smime_aa_dvcs_dvc 240 +#define OBJ_id_smime_aa_dvcs_dvc OBJ_id_smime_aa,29L + +#define SN_id_smime_alg_ESDHwith3DES "id-smime-alg-ESDHwith3DES" +#define NID_id_smime_alg_ESDHwith3DES 241 +#define OBJ_id_smime_alg_ESDHwith3DES OBJ_id_smime_alg,1L + +#define SN_id_smime_alg_ESDHwithRC2 "id-smime-alg-ESDHwithRC2" +#define NID_id_smime_alg_ESDHwithRC2 242 +#define OBJ_id_smime_alg_ESDHwithRC2 OBJ_id_smime_alg,2L + +#define SN_id_smime_alg_3DESwrap "id-smime-alg-3DESwrap" +#define NID_id_smime_alg_3DESwrap 243 +#define OBJ_id_smime_alg_3DESwrap OBJ_id_smime_alg,3L + +#define SN_id_smime_alg_RC2wrap "id-smime-alg-RC2wrap" +#define NID_id_smime_alg_RC2wrap 244 +#define OBJ_id_smime_alg_RC2wrap OBJ_id_smime_alg,4L + +#define SN_id_smime_alg_ESDH "id-smime-alg-ESDH" +#define NID_id_smime_alg_ESDH 245 +#define OBJ_id_smime_alg_ESDH OBJ_id_smime_alg,5L + +#define SN_id_smime_alg_CMS3DESwrap "id-smime-alg-CMS3DESwrap" +#define NID_id_smime_alg_CMS3DESwrap 246 +#define OBJ_id_smime_alg_CMS3DESwrap OBJ_id_smime_alg,6L + +#define SN_id_smime_alg_CMSRC2wrap "id-smime-alg-CMSRC2wrap" +#define NID_id_smime_alg_CMSRC2wrap 247 +#define OBJ_id_smime_alg_CMSRC2wrap OBJ_id_smime_alg,7L + +#define SN_id_alg_PWRI_KEK "id-alg-PWRI-KEK" +#define NID_id_alg_PWRI_KEK 893 +#define OBJ_id_alg_PWRI_KEK OBJ_id_smime_alg,9L + +#define SN_id_smime_cd_ldap "id-smime-cd-ldap" +#define NID_id_smime_cd_ldap 248 +#define OBJ_id_smime_cd_ldap OBJ_id_smime_cd,1L + +#define SN_id_smime_spq_ets_sqt_uri "id-smime-spq-ets-sqt-uri" +#define NID_id_smime_spq_ets_sqt_uri 249 +#define OBJ_id_smime_spq_ets_sqt_uri OBJ_id_smime_spq,1L + +#define SN_id_smime_spq_ets_sqt_unotice "id-smime-spq-ets-sqt-unotice" +#define NID_id_smime_spq_ets_sqt_unotice 250 +#define OBJ_id_smime_spq_ets_sqt_unotice OBJ_id_smime_spq,2L + +#define SN_id_smime_cti_ets_proofOfOrigin "id-smime-cti-ets-proofOfOrigin" +#define NID_id_smime_cti_ets_proofOfOrigin 251 +#define OBJ_id_smime_cti_ets_proofOfOrigin OBJ_id_smime_cti,1L + +#define SN_id_smime_cti_ets_proofOfReceipt "id-smime-cti-ets-proofOfReceipt" +#define NID_id_smime_cti_ets_proofOfReceipt 252 +#define OBJ_id_smime_cti_ets_proofOfReceipt OBJ_id_smime_cti,2L + +#define SN_id_smime_cti_ets_proofOfDelivery "id-smime-cti-ets-proofOfDelivery" +#define NID_id_smime_cti_ets_proofOfDelivery 253 +#define OBJ_id_smime_cti_ets_proofOfDelivery OBJ_id_smime_cti,3L + +#define SN_id_smime_cti_ets_proofOfSender "id-smime-cti-ets-proofOfSender" +#define NID_id_smime_cti_ets_proofOfSender 254 +#define OBJ_id_smime_cti_ets_proofOfSender OBJ_id_smime_cti,4L + +#define SN_id_smime_cti_ets_proofOfApproval "id-smime-cti-ets-proofOfApproval" +#define NID_id_smime_cti_ets_proofOfApproval 255 +#define OBJ_id_smime_cti_ets_proofOfApproval OBJ_id_smime_cti,5L + +#define SN_id_smime_cti_ets_proofOfCreation "id-smime-cti-ets-proofOfCreation" +#define NID_id_smime_cti_ets_proofOfCreation 256 +#define OBJ_id_smime_cti_ets_proofOfCreation OBJ_id_smime_cti,6L + +#define LN_friendlyName "friendlyName" +#define NID_friendlyName 156 +#define OBJ_friendlyName OBJ_pkcs9,20L + +#define LN_localKeyID "localKeyID" +#define NID_localKeyID 157 +#define OBJ_localKeyID OBJ_pkcs9,21L + +#define SN_ms_csp_name "CSPName" +#define LN_ms_csp_name "Microsoft CSP Name" +#define NID_ms_csp_name 417 +#define OBJ_ms_csp_name 1L,3L,6L,1L,4L,1L,311L,17L,1L + +#define SN_LocalKeySet "LocalKeySet" +#define LN_LocalKeySet "Microsoft Local Key set" +#define NID_LocalKeySet 856 +#define OBJ_LocalKeySet 1L,3L,6L,1L,4L,1L,311L,17L,2L + +#define OBJ_certTypes OBJ_pkcs9,22L + +#define LN_x509Certificate "x509Certificate" +#define NID_x509Certificate 158 +#define OBJ_x509Certificate OBJ_certTypes,1L + +#define LN_sdsiCertificate "sdsiCertificate" +#define NID_sdsiCertificate 159 +#define OBJ_sdsiCertificate OBJ_certTypes,2L + +#define OBJ_crlTypes OBJ_pkcs9,23L + +#define LN_x509Crl "x509Crl" +#define NID_x509Crl 160 +#define OBJ_x509Crl OBJ_crlTypes,1L + +#define OBJ_pkcs12 OBJ_pkcs,12L + +#define OBJ_pkcs12_pbeids OBJ_pkcs12,1L + +#define SN_pbe_WithSHA1And128BitRC4 "PBE-SHA1-RC4-128" +#define LN_pbe_WithSHA1And128BitRC4 "pbeWithSHA1And128BitRC4" +#define NID_pbe_WithSHA1And128BitRC4 144 +#define OBJ_pbe_WithSHA1And128BitRC4 OBJ_pkcs12_pbeids,1L + +#define SN_pbe_WithSHA1And40BitRC4 "PBE-SHA1-RC4-40" +#define LN_pbe_WithSHA1And40BitRC4 "pbeWithSHA1And40BitRC4" +#define NID_pbe_WithSHA1And40BitRC4 145 +#define OBJ_pbe_WithSHA1And40BitRC4 OBJ_pkcs12_pbeids,2L + +#define SN_pbe_WithSHA1And3_Key_TripleDES_CBC "PBE-SHA1-3DES" +#define LN_pbe_WithSHA1And3_Key_TripleDES_CBC "pbeWithSHA1And3-KeyTripleDES-CBC" +#define NID_pbe_WithSHA1And3_Key_TripleDES_CBC 146 +#define OBJ_pbe_WithSHA1And3_Key_TripleDES_CBC OBJ_pkcs12_pbeids,3L + +#define SN_pbe_WithSHA1And2_Key_TripleDES_CBC "PBE-SHA1-2DES" +#define LN_pbe_WithSHA1And2_Key_TripleDES_CBC "pbeWithSHA1And2-KeyTripleDES-CBC" +#define NID_pbe_WithSHA1And2_Key_TripleDES_CBC 147 +#define OBJ_pbe_WithSHA1And2_Key_TripleDES_CBC OBJ_pkcs12_pbeids,4L + +#define SN_pbe_WithSHA1And128BitRC2_CBC "PBE-SHA1-RC2-128" +#define LN_pbe_WithSHA1And128BitRC2_CBC "pbeWithSHA1And128BitRC2-CBC" +#define NID_pbe_WithSHA1And128BitRC2_CBC 148 +#define OBJ_pbe_WithSHA1And128BitRC2_CBC OBJ_pkcs12_pbeids,5L + +#define SN_pbe_WithSHA1And40BitRC2_CBC "PBE-SHA1-RC2-40" +#define LN_pbe_WithSHA1And40BitRC2_CBC "pbeWithSHA1And40BitRC2-CBC" +#define NID_pbe_WithSHA1And40BitRC2_CBC 149 +#define OBJ_pbe_WithSHA1And40BitRC2_CBC OBJ_pkcs12_pbeids,6L + +#define OBJ_pkcs12_Version1 OBJ_pkcs12,10L + +#define OBJ_pkcs12_BagIds OBJ_pkcs12_Version1,1L + +#define LN_keyBag "keyBag" +#define NID_keyBag 150 +#define OBJ_keyBag OBJ_pkcs12_BagIds,1L + +#define LN_pkcs8ShroudedKeyBag "pkcs8ShroudedKeyBag" +#define NID_pkcs8ShroudedKeyBag 151 +#define OBJ_pkcs8ShroudedKeyBag OBJ_pkcs12_BagIds,2L + +#define LN_certBag "certBag" +#define NID_certBag 152 +#define OBJ_certBag OBJ_pkcs12_BagIds,3L + +#define LN_crlBag "crlBag" +#define NID_crlBag 153 +#define OBJ_crlBag OBJ_pkcs12_BagIds,4L + +#define LN_secretBag "secretBag" +#define NID_secretBag 154 +#define OBJ_secretBag OBJ_pkcs12_BagIds,5L + +#define LN_safeContentsBag "safeContentsBag" +#define NID_safeContentsBag 155 +#define OBJ_safeContentsBag OBJ_pkcs12_BagIds,6L + +#define SN_md2 "MD2" +#define LN_md2 "md2" +#define NID_md2 3 +#define OBJ_md2 OBJ_rsadsi,2L,2L + +#define SN_md4 "MD4" +#define LN_md4 "md4" +#define NID_md4 257 +#define OBJ_md4 OBJ_rsadsi,2L,4L + +#define SN_md5 "MD5" +#define LN_md5 "md5" +#define NID_md5 4 +#define OBJ_md5 OBJ_rsadsi,2L,5L + +#define SN_md5_sha1 "MD5-SHA1" +#define LN_md5_sha1 "md5-sha1" +#define NID_md5_sha1 114 + +#define LN_hmacWithMD5 "hmacWithMD5" +#define NID_hmacWithMD5 797 +#define OBJ_hmacWithMD5 OBJ_rsadsi,2L,6L + +#define LN_hmacWithSHA1 "hmacWithSHA1" +#define NID_hmacWithSHA1 163 +#define OBJ_hmacWithSHA1 OBJ_rsadsi,2L,7L + +#define LN_hmacWithSHA224 "hmacWithSHA224" +#define NID_hmacWithSHA224 798 +#define OBJ_hmacWithSHA224 OBJ_rsadsi,2L,8L + +#define LN_hmacWithSHA256 "hmacWithSHA256" +#define NID_hmacWithSHA256 799 +#define OBJ_hmacWithSHA256 OBJ_rsadsi,2L,9L + +#define LN_hmacWithSHA384 "hmacWithSHA384" +#define NID_hmacWithSHA384 800 +#define OBJ_hmacWithSHA384 OBJ_rsadsi,2L,10L + +#define LN_hmacWithSHA512 "hmacWithSHA512" +#define NID_hmacWithSHA512 801 +#define OBJ_hmacWithSHA512 OBJ_rsadsi,2L,11L + +#define SN_rc2_cbc "RC2-CBC" +#define LN_rc2_cbc "rc2-cbc" +#define NID_rc2_cbc 37 +#define OBJ_rc2_cbc OBJ_rsadsi,3L,2L + +#define SN_rc2_ecb "RC2-ECB" +#define LN_rc2_ecb "rc2-ecb" +#define NID_rc2_ecb 38 + +#define SN_rc2_cfb64 "RC2-CFB" +#define LN_rc2_cfb64 "rc2-cfb" +#define NID_rc2_cfb64 39 + +#define SN_rc2_ofb64 "RC2-OFB" +#define LN_rc2_ofb64 "rc2-ofb" +#define NID_rc2_ofb64 40 + +#define SN_rc2_40_cbc "RC2-40-CBC" +#define LN_rc2_40_cbc "rc2-40-cbc" +#define NID_rc2_40_cbc 98 + +#define SN_rc2_64_cbc "RC2-64-CBC" +#define LN_rc2_64_cbc "rc2-64-cbc" +#define NID_rc2_64_cbc 166 + +#define SN_rc4 "RC4" +#define LN_rc4 "rc4" +#define NID_rc4 5 +#define OBJ_rc4 OBJ_rsadsi,3L,4L + +#define SN_rc4_40 "RC4-40" +#define LN_rc4_40 "rc4-40" +#define NID_rc4_40 97 + +#define SN_des_ede3_cbc "DES-EDE3-CBC" +#define LN_des_ede3_cbc "des-ede3-cbc" +#define NID_des_ede3_cbc 44 +#define OBJ_des_ede3_cbc OBJ_rsadsi,3L,7L + +#define SN_rc5_cbc "RC5-CBC" +#define LN_rc5_cbc "rc5-cbc" +#define NID_rc5_cbc 120 +#define OBJ_rc5_cbc OBJ_rsadsi,3L,8L + +#define SN_rc5_ecb "RC5-ECB" +#define LN_rc5_ecb "rc5-ecb" +#define NID_rc5_ecb 121 + +#define SN_rc5_cfb64 "RC5-CFB" +#define LN_rc5_cfb64 "rc5-cfb" +#define NID_rc5_cfb64 122 + +#define SN_rc5_ofb64 "RC5-OFB" +#define LN_rc5_ofb64 "rc5-ofb" +#define NID_rc5_ofb64 123 + +#define SN_ms_ext_req "msExtReq" +#define LN_ms_ext_req "Microsoft Extension Request" +#define NID_ms_ext_req 171 +#define OBJ_ms_ext_req 1L,3L,6L,1L,4L,1L,311L,2L,1L,14L + +#define SN_ms_code_ind "msCodeInd" +#define LN_ms_code_ind "Microsoft Individual Code Signing" +#define NID_ms_code_ind 134 +#define OBJ_ms_code_ind 1L,3L,6L,1L,4L,1L,311L,2L,1L,21L + +#define SN_ms_code_com "msCodeCom" +#define LN_ms_code_com "Microsoft Commercial Code Signing" +#define NID_ms_code_com 135 +#define OBJ_ms_code_com 1L,3L,6L,1L,4L,1L,311L,2L,1L,22L + +#define SN_ms_ctl_sign "msCTLSign" +#define LN_ms_ctl_sign "Microsoft Trust List Signing" +#define NID_ms_ctl_sign 136 +#define OBJ_ms_ctl_sign 1L,3L,6L,1L,4L,1L,311L,10L,3L,1L + +#define SN_ms_sgc "msSGC" +#define LN_ms_sgc "Microsoft Server Gated Crypto" +#define NID_ms_sgc 137 +#define OBJ_ms_sgc 1L,3L,6L,1L,4L,1L,311L,10L,3L,3L + +#define SN_ms_efs "msEFS" +#define LN_ms_efs "Microsoft Encrypted File System" +#define NID_ms_efs 138 +#define OBJ_ms_efs 1L,3L,6L,1L,4L,1L,311L,10L,3L,4L + +#define SN_ms_smartcard_login "msSmartcardLogin" +#define LN_ms_smartcard_login "Microsoft Smartcardlogin" +#define NID_ms_smartcard_login 648 +#define OBJ_ms_smartcard_login 1L,3L,6L,1L,4L,1L,311L,20L,2L,2L + +#define SN_ms_upn "msUPN" +#define LN_ms_upn "Microsoft Universal Principal Name" +#define NID_ms_upn 649 +#define OBJ_ms_upn 1L,3L,6L,1L,4L,1L,311L,20L,2L,3L + +#define SN_idea_cbc "IDEA-CBC" +#define LN_idea_cbc "idea-cbc" +#define NID_idea_cbc 34 +#define OBJ_idea_cbc 1L,3L,6L,1L,4L,1L,188L,7L,1L,1L,2L + +#define SN_idea_ecb "IDEA-ECB" +#define LN_idea_ecb "idea-ecb" +#define NID_idea_ecb 36 + +#define SN_idea_cfb64 "IDEA-CFB" +#define LN_idea_cfb64 "idea-cfb" +#define NID_idea_cfb64 35 + +#define SN_idea_ofb64 "IDEA-OFB" +#define LN_idea_ofb64 "idea-ofb" +#define NID_idea_ofb64 46 + +#define SN_bf_cbc "BF-CBC" +#define LN_bf_cbc "bf-cbc" +#define NID_bf_cbc 91 +#define OBJ_bf_cbc 1L,3L,6L,1L,4L,1L,3029L,1L,2L + +#define SN_bf_ecb "BF-ECB" +#define LN_bf_ecb "bf-ecb" +#define NID_bf_ecb 92 + +#define SN_bf_cfb64 "BF-CFB" +#define LN_bf_cfb64 "bf-cfb" +#define NID_bf_cfb64 93 + +#define SN_bf_ofb64 "BF-OFB" +#define LN_bf_ofb64 "bf-ofb" +#define NID_bf_ofb64 94 + +#define SN_id_pkix "PKIX" +#define NID_id_pkix 127 +#define OBJ_id_pkix 1L,3L,6L,1L,5L,5L,7L + +#define SN_id_pkix_mod "id-pkix-mod" +#define NID_id_pkix_mod 258 +#define OBJ_id_pkix_mod OBJ_id_pkix,0L + +#define SN_id_pe "id-pe" +#define NID_id_pe 175 +#define OBJ_id_pe OBJ_id_pkix,1L + +#define SN_id_qt "id-qt" +#define NID_id_qt 259 +#define OBJ_id_qt OBJ_id_pkix,2L + +#define SN_id_kp "id-kp" +#define NID_id_kp 128 +#define OBJ_id_kp OBJ_id_pkix,3L + +#define SN_id_it "id-it" +#define NID_id_it 260 +#define OBJ_id_it OBJ_id_pkix,4L + +#define SN_id_pkip "id-pkip" +#define NID_id_pkip 261 +#define OBJ_id_pkip OBJ_id_pkix,5L + +#define SN_id_alg "id-alg" +#define NID_id_alg 262 +#define OBJ_id_alg OBJ_id_pkix,6L + +#define SN_id_cmc "id-cmc" +#define NID_id_cmc 263 +#define OBJ_id_cmc OBJ_id_pkix,7L + +#define SN_id_on "id-on" +#define NID_id_on 264 +#define OBJ_id_on OBJ_id_pkix,8L + +#define SN_id_pda "id-pda" +#define NID_id_pda 265 +#define OBJ_id_pda OBJ_id_pkix,9L + +#define SN_id_aca "id-aca" +#define NID_id_aca 266 +#define OBJ_id_aca OBJ_id_pkix,10L + +#define SN_id_qcs "id-qcs" +#define NID_id_qcs 267 +#define OBJ_id_qcs OBJ_id_pkix,11L + +#define SN_id_cct "id-cct" +#define NID_id_cct 268 +#define OBJ_id_cct OBJ_id_pkix,12L + +#define SN_id_ppl "id-ppl" +#define NID_id_ppl 662 +#define OBJ_id_ppl OBJ_id_pkix,21L + +#define SN_id_ad "id-ad" +#define NID_id_ad 176 +#define OBJ_id_ad OBJ_id_pkix,48L + +#define SN_id_pkix1_explicit_88 "id-pkix1-explicit-88" +#define NID_id_pkix1_explicit_88 269 +#define OBJ_id_pkix1_explicit_88 OBJ_id_pkix_mod,1L + +#define SN_id_pkix1_implicit_88 "id-pkix1-implicit-88" +#define NID_id_pkix1_implicit_88 270 +#define OBJ_id_pkix1_implicit_88 OBJ_id_pkix_mod,2L + +#define SN_id_pkix1_explicit_93 "id-pkix1-explicit-93" +#define NID_id_pkix1_explicit_93 271 +#define OBJ_id_pkix1_explicit_93 OBJ_id_pkix_mod,3L + +#define SN_id_pkix1_implicit_93 "id-pkix1-implicit-93" +#define NID_id_pkix1_implicit_93 272 +#define OBJ_id_pkix1_implicit_93 OBJ_id_pkix_mod,4L + +#define SN_id_mod_crmf "id-mod-crmf" +#define NID_id_mod_crmf 273 +#define OBJ_id_mod_crmf OBJ_id_pkix_mod,5L + +#define SN_id_mod_cmc "id-mod-cmc" +#define NID_id_mod_cmc 274 +#define OBJ_id_mod_cmc OBJ_id_pkix_mod,6L + +#define SN_id_mod_kea_profile_88 "id-mod-kea-profile-88" +#define NID_id_mod_kea_profile_88 275 +#define OBJ_id_mod_kea_profile_88 OBJ_id_pkix_mod,7L + +#define SN_id_mod_kea_profile_93 "id-mod-kea-profile-93" +#define NID_id_mod_kea_profile_93 276 +#define OBJ_id_mod_kea_profile_93 OBJ_id_pkix_mod,8L + +#define SN_id_mod_cmp "id-mod-cmp" +#define NID_id_mod_cmp 277 +#define OBJ_id_mod_cmp OBJ_id_pkix_mod,9L + +#define SN_id_mod_qualified_cert_88 "id-mod-qualified-cert-88" +#define NID_id_mod_qualified_cert_88 278 +#define OBJ_id_mod_qualified_cert_88 OBJ_id_pkix_mod,10L + +#define SN_id_mod_qualified_cert_93 "id-mod-qualified-cert-93" +#define NID_id_mod_qualified_cert_93 279 +#define OBJ_id_mod_qualified_cert_93 OBJ_id_pkix_mod,11L + +#define SN_id_mod_attribute_cert "id-mod-attribute-cert" +#define NID_id_mod_attribute_cert 280 +#define OBJ_id_mod_attribute_cert OBJ_id_pkix_mod,12L + +#define SN_id_mod_timestamp_protocol "id-mod-timestamp-protocol" +#define NID_id_mod_timestamp_protocol 281 +#define OBJ_id_mod_timestamp_protocol OBJ_id_pkix_mod,13L + +#define SN_id_mod_ocsp "id-mod-ocsp" +#define NID_id_mod_ocsp 282 +#define OBJ_id_mod_ocsp OBJ_id_pkix_mod,14L + +#define SN_id_mod_dvcs "id-mod-dvcs" +#define NID_id_mod_dvcs 283 +#define OBJ_id_mod_dvcs OBJ_id_pkix_mod,15L + +#define SN_id_mod_cmp2000 "id-mod-cmp2000" +#define NID_id_mod_cmp2000 284 +#define OBJ_id_mod_cmp2000 OBJ_id_pkix_mod,16L + +#define SN_info_access "authorityInfoAccess" +#define LN_info_access "Authority Information Access" +#define NID_info_access 177 +#define OBJ_info_access OBJ_id_pe,1L + +#define SN_biometricInfo "biometricInfo" +#define LN_biometricInfo "Biometric Info" +#define NID_biometricInfo 285 +#define OBJ_biometricInfo OBJ_id_pe,2L + +#define SN_qcStatements "qcStatements" +#define NID_qcStatements 286 +#define OBJ_qcStatements OBJ_id_pe,3L + +#define SN_ac_auditEntity "ac-auditEntity" +#define NID_ac_auditEntity 287 +#define OBJ_ac_auditEntity OBJ_id_pe,4L + +#define SN_ac_targeting "ac-targeting" +#define NID_ac_targeting 288 +#define OBJ_ac_targeting OBJ_id_pe,5L + +#define SN_aaControls "aaControls" +#define NID_aaControls 289 +#define OBJ_aaControls OBJ_id_pe,6L + +#define SN_sbgp_ipAddrBlock "sbgp-ipAddrBlock" +#define NID_sbgp_ipAddrBlock 290 +#define OBJ_sbgp_ipAddrBlock OBJ_id_pe,7L + +#define SN_sbgp_autonomousSysNum "sbgp-autonomousSysNum" +#define NID_sbgp_autonomousSysNum 291 +#define OBJ_sbgp_autonomousSysNum OBJ_id_pe,8L + +#define SN_sbgp_routerIdentifier "sbgp-routerIdentifier" +#define NID_sbgp_routerIdentifier 292 +#define OBJ_sbgp_routerIdentifier OBJ_id_pe,9L + +#define SN_ac_proxying "ac-proxying" +#define NID_ac_proxying 397 +#define OBJ_ac_proxying OBJ_id_pe,10L + +#define SN_sinfo_access "subjectInfoAccess" +#define LN_sinfo_access "Subject Information Access" +#define NID_sinfo_access 398 +#define OBJ_sinfo_access OBJ_id_pe,11L + +#define SN_proxyCertInfo "proxyCertInfo" +#define LN_proxyCertInfo "Proxy Certificate Information" +#define NID_proxyCertInfo 663 +#define OBJ_proxyCertInfo OBJ_id_pe,14L + +#define SN_id_qt_cps "id-qt-cps" +#define LN_id_qt_cps "Policy Qualifier CPS" +#define NID_id_qt_cps 164 +#define OBJ_id_qt_cps OBJ_id_qt,1L + +#define SN_id_qt_unotice "id-qt-unotice" +#define LN_id_qt_unotice "Policy Qualifier User Notice" +#define NID_id_qt_unotice 165 +#define OBJ_id_qt_unotice OBJ_id_qt,2L + +#define SN_textNotice "textNotice" +#define NID_textNotice 293 +#define OBJ_textNotice OBJ_id_qt,3L + +#define SN_server_auth "serverAuth" +#define LN_server_auth "TLS Web Server Authentication" +#define NID_server_auth 129 +#define OBJ_server_auth OBJ_id_kp,1L + +#define SN_client_auth "clientAuth" +#define LN_client_auth "TLS Web Client Authentication" +#define NID_client_auth 130 +#define OBJ_client_auth OBJ_id_kp,2L + +#define SN_code_sign "codeSigning" +#define LN_code_sign "Code Signing" +#define NID_code_sign 131 +#define OBJ_code_sign OBJ_id_kp,3L + +#define SN_email_protect "emailProtection" +#define LN_email_protect "E-mail Protection" +#define NID_email_protect 132 +#define OBJ_email_protect OBJ_id_kp,4L + +#define SN_ipsecEndSystem "ipsecEndSystem" +#define LN_ipsecEndSystem "IPSec End System" +#define NID_ipsecEndSystem 294 +#define OBJ_ipsecEndSystem OBJ_id_kp,5L + +#define SN_ipsecTunnel "ipsecTunnel" +#define LN_ipsecTunnel "IPSec Tunnel" +#define NID_ipsecTunnel 295 +#define OBJ_ipsecTunnel OBJ_id_kp,6L + +#define SN_ipsecUser "ipsecUser" +#define LN_ipsecUser "IPSec User" +#define NID_ipsecUser 296 +#define OBJ_ipsecUser OBJ_id_kp,7L + +#define SN_time_stamp "timeStamping" +#define LN_time_stamp "Time Stamping" +#define NID_time_stamp 133 +#define OBJ_time_stamp OBJ_id_kp,8L + +#define SN_OCSP_sign "OCSPSigning" +#define LN_OCSP_sign "OCSP Signing" +#define NID_OCSP_sign 180 +#define OBJ_OCSP_sign OBJ_id_kp,9L + +#define SN_dvcs "DVCS" +#define LN_dvcs "dvcs" +#define NID_dvcs 297 +#define OBJ_dvcs OBJ_id_kp,10L + +#define SN_id_it_caProtEncCert "id-it-caProtEncCert" +#define NID_id_it_caProtEncCert 298 +#define OBJ_id_it_caProtEncCert OBJ_id_it,1L + +#define SN_id_it_signKeyPairTypes "id-it-signKeyPairTypes" +#define NID_id_it_signKeyPairTypes 299 +#define OBJ_id_it_signKeyPairTypes OBJ_id_it,2L + +#define SN_id_it_encKeyPairTypes "id-it-encKeyPairTypes" +#define NID_id_it_encKeyPairTypes 300 +#define OBJ_id_it_encKeyPairTypes OBJ_id_it,3L + +#define SN_id_it_preferredSymmAlg "id-it-preferredSymmAlg" +#define NID_id_it_preferredSymmAlg 301 +#define OBJ_id_it_preferredSymmAlg OBJ_id_it,4L + +#define SN_id_it_caKeyUpdateInfo "id-it-caKeyUpdateInfo" +#define NID_id_it_caKeyUpdateInfo 302 +#define OBJ_id_it_caKeyUpdateInfo OBJ_id_it,5L + +#define SN_id_it_currentCRL "id-it-currentCRL" +#define NID_id_it_currentCRL 303 +#define OBJ_id_it_currentCRL OBJ_id_it,6L + +#define SN_id_it_unsupportedOIDs "id-it-unsupportedOIDs" +#define NID_id_it_unsupportedOIDs 304 +#define OBJ_id_it_unsupportedOIDs OBJ_id_it,7L + +#define SN_id_it_subscriptionRequest "id-it-subscriptionRequest" +#define NID_id_it_subscriptionRequest 305 +#define OBJ_id_it_subscriptionRequest OBJ_id_it,8L + +#define SN_id_it_subscriptionResponse "id-it-subscriptionResponse" +#define NID_id_it_subscriptionResponse 306 +#define OBJ_id_it_subscriptionResponse OBJ_id_it,9L + +#define SN_id_it_keyPairParamReq "id-it-keyPairParamReq" +#define NID_id_it_keyPairParamReq 307 +#define OBJ_id_it_keyPairParamReq OBJ_id_it,10L + +#define SN_id_it_keyPairParamRep "id-it-keyPairParamRep" +#define NID_id_it_keyPairParamRep 308 +#define OBJ_id_it_keyPairParamRep OBJ_id_it,11L + +#define SN_id_it_revPassphrase "id-it-revPassphrase" +#define NID_id_it_revPassphrase 309 +#define OBJ_id_it_revPassphrase OBJ_id_it,12L + +#define SN_id_it_implicitConfirm "id-it-implicitConfirm" +#define NID_id_it_implicitConfirm 310 +#define OBJ_id_it_implicitConfirm OBJ_id_it,13L + +#define SN_id_it_confirmWaitTime "id-it-confirmWaitTime" +#define NID_id_it_confirmWaitTime 311 +#define OBJ_id_it_confirmWaitTime OBJ_id_it,14L + +#define SN_id_it_origPKIMessage "id-it-origPKIMessage" +#define NID_id_it_origPKIMessage 312 +#define OBJ_id_it_origPKIMessage OBJ_id_it,15L + +#define SN_id_it_suppLangTags "id-it-suppLangTags" +#define NID_id_it_suppLangTags 784 +#define OBJ_id_it_suppLangTags OBJ_id_it,16L + +#define SN_id_regCtrl "id-regCtrl" +#define NID_id_regCtrl 313 +#define OBJ_id_regCtrl OBJ_id_pkip,1L + +#define SN_id_regInfo "id-regInfo" +#define NID_id_regInfo 314 +#define OBJ_id_regInfo OBJ_id_pkip,2L + +#define SN_id_regCtrl_regToken "id-regCtrl-regToken" +#define NID_id_regCtrl_regToken 315 +#define OBJ_id_regCtrl_regToken OBJ_id_regCtrl,1L + +#define SN_id_regCtrl_authenticator "id-regCtrl-authenticator" +#define NID_id_regCtrl_authenticator 316 +#define OBJ_id_regCtrl_authenticator OBJ_id_regCtrl,2L + +#define SN_id_regCtrl_pkiPublicationInfo "id-regCtrl-pkiPublicationInfo" +#define NID_id_regCtrl_pkiPublicationInfo 317 +#define OBJ_id_regCtrl_pkiPublicationInfo OBJ_id_regCtrl,3L + +#define SN_id_regCtrl_pkiArchiveOptions "id-regCtrl-pkiArchiveOptions" +#define NID_id_regCtrl_pkiArchiveOptions 318 +#define OBJ_id_regCtrl_pkiArchiveOptions OBJ_id_regCtrl,4L + +#define SN_id_regCtrl_oldCertID "id-regCtrl-oldCertID" +#define NID_id_regCtrl_oldCertID 319 +#define OBJ_id_regCtrl_oldCertID OBJ_id_regCtrl,5L + +#define SN_id_regCtrl_protocolEncrKey "id-regCtrl-protocolEncrKey" +#define NID_id_regCtrl_protocolEncrKey 320 +#define OBJ_id_regCtrl_protocolEncrKey OBJ_id_regCtrl,6L + +#define SN_id_regInfo_utf8Pairs "id-regInfo-utf8Pairs" +#define NID_id_regInfo_utf8Pairs 321 +#define OBJ_id_regInfo_utf8Pairs OBJ_id_regInfo,1L + +#define SN_id_regInfo_certReq "id-regInfo-certReq" +#define NID_id_regInfo_certReq 322 +#define OBJ_id_regInfo_certReq OBJ_id_regInfo,2L + +#define SN_id_alg_des40 "id-alg-des40" +#define NID_id_alg_des40 323 +#define OBJ_id_alg_des40 OBJ_id_alg,1L + +#define SN_id_alg_noSignature "id-alg-noSignature" +#define NID_id_alg_noSignature 324 +#define OBJ_id_alg_noSignature OBJ_id_alg,2L + +#define SN_id_alg_dh_sig_hmac_sha1 "id-alg-dh-sig-hmac-sha1" +#define NID_id_alg_dh_sig_hmac_sha1 325 +#define OBJ_id_alg_dh_sig_hmac_sha1 OBJ_id_alg,3L + +#define SN_id_alg_dh_pop "id-alg-dh-pop" +#define NID_id_alg_dh_pop 326 +#define OBJ_id_alg_dh_pop OBJ_id_alg,4L + +#define SN_id_cmc_statusInfo "id-cmc-statusInfo" +#define NID_id_cmc_statusInfo 327 +#define OBJ_id_cmc_statusInfo OBJ_id_cmc,1L + +#define SN_id_cmc_identification "id-cmc-identification" +#define NID_id_cmc_identification 328 +#define OBJ_id_cmc_identification OBJ_id_cmc,2L + +#define SN_id_cmc_identityProof "id-cmc-identityProof" +#define NID_id_cmc_identityProof 329 +#define OBJ_id_cmc_identityProof OBJ_id_cmc,3L + +#define SN_id_cmc_dataReturn "id-cmc-dataReturn" +#define NID_id_cmc_dataReturn 330 +#define OBJ_id_cmc_dataReturn OBJ_id_cmc,4L + +#define SN_id_cmc_transactionId "id-cmc-transactionId" +#define NID_id_cmc_transactionId 331 +#define OBJ_id_cmc_transactionId OBJ_id_cmc,5L + +#define SN_id_cmc_senderNonce "id-cmc-senderNonce" +#define NID_id_cmc_senderNonce 332 +#define OBJ_id_cmc_senderNonce OBJ_id_cmc,6L + +#define SN_id_cmc_recipientNonce "id-cmc-recipientNonce" +#define NID_id_cmc_recipientNonce 333 +#define OBJ_id_cmc_recipientNonce OBJ_id_cmc,7L + +#define SN_id_cmc_addExtensions "id-cmc-addExtensions" +#define NID_id_cmc_addExtensions 334 +#define OBJ_id_cmc_addExtensions OBJ_id_cmc,8L + +#define SN_id_cmc_encryptedPOP "id-cmc-encryptedPOP" +#define NID_id_cmc_encryptedPOP 335 +#define OBJ_id_cmc_encryptedPOP OBJ_id_cmc,9L + +#define SN_id_cmc_decryptedPOP "id-cmc-decryptedPOP" +#define NID_id_cmc_decryptedPOP 336 +#define OBJ_id_cmc_decryptedPOP OBJ_id_cmc,10L + +#define SN_id_cmc_lraPOPWitness "id-cmc-lraPOPWitness" +#define NID_id_cmc_lraPOPWitness 337 +#define OBJ_id_cmc_lraPOPWitness OBJ_id_cmc,11L + +#define SN_id_cmc_getCert "id-cmc-getCert" +#define NID_id_cmc_getCert 338 +#define OBJ_id_cmc_getCert OBJ_id_cmc,15L + +#define SN_id_cmc_getCRL "id-cmc-getCRL" +#define NID_id_cmc_getCRL 339 +#define OBJ_id_cmc_getCRL OBJ_id_cmc,16L + +#define SN_id_cmc_revokeRequest "id-cmc-revokeRequest" +#define NID_id_cmc_revokeRequest 340 +#define OBJ_id_cmc_revokeRequest OBJ_id_cmc,17L + +#define SN_id_cmc_regInfo "id-cmc-regInfo" +#define NID_id_cmc_regInfo 341 +#define OBJ_id_cmc_regInfo OBJ_id_cmc,18L + +#define SN_id_cmc_responseInfo "id-cmc-responseInfo" +#define NID_id_cmc_responseInfo 342 +#define OBJ_id_cmc_responseInfo OBJ_id_cmc,19L + +#define SN_id_cmc_queryPending "id-cmc-queryPending" +#define NID_id_cmc_queryPending 343 +#define OBJ_id_cmc_queryPending OBJ_id_cmc,21L + +#define SN_id_cmc_popLinkRandom "id-cmc-popLinkRandom" +#define NID_id_cmc_popLinkRandom 344 +#define OBJ_id_cmc_popLinkRandom OBJ_id_cmc,22L + +#define SN_id_cmc_popLinkWitness "id-cmc-popLinkWitness" +#define NID_id_cmc_popLinkWitness 345 +#define OBJ_id_cmc_popLinkWitness OBJ_id_cmc,23L + +#define SN_id_cmc_confirmCertAcceptance "id-cmc-confirmCertAcceptance" +#define NID_id_cmc_confirmCertAcceptance 346 +#define OBJ_id_cmc_confirmCertAcceptance OBJ_id_cmc,24L + +#define SN_id_on_personalData "id-on-personalData" +#define NID_id_on_personalData 347 +#define OBJ_id_on_personalData OBJ_id_on,1L + +#define SN_id_on_permanentIdentifier "id-on-permanentIdentifier" +#define LN_id_on_permanentIdentifier "Permanent Identifier" +#define NID_id_on_permanentIdentifier 858 +#define OBJ_id_on_permanentIdentifier OBJ_id_on,3L + +#define SN_id_pda_dateOfBirth "id-pda-dateOfBirth" +#define NID_id_pda_dateOfBirth 348 +#define OBJ_id_pda_dateOfBirth OBJ_id_pda,1L + +#define SN_id_pda_placeOfBirth "id-pda-placeOfBirth" +#define NID_id_pda_placeOfBirth 349 +#define OBJ_id_pda_placeOfBirth OBJ_id_pda,2L + +#define SN_id_pda_gender "id-pda-gender" +#define NID_id_pda_gender 351 +#define OBJ_id_pda_gender OBJ_id_pda,3L + +#define SN_id_pda_countryOfCitizenship "id-pda-countryOfCitizenship" +#define NID_id_pda_countryOfCitizenship 352 +#define OBJ_id_pda_countryOfCitizenship OBJ_id_pda,4L + +#define SN_id_pda_countryOfResidence "id-pda-countryOfResidence" +#define NID_id_pda_countryOfResidence 353 +#define OBJ_id_pda_countryOfResidence OBJ_id_pda,5L + +#define SN_id_aca_authenticationInfo "id-aca-authenticationInfo" +#define NID_id_aca_authenticationInfo 354 +#define OBJ_id_aca_authenticationInfo OBJ_id_aca,1L + +#define SN_id_aca_accessIdentity "id-aca-accessIdentity" +#define NID_id_aca_accessIdentity 355 +#define OBJ_id_aca_accessIdentity OBJ_id_aca,2L + +#define SN_id_aca_chargingIdentity "id-aca-chargingIdentity" +#define NID_id_aca_chargingIdentity 356 +#define OBJ_id_aca_chargingIdentity OBJ_id_aca,3L + +#define SN_id_aca_group "id-aca-group" +#define NID_id_aca_group 357 +#define OBJ_id_aca_group OBJ_id_aca,4L + +#define SN_id_aca_role "id-aca-role" +#define NID_id_aca_role 358 +#define OBJ_id_aca_role OBJ_id_aca,5L + +#define SN_id_aca_encAttrs "id-aca-encAttrs" +#define NID_id_aca_encAttrs 399 +#define OBJ_id_aca_encAttrs OBJ_id_aca,6L + +#define SN_id_qcs_pkixQCSyntax_v1 "id-qcs-pkixQCSyntax-v1" +#define NID_id_qcs_pkixQCSyntax_v1 359 +#define OBJ_id_qcs_pkixQCSyntax_v1 OBJ_id_qcs,1L + +#define SN_id_cct_crs "id-cct-crs" +#define NID_id_cct_crs 360 +#define OBJ_id_cct_crs OBJ_id_cct,1L + +#define SN_id_cct_PKIData "id-cct-PKIData" +#define NID_id_cct_PKIData 361 +#define OBJ_id_cct_PKIData OBJ_id_cct,2L + +#define SN_id_cct_PKIResponse "id-cct-PKIResponse" +#define NID_id_cct_PKIResponse 362 +#define OBJ_id_cct_PKIResponse OBJ_id_cct,3L + +#define SN_id_ppl_anyLanguage "id-ppl-anyLanguage" +#define LN_id_ppl_anyLanguage "Any language" +#define NID_id_ppl_anyLanguage 664 +#define OBJ_id_ppl_anyLanguage OBJ_id_ppl,0L + +#define SN_id_ppl_inheritAll "id-ppl-inheritAll" +#define LN_id_ppl_inheritAll "Inherit all" +#define NID_id_ppl_inheritAll 665 +#define OBJ_id_ppl_inheritAll OBJ_id_ppl,1L + +#define SN_Independent "id-ppl-independent" +#define LN_Independent "Independent" +#define NID_Independent 667 +#define OBJ_Independent OBJ_id_ppl,2L + +#define SN_ad_OCSP "OCSP" +#define LN_ad_OCSP "OCSP" +#define NID_ad_OCSP 178 +#define OBJ_ad_OCSP OBJ_id_ad,1L + +#define SN_ad_ca_issuers "caIssuers" +#define LN_ad_ca_issuers "CA Issuers" +#define NID_ad_ca_issuers 179 +#define OBJ_ad_ca_issuers OBJ_id_ad,2L + +#define SN_ad_timeStamping "ad_timestamping" +#define LN_ad_timeStamping "AD Time Stamping" +#define NID_ad_timeStamping 363 +#define OBJ_ad_timeStamping OBJ_id_ad,3L + +#define SN_ad_dvcs "AD_DVCS" +#define LN_ad_dvcs "ad dvcs" +#define NID_ad_dvcs 364 +#define OBJ_ad_dvcs OBJ_id_ad,4L + +#define SN_caRepository "caRepository" +#define LN_caRepository "CA Repository" +#define NID_caRepository 785 +#define OBJ_caRepository OBJ_id_ad,5L + +#define OBJ_id_pkix_OCSP OBJ_ad_OCSP + +#define SN_id_pkix_OCSP_basic "basicOCSPResponse" +#define LN_id_pkix_OCSP_basic "Basic OCSP Response" +#define NID_id_pkix_OCSP_basic 365 +#define OBJ_id_pkix_OCSP_basic OBJ_id_pkix_OCSP,1L + +#define SN_id_pkix_OCSP_Nonce "Nonce" +#define LN_id_pkix_OCSP_Nonce "OCSP Nonce" +#define NID_id_pkix_OCSP_Nonce 366 +#define OBJ_id_pkix_OCSP_Nonce OBJ_id_pkix_OCSP,2L + +#define SN_id_pkix_OCSP_CrlID "CrlID" +#define LN_id_pkix_OCSP_CrlID "OCSP CRL ID" +#define NID_id_pkix_OCSP_CrlID 367 +#define OBJ_id_pkix_OCSP_CrlID OBJ_id_pkix_OCSP,3L + +#define SN_id_pkix_OCSP_acceptableResponses "acceptableResponses" +#define LN_id_pkix_OCSP_acceptableResponses "Acceptable OCSP Responses" +#define NID_id_pkix_OCSP_acceptableResponses 368 +#define OBJ_id_pkix_OCSP_acceptableResponses OBJ_id_pkix_OCSP,4L + +#define SN_id_pkix_OCSP_noCheck "noCheck" +#define LN_id_pkix_OCSP_noCheck "OCSP No Check" +#define NID_id_pkix_OCSP_noCheck 369 +#define OBJ_id_pkix_OCSP_noCheck OBJ_id_pkix_OCSP,5L + +#define SN_id_pkix_OCSP_archiveCutoff "archiveCutoff" +#define LN_id_pkix_OCSP_archiveCutoff "OCSP Archive Cutoff" +#define NID_id_pkix_OCSP_archiveCutoff 370 +#define OBJ_id_pkix_OCSP_archiveCutoff OBJ_id_pkix_OCSP,6L + +#define SN_id_pkix_OCSP_serviceLocator "serviceLocator" +#define LN_id_pkix_OCSP_serviceLocator "OCSP Service Locator" +#define NID_id_pkix_OCSP_serviceLocator 371 +#define OBJ_id_pkix_OCSP_serviceLocator OBJ_id_pkix_OCSP,7L + +#define SN_id_pkix_OCSP_extendedStatus "extendedStatus" +#define LN_id_pkix_OCSP_extendedStatus "Extended OCSP Status" +#define NID_id_pkix_OCSP_extendedStatus 372 +#define OBJ_id_pkix_OCSP_extendedStatus OBJ_id_pkix_OCSP,8L + +#define SN_id_pkix_OCSP_valid "valid" +#define NID_id_pkix_OCSP_valid 373 +#define OBJ_id_pkix_OCSP_valid OBJ_id_pkix_OCSP,9L + +#define SN_id_pkix_OCSP_path "path" +#define NID_id_pkix_OCSP_path 374 +#define OBJ_id_pkix_OCSP_path OBJ_id_pkix_OCSP,10L + +#define SN_id_pkix_OCSP_trustRoot "trustRoot" +#define LN_id_pkix_OCSP_trustRoot "Trust Root" +#define NID_id_pkix_OCSP_trustRoot 375 +#define OBJ_id_pkix_OCSP_trustRoot OBJ_id_pkix_OCSP,11L + +#define SN_algorithm "algorithm" +#define LN_algorithm "algorithm" +#define NID_algorithm 376 +#define OBJ_algorithm 1L,3L,14L,3L,2L + +#define SN_md5WithRSA "RSA-NP-MD5" +#define LN_md5WithRSA "md5WithRSA" +#define NID_md5WithRSA 104 +#define OBJ_md5WithRSA OBJ_algorithm,3L + +#define SN_des_ecb "DES-ECB" +#define LN_des_ecb "des-ecb" +#define NID_des_ecb 29 +#define OBJ_des_ecb OBJ_algorithm,6L + +#define SN_des_cbc "DES-CBC" +#define LN_des_cbc "des-cbc" +#define NID_des_cbc 31 +#define OBJ_des_cbc OBJ_algorithm,7L + +#define SN_des_ofb64 "DES-OFB" +#define LN_des_ofb64 "des-ofb" +#define NID_des_ofb64 45 +#define OBJ_des_ofb64 OBJ_algorithm,8L + +#define SN_des_cfb64 "DES-CFB" +#define LN_des_cfb64 "des-cfb" +#define NID_des_cfb64 30 +#define OBJ_des_cfb64 OBJ_algorithm,9L + +#define SN_rsaSignature "rsaSignature" +#define NID_rsaSignature 377 +#define OBJ_rsaSignature OBJ_algorithm,11L + +#define SN_dsa_2 "DSA-old" +#define LN_dsa_2 "dsaEncryption-old" +#define NID_dsa_2 67 +#define OBJ_dsa_2 OBJ_algorithm,12L + +#define SN_dsaWithSHA "DSA-SHA" +#define LN_dsaWithSHA "dsaWithSHA" +#define NID_dsaWithSHA 66 +#define OBJ_dsaWithSHA OBJ_algorithm,13L + +#define SN_shaWithRSAEncryption "RSA-SHA" +#define LN_shaWithRSAEncryption "shaWithRSAEncryption" +#define NID_shaWithRSAEncryption 42 +#define OBJ_shaWithRSAEncryption OBJ_algorithm,15L + +#define SN_des_ede_ecb "DES-EDE" +#define LN_des_ede_ecb "des-ede" +#define NID_des_ede_ecb 32 +#define OBJ_des_ede_ecb OBJ_algorithm,17L + +#define SN_des_ede3_ecb "DES-EDE3" +#define LN_des_ede3_ecb "des-ede3" +#define NID_des_ede3_ecb 33 + +#define SN_des_ede_cbc "DES-EDE-CBC" +#define LN_des_ede_cbc "des-ede-cbc" +#define NID_des_ede_cbc 43 + +#define SN_des_ede_cfb64 "DES-EDE-CFB" +#define LN_des_ede_cfb64 "des-ede-cfb" +#define NID_des_ede_cfb64 60 + +#define SN_des_ede3_cfb64 "DES-EDE3-CFB" +#define LN_des_ede3_cfb64 "des-ede3-cfb" +#define NID_des_ede3_cfb64 61 + +#define SN_des_ede_ofb64 "DES-EDE-OFB" +#define LN_des_ede_ofb64 "des-ede-ofb" +#define NID_des_ede_ofb64 62 + +#define SN_des_ede3_ofb64 "DES-EDE3-OFB" +#define LN_des_ede3_ofb64 "des-ede3-ofb" +#define NID_des_ede3_ofb64 63 + +#define SN_desx_cbc "DESX-CBC" +#define LN_desx_cbc "desx-cbc" +#define NID_desx_cbc 80 + +#define SN_sha "SHA" +#define LN_sha "sha" +#define NID_sha 41 +#define OBJ_sha OBJ_algorithm,18L + +#define SN_sha1 "SHA1" +#define LN_sha1 "sha1" +#define NID_sha1 64 +#define OBJ_sha1 OBJ_algorithm,26L + +#define SN_dsaWithSHA1_2 "DSA-SHA1-old" +#define LN_dsaWithSHA1_2 "dsaWithSHA1-old" +#define NID_dsaWithSHA1_2 70 +#define OBJ_dsaWithSHA1_2 OBJ_algorithm,27L + +#define SN_sha1WithRSA "RSA-SHA1-2" +#define LN_sha1WithRSA "sha1WithRSA" +#define NID_sha1WithRSA 115 +#define OBJ_sha1WithRSA OBJ_algorithm,29L + +#define SN_ripemd160 "RIPEMD160" +#define LN_ripemd160 "ripemd160" +#define NID_ripemd160 117 +#define OBJ_ripemd160 1L,3L,36L,3L,2L,1L + +#define SN_ripemd160WithRSA "RSA-RIPEMD160" +#define LN_ripemd160WithRSA "ripemd160WithRSA" +#define NID_ripemd160WithRSA 119 +#define OBJ_ripemd160WithRSA 1L,3L,36L,3L,3L,1L,2L + +#define SN_sxnet "SXNetID" +#define LN_sxnet "Strong Extranet ID" +#define NID_sxnet 143 +#define OBJ_sxnet 1L,3L,101L,1L,4L,1L + +#define SN_X500 "X500" +#define LN_X500 "directory services (X.500)" +#define NID_X500 11 +#define OBJ_X500 2L,5L + +#define SN_X509 "X509" +#define NID_X509 12 +#define OBJ_X509 OBJ_X500,4L + +#define SN_commonName "CN" +#define LN_commonName "commonName" +#define NID_commonName 13 +#define OBJ_commonName OBJ_X509,3L + +#define SN_surname "SN" +#define LN_surname "surname" +#define NID_surname 100 +#define OBJ_surname OBJ_X509,4L + +#define LN_serialNumber "serialNumber" +#define NID_serialNumber 105 +#define OBJ_serialNumber OBJ_X509,5L + +#define SN_countryName "C" +#define LN_countryName "countryName" +#define NID_countryName 14 +#define OBJ_countryName OBJ_X509,6L + +#define SN_localityName "L" +#define LN_localityName "localityName" +#define NID_localityName 15 +#define OBJ_localityName OBJ_X509,7L + +#define SN_stateOrProvinceName "ST" +#define LN_stateOrProvinceName "stateOrProvinceName" +#define NID_stateOrProvinceName 16 +#define OBJ_stateOrProvinceName OBJ_X509,8L + +#define SN_streetAddress "street" +#define LN_streetAddress "streetAddress" +#define NID_streetAddress 660 +#define OBJ_streetAddress OBJ_X509,9L + +#define SN_organizationName "O" +#define LN_organizationName "organizationName" +#define NID_organizationName 17 +#define OBJ_organizationName OBJ_X509,10L + +#define SN_organizationalUnitName "OU" +#define LN_organizationalUnitName "organizationalUnitName" +#define NID_organizationalUnitName 18 +#define OBJ_organizationalUnitName OBJ_X509,11L + +#define SN_title "title" +#define LN_title "title" +#define NID_title 106 +#define OBJ_title OBJ_X509,12L + +#define LN_description "description" +#define NID_description 107 +#define OBJ_description OBJ_X509,13L + +#define LN_searchGuide "searchGuide" +#define NID_searchGuide 859 +#define OBJ_searchGuide OBJ_X509,14L + +#define LN_businessCategory "businessCategory" +#define NID_businessCategory 860 +#define OBJ_businessCategory OBJ_X509,15L + +#define LN_postalAddress "postalAddress" +#define NID_postalAddress 861 +#define OBJ_postalAddress OBJ_X509,16L + +#define LN_postalCode "postalCode" +#define NID_postalCode 661 +#define OBJ_postalCode OBJ_X509,17L + +#define LN_postOfficeBox "postOfficeBox" +#define NID_postOfficeBox 862 +#define OBJ_postOfficeBox OBJ_X509,18L + +#define LN_physicalDeliveryOfficeName "physicalDeliveryOfficeName" +#define NID_physicalDeliveryOfficeName 863 +#define OBJ_physicalDeliveryOfficeName OBJ_X509,19L + +#define LN_telephoneNumber "telephoneNumber" +#define NID_telephoneNumber 864 +#define OBJ_telephoneNumber OBJ_X509,20L + +#define LN_telexNumber "telexNumber" +#define NID_telexNumber 865 +#define OBJ_telexNumber OBJ_X509,21L + +#define LN_teletexTerminalIdentifier "teletexTerminalIdentifier" +#define NID_teletexTerminalIdentifier 866 +#define OBJ_teletexTerminalIdentifier OBJ_X509,22L + +#define LN_facsimileTelephoneNumber "facsimileTelephoneNumber" +#define NID_facsimileTelephoneNumber 867 +#define OBJ_facsimileTelephoneNumber OBJ_X509,23L + +#define LN_x121Address "x121Address" +#define NID_x121Address 868 +#define OBJ_x121Address OBJ_X509,24L + +#define LN_internationaliSDNNumber "internationaliSDNNumber" +#define NID_internationaliSDNNumber 869 +#define OBJ_internationaliSDNNumber OBJ_X509,25L + +#define LN_registeredAddress "registeredAddress" +#define NID_registeredAddress 870 +#define OBJ_registeredAddress OBJ_X509,26L + +#define LN_destinationIndicator "destinationIndicator" +#define NID_destinationIndicator 871 +#define OBJ_destinationIndicator OBJ_X509,27L + +#define LN_preferredDeliveryMethod "preferredDeliveryMethod" +#define NID_preferredDeliveryMethod 872 +#define OBJ_preferredDeliveryMethod OBJ_X509,28L + +#define LN_presentationAddress "presentationAddress" +#define NID_presentationAddress 873 +#define OBJ_presentationAddress OBJ_X509,29L + +#define LN_supportedApplicationContext "supportedApplicationContext" +#define NID_supportedApplicationContext 874 +#define OBJ_supportedApplicationContext OBJ_X509,30L + +#define SN_member "member" +#define NID_member 875 +#define OBJ_member OBJ_X509,31L + +#define SN_owner "owner" +#define NID_owner 876 +#define OBJ_owner OBJ_X509,32L + +#define LN_roleOccupant "roleOccupant" +#define NID_roleOccupant 877 +#define OBJ_roleOccupant OBJ_X509,33L + +#define SN_seeAlso "seeAlso" +#define NID_seeAlso 878 +#define OBJ_seeAlso OBJ_X509,34L + +#define LN_userPassword "userPassword" +#define NID_userPassword 879 +#define OBJ_userPassword OBJ_X509,35L + +#define LN_userCertificate "userCertificate" +#define NID_userCertificate 880 +#define OBJ_userCertificate OBJ_X509,36L + +#define LN_cACertificate "cACertificate" +#define NID_cACertificate 881 +#define OBJ_cACertificate OBJ_X509,37L + +#define LN_authorityRevocationList "authorityRevocationList" +#define NID_authorityRevocationList 882 +#define OBJ_authorityRevocationList OBJ_X509,38L + +#define LN_certificateRevocationList "certificateRevocationList" +#define NID_certificateRevocationList 883 +#define OBJ_certificateRevocationList OBJ_X509,39L + +#define LN_crossCertificatePair "crossCertificatePair" +#define NID_crossCertificatePair 884 +#define OBJ_crossCertificatePair OBJ_X509,40L + +#define SN_name "name" +#define LN_name "name" +#define NID_name 173 +#define OBJ_name OBJ_X509,41L + +#define SN_givenName "GN" +#define LN_givenName "givenName" +#define NID_givenName 99 +#define OBJ_givenName OBJ_X509,42L + +#define SN_initials "initials" +#define LN_initials "initials" +#define NID_initials 101 +#define OBJ_initials OBJ_X509,43L + +#define LN_generationQualifier "generationQualifier" +#define NID_generationQualifier 509 +#define OBJ_generationQualifier OBJ_X509,44L + +#define LN_x500UniqueIdentifier "x500UniqueIdentifier" +#define NID_x500UniqueIdentifier 503 +#define OBJ_x500UniqueIdentifier OBJ_X509,45L + +#define SN_dnQualifier "dnQualifier" +#define LN_dnQualifier "dnQualifier" +#define NID_dnQualifier 174 +#define OBJ_dnQualifier OBJ_X509,46L + +#define LN_enhancedSearchGuide "enhancedSearchGuide" +#define NID_enhancedSearchGuide 885 +#define OBJ_enhancedSearchGuide OBJ_X509,47L + +#define LN_protocolInformation "protocolInformation" +#define NID_protocolInformation 886 +#define OBJ_protocolInformation OBJ_X509,48L + +#define LN_distinguishedName "distinguishedName" +#define NID_distinguishedName 887 +#define OBJ_distinguishedName OBJ_X509,49L + +#define LN_uniqueMember "uniqueMember" +#define NID_uniqueMember 888 +#define OBJ_uniqueMember OBJ_X509,50L + +#define LN_houseIdentifier "houseIdentifier" +#define NID_houseIdentifier 889 +#define OBJ_houseIdentifier OBJ_X509,51L + +#define LN_supportedAlgorithms "supportedAlgorithms" +#define NID_supportedAlgorithms 890 +#define OBJ_supportedAlgorithms OBJ_X509,52L + +#define LN_deltaRevocationList "deltaRevocationList" +#define NID_deltaRevocationList 891 +#define OBJ_deltaRevocationList OBJ_X509,53L + +#define SN_dmdName "dmdName" +#define NID_dmdName 892 +#define OBJ_dmdName OBJ_X509,54L + +#define LN_pseudonym "pseudonym" +#define NID_pseudonym 510 +#define OBJ_pseudonym OBJ_X509,65L + +#define SN_role "role" +#define LN_role "role" +#define NID_role 400 +#define OBJ_role OBJ_X509,72L + +#define SN_X500algorithms "X500algorithms" +#define LN_X500algorithms "directory services - algorithms" +#define NID_X500algorithms 378 +#define OBJ_X500algorithms OBJ_X500,8L + +#define SN_rsa "RSA" +#define LN_rsa "rsa" +#define NID_rsa 19 +#define OBJ_rsa OBJ_X500algorithms,1L,1L + +#define SN_mdc2WithRSA "RSA-MDC2" +#define LN_mdc2WithRSA "mdc2WithRSA" +#define NID_mdc2WithRSA 96 +#define OBJ_mdc2WithRSA OBJ_X500algorithms,3L,100L + +#define SN_mdc2 "MDC2" +#define LN_mdc2 "mdc2" +#define NID_mdc2 95 +#define OBJ_mdc2 OBJ_X500algorithms,3L,101L + +#define SN_id_ce "id-ce" +#define NID_id_ce 81 +#define OBJ_id_ce OBJ_X500,29L + +#define SN_subject_directory_attributes "subjectDirectoryAttributes" +#define LN_subject_directory_attributes "X509v3 Subject Directory Attributes" +#define NID_subject_directory_attributes 769 +#define OBJ_subject_directory_attributes OBJ_id_ce,9L + +#define SN_subject_key_identifier "subjectKeyIdentifier" +#define LN_subject_key_identifier "X509v3 Subject Key Identifier" +#define NID_subject_key_identifier 82 +#define OBJ_subject_key_identifier OBJ_id_ce,14L + +#define SN_key_usage "keyUsage" +#define LN_key_usage "X509v3 Key Usage" +#define NID_key_usage 83 +#define OBJ_key_usage OBJ_id_ce,15L + +#define SN_private_key_usage_period "privateKeyUsagePeriod" +#define LN_private_key_usage_period "X509v3 Private Key Usage Period" +#define NID_private_key_usage_period 84 +#define OBJ_private_key_usage_period OBJ_id_ce,16L + +#define SN_subject_alt_name "subjectAltName" +#define LN_subject_alt_name "X509v3 Subject Alternative Name" +#define NID_subject_alt_name 85 +#define OBJ_subject_alt_name OBJ_id_ce,17L + +#define SN_issuer_alt_name "issuerAltName" +#define LN_issuer_alt_name "X509v3 Issuer Alternative Name" +#define NID_issuer_alt_name 86 +#define OBJ_issuer_alt_name OBJ_id_ce,18L + +#define SN_basic_constraints "basicConstraints" +#define LN_basic_constraints "X509v3 Basic Constraints" +#define NID_basic_constraints 87 +#define OBJ_basic_constraints OBJ_id_ce,19L + +#define SN_crl_number "crlNumber" +#define LN_crl_number "X509v3 CRL Number" +#define NID_crl_number 88 +#define OBJ_crl_number OBJ_id_ce,20L + +#define SN_crl_reason "CRLReason" +#define LN_crl_reason "X509v3 CRL Reason Code" +#define NID_crl_reason 141 +#define OBJ_crl_reason OBJ_id_ce,21L + +#define SN_invalidity_date "invalidityDate" +#define LN_invalidity_date "Invalidity Date" +#define NID_invalidity_date 142 +#define OBJ_invalidity_date OBJ_id_ce,24L + +#define SN_delta_crl "deltaCRL" +#define LN_delta_crl "X509v3 Delta CRL Indicator" +#define NID_delta_crl 140 +#define OBJ_delta_crl OBJ_id_ce,27L + +#define SN_issuing_distribution_point "issuingDistributionPoint" +#define LN_issuing_distribution_point "X509v3 Issuing Distrubution Point" +#define NID_issuing_distribution_point 770 +#define OBJ_issuing_distribution_point OBJ_id_ce,28L + +#define SN_certificate_issuer "certificateIssuer" +#define LN_certificate_issuer "X509v3 Certificate Issuer" +#define NID_certificate_issuer 771 +#define OBJ_certificate_issuer OBJ_id_ce,29L + +#define SN_name_constraints "nameConstraints" +#define LN_name_constraints "X509v3 Name Constraints" +#define NID_name_constraints 666 +#define OBJ_name_constraints OBJ_id_ce,30L + +#define SN_crl_distribution_points "crlDistributionPoints" +#define LN_crl_distribution_points "X509v3 CRL Distribution Points" +#define NID_crl_distribution_points 103 +#define OBJ_crl_distribution_points OBJ_id_ce,31L + +#define SN_certificate_policies "certificatePolicies" +#define LN_certificate_policies "X509v3 Certificate Policies" +#define NID_certificate_policies 89 +#define OBJ_certificate_policies OBJ_id_ce,32L + +#define SN_any_policy "anyPolicy" +#define LN_any_policy "X509v3 Any Policy" +#define NID_any_policy 746 +#define OBJ_any_policy OBJ_certificate_policies,0L + +#define SN_policy_mappings "policyMappings" +#define LN_policy_mappings "X509v3 Policy Mappings" +#define NID_policy_mappings 747 +#define OBJ_policy_mappings OBJ_id_ce,33L + +#define SN_authority_key_identifier "authorityKeyIdentifier" +#define LN_authority_key_identifier "X509v3 Authority Key Identifier" +#define NID_authority_key_identifier 90 +#define OBJ_authority_key_identifier OBJ_id_ce,35L + +#define SN_policy_constraints "policyConstraints" +#define LN_policy_constraints "X509v3 Policy Constraints" +#define NID_policy_constraints 401 +#define OBJ_policy_constraints OBJ_id_ce,36L + +#define SN_ext_key_usage "extendedKeyUsage" +#define LN_ext_key_usage "X509v3 Extended Key Usage" +#define NID_ext_key_usage 126 +#define OBJ_ext_key_usage OBJ_id_ce,37L + +#define SN_freshest_crl "freshestCRL" +#define LN_freshest_crl "X509v3 Freshest CRL" +#define NID_freshest_crl 857 +#define OBJ_freshest_crl OBJ_id_ce,46L + +#define SN_inhibit_any_policy "inhibitAnyPolicy" +#define LN_inhibit_any_policy "X509v3 Inhibit Any Policy" +#define NID_inhibit_any_policy 748 +#define OBJ_inhibit_any_policy OBJ_id_ce,54L + +#define SN_target_information "targetInformation" +#define LN_target_information "X509v3 AC Targeting" +#define NID_target_information 402 +#define OBJ_target_information OBJ_id_ce,55L + +#define SN_no_rev_avail "noRevAvail" +#define LN_no_rev_avail "X509v3 No Revocation Available" +#define NID_no_rev_avail 403 +#define OBJ_no_rev_avail OBJ_id_ce,56L + +#define SN_anyExtendedKeyUsage "anyExtendedKeyUsage" +#define LN_anyExtendedKeyUsage "Any Extended Key Usage" +#define NID_anyExtendedKeyUsage 910 +#define OBJ_anyExtendedKeyUsage OBJ_ext_key_usage,0L + +#define SN_netscape "Netscape" +#define LN_netscape "Netscape Communications Corp." +#define NID_netscape 57 +#define OBJ_netscape 2L,16L,840L,1L,113730L + +#define SN_netscape_cert_extension "nsCertExt" +#define LN_netscape_cert_extension "Netscape Certificate Extension" +#define NID_netscape_cert_extension 58 +#define OBJ_netscape_cert_extension OBJ_netscape,1L + +#define SN_netscape_data_type "nsDataType" +#define LN_netscape_data_type "Netscape Data Type" +#define NID_netscape_data_type 59 +#define OBJ_netscape_data_type OBJ_netscape,2L + +#define SN_netscape_cert_type "nsCertType" +#define LN_netscape_cert_type "Netscape Cert Type" +#define NID_netscape_cert_type 71 +#define OBJ_netscape_cert_type OBJ_netscape_cert_extension,1L + +#define SN_netscape_base_url "nsBaseUrl" +#define LN_netscape_base_url "Netscape Base Url" +#define NID_netscape_base_url 72 +#define OBJ_netscape_base_url OBJ_netscape_cert_extension,2L + +#define SN_netscape_revocation_url "nsRevocationUrl" +#define LN_netscape_revocation_url "Netscape Revocation Url" +#define NID_netscape_revocation_url 73 +#define OBJ_netscape_revocation_url OBJ_netscape_cert_extension,3L + +#define SN_netscape_ca_revocation_url "nsCaRevocationUrl" +#define LN_netscape_ca_revocation_url "Netscape CA Revocation Url" +#define NID_netscape_ca_revocation_url 74 +#define OBJ_netscape_ca_revocation_url OBJ_netscape_cert_extension,4L + +#define SN_netscape_renewal_url "nsRenewalUrl" +#define LN_netscape_renewal_url "Netscape Renewal Url" +#define NID_netscape_renewal_url 75 +#define OBJ_netscape_renewal_url OBJ_netscape_cert_extension,7L + +#define SN_netscape_ca_policy_url "nsCaPolicyUrl" +#define LN_netscape_ca_policy_url "Netscape CA Policy Url" +#define NID_netscape_ca_policy_url 76 +#define OBJ_netscape_ca_policy_url OBJ_netscape_cert_extension,8L + +#define SN_netscape_ssl_server_name "nsSslServerName" +#define LN_netscape_ssl_server_name "Netscape SSL Server Name" +#define NID_netscape_ssl_server_name 77 +#define OBJ_netscape_ssl_server_name OBJ_netscape_cert_extension,12L + +#define SN_netscape_comment "nsComment" +#define LN_netscape_comment "Netscape Comment" +#define NID_netscape_comment 78 +#define OBJ_netscape_comment OBJ_netscape_cert_extension,13L + +#define SN_netscape_cert_sequence "nsCertSequence" +#define LN_netscape_cert_sequence "Netscape Certificate Sequence" +#define NID_netscape_cert_sequence 79 +#define OBJ_netscape_cert_sequence OBJ_netscape_data_type,5L + +#define SN_ns_sgc "nsSGC" +#define LN_ns_sgc "Netscape Server Gated Crypto" +#define NID_ns_sgc 139 +#define OBJ_ns_sgc OBJ_netscape,4L,1L + +#define SN_org "ORG" +#define LN_org "org" +#define NID_org 379 +#define OBJ_org OBJ_iso,3L + +#define SN_dod "DOD" +#define LN_dod "dod" +#define NID_dod 380 +#define OBJ_dod OBJ_org,6L + +#define SN_iana "IANA" +#define LN_iana "iana" +#define NID_iana 381 +#define OBJ_iana OBJ_dod,1L + +#define OBJ_internet OBJ_iana + +#define SN_Directory "directory" +#define LN_Directory "Directory" +#define NID_Directory 382 +#define OBJ_Directory OBJ_internet,1L + +#define SN_Management "mgmt" +#define LN_Management "Management" +#define NID_Management 383 +#define OBJ_Management OBJ_internet,2L + +#define SN_Experimental "experimental" +#define LN_Experimental "Experimental" +#define NID_Experimental 384 +#define OBJ_Experimental OBJ_internet,3L + +#define SN_Private "private" +#define LN_Private "Private" +#define NID_Private 385 +#define OBJ_Private OBJ_internet,4L + +#define SN_Security "security" +#define LN_Security "Security" +#define NID_Security 386 +#define OBJ_Security OBJ_internet,5L + +#define SN_SNMPv2 "snmpv2" +#define LN_SNMPv2 "SNMPv2" +#define NID_SNMPv2 387 +#define OBJ_SNMPv2 OBJ_internet,6L + +#define LN_Mail "Mail" +#define NID_Mail 388 +#define OBJ_Mail OBJ_internet,7L + +#define SN_Enterprises "enterprises" +#define LN_Enterprises "Enterprises" +#define NID_Enterprises 389 +#define OBJ_Enterprises OBJ_Private,1L + +#define SN_dcObject "dcobject" +#define LN_dcObject "dcObject" +#define NID_dcObject 390 +#define OBJ_dcObject OBJ_Enterprises,1466L,344L + +#define SN_mime_mhs "mime-mhs" +#define LN_mime_mhs "MIME MHS" +#define NID_mime_mhs 504 +#define OBJ_mime_mhs OBJ_Mail,1L + +#define SN_mime_mhs_headings "mime-mhs-headings" +#define LN_mime_mhs_headings "mime-mhs-headings" +#define NID_mime_mhs_headings 505 +#define OBJ_mime_mhs_headings OBJ_mime_mhs,1L + +#define SN_mime_mhs_bodies "mime-mhs-bodies" +#define LN_mime_mhs_bodies "mime-mhs-bodies" +#define NID_mime_mhs_bodies 506 +#define OBJ_mime_mhs_bodies OBJ_mime_mhs,2L + +#define SN_id_hex_partial_message "id-hex-partial-message" +#define LN_id_hex_partial_message "id-hex-partial-message" +#define NID_id_hex_partial_message 507 +#define OBJ_id_hex_partial_message OBJ_mime_mhs_headings,1L + +#define SN_id_hex_multipart_message "id-hex-multipart-message" +#define LN_id_hex_multipart_message "id-hex-multipart-message" +#define NID_id_hex_multipart_message 508 +#define OBJ_id_hex_multipart_message OBJ_mime_mhs_headings,2L + +#define SN_rle_compression "RLE" +#define LN_rle_compression "run length compression" +#define NID_rle_compression 124 +#define OBJ_rle_compression 1L,1L,1L,1L,666L,1L + +#define SN_zlib_compression "ZLIB" +#define LN_zlib_compression "zlib compression" +#define NID_zlib_compression 125 +#define OBJ_zlib_compression OBJ_id_smime_alg,8L + +#define OBJ_csor 2L,16L,840L,1L,101L,3L + +#define OBJ_nistAlgorithms OBJ_csor,4L + +#define OBJ_aes OBJ_nistAlgorithms,1L + +#define SN_aes_128_ecb "AES-128-ECB" +#define LN_aes_128_ecb "aes-128-ecb" +#define NID_aes_128_ecb 418 +#define OBJ_aes_128_ecb OBJ_aes,1L + +#define SN_aes_128_cbc "AES-128-CBC" +#define LN_aes_128_cbc "aes-128-cbc" +#define NID_aes_128_cbc 419 +#define OBJ_aes_128_cbc OBJ_aes,2L + +#define SN_aes_128_ofb128 "AES-128-OFB" +#define LN_aes_128_ofb128 "aes-128-ofb" +#define NID_aes_128_ofb128 420 +#define OBJ_aes_128_ofb128 OBJ_aes,3L + +#define SN_aes_128_cfb128 "AES-128-CFB" +#define LN_aes_128_cfb128 "aes-128-cfb" +#define NID_aes_128_cfb128 421 +#define OBJ_aes_128_cfb128 OBJ_aes,4L + +#define SN_id_aes128_wrap "id-aes128-wrap" +#define NID_id_aes128_wrap 788 +#define OBJ_id_aes128_wrap OBJ_aes,5L + +#define SN_aes_128_gcm "id-aes128-GCM" +#define LN_aes_128_gcm "aes-128-gcm" +#define NID_aes_128_gcm 895 +#define OBJ_aes_128_gcm OBJ_aes,6L + +#define SN_aes_128_ccm "id-aes128-CCM" +#define LN_aes_128_ccm "aes-128-ccm" +#define NID_aes_128_ccm 896 +#define OBJ_aes_128_ccm OBJ_aes,7L + +#define SN_id_aes128_wrap_pad "id-aes128-wrap-pad" +#define NID_id_aes128_wrap_pad 897 +#define OBJ_id_aes128_wrap_pad OBJ_aes,8L + +#define SN_aes_192_ecb "AES-192-ECB" +#define LN_aes_192_ecb "aes-192-ecb" +#define NID_aes_192_ecb 422 +#define OBJ_aes_192_ecb OBJ_aes,21L + +#define SN_aes_192_cbc "AES-192-CBC" +#define LN_aes_192_cbc "aes-192-cbc" +#define NID_aes_192_cbc 423 +#define OBJ_aes_192_cbc OBJ_aes,22L + +#define SN_aes_192_ofb128 "AES-192-OFB" +#define LN_aes_192_ofb128 "aes-192-ofb" +#define NID_aes_192_ofb128 424 +#define OBJ_aes_192_ofb128 OBJ_aes,23L + +#define SN_aes_192_cfb128 "AES-192-CFB" +#define LN_aes_192_cfb128 "aes-192-cfb" +#define NID_aes_192_cfb128 425 +#define OBJ_aes_192_cfb128 OBJ_aes,24L + +#define SN_id_aes192_wrap "id-aes192-wrap" +#define NID_id_aes192_wrap 789 +#define OBJ_id_aes192_wrap OBJ_aes,25L + +#define SN_aes_192_gcm "id-aes192-GCM" +#define LN_aes_192_gcm "aes-192-gcm" +#define NID_aes_192_gcm 898 +#define OBJ_aes_192_gcm OBJ_aes,26L + +#define SN_aes_192_ccm "id-aes192-CCM" +#define LN_aes_192_ccm "aes-192-ccm" +#define NID_aes_192_ccm 899 +#define OBJ_aes_192_ccm OBJ_aes,27L + +#define SN_id_aes192_wrap_pad "id-aes192-wrap-pad" +#define NID_id_aes192_wrap_pad 900 +#define OBJ_id_aes192_wrap_pad OBJ_aes,28L + +#define SN_aes_256_ecb "AES-256-ECB" +#define LN_aes_256_ecb "aes-256-ecb" +#define NID_aes_256_ecb 426 +#define OBJ_aes_256_ecb OBJ_aes,41L + +#define SN_aes_256_cbc "AES-256-CBC" +#define LN_aes_256_cbc "aes-256-cbc" +#define NID_aes_256_cbc 427 +#define OBJ_aes_256_cbc OBJ_aes,42L + +#define SN_aes_256_ofb128 "AES-256-OFB" +#define LN_aes_256_ofb128 "aes-256-ofb" +#define NID_aes_256_ofb128 428 +#define OBJ_aes_256_ofb128 OBJ_aes,43L + +#define SN_aes_256_cfb128 "AES-256-CFB" +#define LN_aes_256_cfb128 "aes-256-cfb" +#define NID_aes_256_cfb128 429 +#define OBJ_aes_256_cfb128 OBJ_aes,44L + +#define SN_id_aes256_wrap "id-aes256-wrap" +#define NID_id_aes256_wrap 790 +#define OBJ_id_aes256_wrap OBJ_aes,45L + +#define SN_aes_256_gcm "id-aes256-GCM" +#define LN_aes_256_gcm "aes-256-gcm" +#define NID_aes_256_gcm 901 +#define OBJ_aes_256_gcm OBJ_aes,46L + +#define SN_aes_256_ccm "id-aes256-CCM" +#define LN_aes_256_ccm "aes-256-ccm" +#define NID_aes_256_ccm 902 +#define OBJ_aes_256_ccm OBJ_aes,47L + +#define SN_id_aes256_wrap_pad "id-aes256-wrap-pad" +#define NID_id_aes256_wrap_pad 903 +#define OBJ_id_aes256_wrap_pad OBJ_aes,48L + +#define SN_aes_128_cfb1 "AES-128-CFB1" +#define LN_aes_128_cfb1 "aes-128-cfb1" +#define NID_aes_128_cfb1 650 + +#define SN_aes_192_cfb1 "AES-192-CFB1" +#define LN_aes_192_cfb1 "aes-192-cfb1" +#define NID_aes_192_cfb1 651 + +#define SN_aes_256_cfb1 "AES-256-CFB1" +#define LN_aes_256_cfb1 "aes-256-cfb1" +#define NID_aes_256_cfb1 652 + +#define SN_aes_128_cfb8 "AES-128-CFB8" +#define LN_aes_128_cfb8 "aes-128-cfb8" +#define NID_aes_128_cfb8 653 + +#define SN_aes_192_cfb8 "AES-192-CFB8" +#define LN_aes_192_cfb8 "aes-192-cfb8" +#define NID_aes_192_cfb8 654 + +#define SN_aes_256_cfb8 "AES-256-CFB8" +#define LN_aes_256_cfb8 "aes-256-cfb8" +#define NID_aes_256_cfb8 655 + +#define SN_aes_128_ctr "AES-128-CTR" +#define LN_aes_128_ctr "aes-128-ctr" +#define NID_aes_128_ctr 904 + +#define SN_aes_192_ctr "AES-192-CTR" +#define LN_aes_192_ctr "aes-192-ctr" +#define NID_aes_192_ctr 905 + +#define SN_aes_256_ctr "AES-256-CTR" +#define LN_aes_256_ctr "aes-256-ctr" +#define NID_aes_256_ctr 906 + +#define SN_aes_128_xts "AES-128-XTS" +#define LN_aes_128_xts "aes-128-xts" +#define NID_aes_128_xts 913 + +#define SN_aes_256_xts "AES-256-XTS" +#define LN_aes_256_xts "aes-256-xts" +#define NID_aes_256_xts 914 + +#define SN_des_cfb1 "DES-CFB1" +#define LN_des_cfb1 "des-cfb1" +#define NID_des_cfb1 656 + +#define SN_des_cfb8 "DES-CFB8" +#define LN_des_cfb8 "des-cfb8" +#define NID_des_cfb8 657 + +#define SN_des_ede3_cfb1 "DES-EDE3-CFB1" +#define LN_des_ede3_cfb1 "des-ede3-cfb1" +#define NID_des_ede3_cfb1 658 + +#define SN_des_ede3_cfb8 "DES-EDE3-CFB8" +#define LN_des_ede3_cfb8 "des-ede3-cfb8" +#define NID_des_ede3_cfb8 659 + +#define OBJ_nist_hashalgs OBJ_nistAlgorithms,2L + +#define SN_sha256 "SHA256" +#define LN_sha256 "sha256" +#define NID_sha256 672 +#define OBJ_sha256 OBJ_nist_hashalgs,1L + +#define SN_sha384 "SHA384" +#define LN_sha384 "sha384" +#define NID_sha384 673 +#define OBJ_sha384 OBJ_nist_hashalgs,2L + +#define SN_sha512 "SHA512" +#define LN_sha512 "sha512" +#define NID_sha512 674 +#define OBJ_sha512 OBJ_nist_hashalgs,3L + +#define SN_sha224 "SHA224" +#define LN_sha224 "sha224" +#define NID_sha224 675 +#define OBJ_sha224 OBJ_nist_hashalgs,4L + +#define OBJ_dsa_with_sha2 OBJ_nistAlgorithms,3L + +#define SN_dsa_with_SHA224 "dsa_with_SHA224" +#define NID_dsa_with_SHA224 802 +#define OBJ_dsa_with_SHA224 OBJ_dsa_with_sha2,1L + +#define SN_dsa_with_SHA256 "dsa_with_SHA256" +#define NID_dsa_with_SHA256 803 +#define OBJ_dsa_with_SHA256 OBJ_dsa_with_sha2,2L + +#define SN_hold_instruction_code "holdInstructionCode" +#define LN_hold_instruction_code "Hold Instruction Code" +#define NID_hold_instruction_code 430 +#define OBJ_hold_instruction_code OBJ_id_ce,23L + +#define OBJ_holdInstruction OBJ_X9_57,2L + +#define SN_hold_instruction_none "holdInstructionNone" +#define LN_hold_instruction_none "Hold Instruction None" +#define NID_hold_instruction_none 431 +#define OBJ_hold_instruction_none OBJ_holdInstruction,1L + +#define SN_hold_instruction_call_issuer "holdInstructionCallIssuer" +#define LN_hold_instruction_call_issuer "Hold Instruction Call Issuer" +#define NID_hold_instruction_call_issuer 432 +#define OBJ_hold_instruction_call_issuer OBJ_holdInstruction,2L + +#define SN_hold_instruction_reject "holdInstructionReject" +#define LN_hold_instruction_reject "Hold Instruction Reject" +#define NID_hold_instruction_reject 433 +#define OBJ_hold_instruction_reject OBJ_holdInstruction,3L + +#define SN_data "data" +#define NID_data 434 +#define OBJ_data OBJ_itu_t,9L + +#define SN_pss "pss" +#define NID_pss 435 +#define OBJ_pss OBJ_data,2342L + +#define SN_ucl "ucl" +#define NID_ucl 436 +#define OBJ_ucl OBJ_pss,19200300L + +#define SN_pilot "pilot" +#define NID_pilot 437 +#define OBJ_pilot OBJ_ucl,100L + +#define LN_pilotAttributeType "pilotAttributeType" +#define NID_pilotAttributeType 438 +#define OBJ_pilotAttributeType OBJ_pilot,1L + +#define LN_pilotAttributeSyntax "pilotAttributeSyntax" +#define NID_pilotAttributeSyntax 439 +#define OBJ_pilotAttributeSyntax OBJ_pilot,3L + +#define LN_pilotObjectClass "pilotObjectClass" +#define NID_pilotObjectClass 440 +#define OBJ_pilotObjectClass OBJ_pilot,4L + +#define LN_pilotGroups "pilotGroups" +#define NID_pilotGroups 441 +#define OBJ_pilotGroups OBJ_pilot,10L + +#define LN_iA5StringSyntax "iA5StringSyntax" +#define NID_iA5StringSyntax 442 +#define OBJ_iA5StringSyntax OBJ_pilotAttributeSyntax,4L + +#define LN_caseIgnoreIA5StringSyntax "caseIgnoreIA5StringSyntax" +#define NID_caseIgnoreIA5StringSyntax 443 +#define OBJ_caseIgnoreIA5StringSyntax OBJ_pilotAttributeSyntax,5L + +#define LN_pilotObject "pilotObject" +#define NID_pilotObject 444 +#define OBJ_pilotObject OBJ_pilotObjectClass,3L + +#define LN_pilotPerson "pilotPerson" +#define NID_pilotPerson 445 +#define OBJ_pilotPerson OBJ_pilotObjectClass,4L + +#define SN_account "account" +#define NID_account 446 +#define OBJ_account OBJ_pilotObjectClass,5L + +#define SN_document "document" +#define NID_document 447 +#define OBJ_document OBJ_pilotObjectClass,6L + +#define SN_room "room" +#define NID_room 448 +#define OBJ_room OBJ_pilotObjectClass,7L + +#define LN_documentSeries "documentSeries" +#define NID_documentSeries 449 +#define OBJ_documentSeries OBJ_pilotObjectClass,9L + +#define SN_Domain "domain" +#define LN_Domain "Domain" +#define NID_Domain 392 +#define OBJ_Domain OBJ_pilotObjectClass,13L + +#define LN_rFC822localPart "rFC822localPart" +#define NID_rFC822localPart 450 +#define OBJ_rFC822localPart OBJ_pilotObjectClass,14L + +#define LN_dNSDomain "dNSDomain" +#define NID_dNSDomain 451 +#define OBJ_dNSDomain OBJ_pilotObjectClass,15L + +#define LN_domainRelatedObject "domainRelatedObject" +#define NID_domainRelatedObject 452 +#define OBJ_domainRelatedObject OBJ_pilotObjectClass,17L + +#define LN_friendlyCountry "friendlyCountry" +#define NID_friendlyCountry 453 +#define OBJ_friendlyCountry OBJ_pilotObjectClass,18L + +#define LN_simpleSecurityObject "simpleSecurityObject" +#define NID_simpleSecurityObject 454 +#define OBJ_simpleSecurityObject OBJ_pilotObjectClass,19L + +#define LN_pilotOrganization "pilotOrganization" +#define NID_pilotOrganization 455 +#define OBJ_pilotOrganization OBJ_pilotObjectClass,20L + +#define LN_pilotDSA "pilotDSA" +#define NID_pilotDSA 456 +#define OBJ_pilotDSA OBJ_pilotObjectClass,21L + +#define LN_qualityLabelledData "qualityLabelledData" +#define NID_qualityLabelledData 457 +#define OBJ_qualityLabelledData OBJ_pilotObjectClass,22L + +#define SN_userId "UID" +#define LN_userId "userId" +#define NID_userId 458 +#define OBJ_userId OBJ_pilotAttributeType,1L + +#define LN_textEncodedORAddress "textEncodedORAddress" +#define NID_textEncodedORAddress 459 +#define OBJ_textEncodedORAddress OBJ_pilotAttributeType,2L + +#define SN_rfc822Mailbox "mail" +#define LN_rfc822Mailbox "rfc822Mailbox" +#define NID_rfc822Mailbox 460 +#define OBJ_rfc822Mailbox OBJ_pilotAttributeType,3L + +#define SN_info "info" +#define NID_info 461 +#define OBJ_info OBJ_pilotAttributeType,4L + +#define LN_favouriteDrink "favouriteDrink" +#define NID_favouriteDrink 462 +#define OBJ_favouriteDrink OBJ_pilotAttributeType,5L + +#define LN_roomNumber "roomNumber" +#define NID_roomNumber 463 +#define OBJ_roomNumber OBJ_pilotAttributeType,6L + +#define SN_photo "photo" +#define NID_photo 464 +#define OBJ_photo OBJ_pilotAttributeType,7L + +#define LN_userClass "userClass" +#define NID_userClass 465 +#define OBJ_userClass OBJ_pilotAttributeType,8L + +#define SN_host "host" +#define NID_host 466 +#define OBJ_host OBJ_pilotAttributeType,9L + +#define SN_manager "manager" +#define NID_manager 467 +#define OBJ_manager OBJ_pilotAttributeType,10L + +#define LN_documentIdentifier "documentIdentifier" +#define NID_documentIdentifier 468 +#define OBJ_documentIdentifier OBJ_pilotAttributeType,11L + +#define LN_documentTitle "documentTitle" +#define NID_documentTitle 469 +#define OBJ_documentTitle OBJ_pilotAttributeType,12L + +#define LN_documentVersion "documentVersion" +#define NID_documentVersion 470 +#define OBJ_documentVersion OBJ_pilotAttributeType,13L + +#define LN_documentAuthor "documentAuthor" +#define NID_documentAuthor 471 +#define OBJ_documentAuthor OBJ_pilotAttributeType,14L + +#define LN_documentLocation "documentLocation" +#define NID_documentLocation 472 +#define OBJ_documentLocation OBJ_pilotAttributeType,15L + +#define LN_homeTelephoneNumber "homeTelephoneNumber" +#define NID_homeTelephoneNumber 473 +#define OBJ_homeTelephoneNumber OBJ_pilotAttributeType,20L + +#define SN_secretary "secretary" +#define NID_secretary 474 +#define OBJ_secretary OBJ_pilotAttributeType,21L + +#define LN_otherMailbox "otherMailbox" +#define NID_otherMailbox 475 +#define OBJ_otherMailbox OBJ_pilotAttributeType,22L + +#define LN_lastModifiedTime "lastModifiedTime" +#define NID_lastModifiedTime 476 +#define OBJ_lastModifiedTime OBJ_pilotAttributeType,23L + +#define LN_lastModifiedBy "lastModifiedBy" +#define NID_lastModifiedBy 477 +#define OBJ_lastModifiedBy OBJ_pilotAttributeType,24L + +#define SN_domainComponent "DC" +#define LN_domainComponent "domainComponent" +#define NID_domainComponent 391 +#define OBJ_domainComponent OBJ_pilotAttributeType,25L + +#define LN_aRecord "aRecord" +#define NID_aRecord 478 +#define OBJ_aRecord OBJ_pilotAttributeType,26L + +#define LN_pilotAttributeType27 "pilotAttributeType27" +#define NID_pilotAttributeType27 479 +#define OBJ_pilotAttributeType27 OBJ_pilotAttributeType,27L + +#define LN_mXRecord "mXRecord" +#define NID_mXRecord 480 +#define OBJ_mXRecord OBJ_pilotAttributeType,28L + +#define LN_nSRecord "nSRecord" +#define NID_nSRecord 481 +#define OBJ_nSRecord OBJ_pilotAttributeType,29L + +#define LN_sOARecord "sOARecord" +#define NID_sOARecord 482 +#define OBJ_sOARecord OBJ_pilotAttributeType,30L + +#define LN_cNAMERecord "cNAMERecord" +#define NID_cNAMERecord 483 +#define OBJ_cNAMERecord OBJ_pilotAttributeType,31L + +#define LN_associatedDomain "associatedDomain" +#define NID_associatedDomain 484 +#define OBJ_associatedDomain OBJ_pilotAttributeType,37L + +#define LN_associatedName "associatedName" +#define NID_associatedName 485 +#define OBJ_associatedName OBJ_pilotAttributeType,38L + +#define LN_homePostalAddress "homePostalAddress" +#define NID_homePostalAddress 486 +#define OBJ_homePostalAddress OBJ_pilotAttributeType,39L + +#define LN_personalTitle "personalTitle" +#define NID_personalTitle 487 +#define OBJ_personalTitle OBJ_pilotAttributeType,40L + +#define LN_mobileTelephoneNumber "mobileTelephoneNumber" +#define NID_mobileTelephoneNumber 488 +#define OBJ_mobileTelephoneNumber OBJ_pilotAttributeType,41L + +#define LN_pagerTelephoneNumber "pagerTelephoneNumber" +#define NID_pagerTelephoneNumber 489 +#define OBJ_pagerTelephoneNumber OBJ_pilotAttributeType,42L + +#define LN_friendlyCountryName "friendlyCountryName" +#define NID_friendlyCountryName 490 +#define OBJ_friendlyCountryName OBJ_pilotAttributeType,43L + +#define LN_organizationalStatus "organizationalStatus" +#define NID_organizationalStatus 491 +#define OBJ_organizationalStatus OBJ_pilotAttributeType,45L + +#define LN_janetMailbox "janetMailbox" +#define NID_janetMailbox 492 +#define OBJ_janetMailbox OBJ_pilotAttributeType,46L + +#define LN_mailPreferenceOption "mailPreferenceOption" +#define NID_mailPreferenceOption 493 +#define OBJ_mailPreferenceOption OBJ_pilotAttributeType,47L + +#define LN_buildingName "buildingName" +#define NID_buildingName 494 +#define OBJ_buildingName OBJ_pilotAttributeType,48L + +#define LN_dSAQuality "dSAQuality" +#define NID_dSAQuality 495 +#define OBJ_dSAQuality OBJ_pilotAttributeType,49L + +#define LN_singleLevelQuality "singleLevelQuality" +#define NID_singleLevelQuality 496 +#define OBJ_singleLevelQuality OBJ_pilotAttributeType,50L + +#define LN_subtreeMinimumQuality "subtreeMinimumQuality" +#define NID_subtreeMinimumQuality 497 +#define OBJ_subtreeMinimumQuality OBJ_pilotAttributeType,51L + +#define LN_subtreeMaximumQuality "subtreeMaximumQuality" +#define NID_subtreeMaximumQuality 498 +#define OBJ_subtreeMaximumQuality OBJ_pilotAttributeType,52L + +#define LN_personalSignature "personalSignature" +#define NID_personalSignature 499 +#define OBJ_personalSignature OBJ_pilotAttributeType,53L + +#define LN_dITRedirect "dITRedirect" +#define NID_dITRedirect 500 +#define OBJ_dITRedirect OBJ_pilotAttributeType,54L + +#define SN_audio "audio" +#define NID_audio 501 +#define OBJ_audio OBJ_pilotAttributeType,55L + +#define LN_documentPublisher "documentPublisher" +#define NID_documentPublisher 502 +#define OBJ_documentPublisher OBJ_pilotAttributeType,56L + +#define SN_id_set "id-set" +#define LN_id_set "Secure Electronic Transactions" +#define NID_id_set 512 +#define OBJ_id_set OBJ_international_organizations,42L + +#define SN_set_ctype "set-ctype" +#define LN_set_ctype "content types" +#define NID_set_ctype 513 +#define OBJ_set_ctype OBJ_id_set,0L + +#define SN_set_msgExt "set-msgExt" +#define LN_set_msgExt "message extensions" +#define NID_set_msgExt 514 +#define OBJ_set_msgExt OBJ_id_set,1L + +#define SN_set_attr "set-attr" +#define NID_set_attr 515 +#define OBJ_set_attr OBJ_id_set,3L + +#define SN_set_policy "set-policy" +#define NID_set_policy 516 +#define OBJ_set_policy OBJ_id_set,5L + +#define SN_set_certExt "set-certExt" +#define LN_set_certExt "certificate extensions" +#define NID_set_certExt 517 +#define OBJ_set_certExt OBJ_id_set,7L + +#define SN_set_brand "set-brand" +#define NID_set_brand 518 +#define OBJ_set_brand OBJ_id_set,8L + +#define SN_setct_PANData "setct-PANData" +#define NID_setct_PANData 519 +#define OBJ_setct_PANData OBJ_set_ctype,0L + +#define SN_setct_PANToken "setct-PANToken" +#define NID_setct_PANToken 520 +#define OBJ_setct_PANToken OBJ_set_ctype,1L + +#define SN_setct_PANOnly "setct-PANOnly" +#define NID_setct_PANOnly 521 +#define OBJ_setct_PANOnly OBJ_set_ctype,2L + +#define SN_setct_OIData "setct-OIData" +#define NID_setct_OIData 522 +#define OBJ_setct_OIData OBJ_set_ctype,3L + +#define SN_setct_PI "setct-PI" +#define NID_setct_PI 523 +#define OBJ_setct_PI OBJ_set_ctype,4L + +#define SN_setct_PIData "setct-PIData" +#define NID_setct_PIData 524 +#define OBJ_setct_PIData OBJ_set_ctype,5L + +#define SN_setct_PIDataUnsigned "setct-PIDataUnsigned" +#define NID_setct_PIDataUnsigned 525 +#define OBJ_setct_PIDataUnsigned OBJ_set_ctype,6L + +#define SN_setct_HODInput "setct-HODInput" +#define NID_setct_HODInput 526 +#define OBJ_setct_HODInput OBJ_set_ctype,7L + +#define SN_setct_AuthResBaggage "setct-AuthResBaggage" +#define NID_setct_AuthResBaggage 527 +#define OBJ_setct_AuthResBaggage OBJ_set_ctype,8L + +#define SN_setct_AuthRevReqBaggage "setct-AuthRevReqBaggage" +#define NID_setct_AuthRevReqBaggage 528 +#define OBJ_setct_AuthRevReqBaggage OBJ_set_ctype,9L + +#define SN_setct_AuthRevResBaggage "setct-AuthRevResBaggage" +#define NID_setct_AuthRevResBaggage 529 +#define OBJ_setct_AuthRevResBaggage OBJ_set_ctype,10L + +#define SN_setct_CapTokenSeq "setct-CapTokenSeq" +#define NID_setct_CapTokenSeq 530 +#define OBJ_setct_CapTokenSeq OBJ_set_ctype,11L + +#define SN_setct_PInitResData "setct-PInitResData" +#define NID_setct_PInitResData 531 +#define OBJ_setct_PInitResData OBJ_set_ctype,12L + +#define SN_setct_PI_TBS "setct-PI-TBS" +#define NID_setct_PI_TBS 532 +#define OBJ_setct_PI_TBS OBJ_set_ctype,13L + +#define SN_setct_PResData "setct-PResData" +#define NID_setct_PResData 533 +#define OBJ_setct_PResData OBJ_set_ctype,14L + +#define SN_setct_AuthReqTBS "setct-AuthReqTBS" +#define NID_setct_AuthReqTBS 534 +#define OBJ_setct_AuthReqTBS OBJ_set_ctype,16L + +#define SN_setct_AuthResTBS "setct-AuthResTBS" +#define NID_setct_AuthResTBS 535 +#define OBJ_setct_AuthResTBS OBJ_set_ctype,17L + +#define SN_setct_AuthResTBSX "setct-AuthResTBSX" +#define NID_setct_AuthResTBSX 536 +#define OBJ_setct_AuthResTBSX OBJ_set_ctype,18L + +#define SN_setct_AuthTokenTBS "setct-AuthTokenTBS" +#define NID_setct_AuthTokenTBS 537 +#define OBJ_setct_AuthTokenTBS OBJ_set_ctype,19L + +#define SN_setct_CapTokenData "setct-CapTokenData" +#define NID_setct_CapTokenData 538 +#define OBJ_setct_CapTokenData OBJ_set_ctype,20L + +#define SN_setct_CapTokenTBS "setct-CapTokenTBS" +#define NID_setct_CapTokenTBS 539 +#define OBJ_setct_CapTokenTBS OBJ_set_ctype,21L + +#define SN_setct_AcqCardCodeMsg "setct-AcqCardCodeMsg" +#define NID_setct_AcqCardCodeMsg 540 +#define OBJ_setct_AcqCardCodeMsg OBJ_set_ctype,22L + +#define SN_setct_AuthRevReqTBS "setct-AuthRevReqTBS" +#define NID_setct_AuthRevReqTBS 541 +#define OBJ_setct_AuthRevReqTBS OBJ_set_ctype,23L + +#define SN_setct_AuthRevResData "setct-AuthRevResData" +#define NID_setct_AuthRevResData 542 +#define OBJ_setct_AuthRevResData OBJ_set_ctype,24L + +#define SN_setct_AuthRevResTBS "setct-AuthRevResTBS" +#define NID_setct_AuthRevResTBS 543 +#define OBJ_setct_AuthRevResTBS OBJ_set_ctype,25L + +#define SN_setct_CapReqTBS "setct-CapReqTBS" +#define NID_setct_CapReqTBS 544 +#define OBJ_setct_CapReqTBS OBJ_set_ctype,26L + +#define SN_setct_CapReqTBSX "setct-CapReqTBSX" +#define NID_setct_CapReqTBSX 545 +#define OBJ_setct_CapReqTBSX OBJ_set_ctype,27L + +#define SN_setct_CapResData "setct-CapResData" +#define NID_setct_CapResData 546 +#define OBJ_setct_CapResData OBJ_set_ctype,28L + +#define SN_setct_CapRevReqTBS "setct-CapRevReqTBS" +#define NID_setct_CapRevReqTBS 547 +#define OBJ_setct_CapRevReqTBS OBJ_set_ctype,29L + +#define SN_setct_CapRevReqTBSX "setct-CapRevReqTBSX" +#define NID_setct_CapRevReqTBSX 548 +#define OBJ_setct_CapRevReqTBSX OBJ_set_ctype,30L + +#define SN_setct_CapRevResData "setct-CapRevResData" +#define NID_setct_CapRevResData 549 +#define OBJ_setct_CapRevResData OBJ_set_ctype,31L + +#define SN_setct_CredReqTBS "setct-CredReqTBS" +#define NID_setct_CredReqTBS 550 +#define OBJ_setct_CredReqTBS OBJ_set_ctype,32L + +#define SN_setct_CredReqTBSX "setct-CredReqTBSX" +#define NID_setct_CredReqTBSX 551 +#define OBJ_setct_CredReqTBSX OBJ_set_ctype,33L + +#define SN_setct_CredResData "setct-CredResData" +#define NID_setct_CredResData 552 +#define OBJ_setct_CredResData OBJ_set_ctype,34L + +#define SN_setct_CredRevReqTBS "setct-CredRevReqTBS" +#define NID_setct_CredRevReqTBS 553 +#define OBJ_setct_CredRevReqTBS OBJ_set_ctype,35L + +#define SN_setct_CredRevReqTBSX "setct-CredRevReqTBSX" +#define NID_setct_CredRevReqTBSX 554 +#define OBJ_setct_CredRevReqTBSX OBJ_set_ctype,36L + +#define SN_setct_CredRevResData "setct-CredRevResData" +#define NID_setct_CredRevResData 555 +#define OBJ_setct_CredRevResData OBJ_set_ctype,37L + +#define SN_setct_PCertReqData "setct-PCertReqData" +#define NID_setct_PCertReqData 556 +#define OBJ_setct_PCertReqData OBJ_set_ctype,38L + +#define SN_setct_PCertResTBS "setct-PCertResTBS" +#define NID_setct_PCertResTBS 557 +#define OBJ_setct_PCertResTBS OBJ_set_ctype,39L + +#define SN_setct_BatchAdminReqData "setct-BatchAdminReqData" +#define NID_setct_BatchAdminReqData 558 +#define OBJ_setct_BatchAdminReqData OBJ_set_ctype,40L + +#define SN_setct_BatchAdminResData "setct-BatchAdminResData" +#define NID_setct_BatchAdminResData 559 +#define OBJ_setct_BatchAdminResData OBJ_set_ctype,41L + +#define SN_setct_CardCInitResTBS "setct-CardCInitResTBS" +#define NID_setct_CardCInitResTBS 560 +#define OBJ_setct_CardCInitResTBS OBJ_set_ctype,42L + +#define SN_setct_MeAqCInitResTBS "setct-MeAqCInitResTBS" +#define NID_setct_MeAqCInitResTBS 561 +#define OBJ_setct_MeAqCInitResTBS OBJ_set_ctype,43L + +#define SN_setct_RegFormResTBS "setct-RegFormResTBS" +#define NID_setct_RegFormResTBS 562 +#define OBJ_setct_RegFormResTBS OBJ_set_ctype,44L + +#define SN_setct_CertReqData "setct-CertReqData" +#define NID_setct_CertReqData 563 +#define OBJ_setct_CertReqData OBJ_set_ctype,45L + +#define SN_setct_CertReqTBS "setct-CertReqTBS" +#define NID_setct_CertReqTBS 564 +#define OBJ_setct_CertReqTBS OBJ_set_ctype,46L + +#define SN_setct_CertResData "setct-CertResData" +#define NID_setct_CertResData 565 +#define OBJ_setct_CertResData OBJ_set_ctype,47L + +#define SN_setct_CertInqReqTBS "setct-CertInqReqTBS" +#define NID_setct_CertInqReqTBS 566 +#define OBJ_setct_CertInqReqTBS OBJ_set_ctype,48L + +#define SN_setct_ErrorTBS "setct-ErrorTBS" +#define NID_setct_ErrorTBS 567 +#define OBJ_setct_ErrorTBS OBJ_set_ctype,49L + +#define SN_setct_PIDualSignedTBE "setct-PIDualSignedTBE" +#define NID_setct_PIDualSignedTBE 568 +#define OBJ_setct_PIDualSignedTBE OBJ_set_ctype,50L + +#define SN_setct_PIUnsignedTBE "setct-PIUnsignedTBE" +#define NID_setct_PIUnsignedTBE 569 +#define OBJ_setct_PIUnsignedTBE OBJ_set_ctype,51L + +#define SN_setct_AuthReqTBE "setct-AuthReqTBE" +#define NID_setct_AuthReqTBE 570 +#define OBJ_setct_AuthReqTBE OBJ_set_ctype,52L + +#define SN_setct_AuthResTBE "setct-AuthResTBE" +#define NID_setct_AuthResTBE 571 +#define OBJ_setct_AuthResTBE OBJ_set_ctype,53L + +#define SN_setct_AuthResTBEX "setct-AuthResTBEX" +#define NID_setct_AuthResTBEX 572 +#define OBJ_setct_AuthResTBEX OBJ_set_ctype,54L + +#define SN_setct_AuthTokenTBE "setct-AuthTokenTBE" +#define NID_setct_AuthTokenTBE 573 +#define OBJ_setct_AuthTokenTBE OBJ_set_ctype,55L + +#define SN_setct_CapTokenTBE "setct-CapTokenTBE" +#define NID_setct_CapTokenTBE 574 +#define OBJ_setct_CapTokenTBE OBJ_set_ctype,56L + +#define SN_setct_CapTokenTBEX "setct-CapTokenTBEX" +#define NID_setct_CapTokenTBEX 575 +#define OBJ_setct_CapTokenTBEX OBJ_set_ctype,57L + +#define SN_setct_AcqCardCodeMsgTBE "setct-AcqCardCodeMsgTBE" +#define NID_setct_AcqCardCodeMsgTBE 576 +#define OBJ_setct_AcqCardCodeMsgTBE OBJ_set_ctype,58L + +#define SN_setct_AuthRevReqTBE "setct-AuthRevReqTBE" +#define NID_setct_AuthRevReqTBE 577 +#define OBJ_setct_AuthRevReqTBE OBJ_set_ctype,59L + +#define SN_setct_AuthRevResTBE "setct-AuthRevResTBE" +#define NID_setct_AuthRevResTBE 578 +#define OBJ_setct_AuthRevResTBE OBJ_set_ctype,60L + +#define SN_setct_AuthRevResTBEB "setct-AuthRevResTBEB" +#define NID_setct_AuthRevResTBEB 579 +#define OBJ_setct_AuthRevResTBEB OBJ_set_ctype,61L + +#define SN_setct_CapReqTBE "setct-CapReqTBE" +#define NID_setct_CapReqTBE 580 +#define OBJ_setct_CapReqTBE OBJ_set_ctype,62L + +#define SN_setct_CapReqTBEX "setct-CapReqTBEX" +#define NID_setct_CapReqTBEX 581 +#define OBJ_setct_CapReqTBEX OBJ_set_ctype,63L + +#define SN_setct_CapResTBE "setct-CapResTBE" +#define NID_setct_CapResTBE 582 +#define OBJ_setct_CapResTBE OBJ_set_ctype,64L + +#define SN_setct_CapRevReqTBE "setct-CapRevReqTBE" +#define NID_setct_CapRevReqTBE 583 +#define OBJ_setct_CapRevReqTBE OBJ_set_ctype,65L + +#define SN_setct_CapRevReqTBEX "setct-CapRevReqTBEX" +#define NID_setct_CapRevReqTBEX 584 +#define OBJ_setct_CapRevReqTBEX OBJ_set_ctype,66L + +#define SN_setct_CapRevResTBE "setct-CapRevResTBE" +#define NID_setct_CapRevResTBE 585 +#define OBJ_setct_CapRevResTBE OBJ_set_ctype,67L + +#define SN_setct_CredReqTBE "setct-CredReqTBE" +#define NID_setct_CredReqTBE 586 +#define OBJ_setct_CredReqTBE OBJ_set_ctype,68L + +#define SN_setct_CredReqTBEX "setct-CredReqTBEX" +#define NID_setct_CredReqTBEX 587 +#define OBJ_setct_CredReqTBEX OBJ_set_ctype,69L + +#define SN_setct_CredResTBE "setct-CredResTBE" +#define NID_setct_CredResTBE 588 +#define OBJ_setct_CredResTBE OBJ_set_ctype,70L + +#define SN_setct_CredRevReqTBE "setct-CredRevReqTBE" +#define NID_setct_CredRevReqTBE 589 +#define OBJ_setct_CredRevReqTBE OBJ_set_ctype,71L + +#define SN_setct_CredRevReqTBEX "setct-CredRevReqTBEX" +#define NID_setct_CredRevReqTBEX 590 +#define OBJ_setct_CredRevReqTBEX OBJ_set_ctype,72L + +#define SN_setct_CredRevResTBE "setct-CredRevResTBE" +#define NID_setct_CredRevResTBE 591 +#define OBJ_setct_CredRevResTBE OBJ_set_ctype,73L + +#define SN_setct_BatchAdminReqTBE "setct-BatchAdminReqTBE" +#define NID_setct_BatchAdminReqTBE 592 +#define OBJ_setct_BatchAdminReqTBE OBJ_set_ctype,74L + +#define SN_setct_BatchAdminResTBE "setct-BatchAdminResTBE" +#define NID_setct_BatchAdminResTBE 593 +#define OBJ_setct_BatchAdminResTBE OBJ_set_ctype,75L + +#define SN_setct_RegFormReqTBE "setct-RegFormReqTBE" +#define NID_setct_RegFormReqTBE 594 +#define OBJ_setct_RegFormReqTBE OBJ_set_ctype,76L + +#define SN_setct_CertReqTBE "setct-CertReqTBE" +#define NID_setct_CertReqTBE 595 +#define OBJ_setct_CertReqTBE OBJ_set_ctype,77L + +#define SN_setct_CertReqTBEX "setct-CertReqTBEX" +#define NID_setct_CertReqTBEX 596 +#define OBJ_setct_CertReqTBEX OBJ_set_ctype,78L + +#define SN_setct_CertResTBE "setct-CertResTBE" +#define NID_setct_CertResTBE 597 +#define OBJ_setct_CertResTBE OBJ_set_ctype,79L + +#define SN_setct_CRLNotificationTBS "setct-CRLNotificationTBS" +#define NID_setct_CRLNotificationTBS 598 +#define OBJ_setct_CRLNotificationTBS OBJ_set_ctype,80L + +#define SN_setct_CRLNotificationResTBS "setct-CRLNotificationResTBS" +#define NID_setct_CRLNotificationResTBS 599 +#define OBJ_setct_CRLNotificationResTBS OBJ_set_ctype,81L + +#define SN_setct_BCIDistributionTBS "setct-BCIDistributionTBS" +#define NID_setct_BCIDistributionTBS 600 +#define OBJ_setct_BCIDistributionTBS OBJ_set_ctype,82L + +#define SN_setext_genCrypt "setext-genCrypt" +#define LN_setext_genCrypt "generic cryptogram" +#define NID_setext_genCrypt 601 +#define OBJ_setext_genCrypt OBJ_set_msgExt,1L + +#define SN_setext_miAuth "setext-miAuth" +#define LN_setext_miAuth "merchant initiated auth" +#define NID_setext_miAuth 602 +#define OBJ_setext_miAuth OBJ_set_msgExt,3L + +#define SN_setext_pinSecure "setext-pinSecure" +#define NID_setext_pinSecure 603 +#define OBJ_setext_pinSecure OBJ_set_msgExt,4L + +#define SN_setext_pinAny "setext-pinAny" +#define NID_setext_pinAny 604 +#define OBJ_setext_pinAny OBJ_set_msgExt,5L + +#define SN_setext_track2 "setext-track2" +#define NID_setext_track2 605 +#define OBJ_setext_track2 OBJ_set_msgExt,7L + +#define SN_setext_cv "setext-cv" +#define LN_setext_cv "additional verification" +#define NID_setext_cv 606 +#define OBJ_setext_cv OBJ_set_msgExt,8L + +#define SN_set_policy_root "set-policy-root" +#define NID_set_policy_root 607 +#define OBJ_set_policy_root OBJ_set_policy,0L + +#define SN_setCext_hashedRoot "setCext-hashedRoot" +#define NID_setCext_hashedRoot 608 +#define OBJ_setCext_hashedRoot OBJ_set_certExt,0L + +#define SN_setCext_certType "setCext-certType" +#define NID_setCext_certType 609 +#define OBJ_setCext_certType OBJ_set_certExt,1L + +#define SN_setCext_merchData "setCext-merchData" +#define NID_setCext_merchData 610 +#define OBJ_setCext_merchData OBJ_set_certExt,2L + +#define SN_setCext_cCertRequired "setCext-cCertRequired" +#define NID_setCext_cCertRequired 611 +#define OBJ_setCext_cCertRequired OBJ_set_certExt,3L + +#define SN_setCext_tunneling "setCext-tunneling" +#define NID_setCext_tunneling 612 +#define OBJ_setCext_tunneling OBJ_set_certExt,4L + +#define SN_setCext_setExt "setCext-setExt" +#define NID_setCext_setExt 613 +#define OBJ_setCext_setExt OBJ_set_certExt,5L + +#define SN_setCext_setQualf "setCext-setQualf" +#define NID_setCext_setQualf 614 +#define OBJ_setCext_setQualf OBJ_set_certExt,6L + +#define SN_setCext_PGWYcapabilities "setCext-PGWYcapabilities" +#define NID_setCext_PGWYcapabilities 615 +#define OBJ_setCext_PGWYcapabilities OBJ_set_certExt,7L + +#define SN_setCext_TokenIdentifier "setCext-TokenIdentifier" +#define NID_setCext_TokenIdentifier 616 +#define OBJ_setCext_TokenIdentifier OBJ_set_certExt,8L + +#define SN_setCext_Track2Data "setCext-Track2Data" +#define NID_setCext_Track2Data 617 +#define OBJ_setCext_Track2Data OBJ_set_certExt,9L + +#define SN_setCext_TokenType "setCext-TokenType" +#define NID_setCext_TokenType 618 +#define OBJ_setCext_TokenType OBJ_set_certExt,10L + +#define SN_setCext_IssuerCapabilities "setCext-IssuerCapabilities" +#define NID_setCext_IssuerCapabilities 619 +#define OBJ_setCext_IssuerCapabilities OBJ_set_certExt,11L + +#define SN_setAttr_Cert "setAttr-Cert" +#define NID_setAttr_Cert 620 +#define OBJ_setAttr_Cert OBJ_set_attr,0L + +#define SN_setAttr_PGWYcap "setAttr-PGWYcap" +#define LN_setAttr_PGWYcap "payment gateway capabilities" +#define NID_setAttr_PGWYcap 621 +#define OBJ_setAttr_PGWYcap OBJ_set_attr,1L + +#define SN_setAttr_TokenType "setAttr-TokenType" +#define NID_setAttr_TokenType 622 +#define OBJ_setAttr_TokenType OBJ_set_attr,2L + +#define SN_setAttr_IssCap "setAttr-IssCap" +#define LN_setAttr_IssCap "issuer capabilities" +#define NID_setAttr_IssCap 623 +#define OBJ_setAttr_IssCap OBJ_set_attr,3L + +#define SN_set_rootKeyThumb "set-rootKeyThumb" +#define NID_set_rootKeyThumb 624 +#define OBJ_set_rootKeyThumb OBJ_setAttr_Cert,0L + +#define SN_set_addPolicy "set-addPolicy" +#define NID_set_addPolicy 625 +#define OBJ_set_addPolicy OBJ_setAttr_Cert,1L + +#define SN_setAttr_Token_EMV "setAttr-Token-EMV" +#define NID_setAttr_Token_EMV 626 +#define OBJ_setAttr_Token_EMV OBJ_setAttr_TokenType,1L + +#define SN_setAttr_Token_B0Prime "setAttr-Token-B0Prime" +#define NID_setAttr_Token_B0Prime 627 +#define OBJ_setAttr_Token_B0Prime OBJ_setAttr_TokenType,2L + +#define SN_setAttr_IssCap_CVM "setAttr-IssCap-CVM" +#define NID_setAttr_IssCap_CVM 628 +#define OBJ_setAttr_IssCap_CVM OBJ_setAttr_IssCap,3L + +#define SN_setAttr_IssCap_T2 "setAttr-IssCap-T2" +#define NID_setAttr_IssCap_T2 629 +#define OBJ_setAttr_IssCap_T2 OBJ_setAttr_IssCap,4L + +#define SN_setAttr_IssCap_Sig "setAttr-IssCap-Sig" +#define NID_setAttr_IssCap_Sig 630 +#define OBJ_setAttr_IssCap_Sig OBJ_setAttr_IssCap,5L + +#define SN_setAttr_GenCryptgrm "setAttr-GenCryptgrm" +#define LN_setAttr_GenCryptgrm "generate cryptogram" +#define NID_setAttr_GenCryptgrm 631 +#define OBJ_setAttr_GenCryptgrm OBJ_setAttr_IssCap_CVM,1L + +#define SN_setAttr_T2Enc "setAttr-T2Enc" +#define LN_setAttr_T2Enc "encrypted track 2" +#define NID_setAttr_T2Enc 632 +#define OBJ_setAttr_T2Enc OBJ_setAttr_IssCap_T2,1L + +#define SN_setAttr_T2cleartxt "setAttr-T2cleartxt" +#define LN_setAttr_T2cleartxt "cleartext track 2" +#define NID_setAttr_T2cleartxt 633 +#define OBJ_setAttr_T2cleartxt OBJ_setAttr_IssCap_T2,2L + +#define SN_setAttr_TokICCsig "setAttr-TokICCsig" +#define LN_setAttr_TokICCsig "ICC or token signature" +#define NID_setAttr_TokICCsig 634 +#define OBJ_setAttr_TokICCsig OBJ_setAttr_IssCap_Sig,1L + +#define SN_setAttr_SecDevSig "setAttr-SecDevSig" +#define LN_setAttr_SecDevSig "secure device signature" +#define NID_setAttr_SecDevSig 635 +#define OBJ_setAttr_SecDevSig OBJ_setAttr_IssCap_Sig,2L + +#define SN_set_brand_IATA_ATA "set-brand-IATA-ATA" +#define NID_set_brand_IATA_ATA 636 +#define OBJ_set_brand_IATA_ATA OBJ_set_brand,1L + +#define SN_set_brand_Diners "set-brand-Diners" +#define NID_set_brand_Diners 637 +#define OBJ_set_brand_Diners OBJ_set_brand,30L + +#define SN_set_brand_AmericanExpress "set-brand-AmericanExpress" +#define NID_set_brand_AmericanExpress 638 +#define OBJ_set_brand_AmericanExpress OBJ_set_brand,34L + +#define SN_set_brand_JCB "set-brand-JCB" +#define NID_set_brand_JCB 639 +#define OBJ_set_brand_JCB OBJ_set_brand,35L + +#define SN_set_brand_Visa "set-brand-Visa" +#define NID_set_brand_Visa 640 +#define OBJ_set_brand_Visa OBJ_set_brand,4L + +#define SN_set_brand_MasterCard "set-brand-MasterCard" +#define NID_set_brand_MasterCard 641 +#define OBJ_set_brand_MasterCard OBJ_set_brand,5L + +#define SN_set_brand_Novus "set-brand-Novus" +#define NID_set_brand_Novus 642 +#define OBJ_set_brand_Novus OBJ_set_brand,6011L + +#define SN_des_cdmf "DES-CDMF" +#define LN_des_cdmf "des-cdmf" +#define NID_des_cdmf 643 +#define OBJ_des_cdmf OBJ_rsadsi,3L,10L + +#define SN_rsaOAEPEncryptionSET "rsaOAEPEncryptionSET" +#define NID_rsaOAEPEncryptionSET 644 +#define OBJ_rsaOAEPEncryptionSET OBJ_rsadsi,1L,1L,6L + +#define SN_ipsec3 "Oakley-EC2N-3" +#define LN_ipsec3 "ipsec3" +#define NID_ipsec3 749 + +#define SN_ipsec4 "Oakley-EC2N-4" +#define LN_ipsec4 "ipsec4" +#define NID_ipsec4 750 + +#define SN_whirlpool "whirlpool" +#define NID_whirlpool 804 +#define OBJ_whirlpool OBJ_iso,0L,10118L,3L,0L,55L + +#define SN_cryptopro "cryptopro" +#define NID_cryptopro 805 +#define OBJ_cryptopro OBJ_member_body,643L,2L,2L + +#define SN_cryptocom "cryptocom" +#define NID_cryptocom 806 +#define OBJ_cryptocom OBJ_member_body,643L,2L,9L + +#define SN_id_GostR3411_94_with_GostR3410_2001 "id-GostR3411-94-with-GostR3410-2001" +#define LN_id_GostR3411_94_with_GostR3410_2001 "GOST R 34.11-94 with GOST R 34.10-2001" +#define NID_id_GostR3411_94_with_GostR3410_2001 807 +#define OBJ_id_GostR3411_94_with_GostR3410_2001 OBJ_cryptopro,3L + +#define SN_id_GostR3411_94_with_GostR3410_94 "id-GostR3411-94-with-GostR3410-94" +#define LN_id_GostR3411_94_with_GostR3410_94 "GOST R 34.11-94 with GOST R 34.10-94" +#define NID_id_GostR3411_94_with_GostR3410_94 808 +#define OBJ_id_GostR3411_94_with_GostR3410_94 OBJ_cryptopro,4L + +#define SN_id_GostR3411_94 "md_gost94" +#define LN_id_GostR3411_94 "GOST R 34.11-94" +#define NID_id_GostR3411_94 809 +#define OBJ_id_GostR3411_94 OBJ_cryptopro,9L + +#define SN_id_HMACGostR3411_94 "id-HMACGostR3411-94" +#define LN_id_HMACGostR3411_94 "HMAC GOST 34.11-94" +#define NID_id_HMACGostR3411_94 810 +#define OBJ_id_HMACGostR3411_94 OBJ_cryptopro,10L + +#define SN_id_GostR3410_2001 "gost2001" +#define LN_id_GostR3410_2001 "GOST R 34.10-2001" +#define NID_id_GostR3410_2001 811 +#define OBJ_id_GostR3410_2001 OBJ_cryptopro,19L + +#define SN_id_GostR3410_94 "gost94" +#define LN_id_GostR3410_94 "GOST R 34.10-94" +#define NID_id_GostR3410_94 812 +#define OBJ_id_GostR3410_94 OBJ_cryptopro,20L + +#define SN_id_Gost28147_89 "gost89" +#define LN_id_Gost28147_89 "GOST 28147-89" +#define NID_id_Gost28147_89 813 +#define OBJ_id_Gost28147_89 OBJ_cryptopro,21L + +#define SN_gost89_cnt "gost89-cnt" +#define NID_gost89_cnt 814 + +#define SN_id_Gost28147_89_MAC "gost-mac" +#define LN_id_Gost28147_89_MAC "GOST 28147-89 MAC" +#define NID_id_Gost28147_89_MAC 815 +#define OBJ_id_Gost28147_89_MAC OBJ_cryptopro,22L + +#define SN_id_GostR3411_94_prf "prf-gostr3411-94" +#define LN_id_GostR3411_94_prf "GOST R 34.11-94 PRF" +#define NID_id_GostR3411_94_prf 816 +#define OBJ_id_GostR3411_94_prf OBJ_cryptopro,23L + +#define SN_id_GostR3410_2001DH "id-GostR3410-2001DH" +#define LN_id_GostR3410_2001DH "GOST R 34.10-2001 DH" +#define NID_id_GostR3410_2001DH 817 +#define OBJ_id_GostR3410_2001DH OBJ_cryptopro,98L + +#define SN_id_GostR3410_94DH "id-GostR3410-94DH" +#define LN_id_GostR3410_94DH "GOST R 34.10-94 DH" +#define NID_id_GostR3410_94DH 818 +#define OBJ_id_GostR3410_94DH OBJ_cryptopro,99L + +#define SN_id_Gost28147_89_CryptoPro_KeyMeshing "id-Gost28147-89-CryptoPro-KeyMeshing" +#define NID_id_Gost28147_89_CryptoPro_KeyMeshing 819 +#define OBJ_id_Gost28147_89_CryptoPro_KeyMeshing OBJ_cryptopro,14L,1L + +#define SN_id_Gost28147_89_None_KeyMeshing "id-Gost28147-89-None-KeyMeshing" +#define NID_id_Gost28147_89_None_KeyMeshing 820 +#define OBJ_id_Gost28147_89_None_KeyMeshing OBJ_cryptopro,14L,0L + +#define SN_id_GostR3411_94_TestParamSet "id-GostR3411-94-TestParamSet" +#define NID_id_GostR3411_94_TestParamSet 821 +#define OBJ_id_GostR3411_94_TestParamSet OBJ_cryptopro,30L,0L + +#define SN_id_GostR3411_94_CryptoProParamSet "id-GostR3411-94-CryptoProParamSet" +#define NID_id_GostR3411_94_CryptoProParamSet 822 +#define OBJ_id_GostR3411_94_CryptoProParamSet OBJ_cryptopro,30L,1L + +#define SN_id_Gost28147_89_TestParamSet "id-Gost28147-89-TestParamSet" +#define NID_id_Gost28147_89_TestParamSet 823 +#define OBJ_id_Gost28147_89_TestParamSet OBJ_cryptopro,31L,0L + +#define SN_id_Gost28147_89_CryptoPro_A_ParamSet "id-Gost28147-89-CryptoPro-A-ParamSet" +#define NID_id_Gost28147_89_CryptoPro_A_ParamSet 824 +#define OBJ_id_Gost28147_89_CryptoPro_A_ParamSet OBJ_cryptopro,31L,1L + +#define SN_id_Gost28147_89_CryptoPro_B_ParamSet "id-Gost28147-89-CryptoPro-B-ParamSet" +#define NID_id_Gost28147_89_CryptoPro_B_ParamSet 825 +#define OBJ_id_Gost28147_89_CryptoPro_B_ParamSet OBJ_cryptopro,31L,2L + +#define SN_id_Gost28147_89_CryptoPro_C_ParamSet "id-Gost28147-89-CryptoPro-C-ParamSet" +#define NID_id_Gost28147_89_CryptoPro_C_ParamSet 826 +#define OBJ_id_Gost28147_89_CryptoPro_C_ParamSet OBJ_cryptopro,31L,3L + +#define SN_id_Gost28147_89_CryptoPro_D_ParamSet "id-Gost28147-89-CryptoPro-D-ParamSet" +#define NID_id_Gost28147_89_CryptoPro_D_ParamSet 827 +#define OBJ_id_Gost28147_89_CryptoPro_D_ParamSet OBJ_cryptopro,31L,4L + +#define SN_id_Gost28147_89_CryptoPro_Oscar_1_1_ParamSet "id-Gost28147-89-CryptoPro-Oscar-1-1-ParamSet" +#define NID_id_Gost28147_89_CryptoPro_Oscar_1_1_ParamSet 828 +#define OBJ_id_Gost28147_89_CryptoPro_Oscar_1_1_ParamSet OBJ_cryptopro,31L,5L + +#define SN_id_Gost28147_89_CryptoPro_Oscar_1_0_ParamSet "id-Gost28147-89-CryptoPro-Oscar-1-0-ParamSet" +#define NID_id_Gost28147_89_CryptoPro_Oscar_1_0_ParamSet 829 +#define OBJ_id_Gost28147_89_CryptoPro_Oscar_1_0_ParamSet OBJ_cryptopro,31L,6L + +#define SN_id_Gost28147_89_CryptoPro_RIC_1_ParamSet "id-Gost28147-89-CryptoPro-RIC-1-ParamSet" +#define NID_id_Gost28147_89_CryptoPro_RIC_1_ParamSet 830 +#define OBJ_id_Gost28147_89_CryptoPro_RIC_1_ParamSet OBJ_cryptopro,31L,7L + +#define SN_id_GostR3410_94_TestParamSet "id-GostR3410-94-TestParamSet" +#define NID_id_GostR3410_94_TestParamSet 831 +#define OBJ_id_GostR3410_94_TestParamSet OBJ_cryptopro,32L,0L + +#define SN_id_GostR3410_94_CryptoPro_A_ParamSet "id-GostR3410-94-CryptoPro-A-ParamSet" +#define NID_id_GostR3410_94_CryptoPro_A_ParamSet 832 +#define OBJ_id_GostR3410_94_CryptoPro_A_ParamSet OBJ_cryptopro,32L,2L + +#define SN_id_GostR3410_94_CryptoPro_B_ParamSet "id-GostR3410-94-CryptoPro-B-ParamSet" +#define NID_id_GostR3410_94_CryptoPro_B_ParamSet 833 +#define OBJ_id_GostR3410_94_CryptoPro_B_ParamSet OBJ_cryptopro,32L,3L + +#define SN_id_GostR3410_94_CryptoPro_C_ParamSet "id-GostR3410-94-CryptoPro-C-ParamSet" +#define NID_id_GostR3410_94_CryptoPro_C_ParamSet 834 +#define OBJ_id_GostR3410_94_CryptoPro_C_ParamSet OBJ_cryptopro,32L,4L + +#define SN_id_GostR3410_94_CryptoPro_D_ParamSet "id-GostR3410-94-CryptoPro-D-ParamSet" +#define NID_id_GostR3410_94_CryptoPro_D_ParamSet 835 +#define OBJ_id_GostR3410_94_CryptoPro_D_ParamSet OBJ_cryptopro,32L,5L + +#define SN_id_GostR3410_94_CryptoPro_XchA_ParamSet "id-GostR3410-94-CryptoPro-XchA-ParamSet" +#define NID_id_GostR3410_94_CryptoPro_XchA_ParamSet 836 +#define OBJ_id_GostR3410_94_CryptoPro_XchA_ParamSet OBJ_cryptopro,33L,1L + +#define SN_id_GostR3410_94_CryptoPro_XchB_ParamSet "id-GostR3410-94-CryptoPro-XchB-ParamSet" +#define NID_id_GostR3410_94_CryptoPro_XchB_ParamSet 837 +#define OBJ_id_GostR3410_94_CryptoPro_XchB_ParamSet OBJ_cryptopro,33L,2L + +#define SN_id_GostR3410_94_CryptoPro_XchC_ParamSet "id-GostR3410-94-CryptoPro-XchC-ParamSet" +#define NID_id_GostR3410_94_CryptoPro_XchC_ParamSet 838 +#define OBJ_id_GostR3410_94_CryptoPro_XchC_ParamSet OBJ_cryptopro,33L,3L + +#define SN_id_GostR3410_2001_TestParamSet "id-GostR3410-2001-TestParamSet" +#define NID_id_GostR3410_2001_TestParamSet 839 +#define OBJ_id_GostR3410_2001_TestParamSet OBJ_cryptopro,35L,0L + +#define SN_id_GostR3410_2001_CryptoPro_A_ParamSet "id-GostR3410-2001-CryptoPro-A-ParamSet" +#define NID_id_GostR3410_2001_CryptoPro_A_ParamSet 840 +#define OBJ_id_GostR3410_2001_CryptoPro_A_ParamSet OBJ_cryptopro,35L,1L + +#define SN_id_GostR3410_2001_CryptoPro_B_ParamSet "id-GostR3410-2001-CryptoPro-B-ParamSet" +#define NID_id_GostR3410_2001_CryptoPro_B_ParamSet 841 +#define OBJ_id_GostR3410_2001_CryptoPro_B_ParamSet OBJ_cryptopro,35L,2L + +#define SN_id_GostR3410_2001_CryptoPro_C_ParamSet "id-GostR3410-2001-CryptoPro-C-ParamSet" +#define NID_id_GostR3410_2001_CryptoPro_C_ParamSet 842 +#define OBJ_id_GostR3410_2001_CryptoPro_C_ParamSet OBJ_cryptopro,35L,3L + +#define SN_id_GostR3410_2001_CryptoPro_XchA_ParamSet "id-GostR3410-2001-CryptoPro-XchA-ParamSet" +#define NID_id_GostR3410_2001_CryptoPro_XchA_ParamSet 843 +#define OBJ_id_GostR3410_2001_CryptoPro_XchA_ParamSet OBJ_cryptopro,36L,0L + +#define SN_id_GostR3410_2001_CryptoPro_XchB_ParamSet "id-GostR3410-2001-CryptoPro-XchB-ParamSet" +#define NID_id_GostR3410_2001_CryptoPro_XchB_ParamSet 844 +#define OBJ_id_GostR3410_2001_CryptoPro_XchB_ParamSet OBJ_cryptopro,36L,1L + +#define SN_id_GostR3410_94_a "id-GostR3410-94-a" +#define NID_id_GostR3410_94_a 845 +#define OBJ_id_GostR3410_94_a OBJ_id_GostR3410_94,1L + +#define SN_id_GostR3410_94_aBis "id-GostR3410-94-aBis" +#define NID_id_GostR3410_94_aBis 846 +#define OBJ_id_GostR3410_94_aBis OBJ_id_GostR3410_94,2L + +#define SN_id_GostR3410_94_b "id-GostR3410-94-b" +#define NID_id_GostR3410_94_b 847 +#define OBJ_id_GostR3410_94_b OBJ_id_GostR3410_94,3L + +#define SN_id_GostR3410_94_bBis "id-GostR3410-94-bBis" +#define NID_id_GostR3410_94_bBis 848 +#define OBJ_id_GostR3410_94_bBis OBJ_id_GostR3410_94,4L + +#define SN_id_Gost28147_89_cc "id-Gost28147-89-cc" +#define LN_id_Gost28147_89_cc "GOST 28147-89 Cryptocom ParamSet" +#define NID_id_Gost28147_89_cc 849 +#define OBJ_id_Gost28147_89_cc OBJ_cryptocom,1L,6L,1L + +#define SN_id_GostR3410_94_cc "gost94cc" +#define LN_id_GostR3410_94_cc "GOST 34.10-94 Cryptocom" +#define NID_id_GostR3410_94_cc 850 +#define OBJ_id_GostR3410_94_cc OBJ_cryptocom,1L,5L,3L + +#define SN_id_GostR3410_2001_cc "gost2001cc" +#define LN_id_GostR3410_2001_cc "GOST 34.10-2001 Cryptocom" +#define NID_id_GostR3410_2001_cc 851 +#define OBJ_id_GostR3410_2001_cc OBJ_cryptocom,1L,5L,4L + +#define SN_id_GostR3411_94_with_GostR3410_94_cc "id-GostR3411-94-with-GostR3410-94-cc" +#define LN_id_GostR3411_94_with_GostR3410_94_cc "GOST R 34.11-94 with GOST R 34.10-94 Cryptocom" +#define NID_id_GostR3411_94_with_GostR3410_94_cc 852 +#define OBJ_id_GostR3411_94_with_GostR3410_94_cc OBJ_cryptocom,1L,3L,3L + +#define SN_id_GostR3411_94_with_GostR3410_2001_cc "id-GostR3411-94-with-GostR3410-2001-cc" +#define LN_id_GostR3411_94_with_GostR3410_2001_cc "GOST R 34.11-94 with GOST R 34.10-2001 Cryptocom" +#define NID_id_GostR3411_94_with_GostR3410_2001_cc 853 +#define OBJ_id_GostR3411_94_with_GostR3410_2001_cc OBJ_cryptocom,1L,3L,4L + +#define SN_id_GostR3410_2001_ParamSet_cc "id-GostR3410-2001-ParamSet-cc" +#define LN_id_GostR3410_2001_ParamSet_cc "GOST R 3410-2001 Parameter Set Cryptocom" +#define NID_id_GostR3410_2001_ParamSet_cc 854 +#define OBJ_id_GostR3410_2001_ParamSet_cc OBJ_cryptocom,1L,8L,1L + +#define SN_camellia_128_cbc "CAMELLIA-128-CBC" +#define LN_camellia_128_cbc "camellia-128-cbc" +#define NID_camellia_128_cbc 751 +#define OBJ_camellia_128_cbc 1L,2L,392L,200011L,61L,1L,1L,1L,2L + +#define SN_camellia_192_cbc "CAMELLIA-192-CBC" +#define LN_camellia_192_cbc "camellia-192-cbc" +#define NID_camellia_192_cbc 752 +#define OBJ_camellia_192_cbc 1L,2L,392L,200011L,61L,1L,1L,1L,3L + +#define SN_camellia_256_cbc "CAMELLIA-256-CBC" +#define LN_camellia_256_cbc "camellia-256-cbc" +#define NID_camellia_256_cbc 753 +#define OBJ_camellia_256_cbc 1L,2L,392L,200011L,61L,1L,1L,1L,4L + +#define SN_id_camellia128_wrap "id-camellia128-wrap" +#define NID_id_camellia128_wrap 907 +#define OBJ_id_camellia128_wrap 1L,2L,392L,200011L,61L,1L,1L,3L,2L + +#define SN_id_camellia192_wrap "id-camellia192-wrap" +#define NID_id_camellia192_wrap 908 +#define OBJ_id_camellia192_wrap 1L,2L,392L,200011L,61L,1L,1L,3L,3L + +#define SN_id_camellia256_wrap "id-camellia256-wrap" +#define NID_id_camellia256_wrap 909 +#define OBJ_id_camellia256_wrap 1L,2L,392L,200011L,61L,1L,1L,3L,4L + +#define OBJ_ntt_ds 0L,3L,4401L,5L + +#define OBJ_camellia OBJ_ntt_ds,3L,1L,9L + +#define SN_camellia_128_ecb "CAMELLIA-128-ECB" +#define LN_camellia_128_ecb "camellia-128-ecb" +#define NID_camellia_128_ecb 754 +#define OBJ_camellia_128_ecb OBJ_camellia,1L + +#define SN_camellia_128_ofb128 "CAMELLIA-128-OFB" +#define LN_camellia_128_ofb128 "camellia-128-ofb" +#define NID_camellia_128_ofb128 766 +#define OBJ_camellia_128_ofb128 OBJ_camellia,3L + +#define SN_camellia_128_cfb128 "CAMELLIA-128-CFB" +#define LN_camellia_128_cfb128 "camellia-128-cfb" +#define NID_camellia_128_cfb128 757 +#define OBJ_camellia_128_cfb128 OBJ_camellia,4L + +#define SN_camellia_192_ecb "CAMELLIA-192-ECB" +#define LN_camellia_192_ecb "camellia-192-ecb" +#define NID_camellia_192_ecb 755 +#define OBJ_camellia_192_ecb OBJ_camellia,21L + +#define SN_camellia_192_ofb128 "CAMELLIA-192-OFB" +#define LN_camellia_192_ofb128 "camellia-192-ofb" +#define NID_camellia_192_ofb128 767 +#define OBJ_camellia_192_ofb128 OBJ_camellia,23L + +#define SN_camellia_192_cfb128 "CAMELLIA-192-CFB" +#define LN_camellia_192_cfb128 "camellia-192-cfb" +#define NID_camellia_192_cfb128 758 +#define OBJ_camellia_192_cfb128 OBJ_camellia,24L + +#define SN_camellia_256_ecb "CAMELLIA-256-ECB" +#define LN_camellia_256_ecb "camellia-256-ecb" +#define NID_camellia_256_ecb 756 +#define OBJ_camellia_256_ecb OBJ_camellia,41L + +#define SN_camellia_256_ofb128 "CAMELLIA-256-OFB" +#define LN_camellia_256_ofb128 "camellia-256-ofb" +#define NID_camellia_256_ofb128 768 +#define OBJ_camellia_256_ofb128 OBJ_camellia,43L + +#define SN_camellia_256_cfb128 "CAMELLIA-256-CFB" +#define LN_camellia_256_cfb128 "camellia-256-cfb" +#define NID_camellia_256_cfb128 759 +#define OBJ_camellia_256_cfb128 OBJ_camellia,44L + +#define SN_camellia_128_cfb1 "CAMELLIA-128-CFB1" +#define LN_camellia_128_cfb1 "camellia-128-cfb1" +#define NID_camellia_128_cfb1 760 + +#define SN_camellia_192_cfb1 "CAMELLIA-192-CFB1" +#define LN_camellia_192_cfb1 "camellia-192-cfb1" +#define NID_camellia_192_cfb1 761 + +#define SN_camellia_256_cfb1 "CAMELLIA-256-CFB1" +#define LN_camellia_256_cfb1 "camellia-256-cfb1" +#define NID_camellia_256_cfb1 762 + +#define SN_camellia_128_cfb8 "CAMELLIA-128-CFB8" +#define LN_camellia_128_cfb8 "camellia-128-cfb8" +#define NID_camellia_128_cfb8 763 + +#define SN_camellia_192_cfb8 "CAMELLIA-192-CFB8" +#define LN_camellia_192_cfb8 "camellia-192-cfb8" +#define NID_camellia_192_cfb8 764 + +#define SN_camellia_256_cfb8 "CAMELLIA-256-CFB8" +#define LN_camellia_256_cfb8 "camellia-256-cfb8" +#define NID_camellia_256_cfb8 765 + +#define SN_kisa "KISA" +#define LN_kisa "kisa" +#define NID_kisa 773 +#define OBJ_kisa OBJ_member_body,410L,200004L + +#define SN_seed_ecb "SEED-ECB" +#define LN_seed_ecb "seed-ecb" +#define NID_seed_ecb 776 +#define OBJ_seed_ecb OBJ_kisa,1L,3L + +#define SN_seed_cbc "SEED-CBC" +#define LN_seed_cbc "seed-cbc" +#define NID_seed_cbc 777 +#define OBJ_seed_cbc OBJ_kisa,1L,4L + +#define SN_seed_cfb128 "SEED-CFB" +#define LN_seed_cfb128 "seed-cfb" +#define NID_seed_cfb128 779 +#define OBJ_seed_cfb128 OBJ_kisa,1L,5L + +#define SN_seed_ofb128 "SEED-OFB" +#define LN_seed_ofb128 "seed-ofb" +#define NID_seed_ofb128 778 +#define OBJ_seed_ofb128 OBJ_kisa,1L,6L + +#define SN_hmac "HMAC" +#define LN_hmac "hmac" +#define NID_hmac 855 + +#define SN_cmac "CMAC" +#define LN_cmac "cmac" +#define NID_cmac 894 + +#define SN_rc4_hmac_md5 "RC4-HMAC-MD5" +#define LN_rc4_hmac_md5 "rc4-hmac-md5" +#define NID_rc4_hmac_md5 915 + +#define SN_aes_128_cbc_hmac_sha1 "AES-128-CBC-HMAC-SHA1" +#define LN_aes_128_cbc_hmac_sha1 "aes-128-cbc-hmac-sha1" +#define NID_aes_128_cbc_hmac_sha1 916 + +#define SN_aes_192_cbc_hmac_sha1 "AES-192-CBC-HMAC-SHA1" +#define LN_aes_192_cbc_hmac_sha1 "aes-192-cbc-hmac-sha1" +#define NID_aes_192_cbc_hmac_sha1 917 + +#define SN_aes_256_cbc_hmac_sha1 "AES-256-CBC-HMAC-SHA1" +#define LN_aes_256_cbc_hmac_sha1 "aes-256-cbc-hmac-sha1" +#define NID_aes_256_cbc_hmac_sha1 918 + +#define SN_aes_128_cbc_hmac_sha256 "AES-128-CBC-HMAC-SHA256" +#define LN_aes_128_cbc_hmac_sha256 "aes-128-cbc-hmac-sha256" +#define NID_aes_128_cbc_hmac_sha256 948 + +#define SN_aes_192_cbc_hmac_sha256 "AES-192-CBC-HMAC-SHA256" +#define LN_aes_192_cbc_hmac_sha256 "aes-192-cbc-hmac-sha256" +#define NID_aes_192_cbc_hmac_sha256 949 + +#define SN_aes_256_cbc_hmac_sha256 "AES-256-CBC-HMAC-SHA256" +#define LN_aes_256_cbc_hmac_sha256 "aes-256-cbc-hmac-sha256" +#define NID_aes_256_cbc_hmac_sha256 950 + +#define SN_dhpublicnumber "dhpublicnumber" +#define LN_dhpublicnumber "X9.42 DH" +#define NID_dhpublicnumber 920 +#define OBJ_dhpublicnumber OBJ_ISO_US,10046L,2L,1L + +#define SN_brainpoolP160r1 "brainpoolP160r1" +#define NID_brainpoolP160r1 921 +#define OBJ_brainpoolP160r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,1L + +#define SN_brainpoolP160t1 "brainpoolP160t1" +#define NID_brainpoolP160t1 922 +#define OBJ_brainpoolP160t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,2L + +#define SN_brainpoolP192r1 "brainpoolP192r1" +#define NID_brainpoolP192r1 923 +#define OBJ_brainpoolP192r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,3L + +#define SN_brainpoolP192t1 "brainpoolP192t1" +#define NID_brainpoolP192t1 924 +#define OBJ_brainpoolP192t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,4L + +#define SN_brainpoolP224r1 "brainpoolP224r1" +#define NID_brainpoolP224r1 925 +#define OBJ_brainpoolP224r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,5L + +#define SN_brainpoolP224t1 "brainpoolP224t1" +#define NID_brainpoolP224t1 926 +#define OBJ_brainpoolP224t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,6L + +#define SN_brainpoolP256r1 "brainpoolP256r1" +#define NID_brainpoolP256r1 927 +#define OBJ_brainpoolP256r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,7L + +#define SN_brainpoolP256t1 "brainpoolP256t1" +#define NID_brainpoolP256t1 928 +#define OBJ_brainpoolP256t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,8L + +#define SN_brainpoolP320r1 "brainpoolP320r1" +#define NID_brainpoolP320r1 929 +#define OBJ_brainpoolP320r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,9L + +#define SN_brainpoolP320t1 "brainpoolP320t1" +#define NID_brainpoolP320t1 930 +#define OBJ_brainpoolP320t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,10L + +#define SN_brainpoolP384r1 "brainpoolP384r1" +#define NID_brainpoolP384r1 931 +#define OBJ_brainpoolP384r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,11L + +#define SN_brainpoolP384t1 "brainpoolP384t1" +#define NID_brainpoolP384t1 932 +#define OBJ_brainpoolP384t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,12L + +#define SN_brainpoolP512r1 "brainpoolP512r1" +#define NID_brainpoolP512r1 933 +#define OBJ_brainpoolP512r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,13L + +#define SN_brainpoolP512t1 "brainpoolP512t1" +#define NID_brainpoolP512t1 934 +#define OBJ_brainpoolP512t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,14L + +#define OBJ_x9_63_scheme 1L,3L,133L,16L,840L,63L,0L + +#define OBJ_secg_scheme OBJ_certicom_arc,1L + +#define SN_dhSinglePass_stdDH_sha1kdf_scheme "dhSinglePass-stdDH-sha1kdf-scheme" +#define NID_dhSinglePass_stdDH_sha1kdf_scheme 936 +#define OBJ_dhSinglePass_stdDH_sha1kdf_scheme OBJ_x9_63_scheme,2L + +#define SN_dhSinglePass_stdDH_sha224kdf_scheme "dhSinglePass-stdDH-sha224kdf-scheme" +#define NID_dhSinglePass_stdDH_sha224kdf_scheme 937 +#define OBJ_dhSinglePass_stdDH_sha224kdf_scheme OBJ_secg_scheme,11L,0L + +#define SN_dhSinglePass_stdDH_sha256kdf_scheme "dhSinglePass-stdDH-sha256kdf-scheme" +#define NID_dhSinglePass_stdDH_sha256kdf_scheme 938 +#define OBJ_dhSinglePass_stdDH_sha256kdf_scheme OBJ_secg_scheme,11L,1L + +#define SN_dhSinglePass_stdDH_sha384kdf_scheme "dhSinglePass-stdDH-sha384kdf-scheme" +#define NID_dhSinglePass_stdDH_sha384kdf_scheme 939 +#define OBJ_dhSinglePass_stdDH_sha384kdf_scheme OBJ_secg_scheme,11L,2L + +#define SN_dhSinglePass_stdDH_sha512kdf_scheme "dhSinglePass-stdDH-sha512kdf-scheme" +#define NID_dhSinglePass_stdDH_sha512kdf_scheme 940 +#define OBJ_dhSinglePass_stdDH_sha512kdf_scheme OBJ_secg_scheme,11L,3L + +#define SN_dhSinglePass_cofactorDH_sha1kdf_scheme "dhSinglePass-cofactorDH-sha1kdf-scheme" +#define NID_dhSinglePass_cofactorDH_sha1kdf_scheme 941 +#define OBJ_dhSinglePass_cofactorDH_sha1kdf_scheme OBJ_x9_63_scheme,3L + +#define SN_dhSinglePass_cofactorDH_sha224kdf_scheme "dhSinglePass-cofactorDH-sha224kdf-scheme" +#define NID_dhSinglePass_cofactorDH_sha224kdf_scheme 942 +#define OBJ_dhSinglePass_cofactorDH_sha224kdf_scheme OBJ_secg_scheme,14L,0L + +#define SN_dhSinglePass_cofactorDH_sha256kdf_scheme "dhSinglePass-cofactorDH-sha256kdf-scheme" +#define NID_dhSinglePass_cofactorDH_sha256kdf_scheme 943 +#define OBJ_dhSinglePass_cofactorDH_sha256kdf_scheme OBJ_secg_scheme,14L,1L + +#define SN_dhSinglePass_cofactorDH_sha384kdf_scheme "dhSinglePass-cofactorDH-sha384kdf-scheme" +#define NID_dhSinglePass_cofactorDH_sha384kdf_scheme 944 +#define OBJ_dhSinglePass_cofactorDH_sha384kdf_scheme OBJ_secg_scheme,14L,2L + +#define SN_dhSinglePass_cofactorDH_sha512kdf_scheme "dhSinglePass-cofactorDH-sha512kdf-scheme" +#define NID_dhSinglePass_cofactorDH_sha512kdf_scheme 945 +#define OBJ_dhSinglePass_cofactorDH_sha512kdf_scheme OBJ_secg_scheme,14L,3L + +#define SN_dh_std_kdf "dh-std-kdf" +#define NID_dh_std_kdf 946 + +#define SN_dh_cofactor_kdf "dh-cofactor-kdf" +#define NID_dh_cofactor_kdf 947 + +#define SN_ct_precert_scts "ct_precert_scts" +#define LN_ct_precert_scts "CT Precertificate SCTs" +#define NID_ct_precert_scts 951 +#define OBJ_ct_precert_scts 1L,3L,6L,1L,4L,1L,11129L,2L,4L,2L + +#define SN_ct_precert_poison "ct_precert_poison" +#define LN_ct_precert_poison "CT Precertificate Poison" +#define NID_ct_precert_poison 952 +#define OBJ_ct_precert_poison 1L,3L,6L,1L,4L,1L,11129L,2L,4L,3L + +#define SN_ct_precert_signer "ct_precert_signer" +#define LN_ct_precert_signer "CT Precertificate Signer" +#define NID_ct_precert_signer 953 +#define OBJ_ct_precert_signer 1L,3L,6L,1L,4L,1L,11129L,2L,4L,4L + +#define SN_ct_cert_scts "ct_cert_scts" +#define LN_ct_cert_scts "CT Certificate SCTs" +#define NID_ct_cert_scts 954 +#define OBJ_ct_cert_scts 1L,3L,6L,1L,4L,1L,11129L,2L,4L,5L + +#define SN_jurisdictionLocalityName "jurisdictionL" +#define LN_jurisdictionLocalityName "jurisdictionLocalityName" +#define NID_jurisdictionLocalityName 955 +#define OBJ_jurisdictionLocalityName 1L,3L,6L,1L,4L,1L,311L,60L,2L,1L,1L + +#define SN_jurisdictionStateOrProvinceName "jurisdictionST" +#define LN_jurisdictionStateOrProvinceName "jurisdictionStateOrProvinceName" +#define NID_jurisdictionStateOrProvinceName 956 +#define OBJ_jurisdictionStateOrProvinceName 1L,3L,6L,1L,4L,1L,311L,60L,2L,1L,2L + +#define SN_jurisdictionCountryName "jurisdictionC" +#define LN_jurisdictionCountryName "jurisdictionCountryName" +#define NID_jurisdictionCountryName 957 +#define OBJ_jurisdictionCountryName 1L,3L,6L,1L,4L,1L,311L,60L,2L,1L,3L diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/objects.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/objects.h new file mode 100644 index 0000000..b8dafa8 --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/objects.h @@ -0,0 +1,1143 @@ +/* crypto/objects/objects.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_OBJECTS_H +# define HEADER_OBJECTS_H + +# define USE_OBJ_MAC + +# ifdef USE_OBJ_MAC +# include +# else +# define SN_undef "UNDEF" +# define LN_undef "undefined" +# define NID_undef 0 +# define OBJ_undef 0L + +# define SN_Algorithm "Algorithm" +# define LN_algorithm "algorithm" +# define NID_algorithm 38 +# define OBJ_algorithm 1L,3L,14L,3L,2L + +# define LN_rsadsi "rsadsi" +# define NID_rsadsi 1 +# define OBJ_rsadsi 1L,2L,840L,113549L + +# define LN_pkcs "pkcs" +# define NID_pkcs 2 +# define OBJ_pkcs OBJ_rsadsi,1L + +# define SN_md2 "MD2" +# define LN_md2 "md2" +# define NID_md2 3 +# define OBJ_md2 OBJ_rsadsi,2L,2L + +# define SN_md5 "MD5" +# define LN_md5 "md5" +# define NID_md5 4 +# define OBJ_md5 OBJ_rsadsi,2L,5L + +# define SN_rc4 "RC4" +# define LN_rc4 "rc4" +# define NID_rc4 5 +# define OBJ_rc4 OBJ_rsadsi,3L,4L + +# define LN_rsaEncryption "rsaEncryption" +# define NID_rsaEncryption 6 +# define OBJ_rsaEncryption OBJ_pkcs,1L,1L + +# define SN_md2WithRSAEncryption "RSA-MD2" +# define LN_md2WithRSAEncryption "md2WithRSAEncryption" +# define NID_md2WithRSAEncryption 7 +# define OBJ_md2WithRSAEncryption OBJ_pkcs,1L,2L + +# define SN_md5WithRSAEncryption "RSA-MD5" +# define LN_md5WithRSAEncryption "md5WithRSAEncryption" +# define NID_md5WithRSAEncryption 8 +# define OBJ_md5WithRSAEncryption OBJ_pkcs,1L,4L + +# define SN_pbeWithMD2AndDES_CBC "PBE-MD2-DES" +# define LN_pbeWithMD2AndDES_CBC "pbeWithMD2AndDES-CBC" +# define NID_pbeWithMD2AndDES_CBC 9 +# define OBJ_pbeWithMD2AndDES_CBC OBJ_pkcs,5L,1L + +# define SN_pbeWithMD5AndDES_CBC "PBE-MD5-DES" +# define LN_pbeWithMD5AndDES_CBC "pbeWithMD5AndDES-CBC" +# define NID_pbeWithMD5AndDES_CBC 10 +# define OBJ_pbeWithMD5AndDES_CBC OBJ_pkcs,5L,3L + +# define LN_X500 "X500" +# define NID_X500 11 +# define OBJ_X500 2L,5L + +# define LN_X509 "X509" +# define NID_X509 12 +# define OBJ_X509 OBJ_X500,4L + +# define SN_commonName "CN" +# define LN_commonName "commonName" +# define NID_commonName 13 +# define OBJ_commonName OBJ_X509,3L + +# define SN_countryName "C" +# define LN_countryName "countryName" +# define NID_countryName 14 +# define OBJ_countryName OBJ_X509,6L + +# define SN_localityName "L" +# define LN_localityName "localityName" +# define NID_localityName 15 +# define OBJ_localityName OBJ_X509,7L + +/* Postal Address? PA */ + +/* should be "ST" (rfc1327) but MS uses 'S' */ +# define SN_stateOrProvinceName "ST" +# define LN_stateOrProvinceName "stateOrProvinceName" +# define NID_stateOrProvinceName 16 +# define OBJ_stateOrProvinceName OBJ_X509,8L + +# define SN_organizationName "O" +# define LN_organizationName "organizationName" +# define NID_organizationName 17 +# define OBJ_organizationName OBJ_X509,10L + +# define SN_organizationalUnitName "OU" +# define LN_organizationalUnitName "organizationalUnitName" +# define NID_organizationalUnitName 18 +# define OBJ_organizationalUnitName OBJ_X509,11L + +# define SN_rsa "RSA" +# define LN_rsa "rsa" +# define NID_rsa 19 +# define OBJ_rsa OBJ_X500,8L,1L,1L + +# define LN_pkcs7 "pkcs7" +# define NID_pkcs7 20 +# define OBJ_pkcs7 OBJ_pkcs,7L + +# define LN_pkcs7_data "pkcs7-data" +# define NID_pkcs7_data 21 +# define OBJ_pkcs7_data OBJ_pkcs7,1L + +# define LN_pkcs7_signed "pkcs7-signedData" +# define NID_pkcs7_signed 22 +# define OBJ_pkcs7_signed OBJ_pkcs7,2L + +# define LN_pkcs7_enveloped "pkcs7-envelopedData" +# define NID_pkcs7_enveloped 23 +# define OBJ_pkcs7_enveloped OBJ_pkcs7,3L + +# define LN_pkcs7_signedAndEnveloped "pkcs7-signedAndEnvelopedData" +# define NID_pkcs7_signedAndEnveloped 24 +# define OBJ_pkcs7_signedAndEnveloped OBJ_pkcs7,4L + +# define LN_pkcs7_digest "pkcs7-digestData" +# define NID_pkcs7_digest 25 +# define OBJ_pkcs7_digest OBJ_pkcs7,5L + +# define LN_pkcs7_encrypted "pkcs7-encryptedData" +# define NID_pkcs7_encrypted 26 +# define OBJ_pkcs7_encrypted OBJ_pkcs7,6L + +# define LN_pkcs3 "pkcs3" +# define NID_pkcs3 27 +# define OBJ_pkcs3 OBJ_pkcs,3L + +# define LN_dhKeyAgreement "dhKeyAgreement" +# define NID_dhKeyAgreement 28 +# define OBJ_dhKeyAgreement OBJ_pkcs3,1L + +# define SN_des_ecb "DES-ECB" +# define LN_des_ecb "des-ecb" +# define NID_des_ecb 29 +# define OBJ_des_ecb OBJ_algorithm,6L + +# define SN_des_cfb64 "DES-CFB" +# define LN_des_cfb64 "des-cfb" +# define NID_des_cfb64 30 +/* IV + num */ +# define OBJ_des_cfb64 OBJ_algorithm,9L + +# define SN_des_cbc "DES-CBC" +# define LN_des_cbc "des-cbc" +# define NID_des_cbc 31 +/* IV */ +# define OBJ_des_cbc OBJ_algorithm,7L + +# define SN_des_ede "DES-EDE" +# define LN_des_ede "des-ede" +# define NID_des_ede 32 +/* ?? */ +# define OBJ_des_ede OBJ_algorithm,17L + +# define SN_des_ede3 "DES-EDE3" +# define LN_des_ede3 "des-ede3" +# define NID_des_ede3 33 + +# define SN_idea_cbc "IDEA-CBC" +# define LN_idea_cbc "idea-cbc" +# define NID_idea_cbc 34 +# define OBJ_idea_cbc 1L,3L,6L,1L,4L,1L,188L,7L,1L,1L,2L + +# define SN_idea_cfb64 "IDEA-CFB" +# define LN_idea_cfb64 "idea-cfb" +# define NID_idea_cfb64 35 + +# define SN_idea_ecb "IDEA-ECB" +# define LN_idea_ecb "idea-ecb" +# define NID_idea_ecb 36 + +# define SN_rc2_cbc "RC2-CBC" +# define LN_rc2_cbc "rc2-cbc" +# define NID_rc2_cbc 37 +# define OBJ_rc2_cbc OBJ_rsadsi,3L,2L + +# define SN_rc2_ecb "RC2-ECB" +# define LN_rc2_ecb "rc2-ecb" +# define NID_rc2_ecb 38 + +# define SN_rc2_cfb64 "RC2-CFB" +# define LN_rc2_cfb64 "rc2-cfb" +# define NID_rc2_cfb64 39 + +# define SN_rc2_ofb64 "RC2-OFB" +# define LN_rc2_ofb64 "rc2-ofb" +# define NID_rc2_ofb64 40 + +# define SN_sha "SHA" +# define LN_sha "sha" +# define NID_sha 41 +# define OBJ_sha OBJ_algorithm,18L + +# define SN_shaWithRSAEncryption "RSA-SHA" +# define LN_shaWithRSAEncryption "shaWithRSAEncryption" +# define NID_shaWithRSAEncryption 42 +# define OBJ_shaWithRSAEncryption OBJ_algorithm,15L + +# define SN_des_ede_cbc "DES-EDE-CBC" +# define LN_des_ede_cbc "des-ede-cbc" +# define NID_des_ede_cbc 43 + +# define SN_des_ede3_cbc "DES-EDE3-CBC" +# define LN_des_ede3_cbc "des-ede3-cbc" +# define NID_des_ede3_cbc 44 +# define OBJ_des_ede3_cbc OBJ_rsadsi,3L,7L + +# define SN_des_ofb64 "DES-OFB" +# define LN_des_ofb64 "des-ofb" +# define NID_des_ofb64 45 +# define OBJ_des_ofb64 OBJ_algorithm,8L + +# define SN_idea_ofb64 "IDEA-OFB" +# define LN_idea_ofb64 "idea-ofb" +# define NID_idea_ofb64 46 + +# define LN_pkcs9 "pkcs9" +# define NID_pkcs9 47 +# define OBJ_pkcs9 OBJ_pkcs,9L + +# define SN_pkcs9_emailAddress "Email" +# define LN_pkcs9_emailAddress "emailAddress" +# define NID_pkcs9_emailAddress 48 +# define OBJ_pkcs9_emailAddress OBJ_pkcs9,1L + +# define LN_pkcs9_unstructuredName "unstructuredName" +# define NID_pkcs9_unstructuredName 49 +# define OBJ_pkcs9_unstructuredName OBJ_pkcs9,2L + +# define LN_pkcs9_contentType "contentType" +# define NID_pkcs9_contentType 50 +# define OBJ_pkcs9_contentType OBJ_pkcs9,3L + +# define LN_pkcs9_messageDigest "messageDigest" +# define NID_pkcs9_messageDigest 51 +# define OBJ_pkcs9_messageDigest OBJ_pkcs9,4L + +# define LN_pkcs9_signingTime "signingTime" +# define NID_pkcs9_signingTime 52 +# define OBJ_pkcs9_signingTime OBJ_pkcs9,5L + +# define LN_pkcs9_countersignature "countersignature" +# define NID_pkcs9_countersignature 53 +# define OBJ_pkcs9_countersignature OBJ_pkcs9,6L + +# define LN_pkcs9_challengePassword "challengePassword" +# define NID_pkcs9_challengePassword 54 +# define OBJ_pkcs9_challengePassword OBJ_pkcs9,7L + +# define LN_pkcs9_unstructuredAddress "unstructuredAddress" +# define NID_pkcs9_unstructuredAddress 55 +# define OBJ_pkcs9_unstructuredAddress OBJ_pkcs9,8L + +# define LN_pkcs9_extCertAttributes "extendedCertificateAttributes" +# define NID_pkcs9_extCertAttributes 56 +# define OBJ_pkcs9_extCertAttributes OBJ_pkcs9,9L + +# define SN_netscape "Netscape" +# define LN_netscape "Netscape Communications Corp." +# define NID_netscape 57 +# define OBJ_netscape 2L,16L,840L,1L,113730L + +# define SN_netscape_cert_extension "nsCertExt" +# define LN_netscape_cert_extension "Netscape Certificate Extension" +# define NID_netscape_cert_extension 58 +# define OBJ_netscape_cert_extension OBJ_netscape,1L + +# define SN_netscape_data_type "nsDataType" +# define LN_netscape_data_type "Netscape Data Type" +# define NID_netscape_data_type 59 +# define OBJ_netscape_data_type OBJ_netscape,2L + +# define SN_des_ede_cfb64 "DES-EDE-CFB" +# define LN_des_ede_cfb64 "des-ede-cfb" +# define NID_des_ede_cfb64 60 + +# define SN_des_ede3_cfb64 "DES-EDE3-CFB" +# define LN_des_ede3_cfb64 "des-ede3-cfb" +# define NID_des_ede3_cfb64 61 + +# define SN_des_ede_ofb64 "DES-EDE-OFB" +# define LN_des_ede_ofb64 "des-ede-ofb" +# define NID_des_ede_ofb64 62 + +# define SN_des_ede3_ofb64 "DES-EDE3-OFB" +# define LN_des_ede3_ofb64 "des-ede3-ofb" +# define NID_des_ede3_ofb64 63 + +/* I'm not sure about the object ID */ +# define SN_sha1 "SHA1" +# define LN_sha1 "sha1" +# define NID_sha1 64 +# define OBJ_sha1 OBJ_algorithm,26L +/* 28 Jun 1996 - eay */ +/* #define OBJ_sha1 1L,3L,14L,2L,26L,05L <- wrong */ + +# define SN_sha1WithRSAEncryption "RSA-SHA1" +# define LN_sha1WithRSAEncryption "sha1WithRSAEncryption" +# define NID_sha1WithRSAEncryption 65 +# define OBJ_sha1WithRSAEncryption OBJ_pkcs,1L,5L + +# define SN_dsaWithSHA "DSA-SHA" +# define LN_dsaWithSHA "dsaWithSHA" +# define NID_dsaWithSHA 66 +# define OBJ_dsaWithSHA OBJ_algorithm,13L + +# define SN_dsa_2 "DSA-old" +# define LN_dsa_2 "dsaEncryption-old" +# define NID_dsa_2 67 +# define OBJ_dsa_2 OBJ_algorithm,12L + +/* proposed by microsoft to RSA */ +# define SN_pbeWithSHA1AndRC2_CBC "PBE-SHA1-RC2-64" +# define LN_pbeWithSHA1AndRC2_CBC "pbeWithSHA1AndRC2-CBC" +# define NID_pbeWithSHA1AndRC2_CBC 68 +# define OBJ_pbeWithSHA1AndRC2_CBC OBJ_pkcs,5L,11L + +/* + * proposed by microsoft to RSA as pbeWithSHA1AndRC4: it is now defined + * explicitly in PKCS#5 v2.0 as id-PBKDF2 which is something completely + * different. + */ +# define LN_id_pbkdf2 "PBKDF2" +# define NID_id_pbkdf2 69 +# define OBJ_id_pbkdf2 OBJ_pkcs,5L,12L + +# define SN_dsaWithSHA1_2 "DSA-SHA1-old" +# define LN_dsaWithSHA1_2 "dsaWithSHA1-old" +# define NID_dsaWithSHA1_2 70 +/* Got this one from 'sdn706r20.pdf' which is actually an NSA document :-) */ +# define OBJ_dsaWithSHA1_2 OBJ_algorithm,27L + +# define SN_netscape_cert_type "nsCertType" +# define LN_netscape_cert_type "Netscape Cert Type" +# define NID_netscape_cert_type 71 +# define OBJ_netscape_cert_type OBJ_netscape_cert_extension,1L + +# define SN_netscape_base_url "nsBaseUrl" +# define LN_netscape_base_url "Netscape Base Url" +# define NID_netscape_base_url 72 +# define OBJ_netscape_base_url OBJ_netscape_cert_extension,2L + +# define SN_netscape_revocation_url "nsRevocationUrl" +# define LN_netscape_revocation_url "Netscape Revocation Url" +# define NID_netscape_revocation_url 73 +# define OBJ_netscape_revocation_url OBJ_netscape_cert_extension,3L + +# define SN_netscape_ca_revocation_url "nsCaRevocationUrl" +# define LN_netscape_ca_revocation_url "Netscape CA Revocation Url" +# define NID_netscape_ca_revocation_url 74 +# define OBJ_netscape_ca_revocation_url OBJ_netscape_cert_extension,4L + +# define SN_netscape_renewal_url "nsRenewalUrl" +# define LN_netscape_renewal_url "Netscape Renewal Url" +# define NID_netscape_renewal_url 75 +# define OBJ_netscape_renewal_url OBJ_netscape_cert_extension,7L + +# define SN_netscape_ca_policy_url "nsCaPolicyUrl" +# define LN_netscape_ca_policy_url "Netscape CA Policy Url" +# define NID_netscape_ca_policy_url 76 +# define OBJ_netscape_ca_policy_url OBJ_netscape_cert_extension,8L + +# define SN_netscape_ssl_server_name "nsSslServerName" +# define LN_netscape_ssl_server_name "Netscape SSL Server Name" +# define NID_netscape_ssl_server_name 77 +# define OBJ_netscape_ssl_server_name OBJ_netscape_cert_extension,12L + +# define SN_netscape_comment "nsComment" +# define LN_netscape_comment "Netscape Comment" +# define NID_netscape_comment 78 +# define OBJ_netscape_comment OBJ_netscape_cert_extension,13L + +# define SN_netscape_cert_sequence "nsCertSequence" +# define LN_netscape_cert_sequence "Netscape Certificate Sequence" +# define NID_netscape_cert_sequence 79 +# define OBJ_netscape_cert_sequence OBJ_netscape_data_type,5L + +# define SN_desx_cbc "DESX-CBC" +# define LN_desx_cbc "desx-cbc" +# define NID_desx_cbc 80 + +# define SN_id_ce "id-ce" +# define NID_id_ce 81 +# define OBJ_id_ce 2L,5L,29L + +# define SN_subject_key_identifier "subjectKeyIdentifier" +# define LN_subject_key_identifier "X509v3 Subject Key Identifier" +# define NID_subject_key_identifier 82 +# define OBJ_subject_key_identifier OBJ_id_ce,14L + +# define SN_key_usage "keyUsage" +# define LN_key_usage "X509v3 Key Usage" +# define NID_key_usage 83 +# define OBJ_key_usage OBJ_id_ce,15L + +# define SN_private_key_usage_period "privateKeyUsagePeriod" +# define LN_private_key_usage_period "X509v3 Private Key Usage Period" +# define NID_private_key_usage_period 84 +# define OBJ_private_key_usage_period OBJ_id_ce,16L + +# define SN_subject_alt_name "subjectAltName" +# define LN_subject_alt_name "X509v3 Subject Alternative Name" +# define NID_subject_alt_name 85 +# define OBJ_subject_alt_name OBJ_id_ce,17L + +# define SN_issuer_alt_name "issuerAltName" +# define LN_issuer_alt_name "X509v3 Issuer Alternative Name" +# define NID_issuer_alt_name 86 +# define OBJ_issuer_alt_name OBJ_id_ce,18L + +# define SN_basic_constraints "basicConstraints" +# define LN_basic_constraints "X509v3 Basic Constraints" +# define NID_basic_constraints 87 +# define OBJ_basic_constraints OBJ_id_ce,19L + +# define SN_crl_number "crlNumber" +# define LN_crl_number "X509v3 CRL Number" +# define NID_crl_number 88 +# define OBJ_crl_number OBJ_id_ce,20L + +# define SN_certificate_policies "certificatePolicies" +# define LN_certificate_policies "X509v3 Certificate Policies" +# define NID_certificate_policies 89 +# define OBJ_certificate_policies OBJ_id_ce,32L + +# define SN_authority_key_identifier "authorityKeyIdentifier" +# define LN_authority_key_identifier "X509v3 Authority Key Identifier" +# define NID_authority_key_identifier 90 +# define OBJ_authority_key_identifier OBJ_id_ce,35L + +# define SN_bf_cbc "BF-CBC" +# define LN_bf_cbc "bf-cbc" +# define NID_bf_cbc 91 +# define OBJ_bf_cbc 1L,3L,6L,1L,4L,1L,3029L,1L,2L + +# define SN_bf_ecb "BF-ECB" +# define LN_bf_ecb "bf-ecb" +# define NID_bf_ecb 92 + +# define SN_bf_cfb64 "BF-CFB" +# define LN_bf_cfb64 "bf-cfb" +# define NID_bf_cfb64 93 + +# define SN_bf_ofb64 "BF-OFB" +# define LN_bf_ofb64 "bf-ofb" +# define NID_bf_ofb64 94 + +# define SN_mdc2 "MDC2" +# define LN_mdc2 "mdc2" +# define NID_mdc2 95 +# define OBJ_mdc2 2L,5L,8L,3L,101L +/* An alternative? 1L,3L,14L,3L,2L,19L */ + +# define SN_mdc2WithRSA "RSA-MDC2" +# define LN_mdc2WithRSA "mdc2withRSA" +# define NID_mdc2WithRSA 96 +# define OBJ_mdc2WithRSA 2L,5L,8L,3L,100L + +# define SN_rc4_40 "RC4-40" +# define LN_rc4_40 "rc4-40" +# define NID_rc4_40 97 + +# define SN_rc2_40_cbc "RC2-40-CBC" +# define LN_rc2_40_cbc "rc2-40-cbc" +# define NID_rc2_40_cbc 98 + +# define SN_givenName "G" +# define LN_givenName "givenName" +# define NID_givenName 99 +# define OBJ_givenName OBJ_X509,42L + +# define SN_surname "S" +# define LN_surname "surname" +# define NID_surname 100 +# define OBJ_surname OBJ_X509,4L + +# define SN_initials "I" +# define LN_initials "initials" +# define NID_initials 101 +# define OBJ_initials OBJ_X509,43L + +# define SN_uniqueIdentifier "UID" +# define LN_uniqueIdentifier "uniqueIdentifier" +# define NID_uniqueIdentifier 102 +# define OBJ_uniqueIdentifier OBJ_X509,45L + +# define SN_crl_distribution_points "crlDistributionPoints" +# define LN_crl_distribution_points "X509v3 CRL Distribution Points" +# define NID_crl_distribution_points 103 +# define OBJ_crl_distribution_points OBJ_id_ce,31L + +# define SN_md5WithRSA "RSA-NP-MD5" +# define LN_md5WithRSA "md5WithRSA" +# define NID_md5WithRSA 104 +# define OBJ_md5WithRSA OBJ_algorithm,3L + +# define SN_serialNumber "SN" +# define LN_serialNumber "serialNumber" +# define NID_serialNumber 105 +# define OBJ_serialNumber OBJ_X509,5L + +# define SN_title "T" +# define LN_title "title" +# define NID_title 106 +# define OBJ_title OBJ_X509,12L + +# define SN_description "D" +# define LN_description "description" +# define NID_description 107 +# define OBJ_description OBJ_X509,13L + +/* CAST5 is CAST-128, I'm just sticking with the documentation */ +# define SN_cast5_cbc "CAST5-CBC" +# define LN_cast5_cbc "cast5-cbc" +# define NID_cast5_cbc 108 +# define OBJ_cast5_cbc 1L,2L,840L,113533L,7L,66L,10L + +# define SN_cast5_ecb "CAST5-ECB" +# define LN_cast5_ecb "cast5-ecb" +# define NID_cast5_ecb 109 + +# define SN_cast5_cfb64 "CAST5-CFB" +# define LN_cast5_cfb64 "cast5-cfb" +# define NID_cast5_cfb64 110 + +# define SN_cast5_ofb64 "CAST5-OFB" +# define LN_cast5_ofb64 "cast5-ofb" +# define NID_cast5_ofb64 111 + +# define LN_pbeWithMD5AndCast5_CBC "pbeWithMD5AndCast5CBC" +# define NID_pbeWithMD5AndCast5_CBC 112 +# define OBJ_pbeWithMD5AndCast5_CBC 1L,2L,840L,113533L,7L,66L,12L + +/*- + * This is one sun will soon be using :-( + * id-dsa-with-sha1 ID ::= { + * iso(1) member-body(2) us(840) x9-57 (10040) x9cm(4) 3 } + */ +# define SN_dsaWithSHA1 "DSA-SHA1" +# define LN_dsaWithSHA1 "dsaWithSHA1" +# define NID_dsaWithSHA1 113 +# define OBJ_dsaWithSHA1 1L,2L,840L,10040L,4L,3L + +# define NID_md5_sha1 114 +# define SN_md5_sha1 "MD5-SHA1" +# define LN_md5_sha1 "md5-sha1" + +# define SN_sha1WithRSA "RSA-SHA1-2" +# define LN_sha1WithRSA "sha1WithRSA" +# define NID_sha1WithRSA 115 +# define OBJ_sha1WithRSA OBJ_algorithm,29L + +# define SN_dsa "DSA" +# define LN_dsa "dsaEncryption" +# define NID_dsa 116 +# define OBJ_dsa 1L,2L,840L,10040L,4L,1L + +# define SN_ripemd160 "RIPEMD160" +# define LN_ripemd160 "ripemd160" +# define NID_ripemd160 117 +# define OBJ_ripemd160 1L,3L,36L,3L,2L,1L + +/* + * The name should actually be rsaSignatureWithripemd160, but I'm going to + * continue using the convention I'm using with the other ciphers + */ +# define SN_ripemd160WithRSA "RSA-RIPEMD160" +# define LN_ripemd160WithRSA "ripemd160WithRSA" +# define NID_ripemd160WithRSA 119 +# define OBJ_ripemd160WithRSA 1L,3L,36L,3L,3L,1L,2L + +/*- + * Taken from rfc2040 + * RC5_CBC_Parameters ::= SEQUENCE { + * version INTEGER (v1_0(16)), + * rounds INTEGER (8..127), + * blockSizeInBits INTEGER (64, 128), + * iv OCTET STRING OPTIONAL + * } + */ +# define SN_rc5_cbc "RC5-CBC" +# define LN_rc5_cbc "rc5-cbc" +# define NID_rc5_cbc 120 +# define OBJ_rc5_cbc OBJ_rsadsi,3L,8L + +# define SN_rc5_ecb "RC5-ECB" +# define LN_rc5_ecb "rc5-ecb" +# define NID_rc5_ecb 121 + +# define SN_rc5_cfb64 "RC5-CFB" +# define LN_rc5_cfb64 "rc5-cfb" +# define NID_rc5_cfb64 122 + +# define SN_rc5_ofb64 "RC5-OFB" +# define LN_rc5_ofb64 "rc5-ofb" +# define NID_rc5_ofb64 123 + +# define SN_rle_compression "RLE" +# define LN_rle_compression "run length compression" +# define NID_rle_compression 124 +# define OBJ_rle_compression 1L,1L,1L,1L,666L,1L + +# define SN_zlib_compression "ZLIB" +# define LN_zlib_compression "zlib compression" +# define NID_zlib_compression 125 +# define OBJ_zlib_compression 1L,1L,1L,1L,666L,2L + +# define SN_ext_key_usage "extendedKeyUsage" +# define LN_ext_key_usage "X509v3 Extended Key Usage" +# define NID_ext_key_usage 126 +# define OBJ_ext_key_usage OBJ_id_ce,37 + +# define SN_id_pkix "PKIX" +# define NID_id_pkix 127 +# define OBJ_id_pkix 1L,3L,6L,1L,5L,5L,7L + +# define SN_id_kp "id-kp" +# define NID_id_kp 128 +# define OBJ_id_kp OBJ_id_pkix,3L + +/* PKIX extended key usage OIDs */ + +# define SN_server_auth "serverAuth" +# define LN_server_auth "TLS Web Server Authentication" +# define NID_server_auth 129 +# define OBJ_server_auth OBJ_id_kp,1L + +# define SN_client_auth "clientAuth" +# define LN_client_auth "TLS Web Client Authentication" +# define NID_client_auth 130 +# define OBJ_client_auth OBJ_id_kp,2L + +# define SN_code_sign "codeSigning" +# define LN_code_sign "Code Signing" +# define NID_code_sign 131 +# define OBJ_code_sign OBJ_id_kp,3L + +# define SN_email_protect "emailProtection" +# define LN_email_protect "E-mail Protection" +# define NID_email_protect 132 +# define OBJ_email_protect OBJ_id_kp,4L + +# define SN_time_stamp "timeStamping" +# define LN_time_stamp "Time Stamping" +# define NID_time_stamp 133 +# define OBJ_time_stamp OBJ_id_kp,8L + +/* Additional extended key usage OIDs: Microsoft */ + +# define SN_ms_code_ind "msCodeInd" +# define LN_ms_code_ind "Microsoft Individual Code Signing" +# define NID_ms_code_ind 134 +# define OBJ_ms_code_ind 1L,3L,6L,1L,4L,1L,311L,2L,1L,21L + +# define SN_ms_code_com "msCodeCom" +# define LN_ms_code_com "Microsoft Commercial Code Signing" +# define NID_ms_code_com 135 +# define OBJ_ms_code_com 1L,3L,6L,1L,4L,1L,311L,2L,1L,22L + +# define SN_ms_ctl_sign "msCTLSign" +# define LN_ms_ctl_sign "Microsoft Trust List Signing" +# define NID_ms_ctl_sign 136 +# define OBJ_ms_ctl_sign 1L,3L,6L,1L,4L,1L,311L,10L,3L,1L + +# define SN_ms_sgc "msSGC" +# define LN_ms_sgc "Microsoft Server Gated Crypto" +# define NID_ms_sgc 137 +# define OBJ_ms_sgc 1L,3L,6L,1L,4L,1L,311L,10L,3L,3L + +# define SN_ms_efs "msEFS" +# define LN_ms_efs "Microsoft Encrypted File System" +# define NID_ms_efs 138 +# define OBJ_ms_efs 1L,3L,6L,1L,4L,1L,311L,10L,3L,4L + +/* Additional usage: Netscape */ + +# define SN_ns_sgc "nsSGC" +# define LN_ns_sgc "Netscape Server Gated Crypto" +# define NID_ns_sgc 139 +# define OBJ_ns_sgc OBJ_netscape,4L,1L + +# define SN_delta_crl "deltaCRL" +# define LN_delta_crl "X509v3 Delta CRL Indicator" +# define NID_delta_crl 140 +# define OBJ_delta_crl OBJ_id_ce,27L + +# define SN_crl_reason "CRLReason" +# define LN_crl_reason "CRL Reason Code" +# define NID_crl_reason 141 +# define OBJ_crl_reason OBJ_id_ce,21L + +# define SN_invalidity_date "invalidityDate" +# define LN_invalidity_date "Invalidity Date" +# define NID_invalidity_date 142 +# define OBJ_invalidity_date OBJ_id_ce,24L + +# define SN_sxnet "SXNetID" +# define LN_sxnet "Strong Extranet ID" +# define NID_sxnet 143 +# define OBJ_sxnet 1L,3L,101L,1L,4L,1L + +/* PKCS12 and related OBJECT IDENTIFIERS */ + +# define OBJ_pkcs12 OBJ_pkcs,12L +# define OBJ_pkcs12_pbeids OBJ_pkcs12, 1 + +# define SN_pbe_WithSHA1And128BitRC4 "PBE-SHA1-RC4-128" +# define LN_pbe_WithSHA1And128BitRC4 "pbeWithSHA1And128BitRC4" +# define NID_pbe_WithSHA1And128BitRC4 144 +# define OBJ_pbe_WithSHA1And128BitRC4 OBJ_pkcs12_pbeids, 1L + +# define SN_pbe_WithSHA1And40BitRC4 "PBE-SHA1-RC4-40" +# define LN_pbe_WithSHA1And40BitRC4 "pbeWithSHA1And40BitRC4" +# define NID_pbe_WithSHA1And40BitRC4 145 +# define OBJ_pbe_WithSHA1And40BitRC4 OBJ_pkcs12_pbeids, 2L + +# define SN_pbe_WithSHA1And3_Key_TripleDES_CBC "PBE-SHA1-3DES" +# define LN_pbe_WithSHA1And3_Key_TripleDES_CBC "pbeWithSHA1And3-KeyTripleDES-CBC" +# define NID_pbe_WithSHA1And3_Key_TripleDES_CBC 146 +# define OBJ_pbe_WithSHA1And3_Key_TripleDES_CBC OBJ_pkcs12_pbeids, 3L + +# define SN_pbe_WithSHA1And2_Key_TripleDES_CBC "PBE-SHA1-2DES" +# define LN_pbe_WithSHA1And2_Key_TripleDES_CBC "pbeWithSHA1And2-KeyTripleDES-CBC" +# define NID_pbe_WithSHA1And2_Key_TripleDES_CBC 147 +# define OBJ_pbe_WithSHA1And2_Key_TripleDES_CBC OBJ_pkcs12_pbeids, 4L + +# define SN_pbe_WithSHA1And128BitRC2_CBC "PBE-SHA1-RC2-128" +# define LN_pbe_WithSHA1And128BitRC2_CBC "pbeWithSHA1And128BitRC2-CBC" +# define NID_pbe_WithSHA1And128BitRC2_CBC 148 +# define OBJ_pbe_WithSHA1And128BitRC2_CBC OBJ_pkcs12_pbeids, 5L + +# define SN_pbe_WithSHA1And40BitRC2_CBC "PBE-SHA1-RC2-40" +# define LN_pbe_WithSHA1And40BitRC2_CBC "pbeWithSHA1And40BitRC2-CBC" +# define NID_pbe_WithSHA1And40BitRC2_CBC 149 +# define OBJ_pbe_WithSHA1And40BitRC2_CBC OBJ_pkcs12_pbeids, 6L + +# define OBJ_pkcs12_Version1 OBJ_pkcs12, 10L + +# define OBJ_pkcs12_BagIds OBJ_pkcs12_Version1, 1L + +# define LN_keyBag "keyBag" +# define NID_keyBag 150 +# define OBJ_keyBag OBJ_pkcs12_BagIds, 1L + +# define LN_pkcs8ShroudedKeyBag "pkcs8ShroudedKeyBag" +# define NID_pkcs8ShroudedKeyBag 151 +# define OBJ_pkcs8ShroudedKeyBag OBJ_pkcs12_BagIds, 2L + +# define LN_certBag "certBag" +# define NID_certBag 152 +# define OBJ_certBag OBJ_pkcs12_BagIds, 3L + +# define LN_crlBag "crlBag" +# define NID_crlBag 153 +# define OBJ_crlBag OBJ_pkcs12_BagIds, 4L + +# define LN_secretBag "secretBag" +# define NID_secretBag 154 +# define OBJ_secretBag OBJ_pkcs12_BagIds, 5L + +# define LN_safeContentsBag "safeContentsBag" +# define NID_safeContentsBag 155 +# define OBJ_safeContentsBag OBJ_pkcs12_BagIds, 6L + +# define LN_friendlyName "friendlyName" +# define NID_friendlyName 156 +# define OBJ_friendlyName OBJ_pkcs9, 20L + +# define LN_localKeyID "localKeyID" +# define NID_localKeyID 157 +# define OBJ_localKeyID OBJ_pkcs9, 21L + +# define OBJ_certTypes OBJ_pkcs9, 22L + +# define LN_x509Certificate "x509Certificate" +# define NID_x509Certificate 158 +# define OBJ_x509Certificate OBJ_certTypes, 1L + +# define LN_sdsiCertificate "sdsiCertificate" +# define NID_sdsiCertificate 159 +# define OBJ_sdsiCertificate OBJ_certTypes, 2L + +# define OBJ_crlTypes OBJ_pkcs9, 23L + +# define LN_x509Crl "x509Crl" +# define NID_x509Crl 160 +# define OBJ_x509Crl OBJ_crlTypes, 1L + +/* PKCS#5 v2 OIDs */ + +# define LN_pbes2 "PBES2" +# define NID_pbes2 161 +# define OBJ_pbes2 OBJ_pkcs,5L,13L + +# define LN_pbmac1 "PBMAC1" +# define NID_pbmac1 162 +# define OBJ_pbmac1 OBJ_pkcs,5L,14L + +# define LN_hmacWithSHA1 "hmacWithSHA1" +# define NID_hmacWithSHA1 163 +# define OBJ_hmacWithSHA1 OBJ_rsadsi,2L,7L + +/* Policy Qualifier Ids */ + +# define LN_id_qt_cps "Policy Qualifier CPS" +# define SN_id_qt_cps "id-qt-cps" +# define NID_id_qt_cps 164 +# define OBJ_id_qt_cps OBJ_id_pkix,2L,1L + +# define LN_id_qt_unotice "Policy Qualifier User Notice" +# define SN_id_qt_unotice "id-qt-unotice" +# define NID_id_qt_unotice 165 +# define OBJ_id_qt_unotice OBJ_id_pkix,2L,2L + +# define SN_rc2_64_cbc "RC2-64-CBC" +# define LN_rc2_64_cbc "rc2-64-cbc" +# define NID_rc2_64_cbc 166 + +# define SN_SMIMECapabilities "SMIME-CAPS" +# define LN_SMIMECapabilities "S/MIME Capabilities" +# define NID_SMIMECapabilities 167 +# define OBJ_SMIMECapabilities OBJ_pkcs9,15L + +# define SN_pbeWithMD2AndRC2_CBC "PBE-MD2-RC2-64" +# define LN_pbeWithMD2AndRC2_CBC "pbeWithMD2AndRC2-CBC" +# define NID_pbeWithMD2AndRC2_CBC 168 +# define OBJ_pbeWithMD2AndRC2_CBC OBJ_pkcs,5L,4L + +# define SN_pbeWithMD5AndRC2_CBC "PBE-MD5-RC2-64" +# define LN_pbeWithMD5AndRC2_CBC "pbeWithMD5AndRC2-CBC" +# define NID_pbeWithMD5AndRC2_CBC 169 +# define OBJ_pbeWithMD5AndRC2_CBC OBJ_pkcs,5L,6L + +# define SN_pbeWithSHA1AndDES_CBC "PBE-SHA1-DES" +# define LN_pbeWithSHA1AndDES_CBC "pbeWithSHA1AndDES-CBC" +# define NID_pbeWithSHA1AndDES_CBC 170 +# define OBJ_pbeWithSHA1AndDES_CBC OBJ_pkcs,5L,10L + +/* Extension request OIDs */ + +# define LN_ms_ext_req "Microsoft Extension Request" +# define SN_ms_ext_req "msExtReq" +# define NID_ms_ext_req 171 +# define OBJ_ms_ext_req 1L,3L,6L,1L,4L,1L,311L,2L,1L,14L + +# define LN_ext_req "Extension Request" +# define SN_ext_req "extReq" +# define NID_ext_req 172 +# define OBJ_ext_req OBJ_pkcs9,14L + +# define SN_name "name" +# define LN_name "name" +# define NID_name 173 +# define OBJ_name OBJ_X509,41L + +# define SN_dnQualifier "dnQualifier" +# define LN_dnQualifier "dnQualifier" +# define NID_dnQualifier 174 +# define OBJ_dnQualifier OBJ_X509,46L + +# define SN_id_pe "id-pe" +# define NID_id_pe 175 +# define OBJ_id_pe OBJ_id_pkix,1L + +# define SN_id_ad "id-ad" +# define NID_id_ad 176 +# define OBJ_id_ad OBJ_id_pkix,48L + +# define SN_info_access "authorityInfoAccess" +# define LN_info_access "Authority Information Access" +# define NID_info_access 177 +# define OBJ_info_access OBJ_id_pe,1L + +# define SN_ad_OCSP "OCSP" +# define LN_ad_OCSP "OCSP" +# define NID_ad_OCSP 178 +# define OBJ_ad_OCSP OBJ_id_ad,1L + +# define SN_ad_ca_issuers "caIssuers" +# define LN_ad_ca_issuers "CA Issuers" +# define NID_ad_ca_issuers 179 +# define OBJ_ad_ca_issuers OBJ_id_ad,2L + +# define SN_OCSP_sign "OCSPSigning" +# define LN_OCSP_sign "OCSP Signing" +# define NID_OCSP_sign 180 +# define OBJ_OCSP_sign OBJ_id_kp,9L +# endif /* USE_OBJ_MAC */ + +# include +# include + +# define OBJ_NAME_TYPE_UNDEF 0x00 +# define OBJ_NAME_TYPE_MD_METH 0x01 +# define OBJ_NAME_TYPE_CIPHER_METH 0x02 +# define OBJ_NAME_TYPE_PKEY_METH 0x03 +# define OBJ_NAME_TYPE_COMP_METH 0x04 +# define OBJ_NAME_TYPE_NUM 0x05 + +# define OBJ_NAME_ALIAS 0x8000 + +# define OBJ_BSEARCH_VALUE_ON_NOMATCH 0x01 +# define OBJ_BSEARCH_FIRST_VALUE_ON_MATCH 0x02 + + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct obj_name_st { + int type; + int alias; + const char *name; + const char *data; +} OBJ_NAME; + +# define OBJ_create_and_add_object(a,b,c) OBJ_create(a,b,c) + +int OBJ_NAME_init(void); +int OBJ_NAME_new_index(unsigned long (*hash_func) (const char *), + int (*cmp_func) (const char *, const char *), + void (*free_func) (const char *, int, const char *)); +const char *OBJ_NAME_get(const char *name, int type); +int OBJ_NAME_add(const char *name, int type, const char *data); +int OBJ_NAME_remove(const char *name, int type); +void OBJ_NAME_cleanup(int type); /* -1 for everything */ +void OBJ_NAME_do_all(int type, void (*fn) (const OBJ_NAME *, void *arg), + void *arg); +void OBJ_NAME_do_all_sorted(int type, + void (*fn) (const OBJ_NAME *, void *arg), + void *arg); + +ASN1_OBJECT *OBJ_dup(const ASN1_OBJECT *o); +ASN1_OBJECT *OBJ_nid2obj(int n); +const char *OBJ_nid2ln(int n); +const char *OBJ_nid2sn(int n); +int OBJ_obj2nid(const ASN1_OBJECT *o); +ASN1_OBJECT *OBJ_txt2obj(const char *s, int no_name); +int OBJ_obj2txt(char *buf, int buf_len, const ASN1_OBJECT *a, int no_name); +int OBJ_txt2nid(const char *s); +int OBJ_ln2nid(const char *s); +int OBJ_sn2nid(const char *s); +int OBJ_cmp(const ASN1_OBJECT *a, const ASN1_OBJECT *b); +const void *OBJ_bsearch_(const void *key, const void *base, int num, int size, + int (*cmp) (const void *, const void *)); +const void *OBJ_bsearch_ex_(const void *key, const void *base, int num, + int size, + int (*cmp) (const void *, const void *), + int flags); + +# define _DECLARE_OBJ_BSEARCH_CMP_FN(scope, type1, type2, nm) \ + static int nm##_cmp_BSEARCH_CMP_FN(const void *, const void *); \ + static int nm##_cmp(type1 const *, type2 const *); \ + scope type2 * OBJ_bsearch_##nm(type1 *key, type2 const *base, int num) + +# define DECLARE_OBJ_BSEARCH_CMP_FN(type1, type2, cmp) \ + _DECLARE_OBJ_BSEARCH_CMP_FN(static, type1, type2, cmp) +# define DECLARE_OBJ_BSEARCH_GLOBAL_CMP_FN(type1, type2, nm) \ + type2 * OBJ_bsearch_##nm(type1 *key, type2 const *base, int num) + +/*- + * Unsolved problem: if a type is actually a pointer type, like + * nid_triple is, then its impossible to get a const where you need + * it. Consider: + * + * typedef int nid_triple[3]; + * const void *a_; + * const nid_triple const *a = a_; + * + * The assignement discards a const because what you really want is: + * + * const int const * const *a = a_; + * + * But if you do that, you lose the fact that a is an array of 3 ints, + * which breaks comparison functions. + * + * Thus we end up having to cast, sadly, or unpack the + * declarations. Or, as I finally did in this case, delcare nid_triple + * to be a struct, which it should have been in the first place. + * + * Ben, August 2008. + * + * Also, strictly speaking not all types need be const, but handling + * the non-constness means a lot of complication, and in practice + * comparison routines do always not touch their arguments. + */ + +# define IMPLEMENT_OBJ_BSEARCH_CMP_FN(type1, type2, nm) \ + static int nm##_cmp_BSEARCH_CMP_FN(const void *a_, const void *b_) \ + { \ + type1 const *a = a_; \ + type2 const *b = b_; \ + return nm##_cmp(a,b); \ + } \ + static type2 *OBJ_bsearch_##nm(type1 *key, type2 const *base, int num) \ + { \ + return (type2 *)OBJ_bsearch_(key, base, num, sizeof(type2), \ + nm##_cmp_BSEARCH_CMP_FN); \ + } \ + extern void dummy_prototype(void) + +# define IMPLEMENT_OBJ_BSEARCH_GLOBAL_CMP_FN(type1, type2, nm) \ + static int nm##_cmp_BSEARCH_CMP_FN(const void *a_, const void *b_) \ + { \ + type1 const *a = a_; \ + type2 const *b = b_; \ + return nm##_cmp(a,b); \ + } \ + type2 *OBJ_bsearch_##nm(type1 *key, type2 const *base, int num) \ + { \ + return (type2 *)OBJ_bsearch_(key, base, num, sizeof(type2), \ + nm##_cmp_BSEARCH_CMP_FN); \ + } \ + extern void dummy_prototype(void) + +# define OBJ_bsearch(type1,key,type2,base,num,cmp) \ + ((type2 *)OBJ_bsearch_(CHECKED_PTR_OF(type1,key),CHECKED_PTR_OF(type2,base), \ + num,sizeof(type2), \ + ((void)CHECKED_PTR_OF(type1,cmp##_type_1), \ + (void)CHECKED_PTR_OF(type2,cmp##_type_2), \ + cmp##_BSEARCH_CMP_FN))) + +# define OBJ_bsearch_ex(type1,key,type2,base,num,cmp,flags) \ + ((type2 *)OBJ_bsearch_ex_(CHECKED_PTR_OF(type1,key),CHECKED_PTR_OF(type2,base), \ + num,sizeof(type2), \ + ((void)CHECKED_PTR_OF(type1,cmp##_type_1), \ + (void)type_2=CHECKED_PTR_OF(type2,cmp##_type_2), \ + cmp##_BSEARCH_CMP_FN)),flags) + +int OBJ_new_nid(int num); +int OBJ_add_object(const ASN1_OBJECT *obj); +int OBJ_create(const char *oid, const char *sn, const char *ln); +void OBJ_cleanup(void); +int OBJ_create_objects(BIO *in); + +int OBJ_find_sigid_algs(int signid, int *pdig_nid, int *ppkey_nid); +int OBJ_find_sigid_by_algs(int *psignid, int dig_nid, int pkey_nid); +int OBJ_add_sigid(int signid, int dig_id, int pkey_id); +void OBJ_sigid_free(void); + +extern int obj_cleanup_defer; +void check_defer(int nid); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_OBJ_strings(void); + +/* Error codes for the OBJ functions. */ + +/* Function codes. */ +# define OBJ_F_OBJ_ADD_OBJECT 105 +# define OBJ_F_OBJ_CREATE 100 +# define OBJ_F_OBJ_DUP 101 +# define OBJ_F_OBJ_NAME_NEW_INDEX 106 +# define OBJ_F_OBJ_NID2LN 102 +# define OBJ_F_OBJ_NID2OBJ 103 +# define OBJ_F_OBJ_NID2SN 104 + +/* Reason codes. */ +# define OBJ_R_MALLOC_FAILURE 100 +# define OBJ_R_UNKNOWN_NID 101 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/ocsp.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/ocsp.h new file mode 100644 index 0000000..ca2ee76 --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/ocsp.h @@ -0,0 +1,637 @@ +/* ocsp.h */ +/* + * Written by Tom Titchener for the OpenSSL + * project. + */ + +/* + * History: This file was transfered to Richard Levitte from CertCo by Kathy + * Weinhold in mid-spring 2000 to be included in OpenSSL or released as a + * patch kit. + */ + +/* ==================================================================== + * Copyright (c) 1998-2000 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_OCSP_H +# define HEADER_OCSP_H + +# include +# include +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Various flags and values */ + +# define OCSP_DEFAULT_NONCE_LENGTH 16 + +# define OCSP_NOCERTS 0x1 +# define OCSP_NOINTERN 0x2 +# define OCSP_NOSIGS 0x4 +# define OCSP_NOCHAIN 0x8 +# define OCSP_NOVERIFY 0x10 +# define OCSP_NOEXPLICIT 0x20 +# define OCSP_NOCASIGN 0x40 +# define OCSP_NODELEGATED 0x80 +# define OCSP_NOCHECKS 0x100 +# define OCSP_TRUSTOTHER 0x200 +# define OCSP_RESPID_KEY 0x400 +# define OCSP_NOTIME 0x800 + +/*- CertID ::= SEQUENCE { + * hashAlgorithm AlgorithmIdentifier, + * issuerNameHash OCTET STRING, -- Hash of Issuer's DN + * issuerKeyHash OCTET STRING, -- Hash of Issuers public key (excluding the tag & length fields) + * serialNumber CertificateSerialNumber } + */ +typedef struct ocsp_cert_id_st { + X509_ALGOR *hashAlgorithm; + ASN1_OCTET_STRING *issuerNameHash; + ASN1_OCTET_STRING *issuerKeyHash; + ASN1_INTEGER *serialNumber; +} OCSP_CERTID; + +DECLARE_STACK_OF(OCSP_CERTID) + +/*- Request ::= SEQUENCE { + * reqCert CertID, + * singleRequestExtensions [0] EXPLICIT Extensions OPTIONAL } + */ +typedef struct ocsp_one_request_st { + OCSP_CERTID *reqCert; + STACK_OF(X509_EXTENSION) *singleRequestExtensions; +} OCSP_ONEREQ; + +DECLARE_STACK_OF(OCSP_ONEREQ) +DECLARE_ASN1_SET_OF(OCSP_ONEREQ) + +/*- TBSRequest ::= SEQUENCE { + * version [0] EXPLICIT Version DEFAULT v1, + * requestorName [1] EXPLICIT GeneralName OPTIONAL, + * requestList SEQUENCE OF Request, + * requestExtensions [2] EXPLICIT Extensions OPTIONAL } + */ +typedef struct ocsp_req_info_st { + ASN1_INTEGER *version; + GENERAL_NAME *requestorName; + STACK_OF(OCSP_ONEREQ) *requestList; + STACK_OF(X509_EXTENSION) *requestExtensions; +} OCSP_REQINFO; + +/*- Signature ::= SEQUENCE { + * signatureAlgorithm AlgorithmIdentifier, + * signature BIT STRING, + * certs [0] EXPLICIT SEQUENCE OF Certificate OPTIONAL } + */ +typedef struct ocsp_signature_st { + X509_ALGOR *signatureAlgorithm; + ASN1_BIT_STRING *signature; + STACK_OF(X509) *certs; +} OCSP_SIGNATURE; + +/*- OCSPRequest ::= SEQUENCE { + * tbsRequest TBSRequest, + * optionalSignature [0] EXPLICIT Signature OPTIONAL } + */ +typedef struct ocsp_request_st { + OCSP_REQINFO *tbsRequest; + OCSP_SIGNATURE *optionalSignature; /* OPTIONAL */ +} OCSP_REQUEST; + +/*- OCSPResponseStatus ::= ENUMERATED { + * successful (0), --Response has valid confirmations + * malformedRequest (1), --Illegal confirmation request + * internalError (2), --Internal error in issuer + * tryLater (3), --Try again later + * --(4) is not used + * sigRequired (5), --Must sign the request + * unauthorized (6) --Request unauthorized + * } + */ +# define OCSP_RESPONSE_STATUS_SUCCESSFUL 0 +# define OCSP_RESPONSE_STATUS_MALFORMEDREQUEST 1 +# define OCSP_RESPONSE_STATUS_INTERNALERROR 2 +# define OCSP_RESPONSE_STATUS_TRYLATER 3 +# define OCSP_RESPONSE_STATUS_SIGREQUIRED 5 +# define OCSP_RESPONSE_STATUS_UNAUTHORIZED 6 + +/*- ResponseBytes ::= SEQUENCE { + * responseType OBJECT IDENTIFIER, + * response OCTET STRING } + */ +typedef struct ocsp_resp_bytes_st { + ASN1_OBJECT *responseType; + ASN1_OCTET_STRING *response; +} OCSP_RESPBYTES; + +/*- OCSPResponse ::= SEQUENCE { + * responseStatus OCSPResponseStatus, + * responseBytes [0] EXPLICIT ResponseBytes OPTIONAL } + */ +struct ocsp_response_st { + ASN1_ENUMERATED *responseStatus; + OCSP_RESPBYTES *responseBytes; +}; + +/*- ResponderID ::= CHOICE { + * byName [1] Name, + * byKey [2] KeyHash } + */ +# define V_OCSP_RESPID_NAME 0 +# define V_OCSP_RESPID_KEY 1 +struct ocsp_responder_id_st { + int type; + union { + X509_NAME *byName; + ASN1_OCTET_STRING *byKey; + } value; +}; + +DECLARE_STACK_OF(OCSP_RESPID) +DECLARE_ASN1_FUNCTIONS(OCSP_RESPID) + +/*- KeyHash ::= OCTET STRING --SHA-1 hash of responder's public key + * --(excluding the tag and length fields) + */ + +/*- RevokedInfo ::= SEQUENCE { + * revocationTime GeneralizedTime, + * revocationReason [0] EXPLICIT CRLReason OPTIONAL } + */ +typedef struct ocsp_revoked_info_st { + ASN1_GENERALIZEDTIME *revocationTime; + ASN1_ENUMERATED *revocationReason; +} OCSP_REVOKEDINFO; + +/*- CertStatus ::= CHOICE { + * good [0] IMPLICIT NULL, + * revoked [1] IMPLICIT RevokedInfo, + * unknown [2] IMPLICIT UnknownInfo } + */ +# define V_OCSP_CERTSTATUS_GOOD 0 +# define V_OCSP_CERTSTATUS_REVOKED 1 +# define V_OCSP_CERTSTATUS_UNKNOWN 2 +typedef struct ocsp_cert_status_st { + int type; + union { + ASN1_NULL *good; + OCSP_REVOKEDINFO *revoked; + ASN1_NULL *unknown; + } value; +} OCSP_CERTSTATUS; + +/*- SingleResponse ::= SEQUENCE { + * certID CertID, + * certStatus CertStatus, + * thisUpdate GeneralizedTime, + * nextUpdate [0] EXPLICIT GeneralizedTime OPTIONAL, + * singleExtensions [1] EXPLICIT Extensions OPTIONAL } + */ +typedef struct ocsp_single_response_st { + OCSP_CERTID *certId; + OCSP_CERTSTATUS *certStatus; + ASN1_GENERALIZEDTIME *thisUpdate; + ASN1_GENERALIZEDTIME *nextUpdate; + STACK_OF(X509_EXTENSION) *singleExtensions; +} OCSP_SINGLERESP; + +DECLARE_STACK_OF(OCSP_SINGLERESP) +DECLARE_ASN1_SET_OF(OCSP_SINGLERESP) + +/*- ResponseData ::= SEQUENCE { + * version [0] EXPLICIT Version DEFAULT v1, + * responderID ResponderID, + * producedAt GeneralizedTime, + * responses SEQUENCE OF SingleResponse, + * responseExtensions [1] EXPLICIT Extensions OPTIONAL } + */ +typedef struct ocsp_response_data_st { + ASN1_INTEGER *version; + OCSP_RESPID *responderId; + ASN1_GENERALIZEDTIME *producedAt; + STACK_OF(OCSP_SINGLERESP) *responses; + STACK_OF(X509_EXTENSION) *responseExtensions; +} OCSP_RESPDATA; + +/*- BasicOCSPResponse ::= SEQUENCE { + * tbsResponseData ResponseData, + * signatureAlgorithm AlgorithmIdentifier, + * signature BIT STRING, + * certs [0] EXPLICIT SEQUENCE OF Certificate OPTIONAL } + */ + /* + * Note 1: The value for "signature" is specified in the OCSP rfc2560 as + * follows: "The value for the signature SHALL be computed on the hash of + * the DER encoding ResponseData." This means that you must hash the + * DER-encoded tbsResponseData, and then run it through a crypto-signing + * function, which will (at least w/RSA) do a hash-'n'-private-encrypt + * operation. This seems a bit odd, but that's the spec. Also note that + * the data structures do not leave anywhere to independently specify the + * algorithm used for the initial hash. So, we look at the + * signature-specification algorithm, and try to do something intelligent. + * -- Kathy Weinhold, CertCo + */ + /* + * Note 2: It seems that the mentioned passage from RFC 2560 (section + * 4.2.1) is open for interpretation. I've done tests against another + * responder, and found that it doesn't do the double hashing that the RFC + * seems to say one should. Therefore, all relevant functions take a flag + * saying which variant should be used. -- Richard Levitte, OpenSSL team + * and CeloCom + */ +typedef struct ocsp_basic_response_st { + OCSP_RESPDATA *tbsResponseData; + X509_ALGOR *signatureAlgorithm; + ASN1_BIT_STRING *signature; + STACK_OF(X509) *certs; +} OCSP_BASICRESP; + +/*- + * CRLReason ::= ENUMERATED { + * unspecified (0), + * keyCompromise (1), + * cACompromise (2), + * affiliationChanged (3), + * superseded (4), + * cessationOfOperation (5), + * certificateHold (6), + * removeFromCRL (8) } + */ +# define OCSP_REVOKED_STATUS_NOSTATUS -1 +# define OCSP_REVOKED_STATUS_UNSPECIFIED 0 +# define OCSP_REVOKED_STATUS_KEYCOMPROMISE 1 +# define OCSP_REVOKED_STATUS_CACOMPROMISE 2 +# define OCSP_REVOKED_STATUS_AFFILIATIONCHANGED 3 +# define OCSP_REVOKED_STATUS_SUPERSEDED 4 +# define OCSP_REVOKED_STATUS_CESSATIONOFOPERATION 5 +# define OCSP_REVOKED_STATUS_CERTIFICATEHOLD 6 +# define OCSP_REVOKED_STATUS_REMOVEFROMCRL 8 + +/*- + * CrlID ::= SEQUENCE { + * crlUrl [0] EXPLICIT IA5String OPTIONAL, + * crlNum [1] EXPLICIT INTEGER OPTIONAL, + * crlTime [2] EXPLICIT GeneralizedTime OPTIONAL } + */ +typedef struct ocsp_crl_id_st { + ASN1_IA5STRING *crlUrl; + ASN1_INTEGER *crlNum; + ASN1_GENERALIZEDTIME *crlTime; +} OCSP_CRLID; + +/*- + * ServiceLocator ::= SEQUENCE { + * issuer Name, + * locator AuthorityInfoAccessSyntax OPTIONAL } + */ +typedef struct ocsp_service_locator_st { + X509_NAME *issuer; + STACK_OF(ACCESS_DESCRIPTION) *locator; +} OCSP_SERVICELOC; + +# define PEM_STRING_OCSP_REQUEST "OCSP REQUEST" +# define PEM_STRING_OCSP_RESPONSE "OCSP RESPONSE" + +# define d2i_OCSP_REQUEST_bio(bp,p) ASN1_d2i_bio_of(OCSP_REQUEST,OCSP_REQUEST_new,d2i_OCSP_REQUEST,bp,p) + +# define d2i_OCSP_RESPONSE_bio(bp,p) ASN1_d2i_bio_of(OCSP_RESPONSE,OCSP_RESPONSE_new,d2i_OCSP_RESPONSE,bp,p) + +# define PEM_read_bio_OCSP_REQUEST(bp,x,cb) (OCSP_REQUEST *)PEM_ASN1_read_bio( \ + (char *(*)())d2i_OCSP_REQUEST,PEM_STRING_OCSP_REQUEST,bp,(char **)x,cb,NULL) + +# define PEM_read_bio_OCSP_RESPONSE(bp,x,cb)(OCSP_RESPONSE *)PEM_ASN1_read_bio(\ + (char *(*)())d2i_OCSP_RESPONSE,PEM_STRING_OCSP_RESPONSE,bp,(char **)x,cb,NULL) + +# define PEM_write_bio_OCSP_REQUEST(bp,o) \ + PEM_ASN1_write_bio((int (*)())i2d_OCSP_REQUEST,PEM_STRING_OCSP_REQUEST,\ + bp,(char *)o, NULL,NULL,0,NULL,NULL) + +# define PEM_write_bio_OCSP_RESPONSE(bp,o) \ + PEM_ASN1_write_bio((int (*)())i2d_OCSP_RESPONSE,PEM_STRING_OCSP_RESPONSE,\ + bp,(char *)o, NULL,NULL,0,NULL,NULL) + +# define i2d_OCSP_RESPONSE_bio(bp,o) ASN1_i2d_bio_of(OCSP_RESPONSE,i2d_OCSP_RESPONSE,bp,o) + +# define i2d_OCSP_REQUEST_bio(bp,o) ASN1_i2d_bio_of(OCSP_REQUEST,i2d_OCSP_REQUEST,bp,o) + +# define OCSP_REQUEST_sign(o,pkey,md) \ + ASN1_item_sign(ASN1_ITEM_rptr(OCSP_REQINFO),\ + o->optionalSignature->signatureAlgorithm,NULL,\ + o->optionalSignature->signature,o->tbsRequest,pkey,md) + +# define OCSP_BASICRESP_sign(o,pkey,md,d) \ + ASN1_item_sign(ASN1_ITEM_rptr(OCSP_RESPDATA),o->signatureAlgorithm,NULL,\ + o->signature,o->tbsResponseData,pkey,md) + +# define OCSP_REQUEST_verify(a,r) ASN1_item_verify(ASN1_ITEM_rptr(OCSP_REQINFO),\ + a->optionalSignature->signatureAlgorithm,\ + a->optionalSignature->signature,a->tbsRequest,r) + +# define OCSP_BASICRESP_verify(a,r,d) ASN1_item_verify(ASN1_ITEM_rptr(OCSP_RESPDATA),\ + a->signatureAlgorithm,a->signature,a->tbsResponseData,r) + +# define ASN1_BIT_STRING_digest(data,type,md,len) \ + ASN1_item_digest(ASN1_ITEM_rptr(ASN1_BIT_STRING),type,data,md,len) + +# define OCSP_CERTSTATUS_dup(cs)\ + (OCSP_CERTSTATUS*)ASN1_dup((int(*)())i2d_OCSP_CERTSTATUS,\ + (char *(*)())d2i_OCSP_CERTSTATUS,(char *)(cs)) + +OCSP_CERTID *OCSP_CERTID_dup(OCSP_CERTID *id); + +OCSP_RESPONSE *OCSP_sendreq_bio(BIO *b, const char *path, OCSP_REQUEST *req); +OCSP_REQ_CTX *OCSP_sendreq_new(BIO *io, const char *path, OCSP_REQUEST *req, + int maxline); +int OCSP_REQ_CTX_nbio(OCSP_REQ_CTX *rctx); +int OCSP_sendreq_nbio(OCSP_RESPONSE **presp, OCSP_REQ_CTX *rctx); +OCSP_REQ_CTX *OCSP_REQ_CTX_new(BIO *io, int maxline); +void OCSP_REQ_CTX_free(OCSP_REQ_CTX *rctx); +void OCSP_set_max_response_length(OCSP_REQ_CTX *rctx, unsigned long len); +int OCSP_REQ_CTX_i2d(OCSP_REQ_CTX *rctx, const ASN1_ITEM *it, + ASN1_VALUE *val); +int OCSP_REQ_CTX_nbio_d2i(OCSP_REQ_CTX *rctx, ASN1_VALUE **pval, + const ASN1_ITEM *it); +BIO *OCSP_REQ_CTX_get0_mem_bio(OCSP_REQ_CTX *rctx); +int OCSP_REQ_CTX_i2d(OCSP_REQ_CTX *rctx, const ASN1_ITEM *it, + ASN1_VALUE *val); +int OCSP_REQ_CTX_http(OCSP_REQ_CTX *rctx, const char *op, const char *path); +int OCSP_REQ_CTX_set1_req(OCSP_REQ_CTX *rctx, OCSP_REQUEST *req); +int OCSP_REQ_CTX_add1_header(OCSP_REQ_CTX *rctx, + const char *name, const char *value); + +OCSP_CERTID *OCSP_cert_to_id(const EVP_MD *dgst, X509 *subject, X509 *issuer); + +OCSP_CERTID *OCSP_cert_id_new(const EVP_MD *dgst, + X509_NAME *issuerName, + ASN1_BIT_STRING *issuerKey, + ASN1_INTEGER *serialNumber); + +OCSP_ONEREQ *OCSP_request_add0_id(OCSP_REQUEST *req, OCSP_CERTID *cid); + +int OCSP_request_add1_nonce(OCSP_REQUEST *req, unsigned char *val, int len); +int OCSP_basic_add1_nonce(OCSP_BASICRESP *resp, unsigned char *val, int len); +int OCSP_check_nonce(OCSP_REQUEST *req, OCSP_BASICRESP *bs); +int OCSP_copy_nonce(OCSP_BASICRESP *resp, OCSP_REQUEST *req); + +int OCSP_request_set1_name(OCSP_REQUEST *req, X509_NAME *nm); +int OCSP_request_add1_cert(OCSP_REQUEST *req, X509 *cert); + +int OCSP_request_sign(OCSP_REQUEST *req, + X509 *signer, + EVP_PKEY *key, + const EVP_MD *dgst, + STACK_OF(X509) *certs, unsigned long flags); + +int OCSP_response_status(OCSP_RESPONSE *resp); +OCSP_BASICRESP *OCSP_response_get1_basic(OCSP_RESPONSE *resp); + +int OCSP_resp_count(OCSP_BASICRESP *bs); +OCSP_SINGLERESP *OCSP_resp_get0(OCSP_BASICRESP *bs, int idx); +int OCSP_resp_find(OCSP_BASICRESP *bs, OCSP_CERTID *id, int last); +int OCSP_single_get0_status(OCSP_SINGLERESP *single, int *reason, + ASN1_GENERALIZEDTIME **revtime, + ASN1_GENERALIZEDTIME **thisupd, + ASN1_GENERALIZEDTIME **nextupd); +int OCSP_resp_find_status(OCSP_BASICRESP *bs, OCSP_CERTID *id, int *status, + int *reason, + ASN1_GENERALIZEDTIME **revtime, + ASN1_GENERALIZEDTIME **thisupd, + ASN1_GENERALIZEDTIME **nextupd); +int OCSP_check_validity(ASN1_GENERALIZEDTIME *thisupd, + ASN1_GENERALIZEDTIME *nextupd, long sec, long maxsec); + +int OCSP_request_verify(OCSP_REQUEST *req, STACK_OF(X509) *certs, + X509_STORE *store, unsigned long flags); + +int OCSP_parse_url(const char *url, char **phost, char **pport, char **ppath, + int *pssl); + +int OCSP_id_issuer_cmp(OCSP_CERTID *a, OCSP_CERTID *b); +int OCSP_id_cmp(OCSP_CERTID *a, OCSP_CERTID *b); + +int OCSP_request_onereq_count(OCSP_REQUEST *req); +OCSP_ONEREQ *OCSP_request_onereq_get0(OCSP_REQUEST *req, int i); +OCSP_CERTID *OCSP_onereq_get0_id(OCSP_ONEREQ *one); +int OCSP_id_get0_info(ASN1_OCTET_STRING **piNameHash, ASN1_OBJECT **pmd, + ASN1_OCTET_STRING **pikeyHash, + ASN1_INTEGER **pserial, OCSP_CERTID *cid); +int OCSP_request_is_signed(OCSP_REQUEST *req); +OCSP_RESPONSE *OCSP_response_create(int status, OCSP_BASICRESP *bs); +OCSP_SINGLERESP *OCSP_basic_add1_status(OCSP_BASICRESP *rsp, + OCSP_CERTID *cid, + int status, int reason, + ASN1_TIME *revtime, + ASN1_TIME *thisupd, + ASN1_TIME *nextupd); +int OCSP_basic_add1_cert(OCSP_BASICRESP *resp, X509 *cert); +int OCSP_basic_sign(OCSP_BASICRESP *brsp, + X509 *signer, EVP_PKEY *key, const EVP_MD *dgst, + STACK_OF(X509) *certs, unsigned long flags); + +X509_EXTENSION *OCSP_crlID_new(char *url, long *n, char *tim); + +X509_EXTENSION *OCSP_accept_responses_new(char **oids); + +X509_EXTENSION *OCSP_archive_cutoff_new(char *tim); + +X509_EXTENSION *OCSP_url_svcloc_new(X509_NAME *issuer, char **urls); + +int OCSP_REQUEST_get_ext_count(OCSP_REQUEST *x); +int OCSP_REQUEST_get_ext_by_NID(OCSP_REQUEST *x, int nid, int lastpos); +int OCSP_REQUEST_get_ext_by_OBJ(OCSP_REQUEST *x, ASN1_OBJECT *obj, + int lastpos); +int OCSP_REQUEST_get_ext_by_critical(OCSP_REQUEST *x, int crit, int lastpos); +X509_EXTENSION *OCSP_REQUEST_get_ext(OCSP_REQUEST *x, int loc); +X509_EXTENSION *OCSP_REQUEST_delete_ext(OCSP_REQUEST *x, int loc); +void *OCSP_REQUEST_get1_ext_d2i(OCSP_REQUEST *x, int nid, int *crit, + int *idx); +int OCSP_REQUEST_add1_ext_i2d(OCSP_REQUEST *x, int nid, void *value, int crit, + unsigned long flags); +int OCSP_REQUEST_add_ext(OCSP_REQUEST *x, X509_EXTENSION *ex, int loc); + +int OCSP_ONEREQ_get_ext_count(OCSP_ONEREQ *x); +int OCSP_ONEREQ_get_ext_by_NID(OCSP_ONEREQ *x, int nid, int lastpos); +int OCSP_ONEREQ_get_ext_by_OBJ(OCSP_ONEREQ *x, ASN1_OBJECT *obj, int lastpos); +int OCSP_ONEREQ_get_ext_by_critical(OCSP_ONEREQ *x, int crit, int lastpos); +X509_EXTENSION *OCSP_ONEREQ_get_ext(OCSP_ONEREQ *x, int loc); +X509_EXTENSION *OCSP_ONEREQ_delete_ext(OCSP_ONEREQ *x, int loc); +void *OCSP_ONEREQ_get1_ext_d2i(OCSP_ONEREQ *x, int nid, int *crit, int *idx); +int OCSP_ONEREQ_add1_ext_i2d(OCSP_ONEREQ *x, int nid, void *value, int crit, + unsigned long flags); +int OCSP_ONEREQ_add_ext(OCSP_ONEREQ *x, X509_EXTENSION *ex, int loc); + +int OCSP_BASICRESP_get_ext_count(OCSP_BASICRESP *x); +int OCSP_BASICRESP_get_ext_by_NID(OCSP_BASICRESP *x, int nid, int lastpos); +int OCSP_BASICRESP_get_ext_by_OBJ(OCSP_BASICRESP *x, ASN1_OBJECT *obj, + int lastpos); +int OCSP_BASICRESP_get_ext_by_critical(OCSP_BASICRESP *x, int crit, + int lastpos); +X509_EXTENSION *OCSP_BASICRESP_get_ext(OCSP_BASICRESP *x, int loc); +X509_EXTENSION *OCSP_BASICRESP_delete_ext(OCSP_BASICRESP *x, int loc); +void *OCSP_BASICRESP_get1_ext_d2i(OCSP_BASICRESP *x, int nid, int *crit, + int *idx); +int OCSP_BASICRESP_add1_ext_i2d(OCSP_BASICRESP *x, int nid, void *value, + int crit, unsigned long flags); +int OCSP_BASICRESP_add_ext(OCSP_BASICRESP *x, X509_EXTENSION *ex, int loc); + +int OCSP_SINGLERESP_get_ext_count(OCSP_SINGLERESP *x); +int OCSP_SINGLERESP_get_ext_by_NID(OCSP_SINGLERESP *x, int nid, int lastpos); +int OCSP_SINGLERESP_get_ext_by_OBJ(OCSP_SINGLERESP *x, ASN1_OBJECT *obj, + int lastpos); +int OCSP_SINGLERESP_get_ext_by_critical(OCSP_SINGLERESP *x, int crit, + int lastpos); +X509_EXTENSION *OCSP_SINGLERESP_get_ext(OCSP_SINGLERESP *x, int loc); +X509_EXTENSION *OCSP_SINGLERESP_delete_ext(OCSP_SINGLERESP *x, int loc); +void *OCSP_SINGLERESP_get1_ext_d2i(OCSP_SINGLERESP *x, int nid, int *crit, + int *idx); +int OCSP_SINGLERESP_add1_ext_i2d(OCSP_SINGLERESP *x, int nid, void *value, + int crit, unsigned long flags); +int OCSP_SINGLERESP_add_ext(OCSP_SINGLERESP *x, X509_EXTENSION *ex, int loc); + +DECLARE_ASN1_FUNCTIONS(OCSP_SINGLERESP) +DECLARE_ASN1_FUNCTIONS(OCSP_CERTSTATUS) +DECLARE_ASN1_FUNCTIONS(OCSP_REVOKEDINFO) +DECLARE_ASN1_FUNCTIONS(OCSP_BASICRESP) +DECLARE_ASN1_FUNCTIONS(OCSP_RESPDATA) +DECLARE_ASN1_FUNCTIONS(OCSP_RESPID) +DECLARE_ASN1_FUNCTIONS(OCSP_RESPONSE) +DECLARE_ASN1_FUNCTIONS(OCSP_RESPBYTES) +DECLARE_ASN1_FUNCTIONS(OCSP_ONEREQ) +DECLARE_ASN1_FUNCTIONS(OCSP_CERTID) +DECLARE_ASN1_FUNCTIONS(OCSP_REQUEST) +DECLARE_ASN1_FUNCTIONS(OCSP_SIGNATURE) +DECLARE_ASN1_FUNCTIONS(OCSP_REQINFO) +DECLARE_ASN1_FUNCTIONS(OCSP_CRLID) +DECLARE_ASN1_FUNCTIONS(OCSP_SERVICELOC) + +const char *OCSP_response_status_str(long s); +const char *OCSP_cert_status_str(long s); +const char *OCSP_crl_reason_str(long s); + +int OCSP_REQUEST_print(BIO *bp, OCSP_REQUEST *a, unsigned long flags); +int OCSP_RESPONSE_print(BIO *bp, OCSP_RESPONSE *o, unsigned long flags); + +int OCSP_basic_verify(OCSP_BASICRESP *bs, STACK_OF(X509) *certs, + X509_STORE *st, unsigned long flags); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_OCSP_strings(void); + +/* Error codes for the OCSP functions. */ + +/* Function codes. */ +# define OCSP_F_ASN1_STRING_ENCODE 100 +# define OCSP_F_D2I_OCSP_NONCE 102 +# define OCSP_F_OCSP_BASIC_ADD1_STATUS 103 +# define OCSP_F_OCSP_BASIC_SIGN 104 +# define OCSP_F_OCSP_BASIC_VERIFY 105 +# define OCSP_F_OCSP_CERT_ID_NEW 101 +# define OCSP_F_OCSP_CHECK_DELEGATED 106 +# define OCSP_F_OCSP_CHECK_IDS 107 +# define OCSP_F_OCSP_CHECK_ISSUER 108 +# define OCSP_F_OCSP_CHECK_VALIDITY 115 +# define OCSP_F_OCSP_MATCH_ISSUERID 109 +# define OCSP_F_OCSP_PARSE_URL 114 +# define OCSP_F_OCSP_REQUEST_SIGN 110 +# define OCSP_F_OCSP_REQUEST_VERIFY 116 +# define OCSP_F_OCSP_RESPONSE_GET1_BASIC 111 +# define OCSP_F_OCSP_SENDREQ_BIO 112 +# define OCSP_F_OCSP_SENDREQ_NBIO 117 +# define OCSP_F_PARSE_HTTP_LINE1 118 +# define OCSP_F_REQUEST_VERIFY 113 + +/* Reason codes. */ +# define OCSP_R_BAD_DATA 100 +# define OCSP_R_CERTIFICATE_VERIFY_ERROR 101 +# define OCSP_R_DIGEST_ERR 102 +# define OCSP_R_ERROR_IN_NEXTUPDATE_FIELD 122 +# define OCSP_R_ERROR_IN_THISUPDATE_FIELD 123 +# define OCSP_R_ERROR_PARSING_URL 121 +# define OCSP_R_MISSING_OCSPSIGNING_USAGE 103 +# define OCSP_R_NEXTUPDATE_BEFORE_THISUPDATE 124 +# define OCSP_R_NOT_BASIC_RESPONSE 104 +# define OCSP_R_NO_CERTIFICATES_IN_CHAIN 105 +# define OCSP_R_NO_CONTENT 106 +# define OCSP_R_NO_PUBLIC_KEY 107 +# define OCSP_R_NO_RESPONSE_DATA 108 +# define OCSP_R_NO_REVOKED_TIME 109 +# define OCSP_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE 110 +# define OCSP_R_REQUEST_NOT_SIGNED 128 +# define OCSP_R_RESPONSE_CONTAINS_NO_REVOCATION_DATA 111 +# define OCSP_R_ROOT_CA_NOT_TRUSTED 112 +# define OCSP_R_SERVER_READ_ERROR 113 +# define OCSP_R_SERVER_RESPONSE_ERROR 114 +# define OCSP_R_SERVER_RESPONSE_PARSE_ERROR 115 +# define OCSP_R_SERVER_WRITE_ERROR 116 +# define OCSP_R_SIGNATURE_FAILURE 117 +# define OCSP_R_SIGNER_CERTIFICATE_NOT_FOUND 118 +# define OCSP_R_STATUS_EXPIRED 125 +# define OCSP_R_STATUS_NOT_YET_VALID 126 +# define OCSP_R_STATUS_TOO_OLD 127 +# define OCSP_R_UNKNOWN_MESSAGE_DIGEST 119 +# define OCSP_R_UNKNOWN_NID 120 +# define OCSP_R_UNSUPPORTED_REQUESTORNAME_TYPE 129 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/opensslconf.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/opensslconf.h new file mode 100644 index 0000000..387b8b3 --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/opensslconf.h @@ -0,0 +1,273 @@ +/* opensslconf.h */ +/* WARNING: Generated automatically from opensslconf.h.in by Configure. */ + +#ifdef __cplusplus +extern "C" { +#endif +/* OpenSSL was configured with the following options: */ +#ifndef OPENSSL_SYSNAME_ULTRASPARC +# define OPENSSL_SYSNAME_ULTRASPARC +#endif +#ifndef OPENSSL_DOING_MAKEDEPEND + + +#ifndef OPENSSL_NO_EC_NISTP_64_GCC_128 +# define OPENSSL_NO_EC_NISTP_64_GCC_128 +#endif +#ifndef OPENSSL_NO_GMP +# define OPENSSL_NO_GMP +#endif +#ifndef OPENSSL_NO_JPAKE +# define OPENSSL_NO_JPAKE +#endif +#ifndef OPENSSL_NO_KRB5 +# define OPENSSL_NO_KRB5 +#endif +#ifndef OPENSSL_NO_LIBUNBOUND +# define OPENSSL_NO_LIBUNBOUND +#endif +#ifndef OPENSSL_NO_MD2 +# define OPENSSL_NO_MD2 +#endif +#ifndef OPENSSL_NO_RC5 +# define OPENSSL_NO_RC5 +#endif +#ifndef OPENSSL_NO_RFC3779 +# define OPENSSL_NO_RFC3779 +#endif +#ifndef OPENSSL_NO_SCTP +# define OPENSSL_NO_SCTP +#endif +#ifndef OPENSSL_NO_SSL_TRACE +# define OPENSSL_NO_SSL_TRACE +#endif +#ifndef OPENSSL_NO_SSL2 +# define OPENSSL_NO_SSL2 +#endif +#ifndef OPENSSL_NO_STORE +# define OPENSSL_NO_STORE +#endif +#ifndef OPENSSL_NO_UNIT_TEST +# define OPENSSL_NO_UNIT_TEST +#endif +#ifndef OPENSSL_NO_WEAK_SSL_CIPHERS +# define OPENSSL_NO_WEAK_SSL_CIPHERS +#endif + +#endif /* OPENSSL_DOING_MAKEDEPEND */ + +#ifndef OPENSSL_THREADS +# define OPENSSL_THREADS +#endif +#ifndef OPENSSL_NO_DYNAMIC_ENGINE +# define OPENSSL_NO_DYNAMIC_ENGINE +#endif + +/* The OPENSSL_NO_* macros are also defined as NO_* if the application + asks for it. This is a transient feature that is provided for those + who haven't had the time to do the appropriate changes in their + applications. */ +#ifdef OPENSSL_ALGORITHM_DEFINES +# if defined(OPENSSL_NO_EC_NISTP_64_GCC_128) && !defined(NO_EC_NISTP_64_GCC_128) +# define NO_EC_NISTP_64_GCC_128 +# endif +# if defined(OPENSSL_NO_GMP) && !defined(NO_GMP) +# define NO_GMP +# endif +# if defined(OPENSSL_NO_JPAKE) && !defined(NO_JPAKE) +# define NO_JPAKE +# endif +# if defined(OPENSSL_NO_KRB5) && !defined(NO_KRB5) +# define NO_KRB5 +# endif +# if defined(OPENSSL_NO_LIBUNBOUND) && !defined(NO_LIBUNBOUND) +# define NO_LIBUNBOUND +# endif +# if defined(OPENSSL_NO_MD2) && !defined(NO_MD2) +# define NO_MD2 +# endif +# if defined(OPENSSL_NO_RC5) && !defined(NO_RC5) +# define NO_RC5 +# endif +# if defined(OPENSSL_NO_RFC3779) && !defined(NO_RFC3779) +# define NO_RFC3779 +# endif +# if defined(OPENSSL_NO_SCTP) && !defined(NO_SCTP) +# define NO_SCTP +# endif +# if defined(OPENSSL_NO_SSL_TRACE) && !defined(NO_SSL_TRACE) +# define NO_SSL_TRACE +# endif +# if defined(OPENSSL_NO_SSL2) && !defined(NO_SSL2) +# define NO_SSL2 +# endif +# if defined(OPENSSL_NO_STORE) && !defined(NO_STORE) +# define NO_STORE +# endif +# if defined(OPENSSL_NO_UNIT_TEST) && !defined(NO_UNIT_TEST) +# define NO_UNIT_TEST +# endif +# if defined(OPENSSL_NO_WEAK_SSL_CIPHERS) && !defined(NO_WEAK_SSL_CIPHERS) +# define NO_WEAK_SSL_CIPHERS +# endif +#endif + +#define OPENSSL_CPUID_OBJ + +/* crypto/opensslconf.h.in */ + +/* Generate 80386 code? */ +#undef I386_ONLY + +#if !(defined(VMS) || defined(__VMS)) /* VMS uses logical names instead */ +#if defined(HEADER_CRYPTLIB_H) && !defined(OPENSSLDIR) +#define ENGINESDIR "/usr/local/ssl/lib/engines" +#define OPENSSLDIR "/usr/local/ssl" +#endif +#endif + +#undef OPENSSL_UNISTD +#define OPENSSL_UNISTD + +#undef OPENSSL_EXPORT_VAR_AS_FUNCTION + +#if defined(HEADER_IDEA_H) && !defined(IDEA_INT) +#define IDEA_INT unsigned int +#endif + +#if defined(HEADER_MD2_H) && !defined(MD2_INT) +#define MD2_INT unsigned int +#endif + +#if defined(HEADER_RC2_H) && !defined(RC2_INT) +/* I need to put in a mod for the alpha - eay */ +#define RC2_INT unsigned int +#endif + +#if defined(HEADER_RC4_H) +#if !defined(RC4_INT) +/* using int types make the structure larger but make the code faster + * on most boxes I have tested - up to %20 faster. */ +/* + * I don't know what does "most" mean, but declaring "int" is a must on: + * - Intel P6 because partial register stalls are very expensive; + * - elder Alpha because it lacks byte load/store instructions; + */ +#define RC4_INT unsigned char +#endif +#if !defined(RC4_CHUNK) +/* + * This enables code handling data aligned at natural CPU word + * boundary. See crypto/rc4/rc4_enc.c for further details. + */ +#define RC4_CHUNK unsigned long +#endif +#endif + +#if (defined(HEADER_NEW_DES_H) || defined(HEADER_DES_H)) && !defined(DES_LONG) +/* If this is set to 'unsigned int' on a DEC Alpha, this gives about a + * %20 speed up (longs are 8 bytes, int's are 4). */ +#ifndef DES_LONG +#define DES_LONG unsigned long +#endif +#endif + +#if defined(HEADER_BN_H) && !defined(CONFIG_HEADER_BN_H) +#define CONFIG_HEADER_BN_H +#define BN_LLONG + +/* Should we define BN_DIV2W here? */ + +/* Only one for the following should be defined */ +#undef SIXTY_FOUR_BIT_LONG +#undef SIXTY_FOUR_BIT +#define THIRTY_TWO_BIT +#endif + +#if defined(HEADER_RC4_LOCL_H) && !defined(CONFIG_HEADER_RC4_LOCL_H) +#define CONFIG_HEADER_RC4_LOCL_H +/* if this is defined data[i] is used instead of *data, this is a %20 + * speedup on x86 */ +#undef RC4_INDEX +#endif + +#if defined(HEADER_BF_LOCL_H) && !defined(CONFIG_HEADER_BF_LOCL_H) +#define CONFIG_HEADER_BF_LOCL_H +#define BF_PTR +#endif /* HEADER_BF_LOCL_H */ + +#if defined(HEADER_DES_LOCL_H) && !defined(CONFIG_HEADER_DES_LOCL_H) +#define CONFIG_HEADER_DES_LOCL_H +#ifndef DES_DEFAULT_OPTIONS +/* the following is tweaked from a config script, that is why it is a + * protected undef/define */ +#ifndef DES_PTR +#undef DES_PTR +#endif + +/* This helps C compiler generate the correct code for multiple functional + * units. It reduces register dependancies at the expense of 2 more + * registers */ +#ifndef DES_RISC1 +#undef DES_RISC1 +#endif + +#ifndef DES_RISC2 +#undef DES_RISC2 +#endif + +#if defined(DES_RISC1) && defined(DES_RISC2) +#error YOU SHOULD NOT HAVE BOTH DES_RISC1 AND DES_RISC2 DEFINED!!!!! +#endif + +/* Unroll the inner loop, this sometimes helps, sometimes hinders. + * Very mucy CPU dependant */ +#ifndef DES_UNROLL +#define DES_UNROLL +#endif + +/* These default values were supplied by + * Peter Gutman + * They are only used if nothing else has been defined */ +#if !defined(DES_PTR) && !defined(DES_RISC1) && !defined(DES_RISC2) && !defined(DES_UNROLL) +/* Special defines which change the way the code is built depending on the + CPU and OS. For SGI machines you can use _MIPS_SZLONG (32 or 64) to find + even newer MIPS CPU's, but at the moment one size fits all for + optimization options. Older Sparc's work better with only UNROLL, but + there's no way to tell at compile time what it is you're running on */ + +#if defined( __sun ) || defined ( sun ) /* Newer Sparc's */ +# define DES_PTR +# define DES_RISC1 +# define DES_UNROLL +#elif defined( __ultrix ) /* Older MIPS */ +# define DES_PTR +# define DES_RISC2 +# define DES_UNROLL +#elif defined( __osf1__ ) /* Alpha */ +# define DES_PTR +# define DES_RISC2 +#elif defined ( _AIX ) /* RS6000 */ + /* Unknown */ +#elif defined( __hpux ) /* HP-PA */ + /* Unknown */ +#elif defined( __aux ) /* 68K */ + /* Unknown */ +#elif defined( __dgux ) /* 88K (but P6 in latest boxes) */ +# define DES_UNROLL +#elif defined( __sgi ) /* Newer MIPS */ +# define DES_PTR +# define DES_RISC2 +# define DES_UNROLL +#elif defined(i386) || defined(__i386__) /* x86 boxes, should be gcc */ +# define DES_PTR +# define DES_RISC1 +# define DES_UNROLL +#endif /* Systems-specific speed defines */ +#endif + +#endif /* DES_DEFAULT_OPTIONS */ +#endif /* HEADER_DES_LOCL_H */ +#ifdef __cplusplus +} +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/opensslv.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/opensslv.h new file mode 100644 index 0000000..88faad6 --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/opensslv.h @@ -0,0 +1,97 @@ +#ifndef HEADER_OPENSSLV_H +# define HEADER_OPENSSLV_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*- + * Numeric release version identifier: + * MNNFFPPS: major minor fix patch status + * The status nibble has one of the values 0 for development, 1 to e for betas + * 1 to 14, and f for release. The patch level is exactly that. + * For example: + * 0.9.3-dev 0x00903000 + * 0.9.3-beta1 0x00903001 + * 0.9.3-beta2-dev 0x00903002 + * 0.9.3-beta2 0x00903002 (same as ...beta2-dev) + * 0.9.3 0x0090300f + * 0.9.3a 0x0090301f + * 0.9.4 0x0090400f + * 1.2.3z 0x102031af + * + * For continuity reasons (because 0.9.5 is already out, and is coded + * 0x00905100), between 0.9.5 and 0.9.6 the coding of the patch level + * part is slightly different, by setting the highest bit. This means + * that 0.9.5a looks like this: 0x0090581f. At 0.9.6, we can start + * with 0x0090600S... + * + * (Prior to 0.9.3-dev a different scheme was used: 0.9.2b is 0x0922.) + * (Prior to 0.9.5a beta1, a different scheme was used: MMNNFFRBB for + * major minor fix final patch/beta) + */ +# define OPENSSL_VERSION_NUMBER 0x100020afL +# ifdef OPENSSL_FIPS +# define OPENSSL_VERSION_TEXT "OpenSSL 1.0.2j-fips 26 Sep 2016" +# else +# define OPENSSL_VERSION_TEXT "OpenSSL 1.0.2j 26 Sep 2016" +# endif +# define OPENSSL_VERSION_PTEXT " part of " OPENSSL_VERSION_TEXT + +/*- + * The macros below are to be used for shared library (.so, .dll, ...) + * versioning. That kind of versioning works a bit differently between + * operating systems. The most usual scheme is to set a major and a minor + * number, and have the runtime loader check that the major number is equal + * to what it was at application link time, while the minor number has to + * be greater or equal to what it was at application link time. With this + * scheme, the version number is usually part of the file name, like this: + * + * libcrypto.so.0.9 + * + * Some unixen also make a softlink with the major verson number only: + * + * libcrypto.so.0 + * + * On Tru64 and IRIX 6.x it works a little bit differently. There, the + * shared library version is stored in the file, and is actually a series + * of versions, separated by colons. The rightmost version present in the + * library when linking an application is stored in the application to be + * matched at run time. When the application is run, a check is done to + * see if the library version stored in the application matches any of the + * versions in the version string of the library itself. + * This version string can be constructed in any way, depending on what + * kind of matching is desired. However, to implement the same scheme as + * the one used in the other unixen, all compatible versions, from lowest + * to highest, should be part of the string. Consecutive builds would + * give the following versions strings: + * + * 3.0 + * 3.0:3.1 + * 3.0:3.1:3.2 + * 4.0 + * 4.0:4.1 + * + * Notice how version 4 is completely incompatible with version, and + * therefore give the breach you can see. + * + * There may be other schemes as well that I haven't yet discovered. + * + * So, here's the way it works here: first of all, the library version + * number doesn't need at all to match the overall OpenSSL version. + * However, it's nice and more understandable if it actually does. + * The current library version is stored in the macro SHLIB_VERSION_NUMBER, + * which is just a piece of text in the format "M.m.e" (Major, minor, edit). + * For the sake of Tru64, IRIX, and any other OS that behaves in similar ways, + * we need to keep a history of version numbers, which is done in the + * macro SHLIB_VERSION_HISTORY. The numbers are separated by colons and + * should only keep the versions that are binary compatible with the current. + */ +# define SHLIB_VERSION_HISTORY "" +# define SHLIB_VERSION_NUMBER "1.0.0" + + +#ifdef __cplusplus +} +#endif +#endif /* HEADER_OPENSSLV_H */ diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/ossl_typ.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/ossl_typ.h new file mode 100644 index 0000000..364d262 --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/ossl_typ.h @@ -0,0 +1,213 @@ +/* ==================================================================== + * Copyright (c) 1998-2001 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_OPENSSL_TYPES_H +# define HEADER_OPENSSL_TYPES_H + +#ifdef __cplusplus +extern "C" { +#endif + +# include + +# ifdef NO_ASN1_TYPEDEFS +# define ASN1_INTEGER ASN1_STRING +# define ASN1_ENUMERATED ASN1_STRING +# define ASN1_BIT_STRING ASN1_STRING +# define ASN1_OCTET_STRING ASN1_STRING +# define ASN1_PRINTABLESTRING ASN1_STRING +# define ASN1_T61STRING ASN1_STRING +# define ASN1_IA5STRING ASN1_STRING +# define ASN1_UTCTIME ASN1_STRING +# define ASN1_GENERALIZEDTIME ASN1_STRING +# define ASN1_TIME ASN1_STRING +# define ASN1_GENERALSTRING ASN1_STRING +# define ASN1_UNIVERSALSTRING ASN1_STRING +# define ASN1_BMPSTRING ASN1_STRING +# define ASN1_VISIBLESTRING ASN1_STRING +# define ASN1_UTF8STRING ASN1_STRING +# define ASN1_BOOLEAN int +# define ASN1_NULL int +# else +typedef struct asn1_string_st ASN1_INTEGER; +typedef struct asn1_string_st ASN1_ENUMERATED; +typedef struct asn1_string_st ASN1_BIT_STRING; +typedef struct asn1_string_st ASN1_OCTET_STRING; +typedef struct asn1_string_st ASN1_PRINTABLESTRING; +typedef struct asn1_string_st ASN1_T61STRING; +typedef struct asn1_string_st ASN1_IA5STRING; +typedef struct asn1_string_st ASN1_GENERALSTRING; +typedef struct asn1_string_st ASN1_UNIVERSALSTRING; +typedef struct asn1_string_st ASN1_BMPSTRING; +typedef struct asn1_string_st ASN1_UTCTIME; +typedef struct asn1_string_st ASN1_TIME; +typedef struct asn1_string_st ASN1_GENERALIZEDTIME; +typedef struct asn1_string_st ASN1_VISIBLESTRING; +typedef struct asn1_string_st ASN1_UTF8STRING; +typedef struct asn1_string_st ASN1_STRING; +typedef int ASN1_BOOLEAN; +typedef int ASN1_NULL; +# endif + +typedef struct asn1_object_st ASN1_OBJECT; + +typedef struct ASN1_ITEM_st ASN1_ITEM; +typedef struct asn1_pctx_st ASN1_PCTX; + +# ifdef OPENSSL_SYS_WIN32 +# undef X509_NAME +# undef X509_EXTENSIONS +# undef X509_CERT_PAIR +# undef PKCS7_ISSUER_AND_SERIAL +# undef OCSP_REQUEST +# undef OCSP_RESPONSE +# endif + +# ifdef BIGNUM +# undef BIGNUM +# endif +typedef struct bignum_st BIGNUM; +typedef struct bignum_ctx BN_CTX; +typedef struct bn_blinding_st BN_BLINDING; +typedef struct bn_mont_ctx_st BN_MONT_CTX; +typedef struct bn_recp_ctx_st BN_RECP_CTX; +typedef struct bn_gencb_st BN_GENCB; + +typedef struct buf_mem_st BUF_MEM; + +typedef struct evp_cipher_st EVP_CIPHER; +typedef struct evp_cipher_ctx_st EVP_CIPHER_CTX; +typedef struct env_md_st EVP_MD; +typedef struct env_md_ctx_st EVP_MD_CTX; +typedef struct evp_pkey_st EVP_PKEY; + +typedef struct evp_pkey_asn1_method_st EVP_PKEY_ASN1_METHOD; + +typedef struct evp_pkey_method_st EVP_PKEY_METHOD; +typedef struct evp_pkey_ctx_st EVP_PKEY_CTX; + +typedef struct dh_st DH; +typedef struct dh_method DH_METHOD; + +typedef struct dsa_st DSA; +typedef struct dsa_method DSA_METHOD; + +typedef struct rsa_st RSA; +typedef struct rsa_meth_st RSA_METHOD; + +typedef struct rand_meth_st RAND_METHOD; + +typedef struct ecdh_method ECDH_METHOD; +typedef struct ecdsa_method ECDSA_METHOD; + +typedef struct x509_st X509; +typedef struct X509_algor_st X509_ALGOR; +typedef struct X509_crl_st X509_CRL; +typedef struct x509_crl_method_st X509_CRL_METHOD; +typedef struct x509_revoked_st X509_REVOKED; +typedef struct X509_name_st X509_NAME; +typedef struct X509_pubkey_st X509_PUBKEY; +typedef struct x509_store_st X509_STORE; +typedef struct x509_store_ctx_st X509_STORE_CTX; + +typedef struct pkcs8_priv_key_info_st PKCS8_PRIV_KEY_INFO; + +typedef struct v3_ext_ctx X509V3_CTX; +typedef struct conf_st CONF; + +typedef struct store_st STORE; +typedef struct store_method_st STORE_METHOD; + +typedef struct ui_st UI; +typedef struct ui_method_st UI_METHOD; + +typedef struct st_ERR_FNS ERR_FNS; + +typedef struct engine_st ENGINE; +typedef struct ssl_st SSL; +typedef struct ssl_ctx_st SSL_CTX; + +typedef struct comp_method_st COMP_METHOD; + +typedef struct X509_POLICY_NODE_st X509_POLICY_NODE; +typedef struct X509_POLICY_LEVEL_st X509_POLICY_LEVEL; +typedef struct X509_POLICY_TREE_st X509_POLICY_TREE; +typedef struct X509_POLICY_CACHE_st X509_POLICY_CACHE; + +typedef struct AUTHORITY_KEYID_st AUTHORITY_KEYID; +typedef struct DIST_POINT_st DIST_POINT; +typedef struct ISSUING_DIST_POINT_st ISSUING_DIST_POINT; +typedef struct NAME_CONSTRAINTS_st NAME_CONSTRAINTS; + + /* If placed in pkcs12.h, we end up with a circular depency with pkcs7.h */ +# define DECLARE_PKCS12_STACK_OF(type)/* Nothing */ +# define IMPLEMENT_PKCS12_STACK_OF(type)/* Nothing */ + +typedef struct crypto_ex_data_st CRYPTO_EX_DATA; +/* Callback types for crypto.h */ +typedef int CRYPTO_EX_new (void *parent, void *ptr, CRYPTO_EX_DATA *ad, + int idx, long argl, void *argp); +typedef void CRYPTO_EX_free (void *parent, void *ptr, CRYPTO_EX_DATA *ad, + int idx, long argl, void *argp); +typedef int CRYPTO_EX_dup (CRYPTO_EX_DATA *to, CRYPTO_EX_DATA *from, + void *from_d, int idx, long argl, void *argp); + +typedef struct ocsp_req_ctx_st OCSP_REQ_CTX; +typedef struct ocsp_response_st OCSP_RESPONSE; +typedef struct ocsp_responder_id_st OCSP_RESPID; + +#ifdef __cplusplus +} +#endif +#endif /* def HEADER_OPENSSL_TYPES_H */ diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/pem.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/pem.h new file mode 100644 index 0000000..aac72fb --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/pem.h @@ -0,0 +1,617 @@ +/* crypto/pem/pem.h */ +/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_PEM_H +# define HEADER_PEM_H + +# include +# ifndef OPENSSL_NO_BIO +# include +# endif +# ifndef OPENSSL_NO_STACK +# include +# endif +# include +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# define PEM_BUFSIZE 1024 + +# define PEM_OBJ_UNDEF 0 +# define PEM_OBJ_X509 1 +# define PEM_OBJ_X509_REQ 2 +# define PEM_OBJ_CRL 3 +# define PEM_OBJ_SSL_SESSION 4 +# define PEM_OBJ_PRIV_KEY 10 +# define PEM_OBJ_PRIV_RSA 11 +# define PEM_OBJ_PRIV_DSA 12 +# define PEM_OBJ_PRIV_DH 13 +# define PEM_OBJ_PUB_RSA 14 +# define PEM_OBJ_PUB_DSA 15 +# define PEM_OBJ_PUB_DH 16 +# define PEM_OBJ_DHPARAMS 17 +# define PEM_OBJ_DSAPARAMS 18 +# define PEM_OBJ_PRIV_RSA_PUBLIC 19 +# define PEM_OBJ_PRIV_ECDSA 20 +# define PEM_OBJ_PUB_ECDSA 21 +# define PEM_OBJ_ECPARAMETERS 22 + +# define PEM_ERROR 30 +# define PEM_DEK_DES_CBC 40 +# define PEM_DEK_IDEA_CBC 45 +# define PEM_DEK_DES_EDE 50 +# define PEM_DEK_DES_ECB 60 +# define PEM_DEK_RSA 70 +# define PEM_DEK_RSA_MD2 80 +# define PEM_DEK_RSA_MD5 90 + +# define PEM_MD_MD2 NID_md2 +# define PEM_MD_MD5 NID_md5 +# define PEM_MD_SHA NID_sha +# define PEM_MD_MD2_RSA NID_md2WithRSAEncryption +# define PEM_MD_MD5_RSA NID_md5WithRSAEncryption +# define PEM_MD_SHA_RSA NID_sha1WithRSAEncryption + +# define PEM_STRING_X509_OLD "X509 CERTIFICATE" +# define PEM_STRING_X509 "CERTIFICATE" +# define PEM_STRING_X509_PAIR "CERTIFICATE PAIR" +# define PEM_STRING_X509_TRUSTED "TRUSTED CERTIFICATE" +# define PEM_STRING_X509_REQ_OLD "NEW CERTIFICATE REQUEST" +# define PEM_STRING_X509_REQ "CERTIFICATE REQUEST" +# define PEM_STRING_X509_CRL "X509 CRL" +# define PEM_STRING_EVP_PKEY "ANY PRIVATE KEY" +# define PEM_STRING_PUBLIC "PUBLIC KEY" +# define PEM_STRING_RSA "RSA PRIVATE KEY" +# define PEM_STRING_RSA_PUBLIC "RSA PUBLIC KEY" +# define PEM_STRING_DSA "DSA PRIVATE KEY" +# define PEM_STRING_DSA_PUBLIC "DSA PUBLIC KEY" +# define PEM_STRING_PKCS7 "PKCS7" +# define PEM_STRING_PKCS7_SIGNED "PKCS #7 SIGNED DATA" +# define PEM_STRING_PKCS8 "ENCRYPTED PRIVATE KEY" +# define PEM_STRING_PKCS8INF "PRIVATE KEY" +# define PEM_STRING_DHPARAMS "DH PARAMETERS" +# define PEM_STRING_DHXPARAMS "X9.42 DH PARAMETERS" +# define PEM_STRING_SSL_SESSION "SSL SESSION PARAMETERS" +# define PEM_STRING_DSAPARAMS "DSA PARAMETERS" +# define PEM_STRING_ECDSA_PUBLIC "ECDSA PUBLIC KEY" +# define PEM_STRING_ECPARAMETERS "EC PARAMETERS" +# define PEM_STRING_ECPRIVATEKEY "EC PRIVATE KEY" +# define PEM_STRING_PARAMETERS "PARAMETERS" +# define PEM_STRING_CMS "CMS" + + /* + * Note that this structure is initialised by PEM_SealInit and cleaned up + * by PEM_SealFinal (at least for now) + */ +typedef struct PEM_Encode_Seal_st { + EVP_ENCODE_CTX encode; + EVP_MD_CTX md; + EVP_CIPHER_CTX cipher; +} PEM_ENCODE_SEAL_CTX; + +/* enc_type is one off */ +# define PEM_TYPE_ENCRYPTED 10 +# define PEM_TYPE_MIC_ONLY 20 +# define PEM_TYPE_MIC_CLEAR 30 +# define PEM_TYPE_CLEAR 40 + +typedef struct pem_recip_st { + char *name; + X509_NAME *dn; + int cipher; + int key_enc; + /* char iv[8]; unused and wrong size */ +} PEM_USER; + +typedef struct pem_ctx_st { + int type; /* what type of object */ + struct { + int version; + int mode; + } proc_type; + + char *domain; + + struct { + int cipher; + /*- + unused, and wrong size + unsigned char iv[8]; */ + } DEK_info; + + PEM_USER *originator; + + int num_recipient; + PEM_USER **recipient; +/*- + XXX(ben): don#t think this is used! + STACK *x509_chain; / * certificate chain */ + EVP_MD *md; /* signature type */ + + int md_enc; /* is the md encrypted or not? */ + int md_len; /* length of md_data */ + char *md_data; /* message digest, could be pkey encrypted */ + + EVP_CIPHER *dec; /* date encryption cipher */ + int key_len; /* key length */ + unsigned char *key; /* key */ + /*- + unused, and wrong size + unsigned char iv[8]; */ + + int data_enc; /* is the data encrypted */ + int data_len; + unsigned char *data; +} PEM_CTX; + +/* + * These macros make the PEM_read/PEM_write functions easier to maintain and + * write. Now they are all implemented with either: IMPLEMENT_PEM_rw(...) or + * IMPLEMENT_PEM_rw_cb(...) + */ + +# ifdef OPENSSL_NO_FP_API + +# define IMPLEMENT_PEM_read_fp(name, type, str, asn1) /**/ +# define IMPLEMENT_PEM_write_fp(name, type, str, asn1) /**/ +# define IMPLEMENT_PEM_write_fp_const(name, type, str, asn1) /**/ +# define IMPLEMENT_PEM_write_cb_fp(name, type, str, asn1) /**/ +# define IMPLEMENT_PEM_write_cb_fp_const(name, type, str, asn1) /**/ +# else + +# define IMPLEMENT_PEM_read_fp(name, type, str, asn1) \ +type *PEM_read_##name(FILE *fp, type **x, pem_password_cb *cb, void *u)\ +{ \ +return PEM_ASN1_read((d2i_of_void *)d2i_##asn1, str,fp,(void **)x,cb,u); \ +} + +# define IMPLEMENT_PEM_write_fp(name, type, str, asn1) \ +int PEM_write_##name(FILE *fp, type *x) \ +{ \ +return PEM_ASN1_write((i2d_of_void *)i2d_##asn1,str,fp,x,NULL,NULL,0,NULL,NULL); \ +} + +# define IMPLEMENT_PEM_write_fp_const(name, type, str, asn1) \ +int PEM_write_##name(FILE *fp, const type *x) \ +{ \ +return PEM_ASN1_write((i2d_of_void *)i2d_##asn1,str,fp,(void *)x,NULL,NULL,0,NULL,NULL); \ +} + +# define IMPLEMENT_PEM_write_cb_fp(name, type, str, asn1) \ +int PEM_write_##name(FILE *fp, type *x, const EVP_CIPHER *enc, \ + unsigned char *kstr, int klen, pem_password_cb *cb, \ + void *u) \ + { \ + return PEM_ASN1_write((i2d_of_void *)i2d_##asn1,str,fp,x,enc,kstr,klen,cb,u); \ + } + +# define IMPLEMENT_PEM_write_cb_fp_const(name, type, str, asn1) \ +int PEM_write_##name(FILE *fp, type *x, const EVP_CIPHER *enc, \ + unsigned char *kstr, int klen, pem_password_cb *cb, \ + void *u) \ + { \ + return PEM_ASN1_write((i2d_of_void *)i2d_##asn1,str,fp,x,enc,kstr,klen,cb,u); \ + } + +# endif + +# define IMPLEMENT_PEM_read_bio(name, type, str, asn1) \ +type *PEM_read_bio_##name(BIO *bp, type **x, pem_password_cb *cb, void *u)\ +{ \ +return PEM_ASN1_read_bio((d2i_of_void *)d2i_##asn1, str,bp,(void **)x,cb,u); \ +} + +# define IMPLEMENT_PEM_write_bio(name, type, str, asn1) \ +int PEM_write_bio_##name(BIO *bp, type *x) \ +{ \ +return PEM_ASN1_write_bio((i2d_of_void *)i2d_##asn1,str,bp,x,NULL,NULL,0,NULL,NULL); \ +} + +# define IMPLEMENT_PEM_write_bio_const(name, type, str, asn1) \ +int PEM_write_bio_##name(BIO *bp, const type *x) \ +{ \ +return PEM_ASN1_write_bio((i2d_of_void *)i2d_##asn1,str,bp,(void *)x,NULL,NULL,0,NULL,NULL); \ +} + +# define IMPLEMENT_PEM_write_cb_bio(name, type, str, asn1) \ +int PEM_write_bio_##name(BIO *bp, type *x, const EVP_CIPHER *enc, \ + unsigned char *kstr, int klen, pem_password_cb *cb, void *u) \ + { \ + return PEM_ASN1_write_bio((i2d_of_void *)i2d_##asn1,str,bp,x,enc,kstr,klen,cb,u); \ + } + +# define IMPLEMENT_PEM_write_cb_bio_const(name, type, str, asn1) \ +int PEM_write_bio_##name(BIO *bp, type *x, const EVP_CIPHER *enc, \ + unsigned char *kstr, int klen, pem_password_cb *cb, void *u) \ + { \ + return PEM_ASN1_write_bio((i2d_of_void *)i2d_##asn1,str,bp,(void *)x,enc,kstr,klen,cb,u); \ + } + +# define IMPLEMENT_PEM_write(name, type, str, asn1) \ + IMPLEMENT_PEM_write_bio(name, type, str, asn1) \ + IMPLEMENT_PEM_write_fp(name, type, str, asn1) + +# define IMPLEMENT_PEM_write_const(name, type, str, asn1) \ + IMPLEMENT_PEM_write_bio_const(name, type, str, asn1) \ + IMPLEMENT_PEM_write_fp_const(name, type, str, asn1) + +# define IMPLEMENT_PEM_write_cb(name, type, str, asn1) \ + IMPLEMENT_PEM_write_cb_bio(name, type, str, asn1) \ + IMPLEMENT_PEM_write_cb_fp(name, type, str, asn1) + +# define IMPLEMENT_PEM_write_cb_const(name, type, str, asn1) \ + IMPLEMENT_PEM_write_cb_bio_const(name, type, str, asn1) \ + IMPLEMENT_PEM_write_cb_fp_const(name, type, str, asn1) + +# define IMPLEMENT_PEM_read(name, type, str, asn1) \ + IMPLEMENT_PEM_read_bio(name, type, str, asn1) \ + IMPLEMENT_PEM_read_fp(name, type, str, asn1) + +# define IMPLEMENT_PEM_rw(name, type, str, asn1) \ + IMPLEMENT_PEM_read(name, type, str, asn1) \ + IMPLEMENT_PEM_write(name, type, str, asn1) + +# define IMPLEMENT_PEM_rw_const(name, type, str, asn1) \ + IMPLEMENT_PEM_read(name, type, str, asn1) \ + IMPLEMENT_PEM_write_const(name, type, str, asn1) + +# define IMPLEMENT_PEM_rw_cb(name, type, str, asn1) \ + IMPLEMENT_PEM_read(name, type, str, asn1) \ + IMPLEMENT_PEM_write_cb(name, type, str, asn1) + +/* These are the same except they are for the declarations */ + +# if defined(OPENSSL_NO_FP_API) + +# define DECLARE_PEM_read_fp(name, type) /**/ +# define DECLARE_PEM_write_fp(name, type) /**/ +# define DECLARE_PEM_write_cb_fp(name, type) /**/ +# else + +# define DECLARE_PEM_read_fp(name, type) \ + type *PEM_read_##name(FILE *fp, type **x, pem_password_cb *cb, void *u); + +# define DECLARE_PEM_write_fp(name, type) \ + int PEM_write_##name(FILE *fp, type *x); + +# define DECLARE_PEM_write_fp_const(name, type) \ + int PEM_write_##name(FILE *fp, const type *x); + +# define DECLARE_PEM_write_cb_fp(name, type) \ + int PEM_write_##name(FILE *fp, type *x, const EVP_CIPHER *enc, \ + unsigned char *kstr, int klen, pem_password_cb *cb, void *u); + +# endif + +# ifndef OPENSSL_NO_BIO +# define DECLARE_PEM_read_bio(name, type) \ + type *PEM_read_bio_##name(BIO *bp, type **x, pem_password_cb *cb, void *u); + +# define DECLARE_PEM_write_bio(name, type) \ + int PEM_write_bio_##name(BIO *bp, type *x); + +# define DECLARE_PEM_write_bio_const(name, type) \ + int PEM_write_bio_##name(BIO *bp, const type *x); + +# define DECLARE_PEM_write_cb_bio(name, type) \ + int PEM_write_bio_##name(BIO *bp, type *x, const EVP_CIPHER *enc, \ + unsigned char *kstr, int klen, pem_password_cb *cb, void *u); + +# else + +# define DECLARE_PEM_read_bio(name, type) /**/ +# define DECLARE_PEM_write_bio(name, type) /**/ +# define DECLARE_PEM_write_bio_const(name, type) /**/ +# define DECLARE_PEM_write_cb_bio(name, type) /**/ +# endif +# define DECLARE_PEM_write(name, type) \ + DECLARE_PEM_write_bio(name, type) \ + DECLARE_PEM_write_fp(name, type) +# define DECLARE_PEM_write_const(name, type) \ + DECLARE_PEM_write_bio_const(name, type) \ + DECLARE_PEM_write_fp_const(name, type) +# define DECLARE_PEM_write_cb(name, type) \ + DECLARE_PEM_write_cb_bio(name, type) \ + DECLARE_PEM_write_cb_fp(name, type) +# define DECLARE_PEM_read(name, type) \ + DECLARE_PEM_read_bio(name, type) \ + DECLARE_PEM_read_fp(name, type) +# define DECLARE_PEM_rw(name, type) \ + DECLARE_PEM_read(name, type) \ + DECLARE_PEM_write(name, type) +# define DECLARE_PEM_rw_const(name, type) \ + DECLARE_PEM_read(name, type) \ + DECLARE_PEM_write_const(name, type) +# define DECLARE_PEM_rw_cb(name, type) \ + DECLARE_PEM_read(name, type) \ + DECLARE_PEM_write_cb(name, type) +# if 1 +/* "userdata": new with OpenSSL 0.9.4 */ +typedef int pem_password_cb (char *buf, int size, int rwflag, void *userdata); +# else +/* OpenSSL 0.9.3, 0.9.3a */ +typedef int pem_password_cb (char *buf, int size, int rwflag); +# endif + +int PEM_get_EVP_CIPHER_INFO(char *header, EVP_CIPHER_INFO *cipher); +int PEM_do_header(EVP_CIPHER_INFO *cipher, unsigned char *data, long *len, + pem_password_cb *callback, void *u); + +# ifndef OPENSSL_NO_BIO +int PEM_read_bio(BIO *bp, char **name, char **header, + unsigned char **data, long *len); +int PEM_write_bio(BIO *bp, const char *name, const char *hdr, + const unsigned char *data, long len); +int PEM_bytes_read_bio(unsigned char **pdata, long *plen, char **pnm, + const char *name, BIO *bp, pem_password_cb *cb, + void *u); +void *PEM_ASN1_read_bio(d2i_of_void *d2i, const char *name, BIO *bp, void **x, + pem_password_cb *cb, void *u); +int PEM_ASN1_write_bio(i2d_of_void *i2d, const char *name, BIO *bp, void *x, + const EVP_CIPHER *enc, unsigned char *kstr, int klen, + pem_password_cb *cb, void *u); + +STACK_OF(X509_INFO) *PEM_X509_INFO_read_bio(BIO *bp, STACK_OF(X509_INFO) *sk, + pem_password_cb *cb, void *u); +int PEM_X509_INFO_write_bio(BIO *bp, X509_INFO *xi, EVP_CIPHER *enc, + unsigned char *kstr, int klen, + pem_password_cb *cd, void *u); +# endif + +int PEM_read(FILE *fp, char **name, char **header, + unsigned char **data, long *len); +int PEM_write(FILE *fp, const char *name, const char *hdr, + const unsigned char *data, long len); +void *PEM_ASN1_read(d2i_of_void *d2i, const char *name, FILE *fp, void **x, + pem_password_cb *cb, void *u); +int PEM_ASN1_write(i2d_of_void *i2d, const char *name, FILE *fp, + void *x, const EVP_CIPHER *enc, unsigned char *kstr, + int klen, pem_password_cb *callback, void *u); +STACK_OF(X509_INFO) *PEM_X509_INFO_read(FILE *fp, STACK_OF(X509_INFO) *sk, + pem_password_cb *cb, void *u); + +int PEM_SealInit(PEM_ENCODE_SEAL_CTX *ctx, EVP_CIPHER *type, + EVP_MD *md_type, unsigned char **ek, int *ekl, + unsigned char *iv, EVP_PKEY **pubk, int npubk); +void PEM_SealUpdate(PEM_ENCODE_SEAL_CTX *ctx, unsigned char *out, int *outl, + unsigned char *in, int inl); +int PEM_SealFinal(PEM_ENCODE_SEAL_CTX *ctx, unsigned char *sig, int *sigl, + unsigned char *out, int *outl, EVP_PKEY *priv); + +void PEM_SignInit(EVP_MD_CTX *ctx, EVP_MD *type); +void PEM_SignUpdate(EVP_MD_CTX *ctx, unsigned char *d, unsigned int cnt); +int PEM_SignFinal(EVP_MD_CTX *ctx, unsigned char *sigret, + unsigned int *siglen, EVP_PKEY *pkey); + +int PEM_def_callback(char *buf, int num, int w, void *key); +void PEM_proc_type(char *buf, int type); +void PEM_dek_info(char *buf, const char *type, int len, char *str); + +# include + +DECLARE_PEM_rw(X509, X509) +DECLARE_PEM_rw(X509_AUX, X509) +DECLARE_PEM_rw(X509_CERT_PAIR, X509_CERT_PAIR) +DECLARE_PEM_rw(X509_REQ, X509_REQ) +DECLARE_PEM_write(X509_REQ_NEW, X509_REQ) +DECLARE_PEM_rw(X509_CRL, X509_CRL) +DECLARE_PEM_rw(PKCS7, PKCS7) +DECLARE_PEM_rw(NETSCAPE_CERT_SEQUENCE, NETSCAPE_CERT_SEQUENCE) +DECLARE_PEM_rw(PKCS8, X509_SIG) +DECLARE_PEM_rw(PKCS8_PRIV_KEY_INFO, PKCS8_PRIV_KEY_INFO) +# ifndef OPENSSL_NO_RSA +DECLARE_PEM_rw_cb(RSAPrivateKey, RSA) +DECLARE_PEM_rw_const(RSAPublicKey, RSA) +DECLARE_PEM_rw(RSA_PUBKEY, RSA) +# endif +# ifndef OPENSSL_NO_DSA +DECLARE_PEM_rw_cb(DSAPrivateKey, DSA) +DECLARE_PEM_rw(DSA_PUBKEY, DSA) +DECLARE_PEM_rw_const(DSAparams, DSA) +# endif +# ifndef OPENSSL_NO_EC +DECLARE_PEM_rw_const(ECPKParameters, EC_GROUP) +DECLARE_PEM_rw_cb(ECPrivateKey, EC_KEY) +DECLARE_PEM_rw(EC_PUBKEY, EC_KEY) +# endif +# ifndef OPENSSL_NO_DH +DECLARE_PEM_rw_const(DHparams, DH) +DECLARE_PEM_write_const(DHxparams, DH) +# endif +DECLARE_PEM_rw_cb(PrivateKey, EVP_PKEY) +DECLARE_PEM_rw(PUBKEY, EVP_PKEY) + +int PEM_write_bio_PKCS8PrivateKey_nid(BIO *bp, EVP_PKEY *x, int nid, + char *kstr, int klen, + pem_password_cb *cb, void *u); +int PEM_write_bio_PKCS8PrivateKey(BIO *, EVP_PKEY *, const EVP_CIPHER *, + char *, int, pem_password_cb *, void *); +int i2d_PKCS8PrivateKey_bio(BIO *bp, EVP_PKEY *x, const EVP_CIPHER *enc, + char *kstr, int klen, + pem_password_cb *cb, void *u); +int i2d_PKCS8PrivateKey_nid_bio(BIO *bp, EVP_PKEY *x, int nid, + char *kstr, int klen, + pem_password_cb *cb, void *u); +EVP_PKEY *d2i_PKCS8PrivateKey_bio(BIO *bp, EVP_PKEY **x, pem_password_cb *cb, + void *u); + +int i2d_PKCS8PrivateKey_fp(FILE *fp, EVP_PKEY *x, const EVP_CIPHER *enc, + char *kstr, int klen, + pem_password_cb *cb, void *u); +int i2d_PKCS8PrivateKey_nid_fp(FILE *fp, EVP_PKEY *x, int nid, + char *kstr, int klen, + pem_password_cb *cb, void *u); +int PEM_write_PKCS8PrivateKey_nid(FILE *fp, EVP_PKEY *x, int nid, + char *kstr, int klen, + pem_password_cb *cb, void *u); + +EVP_PKEY *d2i_PKCS8PrivateKey_fp(FILE *fp, EVP_PKEY **x, pem_password_cb *cb, + void *u); + +int PEM_write_PKCS8PrivateKey(FILE *fp, EVP_PKEY *x, const EVP_CIPHER *enc, + char *kstr, int klen, pem_password_cb *cd, + void *u); + +EVP_PKEY *PEM_read_bio_Parameters(BIO *bp, EVP_PKEY **x); +int PEM_write_bio_Parameters(BIO *bp, EVP_PKEY *x); + +EVP_PKEY *b2i_PrivateKey(const unsigned char **in, long length); +EVP_PKEY *b2i_PublicKey(const unsigned char **in, long length); +EVP_PKEY *b2i_PrivateKey_bio(BIO *in); +EVP_PKEY *b2i_PublicKey_bio(BIO *in); +int i2b_PrivateKey_bio(BIO *out, EVP_PKEY *pk); +int i2b_PublicKey_bio(BIO *out, EVP_PKEY *pk); +# ifndef OPENSSL_NO_RC4 +EVP_PKEY *b2i_PVK_bio(BIO *in, pem_password_cb *cb, void *u); +int i2b_PVK_bio(BIO *out, EVP_PKEY *pk, int enclevel, + pem_password_cb *cb, void *u); +# endif + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ + +void ERR_load_PEM_strings(void); + +/* Error codes for the PEM functions. */ + +/* Function codes. */ +# define PEM_F_B2I_DSS 127 +# define PEM_F_B2I_PVK_BIO 128 +# define PEM_F_B2I_RSA 129 +# define PEM_F_CHECK_BITLEN_DSA 130 +# define PEM_F_CHECK_BITLEN_RSA 131 +# define PEM_F_D2I_PKCS8PRIVATEKEY_BIO 120 +# define PEM_F_D2I_PKCS8PRIVATEKEY_FP 121 +# define PEM_F_DO_B2I 132 +# define PEM_F_DO_B2I_BIO 133 +# define PEM_F_DO_BLOB_HEADER 134 +# define PEM_F_DO_PK8PKEY 126 +# define PEM_F_DO_PK8PKEY_FP 125 +# define PEM_F_DO_PVK_BODY 135 +# define PEM_F_DO_PVK_HEADER 136 +# define PEM_F_I2B_PVK 137 +# define PEM_F_I2B_PVK_BIO 138 +# define PEM_F_LOAD_IV 101 +# define PEM_F_PEM_ASN1_READ 102 +# define PEM_F_PEM_ASN1_READ_BIO 103 +# define PEM_F_PEM_ASN1_WRITE 104 +# define PEM_F_PEM_ASN1_WRITE_BIO 105 +# define PEM_F_PEM_DEF_CALLBACK 100 +# define PEM_F_PEM_DO_HEADER 106 +# define PEM_F_PEM_F_PEM_WRITE_PKCS8PRIVATEKEY 118 +# define PEM_F_PEM_GET_EVP_CIPHER_INFO 107 +# define PEM_F_PEM_PK8PKEY 119 +# define PEM_F_PEM_READ 108 +# define PEM_F_PEM_READ_BIO 109 +# define PEM_F_PEM_READ_BIO_DHPARAMS 141 +# define PEM_F_PEM_READ_BIO_PARAMETERS 140 +# define PEM_F_PEM_READ_BIO_PRIVATEKEY 123 +# define PEM_F_PEM_READ_DHPARAMS 142 +# define PEM_F_PEM_READ_PRIVATEKEY 124 +# define PEM_F_PEM_SEALFINAL 110 +# define PEM_F_PEM_SEALINIT 111 +# define PEM_F_PEM_SIGNFINAL 112 +# define PEM_F_PEM_WRITE 113 +# define PEM_F_PEM_WRITE_BIO 114 +# define PEM_F_PEM_WRITE_PRIVATEKEY 139 +# define PEM_F_PEM_X509_INFO_READ 115 +# define PEM_F_PEM_X509_INFO_READ_BIO 116 +# define PEM_F_PEM_X509_INFO_WRITE_BIO 117 + +/* Reason codes. */ +# define PEM_R_BAD_BASE64_DECODE 100 +# define PEM_R_BAD_DECRYPT 101 +# define PEM_R_BAD_END_LINE 102 +# define PEM_R_BAD_IV_CHARS 103 +# define PEM_R_BAD_MAGIC_NUMBER 116 +# define PEM_R_BAD_PASSWORD_READ 104 +# define PEM_R_BAD_VERSION_NUMBER 117 +# define PEM_R_BIO_WRITE_FAILURE 118 +# define PEM_R_CIPHER_IS_NULL 127 +# define PEM_R_ERROR_CONVERTING_PRIVATE_KEY 115 +# define PEM_R_EXPECTING_PRIVATE_KEY_BLOB 119 +# define PEM_R_EXPECTING_PUBLIC_KEY_BLOB 120 +# define PEM_R_HEADER_TOO_LONG 128 +# define PEM_R_INCONSISTENT_HEADER 121 +# define PEM_R_KEYBLOB_HEADER_PARSE_ERROR 122 +# define PEM_R_KEYBLOB_TOO_SHORT 123 +# define PEM_R_NOT_DEK_INFO 105 +# define PEM_R_NOT_ENCRYPTED 106 +# define PEM_R_NOT_PROC_TYPE 107 +# define PEM_R_NO_START_LINE 108 +# define PEM_R_PROBLEMS_GETTING_PASSWORD 109 +# define PEM_R_PUBLIC_KEY_NO_RSA 110 +# define PEM_R_PVK_DATA_TOO_SHORT 124 +# define PEM_R_PVK_TOO_SHORT 125 +# define PEM_R_READ_KEY 111 +# define PEM_R_SHORT_HEADER 112 +# define PEM_R_UNSUPPORTED_CIPHER 113 +# define PEM_R_UNSUPPORTED_ENCRYPTION 114 +# define PEM_R_UNSUPPORTED_KEY_COMPONENTS 126 + +# ifdef __cplusplus +} +# endif +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/pem2.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/pem2.h new file mode 100644 index 0000000..84897d5 --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/pem2.h @@ -0,0 +1,70 @@ +/* ==================================================================== + * Copyright (c) 1999 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +/* + * This header only exists to break a circular dependency between pem and err + * Ben 30 Jan 1999. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef HEADER_PEM_H +void ERR_load_PEM_strings(void); +#endif + +#ifdef __cplusplus +} +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/pkcs12.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/pkcs12.h new file mode 100644 index 0000000..21f1f62 --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/pkcs12.h @@ -0,0 +1,342 @@ +/* pkcs12.h */ +/* + * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project + * 1999. + */ +/* ==================================================================== + * Copyright (c) 1999 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_PKCS12_H +# define HEADER_PKCS12_H + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# define PKCS12_KEY_ID 1 +# define PKCS12_IV_ID 2 +# define PKCS12_MAC_ID 3 + +/* Default iteration count */ +# ifndef PKCS12_DEFAULT_ITER +# define PKCS12_DEFAULT_ITER PKCS5_DEFAULT_ITER +# endif + +# define PKCS12_MAC_KEY_LENGTH 20 + +# define PKCS12_SALT_LEN 8 + +/* Uncomment out next line for unicode password and names, otherwise ASCII */ + +/* + * #define PBE_UNICODE + */ + +# ifdef PBE_UNICODE +# define PKCS12_key_gen PKCS12_key_gen_uni +# define PKCS12_add_friendlyname PKCS12_add_friendlyname_uni +# else +# define PKCS12_key_gen PKCS12_key_gen_asc +# define PKCS12_add_friendlyname PKCS12_add_friendlyname_asc +# endif + +/* MS key usage constants */ + +# define KEY_EX 0x10 +# define KEY_SIG 0x80 + +typedef struct { + X509_SIG *dinfo; + ASN1_OCTET_STRING *salt; + ASN1_INTEGER *iter; /* defaults to 1 */ +} PKCS12_MAC_DATA; + +typedef struct { + ASN1_INTEGER *version; + PKCS12_MAC_DATA *mac; + PKCS7 *authsafes; +} PKCS12; + +typedef struct { + ASN1_OBJECT *type; + union { + struct pkcs12_bag_st *bag; /* secret, crl and certbag */ + struct pkcs8_priv_key_info_st *keybag; /* keybag */ + X509_SIG *shkeybag; /* shrouded key bag */ + STACK_OF(PKCS12_SAFEBAG) *safes; + ASN1_TYPE *other; + } value; + STACK_OF(X509_ATTRIBUTE) *attrib; +} PKCS12_SAFEBAG; + +DECLARE_STACK_OF(PKCS12_SAFEBAG) +DECLARE_ASN1_SET_OF(PKCS12_SAFEBAG) +DECLARE_PKCS12_STACK_OF(PKCS12_SAFEBAG) + +typedef struct pkcs12_bag_st { + ASN1_OBJECT *type; + union { + ASN1_OCTET_STRING *x509cert; + ASN1_OCTET_STRING *x509crl; + ASN1_OCTET_STRING *octet; + ASN1_IA5STRING *sdsicert; + ASN1_TYPE *other; /* Secret or other bag */ + } value; +} PKCS12_BAGS; + +# define PKCS12_ERROR 0 +# define PKCS12_OK 1 + +/* Compatibility macros */ + +# define M_PKCS12_x5092certbag PKCS12_x5092certbag +# define M_PKCS12_x509crl2certbag PKCS12_x509crl2certbag + +# define M_PKCS12_certbag2x509 PKCS12_certbag2x509 +# define M_PKCS12_certbag2x509crl PKCS12_certbag2x509crl + +# define M_PKCS12_unpack_p7data PKCS12_unpack_p7data +# define M_PKCS12_pack_authsafes PKCS12_pack_authsafes +# define M_PKCS12_unpack_authsafes PKCS12_unpack_authsafes +# define M_PKCS12_unpack_p7encdata PKCS12_unpack_p7encdata + +# define M_PKCS12_decrypt_skey PKCS12_decrypt_skey +# define M_PKCS8_decrypt PKCS8_decrypt + +# define M_PKCS12_bag_type(bg) OBJ_obj2nid((bg)->type) +# define M_PKCS12_cert_bag_type(bg) OBJ_obj2nid((bg)->value.bag->type) +# define M_PKCS12_crl_bag_type M_PKCS12_cert_bag_type + +# define PKCS12_get_attr(bag, attr_nid) \ + PKCS12_get_attr_gen(bag->attrib, attr_nid) + +# define PKCS8_get_attr(p8, attr_nid) \ + PKCS12_get_attr_gen(p8->attributes, attr_nid) + +# define PKCS12_mac_present(p12) ((p12)->mac ? 1 : 0) + +PKCS12_SAFEBAG *PKCS12_x5092certbag(X509 *x509); +PKCS12_SAFEBAG *PKCS12_x509crl2certbag(X509_CRL *crl); +X509 *PKCS12_certbag2x509(PKCS12_SAFEBAG *bag); +X509_CRL *PKCS12_certbag2x509crl(PKCS12_SAFEBAG *bag); + +PKCS12_SAFEBAG *PKCS12_item_pack_safebag(void *obj, const ASN1_ITEM *it, + int nid1, int nid2); +PKCS12_SAFEBAG *PKCS12_MAKE_KEYBAG(PKCS8_PRIV_KEY_INFO *p8); +PKCS8_PRIV_KEY_INFO *PKCS8_decrypt(X509_SIG *p8, const char *pass, + int passlen); +PKCS8_PRIV_KEY_INFO *PKCS12_decrypt_skey(PKCS12_SAFEBAG *bag, + const char *pass, int passlen); +X509_SIG *PKCS8_encrypt(int pbe_nid, const EVP_CIPHER *cipher, + const char *pass, int passlen, unsigned char *salt, + int saltlen, int iter, PKCS8_PRIV_KEY_INFO *p8); +PKCS12_SAFEBAG *PKCS12_MAKE_SHKEYBAG(int pbe_nid, const char *pass, + int passlen, unsigned char *salt, + int saltlen, int iter, + PKCS8_PRIV_KEY_INFO *p8); +PKCS7 *PKCS12_pack_p7data(STACK_OF(PKCS12_SAFEBAG) *sk); +STACK_OF(PKCS12_SAFEBAG) *PKCS12_unpack_p7data(PKCS7 *p7); +PKCS7 *PKCS12_pack_p7encdata(int pbe_nid, const char *pass, int passlen, + unsigned char *salt, int saltlen, int iter, + STACK_OF(PKCS12_SAFEBAG) *bags); +STACK_OF(PKCS12_SAFEBAG) *PKCS12_unpack_p7encdata(PKCS7 *p7, const char *pass, + int passlen); + +int PKCS12_pack_authsafes(PKCS12 *p12, STACK_OF(PKCS7) *safes); +STACK_OF(PKCS7) *PKCS12_unpack_authsafes(PKCS12 *p12); + +int PKCS12_add_localkeyid(PKCS12_SAFEBAG *bag, unsigned char *name, + int namelen); +int PKCS12_add_friendlyname_asc(PKCS12_SAFEBAG *bag, const char *name, + int namelen); +int PKCS12_add_CSPName_asc(PKCS12_SAFEBAG *bag, const char *name, + int namelen); +int PKCS12_add_friendlyname_uni(PKCS12_SAFEBAG *bag, + const unsigned char *name, int namelen); +int PKCS8_add_keyusage(PKCS8_PRIV_KEY_INFO *p8, int usage); +ASN1_TYPE *PKCS12_get_attr_gen(STACK_OF(X509_ATTRIBUTE) *attrs, int attr_nid); +char *PKCS12_get_friendlyname(PKCS12_SAFEBAG *bag); +unsigned char *PKCS12_pbe_crypt(X509_ALGOR *algor, const char *pass, + int passlen, unsigned char *in, int inlen, + unsigned char **data, int *datalen, + int en_de); +void *PKCS12_item_decrypt_d2i(X509_ALGOR *algor, const ASN1_ITEM *it, + const char *pass, int passlen, + ASN1_OCTET_STRING *oct, int zbuf); +ASN1_OCTET_STRING *PKCS12_item_i2d_encrypt(X509_ALGOR *algor, + const ASN1_ITEM *it, + const char *pass, int passlen, + void *obj, int zbuf); +PKCS12 *PKCS12_init(int mode); +int PKCS12_key_gen_asc(const char *pass, int passlen, unsigned char *salt, + int saltlen, int id, int iter, int n, + unsigned char *out, const EVP_MD *md_type); +int PKCS12_key_gen_uni(unsigned char *pass, int passlen, unsigned char *salt, + int saltlen, int id, int iter, int n, + unsigned char *out, const EVP_MD *md_type); +int PKCS12_PBE_keyivgen(EVP_CIPHER_CTX *ctx, const char *pass, int passlen, + ASN1_TYPE *param, const EVP_CIPHER *cipher, + const EVP_MD *md_type, int en_de); +int PKCS12_gen_mac(PKCS12 *p12, const char *pass, int passlen, + unsigned char *mac, unsigned int *maclen); +int PKCS12_verify_mac(PKCS12 *p12, const char *pass, int passlen); +int PKCS12_set_mac(PKCS12 *p12, const char *pass, int passlen, + unsigned char *salt, int saltlen, int iter, + const EVP_MD *md_type); +int PKCS12_setup_mac(PKCS12 *p12, int iter, unsigned char *salt, + int saltlen, const EVP_MD *md_type); +unsigned char *OPENSSL_asc2uni(const char *asc, int asclen, + unsigned char **uni, int *unilen); +char *OPENSSL_uni2asc(unsigned char *uni, int unilen); + +DECLARE_ASN1_FUNCTIONS(PKCS12) +DECLARE_ASN1_FUNCTIONS(PKCS12_MAC_DATA) +DECLARE_ASN1_FUNCTIONS(PKCS12_SAFEBAG) +DECLARE_ASN1_FUNCTIONS(PKCS12_BAGS) + +DECLARE_ASN1_ITEM(PKCS12_SAFEBAGS) +DECLARE_ASN1_ITEM(PKCS12_AUTHSAFES) + +void PKCS12_PBE_add(void); +int PKCS12_parse(PKCS12 *p12, const char *pass, EVP_PKEY **pkey, X509 **cert, + STACK_OF(X509) **ca); +PKCS12 *PKCS12_create(char *pass, char *name, EVP_PKEY *pkey, X509 *cert, + STACK_OF(X509) *ca, int nid_key, int nid_cert, int iter, + int mac_iter, int keytype); + +PKCS12_SAFEBAG *PKCS12_add_cert(STACK_OF(PKCS12_SAFEBAG) **pbags, X509 *cert); +PKCS12_SAFEBAG *PKCS12_add_key(STACK_OF(PKCS12_SAFEBAG) **pbags, + EVP_PKEY *key, int key_usage, int iter, + int key_nid, char *pass); +int PKCS12_add_safe(STACK_OF(PKCS7) **psafes, STACK_OF(PKCS12_SAFEBAG) *bags, + int safe_nid, int iter, char *pass); +PKCS12 *PKCS12_add_safes(STACK_OF(PKCS7) *safes, int p7_nid); + +int i2d_PKCS12_bio(BIO *bp, PKCS12 *p12); +int i2d_PKCS12_fp(FILE *fp, PKCS12 *p12); +PKCS12 *d2i_PKCS12_bio(BIO *bp, PKCS12 **p12); +PKCS12 *d2i_PKCS12_fp(FILE *fp, PKCS12 **p12); +int PKCS12_newpass(PKCS12 *p12, const char *oldpass, const char *newpass); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_PKCS12_strings(void); + +/* Error codes for the PKCS12 functions. */ + +/* Function codes. */ +# define PKCS12_F_PARSE_BAG 129 +# define PKCS12_F_PARSE_BAGS 103 +# define PKCS12_F_PKCS12_ADD_FRIENDLYNAME 100 +# define PKCS12_F_PKCS12_ADD_FRIENDLYNAME_ASC 127 +# define PKCS12_F_PKCS12_ADD_FRIENDLYNAME_UNI 102 +# define PKCS12_F_PKCS12_ADD_LOCALKEYID 104 +# define PKCS12_F_PKCS12_CREATE 105 +# define PKCS12_F_PKCS12_GEN_MAC 107 +# define PKCS12_F_PKCS12_INIT 109 +# define PKCS12_F_PKCS12_ITEM_DECRYPT_D2I 106 +# define PKCS12_F_PKCS12_ITEM_I2D_ENCRYPT 108 +# define PKCS12_F_PKCS12_ITEM_PACK_SAFEBAG 117 +# define PKCS12_F_PKCS12_KEY_GEN_ASC 110 +# define PKCS12_F_PKCS12_KEY_GEN_UNI 111 +# define PKCS12_F_PKCS12_MAKE_KEYBAG 112 +# define PKCS12_F_PKCS12_MAKE_SHKEYBAG 113 +# define PKCS12_F_PKCS12_NEWPASS 128 +# define PKCS12_F_PKCS12_PACK_P7DATA 114 +# define PKCS12_F_PKCS12_PACK_P7ENCDATA 115 +# define PKCS12_F_PKCS12_PARSE 118 +# define PKCS12_F_PKCS12_PBE_CRYPT 119 +# define PKCS12_F_PKCS12_PBE_KEYIVGEN 120 +# define PKCS12_F_PKCS12_SETUP_MAC 122 +# define PKCS12_F_PKCS12_SET_MAC 123 +# define PKCS12_F_PKCS12_UNPACK_AUTHSAFES 130 +# define PKCS12_F_PKCS12_UNPACK_P7DATA 131 +# define PKCS12_F_PKCS12_VERIFY_MAC 126 +# define PKCS12_F_PKCS8_ADD_KEYUSAGE 124 +# define PKCS12_F_PKCS8_ENCRYPT 125 + +/* Reason codes. */ +# define PKCS12_R_CANT_PACK_STRUCTURE 100 +# define PKCS12_R_CONTENT_TYPE_NOT_DATA 121 +# define PKCS12_R_DECODE_ERROR 101 +# define PKCS12_R_ENCODE_ERROR 102 +# define PKCS12_R_ENCRYPT_ERROR 103 +# define PKCS12_R_ERROR_SETTING_ENCRYPTED_DATA_TYPE 120 +# define PKCS12_R_INVALID_NULL_ARGUMENT 104 +# define PKCS12_R_INVALID_NULL_PKCS12_POINTER 105 +# define PKCS12_R_IV_GEN_ERROR 106 +# define PKCS12_R_KEY_GEN_ERROR 107 +# define PKCS12_R_MAC_ABSENT 108 +# define PKCS12_R_MAC_GENERATION_ERROR 109 +# define PKCS12_R_MAC_SETUP_ERROR 110 +# define PKCS12_R_MAC_STRING_SET_ERROR 111 +# define PKCS12_R_MAC_VERIFY_ERROR 112 +# define PKCS12_R_MAC_VERIFY_FAILURE 113 +# define PKCS12_R_PARSE_ERROR 114 +# define PKCS12_R_PKCS12_ALGOR_CIPHERINIT_ERROR 115 +# define PKCS12_R_PKCS12_CIPHERFINAL_ERROR 116 +# define PKCS12_R_PKCS12_PBE_CRYPT_ERROR 117 +# define PKCS12_R_UNKNOWN_DIGEST_ALGORITHM 118 +# define PKCS12_R_UNSUPPORTED_PKCS12_MODE 119 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/pkcs7.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/pkcs7.h new file mode 100644 index 0000000..b51b386 --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/pkcs7.h @@ -0,0 +1,481 @@ +/* crypto/pkcs7/pkcs7.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_PKCS7_H +# define HEADER_PKCS7_H + +# include +# include +# include + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# ifdef OPENSSL_SYS_WIN32 +/* Under Win32 thes are defined in wincrypt.h */ +# undef PKCS7_ISSUER_AND_SERIAL +# undef PKCS7_SIGNER_INFO +# endif + +/*- +Encryption_ID DES-CBC +Digest_ID MD5 +Digest_Encryption_ID rsaEncryption +Key_Encryption_ID rsaEncryption +*/ + +typedef struct pkcs7_issuer_and_serial_st { + X509_NAME *issuer; + ASN1_INTEGER *serial; +} PKCS7_ISSUER_AND_SERIAL; + +typedef struct pkcs7_signer_info_st { + ASN1_INTEGER *version; /* version 1 */ + PKCS7_ISSUER_AND_SERIAL *issuer_and_serial; + X509_ALGOR *digest_alg; + STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */ + X509_ALGOR *digest_enc_alg; + ASN1_OCTET_STRING *enc_digest; + STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */ + /* The private key to sign with */ + EVP_PKEY *pkey; +} PKCS7_SIGNER_INFO; + +DECLARE_STACK_OF(PKCS7_SIGNER_INFO) +DECLARE_ASN1_SET_OF(PKCS7_SIGNER_INFO) + +typedef struct pkcs7_recip_info_st { + ASN1_INTEGER *version; /* version 0 */ + PKCS7_ISSUER_AND_SERIAL *issuer_and_serial; + X509_ALGOR *key_enc_algor; + ASN1_OCTET_STRING *enc_key; + X509 *cert; /* get the pub-key from this */ +} PKCS7_RECIP_INFO; + +DECLARE_STACK_OF(PKCS7_RECIP_INFO) +DECLARE_ASN1_SET_OF(PKCS7_RECIP_INFO) + +typedef struct pkcs7_signed_st { + ASN1_INTEGER *version; /* version 1 */ + STACK_OF(X509_ALGOR) *md_algs; /* md used */ + STACK_OF(X509) *cert; /* [ 0 ] */ + STACK_OF(X509_CRL) *crl; /* [ 1 ] */ + STACK_OF(PKCS7_SIGNER_INFO) *signer_info; + struct pkcs7_st *contents; +} PKCS7_SIGNED; +/* + * The above structure is very very similar to PKCS7_SIGN_ENVELOPE. How about + * merging the two + */ + +typedef struct pkcs7_enc_content_st { + ASN1_OBJECT *content_type; + X509_ALGOR *algorithm; + ASN1_OCTET_STRING *enc_data; /* [ 0 ] */ + const EVP_CIPHER *cipher; +} PKCS7_ENC_CONTENT; + +typedef struct pkcs7_enveloped_st { + ASN1_INTEGER *version; /* version 0 */ + STACK_OF(PKCS7_RECIP_INFO) *recipientinfo; + PKCS7_ENC_CONTENT *enc_data; +} PKCS7_ENVELOPE; + +typedef struct pkcs7_signedandenveloped_st { + ASN1_INTEGER *version; /* version 1 */ + STACK_OF(X509_ALGOR) *md_algs; /* md used */ + STACK_OF(X509) *cert; /* [ 0 ] */ + STACK_OF(X509_CRL) *crl; /* [ 1 ] */ + STACK_OF(PKCS7_SIGNER_INFO) *signer_info; + PKCS7_ENC_CONTENT *enc_data; + STACK_OF(PKCS7_RECIP_INFO) *recipientinfo; +} PKCS7_SIGN_ENVELOPE; + +typedef struct pkcs7_digest_st { + ASN1_INTEGER *version; /* version 0 */ + X509_ALGOR *md; /* md used */ + struct pkcs7_st *contents; + ASN1_OCTET_STRING *digest; +} PKCS7_DIGEST; + +typedef struct pkcs7_encrypted_st { + ASN1_INTEGER *version; /* version 0 */ + PKCS7_ENC_CONTENT *enc_data; +} PKCS7_ENCRYPT; + +typedef struct pkcs7_st { + /* + * The following is non NULL if it contains ASN1 encoding of this + * structure + */ + unsigned char *asn1; + long length; +# define PKCS7_S_HEADER 0 +# define PKCS7_S_BODY 1 +# define PKCS7_S_TAIL 2 + int state; /* used during processing */ + int detached; + ASN1_OBJECT *type; + /* content as defined by the type */ + /* + * all encryption/message digests are applied to the 'contents', leaving + * out the 'type' field. + */ + union { + char *ptr; + /* NID_pkcs7_data */ + ASN1_OCTET_STRING *data; + /* NID_pkcs7_signed */ + PKCS7_SIGNED *sign; + /* NID_pkcs7_enveloped */ + PKCS7_ENVELOPE *enveloped; + /* NID_pkcs7_signedAndEnveloped */ + PKCS7_SIGN_ENVELOPE *signed_and_enveloped; + /* NID_pkcs7_digest */ + PKCS7_DIGEST *digest; + /* NID_pkcs7_encrypted */ + PKCS7_ENCRYPT *encrypted; + /* Anything else */ + ASN1_TYPE *other; + } d; +} PKCS7; + +DECLARE_STACK_OF(PKCS7) +DECLARE_ASN1_SET_OF(PKCS7) +DECLARE_PKCS12_STACK_OF(PKCS7) + +# define PKCS7_OP_SET_DETACHED_SIGNATURE 1 +# define PKCS7_OP_GET_DETACHED_SIGNATURE 2 + +# define PKCS7_get_signed_attributes(si) ((si)->auth_attr) +# define PKCS7_get_attributes(si) ((si)->unauth_attr) + +# define PKCS7_type_is_signed(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_signed) +# define PKCS7_type_is_encrypted(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_encrypted) +# define PKCS7_type_is_enveloped(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_enveloped) +# define PKCS7_type_is_signedAndEnveloped(a) \ + (OBJ_obj2nid((a)->type) == NID_pkcs7_signedAndEnveloped) +# define PKCS7_type_is_data(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_data) +# define PKCS7_type_is_digest(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_digest) + +# define PKCS7_set_detached(p,v) \ + PKCS7_ctrl(p,PKCS7_OP_SET_DETACHED_SIGNATURE,v,NULL) +# define PKCS7_get_detached(p) \ + PKCS7_ctrl(p,PKCS7_OP_GET_DETACHED_SIGNATURE,0,NULL) + +# define PKCS7_is_detached(p7) (PKCS7_type_is_signed(p7) && PKCS7_get_detached(p7)) + +/* S/MIME related flags */ + +# define PKCS7_TEXT 0x1 +# define PKCS7_NOCERTS 0x2 +# define PKCS7_NOSIGS 0x4 +# define PKCS7_NOCHAIN 0x8 +# define PKCS7_NOINTERN 0x10 +# define PKCS7_NOVERIFY 0x20 +# define PKCS7_DETACHED 0x40 +# define PKCS7_BINARY 0x80 +# define PKCS7_NOATTR 0x100 +# define PKCS7_NOSMIMECAP 0x200 +# define PKCS7_NOOLDMIMETYPE 0x400 +# define PKCS7_CRLFEOL 0x800 +# define PKCS7_STREAM 0x1000 +# define PKCS7_NOCRL 0x2000 +# define PKCS7_PARTIAL 0x4000 +# define PKCS7_REUSE_DIGEST 0x8000 + +/* Flags: for compatibility with older code */ + +# define SMIME_TEXT PKCS7_TEXT +# define SMIME_NOCERTS PKCS7_NOCERTS +# define SMIME_NOSIGS PKCS7_NOSIGS +# define SMIME_NOCHAIN PKCS7_NOCHAIN +# define SMIME_NOINTERN PKCS7_NOINTERN +# define SMIME_NOVERIFY PKCS7_NOVERIFY +# define SMIME_DETACHED PKCS7_DETACHED +# define SMIME_BINARY PKCS7_BINARY +# define SMIME_NOATTR PKCS7_NOATTR + +DECLARE_ASN1_FUNCTIONS(PKCS7_ISSUER_AND_SERIAL) + +int PKCS7_ISSUER_AND_SERIAL_digest(PKCS7_ISSUER_AND_SERIAL *data, + const EVP_MD *type, unsigned char *md, + unsigned int *len); +# ifndef OPENSSL_NO_FP_API +PKCS7 *d2i_PKCS7_fp(FILE *fp, PKCS7 **p7); +int i2d_PKCS7_fp(FILE *fp, PKCS7 *p7); +# endif +PKCS7 *PKCS7_dup(PKCS7 *p7); +PKCS7 *d2i_PKCS7_bio(BIO *bp, PKCS7 **p7); +int i2d_PKCS7_bio(BIO *bp, PKCS7 *p7); +int i2d_PKCS7_bio_stream(BIO *out, PKCS7 *p7, BIO *in, int flags); +int PEM_write_bio_PKCS7_stream(BIO *out, PKCS7 *p7, BIO *in, int flags); + +DECLARE_ASN1_FUNCTIONS(PKCS7_SIGNER_INFO) +DECLARE_ASN1_FUNCTIONS(PKCS7_RECIP_INFO) +DECLARE_ASN1_FUNCTIONS(PKCS7_SIGNED) +DECLARE_ASN1_FUNCTIONS(PKCS7_ENC_CONTENT) +DECLARE_ASN1_FUNCTIONS(PKCS7_ENVELOPE) +DECLARE_ASN1_FUNCTIONS(PKCS7_SIGN_ENVELOPE) +DECLARE_ASN1_FUNCTIONS(PKCS7_DIGEST) +DECLARE_ASN1_FUNCTIONS(PKCS7_ENCRYPT) +DECLARE_ASN1_FUNCTIONS(PKCS7) + +DECLARE_ASN1_ITEM(PKCS7_ATTR_SIGN) +DECLARE_ASN1_ITEM(PKCS7_ATTR_VERIFY) + +DECLARE_ASN1_NDEF_FUNCTION(PKCS7) +DECLARE_ASN1_PRINT_FUNCTION(PKCS7) + +long PKCS7_ctrl(PKCS7 *p7, int cmd, long larg, char *parg); + +int PKCS7_set_type(PKCS7 *p7, int type); +int PKCS7_set0_type_other(PKCS7 *p7, int type, ASN1_TYPE *other); +int PKCS7_set_content(PKCS7 *p7, PKCS7 *p7_data); +int PKCS7_SIGNER_INFO_set(PKCS7_SIGNER_INFO *p7i, X509 *x509, EVP_PKEY *pkey, + const EVP_MD *dgst); +int PKCS7_SIGNER_INFO_sign(PKCS7_SIGNER_INFO *si); +int PKCS7_add_signer(PKCS7 *p7, PKCS7_SIGNER_INFO *p7i); +int PKCS7_add_certificate(PKCS7 *p7, X509 *x509); +int PKCS7_add_crl(PKCS7 *p7, X509_CRL *x509); +int PKCS7_content_new(PKCS7 *p7, int nid); +int PKCS7_dataVerify(X509_STORE *cert_store, X509_STORE_CTX *ctx, + BIO *bio, PKCS7 *p7, PKCS7_SIGNER_INFO *si); +int PKCS7_signatureVerify(BIO *bio, PKCS7 *p7, PKCS7_SIGNER_INFO *si, + X509 *x509); + +BIO *PKCS7_dataInit(PKCS7 *p7, BIO *bio); +int PKCS7_dataFinal(PKCS7 *p7, BIO *bio); +BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKEY *pkey, BIO *in_bio, X509 *pcert); + +PKCS7_SIGNER_INFO *PKCS7_add_signature(PKCS7 *p7, X509 *x509, + EVP_PKEY *pkey, const EVP_MD *dgst); +X509 *PKCS7_cert_from_signer_info(PKCS7 *p7, PKCS7_SIGNER_INFO *si); +int PKCS7_set_digest(PKCS7 *p7, const EVP_MD *md); +STACK_OF(PKCS7_SIGNER_INFO) *PKCS7_get_signer_info(PKCS7 *p7); + +PKCS7_RECIP_INFO *PKCS7_add_recipient(PKCS7 *p7, X509 *x509); +void PKCS7_SIGNER_INFO_get0_algs(PKCS7_SIGNER_INFO *si, EVP_PKEY **pk, + X509_ALGOR **pdig, X509_ALGOR **psig); +void PKCS7_RECIP_INFO_get0_alg(PKCS7_RECIP_INFO *ri, X509_ALGOR **penc); +int PKCS7_add_recipient_info(PKCS7 *p7, PKCS7_RECIP_INFO *ri); +int PKCS7_RECIP_INFO_set(PKCS7_RECIP_INFO *p7i, X509 *x509); +int PKCS7_set_cipher(PKCS7 *p7, const EVP_CIPHER *cipher); +int PKCS7_stream(unsigned char ***boundary, PKCS7 *p7); + +PKCS7_ISSUER_AND_SERIAL *PKCS7_get_issuer_and_serial(PKCS7 *p7, int idx); +ASN1_OCTET_STRING *PKCS7_digest_from_attributes(STACK_OF(X509_ATTRIBUTE) *sk); +int PKCS7_add_signed_attribute(PKCS7_SIGNER_INFO *p7si, int nid, int type, + void *data); +int PKCS7_add_attribute(PKCS7_SIGNER_INFO *p7si, int nid, int atrtype, + void *value); +ASN1_TYPE *PKCS7_get_attribute(PKCS7_SIGNER_INFO *si, int nid); +ASN1_TYPE *PKCS7_get_signed_attribute(PKCS7_SIGNER_INFO *si, int nid); +int PKCS7_set_signed_attributes(PKCS7_SIGNER_INFO *p7si, + STACK_OF(X509_ATTRIBUTE) *sk); +int PKCS7_set_attributes(PKCS7_SIGNER_INFO *p7si, + STACK_OF(X509_ATTRIBUTE) *sk); + +PKCS7 *PKCS7_sign(X509 *signcert, EVP_PKEY *pkey, STACK_OF(X509) *certs, + BIO *data, int flags); + +PKCS7_SIGNER_INFO *PKCS7_sign_add_signer(PKCS7 *p7, + X509 *signcert, EVP_PKEY *pkey, + const EVP_MD *md, int flags); + +int PKCS7_final(PKCS7 *p7, BIO *data, int flags); +int PKCS7_verify(PKCS7 *p7, STACK_OF(X509) *certs, X509_STORE *store, + BIO *indata, BIO *out, int flags); +STACK_OF(X509) *PKCS7_get0_signers(PKCS7 *p7, STACK_OF(X509) *certs, + int flags); +PKCS7 *PKCS7_encrypt(STACK_OF(X509) *certs, BIO *in, const EVP_CIPHER *cipher, + int flags); +int PKCS7_decrypt(PKCS7 *p7, EVP_PKEY *pkey, X509 *cert, BIO *data, + int flags); + +int PKCS7_add_attrib_smimecap(PKCS7_SIGNER_INFO *si, + STACK_OF(X509_ALGOR) *cap); +STACK_OF(X509_ALGOR) *PKCS7_get_smimecap(PKCS7_SIGNER_INFO *si); +int PKCS7_simple_smimecap(STACK_OF(X509_ALGOR) *sk, int nid, int arg); + +int PKCS7_add_attrib_content_type(PKCS7_SIGNER_INFO *si, ASN1_OBJECT *coid); +int PKCS7_add0_attrib_signing_time(PKCS7_SIGNER_INFO *si, ASN1_TIME *t); +int PKCS7_add1_attrib_digest(PKCS7_SIGNER_INFO *si, + const unsigned char *md, int mdlen); + +int SMIME_write_PKCS7(BIO *bio, PKCS7 *p7, BIO *data, int flags); +PKCS7 *SMIME_read_PKCS7(BIO *bio, BIO **bcont); + +BIO *BIO_new_PKCS7(BIO *out, PKCS7 *p7); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_PKCS7_strings(void); + +/* Error codes for the PKCS7 functions. */ + +/* Function codes. */ +# define PKCS7_F_B64_READ_PKCS7 120 +# define PKCS7_F_B64_WRITE_PKCS7 121 +# define PKCS7_F_DO_PKCS7_SIGNED_ATTRIB 136 +# define PKCS7_F_I2D_PKCS7_BIO_STREAM 140 +# define PKCS7_F_PKCS7_ADD0_ATTRIB_SIGNING_TIME 135 +# define PKCS7_F_PKCS7_ADD_ATTRIB_SMIMECAP 118 +# define PKCS7_F_PKCS7_ADD_CERTIFICATE 100 +# define PKCS7_F_PKCS7_ADD_CRL 101 +# define PKCS7_F_PKCS7_ADD_RECIPIENT_INFO 102 +# define PKCS7_F_PKCS7_ADD_SIGNATURE 131 +# define PKCS7_F_PKCS7_ADD_SIGNER 103 +# define PKCS7_F_PKCS7_BIO_ADD_DIGEST 125 +# define PKCS7_F_PKCS7_COPY_EXISTING_DIGEST 138 +# define PKCS7_F_PKCS7_CTRL 104 +# define PKCS7_F_PKCS7_DATADECODE 112 +# define PKCS7_F_PKCS7_DATAFINAL 128 +# define PKCS7_F_PKCS7_DATAINIT 105 +# define PKCS7_F_PKCS7_DATASIGN 106 +# define PKCS7_F_PKCS7_DATAVERIFY 107 +# define PKCS7_F_PKCS7_DECRYPT 114 +# define PKCS7_F_PKCS7_DECRYPT_RINFO 133 +# define PKCS7_F_PKCS7_ENCODE_RINFO 132 +# define PKCS7_F_PKCS7_ENCRYPT 115 +# define PKCS7_F_PKCS7_FINAL 134 +# define PKCS7_F_PKCS7_FIND_DIGEST 127 +# define PKCS7_F_PKCS7_GET0_SIGNERS 124 +# define PKCS7_F_PKCS7_RECIP_INFO_SET 130 +# define PKCS7_F_PKCS7_SET_CIPHER 108 +# define PKCS7_F_PKCS7_SET_CONTENT 109 +# define PKCS7_F_PKCS7_SET_DIGEST 126 +# define PKCS7_F_PKCS7_SET_TYPE 110 +# define PKCS7_F_PKCS7_SIGN 116 +# define PKCS7_F_PKCS7_SIGNATUREVERIFY 113 +# define PKCS7_F_PKCS7_SIGNER_INFO_SET 129 +# define PKCS7_F_PKCS7_SIGNER_INFO_SIGN 139 +# define PKCS7_F_PKCS7_SIGN_ADD_SIGNER 137 +# define PKCS7_F_PKCS7_SIMPLE_SMIMECAP 119 +# define PKCS7_F_PKCS7_VERIFY 117 +# define PKCS7_F_SMIME_READ_PKCS7 122 +# define PKCS7_F_SMIME_TEXT 123 + +/* Reason codes. */ +# define PKCS7_R_CERTIFICATE_VERIFY_ERROR 117 +# define PKCS7_R_CIPHER_HAS_NO_OBJECT_IDENTIFIER 144 +# define PKCS7_R_CIPHER_NOT_INITIALIZED 116 +# define PKCS7_R_CONTENT_AND_DATA_PRESENT 118 +# define PKCS7_R_CTRL_ERROR 152 +# define PKCS7_R_DECODE_ERROR 130 +# define PKCS7_R_DECRYPTED_KEY_IS_WRONG_LENGTH 100 +# define PKCS7_R_DECRYPT_ERROR 119 +# define PKCS7_R_DIGEST_FAILURE 101 +# define PKCS7_R_ENCRYPTION_CTRL_FAILURE 149 +# define PKCS7_R_ENCRYPTION_NOT_SUPPORTED_FOR_THIS_KEY_TYPE 150 +# define PKCS7_R_ERROR_ADDING_RECIPIENT 120 +# define PKCS7_R_ERROR_SETTING_CIPHER 121 +# define PKCS7_R_INVALID_MIME_TYPE 131 +# define PKCS7_R_INVALID_NULL_POINTER 143 +# define PKCS7_R_INVALID_SIGNED_DATA_TYPE 155 +# define PKCS7_R_MIME_NO_CONTENT_TYPE 132 +# define PKCS7_R_MIME_PARSE_ERROR 133 +# define PKCS7_R_MIME_SIG_PARSE_ERROR 134 +# define PKCS7_R_MISSING_CERIPEND_INFO 103 +# define PKCS7_R_NO_CONTENT 122 +# define PKCS7_R_NO_CONTENT_TYPE 135 +# define PKCS7_R_NO_DEFAULT_DIGEST 151 +# define PKCS7_R_NO_MATCHING_DIGEST_TYPE_FOUND 154 +# define PKCS7_R_NO_MULTIPART_BODY_FAILURE 136 +# define PKCS7_R_NO_MULTIPART_BOUNDARY 137 +# define PKCS7_R_NO_RECIPIENT_MATCHES_CERTIFICATE 115 +# define PKCS7_R_NO_RECIPIENT_MATCHES_KEY 146 +# define PKCS7_R_NO_SIGNATURES_ON_DATA 123 +# define PKCS7_R_NO_SIGNERS 142 +# define PKCS7_R_NO_SIG_CONTENT_TYPE 138 +# define PKCS7_R_OPERATION_NOT_SUPPORTED_ON_THIS_TYPE 104 +# define PKCS7_R_PKCS7_ADD_SIGNATURE_ERROR 124 +# define PKCS7_R_PKCS7_ADD_SIGNER_ERROR 153 +# define PKCS7_R_PKCS7_DATAFINAL 126 +# define PKCS7_R_PKCS7_DATAFINAL_ERROR 125 +# define PKCS7_R_PKCS7_DATASIGN 145 +# define PKCS7_R_PKCS7_PARSE_ERROR 139 +# define PKCS7_R_PKCS7_SIG_PARSE_ERROR 140 +# define PKCS7_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE 127 +# define PKCS7_R_SIGNATURE_FAILURE 105 +# define PKCS7_R_SIGNER_CERTIFICATE_NOT_FOUND 128 +# define PKCS7_R_SIGNING_CTRL_FAILURE 147 +# define PKCS7_R_SIGNING_NOT_SUPPORTED_FOR_THIS_KEY_TYPE 148 +# define PKCS7_R_SIG_INVALID_MIME_TYPE 141 +# define PKCS7_R_SMIME_TEXT_ERROR 129 +# define PKCS7_R_UNABLE_TO_FIND_CERTIFICATE 106 +# define PKCS7_R_UNABLE_TO_FIND_MEM_BIO 107 +# define PKCS7_R_UNABLE_TO_FIND_MESSAGE_DIGEST 108 +# define PKCS7_R_UNKNOWN_DIGEST_TYPE 109 +# define PKCS7_R_UNKNOWN_OPERATION 110 +# define PKCS7_R_UNSUPPORTED_CIPHER_TYPE 111 +# define PKCS7_R_UNSUPPORTED_CONTENT_TYPE 112 +# define PKCS7_R_WRONG_CONTENT_TYPE 113 +# define PKCS7_R_WRONG_PKCS7_TYPE 114 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/pqueue.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/pqueue.h new file mode 100644 index 0000000..d40d9c7 --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/pqueue.h @@ -0,0 +1,99 @@ +/* crypto/pqueue/pqueue.h */ +/* + * DTLS implementation written by Nagendra Modadugu + * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. + */ +/* ==================================================================== + * Copyright (c) 1999-2005 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_PQUEUE_H +# define HEADER_PQUEUE_H + +# include +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif +typedef struct _pqueue *pqueue; + +typedef struct _pitem { + unsigned char priority[8]; /* 64-bit value in big-endian encoding */ + void *data; + struct _pitem *next; +} pitem; + +typedef struct _pitem *piterator; + +pitem *pitem_new(unsigned char *prio64be, void *data); +void pitem_free(pitem *item); + +pqueue pqueue_new(void); +void pqueue_free(pqueue pq); + +pitem *pqueue_insert(pqueue pq, pitem *item); +pitem *pqueue_peek(pqueue pq); +pitem *pqueue_pop(pqueue pq); +pitem *pqueue_find(pqueue pq, unsigned char *prio64be); +pitem *pqueue_iterator(pqueue pq); +pitem *pqueue_next(piterator *iter); + +void pqueue_print(pqueue pq); +int pqueue_size(pqueue pq); + +#ifdef __cplusplus +} +#endif +#endif /* ! HEADER_PQUEUE_H */ diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/rand.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/rand.h new file mode 100644 index 0000000..2553afd --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/rand.h @@ -0,0 +1,150 @@ +/* crypto/rand/rand.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_RAND_H +# define HEADER_RAND_H + +# include +# include +# include + +# if defined(OPENSSL_SYS_WINDOWS) +# include +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +# if defined(OPENSSL_FIPS) +# define FIPS_RAND_SIZE_T size_t +# endif + +/* Already defined in ossl_typ.h */ +/* typedef struct rand_meth_st RAND_METHOD; */ + +struct rand_meth_st { + void (*seed) (const void *buf, int num); + int (*bytes) (unsigned char *buf, int num); + void (*cleanup) (void); + void (*add) (const void *buf, int num, double entropy); + int (*pseudorand) (unsigned char *buf, int num); + int (*status) (void); +}; + +# ifdef BN_DEBUG +extern int rand_predictable; +# endif + +int RAND_set_rand_method(const RAND_METHOD *meth); +const RAND_METHOD *RAND_get_rand_method(void); +# ifndef OPENSSL_NO_ENGINE +int RAND_set_rand_engine(ENGINE *engine); +# endif +RAND_METHOD *RAND_SSLeay(void); +void RAND_cleanup(void); +int RAND_bytes(unsigned char *buf, int num); +int RAND_pseudo_bytes(unsigned char *buf, int num); +void RAND_seed(const void *buf, int num); +void RAND_add(const void *buf, int num, double entropy); +int RAND_load_file(const char *file, long max_bytes); +int RAND_write_file(const char *file); +const char *RAND_file_name(char *file, size_t num); +int RAND_status(void); +int RAND_query_egd_bytes(const char *path, unsigned char *buf, int bytes); +int RAND_egd(const char *path); +int RAND_egd_bytes(const char *path, int bytes); +int RAND_poll(void); + +# if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_WIN32) + +void RAND_screen(void); +int RAND_event(UINT, WPARAM, LPARAM); + +# endif + +# ifdef OPENSSL_FIPS +void RAND_set_fips_drbg_type(int type, int flags); +int RAND_init_fips(void); +# endif + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_RAND_strings(void); + +/* Error codes for the RAND functions. */ + +/* Function codes. */ +# define RAND_F_RAND_GET_RAND_METHOD 101 +# define RAND_F_RAND_INIT_FIPS 102 +# define RAND_F_SSLEAY_RAND_BYTES 100 + +/* Reason codes. */ +# define RAND_R_DUAL_EC_DRBG_DISABLED 104 +# define RAND_R_ERROR_INITIALISING_DRBG 102 +# define RAND_R_ERROR_INSTANTIATING_DRBG 103 +# define RAND_R_NO_FIPS_RANDOM_METHOD_SET 101 +# define RAND_R_PRNG_NOT_SEEDED 100 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/rc2.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/rc2.h new file mode 100644 index 0000000..29d02d7 --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/rc2.h @@ -0,0 +1,103 @@ +/* crypto/rc2/rc2.h */ +/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_RC2_H +# define HEADER_RC2_H + +# include /* OPENSSL_NO_RC2, RC2_INT */ +# ifdef OPENSSL_NO_RC2 +# error RC2 is disabled. +# endif + +# define RC2_ENCRYPT 1 +# define RC2_DECRYPT 0 + +# define RC2_BLOCK 8 +# define RC2_KEY_LENGTH 16 + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct rc2_key_st { + RC2_INT data[64]; +} RC2_KEY; + +# ifdef OPENSSL_FIPS +void private_RC2_set_key(RC2_KEY *key, int len, const unsigned char *data, + int bits); +# endif +void RC2_set_key(RC2_KEY *key, int len, const unsigned char *data, int bits); +void RC2_ecb_encrypt(const unsigned char *in, unsigned char *out, + RC2_KEY *key, int enc); +void RC2_encrypt(unsigned long *data, RC2_KEY *key); +void RC2_decrypt(unsigned long *data, RC2_KEY *key); +void RC2_cbc_encrypt(const unsigned char *in, unsigned char *out, long length, + RC2_KEY *ks, unsigned char *iv, int enc); +void RC2_cfb64_encrypt(const unsigned char *in, unsigned char *out, + long length, RC2_KEY *schedule, unsigned char *ivec, + int *num, int enc); +void RC2_ofb64_encrypt(const unsigned char *in, unsigned char *out, + long length, RC2_KEY *schedule, unsigned char *ivec, + int *num); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/rc4.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/rc4.h new file mode 100644 index 0000000..39162b1 --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/rc4.h @@ -0,0 +1,88 @@ +/* crypto/rc4/rc4.h */ +/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_RC4_H +# define HEADER_RC4_H + +# include /* OPENSSL_NO_RC4, RC4_INT */ +# ifdef OPENSSL_NO_RC4 +# error RC4 is disabled. +# endif + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct rc4_key_st { + RC4_INT x, y; + RC4_INT data[256]; +} RC4_KEY; + +const char *RC4_options(void); +void RC4_set_key(RC4_KEY *key, int len, const unsigned char *data); +void private_RC4_set_key(RC4_KEY *key, int len, const unsigned char *data); +void RC4(RC4_KEY *key, size_t len, const unsigned char *indata, + unsigned char *outdata); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/ripemd.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/ripemd.h new file mode 100644 index 0000000..b88ef25 --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/ripemd.h @@ -0,0 +1,105 @@ +/* crypto/ripemd/ripemd.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_RIPEMD_H +# define HEADER_RIPEMD_H + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# ifdef OPENSSL_NO_RIPEMD +# error RIPEMD is disabled. +# endif + +# if defined(__LP32__) +# define RIPEMD160_LONG unsigned long +# elif defined(OPENSSL_SYS_CRAY) || defined(__ILP64__) +# define RIPEMD160_LONG unsigned long +# define RIPEMD160_LONG_LOG2 3 +# else +# define RIPEMD160_LONG unsigned int +# endif + +# define RIPEMD160_CBLOCK 64 +# define RIPEMD160_LBLOCK (RIPEMD160_CBLOCK/4) +# define RIPEMD160_DIGEST_LENGTH 20 + +typedef struct RIPEMD160state_st { + RIPEMD160_LONG A, B, C, D, E; + RIPEMD160_LONG Nl, Nh; + RIPEMD160_LONG data[RIPEMD160_LBLOCK]; + unsigned int num; +} RIPEMD160_CTX; + +# ifdef OPENSSL_FIPS +int private_RIPEMD160_Init(RIPEMD160_CTX *c); +# endif +int RIPEMD160_Init(RIPEMD160_CTX *c); +int RIPEMD160_Update(RIPEMD160_CTX *c, const void *data, size_t len); +int RIPEMD160_Final(unsigned char *md, RIPEMD160_CTX *c); +unsigned char *RIPEMD160(const unsigned char *d, size_t n, unsigned char *md); +void RIPEMD160_Transform(RIPEMD160_CTX *c, const unsigned char *b); +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/rsa.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/rsa.h new file mode 100644 index 0000000..d2ee374 --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/rsa.h @@ -0,0 +1,664 @@ +/* crypto/rsa/rsa.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_RSA_H +# define HEADER_RSA_H + +# include + +# ifndef OPENSSL_NO_BIO +# include +# endif +# include +# include +# ifndef OPENSSL_NO_DEPRECATED +# include +# endif + +# ifdef OPENSSL_NO_RSA +# error RSA is disabled. +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* Declared already in ossl_typ.h */ +/* typedef struct rsa_st RSA; */ +/* typedef struct rsa_meth_st RSA_METHOD; */ + +struct rsa_meth_st { + const char *name; + int (*rsa_pub_enc) (int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, int padding); + int (*rsa_pub_dec) (int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, int padding); + int (*rsa_priv_enc) (int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, int padding); + int (*rsa_priv_dec) (int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, int padding); + /* Can be null */ + int (*rsa_mod_exp) (BIGNUM *r0, const BIGNUM *I, RSA *rsa, BN_CTX *ctx); + /* Can be null */ + int (*bn_mod_exp) (BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx); + /* called at new */ + int (*init) (RSA *rsa); + /* called at free */ + int (*finish) (RSA *rsa); + /* RSA_METHOD_FLAG_* things */ + int flags; + /* may be needed! */ + char *app_data; + /* + * New sign and verify functions: some libraries don't allow arbitrary + * data to be signed/verified: this allows them to be used. Note: for + * this to work the RSA_public_decrypt() and RSA_private_encrypt() should + * *NOT* be used RSA_sign(), RSA_verify() should be used instead. Note: + * for backwards compatibility this functionality is only enabled if the + * RSA_FLAG_SIGN_VER option is set in 'flags'. + */ + int (*rsa_sign) (int type, + const unsigned char *m, unsigned int m_length, + unsigned char *sigret, unsigned int *siglen, + const RSA *rsa); + int (*rsa_verify) (int dtype, const unsigned char *m, + unsigned int m_length, const unsigned char *sigbuf, + unsigned int siglen, const RSA *rsa); + /* + * If this callback is NULL, the builtin software RSA key-gen will be + * used. This is for behavioural compatibility whilst the code gets + * rewired, but one day it would be nice to assume there are no such + * things as "builtin software" implementations. + */ + int (*rsa_keygen) (RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb); +}; + +struct rsa_st { + /* + * The first parameter is used to pickup errors where this is passed + * instead of aEVP_PKEY, it is set to 0 + */ + int pad; + long version; + const RSA_METHOD *meth; + /* functional reference if 'meth' is ENGINE-provided */ + ENGINE *engine; + BIGNUM *n; + BIGNUM *e; + BIGNUM *d; + BIGNUM *p; + BIGNUM *q; + BIGNUM *dmp1; + BIGNUM *dmq1; + BIGNUM *iqmp; + /* be careful using this if the RSA structure is shared */ + CRYPTO_EX_DATA ex_data; + int references; + int flags; + /* Used to cache montgomery values */ + BN_MONT_CTX *_method_mod_n; + BN_MONT_CTX *_method_mod_p; + BN_MONT_CTX *_method_mod_q; + /* + * all BIGNUM values are actually in the following data, if it is not + * NULL + */ + char *bignum_data; + BN_BLINDING *blinding; + BN_BLINDING *mt_blinding; +}; + +# ifndef OPENSSL_RSA_MAX_MODULUS_BITS +# define OPENSSL_RSA_MAX_MODULUS_BITS 16384 +# endif + +# ifndef OPENSSL_RSA_SMALL_MODULUS_BITS +# define OPENSSL_RSA_SMALL_MODULUS_BITS 3072 +# endif +# ifndef OPENSSL_RSA_MAX_PUBEXP_BITS + +/* exponent limit enforced for "large" modulus only */ +# define OPENSSL_RSA_MAX_PUBEXP_BITS 64 +# endif + +# define RSA_3 0x3L +# define RSA_F4 0x10001L + +# define RSA_METHOD_FLAG_NO_CHECK 0x0001/* don't check pub/private + * match */ + +# define RSA_FLAG_CACHE_PUBLIC 0x0002 +# define RSA_FLAG_CACHE_PRIVATE 0x0004 +# define RSA_FLAG_BLINDING 0x0008 +# define RSA_FLAG_THREAD_SAFE 0x0010 +/* + * This flag means the private key operations will be handled by rsa_mod_exp + * and that they do not depend on the private key components being present: + * for example a key stored in external hardware. Without this flag + * bn_mod_exp gets called when private key components are absent. + */ +# define RSA_FLAG_EXT_PKEY 0x0020 + +/* + * This flag in the RSA_METHOD enables the new rsa_sign, rsa_verify + * functions. + */ +# define RSA_FLAG_SIGN_VER 0x0040 + +/* + * new with 0.9.6j and 0.9.7b; the built-in + * RSA implementation now uses blinding by + * default (ignoring RSA_FLAG_BLINDING), + * but other engines might not need it + */ +# define RSA_FLAG_NO_BLINDING 0x0080 +/* + * new with 0.9.8f; the built-in RSA + * implementation now uses constant time + * operations by default in private key operations, + * e.g., constant time modular exponentiation, + * modular inverse without leaking branches, + * division without leaking branches. This + * flag disables these constant time + * operations and results in faster RSA + * private key operations. + */ +# define RSA_FLAG_NO_CONSTTIME 0x0100 +# ifdef OPENSSL_USE_DEPRECATED +/* deprecated name for the flag*/ +/* + * new with 0.9.7h; the built-in RSA + * implementation now uses constant time + * modular exponentiation for secret exponents + * by default. This flag causes the + * faster variable sliding window method to + * be used for all exponents. + */ +# define RSA_FLAG_NO_EXP_CONSTTIME RSA_FLAG_NO_CONSTTIME +# endif + +# define EVP_PKEY_CTX_set_rsa_padding(ctx, pad) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, -1, EVP_PKEY_CTRL_RSA_PADDING, \ + pad, NULL) + +# define EVP_PKEY_CTX_get_rsa_padding(ctx, ppad) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, -1, \ + EVP_PKEY_CTRL_GET_RSA_PADDING, 0, ppad) + +# define EVP_PKEY_CTX_set_rsa_pss_saltlen(ctx, len) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, \ + (EVP_PKEY_OP_SIGN|EVP_PKEY_OP_VERIFY), \ + EVP_PKEY_CTRL_RSA_PSS_SALTLEN, \ + len, NULL) + +# define EVP_PKEY_CTX_get_rsa_pss_saltlen(ctx, plen) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, \ + (EVP_PKEY_OP_SIGN|EVP_PKEY_OP_VERIFY), \ + EVP_PKEY_CTRL_GET_RSA_PSS_SALTLEN, \ + 0, plen) + +# define EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, bits) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, EVP_PKEY_OP_KEYGEN, \ + EVP_PKEY_CTRL_RSA_KEYGEN_BITS, bits, NULL) + +# define EVP_PKEY_CTX_set_rsa_keygen_pubexp(ctx, pubexp) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, EVP_PKEY_OP_KEYGEN, \ + EVP_PKEY_CTRL_RSA_KEYGEN_PUBEXP, 0, pubexp) + +# define EVP_PKEY_CTX_set_rsa_mgf1_md(ctx, md) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, \ + EVP_PKEY_OP_TYPE_SIG | EVP_PKEY_OP_TYPE_CRYPT, \ + EVP_PKEY_CTRL_RSA_MGF1_MD, 0, (void *)md) + +# define EVP_PKEY_CTX_set_rsa_oaep_md(ctx, md) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, EVP_PKEY_OP_TYPE_CRYPT, \ + EVP_PKEY_CTRL_RSA_OAEP_MD, 0, (void *)md) + +# define EVP_PKEY_CTX_get_rsa_mgf1_md(ctx, pmd) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, \ + EVP_PKEY_OP_TYPE_SIG | EVP_PKEY_OP_TYPE_CRYPT, \ + EVP_PKEY_CTRL_GET_RSA_MGF1_MD, 0, (void *)pmd) + +# define EVP_PKEY_CTX_get_rsa_oaep_md(ctx, pmd) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, EVP_PKEY_OP_TYPE_CRYPT, \ + EVP_PKEY_CTRL_GET_RSA_OAEP_MD, 0, (void *)pmd) + +# define EVP_PKEY_CTX_set0_rsa_oaep_label(ctx, l, llen) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, EVP_PKEY_OP_TYPE_CRYPT, \ + EVP_PKEY_CTRL_RSA_OAEP_LABEL, llen, (void *)l) + +# define EVP_PKEY_CTX_get0_rsa_oaep_label(ctx, l) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, EVP_PKEY_OP_TYPE_CRYPT, \ + EVP_PKEY_CTRL_GET_RSA_OAEP_LABEL, 0, (void *)l) + +# define EVP_PKEY_CTRL_RSA_PADDING (EVP_PKEY_ALG_CTRL + 1) +# define EVP_PKEY_CTRL_RSA_PSS_SALTLEN (EVP_PKEY_ALG_CTRL + 2) + +# define EVP_PKEY_CTRL_RSA_KEYGEN_BITS (EVP_PKEY_ALG_CTRL + 3) +# define EVP_PKEY_CTRL_RSA_KEYGEN_PUBEXP (EVP_PKEY_ALG_CTRL + 4) +# define EVP_PKEY_CTRL_RSA_MGF1_MD (EVP_PKEY_ALG_CTRL + 5) + +# define EVP_PKEY_CTRL_GET_RSA_PADDING (EVP_PKEY_ALG_CTRL + 6) +# define EVP_PKEY_CTRL_GET_RSA_PSS_SALTLEN (EVP_PKEY_ALG_CTRL + 7) +# define EVP_PKEY_CTRL_GET_RSA_MGF1_MD (EVP_PKEY_ALG_CTRL + 8) + +# define EVP_PKEY_CTRL_RSA_OAEP_MD (EVP_PKEY_ALG_CTRL + 9) +# define EVP_PKEY_CTRL_RSA_OAEP_LABEL (EVP_PKEY_ALG_CTRL + 10) + +# define EVP_PKEY_CTRL_GET_RSA_OAEP_MD (EVP_PKEY_ALG_CTRL + 11) +# define EVP_PKEY_CTRL_GET_RSA_OAEP_LABEL (EVP_PKEY_ALG_CTRL + 12) + +# define RSA_PKCS1_PADDING 1 +# define RSA_SSLV23_PADDING 2 +# define RSA_NO_PADDING 3 +# define RSA_PKCS1_OAEP_PADDING 4 +# define RSA_X931_PADDING 5 +/* EVP_PKEY_ only */ +# define RSA_PKCS1_PSS_PADDING 6 + +# define RSA_PKCS1_PADDING_SIZE 11 + +# define RSA_set_app_data(s,arg) RSA_set_ex_data(s,0,arg) +# define RSA_get_app_data(s) RSA_get_ex_data(s,0) + +RSA *RSA_new(void); +RSA *RSA_new_method(ENGINE *engine); +int RSA_size(const RSA *rsa); + +/* Deprecated version */ +# ifndef OPENSSL_NO_DEPRECATED +RSA *RSA_generate_key(int bits, unsigned long e, void + (*callback) (int, int, void *), void *cb_arg); +# endif /* !defined(OPENSSL_NO_DEPRECATED) */ + +/* New version */ +int RSA_generate_key_ex(RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb); + +int RSA_check_key(const RSA *); + /* next 4 return -1 on error */ +int RSA_public_encrypt(int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, int padding); +int RSA_private_encrypt(int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, int padding); +int RSA_public_decrypt(int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, int padding); +int RSA_private_decrypt(int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, int padding); +void RSA_free(RSA *r); +/* "up" the RSA object's reference count */ +int RSA_up_ref(RSA *r); + +int RSA_flags(const RSA *r); + +void RSA_set_default_method(const RSA_METHOD *meth); +const RSA_METHOD *RSA_get_default_method(void); +const RSA_METHOD *RSA_get_method(const RSA *rsa); +int RSA_set_method(RSA *rsa, const RSA_METHOD *meth); + +/* This function needs the memory locking malloc callbacks to be installed */ +int RSA_memory_lock(RSA *r); + +/* these are the actual SSLeay RSA functions */ +const RSA_METHOD *RSA_PKCS1_SSLeay(void); + +const RSA_METHOD *RSA_null_method(void); + +DECLARE_ASN1_ENCODE_FUNCTIONS_const(RSA, RSAPublicKey) +DECLARE_ASN1_ENCODE_FUNCTIONS_const(RSA, RSAPrivateKey) + +typedef struct rsa_pss_params_st { + X509_ALGOR *hashAlgorithm; + X509_ALGOR *maskGenAlgorithm; + ASN1_INTEGER *saltLength; + ASN1_INTEGER *trailerField; +} RSA_PSS_PARAMS; + +DECLARE_ASN1_FUNCTIONS(RSA_PSS_PARAMS) + +typedef struct rsa_oaep_params_st { + X509_ALGOR *hashFunc; + X509_ALGOR *maskGenFunc; + X509_ALGOR *pSourceFunc; +} RSA_OAEP_PARAMS; + +DECLARE_ASN1_FUNCTIONS(RSA_OAEP_PARAMS) + +# ifndef OPENSSL_NO_FP_API +int RSA_print_fp(FILE *fp, const RSA *r, int offset); +# endif + +# ifndef OPENSSL_NO_BIO +int RSA_print(BIO *bp, const RSA *r, int offset); +# endif + +# ifndef OPENSSL_NO_RC4 +int i2d_RSA_NET(const RSA *a, unsigned char **pp, + int (*cb) (char *buf, int len, const char *prompt, + int verify), int sgckey); +RSA *d2i_RSA_NET(RSA **a, const unsigned char **pp, long length, + int (*cb) (char *buf, int len, const char *prompt, + int verify), int sgckey); + +int i2d_Netscape_RSA(const RSA *a, unsigned char **pp, + int (*cb) (char *buf, int len, const char *prompt, + int verify)); +RSA *d2i_Netscape_RSA(RSA **a, const unsigned char **pp, long length, + int (*cb) (char *buf, int len, const char *prompt, + int verify)); +# endif + +/* + * The following 2 functions sign and verify a X509_SIG ASN1 object inside + * PKCS#1 padded RSA encryption + */ +int RSA_sign(int type, const unsigned char *m, unsigned int m_length, + unsigned char *sigret, unsigned int *siglen, RSA *rsa); +int RSA_verify(int type, const unsigned char *m, unsigned int m_length, + const unsigned char *sigbuf, unsigned int siglen, RSA *rsa); + +/* + * The following 2 function sign and verify a ASN1_OCTET_STRING object inside + * PKCS#1 padded RSA encryption + */ +int RSA_sign_ASN1_OCTET_STRING(int type, + const unsigned char *m, unsigned int m_length, + unsigned char *sigret, unsigned int *siglen, + RSA *rsa); +int RSA_verify_ASN1_OCTET_STRING(int type, const unsigned char *m, + unsigned int m_length, unsigned char *sigbuf, + unsigned int siglen, RSA *rsa); + +int RSA_blinding_on(RSA *rsa, BN_CTX *ctx); +void RSA_blinding_off(RSA *rsa); +BN_BLINDING *RSA_setup_blinding(RSA *rsa, BN_CTX *ctx); + +int RSA_padding_add_PKCS1_type_1(unsigned char *to, int tlen, + const unsigned char *f, int fl); +int RSA_padding_check_PKCS1_type_1(unsigned char *to, int tlen, + const unsigned char *f, int fl, + int rsa_len); +int RSA_padding_add_PKCS1_type_2(unsigned char *to, int tlen, + const unsigned char *f, int fl); +int RSA_padding_check_PKCS1_type_2(unsigned char *to, int tlen, + const unsigned char *f, int fl, + int rsa_len); +int PKCS1_MGF1(unsigned char *mask, long len, const unsigned char *seed, + long seedlen, const EVP_MD *dgst); +int RSA_padding_add_PKCS1_OAEP(unsigned char *to, int tlen, + const unsigned char *f, int fl, + const unsigned char *p, int pl); +int RSA_padding_check_PKCS1_OAEP(unsigned char *to, int tlen, + const unsigned char *f, int fl, int rsa_len, + const unsigned char *p, int pl); +int RSA_padding_add_PKCS1_OAEP_mgf1(unsigned char *to, int tlen, + const unsigned char *from, int flen, + const unsigned char *param, int plen, + const EVP_MD *md, const EVP_MD *mgf1md); +int RSA_padding_check_PKCS1_OAEP_mgf1(unsigned char *to, int tlen, + const unsigned char *from, int flen, + int num, const unsigned char *param, + int plen, const EVP_MD *md, + const EVP_MD *mgf1md); +int RSA_padding_add_SSLv23(unsigned char *to, int tlen, + const unsigned char *f, int fl); +int RSA_padding_check_SSLv23(unsigned char *to, int tlen, + const unsigned char *f, int fl, int rsa_len); +int RSA_padding_add_none(unsigned char *to, int tlen, const unsigned char *f, + int fl); +int RSA_padding_check_none(unsigned char *to, int tlen, + const unsigned char *f, int fl, int rsa_len); +int RSA_padding_add_X931(unsigned char *to, int tlen, const unsigned char *f, + int fl); +int RSA_padding_check_X931(unsigned char *to, int tlen, + const unsigned char *f, int fl, int rsa_len); +int RSA_X931_hash_id(int nid); + +int RSA_verify_PKCS1_PSS(RSA *rsa, const unsigned char *mHash, + const EVP_MD *Hash, const unsigned char *EM, + int sLen); +int RSA_padding_add_PKCS1_PSS(RSA *rsa, unsigned char *EM, + const unsigned char *mHash, const EVP_MD *Hash, + int sLen); + +int RSA_verify_PKCS1_PSS_mgf1(RSA *rsa, const unsigned char *mHash, + const EVP_MD *Hash, const EVP_MD *mgf1Hash, + const unsigned char *EM, int sLen); + +int RSA_padding_add_PKCS1_PSS_mgf1(RSA *rsa, unsigned char *EM, + const unsigned char *mHash, + const EVP_MD *Hash, const EVP_MD *mgf1Hash, + int sLen); + +int RSA_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); +int RSA_set_ex_data(RSA *r, int idx, void *arg); +void *RSA_get_ex_data(const RSA *r, int idx); + +RSA *RSAPublicKey_dup(RSA *rsa); +RSA *RSAPrivateKey_dup(RSA *rsa); + +/* + * If this flag is set the RSA method is FIPS compliant and can be used in + * FIPS mode. This is set in the validated module method. If an application + * sets this flag in its own methods it is its responsibility to ensure the + * result is compliant. + */ + +# define RSA_FLAG_FIPS_METHOD 0x0400 + +/* + * If this flag is set the operations normally disabled in FIPS mode are + * permitted it is then the applications responsibility to ensure that the + * usage is compliant. + */ + +# define RSA_FLAG_NON_FIPS_ALLOW 0x0400 +/* + * Application has decided PRNG is good enough to generate a key: don't + * check. + */ +# define RSA_FLAG_CHECKED 0x0800 + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_RSA_strings(void); + +/* Error codes for the RSA functions. */ + +/* Function codes. */ +# define RSA_F_CHECK_PADDING_MD 140 +# define RSA_F_DO_RSA_PRINT 146 +# define RSA_F_INT_RSA_VERIFY 145 +# define RSA_F_MEMORY_LOCK 100 +# define RSA_F_OLD_RSA_PRIV_DECODE 147 +# define RSA_F_PKEY_RSA_CTRL 143 +# define RSA_F_PKEY_RSA_CTRL_STR 144 +# define RSA_F_PKEY_RSA_SIGN 142 +# define RSA_F_PKEY_RSA_VERIFY 154 +# define RSA_F_PKEY_RSA_VERIFYRECOVER 141 +# define RSA_F_RSA_ALGOR_TO_MD 157 +# define RSA_F_RSA_BUILTIN_KEYGEN 129 +# define RSA_F_RSA_CHECK_KEY 123 +# define RSA_F_RSA_CMS_DECRYPT 158 +# define RSA_F_RSA_EAY_PRIVATE_DECRYPT 101 +# define RSA_F_RSA_EAY_PRIVATE_ENCRYPT 102 +# define RSA_F_RSA_EAY_PUBLIC_DECRYPT 103 +# define RSA_F_RSA_EAY_PUBLIC_ENCRYPT 104 +# define RSA_F_RSA_GENERATE_KEY 105 +# define RSA_F_RSA_GENERATE_KEY_EX 155 +# define RSA_F_RSA_ITEM_VERIFY 156 +# define RSA_F_RSA_MEMORY_LOCK 130 +# define RSA_F_RSA_MGF1_TO_MD 159 +# define RSA_F_RSA_NEW_METHOD 106 +# define RSA_F_RSA_NULL 124 +# define RSA_F_RSA_NULL_MOD_EXP 131 +# define RSA_F_RSA_NULL_PRIVATE_DECRYPT 132 +# define RSA_F_RSA_NULL_PRIVATE_ENCRYPT 133 +# define RSA_F_RSA_NULL_PUBLIC_DECRYPT 134 +# define RSA_F_RSA_NULL_PUBLIC_ENCRYPT 135 +# define RSA_F_RSA_PADDING_ADD_NONE 107 +# define RSA_F_RSA_PADDING_ADD_PKCS1_OAEP 121 +# define RSA_F_RSA_PADDING_ADD_PKCS1_OAEP_MGF1 160 +# define RSA_F_RSA_PADDING_ADD_PKCS1_PSS 125 +# define RSA_F_RSA_PADDING_ADD_PKCS1_PSS_MGF1 148 +# define RSA_F_RSA_PADDING_ADD_PKCS1_TYPE_1 108 +# define RSA_F_RSA_PADDING_ADD_PKCS1_TYPE_2 109 +# define RSA_F_RSA_PADDING_ADD_SSLV23 110 +# define RSA_F_RSA_PADDING_ADD_X931 127 +# define RSA_F_RSA_PADDING_CHECK_NONE 111 +# define RSA_F_RSA_PADDING_CHECK_PKCS1_OAEP 122 +# define RSA_F_RSA_PADDING_CHECK_PKCS1_OAEP_MGF1 161 +# define RSA_F_RSA_PADDING_CHECK_PKCS1_TYPE_1 112 +# define RSA_F_RSA_PADDING_CHECK_PKCS1_TYPE_2 113 +# define RSA_F_RSA_PADDING_CHECK_SSLV23 114 +# define RSA_F_RSA_PADDING_CHECK_X931 128 +# define RSA_F_RSA_PRINT 115 +# define RSA_F_RSA_PRINT_FP 116 +# define RSA_F_RSA_PRIVATE_DECRYPT 150 +# define RSA_F_RSA_PRIVATE_ENCRYPT 151 +# define RSA_F_RSA_PRIV_DECODE 137 +# define RSA_F_RSA_PRIV_ENCODE 138 +# define RSA_F_RSA_PSS_TO_CTX 162 +# define RSA_F_RSA_PUBLIC_DECRYPT 152 +# define RSA_F_RSA_PUBLIC_ENCRYPT 153 +# define RSA_F_RSA_PUB_DECODE 139 +# define RSA_F_RSA_SETUP_BLINDING 136 +# define RSA_F_RSA_SIGN 117 +# define RSA_F_RSA_SIGN_ASN1_OCTET_STRING 118 +# define RSA_F_RSA_VERIFY 119 +# define RSA_F_RSA_VERIFY_ASN1_OCTET_STRING 120 +# define RSA_F_RSA_VERIFY_PKCS1_PSS 126 +# define RSA_F_RSA_VERIFY_PKCS1_PSS_MGF1 149 + +/* Reason codes. */ +# define RSA_R_ALGORITHM_MISMATCH 100 +# define RSA_R_BAD_E_VALUE 101 +# define RSA_R_BAD_FIXED_HEADER_DECRYPT 102 +# define RSA_R_BAD_PAD_BYTE_COUNT 103 +# define RSA_R_BAD_SIGNATURE 104 +# define RSA_R_BLOCK_TYPE_IS_NOT_01 106 +# define RSA_R_BLOCK_TYPE_IS_NOT_02 107 +# define RSA_R_DATA_GREATER_THAN_MOD_LEN 108 +# define RSA_R_DATA_TOO_LARGE 109 +# define RSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE 110 +# define RSA_R_DATA_TOO_LARGE_FOR_MODULUS 132 +# define RSA_R_DATA_TOO_SMALL 111 +# define RSA_R_DATA_TOO_SMALL_FOR_KEY_SIZE 122 +# define RSA_R_DIGEST_DOES_NOT_MATCH 166 +# define RSA_R_DIGEST_TOO_BIG_FOR_RSA_KEY 112 +# define RSA_R_DMP1_NOT_CONGRUENT_TO_D 124 +# define RSA_R_DMQ1_NOT_CONGRUENT_TO_D 125 +# define RSA_R_D_E_NOT_CONGRUENT_TO_1 123 +# define RSA_R_FIRST_OCTET_INVALID 133 +# define RSA_R_ILLEGAL_OR_UNSUPPORTED_PADDING_MODE 144 +# define RSA_R_INVALID_DIGEST 160 +# define RSA_R_INVALID_DIGEST_LENGTH 143 +# define RSA_R_INVALID_HEADER 137 +# define RSA_R_INVALID_KEYBITS 145 +# define RSA_R_INVALID_LABEL 161 +# define RSA_R_INVALID_MESSAGE_LENGTH 131 +# define RSA_R_INVALID_MGF1_MD 156 +# define RSA_R_INVALID_OAEP_PARAMETERS 162 +# define RSA_R_INVALID_PADDING 138 +# define RSA_R_INVALID_PADDING_MODE 141 +# define RSA_R_INVALID_PSS_PARAMETERS 149 +# define RSA_R_INVALID_PSS_SALTLEN 146 +# define RSA_R_INVALID_SALT_LENGTH 150 +# define RSA_R_INVALID_TRAILER 139 +# define RSA_R_INVALID_X931_DIGEST 142 +# define RSA_R_IQMP_NOT_INVERSE_OF_Q 126 +# define RSA_R_KEY_SIZE_TOO_SMALL 120 +# define RSA_R_LAST_OCTET_INVALID 134 +# define RSA_R_MODULUS_TOO_LARGE 105 +# define RSA_R_NON_FIPS_RSA_METHOD 157 +# define RSA_R_NO_PUBLIC_EXPONENT 140 +# define RSA_R_NULL_BEFORE_BLOCK_MISSING 113 +# define RSA_R_N_DOES_NOT_EQUAL_P_Q 127 +# define RSA_R_OAEP_DECODING_ERROR 121 +# define RSA_R_OPERATION_NOT_ALLOWED_IN_FIPS_MODE 158 +# define RSA_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE 148 +# define RSA_R_PADDING_CHECK_FAILED 114 +# define RSA_R_PKCS_DECODING_ERROR 159 +# define RSA_R_P_NOT_PRIME 128 +# define RSA_R_Q_NOT_PRIME 129 +# define RSA_R_RSA_OPERATIONS_NOT_SUPPORTED 130 +# define RSA_R_SLEN_CHECK_FAILED 136 +# define RSA_R_SLEN_RECOVERY_FAILED 135 +# define RSA_R_SSLV3_ROLLBACK_ATTACK 115 +# define RSA_R_THE_ASN1_OBJECT_IDENTIFIER_IS_NOT_KNOWN_FOR_THIS_MD 116 +# define RSA_R_UNKNOWN_ALGORITHM_TYPE 117 +# define RSA_R_UNKNOWN_DIGEST 163 +# define RSA_R_UNKNOWN_MASK_DIGEST 151 +# define RSA_R_UNKNOWN_PADDING_TYPE 118 +# define RSA_R_UNKNOWN_PSS_DIGEST 152 +# define RSA_R_UNSUPPORTED_ENCRYPTION_TYPE 164 +# define RSA_R_UNSUPPORTED_LABEL_SOURCE 165 +# define RSA_R_UNSUPPORTED_MASK_ALGORITHM 153 +# define RSA_R_UNSUPPORTED_MASK_PARAMETER 154 +# define RSA_R_UNSUPPORTED_SIGNATURE_TYPE 155 +# define RSA_R_VALUE_MISSING 147 +# define RSA_R_WRONG_SIGNATURE_LENGTH 119 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/safestack.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/safestack.h new file mode 100644 index 0000000..1d4f87e --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/safestack.h @@ -0,0 +1,2672 @@ +/* ==================================================================== + * Copyright (c) 1999 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_SAFESTACK_H +# define HEADER_SAFESTACK_H + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# ifndef CHECKED_PTR_OF +# define CHECKED_PTR_OF(type, p) \ + ((void*) (1 ? p : (type*)0)) +# endif + +/* + * In C++ we get problems because an explicit cast is needed from (void *) we + * use CHECKED_STACK_OF to ensure the correct type is passed in the macros + * below. + */ + +# define CHECKED_STACK_OF(type, p) \ + ((_STACK*) (1 ? p : (STACK_OF(type)*)0)) + +# define CHECKED_SK_COPY_FUNC(type, p) \ + ((void *(*)(void *)) ((1 ? p : (type *(*)(const type *))0))) + +# define CHECKED_SK_FREE_FUNC(type, p) \ + ((void (*)(void *)) ((1 ? p : (void (*)(type *))0))) + +# define CHECKED_SK_CMP_FUNC(type, p) \ + ((int (*)(const void *, const void *)) \ + ((1 ? p : (int (*)(const type * const *, const type * const *))0))) + +# define STACK_OF(type) struct stack_st_##type +# define PREDECLARE_STACK_OF(type) STACK_OF(type); + +# define DECLARE_STACK_OF(type) \ +STACK_OF(type) \ + { \ + _STACK stack; \ + }; +# define DECLARE_SPECIAL_STACK_OF(type, type2) \ +STACK_OF(type) \ + { \ + _STACK stack; \ + }; + +/* nada (obsolete in new safestack approach)*/ +# define IMPLEMENT_STACK_OF(type) + +/*- + * Strings are special: normally an lhash entry will point to a single + * (somewhat) mutable object. In the case of strings: + * + * a) Instead of a single char, there is an array of chars, NUL-terminated. + * b) The string may have be immutable. + * + * So, they need their own declarations. Especially important for + * type-checking tools, such as Deputy. + * + * In practice, however, it appears to be hard to have a const + * string. For now, I'm settling for dealing with the fact it is a + * string at all. + */ +typedef char *OPENSSL_STRING; + +typedef const char *OPENSSL_CSTRING; + +/* + * Confusingly, LHASH_OF(STRING) deals with char ** throughout, but + * STACK_OF(STRING) is really more like STACK_OF(char), only, as mentioned + * above, instead of a single char each entry is a NUL-terminated array of + * chars. So, we have to implement STRING specially for STACK_OF. This is + * dealt with in the autogenerated macros below. + */ + +DECLARE_SPECIAL_STACK_OF(OPENSSL_STRING, char) + +/* + * Similarly, we sometimes use a block of characters, NOT nul-terminated. + * These should also be distinguished from "normal" stacks. + */ +typedef void *OPENSSL_BLOCK; +DECLARE_SPECIAL_STACK_OF(OPENSSL_BLOCK, void) + +/* + * SKM_sk_... stack macros are internal to safestack.h: never use them + * directly, use sk__... instead + */ +# define SKM_sk_new(type, cmp) \ + ((STACK_OF(type) *)sk_new(CHECKED_SK_CMP_FUNC(type, cmp))) +# define SKM_sk_new_null(type) \ + ((STACK_OF(type) *)sk_new_null()) +# define SKM_sk_free(type, st) \ + sk_free(CHECKED_STACK_OF(type, st)) +# define SKM_sk_num(type, st) \ + sk_num(CHECKED_STACK_OF(type, st)) +# define SKM_sk_value(type, st,i) \ + ((type *)sk_value(CHECKED_STACK_OF(type, st), i)) +# define SKM_sk_set(type, st,i,val) \ + sk_set(CHECKED_STACK_OF(type, st), i, CHECKED_PTR_OF(type, val)) +# define SKM_sk_zero(type, st) \ + sk_zero(CHECKED_STACK_OF(type, st)) +# define SKM_sk_push(type, st, val) \ + sk_push(CHECKED_STACK_OF(type, st), CHECKED_PTR_OF(type, val)) +# define SKM_sk_unshift(type, st, val) \ + sk_unshift(CHECKED_STACK_OF(type, st), CHECKED_PTR_OF(type, val)) +# define SKM_sk_find(type, st, val) \ + sk_find(CHECKED_STACK_OF(type, st), CHECKED_PTR_OF(type, val)) +# define SKM_sk_find_ex(type, st, val) \ + sk_find_ex(CHECKED_STACK_OF(type, st), \ + CHECKED_PTR_OF(type, val)) +# define SKM_sk_delete(type, st, i) \ + (type *)sk_delete(CHECKED_STACK_OF(type, st), i) +# define SKM_sk_delete_ptr(type, st, ptr) \ + (type *)sk_delete_ptr(CHECKED_STACK_OF(type, st), CHECKED_PTR_OF(type, ptr)) +# define SKM_sk_insert(type, st,val, i) \ + sk_insert(CHECKED_STACK_OF(type, st), CHECKED_PTR_OF(type, val), i) +# define SKM_sk_set_cmp_func(type, st, cmp) \ + ((int (*)(const type * const *,const type * const *)) \ + sk_set_cmp_func(CHECKED_STACK_OF(type, st), CHECKED_SK_CMP_FUNC(type, cmp))) +# define SKM_sk_dup(type, st) \ + (STACK_OF(type) *)sk_dup(CHECKED_STACK_OF(type, st)) +# define SKM_sk_pop_free(type, st, free_func) \ + sk_pop_free(CHECKED_STACK_OF(type, st), CHECKED_SK_FREE_FUNC(type, free_func)) +# define SKM_sk_deep_copy(type, st, copy_func, free_func) \ + (STACK_OF(type) *)sk_deep_copy(CHECKED_STACK_OF(type, st), CHECKED_SK_COPY_FUNC(type, copy_func), CHECKED_SK_FREE_FUNC(type, free_func)) +# define SKM_sk_shift(type, st) \ + (type *)sk_shift(CHECKED_STACK_OF(type, st)) +# define SKM_sk_pop(type, st) \ + (type *)sk_pop(CHECKED_STACK_OF(type, st)) +# define SKM_sk_sort(type, st) \ + sk_sort(CHECKED_STACK_OF(type, st)) +# define SKM_sk_is_sorted(type, st) \ + sk_is_sorted(CHECKED_STACK_OF(type, st)) +# define SKM_ASN1_SET_OF_d2i(type, st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + (STACK_OF(type) *)d2i_ASN1_SET( \ + (STACK_OF(OPENSSL_BLOCK) **)CHECKED_PTR_OF(STACK_OF(type)*, st), \ + pp, length, \ + CHECKED_D2I_OF(type, d2i_func), \ + CHECKED_SK_FREE_FUNC(type, free_func), \ + ex_tag, ex_class) +# define SKM_ASN1_SET_OF_i2d(type, st, pp, i2d_func, ex_tag, ex_class, is_set) \ + i2d_ASN1_SET((STACK_OF(OPENSSL_BLOCK) *)CHECKED_STACK_OF(type, st), pp, \ + CHECKED_I2D_OF(type, i2d_func), \ + ex_tag, ex_class, is_set) +# define SKM_ASN1_seq_pack(type, st, i2d_func, buf, len) \ + ASN1_seq_pack(CHECKED_PTR_OF(STACK_OF(type), st), \ + CHECKED_I2D_OF(type, i2d_func), buf, len) +# define SKM_ASN1_seq_unpack(type, buf, len, d2i_func, free_func) \ + (STACK_OF(type) *)ASN1_seq_unpack(buf, len, CHECKED_D2I_OF(type, d2i_func), CHECKED_SK_FREE_FUNC(type, free_func)) +# define SKM_PKCS12_decrypt_d2i(type, algor, d2i_func, free_func, pass, passlen, oct, seq) \ + (STACK_OF(type) *)PKCS12_decrypt_d2i(algor, \ + CHECKED_D2I_OF(type, d2i_func), \ + CHECKED_SK_FREE_FUNC(type, free_func), \ + pass, passlen, oct, seq) +/* + * This block of defines is updated by util/mkstack.pl, please do not touch! + */ +# define sk_ACCESS_DESCRIPTION_new(cmp) SKM_sk_new(ACCESS_DESCRIPTION, (cmp)) +# define sk_ACCESS_DESCRIPTION_new_null() SKM_sk_new_null(ACCESS_DESCRIPTION) +# define sk_ACCESS_DESCRIPTION_free(st) SKM_sk_free(ACCESS_DESCRIPTION, (st)) +# define sk_ACCESS_DESCRIPTION_num(st) SKM_sk_num(ACCESS_DESCRIPTION, (st)) +# define sk_ACCESS_DESCRIPTION_value(st, i) SKM_sk_value(ACCESS_DESCRIPTION, (st), (i)) +# define sk_ACCESS_DESCRIPTION_set(st, i, val) SKM_sk_set(ACCESS_DESCRIPTION, (st), (i), (val)) +# define sk_ACCESS_DESCRIPTION_zero(st) SKM_sk_zero(ACCESS_DESCRIPTION, (st)) +# define sk_ACCESS_DESCRIPTION_push(st, val) SKM_sk_push(ACCESS_DESCRIPTION, (st), (val)) +# define sk_ACCESS_DESCRIPTION_unshift(st, val) SKM_sk_unshift(ACCESS_DESCRIPTION, (st), (val)) +# define sk_ACCESS_DESCRIPTION_find(st, val) SKM_sk_find(ACCESS_DESCRIPTION, (st), (val)) +# define sk_ACCESS_DESCRIPTION_find_ex(st, val) SKM_sk_find_ex(ACCESS_DESCRIPTION, (st), (val)) +# define sk_ACCESS_DESCRIPTION_delete(st, i) SKM_sk_delete(ACCESS_DESCRIPTION, (st), (i)) +# define sk_ACCESS_DESCRIPTION_delete_ptr(st, ptr) SKM_sk_delete_ptr(ACCESS_DESCRIPTION, (st), (ptr)) +# define sk_ACCESS_DESCRIPTION_insert(st, val, i) SKM_sk_insert(ACCESS_DESCRIPTION, (st), (val), (i)) +# define sk_ACCESS_DESCRIPTION_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ACCESS_DESCRIPTION, (st), (cmp)) +# define sk_ACCESS_DESCRIPTION_dup(st) SKM_sk_dup(ACCESS_DESCRIPTION, st) +# define sk_ACCESS_DESCRIPTION_pop_free(st, free_func) SKM_sk_pop_free(ACCESS_DESCRIPTION, (st), (free_func)) +# define sk_ACCESS_DESCRIPTION_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(ACCESS_DESCRIPTION, (st), (copy_func), (free_func)) +# define sk_ACCESS_DESCRIPTION_shift(st) SKM_sk_shift(ACCESS_DESCRIPTION, (st)) +# define sk_ACCESS_DESCRIPTION_pop(st) SKM_sk_pop(ACCESS_DESCRIPTION, (st)) +# define sk_ACCESS_DESCRIPTION_sort(st) SKM_sk_sort(ACCESS_DESCRIPTION, (st)) +# define sk_ACCESS_DESCRIPTION_is_sorted(st) SKM_sk_is_sorted(ACCESS_DESCRIPTION, (st)) +# define sk_ASIdOrRange_new(cmp) SKM_sk_new(ASIdOrRange, (cmp)) +# define sk_ASIdOrRange_new_null() SKM_sk_new_null(ASIdOrRange) +# define sk_ASIdOrRange_free(st) SKM_sk_free(ASIdOrRange, (st)) +# define sk_ASIdOrRange_num(st) SKM_sk_num(ASIdOrRange, (st)) +# define sk_ASIdOrRange_value(st, i) SKM_sk_value(ASIdOrRange, (st), (i)) +# define sk_ASIdOrRange_set(st, i, val) SKM_sk_set(ASIdOrRange, (st), (i), (val)) +# define sk_ASIdOrRange_zero(st) SKM_sk_zero(ASIdOrRange, (st)) +# define sk_ASIdOrRange_push(st, val) SKM_sk_push(ASIdOrRange, (st), (val)) +# define sk_ASIdOrRange_unshift(st, val) SKM_sk_unshift(ASIdOrRange, (st), (val)) +# define sk_ASIdOrRange_find(st, val) SKM_sk_find(ASIdOrRange, (st), (val)) +# define sk_ASIdOrRange_find_ex(st, val) SKM_sk_find_ex(ASIdOrRange, (st), (val)) +# define sk_ASIdOrRange_delete(st, i) SKM_sk_delete(ASIdOrRange, (st), (i)) +# define sk_ASIdOrRange_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASIdOrRange, (st), (ptr)) +# define sk_ASIdOrRange_insert(st, val, i) SKM_sk_insert(ASIdOrRange, (st), (val), (i)) +# define sk_ASIdOrRange_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASIdOrRange, (st), (cmp)) +# define sk_ASIdOrRange_dup(st) SKM_sk_dup(ASIdOrRange, st) +# define sk_ASIdOrRange_pop_free(st, free_func) SKM_sk_pop_free(ASIdOrRange, (st), (free_func)) +# define sk_ASIdOrRange_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(ASIdOrRange, (st), (copy_func), (free_func)) +# define sk_ASIdOrRange_shift(st) SKM_sk_shift(ASIdOrRange, (st)) +# define sk_ASIdOrRange_pop(st) SKM_sk_pop(ASIdOrRange, (st)) +# define sk_ASIdOrRange_sort(st) SKM_sk_sort(ASIdOrRange, (st)) +# define sk_ASIdOrRange_is_sorted(st) SKM_sk_is_sorted(ASIdOrRange, (st)) +# define sk_ASN1_GENERALSTRING_new(cmp) SKM_sk_new(ASN1_GENERALSTRING, (cmp)) +# define sk_ASN1_GENERALSTRING_new_null() SKM_sk_new_null(ASN1_GENERALSTRING) +# define sk_ASN1_GENERALSTRING_free(st) SKM_sk_free(ASN1_GENERALSTRING, (st)) +# define sk_ASN1_GENERALSTRING_num(st) SKM_sk_num(ASN1_GENERALSTRING, (st)) +# define sk_ASN1_GENERALSTRING_value(st, i) SKM_sk_value(ASN1_GENERALSTRING, (st), (i)) +# define sk_ASN1_GENERALSTRING_set(st, i, val) SKM_sk_set(ASN1_GENERALSTRING, (st), (i), (val)) +# define sk_ASN1_GENERALSTRING_zero(st) SKM_sk_zero(ASN1_GENERALSTRING, (st)) +# define sk_ASN1_GENERALSTRING_push(st, val) SKM_sk_push(ASN1_GENERALSTRING, (st), (val)) +# define sk_ASN1_GENERALSTRING_unshift(st, val) SKM_sk_unshift(ASN1_GENERALSTRING, (st), (val)) +# define sk_ASN1_GENERALSTRING_find(st, val) SKM_sk_find(ASN1_GENERALSTRING, (st), (val)) +# define sk_ASN1_GENERALSTRING_find_ex(st, val) SKM_sk_find_ex(ASN1_GENERALSTRING, (st), (val)) +# define sk_ASN1_GENERALSTRING_delete(st, i) SKM_sk_delete(ASN1_GENERALSTRING, (st), (i)) +# define sk_ASN1_GENERALSTRING_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASN1_GENERALSTRING, (st), (ptr)) +# define sk_ASN1_GENERALSTRING_insert(st, val, i) SKM_sk_insert(ASN1_GENERALSTRING, (st), (val), (i)) +# define sk_ASN1_GENERALSTRING_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASN1_GENERALSTRING, (st), (cmp)) +# define sk_ASN1_GENERALSTRING_dup(st) SKM_sk_dup(ASN1_GENERALSTRING, st) +# define sk_ASN1_GENERALSTRING_pop_free(st, free_func) SKM_sk_pop_free(ASN1_GENERALSTRING, (st), (free_func)) +# define sk_ASN1_GENERALSTRING_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(ASN1_GENERALSTRING, (st), (copy_func), (free_func)) +# define sk_ASN1_GENERALSTRING_shift(st) SKM_sk_shift(ASN1_GENERALSTRING, (st)) +# define sk_ASN1_GENERALSTRING_pop(st) SKM_sk_pop(ASN1_GENERALSTRING, (st)) +# define sk_ASN1_GENERALSTRING_sort(st) SKM_sk_sort(ASN1_GENERALSTRING, (st)) +# define sk_ASN1_GENERALSTRING_is_sorted(st) SKM_sk_is_sorted(ASN1_GENERALSTRING, (st)) +# define sk_ASN1_INTEGER_new(cmp) SKM_sk_new(ASN1_INTEGER, (cmp)) +# define sk_ASN1_INTEGER_new_null() SKM_sk_new_null(ASN1_INTEGER) +# define sk_ASN1_INTEGER_free(st) SKM_sk_free(ASN1_INTEGER, (st)) +# define sk_ASN1_INTEGER_num(st) SKM_sk_num(ASN1_INTEGER, (st)) +# define sk_ASN1_INTEGER_value(st, i) SKM_sk_value(ASN1_INTEGER, (st), (i)) +# define sk_ASN1_INTEGER_set(st, i, val) SKM_sk_set(ASN1_INTEGER, (st), (i), (val)) +# define sk_ASN1_INTEGER_zero(st) SKM_sk_zero(ASN1_INTEGER, (st)) +# define sk_ASN1_INTEGER_push(st, val) SKM_sk_push(ASN1_INTEGER, (st), (val)) +# define sk_ASN1_INTEGER_unshift(st, val) SKM_sk_unshift(ASN1_INTEGER, (st), (val)) +# define sk_ASN1_INTEGER_find(st, val) SKM_sk_find(ASN1_INTEGER, (st), (val)) +# define sk_ASN1_INTEGER_find_ex(st, val) SKM_sk_find_ex(ASN1_INTEGER, (st), (val)) +# define sk_ASN1_INTEGER_delete(st, i) SKM_sk_delete(ASN1_INTEGER, (st), (i)) +# define sk_ASN1_INTEGER_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASN1_INTEGER, (st), (ptr)) +# define sk_ASN1_INTEGER_insert(st, val, i) SKM_sk_insert(ASN1_INTEGER, (st), (val), (i)) +# define sk_ASN1_INTEGER_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASN1_INTEGER, (st), (cmp)) +# define sk_ASN1_INTEGER_dup(st) SKM_sk_dup(ASN1_INTEGER, st) +# define sk_ASN1_INTEGER_pop_free(st, free_func) SKM_sk_pop_free(ASN1_INTEGER, (st), (free_func)) +# define sk_ASN1_INTEGER_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(ASN1_INTEGER, (st), (copy_func), (free_func)) +# define sk_ASN1_INTEGER_shift(st) SKM_sk_shift(ASN1_INTEGER, (st)) +# define sk_ASN1_INTEGER_pop(st) SKM_sk_pop(ASN1_INTEGER, (st)) +# define sk_ASN1_INTEGER_sort(st) SKM_sk_sort(ASN1_INTEGER, (st)) +# define sk_ASN1_INTEGER_is_sorted(st) SKM_sk_is_sorted(ASN1_INTEGER, (st)) +# define sk_ASN1_OBJECT_new(cmp) SKM_sk_new(ASN1_OBJECT, (cmp)) +# define sk_ASN1_OBJECT_new_null() SKM_sk_new_null(ASN1_OBJECT) +# define sk_ASN1_OBJECT_free(st) SKM_sk_free(ASN1_OBJECT, (st)) +# define sk_ASN1_OBJECT_num(st) SKM_sk_num(ASN1_OBJECT, (st)) +# define sk_ASN1_OBJECT_value(st, i) SKM_sk_value(ASN1_OBJECT, (st), (i)) +# define sk_ASN1_OBJECT_set(st, i, val) SKM_sk_set(ASN1_OBJECT, (st), (i), (val)) +# define sk_ASN1_OBJECT_zero(st) SKM_sk_zero(ASN1_OBJECT, (st)) +# define sk_ASN1_OBJECT_push(st, val) SKM_sk_push(ASN1_OBJECT, (st), (val)) +# define sk_ASN1_OBJECT_unshift(st, val) SKM_sk_unshift(ASN1_OBJECT, (st), (val)) +# define sk_ASN1_OBJECT_find(st, val) SKM_sk_find(ASN1_OBJECT, (st), (val)) +# define sk_ASN1_OBJECT_find_ex(st, val) SKM_sk_find_ex(ASN1_OBJECT, (st), (val)) +# define sk_ASN1_OBJECT_delete(st, i) SKM_sk_delete(ASN1_OBJECT, (st), (i)) +# define sk_ASN1_OBJECT_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASN1_OBJECT, (st), (ptr)) +# define sk_ASN1_OBJECT_insert(st, val, i) SKM_sk_insert(ASN1_OBJECT, (st), (val), (i)) +# define sk_ASN1_OBJECT_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASN1_OBJECT, (st), (cmp)) +# define sk_ASN1_OBJECT_dup(st) SKM_sk_dup(ASN1_OBJECT, st) +# define sk_ASN1_OBJECT_pop_free(st, free_func) SKM_sk_pop_free(ASN1_OBJECT, (st), (free_func)) +# define sk_ASN1_OBJECT_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(ASN1_OBJECT, (st), (copy_func), (free_func)) +# define sk_ASN1_OBJECT_shift(st) SKM_sk_shift(ASN1_OBJECT, (st)) +# define sk_ASN1_OBJECT_pop(st) SKM_sk_pop(ASN1_OBJECT, (st)) +# define sk_ASN1_OBJECT_sort(st) SKM_sk_sort(ASN1_OBJECT, (st)) +# define sk_ASN1_OBJECT_is_sorted(st) SKM_sk_is_sorted(ASN1_OBJECT, (st)) +# define sk_ASN1_STRING_TABLE_new(cmp) SKM_sk_new(ASN1_STRING_TABLE, (cmp)) +# define sk_ASN1_STRING_TABLE_new_null() SKM_sk_new_null(ASN1_STRING_TABLE) +# define sk_ASN1_STRING_TABLE_free(st) SKM_sk_free(ASN1_STRING_TABLE, (st)) +# define sk_ASN1_STRING_TABLE_num(st) SKM_sk_num(ASN1_STRING_TABLE, (st)) +# define sk_ASN1_STRING_TABLE_value(st, i) SKM_sk_value(ASN1_STRING_TABLE, (st), (i)) +# define sk_ASN1_STRING_TABLE_set(st, i, val) SKM_sk_set(ASN1_STRING_TABLE, (st), (i), (val)) +# define sk_ASN1_STRING_TABLE_zero(st) SKM_sk_zero(ASN1_STRING_TABLE, (st)) +# define sk_ASN1_STRING_TABLE_push(st, val) SKM_sk_push(ASN1_STRING_TABLE, (st), (val)) +# define sk_ASN1_STRING_TABLE_unshift(st, val) SKM_sk_unshift(ASN1_STRING_TABLE, (st), (val)) +# define sk_ASN1_STRING_TABLE_find(st, val) SKM_sk_find(ASN1_STRING_TABLE, (st), (val)) +# define sk_ASN1_STRING_TABLE_find_ex(st, val) SKM_sk_find_ex(ASN1_STRING_TABLE, (st), (val)) +# define sk_ASN1_STRING_TABLE_delete(st, i) SKM_sk_delete(ASN1_STRING_TABLE, (st), (i)) +# define sk_ASN1_STRING_TABLE_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASN1_STRING_TABLE, (st), (ptr)) +# define sk_ASN1_STRING_TABLE_insert(st, val, i) SKM_sk_insert(ASN1_STRING_TABLE, (st), (val), (i)) +# define sk_ASN1_STRING_TABLE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASN1_STRING_TABLE, (st), (cmp)) +# define sk_ASN1_STRING_TABLE_dup(st) SKM_sk_dup(ASN1_STRING_TABLE, st) +# define sk_ASN1_STRING_TABLE_pop_free(st, free_func) SKM_sk_pop_free(ASN1_STRING_TABLE, (st), (free_func)) +# define sk_ASN1_STRING_TABLE_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(ASN1_STRING_TABLE, (st), (copy_func), (free_func)) +# define sk_ASN1_STRING_TABLE_shift(st) SKM_sk_shift(ASN1_STRING_TABLE, (st)) +# define sk_ASN1_STRING_TABLE_pop(st) SKM_sk_pop(ASN1_STRING_TABLE, (st)) +# define sk_ASN1_STRING_TABLE_sort(st) SKM_sk_sort(ASN1_STRING_TABLE, (st)) +# define sk_ASN1_STRING_TABLE_is_sorted(st) SKM_sk_is_sorted(ASN1_STRING_TABLE, (st)) +# define sk_ASN1_TYPE_new(cmp) SKM_sk_new(ASN1_TYPE, (cmp)) +# define sk_ASN1_TYPE_new_null() SKM_sk_new_null(ASN1_TYPE) +# define sk_ASN1_TYPE_free(st) SKM_sk_free(ASN1_TYPE, (st)) +# define sk_ASN1_TYPE_num(st) SKM_sk_num(ASN1_TYPE, (st)) +# define sk_ASN1_TYPE_value(st, i) SKM_sk_value(ASN1_TYPE, (st), (i)) +# define sk_ASN1_TYPE_set(st, i, val) SKM_sk_set(ASN1_TYPE, (st), (i), (val)) +# define sk_ASN1_TYPE_zero(st) SKM_sk_zero(ASN1_TYPE, (st)) +# define sk_ASN1_TYPE_push(st, val) SKM_sk_push(ASN1_TYPE, (st), (val)) +# define sk_ASN1_TYPE_unshift(st, val) SKM_sk_unshift(ASN1_TYPE, (st), (val)) +# define sk_ASN1_TYPE_find(st, val) SKM_sk_find(ASN1_TYPE, (st), (val)) +# define sk_ASN1_TYPE_find_ex(st, val) SKM_sk_find_ex(ASN1_TYPE, (st), (val)) +# define sk_ASN1_TYPE_delete(st, i) SKM_sk_delete(ASN1_TYPE, (st), (i)) +# define sk_ASN1_TYPE_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASN1_TYPE, (st), (ptr)) +# define sk_ASN1_TYPE_insert(st, val, i) SKM_sk_insert(ASN1_TYPE, (st), (val), (i)) +# define sk_ASN1_TYPE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASN1_TYPE, (st), (cmp)) +# define sk_ASN1_TYPE_dup(st) SKM_sk_dup(ASN1_TYPE, st) +# define sk_ASN1_TYPE_pop_free(st, free_func) SKM_sk_pop_free(ASN1_TYPE, (st), (free_func)) +# define sk_ASN1_TYPE_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(ASN1_TYPE, (st), (copy_func), (free_func)) +# define sk_ASN1_TYPE_shift(st) SKM_sk_shift(ASN1_TYPE, (st)) +# define sk_ASN1_TYPE_pop(st) SKM_sk_pop(ASN1_TYPE, (st)) +# define sk_ASN1_TYPE_sort(st) SKM_sk_sort(ASN1_TYPE, (st)) +# define sk_ASN1_TYPE_is_sorted(st) SKM_sk_is_sorted(ASN1_TYPE, (st)) +# define sk_ASN1_UTF8STRING_new(cmp) SKM_sk_new(ASN1_UTF8STRING, (cmp)) +# define sk_ASN1_UTF8STRING_new_null() SKM_sk_new_null(ASN1_UTF8STRING) +# define sk_ASN1_UTF8STRING_free(st) SKM_sk_free(ASN1_UTF8STRING, (st)) +# define sk_ASN1_UTF8STRING_num(st) SKM_sk_num(ASN1_UTF8STRING, (st)) +# define sk_ASN1_UTF8STRING_value(st, i) SKM_sk_value(ASN1_UTF8STRING, (st), (i)) +# define sk_ASN1_UTF8STRING_set(st, i, val) SKM_sk_set(ASN1_UTF8STRING, (st), (i), (val)) +# define sk_ASN1_UTF8STRING_zero(st) SKM_sk_zero(ASN1_UTF8STRING, (st)) +# define sk_ASN1_UTF8STRING_push(st, val) SKM_sk_push(ASN1_UTF8STRING, (st), (val)) +# define sk_ASN1_UTF8STRING_unshift(st, val) SKM_sk_unshift(ASN1_UTF8STRING, (st), (val)) +# define sk_ASN1_UTF8STRING_find(st, val) SKM_sk_find(ASN1_UTF8STRING, (st), (val)) +# define sk_ASN1_UTF8STRING_find_ex(st, val) SKM_sk_find_ex(ASN1_UTF8STRING, (st), (val)) +# define sk_ASN1_UTF8STRING_delete(st, i) SKM_sk_delete(ASN1_UTF8STRING, (st), (i)) +# define sk_ASN1_UTF8STRING_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASN1_UTF8STRING, (st), (ptr)) +# define sk_ASN1_UTF8STRING_insert(st, val, i) SKM_sk_insert(ASN1_UTF8STRING, (st), (val), (i)) +# define sk_ASN1_UTF8STRING_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASN1_UTF8STRING, (st), (cmp)) +# define sk_ASN1_UTF8STRING_dup(st) SKM_sk_dup(ASN1_UTF8STRING, st) +# define sk_ASN1_UTF8STRING_pop_free(st, free_func) SKM_sk_pop_free(ASN1_UTF8STRING, (st), (free_func)) +# define sk_ASN1_UTF8STRING_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(ASN1_UTF8STRING, (st), (copy_func), (free_func)) +# define sk_ASN1_UTF8STRING_shift(st) SKM_sk_shift(ASN1_UTF8STRING, (st)) +# define sk_ASN1_UTF8STRING_pop(st) SKM_sk_pop(ASN1_UTF8STRING, (st)) +# define sk_ASN1_UTF8STRING_sort(st) SKM_sk_sort(ASN1_UTF8STRING, (st)) +# define sk_ASN1_UTF8STRING_is_sorted(st) SKM_sk_is_sorted(ASN1_UTF8STRING, (st)) +# define sk_ASN1_VALUE_new(cmp) SKM_sk_new(ASN1_VALUE, (cmp)) +# define sk_ASN1_VALUE_new_null() SKM_sk_new_null(ASN1_VALUE) +# define sk_ASN1_VALUE_free(st) SKM_sk_free(ASN1_VALUE, (st)) +# define sk_ASN1_VALUE_num(st) SKM_sk_num(ASN1_VALUE, (st)) +# define sk_ASN1_VALUE_value(st, i) SKM_sk_value(ASN1_VALUE, (st), (i)) +# define sk_ASN1_VALUE_set(st, i, val) SKM_sk_set(ASN1_VALUE, (st), (i), (val)) +# define sk_ASN1_VALUE_zero(st) SKM_sk_zero(ASN1_VALUE, (st)) +# define sk_ASN1_VALUE_push(st, val) SKM_sk_push(ASN1_VALUE, (st), (val)) +# define sk_ASN1_VALUE_unshift(st, val) SKM_sk_unshift(ASN1_VALUE, (st), (val)) +# define sk_ASN1_VALUE_find(st, val) SKM_sk_find(ASN1_VALUE, (st), (val)) +# define sk_ASN1_VALUE_find_ex(st, val) SKM_sk_find_ex(ASN1_VALUE, (st), (val)) +# define sk_ASN1_VALUE_delete(st, i) SKM_sk_delete(ASN1_VALUE, (st), (i)) +# define sk_ASN1_VALUE_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASN1_VALUE, (st), (ptr)) +# define sk_ASN1_VALUE_insert(st, val, i) SKM_sk_insert(ASN1_VALUE, (st), (val), (i)) +# define sk_ASN1_VALUE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASN1_VALUE, (st), (cmp)) +# define sk_ASN1_VALUE_dup(st) SKM_sk_dup(ASN1_VALUE, st) +# define sk_ASN1_VALUE_pop_free(st, free_func) SKM_sk_pop_free(ASN1_VALUE, (st), (free_func)) +# define sk_ASN1_VALUE_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(ASN1_VALUE, (st), (copy_func), (free_func)) +# define sk_ASN1_VALUE_shift(st) SKM_sk_shift(ASN1_VALUE, (st)) +# define sk_ASN1_VALUE_pop(st) SKM_sk_pop(ASN1_VALUE, (st)) +# define sk_ASN1_VALUE_sort(st) SKM_sk_sort(ASN1_VALUE, (st)) +# define sk_ASN1_VALUE_is_sorted(st) SKM_sk_is_sorted(ASN1_VALUE, (st)) +# define sk_BIO_new(cmp) SKM_sk_new(BIO, (cmp)) +# define sk_BIO_new_null() SKM_sk_new_null(BIO) +# define sk_BIO_free(st) SKM_sk_free(BIO, (st)) +# define sk_BIO_num(st) SKM_sk_num(BIO, (st)) +# define sk_BIO_value(st, i) SKM_sk_value(BIO, (st), (i)) +# define sk_BIO_set(st, i, val) SKM_sk_set(BIO, (st), (i), (val)) +# define sk_BIO_zero(st) SKM_sk_zero(BIO, (st)) +# define sk_BIO_push(st, val) SKM_sk_push(BIO, (st), (val)) +# define sk_BIO_unshift(st, val) SKM_sk_unshift(BIO, (st), (val)) +# define sk_BIO_find(st, val) SKM_sk_find(BIO, (st), (val)) +# define sk_BIO_find_ex(st, val) SKM_sk_find_ex(BIO, (st), (val)) +# define sk_BIO_delete(st, i) SKM_sk_delete(BIO, (st), (i)) +# define sk_BIO_delete_ptr(st, ptr) SKM_sk_delete_ptr(BIO, (st), (ptr)) +# define sk_BIO_insert(st, val, i) SKM_sk_insert(BIO, (st), (val), (i)) +# define sk_BIO_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(BIO, (st), (cmp)) +# define sk_BIO_dup(st) SKM_sk_dup(BIO, st) +# define sk_BIO_pop_free(st, free_func) SKM_sk_pop_free(BIO, (st), (free_func)) +# define sk_BIO_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(BIO, (st), (copy_func), (free_func)) +# define sk_BIO_shift(st) SKM_sk_shift(BIO, (st)) +# define sk_BIO_pop(st) SKM_sk_pop(BIO, (st)) +# define sk_BIO_sort(st) SKM_sk_sort(BIO, (st)) +# define sk_BIO_is_sorted(st) SKM_sk_is_sorted(BIO, (st)) +# define sk_BY_DIR_ENTRY_new(cmp) SKM_sk_new(BY_DIR_ENTRY, (cmp)) +# define sk_BY_DIR_ENTRY_new_null() SKM_sk_new_null(BY_DIR_ENTRY) +# define sk_BY_DIR_ENTRY_free(st) SKM_sk_free(BY_DIR_ENTRY, (st)) +# define sk_BY_DIR_ENTRY_num(st) SKM_sk_num(BY_DIR_ENTRY, (st)) +# define sk_BY_DIR_ENTRY_value(st, i) SKM_sk_value(BY_DIR_ENTRY, (st), (i)) +# define sk_BY_DIR_ENTRY_set(st, i, val) SKM_sk_set(BY_DIR_ENTRY, (st), (i), (val)) +# define sk_BY_DIR_ENTRY_zero(st) SKM_sk_zero(BY_DIR_ENTRY, (st)) +# define sk_BY_DIR_ENTRY_push(st, val) SKM_sk_push(BY_DIR_ENTRY, (st), (val)) +# define sk_BY_DIR_ENTRY_unshift(st, val) SKM_sk_unshift(BY_DIR_ENTRY, (st), (val)) +# define sk_BY_DIR_ENTRY_find(st, val) SKM_sk_find(BY_DIR_ENTRY, (st), (val)) +# define sk_BY_DIR_ENTRY_find_ex(st, val) SKM_sk_find_ex(BY_DIR_ENTRY, (st), (val)) +# define sk_BY_DIR_ENTRY_delete(st, i) SKM_sk_delete(BY_DIR_ENTRY, (st), (i)) +# define sk_BY_DIR_ENTRY_delete_ptr(st, ptr) SKM_sk_delete_ptr(BY_DIR_ENTRY, (st), (ptr)) +# define sk_BY_DIR_ENTRY_insert(st, val, i) SKM_sk_insert(BY_DIR_ENTRY, (st), (val), (i)) +# define sk_BY_DIR_ENTRY_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(BY_DIR_ENTRY, (st), (cmp)) +# define sk_BY_DIR_ENTRY_dup(st) SKM_sk_dup(BY_DIR_ENTRY, st) +# define sk_BY_DIR_ENTRY_pop_free(st, free_func) SKM_sk_pop_free(BY_DIR_ENTRY, (st), (free_func)) +# define sk_BY_DIR_ENTRY_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(BY_DIR_ENTRY, (st), (copy_func), (free_func)) +# define sk_BY_DIR_ENTRY_shift(st) SKM_sk_shift(BY_DIR_ENTRY, (st)) +# define sk_BY_DIR_ENTRY_pop(st) SKM_sk_pop(BY_DIR_ENTRY, (st)) +# define sk_BY_DIR_ENTRY_sort(st) SKM_sk_sort(BY_DIR_ENTRY, (st)) +# define sk_BY_DIR_ENTRY_is_sorted(st) SKM_sk_is_sorted(BY_DIR_ENTRY, (st)) +# define sk_BY_DIR_HASH_new(cmp) SKM_sk_new(BY_DIR_HASH, (cmp)) +# define sk_BY_DIR_HASH_new_null() SKM_sk_new_null(BY_DIR_HASH) +# define sk_BY_DIR_HASH_free(st) SKM_sk_free(BY_DIR_HASH, (st)) +# define sk_BY_DIR_HASH_num(st) SKM_sk_num(BY_DIR_HASH, (st)) +# define sk_BY_DIR_HASH_value(st, i) SKM_sk_value(BY_DIR_HASH, (st), (i)) +# define sk_BY_DIR_HASH_set(st, i, val) SKM_sk_set(BY_DIR_HASH, (st), (i), (val)) +# define sk_BY_DIR_HASH_zero(st) SKM_sk_zero(BY_DIR_HASH, (st)) +# define sk_BY_DIR_HASH_push(st, val) SKM_sk_push(BY_DIR_HASH, (st), (val)) +# define sk_BY_DIR_HASH_unshift(st, val) SKM_sk_unshift(BY_DIR_HASH, (st), (val)) +# define sk_BY_DIR_HASH_find(st, val) SKM_sk_find(BY_DIR_HASH, (st), (val)) +# define sk_BY_DIR_HASH_find_ex(st, val) SKM_sk_find_ex(BY_DIR_HASH, (st), (val)) +# define sk_BY_DIR_HASH_delete(st, i) SKM_sk_delete(BY_DIR_HASH, (st), (i)) +# define sk_BY_DIR_HASH_delete_ptr(st, ptr) SKM_sk_delete_ptr(BY_DIR_HASH, (st), (ptr)) +# define sk_BY_DIR_HASH_insert(st, val, i) SKM_sk_insert(BY_DIR_HASH, (st), (val), (i)) +# define sk_BY_DIR_HASH_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(BY_DIR_HASH, (st), (cmp)) +# define sk_BY_DIR_HASH_dup(st) SKM_sk_dup(BY_DIR_HASH, st) +# define sk_BY_DIR_HASH_pop_free(st, free_func) SKM_sk_pop_free(BY_DIR_HASH, (st), (free_func)) +# define sk_BY_DIR_HASH_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(BY_DIR_HASH, (st), (copy_func), (free_func)) +# define sk_BY_DIR_HASH_shift(st) SKM_sk_shift(BY_DIR_HASH, (st)) +# define sk_BY_DIR_HASH_pop(st) SKM_sk_pop(BY_DIR_HASH, (st)) +# define sk_BY_DIR_HASH_sort(st) SKM_sk_sort(BY_DIR_HASH, (st)) +# define sk_BY_DIR_HASH_is_sorted(st) SKM_sk_is_sorted(BY_DIR_HASH, (st)) +# define sk_CMS_CertificateChoices_new(cmp) SKM_sk_new(CMS_CertificateChoices, (cmp)) +# define sk_CMS_CertificateChoices_new_null() SKM_sk_new_null(CMS_CertificateChoices) +# define sk_CMS_CertificateChoices_free(st) SKM_sk_free(CMS_CertificateChoices, (st)) +# define sk_CMS_CertificateChoices_num(st) SKM_sk_num(CMS_CertificateChoices, (st)) +# define sk_CMS_CertificateChoices_value(st, i) SKM_sk_value(CMS_CertificateChoices, (st), (i)) +# define sk_CMS_CertificateChoices_set(st, i, val) SKM_sk_set(CMS_CertificateChoices, (st), (i), (val)) +# define sk_CMS_CertificateChoices_zero(st) SKM_sk_zero(CMS_CertificateChoices, (st)) +# define sk_CMS_CertificateChoices_push(st, val) SKM_sk_push(CMS_CertificateChoices, (st), (val)) +# define sk_CMS_CertificateChoices_unshift(st, val) SKM_sk_unshift(CMS_CertificateChoices, (st), (val)) +# define sk_CMS_CertificateChoices_find(st, val) SKM_sk_find(CMS_CertificateChoices, (st), (val)) +# define sk_CMS_CertificateChoices_find_ex(st, val) SKM_sk_find_ex(CMS_CertificateChoices, (st), (val)) +# define sk_CMS_CertificateChoices_delete(st, i) SKM_sk_delete(CMS_CertificateChoices, (st), (i)) +# define sk_CMS_CertificateChoices_delete_ptr(st, ptr) SKM_sk_delete_ptr(CMS_CertificateChoices, (st), (ptr)) +# define sk_CMS_CertificateChoices_insert(st, val, i) SKM_sk_insert(CMS_CertificateChoices, (st), (val), (i)) +# define sk_CMS_CertificateChoices_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CMS_CertificateChoices, (st), (cmp)) +# define sk_CMS_CertificateChoices_dup(st) SKM_sk_dup(CMS_CertificateChoices, st) +# define sk_CMS_CertificateChoices_pop_free(st, free_func) SKM_sk_pop_free(CMS_CertificateChoices, (st), (free_func)) +# define sk_CMS_CertificateChoices_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(CMS_CertificateChoices, (st), (copy_func), (free_func)) +# define sk_CMS_CertificateChoices_shift(st) SKM_sk_shift(CMS_CertificateChoices, (st)) +# define sk_CMS_CertificateChoices_pop(st) SKM_sk_pop(CMS_CertificateChoices, (st)) +# define sk_CMS_CertificateChoices_sort(st) SKM_sk_sort(CMS_CertificateChoices, (st)) +# define sk_CMS_CertificateChoices_is_sorted(st) SKM_sk_is_sorted(CMS_CertificateChoices, (st)) +# define sk_CMS_RecipientEncryptedKey_new(cmp) SKM_sk_new(CMS_RecipientEncryptedKey, (cmp)) +# define sk_CMS_RecipientEncryptedKey_new_null() SKM_sk_new_null(CMS_RecipientEncryptedKey) +# define sk_CMS_RecipientEncryptedKey_free(st) SKM_sk_free(CMS_RecipientEncryptedKey, (st)) +# define sk_CMS_RecipientEncryptedKey_num(st) SKM_sk_num(CMS_RecipientEncryptedKey, (st)) +# define sk_CMS_RecipientEncryptedKey_value(st, i) SKM_sk_value(CMS_RecipientEncryptedKey, (st), (i)) +# define sk_CMS_RecipientEncryptedKey_set(st, i, val) SKM_sk_set(CMS_RecipientEncryptedKey, (st), (i), (val)) +# define sk_CMS_RecipientEncryptedKey_zero(st) SKM_sk_zero(CMS_RecipientEncryptedKey, (st)) +# define sk_CMS_RecipientEncryptedKey_push(st, val) SKM_sk_push(CMS_RecipientEncryptedKey, (st), (val)) +# define sk_CMS_RecipientEncryptedKey_unshift(st, val) SKM_sk_unshift(CMS_RecipientEncryptedKey, (st), (val)) +# define sk_CMS_RecipientEncryptedKey_find(st, val) SKM_sk_find(CMS_RecipientEncryptedKey, (st), (val)) +# define sk_CMS_RecipientEncryptedKey_find_ex(st, val) SKM_sk_find_ex(CMS_RecipientEncryptedKey, (st), (val)) +# define sk_CMS_RecipientEncryptedKey_delete(st, i) SKM_sk_delete(CMS_RecipientEncryptedKey, (st), (i)) +# define sk_CMS_RecipientEncryptedKey_delete_ptr(st, ptr) SKM_sk_delete_ptr(CMS_RecipientEncryptedKey, (st), (ptr)) +# define sk_CMS_RecipientEncryptedKey_insert(st, val, i) SKM_sk_insert(CMS_RecipientEncryptedKey, (st), (val), (i)) +# define sk_CMS_RecipientEncryptedKey_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CMS_RecipientEncryptedKey, (st), (cmp)) +# define sk_CMS_RecipientEncryptedKey_dup(st) SKM_sk_dup(CMS_RecipientEncryptedKey, st) +# define sk_CMS_RecipientEncryptedKey_pop_free(st, free_func) SKM_sk_pop_free(CMS_RecipientEncryptedKey, (st), (free_func)) +# define sk_CMS_RecipientEncryptedKey_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(CMS_RecipientEncryptedKey, (st), (copy_func), (free_func)) +# define sk_CMS_RecipientEncryptedKey_shift(st) SKM_sk_shift(CMS_RecipientEncryptedKey, (st)) +# define sk_CMS_RecipientEncryptedKey_pop(st) SKM_sk_pop(CMS_RecipientEncryptedKey, (st)) +# define sk_CMS_RecipientEncryptedKey_sort(st) SKM_sk_sort(CMS_RecipientEncryptedKey, (st)) +# define sk_CMS_RecipientEncryptedKey_is_sorted(st) SKM_sk_is_sorted(CMS_RecipientEncryptedKey, (st)) +# define sk_CMS_RecipientInfo_new(cmp) SKM_sk_new(CMS_RecipientInfo, (cmp)) +# define sk_CMS_RecipientInfo_new_null() SKM_sk_new_null(CMS_RecipientInfo) +# define sk_CMS_RecipientInfo_free(st) SKM_sk_free(CMS_RecipientInfo, (st)) +# define sk_CMS_RecipientInfo_num(st) SKM_sk_num(CMS_RecipientInfo, (st)) +# define sk_CMS_RecipientInfo_value(st, i) SKM_sk_value(CMS_RecipientInfo, (st), (i)) +# define sk_CMS_RecipientInfo_set(st, i, val) SKM_sk_set(CMS_RecipientInfo, (st), (i), (val)) +# define sk_CMS_RecipientInfo_zero(st) SKM_sk_zero(CMS_RecipientInfo, (st)) +# define sk_CMS_RecipientInfo_push(st, val) SKM_sk_push(CMS_RecipientInfo, (st), (val)) +# define sk_CMS_RecipientInfo_unshift(st, val) SKM_sk_unshift(CMS_RecipientInfo, (st), (val)) +# define sk_CMS_RecipientInfo_find(st, val) SKM_sk_find(CMS_RecipientInfo, (st), (val)) +# define sk_CMS_RecipientInfo_find_ex(st, val) SKM_sk_find_ex(CMS_RecipientInfo, (st), (val)) +# define sk_CMS_RecipientInfo_delete(st, i) SKM_sk_delete(CMS_RecipientInfo, (st), (i)) +# define sk_CMS_RecipientInfo_delete_ptr(st, ptr) SKM_sk_delete_ptr(CMS_RecipientInfo, (st), (ptr)) +# define sk_CMS_RecipientInfo_insert(st, val, i) SKM_sk_insert(CMS_RecipientInfo, (st), (val), (i)) +# define sk_CMS_RecipientInfo_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CMS_RecipientInfo, (st), (cmp)) +# define sk_CMS_RecipientInfo_dup(st) SKM_sk_dup(CMS_RecipientInfo, st) +# define sk_CMS_RecipientInfo_pop_free(st, free_func) SKM_sk_pop_free(CMS_RecipientInfo, (st), (free_func)) +# define sk_CMS_RecipientInfo_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(CMS_RecipientInfo, (st), (copy_func), (free_func)) +# define sk_CMS_RecipientInfo_shift(st) SKM_sk_shift(CMS_RecipientInfo, (st)) +# define sk_CMS_RecipientInfo_pop(st) SKM_sk_pop(CMS_RecipientInfo, (st)) +# define sk_CMS_RecipientInfo_sort(st) SKM_sk_sort(CMS_RecipientInfo, (st)) +# define sk_CMS_RecipientInfo_is_sorted(st) SKM_sk_is_sorted(CMS_RecipientInfo, (st)) +# define sk_CMS_RevocationInfoChoice_new(cmp) SKM_sk_new(CMS_RevocationInfoChoice, (cmp)) +# define sk_CMS_RevocationInfoChoice_new_null() SKM_sk_new_null(CMS_RevocationInfoChoice) +# define sk_CMS_RevocationInfoChoice_free(st) SKM_sk_free(CMS_RevocationInfoChoice, (st)) +# define sk_CMS_RevocationInfoChoice_num(st) SKM_sk_num(CMS_RevocationInfoChoice, (st)) +# define sk_CMS_RevocationInfoChoice_value(st, i) SKM_sk_value(CMS_RevocationInfoChoice, (st), (i)) +# define sk_CMS_RevocationInfoChoice_set(st, i, val) SKM_sk_set(CMS_RevocationInfoChoice, (st), (i), (val)) +# define sk_CMS_RevocationInfoChoice_zero(st) SKM_sk_zero(CMS_RevocationInfoChoice, (st)) +# define sk_CMS_RevocationInfoChoice_push(st, val) SKM_sk_push(CMS_RevocationInfoChoice, (st), (val)) +# define sk_CMS_RevocationInfoChoice_unshift(st, val) SKM_sk_unshift(CMS_RevocationInfoChoice, (st), (val)) +# define sk_CMS_RevocationInfoChoice_find(st, val) SKM_sk_find(CMS_RevocationInfoChoice, (st), (val)) +# define sk_CMS_RevocationInfoChoice_find_ex(st, val) SKM_sk_find_ex(CMS_RevocationInfoChoice, (st), (val)) +# define sk_CMS_RevocationInfoChoice_delete(st, i) SKM_sk_delete(CMS_RevocationInfoChoice, (st), (i)) +# define sk_CMS_RevocationInfoChoice_delete_ptr(st, ptr) SKM_sk_delete_ptr(CMS_RevocationInfoChoice, (st), (ptr)) +# define sk_CMS_RevocationInfoChoice_insert(st, val, i) SKM_sk_insert(CMS_RevocationInfoChoice, (st), (val), (i)) +# define sk_CMS_RevocationInfoChoice_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CMS_RevocationInfoChoice, (st), (cmp)) +# define sk_CMS_RevocationInfoChoice_dup(st) SKM_sk_dup(CMS_RevocationInfoChoice, st) +# define sk_CMS_RevocationInfoChoice_pop_free(st, free_func) SKM_sk_pop_free(CMS_RevocationInfoChoice, (st), (free_func)) +# define sk_CMS_RevocationInfoChoice_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(CMS_RevocationInfoChoice, (st), (copy_func), (free_func)) +# define sk_CMS_RevocationInfoChoice_shift(st) SKM_sk_shift(CMS_RevocationInfoChoice, (st)) +# define sk_CMS_RevocationInfoChoice_pop(st) SKM_sk_pop(CMS_RevocationInfoChoice, (st)) +# define sk_CMS_RevocationInfoChoice_sort(st) SKM_sk_sort(CMS_RevocationInfoChoice, (st)) +# define sk_CMS_RevocationInfoChoice_is_sorted(st) SKM_sk_is_sorted(CMS_RevocationInfoChoice, (st)) +# define sk_CMS_SignerInfo_new(cmp) SKM_sk_new(CMS_SignerInfo, (cmp)) +# define sk_CMS_SignerInfo_new_null() SKM_sk_new_null(CMS_SignerInfo) +# define sk_CMS_SignerInfo_free(st) SKM_sk_free(CMS_SignerInfo, (st)) +# define sk_CMS_SignerInfo_num(st) SKM_sk_num(CMS_SignerInfo, (st)) +# define sk_CMS_SignerInfo_value(st, i) SKM_sk_value(CMS_SignerInfo, (st), (i)) +# define sk_CMS_SignerInfo_set(st, i, val) SKM_sk_set(CMS_SignerInfo, (st), (i), (val)) +# define sk_CMS_SignerInfo_zero(st) SKM_sk_zero(CMS_SignerInfo, (st)) +# define sk_CMS_SignerInfo_push(st, val) SKM_sk_push(CMS_SignerInfo, (st), (val)) +# define sk_CMS_SignerInfo_unshift(st, val) SKM_sk_unshift(CMS_SignerInfo, (st), (val)) +# define sk_CMS_SignerInfo_find(st, val) SKM_sk_find(CMS_SignerInfo, (st), (val)) +# define sk_CMS_SignerInfo_find_ex(st, val) SKM_sk_find_ex(CMS_SignerInfo, (st), (val)) +# define sk_CMS_SignerInfo_delete(st, i) SKM_sk_delete(CMS_SignerInfo, (st), (i)) +# define sk_CMS_SignerInfo_delete_ptr(st, ptr) SKM_sk_delete_ptr(CMS_SignerInfo, (st), (ptr)) +# define sk_CMS_SignerInfo_insert(st, val, i) SKM_sk_insert(CMS_SignerInfo, (st), (val), (i)) +# define sk_CMS_SignerInfo_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CMS_SignerInfo, (st), (cmp)) +# define sk_CMS_SignerInfo_dup(st) SKM_sk_dup(CMS_SignerInfo, st) +# define sk_CMS_SignerInfo_pop_free(st, free_func) SKM_sk_pop_free(CMS_SignerInfo, (st), (free_func)) +# define sk_CMS_SignerInfo_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(CMS_SignerInfo, (st), (copy_func), (free_func)) +# define sk_CMS_SignerInfo_shift(st) SKM_sk_shift(CMS_SignerInfo, (st)) +# define sk_CMS_SignerInfo_pop(st) SKM_sk_pop(CMS_SignerInfo, (st)) +# define sk_CMS_SignerInfo_sort(st) SKM_sk_sort(CMS_SignerInfo, (st)) +# define sk_CMS_SignerInfo_is_sorted(st) SKM_sk_is_sorted(CMS_SignerInfo, (st)) +# define sk_CONF_IMODULE_new(cmp) SKM_sk_new(CONF_IMODULE, (cmp)) +# define sk_CONF_IMODULE_new_null() SKM_sk_new_null(CONF_IMODULE) +# define sk_CONF_IMODULE_free(st) SKM_sk_free(CONF_IMODULE, (st)) +# define sk_CONF_IMODULE_num(st) SKM_sk_num(CONF_IMODULE, (st)) +# define sk_CONF_IMODULE_value(st, i) SKM_sk_value(CONF_IMODULE, (st), (i)) +# define sk_CONF_IMODULE_set(st, i, val) SKM_sk_set(CONF_IMODULE, (st), (i), (val)) +# define sk_CONF_IMODULE_zero(st) SKM_sk_zero(CONF_IMODULE, (st)) +# define sk_CONF_IMODULE_push(st, val) SKM_sk_push(CONF_IMODULE, (st), (val)) +# define sk_CONF_IMODULE_unshift(st, val) SKM_sk_unshift(CONF_IMODULE, (st), (val)) +# define sk_CONF_IMODULE_find(st, val) SKM_sk_find(CONF_IMODULE, (st), (val)) +# define sk_CONF_IMODULE_find_ex(st, val) SKM_sk_find_ex(CONF_IMODULE, (st), (val)) +# define sk_CONF_IMODULE_delete(st, i) SKM_sk_delete(CONF_IMODULE, (st), (i)) +# define sk_CONF_IMODULE_delete_ptr(st, ptr) SKM_sk_delete_ptr(CONF_IMODULE, (st), (ptr)) +# define sk_CONF_IMODULE_insert(st, val, i) SKM_sk_insert(CONF_IMODULE, (st), (val), (i)) +# define sk_CONF_IMODULE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CONF_IMODULE, (st), (cmp)) +# define sk_CONF_IMODULE_dup(st) SKM_sk_dup(CONF_IMODULE, st) +# define sk_CONF_IMODULE_pop_free(st, free_func) SKM_sk_pop_free(CONF_IMODULE, (st), (free_func)) +# define sk_CONF_IMODULE_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(CONF_IMODULE, (st), (copy_func), (free_func)) +# define sk_CONF_IMODULE_shift(st) SKM_sk_shift(CONF_IMODULE, (st)) +# define sk_CONF_IMODULE_pop(st) SKM_sk_pop(CONF_IMODULE, (st)) +# define sk_CONF_IMODULE_sort(st) SKM_sk_sort(CONF_IMODULE, (st)) +# define sk_CONF_IMODULE_is_sorted(st) SKM_sk_is_sorted(CONF_IMODULE, (st)) +# define sk_CONF_MODULE_new(cmp) SKM_sk_new(CONF_MODULE, (cmp)) +# define sk_CONF_MODULE_new_null() SKM_sk_new_null(CONF_MODULE) +# define sk_CONF_MODULE_free(st) SKM_sk_free(CONF_MODULE, (st)) +# define sk_CONF_MODULE_num(st) SKM_sk_num(CONF_MODULE, (st)) +# define sk_CONF_MODULE_value(st, i) SKM_sk_value(CONF_MODULE, (st), (i)) +# define sk_CONF_MODULE_set(st, i, val) SKM_sk_set(CONF_MODULE, (st), (i), (val)) +# define sk_CONF_MODULE_zero(st) SKM_sk_zero(CONF_MODULE, (st)) +# define sk_CONF_MODULE_push(st, val) SKM_sk_push(CONF_MODULE, (st), (val)) +# define sk_CONF_MODULE_unshift(st, val) SKM_sk_unshift(CONF_MODULE, (st), (val)) +# define sk_CONF_MODULE_find(st, val) SKM_sk_find(CONF_MODULE, (st), (val)) +# define sk_CONF_MODULE_find_ex(st, val) SKM_sk_find_ex(CONF_MODULE, (st), (val)) +# define sk_CONF_MODULE_delete(st, i) SKM_sk_delete(CONF_MODULE, (st), (i)) +# define sk_CONF_MODULE_delete_ptr(st, ptr) SKM_sk_delete_ptr(CONF_MODULE, (st), (ptr)) +# define sk_CONF_MODULE_insert(st, val, i) SKM_sk_insert(CONF_MODULE, (st), (val), (i)) +# define sk_CONF_MODULE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CONF_MODULE, (st), (cmp)) +# define sk_CONF_MODULE_dup(st) SKM_sk_dup(CONF_MODULE, st) +# define sk_CONF_MODULE_pop_free(st, free_func) SKM_sk_pop_free(CONF_MODULE, (st), (free_func)) +# define sk_CONF_MODULE_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(CONF_MODULE, (st), (copy_func), (free_func)) +# define sk_CONF_MODULE_shift(st) SKM_sk_shift(CONF_MODULE, (st)) +# define sk_CONF_MODULE_pop(st) SKM_sk_pop(CONF_MODULE, (st)) +# define sk_CONF_MODULE_sort(st) SKM_sk_sort(CONF_MODULE, (st)) +# define sk_CONF_MODULE_is_sorted(st) SKM_sk_is_sorted(CONF_MODULE, (st)) +# define sk_CONF_VALUE_new(cmp) SKM_sk_new(CONF_VALUE, (cmp)) +# define sk_CONF_VALUE_new_null() SKM_sk_new_null(CONF_VALUE) +# define sk_CONF_VALUE_free(st) SKM_sk_free(CONF_VALUE, (st)) +# define sk_CONF_VALUE_num(st) SKM_sk_num(CONF_VALUE, (st)) +# define sk_CONF_VALUE_value(st, i) SKM_sk_value(CONF_VALUE, (st), (i)) +# define sk_CONF_VALUE_set(st, i, val) SKM_sk_set(CONF_VALUE, (st), (i), (val)) +# define sk_CONF_VALUE_zero(st) SKM_sk_zero(CONF_VALUE, (st)) +# define sk_CONF_VALUE_push(st, val) SKM_sk_push(CONF_VALUE, (st), (val)) +# define sk_CONF_VALUE_unshift(st, val) SKM_sk_unshift(CONF_VALUE, (st), (val)) +# define sk_CONF_VALUE_find(st, val) SKM_sk_find(CONF_VALUE, (st), (val)) +# define sk_CONF_VALUE_find_ex(st, val) SKM_sk_find_ex(CONF_VALUE, (st), (val)) +# define sk_CONF_VALUE_delete(st, i) SKM_sk_delete(CONF_VALUE, (st), (i)) +# define sk_CONF_VALUE_delete_ptr(st, ptr) SKM_sk_delete_ptr(CONF_VALUE, (st), (ptr)) +# define sk_CONF_VALUE_insert(st, val, i) SKM_sk_insert(CONF_VALUE, (st), (val), (i)) +# define sk_CONF_VALUE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CONF_VALUE, (st), (cmp)) +# define sk_CONF_VALUE_dup(st) SKM_sk_dup(CONF_VALUE, st) +# define sk_CONF_VALUE_pop_free(st, free_func) SKM_sk_pop_free(CONF_VALUE, (st), (free_func)) +# define sk_CONF_VALUE_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(CONF_VALUE, (st), (copy_func), (free_func)) +# define sk_CONF_VALUE_shift(st) SKM_sk_shift(CONF_VALUE, (st)) +# define sk_CONF_VALUE_pop(st) SKM_sk_pop(CONF_VALUE, (st)) +# define sk_CONF_VALUE_sort(st) SKM_sk_sort(CONF_VALUE, (st)) +# define sk_CONF_VALUE_is_sorted(st) SKM_sk_is_sorted(CONF_VALUE, (st)) +# define sk_CRYPTO_EX_DATA_FUNCS_new(cmp) SKM_sk_new(CRYPTO_EX_DATA_FUNCS, (cmp)) +# define sk_CRYPTO_EX_DATA_FUNCS_new_null() SKM_sk_new_null(CRYPTO_EX_DATA_FUNCS) +# define sk_CRYPTO_EX_DATA_FUNCS_free(st) SKM_sk_free(CRYPTO_EX_DATA_FUNCS, (st)) +# define sk_CRYPTO_EX_DATA_FUNCS_num(st) SKM_sk_num(CRYPTO_EX_DATA_FUNCS, (st)) +# define sk_CRYPTO_EX_DATA_FUNCS_value(st, i) SKM_sk_value(CRYPTO_EX_DATA_FUNCS, (st), (i)) +# define sk_CRYPTO_EX_DATA_FUNCS_set(st, i, val) SKM_sk_set(CRYPTO_EX_DATA_FUNCS, (st), (i), (val)) +# define sk_CRYPTO_EX_DATA_FUNCS_zero(st) SKM_sk_zero(CRYPTO_EX_DATA_FUNCS, (st)) +# define sk_CRYPTO_EX_DATA_FUNCS_push(st, val) SKM_sk_push(CRYPTO_EX_DATA_FUNCS, (st), (val)) +# define sk_CRYPTO_EX_DATA_FUNCS_unshift(st, val) SKM_sk_unshift(CRYPTO_EX_DATA_FUNCS, (st), (val)) +# define sk_CRYPTO_EX_DATA_FUNCS_find(st, val) SKM_sk_find(CRYPTO_EX_DATA_FUNCS, (st), (val)) +# define sk_CRYPTO_EX_DATA_FUNCS_find_ex(st, val) SKM_sk_find_ex(CRYPTO_EX_DATA_FUNCS, (st), (val)) +# define sk_CRYPTO_EX_DATA_FUNCS_delete(st, i) SKM_sk_delete(CRYPTO_EX_DATA_FUNCS, (st), (i)) +# define sk_CRYPTO_EX_DATA_FUNCS_delete_ptr(st, ptr) SKM_sk_delete_ptr(CRYPTO_EX_DATA_FUNCS, (st), (ptr)) +# define sk_CRYPTO_EX_DATA_FUNCS_insert(st, val, i) SKM_sk_insert(CRYPTO_EX_DATA_FUNCS, (st), (val), (i)) +# define sk_CRYPTO_EX_DATA_FUNCS_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CRYPTO_EX_DATA_FUNCS, (st), (cmp)) +# define sk_CRYPTO_EX_DATA_FUNCS_dup(st) SKM_sk_dup(CRYPTO_EX_DATA_FUNCS, st) +# define sk_CRYPTO_EX_DATA_FUNCS_pop_free(st, free_func) SKM_sk_pop_free(CRYPTO_EX_DATA_FUNCS, (st), (free_func)) +# define sk_CRYPTO_EX_DATA_FUNCS_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(CRYPTO_EX_DATA_FUNCS, (st), (copy_func), (free_func)) +# define sk_CRYPTO_EX_DATA_FUNCS_shift(st) SKM_sk_shift(CRYPTO_EX_DATA_FUNCS, (st)) +# define sk_CRYPTO_EX_DATA_FUNCS_pop(st) SKM_sk_pop(CRYPTO_EX_DATA_FUNCS, (st)) +# define sk_CRYPTO_EX_DATA_FUNCS_sort(st) SKM_sk_sort(CRYPTO_EX_DATA_FUNCS, (st)) +# define sk_CRYPTO_EX_DATA_FUNCS_is_sorted(st) SKM_sk_is_sorted(CRYPTO_EX_DATA_FUNCS, (st)) +# define sk_CRYPTO_dynlock_new(cmp) SKM_sk_new(CRYPTO_dynlock, (cmp)) +# define sk_CRYPTO_dynlock_new_null() SKM_sk_new_null(CRYPTO_dynlock) +# define sk_CRYPTO_dynlock_free(st) SKM_sk_free(CRYPTO_dynlock, (st)) +# define sk_CRYPTO_dynlock_num(st) SKM_sk_num(CRYPTO_dynlock, (st)) +# define sk_CRYPTO_dynlock_value(st, i) SKM_sk_value(CRYPTO_dynlock, (st), (i)) +# define sk_CRYPTO_dynlock_set(st, i, val) SKM_sk_set(CRYPTO_dynlock, (st), (i), (val)) +# define sk_CRYPTO_dynlock_zero(st) SKM_sk_zero(CRYPTO_dynlock, (st)) +# define sk_CRYPTO_dynlock_push(st, val) SKM_sk_push(CRYPTO_dynlock, (st), (val)) +# define sk_CRYPTO_dynlock_unshift(st, val) SKM_sk_unshift(CRYPTO_dynlock, (st), (val)) +# define sk_CRYPTO_dynlock_find(st, val) SKM_sk_find(CRYPTO_dynlock, (st), (val)) +# define sk_CRYPTO_dynlock_find_ex(st, val) SKM_sk_find_ex(CRYPTO_dynlock, (st), (val)) +# define sk_CRYPTO_dynlock_delete(st, i) SKM_sk_delete(CRYPTO_dynlock, (st), (i)) +# define sk_CRYPTO_dynlock_delete_ptr(st, ptr) SKM_sk_delete_ptr(CRYPTO_dynlock, (st), (ptr)) +# define sk_CRYPTO_dynlock_insert(st, val, i) SKM_sk_insert(CRYPTO_dynlock, (st), (val), (i)) +# define sk_CRYPTO_dynlock_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CRYPTO_dynlock, (st), (cmp)) +# define sk_CRYPTO_dynlock_dup(st) SKM_sk_dup(CRYPTO_dynlock, st) +# define sk_CRYPTO_dynlock_pop_free(st, free_func) SKM_sk_pop_free(CRYPTO_dynlock, (st), (free_func)) +# define sk_CRYPTO_dynlock_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(CRYPTO_dynlock, (st), (copy_func), (free_func)) +# define sk_CRYPTO_dynlock_shift(st) SKM_sk_shift(CRYPTO_dynlock, (st)) +# define sk_CRYPTO_dynlock_pop(st) SKM_sk_pop(CRYPTO_dynlock, (st)) +# define sk_CRYPTO_dynlock_sort(st) SKM_sk_sort(CRYPTO_dynlock, (st)) +# define sk_CRYPTO_dynlock_is_sorted(st) SKM_sk_is_sorted(CRYPTO_dynlock, (st)) +# define sk_DIST_POINT_new(cmp) SKM_sk_new(DIST_POINT, (cmp)) +# define sk_DIST_POINT_new_null() SKM_sk_new_null(DIST_POINT) +# define sk_DIST_POINT_free(st) SKM_sk_free(DIST_POINT, (st)) +# define sk_DIST_POINT_num(st) SKM_sk_num(DIST_POINT, (st)) +# define sk_DIST_POINT_value(st, i) SKM_sk_value(DIST_POINT, (st), (i)) +# define sk_DIST_POINT_set(st, i, val) SKM_sk_set(DIST_POINT, (st), (i), (val)) +# define sk_DIST_POINT_zero(st) SKM_sk_zero(DIST_POINT, (st)) +# define sk_DIST_POINT_push(st, val) SKM_sk_push(DIST_POINT, (st), (val)) +# define sk_DIST_POINT_unshift(st, val) SKM_sk_unshift(DIST_POINT, (st), (val)) +# define sk_DIST_POINT_find(st, val) SKM_sk_find(DIST_POINT, (st), (val)) +# define sk_DIST_POINT_find_ex(st, val) SKM_sk_find_ex(DIST_POINT, (st), (val)) +# define sk_DIST_POINT_delete(st, i) SKM_sk_delete(DIST_POINT, (st), (i)) +# define sk_DIST_POINT_delete_ptr(st, ptr) SKM_sk_delete_ptr(DIST_POINT, (st), (ptr)) +# define sk_DIST_POINT_insert(st, val, i) SKM_sk_insert(DIST_POINT, (st), (val), (i)) +# define sk_DIST_POINT_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(DIST_POINT, (st), (cmp)) +# define sk_DIST_POINT_dup(st) SKM_sk_dup(DIST_POINT, st) +# define sk_DIST_POINT_pop_free(st, free_func) SKM_sk_pop_free(DIST_POINT, (st), (free_func)) +# define sk_DIST_POINT_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(DIST_POINT, (st), (copy_func), (free_func)) +# define sk_DIST_POINT_shift(st) SKM_sk_shift(DIST_POINT, (st)) +# define sk_DIST_POINT_pop(st) SKM_sk_pop(DIST_POINT, (st)) +# define sk_DIST_POINT_sort(st) SKM_sk_sort(DIST_POINT, (st)) +# define sk_DIST_POINT_is_sorted(st) SKM_sk_is_sorted(DIST_POINT, (st)) +# define sk_ENGINE_new(cmp) SKM_sk_new(ENGINE, (cmp)) +# define sk_ENGINE_new_null() SKM_sk_new_null(ENGINE) +# define sk_ENGINE_free(st) SKM_sk_free(ENGINE, (st)) +# define sk_ENGINE_num(st) SKM_sk_num(ENGINE, (st)) +# define sk_ENGINE_value(st, i) SKM_sk_value(ENGINE, (st), (i)) +# define sk_ENGINE_set(st, i, val) SKM_sk_set(ENGINE, (st), (i), (val)) +# define sk_ENGINE_zero(st) SKM_sk_zero(ENGINE, (st)) +# define sk_ENGINE_push(st, val) SKM_sk_push(ENGINE, (st), (val)) +# define sk_ENGINE_unshift(st, val) SKM_sk_unshift(ENGINE, (st), (val)) +# define sk_ENGINE_find(st, val) SKM_sk_find(ENGINE, (st), (val)) +# define sk_ENGINE_find_ex(st, val) SKM_sk_find_ex(ENGINE, (st), (val)) +# define sk_ENGINE_delete(st, i) SKM_sk_delete(ENGINE, (st), (i)) +# define sk_ENGINE_delete_ptr(st, ptr) SKM_sk_delete_ptr(ENGINE, (st), (ptr)) +# define sk_ENGINE_insert(st, val, i) SKM_sk_insert(ENGINE, (st), (val), (i)) +# define sk_ENGINE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ENGINE, (st), (cmp)) +# define sk_ENGINE_dup(st) SKM_sk_dup(ENGINE, st) +# define sk_ENGINE_pop_free(st, free_func) SKM_sk_pop_free(ENGINE, (st), (free_func)) +# define sk_ENGINE_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(ENGINE, (st), (copy_func), (free_func)) +# define sk_ENGINE_shift(st) SKM_sk_shift(ENGINE, (st)) +# define sk_ENGINE_pop(st) SKM_sk_pop(ENGINE, (st)) +# define sk_ENGINE_sort(st) SKM_sk_sort(ENGINE, (st)) +# define sk_ENGINE_is_sorted(st) SKM_sk_is_sorted(ENGINE, (st)) +# define sk_ENGINE_CLEANUP_ITEM_new(cmp) SKM_sk_new(ENGINE_CLEANUP_ITEM, (cmp)) +# define sk_ENGINE_CLEANUP_ITEM_new_null() SKM_sk_new_null(ENGINE_CLEANUP_ITEM) +# define sk_ENGINE_CLEANUP_ITEM_free(st) SKM_sk_free(ENGINE_CLEANUP_ITEM, (st)) +# define sk_ENGINE_CLEANUP_ITEM_num(st) SKM_sk_num(ENGINE_CLEANUP_ITEM, (st)) +# define sk_ENGINE_CLEANUP_ITEM_value(st, i) SKM_sk_value(ENGINE_CLEANUP_ITEM, (st), (i)) +# define sk_ENGINE_CLEANUP_ITEM_set(st, i, val) SKM_sk_set(ENGINE_CLEANUP_ITEM, (st), (i), (val)) +# define sk_ENGINE_CLEANUP_ITEM_zero(st) SKM_sk_zero(ENGINE_CLEANUP_ITEM, (st)) +# define sk_ENGINE_CLEANUP_ITEM_push(st, val) SKM_sk_push(ENGINE_CLEANUP_ITEM, (st), (val)) +# define sk_ENGINE_CLEANUP_ITEM_unshift(st, val) SKM_sk_unshift(ENGINE_CLEANUP_ITEM, (st), (val)) +# define sk_ENGINE_CLEANUP_ITEM_find(st, val) SKM_sk_find(ENGINE_CLEANUP_ITEM, (st), (val)) +# define sk_ENGINE_CLEANUP_ITEM_find_ex(st, val) SKM_sk_find_ex(ENGINE_CLEANUP_ITEM, (st), (val)) +# define sk_ENGINE_CLEANUP_ITEM_delete(st, i) SKM_sk_delete(ENGINE_CLEANUP_ITEM, (st), (i)) +# define sk_ENGINE_CLEANUP_ITEM_delete_ptr(st, ptr) SKM_sk_delete_ptr(ENGINE_CLEANUP_ITEM, (st), (ptr)) +# define sk_ENGINE_CLEANUP_ITEM_insert(st, val, i) SKM_sk_insert(ENGINE_CLEANUP_ITEM, (st), (val), (i)) +# define sk_ENGINE_CLEANUP_ITEM_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ENGINE_CLEANUP_ITEM, (st), (cmp)) +# define sk_ENGINE_CLEANUP_ITEM_dup(st) SKM_sk_dup(ENGINE_CLEANUP_ITEM, st) +# define sk_ENGINE_CLEANUP_ITEM_pop_free(st, free_func) SKM_sk_pop_free(ENGINE_CLEANUP_ITEM, (st), (free_func)) +# define sk_ENGINE_CLEANUP_ITEM_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(ENGINE_CLEANUP_ITEM, (st), (copy_func), (free_func)) +# define sk_ENGINE_CLEANUP_ITEM_shift(st) SKM_sk_shift(ENGINE_CLEANUP_ITEM, (st)) +# define sk_ENGINE_CLEANUP_ITEM_pop(st) SKM_sk_pop(ENGINE_CLEANUP_ITEM, (st)) +# define sk_ENGINE_CLEANUP_ITEM_sort(st) SKM_sk_sort(ENGINE_CLEANUP_ITEM, (st)) +# define sk_ENGINE_CLEANUP_ITEM_is_sorted(st) SKM_sk_is_sorted(ENGINE_CLEANUP_ITEM, (st)) +# define sk_ESS_CERT_ID_new(cmp) SKM_sk_new(ESS_CERT_ID, (cmp)) +# define sk_ESS_CERT_ID_new_null() SKM_sk_new_null(ESS_CERT_ID) +# define sk_ESS_CERT_ID_free(st) SKM_sk_free(ESS_CERT_ID, (st)) +# define sk_ESS_CERT_ID_num(st) SKM_sk_num(ESS_CERT_ID, (st)) +# define sk_ESS_CERT_ID_value(st, i) SKM_sk_value(ESS_CERT_ID, (st), (i)) +# define sk_ESS_CERT_ID_set(st, i, val) SKM_sk_set(ESS_CERT_ID, (st), (i), (val)) +# define sk_ESS_CERT_ID_zero(st) SKM_sk_zero(ESS_CERT_ID, (st)) +# define sk_ESS_CERT_ID_push(st, val) SKM_sk_push(ESS_CERT_ID, (st), (val)) +# define sk_ESS_CERT_ID_unshift(st, val) SKM_sk_unshift(ESS_CERT_ID, (st), (val)) +# define sk_ESS_CERT_ID_find(st, val) SKM_sk_find(ESS_CERT_ID, (st), (val)) +# define sk_ESS_CERT_ID_find_ex(st, val) SKM_sk_find_ex(ESS_CERT_ID, (st), (val)) +# define sk_ESS_CERT_ID_delete(st, i) SKM_sk_delete(ESS_CERT_ID, (st), (i)) +# define sk_ESS_CERT_ID_delete_ptr(st, ptr) SKM_sk_delete_ptr(ESS_CERT_ID, (st), (ptr)) +# define sk_ESS_CERT_ID_insert(st, val, i) SKM_sk_insert(ESS_CERT_ID, (st), (val), (i)) +# define sk_ESS_CERT_ID_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ESS_CERT_ID, (st), (cmp)) +# define sk_ESS_CERT_ID_dup(st) SKM_sk_dup(ESS_CERT_ID, st) +# define sk_ESS_CERT_ID_pop_free(st, free_func) SKM_sk_pop_free(ESS_CERT_ID, (st), (free_func)) +# define sk_ESS_CERT_ID_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(ESS_CERT_ID, (st), (copy_func), (free_func)) +# define sk_ESS_CERT_ID_shift(st) SKM_sk_shift(ESS_CERT_ID, (st)) +# define sk_ESS_CERT_ID_pop(st) SKM_sk_pop(ESS_CERT_ID, (st)) +# define sk_ESS_CERT_ID_sort(st) SKM_sk_sort(ESS_CERT_ID, (st)) +# define sk_ESS_CERT_ID_is_sorted(st) SKM_sk_is_sorted(ESS_CERT_ID, (st)) +# define sk_EVP_MD_new(cmp) SKM_sk_new(EVP_MD, (cmp)) +# define sk_EVP_MD_new_null() SKM_sk_new_null(EVP_MD) +# define sk_EVP_MD_free(st) SKM_sk_free(EVP_MD, (st)) +# define sk_EVP_MD_num(st) SKM_sk_num(EVP_MD, (st)) +# define sk_EVP_MD_value(st, i) SKM_sk_value(EVP_MD, (st), (i)) +# define sk_EVP_MD_set(st, i, val) SKM_sk_set(EVP_MD, (st), (i), (val)) +# define sk_EVP_MD_zero(st) SKM_sk_zero(EVP_MD, (st)) +# define sk_EVP_MD_push(st, val) SKM_sk_push(EVP_MD, (st), (val)) +# define sk_EVP_MD_unshift(st, val) SKM_sk_unshift(EVP_MD, (st), (val)) +# define sk_EVP_MD_find(st, val) SKM_sk_find(EVP_MD, (st), (val)) +# define sk_EVP_MD_find_ex(st, val) SKM_sk_find_ex(EVP_MD, (st), (val)) +# define sk_EVP_MD_delete(st, i) SKM_sk_delete(EVP_MD, (st), (i)) +# define sk_EVP_MD_delete_ptr(st, ptr) SKM_sk_delete_ptr(EVP_MD, (st), (ptr)) +# define sk_EVP_MD_insert(st, val, i) SKM_sk_insert(EVP_MD, (st), (val), (i)) +# define sk_EVP_MD_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(EVP_MD, (st), (cmp)) +# define sk_EVP_MD_dup(st) SKM_sk_dup(EVP_MD, st) +# define sk_EVP_MD_pop_free(st, free_func) SKM_sk_pop_free(EVP_MD, (st), (free_func)) +# define sk_EVP_MD_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(EVP_MD, (st), (copy_func), (free_func)) +# define sk_EVP_MD_shift(st) SKM_sk_shift(EVP_MD, (st)) +# define sk_EVP_MD_pop(st) SKM_sk_pop(EVP_MD, (st)) +# define sk_EVP_MD_sort(st) SKM_sk_sort(EVP_MD, (st)) +# define sk_EVP_MD_is_sorted(st) SKM_sk_is_sorted(EVP_MD, (st)) +# define sk_EVP_PBE_CTL_new(cmp) SKM_sk_new(EVP_PBE_CTL, (cmp)) +# define sk_EVP_PBE_CTL_new_null() SKM_sk_new_null(EVP_PBE_CTL) +# define sk_EVP_PBE_CTL_free(st) SKM_sk_free(EVP_PBE_CTL, (st)) +# define sk_EVP_PBE_CTL_num(st) SKM_sk_num(EVP_PBE_CTL, (st)) +# define sk_EVP_PBE_CTL_value(st, i) SKM_sk_value(EVP_PBE_CTL, (st), (i)) +# define sk_EVP_PBE_CTL_set(st, i, val) SKM_sk_set(EVP_PBE_CTL, (st), (i), (val)) +# define sk_EVP_PBE_CTL_zero(st) SKM_sk_zero(EVP_PBE_CTL, (st)) +# define sk_EVP_PBE_CTL_push(st, val) SKM_sk_push(EVP_PBE_CTL, (st), (val)) +# define sk_EVP_PBE_CTL_unshift(st, val) SKM_sk_unshift(EVP_PBE_CTL, (st), (val)) +# define sk_EVP_PBE_CTL_find(st, val) SKM_sk_find(EVP_PBE_CTL, (st), (val)) +# define sk_EVP_PBE_CTL_find_ex(st, val) SKM_sk_find_ex(EVP_PBE_CTL, (st), (val)) +# define sk_EVP_PBE_CTL_delete(st, i) SKM_sk_delete(EVP_PBE_CTL, (st), (i)) +# define sk_EVP_PBE_CTL_delete_ptr(st, ptr) SKM_sk_delete_ptr(EVP_PBE_CTL, (st), (ptr)) +# define sk_EVP_PBE_CTL_insert(st, val, i) SKM_sk_insert(EVP_PBE_CTL, (st), (val), (i)) +# define sk_EVP_PBE_CTL_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(EVP_PBE_CTL, (st), (cmp)) +# define sk_EVP_PBE_CTL_dup(st) SKM_sk_dup(EVP_PBE_CTL, st) +# define sk_EVP_PBE_CTL_pop_free(st, free_func) SKM_sk_pop_free(EVP_PBE_CTL, (st), (free_func)) +# define sk_EVP_PBE_CTL_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(EVP_PBE_CTL, (st), (copy_func), (free_func)) +# define sk_EVP_PBE_CTL_shift(st) SKM_sk_shift(EVP_PBE_CTL, (st)) +# define sk_EVP_PBE_CTL_pop(st) SKM_sk_pop(EVP_PBE_CTL, (st)) +# define sk_EVP_PBE_CTL_sort(st) SKM_sk_sort(EVP_PBE_CTL, (st)) +# define sk_EVP_PBE_CTL_is_sorted(st) SKM_sk_is_sorted(EVP_PBE_CTL, (st)) +# define sk_EVP_PKEY_ASN1_METHOD_new(cmp) SKM_sk_new(EVP_PKEY_ASN1_METHOD, (cmp)) +# define sk_EVP_PKEY_ASN1_METHOD_new_null() SKM_sk_new_null(EVP_PKEY_ASN1_METHOD) +# define sk_EVP_PKEY_ASN1_METHOD_free(st) SKM_sk_free(EVP_PKEY_ASN1_METHOD, (st)) +# define sk_EVP_PKEY_ASN1_METHOD_num(st) SKM_sk_num(EVP_PKEY_ASN1_METHOD, (st)) +# define sk_EVP_PKEY_ASN1_METHOD_value(st, i) SKM_sk_value(EVP_PKEY_ASN1_METHOD, (st), (i)) +# define sk_EVP_PKEY_ASN1_METHOD_set(st, i, val) SKM_sk_set(EVP_PKEY_ASN1_METHOD, (st), (i), (val)) +# define sk_EVP_PKEY_ASN1_METHOD_zero(st) SKM_sk_zero(EVP_PKEY_ASN1_METHOD, (st)) +# define sk_EVP_PKEY_ASN1_METHOD_push(st, val) SKM_sk_push(EVP_PKEY_ASN1_METHOD, (st), (val)) +# define sk_EVP_PKEY_ASN1_METHOD_unshift(st, val) SKM_sk_unshift(EVP_PKEY_ASN1_METHOD, (st), (val)) +# define sk_EVP_PKEY_ASN1_METHOD_find(st, val) SKM_sk_find(EVP_PKEY_ASN1_METHOD, (st), (val)) +# define sk_EVP_PKEY_ASN1_METHOD_find_ex(st, val) SKM_sk_find_ex(EVP_PKEY_ASN1_METHOD, (st), (val)) +# define sk_EVP_PKEY_ASN1_METHOD_delete(st, i) SKM_sk_delete(EVP_PKEY_ASN1_METHOD, (st), (i)) +# define sk_EVP_PKEY_ASN1_METHOD_delete_ptr(st, ptr) SKM_sk_delete_ptr(EVP_PKEY_ASN1_METHOD, (st), (ptr)) +# define sk_EVP_PKEY_ASN1_METHOD_insert(st, val, i) SKM_sk_insert(EVP_PKEY_ASN1_METHOD, (st), (val), (i)) +# define sk_EVP_PKEY_ASN1_METHOD_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(EVP_PKEY_ASN1_METHOD, (st), (cmp)) +# define sk_EVP_PKEY_ASN1_METHOD_dup(st) SKM_sk_dup(EVP_PKEY_ASN1_METHOD, st) +# define sk_EVP_PKEY_ASN1_METHOD_pop_free(st, free_func) SKM_sk_pop_free(EVP_PKEY_ASN1_METHOD, (st), (free_func)) +# define sk_EVP_PKEY_ASN1_METHOD_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(EVP_PKEY_ASN1_METHOD, (st), (copy_func), (free_func)) +# define sk_EVP_PKEY_ASN1_METHOD_shift(st) SKM_sk_shift(EVP_PKEY_ASN1_METHOD, (st)) +# define sk_EVP_PKEY_ASN1_METHOD_pop(st) SKM_sk_pop(EVP_PKEY_ASN1_METHOD, (st)) +# define sk_EVP_PKEY_ASN1_METHOD_sort(st) SKM_sk_sort(EVP_PKEY_ASN1_METHOD, (st)) +# define sk_EVP_PKEY_ASN1_METHOD_is_sorted(st) SKM_sk_is_sorted(EVP_PKEY_ASN1_METHOD, (st)) +# define sk_EVP_PKEY_METHOD_new(cmp) SKM_sk_new(EVP_PKEY_METHOD, (cmp)) +# define sk_EVP_PKEY_METHOD_new_null() SKM_sk_new_null(EVP_PKEY_METHOD) +# define sk_EVP_PKEY_METHOD_free(st) SKM_sk_free(EVP_PKEY_METHOD, (st)) +# define sk_EVP_PKEY_METHOD_num(st) SKM_sk_num(EVP_PKEY_METHOD, (st)) +# define sk_EVP_PKEY_METHOD_value(st, i) SKM_sk_value(EVP_PKEY_METHOD, (st), (i)) +# define sk_EVP_PKEY_METHOD_set(st, i, val) SKM_sk_set(EVP_PKEY_METHOD, (st), (i), (val)) +# define sk_EVP_PKEY_METHOD_zero(st) SKM_sk_zero(EVP_PKEY_METHOD, (st)) +# define sk_EVP_PKEY_METHOD_push(st, val) SKM_sk_push(EVP_PKEY_METHOD, (st), (val)) +# define sk_EVP_PKEY_METHOD_unshift(st, val) SKM_sk_unshift(EVP_PKEY_METHOD, (st), (val)) +# define sk_EVP_PKEY_METHOD_find(st, val) SKM_sk_find(EVP_PKEY_METHOD, (st), (val)) +# define sk_EVP_PKEY_METHOD_find_ex(st, val) SKM_sk_find_ex(EVP_PKEY_METHOD, (st), (val)) +# define sk_EVP_PKEY_METHOD_delete(st, i) SKM_sk_delete(EVP_PKEY_METHOD, (st), (i)) +# define sk_EVP_PKEY_METHOD_delete_ptr(st, ptr) SKM_sk_delete_ptr(EVP_PKEY_METHOD, (st), (ptr)) +# define sk_EVP_PKEY_METHOD_insert(st, val, i) SKM_sk_insert(EVP_PKEY_METHOD, (st), (val), (i)) +# define sk_EVP_PKEY_METHOD_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(EVP_PKEY_METHOD, (st), (cmp)) +# define sk_EVP_PKEY_METHOD_dup(st) SKM_sk_dup(EVP_PKEY_METHOD, st) +# define sk_EVP_PKEY_METHOD_pop_free(st, free_func) SKM_sk_pop_free(EVP_PKEY_METHOD, (st), (free_func)) +# define sk_EVP_PKEY_METHOD_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(EVP_PKEY_METHOD, (st), (copy_func), (free_func)) +# define sk_EVP_PKEY_METHOD_shift(st) SKM_sk_shift(EVP_PKEY_METHOD, (st)) +# define sk_EVP_PKEY_METHOD_pop(st) SKM_sk_pop(EVP_PKEY_METHOD, (st)) +# define sk_EVP_PKEY_METHOD_sort(st) SKM_sk_sort(EVP_PKEY_METHOD, (st)) +# define sk_EVP_PKEY_METHOD_is_sorted(st) SKM_sk_is_sorted(EVP_PKEY_METHOD, (st)) +# define sk_GENERAL_NAME_new(cmp) SKM_sk_new(GENERAL_NAME, (cmp)) +# define sk_GENERAL_NAME_new_null() SKM_sk_new_null(GENERAL_NAME) +# define sk_GENERAL_NAME_free(st) SKM_sk_free(GENERAL_NAME, (st)) +# define sk_GENERAL_NAME_num(st) SKM_sk_num(GENERAL_NAME, (st)) +# define sk_GENERAL_NAME_value(st, i) SKM_sk_value(GENERAL_NAME, (st), (i)) +# define sk_GENERAL_NAME_set(st, i, val) SKM_sk_set(GENERAL_NAME, (st), (i), (val)) +# define sk_GENERAL_NAME_zero(st) SKM_sk_zero(GENERAL_NAME, (st)) +# define sk_GENERAL_NAME_push(st, val) SKM_sk_push(GENERAL_NAME, (st), (val)) +# define sk_GENERAL_NAME_unshift(st, val) SKM_sk_unshift(GENERAL_NAME, (st), (val)) +# define sk_GENERAL_NAME_find(st, val) SKM_sk_find(GENERAL_NAME, (st), (val)) +# define sk_GENERAL_NAME_find_ex(st, val) SKM_sk_find_ex(GENERAL_NAME, (st), (val)) +# define sk_GENERAL_NAME_delete(st, i) SKM_sk_delete(GENERAL_NAME, (st), (i)) +# define sk_GENERAL_NAME_delete_ptr(st, ptr) SKM_sk_delete_ptr(GENERAL_NAME, (st), (ptr)) +# define sk_GENERAL_NAME_insert(st, val, i) SKM_sk_insert(GENERAL_NAME, (st), (val), (i)) +# define sk_GENERAL_NAME_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(GENERAL_NAME, (st), (cmp)) +# define sk_GENERAL_NAME_dup(st) SKM_sk_dup(GENERAL_NAME, st) +# define sk_GENERAL_NAME_pop_free(st, free_func) SKM_sk_pop_free(GENERAL_NAME, (st), (free_func)) +# define sk_GENERAL_NAME_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(GENERAL_NAME, (st), (copy_func), (free_func)) +# define sk_GENERAL_NAME_shift(st) SKM_sk_shift(GENERAL_NAME, (st)) +# define sk_GENERAL_NAME_pop(st) SKM_sk_pop(GENERAL_NAME, (st)) +# define sk_GENERAL_NAME_sort(st) SKM_sk_sort(GENERAL_NAME, (st)) +# define sk_GENERAL_NAME_is_sorted(st) SKM_sk_is_sorted(GENERAL_NAME, (st)) +# define sk_GENERAL_NAMES_new(cmp) SKM_sk_new(GENERAL_NAMES, (cmp)) +# define sk_GENERAL_NAMES_new_null() SKM_sk_new_null(GENERAL_NAMES) +# define sk_GENERAL_NAMES_free(st) SKM_sk_free(GENERAL_NAMES, (st)) +# define sk_GENERAL_NAMES_num(st) SKM_sk_num(GENERAL_NAMES, (st)) +# define sk_GENERAL_NAMES_value(st, i) SKM_sk_value(GENERAL_NAMES, (st), (i)) +# define sk_GENERAL_NAMES_set(st, i, val) SKM_sk_set(GENERAL_NAMES, (st), (i), (val)) +# define sk_GENERAL_NAMES_zero(st) SKM_sk_zero(GENERAL_NAMES, (st)) +# define sk_GENERAL_NAMES_push(st, val) SKM_sk_push(GENERAL_NAMES, (st), (val)) +# define sk_GENERAL_NAMES_unshift(st, val) SKM_sk_unshift(GENERAL_NAMES, (st), (val)) +# define sk_GENERAL_NAMES_find(st, val) SKM_sk_find(GENERAL_NAMES, (st), (val)) +# define sk_GENERAL_NAMES_find_ex(st, val) SKM_sk_find_ex(GENERAL_NAMES, (st), (val)) +# define sk_GENERAL_NAMES_delete(st, i) SKM_sk_delete(GENERAL_NAMES, (st), (i)) +# define sk_GENERAL_NAMES_delete_ptr(st, ptr) SKM_sk_delete_ptr(GENERAL_NAMES, (st), (ptr)) +# define sk_GENERAL_NAMES_insert(st, val, i) SKM_sk_insert(GENERAL_NAMES, (st), (val), (i)) +# define sk_GENERAL_NAMES_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(GENERAL_NAMES, (st), (cmp)) +# define sk_GENERAL_NAMES_dup(st) SKM_sk_dup(GENERAL_NAMES, st) +# define sk_GENERAL_NAMES_pop_free(st, free_func) SKM_sk_pop_free(GENERAL_NAMES, (st), (free_func)) +# define sk_GENERAL_NAMES_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(GENERAL_NAMES, (st), (copy_func), (free_func)) +# define sk_GENERAL_NAMES_shift(st) SKM_sk_shift(GENERAL_NAMES, (st)) +# define sk_GENERAL_NAMES_pop(st) SKM_sk_pop(GENERAL_NAMES, (st)) +# define sk_GENERAL_NAMES_sort(st) SKM_sk_sort(GENERAL_NAMES, (st)) +# define sk_GENERAL_NAMES_is_sorted(st) SKM_sk_is_sorted(GENERAL_NAMES, (st)) +# define sk_GENERAL_SUBTREE_new(cmp) SKM_sk_new(GENERAL_SUBTREE, (cmp)) +# define sk_GENERAL_SUBTREE_new_null() SKM_sk_new_null(GENERAL_SUBTREE) +# define sk_GENERAL_SUBTREE_free(st) SKM_sk_free(GENERAL_SUBTREE, (st)) +# define sk_GENERAL_SUBTREE_num(st) SKM_sk_num(GENERAL_SUBTREE, (st)) +# define sk_GENERAL_SUBTREE_value(st, i) SKM_sk_value(GENERAL_SUBTREE, (st), (i)) +# define sk_GENERAL_SUBTREE_set(st, i, val) SKM_sk_set(GENERAL_SUBTREE, (st), (i), (val)) +# define sk_GENERAL_SUBTREE_zero(st) SKM_sk_zero(GENERAL_SUBTREE, (st)) +# define sk_GENERAL_SUBTREE_push(st, val) SKM_sk_push(GENERAL_SUBTREE, (st), (val)) +# define sk_GENERAL_SUBTREE_unshift(st, val) SKM_sk_unshift(GENERAL_SUBTREE, (st), (val)) +# define sk_GENERAL_SUBTREE_find(st, val) SKM_sk_find(GENERAL_SUBTREE, (st), (val)) +# define sk_GENERAL_SUBTREE_find_ex(st, val) SKM_sk_find_ex(GENERAL_SUBTREE, (st), (val)) +# define sk_GENERAL_SUBTREE_delete(st, i) SKM_sk_delete(GENERAL_SUBTREE, (st), (i)) +# define sk_GENERAL_SUBTREE_delete_ptr(st, ptr) SKM_sk_delete_ptr(GENERAL_SUBTREE, (st), (ptr)) +# define sk_GENERAL_SUBTREE_insert(st, val, i) SKM_sk_insert(GENERAL_SUBTREE, (st), (val), (i)) +# define sk_GENERAL_SUBTREE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(GENERAL_SUBTREE, (st), (cmp)) +# define sk_GENERAL_SUBTREE_dup(st) SKM_sk_dup(GENERAL_SUBTREE, st) +# define sk_GENERAL_SUBTREE_pop_free(st, free_func) SKM_sk_pop_free(GENERAL_SUBTREE, (st), (free_func)) +# define sk_GENERAL_SUBTREE_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(GENERAL_SUBTREE, (st), (copy_func), (free_func)) +# define sk_GENERAL_SUBTREE_shift(st) SKM_sk_shift(GENERAL_SUBTREE, (st)) +# define sk_GENERAL_SUBTREE_pop(st) SKM_sk_pop(GENERAL_SUBTREE, (st)) +# define sk_GENERAL_SUBTREE_sort(st) SKM_sk_sort(GENERAL_SUBTREE, (st)) +# define sk_GENERAL_SUBTREE_is_sorted(st) SKM_sk_is_sorted(GENERAL_SUBTREE, (st)) +# define sk_IPAddressFamily_new(cmp) SKM_sk_new(IPAddressFamily, (cmp)) +# define sk_IPAddressFamily_new_null() SKM_sk_new_null(IPAddressFamily) +# define sk_IPAddressFamily_free(st) SKM_sk_free(IPAddressFamily, (st)) +# define sk_IPAddressFamily_num(st) SKM_sk_num(IPAddressFamily, (st)) +# define sk_IPAddressFamily_value(st, i) SKM_sk_value(IPAddressFamily, (st), (i)) +# define sk_IPAddressFamily_set(st, i, val) SKM_sk_set(IPAddressFamily, (st), (i), (val)) +# define sk_IPAddressFamily_zero(st) SKM_sk_zero(IPAddressFamily, (st)) +# define sk_IPAddressFamily_push(st, val) SKM_sk_push(IPAddressFamily, (st), (val)) +# define sk_IPAddressFamily_unshift(st, val) SKM_sk_unshift(IPAddressFamily, (st), (val)) +# define sk_IPAddressFamily_find(st, val) SKM_sk_find(IPAddressFamily, (st), (val)) +# define sk_IPAddressFamily_find_ex(st, val) SKM_sk_find_ex(IPAddressFamily, (st), (val)) +# define sk_IPAddressFamily_delete(st, i) SKM_sk_delete(IPAddressFamily, (st), (i)) +# define sk_IPAddressFamily_delete_ptr(st, ptr) SKM_sk_delete_ptr(IPAddressFamily, (st), (ptr)) +# define sk_IPAddressFamily_insert(st, val, i) SKM_sk_insert(IPAddressFamily, (st), (val), (i)) +# define sk_IPAddressFamily_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(IPAddressFamily, (st), (cmp)) +# define sk_IPAddressFamily_dup(st) SKM_sk_dup(IPAddressFamily, st) +# define sk_IPAddressFamily_pop_free(st, free_func) SKM_sk_pop_free(IPAddressFamily, (st), (free_func)) +# define sk_IPAddressFamily_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(IPAddressFamily, (st), (copy_func), (free_func)) +# define sk_IPAddressFamily_shift(st) SKM_sk_shift(IPAddressFamily, (st)) +# define sk_IPAddressFamily_pop(st) SKM_sk_pop(IPAddressFamily, (st)) +# define sk_IPAddressFamily_sort(st) SKM_sk_sort(IPAddressFamily, (st)) +# define sk_IPAddressFamily_is_sorted(st) SKM_sk_is_sorted(IPAddressFamily, (st)) +# define sk_IPAddressOrRange_new(cmp) SKM_sk_new(IPAddressOrRange, (cmp)) +# define sk_IPAddressOrRange_new_null() SKM_sk_new_null(IPAddressOrRange) +# define sk_IPAddressOrRange_free(st) SKM_sk_free(IPAddressOrRange, (st)) +# define sk_IPAddressOrRange_num(st) SKM_sk_num(IPAddressOrRange, (st)) +# define sk_IPAddressOrRange_value(st, i) SKM_sk_value(IPAddressOrRange, (st), (i)) +# define sk_IPAddressOrRange_set(st, i, val) SKM_sk_set(IPAddressOrRange, (st), (i), (val)) +# define sk_IPAddressOrRange_zero(st) SKM_sk_zero(IPAddressOrRange, (st)) +# define sk_IPAddressOrRange_push(st, val) SKM_sk_push(IPAddressOrRange, (st), (val)) +# define sk_IPAddressOrRange_unshift(st, val) SKM_sk_unshift(IPAddressOrRange, (st), (val)) +# define sk_IPAddressOrRange_find(st, val) SKM_sk_find(IPAddressOrRange, (st), (val)) +# define sk_IPAddressOrRange_find_ex(st, val) SKM_sk_find_ex(IPAddressOrRange, (st), (val)) +# define sk_IPAddressOrRange_delete(st, i) SKM_sk_delete(IPAddressOrRange, (st), (i)) +# define sk_IPAddressOrRange_delete_ptr(st, ptr) SKM_sk_delete_ptr(IPAddressOrRange, (st), (ptr)) +# define sk_IPAddressOrRange_insert(st, val, i) SKM_sk_insert(IPAddressOrRange, (st), (val), (i)) +# define sk_IPAddressOrRange_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(IPAddressOrRange, (st), (cmp)) +# define sk_IPAddressOrRange_dup(st) SKM_sk_dup(IPAddressOrRange, st) +# define sk_IPAddressOrRange_pop_free(st, free_func) SKM_sk_pop_free(IPAddressOrRange, (st), (free_func)) +# define sk_IPAddressOrRange_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(IPAddressOrRange, (st), (copy_func), (free_func)) +# define sk_IPAddressOrRange_shift(st) SKM_sk_shift(IPAddressOrRange, (st)) +# define sk_IPAddressOrRange_pop(st) SKM_sk_pop(IPAddressOrRange, (st)) +# define sk_IPAddressOrRange_sort(st) SKM_sk_sort(IPAddressOrRange, (st)) +# define sk_IPAddressOrRange_is_sorted(st) SKM_sk_is_sorted(IPAddressOrRange, (st)) +# define sk_KRB5_APREQBODY_new(cmp) SKM_sk_new(KRB5_APREQBODY, (cmp)) +# define sk_KRB5_APREQBODY_new_null() SKM_sk_new_null(KRB5_APREQBODY) +# define sk_KRB5_APREQBODY_free(st) SKM_sk_free(KRB5_APREQBODY, (st)) +# define sk_KRB5_APREQBODY_num(st) SKM_sk_num(KRB5_APREQBODY, (st)) +# define sk_KRB5_APREQBODY_value(st, i) SKM_sk_value(KRB5_APREQBODY, (st), (i)) +# define sk_KRB5_APREQBODY_set(st, i, val) SKM_sk_set(KRB5_APREQBODY, (st), (i), (val)) +# define sk_KRB5_APREQBODY_zero(st) SKM_sk_zero(KRB5_APREQBODY, (st)) +# define sk_KRB5_APREQBODY_push(st, val) SKM_sk_push(KRB5_APREQBODY, (st), (val)) +# define sk_KRB5_APREQBODY_unshift(st, val) SKM_sk_unshift(KRB5_APREQBODY, (st), (val)) +# define sk_KRB5_APREQBODY_find(st, val) SKM_sk_find(KRB5_APREQBODY, (st), (val)) +# define sk_KRB5_APREQBODY_find_ex(st, val) SKM_sk_find_ex(KRB5_APREQBODY, (st), (val)) +# define sk_KRB5_APREQBODY_delete(st, i) SKM_sk_delete(KRB5_APREQBODY, (st), (i)) +# define sk_KRB5_APREQBODY_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_APREQBODY, (st), (ptr)) +# define sk_KRB5_APREQBODY_insert(st, val, i) SKM_sk_insert(KRB5_APREQBODY, (st), (val), (i)) +# define sk_KRB5_APREQBODY_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_APREQBODY, (st), (cmp)) +# define sk_KRB5_APREQBODY_dup(st) SKM_sk_dup(KRB5_APREQBODY, st) +# define sk_KRB5_APREQBODY_pop_free(st, free_func) SKM_sk_pop_free(KRB5_APREQBODY, (st), (free_func)) +# define sk_KRB5_APREQBODY_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(KRB5_APREQBODY, (st), (copy_func), (free_func)) +# define sk_KRB5_APREQBODY_shift(st) SKM_sk_shift(KRB5_APREQBODY, (st)) +# define sk_KRB5_APREQBODY_pop(st) SKM_sk_pop(KRB5_APREQBODY, (st)) +# define sk_KRB5_APREQBODY_sort(st) SKM_sk_sort(KRB5_APREQBODY, (st)) +# define sk_KRB5_APREQBODY_is_sorted(st) SKM_sk_is_sorted(KRB5_APREQBODY, (st)) +# define sk_KRB5_AUTHDATA_new(cmp) SKM_sk_new(KRB5_AUTHDATA, (cmp)) +# define sk_KRB5_AUTHDATA_new_null() SKM_sk_new_null(KRB5_AUTHDATA) +# define sk_KRB5_AUTHDATA_free(st) SKM_sk_free(KRB5_AUTHDATA, (st)) +# define sk_KRB5_AUTHDATA_num(st) SKM_sk_num(KRB5_AUTHDATA, (st)) +# define sk_KRB5_AUTHDATA_value(st, i) SKM_sk_value(KRB5_AUTHDATA, (st), (i)) +# define sk_KRB5_AUTHDATA_set(st, i, val) SKM_sk_set(KRB5_AUTHDATA, (st), (i), (val)) +# define sk_KRB5_AUTHDATA_zero(st) SKM_sk_zero(KRB5_AUTHDATA, (st)) +# define sk_KRB5_AUTHDATA_push(st, val) SKM_sk_push(KRB5_AUTHDATA, (st), (val)) +# define sk_KRB5_AUTHDATA_unshift(st, val) SKM_sk_unshift(KRB5_AUTHDATA, (st), (val)) +# define sk_KRB5_AUTHDATA_find(st, val) SKM_sk_find(KRB5_AUTHDATA, (st), (val)) +# define sk_KRB5_AUTHDATA_find_ex(st, val) SKM_sk_find_ex(KRB5_AUTHDATA, (st), (val)) +# define sk_KRB5_AUTHDATA_delete(st, i) SKM_sk_delete(KRB5_AUTHDATA, (st), (i)) +# define sk_KRB5_AUTHDATA_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_AUTHDATA, (st), (ptr)) +# define sk_KRB5_AUTHDATA_insert(st, val, i) SKM_sk_insert(KRB5_AUTHDATA, (st), (val), (i)) +# define sk_KRB5_AUTHDATA_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_AUTHDATA, (st), (cmp)) +# define sk_KRB5_AUTHDATA_dup(st) SKM_sk_dup(KRB5_AUTHDATA, st) +# define sk_KRB5_AUTHDATA_pop_free(st, free_func) SKM_sk_pop_free(KRB5_AUTHDATA, (st), (free_func)) +# define sk_KRB5_AUTHDATA_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(KRB5_AUTHDATA, (st), (copy_func), (free_func)) +# define sk_KRB5_AUTHDATA_shift(st) SKM_sk_shift(KRB5_AUTHDATA, (st)) +# define sk_KRB5_AUTHDATA_pop(st) SKM_sk_pop(KRB5_AUTHDATA, (st)) +# define sk_KRB5_AUTHDATA_sort(st) SKM_sk_sort(KRB5_AUTHDATA, (st)) +# define sk_KRB5_AUTHDATA_is_sorted(st) SKM_sk_is_sorted(KRB5_AUTHDATA, (st)) +# define sk_KRB5_AUTHENTBODY_new(cmp) SKM_sk_new(KRB5_AUTHENTBODY, (cmp)) +# define sk_KRB5_AUTHENTBODY_new_null() SKM_sk_new_null(KRB5_AUTHENTBODY) +# define sk_KRB5_AUTHENTBODY_free(st) SKM_sk_free(KRB5_AUTHENTBODY, (st)) +# define sk_KRB5_AUTHENTBODY_num(st) SKM_sk_num(KRB5_AUTHENTBODY, (st)) +# define sk_KRB5_AUTHENTBODY_value(st, i) SKM_sk_value(KRB5_AUTHENTBODY, (st), (i)) +# define sk_KRB5_AUTHENTBODY_set(st, i, val) SKM_sk_set(KRB5_AUTHENTBODY, (st), (i), (val)) +# define sk_KRB5_AUTHENTBODY_zero(st) SKM_sk_zero(KRB5_AUTHENTBODY, (st)) +# define sk_KRB5_AUTHENTBODY_push(st, val) SKM_sk_push(KRB5_AUTHENTBODY, (st), (val)) +# define sk_KRB5_AUTHENTBODY_unshift(st, val) SKM_sk_unshift(KRB5_AUTHENTBODY, (st), (val)) +# define sk_KRB5_AUTHENTBODY_find(st, val) SKM_sk_find(KRB5_AUTHENTBODY, (st), (val)) +# define sk_KRB5_AUTHENTBODY_find_ex(st, val) SKM_sk_find_ex(KRB5_AUTHENTBODY, (st), (val)) +# define sk_KRB5_AUTHENTBODY_delete(st, i) SKM_sk_delete(KRB5_AUTHENTBODY, (st), (i)) +# define sk_KRB5_AUTHENTBODY_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_AUTHENTBODY, (st), (ptr)) +# define sk_KRB5_AUTHENTBODY_insert(st, val, i) SKM_sk_insert(KRB5_AUTHENTBODY, (st), (val), (i)) +# define sk_KRB5_AUTHENTBODY_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_AUTHENTBODY, (st), (cmp)) +# define sk_KRB5_AUTHENTBODY_dup(st) SKM_sk_dup(KRB5_AUTHENTBODY, st) +# define sk_KRB5_AUTHENTBODY_pop_free(st, free_func) SKM_sk_pop_free(KRB5_AUTHENTBODY, (st), (free_func)) +# define sk_KRB5_AUTHENTBODY_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(KRB5_AUTHENTBODY, (st), (copy_func), (free_func)) +# define sk_KRB5_AUTHENTBODY_shift(st) SKM_sk_shift(KRB5_AUTHENTBODY, (st)) +# define sk_KRB5_AUTHENTBODY_pop(st) SKM_sk_pop(KRB5_AUTHENTBODY, (st)) +# define sk_KRB5_AUTHENTBODY_sort(st) SKM_sk_sort(KRB5_AUTHENTBODY, (st)) +# define sk_KRB5_AUTHENTBODY_is_sorted(st) SKM_sk_is_sorted(KRB5_AUTHENTBODY, (st)) +# define sk_KRB5_CHECKSUM_new(cmp) SKM_sk_new(KRB5_CHECKSUM, (cmp)) +# define sk_KRB5_CHECKSUM_new_null() SKM_sk_new_null(KRB5_CHECKSUM) +# define sk_KRB5_CHECKSUM_free(st) SKM_sk_free(KRB5_CHECKSUM, (st)) +# define sk_KRB5_CHECKSUM_num(st) SKM_sk_num(KRB5_CHECKSUM, (st)) +# define sk_KRB5_CHECKSUM_value(st, i) SKM_sk_value(KRB5_CHECKSUM, (st), (i)) +# define sk_KRB5_CHECKSUM_set(st, i, val) SKM_sk_set(KRB5_CHECKSUM, (st), (i), (val)) +# define sk_KRB5_CHECKSUM_zero(st) SKM_sk_zero(KRB5_CHECKSUM, (st)) +# define sk_KRB5_CHECKSUM_push(st, val) SKM_sk_push(KRB5_CHECKSUM, (st), (val)) +# define sk_KRB5_CHECKSUM_unshift(st, val) SKM_sk_unshift(KRB5_CHECKSUM, (st), (val)) +# define sk_KRB5_CHECKSUM_find(st, val) SKM_sk_find(KRB5_CHECKSUM, (st), (val)) +# define sk_KRB5_CHECKSUM_find_ex(st, val) SKM_sk_find_ex(KRB5_CHECKSUM, (st), (val)) +# define sk_KRB5_CHECKSUM_delete(st, i) SKM_sk_delete(KRB5_CHECKSUM, (st), (i)) +# define sk_KRB5_CHECKSUM_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_CHECKSUM, (st), (ptr)) +# define sk_KRB5_CHECKSUM_insert(st, val, i) SKM_sk_insert(KRB5_CHECKSUM, (st), (val), (i)) +# define sk_KRB5_CHECKSUM_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_CHECKSUM, (st), (cmp)) +# define sk_KRB5_CHECKSUM_dup(st) SKM_sk_dup(KRB5_CHECKSUM, st) +# define sk_KRB5_CHECKSUM_pop_free(st, free_func) SKM_sk_pop_free(KRB5_CHECKSUM, (st), (free_func)) +# define sk_KRB5_CHECKSUM_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(KRB5_CHECKSUM, (st), (copy_func), (free_func)) +# define sk_KRB5_CHECKSUM_shift(st) SKM_sk_shift(KRB5_CHECKSUM, (st)) +# define sk_KRB5_CHECKSUM_pop(st) SKM_sk_pop(KRB5_CHECKSUM, (st)) +# define sk_KRB5_CHECKSUM_sort(st) SKM_sk_sort(KRB5_CHECKSUM, (st)) +# define sk_KRB5_CHECKSUM_is_sorted(st) SKM_sk_is_sorted(KRB5_CHECKSUM, (st)) +# define sk_KRB5_ENCDATA_new(cmp) SKM_sk_new(KRB5_ENCDATA, (cmp)) +# define sk_KRB5_ENCDATA_new_null() SKM_sk_new_null(KRB5_ENCDATA) +# define sk_KRB5_ENCDATA_free(st) SKM_sk_free(KRB5_ENCDATA, (st)) +# define sk_KRB5_ENCDATA_num(st) SKM_sk_num(KRB5_ENCDATA, (st)) +# define sk_KRB5_ENCDATA_value(st, i) SKM_sk_value(KRB5_ENCDATA, (st), (i)) +# define sk_KRB5_ENCDATA_set(st, i, val) SKM_sk_set(KRB5_ENCDATA, (st), (i), (val)) +# define sk_KRB5_ENCDATA_zero(st) SKM_sk_zero(KRB5_ENCDATA, (st)) +# define sk_KRB5_ENCDATA_push(st, val) SKM_sk_push(KRB5_ENCDATA, (st), (val)) +# define sk_KRB5_ENCDATA_unshift(st, val) SKM_sk_unshift(KRB5_ENCDATA, (st), (val)) +# define sk_KRB5_ENCDATA_find(st, val) SKM_sk_find(KRB5_ENCDATA, (st), (val)) +# define sk_KRB5_ENCDATA_find_ex(st, val) SKM_sk_find_ex(KRB5_ENCDATA, (st), (val)) +# define sk_KRB5_ENCDATA_delete(st, i) SKM_sk_delete(KRB5_ENCDATA, (st), (i)) +# define sk_KRB5_ENCDATA_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_ENCDATA, (st), (ptr)) +# define sk_KRB5_ENCDATA_insert(st, val, i) SKM_sk_insert(KRB5_ENCDATA, (st), (val), (i)) +# define sk_KRB5_ENCDATA_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_ENCDATA, (st), (cmp)) +# define sk_KRB5_ENCDATA_dup(st) SKM_sk_dup(KRB5_ENCDATA, st) +# define sk_KRB5_ENCDATA_pop_free(st, free_func) SKM_sk_pop_free(KRB5_ENCDATA, (st), (free_func)) +# define sk_KRB5_ENCDATA_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(KRB5_ENCDATA, (st), (copy_func), (free_func)) +# define sk_KRB5_ENCDATA_shift(st) SKM_sk_shift(KRB5_ENCDATA, (st)) +# define sk_KRB5_ENCDATA_pop(st) SKM_sk_pop(KRB5_ENCDATA, (st)) +# define sk_KRB5_ENCDATA_sort(st) SKM_sk_sort(KRB5_ENCDATA, (st)) +# define sk_KRB5_ENCDATA_is_sorted(st) SKM_sk_is_sorted(KRB5_ENCDATA, (st)) +# define sk_KRB5_ENCKEY_new(cmp) SKM_sk_new(KRB5_ENCKEY, (cmp)) +# define sk_KRB5_ENCKEY_new_null() SKM_sk_new_null(KRB5_ENCKEY) +# define sk_KRB5_ENCKEY_free(st) SKM_sk_free(KRB5_ENCKEY, (st)) +# define sk_KRB5_ENCKEY_num(st) SKM_sk_num(KRB5_ENCKEY, (st)) +# define sk_KRB5_ENCKEY_value(st, i) SKM_sk_value(KRB5_ENCKEY, (st), (i)) +# define sk_KRB5_ENCKEY_set(st, i, val) SKM_sk_set(KRB5_ENCKEY, (st), (i), (val)) +# define sk_KRB5_ENCKEY_zero(st) SKM_sk_zero(KRB5_ENCKEY, (st)) +# define sk_KRB5_ENCKEY_push(st, val) SKM_sk_push(KRB5_ENCKEY, (st), (val)) +# define sk_KRB5_ENCKEY_unshift(st, val) SKM_sk_unshift(KRB5_ENCKEY, (st), (val)) +# define sk_KRB5_ENCKEY_find(st, val) SKM_sk_find(KRB5_ENCKEY, (st), (val)) +# define sk_KRB5_ENCKEY_find_ex(st, val) SKM_sk_find_ex(KRB5_ENCKEY, (st), (val)) +# define sk_KRB5_ENCKEY_delete(st, i) SKM_sk_delete(KRB5_ENCKEY, (st), (i)) +# define sk_KRB5_ENCKEY_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_ENCKEY, (st), (ptr)) +# define sk_KRB5_ENCKEY_insert(st, val, i) SKM_sk_insert(KRB5_ENCKEY, (st), (val), (i)) +# define sk_KRB5_ENCKEY_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_ENCKEY, (st), (cmp)) +# define sk_KRB5_ENCKEY_dup(st) SKM_sk_dup(KRB5_ENCKEY, st) +# define sk_KRB5_ENCKEY_pop_free(st, free_func) SKM_sk_pop_free(KRB5_ENCKEY, (st), (free_func)) +# define sk_KRB5_ENCKEY_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(KRB5_ENCKEY, (st), (copy_func), (free_func)) +# define sk_KRB5_ENCKEY_shift(st) SKM_sk_shift(KRB5_ENCKEY, (st)) +# define sk_KRB5_ENCKEY_pop(st) SKM_sk_pop(KRB5_ENCKEY, (st)) +# define sk_KRB5_ENCKEY_sort(st) SKM_sk_sort(KRB5_ENCKEY, (st)) +# define sk_KRB5_ENCKEY_is_sorted(st) SKM_sk_is_sorted(KRB5_ENCKEY, (st)) +# define sk_KRB5_PRINCNAME_new(cmp) SKM_sk_new(KRB5_PRINCNAME, (cmp)) +# define sk_KRB5_PRINCNAME_new_null() SKM_sk_new_null(KRB5_PRINCNAME) +# define sk_KRB5_PRINCNAME_free(st) SKM_sk_free(KRB5_PRINCNAME, (st)) +# define sk_KRB5_PRINCNAME_num(st) SKM_sk_num(KRB5_PRINCNAME, (st)) +# define sk_KRB5_PRINCNAME_value(st, i) SKM_sk_value(KRB5_PRINCNAME, (st), (i)) +# define sk_KRB5_PRINCNAME_set(st, i, val) SKM_sk_set(KRB5_PRINCNAME, (st), (i), (val)) +# define sk_KRB5_PRINCNAME_zero(st) SKM_sk_zero(KRB5_PRINCNAME, (st)) +# define sk_KRB5_PRINCNAME_push(st, val) SKM_sk_push(KRB5_PRINCNAME, (st), (val)) +# define sk_KRB5_PRINCNAME_unshift(st, val) SKM_sk_unshift(KRB5_PRINCNAME, (st), (val)) +# define sk_KRB5_PRINCNAME_find(st, val) SKM_sk_find(KRB5_PRINCNAME, (st), (val)) +# define sk_KRB5_PRINCNAME_find_ex(st, val) SKM_sk_find_ex(KRB5_PRINCNAME, (st), (val)) +# define sk_KRB5_PRINCNAME_delete(st, i) SKM_sk_delete(KRB5_PRINCNAME, (st), (i)) +# define sk_KRB5_PRINCNAME_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_PRINCNAME, (st), (ptr)) +# define sk_KRB5_PRINCNAME_insert(st, val, i) SKM_sk_insert(KRB5_PRINCNAME, (st), (val), (i)) +# define sk_KRB5_PRINCNAME_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_PRINCNAME, (st), (cmp)) +# define sk_KRB5_PRINCNAME_dup(st) SKM_sk_dup(KRB5_PRINCNAME, st) +# define sk_KRB5_PRINCNAME_pop_free(st, free_func) SKM_sk_pop_free(KRB5_PRINCNAME, (st), (free_func)) +# define sk_KRB5_PRINCNAME_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(KRB5_PRINCNAME, (st), (copy_func), (free_func)) +# define sk_KRB5_PRINCNAME_shift(st) SKM_sk_shift(KRB5_PRINCNAME, (st)) +# define sk_KRB5_PRINCNAME_pop(st) SKM_sk_pop(KRB5_PRINCNAME, (st)) +# define sk_KRB5_PRINCNAME_sort(st) SKM_sk_sort(KRB5_PRINCNAME, (st)) +# define sk_KRB5_PRINCNAME_is_sorted(st) SKM_sk_is_sorted(KRB5_PRINCNAME, (st)) +# define sk_KRB5_TKTBODY_new(cmp) SKM_sk_new(KRB5_TKTBODY, (cmp)) +# define sk_KRB5_TKTBODY_new_null() SKM_sk_new_null(KRB5_TKTBODY) +# define sk_KRB5_TKTBODY_free(st) SKM_sk_free(KRB5_TKTBODY, (st)) +# define sk_KRB5_TKTBODY_num(st) SKM_sk_num(KRB5_TKTBODY, (st)) +# define sk_KRB5_TKTBODY_value(st, i) SKM_sk_value(KRB5_TKTBODY, (st), (i)) +# define sk_KRB5_TKTBODY_set(st, i, val) SKM_sk_set(KRB5_TKTBODY, (st), (i), (val)) +# define sk_KRB5_TKTBODY_zero(st) SKM_sk_zero(KRB5_TKTBODY, (st)) +# define sk_KRB5_TKTBODY_push(st, val) SKM_sk_push(KRB5_TKTBODY, (st), (val)) +# define sk_KRB5_TKTBODY_unshift(st, val) SKM_sk_unshift(KRB5_TKTBODY, (st), (val)) +# define sk_KRB5_TKTBODY_find(st, val) SKM_sk_find(KRB5_TKTBODY, (st), (val)) +# define sk_KRB5_TKTBODY_find_ex(st, val) SKM_sk_find_ex(KRB5_TKTBODY, (st), (val)) +# define sk_KRB5_TKTBODY_delete(st, i) SKM_sk_delete(KRB5_TKTBODY, (st), (i)) +# define sk_KRB5_TKTBODY_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_TKTBODY, (st), (ptr)) +# define sk_KRB5_TKTBODY_insert(st, val, i) SKM_sk_insert(KRB5_TKTBODY, (st), (val), (i)) +# define sk_KRB5_TKTBODY_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_TKTBODY, (st), (cmp)) +# define sk_KRB5_TKTBODY_dup(st) SKM_sk_dup(KRB5_TKTBODY, st) +# define sk_KRB5_TKTBODY_pop_free(st, free_func) SKM_sk_pop_free(KRB5_TKTBODY, (st), (free_func)) +# define sk_KRB5_TKTBODY_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(KRB5_TKTBODY, (st), (copy_func), (free_func)) +# define sk_KRB5_TKTBODY_shift(st) SKM_sk_shift(KRB5_TKTBODY, (st)) +# define sk_KRB5_TKTBODY_pop(st) SKM_sk_pop(KRB5_TKTBODY, (st)) +# define sk_KRB5_TKTBODY_sort(st) SKM_sk_sort(KRB5_TKTBODY, (st)) +# define sk_KRB5_TKTBODY_is_sorted(st) SKM_sk_is_sorted(KRB5_TKTBODY, (st)) +# define sk_MEM_OBJECT_DATA_new(cmp) SKM_sk_new(MEM_OBJECT_DATA, (cmp)) +# define sk_MEM_OBJECT_DATA_new_null() SKM_sk_new_null(MEM_OBJECT_DATA) +# define sk_MEM_OBJECT_DATA_free(st) SKM_sk_free(MEM_OBJECT_DATA, (st)) +# define sk_MEM_OBJECT_DATA_num(st) SKM_sk_num(MEM_OBJECT_DATA, (st)) +# define sk_MEM_OBJECT_DATA_value(st, i) SKM_sk_value(MEM_OBJECT_DATA, (st), (i)) +# define sk_MEM_OBJECT_DATA_set(st, i, val) SKM_sk_set(MEM_OBJECT_DATA, (st), (i), (val)) +# define sk_MEM_OBJECT_DATA_zero(st) SKM_sk_zero(MEM_OBJECT_DATA, (st)) +# define sk_MEM_OBJECT_DATA_push(st, val) SKM_sk_push(MEM_OBJECT_DATA, (st), (val)) +# define sk_MEM_OBJECT_DATA_unshift(st, val) SKM_sk_unshift(MEM_OBJECT_DATA, (st), (val)) +# define sk_MEM_OBJECT_DATA_find(st, val) SKM_sk_find(MEM_OBJECT_DATA, (st), (val)) +# define sk_MEM_OBJECT_DATA_find_ex(st, val) SKM_sk_find_ex(MEM_OBJECT_DATA, (st), (val)) +# define sk_MEM_OBJECT_DATA_delete(st, i) SKM_sk_delete(MEM_OBJECT_DATA, (st), (i)) +# define sk_MEM_OBJECT_DATA_delete_ptr(st, ptr) SKM_sk_delete_ptr(MEM_OBJECT_DATA, (st), (ptr)) +# define sk_MEM_OBJECT_DATA_insert(st, val, i) SKM_sk_insert(MEM_OBJECT_DATA, (st), (val), (i)) +# define sk_MEM_OBJECT_DATA_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(MEM_OBJECT_DATA, (st), (cmp)) +# define sk_MEM_OBJECT_DATA_dup(st) SKM_sk_dup(MEM_OBJECT_DATA, st) +# define sk_MEM_OBJECT_DATA_pop_free(st, free_func) SKM_sk_pop_free(MEM_OBJECT_DATA, (st), (free_func)) +# define sk_MEM_OBJECT_DATA_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(MEM_OBJECT_DATA, (st), (copy_func), (free_func)) +# define sk_MEM_OBJECT_DATA_shift(st) SKM_sk_shift(MEM_OBJECT_DATA, (st)) +# define sk_MEM_OBJECT_DATA_pop(st) SKM_sk_pop(MEM_OBJECT_DATA, (st)) +# define sk_MEM_OBJECT_DATA_sort(st) SKM_sk_sort(MEM_OBJECT_DATA, (st)) +# define sk_MEM_OBJECT_DATA_is_sorted(st) SKM_sk_is_sorted(MEM_OBJECT_DATA, (st)) +# define sk_MIME_HEADER_new(cmp) SKM_sk_new(MIME_HEADER, (cmp)) +# define sk_MIME_HEADER_new_null() SKM_sk_new_null(MIME_HEADER) +# define sk_MIME_HEADER_free(st) SKM_sk_free(MIME_HEADER, (st)) +# define sk_MIME_HEADER_num(st) SKM_sk_num(MIME_HEADER, (st)) +# define sk_MIME_HEADER_value(st, i) SKM_sk_value(MIME_HEADER, (st), (i)) +# define sk_MIME_HEADER_set(st, i, val) SKM_sk_set(MIME_HEADER, (st), (i), (val)) +# define sk_MIME_HEADER_zero(st) SKM_sk_zero(MIME_HEADER, (st)) +# define sk_MIME_HEADER_push(st, val) SKM_sk_push(MIME_HEADER, (st), (val)) +# define sk_MIME_HEADER_unshift(st, val) SKM_sk_unshift(MIME_HEADER, (st), (val)) +# define sk_MIME_HEADER_find(st, val) SKM_sk_find(MIME_HEADER, (st), (val)) +# define sk_MIME_HEADER_find_ex(st, val) SKM_sk_find_ex(MIME_HEADER, (st), (val)) +# define sk_MIME_HEADER_delete(st, i) SKM_sk_delete(MIME_HEADER, (st), (i)) +# define sk_MIME_HEADER_delete_ptr(st, ptr) SKM_sk_delete_ptr(MIME_HEADER, (st), (ptr)) +# define sk_MIME_HEADER_insert(st, val, i) SKM_sk_insert(MIME_HEADER, (st), (val), (i)) +# define sk_MIME_HEADER_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(MIME_HEADER, (st), (cmp)) +# define sk_MIME_HEADER_dup(st) SKM_sk_dup(MIME_HEADER, st) +# define sk_MIME_HEADER_pop_free(st, free_func) SKM_sk_pop_free(MIME_HEADER, (st), (free_func)) +# define sk_MIME_HEADER_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(MIME_HEADER, (st), (copy_func), (free_func)) +# define sk_MIME_HEADER_shift(st) SKM_sk_shift(MIME_HEADER, (st)) +# define sk_MIME_HEADER_pop(st) SKM_sk_pop(MIME_HEADER, (st)) +# define sk_MIME_HEADER_sort(st) SKM_sk_sort(MIME_HEADER, (st)) +# define sk_MIME_HEADER_is_sorted(st) SKM_sk_is_sorted(MIME_HEADER, (st)) +# define sk_MIME_PARAM_new(cmp) SKM_sk_new(MIME_PARAM, (cmp)) +# define sk_MIME_PARAM_new_null() SKM_sk_new_null(MIME_PARAM) +# define sk_MIME_PARAM_free(st) SKM_sk_free(MIME_PARAM, (st)) +# define sk_MIME_PARAM_num(st) SKM_sk_num(MIME_PARAM, (st)) +# define sk_MIME_PARAM_value(st, i) SKM_sk_value(MIME_PARAM, (st), (i)) +# define sk_MIME_PARAM_set(st, i, val) SKM_sk_set(MIME_PARAM, (st), (i), (val)) +# define sk_MIME_PARAM_zero(st) SKM_sk_zero(MIME_PARAM, (st)) +# define sk_MIME_PARAM_push(st, val) SKM_sk_push(MIME_PARAM, (st), (val)) +# define sk_MIME_PARAM_unshift(st, val) SKM_sk_unshift(MIME_PARAM, (st), (val)) +# define sk_MIME_PARAM_find(st, val) SKM_sk_find(MIME_PARAM, (st), (val)) +# define sk_MIME_PARAM_find_ex(st, val) SKM_sk_find_ex(MIME_PARAM, (st), (val)) +# define sk_MIME_PARAM_delete(st, i) SKM_sk_delete(MIME_PARAM, (st), (i)) +# define sk_MIME_PARAM_delete_ptr(st, ptr) SKM_sk_delete_ptr(MIME_PARAM, (st), (ptr)) +# define sk_MIME_PARAM_insert(st, val, i) SKM_sk_insert(MIME_PARAM, (st), (val), (i)) +# define sk_MIME_PARAM_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(MIME_PARAM, (st), (cmp)) +# define sk_MIME_PARAM_dup(st) SKM_sk_dup(MIME_PARAM, st) +# define sk_MIME_PARAM_pop_free(st, free_func) SKM_sk_pop_free(MIME_PARAM, (st), (free_func)) +# define sk_MIME_PARAM_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(MIME_PARAM, (st), (copy_func), (free_func)) +# define sk_MIME_PARAM_shift(st) SKM_sk_shift(MIME_PARAM, (st)) +# define sk_MIME_PARAM_pop(st) SKM_sk_pop(MIME_PARAM, (st)) +# define sk_MIME_PARAM_sort(st) SKM_sk_sort(MIME_PARAM, (st)) +# define sk_MIME_PARAM_is_sorted(st) SKM_sk_is_sorted(MIME_PARAM, (st)) +# define sk_NAME_FUNCS_new(cmp) SKM_sk_new(NAME_FUNCS, (cmp)) +# define sk_NAME_FUNCS_new_null() SKM_sk_new_null(NAME_FUNCS) +# define sk_NAME_FUNCS_free(st) SKM_sk_free(NAME_FUNCS, (st)) +# define sk_NAME_FUNCS_num(st) SKM_sk_num(NAME_FUNCS, (st)) +# define sk_NAME_FUNCS_value(st, i) SKM_sk_value(NAME_FUNCS, (st), (i)) +# define sk_NAME_FUNCS_set(st, i, val) SKM_sk_set(NAME_FUNCS, (st), (i), (val)) +# define sk_NAME_FUNCS_zero(st) SKM_sk_zero(NAME_FUNCS, (st)) +# define sk_NAME_FUNCS_push(st, val) SKM_sk_push(NAME_FUNCS, (st), (val)) +# define sk_NAME_FUNCS_unshift(st, val) SKM_sk_unshift(NAME_FUNCS, (st), (val)) +# define sk_NAME_FUNCS_find(st, val) SKM_sk_find(NAME_FUNCS, (st), (val)) +# define sk_NAME_FUNCS_find_ex(st, val) SKM_sk_find_ex(NAME_FUNCS, (st), (val)) +# define sk_NAME_FUNCS_delete(st, i) SKM_sk_delete(NAME_FUNCS, (st), (i)) +# define sk_NAME_FUNCS_delete_ptr(st, ptr) SKM_sk_delete_ptr(NAME_FUNCS, (st), (ptr)) +# define sk_NAME_FUNCS_insert(st, val, i) SKM_sk_insert(NAME_FUNCS, (st), (val), (i)) +# define sk_NAME_FUNCS_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(NAME_FUNCS, (st), (cmp)) +# define sk_NAME_FUNCS_dup(st) SKM_sk_dup(NAME_FUNCS, st) +# define sk_NAME_FUNCS_pop_free(st, free_func) SKM_sk_pop_free(NAME_FUNCS, (st), (free_func)) +# define sk_NAME_FUNCS_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(NAME_FUNCS, (st), (copy_func), (free_func)) +# define sk_NAME_FUNCS_shift(st) SKM_sk_shift(NAME_FUNCS, (st)) +# define sk_NAME_FUNCS_pop(st) SKM_sk_pop(NAME_FUNCS, (st)) +# define sk_NAME_FUNCS_sort(st) SKM_sk_sort(NAME_FUNCS, (st)) +# define sk_NAME_FUNCS_is_sorted(st) SKM_sk_is_sorted(NAME_FUNCS, (st)) +# define sk_OCSP_CERTID_new(cmp) SKM_sk_new(OCSP_CERTID, (cmp)) +# define sk_OCSP_CERTID_new_null() SKM_sk_new_null(OCSP_CERTID) +# define sk_OCSP_CERTID_free(st) SKM_sk_free(OCSP_CERTID, (st)) +# define sk_OCSP_CERTID_num(st) SKM_sk_num(OCSP_CERTID, (st)) +# define sk_OCSP_CERTID_value(st, i) SKM_sk_value(OCSP_CERTID, (st), (i)) +# define sk_OCSP_CERTID_set(st, i, val) SKM_sk_set(OCSP_CERTID, (st), (i), (val)) +# define sk_OCSP_CERTID_zero(st) SKM_sk_zero(OCSP_CERTID, (st)) +# define sk_OCSP_CERTID_push(st, val) SKM_sk_push(OCSP_CERTID, (st), (val)) +# define sk_OCSP_CERTID_unshift(st, val) SKM_sk_unshift(OCSP_CERTID, (st), (val)) +# define sk_OCSP_CERTID_find(st, val) SKM_sk_find(OCSP_CERTID, (st), (val)) +# define sk_OCSP_CERTID_find_ex(st, val) SKM_sk_find_ex(OCSP_CERTID, (st), (val)) +# define sk_OCSP_CERTID_delete(st, i) SKM_sk_delete(OCSP_CERTID, (st), (i)) +# define sk_OCSP_CERTID_delete_ptr(st, ptr) SKM_sk_delete_ptr(OCSP_CERTID, (st), (ptr)) +# define sk_OCSP_CERTID_insert(st, val, i) SKM_sk_insert(OCSP_CERTID, (st), (val), (i)) +# define sk_OCSP_CERTID_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(OCSP_CERTID, (st), (cmp)) +# define sk_OCSP_CERTID_dup(st) SKM_sk_dup(OCSP_CERTID, st) +# define sk_OCSP_CERTID_pop_free(st, free_func) SKM_sk_pop_free(OCSP_CERTID, (st), (free_func)) +# define sk_OCSP_CERTID_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(OCSP_CERTID, (st), (copy_func), (free_func)) +# define sk_OCSP_CERTID_shift(st) SKM_sk_shift(OCSP_CERTID, (st)) +# define sk_OCSP_CERTID_pop(st) SKM_sk_pop(OCSP_CERTID, (st)) +# define sk_OCSP_CERTID_sort(st) SKM_sk_sort(OCSP_CERTID, (st)) +# define sk_OCSP_CERTID_is_sorted(st) SKM_sk_is_sorted(OCSP_CERTID, (st)) +# define sk_OCSP_ONEREQ_new(cmp) SKM_sk_new(OCSP_ONEREQ, (cmp)) +# define sk_OCSP_ONEREQ_new_null() SKM_sk_new_null(OCSP_ONEREQ) +# define sk_OCSP_ONEREQ_free(st) SKM_sk_free(OCSP_ONEREQ, (st)) +# define sk_OCSP_ONEREQ_num(st) SKM_sk_num(OCSP_ONEREQ, (st)) +# define sk_OCSP_ONEREQ_value(st, i) SKM_sk_value(OCSP_ONEREQ, (st), (i)) +# define sk_OCSP_ONEREQ_set(st, i, val) SKM_sk_set(OCSP_ONEREQ, (st), (i), (val)) +# define sk_OCSP_ONEREQ_zero(st) SKM_sk_zero(OCSP_ONEREQ, (st)) +# define sk_OCSP_ONEREQ_push(st, val) SKM_sk_push(OCSP_ONEREQ, (st), (val)) +# define sk_OCSP_ONEREQ_unshift(st, val) SKM_sk_unshift(OCSP_ONEREQ, (st), (val)) +# define sk_OCSP_ONEREQ_find(st, val) SKM_sk_find(OCSP_ONEREQ, (st), (val)) +# define sk_OCSP_ONEREQ_find_ex(st, val) SKM_sk_find_ex(OCSP_ONEREQ, (st), (val)) +# define sk_OCSP_ONEREQ_delete(st, i) SKM_sk_delete(OCSP_ONEREQ, (st), (i)) +# define sk_OCSP_ONEREQ_delete_ptr(st, ptr) SKM_sk_delete_ptr(OCSP_ONEREQ, (st), (ptr)) +# define sk_OCSP_ONEREQ_insert(st, val, i) SKM_sk_insert(OCSP_ONEREQ, (st), (val), (i)) +# define sk_OCSP_ONEREQ_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(OCSP_ONEREQ, (st), (cmp)) +# define sk_OCSP_ONEREQ_dup(st) SKM_sk_dup(OCSP_ONEREQ, st) +# define sk_OCSP_ONEREQ_pop_free(st, free_func) SKM_sk_pop_free(OCSP_ONEREQ, (st), (free_func)) +# define sk_OCSP_ONEREQ_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(OCSP_ONEREQ, (st), (copy_func), (free_func)) +# define sk_OCSP_ONEREQ_shift(st) SKM_sk_shift(OCSP_ONEREQ, (st)) +# define sk_OCSP_ONEREQ_pop(st) SKM_sk_pop(OCSP_ONEREQ, (st)) +# define sk_OCSP_ONEREQ_sort(st) SKM_sk_sort(OCSP_ONEREQ, (st)) +# define sk_OCSP_ONEREQ_is_sorted(st) SKM_sk_is_sorted(OCSP_ONEREQ, (st)) +# define sk_OCSP_RESPID_new(cmp) SKM_sk_new(OCSP_RESPID, (cmp)) +# define sk_OCSP_RESPID_new_null() SKM_sk_new_null(OCSP_RESPID) +# define sk_OCSP_RESPID_free(st) SKM_sk_free(OCSP_RESPID, (st)) +# define sk_OCSP_RESPID_num(st) SKM_sk_num(OCSP_RESPID, (st)) +# define sk_OCSP_RESPID_value(st, i) SKM_sk_value(OCSP_RESPID, (st), (i)) +# define sk_OCSP_RESPID_set(st, i, val) SKM_sk_set(OCSP_RESPID, (st), (i), (val)) +# define sk_OCSP_RESPID_zero(st) SKM_sk_zero(OCSP_RESPID, (st)) +# define sk_OCSP_RESPID_push(st, val) SKM_sk_push(OCSP_RESPID, (st), (val)) +# define sk_OCSP_RESPID_unshift(st, val) SKM_sk_unshift(OCSP_RESPID, (st), (val)) +# define sk_OCSP_RESPID_find(st, val) SKM_sk_find(OCSP_RESPID, (st), (val)) +# define sk_OCSP_RESPID_find_ex(st, val) SKM_sk_find_ex(OCSP_RESPID, (st), (val)) +# define sk_OCSP_RESPID_delete(st, i) SKM_sk_delete(OCSP_RESPID, (st), (i)) +# define sk_OCSP_RESPID_delete_ptr(st, ptr) SKM_sk_delete_ptr(OCSP_RESPID, (st), (ptr)) +# define sk_OCSP_RESPID_insert(st, val, i) SKM_sk_insert(OCSP_RESPID, (st), (val), (i)) +# define sk_OCSP_RESPID_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(OCSP_RESPID, (st), (cmp)) +# define sk_OCSP_RESPID_dup(st) SKM_sk_dup(OCSP_RESPID, st) +# define sk_OCSP_RESPID_pop_free(st, free_func) SKM_sk_pop_free(OCSP_RESPID, (st), (free_func)) +# define sk_OCSP_RESPID_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(OCSP_RESPID, (st), (copy_func), (free_func)) +# define sk_OCSP_RESPID_shift(st) SKM_sk_shift(OCSP_RESPID, (st)) +# define sk_OCSP_RESPID_pop(st) SKM_sk_pop(OCSP_RESPID, (st)) +# define sk_OCSP_RESPID_sort(st) SKM_sk_sort(OCSP_RESPID, (st)) +# define sk_OCSP_RESPID_is_sorted(st) SKM_sk_is_sorted(OCSP_RESPID, (st)) +# define sk_OCSP_SINGLERESP_new(cmp) SKM_sk_new(OCSP_SINGLERESP, (cmp)) +# define sk_OCSP_SINGLERESP_new_null() SKM_sk_new_null(OCSP_SINGLERESP) +# define sk_OCSP_SINGLERESP_free(st) SKM_sk_free(OCSP_SINGLERESP, (st)) +# define sk_OCSP_SINGLERESP_num(st) SKM_sk_num(OCSP_SINGLERESP, (st)) +# define sk_OCSP_SINGLERESP_value(st, i) SKM_sk_value(OCSP_SINGLERESP, (st), (i)) +# define sk_OCSP_SINGLERESP_set(st, i, val) SKM_sk_set(OCSP_SINGLERESP, (st), (i), (val)) +# define sk_OCSP_SINGLERESP_zero(st) SKM_sk_zero(OCSP_SINGLERESP, (st)) +# define sk_OCSP_SINGLERESP_push(st, val) SKM_sk_push(OCSP_SINGLERESP, (st), (val)) +# define sk_OCSP_SINGLERESP_unshift(st, val) SKM_sk_unshift(OCSP_SINGLERESP, (st), (val)) +# define sk_OCSP_SINGLERESP_find(st, val) SKM_sk_find(OCSP_SINGLERESP, (st), (val)) +# define sk_OCSP_SINGLERESP_find_ex(st, val) SKM_sk_find_ex(OCSP_SINGLERESP, (st), (val)) +# define sk_OCSP_SINGLERESP_delete(st, i) SKM_sk_delete(OCSP_SINGLERESP, (st), (i)) +# define sk_OCSP_SINGLERESP_delete_ptr(st, ptr) SKM_sk_delete_ptr(OCSP_SINGLERESP, (st), (ptr)) +# define sk_OCSP_SINGLERESP_insert(st, val, i) SKM_sk_insert(OCSP_SINGLERESP, (st), (val), (i)) +# define sk_OCSP_SINGLERESP_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(OCSP_SINGLERESP, (st), (cmp)) +# define sk_OCSP_SINGLERESP_dup(st) SKM_sk_dup(OCSP_SINGLERESP, st) +# define sk_OCSP_SINGLERESP_pop_free(st, free_func) SKM_sk_pop_free(OCSP_SINGLERESP, (st), (free_func)) +# define sk_OCSP_SINGLERESP_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(OCSP_SINGLERESP, (st), (copy_func), (free_func)) +# define sk_OCSP_SINGLERESP_shift(st) SKM_sk_shift(OCSP_SINGLERESP, (st)) +# define sk_OCSP_SINGLERESP_pop(st) SKM_sk_pop(OCSP_SINGLERESP, (st)) +# define sk_OCSP_SINGLERESP_sort(st) SKM_sk_sort(OCSP_SINGLERESP, (st)) +# define sk_OCSP_SINGLERESP_is_sorted(st) SKM_sk_is_sorted(OCSP_SINGLERESP, (st)) +# define sk_PKCS12_SAFEBAG_new(cmp) SKM_sk_new(PKCS12_SAFEBAG, (cmp)) +# define sk_PKCS12_SAFEBAG_new_null() SKM_sk_new_null(PKCS12_SAFEBAG) +# define sk_PKCS12_SAFEBAG_free(st) SKM_sk_free(PKCS12_SAFEBAG, (st)) +# define sk_PKCS12_SAFEBAG_num(st) SKM_sk_num(PKCS12_SAFEBAG, (st)) +# define sk_PKCS12_SAFEBAG_value(st, i) SKM_sk_value(PKCS12_SAFEBAG, (st), (i)) +# define sk_PKCS12_SAFEBAG_set(st, i, val) SKM_sk_set(PKCS12_SAFEBAG, (st), (i), (val)) +# define sk_PKCS12_SAFEBAG_zero(st) SKM_sk_zero(PKCS12_SAFEBAG, (st)) +# define sk_PKCS12_SAFEBAG_push(st, val) SKM_sk_push(PKCS12_SAFEBAG, (st), (val)) +# define sk_PKCS12_SAFEBAG_unshift(st, val) SKM_sk_unshift(PKCS12_SAFEBAG, (st), (val)) +# define sk_PKCS12_SAFEBAG_find(st, val) SKM_sk_find(PKCS12_SAFEBAG, (st), (val)) +# define sk_PKCS12_SAFEBAG_find_ex(st, val) SKM_sk_find_ex(PKCS12_SAFEBAG, (st), (val)) +# define sk_PKCS12_SAFEBAG_delete(st, i) SKM_sk_delete(PKCS12_SAFEBAG, (st), (i)) +# define sk_PKCS12_SAFEBAG_delete_ptr(st, ptr) SKM_sk_delete_ptr(PKCS12_SAFEBAG, (st), (ptr)) +# define sk_PKCS12_SAFEBAG_insert(st, val, i) SKM_sk_insert(PKCS12_SAFEBAG, (st), (val), (i)) +# define sk_PKCS12_SAFEBAG_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(PKCS12_SAFEBAG, (st), (cmp)) +# define sk_PKCS12_SAFEBAG_dup(st) SKM_sk_dup(PKCS12_SAFEBAG, st) +# define sk_PKCS12_SAFEBAG_pop_free(st, free_func) SKM_sk_pop_free(PKCS12_SAFEBAG, (st), (free_func)) +# define sk_PKCS12_SAFEBAG_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(PKCS12_SAFEBAG, (st), (copy_func), (free_func)) +# define sk_PKCS12_SAFEBAG_shift(st) SKM_sk_shift(PKCS12_SAFEBAG, (st)) +# define sk_PKCS12_SAFEBAG_pop(st) SKM_sk_pop(PKCS12_SAFEBAG, (st)) +# define sk_PKCS12_SAFEBAG_sort(st) SKM_sk_sort(PKCS12_SAFEBAG, (st)) +# define sk_PKCS12_SAFEBAG_is_sorted(st) SKM_sk_is_sorted(PKCS12_SAFEBAG, (st)) +# define sk_PKCS7_new(cmp) SKM_sk_new(PKCS7, (cmp)) +# define sk_PKCS7_new_null() SKM_sk_new_null(PKCS7) +# define sk_PKCS7_free(st) SKM_sk_free(PKCS7, (st)) +# define sk_PKCS7_num(st) SKM_sk_num(PKCS7, (st)) +# define sk_PKCS7_value(st, i) SKM_sk_value(PKCS7, (st), (i)) +# define sk_PKCS7_set(st, i, val) SKM_sk_set(PKCS7, (st), (i), (val)) +# define sk_PKCS7_zero(st) SKM_sk_zero(PKCS7, (st)) +# define sk_PKCS7_push(st, val) SKM_sk_push(PKCS7, (st), (val)) +# define sk_PKCS7_unshift(st, val) SKM_sk_unshift(PKCS7, (st), (val)) +# define sk_PKCS7_find(st, val) SKM_sk_find(PKCS7, (st), (val)) +# define sk_PKCS7_find_ex(st, val) SKM_sk_find_ex(PKCS7, (st), (val)) +# define sk_PKCS7_delete(st, i) SKM_sk_delete(PKCS7, (st), (i)) +# define sk_PKCS7_delete_ptr(st, ptr) SKM_sk_delete_ptr(PKCS7, (st), (ptr)) +# define sk_PKCS7_insert(st, val, i) SKM_sk_insert(PKCS7, (st), (val), (i)) +# define sk_PKCS7_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(PKCS7, (st), (cmp)) +# define sk_PKCS7_dup(st) SKM_sk_dup(PKCS7, st) +# define sk_PKCS7_pop_free(st, free_func) SKM_sk_pop_free(PKCS7, (st), (free_func)) +# define sk_PKCS7_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(PKCS7, (st), (copy_func), (free_func)) +# define sk_PKCS7_shift(st) SKM_sk_shift(PKCS7, (st)) +# define sk_PKCS7_pop(st) SKM_sk_pop(PKCS7, (st)) +# define sk_PKCS7_sort(st) SKM_sk_sort(PKCS7, (st)) +# define sk_PKCS7_is_sorted(st) SKM_sk_is_sorted(PKCS7, (st)) +# define sk_PKCS7_RECIP_INFO_new(cmp) SKM_sk_new(PKCS7_RECIP_INFO, (cmp)) +# define sk_PKCS7_RECIP_INFO_new_null() SKM_sk_new_null(PKCS7_RECIP_INFO) +# define sk_PKCS7_RECIP_INFO_free(st) SKM_sk_free(PKCS7_RECIP_INFO, (st)) +# define sk_PKCS7_RECIP_INFO_num(st) SKM_sk_num(PKCS7_RECIP_INFO, (st)) +# define sk_PKCS7_RECIP_INFO_value(st, i) SKM_sk_value(PKCS7_RECIP_INFO, (st), (i)) +# define sk_PKCS7_RECIP_INFO_set(st, i, val) SKM_sk_set(PKCS7_RECIP_INFO, (st), (i), (val)) +# define sk_PKCS7_RECIP_INFO_zero(st) SKM_sk_zero(PKCS7_RECIP_INFO, (st)) +# define sk_PKCS7_RECIP_INFO_push(st, val) SKM_sk_push(PKCS7_RECIP_INFO, (st), (val)) +# define sk_PKCS7_RECIP_INFO_unshift(st, val) SKM_sk_unshift(PKCS7_RECIP_INFO, (st), (val)) +# define sk_PKCS7_RECIP_INFO_find(st, val) SKM_sk_find(PKCS7_RECIP_INFO, (st), (val)) +# define sk_PKCS7_RECIP_INFO_find_ex(st, val) SKM_sk_find_ex(PKCS7_RECIP_INFO, (st), (val)) +# define sk_PKCS7_RECIP_INFO_delete(st, i) SKM_sk_delete(PKCS7_RECIP_INFO, (st), (i)) +# define sk_PKCS7_RECIP_INFO_delete_ptr(st, ptr) SKM_sk_delete_ptr(PKCS7_RECIP_INFO, (st), (ptr)) +# define sk_PKCS7_RECIP_INFO_insert(st, val, i) SKM_sk_insert(PKCS7_RECIP_INFO, (st), (val), (i)) +# define sk_PKCS7_RECIP_INFO_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(PKCS7_RECIP_INFO, (st), (cmp)) +# define sk_PKCS7_RECIP_INFO_dup(st) SKM_sk_dup(PKCS7_RECIP_INFO, st) +# define sk_PKCS7_RECIP_INFO_pop_free(st, free_func) SKM_sk_pop_free(PKCS7_RECIP_INFO, (st), (free_func)) +# define sk_PKCS7_RECIP_INFO_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(PKCS7_RECIP_INFO, (st), (copy_func), (free_func)) +# define sk_PKCS7_RECIP_INFO_shift(st) SKM_sk_shift(PKCS7_RECIP_INFO, (st)) +# define sk_PKCS7_RECIP_INFO_pop(st) SKM_sk_pop(PKCS7_RECIP_INFO, (st)) +# define sk_PKCS7_RECIP_INFO_sort(st) SKM_sk_sort(PKCS7_RECIP_INFO, (st)) +# define sk_PKCS7_RECIP_INFO_is_sorted(st) SKM_sk_is_sorted(PKCS7_RECIP_INFO, (st)) +# define sk_PKCS7_SIGNER_INFO_new(cmp) SKM_sk_new(PKCS7_SIGNER_INFO, (cmp)) +# define sk_PKCS7_SIGNER_INFO_new_null() SKM_sk_new_null(PKCS7_SIGNER_INFO) +# define sk_PKCS7_SIGNER_INFO_free(st) SKM_sk_free(PKCS7_SIGNER_INFO, (st)) +# define sk_PKCS7_SIGNER_INFO_num(st) SKM_sk_num(PKCS7_SIGNER_INFO, (st)) +# define sk_PKCS7_SIGNER_INFO_value(st, i) SKM_sk_value(PKCS7_SIGNER_INFO, (st), (i)) +# define sk_PKCS7_SIGNER_INFO_set(st, i, val) SKM_sk_set(PKCS7_SIGNER_INFO, (st), (i), (val)) +# define sk_PKCS7_SIGNER_INFO_zero(st) SKM_sk_zero(PKCS7_SIGNER_INFO, (st)) +# define sk_PKCS7_SIGNER_INFO_push(st, val) SKM_sk_push(PKCS7_SIGNER_INFO, (st), (val)) +# define sk_PKCS7_SIGNER_INFO_unshift(st, val) SKM_sk_unshift(PKCS7_SIGNER_INFO, (st), (val)) +# define sk_PKCS7_SIGNER_INFO_find(st, val) SKM_sk_find(PKCS7_SIGNER_INFO, (st), (val)) +# define sk_PKCS7_SIGNER_INFO_find_ex(st, val) SKM_sk_find_ex(PKCS7_SIGNER_INFO, (st), (val)) +# define sk_PKCS7_SIGNER_INFO_delete(st, i) SKM_sk_delete(PKCS7_SIGNER_INFO, (st), (i)) +# define sk_PKCS7_SIGNER_INFO_delete_ptr(st, ptr) SKM_sk_delete_ptr(PKCS7_SIGNER_INFO, (st), (ptr)) +# define sk_PKCS7_SIGNER_INFO_insert(st, val, i) SKM_sk_insert(PKCS7_SIGNER_INFO, (st), (val), (i)) +# define sk_PKCS7_SIGNER_INFO_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(PKCS7_SIGNER_INFO, (st), (cmp)) +# define sk_PKCS7_SIGNER_INFO_dup(st) SKM_sk_dup(PKCS7_SIGNER_INFO, st) +# define sk_PKCS7_SIGNER_INFO_pop_free(st, free_func) SKM_sk_pop_free(PKCS7_SIGNER_INFO, (st), (free_func)) +# define sk_PKCS7_SIGNER_INFO_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(PKCS7_SIGNER_INFO, (st), (copy_func), (free_func)) +# define sk_PKCS7_SIGNER_INFO_shift(st) SKM_sk_shift(PKCS7_SIGNER_INFO, (st)) +# define sk_PKCS7_SIGNER_INFO_pop(st) SKM_sk_pop(PKCS7_SIGNER_INFO, (st)) +# define sk_PKCS7_SIGNER_INFO_sort(st) SKM_sk_sort(PKCS7_SIGNER_INFO, (st)) +# define sk_PKCS7_SIGNER_INFO_is_sorted(st) SKM_sk_is_sorted(PKCS7_SIGNER_INFO, (st)) +# define sk_POLICYINFO_new(cmp) SKM_sk_new(POLICYINFO, (cmp)) +# define sk_POLICYINFO_new_null() SKM_sk_new_null(POLICYINFO) +# define sk_POLICYINFO_free(st) SKM_sk_free(POLICYINFO, (st)) +# define sk_POLICYINFO_num(st) SKM_sk_num(POLICYINFO, (st)) +# define sk_POLICYINFO_value(st, i) SKM_sk_value(POLICYINFO, (st), (i)) +# define sk_POLICYINFO_set(st, i, val) SKM_sk_set(POLICYINFO, (st), (i), (val)) +# define sk_POLICYINFO_zero(st) SKM_sk_zero(POLICYINFO, (st)) +# define sk_POLICYINFO_push(st, val) SKM_sk_push(POLICYINFO, (st), (val)) +# define sk_POLICYINFO_unshift(st, val) SKM_sk_unshift(POLICYINFO, (st), (val)) +# define sk_POLICYINFO_find(st, val) SKM_sk_find(POLICYINFO, (st), (val)) +# define sk_POLICYINFO_find_ex(st, val) SKM_sk_find_ex(POLICYINFO, (st), (val)) +# define sk_POLICYINFO_delete(st, i) SKM_sk_delete(POLICYINFO, (st), (i)) +# define sk_POLICYINFO_delete_ptr(st, ptr) SKM_sk_delete_ptr(POLICYINFO, (st), (ptr)) +# define sk_POLICYINFO_insert(st, val, i) SKM_sk_insert(POLICYINFO, (st), (val), (i)) +# define sk_POLICYINFO_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(POLICYINFO, (st), (cmp)) +# define sk_POLICYINFO_dup(st) SKM_sk_dup(POLICYINFO, st) +# define sk_POLICYINFO_pop_free(st, free_func) SKM_sk_pop_free(POLICYINFO, (st), (free_func)) +# define sk_POLICYINFO_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(POLICYINFO, (st), (copy_func), (free_func)) +# define sk_POLICYINFO_shift(st) SKM_sk_shift(POLICYINFO, (st)) +# define sk_POLICYINFO_pop(st) SKM_sk_pop(POLICYINFO, (st)) +# define sk_POLICYINFO_sort(st) SKM_sk_sort(POLICYINFO, (st)) +# define sk_POLICYINFO_is_sorted(st) SKM_sk_is_sorted(POLICYINFO, (st)) +# define sk_POLICYQUALINFO_new(cmp) SKM_sk_new(POLICYQUALINFO, (cmp)) +# define sk_POLICYQUALINFO_new_null() SKM_sk_new_null(POLICYQUALINFO) +# define sk_POLICYQUALINFO_free(st) SKM_sk_free(POLICYQUALINFO, (st)) +# define sk_POLICYQUALINFO_num(st) SKM_sk_num(POLICYQUALINFO, (st)) +# define sk_POLICYQUALINFO_value(st, i) SKM_sk_value(POLICYQUALINFO, (st), (i)) +# define sk_POLICYQUALINFO_set(st, i, val) SKM_sk_set(POLICYQUALINFO, (st), (i), (val)) +# define sk_POLICYQUALINFO_zero(st) SKM_sk_zero(POLICYQUALINFO, (st)) +# define sk_POLICYQUALINFO_push(st, val) SKM_sk_push(POLICYQUALINFO, (st), (val)) +# define sk_POLICYQUALINFO_unshift(st, val) SKM_sk_unshift(POLICYQUALINFO, (st), (val)) +# define sk_POLICYQUALINFO_find(st, val) SKM_sk_find(POLICYQUALINFO, (st), (val)) +# define sk_POLICYQUALINFO_find_ex(st, val) SKM_sk_find_ex(POLICYQUALINFO, (st), (val)) +# define sk_POLICYQUALINFO_delete(st, i) SKM_sk_delete(POLICYQUALINFO, (st), (i)) +# define sk_POLICYQUALINFO_delete_ptr(st, ptr) SKM_sk_delete_ptr(POLICYQUALINFO, (st), (ptr)) +# define sk_POLICYQUALINFO_insert(st, val, i) SKM_sk_insert(POLICYQUALINFO, (st), (val), (i)) +# define sk_POLICYQUALINFO_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(POLICYQUALINFO, (st), (cmp)) +# define sk_POLICYQUALINFO_dup(st) SKM_sk_dup(POLICYQUALINFO, st) +# define sk_POLICYQUALINFO_pop_free(st, free_func) SKM_sk_pop_free(POLICYQUALINFO, (st), (free_func)) +# define sk_POLICYQUALINFO_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(POLICYQUALINFO, (st), (copy_func), (free_func)) +# define sk_POLICYQUALINFO_shift(st) SKM_sk_shift(POLICYQUALINFO, (st)) +# define sk_POLICYQUALINFO_pop(st) SKM_sk_pop(POLICYQUALINFO, (st)) +# define sk_POLICYQUALINFO_sort(st) SKM_sk_sort(POLICYQUALINFO, (st)) +# define sk_POLICYQUALINFO_is_sorted(st) SKM_sk_is_sorted(POLICYQUALINFO, (st)) +# define sk_POLICY_MAPPING_new(cmp) SKM_sk_new(POLICY_MAPPING, (cmp)) +# define sk_POLICY_MAPPING_new_null() SKM_sk_new_null(POLICY_MAPPING) +# define sk_POLICY_MAPPING_free(st) SKM_sk_free(POLICY_MAPPING, (st)) +# define sk_POLICY_MAPPING_num(st) SKM_sk_num(POLICY_MAPPING, (st)) +# define sk_POLICY_MAPPING_value(st, i) SKM_sk_value(POLICY_MAPPING, (st), (i)) +# define sk_POLICY_MAPPING_set(st, i, val) SKM_sk_set(POLICY_MAPPING, (st), (i), (val)) +# define sk_POLICY_MAPPING_zero(st) SKM_sk_zero(POLICY_MAPPING, (st)) +# define sk_POLICY_MAPPING_push(st, val) SKM_sk_push(POLICY_MAPPING, (st), (val)) +# define sk_POLICY_MAPPING_unshift(st, val) SKM_sk_unshift(POLICY_MAPPING, (st), (val)) +# define sk_POLICY_MAPPING_find(st, val) SKM_sk_find(POLICY_MAPPING, (st), (val)) +# define sk_POLICY_MAPPING_find_ex(st, val) SKM_sk_find_ex(POLICY_MAPPING, (st), (val)) +# define sk_POLICY_MAPPING_delete(st, i) SKM_sk_delete(POLICY_MAPPING, (st), (i)) +# define sk_POLICY_MAPPING_delete_ptr(st, ptr) SKM_sk_delete_ptr(POLICY_MAPPING, (st), (ptr)) +# define sk_POLICY_MAPPING_insert(st, val, i) SKM_sk_insert(POLICY_MAPPING, (st), (val), (i)) +# define sk_POLICY_MAPPING_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(POLICY_MAPPING, (st), (cmp)) +# define sk_POLICY_MAPPING_dup(st) SKM_sk_dup(POLICY_MAPPING, st) +# define sk_POLICY_MAPPING_pop_free(st, free_func) SKM_sk_pop_free(POLICY_MAPPING, (st), (free_func)) +# define sk_POLICY_MAPPING_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(POLICY_MAPPING, (st), (copy_func), (free_func)) +# define sk_POLICY_MAPPING_shift(st) SKM_sk_shift(POLICY_MAPPING, (st)) +# define sk_POLICY_MAPPING_pop(st) SKM_sk_pop(POLICY_MAPPING, (st)) +# define sk_POLICY_MAPPING_sort(st) SKM_sk_sort(POLICY_MAPPING, (st)) +# define sk_POLICY_MAPPING_is_sorted(st) SKM_sk_is_sorted(POLICY_MAPPING, (st)) +# define sk_SCT_new(cmp) SKM_sk_new(SCT, (cmp)) +# define sk_SCT_new_null() SKM_sk_new_null(SCT) +# define sk_SCT_free(st) SKM_sk_free(SCT, (st)) +# define sk_SCT_num(st) SKM_sk_num(SCT, (st)) +# define sk_SCT_value(st, i) SKM_sk_value(SCT, (st), (i)) +# define sk_SCT_set(st, i, val) SKM_sk_set(SCT, (st), (i), (val)) +# define sk_SCT_zero(st) SKM_sk_zero(SCT, (st)) +# define sk_SCT_push(st, val) SKM_sk_push(SCT, (st), (val)) +# define sk_SCT_unshift(st, val) SKM_sk_unshift(SCT, (st), (val)) +# define sk_SCT_find(st, val) SKM_sk_find(SCT, (st), (val)) +# define sk_SCT_find_ex(st, val) SKM_sk_find_ex(SCT, (st), (val)) +# define sk_SCT_delete(st, i) SKM_sk_delete(SCT, (st), (i)) +# define sk_SCT_delete_ptr(st, ptr) SKM_sk_delete_ptr(SCT, (st), (ptr)) +# define sk_SCT_insert(st, val, i) SKM_sk_insert(SCT, (st), (val), (i)) +# define sk_SCT_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(SCT, (st), (cmp)) +# define sk_SCT_dup(st) SKM_sk_dup(SCT, st) +# define sk_SCT_pop_free(st, free_func) SKM_sk_pop_free(SCT, (st), (free_func)) +# define sk_SCT_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(SCT, (st), (copy_func), (free_func)) +# define sk_SCT_shift(st) SKM_sk_shift(SCT, (st)) +# define sk_SCT_pop(st) SKM_sk_pop(SCT, (st)) +# define sk_SCT_sort(st) SKM_sk_sort(SCT, (st)) +# define sk_SCT_is_sorted(st) SKM_sk_is_sorted(SCT, (st)) +# define sk_SRP_gN_new(cmp) SKM_sk_new(SRP_gN, (cmp)) +# define sk_SRP_gN_new_null() SKM_sk_new_null(SRP_gN) +# define sk_SRP_gN_free(st) SKM_sk_free(SRP_gN, (st)) +# define sk_SRP_gN_num(st) SKM_sk_num(SRP_gN, (st)) +# define sk_SRP_gN_value(st, i) SKM_sk_value(SRP_gN, (st), (i)) +# define sk_SRP_gN_set(st, i, val) SKM_sk_set(SRP_gN, (st), (i), (val)) +# define sk_SRP_gN_zero(st) SKM_sk_zero(SRP_gN, (st)) +# define sk_SRP_gN_push(st, val) SKM_sk_push(SRP_gN, (st), (val)) +# define sk_SRP_gN_unshift(st, val) SKM_sk_unshift(SRP_gN, (st), (val)) +# define sk_SRP_gN_find(st, val) SKM_sk_find(SRP_gN, (st), (val)) +# define sk_SRP_gN_find_ex(st, val) SKM_sk_find_ex(SRP_gN, (st), (val)) +# define sk_SRP_gN_delete(st, i) SKM_sk_delete(SRP_gN, (st), (i)) +# define sk_SRP_gN_delete_ptr(st, ptr) SKM_sk_delete_ptr(SRP_gN, (st), (ptr)) +# define sk_SRP_gN_insert(st, val, i) SKM_sk_insert(SRP_gN, (st), (val), (i)) +# define sk_SRP_gN_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(SRP_gN, (st), (cmp)) +# define sk_SRP_gN_dup(st) SKM_sk_dup(SRP_gN, st) +# define sk_SRP_gN_pop_free(st, free_func) SKM_sk_pop_free(SRP_gN, (st), (free_func)) +# define sk_SRP_gN_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(SRP_gN, (st), (copy_func), (free_func)) +# define sk_SRP_gN_shift(st) SKM_sk_shift(SRP_gN, (st)) +# define sk_SRP_gN_pop(st) SKM_sk_pop(SRP_gN, (st)) +# define sk_SRP_gN_sort(st) SKM_sk_sort(SRP_gN, (st)) +# define sk_SRP_gN_is_sorted(st) SKM_sk_is_sorted(SRP_gN, (st)) +# define sk_SRP_gN_cache_new(cmp) SKM_sk_new(SRP_gN_cache, (cmp)) +# define sk_SRP_gN_cache_new_null() SKM_sk_new_null(SRP_gN_cache) +# define sk_SRP_gN_cache_free(st) SKM_sk_free(SRP_gN_cache, (st)) +# define sk_SRP_gN_cache_num(st) SKM_sk_num(SRP_gN_cache, (st)) +# define sk_SRP_gN_cache_value(st, i) SKM_sk_value(SRP_gN_cache, (st), (i)) +# define sk_SRP_gN_cache_set(st, i, val) SKM_sk_set(SRP_gN_cache, (st), (i), (val)) +# define sk_SRP_gN_cache_zero(st) SKM_sk_zero(SRP_gN_cache, (st)) +# define sk_SRP_gN_cache_push(st, val) SKM_sk_push(SRP_gN_cache, (st), (val)) +# define sk_SRP_gN_cache_unshift(st, val) SKM_sk_unshift(SRP_gN_cache, (st), (val)) +# define sk_SRP_gN_cache_find(st, val) SKM_sk_find(SRP_gN_cache, (st), (val)) +# define sk_SRP_gN_cache_find_ex(st, val) SKM_sk_find_ex(SRP_gN_cache, (st), (val)) +# define sk_SRP_gN_cache_delete(st, i) SKM_sk_delete(SRP_gN_cache, (st), (i)) +# define sk_SRP_gN_cache_delete_ptr(st, ptr) SKM_sk_delete_ptr(SRP_gN_cache, (st), (ptr)) +# define sk_SRP_gN_cache_insert(st, val, i) SKM_sk_insert(SRP_gN_cache, (st), (val), (i)) +# define sk_SRP_gN_cache_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(SRP_gN_cache, (st), (cmp)) +# define sk_SRP_gN_cache_dup(st) SKM_sk_dup(SRP_gN_cache, st) +# define sk_SRP_gN_cache_pop_free(st, free_func) SKM_sk_pop_free(SRP_gN_cache, (st), (free_func)) +# define sk_SRP_gN_cache_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(SRP_gN_cache, (st), (copy_func), (free_func)) +# define sk_SRP_gN_cache_shift(st) SKM_sk_shift(SRP_gN_cache, (st)) +# define sk_SRP_gN_cache_pop(st) SKM_sk_pop(SRP_gN_cache, (st)) +# define sk_SRP_gN_cache_sort(st) SKM_sk_sort(SRP_gN_cache, (st)) +# define sk_SRP_gN_cache_is_sorted(st) SKM_sk_is_sorted(SRP_gN_cache, (st)) +# define sk_SRP_user_pwd_new(cmp) SKM_sk_new(SRP_user_pwd, (cmp)) +# define sk_SRP_user_pwd_new_null() SKM_sk_new_null(SRP_user_pwd) +# define sk_SRP_user_pwd_free(st) SKM_sk_free(SRP_user_pwd, (st)) +# define sk_SRP_user_pwd_num(st) SKM_sk_num(SRP_user_pwd, (st)) +# define sk_SRP_user_pwd_value(st, i) SKM_sk_value(SRP_user_pwd, (st), (i)) +# define sk_SRP_user_pwd_set(st, i, val) SKM_sk_set(SRP_user_pwd, (st), (i), (val)) +# define sk_SRP_user_pwd_zero(st) SKM_sk_zero(SRP_user_pwd, (st)) +# define sk_SRP_user_pwd_push(st, val) SKM_sk_push(SRP_user_pwd, (st), (val)) +# define sk_SRP_user_pwd_unshift(st, val) SKM_sk_unshift(SRP_user_pwd, (st), (val)) +# define sk_SRP_user_pwd_find(st, val) SKM_sk_find(SRP_user_pwd, (st), (val)) +# define sk_SRP_user_pwd_find_ex(st, val) SKM_sk_find_ex(SRP_user_pwd, (st), (val)) +# define sk_SRP_user_pwd_delete(st, i) SKM_sk_delete(SRP_user_pwd, (st), (i)) +# define sk_SRP_user_pwd_delete_ptr(st, ptr) SKM_sk_delete_ptr(SRP_user_pwd, (st), (ptr)) +# define sk_SRP_user_pwd_insert(st, val, i) SKM_sk_insert(SRP_user_pwd, (st), (val), (i)) +# define sk_SRP_user_pwd_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(SRP_user_pwd, (st), (cmp)) +# define sk_SRP_user_pwd_dup(st) SKM_sk_dup(SRP_user_pwd, st) +# define sk_SRP_user_pwd_pop_free(st, free_func) SKM_sk_pop_free(SRP_user_pwd, (st), (free_func)) +# define sk_SRP_user_pwd_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(SRP_user_pwd, (st), (copy_func), (free_func)) +# define sk_SRP_user_pwd_shift(st) SKM_sk_shift(SRP_user_pwd, (st)) +# define sk_SRP_user_pwd_pop(st) SKM_sk_pop(SRP_user_pwd, (st)) +# define sk_SRP_user_pwd_sort(st) SKM_sk_sort(SRP_user_pwd, (st)) +# define sk_SRP_user_pwd_is_sorted(st) SKM_sk_is_sorted(SRP_user_pwd, (st)) +# define sk_SRTP_PROTECTION_PROFILE_new(cmp) SKM_sk_new(SRTP_PROTECTION_PROFILE, (cmp)) +# define sk_SRTP_PROTECTION_PROFILE_new_null() SKM_sk_new_null(SRTP_PROTECTION_PROFILE) +# define sk_SRTP_PROTECTION_PROFILE_free(st) SKM_sk_free(SRTP_PROTECTION_PROFILE, (st)) +# define sk_SRTP_PROTECTION_PROFILE_num(st) SKM_sk_num(SRTP_PROTECTION_PROFILE, (st)) +# define sk_SRTP_PROTECTION_PROFILE_value(st, i) SKM_sk_value(SRTP_PROTECTION_PROFILE, (st), (i)) +# define sk_SRTP_PROTECTION_PROFILE_set(st, i, val) SKM_sk_set(SRTP_PROTECTION_PROFILE, (st), (i), (val)) +# define sk_SRTP_PROTECTION_PROFILE_zero(st) SKM_sk_zero(SRTP_PROTECTION_PROFILE, (st)) +# define sk_SRTP_PROTECTION_PROFILE_push(st, val) SKM_sk_push(SRTP_PROTECTION_PROFILE, (st), (val)) +# define sk_SRTP_PROTECTION_PROFILE_unshift(st, val) SKM_sk_unshift(SRTP_PROTECTION_PROFILE, (st), (val)) +# define sk_SRTP_PROTECTION_PROFILE_find(st, val) SKM_sk_find(SRTP_PROTECTION_PROFILE, (st), (val)) +# define sk_SRTP_PROTECTION_PROFILE_find_ex(st, val) SKM_sk_find_ex(SRTP_PROTECTION_PROFILE, (st), (val)) +# define sk_SRTP_PROTECTION_PROFILE_delete(st, i) SKM_sk_delete(SRTP_PROTECTION_PROFILE, (st), (i)) +# define sk_SRTP_PROTECTION_PROFILE_delete_ptr(st, ptr) SKM_sk_delete_ptr(SRTP_PROTECTION_PROFILE, (st), (ptr)) +# define sk_SRTP_PROTECTION_PROFILE_insert(st, val, i) SKM_sk_insert(SRTP_PROTECTION_PROFILE, (st), (val), (i)) +# define sk_SRTP_PROTECTION_PROFILE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(SRTP_PROTECTION_PROFILE, (st), (cmp)) +# define sk_SRTP_PROTECTION_PROFILE_dup(st) SKM_sk_dup(SRTP_PROTECTION_PROFILE, st) +# define sk_SRTP_PROTECTION_PROFILE_pop_free(st, free_func) SKM_sk_pop_free(SRTP_PROTECTION_PROFILE, (st), (free_func)) +# define sk_SRTP_PROTECTION_PROFILE_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(SRTP_PROTECTION_PROFILE, (st), (copy_func), (free_func)) +# define sk_SRTP_PROTECTION_PROFILE_shift(st) SKM_sk_shift(SRTP_PROTECTION_PROFILE, (st)) +# define sk_SRTP_PROTECTION_PROFILE_pop(st) SKM_sk_pop(SRTP_PROTECTION_PROFILE, (st)) +# define sk_SRTP_PROTECTION_PROFILE_sort(st) SKM_sk_sort(SRTP_PROTECTION_PROFILE, (st)) +# define sk_SRTP_PROTECTION_PROFILE_is_sorted(st) SKM_sk_is_sorted(SRTP_PROTECTION_PROFILE, (st)) +# define sk_SSL_CIPHER_new(cmp) SKM_sk_new(SSL_CIPHER, (cmp)) +# define sk_SSL_CIPHER_new_null() SKM_sk_new_null(SSL_CIPHER) +# define sk_SSL_CIPHER_free(st) SKM_sk_free(SSL_CIPHER, (st)) +# define sk_SSL_CIPHER_num(st) SKM_sk_num(SSL_CIPHER, (st)) +# define sk_SSL_CIPHER_value(st, i) SKM_sk_value(SSL_CIPHER, (st), (i)) +# define sk_SSL_CIPHER_set(st, i, val) SKM_sk_set(SSL_CIPHER, (st), (i), (val)) +# define sk_SSL_CIPHER_zero(st) SKM_sk_zero(SSL_CIPHER, (st)) +# define sk_SSL_CIPHER_push(st, val) SKM_sk_push(SSL_CIPHER, (st), (val)) +# define sk_SSL_CIPHER_unshift(st, val) SKM_sk_unshift(SSL_CIPHER, (st), (val)) +# define sk_SSL_CIPHER_find(st, val) SKM_sk_find(SSL_CIPHER, (st), (val)) +# define sk_SSL_CIPHER_find_ex(st, val) SKM_sk_find_ex(SSL_CIPHER, (st), (val)) +# define sk_SSL_CIPHER_delete(st, i) SKM_sk_delete(SSL_CIPHER, (st), (i)) +# define sk_SSL_CIPHER_delete_ptr(st, ptr) SKM_sk_delete_ptr(SSL_CIPHER, (st), (ptr)) +# define sk_SSL_CIPHER_insert(st, val, i) SKM_sk_insert(SSL_CIPHER, (st), (val), (i)) +# define sk_SSL_CIPHER_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(SSL_CIPHER, (st), (cmp)) +# define sk_SSL_CIPHER_dup(st) SKM_sk_dup(SSL_CIPHER, st) +# define sk_SSL_CIPHER_pop_free(st, free_func) SKM_sk_pop_free(SSL_CIPHER, (st), (free_func)) +# define sk_SSL_CIPHER_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(SSL_CIPHER, (st), (copy_func), (free_func)) +# define sk_SSL_CIPHER_shift(st) SKM_sk_shift(SSL_CIPHER, (st)) +# define sk_SSL_CIPHER_pop(st) SKM_sk_pop(SSL_CIPHER, (st)) +# define sk_SSL_CIPHER_sort(st) SKM_sk_sort(SSL_CIPHER, (st)) +# define sk_SSL_CIPHER_is_sorted(st) SKM_sk_is_sorted(SSL_CIPHER, (st)) +# define sk_SSL_COMP_new(cmp) SKM_sk_new(SSL_COMP, (cmp)) +# define sk_SSL_COMP_new_null() SKM_sk_new_null(SSL_COMP) +# define sk_SSL_COMP_free(st) SKM_sk_free(SSL_COMP, (st)) +# define sk_SSL_COMP_num(st) SKM_sk_num(SSL_COMP, (st)) +# define sk_SSL_COMP_value(st, i) SKM_sk_value(SSL_COMP, (st), (i)) +# define sk_SSL_COMP_set(st, i, val) SKM_sk_set(SSL_COMP, (st), (i), (val)) +# define sk_SSL_COMP_zero(st) SKM_sk_zero(SSL_COMP, (st)) +# define sk_SSL_COMP_push(st, val) SKM_sk_push(SSL_COMP, (st), (val)) +# define sk_SSL_COMP_unshift(st, val) SKM_sk_unshift(SSL_COMP, (st), (val)) +# define sk_SSL_COMP_find(st, val) SKM_sk_find(SSL_COMP, (st), (val)) +# define sk_SSL_COMP_find_ex(st, val) SKM_sk_find_ex(SSL_COMP, (st), (val)) +# define sk_SSL_COMP_delete(st, i) SKM_sk_delete(SSL_COMP, (st), (i)) +# define sk_SSL_COMP_delete_ptr(st, ptr) SKM_sk_delete_ptr(SSL_COMP, (st), (ptr)) +# define sk_SSL_COMP_insert(st, val, i) SKM_sk_insert(SSL_COMP, (st), (val), (i)) +# define sk_SSL_COMP_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(SSL_COMP, (st), (cmp)) +# define sk_SSL_COMP_dup(st) SKM_sk_dup(SSL_COMP, st) +# define sk_SSL_COMP_pop_free(st, free_func) SKM_sk_pop_free(SSL_COMP, (st), (free_func)) +# define sk_SSL_COMP_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(SSL_COMP, (st), (copy_func), (free_func)) +# define sk_SSL_COMP_shift(st) SKM_sk_shift(SSL_COMP, (st)) +# define sk_SSL_COMP_pop(st) SKM_sk_pop(SSL_COMP, (st)) +# define sk_SSL_COMP_sort(st) SKM_sk_sort(SSL_COMP, (st)) +# define sk_SSL_COMP_is_sorted(st) SKM_sk_is_sorted(SSL_COMP, (st)) +# define sk_STACK_OF_X509_NAME_ENTRY_new(cmp) SKM_sk_new(STACK_OF_X509_NAME_ENTRY, (cmp)) +# define sk_STACK_OF_X509_NAME_ENTRY_new_null() SKM_sk_new_null(STACK_OF_X509_NAME_ENTRY) +# define sk_STACK_OF_X509_NAME_ENTRY_free(st) SKM_sk_free(STACK_OF_X509_NAME_ENTRY, (st)) +# define sk_STACK_OF_X509_NAME_ENTRY_num(st) SKM_sk_num(STACK_OF_X509_NAME_ENTRY, (st)) +# define sk_STACK_OF_X509_NAME_ENTRY_value(st, i) SKM_sk_value(STACK_OF_X509_NAME_ENTRY, (st), (i)) +# define sk_STACK_OF_X509_NAME_ENTRY_set(st, i, val) SKM_sk_set(STACK_OF_X509_NAME_ENTRY, (st), (i), (val)) +# define sk_STACK_OF_X509_NAME_ENTRY_zero(st) SKM_sk_zero(STACK_OF_X509_NAME_ENTRY, (st)) +# define sk_STACK_OF_X509_NAME_ENTRY_push(st, val) SKM_sk_push(STACK_OF_X509_NAME_ENTRY, (st), (val)) +# define sk_STACK_OF_X509_NAME_ENTRY_unshift(st, val) SKM_sk_unshift(STACK_OF_X509_NAME_ENTRY, (st), (val)) +# define sk_STACK_OF_X509_NAME_ENTRY_find(st, val) SKM_sk_find(STACK_OF_X509_NAME_ENTRY, (st), (val)) +# define sk_STACK_OF_X509_NAME_ENTRY_find_ex(st, val) SKM_sk_find_ex(STACK_OF_X509_NAME_ENTRY, (st), (val)) +# define sk_STACK_OF_X509_NAME_ENTRY_delete(st, i) SKM_sk_delete(STACK_OF_X509_NAME_ENTRY, (st), (i)) +# define sk_STACK_OF_X509_NAME_ENTRY_delete_ptr(st, ptr) SKM_sk_delete_ptr(STACK_OF_X509_NAME_ENTRY, (st), (ptr)) +# define sk_STACK_OF_X509_NAME_ENTRY_insert(st, val, i) SKM_sk_insert(STACK_OF_X509_NAME_ENTRY, (st), (val), (i)) +# define sk_STACK_OF_X509_NAME_ENTRY_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(STACK_OF_X509_NAME_ENTRY, (st), (cmp)) +# define sk_STACK_OF_X509_NAME_ENTRY_dup(st) SKM_sk_dup(STACK_OF_X509_NAME_ENTRY, st) +# define sk_STACK_OF_X509_NAME_ENTRY_pop_free(st, free_func) SKM_sk_pop_free(STACK_OF_X509_NAME_ENTRY, (st), (free_func)) +# define sk_STACK_OF_X509_NAME_ENTRY_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(STACK_OF_X509_NAME_ENTRY, (st), (copy_func), (free_func)) +# define sk_STACK_OF_X509_NAME_ENTRY_shift(st) SKM_sk_shift(STACK_OF_X509_NAME_ENTRY, (st)) +# define sk_STACK_OF_X509_NAME_ENTRY_pop(st) SKM_sk_pop(STACK_OF_X509_NAME_ENTRY, (st)) +# define sk_STACK_OF_X509_NAME_ENTRY_sort(st) SKM_sk_sort(STACK_OF_X509_NAME_ENTRY, (st)) +# define sk_STACK_OF_X509_NAME_ENTRY_is_sorted(st) SKM_sk_is_sorted(STACK_OF_X509_NAME_ENTRY, (st)) +# define sk_STORE_ATTR_INFO_new(cmp) SKM_sk_new(STORE_ATTR_INFO, (cmp)) +# define sk_STORE_ATTR_INFO_new_null() SKM_sk_new_null(STORE_ATTR_INFO) +# define sk_STORE_ATTR_INFO_free(st) SKM_sk_free(STORE_ATTR_INFO, (st)) +# define sk_STORE_ATTR_INFO_num(st) SKM_sk_num(STORE_ATTR_INFO, (st)) +# define sk_STORE_ATTR_INFO_value(st, i) SKM_sk_value(STORE_ATTR_INFO, (st), (i)) +# define sk_STORE_ATTR_INFO_set(st, i, val) SKM_sk_set(STORE_ATTR_INFO, (st), (i), (val)) +# define sk_STORE_ATTR_INFO_zero(st) SKM_sk_zero(STORE_ATTR_INFO, (st)) +# define sk_STORE_ATTR_INFO_push(st, val) SKM_sk_push(STORE_ATTR_INFO, (st), (val)) +# define sk_STORE_ATTR_INFO_unshift(st, val) SKM_sk_unshift(STORE_ATTR_INFO, (st), (val)) +# define sk_STORE_ATTR_INFO_find(st, val) SKM_sk_find(STORE_ATTR_INFO, (st), (val)) +# define sk_STORE_ATTR_INFO_find_ex(st, val) SKM_sk_find_ex(STORE_ATTR_INFO, (st), (val)) +# define sk_STORE_ATTR_INFO_delete(st, i) SKM_sk_delete(STORE_ATTR_INFO, (st), (i)) +# define sk_STORE_ATTR_INFO_delete_ptr(st, ptr) SKM_sk_delete_ptr(STORE_ATTR_INFO, (st), (ptr)) +# define sk_STORE_ATTR_INFO_insert(st, val, i) SKM_sk_insert(STORE_ATTR_INFO, (st), (val), (i)) +# define sk_STORE_ATTR_INFO_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(STORE_ATTR_INFO, (st), (cmp)) +# define sk_STORE_ATTR_INFO_dup(st) SKM_sk_dup(STORE_ATTR_INFO, st) +# define sk_STORE_ATTR_INFO_pop_free(st, free_func) SKM_sk_pop_free(STORE_ATTR_INFO, (st), (free_func)) +# define sk_STORE_ATTR_INFO_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(STORE_ATTR_INFO, (st), (copy_func), (free_func)) +# define sk_STORE_ATTR_INFO_shift(st) SKM_sk_shift(STORE_ATTR_INFO, (st)) +# define sk_STORE_ATTR_INFO_pop(st) SKM_sk_pop(STORE_ATTR_INFO, (st)) +# define sk_STORE_ATTR_INFO_sort(st) SKM_sk_sort(STORE_ATTR_INFO, (st)) +# define sk_STORE_ATTR_INFO_is_sorted(st) SKM_sk_is_sorted(STORE_ATTR_INFO, (st)) +# define sk_STORE_OBJECT_new(cmp) SKM_sk_new(STORE_OBJECT, (cmp)) +# define sk_STORE_OBJECT_new_null() SKM_sk_new_null(STORE_OBJECT) +# define sk_STORE_OBJECT_free(st) SKM_sk_free(STORE_OBJECT, (st)) +# define sk_STORE_OBJECT_num(st) SKM_sk_num(STORE_OBJECT, (st)) +# define sk_STORE_OBJECT_value(st, i) SKM_sk_value(STORE_OBJECT, (st), (i)) +# define sk_STORE_OBJECT_set(st, i, val) SKM_sk_set(STORE_OBJECT, (st), (i), (val)) +# define sk_STORE_OBJECT_zero(st) SKM_sk_zero(STORE_OBJECT, (st)) +# define sk_STORE_OBJECT_push(st, val) SKM_sk_push(STORE_OBJECT, (st), (val)) +# define sk_STORE_OBJECT_unshift(st, val) SKM_sk_unshift(STORE_OBJECT, (st), (val)) +# define sk_STORE_OBJECT_find(st, val) SKM_sk_find(STORE_OBJECT, (st), (val)) +# define sk_STORE_OBJECT_find_ex(st, val) SKM_sk_find_ex(STORE_OBJECT, (st), (val)) +# define sk_STORE_OBJECT_delete(st, i) SKM_sk_delete(STORE_OBJECT, (st), (i)) +# define sk_STORE_OBJECT_delete_ptr(st, ptr) SKM_sk_delete_ptr(STORE_OBJECT, (st), (ptr)) +# define sk_STORE_OBJECT_insert(st, val, i) SKM_sk_insert(STORE_OBJECT, (st), (val), (i)) +# define sk_STORE_OBJECT_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(STORE_OBJECT, (st), (cmp)) +# define sk_STORE_OBJECT_dup(st) SKM_sk_dup(STORE_OBJECT, st) +# define sk_STORE_OBJECT_pop_free(st, free_func) SKM_sk_pop_free(STORE_OBJECT, (st), (free_func)) +# define sk_STORE_OBJECT_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(STORE_OBJECT, (st), (copy_func), (free_func)) +# define sk_STORE_OBJECT_shift(st) SKM_sk_shift(STORE_OBJECT, (st)) +# define sk_STORE_OBJECT_pop(st) SKM_sk_pop(STORE_OBJECT, (st)) +# define sk_STORE_OBJECT_sort(st) SKM_sk_sort(STORE_OBJECT, (st)) +# define sk_STORE_OBJECT_is_sorted(st) SKM_sk_is_sorted(STORE_OBJECT, (st)) +# define sk_SXNETID_new(cmp) SKM_sk_new(SXNETID, (cmp)) +# define sk_SXNETID_new_null() SKM_sk_new_null(SXNETID) +# define sk_SXNETID_free(st) SKM_sk_free(SXNETID, (st)) +# define sk_SXNETID_num(st) SKM_sk_num(SXNETID, (st)) +# define sk_SXNETID_value(st, i) SKM_sk_value(SXNETID, (st), (i)) +# define sk_SXNETID_set(st, i, val) SKM_sk_set(SXNETID, (st), (i), (val)) +# define sk_SXNETID_zero(st) SKM_sk_zero(SXNETID, (st)) +# define sk_SXNETID_push(st, val) SKM_sk_push(SXNETID, (st), (val)) +# define sk_SXNETID_unshift(st, val) SKM_sk_unshift(SXNETID, (st), (val)) +# define sk_SXNETID_find(st, val) SKM_sk_find(SXNETID, (st), (val)) +# define sk_SXNETID_find_ex(st, val) SKM_sk_find_ex(SXNETID, (st), (val)) +# define sk_SXNETID_delete(st, i) SKM_sk_delete(SXNETID, (st), (i)) +# define sk_SXNETID_delete_ptr(st, ptr) SKM_sk_delete_ptr(SXNETID, (st), (ptr)) +# define sk_SXNETID_insert(st, val, i) SKM_sk_insert(SXNETID, (st), (val), (i)) +# define sk_SXNETID_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(SXNETID, (st), (cmp)) +# define sk_SXNETID_dup(st) SKM_sk_dup(SXNETID, st) +# define sk_SXNETID_pop_free(st, free_func) SKM_sk_pop_free(SXNETID, (st), (free_func)) +# define sk_SXNETID_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(SXNETID, (st), (copy_func), (free_func)) +# define sk_SXNETID_shift(st) SKM_sk_shift(SXNETID, (st)) +# define sk_SXNETID_pop(st) SKM_sk_pop(SXNETID, (st)) +# define sk_SXNETID_sort(st) SKM_sk_sort(SXNETID, (st)) +# define sk_SXNETID_is_sorted(st) SKM_sk_is_sorted(SXNETID, (st)) +# define sk_UI_STRING_new(cmp) SKM_sk_new(UI_STRING, (cmp)) +# define sk_UI_STRING_new_null() SKM_sk_new_null(UI_STRING) +# define sk_UI_STRING_free(st) SKM_sk_free(UI_STRING, (st)) +# define sk_UI_STRING_num(st) SKM_sk_num(UI_STRING, (st)) +# define sk_UI_STRING_value(st, i) SKM_sk_value(UI_STRING, (st), (i)) +# define sk_UI_STRING_set(st, i, val) SKM_sk_set(UI_STRING, (st), (i), (val)) +# define sk_UI_STRING_zero(st) SKM_sk_zero(UI_STRING, (st)) +# define sk_UI_STRING_push(st, val) SKM_sk_push(UI_STRING, (st), (val)) +# define sk_UI_STRING_unshift(st, val) SKM_sk_unshift(UI_STRING, (st), (val)) +# define sk_UI_STRING_find(st, val) SKM_sk_find(UI_STRING, (st), (val)) +# define sk_UI_STRING_find_ex(st, val) SKM_sk_find_ex(UI_STRING, (st), (val)) +# define sk_UI_STRING_delete(st, i) SKM_sk_delete(UI_STRING, (st), (i)) +# define sk_UI_STRING_delete_ptr(st, ptr) SKM_sk_delete_ptr(UI_STRING, (st), (ptr)) +# define sk_UI_STRING_insert(st, val, i) SKM_sk_insert(UI_STRING, (st), (val), (i)) +# define sk_UI_STRING_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(UI_STRING, (st), (cmp)) +# define sk_UI_STRING_dup(st) SKM_sk_dup(UI_STRING, st) +# define sk_UI_STRING_pop_free(st, free_func) SKM_sk_pop_free(UI_STRING, (st), (free_func)) +# define sk_UI_STRING_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(UI_STRING, (st), (copy_func), (free_func)) +# define sk_UI_STRING_shift(st) SKM_sk_shift(UI_STRING, (st)) +# define sk_UI_STRING_pop(st) SKM_sk_pop(UI_STRING, (st)) +# define sk_UI_STRING_sort(st) SKM_sk_sort(UI_STRING, (st)) +# define sk_UI_STRING_is_sorted(st) SKM_sk_is_sorted(UI_STRING, (st)) +# define sk_X509_new(cmp) SKM_sk_new(X509, (cmp)) +# define sk_X509_new_null() SKM_sk_new_null(X509) +# define sk_X509_free(st) SKM_sk_free(X509, (st)) +# define sk_X509_num(st) SKM_sk_num(X509, (st)) +# define sk_X509_value(st, i) SKM_sk_value(X509, (st), (i)) +# define sk_X509_set(st, i, val) SKM_sk_set(X509, (st), (i), (val)) +# define sk_X509_zero(st) SKM_sk_zero(X509, (st)) +# define sk_X509_push(st, val) SKM_sk_push(X509, (st), (val)) +# define sk_X509_unshift(st, val) SKM_sk_unshift(X509, (st), (val)) +# define sk_X509_find(st, val) SKM_sk_find(X509, (st), (val)) +# define sk_X509_find_ex(st, val) SKM_sk_find_ex(X509, (st), (val)) +# define sk_X509_delete(st, i) SKM_sk_delete(X509, (st), (i)) +# define sk_X509_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509, (st), (ptr)) +# define sk_X509_insert(st, val, i) SKM_sk_insert(X509, (st), (val), (i)) +# define sk_X509_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509, (st), (cmp)) +# define sk_X509_dup(st) SKM_sk_dup(X509, st) +# define sk_X509_pop_free(st, free_func) SKM_sk_pop_free(X509, (st), (free_func)) +# define sk_X509_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509, (st), (copy_func), (free_func)) +# define sk_X509_shift(st) SKM_sk_shift(X509, (st)) +# define sk_X509_pop(st) SKM_sk_pop(X509, (st)) +# define sk_X509_sort(st) SKM_sk_sort(X509, (st)) +# define sk_X509_is_sorted(st) SKM_sk_is_sorted(X509, (st)) +# define sk_X509V3_EXT_METHOD_new(cmp) SKM_sk_new(X509V3_EXT_METHOD, (cmp)) +# define sk_X509V3_EXT_METHOD_new_null() SKM_sk_new_null(X509V3_EXT_METHOD) +# define sk_X509V3_EXT_METHOD_free(st) SKM_sk_free(X509V3_EXT_METHOD, (st)) +# define sk_X509V3_EXT_METHOD_num(st) SKM_sk_num(X509V3_EXT_METHOD, (st)) +# define sk_X509V3_EXT_METHOD_value(st, i) SKM_sk_value(X509V3_EXT_METHOD, (st), (i)) +# define sk_X509V3_EXT_METHOD_set(st, i, val) SKM_sk_set(X509V3_EXT_METHOD, (st), (i), (val)) +# define sk_X509V3_EXT_METHOD_zero(st) SKM_sk_zero(X509V3_EXT_METHOD, (st)) +# define sk_X509V3_EXT_METHOD_push(st, val) SKM_sk_push(X509V3_EXT_METHOD, (st), (val)) +# define sk_X509V3_EXT_METHOD_unshift(st, val) SKM_sk_unshift(X509V3_EXT_METHOD, (st), (val)) +# define sk_X509V3_EXT_METHOD_find(st, val) SKM_sk_find(X509V3_EXT_METHOD, (st), (val)) +# define sk_X509V3_EXT_METHOD_find_ex(st, val) SKM_sk_find_ex(X509V3_EXT_METHOD, (st), (val)) +# define sk_X509V3_EXT_METHOD_delete(st, i) SKM_sk_delete(X509V3_EXT_METHOD, (st), (i)) +# define sk_X509V3_EXT_METHOD_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509V3_EXT_METHOD, (st), (ptr)) +# define sk_X509V3_EXT_METHOD_insert(st, val, i) SKM_sk_insert(X509V3_EXT_METHOD, (st), (val), (i)) +# define sk_X509V3_EXT_METHOD_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509V3_EXT_METHOD, (st), (cmp)) +# define sk_X509V3_EXT_METHOD_dup(st) SKM_sk_dup(X509V3_EXT_METHOD, st) +# define sk_X509V3_EXT_METHOD_pop_free(st, free_func) SKM_sk_pop_free(X509V3_EXT_METHOD, (st), (free_func)) +# define sk_X509V3_EXT_METHOD_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509V3_EXT_METHOD, (st), (copy_func), (free_func)) +# define sk_X509V3_EXT_METHOD_shift(st) SKM_sk_shift(X509V3_EXT_METHOD, (st)) +# define sk_X509V3_EXT_METHOD_pop(st) SKM_sk_pop(X509V3_EXT_METHOD, (st)) +# define sk_X509V3_EXT_METHOD_sort(st) SKM_sk_sort(X509V3_EXT_METHOD, (st)) +# define sk_X509V3_EXT_METHOD_is_sorted(st) SKM_sk_is_sorted(X509V3_EXT_METHOD, (st)) +# define sk_X509_ALGOR_new(cmp) SKM_sk_new(X509_ALGOR, (cmp)) +# define sk_X509_ALGOR_new_null() SKM_sk_new_null(X509_ALGOR) +# define sk_X509_ALGOR_free(st) SKM_sk_free(X509_ALGOR, (st)) +# define sk_X509_ALGOR_num(st) SKM_sk_num(X509_ALGOR, (st)) +# define sk_X509_ALGOR_value(st, i) SKM_sk_value(X509_ALGOR, (st), (i)) +# define sk_X509_ALGOR_set(st, i, val) SKM_sk_set(X509_ALGOR, (st), (i), (val)) +# define sk_X509_ALGOR_zero(st) SKM_sk_zero(X509_ALGOR, (st)) +# define sk_X509_ALGOR_push(st, val) SKM_sk_push(X509_ALGOR, (st), (val)) +# define sk_X509_ALGOR_unshift(st, val) SKM_sk_unshift(X509_ALGOR, (st), (val)) +# define sk_X509_ALGOR_find(st, val) SKM_sk_find(X509_ALGOR, (st), (val)) +# define sk_X509_ALGOR_find_ex(st, val) SKM_sk_find_ex(X509_ALGOR, (st), (val)) +# define sk_X509_ALGOR_delete(st, i) SKM_sk_delete(X509_ALGOR, (st), (i)) +# define sk_X509_ALGOR_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_ALGOR, (st), (ptr)) +# define sk_X509_ALGOR_insert(st, val, i) SKM_sk_insert(X509_ALGOR, (st), (val), (i)) +# define sk_X509_ALGOR_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_ALGOR, (st), (cmp)) +# define sk_X509_ALGOR_dup(st) SKM_sk_dup(X509_ALGOR, st) +# define sk_X509_ALGOR_pop_free(st, free_func) SKM_sk_pop_free(X509_ALGOR, (st), (free_func)) +# define sk_X509_ALGOR_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_ALGOR, (st), (copy_func), (free_func)) +# define sk_X509_ALGOR_shift(st) SKM_sk_shift(X509_ALGOR, (st)) +# define sk_X509_ALGOR_pop(st) SKM_sk_pop(X509_ALGOR, (st)) +# define sk_X509_ALGOR_sort(st) SKM_sk_sort(X509_ALGOR, (st)) +# define sk_X509_ALGOR_is_sorted(st) SKM_sk_is_sorted(X509_ALGOR, (st)) +# define sk_X509_ATTRIBUTE_new(cmp) SKM_sk_new(X509_ATTRIBUTE, (cmp)) +# define sk_X509_ATTRIBUTE_new_null() SKM_sk_new_null(X509_ATTRIBUTE) +# define sk_X509_ATTRIBUTE_free(st) SKM_sk_free(X509_ATTRIBUTE, (st)) +# define sk_X509_ATTRIBUTE_num(st) SKM_sk_num(X509_ATTRIBUTE, (st)) +# define sk_X509_ATTRIBUTE_value(st, i) SKM_sk_value(X509_ATTRIBUTE, (st), (i)) +# define sk_X509_ATTRIBUTE_set(st, i, val) SKM_sk_set(X509_ATTRIBUTE, (st), (i), (val)) +# define sk_X509_ATTRIBUTE_zero(st) SKM_sk_zero(X509_ATTRIBUTE, (st)) +# define sk_X509_ATTRIBUTE_push(st, val) SKM_sk_push(X509_ATTRIBUTE, (st), (val)) +# define sk_X509_ATTRIBUTE_unshift(st, val) SKM_sk_unshift(X509_ATTRIBUTE, (st), (val)) +# define sk_X509_ATTRIBUTE_find(st, val) SKM_sk_find(X509_ATTRIBUTE, (st), (val)) +# define sk_X509_ATTRIBUTE_find_ex(st, val) SKM_sk_find_ex(X509_ATTRIBUTE, (st), (val)) +# define sk_X509_ATTRIBUTE_delete(st, i) SKM_sk_delete(X509_ATTRIBUTE, (st), (i)) +# define sk_X509_ATTRIBUTE_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_ATTRIBUTE, (st), (ptr)) +# define sk_X509_ATTRIBUTE_insert(st, val, i) SKM_sk_insert(X509_ATTRIBUTE, (st), (val), (i)) +# define sk_X509_ATTRIBUTE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_ATTRIBUTE, (st), (cmp)) +# define sk_X509_ATTRIBUTE_dup(st) SKM_sk_dup(X509_ATTRIBUTE, st) +# define sk_X509_ATTRIBUTE_pop_free(st, free_func) SKM_sk_pop_free(X509_ATTRIBUTE, (st), (free_func)) +# define sk_X509_ATTRIBUTE_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_ATTRIBUTE, (st), (copy_func), (free_func)) +# define sk_X509_ATTRIBUTE_shift(st) SKM_sk_shift(X509_ATTRIBUTE, (st)) +# define sk_X509_ATTRIBUTE_pop(st) SKM_sk_pop(X509_ATTRIBUTE, (st)) +# define sk_X509_ATTRIBUTE_sort(st) SKM_sk_sort(X509_ATTRIBUTE, (st)) +# define sk_X509_ATTRIBUTE_is_sorted(st) SKM_sk_is_sorted(X509_ATTRIBUTE, (st)) +# define sk_X509_CRL_new(cmp) SKM_sk_new(X509_CRL, (cmp)) +# define sk_X509_CRL_new_null() SKM_sk_new_null(X509_CRL) +# define sk_X509_CRL_free(st) SKM_sk_free(X509_CRL, (st)) +# define sk_X509_CRL_num(st) SKM_sk_num(X509_CRL, (st)) +# define sk_X509_CRL_value(st, i) SKM_sk_value(X509_CRL, (st), (i)) +# define sk_X509_CRL_set(st, i, val) SKM_sk_set(X509_CRL, (st), (i), (val)) +# define sk_X509_CRL_zero(st) SKM_sk_zero(X509_CRL, (st)) +# define sk_X509_CRL_push(st, val) SKM_sk_push(X509_CRL, (st), (val)) +# define sk_X509_CRL_unshift(st, val) SKM_sk_unshift(X509_CRL, (st), (val)) +# define sk_X509_CRL_find(st, val) SKM_sk_find(X509_CRL, (st), (val)) +# define sk_X509_CRL_find_ex(st, val) SKM_sk_find_ex(X509_CRL, (st), (val)) +# define sk_X509_CRL_delete(st, i) SKM_sk_delete(X509_CRL, (st), (i)) +# define sk_X509_CRL_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_CRL, (st), (ptr)) +# define sk_X509_CRL_insert(st, val, i) SKM_sk_insert(X509_CRL, (st), (val), (i)) +# define sk_X509_CRL_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_CRL, (st), (cmp)) +# define sk_X509_CRL_dup(st) SKM_sk_dup(X509_CRL, st) +# define sk_X509_CRL_pop_free(st, free_func) SKM_sk_pop_free(X509_CRL, (st), (free_func)) +# define sk_X509_CRL_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_CRL, (st), (copy_func), (free_func)) +# define sk_X509_CRL_shift(st) SKM_sk_shift(X509_CRL, (st)) +# define sk_X509_CRL_pop(st) SKM_sk_pop(X509_CRL, (st)) +# define sk_X509_CRL_sort(st) SKM_sk_sort(X509_CRL, (st)) +# define sk_X509_CRL_is_sorted(st) SKM_sk_is_sorted(X509_CRL, (st)) +# define sk_X509_EXTENSION_new(cmp) SKM_sk_new(X509_EXTENSION, (cmp)) +# define sk_X509_EXTENSION_new_null() SKM_sk_new_null(X509_EXTENSION) +# define sk_X509_EXTENSION_free(st) SKM_sk_free(X509_EXTENSION, (st)) +# define sk_X509_EXTENSION_num(st) SKM_sk_num(X509_EXTENSION, (st)) +# define sk_X509_EXTENSION_value(st, i) SKM_sk_value(X509_EXTENSION, (st), (i)) +# define sk_X509_EXTENSION_set(st, i, val) SKM_sk_set(X509_EXTENSION, (st), (i), (val)) +# define sk_X509_EXTENSION_zero(st) SKM_sk_zero(X509_EXTENSION, (st)) +# define sk_X509_EXTENSION_push(st, val) SKM_sk_push(X509_EXTENSION, (st), (val)) +# define sk_X509_EXTENSION_unshift(st, val) SKM_sk_unshift(X509_EXTENSION, (st), (val)) +# define sk_X509_EXTENSION_find(st, val) SKM_sk_find(X509_EXTENSION, (st), (val)) +# define sk_X509_EXTENSION_find_ex(st, val) SKM_sk_find_ex(X509_EXTENSION, (st), (val)) +# define sk_X509_EXTENSION_delete(st, i) SKM_sk_delete(X509_EXTENSION, (st), (i)) +# define sk_X509_EXTENSION_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_EXTENSION, (st), (ptr)) +# define sk_X509_EXTENSION_insert(st, val, i) SKM_sk_insert(X509_EXTENSION, (st), (val), (i)) +# define sk_X509_EXTENSION_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_EXTENSION, (st), (cmp)) +# define sk_X509_EXTENSION_dup(st) SKM_sk_dup(X509_EXTENSION, st) +# define sk_X509_EXTENSION_pop_free(st, free_func) SKM_sk_pop_free(X509_EXTENSION, (st), (free_func)) +# define sk_X509_EXTENSION_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_EXTENSION, (st), (copy_func), (free_func)) +# define sk_X509_EXTENSION_shift(st) SKM_sk_shift(X509_EXTENSION, (st)) +# define sk_X509_EXTENSION_pop(st) SKM_sk_pop(X509_EXTENSION, (st)) +# define sk_X509_EXTENSION_sort(st) SKM_sk_sort(X509_EXTENSION, (st)) +# define sk_X509_EXTENSION_is_sorted(st) SKM_sk_is_sorted(X509_EXTENSION, (st)) +# define sk_X509_INFO_new(cmp) SKM_sk_new(X509_INFO, (cmp)) +# define sk_X509_INFO_new_null() SKM_sk_new_null(X509_INFO) +# define sk_X509_INFO_free(st) SKM_sk_free(X509_INFO, (st)) +# define sk_X509_INFO_num(st) SKM_sk_num(X509_INFO, (st)) +# define sk_X509_INFO_value(st, i) SKM_sk_value(X509_INFO, (st), (i)) +# define sk_X509_INFO_set(st, i, val) SKM_sk_set(X509_INFO, (st), (i), (val)) +# define sk_X509_INFO_zero(st) SKM_sk_zero(X509_INFO, (st)) +# define sk_X509_INFO_push(st, val) SKM_sk_push(X509_INFO, (st), (val)) +# define sk_X509_INFO_unshift(st, val) SKM_sk_unshift(X509_INFO, (st), (val)) +# define sk_X509_INFO_find(st, val) SKM_sk_find(X509_INFO, (st), (val)) +# define sk_X509_INFO_find_ex(st, val) SKM_sk_find_ex(X509_INFO, (st), (val)) +# define sk_X509_INFO_delete(st, i) SKM_sk_delete(X509_INFO, (st), (i)) +# define sk_X509_INFO_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_INFO, (st), (ptr)) +# define sk_X509_INFO_insert(st, val, i) SKM_sk_insert(X509_INFO, (st), (val), (i)) +# define sk_X509_INFO_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_INFO, (st), (cmp)) +# define sk_X509_INFO_dup(st) SKM_sk_dup(X509_INFO, st) +# define sk_X509_INFO_pop_free(st, free_func) SKM_sk_pop_free(X509_INFO, (st), (free_func)) +# define sk_X509_INFO_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_INFO, (st), (copy_func), (free_func)) +# define sk_X509_INFO_shift(st) SKM_sk_shift(X509_INFO, (st)) +# define sk_X509_INFO_pop(st) SKM_sk_pop(X509_INFO, (st)) +# define sk_X509_INFO_sort(st) SKM_sk_sort(X509_INFO, (st)) +# define sk_X509_INFO_is_sorted(st) SKM_sk_is_sorted(X509_INFO, (st)) +# define sk_X509_LOOKUP_new(cmp) SKM_sk_new(X509_LOOKUP, (cmp)) +# define sk_X509_LOOKUP_new_null() SKM_sk_new_null(X509_LOOKUP) +# define sk_X509_LOOKUP_free(st) SKM_sk_free(X509_LOOKUP, (st)) +# define sk_X509_LOOKUP_num(st) SKM_sk_num(X509_LOOKUP, (st)) +# define sk_X509_LOOKUP_value(st, i) SKM_sk_value(X509_LOOKUP, (st), (i)) +# define sk_X509_LOOKUP_set(st, i, val) SKM_sk_set(X509_LOOKUP, (st), (i), (val)) +# define sk_X509_LOOKUP_zero(st) SKM_sk_zero(X509_LOOKUP, (st)) +# define sk_X509_LOOKUP_push(st, val) SKM_sk_push(X509_LOOKUP, (st), (val)) +# define sk_X509_LOOKUP_unshift(st, val) SKM_sk_unshift(X509_LOOKUP, (st), (val)) +# define sk_X509_LOOKUP_find(st, val) SKM_sk_find(X509_LOOKUP, (st), (val)) +# define sk_X509_LOOKUP_find_ex(st, val) SKM_sk_find_ex(X509_LOOKUP, (st), (val)) +# define sk_X509_LOOKUP_delete(st, i) SKM_sk_delete(X509_LOOKUP, (st), (i)) +# define sk_X509_LOOKUP_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_LOOKUP, (st), (ptr)) +# define sk_X509_LOOKUP_insert(st, val, i) SKM_sk_insert(X509_LOOKUP, (st), (val), (i)) +# define sk_X509_LOOKUP_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_LOOKUP, (st), (cmp)) +# define sk_X509_LOOKUP_dup(st) SKM_sk_dup(X509_LOOKUP, st) +# define sk_X509_LOOKUP_pop_free(st, free_func) SKM_sk_pop_free(X509_LOOKUP, (st), (free_func)) +# define sk_X509_LOOKUP_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_LOOKUP, (st), (copy_func), (free_func)) +# define sk_X509_LOOKUP_shift(st) SKM_sk_shift(X509_LOOKUP, (st)) +# define sk_X509_LOOKUP_pop(st) SKM_sk_pop(X509_LOOKUP, (st)) +# define sk_X509_LOOKUP_sort(st) SKM_sk_sort(X509_LOOKUP, (st)) +# define sk_X509_LOOKUP_is_sorted(st) SKM_sk_is_sorted(X509_LOOKUP, (st)) +# define sk_X509_NAME_new(cmp) SKM_sk_new(X509_NAME, (cmp)) +# define sk_X509_NAME_new_null() SKM_sk_new_null(X509_NAME) +# define sk_X509_NAME_free(st) SKM_sk_free(X509_NAME, (st)) +# define sk_X509_NAME_num(st) SKM_sk_num(X509_NAME, (st)) +# define sk_X509_NAME_value(st, i) SKM_sk_value(X509_NAME, (st), (i)) +# define sk_X509_NAME_set(st, i, val) SKM_sk_set(X509_NAME, (st), (i), (val)) +# define sk_X509_NAME_zero(st) SKM_sk_zero(X509_NAME, (st)) +# define sk_X509_NAME_push(st, val) SKM_sk_push(X509_NAME, (st), (val)) +# define sk_X509_NAME_unshift(st, val) SKM_sk_unshift(X509_NAME, (st), (val)) +# define sk_X509_NAME_find(st, val) SKM_sk_find(X509_NAME, (st), (val)) +# define sk_X509_NAME_find_ex(st, val) SKM_sk_find_ex(X509_NAME, (st), (val)) +# define sk_X509_NAME_delete(st, i) SKM_sk_delete(X509_NAME, (st), (i)) +# define sk_X509_NAME_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_NAME, (st), (ptr)) +# define sk_X509_NAME_insert(st, val, i) SKM_sk_insert(X509_NAME, (st), (val), (i)) +# define sk_X509_NAME_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_NAME, (st), (cmp)) +# define sk_X509_NAME_dup(st) SKM_sk_dup(X509_NAME, st) +# define sk_X509_NAME_pop_free(st, free_func) SKM_sk_pop_free(X509_NAME, (st), (free_func)) +# define sk_X509_NAME_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_NAME, (st), (copy_func), (free_func)) +# define sk_X509_NAME_shift(st) SKM_sk_shift(X509_NAME, (st)) +# define sk_X509_NAME_pop(st) SKM_sk_pop(X509_NAME, (st)) +# define sk_X509_NAME_sort(st) SKM_sk_sort(X509_NAME, (st)) +# define sk_X509_NAME_is_sorted(st) SKM_sk_is_sorted(X509_NAME, (st)) +# define sk_X509_NAME_ENTRY_new(cmp) SKM_sk_new(X509_NAME_ENTRY, (cmp)) +# define sk_X509_NAME_ENTRY_new_null() SKM_sk_new_null(X509_NAME_ENTRY) +# define sk_X509_NAME_ENTRY_free(st) SKM_sk_free(X509_NAME_ENTRY, (st)) +# define sk_X509_NAME_ENTRY_num(st) SKM_sk_num(X509_NAME_ENTRY, (st)) +# define sk_X509_NAME_ENTRY_value(st, i) SKM_sk_value(X509_NAME_ENTRY, (st), (i)) +# define sk_X509_NAME_ENTRY_set(st, i, val) SKM_sk_set(X509_NAME_ENTRY, (st), (i), (val)) +# define sk_X509_NAME_ENTRY_zero(st) SKM_sk_zero(X509_NAME_ENTRY, (st)) +# define sk_X509_NAME_ENTRY_push(st, val) SKM_sk_push(X509_NAME_ENTRY, (st), (val)) +# define sk_X509_NAME_ENTRY_unshift(st, val) SKM_sk_unshift(X509_NAME_ENTRY, (st), (val)) +# define sk_X509_NAME_ENTRY_find(st, val) SKM_sk_find(X509_NAME_ENTRY, (st), (val)) +# define sk_X509_NAME_ENTRY_find_ex(st, val) SKM_sk_find_ex(X509_NAME_ENTRY, (st), (val)) +# define sk_X509_NAME_ENTRY_delete(st, i) SKM_sk_delete(X509_NAME_ENTRY, (st), (i)) +# define sk_X509_NAME_ENTRY_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_NAME_ENTRY, (st), (ptr)) +# define sk_X509_NAME_ENTRY_insert(st, val, i) SKM_sk_insert(X509_NAME_ENTRY, (st), (val), (i)) +# define sk_X509_NAME_ENTRY_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_NAME_ENTRY, (st), (cmp)) +# define sk_X509_NAME_ENTRY_dup(st) SKM_sk_dup(X509_NAME_ENTRY, st) +# define sk_X509_NAME_ENTRY_pop_free(st, free_func) SKM_sk_pop_free(X509_NAME_ENTRY, (st), (free_func)) +# define sk_X509_NAME_ENTRY_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_NAME_ENTRY, (st), (copy_func), (free_func)) +# define sk_X509_NAME_ENTRY_shift(st) SKM_sk_shift(X509_NAME_ENTRY, (st)) +# define sk_X509_NAME_ENTRY_pop(st) SKM_sk_pop(X509_NAME_ENTRY, (st)) +# define sk_X509_NAME_ENTRY_sort(st) SKM_sk_sort(X509_NAME_ENTRY, (st)) +# define sk_X509_NAME_ENTRY_is_sorted(st) SKM_sk_is_sorted(X509_NAME_ENTRY, (st)) +# define sk_X509_OBJECT_new(cmp) SKM_sk_new(X509_OBJECT, (cmp)) +# define sk_X509_OBJECT_new_null() SKM_sk_new_null(X509_OBJECT) +# define sk_X509_OBJECT_free(st) SKM_sk_free(X509_OBJECT, (st)) +# define sk_X509_OBJECT_num(st) SKM_sk_num(X509_OBJECT, (st)) +# define sk_X509_OBJECT_value(st, i) SKM_sk_value(X509_OBJECT, (st), (i)) +# define sk_X509_OBJECT_set(st, i, val) SKM_sk_set(X509_OBJECT, (st), (i), (val)) +# define sk_X509_OBJECT_zero(st) SKM_sk_zero(X509_OBJECT, (st)) +# define sk_X509_OBJECT_push(st, val) SKM_sk_push(X509_OBJECT, (st), (val)) +# define sk_X509_OBJECT_unshift(st, val) SKM_sk_unshift(X509_OBJECT, (st), (val)) +# define sk_X509_OBJECT_find(st, val) SKM_sk_find(X509_OBJECT, (st), (val)) +# define sk_X509_OBJECT_find_ex(st, val) SKM_sk_find_ex(X509_OBJECT, (st), (val)) +# define sk_X509_OBJECT_delete(st, i) SKM_sk_delete(X509_OBJECT, (st), (i)) +# define sk_X509_OBJECT_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_OBJECT, (st), (ptr)) +# define sk_X509_OBJECT_insert(st, val, i) SKM_sk_insert(X509_OBJECT, (st), (val), (i)) +# define sk_X509_OBJECT_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_OBJECT, (st), (cmp)) +# define sk_X509_OBJECT_dup(st) SKM_sk_dup(X509_OBJECT, st) +# define sk_X509_OBJECT_pop_free(st, free_func) SKM_sk_pop_free(X509_OBJECT, (st), (free_func)) +# define sk_X509_OBJECT_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_OBJECT, (st), (copy_func), (free_func)) +# define sk_X509_OBJECT_shift(st) SKM_sk_shift(X509_OBJECT, (st)) +# define sk_X509_OBJECT_pop(st) SKM_sk_pop(X509_OBJECT, (st)) +# define sk_X509_OBJECT_sort(st) SKM_sk_sort(X509_OBJECT, (st)) +# define sk_X509_OBJECT_is_sorted(st) SKM_sk_is_sorted(X509_OBJECT, (st)) +# define sk_X509_POLICY_DATA_new(cmp) SKM_sk_new(X509_POLICY_DATA, (cmp)) +# define sk_X509_POLICY_DATA_new_null() SKM_sk_new_null(X509_POLICY_DATA) +# define sk_X509_POLICY_DATA_free(st) SKM_sk_free(X509_POLICY_DATA, (st)) +# define sk_X509_POLICY_DATA_num(st) SKM_sk_num(X509_POLICY_DATA, (st)) +# define sk_X509_POLICY_DATA_value(st, i) SKM_sk_value(X509_POLICY_DATA, (st), (i)) +# define sk_X509_POLICY_DATA_set(st, i, val) SKM_sk_set(X509_POLICY_DATA, (st), (i), (val)) +# define sk_X509_POLICY_DATA_zero(st) SKM_sk_zero(X509_POLICY_DATA, (st)) +# define sk_X509_POLICY_DATA_push(st, val) SKM_sk_push(X509_POLICY_DATA, (st), (val)) +# define sk_X509_POLICY_DATA_unshift(st, val) SKM_sk_unshift(X509_POLICY_DATA, (st), (val)) +# define sk_X509_POLICY_DATA_find(st, val) SKM_sk_find(X509_POLICY_DATA, (st), (val)) +# define sk_X509_POLICY_DATA_find_ex(st, val) SKM_sk_find_ex(X509_POLICY_DATA, (st), (val)) +# define sk_X509_POLICY_DATA_delete(st, i) SKM_sk_delete(X509_POLICY_DATA, (st), (i)) +# define sk_X509_POLICY_DATA_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_POLICY_DATA, (st), (ptr)) +# define sk_X509_POLICY_DATA_insert(st, val, i) SKM_sk_insert(X509_POLICY_DATA, (st), (val), (i)) +# define sk_X509_POLICY_DATA_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_POLICY_DATA, (st), (cmp)) +# define sk_X509_POLICY_DATA_dup(st) SKM_sk_dup(X509_POLICY_DATA, st) +# define sk_X509_POLICY_DATA_pop_free(st, free_func) SKM_sk_pop_free(X509_POLICY_DATA, (st), (free_func)) +# define sk_X509_POLICY_DATA_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_POLICY_DATA, (st), (copy_func), (free_func)) +# define sk_X509_POLICY_DATA_shift(st) SKM_sk_shift(X509_POLICY_DATA, (st)) +# define sk_X509_POLICY_DATA_pop(st) SKM_sk_pop(X509_POLICY_DATA, (st)) +# define sk_X509_POLICY_DATA_sort(st) SKM_sk_sort(X509_POLICY_DATA, (st)) +# define sk_X509_POLICY_DATA_is_sorted(st) SKM_sk_is_sorted(X509_POLICY_DATA, (st)) +# define sk_X509_POLICY_NODE_new(cmp) SKM_sk_new(X509_POLICY_NODE, (cmp)) +# define sk_X509_POLICY_NODE_new_null() SKM_sk_new_null(X509_POLICY_NODE) +# define sk_X509_POLICY_NODE_free(st) SKM_sk_free(X509_POLICY_NODE, (st)) +# define sk_X509_POLICY_NODE_num(st) SKM_sk_num(X509_POLICY_NODE, (st)) +# define sk_X509_POLICY_NODE_value(st, i) SKM_sk_value(X509_POLICY_NODE, (st), (i)) +# define sk_X509_POLICY_NODE_set(st, i, val) SKM_sk_set(X509_POLICY_NODE, (st), (i), (val)) +# define sk_X509_POLICY_NODE_zero(st) SKM_sk_zero(X509_POLICY_NODE, (st)) +# define sk_X509_POLICY_NODE_push(st, val) SKM_sk_push(X509_POLICY_NODE, (st), (val)) +# define sk_X509_POLICY_NODE_unshift(st, val) SKM_sk_unshift(X509_POLICY_NODE, (st), (val)) +# define sk_X509_POLICY_NODE_find(st, val) SKM_sk_find(X509_POLICY_NODE, (st), (val)) +# define sk_X509_POLICY_NODE_find_ex(st, val) SKM_sk_find_ex(X509_POLICY_NODE, (st), (val)) +# define sk_X509_POLICY_NODE_delete(st, i) SKM_sk_delete(X509_POLICY_NODE, (st), (i)) +# define sk_X509_POLICY_NODE_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_POLICY_NODE, (st), (ptr)) +# define sk_X509_POLICY_NODE_insert(st, val, i) SKM_sk_insert(X509_POLICY_NODE, (st), (val), (i)) +# define sk_X509_POLICY_NODE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_POLICY_NODE, (st), (cmp)) +# define sk_X509_POLICY_NODE_dup(st) SKM_sk_dup(X509_POLICY_NODE, st) +# define sk_X509_POLICY_NODE_pop_free(st, free_func) SKM_sk_pop_free(X509_POLICY_NODE, (st), (free_func)) +# define sk_X509_POLICY_NODE_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_POLICY_NODE, (st), (copy_func), (free_func)) +# define sk_X509_POLICY_NODE_shift(st) SKM_sk_shift(X509_POLICY_NODE, (st)) +# define sk_X509_POLICY_NODE_pop(st) SKM_sk_pop(X509_POLICY_NODE, (st)) +# define sk_X509_POLICY_NODE_sort(st) SKM_sk_sort(X509_POLICY_NODE, (st)) +# define sk_X509_POLICY_NODE_is_sorted(st) SKM_sk_is_sorted(X509_POLICY_NODE, (st)) +# define sk_X509_PURPOSE_new(cmp) SKM_sk_new(X509_PURPOSE, (cmp)) +# define sk_X509_PURPOSE_new_null() SKM_sk_new_null(X509_PURPOSE) +# define sk_X509_PURPOSE_free(st) SKM_sk_free(X509_PURPOSE, (st)) +# define sk_X509_PURPOSE_num(st) SKM_sk_num(X509_PURPOSE, (st)) +# define sk_X509_PURPOSE_value(st, i) SKM_sk_value(X509_PURPOSE, (st), (i)) +# define sk_X509_PURPOSE_set(st, i, val) SKM_sk_set(X509_PURPOSE, (st), (i), (val)) +# define sk_X509_PURPOSE_zero(st) SKM_sk_zero(X509_PURPOSE, (st)) +# define sk_X509_PURPOSE_push(st, val) SKM_sk_push(X509_PURPOSE, (st), (val)) +# define sk_X509_PURPOSE_unshift(st, val) SKM_sk_unshift(X509_PURPOSE, (st), (val)) +# define sk_X509_PURPOSE_find(st, val) SKM_sk_find(X509_PURPOSE, (st), (val)) +# define sk_X509_PURPOSE_find_ex(st, val) SKM_sk_find_ex(X509_PURPOSE, (st), (val)) +# define sk_X509_PURPOSE_delete(st, i) SKM_sk_delete(X509_PURPOSE, (st), (i)) +# define sk_X509_PURPOSE_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_PURPOSE, (st), (ptr)) +# define sk_X509_PURPOSE_insert(st, val, i) SKM_sk_insert(X509_PURPOSE, (st), (val), (i)) +# define sk_X509_PURPOSE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_PURPOSE, (st), (cmp)) +# define sk_X509_PURPOSE_dup(st) SKM_sk_dup(X509_PURPOSE, st) +# define sk_X509_PURPOSE_pop_free(st, free_func) SKM_sk_pop_free(X509_PURPOSE, (st), (free_func)) +# define sk_X509_PURPOSE_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_PURPOSE, (st), (copy_func), (free_func)) +# define sk_X509_PURPOSE_shift(st) SKM_sk_shift(X509_PURPOSE, (st)) +# define sk_X509_PURPOSE_pop(st) SKM_sk_pop(X509_PURPOSE, (st)) +# define sk_X509_PURPOSE_sort(st) SKM_sk_sort(X509_PURPOSE, (st)) +# define sk_X509_PURPOSE_is_sorted(st) SKM_sk_is_sorted(X509_PURPOSE, (st)) +# define sk_X509_REVOKED_new(cmp) SKM_sk_new(X509_REVOKED, (cmp)) +# define sk_X509_REVOKED_new_null() SKM_sk_new_null(X509_REVOKED) +# define sk_X509_REVOKED_free(st) SKM_sk_free(X509_REVOKED, (st)) +# define sk_X509_REVOKED_num(st) SKM_sk_num(X509_REVOKED, (st)) +# define sk_X509_REVOKED_value(st, i) SKM_sk_value(X509_REVOKED, (st), (i)) +# define sk_X509_REVOKED_set(st, i, val) SKM_sk_set(X509_REVOKED, (st), (i), (val)) +# define sk_X509_REVOKED_zero(st) SKM_sk_zero(X509_REVOKED, (st)) +# define sk_X509_REVOKED_push(st, val) SKM_sk_push(X509_REVOKED, (st), (val)) +# define sk_X509_REVOKED_unshift(st, val) SKM_sk_unshift(X509_REVOKED, (st), (val)) +# define sk_X509_REVOKED_find(st, val) SKM_sk_find(X509_REVOKED, (st), (val)) +# define sk_X509_REVOKED_find_ex(st, val) SKM_sk_find_ex(X509_REVOKED, (st), (val)) +# define sk_X509_REVOKED_delete(st, i) SKM_sk_delete(X509_REVOKED, (st), (i)) +# define sk_X509_REVOKED_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_REVOKED, (st), (ptr)) +# define sk_X509_REVOKED_insert(st, val, i) SKM_sk_insert(X509_REVOKED, (st), (val), (i)) +# define sk_X509_REVOKED_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_REVOKED, (st), (cmp)) +# define sk_X509_REVOKED_dup(st) SKM_sk_dup(X509_REVOKED, st) +# define sk_X509_REVOKED_pop_free(st, free_func) SKM_sk_pop_free(X509_REVOKED, (st), (free_func)) +# define sk_X509_REVOKED_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_REVOKED, (st), (copy_func), (free_func)) +# define sk_X509_REVOKED_shift(st) SKM_sk_shift(X509_REVOKED, (st)) +# define sk_X509_REVOKED_pop(st) SKM_sk_pop(X509_REVOKED, (st)) +# define sk_X509_REVOKED_sort(st) SKM_sk_sort(X509_REVOKED, (st)) +# define sk_X509_REVOKED_is_sorted(st) SKM_sk_is_sorted(X509_REVOKED, (st)) +# define sk_X509_TRUST_new(cmp) SKM_sk_new(X509_TRUST, (cmp)) +# define sk_X509_TRUST_new_null() SKM_sk_new_null(X509_TRUST) +# define sk_X509_TRUST_free(st) SKM_sk_free(X509_TRUST, (st)) +# define sk_X509_TRUST_num(st) SKM_sk_num(X509_TRUST, (st)) +# define sk_X509_TRUST_value(st, i) SKM_sk_value(X509_TRUST, (st), (i)) +# define sk_X509_TRUST_set(st, i, val) SKM_sk_set(X509_TRUST, (st), (i), (val)) +# define sk_X509_TRUST_zero(st) SKM_sk_zero(X509_TRUST, (st)) +# define sk_X509_TRUST_push(st, val) SKM_sk_push(X509_TRUST, (st), (val)) +# define sk_X509_TRUST_unshift(st, val) SKM_sk_unshift(X509_TRUST, (st), (val)) +# define sk_X509_TRUST_find(st, val) SKM_sk_find(X509_TRUST, (st), (val)) +# define sk_X509_TRUST_find_ex(st, val) SKM_sk_find_ex(X509_TRUST, (st), (val)) +# define sk_X509_TRUST_delete(st, i) SKM_sk_delete(X509_TRUST, (st), (i)) +# define sk_X509_TRUST_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_TRUST, (st), (ptr)) +# define sk_X509_TRUST_insert(st, val, i) SKM_sk_insert(X509_TRUST, (st), (val), (i)) +# define sk_X509_TRUST_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_TRUST, (st), (cmp)) +# define sk_X509_TRUST_dup(st) SKM_sk_dup(X509_TRUST, st) +# define sk_X509_TRUST_pop_free(st, free_func) SKM_sk_pop_free(X509_TRUST, (st), (free_func)) +# define sk_X509_TRUST_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_TRUST, (st), (copy_func), (free_func)) +# define sk_X509_TRUST_shift(st) SKM_sk_shift(X509_TRUST, (st)) +# define sk_X509_TRUST_pop(st) SKM_sk_pop(X509_TRUST, (st)) +# define sk_X509_TRUST_sort(st) SKM_sk_sort(X509_TRUST, (st)) +# define sk_X509_TRUST_is_sorted(st) SKM_sk_is_sorted(X509_TRUST, (st)) +# define sk_X509_VERIFY_PARAM_new(cmp) SKM_sk_new(X509_VERIFY_PARAM, (cmp)) +# define sk_X509_VERIFY_PARAM_new_null() SKM_sk_new_null(X509_VERIFY_PARAM) +# define sk_X509_VERIFY_PARAM_free(st) SKM_sk_free(X509_VERIFY_PARAM, (st)) +# define sk_X509_VERIFY_PARAM_num(st) SKM_sk_num(X509_VERIFY_PARAM, (st)) +# define sk_X509_VERIFY_PARAM_value(st, i) SKM_sk_value(X509_VERIFY_PARAM, (st), (i)) +# define sk_X509_VERIFY_PARAM_set(st, i, val) SKM_sk_set(X509_VERIFY_PARAM, (st), (i), (val)) +# define sk_X509_VERIFY_PARAM_zero(st) SKM_sk_zero(X509_VERIFY_PARAM, (st)) +# define sk_X509_VERIFY_PARAM_push(st, val) SKM_sk_push(X509_VERIFY_PARAM, (st), (val)) +# define sk_X509_VERIFY_PARAM_unshift(st, val) SKM_sk_unshift(X509_VERIFY_PARAM, (st), (val)) +# define sk_X509_VERIFY_PARAM_find(st, val) SKM_sk_find(X509_VERIFY_PARAM, (st), (val)) +# define sk_X509_VERIFY_PARAM_find_ex(st, val) SKM_sk_find_ex(X509_VERIFY_PARAM, (st), (val)) +# define sk_X509_VERIFY_PARAM_delete(st, i) SKM_sk_delete(X509_VERIFY_PARAM, (st), (i)) +# define sk_X509_VERIFY_PARAM_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_VERIFY_PARAM, (st), (ptr)) +# define sk_X509_VERIFY_PARAM_insert(st, val, i) SKM_sk_insert(X509_VERIFY_PARAM, (st), (val), (i)) +# define sk_X509_VERIFY_PARAM_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_VERIFY_PARAM, (st), (cmp)) +# define sk_X509_VERIFY_PARAM_dup(st) SKM_sk_dup(X509_VERIFY_PARAM, st) +# define sk_X509_VERIFY_PARAM_pop_free(st, free_func) SKM_sk_pop_free(X509_VERIFY_PARAM, (st), (free_func)) +# define sk_X509_VERIFY_PARAM_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_VERIFY_PARAM, (st), (copy_func), (free_func)) +# define sk_X509_VERIFY_PARAM_shift(st) SKM_sk_shift(X509_VERIFY_PARAM, (st)) +# define sk_X509_VERIFY_PARAM_pop(st) SKM_sk_pop(X509_VERIFY_PARAM, (st)) +# define sk_X509_VERIFY_PARAM_sort(st) SKM_sk_sort(X509_VERIFY_PARAM, (st)) +# define sk_X509_VERIFY_PARAM_is_sorted(st) SKM_sk_is_sorted(X509_VERIFY_PARAM, (st)) +# define sk_nid_triple_new(cmp) SKM_sk_new(nid_triple, (cmp)) +# define sk_nid_triple_new_null() SKM_sk_new_null(nid_triple) +# define sk_nid_triple_free(st) SKM_sk_free(nid_triple, (st)) +# define sk_nid_triple_num(st) SKM_sk_num(nid_triple, (st)) +# define sk_nid_triple_value(st, i) SKM_sk_value(nid_triple, (st), (i)) +# define sk_nid_triple_set(st, i, val) SKM_sk_set(nid_triple, (st), (i), (val)) +# define sk_nid_triple_zero(st) SKM_sk_zero(nid_triple, (st)) +# define sk_nid_triple_push(st, val) SKM_sk_push(nid_triple, (st), (val)) +# define sk_nid_triple_unshift(st, val) SKM_sk_unshift(nid_triple, (st), (val)) +# define sk_nid_triple_find(st, val) SKM_sk_find(nid_triple, (st), (val)) +# define sk_nid_triple_find_ex(st, val) SKM_sk_find_ex(nid_triple, (st), (val)) +# define sk_nid_triple_delete(st, i) SKM_sk_delete(nid_triple, (st), (i)) +# define sk_nid_triple_delete_ptr(st, ptr) SKM_sk_delete_ptr(nid_triple, (st), (ptr)) +# define sk_nid_triple_insert(st, val, i) SKM_sk_insert(nid_triple, (st), (val), (i)) +# define sk_nid_triple_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(nid_triple, (st), (cmp)) +# define sk_nid_triple_dup(st) SKM_sk_dup(nid_triple, st) +# define sk_nid_triple_pop_free(st, free_func) SKM_sk_pop_free(nid_triple, (st), (free_func)) +# define sk_nid_triple_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(nid_triple, (st), (copy_func), (free_func)) +# define sk_nid_triple_shift(st) SKM_sk_shift(nid_triple, (st)) +# define sk_nid_triple_pop(st) SKM_sk_pop(nid_triple, (st)) +# define sk_nid_triple_sort(st) SKM_sk_sort(nid_triple, (st)) +# define sk_nid_triple_is_sorted(st) SKM_sk_is_sorted(nid_triple, (st)) +# define sk_void_new(cmp) SKM_sk_new(void, (cmp)) +# define sk_void_new_null() SKM_sk_new_null(void) +# define sk_void_free(st) SKM_sk_free(void, (st)) +# define sk_void_num(st) SKM_sk_num(void, (st)) +# define sk_void_value(st, i) SKM_sk_value(void, (st), (i)) +# define sk_void_set(st, i, val) SKM_sk_set(void, (st), (i), (val)) +# define sk_void_zero(st) SKM_sk_zero(void, (st)) +# define sk_void_push(st, val) SKM_sk_push(void, (st), (val)) +# define sk_void_unshift(st, val) SKM_sk_unshift(void, (st), (val)) +# define sk_void_find(st, val) SKM_sk_find(void, (st), (val)) +# define sk_void_find_ex(st, val) SKM_sk_find_ex(void, (st), (val)) +# define sk_void_delete(st, i) SKM_sk_delete(void, (st), (i)) +# define sk_void_delete_ptr(st, ptr) SKM_sk_delete_ptr(void, (st), (ptr)) +# define sk_void_insert(st, val, i) SKM_sk_insert(void, (st), (val), (i)) +# define sk_void_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(void, (st), (cmp)) +# define sk_void_dup(st) SKM_sk_dup(void, st) +# define sk_void_pop_free(st, free_func) SKM_sk_pop_free(void, (st), (free_func)) +# define sk_void_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(void, (st), (copy_func), (free_func)) +# define sk_void_shift(st) SKM_sk_shift(void, (st)) +# define sk_void_pop(st) SKM_sk_pop(void, (st)) +# define sk_void_sort(st) SKM_sk_sort(void, (st)) +# define sk_void_is_sorted(st) SKM_sk_is_sorted(void, (st)) +# define sk_OPENSSL_STRING_new(cmp) ((STACK_OF(OPENSSL_STRING) *)sk_new(CHECKED_SK_CMP_FUNC(char, cmp))) +# define sk_OPENSSL_STRING_new_null() ((STACK_OF(OPENSSL_STRING) *)sk_new_null()) +# define sk_OPENSSL_STRING_push(st, val) sk_push(CHECKED_STACK_OF(OPENSSL_STRING, st), CHECKED_PTR_OF(char, val)) +# define sk_OPENSSL_STRING_find(st, val) sk_find(CHECKED_STACK_OF(OPENSSL_STRING, st), CHECKED_PTR_OF(char, val)) +# define sk_OPENSSL_STRING_value(st, i) ((OPENSSL_STRING)sk_value(CHECKED_STACK_OF(OPENSSL_STRING, st), i)) +# define sk_OPENSSL_STRING_num(st) SKM_sk_num(OPENSSL_STRING, st) +# define sk_OPENSSL_STRING_pop_free(st, free_func) sk_pop_free(CHECKED_STACK_OF(OPENSSL_STRING, st), CHECKED_SK_FREE_FUNC(char, free_func)) +# define sk_OPENSSL_STRING_deep_copy(st, copy_func, free_func) ((STACK_OF(OPENSSL_STRING) *)sk_deep_copy(CHECKED_STACK_OF(OPENSSL_STRING, st), CHECKED_SK_COPY_FUNC(char, copy_func), CHECKED_SK_FREE_FUNC(char, free_func))) +# define sk_OPENSSL_STRING_insert(st, val, i) sk_insert(CHECKED_STACK_OF(OPENSSL_STRING, st), CHECKED_PTR_OF(char, val), i) +# define sk_OPENSSL_STRING_free(st) SKM_sk_free(OPENSSL_STRING, st) +# define sk_OPENSSL_STRING_set(st, i, val) sk_set(CHECKED_STACK_OF(OPENSSL_STRING, st), i, CHECKED_PTR_OF(char, val)) +# define sk_OPENSSL_STRING_zero(st) SKM_sk_zero(OPENSSL_STRING, (st)) +# define sk_OPENSSL_STRING_unshift(st, val) sk_unshift(CHECKED_STACK_OF(OPENSSL_STRING, st), CHECKED_PTR_OF(char, val)) +# define sk_OPENSSL_STRING_find_ex(st, val) sk_find_ex((_STACK *)CHECKED_CONST_PTR_OF(STACK_OF(OPENSSL_STRING), st), CHECKED_CONST_PTR_OF(char, val)) +# define sk_OPENSSL_STRING_delete(st, i) SKM_sk_delete(OPENSSL_STRING, (st), (i)) +# define sk_OPENSSL_STRING_delete_ptr(st, ptr) (OPENSSL_STRING *)sk_delete_ptr(CHECKED_STACK_OF(OPENSSL_STRING, st), CHECKED_PTR_OF(char, ptr)) +# define sk_OPENSSL_STRING_set_cmp_func(st, cmp) \ + ((int (*)(const char * const *,const char * const *)) \ + sk_set_cmp_func(CHECKED_STACK_OF(OPENSSL_STRING, st), CHECKED_SK_CMP_FUNC(char, cmp))) +# define sk_OPENSSL_STRING_dup(st) SKM_sk_dup(OPENSSL_STRING, st) +# define sk_OPENSSL_STRING_shift(st) SKM_sk_shift(OPENSSL_STRING, (st)) +# define sk_OPENSSL_STRING_pop(st) (char *)sk_pop(CHECKED_STACK_OF(OPENSSL_STRING, st)) +# define sk_OPENSSL_STRING_sort(st) SKM_sk_sort(OPENSSL_STRING, (st)) +# define sk_OPENSSL_STRING_is_sorted(st) SKM_sk_is_sorted(OPENSSL_STRING, (st)) +# define sk_OPENSSL_BLOCK_new(cmp) ((STACK_OF(OPENSSL_BLOCK) *)sk_new(CHECKED_SK_CMP_FUNC(void, cmp))) +# define sk_OPENSSL_BLOCK_new_null() ((STACK_OF(OPENSSL_BLOCK) *)sk_new_null()) +# define sk_OPENSSL_BLOCK_push(st, val) sk_push(CHECKED_STACK_OF(OPENSSL_BLOCK, st), CHECKED_PTR_OF(void, val)) +# define sk_OPENSSL_BLOCK_find(st, val) sk_find(CHECKED_STACK_OF(OPENSSL_BLOCK, st), CHECKED_PTR_OF(void, val)) +# define sk_OPENSSL_BLOCK_value(st, i) ((OPENSSL_BLOCK)sk_value(CHECKED_STACK_OF(OPENSSL_BLOCK, st), i)) +# define sk_OPENSSL_BLOCK_num(st) SKM_sk_num(OPENSSL_BLOCK, st) +# define sk_OPENSSL_BLOCK_pop_free(st, free_func) sk_pop_free(CHECKED_STACK_OF(OPENSSL_BLOCK, st), CHECKED_SK_FREE_FUNC(void, free_func)) +# define sk_OPENSSL_BLOCK_deep_copy(st, copy_func, free_func) ((STACK_OF(OPENSSL_BLOCK) *)sk_deep_copy(CHECKED_STACK_OF(OPENSSL_BLOCK, st), CHECKED_SK_COPY_FUNC(void, copy_func), CHECKED_SK_FREE_FUNC(void, free_func))) +# define sk_OPENSSL_BLOCK_insert(st, val, i) sk_insert(CHECKED_STACK_OF(OPENSSL_BLOCK, st), CHECKED_PTR_OF(void, val), i) +# define sk_OPENSSL_BLOCK_free(st) SKM_sk_free(OPENSSL_BLOCK, st) +# define sk_OPENSSL_BLOCK_set(st, i, val) sk_set(CHECKED_STACK_OF(OPENSSL_BLOCK, st), i, CHECKED_PTR_OF(void, val)) +# define sk_OPENSSL_BLOCK_zero(st) SKM_sk_zero(OPENSSL_BLOCK, (st)) +# define sk_OPENSSL_BLOCK_unshift(st, val) sk_unshift(CHECKED_STACK_OF(OPENSSL_BLOCK, st), CHECKED_PTR_OF(void, val)) +# define sk_OPENSSL_BLOCK_find_ex(st, val) sk_find_ex((_STACK *)CHECKED_CONST_PTR_OF(STACK_OF(OPENSSL_BLOCK), st), CHECKED_CONST_PTR_OF(void, val)) +# define sk_OPENSSL_BLOCK_delete(st, i) SKM_sk_delete(OPENSSL_BLOCK, (st), (i)) +# define sk_OPENSSL_BLOCK_delete_ptr(st, ptr) (OPENSSL_BLOCK *)sk_delete_ptr(CHECKED_STACK_OF(OPENSSL_BLOCK, st), CHECKED_PTR_OF(void, ptr)) +# define sk_OPENSSL_BLOCK_set_cmp_func(st, cmp) \ + ((int (*)(const void * const *,const void * const *)) \ + sk_set_cmp_func(CHECKED_STACK_OF(OPENSSL_BLOCK, st), CHECKED_SK_CMP_FUNC(void, cmp))) +# define sk_OPENSSL_BLOCK_dup(st) SKM_sk_dup(OPENSSL_BLOCK, st) +# define sk_OPENSSL_BLOCK_shift(st) SKM_sk_shift(OPENSSL_BLOCK, (st)) +# define sk_OPENSSL_BLOCK_pop(st) (void *)sk_pop(CHECKED_STACK_OF(OPENSSL_BLOCK, st)) +# define sk_OPENSSL_BLOCK_sort(st) SKM_sk_sort(OPENSSL_BLOCK, (st)) +# define sk_OPENSSL_BLOCK_is_sorted(st) SKM_sk_is_sorted(OPENSSL_BLOCK, (st)) +# define sk_OPENSSL_PSTRING_new(cmp) ((STACK_OF(OPENSSL_PSTRING) *)sk_new(CHECKED_SK_CMP_FUNC(OPENSSL_STRING, cmp))) +# define sk_OPENSSL_PSTRING_new_null() ((STACK_OF(OPENSSL_PSTRING) *)sk_new_null()) +# define sk_OPENSSL_PSTRING_push(st, val) sk_push(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_PTR_OF(OPENSSL_STRING, val)) +# define sk_OPENSSL_PSTRING_find(st, val) sk_find(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_PTR_OF(OPENSSL_STRING, val)) +# define sk_OPENSSL_PSTRING_value(st, i) ((OPENSSL_PSTRING)sk_value(CHECKED_STACK_OF(OPENSSL_PSTRING, st), i)) +# define sk_OPENSSL_PSTRING_num(st) SKM_sk_num(OPENSSL_PSTRING, st) +# define sk_OPENSSL_PSTRING_pop_free(st, free_func) sk_pop_free(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_SK_FREE_FUNC(OPENSSL_STRING, free_func)) +# define sk_OPENSSL_PSTRING_deep_copy(st, copy_func, free_func) ((STACK_OF(OPENSSL_PSTRING) *)sk_deep_copy(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_SK_COPY_FUNC(OPENSSL_STRING, copy_func), CHECKED_SK_FREE_FUNC(OPENSSL_STRING, free_func))) +# define sk_OPENSSL_PSTRING_insert(st, val, i) sk_insert(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_PTR_OF(OPENSSL_STRING, val), i) +# define sk_OPENSSL_PSTRING_free(st) SKM_sk_free(OPENSSL_PSTRING, st) +# define sk_OPENSSL_PSTRING_set(st, i, val) sk_set(CHECKED_STACK_OF(OPENSSL_PSTRING, st), i, CHECKED_PTR_OF(OPENSSL_STRING, val)) +# define sk_OPENSSL_PSTRING_zero(st) SKM_sk_zero(OPENSSL_PSTRING, (st)) +# define sk_OPENSSL_PSTRING_unshift(st, val) sk_unshift(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_PTR_OF(OPENSSL_STRING, val)) +# define sk_OPENSSL_PSTRING_find_ex(st, val) sk_find_ex((_STACK *)CHECKED_CONST_PTR_OF(STACK_OF(OPENSSL_PSTRING), st), CHECKED_CONST_PTR_OF(OPENSSL_STRING, val)) +# define sk_OPENSSL_PSTRING_delete(st, i) SKM_sk_delete(OPENSSL_PSTRING, (st), (i)) +# define sk_OPENSSL_PSTRING_delete_ptr(st, ptr) (OPENSSL_PSTRING *)sk_delete_ptr(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_PTR_OF(OPENSSL_STRING, ptr)) +# define sk_OPENSSL_PSTRING_set_cmp_func(st, cmp) \ + ((int (*)(const OPENSSL_STRING * const *,const OPENSSL_STRING * const *)) \ + sk_set_cmp_func(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_SK_CMP_FUNC(OPENSSL_STRING, cmp))) +# define sk_OPENSSL_PSTRING_dup(st) SKM_sk_dup(OPENSSL_PSTRING, st) +# define sk_OPENSSL_PSTRING_shift(st) SKM_sk_shift(OPENSSL_PSTRING, (st)) +# define sk_OPENSSL_PSTRING_pop(st) (OPENSSL_STRING *)sk_pop(CHECKED_STACK_OF(OPENSSL_PSTRING, st)) +# define sk_OPENSSL_PSTRING_sort(st) SKM_sk_sort(OPENSSL_PSTRING, (st)) +# define sk_OPENSSL_PSTRING_is_sorted(st) SKM_sk_is_sorted(OPENSSL_PSTRING, (st)) +# define d2i_ASN1_SET_OF_ACCESS_DESCRIPTION(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(ACCESS_DESCRIPTION, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_ACCESS_DESCRIPTION(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(ACCESS_DESCRIPTION, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_ACCESS_DESCRIPTION(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(ACCESS_DESCRIPTION, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_ACCESS_DESCRIPTION(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(ACCESS_DESCRIPTION, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_ASN1_INTEGER(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(ASN1_INTEGER, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_ASN1_INTEGER(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(ASN1_INTEGER, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_ASN1_INTEGER(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(ASN1_INTEGER, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_ASN1_INTEGER(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(ASN1_INTEGER, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_ASN1_OBJECT(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(ASN1_OBJECT, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_ASN1_OBJECT(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(ASN1_OBJECT, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_ASN1_OBJECT(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(ASN1_OBJECT, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_ASN1_OBJECT(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(ASN1_OBJECT, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_ASN1_TYPE(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(ASN1_TYPE, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_ASN1_TYPE(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(ASN1_TYPE, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_ASN1_TYPE(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(ASN1_TYPE, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_ASN1_TYPE(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(ASN1_TYPE, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_ASN1_UTF8STRING(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(ASN1_UTF8STRING, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_ASN1_UTF8STRING(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(ASN1_UTF8STRING, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_ASN1_UTF8STRING(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(ASN1_UTF8STRING, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_ASN1_UTF8STRING(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(ASN1_UTF8STRING, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_DIST_POINT(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(DIST_POINT, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_DIST_POINT(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(DIST_POINT, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_DIST_POINT(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(DIST_POINT, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_DIST_POINT(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(DIST_POINT, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_ESS_CERT_ID(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(ESS_CERT_ID, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_ESS_CERT_ID(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(ESS_CERT_ID, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_ESS_CERT_ID(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(ESS_CERT_ID, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_ESS_CERT_ID(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(ESS_CERT_ID, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_EVP_MD(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(EVP_MD, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_EVP_MD(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(EVP_MD, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_EVP_MD(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(EVP_MD, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_EVP_MD(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(EVP_MD, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_GENERAL_NAME(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(GENERAL_NAME, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_GENERAL_NAME(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(GENERAL_NAME, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_GENERAL_NAME(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(GENERAL_NAME, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_GENERAL_NAME(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(GENERAL_NAME, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_OCSP_ONEREQ(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(OCSP_ONEREQ, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_OCSP_ONEREQ(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(OCSP_ONEREQ, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_OCSP_ONEREQ(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(OCSP_ONEREQ, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_OCSP_ONEREQ(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(OCSP_ONEREQ, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_OCSP_SINGLERESP(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(OCSP_SINGLERESP, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_OCSP_SINGLERESP(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(OCSP_SINGLERESP, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_OCSP_SINGLERESP(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(OCSP_SINGLERESP, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_OCSP_SINGLERESP(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(OCSP_SINGLERESP, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_PKCS12_SAFEBAG(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(PKCS12_SAFEBAG, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_PKCS12_SAFEBAG(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(PKCS12_SAFEBAG, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_PKCS12_SAFEBAG(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(PKCS12_SAFEBAG, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_PKCS12_SAFEBAG(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(PKCS12_SAFEBAG, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_PKCS7(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(PKCS7, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_PKCS7(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(PKCS7, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_PKCS7(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(PKCS7, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_PKCS7(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(PKCS7, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_PKCS7_RECIP_INFO(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(PKCS7_RECIP_INFO, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_PKCS7_RECIP_INFO(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(PKCS7_RECIP_INFO, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_PKCS7_RECIP_INFO(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(PKCS7_RECIP_INFO, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_PKCS7_RECIP_INFO(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(PKCS7_RECIP_INFO, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_PKCS7_SIGNER_INFO(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(PKCS7_SIGNER_INFO, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_PKCS7_SIGNER_INFO(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(PKCS7_SIGNER_INFO, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_PKCS7_SIGNER_INFO(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(PKCS7_SIGNER_INFO, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_PKCS7_SIGNER_INFO(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(PKCS7_SIGNER_INFO, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_POLICYINFO(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(POLICYINFO, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_POLICYINFO(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(POLICYINFO, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_POLICYINFO(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(POLICYINFO, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_POLICYINFO(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(POLICYINFO, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_POLICYQUALINFO(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(POLICYQUALINFO, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_POLICYQUALINFO(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(POLICYQUALINFO, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_POLICYQUALINFO(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(POLICYQUALINFO, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_POLICYQUALINFO(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(POLICYQUALINFO, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_SXNETID(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(SXNETID, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_SXNETID(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(SXNETID, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_SXNETID(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(SXNETID, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_SXNETID(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(SXNETID, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_X509(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(X509, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_X509(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(X509, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_X509(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(X509, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_X509(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(X509, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_X509_ALGOR(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(X509_ALGOR, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_X509_ALGOR(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(X509_ALGOR, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_X509_ALGOR(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(X509_ALGOR, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_X509_ALGOR(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(X509_ALGOR, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_X509_ATTRIBUTE(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(X509_ATTRIBUTE, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_X509_ATTRIBUTE(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(X509_ATTRIBUTE, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_X509_ATTRIBUTE(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(X509_ATTRIBUTE, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_X509_ATTRIBUTE(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(X509_ATTRIBUTE, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_X509_CRL(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(X509_CRL, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_X509_CRL(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(X509_CRL, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_X509_CRL(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(X509_CRL, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_X509_CRL(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(X509_CRL, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_X509_EXTENSION(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(X509_EXTENSION, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_X509_EXTENSION(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(X509_EXTENSION, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_X509_EXTENSION(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(X509_EXTENSION, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_X509_EXTENSION(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(X509_EXTENSION, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_X509_NAME_ENTRY(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(X509_NAME_ENTRY, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_X509_NAME_ENTRY(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(X509_NAME_ENTRY, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_X509_NAME_ENTRY(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(X509_NAME_ENTRY, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_X509_NAME_ENTRY(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(X509_NAME_ENTRY, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_X509_REVOKED(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(X509_REVOKED, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_X509_REVOKED(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(X509_REVOKED, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_X509_REVOKED(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(X509_REVOKED, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_X509_REVOKED(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(X509_REVOKED, (buf), (len), (d2i_func), (free_func)) +# define PKCS12_decrypt_d2i_PKCS12_SAFEBAG(algor, d2i_func, free_func, pass, passlen, oct, seq) \ + SKM_PKCS12_decrypt_d2i(PKCS12_SAFEBAG, (algor), (d2i_func), (free_func), (pass), (passlen), (oct), (seq)) +# define PKCS12_decrypt_d2i_PKCS7(algor, d2i_func, free_func, pass, passlen, oct, seq) \ + SKM_PKCS12_decrypt_d2i(PKCS7, (algor), (d2i_func), (free_func), (pass), (passlen), (oct), (seq)) +# define lh_ADDED_OBJ_new() LHM_lh_new(ADDED_OBJ,added_obj) +# define lh_ADDED_OBJ_insert(lh,inst) LHM_lh_insert(ADDED_OBJ,lh,inst) +# define lh_ADDED_OBJ_retrieve(lh,inst) LHM_lh_retrieve(ADDED_OBJ,lh,inst) +# define lh_ADDED_OBJ_delete(lh,inst) LHM_lh_delete(ADDED_OBJ,lh,inst) +# define lh_ADDED_OBJ_doall(lh,fn) LHM_lh_doall(ADDED_OBJ,lh,fn) +# define lh_ADDED_OBJ_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(ADDED_OBJ,lh,fn,arg_type,arg) +# define lh_ADDED_OBJ_error(lh) LHM_lh_error(ADDED_OBJ,lh) +# define lh_ADDED_OBJ_num_items(lh) LHM_lh_num_items(ADDED_OBJ,lh) +# define lh_ADDED_OBJ_down_load(lh) LHM_lh_down_load(ADDED_OBJ,lh) +# define lh_ADDED_OBJ_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(ADDED_OBJ,lh,out) +# define lh_ADDED_OBJ_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(ADDED_OBJ,lh,out) +# define lh_ADDED_OBJ_stats_bio(lh,out) \ + LHM_lh_stats_bio(ADDED_OBJ,lh,out) +# define lh_ADDED_OBJ_free(lh) LHM_lh_free(ADDED_OBJ,lh) +# define lh_APP_INFO_new() LHM_lh_new(APP_INFO,app_info) +# define lh_APP_INFO_insert(lh,inst) LHM_lh_insert(APP_INFO,lh,inst) +# define lh_APP_INFO_retrieve(lh,inst) LHM_lh_retrieve(APP_INFO,lh,inst) +# define lh_APP_INFO_delete(lh,inst) LHM_lh_delete(APP_INFO,lh,inst) +# define lh_APP_INFO_doall(lh,fn) LHM_lh_doall(APP_INFO,lh,fn) +# define lh_APP_INFO_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(APP_INFO,lh,fn,arg_type,arg) +# define lh_APP_INFO_error(lh) LHM_lh_error(APP_INFO,lh) +# define lh_APP_INFO_num_items(lh) LHM_lh_num_items(APP_INFO,lh) +# define lh_APP_INFO_down_load(lh) LHM_lh_down_load(APP_INFO,lh) +# define lh_APP_INFO_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(APP_INFO,lh,out) +# define lh_APP_INFO_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(APP_INFO,lh,out) +# define lh_APP_INFO_stats_bio(lh,out) \ + LHM_lh_stats_bio(APP_INFO,lh,out) +# define lh_APP_INFO_free(lh) LHM_lh_free(APP_INFO,lh) +# define lh_CONF_VALUE_new() LHM_lh_new(CONF_VALUE,conf_value) +# define lh_CONF_VALUE_insert(lh,inst) LHM_lh_insert(CONF_VALUE,lh,inst) +# define lh_CONF_VALUE_retrieve(lh,inst) LHM_lh_retrieve(CONF_VALUE,lh,inst) +# define lh_CONF_VALUE_delete(lh,inst) LHM_lh_delete(CONF_VALUE,lh,inst) +# define lh_CONF_VALUE_doall(lh,fn) LHM_lh_doall(CONF_VALUE,lh,fn) +# define lh_CONF_VALUE_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(CONF_VALUE,lh,fn,arg_type,arg) +# define lh_CONF_VALUE_error(lh) LHM_lh_error(CONF_VALUE,lh) +# define lh_CONF_VALUE_num_items(lh) LHM_lh_num_items(CONF_VALUE,lh) +# define lh_CONF_VALUE_down_load(lh) LHM_lh_down_load(CONF_VALUE,lh) +# define lh_CONF_VALUE_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(CONF_VALUE,lh,out) +# define lh_CONF_VALUE_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(CONF_VALUE,lh,out) +# define lh_CONF_VALUE_stats_bio(lh,out) \ + LHM_lh_stats_bio(CONF_VALUE,lh,out) +# define lh_CONF_VALUE_free(lh) LHM_lh_free(CONF_VALUE,lh) +# define lh_ENGINE_PILE_new() LHM_lh_new(ENGINE_PILE,engine_pile) +# define lh_ENGINE_PILE_insert(lh,inst) LHM_lh_insert(ENGINE_PILE,lh,inst) +# define lh_ENGINE_PILE_retrieve(lh,inst) LHM_lh_retrieve(ENGINE_PILE,lh,inst) +# define lh_ENGINE_PILE_delete(lh,inst) LHM_lh_delete(ENGINE_PILE,lh,inst) +# define lh_ENGINE_PILE_doall(lh,fn) LHM_lh_doall(ENGINE_PILE,lh,fn) +# define lh_ENGINE_PILE_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(ENGINE_PILE,lh,fn,arg_type,arg) +# define lh_ENGINE_PILE_error(lh) LHM_lh_error(ENGINE_PILE,lh) +# define lh_ENGINE_PILE_num_items(lh) LHM_lh_num_items(ENGINE_PILE,lh) +# define lh_ENGINE_PILE_down_load(lh) LHM_lh_down_load(ENGINE_PILE,lh) +# define lh_ENGINE_PILE_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(ENGINE_PILE,lh,out) +# define lh_ENGINE_PILE_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(ENGINE_PILE,lh,out) +# define lh_ENGINE_PILE_stats_bio(lh,out) \ + LHM_lh_stats_bio(ENGINE_PILE,lh,out) +# define lh_ENGINE_PILE_free(lh) LHM_lh_free(ENGINE_PILE,lh) +# define lh_ERR_STATE_new() LHM_lh_new(ERR_STATE,err_state) +# define lh_ERR_STATE_insert(lh,inst) LHM_lh_insert(ERR_STATE,lh,inst) +# define lh_ERR_STATE_retrieve(lh,inst) LHM_lh_retrieve(ERR_STATE,lh,inst) +# define lh_ERR_STATE_delete(lh,inst) LHM_lh_delete(ERR_STATE,lh,inst) +# define lh_ERR_STATE_doall(lh,fn) LHM_lh_doall(ERR_STATE,lh,fn) +# define lh_ERR_STATE_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(ERR_STATE,lh,fn,arg_type,arg) +# define lh_ERR_STATE_error(lh) LHM_lh_error(ERR_STATE,lh) +# define lh_ERR_STATE_num_items(lh) LHM_lh_num_items(ERR_STATE,lh) +# define lh_ERR_STATE_down_load(lh) LHM_lh_down_load(ERR_STATE,lh) +# define lh_ERR_STATE_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(ERR_STATE,lh,out) +# define lh_ERR_STATE_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(ERR_STATE,lh,out) +# define lh_ERR_STATE_stats_bio(lh,out) \ + LHM_lh_stats_bio(ERR_STATE,lh,out) +# define lh_ERR_STATE_free(lh) LHM_lh_free(ERR_STATE,lh) +# define lh_ERR_STRING_DATA_new() LHM_lh_new(ERR_STRING_DATA,err_string_data) +# define lh_ERR_STRING_DATA_insert(lh,inst) LHM_lh_insert(ERR_STRING_DATA,lh,inst) +# define lh_ERR_STRING_DATA_retrieve(lh,inst) LHM_lh_retrieve(ERR_STRING_DATA,lh,inst) +# define lh_ERR_STRING_DATA_delete(lh,inst) LHM_lh_delete(ERR_STRING_DATA,lh,inst) +# define lh_ERR_STRING_DATA_doall(lh,fn) LHM_lh_doall(ERR_STRING_DATA,lh,fn) +# define lh_ERR_STRING_DATA_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(ERR_STRING_DATA,lh,fn,arg_type,arg) +# define lh_ERR_STRING_DATA_error(lh) LHM_lh_error(ERR_STRING_DATA,lh) +# define lh_ERR_STRING_DATA_num_items(lh) LHM_lh_num_items(ERR_STRING_DATA,lh) +# define lh_ERR_STRING_DATA_down_load(lh) LHM_lh_down_load(ERR_STRING_DATA,lh) +# define lh_ERR_STRING_DATA_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(ERR_STRING_DATA,lh,out) +# define lh_ERR_STRING_DATA_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(ERR_STRING_DATA,lh,out) +# define lh_ERR_STRING_DATA_stats_bio(lh,out) \ + LHM_lh_stats_bio(ERR_STRING_DATA,lh,out) +# define lh_ERR_STRING_DATA_free(lh) LHM_lh_free(ERR_STRING_DATA,lh) +# define lh_EX_CLASS_ITEM_new() LHM_lh_new(EX_CLASS_ITEM,ex_class_item) +# define lh_EX_CLASS_ITEM_insert(lh,inst) LHM_lh_insert(EX_CLASS_ITEM,lh,inst) +# define lh_EX_CLASS_ITEM_retrieve(lh,inst) LHM_lh_retrieve(EX_CLASS_ITEM,lh,inst) +# define lh_EX_CLASS_ITEM_delete(lh,inst) LHM_lh_delete(EX_CLASS_ITEM,lh,inst) +# define lh_EX_CLASS_ITEM_doall(lh,fn) LHM_lh_doall(EX_CLASS_ITEM,lh,fn) +# define lh_EX_CLASS_ITEM_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(EX_CLASS_ITEM,lh,fn,arg_type,arg) +# define lh_EX_CLASS_ITEM_error(lh) LHM_lh_error(EX_CLASS_ITEM,lh) +# define lh_EX_CLASS_ITEM_num_items(lh) LHM_lh_num_items(EX_CLASS_ITEM,lh) +# define lh_EX_CLASS_ITEM_down_load(lh) LHM_lh_down_load(EX_CLASS_ITEM,lh) +# define lh_EX_CLASS_ITEM_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(EX_CLASS_ITEM,lh,out) +# define lh_EX_CLASS_ITEM_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(EX_CLASS_ITEM,lh,out) +# define lh_EX_CLASS_ITEM_stats_bio(lh,out) \ + LHM_lh_stats_bio(EX_CLASS_ITEM,lh,out) +# define lh_EX_CLASS_ITEM_free(lh) LHM_lh_free(EX_CLASS_ITEM,lh) +# define lh_FUNCTION_new() LHM_lh_new(FUNCTION,function) +# define lh_FUNCTION_insert(lh,inst) LHM_lh_insert(FUNCTION,lh,inst) +# define lh_FUNCTION_retrieve(lh,inst) LHM_lh_retrieve(FUNCTION,lh,inst) +# define lh_FUNCTION_delete(lh,inst) LHM_lh_delete(FUNCTION,lh,inst) +# define lh_FUNCTION_doall(lh,fn) LHM_lh_doall(FUNCTION,lh,fn) +# define lh_FUNCTION_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(FUNCTION,lh,fn,arg_type,arg) +# define lh_FUNCTION_error(lh) LHM_lh_error(FUNCTION,lh) +# define lh_FUNCTION_num_items(lh) LHM_lh_num_items(FUNCTION,lh) +# define lh_FUNCTION_down_load(lh) LHM_lh_down_load(FUNCTION,lh) +# define lh_FUNCTION_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(FUNCTION,lh,out) +# define lh_FUNCTION_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(FUNCTION,lh,out) +# define lh_FUNCTION_stats_bio(lh,out) \ + LHM_lh_stats_bio(FUNCTION,lh,out) +# define lh_FUNCTION_free(lh) LHM_lh_free(FUNCTION,lh) +# define lh_MEM_new() LHM_lh_new(MEM,mem) +# define lh_MEM_insert(lh,inst) LHM_lh_insert(MEM,lh,inst) +# define lh_MEM_retrieve(lh,inst) LHM_lh_retrieve(MEM,lh,inst) +# define lh_MEM_delete(lh,inst) LHM_lh_delete(MEM,lh,inst) +# define lh_MEM_doall(lh,fn) LHM_lh_doall(MEM,lh,fn) +# define lh_MEM_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(MEM,lh,fn,arg_type,arg) +# define lh_MEM_error(lh) LHM_lh_error(MEM,lh) +# define lh_MEM_num_items(lh) LHM_lh_num_items(MEM,lh) +# define lh_MEM_down_load(lh) LHM_lh_down_load(MEM,lh) +# define lh_MEM_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(MEM,lh,out) +# define lh_MEM_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(MEM,lh,out) +# define lh_MEM_stats_bio(lh,out) \ + LHM_lh_stats_bio(MEM,lh,out) +# define lh_MEM_free(lh) LHM_lh_free(MEM,lh) +# define lh_OBJ_NAME_new() LHM_lh_new(OBJ_NAME,obj_name) +# define lh_OBJ_NAME_insert(lh,inst) LHM_lh_insert(OBJ_NAME,lh,inst) +# define lh_OBJ_NAME_retrieve(lh,inst) LHM_lh_retrieve(OBJ_NAME,lh,inst) +# define lh_OBJ_NAME_delete(lh,inst) LHM_lh_delete(OBJ_NAME,lh,inst) +# define lh_OBJ_NAME_doall(lh,fn) LHM_lh_doall(OBJ_NAME,lh,fn) +# define lh_OBJ_NAME_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(OBJ_NAME,lh,fn,arg_type,arg) +# define lh_OBJ_NAME_error(lh) LHM_lh_error(OBJ_NAME,lh) +# define lh_OBJ_NAME_num_items(lh) LHM_lh_num_items(OBJ_NAME,lh) +# define lh_OBJ_NAME_down_load(lh) LHM_lh_down_load(OBJ_NAME,lh) +# define lh_OBJ_NAME_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(OBJ_NAME,lh,out) +# define lh_OBJ_NAME_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(OBJ_NAME,lh,out) +# define lh_OBJ_NAME_stats_bio(lh,out) \ + LHM_lh_stats_bio(OBJ_NAME,lh,out) +# define lh_OBJ_NAME_free(lh) LHM_lh_free(OBJ_NAME,lh) +# define lh_OPENSSL_CSTRING_new() LHM_lh_new(OPENSSL_CSTRING,openssl_cstring) +# define lh_OPENSSL_CSTRING_insert(lh,inst) LHM_lh_insert(OPENSSL_CSTRING,lh,inst) +# define lh_OPENSSL_CSTRING_retrieve(lh,inst) LHM_lh_retrieve(OPENSSL_CSTRING,lh,inst) +# define lh_OPENSSL_CSTRING_delete(lh,inst) LHM_lh_delete(OPENSSL_CSTRING,lh,inst) +# define lh_OPENSSL_CSTRING_doall(lh,fn) LHM_lh_doall(OPENSSL_CSTRING,lh,fn) +# define lh_OPENSSL_CSTRING_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(OPENSSL_CSTRING,lh,fn,arg_type,arg) +# define lh_OPENSSL_CSTRING_error(lh) LHM_lh_error(OPENSSL_CSTRING,lh) +# define lh_OPENSSL_CSTRING_num_items(lh) LHM_lh_num_items(OPENSSL_CSTRING,lh) +# define lh_OPENSSL_CSTRING_down_load(lh) LHM_lh_down_load(OPENSSL_CSTRING,lh) +# define lh_OPENSSL_CSTRING_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(OPENSSL_CSTRING,lh,out) +# define lh_OPENSSL_CSTRING_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(OPENSSL_CSTRING,lh,out) +# define lh_OPENSSL_CSTRING_stats_bio(lh,out) \ + LHM_lh_stats_bio(OPENSSL_CSTRING,lh,out) +# define lh_OPENSSL_CSTRING_free(lh) LHM_lh_free(OPENSSL_CSTRING,lh) +# define lh_OPENSSL_STRING_new() LHM_lh_new(OPENSSL_STRING,openssl_string) +# define lh_OPENSSL_STRING_insert(lh,inst) LHM_lh_insert(OPENSSL_STRING,lh,inst) +# define lh_OPENSSL_STRING_retrieve(lh,inst) LHM_lh_retrieve(OPENSSL_STRING,lh,inst) +# define lh_OPENSSL_STRING_delete(lh,inst) LHM_lh_delete(OPENSSL_STRING,lh,inst) +# define lh_OPENSSL_STRING_doall(lh,fn) LHM_lh_doall(OPENSSL_STRING,lh,fn) +# define lh_OPENSSL_STRING_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(OPENSSL_STRING,lh,fn,arg_type,arg) +# define lh_OPENSSL_STRING_error(lh) LHM_lh_error(OPENSSL_STRING,lh) +# define lh_OPENSSL_STRING_num_items(lh) LHM_lh_num_items(OPENSSL_STRING,lh) +# define lh_OPENSSL_STRING_down_load(lh) LHM_lh_down_load(OPENSSL_STRING,lh) +# define lh_OPENSSL_STRING_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(OPENSSL_STRING,lh,out) +# define lh_OPENSSL_STRING_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(OPENSSL_STRING,lh,out) +# define lh_OPENSSL_STRING_stats_bio(lh,out) \ + LHM_lh_stats_bio(OPENSSL_STRING,lh,out) +# define lh_OPENSSL_STRING_free(lh) LHM_lh_free(OPENSSL_STRING,lh) +# define lh_SSL_SESSION_new() LHM_lh_new(SSL_SESSION,ssl_session) +# define lh_SSL_SESSION_insert(lh,inst) LHM_lh_insert(SSL_SESSION,lh,inst) +# define lh_SSL_SESSION_retrieve(lh,inst) LHM_lh_retrieve(SSL_SESSION,lh,inst) +# define lh_SSL_SESSION_delete(lh,inst) LHM_lh_delete(SSL_SESSION,lh,inst) +# define lh_SSL_SESSION_doall(lh,fn) LHM_lh_doall(SSL_SESSION,lh,fn) +# define lh_SSL_SESSION_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(SSL_SESSION,lh,fn,arg_type,arg) +# define lh_SSL_SESSION_error(lh) LHM_lh_error(SSL_SESSION,lh) +# define lh_SSL_SESSION_num_items(lh) LHM_lh_num_items(SSL_SESSION,lh) +# define lh_SSL_SESSION_down_load(lh) LHM_lh_down_load(SSL_SESSION,lh) +# define lh_SSL_SESSION_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(SSL_SESSION,lh,out) +# define lh_SSL_SESSION_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(SSL_SESSION,lh,out) +# define lh_SSL_SESSION_stats_bio(lh,out) \ + LHM_lh_stats_bio(SSL_SESSION,lh,out) +# define lh_SSL_SESSION_free(lh) LHM_lh_free(SSL_SESSION,lh) +#ifdef __cplusplus +} +#endif +#endif /* !defined HEADER_SAFESTACK_H */ diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/seed.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/seed.h new file mode 100644 index 0000000..8cbf0d9 --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/seed.h @@ -0,0 +1,149 @@ +/* + * Copyright (c) 2007 KISA(Korea Information Security Agency). All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Neither the name of author nor the names of its contributors may + * be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY 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 + * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ +/* ==================================================================== + * Copyright (c) 1998-2007 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_SEED_H +# define HEADER_SEED_H + +# include +# include +# include + +# ifdef OPENSSL_NO_SEED +# error SEED is disabled. +# endif + +/* look whether we need 'long' to get 32 bits */ +# ifdef AES_LONG +# ifndef SEED_LONG +# define SEED_LONG 1 +# endif +# endif + +# if !defined(NO_SYS_TYPES_H) +# include +# endif + +# define SEED_BLOCK_SIZE 16 +# define SEED_KEY_LENGTH 16 + + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct seed_key_st { +# ifdef SEED_LONG + unsigned long data[32]; +# else + unsigned int data[32]; +# endif +} SEED_KEY_SCHEDULE; + +# ifdef OPENSSL_FIPS +void private_SEED_set_key(const unsigned char rawkey[SEED_KEY_LENGTH], + SEED_KEY_SCHEDULE *ks); +# endif +void SEED_set_key(const unsigned char rawkey[SEED_KEY_LENGTH], + SEED_KEY_SCHEDULE *ks); + +void SEED_encrypt(const unsigned char s[SEED_BLOCK_SIZE], + unsigned char d[SEED_BLOCK_SIZE], + const SEED_KEY_SCHEDULE *ks); +void SEED_decrypt(const unsigned char s[SEED_BLOCK_SIZE], + unsigned char d[SEED_BLOCK_SIZE], + const SEED_KEY_SCHEDULE *ks); + +void SEED_ecb_encrypt(const unsigned char *in, unsigned char *out, + const SEED_KEY_SCHEDULE *ks, int enc); +void SEED_cbc_encrypt(const unsigned char *in, unsigned char *out, size_t len, + const SEED_KEY_SCHEDULE *ks, + unsigned char ivec[SEED_BLOCK_SIZE], int enc); +void SEED_cfb128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const SEED_KEY_SCHEDULE *ks, + unsigned char ivec[SEED_BLOCK_SIZE], int *num, + int enc); +void SEED_ofb128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const SEED_KEY_SCHEDULE *ks, + unsigned char ivec[SEED_BLOCK_SIZE], int *num); + +#ifdef __cplusplus +} +#endif + +#endif /* HEADER_SEED_H */ diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/sha.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/sha.h new file mode 100644 index 0000000..e5169e4 --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/sha.h @@ -0,0 +1,214 @@ +/* crypto/sha/sha.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_SHA_H +# define HEADER_SHA_H + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# if defined(OPENSSL_NO_SHA) || (defined(OPENSSL_NO_SHA0) && defined(OPENSSL_NO_SHA1)) +# error SHA is disabled. +# endif + +# if defined(OPENSSL_FIPS) +# define FIPS_SHA_SIZE_T size_t +# endif + +/*- + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + * ! SHA_LONG has to be at least 32 bits wide. If it's wider, then ! + * ! SHA_LONG_LOG2 has to be defined along. ! + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + */ + +# if defined(__LP32__) +# define SHA_LONG unsigned long +# elif defined(OPENSSL_SYS_CRAY) || defined(__ILP64__) +# define SHA_LONG unsigned long +# define SHA_LONG_LOG2 3 +# else +# define SHA_LONG unsigned int +# endif + +# define SHA_LBLOCK 16 +# define SHA_CBLOCK (SHA_LBLOCK*4)/* SHA treats input data as a + * contiguous array of 32 bit wide + * big-endian values. */ +# define SHA_LAST_BLOCK (SHA_CBLOCK-8) +# define SHA_DIGEST_LENGTH 20 + +typedef struct SHAstate_st { + SHA_LONG h0, h1, h2, h3, h4; + SHA_LONG Nl, Nh; + SHA_LONG data[SHA_LBLOCK]; + unsigned int num; +} SHA_CTX; + +# ifndef OPENSSL_NO_SHA0 +# ifdef OPENSSL_FIPS +int private_SHA_Init(SHA_CTX *c); +# endif +int SHA_Init(SHA_CTX *c); +int SHA_Update(SHA_CTX *c, const void *data, size_t len); +int SHA_Final(unsigned char *md, SHA_CTX *c); +unsigned char *SHA(const unsigned char *d, size_t n, unsigned char *md); +void SHA_Transform(SHA_CTX *c, const unsigned char *data); +# endif +# ifndef OPENSSL_NO_SHA1 +# ifdef OPENSSL_FIPS +int private_SHA1_Init(SHA_CTX *c); +# endif +int SHA1_Init(SHA_CTX *c); +int SHA1_Update(SHA_CTX *c, const void *data, size_t len); +int SHA1_Final(unsigned char *md, SHA_CTX *c); +unsigned char *SHA1(const unsigned char *d, size_t n, unsigned char *md); +void SHA1_Transform(SHA_CTX *c, const unsigned char *data); +# endif + +# define SHA256_CBLOCK (SHA_LBLOCK*4)/* SHA-256 treats input data as a + * contiguous array of 32 bit wide + * big-endian values. */ +# define SHA224_DIGEST_LENGTH 28 +# define SHA256_DIGEST_LENGTH 32 + +typedef struct SHA256state_st { + SHA_LONG h[8]; + SHA_LONG Nl, Nh; + SHA_LONG data[SHA_LBLOCK]; + unsigned int num, md_len; +} SHA256_CTX; + +# ifndef OPENSSL_NO_SHA256 +# ifdef OPENSSL_FIPS +int private_SHA224_Init(SHA256_CTX *c); +int private_SHA256_Init(SHA256_CTX *c); +# endif +int SHA224_Init(SHA256_CTX *c); +int SHA224_Update(SHA256_CTX *c, const void *data, size_t len); +int SHA224_Final(unsigned char *md, SHA256_CTX *c); +unsigned char *SHA224(const unsigned char *d, size_t n, unsigned char *md); +int SHA256_Init(SHA256_CTX *c); +int SHA256_Update(SHA256_CTX *c, const void *data, size_t len); +int SHA256_Final(unsigned char *md, SHA256_CTX *c); +unsigned char *SHA256(const unsigned char *d, size_t n, unsigned char *md); +void SHA256_Transform(SHA256_CTX *c, const unsigned char *data); +# endif + +# define SHA384_DIGEST_LENGTH 48 +# define SHA512_DIGEST_LENGTH 64 + +# ifndef OPENSSL_NO_SHA512 +/* + * Unlike 32-bit digest algorithms, SHA-512 *relies* on SHA_LONG64 + * being exactly 64-bit wide. See Implementation Notes in sha512.c + * for further details. + */ +/* + * SHA-512 treats input data as a + * contiguous array of 64 bit + * wide big-endian values. + */ +# define SHA512_CBLOCK (SHA_LBLOCK*8) +# if (defined(_WIN32) || defined(_WIN64)) && !defined(__MINGW32__) +# define SHA_LONG64 unsigned __int64 +# define U64(C) C##UI64 +# elif defined(__arch64__) +# define SHA_LONG64 unsigned long +# define U64(C) C##UL +# else +# define SHA_LONG64 unsigned long long +# define U64(C) C##ULL +# endif + +typedef struct SHA512state_st { + SHA_LONG64 h[8]; + SHA_LONG64 Nl, Nh; + union { + SHA_LONG64 d[SHA_LBLOCK]; + unsigned char p[SHA512_CBLOCK]; + } u; + unsigned int num, md_len; +} SHA512_CTX; +# endif + +# ifndef OPENSSL_NO_SHA512 +# ifdef OPENSSL_FIPS +int private_SHA384_Init(SHA512_CTX *c); +int private_SHA512_Init(SHA512_CTX *c); +# endif +int SHA384_Init(SHA512_CTX *c); +int SHA384_Update(SHA512_CTX *c, const void *data, size_t len); +int SHA384_Final(unsigned char *md, SHA512_CTX *c); +unsigned char *SHA384(const unsigned char *d, size_t n, unsigned char *md); +int SHA512_Init(SHA512_CTX *c); +int SHA512_Update(SHA512_CTX *c, const void *data, size_t len); +int SHA512_Final(unsigned char *md, SHA512_CTX *c); +unsigned char *SHA512(const unsigned char *d, size_t n, unsigned char *md); +void SHA512_Transform(SHA512_CTX *c, const unsigned char *data); +# endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/srp.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/srp.h new file mode 100644 index 0000000..028892a --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/srp.h @@ -0,0 +1,179 @@ +/* crypto/srp/srp.h */ +/* + * Written by Christophe Renou (christophe.renou@edelweb.fr) with the + * precious help of Peter Sylvester (peter.sylvester@edelweb.fr) for the + * EdelKey project and contributed to the OpenSSL project 2004. + */ +/* ==================================================================== + * Copyright (c) 2004 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +#ifndef __SRP_H__ +# define __SRP_H__ + +# ifndef OPENSSL_NO_SRP + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# include +# include +# include + +typedef struct SRP_gN_cache_st { + char *b64_bn; + BIGNUM *bn; +} SRP_gN_cache; + + +DECLARE_STACK_OF(SRP_gN_cache) + +typedef struct SRP_user_pwd_st { + /* Owned by us. */ + char *id; + BIGNUM *s; + BIGNUM *v; + /* Not owned by us. */ + const BIGNUM *g; + const BIGNUM *N; + /* Owned by us. */ + char *info; +} SRP_user_pwd; + +DECLARE_STACK_OF(SRP_user_pwd) + +void SRP_user_pwd_free(SRP_user_pwd *user_pwd); + +typedef struct SRP_VBASE_st { + STACK_OF(SRP_user_pwd) *users_pwd; + STACK_OF(SRP_gN_cache) *gN_cache; +/* to simulate a user */ + char *seed_key; + BIGNUM *default_g; + BIGNUM *default_N; +} SRP_VBASE; + +/* + * Structure interne pour retenir les couples N et g + */ +typedef struct SRP_gN_st { + char *id; + BIGNUM *g; + BIGNUM *N; +} SRP_gN; + +DECLARE_STACK_OF(SRP_gN) + +SRP_VBASE *SRP_VBASE_new(char *seed_key); +int SRP_VBASE_free(SRP_VBASE *vb); +int SRP_VBASE_init(SRP_VBASE *vb, char *verifier_file); + +/* This method ignores the configured seed and fails for an unknown user. */ +SRP_user_pwd *SRP_VBASE_get_by_user(SRP_VBASE *vb, char *username); +/* NOTE: unlike in SRP_VBASE_get_by_user, caller owns the returned pointer.*/ +SRP_user_pwd *SRP_VBASE_get1_by_user(SRP_VBASE *vb, char *username); + +char *SRP_create_verifier(const char *user, const char *pass, char **salt, + char **verifier, const char *N, const char *g); +int SRP_create_verifier_BN(const char *user, const char *pass, BIGNUM **salt, + BIGNUM **verifier, BIGNUM *N, BIGNUM *g); + +# define SRP_NO_ERROR 0 +# define SRP_ERR_VBASE_INCOMPLETE_FILE 1 +# define SRP_ERR_VBASE_BN_LIB 2 +# define SRP_ERR_OPEN_FILE 3 +# define SRP_ERR_MEMORY 4 + +# define DB_srptype 0 +# define DB_srpverifier 1 +# define DB_srpsalt 2 +# define DB_srpid 3 +# define DB_srpgN 4 +# define DB_srpinfo 5 +# undef DB_NUMBER +# define DB_NUMBER 6 + +# define DB_SRP_INDEX 'I' +# define DB_SRP_VALID 'V' +# define DB_SRP_REVOKED 'R' +# define DB_SRP_MODIF 'v' + +/* see srp.c */ +char *SRP_check_known_gN_param(BIGNUM *g, BIGNUM *N); +SRP_gN *SRP_get_default_gN(const char *id); + +/* server side .... */ +BIGNUM *SRP_Calc_server_key(BIGNUM *A, BIGNUM *v, BIGNUM *u, BIGNUM *b, + BIGNUM *N); +BIGNUM *SRP_Calc_B(BIGNUM *b, BIGNUM *N, BIGNUM *g, BIGNUM *v); +int SRP_Verify_A_mod_N(BIGNUM *A, BIGNUM *N); +BIGNUM *SRP_Calc_u(BIGNUM *A, BIGNUM *B, BIGNUM *N); + +/* client side .... */ +BIGNUM *SRP_Calc_x(BIGNUM *s, const char *user, const char *pass); +BIGNUM *SRP_Calc_A(BIGNUM *a, BIGNUM *N, BIGNUM *g); +BIGNUM *SRP_Calc_client_key(BIGNUM *N, BIGNUM *B, BIGNUM *g, BIGNUM *x, + BIGNUM *a, BIGNUM *u); +int SRP_Verify_B_mod_N(BIGNUM *B, BIGNUM *N); + +# define SRP_MINIMAL_N 1024 + +#ifdef __cplusplus +} +#endif + +# endif +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/srtp.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/srtp.h new file mode 100644 index 0000000..2279c32 --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/srtp.h @@ -0,0 +1,147 @@ +/* ssl/srtp.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ +/* ==================================================================== + * Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +/* + * DTLS code by Eric Rescorla + * + * Copyright (C) 2006, Network Resonance, Inc. Copyright (C) 2011, RTFM, Inc. + */ + +#ifndef HEADER_D1_SRTP_H +# define HEADER_D1_SRTP_H + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# define SRTP_AES128_CM_SHA1_80 0x0001 +# define SRTP_AES128_CM_SHA1_32 0x0002 +# define SRTP_AES128_F8_SHA1_80 0x0003 +# define SRTP_AES128_F8_SHA1_32 0x0004 +# define SRTP_NULL_SHA1_80 0x0005 +# define SRTP_NULL_SHA1_32 0x0006 + +# ifndef OPENSSL_NO_SRTP + +int SSL_CTX_set_tlsext_use_srtp(SSL_CTX *ctx, const char *profiles); +int SSL_set_tlsext_use_srtp(SSL *ctx, const char *profiles); + +STACK_OF(SRTP_PROTECTION_PROFILE) *SSL_get_srtp_profiles(SSL *ssl); +SRTP_PROTECTION_PROFILE *SSL_get_selected_srtp_profile(SSL *s); + +# endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/ssl.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/ssl.h new file mode 100644 index 0000000..90aeb0c --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/ssl.h @@ -0,0 +1,3163 @@ +/* ssl/ssl.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ +/* ==================================================================== + * Copyright (c) 1998-2007 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * ECC cipher suite support in OpenSSL originally developed by + * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project. + */ +/* ==================================================================== + * Copyright 2005 Nokia. All rights reserved. + * + * The portions of the attached software ("Contribution") is developed by + * Nokia Corporation and is licensed pursuant to the OpenSSL open source + * license. + * + * The Contribution, originally written by Mika Kousa and Pasi Eronen of + * Nokia Corporation, consists of the "PSK" (Pre-Shared Key) ciphersuites + * support (see RFC 4279) to OpenSSL. + * + * No patent licenses or other rights except those expressly stated in + * the OpenSSL open source license shall be deemed granted or received + * expressly, by implication, estoppel, or otherwise. + * + * No assurances are provided by Nokia that the Contribution does not + * infringe the patent or other intellectual property rights of any third + * party or that the license provides you with all the necessary rights + * to make use of the Contribution. + * + * THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. IN + * ADDITION TO THE DISCLAIMERS INCLUDED IN THE LICENSE, NOKIA + * SPECIFICALLY DISCLAIMS ANY LIABILITY FOR CLAIMS BROUGHT BY YOU OR ANY + * OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS OR + * OTHERWISE. + */ + +#ifndef HEADER_SSL_H +# define HEADER_SSL_H + +# include + +# ifndef OPENSSL_NO_COMP +# include +# endif +# ifndef OPENSSL_NO_BIO +# include +# endif +# ifndef OPENSSL_NO_DEPRECATED +# ifndef OPENSSL_NO_X509 +# include +# endif +# include +# include +# include +# endif +# include +# include + +# include +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* SSLeay version number for ASN.1 encoding of the session information */ +/*- + * Version 0 - initial version + * Version 1 - added the optional peer certificate + */ +# define SSL_SESSION_ASN1_VERSION 0x0001 + +/* text strings for the ciphers */ +# define SSL_TXT_NULL_WITH_MD5 SSL2_TXT_NULL_WITH_MD5 +# define SSL_TXT_RC4_128_WITH_MD5 SSL2_TXT_RC4_128_WITH_MD5 +# define SSL_TXT_RC4_128_EXPORT40_WITH_MD5 SSL2_TXT_RC4_128_EXPORT40_WITH_MD5 +# define SSL_TXT_RC2_128_CBC_WITH_MD5 SSL2_TXT_RC2_128_CBC_WITH_MD5 +# define SSL_TXT_RC2_128_CBC_EXPORT40_WITH_MD5 SSL2_TXT_RC2_128_CBC_EXPORT40_WITH_MD5 +# define SSL_TXT_IDEA_128_CBC_WITH_MD5 SSL2_TXT_IDEA_128_CBC_WITH_MD5 +# define SSL_TXT_DES_64_CBC_WITH_MD5 SSL2_TXT_DES_64_CBC_WITH_MD5 +# define SSL_TXT_DES_64_CBC_WITH_SHA SSL2_TXT_DES_64_CBC_WITH_SHA +# define SSL_TXT_DES_192_EDE3_CBC_WITH_MD5 SSL2_TXT_DES_192_EDE3_CBC_WITH_MD5 +# define SSL_TXT_DES_192_EDE3_CBC_WITH_SHA SSL2_TXT_DES_192_EDE3_CBC_WITH_SHA + +/* + * VRS Additional Kerberos5 entries + */ +# define SSL_TXT_KRB5_DES_64_CBC_SHA SSL3_TXT_KRB5_DES_64_CBC_SHA +# define SSL_TXT_KRB5_DES_192_CBC3_SHA SSL3_TXT_KRB5_DES_192_CBC3_SHA +# define SSL_TXT_KRB5_RC4_128_SHA SSL3_TXT_KRB5_RC4_128_SHA +# define SSL_TXT_KRB5_IDEA_128_CBC_SHA SSL3_TXT_KRB5_IDEA_128_CBC_SHA +# define SSL_TXT_KRB5_DES_64_CBC_MD5 SSL3_TXT_KRB5_DES_64_CBC_MD5 +# define SSL_TXT_KRB5_DES_192_CBC3_MD5 SSL3_TXT_KRB5_DES_192_CBC3_MD5 +# define SSL_TXT_KRB5_RC4_128_MD5 SSL3_TXT_KRB5_RC4_128_MD5 +# define SSL_TXT_KRB5_IDEA_128_CBC_MD5 SSL3_TXT_KRB5_IDEA_128_CBC_MD5 + +# define SSL_TXT_KRB5_DES_40_CBC_SHA SSL3_TXT_KRB5_DES_40_CBC_SHA +# define SSL_TXT_KRB5_RC2_40_CBC_SHA SSL3_TXT_KRB5_RC2_40_CBC_SHA +# define SSL_TXT_KRB5_RC4_40_SHA SSL3_TXT_KRB5_RC4_40_SHA +# define SSL_TXT_KRB5_DES_40_CBC_MD5 SSL3_TXT_KRB5_DES_40_CBC_MD5 +# define SSL_TXT_KRB5_RC2_40_CBC_MD5 SSL3_TXT_KRB5_RC2_40_CBC_MD5 +# define SSL_TXT_KRB5_RC4_40_MD5 SSL3_TXT_KRB5_RC4_40_MD5 + +# define SSL_TXT_KRB5_DES_40_CBC_SHA SSL3_TXT_KRB5_DES_40_CBC_SHA +# define SSL_TXT_KRB5_DES_40_CBC_MD5 SSL3_TXT_KRB5_DES_40_CBC_MD5 +# define SSL_TXT_KRB5_DES_64_CBC_SHA SSL3_TXT_KRB5_DES_64_CBC_SHA +# define SSL_TXT_KRB5_DES_64_CBC_MD5 SSL3_TXT_KRB5_DES_64_CBC_MD5 +# define SSL_TXT_KRB5_DES_192_CBC3_SHA SSL3_TXT_KRB5_DES_192_CBC3_SHA +# define SSL_TXT_KRB5_DES_192_CBC3_MD5 SSL3_TXT_KRB5_DES_192_CBC3_MD5 +# define SSL_MAX_KRB5_PRINCIPAL_LENGTH 256 + +# define SSL_MAX_SSL_SESSION_ID_LENGTH 32 +# define SSL_MAX_SID_CTX_LENGTH 32 + +# define SSL_MIN_RSA_MODULUS_LENGTH_IN_BYTES (512/8) +# define SSL_MAX_KEY_ARG_LENGTH 8 +# define SSL_MAX_MASTER_KEY_LENGTH 48 + +/* These are used to specify which ciphers to use and not to use */ + +# define SSL_TXT_EXP40 "EXPORT40" +# define SSL_TXT_EXP56 "EXPORT56" +# define SSL_TXT_LOW "LOW" +# define SSL_TXT_MEDIUM "MEDIUM" +# define SSL_TXT_HIGH "HIGH" +# define SSL_TXT_FIPS "FIPS" + +# define SSL_TXT_kFZA "kFZA"/* unused! */ +# define SSL_TXT_aFZA "aFZA"/* unused! */ +# define SSL_TXT_eFZA "eFZA"/* unused! */ +# define SSL_TXT_FZA "FZA"/* unused! */ + +# define SSL_TXT_aNULL "aNULL" +# define SSL_TXT_eNULL "eNULL" +# define SSL_TXT_NULL "NULL" + +# define SSL_TXT_kRSA "kRSA" +# define SSL_TXT_kDHr "kDHr" +# define SSL_TXT_kDHd "kDHd" +# define SSL_TXT_kDH "kDH" +# define SSL_TXT_kEDH "kEDH" +# define SSL_TXT_kDHE "kDHE"/* alias for kEDH */ +# define SSL_TXT_kKRB5 "kKRB5" +# define SSL_TXT_kECDHr "kECDHr" +# define SSL_TXT_kECDHe "kECDHe" +# define SSL_TXT_kECDH "kECDH" +# define SSL_TXT_kEECDH "kEECDH" +# define SSL_TXT_kECDHE "kECDHE"/* alias for kEECDH */ +# define SSL_TXT_kPSK "kPSK" +# define SSL_TXT_kGOST "kGOST" +# define SSL_TXT_kSRP "kSRP" + +# define SSL_TXT_aRSA "aRSA" +# define SSL_TXT_aDSS "aDSS" +# define SSL_TXT_aDH "aDH" +# define SSL_TXT_aECDH "aECDH" +# define SSL_TXT_aKRB5 "aKRB5" +# define SSL_TXT_aECDSA "aECDSA" +# define SSL_TXT_aPSK "aPSK" +# define SSL_TXT_aGOST94 "aGOST94" +# define SSL_TXT_aGOST01 "aGOST01" +# define SSL_TXT_aGOST "aGOST" +# define SSL_TXT_aSRP "aSRP" + +# define SSL_TXT_DSS "DSS" +# define SSL_TXT_DH "DH" +# define SSL_TXT_EDH "EDH"/* same as "kEDH:-ADH" */ +# define SSL_TXT_DHE "DHE"/* alias for EDH */ +# define SSL_TXT_ADH "ADH" +# define SSL_TXT_RSA "RSA" +# define SSL_TXT_ECDH "ECDH" +# define SSL_TXT_EECDH "EECDH"/* same as "kEECDH:-AECDH" */ +# define SSL_TXT_ECDHE "ECDHE"/* alias for ECDHE" */ +# define SSL_TXT_AECDH "AECDH" +# define SSL_TXT_ECDSA "ECDSA" +# define SSL_TXT_KRB5 "KRB5" +# define SSL_TXT_PSK "PSK" +# define SSL_TXT_SRP "SRP" + +# define SSL_TXT_DES "DES" +# define SSL_TXT_3DES "3DES" +# define SSL_TXT_RC4 "RC4" +# define SSL_TXT_RC2 "RC2" +# define SSL_TXT_IDEA "IDEA" +# define SSL_TXT_SEED "SEED" +# define SSL_TXT_AES128 "AES128" +# define SSL_TXT_AES256 "AES256" +# define SSL_TXT_AES "AES" +# define SSL_TXT_AES_GCM "AESGCM" +# define SSL_TXT_CAMELLIA128 "CAMELLIA128" +# define SSL_TXT_CAMELLIA256 "CAMELLIA256" +# define SSL_TXT_CAMELLIA "CAMELLIA" + +# define SSL_TXT_MD5 "MD5" +# define SSL_TXT_SHA1 "SHA1" +# define SSL_TXT_SHA "SHA"/* same as "SHA1" */ +# define SSL_TXT_GOST94 "GOST94" +# define SSL_TXT_GOST89MAC "GOST89MAC" +# define SSL_TXT_SHA256 "SHA256" +# define SSL_TXT_SHA384 "SHA384" + +# define SSL_TXT_SSLV2 "SSLv2" +# define SSL_TXT_SSLV3 "SSLv3" +# define SSL_TXT_TLSV1 "TLSv1" +# define SSL_TXT_TLSV1_1 "TLSv1.1" +# define SSL_TXT_TLSV1_2 "TLSv1.2" + +# define SSL_TXT_EXP "EXP" +# define SSL_TXT_EXPORT "EXPORT" + +# define SSL_TXT_ALL "ALL" + +/*- + * COMPLEMENTOF* definitions. These identifiers are used to (de-select) + * ciphers normally not being used. + * Example: "RC4" will activate all ciphers using RC4 including ciphers + * without authentication, which would normally disabled by DEFAULT (due + * the "!ADH" being part of default). Therefore "RC4:!COMPLEMENTOFDEFAULT" + * will make sure that it is also disabled in the specific selection. + * COMPLEMENTOF* identifiers are portable between version, as adjustments + * to the default cipher setup will also be included here. + * + * COMPLEMENTOFDEFAULT does not experience the same special treatment that + * DEFAULT gets, as only selection is being done and no sorting as needed + * for DEFAULT. + */ +# define SSL_TXT_CMPALL "COMPLEMENTOFALL" +# define SSL_TXT_CMPDEF "COMPLEMENTOFDEFAULT" + +/* + * The following cipher list is used by default. It also is substituted when + * an application-defined cipher list string starts with 'DEFAULT'. + */ +# define SSL_DEFAULT_CIPHER_LIST "ALL:!EXPORT:!LOW:!aNULL:!eNULL:!SSLv2" +/* + * As of OpenSSL 1.0.0, ssl_create_cipher_list() in ssl/ssl_ciph.c always + * starts with a reasonable order, and all we have to do for DEFAULT is + * throwing out anonymous and unencrypted ciphersuites! (The latter are not + * actually enabled by ALL, but "ALL:RSA" would enable some of them.) + */ + +/* Used in SSL_set_shutdown()/SSL_get_shutdown(); */ +# define SSL_SENT_SHUTDOWN 1 +# define SSL_RECEIVED_SHUTDOWN 2 + +#ifdef __cplusplus +} +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +# if (defined(OPENSSL_NO_RSA) || defined(OPENSSL_NO_MD5)) && !defined(OPENSSL_NO_SSL2) +# define OPENSSL_NO_SSL2 +# endif + +# define SSL_FILETYPE_ASN1 X509_FILETYPE_ASN1 +# define SSL_FILETYPE_PEM X509_FILETYPE_PEM + +/* + * This is needed to stop compilers complaining about the 'struct ssl_st *' + * function parameters used to prototype callbacks in SSL_CTX. + */ +typedef struct ssl_st *ssl_crock_st; +typedef struct tls_session_ticket_ext_st TLS_SESSION_TICKET_EXT; +typedef struct ssl_method_st SSL_METHOD; +typedef struct ssl_cipher_st SSL_CIPHER; +typedef struct ssl_session_st SSL_SESSION; +typedef struct tls_sigalgs_st TLS_SIGALGS; +typedef struct ssl_conf_ctx_st SSL_CONF_CTX; + +DECLARE_STACK_OF(SSL_CIPHER) + +/* SRTP protection profiles for use with the use_srtp extension (RFC 5764)*/ +typedef struct srtp_protection_profile_st { + const char *name; + unsigned long id; +} SRTP_PROTECTION_PROFILE; + +DECLARE_STACK_OF(SRTP_PROTECTION_PROFILE) + +typedef int (*tls_session_ticket_ext_cb_fn) (SSL *s, + const unsigned char *data, + int len, void *arg); +typedef int (*tls_session_secret_cb_fn) (SSL *s, void *secret, + int *secret_len, + STACK_OF(SSL_CIPHER) *peer_ciphers, + SSL_CIPHER **cipher, void *arg); + +# ifndef OPENSSL_NO_TLSEXT + +/* Typedefs for handling custom extensions */ + +typedef int (*custom_ext_add_cb) (SSL *s, unsigned int ext_type, + const unsigned char **out, + size_t *outlen, int *al, void *add_arg); + +typedef void (*custom_ext_free_cb) (SSL *s, unsigned int ext_type, + const unsigned char *out, void *add_arg); + +typedef int (*custom_ext_parse_cb) (SSL *s, unsigned int ext_type, + const unsigned char *in, + size_t inlen, int *al, void *parse_arg); + +# endif + +# ifndef OPENSSL_NO_SSL_INTERN + +/* used to hold info on the particular ciphers used */ +struct ssl_cipher_st { + int valid; + const char *name; /* text name */ + unsigned long id; /* id, 4 bytes, first is version */ + /* + * changed in 0.9.9: these four used to be portions of a single value + * 'algorithms' + */ + unsigned long algorithm_mkey; /* key exchange algorithm */ + unsigned long algorithm_auth; /* server authentication */ + unsigned long algorithm_enc; /* symmetric encryption */ + unsigned long algorithm_mac; /* symmetric authentication */ + unsigned long algorithm_ssl; /* (major) protocol version */ + unsigned long algo_strength; /* strength and export flags */ + unsigned long algorithm2; /* Extra flags */ + int strength_bits; /* Number of bits really used */ + int alg_bits; /* Number of bits for algorithm */ +}; + +/* Used to hold functions for SSLv2 or SSLv3/TLSv1 functions */ +struct ssl_method_st { + int version; + int (*ssl_new) (SSL *s); + void (*ssl_clear) (SSL *s); + void (*ssl_free) (SSL *s); + int (*ssl_accept) (SSL *s); + int (*ssl_connect) (SSL *s); + int (*ssl_read) (SSL *s, void *buf, int len); + int (*ssl_peek) (SSL *s, void *buf, int len); + int (*ssl_write) (SSL *s, const void *buf, int len); + int (*ssl_shutdown) (SSL *s); + int (*ssl_renegotiate) (SSL *s); + int (*ssl_renegotiate_check) (SSL *s); + long (*ssl_get_message) (SSL *s, int st1, int stn, int mt, long + max, int *ok); + int (*ssl_read_bytes) (SSL *s, int type, unsigned char *buf, int len, + int peek); + int (*ssl_write_bytes) (SSL *s, int type, const void *buf_, int len); + int (*ssl_dispatch_alert) (SSL *s); + long (*ssl_ctrl) (SSL *s, int cmd, long larg, void *parg); + long (*ssl_ctx_ctrl) (SSL_CTX *ctx, int cmd, long larg, void *parg); + const SSL_CIPHER *(*get_cipher_by_char) (const unsigned char *ptr); + int (*put_cipher_by_char) (const SSL_CIPHER *cipher, unsigned char *ptr); + int (*ssl_pending) (const SSL *s); + int (*num_ciphers) (void); + const SSL_CIPHER *(*get_cipher) (unsigned ncipher); + const struct ssl_method_st *(*get_ssl_method) (int version); + long (*get_timeout) (void); + struct ssl3_enc_method *ssl3_enc; /* Extra SSLv3/TLS stuff */ + int (*ssl_version) (void); + long (*ssl_callback_ctrl) (SSL *s, int cb_id, void (*fp) (void)); + long (*ssl_ctx_callback_ctrl) (SSL_CTX *s, int cb_id, void (*fp) (void)); +}; + +/*- + * Lets make this into an ASN.1 type structure as follows + * SSL_SESSION_ID ::= SEQUENCE { + * version INTEGER, -- structure version number + * SSLversion INTEGER, -- SSL version number + * Cipher OCTET STRING, -- the 3 byte cipher ID + * Session_ID OCTET STRING, -- the Session ID + * Master_key OCTET STRING, -- the master key + * KRB5_principal OCTET STRING -- optional Kerberos principal + * Key_Arg [ 0 ] IMPLICIT OCTET STRING, -- the optional Key argument + * Time [ 1 ] EXPLICIT INTEGER, -- optional Start Time + * Timeout [ 2 ] EXPLICIT INTEGER, -- optional Timeout ins seconds + * Peer [ 3 ] EXPLICIT X509, -- optional Peer Certificate + * Session_ID_context [ 4 ] EXPLICIT OCTET STRING, -- the Session ID context + * Verify_result [ 5 ] EXPLICIT INTEGER, -- X509_V_... code for `Peer' + * HostName [ 6 ] EXPLICIT OCTET STRING, -- optional HostName from servername TLS extension + * PSK_identity_hint [ 7 ] EXPLICIT OCTET STRING, -- optional PSK identity hint + * PSK_identity [ 8 ] EXPLICIT OCTET STRING, -- optional PSK identity + * Ticket_lifetime_hint [9] EXPLICIT INTEGER, -- server's lifetime hint for session ticket + * Ticket [10] EXPLICIT OCTET STRING, -- session ticket (clients only) + * Compression_meth [11] EXPLICIT OCTET STRING, -- optional compression method + * SRP_username [ 12 ] EXPLICIT OCTET STRING -- optional SRP username + * } + * Look in ssl/ssl_asn1.c for more details + * I'm using EXPLICIT tags so I can read the damn things using asn1parse :-). + */ +struct ssl_session_st { + int ssl_version; /* what ssl version session info is being + * kept in here? */ + /* only really used in SSLv2 */ + unsigned int key_arg_length; + unsigned char key_arg[SSL_MAX_KEY_ARG_LENGTH]; + int master_key_length; + unsigned char master_key[SSL_MAX_MASTER_KEY_LENGTH]; + /* session_id - valid? */ + unsigned int session_id_length; + unsigned char session_id[SSL_MAX_SSL_SESSION_ID_LENGTH]; + /* + * this is used to determine whether the session is being reused in the + * appropriate context. It is up to the application to set this, via + * SSL_new + */ + unsigned int sid_ctx_length; + unsigned char sid_ctx[SSL_MAX_SID_CTX_LENGTH]; +# ifndef OPENSSL_NO_KRB5 + unsigned int krb5_client_princ_len; + unsigned char krb5_client_princ[SSL_MAX_KRB5_PRINCIPAL_LENGTH]; +# endif /* OPENSSL_NO_KRB5 */ +# ifndef OPENSSL_NO_PSK + char *psk_identity_hint; + char *psk_identity; +# endif + /* + * Used to indicate that session resumption is not allowed. Applications + * can also set this bit for a new session via not_resumable_session_cb + * to disable session caching and tickets. + */ + int not_resumable; + /* The cert is the certificate used to establish this connection */ + struct sess_cert_st /* SESS_CERT */ *sess_cert; + /* + * This is the cert for the other end. On clients, it will be the same as + * sess_cert->peer_key->x509 (the latter is not enough as sess_cert is + * not retained in the external representation of sessions, see + * ssl_asn1.c). + */ + X509 *peer; + /* + * when app_verify_callback accepts a session where the peer's + * certificate is not ok, we must remember the error for session reuse: + */ + long verify_result; /* only for servers */ + int references; + long timeout; + long time; + unsigned int compress_meth; /* Need to lookup the method */ + const SSL_CIPHER *cipher; + unsigned long cipher_id; /* when ASN.1 loaded, this needs to be used + * to load the 'cipher' structure */ + STACK_OF(SSL_CIPHER) *ciphers; /* shared ciphers? */ + CRYPTO_EX_DATA ex_data; /* application specific data */ + /* + * These are used to make removal of session-ids more efficient and to + * implement a maximum cache size. + */ + struct ssl_session_st *prev, *next; +# ifndef OPENSSL_NO_TLSEXT + char *tlsext_hostname; +# ifndef OPENSSL_NO_EC + size_t tlsext_ecpointformatlist_length; + unsigned char *tlsext_ecpointformatlist; /* peer's list */ + size_t tlsext_ellipticcurvelist_length; + unsigned char *tlsext_ellipticcurvelist; /* peer's list */ +# endif /* OPENSSL_NO_EC */ + /* RFC4507 info */ + unsigned char *tlsext_tick; /* Session ticket */ + size_t tlsext_ticklen; /* Session ticket length */ + long tlsext_tick_lifetime_hint; /* Session lifetime hint in seconds */ +# endif +# ifndef OPENSSL_NO_SRP + char *srp_username; +# endif +}; + +# endif + +# define SSL_OP_MICROSOFT_SESS_ID_BUG 0x00000001L +# define SSL_OP_NETSCAPE_CHALLENGE_BUG 0x00000002L +/* Allow initial connection to servers that don't support RI */ +# define SSL_OP_LEGACY_SERVER_CONNECT 0x00000004L +# define SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG 0x00000008L +# define SSL_OP_TLSEXT_PADDING 0x00000010L +# define SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER 0x00000020L +# define SSL_OP_SAFARI_ECDHE_ECDSA_BUG 0x00000040L +# define SSL_OP_SSLEAY_080_CLIENT_DH_BUG 0x00000080L +# define SSL_OP_TLS_D5_BUG 0x00000100L +# define SSL_OP_TLS_BLOCK_PADDING_BUG 0x00000200L + +/* Hasn't done anything since OpenSSL 0.9.7h, retained for compatibility */ +# define SSL_OP_MSIE_SSLV2_RSA_PADDING 0x0 +/* Refers to ancient SSLREF and SSLv2, retained for compatibility */ +# define SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG 0x0 + +/* + * Disable SSL 3.0/TLS 1.0 CBC vulnerability workaround that was added in + * OpenSSL 0.9.6d. Usually (depending on the application protocol) the + * workaround is not needed. Unfortunately some broken SSL/TLS + * implementations cannot handle it at all, which is why we include it in + * SSL_OP_ALL. + */ +/* added in 0.9.6e */ +# define SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS 0x00000800L + +/* + * SSL_OP_ALL: various bug workarounds that should be rather harmless. This + * used to be 0x000FFFFFL before 0.9.7. + */ +# define SSL_OP_ALL 0x80000BFFL + +/* DTLS options */ +# define SSL_OP_NO_QUERY_MTU 0x00001000L +/* Turn on Cookie Exchange (on relevant for servers) */ +# define SSL_OP_COOKIE_EXCHANGE 0x00002000L +/* Don't use RFC4507 ticket extension */ +# define SSL_OP_NO_TICKET 0x00004000L +/* Use Cisco's "speshul" version of DTLS_BAD_VER (as client) */ +# define SSL_OP_CISCO_ANYCONNECT 0x00008000L + +/* As server, disallow session resumption on renegotiation */ +# define SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION 0x00010000L +/* Don't use compression even if supported */ +# define SSL_OP_NO_COMPRESSION 0x00020000L +/* Permit unsafe legacy renegotiation */ +# define SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION 0x00040000L +/* If set, always create a new key when using tmp_ecdh parameters */ +# define SSL_OP_SINGLE_ECDH_USE 0x00080000L +/* Does nothing: retained for compatibility */ +# define SSL_OP_SINGLE_DH_USE 0x00100000L +/* Does nothing: retained for compatibiity */ +# define SSL_OP_EPHEMERAL_RSA 0x0 +/* + * Set on servers to choose the cipher according to the server's preferences + */ +# define SSL_OP_CIPHER_SERVER_PREFERENCE 0x00400000L +/* + * If set, a server will allow a client to issue a SSLv3.0 version number as + * latest version supported in the premaster secret, even when TLSv1.0 + * (version 3.1) was announced in the client hello. Normally this is + * forbidden to prevent version rollback attacks. + */ +# define SSL_OP_TLS_ROLLBACK_BUG 0x00800000L + +# define SSL_OP_NO_SSLv2 0x01000000L +# define SSL_OP_NO_SSLv3 0x02000000L +# define SSL_OP_NO_TLSv1 0x04000000L +# define SSL_OP_NO_TLSv1_2 0x08000000L +# define SSL_OP_NO_TLSv1_1 0x10000000L + +# define SSL_OP_NO_DTLSv1 0x04000000L +# define SSL_OP_NO_DTLSv1_2 0x08000000L + +# define SSL_OP_NO_SSL_MASK (SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3|\ + SSL_OP_NO_TLSv1|SSL_OP_NO_TLSv1_1|SSL_OP_NO_TLSv1_2) + +/* + * These next two were never actually used for anything since SSLeay zap so + * we have some more flags. + */ +/* + * The next flag deliberately changes the ciphertest, this is a check for the + * PKCS#1 attack + */ +# define SSL_OP_PKCS1_CHECK_1 0x0 +# define SSL_OP_PKCS1_CHECK_2 0x0 + +# define SSL_OP_NETSCAPE_CA_DN_BUG 0x20000000L +# define SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG 0x40000000L +/* + * Make server add server-hello extension from early version of cryptopro + * draft, when GOST ciphersuite is negotiated. Required for interoperability + * with CryptoPro CSP 3.x + */ +# define SSL_OP_CRYPTOPRO_TLSEXT_BUG 0x80000000L + +/* + * Allow SSL_write(..., n) to return r with 0 < r < n (i.e. report success + * when just a single record has been written): + */ +# define SSL_MODE_ENABLE_PARTIAL_WRITE 0x00000001L +/* + * Make it possible to retry SSL_write() with changed buffer location (buffer + * contents must stay the same!); this is not the default to avoid the + * misconception that non-blocking SSL_write() behaves like non-blocking + * write(): + */ +# define SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER 0x00000002L +/* + * Never bother the application with retries if the transport is blocking: + */ +# define SSL_MODE_AUTO_RETRY 0x00000004L +/* Don't attempt to automatically build certificate chain */ +# define SSL_MODE_NO_AUTO_CHAIN 0x00000008L +/* + * Save RAM by releasing read and write buffers when they're empty. (SSL3 and + * TLS only.) "Released" buffers are put onto a free-list in the context or + * just freed (depending on the context's setting for freelist_max_len). + */ +# define SSL_MODE_RELEASE_BUFFERS 0x00000010L +/* + * Send the current time in the Random fields of the ClientHello and + * ServerHello records for compatibility with hypothetical implementations + * that require it. + */ +# define SSL_MODE_SEND_CLIENTHELLO_TIME 0x00000020L +# define SSL_MODE_SEND_SERVERHELLO_TIME 0x00000040L +/* + * Send TLS_FALLBACK_SCSV in the ClientHello. To be set only by applications + * that reconnect with a downgraded protocol version; see + * draft-ietf-tls-downgrade-scsv-00 for details. DO NOT ENABLE THIS if your + * application attempts a normal handshake. Only use this in explicit + * fallback retries, following the guidance in + * draft-ietf-tls-downgrade-scsv-00. + */ +# define SSL_MODE_SEND_FALLBACK_SCSV 0x00000080L + +/* Cert related flags */ +/* + * Many implementations ignore some aspects of the TLS standards such as + * enforcing certifcate chain algorithms. When this is set we enforce them. + */ +# define SSL_CERT_FLAG_TLS_STRICT 0x00000001L + +/* Suite B modes, takes same values as certificate verify flags */ +# define SSL_CERT_FLAG_SUITEB_128_LOS_ONLY 0x10000 +/* Suite B 192 bit only mode */ +# define SSL_CERT_FLAG_SUITEB_192_LOS 0x20000 +/* Suite B 128 bit mode allowing 192 bit algorithms */ +# define SSL_CERT_FLAG_SUITEB_128_LOS 0x30000 + +/* Perform all sorts of protocol violations for testing purposes */ +# define SSL_CERT_FLAG_BROKEN_PROTOCOL 0x10000000 + +/* Flags for building certificate chains */ +/* Treat any existing certificates as untrusted CAs */ +# define SSL_BUILD_CHAIN_FLAG_UNTRUSTED 0x1 +/* Don't include root CA in chain */ +# define SSL_BUILD_CHAIN_FLAG_NO_ROOT 0x2 +/* Just check certificates already there */ +# define SSL_BUILD_CHAIN_FLAG_CHECK 0x4 +/* Ignore verification errors */ +# define SSL_BUILD_CHAIN_FLAG_IGNORE_ERROR 0x8 +/* Clear verification errors from queue */ +# define SSL_BUILD_CHAIN_FLAG_CLEAR_ERROR 0x10 + +/* Flags returned by SSL_check_chain */ +/* Certificate can be used with this session */ +# define CERT_PKEY_VALID 0x1 +/* Certificate can also be used for signing */ +# define CERT_PKEY_SIGN 0x2 +/* EE certificate signing algorithm OK */ +# define CERT_PKEY_EE_SIGNATURE 0x10 +/* CA signature algorithms OK */ +# define CERT_PKEY_CA_SIGNATURE 0x20 +/* EE certificate parameters OK */ +# define CERT_PKEY_EE_PARAM 0x40 +/* CA certificate parameters OK */ +# define CERT_PKEY_CA_PARAM 0x80 +/* Signing explicitly allowed as opposed to SHA1 fallback */ +# define CERT_PKEY_EXPLICIT_SIGN 0x100 +/* Client CA issuer names match (always set for server cert) */ +# define CERT_PKEY_ISSUER_NAME 0x200 +/* Cert type matches client types (always set for server cert) */ +# define CERT_PKEY_CERT_TYPE 0x400 +/* Cert chain suitable to Suite B */ +# define CERT_PKEY_SUITEB 0x800 + +# define SSL_CONF_FLAG_CMDLINE 0x1 +# define SSL_CONF_FLAG_FILE 0x2 +# define SSL_CONF_FLAG_CLIENT 0x4 +# define SSL_CONF_FLAG_SERVER 0x8 +# define SSL_CONF_FLAG_SHOW_ERRORS 0x10 +# define SSL_CONF_FLAG_CERTIFICATE 0x20 +/* Configuration value types */ +# define SSL_CONF_TYPE_UNKNOWN 0x0 +# define SSL_CONF_TYPE_STRING 0x1 +# define SSL_CONF_TYPE_FILE 0x2 +# define SSL_CONF_TYPE_DIR 0x3 + +/* + * Note: SSL[_CTX]_set_{options,mode} use |= op on the previous value, they + * cannot be used to clear bits. + */ + +# define SSL_CTX_set_options(ctx,op) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_OPTIONS,(op),NULL) +# define SSL_CTX_clear_options(ctx,op) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_CLEAR_OPTIONS,(op),NULL) +# define SSL_CTX_get_options(ctx) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_OPTIONS,0,NULL) +# define SSL_set_options(ssl,op) \ + SSL_ctrl((ssl),SSL_CTRL_OPTIONS,(op),NULL) +# define SSL_clear_options(ssl,op) \ + SSL_ctrl((ssl),SSL_CTRL_CLEAR_OPTIONS,(op),NULL) +# define SSL_get_options(ssl) \ + SSL_ctrl((ssl),SSL_CTRL_OPTIONS,0,NULL) + +# define SSL_CTX_set_mode(ctx,op) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_MODE,(op),NULL) +# define SSL_CTX_clear_mode(ctx,op) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_CLEAR_MODE,(op),NULL) +# define SSL_CTX_get_mode(ctx) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_MODE,0,NULL) +# define SSL_clear_mode(ssl,op) \ + SSL_ctrl((ssl),SSL_CTRL_CLEAR_MODE,(op),NULL) +# define SSL_set_mode(ssl,op) \ + SSL_ctrl((ssl),SSL_CTRL_MODE,(op),NULL) +# define SSL_get_mode(ssl) \ + SSL_ctrl((ssl),SSL_CTRL_MODE,0,NULL) +# define SSL_set_mtu(ssl, mtu) \ + SSL_ctrl((ssl),SSL_CTRL_SET_MTU,(mtu),NULL) +# define DTLS_set_link_mtu(ssl, mtu) \ + SSL_ctrl((ssl),DTLS_CTRL_SET_LINK_MTU,(mtu),NULL) +# define DTLS_get_link_min_mtu(ssl) \ + SSL_ctrl((ssl),DTLS_CTRL_GET_LINK_MIN_MTU,0,NULL) + +# define SSL_get_secure_renegotiation_support(ssl) \ + SSL_ctrl((ssl), SSL_CTRL_GET_RI_SUPPORT, 0, NULL) + +# ifndef OPENSSL_NO_HEARTBEATS +# define SSL_heartbeat(ssl) \ + SSL_ctrl((ssl),SSL_CTRL_TLS_EXT_SEND_HEARTBEAT,0,NULL) +# endif + +# define SSL_CTX_set_cert_flags(ctx,op) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_CERT_FLAGS,(op),NULL) +# define SSL_set_cert_flags(s,op) \ + SSL_ctrl((s),SSL_CTRL_CERT_FLAGS,(op),NULL) +# define SSL_CTX_clear_cert_flags(ctx,op) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_CLEAR_CERT_FLAGS,(op),NULL) +# define SSL_clear_cert_flags(s,op) \ + SSL_ctrl((s),SSL_CTRL_CLEAR_CERT_FLAGS,(op),NULL) + +void SSL_CTX_set_msg_callback(SSL_CTX *ctx, + void (*cb) (int write_p, int version, + int content_type, const void *buf, + size_t len, SSL *ssl, void *arg)); +void SSL_set_msg_callback(SSL *ssl, + void (*cb) (int write_p, int version, + int content_type, const void *buf, + size_t len, SSL *ssl, void *arg)); +# define SSL_CTX_set_msg_callback_arg(ctx, arg) SSL_CTX_ctrl((ctx), SSL_CTRL_SET_MSG_CALLBACK_ARG, 0, (arg)) +# define SSL_set_msg_callback_arg(ssl, arg) SSL_ctrl((ssl), SSL_CTRL_SET_MSG_CALLBACK_ARG, 0, (arg)) + +# ifndef OPENSSL_NO_SRP + +# ifndef OPENSSL_NO_SSL_INTERN + +typedef struct srp_ctx_st { + /* param for all the callbacks */ + void *SRP_cb_arg; + /* set client Hello login callback */ + int (*TLS_ext_srp_username_callback) (SSL *, int *, void *); + /* set SRP N/g param callback for verification */ + int (*SRP_verify_param_callback) (SSL *, void *); + /* set SRP client passwd callback */ + char *(*SRP_give_srp_client_pwd_callback) (SSL *, void *); + char *login; + BIGNUM *N, *g, *s, *B, *A; + BIGNUM *a, *b, *v; + char *info; + int strength; + unsigned long srp_Mask; +} SRP_CTX; + +# endif + +/* see tls_srp.c */ +int SSL_SRP_CTX_init(SSL *s); +int SSL_CTX_SRP_CTX_init(SSL_CTX *ctx); +int SSL_SRP_CTX_free(SSL *ctx); +int SSL_CTX_SRP_CTX_free(SSL_CTX *ctx); +int SSL_srp_server_param_with_username(SSL *s, int *ad); +int SRP_generate_server_master_secret(SSL *s, unsigned char *master_key); +int SRP_Calc_A_param(SSL *s); +int SRP_generate_client_master_secret(SSL *s, unsigned char *master_key); + +# endif + +# if defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_WIN32) +# define SSL_MAX_CERT_LIST_DEFAULT 1024*30 + /* 30k max cert list :-) */ +# else +# define SSL_MAX_CERT_LIST_DEFAULT 1024*100 + /* 100k max cert list :-) */ +# endif + +# define SSL_SESSION_CACHE_MAX_SIZE_DEFAULT (1024*20) + +/* + * This callback type is used inside SSL_CTX, SSL, and in the functions that + * set them. It is used to override the generation of SSL/TLS session IDs in + * a server. Return value should be zero on an error, non-zero to proceed. + * Also, callbacks should themselves check if the id they generate is unique + * otherwise the SSL handshake will fail with an error - callbacks can do + * this using the 'ssl' value they're passed by; + * SSL_has_matching_session_id(ssl, id, *id_len) The length value passed in + * is set at the maximum size the session ID can be. In SSLv2 this is 16 + * bytes, whereas SSLv3/TLSv1 it is 32 bytes. The callback can alter this + * length to be less if desired, but under SSLv2 session IDs are supposed to + * be fixed at 16 bytes so the id will be padded after the callback returns + * in this case. It is also an error for the callback to set the size to + * zero. + */ +typedef int (*GEN_SESSION_CB) (const SSL *ssl, unsigned char *id, + unsigned int *id_len); + +typedef struct ssl_comp_st SSL_COMP; + +# ifndef OPENSSL_NO_SSL_INTERN + +struct ssl_comp_st { + int id; + const char *name; +# ifndef OPENSSL_NO_COMP + COMP_METHOD *method; +# else + char *method; +# endif +}; + +DECLARE_STACK_OF(SSL_COMP) +DECLARE_LHASH_OF(SSL_SESSION); + +struct ssl_ctx_st { + const SSL_METHOD *method; + STACK_OF(SSL_CIPHER) *cipher_list; + /* same as above but sorted for lookup */ + STACK_OF(SSL_CIPHER) *cipher_list_by_id; + struct x509_store_st /* X509_STORE */ *cert_store; + LHASH_OF(SSL_SESSION) *sessions; + /* + * Most session-ids that will be cached, default is + * SSL_SESSION_CACHE_MAX_SIZE_DEFAULT. 0 is unlimited. + */ + unsigned long session_cache_size; + struct ssl_session_st *session_cache_head; + struct ssl_session_st *session_cache_tail; + /* + * This can have one of 2 values, ored together, SSL_SESS_CACHE_CLIENT, + * SSL_SESS_CACHE_SERVER, Default is SSL_SESSION_CACHE_SERVER, which + * means only SSL_accept which cache SSL_SESSIONS. + */ + int session_cache_mode; + /* + * If timeout is not 0, it is the default timeout value set when + * SSL_new() is called. This has been put in to make life easier to set + * things up + */ + long session_timeout; + /* + * If this callback is not null, it will be called each time a session id + * is added to the cache. If this function returns 1, it means that the + * callback will do a SSL_SESSION_free() when it has finished using it. + * Otherwise, on 0, it means the callback has finished with it. If + * remove_session_cb is not null, it will be called when a session-id is + * removed from the cache. After the call, OpenSSL will + * SSL_SESSION_free() it. + */ + int (*new_session_cb) (struct ssl_st *ssl, SSL_SESSION *sess); + void (*remove_session_cb) (struct ssl_ctx_st *ctx, SSL_SESSION *sess); + SSL_SESSION *(*get_session_cb) (struct ssl_st *ssl, + unsigned char *data, int len, int *copy); + struct { + int sess_connect; /* SSL new conn - started */ + int sess_connect_renegotiate; /* SSL reneg - requested */ + int sess_connect_good; /* SSL new conne/reneg - finished */ + int sess_accept; /* SSL new accept - started */ + int sess_accept_renegotiate; /* SSL reneg - requested */ + int sess_accept_good; /* SSL accept/reneg - finished */ + int sess_miss; /* session lookup misses */ + int sess_timeout; /* reuse attempt on timeouted session */ + int sess_cache_full; /* session removed due to full cache */ + int sess_hit; /* session reuse actually done */ + int sess_cb_hit; /* session-id that was not in the cache was + * passed back via the callback. This + * indicates that the application is + * supplying session-id's from other + * processes - spooky :-) */ + } stats; + + int references; + + /* if defined, these override the X509_verify_cert() calls */ + int (*app_verify_callback) (X509_STORE_CTX *, void *); + void *app_verify_arg; + /* + * before OpenSSL 0.9.7, 'app_verify_arg' was ignored + * ('app_verify_callback' was called with just one argument) + */ + + /* Default password callback. */ + pem_password_cb *default_passwd_callback; + + /* Default password callback user data. */ + void *default_passwd_callback_userdata; + + /* get client cert callback */ + int (*client_cert_cb) (SSL *ssl, X509 **x509, EVP_PKEY **pkey); + + /* cookie generate callback */ + int (*app_gen_cookie_cb) (SSL *ssl, unsigned char *cookie, + unsigned int *cookie_len); + + /* verify cookie callback */ + int (*app_verify_cookie_cb) (SSL *ssl, unsigned char *cookie, + unsigned int cookie_len); + + CRYPTO_EX_DATA ex_data; + + const EVP_MD *rsa_md5; /* For SSLv2 - name is 'ssl2-md5' */ + const EVP_MD *md5; /* For SSLv3/TLSv1 'ssl3-md5' */ + const EVP_MD *sha1; /* For SSLv3/TLSv1 'ssl3->sha1' */ + + STACK_OF(X509) *extra_certs; + STACK_OF(SSL_COMP) *comp_methods; /* stack of SSL_COMP, SSLv3/TLSv1 */ + + /* Default values used when no per-SSL value is defined follow */ + + /* used if SSL's info_callback is NULL */ + void (*info_callback) (const SSL *ssl, int type, int val); + + /* what we put in client cert requests */ + STACK_OF(X509_NAME) *client_CA; + + /* + * Default values to use in SSL structures follow (these are copied by + * SSL_new) + */ + + unsigned long options; + unsigned long mode; + long max_cert_list; + + struct cert_st /* CERT */ *cert; + int read_ahead; + + /* callback that allows applications to peek at protocol messages */ + void (*msg_callback) (int write_p, int version, int content_type, + const void *buf, size_t len, SSL *ssl, void *arg); + void *msg_callback_arg; + + int verify_mode; + unsigned int sid_ctx_length; + unsigned char sid_ctx[SSL_MAX_SID_CTX_LENGTH]; + /* called 'verify_callback' in the SSL */ + int (*default_verify_callback) (int ok, X509_STORE_CTX *ctx); + + /* Default generate session ID callback. */ + GEN_SESSION_CB generate_session_id; + + X509_VERIFY_PARAM *param; + +# if 0 + int purpose; /* Purpose setting */ + int trust; /* Trust setting */ +# endif + + int quiet_shutdown; + + /* + * Maximum amount of data to send in one fragment. actual record size can + * be more than this due to padding and MAC overheads. + */ + unsigned int max_send_fragment; + +# ifndef OPENSSL_NO_ENGINE + /* + * Engine to pass requests for client certs to + */ + ENGINE *client_cert_engine; +# endif + +# ifndef OPENSSL_NO_TLSEXT + /* TLS extensions servername callback */ + int (*tlsext_servername_callback) (SSL *, int *, void *); + void *tlsext_servername_arg; + /* RFC 4507 session ticket keys */ + unsigned char tlsext_tick_key_name[16]; + unsigned char tlsext_tick_hmac_key[16]; + unsigned char tlsext_tick_aes_key[16]; + /* Callback to support customisation of ticket key setting */ + int (*tlsext_ticket_key_cb) (SSL *ssl, + unsigned char *name, unsigned char *iv, + EVP_CIPHER_CTX *ectx, + HMAC_CTX *hctx, int enc); + + /* certificate status request info */ + /* Callback for status request */ + int (*tlsext_status_cb) (SSL *ssl, void *arg); + void *tlsext_status_arg; + + /* draft-rescorla-tls-opaque-prf-input-00.txt information */ + int (*tlsext_opaque_prf_input_callback) (SSL *, void *peerinput, + size_t len, void *arg); + void *tlsext_opaque_prf_input_callback_arg; +# endif + +# ifndef OPENSSL_NO_PSK + char *psk_identity_hint; + unsigned int (*psk_client_callback) (SSL *ssl, const char *hint, + char *identity, + unsigned int max_identity_len, + unsigned char *psk, + unsigned int max_psk_len); + unsigned int (*psk_server_callback) (SSL *ssl, const char *identity, + unsigned char *psk, + unsigned int max_psk_len); +# endif + +# ifndef OPENSSL_NO_BUF_FREELISTS +# define SSL_MAX_BUF_FREELIST_LEN_DEFAULT 32 + unsigned int freelist_max_len; + struct ssl3_buf_freelist_st *wbuf_freelist; + struct ssl3_buf_freelist_st *rbuf_freelist; +# endif +# ifndef OPENSSL_NO_SRP + SRP_CTX srp_ctx; /* ctx for SRP authentication */ +# endif + +# ifndef OPENSSL_NO_TLSEXT + +# ifndef OPENSSL_NO_NEXTPROTONEG + /* Next protocol negotiation information */ + /* (for experimental NPN extension). */ + + /* + * For a server, this contains a callback function by which the set of + * advertised protocols can be provided. + */ + int (*next_protos_advertised_cb) (SSL *s, const unsigned char **buf, + unsigned int *len, void *arg); + void *next_protos_advertised_cb_arg; + /* + * For a client, this contains a callback function that selects the next + * protocol from the list provided by the server. + */ + int (*next_proto_select_cb) (SSL *s, unsigned char **out, + unsigned char *outlen, + const unsigned char *in, + unsigned int inlen, void *arg); + void *next_proto_select_cb_arg; +# endif + /* SRTP profiles we are willing to do from RFC 5764 */ + STACK_OF(SRTP_PROTECTION_PROFILE) *srtp_profiles; + + /* + * ALPN information (we are in the process of transitioning from NPN to + * ALPN.) + */ + + /*- + * For a server, this contains a callback function that allows the + * server to select the protocol for the connection. + * out: on successful return, this must point to the raw protocol + * name (without the length prefix). + * outlen: on successful return, this contains the length of |*out|. + * in: points to the client's list of supported protocols in + * wire-format. + * inlen: the length of |in|. + */ + int (*alpn_select_cb) (SSL *s, + const unsigned char **out, + unsigned char *outlen, + const unsigned char *in, + unsigned int inlen, void *arg); + void *alpn_select_cb_arg; + + /* + * For a client, this contains the list of supported protocols in wire + * format. + */ + unsigned char *alpn_client_proto_list; + unsigned alpn_client_proto_list_len; + +# ifndef OPENSSL_NO_EC + /* EC extension values inherited by SSL structure */ + size_t tlsext_ecpointformatlist_length; + unsigned char *tlsext_ecpointformatlist; + size_t tlsext_ellipticcurvelist_length; + unsigned char *tlsext_ellipticcurvelist; +# endif /* OPENSSL_NO_EC */ +# endif +}; + +# endif + +# define SSL_SESS_CACHE_OFF 0x0000 +# define SSL_SESS_CACHE_CLIENT 0x0001 +# define SSL_SESS_CACHE_SERVER 0x0002 +# define SSL_SESS_CACHE_BOTH (SSL_SESS_CACHE_CLIENT|SSL_SESS_CACHE_SERVER) +# define SSL_SESS_CACHE_NO_AUTO_CLEAR 0x0080 +/* enough comments already ... see SSL_CTX_set_session_cache_mode(3) */ +# define SSL_SESS_CACHE_NO_INTERNAL_LOOKUP 0x0100 +# define SSL_SESS_CACHE_NO_INTERNAL_STORE 0x0200 +# define SSL_SESS_CACHE_NO_INTERNAL \ + (SSL_SESS_CACHE_NO_INTERNAL_LOOKUP|SSL_SESS_CACHE_NO_INTERNAL_STORE) + +LHASH_OF(SSL_SESSION) *SSL_CTX_sessions(SSL_CTX *ctx); +# define SSL_CTX_sess_number(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_NUMBER,0,NULL) +# define SSL_CTX_sess_connect(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CONNECT,0,NULL) +# define SSL_CTX_sess_connect_good(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CONNECT_GOOD,0,NULL) +# define SSL_CTX_sess_connect_renegotiate(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CONNECT_RENEGOTIATE,0,NULL) +# define SSL_CTX_sess_accept(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_ACCEPT,0,NULL) +# define SSL_CTX_sess_accept_renegotiate(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_ACCEPT_RENEGOTIATE,0,NULL) +# define SSL_CTX_sess_accept_good(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_ACCEPT_GOOD,0,NULL) +# define SSL_CTX_sess_hits(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_HIT,0,NULL) +# define SSL_CTX_sess_cb_hits(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CB_HIT,0,NULL) +# define SSL_CTX_sess_misses(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_MISSES,0,NULL) +# define SSL_CTX_sess_timeouts(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_TIMEOUTS,0,NULL) +# define SSL_CTX_sess_cache_full(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CACHE_FULL,0,NULL) + +void SSL_CTX_sess_set_new_cb(SSL_CTX *ctx, + int (*new_session_cb) (struct ssl_st *ssl, + SSL_SESSION *sess)); +int (*SSL_CTX_sess_get_new_cb(SSL_CTX *ctx)) (struct ssl_st *ssl, + SSL_SESSION *sess); +void SSL_CTX_sess_set_remove_cb(SSL_CTX *ctx, + void (*remove_session_cb) (struct ssl_ctx_st + *ctx, + SSL_SESSION + *sess)); +void (*SSL_CTX_sess_get_remove_cb(SSL_CTX *ctx)) (struct ssl_ctx_st *ctx, + SSL_SESSION *sess); +void SSL_CTX_sess_set_get_cb(SSL_CTX *ctx, + SSL_SESSION *(*get_session_cb) (struct ssl_st + *ssl, + unsigned char + *data, int len, + int *copy)); +SSL_SESSION *(*SSL_CTX_sess_get_get_cb(SSL_CTX *ctx)) (struct ssl_st *ssl, + unsigned char *Data, + int len, int *copy); +void SSL_CTX_set_info_callback(SSL_CTX *ctx, + void (*cb) (const SSL *ssl, int type, + int val)); +void (*SSL_CTX_get_info_callback(SSL_CTX *ctx)) (const SSL *ssl, int type, + int val); +void SSL_CTX_set_client_cert_cb(SSL_CTX *ctx, + int (*client_cert_cb) (SSL *ssl, X509 **x509, + EVP_PKEY **pkey)); +int (*SSL_CTX_get_client_cert_cb(SSL_CTX *ctx)) (SSL *ssl, X509 **x509, + EVP_PKEY **pkey); +# ifndef OPENSSL_NO_ENGINE +int SSL_CTX_set_client_cert_engine(SSL_CTX *ctx, ENGINE *e); +# endif +void SSL_CTX_set_cookie_generate_cb(SSL_CTX *ctx, + int (*app_gen_cookie_cb) (SSL *ssl, + unsigned char + *cookie, + unsigned int + *cookie_len)); +void SSL_CTX_set_cookie_verify_cb(SSL_CTX *ctx, + int (*app_verify_cookie_cb) (SSL *ssl, + unsigned char + *cookie, + unsigned int + cookie_len)); +# ifndef OPENSSL_NO_NEXTPROTONEG +void SSL_CTX_set_next_protos_advertised_cb(SSL_CTX *s, + int (*cb) (SSL *ssl, + const unsigned char + **out, + unsigned int *outlen, + void *arg), void *arg); +void SSL_CTX_set_next_proto_select_cb(SSL_CTX *s, + int (*cb) (SSL *ssl, + unsigned char **out, + unsigned char *outlen, + const unsigned char *in, + unsigned int inlen, + void *arg), void *arg); +void SSL_get0_next_proto_negotiated(const SSL *s, const unsigned char **data, + unsigned *len); +# endif + +# ifndef OPENSSL_NO_TLSEXT +int SSL_select_next_proto(unsigned char **out, unsigned char *outlen, + const unsigned char *in, unsigned int inlen, + const unsigned char *client, + unsigned int client_len); +# endif + +# define OPENSSL_NPN_UNSUPPORTED 0 +# define OPENSSL_NPN_NEGOTIATED 1 +# define OPENSSL_NPN_NO_OVERLAP 2 + +int SSL_CTX_set_alpn_protos(SSL_CTX *ctx, const unsigned char *protos, + unsigned protos_len); +int SSL_set_alpn_protos(SSL *ssl, const unsigned char *protos, + unsigned protos_len); +void SSL_CTX_set_alpn_select_cb(SSL_CTX *ctx, + int (*cb) (SSL *ssl, + const unsigned char **out, + unsigned char *outlen, + const unsigned char *in, + unsigned int inlen, + void *arg), void *arg); +void SSL_get0_alpn_selected(const SSL *ssl, const unsigned char **data, + unsigned *len); + +# ifndef OPENSSL_NO_PSK +/* + * the maximum length of the buffer given to callbacks containing the + * resulting identity/psk + */ +# define PSK_MAX_IDENTITY_LEN 128 +# define PSK_MAX_PSK_LEN 256 +void SSL_CTX_set_psk_client_callback(SSL_CTX *ctx, + unsigned int (*psk_client_callback) (SSL + *ssl, + const + char + *hint, + char + *identity, + unsigned + int + max_identity_len, + unsigned + char + *psk, + unsigned + int + max_psk_len)); +void SSL_set_psk_client_callback(SSL *ssl, + unsigned int (*psk_client_callback) (SSL + *ssl, + const + char + *hint, + char + *identity, + unsigned + int + max_identity_len, + unsigned + char + *psk, + unsigned + int + max_psk_len)); +void SSL_CTX_set_psk_server_callback(SSL_CTX *ctx, + unsigned int (*psk_server_callback) (SSL + *ssl, + const + char + *identity, + unsigned + char + *psk, + unsigned + int + max_psk_len)); +void SSL_set_psk_server_callback(SSL *ssl, + unsigned int (*psk_server_callback) (SSL + *ssl, + const + char + *identity, + unsigned + char + *psk, + unsigned + int + max_psk_len)); +int SSL_CTX_use_psk_identity_hint(SSL_CTX *ctx, const char *identity_hint); +int SSL_use_psk_identity_hint(SSL *s, const char *identity_hint); +const char *SSL_get_psk_identity_hint(const SSL *s); +const char *SSL_get_psk_identity(const SSL *s); +# endif + +# ifndef OPENSSL_NO_TLSEXT +/* Register callbacks to handle custom TLS Extensions for client or server. */ + +int SSL_CTX_add_client_custom_ext(SSL_CTX *ctx, unsigned int ext_type, + custom_ext_add_cb add_cb, + custom_ext_free_cb free_cb, + void *add_arg, + custom_ext_parse_cb parse_cb, + void *parse_arg); + +int SSL_CTX_add_server_custom_ext(SSL_CTX *ctx, unsigned int ext_type, + custom_ext_add_cb add_cb, + custom_ext_free_cb free_cb, + void *add_arg, + custom_ext_parse_cb parse_cb, + void *parse_arg); + +int SSL_extension_supported(unsigned int ext_type); + +# endif + +# define SSL_NOTHING 1 +# define SSL_WRITING 2 +# define SSL_READING 3 +# define SSL_X509_LOOKUP 4 + +/* These will only be used when doing non-blocking IO */ +# define SSL_want_nothing(s) (SSL_want(s) == SSL_NOTHING) +# define SSL_want_read(s) (SSL_want(s) == SSL_READING) +# define SSL_want_write(s) (SSL_want(s) == SSL_WRITING) +# define SSL_want_x509_lookup(s) (SSL_want(s) == SSL_X509_LOOKUP) + +# define SSL_MAC_FLAG_READ_MAC_STREAM 1 +# define SSL_MAC_FLAG_WRITE_MAC_STREAM 2 + +# ifndef OPENSSL_NO_SSL_INTERN + +struct ssl_st { + /* + * protocol version (one of SSL2_VERSION, SSL3_VERSION, TLS1_VERSION, + * DTLS1_VERSION) + */ + int version; + /* SSL_ST_CONNECT or SSL_ST_ACCEPT */ + int type; + /* SSLv3 */ + const SSL_METHOD *method; + /* + * There are 2 BIO's even though they are normally both the same. This + * is so data can be read and written to different handlers + */ +# ifndef OPENSSL_NO_BIO + /* used by SSL_read */ + BIO *rbio; + /* used by SSL_write */ + BIO *wbio; + /* used during session-id reuse to concatenate messages */ + BIO *bbio; +# else + /* used by SSL_read */ + char *rbio; + /* used by SSL_write */ + char *wbio; + char *bbio; +# endif + /* + * This holds a variable that indicates what we were doing when a 0 or -1 + * is returned. This is needed for non-blocking IO so we know what + * request needs re-doing when in SSL_accept or SSL_connect + */ + int rwstate; + /* true when we are actually in SSL_accept() or SSL_connect() */ + int in_handshake; + int (*handshake_func) (SSL *); + /* + * Imagine that here's a boolean member "init" that is switched as soon + * as SSL_set_{accept/connect}_state is called for the first time, so + * that "state" and "handshake_func" are properly initialized. But as + * handshake_func is == 0 until then, we use this test instead of an + * "init" member. + */ + /* are we the server side? - mostly used by SSL_clear */ + int server; + /* + * Generate a new session or reuse an old one. + * NB: For servers, the 'new' session may actually be a previously + * cached session or even the previous session unless + * SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION is set + */ + int new_session; + /* don't send shutdown packets */ + int quiet_shutdown; + /* we have shut things down, 0x01 sent, 0x02 for received */ + int shutdown; + /* where we are */ + int state; + /* where we are when reading */ + int rstate; + BUF_MEM *init_buf; /* buffer used during init */ + void *init_msg; /* pointer to handshake message body, set by + * ssl3_get_message() */ + int init_num; /* amount read/written */ + int init_off; /* amount read/written */ + /* used internally to point at a raw packet */ + unsigned char *packet; + unsigned int packet_length; + struct ssl2_state_st *s2; /* SSLv2 variables */ + struct ssl3_state_st *s3; /* SSLv3 variables */ + struct dtls1_state_st *d1; /* DTLSv1 variables */ + int read_ahead; /* Read as many input bytes as possible (for + * non-blocking reads) */ + /* callback that allows applications to peek at protocol messages */ + void (*msg_callback) (int write_p, int version, int content_type, + const void *buf, size_t len, SSL *ssl, void *arg); + void *msg_callback_arg; + int hit; /* reusing a previous session */ + X509_VERIFY_PARAM *param; +# if 0 + int purpose; /* Purpose setting */ + int trust; /* Trust setting */ +# endif + /* crypto */ + STACK_OF(SSL_CIPHER) *cipher_list; + STACK_OF(SSL_CIPHER) *cipher_list_by_id; + /* + * These are the ones being used, the ones in SSL_SESSION are the ones to + * be 'copied' into these ones + */ + int mac_flags; + EVP_CIPHER_CTX *enc_read_ctx; /* cryptographic state */ + EVP_MD_CTX *read_hash; /* used for mac generation */ +# ifndef OPENSSL_NO_COMP + COMP_CTX *expand; /* uncompress */ +# else + char *expand; +# endif + EVP_CIPHER_CTX *enc_write_ctx; /* cryptographic state */ + EVP_MD_CTX *write_hash; /* used for mac generation */ +# ifndef OPENSSL_NO_COMP + COMP_CTX *compress; /* compression */ +# else + char *compress; +# endif + /* session info */ + /* client cert? */ + /* This is used to hold the server certificate used */ + struct cert_st /* CERT */ *cert; + /* + * the session_id_context is used to ensure sessions are only reused in + * the appropriate context + */ + unsigned int sid_ctx_length; + unsigned char sid_ctx[SSL_MAX_SID_CTX_LENGTH]; + /* This can also be in the session once a session is established */ + SSL_SESSION *session; + /* Default generate session ID callback. */ + GEN_SESSION_CB generate_session_id; + /* Used in SSL2 and SSL3 */ + /* + * 0 don't care about verify failure. + * 1 fail if verify fails + */ + int verify_mode; + /* fail if callback returns 0 */ + int (*verify_callback) (int ok, X509_STORE_CTX *ctx); + /* optional informational callback */ + void (*info_callback) (const SSL *ssl, int type, int val); + /* error bytes to be written */ + int error; + /* actual code */ + int error_code; +# ifndef OPENSSL_NO_KRB5 + /* Kerberos 5 context */ + KSSL_CTX *kssl_ctx; +# endif /* OPENSSL_NO_KRB5 */ +# ifndef OPENSSL_NO_PSK + unsigned int (*psk_client_callback) (SSL *ssl, const char *hint, + char *identity, + unsigned int max_identity_len, + unsigned char *psk, + unsigned int max_psk_len); + unsigned int (*psk_server_callback) (SSL *ssl, const char *identity, + unsigned char *psk, + unsigned int max_psk_len); +# endif + SSL_CTX *ctx; + /* + * set this flag to 1 and a sleep(1) is put into all SSL_read() and + * SSL_write() calls, good for nbio debuging :-) + */ + int debug; + /* extra application data */ + long verify_result; + CRYPTO_EX_DATA ex_data; + /* for server side, keep the list of CA_dn we can use */ + STACK_OF(X509_NAME) *client_CA; + int references; + /* protocol behaviour */ + unsigned long options; + /* API behaviour */ + unsigned long mode; + long max_cert_list; + int first_packet; + /* what was passed, used for SSLv3/TLS rollback check */ + int client_version; + unsigned int max_send_fragment; +# ifndef OPENSSL_NO_TLSEXT + /* TLS extension debug callback */ + void (*tlsext_debug_cb) (SSL *s, int client_server, int type, + unsigned char *data, int len, void *arg); + void *tlsext_debug_arg; + char *tlsext_hostname; + /*- + * no further mod of servername + * 0 : call the servername extension callback. + * 1 : prepare 2, allow last ack just after in server callback. + * 2 : don't call servername callback, no ack in server hello + */ + int servername_done; + /* certificate status request info */ + /* Status type or -1 if no status type */ + int tlsext_status_type; + /* Expect OCSP CertificateStatus message */ + int tlsext_status_expected; + /* OCSP status request only */ + STACK_OF(OCSP_RESPID) *tlsext_ocsp_ids; + X509_EXTENSIONS *tlsext_ocsp_exts; + /* OCSP response received or to be sent */ + unsigned char *tlsext_ocsp_resp; + int tlsext_ocsp_resplen; + /* RFC4507 session ticket expected to be received or sent */ + int tlsext_ticket_expected; +# ifndef OPENSSL_NO_EC + size_t tlsext_ecpointformatlist_length; + /* our list */ + unsigned char *tlsext_ecpointformatlist; + size_t tlsext_ellipticcurvelist_length; + /* our list */ + unsigned char *tlsext_ellipticcurvelist; +# endif /* OPENSSL_NO_EC */ + /* + * draft-rescorla-tls-opaque-prf-input-00.txt information to be used for + * handshakes + */ + void *tlsext_opaque_prf_input; + size_t tlsext_opaque_prf_input_len; + /* TLS Session Ticket extension override */ + TLS_SESSION_TICKET_EXT *tlsext_session_ticket; + /* TLS Session Ticket extension callback */ + tls_session_ticket_ext_cb_fn tls_session_ticket_ext_cb; + void *tls_session_ticket_ext_cb_arg; + /* TLS pre-shared secret session resumption */ + tls_session_secret_cb_fn tls_session_secret_cb; + void *tls_session_secret_cb_arg; + SSL_CTX *initial_ctx; /* initial ctx, used to store sessions */ +# ifndef OPENSSL_NO_NEXTPROTONEG + /* + * Next protocol negotiation. For the client, this is the protocol that + * we sent in NextProtocol and is set when handling ServerHello + * extensions. For a server, this is the client's selected_protocol from + * NextProtocol and is set when handling the NextProtocol message, before + * the Finished message. + */ + unsigned char *next_proto_negotiated; + unsigned char next_proto_negotiated_len; +# endif +# define session_ctx initial_ctx + /* What we'll do */ + STACK_OF(SRTP_PROTECTION_PROFILE) *srtp_profiles; + /* What's been chosen */ + SRTP_PROTECTION_PROFILE *srtp_profile; + /*- + * Is use of the Heartbeat extension negotiated? + * 0: disabled + * 1: enabled + * 2: enabled, but not allowed to send Requests + */ + unsigned int tlsext_heartbeat; + /* Indicates if a HeartbeatRequest is in flight */ + unsigned int tlsext_hb_pending; + /* HeartbeatRequest sequence number */ + unsigned int tlsext_hb_seq; +# else +# define session_ctx ctx +# endif /* OPENSSL_NO_TLSEXT */ + /*- + * 1 if we are renegotiating. + * 2 if we are a server and are inside a handshake + * (i.e. not just sending a HelloRequest) + */ + int renegotiate; +# ifndef OPENSSL_NO_SRP + /* ctx for SRP authentication */ + SRP_CTX srp_ctx; +# endif +# ifndef OPENSSL_NO_TLSEXT + /* + * For a client, this contains the list of supported protocols in wire + * format. + */ + unsigned char *alpn_client_proto_list; + unsigned alpn_client_proto_list_len; +# endif /* OPENSSL_NO_TLSEXT */ +}; + +# endif + +#ifdef __cplusplus +} +#endif + +# include +# include +# include /* This is mostly sslv3 with a few tweaks */ +# include /* Datagram TLS */ +# include +# include /* Support for the use_srtp extension */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* compatibility */ +# define SSL_set_app_data(s,arg) (SSL_set_ex_data(s,0,(char *)arg)) +# define SSL_get_app_data(s) (SSL_get_ex_data(s,0)) +# define SSL_SESSION_set_app_data(s,a) (SSL_SESSION_set_ex_data(s,0,(char *)a)) +# define SSL_SESSION_get_app_data(s) (SSL_SESSION_get_ex_data(s,0)) +# define SSL_CTX_get_app_data(ctx) (SSL_CTX_get_ex_data(ctx,0)) +# define SSL_CTX_set_app_data(ctx,arg) (SSL_CTX_set_ex_data(ctx,0,(char *)arg)) + +/* + * The following are the possible values for ssl->state are are used to + * indicate where we are up to in the SSL connection establishment. The + * macros that follow are about the only things you should need to use and + * even then, only when using non-blocking IO. It can also be useful to work + * out where you were when the connection failed + */ + +# define SSL_ST_CONNECT 0x1000 +# define SSL_ST_ACCEPT 0x2000 +# define SSL_ST_MASK 0x0FFF +# define SSL_ST_INIT (SSL_ST_CONNECT|SSL_ST_ACCEPT) +# define SSL_ST_BEFORE 0x4000 +# define SSL_ST_OK 0x03 +# define SSL_ST_RENEGOTIATE (0x04|SSL_ST_INIT) +# define SSL_ST_ERR 0x05 + +# define SSL_CB_LOOP 0x01 +# define SSL_CB_EXIT 0x02 +# define SSL_CB_READ 0x04 +# define SSL_CB_WRITE 0x08 +# define SSL_CB_ALERT 0x4000/* used in callback */ +# define SSL_CB_READ_ALERT (SSL_CB_ALERT|SSL_CB_READ) +# define SSL_CB_WRITE_ALERT (SSL_CB_ALERT|SSL_CB_WRITE) +# define SSL_CB_ACCEPT_LOOP (SSL_ST_ACCEPT|SSL_CB_LOOP) +# define SSL_CB_ACCEPT_EXIT (SSL_ST_ACCEPT|SSL_CB_EXIT) +# define SSL_CB_CONNECT_LOOP (SSL_ST_CONNECT|SSL_CB_LOOP) +# define SSL_CB_CONNECT_EXIT (SSL_ST_CONNECT|SSL_CB_EXIT) +# define SSL_CB_HANDSHAKE_START 0x10 +# define SSL_CB_HANDSHAKE_DONE 0x20 + +/* Is the SSL_connection established? */ +# define SSL_get_state(a) SSL_state(a) +# define SSL_is_init_finished(a) (SSL_state(a) == SSL_ST_OK) +# define SSL_in_init(a) (SSL_state(a)&SSL_ST_INIT) +# define SSL_in_before(a) (SSL_state(a)&SSL_ST_BEFORE) +# define SSL_in_connect_init(a) (SSL_state(a)&SSL_ST_CONNECT) +# define SSL_in_accept_init(a) (SSL_state(a)&SSL_ST_ACCEPT) + +/* + * The following 2 states are kept in ssl->rstate when reads fail, you should + * not need these + */ +# define SSL_ST_READ_HEADER 0xF0 +# define SSL_ST_READ_BODY 0xF1 +# define SSL_ST_READ_DONE 0xF2 + +/*- + * Obtain latest Finished message + * -- that we sent (SSL_get_finished) + * -- that we expected from peer (SSL_get_peer_finished). + * Returns length (0 == no Finished so far), copies up to 'count' bytes. + */ +size_t SSL_get_finished(const SSL *s, void *buf, size_t count); +size_t SSL_get_peer_finished(const SSL *s, void *buf, size_t count); + +/* + * use either SSL_VERIFY_NONE or SSL_VERIFY_PEER, the last 2 options are + * 'ored' with SSL_VERIFY_PEER if they are desired + */ +# define SSL_VERIFY_NONE 0x00 +# define SSL_VERIFY_PEER 0x01 +# define SSL_VERIFY_FAIL_IF_NO_PEER_CERT 0x02 +# define SSL_VERIFY_CLIENT_ONCE 0x04 + +# define OpenSSL_add_ssl_algorithms() SSL_library_init() +# define SSLeay_add_ssl_algorithms() SSL_library_init() + +/* this is for backward compatibility */ +# if 0 /* NEW_SSLEAY */ +# define SSL_CTX_set_default_verify(a,b,c) SSL_CTX_set_verify(a,b,c) +# define SSL_set_pref_cipher(c,n) SSL_set_cipher_list(c,n) +# define SSL_add_session(a,b) SSL_CTX_add_session((a),(b)) +# define SSL_remove_session(a,b) SSL_CTX_remove_session((a),(b)) +# define SSL_flush_sessions(a,b) SSL_CTX_flush_sessions((a),(b)) +# endif +/* More backward compatibility */ +# define SSL_get_cipher(s) \ + SSL_CIPHER_get_name(SSL_get_current_cipher(s)) +# define SSL_get_cipher_bits(s,np) \ + SSL_CIPHER_get_bits(SSL_get_current_cipher(s),np) +# define SSL_get_cipher_version(s) \ + SSL_CIPHER_get_version(SSL_get_current_cipher(s)) +# define SSL_get_cipher_name(s) \ + SSL_CIPHER_get_name(SSL_get_current_cipher(s)) +# define SSL_get_time(a) SSL_SESSION_get_time(a) +# define SSL_set_time(a,b) SSL_SESSION_set_time((a),(b)) +# define SSL_get_timeout(a) SSL_SESSION_get_timeout(a) +# define SSL_set_timeout(a,b) SSL_SESSION_set_timeout((a),(b)) + +# define d2i_SSL_SESSION_bio(bp,s_id) ASN1_d2i_bio_of(SSL_SESSION,SSL_SESSION_new,d2i_SSL_SESSION,bp,s_id) +# define i2d_SSL_SESSION_bio(bp,s_id) ASN1_i2d_bio_of(SSL_SESSION,i2d_SSL_SESSION,bp,s_id) + +DECLARE_PEM_rw(SSL_SESSION, SSL_SESSION) +# define SSL_AD_REASON_OFFSET 1000/* offset to get SSL_R_... value + * from SSL_AD_... */ +/* These alert types are for SSLv3 and TLSv1 */ +# define SSL_AD_CLOSE_NOTIFY SSL3_AD_CLOSE_NOTIFY +/* fatal */ +# define SSL_AD_UNEXPECTED_MESSAGE SSL3_AD_UNEXPECTED_MESSAGE +/* fatal */ +# define SSL_AD_BAD_RECORD_MAC SSL3_AD_BAD_RECORD_MAC +# define SSL_AD_DECRYPTION_FAILED TLS1_AD_DECRYPTION_FAILED +# define SSL_AD_RECORD_OVERFLOW TLS1_AD_RECORD_OVERFLOW +/* fatal */ +# define SSL_AD_DECOMPRESSION_FAILURE SSL3_AD_DECOMPRESSION_FAILURE +/* fatal */ +# define SSL_AD_HANDSHAKE_FAILURE SSL3_AD_HANDSHAKE_FAILURE +/* Not for TLS */ +# define SSL_AD_NO_CERTIFICATE SSL3_AD_NO_CERTIFICATE +# define SSL_AD_BAD_CERTIFICATE SSL3_AD_BAD_CERTIFICATE +# define SSL_AD_UNSUPPORTED_CERTIFICATE SSL3_AD_UNSUPPORTED_CERTIFICATE +# define SSL_AD_CERTIFICATE_REVOKED SSL3_AD_CERTIFICATE_REVOKED +# define SSL_AD_CERTIFICATE_EXPIRED SSL3_AD_CERTIFICATE_EXPIRED +# define SSL_AD_CERTIFICATE_UNKNOWN SSL3_AD_CERTIFICATE_UNKNOWN +/* fatal */ +# define SSL_AD_ILLEGAL_PARAMETER SSL3_AD_ILLEGAL_PARAMETER +/* fatal */ +# define SSL_AD_UNKNOWN_CA TLS1_AD_UNKNOWN_CA +/* fatal */ +# define SSL_AD_ACCESS_DENIED TLS1_AD_ACCESS_DENIED +/* fatal */ +# define SSL_AD_DECODE_ERROR TLS1_AD_DECODE_ERROR +# define SSL_AD_DECRYPT_ERROR TLS1_AD_DECRYPT_ERROR +/* fatal */ +# define SSL_AD_EXPORT_RESTRICTION TLS1_AD_EXPORT_RESTRICTION +/* fatal */ +# define SSL_AD_PROTOCOL_VERSION TLS1_AD_PROTOCOL_VERSION +/* fatal */ +# define SSL_AD_INSUFFICIENT_SECURITY TLS1_AD_INSUFFICIENT_SECURITY +/* fatal */ +# define SSL_AD_INTERNAL_ERROR TLS1_AD_INTERNAL_ERROR +# define SSL_AD_USER_CANCELLED TLS1_AD_USER_CANCELLED +# define SSL_AD_NO_RENEGOTIATION TLS1_AD_NO_RENEGOTIATION +# define SSL_AD_UNSUPPORTED_EXTENSION TLS1_AD_UNSUPPORTED_EXTENSION +# define SSL_AD_CERTIFICATE_UNOBTAINABLE TLS1_AD_CERTIFICATE_UNOBTAINABLE +# define SSL_AD_UNRECOGNIZED_NAME TLS1_AD_UNRECOGNIZED_NAME +# define SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE TLS1_AD_BAD_CERTIFICATE_STATUS_RESPONSE +# define SSL_AD_BAD_CERTIFICATE_HASH_VALUE TLS1_AD_BAD_CERTIFICATE_HASH_VALUE +/* fatal */ +# define SSL_AD_UNKNOWN_PSK_IDENTITY TLS1_AD_UNKNOWN_PSK_IDENTITY +/* fatal */ +# define SSL_AD_INAPPROPRIATE_FALLBACK TLS1_AD_INAPPROPRIATE_FALLBACK +# define SSL_ERROR_NONE 0 +# define SSL_ERROR_SSL 1 +# define SSL_ERROR_WANT_READ 2 +# define SSL_ERROR_WANT_WRITE 3 +# define SSL_ERROR_WANT_X509_LOOKUP 4 +# define SSL_ERROR_SYSCALL 5/* look at error stack/return + * value/errno */ +# define SSL_ERROR_ZERO_RETURN 6 +# define SSL_ERROR_WANT_CONNECT 7 +# define SSL_ERROR_WANT_ACCEPT 8 +# define SSL_CTRL_NEED_TMP_RSA 1 +# define SSL_CTRL_SET_TMP_RSA 2 +# define SSL_CTRL_SET_TMP_DH 3 +# define SSL_CTRL_SET_TMP_ECDH 4 +# define SSL_CTRL_SET_TMP_RSA_CB 5 +# define SSL_CTRL_SET_TMP_DH_CB 6 +# define SSL_CTRL_SET_TMP_ECDH_CB 7 +# define SSL_CTRL_GET_SESSION_REUSED 8 +# define SSL_CTRL_GET_CLIENT_CERT_REQUEST 9 +# define SSL_CTRL_GET_NUM_RENEGOTIATIONS 10 +# define SSL_CTRL_CLEAR_NUM_RENEGOTIATIONS 11 +# define SSL_CTRL_GET_TOTAL_RENEGOTIATIONS 12 +# define SSL_CTRL_GET_FLAGS 13 +# define SSL_CTRL_EXTRA_CHAIN_CERT 14 +# define SSL_CTRL_SET_MSG_CALLBACK 15 +# define SSL_CTRL_SET_MSG_CALLBACK_ARG 16 +/* only applies to datagram connections */ +# define SSL_CTRL_SET_MTU 17 +/* Stats */ +# define SSL_CTRL_SESS_NUMBER 20 +# define SSL_CTRL_SESS_CONNECT 21 +# define SSL_CTRL_SESS_CONNECT_GOOD 22 +# define SSL_CTRL_SESS_CONNECT_RENEGOTIATE 23 +# define SSL_CTRL_SESS_ACCEPT 24 +# define SSL_CTRL_SESS_ACCEPT_GOOD 25 +# define SSL_CTRL_SESS_ACCEPT_RENEGOTIATE 26 +# define SSL_CTRL_SESS_HIT 27 +# define SSL_CTRL_SESS_CB_HIT 28 +# define SSL_CTRL_SESS_MISSES 29 +# define SSL_CTRL_SESS_TIMEOUTS 30 +# define SSL_CTRL_SESS_CACHE_FULL 31 +# define SSL_CTRL_OPTIONS 32 +# define SSL_CTRL_MODE 33 +# define SSL_CTRL_GET_READ_AHEAD 40 +# define SSL_CTRL_SET_READ_AHEAD 41 +# define SSL_CTRL_SET_SESS_CACHE_SIZE 42 +# define SSL_CTRL_GET_SESS_CACHE_SIZE 43 +# define SSL_CTRL_SET_SESS_CACHE_MODE 44 +# define SSL_CTRL_GET_SESS_CACHE_MODE 45 +# define SSL_CTRL_GET_MAX_CERT_LIST 50 +# define SSL_CTRL_SET_MAX_CERT_LIST 51 +# define SSL_CTRL_SET_MAX_SEND_FRAGMENT 52 +/* see tls1.h for macros based on these */ +# ifndef OPENSSL_NO_TLSEXT +# define SSL_CTRL_SET_TLSEXT_SERVERNAME_CB 53 +# define SSL_CTRL_SET_TLSEXT_SERVERNAME_ARG 54 +# define SSL_CTRL_SET_TLSEXT_HOSTNAME 55 +# define SSL_CTRL_SET_TLSEXT_DEBUG_CB 56 +# define SSL_CTRL_SET_TLSEXT_DEBUG_ARG 57 +# define SSL_CTRL_GET_TLSEXT_TICKET_KEYS 58 +# define SSL_CTRL_SET_TLSEXT_TICKET_KEYS 59 +# define SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT 60 +# define SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT_CB 61 +# define SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT_CB_ARG 62 +# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB 63 +# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB_ARG 64 +# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_TYPE 65 +# define SSL_CTRL_GET_TLSEXT_STATUS_REQ_EXTS 66 +# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_EXTS 67 +# define SSL_CTRL_GET_TLSEXT_STATUS_REQ_IDS 68 +# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_IDS 69 +# define SSL_CTRL_GET_TLSEXT_STATUS_REQ_OCSP_RESP 70 +# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_OCSP_RESP 71 +# define SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB 72 +# define SSL_CTRL_SET_TLS_EXT_SRP_USERNAME_CB 75 +# define SSL_CTRL_SET_SRP_VERIFY_PARAM_CB 76 +# define SSL_CTRL_SET_SRP_GIVE_CLIENT_PWD_CB 77 +# define SSL_CTRL_SET_SRP_ARG 78 +# define SSL_CTRL_SET_TLS_EXT_SRP_USERNAME 79 +# define SSL_CTRL_SET_TLS_EXT_SRP_STRENGTH 80 +# define SSL_CTRL_SET_TLS_EXT_SRP_PASSWORD 81 +# ifndef OPENSSL_NO_HEARTBEATS +# define SSL_CTRL_TLS_EXT_SEND_HEARTBEAT 85 +# define SSL_CTRL_GET_TLS_EXT_HEARTBEAT_PENDING 86 +# define SSL_CTRL_SET_TLS_EXT_HEARTBEAT_NO_REQUESTS 87 +# endif +# endif /* OPENSSL_NO_TLSEXT */ +# define DTLS_CTRL_GET_TIMEOUT 73 +# define DTLS_CTRL_HANDLE_TIMEOUT 74 +# define DTLS_CTRL_LISTEN 75 +# define SSL_CTRL_GET_RI_SUPPORT 76 +# define SSL_CTRL_CLEAR_OPTIONS 77 +# define SSL_CTRL_CLEAR_MODE 78 +# define SSL_CTRL_GET_EXTRA_CHAIN_CERTS 82 +# define SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS 83 +# define SSL_CTRL_CHAIN 88 +# define SSL_CTRL_CHAIN_CERT 89 +# define SSL_CTRL_GET_CURVES 90 +# define SSL_CTRL_SET_CURVES 91 +# define SSL_CTRL_SET_CURVES_LIST 92 +# define SSL_CTRL_GET_SHARED_CURVE 93 +# define SSL_CTRL_SET_ECDH_AUTO 94 +# define SSL_CTRL_SET_SIGALGS 97 +# define SSL_CTRL_SET_SIGALGS_LIST 98 +# define SSL_CTRL_CERT_FLAGS 99 +# define SSL_CTRL_CLEAR_CERT_FLAGS 100 +# define SSL_CTRL_SET_CLIENT_SIGALGS 101 +# define SSL_CTRL_SET_CLIENT_SIGALGS_LIST 102 +# define SSL_CTRL_GET_CLIENT_CERT_TYPES 103 +# define SSL_CTRL_SET_CLIENT_CERT_TYPES 104 +# define SSL_CTRL_BUILD_CERT_CHAIN 105 +# define SSL_CTRL_SET_VERIFY_CERT_STORE 106 +# define SSL_CTRL_SET_CHAIN_CERT_STORE 107 +# define SSL_CTRL_GET_PEER_SIGNATURE_NID 108 +# define SSL_CTRL_GET_SERVER_TMP_KEY 109 +# define SSL_CTRL_GET_RAW_CIPHERLIST 110 +# define SSL_CTRL_GET_EC_POINT_FORMATS 111 +# define SSL_CTRL_GET_CHAIN_CERTS 115 +# define SSL_CTRL_SELECT_CURRENT_CERT 116 +# define SSL_CTRL_SET_CURRENT_CERT 117 +# define SSL_CTRL_CHECK_PROTO_VERSION 119 +# define DTLS_CTRL_SET_LINK_MTU 120 +# define DTLS_CTRL_GET_LINK_MIN_MTU 121 +# define SSL_CERT_SET_FIRST 1 +# define SSL_CERT_SET_NEXT 2 +# define SSL_CERT_SET_SERVER 3 +# define DTLSv1_get_timeout(ssl, arg) \ + SSL_ctrl(ssl,DTLS_CTRL_GET_TIMEOUT,0, (void *)arg) +# define DTLSv1_handle_timeout(ssl) \ + SSL_ctrl(ssl,DTLS_CTRL_HANDLE_TIMEOUT,0, NULL) +# define DTLSv1_listen(ssl, peer) \ + SSL_ctrl(ssl,DTLS_CTRL_LISTEN,0, (void *)peer) +# define SSL_session_reused(ssl) \ + SSL_ctrl((ssl),SSL_CTRL_GET_SESSION_REUSED,0,NULL) +# define SSL_num_renegotiations(ssl) \ + SSL_ctrl((ssl),SSL_CTRL_GET_NUM_RENEGOTIATIONS,0,NULL) +# define SSL_clear_num_renegotiations(ssl) \ + SSL_ctrl((ssl),SSL_CTRL_CLEAR_NUM_RENEGOTIATIONS,0,NULL) +# define SSL_total_renegotiations(ssl) \ + SSL_ctrl((ssl),SSL_CTRL_GET_TOTAL_RENEGOTIATIONS,0,NULL) +# define SSL_CTX_need_tmp_RSA(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_NEED_TMP_RSA,0,NULL) +# define SSL_CTX_set_tmp_rsa(ctx,rsa) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_RSA,0,(char *)rsa) +# define SSL_CTX_set_tmp_dh(ctx,dh) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_DH,0,(char *)dh) +# define SSL_CTX_set_tmp_ecdh(ctx,ecdh) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_ECDH,0,(char *)ecdh) +# define SSL_need_tmp_RSA(ssl) \ + SSL_ctrl(ssl,SSL_CTRL_NEED_TMP_RSA,0,NULL) +# define SSL_set_tmp_rsa(ssl,rsa) \ + SSL_ctrl(ssl,SSL_CTRL_SET_TMP_RSA,0,(char *)rsa) +# define SSL_set_tmp_dh(ssl,dh) \ + SSL_ctrl(ssl,SSL_CTRL_SET_TMP_DH,0,(char *)dh) +# define SSL_set_tmp_ecdh(ssl,ecdh) \ + SSL_ctrl(ssl,SSL_CTRL_SET_TMP_ECDH,0,(char *)ecdh) +# define SSL_CTX_add_extra_chain_cert(ctx,x509) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_EXTRA_CHAIN_CERT,0,(char *)x509) +# define SSL_CTX_get_extra_chain_certs(ctx,px509) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_GET_EXTRA_CHAIN_CERTS,0,px509) +# define SSL_CTX_get_extra_chain_certs_only(ctx,px509) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_GET_EXTRA_CHAIN_CERTS,1,px509) +# define SSL_CTX_clear_extra_chain_certs(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS,0,NULL) +# define SSL_CTX_set0_chain(ctx,sk) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_CHAIN,0,(char *)sk) +# define SSL_CTX_set1_chain(ctx,sk) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_CHAIN,1,(char *)sk) +# define SSL_CTX_add0_chain_cert(ctx,x509) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_CHAIN_CERT,0,(char *)x509) +# define SSL_CTX_add1_chain_cert(ctx,x509) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_CHAIN_CERT,1,(char *)x509) +# define SSL_CTX_get0_chain_certs(ctx,px509) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_GET_CHAIN_CERTS,0,px509) +# define SSL_CTX_clear_chain_certs(ctx) \ + SSL_CTX_set0_chain(ctx,NULL) +# define SSL_CTX_build_cert_chain(ctx, flags) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_BUILD_CERT_CHAIN, flags, NULL) +# define SSL_CTX_select_current_cert(ctx,x509) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SELECT_CURRENT_CERT,0,(char *)x509) +# define SSL_CTX_set_current_cert(ctx, op) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CURRENT_CERT, op, NULL) +# define SSL_CTX_set0_verify_cert_store(ctx,st) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_VERIFY_CERT_STORE,0,(char *)st) +# define SSL_CTX_set1_verify_cert_store(ctx,st) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_VERIFY_CERT_STORE,1,(char *)st) +# define SSL_CTX_set0_chain_cert_store(ctx,st) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CHAIN_CERT_STORE,0,(char *)st) +# define SSL_CTX_set1_chain_cert_store(ctx,st) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CHAIN_CERT_STORE,1,(char *)st) +# define SSL_set0_chain(ctx,sk) \ + SSL_ctrl(ctx,SSL_CTRL_CHAIN,0,(char *)sk) +# define SSL_set1_chain(ctx,sk) \ + SSL_ctrl(ctx,SSL_CTRL_CHAIN,1,(char *)sk) +# define SSL_add0_chain_cert(ctx,x509) \ + SSL_ctrl(ctx,SSL_CTRL_CHAIN_CERT,0,(char *)x509) +# define SSL_add1_chain_cert(ctx,x509) \ + SSL_ctrl(ctx,SSL_CTRL_CHAIN_CERT,1,(char *)x509) +# define SSL_get0_chain_certs(ctx,px509) \ + SSL_ctrl(ctx,SSL_CTRL_GET_CHAIN_CERTS,0,px509) +# define SSL_clear_chain_certs(ctx) \ + SSL_set0_chain(ctx,NULL) +# define SSL_build_cert_chain(s, flags) \ + SSL_ctrl(s,SSL_CTRL_BUILD_CERT_CHAIN, flags, NULL) +# define SSL_select_current_cert(ctx,x509) \ + SSL_ctrl(ctx,SSL_CTRL_SELECT_CURRENT_CERT,0,(char *)x509) +# define SSL_set_current_cert(ctx,op) \ + SSL_ctrl(ctx,SSL_CTRL_SET_CURRENT_CERT, op, NULL) +# define SSL_set0_verify_cert_store(s,st) \ + SSL_ctrl(s,SSL_CTRL_SET_VERIFY_CERT_STORE,0,(char *)st) +# define SSL_set1_verify_cert_store(s,st) \ + SSL_ctrl(s,SSL_CTRL_SET_VERIFY_CERT_STORE,1,(char *)st) +# define SSL_set0_chain_cert_store(s,st) \ + SSL_ctrl(s,SSL_CTRL_SET_CHAIN_CERT_STORE,0,(char *)st) +# define SSL_set1_chain_cert_store(s,st) \ + SSL_ctrl(s,SSL_CTRL_SET_CHAIN_CERT_STORE,1,(char *)st) +# define SSL_get1_curves(ctx, s) \ + SSL_ctrl(ctx,SSL_CTRL_GET_CURVES,0,(char *)s) +# define SSL_CTX_set1_curves(ctx, clist, clistlen) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CURVES,clistlen,(char *)clist) +# define SSL_CTX_set1_curves_list(ctx, s) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CURVES_LIST,0,(char *)s) +# define SSL_set1_curves(ctx, clist, clistlen) \ + SSL_ctrl(ctx,SSL_CTRL_SET_CURVES,clistlen,(char *)clist) +# define SSL_set1_curves_list(ctx, s) \ + SSL_ctrl(ctx,SSL_CTRL_SET_CURVES_LIST,0,(char *)s) +# define SSL_get_shared_curve(s, n) \ + SSL_ctrl(s,SSL_CTRL_GET_SHARED_CURVE,n,NULL) +# define SSL_CTX_set_ecdh_auto(ctx, onoff) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_ECDH_AUTO,onoff,NULL) +# define SSL_set_ecdh_auto(s, onoff) \ + SSL_ctrl(s,SSL_CTRL_SET_ECDH_AUTO,onoff,NULL) +# define SSL_CTX_set1_sigalgs(ctx, slist, slistlen) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SIGALGS,slistlen,(int *)slist) +# define SSL_CTX_set1_sigalgs_list(ctx, s) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SIGALGS_LIST,0,(char *)s) +# define SSL_set1_sigalgs(ctx, slist, slistlen) \ + SSL_ctrl(ctx,SSL_CTRL_SET_SIGALGS,slistlen,(int *)slist) +# define SSL_set1_sigalgs_list(ctx, s) \ + SSL_ctrl(ctx,SSL_CTRL_SET_SIGALGS_LIST,0,(char *)s) +# define SSL_CTX_set1_client_sigalgs(ctx, slist, slistlen) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CLIENT_SIGALGS,slistlen,(int *)slist) +# define SSL_CTX_set1_client_sigalgs_list(ctx, s) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CLIENT_SIGALGS_LIST,0,(char *)s) +# define SSL_set1_client_sigalgs(ctx, slist, slistlen) \ + SSL_ctrl(ctx,SSL_CTRL_SET_CLIENT_SIGALGS,clistlen,(int *)slist) +# define SSL_set1_client_sigalgs_list(ctx, s) \ + SSL_ctrl(ctx,SSL_CTRL_SET_CLIENT_SIGALGS_LIST,0,(char *)s) +# define SSL_get0_certificate_types(s, clist) \ + SSL_ctrl(s, SSL_CTRL_GET_CLIENT_CERT_TYPES, 0, (char *)clist) +# define SSL_CTX_set1_client_certificate_types(ctx, clist, clistlen) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CLIENT_CERT_TYPES,clistlen,(char *)clist) +# define SSL_set1_client_certificate_types(s, clist, clistlen) \ + SSL_ctrl(s,SSL_CTRL_SET_CLIENT_CERT_TYPES,clistlen,(char *)clist) +# define SSL_get_peer_signature_nid(s, pn) \ + SSL_ctrl(s,SSL_CTRL_GET_PEER_SIGNATURE_NID,0,pn) +# define SSL_get_server_tmp_key(s, pk) \ + SSL_ctrl(s,SSL_CTRL_GET_SERVER_TMP_KEY,0,pk) +# define SSL_get0_raw_cipherlist(s, plst) \ + SSL_ctrl(s,SSL_CTRL_GET_RAW_CIPHERLIST,0,(char *)plst) +# define SSL_get0_ec_point_formats(s, plst) \ + SSL_ctrl(s,SSL_CTRL_GET_EC_POINT_FORMATS,0,(char *)plst) +# ifndef OPENSSL_NO_BIO +BIO_METHOD *BIO_f_ssl(void); +BIO *BIO_new_ssl(SSL_CTX *ctx, int client); +BIO *BIO_new_ssl_connect(SSL_CTX *ctx); +BIO *BIO_new_buffer_ssl_connect(SSL_CTX *ctx); +int BIO_ssl_copy_session_id(BIO *to, BIO *from); +void BIO_ssl_shutdown(BIO *ssl_bio); + +# endif + +int SSL_CTX_set_cipher_list(SSL_CTX *, const char *str); +SSL_CTX *SSL_CTX_new(const SSL_METHOD *meth); +void SSL_CTX_free(SSL_CTX *); +long SSL_CTX_set_timeout(SSL_CTX *ctx, long t); +long SSL_CTX_get_timeout(const SSL_CTX *ctx); +X509_STORE *SSL_CTX_get_cert_store(const SSL_CTX *); +void SSL_CTX_set_cert_store(SSL_CTX *, X509_STORE *); +int SSL_want(const SSL *s); +int SSL_clear(SSL *s); + +void SSL_CTX_flush_sessions(SSL_CTX *ctx, long tm); + +const SSL_CIPHER *SSL_get_current_cipher(const SSL *s); +int SSL_CIPHER_get_bits(const SSL_CIPHER *c, int *alg_bits); +char *SSL_CIPHER_get_version(const SSL_CIPHER *c); +const char *SSL_CIPHER_get_name(const SSL_CIPHER *c); +unsigned long SSL_CIPHER_get_id(const SSL_CIPHER *c); + +int SSL_get_fd(const SSL *s); +int SSL_get_rfd(const SSL *s); +int SSL_get_wfd(const SSL *s); +const char *SSL_get_cipher_list(const SSL *s, int n); +char *SSL_get_shared_ciphers(const SSL *s, char *buf, int len); +int SSL_get_read_ahead(const SSL *s); +int SSL_pending(const SSL *s); +# ifndef OPENSSL_NO_SOCK +int SSL_set_fd(SSL *s, int fd); +int SSL_set_rfd(SSL *s, int fd); +int SSL_set_wfd(SSL *s, int fd); +# endif +# ifndef OPENSSL_NO_BIO +void SSL_set_bio(SSL *s, BIO *rbio, BIO *wbio); +BIO *SSL_get_rbio(const SSL *s); +BIO *SSL_get_wbio(const SSL *s); +# endif +int SSL_set_cipher_list(SSL *s, const char *str); +void SSL_set_read_ahead(SSL *s, int yes); +int SSL_get_verify_mode(const SSL *s); +int SSL_get_verify_depth(const SSL *s); +int (*SSL_get_verify_callback(const SSL *s)) (int, X509_STORE_CTX *); +void SSL_set_verify(SSL *s, int mode, + int (*callback) (int ok, X509_STORE_CTX *ctx)); +void SSL_set_verify_depth(SSL *s, int depth); +void SSL_set_cert_cb(SSL *s, int (*cb) (SSL *ssl, void *arg), void *arg); +# ifndef OPENSSL_NO_RSA +int SSL_use_RSAPrivateKey(SSL *ssl, RSA *rsa); +# endif +int SSL_use_RSAPrivateKey_ASN1(SSL *ssl, unsigned char *d, long len); +int SSL_use_PrivateKey(SSL *ssl, EVP_PKEY *pkey); +int SSL_use_PrivateKey_ASN1(int pk, SSL *ssl, const unsigned char *d, + long len); +int SSL_use_certificate(SSL *ssl, X509 *x); +int SSL_use_certificate_ASN1(SSL *ssl, const unsigned char *d, int len); + +# ifndef OPENSSL_NO_TLSEXT +/* Set serverinfo data for the current active cert. */ +int SSL_CTX_use_serverinfo(SSL_CTX *ctx, const unsigned char *serverinfo, + size_t serverinfo_length); +# ifndef OPENSSL_NO_STDIO +int SSL_CTX_use_serverinfo_file(SSL_CTX *ctx, const char *file); +# endif /* NO_STDIO */ + +# endif + +# ifndef OPENSSL_NO_STDIO +int SSL_use_RSAPrivateKey_file(SSL *ssl, const char *file, int type); +int SSL_use_PrivateKey_file(SSL *ssl, const char *file, int type); +int SSL_use_certificate_file(SSL *ssl, const char *file, int type); +int SSL_CTX_use_RSAPrivateKey_file(SSL_CTX *ctx, const char *file, int type); +int SSL_CTX_use_PrivateKey_file(SSL_CTX *ctx, const char *file, int type); +int SSL_CTX_use_certificate_file(SSL_CTX *ctx, const char *file, int type); +/* PEM type */ +int SSL_CTX_use_certificate_chain_file(SSL_CTX *ctx, const char *file); +STACK_OF(X509_NAME) *SSL_load_client_CA_file(const char *file); +int SSL_add_file_cert_subjects_to_stack(STACK_OF(X509_NAME) *stackCAs, + const char *file); +# ifndef OPENSSL_SYS_VMS +/* XXXXX: Better scheme needed! [was: #ifndef MAC_OS_pre_X] */ +# ifndef OPENSSL_SYS_MACINTOSH_CLASSIC +int SSL_add_dir_cert_subjects_to_stack(STACK_OF(X509_NAME) *stackCAs, + const char *dir); +# endif +# endif + +# endif + +void SSL_load_error_strings(void); +const char *SSL_state_string(const SSL *s); +const char *SSL_rstate_string(const SSL *s); +const char *SSL_state_string_long(const SSL *s); +const char *SSL_rstate_string_long(const SSL *s); +long SSL_SESSION_get_time(const SSL_SESSION *s); +long SSL_SESSION_set_time(SSL_SESSION *s, long t); +long SSL_SESSION_get_timeout(const SSL_SESSION *s); +long SSL_SESSION_set_timeout(SSL_SESSION *s, long t); +void SSL_copy_session_id(SSL *to, const SSL *from); +X509 *SSL_SESSION_get0_peer(SSL_SESSION *s); +int SSL_SESSION_set1_id_context(SSL_SESSION *s, const unsigned char *sid_ctx, + unsigned int sid_ctx_len); + +SSL_SESSION *SSL_SESSION_new(void); +const unsigned char *SSL_SESSION_get_id(const SSL_SESSION *s, + unsigned int *len); +unsigned int SSL_SESSION_get_compress_id(const SSL_SESSION *s); +# ifndef OPENSSL_NO_FP_API +int SSL_SESSION_print_fp(FILE *fp, const SSL_SESSION *ses); +# endif +# ifndef OPENSSL_NO_BIO +int SSL_SESSION_print(BIO *fp, const SSL_SESSION *ses); +# endif +void SSL_SESSION_free(SSL_SESSION *ses); +int i2d_SSL_SESSION(SSL_SESSION *in, unsigned char **pp); +int SSL_set_session(SSL *to, SSL_SESSION *session); +int SSL_CTX_add_session(SSL_CTX *s, SSL_SESSION *c); +int SSL_CTX_remove_session(SSL_CTX *, SSL_SESSION *c); +int SSL_CTX_set_generate_session_id(SSL_CTX *, GEN_SESSION_CB); +int SSL_set_generate_session_id(SSL *, GEN_SESSION_CB); +int SSL_has_matching_session_id(const SSL *ssl, const unsigned char *id, + unsigned int id_len); +SSL_SESSION *d2i_SSL_SESSION(SSL_SESSION **a, const unsigned char **pp, + long length); + +# ifdef HEADER_X509_H +X509 *SSL_get_peer_certificate(const SSL *s); +# endif + +STACK_OF(X509) *SSL_get_peer_cert_chain(const SSL *s); + +int SSL_CTX_get_verify_mode(const SSL_CTX *ctx); +int SSL_CTX_get_verify_depth(const SSL_CTX *ctx); +int (*SSL_CTX_get_verify_callback(const SSL_CTX *ctx)) (int, + X509_STORE_CTX *); +void SSL_CTX_set_verify(SSL_CTX *ctx, int mode, + int (*callback) (int, X509_STORE_CTX *)); +void SSL_CTX_set_verify_depth(SSL_CTX *ctx, int depth); +void SSL_CTX_set_cert_verify_callback(SSL_CTX *ctx, + int (*cb) (X509_STORE_CTX *, void *), + void *arg); +void SSL_CTX_set_cert_cb(SSL_CTX *c, int (*cb) (SSL *ssl, void *arg), + void *arg); +# ifndef OPENSSL_NO_RSA +int SSL_CTX_use_RSAPrivateKey(SSL_CTX *ctx, RSA *rsa); +# endif +int SSL_CTX_use_RSAPrivateKey_ASN1(SSL_CTX *ctx, const unsigned char *d, + long len); +int SSL_CTX_use_PrivateKey(SSL_CTX *ctx, EVP_PKEY *pkey); +int SSL_CTX_use_PrivateKey_ASN1(int pk, SSL_CTX *ctx, + const unsigned char *d, long len); +int SSL_CTX_use_certificate(SSL_CTX *ctx, X509 *x); +int SSL_CTX_use_certificate_ASN1(SSL_CTX *ctx, int len, + const unsigned char *d); + +void SSL_CTX_set_default_passwd_cb(SSL_CTX *ctx, pem_password_cb *cb); +void SSL_CTX_set_default_passwd_cb_userdata(SSL_CTX *ctx, void *u); + +int SSL_CTX_check_private_key(const SSL_CTX *ctx); +int SSL_check_private_key(const SSL *ctx); + +int SSL_CTX_set_session_id_context(SSL_CTX *ctx, const unsigned char *sid_ctx, + unsigned int sid_ctx_len); + +SSL *SSL_new(SSL_CTX *ctx); +int SSL_set_session_id_context(SSL *ssl, const unsigned char *sid_ctx, + unsigned int sid_ctx_len); + +int SSL_CTX_set_purpose(SSL_CTX *s, int purpose); +int SSL_set_purpose(SSL *s, int purpose); +int SSL_CTX_set_trust(SSL_CTX *s, int trust); +int SSL_set_trust(SSL *s, int trust); + +int SSL_CTX_set1_param(SSL_CTX *ctx, X509_VERIFY_PARAM *vpm); +int SSL_set1_param(SSL *ssl, X509_VERIFY_PARAM *vpm); + +X509_VERIFY_PARAM *SSL_CTX_get0_param(SSL_CTX *ctx); +X509_VERIFY_PARAM *SSL_get0_param(SSL *ssl); + +# ifndef OPENSSL_NO_SRP +int SSL_CTX_set_srp_username(SSL_CTX *ctx, char *name); +int SSL_CTX_set_srp_password(SSL_CTX *ctx, char *password); +int SSL_CTX_set_srp_strength(SSL_CTX *ctx, int strength); +int SSL_CTX_set_srp_client_pwd_callback(SSL_CTX *ctx, + char *(*cb) (SSL *, void *)); +int SSL_CTX_set_srp_verify_param_callback(SSL_CTX *ctx, + int (*cb) (SSL *, void *)); +int SSL_CTX_set_srp_username_callback(SSL_CTX *ctx, + int (*cb) (SSL *, int *, void *)); +int SSL_CTX_set_srp_cb_arg(SSL_CTX *ctx, void *arg); + +int SSL_set_srp_server_param(SSL *s, const BIGNUM *N, const BIGNUM *g, + BIGNUM *sa, BIGNUM *v, char *info); +int SSL_set_srp_server_param_pw(SSL *s, const char *user, const char *pass, + const char *grp); + +BIGNUM *SSL_get_srp_g(SSL *s); +BIGNUM *SSL_get_srp_N(SSL *s); + +char *SSL_get_srp_username(SSL *s); +char *SSL_get_srp_userinfo(SSL *s); +# endif + +void SSL_certs_clear(SSL *s); +void SSL_free(SSL *ssl); +int SSL_accept(SSL *ssl); +int SSL_connect(SSL *ssl); +int SSL_read(SSL *ssl, void *buf, int num); +int SSL_peek(SSL *ssl, void *buf, int num); +int SSL_write(SSL *ssl, const void *buf, int num); +long SSL_ctrl(SSL *ssl, int cmd, long larg, void *parg); +long SSL_callback_ctrl(SSL *, int, void (*)(void)); +long SSL_CTX_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg); +long SSL_CTX_callback_ctrl(SSL_CTX *, int, void (*)(void)); + +int SSL_get_error(const SSL *s, int ret_code); +const char *SSL_get_version(const SSL *s); + +/* This sets the 'default' SSL version that SSL_new() will create */ +int SSL_CTX_set_ssl_version(SSL_CTX *ctx, const SSL_METHOD *meth); + +# ifndef OPENSSL_NO_SSL2_METHOD +const SSL_METHOD *SSLv2_method(void); /* SSLv2 */ +const SSL_METHOD *SSLv2_server_method(void); /* SSLv2 */ +const SSL_METHOD *SSLv2_client_method(void); /* SSLv2 */ +# endif + +# ifndef OPENSSL_NO_SSL3_METHOD +const SSL_METHOD *SSLv3_method(void); /* SSLv3 */ +const SSL_METHOD *SSLv3_server_method(void); /* SSLv3 */ +const SSL_METHOD *SSLv3_client_method(void); /* SSLv3 */ +# endif + +const SSL_METHOD *SSLv23_method(void); /* Negotiate highest available SSL/TLS + * version */ +const SSL_METHOD *SSLv23_server_method(void); /* Negotiate highest available + * SSL/TLS version */ +const SSL_METHOD *SSLv23_client_method(void); /* Negotiate highest available + * SSL/TLS version */ + +const SSL_METHOD *TLSv1_method(void); /* TLSv1.0 */ +const SSL_METHOD *TLSv1_server_method(void); /* TLSv1.0 */ +const SSL_METHOD *TLSv1_client_method(void); /* TLSv1.0 */ + +const SSL_METHOD *TLSv1_1_method(void); /* TLSv1.1 */ +const SSL_METHOD *TLSv1_1_server_method(void); /* TLSv1.1 */ +const SSL_METHOD *TLSv1_1_client_method(void); /* TLSv1.1 */ + +const SSL_METHOD *TLSv1_2_method(void); /* TLSv1.2 */ +const SSL_METHOD *TLSv1_2_server_method(void); /* TLSv1.2 */ +const SSL_METHOD *TLSv1_2_client_method(void); /* TLSv1.2 */ + +const SSL_METHOD *DTLSv1_method(void); /* DTLSv1.0 */ +const SSL_METHOD *DTLSv1_server_method(void); /* DTLSv1.0 */ +const SSL_METHOD *DTLSv1_client_method(void); /* DTLSv1.0 */ + +const SSL_METHOD *DTLSv1_2_method(void); /* DTLSv1.2 */ +const SSL_METHOD *DTLSv1_2_server_method(void); /* DTLSv1.2 */ +const SSL_METHOD *DTLSv1_2_client_method(void); /* DTLSv1.2 */ + +const SSL_METHOD *DTLS_method(void); /* DTLS 1.0 and 1.2 */ +const SSL_METHOD *DTLS_server_method(void); /* DTLS 1.0 and 1.2 */ +const SSL_METHOD *DTLS_client_method(void); /* DTLS 1.0 and 1.2 */ + +STACK_OF(SSL_CIPHER) *SSL_get_ciphers(const SSL *s); + +int SSL_do_handshake(SSL *s); +int SSL_renegotiate(SSL *s); +int SSL_renegotiate_abbreviated(SSL *s); +int SSL_renegotiate_pending(SSL *s); +int SSL_shutdown(SSL *s); + +const SSL_METHOD *SSL_CTX_get_ssl_method(SSL_CTX *ctx); +const SSL_METHOD *SSL_get_ssl_method(SSL *s); +int SSL_set_ssl_method(SSL *s, const SSL_METHOD *method); +const char *SSL_alert_type_string_long(int value); +const char *SSL_alert_type_string(int value); +const char *SSL_alert_desc_string_long(int value); +const char *SSL_alert_desc_string(int value); + +void SSL_set_client_CA_list(SSL *s, STACK_OF(X509_NAME) *name_list); +void SSL_CTX_set_client_CA_list(SSL_CTX *ctx, STACK_OF(X509_NAME) *name_list); +STACK_OF(X509_NAME) *SSL_get_client_CA_list(const SSL *s); +STACK_OF(X509_NAME) *SSL_CTX_get_client_CA_list(const SSL_CTX *s); +int SSL_add_client_CA(SSL *ssl, X509 *x); +int SSL_CTX_add_client_CA(SSL_CTX *ctx, X509 *x); + +void SSL_set_connect_state(SSL *s); +void SSL_set_accept_state(SSL *s); + +long SSL_get_default_timeout(const SSL *s); + +int SSL_library_init(void); + +char *SSL_CIPHER_description(const SSL_CIPHER *, char *buf, int size); +STACK_OF(X509_NAME) *SSL_dup_CA_list(STACK_OF(X509_NAME) *sk); + +SSL *SSL_dup(SSL *ssl); + +X509 *SSL_get_certificate(const SSL *ssl); +/* + * EVP_PKEY + */ struct evp_pkey_st *SSL_get_privatekey(const SSL *ssl); + +X509 *SSL_CTX_get0_certificate(const SSL_CTX *ctx); +EVP_PKEY *SSL_CTX_get0_privatekey(const SSL_CTX *ctx); + +void SSL_CTX_set_quiet_shutdown(SSL_CTX *ctx, int mode); +int SSL_CTX_get_quiet_shutdown(const SSL_CTX *ctx); +void SSL_set_quiet_shutdown(SSL *ssl, int mode); +int SSL_get_quiet_shutdown(const SSL *ssl); +void SSL_set_shutdown(SSL *ssl, int mode); +int SSL_get_shutdown(const SSL *ssl); +int SSL_version(const SSL *ssl); +int SSL_CTX_set_default_verify_paths(SSL_CTX *ctx); +int SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *CAfile, + const char *CApath); +# define SSL_get0_session SSL_get_session/* just peek at pointer */ +SSL_SESSION *SSL_get_session(const SSL *ssl); +SSL_SESSION *SSL_get1_session(SSL *ssl); /* obtain a reference count */ +SSL_CTX *SSL_get_SSL_CTX(const SSL *ssl); +SSL_CTX *SSL_set_SSL_CTX(SSL *ssl, SSL_CTX *ctx); +void SSL_set_info_callback(SSL *ssl, + void (*cb) (const SSL *ssl, int type, int val)); +void (*SSL_get_info_callback(const SSL *ssl)) (const SSL *ssl, int type, + int val); +int SSL_state(const SSL *ssl); +void SSL_set_state(SSL *ssl, int state); + +void SSL_set_verify_result(SSL *ssl, long v); +long SSL_get_verify_result(const SSL *ssl); + +int SSL_set_ex_data(SSL *ssl, int idx, void *data); +void *SSL_get_ex_data(const SSL *ssl, int idx); +int SSL_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); + +int SSL_SESSION_set_ex_data(SSL_SESSION *ss, int idx, void *data); +void *SSL_SESSION_get_ex_data(const SSL_SESSION *ss, int idx); +int SSL_SESSION_get_ex_new_index(long argl, void *argp, + CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, + CRYPTO_EX_free *free_func); + +int SSL_CTX_set_ex_data(SSL_CTX *ssl, int idx, void *data); +void *SSL_CTX_get_ex_data(const SSL_CTX *ssl, int idx); +int SSL_CTX_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, + CRYPTO_EX_free *free_func); + +int SSL_get_ex_data_X509_STORE_CTX_idx(void); + +# define SSL_CTX_sess_set_cache_size(ctx,t) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SESS_CACHE_SIZE,t,NULL) +# define SSL_CTX_sess_get_cache_size(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_GET_SESS_CACHE_SIZE,0,NULL) +# define SSL_CTX_set_session_cache_mode(ctx,m) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SESS_CACHE_MODE,m,NULL) +# define SSL_CTX_get_session_cache_mode(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_GET_SESS_CACHE_MODE,0,NULL) + +# define SSL_CTX_get_default_read_ahead(ctx) SSL_CTX_get_read_ahead(ctx) +# define SSL_CTX_set_default_read_ahead(ctx,m) SSL_CTX_set_read_ahead(ctx,m) +# define SSL_CTX_get_read_ahead(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_GET_READ_AHEAD,0,NULL) +# define SSL_CTX_set_read_ahead(ctx,m) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_READ_AHEAD,m,NULL) +# define SSL_CTX_get_max_cert_list(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_GET_MAX_CERT_LIST,0,NULL) +# define SSL_CTX_set_max_cert_list(ctx,m) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_MAX_CERT_LIST,m,NULL) +# define SSL_get_max_cert_list(ssl) \ + SSL_ctrl(ssl,SSL_CTRL_GET_MAX_CERT_LIST,0,NULL) +# define SSL_set_max_cert_list(ssl,m) \ + SSL_ctrl(ssl,SSL_CTRL_SET_MAX_CERT_LIST,m,NULL) + +# define SSL_CTX_set_max_send_fragment(ctx,m) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_MAX_SEND_FRAGMENT,m,NULL) +# define SSL_set_max_send_fragment(ssl,m) \ + SSL_ctrl(ssl,SSL_CTRL_SET_MAX_SEND_FRAGMENT,m,NULL) + + /* NB: the keylength is only applicable when is_export is true */ +# ifndef OPENSSL_NO_RSA +void SSL_CTX_set_tmp_rsa_callback(SSL_CTX *ctx, + RSA *(*cb) (SSL *ssl, int is_export, + int keylength)); + +void SSL_set_tmp_rsa_callback(SSL *ssl, + RSA *(*cb) (SSL *ssl, int is_export, + int keylength)); +# endif +# ifndef OPENSSL_NO_DH +void SSL_CTX_set_tmp_dh_callback(SSL_CTX *ctx, + DH *(*dh) (SSL *ssl, int is_export, + int keylength)); +void SSL_set_tmp_dh_callback(SSL *ssl, + DH *(*dh) (SSL *ssl, int is_export, + int keylength)); +# endif +# ifndef OPENSSL_NO_ECDH +void SSL_CTX_set_tmp_ecdh_callback(SSL_CTX *ctx, + EC_KEY *(*ecdh) (SSL *ssl, int is_export, + int keylength)); +void SSL_set_tmp_ecdh_callback(SSL *ssl, + EC_KEY *(*ecdh) (SSL *ssl, int is_export, + int keylength)); +# endif + +const COMP_METHOD *SSL_get_current_compression(SSL *s); +const COMP_METHOD *SSL_get_current_expansion(SSL *s); +const char *SSL_COMP_get_name(const COMP_METHOD *comp); +STACK_OF(SSL_COMP) *SSL_COMP_get_compression_methods(void); +STACK_OF(SSL_COMP) *SSL_COMP_set0_compression_methods(STACK_OF(SSL_COMP) + *meths); +void SSL_COMP_free_compression_methods(void); +int SSL_COMP_add_compression_method(int id, COMP_METHOD *cm); + +const SSL_CIPHER *SSL_CIPHER_find(SSL *ssl, const unsigned char *ptr); + +/* TLS extensions functions */ +int SSL_set_session_ticket_ext(SSL *s, void *ext_data, int ext_len); + +int SSL_set_session_ticket_ext_cb(SSL *s, tls_session_ticket_ext_cb_fn cb, + void *arg); + +/* Pre-shared secret session resumption functions */ +int SSL_set_session_secret_cb(SSL *s, + tls_session_secret_cb_fn tls_session_secret_cb, + void *arg); + +void SSL_set_debug(SSL *s, int debug); +int SSL_cache_hit(SSL *s); +int SSL_is_server(SSL *s); + +SSL_CONF_CTX *SSL_CONF_CTX_new(void); +int SSL_CONF_CTX_finish(SSL_CONF_CTX *cctx); +void SSL_CONF_CTX_free(SSL_CONF_CTX *cctx); +unsigned int SSL_CONF_CTX_set_flags(SSL_CONF_CTX *cctx, unsigned int flags); +unsigned int SSL_CONF_CTX_clear_flags(SSL_CONF_CTX *cctx, unsigned int flags); +int SSL_CONF_CTX_set1_prefix(SSL_CONF_CTX *cctx, const char *pre); + +void SSL_CONF_CTX_set_ssl(SSL_CONF_CTX *cctx, SSL *ssl); +void SSL_CONF_CTX_set_ssl_ctx(SSL_CONF_CTX *cctx, SSL_CTX *ctx); + +int SSL_CONF_cmd(SSL_CONF_CTX *cctx, const char *cmd, const char *value); +int SSL_CONF_cmd_argv(SSL_CONF_CTX *cctx, int *pargc, char ***pargv); +int SSL_CONF_cmd_value_type(SSL_CONF_CTX *cctx, const char *cmd); + +# ifndef OPENSSL_NO_SSL_TRACE +void SSL_trace(int write_p, int version, int content_type, + const void *buf, size_t len, SSL *ssl, void *arg); +const char *SSL_CIPHER_standard_name(const SSL_CIPHER *c); +# endif + +# ifndef OPENSSL_NO_UNIT_TEST +const struct openssl_ssl_test_functions *SSL_test_functions(void); +# endif + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_SSL_strings(void); + +/* Error codes for the SSL functions. */ + +/* Function codes. */ +# define SSL_F_CHECK_SUITEB_CIPHER_LIST 331 +# define SSL_F_CLIENT_CERTIFICATE 100 +# define SSL_F_CLIENT_FINISHED 167 +# define SSL_F_CLIENT_HELLO 101 +# define SSL_F_CLIENT_MASTER_KEY 102 +# define SSL_F_D2I_SSL_SESSION 103 +# define SSL_F_DO_DTLS1_WRITE 245 +# define SSL_F_DO_SSL3_WRITE 104 +# define SSL_F_DTLS1_ACCEPT 246 +# define SSL_F_DTLS1_ADD_CERT_TO_BUF 295 +# define SSL_F_DTLS1_BUFFER_RECORD 247 +# define SSL_F_DTLS1_CHECK_TIMEOUT_NUM 316 +# define SSL_F_DTLS1_CLIENT_HELLO 248 +# define SSL_F_DTLS1_CONNECT 249 +# define SSL_F_DTLS1_ENC 250 +# define SSL_F_DTLS1_GET_HELLO_VERIFY 251 +# define SSL_F_DTLS1_GET_MESSAGE 252 +# define SSL_F_DTLS1_GET_MESSAGE_FRAGMENT 253 +# define SSL_F_DTLS1_GET_RECORD 254 +# define SSL_F_DTLS1_HANDLE_TIMEOUT 297 +# define SSL_F_DTLS1_HEARTBEAT 305 +# define SSL_F_DTLS1_OUTPUT_CERT_CHAIN 255 +# define SSL_F_DTLS1_PREPROCESS_FRAGMENT 288 +# define SSL_F_DTLS1_PROCESS_BUFFERED_RECORDS 424 +# define SSL_F_DTLS1_PROCESS_OUT_OF_SEQ_MESSAGE 256 +# define SSL_F_DTLS1_PROCESS_RECORD 257 +# define SSL_F_DTLS1_READ_BYTES 258 +# define SSL_F_DTLS1_READ_FAILED 259 +# define SSL_F_DTLS1_SEND_CERTIFICATE_REQUEST 260 +# define SSL_F_DTLS1_SEND_CLIENT_CERTIFICATE 261 +# define SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE 262 +# define SSL_F_DTLS1_SEND_CLIENT_VERIFY 263 +# define SSL_F_DTLS1_SEND_HELLO_VERIFY_REQUEST 264 +# define SSL_F_DTLS1_SEND_SERVER_CERTIFICATE 265 +# define SSL_F_DTLS1_SEND_SERVER_HELLO 266 +# define SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE 267 +# define SSL_F_DTLS1_WRITE_APP_DATA_BYTES 268 +# define SSL_F_GET_CLIENT_FINISHED 105 +# define SSL_F_GET_CLIENT_HELLO 106 +# define SSL_F_GET_CLIENT_MASTER_KEY 107 +# define SSL_F_GET_SERVER_FINISHED 108 +# define SSL_F_GET_SERVER_HELLO 109 +# define SSL_F_GET_SERVER_STATIC_DH_KEY 340 +# define SSL_F_GET_SERVER_VERIFY 110 +# define SSL_F_I2D_SSL_SESSION 111 +# define SSL_F_READ_N 112 +# define SSL_F_REQUEST_CERTIFICATE 113 +# define SSL_F_SERVER_FINISH 239 +# define SSL_F_SERVER_HELLO 114 +# define SSL_F_SERVER_VERIFY 240 +# define SSL_F_SSL23_ACCEPT 115 +# define SSL_F_SSL23_CLIENT_HELLO 116 +# define SSL_F_SSL23_CONNECT 117 +# define SSL_F_SSL23_GET_CLIENT_HELLO 118 +# define SSL_F_SSL23_GET_SERVER_HELLO 119 +# define SSL_F_SSL23_PEEK 237 +# define SSL_F_SSL23_READ 120 +# define SSL_F_SSL23_WRITE 121 +# define SSL_F_SSL2_ACCEPT 122 +# define SSL_F_SSL2_CONNECT 123 +# define SSL_F_SSL2_ENC_INIT 124 +# define SSL_F_SSL2_GENERATE_KEY_MATERIAL 241 +# define SSL_F_SSL2_PEEK 234 +# define SSL_F_SSL2_READ 125 +# define SSL_F_SSL2_READ_INTERNAL 236 +# define SSL_F_SSL2_SET_CERTIFICATE 126 +# define SSL_F_SSL2_WRITE 127 +# define SSL_F_SSL3_ACCEPT 128 +# define SSL_F_SSL3_ADD_CERT_TO_BUF 296 +# define SSL_F_SSL3_CALLBACK_CTRL 233 +# define SSL_F_SSL3_CHANGE_CIPHER_STATE 129 +# define SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM 130 +# define SSL_F_SSL3_CHECK_CLIENT_HELLO 304 +# define SSL_F_SSL3_CHECK_FINISHED 339 +# define SSL_F_SSL3_CLIENT_HELLO 131 +# define SSL_F_SSL3_CONNECT 132 +# define SSL_F_SSL3_CTRL 213 +# define SSL_F_SSL3_CTX_CTRL 133 +# define SSL_F_SSL3_DIGEST_CACHED_RECORDS 293 +# define SSL_F_SSL3_DO_CHANGE_CIPHER_SPEC 292 +# define SSL_F_SSL3_ENC 134 +# define SSL_F_SSL3_GENERATE_KEY_BLOCK 238 +# define SSL_F_SSL3_GENERATE_MASTER_SECRET 388 +# define SSL_F_SSL3_GET_CERTIFICATE_REQUEST 135 +# define SSL_F_SSL3_GET_CERT_STATUS 289 +# define SSL_F_SSL3_GET_CERT_VERIFY 136 +# define SSL_F_SSL3_GET_CLIENT_CERTIFICATE 137 +# define SSL_F_SSL3_GET_CLIENT_HELLO 138 +# define SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE 139 +# define SSL_F_SSL3_GET_FINISHED 140 +# define SSL_F_SSL3_GET_KEY_EXCHANGE 141 +# define SSL_F_SSL3_GET_MESSAGE 142 +# define SSL_F_SSL3_GET_NEW_SESSION_TICKET 283 +# define SSL_F_SSL3_GET_NEXT_PROTO 306 +# define SSL_F_SSL3_GET_RECORD 143 +# define SSL_F_SSL3_GET_SERVER_CERTIFICATE 144 +# define SSL_F_SSL3_GET_SERVER_DONE 145 +# define SSL_F_SSL3_GET_SERVER_HELLO 146 +# define SSL_F_SSL3_HANDSHAKE_MAC 285 +# define SSL_F_SSL3_NEW_SESSION_TICKET 287 +# define SSL_F_SSL3_OUTPUT_CERT_CHAIN 147 +# define SSL_F_SSL3_PEEK 235 +# define SSL_F_SSL3_READ_BYTES 148 +# define SSL_F_SSL3_READ_N 149 +# define SSL_F_SSL3_SEND_CERTIFICATE_REQUEST 150 +# define SSL_F_SSL3_SEND_CLIENT_CERTIFICATE 151 +# define SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE 152 +# define SSL_F_SSL3_SEND_CLIENT_VERIFY 153 +# define SSL_F_SSL3_SEND_SERVER_CERTIFICATE 154 +# define SSL_F_SSL3_SEND_SERVER_HELLO 242 +# define SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE 155 +# define SSL_F_SSL3_SETUP_KEY_BLOCK 157 +# define SSL_F_SSL3_SETUP_READ_BUFFER 156 +# define SSL_F_SSL3_SETUP_WRITE_BUFFER 291 +# define SSL_F_SSL3_WRITE_BYTES 158 +# define SSL_F_SSL3_WRITE_PENDING 159 +# define SSL_F_SSL_ADD_CERT_CHAIN 318 +# define SSL_F_SSL_ADD_CERT_TO_BUF 319 +# define SSL_F_SSL_ADD_CLIENTHELLO_RENEGOTIATE_EXT 298 +# define SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT 277 +# define SSL_F_SSL_ADD_CLIENTHELLO_USE_SRTP_EXT 307 +# define SSL_F_SSL_ADD_DIR_CERT_SUBJECTS_TO_STACK 215 +# define SSL_F_SSL_ADD_FILE_CERT_SUBJECTS_TO_STACK 216 +# define SSL_F_SSL_ADD_SERVERHELLO_RENEGOTIATE_EXT 299 +# define SSL_F_SSL_ADD_SERVERHELLO_TLSEXT 278 +# define SSL_F_SSL_ADD_SERVERHELLO_USE_SRTP_EXT 308 +# define SSL_F_SSL_BAD_METHOD 160 +# define SSL_F_SSL_BUILD_CERT_CHAIN 332 +# define SSL_F_SSL_BYTES_TO_CIPHER_LIST 161 +# define SSL_F_SSL_CERT_DUP 221 +# define SSL_F_SSL_CERT_INST 222 +# define SSL_F_SSL_CERT_INSTANTIATE 214 +# define SSL_F_SSL_CERT_NEW 162 +# define SSL_F_SSL_CHECK_PRIVATE_KEY 163 +# define SSL_F_SSL_CHECK_SERVERHELLO_TLSEXT 280 +# define SSL_F_SSL_CHECK_SRVR_ECC_CERT_AND_ALG 279 +# define SSL_F_SSL_CIPHER_PROCESS_RULESTR 230 +# define SSL_F_SSL_CIPHER_STRENGTH_SORT 231 +# define SSL_F_SSL_CLEAR 164 +# define SSL_F_SSL_COMP_ADD_COMPRESSION_METHOD 165 +# define SSL_F_SSL_CONF_CMD 334 +# define SSL_F_SSL_CREATE_CIPHER_LIST 166 +# define SSL_F_SSL_CTRL 232 +# define SSL_F_SSL_CTX_CHECK_PRIVATE_KEY 168 +# define SSL_F_SSL_CTX_MAKE_PROFILES 309 +# define SSL_F_SSL_CTX_NEW 169 +# define SSL_F_SSL_CTX_SET_CIPHER_LIST 269 +# define SSL_F_SSL_CTX_SET_CLIENT_CERT_ENGINE 290 +# define SSL_F_SSL_CTX_SET_PURPOSE 226 +# define SSL_F_SSL_CTX_SET_SESSION_ID_CONTEXT 219 +# define SSL_F_SSL_CTX_SET_SSL_VERSION 170 +# define SSL_F_SSL_CTX_SET_TRUST 229 +# define SSL_F_SSL_CTX_USE_CERTIFICATE 171 +# define SSL_F_SSL_CTX_USE_CERTIFICATE_ASN1 172 +# define SSL_F_SSL_CTX_USE_CERTIFICATE_CHAIN_FILE 220 +# define SSL_F_SSL_CTX_USE_CERTIFICATE_FILE 173 +# define SSL_F_SSL_CTX_USE_PRIVATEKEY 174 +# define SSL_F_SSL_CTX_USE_PRIVATEKEY_ASN1 175 +# define SSL_F_SSL_CTX_USE_PRIVATEKEY_FILE 176 +# define SSL_F_SSL_CTX_USE_PSK_IDENTITY_HINT 272 +# define SSL_F_SSL_CTX_USE_RSAPRIVATEKEY 177 +# define SSL_F_SSL_CTX_USE_RSAPRIVATEKEY_ASN1 178 +# define SSL_F_SSL_CTX_USE_RSAPRIVATEKEY_FILE 179 +# define SSL_F_SSL_CTX_USE_SERVERINFO 336 +# define SSL_F_SSL_CTX_USE_SERVERINFO_FILE 337 +# define SSL_F_SSL_DO_HANDSHAKE 180 +# define SSL_F_SSL_GET_NEW_SESSION 181 +# define SSL_F_SSL_GET_PREV_SESSION 217 +# define SSL_F_SSL_GET_SERVER_CERT_INDEX 322 +# define SSL_F_SSL_GET_SERVER_SEND_CERT 182 +# define SSL_F_SSL_GET_SERVER_SEND_PKEY 317 +# define SSL_F_SSL_GET_SIGN_PKEY 183 +# define SSL_F_SSL_INIT_WBIO_BUFFER 184 +# define SSL_F_SSL_LOAD_CLIENT_CA_FILE 185 +# define SSL_F_SSL_NEW 186 +# define SSL_F_SSL_PARSE_CLIENTHELLO_RENEGOTIATE_EXT 300 +# define SSL_F_SSL_PARSE_CLIENTHELLO_TLSEXT 302 +# define SSL_F_SSL_PARSE_CLIENTHELLO_USE_SRTP_EXT 310 +# define SSL_F_SSL_PARSE_SERVERHELLO_RENEGOTIATE_EXT 301 +# define SSL_F_SSL_PARSE_SERVERHELLO_TLSEXT 303 +# define SSL_F_SSL_PARSE_SERVERHELLO_USE_SRTP_EXT 311 +# define SSL_F_SSL_PEEK 270 +# define SSL_F_SSL_PREPARE_CLIENTHELLO_TLSEXT 281 +# define SSL_F_SSL_PREPARE_SERVERHELLO_TLSEXT 282 +# define SSL_F_SSL_READ 223 +# define SSL_F_SSL_RSA_PRIVATE_DECRYPT 187 +# define SSL_F_SSL_RSA_PUBLIC_ENCRYPT 188 +# define SSL_F_SSL_SCAN_CLIENTHELLO_TLSEXT 320 +# define SSL_F_SSL_SCAN_SERVERHELLO_TLSEXT 321 +# define SSL_F_SSL_SESSION_DUP 348 +# define SSL_F_SSL_SESSION_NEW 189 +# define SSL_F_SSL_SESSION_PRINT_FP 190 +# define SSL_F_SSL_SESSION_SET1_ID_CONTEXT 312 +# define SSL_F_SSL_SESS_CERT_NEW 225 +# define SSL_F_SSL_SET_CERT 191 +# define SSL_F_SSL_SET_CIPHER_LIST 271 +# define SSL_F_SSL_SET_FD 192 +# define SSL_F_SSL_SET_PKEY 193 +# define SSL_F_SSL_SET_PURPOSE 227 +# define SSL_F_SSL_SET_RFD 194 +# define SSL_F_SSL_SET_SESSION 195 +# define SSL_F_SSL_SET_SESSION_ID_CONTEXT 218 +# define SSL_F_SSL_SET_SESSION_TICKET_EXT 294 +# define SSL_F_SSL_SET_TRUST 228 +# define SSL_F_SSL_SET_WFD 196 +# define SSL_F_SSL_SHUTDOWN 224 +# define SSL_F_SSL_SRP_CTX_INIT 313 +# define SSL_F_SSL_UNDEFINED_CONST_FUNCTION 243 +# define SSL_F_SSL_UNDEFINED_FUNCTION 197 +# define SSL_F_SSL_UNDEFINED_VOID_FUNCTION 244 +# define SSL_F_SSL_USE_CERTIFICATE 198 +# define SSL_F_SSL_USE_CERTIFICATE_ASN1 199 +# define SSL_F_SSL_USE_CERTIFICATE_FILE 200 +# define SSL_F_SSL_USE_PRIVATEKEY 201 +# define SSL_F_SSL_USE_PRIVATEKEY_ASN1 202 +# define SSL_F_SSL_USE_PRIVATEKEY_FILE 203 +# define SSL_F_SSL_USE_PSK_IDENTITY_HINT 273 +# define SSL_F_SSL_USE_RSAPRIVATEKEY 204 +# define SSL_F_SSL_USE_RSAPRIVATEKEY_ASN1 205 +# define SSL_F_SSL_USE_RSAPRIVATEKEY_FILE 206 +# define SSL_F_SSL_VERIFY_CERT_CHAIN 207 +# define SSL_F_SSL_WRITE 208 +# define SSL_F_TLS12_CHECK_PEER_SIGALG 333 +# define SSL_F_TLS1_CERT_VERIFY_MAC 286 +# define SSL_F_TLS1_CHANGE_CIPHER_STATE 209 +# define SSL_F_TLS1_CHECK_SERVERHELLO_TLSEXT 274 +# define SSL_F_TLS1_ENC 210 +# define SSL_F_TLS1_EXPORT_KEYING_MATERIAL 314 +# define SSL_F_TLS1_GET_CURVELIST 338 +# define SSL_F_TLS1_HEARTBEAT 315 +# define SSL_F_TLS1_PREPARE_CLIENTHELLO_TLSEXT 275 +# define SSL_F_TLS1_PREPARE_SERVERHELLO_TLSEXT 276 +# define SSL_F_TLS1_PRF 284 +# define SSL_F_TLS1_SETUP_KEY_BLOCK 211 +# define SSL_F_TLS1_SET_SERVER_SIGALGS 335 +# define SSL_F_WRITE_PENDING 212 + +/* Reason codes. */ +# define SSL_R_APP_DATA_IN_HANDSHAKE 100 +# define SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT 272 +# define SSL_R_BAD_ALERT_RECORD 101 +# define SSL_R_BAD_AUTHENTICATION_TYPE 102 +# define SSL_R_BAD_CHANGE_CIPHER_SPEC 103 +# define SSL_R_BAD_CHECKSUM 104 +# define SSL_R_BAD_DATA 390 +# define SSL_R_BAD_DATA_RETURNED_BY_CALLBACK 106 +# define SSL_R_BAD_DECOMPRESSION 107 +# define SSL_R_BAD_DH_G_LENGTH 108 +# define SSL_R_BAD_DH_G_VALUE 375 +# define SSL_R_BAD_DH_PUB_KEY_LENGTH 109 +# define SSL_R_BAD_DH_PUB_KEY_VALUE 393 +# define SSL_R_BAD_DH_P_LENGTH 110 +# define SSL_R_BAD_DH_P_VALUE 395 +# define SSL_R_BAD_DIGEST_LENGTH 111 +# define SSL_R_BAD_DSA_SIGNATURE 112 +# define SSL_R_BAD_ECC_CERT 304 +# define SSL_R_BAD_ECDSA_SIGNATURE 305 +# define SSL_R_BAD_ECPOINT 306 +# define SSL_R_BAD_HANDSHAKE_LENGTH 332 +# define SSL_R_BAD_HELLO_REQUEST 105 +# define SSL_R_BAD_LENGTH 271 +# define SSL_R_BAD_MAC_DECODE 113 +# define SSL_R_BAD_MAC_LENGTH 333 +# define SSL_R_BAD_MESSAGE_TYPE 114 +# define SSL_R_BAD_PACKET_LENGTH 115 +# define SSL_R_BAD_PROTOCOL_VERSION_NUMBER 116 +# define SSL_R_BAD_PSK_IDENTITY_HINT_LENGTH 316 +# define SSL_R_BAD_RESPONSE_ARGUMENT 117 +# define SSL_R_BAD_RSA_DECRYPT 118 +# define SSL_R_BAD_RSA_ENCRYPT 119 +# define SSL_R_BAD_RSA_E_LENGTH 120 +# define SSL_R_BAD_RSA_MODULUS_LENGTH 121 +# define SSL_R_BAD_RSA_SIGNATURE 122 +# define SSL_R_BAD_SIGNATURE 123 +# define SSL_R_BAD_SRP_A_LENGTH 347 +# define SSL_R_BAD_SRP_B_LENGTH 348 +# define SSL_R_BAD_SRP_G_LENGTH 349 +# define SSL_R_BAD_SRP_N_LENGTH 350 +# define SSL_R_BAD_SRP_PARAMETERS 371 +# define SSL_R_BAD_SRP_S_LENGTH 351 +# define SSL_R_BAD_SRTP_MKI_VALUE 352 +# define SSL_R_BAD_SRTP_PROTECTION_PROFILE_LIST 353 +# define SSL_R_BAD_SSL_FILETYPE 124 +# define SSL_R_BAD_SSL_SESSION_ID_LENGTH 125 +# define SSL_R_BAD_STATE 126 +# define SSL_R_BAD_VALUE 384 +# define SSL_R_BAD_WRITE_RETRY 127 +# define SSL_R_BIO_NOT_SET 128 +# define SSL_R_BLOCK_CIPHER_PAD_IS_WRONG 129 +# define SSL_R_BN_LIB 130 +# define SSL_R_CA_DN_LENGTH_MISMATCH 131 +# define SSL_R_CA_DN_TOO_LONG 132 +# define SSL_R_CCS_RECEIVED_EARLY 133 +# define SSL_R_CERTIFICATE_VERIFY_FAILED 134 +# define SSL_R_CERT_CB_ERROR 377 +# define SSL_R_CERT_LENGTH_MISMATCH 135 +# define SSL_R_CHALLENGE_IS_DIFFERENT 136 +# define SSL_R_CIPHER_CODE_WRONG_LENGTH 137 +# define SSL_R_CIPHER_OR_HASH_UNAVAILABLE 138 +# define SSL_R_CIPHER_TABLE_SRC_ERROR 139 +# define SSL_R_CLIENTHELLO_TLSEXT 226 +# define SSL_R_COMPRESSED_LENGTH_TOO_LONG 140 +# define SSL_R_COMPRESSION_DISABLED 343 +# define SSL_R_COMPRESSION_FAILURE 141 +# define SSL_R_COMPRESSION_ID_NOT_WITHIN_PRIVATE_RANGE 307 +# define SSL_R_COMPRESSION_LIBRARY_ERROR 142 +# define SSL_R_CONNECTION_ID_IS_DIFFERENT 143 +# define SSL_R_CONNECTION_TYPE_NOT_SET 144 +# define SSL_R_COOKIE_MISMATCH 308 +# define SSL_R_DATA_BETWEEN_CCS_AND_FINISHED 145 +# define SSL_R_DATA_LENGTH_TOO_LONG 146 +# define SSL_R_DECRYPTION_FAILED 147 +# define SSL_R_DECRYPTION_FAILED_OR_BAD_RECORD_MAC 281 +# define SSL_R_DH_KEY_TOO_SMALL 372 +# define SSL_R_DH_PUBLIC_VALUE_LENGTH_IS_WRONG 148 +# define SSL_R_DIGEST_CHECK_FAILED 149 +# define SSL_R_DTLS_MESSAGE_TOO_BIG 334 +# define SSL_R_DUPLICATE_COMPRESSION_ID 309 +# define SSL_R_ECC_CERT_NOT_FOR_KEY_AGREEMENT 317 +# define SSL_R_ECC_CERT_NOT_FOR_SIGNING 318 +# define SSL_R_ECC_CERT_SHOULD_HAVE_RSA_SIGNATURE 322 +# define SSL_R_ECC_CERT_SHOULD_HAVE_SHA1_SIGNATURE 323 +# define SSL_R_ECDH_REQUIRED_FOR_SUITEB_MODE 374 +# define SSL_R_ECGROUP_TOO_LARGE_FOR_CIPHER 310 +# define SSL_R_EMPTY_SRTP_PROTECTION_PROFILE_LIST 354 +# define SSL_R_ENCRYPTED_LENGTH_TOO_LONG 150 +# define SSL_R_ERROR_GENERATING_TMP_RSA_KEY 282 +# define SSL_R_ERROR_IN_RECEIVED_CIPHER_LIST 151 +# define SSL_R_EXCESSIVE_MESSAGE_SIZE 152 +# define SSL_R_EXTRA_DATA_IN_MESSAGE 153 +# define SSL_R_GOT_A_FIN_BEFORE_A_CCS 154 +# define SSL_R_GOT_NEXT_PROTO_BEFORE_A_CCS 355 +# define SSL_R_GOT_NEXT_PROTO_WITHOUT_EXTENSION 356 +# define SSL_R_HTTPS_PROXY_REQUEST 155 +# define SSL_R_HTTP_REQUEST 156 +# define SSL_R_ILLEGAL_PADDING 283 +# define SSL_R_ILLEGAL_SUITEB_DIGEST 380 +# define SSL_R_INAPPROPRIATE_FALLBACK 373 +# define SSL_R_INCONSISTENT_COMPRESSION 340 +# define SSL_R_INVALID_CHALLENGE_LENGTH 158 +# define SSL_R_INVALID_COMMAND 280 +# define SSL_R_INVALID_COMPRESSION_ALGORITHM 341 +# define SSL_R_INVALID_NULL_CMD_NAME 385 +# define SSL_R_INVALID_PURPOSE 278 +# define SSL_R_INVALID_SERVERINFO_DATA 388 +# define SSL_R_INVALID_SRP_USERNAME 357 +# define SSL_R_INVALID_STATUS_RESPONSE 328 +# define SSL_R_INVALID_TICKET_KEYS_LENGTH 325 +# define SSL_R_INVALID_TRUST 279 +# define SSL_R_KEY_ARG_TOO_LONG 284 +# define SSL_R_KRB5 285 +# define SSL_R_KRB5_C_CC_PRINC 286 +# define SSL_R_KRB5_C_GET_CRED 287 +# define SSL_R_KRB5_C_INIT 288 +# define SSL_R_KRB5_C_MK_REQ 289 +# define SSL_R_KRB5_S_BAD_TICKET 290 +# define SSL_R_KRB5_S_INIT 291 +# define SSL_R_KRB5_S_RD_REQ 292 +# define SSL_R_KRB5_S_TKT_EXPIRED 293 +# define SSL_R_KRB5_S_TKT_NYV 294 +# define SSL_R_KRB5_S_TKT_SKEW 295 +# define SSL_R_LENGTH_MISMATCH 159 +# define SSL_R_LENGTH_TOO_SHORT 160 +# define SSL_R_LIBRARY_BUG 274 +# define SSL_R_LIBRARY_HAS_NO_CIPHERS 161 +# define SSL_R_MESSAGE_TOO_LONG 296 +# define SSL_R_MISSING_DH_DSA_CERT 162 +# define SSL_R_MISSING_DH_KEY 163 +# define SSL_R_MISSING_DH_RSA_CERT 164 +# define SSL_R_MISSING_DSA_SIGNING_CERT 165 +# define SSL_R_MISSING_ECDH_CERT 382 +# define SSL_R_MISSING_ECDSA_SIGNING_CERT 381 +# define SSL_R_MISSING_EXPORT_TMP_DH_KEY 166 +# define SSL_R_MISSING_EXPORT_TMP_RSA_KEY 167 +# define SSL_R_MISSING_RSA_CERTIFICATE 168 +# define SSL_R_MISSING_RSA_ENCRYPTING_CERT 169 +# define SSL_R_MISSING_RSA_SIGNING_CERT 170 +# define SSL_R_MISSING_SRP_PARAM 358 +# define SSL_R_MISSING_TMP_DH_KEY 171 +# define SSL_R_MISSING_TMP_ECDH_KEY 311 +# define SSL_R_MISSING_TMP_RSA_KEY 172 +# define SSL_R_MISSING_TMP_RSA_PKEY 173 +# define SSL_R_MISSING_VERIFY_MESSAGE 174 +# define SSL_R_MULTIPLE_SGC_RESTARTS 346 +# define SSL_R_NON_SSLV2_INITIAL_PACKET 175 +# define SSL_R_NO_CERTIFICATES_RETURNED 176 +# define SSL_R_NO_CERTIFICATE_ASSIGNED 177 +# define SSL_R_NO_CERTIFICATE_RETURNED 178 +# define SSL_R_NO_CERTIFICATE_SET 179 +# define SSL_R_NO_CERTIFICATE_SPECIFIED 180 +# define SSL_R_NO_CIPHERS_AVAILABLE 181 +# define SSL_R_NO_CIPHERS_PASSED 182 +# define SSL_R_NO_CIPHERS_SPECIFIED 183 +# define SSL_R_NO_CIPHER_LIST 184 +# define SSL_R_NO_CIPHER_MATCH 185 +# define SSL_R_NO_CLIENT_CERT_METHOD 331 +# define SSL_R_NO_CLIENT_CERT_RECEIVED 186 +# define SSL_R_NO_COMPRESSION_SPECIFIED 187 +# define SSL_R_NO_GOST_CERTIFICATE_SENT_BY_PEER 330 +# define SSL_R_NO_METHOD_SPECIFIED 188 +# define SSL_R_NO_PEM_EXTENSIONS 389 +# define SSL_R_NO_PRIVATEKEY 189 +# define SSL_R_NO_PRIVATE_KEY_ASSIGNED 190 +# define SSL_R_NO_PROTOCOLS_AVAILABLE 191 +# define SSL_R_NO_PUBLICKEY 192 +# define SSL_R_NO_RENEGOTIATION 339 +# define SSL_R_NO_REQUIRED_DIGEST 324 +# define SSL_R_NO_SHARED_CIPHER 193 +# define SSL_R_NO_SHARED_SIGATURE_ALGORITHMS 376 +# define SSL_R_NO_SRTP_PROFILES 359 +# define SSL_R_NO_VERIFY_CALLBACK 194 +# define SSL_R_NULL_SSL_CTX 195 +# define SSL_R_NULL_SSL_METHOD_PASSED 196 +# define SSL_R_OLD_SESSION_CIPHER_NOT_RETURNED 197 +# define SSL_R_OLD_SESSION_COMPRESSION_ALGORITHM_NOT_RETURNED 344 +# define SSL_R_ONLY_DTLS_1_2_ALLOWED_IN_SUITEB_MODE 387 +# define SSL_R_ONLY_TLS_1_2_ALLOWED_IN_SUITEB_MODE 379 +# define SSL_R_ONLY_TLS_ALLOWED_IN_FIPS_MODE 297 +# define SSL_R_OPAQUE_PRF_INPUT_TOO_LONG 327 +# define SSL_R_PACKET_LENGTH_TOO_LONG 198 +# define SSL_R_PARSE_TLSEXT 227 +# define SSL_R_PATH_TOO_LONG 270 +# define SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE 199 +# define SSL_R_PEER_ERROR 200 +# define SSL_R_PEER_ERROR_CERTIFICATE 201 +# define SSL_R_PEER_ERROR_NO_CERTIFICATE 202 +# define SSL_R_PEER_ERROR_NO_CIPHER 203 +# define SSL_R_PEER_ERROR_UNSUPPORTED_CERTIFICATE_TYPE 204 +# define SSL_R_PEM_NAME_BAD_PREFIX 391 +# define SSL_R_PEM_NAME_TOO_SHORT 392 +# define SSL_R_PRE_MAC_LENGTH_TOO_LONG 205 +# define SSL_R_PROBLEMS_MAPPING_CIPHER_FUNCTIONS 206 +# define SSL_R_PROTOCOL_IS_SHUTDOWN 207 +# define SSL_R_PSK_IDENTITY_NOT_FOUND 223 +# define SSL_R_PSK_NO_CLIENT_CB 224 +# define SSL_R_PSK_NO_SERVER_CB 225 +# define SSL_R_PUBLIC_KEY_ENCRYPT_ERROR 208 +# define SSL_R_PUBLIC_KEY_IS_NOT_RSA 209 +# define SSL_R_PUBLIC_KEY_NOT_RSA 210 +# define SSL_R_READ_BIO_NOT_SET 211 +# define SSL_R_READ_TIMEOUT_EXPIRED 312 +# define SSL_R_READ_WRONG_PACKET_TYPE 212 +# define SSL_R_RECORD_LENGTH_MISMATCH 213 +# define SSL_R_RECORD_TOO_LARGE 214 +# define SSL_R_RECORD_TOO_SMALL 298 +# define SSL_R_RENEGOTIATE_EXT_TOO_LONG 335 +# define SSL_R_RENEGOTIATION_ENCODING_ERR 336 +# define SSL_R_RENEGOTIATION_MISMATCH 337 +# define SSL_R_REQUIRED_CIPHER_MISSING 215 +# define SSL_R_REQUIRED_COMPRESSSION_ALGORITHM_MISSING 342 +# define SSL_R_REUSE_CERT_LENGTH_NOT_ZERO 216 +# define SSL_R_REUSE_CERT_TYPE_NOT_ZERO 217 +# define SSL_R_REUSE_CIPHER_LIST_NOT_ZERO 218 +# define SSL_R_SCSV_RECEIVED_WHEN_RENEGOTIATING 345 +# define SSL_R_SERVERHELLO_TLSEXT 275 +# define SSL_R_SESSION_ID_CONTEXT_UNINITIALIZED 277 +# define SSL_R_SHORT_READ 219 +# define SSL_R_SHUTDOWN_WHILE_IN_INIT 407 +# define SSL_R_SIGNATURE_ALGORITHMS_ERROR 360 +# define SSL_R_SIGNATURE_FOR_NON_SIGNING_CERTIFICATE 220 +# define SSL_R_SRP_A_CALC 361 +# define SSL_R_SRTP_COULD_NOT_ALLOCATE_PROFILES 362 +# define SSL_R_SRTP_PROTECTION_PROFILE_LIST_TOO_LONG 363 +# define SSL_R_SRTP_UNKNOWN_PROTECTION_PROFILE 364 +# define SSL_R_SSL23_DOING_SESSION_ID_REUSE 221 +# define SSL_R_SSL2_CONNECTION_ID_TOO_LONG 299 +# define SSL_R_SSL3_EXT_INVALID_ECPOINTFORMAT 321 +# define SSL_R_SSL3_EXT_INVALID_SERVERNAME 319 +# define SSL_R_SSL3_EXT_INVALID_SERVERNAME_TYPE 320 +# define SSL_R_SSL3_SESSION_ID_TOO_LONG 300 +# define SSL_R_SSL3_SESSION_ID_TOO_SHORT 222 +# define SSL_R_SSLV3_ALERT_BAD_CERTIFICATE 1042 +# define SSL_R_SSLV3_ALERT_BAD_RECORD_MAC 1020 +# define SSL_R_SSLV3_ALERT_CERTIFICATE_EXPIRED 1045 +# define SSL_R_SSLV3_ALERT_CERTIFICATE_REVOKED 1044 +# define SSL_R_SSLV3_ALERT_CERTIFICATE_UNKNOWN 1046 +# define SSL_R_SSLV3_ALERT_DECOMPRESSION_FAILURE 1030 +# define SSL_R_SSLV3_ALERT_HANDSHAKE_FAILURE 1040 +# define SSL_R_SSLV3_ALERT_ILLEGAL_PARAMETER 1047 +# define SSL_R_SSLV3_ALERT_NO_CERTIFICATE 1041 +# define SSL_R_SSLV3_ALERT_UNEXPECTED_MESSAGE 1010 +# define SSL_R_SSLV3_ALERT_UNSUPPORTED_CERTIFICATE 1043 +# define SSL_R_SSL_CTX_HAS_NO_DEFAULT_SSL_VERSION 228 +# define SSL_R_SSL_HANDSHAKE_FAILURE 229 +# define SSL_R_SSL_LIBRARY_HAS_NO_CIPHERS 230 +# define SSL_R_SSL_SESSION_ID_CALLBACK_FAILED 301 +# define SSL_R_SSL_SESSION_ID_CONFLICT 302 +# define SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG 273 +# define SSL_R_SSL_SESSION_ID_HAS_BAD_LENGTH 303 +# define SSL_R_SSL_SESSION_ID_IS_DIFFERENT 231 +# define SSL_R_TLSV1_ALERT_ACCESS_DENIED 1049 +# define SSL_R_TLSV1_ALERT_DECODE_ERROR 1050 +# define SSL_R_TLSV1_ALERT_DECRYPTION_FAILED 1021 +# define SSL_R_TLSV1_ALERT_DECRYPT_ERROR 1051 +# define SSL_R_TLSV1_ALERT_EXPORT_RESTRICTION 1060 +# define SSL_R_TLSV1_ALERT_INAPPROPRIATE_FALLBACK 1086 +# define SSL_R_TLSV1_ALERT_INSUFFICIENT_SECURITY 1071 +# define SSL_R_TLSV1_ALERT_INTERNAL_ERROR 1080 +# define SSL_R_TLSV1_ALERT_NO_RENEGOTIATION 1100 +# define SSL_R_TLSV1_ALERT_PROTOCOL_VERSION 1070 +# define SSL_R_TLSV1_ALERT_RECORD_OVERFLOW 1022 +# define SSL_R_TLSV1_ALERT_UNKNOWN_CA 1048 +# define SSL_R_TLSV1_ALERT_USER_CANCELLED 1090 +# define SSL_R_TLSV1_BAD_CERTIFICATE_HASH_VALUE 1114 +# define SSL_R_TLSV1_BAD_CERTIFICATE_STATUS_RESPONSE 1113 +# define SSL_R_TLSV1_CERTIFICATE_UNOBTAINABLE 1111 +# define SSL_R_TLSV1_UNRECOGNIZED_NAME 1112 +# define SSL_R_TLSV1_UNSUPPORTED_EXTENSION 1110 +# define SSL_R_TLS_CLIENT_CERT_REQ_WITH_ANON_CIPHER 232 +# define SSL_R_TLS_HEARTBEAT_PEER_DOESNT_ACCEPT 365 +# define SSL_R_TLS_HEARTBEAT_PENDING 366 +# define SSL_R_TLS_ILLEGAL_EXPORTER_LABEL 367 +# define SSL_R_TLS_INVALID_ECPOINTFORMAT_LIST 157 +# define SSL_R_TLS_PEER_DID_NOT_RESPOND_WITH_CERTIFICATE_LIST 233 +# define SSL_R_TLS_RSA_ENCRYPTED_VALUE_LENGTH_IS_WRONG 234 +# define SSL_R_TOO_MANY_WARN_ALERTS 409 +# define SSL_R_TRIED_TO_USE_UNSUPPORTED_CIPHER 235 +# define SSL_R_UNABLE_TO_DECODE_DH_CERTS 236 +# define SSL_R_UNABLE_TO_DECODE_ECDH_CERTS 313 +# define SSL_R_UNABLE_TO_EXTRACT_PUBLIC_KEY 237 +# define SSL_R_UNABLE_TO_FIND_DH_PARAMETERS 238 +# define SSL_R_UNABLE_TO_FIND_ECDH_PARAMETERS 314 +# define SSL_R_UNABLE_TO_FIND_PUBLIC_KEY_PARAMETERS 239 +# define SSL_R_UNABLE_TO_FIND_SSL_METHOD 240 +# define SSL_R_UNABLE_TO_LOAD_SSL2_MD5_ROUTINES 241 +# define SSL_R_UNABLE_TO_LOAD_SSL3_MD5_ROUTINES 242 +# define SSL_R_UNABLE_TO_LOAD_SSL3_SHA1_ROUTINES 243 +# define SSL_R_UNEXPECTED_MESSAGE 244 +# define SSL_R_UNEXPECTED_RECORD 245 +# define SSL_R_UNINITIALIZED 276 +# define SSL_R_UNKNOWN_ALERT_TYPE 246 +# define SSL_R_UNKNOWN_CERTIFICATE_TYPE 247 +# define SSL_R_UNKNOWN_CIPHER_RETURNED 248 +# define SSL_R_UNKNOWN_CIPHER_TYPE 249 +# define SSL_R_UNKNOWN_CMD_NAME 386 +# define SSL_R_UNKNOWN_DIGEST 368 +# define SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE 250 +# define SSL_R_UNKNOWN_PKEY_TYPE 251 +# define SSL_R_UNKNOWN_PROTOCOL 252 +# define SSL_R_UNKNOWN_REMOTE_ERROR_TYPE 253 +# define SSL_R_UNKNOWN_SSL_VERSION 254 +# define SSL_R_UNKNOWN_STATE 255 +# define SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED 338 +# define SSL_R_UNSUPPORTED_CIPHER 256 +# define SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM 257 +# define SSL_R_UNSUPPORTED_DIGEST_TYPE 326 +# define SSL_R_UNSUPPORTED_ELLIPTIC_CURVE 315 +# define SSL_R_UNSUPPORTED_PROTOCOL 258 +# define SSL_R_UNSUPPORTED_SSL_VERSION 259 +# define SSL_R_UNSUPPORTED_STATUS_TYPE 329 +# define SSL_R_USE_SRTP_NOT_NEGOTIATED 369 +# define SSL_R_WRITE_BIO_NOT_SET 260 +# define SSL_R_WRONG_CERTIFICATE_TYPE 383 +# define SSL_R_WRONG_CIPHER_RETURNED 261 +# define SSL_R_WRONG_CURVE 378 +# define SSL_R_WRONG_MESSAGE_TYPE 262 +# define SSL_R_WRONG_NUMBER_OF_KEY_BITS 263 +# define SSL_R_WRONG_SIGNATURE_LENGTH 264 +# define SSL_R_WRONG_SIGNATURE_SIZE 265 +# define SSL_R_WRONG_SIGNATURE_TYPE 370 +# define SSL_R_WRONG_SSL_VERSION 266 +# define SSL_R_WRONG_VERSION_NUMBER 267 +# define SSL_R_X509_LIB 268 +# define SSL_R_X509_VERIFICATION_SETUP_PROBLEMS 269 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/ssl2.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/ssl2.h new file mode 100644 index 0000000..03c7dd8 --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/ssl2.h @@ -0,0 +1,265 @@ +/* ssl/ssl2.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_SSL2_H +# define HEADER_SSL2_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Protocol Version Codes */ +# define SSL2_VERSION 0x0002 +# define SSL2_VERSION_MAJOR 0x00 +# define SSL2_VERSION_MINOR 0x02 +/* #define SSL2_CLIENT_VERSION 0x0002 */ +/* #define SSL2_SERVER_VERSION 0x0002 */ + +/* Protocol Message Codes */ +# define SSL2_MT_ERROR 0 +# define SSL2_MT_CLIENT_HELLO 1 +# define SSL2_MT_CLIENT_MASTER_KEY 2 +# define SSL2_MT_CLIENT_FINISHED 3 +# define SSL2_MT_SERVER_HELLO 4 +# define SSL2_MT_SERVER_VERIFY 5 +# define SSL2_MT_SERVER_FINISHED 6 +# define SSL2_MT_REQUEST_CERTIFICATE 7 +# define SSL2_MT_CLIENT_CERTIFICATE 8 + +/* Error Message Codes */ +# define SSL2_PE_UNDEFINED_ERROR 0x0000 +# define SSL2_PE_NO_CIPHER 0x0001 +# define SSL2_PE_NO_CERTIFICATE 0x0002 +# define SSL2_PE_BAD_CERTIFICATE 0x0004 +# define SSL2_PE_UNSUPPORTED_CERTIFICATE_TYPE 0x0006 + +/* Cipher Kind Values */ +# define SSL2_CK_NULL_WITH_MD5 0x02000000/* v3 */ +# define SSL2_CK_RC4_128_WITH_MD5 0x02010080 +# define SSL2_CK_RC4_128_EXPORT40_WITH_MD5 0x02020080 +# define SSL2_CK_RC2_128_CBC_WITH_MD5 0x02030080 +# define SSL2_CK_RC2_128_CBC_EXPORT40_WITH_MD5 0x02040080 +# define SSL2_CK_IDEA_128_CBC_WITH_MD5 0x02050080 +# define SSL2_CK_DES_64_CBC_WITH_MD5 0x02060040 +# define SSL2_CK_DES_64_CBC_WITH_SHA 0x02060140/* v3 */ +# define SSL2_CK_DES_192_EDE3_CBC_WITH_MD5 0x020700c0 +# define SSL2_CK_DES_192_EDE3_CBC_WITH_SHA 0x020701c0/* v3 */ +# define SSL2_CK_RC4_64_WITH_MD5 0x02080080/* MS hack */ + +# define SSL2_CK_DES_64_CFB64_WITH_MD5_1 0x02ff0800/* SSLeay */ +# define SSL2_CK_NULL 0x02ff0810/* SSLeay */ + +# define SSL2_TXT_DES_64_CFB64_WITH_MD5_1 "DES-CFB-M1" +# define SSL2_TXT_NULL_WITH_MD5 "NULL-MD5" +# define SSL2_TXT_RC4_128_WITH_MD5 "RC4-MD5" +# define SSL2_TXT_RC4_128_EXPORT40_WITH_MD5 "EXP-RC4-MD5" +# define SSL2_TXT_RC2_128_CBC_WITH_MD5 "RC2-CBC-MD5" +# define SSL2_TXT_RC2_128_CBC_EXPORT40_WITH_MD5 "EXP-RC2-CBC-MD5" +# define SSL2_TXT_IDEA_128_CBC_WITH_MD5 "IDEA-CBC-MD5" +# define SSL2_TXT_DES_64_CBC_WITH_MD5 "DES-CBC-MD5" +# define SSL2_TXT_DES_64_CBC_WITH_SHA "DES-CBC-SHA" +# define SSL2_TXT_DES_192_EDE3_CBC_WITH_MD5 "DES-CBC3-MD5" +# define SSL2_TXT_DES_192_EDE3_CBC_WITH_SHA "DES-CBC3-SHA" +# define SSL2_TXT_RC4_64_WITH_MD5 "RC4-64-MD5" + +# define SSL2_TXT_NULL "NULL" + +/* Flags for the SSL_CIPHER.algorithm2 field */ +# define SSL2_CF_5_BYTE_ENC 0x01 +# define SSL2_CF_8_BYTE_ENC 0x02 + +/* Certificate Type Codes */ +# define SSL2_CT_X509_CERTIFICATE 0x01 + +/* Authentication Type Code */ +# define SSL2_AT_MD5_WITH_RSA_ENCRYPTION 0x01 + +# define SSL2_MAX_SSL_SESSION_ID_LENGTH 32 + +/* Upper/Lower Bounds */ +# define SSL2_MAX_MASTER_KEY_LENGTH_IN_BITS 256 +# ifdef OPENSSL_SYS_MPE +# define SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER 29998u +# else +# define SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER 32767u + /* 2^15-1 */ +# endif +# define SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER 16383/* 2^14-1 */ + +# define SSL2_CHALLENGE_LENGTH 16 +/* + * #define SSL2_CHALLENGE_LENGTH 32 + */ +# define SSL2_MIN_CHALLENGE_LENGTH 16 +# define SSL2_MAX_CHALLENGE_LENGTH 32 +# define SSL2_CONNECTION_ID_LENGTH 16 +# define SSL2_MAX_CONNECTION_ID_LENGTH 16 +# define SSL2_SSL_SESSION_ID_LENGTH 16 +# define SSL2_MAX_CERT_CHALLENGE_LENGTH 32 +# define SSL2_MIN_CERT_CHALLENGE_LENGTH 16 +# define SSL2_MAX_KEY_MATERIAL_LENGTH 24 + +# ifndef HEADER_SSL_LOCL_H +# define CERT char +# endif + +# ifndef OPENSSL_NO_SSL_INTERN + +typedef struct ssl2_state_st { + int three_byte_header; + int clear_text; /* clear text */ + int escape; /* not used in SSLv2 */ + int ssl2_rollback; /* used if SSLv23 rolled back to SSLv2 */ + /* + * non-blocking io info, used to make sure the same args were passwd + */ + unsigned int wnum; /* number of bytes sent so far */ + int wpend_tot; + const unsigned char *wpend_buf; + int wpend_off; /* offset to data to write */ + int wpend_len; /* number of bytes passwd to write */ + int wpend_ret; /* number of bytes to return to caller */ + /* buffer raw data */ + int rbuf_left; + int rbuf_offs; + unsigned char *rbuf; + unsigned char *wbuf; + unsigned char *write_ptr; /* used to point to the start due to 2/3 byte + * header. */ + unsigned int padding; + unsigned int rlength; /* passed to ssl2_enc */ + int ract_data_length; /* Set when things are encrypted. */ + unsigned int wlength; /* passed to ssl2_enc */ + int wact_data_length; /* Set when things are decrypted. */ + unsigned char *ract_data; + unsigned char *wact_data; + unsigned char *mac_data; + unsigned char *read_key; + unsigned char *write_key; + /* Stuff specifically to do with this SSL session */ + unsigned int challenge_length; + unsigned char challenge[SSL2_MAX_CHALLENGE_LENGTH]; + unsigned int conn_id_length; + unsigned char conn_id[SSL2_MAX_CONNECTION_ID_LENGTH]; + unsigned int key_material_length; + unsigned char key_material[SSL2_MAX_KEY_MATERIAL_LENGTH * 2]; + unsigned long read_sequence; + unsigned long write_sequence; + struct { + unsigned int conn_id_length; + unsigned int cert_type; + unsigned int cert_length; + unsigned int csl; + unsigned int clear; + unsigned int enc; + unsigned char ccl[SSL2_MAX_CERT_CHALLENGE_LENGTH]; + unsigned int cipher_spec_length; + unsigned int session_id_length; + unsigned int clen; + unsigned int rlen; + } tmp; +} SSL2_STATE; + +# endif + +/* SSLv2 */ +/* client */ +# define SSL2_ST_SEND_CLIENT_HELLO_A (0x10|SSL_ST_CONNECT) +# define SSL2_ST_SEND_CLIENT_HELLO_B (0x11|SSL_ST_CONNECT) +# define SSL2_ST_GET_SERVER_HELLO_A (0x20|SSL_ST_CONNECT) +# define SSL2_ST_GET_SERVER_HELLO_B (0x21|SSL_ST_CONNECT) +# define SSL2_ST_SEND_CLIENT_MASTER_KEY_A (0x30|SSL_ST_CONNECT) +# define SSL2_ST_SEND_CLIENT_MASTER_KEY_B (0x31|SSL_ST_CONNECT) +# define SSL2_ST_SEND_CLIENT_FINISHED_A (0x40|SSL_ST_CONNECT) +# define SSL2_ST_SEND_CLIENT_FINISHED_B (0x41|SSL_ST_CONNECT) +# define SSL2_ST_SEND_CLIENT_CERTIFICATE_A (0x50|SSL_ST_CONNECT) +# define SSL2_ST_SEND_CLIENT_CERTIFICATE_B (0x51|SSL_ST_CONNECT) +# define SSL2_ST_SEND_CLIENT_CERTIFICATE_C (0x52|SSL_ST_CONNECT) +# define SSL2_ST_SEND_CLIENT_CERTIFICATE_D (0x53|SSL_ST_CONNECT) +# define SSL2_ST_GET_SERVER_VERIFY_A (0x60|SSL_ST_CONNECT) +# define SSL2_ST_GET_SERVER_VERIFY_B (0x61|SSL_ST_CONNECT) +# define SSL2_ST_GET_SERVER_FINISHED_A (0x70|SSL_ST_CONNECT) +# define SSL2_ST_GET_SERVER_FINISHED_B (0x71|SSL_ST_CONNECT) +# define SSL2_ST_CLIENT_START_ENCRYPTION (0x80|SSL_ST_CONNECT) +# define SSL2_ST_X509_GET_CLIENT_CERTIFICATE (0x90|SSL_ST_CONNECT) +/* server */ +# define SSL2_ST_GET_CLIENT_HELLO_A (0x10|SSL_ST_ACCEPT) +# define SSL2_ST_GET_CLIENT_HELLO_B (0x11|SSL_ST_ACCEPT) +# define SSL2_ST_GET_CLIENT_HELLO_C (0x12|SSL_ST_ACCEPT) +# define SSL2_ST_SEND_SERVER_HELLO_A (0x20|SSL_ST_ACCEPT) +# define SSL2_ST_SEND_SERVER_HELLO_B (0x21|SSL_ST_ACCEPT) +# define SSL2_ST_GET_CLIENT_MASTER_KEY_A (0x30|SSL_ST_ACCEPT) +# define SSL2_ST_GET_CLIENT_MASTER_KEY_B (0x31|SSL_ST_ACCEPT) +# define SSL2_ST_SEND_SERVER_VERIFY_A (0x40|SSL_ST_ACCEPT) +# define SSL2_ST_SEND_SERVER_VERIFY_B (0x41|SSL_ST_ACCEPT) +# define SSL2_ST_SEND_SERVER_VERIFY_C (0x42|SSL_ST_ACCEPT) +# define SSL2_ST_GET_CLIENT_FINISHED_A (0x50|SSL_ST_ACCEPT) +# define SSL2_ST_GET_CLIENT_FINISHED_B (0x51|SSL_ST_ACCEPT) +# define SSL2_ST_SEND_SERVER_FINISHED_A (0x60|SSL_ST_ACCEPT) +# define SSL2_ST_SEND_SERVER_FINISHED_B (0x61|SSL_ST_ACCEPT) +# define SSL2_ST_SEND_REQUEST_CERTIFICATE_A (0x70|SSL_ST_ACCEPT) +# define SSL2_ST_SEND_REQUEST_CERTIFICATE_B (0x71|SSL_ST_ACCEPT) +# define SSL2_ST_SEND_REQUEST_CERTIFICATE_C (0x72|SSL_ST_ACCEPT) +# define SSL2_ST_SEND_REQUEST_CERTIFICATE_D (0x73|SSL_ST_ACCEPT) +# define SSL2_ST_SERVER_START_ENCRYPTION (0x80|SSL_ST_ACCEPT) +# define SSL2_ST_X509_GET_SERVER_CERTIFICATE (0x90|SSL_ST_ACCEPT) + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/ssl23.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/ssl23.h new file mode 100644 index 0000000..9de4685 --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/ssl23.h @@ -0,0 +1,84 @@ +/* ssl/ssl23.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_SSL23_H +# define HEADER_SSL23_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * client + */ +/* write to server */ +# define SSL23_ST_CW_CLNT_HELLO_A (0x210|SSL_ST_CONNECT) +# define SSL23_ST_CW_CLNT_HELLO_B (0x211|SSL_ST_CONNECT) +/* read from server */ +# define SSL23_ST_CR_SRVR_HELLO_A (0x220|SSL_ST_CONNECT) +# define SSL23_ST_CR_SRVR_HELLO_B (0x221|SSL_ST_CONNECT) + +/* server */ +/* read from client */ +# define SSL23_ST_SR_CLNT_HELLO_A (0x210|SSL_ST_ACCEPT) +# define SSL23_ST_SR_CLNT_HELLO_B (0x211|SSL_ST_ACCEPT) + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/ssl3.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/ssl3.h new file mode 100644 index 0000000..e681d50 --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/ssl3.h @@ -0,0 +1,774 @@ +/* ssl/ssl3.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ +/* ==================================================================== + * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * ECC cipher suite support in OpenSSL originally developed by + * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project. + */ + +#ifndef HEADER_SSL3_H +# define HEADER_SSL3_H + +# ifndef OPENSSL_NO_COMP +# include +# endif +# include +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Signalling cipher suite value from RFC 5746 + * (TLS_EMPTY_RENEGOTIATION_INFO_SCSV) + */ +# define SSL3_CK_SCSV 0x030000FF + +/* + * Signalling cipher suite value from draft-ietf-tls-downgrade-scsv-00 + * (TLS_FALLBACK_SCSV) + */ +# define SSL3_CK_FALLBACK_SCSV 0x03005600 + +# define SSL3_CK_RSA_NULL_MD5 0x03000001 +# define SSL3_CK_RSA_NULL_SHA 0x03000002 +# define SSL3_CK_RSA_RC4_40_MD5 0x03000003 +# define SSL3_CK_RSA_RC4_128_MD5 0x03000004 +# define SSL3_CK_RSA_RC4_128_SHA 0x03000005 +# define SSL3_CK_RSA_RC2_40_MD5 0x03000006 +# define SSL3_CK_RSA_IDEA_128_SHA 0x03000007 +# define SSL3_CK_RSA_DES_40_CBC_SHA 0x03000008 +# define SSL3_CK_RSA_DES_64_CBC_SHA 0x03000009 +# define SSL3_CK_RSA_DES_192_CBC3_SHA 0x0300000A + +# define SSL3_CK_DH_DSS_DES_40_CBC_SHA 0x0300000B +# define SSL3_CK_DH_DSS_DES_64_CBC_SHA 0x0300000C +# define SSL3_CK_DH_DSS_DES_192_CBC3_SHA 0x0300000D +# define SSL3_CK_DH_RSA_DES_40_CBC_SHA 0x0300000E +# define SSL3_CK_DH_RSA_DES_64_CBC_SHA 0x0300000F +# define SSL3_CK_DH_RSA_DES_192_CBC3_SHA 0x03000010 + +# define SSL3_CK_EDH_DSS_DES_40_CBC_SHA 0x03000011 +# define SSL3_CK_DHE_DSS_DES_40_CBC_SHA SSL3_CK_EDH_DSS_DES_40_CBC_SHA +# define SSL3_CK_EDH_DSS_DES_64_CBC_SHA 0x03000012 +# define SSL3_CK_DHE_DSS_DES_64_CBC_SHA SSL3_CK_EDH_DSS_DES_64_CBC_SHA +# define SSL3_CK_EDH_DSS_DES_192_CBC3_SHA 0x03000013 +# define SSL3_CK_DHE_DSS_DES_192_CBC3_SHA SSL3_CK_EDH_DSS_DES_192_CBC3_SHA +# define SSL3_CK_EDH_RSA_DES_40_CBC_SHA 0x03000014 +# define SSL3_CK_DHE_RSA_DES_40_CBC_SHA SSL3_CK_EDH_RSA_DES_40_CBC_SHA +# define SSL3_CK_EDH_RSA_DES_64_CBC_SHA 0x03000015 +# define SSL3_CK_DHE_RSA_DES_64_CBC_SHA SSL3_CK_EDH_RSA_DES_64_CBC_SHA +# define SSL3_CK_EDH_RSA_DES_192_CBC3_SHA 0x03000016 +# define SSL3_CK_DHE_RSA_DES_192_CBC3_SHA SSL3_CK_EDH_RSA_DES_192_CBC3_SHA + +# define SSL3_CK_ADH_RC4_40_MD5 0x03000017 +# define SSL3_CK_ADH_RC4_128_MD5 0x03000018 +# define SSL3_CK_ADH_DES_40_CBC_SHA 0x03000019 +# define SSL3_CK_ADH_DES_64_CBC_SHA 0x0300001A +# define SSL3_CK_ADH_DES_192_CBC_SHA 0x0300001B + +# if 0 +# define SSL3_CK_FZA_DMS_NULL_SHA 0x0300001C +# define SSL3_CK_FZA_DMS_FZA_SHA 0x0300001D +# if 0 /* Because it clashes with KRB5, is never + * used any more, and is safe to remove + * according to David Hopwood + * of the + * ietf-tls list */ +# define SSL3_CK_FZA_DMS_RC4_SHA 0x0300001E +# endif +# endif + +/* + * VRS Additional Kerberos5 entries + */ +# define SSL3_CK_KRB5_DES_64_CBC_SHA 0x0300001E +# define SSL3_CK_KRB5_DES_192_CBC3_SHA 0x0300001F +# define SSL3_CK_KRB5_RC4_128_SHA 0x03000020 +# define SSL3_CK_KRB5_IDEA_128_CBC_SHA 0x03000021 +# define SSL3_CK_KRB5_DES_64_CBC_MD5 0x03000022 +# define SSL3_CK_KRB5_DES_192_CBC3_MD5 0x03000023 +# define SSL3_CK_KRB5_RC4_128_MD5 0x03000024 +# define SSL3_CK_KRB5_IDEA_128_CBC_MD5 0x03000025 + +# define SSL3_CK_KRB5_DES_40_CBC_SHA 0x03000026 +# define SSL3_CK_KRB5_RC2_40_CBC_SHA 0x03000027 +# define SSL3_CK_KRB5_RC4_40_SHA 0x03000028 +# define SSL3_CK_KRB5_DES_40_CBC_MD5 0x03000029 +# define SSL3_CK_KRB5_RC2_40_CBC_MD5 0x0300002A +# define SSL3_CK_KRB5_RC4_40_MD5 0x0300002B + +# define SSL3_TXT_RSA_NULL_MD5 "NULL-MD5" +# define SSL3_TXT_RSA_NULL_SHA "NULL-SHA" +# define SSL3_TXT_RSA_RC4_40_MD5 "EXP-RC4-MD5" +# define SSL3_TXT_RSA_RC4_128_MD5 "RC4-MD5" +# define SSL3_TXT_RSA_RC4_128_SHA "RC4-SHA" +# define SSL3_TXT_RSA_RC2_40_MD5 "EXP-RC2-CBC-MD5" +# define SSL3_TXT_RSA_IDEA_128_SHA "IDEA-CBC-SHA" +# define SSL3_TXT_RSA_DES_40_CBC_SHA "EXP-DES-CBC-SHA" +# define SSL3_TXT_RSA_DES_64_CBC_SHA "DES-CBC-SHA" +# define SSL3_TXT_RSA_DES_192_CBC3_SHA "DES-CBC3-SHA" + +# define SSL3_TXT_DH_DSS_DES_40_CBC_SHA "EXP-DH-DSS-DES-CBC-SHA" +# define SSL3_TXT_DH_DSS_DES_64_CBC_SHA "DH-DSS-DES-CBC-SHA" +# define SSL3_TXT_DH_DSS_DES_192_CBC3_SHA "DH-DSS-DES-CBC3-SHA" +# define SSL3_TXT_DH_RSA_DES_40_CBC_SHA "EXP-DH-RSA-DES-CBC-SHA" +# define SSL3_TXT_DH_RSA_DES_64_CBC_SHA "DH-RSA-DES-CBC-SHA" +# define SSL3_TXT_DH_RSA_DES_192_CBC3_SHA "DH-RSA-DES-CBC3-SHA" + +# define SSL3_TXT_DHE_DSS_DES_40_CBC_SHA "EXP-DHE-DSS-DES-CBC-SHA" +# define SSL3_TXT_DHE_DSS_DES_64_CBC_SHA "DHE-DSS-DES-CBC-SHA" +# define SSL3_TXT_DHE_DSS_DES_192_CBC3_SHA "DHE-DSS-DES-CBC3-SHA" +# define SSL3_TXT_DHE_RSA_DES_40_CBC_SHA "EXP-DHE-RSA-DES-CBC-SHA" +# define SSL3_TXT_DHE_RSA_DES_64_CBC_SHA "DHE-RSA-DES-CBC-SHA" +# define SSL3_TXT_DHE_RSA_DES_192_CBC3_SHA "DHE-RSA-DES-CBC3-SHA" + +/* + * This next block of six "EDH" labels is for backward compatibility with + * older versions of OpenSSL. New code should use the six "DHE" labels above + * instead: + */ +# define SSL3_TXT_EDH_DSS_DES_40_CBC_SHA "EXP-EDH-DSS-DES-CBC-SHA" +# define SSL3_TXT_EDH_DSS_DES_64_CBC_SHA "EDH-DSS-DES-CBC-SHA" +# define SSL3_TXT_EDH_DSS_DES_192_CBC3_SHA "EDH-DSS-DES-CBC3-SHA" +# define SSL3_TXT_EDH_RSA_DES_40_CBC_SHA "EXP-EDH-RSA-DES-CBC-SHA" +# define SSL3_TXT_EDH_RSA_DES_64_CBC_SHA "EDH-RSA-DES-CBC-SHA" +# define SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA "EDH-RSA-DES-CBC3-SHA" + +# define SSL3_TXT_ADH_RC4_40_MD5 "EXP-ADH-RC4-MD5" +# define SSL3_TXT_ADH_RC4_128_MD5 "ADH-RC4-MD5" +# define SSL3_TXT_ADH_DES_40_CBC_SHA "EXP-ADH-DES-CBC-SHA" +# define SSL3_TXT_ADH_DES_64_CBC_SHA "ADH-DES-CBC-SHA" +# define SSL3_TXT_ADH_DES_192_CBC_SHA "ADH-DES-CBC3-SHA" + +# if 0 +# define SSL3_TXT_FZA_DMS_NULL_SHA "FZA-NULL-SHA" +# define SSL3_TXT_FZA_DMS_FZA_SHA "FZA-FZA-CBC-SHA" +# define SSL3_TXT_FZA_DMS_RC4_SHA "FZA-RC4-SHA" +# endif + +# define SSL3_TXT_KRB5_DES_64_CBC_SHA "KRB5-DES-CBC-SHA" +# define SSL3_TXT_KRB5_DES_192_CBC3_SHA "KRB5-DES-CBC3-SHA" +# define SSL3_TXT_KRB5_RC4_128_SHA "KRB5-RC4-SHA" +# define SSL3_TXT_KRB5_IDEA_128_CBC_SHA "KRB5-IDEA-CBC-SHA" +# define SSL3_TXT_KRB5_DES_64_CBC_MD5 "KRB5-DES-CBC-MD5" +# define SSL3_TXT_KRB5_DES_192_CBC3_MD5 "KRB5-DES-CBC3-MD5" +# define SSL3_TXT_KRB5_RC4_128_MD5 "KRB5-RC4-MD5" +# define SSL3_TXT_KRB5_IDEA_128_CBC_MD5 "KRB5-IDEA-CBC-MD5" + +# define SSL3_TXT_KRB5_DES_40_CBC_SHA "EXP-KRB5-DES-CBC-SHA" +# define SSL3_TXT_KRB5_RC2_40_CBC_SHA "EXP-KRB5-RC2-CBC-SHA" +# define SSL3_TXT_KRB5_RC4_40_SHA "EXP-KRB5-RC4-SHA" +# define SSL3_TXT_KRB5_DES_40_CBC_MD5 "EXP-KRB5-DES-CBC-MD5" +# define SSL3_TXT_KRB5_RC2_40_CBC_MD5 "EXP-KRB5-RC2-CBC-MD5" +# define SSL3_TXT_KRB5_RC4_40_MD5 "EXP-KRB5-RC4-MD5" + +# define SSL3_SSL_SESSION_ID_LENGTH 32 +# define SSL3_MAX_SSL_SESSION_ID_LENGTH 32 + +# define SSL3_MASTER_SECRET_SIZE 48 +# define SSL3_RANDOM_SIZE 32 +# define SSL3_SESSION_ID_SIZE 32 +# define SSL3_RT_HEADER_LENGTH 5 + +# define SSL3_HM_HEADER_LENGTH 4 + +# ifndef SSL3_ALIGN_PAYLOAD + /* + * Some will argue that this increases memory footprint, but it's not + * actually true. Point is that malloc has to return at least 64-bit aligned + * pointers, meaning that allocating 5 bytes wastes 3 bytes in either case. + * Suggested pre-gaping simply moves these wasted bytes from the end of + * allocated region to its front, but makes data payload aligned, which + * improves performance:-) + */ +# define SSL3_ALIGN_PAYLOAD 8 +# else +# if (SSL3_ALIGN_PAYLOAD&(SSL3_ALIGN_PAYLOAD-1))!=0 +# error "insane SSL3_ALIGN_PAYLOAD" +# undef SSL3_ALIGN_PAYLOAD +# endif +# endif + +/* + * This is the maximum MAC (digest) size used by the SSL library. Currently + * maximum of 20 is used by SHA1, but we reserve for future extension for + * 512-bit hashes. + */ + +# define SSL3_RT_MAX_MD_SIZE 64 + +/* + * Maximum block size used in all ciphersuites. Currently 16 for AES. + */ + +# define SSL_RT_MAX_CIPHER_BLOCK_SIZE 16 + +# define SSL3_RT_MAX_EXTRA (16384) + +/* Maximum plaintext length: defined by SSL/TLS standards */ +# define SSL3_RT_MAX_PLAIN_LENGTH 16384 +/* Maximum compression overhead: defined by SSL/TLS standards */ +# define SSL3_RT_MAX_COMPRESSED_OVERHEAD 1024 + +/* + * The standards give a maximum encryption overhead of 1024 bytes. In + * practice the value is lower than this. The overhead is the maximum number + * of padding bytes (256) plus the mac size. + */ +# define SSL3_RT_MAX_ENCRYPTED_OVERHEAD (256 + SSL3_RT_MAX_MD_SIZE) + +/* + * OpenSSL currently only uses a padding length of at most one block so the + * send overhead is smaller. + */ + +# define SSL3_RT_SEND_MAX_ENCRYPTED_OVERHEAD \ + (SSL_RT_MAX_CIPHER_BLOCK_SIZE + SSL3_RT_MAX_MD_SIZE) + +/* If compression isn't used don't include the compression overhead */ + +# ifdef OPENSSL_NO_COMP +# define SSL3_RT_MAX_COMPRESSED_LENGTH SSL3_RT_MAX_PLAIN_LENGTH +# else +# define SSL3_RT_MAX_COMPRESSED_LENGTH \ + (SSL3_RT_MAX_PLAIN_LENGTH+SSL3_RT_MAX_COMPRESSED_OVERHEAD) +# endif +# define SSL3_RT_MAX_ENCRYPTED_LENGTH \ + (SSL3_RT_MAX_ENCRYPTED_OVERHEAD+SSL3_RT_MAX_COMPRESSED_LENGTH) +# define SSL3_RT_MAX_PACKET_SIZE \ + (SSL3_RT_MAX_ENCRYPTED_LENGTH+SSL3_RT_HEADER_LENGTH) + +# define SSL3_MD_CLIENT_FINISHED_CONST "\x43\x4C\x4E\x54" +# define SSL3_MD_SERVER_FINISHED_CONST "\x53\x52\x56\x52" + +# define SSL3_VERSION 0x0300 +# define SSL3_VERSION_MAJOR 0x03 +# define SSL3_VERSION_MINOR 0x00 + +# define SSL3_RT_CHANGE_CIPHER_SPEC 20 +# define SSL3_RT_ALERT 21 +# define SSL3_RT_HANDSHAKE 22 +# define SSL3_RT_APPLICATION_DATA 23 +# define TLS1_RT_HEARTBEAT 24 + +/* Pseudo content types to indicate additional parameters */ +# define TLS1_RT_CRYPTO 0x1000 +# define TLS1_RT_CRYPTO_PREMASTER (TLS1_RT_CRYPTO | 0x1) +# define TLS1_RT_CRYPTO_CLIENT_RANDOM (TLS1_RT_CRYPTO | 0x2) +# define TLS1_RT_CRYPTO_SERVER_RANDOM (TLS1_RT_CRYPTO | 0x3) +# define TLS1_RT_CRYPTO_MASTER (TLS1_RT_CRYPTO | 0x4) + +# define TLS1_RT_CRYPTO_READ 0x0000 +# define TLS1_RT_CRYPTO_WRITE 0x0100 +# define TLS1_RT_CRYPTO_MAC (TLS1_RT_CRYPTO | 0x5) +# define TLS1_RT_CRYPTO_KEY (TLS1_RT_CRYPTO | 0x6) +# define TLS1_RT_CRYPTO_IV (TLS1_RT_CRYPTO | 0x7) +# define TLS1_RT_CRYPTO_FIXED_IV (TLS1_RT_CRYPTO | 0x8) + +/* Pseudo content type for SSL/TLS header info */ +# define SSL3_RT_HEADER 0x100 + +# define SSL3_AL_WARNING 1 +# define SSL3_AL_FATAL 2 + +# define SSL3_AD_CLOSE_NOTIFY 0 +# define SSL3_AD_UNEXPECTED_MESSAGE 10/* fatal */ +# define SSL3_AD_BAD_RECORD_MAC 20/* fatal */ +# define SSL3_AD_DECOMPRESSION_FAILURE 30/* fatal */ +# define SSL3_AD_HANDSHAKE_FAILURE 40/* fatal */ +# define SSL3_AD_NO_CERTIFICATE 41 +# define SSL3_AD_BAD_CERTIFICATE 42 +# define SSL3_AD_UNSUPPORTED_CERTIFICATE 43 +# define SSL3_AD_CERTIFICATE_REVOKED 44 +# define SSL3_AD_CERTIFICATE_EXPIRED 45 +# define SSL3_AD_CERTIFICATE_UNKNOWN 46 +# define SSL3_AD_ILLEGAL_PARAMETER 47/* fatal */ + +# define TLS1_HB_REQUEST 1 +# define TLS1_HB_RESPONSE 2 + +# ifndef OPENSSL_NO_SSL_INTERN + +typedef struct ssl3_record_st { + /* type of record */ + /* + * r + */ int type; + /* How many bytes available */ + /* + * rw + */ unsigned int length; + /* read/write offset into 'buf' */ + /* + * r + */ unsigned int off; + /* pointer to the record data */ + /* + * rw + */ unsigned char *data; + /* where the decode bytes are */ + /* + * rw + */ unsigned char *input; + /* only used with decompression - malloc()ed */ + /* + * r + */ unsigned char *comp; + /* epoch number, needed by DTLS1 */ + /* + * r + */ unsigned long epoch; + /* sequence number, needed by DTLS1 */ + /* + * r + */ unsigned char seq_num[8]; +} SSL3_RECORD; + +typedef struct ssl3_buffer_st { + /* at least SSL3_RT_MAX_PACKET_SIZE bytes, see ssl3_setup_buffers() */ + unsigned char *buf; + /* buffer size */ + size_t len; + /* where to 'copy from' */ + int offset; + /* how many bytes left */ + int left; +} SSL3_BUFFER; + +# endif + +# define SSL3_CT_RSA_SIGN 1 +# define SSL3_CT_DSS_SIGN 2 +# define SSL3_CT_RSA_FIXED_DH 3 +# define SSL3_CT_DSS_FIXED_DH 4 +# define SSL3_CT_RSA_EPHEMERAL_DH 5 +# define SSL3_CT_DSS_EPHEMERAL_DH 6 +# define SSL3_CT_FORTEZZA_DMS 20 +/* + * SSL3_CT_NUMBER is used to size arrays and it must be large enough to + * contain all of the cert types defined either for SSLv3 and TLSv1. + */ +# define SSL3_CT_NUMBER 9 + +# define SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS 0x0001 +# define SSL3_FLAGS_DELAY_CLIENT_FINISHED 0x0002 +# define SSL3_FLAGS_POP_BUFFER 0x0004 +# define TLS1_FLAGS_TLS_PADDING_BUG 0x0008 +# define TLS1_FLAGS_SKIP_CERT_VERIFY 0x0010 +# define TLS1_FLAGS_KEEP_HANDSHAKE 0x0020 +/* + * Set when the handshake is ready to process peer's ChangeCipherSpec message. + * Cleared after the message has been processed. + */ +# define SSL3_FLAGS_CCS_OK 0x0080 + +/* SSL3_FLAGS_SGC_RESTART_DONE is no longer used */ +# define SSL3_FLAGS_SGC_RESTART_DONE 0x0040 + +# ifndef OPENSSL_NO_SSL_INTERN + +typedef struct ssl3_state_st { + long flags; + int delay_buf_pop_ret; + unsigned char read_sequence[8]; + int read_mac_secret_size; + unsigned char read_mac_secret[EVP_MAX_MD_SIZE]; + unsigned char write_sequence[8]; + int write_mac_secret_size; + unsigned char write_mac_secret[EVP_MAX_MD_SIZE]; + unsigned char server_random[SSL3_RANDOM_SIZE]; + unsigned char client_random[SSL3_RANDOM_SIZE]; + /* flags for countermeasure against known-IV weakness */ + int need_empty_fragments; + int empty_fragment_done; + /* The value of 'extra' when the buffers were initialized */ + int init_extra; + SSL3_BUFFER rbuf; /* read IO goes into here */ + SSL3_BUFFER wbuf; /* write IO goes into here */ + SSL3_RECORD rrec; /* each decoded record goes in here */ + SSL3_RECORD wrec; /* goes out from here */ + /* + * storage for Alert/Handshake protocol data received but not yet + * processed by ssl3_read_bytes: + */ + unsigned char alert_fragment[2]; + unsigned int alert_fragment_len; + unsigned char handshake_fragment[4]; + unsigned int handshake_fragment_len; + /* partial write - check the numbers match */ + unsigned int wnum; /* number of bytes sent so far */ + int wpend_tot; /* number bytes written */ + int wpend_type; + int wpend_ret; /* number of bytes submitted */ + const unsigned char *wpend_buf; + /* used during startup, digest all incoming/outgoing packets */ + BIO *handshake_buffer; + /* + * When set of handshake digests is determined, buffer is hashed and + * freed and MD_CTX-es for all required digests are stored in this array + */ + EVP_MD_CTX **handshake_dgst; + /* + * Set whenever an expected ChangeCipherSpec message is processed. + * Unset when the peer's Finished message is received. + * Unexpected ChangeCipherSpec messages trigger a fatal alert. + */ + int change_cipher_spec; + int warn_alert; + int fatal_alert; + /* + * we allow one fatal and one warning alert to be outstanding, send close + * alert via the warning alert + */ + int alert_dispatch; + unsigned char send_alert[2]; + /* + * This flag is set when we should renegotiate ASAP, basically when there + * is no more data in the read or write buffers + */ + int renegotiate; + int total_renegotiations; + int num_renegotiations; + int in_read_app_data; + /* + * Opaque PRF input as used for the current handshake. These fields are + * used only if TLSEXT_TYPE_opaque_prf_input is defined (otherwise, they + * are merely present to improve binary compatibility) + */ + void *client_opaque_prf_input; + size_t client_opaque_prf_input_len; + void *server_opaque_prf_input; + size_t server_opaque_prf_input_len; + struct { + /* actually only needs to be 16+20 */ + unsigned char cert_verify_md[EVP_MAX_MD_SIZE * 2]; + /* actually only need to be 16+20 for SSLv3 and 12 for TLS */ + unsigned char finish_md[EVP_MAX_MD_SIZE * 2]; + int finish_md_len; + unsigned char peer_finish_md[EVP_MAX_MD_SIZE * 2]; + int peer_finish_md_len; + unsigned long message_size; + int message_type; + /* used to hold the new cipher we are going to use */ + const SSL_CIPHER *new_cipher; +# ifndef OPENSSL_NO_DH + DH *dh; +# endif +# ifndef OPENSSL_NO_ECDH + EC_KEY *ecdh; /* holds short lived ECDH key */ +# endif + /* used when SSL_ST_FLUSH_DATA is entered */ + int next_state; + int reuse_message; + /* used for certificate requests */ + int cert_req; + int ctype_num; + char ctype[SSL3_CT_NUMBER]; + STACK_OF(X509_NAME) *ca_names; + int use_rsa_tmp; + int key_block_length; + unsigned char *key_block; + const EVP_CIPHER *new_sym_enc; + const EVP_MD *new_hash; + int new_mac_pkey_type; + int new_mac_secret_size; +# ifndef OPENSSL_NO_COMP + const SSL_COMP *new_compression; +# else + char *new_compression; +# endif + int cert_request; + } tmp; + + /* Connection binding to prevent renegotiation attacks */ + unsigned char previous_client_finished[EVP_MAX_MD_SIZE]; + unsigned char previous_client_finished_len; + unsigned char previous_server_finished[EVP_MAX_MD_SIZE]; + unsigned char previous_server_finished_len; + int send_connection_binding; /* TODOEKR */ + +# ifndef OPENSSL_NO_NEXTPROTONEG + /* + * Set if we saw the Next Protocol Negotiation extension from our peer. + */ + int next_proto_neg_seen; +# endif + +# ifndef OPENSSL_NO_TLSEXT +# ifndef OPENSSL_NO_EC + /* + * This is set to true if we believe that this is a version of Safari + * running on OS X 10.6 or newer. We wish to know this because Safari on + * 10.8 .. 10.8.3 has broken ECDHE-ECDSA support. + */ + char is_probably_safari; +# endif /* !OPENSSL_NO_EC */ + + /* + * ALPN information (we are in the process of transitioning from NPN to + * ALPN.) + */ + + /* + * In a server these point to the selected ALPN protocol after the + * ClientHello has been processed. In a client these contain the protocol + * that the server selected once the ServerHello has been processed. + */ + unsigned char *alpn_selected; + unsigned alpn_selected_len; +# endif /* OPENSSL_NO_TLSEXT */ +} SSL3_STATE; + +# endif + +/* SSLv3 */ +/* + * client + */ +/* extra state */ +# define SSL3_ST_CW_FLUSH (0x100|SSL_ST_CONNECT) +# ifndef OPENSSL_NO_SCTP +# define DTLS1_SCTP_ST_CW_WRITE_SOCK (0x310|SSL_ST_CONNECT) +# define DTLS1_SCTP_ST_CR_READ_SOCK (0x320|SSL_ST_CONNECT) +# endif +/* write to server */ +# define SSL3_ST_CW_CLNT_HELLO_A (0x110|SSL_ST_CONNECT) +# define SSL3_ST_CW_CLNT_HELLO_B (0x111|SSL_ST_CONNECT) +/* read from server */ +# define SSL3_ST_CR_SRVR_HELLO_A (0x120|SSL_ST_CONNECT) +# define SSL3_ST_CR_SRVR_HELLO_B (0x121|SSL_ST_CONNECT) +# define DTLS1_ST_CR_HELLO_VERIFY_REQUEST_A (0x126|SSL_ST_CONNECT) +# define DTLS1_ST_CR_HELLO_VERIFY_REQUEST_B (0x127|SSL_ST_CONNECT) +# define SSL3_ST_CR_CERT_A (0x130|SSL_ST_CONNECT) +# define SSL3_ST_CR_CERT_B (0x131|SSL_ST_CONNECT) +# define SSL3_ST_CR_KEY_EXCH_A (0x140|SSL_ST_CONNECT) +# define SSL3_ST_CR_KEY_EXCH_B (0x141|SSL_ST_CONNECT) +# define SSL3_ST_CR_CERT_REQ_A (0x150|SSL_ST_CONNECT) +# define SSL3_ST_CR_CERT_REQ_B (0x151|SSL_ST_CONNECT) +# define SSL3_ST_CR_SRVR_DONE_A (0x160|SSL_ST_CONNECT) +# define SSL3_ST_CR_SRVR_DONE_B (0x161|SSL_ST_CONNECT) +/* write to server */ +# define SSL3_ST_CW_CERT_A (0x170|SSL_ST_CONNECT) +# define SSL3_ST_CW_CERT_B (0x171|SSL_ST_CONNECT) +# define SSL3_ST_CW_CERT_C (0x172|SSL_ST_CONNECT) +# define SSL3_ST_CW_CERT_D (0x173|SSL_ST_CONNECT) +# define SSL3_ST_CW_KEY_EXCH_A (0x180|SSL_ST_CONNECT) +# define SSL3_ST_CW_KEY_EXCH_B (0x181|SSL_ST_CONNECT) +# define SSL3_ST_CW_CERT_VRFY_A (0x190|SSL_ST_CONNECT) +# define SSL3_ST_CW_CERT_VRFY_B (0x191|SSL_ST_CONNECT) +# define SSL3_ST_CW_CHANGE_A (0x1A0|SSL_ST_CONNECT) +# define SSL3_ST_CW_CHANGE_B (0x1A1|SSL_ST_CONNECT) +# ifndef OPENSSL_NO_NEXTPROTONEG +# define SSL3_ST_CW_NEXT_PROTO_A (0x200|SSL_ST_CONNECT) +# define SSL3_ST_CW_NEXT_PROTO_B (0x201|SSL_ST_CONNECT) +# endif +# define SSL3_ST_CW_FINISHED_A (0x1B0|SSL_ST_CONNECT) +# define SSL3_ST_CW_FINISHED_B (0x1B1|SSL_ST_CONNECT) +/* read from server */ +# define SSL3_ST_CR_CHANGE_A (0x1C0|SSL_ST_CONNECT) +# define SSL3_ST_CR_CHANGE_B (0x1C1|SSL_ST_CONNECT) +# define SSL3_ST_CR_FINISHED_A (0x1D0|SSL_ST_CONNECT) +# define SSL3_ST_CR_FINISHED_B (0x1D1|SSL_ST_CONNECT) +# define SSL3_ST_CR_SESSION_TICKET_A (0x1E0|SSL_ST_CONNECT) +# define SSL3_ST_CR_SESSION_TICKET_B (0x1E1|SSL_ST_CONNECT) +# define SSL3_ST_CR_CERT_STATUS_A (0x1F0|SSL_ST_CONNECT) +# define SSL3_ST_CR_CERT_STATUS_B (0x1F1|SSL_ST_CONNECT) + +/* server */ +/* extra state */ +# define SSL3_ST_SW_FLUSH (0x100|SSL_ST_ACCEPT) +# ifndef OPENSSL_NO_SCTP +# define DTLS1_SCTP_ST_SW_WRITE_SOCK (0x310|SSL_ST_ACCEPT) +# define DTLS1_SCTP_ST_SR_READ_SOCK (0x320|SSL_ST_ACCEPT) +# endif +/* read from client */ +/* Do not change the number values, they do matter */ +# define SSL3_ST_SR_CLNT_HELLO_A (0x110|SSL_ST_ACCEPT) +# define SSL3_ST_SR_CLNT_HELLO_B (0x111|SSL_ST_ACCEPT) +# define SSL3_ST_SR_CLNT_HELLO_C (0x112|SSL_ST_ACCEPT) +# define SSL3_ST_SR_CLNT_HELLO_D (0x115|SSL_ST_ACCEPT) +/* write to client */ +# define DTLS1_ST_SW_HELLO_VERIFY_REQUEST_A (0x113|SSL_ST_ACCEPT) +# define DTLS1_ST_SW_HELLO_VERIFY_REQUEST_B (0x114|SSL_ST_ACCEPT) +# define SSL3_ST_SW_HELLO_REQ_A (0x120|SSL_ST_ACCEPT) +# define SSL3_ST_SW_HELLO_REQ_B (0x121|SSL_ST_ACCEPT) +# define SSL3_ST_SW_HELLO_REQ_C (0x122|SSL_ST_ACCEPT) +# define SSL3_ST_SW_SRVR_HELLO_A (0x130|SSL_ST_ACCEPT) +# define SSL3_ST_SW_SRVR_HELLO_B (0x131|SSL_ST_ACCEPT) +# define SSL3_ST_SW_CERT_A (0x140|SSL_ST_ACCEPT) +# define SSL3_ST_SW_CERT_B (0x141|SSL_ST_ACCEPT) +# define SSL3_ST_SW_KEY_EXCH_A (0x150|SSL_ST_ACCEPT) +# define SSL3_ST_SW_KEY_EXCH_B (0x151|SSL_ST_ACCEPT) +# define SSL3_ST_SW_CERT_REQ_A (0x160|SSL_ST_ACCEPT) +# define SSL3_ST_SW_CERT_REQ_B (0x161|SSL_ST_ACCEPT) +# define SSL3_ST_SW_SRVR_DONE_A (0x170|SSL_ST_ACCEPT) +# define SSL3_ST_SW_SRVR_DONE_B (0x171|SSL_ST_ACCEPT) +/* read from client */ +# define SSL3_ST_SR_CERT_A (0x180|SSL_ST_ACCEPT) +# define SSL3_ST_SR_CERT_B (0x181|SSL_ST_ACCEPT) +# define SSL3_ST_SR_KEY_EXCH_A (0x190|SSL_ST_ACCEPT) +# define SSL3_ST_SR_KEY_EXCH_B (0x191|SSL_ST_ACCEPT) +# define SSL3_ST_SR_CERT_VRFY_A (0x1A0|SSL_ST_ACCEPT) +# define SSL3_ST_SR_CERT_VRFY_B (0x1A1|SSL_ST_ACCEPT) +# define SSL3_ST_SR_CHANGE_A (0x1B0|SSL_ST_ACCEPT) +# define SSL3_ST_SR_CHANGE_B (0x1B1|SSL_ST_ACCEPT) +# ifndef OPENSSL_NO_NEXTPROTONEG +# define SSL3_ST_SR_NEXT_PROTO_A (0x210|SSL_ST_ACCEPT) +# define SSL3_ST_SR_NEXT_PROTO_B (0x211|SSL_ST_ACCEPT) +# endif +# define SSL3_ST_SR_FINISHED_A (0x1C0|SSL_ST_ACCEPT) +# define SSL3_ST_SR_FINISHED_B (0x1C1|SSL_ST_ACCEPT) +/* write to client */ +# define SSL3_ST_SW_CHANGE_A (0x1D0|SSL_ST_ACCEPT) +# define SSL3_ST_SW_CHANGE_B (0x1D1|SSL_ST_ACCEPT) +# define SSL3_ST_SW_FINISHED_A (0x1E0|SSL_ST_ACCEPT) +# define SSL3_ST_SW_FINISHED_B (0x1E1|SSL_ST_ACCEPT) +# define SSL3_ST_SW_SESSION_TICKET_A (0x1F0|SSL_ST_ACCEPT) +# define SSL3_ST_SW_SESSION_TICKET_B (0x1F1|SSL_ST_ACCEPT) +# define SSL3_ST_SW_CERT_STATUS_A (0x200|SSL_ST_ACCEPT) +# define SSL3_ST_SW_CERT_STATUS_B (0x201|SSL_ST_ACCEPT) + +# define SSL3_MT_HELLO_REQUEST 0 +# define SSL3_MT_CLIENT_HELLO 1 +# define SSL3_MT_SERVER_HELLO 2 +# define SSL3_MT_NEWSESSION_TICKET 4 +# define SSL3_MT_CERTIFICATE 11 +# define SSL3_MT_SERVER_KEY_EXCHANGE 12 +# define SSL3_MT_CERTIFICATE_REQUEST 13 +# define SSL3_MT_SERVER_DONE 14 +# define SSL3_MT_CERTIFICATE_VERIFY 15 +# define SSL3_MT_CLIENT_KEY_EXCHANGE 16 +# define SSL3_MT_FINISHED 20 +# define SSL3_MT_CERTIFICATE_STATUS 22 +# ifndef OPENSSL_NO_NEXTPROTONEG +# define SSL3_MT_NEXT_PROTO 67 +# endif +# define DTLS1_MT_HELLO_VERIFY_REQUEST 3 + +# define SSL3_MT_CCS 1 + +/* These are used when changing over to a new cipher */ +# define SSL3_CC_READ 0x01 +# define SSL3_CC_WRITE 0x02 +# define SSL3_CC_CLIENT 0x10 +# define SSL3_CC_SERVER 0x20 +# define SSL3_CHANGE_CIPHER_CLIENT_WRITE (SSL3_CC_CLIENT|SSL3_CC_WRITE) +# define SSL3_CHANGE_CIPHER_SERVER_READ (SSL3_CC_SERVER|SSL3_CC_READ) +# define SSL3_CHANGE_CIPHER_CLIENT_READ (SSL3_CC_CLIENT|SSL3_CC_READ) +# define SSL3_CHANGE_CIPHER_SERVER_WRITE (SSL3_CC_SERVER|SSL3_CC_WRITE) + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/stack.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/stack.h new file mode 100644 index 0000000..eb07216 --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/stack.h @@ -0,0 +1,107 @@ +/* crypto/stack/stack.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_STACK_H +# define HEADER_STACK_H + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct stack_st { + int num; + char **data; + int sorted; + int num_alloc; + int (*comp) (const void *, const void *); +} _STACK; /* Use STACK_OF(...) instead */ + +# define M_sk_num(sk) ((sk) ? (sk)->num:-1) +# define M_sk_value(sk,n) ((sk) ? (sk)->data[n] : NULL) + +int sk_num(const _STACK *); +void *sk_value(const _STACK *, int); + +void *sk_set(_STACK *, int, void *); + +_STACK *sk_new(int (*cmp) (const void *, const void *)); +_STACK *sk_new_null(void); +void sk_free(_STACK *); +void sk_pop_free(_STACK *st, void (*func) (void *)); +_STACK *sk_deep_copy(_STACK *, void *(*)(void *), void (*)(void *)); +int sk_insert(_STACK *sk, void *data, int where); +void *sk_delete(_STACK *st, int loc); +void *sk_delete_ptr(_STACK *st, void *p); +int sk_find(_STACK *st, void *data); +int sk_find_ex(_STACK *st, void *data); +int sk_push(_STACK *st, void *data); +int sk_unshift(_STACK *st, void *data); +void *sk_shift(_STACK *st); +void *sk_pop(_STACK *st); +void sk_zero(_STACK *st); +int (*sk_set_cmp_func(_STACK *sk, int (*c) (const void *, const void *))) + (const void *, const void *); +_STACK *sk_dup(_STACK *st); +void sk_sort(_STACK *st); +int sk_is_sorted(const _STACK *st); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/symhacks.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/symhacks.h new file mode 100644 index 0000000..239fa4f --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/symhacks.h @@ -0,0 +1,516 @@ +/* ==================================================================== + * Copyright (c) 1999 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_SYMHACKS_H +# define HEADER_SYMHACKS_H + +# include + +/* + * Hacks to solve the problem with linkers incapable of handling very long + * symbol names. In the case of VMS, the limit is 31 characters on VMS for + * VAX. + */ +/* + * Note that this affects util/libeay.num and util/ssleay.num... you may + * change those manually, but that's not recommended, as those files are + * controlled centrally and updated on Unix, and the central definition may + * disagree with yours, which in turn may come with shareable library + * incompatibilities. + */ +# ifdef OPENSSL_SYS_VMS + +/* Hack a long name in crypto/ex_data.c */ +# undef CRYPTO_get_ex_data_implementation +# define CRYPTO_get_ex_data_implementation CRYPTO_get_ex_data_impl +# undef CRYPTO_set_ex_data_implementation +# define CRYPTO_set_ex_data_implementation CRYPTO_set_ex_data_impl + +/* Hack a long name in crypto/asn1/a_mbstr.c */ +# undef ASN1_STRING_set_default_mask_asc +# define ASN1_STRING_set_default_mask_asc ASN1_STRING_set_def_mask_asc + +# if 0 /* No longer needed, since safestack macro + * magic does the job */ +/* Hack the names created with DECLARE_ASN1_SET_OF(PKCS7_SIGNER_INFO) */ +# undef i2d_ASN1_SET_OF_PKCS7_SIGNER_INFO +# define i2d_ASN1_SET_OF_PKCS7_SIGNER_INFO i2d_ASN1_SET_OF_PKCS7_SIGINF +# undef d2i_ASN1_SET_OF_PKCS7_SIGNER_INFO +# define d2i_ASN1_SET_OF_PKCS7_SIGNER_INFO d2i_ASN1_SET_OF_PKCS7_SIGINF +# endif + +# if 0 /* No longer needed, since safestack macro + * magic does the job */ +/* Hack the names created with DECLARE_ASN1_SET_OF(PKCS7_RECIP_INFO) */ +# undef i2d_ASN1_SET_OF_PKCS7_RECIP_INFO +# define i2d_ASN1_SET_OF_PKCS7_RECIP_INFO i2d_ASN1_SET_OF_PKCS7_RECINF +# undef d2i_ASN1_SET_OF_PKCS7_RECIP_INFO +# define d2i_ASN1_SET_OF_PKCS7_RECIP_INFO d2i_ASN1_SET_OF_PKCS7_RECINF +# endif + +# if 0 /* No longer needed, since safestack macro + * magic does the job */ +/* Hack the names created with DECLARE_ASN1_SET_OF(ACCESS_DESCRIPTION) */ +# undef i2d_ASN1_SET_OF_ACCESS_DESCRIPTION +# define i2d_ASN1_SET_OF_ACCESS_DESCRIPTION i2d_ASN1_SET_OF_ACC_DESC +# undef d2i_ASN1_SET_OF_ACCESS_DESCRIPTION +# define d2i_ASN1_SET_OF_ACCESS_DESCRIPTION d2i_ASN1_SET_OF_ACC_DESC +# endif + +/* Hack the names created with DECLARE_PEM_rw(NETSCAPE_CERT_SEQUENCE) */ +# undef PEM_read_NETSCAPE_CERT_SEQUENCE +# define PEM_read_NETSCAPE_CERT_SEQUENCE PEM_read_NS_CERT_SEQ +# undef PEM_write_NETSCAPE_CERT_SEQUENCE +# define PEM_write_NETSCAPE_CERT_SEQUENCE PEM_write_NS_CERT_SEQ +# undef PEM_read_bio_NETSCAPE_CERT_SEQUENCE +# define PEM_read_bio_NETSCAPE_CERT_SEQUENCE PEM_read_bio_NS_CERT_SEQ +# undef PEM_write_bio_NETSCAPE_CERT_SEQUENCE +# define PEM_write_bio_NETSCAPE_CERT_SEQUENCE PEM_write_bio_NS_CERT_SEQ +# undef PEM_write_cb_bio_NETSCAPE_CERT_SEQUENCE +# define PEM_write_cb_bio_NETSCAPE_CERT_SEQUENCE PEM_write_cb_bio_NS_CERT_SEQ + +/* Hack the names created with DECLARE_PEM_rw(PKCS8_PRIV_KEY_INFO) */ +# undef PEM_read_PKCS8_PRIV_KEY_INFO +# define PEM_read_PKCS8_PRIV_KEY_INFO PEM_read_P8_PRIV_KEY_INFO +# undef PEM_write_PKCS8_PRIV_KEY_INFO +# define PEM_write_PKCS8_PRIV_KEY_INFO PEM_write_P8_PRIV_KEY_INFO +# undef PEM_read_bio_PKCS8_PRIV_KEY_INFO +# define PEM_read_bio_PKCS8_PRIV_KEY_INFO PEM_read_bio_P8_PRIV_KEY_INFO +# undef PEM_write_bio_PKCS8_PRIV_KEY_INFO +# define PEM_write_bio_PKCS8_PRIV_KEY_INFO PEM_write_bio_P8_PRIV_KEY_INFO +# undef PEM_write_cb_bio_PKCS8_PRIV_KEY_INFO +# define PEM_write_cb_bio_PKCS8_PRIV_KEY_INFO PEM_wrt_cb_bio_P8_PRIV_KEY_INFO + +/* Hack other PEM names */ +# undef PEM_write_bio_PKCS8PrivateKey_nid +# define PEM_write_bio_PKCS8PrivateKey_nid PEM_write_bio_PKCS8PrivKey_nid + +/* Hack some long X509 names */ +# undef X509_REVOKED_get_ext_by_critical +# define X509_REVOKED_get_ext_by_critical X509_REVOKED_get_ext_by_critic +# undef X509_policy_tree_get0_user_policies +# define X509_policy_tree_get0_user_policies X509_pcy_tree_get0_usr_policies +# undef X509_policy_node_get0_qualifiers +# define X509_policy_node_get0_qualifiers X509_pcy_node_get0_qualifiers +# undef X509_STORE_CTX_get_explicit_policy +# define X509_STORE_CTX_get_explicit_policy X509_STORE_CTX_get_expl_policy +# undef X509_STORE_CTX_get0_current_issuer +# define X509_STORE_CTX_get0_current_issuer X509_STORE_CTX_get0_cur_issuer + +/* Hack some long CRYPTO names */ +# undef CRYPTO_set_dynlock_destroy_callback +# define CRYPTO_set_dynlock_destroy_callback CRYPTO_set_dynlock_destroy_cb +# undef CRYPTO_set_dynlock_create_callback +# define CRYPTO_set_dynlock_create_callback CRYPTO_set_dynlock_create_cb +# undef CRYPTO_set_dynlock_lock_callback +# define CRYPTO_set_dynlock_lock_callback CRYPTO_set_dynlock_lock_cb +# undef CRYPTO_get_dynlock_lock_callback +# define CRYPTO_get_dynlock_lock_callback CRYPTO_get_dynlock_lock_cb +# undef CRYPTO_get_dynlock_destroy_callback +# define CRYPTO_get_dynlock_destroy_callback CRYPTO_get_dynlock_destroy_cb +# undef CRYPTO_get_dynlock_create_callback +# define CRYPTO_get_dynlock_create_callback CRYPTO_get_dynlock_create_cb +# undef CRYPTO_set_locked_mem_ex_functions +# define CRYPTO_set_locked_mem_ex_functions CRYPTO_set_locked_mem_ex_funcs +# undef CRYPTO_get_locked_mem_ex_functions +# define CRYPTO_get_locked_mem_ex_functions CRYPTO_get_locked_mem_ex_funcs + +/* Hack some long SSL/TLS names */ +# undef SSL_CTX_set_default_verify_paths +# define SSL_CTX_set_default_verify_paths SSL_CTX_set_def_verify_paths +# undef SSL_get_ex_data_X509_STORE_CTX_idx +# define SSL_get_ex_data_X509_STORE_CTX_idx SSL_get_ex_d_X509_STORE_CTX_idx +# undef SSL_add_file_cert_subjects_to_stack +# define SSL_add_file_cert_subjects_to_stack SSL_add_file_cert_subjs_to_stk +# undef SSL_add_dir_cert_subjects_to_stack +# define SSL_add_dir_cert_subjects_to_stack SSL_add_dir_cert_subjs_to_stk +# undef SSL_CTX_use_certificate_chain_file +# define SSL_CTX_use_certificate_chain_file SSL_CTX_use_cert_chain_file +# undef SSL_CTX_set_cert_verify_callback +# define SSL_CTX_set_cert_verify_callback SSL_CTX_set_cert_verify_cb +# undef SSL_CTX_set_default_passwd_cb_userdata +# define SSL_CTX_set_default_passwd_cb_userdata SSL_CTX_set_def_passwd_cb_ud +# undef SSL_COMP_get_compression_methods +# define SSL_COMP_get_compression_methods SSL_COMP_get_compress_methods +# undef SSL_COMP_set0_compression_methods +# define SSL_COMP_set0_compression_methods SSL_COMP_set0_compress_methods +# undef SSL_COMP_free_compression_methods +# define SSL_COMP_free_compression_methods SSL_COMP_free_compress_methods +# undef ssl_add_clienthello_renegotiate_ext +# define ssl_add_clienthello_renegotiate_ext ssl_add_clienthello_reneg_ext +# undef ssl_add_serverhello_renegotiate_ext +# define ssl_add_serverhello_renegotiate_ext ssl_add_serverhello_reneg_ext +# undef ssl_parse_clienthello_renegotiate_ext +# define ssl_parse_clienthello_renegotiate_ext ssl_parse_clienthello_reneg_ext +# undef ssl_parse_serverhello_renegotiate_ext +# define ssl_parse_serverhello_renegotiate_ext ssl_parse_serverhello_reneg_ext +# undef SSL_srp_server_param_with_username +# define SSL_srp_server_param_with_username SSL_srp_server_param_with_un +# undef SSL_CTX_set_srp_client_pwd_callback +# define SSL_CTX_set_srp_client_pwd_callback SSL_CTX_set_srp_client_pwd_cb +# undef SSL_CTX_set_srp_verify_param_callback +# define SSL_CTX_set_srp_verify_param_callback SSL_CTX_set_srp_vfy_param_cb +# undef SSL_CTX_set_srp_username_callback +# define SSL_CTX_set_srp_username_callback SSL_CTX_set_srp_un_cb +# undef ssl_add_clienthello_use_srtp_ext +# define ssl_add_clienthello_use_srtp_ext ssl_add_clihello_use_srtp_ext +# undef ssl_add_serverhello_use_srtp_ext +# define ssl_add_serverhello_use_srtp_ext ssl_add_serhello_use_srtp_ext +# undef ssl_parse_clienthello_use_srtp_ext +# define ssl_parse_clienthello_use_srtp_ext ssl_parse_clihello_use_srtp_ext +# undef ssl_parse_serverhello_use_srtp_ext +# define ssl_parse_serverhello_use_srtp_ext ssl_parse_serhello_use_srtp_ext +# undef SSL_CTX_set_next_protos_advertised_cb +# define SSL_CTX_set_next_protos_advertised_cb SSL_CTX_set_next_protos_adv_cb +# undef SSL_CTX_set_next_proto_select_cb +# define SSL_CTX_set_next_proto_select_cb SSL_CTX_set_next_proto_sel_cb + +# undef tls1_send_server_supplemental_data +# define tls1_send_server_supplemental_data tls1_send_server_suppl_data +# undef tls1_send_client_supplemental_data +# define tls1_send_client_supplemental_data tls1_send_client_suppl_data +# undef tls1_get_server_supplemental_data +# define tls1_get_server_supplemental_data tls1_get_server_suppl_data +# undef tls1_get_client_supplemental_data +# define tls1_get_client_supplemental_data tls1_get_client_suppl_data + +# undef ssl3_cbc_record_digest_supported +# define ssl3_cbc_record_digest_supported ssl3_cbc_record_digest_support +# undef ssl_check_clienthello_tlsext_late +# define ssl_check_clienthello_tlsext_late ssl_check_clihello_tlsext_late +# undef ssl_check_clienthello_tlsext_early +# define ssl_check_clienthello_tlsext_early ssl_check_clihello_tlsext_early + +/* Hack some RSA long names */ +# undef RSA_padding_check_PKCS1_OAEP_mgf1 +# define RSA_padding_check_PKCS1_OAEP_mgf1 RSA_pad_check_PKCS1_OAEP_mgf1 + +/* Hack some ENGINE long names */ +# undef ENGINE_get_default_BN_mod_exp_crt +# define ENGINE_get_default_BN_mod_exp_crt ENGINE_get_def_BN_mod_exp_crt +# undef ENGINE_set_default_BN_mod_exp_crt +# define ENGINE_set_default_BN_mod_exp_crt ENGINE_set_def_BN_mod_exp_crt +# undef ENGINE_set_load_privkey_function +# define ENGINE_set_load_privkey_function ENGINE_set_load_privkey_fn +# undef ENGINE_get_load_privkey_function +# define ENGINE_get_load_privkey_function ENGINE_get_load_privkey_fn +# undef ENGINE_unregister_pkey_asn1_meths +# define ENGINE_unregister_pkey_asn1_meths ENGINE_unreg_pkey_asn1_meths +# undef ENGINE_register_all_pkey_asn1_meths +# define ENGINE_register_all_pkey_asn1_meths ENGINE_reg_all_pkey_asn1_meths +# undef ENGINE_set_default_pkey_asn1_meths +# define ENGINE_set_default_pkey_asn1_meths ENGINE_set_def_pkey_asn1_meths +# undef ENGINE_get_pkey_asn1_meth_engine +# define ENGINE_get_pkey_asn1_meth_engine ENGINE_get_pkey_asn1_meth_eng +# undef ENGINE_set_load_ssl_client_cert_function +# define ENGINE_set_load_ssl_client_cert_function \ + ENGINE_set_ld_ssl_clnt_cert_fn +# undef ENGINE_get_ssl_client_cert_function +# define ENGINE_get_ssl_client_cert_function ENGINE_get_ssl_client_cert_fn + +/* Hack some long OCSP names */ +# undef OCSP_REQUEST_get_ext_by_critical +# define OCSP_REQUEST_get_ext_by_critical OCSP_REQUEST_get_ext_by_crit +# undef OCSP_BASICRESP_get_ext_by_critical +# define OCSP_BASICRESP_get_ext_by_critical OCSP_BASICRESP_get_ext_by_crit +# undef OCSP_SINGLERESP_get_ext_by_critical +# define OCSP_SINGLERESP_get_ext_by_critical OCSP_SINGLERESP_get_ext_by_crit + +/* Hack some long DES names */ +# undef _ossl_old_des_ede3_cfb64_encrypt +# define _ossl_old_des_ede3_cfb64_encrypt _ossl_odes_ede3_cfb64_encrypt +# undef _ossl_old_des_ede3_ofb64_encrypt +# define _ossl_old_des_ede3_ofb64_encrypt _ossl_odes_ede3_ofb64_encrypt + +/* Hack some long EVP names */ +# undef OPENSSL_add_all_algorithms_noconf +# define OPENSSL_add_all_algorithms_noconf OPENSSL_add_all_algo_noconf +# undef OPENSSL_add_all_algorithms_conf +# define OPENSSL_add_all_algorithms_conf OPENSSL_add_all_algo_conf +# undef EVP_PKEY_meth_set_verify_recover +# define EVP_PKEY_meth_set_verify_recover EVP_PKEY_meth_set_vrfy_recover + +/* Hack some long EC names */ +# undef EC_GROUP_set_point_conversion_form +# define EC_GROUP_set_point_conversion_form EC_GROUP_set_point_conv_form +# undef EC_GROUP_get_point_conversion_form +# define EC_GROUP_get_point_conversion_form EC_GROUP_get_point_conv_form +# undef EC_GROUP_clear_free_all_extra_data +# define EC_GROUP_clear_free_all_extra_data EC_GROUP_clr_free_all_xtra_data +# undef EC_KEY_set_public_key_affine_coordinates +# define EC_KEY_set_public_key_affine_coordinates \ + EC_KEY_set_pub_key_aff_coords +# undef EC_POINT_set_Jprojective_coordinates_GFp +# define EC_POINT_set_Jprojective_coordinates_GFp \ + EC_POINT_set_Jproj_coords_GFp +# undef EC_POINT_get_Jprojective_coordinates_GFp +# define EC_POINT_get_Jprojective_coordinates_GFp \ + EC_POINT_get_Jproj_coords_GFp +# undef EC_POINT_set_affine_coordinates_GFp +# define EC_POINT_set_affine_coordinates_GFp EC_POINT_set_affine_coords_GFp +# undef EC_POINT_get_affine_coordinates_GFp +# define EC_POINT_get_affine_coordinates_GFp EC_POINT_get_affine_coords_GFp +# undef EC_POINT_set_compressed_coordinates_GFp +# define EC_POINT_set_compressed_coordinates_GFp EC_POINT_set_compr_coords_GFp +# undef EC_POINT_set_affine_coordinates_GF2m +# define EC_POINT_set_affine_coordinates_GF2m EC_POINT_set_affine_coords_GF2m +# undef EC_POINT_get_affine_coordinates_GF2m +# define EC_POINT_get_affine_coordinates_GF2m EC_POINT_get_affine_coords_GF2m +# undef EC_POINT_set_compressed_coordinates_GF2m +# define EC_POINT_set_compressed_coordinates_GF2m \ + EC_POINT_set_compr_coords_GF2m +# undef ec_GF2m_simple_group_clear_finish +# define ec_GF2m_simple_group_clear_finish ec_GF2m_simple_grp_clr_finish +# undef ec_GF2m_simple_group_check_discriminant +# define ec_GF2m_simple_group_check_discriminant ec_GF2m_simple_grp_chk_discrim +# undef ec_GF2m_simple_point_clear_finish +# define ec_GF2m_simple_point_clear_finish ec_GF2m_simple_pt_clr_finish +# undef ec_GF2m_simple_point_set_to_infinity +# define ec_GF2m_simple_point_set_to_infinity ec_GF2m_simple_pt_set_to_inf +# undef ec_GF2m_simple_points_make_affine +# define ec_GF2m_simple_points_make_affine ec_GF2m_simple_pts_make_affine +# undef ec_GF2m_simple_point_set_affine_coordinates +# define ec_GF2m_simple_point_set_affine_coordinates \ + ec_GF2m_smp_pt_set_af_coords +# undef ec_GF2m_simple_point_get_affine_coordinates +# define ec_GF2m_simple_point_get_affine_coordinates \ + ec_GF2m_smp_pt_get_af_coords +# undef ec_GF2m_simple_set_compressed_coordinates +# define ec_GF2m_simple_set_compressed_coordinates \ + ec_GF2m_smp_set_compr_coords +# undef ec_GFp_simple_group_set_curve_GFp +# define ec_GFp_simple_group_set_curve_GFp ec_GFp_simple_grp_set_curve_GFp +# undef ec_GFp_simple_group_get_curve_GFp +# define ec_GFp_simple_group_get_curve_GFp ec_GFp_simple_grp_get_curve_GFp +# undef ec_GFp_simple_group_clear_finish +# define ec_GFp_simple_group_clear_finish ec_GFp_simple_grp_clear_finish +# undef ec_GFp_simple_group_set_generator +# define ec_GFp_simple_group_set_generator ec_GFp_simple_grp_set_generator +# undef ec_GFp_simple_group_get0_generator +# define ec_GFp_simple_group_get0_generator ec_GFp_simple_grp_gt0_generator +# undef ec_GFp_simple_group_get_cofactor +# define ec_GFp_simple_group_get_cofactor ec_GFp_simple_grp_get_cofactor +# undef ec_GFp_simple_point_clear_finish +# define ec_GFp_simple_point_clear_finish ec_GFp_simple_pt_clear_finish +# undef ec_GFp_simple_point_set_to_infinity +# define ec_GFp_simple_point_set_to_infinity ec_GFp_simple_pt_set_to_inf +# undef ec_GFp_simple_points_make_affine +# define ec_GFp_simple_points_make_affine ec_GFp_simple_pts_make_affine +# undef ec_GFp_simple_set_Jprojective_coordinates_GFp +# define ec_GFp_simple_set_Jprojective_coordinates_GFp \ + ec_GFp_smp_set_Jproj_coords_GFp +# undef ec_GFp_simple_get_Jprojective_coordinates_GFp +# define ec_GFp_simple_get_Jprojective_coordinates_GFp \ + ec_GFp_smp_get_Jproj_coords_GFp +# undef ec_GFp_simple_point_set_affine_coordinates_GFp +# define ec_GFp_simple_point_set_affine_coordinates_GFp \ + ec_GFp_smp_pt_set_af_coords_GFp +# undef ec_GFp_simple_point_get_affine_coordinates_GFp +# define ec_GFp_simple_point_get_affine_coordinates_GFp \ + ec_GFp_smp_pt_get_af_coords_GFp +# undef ec_GFp_simple_set_compressed_coordinates_GFp +# define ec_GFp_simple_set_compressed_coordinates_GFp \ + ec_GFp_smp_set_compr_coords_GFp +# undef ec_GFp_simple_point_set_affine_coordinates +# define ec_GFp_simple_point_set_affine_coordinates \ + ec_GFp_smp_pt_set_af_coords +# undef ec_GFp_simple_point_get_affine_coordinates +# define ec_GFp_simple_point_get_affine_coordinates \ + ec_GFp_smp_pt_get_af_coords +# undef ec_GFp_simple_set_compressed_coordinates +# define ec_GFp_simple_set_compressed_coordinates \ + ec_GFp_smp_set_compr_coords +# undef ec_GFp_simple_group_check_discriminant +# define ec_GFp_simple_group_check_discriminant ec_GFp_simple_grp_chk_discrim + +/* Hack som long STORE names */ +# undef STORE_method_set_initialise_function +# define STORE_method_set_initialise_function STORE_meth_set_initialise_fn +# undef STORE_method_set_cleanup_function +# define STORE_method_set_cleanup_function STORE_meth_set_cleanup_fn +# undef STORE_method_set_generate_function +# define STORE_method_set_generate_function STORE_meth_set_generate_fn +# undef STORE_method_set_modify_function +# define STORE_method_set_modify_function STORE_meth_set_modify_fn +# undef STORE_method_set_revoke_function +# define STORE_method_set_revoke_function STORE_meth_set_revoke_fn +# undef STORE_method_set_delete_function +# define STORE_method_set_delete_function STORE_meth_set_delete_fn +# undef STORE_method_set_list_start_function +# define STORE_method_set_list_start_function STORE_meth_set_list_start_fn +# undef STORE_method_set_list_next_function +# define STORE_method_set_list_next_function STORE_meth_set_list_next_fn +# undef STORE_method_set_list_end_function +# define STORE_method_set_list_end_function STORE_meth_set_list_end_fn +# undef STORE_method_set_update_store_function +# define STORE_method_set_update_store_function STORE_meth_set_update_store_fn +# undef STORE_method_set_lock_store_function +# define STORE_method_set_lock_store_function STORE_meth_set_lock_store_fn +# undef STORE_method_set_unlock_store_function +# define STORE_method_set_unlock_store_function STORE_meth_set_unlock_store_fn +# undef STORE_method_get_initialise_function +# define STORE_method_get_initialise_function STORE_meth_get_initialise_fn +# undef STORE_method_get_cleanup_function +# define STORE_method_get_cleanup_function STORE_meth_get_cleanup_fn +# undef STORE_method_get_generate_function +# define STORE_method_get_generate_function STORE_meth_get_generate_fn +# undef STORE_method_get_modify_function +# define STORE_method_get_modify_function STORE_meth_get_modify_fn +# undef STORE_method_get_revoke_function +# define STORE_method_get_revoke_function STORE_meth_get_revoke_fn +# undef STORE_method_get_delete_function +# define STORE_method_get_delete_function STORE_meth_get_delete_fn +# undef STORE_method_get_list_start_function +# define STORE_method_get_list_start_function STORE_meth_get_list_start_fn +# undef STORE_method_get_list_next_function +# define STORE_method_get_list_next_function STORE_meth_get_list_next_fn +# undef STORE_method_get_list_end_function +# define STORE_method_get_list_end_function STORE_meth_get_list_end_fn +# undef STORE_method_get_update_store_function +# define STORE_method_get_update_store_function STORE_meth_get_update_store_fn +# undef STORE_method_get_lock_store_function +# define STORE_method_get_lock_store_function STORE_meth_get_lock_store_fn +# undef STORE_method_get_unlock_store_function +# define STORE_method_get_unlock_store_function STORE_meth_get_unlock_store_fn + +/* Hack some long TS names */ +# undef TS_RESP_CTX_set_status_info_cond +# define TS_RESP_CTX_set_status_info_cond TS_RESP_CTX_set_stat_info_cond +# undef TS_RESP_CTX_set_clock_precision_digits +# define TS_RESP_CTX_set_clock_precision_digits TS_RESP_CTX_set_clk_prec_digits +# undef TS_CONF_set_clock_precision_digits +# define TS_CONF_set_clock_precision_digits TS_CONF_set_clk_prec_digits + +/* Hack some long CMS names */ +# undef CMS_RecipientInfo_ktri_get0_algs +# define CMS_RecipientInfo_ktri_get0_algs CMS_RecipInfo_ktri_get0_algs +# undef CMS_RecipientInfo_ktri_get0_signer_id +# define CMS_RecipientInfo_ktri_get0_signer_id CMS_RecipInfo_ktri_get0_sigr_id +# undef CMS_OtherRevocationInfoFormat_it +# define CMS_OtherRevocationInfoFormat_it CMS_OtherRevocInfoFormat_it +# undef CMS_KeyAgreeRecipientIdentifier_it +# define CMS_KeyAgreeRecipientIdentifier_it CMS_KeyAgreeRecipIdentifier_it +# undef CMS_OriginatorIdentifierOrKey_it +# define CMS_OriginatorIdentifierOrKey_it CMS_OriginatorIdOrKey_it +# undef cms_SignerIdentifier_get0_signer_id +# define cms_SignerIdentifier_get0_signer_id cms_SignerId_get0_signer_id +# undef CMS_RecipientInfo_kari_get0_orig_id +# define CMS_RecipientInfo_kari_get0_orig_id CMS_RecipInfo_kari_get0_orig_id +# undef CMS_RecipientInfo_kari_get0_reks +# define CMS_RecipientInfo_kari_get0_reks CMS_RecipInfo_kari_get0_reks +# undef CMS_RecipientEncryptedKey_cert_cmp +# define CMS_RecipientEncryptedKey_cert_cmp CMS_RecipEncryptedKey_cert_cmp +# undef CMS_RecipientInfo_kari_set0_pkey +# define CMS_RecipientInfo_kari_set0_pkey CMS_RecipInfo_kari_set0_pkey +# undef CMS_RecipientEncryptedKey_get0_id +# define CMS_RecipientEncryptedKey_get0_id CMS_RecipEncryptedKey_get0_id +# undef CMS_RecipientInfo_kari_orig_id_cmp +# define CMS_RecipientInfo_kari_orig_id_cmp CMS_RecipInfo_kari_orig_id_cmp + +/* Hack some long DTLS1 names */ +# undef dtls1_retransmit_buffered_messages +# define dtls1_retransmit_buffered_messages dtls1_retransmit_buffered_msgs + +/* Hack some long SRP names */ +# undef SRP_generate_server_master_secret +# define SRP_generate_server_master_secret SRP_gen_server_master_secret +# undef SRP_generate_client_master_secret +# define SRP_generate_client_master_secret SRP_gen_client_master_secret + +/* Hack some long UI names */ +# undef UI_method_get_prompt_constructor +# define UI_method_get_prompt_constructor UI_method_get_prompt_constructr +# undef UI_method_set_prompt_constructor +# define UI_method_set_prompt_constructor UI_method_set_prompt_constructr + +# endif /* defined OPENSSL_SYS_VMS */ + +/* Case insensitive linking causes problems.... */ +# if defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_OS2) +# undef ERR_load_CRYPTO_strings +# define ERR_load_CRYPTO_strings ERR_load_CRYPTOlib_strings +# undef OCSP_crlID_new +# define OCSP_crlID_new OCSP_crlID2_new + +# undef d2i_ECPARAMETERS +# define d2i_ECPARAMETERS d2i_UC_ECPARAMETERS +# undef i2d_ECPARAMETERS +# define i2d_ECPARAMETERS i2d_UC_ECPARAMETERS +# undef d2i_ECPKPARAMETERS +# define d2i_ECPKPARAMETERS d2i_UC_ECPKPARAMETERS +# undef i2d_ECPKPARAMETERS +# define i2d_ECPKPARAMETERS i2d_UC_ECPKPARAMETERS + +/* + * These functions do not seem to exist! However, I'm paranoid... Original + * command in x509v3.h: These functions are being redefined in another + * directory, and clash when the linker is case-insensitive, so let's hide + * them a little, by giving them an extra 'o' at the beginning of the name... + */ +# undef X509v3_cleanup_extensions +# define X509v3_cleanup_extensions oX509v3_cleanup_extensions +# undef X509v3_add_extension +# define X509v3_add_extension oX509v3_add_extension +# undef X509v3_add_netscape_extensions +# define X509v3_add_netscape_extensions oX509v3_add_netscape_extensions +# undef X509v3_add_standard_extensions +# define X509v3_add_standard_extensions oX509v3_add_standard_extensions + +/* This one clashes with CMS_data_create */ +# undef cms_Data_create +# define cms_Data_create priv_cms_Data_create + +# endif + +#endif /* ! defined HEADER_VMS_IDHACKS_H */ diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/tls1.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/tls1.h new file mode 100644 index 0000000..7e237d0 --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/tls1.h @@ -0,0 +1,810 @@ +/* ssl/tls1.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ +/* ==================================================================== + * Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * + * Portions of the attached software ("Contribution") are developed by + * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project. + * + * The Contribution is licensed pursuant to the OpenSSL open source + * license provided above. + * + * ECC cipher suite support in OpenSSL originally written by + * Vipul Gupta and Sumit Gupta of Sun Microsystems Laboratories. + * + */ +/* ==================================================================== + * Copyright 2005 Nokia. All rights reserved. + * + * The portions of the attached software ("Contribution") is developed by + * Nokia Corporation and is licensed pursuant to the OpenSSL open source + * license. + * + * The Contribution, originally written by Mika Kousa and Pasi Eronen of + * Nokia Corporation, consists of the "PSK" (Pre-Shared Key) ciphersuites + * support (see RFC 4279) to OpenSSL. + * + * No patent licenses or other rights except those expressly stated in + * the OpenSSL open source license shall be deemed granted or received + * expressly, by implication, estoppel, or otherwise. + * + * No assurances are provided by Nokia that the Contribution does not + * infringe the patent or other intellectual property rights of any third + * party or that the license provides you with all the necessary rights + * to make use of the Contribution. + * + * THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. IN + * ADDITION TO THE DISCLAIMERS INCLUDED IN THE LICENSE, NOKIA + * SPECIFICALLY DISCLAIMS ANY LIABILITY FOR CLAIMS BROUGHT BY YOU OR ANY + * OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS OR + * OTHERWISE. + */ + +#ifndef HEADER_TLS1_H +# define HEADER_TLS1_H + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES 0 + +# define TLS1_VERSION 0x0301 +# define TLS1_1_VERSION 0x0302 +# define TLS1_2_VERSION 0x0303 +# define TLS_MAX_VERSION TLS1_2_VERSION + +# define TLS1_VERSION_MAJOR 0x03 +# define TLS1_VERSION_MINOR 0x01 + +# define TLS1_1_VERSION_MAJOR 0x03 +# define TLS1_1_VERSION_MINOR 0x02 + +# define TLS1_2_VERSION_MAJOR 0x03 +# define TLS1_2_VERSION_MINOR 0x03 + +# define TLS1_get_version(s) \ + ((s->version >> 8) == TLS1_VERSION_MAJOR ? s->version : 0) + +# define TLS1_get_client_version(s) \ + ((s->client_version >> 8) == TLS1_VERSION_MAJOR ? s->client_version : 0) + +# define TLS1_AD_DECRYPTION_FAILED 21 +# define TLS1_AD_RECORD_OVERFLOW 22 +# define TLS1_AD_UNKNOWN_CA 48/* fatal */ +# define TLS1_AD_ACCESS_DENIED 49/* fatal */ +# define TLS1_AD_DECODE_ERROR 50/* fatal */ +# define TLS1_AD_DECRYPT_ERROR 51 +# define TLS1_AD_EXPORT_RESTRICTION 60/* fatal */ +# define TLS1_AD_PROTOCOL_VERSION 70/* fatal */ +# define TLS1_AD_INSUFFICIENT_SECURITY 71/* fatal */ +# define TLS1_AD_INTERNAL_ERROR 80/* fatal */ +# define TLS1_AD_INAPPROPRIATE_FALLBACK 86/* fatal */ +# define TLS1_AD_USER_CANCELLED 90 +# define TLS1_AD_NO_RENEGOTIATION 100 +/* codes 110-114 are from RFC3546 */ +# define TLS1_AD_UNSUPPORTED_EXTENSION 110 +# define TLS1_AD_CERTIFICATE_UNOBTAINABLE 111 +# define TLS1_AD_UNRECOGNIZED_NAME 112 +# define TLS1_AD_BAD_CERTIFICATE_STATUS_RESPONSE 113 +# define TLS1_AD_BAD_CERTIFICATE_HASH_VALUE 114 +# define TLS1_AD_UNKNOWN_PSK_IDENTITY 115/* fatal */ + +/* ExtensionType values from RFC3546 / RFC4366 / RFC6066 */ +# define TLSEXT_TYPE_server_name 0 +# define TLSEXT_TYPE_max_fragment_length 1 +# define TLSEXT_TYPE_client_certificate_url 2 +# define TLSEXT_TYPE_trusted_ca_keys 3 +# define TLSEXT_TYPE_truncated_hmac 4 +# define TLSEXT_TYPE_status_request 5 +/* ExtensionType values from RFC4681 */ +# define TLSEXT_TYPE_user_mapping 6 +/* ExtensionType values from RFC5878 */ +# define TLSEXT_TYPE_client_authz 7 +# define TLSEXT_TYPE_server_authz 8 +/* ExtensionType values from RFC6091 */ +# define TLSEXT_TYPE_cert_type 9 + +/* ExtensionType values from RFC4492 */ +# define TLSEXT_TYPE_elliptic_curves 10 +# define TLSEXT_TYPE_ec_point_formats 11 + +/* ExtensionType value from RFC5054 */ +# define TLSEXT_TYPE_srp 12 + +/* ExtensionType values from RFC5246 */ +# define TLSEXT_TYPE_signature_algorithms 13 + +/* ExtensionType value from RFC5764 */ +# define TLSEXT_TYPE_use_srtp 14 + +/* ExtensionType value from RFC5620 */ +# define TLSEXT_TYPE_heartbeat 15 + +/* ExtensionType value from RFC7301 */ +# define TLSEXT_TYPE_application_layer_protocol_negotiation 16 + +/* + * ExtensionType value for TLS padding extension. + * http://tools.ietf.org/html/draft-agl-tls-padding + */ +# define TLSEXT_TYPE_padding 21 + +/* ExtensionType value from RFC4507 */ +# define TLSEXT_TYPE_session_ticket 35 + +/* ExtensionType value from draft-rescorla-tls-opaque-prf-input-00.txt */ +# if 0 +/* + * will have to be provided externally for now , + * i.e. build with -DTLSEXT_TYPE_opaque_prf_input=38183 + * using whatever extension number you'd like to try + */ +# define TLSEXT_TYPE_opaque_prf_input ?? +# endif + +/* Temporary extension type */ +# define TLSEXT_TYPE_renegotiate 0xff01 + +# ifndef OPENSSL_NO_NEXTPROTONEG +/* This is not an IANA defined extension number */ +# define TLSEXT_TYPE_next_proto_neg 13172 +# endif + +/* NameType value from RFC3546 */ +# define TLSEXT_NAMETYPE_host_name 0 +/* status request value from RFC3546 */ +# define TLSEXT_STATUSTYPE_ocsp 1 + +/* ECPointFormat values from RFC4492 */ +# define TLSEXT_ECPOINTFORMAT_first 0 +# define TLSEXT_ECPOINTFORMAT_uncompressed 0 +# define TLSEXT_ECPOINTFORMAT_ansiX962_compressed_prime 1 +# define TLSEXT_ECPOINTFORMAT_ansiX962_compressed_char2 2 +# define TLSEXT_ECPOINTFORMAT_last 2 + +/* Signature and hash algorithms from RFC5246 */ +# define TLSEXT_signature_anonymous 0 +# define TLSEXT_signature_rsa 1 +# define TLSEXT_signature_dsa 2 +# define TLSEXT_signature_ecdsa 3 + +/* Total number of different signature algorithms */ +# define TLSEXT_signature_num 4 + +# define TLSEXT_hash_none 0 +# define TLSEXT_hash_md5 1 +# define TLSEXT_hash_sha1 2 +# define TLSEXT_hash_sha224 3 +# define TLSEXT_hash_sha256 4 +# define TLSEXT_hash_sha384 5 +# define TLSEXT_hash_sha512 6 + +/* Total number of different digest algorithms */ + +# define TLSEXT_hash_num 7 + +/* Flag set for unrecognised algorithms */ +# define TLSEXT_nid_unknown 0x1000000 + +/* ECC curves */ + +# define TLSEXT_curve_P_256 23 +# define TLSEXT_curve_P_384 24 + +# ifndef OPENSSL_NO_TLSEXT + +# define TLSEXT_MAXLEN_host_name 255 + +const char *SSL_get_servername(const SSL *s, const int type); +int SSL_get_servername_type(const SSL *s); +/* + * SSL_export_keying_material exports a value derived from the master secret, + * as specified in RFC 5705. It writes |olen| bytes to |out| given a label and + * optional context. (Since a zero length context is allowed, the |use_context| + * flag controls whether a context is included.) It returns 1 on success and + * zero otherwise. + */ +int SSL_export_keying_material(SSL *s, unsigned char *out, size_t olen, + const char *label, size_t llen, + const unsigned char *p, size_t plen, + int use_context); + +int SSL_get_sigalgs(SSL *s, int idx, + int *psign, int *phash, int *psignandhash, + unsigned char *rsig, unsigned char *rhash); + +int SSL_get_shared_sigalgs(SSL *s, int idx, + int *psign, int *phash, int *psignandhash, + unsigned char *rsig, unsigned char *rhash); + +int SSL_check_chain(SSL *s, X509 *x, EVP_PKEY *pk, STACK_OF(X509) *chain); + +# define SSL_set_tlsext_host_name(s,name) \ +SSL_ctrl(s,SSL_CTRL_SET_TLSEXT_HOSTNAME,TLSEXT_NAMETYPE_host_name,(char *)name) + +# define SSL_set_tlsext_debug_callback(ssl, cb) \ +SSL_callback_ctrl(ssl,SSL_CTRL_SET_TLSEXT_DEBUG_CB,(void (*)(void))cb) + +# define SSL_set_tlsext_debug_arg(ssl, arg) \ +SSL_ctrl(ssl,SSL_CTRL_SET_TLSEXT_DEBUG_ARG,0, (void *)arg) + +# define SSL_set_tlsext_status_type(ssl, type) \ +SSL_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_TYPE,type, NULL) + +# define SSL_get_tlsext_status_exts(ssl, arg) \ +SSL_ctrl(ssl,SSL_CTRL_GET_TLSEXT_STATUS_REQ_EXTS,0, (void *)arg) + +# define SSL_set_tlsext_status_exts(ssl, arg) \ +SSL_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_EXTS,0, (void *)arg) + +# define SSL_get_tlsext_status_ids(ssl, arg) \ +SSL_ctrl(ssl,SSL_CTRL_GET_TLSEXT_STATUS_REQ_IDS,0, (void *)arg) + +# define SSL_set_tlsext_status_ids(ssl, arg) \ +SSL_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_IDS,0, (void *)arg) + +# define SSL_get_tlsext_status_ocsp_resp(ssl, arg) \ +SSL_ctrl(ssl,SSL_CTRL_GET_TLSEXT_STATUS_REQ_OCSP_RESP,0, (void *)arg) + +# define SSL_set_tlsext_status_ocsp_resp(ssl, arg, arglen) \ +SSL_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_OCSP_RESP,arglen, (void *)arg) + +# define SSL_CTX_set_tlsext_servername_callback(ctx, cb) \ +SSL_CTX_callback_ctrl(ctx,SSL_CTRL_SET_TLSEXT_SERVERNAME_CB,(void (*)(void))cb) + +# define SSL_TLSEXT_ERR_OK 0 +# define SSL_TLSEXT_ERR_ALERT_WARNING 1 +# define SSL_TLSEXT_ERR_ALERT_FATAL 2 +# define SSL_TLSEXT_ERR_NOACK 3 + +# define SSL_CTX_set_tlsext_servername_arg(ctx, arg) \ +SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TLSEXT_SERVERNAME_ARG,0, (void *)arg) + +# define SSL_CTX_get_tlsext_ticket_keys(ctx, keys, keylen) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_GET_TLSEXT_TICKET_KEYS,(keylen),(keys)) +# define SSL_CTX_set_tlsext_ticket_keys(ctx, keys, keylen) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_SET_TLSEXT_TICKET_KEYS,(keylen),(keys)) + +# define SSL_CTX_set_tlsext_status_cb(ssl, cb) \ +SSL_CTX_callback_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB,(void (*)(void))cb) + +# define SSL_CTX_set_tlsext_status_arg(ssl, arg) \ +SSL_CTX_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB_ARG,0, (void *)arg) + +# define SSL_set_tlsext_opaque_prf_input(s, src, len) \ +SSL_ctrl(s,SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT, len, src) +# define SSL_CTX_set_tlsext_opaque_prf_input_callback(ctx, cb) \ +SSL_CTX_callback_ctrl(ctx,SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT_CB, (void (*)(void))cb) +# define SSL_CTX_set_tlsext_opaque_prf_input_callback_arg(ctx, arg) \ +SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT_CB_ARG, 0, arg) + +# define SSL_CTX_set_tlsext_ticket_key_cb(ssl, cb) \ +SSL_CTX_callback_ctrl(ssl,SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB,(void (*)(void))cb) + +# ifndef OPENSSL_NO_HEARTBEATS +# define SSL_TLSEXT_HB_ENABLED 0x01 +# define SSL_TLSEXT_HB_DONT_SEND_REQUESTS 0x02 +# define SSL_TLSEXT_HB_DONT_RECV_REQUESTS 0x04 + +# define SSL_get_tlsext_heartbeat_pending(ssl) \ + SSL_ctrl((ssl),SSL_CTRL_GET_TLS_EXT_HEARTBEAT_PENDING,0,NULL) +# define SSL_set_tlsext_heartbeat_no_requests(ssl, arg) \ + SSL_ctrl((ssl),SSL_CTRL_SET_TLS_EXT_HEARTBEAT_NO_REQUESTS,arg,NULL) +# endif +# endif + +/* PSK ciphersuites from 4279 */ +# define TLS1_CK_PSK_WITH_RC4_128_SHA 0x0300008A +# define TLS1_CK_PSK_WITH_3DES_EDE_CBC_SHA 0x0300008B +# define TLS1_CK_PSK_WITH_AES_128_CBC_SHA 0x0300008C +# define TLS1_CK_PSK_WITH_AES_256_CBC_SHA 0x0300008D + +/* + * Additional TLS ciphersuites from expired Internet Draft + * draft-ietf-tls-56-bit-ciphersuites-01.txt (available if + * TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES is defined, see s3_lib.c). We + * actually treat them like SSL 3.0 ciphers, which we probably shouldn't. + * Note that the first two are actually not in the IDs. + */ +# define TLS1_CK_RSA_EXPORT1024_WITH_RC4_56_MD5 0x03000060/* not in + * ID */ +# define TLS1_CK_RSA_EXPORT1024_WITH_RC2_CBC_56_MD5 0x03000061/* not in + * ID */ +# define TLS1_CK_RSA_EXPORT1024_WITH_DES_CBC_SHA 0x03000062 +# define TLS1_CK_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA 0x03000063 +# define TLS1_CK_RSA_EXPORT1024_WITH_RC4_56_SHA 0x03000064 +# define TLS1_CK_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA 0x03000065 +# define TLS1_CK_DHE_DSS_WITH_RC4_128_SHA 0x03000066 + +/* AES ciphersuites from RFC3268 */ +# define TLS1_CK_RSA_WITH_AES_128_SHA 0x0300002F +# define TLS1_CK_DH_DSS_WITH_AES_128_SHA 0x03000030 +# define TLS1_CK_DH_RSA_WITH_AES_128_SHA 0x03000031 +# define TLS1_CK_DHE_DSS_WITH_AES_128_SHA 0x03000032 +# define TLS1_CK_DHE_RSA_WITH_AES_128_SHA 0x03000033 +# define TLS1_CK_ADH_WITH_AES_128_SHA 0x03000034 + +# define TLS1_CK_RSA_WITH_AES_256_SHA 0x03000035 +# define TLS1_CK_DH_DSS_WITH_AES_256_SHA 0x03000036 +# define TLS1_CK_DH_RSA_WITH_AES_256_SHA 0x03000037 +# define TLS1_CK_DHE_DSS_WITH_AES_256_SHA 0x03000038 +# define TLS1_CK_DHE_RSA_WITH_AES_256_SHA 0x03000039 +# define TLS1_CK_ADH_WITH_AES_256_SHA 0x0300003A + +/* TLS v1.2 ciphersuites */ +# define TLS1_CK_RSA_WITH_NULL_SHA256 0x0300003B +# define TLS1_CK_RSA_WITH_AES_128_SHA256 0x0300003C +# define TLS1_CK_RSA_WITH_AES_256_SHA256 0x0300003D +# define TLS1_CK_DH_DSS_WITH_AES_128_SHA256 0x0300003E +# define TLS1_CK_DH_RSA_WITH_AES_128_SHA256 0x0300003F +# define TLS1_CK_DHE_DSS_WITH_AES_128_SHA256 0x03000040 + +/* Camellia ciphersuites from RFC4132 */ +# define TLS1_CK_RSA_WITH_CAMELLIA_128_CBC_SHA 0x03000041 +# define TLS1_CK_DH_DSS_WITH_CAMELLIA_128_CBC_SHA 0x03000042 +# define TLS1_CK_DH_RSA_WITH_CAMELLIA_128_CBC_SHA 0x03000043 +# define TLS1_CK_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA 0x03000044 +# define TLS1_CK_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA 0x03000045 +# define TLS1_CK_ADH_WITH_CAMELLIA_128_CBC_SHA 0x03000046 + +/* TLS v1.2 ciphersuites */ +# define TLS1_CK_DHE_RSA_WITH_AES_128_SHA256 0x03000067 +# define TLS1_CK_DH_DSS_WITH_AES_256_SHA256 0x03000068 +# define TLS1_CK_DH_RSA_WITH_AES_256_SHA256 0x03000069 +# define TLS1_CK_DHE_DSS_WITH_AES_256_SHA256 0x0300006A +# define TLS1_CK_DHE_RSA_WITH_AES_256_SHA256 0x0300006B +# define TLS1_CK_ADH_WITH_AES_128_SHA256 0x0300006C +# define TLS1_CK_ADH_WITH_AES_256_SHA256 0x0300006D + +/* Camellia ciphersuites from RFC4132 */ +# define TLS1_CK_RSA_WITH_CAMELLIA_256_CBC_SHA 0x03000084 +# define TLS1_CK_DH_DSS_WITH_CAMELLIA_256_CBC_SHA 0x03000085 +# define TLS1_CK_DH_RSA_WITH_CAMELLIA_256_CBC_SHA 0x03000086 +# define TLS1_CK_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA 0x03000087 +# define TLS1_CK_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA 0x03000088 +# define TLS1_CK_ADH_WITH_CAMELLIA_256_CBC_SHA 0x03000089 + +/* SEED ciphersuites from RFC4162 */ +# define TLS1_CK_RSA_WITH_SEED_SHA 0x03000096 +# define TLS1_CK_DH_DSS_WITH_SEED_SHA 0x03000097 +# define TLS1_CK_DH_RSA_WITH_SEED_SHA 0x03000098 +# define TLS1_CK_DHE_DSS_WITH_SEED_SHA 0x03000099 +# define TLS1_CK_DHE_RSA_WITH_SEED_SHA 0x0300009A +# define TLS1_CK_ADH_WITH_SEED_SHA 0x0300009B + +/* TLS v1.2 GCM ciphersuites from RFC5288 */ +# define TLS1_CK_RSA_WITH_AES_128_GCM_SHA256 0x0300009C +# define TLS1_CK_RSA_WITH_AES_256_GCM_SHA384 0x0300009D +# define TLS1_CK_DHE_RSA_WITH_AES_128_GCM_SHA256 0x0300009E +# define TLS1_CK_DHE_RSA_WITH_AES_256_GCM_SHA384 0x0300009F +# define TLS1_CK_DH_RSA_WITH_AES_128_GCM_SHA256 0x030000A0 +# define TLS1_CK_DH_RSA_WITH_AES_256_GCM_SHA384 0x030000A1 +# define TLS1_CK_DHE_DSS_WITH_AES_128_GCM_SHA256 0x030000A2 +# define TLS1_CK_DHE_DSS_WITH_AES_256_GCM_SHA384 0x030000A3 +# define TLS1_CK_DH_DSS_WITH_AES_128_GCM_SHA256 0x030000A4 +# define TLS1_CK_DH_DSS_WITH_AES_256_GCM_SHA384 0x030000A5 +# define TLS1_CK_ADH_WITH_AES_128_GCM_SHA256 0x030000A6 +# define TLS1_CK_ADH_WITH_AES_256_GCM_SHA384 0x030000A7 + +/* + * ECC ciphersuites from draft-ietf-tls-ecc-12.txt with changes soon to be in + * draft 13 + */ +# define TLS1_CK_ECDH_ECDSA_WITH_NULL_SHA 0x0300C001 +# define TLS1_CK_ECDH_ECDSA_WITH_RC4_128_SHA 0x0300C002 +# define TLS1_CK_ECDH_ECDSA_WITH_DES_192_CBC3_SHA 0x0300C003 +# define TLS1_CK_ECDH_ECDSA_WITH_AES_128_CBC_SHA 0x0300C004 +# define TLS1_CK_ECDH_ECDSA_WITH_AES_256_CBC_SHA 0x0300C005 + +# define TLS1_CK_ECDHE_ECDSA_WITH_NULL_SHA 0x0300C006 +# define TLS1_CK_ECDHE_ECDSA_WITH_RC4_128_SHA 0x0300C007 +# define TLS1_CK_ECDHE_ECDSA_WITH_DES_192_CBC3_SHA 0x0300C008 +# define TLS1_CK_ECDHE_ECDSA_WITH_AES_128_CBC_SHA 0x0300C009 +# define TLS1_CK_ECDHE_ECDSA_WITH_AES_256_CBC_SHA 0x0300C00A + +# define TLS1_CK_ECDH_RSA_WITH_NULL_SHA 0x0300C00B +# define TLS1_CK_ECDH_RSA_WITH_RC4_128_SHA 0x0300C00C +# define TLS1_CK_ECDH_RSA_WITH_DES_192_CBC3_SHA 0x0300C00D +# define TLS1_CK_ECDH_RSA_WITH_AES_128_CBC_SHA 0x0300C00E +# define TLS1_CK_ECDH_RSA_WITH_AES_256_CBC_SHA 0x0300C00F + +# define TLS1_CK_ECDHE_RSA_WITH_NULL_SHA 0x0300C010 +# define TLS1_CK_ECDHE_RSA_WITH_RC4_128_SHA 0x0300C011 +# define TLS1_CK_ECDHE_RSA_WITH_DES_192_CBC3_SHA 0x0300C012 +# define TLS1_CK_ECDHE_RSA_WITH_AES_128_CBC_SHA 0x0300C013 +# define TLS1_CK_ECDHE_RSA_WITH_AES_256_CBC_SHA 0x0300C014 + +# define TLS1_CK_ECDH_anon_WITH_NULL_SHA 0x0300C015 +# define TLS1_CK_ECDH_anon_WITH_RC4_128_SHA 0x0300C016 +# define TLS1_CK_ECDH_anon_WITH_DES_192_CBC3_SHA 0x0300C017 +# define TLS1_CK_ECDH_anon_WITH_AES_128_CBC_SHA 0x0300C018 +# define TLS1_CK_ECDH_anon_WITH_AES_256_CBC_SHA 0x0300C019 + +/* SRP ciphersuites from RFC 5054 */ +# define TLS1_CK_SRP_SHA_WITH_3DES_EDE_CBC_SHA 0x0300C01A +# define TLS1_CK_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA 0x0300C01B +# define TLS1_CK_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA 0x0300C01C +# define TLS1_CK_SRP_SHA_WITH_AES_128_CBC_SHA 0x0300C01D +# define TLS1_CK_SRP_SHA_RSA_WITH_AES_128_CBC_SHA 0x0300C01E +# define TLS1_CK_SRP_SHA_DSS_WITH_AES_128_CBC_SHA 0x0300C01F +# define TLS1_CK_SRP_SHA_WITH_AES_256_CBC_SHA 0x0300C020 +# define TLS1_CK_SRP_SHA_RSA_WITH_AES_256_CBC_SHA 0x0300C021 +# define TLS1_CK_SRP_SHA_DSS_WITH_AES_256_CBC_SHA 0x0300C022 + +/* ECDH HMAC based ciphersuites from RFC5289 */ + +# define TLS1_CK_ECDHE_ECDSA_WITH_AES_128_SHA256 0x0300C023 +# define TLS1_CK_ECDHE_ECDSA_WITH_AES_256_SHA384 0x0300C024 +# define TLS1_CK_ECDH_ECDSA_WITH_AES_128_SHA256 0x0300C025 +# define TLS1_CK_ECDH_ECDSA_WITH_AES_256_SHA384 0x0300C026 +# define TLS1_CK_ECDHE_RSA_WITH_AES_128_SHA256 0x0300C027 +# define TLS1_CK_ECDHE_RSA_WITH_AES_256_SHA384 0x0300C028 +# define TLS1_CK_ECDH_RSA_WITH_AES_128_SHA256 0x0300C029 +# define TLS1_CK_ECDH_RSA_WITH_AES_256_SHA384 0x0300C02A + +/* ECDH GCM based ciphersuites from RFC5289 */ +# define TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 0x0300C02B +# define TLS1_CK_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 0x0300C02C +# define TLS1_CK_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 0x0300C02D +# define TLS1_CK_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 0x0300C02E +# define TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256 0x0300C02F +# define TLS1_CK_ECDHE_RSA_WITH_AES_256_GCM_SHA384 0x0300C030 +# define TLS1_CK_ECDH_RSA_WITH_AES_128_GCM_SHA256 0x0300C031 +# define TLS1_CK_ECDH_RSA_WITH_AES_256_GCM_SHA384 0x0300C032 + +/* + * XXX * Backward compatibility alert: + * Older versions of OpenSSL gave + * some DHE ciphers names with "EDH" + * instead of "DHE". Going forward, we + * should be using DHE + * everywhere, though we may indefinitely maintain + * aliases for users + * or configurations that used "EDH" + + */ +# define TLS1_TXT_RSA_EXPORT1024_WITH_RC4_56_MD5 "EXP1024-RC4-MD5" +# define TLS1_TXT_RSA_EXPORT1024_WITH_RC2_CBC_56_MD5 "EXP1024-RC2-CBC-MD5" +# define TLS1_TXT_RSA_EXPORT1024_WITH_DES_CBC_SHA "EXP1024-DES-CBC-SHA" +# define TLS1_TXT_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA "EXP1024-DHE-DSS-DES-CBC-SHA" +# define TLS1_TXT_RSA_EXPORT1024_WITH_RC4_56_SHA "EXP1024-RC4-SHA" +# define TLS1_TXT_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA "EXP1024-DHE-DSS-RC4-SHA" +# define TLS1_TXT_DHE_DSS_WITH_RC4_128_SHA "DHE-DSS-RC4-SHA" + +/* AES ciphersuites from RFC3268 */ +# define TLS1_TXT_RSA_WITH_AES_128_SHA "AES128-SHA" +# define TLS1_TXT_DH_DSS_WITH_AES_128_SHA "DH-DSS-AES128-SHA" +# define TLS1_TXT_DH_RSA_WITH_AES_128_SHA "DH-RSA-AES128-SHA" +# define TLS1_TXT_DHE_DSS_WITH_AES_128_SHA "DHE-DSS-AES128-SHA" +# define TLS1_TXT_DHE_RSA_WITH_AES_128_SHA "DHE-RSA-AES128-SHA" +# define TLS1_TXT_ADH_WITH_AES_128_SHA "ADH-AES128-SHA" + +# define TLS1_TXT_RSA_WITH_AES_256_SHA "AES256-SHA" +# define TLS1_TXT_DH_DSS_WITH_AES_256_SHA "DH-DSS-AES256-SHA" +# define TLS1_TXT_DH_RSA_WITH_AES_256_SHA "DH-RSA-AES256-SHA" +# define TLS1_TXT_DHE_DSS_WITH_AES_256_SHA "DHE-DSS-AES256-SHA" +# define TLS1_TXT_DHE_RSA_WITH_AES_256_SHA "DHE-RSA-AES256-SHA" +# define TLS1_TXT_ADH_WITH_AES_256_SHA "ADH-AES256-SHA" + +/* ECC ciphersuites from RFC4492 */ +# define TLS1_TXT_ECDH_ECDSA_WITH_NULL_SHA "ECDH-ECDSA-NULL-SHA" +# define TLS1_TXT_ECDH_ECDSA_WITH_RC4_128_SHA "ECDH-ECDSA-RC4-SHA" +# define TLS1_TXT_ECDH_ECDSA_WITH_DES_192_CBC3_SHA "ECDH-ECDSA-DES-CBC3-SHA" +# define TLS1_TXT_ECDH_ECDSA_WITH_AES_128_CBC_SHA "ECDH-ECDSA-AES128-SHA" +# define TLS1_TXT_ECDH_ECDSA_WITH_AES_256_CBC_SHA "ECDH-ECDSA-AES256-SHA" + +# define TLS1_TXT_ECDHE_ECDSA_WITH_NULL_SHA "ECDHE-ECDSA-NULL-SHA" +# define TLS1_TXT_ECDHE_ECDSA_WITH_RC4_128_SHA "ECDHE-ECDSA-RC4-SHA" +# define TLS1_TXT_ECDHE_ECDSA_WITH_DES_192_CBC3_SHA "ECDHE-ECDSA-DES-CBC3-SHA" +# define TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_CBC_SHA "ECDHE-ECDSA-AES128-SHA" +# define TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_CBC_SHA "ECDHE-ECDSA-AES256-SHA" + +# define TLS1_TXT_ECDH_RSA_WITH_NULL_SHA "ECDH-RSA-NULL-SHA" +# define TLS1_TXT_ECDH_RSA_WITH_RC4_128_SHA "ECDH-RSA-RC4-SHA" +# define TLS1_TXT_ECDH_RSA_WITH_DES_192_CBC3_SHA "ECDH-RSA-DES-CBC3-SHA" +# define TLS1_TXT_ECDH_RSA_WITH_AES_128_CBC_SHA "ECDH-RSA-AES128-SHA" +# define TLS1_TXT_ECDH_RSA_WITH_AES_256_CBC_SHA "ECDH-RSA-AES256-SHA" + +# define TLS1_TXT_ECDHE_RSA_WITH_NULL_SHA "ECDHE-RSA-NULL-SHA" +# define TLS1_TXT_ECDHE_RSA_WITH_RC4_128_SHA "ECDHE-RSA-RC4-SHA" +# define TLS1_TXT_ECDHE_RSA_WITH_DES_192_CBC3_SHA "ECDHE-RSA-DES-CBC3-SHA" +# define TLS1_TXT_ECDHE_RSA_WITH_AES_128_CBC_SHA "ECDHE-RSA-AES128-SHA" +# define TLS1_TXT_ECDHE_RSA_WITH_AES_256_CBC_SHA "ECDHE-RSA-AES256-SHA" + +# define TLS1_TXT_ECDH_anon_WITH_NULL_SHA "AECDH-NULL-SHA" +# define TLS1_TXT_ECDH_anon_WITH_RC4_128_SHA "AECDH-RC4-SHA" +# define TLS1_TXT_ECDH_anon_WITH_DES_192_CBC3_SHA "AECDH-DES-CBC3-SHA" +# define TLS1_TXT_ECDH_anon_WITH_AES_128_CBC_SHA "AECDH-AES128-SHA" +# define TLS1_TXT_ECDH_anon_WITH_AES_256_CBC_SHA "AECDH-AES256-SHA" + +/* PSK ciphersuites from RFC 4279 */ +# define TLS1_TXT_PSK_WITH_RC4_128_SHA "PSK-RC4-SHA" +# define TLS1_TXT_PSK_WITH_3DES_EDE_CBC_SHA "PSK-3DES-EDE-CBC-SHA" +# define TLS1_TXT_PSK_WITH_AES_128_CBC_SHA "PSK-AES128-CBC-SHA" +# define TLS1_TXT_PSK_WITH_AES_256_CBC_SHA "PSK-AES256-CBC-SHA" + +/* SRP ciphersuite from RFC 5054 */ +# define TLS1_TXT_SRP_SHA_WITH_3DES_EDE_CBC_SHA "SRP-3DES-EDE-CBC-SHA" +# define TLS1_TXT_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA "SRP-RSA-3DES-EDE-CBC-SHA" +# define TLS1_TXT_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA "SRP-DSS-3DES-EDE-CBC-SHA" +# define TLS1_TXT_SRP_SHA_WITH_AES_128_CBC_SHA "SRP-AES-128-CBC-SHA" +# define TLS1_TXT_SRP_SHA_RSA_WITH_AES_128_CBC_SHA "SRP-RSA-AES-128-CBC-SHA" +# define TLS1_TXT_SRP_SHA_DSS_WITH_AES_128_CBC_SHA "SRP-DSS-AES-128-CBC-SHA" +# define TLS1_TXT_SRP_SHA_WITH_AES_256_CBC_SHA "SRP-AES-256-CBC-SHA" +# define TLS1_TXT_SRP_SHA_RSA_WITH_AES_256_CBC_SHA "SRP-RSA-AES-256-CBC-SHA" +# define TLS1_TXT_SRP_SHA_DSS_WITH_AES_256_CBC_SHA "SRP-DSS-AES-256-CBC-SHA" + +/* Camellia ciphersuites from RFC4132 */ +# define TLS1_TXT_RSA_WITH_CAMELLIA_128_CBC_SHA "CAMELLIA128-SHA" +# define TLS1_TXT_DH_DSS_WITH_CAMELLIA_128_CBC_SHA "DH-DSS-CAMELLIA128-SHA" +# define TLS1_TXT_DH_RSA_WITH_CAMELLIA_128_CBC_SHA "DH-RSA-CAMELLIA128-SHA" +# define TLS1_TXT_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA "DHE-DSS-CAMELLIA128-SHA" +# define TLS1_TXT_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA "DHE-RSA-CAMELLIA128-SHA" +# define TLS1_TXT_ADH_WITH_CAMELLIA_128_CBC_SHA "ADH-CAMELLIA128-SHA" + +# define TLS1_TXT_RSA_WITH_CAMELLIA_256_CBC_SHA "CAMELLIA256-SHA" +# define TLS1_TXT_DH_DSS_WITH_CAMELLIA_256_CBC_SHA "DH-DSS-CAMELLIA256-SHA" +# define TLS1_TXT_DH_RSA_WITH_CAMELLIA_256_CBC_SHA "DH-RSA-CAMELLIA256-SHA" +# define TLS1_TXT_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA "DHE-DSS-CAMELLIA256-SHA" +# define TLS1_TXT_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA "DHE-RSA-CAMELLIA256-SHA" +# define TLS1_TXT_ADH_WITH_CAMELLIA_256_CBC_SHA "ADH-CAMELLIA256-SHA" + +/* SEED ciphersuites from RFC4162 */ +# define TLS1_TXT_RSA_WITH_SEED_SHA "SEED-SHA" +# define TLS1_TXT_DH_DSS_WITH_SEED_SHA "DH-DSS-SEED-SHA" +# define TLS1_TXT_DH_RSA_WITH_SEED_SHA "DH-RSA-SEED-SHA" +# define TLS1_TXT_DHE_DSS_WITH_SEED_SHA "DHE-DSS-SEED-SHA" +# define TLS1_TXT_DHE_RSA_WITH_SEED_SHA "DHE-RSA-SEED-SHA" +# define TLS1_TXT_ADH_WITH_SEED_SHA "ADH-SEED-SHA" + +/* TLS v1.2 ciphersuites */ +# define TLS1_TXT_RSA_WITH_NULL_SHA256 "NULL-SHA256" +# define TLS1_TXT_RSA_WITH_AES_128_SHA256 "AES128-SHA256" +# define TLS1_TXT_RSA_WITH_AES_256_SHA256 "AES256-SHA256" +# define TLS1_TXT_DH_DSS_WITH_AES_128_SHA256 "DH-DSS-AES128-SHA256" +# define TLS1_TXT_DH_RSA_WITH_AES_128_SHA256 "DH-RSA-AES128-SHA256" +# define TLS1_TXT_DHE_DSS_WITH_AES_128_SHA256 "DHE-DSS-AES128-SHA256" +# define TLS1_TXT_DHE_RSA_WITH_AES_128_SHA256 "DHE-RSA-AES128-SHA256" +# define TLS1_TXT_DH_DSS_WITH_AES_256_SHA256 "DH-DSS-AES256-SHA256" +# define TLS1_TXT_DH_RSA_WITH_AES_256_SHA256 "DH-RSA-AES256-SHA256" +# define TLS1_TXT_DHE_DSS_WITH_AES_256_SHA256 "DHE-DSS-AES256-SHA256" +# define TLS1_TXT_DHE_RSA_WITH_AES_256_SHA256 "DHE-RSA-AES256-SHA256" +# define TLS1_TXT_ADH_WITH_AES_128_SHA256 "ADH-AES128-SHA256" +# define TLS1_TXT_ADH_WITH_AES_256_SHA256 "ADH-AES256-SHA256" + +/* TLS v1.2 GCM ciphersuites from RFC5288 */ +# define TLS1_TXT_RSA_WITH_AES_128_GCM_SHA256 "AES128-GCM-SHA256" +# define TLS1_TXT_RSA_WITH_AES_256_GCM_SHA384 "AES256-GCM-SHA384" +# define TLS1_TXT_DHE_RSA_WITH_AES_128_GCM_SHA256 "DHE-RSA-AES128-GCM-SHA256" +# define TLS1_TXT_DHE_RSA_WITH_AES_256_GCM_SHA384 "DHE-RSA-AES256-GCM-SHA384" +# define TLS1_TXT_DH_RSA_WITH_AES_128_GCM_SHA256 "DH-RSA-AES128-GCM-SHA256" +# define TLS1_TXT_DH_RSA_WITH_AES_256_GCM_SHA384 "DH-RSA-AES256-GCM-SHA384" +# define TLS1_TXT_DHE_DSS_WITH_AES_128_GCM_SHA256 "DHE-DSS-AES128-GCM-SHA256" +# define TLS1_TXT_DHE_DSS_WITH_AES_256_GCM_SHA384 "DHE-DSS-AES256-GCM-SHA384" +# define TLS1_TXT_DH_DSS_WITH_AES_128_GCM_SHA256 "DH-DSS-AES128-GCM-SHA256" +# define TLS1_TXT_DH_DSS_WITH_AES_256_GCM_SHA384 "DH-DSS-AES256-GCM-SHA384" +# define TLS1_TXT_ADH_WITH_AES_128_GCM_SHA256 "ADH-AES128-GCM-SHA256" +# define TLS1_TXT_ADH_WITH_AES_256_GCM_SHA384 "ADH-AES256-GCM-SHA384" + +/* ECDH HMAC based ciphersuites from RFC5289 */ + +# define TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_SHA256 "ECDHE-ECDSA-AES128-SHA256" +# define TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_SHA384 "ECDHE-ECDSA-AES256-SHA384" +# define TLS1_TXT_ECDH_ECDSA_WITH_AES_128_SHA256 "ECDH-ECDSA-AES128-SHA256" +# define TLS1_TXT_ECDH_ECDSA_WITH_AES_256_SHA384 "ECDH-ECDSA-AES256-SHA384" +# define TLS1_TXT_ECDHE_RSA_WITH_AES_128_SHA256 "ECDHE-RSA-AES128-SHA256" +# define TLS1_TXT_ECDHE_RSA_WITH_AES_256_SHA384 "ECDHE-RSA-AES256-SHA384" +# define TLS1_TXT_ECDH_RSA_WITH_AES_128_SHA256 "ECDH-RSA-AES128-SHA256" +# define TLS1_TXT_ECDH_RSA_WITH_AES_256_SHA384 "ECDH-RSA-AES256-SHA384" + +/* ECDH GCM based ciphersuites from RFC5289 */ +# define TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 "ECDHE-ECDSA-AES128-GCM-SHA256" +# define TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 "ECDHE-ECDSA-AES256-GCM-SHA384" +# define TLS1_TXT_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 "ECDH-ECDSA-AES128-GCM-SHA256" +# define TLS1_TXT_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 "ECDH-ECDSA-AES256-GCM-SHA384" +# define TLS1_TXT_ECDHE_RSA_WITH_AES_128_GCM_SHA256 "ECDHE-RSA-AES128-GCM-SHA256" +# define TLS1_TXT_ECDHE_RSA_WITH_AES_256_GCM_SHA384 "ECDHE-RSA-AES256-GCM-SHA384" +# define TLS1_TXT_ECDH_RSA_WITH_AES_128_GCM_SHA256 "ECDH-RSA-AES128-GCM-SHA256" +# define TLS1_TXT_ECDH_RSA_WITH_AES_256_GCM_SHA384 "ECDH-RSA-AES256-GCM-SHA384" + +# define TLS_CT_RSA_SIGN 1 +# define TLS_CT_DSS_SIGN 2 +# define TLS_CT_RSA_FIXED_DH 3 +# define TLS_CT_DSS_FIXED_DH 4 +# define TLS_CT_ECDSA_SIGN 64 +# define TLS_CT_RSA_FIXED_ECDH 65 +# define TLS_CT_ECDSA_FIXED_ECDH 66 +# define TLS_CT_GOST94_SIGN 21 +# define TLS_CT_GOST01_SIGN 22 +/* + * when correcting this number, correct also SSL3_CT_NUMBER in ssl3.h (see + * comment there) + */ +# define TLS_CT_NUMBER 9 + +# define TLS1_FINISH_MAC_LENGTH 12 + +# define TLS_MD_MAX_CONST_SIZE 20 +# define TLS_MD_CLIENT_FINISH_CONST "client finished" +# define TLS_MD_CLIENT_FINISH_CONST_SIZE 15 +# define TLS_MD_SERVER_FINISH_CONST "server finished" +# define TLS_MD_SERVER_FINISH_CONST_SIZE 15 +# define TLS_MD_SERVER_WRITE_KEY_CONST "server write key" +# define TLS_MD_SERVER_WRITE_KEY_CONST_SIZE 16 +# define TLS_MD_KEY_EXPANSION_CONST "key expansion" +# define TLS_MD_KEY_EXPANSION_CONST_SIZE 13 +# define TLS_MD_CLIENT_WRITE_KEY_CONST "client write key" +# define TLS_MD_CLIENT_WRITE_KEY_CONST_SIZE 16 +# define TLS_MD_SERVER_WRITE_KEY_CONST "server write key" +# define TLS_MD_SERVER_WRITE_KEY_CONST_SIZE 16 +# define TLS_MD_IV_BLOCK_CONST "IV block" +# define TLS_MD_IV_BLOCK_CONST_SIZE 8 +# define TLS_MD_MASTER_SECRET_CONST "master secret" +# define TLS_MD_MASTER_SECRET_CONST_SIZE 13 + +# ifdef CHARSET_EBCDIC +# undef TLS_MD_CLIENT_FINISH_CONST +/* + * client finished + */ +# define TLS_MD_CLIENT_FINISH_CONST "\x63\x6c\x69\x65\x6e\x74\x20\x66\x69\x6e\x69\x73\x68\x65\x64" + +# undef TLS_MD_SERVER_FINISH_CONST +/* + * server finished + */ +# define TLS_MD_SERVER_FINISH_CONST "\x73\x65\x72\x76\x65\x72\x20\x66\x69\x6e\x69\x73\x68\x65\x64" + +# undef TLS_MD_SERVER_WRITE_KEY_CONST +/* + * server write key + */ +# define TLS_MD_SERVER_WRITE_KEY_CONST "\x73\x65\x72\x76\x65\x72\x20\x77\x72\x69\x74\x65\x20\x6b\x65\x79" + +# undef TLS_MD_KEY_EXPANSION_CONST +/* + * key expansion + */ +# define TLS_MD_KEY_EXPANSION_CONST "\x6b\x65\x79\x20\x65\x78\x70\x61\x6e\x73\x69\x6f\x6e" + +# undef TLS_MD_CLIENT_WRITE_KEY_CONST +/* + * client write key + */ +# define TLS_MD_CLIENT_WRITE_KEY_CONST "\x63\x6c\x69\x65\x6e\x74\x20\x77\x72\x69\x74\x65\x20\x6b\x65\x79" + +# undef TLS_MD_SERVER_WRITE_KEY_CONST +/* + * server write key + */ +# define TLS_MD_SERVER_WRITE_KEY_CONST "\x73\x65\x72\x76\x65\x72\x20\x77\x72\x69\x74\x65\x20\x6b\x65\x79" + +# undef TLS_MD_IV_BLOCK_CONST +/* + * IV block + */ +# define TLS_MD_IV_BLOCK_CONST "\x49\x56\x20\x62\x6c\x6f\x63\x6b" + +# undef TLS_MD_MASTER_SECRET_CONST +/* + * master secret + */ +# define TLS_MD_MASTER_SECRET_CONST "\x6d\x61\x73\x74\x65\x72\x20\x73\x65\x63\x72\x65\x74" +# endif + +/* TLS Session Ticket extension struct */ +struct tls_session_ticket_ext_st { + unsigned short length; + void *data; +}; + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/ts.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/ts.h new file mode 100644 index 0000000..2daa1b2 --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/ts.h @@ -0,0 +1,865 @@ +/* crypto/ts/ts.h */ +/* + * Written by Zoltan Glozik (zglozik@opentsa.org) for the OpenSSL project + * 2002, 2003, 2004. + */ +/* ==================================================================== + * Copyright (c) 2006 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_TS_H +# define HEADER_TS_H + +# include +# include +# ifndef OPENSSL_NO_BUFFER +# include +# endif +# ifndef OPENSSL_NO_EVP +# include +# endif +# ifndef OPENSSL_NO_BIO +# include +# endif +# include +# include +# include + +# ifndef OPENSSL_NO_RSA +# include +# endif + +# ifndef OPENSSL_NO_DSA +# include +# endif + +# ifndef OPENSSL_NO_DH +# include +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +# ifdef WIN32 +/* Under Win32 this is defined in wincrypt.h */ +# undef X509_NAME +# endif + +# include +# include + +/*- +MessageImprint ::= SEQUENCE { + hashAlgorithm AlgorithmIdentifier, + hashedMessage OCTET STRING } +*/ + +typedef struct TS_msg_imprint_st { + X509_ALGOR *hash_algo; + ASN1_OCTET_STRING *hashed_msg; +} TS_MSG_IMPRINT; + +/*- +TimeStampReq ::= SEQUENCE { + version INTEGER { v1(1) }, + messageImprint MessageImprint, + --a hash algorithm OID and the hash value of the data to be + --time-stamped + reqPolicy TSAPolicyId OPTIONAL, + nonce INTEGER OPTIONAL, + certReq BOOLEAN DEFAULT FALSE, + extensions [0] IMPLICIT Extensions OPTIONAL } +*/ + +typedef struct TS_req_st { + ASN1_INTEGER *version; + TS_MSG_IMPRINT *msg_imprint; + ASN1_OBJECT *policy_id; /* OPTIONAL */ + ASN1_INTEGER *nonce; /* OPTIONAL */ + ASN1_BOOLEAN cert_req; /* DEFAULT FALSE */ + STACK_OF(X509_EXTENSION) *extensions; /* [0] OPTIONAL */ +} TS_REQ; + +/*- +Accuracy ::= SEQUENCE { + seconds INTEGER OPTIONAL, + millis [0] INTEGER (1..999) OPTIONAL, + micros [1] INTEGER (1..999) OPTIONAL } +*/ + +typedef struct TS_accuracy_st { + ASN1_INTEGER *seconds; + ASN1_INTEGER *millis; + ASN1_INTEGER *micros; +} TS_ACCURACY; + +/*- +TSTInfo ::= SEQUENCE { + version INTEGER { v1(1) }, + policy TSAPolicyId, + messageImprint MessageImprint, + -- MUST have the same value as the similar field in + -- TimeStampReq + serialNumber INTEGER, + -- Time-Stamping users MUST be ready to accommodate integers + -- up to 160 bits. + genTime GeneralizedTime, + accuracy Accuracy OPTIONAL, + ordering BOOLEAN DEFAULT FALSE, + nonce INTEGER OPTIONAL, + -- MUST be present if the similar field was present + -- in TimeStampReq. In that case it MUST have the same value. + tsa [0] GeneralName OPTIONAL, + extensions [1] IMPLICIT Extensions OPTIONAL } +*/ + +typedef struct TS_tst_info_st { + ASN1_INTEGER *version; + ASN1_OBJECT *policy_id; + TS_MSG_IMPRINT *msg_imprint; + ASN1_INTEGER *serial; + ASN1_GENERALIZEDTIME *time; + TS_ACCURACY *accuracy; + ASN1_BOOLEAN ordering; + ASN1_INTEGER *nonce; + GENERAL_NAME *tsa; + STACK_OF(X509_EXTENSION) *extensions; +} TS_TST_INFO; + +/*- +PKIStatusInfo ::= SEQUENCE { + status PKIStatus, + statusString PKIFreeText OPTIONAL, + failInfo PKIFailureInfo OPTIONAL } + +From RFC 1510 - section 3.1.1: +PKIFreeText ::= SEQUENCE SIZE (1..MAX) OF UTF8String + -- text encoded as UTF-8 String (note: each UTF8String SHOULD + -- include an RFC 1766 language tag to indicate the language + -- of the contained text) +*/ + +/* Possible values for status. See ts_resp_print.c && ts_resp_verify.c. */ + +# define TS_STATUS_GRANTED 0 +# define TS_STATUS_GRANTED_WITH_MODS 1 +# define TS_STATUS_REJECTION 2 +# define TS_STATUS_WAITING 3 +# define TS_STATUS_REVOCATION_WARNING 4 +# define TS_STATUS_REVOCATION_NOTIFICATION 5 + +/* + * Possible values for failure_info. See ts_resp_print.c && ts_resp_verify.c + */ + +# define TS_INFO_BAD_ALG 0 +# define TS_INFO_BAD_REQUEST 2 +# define TS_INFO_BAD_DATA_FORMAT 5 +# define TS_INFO_TIME_NOT_AVAILABLE 14 +# define TS_INFO_UNACCEPTED_POLICY 15 +# define TS_INFO_UNACCEPTED_EXTENSION 16 +# define TS_INFO_ADD_INFO_NOT_AVAILABLE 17 +# define TS_INFO_SYSTEM_FAILURE 25 + +typedef struct TS_status_info_st { + ASN1_INTEGER *status; + STACK_OF(ASN1_UTF8STRING) *text; + ASN1_BIT_STRING *failure_info; +} TS_STATUS_INFO; + +DECLARE_STACK_OF(ASN1_UTF8STRING) +DECLARE_ASN1_SET_OF(ASN1_UTF8STRING) + +/*- +TimeStampResp ::= SEQUENCE { + status PKIStatusInfo, + timeStampToken TimeStampToken OPTIONAL } +*/ + +typedef struct TS_resp_st { + TS_STATUS_INFO *status_info; + PKCS7 *token; + TS_TST_INFO *tst_info; +} TS_RESP; + +/* The structure below would belong to the ESS component. */ + +/*- +IssuerSerial ::= SEQUENCE { + issuer GeneralNames, + serialNumber CertificateSerialNumber + } +*/ + +typedef struct ESS_issuer_serial { + STACK_OF(GENERAL_NAME) *issuer; + ASN1_INTEGER *serial; +} ESS_ISSUER_SERIAL; + +/*- +ESSCertID ::= SEQUENCE { + certHash Hash, + issuerSerial IssuerSerial OPTIONAL +} +*/ + +typedef struct ESS_cert_id { + ASN1_OCTET_STRING *hash; /* Always SHA-1 digest. */ + ESS_ISSUER_SERIAL *issuer_serial; +} ESS_CERT_ID; + +DECLARE_STACK_OF(ESS_CERT_ID) +DECLARE_ASN1_SET_OF(ESS_CERT_ID) + +/*- +SigningCertificate ::= SEQUENCE { + certs SEQUENCE OF ESSCertID, + policies SEQUENCE OF PolicyInformation OPTIONAL +} +*/ + +typedef struct ESS_signing_cert { + STACK_OF(ESS_CERT_ID) *cert_ids; + STACK_OF(POLICYINFO) *policy_info; +} ESS_SIGNING_CERT; + +TS_REQ *TS_REQ_new(void); +void TS_REQ_free(TS_REQ *a); +int i2d_TS_REQ(const TS_REQ *a, unsigned char **pp); +TS_REQ *d2i_TS_REQ(TS_REQ **a, const unsigned char **pp, long length); + +TS_REQ *TS_REQ_dup(TS_REQ *a); + +TS_REQ *d2i_TS_REQ_fp(FILE *fp, TS_REQ **a); +int i2d_TS_REQ_fp(FILE *fp, TS_REQ *a); +TS_REQ *d2i_TS_REQ_bio(BIO *fp, TS_REQ **a); +int i2d_TS_REQ_bio(BIO *fp, TS_REQ *a); + +TS_MSG_IMPRINT *TS_MSG_IMPRINT_new(void); +void TS_MSG_IMPRINT_free(TS_MSG_IMPRINT *a); +int i2d_TS_MSG_IMPRINT(const TS_MSG_IMPRINT *a, unsigned char **pp); +TS_MSG_IMPRINT *d2i_TS_MSG_IMPRINT(TS_MSG_IMPRINT **a, + const unsigned char **pp, long length); + +TS_MSG_IMPRINT *TS_MSG_IMPRINT_dup(TS_MSG_IMPRINT *a); + +TS_MSG_IMPRINT *d2i_TS_MSG_IMPRINT_fp(FILE *fp, TS_MSG_IMPRINT **a); +int i2d_TS_MSG_IMPRINT_fp(FILE *fp, TS_MSG_IMPRINT *a); +TS_MSG_IMPRINT *d2i_TS_MSG_IMPRINT_bio(BIO *fp, TS_MSG_IMPRINT **a); +int i2d_TS_MSG_IMPRINT_bio(BIO *fp, TS_MSG_IMPRINT *a); + +TS_RESP *TS_RESP_new(void); +void TS_RESP_free(TS_RESP *a); +int i2d_TS_RESP(const TS_RESP *a, unsigned char **pp); +TS_RESP *d2i_TS_RESP(TS_RESP **a, const unsigned char **pp, long length); +TS_TST_INFO *PKCS7_to_TS_TST_INFO(PKCS7 *token); +TS_RESP *TS_RESP_dup(TS_RESP *a); + +TS_RESP *d2i_TS_RESP_fp(FILE *fp, TS_RESP **a); +int i2d_TS_RESP_fp(FILE *fp, TS_RESP *a); +TS_RESP *d2i_TS_RESP_bio(BIO *fp, TS_RESP **a); +int i2d_TS_RESP_bio(BIO *fp, TS_RESP *a); + +TS_STATUS_INFO *TS_STATUS_INFO_new(void); +void TS_STATUS_INFO_free(TS_STATUS_INFO *a); +int i2d_TS_STATUS_INFO(const TS_STATUS_INFO *a, unsigned char **pp); +TS_STATUS_INFO *d2i_TS_STATUS_INFO(TS_STATUS_INFO **a, + const unsigned char **pp, long length); +TS_STATUS_INFO *TS_STATUS_INFO_dup(TS_STATUS_INFO *a); + +TS_TST_INFO *TS_TST_INFO_new(void); +void TS_TST_INFO_free(TS_TST_INFO *a); +int i2d_TS_TST_INFO(const TS_TST_INFO *a, unsigned char **pp); +TS_TST_INFO *d2i_TS_TST_INFO(TS_TST_INFO **a, const unsigned char **pp, + long length); +TS_TST_INFO *TS_TST_INFO_dup(TS_TST_INFO *a); + +TS_TST_INFO *d2i_TS_TST_INFO_fp(FILE *fp, TS_TST_INFO **a); +int i2d_TS_TST_INFO_fp(FILE *fp, TS_TST_INFO *a); +TS_TST_INFO *d2i_TS_TST_INFO_bio(BIO *fp, TS_TST_INFO **a); +int i2d_TS_TST_INFO_bio(BIO *fp, TS_TST_INFO *a); + +TS_ACCURACY *TS_ACCURACY_new(void); +void TS_ACCURACY_free(TS_ACCURACY *a); +int i2d_TS_ACCURACY(const TS_ACCURACY *a, unsigned char **pp); +TS_ACCURACY *d2i_TS_ACCURACY(TS_ACCURACY **a, const unsigned char **pp, + long length); +TS_ACCURACY *TS_ACCURACY_dup(TS_ACCURACY *a); + +ESS_ISSUER_SERIAL *ESS_ISSUER_SERIAL_new(void); +void ESS_ISSUER_SERIAL_free(ESS_ISSUER_SERIAL *a); +int i2d_ESS_ISSUER_SERIAL(const ESS_ISSUER_SERIAL *a, unsigned char **pp); +ESS_ISSUER_SERIAL *d2i_ESS_ISSUER_SERIAL(ESS_ISSUER_SERIAL **a, + const unsigned char **pp, + long length); +ESS_ISSUER_SERIAL *ESS_ISSUER_SERIAL_dup(ESS_ISSUER_SERIAL *a); + +ESS_CERT_ID *ESS_CERT_ID_new(void); +void ESS_CERT_ID_free(ESS_CERT_ID *a); +int i2d_ESS_CERT_ID(const ESS_CERT_ID *a, unsigned char **pp); +ESS_CERT_ID *d2i_ESS_CERT_ID(ESS_CERT_ID **a, const unsigned char **pp, + long length); +ESS_CERT_ID *ESS_CERT_ID_dup(ESS_CERT_ID *a); + +ESS_SIGNING_CERT *ESS_SIGNING_CERT_new(void); +void ESS_SIGNING_CERT_free(ESS_SIGNING_CERT *a); +int i2d_ESS_SIGNING_CERT(const ESS_SIGNING_CERT *a, unsigned char **pp); +ESS_SIGNING_CERT *d2i_ESS_SIGNING_CERT(ESS_SIGNING_CERT **a, + const unsigned char **pp, long length); +ESS_SIGNING_CERT *ESS_SIGNING_CERT_dup(ESS_SIGNING_CERT *a); + +void ERR_load_TS_strings(void); + +int TS_REQ_set_version(TS_REQ *a, long version); +long TS_REQ_get_version(const TS_REQ *a); + +int TS_REQ_set_msg_imprint(TS_REQ *a, TS_MSG_IMPRINT *msg_imprint); +TS_MSG_IMPRINT *TS_REQ_get_msg_imprint(TS_REQ *a); + +int TS_MSG_IMPRINT_set_algo(TS_MSG_IMPRINT *a, X509_ALGOR *alg); +X509_ALGOR *TS_MSG_IMPRINT_get_algo(TS_MSG_IMPRINT *a); + +int TS_MSG_IMPRINT_set_msg(TS_MSG_IMPRINT *a, unsigned char *d, int len); +ASN1_OCTET_STRING *TS_MSG_IMPRINT_get_msg(TS_MSG_IMPRINT *a); + +int TS_REQ_set_policy_id(TS_REQ *a, ASN1_OBJECT *policy); +ASN1_OBJECT *TS_REQ_get_policy_id(TS_REQ *a); + +int TS_REQ_set_nonce(TS_REQ *a, const ASN1_INTEGER *nonce); +const ASN1_INTEGER *TS_REQ_get_nonce(const TS_REQ *a); + +int TS_REQ_set_cert_req(TS_REQ *a, int cert_req); +int TS_REQ_get_cert_req(const TS_REQ *a); + +STACK_OF(X509_EXTENSION) *TS_REQ_get_exts(TS_REQ *a); +void TS_REQ_ext_free(TS_REQ *a); +int TS_REQ_get_ext_count(TS_REQ *a); +int TS_REQ_get_ext_by_NID(TS_REQ *a, int nid, int lastpos); +int TS_REQ_get_ext_by_OBJ(TS_REQ *a, ASN1_OBJECT *obj, int lastpos); +int TS_REQ_get_ext_by_critical(TS_REQ *a, int crit, int lastpos); +X509_EXTENSION *TS_REQ_get_ext(TS_REQ *a, int loc); +X509_EXTENSION *TS_REQ_delete_ext(TS_REQ *a, int loc); +int TS_REQ_add_ext(TS_REQ *a, X509_EXTENSION *ex, int loc); +void *TS_REQ_get_ext_d2i(TS_REQ *a, int nid, int *crit, int *idx); + +/* Function declarations for TS_REQ defined in ts/ts_req_print.c */ + +int TS_REQ_print_bio(BIO *bio, TS_REQ *a); + +/* Function declarations for TS_RESP defined in ts/ts_resp_utils.c */ + +int TS_RESP_set_status_info(TS_RESP *a, TS_STATUS_INFO *info); +TS_STATUS_INFO *TS_RESP_get_status_info(TS_RESP *a); + +/* Caller loses ownership of PKCS7 and TS_TST_INFO objects. */ +void TS_RESP_set_tst_info(TS_RESP *a, PKCS7 *p7, TS_TST_INFO *tst_info); +PKCS7 *TS_RESP_get_token(TS_RESP *a); +TS_TST_INFO *TS_RESP_get_tst_info(TS_RESP *a); + +int TS_TST_INFO_set_version(TS_TST_INFO *a, long version); +long TS_TST_INFO_get_version(const TS_TST_INFO *a); + +int TS_TST_INFO_set_policy_id(TS_TST_INFO *a, ASN1_OBJECT *policy_id); +ASN1_OBJECT *TS_TST_INFO_get_policy_id(TS_TST_INFO *a); + +int TS_TST_INFO_set_msg_imprint(TS_TST_INFO *a, TS_MSG_IMPRINT *msg_imprint); +TS_MSG_IMPRINT *TS_TST_INFO_get_msg_imprint(TS_TST_INFO *a); + +int TS_TST_INFO_set_serial(TS_TST_INFO *a, const ASN1_INTEGER *serial); +const ASN1_INTEGER *TS_TST_INFO_get_serial(const TS_TST_INFO *a); + +int TS_TST_INFO_set_time(TS_TST_INFO *a, const ASN1_GENERALIZEDTIME *gtime); +const ASN1_GENERALIZEDTIME *TS_TST_INFO_get_time(const TS_TST_INFO *a); + +int TS_TST_INFO_set_accuracy(TS_TST_INFO *a, TS_ACCURACY *accuracy); +TS_ACCURACY *TS_TST_INFO_get_accuracy(TS_TST_INFO *a); + +int TS_ACCURACY_set_seconds(TS_ACCURACY *a, const ASN1_INTEGER *seconds); +const ASN1_INTEGER *TS_ACCURACY_get_seconds(const TS_ACCURACY *a); + +int TS_ACCURACY_set_millis(TS_ACCURACY *a, const ASN1_INTEGER *millis); +const ASN1_INTEGER *TS_ACCURACY_get_millis(const TS_ACCURACY *a); + +int TS_ACCURACY_set_micros(TS_ACCURACY *a, const ASN1_INTEGER *micros); +const ASN1_INTEGER *TS_ACCURACY_get_micros(const TS_ACCURACY *a); + +int TS_TST_INFO_set_ordering(TS_TST_INFO *a, int ordering); +int TS_TST_INFO_get_ordering(const TS_TST_INFO *a); + +int TS_TST_INFO_set_nonce(TS_TST_INFO *a, const ASN1_INTEGER *nonce); +const ASN1_INTEGER *TS_TST_INFO_get_nonce(const TS_TST_INFO *a); + +int TS_TST_INFO_set_tsa(TS_TST_INFO *a, GENERAL_NAME *tsa); +GENERAL_NAME *TS_TST_INFO_get_tsa(TS_TST_INFO *a); + +STACK_OF(X509_EXTENSION) *TS_TST_INFO_get_exts(TS_TST_INFO *a); +void TS_TST_INFO_ext_free(TS_TST_INFO *a); +int TS_TST_INFO_get_ext_count(TS_TST_INFO *a); +int TS_TST_INFO_get_ext_by_NID(TS_TST_INFO *a, int nid, int lastpos); +int TS_TST_INFO_get_ext_by_OBJ(TS_TST_INFO *a, ASN1_OBJECT *obj, int lastpos); +int TS_TST_INFO_get_ext_by_critical(TS_TST_INFO *a, int crit, int lastpos); +X509_EXTENSION *TS_TST_INFO_get_ext(TS_TST_INFO *a, int loc); +X509_EXTENSION *TS_TST_INFO_delete_ext(TS_TST_INFO *a, int loc); +int TS_TST_INFO_add_ext(TS_TST_INFO *a, X509_EXTENSION *ex, int loc); +void *TS_TST_INFO_get_ext_d2i(TS_TST_INFO *a, int nid, int *crit, int *idx); + +/* + * Declarations related to response generation, defined in ts/ts_resp_sign.c. + */ + +/* Optional flags for response generation. */ + +/* Don't include the TSA name in response. */ +# define TS_TSA_NAME 0x01 + +/* Set ordering to true in response. */ +# define TS_ORDERING 0x02 + +/* + * Include the signer certificate and the other specified certificates in + * the ESS signing certificate attribute beside the PKCS7 signed data. + * Only the signer certificates is included by default. + */ +# define TS_ESS_CERT_ID_CHAIN 0x04 + +/* Forward declaration. */ +struct TS_resp_ctx; + +/* This must return a unique number less than 160 bits long. */ +typedef ASN1_INTEGER *(*TS_serial_cb) (struct TS_resp_ctx *, void *); + +/* + * This must return the seconds and microseconds since Jan 1, 1970 in the sec + * and usec variables allocated by the caller. Return non-zero for success + * and zero for failure. + */ +typedef int (*TS_time_cb) (struct TS_resp_ctx *, void *, long *sec, + long *usec); + +/* + * This must process the given extension. It can modify the TS_TST_INFO + * object of the context. Return values: !0 (processed), 0 (error, it must + * set the status info/failure info of the response). + */ +typedef int (*TS_extension_cb) (struct TS_resp_ctx *, X509_EXTENSION *, + void *); + +typedef struct TS_resp_ctx { + X509 *signer_cert; + EVP_PKEY *signer_key; + STACK_OF(X509) *certs; /* Certs to include in signed data. */ + STACK_OF(ASN1_OBJECT) *policies; /* Acceptable policies. */ + ASN1_OBJECT *default_policy; /* It may appear in policies, too. */ + STACK_OF(EVP_MD) *mds; /* Acceptable message digests. */ + ASN1_INTEGER *seconds; /* accuracy, 0 means not specified. */ + ASN1_INTEGER *millis; /* accuracy, 0 means not specified. */ + ASN1_INTEGER *micros; /* accuracy, 0 means not specified. */ + unsigned clock_precision_digits; /* fraction of seconds in time stamp + * token. */ + unsigned flags; /* Optional info, see values above. */ + /* Callback functions. */ + TS_serial_cb serial_cb; + void *serial_cb_data; /* User data for serial_cb. */ + TS_time_cb time_cb; + void *time_cb_data; /* User data for time_cb. */ + TS_extension_cb extension_cb; + void *extension_cb_data; /* User data for extension_cb. */ + /* These members are used only while creating the response. */ + TS_REQ *request; + TS_RESP *response; + TS_TST_INFO *tst_info; +} TS_RESP_CTX; + +DECLARE_STACK_OF(EVP_MD) +DECLARE_ASN1_SET_OF(EVP_MD) + +/* Creates a response context that can be used for generating responses. */ +TS_RESP_CTX *TS_RESP_CTX_new(void); +void TS_RESP_CTX_free(TS_RESP_CTX *ctx); + +/* This parameter must be set. */ +int TS_RESP_CTX_set_signer_cert(TS_RESP_CTX *ctx, X509 *signer); + +/* This parameter must be set. */ +int TS_RESP_CTX_set_signer_key(TS_RESP_CTX *ctx, EVP_PKEY *key); + +/* This parameter must be set. */ +int TS_RESP_CTX_set_def_policy(TS_RESP_CTX *ctx, ASN1_OBJECT *def_policy); + +/* No additional certs are included in the response by default. */ +int TS_RESP_CTX_set_certs(TS_RESP_CTX *ctx, STACK_OF(X509) *certs); + +/* + * Adds a new acceptable policy, only the default policy is accepted by + * default. + */ +int TS_RESP_CTX_add_policy(TS_RESP_CTX *ctx, ASN1_OBJECT *policy); + +/* + * Adds a new acceptable message digest. Note that no message digests are + * accepted by default. The md argument is shared with the caller. + */ +int TS_RESP_CTX_add_md(TS_RESP_CTX *ctx, const EVP_MD *md); + +/* Accuracy is not included by default. */ +int TS_RESP_CTX_set_accuracy(TS_RESP_CTX *ctx, + int secs, int millis, int micros); + +/* + * Clock precision digits, i.e. the number of decimal digits: '0' means sec, + * '3' msec, '6' usec, and so on. Default is 0. + */ +int TS_RESP_CTX_set_clock_precision_digits(TS_RESP_CTX *ctx, + unsigned clock_precision_digits); +/* At most we accept usec precision. */ +# define TS_MAX_CLOCK_PRECISION_DIGITS 6 + +/* Maximum status message length */ +# define TS_MAX_STATUS_LENGTH (1024 * 1024) + +/* No flags are set by default. */ +void TS_RESP_CTX_add_flags(TS_RESP_CTX *ctx, int flags); + +/* Default callback always returns a constant. */ +void TS_RESP_CTX_set_serial_cb(TS_RESP_CTX *ctx, TS_serial_cb cb, void *data); + +/* Default callback uses the gettimeofday() and gmtime() system calls. */ +void TS_RESP_CTX_set_time_cb(TS_RESP_CTX *ctx, TS_time_cb cb, void *data); + +/* + * Default callback rejects all extensions. The extension callback is called + * when the TS_TST_INFO object is already set up and not signed yet. + */ +/* FIXME: extension handling is not tested yet. */ +void TS_RESP_CTX_set_extension_cb(TS_RESP_CTX *ctx, + TS_extension_cb cb, void *data); + +/* The following methods can be used in the callbacks. */ +int TS_RESP_CTX_set_status_info(TS_RESP_CTX *ctx, + int status, const char *text); + +/* Sets the status info only if it is still TS_STATUS_GRANTED. */ +int TS_RESP_CTX_set_status_info_cond(TS_RESP_CTX *ctx, + int status, const char *text); + +int TS_RESP_CTX_add_failure_info(TS_RESP_CTX *ctx, int failure); + +/* The get methods below can be used in the extension callback. */ +TS_REQ *TS_RESP_CTX_get_request(TS_RESP_CTX *ctx); + +TS_TST_INFO *TS_RESP_CTX_get_tst_info(TS_RESP_CTX *ctx); + +/* + * Creates the signed TS_TST_INFO and puts it in TS_RESP. + * In case of errors it sets the status info properly. + * Returns NULL only in case of memory allocation/fatal error. + */ +TS_RESP *TS_RESP_create_response(TS_RESP_CTX *ctx, BIO *req_bio); + +/* + * Declarations related to response verification, + * they are defined in ts/ts_resp_verify.c. + */ + +int TS_RESP_verify_signature(PKCS7 *token, STACK_OF(X509) *certs, + X509_STORE *store, X509 **signer_out); + +/* Context structure for the generic verify method. */ + +/* Verify the signer's certificate and the signature of the response. */ +# define TS_VFY_SIGNATURE (1u << 0) +/* Verify the version number of the response. */ +# define TS_VFY_VERSION (1u << 1) +/* Verify if the policy supplied by the user matches the policy of the TSA. */ +# define TS_VFY_POLICY (1u << 2) +/* + * Verify the message imprint provided by the user. This flag should not be + * specified with TS_VFY_DATA. + */ +# define TS_VFY_IMPRINT (1u << 3) +/* + * Verify the message imprint computed by the verify method from the user + * provided data and the MD algorithm of the response. This flag should not + * be specified with TS_VFY_IMPRINT. + */ +# define TS_VFY_DATA (1u << 4) +/* Verify the nonce value. */ +# define TS_VFY_NONCE (1u << 5) +/* Verify if the TSA name field matches the signer certificate. */ +# define TS_VFY_SIGNER (1u << 6) +/* Verify if the TSA name field equals to the user provided name. */ +# define TS_VFY_TSA_NAME (1u << 7) + +/* You can use the following convenience constants. */ +# define TS_VFY_ALL_IMPRINT (TS_VFY_SIGNATURE \ + | TS_VFY_VERSION \ + | TS_VFY_POLICY \ + | TS_VFY_IMPRINT \ + | TS_VFY_NONCE \ + | TS_VFY_SIGNER \ + | TS_VFY_TSA_NAME) +# define TS_VFY_ALL_DATA (TS_VFY_SIGNATURE \ + | TS_VFY_VERSION \ + | TS_VFY_POLICY \ + | TS_VFY_DATA \ + | TS_VFY_NONCE \ + | TS_VFY_SIGNER \ + | TS_VFY_TSA_NAME) + +typedef struct TS_verify_ctx { + /* Set this to the union of TS_VFY_... flags you want to carry out. */ + unsigned flags; + /* Must be set only with TS_VFY_SIGNATURE. certs is optional. */ + X509_STORE *store; + STACK_OF(X509) *certs; + /* Must be set only with TS_VFY_POLICY. */ + ASN1_OBJECT *policy; + /* + * Must be set only with TS_VFY_IMPRINT. If md_alg is NULL, the + * algorithm from the response is used. + */ + X509_ALGOR *md_alg; + unsigned char *imprint; + unsigned imprint_len; + /* Must be set only with TS_VFY_DATA. */ + BIO *data; + /* Must be set only with TS_VFY_TSA_NAME. */ + ASN1_INTEGER *nonce; + /* Must be set only with TS_VFY_TSA_NAME. */ + GENERAL_NAME *tsa_name; +} TS_VERIFY_CTX; + +int TS_RESP_verify_response(TS_VERIFY_CTX *ctx, TS_RESP *response); +int TS_RESP_verify_token(TS_VERIFY_CTX *ctx, PKCS7 *token); + +/* + * Declarations related to response verification context, + * they are defined in ts/ts_verify_ctx.c. + */ + +/* Set all fields to zero. */ +TS_VERIFY_CTX *TS_VERIFY_CTX_new(void); +void TS_VERIFY_CTX_init(TS_VERIFY_CTX *ctx); +void TS_VERIFY_CTX_free(TS_VERIFY_CTX *ctx); +void TS_VERIFY_CTX_cleanup(TS_VERIFY_CTX *ctx); + +/*- + * If ctx is NULL, it allocates and returns a new object, otherwise + * it returns ctx. It initialises all the members as follows: + * flags = TS_VFY_ALL_IMPRINT & ~(TS_VFY_TSA_NAME | TS_VFY_SIGNATURE) + * certs = NULL + * store = NULL + * policy = policy from the request or NULL if absent (in this case + * TS_VFY_POLICY is cleared from flags as well) + * md_alg = MD algorithm from request + * imprint, imprint_len = imprint from request + * data = NULL + * nonce, nonce_len = nonce from the request or NULL if absent (in this case + * TS_VFY_NONCE is cleared from flags as well) + * tsa_name = NULL + * Important: after calling this method TS_VFY_SIGNATURE should be added! + */ +TS_VERIFY_CTX *TS_REQ_to_TS_VERIFY_CTX(TS_REQ *req, TS_VERIFY_CTX *ctx); + +/* Function declarations for TS_RESP defined in ts/ts_resp_print.c */ + +int TS_RESP_print_bio(BIO *bio, TS_RESP *a); +int TS_STATUS_INFO_print_bio(BIO *bio, TS_STATUS_INFO *a); +int TS_TST_INFO_print_bio(BIO *bio, TS_TST_INFO *a); + +/* Common utility functions defined in ts/ts_lib.c */ + +int TS_ASN1_INTEGER_print_bio(BIO *bio, const ASN1_INTEGER *num); +int TS_OBJ_print_bio(BIO *bio, const ASN1_OBJECT *obj); +int TS_ext_print_bio(BIO *bio, const STACK_OF(X509_EXTENSION) *extensions); +int TS_X509_ALGOR_print_bio(BIO *bio, const X509_ALGOR *alg); +int TS_MSG_IMPRINT_print_bio(BIO *bio, TS_MSG_IMPRINT *msg); + +/* + * Function declarations for handling configuration options, defined in + * ts/ts_conf.c + */ + +X509 *TS_CONF_load_cert(const char *file); +STACK_OF(X509) *TS_CONF_load_certs(const char *file); +EVP_PKEY *TS_CONF_load_key(const char *file, const char *pass); +const char *TS_CONF_get_tsa_section(CONF *conf, const char *section); +int TS_CONF_set_serial(CONF *conf, const char *section, TS_serial_cb cb, + TS_RESP_CTX *ctx); +int TS_CONF_set_crypto_device(CONF *conf, const char *section, + const char *device); +int TS_CONF_set_default_engine(const char *name); +int TS_CONF_set_signer_cert(CONF *conf, const char *section, + const char *cert, TS_RESP_CTX *ctx); +int TS_CONF_set_certs(CONF *conf, const char *section, const char *certs, + TS_RESP_CTX *ctx); +int TS_CONF_set_signer_key(CONF *conf, const char *section, + const char *key, const char *pass, + TS_RESP_CTX *ctx); +int TS_CONF_set_def_policy(CONF *conf, const char *section, + const char *policy, TS_RESP_CTX *ctx); +int TS_CONF_set_policies(CONF *conf, const char *section, TS_RESP_CTX *ctx); +int TS_CONF_set_digests(CONF *conf, const char *section, TS_RESP_CTX *ctx); +int TS_CONF_set_accuracy(CONF *conf, const char *section, TS_RESP_CTX *ctx); +int TS_CONF_set_clock_precision_digits(CONF *conf, const char *section, + TS_RESP_CTX *ctx); +int TS_CONF_set_ordering(CONF *conf, const char *section, TS_RESP_CTX *ctx); +int TS_CONF_set_tsa_name(CONF *conf, const char *section, TS_RESP_CTX *ctx); +int TS_CONF_set_ess_cert_id_chain(CONF *conf, const char *section, + TS_RESP_CTX *ctx); + +/* -------------------------------------------------- */ +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_TS_strings(void); + +/* Error codes for the TS functions. */ + +/* Function codes. */ +# define TS_F_D2I_TS_RESP 147 +# define TS_F_DEF_SERIAL_CB 110 +# define TS_F_DEF_TIME_CB 111 +# define TS_F_ESS_ADD_SIGNING_CERT 112 +# define TS_F_ESS_CERT_ID_NEW_INIT 113 +# define TS_F_ESS_SIGNING_CERT_NEW_INIT 114 +# define TS_F_INT_TS_RESP_VERIFY_TOKEN 149 +# define TS_F_PKCS7_TO_TS_TST_INFO 148 +# define TS_F_TS_ACCURACY_SET_MICROS 115 +# define TS_F_TS_ACCURACY_SET_MILLIS 116 +# define TS_F_TS_ACCURACY_SET_SECONDS 117 +# define TS_F_TS_CHECK_IMPRINTS 100 +# define TS_F_TS_CHECK_NONCES 101 +# define TS_F_TS_CHECK_POLICY 102 +# define TS_F_TS_CHECK_SIGNING_CERTS 103 +# define TS_F_TS_CHECK_STATUS_INFO 104 +# define TS_F_TS_COMPUTE_IMPRINT 145 +# define TS_F_TS_CONF_SET_DEFAULT_ENGINE 146 +# define TS_F_TS_GET_STATUS_TEXT 105 +# define TS_F_TS_MSG_IMPRINT_SET_ALGO 118 +# define TS_F_TS_REQ_SET_MSG_IMPRINT 119 +# define TS_F_TS_REQ_SET_NONCE 120 +# define TS_F_TS_REQ_SET_POLICY_ID 121 +# define TS_F_TS_RESP_CREATE_RESPONSE 122 +# define TS_F_TS_RESP_CREATE_TST_INFO 123 +# define TS_F_TS_RESP_CTX_ADD_FAILURE_INFO 124 +# define TS_F_TS_RESP_CTX_ADD_MD 125 +# define TS_F_TS_RESP_CTX_ADD_POLICY 126 +# define TS_F_TS_RESP_CTX_NEW 127 +# define TS_F_TS_RESP_CTX_SET_ACCURACY 128 +# define TS_F_TS_RESP_CTX_SET_CERTS 129 +# define TS_F_TS_RESP_CTX_SET_DEF_POLICY 130 +# define TS_F_TS_RESP_CTX_SET_SIGNER_CERT 131 +# define TS_F_TS_RESP_CTX_SET_STATUS_INFO 132 +# define TS_F_TS_RESP_GET_POLICY 133 +# define TS_F_TS_RESP_SET_GENTIME_WITH_PRECISION 134 +# define TS_F_TS_RESP_SET_STATUS_INFO 135 +# define TS_F_TS_RESP_SET_TST_INFO 150 +# define TS_F_TS_RESP_SIGN 136 +# define TS_F_TS_RESP_VERIFY_SIGNATURE 106 +# define TS_F_TS_RESP_VERIFY_TOKEN 107 +# define TS_F_TS_TST_INFO_SET_ACCURACY 137 +# define TS_F_TS_TST_INFO_SET_MSG_IMPRINT 138 +# define TS_F_TS_TST_INFO_SET_NONCE 139 +# define TS_F_TS_TST_INFO_SET_POLICY_ID 140 +# define TS_F_TS_TST_INFO_SET_SERIAL 141 +# define TS_F_TS_TST_INFO_SET_TIME 142 +# define TS_F_TS_TST_INFO_SET_TSA 143 +# define TS_F_TS_VERIFY 108 +# define TS_F_TS_VERIFY_CERT 109 +# define TS_F_TS_VERIFY_CTX_NEW 144 + +/* Reason codes. */ +# define TS_R_BAD_PKCS7_TYPE 132 +# define TS_R_BAD_TYPE 133 +# define TS_R_CERTIFICATE_VERIFY_ERROR 100 +# define TS_R_COULD_NOT_SET_ENGINE 127 +# define TS_R_COULD_NOT_SET_TIME 115 +# define TS_R_D2I_TS_RESP_INT_FAILED 128 +# define TS_R_DETACHED_CONTENT 134 +# define TS_R_ESS_ADD_SIGNING_CERT_ERROR 116 +# define TS_R_ESS_SIGNING_CERTIFICATE_ERROR 101 +# define TS_R_INVALID_NULL_POINTER 102 +# define TS_R_INVALID_SIGNER_CERTIFICATE_PURPOSE 117 +# define TS_R_MESSAGE_IMPRINT_MISMATCH 103 +# define TS_R_NONCE_MISMATCH 104 +# define TS_R_NONCE_NOT_RETURNED 105 +# define TS_R_NO_CONTENT 106 +# define TS_R_NO_TIME_STAMP_TOKEN 107 +# define TS_R_PKCS7_ADD_SIGNATURE_ERROR 118 +# define TS_R_PKCS7_ADD_SIGNED_ATTR_ERROR 119 +# define TS_R_PKCS7_TO_TS_TST_INFO_FAILED 129 +# define TS_R_POLICY_MISMATCH 108 +# define TS_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE 120 +# define TS_R_RESPONSE_SETUP_ERROR 121 +# define TS_R_SIGNATURE_FAILURE 109 +# define TS_R_THERE_MUST_BE_ONE_SIGNER 110 +# define TS_R_TIME_SYSCALL_ERROR 122 +# define TS_R_TOKEN_NOT_PRESENT 130 +# define TS_R_TOKEN_PRESENT 131 +# define TS_R_TSA_NAME_MISMATCH 111 +# define TS_R_TSA_UNTRUSTED 112 +# define TS_R_TST_INFO_SETUP_ERROR 123 +# define TS_R_TS_DATASIGN 124 +# define TS_R_UNACCEPTABLE_POLICY 125 +# define TS_R_UNSUPPORTED_MD_ALGORITHM 126 +# define TS_R_UNSUPPORTED_VERSION 113 +# define TS_R_WRONG_CONTENT_TYPE 114 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/txt_db.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/txt_db.h new file mode 100644 index 0000000..98e23a2 --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/txt_db.h @@ -0,0 +1,112 @@ +/* crypto/txt_db/txt_db.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_TXT_DB_H +# define HEADER_TXT_DB_H + +# include +# ifndef OPENSSL_NO_BIO +# include +# endif +# include +# include + +# define DB_ERROR_OK 0 +# define DB_ERROR_MALLOC 1 +# define DB_ERROR_INDEX_CLASH 2 +# define DB_ERROR_INDEX_OUT_OF_RANGE 3 +# define DB_ERROR_NO_INDEX 4 +# define DB_ERROR_INSERT_INDEX_CLASH 5 + +#ifdef __cplusplus +extern "C" { +#endif + +typedef OPENSSL_STRING *OPENSSL_PSTRING; +DECLARE_SPECIAL_STACK_OF(OPENSSL_PSTRING, OPENSSL_STRING) + +typedef struct txt_db_st { + int num_fields; + STACK_OF(OPENSSL_PSTRING) *data; + LHASH_OF(OPENSSL_STRING) **index; + int (**qual) (OPENSSL_STRING *); + long error; + long arg1; + long arg2; + OPENSSL_STRING *arg_row; +} TXT_DB; + +# ifndef OPENSSL_NO_BIO +TXT_DB *TXT_DB_read(BIO *in, int num); +long TXT_DB_write(BIO *out, TXT_DB *db); +# else +TXT_DB *TXT_DB_read(char *in, int num); +long TXT_DB_write(char *out, TXT_DB *db); +# endif +int TXT_DB_create_index(TXT_DB *db, int field, int (*qual) (OPENSSL_STRING *), + LHASH_HASH_FN_TYPE hash, LHASH_COMP_FN_TYPE cmp); +void TXT_DB_free(TXT_DB *db); +OPENSSL_STRING *TXT_DB_get_by_index(TXT_DB *db, int idx, + OPENSSL_STRING *value); +int TXT_DB_insert(TXT_DB *db, OPENSSL_STRING *value); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/ui.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/ui.h new file mode 100644 index 0000000..0dc1633 --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/ui.h @@ -0,0 +1,415 @@ +/* crypto/ui/ui.h */ +/* + * Written by Richard Levitte (richard@levitte.org) for the OpenSSL project + * 2001. + */ +/* ==================================================================== + * Copyright (c) 2001 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_UI_H +# define HEADER_UI_H + +# ifndef OPENSSL_NO_DEPRECATED +# include +# endif +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Declared already in ossl_typ.h */ +/* typedef struct ui_st UI; */ +/* typedef struct ui_method_st UI_METHOD; */ + +/* + * All the following functions return -1 or NULL on error and in some cases + * (UI_process()) -2 if interrupted or in some other way cancelled. When + * everything is fine, they return 0, a positive value or a non-NULL pointer, + * all depending on their purpose. + */ + +/* Creators and destructor. */ +UI *UI_new(void); +UI *UI_new_method(const UI_METHOD *method); +void UI_free(UI *ui); + +/*- + The following functions are used to add strings to be printed and prompt + strings to prompt for data. The names are UI_{add,dup}__string + and UI_{add,dup}_input_boolean. + + UI_{add,dup}__string have the following meanings: + add add a text or prompt string. The pointers given to these + functions are used verbatim, no copying is done. + dup make a copy of the text or prompt string, then add the copy + to the collection of strings in the user interface. + + The function is a name for the functionality that the given + string shall be used for. It can be one of: + input use the string as data prompt. + verify use the string as verification prompt. This + is used to verify a previous input. + info use the string for informational output. + error use the string for error output. + Honestly, there's currently no difference between info and error for the + moment. + + UI_{add,dup}_input_boolean have the same semantics for "add" and "dup", + and are typically used when one wants to prompt for a yes/no response. + + All of the functions in this group take a UI and a prompt string. + The string input and verify addition functions also take a flag argument, + a buffer for the result to end up with, a minimum input size and a maximum + input size (the result buffer MUST be large enough to be able to contain + the maximum number of characters). Additionally, the verify addition + functions takes another buffer to compare the result against. + The boolean input functions take an action description string (which should + be safe to ignore if the expected user action is obvious, for example with + a dialog box with an OK button and a Cancel button), a string of acceptable + characters to mean OK and to mean Cancel. The two last strings are checked + to make sure they don't have common characters. Additionally, the same + flag argument as for the string input is taken, as well as a result buffer. + The result buffer is required to be at least one byte long. Depending on + the answer, the first character from the OK or the Cancel character strings + will be stored in the first byte of the result buffer. No NUL will be + added, so the result is *not* a string. + + On success, the all return an index of the added information. That index + is usefull when retrieving results with UI_get0_result(). */ +int UI_add_input_string(UI *ui, const char *prompt, int flags, + char *result_buf, int minsize, int maxsize); +int UI_dup_input_string(UI *ui, const char *prompt, int flags, + char *result_buf, int minsize, int maxsize); +int UI_add_verify_string(UI *ui, const char *prompt, int flags, + char *result_buf, int minsize, int maxsize, + const char *test_buf); +int UI_dup_verify_string(UI *ui, const char *prompt, int flags, + char *result_buf, int minsize, int maxsize, + const char *test_buf); +int UI_add_input_boolean(UI *ui, const char *prompt, const char *action_desc, + const char *ok_chars, const char *cancel_chars, + int flags, char *result_buf); +int UI_dup_input_boolean(UI *ui, const char *prompt, const char *action_desc, + const char *ok_chars, const char *cancel_chars, + int flags, char *result_buf); +int UI_add_info_string(UI *ui, const char *text); +int UI_dup_info_string(UI *ui, const char *text); +int UI_add_error_string(UI *ui, const char *text); +int UI_dup_error_string(UI *ui, const char *text); + +/* These are the possible flags. They can be or'ed together. */ +/* Use to have echoing of input */ +# define UI_INPUT_FLAG_ECHO 0x01 +/* + * Use a default password. Where that password is found is completely up to + * the application, it might for example be in the user data set with + * UI_add_user_data(). It is not recommended to have more than one input in + * each UI being marked with this flag, or the application might get + * confused. + */ +# define UI_INPUT_FLAG_DEFAULT_PWD 0x02 + +/*- + * The user of these routines may want to define flags of their own. The core + * UI won't look at those, but will pass them on to the method routines. They + * must use higher bits so they don't get confused with the UI bits above. + * UI_INPUT_FLAG_USER_BASE tells which is the lowest bit to use. A good + * example of use is this: + * + * #define MY_UI_FLAG1 (0x01 << UI_INPUT_FLAG_USER_BASE) + * +*/ +# define UI_INPUT_FLAG_USER_BASE 16 + +/*- + * The following function helps construct a prompt. object_desc is a + * textual short description of the object, for example "pass phrase", + * and object_name is the name of the object (might be a card name or + * a file name. + * The returned string shall always be allocated on the heap with + * OPENSSL_malloc(), and need to be free'd with OPENSSL_free(). + * + * If the ui_method doesn't contain a pointer to a user-defined prompt + * constructor, a default string is built, looking like this: + * + * "Enter {object_desc} for {object_name}:" + * + * So, if object_desc has the value "pass phrase" and object_name has + * the value "foo.key", the resulting string is: + * + * "Enter pass phrase for foo.key:" +*/ +char *UI_construct_prompt(UI *ui_method, + const char *object_desc, const char *object_name); + +/* + * The following function is used to store a pointer to user-specific data. + * Any previous such pointer will be returned and replaced. + * + * For callback purposes, this function makes a lot more sense than using + * ex_data, since the latter requires that different parts of OpenSSL or + * applications share the same ex_data index. + * + * Note that the UI_OpenSSL() method completely ignores the user data. Other + * methods may not, however. + */ +void *UI_add_user_data(UI *ui, void *user_data); +/* We need a user data retrieving function as well. */ +void *UI_get0_user_data(UI *ui); + +/* Return the result associated with a prompt given with the index i. */ +const char *UI_get0_result(UI *ui, int i); + +/* When all strings have been added, process the whole thing. */ +int UI_process(UI *ui); + +/* + * Give a user interface parametrised control commands. This can be used to + * send down an integer, a data pointer or a function pointer, as well as be + * used to get information from a UI. + */ +int UI_ctrl(UI *ui, int cmd, long i, void *p, void (*f) (void)); + +/* The commands */ +/* + * Use UI_CONTROL_PRINT_ERRORS with the value 1 to have UI_process print the + * OpenSSL error stack before printing any info or added error messages and + * before any prompting. + */ +# define UI_CTRL_PRINT_ERRORS 1 +/* + * Check if a UI_process() is possible to do again with the same instance of + * a user interface. This makes UI_ctrl() return 1 if it is redoable, and 0 + * if not. + */ +# define UI_CTRL_IS_REDOABLE 2 + +/* Some methods may use extra data */ +# define UI_set_app_data(s,arg) UI_set_ex_data(s,0,arg) +# define UI_get_app_data(s) UI_get_ex_data(s,0) +int UI_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); +int UI_set_ex_data(UI *r, int idx, void *arg); +void *UI_get_ex_data(UI *r, int idx); + +/* Use specific methods instead of the built-in one */ +void UI_set_default_method(const UI_METHOD *meth); +const UI_METHOD *UI_get_default_method(void); +const UI_METHOD *UI_get_method(UI *ui); +const UI_METHOD *UI_set_method(UI *ui, const UI_METHOD *meth); + +/* The method with all the built-in thingies */ +UI_METHOD *UI_OpenSSL(void); + +/* ---------- For method writers ---------- */ +/*- + A method contains a number of functions that implement the low level + of the User Interface. The functions are: + + an opener This function starts a session, maybe by opening + a channel to a tty, or by opening a window. + a writer This function is called to write a given string, + maybe to the tty, maybe as a field label in a + window. + a flusher This function is called to flush everything that + has been output so far. It can be used to actually + display a dialog box after it has been built. + a reader This function is called to read a given prompt, + maybe from the tty, maybe from a field in a + window. Note that it's called wth all string + structures, not only the prompt ones, so it must + check such things itself. + a closer This function closes the session, maybe by closing + the channel to the tty, or closing the window. + + All these functions are expected to return: + + 0 on error. + 1 on success. + -1 on out-of-band events, for example if some prompting has + been canceled (by pressing Ctrl-C, for example). This is + only checked when returned by the flusher or the reader. + + The way this is used, the opener is first called, then the writer for all + strings, then the flusher, then the reader for all strings and finally the + closer. Note that if you want to prompt from a terminal or other command + line interface, the best is to have the reader also write the prompts + instead of having the writer do it. If you want to prompt from a dialog + box, the writer can be used to build up the contents of the box, and the + flusher to actually display the box and run the event loop until all data + has been given, after which the reader only grabs the given data and puts + them back into the UI strings. + + All method functions take a UI as argument. Additionally, the writer and + the reader take a UI_STRING. +*/ + +/* + * The UI_STRING type is the data structure that contains all the needed info + * about a string or a prompt, including test data for a verification prompt. + */ +typedef struct ui_string_st UI_STRING; +DECLARE_STACK_OF(UI_STRING) + +/* + * The different types of strings that are currently supported. This is only + * needed by method authors. + */ +enum UI_string_types { + UIT_NONE = 0, + UIT_PROMPT, /* Prompt for a string */ + UIT_VERIFY, /* Prompt for a string and verify */ + UIT_BOOLEAN, /* Prompt for a yes/no response */ + UIT_INFO, /* Send info to the user */ + UIT_ERROR /* Send an error message to the user */ +}; + +/* Create and manipulate methods */ +UI_METHOD *UI_create_method(char *name); +void UI_destroy_method(UI_METHOD *ui_method); +int UI_method_set_opener(UI_METHOD *method, int (*opener) (UI *ui)); +int UI_method_set_writer(UI_METHOD *method, + int (*writer) (UI *ui, UI_STRING *uis)); +int UI_method_set_flusher(UI_METHOD *method, int (*flusher) (UI *ui)); +int UI_method_set_reader(UI_METHOD *method, + int (*reader) (UI *ui, UI_STRING *uis)); +int UI_method_set_closer(UI_METHOD *method, int (*closer) (UI *ui)); +int UI_method_set_prompt_constructor(UI_METHOD *method, + char *(*prompt_constructor) (UI *ui, + const char + *object_desc, + const char + *object_name)); +int (*UI_method_get_opener(UI_METHOD *method)) (UI *); +int (*UI_method_get_writer(UI_METHOD *method)) (UI *, UI_STRING *); +int (*UI_method_get_flusher(UI_METHOD *method)) (UI *); +int (*UI_method_get_reader(UI_METHOD *method)) (UI *, UI_STRING *); +int (*UI_method_get_closer(UI_METHOD *method)) (UI *); +char *(*UI_method_get_prompt_constructor(UI_METHOD *method)) (UI *, + const char *, + const char *); + +/* + * The following functions are helpers for method writers to access relevant + * data from a UI_STRING. + */ + +/* Return type of the UI_STRING */ +enum UI_string_types UI_get_string_type(UI_STRING *uis); +/* Return input flags of the UI_STRING */ +int UI_get_input_flags(UI_STRING *uis); +/* Return the actual string to output (the prompt, info or error) */ +const char *UI_get0_output_string(UI_STRING *uis); +/* + * Return the optional action string to output (the boolean promtp + * instruction) + */ +const char *UI_get0_action_string(UI_STRING *uis); +/* Return the result of a prompt */ +const char *UI_get0_result_string(UI_STRING *uis); +/* + * Return the string to test the result against. Only useful with verifies. + */ +const char *UI_get0_test_string(UI_STRING *uis); +/* Return the required minimum size of the result */ +int UI_get_result_minsize(UI_STRING *uis); +/* Return the required maximum size of the result */ +int UI_get_result_maxsize(UI_STRING *uis); +/* Set the result of a UI_STRING. */ +int UI_set_result(UI *ui, UI_STRING *uis, const char *result); + +/* A couple of popular utility functions */ +int UI_UTIL_read_pw_string(char *buf, int length, const char *prompt, + int verify); +int UI_UTIL_read_pw(char *buf, char *buff, int size, const char *prompt, + int verify); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_UI_strings(void); + +/* Error codes for the UI functions. */ + +/* Function codes. */ +# define UI_F_GENERAL_ALLOCATE_BOOLEAN 108 +# define UI_F_GENERAL_ALLOCATE_PROMPT 109 +# define UI_F_GENERAL_ALLOCATE_STRING 100 +# define UI_F_UI_CTRL 111 +# define UI_F_UI_DUP_ERROR_STRING 101 +# define UI_F_UI_DUP_INFO_STRING 102 +# define UI_F_UI_DUP_INPUT_BOOLEAN 110 +# define UI_F_UI_DUP_INPUT_STRING 103 +# define UI_F_UI_DUP_VERIFY_STRING 106 +# define UI_F_UI_GET0_RESULT 107 +# define UI_F_UI_NEW_METHOD 104 +# define UI_F_UI_SET_RESULT 105 + +/* Reason codes. */ +# define UI_R_COMMON_OK_AND_CANCEL_CHARACTERS 104 +# define UI_R_INDEX_TOO_LARGE 102 +# define UI_R_INDEX_TOO_SMALL 103 +# define UI_R_NO_RESULT_BUFFER 105 +# define UI_R_RESULT_TOO_LARGE 100 +# define UI_R_RESULT_TOO_SMALL 101 +# define UI_R_UNKNOWN_CONTROL_COMMAND 106 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/ui_compat.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/ui_compat.h new file mode 100644 index 0000000..bf54154 --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/ui_compat.h @@ -0,0 +1,88 @@ +/* crypto/ui/ui.h */ +/* + * Written by Richard Levitte (richard@levitte.org) for the OpenSSL project + * 2001. + */ +/* ==================================================================== + * Copyright (c) 2001 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_UI_COMPAT_H +# define HEADER_UI_COMPAT_H + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * The following functions were previously part of the DES section, and are + * provided here for backward compatibility reasons. + */ + +# define des_read_pw_string(b,l,p,v) \ + _ossl_old_des_read_pw_string((b),(l),(p),(v)) +# define des_read_pw(b,bf,s,p,v) \ + _ossl_old_des_read_pw((b),(bf),(s),(p),(v)) + +int _ossl_old_des_read_pw_string(char *buf, int length, const char *prompt, + int verify); +int _ossl_old_des_read_pw(char *buf, char *buff, int size, const char *prompt, + int verify); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/whrlpool.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/whrlpool.h new file mode 100644 index 0000000..73c749d --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/whrlpool.h @@ -0,0 +1,41 @@ +#ifndef HEADER_WHRLPOOL_H +# define HEADER_WHRLPOOL_H + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# define WHIRLPOOL_DIGEST_LENGTH (512/8) +# define WHIRLPOOL_BBLOCK 512 +# define WHIRLPOOL_COUNTER (256/8) + +typedef struct { + union { + unsigned char c[WHIRLPOOL_DIGEST_LENGTH]; + /* double q is here to ensure 64-bit alignment */ + double q[WHIRLPOOL_DIGEST_LENGTH / sizeof(double)]; + } H; + unsigned char data[WHIRLPOOL_BBLOCK / 8]; + unsigned int bitoff; + size_t bitlen[WHIRLPOOL_COUNTER / sizeof(size_t)]; +} WHIRLPOOL_CTX; + +# ifndef OPENSSL_NO_WHIRLPOOL +# ifdef OPENSSL_FIPS +int private_WHIRLPOOL_Init(WHIRLPOOL_CTX *c); +# endif +int WHIRLPOOL_Init(WHIRLPOOL_CTX *c); +int WHIRLPOOL_Update(WHIRLPOOL_CTX *c, const void *inp, size_t bytes); +void WHIRLPOOL_BitUpdate(WHIRLPOOL_CTX *c, const void *inp, size_t bits); +int WHIRLPOOL_Final(unsigned char *md, WHIRLPOOL_CTX *c); +unsigned char *WHIRLPOOL(const void *inp, size_t bytes, unsigned char *md); +# endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/x509.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/x509.h new file mode 100644 index 0000000..6fa28eb --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/x509.h @@ -0,0 +1,1330 @@ +/* crypto/x509/x509.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * ECDH support in OpenSSL originally developed by + * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project. + */ + +#ifndef HEADER_X509_H +# define HEADER_X509_H + +# include +# include +# ifndef OPENSSL_NO_BUFFER +# include +# endif +# ifndef OPENSSL_NO_EVP +# include +# endif +# ifndef OPENSSL_NO_BIO +# include +# endif +# include +# include +# include + +# ifndef OPENSSL_NO_EC +# include +# endif + +# ifndef OPENSSL_NO_ECDSA +# include +# endif + +# ifndef OPENSSL_NO_ECDH +# include +# endif + +# ifndef OPENSSL_NO_DEPRECATED +# ifndef OPENSSL_NO_RSA +# include +# endif +# ifndef OPENSSL_NO_DSA +# include +# endif +# ifndef OPENSSL_NO_DH +# include +# endif +# endif + +# ifndef OPENSSL_NO_SHA +# include +# endif +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# ifdef OPENSSL_SYS_WIN32 +/* Under Win32 these are defined in wincrypt.h */ +# undef X509_NAME +# undef X509_CERT_PAIR +# undef X509_EXTENSIONS +# endif + +# define X509_FILETYPE_PEM 1 +# define X509_FILETYPE_ASN1 2 +# define X509_FILETYPE_DEFAULT 3 + +# define X509v3_KU_DIGITAL_SIGNATURE 0x0080 +# define X509v3_KU_NON_REPUDIATION 0x0040 +# define X509v3_KU_KEY_ENCIPHERMENT 0x0020 +# define X509v3_KU_DATA_ENCIPHERMENT 0x0010 +# define X509v3_KU_KEY_AGREEMENT 0x0008 +# define X509v3_KU_KEY_CERT_SIGN 0x0004 +# define X509v3_KU_CRL_SIGN 0x0002 +# define X509v3_KU_ENCIPHER_ONLY 0x0001 +# define X509v3_KU_DECIPHER_ONLY 0x8000 +# define X509v3_KU_UNDEF 0xffff + +typedef struct X509_objects_st { + int nid; + int (*a2i) (void); + int (*i2a) (void); +} X509_OBJECTS; + +struct X509_algor_st { + ASN1_OBJECT *algorithm; + ASN1_TYPE *parameter; +} /* X509_ALGOR */ ; + +DECLARE_ASN1_SET_OF(X509_ALGOR) + +typedef STACK_OF(X509_ALGOR) X509_ALGORS; + +typedef struct X509_val_st { + ASN1_TIME *notBefore; + ASN1_TIME *notAfter; +} X509_VAL; + +struct X509_pubkey_st { + X509_ALGOR *algor; + ASN1_BIT_STRING *public_key; + EVP_PKEY *pkey; +}; + +typedef struct X509_sig_st { + X509_ALGOR *algor; + ASN1_OCTET_STRING *digest; +} X509_SIG; + +typedef struct X509_name_entry_st { + ASN1_OBJECT *object; + ASN1_STRING *value; + int set; + int size; /* temp variable */ +} X509_NAME_ENTRY; + +DECLARE_STACK_OF(X509_NAME_ENTRY) +DECLARE_ASN1_SET_OF(X509_NAME_ENTRY) + +/* we always keep X509_NAMEs in 2 forms. */ +struct X509_name_st { + STACK_OF(X509_NAME_ENTRY) *entries; + int modified; /* true if 'bytes' needs to be built */ +# ifndef OPENSSL_NO_BUFFER + BUF_MEM *bytes; +# else + char *bytes; +# endif +/* unsigned long hash; Keep the hash around for lookups */ + unsigned char *canon_enc; + int canon_enclen; +} /* X509_NAME */ ; + +DECLARE_STACK_OF(X509_NAME) + +# define X509_EX_V_NETSCAPE_HACK 0x8000 +# define X509_EX_V_INIT 0x0001 +typedef struct X509_extension_st { + ASN1_OBJECT *object; + ASN1_BOOLEAN critical; + ASN1_OCTET_STRING *value; +} X509_EXTENSION; + +typedef STACK_OF(X509_EXTENSION) X509_EXTENSIONS; + +DECLARE_STACK_OF(X509_EXTENSION) +DECLARE_ASN1_SET_OF(X509_EXTENSION) + +/* a sequence of these are used */ +typedef struct x509_attributes_st { + ASN1_OBJECT *object; + int single; /* 0 for a set, 1 for a single item (which is + * wrong) */ + union { + char *ptr; + /* + * 0 + */ STACK_OF(ASN1_TYPE) *set; + /* + * 1 + */ ASN1_TYPE *single; + } value; +} X509_ATTRIBUTE; + +DECLARE_STACK_OF(X509_ATTRIBUTE) +DECLARE_ASN1_SET_OF(X509_ATTRIBUTE) + +typedef struct X509_req_info_st { + ASN1_ENCODING enc; + ASN1_INTEGER *version; + X509_NAME *subject; + X509_PUBKEY *pubkey; + /* d=2 hl=2 l= 0 cons: cont: 00 */ + STACK_OF(X509_ATTRIBUTE) *attributes; /* [ 0 ] */ +} X509_REQ_INFO; + +typedef struct X509_req_st { + X509_REQ_INFO *req_info; + X509_ALGOR *sig_alg; + ASN1_BIT_STRING *signature; + int references; +} X509_REQ; + +typedef struct x509_cinf_st { + ASN1_INTEGER *version; /* [ 0 ] default of v1 */ + ASN1_INTEGER *serialNumber; + X509_ALGOR *signature; + X509_NAME *issuer; + X509_VAL *validity; + X509_NAME *subject; + X509_PUBKEY *key; + ASN1_BIT_STRING *issuerUID; /* [ 1 ] optional in v2 */ + ASN1_BIT_STRING *subjectUID; /* [ 2 ] optional in v2 */ + STACK_OF(X509_EXTENSION) *extensions; /* [ 3 ] optional in v3 */ + ASN1_ENCODING enc; +} X509_CINF; + +/* + * This stuff is certificate "auxiliary info" it contains details which are + * useful in certificate stores and databases. When used this is tagged onto + * the end of the certificate itself + */ + +typedef struct x509_cert_aux_st { + STACK_OF(ASN1_OBJECT) *trust; /* trusted uses */ + STACK_OF(ASN1_OBJECT) *reject; /* rejected uses */ + ASN1_UTF8STRING *alias; /* "friendly name" */ + ASN1_OCTET_STRING *keyid; /* key id of private key */ + STACK_OF(X509_ALGOR) *other; /* other unspecified info */ +} X509_CERT_AUX; + +struct x509_st { + X509_CINF *cert_info; + X509_ALGOR *sig_alg; + ASN1_BIT_STRING *signature; + int valid; + int references; + char *name; + CRYPTO_EX_DATA ex_data; + /* These contain copies of various extension values */ + long ex_pathlen; + long ex_pcpathlen; + unsigned long ex_flags; + unsigned long ex_kusage; + unsigned long ex_xkusage; + unsigned long ex_nscert; + ASN1_OCTET_STRING *skid; + AUTHORITY_KEYID *akid; + X509_POLICY_CACHE *policy_cache; + STACK_OF(DIST_POINT) *crldp; + STACK_OF(GENERAL_NAME) *altname; + NAME_CONSTRAINTS *nc; +# ifndef OPENSSL_NO_RFC3779 + STACK_OF(IPAddressFamily) *rfc3779_addr; + struct ASIdentifiers_st *rfc3779_asid; +# endif +# ifndef OPENSSL_NO_SHA + unsigned char sha1_hash[SHA_DIGEST_LENGTH]; +# endif + X509_CERT_AUX *aux; +} /* X509 */ ; + +DECLARE_STACK_OF(X509) +DECLARE_ASN1_SET_OF(X509) + +/* This is used for a table of trust checking functions */ + +typedef struct x509_trust_st { + int trust; + int flags; + int (*check_trust) (struct x509_trust_st *, X509 *, int); + char *name; + int arg1; + void *arg2; +} X509_TRUST; + +DECLARE_STACK_OF(X509_TRUST) + +typedef struct x509_cert_pair_st { + X509 *forward; + X509 *reverse; +} X509_CERT_PAIR; + +/* standard trust ids */ + +# define X509_TRUST_DEFAULT -1/* Only valid in purpose settings */ + +# define X509_TRUST_COMPAT 1 +# define X509_TRUST_SSL_CLIENT 2 +# define X509_TRUST_SSL_SERVER 3 +# define X509_TRUST_EMAIL 4 +# define X509_TRUST_OBJECT_SIGN 5 +# define X509_TRUST_OCSP_SIGN 6 +# define X509_TRUST_OCSP_REQUEST 7 +# define X509_TRUST_TSA 8 + +/* Keep these up to date! */ +# define X509_TRUST_MIN 1 +# define X509_TRUST_MAX 8 + +/* trust_flags values */ +# define X509_TRUST_DYNAMIC 1 +# define X509_TRUST_DYNAMIC_NAME 2 + +/* check_trust return codes */ + +# define X509_TRUST_TRUSTED 1 +# define X509_TRUST_REJECTED 2 +# define X509_TRUST_UNTRUSTED 3 + +/* Flags for X509_print_ex() */ + +# define X509_FLAG_COMPAT 0 +# define X509_FLAG_NO_HEADER 1L +# define X509_FLAG_NO_VERSION (1L << 1) +# define X509_FLAG_NO_SERIAL (1L << 2) +# define X509_FLAG_NO_SIGNAME (1L << 3) +# define X509_FLAG_NO_ISSUER (1L << 4) +# define X509_FLAG_NO_VALIDITY (1L << 5) +# define X509_FLAG_NO_SUBJECT (1L << 6) +# define X509_FLAG_NO_PUBKEY (1L << 7) +# define X509_FLAG_NO_EXTENSIONS (1L << 8) +# define X509_FLAG_NO_SIGDUMP (1L << 9) +# define X509_FLAG_NO_AUX (1L << 10) +# define X509_FLAG_NO_ATTRIBUTES (1L << 11) +# define X509_FLAG_NO_IDS (1L << 12) + +/* Flags specific to X509_NAME_print_ex() */ + +/* The field separator information */ + +# define XN_FLAG_SEP_MASK (0xf << 16) + +# define XN_FLAG_COMPAT 0/* Traditional SSLeay: use old + * X509_NAME_print */ +# define XN_FLAG_SEP_COMMA_PLUS (1 << 16)/* RFC2253 ,+ */ +# define XN_FLAG_SEP_CPLUS_SPC (2 << 16)/* ,+ spaced: more readable */ +# define XN_FLAG_SEP_SPLUS_SPC (3 << 16)/* ;+ spaced */ +# define XN_FLAG_SEP_MULTILINE (4 << 16)/* One line per field */ + +# define XN_FLAG_DN_REV (1 << 20)/* Reverse DN order */ + +/* How the field name is shown */ + +# define XN_FLAG_FN_MASK (0x3 << 21) + +# define XN_FLAG_FN_SN 0/* Object short name */ +# define XN_FLAG_FN_LN (1 << 21)/* Object long name */ +# define XN_FLAG_FN_OID (2 << 21)/* Always use OIDs */ +# define XN_FLAG_FN_NONE (3 << 21)/* No field names */ + +# define XN_FLAG_SPC_EQ (1 << 23)/* Put spaces round '=' */ + +/* + * This determines if we dump fields we don't recognise: RFC2253 requires + * this. + */ + +# define XN_FLAG_DUMP_UNKNOWN_FIELDS (1 << 24) + +# define XN_FLAG_FN_ALIGN (1 << 25)/* Align field names to 20 + * characters */ + +/* Complete set of RFC2253 flags */ + +# define XN_FLAG_RFC2253 (ASN1_STRFLGS_RFC2253 | \ + XN_FLAG_SEP_COMMA_PLUS | \ + XN_FLAG_DN_REV | \ + XN_FLAG_FN_SN | \ + XN_FLAG_DUMP_UNKNOWN_FIELDS) + +/* readable oneline form */ + +# define XN_FLAG_ONELINE (ASN1_STRFLGS_RFC2253 | \ + ASN1_STRFLGS_ESC_QUOTE | \ + XN_FLAG_SEP_CPLUS_SPC | \ + XN_FLAG_SPC_EQ | \ + XN_FLAG_FN_SN) + +/* readable multiline form */ + +# define XN_FLAG_MULTILINE (ASN1_STRFLGS_ESC_CTRL | \ + ASN1_STRFLGS_ESC_MSB | \ + XN_FLAG_SEP_MULTILINE | \ + XN_FLAG_SPC_EQ | \ + XN_FLAG_FN_LN | \ + XN_FLAG_FN_ALIGN) + +struct x509_revoked_st { + ASN1_INTEGER *serialNumber; + ASN1_TIME *revocationDate; + STACK_OF(X509_EXTENSION) /* optional */ *extensions; + /* Set up if indirect CRL */ + STACK_OF(GENERAL_NAME) *issuer; + /* Revocation reason */ + int reason; + int sequence; /* load sequence */ +}; + +DECLARE_STACK_OF(X509_REVOKED) +DECLARE_ASN1_SET_OF(X509_REVOKED) + +typedef struct X509_crl_info_st { + ASN1_INTEGER *version; + X509_ALGOR *sig_alg; + X509_NAME *issuer; + ASN1_TIME *lastUpdate; + ASN1_TIME *nextUpdate; + STACK_OF(X509_REVOKED) *revoked; + STACK_OF(X509_EXTENSION) /* [0] */ *extensions; + ASN1_ENCODING enc; +} X509_CRL_INFO; + +struct X509_crl_st { + /* actual signature */ + X509_CRL_INFO *crl; + X509_ALGOR *sig_alg; + ASN1_BIT_STRING *signature; + int references; + int flags; + /* Copies of various extensions */ + AUTHORITY_KEYID *akid; + ISSUING_DIST_POINT *idp; + /* Convenient breakdown of IDP */ + int idp_flags; + int idp_reasons; + /* CRL and base CRL numbers for delta processing */ + ASN1_INTEGER *crl_number; + ASN1_INTEGER *base_crl_number; +# ifndef OPENSSL_NO_SHA + unsigned char sha1_hash[SHA_DIGEST_LENGTH]; +# endif + STACK_OF(GENERAL_NAMES) *issuers; + const X509_CRL_METHOD *meth; + void *meth_data; +} /* X509_CRL */ ; + +DECLARE_STACK_OF(X509_CRL) +DECLARE_ASN1_SET_OF(X509_CRL) + +typedef struct private_key_st { + int version; + /* The PKCS#8 data types */ + X509_ALGOR *enc_algor; + ASN1_OCTET_STRING *enc_pkey; /* encrypted pub key */ + /* When decrypted, the following will not be NULL */ + EVP_PKEY *dec_pkey; + /* used to encrypt and decrypt */ + int key_length; + char *key_data; + int key_free; /* true if we should auto free key_data */ + /* expanded version of 'enc_algor' */ + EVP_CIPHER_INFO cipher; + int references; +} X509_PKEY; + +# ifndef OPENSSL_NO_EVP +typedef struct X509_info_st { + X509 *x509; + X509_CRL *crl; + X509_PKEY *x_pkey; + EVP_CIPHER_INFO enc_cipher; + int enc_len; + char *enc_data; + int references; +} X509_INFO; + +DECLARE_STACK_OF(X509_INFO) +# endif + +/* + * The next 2 structures and their 8 routines were sent to me by Pat Richard + * and are used to manipulate Netscapes spki structures - + * useful if you are writing a CA web page + */ +typedef struct Netscape_spkac_st { + X509_PUBKEY *pubkey; + ASN1_IA5STRING *challenge; /* challenge sent in atlas >= PR2 */ +} NETSCAPE_SPKAC; + +typedef struct Netscape_spki_st { + NETSCAPE_SPKAC *spkac; /* signed public key and challenge */ + X509_ALGOR *sig_algor; + ASN1_BIT_STRING *signature; +} NETSCAPE_SPKI; + +/* Netscape certificate sequence structure */ +typedef struct Netscape_certificate_sequence { + ASN1_OBJECT *type; + STACK_OF(X509) *certs; +} NETSCAPE_CERT_SEQUENCE; + +/*- Unused (and iv length is wrong) +typedef struct CBCParameter_st + { + unsigned char iv[8]; + } CBC_PARAM; +*/ + +/* Password based encryption structure */ + +typedef struct PBEPARAM_st { + ASN1_OCTET_STRING *salt; + ASN1_INTEGER *iter; +} PBEPARAM; + +/* Password based encryption V2 structures */ + +typedef struct PBE2PARAM_st { + X509_ALGOR *keyfunc; + X509_ALGOR *encryption; +} PBE2PARAM; + +typedef struct PBKDF2PARAM_st { +/* Usually OCTET STRING but could be anything */ + ASN1_TYPE *salt; + ASN1_INTEGER *iter; + ASN1_INTEGER *keylength; + X509_ALGOR *prf; +} PBKDF2PARAM; + +/* PKCS#8 private key info structure */ + +struct pkcs8_priv_key_info_st { + /* Flag for various broken formats */ + int broken; +# define PKCS8_OK 0 +# define PKCS8_NO_OCTET 1 +# define PKCS8_EMBEDDED_PARAM 2 +# define PKCS8_NS_DB 3 +# define PKCS8_NEG_PRIVKEY 4 + ASN1_INTEGER *version; + X509_ALGOR *pkeyalg; + /* Should be OCTET STRING but some are broken */ + ASN1_TYPE *pkey; + STACK_OF(X509_ATTRIBUTE) *attributes; +}; + +#ifdef __cplusplus +} +#endif + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# define X509_EXT_PACK_UNKNOWN 1 +# define X509_EXT_PACK_STRING 2 + +# define X509_get_version(x) ASN1_INTEGER_get((x)->cert_info->version) +/* #define X509_get_serialNumber(x) ((x)->cert_info->serialNumber) */ +# define X509_get_notBefore(x) ((x)->cert_info->validity->notBefore) +# define X509_get_notAfter(x) ((x)->cert_info->validity->notAfter) +# define X509_extract_key(x) X509_get_pubkey(x)/*****/ +# define X509_REQ_get_version(x) ASN1_INTEGER_get((x)->req_info->version) +# define X509_REQ_get_subject_name(x) ((x)->req_info->subject) +# define X509_REQ_extract_key(a) X509_REQ_get_pubkey(a) +# define X509_name_cmp(a,b) X509_NAME_cmp((a),(b)) +# define X509_get_signature_type(x) EVP_PKEY_type(OBJ_obj2nid((x)->sig_alg->algorithm)) + +# define X509_CRL_get_version(x) ASN1_INTEGER_get((x)->crl->version) +# define X509_CRL_get_lastUpdate(x) ((x)->crl->lastUpdate) +# define X509_CRL_get_nextUpdate(x) ((x)->crl->nextUpdate) +# define X509_CRL_get_issuer(x) ((x)->crl->issuer) +# define X509_CRL_get_REVOKED(x) ((x)->crl->revoked) + +void X509_CRL_set_default_method(const X509_CRL_METHOD *meth); +X509_CRL_METHOD *X509_CRL_METHOD_new(int (*crl_init) (X509_CRL *crl), + int (*crl_free) (X509_CRL *crl), + int (*crl_lookup) (X509_CRL *crl, + X509_REVOKED **ret, + ASN1_INTEGER *ser, + X509_NAME *issuer), + int (*crl_verify) (X509_CRL *crl, + EVP_PKEY *pk)); +void X509_CRL_METHOD_free(X509_CRL_METHOD *m); + +void X509_CRL_set_meth_data(X509_CRL *crl, void *dat); +void *X509_CRL_get_meth_data(X509_CRL *crl); + +/* + * This one is only used so that a binary form can output, as in + * i2d_X509_NAME(X509_get_X509_PUBKEY(x),&buf) + */ +# define X509_get_X509_PUBKEY(x) ((x)->cert_info->key) + +const char *X509_verify_cert_error_string(long n); + +# ifndef OPENSSL_NO_EVP +int X509_verify(X509 *a, EVP_PKEY *r); + +int X509_REQ_verify(X509_REQ *a, EVP_PKEY *r); +int X509_CRL_verify(X509_CRL *a, EVP_PKEY *r); +int NETSCAPE_SPKI_verify(NETSCAPE_SPKI *a, EVP_PKEY *r); + +NETSCAPE_SPKI *NETSCAPE_SPKI_b64_decode(const char *str, int len); +char *NETSCAPE_SPKI_b64_encode(NETSCAPE_SPKI *x); +EVP_PKEY *NETSCAPE_SPKI_get_pubkey(NETSCAPE_SPKI *x); +int NETSCAPE_SPKI_set_pubkey(NETSCAPE_SPKI *x, EVP_PKEY *pkey); + +int NETSCAPE_SPKI_print(BIO *out, NETSCAPE_SPKI *spki); + +int X509_signature_dump(BIO *bp, const ASN1_STRING *sig, int indent); +int X509_signature_print(BIO *bp, X509_ALGOR *alg, ASN1_STRING *sig); + +int X509_sign(X509 *x, EVP_PKEY *pkey, const EVP_MD *md); +int X509_sign_ctx(X509 *x, EVP_MD_CTX *ctx); +int X509_http_nbio(OCSP_REQ_CTX *rctx, X509 **pcert); +int X509_REQ_sign(X509_REQ *x, EVP_PKEY *pkey, const EVP_MD *md); +int X509_REQ_sign_ctx(X509_REQ *x, EVP_MD_CTX *ctx); +int X509_CRL_sign(X509_CRL *x, EVP_PKEY *pkey, const EVP_MD *md); +int X509_CRL_sign_ctx(X509_CRL *x, EVP_MD_CTX *ctx); +int X509_CRL_http_nbio(OCSP_REQ_CTX *rctx, X509_CRL **pcrl); +int NETSCAPE_SPKI_sign(NETSCAPE_SPKI *x, EVP_PKEY *pkey, const EVP_MD *md); + +int X509_pubkey_digest(const X509 *data, const EVP_MD *type, + unsigned char *md, unsigned int *len); +int X509_digest(const X509 *data, const EVP_MD *type, + unsigned char *md, unsigned int *len); +int X509_CRL_digest(const X509_CRL *data, const EVP_MD *type, + unsigned char *md, unsigned int *len); +int X509_REQ_digest(const X509_REQ *data, const EVP_MD *type, + unsigned char *md, unsigned int *len); +int X509_NAME_digest(const X509_NAME *data, const EVP_MD *type, + unsigned char *md, unsigned int *len); +# endif + +# ifndef OPENSSL_NO_FP_API +X509 *d2i_X509_fp(FILE *fp, X509 **x509); +int i2d_X509_fp(FILE *fp, X509 *x509); +X509_CRL *d2i_X509_CRL_fp(FILE *fp, X509_CRL **crl); +int i2d_X509_CRL_fp(FILE *fp, X509_CRL *crl); +X509_REQ *d2i_X509_REQ_fp(FILE *fp, X509_REQ **req); +int i2d_X509_REQ_fp(FILE *fp, X509_REQ *req); +# ifndef OPENSSL_NO_RSA +RSA *d2i_RSAPrivateKey_fp(FILE *fp, RSA **rsa); +int i2d_RSAPrivateKey_fp(FILE *fp, RSA *rsa); +RSA *d2i_RSAPublicKey_fp(FILE *fp, RSA **rsa); +int i2d_RSAPublicKey_fp(FILE *fp, RSA *rsa); +RSA *d2i_RSA_PUBKEY_fp(FILE *fp, RSA **rsa); +int i2d_RSA_PUBKEY_fp(FILE *fp, RSA *rsa); +# endif +# ifndef OPENSSL_NO_DSA +DSA *d2i_DSA_PUBKEY_fp(FILE *fp, DSA **dsa); +int i2d_DSA_PUBKEY_fp(FILE *fp, DSA *dsa); +DSA *d2i_DSAPrivateKey_fp(FILE *fp, DSA **dsa); +int i2d_DSAPrivateKey_fp(FILE *fp, DSA *dsa); +# endif +# ifndef OPENSSL_NO_EC +EC_KEY *d2i_EC_PUBKEY_fp(FILE *fp, EC_KEY **eckey); +int i2d_EC_PUBKEY_fp(FILE *fp, EC_KEY *eckey); +EC_KEY *d2i_ECPrivateKey_fp(FILE *fp, EC_KEY **eckey); +int i2d_ECPrivateKey_fp(FILE *fp, EC_KEY *eckey); +# endif +X509_SIG *d2i_PKCS8_fp(FILE *fp, X509_SIG **p8); +int i2d_PKCS8_fp(FILE *fp, X509_SIG *p8); +PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_fp(FILE *fp, + PKCS8_PRIV_KEY_INFO **p8inf); +int i2d_PKCS8_PRIV_KEY_INFO_fp(FILE *fp, PKCS8_PRIV_KEY_INFO *p8inf); +int i2d_PKCS8PrivateKeyInfo_fp(FILE *fp, EVP_PKEY *key); +int i2d_PrivateKey_fp(FILE *fp, EVP_PKEY *pkey); +EVP_PKEY *d2i_PrivateKey_fp(FILE *fp, EVP_PKEY **a); +int i2d_PUBKEY_fp(FILE *fp, EVP_PKEY *pkey); +EVP_PKEY *d2i_PUBKEY_fp(FILE *fp, EVP_PKEY **a); +# endif + +# ifndef OPENSSL_NO_BIO +X509 *d2i_X509_bio(BIO *bp, X509 **x509); +int i2d_X509_bio(BIO *bp, X509 *x509); +X509_CRL *d2i_X509_CRL_bio(BIO *bp, X509_CRL **crl); +int i2d_X509_CRL_bio(BIO *bp, X509_CRL *crl); +X509_REQ *d2i_X509_REQ_bio(BIO *bp, X509_REQ **req); +int i2d_X509_REQ_bio(BIO *bp, X509_REQ *req); +# ifndef OPENSSL_NO_RSA +RSA *d2i_RSAPrivateKey_bio(BIO *bp, RSA **rsa); +int i2d_RSAPrivateKey_bio(BIO *bp, RSA *rsa); +RSA *d2i_RSAPublicKey_bio(BIO *bp, RSA **rsa); +int i2d_RSAPublicKey_bio(BIO *bp, RSA *rsa); +RSA *d2i_RSA_PUBKEY_bio(BIO *bp, RSA **rsa); +int i2d_RSA_PUBKEY_bio(BIO *bp, RSA *rsa); +# endif +# ifndef OPENSSL_NO_DSA +DSA *d2i_DSA_PUBKEY_bio(BIO *bp, DSA **dsa); +int i2d_DSA_PUBKEY_bio(BIO *bp, DSA *dsa); +DSA *d2i_DSAPrivateKey_bio(BIO *bp, DSA **dsa); +int i2d_DSAPrivateKey_bio(BIO *bp, DSA *dsa); +# endif +# ifndef OPENSSL_NO_EC +EC_KEY *d2i_EC_PUBKEY_bio(BIO *bp, EC_KEY **eckey); +int i2d_EC_PUBKEY_bio(BIO *bp, EC_KEY *eckey); +EC_KEY *d2i_ECPrivateKey_bio(BIO *bp, EC_KEY **eckey); +int i2d_ECPrivateKey_bio(BIO *bp, EC_KEY *eckey); +# endif +X509_SIG *d2i_PKCS8_bio(BIO *bp, X509_SIG **p8); +int i2d_PKCS8_bio(BIO *bp, X509_SIG *p8); +PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_bio(BIO *bp, + PKCS8_PRIV_KEY_INFO **p8inf); +int i2d_PKCS8_PRIV_KEY_INFO_bio(BIO *bp, PKCS8_PRIV_KEY_INFO *p8inf); +int i2d_PKCS8PrivateKeyInfo_bio(BIO *bp, EVP_PKEY *key); +int i2d_PrivateKey_bio(BIO *bp, EVP_PKEY *pkey); +EVP_PKEY *d2i_PrivateKey_bio(BIO *bp, EVP_PKEY **a); +int i2d_PUBKEY_bio(BIO *bp, EVP_PKEY *pkey); +EVP_PKEY *d2i_PUBKEY_bio(BIO *bp, EVP_PKEY **a); +# endif + +X509 *X509_dup(X509 *x509); +X509_ATTRIBUTE *X509_ATTRIBUTE_dup(X509_ATTRIBUTE *xa); +X509_EXTENSION *X509_EXTENSION_dup(X509_EXTENSION *ex); +X509_CRL *X509_CRL_dup(X509_CRL *crl); +X509_REVOKED *X509_REVOKED_dup(X509_REVOKED *rev); +X509_REQ *X509_REQ_dup(X509_REQ *req); +X509_ALGOR *X509_ALGOR_dup(X509_ALGOR *xn); +int X509_ALGOR_set0(X509_ALGOR *alg, ASN1_OBJECT *aobj, int ptype, + void *pval); +void X509_ALGOR_get0(ASN1_OBJECT **paobj, int *pptype, void **ppval, + X509_ALGOR *algor); +void X509_ALGOR_set_md(X509_ALGOR *alg, const EVP_MD *md); +int X509_ALGOR_cmp(const X509_ALGOR *a, const X509_ALGOR *b); + +X509_NAME *X509_NAME_dup(X509_NAME *xn); +X509_NAME_ENTRY *X509_NAME_ENTRY_dup(X509_NAME_ENTRY *ne); + +int X509_cmp_time(const ASN1_TIME *s, time_t *t); +int X509_cmp_current_time(const ASN1_TIME *s); +ASN1_TIME *X509_time_adj(ASN1_TIME *s, long adj, time_t *t); +ASN1_TIME *X509_time_adj_ex(ASN1_TIME *s, + int offset_day, long offset_sec, time_t *t); +ASN1_TIME *X509_gmtime_adj(ASN1_TIME *s, long adj); + +const char *X509_get_default_cert_area(void); +const char *X509_get_default_cert_dir(void); +const char *X509_get_default_cert_file(void); +const char *X509_get_default_cert_dir_env(void); +const char *X509_get_default_cert_file_env(void); +const char *X509_get_default_private_dir(void); + +X509_REQ *X509_to_X509_REQ(X509 *x, EVP_PKEY *pkey, const EVP_MD *md); +X509 *X509_REQ_to_X509(X509_REQ *r, int days, EVP_PKEY *pkey); + +DECLARE_ASN1_FUNCTIONS(X509_ALGOR) +DECLARE_ASN1_ENCODE_FUNCTIONS(X509_ALGORS, X509_ALGORS, X509_ALGORS) +DECLARE_ASN1_FUNCTIONS(X509_VAL) + +DECLARE_ASN1_FUNCTIONS(X509_PUBKEY) + +int X509_PUBKEY_set(X509_PUBKEY **x, EVP_PKEY *pkey); +EVP_PKEY *X509_PUBKEY_get(X509_PUBKEY *key); +int X509_get_pubkey_parameters(EVP_PKEY *pkey, STACK_OF(X509) *chain); +int i2d_PUBKEY(EVP_PKEY *a, unsigned char **pp); +EVP_PKEY *d2i_PUBKEY(EVP_PKEY **a, const unsigned char **pp, long length); +# ifndef OPENSSL_NO_RSA +int i2d_RSA_PUBKEY(RSA *a, unsigned char **pp); +RSA *d2i_RSA_PUBKEY(RSA **a, const unsigned char **pp, long length); +# endif +# ifndef OPENSSL_NO_DSA +int i2d_DSA_PUBKEY(DSA *a, unsigned char **pp); +DSA *d2i_DSA_PUBKEY(DSA **a, const unsigned char **pp, long length); +# endif +# ifndef OPENSSL_NO_EC +int i2d_EC_PUBKEY(EC_KEY *a, unsigned char **pp); +EC_KEY *d2i_EC_PUBKEY(EC_KEY **a, const unsigned char **pp, long length); +# endif + +DECLARE_ASN1_FUNCTIONS(X509_SIG) +DECLARE_ASN1_FUNCTIONS(X509_REQ_INFO) +DECLARE_ASN1_FUNCTIONS(X509_REQ) + +DECLARE_ASN1_FUNCTIONS(X509_ATTRIBUTE) +X509_ATTRIBUTE *X509_ATTRIBUTE_create(int nid, int atrtype, void *value); + +DECLARE_ASN1_FUNCTIONS(X509_EXTENSION) +DECLARE_ASN1_ENCODE_FUNCTIONS(X509_EXTENSIONS, X509_EXTENSIONS, X509_EXTENSIONS) + +DECLARE_ASN1_FUNCTIONS(X509_NAME_ENTRY) + +DECLARE_ASN1_FUNCTIONS(X509_NAME) + +int X509_NAME_set(X509_NAME **xn, X509_NAME *name); + +DECLARE_ASN1_FUNCTIONS(X509_CINF) + +DECLARE_ASN1_FUNCTIONS(X509) +DECLARE_ASN1_FUNCTIONS(X509_CERT_AUX) + +DECLARE_ASN1_FUNCTIONS(X509_CERT_PAIR) + +int X509_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); +int X509_set_ex_data(X509 *r, int idx, void *arg); +void *X509_get_ex_data(X509 *r, int idx); +int i2d_X509_AUX(X509 *a, unsigned char **pp); +X509 *d2i_X509_AUX(X509 **a, const unsigned char **pp, long length); + +int i2d_re_X509_tbs(X509 *x, unsigned char **pp); + +void X509_get0_signature(ASN1_BIT_STRING **psig, X509_ALGOR **palg, + const X509 *x); +int X509_get_signature_nid(const X509 *x); + +int X509_alias_set1(X509 *x, unsigned char *name, int len); +int X509_keyid_set1(X509 *x, unsigned char *id, int len); +unsigned char *X509_alias_get0(X509 *x, int *len); +unsigned char *X509_keyid_get0(X509 *x, int *len); +int (*X509_TRUST_set_default(int (*trust) (int, X509 *, int))) (int, X509 *, + int); +int X509_TRUST_set(int *t, int trust); +int X509_add1_trust_object(X509 *x, ASN1_OBJECT *obj); +int X509_add1_reject_object(X509 *x, ASN1_OBJECT *obj); +void X509_trust_clear(X509 *x); +void X509_reject_clear(X509 *x); + +DECLARE_ASN1_FUNCTIONS(X509_REVOKED) +DECLARE_ASN1_FUNCTIONS(X509_CRL_INFO) +DECLARE_ASN1_FUNCTIONS(X509_CRL) + +int X509_CRL_add0_revoked(X509_CRL *crl, X509_REVOKED *rev); +int X509_CRL_get0_by_serial(X509_CRL *crl, + X509_REVOKED **ret, ASN1_INTEGER *serial); +int X509_CRL_get0_by_cert(X509_CRL *crl, X509_REVOKED **ret, X509 *x); + +X509_PKEY *X509_PKEY_new(void); +void X509_PKEY_free(X509_PKEY *a); +int i2d_X509_PKEY(X509_PKEY *a, unsigned char **pp); +X509_PKEY *d2i_X509_PKEY(X509_PKEY **a, const unsigned char **pp, + long length); + +DECLARE_ASN1_FUNCTIONS(NETSCAPE_SPKI) +DECLARE_ASN1_FUNCTIONS(NETSCAPE_SPKAC) +DECLARE_ASN1_FUNCTIONS(NETSCAPE_CERT_SEQUENCE) + +# ifndef OPENSSL_NO_EVP +X509_INFO *X509_INFO_new(void); +void X509_INFO_free(X509_INFO *a); +char *X509_NAME_oneline(X509_NAME *a, char *buf, int size); + +int ASN1_verify(i2d_of_void *i2d, X509_ALGOR *algor1, + ASN1_BIT_STRING *signature, char *data, EVP_PKEY *pkey); + +int ASN1_digest(i2d_of_void *i2d, const EVP_MD *type, char *data, + unsigned char *md, unsigned int *len); + +int ASN1_sign(i2d_of_void *i2d, X509_ALGOR *algor1, + X509_ALGOR *algor2, ASN1_BIT_STRING *signature, + char *data, EVP_PKEY *pkey, const EVP_MD *type); + +int ASN1_item_digest(const ASN1_ITEM *it, const EVP_MD *type, void *data, + unsigned char *md, unsigned int *len); + +int ASN1_item_verify(const ASN1_ITEM *it, X509_ALGOR *algor1, + ASN1_BIT_STRING *signature, void *data, EVP_PKEY *pkey); + +int ASN1_item_sign(const ASN1_ITEM *it, X509_ALGOR *algor1, + X509_ALGOR *algor2, ASN1_BIT_STRING *signature, void *data, + EVP_PKEY *pkey, const EVP_MD *type); +int ASN1_item_sign_ctx(const ASN1_ITEM *it, X509_ALGOR *algor1, + X509_ALGOR *algor2, ASN1_BIT_STRING *signature, + void *asn, EVP_MD_CTX *ctx); +# endif + +int X509_set_version(X509 *x, long version); +int X509_set_serialNumber(X509 *x, ASN1_INTEGER *serial); +ASN1_INTEGER *X509_get_serialNumber(X509 *x); +int X509_set_issuer_name(X509 *x, X509_NAME *name); +X509_NAME *X509_get_issuer_name(X509 *a); +int X509_set_subject_name(X509 *x, X509_NAME *name); +X509_NAME *X509_get_subject_name(X509 *a); +int X509_set_notBefore(X509 *x, const ASN1_TIME *tm); +int X509_set_notAfter(X509 *x, const ASN1_TIME *tm); +int X509_set_pubkey(X509 *x, EVP_PKEY *pkey); +EVP_PKEY *X509_get_pubkey(X509 *x); +ASN1_BIT_STRING *X509_get0_pubkey_bitstr(const X509 *x); +int X509_certificate_type(X509 *x, EVP_PKEY *pubkey /* optional */ ); + +int X509_REQ_set_version(X509_REQ *x, long version); +int X509_REQ_set_subject_name(X509_REQ *req, X509_NAME *name); +int X509_REQ_set_pubkey(X509_REQ *x, EVP_PKEY *pkey); +EVP_PKEY *X509_REQ_get_pubkey(X509_REQ *req); +int X509_REQ_extension_nid(int nid); +int *X509_REQ_get_extension_nids(void); +void X509_REQ_set_extension_nids(int *nids); +STACK_OF(X509_EXTENSION) *X509_REQ_get_extensions(X509_REQ *req); +int X509_REQ_add_extensions_nid(X509_REQ *req, STACK_OF(X509_EXTENSION) *exts, + int nid); +int X509_REQ_add_extensions(X509_REQ *req, STACK_OF(X509_EXTENSION) *exts); +int X509_REQ_get_attr_count(const X509_REQ *req); +int X509_REQ_get_attr_by_NID(const X509_REQ *req, int nid, int lastpos); +int X509_REQ_get_attr_by_OBJ(const X509_REQ *req, ASN1_OBJECT *obj, + int lastpos); +X509_ATTRIBUTE *X509_REQ_get_attr(const X509_REQ *req, int loc); +X509_ATTRIBUTE *X509_REQ_delete_attr(X509_REQ *req, int loc); +int X509_REQ_add1_attr(X509_REQ *req, X509_ATTRIBUTE *attr); +int X509_REQ_add1_attr_by_OBJ(X509_REQ *req, + const ASN1_OBJECT *obj, int type, + const unsigned char *bytes, int len); +int X509_REQ_add1_attr_by_NID(X509_REQ *req, + int nid, int type, + const unsigned char *bytes, int len); +int X509_REQ_add1_attr_by_txt(X509_REQ *req, + const char *attrname, int type, + const unsigned char *bytes, int len); + +int X509_CRL_set_version(X509_CRL *x, long version); +int X509_CRL_set_issuer_name(X509_CRL *x, X509_NAME *name); +int X509_CRL_set_lastUpdate(X509_CRL *x, const ASN1_TIME *tm); +int X509_CRL_set_nextUpdate(X509_CRL *x, const ASN1_TIME *tm); +int X509_CRL_sort(X509_CRL *crl); + +int X509_REVOKED_set_serialNumber(X509_REVOKED *x, ASN1_INTEGER *serial); +int X509_REVOKED_set_revocationDate(X509_REVOKED *r, ASN1_TIME *tm); + +X509_CRL *X509_CRL_diff(X509_CRL *base, X509_CRL *newer, + EVP_PKEY *skey, const EVP_MD *md, unsigned int flags); + +int X509_REQ_check_private_key(X509_REQ *x509, EVP_PKEY *pkey); + +int X509_check_private_key(X509 *x509, EVP_PKEY *pkey); +int X509_chain_check_suiteb(int *perror_depth, + X509 *x, STACK_OF(X509) *chain, + unsigned long flags); +int X509_CRL_check_suiteb(X509_CRL *crl, EVP_PKEY *pk, unsigned long flags); +STACK_OF(X509) *X509_chain_up_ref(STACK_OF(X509) *chain); + +int X509_issuer_and_serial_cmp(const X509 *a, const X509 *b); +unsigned long X509_issuer_and_serial_hash(X509 *a); + +int X509_issuer_name_cmp(const X509 *a, const X509 *b); +unsigned long X509_issuer_name_hash(X509 *a); + +int X509_subject_name_cmp(const X509 *a, const X509 *b); +unsigned long X509_subject_name_hash(X509 *x); + +# ifndef OPENSSL_NO_MD5 +unsigned long X509_issuer_name_hash_old(X509 *a); +unsigned long X509_subject_name_hash_old(X509 *x); +# endif + +int X509_cmp(const X509 *a, const X509 *b); +int X509_NAME_cmp(const X509_NAME *a, const X509_NAME *b); +unsigned long X509_NAME_hash(X509_NAME *x); +unsigned long X509_NAME_hash_old(X509_NAME *x); + +int X509_CRL_cmp(const X509_CRL *a, const X509_CRL *b); +int X509_CRL_match(const X509_CRL *a, const X509_CRL *b); +# ifndef OPENSSL_NO_FP_API +int X509_print_ex_fp(FILE *bp, X509 *x, unsigned long nmflag, + unsigned long cflag); +int X509_print_fp(FILE *bp, X509 *x); +int X509_CRL_print_fp(FILE *bp, X509_CRL *x); +int X509_REQ_print_fp(FILE *bp, X509_REQ *req); +int X509_NAME_print_ex_fp(FILE *fp, X509_NAME *nm, int indent, + unsigned long flags); +# endif + +# ifndef OPENSSL_NO_BIO +int X509_NAME_print(BIO *bp, X509_NAME *name, int obase); +int X509_NAME_print_ex(BIO *out, X509_NAME *nm, int indent, + unsigned long flags); +int X509_print_ex(BIO *bp, X509 *x, unsigned long nmflag, + unsigned long cflag); +int X509_print(BIO *bp, X509 *x); +int X509_ocspid_print(BIO *bp, X509 *x); +int X509_CERT_AUX_print(BIO *bp, X509_CERT_AUX *x, int indent); +int X509_CRL_print(BIO *bp, X509_CRL *x); +int X509_REQ_print_ex(BIO *bp, X509_REQ *x, unsigned long nmflag, + unsigned long cflag); +int X509_REQ_print(BIO *bp, X509_REQ *req); +# endif + +int X509_NAME_entry_count(X509_NAME *name); +int X509_NAME_get_text_by_NID(X509_NAME *name, int nid, char *buf, int len); +int X509_NAME_get_text_by_OBJ(X509_NAME *name, ASN1_OBJECT *obj, + char *buf, int len); + +/* + * NOTE: you should be passsing -1, not 0 as lastpos. The functions that use + * lastpos, search after that position on. + */ +int X509_NAME_get_index_by_NID(X509_NAME *name, int nid, int lastpos); +int X509_NAME_get_index_by_OBJ(X509_NAME *name, ASN1_OBJECT *obj, + int lastpos); +X509_NAME_ENTRY *X509_NAME_get_entry(X509_NAME *name, int loc); +X509_NAME_ENTRY *X509_NAME_delete_entry(X509_NAME *name, int loc); +int X509_NAME_add_entry(X509_NAME *name, X509_NAME_ENTRY *ne, + int loc, int set); +int X509_NAME_add_entry_by_OBJ(X509_NAME *name, ASN1_OBJECT *obj, int type, + unsigned char *bytes, int len, int loc, + int set); +int X509_NAME_add_entry_by_NID(X509_NAME *name, int nid, int type, + unsigned char *bytes, int len, int loc, + int set); +X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_txt(X509_NAME_ENTRY **ne, + const char *field, int type, + const unsigned char *bytes, + int len); +X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_NID(X509_NAME_ENTRY **ne, int nid, + int type, unsigned char *bytes, + int len); +int X509_NAME_add_entry_by_txt(X509_NAME *name, const char *field, int type, + const unsigned char *bytes, int len, int loc, + int set); +X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_OBJ(X509_NAME_ENTRY **ne, + ASN1_OBJECT *obj, int type, + const unsigned char *bytes, + int len); +int X509_NAME_ENTRY_set_object(X509_NAME_ENTRY *ne, ASN1_OBJECT *obj); +int X509_NAME_ENTRY_set_data(X509_NAME_ENTRY *ne, int type, + const unsigned char *bytes, int len); +ASN1_OBJECT *X509_NAME_ENTRY_get_object(X509_NAME_ENTRY *ne); +ASN1_STRING *X509_NAME_ENTRY_get_data(X509_NAME_ENTRY *ne); + +int X509v3_get_ext_count(const STACK_OF(X509_EXTENSION) *x); +int X509v3_get_ext_by_NID(const STACK_OF(X509_EXTENSION) *x, + int nid, int lastpos); +int X509v3_get_ext_by_OBJ(const STACK_OF(X509_EXTENSION) *x, + ASN1_OBJECT *obj, int lastpos); +int X509v3_get_ext_by_critical(const STACK_OF(X509_EXTENSION) *x, + int crit, int lastpos); +X509_EXTENSION *X509v3_get_ext(const STACK_OF(X509_EXTENSION) *x, int loc); +X509_EXTENSION *X509v3_delete_ext(STACK_OF(X509_EXTENSION) *x, int loc); +STACK_OF(X509_EXTENSION) *X509v3_add_ext(STACK_OF(X509_EXTENSION) **x, + X509_EXTENSION *ex, int loc); + +int X509_get_ext_count(X509 *x); +int X509_get_ext_by_NID(X509 *x, int nid, int lastpos); +int X509_get_ext_by_OBJ(X509 *x, ASN1_OBJECT *obj, int lastpos); +int X509_get_ext_by_critical(X509 *x, int crit, int lastpos); +X509_EXTENSION *X509_get_ext(X509 *x, int loc); +X509_EXTENSION *X509_delete_ext(X509 *x, int loc); +int X509_add_ext(X509 *x, X509_EXTENSION *ex, int loc); +void *X509_get_ext_d2i(X509 *x, int nid, int *crit, int *idx); +int X509_add1_ext_i2d(X509 *x, int nid, void *value, int crit, + unsigned long flags); + +int X509_CRL_get_ext_count(X509_CRL *x); +int X509_CRL_get_ext_by_NID(X509_CRL *x, int nid, int lastpos); +int X509_CRL_get_ext_by_OBJ(X509_CRL *x, ASN1_OBJECT *obj, int lastpos); +int X509_CRL_get_ext_by_critical(X509_CRL *x, int crit, int lastpos); +X509_EXTENSION *X509_CRL_get_ext(X509_CRL *x, int loc); +X509_EXTENSION *X509_CRL_delete_ext(X509_CRL *x, int loc); +int X509_CRL_add_ext(X509_CRL *x, X509_EXTENSION *ex, int loc); +void *X509_CRL_get_ext_d2i(X509_CRL *x, int nid, int *crit, int *idx); +int X509_CRL_add1_ext_i2d(X509_CRL *x, int nid, void *value, int crit, + unsigned long flags); + +int X509_REVOKED_get_ext_count(X509_REVOKED *x); +int X509_REVOKED_get_ext_by_NID(X509_REVOKED *x, int nid, int lastpos); +int X509_REVOKED_get_ext_by_OBJ(X509_REVOKED *x, ASN1_OBJECT *obj, + int lastpos); +int X509_REVOKED_get_ext_by_critical(X509_REVOKED *x, int crit, int lastpos); +X509_EXTENSION *X509_REVOKED_get_ext(X509_REVOKED *x, int loc); +X509_EXTENSION *X509_REVOKED_delete_ext(X509_REVOKED *x, int loc); +int X509_REVOKED_add_ext(X509_REVOKED *x, X509_EXTENSION *ex, int loc); +void *X509_REVOKED_get_ext_d2i(X509_REVOKED *x, int nid, int *crit, int *idx); +int X509_REVOKED_add1_ext_i2d(X509_REVOKED *x, int nid, void *value, int crit, + unsigned long flags); + +X509_EXTENSION *X509_EXTENSION_create_by_NID(X509_EXTENSION **ex, + int nid, int crit, + ASN1_OCTET_STRING *data); +X509_EXTENSION *X509_EXTENSION_create_by_OBJ(X509_EXTENSION **ex, + ASN1_OBJECT *obj, int crit, + ASN1_OCTET_STRING *data); +int X509_EXTENSION_set_object(X509_EXTENSION *ex, ASN1_OBJECT *obj); +int X509_EXTENSION_set_critical(X509_EXTENSION *ex, int crit); +int X509_EXTENSION_set_data(X509_EXTENSION *ex, ASN1_OCTET_STRING *data); +ASN1_OBJECT *X509_EXTENSION_get_object(X509_EXTENSION *ex); +ASN1_OCTET_STRING *X509_EXTENSION_get_data(X509_EXTENSION *ne); +int X509_EXTENSION_get_critical(X509_EXTENSION *ex); + +int X509at_get_attr_count(const STACK_OF(X509_ATTRIBUTE) *x); +int X509at_get_attr_by_NID(const STACK_OF(X509_ATTRIBUTE) *x, int nid, + int lastpos); +int X509at_get_attr_by_OBJ(const STACK_OF(X509_ATTRIBUTE) *sk, + ASN1_OBJECT *obj, int lastpos); +X509_ATTRIBUTE *X509at_get_attr(const STACK_OF(X509_ATTRIBUTE) *x, int loc); +X509_ATTRIBUTE *X509at_delete_attr(STACK_OF(X509_ATTRIBUTE) *x, int loc); +STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr(STACK_OF(X509_ATTRIBUTE) **x, + X509_ATTRIBUTE *attr); +STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_OBJ(STACK_OF(X509_ATTRIBUTE) + **x, const ASN1_OBJECT *obj, + int type, + const unsigned char *bytes, + int len); +STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_NID(STACK_OF(X509_ATTRIBUTE) + **x, int nid, int type, + const unsigned char *bytes, + int len); +STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_txt(STACK_OF(X509_ATTRIBUTE) + **x, const char *attrname, + int type, + const unsigned char *bytes, + int len); +void *X509at_get0_data_by_OBJ(STACK_OF(X509_ATTRIBUTE) *x, ASN1_OBJECT *obj, + int lastpos, int type); +X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_NID(X509_ATTRIBUTE **attr, int nid, + int atrtype, const void *data, + int len); +X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_OBJ(X509_ATTRIBUTE **attr, + const ASN1_OBJECT *obj, + int atrtype, const void *data, + int len); +X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_txt(X509_ATTRIBUTE **attr, + const char *atrname, int type, + const unsigned char *bytes, + int len); +int X509_ATTRIBUTE_set1_object(X509_ATTRIBUTE *attr, const ASN1_OBJECT *obj); +int X509_ATTRIBUTE_set1_data(X509_ATTRIBUTE *attr, int attrtype, + const void *data, int len); +void *X509_ATTRIBUTE_get0_data(X509_ATTRIBUTE *attr, int idx, int atrtype, + void *data); +int X509_ATTRIBUTE_count(X509_ATTRIBUTE *attr); +ASN1_OBJECT *X509_ATTRIBUTE_get0_object(X509_ATTRIBUTE *attr); +ASN1_TYPE *X509_ATTRIBUTE_get0_type(X509_ATTRIBUTE *attr, int idx); + +int EVP_PKEY_get_attr_count(const EVP_PKEY *key); +int EVP_PKEY_get_attr_by_NID(const EVP_PKEY *key, int nid, int lastpos); +int EVP_PKEY_get_attr_by_OBJ(const EVP_PKEY *key, ASN1_OBJECT *obj, + int lastpos); +X509_ATTRIBUTE *EVP_PKEY_get_attr(const EVP_PKEY *key, int loc); +X509_ATTRIBUTE *EVP_PKEY_delete_attr(EVP_PKEY *key, int loc); +int EVP_PKEY_add1_attr(EVP_PKEY *key, X509_ATTRIBUTE *attr); +int EVP_PKEY_add1_attr_by_OBJ(EVP_PKEY *key, + const ASN1_OBJECT *obj, int type, + const unsigned char *bytes, int len); +int EVP_PKEY_add1_attr_by_NID(EVP_PKEY *key, + int nid, int type, + const unsigned char *bytes, int len); +int EVP_PKEY_add1_attr_by_txt(EVP_PKEY *key, + const char *attrname, int type, + const unsigned char *bytes, int len); + +int X509_verify_cert(X509_STORE_CTX *ctx); + +/* lookup a cert from a X509 STACK */ +X509 *X509_find_by_issuer_and_serial(STACK_OF(X509) *sk, X509_NAME *name, + ASN1_INTEGER *serial); +X509 *X509_find_by_subject(STACK_OF(X509) *sk, X509_NAME *name); + +DECLARE_ASN1_FUNCTIONS(PBEPARAM) +DECLARE_ASN1_FUNCTIONS(PBE2PARAM) +DECLARE_ASN1_FUNCTIONS(PBKDF2PARAM) + +int PKCS5_pbe_set0_algor(X509_ALGOR *algor, int alg, int iter, + const unsigned char *salt, int saltlen); + +X509_ALGOR *PKCS5_pbe_set(int alg, int iter, + const unsigned char *salt, int saltlen); +X509_ALGOR *PKCS5_pbe2_set(const EVP_CIPHER *cipher, int iter, + unsigned char *salt, int saltlen); +X509_ALGOR *PKCS5_pbe2_set_iv(const EVP_CIPHER *cipher, int iter, + unsigned char *salt, int saltlen, + unsigned char *aiv, int prf_nid); + +X509_ALGOR *PKCS5_pbkdf2_set(int iter, unsigned char *salt, int saltlen, + int prf_nid, int keylen); + +/* PKCS#8 utilities */ + +DECLARE_ASN1_FUNCTIONS(PKCS8_PRIV_KEY_INFO) + +EVP_PKEY *EVP_PKCS82PKEY(PKCS8_PRIV_KEY_INFO *p8); +PKCS8_PRIV_KEY_INFO *EVP_PKEY2PKCS8(EVP_PKEY *pkey); +PKCS8_PRIV_KEY_INFO *EVP_PKEY2PKCS8_broken(EVP_PKEY *pkey, int broken); +PKCS8_PRIV_KEY_INFO *PKCS8_set_broken(PKCS8_PRIV_KEY_INFO *p8, int broken); + +int PKCS8_pkey_set0(PKCS8_PRIV_KEY_INFO *priv, ASN1_OBJECT *aobj, + int version, int ptype, void *pval, + unsigned char *penc, int penclen); +int PKCS8_pkey_get0(ASN1_OBJECT **ppkalg, + const unsigned char **pk, int *ppklen, + X509_ALGOR **pa, PKCS8_PRIV_KEY_INFO *p8); + +int X509_PUBKEY_set0_param(X509_PUBKEY *pub, ASN1_OBJECT *aobj, + int ptype, void *pval, + unsigned char *penc, int penclen); +int X509_PUBKEY_get0_param(ASN1_OBJECT **ppkalg, + const unsigned char **pk, int *ppklen, + X509_ALGOR **pa, X509_PUBKEY *pub); + +int X509_check_trust(X509 *x, int id, int flags); +int X509_TRUST_get_count(void); +X509_TRUST *X509_TRUST_get0(int idx); +int X509_TRUST_get_by_id(int id); +int X509_TRUST_add(int id, int flags, int (*ck) (X509_TRUST *, X509 *, int), + char *name, int arg1, void *arg2); +void X509_TRUST_cleanup(void); +int X509_TRUST_get_flags(X509_TRUST *xp); +char *X509_TRUST_get0_name(X509_TRUST *xp); +int X509_TRUST_get_trust(X509_TRUST *xp); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ + +void ERR_load_X509_strings(void); + +/* Error codes for the X509 functions. */ + +/* Function codes. */ +# define X509_F_ADD_CERT_DIR 100 +# define X509_F_BY_FILE_CTRL 101 +# define X509_F_CHECK_NAME_CONSTRAINTS 106 +# define X509_F_CHECK_POLICY 145 +# define X509_F_DIR_CTRL 102 +# define X509_F_GET_CERT_BY_SUBJECT 103 +# define X509_F_NETSCAPE_SPKI_B64_DECODE 129 +# define X509_F_NETSCAPE_SPKI_B64_ENCODE 130 +# define X509_F_X509AT_ADD1_ATTR 135 +# define X509_F_X509V3_ADD_EXT 104 +# define X509_F_X509_ATTRIBUTE_CREATE_BY_NID 136 +# define X509_F_X509_ATTRIBUTE_CREATE_BY_OBJ 137 +# define X509_F_X509_ATTRIBUTE_CREATE_BY_TXT 140 +# define X509_F_X509_ATTRIBUTE_GET0_DATA 139 +# define X509_F_X509_ATTRIBUTE_SET1_DATA 138 +# define X509_F_X509_CHECK_PRIVATE_KEY 128 +# define X509_F_X509_CRL_DIFF 105 +# define X509_F_X509_CRL_PRINT_FP 147 +# define X509_F_X509_EXTENSION_CREATE_BY_NID 108 +# define X509_F_X509_EXTENSION_CREATE_BY_OBJ 109 +# define X509_F_X509_GET_PUBKEY_PARAMETERS 110 +# define X509_F_X509_LOAD_CERT_CRL_FILE 132 +# define X509_F_X509_LOAD_CERT_FILE 111 +# define X509_F_X509_LOAD_CRL_FILE 112 +# define X509_F_X509_NAME_ADD_ENTRY 113 +# define X509_F_X509_NAME_ENTRY_CREATE_BY_NID 114 +# define X509_F_X509_NAME_ENTRY_CREATE_BY_TXT 131 +# define X509_F_X509_NAME_ENTRY_SET_OBJECT 115 +# define X509_F_X509_NAME_ONELINE 116 +# define X509_F_X509_NAME_PRINT 117 +# define X509_F_X509_PRINT_EX_FP 118 +# define X509_F_X509_PUBKEY_GET 119 +# define X509_F_X509_PUBKEY_SET 120 +# define X509_F_X509_REQ_CHECK_PRIVATE_KEY 144 +# define X509_F_X509_REQ_PRINT_EX 121 +# define X509_F_X509_REQ_PRINT_FP 122 +# define X509_F_X509_REQ_TO_X509 123 +# define X509_F_X509_STORE_ADD_CERT 124 +# define X509_F_X509_STORE_ADD_CRL 125 +# define X509_F_X509_STORE_CTX_GET1_ISSUER 146 +# define X509_F_X509_STORE_CTX_INIT 143 +# define X509_F_X509_STORE_CTX_NEW 142 +# define X509_F_X509_STORE_CTX_PURPOSE_INHERIT 134 +# define X509_F_X509_TO_X509_REQ 126 +# define X509_F_X509_TRUST_ADD 133 +# define X509_F_X509_TRUST_SET 141 +# define X509_F_X509_VERIFY_CERT 127 + +/* Reason codes. */ +# define X509_R_AKID_MISMATCH 110 +# define X509_R_BAD_X509_FILETYPE 100 +# define X509_R_BASE64_DECODE_ERROR 118 +# define X509_R_CANT_CHECK_DH_KEY 114 +# define X509_R_CERT_ALREADY_IN_HASH_TABLE 101 +# define X509_R_CRL_ALREADY_DELTA 127 +# define X509_R_CRL_VERIFY_FAILURE 131 +# define X509_R_ERR_ASN1_LIB 102 +# define X509_R_IDP_MISMATCH 128 +# define X509_R_INVALID_DIRECTORY 113 +# define X509_R_INVALID_FIELD_NAME 119 +# define X509_R_INVALID_TRUST 123 +# define X509_R_ISSUER_MISMATCH 129 +# define X509_R_KEY_TYPE_MISMATCH 115 +# define X509_R_KEY_VALUES_MISMATCH 116 +# define X509_R_LOADING_CERT_DIR 103 +# define X509_R_LOADING_DEFAULTS 104 +# define X509_R_METHOD_NOT_SUPPORTED 124 +# define X509_R_NAME_TOO_LONG 134 +# define X509_R_NEWER_CRL_NOT_NEWER 132 +# define X509_R_NO_CERT_SET_FOR_US_TO_VERIFY 105 +# define X509_R_NO_CRL_NUMBER 130 +# define X509_R_PUBLIC_KEY_DECODE_ERROR 125 +# define X509_R_PUBLIC_KEY_ENCODE_ERROR 126 +# define X509_R_SHOULD_RETRY 106 +# define X509_R_UNABLE_TO_FIND_PARAMETERS_IN_CHAIN 107 +# define X509_R_UNABLE_TO_GET_CERTS_PUBLIC_KEY 108 +# define X509_R_UNKNOWN_KEY_TYPE 117 +# define X509_R_UNKNOWN_NID 109 +# define X509_R_UNKNOWN_PURPOSE_ID 121 +# define X509_R_UNKNOWN_TRUST_ID 120 +# define X509_R_UNSUPPORTED_ALGORITHM 111 +# define X509_R_WRONG_LOOKUP_TYPE 112 +# define X509_R_WRONG_TYPE 122 + +# ifdef __cplusplus +} +# endif +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/x509_vfy.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/x509_vfy.h new file mode 100644 index 0000000..5062682 --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/x509_vfy.h @@ -0,0 +1,652 @@ +/* crypto/x509/x509_vfy.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_X509_H +# include +/* + * openssl/x509.h ends up #include-ing this file at about the only + * appropriate moment. + */ +#endif + +#ifndef HEADER_X509_VFY_H +# define HEADER_X509_VFY_H + +# include +# ifndef OPENSSL_NO_LHASH +# include +# endif +# include +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# if 0 +/* Outer object */ +typedef struct x509_hash_dir_st { + int num_dirs; + char **dirs; + int *dirs_type; + int num_dirs_alloced; +} X509_HASH_DIR_CTX; +# endif + +typedef struct x509_file_st { + int num_paths; /* number of paths to files or directories */ + int num_alloced; + char **paths; /* the list of paths or directories */ + int *path_type; +} X509_CERT_FILE_CTX; + +/*******************************/ +/*- +SSL_CTX -> X509_STORE + -> X509_LOOKUP + ->X509_LOOKUP_METHOD + -> X509_LOOKUP + ->X509_LOOKUP_METHOD + +SSL -> X509_STORE_CTX + ->X509_STORE + +The X509_STORE holds the tables etc for verification stuff. +A X509_STORE_CTX is used while validating a single certificate. +The X509_STORE has X509_LOOKUPs for looking up certs. +The X509_STORE then calls a function to actually verify the +certificate chain. +*/ + +# define X509_LU_RETRY -1 +# define X509_LU_FAIL 0 +# define X509_LU_X509 1 +# define X509_LU_CRL 2 +# define X509_LU_PKEY 3 + +typedef struct x509_object_st { + /* one of the above types */ + int type; + union { + char *ptr; + X509 *x509; + X509_CRL *crl; + EVP_PKEY *pkey; + } data; +} X509_OBJECT; + +typedef struct x509_lookup_st X509_LOOKUP; + +DECLARE_STACK_OF(X509_LOOKUP) +DECLARE_STACK_OF(X509_OBJECT) + +/* This is a static that defines the function interface */ +typedef struct x509_lookup_method_st { + const char *name; + int (*new_item) (X509_LOOKUP *ctx); + void (*free) (X509_LOOKUP *ctx); + int (*init) (X509_LOOKUP *ctx); + int (*shutdown) (X509_LOOKUP *ctx); + int (*ctrl) (X509_LOOKUP *ctx, int cmd, const char *argc, long argl, + char **ret); + int (*get_by_subject) (X509_LOOKUP *ctx, int type, X509_NAME *name, + X509_OBJECT *ret); + int (*get_by_issuer_serial) (X509_LOOKUP *ctx, int type, X509_NAME *name, + ASN1_INTEGER *serial, X509_OBJECT *ret); + int (*get_by_fingerprint) (X509_LOOKUP *ctx, int type, + unsigned char *bytes, int len, + X509_OBJECT *ret); + int (*get_by_alias) (X509_LOOKUP *ctx, int type, char *str, int len, + X509_OBJECT *ret); +} X509_LOOKUP_METHOD; + +typedef struct X509_VERIFY_PARAM_ID_st X509_VERIFY_PARAM_ID; + +/* + * This structure hold all parameters associated with a verify operation by + * including an X509_VERIFY_PARAM structure in related structures the + * parameters used can be customized + */ + +typedef struct X509_VERIFY_PARAM_st { + char *name; + time_t check_time; /* Time to use */ + unsigned long inh_flags; /* Inheritance flags */ + unsigned long flags; /* Various verify flags */ + int purpose; /* purpose to check untrusted certificates */ + int trust; /* trust setting to check */ + int depth; /* Verify depth */ + STACK_OF(ASN1_OBJECT) *policies; /* Permissible policies */ + X509_VERIFY_PARAM_ID *id; /* opaque ID data */ +} X509_VERIFY_PARAM; + +DECLARE_STACK_OF(X509_VERIFY_PARAM) + +/* + * This is used to hold everything. It is used for all certificate + * validation. Once we have a certificate chain, the 'verify' function is + * then called to actually check the cert chain. + */ +struct x509_store_st { + /* The following is a cache of trusted certs */ + int cache; /* if true, stash any hits */ + STACK_OF(X509_OBJECT) *objs; /* Cache of all objects */ + /* These are external lookup methods */ + STACK_OF(X509_LOOKUP) *get_cert_methods; + X509_VERIFY_PARAM *param; + /* Callbacks for various operations */ + /* called to verify a certificate */ + int (*verify) (X509_STORE_CTX *ctx); + /* error callback */ + int (*verify_cb) (int ok, X509_STORE_CTX *ctx); + /* get issuers cert from ctx */ + int (*get_issuer) (X509 **issuer, X509_STORE_CTX *ctx, X509 *x); + /* check issued */ + int (*check_issued) (X509_STORE_CTX *ctx, X509 *x, X509 *issuer); + /* Check revocation status of chain */ + int (*check_revocation) (X509_STORE_CTX *ctx); + /* retrieve CRL */ + int (*get_crl) (X509_STORE_CTX *ctx, X509_CRL **crl, X509 *x); + /* Check CRL validity */ + int (*check_crl) (X509_STORE_CTX *ctx, X509_CRL *crl); + /* Check certificate against CRL */ + int (*cert_crl) (X509_STORE_CTX *ctx, X509_CRL *crl, X509 *x); + STACK_OF(X509) *(*lookup_certs) (X509_STORE_CTX *ctx, X509_NAME *nm); + STACK_OF(X509_CRL) *(*lookup_crls) (X509_STORE_CTX *ctx, X509_NAME *nm); + int (*cleanup) (X509_STORE_CTX *ctx); + CRYPTO_EX_DATA ex_data; + int references; +} /* X509_STORE */ ; + +int X509_STORE_set_depth(X509_STORE *store, int depth); + +# define X509_STORE_set_verify_cb_func(ctx,func) ((ctx)->verify_cb=(func)) +# define X509_STORE_set_verify_func(ctx,func) ((ctx)->verify=(func)) + +/* This is the functions plus an instance of the local variables. */ +struct x509_lookup_st { + int init; /* have we been started */ + int skip; /* don't use us. */ + X509_LOOKUP_METHOD *method; /* the functions */ + char *method_data; /* method data */ + X509_STORE *store_ctx; /* who owns us */ +} /* X509_LOOKUP */ ; + +/* + * This is a used when verifying cert chains. Since the gathering of the + * cert chain can take some time (and have to be 'retried', this needs to be + * kept and passed around. + */ +struct x509_store_ctx_st { /* X509_STORE_CTX */ + X509_STORE *ctx; + /* used when looking up certs */ + int current_method; + /* The following are set by the caller */ + /* The cert to check */ + X509 *cert; + /* chain of X509s - untrusted - passed in */ + STACK_OF(X509) *untrusted; + /* set of CRLs passed in */ + STACK_OF(X509_CRL) *crls; + X509_VERIFY_PARAM *param; + /* Other info for use with get_issuer() */ + void *other_ctx; + /* Callbacks for various operations */ + /* called to verify a certificate */ + int (*verify) (X509_STORE_CTX *ctx); + /* error callback */ + int (*verify_cb) (int ok, X509_STORE_CTX *ctx); + /* get issuers cert from ctx */ + int (*get_issuer) (X509 **issuer, X509_STORE_CTX *ctx, X509 *x); + /* check issued */ + int (*check_issued) (X509_STORE_CTX *ctx, X509 *x, X509 *issuer); + /* Check revocation status of chain */ + int (*check_revocation) (X509_STORE_CTX *ctx); + /* retrieve CRL */ + int (*get_crl) (X509_STORE_CTX *ctx, X509_CRL **crl, X509 *x); + /* Check CRL validity */ + int (*check_crl) (X509_STORE_CTX *ctx, X509_CRL *crl); + /* Check certificate against CRL */ + int (*cert_crl) (X509_STORE_CTX *ctx, X509_CRL *crl, X509 *x); + int (*check_policy) (X509_STORE_CTX *ctx); + STACK_OF(X509) *(*lookup_certs) (X509_STORE_CTX *ctx, X509_NAME *nm); + STACK_OF(X509_CRL) *(*lookup_crls) (X509_STORE_CTX *ctx, X509_NAME *nm); + int (*cleanup) (X509_STORE_CTX *ctx); + /* The following is built up */ + /* if 0, rebuild chain */ + int valid; + /* index of last untrusted cert */ + int last_untrusted; + /* chain of X509s - built up and trusted */ + STACK_OF(X509) *chain; + /* Valid policy tree */ + X509_POLICY_TREE *tree; + /* Require explicit policy value */ + int explicit_policy; + /* When something goes wrong, this is why */ + int error_depth; + int error; + X509 *current_cert; + /* cert currently being tested as valid issuer */ + X509 *current_issuer; + /* current CRL */ + X509_CRL *current_crl; + /* score of current CRL */ + int current_crl_score; + /* Reason mask */ + unsigned int current_reasons; + /* For CRL path validation: parent context */ + X509_STORE_CTX *parent; + CRYPTO_EX_DATA ex_data; +} /* X509_STORE_CTX */ ; + +void X509_STORE_CTX_set_depth(X509_STORE_CTX *ctx, int depth); + +# define X509_STORE_CTX_set_app_data(ctx,data) \ + X509_STORE_CTX_set_ex_data(ctx,0,data) +# define X509_STORE_CTX_get_app_data(ctx) \ + X509_STORE_CTX_get_ex_data(ctx,0) + +# define X509_L_FILE_LOAD 1 +# define X509_L_ADD_DIR 2 + +# define X509_LOOKUP_load_file(x,name,type) \ + X509_LOOKUP_ctrl((x),X509_L_FILE_LOAD,(name),(long)(type),NULL) + +# define X509_LOOKUP_add_dir(x,name,type) \ + X509_LOOKUP_ctrl((x),X509_L_ADD_DIR,(name),(long)(type),NULL) + +# define X509_V_OK 0 +# define X509_V_ERR_UNSPECIFIED 1 + +# define X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT 2 +# define X509_V_ERR_UNABLE_TO_GET_CRL 3 +# define X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE 4 +# define X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE 5 +# define X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY 6 +# define X509_V_ERR_CERT_SIGNATURE_FAILURE 7 +# define X509_V_ERR_CRL_SIGNATURE_FAILURE 8 +# define X509_V_ERR_CERT_NOT_YET_VALID 9 +# define X509_V_ERR_CERT_HAS_EXPIRED 10 +# define X509_V_ERR_CRL_NOT_YET_VALID 11 +# define X509_V_ERR_CRL_HAS_EXPIRED 12 +# define X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD 13 +# define X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD 14 +# define X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD 15 +# define X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD 16 +# define X509_V_ERR_OUT_OF_MEM 17 +# define X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT 18 +# define X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN 19 +# define X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY 20 +# define X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE 21 +# define X509_V_ERR_CERT_CHAIN_TOO_LONG 22 +# define X509_V_ERR_CERT_REVOKED 23 +# define X509_V_ERR_INVALID_CA 24 +# define X509_V_ERR_PATH_LENGTH_EXCEEDED 25 +# define X509_V_ERR_INVALID_PURPOSE 26 +# define X509_V_ERR_CERT_UNTRUSTED 27 +# define X509_V_ERR_CERT_REJECTED 28 +/* These are 'informational' when looking for issuer cert */ +# define X509_V_ERR_SUBJECT_ISSUER_MISMATCH 29 +# define X509_V_ERR_AKID_SKID_MISMATCH 30 +# define X509_V_ERR_AKID_ISSUER_SERIAL_MISMATCH 31 +# define X509_V_ERR_KEYUSAGE_NO_CERTSIGN 32 + +# define X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER 33 +# define X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION 34 +# define X509_V_ERR_KEYUSAGE_NO_CRL_SIGN 35 +# define X509_V_ERR_UNHANDLED_CRITICAL_CRL_EXTENSION 36 +# define X509_V_ERR_INVALID_NON_CA 37 +# define X509_V_ERR_PROXY_PATH_LENGTH_EXCEEDED 38 +# define X509_V_ERR_KEYUSAGE_NO_DIGITAL_SIGNATURE 39 +# define X509_V_ERR_PROXY_CERTIFICATES_NOT_ALLOWED 40 + +# define X509_V_ERR_INVALID_EXTENSION 41 +# define X509_V_ERR_INVALID_POLICY_EXTENSION 42 +# define X509_V_ERR_NO_EXPLICIT_POLICY 43 +# define X509_V_ERR_DIFFERENT_CRL_SCOPE 44 +# define X509_V_ERR_UNSUPPORTED_EXTENSION_FEATURE 45 + +# define X509_V_ERR_UNNESTED_RESOURCE 46 + +# define X509_V_ERR_PERMITTED_VIOLATION 47 +# define X509_V_ERR_EXCLUDED_VIOLATION 48 +# define X509_V_ERR_SUBTREE_MINMAX 49 +# define X509_V_ERR_APPLICATION_VERIFICATION 50 +# define X509_V_ERR_UNSUPPORTED_CONSTRAINT_TYPE 51 +# define X509_V_ERR_UNSUPPORTED_CONSTRAINT_SYNTAX 52 +# define X509_V_ERR_UNSUPPORTED_NAME_SYNTAX 53 +# define X509_V_ERR_CRL_PATH_VALIDATION_ERROR 54 + +/* Suite B mode algorithm violation */ +# define X509_V_ERR_SUITE_B_INVALID_VERSION 56 +# define X509_V_ERR_SUITE_B_INVALID_ALGORITHM 57 +# define X509_V_ERR_SUITE_B_INVALID_CURVE 58 +# define X509_V_ERR_SUITE_B_INVALID_SIGNATURE_ALGORITHM 59 +# define X509_V_ERR_SUITE_B_LOS_NOT_ALLOWED 60 +# define X509_V_ERR_SUITE_B_CANNOT_SIGN_P_384_WITH_P_256 61 + +/* Host, email and IP check errors */ +# define X509_V_ERR_HOSTNAME_MISMATCH 62 +# define X509_V_ERR_EMAIL_MISMATCH 63 +# define X509_V_ERR_IP_ADDRESS_MISMATCH 64 + +/* Caller error */ +# define X509_V_ERR_INVALID_CALL 65 +/* Issuer lookup error */ +# define X509_V_ERR_STORE_LOOKUP 66 + +# define X509_V_ERR_PROXY_SUBJECT_NAME_VIOLATION 67 + +/* Certificate verify flags */ + +/* Send issuer+subject checks to verify_cb */ +# define X509_V_FLAG_CB_ISSUER_CHECK 0x1 +/* Use check time instead of current time */ +# define X509_V_FLAG_USE_CHECK_TIME 0x2 +/* Lookup CRLs */ +# define X509_V_FLAG_CRL_CHECK 0x4 +/* Lookup CRLs for whole chain */ +# define X509_V_FLAG_CRL_CHECK_ALL 0x8 +/* Ignore unhandled critical extensions */ +# define X509_V_FLAG_IGNORE_CRITICAL 0x10 +/* Disable workarounds for broken certificates */ +# define X509_V_FLAG_X509_STRICT 0x20 +/* Enable proxy certificate validation */ +# define X509_V_FLAG_ALLOW_PROXY_CERTS 0x40 +/* Enable policy checking */ +# define X509_V_FLAG_POLICY_CHECK 0x80 +/* Policy variable require-explicit-policy */ +# define X509_V_FLAG_EXPLICIT_POLICY 0x100 +/* Policy variable inhibit-any-policy */ +# define X509_V_FLAG_INHIBIT_ANY 0x200 +/* Policy variable inhibit-policy-mapping */ +# define X509_V_FLAG_INHIBIT_MAP 0x400 +/* Notify callback that policy is OK */ +# define X509_V_FLAG_NOTIFY_POLICY 0x800 +/* Extended CRL features such as indirect CRLs, alternate CRL signing keys */ +# define X509_V_FLAG_EXTENDED_CRL_SUPPORT 0x1000 +/* Delta CRL support */ +# define X509_V_FLAG_USE_DELTAS 0x2000 +/* Check selfsigned CA signature */ +# define X509_V_FLAG_CHECK_SS_SIGNATURE 0x4000 +/* Use trusted store first */ +# define X509_V_FLAG_TRUSTED_FIRST 0x8000 +/* Suite B 128 bit only mode: not normally used */ +# define X509_V_FLAG_SUITEB_128_LOS_ONLY 0x10000 +/* Suite B 192 bit only mode */ +# define X509_V_FLAG_SUITEB_192_LOS 0x20000 +/* Suite B 128 bit mode allowing 192 bit algorithms */ +# define X509_V_FLAG_SUITEB_128_LOS 0x30000 + +/* Allow partial chains if at least one certificate is in trusted store */ +# define X509_V_FLAG_PARTIAL_CHAIN 0x80000 +/* + * If the initial chain is not trusted, do not attempt to build an alternative + * chain. Alternate chain checking was introduced in 1.0.2b. Setting this flag + * will force the behaviour to match that of previous versions. + */ +# define X509_V_FLAG_NO_ALT_CHAINS 0x100000 + +# define X509_VP_FLAG_DEFAULT 0x1 +# define X509_VP_FLAG_OVERWRITE 0x2 +# define X509_VP_FLAG_RESET_FLAGS 0x4 +# define X509_VP_FLAG_LOCKED 0x8 +# define X509_VP_FLAG_ONCE 0x10 + +/* Internal use: mask of policy related options */ +# define X509_V_FLAG_POLICY_MASK (X509_V_FLAG_POLICY_CHECK \ + | X509_V_FLAG_EXPLICIT_POLICY \ + | X509_V_FLAG_INHIBIT_ANY \ + | X509_V_FLAG_INHIBIT_MAP) + +int X509_OBJECT_idx_by_subject(STACK_OF(X509_OBJECT) *h, int type, + X509_NAME *name); +X509_OBJECT *X509_OBJECT_retrieve_by_subject(STACK_OF(X509_OBJECT) *h, + int type, X509_NAME *name); +X509_OBJECT *X509_OBJECT_retrieve_match(STACK_OF(X509_OBJECT) *h, + X509_OBJECT *x); +void X509_OBJECT_up_ref_count(X509_OBJECT *a); +void X509_OBJECT_free_contents(X509_OBJECT *a); +X509_STORE *X509_STORE_new(void); +void X509_STORE_free(X509_STORE *v); + +STACK_OF(X509) *X509_STORE_get1_certs(X509_STORE_CTX *st, X509_NAME *nm); +STACK_OF(X509_CRL) *X509_STORE_get1_crls(X509_STORE_CTX *st, X509_NAME *nm); +int X509_STORE_set_flags(X509_STORE *ctx, unsigned long flags); +int X509_STORE_set_purpose(X509_STORE *ctx, int purpose); +int X509_STORE_set_trust(X509_STORE *ctx, int trust); +int X509_STORE_set1_param(X509_STORE *ctx, X509_VERIFY_PARAM *pm); + +void X509_STORE_set_verify_cb(X509_STORE *ctx, + int (*verify_cb) (int, X509_STORE_CTX *)); + +void X509_STORE_set_lookup_crls_cb(X509_STORE *ctx, + STACK_OF(X509_CRL) *(*cb) (X509_STORE_CTX + *ctx, + X509_NAME *nm)); + +X509_STORE_CTX *X509_STORE_CTX_new(void); + +int X509_STORE_CTX_get1_issuer(X509 **issuer, X509_STORE_CTX *ctx, X509 *x); + +void X509_STORE_CTX_free(X509_STORE_CTX *ctx); +int X509_STORE_CTX_init(X509_STORE_CTX *ctx, X509_STORE *store, + X509 *x509, STACK_OF(X509) *chain); +void X509_STORE_CTX_trusted_stack(X509_STORE_CTX *ctx, STACK_OF(X509) *sk); +void X509_STORE_CTX_cleanup(X509_STORE_CTX *ctx); + +X509_STORE *X509_STORE_CTX_get0_store(X509_STORE_CTX *ctx); + +X509_LOOKUP *X509_STORE_add_lookup(X509_STORE *v, X509_LOOKUP_METHOD *m); + +X509_LOOKUP_METHOD *X509_LOOKUP_hash_dir(void); +X509_LOOKUP_METHOD *X509_LOOKUP_file(void); + +int X509_STORE_add_cert(X509_STORE *ctx, X509 *x); +int X509_STORE_add_crl(X509_STORE *ctx, X509_CRL *x); + +int X509_STORE_get_by_subject(X509_STORE_CTX *vs, int type, X509_NAME *name, + X509_OBJECT *ret); + +int X509_LOOKUP_ctrl(X509_LOOKUP *ctx, int cmd, const char *argc, + long argl, char **ret); + +# ifndef OPENSSL_NO_STDIO +int X509_load_cert_file(X509_LOOKUP *ctx, const char *file, int type); +int X509_load_crl_file(X509_LOOKUP *ctx, const char *file, int type); +int X509_load_cert_crl_file(X509_LOOKUP *ctx, const char *file, int type); +# endif + +X509_LOOKUP *X509_LOOKUP_new(X509_LOOKUP_METHOD *method); +void X509_LOOKUP_free(X509_LOOKUP *ctx); +int X509_LOOKUP_init(X509_LOOKUP *ctx); +int X509_LOOKUP_by_subject(X509_LOOKUP *ctx, int type, X509_NAME *name, + X509_OBJECT *ret); +int X509_LOOKUP_by_issuer_serial(X509_LOOKUP *ctx, int type, X509_NAME *name, + ASN1_INTEGER *serial, X509_OBJECT *ret); +int X509_LOOKUP_by_fingerprint(X509_LOOKUP *ctx, int type, + unsigned char *bytes, int len, + X509_OBJECT *ret); +int X509_LOOKUP_by_alias(X509_LOOKUP *ctx, int type, char *str, int len, + X509_OBJECT *ret); +int X509_LOOKUP_shutdown(X509_LOOKUP *ctx); + +# ifndef OPENSSL_NO_STDIO +int X509_STORE_load_locations(X509_STORE *ctx, + const char *file, const char *dir); +int X509_STORE_set_default_paths(X509_STORE *ctx); +# endif + +int X509_STORE_CTX_get_ex_new_index(long argl, void *argp, + CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, + CRYPTO_EX_free *free_func); +int X509_STORE_CTX_set_ex_data(X509_STORE_CTX *ctx, int idx, void *data); +void *X509_STORE_CTX_get_ex_data(X509_STORE_CTX *ctx, int idx); +int X509_STORE_CTX_get_error(X509_STORE_CTX *ctx); +void X509_STORE_CTX_set_error(X509_STORE_CTX *ctx, int s); +int X509_STORE_CTX_get_error_depth(X509_STORE_CTX *ctx); +X509 *X509_STORE_CTX_get_current_cert(X509_STORE_CTX *ctx); +X509 *X509_STORE_CTX_get0_current_issuer(X509_STORE_CTX *ctx); +X509_CRL *X509_STORE_CTX_get0_current_crl(X509_STORE_CTX *ctx); +X509_STORE_CTX *X509_STORE_CTX_get0_parent_ctx(X509_STORE_CTX *ctx); +STACK_OF(X509) *X509_STORE_CTX_get_chain(X509_STORE_CTX *ctx); +STACK_OF(X509) *X509_STORE_CTX_get1_chain(X509_STORE_CTX *ctx); +void X509_STORE_CTX_set_cert(X509_STORE_CTX *c, X509 *x); +void X509_STORE_CTX_set_chain(X509_STORE_CTX *c, STACK_OF(X509) *sk); +void X509_STORE_CTX_set0_crls(X509_STORE_CTX *c, STACK_OF(X509_CRL) *sk); +int X509_STORE_CTX_set_purpose(X509_STORE_CTX *ctx, int purpose); +int X509_STORE_CTX_set_trust(X509_STORE_CTX *ctx, int trust); +int X509_STORE_CTX_purpose_inherit(X509_STORE_CTX *ctx, int def_purpose, + int purpose, int trust); +void X509_STORE_CTX_set_flags(X509_STORE_CTX *ctx, unsigned long flags); +void X509_STORE_CTX_set_time(X509_STORE_CTX *ctx, unsigned long flags, + time_t t); +void X509_STORE_CTX_set_verify_cb(X509_STORE_CTX *ctx, + int (*verify_cb) (int, X509_STORE_CTX *)); + +X509_POLICY_TREE *X509_STORE_CTX_get0_policy_tree(X509_STORE_CTX *ctx); +int X509_STORE_CTX_get_explicit_policy(X509_STORE_CTX *ctx); + +X509_VERIFY_PARAM *X509_STORE_CTX_get0_param(X509_STORE_CTX *ctx); +void X509_STORE_CTX_set0_param(X509_STORE_CTX *ctx, X509_VERIFY_PARAM *param); +int X509_STORE_CTX_set_default(X509_STORE_CTX *ctx, const char *name); + +/* X509_VERIFY_PARAM functions */ + +X509_VERIFY_PARAM *X509_VERIFY_PARAM_new(void); +void X509_VERIFY_PARAM_free(X509_VERIFY_PARAM *param); +int X509_VERIFY_PARAM_inherit(X509_VERIFY_PARAM *to, + const X509_VERIFY_PARAM *from); +int X509_VERIFY_PARAM_set1(X509_VERIFY_PARAM *to, + const X509_VERIFY_PARAM *from); +int X509_VERIFY_PARAM_set1_name(X509_VERIFY_PARAM *param, const char *name); +int X509_VERIFY_PARAM_set_flags(X509_VERIFY_PARAM *param, + unsigned long flags); +int X509_VERIFY_PARAM_clear_flags(X509_VERIFY_PARAM *param, + unsigned long flags); +unsigned long X509_VERIFY_PARAM_get_flags(X509_VERIFY_PARAM *param); +int X509_VERIFY_PARAM_set_purpose(X509_VERIFY_PARAM *param, int purpose); +int X509_VERIFY_PARAM_set_trust(X509_VERIFY_PARAM *param, int trust); +void X509_VERIFY_PARAM_set_depth(X509_VERIFY_PARAM *param, int depth); +void X509_VERIFY_PARAM_set_time(X509_VERIFY_PARAM *param, time_t t); +int X509_VERIFY_PARAM_add0_policy(X509_VERIFY_PARAM *param, + ASN1_OBJECT *policy); +int X509_VERIFY_PARAM_set1_policies(X509_VERIFY_PARAM *param, + STACK_OF(ASN1_OBJECT) *policies); + +int X509_VERIFY_PARAM_set1_host(X509_VERIFY_PARAM *param, + const char *name, size_t namelen); +int X509_VERIFY_PARAM_add1_host(X509_VERIFY_PARAM *param, + const char *name, size_t namelen); +void X509_VERIFY_PARAM_set_hostflags(X509_VERIFY_PARAM *param, + unsigned int flags); +char *X509_VERIFY_PARAM_get0_peername(X509_VERIFY_PARAM *); +int X509_VERIFY_PARAM_set1_email(X509_VERIFY_PARAM *param, + const char *email, size_t emaillen); +int X509_VERIFY_PARAM_set1_ip(X509_VERIFY_PARAM *param, + const unsigned char *ip, size_t iplen); +int X509_VERIFY_PARAM_set1_ip_asc(X509_VERIFY_PARAM *param, + const char *ipasc); + +int X509_VERIFY_PARAM_get_depth(const X509_VERIFY_PARAM *param); +const char *X509_VERIFY_PARAM_get0_name(const X509_VERIFY_PARAM *param); + +int X509_VERIFY_PARAM_add0_table(X509_VERIFY_PARAM *param); +int X509_VERIFY_PARAM_get_count(void); +const X509_VERIFY_PARAM *X509_VERIFY_PARAM_get0(int id); +const X509_VERIFY_PARAM *X509_VERIFY_PARAM_lookup(const char *name); +void X509_VERIFY_PARAM_table_cleanup(void); + +int X509_policy_check(X509_POLICY_TREE **ptree, int *pexplicit_policy, + STACK_OF(X509) *certs, + STACK_OF(ASN1_OBJECT) *policy_oids, unsigned int flags); + +void X509_policy_tree_free(X509_POLICY_TREE *tree); + +int X509_policy_tree_level_count(const X509_POLICY_TREE *tree); +X509_POLICY_LEVEL *X509_policy_tree_get0_level(const X509_POLICY_TREE *tree, + int i); + +STACK_OF(X509_POLICY_NODE) *X509_policy_tree_get0_policies(const + X509_POLICY_TREE + *tree); + +STACK_OF(X509_POLICY_NODE) *X509_policy_tree_get0_user_policies(const + X509_POLICY_TREE + *tree); + +int X509_policy_level_node_count(X509_POLICY_LEVEL *level); + +X509_POLICY_NODE *X509_policy_level_get0_node(X509_POLICY_LEVEL *level, + int i); + +const ASN1_OBJECT *X509_policy_node_get0_policy(const X509_POLICY_NODE *node); + +STACK_OF(POLICYQUALINFO) *X509_policy_node_get0_qualifiers(const + X509_POLICY_NODE + *node); +const X509_POLICY_NODE *X509_policy_node_get0_parent(const X509_POLICY_NODE + *node); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/include/openssl/x509v3.h b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/x509v3.h new file mode 100644 index 0000000..f5c6156 --- /dev/null +++ b/hdssd/external/solaris/openssl-1.0.2j/include/openssl/x509v3.h @@ -0,0 +1,1055 @@ +/* x509v3.h */ +/* + * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project + * 1999. + */ +/* ==================================================================== + * Copyright (c) 1999-2004 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +#ifndef HEADER_X509V3_H +# define HEADER_X509V3_H + +# include +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# ifdef OPENSSL_SYS_WIN32 +/* Under Win32 these are defined in wincrypt.h */ +# undef X509_NAME +# undef X509_CERT_PAIR +# undef X509_EXTENSIONS +# endif + +/* Forward reference */ +struct v3_ext_method; +struct v3_ext_ctx; + +/* Useful typedefs */ + +typedef void *(*X509V3_EXT_NEW)(void); +typedef void (*X509V3_EXT_FREE) (void *); +typedef void *(*X509V3_EXT_D2I)(void *, const unsigned char **, long); +typedef int (*X509V3_EXT_I2D) (void *, unsigned char **); +typedef STACK_OF(CONF_VALUE) * + (*X509V3_EXT_I2V) (const struct v3_ext_method *method, void *ext, + STACK_OF(CONF_VALUE) *extlist); +typedef void *(*X509V3_EXT_V2I)(const struct v3_ext_method *method, + struct v3_ext_ctx *ctx, + STACK_OF(CONF_VALUE) *values); +typedef char *(*X509V3_EXT_I2S)(const struct v3_ext_method *method, + void *ext); +typedef void *(*X509V3_EXT_S2I)(const struct v3_ext_method *method, + struct v3_ext_ctx *ctx, const char *str); +typedef int (*X509V3_EXT_I2R) (const struct v3_ext_method *method, void *ext, + BIO *out, int indent); +typedef void *(*X509V3_EXT_R2I)(const struct v3_ext_method *method, + struct v3_ext_ctx *ctx, const char *str); + +/* V3 extension structure */ + +struct v3_ext_method { + int ext_nid; + int ext_flags; +/* If this is set the following four fields are ignored */ + ASN1_ITEM_EXP *it; +/* Old style ASN1 calls */ + X509V3_EXT_NEW ext_new; + X509V3_EXT_FREE ext_free; + X509V3_EXT_D2I d2i; + X509V3_EXT_I2D i2d; +/* The following pair is used for string extensions */ + X509V3_EXT_I2S i2s; + X509V3_EXT_S2I s2i; +/* The following pair is used for multi-valued extensions */ + X509V3_EXT_I2V i2v; + X509V3_EXT_V2I v2i; +/* The following are used for raw extensions */ + X509V3_EXT_I2R i2r; + X509V3_EXT_R2I r2i; + void *usr_data; /* Any extension specific data */ +}; + +typedef struct X509V3_CONF_METHOD_st { + char *(*get_string) (void *db, char *section, char *value); + STACK_OF(CONF_VALUE) *(*get_section) (void *db, char *section); + void (*free_string) (void *db, char *string); + void (*free_section) (void *db, STACK_OF(CONF_VALUE) *section); +} X509V3_CONF_METHOD; + +/* Context specific info */ +struct v3_ext_ctx { +# define CTX_TEST 0x1 + int flags; + X509 *issuer_cert; + X509 *subject_cert; + X509_REQ *subject_req; + X509_CRL *crl; + X509V3_CONF_METHOD *db_meth; + void *db; +/* Maybe more here */ +}; + +typedef struct v3_ext_method X509V3_EXT_METHOD; + +DECLARE_STACK_OF(X509V3_EXT_METHOD) + +/* ext_flags values */ +# define X509V3_EXT_DYNAMIC 0x1 +# define X509V3_EXT_CTX_DEP 0x2 +# define X509V3_EXT_MULTILINE 0x4 + +typedef BIT_STRING_BITNAME ENUMERATED_NAMES; + +typedef struct BASIC_CONSTRAINTS_st { + int ca; + ASN1_INTEGER *pathlen; +} BASIC_CONSTRAINTS; + +typedef struct PKEY_USAGE_PERIOD_st { + ASN1_GENERALIZEDTIME *notBefore; + ASN1_GENERALIZEDTIME *notAfter; +} PKEY_USAGE_PERIOD; + +typedef struct otherName_st { + ASN1_OBJECT *type_id; + ASN1_TYPE *value; +} OTHERNAME; + +typedef struct EDIPartyName_st { + ASN1_STRING *nameAssigner; + ASN1_STRING *partyName; +} EDIPARTYNAME; + +typedef struct GENERAL_NAME_st { +# define GEN_OTHERNAME 0 +# define GEN_EMAIL 1 +# define GEN_DNS 2 +# define GEN_X400 3 +# define GEN_DIRNAME 4 +# define GEN_EDIPARTY 5 +# define GEN_URI 6 +# define GEN_IPADD 7 +# define GEN_RID 8 + int type; + union { + char *ptr; + OTHERNAME *otherName; /* otherName */ + ASN1_IA5STRING *rfc822Name; + ASN1_IA5STRING *dNSName; + ASN1_TYPE *x400Address; + X509_NAME *directoryName; + EDIPARTYNAME *ediPartyName; + ASN1_IA5STRING *uniformResourceIdentifier; + ASN1_OCTET_STRING *iPAddress; + ASN1_OBJECT *registeredID; + /* Old names */ + ASN1_OCTET_STRING *ip; /* iPAddress */ + X509_NAME *dirn; /* dirn */ + ASN1_IA5STRING *ia5; /* rfc822Name, dNSName, + * uniformResourceIdentifier */ + ASN1_OBJECT *rid; /* registeredID */ + ASN1_TYPE *other; /* x400Address */ + } d; +} GENERAL_NAME; + +typedef STACK_OF(GENERAL_NAME) GENERAL_NAMES; + +typedef struct ACCESS_DESCRIPTION_st { + ASN1_OBJECT *method; + GENERAL_NAME *location; +} ACCESS_DESCRIPTION; + +typedef STACK_OF(ACCESS_DESCRIPTION) AUTHORITY_INFO_ACCESS; + +typedef STACK_OF(ASN1_OBJECT) EXTENDED_KEY_USAGE; + +DECLARE_STACK_OF(GENERAL_NAME) +DECLARE_ASN1_SET_OF(GENERAL_NAME) + +DECLARE_STACK_OF(ACCESS_DESCRIPTION) +DECLARE_ASN1_SET_OF(ACCESS_DESCRIPTION) + +typedef struct DIST_POINT_NAME_st { + int type; + union { + GENERAL_NAMES *fullname; + STACK_OF(X509_NAME_ENTRY) *relativename; + } name; +/* If relativename then this contains the full distribution point name */ + X509_NAME *dpname; +} DIST_POINT_NAME; +/* All existing reasons */ +# define CRLDP_ALL_REASONS 0x807f + +# define CRL_REASON_NONE -1 +# define CRL_REASON_UNSPECIFIED 0 +# define CRL_REASON_KEY_COMPROMISE 1 +# define CRL_REASON_CA_COMPROMISE 2 +# define CRL_REASON_AFFILIATION_CHANGED 3 +# define CRL_REASON_SUPERSEDED 4 +# define CRL_REASON_CESSATION_OF_OPERATION 5 +# define CRL_REASON_CERTIFICATE_HOLD 6 +# define CRL_REASON_REMOVE_FROM_CRL 8 +# define CRL_REASON_PRIVILEGE_WITHDRAWN 9 +# define CRL_REASON_AA_COMPROMISE 10 + +struct DIST_POINT_st { + DIST_POINT_NAME *distpoint; + ASN1_BIT_STRING *reasons; + GENERAL_NAMES *CRLissuer; + int dp_reasons; +}; + +typedef STACK_OF(DIST_POINT) CRL_DIST_POINTS; + +DECLARE_STACK_OF(DIST_POINT) +DECLARE_ASN1_SET_OF(DIST_POINT) + +struct AUTHORITY_KEYID_st { + ASN1_OCTET_STRING *keyid; + GENERAL_NAMES *issuer; + ASN1_INTEGER *serial; +}; + +/* Strong extranet structures */ + +typedef struct SXNET_ID_st { + ASN1_INTEGER *zone; + ASN1_OCTET_STRING *user; +} SXNETID; + +DECLARE_STACK_OF(SXNETID) +DECLARE_ASN1_SET_OF(SXNETID) + +typedef struct SXNET_st { + ASN1_INTEGER *version; + STACK_OF(SXNETID) *ids; +} SXNET; + +typedef struct NOTICEREF_st { + ASN1_STRING *organization; + STACK_OF(ASN1_INTEGER) *noticenos; +} NOTICEREF; + +typedef struct USERNOTICE_st { + NOTICEREF *noticeref; + ASN1_STRING *exptext; +} USERNOTICE; + +typedef struct POLICYQUALINFO_st { + ASN1_OBJECT *pqualid; + union { + ASN1_IA5STRING *cpsuri; + USERNOTICE *usernotice; + ASN1_TYPE *other; + } d; +} POLICYQUALINFO; + +DECLARE_STACK_OF(POLICYQUALINFO) +DECLARE_ASN1_SET_OF(POLICYQUALINFO) + +typedef struct POLICYINFO_st { + ASN1_OBJECT *policyid; + STACK_OF(POLICYQUALINFO) *qualifiers; +} POLICYINFO; + +typedef STACK_OF(POLICYINFO) CERTIFICATEPOLICIES; + +DECLARE_STACK_OF(POLICYINFO) +DECLARE_ASN1_SET_OF(POLICYINFO) + +typedef struct POLICY_MAPPING_st { + ASN1_OBJECT *issuerDomainPolicy; + ASN1_OBJECT *subjectDomainPolicy; +} POLICY_MAPPING; + +DECLARE_STACK_OF(POLICY_MAPPING) + +typedef STACK_OF(POLICY_MAPPING) POLICY_MAPPINGS; + +typedef struct GENERAL_SUBTREE_st { + GENERAL_NAME *base; + ASN1_INTEGER *minimum; + ASN1_INTEGER *maximum; +} GENERAL_SUBTREE; + +DECLARE_STACK_OF(GENERAL_SUBTREE) + +struct NAME_CONSTRAINTS_st { + STACK_OF(GENERAL_SUBTREE) *permittedSubtrees; + STACK_OF(GENERAL_SUBTREE) *excludedSubtrees; +}; + +typedef struct POLICY_CONSTRAINTS_st { + ASN1_INTEGER *requireExplicitPolicy; + ASN1_INTEGER *inhibitPolicyMapping; +} POLICY_CONSTRAINTS; + +/* Proxy certificate structures, see RFC 3820 */ +typedef struct PROXY_POLICY_st { + ASN1_OBJECT *policyLanguage; + ASN1_OCTET_STRING *policy; +} PROXY_POLICY; + +typedef struct PROXY_CERT_INFO_EXTENSION_st { + ASN1_INTEGER *pcPathLengthConstraint; + PROXY_POLICY *proxyPolicy; +} PROXY_CERT_INFO_EXTENSION; + +DECLARE_ASN1_FUNCTIONS(PROXY_POLICY) +DECLARE_ASN1_FUNCTIONS(PROXY_CERT_INFO_EXTENSION) + +struct ISSUING_DIST_POINT_st { + DIST_POINT_NAME *distpoint; + int onlyuser; + int onlyCA; + ASN1_BIT_STRING *onlysomereasons; + int indirectCRL; + int onlyattr; +}; + +/* Values in idp_flags field */ +/* IDP present */ +# define IDP_PRESENT 0x1 +/* IDP values inconsistent */ +# define IDP_INVALID 0x2 +/* onlyuser true */ +# define IDP_ONLYUSER 0x4 +/* onlyCA true */ +# define IDP_ONLYCA 0x8 +/* onlyattr true */ +# define IDP_ONLYATTR 0x10 +/* indirectCRL true */ +# define IDP_INDIRECT 0x20 +/* onlysomereasons present */ +# define IDP_REASONS 0x40 + +# define X509V3_conf_err(val) ERR_add_error_data(6, "section:", val->section, \ +",name:", val->name, ",value:", val->value); + +# define X509V3_set_ctx_test(ctx) \ + X509V3_set_ctx(ctx, NULL, NULL, NULL, NULL, CTX_TEST) +# define X509V3_set_ctx_nodb(ctx) (ctx)->db = NULL; + +# define EXT_BITSTRING(nid, table) { nid, 0, ASN1_ITEM_ref(ASN1_BIT_STRING), \ + 0,0,0,0, \ + 0,0, \ + (X509V3_EXT_I2V)i2v_ASN1_BIT_STRING, \ + (X509V3_EXT_V2I)v2i_ASN1_BIT_STRING, \ + NULL, NULL, \ + table} + +# define EXT_IA5STRING(nid) { nid, 0, ASN1_ITEM_ref(ASN1_IA5STRING), \ + 0,0,0,0, \ + (X509V3_EXT_I2S)i2s_ASN1_IA5STRING, \ + (X509V3_EXT_S2I)s2i_ASN1_IA5STRING, \ + 0,0,0,0, \ + NULL} + +# define EXT_END { -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} + +/* X509_PURPOSE stuff */ + +# define EXFLAG_BCONS 0x1 +# define EXFLAG_KUSAGE 0x2 +# define EXFLAG_XKUSAGE 0x4 +# define EXFLAG_NSCERT 0x8 + +# define EXFLAG_CA 0x10 +/* Really self issued not necessarily self signed */ +# define EXFLAG_SI 0x20 +# define EXFLAG_V1 0x40 +# define EXFLAG_INVALID 0x80 +# define EXFLAG_SET 0x100 +# define EXFLAG_CRITICAL 0x200 +# define EXFLAG_PROXY 0x400 + +# define EXFLAG_INVALID_POLICY 0x800 +# define EXFLAG_FRESHEST 0x1000 +/* Self signed */ +# define EXFLAG_SS 0x2000 + +# define KU_DIGITAL_SIGNATURE 0x0080 +# define KU_NON_REPUDIATION 0x0040 +# define KU_KEY_ENCIPHERMENT 0x0020 +# define KU_DATA_ENCIPHERMENT 0x0010 +# define KU_KEY_AGREEMENT 0x0008 +# define KU_KEY_CERT_SIGN 0x0004 +# define KU_CRL_SIGN 0x0002 +# define KU_ENCIPHER_ONLY 0x0001 +# define KU_DECIPHER_ONLY 0x8000 + +# define NS_SSL_CLIENT 0x80 +# define NS_SSL_SERVER 0x40 +# define NS_SMIME 0x20 +# define NS_OBJSIGN 0x10 +# define NS_SSL_CA 0x04 +# define NS_SMIME_CA 0x02 +# define NS_OBJSIGN_CA 0x01 +# define NS_ANY_CA (NS_SSL_CA|NS_SMIME_CA|NS_OBJSIGN_CA) + +# define XKU_SSL_SERVER 0x1 +# define XKU_SSL_CLIENT 0x2 +# define XKU_SMIME 0x4 +# define XKU_CODE_SIGN 0x8 +# define XKU_SGC 0x10 +# define XKU_OCSP_SIGN 0x20 +# define XKU_TIMESTAMP 0x40 +# define XKU_DVCS 0x80 +# define XKU_ANYEKU 0x100 + +# define X509_PURPOSE_DYNAMIC 0x1 +# define X509_PURPOSE_DYNAMIC_NAME 0x2 + +typedef struct x509_purpose_st { + int purpose; + int trust; /* Default trust ID */ + int flags; + int (*check_purpose) (const struct x509_purpose_st *, const X509 *, int); + char *name; + char *sname; + void *usr_data; +} X509_PURPOSE; + +# define X509_PURPOSE_SSL_CLIENT 1 +# define X509_PURPOSE_SSL_SERVER 2 +# define X509_PURPOSE_NS_SSL_SERVER 3 +# define X509_PURPOSE_SMIME_SIGN 4 +# define X509_PURPOSE_SMIME_ENCRYPT 5 +# define X509_PURPOSE_CRL_SIGN 6 +# define X509_PURPOSE_ANY 7 +# define X509_PURPOSE_OCSP_HELPER 8 +# define X509_PURPOSE_TIMESTAMP_SIGN 9 + +# define X509_PURPOSE_MIN 1 +# define X509_PURPOSE_MAX 9 + +/* Flags for X509V3_EXT_print() */ + +# define X509V3_EXT_UNKNOWN_MASK (0xfL << 16) +/* Return error for unknown extensions */ +# define X509V3_EXT_DEFAULT 0 +/* Print error for unknown extensions */ +# define X509V3_EXT_ERROR_UNKNOWN (1L << 16) +/* ASN1 parse unknown extensions */ +# define X509V3_EXT_PARSE_UNKNOWN (2L << 16) +/* BIO_dump unknown extensions */ +# define X509V3_EXT_DUMP_UNKNOWN (3L << 16) + +/* Flags for X509V3_add1_i2d */ + +# define X509V3_ADD_OP_MASK 0xfL +# define X509V3_ADD_DEFAULT 0L +# define X509V3_ADD_APPEND 1L +# define X509V3_ADD_REPLACE 2L +# define X509V3_ADD_REPLACE_EXISTING 3L +# define X509V3_ADD_KEEP_EXISTING 4L +# define X509V3_ADD_DELETE 5L +# define X509V3_ADD_SILENT 0x10 + +DECLARE_STACK_OF(X509_PURPOSE) + +DECLARE_ASN1_FUNCTIONS(BASIC_CONSTRAINTS) + +DECLARE_ASN1_FUNCTIONS(SXNET) +DECLARE_ASN1_FUNCTIONS(SXNETID) + +int SXNET_add_id_asc(SXNET **psx, char *zone, char *user, int userlen); +int SXNET_add_id_ulong(SXNET **psx, unsigned long lzone, char *user, + int userlen); +int SXNET_add_id_INTEGER(SXNET **psx, ASN1_INTEGER *izone, char *user, + int userlen); + +ASN1_OCTET_STRING *SXNET_get_id_asc(SXNET *sx, char *zone); +ASN1_OCTET_STRING *SXNET_get_id_ulong(SXNET *sx, unsigned long lzone); +ASN1_OCTET_STRING *SXNET_get_id_INTEGER(SXNET *sx, ASN1_INTEGER *zone); + +DECLARE_ASN1_FUNCTIONS(AUTHORITY_KEYID) + +DECLARE_ASN1_FUNCTIONS(PKEY_USAGE_PERIOD) + +DECLARE_ASN1_FUNCTIONS(GENERAL_NAME) +GENERAL_NAME *GENERAL_NAME_dup(GENERAL_NAME *a); +int GENERAL_NAME_cmp(GENERAL_NAME *a, GENERAL_NAME *b); + +ASN1_BIT_STRING *v2i_ASN1_BIT_STRING(X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, + STACK_OF(CONF_VALUE) *nval); +STACK_OF(CONF_VALUE) *i2v_ASN1_BIT_STRING(X509V3_EXT_METHOD *method, + ASN1_BIT_STRING *bits, + STACK_OF(CONF_VALUE) *extlist); + +STACK_OF(CONF_VALUE) *i2v_GENERAL_NAME(X509V3_EXT_METHOD *method, + GENERAL_NAME *gen, + STACK_OF(CONF_VALUE) *ret); +int GENERAL_NAME_print(BIO *out, GENERAL_NAME *gen); + +DECLARE_ASN1_FUNCTIONS(GENERAL_NAMES) + +STACK_OF(CONF_VALUE) *i2v_GENERAL_NAMES(X509V3_EXT_METHOD *method, + GENERAL_NAMES *gen, + STACK_OF(CONF_VALUE) *extlist); +GENERAL_NAMES *v2i_GENERAL_NAMES(const X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval); + +DECLARE_ASN1_FUNCTIONS(OTHERNAME) +DECLARE_ASN1_FUNCTIONS(EDIPARTYNAME) +int OTHERNAME_cmp(OTHERNAME *a, OTHERNAME *b); +void GENERAL_NAME_set0_value(GENERAL_NAME *a, int type, void *value); +void *GENERAL_NAME_get0_value(GENERAL_NAME *a, int *ptype); +int GENERAL_NAME_set0_othername(GENERAL_NAME *gen, + ASN1_OBJECT *oid, ASN1_TYPE *value); +int GENERAL_NAME_get0_otherName(GENERAL_NAME *gen, + ASN1_OBJECT **poid, ASN1_TYPE **pvalue); + +char *i2s_ASN1_OCTET_STRING(X509V3_EXT_METHOD *method, + ASN1_OCTET_STRING *ia5); +ASN1_OCTET_STRING *s2i_ASN1_OCTET_STRING(X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, char *str); + +DECLARE_ASN1_FUNCTIONS(EXTENDED_KEY_USAGE) +int i2a_ACCESS_DESCRIPTION(BIO *bp, ACCESS_DESCRIPTION *a); + +DECLARE_ASN1_FUNCTIONS(CERTIFICATEPOLICIES) +DECLARE_ASN1_FUNCTIONS(POLICYINFO) +DECLARE_ASN1_FUNCTIONS(POLICYQUALINFO) +DECLARE_ASN1_FUNCTIONS(USERNOTICE) +DECLARE_ASN1_FUNCTIONS(NOTICEREF) + +DECLARE_ASN1_FUNCTIONS(CRL_DIST_POINTS) +DECLARE_ASN1_FUNCTIONS(DIST_POINT) +DECLARE_ASN1_FUNCTIONS(DIST_POINT_NAME) +DECLARE_ASN1_FUNCTIONS(ISSUING_DIST_POINT) + +int DIST_POINT_set_dpname(DIST_POINT_NAME *dpn, X509_NAME *iname); + +int NAME_CONSTRAINTS_check(X509 *x, NAME_CONSTRAINTS *nc); + +DECLARE_ASN1_FUNCTIONS(ACCESS_DESCRIPTION) +DECLARE_ASN1_FUNCTIONS(AUTHORITY_INFO_ACCESS) + +DECLARE_ASN1_ITEM(POLICY_MAPPING) +DECLARE_ASN1_ALLOC_FUNCTIONS(POLICY_MAPPING) +DECLARE_ASN1_ITEM(POLICY_MAPPINGS) + +DECLARE_ASN1_ITEM(GENERAL_SUBTREE) +DECLARE_ASN1_ALLOC_FUNCTIONS(GENERAL_SUBTREE) + +DECLARE_ASN1_ITEM(NAME_CONSTRAINTS) +DECLARE_ASN1_ALLOC_FUNCTIONS(NAME_CONSTRAINTS) + +DECLARE_ASN1_ALLOC_FUNCTIONS(POLICY_CONSTRAINTS) +DECLARE_ASN1_ITEM(POLICY_CONSTRAINTS) + +GENERAL_NAME *a2i_GENERAL_NAME(GENERAL_NAME *out, + const X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, int gen_type, char *value, + int is_nc); + +# ifdef HEADER_CONF_H +GENERAL_NAME *v2i_GENERAL_NAME(const X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, CONF_VALUE *cnf); +GENERAL_NAME *v2i_GENERAL_NAME_ex(GENERAL_NAME *out, + const X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, CONF_VALUE *cnf, + int is_nc); +void X509V3_conf_free(CONF_VALUE *val); + +X509_EXTENSION *X509V3_EXT_nconf_nid(CONF *conf, X509V3_CTX *ctx, int ext_nid, + char *value); +X509_EXTENSION *X509V3_EXT_nconf(CONF *conf, X509V3_CTX *ctx, char *name, + char *value); +int X509V3_EXT_add_nconf_sk(CONF *conf, X509V3_CTX *ctx, char *section, + STACK_OF(X509_EXTENSION) **sk); +int X509V3_EXT_add_nconf(CONF *conf, X509V3_CTX *ctx, char *section, + X509 *cert); +int X509V3_EXT_REQ_add_nconf(CONF *conf, X509V3_CTX *ctx, char *section, + X509_REQ *req); +int X509V3_EXT_CRL_add_nconf(CONF *conf, X509V3_CTX *ctx, char *section, + X509_CRL *crl); + +X509_EXTENSION *X509V3_EXT_conf_nid(LHASH_OF(CONF_VALUE) *conf, + X509V3_CTX *ctx, int ext_nid, + char *value); +X509_EXTENSION *X509V3_EXT_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx, + char *name, char *value); +int X509V3_EXT_add_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx, + char *section, X509 *cert); +int X509V3_EXT_REQ_add_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx, + char *section, X509_REQ *req); +int X509V3_EXT_CRL_add_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx, + char *section, X509_CRL *crl); + +int X509V3_add_value_bool_nf(char *name, int asn1_bool, + STACK_OF(CONF_VALUE) **extlist); +int X509V3_get_value_bool(CONF_VALUE *value, int *asn1_bool); +int X509V3_get_value_int(CONF_VALUE *value, ASN1_INTEGER **aint); +void X509V3_set_nconf(X509V3_CTX *ctx, CONF *conf); +void X509V3_set_conf_lhash(X509V3_CTX *ctx, LHASH_OF(CONF_VALUE) *lhash); +# endif + +char *X509V3_get_string(X509V3_CTX *ctx, char *name, char *section); +STACK_OF(CONF_VALUE) *X509V3_get_section(X509V3_CTX *ctx, char *section); +void X509V3_string_free(X509V3_CTX *ctx, char *str); +void X509V3_section_free(X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *section); +void X509V3_set_ctx(X509V3_CTX *ctx, X509 *issuer, X509 *subject, + X509_REQ *req, X509_CRL *crl, int flags); + +int X509V3_add_value(const char *name, const char *value, + STACK_OF(CONF_VALUE) **extlist); +int X509V3_add_value_uchar(const char *name, const unsigned char *value, + STACK_OF(CONF_VALUE) **extlist); +int X509V3_add_value_bool(const char *name, int asn1_bool, + STACK_OF(CONF_VALUE) **extlist); +int X509V3_add_value_int(const char *name, ASN1_INTEGER *aint, + STACK_OF(CONF_VALUE) **extlist); +char *i2s_ASN1_INTEGER(X509V3_EXT_METHOD *meth, ASN1_INTEGER *aint); +ASN1_INTEGER *s2i_ASN1_INTEGER(X509V3_EXT_METHOD *meth, char *value); +char *i2s_ASN1_ENUMERATED(X509V3_EXT_METHOD *meth, ASN1_ENUMERATED *aint); +char *i2s_ASN1_ENUMERATED_TABLE(X509V3_EXT_METHOD *meth, + ASN1_ENUMERATED *aint); +int X509V3_EXT_add(X509V3_EXT_METHOD *ext); +int X509V3_EXT_add_list(X509V3_EXT_METHOD *extlist); +int X509V3_EXT_add_alias(int nid_to, int nid_from); +void X509V3_EXT_cleanup(void); + +const X509V3_EXT_METHOD *X509V3_EXT_get(X509_EXTENSION *ext); +const X509V3_EXT_METHOD *X509V3_EXT_get_nid(int nid); +int X509V3_add_standard_extensions(void); +STACK_OF(CONF_VALUE) *X509V3_parse_list(const char *line); +void *X509V3_EXT_d2i(X509_EXTENSION *ext); +void *X509V3_get_d2i(STACK_OF(X509_EXTENSION) *x, int nid, int *crit, + int *idx); +int X509V3_EXT_free(int nid, void *ext_data); + +X509_EXTENSION *X509V3_EXT_i2d(int ext_nid, int crit, void *ext_struc); +int X509V3_add1_i2d(STACK_OF(X509_EXTENSION) **x, int nid, void *value, + int crit, unsigned long flags); + +char *hex_to_string(const unsigned char *buffer, long len); +unsigned char *string_to_hex(const char *str, long *len); +int name_cmp(const char *name, const char *cmp); + +void X509V3_EXT_val_prn(BIO *out, STACK_OF(CONF_VALUE) *val, int indent, + int ml); +int X509V3_EXT_print(BIO *out, X509_EXTENSION *ext, unsigned long flag, + int indent); +int X509V3_EXT_print_fp(FILE *out, X509_EXTENSION *ext, int flag, int indent); + +int X509V3_extensions_print(BIO *out, char *title, + STACK_OF(X509_EXTENSION) *exts, + unsigned long flag, int indent); + +int X509_check_ca(X509 *x); +int X509_check_purpose(X509 *x, int id, int ca); +int X509_supported_extension(X509_EXTENSION *ex); +int X509_PURPOSE_set(int *p, int purpose); +int X509_check_issued(X509 *issuer, X509 *subject); +int X509_check_akid(X509 *issuer, AUTHORITY_KEYID *akid); +int X509_PURPOSE_get_count(void); +X509_PURPOSE *X509_PURPOSE_get0(int idx); +int X509_PURPOSE_get_by_sname(char *sname); +int X509_PURPOSE_get_by_id(int id); +int X509_PURPOSE_add(int id, int trust, int flags, + int (*ck) (const X509_PURPOSE *, const X509 *, int), + char *name, char *sname, void *arg); +char *X509_PURPOSE_get0_name(X509_PURPOSE *xp); +char *X509_PURPOSE_get0_sname(X509_PURPOSE *xp); +int X509_PURPOSE_get_trust(X509_PURPOSE *xp); +void X509_PURPOSE_cleanup(void); +int X509_PURPOSE_get_id(X509_PURPOSE *); + +STACK_OF(OPENSSL_STRING) *X509_get1_email(X509 *x); +STACK_OF(OPENSSL_STRING) *X509_REQ_get1_email(X509_REQ *x); +void X509_email_free(STACK_OF(OPENSSL_STRING) *sk); +STACK_OF(OPENSSL_STRING) *X509_get1_ocsp(X509 *x); +/* Flags for X509_check_* functions */ + +/* + * Always check subject name for host match even if subject alt names present + */ +# define X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT 0x1 +/* Disable wildcard matching for dnsName fields and common name. */ +# define X509_CHECK_FLAG_NO_WILDCARDS 0x2 +/* Wildcards must not match a partial label. */ +# define X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS 0x4 +/* Allow (non-partial) wildcards to match multiple labels. */ +# define X509_CHECK_FLAG_MULTI_LABEL_WILDCARDS 0x8 +/* Constraint verifier subdomain patterns to match a single labels. */ +# define X509_CHECK_FLAG_SINGLE_LABEL_SUBDOMAINS 0x10 +/* + * Match reference identifiers starting with "." to any sub-domain. + * This is a non-public flag, turned on implicitly when the subject + * reference identity is a DNS name. + */ +# define _X509_CHECK_FLAG_DOT_SUBDOMAINS 0x8000 + +int X509_check_host(X509 *x, const char *chk, size_t chklen, + unsigned int flags, char **peername); +int X509_check_email(X509 *x, const char *chk, size_t chklen, + unsigned int flags); +int X509_check_ip(X509 *x, const unsigned char *chk, size_t chklen, + unsigned int flags); +int X509_check_ip_asc(X509 *x, const char *ipasc, unsigned int flags); + +ASN1_OCTET_STRING *a2i_IPADDRESS(const char *ipasc); +ASN1_OCTET_STRING *a2i_IPADDRESS_NC(const char *ipasc); +int a2i_ipadd(unsigned char *ipout, const char *ipasc); +int X509V3_NAME_from_section(X509_NAME *nm, STACK_OF(CONF_VALUE) *dn_sk, + unsigned long chtype); + +void X509_POLICY_NODE_print(BIO *out, X509_POLICY_NODE *node, int indent); +DECLARE_STACK_OF(X509_POLICY_NODE) + +# ifndef OPENSSL_NO_RFC3779 + +typedef struct ASRange_st { + ASN1_INTEGER *min, *max; +} ASRange; + +# define ASIdOrRange_id 0 +# define ASIdOrRange_range 1 + +typedef struct ASIdOrRange_st { + int type; + union { + ASN1_INTEGER *id; + ASRange *range; + } u; +} ASIdOrRange; + +typedef STACK_OF(ASIdOrRange) ASIdOrRanges; +DECLARE_STACK_OF(ASIdOrRange) + +# define ASIdentifierChoice_inherit 0 +# define ASIdentifierChoice_asIdsOrRanges 1 + +typedef struct ASIdentifierChoice_st { + int type; + union { + ASN1_NULL *inherit; + ASIdOrRanges *asIdsOrRanges; + } u; +} ASIdentifierChoice; + +typedef struct ASIdentifiers_st { + ASIdentifierChoice *asnum, *rdi; +} ASIdentifiers; + +DECLARE_ASN1_FUNCTIONS(ASRange) +DECLARE_ASN1_FUNCTIONS(ASIdOrRange) +DECLARE_ASN1_FUNCTIONS(ASIdentifierChoice) +DECLARE_ASN1_FUNCTIONS(ASIdentifiers) + +typedef struct IPAddressRange_st { + ASN1_BIT_STRING *min, *max; +} IPAddressRange; + +# define IPAddressOrRange_addressPrefix 0 +# define IPAddressOrRange_addressRange 1 + +typedef struct IPAddressOrRange_st { + int type; + union { + ASN1_BIT_STRING *addressPrefix; + IPAddressRange *addressRange; + } u; +} IPAddressOrRange; + +typedef STACK_OF(IPAddressOrRange) IPAddressOrRanges; +DECLARE_STACK_OF(IPAddressOrRange) + +# define IPAddressChoice_inherit 0 +# define IPAddressChoice_addressesOrRanges 1 + +typedef struct IPAddressChoice_st { + int type; + union { + ASN1_NULL *inherit; + IPAddressOrRanges *addressesOrRanges; + } u; +} IPAddressChoice; + +typedef struct IPAddressFamily_st { + ASN1_OCTET_STRING *addressFamily; + IPAddressChoice *ipAddressChoice; +} IPAddressFamily; + +typedef STACK_OF(IPAddressFamily) IPAddrBlocks; +DECLARE_STACK_OF(IPAddressFamily) + +DECLARE_ASN1_FUNCTIONS(IPAddressRange) +DECLARE_ASN1_FUNCTIONS(IPAddressOrRange) +DECLARE_ASN1_FUNCTIONS(IPAddressChoice) +DECLARE_ASN1_FUNCTIONS(IPAddressFamily) + +/* + * API tag for elements of the ASIdentifer SEQUENCE. + */ +# define V3_ASID_ASNUM 0 +# define V3_ASID_RDI 1 + +/* + * AFI values, assigned by IANA. It'd be nice to make the AFI + * handling code totally generic, but there are too many little things + * that would need to be defined for other address families for it to + * be worth the trouble. + */ +# define IANA_AFI_IPV4 1 +# define IANA_AFI_IPV6 2 + +/* + * Utilities to construct and extract values from RFC3779 extensions, + * since some of the encodings (particularly for IP address prefixes + * and ranges) are a bit tedious to work with directly. + */ +int v3_asid_add_inherit(ASIdentifiers *asid, int which); +int v3_asid_add_id_or_range(ASIdentifiers *asid, int which, + ASN1_INTEGER *min, ASN1_INTEGER *max); +int v3_addr_add_inherit(IPAddrBlocks *addr, + const unsigned afi, const unsigned *safi); +int v3_addr_add_prefix(IPAddrBlocks *addr, + const unsigned afi, const unsigned *safi, + unsigned char *a, const int prefixlen); +int v3_addr_add_range(IPAddrBlocks *addr, + const unsigned afi, const unsigned *safi, + unsigned char *min, unsigned char *max); +unsigned v3_addr_get_afi(const IPAddressFamily *f); +int v3_addr_get_range(IPAddressOrRange *aor, const unsigned afi, + unsigned char *min, unsigned char *max, + const int length); + +/* + * Canonical forms. + */ +int v3_asid_is_canonical(ASIdentifiers *asid); +int v3_addr_is_canonical(IPAddrBlocks *addr); +int v3_asid_canonize(ASIdentifiers *asid); +int v3_addr_canonize(IPAddrBlocks *addr); + +/* + * Tests for inheritance and containment. + */ +int v3_asid_inherits(ASIdentifiers *asid); +int v3_addr_inherits(IPAddrBlocks *addr); +int v3_asid_subset(ASIdentifiers *a, ASIdentifiers *b); +int v3_addr_subset(IPAddrBlocks *a, IPAddrBlocks *b); + +/* + * Check whether RFC 3779 extensions nest properly in chains. + */ +int v3_asid_validate_path(X509_STORE_CTX *); +int v3_addr_validate_path(X509_STORE_CTX *); +int v3_asid_validate_resource_set(STACK_OF(X509) *chain, + ASIdentifiers *ext, int allow_inheritance); +int v3_addr_validate_resource_set(STACK_OF(X509) *chain, + IPAddrBlocks *ext, int allow_inheritance); + +# endif /* OPENSSL_NO_RFC3779 */ + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_X509V3_strings(void); + +/* Error codes for the X509V3 functions. */ + +/* Function codes. */ +# define X509V3_F_A2I_GENERAL_NAME 164 +# define X509V3_F_ASIDENTIFIERCHOICE_CANONIZE 161 +# define X509V3_F_ASIDENTIFIERCHOICE_IS_CANONICAL 162 +# define X509V3_F_COPY_EMAIL 122 +# define X509V3_F_COPY_ISSUER 123 +# define X509V3_F_DO_DIRNAME 144 +# define X509V3_F_DO_EXT_CONF 124 +# define X509V3_F_DO_EXT_I2D 135 +# define X509V3_F_DO_EXT_NCONF 151 +# define X509V3_F_DO_I2V_NAME_CONSTRAINTS 148 +# define X509V3_F_GNAMES_FROM_SECTNAME 156 +# define X509V3_F_HEX_TO_STRING 111 +# define X509V3_F_I2S_ASN1_ENUMERATED 121 +# define X509V3_F_I2S_ASN1_IA5STRING 149 +# define X509V3_F_I2S_ASN1_INTEGER 120 +# define X509V3_F_I2V_AUTHORITY_INFO_ACCESS 138 +# define X509V3_F_NOTICE_SECTION 132 +# define X509V3_F_NREF_NOS 133 +# define X509V3_F_POLICY_SECTION 131 +# define X509V3_F_PROCESS_PCI_VALUE 150 +# define X509V3_F_R2I_CERTPOL 130 +# define X509V3_F_R2I_PCI 155 +# define X509V3_F_S2I_ASN1_IA5STRING 100 +# define X509V3_F_S2I_ASN1_INTEGER 108 +# define X509V3_F_S2I_ASN1_OCTET_STRING 112 +# define X509V3_F_S2I_ASN1_SKEY_ID 114 +# define X509V3_F_S2I_SKEY_ID 115 +# define X509V3_F_SET_DIST_POINT_NAME 158 +# define X509V3_F_STRING_TO_HEX 113 +# define X509V3_F_SXNET_ADD_ID_ASC 125 +# define X509V3_F_SXNET_ADD_ID_INTEGER 126 +# define X509V3_F_SXNET_ADD_ID_ULONG 127 +# define X509V3_F_SXNET_GET_ID_ASC 128 +# define X509V3_F_SXNET_GET_ID_ULONG 129 +# define X509V3_F_V2I_ASIDENTIFIERS 163 +# define X509V3_F_V2I_ASN1_BIT_STRING 101 +# define X509V3_F_V2I_AUTHORITY_INFO_ACCESS 139 +# define X509V3_F_V2I_AUTHORITY_KEYID 119 +# define X509V3_F_V2I_BASIC_CONSTRAINTS 102 +# define X509V3_F_V2I_CRLD 134 +# define X509V3_F_V2I_EXTENDED_KEY_USAGE 103 +# define X509V3_F_V2I_GENERAL_NAMES 118 +# define X509V3_F_V2I_GENERAL_NAME_EX 117 +# define X509V3_F_V2I_IDP 157 +# define X509V3_F_V2I_IPADDRBLOCKS 159 +# define X509V3_F_V2I_ISSUER_ALT 153 +# define X509V3_F_V2I_NAME_CONSTRAINTS 147 +# define X509V3_F_V2I_POLICY_CONSTRAINTS 146 +# define X509V3_F_V2I_POLICY_MAPPINGS 145 +# define X509V3_F_V2I_SUBJECT_ALT 154 +# define X509V3_F_V3_ADDR_VALIDATE_PATH_INTERNAL 160 +# define X509V3_F_V3_GENERIC_EXTENSION 116 +# define X509V3_F_X509V3_ADD1_I2D 140 +# define X509V3_F_X509V3_ADD_VALUE 105 +# define X509V3_F_X509V3_EXT_ADD 104 +# define X509V3_F_X509V3_EXT_ADD_ALIAS 106 +# define X509V3_F_X509V3_EXT_CONF 107 +# define X509V3_F_X509V3_EXT_FREE 165 +# define X509V3_F_X509V3_EXT_I2D 136 +# define X509V3_F_X509V3_EXT_NCONF 152 +# define X509V3_F_X509V3_GET_SECTION 142 +# define X509V3_F_X509V3_GET_STRING 143 +# define X509V3_F_X509V3_GET_VALUE_BOOL 110 +# define X509V3_F_X509V3_PARSE_LIST 109 +# define X509V3_F_X509_PURPOSE_ADD 137 +# define X509V3_F_X509_PURPOSE_SET 141 + +/* Reason codes. */ +# define X509V3_R_BAD_IP_ADDRESS 118 +# define X509V3_R_BAD_OBJECT 119 +# define X509V3_R_BN_DEC2BN_ERROR 100 +# define X509V3_R_BN_TO_ASN1_INTEGER_ERROR 101 +# define X509V3_R_CANNOT_FIND_FREE_FUNCTION 168 +# define X509V3_R_DIRNAME_ERROR 149 +# define X509V3_R_DISTPOINT_ALREADY_SET 160 +# define X509V3_R_DUPLICATE_ZONE_ID 133 +# define X509V3_R_ERROR_CONVERTING_ZONE 131 +# define X509V3_R_ERROR_CREATING_EXTENSION 144 +# define X509V3_R_ERROR_IN_EXTENSION 128 +# define X509V3_R_EXPECTED_A_SECTION_NAME 137 +# define X509V3_R_EXTENSION_EXISTS 145 +# define X509V3_R_EXTENSION_NAME_ERROR 115 +# define X509V3_R_EXTENSION_NOT_FOUND 102 +# define X509V3_R_EXTENSION_SETTING_NOT_SUPPORTED 103 +# define X509V3_R_EXTENSION_VALUE_ERROR 116 +# define X509V3_R_ILLEGAL_EMPTY_EXTENSION 151 +# define X509V3_R_ILLEGAL_HEX_DIGIT 113 +# define X509V3_R_INCORRECT_POLICY_SYNTAX_TAG 152 +# define X509V3_R_INVALID_ASNUMBER 162 +# define X509V3_R_INVALID_ASRANGE 163 +# define X509V3_R_INVALID_BOOLEAN_STRING 104 +# define X509V3_R_INVALID_EXTENSION_STRING 105 +# define X509V3_R_INVALID_INHERITANCE 165 +# define X509V3_R_INVALID_IPADDRESS 166 +# define X509V3_R_INVALID_MULTIPLE_RDNS 161 +# define X509V3_R_INVALID_NAME 106 +# define X509V3_R_INVALID_NULL_ARGUMENT 107 +# define X509V3_R_INVALID_NULL_NAME 108 +# define X509V3_R_INVALID_NULL_VALUE 109 +# define X509V3_R_INVALID_NUMBER 140 +# define X509V3_R_INVALID_NUMBERS 141 +# define X509V3_R_INVALID_OBJECT_IDENTIFIER 110 +# define X509V3_R_INVALID_OPTION 138 +# define X509V3_R_INVALID_POLICY_IDENTIFIER 134 +# define X509V3_R_INVALID_PROXY_POLICY_SETTING 153 +# define X509V3_R_INVALID_PURPOSE 146 +# define X509V3_R_INVALID_SAFI 164 +# define X509V3_R_INVALID_SECTION 135 +# define X509V3_R_INVALID_SYNTAX 143 +# define X509V3_R_ISSUER_DECODE_ERROR 126 +# define X509V3_R_MISSING_VALUE 124 +# define X509V3_R_NEED_ORGANIZATION_AND_NUMBERS 142 +# define X509V3_R_NO_CONFIG_DATABASE 136 +# define X509V3_R_NO_ISSUER_CERTIFICATE 121 +# define X509V3_R_NO_ISSUER_DETAILS 127 +# define X509V3_R_NO_POLICY_IDENTIFIER 139 +# define X509V3_R_NO_PROXY_CERT_POLICY_LANGUAGE_DEFINED 154 +# define X509V3_R_NO_PUBLIC_KEY 114 +# define X509V3_R_NO_SUBJECT_DETAILS 125 +# define X509V3_R_ODD_NUMBER_OF_DIGITS 112 +# define X509V3_R_OPERATION_NOT_DEFINED 148 +# define X509V3_R_OTHERNAME_ERROR 147 +# define X509V3_R_POLICY_LANGUAGE_ALREADY_DEFINED 155 +# define X509V3_R_POLICY_PATH_LENGTH 156 +# define X509V3_R_POLICY_PATH_LENGTH_ALREADY_DEFINED 157 +# define X509V3_R_POLICY_SYNTAX_NOT_CURRENTLY_SUPPORTED 158 +# define X509V3_R_POLICY_WHEN_PROXY_LANGUAGE_REQUIRES_NO_POLICY 159 +# define X509V3_R_SECTION_NOT_FOUND 150 +# define X509V3_R_UNABLE_TO_GET_ISSUER_DETAILS 122 +# define X509V3_R_UNABLE_TO_GET_ISSUER_KEYID 123 +# define X509V3_R_UNKNOWN_BIT_STRING_ARGUMENT 111 +# define X509V3_R_UNKNOWN_EXTENSION 129 +# define X509V3_R_UNKNOWN_EXTENSION_NAME 130 +# define X509V3_R_UNKNOWN_OPTION 120 +# define X509V3_R_UNSUPPORTED_OPTION 117 +# define X509V3_R_UNSUPPORTED_TYPE 167 +# define X509V3_R_USER_TOO_LONG 132 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/solaris/openssl-1.0.2j/libcrypto.a b/hdssd/external/solaris/openssl-1.0.2j/libcrypto.a new file mode 100644 index 0000000000000000000000000000000000000000..e6817f006b4144cc1a57e3b95089ec69386d93d6 GIT binary patch literal 3135244 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

      GOVpG^V(h0UkK^jEB3{n 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

      KSrg$~M9FP=z%C+BEX6pv^Mf6mm?Ay+;@qWBoaR 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 ipGcTNJGDOf6 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 -6XYEux=emHD_^Cru82be@EZ(DR-f}(!;qV^ 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%0DtK@a!k=9K^M{d8B<4d{bEGoK0v8A3Q@P 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

      hSY+m2H{u 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

      1nuDo7X{_^~SPl72-Lvx$ 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

      ?J#g;lqG?Uo&VebqLn3Sk+t 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 z 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

      x@m>t@fWR78T`}vnm~SbUS0;P8~lagvcvis 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

      gnUzvC(b{SD4$N0pGlPewdbYh`MhQ5 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%0DkdeA+A=kTnzfzbdQlX>R$X_P}g<> z9D5zcW<|$_-d5?f!H*4^GZZ|T5MrfHLnm6dNmq#LHGG=^_k{S2hJ$_t}dZCWJcUnTxur+BNh z13H!Hr&*jO2AuZNb=Mhi*MPSeaQJW*zs-Py|1A7@1Af?mqyK7MRdyTjegkgEG6k|| z{3-bX{**EU4uN&MQx+R=$ABBQn6e44Au0V#p)AUmraWNagHPRes?b(8T^-<8EeY_e zpex-+s?gRRMZXGurRi7gGw@$E;IA3*i~&Dsz|REmsj&b)b%Fu64fsL>Ztyv^&VbX_ zMMC~f-Dada4V>o7%8Ov?{&rlFlB8eV3=!ShrNH*`B~ zG2S%R@LB_Zl@LuDzE+4=b-G1}@8~q`sCb*UTZqqTIQ6gLDLg;d@IwY1vRtm=rwsUM zq#*%K7}*ACK!*V*9GIz^bLVOOa~9yy40K&CmckVl+LQ2Y zL0fYt;JspnGZ*-JZa)|JTCTY@0Y7uWgPw29g+9Nn>)wO3(*NB1f_eU2@bPW5%fGq1 zg?Luu_XhNN^#Erc zc+%@~^AZ96yfOm^{Aiubt25v&1{|_$`tv*kCuQJt8aU4zI6pUVUNdmWvyx@rfPr(` zz&R7(%m@D(e?Ij2lG5k=g$8^{us$$-u;Qu9x{-PG6E_l;?E`s0c zGb5Sq&A@@Yx~)rK3*FWwkTFZ=C8O?{Abn{pz_}FsPgcBLy2QW%|C-LF z>kPPSzzscL3i_Id#iXzL(PHXK*<$g8fak@p8aSu%S&ZW0GU#x(PLl^k=dwLQ{G*1y z7SO!x^?>GO{lS=c*?WP#E=T+N9_{i(aBp?_tYCb(+>rh9x}e?5DZAqT@}{7z%QqQx z9x(9XxBA}g@_j+wD@4%N74ZQ73h;BAlIsfCLf5^b+Q8Xhq|t5`|2_kbcH^23bTU(? zp$B~ryCfgG5h?f*$U8-+R|RyItVLSMy9Bn@KDGorWa->vq<0(mDZE#xX&y3Y9u{Js zhX34vcN=wKyKKAQS=;?e=uN|~1Yeq;E1@gxZ&yw;@ToV&|CQT;UPV5YTvvflEz4Ei2AzQ*zFh?!>h+4HsHfLPmL`I}uoODf{ zpuhCCfd8dU1{^xnJS^Q~q@Op^X{1%3T}oRko|i&b`aWgpsQ||jMmj&hcV-#zg@LV| zB?i34z`rM;??8taDBU{bQ}N?;2ywTDL!Ub4IIjw^S;L{vf70n*AwI6t{n$NGrI&$c zy(X}%%t$W|?$ej865?Tvzd?xa>-0V$9?CpE{l_2X8e> zmgOx5zGu(@KWj7&Y@yp){*r<7THv?KGXcD&Ea+1;Zcw*ogAf-hnl-TX9Xbt~Iv&=5 zj^=FzWYX=funo8u*k#4;VBA>&ntBXc0h&7gtoXS>2mYgVwE}JFc(nrd)qU`qSb%fQ z1Oq-TpmR;Nfdk!Yn%CTB;6Tq=_&o+3{Ab~*fX{0>4V>o<9Pp;sR9D7>^~ROpP5aDB zH|SFR!7LyI(2#*VY&~YYm+Hgm_frv>7-Z22QUKk0_k$jJB>b+PZFW@ErL% z+DOHj>(JI(U3Y^4r`}MXf7k5})&Q^DXW%>+#FOh@G2pKnbu&WTsOb*`I3EM;i3V9-HWGPc^-MlIoYi#Q&MlDl6`gifTafvd4XQ1s9}wbR#ltNRA`KY- zZb=#V&jCPi~K3P=I8M2%9M}|@NYUU)=_xd;R}&E1I9Ai>k!uZq?P$DZ zNNd_icAUb0OL6HxS%y!YHf>x#XX{+s|C_gH-r{+eEV%5_1-4x+LH_^qs;e(qxX`v2 zR4=MtEa7g!{VP^o6S0gYBBB_?4ZzM0DLO5J7pO!5%I56YfY*Xs8rF+B+qd#lDly0Z zzlCpy&)ISBW?7cSY2MVJ5VkYvW8ov1&G;fql0}c^OT;$blWeiK-fpkP`{RJv^X62~ zng1!X8+;lou}M!4dMJTiYyV}!3*GjIN4 z%@z3cn+bz8U&FvxNWQ`aHMJ`wUtu`;FkwjJb>HFI9|AVo55u$V4=FI(9|BkHXJOK= zFc<(-lc5hE67c8e&(V*n2sq6Uh?a$C`BQrK3zp*r;8m-xU8a?<=!U^s?qT3Q-Ee`H zI}E4XVHoAr_+iEaIl(W@la)uy8HQ)&98zG=9|9lh2Z}iLkA}lKC!Z@_p@Uf?fb zIOQ>6ino=^uQ!|rG!$NobqFUe**+f~v&^Jp!hJpC|KSE}2ox$;S_&yIhPA$5-f|Ov)xAn1)A*D38Mxu$ufA-R<~mE`B4L zpKU0|J!Y04ei%W%d4D?+e9gm1@p-=-!j<|wA3voEpE8exAKrVDK4mcUZ)y4-;JiqW zH`wg&s{|^Std3*R`8gkb zt_hj``PcACQ|q7UzlOgIIEqRBX#WxC!;zg*D-Pb0#w0lwmYMEENdK9EO* ze~rSY4R%n^o6Y&VS_oK@8DPe$wr|6F9h^Qg#Q2tur4l=mH#oZ%l98u`y$FHD0DO; z{J&E)M~eR?pEik)i2j2Lf290>S>ZzllfLdR=g9kz65T^R%FRl=mYt`6J#64>T>PGQ zzO>uGcLMt7oew->;CtudpTqxN;3y#7`mgf;7;uz*M}&_xcS#e-Bf@_i_(X(GMugA3 z8HorPMuh*Q!iNkdzI8r(?el4qKD)YbaG@^rZwU`+eNl(>|9`*_)3|K>82EC>a8=~v z5dSIQDE>!8|LFkVM)I%HPXPzIWE&%*|MdXhM)I%H-wzz}k2Xd`|3H9mBl%b9cLE3c z9x?yV1o$?Rf0h10;E;c`Ve*goKfHaP4e)IwHGSX@Yu_{t?%*PE8<*u@=bMkES?=H> zKIK;U=Zhz4xKI{fc|YqZT>gge&yknUacx{9 zwQrGuKN5L)zpUviUOrOZF$TVabclZ`n+G@rLHtQyfFB#zNbRffSfBMY{qxzEAMSg& zh(8i}`OH@1k3?SH?`wPqY0b~B;m6-}!oX*}5I))D<^Ko$j6>SPMc!>(8vlIqay`Mr zMSNZg-&%Gae#QgG8;Z+1=UX30bNxZ%J4h?~=bNvl`Cfp==WhuA9C;@OtZQ8PtNGss z8qeWkMfwlcHz=meE7~84U#9R)T&B-Q|007Q2Y9;PuJh<~vcb)YUF>=PtxFLB>3e9KO@1fK!e0{)W!Y@gPd=ElCDI#r*Qdea{_#ODE{#Dx!&mEf<8w?zdFFT zku>-jo<7$bi8xaJx!$Po`Ey?SEF12x(g4B^@=yQjqHtcqd7h4U&=!^>J`QE@9Itge zAI7Q`w=(bG;@LNZAGK_K-l05Wr^m8!_E1U`JEDfTT~^ZeQZDmL{Cq{N$}d#;RVqJA ziacTMahG*o58?EL@~?&RuNwIYsQ*eRf0%jm z+$8Fs?P)o>tO~6Yp7}$aXq~Pm|0vfwmFF2DuXTDQ%hNL|ZMH#O;;h9})Mp>;g!707 z-m;R^-JFbNpFApcD{WQf(}iw}x7-c2j z&{q?hbtP0WkXTWMhutTV8N6{wX%FfS*?SdltNBgu- zcCEI_ZcYm4VtFYssukxe9>&?;Nawflti?8m=NlICJi{j@yU~uxZZ673?`2s^6z$<} zd%6HR$ny@mcRQfmCeN^9zq4*2Y;mo%<^`PX^!+)m#mQr9u`S*e&ZJ#Gb)>%fa_vp= z4c2wU0k1g!ihb0&hWP=@E@K}quC=bFZo4hpVL5n`(Fr+txL}Wosdn-w#&9wP`*w5-w@lH^AsyC3{a~XW||p4(maV2`@lb5+~tmoaLbP9`K&VnEWk3 zUh${ngUR1_!JqUe#c#l0X}0YgwEZ8T{Yq4~jsCBAU#{Bz70Qq5wy6ip5y>R*;qzj= zz`*p7Cz`FSHf||109U4{HX_}$9E>!=Gywk;;^v3Oo!>TEvFJ0+j<0N-1xWlSzbn_Ixo8I3P#t{%Ls z8}uq94W1#Hm7C}3t;d;&+1P{pn{3nK43~7-L5c<=WO`v+Vp-ary$b z4VmN_;^5h8ONfcxRSwSw$9Z|qq=MChe|#a=jX{^AB(2=!suzLJdS87fS@#0+I?Z43 zABX-rz*_|44D^{5`wha_e{mjjnRmdYesifC;9K+q@YDOQXt2v2aqL~I;iv?mbo&VB|3seqaQ-7<@5bDsupHFMaIz2%c|IWj$KhAKI0smt>x*^{ zE1uI{O7eRs0{wIew?pNhXa0n6^Km|5zPBHCcf_-VIk-@lIzG@188BA>?-`yI`E-cp zlf)k&&4Z|4D;{GWF$L$J%NS9>Jajog`lv5`9X34e9n28_VU|0%NLTUjcNmlN5qtE! zbRuz(2Mw3wU$M%cR(Z4k#KH4jq(z#HjZ)z_lsj>th=tu)|q?_i3uuOeN> z)h_EmjhAwT<%pG}-6vd}t=$xZtjmET&-QizCq8+z93kh0y=V(C+Uc_H3PD=^M{}Wn z#OTwwGw}916M;LQIF9i3(Fgdu7RoxE3t^9$q=}d&E+p(>rwFjTi-B_-bXq4hM!l3E z{p1Ur?>vn2r)xz{5=Bw`=ode%0V}C(>;d!kWo-Vg-%Mpmn?qcAN!}vP^aCx7JzCoP$ z>GD)He#e|Hcc(c5;}hWQQ#d>IB-@D+#(AzkSNzXCaeEo@a9(kp?}N5HuXZoS9K^Xp zsIwD0T8`(v!=uJLzgsw?c6IrEt|x}MJYs)wZRDm__&m<2cVwG-F25nN3h-HLw(9_&dGd)l_a9l8Z4k~may!nR z-dmcHHU?juTX%u4f0H`#?;Xf5$JJK=|Ah~i^GU*q|03W&56#6{#`*TQQP!D6JF;FP zTaRVWq3nml%*DTmvah4;4fwIVzlLAuQw9eYe`ycOgE6D4yUN}}csu+Le*7b;i>-s( z{#2EWDIfV~z^c9dnQF@s`BC6XUVMKBpUD+ykLPdy0ls?$aColtq;{O`O}QP3FDA9+ zX5xTNV4iT~ZRBO2VIFNi&9<|3P`?fM?Wh;jNlrssrvbAipBqFw_;mi1n@pi^HtoeW zwJ2Y9tSXtp+2Se8rCautR7zRl$950k-oX^_B^G0D-$J^uCGV#O!B{SB(0zla@ukkB ztR=3rGh}TB{p&j7bH^EV+1D#^U(pg8Z)ii_S6l`B3yDwNBmV|@!0&kQxsN^y89Gw% z6~Kxyr{5;+mJ<2x{@Os{A^tw(Ou!hI(~Gebc=_E`X~A?))Gk6k)>Gv%Zb^HWV=h4b z@Sf1Y)n3Z>&VGP37?fvd_t+sdFUGt=`Z9k%stj}IZp;r0Ne^@B9_Dpg*<$XoN_!#a z-K359RjB9CoG%l`vcvE_)+5Zsg$#eN)2;hetE#F(U3wv^mwIU;yDFs( zvG(^nbLP(B`p=VoU%zMf+o$t9_s;K}^Pcy-?|c5tnKS1PWqT{$^an55r`2`VaEa;* zFnj*>`rpt3`wTq$J!dVRtJPD6HTLu}$6&j8sM5h%?{?zRb0}SKPo}dL+M$K0^Bl8! z18%lAH*s&q{hub&4Xk@NaOeB@b=+5jz7+Hv*Y@D<8A^7M<|n`&{eTg_p;zI51nzqj zXVw2}Vf*SXph&D3Lw(TU^bhztq zM_vl~%;CF%jU?f&a8KCr8e9AdG5rQXhwl{i?&F?m*rFKiOFVf0or+qk-N&;@_JcrI z$GpWDLxh-d!6P|kTB%ED5794+yHCsr$drH_v1!vv4pokd5j=wiE4##S2AGZvIH{-pg7(enVKpQLEgKi0)0S4RK6HhoU zd7xagk9PYZgzrm=Qo6zG2YE841_vz>dtm;*GA-y>?jH1P++}|VeWdo8PmEgbD4vZr z`oqsU?CX4+JZvF#OhNB+Uk}HTQYiOjbWg-Qbg3mxE#B=gt~CEwhipq2>*uE_Gi8O` zMev_|tjiIPzL<@F<*KMgl-z~w_fo)jIHjaabx zLiEGf|L&VL8mz&>7p^J)By2tc=9vlP+rCPV{Rxb@+L0%_Fh+Dj#F1$g!|*$YI2Ysa zJMI{1TNEO_2;K$S;f~@Lfu8|cBEv@3I3ygyJ(h`ceCguS7p@_{+xhGrH-6OS9&Z%p zT2X?rE#&Kil(oox!YTHWR`rpjRg=BbralH_z5mjkNDpD4DQ7%)(5(b6z`X+f$SCL{ z6QEDavcq=-%bdQ`t{sb65vIpDhAozWN14nk#vPS?6ULKtlHU`K1AUAu$`AZ1E+YOp z^6)w-Z(2*c3VMEMCZvs#7Iypar1GQNJuc&=WcgVuDv=-dD+q^P<&+Qk{g;$!02q1~ zTtXP^92+xaTRJs$ryWl}F#iq2W7~R)cI9(7A}}!!^?M@LP(Lsz%W^%-0m{-senY{% zF8BRptyoAKvG6Rwx9!17q=$MqRGCHJ)0;>8Ucs_sBb-XMeCS*G?+k0j2botWuPqgb=6YyzZ1H~R8o~Gp>MU$w zi+AC>2FK9aFGV{Jy2rDuql*y6vX%f{+&ykZ(T2U7Wf8pFQH~F)F|TFh1^JdRj6djD zi!_-h0^@NlM>96dhEVAl=zsq0aB|H&;w+>tcsGqt7+&kqbGD4@9$PaHnJOg>zMU~1 zc}*>`n#tQn9Pp?7?UPZ+am-`=y{>r5??aSn0`#i>a&A}dqJ3<*m~YfMlZNf1{@}9tVqhk0c4pn+4#!uT3KXP%2)iP^bK77fz zJTiiMmq}k9+8516rqh=XpG#jJQF)b&Vxt)LIR=uB1$J+`{4nb`-V~rb(1zn1yS4X_ zWykkL?a~2Zmws)zWkSG$0q9WyI(~~Bh}x02>f4+%tkrxzxt{Zyf&6FL9XG7@i$+7j zJ?<<>qph7b8engc@MRI4+n2j&Kh(F@@7&`hkHkFl|GLMEUl)$~`kfi^Tr3;8fj0A> z(6-KDyyVgns}1itYxO*U{^HS$Y$v6ibBq-rf6@#kSNt)*_1eG#__mGm9Ea{KOaA+^ z&9dpwA7H*@ni@9Xw~Tp(`%3)e_l4{djKQ)FVk|tUgWwaPOrT}dTP~#UOqOxZ7*2K) z8F3NcJq8M2$WWH2mV11U{*5D*nbP5^Ou`1u)Y2C&sJxAnk$gtt+cL{9>>6LRCL{J0 zi_%5lh4!fw<)+~2_gnGtALeG%o+ z7E7t)In#-wZO1cJEWBts?X08lub3513+vmZ#tx75mHDgMoPsg%A}#7{T?XOAT3zLH zZ$UQN;klz0+p&LO+*zapx_Z3pwVaMRk)uDrcyE(aKLtPX8!+bC*2Tu*N4aTG)V+(8 zPtSLF%j^FG{UZM_^o#sU>xX(1KNoc@)Gzs*L!FFVj5_V-qBi=*)HSSqGkxsk!jJ1evL(5m3Yp&=-b5cjCIi$Zdxcr^FWo=JW`jzcOIw9#oPtf zZ$6`+Zgz})C00cC&utN9z96qlR9P!l+3}_u%RTGoxY2Ndao*y}d7EPXH9Z`086CXq z9o&Zu^b7LB^W7j34cLo`^hrhkfgn!O2OIO;zbu56fnT!H=f5*A{6L=jN#DJoufmt_ zm=Ng<{3ccWQ+f2?&vQ@Zxv%2vJ`aAaD*iv-8Xn2%=*u4gnSUuavh5Z(^pCjs4f*^c zEAzrv=ea+e=l*D(+sSkH;M~Uy_&=}sKav-oXRnAS#OH>`&?7vE?ZD_Yfv8 zrO%(_xqpN`FX0tQDf(O)@#&3R*;8&5YyVR2#yoeP{>I1i!hb2x{V&t7L$qWC(Jold?|FiJxQS`6oh0iPZa+Eg|>8P)ki0t+0qjk5^N0I*x z4*Zn7(R=g4e=*P9ndkmB)Q2qm`V{|tdEx&d&wT{@l3U21T1Edmh;M_YMY*BB<-#4v zGY%{-UyE0<1U-yrd503{1K^G2vei(;x@7&to?Vl>mbkvE`{-N1zYq3{f$F^Pa zpk$x3WVy>vrmwsEVIN_~zwQnke(aw&zkAD;?wxO9sXTgc+&m6_mIrA|mOHz*cR#eF ze=Coq-_9eL@7}zvL!IS}Rd+e z#6i$F)VUW2ol|N^tImZ6*N)x2{W!*ZTQ|e=1jwc`uWiw93LAsmQ(mw(c|bcbiE%Y(EZ-i+Jk?Ynz>ePeca`i9($GrMtaw-SMT z{By^pAwT@l^-2t!FfC8dhGp*B>)EzSdMOL%nHL)DLS8XV zKS5b|k*}S7%6eq=4pIk&J!jZv-LNu`NwT?X>qFhU`uzegeQ9cyWjSqSDcr1`;jM}# zODndq?Ap5hAzw6PY<|#h zcBHMtqCwivcl7S|OJ7jbR8a`D+}#I(w+MBZ{H+CN>-Jr_x{Z3BJDOga4|_z3E~y=I zdT0NG-5vd6{f7HL!G=hlc)v?Etzq!y&CJd1JEZiKQ=QT-t=OlU26!SDX)IXf;a&dW z?mWIeuO{b2eQ@{IUbL!=p=T*t$n8)LTsJ@1y90IfR`J``N+|-XsB+Q2V`q0@i)|>5 zJ5*!*mdDmhb3@u&Qh`}E?A-c!v~?dt%CZtYjB>o|O{dfc&ka?*{2Y`|LQ@FY2Wp0^ zMPVDbOW_T`=u=CYcHr|0JHT@a_o2Vmq_7LTQQ;Bb{R)o(pH}z+@QlJ)^wm-d&jPpk zI1&f$SGX2=}?*Z;o_yF*b!jLC=USY@+ol_X{m`w^p9&@9@ zH-Pv1*nm9dX@wz=Iiv70+*1m##=TA94Y>C!+=Kh5!mv-lq{0K(QrT4aByfwu8Q?C3 zr-6qQo&`Sd<0#~b%_(f*{jEu1$WXXZVaQOpUt!2lcv@k|P&lLT2)bG+g~x!~6uto5 zuW%N4RN))IlRh?+*w)!p7%~*KC=3~jx)g>CMMDZhhNANdLx!R`g&{+6lfox~H!7R~ z-mma9@M(o-foFVNAka5XDGYf^+7yO7CH)FRo{~|8Ay3Jq!VX@8O@;RWwd71)lS9EQ$TAn-p#a-l*^f;Qb2s0iRZQ0C+}W=v$Uj82XmADGYtf`W2o9 z9`$iy9C%V;=vZzl3?0i`6h^w`T?)hI8O5wG@Z3;WU{R-~^9#wb%cv9h$LR6XxLx##0g)abiDVzl!Quqe& zc^?-gf#(!nhI7K26ow2{8x`&W-mkC=d|KfV;2DL-aK>{=VWgXCQyA%{`V~gHsZk#n z*8)!}yc%B&OoiKlTNK^{+@&z|tsYYNB=C8KGr)5SPh$+HN#Ps78+}|-3%p<9)xf6} zZU>%Gcn{uJQwom&w<&zqe~-OQz27eAhrI%fI1dMSFV2n#Fl0uM zv!G-e{E?o-u+;(&%cldHQM`i(81`KgV8~yjFkhOx3x$6@AD)pYkO#jU_>W_s`2c4% zJS)V#%0B`Q?+S1dd+n?7i3n`c5ct=^Kj9}8X~I_cfqzSQu44pt3)15AYezuSh58oY z{h`c8J-#3)f1?#Uj0U(bYz4@>oPVjCutPotdqNu) z9KiT*K;votqZ<7wjVI+%dKFA-G+E7mPV?8~WV;{e8`I>B^=SSF(OxKdVww!GlOg}u z^Fq8kpc&WVQXVB+>{?hJNE-MTf`3rP_cAg1TpHj^c-DISrSQyf_5qRs%?&(D6fQzq#Q{d#t^h-q;9RL<8|{ViFCGiezbb~E zJC%Ql8J<;M(j>%|z`rFtTdc$l&tNPW5n@$91KAvf6DjN(9^kW~Z4;0!up#S)iOLi` zg?f@z_%!g0kIgvnRfUIuulbneG%>3%^kaX3d@;`~^zEBuxl|o1Q z$5sL(4T)C+Clp=_jQG-jBXG*cl(V!}!}S`rGz`1RbVdZ->l&l4MUC`O{<1& z4Yz3+vgYX5X?TN%p+k}a@4!#x`A)o`DN`!&2r!+SOCYIwhf4`}$Hh6gk} zq~Q?_AJ(v^;ZY5r)bJ?{k7@X{hR^yq278n~ulZ+uT$qCYdCmWVhF{X~xP~V+JgwoE zHJtTvp#}ak3az&8}`1-|KHmRo#$&y|5PQ^Ro$Cp4VY zFmw*ePg$*o>op9yb2LpFUZ&xd8gBM+;bF+uqA=`Kwp!trfm?kH5k;A;Fw$gSooU5E zTLxQ5d=_|}!WV#H7wJ!)8xy5)?O9HJVYJj$#HGFo zg~2oE|CGP1@qx}k|EGL5^iL+k{*Qb=0w4B&k}Y9cNyrfNZRC5C>Qg2A!@f-tx&?A3 zVUwWGkUS~G2h_7E3E6V~*TQ~F@@Ckd;d@rlSFETF=_{;|f5mDI!zMwx6sf3&XePwHS25jXz4R6wLpN1h%aAs`f zbl7*Qyc+Va5+VO8q!sj?s+MUq%^D5zDCi?qAzhY@CI|0;unEhC#IXN%Ry15y&xd{N zsto)=!>bDN1pTP0Y}k*gnhX0;RX4+aR0{DvqU@8Z4f{^1*08^nLLLSErPNT^UrL<{ z`%9^p!hTK)G6ek`mT%UPa)hU@DLeo?tMDW+WFrmBY3hc;hk+p{{aG%mp_{}mu&FR; zs^dN;|LTN>lNwHG7&->>RM%_R@^Qsk@M+TgkzYCbl^Sl=aEpdlYq(XzwuYf+j^|np zuhZ}b4R6$NyM{Mu*wHZTmE+%|;a&~*X}Dj*do;XP!?1gf=Y9YO{<1&4Yz4{t&ginzfR$+z#B9gq)nTopm$BX z!YN?L5!kB6QU1`Qrc3kh(QvP#SqU1*EqOwgntqLDkB0Xu8l+j{DhwVq`!$*a${(~f z2NlM>W1N!Tt8i~pcn(Kq7oYnA*hOcV)nucdJJg4Cs8on9gTA^W6!*LBKG@R6MO2c3z^9Vd@ z>otE%!%Z4qrs0(uZq{&%hF5F2Rl~Nzkg>K+^IxmsbsFBF;f)$@*YG9{I~wj%7<$+C zX#Tw#?o$}L*7hq5*=zSG3>j-PIJHvswQ4U2@u>j6EW~FNURWzcM}VKlGb6w^Lz+71 z9MIRn&i5;tx`ScAv~Dy!f4F`i>~q$SgniEXF-##;aqC|S8Q2xgi=F1A{(AM%wK-UFleJuY? zg%{#Zx|r{7vhhyQ=VSSADSSKbOjD)17G*`6n(+w85BVjQ;>R=<-Fnc)a&!COALzlo zHyKCK{SxVrmx3Qw8J}UygZC?}=ze(_%3L%2NJpB0?tb8aH{kAe{H?(+xMWx{E=;|{ zJd?LLXBTJczSTLqcir96j38V;&pErRUXtRYwZpXxv(|4pXID;c$(^?Q|NNZYd;Xc% zrhn!Y7%jLfn{@{6Z3=uy-9P+cAKZ7}eF4c^-my-@%3}Qq*MLr#jcr%VMt9tBurAdR zH_XPp`--tH){d+`xAcYm=gh`~uIC7>QHXLaRTgV)+%G$k^jh%`SbK92KUap^;wlRr z*K!WTto>NqQene=2J3L#W0o*%agl|5JZ2rByV4dDEDTtWBGNVn-XV_-H`ckxea8%2 zd=GnO9H9Rtv%zwYX9fJe$uu%eRsuh+OKv~SwQZvw`5h-e#Fyz_H5>Pw7_`I^J5n|V zxotnJ{#xM+``u?f>Vq|~BK~9WxLEL`wwWmOKj?A2^KXtM#e#o|Iw|+JorqzJDC8}~ zFUIw!jB_#C*fvi3$1T#wpmV_l=yB(|vdFVroWdYI>_1sKyx3`QJ&{oBEKB4blmj-` zr}l7dFV+L44w;!M>T}X`E5B=q_>ricI%V3WBhk!lCr!Kjo2Hfdu4#EwW@Ep5T$H42 zvED0u;ebkqdx2D74M>%8*UeGS6VfhnE!L~p7wb@&V+<$JQAT=PkB2z*nL8X)#aV>4 zP-DbcD`W$E3d=Qm#IPgROMaJjrki*0;JT^6zLFMxSl_}d5#khhGEd>RfNs!Q%6;1{ zZk0B9ab0xN1M`1InMtFk!?^T23Hg3bzEThJ#oDC|dESNiSeuhl`xriou(pw8gG0Vd z3pzf^GIPw#R5DM7OgBDgW-5*qh^hg@EWRWWZR9rs1~BhW?Qe=wB6`Ul7o>k71ZanEpBgsT&U0f-Z!>bK-;PM9LIY5{Q8W&RIDNTXPUD7ZKQ1=Uj^#0 z(}=iI_S7vp9)|2KHo|1S?3n)>=*V?d*i-Tr9kC~71J=&zIyNj;I{q%wJ*e^cW42oy z^@`#*fY)-^>c2C5DCwY#ym6j#z18|QkjM+|r_1$w6UOm=xo!{pGb3&6DPU!|Mt-R9 zg{xd6$TfC0VjL=bVTQ7-!n)E4#FOb#2c(Cze+&8fIOP9r(yH=zANYxB@VN+nQ;3hU zp17Fq+&h)-l)6l(J6*IJakkkpTfC3-_g!gf>___%$9_LpW4w&(XSwe~$u#t4 zyAS=_FGj7??s13hYspO7%FePKJz-gCTNoL*8P2v6b~6J%)VD(NfetMDvai+1e-$oex`e|e0aien&=@7Pu;X$4p235wzuK>^{vr2K}eT zV@_fmtpMZ9V4uvd*I5z7sXk&`0{7Gi?@weBh;!Fz<{{bu;Br34V7E_ljeS7fB=jwqKpL>yeGDU}Y{;9+$(SSC$1$ugq&yJg{iLz+8#lB2>4&uB zeiW2x)b?dM#ytQIx)liX_bKiXDX%`$bfvrx_QU+mbiF6h~%j0O1ZFhIWYzQbEGlX%nuovck} zoonW4KjUe? zcI^GiO3Roq+&Ie)^xf{6$e&TGplLn!oSCDR>2`-${xxi)+p zVS~wrJ6K-N8JG9MKQ)p>#q?yEx{vL7#&TGuqo4uCnqXNUiD4V*=fr^%_$5(~{Bj#@ z*fWayh`jr-|4a}SXjiVHU74Y5$4n=}wW#iKq+^SBBkyZ%;pYq5i>vMv*aHIlL9&gy z#J1;nmUzkn6wL?tLa}Sf0QLYSLHK;but^ZvCoR!_b(`KNzg<{i}m|^ zXnV-_Q`mnG?dsdPVIBPb7Cg6-PL;z!(&ptq_8OFR>5nNdo;d@j3~S>_qoMihhUG9W zY*rQUp!_jgytt2RatqL2b00Ruzf@qEPu`97+~@~mz3u#PG!s8}2iDNKe%ef*zrkI0 z{F_FG`vw%B{;ZAm(Q@w)(G2+?OL>J}v8X`#G7MX6AwBwS(+qI(E1>nPiZX%|0dc=4$fYp@5qs2YvgY@=&WV85T)QZE9T_s_0a z^Yj?{mX}IBcw7PvF6AtrC#AH zE7lz4{w`URo$SgNMp#b2c6T;@@y<0PC{Kmw?p*Wq9Qp_sey$Bo{mR~tR& z^+vCYvcA&j^)OFT>*ulWpxo0$whyQ)`%zcos4Hx9??HV@v2HPm6KE{lQe7?h&`4 z&a=H(gnKdW$Y+atAuYgtG49p4zYF&&+*ja^eu}jc_j26djXU=WyAyZzDc*y75$?-z zM?b^*CET%2U+RpyXJKCnYu7u;tJMD2+y5pOVE^wro(to#%Y0wsv(aMVhCApll+%40 zW$>{(J@gesWMEMC6)I21Jf6=W`wFDDRXp;`Eb-mXC9NX*BYuR>+wmor_skm4?4jRN zSN-;l{87Jt%y{%y?kwGuZ;J8Ir=Wc3zob0KLib~`?~;?J*wgwh3@0z%nJ&tCER%jl z`YHa`$ya|?g8WSv)8{i9eWr!ecowTYDzJ+h_JNP$x&63&Zs%--=k;FN32j~l?K36q zm8IOW?`IGI7X>y>DfaV=4S`w5Iwd>!o-?8tXAjJf#vIbmc6$Oq4#`=43q88&Fg3+&_sen>w~H|Z5k zD>3X5EIXo z=VEpott@ z{(hPDBeV2{A?nGp!|<;y&l;ET4lo_fln#7V*7H5g^8v$)piei%cUkCG5MMw4_sk<% zKF~*d4tZ~r4rL2+1bGMS_ciDrg!4|Gv=RD{pJSPW46^_DwfE!Q=rKnO{<<4C&@aLJ zTby~${I(H?d>F6E79YA7?m4_i({Br%8{?s$KaMu??~$(q4FQcD z_aRL~K=U2&siNH(hj|g)-D6@Q_B#3!Wn{ZIfp+mL%RK`;|6SIwgM6)}jX@{#E@%V5 z=4~&Oztw05rqM>wW>q#QxnHJMR?si;>krzE54q3Ub?AIQ$TF(h>m>R=pOJfY9k-Kc z1PVvcuf*n9rH7&p_DZyq*aPurGt1Xx$opgg-jz{4S+)bd7*}PVlJA9Mq+uSRo>QI* z*2T%F>ije%KI0+cKRR#w8w8?}czz zAg?Q#$B3JI-#~uOl225|%Z;o37;>mGVx2)e6MXp0y-M4?UE2Z{WG}C`*aOKxKrwy} zehCoLU4b93X63FY*4zw}7vwVo%sbo^8N&+;Y$W>1h#lZ`ZpE-SD+%?(RSs2?N<6o&OUznT&pWh;Q90s zexsC^3SX7y{$QT_{ycZP|0y%_vf|f~7rr~s{qOVK*dwOWgP+<1Co-BB{*65M**y23 zAif2^y(;~`$_xL8TipiBgS>ow4Q`O6yYJ3(=jm&FHZMF+U*lKv!reUgmtlVoe!-qa zdHNdvDUbeKp8LP#xnG9<8TdKA{>JN=o9&`J_WJH9%e=gNeWQH5>+Xg;_v$?N$Mf9( zCeICht1Ohq0hQjr%M1Tno;$C6NAvWJeou&4261e~?;`ZE;a2r2dL39^zCLEIjw*Lh zzg2xR>rfYM$k*@lGx-f&UW)#Gx43g3ZFhC__TSm;@7>VX(Y5)m5XucY?#7-T;m##$ zBLTVYKiuddw`0p&Z9OAtJ0I-CCJUY1utx2;v1@l<-;SOA-CcrPlVVr9-1pH9Yw!P*+?b?OZbadWtC)6nU|WnXmC`PKLm9^X zcw4xkNwB31xA4HG9Q|r*4n(Fh8g=K6zF*tiy(jRJJI$#5Wk}T~_Ye7q+}#6IQdw>u zlP4>a@cpFFA7zS)>9(%-`q4VyZtIry*kc5HO0;bab_szomBPMF{rLHti}*I*w&U~N z*e$3_Zc?J_km-%6;?XZkSn0*r3iZH2*_ZgM-1-AVwz2yXp+U>O!*e@7TituAaUvvbEgZ*!uN zbIT9kfcicp`MZgz2-1Xpy?WCgAJSV@wO!qx+l|85y?M8=dBMN5(1&7==0Acp+kyY{ zntxV^UkLo?!u6REq;-$-kGzCuM1b+USf;RnCNNmjYoH$#%wsbkQx3OakG+7t4f{z3 zcw@M>#DL6q2mX*bhYx5N^4A75r!+npjnBA75501HX2ZBNWniml95?|FT+vz~S``1N z6VBm__G>hd%?@ZFPcH75#`CP^54#2H$)j1#|AvNdhCI1WyH4>pVZ%U9b9I=f=w*lg zJz<`jLz@5LkUu`PAurhazH$t3%E?@XZh> zK^M>`O${TxoPR=L_$3h`=bzGWt%mD0Y-zYj!^a>)$ojl zuPU6xILo^5d0nvy&k5B&a~*A4fMNgOxm*F82hYk1*fV&BRv_JA?RUj&NK@GtK5Hrw z_kD_IC2ffIKLs09(uN5iS2c&v)~eO&nc`sl#8%G{;tk=mo@<_~6wfM@ncz8Cbx^}d zE9Vb8=P+ar`rB1ELY}E)NRwKoVaO2Br=VBRXG_68K_4cyKkQ?0{d4f#OnG77thy=G zu^RfmU&&wH8a~sj+roZGHS#EUf2julKz{DS706IMs`;M|pT*VBhtJ>Yj7FpB&b6jF zKC@xEH6pZ04Qvw7)L0=OuIH5f9O%LIoI!u12D$`ta{sR!?hS2NvsdHkhPJ91(ELY$ z6A%Pf4Rj3NUuvLZP9Er(qq(5bOl!Ji5ntJPK^%1^z#GE6;F`uDFSvFwcpqGFD%{^{ zK_;}xg7HwV1y?nEGsLw?4O^k^wadcyyIR<7iIS&wokkCN0=sdYSWxzAQ3itkRjn76 zt6Inzl($;gCx35m>yqC4HtUjBwXAC9vZSADUDA7Osd|e{av3aq%ethUJN%VN@311t59-{p zZ5ubpR+o~wGv|Ky2Y225?hk$eJIPwDzhHgz6B{>w{6p<{gYNPvFvMxejf5>wJlMU{ zQV}sAD+di3Ne+O0sGUQ(pZ@4){ZAI0cfmQ+W5W*TIeec6n=rGOr{c&tpoT5JI|@8) zy7JuPtm!58MXiDXOYm%z)Ujf#P|d;kCcowJTchh?-m;DRDCSyj@gnZy8Lo?ojhkNl zVu|1!*9GAF?un$Do4x1^`5usG znIGb}Kb)x}*C!lBI-Dcmp0JZoG0i73CBL`DPBQ)y%+Y@p@?SNx8%{Uz95k`;Pyx>2 zLAqBU(_E96@JxFlz9)Vu+vLTe|GKdP8}mBsTF4o{j(9_{Owtze8)hwK9gJlvCO}J_ zrcBQqNoO!W)lQ^r@k{t_8^2^`9rt*a^XWf+GMy>D2;Htkovw4Hvl{d3xW;I$d%|6K z8nRHv8qDiB788r`%{lrmq{Fm0-y3`qnKZtQnwWF4#N}F?^5JUe3Er?zGv?E?@`_iR zvbE3)GRV0Hb+4P3&1t0RnW7fw`E|`2NcYRqra1QwX~Iswx5btA!FSrfX1-IGW3bO5 zLoB=kn_Pr`kS9WWWnlxRamEz1(+94@c33l(gbb@;vjpbQ$0vToF9O1!%xy5<>pWE9e0BA(=Olc%0Nb!XD5E=+gse!9g2Q9 zm#vzDqwHEi?<=6`Qx8N+vY&dsUy(?W;QbSX;( z_&d;*b0Mo37R<57+~@mA^A6vXK^>gGXSG)gksQZ5IF?BdbJr)Zh7ISYC2Y`4V-7Xv zBgAYGquvYyU1Yq;GAEj>TjseV_?CHTNDakYd6pW#%X8g}J8GBM7@vNsTU2<17TXI8WvK#jiro|PEV6>hSc5rgx}1kT zd#nld?{P1Z#=HmmaejiLH#6z%4D#(`hv1L%rcIph$FlSQ-Ox9FiFGBKm33v+TJa(J zBW>mx&rSRVx+lO7bLKhc_uiRwN7w7*Ro)D@dp7 z$uy?SjvnfV^=f~^G@#3ODL>2Wa8;J&?+E6qlw&T-QPML{!K?NV%HYxO`7(0t4eTuE zSz#W^DDA!obUqJ9@v#1yb^@P)DuhKDUg@ANII^w`Ce!~O;Rl%ikG?3^%y1y;mJ8)W zhI_CJ+VO>$Gr_Z47qM(`e%m=w=uU4ac7L|4Ca%uJt(8!xRK4Csn0F|ef+d7<1Lcsb${8d1-}gCfvqDG zC@Z8#`FPHK)`J|j*cWw*kKh?JQj#s4ZgS#hqITkyJ2T>REE|EH%~zJ#VzjEGV#36{ z#P>V#@jG3djb^pDCqyM=A3TFOjpq_p^c>>sL!5Ewfpwt%x>n3_JcDyfK_5q*>AJ+{ z(G%GSWZFd?l`Vz_Vwu{jOR$z@32c1ap?ux1Vm%A$H|nb>MO~~ojrB$oIJb66&HtLl z8GOtSi1*1x@R~%}_!19ikb6n@*(~c~E9@MoLdtCer&c(t|D8UM1Py z&Kj;z=R8W;n{4q6+puZSAH|x3ODkP5Ugi{zuk<3d2k!4w^!F(cP1~jxQZ8cze z1<=Dp-h5>Y&ygF@;kg1g4xD_w$>F)-)n_mt=Q*^KSC=;Q;n(x((uV$5mNxX-(Bsjo zg5{%U*nHuqDC0Qe*FrgN5En5=9c@R!(H~^61_N~!XN59d)R!+%PU?ZS9Oq{`ChPpZ zsHmNaX3eALGMFoukvc)VUfI5b=Coli0FUp?K~|)LHG{G)^?=8Jz}&+*%0gQ3-^{#1 z+f_|JJd;!7F^BWtf17KL==WX`%^a%n3I{N^9eH9HwkSZ}a{ge9_3m3+{Cdc;0lx_5 z)jvktAnZ|=fl0FgbKpF#li9(t#Is(X`hbJ@*(m&em3}z;mGK_JTsEHF+D*SS+GdvF zDg4kMh-1AJ!#;V&aBFb?7|J%!ORj><)$G$eGCyAk8%9o{O)(#sXC3%Vi!ICs=m7fF ztXsY{m`ZGK_bY z*~;~A{F96J0b%m&*$Ls~&PnCjpDpX(_%YiP{h1j&ztHaVxW~jI^pDCsv`ujL!(ErQ zMd4($qZen`n(pI{fjT5VgwoGF<}NgB!L#X&DCCejqHTnZN1@{*HvC4CO&^6km}9$U z{(W%MkGi1EOroq}Zl-mV@j&lpP>_aevgkX>x_SrVer68ORFuKeDdZiV(`XO#9~V3myBz-YcxKlawnz~3g;3hJN|qtcxy3rKrl)N9 zOPP9%3q0R&h`b(m6DZ$*&p70fwvC}Fyfe(2S@1-gWgA~)9Qt|2WvpXlUnh$*FfG&d zV0+u>WjOk$tKH+)YjF3_?VpwGRHreocE-5u!e%C)HEFDkr2C4Q9pTzNVm?RUUx>bX z^DOcX>DH{WjSY8$5B*q{;9d)Rn^$DGU4e9p@Juw_QK#mJae0$rM_w5)E<5;fZD=*Z z&;~>)`c)07#u|F?8!k$%;hjBrnhBJh16lfLYrkKN^tT6_lF3tRTsf_WnQ5K;6Y zzJX^v-ZirA(+1+i$ zUch53;&1el7R=mNaHk74zK1q` zv(62lhR)xEP0mB_Wv@eC*i4+QaiDAD%8jOMGuuAjPJyi(o<^K+A;ZQt+w&KA1_ z@4Y=JBO8%!P)4dzMvP0cjJQD=IVAJvafkN)gE7dh+K^P*7GFerZlbMlkf*GttB~I* zlz+Srd90^*(hYf94i)d12aY06J?j?o%VM8OmMd9DBLAnVBW0{3&;`#b%dC9hjX$K# z(67D0a$GWjR7x9@{|X-*8xm{vP~(9Wp%Np2!Nr7LCla8#oJF^|LL~qupyk8;|zDPN4jk z0LKTb8p_?{c2N`R7Tw3H8Z5XgFk=PpLzY25MPEjqo*$lU!8%&HkNEM+5uYCdxt{{c z3Hxi2W}Ln4NjXtoSk_Q3DCY*q`Kufgkzv(V5XL^vM-lcZ_c+=@TdZyX%@sUnS*PG` zp&NbD#0=hAkw2t)5B)9~KWd|G)3&&S_2wM%+&$p9a4)(SZj{rmf%qej&~D^~vQ<2u z&WM@xW!FYH^VV+@-}or=AF@ZN1M;y4^?~aYgEEV?;}+L-R~2KiZmgHUbIXY?TmQy?rhAsptrM`{`Zs=`Zqz6F+)A&1<2!Uu^SO1L&yP30 zO*iV#OcX8u6~h~K5890PAL;LxF@bdfR)jW!TwN%85$a0!80thoLpNpS9rWeA`}O6G z&qaW-HV=Jk%N%ZUi_ixwd8*qkX4_z(%^bt|)qFpKookO7P6U05#8`~|)2tYdI+4k^ zT{^iUQ#6IX)s?i&e{&@I$UNejIIG@--CiSq{@i1B<@?va!Lhlf8K8$-dw~lU>X4pR>`7zgA@}Hdu$uGiY1Te$1lXSnVG4l1RT0cH@|2d)C02_oMRJ z2|GY0Am+Js|6Tu1qmszKFiv+-c+$%MZ%VC+C88s>TWG z*H=LIIne#3Eh1c}R>l4T^!^C*2=;nXw^x;KucGw&pY5mroBJ7JwO?m`wwK{-N2Oe; zoLp!Zf7XrkzKinYxX1C#UH`Lfs8d{XROg<^iV^e~kbcD&WS+t_r8BYl`LUQ48R0V( z;Zw`O)39Wjy96HlqVw~hFF2P5KM!rf`uRD=%OZ?=qiiMLZ)5xiHoOY|QNt}6!aB06 zE1%g!8PTsoU2!Y0Zs#AF2JBR**;}nK`q@&}{YPJvef46fb<4%~pGox3VIQnvv>MRw zZy7g^@4=XO(KB6+Tsw$%={EG?`A(2g8 z&RQTdo^yEr!M<9-m>hVnoQP(ZO(6}&;n);-q{w49`ruiPo24<%c^BlO-rz;MC9>(` ztNn6l1@gC{F8){O@XR!LP2zlXxc~b^)UuQ<ryz4UT!#WhwlUS&UJ!T|hahMc%d}PsT^S3fa+DaF3%*V6Eu6DEe0(`kHG+8tZ7W z9!<6*w=+%3ihdvVnaIYcik}&nEq>-J&n!pT`5xNwl;E?anmQx@*j`j4KYIAw#&fN9 z0{P(g$&mk|V*t8eVfxUggmuhDJdR<&f0}Z_ALDrq2bFCqn7_1rHO9)I%Mj}}#?R4D zwD3*A?^CiL$F>9c7>u8DJQ96WIewnh#~YB`Ef@I5Sw{Ij%=LWS=jd3p18qCjJELvK zUU8Z6sB@M44LkDL6|e*3L0jd#mbN3GggrOFet2GE9WutTsEdshP+n&l$Fw6Gq33He z&<*;nb4NXtnaJwNCD!Uo_>wt4htu8tvDlIDb7Zwi(T>TyYc-9Z%Tp`ww7_P)v!||-lKeRU`&o0kmOk9X(S}{gADoVlMK;0BiFZYtqe!!|l zno;Ea++FZv{!f?~OB2rQP;~yM?lHR<4~YN9zB+X|As(S$75pwzC%p5{;#pTg*=Hd0 zK;>nd@lO@l@e$K10BsFuFJO!{$$H2*z=>(p$H}M=Y+qm(!Fq4l;*9%jmUsD05O#On zJW~SNMf|XwX>#J3CDw)+g!}m*{+4C-WP!zZHf!1X`6rmS5SwK= zHJoHyYW*h0DVJjm{)2o^vJvK&b-Bh|zSDpP?^(2$dY`S%s(2RmC`&Ix+5S7k#o9*j ztPXfu470*blRUcn28=;dr+3-5`k5fbT46e)IY(#7R*W)QSDFY_7++AM6$Q z@h)w8%(9U`8!&c_Z;>|oosRj9RaX3jVb{2$nabt1_%Lmw;<*b&G&59X6%H2*_NffR z7WW)6y+{yVh453APT`?qQG>i=_#IeV**6Wo$fLw?qo|x}Lixb6lI4MG=l!~YaT33c zmSeZ9`;V=%Zg)LVbA;{jfL#t=cn=j-9_%<+U{_uP&!x!oQNylspLMxc)ShP^S~`zs zQw`-o*{_uOzJC5X>1i{@MZ3$jxHX`w2qJ_R<}Y4>e9*nTZvFfp(MHtYw|_3* zJbX8O6|`T1omW8yAc+D?DST5&jL@lw~e2Zy!bc^9bLK_|m16H>_Dfg~CH|L(n zONIYdp8G%MxxbU=KA-2F$aDVo~o7U_;pU3aNEI75-RWc%J^o)3=1@CiHae z;7Q{thIV4%D}^d)F@CgD017-tM1D-nVl{CjvHy=VJ57Y#uhh zvsDKbeld)K1rp z3lXti(?9lI9eJL!wmOAASp6tj_>q6DzgwBwXL-x1+P5xll(9OoinNo9Te;wsf@z1^ zYlpf^k+=8l+`7Ggi@*LdT!9-df%Hwbbyr_UKaPp_kAu&hb^fMRi@s=B)hZXIG6k-$ z+^H5o`n*tnu*&eE;7Iz-yZX9)F+2Nl5IZwh7CD^#erqYYMQs${$jWf-AL}#smFE>1 z3D<5#PQyQ;{LzM075dodMSTkJ{&1eOaWdp%jD>M|ZtCKIel|=u3f{HKKk8tZA;1^H z^>Wc0Ay4y^$n9s(b#5yaeF2()8SwzzsthI%F9VO*~J3iu}=Pf!LDtr`vZ2Wgca4)eWq63-WvZt2S~y~1UQke=uM z1?%^CzF#nJxNHO3^MJl9l%dSi;?fS_#j8xyy$rfH1aXl^!CKt%O<~+}&7S3uIpD*! zJ%KJ<&y(}N7UCprqHLRN*8E#S`y^Wx%`)f>y(Ayvbt1QRF}YFEfCoCZx$}*afxh(L zBSewXrGjaxbSrukPw39I4LN^J&dPY`U#aO{*{k{Q)i7<6pfypJPip>Sn*U3hzm{(0 zZ0KKw_<=lCNex5(;2h>ErmNDb($cLu75b-OpCBJout{9mA=Mw2nH2a0Wrk}Tg0fVN zbc1}a-W1kTo(CSZd)3)cw(6^4x;2zp$yQ^Bd}@#vfnGIkNVA|NYy%gJgft7rG@49U zHfq~Ln%cgQX5qRpuj`y}9c-N!wo!|aR-v-PqO&2NMK5WXx~Ote4_oE%VGV<4h2q1r zQ*tyHG(4x_o50E@x4}L^J8+v7=Fx4CEl0CK!@U|t9_45tPmPk{Hpq~}&?{JPaN7*% zl`gkIub_=x9M>>x9-N1~I1{dgUaZAkd@W4(b~EI8JNQWcYY`9n1+v`^9VMoJDtunt z-lWA{snNG-{_8aVt}wrD->>;IFOVLu+fRk|ygj4&zZCjgT0UBPb2R^R*FyY)6yN^~ z-v3JAB<4FDuRZv|2DuCNmKPfd(#3qI$l_Uqe9T>zLJM&xFU79`{ETt93-DuH6F=mY z;QJHbF%%uXU<%{+;0~@pzIVZcaTMK>n`l?)=8y4tXTG2;OZjl)#ZihkuU$~*syw)( zzbChV;jZ`Iwfe4m?!NbZ?|tj_3-5d1z4uu1`gzV(VV#0ll!oub|8naWq|BX?tq@z^ zW&r}ne=+vZg0URzmnaq*w&0%B^%H8Wan5i!r>adGcbDTP7|WDnkr)qe&Eh)-$9SiW ztob_TR^$6xs}~jJM}L4Z*XV;SXE8R$Z*ZpCQ~$a@p36NP>jz_3T5QO8W671%NYlhi zG{&0kIOJG_I5r01jNZ_F{1-=YVqFjkYY1k*#m#=ix|)7l54S6T+5KN=zpdHUlf^H*=I zXq>zoe(G$4Z_Dr+hvVvVjQ8k^Z#`Fx-xmT~d5{lw=H7pGv%+b{m=wQH+q5mtGq~pO z`|St=XCI8gW*CESpENpL_n0Trw)hw;)SS_|I+KRq370miz}!Nc704gQl4C*#G5)m! zV>z6+x5`G?7{-cV8``^$ZZ)3zK~|VShBnr_NFcI z?bzod6d!y}orNFhelmAw<0QU`hymDms45%qSV(&_p0BS%U8wJq(3f*Gz7L(Tr#8lP zkuLlXF&tr>-}wg!E6)E`!Tdq_$9MV0jqWjN`$l|M!MCTZh~axjCf&FZVK&O-BG{&s z4G6~YT9F3!1MF<&9J%qOHtkzHjCr#xYg0=s8+N#eZxC%#mZX&P%aCUdvT)DBVjFyD zf5fYWEt7OJUozl@xPQbkKa{;z)T&Mp;kd~a%FeZ)8N_ylCcnCNSeqloD-jq!DY^rPgD5x-d- zJ&!u?&&T*X#>E*tZ5Z$5x4c)F9_mcXy=)5(*!8FnrSOw$5`yoauj8BLu$ewP7jsfa zf8a_xQV!(vpN%&)uD;H1nla8Rn7=*|%UX~niu~ZWw0_zc{M%g5iJ~l4K8Lw)h#MbX zVn<-Z2z90X@XfB}XhyT&1M{=wgLbNIpJB%tAN#Vter}1?hBm0lJ>jtaG_dSU;t9ig z3-@hwPbE11oTVG-|!ZO_B(p^pWIOi(+^{;|%@WWhjl*je+Q~0LR20O|zU)q%R z#ZYc9BK?sP2lJ}LqE$E(2+_^yGw{H|GyxUIBrHr?2Io#hba{75WoQZ}Uf zZ!e+Dvuq5a{ihyjTbOsjjj+FCy0RYBpv>W%9q3R7{R@HsIGD4U|r*t`JW8cS@lS7L{CqC zPanWDasB*NrUTv;OaspntnX>y^8)h((zNwofln0ozx>t~$He_F;4Z-Zhq!Z()<4HR zkdN)<3$R5zzfA<|+y#4lc(pu}#=7$z_Lk>f@!Sg@b5O0japxQ??itU$;<<-B_ln0{ zL(bW>xVJp^ino^G&b{LA#Bal+-^ynKUe{@ylMDFg&dD zbK+m?a`27VV%b}cZ;-WkK65=6*XKl!R6b+7Pss1=1;>P4&bc7RaDKwYboOf2^kx>I z*t3ovF}pCIS>{y{>StmI_4Ig`U2Y?6IGNruZ8l&&kgP8;)J2>JgovYdQQ8*P#VGrM zR&fwd#pzS^tBCs>V|`|OHl4k8C7qo`AMx54ss0(BUzn#4`=Om(i#d1Z5c;o74>oUO9iffUuD)wTe)p5@ zNsVEP#e8=2c_*K-qk?^YbBsxmU5`}5Usy| zQ9nHI(Z9FQF3a^C%cv)wr>#h5E#@jg*UUm2^_)E5Frpy$q!0BH<0~m^r5L6@~ie7p8v?l*5Rmy5&_+o;tVn920L*7bj)Y) z*lt=ZM|fw6qu<#&iFXH_?Q;!wF=q|0^-yD`_DIaG#r(yeO(XtOcU#G+JMCKReSPh* zRbKquifrU!`3pa}xFTzy{~O1dV%N~;>KZb#(MizH#vIwV=QDtPd(JyV|AlLGTgT9U z$S;c^d(#!vf35D{oIu@&ZOd5ypH%f9^BW(4F0gY$3dP*TJQgt`>|!t4^lA5r49+RD zK8-q^bf37&wu1e)nL~yPf9KOnkt*`duluR2tn)Vf@SPlML>jQJLe_n@-NjnnUwlj5 zM?A(sdx5$S+oB%uY$u$3(tf4svY2Vg-b7hgOc`PS3evL9j}FQ@e}i;)zz=Dl&ht6n z(5Thgt?E3I$z8Os4HwG<$`IRG^xM#` zU~Urq7{>g=^EiIUwuCBsrSOs$kw(}rw+A(yn{G}c%RL4Vlei{4jZzqNw>gveF2 zyEbUAL_2U6Qo|<=0?=b)tzoQr1I#zx>aT@P&q*5Xr+>4FB%=@VDck9MCG ziG7d>ZAtWN524;2uuG9n`~>FPU@l1fmBy@ju}O$*W0rFt#g)d4%p>v{7?ORo0<1Z2 zx8bHAaVBlu)XU{N=y&a%^>b#SpYy+EG5Xr%>)+&U0_ebN@!3d%qBI3+ZuRZKi)HFMJH+ z%^t$J?>NI>%nP4}d|CJf^8dXb9@*g2N8%VN%fK)A=8sqMa+0i8;j1uq?t#CW6A}4E z2J-UtiM0F4MlUG(t$t`O9OIm^EaG$DXvi0NJTE*?pU8>4@bBcgzn|y+(>(WO$Zx~X z*B5gF)F7Gq6#X{e>iMzO-=MfVoFU+Uaen8|^V+V)?eA^ASAO;F+x;LmCJwe5M#7sv z-@S9|mS4k%=Z>A*Hp@MlC2=RVRNlH}YbRy__`XueH-B=M-s;P-{v92Y3Etu>v|@t5 zTQ%CTyT5OD|7Ir2Xj|3%1wT1|;=(`c3q5VN4KpD+9_kh!{>(=X!jxWfs z<&wFdmee;C%K!SVZzGH_Iio<6Oa=Gu=zLgy)!*>3`~Q#4a+mF3ibO{*0^j-Dxq|Ewb>;&M49iY#v3r)k?1@(hc-AK_7fS<=(Y{ zj;(C|wd9@p@s!u!Emo=Q#@Qj9$M^XmTUsHG!@T}%Pr{Nn4 z_k!l8!fnWN6sbU$B2(eL@Q-Uaq2Z*4Qwl?dqFT+rUc;7#n>4&k!z(r1tl<_7uhwv@ zhHVW)AE^uFU#sDD8s4DcjT&xOxF2yhY5tCep=XYNkA`8>oPVE&!7Jy#N5haW=kIEG zzlIMe44sM&YIs1yLkc5a(MX7kMOX)mQ(?U;t{1sI&5L1^piL--O@h77i=l7MAAA?9 zwxSsPgL+-;X*8$8x?ckR!T05o3}jMqIZr0=Pt1tiKI~;?$g?aN@+_+j?JOBLACp73d;Ag@14{Ene@!kMR`0YLwZ+P0Ek` zc7`SJYr!vw16V(Yzcu&;mkdL<7V{%>pR29h_iB8V_V?BE|Lq9)!!usGZSc+CgZB`8AK78FcWTRgl ze8KPGJc?q+mSsH*#3>`p1nw5NxvzIO&UB$CfjWOgrElHUysE`oE^mQw+MVyq7{`lG z;G6h3_k4TYir}66b7x{%xyQ~xEQ9Z?B2l|m^zl7@Jmw@0HHx~4n3KfVTj>!4Yg(6J zOwO?DE-i5qlS`Z=#-$Q-9M8d;5BJN*1o*|~O5~cj1Mab`NZaB*q}e`!^*(orxUeD5 zxM5?T5K)`Pc)+EY!}GpPj{lxXi@JTWdG61%;T+PTJQ!yYXBso{!9|()zQvjNA&j4n zVUZKYKT3xeWon;ZmE}5;#Gs9JB*&dMzVeWT^}cSr&K3)XiyiKD#649K!&v8gW{F!o zve+%2EzXETi!;T;STB603g_Nq4Ho=s#}>Pb9=k`bONkr;zcc(s1zuxinFQ8(zBahr zt|iYyF)uO~!?;decK(d(JaUd)zm%fE9&f#ez>Y-4mG-oNM@7%(q8heB1rNlCQwlT<-?@x?)>&jW!|A@%-AI`z4vWlhH@SSMTxUIN6iS9e#@x`wW-s zWa~ySCE`)nZv-OX#h0~zSVv2%-s2hu4YDJG!oGB2T6!Q5<Hr-vVq$STfD5d7d@Iciy{ctL?3{J7IDUG=-emVOk!5hjw_Tl{P*&*lJ`aVx7%&fn%TQH;P>n ze2T-1Ja2bj*tKm@*ma=AZy6vTm49$KN^@Ho8>-*+&1hOQ>@V z=ZYQ@;r$Ci}V?O{I$>voMVFDb2O{nUA7Nom80C8f(Nb4nkXSn{;j>ANe& zmpt9#lh;H;X`TLsb2!pda(#E9+#Tzkm++5-BVOM1oxkGWcYSl3;(B?zc?Ua!)LxdJ z#)A!|OSOKuYQ1sGy=C?gxMzS<)CU^&+3)xAzT2rV?Q}Yq_wjiZvwL1(jxKpxdp0_b zEP1-`5Bt5&z1TBfUh;I|m4>GaPhfYFJsO!)II-mEMUxGsP0-JsYIxe)kAD!E^n~j* zKgs!>r3Qb&(T1m6KDW5sxvdWy1L+^Do0-|=mgm2+4l2Ikt}Oh(mXpJ_-r{#b&!W5D`Q0z}aAs74a0=j)ut1-xe`r}H zcY?5io^TOx9eaN*bif^%K%Mx$^m7gSj{Q-83Hz|>==hW1Pds;RdS z?#!#>gx|Z`D}H*lR~W4;JKPg~`l0@P9sB$D&70`oH$QyD6P+%AZXK$->gDv(^3jGqcL*P8V#>^XCj66BJ+_uA=;amr^pliMP z&lG1&lfyn$17;B{eNA1>&gq2@8q0!4wHA+ z?yk~@Df5R%R=jgq@k0&I+?|vW=Qoe=PU`bqCVUS3x?VUad~3tg{YNCL9;UDO#-5{b zjId*8n@CmxhaCS7eZ>*H(&7J>`VM{58=+k2bY&bjSMrGbg9O&%a>>lgf<>lJ!{>A9 zi{h15zDNDdfhA_a6#ap?k54w0ombSq>i2zD{p`SL6-RvsS-RmUQ_;bOXXYJP@pNvw zxsv-py~GRt8|YITrdK@m4+okndE)EX-&4D;&GJoOLizXw)4(=xr{nbxTl&zyE}#WQn&X#}RZvf`QIp%u@} zJ-p(XwwG2s)2@0QS@BE*@Br`^k8MM>fu1jXx4og08c5KPr_g(tX?7m+1 zXZ3Z(LyLO#ck!R4BXaKueeZr`-+jotU3KM-2a$P|{+Z%*|4jR2{|w*xzV?-a{WEjp z_AvJ^FX_xB&YzC;ki2PuR-3}nN{DRGz68m>KrrGpwVTS4{1tzR?-)D!cE^18t=5R| zwx1DPD84&z-aCgCul9WKE1~T#;Bc>Gw{$)`-p4v0=eB;7I=!UwpxYwgew*R2N@jZp`?8ii-G?1|CF5c70OO);prn7tG-J2xn_i8}bRo_S>DkHI zJ7@Ni*5_6Kjq|-o`CdTS+jz(32j)rkG#w*f@)Ryh84H(Y(yUS%O)9nba!_y+c&ef!C$xs+5g4GX3>*pnneR=`HS}Umb<< zXS_GakInbb7`QN8c&yid)A&@;4!8rKxX#c7(W;V$!~S>1J28t!^6nKUhm8*lPjw3lmqS)gj4^c(>1 zY94L1I;gG>P|rAzoa(Rq<8o_tXsgv>oVupcG-T4$>cAW?$%{0FRGQ{Y8e0cT`?jcl zDxWkhsWfvkX^OS_c*RsX#Z;R1geKc)_Xn0$+-+{f8Ry*FVb?H^sx*v4JB{_@ZKk#A zCa#)Cvsa}FU-$zk=jaewp~C z)%a7V_p0%yPTyILKXv+IHJ^V+8v{e3F-%2=kSWPkaI{f}q-Pi6eiW&D4U@qaDje<|ZX z4q6q~zxyKm9QHS~dccgv{@&T}4)lng2tUWq_}`!L|GSL;*E9Z)XZ!;h|GgRiLmB_) zBeFZmeuFP(;-Am>|5wKU&B*T@v-PbmLTFOJ9zV^nOe!~!;@@EAILN^+x zZxXIv*UYE;=^LMw;i}aU_#1Cq5L&0WqdCI%$KA$Ad}8uWe_XkL=^gce44QmS=ub?7jl{>*BQFlfOQ8 zD|~Y;|NLOh4wWC}^E~JvS(pd61u;$Z?Z3WxwBcifps_x7{2k+l$&}b_OixXYiVUSOv-I4*I=5-KY?%V ztkJ5uzXspDB@PdaX(rF49h+~9-3kwDbZe$A$=$up&}30et7h6uG(61*elOuI#y-tY zMKrYG$5J>PhpurQWtVJ>^JyWS^3gb@Z}}VJd|Eo9d~EnqRt=N1(5fj(OW8JUNZNIT zCu!HmX%!9)6Z>Ebb*#b@SIy_H6#U((e0Ec}q+Hc2!Lyvg|JgXLM_JFM@PDCJ_m)cR zCU4nc6PmXiiQNi6TBCU@;R*k@Lc^H<|8>|UpER|n5IZ$3lde)9`8CeU=2(5a*rh3? z^bWl|ZP3u3yHkfpdF6TGk*r;E9_{W{bs^#t_c?KzIKR_Ln|nSE%fR{N0l$Jr&T*MPk#yJUg-fs!yWd`H^|KFe>uj(hC4T>U|_{7u{gmVn%J z&GlC=KlxIyoa*~idsMjeec3He^@Jn6#`O*Jc*ELuuY;R)%3hcMhOo3T*XEnk1`!1| zpK@Ru>&>`NHODZ~Q*G~9cNQP$*+N9jFHr#HsHkpUk2fGv{_2BA@T-ylF(}W^M1K*( z;=VNF|Fw+&V;TQF8UOZ-|KW^(JmdeXjQ>E!|H^E?Q>90Qzk>=HJ+WWQRQ8GeTCPd^ z*Jk{eW&AxQFiQkp+|F?|)%NhUw$oMmJ2kk+Oo~V9qEUS|C zbLY*9zc~>G8+9Ji$7A1(o9vlU%U4R5BP`lQy5+hXH$~dEJ!;8Ze(483e*RUftS})a z0_EPlt2TaU^L5wUWcR6Z0M@2!(ABSDqbp}&ZKS8Zf}=m)Rf_>rsZc}$Ti zu3(+c6y;`*#=@D(X5)=F+{`}URAw=PQK?FJ)r}vqf3>nde&dH`BS4zX*IZ-4;xowN zQ?a6Quim)vn$263$p!J5VRlPzRAULxsJ`s*m{o;@BG=r2=FS#|xE7#%!!;Y@?9w}O zqr##s%(KXE8zU0a3C(Y~=9UPbO&^+dM3%)dMKa|dk%Ag&5AjV=o7s)IQGv9`)gQZl z%T-%G^c&Z(;W%!{^Jh1t-G*!%vYLA6GiF*xWZQ`aMpP9IQbic&C4qYg5 zuSXOnZsb~D;@*I+lDIEt$WGi>peH8oD-oY^gS!cg=}E#jp`#}5>*#ff`+9Wg#Jw5a zEOC=u`j~y7r}TFFfLn4ut7L9N5)MAS2|W1pCgB0|f+QRqq)XW6`kJn5C^yz`f4Vvt z>oL_Qk=Lwo*x@i4vqJn^s!);6ByUy+Q&^~<`0?WZj1K063~#inkq#!AnCC6>cJrz& z;&O8nIG5v3o&>*)4yG&|<)?g@Jjc&PyvbwZ z?71h%s+({6_)W=9vZ}uJ)>H2zyKv3nR8DT(0@RSU!H$WmS=x1Gh0FGVjf(HiO=}PPsQ8X>brLQ& zafKc2ADkPGnmO1(ewlCLio4oBsB^R1=W~V$|E;cX>IT|_9B!x0H}4d4@_icj@&tys z`pROjPvw9=XXE?Y&*gyUTJTBsaBb`@*4!*G+)t=i=n7-*PlHXc| zD^I?oJWNNnca-dC`(TlC3sxU+EB~DSd(u z_QgLXUt4$K09_Xe|54Z8b#WH(mY%dr`}vfobbJe~bF4en9<*C>{`Jk&Z$|iGcbq2Q z?yDzOB{@4uMYSHYA z4f`sCZ6if{H{^(4aDC?-oy9(mDAC-Y!*|Y<-4VCTJu!_(Nyqn?!*h)(AJ!dV_k@L2 zzBA_?z$i}i+ucSRKOA=S_~u4vg*`uTT;E)?tM2yK!qJL@J@4${y4z>sG7NFQqIy$? z;64z$UEG((?i}v-h@aJ-J>0{1u7N)nW4np%Y@$Wn)@Pth7br6~(*9zRbPEsB7L)9O zgl-$kJ*DHkCl0U=vyuzc{+@6NcY5v`-!z<0zQC>X`B$FYA7ky8woT@%KY1UgOwAB`vQaJaKy|(uDp9R=efJ`0sAPCAN{_e|8T}isryiW zB{w~1A7{LqrjdN5?x9}~yy^Z*9-O(OIHED_?``G&+@X9pf6y&?z%8ZyimETN%9Q&n zXIow!H62~PX&TN~79VX1i`(-d_lTB^3s08vlt=tB_Ae-I;#~HvzCGgSDVTc@+~6f= zKe&~b*}k=Qx~`Nj^_Z5e`HOxu*R=*6jJTv7$jmIqEx_{;li;@->oDPLC|sIz+n`cr3n zjtqVOx@~nOcew7N*K|(LOVK$!+tgk*pIRSLK5NM5Pt;d!T$P8tDdNs2?y1>jcmEdQ z=Mw&zUZv>>INvF-e9c~hd)eRcw~`s+AD{U0E&Ha$$L@M_Sp6vp2WQ&Z<8EAY@N>xh znCIwY9$W)&a(4a1rJr*!sgpiEw@2< zvDajq=yE=3Gi~qy>HdavzeoLaPvM`dZWApf;p5l;Hh}_J=kcY$-KPbK^Sl zFwY*zh7$YS6c+BR(dY5HQe=bV1!x=%_YV7~@_Jd7oqd#>{w2 zsY!BVx?$f7EYkyezK+m>|sCKWeoVF-v%8T2zQVvr0eC(n%91Hd@*r^0o!;E zLT?EgE3oar*7M&XSa|0Z;9dD?i$;Z=XK33``tzaDFNj7l+)>~(Ub1(r*HPK+5nLl@ zOnqN4x>SX9O{BX>>45#7!e{ew_cCz19r|7g4P9s`n%*d0f)?B_Yjvsm0q7Oe)a~)j z1!ZUl-MEMLwWZ1%noL)q9W;GmKmP;laTi_P_2vxWhTEkr?EaD7h(>e8E8$4MKAGN} z#@qwY=W)he@M$~Bc&9kh6qZnrvm;uGu65K&ci$Z+o#@oQim-F2J7IrMm?Jmg9l+-2 z!Tp4PlWZD<4pN6$&nUnGr+jjR{wr9oyaF^| zZ@qFUbLBGe0nMT6R3AJ9L74a{M*r{4_j7d;`KT6nN0kn8UI+u|HX{| zFEjol8UHJ@{f_30_KEPfA~EgnkE88m6)ohg8UMR7{`Y76H)i}F&-nji#{XY3{`)fi z3_YB$Wa1|>{%>Ub-<|Du=`ng-ug$ivJ2&zp2cmF^Y5T-}iQcsTJsJP|GXASG{w*2* z?_~V-D)z zf5-*1;8PRycmeX}Yi?qS97``0EN}*bEibx|f$UO?!s+E;7G;0T+H$l^%T|(fRc+q2b>FKj zs<&`Az*V*TB0$QnNT>E~*lI;Jvh|sbS7xzV8!vuibL!9uGOVrF+BIvIuGJ7Mo6JIP zcD8T4oPF}y6v@dC)ivbIITfH$tNE-IZ(aHjU951;O*h?`wC!x%-hc7?*6D1BXnA_} zint}u?9(ewS|mTk#S$kklFz=N0)(SgbMjAUc>Ra2xnT?UfpF$TwBlW@?dz_XCv?$? z7)Gn%rh4H-D&yIU;Fi(tVtSJL4OZ5pTwZS}-LQtdA{o=@m-fncb=TdfoyfGIvkcS?xcD6a|nx-!aU&&%;;)edoo*b<;SKZK|K7o0jCF4e$qjAXJ zi^FxU$g0Fmp2@fB4)lC$5)PipdcHGJJ7?ZGY|Qc)#@!I-Ut}BshomeQn5z32t7$QO zZfz|*w+?$p5`G2YEfJo%>uP1?XuD+JOAgv5=XK;JQ}9O^zmj}T)b>#23$^R&wiC5IRQ1q#X^c<(t2LY(7S(WT@Z&sJ(nr_F`N(}~ZGVft z6Hm%*2x9jdV6Kbd<-R@zuX@FJHY9YToCfG-@s#_X6#QpX@TJ%dE)Bb5c)1@>!9Nwl zY#_XxO8Z<4ZwRl%Zoxo@WUo%ci5h$XxTJjxi{fzVUbr&lzN-e`7}VgUSKB&XLEldB zl=}$jpy(AnQ=EmX8#GM_7Yj4=uNjU%2eO$$VWwx#7ZIz=R5m^t@ zOXKh|MyQ;jVa#_Mm`a*|zZ&8h8L zn6)@1LC>49Yn^$yMF~m5v-F>PA5skEn ztXE;XO6*p$VJTh>nfznRm>3c({A(4 zWwHeTQ;%&SWxoom_N#8n2uFbB&Q)v@dEaQQs%pPl!MCpkg@M1dU-kIrT=HLpZDFlw zm8^XxX^8JtywWHR8XX?)=qXOKHZ}5{RB{TPtSD7>KKSfx_xfjj+aM!%6D!wV=IVGlDut!MuE#fAWfBi*26s&MiJo(N)#P?sy<6Dt^;+xy@ zL7i|G?v!uW{$1aBi_U!~-4%p+Q~4M3BYFDlCn_E^WKX1-D|qrTd^aUq{jUuxhj{2>3L2|pFM$fX?l=&W{c0vP32;w>*nu0p?ZPw55TGVimz&+$IbJHb22 zJADk8fyEp|2W^DYpb07wjm)HMXYkn-qW9;(WBU@nD43yKP}$D+{K9!h?)KLxbKb%J zl5_t%DyqwzZS5C@Q~jYi&{tU}_;O!my$ zn*Cm-5kAP8KNQbFyGH0HIp#q--G@A{n{fE}3c{DG{?NEz>4r>DhCb)YE&N1}Z5^I< zD-8VRiM~C)`RLjB?}Ns)dpOx&>KC8v7hOL=`(x`Esq>5Ujl&aeWmq(!jRWDsTD!F; z4%e~&fKut_^Xh%`3nSR`%J@~T51jllEiVG!BDl=mnh%RfJZGC6)jjpDZ~Cc6{a_#G z=)fbx^pPpr{JvElw#-r;xYd7tl~4L)RS~W8FBZS_jzDJv zh^L#OiTfRRV65JAw)gpM)0Tfs`+s|fSJ;}n{fEfd`xPJV-01XOHuDb_HeZsh=6jUw zO391b#!K2pa(O#8=(p-D?TEG>MMd9YTiA|D8unAbF6|{giVKpsL*#Qeamc#LVQ5k; zB+WlL~m$*;DZ>Ot$sT(AY%3?2!9p4FSL)Ssp*fFUY{X%>QO8^J{lP=@w zNJ)04?b15!@eW%K4*DH z<%y3bE`{&lN%-#1ICBU4f1tZca;toE8oXwvTf{4#zFTgRe>=9WFtVlo@xhj$4)?qs z#+?H#K~C`zO>A4=LRsvi=Pu$dE@L;bAdQy3!9(Qj!wLiuL$Q$l-p|FvX>bhi-dW*hF3%zaMM2GtC^tof~ zrMhCP`}f*+vSB}aKeo3$O*j(Ry&}>_lrC-`)5CrW(M0Luy&^j6$;wCV6;b#& zdszfu>Ge(=G(ktX*E`PMB~SU3rRQ8{Zg6mmZ@}Ygg2g62v3+YvWvY#!i+7ka+dnI} z3te;$N~I;J{|xuOcSR%-h-TF5II*KYx*&SRvbT{VvAym_;& zBT!%ZPh0DIj}V4z>^AW|HFGttGiI}Q%9z89)zJ7l^5gy<(U3E7pf`M?djed0pUtyj za-YrL5$|Yk($==X47LZx$IbZ;FHzPGwa45%b(W01Y~~K}sBE5sk*yS%-&32aBZhbT z&A@z2JhKD54-zjp(G0jd1xI~s*mRWkw-pxdtcWjv4w}sa?%$JM{E8je%M<=q^_BhV z10$B7FOVPJsHYv2ZiW2NHsZZvAYP$QSl(L;@BLP+OKL7_AHlwn-IV@4$TuE3uPBF| zylV{lg}Z3a^=96LxjKL6DzAR15U5=k_c&VtyohUgg8SWk@*b-%zv@c4vh&< z)X%&+wLCPWD@-mgIpfPquHf!CV(Ic7!t2uVCLHNC0Q{7{Gifb@V&Fz||32I+c@sOX zZ;V?prvCako~Y=7wjyu!!2^i-0BfiLQOP~^A5H*@kz-57|9ct#FzdHIVaXZnpUcF5 zCFB2_jQ_=qpY^BciOP58Wc+7j{Hrqlj2+HdpNS7L{>>TxT^avF8UOB#|Bo~Na>oBc z#{Z3s|FzkEw<+US_qR_(5BJ=R|GgRiuVwriNe2@@v~MHJyCp(1!I5o2T1H^t#cOq(u{va#=j=xzc}On<&6I$8UM#J{(+4D zKV|%b8Gk9`e=_6$%Z&e98UOLw{yd{W^hET?GxWB4gv9$KWCMtvIR1i+e{IJ9{#pLi z0$R$_7Mbwk?`vXv^u~1HYFckL%!nK>aKok>eJS`-C66^CR%!_1kL2PHQTG_SQ zYE7iI@0U^*^ix=>H~*$;o|spy71R>(C;YnVCpSmWvOtR(n{T>i^VK(96IZ}C>{Ybd zHMiPts;mheV=pH2oAqgd$r`Qy*$vcMxqjnsx>Dxq$liSt?PcNT`iJPI1Wn?trj-lx>Dtj8gq( ztY$8ccqzT}V3q+L6!iJw>=JFuMZNT0KX+OB%fRe6Y*Fr~=n4`$tFa3w0v|bD{q_nO zWj}imjGwY2ufu+tz%y=Fzh%2LWrN;;x|6_Mo=ST~%6(agFc{1k| zNbszu+~oVddT^`ev!_;WeHoazj`h#gaHyZI<=?QHCHfdQ-J`KKaUV~?yjsISHs55g zLcy!S6qcr7s7r!>VO=U5x+Qxg3U{+_BrZ$miX?5J`!cF&_ol+1PlZpW!YehJ6u>#5 zxmYL3zY(01avQI!+4OY}LPEF3RJo1NEy1CY{HyLGwQ?Iz)XHrt)?k{vlsibdZ%w&F z+;O`!ZLRG;X;OWKIQcbAnCf1R=0fd00-br1;M}}{{X#Jfn?;kjzcf$R@^4vP3vXEy zhm(Jc+9<}M#mD3l=hH$Py(4i$pYsxTiG4eX8#*UtwY*x(r`3zYS0YoE#^G|`R_i0J zqc#3-g`TTpoLi6Lj`3+F|92$eCveB%r$L(Y;&9#da9$G5|LI9Mbvr!@|JU(NEA*&7 zw6lHCt?d#>taCd)GSag#(NE%DfLC*6y*zUQmfv|z9k23&Mt1tr&A()I4A)*Jsyg2w z+~L)84zJS0aGm``ZAgVFPPEO~{TI-_`QaE&K1|5njjcziQQm#JpL%e*<`d61{+DDO8zt{z!D5NOHu;&A<5@_EeJU=_IEqq!;)f;E8sC-NvOQp}chGNT4N^8c)+Z~W>zktR7_W$F?SU;%bo9wbc`2WWrq;{3@iqGY3*h&^WBh*q|4{sXGsf@pZx+9#?{0*)r+7qi z`<&w5MmLGmKYT1!ZszrPi>%=&KC`A~mJntiguI@2Mt_lz!@ZtX_W1v7oc;s2?GwXG z=J~u!<9Os&^u+PML;5lyN&3M!I$i@ZJ3uQ)#Xpvb|HF*`%NhUk_(R^Let(yVe!_0G?i2~KYlkgCC}dIAEELS&F(A@wa5B^>0`d8F-y-n+_4U0uAmtbcZhDBz~6;C zhIdFiH->RmGOQ-e>}m8*HWn`(Kwn`?Qx;FI9#K9|b#g;bsu_If6H9;xQ})771-Yvm>q+x%JC zAbFCkLx%K4XjXl^*fp1b!Nu|=7vfHjNd^3RGP+al9+Cxw*YW1#x5$4tuVho4U;Zd? zXX8&Em8It#UZsoS>d|$ab*V7Li8rK)Bx!Iqz=tR6M9DcHn?F+B4*6sCqPMMF8L35Y zYCoiVy{%TF7d3!W>Rh%+FZ#*#A?jiujjQZu)BZS@v(BAE+)d8DK;3V>PW#-3@}bV8 zFZw{Uk52Y*llM*IK;GAW7|xS0MfSXPVjKKksm~P90qR6F=?&O#*B#P*<5o9H)6y1g ze^mZ>y|*DO`MQgu9bI7oWnW6!E!cu{TNnF$n{6B)Xl%fp+tDdhKI5P6ao@mx#m?=n z&$pfAvD4RGHZN0l>m6S`_5DI*Q*G1N8S6B**+)#p1Amy1H;81tJ@OuJbu3Hl3D;L; zznEd8(YjYk6sHyz6_Xb6>7_NBv({r08D@6V{!zdG>Gt)vM5x){godJ(+^N29Di$L8 z@nX07y82t(=bQjH^3V1|^;z{fkz0K|)ra-%g}InFd6IIw2~e6iKdl#;PTnMK(ueyA zOVS8j{*&f4TcQKBPM+7i?bQ33FIfGP-1pW3UZ9oq-$w9B_1|Ph^9KDm0r@}ZT*X{W zcc}R<_T*CS_%BwdWvFPr6r8e9G2A~jo;?9MmwjRb#lV(_-^JgM^6L(~ocx>-5SN$c z>ndth8pX0r{WIWQOM?kj*@Cy|1#ngy5~=v=gGce_^P+21;olPjB`(OWYcqcJ zar>xq^V|{rRb^+g7a+Dx8uXy(iQ%()`k!Rt|03f*nDHlidW@gWV~?IFf2Swoe|yIN zOBw&KXZ$y1`~w;Pr||o{as8xsMo(P+f6MsG8UJ5q{2AN0qqeb6oZpGrez(dGQM@}Z z6Mt65zcS;`(8K+C;yvD|K8fJm7@4;;e~3+#$%nd;H!}X79~-CAVXLa&9H&E9M)^hG zC)o;!s5VyKV=H2-F*Tk+CBVbegxX+0#(9PF0rxbzGe|lDH1VlZrJpp z8-9HjbtBTu{-QUb(CivUjTYTAU(G&FUbAbaC!aN2riFi9t7XCi)$(Rp6lYH!6WF-* zEEh6{cPBEbU}|SMqMM(cgu~X=Ga=Cds%J$q=2pL}UBo;wfrodiXFT?$?0rj9wncP= zs@;(OQ2ln55xi=rTZ0WK$#X4snZ)gg*93H4j!kxCl58!5N(^*ra zr?a+3Psgv(Q*-BpKebmbp{H{xqkK$H*(MVHl>ImPhTXX$MNepwd{=9rL-Osa#v2>H z1px53;d1+N_z~QcYs2LZ;&7bi`Z!$f&2hNW-WG?;9me5GdrusG#Qb#UTJHsySIfJCC3u@cgvmf2e|bn^TEtsUNb+>FOGGEHfPn_i$_@B-AGxJd=J3sqG27Xt@|3?}Bc*eg!=VOZmGOTl7Ld1HNTjZ^q(-do1G7{kJKdUCp$>W&RjAxzf3Lue=;9DiDvB7 z{IORbBo{}Va#~oM&;EZg6O0%X9iTd=Dx`F4^oQ!cM!GU@&XzblcqYifG7SzFVmB?qeWhjlgGUAk#?u6SupcQ+eq zdayyqsGf_2-c+6UUWu4jxk2x1^xT@F=WvRipH0!Tl%nToik`bu^n5%;&#@Fe_oV2#H$~5&3j3o%<#HskvWu?o_PNQ**!SJgT!sPtE-j{&c(=J)OQ9JvH}B_)~Mg>fCZ=jh>qO zC2Jp=`&H*@Yism${2Dzq_e=OwbH9W?HTSE|12@#@skvXmpPKts`4gJtHTLT%;HLie z@#63;_`u(W%k9VEM{rZF4VOEJ!*QxFRP)&!hb!%Eak$)J9ImwY#Nq!o_k$471HL=u z-0wcZlP8&uF2V+5IQ5AH?qb|Y-Z*s^-^p`7)R*)z zMAdoU8qDjFg+2N`f91*xS91c<1^+hhi`xfk{);{THt+jK&iewID4D1A;Fi2f=5-h0 zmdr~0IHQM7q<)mF&zve=Jn&DQ_w9*`i|uOW&olo2nel%k<9}tg-_eF~`$*`}^?U6f zKe0b!hjQMZiN7J^zdhs6&il4!;vdQQznJl7>gT+WiGK;d&zsBxe=s}VZOHhu^FS|- zkJG!7llF<~?^f3XWB=tudb|nzhb=Haar|#({J%5Hp9s#B-EQ{RTZuVlR%kMnxf}zDSCz}dft_qr`(;ISKgDN z=U|GSTWj+LGn}I5XH)bnrRX`DqUY`uJs(feb1X&AJt=zbP0{nI6g|r+dOn+?=W{7~ zK3|(3nTZrVCu{bt?7Xi^&q|7(hg0-Cnxf~i6g`ip=y@VV&sS^olscR6XLjC~@TcZ| z$($%_^Q+FMI&1XQyf5KT$E(rP>8sIG^S)m35|8G634b~(YxLB-FX2zk`x5??%`f3k z$FI>-^S*>XHSbIKQ}e#+ymCX0KQ-@5_*3(~Du04g^{&JMZt8CzFAm>=5BzPo+ z1UKc{aJhpx9H;t1HJ{CKxYFJhhszzt;Yxc?9R6?fzBiutZG%?Hlg!P2TJyg2XK1x~ zAGar-a^CmWw_HFJ&zrILeHtF5yR5cVUCNI1Q|{Nam&C@mT%U6Hbp-G_dp1opGJ2ei zu*JLaS}(qqz&n5W%H^v*?0Ks$^geLSW^dKX^Akld8dtsK1_l!?>(>0nky_7lI(ujr zvCps5beZ|)G}Fp{{1&X1O;Pk4#CMo^rj5hG=AcB*W%R8#4a~>usJ{zAPA5kmR7cT% zqxsPh~D0R<^2lppYnbcnSMY2&+-0u-ao_tApgu)+~?tA z+_{~+57#^OZhfxKsdMXcc_;7Yb2$gH=Um5iUD!RJv+`W{slGlh4CRtmoxv^fPn`P@ z|LhNNNBEa*ORwN1Q-ODe`3L^>pKzq-uUy}3WFIT{Y4!XSX9b_n{{i0T2>(^WJLD#u zZw-3>ocCG6f0^((aud$IWj%iyj&$Eo`2R(CJMZcEA6&KG`~q%$hxqeCiuj+yKUeUi z`&ry=#I57MNZh;lw`CB=cMLs$$@||4UrYEr-uawYc9gI`BkZmCIis%UFFSm*8n?^4 zfcV3NJx}}!{Cs=abAY_&@qdtaituv?=Pa|Hskn@3+>?a&5}xO+Bago#?5_zs6Tk47 z26iFtMsQuge*++nf9*^1n!D zrtLq?=Udbu2hHDM&rsVLm>%EE zH+(qXt#50KN!^6U&ef&))bXJqdv>I)&7UK?`9U2+5$7VWZx0)QafsCy35Rk zh6{Fphv=$7{V;Uo`&`b5G@|cfzRPKw0FPbsJTu8y@(^bpPDS(;ueA>_ z>m9j@v&;23_p&^fu7@>w?b0j(KCTa0WNdt@Rf|=XUs}z_(b=y_}Uik`HKW&eE(88z11_%Q(&aJI_O2 z-4i-(z>ju>&Vhbo(@*q!j=p~?N470(`crlJoi(Lc78C;9T0$_B&+G=|k;7 zKmJDe^F7L+uujUGI|Q$duh{oZc+!+t*gpP{;%zGr-eTDvUnfhy-&r1OopJtio&Z;yKi{X3|65b}7ge^cPZYOV^?}Y!W3=U=9JrRu zT>SN8zGvyKw9x%k!V6hiQ$_(r0lxHx7tpNZuD51;!EX+C`Yk=a>6Q{fe^`jW8Mm*0 z!aD{TlcwELUtG_^xZB;&yE-f(m$|1o-$ z+VH|aTS;fk9#y{L6JR*sl(Da^V!uHd@9}}0{fIxH#X_H8co`XJ&$R!2$-w=mmFVx> zE8s_ld-96!aPIyE&h+HG;J&p=Hx|)v(6)blnRe_RCe6?1pvz=^FudO_(Pw>!w);{!bQ-r_ z5j}U6=g>y~x9UUOgz7O_U+I7r-w~w&d+!0XM(%lLT>YjLobIA~@UL-tvGAIJ*5qHuSo!;^yJ(QA|83Oi zmwdtm3!N6|{}rX#RmqcPP-(ge)A`^r&2Cd&Nw*)Ib{=u!&CuiuLjF*MCqX$jqy_Rvp4io~$#XxP|KzR;&+S~B! z-cyG#m$87mnmu=j<58_&{&K&nzrhpl458P>BM%pU*L%^)!4pi#<0_j^A+X_P+C4WEhyV@)MOT;VA(iAw( zeV!l>?mytH`?g9*`j&yVhm6WnT=>a8$zaZL_Z;$Sc?r1f?T0yA-fJ1_IIMPUIRoM?Tw5w9jUpAFcZzbXGSyszK*2yv+Tt zeD7PJeKtuZhIa=A!=1gR$In5@$`#0vY4QI^j&>ULySn^b5q)BMBLAW%`hm;p$^46h zql?42rMve1LyMoQ-kqX6k$XiD%a4Lz@w%L&unKt&x?bH_zLdM4^MjH7ZDq#tdoP6V zh4|>yC;oNkx9%U`zpUaO#DDDE2)+#5unBU= zw&}{!Ah(~m!<_wszBJ9b`rbBlvnk?459rdYJje2W+cCma4?Eua?gOGNbsSY4+kE#L zTbGBaFS@Ma$ZNgiNY8rr7bm&5VLbohI_@r>=Dyw|gNwtKfq{#D*y6ii5$&KMvcz{f zefLk`|Cu$u`>wZ8e)(MbJ#!YNo8pdd(VDs(8GzQh_je3k^3%{{0{w4t&c1JpZoA!* za|C?{J$3pJVcVeLARY%u% zx5v0n4=oN`2L^8c0r=lXnU#lE(w9d~8~A_v9AnNJnb-Ro{<+kn>8-XN9I(zja4c_% zqUY{<&;9gU=sUF4!{D#>*`ABqYvSCBt2Q}8n+T_Ew6E|zOuLB=$Do64EA-nPw3XVP zI)JN@p3^BBZO!?e=x&RxgolkjE{z2&0e_75VD!xrvV`DN9g@TIB?b#z?c9FvZ%yobRpywmbv zUxF9?dk!?RxExtlviw%c1upZU=`uW~wwt2Ol>T7;#k;(5F2;akQ_v4b;$bp52^Djmz~3VMk) zuZK?=e2x)608gn;D8IP8w{UkuVL#e$$rNTs0?xL8ceOh+pf_miEoF?Bn z6w!e(i**poW6M0tgWT;hJqjPHZFVD9?t^zH;m1nLi(eB>#`2zf3_QfQ%6Hg>SAl)- zf}n7aGo~hhQ-7T3FIm}yY?xF&w2gQaG0vt1;KlE>bkE)-ggb7%P3BLUE%cgxL-S?4*ui1Q{=yt zinQf2)rs=fqW9#7+71<`b3y(fclnh1{Fc%DML!I8mKz`14TL+r_+)9#8 zaW5_R9N{pK4{V#-dK8T#`8L9RO5!V(H!v{s8hvxi82Z@#Yl6b~^1#8(oWi+rdbx1% zRL@DJSKo)elWO}C?LN|HobayO;Wynuq<(4CFHaM^$`-B0X;aB2_;a#^d{RHSpZiOu zC8Or-`x~_>_ukkxReRE(C(#+J?HRX8z3K}OPmZ~!i820u^_3;yG$*h#(XT{xr@=$){rLqB*SY$Qef$5lx3^6LeZ+TgA%O!_Y~2ZkKLI zIAfhFx>dkid`O*M7=RB&Kj8q6I!6c}qK&})ca>MTtJm$j?6tcj_o2m<_?W(1=6~+~ zT;;IRfk!cw?s}V!@y)&LwV%^i0Zpz{z48C7#;L=cdn1{;$~XB+8@zerYrevBHm|dP zTkAOq?@^BKBPvhy1-g^yu+7IepR{F?ugc$FhmH#j`J7kj33RUqbHZ9b0Pl;2i)Vi% z3NKar2jOoc{Bq6DyNxLiwFl;i=Dfehd1ROU=u!GFedR}w@NfHy+DiQ%9A-XqZOI8s zrm#cj1`d_y&<8xVn{99Uz-W(O2=Cg5PG*9r{d}!IwV-2IxgOseRXBuRqP82Q?Zo%f zw4HeJAiNj1mF00{{HWST^;LUGrflbaD)75SZL4`;RKK8FKkA0miuev*v;9AoVMi4n z*TuNp#YBEb#VhDyE#N*E+>vGGeBrJ;U!Z|AflO1m$TWKwlH{3WD01uQP~Nk=_nEb< zSN6kigfpl8d-|>ALF#yP06t83jecm?RePAPq2n2qO+P$3mXl2T(K{v6Y<*Yy*yacG;`n8AFa|=RFiHq-r6hI!A}{#@@m z_)2qA<}6+Xy{vBB4T{Wxe8#bSI8qVKz`J7b*VCScc^qpY& zKl1_SUE&vwQOH)!Nyel*3s>5yJP586;5x?o{sZXK2hbmB%P%W`C9uy2fobw zCU*!q41Ssqlzs9=zaE2!%gS%a4LenD;T+e6^E*uuf4}_HXP)NE;5b&(*__*icdXmi z2|w`~xQz{J+#x^aYw9OsW%`NIZp{T6`^S{mbgr_A`;1u638dFF9Am9{GT$AdvqDR= zSM9B^UdE&C9UEu%*Y~dD9?HUSQ@M3V?xGO>ahOBiCp=l_zAOBs=aA1C&{^}-F=TUV zIAH1f{uG{8*QL*njU!)$+g8RP;RKGFgN#kl*G0oac*-GBh&3qH}dGVI( zJJ#Mq+AH>(O?{#{WiD1dUNM`NN^dXqvSxLc9jj#?L!g{lMiT0AGf_c;Dz%S*O>;(78|h4x{L89T(-B$|xDC$B_&(kcAt-(#Z59@k%Z z9Jla!vKJlfccp`wSI6kP_ttbU+1vhMKhjKX!dSWY!7uyL#jGBV{eiW-2rtUovlady z>In^nd#6mILs-_~;Ni2Y!nic@Z`<_E@>m&cU8Us~^a2Nfk6LyJGZ{9awKz7bmoM2V{#<^ZBuU`kc}_ytMD_`p?n` zol)~^)?Q!xo@9o~g%i6sr{ZHj4bnih%bmJGVD4w}NGk9(h?QK1y^baA8eq20fDl$}GqId^`O}v@O$z)DBu#JI4Ps{X_B) zoPJ(1F&d*^d)wISjM0qGIxle;d&=6dq%qK}QhD@ac-9oQ=K`nf1?zY(M;k+)q3tuyiN)|>NOIhC>o^Y>T8;9k!zD<2S>g!l~MC;s_VJo@SCvLcS z?%%_&E0mA?w4V!nhv-B2#Wqbu!^>j$BhdJJ#BGpY`2t^Erz9Uobu0IDuLX{~NxS{5 zo)WE}cQ0j~72K_DXOmrP;ch(1{~pG*a^Kbc6S=4!(8ss!K^Qi^Z&z|x?+r((v*4EO zJ35{Zh8Zt5OLt-H=$JNFZwW_Bj?1DP|GHE4mxL#{=^RSU>s{HBgun6y|M%%X6|cF` z_mecpD^6)stKknoAc zeSH(T!?d53BXwGXWWK+Fa;B)eD_G>z(FtG`SMKRsMBHCY_Vg`PoZ4sGkZtE~x!E6a zST@xCxvTw2=%n+qr+U%PMm)C%yQA{NPEf?p9vM$G&2vZN8uDcP4GwFp?7==GxAKzi zN8F=Ri?Q+DII~OP)bU~cUZ|16Mo#z3BvR zpR`uqX)J1|%W9tqW2g25Y#yrjyC&=Hcu#xoGO_J+@LT>Ja==p z+_|h&d|)MWs1XbMKIJ_C`~(U%wm3)mY;W>rlvllPepY#HRo)}4sjN5eQXQ1%4u$Qk zhG!}j`rBy3GaD##E@flSi+BKk8*{>F55jsgG?eewysL9- zeZXA7ECA;=aGv{M*|%e=_!fFRBA%1mjdVn8_ZDA!X0h_0pv)Nd=7}ZGtXG&VtKpgT zTU|r@mx|%8u#tB9=$^%)9ZyuA;22l9=hHL9Z7QJ?2xsDoQ5?J)#r>*ituVz;lCO9- z_Dfca?i*4tZO~nHYa6cjTUj@>`Asc(W*uu8_QRGv?(N667SFpk(W!y$(tX&jZ`MpT zJi|JvZL_v2E)CCI8soC^Aa3P7lsA!02z=tWUWFgSe;AmNd}!s#p(W2;3eJ}fkuUw) z)}sP0d%&?;hg~I=Jtus`(^y;>tS_xc-moTCF~^tq=JT6^96Yh^#NyIAa9XHz&`x9B z3Bk#)`U9gqfv%5RxWxZO!nJ?Ljs59x_U}Yvy5NC3_Y`p2LvwZtZZ72>S9zpafQ+&9 zRl2w>x{|igKYUey*E)ekkBDG3&RCjVGV@Xzmbw+T<-3;(mtpu)_)3NemcDn5U@64TD;$ei4`TjqWazu=+^Z%035T*zq*Qyg{54^sE-z)a+Vy!K-%|JQp4 zB$G-(J&n5H{-uFC7r^ap9`|+oEq9DZ^v@A?M>()<@lSC_dqcg~L*s~wF63~8u>-uJSteahoKga73b`D|Au6)H&8uo8|ZzLZS57Y(P zzf~S!56_g{!&7#Uqi>}Q=U|<8o8}p$oiCg#bzZ=@EPspqhw8kEa5RwL-Z4WR&rv#` zIQ^?1Oq}ga$S-*P;}77;m-$~Ozryi<3;%8R^_Oz2JG6Zo8(qmo=gNEQz+L-jCWW`) zxs$ndpxABLU$QPlH+CtTeIJ*T$DfHNddJVU{y$Y2r2UH068}x=U%lfv(H|?^Ppvx9 zwpSf8S9hYdsV_XxKGasRwA)%-@jlr-!iQ}eywmo_I?bca+{5QteM#$xtq0FD=KjdO z(KdZv)E*-_zl}IM#xVxlaR5PhCT__Z^rpy8hWu%lY-cR9`sX1_AFH1>9_Bu8KfbOwt$T*;L@jG?TH{q;xd8`eajt8Ih?S0_X>;Dm4k_YKpRR`S@ZtD-c z=ueut$|JfXTr$dNFV1%Q>lJZ-DX9I>gYU|b-!AglRt%*7y@qU|Ag zN_o)E8rwYP|Lx#o+edVU-bKckvom+HA6Ghy12hnAsXt@=ioMFq*8j$tZ|h$)O5$m! z?*sFM!nU;q$jR;-6i4_U5`K@yA@Fb{-`Hc+iH+MqcScu_>{rBfNzcd`kw9`bSTI7} zT;E)dKF3_C%=*7MPdq=D`15&7ZRoEstkyQ3s1NcQuO{=f>qyv4x_8H8Sv@k(j%8Xy z68zwNZ&sRdmoz2z6#C|ZI881|qj}c$HKu8J4fCjysor~4)&JS^%3gAJa+z=Y@zk== z;!64h=ydFVtVsVoZ6g0rKW}39wSDY(-$QE-^*yv&{RlcZK6Q%e`$NUWd|Rh5{41g5 zE5P@s;9gZYw419i(UQFE_`IDu0ly#Fp2zkq_xPk+IcYx|$!0xjA7tY&eV~lY>13_f zgpWYCythXAyT0?luBLL^eJi{i;jaz$gp2NF&1x`j8i~7W)b-ZBoDa>pq(7c7<+slZ zoX4;aK)VG)nlqIcGp+5I14;w$+Qb4^R5Ia76(C)+g!@0!0<{AI^fWR%tAK7Xwr z?XOtxTq~H7;!>kD_p;6!@~wx9xMqEky%6BZ`VD;Rj&uYoV?Xl2b9tp(vo|3ByBe=; ze_d~$v-x!d{&=0&7nTCePag{(4h-o-aCUY@xX*jcC;xlO^JvqvMmnx#UQc_Mf-RK& zSvxM{X3lb7Sh{+c@Or`r`Cr8UhbgaXq+^qrsPnGa+wnnDaeJ@#P1HZb5zp-0vKGEWLhJ^R<&5Y`+aLVtK+s5%-0&$-FdLI=%9`-~JzDfEzG`O1Y zN05Q*o%f8vE7(sQ(&s1hrB3!Y_=oyRood^Wrib7kXRZ8wm(3hkI@*W6`l80-WAabs zOVGMv_gzC9&C$QDy!rn+e#bY)>?JRKM<6%#D29(1?UQJs{+j36Fx*Le)TZbqdmB7w z1iC!d@{&F7MtFQxLae6c56-Y&Z@L*-THKiTqFvv^cxf%kX!)R&|u zd_(2OWi1Fl(QO{NHpqpa=+S>Z9EC?On;BC3F+W^Ho2m`wS7=M@j~-*7BV56;^+FW4 zVXnVC-fR|yyTbM!#u%kj{)%6WJW`xs!h208wEd6b32+!v`yI&lUWxmE59fQOGyNTW z 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 Xj~`|`U_WhCv2|bE4sd;3-wysC(2Q?0 literal 0 HcmV?d00001 diff --git a/hdssd/external/solaris/sqlite-3.22.0/libsqlite3.a b/hdssd/external/solaris/sqlite-3.22.0/libsqlite3.a new file mode 100644 index 0000000000000000000000000000000000000000..d7701a88fbf3423b082cef8126d1049b0d584970 GIT binary patch literal 2307928 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

      S#antxL=7r72{|pU1C*pYV7dJovT* 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 %cfh~0(SP|E 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

      ve;U$S3@R`kaz^|Kxc`Dn8_g?;3Hg>`gv< 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

      RtW=`U8QIS_sy_gR;TML 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≈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�xE3Cit{~3`_$^BY^|Hgxtl9-Qvg<*n*%{CV-nGwOKH_?e zGqKJ#HjX%~f6uP-wU3>xDQ}+|4Au*77ckt}ob#cRJDT&c%Q!x6ee>xWItQPe{n4K5 z!q%jZM@7j6x(8%;^t=(fdUQ+VjnSX5XF29`nVr}w{?Fog`R#@S`j2dg8fzOO?iJ8j z5I8fG2WK%J#J`JOBu)MM)hb(8&suO7^{+DITO7IS4)3@3hAKEuq1*K9*Rf_-J7x5n z|K#lZ%Wp7RlCh|>pS2Th)2A|~-;)b33YPI_E#uPicKVv~cwd7ot|G77=+Ict`G|~0 z#-5t^M;{&)UCfW}s-32j!^FQG7ah}AWYQ^pf*0n6$Z?;^(Y^;(!&Zb7=38E)emIr)u9+H&T>hC)d0o5m z5&n_Ht{lWi4X-QV)%NVu*fu*KTZdmJZO1>#W(p1ZqH?Wy(0F5`bmIA{A~ z!=K{Tw;)^Uc(_$(VxQIgBJXw0HpJI_+Uyx)HntcWh<~LDAAS#aw_h#Z;vW1A4b0xz z@0@L*pD_Q_+yOPdOff)D=u8tt()Q` z#=yhh9BEuB%?g+L4r2qc=dRwhUeoWV8YjOcIB>MpmQ8+(`vvA_Rz>2ROZgAHGbj>NNDkAo>9;X4 zEA(~jbMnqTL#zeCFFw>~cNc75=ucG6+UD#%PffGjYqN)OgLTwdTJS3?-iJEAsXDeV zJZ@uzo=JOgx8s-2!_zopc#=D6g$uZUWDJT`Kjjr$r@Mz#-tLRy8M|yg?7vL;`3uPu zJ9Te37HA)HMC}3m$5{(+X6&(;CuEWC&9R5(FxH|+7bEu>+JJdOPQU-RI<#VP;SVmT zL)>kK4t+~Hg#Ij-9zoxCq(A&_IpoHgZ`(ck+ZRqfg6%e+Y|^Ka`RHO_OKkTF%B@xY z5&GcSvZr^SQ+9HpQ~fq8i;T*8KMQ~AGlCDt%_fx8&uu*>-N!zmOWeh4;|6hC^!v#L z_WIA_!rSk2z=N zhgO}mo1LGM9rYc@VgQiQ+o%`6i|1!^zHr>nX+A!4rR|xOc-Hrin)&TwF3~mRDlYff z%VX@Ls2uwlH>pe!y^0tg>g%l(Cts!y=q&1H_CdO0&eE!G>g4`~r~#TTV?I)Pp%|Ng zmGs^Y@|pXTM%x3UleCU>T)Cp+`WAnF(0Rwk6i-k3ea_ct4W%^AU-mQx@@sJx{~g1% z0Z%%SLs#1>PLO+oy-?EdTi{C>@LtB2GLO}q6Pwp)=PY}fpLV8c%qxNx^^fffM}Af5 z^#86?>&(_^Y_K>w@UIfxz;VX($TvkhTFV{NiBx?=g5IPIUQ}=Fv z_Tsppd$YNNZx!_CWv_sJo$|kSQLtVx&|m)O*v>EQxHw>6$=4e0vaeAl!%+oaxX)9$ zX5pfq{14T0iFaN-kpq3-sjmmwc7Am1zi(Ap^ve~UpXECyMjK-Q?fP}q%bf2^=$h_% zd04yx-%@Ktk0NZwP!am;|^5q zd3jm76Azv5*K!=|yH0@4bv8+#i2-@3!>!cKxD9_4kTtKkK%Tb9(r| zTy$0bWc5d_dvE{9rGeq9qlXr zx^w0tFQA@V4;LMs&Ae^zj)1<4-o8n5(YOUW6fkZzp{K;s3C<(7+`E-C-tL}!HCN+b zGK9trd($zPxmOW;+EioSsXXk_TD{Yj$7jLeJAJ_@eJV`O$Y(K)?+5>l@V1RLi}hW; z!@8MopKe0tD>X-izF}y+J{${k_!6Y+Iq`=tW&^mSTjpQbi2X;FUC^1pW7`KAN0lc1 zRz1k_*GIsqH0IO9(MzuxE4V|ObiQrt-6lCpcB(_N4afa<>TuIIt7BDo$?W(@1Mz9h z2e&W82N?V1^VPiP$}!hxuIlC75EC`-v9IT>VC_54-A-BusqVW*-8ifJTGb8Rx9`{x zyBhCjy5#Tj@@f~g$;{?}y?^MS->Pof^q)ls{lhu?YcS=j_*ug!5U~BJlt(2x@m*k!I7Kk@+}@Z zD+}!G%w}J)!t<&ho|}v=;FTs`GFb5e{Iqyu+&!elD?`j%)YyV4s7uq`Yd!v2eNef|8Ikj@1#Wz_^?CXR^HV|w(e~Ra+L<^ z`iQT#cukJ-k{`O$_6fdm;`2V$$QdNYpEjQLKEilaBaJiqW)rAK-gziM_6`aataC{$2FPT3iLH)ss6 z!{1EWt>GBs1w3f}LD_FBmNGlT%lq?+i_7fmOph19^WvQZDx-6DqwRrxleNIJ&giR* zbcDE%F5-B)D%@odMzm{>wJ@%&bew(96s8%NW{aIk^lr&W zkL~|t`Ssu2wmoyobM85o-?~Y1S3CRAp|MMIK;-QrJDaab_cOkL#UG8%0*Bwh?vz2+ zx*MsNHQZ5sH=eaQvK1{i~x!)D)^PwQ+<;Jvcarzp#u zLw8UfWsI+<;SSBu#>g|@-MHWTMBZ^2r<$O@t#(~lrk;MR7qP4p8E5+&6wr{M=5Xw5#X%kH8=5?Z;(4V< z@cI9yy|1NBm`l@Nm|rnZqiv(bwiPYp-Gb~IDy~C3cGaQ1Z&Tl4eAhVBv5&Z}QPdZDo#OcSwic{Fb8q3<+bRh1ej#9*#PIy)>;r=I%l;l9tgJX*`c^|N9*91X(R2&e@!sz1K}9sKe5^3 zEyI`oc2tLqr`KWY8r2v6w6O4Kg;;+0)0oro3HXDz4~)8A!W(;C=<}RtBK;3X8~i19 zUo86?6}MWhdchr$6Wmc9^j!W+{Odb3W&Zhg;N<)?Wv%W8?rz~(y8fvKpZmW(d?tPm zHlV1vQSCZE(|L9LCl&ADYrW1@cmxhvNa~Kdn#b`-mFX{t7wWQULZK z^?$M)IQLu{6~+sGCw}M#(FPrForVI|W$0B@7-WxDFtud=qaPgH+X#Q`WiUTx538Ch zVo!x{SA*ZNdu`Z(Y_$*AsWl)p{SEDGXNzf*4)pJjYuFp+38fvEM)|pdpYx%IGVRPQ zOD=kJfVm0vW$W#B=(>V>m#9Cf-h{R=hdn(eJjm*C)h#@dLkRzjr!NY&GUzNP=3Zxd zbXIj{!U=NF3U8s#7F&L88}Ha_>Sz{xieLF9y+ccn^1=C%@|33X;3Q54I|fe5-YC8f zAZK`f>7&n1Dt=XG0{=>74k2UF2cOwpZhxk9AV>{p@jp zOR+fYYnr`itMtXh7C1S6*VlgsRxxVWlO?2cw@?}n6geH)n9SV!k5nJ{nA>>6dy_Ht z67?I=@a#a~)&_iw6BK`>%VvI5azj2Y^j!x3-wQrdAg?)vbU<^8Bltqp2l~;^6GQ4Bc27|oeW%3p zv&fbHxkuRZpso|>UfYSmpv?L0(($3FeqSOa{@5HD;4^Tdoeyt@ry;$8fp!`Ta(hryHa*fG?8B98%}l>dwOk9e##3J8=?9-6^DSm(m6lf zCF*ciGRGM8z`>zVsP_fZS>gvG&xyYp{td8?i|%ZTw*^CtlF)GxiQm zGXwYw;YIaRZsu8Nz@BN0{Phv?N&6DxfW~?5T*$pwcu6}Xeu#besS)~D>aUScKxdP* z-dbK8G#&f};ZS+Xd<+?tDR&e+iW$*9VO4lczWBza58&J^oZ<)Go@dNC3f_DOuTul; z>-Bq*hg<7s9=A3wJ=^cKa6X~L{n)DGUg}>yHB_yizp~CTnJ)vc*0k6qul+!A`$Cbi z1X{Jf`y%U3d~;@Z8q_AdYp(iz<-afOkMy(fiK4@K2V5=Sfd};ojJZ>qcdO? zH*CI((D}j>YeT2faMfve%#}iCJ$fa-Vk2{e7SYA?-wFoWpHtac=Bw;)=#H8>#^+KM zo~wf~<8oXU&B${ex*ii9OmTL<9MpeF$41PZZWBwx@5BCMqqgGoN04Lg&7moYgMQpXo z$tR?Cplx)==WkhC!msd2hLTHcZR)j12BJf9FdBpheGkX2O|>sm7B1y04V!XWX~W!c zv4gs%+%QM}AJoyn_k#m{ujTuKC+~OB718mO@bi0@bpAr}kSxgmuhNnCJ-oPo6U3ZX z*W6I+PJDWc=W|b{XLOO*{4vr`aBf$1PB-FE$9H~;JAK2k$bp}wq8Z)dzE@`zy7nc; z{GVYQ`h41#@kL{kBWxbBrr+m=>3iZk$3HYFwwH4@zHEZojO^SKwB39J`fAik9bL5R zsv5o?^)<@aeKOeOz9aa3V*Ebn_#@DDYpUbA^O^WbN8^s#RdGh_4O!o`cr9pHXK_sv zp2n%BD)zDint;gxYj;0Tu5+|Kz$QNW2gD8d%1`ncPnK!GmCSwzK6d4cn!PAfA*f&`~DH@S67LK zEDwG9LHaKLfX18?mY2w2lk#Hbv&ik6@Wgp5vxSY&saR2Lqm!e)Mtt~XrAc<+cwS{_ z!$I+hZF)x}&Sqx)ImBmLV-PkH%=H0__2 z_P(<^{qOee6eRCzV0tK7RQtX1p^MoYxY*0_jP3GV&F}cN_&SY8sl1M}CbB-uuf{^w zh3MLKUQV>}UOYmZONJw~3p%t!_>r^LfjZBozW%&y7jq4r-*MFjT1)Er9A1dka6_l% z0DWWjI^BU76m&OdrOUUN(gR(7YbQFmzlbh|PU+R2BfB6Swey$ElTWCe()VBLFYckT z*5keqi-Fa5?waUNxq5jdzA`UY8BKh4uEy#7_J!J;9p@hQ$o7!Fx7TmRf0NtY%f5~J z0r_pzV`VR{a_7LmuMYIc>PBwvNI7sshkmoU^}m%rn-46009|7oU<@h*?kq30{>as{ z+Jx7_G;KQV`80sDWO^WA{sIi}%HN2d;>U5Tlo4Dl?>p1|fm?9`^BdOslY3Tar&~Wv z8`!u^Og8f();J5lDczVt&U5Gk?~fcuACAyZ7_+kRnERT&lI9PG+@O5#=d0|Eakk0z zozbS`?gH-KFR0yAe$)+@jP0`i_JZK4C$o)qPY&x)&i0wEt=e&ETu|Myt!aGGbMOWB z3w1^-9Jf7!PS)1qK^DJpajocc*S*gj06wuUW=|SKYYmv1ogwzhf5ZBIcfs$e->1}vriwu}M{L$RyfUY>bvkX8l)A*O_ z%I|C5F*<7WH>GXt9wSZzJ>U95zpX2DFUD@l=uG~b;LGCJ&?{tVeB#f-kL(6&k0nL? z5{$*2qj`S`<=&*cR4*EoUL6cvaKCzg;%^z(Z`vP{d)&4K*g@8SzHBvg>zA__{mAq9 zpw6tH`4~8R(tDQi^;z1-NmIOIuXy!oTk&{eFk&pCKSQha1Nx)*Wt$uIi+0_D$>twSBeU(%9<> z&(V46G=Ht?65M&X`Z8SUx(xq~$+_+Lpy!4YHgD2>h219xy;3|>ICT=8qKheg8Qy<=Wq8B8TJ(bVGyewM@)YiK{|21sl%0^CzXCsr-{d?x|KgS5&!O}E z{{~z}=iUDXTqe)=yfWMc<@u{W3Vy$T?wBE1Wbq5qH?=M8XnwR=bWd%J9g=^sAl

      3=!jO~2~AVq5FE?R+Wy?w{?vh3l=?!X&s-3M{-FYMW z!{W*3f&J~o(chQ(C!N1b??VssckXEO4|1OAG4pY*r%`*G^IdVw6VG|Zi{m+2oZkXwtaiXdEPGOL!}4zy;fs;p2v#gdT+D;o&V7@QS!LI(Y(KN#L-i@qs_nA`4;+e z=baw2{3>zu&t(4warEzF{%7YSI$6(e&M(rFoR{uw`LpzJ4mWY%E=wNsL=?00oFOsw z$F(=vlihj#F4mvN`2uw)YbC!onN81qKE7K_HjEW z9VMT<|D30fIOZwa&H7`UPp1zPN6&foj1WgpzV6mD&iN90ob#+bEI*AN=HJ=X=Koys zShqrPyIDpqHnIecsf~_PLt#>U^#?aXs_d(^4Gs zN0qSq(or1qA7{RY^ZdPR&ZouE)0RC$#L-iq`Pb-S{uZ474aq0pFZN6nM^A6|Och5y zf%#eD$S+|&o*veHs;BMS3dy7AJbN~ZqvsZTwuvJjUDEb#mpJl|_qP2x;QT-Oap$9+ zw)`3KeVhFsh@(Gzy>Xg2@(Ik( z5=TCKy>YQP@>iK(Dvo^kdSik(@@1d3eb^w5{MHio@qLFl@=r1Un>g~}>y5|6k)O)^ zX>sI7-n9OI=wUx2xo;6W?VJR!O3z0R@2`Ggf0Q`-!+w?%$2{r#+VxfvM?UOlJ#pk~ zGv7!Y`LLhu#E~D&{A1$ChyCm&j{IEapA|MNWd zY>1t`^L1J08=tiMvdek+zQ7UZ`S^9woV!w9*O;eO1?wq55BD*e_pzAsLr>f5rM~pw zdUN%&`}K%8`uAkE`5zTWzB}`s#gSjYpPzYJ9Qk?7_oIh7<2mOL=V8vbr3d|m`SWa3 z#L<6{{qvna{hVFbVsZ3@`?XRWJ!_fYKo4^!an7G4kLO+mKKBlZqbEy$Tlciquam*7{+CE=N!EBCf@JIr}4`Z(7!kUj6ZeCV0vJoL3XG;$PZ6mvkQfoyTg<6HDTb-ub?w^S?`4Pao&M z@%#S6oQL1f9qqguf3AMI^K|)a-G$C~y=m)y=lmvrKk=~h7n)lBvhzsWmWXt}r{14| zHEi7+&a=+3p2E&QV|RBR&QE{mx%ux(yym=fM!PTLorl-^r_NWdw>cL% z59eyL^RVt7=S%s0y<^Vz^6$4_bpGIVTQ}>z)caP_J}gA!cfOI|cP{NbFMp1%hVwyB zT7NU=%Qu?$a~_`CFF7BP)$(JV$22gX<$Td&=3hCl)!6RKYUd{oTK=f>M+cby?fkjZ z=GpeA-nVm&&GS2tX=q;EdH6We!Fdn<-QZr%_kV6Z&pYqTk4KZ7-&4e{ceeAi<*X;( z`JdtE^PTtP&$s;UJT{y4Uv~aqed|wqAoc!?<@Z%1oo{bp`FzeBS2r)?JTvEc*!eGS zSiYI_)vua&bbk1(`E$-U^SSqu^PZ1b{tf5h^Y`)2_qVhCndv-+&P z=jDF2`KLRNZ)3jD`G0(lZF1g_Umw`*yxwT*NpgO6llgV$M<<(?K9qXjN=4Z|v~*sK z`!Le^q!QNiuJiD7Xw#gpOtO5U^GEq}u=|~N>~8s!&U5nXDp#F<+28WTl2Tt+`24-H z^YHbY*3QGkfCme~bAzI(8R7UlGU8M?P@gFOB^H@%hq&&m)%c z^MaMm8x65f0Df|Ql77&6-&ZYv&iRDN=9k6s`9fNLJtxiKl>Nj!#Xhur265ywaQ}0P zBmX<|dBl+){ITs%F>&N`O|kyc;>g$J$BXLX$Ui#O@^!?KA34MNn~5V||5MAi7DqmU zKTp+F9QjSm_Y_BdH-G+ifH?9!=2`y`apWglv3Xt>NB)P!mLDUI{H!kdzj2}Ue@zeP^K^fEkgan0lKU;c!R0eNYx!SXJ`;Y(=+1wB zclia+S^kL2kL3QJarsruUvc?UG1h;}j8>%kOph2bU)N$hDz59=P_x-DG3ZCTs@9^zQH(vQ~P z$9V$1zc|*7XU{Nk^t4`QJtLe?r;l@fmj13d`XkHPoRh`TKViM~e@qY8TV;*y^K9pp zc>cd~J%`zo;PUd^Z7pxOUzUC&ouFc}e|90H2Yo9pgoXI(li6ftWhvlz251$9!bv*UQsX<&fD?Ob5 zPP~t~C69F@9PXgz8M;!C~$eu~gZ_z(>{S(+f*ZE@lYS+_!tIfaB z`6&7}*Ax18IuHFxu4fK=&bs_2&U4xMae9^$sn1msdvZEYzs=^)Ll65L`lFnO{&KFT zBztQ7k9@TA%g!e`Sn}D zo*S7?ramV_n9nMX>&+K|E4lOM(!_DS)0r26HhQ8bR4EhCn*#F;ny|@V)TN}|pAkn=ctP1hgxzrOP*uKTF#`G-B-#IetD+~>jKnDg0RZJt+Le`kJu zW3=Rx?>l?Oi=*e>9oF-)^8xfv#gp%QCA;tQ#L=^b`6bSa@3j7J>EV7oy3fw%8t0$V ze{ns7*t1(ad4D+1L2=BphWQh&zuHEZnR!*z=}&$r9= zp{nbN<=4j^cD{uEsOzc6o*phAzRvcH^ZN(b^}gzQo?_1^aqMRT_j8Ik_VW$qr-|b^ znTFr@pD&Jl#2&lemCj4jH_*d*7{xh%l04>_S=r9pK5_KF$ev@)KlshoJtdBwm@3wD zQ5-!-ez*J$=N11jPk$!$dAPLO_A@Ize7+N1)%pvHqklhpii%^Nh-#KECyxA@eYS2j z=d<^l*K_{m0rRHLOC2(A=e&55`Qy&J)1MGeJ`bF;zc}WMWqz3RjEAj%g!AF_H|gQN z7ysS%Gfwi!`%~TaXSO)jz59suFLFI|+4GI_jr47h=`VfXPxapdp))AF&-M;teQ%XzO8=I@K6KdPqn zPZ39dBJ9VE&@>l4oq5f5p)gS=-i4`&a7o_5|~HJD*RF6h}`Sdma$SJVVafx+Uph zA37bd^HV|c=&4Z0=BX==p0(_0;`}(ht@B2I*}7ev@1sBEy!+pl?<0a6S9k^M}h1=kw%<^V9Upt|!MOo9930P3dX>PW|yT^k;D%`tPTQ_gAGaTYr@E zp7dg_C!TYbbH0UM%k`{cPebQfuGqS*#c{uS@_uy^$NQr2^Q*nZaUaXEr>{8j;pb6b z5J!F~^W&VCylV4&AddOB^XFuWi(~$C z?5W{A*S|LZ!}KtJvw!UM)!6xDdVA@?x(}AN{eM#O__}(}*Ublsvp|M#W8<)pPwL(dc#<9I@*? zCXSv>%%2udetmJyi1Vq>!x`qY(8GQCg5Q77A^GHU#hxf}tlQ*gGu*U% zb#e4Z)U*AJ7DxY6%r|qsklx<;5qekW>Ho8Jdpj>lAK<(N{RQU(>90FKOdlhT>uSsE z8ZVCPYJAJ)`Plg@^qKT8v5Bg)+pYCGn_b2n1 zzlR<^-;d$-<`qZJMD`SNJynO<{VL^rDZPQ~*}|SC;<(=M9PS{Fb#F4?+j+sXwr>OI zVShSv-C@q3rjK(y4cYU)IPQBq_u(^f%<~NMi(LOH_J1S!%PvO`^1y4 zw}D-6L2=|aGhb93`Do_Li6dV$z0Fxe9QhdL>x<+398F4o3`DdRN6+Kzc~m@k&W1K; zZ*k&(6G#3V=HH};{jBnWy)NP;kDhq;%n(P zKe~}!*BWv3Co;cI9Qj1%w~He`Fr)SFp@-|r^{!plLCK@1XJcFUyf}Ksv*%yuSLkUk zr#@F5GugTs#nC^L{gLA6Kh69D&YNVmo?`Sc|3jR=oaE7;#Qxgi=%2uzM$VVhTRGoP zZ!eDi$VY5{x{9O!HuJrm7s+Dt4{#n!A1;pmX!gG^j{fhNpXvPWyRCnYI9^AE?zh*` z*W&0I!Tc(E*w1Hq&euyG^TctU-^9`LH+zzt_qfOAIpw@TR`b8b(SM%(*Tm63k@<)# zsn69`dS>Tsvsr%*=i})4oc~HM>ijajJU#5sYuuk|lE?gQo7j11CXV^rXSaD;izn|V z^PR+z|AhH&;>ag5|Fk&rzcL>qj(kK@n`gK<&cg}*KE+sZ^kj^*IX`q>mi`Gn>_f|W z_T2c)`CIgruBR7!*1G&sejd8T`8oOl*E5zqe>qQ}|Lb}R^5=NdTuuFcsRaFgdic7{ zQT9YR&v>uxPjT_&`^bH+Esp&x&3r58J?ZVmabLpkUpyg>o<+>}7DqnrZhKu17DxUD z^DooG{i?Xz?$;>ib?K8_Pq!R)y`PBVdJ}lPpNnIjA3NDROT;nHMD~0uj{JuYTYjB5 z^5>Y}<-BlCn`f^$dUA}gp5x-^8O!`X&R5a@6Gu7AT^lH2ZEc9Qp8dr1!*;@5}rYdN?Pw z|F(1TspN6JvAo_z;^_I5Jf@H zfX(^1IQBD%``JqzJ>mDxV#Lw&J9}ObM^AKfJGZZkqi5boo9A6|^c2c#^NbfqK5r4r z&k#qxXg}I=A2s4`m2Z|AH)2^;>aIiz8O8NJAv!AlRSFj z+0#oLJ!PY8-NCMB?@4=I50^Z8&a>wYarC^+o)5&4k7{YxJ5?O{1m@?^!~8=y|02nw zr!9Ma5JyjzLN@;vapYr}-yx2CH1h}PVconV?0Sz&9zF5w`9~Z*FR#5%-oOsQ8 z?xu&YtDI*~0de&Fz@8GW=ln+NdB}M_{vJeq*ORHR?ZYE3A9`9l4?R6yPc(b_I{$z^ zSRDIPp_Sd=vEsO{OUzGk-lmAnInQ|l{X6F!i&}m?J>0JjBW-`SJAa*i#P!@_&q?v* z`^)(+h~s(kA-{idOB~l#sF=-j*Nv3t0P^n?vgcc*IP%??&n=F8d{bP>oxi^&j{J<` z)?Y##`ICFCzlu2W14>xFra1E9Isb?_@@-05zJ)mQz4`C0cNRx}2=m>=k7=IJMn z{HRjaKS&(;HAgM~syOm(&Q{AB)~;QQjpKU~`SCyFB<{(j3$apZ?FKSvz-@O{j$ z#gXq=#`>3wBmd=mn}5A{^8Czi5l6mVe!IVW#F4+u{Bh^I%G$bDowq7yp6O=Fc|*@e zdJcMcU1VQwuZz5r$2pH~ZLia^;^=8!-ukOLpG>do{0hCHIQnDR-%=d?WgfErcJwf3 zKF-<2d42jbu4fo~208zd{;KOaFv|8}jPuL%k6q6Z_I&E{p=Yl1(6h|-OOZ*ACf(s}-h*8i6{dfK+J`+HR!J!hG}?R-)t>q+-t%DF;M5___W zqh}lQ_c`BK*?Nl5!~HF^%J#pE^E&kUuBU4i>v_cGLr-hxp{J|s8PA?)T)rXK9q7D2 zJ=XPXX3rZgA9~(%9(q1@J@;0%>zeKIJx1I9EO5SyzFc}zJ%7Y;Uz)Oit2pjs&$f0R z4v8Z_h57T&$5ppEuZUya@O_!Iw^GgtdOFsyd`5BPKbdRK$z0;dzsr1a=g-u#o@&m2 zq}LWl|Kyjfzo|I-E7rE2R^rHq-}8FH`9}WzkpAN6d5=AV#nBUA&z|Qa#F6h%$JQM! zj{MJ~Y|c1wnuN89Qn2nTmRS2chHxMqbE}{>sc?3oo` z^;g<`nc%!JeV*(2m_3WdF;9g@ZJ(EmW8F2(uXp{Ix7xbfonND$a^7T{&bE0dOABVOn*{(Fz33HHfN0F@uygN+V)4hB91w8yMoj*>GbNvf) z;mYs)UY9uLf06Tl<$O1NnKo*JVdi6J>B1x}IL_DJ+ipqdV9QC?k%22tSWeLmb!jF?${s zM?U;KMssoG*D~Km9Qp8fp1X-7e~S73&a*bK{TwWgp78s6BgD~Dk@?Z$$S<&(h&XZN zW0{}jd=C8!@#NPd_idp#`Um}C=VygD`p>ZE2XXWyvS+h6dcxmX-7Suu$cADubC}4Ud&QBDdd%{9#j);X=8HIgr;*KH zQapJd*i%s)J=dA9<-9^;>uE#}*VX+So4cjt(I4B%=IkMk{#V%3OC0%l=KG5y{|oak z(Zjlrj^-t~OL zo>#?_&n@@=4RKs=xULD}xUTc;nIew-C;YoipNk`3tEuh7d~xK%x%yTd`L~!~DUN)& zznjI8k7s@-J?!%t?$18SC%^7^y?=?LCv7vE^Q!aW^xMvx)6=C(IdABX=wh$Ctm5eZ zg8BQLmuYV6<`YLxTlN$cN6$Fs%Q-(muSO61@c3IcUtQ;4(A&D6>@94bF3vmCd$^v^ z|BUm{Kh*WS&z@JEpP`Qw$3D#DKD;fCedyNG=A7vK3;GOk^dz!pt~k!s5#pG0BYQ@RBOm^LZ=5*t6WZGTOcqDJ zU^(nmM8s@y^`0lN6!=OZQb+E z?|;<%U*|{ZX)~lgKRY{EKBG9+P2#$d;#hY{N6Qy>KJqd1GS0uF*QJN+{p&rOqownw zc9?gN9?TQl-S*)bam@2hCtG)r^Ck3`U4I((k8)muKGpT?V$Uq+-8$R4bH$U-C+GaZ z^>)PbQaHpXZ zx8PPF#l68Df_n*89D-Yc0L3l1LvSe)TuXn}Ui1C4GRHV)jC=1m&z)z!y1yNw_0iLt z^6vf&CVz>0HH~@(qh|r-dn3P$ygz&w^(;isVaj_WA8zup{~_4_8^&e-FQexH`RvBJ zZ;|BHny7yuPta67X8fpg_w>UP8JGD)Vm>L2%k#?pzOpRFrDt+8?au>u_vH3O9j_31 zj7jPhsb>>24T=LbC zpKRRj&mYDm-v#+?aJN6>u@7M;FZ1-rJWm>zo?!G`BtHy~ApZh?0C(e-3D*68PQDHv zFG2KsQmTdSPh#VCf6^J3c{W2nvvFBh5Y|=Lxa6lI|0CSZGvQ>NM27EH7-3* z(9_JgG=&kW8rT8moWb+sZ-t|P1yPkik=Q(;}Cycr$vTuIaw{*s3{yAIf zK4*iw{kesC<~4cg2}DmxXxJ$}^Vh2Q^KmAntUp6QW&zLHNr{%>Vm`j?`=gK?Qp z2<9`$xa2do(sd0rF8%KFW|NFdzA^F($q&M}8kcdyG465W(vzySj(Z>O_H*G`J&$K5 zFFnC6^||-ixb(C`Pn<+i=O{i8p3u1T__WfV6vidL2l*``$)|IE7&ZoO^$wweRz_{dlAV1W&t@;JL`USA@_%$q<%N<1#&m;9qQ?Uo+sop;P3xOk5>|1hx|XEyiR@74(J)Oy0z z#$~<1Sg%*o=;yu)`Gjyc&t;fTa+8;y2=wGIF5@N%)b$pio-&VdAIMk0D^pKJ^wgld z>#0lbdIG3t0(v@ru}e^fV{W-&5z`p1d_Y(75N`Vt@J>m)FsyKlM30(zxu~0`!bC zF8ML{G(XF@+zo#zhnmhj``8{nsn%eZ;)_X=+qmvLkC*8V%jC4VKS&NI@u zL)d8<%tU!?~X@ErROwyB8*EEGO2`->Wv{IkJ2pHjvp ze|NLys~DI3%HK6#)41f_-?wdKT=MUbZ*E-jwea^(I~$k0Uy$|(8kcd{N{>$RER(8kc3=s)dzO$Vny9{pd^UUwd7ep{-$Q;Jewe&# zu;x#bC!4H(g?tnI4tawqntwuGc&hpv^2_iqDi6^0P=D(wSOYq?N8o!I?s9JKJX>vF24ir_OlK84^TcCdQOnL{yWq& z0X>f>-wpfuf_x1;W?Ef`o6iRHB!;{7x}KCKFZ&sS{mf}x_A|yT-M50&(-Y&CG zM^6>w(vuTC{^UQw8bw}rd;x5Btx$UDM^QO^wYOrU%t1o_^Kan3~T=GYd9|?E+ zP#ohzrq}&;=lc-(q{b!hzMn0lap@15ul-q!OFqW| zolgPdlHY=SVdIi_-!J56T=JKZuVh^E1>?vLe*H0Bk2k5`Ev_&-08+8|6dZ#FETFqD#z4}fpK{RY{kdh%i!|5mi-CC z{%kic`_lsR*+-uAPhIZ`>R*BW^CmC-k?4P5T>8V&^OAZ((DRXeDcn0_^!u}9na(Ez z-0lBtVI+f0x2yU%YQFfRSe(SOvqM+C9ePR|mwY(#m5fV1*(yEX+T`2eb&X4pZ%>_nQ{&Qe9r?E8F;;7TSMuWUK5)0* z1-o>=em8j;Hvr>KGA`qGLC3;YP&y)L$)=OpD_ z&joVVbBB7aqvsjrpZulsd28~rt}v`C?zd6*O4gNjjqYxa2D!pBe7< z;U31#Mg9n0oO-&Tr<`#a*AL@1FfQW;Bj41xypA&0(&s}*WH4lYVvvT?WRZi4|?l* z51YKaKbFSl8P1rz>}Le_^Qv*_`3GOucuYOz(ev84yw5IPsq_3yz7ZZLbJV?({=MNk z&y;XkugtR;`ZJrn%+tHK-nZPwrDrLAk84rmvY*LAbw5iPm;9HtI&Lkv+vi=!b$<0s zUd9cG$uW>l$WU`e$y?p7G=-H>yuIE3Oh8^NZnby@meK^{z5`=?O;9PUF&ZXS4Q%8JB!G@<)tIzR(uUpCKOzze;`xejo1U z`Q)+A^O?!ZxZeGAy}OrNO{*&lic+*qMirnX+>Ueo6fT{d4G6!5wsFa~*`fWf$S=X) z!`-^#tkZRQWzqlFc`|qsxZDSMZiM`&&y9>GFVCy&cwXf+F3-d6m$kP5`7n5K>VNsI z_E$D}>Ccb;Iwmjs5QKebY+UB)J}=SUxa?1sow`4L$ScB!z}-Gn-Kg^)WAdK!!nkvd zOaB1$EFpgmUq}5R=-+Dc((f}s&-Z|F>2Lm*&i^>|ObXR`o+D4OUi}&MtU%8zHt7F8C-u}pPrm<=FG3!Uo|@Ei5IxPvf84F} z>`LAb-t&L-4HVByT+U@P`sY&5Gt7T6d2IA=rk+da*+KcY=-Ef^ zdQMT#C-mgZ7Ils?|MQP@{zc&K90T$B#?s{ZViE-&^hJ144GSAMVHJ{nI z}gp3cUl z=inOc>1$l_V~`(19tNLiTzcGdBZS=jos>1krN7HzUDpQV(&O&`9^;aaeMIwr8<+fY z{NAUFnonk2 z@@tV#ZQS#`!nm1@%eco1>-_T>m!9|NDQH}J!q8LBxa7Y-iu(h1``{B#_ragMBfJgu z)J0Dq<=@27p1vk8^YI#_`#ILQ%%=}}rjo}xrt_R-TzdS_v(UKo)I@#_+^x$$uFhvO z`E>X(>iGjb=g9ZNFH?`}zeVo)pHa^z^t>Z4bX?c#l`HE0$htbg;~Dqd6YN6<<8n{@ z=j(mT1DAb}kMl$Daef(-m;T}>bX8JGMqkxb#Gz=d*F?ndc)X?d6r=yXg0% z40=++-F;Y#^U7%Q((gT3pSO98%Y62t=X>Ll_d~vfamjx`zMOHH=NA0El6vG*cj!L1 zCU25P*Yz8D>#XX(lc)YodnS;t66@=_7x{K?^+~2j?nA+|dY`8mmvy;wUuazN9g+Xjxa8e^*l1kx$B^G?#`tM&gFZPm)B_^UZ>@ZOV1(nR41=_QTywXKY%wSPk2f5 zZOQY)yOQ^Y_b@K=jKn+#8kc#7B0qvW+hrYhBKZsWO!87!G#^5~8@__P*;UPNApZdW z3-0#6SW>V^`voGSK({gf02A3Jc4`+{1JI1{F!kXHyq=>GcMz%xUS=R z<%_z9lJ^SIdB!m=_wd`Kde4&^m!4|qNn>2{S4!*iD!XyX&q6-0amhE%r1=`;_5amz z816BOi{hlTId|dtAp|P5!C1`VR6dP1MhmXMV2!klej5yd!Un ze|N{pA9XIWKa27Hm6AO42VGZAa`$mXG4g5nd5!wy9e&k$wjp=>-<^DTK^-@U{HI&m zGnc#|zW;3{`O~7>vkfl)P2OL^@IDeozAu%&zOI-axmOQxuWlNbeRJ!2VqEf>Z|MDh zVO;WVy-P^3jCExm{&L@{~$-Dbp#JJ?&BVW?E zP$>ZNsPYHMH^-Hen&1mw{ABp|~#-;yP^b{wb4EH171g}PZ8D87CjO#l@ zpZ^Vv%eY^VZw+_zZ-&=nXOownK=jNZ4}~u_F8vkm>;9~x{)y<{YVw}_LC-aEpP@Sc zd&Z@I4EmoLmmYuQ-x-(t*%P1li0vEwd{3e08@StthRO6CQ=7c>hob*G<1(M}4|KhS z$hX3OAdmY{^A*Wk!E2GPhyQF`=Hop~_os<*nUB{a?QcUq65fUUF}yeV(8t>IJ9)f+ z)JKy~fKPzC{Tzkoz;yDn@IR^N3VK!>m-Pl>y_=28djCa!hjGb=Aiv+Z7(MZgOMZAYeg3C1F6+wv zRM(Z>xa4ze(R?oBl5dWDKI4+_m_kd0R z?&FX!a`*8@IJx_{;<|C^kMmsDd)v75yN@eglDm%|VitEA17odcONGd zBOmj20e&MKnmh-BO^Gae|_P=XMoqu}ck`G5dvvJA4!#?LTF8R2TdLIfJ zm;C<6x~?+DCI1uh{^YaZ^^AL-pLiX$H7-4gUg)@;jLW!R&g-~+j7z=&@&k=~p10^9 zVqALO{G$6a(YW+XMb9$0JFk^EuXQFb{o&}}Wn6l^Uh4c0l6QfhB0mPdME>0??YTwX z7k=Nk%*SVhK9`;wm-*~P{yll7*V_NDanHG+CvK7G_iYpMNy-0#rzNlPM*FkC-F_Cu zJ^zlp7yJk6S&p8H@$RpwP$y2=5`LrM}4)1JS?#ZJ(dfZyc&Vn>-$VPth`R z_gvac?w(8GgUP=6#Z(?j#|i$)=2Xc$TP_wC;a-K`Q&pe>+5$HxjUCjRdH^rjwThQ0NlmBES&yBAalp;Tf&-2tE?{!Rj8o}M`A{_U>C3)J+`o1v0 z^vLVFG45@UaXDYN4-j7#3Vzbr5=`K!n;F)sOF+{5+8C13oVzP|R7cY_}^ zE6b&ZjGRPk0~l3-BQF9G|skgmIaV*C^eeiN<9w-2W? z=suh#_sgjMklY*jNb;p{?-EhxF7pq@{4*Js`G3NEa>3nv{z|Xoeor0_uS7is|I>BV zChrVyK)x8>%(%=m4D)PfT;_Qg`EKN2e>0iq1=btx=6?zIYA|^R%zqkrDfm3{+VHh- z_x;1gFz#0JCh#!w-{GgI|1r+@qRGoXL}DNA8JB%nf}UsOhv4tXpTIvGmwunodY|Kz zjJhY%pEQQOX>WY-I8>e}Bxsy>XfU zdh`U6{{!!3TzZ1hGuXKFWQnQ!FpB&pJeb@+mgZ-Z?}slU|0cHPSCKb_Zz5j?-)>yy zACCDSG%oXhi~KRTJI6?z*I9D!Z}og5s3%<6lk@^eCUU3-j6 zzFIuphrf+W{?rG}pEfS}A;{k$zYc$BT<)#+7=8XcH7@-#@%5CC#-%?MzOf_W57F;c zZFo}S((i}x@hO0rF?y?p#9fI=VtWKD)lYo>EViBs%U}@?iLXB;LS)qD=Pn}46II?w#%v*2Z@=O}urkUxdjqMlmWw7(wtZg?x|@%Gkvwx@h2 z$qU1W7?++7_`3E)r8k}rq+Qsa^@ zgzp2~U|jP3kl$)t^6vB1e;b$ldgPB7m%RIY`vv2Ye}w#1pU-+q-aDC`(AS^i zH!eL{Qs_SXXIy$}T+@9>Tqf$CNWL-h$&5?>_lny8t#QduMLwHx$!{*Ed0*p_KaPA+ zbe?`w}Lk{F8u-MZ);ro-RB>=8<+k)=;>=*dVB+%Sy0-nitmr`G%yw|I0-$nk5aamU+))lL4)IF3Q_x$uW zE4ufUzGd9(eFv}Ou7$=;M|jf-1YcSPjU2oM?Ml>!noY?q4>H+W$Jey zFV!Z0SwPp-jCxjY($`BTW{GGOqjhYM^n+r~g*>VTf_bU-?1%CmNT0Z{!z{ zhr*W_m-7wA`ED{UJs*+ZZd}H7@0$mWOa9NyI?rRqC4T@Phg>o)`5VYzH!gYi@$F;d zl27fU{m+d{egM92`Ll7!_d`BL`KWs(>kY$tQyG_h$}HNSlY9X@pKCc{3=h@G=^t<~r(zxWiAV1EynAC4QBo{`9(HZJ?@GfAIgcZ^GZ5AqL< zOTYX0@QrcFf1h3F^AYa$zbf`QW(B<`&YQv0z}@HJ+oC74aT)h>3m8WmwZ3utCO#X|72Wx-1jdvH7-5PbLu>M7?*sv*E;T4xZCHPzPg`NOkVE4 zKkok$eCKlB$fF6#d*ghsnARqm4_?D&!}V--FK~&zx8L7s1`Swqac> z$xp&}Q%`yH9562T`Ppf`&zH&F`_TjPx%heBq?M!2S9;vfDP$sVb6ETHlDmKBmLzwd zH>*d!3%_5bHQeokFP>wa$uAVwbMH?*Ze62{%el0}{){&+>vCUDnQdJ1e;~h#+$W!& z*Dmr&@O{Rm-~FDAQ^uwL3-afTOTIjwledgZzG{9Q_a*sic&sW>=Oy`d1vDSuxb%CU z)ALGYT=EZ)Pj6iEU(RbjmvPBA{9gO>8JGMue15N_amgP;zKn6nue+`NHH=F>pRe}U zgS-213-_U!$;<1}AFs!LcLg8rZ#!$4?}-;<1)`Z=*dt19$t(*V-cPI55}cG68#m8OMf}!YZ{ll&s5#F zI>zmKn;Vy&Ht1<>T=MSoeu2g%KN|U7#wG7Qe>l{*wTzZP_)z`~x zDC*8_k{%HmrLnBq=n1B7o^9%U*s?@^Er%h z^B9+Wj4wKFapRKzf_xS7BE@xGHH}M;dtYc|TzY;*z7zQtcz^QTCA9x{8V%^VGQXOho>ramjm4*ZcO#xa4;sAG><==i6;~61ZEhS4mxOD)N-@tfoiy(>*`G zH!kDGE2ZlyYFy^&k9n3dEElS&N?4)lM=6~3E%7yJ-;rqbGT+_=ogXNI2ddE+vlVB~L*=l)T9 z9+1z3N0NJ$(fk|Zp8dzTUyRGRt&mSpBkEqsxxB*n$)te0eU89$DFeB8X}xcGsK-68 ziW`@4_hH=9#${ah{Xf-=Oa49bO~^Bp)%6Cz-8_^0p!4ZK{u%z8>5*~W_w5WeF5}ig z|1j$L9zEm8_re!Y&uH{4p?p>3SCg-TZ#F&l^>T>vKO=vN-1XctJ+iLVn9qI6yPjv{ zuICf=oJUXGn$hpikUjc*P6>DC;_gXC@&@Jfyz)|yyFVq2%ltoJ+#ikG`%~Sx1tf^pONojT=MQ-1sRuok#ahp5ymC&-e;#6mwXrG zXBwA$=gPXzON>kY74j>LOa8|!auQ!ZFKb-#gUaiCb{dzw`+DwS}r>UU*cZ^GaZ2W!UNaK=khkVRhQTIyx6Fi=A>FJ+Q*Ok(^G8+U+qO0?J;f{QxE+j3 zemA~<>_dOuhc$5b`aN7$U#FW*UU~x1v){PP zX9mVSPQD#}p8Oj826@b?I{ydcx!{rHzro)amwAR@o?nd1Jf|TatG3=Zx84kXy525Ar0Hv}XwU+dAr#$ldd5CHbCm`g+_(o~VNQLGo1pX#ZvMQpi6bUvyscpV;wx zX;S|b_1uvCalco#DEUcze^E7Zw?7TY-MZS6Pu{2V=|S%Ha}K%Nx8>wPU*{_S*-7p` zZ+Yr}_+xVSzV?B<`z`H{=O2B4zF}Px)^!x-n#!4 z$-7liuS@R6ZA*RyzZbC^Tvi$L>;DPB^P~^?+gkb@8%aGoit4yijmvXp37#{vjLYk& z{5;JsH7@yU$geam`BVRCeyefG=cumFvA>K<-ktABHDD9&r#ls|!eXk+p+&oIohyK$N4b@U7%Z&6$4Ih_0!e2j7F z_nxi$JlDAN`~IXoOW6I@*O1?UZz1nrNAr8gr~j;e1n&0p?+Utar%hhw8Gw1-F)s5A zt*bpx$j`#xkYA~%`7h*y>Z`}98+G42`!h%PC$VuEHw5`q@z znML`Bm}dxix*EE!4b)S!vCe-d`CRzl3-MKft*37eIa}+|ARwvfh)i&WA`(0Oh$?m3rvdMHmbD=f*wzhWvZulK(b9=O3e9^n2J7o{&6EOU)-YF8vYc&tP2oe?UGv`7HQ%#-+z^ zzV2Hwwv^Xyv%_mDgcK9_pVp=Y6SnP)iWxz@PM^Aqyhs6PVzVJ0s<-hb#mUokC2l=#i+MnOJ^!P5o zy)rI6Y1(VPEO~8sMdO}zp{JH{=^2iEJ-9pf;A(pA&B&|beXT3?z_$24CAt{5Ugv7aaq?k_SCZH5rulWor9T+`+l)(pALREMmwY(#Cyh(~D)N`$ zZe5|+&j^#39=}DpKhKOyPuW17=R5LcaIc2Z@6~s|X+9C$jT-~^JOz0#cn<0rft~{7 zJK=??$Myd}?)s}z&kOX_AurWk=iit-5Z;RVy|JI2$TPx+l3&BWi^r0?e=pC4yU){3 z#kfl;zX>1zuOYtz-$OlN=s9LwJ}=?*ot%)D*JbMQs;$p~TjX2dk<{ZpKlZP2xj*+X zZp=ne_e92BT204IYFzRKdg%VAG%k7f`Qa?aC0_^mLgaJc<;m~Ds~DI5z7d{n@cPBL z^ylxX^Jzow5ASGPUPmE#9d$J>{qFNc!{F|95rF+1M?M5T-}K0QMq%7Vly^NV$z9J@ z>RE}NF!BVwbiGH&{orSe%eqG5^Z5~Qx2`bE{~>w(pY&e6qaJsEVmFSuC$iqL7&n1& z8Q0yP)W#)$7Wv%dZ{a1#^YzyC{%BnK-OqhgH!l6HkpIcJT&0F z*SL(Eu8;2LBjYlzJFmCKCI1uh@tZ_H_wMkt0kZ3o?|caGk4U-kh}TJBzOC~k=%VzU!;x z{V<~Oa~UjF*J&PP7-XZ0Vb$E~ZXaoPXs*#BC_ zWn6cE8XK4VpUAf`E_wHU@vCvkKSzEbd5L~{?jzxDU74`1i6$?vJFmt1@zOlw(mw<} zOUbvw*OI5`uj6hs?)i8O{eKyk{y^jpke`B|BriWe`!B)Wx`ME-2$Pp_gD~zh<1%gt zdft&=fPXeFJz?mH(=6)#NKfK{I-i8bJ^Q&t_cOh5$yY``8~G%7KJrWOqU6a2>9}Rc ztHUc8m-+Z&J~fTYe1;+4(74>Uj`%y6t>A8-gK_^mk+-R@wb{6&WoHXL5J$2?L_<&#`*i zpO*Z+#=P>9&%iw?MV{e?_EaTzfB&dH`3#MFwI}yZr2iki$OpesUrN5Mx%zf;caDe1 z-FnZHyY=27cjx|sJOTa=;D6+KYUt}XXUpjO?0yeG5%SpKI{)(IMUrZdKe=~C%{M1^ z&!u0<53bVu81h4Soz5h8uhXUE@9}rCHj<~ys{MP(-N)_WCBX_Ug*5vMdeQv;^vdP-|M)R z{8Cz-|6g#KoqV56AU;m`n><%r{rKT5^|*71FfQ-EWq;R?2kse{_tS?3CBFvw1jZ%rz7Hq0amkkt()naCE_wHTIJu2WzAy46$=AZm7?&QO zxVo+y#-(Ta5FOXwxa1$k)%(!Qxa4mj--UesQ0?h%TzcI7`Q5nmJVAcAamjCerSqI@ zT=Ln6Y5xr4k}rb2{Hgt$jZ1#~aP8k=T=Ic<&L1)^`D`OJf84m_ z-QOv=Y+UjukiTJEK0XY?$A@=}OOJbwMH-i$z9V(qH^wEOAAhelX4~lZ@DlQg;qG-b zrIo&3QkuNyazj4n#Am7NiUxJ7mvL*4(VlVSGvUF;rN<9FvyDrS_gL*&MBWX) ziu^2mJKUXDmzH{7dre-(4aT@Y#dukkvc%;bNyg)l zH#RQ&=CfSyNo(V>&!dq4mAuO&?e7hD=jirxu*plm{|fCNZ(RC6p=Ubz!eH(HgM8Iw z^=0HGr>KXLcY|*yUkTqw9sxf_o?)u?pChjWzieFA8@N)}`xfr@Cv82wZ(k@Myh`)Q z+DE@{cV4SZ z-gBSVYX2eQ(%58dUb{|Mm4hg^bH{wJpx2lY+Jb8iT+B2Q}ANU{S6IW<{8F~Jd z>Y?Oo;M>VR!}r78{dfC(oP1>yeO;U*4{EA@kNUf;()m0i-wJ*(DRLPIj>NhR~qATUddMLe0<0^!M`K_b&ci=ktbcN{sZ|2xF6i@XBgI1mE5hX z9`)2)r~NIA%eo@4u3wGIx`rbEn{m&*U9b1Hzj4XO4%Pl)RE`M>y*#l5ciP0FZ?a_Ttd%(g7xMxF6*6vp2FmDHfn!q@*m)p$XCLv8~2>=20h=p#%0{xo3y_v zc>ugE`BQjT^68tkrw@6FE$Tt!@8Bbh%RIv{&xyump7pkB&rI_7@DTE~+cdv|e86_~ z4dmbMP~S-x6SPU^`7L=EJeP6l--iBzaMvHVvG$iF&jkO8dY+-DG3DJnTbaCP zKR4?<1C7gkTKuK^)7QA<{g5AGT=L729|w2yFNXb@YVw}_LC-?t(sKhnE6HQ*()nyM zEvXYN)ulJ!K^|;RmmN72lZp641jLW$0^MU@xC7*1!?sGlk zl6RjEY-L>XRgiCQT=MSofjx~&eh~8gj7#2qK5(RQ$sa_1oN>v!&%ezwF8Qo`bpG>= zOWyrH;g!ZEAB6l)^1JXbX-Ul%xGTzc|{>9}W%OTGd=k9yO%XI;p@ATP03dt!Bo zet$;6Q;~mxr#CL+y1(z7%eag?f1mc}GcNh!`1)f>Kr#1ClLQiM%wj*N|Bk;8^^`p5>;FdnleTNrxl7N%BkDQHbM8|w zPCm4qdINIz_dVN^kI5@1`t|p`lDpqmIf* zW8SMBxx3Fp$lX3nB6s^RpWN-|YVsbdb)LJ(8x&W+Oz!q4Mvv(G78B3&q~z}VMZYI^ z>#9JW6#G+`+~r%77h0(E{0%No3;BFtFy4RrkzX33A3sbrJ@WqB74N6BjLZ9=`~C1s zjZ6MI@+*x?KDTa**H+__A9p|x_%QiL_zB~l_unD9t}Di+r};tcxoKST?sfXaxa2b* z()Wgv74?sRv&*-1&6+Oj`OMWH3FRP+)$u~K!>#Am4^7wWt zulmL%zX$my#wG9Gmpd4j{Jay|-yQDuzfCvYxBle6!-J`(LPwrKc}?hLazK zPaw~DPRE^MT>691Ki9bQcSU{)`EmGqxSM}}%zwMdd-fmw;l`!E!+D+0W%5n%yVU;_ z&$lNgFa2ISbbr1Wm;TG>iPtCkeQR++$Mq(^2Tx^O`a{wGt#RqEe^GmKkza=UlDEI4 z`I6)bFRPa)p9QZ${u%xY`J5}-(~LadRrPk{ZQy}$caA&y=soOf^0E&BJ9VGO8kc?e zh@PqBRj%o{^T-Fmmy&OUuQV>>hGE=|#%0_`$p1w??YfS;*SPff{H60hYFv6wAb*zp zmmAu1jry=z3Oq(%y`OIXL;LFfCm{a|o*C|bZns#3j+>qGt|uS4 z>nTY+Q_xe1@}n_sE%Isb*3@$tJsl|TdIHH^&mihac1zbahVof3?qrjf^9{oJE;cUb zTLe9;$veR}lP`hqCQo%+=d<6qj2nt^j~kb9dmw+-xa1>{k1#Iz)5t%DyZg|vzut$J zCNDj{yYxQC?ic;}7VnPEGYNT7cyi;?6M&u!#$`SYk_56k&U&=SY$0sGoTf=Kp&ouPZ zrM&BDLhgDxP|s2H^!Ok70p#5eH{}=^(~{qWXEN^DXY}~O-9AjiJWEhM2>I&9W!wsH zb)I#}2f&+>Z-jR;F7pXRe-Go*e*yV{rFmT=O1sd-V^8f z;OXG*-)qS}Xn$7njqtqWxjt&X6!m|^^R~Rn%X)*c-d~K%dTXMm8Tlr7JMvtgbllFy zrQi2&J(r%wrGEtSgUC<8N0P_=to@V7i^8WFmvO@}?n2`-?rh|j8JE1*0iEY2?wLP&{xL2+caeWhUhs>~^Rsd3@jj^Q zit~Hab4hxBMLs#)tt+sz-p}+VFFgV1DQH}Jy#Ld2OOf}4mo@I$AM{i;E2(9_bmd>rx#zt_F1ap^yWp1yFm-rZPlkjZ=Y?U3%&;|b*4qp{Imw5@^BR|Z3r9~85`RPe} z8TZ0|%^x-{`TfYBFfRF4DK&q^xa12Z)b-vpF8RFpyT(t9OMU?I|B_#X#~d2E z{uemUr>V(HPcV8q8JC_d=;>};@)5`nFfRL(1AnJ`v~lUl@r}-ZD%{Oy$xyvNb4_0Q zy^rd;))<$b5$M@qT=M?N?=&v?Gsqu;yK!$~+*9Pahv|IoQBUTiI{#9ZW$Mt_A zcm45)McpfzXIu0ngY!Joktf4E^HR@f^pv1{3FQ6A%fRbX&ua9vr2J*%JCfgp|4u!p z&@-0u&yb%&{t3REdS0SuBjtVY{Mkuf0DhW!QhVz;UZi{g@;Avt;SWuZ-1BiY_4)J0 zxSV4d^nW%k`3(5`ZV87+f1e6Re{%A%BlI3-fy?`p^tk700pl`mPmEjGxa4m=(RunA zm;5f|D;bx(7yfS4&&DPH3i$@cC0}u<_O~%E`O?XBpL>yyfcJ;Hd+vwz4khmeA7^@G zT=#x4%eaht68#H|OFoVMv%_m6x!cdZmbiy_l}I zn{mnCM!u(U$#*WL>l$KQ@?}zJ|48GKckkmboHH&xVd%MTTzVcOf1kW@D((5lxb#G#=e2R^xrY1)nM;e_^b>q?>jQ+aDrN1lk zP01(2+mi2rcZ0iiox!^LkY9&Spq?0Mb)NGnzaROf9De(GzYVy+KbzIN=lX2;(iJq9FqV9vdUdE2m*Oxck?N0#u(~_qeqxT^f^|mXH6LW$J~t*9m;MvT zPcbfe_Z(YbT=MxcX#Wbh+s|Rx&-ErR=jDs@I&NHg`l9DN`Cj-Ho*PoYqMxmz&<;P+^rO9`|Yg5k) z^fWLo=QRO8SJ;+%d~lz;kpD7H_h%sWxO+avxa?1=OuEk#jeEw$?}40aT=LD44>2xz z_kOp=xa5~1zrncV-N#pZj7$C|^5NuZzSVi&BA*SvZ(RD_>-4>G&+`iR?O)@Pcdv_t zW1`=mf6$-Qxa51`=khWdm-!dXtn+`CBamf!uzOZr0Pr&zM`x%$~6XYuy zm;9w$+W)h0$=CDI`7|&t`9wE0-;vyXT-V#U^z=o~0OQhg=aKe|HZJ-3$WMT~*H;AY z?R4_pWA)xHGCk72=8pESGcNsm(Z9*Kfai7X2xVOMm*TI?wOmZl3cn z&w?f|Jpt$`Yg~HTqo;~-*`Gx#bU&MryXQ$qa`(FHLp}k|lM&?Zxv_ve;JA*vgWTQo z!{qKBULa3WLwoL$*ZxucCHa3d)V;<JA9-i3TaTAj}ja(7;n$lbopCwKe2irnqnc5=6Ghsb->)A^hy&yYj+ z`40J>nd&dd(|lA!Wc`R=oH{OKk z`|Mu7X~nz4zIZl$f0=1q^6tEr7?*rEb#`q0eZaQu4e{% z(vm-i=b@g&IdndS$t%N4P><{PBX|9^sAnL0>QmnJG$%iXc?MF?PV@|>e7o^_-$t6e z>{}%EZI*G_w>RinNM13g?!!v*sql^Dx8d82%eek0_2aI+#%0{RxwQW%c?kS0dCc6J zzeYYEevkY=_&f5J-)WCmaP<3gAD)1Ga30MkC-0S4J&kc$Zz$HA-MFmxHS+n%E9BFj zLU4C)znP=wSc=>aUWIzvp{Fk8*W*4kF?pG11m@YrxXg15dU_a_y!RU_?ay!3>j zC&IY&Y)8){@=OJEJ}=3Kz(0}SgL_Smx^JHS4A=ckU|h!S|GoAnC(q%lo`L*6JUe;J z!kW)dJ|13-{9kxk@&QG(rz-i7qUvqnZl8xu(tYkuUU9y9fAYHUVCo-HO#5e(uYfNw z?zvak&(+3dKTjjS1@7j#cAm~>x5<0%6?%>vm!9;+bw20G`@?ULZ-PIByK(nn+(?s` zalO{Kf&Go51XO) zzk$iixM3K#qj4FxF?za_2f+uBFNO~%KLj6RT*mb|r{^`rxQzQ0`MKn^D(bpIj7v`t zdR7>ho|DLLAdgc?d$t;vo(S}W8JC_0$R8m;2)_t-`y7CMzDd3V{)T!!qvs2G*2+51 zSkv{saepFm*Pj;dzOS+pda{rYhv%c73)A(U6d`x(s!Tl*==q5}ZWW#XFVy4uo07Z! zj@0uVdb*Q$fDfXc+JET$N01MJ&!C=z=n0{`>sfB{a!-8E>%HA#T<*yu^z0!|Tvhks zFnK}v8Mr&&R+#4%lb3M=G44a-GVU+vd1_qpA;`ZqF8OW9$C?rSUQNchiO3hgGr`@x zibPLNegOGRc#v`Fao=||h1`9fe1UQ4?@~kOv&6Wkr>5@1PPjYY;n;`$CNJj|j`KQi zT>6)x{|5PW_#NZY<8?vr=M&@7lcJ{1^9^}*_!sgM@K`gW-tVN}7yaJGr9W0J?f(|; z*6S0Z=bMwfF1#@H<{yCh_cku`?}7XP<8qGf^LwL> zOMV9O6O2nfKEBUwj&aF{BfkXh_NV7U-JjJaFY^q>Ja-$Ho>%BOM4qO$?teIWY4{a5 zk9*tXW!x}~8);m|ZGoOQ#w8z#{1@YrABTLRS<#;}kFeepaCx3ckIzNDw^@u!&ldFL zA%6-lNd5D1uS$}8VcfdZljAsArv!Qi8<+dgV3JzFRrj{I)&i|}*Q6Z03GJLO%^EppcrX?*+FE8_k>n%A7@&w((E z8z1hT10mR-^u}d>a$-I?sOKK`KflS#K8K^Hta0h7hMtPXCGT}fpFg#XOTIhu^~tBh z1K{rdxcPK2dFl5>e{bW`e*-WN)n_rERWT~8Ns*E7(#eZ7n_{WAYx%zwObd5-OitIy%t#${bU zU_OgXzkEISN4&qRB(Dzti+V<*XD{Vl&k=IhbIG`@YuL{^&&S4PKFRPLcuAhtJs;*p zKld=qCkfo0yX#3s?s~EtxBFbgxXdRD#w|^r6aF*Y{X6I`=F`x)oL4x`tC?{*FZb_@ zPR8ZD;y2Ly(+%#{H5}viA$QNu$<)&TJ@Y8v0q48K==UvCLp_(`9$@jq7*2FfQZ1PNL&>fxG<)z&v}A z$6u!NA5J|*GUz@`HZJ>CppnjhhH)9!ef+lAxa9jFzudUw-S3^=Y+UkZkv~A5v9XSO zfxIsKs&VOe-v{#0xb%-h{w3V)PjBqcN0XQP6O8+l_>bu4xEDQX;I3yQdNP~5^n{@& zzj2vQ!X~<|V&ui)Wyu@EtHIs4J1}k?lb3NLF>VXvGVWybv@tGupDX(M?P6T=XOQo0 zT=sbuzCUd^+|9=u_i8+Os^xm$mYW{we}n!V zxV?wZj7vU!GadH}xj#I^g6Q{QB;3ciy@&aYOaE@a!qM}u$;*7auIl|y8WR0{E1)MWc_2Is`BZpbxZ8)z z7`L#=%ea0Rx14cV*B10tHZJ)<0$H&!te~lCO{aX5*4~`>@Zr(-)1{s%eeXi+qX{d2o??w55^Xq>m8JGDCM9(zi zl6SAWg~lb{w4Kg>72NGZfmJ%sjV3Si3Br617?+;Y=s9X!@}bC|H7@zr$X_uo`3U51 z8khOI=gbr1(v!Bm&i^gk&A&YM`HRU*f8cf9&-9C<->XsR$wqz$o{#+J4mxg8^0n|% z#%0`aj9bCD%s*jA?WsxLA6}3A3cL&4t#{E{J+EFSFXQ^&(DjZtF5`N4(s5@}&n)yT zApZltgL;ah=K$r~Ab-N-Wj+Cz&t2m(pZ{a*PQcup-uHpO+Nz*5D8~9tX&F_7T2gB) zWqfU+%GhHcTcx&6t+9`_K{58&M^(jEqpb?9c1jUc4K3fas6kaMWo-4IGtYhG$^FZ7 zUH`c*%Y1tGKIc8}$(u|jlQ|kaKTyxn==qI2319QE%JX;ydNzXl_1O&hfhzCjlfis; zRqp2V7<%@jo(<7+2>B-PGpT1bdM>1V$1`%iE>n3opFHL>PPv=UQuI7TJ)fiJN%Ak@ zZ&1%#XUTbghw|f*|A;&XFHuhnJ%3U@i+s<=<-GXye*(TS+&}Me9D25({58mLOMWB# zK)Jx5ahV&qRCPs1;!o+r_BE#;3#{uc66;4RcM2R$!P{&3`{kRJ`7M?F8HXCdWd z$bUn=JG|EumA8v^&X)7u7w*r?*2u3*zCC<9>e&T7yHS3v@v@(Xsl40ICG6*8mAn0% zM9=Be(;GeKs=Vuo{7N$6U%;z4JcRdO8Ouoa@U_nf0J_8e+croD0lgwDEs7o z@+f>F-0%Mq9_LJ=d=mND%H6ovV%!hNS2$PZKcD=+@S^hW<3j&8%3c2*$S+my@{xsd zT+5Za$3=hR_i6TNsoXyieBIHHd^`B2aR0oef8H;u+|6eJ=CgxxH?DskZ!hI8KQJZh zaD;M~zZPGYodWmkAIE&oCeObh`~MQ^@$+m_?#3O7ac@!X#`V8H`d;NOztSj~=R?X} z-v9pS3CdmmBIKV_?()ZE-J|fX=XI33{6yrZD|h*6+3t8yQ10@Jk^e}!%lohI7Abf6 zZO)VVf34i*{dxICxy#Q+{&(dr?|uG=ka;vES=sVZWjy5+u=)9 zkDKS(_`SM+DtG;@=wD%c`MkUN6fvJQl)L_hq3 z^Kx7Vs=S*|bdg;5j#lpGlSI$S7O{qq!j z74l8elJBeBjhn@|HOk$%_aHw2?$^2QMcG$_$w$EVqMqN-vmfPs&mrW#=UD35>Pnga z>6A}m+;hp#hF?iN3G`e?dEav@x$n7;dhS8bqsrZS7OdC{66xP`p7(|ko$SgCinCFnB33vEAor*`$m5zpZkl9yZ*$= zbvp*{>$nAZ=zPiVPwsz@^O59!KBtoV-;;YKd5`s^e=PYm--|y$e$FT2Pm}k+*E>_l zZwqAoXT#lR?sYgN++Vy;{?8k79r#Z5xPAUB_IXLU+i(7S{jJ>PH@sSI*FB!CTxWkC z`zm+&8OZlj?)v?D_E+xmS6(Ci+mXKl-$}Xa@$0{ja@Vulb<(rHa+g0IUzZ)B+~t=d ze~j|(by!8#xk0(he}296pQGI6&&58xjr{u6rRPEAu4hS;^gOEE^+fNI{g6}c^3UEN z`AN!MezmCdzXtdFVeC{n@9&Ub^0N3xs>fXqgD>TA!V=|f+yifvahH*ghc74p8QwEj z-Y2d1O zW6IsQ!B=wLpHc3{Jq`IOa6kXYTV?-DS9#YHN6$yfUC)E)`J8;au`-{p$!EfUg8OmX zG43BK@5W7G+&<5h_nRB{^o;bcO}-qyG5O86Nq%$kO>Y<9fqXK2XXS1_;l;9^dndJad@mRm$Bwuf9uqZif5yFTE<~ zeH?jcn)rC?nS-8ZDerq;CiguvsHex>GN1R1{Kw?|FrROzXDE7>Qr?gIE4lCK`F!QR zx&}R~!u|S$alKuOydFM)dY(kjAm#476med5Qtr;nTgb=BgJxNu1K@r>+q@#@Ww^?_ z{>ay|KTlQe`X5ElNb-N+qsfoCN5)N)KLNj1xf?fuac@=b#{Cibd*OcmY0Uo-@|)qU z)N{zaGM`r|?|a@P_dOp_&$a0Jobt^WcQN_n@V}^M3VK#}LH3V7F5j~8K#q59^8MlKD|bC9^lYl! z>&J2a`Vm9|HIDT#k9}LOyVc?1wt)nT?(ils_B!<5b?wGmCkitK7|V33?jIcX&|N z;Y#w$;Wv`cf{#`1#w}vpX60_&@I%u77~HQzBj!IrRvaDyRmXN z?i}=NPTu1Y>5r1f;6uqr!gp8h#tnZf>%5+`ASbM#zJ z`ERfe*QvalPaN}UR_^Ar!lQD$50f7VA5Wfwze+wH{)TclZVKbRt=x^f2>H3>V;+f=F8!;Jp9o)1x$7ySXAsu@jm zR`7?EyPh0+T9mt<1oD&Mem)a%UZ$yh_j;mdj&j#?BYHj}{{;RydF_)j|F6mKgD+9; z#*HqK^Ri628~1nQ|4`n&Zpin1xpM!U(IVsaA#a1PO}^z*lHZto9K06p*XpBa&;;qZM!Cxe zOC^7sa+kjq`FqJ1z#k>QtBNWWb(cfrDq1*um9S4xt`2XdDovs z|EJ1b|4{UNL4GcL3Hej-ACbFq{w{%e_8~tGz6snvZtwA|9Pj3o z_dVN?`<`8?=K%EVNBK0yJ%s!b_=(hW6?)DjZ-t*rJ-&Z5x$nP*dV-uB?=9qKz?+r3 z^^g1@`}1MtZv7uZ{%N@1C;PuH`{V_ccReZe%vA1r-ayZL*@2H z9M{)yKcCAmpC44-^%T(4`<2S;*k0&aRk_OtC0U1l%H6o5kl%=W8oUT&CE zGWwq(e+~XBdBY1bpEs1db&g`4XDN5{^xt=ztK5xyGkQLQ`*j|V`F}+|4c>Ed<$0fh zo>i5*are8idl`cD;J!bMb?8sN*PF6FQR?yUbF!OqH~$WdyO(k|?n@WRxQ8fr`E6g6 zbvuFlVt9&tI{ZrV)n1aG>y^84+d5_3JK_F#6F9C1$d|%jRy}T>`=EcSa@XHFNcv|h zclle8e^s^SlF;yL_LQ z@{{3yK8={q8|2AZGSBy@=fYQH+;;Mb@P*_Z@b9SK zkNdOAyZOg|l>5gOU#;8^t4@}2S0~>SzLs*=lS0pi%H2Agiu|U^T|SHaVC63V0`l7` zcljdnJ1ckj9#dqV`zUw$$WL-y`zv?*XXt&h-;Pl3dIq8=3HRsgMVyxgm3RFK^k1Uf z_1uk~>y^8F4*867mwzAmd&nbG<+vVE?&d#fk<32__w&r-cHK(;$!ytIv#7`4ugz8N z=5r>-{ZzRd_u*S*++UQt{0qphIIVL3`~_b{x$Ef}lb&^zyPn5hmE-LX_s2CK$F&9d z7w|o(=STDmQ|{J3{Il$bgO$7a9JaF?sq6LE%H4d{o+k4-i~Jz?g>XO5o>=G0RNjpn z$G92guK#ZI+^O8<)5t%l+~wav{z>waUXyuFh5PwLF`pSK@A~uT|3JCx&!guP z!utn)P5njm|3JPBzMOjeep~&u@;-6>yZqq1tmg&FUHhA{`0Fyy50ty}Tf+HWLOs``=NIw^;j84!=f(B6p?^K{@8JXBe*V5^ zF!@X9--~+Id_(4cDEUtCBbB@3ivA+E-_w=5c^-@W*~;BI`^Q~ll)L=9$X}`4<>&7u z`|UOIukpSFv*G@D)7WqClP{bj`>;qolkxKf-z#_X=`~%};V0#8K6~9S`{WO{`Ox^~cNImbO=Vj$? zebzZj*5_?-Bx;%jn$zLt^u$J-meQF(rw_LKcNi2SVOGM^Z^e_XvU`SJL@ zX@`>!#p^0hA|Hm|TQ`b)?)Eb7mE`_*cN_VA_&xH^kx!W+J#)w}d{g{Wa(}z{hJ4+3 zB|mU_<+}Ox8A9&YXHRnfe8nN;n@y1Zl`jO7I%;@paO(Gr6D7k>rE$`zuc+_v>~(xnG~F$o<#98S>nk zGM@*@{klCv?!PXcLVf^VpZqcTwVTQ9=qvK&AIZ2slXol-U*XNl^*mT=g1+QK*Oh#f z{EfrqFC@tQIv-E&U-x@4xqlt(qvTtjAmcty?thLiPd*U0uXoA)d09a2*Z*5`f4skw zpSMuvv&ziMb=&za@j>LR5%FQ?|MB)D7M9$o*Ga6Lbh{M@44FOQ)ff8D-L zxw{|v5!e5ll)LM{zn(WMcllLk%Kg^^%Ju#7c;zmC{4B{otK8-N^?#~zmtU_<@-yN7 zcsF=Qj_X~OclVD8+&?Z*?s~46Ej?e6fAE(0Qu15g7XOXBI7j?1yr0-Pdq}t9KHqlgYQdz7xG~riVuVP^@+VJ>oc4@4nKzcNcbq~-*B$5aoT(ljOc-n6m+|6eTjC%oj6n-Pz&u6!fWS@+syzjZ2-1j`8T+e5cayOr$7}Txc6Tt`uTL7sl~nGIYZ2yis&cmudE`ebclput|lyg)rKqUR&Z`<~Cp zea{l*dVl_<+^zppxPJC}t8zc&;OoQve(2XO$Mqk|`<~6oeb0`{^?deK?&k9<#yuGB z_d^utE2-R_uX8Y;GsvHYk5t~hPtY@3x$9Z}i5yp&y#J@-H<0(3FMbEy?~}7Wmh1C< zD&KuO?UeoYjB+<_0X@$vcljdnQg9~Kbx8OYP2P*G+QoqZ%UnzGzM|>td-zs=uqx@?n3@Y z@?YS8kngrw`g_i)+&|0UeaN5rTJmcsck{_&KIEsu~Q{)f9FI4X4pThhvSKd8;7I+ z_n*pnzh32Ce+K<`DtG;_q31#JW$;IpyPhI?CMb73>;EjrI}PsVv(tw%pP4G}dZImK z{o9qho=ed4ney)WBfnU=%YTdfcgkJ9g#0hcUH*|@WS)PM-?L1-_j{H5?W|wL`;s5~ zn|KX*zfSS~7Q03k0fc(D7UH%m04WTd={nwBm10PF0C!*(W@<#YG)N>_zCXqi5e~o-Le74d5KKZQ}_Y3M-ik>Cp zYb}@KT}HkWyvO^pAN={f^?g~lRp9>lfg<)#jdHgSk3~;^@>cj}%H2MUuPFO@8|AL& zC*)(~XZ<7d-;;a+{J-P}2J#K3!{Pq8df@hWEct%$^T~bw5^|q!g8O|t0ps3A{ww?e z>hbIRxXQcr$zpw4$qVq;mAiF2Vg)(gx5%^bd2qiDtK;$i=j1!Uf1#e*9@4*@@*}Wr zy+5ejKN)xp+^^38=;=>>FMLboZXJT&vQM^G?vD3WOhwOgl;0ltSIB+O zOzQa`dfp@N(M#6hGv)64ZfAG><37Go{qA|i^p@Qmggz|akGT93E#e!JZ-LiKY)L*A zuM^mrd<@<+zZc~%9U%EbC?6ny9OcKI zBKb2_-mOp4{j2Nae99Mh5l>S-jqAfbl<)hod~v*DCL#$+g8xlrIby|6Ao{DpnE7TldZmro(TA?3fo?~&g^<=ye- zuj~3(*T;60-vGC-Jt$wqxCc>w(q!p5n(`6!pG^5x@%qdZm{7$&;wW+*Y&qiF&=TW{D?{E19F!5t3 zAIG?-P`+`HK>33vh<``-X?bxUjy#1x6^kMkEp!c4|toyU?}CI z!(^k>sl3|{Y5d&QX_PXHwQ_2U6 z#lPYF5#pgwD);~VU&Ysj`~9EA?{V9a@&opi{4mM~mx>Rk{GFr4PojJp`y@^ItuB)M zSjq=D-ieg&ySL0u``TNqpCFL^*iVvmyPB)0xQ9h3R5tLta zn&eNVe1QB&%D?fs41A zzy6w|@@J_0Jj(m8%NDDAgUXjE@4sGKPVT>6+fKGi;QoU{a?||x!+RdLQ#tEh?_1QB zaCz@x{0;9pspU2Jh-*J5&Kc4rm`+S^wUcr3o49Df;-yWZ@r+f)L zN%An}-$0()Pas8}hU4M#zvDK;)0A(8H<1_N8S*d=w3)mfo;AFMJcj<9;jQEeJw~8Felfh=@S@=zhL;TQG`#zSbp4s%&wf532UR?5c#Yu^!)p!qk9XW3yW5?g zPt3^24aeKN|DWSZ82Ng`lZH1Ko-(}A@U-DghGz_KHau&1i{UxLTMf?}-e!2g@OHzC z%hA{>dF1{07>%f^^$KO&s-;-B2V8W-e`E5JdS)5dG$&e@D&Ex@kvgBdpTgXdz zJeDKR!&}MQ(UT{S!rRER=qZq=;qBxpc#%8_?;uaWOXP8QCwT-O^pth=`#cN}kw@WS z@&fix4S9fkguIA+EqQdT%p+=ejJ)Yq$;ZikPo3cja^F*Lc+&6&!~OGfem#A^f1Zy$ zZS*u5o-w@H@T}o2hUW}#H9T*4o8bk++YK+0`}5mD?$^0Qp2xoGB=`C5Csn()5}%il zd-A1yolRNg51xio;-_nOOpG1gW)N|8x2nz-eh>j z@MgoahPN1=GrW}@>yu~4I=2~KFudLHqTwBemkjSTJizx){?Gn5JZyN4;Ss}Y4UZZg zGdym1o#6??>kUsD-e7pj@J7SahBq0WF}&IEtl=$&=L~Npuk-t#++QEs3@;eoZg`R0 zUspTGn_iadb%{I$?<7yc13ahX_y16M$ndb?HHJqFuQfbsc+BuPxnGAma(`S2a=#As z(33{MzdZ+O!1 z2E$Y2{4o`< zB+uY@8w^j8`*mm}_wz}U`~D_!pU)WHYglA8(G_=Ud5rK2PrF*=Bgb@OHzC z6$BmNv{+Qu$!|M!B7+!C9 z((neuQ{-u^eExAA5 zDETR$%KT&G&*B>?al`8jPmqs7Pd#}Lc+&6&^2^_od8Wu$hc}Y1@UG<3hBuKv`;O!@ zGGc^uwG-U~ei@+k7{d&E)aJr9VsV`&-ECkC1$h{9&wHE4lB< zlh==so;LD4=2IYVLB5^5{xIn&l4mi`4st)A5_t*Zc9Q#i(5G_$7tkLfZ^1f*$WYWO$g|_t%iO z9V+V_A@79OlGh$4`6ziD9wRTpKfT*gh2XW@Sj# zw;5hAyxs7k;T?vT$o=|s8Xklz_p{H33=bP#V|c{yTEnA;#|)1fUT1j1@Os0OhBp|V zGQ837wBb#LXAEyPJZpH1;W@)w4bL0iW_ZEycEgK?cNktWywmVt4P*Zs9yYwj@QC5H zhDQyL86G#h&hUic^@b-6Z!kP%c%$KI^3JVr{U`U=rHtXthGz|LF+68@D|ul{nP;Bd z&$Ep@yS3yCoj z;W5MGhSwRMFudOIq~Q&Qrwng2JZ*TB;Tgl54bK|hVtCH*R>Sj#w;5hAyxs7k;T?vT z4DTclc9PpsuvX>u|KI&jUc&7wOz!hFhDXT#xV7ZICu(@i@VMc1h9}7VeCo;le3FJY z7@i{c{f*?lKTY0&b#5Z}`HbPshGz|LF+68@tKoUW+YB!l-cIh546i5efpzfj&*UE;`gLfa z{N$LdbBf&O8x2nz-bC)tV}{)KHyfTMzXS7ZA@@Bw!&?o{8{TGkfqYxcr=8r-r)YSG z;U)49a6RcH|M(6({#mDT|F1MoJVf4rAEXEyUSoK~@LI#8hQ|z#8(wF4!ti>-lZH1K zo-(}A@HF{QtbY@^U;m8Z&4y8{S5K;$4z2ko)6mH@ryx4|+Pt zZ^62i$fI}4xSfXMZC?NVdB(Tz#r|Kn@^;}pYy|aV#qgZrt>nuwZl2ta+h%yd@OHzChIbfVGQ899 zpr&%4``dNM@UY=EhDQvqH9Tr~%<#D3b%rO%>+g}jv26|HDKHq3~ z+VCdwJnpYEn^(yzjU(b-?VZ&?4 z{o|+zx$mzvJZgB%@VMc1h9?ZKH#}*0gW)N|8x2pBUxwRJ6ZtZDhWu6BUpJGVgvTdY za=-p9hUW}#H9T*4o8bk++sXaor6T#eIIa%zG_DUN^4qa)o#d0?!TOc^e^3AThumK$ z!{kR{J~iZxx65@kLVk3!crE!Xc$D0quNb+XPn^7UzVz3Tk6R#~Adme|yqv z-$1@4#!VUCNIvW{88>Zs6Zvq=GedqOyqUZgJWKB9*+TC7bL2kXO1{IV@&mGY@@wF2 zKj6DT<^J~`A|Ho*nEZ5j4f)RS2>Czr zWZYWvMer#3Ja~-!EqI)K8oZ9&_aw+~LcX5-KzNee_cV~NjC_jxvbl1+jpV1o)8xb9 zP2_vRGvwRAo5?qWXUY4(TgVrDDD%vbx4>J;8{v8K?cr_YOFoeP0{N5hcJk5iBKbz} z4)SI1OMi)cI=qwoE_kqE<^DepKX4x+_vbxK?)O^_`Dy5hkPnB~lE>ju@~z-8@(ti| z^4{<|@;}~_^+}K~h1ZiWf+xx6!5hfmf~Ux*!5hh6fTzj*IyaF&iF}6qK6o>^zkOxN zZ$!R@+}|#88@)__Za=)G#@{KWWGx-6tWgW8QA$SY<4R`~R9Qg(C zR&sy)%9HPdd>i>Uvt&L6@~QB4@@L^i@&n-=BB{hj1KAM_8pKUV1aw|o7w zzaI>dABy>e$v1`9ko%qp`8vqglArLL%riIekZ(z`~-N8+&}JZH9Swg zCVJY)Z5r4go))hoKXbfzf_&6d;`QW1;7RiDS|r~<{y%t%+~0m1 z$v;FsP2K`;B0n9TA>R_-OzzKPmfWAm7V@6x$&r8jq#SQ6`Lpmm`PJ|?@+08|^7Y{D zm8cnA6I@Dlm)@J{jwJlM2y|Nr#3j2kjMY>F;^a?lCU4wWM}Fj{;tBFN^7Z5!!IR{_4wRk-@(#3OSH%$c#=FcNxXsl%9q4bV5U@d)|3=&2=NtzPm` z@*j>AkCDF*kCVRuuOmMQo*>@_UQfOTJV|~O=Gj30>q9cn6#3ooM)DgTmVBCg|FguK z$WzE?3~weMhi>WPly-D$K!b0$+t(oNS=C9 zdOFDedPKZLej?VtlYB>buvz8)fBiw}36Y-x50l5>HHJsX|9n9DYsr7VUp#7f%<#D3 zb>v^(C;bV->kUtmpPQ1N2J+|ODe}xcl5Zq`zgav@KKvZ(!z4R0|# zXLu|5)%VIg^W?dS;%$Z($ag@#ojjNzJw@`5pBC>Re*|74KLg%LJ`5ggUb+AK!$ai3 zco{crc#Yu^!)pzX8XhBG@|4UcPCg!9M}9CoLB0rY>|Ia3E<8#86|O%GC!Qrg4cQBo#em!H)}Bx-of@VMc1h9}7PyEN22Zaw+XOT?4pvo02IAouH*BA<@yb0hiOtEDGRemuO1 z{E90jpCO-ot#~teKX{h>Xm|_xo46h2$QQ#~4bPLGhWoWP^2qt2?sYC0-cCMhl;n%# zxeLTQ$j^tD$oGMFlKb-&Y*D%Y*Fio+zV;XyH%z{Gw0Mo-5%M9(*OG4tkCGpJk@UyN zXI&^BC*J{HM_$5lCCERxQ+n#j{o|G-c^LTy!&Bs^jg$UH^0&?qPaEDuzAt(*N{W0eypenjJbq3a-bDWJ6*6wd z@Md!V_$^DG-*4sa6W&7J2+xrx>m=VwzWF}ldBfWbFBsl#c+v0kLmAUT=7k-0zdL@*7qNg0`(? z9h;PI-$f(va~B!%6XDI|BjFu`E6+>rF!{Vhp4_Bs@UD+e@@%B1{DrOLKQ7gy>z_D! zLgXcQm^>IRe?M>s)Aiwc-2YyJd4|aS&+XKZ`=8H=kUxi>TJqQ6QSuMqG4jRk;JQBI z%H4VC#CfSx?*8|{HM-+Lg8V!5*DH5D{^xv>%H99|fqVmbAN;&QihLlvk$f+B6L|_h zx0xaTR;C{`lMhEvmi$zBi*k2dk!_@?Rk{1$(a5)v-wZF1KLJnfD1C09oYhHDs`9|e;Do-mPr@Tq|9m+GxZ&%)|d?n>s<@L&2l!uh(l;5hnRr$@z^UCj1 z-ljaFyr6s&%WEUB%~ZKIqD9E zmH(s8d#&;nRew}@Z{;!N`zenr-&c8^@?pvo%2!Zcue_)7wDPR-Cgl$(&nVwpd9(6; zlxLN1uDnJ0+RAgv@sfq^b#7IDiOT1d&sW~2{Bq?5<@gqRcYnL`D^<0VZ&CiG@|^O`l(#DHuRO0DFOBM+XPffbDqm23q4IX+|5aX8K3aK)@{5$0l<%*+ zQ+b{8U}$-tAE-Q}{CwqM<)f6>C{HPmC_h(ut@1|YQRQ1Gk0}o;k1Ic1d7biRefPM->Ljk<-yM7 z{l8dwNck7a!^(#%uTh>>9#MXy@>=D6l}DAgDUT`tUU^*kOyzaT-&CGZezEd;? zK4InCtDYL=TPu$!@1wj{`D)6e%CA)(Q;r`c>Yis@`2v-%Q~slxe?oaldA;&iR8LZQ zOnHOyU6iMkU#7fK`JT$t%GX!kr2G)&8Rge0Z&p4=c~&`o1fqN0T9gk}`JD2DmA5Ki zqSmcV`IahQP>vr_>mIjV`5=`qDqo_!L-`fTOUnBx?^HfTd9Z8u@ZFE+cT^ryzLWB> z@(q;NDBntXMER=9Yn88}JgWRVwVpBMd#HR|`R>Z=l<%rMq5N*;^~$FyPbz;}d4uw? z%2Ud3QQoM0P339j6O}h9e@1ym`8R5Pnw6ia@>%7lDQ{7Jf%2U4^OUzLpRPQw{5j=q z$`4XrP@YiUuKXtDMdiP$?@;8(RyOsCG{7K~z zlt>7O!Q*mV9pt4sGH!`Hyyr^Yf1#5+?|%XN?$YO;-|Jpy^oPiE&q*#!9-b*)!#+di z6Cp3o7Oy3bVB9Eq7URa1yXUd%@H}=Mc_Tcb+&y(YZv&ZUJ^4@YBzfNrCEq|k2%aL} z7v4yI0z9p}`}+%+XA^lSD&uCz>)_4g8F-dF4{srlZY%vc@>X~&c?q5;k8LMCZR8E` z0(lF(oxA`qk_SVizk@sqFOetVo#YvKu!r=yeeU+dJ@RP~GCZu@ov&8()R33p5%MU$ zUs6l%zaJAN5AProijmjBS<0gKRJF&3gHRQ=BERbSs+h7EB)={c^p@fJcWD*d1N`x%YoA8&r4)y88=K` z8ZWsT^3+htN63SxC0|Qk_(#TVBM<)~`=MZXJ9!SrRV2^&<2AfQp4?03-$|a%$^3(Z zD%U5ur{qKAS>(gy0q&P;$V<1$eu$8Vkxwgk*VO>ek2jIW;2H7;cr&^GenXbrKfm8X z9>VjIIr2JqE4hEZID2sAx+RX6^WH*U8YAnFBQG8&`Bw4*PD`G=2yY`V!3*TwUubvz zS&2O?^XVin_7x8fkwW*Gn_>DR`8-4($Lp%YD23{i1!XpVeKWdpEi=eA0z(_9w-01M)Gy!zhFL1 zhsvM(`P{OxeBMGn4&Fw7AH0J+v6}RR4y)`R2CpSQ0A4(|GVkAytVBL(4aucPRpwXe zE1x%!KZ1E?$k#=_pxiA@^jEpxX=guA`itZdc!@l{y6e!m3RAaJl3a){3X9`1w9?)d%;WO`@uWO|CGyH5L_VR`2BMr@*(o0;9>F; z;WgxE!XxCP;8Ak_eu8oGn~_hD-w#ic`|D?l{3+zq>z^IqVe-A;5%Ll6 zD0u@sPJSUgL4FN9Nj_bs7o^BLX+sWU97s=oJVCw;o+MumPm%ZDROXQ;UmczyUmG63xN`m*!0X62fhWiZ!RyH% z>4)_sAB}ZxAm182&B}XpRpeF=br-cLcek(YkZ)Jso!?Zx`Pre|<>SZ)mvq;4KaJ!3 zsWs&D5c$E#hslqDN5~uC^~&9R!sFZ(q3h>0l)G^+M7~+M%a{|m0XzIKYp$upN5_!`J3e%aGrQd^7o2c$WMQcni6IKeZhBeaN?xKMc>4KMijqe;!^Se+Ax7?%!vv zNInbs4)PD+CGz?3PV$BD;L4!;!(V^CgNMkM!NcT#z-!2R4V2ypd0%)fc|UlRd;@rl zygxinzB#;(d@Fc@dA}Kei*!&{786~{A73w`I+z>c?#Z2ela{xel5I> z{04Y|{C0Rd`F-#r`6KWS@(J(~`3vw)@+t7(>dO8920TPQ8y+TqA6`S=4v&y8gx8WU zfk(-Ig2%}JhR4ZQ!uLJv$k%`;$k&J0lMjF=$p^z5$ajXP$m`&Z8{498e zd=$Ky{4#i!{5p6G`B-?4{4RJac@~~0e-hqC{ye-uo`<)SzYQ;ve+cg&{{&tlUkL9c z{{|jhQ@Q_tg@?!keE&U6z6!jCd|h~i+<$++mV6-cQSz5%OX1TJnS8QSu|h8p^W;h7+sGq$-AI8vcf0hrlgE)SlBeJ$^2CNKbgxe*d3qb^ z53VckAGe;#>%~Llk!!`nQWL=ub2f;JsL*UKid%&~g`@vht4~6H* z>)}P^?z&OJ?Wlu1*jVOYA`ip2SW*7mU8UU0$K}&tAH%mmz~x`*`X{@U{Dl(?f5`Cn z4FAsXOVsPM-8>^Jb^WXB-Cvuc<)cjJvzUM;VXVxJ-?gbM;U&D;g1^r>}S=-ecSM!pI6WCV)z+`Uu$@@SnhZ0 zzps26++p~KhM%)g{-V3Q==FcV@K+3fZ&A5N&*z>m%C7rgGW>hPH~O-A&rrih8UD?( z>ODPwt?ok%Kg94Me^l=|%kX;)f64H5@q-WUe7XCJsQaI;kJo$1|G0m$yjT z^12A;d3^u=x5q2ppWnGH)qS0(%C6VBc6{0OI`3ond4}I=_)NopHGECHPQjvf-1@sNOTr@ZM)u&u?P*Sr?Y` z`uq+YTj{^xc$eN;c7419?yBym7(UMMoZ&t3Je=FcdfXv~A7c3RhF^`Zpoq*zyIp;1+bgHy9LJG|8#vkwocjI`R$OKXYj?km0p5xb8Ok& zI;U|Remzy`{yO}l;j4|Ro*!oTC5He0NV!Mv&+i|t?ki0!yWS_88h(u7HyQq<;W@mC z74M&-;eQ#v_Hel%bI%CFuQmK(!-pJR?sw~1!1ezS!!I#BKBC;C*ZD5PXBxi9@b!Rxa71%|(TO!b~04ex(! z_55yz?{Qr9{4s{#WcZVY&pM%c{}+a@k*uEI%JAb1A7gmSxXS*>o?V-+>!Z`~L3dWq zpZk2--M*b1>aGdac&)mR*>|PxfV&R3D}If{gO|zU@ZS4Z=9_RmUw%Z{9pznN*GKcw zWq182%iT&a$?&_5E9YHL3wp+mtaSf)_32F6-9v|btvrC3W%%H^vLLS3T~A7Gk-9!k z|E271T>tgO(7(&>@{Ra9VuayK{we46{5J_!cEfakHLZQ`d&;h_ZF4yf*_1FQQ7 z2bcW}+49}T-{X+7yY-1+qaS=j+1=J`bbr|OG2qs+>)TP>@E2|`=XKA#2P!>+{rt|0 zWp_I^vYqVPZwz1YrRw?qhVN$hQHEb=_%*HNarHVp^jg{7%>DbiPBHvr!+Xst_vrl} zF}&XJjN#J^|J3kvJ}A$}oyQo?*VGTo?&g`?vFl%5AMJ+!V)$1dRrcf$ke(IhRrfu~ zg99ahoZ&Z+$K#TJ-0&|xE|2TZ@61&tzqq~Z?)>JS65rvIvb%Li?JS{{CmS!?o++z zkM+v#&dV-XpN9XG-JN%TyjjDi8h-Vrm6L(cQE{)%c|$MxxBg`VEDzE>iN42pK16a!w-18-0#l& zI;(a4tLx)*!>=}czbC5qJgQvphtCXO?a6YF&TnD(Z4=9RH-G>BHqRJ7?Ahx16AjN9 z{y)Qq1ovTVov#G5jpUCmTM`@ShAn zd{XuKJfK{!!+VB*XZUulmHqzxqpmc(VE8|V4}YcHujhHL;nS77{pR2QYR$>z9_=R@ z-lklS`=#MK)yf?)Ki)Xq@T(1+DrMzn$U3?=I)vI{3#+ z-y8nl=5k)I&!vV>GJLV&J?^RAKmCR3{-@zvzF0lKpW*NSwtCmmm%k6_AAf#l_y(QT z^E(-SR-?Q@9G}Oh4WDoLZ-!qmv9dpYPWRyi&yXjN6MrLDJwM>N>i)@lWq14JZ22@; zX83MjmGgR^9BufGhCg9=zmCfO0LQgjsqAi^H_71!yBa=bRe8fVe;pWz{GEnp*Q(4P zhWu2+S6{E3ckAHaSK^p+%ijGZYgC?>9BufZOgXQQtKqIne;V`Ye{b3K`k!d{ZH7N% z_@mRR_s=(c)z_-$H#hv^>DBY&44+~6UxwGrsNVn4oa)~9o$9`a;l~)>w@|%jf5XQZ zey8CNe^kAHq2X)HtDfJ=@CBb$&u{p7bwAMX2E(T;tlsmd;ae`Mp5M>#J-(=(A8q&@ zhSz>q?s2zAe;wGz@aA6f1~Pp8f6?%xRx9USzkmOkrwos-UOj({a(x|`W%zG~uhqBQ zuX_d^UENPI{C2}98b0-^%KimIrQr(< z-{IAAk6zD{3?FOwo66mMPQ(l47aIPz;piO%G>*Jba_y>k>oUiP^ zx1XH%Ck^ladO5GhJ=E}X44?Z(xyP-;X;{ya;SW!*p8rF+p3mkp%6aXF8-Am5H=koM zpC=4|!|=}yfBDVwe02Zsh95MuoY(We%s^>2>e717EKEE5j_TqBC&QDP8 z_M2ay&AzUlKf>_y3_o(cHM?5n>sHslFV^RL!#^>6nc+{YU%fxrpzQj1cQ*V?!>=>^ zs7Sfr9hZOK#iiu_eHUNatekiA@vnQoXY=a*lHm)<{rfilU0d1XpC8y^i|T%=;a3{o z8LQsYZ)kPj$MB@#yVaL_+hrnM@JCK9=kH3%Zui;}2Uu^i=|Eu1=C;3Q>dz|5841d+|Z^%zZ|BA)R`FQVd_+f_c{C&B{ zt#k4aS?5pt$sLXRde%K(U9+iM%^>*I@HN-2p5NN=^A9iQ_5R5io;Q4f;cLEH?sxma zKTmk`o7H`a;T?UEv>D!Mc)xe5_ndQ-Trk}{yPy9|$iA9*G&ye9uN+tDnU}i{Gx*5x9}VC4?8=_# z3)1tJ@^9s(`rUu<*2v0y;YGnzg`BKWT}?YoluT!K7~&l|}z`21$_96ryI7w|cjwR;B{Z$>H+|c^;o{PhP<1b>u~Sek^$j zpI=HIbr-*`kH^UU>*89;GkAU19P&K;OY$PT55{qS?EXpMHeXAQA0rC(Ac>+F{ya@L{FXiWtmx~9zaD3jQa#;;($n)?Rd01YK7#v8RfhWm> zRo&U@`ZX-%8F+zRzU&PKV4eIt<8n6<#K;SBIsNzi_bgtw4~ zH<6w;@+5o-c>x~A^}x?RGC+EECHHT$00(r2t4J4jE4JOh7>JO?k3M|PB+FUjNZa9{az zzyH(l0pwYDj64TFg*?2I^y1}F|E^CGelz9$??Z1P_rC{uDtRF${R_yGL&fp(qJPH? z?=0RcEdTY#8;1`d&%_KSrM1Rq}1*@!iCikmupyHE903%jbj1 zGw=rT$R3ivlspa3kQd-N@@QOo@NLY0*Es=ir+gN^gggfi)|5VfUh?pMZqtUrJC%js8pk(Vo^I8Ds7~rqEe#GZdB|>IVBb4 zt)`7yDr)Dyu|32?nd*V?yyi+`*kBS$sLw-`cqA!R? zuSb4aJf^RUCv=CuubBB$db4;=Zxb)*o#GWe6tC$6;?AjwKF1 zO6ZG{Pw6Y-=5vb;2VySMQ}kfFMZBc9i&ykOyr%bxJ8wY$E^(JWEFRL$?~!KCh(0Cx zggz&3u4lh2?z|E6tc$yJ_j&g7W3F58i<|4phvLC$c>I8PL{G)*5czrW^i6Q{0e|y6 z1aF47@%LuqIXx7w=>y`<>F5~}cj>d@VK4F<;?7&(jr_gb%;V7m@tEE#p3tYni?^bG zPW^50RdM(2@J(@#-o*C<%$xs>LcqtyzckulfGf%Y(`CjqpopAGhjLDbudC3PCA-^GB z&>LTf@0*^A9*R4I$W4hC?}G0Uci#hVIK=KR=q=(-jNDG~h&~|hycc=%K8=|_r00_N zE5n0QK`6*t!pc3y_1+pA+}4L*86B&#W6=4{tdf_r`;dV%uEL&A5LPd|dPNY4MOgFCNj&`-rAL z9!I~q-k0%&9`b!hE?Y_v#$RM&d>Kvjc4>Wara-4?-5Vvv3N}%7mq%P zo>}pfz9^p2SHvs2x$cdb-3hAD>pCQ*FUeLS6gFBGlC7#k#@%k?0b8&A9z9gR0H^rU1k#9O0 z_vZC->E``);~u?3@;*HjkLY9S_h7vlaeo?KhzIl~@sPeHUejCK?fnWqjcxPy0A|0; z`E~{+UoxMFJD)+%w0KP~#La<*E8^aL=&8jcy89A){({~v?#>|BBc9O*#r^w{9~F=2 z)8aY35)U3g&xUyPS$NY+ac`dInBFFy(!0cSdY`zLqj$G>LQlmrdM@t#D|!~hUHY=P zM{hpH-mi?_E}ql7#0z?#xbtu59TX4fv*IOvMcf>hRg1@;Lw~bx&tK8a-~X7`E1X4c zx8!5`q_{c0D;KYr-w=;KkNzG1$DYUkBDQ^TbKF{&c*cArUeJfdD|#xP%wgSm@ru4I z?$0Cd{*yg_PHz=2=sU%Oui)`L;w3#2ujs?#&V%Sl#a;TexKCddFX%g7X75)~V7p8G ztMC!^ufeCqy@%j?#54MuctLOKz~ju%XSIOsc5(0P@K8Lb$Kn-zOx*njdUElKUW$9) zM84_exHofV^e*w5J}zD^;_>t9--fS>*AK(nUSY56eiz$a;vqc}kLhFL_4m*-D;|~b zHTCbqn~%l4c^>K|Y`2LgKZJ+k`H$ek;?aM>GjVqr-mnw*X5He)*zOdMegYp7cYg{W z6A$RK;^hkRE8_0Y;alSVf5Y8Z;@-@e(L2Pw3b_Gs|9{{^;we27Pkw>?in#YHc;l;Z zZ{|sUgY7QyY#rVwUec$;i${=O5ltYaBp6ha1+~+xbtWDlz2s-6L3!nK zU(vf;yr8Gz?iTVh;vs!eJf*LR7xad}-Y@3~Y`2Je^mcKd9*76@Uh$B=OFW_vi^uc{ z@svIzUefo7drvxhzt+TK`j&V?Z#fZ;qm6U1JhH`cS|0h1bF)R zbMcS|(C-m1=#_X$Z+eYAzq`*qd!bXjqz{Rw`y!u<$Go1?ig-oe5|4R+fA?$cdCErg z4~wV!!zaXR`mA_x0P@S?1>Nnk*A1V8e7kr`?-tMLgW`S@dd%?``#!zQ_RZ(@sOBVJ z(|4R?&r|*#dUlCdyiV1yxZ@%}AzspF#NB^Dz7UW95pItAcxL`)_?F~DdfUnN{Qh&1 z9}=(m0ghBWcs}xT;uU>WJU$5d##8Kd>x1E*xVesMx48F0SIg0G0z zuSCAB$L=YPgYOovJK^Sd88eT$pw5!y!vOgW@r>U5276uSMC3cgE4n!@#;hB?2KhnB zr}Q!LiasMAy_WkWUeZ^^!!G2_@iJzf@)UUM8}0q7={@4n>yV!iFHVK8iq~&|H=Snp z=cmDa@i>I{iRW*EPm4#V!`H=Yx*OW-roG5V;%*;&M7*NUh!<~1eo5Rv1Ma-ZUf1o1 zw~7~M!UJ*lEO;cI(8t81vyq<_FCzGoxPK13>CN_>Io%Vl>HXrxx#$@Zcg};)i+cm` zW$}P+j&CwQpY8?7x1Da!>0Ai!5-;gP;=wzS9}|!1nRrg06?ZN|&!Tur-w+QkM!vDv zp5GgUw~2>zbKI7B9{hJBzgzP0d*GAmF}x6W-V0wA_voE(vF8jfL4H`=e;+&*kLYva zCA|{QcB7}^t@gU!rSKNhi|8nGK#1pzXuFbqI6}|Os_Wacl zdWOa8E8wZPb0vIA+@;Tp`}9&gps$NZ^rk+0PUkAD>xpOdK-@`?kHkazuy}Aa@|k!_ zUlgyeL4I94xfb5?c6)w*1l}oL(?fCpI^=hYr}SJryB_%k@q)f49^8QZmUu*Od51lJ zLhleS>Am9aDEedZfS!u`HzJ>lr}RDI6@6Vi_z-%U&#>orKLXz=UebHS{f{C)AzspF z#GQXeepx)CZ-}S##(sNFCq+-2ctGzKkLms52|X51=_BG9eL}pV&xqIbRrQZy{^m37 z{mO2F2jcF>;l1KMeV2Gd9~MvOlj0>k7dIc!Ul4c4F;6Y-+zf9x%ib@K-Xb2*6ZKD` zXIwm{7veR2N!*!4&!%`pZ#mnZv!L%1cW*<_sCYu35f5)ieo4HduZag4@>}8|eMe-^ zS<`)S?+*0r5>M&F;u(EHyr$2I2X~^s6p!h(cuwDOj^Vz%hq(7G9p$&47ZT)6tAA(oZ|75@KJI9DY)}4yWiXUUsuOz7LVxWdJ*P%&iC2=C&x)8 zUp@<7ir3GEH@w?kH~$-Wr+C~59~H0YwRrZo$OrGS`?F?vuekGEcqSel2wxEQo(FG_ z?f&o}_>g#VFnnCRq8H-s3y}BTYxjGHzz4;1kNx7&i{P8$&SCJ@OYHuF-X-p}A|Hw8 z^h7*59QjFc=Lq<$xKD3+pFK~0B=VuSxejk49vp@IvUvJp__}y>G`wZEy>8YH55$v~ zzz4<4m%_)zy<^~8>bxGSd#Sx{NbeALUxuE3@sKChip2|hD(=1Sz;wgPZJfr90@fqk@6i?~q^H|%d?ORT7yvm;6;R)f|#WQ-3cun6e?w^Ty zCdFg=ym&>g#KW`D;|$w#=JXxn?%Bw9iH8wX*VR@tWR{*!|IE z$hU~QL-0U6y8<4IM_0k8#p7XkDIR?Q-gvdM_iKA=`{pI^cJY)RiaS>$KPg^a178r& zu7$6Odn0iF8hf6K-X~sOhy1vBdOdtg+#Q8?Tx<8I^nP*wM&zf(y$`_`#Y6gr`iGG> zpYPn>+P>vu@Uanlp7Nvc6>kh7IB-?-0-Fxp;OL*4+}1rr;en+UwTzLGko%d2bfpDW1|J@#6EykBA3f zfKQ8iUxc@Q#9lZ0cX%iseic5f{x$fbc=-@~L)`xseC(t4y6MC4Iq_%@d_~;(4tz^I zrMLaF-5-1x`5y6_9*cWCk@2j!|DWhtRsR9pP3?8FCHPM9>WA}ctYq@Bab$N<60f zAGiDCKO&!t2Y-RLjNAG23HVNN?@9Qic=;5(;byxh;fbPK#dEqjPr&x0w{P{|@3*&L zSn~1n;FWmU0`I>?);$P5E$$rxUlb4N>*9`wynCzNpV4=VCx;3r^yW|4^8_zP&rb1*J|dnTi@Z6Xfq8uk`hw)+ zoya%;i@k3AO0FyJy$aqd9@1m+l%9)c$8p_H+Uq7KzytB@)o^pZ1hZe!iST*JN3Ve| zi>LHWard>zw@lje#Pprw6}?Y9S(+5P?n$cN(L#qde-Dux&0{w44=@s!?jhqL#~ye`S5$Oq!tJ=EACzguf+2)c*9-xy8cJtBkC!9M!ck# z;@-!Q-x5#g?v%Z5N$(KPZbDBYUVR*1h^OQ5HSz3bc=z4*y45Z4LGk2Pcp_fXoqOya z_fyEXi#xZ$d&Lv_sCari@{{5veMvn-eofrF1KxD6J!eYq5U=R{;_02}84<7P6XNb& z$UD>ay3u{`Ht}Qz-XreZ56{KD2jDB}pM^Jm+Fm!9g?ET2Ux4?EdtZc)i0A(SH|IOq z_vvM}Z|OX|mV80q@fmxb;z8sG#r+?{=hS}=Z@ka$seTFX5YK)KpAb(UfzOLakFtNp z?)QHOZx^rWz2fc$@>Al$6YxFa`92MM7u*mp_k+9l+w*w5@Q6A8ih2Iy=O8~O`K$@P zEMEUDy!8RQKRyuNBVO{tCPU)>LCDXFX9vSq#l086J3ec#TOI zcun6Uo}P}L4RNm*?tMY#r+13y^gi*DJ|rHzh4YK2^jUG|t;kp6F?~xsrFVbPo6Y-2bE?&}e zad!~?i{d_gO}wBx|6$Kr(mnC?UFZ+Rqj$q&@q|7mp3!H;-55Q~;w63Om+U$HOOWpq zPu~Zh63=(TYw_?hc;~#`A79RX@svI&UeZhP=nC{WU$*;;E8#oDE4nXU)BDA}Vf2iO zNAy|og1#i~zaKrD;?4))-dF7T%d6o##VdLwo?L_cg!;Ac1##~>__}yOcOSIp@vcX{ zQ#`r>9*GB|@L}~(AUpm_2L9!ME-HXdT`w?mq%g#WQ*(UObMx|FGSk zKLt<3i~XOqH#j9;9sqCHWA|jwf%l3#&Fm2m4uTir8GTFK-GO}TckFfR7s6xpL*OIg zo(EqN_YZ|T-?jVm!{D9b&f)L@@%#w*n0Rs|JQsJ{;CsX)dM#ejJHKboS-+g~hzG~P zQ}LQUCGK=0zaXB{m&G&srnrARdYVdm&Vb$~p3-~8y%W%rh$r+t;@PW_-xLo&2=D&B zJx_fDd_vq!;cMdM-Ej9m?Vji!_)hVhJ|Lbn^fK-1!cCMcn%?yzNJJPxU?c zZt>y=>=Cb*;a&e__mr#fRNUR~*?WVPc)CBld0Bc6fDeefeehXvuOHsPh&7xV!J)>yb=$a;Tz%+y|J?UWBLy9gx(>Z z(TBvH1F`OectOv_EBcbS(}Eu7|2liW%>QrK^cHdV`N#+2-ofxO@#si+uHFV;5>JnU zyZ>X)6TTSUCGH*#9~F1n;mhLnOW@8g?Ec^wc)NH??-6%=8UpA~nW2d~8I7Pzx+&yzeK-Y)JO1n(6O4~7qm zmoI?NipMX6FN-^ez#AU1=ZWZT;+}_mk9hJT_`G;|D7^JiyT3Rb-Yp&<0UsBSj)GU> z{!8KhV|IUf9K2UN?}Sf_7stbw#QhWCPA&Z>!CS<0x;bz6zE3}F`&QEXCGVeto)z)v zRId9wdtI*w9*S4z!gqG$?L>4orq@pzy8_XbDA{r%w6 z;!Xp6Q#?8V?)|}D*J*;s;)M$@#LMTxSHztI;r$zSf7t?`5%&&(H~-PjXD@leh#Zw!H553_q(0&Rq^OVc*mxlcispe z5-;e};?ZfyFN!-My!p>|fBI(lPVxA3_^7ylK739*y%65;7rVc@8s05lj=*E_^g8&u zcyt52`LA}rcO!g2Jo+$vR@}QC?rhmT?wxRRUiN2R$GhRN8s7MX zy{?zTTg3xTzFXW~fKP~rUx&|&*Yq{cL}`Q%}EDqin_|34-vbmRa4 literal 0 HcmV?d00001 diff --git a/hdssd/external/linux/sqlite-3.22.0/sqlite3.h b/hdssd/external/linux/sqlite-3.22.0/sqlite3.h new file mode 100644 index 0000000..d8138b7 --- /dev/null +++ b/hdssd/external/linux/sqlite-3.22.0/sqlite3.h @@ -0,0 +1,10827 @@ +/* +** 2001-09-15 +** +** 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 header file defines the interface that the SQLite library +** presents to client programs. If a C-function, structure, datatype, +** or constant definition does not appear in this file, then it is +** not a published API of SQLite, is subject to change without +** notice, and should not be referenced by programs that use SQLite. +** +** Some of the definitions that are in this file are marked as +** "experimental". Experimental interfaces are normally new +** features recently added to SQLite. We do not anticipate changes +** to experimental interfaces but reserve the right to make minor changes +** if experience from use "in the wild" suggest such changes are prudent. +** +** The official C-language API documentation for SQLite is derived +** from comments in this file. This file is the authoritative source +** on how SQLite interfaces are supposed to operate. +** +** The name of this file under configuration management is "sqlite.h.in". +** The makefile makes some minor changes to this file (such as inserting +** the version number) and changes its name to "sqlite3.h" as +** part of the build process. +*/ +#ifndef SQLITE3_H +#define SQLITE3_H +#include /* Needed for the definition of va_list */ + +/* +** Make sure we can call this stuff from C++. +*/ +#ifdef __cplusplus +extern "C" { +#endif + + +/* +** Provide the ability to override linkage features of the interface. +*/ +#ifndef SQLITE_EXTERN +# define SQLITE_EXTERN extern +#endif +#ifndef SQLITE_API +# define SQLITE_API +#endif +#ifndef SQLITE_CDECL +# define SQLITE_CDECL +#endif +#ifndef SQLITE_APICALL +# define SQLITE_APICALL +#endif +#ifndef SQLITE_STDCALL +# define SQLITE_STDCALL SQLITE_APICALL +#endif +#ifndef SQLITE_CALLBACK +# define SQLITE_CALLBACK +#endif +#ifndef SQLITE_SYSAPI +# define SQLITE_SYSAPI +#endif + +/* +** These no-op macros are used in front of interfaces to mark those +** interfaces as either deprecated or experimental. New applications +** should not use deprecated interfaces - they are supported for backwards +** compatibility only. Application writers should be aware that +** experimental interfaces are subject to change in point releases. +** +** These macros used to resolve to various kinds of compiler magic that +** would generate warning messages when they were used. But that +** compiler magic ended up generating such a flurry of bug reports +** that we have taken it all out and gone back to using simple +** noop macros. +*/ +#define SQLITE_DEPRECATED +#define SQLITE_EXPERIMENTAL + +/* +** Ensure these symbols were not defined by some previous header file. +*/ +#ifdef SQLITE_VERSION +# undef SQLITE_VERSION +#endif +#ifdef SQLITE_VERSION_NUMBER +# undef SQLITE_VERSION_NUMBER +#endif + +/* +** 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] ([dateof:3.6.18]), +** SQLite source code has been stored in the +** Fossil configuration management +** system. ^The SQLITE_SOURCE_ID macro evaluates 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 a SHA1 +** or SHA3-256 hash of the entire source tree. If the source code has +** been edited in any way since it was last checked in, then the last +** four hexadecimal digits of the hash may be modified. +** +** See also: [sqlite3_libversion()], +** [sqlite3_libversion_number()], [sqlite3_sourceid()], +** [sqlite_version()] and [sqlite_source_id()]. +*/ +#define SQLITE_VERSION "3.22.0" +#define SQLITE_VERSION_NUMBER 3022000 +#define SQLITE_SOURCE_ID "2018-01-22 18:45:57 0c55d179733b46d8d0ba4d88e01a25e10677046ee3da1d5b1581e86726f2171d" + +/* +** CAPI3REF: Run-Time Library Version Numbers +** KEYWORDS: sqlite3_version sqlite3_sourceid +** +** These interfaces provide the same information as the [SQLITE_VERSION], +** [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 ensure that the application is +** compiled with matching library and header files. +** +**

    2. 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

      mQNsAz-=iJY(dH%KI?-*< zs85IAK0u$MEw#S?tBdrV_Ltx2O7%VTNfB8;NI6a0Y(I8n?L@$Du)qB9SJ8FBnC)ZB z`HGuAB0ad9-yVK~Kf(3Az}*kra24Eh^y^`4n=5JG4rCkS*^=%b)-!TjOTIzM{G!h| zznXatdx(ZjTEek~SNO~vma$T0QpOiZ8;r_W#`(a4qwhUcsn^5iTo(EG(fNiJ)<5dC z{tV19d=!Dopv;Zv;DX>rKbvcO=+^#I+WSEN{2!d5Jwn0N zfbRuzBy>>H5`NUy+a6Gs{k>w=!25AP?D5AI-f7j*m9 zzEF=9^1b+Oh}WgRMe~#Y6mLs=P0OYON2mI|%TMrOo63HS@-lZcdlA%ry4&Zd=C>Mu zDl}{VMfn=WLt;G~b9cDv&-_<$wy%i?@a{R47nO0w97}ioP#16+9f|$)r1UVjdYA(p zJOO3!=Wt_4qvC4ASlS_EP-l;(!#LW*!Y`Q?zw`{wjC788M?HJ1>UlV<=Q&CP#^i<(q=!v24MUcvrExDSNnLH z3_Sd!zni#HcydtrM5oH<{dSdcnij>cnsP(hjE{aNw_FC zqq@^?N?{*iz1xxR;ClG_j9?^hlr<&W>)xCz9%N$X93fo$>!E`piLe zLXkF}q^yGSjbJ|rA9#PRGU*fap^1a=uE_Y*DZ7?F;X&uZ%J^~W?}q8e@aawDC-&e% z=>xNWzu}>UIqq6=Sa&?f+HbkqGhFmX-I$I4WR&&6fVrVy;oa+k5v?kl@$_lY4E^6y zog*5m%SU%)L<8gW$D;C8HhF%ja^ZtwU_WK*K)*3_LCzXbY>e8T`fHq?4-eEgBu8e= z+z&iGSJvk_YrZPqpxTtY?P|a1*&mZ_WNfqdt4x2Jm+CfgTTFksyOZY&$fM_ZJUiiY zl5t$)i_+^Z#xJaA><{*0Ik9HSVJxmw8ADB;S(~|#_%(eSvULXiTStIb+{dyIHdzfz z+cDOAb-*Tp)j4{CT^z#BI}7$1V1X;|3E^5pxZ1Pe_Nflc7v34d)rW9~7ZIJ5{RD8e zf+1exr|NsvJUl{Ns{Dq?v^hfz`{PsU>p5&`zE#fo!H!k`RlaCF;E?i-VQZQF!;a3b zOp|wm;!;H?M9E??Ck(gk{(duu-{x#aN9(eRyU_TsKzpV7%aiNrgGLsiuL-%;-aFZT8WZdCHG%2xe6vL#cn=D% z>cKPqyot%Gey?*XC&{CJKSQ5Zzdy`RIzT>$B62@_kDT&R_CeLb53HsUm-<%KFQO-p zM@D7i=adh$X}|3Q=eBgCpYm}peVF*Hx64nPyrR77XY}oZq6?bM`PRxOeu1NQGVW=9 zUer5zUJ^c~!3XrZFT1{Of85nQisjAj%jjOCOQ7B0q`V)CCwCCP zCSMEsgL6R5y*n*g($Os$*6-8OZL|?{#b^Im`h|S|u6!C(!PTldpdTvx1b`PEyw4fo z+0asfs}~&fy-vN;^gZR$w@F5@SIv1gxn7@hJzSMJe;oKi zyfT*aT&uPde!k6@ie(Za2x{h_@KjEF2r>>*j23E10)wq0fmK<`8jG1}VAo2%4Ip{;zALC44!#JzbK zW!MI4L(#(ilmzLW;u-r>q$|$wVXOZ9q=#ej5opcJ_N}L8_nJdHb*q8q@0Mh90LPf{ z7_mR>!*deC%erQ?2XCj!MTfQB#o77VkCVj~SGj^Cw$Fxc6Xzj$2zi!+&S~Mb89V$j zlfN(I-}&KtbbnsQbEo$L$zM~`?OXBZl7TJ!)YGIv>q6x#L3@}kouoP#S&7m_19EKQ zw@ltKGd}kFW3EY)oQL^7LHl%wzw|Za<8Uqf(K@Z>lGw4P?alo@hfbHN_&1d~hrIHm zglF@a{cs+eIq}>Ul)yRSS`o`YyXnJUp<1%YM3fOUbv{<)Q|W+VyD7=O7wxGXrm9zWGzqQ%0A5jLt6ik{L-l>^_^$K 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 Ixm7ZIIC=2Xl-;|(YjVkh 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

      TDa(&5|(b^xa`h6ds+4g3}o~&Qds+arlxV~hZ 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

      p&WL|ZN>hL2(8iTO3?OZbN{{aBF) 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�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

      HiZ*+|Yk7`=n@;MVw}!hs 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%0D=ba8@3=yn<_Sa&F*n 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%0DE}Kv1`KoW~AT^|*n)-26UC z|ByWQK+OXijC-H)i9Mmoh{23|y3|m7VxKrY!DEFxsW-sg)P;MRzZd48-tYLCbo>+? zKhut%8OIND;O~z4r!TV3Y4~Se&!%yfPD9@%r)&I^`4W!dKiPAH6ZlW&OSns^BZo8} zIRG9e=adTdYsTM^s}S{25-h!qV?#JLB>R$Z3jayXg%Lw&g`81}e~+w^Q{Xw|0-NL- zSUTqjq+>*PgngDkOak=Mbpro_L*wxhWdxu8V?y>k{EA}@eFGW_6g41=2Z z7;FDDxe6|kSHY~IzX2{&-v-ZWj(FfXatu6Aj)N=Y1eo=Ybb%MCr@>2P%*B4`6Xb%w zPgVPu$*ArA8aW5%+(q)>RqA8lHSz?wPA-Di$tCaxxeVSUqvrc%zmjn);4ShZc$-`U z?~qrOItHZs8W0Jo95z;SX4+)mDb6XXGK2RR2$ zlJnqB@(8$#JO=J2Pk>Y80=S1<0;kDka4&fdoFOlQ`^Z&rmMk^tC)dFP9w(>36XXndk~{z|kaOTEavoeHORc8K6W|iL z2%aIAz-4k7JWHMf&yg$OdGaE-Lau=q$gAK*@&?ACOHdkkO#n9LpoCc@JS#S?I2Tqgo z;9fFvKQ==yfcwZLaF#p=?k6vT2gp_MAX#$EkvG6YPRq#By2Ck6n z;01C6yhz>#FKLc?;3_!=UM45NHF6htg`5VjlC$77at>T4=fUgbG4KX?0=!8sf*a&A zc#Av--X=?qJLD>UqfwDp!67noZ1u<+;1=>WII4NS0=JSqaEu%Uw~^!EI5`P!C#S#( zat7Q%9snoFd2lCr1l&cQ0C$rMcpj9~*8qDuGq`R!Fhj<5%Ym}yze|8;HRBx4K{Dce zMMbYod{&}fu|S>xFOrMkD!GjN6FqmK2=pZPge3eYb?%|PUEqwiPbR@*!B`=D#-)-I z)N@Lmqhk)8yaw*q`Z+lEoN;Y`BJw(Ck~-{PnbnNvjp~)Oe(IE(j=4EHPlA;Sas zI}yW!c&=y|pUoXIJcRG=FpOtAV}^%S#5X*GzdbjM=Ut~59>aG^7#>%VA;S~Ozt!-h z@^3U;z;Cb`o>Gzb8OHO3FB+c4vsS|;JcBhnqarcGWjr4m5pUo~7;{-9wzPv|hbfoETaH}Sg|h8rq!o8c|xKW=ziMUFCz zXKrVZFHy>0FdV`&9K-nhB4M}%-`Qd~ir?cf+^Qm{8pd;#HyUnJk;@Io@%yue+wqx* z;e_%(WVi#*;tVI1|1X9+@jTFQ7oP1H?pBfW45#o6({PW9>@l2Hk(&*pS1&N!htJs! zXO%x{xF5egWOxA2SPY|A8-{Z#GGTZ~`9C$B$M38e9#;Om;SuG(-!Psv{e$5#ybor0 z9G^`Xp1?b_h9~iUm*E1QNg774-fOss&o~TE$1}W*&(RF;;B$8JrAkHaFdV|OT*DrI zd)+X4{@sS7${#V@iqEPH$M89k;Wib?8;;|1CByB?UowoI|DE9uJkK#J zhP&|2s^MNw{06aM^#5B7PpZgX z!v*F4ui+`>n{|C@5zo(!KCL4A4VUn{!-i+@eBLnn|1QI`DsqY8Ipx1-cwR;N3|Ex@ z?}pL;W-q!F{eOhfmsI2m!&T+~!tk>4|K4y-`Tt~iMMau(w2J4kMqk7C-5Eyzn|;uF(Kl4Y>?fCQ; z;vH$jt#}8(a18IL7)HDo=TFu>_d&XuQpG_D>&!1ozJ>O%vp#1+cJf$MX z8!oEI4Th(ce~V%CyxD(x(DPq2dRh7AoYI4yzsKlv_#G?5^LS^*FnazU4KJw3S%w$! zd57U8yc=w|s{Fq*ysZ4+7_O;EhJ5*kzHYp%q}1h`zxOTmQ_w|=;gJas~tC7lJc{^=Z;bxx0fS z20k;aXC?(MYMV?NTq0+{tZilhJV!kbu8@&ShIP)2ff-L`0>5wF9z1{8eJyOR)6b)J z_u+Zeb^3YK?!H#AenzzW^;xifMzs6&D`5SMX!oDv*~NAG8PV?7Z-ezSqTSb5!TLGL z?(0{<`WeygY!V+kGoC)g+{aq=<-m-s5ApZ0R(*)AkG1MU{C%udAL8$0t@;Y!HJxu? z5nLyi!0eyCIq-(oFVBKEX;V?^M*6uNK5yi)7sBR7+FzIfH?;kYHKjhrI^PZdADh?u z-SGdh1@a=8Io@3dGsn9dVCFdKftll}2{3b<6lRW-824k0ZE^t294GT&#yN?6KgJv< zB?iVkSpzf2$p&~!$99UuwypW3ZSaofk0G9W6gdtKk-NYxWW;b!D|rMQBO`_>#xOMj z=D1U$bKI#Cm}5;L&im+J=H)*6pF(W+(f?Ex+@}3ct>QP~^s}|_9c8e7ZWg{{6g(01 zaCoE(JgNCD=+9z7^8j)$PHFyNJGe;R08eXvU>jT__k(9NPglTYve?X$<=8pR4~agn z8NUUpiWSX=J@5kcKJX%0{4Z(#Trapv7C+0H<=K9*M(zTykW=`*D8}%wh~WXo5HMr- zK^{6|_(1~97y@PtKkSCi7=9@BjNw0)!Hi+G4a^wU%3#K@hWUD6Rmbz(D1Hkhspsg^ zQE(SI22PRV;4~TWOmFF9e~Y}Px5+v14tX5k*R04};84I`7HQmY~^-clfxBog1iCl(EOPsn6>>(2HZ(K4`!V| zQvi2Up98bzpQ(X+sEbe5zmx>`YQ2;PXUGymA6e|Pnjg-B`^k0ifacG}z=LGTB}XoR zhsY8`p1chn*8Dltsysp#|D)sy@EExQ9@i|-z{?X3Ptr!>DQKRNc&5nWvq+X0rZqp( z1ul^#_ZjjWxUBinICz#UHgjZ&XP&$bu4sNta#o~*#n=h>6b z6u|6ly!)p<@9Exnwq2rQ*}f_``?Y+kLYx4y0y(I8R(q%-3@TY zvC+M);^K$%xEr|~G340jURCif=$w~5i0z08$ELuss?b^IJyEdUmsDa3%v$Yq}pDH^?( zdKP*{MUFLkmihqne&s)BboO&=4mzF{{FTw!!>xJf!^(fe=&Voc7<4=ns2ZKU+ByLp z&jFf#*q^Nh=BQw0@j|-lqJ2GkQC94|+oR zA2fQBdK7x6ikN4xp>FCi=qcs@*x0A3$D#L;6JYl6lfvxb=5nK(DN!% zF!~7f4D?CO2S>mK@&uT3bg&36YTc8VIY$Unh32%5&%jk^UiW9U8(h)+?HYJN^Ku2e zsQEi6a%f3&P3*ZYY7);f^#Zs?E`wLd;%8O!_e5XQ{QUuNom>KQO?__(yrK2`g*P>S zY6RRMSC!fw(z(Puu*W(e$K5U3M)KMn)hv1KZq+P#?T%@dymq%~mb`Yy$;fMWI~jTH zPLL7*Zm#Q^_(^JA^4i_0S@PQ5MMhq`xxYzXyHi@1ymt3!mb`YS$&yz;^NNAlCkG{- zL2VP{mD3#LHKaMnE3Y}oYgluT*9cksjFKgzaeSHpr6KCT%3IhUOrzEzLn*+hpXmrzPNBzsI>_Ppi)HtS)du>pPub z?jdI(&OJR^|HCl2m-aa@_lna};H=h96F=;S3$ow=tzUo|?%|$)S`w`1I`j{{;8AUJ zq1fp8(mMBqK%Wg_2vzd1;k;ZZtm_=A%z$h3QvmB)g(@xJP3m*a_lE;L%r$u7BJ?); zhkcm)>V-9Mm(~}NOE^V8tKdFIXTJEZbQR7!`Uvgo&?g;z%F)Y?&b{u!4cO~m3I*dX z(_VDl522X`nCG1f!5;UPfMeR{H|L=u!JNkng@+tJ%q#FS z?AT9en@5VUFKGQD1)iafe)G7WU*v)HdI>!?3a-*V3f4Uz!u6f<)~Uz9x^F{YhkqYa zDWA(+6bH9z|6i|z+o&hNNv%IR3+|$x1ovuvb_dM9y{HSEbM!pzMIYDtmwLdH)KlOR zbJ@NB>tF5$FH&CwuTYnm*Ql?8 z8`LF+ZR&NU_O@vKS>&>}m3jl5pxz2jQr`ymX#H{c-`lJ8lm{Mg^qixQY8_jk+RGf5 zP^-P;w26X?jt%qu$4%%Z+Qh)~jtz7F#}ViYw26aj+UA=bVAkQAW8hWVB*2@F4QmqE zY+0KYPuqM8akj8N)oE~)Hc4>1W5ZenHXV))`}~4A*r&Ap->!hu+D4wOwXo+em6Ihf!Qbbmhm^w ziaK)H=aDO5*5n%Wz&>3Q?_ajSx+dOt+QA(`4BmPToYefCHE<_+8{DP&yW`+)&9y98 z*UkHh_|d)R{l7doO&f`!SM&d?gEQm_a9_ZFi^QMReDnxd*V#Y10M>o0d5|`u50PiV zdCgJu)xJ@k``@mDS^uY_VD|IVsQGbQ(M$Vx$m@8Qe#U;rdhD8g2cUIT+Z@@Z)Nwg-3h#yD z9>;t}->&Pa_RJ`CI{S9lCE#^!A6~$pQ0X~R9>zLrTkF{K)XQ|u@!`KxFRyC7WeM*V zj%(hx31*x}b>UsXIjtWBpJz{KK6)5jBO|ZQkmmi+Upb=rn11jg8Txsw;W6W2`o!Nu zs8_dXn^xFg%9u|=pY$wiU7jsmHl|tb{V&)35IifuXPUt~pQj+NbO*VrB*W+H*T{LL{+#i=Y+9-7nb*sfz~1Nmkv`q&QC{Dw4n06b3~Rq73K zatT}{BhEK$lj};ok$Jsbff>)s+m!0>);2HiRq9R5<>d=Xy*aD(KaGJ)X}9n2 z475^TQ)-}Y-{-++BF*=CZkpCMcsEwv#QG<@m3nIzb=3K-W8^8N1`}lX9GoC;f|tms z&)Y^cpWO#$9nKyA)BoA<`F8f<*{J#3GkOo%GYjTeSVJlo(|+VV+g!oEAC;q@bLN$L zC!YU&3)gS*@11z|@*m`P;Tec|p71WbXJX!)dKdffT=dMlYTEy~Mer86q}0txav3~8 zo&y)i74R~75xhgLDm7FjuYecGsMS!Nysp%{LuAzL-8HVMZKZDExSdmA*02*bxrH_C zTu|y(&S@un-kQ;VI^pNmG5g-vtyQhR5;eJX8<%aYNxs*``*`kn9F%>O1*bZ zAA26+d@o}@uc6d!3Hz?vZFmR9yu&u!qV3NgQ)+mKTvO_O+y}bAw~yL)IB&X=IcWo_d?X|FId|Pli(HYU+x({+)18LYOJjJqF$x` zlJ*y&2mUIn^;DlyA7MPHN$@Il%-#5;=8F;YUnj`utG}Kg*OmGk9(xIF{)X%H62$N~ z4Q+D?Vz_gdyr|T~l;%t4!5d`gAMGQfRv%r|+|#AhT^;1SQl$;xL*Xz8_>&NrO&wV@U|6I4)Z-D=G znaZ;~;8rsHulJHMZ`U)PJTK0lr>Z>gHskKE7MSbgNa-$snx@I7WP)gHOub)!f9%!v`%h;yoYIZrlmZp`tCY-&AnFX9%) zGdEXc3u`{N6wDmw){4B$?Rp++)x>Ri9>#HNhxT=IhRADG%JVVS+YIFeDPY!rK@e+9 z^r(Fy`r2MeZoo74G2|{VYf=;|@*k(#i_*a5WYp(BUE~@Oe=4~hT(5jP+P=v-a6A0( zXj1z>QS-Nae>#;d);3+5PAV2t+m z)9x1uq>FV-ntx9}%aA+PNE|wjszObE@F+i?0`4WFD7{{C zKe$18xkKbY3mNtKiQ}~#dHqby6A2=}q^RZzwEZ<(>?1h;f2F3nTI67-YE~qR^s}}r z;PbzXe`OB1Pd|%~su4L9RDI~$&48DT`VX*Hq4R;ia}KXUUcWc0W>uTW9~_Gs)Z|a* z{$vxFapD@a{F$%%CwsuG?NezYe^sgdsRoh%)hpxO1tzR_FjT{*tH7+o(=}o;71BN+ zCUb#uEsj-a&>T$-uJ4W#_1}W{6MNMDa*UWJus$!Nwi8(A zms7=bN-H&p?bK{C+9omnrhu3xCa8VupqM6SDdSm4)0s}4w<8e4nf@c38v8eN7AQ`@%ois@4N+=+NDW1PES&tz?Pr;2Gh z?QQ7m>H%&0E^?f~TD3QW+tvOaVz@R%8P^d^*C#4>pzZZV; zW6Cqwb^w>VE0jO>i0LNQq%#3rp!UujG0kP2KP?o~&5U_Zo0tl6Rnrv*t|7zEZ2{%a zp~2_((7xr1dT;}|TTBaLmAjL{?5n!~?4!K~+(|}WMHoWd$0FT>V!EB<`z18D_p1F% zznJbwQ{EdRrebRLmWb(2j{DwbG5w2v0=7X8bw;0CzK;``daT({Xn^x8rbh)w0*&&_QS6Phio=bv?AdYNPQzY^R6!@mC4C8n)B-is>$cj;$Jh+ok- zO(ut!n!Q6lO=i^d^&Dj@=GC@AWm}(^S_+iyao~C~;@Mt7ZWPlSeq~3jnEV~e5v5{! zvxMvy(+-C+uIHFqsdx5>X=j$&U6>EMGSg7`d5^w_g?Vk8c&zPmE`LznFgJ95@+u_&K1OlQE9JVqX!uE*bY6*r)ahh~dAi z)v5Jj`Ym7WNg}30?PR~020Ucc;c%w%KTwC?tCS~Zi`mFfPH~Ev_lKBLio}d-wW00Z zG{qxkXP@#}@nUvSf0kFw(X^kFEas!*RC8_&xSS0AF|6Ua>EL?Wi^Uvkkn6yV?c7#y zGwlH}k4#iPKTgbXP0Hzr=Qz%R3&6)Sh6@cbpU8Zt`oX=b&p@1>B66jePij!U2>Fhw zB$tVKY&^L|%;U+^n!!P}dlST*Nc|;?5~{8FOW5+qoWoyyfI%F<-*A*O!a=QuaF&b-tW&=4OgHn{~)T+Zoj7`NVv! zU;WI+Sm(r&Tf}@_Q2C|`G0$vMo`ZRQW4&^I7dSu;iutB|<#~QF&tYFTqgHcD)P6JK z$!FV}F;{P`QTuJk>$Xzm!fY|mr+t2zm>04>3yZ}3Pf^Y7i2q+6;-e|Dv%@Ys~?&h6;)u4S4D@IpXT=XXtkJYIWCXFzM8o&hM(10+IDdfm}81# zTl1Pk+IzwIf^u zU+qh?#r!<;TIv(?I_9+${jOu%WwByjpQ8F@g<@{VBlnAWgGadvel~QHk?#wQ%8$eT zqL7hqBmFN&onKMSS}Pg$Z9e5EbH&`kIG?N%^Y&!gQJ>Z_ z<<(9x?_|1&jWZfC!18^!#7hiaaKpO0IV*LlSJ3G-U-5c3|!zdj$_t(x_y zPggm)6YM8pY(Q+EGnWmB?F*-BHXybyykyMnZjQwU`0s9`y-&fu=WW#1fUD_P3yM zCMmai#o}g;J2S-+!`OB^#d1`SYIfI&_4e7jvNak;90 zr(Z0i7~8vOdmQ_EHz=0)bk($Xh-EbAzF zWUp8}^z%OSo^0An#4@H?`2)XL##SkJ#EB)5_KyN$nGmP;kNUt}${#0*<&-RP4tRiE zC6-ee|HpM=Nutlrc(MG0W7LU$CpD=4(+sgBXOLUOavE#3Ck-4_`<_y1Smj{8SgxecAK~Xp z=JjKlSa=VE=|HSlu45hgL@YBqv@Op4TV^FF|BAZJVvYwh#ggYx`@wQ>85#M`sZs9l z7R$V1<^MK`!mjK*Ugg_xgm*XFdUK*O#dMgi^7*;8pgZ z-xqX@%pTP0Ma|3X>A+(db*ecjRV*8|w&pSLvyt(PL7ba{su}CSqZ`TObTIoG3;kvf z?E$fDVay2?V%b`u_VJx!c_mx;Wb+<`>Mk0y;#1*vnpKI#qurg>zIb`$oR4FI-U8# zEU|o-r+zMM2m8qwi|-lR)Ht#1rv~2>E&JP5lTj*`9~r|%jo=QoUxd7RIldRCi3QtX z=vdBtG5r4&qdX1${*+HH5zEi)*9-kGMQZm3#qz6H`I2%lHJ1d$a*#eR^?-TbU3>$W z_t(Yyz%6=CV94G^4%s=cE=3LdE7bp`ZDRQ^x1Gz9!R+g@T(SJdF}(~q{uWSuCdTDZ zCK<6E;ylc363bzS+Apsa%kR|SnuFzcYNpqV^|^jAV%yYyLzx&OMEOR< zG6K3#+Z!>qBLn0HG2#-*Xd72bM&07N$vtA={VYRmXTjen`k96L90y&<=d7R@$2ThH z!CyRb4%zeS#26i`Jli4037O=4F!i&m#5ggJ_CYZ`(1qIGgg!kP#(zt-7?TQA za|`sz@Eh`TE5?~kq&;7ZGZ@4CGBKvm=lm{kP&Etk#5fcAg#0Y%79$lk z3h_c{Q|rkoVw~+%E<&H@Aij{M2ysn?uMig_&WuXsJCW-}MdU&;E=g9tt3ixQQLBH(T^ z{LGIdqdp5N$z5VBM1LXu(h@QL*{F3mAsNiJRW)MV0bNK_)i1`KLFLB>#JCH6hwRG- z#VBFFPo#=*cZ1riKediY+R6<)8>Sk4&g>&18?hMF#LsWR^0Fsci~Yg!t(4`z7nM`LA5 zcx^yq74C`ZJl=>eDz>>txE%ICJe8iW~>Q>*S$0_-oxu&8n{+CyzZq@ z=MArWY1H93t(v*ibxCA8`Pta;dS%A5xW3Ql;*GUA;q@?$weWc__0Q#n*TyuS^M}{Q zH0nL!wK0wQvhdoNMtxg&9YW*znD82I#`BHgH3^M%*)qKTp|P$nye^`#zCi2n66R7v zP(ywgP@hc$Vl=^TsNb!I7+dqm zfleSJ%Qt0KInvC*0wUPI5==?Sl0Z0xKI zuS00;!nmBow!1JV)5yF1;dMccHsr;%0gbow!|Nm)Z`Xy_MmF9NjsHK`kG)eU!|Nv- z?_mEG%JDy#8}HW3@H(qTJL)-xeYKZ{*I+c-5d+s|G~Sc&+L*?B4dL}9jSr0QI+?}? z@WXWljSj}}W}6rvI<(&%@nU?!`Lh%AWKV(Gcfr<`ue=-k%g@rn>#`c3aSre96ytLb zHN9Z$J3_g%rGYUQhqz3PFVe}i;BIn{Sg#7`XPGBatXCW4RB+-Edv+n&Bi3wQbN7U} z>2G#kfA_?}K1h3vSZ8>SXl7)Pp}8hr`NTnR`VpQvK+T1C+`L+yr(c0Ub|RvzJ92$^Si~mJV$d( zNC#K^joH@)Sz=vTqWY9_g#Wh*$2Ih5nGT5j3%aPZMwaU}|V%?VEYW!CnqRY zf3os*4PxDqseC>3J6QjjsLxx>cP8TBnXj5$)N@w?xm>I`zdYpg2Gr->X60G+V*Q|8 zd3K{%JDB55DPsMIZRa?|`mydeEOQFQ+Q}H^bc*%UByF3II&|eJ&qd5#eaiEY%NL@2 zGv@qP^mz+>e$}q_TQbDD*Fnw&XOWT1ULUzwtbw5Nt%g{?rk`6A!0h){)ck9X-K{xd z{f4>RhB|!Ht8H)digjNdxmK(_$;ySPV*Qpe6t;l})IJ~cU`)wc5+PVl(%V{bDm3 zl^-Y-o7G9K5nE)1a(R*1qPmnHN)wx#aXyUwZfv{SAA`>kt;&_ykB%%P*NH7ImmCn= zD9*zrIFEH4{Vai><13W^7NiiS1;@T#bBBu2D@jG>Oz#`@kIQ6|rKQ zP_CL4$m^6OGGaKD@vKZ2+r*&SYw-Ct$xp^-Lb8Vp|H&<6)Zw&JW$gcKlhep`;3jgX z*iL6(Pxg!L45!+k&Ih-XtHm~jK5OCUOy*eICAL(?yc+SJML(;v!JXQ6HQJuTnym>U2ND_4#oTmd=_MrGsX7LHszKqu@%$4-2rY;`}PE}-RU4>-0x$K zJK+ERZneJ!`@>%4x68qUWYh%D=M44xE^>S{fsDE>9#C%giS4m!<@ZpZ$5=O9TeMZO zKJV3uZAlU}=yxe=^*&-=)};0ikk{ksWc2%ZP`LwhW_by@7Tiv56x$QIWYn{obK^r1 z+X~k3L&UbBQ8iyDitWWtfaP#<)PAT8 zTt`OkAF}Ns)b^uPwGVi}oWld~^KlXFs1L5i4%O#yir79$B3FQm$<<=p!};@jvDiLm zJqMxxVn8*2=7_Bu_lbtiC)n^`cP8ycV*8T%Kik26wf}`2_a>5?#TMvN{vXEuYtD`T z4T$aA<{`UbX%gFhoo|M%Uu*|z)b8jL+t2u2=>E(}@bin-+=#@s@Jo(rB5TCPYdS_$ zGFbhG-Zy0HZ&i&G_TPGyT^V9KR6#BiyJ)S9V;aP6615-GC3Z9QvBhFHXg@Yq>{i-G zREynStNOSSu}5kRjZyFuS*Z3=KC!!~IUY;?xHHs_&u9CwnaU@2i+yCQ@=5VxAEo1K zjA;S)Xzr7}Vn2?WF@0dniBL@@qu=9v+IDP$*pKff7m9s!s&YauctCkvve-|cX566I zPh@Q4q4D7P-(~v!$nI%T{mF*dPcq1fVjokkoR}o`gmmQzabh1wKe%_mKAv$-=ml4* z=9Cz*CuS?33Z76*E){!Hr}9LH*e6mmv0dzw+SESDC-&2HUKz>#VxLT(r=^HJh2wHs z8-?yN@TGZ4>NK{DE&-9)Yxds>R}lmc)axk>Ej z=8*@$eadGhi~T%~#hLJbKIa&|GuqSBRFj$`c6?_GZI4E32bejYl`ZxQ*%#unU)Z6V zvr+$P*k(dweR@FbUToV#90X%u6SnuO9>)>(Os8_X7u-Ou5c?IhU)U-3E7{l77I3v{ zrXrUa3Cb4@f|=LF`%jt?K#Z7>gTcyvCpm|_lfaRr%|MDv1n8kiqB^jE#S%>RAVqfG?`}MHj)2ci(SL~&%&rIZgAN#!_ zUF;7s_gScO1^c?GAI$kV2lJsaOa07C5c?APoQJW%x!j?-QJf|AwH%{6lf+&>p!T~& z?CVO%)nZ@Im`hOe2G*gZ3LI2T3Hp73Z5JWt#&)&eQzrJ8I?01#-$;FFx7dAcYQGnG zZDwBg<%@j_`@OGO>@O#&=6=+LB~US!B$gUn|MjW)Cu+=WE2?AID>fY;d+}o^KQTe`}Q2 zA%@@jmDi&V18vF;En+`R`v%nEPqu9w6#HKR)okn#`~O&?;$8 znRDA05Ql}iY)%6Yss{J2I*eR0^af+tTqlmmg77m>)-80nSd->NFk@~;obD9WHy43h$@SuhPA0dB<7ke{wiON9h<^m*+@39t zk*v=fvEqp1{C}eWO9^^Z@6W+fg8UpgFBx2<+ueD{-NTx^l_`!fv8rzsag41aBbS6c z<((y9)^=yFIK~yIeOHn=#>bFRxACRqCUKn1_;rY0$W>J-OCamss2#c?s?#J!6SFZ=2WisKU2{IgtfT-mPruP~-p zv){dlC!6ym&@GPKZq)kaosN8O@si8IC4aM*|IN;0?;*Yai2YWF`aFQVZY?HPh~qYV-w1tn zr#FIwWS=++hx>)SaJb))y-C~tlnEXrV|>dphuA79;0|)7I3Ca(tjc!Zg|SUQ?%PXLgJX5a8#>RexYx$<2KzcCAddgUYiw7vf;mQ~8shMKwe6|!>DPH{ zJr(+ITBwKrZ`#PP?;G|5`@Y1#*|{&mF`Hvwo!Yayz#U}Rd$Nz%dsxFP#L&YUW}(jC z3pG{XZIOr*@cr>2-9{o#Kt9Ff6Z6CGS&Q&cKM!rkpg-Po z6)^_aom;6Ni=1~3Gv{ytw!d-A>y}(F>vK!7L?q^DJhzsEX}`4r%rUwZbvT9da7H4S z^Kizc5^-vZwk?GH)NXQ_L?p4_!hl3fq|f=dRy?UzH48ivk;0l6RY}Czt!gjMl!$YZ z$t4nz#+nzS=F_}tzZV*B4Y^AqE-{qvivcs2`%r^Rn`m#62z>tu9a~!O$9QFOzTJ;H zTwX|fk3?L>IRA~YxQ2Z_guJe0Uk@S9nK7z=1Y>d|>$4bjn@xUfP$K5^s-_Y?^BK<) z#4|5d?MoZM1Io+du>>#Y`7+dML7LieA5_Fb=Kh2qYuo$O{&WG}Jc#8Pqt>b$I6?G1$zQPruuAsz2*WNe#Ca9#>enjPee|&{9H1+wH8+jy}9Az)<^J6%yfhD7O}aS?5-a#jaGf??ybk>9Z{X z@7T;z``hhUk26R49gNGn$>dIn2sSJ4Eyeu~b>VjeNBjhy!fowmj@`aYtO1sx`h9-9 zSCez22X#KgS_Ki$?;N`y2JxQK64n2Rm;lvIqC_6e;&5;d*`pxdZoZ6e$0afqO$*$+-V0s#qE4W+PpN z%Kc!Ti?j9*V9mUEwI3<~GhbW-jEv1y`#=lc1zM_n82(4}kr8JcbHTaO$bTr?+=%To z&Bb<9Io|ynGo-g2je9*(oa8F7`mr5jU`;`<807j=LhSg>EMEy}nvCIByx5o1r`&{%>G?PENm+{ zs+kard)8XX$ZH}9QzQc&YY)%>FZ_nwp>AI5{vn4x2~JTL5B;djMG&S#Dj zbMQV`zqXxNCy@&c)Hq492JDE#LyF~trnlq|#e-LXs#UYXR6seyx zF)j}<{&R{X@?nSC&qXW``;^a%!!qH?%ICxXqc!9vyc3vXnvVHU$-1StO5_F}JI(fi zotoq9W{GV4o4xUG_Kp42VC*&xYcMyq@_WQ=*oW8jm<{`@ti#NBFl&xyv?E_-oo8lB zF0xfo2J_m+YOXfKz@gDGUhe~^CeMP3J)8L!ypPQ#-C(M#ZzQmGBu~qxO|45;dCftZbL46F4_kAZ;_}oThxx@qNuZ&%Lc@M;h@?#B}vpJ zs5{?59CcZq+FyqMD-)DoEtaU9SmkY*5;e0}xn)qIa9kcb&a~}<|C^J@i4s*1L-tA3 zopH(^V2tjj=A(2l^Zlqqq82gVk5H3GTUGyMt3)lYP~Hdq@*p`+qA&(S{q74&)C$(K zr(2>{GUjg+Bx)7=`nC>SuljFM6Mo;fecuJ{Ry&@Dj(U=D1~EoYF}D3N67_VZYWAmr zJIEChRqH1suXbg-TO{hevLU6hN=`g2DS;|FlP=9lKm3Z&pIbN zBq&17i)3@E2`OBBD4+oyQMDP@}15+9g- zO(_(osa5Suy0>^5@+^R98#)#A2 zisLid9hd_*lOv%|BuDk(_<-zelL$Uj;B-~vdl&6)d%L!9v`I8LQ~ zw5T1|E1lzVcBb-qf8?9(LNF5ax!^RvP9&O zlauhBjeHtngn6L7KE6Ls9HZtN* zF(l$+`bkNY$m_|ec{m;=pXI=D+c4w1Rz3L~Y*R;((=kteBVT~F@xweQk;7wsVZHWy zeXcmCqW=BVOs&H)D>(z()Nmax!aRAK_G#R{W}?pC0`-%dD$Yxjm2W5(=VjbxZ%hDl z`?@h(oSEDfW~GSp@^aPB!ge=3m5lMaB1Jh5`YWiypQ^O z;PXD#?H) zIBSblUzsA#XF8Rari=5rX5}i_*Ci@Ho-Ixs-wch#@)&Wxz_EBDR-7*~h9{8MCdRy? zTAaQF)vpMEITkCS-$MVZn#B1s=ff(*zcpR;HG|@OB~AIsTyP(`MVzlzk_W`O%}}mw z2IrHJ`?gjxG}~FL)gdlW`x=Kh-(U=DTE*$7=9vs|hH9S42A7c$gP-H|OtCm|UTLTf zbROKuQnYfyP@oH%!ulMBSTi~X+c7w2x~i1S;{Hm_=)Lu_y7DnE}o^NvAI1!s~m zF7L44=X1c_v=@o9y+(O`wK(6eRc?U&!#L#)S>pVNnhl8IGtNoeFY5e)@xPQP&aYV8 zjkTfI3TfL-_2T?GpzK4A`|^}G!{>g#^41h_{?JLrIQFvNSA639iSfVMB+kB6)iigC zv%ge%8)|r{SsB+ooC68U+fl>A^tru8oPV*NJ37T>Nmos4jkv4>%Da=qWoN&;Tk)Es zEVZ`{iYwBo{C1DHoUHA;9&tsdsQtYnam7?Azn>zmk@d>BU(XfCG5t6wuHzZ!CyC;U zXFQ)kE5w$>7{1CD*F@(2RhPI{;OAWW`3~`%%W?k>@lS11Kl?Ej83kncyo}?EbBV6Ylhl3y`YY(?C&YY3 zp4xwcJ*!f=&k)y@tVti*UdfvDrGq&ZeYxVgI+gkkyef)%+zaZ;X3c*=%rnwd^Gg+& zasGm_xQ6-uf|^{DOU;0|t}RvmHBVgEQS)n1T-WET{a~@UW;Q7Ir{Yyqta*PWxRZAH zpH-v$8#H;0|F;4#WBaXKTsZ$Sv=8~MUtBkF{v3(}`_z7@LR@p$_7HO9IWhYH#y6jJ z8-P83Q1ypP#5FgA+yG`h4`VFmGPd7y#5J#5HGg3K7X-)wam{ZZ;?O(FT}6e;jwZ0? z>u|J+>vpZV!_g6BO6KwVnp<)V%S9gC!;T1LmH|>VwSiz=a3Qq=2qni$nh12auUY+)ebVo;&sM6u}fUr z^VOaV{q`UkqO;rjP=)b$`>Sw>zi6~y}0)IlrPK?R}bTv>JitstohVxaedFeGCIT+ zY*770hynZhp|Q9)UR=H8X{gCh^zX&k{WPc=FZ6wl%9kKV-k;{U6gmFEd2&TDxK}k- z1jO~1NBPP;ahv;6@@~su(KDmk9D(=J<<=fK4oy>7uI4JJZD%D<;C+-x+a69_Nz0pJU z|0nuAlR4gj*i!S=UW^>iX1;f#4ww@|`Vz0WFBIjw3&1^O)G&i}UeqA&i`vzGk4M}W zw<(u`FYi`g8%zix2G{iWjU&;^@_Wkxv%aP_e1o# zrbOJ2Qd4J$dnxT}2gSXNKA%I|$35z&z6M;cjPD)p<;>-IXr5@N9r08%{&jugUO~-z z=GiuVv7@9C2Hm0c^_bj`c%9We* z#J#nQ+zbwo1LAJZP~KK5?$?;(HpKQ?Q0*<)7Pj>&Z^t;|JI2tq@CM@9?jd`A6yi1{Q18|J_9TLt`<^m!|42<2V*W9p`Yzae8GjeHk)PVs{#iiWeYMJ8 zpx<9PueyWcK2)ssy+vT^_acS?j^kdmJv^wIfKS|iFrKf|#r>y8?cXFwv^iV3r$eIc z9MkXnB-)Xz_Wi|R`q>|p=*W1r|Ii}QQMCV9F44|Twf{IE(b0_UK$k=xldkrk^Cdc# z`aX|DAIq`mgM9>J>uZqcIOc-yV$sKEXxsi|i5@G;hZ7|_f$<;qN%RE9{}(i;rl{tB zg%bS_)kFw*V)u|e!jvx2lXU+RVG2m}6pbOmh8$C!s(3IsO`;+KcO7lul9sSi7sG06Z$0jR-Ct=W0BBL^lg5Lbdn3}ai7yL zx9R>n3nLoap(9sxc$S`FQt6=y^#~3^<+kGH|A{ z1+|)wdq#P^BYJ*5?WpbiB4r~7Tq@SxjBS2}SUQFo&t3dJ%yp`_$3fpnP6s!Wr-5;8 zi|gJ*&&NDDYq)K;>Wp*iF7fVm$S-!8N7INNjeoeMlu7tSxbrEu;)Lok2g0?%p5 zo~+r$a|%4kXG}_-GHG&h@)?mbZR*ssJ&Dt%&zRsjed6g8Cl76{|G)n;L8#-SEmH8; zqQ5l`{XX;)g+C#-h5msbpF|+eBR>Z5DEuALnTP%zadMf+8>@#{|A+Z7^fLO%bt>q31T@i%69ridFiAr1Kp o*@t!W{$Jg*>3H9;kGjxU4(o0Q563Dpc66x5=i|@t&(QDw4=n(degFUf literal 0 HcmV?d00001 diff --git a/hdssd/external/solaris/sqlite-3.22.0/sqlite3.h b/hdssd/external/solaris/sqlite-3.22.0/sqlite3.h new file mode 100644 index 0000000..d8138b7 --- /dev/null +++ b/hdssd/external/solaris/sqlite-3.22.0/sqlite3.h @@ -0,0 +1,10827 @@ +/* +** 2001-09-15 +** +** 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 header file defines the interface that the SQLite library +** presents to client programs. If a C-function, structure, datatype, +** or constant definition does not appear in this file, then it is +** not a published API of SQLite, is subject to change without +** notice, and should not be referenced by programs that use SQLite. +** +** Some of the definitions that are in this file are marked as +** "experimental". Experimental interfaces are normally new +** features recently added to SQLite. We do not anticipate changes +** to experimental interfaces but reserve the right to make minor changes +** if experience from use "in the wild" suggest such changes are prudent. +** +** The official C-language API documentation for SQLite is derived +** from comments in this file. This file is the authoritative source +** on how SQLite interfaces are supposed to operate. +** +** The name of this file under configuration management is "sqlite.h.in". +** The makefile makes some minor changes to this file (such as inserting +** the version number) and changes its name to "sqlite3.h" as +** part of the build process. +*/ +#ifndef SQLITE3_H +#define SQLITE3_H +#include /* Needed for the definition of va_list */ + +/* +** Make sure we can call this stuff from C++. +*/ +#ifdef __cplusplus +extern "C" { +#endif + + +/* +** Provide the ability to override linkage features of the interface. +*/ +#ifndef SQLITE_EXTERN +# define SQLITE_EXTERN extern +#endif +#ifndef SQLITE_API +# define SQLITE_API +#endif +#ifndef SQLITE_CDECL +# define SQLITE_CDECL +#endif +#ifndef SQLITE_APICALL +# define SQLITE_APICALL +#endif +#ifndef SQLITE_STDCALL +# define SQLITE_STDCALL SQLITE_APICALL +#endif +#ifndef SQLITE_CALLBACK +# define SQLITE_CALLBACK +#endif +#ifndef SQLITE_SYSAPI +# define SQLITE_SYSAPI +#endif + +/* +** These no-op macros are used in front of interfaces to mark those +** interfaces as either deprecated or experimental. New applications +** should not use deprecated interfaces - they are supported for backwards +** compatibility only. Application writers should be aware that +** experimental interfaces are subject to change in point releases. +** +** These macros used to resolve to various kinds of compiler magic that +** would generate warning messages when they were used. But that +** compiler magic ended up generating such a flurry of bug reports +** that we have taken it all out and gone back to using simple +** noop macros. +*/ +#define SQLITE_DEPRECATED +#define SQLITE_EXPERIMENTAL + +/* +** Ensure these symbols were not defined by some previous header file. +*/ +#ifdef SQLITE_VERSION +# undef SQLITE_VERSION +#endif +#ifdef SQLITE_VERSION_NUMBER +# undef SQLITE_VERSION_NUMBER +#endif + +/* +** 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] ([dateof:3.6.18]), +** SQLite source code has been stored in the +** Fossil configuration management +** system. ^The SQLITE_SOURCE_ID macro evaluates 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 a SHA1 +** or SHA3-256 hash of the entire source tree. If the source code has +** been edited in any way since it was last checked in, then the last +** four hexadecimal digits of the hash may be modified. +** +** See also: [sqlite3_libversion()], +** [sqlite3_libversion_number()], [sqlite3_sourceid()], +** [sqlite_version()] and [sqlite_source_id()]. +*/ +#define SQLITE_VERSION "3.22.0" +#define SQLITE_VERSION_NUMBER 3022000 +#define SQLITE_SOURCE_ID "2018-01-22 18:45:57 0c55d179733b46d8d0ba4d88e01a25e10677046ee3da1d5b1581e86726f2171d" + +/* +** CAPI3REF: Run-Time Library Version Numbers +** KEYWORDS: sqlite3_version sqlite3_sourceid +** +** These interfaces provide the same information as the [SQLITE_VERSION], +** [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 ensure that the application is +** compiled with matching library and header files. +** +**

      +** assert( sqlite3_libversion_number()==SQLITE_VERSION_NUMBER );
      +** assert( strncmp(sqlite3_sourceid(),SQLITE_SOURCE_ID,80)==0 );
      +** 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 returns +** a pointer to a string constant whose value is the same as the +** [SQLITE_SOURCE_ID] C preprocessor macro. Except if SQLite is built +** using an edited copy of [the amalgamation], then the last four characters +** of the hash might be different from [SQLITE_SOURCE_ID].)^ +** +** See also: [sqlite_version()] and [sqlite_source_id()]. +*/ +SQLITE_API SQLITE_EXTERN const char sqlite3_version[]; +SQLITE_API const char *sqlite3_libversion(void); +SQLITE_API const char *sqlite3_sourceid(void); +SQLITE_API int sqlite3_libversion_number(void); + +/* +** CAPI3REF: Run-Time Library Compilation Options Diagnostics +** +** ^The sqlite3_compileoption_used() function returns 0 or 1 +** indicating whether the specified option was defined at +** compile time. ^The SQLITE_ prefix may be omitted from the +** option name passed to sqlite3_compileoption_used(). +** +** ^The sqlite3_compileoption_get() function allows iterating +** over the list of options that were defined at compile time by +** returning the N-th compile time option string. ^If N is out of range, +** sqlite3_compileoption_get() returns a NULL pointer. ^The SQLITE_ +** prefix is omitted from any strings returned by +** sqlite3_compileoption_get(). +** +** ^Support for the diagnostic functions sqlite3_compileoption_used() +** and sqlite3_compileoption_get() may be omitted by specifying the +** [SQLITE_OMIT_COMPILEOPTION_DIAGS] option at compile time. +** +** See also: SQL functions [sqlite_compileoption_used()] and +** [sqlite_compileoption_get()] and the [compile_options pragma]. +*/ +#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS +SQLITE_API int sqlite3_compileoption_used(const char *zOptName); +SQLITE_API const char *sqlite3_compileoption_get(int N); +#endif + +/* +** CAPI3REF: Test To See If The Library Is Threadsafe +** +** ^The sqlite3_threadsafe() function returns zero if and only if +** SQLite was compiled with 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 +** are enabled and SQLite is threadsafe. When the +** [SQLITE_THREADSAFE] macro is 0, +** the mutexes are omitted. Without the mutexes, it is not safe +** to use SQLite concurrently from more than one thread. +** +** 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. +** +** This interface can be used by an application to make sure that the +** version of SQLite that it is linking against was compiled with +** the desired setting of the [SQLITE_THREADSAFE] macro. +** +** This interface only reports on the compile-time mutex setting +** of the [SQLITE_THREADSAFE] flag. If SQLite is compiled with +** 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_SERIALIZED]. ^(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. +*/ +SQLITE_API int sqlite3_threadsafe(void); + +/* +** CAPI3REF: Database Connection Handle +** KEYWORDS: {database connection} {database connections} +** +** Each open SQLite database is represented by a pointer to an instance of +** the opaque structure named "sqlite3". It is useful to think of an sqlite3 +** pointer as an object. The [sqlite3_open()], [sqlite3_open16()], and +** [sqlite3_open_v2()] interfaces are its constructors, and [sqlite3_close()] +** and [sqlite3_close_v2()] are its destructors. There are many other +** interfaces (such as +** [sqlite3_prepare_v2()], [sqlite3_create_function()], and +** [sqlite3_busy_timeout()] to name but three) that are methods on an +** sqlite3 object. +*/ +typedef struct sqlite3 sqlite3; + +/* +** CAPI3REF: 64-Bit Integer Types +** KEYWORDS: sqlite_int64 sqlite_uint64 +** +** Because there is no cross-platform way to specify 64-bit integer types +** SQLite includes typedefs for 64-bit signed and unsigned integers. +** +** The sqlite3_int64 and sqlite3_uint64 are the preferred type definitions. +** The sqlite_int64 and sqlite_uint64 types are supported for backwards +** compatibility only. +** +** ^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; +# ifdef SQLITE_UINT64_TYPE + typedef SQLITE_UINT64_TYPE sqlite_uint64; +# else + typedef unsigned SQLITE_INT64_TYPE sqlite_uint64; +# endif +#elif defined(_MSC_VER) || defined(__BORLANDC__) + typedef __int64 sqlite_int64; + typedef unsigned __int64 sqlite_uint64; +#else + typedef long long int sqlite_int64; + typedef unsigned long long int sqlite_uint64; +#endif +typedef sqlite_int64 sqlite3_int64; +typedef sqlite_uint64 sqlite3_uint64; + +/* +** If compiling for a processor that lacks floating point support, +** substitute integer for floating-point. +*/ +#ifdef SQLITE_OMIT_FLOATING_POINT +# define double sqlite3_int64 +#endif + +/* +** CAPI3REF: Closing A Database Connection +** DESTRUCTOR: sqlite3 +** +** ^The sqlite3_close() and sqlite3_close_v2() routines are destructors +** for the [sqlite3] object. +** ^Calls to sqlite3_close() and sqlite3_close_v2() return [SQLITE_OK] if +** the [sqlite3] object is successfully destroyed and all associated +** resources are deallocated. +** +** ^If the database connection is associated with unfinalized prepared +** statements or unfinished sqlite3_backup objects then sqlite3_close() +** will leave the database connection open and return [SQLITE_BUSY]. +** ^If sqlite3_close_v2() is called with unfinalized prepared statements +** and/or unfinished sqlite3_backups, then the database connection becomes +** an unusable "zombie" which will automatically be deallocated when the +** last prepared statement is finalized or the last sqlite3_backup is +** finished. The sqlite3_close_v2() interface is intended for use with +** host languages that are garbage collected, and where the order in which +** destructors are called is arbitrary. +** +** Applications should [sqlite3_finalize | finalize] all [prepared statements], +** [sqlite3_blob_close | close] all [BLOB handles], and +** [sqlite3_backup_finish | finish] all [sqlite3_backup] objects associated +** with the [sqlite3] object prior to attempting to close the object. ^If +** sqlite3_close_v2() is called on a [database connection] that still has +** outstanding [prepared statements], [BLOB handles], and/or +** [sqlite3_backup] objects then it returns [SQLITE_OK] and the deallocation +** of resources is deferred until all [prepared statements], [BLOB handles], +** and [sqlite3_backup] objects are also destroyed. +** +** ^If an [sqlite3] object is destroyed while a transaction is open, +** the transaction is automatically rolled back. +** +** The C parameter to [sqlite3_close(C)] and [sqlite3_close_v2(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. +** ^Calling sqlite3_close() or sqlite3_close_v2() with a NULL pointer +** argument is a harmless no-op. +*/ +SQLITE_API int sqlite3_close(sqlite3*); +SQLITE_API int sqlite3_close_v2(sqlite3*); + +/* +** The type for a callback function. +** This is legacy and deprecated. It is included for historical +** compatibility and is not documented. +*/ +typedef int (*sqlite3_callback)(void*,int,char**, char**); + +/* +** CAPI3REF: One-Step Query Execution Interface +** METHOD: sqlite3 +** +** 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 +** 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 +** 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 application must ensure that the 1st parameter to sqlite3_exec() +** is a valid and open [database connection]. +**
      • The application must not close the [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 */ + const char *sql, /* SQL to be evaluated */ + int (*callback)(void*,int,char**,char**), /* Callback function */ + void *, /* 1st argument to callback */ + char **errmsg /* Error msg written here */ +); + +/* +** CAPI3REF: Result Codes +** KEYWORDS: {result code definitions} +** +** Many SQLite functions return an integer result code from the set shown +** here in order to indicate success or failure. +** +** New error codes may be added in future versions of SQLite. +** +** See also: [extended result code definitions] +*/ +#define SQLITE_OK 0 /* Successful result */ +/* beginning-of-error-codes */ +#define SQLITE_ERROR 1 /* Generic error */ +#define SQLITE_INTERNAL 2 /* Internal logic error in SQLite */ +#define SQLITE_PERM 3 /* Access permission denied */ +#define SQLITE_ABORT 4 /* Callback routine requested an abort */ +#define SQLITE_BUSY 5 /* The database file is locked */ +#define SQLITE_LOCKED 6 /* A table in the database is locked */ +#define SQLITE_NOMEM 7 /* A malloc() failed */ +#define SQLITE_READONLY 8 /* Attempt to write a readonly database */ +#define SQLITE_INTERRUPT 9 /* Operation terminated by sqlite3_interrupt()*/ +#define SQLITE_IOERR 10 /* Some kind of disk I/O error occurred */ +#define SQLITE_CORRUPT 11 /* The database disk image is malformed */ +#define SQLITE_NOTFOUND 12 /* Unknown opcode in sqlite3_file_control() */ +#define SQLITE_FULL 13 /* Insertion failed because database is full */ +#define SQLITE_CANTOPEN 14 /* Unable to open the database file */ +#define SQLITE_PROTOCOL 15 /* Database lock protocol error */ +#define SQLITE_EMPTY 16 /* Internal use only */ +#define SQLITE_SCHEMA 17 /* The database schema changed */ +#define SQLITE_TOOBIG 18 /* String or BLOB exceeds size limit */ +#define SQLITE_CONSTRAINT 19 /* Abort due to constraint violation */ +#define SQLITE_MISMATCH 20 /* Data type mismatch */ +#define SQLITE_MISUSE 21 /* Library used incorrectly */ +#define SQLITE_NOLFS 22 /* Uses OS features not supported on host */ +#define SQLITE_AUTH 23 /* Authorization denied */ +#define SQLITE_FORMAT 24 /* Not used */ +#define SQLITE_RANGE 25 /* 2nd parameter to sqlite3_bind out of range */ +#define SQLITE_NOTADB 26 /* File opened that is not a database file */ +#define SQLITE_NOTICE 27 /* Notifications from sqlite3_log() */ +#define SQLITE_WARNING 28 /* Warnings from sqlite3_log() */ +#define SQLITE_ROW 100 /* sqlite3_step() has another row ready */ +#define SQLITE_DONE 101 /* sqlite3_step() has finished executing */ +/* end-of-error-codes */ + +/* +** CAPI3REF: Extended Result Codes +** KEYWORDS: {extended result code definitions} +** +** In its default configuration, SQLite API routines return one of 30 integer +** [result codes]. However, experience has shown that many of +** these result codes are too coarse-grained. They do not provide as +** much information about problems as programmers might like. In an effort to +** address this, newer versions of SQLite (version 3.3.8 [dateof:3.3.8] +** and later) include +** support for additional result codes that provide more detailed information +** about errors. These [extended result codes] are enabled or disabled +** on a per database connection basis using the +** [sqlite3_extended_result_codes()] API. Or, the extended code for +** the most recent error can be obtained using +** [sqlite3_extended_errcode()]. +*/ +#define SQLITE_ERROR_MISSING_COLLSEQ (SQLITE_ERROR | (1<<8)) +#define SQLITE_ERROR_RETRY (SQLITE_ERROR | (2<<8)) +#define SQLITE_IOERR_READ (SQLITE_IOERR | (1<<8)) +#define SQLITE_IOERR_SHORT_READ (SQLITE_IOERR | (2<<8)) +#define SQLITE_IOERR_WRITE (SQLITE_IOERR | (3<<8)) +#define SQLITE_IOERR_FSYNC (SQLITE_IOERR | (4<<8)) +#define SQLITE_IOERR_DIR_FSYNC (SQLITE_IOERR | (5<<8)) +#define SQLITE_IOERR_TRUNCATE (SQLITE_IOERR | (6<<8)) +#define SQLITE_IOERR_FSTAT (SQLITE_IOERR | (7<<8)) +#define SQLITE_IOERR_UNLOCK (SQLITE_IOERR | (8<<8)) +#define SQLITE_IOERR_RDLOCK (SQLITE_IOERR | (9<<8)) +#define SQLITE_IOERR_DELETE (SQLITE_IOERR | (10<<8)) +#define SQLITE_IOERR_BLOCKED (SQLITE_IOERR | (11<<8)) +#define SQLITE_IOERR_NOMEM (SQLITE_IOERR | (12<<8)) +#define SQLITE_IOERR_ACCESS (SQLITE_IOERR | (13<<8)) +#define SQLITE_IOERR_CHECKRESERVEDLOCK (SQLITE_IOERR | (14<<8)) +#define SQLITE_IOERR_LOCK (SQLITE_IOERR | (15<<8)) +#define SQLITE_IOERR_CLOSE (SQLITE_IOERR | (16<<8)) +#define SQLITE_IOERR_DIR_CLOSE (SQLITE_IOERR | (17<<8)) +#define SQLITE_IOERR_SHMOPEN (SQLITE_IOERR | (18<<8)) +#define SQLITE_IOERR_SHMSIZE (SQLITE_IOERR | (19<<8)) +#define SQLITE_IOERR_SHMLOCK (SQLITE_IOERR | (20<<8)) +#define SQLITE_IOERR_SHMMAP (SQLITE_IOERR | (21<<8)) +#define SQLITE_IOERR_SEEK (SQLITE_IOERR | (22<<8)) +#define SQLITE_IOERR_DELETE_NOENT (SQLITE_IOERR | (23<<8)) +#define SQLITE_IOERR_MMAP (SQLITE_IOERR | (24<<8)) +#define SQLITE_IOERR_GETTEMPPATH (SQLITE_IOERR | (25<<8)) +#define SQLITE_IOERR_CONVPATH (SQLITE_IOERR | (26<<8)) +#define SQLITE_IOERR_VNODE (SQLITE_IOERR | (27<<8)) +#define SQLITE_IOERR_AUTH (SQLITE_IOERR | (28<<8)) +#define SQLITE_IOERR_BEGIN_ATOMIC (SQLITE_IOERR | (29<<8)) +#define SQLITE_IOERR_COMMIT_ATOMIC (SQLITE_IOERR | (30<<8)) +#define SQLITE_IOERR_ROLLBACK_ATOMIC (SQLITE_IOERR | (31<<8)) +#define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8)) +#define SQLITE_BUSY_RECOVERY (SQLITE_BUSY | (1<<8)) +#define SQLITE_BUSY_SNAPSHOT (SQLITE_BUSY | (2<<8)) +#define SQLITE_CANTOPEN_NOTEMPDIR (SQLITE_CANTOPEN | (1<<8)) +#define SQLITE_CANTOPEN_ISDIR (SQLITE_CANTOPEN | (2<<8)) +#define SQLITE_CANTOPEN_FULLPATH (SQLITE_CANTOPEN | (3<<8)) +#define SQLITE_CANTOPEN_CONVPATH (SQLITE_CANTOPEN | (4<<8)) +#define SQLITE_CORRUPT_VTAB (SQLITE_CORRUPT | (1<<8)) +#define SQLITE_READONLY_RECOVERY (SQLITE_READONLY | (1<<8)) +#define SQLITE_READONLY_CANTLOCK (SQLITE_READONLY | (2<<8)) +#define SQLITE_READONLY_ROLLBACK (SQLITE_READONLY | (3<<8)) +#define SQLITE_READONLY_DBMOVED (SQLITE_READONLY | (4<<8)) +#define SQLITE_READONLY_CANTINIT (SQLITE_READONLY | (5<<8)) +#define SQLITE_READONLY_DIRECTORY (SQLITE_READONLY | (6<<8)) +#define SQLITE_ABORT_ROLLBACK (SQLITE_ABORT | (2<<8)) +#define SQLITE_CONSTRAINT_CHECK (SQLITE_CONSTRAINT | (1<<8)) +#define SQLITE_CONSTRAINT_COMMITHOOK (SQLITE_CONSTRAINT | (2<<8)) +#define SQLITE_CONSTRAINT_FOREIGNKEY (SQLITE_CONSTRAINT | (3<<8)) +#define SQLITE_CONSTRAINT_FUNCTION (SQLITE_CONSTRAINT | (4<<8)) +#define SQLITE_CONSTRAINT_NOTNULL (SQLITE_CONSTRAINT | (5<<8)) +#define SQLITE_CONSTRAINT_PRIMARYKEY (SQLITE_CONSTRAINT | (6<<8)) +#define SQLITE_CONSTRAINT_TRIGGER (SQLITE_CONSTRAINT | (7<<8)) +#define SQLITE_CONSTRAINT_UNIQUE (SQLITE_CONSTRAINT | (8<<8)) +#define SQLITE_CONSTRAINT_VTAB (SQLITE_CONSTRAINT | (9<<8)) +#define SQLITE_CONSTRAINT_ROWID (SQLITE_CONSTRAINT |(10<<8)) +#define SQLITE_NOTICE_RECOVER_WAL (SQLITE_NOTICE | (1<<8)) +#define SQLITE_NOTICE_RECOVER_ROLLBACK (SQLITE_NOTICE | (2<<8)) +#define SQLITE_WARNING_AUTOINDEX (SQLITE_WARNING | (1<<8)) +#define SQLITE_AUTH_USER (SQLITE_AUTH | (1<<8)) +#define SQLITE_OK_LOAD_PERMANENTLY (SQLITE_OK | (1<<8)) + +/* +** CAPI3REF: Flags For File Open Operations +** +** These bit values are intended for use in the +** 3rd parameter to the [sqlite3_open_v2()] interface and +** in the 4th parameter to the [sqlite3_vfs.xOpen] method. +*/ +#define SQLITE_OPEN_READONLY 0x00000001 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_READWRITE 0x00000002 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_CREATE 0x00000004 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_DELETEONCLOSE 0x00000008 /* VFS only */ +#define SQLITE_OPEN_EXCLUSIVE 0x00000010 /* VFS only */ +#define SQLITE_OPEN_AUTOPROXY 0x00000020 /* VFS only */ +#define SQLITE_OPEN_URI 0x00000040 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_MEMORY 0x00000080 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_MAIN_DB 0x00000100 /* VFS only */ +#define SQLITE_OPEN_TEMP_DB 0x00000200 /* VFS only */ +#define SQLITE_OPEN_TRANSIENT_DB 0x00000400 /* VFS only */ +#define SQLITE_OPEN_MAIN_JOURNAL 0x00000800 /* VFS only */ +#define SQLITE_OPEN_TEMP_JOURNAL 0x00001000 /* VFS only */ +#define SQLITE_OPEN_SUBJOURNAL 0x00002000 /* VFS only */ +#define SQLITE_OPEN_MASTER_JOURNAL 0x00004000 /* VFS only */ +#define SQLITE_OPEN_NOMUTEX 0x00008000 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_FULLMUTEX 0x00010000 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_SHAREDCACHE 0x00020000 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_PRIVATECACHE 0x00040000 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_WAL 0x00080000 /* VFS only */ + +/* Reserved: 0x00F00000 */ + +/* +** CAPI3REF: Device Characteristics +** +** The xDeviceCharacteristics method of the [sqlite3_io_methods] +** object returns an integer which is a vector of these +** bit values expressing I/O characteristics of the mass storage +** device that holds the file that the [sqlite3_io_methods] +** refers to. +** +** The SQLITE_IOCAP_ATOMIC property means that all writes of +** any size are atomic. The SQLITE_IOCAP_ATOMICnnn values +** mean that writes of blocks that are nnn bytes in size and +** are aligned to an address which is an integer multiple of +** nnn are atomic. The SQLITE_IOCAP_SAFE_APPEND value means +** that when data is appended to a file, the data is appended +** first then the size of the file is extended, never the other +** way around. The SQLITE_IOCAP_SEQUENTIAL property means that +** information is written to disk in the same order as calls +** to xWrite(). The SQLITE_IOCAP_POWERSAFE_OVERWRITE property means that +** after reboot following a crash or power loss, the only bytes in a +** file that were written at the application level might have changed +** and that adjacent bytes, even bytes within the same sector are +** guaranteed to be unchanged. The SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN +** flag indicates that a file cannot be deleted when open. The +** SQLITE_IOCAP_IMMUTABLE flag indicates that the file is on +** read-only media and cannot be changed even by processes with +** elevated privileges. +** +** The SQLITE_IOCAP_BATCH_ATOMIC property means that the underlying +** filesystem supports doing multiple write operations atomically when those +** write operations are bracketed by [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE] and +** [SQLITE_FCNTL_COMMIT_ATOMIC_WRITE]. +*/ +#define SQLITE_IOCAP_ATOMIC 0x00000001 +#define SQLITE_IOCAP_ATOMIC512 0x00000002 +#define SQLITE_IOCAP_ATOMIC1K 0x00000004 +#define SQLITE_IOCAP_ATOMIC2K 0x00000008 +#define SQLITE_IOCAP_ATOMIC4K 0x00000010 +#define SQLITE_IOCAP_ATOMIC8K 0x00000020 +#define SQLITE_IOCAP_ATOMIC16K 0x00000040 +#define SQLITE_IOCAP_ATOMIC32K 0x00000080 +#define SQLITE_IOCAP_ATOMIC64K 0x00000100 +#define SQLITE_IOCAP_SAFE_APPEND 0x00000200 +#define SQLITE_IOCAP_SEQUENTIAL 0x00000400 +#define SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN 0x00000800 +#define SQLITE_IOCAP_POWERSAFE_OVERWRITE 0x00001000 +#define SQLITE_IOCAP_IMMUTABLE 0x00002000 +#define SQLITE_IOCAP_BATCH_ATOMIC 0x00004000 + +/* +** 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 +** of an [sqlite3_io_methods] object. +*/ +#define SQLITE_LOCK_NONE 0 +#define SQLITE_LOCK_SHARED 1 +#define SQLITE_LOCK_RESERVED 2 +#define SQLITE_LOCK_PENDING 3 +#define SQLITE_LOCK_EXCLUSIVE 4 + +/* +** CAPI3REF: Synchronization Type Flags +** +** When SQLite invokes the xSync() method of an +** [sqlite3_io_methods] object it uses a combination of +** these integer values as the second argument. +** +** When the SQLITE_SYNC_DATAONLY flag is used, it means that the +** sync operation only needs to flush data to mass storage. Inode +** information need not be flushed. If the lower four bits of the flag +** equal SQLITE_SYNC_NORMAL, that means to use normal fsync() semantics. +** If the lower four bits equal SQLITE_SYNC_FULL, that means +** to use Mac OS X style fullsync instead of fsync(). +** +** Do not confuse the SQLITE_SYNC_NORMAL and SQLITE_SYNC_FULL flags +** with the [PRAGMA synchronous]=NORMAL and [PRAGMA synchronous]=FULL +** settings. The [synchronous pragma] determines when calls to the +** xSync VFS method occur and applies uniformly across all platforms. +** The SQLITE_SYNC_NORMAL and SQLITE_SYNC_FULL flags determine how +** energetic or rigorous or forceful the sync operations are and +** only make a difference on Mac OSX for the default SQLite code. +** (Third-party VFS implementations might also make the distinction +** between SQLITE_SYNC_NORMAL and SQLITE_SYNC_FULL, but among the +** operating systems natively supported by SQLite, only Mac OSX +** cares about the difference.) +*/ +#define SQLITE_SYNC_NORMAL 0x00002 +#define SQLITE_SYNC_FULL 0x00003 +#define SQLITE_SYNC_DATAONLY 0x00010 + +/* +** CAPI3REF: OS Interface Open File Handle +** +** An [sqlite3_file] object represents an open file in the +** [sqlite3_vfs | OS interface layer]. Individual OS interface +** implementations will +** want to subclass this object by appending additional fields +** for their own use. The pMethods entry is a pointer to an +** [sqlite3_io_methods] object that defines methods for performing +** I/O operations on the open file. +*/ +typedef struct sqlite3_file sqlite3_file; +struct sqlite3_file { + const struct sqlite3_io_methods *pMethods; /* Methods for an open file */ +}; + +/* +** 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 +** [sqlite3_file] object) with a pointer to an instance of this object. +** This object defines the methods used to perform various operations +** against the open file represented by the [sqlite3_file] object. +** +** If the [sqlite3_vfs.xOpen] method sets the sqlite3_file.pMethods element +** to a non-NULL pointer, then the sqlite3_io_methods.xClose method +** may be invoked even if the [sqlite3_vfs.xOpen] reported that it failed. The +** only way to prevent a call to xClose following a failed [sqlite3_vfs.xOpen] +** is for the [sqlite3_vfs.xOpen] to set the sqlite3_file.pMethods element +** to NULL. +** +** The flags argument to xSync may be one of [SQLITE_SYNC_NORMAL] or +** [SQLITE_SYNC_FULL]. The first choice is the normal fsync(). +** The second choice is a Mac OS X style fullsync. The [SQLITE_SYNC_DATAONLY] +** flag may be ORed in to indicate that only the data of the file +** and not its inode needs to be synced. +** +** The integer values to xLock() and xUnlock() are one of +**
        +**
      • [SQLITE_LOCK_NONE], +**
      • [SQLITE_LOCK_SHARED], +**
      • [SQLITE_LOCK_RESERVED], +**
      • [SQLITE_LOCK_PENDING], or +**
      • [SQLITE_LOCK_EXCLUSIVE]. +**
      +** xLock() increases the lock. xUnlock() decreases the lock. +** The xCheckReservedLock() method checks whether any database connection, +** either in this process or in some other process, is holding a RESERVED, +** PENDING, or EXCLUSIVE lock on the file. It returns true +** if such a lock exists and false otherwise. +** +** The xFileControl() method is a generic interface that allows custom +** VFS implementations to directly control an open file using the +** [sqlite3_file_control()] interface. The second "op" argument is an +** integer opcode. The third argument is a generic pointer intended to +** point to a structure that may contain arguments or space in which to +** write return values. Potential uses for xFileControl() might be +** functions to enable blocking locks with timeouts, to change the +** locking strategy (for example to use dot-file locks), to inquire +** about the status of a lock, or to break stale locks. The SQLite +** core reserves all opcodes less than 100 for its own use. +** A [file control opcodes | list of opcodes] less than 100 is available. +** Applications that define a custom xFileControl method should use opcodes +** greater than 100 to avoid conflicts. VFS implementations should +** return [SQLITE_NOTFOUND] for file control opcodes that they do not +** recognize. +** +** The xSectorSize() method returns the sector size of the +** device that underlies the file. The sector size is the +** minimum write that can be performed without disturbing +** other bytes in the file. The xDeviceCharacteristics() +** method returns a bit vector describing behaviors of the +** underlying device: +** +**
        +**
      • [SQLITE_IOCAP_ATOMIC] +**
      • [SQLITE_IOCAP_ATOMIC512] +**
      • [SQLITE_IOCAP_ATOMIC1K] +**
      • [SQLITE_IOCAP_ATOMIC2K] +**
      • [SQLITE_IOCAP_ATOMIC4K] +**
      • [SQLITE_IOCAP_ATOMIC8K] +**
      • [SQLITE_IOCAP_ATOMIC16K] +**
      • [SQLITE_IOCAP_ATOMIC32K] +**
      • [SQLITE_IOCAP_ATOMIC64K] +**
      • [SQLITE_IOCAP_SAFE_APPEND] +**
      • [SQLITE_IOCAP_SEQUENTIAL] +**
      • [SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN] +**
      • [SQLITE_IOCAP_POWERSAFE_OVERWRITE] +**
      • [SQLITE_IOCAP_IMMUTABLE] +**
      • [SQLITE_IOCAP_BATCH_ATOMIC] +**
      +** +** The SQLITE_IOCAP_ATOMIC property means that all writes of +** any size are atomic. The SQLITE_IOCAP_ATOMICnnn values +** mean that writes of blocks that are nnn bytes in size and +** are aligned to an address which is an integer multiple of +** nnn are atomic. The SQLITE_IOCAP_SAFE_APPEND value means +** that when data is appended to a file, the data is appended +** first then the size of the file is extended, never the other +** way around. The SQLITE_IOCAP_SEQUENTIAL property means that +** information is written to disk in the same order as calls +** to xWrite(). +** +** If xRead() returns SQLITE_IOERR_SHORT_READ it must also fill +** in the unread portions of the buffer with zeros. A VFS that +** fails to zero-fill short reads might seem to work. However, +** failure to zero-fill short reads will eventually lead to +** database corruption. +*/ +typedef struct sqlite3_io_methods sqlite3_io_methods; +struct sqlite3_io_methods { + int iVersion; + int (*xClose)(sqlite3_file*); + int (*xRead)(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst); + int (*xWrite)(sqlite3_file*, const void*, int iAmt, sqlite3_int64 iOfst); + int (*xTruncate)(sqlite3_file*, sqlite3_int64 size); + int (*xSync)(sqlite3_file*, int flags); + int (*xFileSize)(sqlite3_file*, sqlite3_int64 *pSize); + int (*xLock)(sqlite3_file*, int); + int (*xUnlock)(sqlite3_file*, int); + int (*xCheckReservedLock)(sqlite3_file*, int *pResOut); + int (*xFileControl)(sqlite3_file*, int op, void *pArg); + int (*xSectorSize)(sqlite3_file*); + int (*xDeviceCharacteristics)(sqlite3_file*); + /* Methods above are valid for version 1 */ + int (*xShmMap)(sqlite3_file*, int iPg, int pgsz, int, void volatile**); + int (*xShmLock)(sqlite3_file*, int offset, int n, int flags); + void (*xShmBarrier)(sqlite3_file*); + int (*xShmUnmap)(sqlite3_file*, int deleteFlag); + /* Methods above are valid for version 2 */ + int (*xFetch)(sqlite3_file*, sqlite3_int64 iOfst, int iAmt, void **pp); + int (*xUnfetch)(sqlite3_file*, sqlite3_int64 iOfst, void *p); + /* Methods above are valid for version 3 */ + /* Additional methods may be added in future releases */ +}; + +/* +** CAPI3REF: Standard File Control Opcodes +** KEYWORDS: {file control opcodes} {file control opcode} +** +** These integer constants are opcodes for the xFileControl method +** of the [sqlite3_io_methods] object and for the [sqlite3_file_control()] +** interface. +** +**
        +**
      • [[SQLITE_FCNTL_LOCKSTATE]] +** The [SQLITE_FCNTL_LOCKSTATE] opcode is used for debugging. This +** opcode causes the xFileControl method to write the current state of +** the lock (one of [SQLITE_LOCK_NONE], [SQLITE_LOCK_SHARED], +** [SQLITE_LOCK_RESERVED], [SQLITE_LOCK_PENDING], or [SQLITE_LOCK_EXCLUSIVE]) +** into an integer that the pArg argument points to. This capability +** is used during testing and is only available when the SQLITE_TEST +** compile-time option is used. +** +**
      • [[SQLITE_FCNTL_SIZE_HINT]] +** The [SQLITE_FCNTL_SIZE_HINT] opcode is used by SQLite to give the VFS +** layer a hint of how large the database file will grow to be during the +** current transaction. This hint is not guaranteed to be accurate but it +** is often close. The underlying VFS might choose to preallocate database +** file space based on this hint in order to help writes to the database +** file run faster. +** +**
      • [[SQLITE_FCNTL_CHUNK_SIZE]] +** The [SQLITE_FCNTL_CHUNK_SIZE] opcode is used to request that the VFS +** extends and truncates the database file in chunks of a size specified +** by the user. The fourth argument to [sqlite3_file_control()] should +** point to an integer (type int) containing the new chunk-size to use +** for the nominated database. Allocating database file space in large +** chunks (say 1MB at a time), may reduce file-system fragmentation and +** improve performance on some systems. +** +**
      • [[SQLITE_FCNTL_FILE_POINTER]] +** The [SQLITE_FCNTL_FILE_POINTER] opcode is used to obtain a pointer +** to the [sqlite3_file] object associated with a particular database +** connection. See also [SQLITE_FCNTL_JOURNAL_POINTER]. +** +**
      • [[SQLITE_FCNTL_JOURNAL_POINTER]] +** The [SQLITE_FCNTL_JOURNAL_POINTER] opcode is used to obtain a pointer +** to the [sqlite3_file] object associated with the journal file (either +** the [rollback journal] or the [write-ahead log]) for a particular database +** connection. See also [SQLITE_FCNTL_FILE_POINTER]. +** +**
      • [[SQLITE_FCNTL_SYNC_OMITTED]] +** No longer in use. +** +**
      • [[SQLITE_FCNTL_SYNC]] +** The [SQLITE_FCNTL_SYNC] opcode is generated internally by SQLite and +** sent to the VFS immediately before the xSync method is invoked on a +** database file descriptor. Or, if the xSync method is not invoked +** because the user has configured SQLite with +** [PRAGMA synchronous | PRAGMA synchronous=OFF] it is invoked in place +** of the xSync method. In most cases, the pointer argument passed with +** this file-control is NULL. However, if the database file is being synced +** as part of a multi-database commit, the argument points to a nul-terminated +** string containing the transactions master-journal file name. VFSes that +** do not need this signal should silently ignore this opcode. Applications +** should not call [sqlite3_file_control()] with this opcode as doing so may +** disrupt the operation of the specialized VFSes that do require it. +** +**
      • [[SQLITE_FCNTL_COMMIT_PHASETWO]] +** The [SQLITE_FCNTL_COMMIT_PHASETWO] opcode is generated internally by SQLite +** and sent to the VFS after a transaction has been committed immediately +** but before the database is unlocked. VFSes that do not need this signal +** should silently ignore this opcode. Applications should not call +** [sqlite3_file_control()] with this opcode as doing so may disrupt the +** operation of the specialized VFSes that do require it. +** +**
      • [[SQLITE_FCNTL_WIN32_AV_RETRY]] +** ^The [SQLITE_FCNTL_WIN32_AV_RETRY] opcode is used to configure automatic +** retry counts and intervals for certain disk I/O operations for the +** windows [VFS] in order to provide robustness in the presence of +** anti-virus programs. By default, the windows VFS will retry file read, +** file write, and file delete operations up to 10 times, with a delay +** of 25 milliseconds before the first retry and with the delay increasing +** by an additional 25 milliseconds with each subsequent retry. This +** opcode allows these two values (10 retries and 25 milliseconds of delay) +** to be adjusted. The values are changed for all database connections +** within the same process. The argument is a pointer to an array of two +** integers where the first integer is the new retry count and the second +** integer is the delay. If either integer is negative, then the setting +** is not changed but instead the prior value of that setting is written +** into the array entry, allowing the current retry settings to be +** interrogated. The zDbName parameter is ignored. +** +**
      • [[SQLITE_FCNTL_PERSIST_WAL]] +** ^The [SQLITE_FCNTL_PERSIST_WAL] opcode is used to set or query the +** persistent [WAL | Write Ahead Log] setting. By default, the auxiliary +** write ahead log and shared memory files used for transaction control +** are automatically deleted when the latest connection to the database +** closes. Setting persistent WAL mode causes those files to persist after +** close. Persisting the files is useful when other processes that do not +** have write permission on the directory containing the database file want +** to read the database file, as the WAL and shared memory files must exist +** in order for the database to be readable. The fourth parameter to +** [sqlite3_file_control()] for this opcode should be a pointer to an integer. +** That integer is 0 to disable persistent WAL mode or 1 to enable persistent +** WAL mode. If the integer is -1, then it is overwritten with the current +** WAL persistence setting. +** +**
      • [[SQLITE_FCNTL_POWERSAFE_OVERWRITE]] +** ^The [SQLITE_FCNTL_POWERSAFE_OVERWRITE] opcode is used to set or query the +** persistent "powersafe-overwrite" or "PSOW" setting. The PSOW setting +** determines the [SQLITE_IOCAP_POWERSAFE_OVERWRITE] bit of the +** xDeviceCharacteristics methods. The fourth parameter to +** [sqlite3_file_control()] for this opcode should be a pointer to an integer. +** That integer is 0 to disable zero-damage mode or 1 to enable zero-damage +** mode. If the integer is -1, then it is overwritten with the current +** zero-damage mode setting. +** +**
      • [[SQLITE_FCNTL_OVERWRITE]] +** ^The [SQLITE_FCNTL_OVERWRITE] opcode is invoked by SQLite after opening +** a write transaction to indicate that, unless it is rolled back for some +** reason, the entire database file will be overwritten by the current +** transaction. This is used by VACUUM operations. +** +**
      • [[SQLITE_FCNTL_VFSNAME]] +** ^The [SQLITE_FCNTL_VFSNAME] opcode can be used to obtain the names of +** all [VFSes] in the VFS stack. The names are of all VFS shims and the +** final bottom-level VFS are written into memory obtained from +** [sqlite3_malloc()] and the result is stored in the char* variable +** that the fourth parameter of [sqlite3_file_control()] points to. +** The caller is responsible for freeing the memory when done. As with +** all file-control actions, there is no guarantee that this will actually +** do anything. Callers should initialize the char* variable to a NULL +** pointer in case this file-control is not implemented. This file-control +** is intended for diagnostic use only. +** +**
      • [[SQLITE_FCNTL_VFS_POINTER]] +** ^The [SQLITE_FCNTL_VFS_POINTER] opcode finds a pointer to the top-level +** [VFSes] currently in use. ^(The argument X in +** sqlite3_file_control(db,SQLITE_FCNTL_VFS_POINTER,X) must be +** of type "[sqlite3_vfs] **". This opcodes will set *X +** to a pointer to the top-level VFS.)^ +** ^When there are multiple VFS shims in the stack, this opcode finds the +** upper-most shim only. +** +**
      • [[SQLITE_FCNTL_PRAGMA]] +** ^Whenever a [PRAGMA] statement is parsed, an [SQLITE_FCNTL_PRAGMA] +** file control is sent to the open [sqlite3_file] object corresponding +** to the database file to which the pragma statement refers. ^The argument +** to the [SQLITE_FCNTL_PRAGMA] file control is an array of +** pointers to strings (char**) in which the second element of the array +** is the name of the pragma and the third element is the argument to the +** pragma or NULL if the pragma has no argument. ^The handler for an +** [SQLITE_FCNTL_PRAGMA] file control can optionally make the first element +** of the char** argument point to a string obtained from [sqlite3_mprintf()] +** or the equivalent and that string will become the result of the pragma or +** the error message if the pragma fails. ^If the +** [SQLITE_FCNTL_PRAGMA] file control returns [SQLITE_NOTFOUND], then normal +** [PRAGMA] processing continues. ^If the [SQLITE_FCNTL_PRAGMA] +** file control returns [SQLITE_OK], then the parser assumes that the +** VFS has handled the PRAGMA itself and the parser generates a no-op +** prepared statement if result string is NULL, or that returns a copy +** of the result string if the string is non-NULL. +** ^If the [SQLITE_FCNTL_PRAGMA] file control returns +** any result code other than [SQLITE_OK] or [SQLITE_NOTFOUND], that means +** that the VFS encountered an error while handling the [PRAGMA] and the +** compilation of the PRAGMA fails with an error. ^The [SQLITE_FCNTL_PRAGMA] +** file control occurs at the beginning of pragma statement analysis and so +** it is able to override built-in [PRAGMA] statements. +** +**
      • [[SQLITE_FCNTL_BUSYHANDLER]] +** ^The [SQLITE_FCNTL_BUSYHANDLER] +** file-control may be invoked by SQLite on the database file handle +** shortly after it is opened in order to provide a custom VFS with access +** to the connections busy-handler callback. The argument is of type (void **) +** - an array of two (void *) values. The first (void *) actually points +** to a function of type (int (*)(void *)). In order to invoke the connections +** busy-handler, this function should be invoked with the second (void *) in +** the array as the only argument. If it returns non-zero, then the operation +** should be retried. If it returns zero, the custom VFS should abandon the +** current operation. +** +**
      • [[SQLITE_FCNTL_TEMPFILENAME]] +** ^Application can invoke the [SQLITE_FCNTL_TEMPFILENAME] file-control +** to have SQLite generate a +** temporary filename using the same algorithm that is followed to generate +** temporary filenames for TEMP tables and other internal uses. The +** argument should be a char** which will be filled with the filename +** written into memory obtained from [sqlite3_malloc()]. The caller should +** invoke [sqlite3_free()] on the result to avoid a memory leak. +** +**
      • [[SQLITE_FCNTL_MMAP_SIZE]] +** The [SQLITE_FCNTL_MMAP_SIZE] file control is used to query or set the +** maximum number of bytes that will be used for memory-mapped I/O. +** The argument is a pointer to a value of type sqlite3_int64 that +** is an advisory maximum number of bytes in the file to memory map. The +** pointer is overwritten with the old value. The limit is not changed if +** the value originally pointed to is negative, and so the current limit +** can be queried by passing in a pointer to a negative number. This +** file-control is used internally to implement [PRAGMA mmap_size]. +** +**
      • [[SQLITE_FCNTL_TRACE]] +** The [SQLITE_FCNTL_TRACE] file control provides advisory information +** to the VFS about what the higher layers of the SQLite stack are doing. +** This file control is used by some VFS activity tracing [shims]. +** The argument is a zero-terminated string. Higher layers in the +** SQLite stack may generate instances of this file control if +** the [SQLITE_USE_FCNTL_TRACE] compile-time option is enabled. +** +**
      • [[SQLITE_FCNTL_HAS_MOVED]] +** The [SQLITE_FCNTL_HAS_MOVED] file control interprets its argument as a +** pointer to an integer and it writes a boolean into that integer depending +** on whether or not the file has been renamed, moved, or deleted since it +** was first opened. +** +**
      • [[SQLITE_FCNTL_WIN32_GET_HANDLE]] +** The [SQLITE_FCNTL_WIN32_GET_HANDLE] opcode can be used to obtain the +** underlying native file handle associated with a file handle. This file +** control interprets its argument as a pointer to a native file handle and +** writes the resulting value there. +** +**
      • [[SQLITE_FCNTL_WIN32_SET_HANDLE]] +** The [SQLITE_FCNTL_WIN32_SET_HANDLE] opcode is used for debugging. This +** opcode causes the xFileControl method to swap the file handle with the one +** pointed to by the pArg argument. This capability is used during testing +** and only needs to be supported when SQLITE_TEST is defined. +** +**
      • [[SQLITE_FCNTL_WAL_BLOCK]] +** The [SQLITE_FCNTL_WAL_BLOCK] is a signal to the VFS layer that it might +** be advantageous to block on the next WAL lock if the lock is not immediately +** available. The WAL subsystem issues this signal during rare +** circumstances in order to fix a problem with priority inversion. +** Applications should not use this file-control. +** +**
      • [[SQLITE_FCNTL_ZIPVFS]] +** The [SQLITE_FCNTL_ZIPVFS] opcode is implemented by zipvfs only. All other +** VFS should return SQLITE_NOTFOUND for this opcode. +** +**
      • [[SQLITE_FCNTL_RBU]] +** The [SQLITE_FCNTL_RBU] opcode is implemented by the special VFS used by +** the RBU extension only. All other VFS should return SQLITE_NOTFOUND for +** this opcode. +** +**
      • [[SQLITE_FCNTL_BEGIN_ATOMIC_WRITE]] +** If the [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE] opcode returns SQLITE_OK, then +** the file descriptor is placed in "batch write mode", which +** means all subsequent write operations will be deferred and done +** atomically at the next [SQLITE_FCNTL_COMMIT_ATOMIC_WRITE]. Systems +** that do not support batch atomic writes will return SQLITE_NOTFOUND. +** ^Following a successful SQLITE_FCNTL_BEGIN_ATOMIC_WRITE and prior to +** the closing [SQLITE_FCNTL_COMMIT_ATOMIC_WRITE] or +** [SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE], SQLite will make +** no VFS interface calls on the same [sqlite3_file] file descriptor +** except for calls to the xWrite method and the xFileControl method +** with [SQLITE_FCNTL_SIZE_HINT]. +** +**
      • [[SQLITE_FCNTL_COMMIT_ATOMIC_WRITE]] +** The [SQLITE_FCNTL_COMMIT_ATOMIC_WRITE] opcode causes all write +** operations since the previous successful call to +** [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE] to be performed atomically. +** This file control returns [SQLITE_OK] if and only if the writes were +** all performed successfully and have been committed to persistent storage. +** ^Regardless of whether or not it is successful, this file control takes +** the file descriptor out of batch write mode so that all subsequent +** write operations are independent. +** ^SQLite will never invoke SQLITE_FCNTL_COMMIT_ATOMIC_WRITE without +** a prior successful call to [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE]. +** +**
      • [[SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE]] +** The [SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE] opcode causes all write +** operations since the previous successful call to +** [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE] to be rolled back. +** ^This file control takes the file descriptor out of batch write mode +** so that all subsequent write operations are independent. +** ^SQLite will never invoke SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE without +** a prior successful call to [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE]. +**
      +*/ +#define SQLITE_FCNTL_LOCKSTATE 1 +#define SQLITE_FCNTL_GET_LOCKPROXYFILE 2 +#define SQLITE_FCNTL_SET_LOCKPROXYFILE 3 +#define SQLITE_FCNTL_LAST_ERRNO 4 +#define SQLITE_FCNTL_SIZE_HINT 5 +#define SQLITE_FCNTL_CHUNK_SIZE 6 +#define SQLITE_FCNTL_FILE_POINTER 7 +#define SQLITE_FCNTL_SYNC_OMITTED 8 +#define SQLITE_FCNTL_WIN32_AV_RETRY 9 +#define SQLITE_FCNTL_PERSIST_WAL 10 +#define SQLITE_FCNTL_OVERWRITE 11 +#define SQLITE_FCNTL_VFSNAME 12 +#define SQLITE_FCNTL_POWERSAFE_OVERWRITE 13 +#define SQLITE_FCNTL_PRAGMA 14 +#define SQLITE_FCNTL_BUSYHANDLER 15 +#define SQLITE_FCNTL_TEMPFILENAME 16 +#define SQLITE_FCNTL_MMAP_SIZE 18 +#define SQLITE_FCNTL_TRACE 19 +#define SQLITE_FCNTL_HAS_MOVED 20 +#define SQLITE_FCNTL_SYNC 21 +#define SQLITE_FCNTL_COMMIT_PHASETWO 22 +#define SQLITE_FCNTL_WIN32_SET_HANDLE 23 +#define SQLITE_FCNTL_WAL_BLOCK 24 +#define SQLITE_FCNTL_ZIPVFS 25 +#define SQLITE_FCNTL_RBU 26 +#define SQLITE_FCNTL_VFS_POINTER 27 +#define SQLITE_FCNTL_JOURNAL_POINTER 28 +#define SQLITE_FCNTL_WIN32_GET_HANDLE 29 +#define SQLITE_FCNTL_PDB 30 +#define SQLITE_FCNTL_BEGIN_ATOMIC_WRITE 31 +#define SQLITE_FCNTL_COMMIT_ATOMIC_WRITE 32 +#define SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE 33 + +/* deprecated names */ +#define SQLITE_GET_LOCKPROXYFILE SQLITE_FCNTL_GET_LOCKPROXYFILE +#define SQLITE_SET_LOCKPROXYFILE SQLITE_FCNTL_SET_LOCKPROXYFILE +#define SQLITE_LAST_ERRNO SQLITE_FCNTL_LAST_ERRNO + + +/* +** 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 +** at the internal representation of an [sqlite3_mutex]. It only +** deals with pointers to the [sqlite3_mutex] object. +** +** Mutexes are created using [sqlite3_mutex_alloc()]. +*/ +typedef struct sqlite3_mutex sqlite3_mutex; + +/* +** CAPI3REF: Loadable Extension Thunk +** +** A pointer to the opaque sqlite3_api_routines structure is passed as +** the third parameter to entry points of [loadable extensions]. This +** structure must be typedefed in order to work around compiler warnings +** on some platforms. +*/ +typedef struct sqlite3_api_routines sqlite3_api_routines; + +/* +** 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" +** in the name of the object stands for "virtual file system". See +** the [VFS | VFS documentation] for further information. +** +** The VFS interface is sometimes extended by adding new methods onto +** the end. Each time such an extension occurs, the iVersion field +** is incremented. The iVersion value started out as 1 in +** SQLite [version 3.5.0] on [dateof:3.5.0], then increased to 2 +** with SQLite [version 3.7.0] on [dateof:3.7.0], and then increased +** to 3 with SQLite [version 3.7.6] on [dateof:3.7.6]. Additional fields +** may be appended to the sqlite3_vfs object and the iVersion value +** may increase again in future versions of SQLite. +** Note that the structure +** of the sqlite3_vfs object changes in the transition from +** SQLite [version 3.5.9] to [version 3.6.0] on [dateof:3.6.0] +** and yet the iVersion field was not modified. +** +** The szOsFile field is the size of the subclassed [sqlite3_file] +** structure used by this VFS. mxPathname is the maximum length of +** a pathname in this VFS. +** +** Registered sqlite3_vfs objects are kept on a linked list formed by +** the pNext pointer. The [sqlite3_vfs_register()] +** and [sqlite3_vfs_unregister()] interfaces manage this list +** in a thread-safe way. The [sqlite3_vfs_find()] interface +** searches the list. Neither the application code nor the VFS +** implementation should use the pNext pointer. +** +** The pNext field is the only field in the sqlite3_vfs +** structure that SQLite will ever modify. SQLite will only access +** or modify this field while holding a particular static mutex. +** The application should never modify anything within the sqlite3_vfs +** object once the object has been registered. +** +** The zName field holds the name of the VFS module. The name must +** be unique across all VFS modules. +** +** [[sqlite3_vfs.xOpen]] +** ^SQLite guarantees that the zFilename parameter to xOpen +** is either a NULL pointer or string obtained +** from xFullPathname() with an optional suffix added. +** ^If a suffix is added to the zFilename parameter, it will +** consist of a single "-" character followed by no more than +** 11 alphanumeric and/or "-" characters. +** ^SQLite further guarantees that +** the string will be valid and unchanged until xClose() is +** called. Because of the previous sentence, +** the [sqlite3_file] can safely store a pointer to the +** filename if it needs to remember the filename for some reason. +** If the zFilename parameter to xOpen is a NULL pointer then xOpen +** must invent its own temporary name for the file. ^Whenever the +** xFilename parameter is NULL it will also be the case that the +** flags parameter will include [SQLITE_OPEN_DELETEONCLOSE]. +** +** The flags argument to xOpen() includes all bits set in +** the flags argument to [sqlite3_open_v2()]. Or if [sqlite3_open()] +** or [sqlite3_open16()] is used, then flags includes at least +** [SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE]. +** If xOpen() opens a file read-only then it sets *pOutFlags to +** include [SQLITE_OPEN_READONLY]. Other bits in *pOutFlags may be set. +** +** ^(SQLite will also add one of the following flags to the xOpen() +** call, depending on the object being opened: +** +**
        +**
      • [SQLITE_OPEN_MAIN_DB] +**
      • [SQLITE_OPEN_MAIN_JOURNAL] +**
      • [SQLITE_OPEN_TEMP_DB] +**
      • [SQLITE_OPEN_TEMP_JOURNAL] +**
      • [SQLITE_OPEN_TRANSIENT_DB] +**
      • [SQLITE_OPEN_SUBJOURNAL] +**
      • [SQLITE_OPEN_MASTER_JOURNAL] +**
      • [SQLITE_OPEN_WAL] +**
      )^ +** +** The file I/O implementation can use the object type flags to +** change the way it deals with files. For example, an application +** that does not care about crash recovery or rollback might make +** the open of a journal file a no-op. Writes to this journal would +** also be no-ops, and any attempt to read the journal would return +** SQLITE_IOERR. Or the implementation might recognize that a database +** file will be doing page-aligned sector reads and writes in a random +** order and set up its I/O subsystem accordingly. +** +** SQLite might also add one of the following flags to the xOpen method: +** +**
        +**
      • [SQLITE_OPEN_DELETEONCLOSE] +**
      • [SQLITE_OPEN_EXCLUSIVE] +**
      +** +** The [SQLITE_OPEN_DELETEONCLOSE] flag means the file should be +** deleted when it is closed. ^The [SQLITE_OPEN_DELETEONCLOSE] +** will be set for TEMP databases and their journals, transient +** databases, and subjournals. +** +** ^The [SQLITE_OPEN_EXCLUSIVE] flag is always used in conjunction +** with the [SQLITE_OPEN_CREATE] flag, which are both directly +** analogous to the O_EXCL and O_CREAT flags of the POSIX open() +** API. The SQLITE_OPEN_EXCLUSIVE flag, when paired with the +** SQLITE_OPEN_CREATE, is used to indicate that file should always +** be created, and that it is an error if it already exists. +** It is not used to indicate the file should be opened +** for exclusive access. +** +** ^At least szOsFile bytes of memory are allocated by SQLite +** to hold the [sqlite3_file] structure passed as the third +** argument to xOpen. The xOpen method does not have to +** allocate the structure; it should just fill it in. Note that +** the xOpen method must set the sqlite3_file.pMethods to either +** a valid [sqlite3_io_methods] object or to NULL. xOpen must do +** this even if the open fails. SQLite expects that the sqlite3_file.pMethods +** element will be valid after xOpen returns regardless of the success +** or failure of the xOpen call. +** +** [[sqlite3_vfs.xAccess]] +** ^The flags argument to xAccess() may be [SQLITE_ACCESS_EXISTS] +** to test for the existence of a file, or [SQLITE_ACCESS_READWRITE] to +** test whether a file is readable and writable, or [SQLITE_ACCESS_READ] +** to test whether a file is at least readable. The file can be a +** directory. +** +** ^SQLite will always allocate at least mxPathname+1 bytes for the +** output buffer xFullPathname. The exact size of the output buffer +** is also passed as a parameter to both methods. If the output buffer +** is not large enough, [SQLITE_CANTOPEN] should be returned. Since this is +** handled as a fatal error by SQLite, vfs implementations should endeavor +** to prevent this by setting mxPathname to a sufficiently large value. +** +** The xRandomness(), xSleep(), xCurrentTime(), and xCurrentTimeInt64() +** interfaces are not strictly a part of the filesystem, but they are +** included in the VFS structure for completeness. +** The xRandomness() function attempts to return nBytes bytes +** of good-quality randomness into zOut. The return value is +** the actual number of bytes of randomness obtained. +** The xSleep() method causes the calling thread to sleep for at +** least the number of microseconds given. ^The xCurrentTime() +** method returns a Julian Day Number for the current date and time as +** a floating point value. +** ^The xCurrentTimeInt64() method returns, as an integer, the Julian +** Day Number multiplied by 86400000 (the number of milliseconds in +** a 24-hour day). +** ^SQLite will use the xCurrentTimeInt64() method to get the current +** date and time if that method is available (if iVersion is 2 or +** greater and the function pointer is not NULL) and will fall back +** to xCurrentTime() if xCurrentTimeInt64() is unavailable. +** +** ^The xSetSystemCall(), xGetSystemCall(), and xNestSystemCall() interfaces +** are not used by the SQLite core. These optional interfaces are provided +** by some VFSes to facilitate testing of the VFS code. By overriding +** system calls with functions under its control, a test program can +** simulate faults and error conditions that would otherwise be difficult +** or impossible to induce. The set of system calls that can be overridden +** varies from one VFS to another, and from one version of the same VFS to the +** next. Applications that use these interfaces must be prepared for any +** or all of these interfaces to be NULL or for their behavior to change +** from one release to the next. Applications must not attempt to access +** any of these methods if the iVersion of the VFS is less than 3. +*/ +typedef struct sqlite3_vfs sqlite3_vfs; +typedef void (*sqlite3_syscall_ptr)(void); +struct sqlite3_vfs { + int iVersion; /* Structure version number (currently 3) */ + int szOsFile; /* Size of subclassed sqlite3_file */ + int mxPathname; /* Maximum file pathname length */ + sqlite3_vfs *pNext; /* Next registered VFS */ + const char *zName; /* Name of this virtual file system */ + void *pAppData; /* Pointer to application-specific data */ + int (*xOpen)(sqlite3_vfs*, const char *zName, sqlite3_file*, + int flags, int *pOutFlags); + int (*xDelete)(sqlite3_vfs*, const char *zName, int syncDir); + int (*xAccess)(sqlite3_vfs*, const char *zName, int flags, int *pResOut); + int (*xFullPathname)(sqlite3_vfs*, const char *zName, int nOut, char *zOut); + void *(*xDlOpen)(sqlite3_vfs*, const char *zFilename); + void (*xDlError)(sqlite3_vfs*, int nByte, char *zErrMsg); + void (*(*xDlSym)(sqlite3_vfs*,void*, const char *zSymbol))(void); + void (*xDlClose)(sqlite3_vfs*, void*); + int (*xRandomness)(sqlite3_vfs*, int nByte, char *zOut); + int (*xSleep)(sqlite3_vfs*, int microseconds); + int (*xCurrentTime)(sqlite3_vfs*, double*); + int (*xGetLastError)(sqlite3_vfs*, int, char *); + /* + ** The methods above are in version 1 of the sqlite_vfs object + ** definition. Those that follow are added in version 2 or later + */ + int (*xCurrentTimeInt64)(sqlite3_vfs*, sqlite3_int64*); + /* + ** The methods above are in versions 1 and 2 of the sqlite_vfs object. + ** Those below are for version 3 and greater. + */ + int (*xSetSystemCall)(sqlite3_vfs*, const char *zName, sqlite3_syscall_ptr); + sqlite3_syscall_ptr (*xGetSystemCall)(sqlite3_vfs*, const char *zName); + const char *(*xNextSystemCall)(sqlite3_vfs*, const char *zName); + /* + ** The methods above are in versions 1 through 3 of the sqlite_vfs object. + ** New fields may be appended in future versions. The iVersion + ** value will increment whenever this happens. + */ +}; + +/* +** 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. 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. +** With SQLITE_ACCESS_READWRITE, the xAccess method +** checks whether the named directory is both readable and writable +** (in other words, if files can be added, removed, and renamed within +** the directory). +** The SQLITE_ACCESS_READWRITE constant is currently used only by the +** [temp_store_directory pragma], though this could change in a future +** release of SQLite. +** With SQLITE_ACCESS_READ, the xAccess method +** checks whether the file is readable. The SQLITE_ACCESS_READ constant is +** currently unused, though it might be used in a future release of +** SQLite. +*/ +#define SQLITE_ACCESS_EXISTS 0 +#define SQLITE_ACCESS_READWRITE 1 /* Used by PRAGMA temp_store_directory */ +#define SQLITE_ACCESS_READ 2 /* Unused */ + +/* +** CAPI3REF: Flags for the xShmLock VFS method +** +** These integer constants define the various locking operations +** allowed by the xShmLock method of [sqlite3_io_methods]. The +** following are the only legal combinations of flags to the +** xShmLock method: +** +**
        +**
      • SQLITE_SHM_LOCK | SQLITE_SHM_SHARED +**
      • SQLITE_SHM_LOCK | SQLITE_SHM_EXCLUSIVE +**
      • SQLITE_SHM_UNLOCK | SQLITE_SHM_SHARED +**
      • SQLITE_SHM_UNLOCK | SQLITE_SHM_EXCLUSIVE +**
      +** +** When unlocking, the same SHARED or EXCLUSIVE flag must be supplied as +** was given on the corresponding lock. +** +** The xShmLock method can transition between unlocked and SHARED or +** between unlocked and EXCLUSIVE. It cannot transition between SHARED +** and EXCLUSIVE. +*/ +#define SQLITE_SHM_UNLOCK 1 +#define SQLITE_SHM_LOCK 2 +#define SQLITE_SHM_SHARED 4 +#define SQLITE_SHM_EXCLUSIVE 8 + +/* +** CAPI3REF: Maximum xShmLock index +** +** The xShmLock method on [sqlite3_io_methods] may use values +** between 0 and this upper bound as its "offset" argument. +** The SQLite core will never attempt to acquire or release a +** lock outside of this range +*/ +#define SQLITE_SHM_NLOCK 8 + + +/* +** CAPI3REF: Initialize The SQLite Library +** +** ^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 +** of sqlite3_initialize() does any initialization. All other calls +** 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 +** an effective call to sqlite3_shutdown() does any deinitialization. +** 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() 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 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 +** 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] +** 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, +** it is recommended that applications always invoke sqlite3_initialize() +** directly prior to using any other SQLite interface. Future releases +** of SQLite may require this. In other words, the behavior exhibited +** when SQLite is compiled with [SQLITE_OMIT_AUTOINIT] might become the +** default behavior in some future release of SQLite. +** +** The sqlite3_os_init() routine does operating-system specific +** initialization of the SQLite library. The sqlite3_os_end() +** routine undoes the effect of sqlite3_os_init(). Typical tasks +** performed by these routines include allocation or deallocation +** of static resources, initialization of global variables, +** setting up a default [sqlite3_vfs] module, or setting up +** a default configuration using [sqlite3_config()]. +** +** The application should never invoke either sqlite3_os_init() +** or sqlite3_os_end() directly. The application should only invoke +** sqlite3_initialize() and sqlite3_shutdown(). The sqlite3_os_init() +** interface is called automatically by sqlite3_initialize() and +** sqlite3_os_end() is called by sqlite3_shutdown(). Appropriate +** implementations for sqlite3_os_init() and sqlite3_os_end() +** are built into SQLite when it is compiled for Unix, Windows, or OS/2. +** When [custom builds | built for other platforms] +** (using the [SQLITE_OS_OTHER=1] compile-time +** option) the application must supply a suitable implementation for +** sqlite3_os_init() and sqlite3_os_end(). An application-supplied +** implementation of sqlite3_os_init() or sqlite3_os_end() +** must return [SQLITE_OK] on success and some other [error code] upon +** failure. +*/ +SQLITE_API int sqlite3_initialize(void); +SQLITE_API int sqlite3_shutdown(void); +SQLITE_API int sqlite3_os_init(void); +SQLITE_API int sqlite3_os_end(void); + +/* +** CAPI3REF: Configuring The SQLite Library +** +** The sqlite3_config() interface is used to make global configuration +** changes to SQLite in order to tune SQLite to the specific needs of +** the application. The default configuration is recommended for most +** applications and so this routine is usually not necessary. It is +** provided to support rare applications with unusual needs. +** +** The sqlite3_config() interface is not threadsafe. The application +** must ensure that no other SQLite interfaces are invoked by other +** threads while sqlite3_config() is running. +** +** The sqlite3_config() interface +** may only be invoked prior to library initialization using +** [sqlite3_initialize()] or after shutdown by [sqlite3_shutdown()]. +** ^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 +** [configuration option] that determines +** what property of SQLite is to be configured. Subsequent arguments +** vary depending on the [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 +** then this routine returns a non-zero [error code]. +*/ +SQLITE_API int sqlite3_config(int, ...); + +/* +** CAPI3REF: Configure database connections +** METHOD: sqlite3 +** +** 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 second argument to sqlite3_db_config(D,V,...) is the +** [SQLITE_DBCONFIG_LOOKASIDE | configuration verb] - an integer code +** that indicates what aspect of the [database connection] is being configured. +** Subsequent arguments vary depending on the configuration verb. +** +** ^Calls to sqlite3_db_config() return SQLITE_OK if and only if +** the call is considered successful. +*/ +SQLITE_API int sqlite3_db_config(sqlite3*, int op, ...); + +/* +** CAPI3REF: Memory Allocation Routines +** +** An instance of this object defines the interface between SQLite +** and low-level memory allocation routines. +** +** This object is used in only one place in the SQLite interface. +** A pointer to an instance of this object is the argument to +** [sqlite3_config()] when the configuration option is +** [SQLITE_CONFIG_MALLOC] or [SQLITE_CONFIG_GETMALLOC]. +** By creating an instance of this object +** and passing it to [sqlite3_config]([SQLITE_CONFIG_MALLOC]) +** during configuration, an application can specify an alternative +** memory allocation subsystem for SQLite to use for all of its +** dynamic memory needs. +** +** Note that SQLite comes with several [built-in memory allocators] +** that are perfectly adequate for the overwhelming majority of applications +** and that this object is only useful to a tiny minority of applications +** with specialized memory allocation requirements. This object is +** also used during testing of SQLite in order to specify an alternative +** memory allocator that simulates memory out-of-memory conditions in +** order to verify that SQLite recovers gracefully from such +** conditions. +** +** The xMalloc, xRealloc, and xFree methods must work like the +** malloc(), realloc() and free() functions from the standard C library. +** ^SQLite guarantees that the second argument to +** xRealloc is always a value returned by a prior call to xRoundup. +** +** xSize should return the allocated size of a memory allocation +** previously obtained from xMalloc or xRealloc. The allocated size +** is always at least as big as the requested size but may be larger. +** +** The xRoundup method returns what would be the allocated size of +** a memory allocation given a particular requested size. Most memory +** allocators round up memory allocations at least to the next multiple +** of 8. Some allocators round up to a larger multiple or to a power of 2. +** Every memory allocation request coming in through [sqlite3_malloc()] +** or [sqlite3_realloc()] first calls xRoundup. If xRoundup returns 0, +** that causes the corresponding memory allocation to fail. +** +** The xInit method initializes the memory allocator. For example, +** it might allocate any require mutexes or initialize internal data +** structures. The xShutdown method is invoked (indirectly) by +** [sqlite3_shutdown()] and should deallocate any resources acquired +** by xInit. The pAppData pointer is used as the only parameter to +** xInit and xShutdown. +** +** SQLite holds the [SQLITE_MUTEX_STATIC_MASTER] 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. For all other methods, SQLite +** holds the [SQLITE_MUTEX_STATIC_MEM] mutex as long as the +** [SQLITE_CONFIG_MEMSTATUS] configuration option is turned on (which +** it is by default) and so the methods are automatically serialized. +** However, if [SQLITE_CONFIG_MEMSTATUS] is disabled, then the other +** methods must be threadsafe or else make their own arrangements for +** serialization. +** +** SQLite will never invoke xInit() more than once without an intervening +** call to xShutdown(). +*/ +typedef struct sqlite3_mem_methods sqlite3_mem_methods; +struct sqlite3_mem_methods { + void *(*xMalloc)(int); /* Memory allocation function */ + void (*xFree)(void*); /* Free a prior allocation */ + void *(*xRealloc)(void*,int); /* Resize an allocation */ + int (*xSize)(void*); /* Return the size of an allocation */ + int (*xRoundup)(int); /* Round up request size to allocation size */ + int (*xInit)(void*); /* Initialize the memory allocator */ + void (*xShutdown)(void*); /* Deinitialize the memory allocator */ + void *pAppData; /* Argument to xInit() and xShutdown() */ +}; + +/* +** CAPI3REF: Configuration Options +** KEYWORDS: {configuration option} +** +** These constants are the available integer configuration options that +** can be passed as the first argument to the [sqlite3_config()] interface. +** +** 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_config()] to make sure that +** the call worked. The [sqlite3_config()] interface will return a +** non-zero [error code] if a discontinued or unsupported configuration option +** is invoked. +** +**
      +** [[SQLITE_CONFIG_SINGLETHREAD]]
      SQLITE_CONFIG_SINGLETHREAD
      +**
      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. ^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]]
      SQLITE_CONFIG_MULTITHREAD
      +**
      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. ^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]]
      SQLITE_CONFIG_SERIALIZED
      +**
      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 +** [SQLITE_THREADSAFE=1]) the SQLite library will itself serialize access +** 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. +** ^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]]
      SQLITE_CONFIG_MALLOC
      +**
      ^(The SQLITE_CONFIG_MALLOC 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.)^ ^SQLite makes +** its own private copy of the content of the [sqlite3_mem_methods] structure +** before the [sqlite3_config()] call returns.
      +** +** [[SQLITE_CONFIG_GETMALLOC]]
      SQLITE_CONFIG_GETMALLOC
      +**
      ^(The SQLITE_CONFIG_GETMALLOC 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.)^ +** 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.
      +** +** [[SQLITE_CONFIG_SMALL_MALLOC]]
      SQLITE_CONFIG_SMALL_MALLOC
      +**
      ^The SQLITE_CONFIG_SMALL_MALLOC option takes single argument of +** type int, interpreted as a boolean, which if true provides a hint to +** SQLite that it should avoid large memory allocations if possible. +** SQLite will run faster if it is free to make large memory allocations, +** but some application might prefer to run slower in exchange for +** guarantees about memory fragmentation that are possible if large +** allocations are avoided. This hint is normally off. +**
      +** +** [[SQLITE_CONFIG_MEMSTATUS]]
      SQLITE_CONFIG_MEMSTATUS
      +**
      ^The SQLITE_CONFIG_MEMSTATUS option takes single argument of type int, +** interpreted as a boolean, which enables or disables the collection of +** memory allocation statistics. ^(When memory allocation statistics are +** disabled, the following SQLite interfaces become non-operational: +**
        +**
      • [sqlite3_memory_used()] +**
      • [sqlite3_memory_highwater()] +**
      • [sqlite3_soft_heap_limit64()] +**
      • [sqlite3_status64()] +**
      )^ +** ^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]]
      SQLITE_CONFIG_SCRATCH
      +**
      The SQLITE_CONFIG_SCRATCH option is no longer used. +**
      +** +** [[SQLITE_CONFIG_PAGECACHE]]
      SQLITE_CONFIG_PAGECACHE
      +**
      ^The SQLITE_CONFIG_PAGECACHE option specifies a memory pool +** that SQLite can use for the database page cache with the default page +** cache implementation. +** This configuration option is a no-op if an application-define page +** cache implementation is loaded using the [SQLITE_CONFIG_PCACHE2]. +** ^There are three arguments to SQLITE_CONFIG_PAGECACHE: A pointer to +** 8-byte aligned memory (pMem), the size of each page cache line (sz), +** and the number of cache lines (N). +** The sz argument should be the size of the largest database page +** (a power of two between 512 and 65536) plus some extra bytes for each +** page header. ^The number of extra bytes needed by the page header +** can be determined using [SQLITE_CONFIG_PCACHE_HDRSZ]. +** ^It is harmless, apart from the wasted memory, +** for the sz parameter to be larger than necessary. The pMem +** argument must be either a NULL pointer or a pointer to an 8-byte +** aligned block of memory of at least sz*N bytes, otherwise +** subsequent behavior is undefined. +** ^When pMem is not NULL, SQLite will strive to use the memory provided +** to satisfy page cache needs, falling back to [sqlite3_malloc()] if +** a page cache line is larger than sz bytes or if all of the pMem buffer +** is exhausted. +** ^If pMem is NULL and N is non-zero, then each database connection +** does an initial bulk allocation for page cache memory +** from [sqlite3_malloc()] sufficient for N cache lines if N is positive or +** of -1024*N bytes if N is negative, . ^If additional +** page cache memory is needed beyond what is provided by the initial +** allocation, then SQLite goes to [sqlite3_malloc()] separately for each +** additional cache line.
      +** +** [[SQLITE_CONFIG_HEAP]]
      SQLITE_CONFIG_HEAP
      +**
      ^The SQLITE_CONFIG_HEAP 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_PAGECACHE]. +** ^The SQLITE_CONFIG_HEAP option is only available if SQLite is compiled +** with either [SQLITE_ENABLE_MEMSYS3] or [SQLITE_ENABLE_MEMSYS5] and returns +** [SQLITE_ERROR] if invoked otherwise. +** ^There are three arguments to SQLITE_CONFIG_HEAP: +** 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 +** to using its default memory allocator (the system malloc() implementation), +** undoing any prior invocation of [SQLITE_CONFIG_MALLOC]. ^If the +** memory pointer is not NULL then the alternative memory +** allocator is engaged to handle all of SQLites memory allocation needs. +** The first pointer (the memory pointer) must be aligned to an 8-byte +** boundary or subsequent behavior of SQLite will be undefined. +** The minimum allocation size is capped at 2**12. Reasonable values +** for the minimum allocation size are 2**5 through 2**8.
      +** +** [[SQLITE_CONFIG_MUTEX]]
      SQLITE_CONFIG_MUTEX
      +**
      ^(The SQLITE_CONFIG_MUTEX 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.)^ ^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]]
      SQLITE_CONFIG_GETMUTEX
      +**
      ^(The SQLITE_CONFIG_GETMUTEX 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.)^ +** 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. ^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]]
      SQLITE_CONFIG_LOOKASIDE
      +**
      ^(The SQLITE_CONFIG_LOOKASIDE option takes two arguments that determine +** the default size of lookaside memory 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.)^ ^(SQLITE_CONFIG_LOOKASIDE +** sets the default lookaside size. The [SQLITE_DBCONFIG_LOOKASIDE] +** option to [sqlite3_db_config()] can be used to change the lookaside +** configuration on individual connections.)^
      +** +** [[SQLITE_CONFIG_PCACHE2]]
      SQLITE_CONFIG_PCACHE2
      +**
      ^(The SQLITE_CONFIG_PCACHE2 option takes a single argument which is +** a pointer to an [sqlite3_pcache_methods2] object. This object specifies +** the interface to a custom page cache implementation.)^ +** ^SQLite makes a copy of the [sqlite3_pcache_methods2] object.
      +** +** [[SQLITE_CONFIG_GETPCACHE2]]
      SQLITE_CONFIG_GETPCACHE2
      +**
      ^(The SQLITE_CONFIG_GETPCACHE2 option takes a single argument which +** is a pointer to an [sqlite3_pcache_methods2] object. SQLite copies of +** the current page cache implementation into that object.)^
      +** +** [[SQLITE_CONFIG_LOG]]
      SQLITE_CONFIG_LOG
      +**
      The SQLITE_CONFIG_LOG option is used to configure the SQLite +** global [error log]. +** (^The SQLITE_CONFIG_LOG option takes two arguments: a pointer to a +** function with a call signature of void(*)(void*,int,const char*), +** and a pointer to void. ^If the function pointer is not NULL, it is +** invoked by [sqlite3_log()] to process each logging event. ^If the +** function pointer is NULL, the [sqlite3_log()] interface becomes a no-op. +** ^The void pointer that is the second argument to SQLITE_CONFIG_LOG is +** passed through as the first parameter to the application-defined logger +** function whenever that function is invoked. ^The second parameter to +** the logger function is a copy of the first parameter to the corresponding +** [sqlite3_log()] call and is intended to be a [result code] or an +** [extended result code]. ^The third parameter passed to the logger is +** log message after formatting via [sqlite3_snprintf()]. +** The SQLite logging interface is not reentrant; the logger function +** supplied by the application must not invoke any SQLite interface. +** In a multi-threaded application, the application-defined logger +** function must be threadsafe.
      +** +** [[SQLITE_CONFIG_URI]]
      SQLITE_CONFIG_URI +**
      ^(The SQLITE_CONFIG_URI option takes a single argument of type int. +** If non-zero, then URI handling is globally enabled. If the parameter is zero, +** then URI handling is globally disabled.)^ ^If URI handling is globally +** enabled, all filenames passed to [sqlite3_open()], [sqlite3_open_v2()], +** [sqlite3_open16()] or +** specified as part of [ATTACH] commands are interpreted as URIs, regardless +** of whether or not the [SQLITE_OPEN_URI] flag is set when the database +** connection is opened. ^If it is globally disabled, filenames are +** only interpreted as URIs if the SQLITE_OPEN_URI flag is set when the +** database connection is opened. ^(By default, URI handling is globally +** disabled. The default value may be changed by compiling with the +** [SQLITE_USE_URI] symbol defined.)^ +** +** [[SQLITE_CONFIG_COVERING_INDEX_SCAN]]
      SQLITE_CONFIG_COVERING_INDEX_SCAN +**
      ^The SQLITE_CONFIG_COVERING_INDEX_SCAN option takes a single integer +** argument which is interpreted as a boolean in order to enable or disable +** the use of covering indices for full table scans in the query optimizer. +** ^The default setting is determined +** by the [SQLITE_ALLOW_COVERING_INDEX_SCAN] compile-time option, or is "on" +** if that compile-time option is omitted. +** The ability to disable the use of covering indices for full table scans +** is because some incorrectly coded legacy applications might malfunction +** when the optimization is enabled. Providing the ability to +** disable the optimization allows the older, buggy application code to work +** without change even with newer versions of SQLite. +** +** [[SQLITE_CONFIG_PCACHE]] [[SQLITE_CONFIG_GETPCACHE]] +**
      SQLITE_CONFIG_PCACHE and SQLITE_CONFIG_GETPCACHE +**
      These options are obsolete and should not be used by new code. +** They are retained for backwards compatibility but are now no-ops. +**
      +** +** [[SQLITE_CONFIG_SQLLOG]] +**
      SQLITE_CONFIG_SQLLOG +**
      This option is only available if sqlite is compiled with the +** [SQLITE_ENABLE_SQLLOG] pre-processor macro defined. The first argument should +** be a pointer to a function of type void(*)(void*,sqlite3*,const char*, int). +** The second should be of type (void*). The callback is invoked by the library +** in three separate circumstances, identified by the value passed as the +** fourth parameter. If the fourth parameter is 0, then the database connection +** passed as the second argument has just been opened. The third argument +** points to a buffer containing the name of the main database file. If the +** fourth parameter is 1, then the SQL statement that the third parameter +** points to has just been executed. Or, if the fourth parameter is 2, then +** the connection being passed as the second parameter is being closed. The +** third parameter is passed NULL In this case. An example of using this +** configuration option can be seen in the "test_sqllog.c" source file in +** the canonical SQLite source tree.
      +** +** [[SQLITE_CONFIG_MMAP_SIZE]] +**
      SQLITE_CONFIG_MMAP_SIZE +**
      ^SQLITE_CONFIG_MMAP_SIZE takes two 64-bit integer (sqlite3_int64) values +** that are the default mmap size limit (the default setting for +** [PRAGMA mmap_size]) and the maximum allowed mmap size limit. +** ^The default setting can be overridden by each database connection using +** either the [PRAGMA mmap_size] command, or by using the +** [SQLITE_FCNTL_MMAP_SIZE] file control. ^(The maximum allowed mmap size +** will be silently truncated if necessary so that it does not exceed the +** compile-time maximum mmap size set by the +** [SQLITE_MAX_MMAP_SIZE] compile-time option.)^ +** ^If either argument to this option is negative, then that argument is +** changed to its compile-time default. +** +** [[SQLITE_CONFIG_WIN32_HEAPSIZE]] +**
      SQLITE_CONFIG_WIN32_HEAPSIZE +**
      ^The SQLITE_CONFIG_WIN32_HEAPSIZE option is only available if SQLite is +** compiled for Windows with the [SQLITE_WIN32_MALLOC] pre-processor macro +** defined. ^SQLITE_CONFIG_WIN32_HEAPSIZE takes a 32-bit unsigned integer value +** that specifies the maximum size of the created heap. +** +** [[SQLITE_CONFIG_PCACHE_HDRSZ]] +**
      SQLITE_CONFIG_PCACHE_HDRSZ +**
      ^The SQLITE_CONFIG_PCACHE_HDRSZ option takes a single parameter which +** is a pointer to an integer and writes into that integer the number of extra +** bytes per page required for each page in [SQLITE_CONFIG_PAGECACHE]. +** The amount of extra space required can change depending on the compiler, +** target platform, and SQLite version. +** +** [[SQLITE_CONFIG_PMASZ]] +**
      SQLITE_CONFIG_PMASZ +**
      ^The SQLITE_CONFIG_PMASZ option takes a single parameter which +** is an unsigned integer and sets the "Minimum PMA Size" for the multithreaded +** sorter to that integer. The default minimum PMA Size is set by the +** [SQLITE_SORTER_PMASZ] compile-time option. New threads are launched +** to help with sort operations when multithreaded sorting +** is enabled (using the [PRAGMA threads] command) and the amount of content +** to be sorted exceeds the page size times the minimum of the +** [PRAGMA cache_size] setting and this value. +** +** [[SQLITE_CONFIG_STMTJRNL_SPILL]] +**
      SQLITE_CONFIG_STMTJRNL_SPILL +**
      ^The SQLITE_CONFIG_STMTJRNL_SPILL option takes a single parameter which +** becomes the [statement journal] spill-to-disk threshold. +** [Statement journals] are held in memory until their size (in bytes) +** exceeds this threshold, at which point they are written to disk. +** Or if the threshold is -1, statement journals are always held +** exclusively in memory. +** Since many statement journals never become large, setting the spill +** threshold to a value such as 64KiB can greatly reduce the amount of +** I/O required to support statement rollback. +** The default value for this setting is controlled by the +** [SQLITE_STMTJRNL_SPILL] compile-time option. +**
      +*/ +#define SQLITE_CONFIG_SINGLETHREAD 1 /* nil */ +#define SQLITE_CONFIG_MULTITHREAD 2 /* nil */ +#define SQLITE_CONFIG_SERIALIZED 3 /* nil */ +#define SQLITE_CONFIG_MALLOC 4 /* sqlite3_mem_methods* */ +#define SQLITE_CONFIG_GETMALLOC 5 /* sqlite3_mem_methods* */ +#define SQLITE_CONFIG_SCRATCH 6 /* No longer used */ +#define SQLITE_CONFIG_PAGECACHE 7 /* void*, int sz, int N */ +#define SQLITE_CONFIG_HEAP 8 /* void*, int nByte, int min */ +#define SQLITE_CONFIG_MEMSTATUS 9 /* boolean */ +#define SQLITE_CONFIG_MUTEX 10 /* sqlite3_mutex_methods* */ +#define SQLITE_CONFIG_GETMUTEX 11 /* sqlite3_mutex_methods* */ +/* previously SQLITE_CONFIG_CHUNKALLOC 12 which is now unused. */ +#define SQLITE_CONFIG_LOOKASIDE 13 /* int int */ +#define SQLITE_CONFIG_PCACHE 14 /* no-op */ +#define SQLITE_CONFIG_GETPCACHE 15 /* no-op */ +#define SQLITE_CONFIG_LOG 16 /* xFunc, void* */ +#define SQLITE_CONFIG_URI 17 /* int */ +#define SQLITE_CONFIG_PCACHE2 18 /* sqlite3_pcache_methods2* */ +#define SQLITE_CONFIG_GETPCACHE2 19 /* sqlite3_pcache_methods2* */ +#define SQLITE_CONFIG_COVERING_INDEX_SCAN 20 /* int */ +#define SQLITE_CONFIG_SQLLOG 21 /* xSqllog, void* */ +#define SQLITE_CONFIG_MMAP_SIZE 22 /* sqlite3_int64, sqlite3_int64 */ +#define SQLITE_CONFIG_WIN32_HEAPSIZE 23 /* int nByte */ +#define SQLITE_CONFIG_PCACHE_HDRSZ 24 /* int *psz */ +#define SQLITE_CONFIG_PMASZ 25 /* unsigned int szPma */ +#define SQLITE_CONFIG_STMTJRNL_SPILL 26 /* int nByte */ +#define SQLITE_CONFIG_SMALL_MALLOC 27 /* boolean */ + +/* +** CAPI3REF: Database Connection Configuration Options +** +** These constants are the available integer configuration options that +** can be passed as the second argument to the [sqlite3_db_config()] interface. +** +** 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 +** 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 +** [lookaside memory allocator] configuration for the [database connection]. +** ^The first argument (the third parameter to [sqlite3_db_config()] is a +** pointer to a memory buffer to use for lookaside memory. +** ^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 to +** SQLITE_DBCONFIG_LOOKASIDE is not a multiple of 8, it is internally +** rounded down to the next smaller multiple of 8. ^(The lookaside memory +** configuration for a database connection can only be changed when that +** connection is not currently using lookaside memory, or in other words +** when the "current value" returned by +** [sqlite3_db_status](D,[SQLITE_CONFIG_LOOKASIDE],...) is zero. +** Any attempt to change the lookaside memory configuration when lookaside +** memory is in use leaves the configuration unchanged and returns +** [SQLITE_BUSY].)^
      +** +**
      SQLITE_DBCONFIG_ENABLE_FKEY
      +**
      ^This option is used to enable or disable the enforcement of +** [foreign key constraints]. There should be two additional arguments. +** The first argument is an integer which is 0 to disable FK enforcement, +** positive to enable FK enforcement or negative to leave FK enforcement +** unchanged. The second parameter is a pointer to an integer into which +** is written 0 or 1 to indicate whether FK enforcement is off or on +** following this call. The second parameter may be a NULL pointer, in +** which case the FK enforcement setting is not reported back.
      +** +**
      SQLITE_DBCONFIG_ENABLE_TRIGGER
      +**
      ^This option is used to enable or disable [CREATE TRIGGER | triggers]. +** There should be two additional arguments. +** The first argument is an integer which is 0 to disable triggers, +** positive to enable triggers or negative to leave the setting unchanged. +** The second parameter is a pointer to an integer into which +** is written 0 or 1 to indicate whether triggers are disabled or enabled +** following this call. The second parameter may be a NULL pointer, in +** which case the trigger setting is not reported back.
      +** +**
      SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER
      +**
      ^This option is used to enable or disable the two-argument +** version of the [fts3_tokenizer()] function which is part of the +** [FTS3] full-text search engine extension. +** There should be two additional arguments. +** The first argument is an integer which is 0 to disable fts3_tokenizer() or +** positive to enable fts3_tokenizer() or negative to leave the setting +** unchanged. +** The second parameter is a pointer to an integer into which +** is written 0 or 1 to indicate whether fts3_tokenizer is disabled or enabled +** following this call. The second parameter may be a NULL pointer, in +** which case the new setting is not reported back.
      +** +**
      SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION
      +**
      ^This option is used to enable or disable the [sqlite3_load_extension()] +** interface independently of the [load_extension()] SQL function. +** The [sqlite3_enable_load_extension()] API enables or disables both the +** C-API [sqlite3_load_extension()] and the SQL function [load_extension()]. +** There should be two additional arguments. +** When the first argument to this interface is 1, then only the C-API is +** enabled and the SQL function remains disabled. If the first argument to +** this interface is 0, then both the C-API and the SQL function are disabled. +** If the first argument is -1, then no changes are made to state of either the +** C-API or the SQL function. +** The second parameter is a pointer to an integer into which +** is written 0 or 1 to indicate whether [sqlite3_load_extension()] interface +** is disabled or enabled following this call. The second parameter may +** be a NULL pointer, in which case the new setting is not reported back. +**
      +** +**
      SQLITE_DBCONFIG_MAINDBNAME
      +**
      ^This option is used to change the name of the "main" database +** schema. ^The sole argument is a pointer to a constant UTF8 string +** which will become the new schema name in place of "main". ^SQLite +** does not make a copy of the new main schema name string, so the application +** must ensure that the argument passed into this DBCONFIG option is unchanged +** until after the database connection closes. +**
      +** +**
      SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE
      +**
      Usually, when a database in wal mode is closed or detached from a +** database handle, SQLite checks if this will mean that there are now no +** connections at all to the database. If so, it performs a checkpoint +** operation before closing the connection. This option may be used to +** override this behaviour. The first parameter passed to this operation +** is an integer - non-zero to disable checkpoints-on-close, or zero (the +** default) to enable them. The second parameter is a pointer to an integer +** into which is written 0 or 1 to indicate whether checkpoints-on-close +** have been disabled - 0 if they are not disabled, 1 if they are. +**
      +**
      SQLITE_DBCONFIG_ENABLE_QPSG
      +**
      ^(The SQLITE_DBCONFIG_ENABLE_QPSG option activates or deactivates +** the [query planner stability guarantee] (QPSG). When the QPSG is active, +** a single SQL query statement will always use the same algorithm regardless +** of values of [bound parameters].)^ The QPSG disables some query optimizations +** that look at the values of bound parameters, which can make some queries +** slower. But the QPSG has the advantage of more predictable behavior. With +** the QPSG active, SQLite will always use the same query plan in the field as +** was used during testing in the lab. +**
      +**
      SQLITE_DBCONFIG_TRIGGER_EQP
      +**
      By default, the output of EXPLAIN QUERY PLAN commands does not +** include output for any operations performed by trigger programs. This +** option is used to set or clear (the default) a flag that governs this +** behavior. The first parameter passed to this operation is an integer - +** non-zero to enable output for trigger programs, or zero to disable it. +** The second parameter is a pointer to an integer into which is written +** 0 or 1 to indicate whether output-for-triggers has been disabled - 0 if +** it is not disabled, 1 if it is. +**
      +**
      +*/ +#define SQLITE_DBCONFIG_MAINDBNAME 1000 /* const char* */ +#define SQLITE_DBCONFIG_LOOKASIDE 1001 /* void* int int */ +#define SQLITE_DBCONFIG_ENABLE_FKEY 1002 /* int int* */ +#define SQLITE_DBCONFIG_ENABLE_TRIGGER 1003 /* int int* */ +#define SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER 1004 /* int int* */ +#define SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION 1005 /* int int* */ +#define SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE 1006 /* int int* */ +#define SQLITE_DBCONFIG_ENABLE_QPSG 1007 /* int int* */ +#define SQLITE_DBCONFIG_TRIGGER_EQP 1008 /* int int* */ +#define SQLITE_DBCONFIG_MAX 1008 /* Largest DBCONFIG */ + +/* +** CAPI3REF: Enable Or Disable Extended Result Codes +** METHOD: sqlite3 +** +** ^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 +** METHOD: sqlite3 +** +** ^Each entry in most SQLite tables (except for [WITHOUT ROWID] tables) +** 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 +** the table has a column of type [INTEGER PRIMARY KEY] then that column +** is another alias for the rowid. +** +** ^The sqlite3_last_insert_rowid(D) interface usually returns the [rowid] of +** the most recent successful [INSERT] into a rowid table or [virtual table] +** on database connection D. ^Inserts into [WITHOUT ROWID] tables are not +** recorded. ^If no successful [INSERT]s into rowid tables have ever occurred +** on the database connection D, then sqlite3_last_insert_rowid(D) returns +** zero. +** +** As well as being set automatically as rows are inserted into database +** tables, the value returned by this function may be set explicitly by +** [sqlite3_set_last_insert_rowid()] +** +** Some virtual table implementations may INSERT rows into rowid tables as +** part of committing a transaction (e.g. to flush data accumulated in memory +** to disk). In this case subsequent calls to this function return the rowid +** associated with these internal INSERT operations, which leads to +** unintuitive results. Virtual table implementations that do write to rowid +** tables in this way can avoid this problem by restoring the original +** rowid value using [sqlite3_set_last_insert_rowid()] before returning +** control to the user. +** +** ^(If an [INSERT] occurs within a trigger then this routine will +** return the [rowid] of the inserted row as long as the trigger is +** running. Once the trigger program ends, the value returned +** by this routine reverts to what it was before the trigger was fired.)^ +** +** ^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, +** and INSERT OR ABORT make no changes to the return value of this +** 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.)^ +** +** ^For the purposes of this routine, an [INSERT] is considered to +** be successful even if it is subsequently rolled back. +** +** 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()] +** function is running and thus changes the last insert [rowid], +** then the value returned by [sqlite3_last_insert_rowid()] is +** unpredictable and might not equal either the old or the new +** last insert [rowid]. +*/ +SQLITE_API sqlite3_int64 sqlite3_last_insert_rowid(sqlite3*); + +/* +** CAPI3REF: Set the Last Insert Rowid value. +** METHOD: sqlite3 +** +** The sqlite3_set_last_insert_rowid(D, R) method allows the application to +** set the value returned by calling sqlite3_last_insert_rowid(D) to R +** without inserting a row into the database. +*/ +SQLITE_API void sqlite3_set_last_insert_rowid(sqlite3*,sqlite3_int64); + +/* +** CAPI3REF: Count The Number Of Rows Modified +** METHOD: sqlite3 +** +** ^This function returns the number of rows modified, inserted or +** deleted by the most recently completed INSERT, UPDATE or DELETE +** statement on the database connection specified by the only parameter. +** ^Executing any other type of SQL statement does not modify the value +** returned by this function. +** +** ^Only changes made directly by the INSERT, UPDATE or DELETE statement are +** considered - auxiliary changes caused by [CREATE TRIGGER | triggers], +** [foreign key actions] or [REPLACE] constraint resolution are not counted. +** +** Changes to a view that are intercepted by +** [INSTEAD OF trigger | INSTEAD OF triggers] are not counted. ^The value +** returned by sqlite3_changes() immediately after an INSERT, UPDATE or +** DELETE statement run on a view is always zero. Only changes made to real +** tables are counted. +** +** Things are more complicated if the sqlite3_changes() function is +** executed while a trigger program is running. This may happen if the +** program uses the [changes() SQL function], or if some other callback +** function invokes sqlite3_changes() directly. Essentially: +** +**
        +**
      • ^(Before entering a trigger program the value returned by +** sqlite3_changes() function is saved. After the trigger program +** has finished, the original value is restored.)^ +** +**
      • ^(Within a trigger program each INSERT, UPDATE and DELETE +** statement sets the value returned by sqlite3_changes() +** upon completion as normal. Of course, this value will not include +** any changes performed by sub-triggers, as the sqlite3_changes() +** value will be saved and restored after each sub-trigger has run.)^ +**
      +** +** ^This means that if the changes() SQL function (or similar) is used +** by the first INSERT, UPDATE or DELETE statement within a trigger, it +** returns the value as set when the calling statement began executing. +** ^If it is used by the second or subsequent such statement within a trigger +** program, the value returned reflects the number of rows modified by the +** previous INSERT, UPDATE or DELETE statement within the same trigger. +** +** 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 +** is unpredictable and not meaningful. +*/ +SQLITE_API int sqlite3_changes(sqlite3*); + +/* +** CAPI3REF: Total Number Of Rows Modified +** METHOD: sqlite3 +** +** ^This function returns the total number of rows inserted, modified or +** deleted by all [INSERT], [UPDATE] or [DELETE] statements completed +** since the database connection was opened, including those executed as +** part of trigger programs. ^Executing any other type of SQL statement +** does not affect the value returned by sqlite3_total_changes(). +** +** ^Changes made as part of [foreign key actions] are included in the +** count, but those made as part of REPLACE constraint resolution are +** not. ^Changes to a view that are intercepted by INSTEAD OF triggers +** are not counted. +** +** 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 +** returned is unpredictable and not meaningful. +*/ +SQLITE_API int sqlite3_total_changes(sqlite3*); + +/* +** CAPI3REF: Interrupt A Long-Running Query +** METHOD: sqlite3 +** +** ^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 +** 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 +** 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 +** 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 +** 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 +** 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 +** SQL statements is a no-op and has no effect on SQL statements +** that are started after the sqlite3_interrupt() call returns. +*/ +SQLITE_API void sqlite3_interrupt(sqlite3*); + +/* +** 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 +** 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 +** 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 +** and comments that follow the final semicolon are ignored. +** +** ^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 +** will not detect syntactically incorrect SQL. +** +** ^(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.)^ +** +** The input to [sqlite3_complete()] must be a zero-terminated +** UTF-8 string. +** +** The input to [sqlite3_complete16()] must be a zero-terminated +** UTF-16 string in native byte order. +*/ +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 +** KEYWORDS: {busy-handler callback} {busy handler} +** METHOD: sqlite3 +** +** ^The sqlite3_busy_handler(D,X,P) routine sets a callback function X +** that might be invoked with argument P whenever +** an attempt is made to access a database table associated with +** [database connection] D when another thread +** or process has the table locked. +** The sqlite3_busy_handler() interface is used to implement +** [sqlite3_busy_timeout()] and [PRAGMA busy_timeout]. +** +** ^If the busy callback is NULL, then [SQLITE_BUSY] +** 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 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 previously for the same locking event. ^If the +** busy callback returns 0, then no additional attempts are made to +** access the database and [SQLITE_BUSY] is returned +** to the application. +** ^If the callback returns non-zero, then another attempt +** is made to access the database 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 +** handler could result in a deadlock, it will go ahead and return [SQLITE_BUSY] +** to the application instead of invoking the +** busy handler. +** Consider a scenario where one process is holding a read lock that +** it is trying to promote to a reserved lock and +** a second process is holding a reserved lock that it is trying +** to promote to an exclusive lock. The first process cannot proceed +** because it is blocked by the second and the second process cannot +** proceed because it is blocked by the first. If both processes +** invoke the busy handlers, neither will make any progress. Therefore, +** SQLite returns [SQLITE_BUSY] for the first process, hoping that this +** will induce the first process to release its read lock and allow +** the second process to proceed. +** +** ^The default busy callback is NULL. +** +** ^(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()] +** or evaluating [PRAGMA busy_timeout=N] will change the +** busy handler and thus clear any previously set busy handler. +** +** The busy callback should not take any actions which modify the +** database connection that invoked the busy handler. In other words, +** the busy handler is not reentrant. Any such actions +** result in undefined behavior. +** +** 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 +** METHOD: sqlite3 +** +** ^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. ^After at least "ms" milliseconds of sleeping, +** the handler returns 0 which causes [sqlite3_step()] to return +** [SQLITE_BUSY]. +** +** ^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 +** [database connection] at any given moment. If another busy handler +** was defined (using [sqlite3_busy_handler()]) prior to calling +** this routine, that other busy handler is cleared.)^ +** +** See also: [PRAGMA busy_timeout] +*/ +SQLITE_API int sqlite3_busy_timeout(sqlite3*, int ms); + +/* +** CAPI3REF: Convenience Routines For Running Queries +** METHOD: sqlite3 +** +** This is a legacy interface that is preserved for backwards compatibility. +** Use of this interface is not recommended. +** +** Definition: A result table is memory data structure created by the +** [sqlite3_get_table()] interface. A result table records the +** complete query results from one or more queries. +** +** The table conceptually has a number of rows and columns. But +** these numbers are not part of the result table itself. These +** numbers are obtained separately. Let N be the number of rows +** and M be the number of columns. +** +** A result table is an array of pointers to zero-terminated UTF-8 strings. +** There are (N+1)*M elements in the array. The first M pointers point +** to zero-terminated strings that contain the names of the columns. +** The remaining entries all point to query results. NULL values result +** in NULL pointers. All other values are in their UTF-8 zero-terminated +** string representation as returned by [sqlite3_column_text()]. +** +** A result table might consist of one or more memory allocations. +** It is not safe to pass a result table directly to [sqlite3_free()]. +** A result table should be deallocated using [sqlite3_free_table()]. +** +** ^(As an example of the result table format, suppose a query result +** is as follows: +** +**
      +**        Name        | Age
      +**        -----------------------
      +**        Alice       | 43
      +**        Bob         | 28
      +**        Cindy       | 21
      +** 
      +** +** There are two column (M==2) and three rows (N==3). Thus the +** result table has 8 entries. Suppose the result table is stored +** in an array names azResult. Then azResult holds this content: +** +**
      +**        azResult[0] = "Name";
      +**        azResult[1] = "Age";
      +**        azResult[2] = "Alice";
      +**        azResult[3] = "43";
      +**        azResult[4] = "Bob";
      +**        azResult[5] = "28";
      +**        azResult[6] = "Cindy";
      +**        azResult[7] = "21";
      +** 
      )^ +** +** ^The sqlite3_get_table() function evaluates one or more +** semicolon-separated SQL statements in the zero-terminated UTF-8 +** string of its 2nd parameter and returns a result table to the +** pointer given in its 3rd parameter. +** +** After the application has finished with the result from sqlite3_get_table(), +** it must 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 +** [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()]. +*/ +SQLITE_API int sqlite3_get_table( + sqlite3 *db, /* An open database */ + const char *zSql, /* SQL to be evaluated */ + char ***pazResult, /* Results of the query */ + int *pnRow, /* Number of result rows written here */ + int *pnColumn, /* Number of result columns written here */ + char **pzErrmsg /* Error msg written here */ +); +SQLITE_API void sqlite3_free_table(char **result); + +/* +** CAPI3REF: Formatted String Printing Functions +** +** These routines are work-alikes of the "printf()" family of functions +** from the standard C library. +** These routines understand most of the common K&R formatting options, +** plus some additional non-standard formats, detailed below. +** Note that some of the more obscure formatting options from recent +** C-library standards are omitted from this implementation. +** +** ^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 +** NULL pointer if [sqlite3_malloc()] is unable to allocate enough +** memory to hold the resulting string. +** +** ^(The 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 +** historical accident that cannot be fixed without breaking +** 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 +** 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 +** 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. +** +** ^The sqlite3_vsnprintf() routine is a varargs version of sqlite3_snprintf(). +** +** These routines all implement some additional formatting +** options that are useful for constructing SQL statements. +** All of the usual printf() formatting options apply. In addition, there +** is are "%q", "%Q", "%w" and "%z" options. +** +** ^(The %q option works like %s in that it substitutes a nul-terminated +** string from the argument list. But %q also doubles every '\'' character. +** %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. +** +** For example, assume the string variable zText contains text as follows: +** +**
      +**  char *zText = "It's a happy day!";
      +** 
      +** +** One can use this text in an SQL statement as follows: +** +**
      +**  char *zSQL = sqlite3_mprintf("INSERT INTO table VALUES('%q')", zText);
      +**  sqlite3_exec(db, zSQL, 0, 0, 0);
      +**  sqlite3_free(zSQL);
      +** 
      +** +** Because the %q format string is used, the '\'' character in zText +** is escaped and the SQL generated is as follows: +** +**
      +**  INSERT INTO table1 VALUES('It''s a happy day!')
      +** 
      +** +** This is correct. Had we used %s instead of %q, the generated SQL +** would have looked like this: +** +**
      +**  INSERT INTO table1 VALUES('It's a happy day!');
      +** 
      +** +** 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 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).)^ So, for example, one could say: +** +**
      +**  char *zSQL = sqlite3_mprintf("INSERT INTO table VALUES(%Q)", zText);
      +**  sqlite3_exec(db, zSQL, 0, 0, 0);
      +**  sqlite3_free(zSQL);
      +** 
      +** +** The code above will render a correct SQL statement in the zSQL +** variable even if the zText variable is a NULL pointer. +** +** ^(The "%w" formatting option is like "%q" except that it expects to +** be contained within double-quotes instead of single quotes, and it +** escapes the double-quote character instead of the single-quote +** character.)^ The "%w" formatting option is intended for safely inserting +** table and column names into a constructed SQL statement. +** +** ^(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.)^ +*/ +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*, ...); +SQLITE_API char *sqlite3_vsnprintf(int,char*,const char*, va_list); + +/* +** CAPI3REF: Memory Allocation Subsystem +** +** 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 +** 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 +** sqlite3_malloc() is zero or negative then sqlite3_malloc() returns +** a NULL pointer. +** +** ^The sqlite3_malloc64(N) routine works just like +** sqlite3_malloc(N) except that N is an unsigned 64-bit integer instead +** of a signed 32-bit integer. +** +** ^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 +** 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 +** memory might result in a segmentation fault or other severe error. +** Memory corruption, a segmentation fault, or other severe error +** 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(X,N) interface attempts to resize a +** prior memory allocation X to be at least N bytes. +** ^If the X parameter to sqlite3_realloc(X,N) +** is a NULL pointer then its behavior is identical to calling +** sqlite3_malloc(N). +** ^If the N parameter to sqlite3_realloc(X,N) is zero or +** negative then the behavior is exactly the same as calling +** sqlite3_free(X). +** ^sqlite3_realloc(X,N) returns a pointer to a memory allocation +** of at least N bytes in size or NULL if insufficient memory is available. +** ^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(X,N) and the prior allocation is freed. +** ^If sqlite3_realloc(X,N) returns NULL and N is positive, then the +** prior allocation is not freed. +** +** ^The sqlite3_realloc64(X,N) interfaces works the same as +** sqlite3_realloc(X,N) except that N is a 64-bit unsigned integer instead +** of a 32-bit signed integer. +** +** ^If X is a memory allocation previously obtained from sqlite3_malloc(), +** sqlite3_malloc64(), sqlite3_realloc(), or sqlite3_realloc64(), then +** sqlite3_msize(X) returns the size of that memory allocation in bytes. +** ^The value returned by sqlite3_msize(X) might be larger than the number +** of bytes requested when X was allocated. ^If X is a NULL pointer then +** sqlite3_msize(X) returns zero. If X points to something that is not +** the beginning of memory allocation, or if it points to a formerly +** valid memory allocation that has now been freed, then the behavior +** of sqlite3_msize(X) is undefined and possibly harmful. +** +** ^The memory returned by sqlite3_malloc(), sqlite3_realloc(), +** sqlite3_malloc64(), and sqlite3_realloc64() +** is always aligned to at least an 8 byte boundary, or to a +** 4 byte boundary if the [SQLITE_4_BYTE_ALIGNED_MALLOC] compile-time +** option is used. +** +** 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 +** implementation of these routines to be omitted. That capability +** is no longer provided. Only built-in memory allocators can be used. +** +** Prior to SQLite version 3.7.10, the Windows OS interface layer called +** the system malloc() and free() directly when converting +** filenames between the UTF-8 encoding used by SQLite +** and whatever filename encoding is used by the particular Windows +** installation. Memory allocation errors were detected, but +** they were reported back as [SQLITE_CANTOPEN] or +** [SQLITE_IOERR] rather than [SQLITE_NOMEM]. +** +** 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 +** not yet been released. +** +** The application must not read or write any part of +** a block of memory after it has been released using +** [sqlite3_free()] or [sqlite3_realloc()]. +*/ +SQLITE_API void *sqlite3_malloc(int); +SQLITE_API void *sqlite3_malloc64(sqlite3_uint64); +SQLITE_API void *sqlite3_realloc(void*, int); +SQLITE_API void *sqlite3_realloc64(void*, sqlite3_uint64); +SQLITE_API void sqlite3_free(void*); +SQLITE_API sqlite3_uint64 sqlite3_msize(void*); + +/* +** 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. +** +** ^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 +** +** SQLite contains a high-quality pseudo-random number generator (PRNG) used to +** select random [ROWID | ROWIDs] when inserting new records into a table that +** already uses the largest possible [ROWID]. The PRNG is also used for +** 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. +** ^The P parameter can be a NULL pointer. +** +** ^If this routine has not been previously called or if the previous +** call had N less than one or a NULL pointer for P, then the PRNG is +** seeded using randomness obtained from the xRandomness method of +** the default [sqlite3_vfs] object. +** ^If the previous call to this routine had an N of 1 or more and a +** non-NULL P then the pseudo-randomness is generated +** internally and without recourse to the [sqlite3_vfs] xRandomness +** method. +*/ +SQLITE_API void sqlite3_randomness(int N, void *P); + +/* +** CAPI3REF: Compile-Time Authorization Callbacks +** METHOD: sqlite3 +** KEYWORDS: {authorizer callback} +** +** ^This routine registers an authorizer callback with a particular +** [database connection], supplied in the first argument. +** ^The authorizer callback is invoked as SQL statements are being compiled +** by [sqlite3_prepare()] or its variants [sqlite3_prepare_v2()], +** [sqlite3_prepare_v3()], [sqlite3_prepare16()], [sqlite3_prepare16_v2()], +** and [sqlite3_prepare16_v3()]. ^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 +** 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 +** 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 +** [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 +** to the callback is an integer [SQLITE_COPY | action code] that specifies +** the particular action to be authorized. ^The third through sixth parameters +** to the callback are either NULL pointers or zero-terminated strings +** that contain additional details about the action to be authorized. +** Applications must always be prepared to encounter a NULL pointer in any +** of the third through the sixth parameters of the authorization callback. +** +** ^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. +** ^When a table is referenced by a [SELECT] but no column values are +** extracted from that table (for example in a query like +** "SELECT count(*) FROM tab") then the [SQLITE_READ] authorizer callback +** is invoked once for that table with a column name that is an empty string. +** ^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. +** +** An authorizer is used when [sqlite3_prepare | preparing] +** SQL statements from an untrusted source, to ensure that the SQL statements +** do not try to access data they are not allowed to see, or that they do not +** try to execute malicious statements that damage the database. For +** example, an application may allow a user to enter arbitrary +** SQL queries for evaluation by a database. But the application does +** not want the user to be able to make arbitrary changes to the +** database. An authorizer could then be put in place while the +** user-entered SQL is being [sqlite3_prepare | prepared] that +** disallows everything except [SELECT] statements. +** +** Applications that need to process SQL from untrusted sources +** might also consider lowering resource limits using [sqlite3_limit()] +** 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 +** at a time. Each call to sqlite3_set_authorizer overrides the +** 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 +** the database connection that invoked the authorizer callback. +** 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 +** 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 +** [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. +*/ +SQLITE_API int sqlite3_set_authorizer( + sqlite3*, + int (*xAuth)(void*,int,const char*,const char*,const char*,const char*), + void *pUserData +); + +/* +** CAPI3REF: Authorizer Return Codes +** +** The [sqlite3_set_authorizer | authorizer callback function] must +** return either [SQLITE_OK] or one of these two constants in order +** to signal SQLite whether or not the action is permitted. See the +** [sqlite3_set_authorizer | authorizer documentation] for additional +** information. +** +** Note that SQLITE_IGNORE is also used as a [conflict resolution mode] +** returned from the [sqlite3_vtab_on_conflict()] interface. +*/ +#define SQLITE_DENY 1 /* Abort the SQL statement with an error */ +#define SQLITE_IGNORE 2 /* Don't allow access, but don't generate an error */ + +/* +** CAPI3REF: Authorizer Action Codes +** +** The [sqlite3_set_authorizer()] interface registers a callback function +** that is invoked to authorize certain SQL statement actions. The +** second parameter to the callback is an integer code that specifies +** what action is being authorized. These are the integer action codes that +** the authorizer callback may be passed. +** +** 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 +** authorizer callback is the name of the database ("main", "temp", +** 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. +*/ +/******************************************* 3rd ************ 4th ***********/ +#define SQLITE_CREATE_INDEX 1 /* Index Name Table Name */ +#define SQLITE_CREATE_TABLE 2 /* Table Name NULL */ +#define SQLITE_CREATE_TEMP_INDEX 3 /* Index Name Table Name */ +#define SQLITE_CREATE_TEMP_TABLE 4 /* Table Name NULL */ +#define SQLITE_CREATE_TEMP_TRIGGER 5 /* Trigger Name Table Name */ +#define SQLITE_CREATE_TEMP_VIEW 6 /* View Name NULL */ +#define SQLITE_CREATE_TRIGGER 7 /* Trigger Name Table Name */ +#define SQLITE_CREATE_VIEW 8 /* View Name NULL */ +#define SQLITE_DELETE 9 /* Table Name NULL */ +#define SQLITE_DROP_INDEX 10 /* Index Name Table Name */ +#define SQLITE_DROP_TABLE 11 /* Table Name NULL */ +#define SQLITE_DROP_TEMP_INDEX 12 /* Index Name Table Name */ +#define SQLITE_DROP_TEMP_TABLE 13 /* Table Name NULL */ +#define SQLITE_DROP_TEMP_TRIGGER 14 /* Trigger Name Table Name */ +#define SQLITE_DROP_TEMP_VIEW 15 /* View Name NULL */ +#define SQLITE_DROP_TRIGGER 16 /* Trigger Name Table Name */ +#define SQLITE_DROP_VIEW 17 /* View Name NULL */ +#define SQLITE_INSERT 18 /* Table Name NULL */ +#define SQLITE_PRAGMA 19 /* Pragma Name 1st arg or NULL */ +#define SQLITE_READ 20 /* Table Name Column Name */ +#define SQLITE_SELECT 21 /* NULL NULL */ +#define SQLITE_TRANSACTION 22 /* Operation NULL */ +#define SQLITE_UPDATE 23 /* Table Name Column Name */ +#define SQLITE_ATTACH 24 /* Filename NULL */ +#define SQLITE_DETACH 25 /* Database Name NULL */ +#define SQLITE_ALTER_TABLE 26 /* Database Name Table Name */ +#define SQLITE_REINDEX 27 /* Index Name NULL */ +#define SQLITE_ANALYZE 28 /* Table Name NULL */ +#define SQLITE_CREATE_VTABLE 29 /* Table Name Module Name */ +#define SQLITE_DROP_VTABLE 30 /* Table Name Module Name */ +#define SQLITE_FUNCTION 31 /* NULL Function Name */ +#define SQLITE_SAVEPOINT 32 /* Operation Savepoint Name */ +#define SQLITE_COPY 0 /* No longer used */ +#define SQLITE_RECURSIVE 33 /* NULL NULL */ + +/* +** CAPI3REF: Tracing And Profiling Functions +** METHOD: sqlite3 +** +** These routines are deprecated. Use the [sqlite3_trace_v2()] interface +** instead of the routines described here. +** +** 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 +** various times when an SQL statement is being run by [sqlite3_step()]. +** ^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.)^ +** +** The [SQLITE_TRACE_SIZE_LIMIT] compile-time option can be used to limit +** the length of [bound parameter] expansion in the output of sqlite3_trace(). +** +** ^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. ^The profile callback +** time is in units of nanoseconds, however the current implementation +** is only capable of millisecond resolution so the six least significant +** digits in the time are meaningless. Future versions of SQLite +** might provide greater resolution on the profiler callback. The +** sqlite3_profile() function is considered experimental and is +** subject to change in future versions of SQLite. +*/ +SQLITE_API SQLITE_DEPRECATED void *sqlite3_trace(sqlite3*, + void(*xTrace)(void*,const char*), void*); +SQLITE_API SQLITE_DEPRECATED void *sqlite3_profile(sqlite3*, + void(*xProfile)(void*,const char*,sqlite3_uint64), void*); + +/* +** CAPI3REF: SQL Trace Event Codes +** KEYWORDS: SQLITE_TRACE +** +** These constants identify classes of events that can be monitored +** using the [sqlite3_trace_v2()] tracing logic. The M argument +** to [sqlite3_trace_v2(D,M,X,P)] is an OR-ed combination of one or more of +** the following constants. ^The first argument to the trace callback +** is one of the following constants. +** +** New tracing constants may be added in future releases. +** +** ^A trace callback has four arguments: xCallback(T,C,P,X). +** ^The T argument is one of the integer type codes above. +** ^The C argument is a copy of the context pointer passed in as the +** fourth argument to [sqlite3_trace_v2()]. +** The P and X arguments are pointers whose meanings depend on T. +** +**
      +** [[SQLITE_TRACE_STMT]]
      SQLITE_TRACE_STMT
      +**
      ^An SQLITE_TRACE_STMT callback is invoked when a prepared statement +** first begins running and possibly at other times during the +** execution of the prepared statement, such as at the start of each +** trigger subprogram. ^The P argument is a pointer to the +** [prepared statement]. ^The X argument is a pointer to a string which +** is the unexpanded SQL text of the prepared statement or an SQL comment +** that indicates the invocation of a trigger. ^The callback can compute +** the same text that would have been returned by the legacy [sqlite3_trace()] +** interface by using the X argument when X begins with "--" and invoking +** [sqlite3_expanded_sql(P)] otherwise. +** +** [[SQLITE_TRACE_PROFILE]]
      SQLITE_TRACE_PROFILE
      +**
      ^An SQLITE_TRACE_PROFILE callback provides approximately the same +** information as is provided by the [sqlite3_profile()] callback. +** ^The P argument is a pointer to the [prepared statement] and the +** X argument points to a 64-bit integer which is the estimated of +** the number of nanosecond that the prepared statement took to run. +** ^The SQLITE_TRACE_PROFILE callback is invoked when the statement finishes. +** +** [[SQLITE_TRACE_ROW]]
      SQLITE_TRACE_ROW
      +**
      ^An SQLITE_TRACE_ROW callback is invoked whenever a prepared +** statement generates a single row of result. +** ^The P argument is a pointer to the [prepared statement] and the +** X argument is unused. +** +** [[SQLITE_TRACE_CLOSE]]
      SQLITE_TRACE_CLOSE
      +**
      ^An SQLITE_TRACE_CLOSE callback is invoked when a database +** connection closes. +** ^The P argument is a pointer to the [database connection] object +** and the X argument is unused. +**
      +*/ +#define SQLITE_TRACE_STMT 0x01 +#define SQLITE_TRACE_PROFILE 0x02 +#define SQLITE_TRACE_ROW 0x04 +#define SQLITE_TRACE_CLOSE 0x08 + +/* +** CAPI3REF: SQL Trace Hook +** METHOD: sqlite3 +** +** ^The sqlite3_trace_v2(D,M,X,P) interface registers a trace callback +** function X against [database connection] D, using property mask M +** and context pointer P. ^If the X callback is +** NULL or if the M mask is zero, then tracing is disabled. The +** M argument should be the bitwise OR-ed combination of +** zero or more [SQLITE_TRACE] constants. +** +** ^Each call to either sqlite3_trace() or sqlite3_trace_v2() overrides +** (cancels) any prior calls to sqlite3_trace() or sqlite3_trace_v2(). +** +** ^The X callback is invoked whenever any of the events identified by +** mask M occur. ^The integer return value from the callback is currently +** ignored, though this may change in future releases. Callback +** implementations should return zero to ensure future compatibility. +** +** ^A trace callback is invoked with four arguments: callback(T,C,P,X). +** ^The T argument is one of the [SQLITE_TRACE] +** constants to indicate why the callback was invoked. +** ^The C argument is a copy of the context pointer. +** The P and X arguments are pointers whose meanings depend on T. +** +** The sqlite3_trace_v2() interface is intended to replace the legacy +** interfaces [sqlite3_trace()] and [sqlite3_profile()], both of which +** are deprecated. +*/ +SQLITE_API int sqlite3_trace_v2( + sqlite3*, + unsigned uMask, + int(*xCallback)(unsigned,void*,void*,void*), + void *pCtx +); + +/* +** CAPI3REF: Query Progress Callbacks +** METHOD: sqlite3 +** +** ^The sqlite3_progress_handler(D,N,X,P) interface causes the callback +** function X to be invoked periodically during long running calls to +** [sqlite3_exec()], [sqlite3_step()] and [sqlite3_get_table()] for +** database connection D. An example use for this +** interface is to keep a GUI updated during a large query. +** +** ^The parameter P is passed through as the only parameter to the +** callback function X. ^The parameter N is the approximate number of +** [virtual machine instructions] that are evaluated between successive +** invocations of the callback X. ^If N is less than one then the progress +** handler is disabled. +** +** ^Only a single progress handler may be defined at one time per +** [database connection]; setting a new progress handler cancels the +** old one. ^Setting parameter X to NULL disables the progress handler. +** ^The progress handler is also disabled by setting N to a value less +** than 1. +** +** ^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. +** +** The progress handler callback must not do anything that will modify +** the database connection that invoked the progress handler. +** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their +** database connections for the meaning of "modify" in this paragraph. +** +*/ +SQLITE_API void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); + +/* +** CAPI3REF: Opening A New Database Connection +** CONSTRUCTOR: sqlite3 +** +** ^These routines open an SQLite database file as specified 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 +** 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 +** [sqlite3_errmsg()] or [sqlite3_errmsg16()] routines can be used to obtain +** an English language description of the error following a failure of any +** of the sqlite3_open() routines. +** +** ^The default encoding will be UTF-8 for databases created using +** sqlite3_open() or sqlite3_open_v2(). ^The default encoding for databases +** created using sqlite3_open16() will be UTF-16 in the native byte order. +** +** Whether or not an error occurs when it is opened, resources +** associated with the [database connection] handle should be released by +** passing it to [sqlite3_close()] when it is no longer required. +** +** 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 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], +** [SQLITE_OPEN_PRIVATECACHE], and/or [SQLITE_OPEN_URI] flags:)^ +** +**
      +** ^(
      [SQLITE_OPEN_READONLY]
      +**
      The database is opened in read-only mode. If the database does not +** already exist, an error is returned.
      )^ +** +** ^(
      [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.
      )^ +** +** ^(
      [SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE]
      +**
      The database is opened for reading and writing, and is created if +** it does not already exist. This is the behavior that is always used for +** sqlite3_open() and sqlite3_open16().
      )^ +**
      +** +** If the 3rd parameter to sqlite3_open_v2() is not one of the +** combinations shown above optionally combined with other +** [SQLITE_OPEN_READONLY | SQLITE_OPEN_* bits] +** then the behavior is undefined. +** +** ^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 +** [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 +** eligible to use [shared cache mode], regardless of whether or not shared +** 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. +** +** ^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 +** a NULL pointer then the default [sqlite3_vfs] object is used. +** +** ^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 +** automatically deleted as soon as the database connection is closed. +** +** [[URI filenames in sqlite3_open()]]

      URI Filenames

      +** +** ^If [URI filename] interpretation is enabled, and the filename argument +** begins with "file:", then the filename is interpreted as a URI. ^URI +** filename interpretation is enabled if the [SQLITE_OPEN_URI] flag is +** set in the third argument to sqlite3_open_v2(), or if it has +** been enabled globally using the [SQLITE_CONFIG_URI] option with the +** [sqlite3_config()] method or by the [SQLITE_USE_URI] compile-time option. +** URI filename interpretation is turned off +** by default, but future releases of SQLite might enable URI filename +** interpretation by default. See "[URI filenames]" for additional +** information. +** +** URI filenames are parsed according to RFC 3986. ^If the URI contains an +** authority, then it must be either an empty string or the string +** "localhost". ^If the authority is not an empty string or "localhost", an +** error is returned to the caller. ^The fragment component of a URI, if +** present, is ignored. +** +** ^SQLite uses the path component of the URI as the name of the disk file +** which contains the database. ^If the path begins with a '/' character, +** then it is interpreted as an absolute path. ^If the path does not begin +** with a '/' (meaning that the authority section is omitted from the URI) +** then the path is interpreted as a relative path. +** ^(On windows, the first component of an absolute path +** is a drive specification (e.g. "C:").)^ +** +** [[core URI query parameters]] +** The query component of a URI may contain parameters that are interpreted +** either by SQLite itself, or by a [VFS | custom VFS implementation]. +** SQLite and its built-in [VFSes] interpret the +** following query parameters: +** +**
        +**
      • vfs: ^The "vfs" parameter may be used to specify the name of +** a VFS object that provides the operating system interface that should +** be used to access the database file on disk. ^If this option is set to +** an empty string the default VFS object is used. ^Specifying an unknown +** VFS is an error. ^If sqlite3_open_v2() is used and the vfs option is +** present, then the VFS specified by the option takes precedence over +** the value passed as the fourth parameter to sqlite3_open_v2(). +** +**
      • mode: ^(The mode parameter may be set to either "ro", "rw", +** "rwc", or "memory". Attempting to set it to any other value is +** an error)^. +** ^If "ro" is specified, then the database is opened for read-only +** access, just as if the [SQLITE_OPEN_READONLY] flag had been set in the +** third argument to sqlite3_open_v2(). ^If the mode option is set to +** "rw", then the database is opened for read-write (but not create) +** access, as if SQLITE_OPEN_READWRITE (but not SQLITE_OPEN_CREATE) had +** been set. ^Value "rwc" is equivalent to setting both +** SQLITE_OPEN_READWRITE and SQLITE_OPEN_CREATE. ^If the mode option is +** set to "memory" then a pure [in-memory database] that never reads +** or writes from disk is used. ^It is an error to specify a value for +** the mode parameter that is less restrictive than that specified by +** the flags passed in the third parameter to sqlite3_open_v2(). +** +**
      • cache: ^The cache parameter may be set to either "shared" or +** "private". ^Setting it to "shared" is equivalent to setting the +** SQLITE_OPEN_SHAREDCACHE bit in the flags argument passed to +** sqlite3_open_v2(). ^Setting the cache parameter to "private" is +** equivalent to setting the SQLITE_OPEN_PRIVATECACHE bit. +** ^If sqlite3_open_v2() is used and the "cache" parameter is present in +** a URI filename, its value overrides any behavior requested by setting +** SQLITE_OPEN_PRIVATECACHE or SQLITE_OPEN_SHAREDCACHE flag. +** +**
      • psow: ^The psow parameter indicates whether or not the +** [powersafe overwrite] property does or does not apply to the +** storage media on which the database file resides. +** +**
      • nolock: ^The nolock parameter is a boolean query parameter +** which if set disables file locking in rollback journal modes. This +** is useful for accessing a database on a filesystem that does not +** support locking. Caution: Database corruption might result if two +** or more processes write to the same database and any one of those +** processes uses nolock=1. +** +**
      • immutable: ^The immutable parameter is a boolean query +** parameter that indicates that the database file is stored on +** read-only media. ^When immutable is set, SQLite assumes that the +** database file cannot be changed, even by a process with higher +** privilege, and so the database is opened read-only and all locking +** and change detection is disabled. Caution: Setting the immutable +** property on a database file that does in fact change can result +** in incorrect query results and/or [SQLITE_CORRUPT] errors. +** See also: [SQLITE_IOCAP_IMMUTABLE]. +** +**
      +** +** ^Specifying an unknown parameter in the query component of a URI is not an +** error. Future versions of SQLite might understand additional query +** parameters. See "[query parameters with special meaning to SQLite]" for +** additional information. +** +** [[URI filename examples]]

      URI filename examples

      +** +** +**
      URI filenames Results +**
      file:data.db +** Open the file "data.db" in the current directory. +**
      file:/home/fred/data.db
      +** file:///home/fred/data.db
      +** file://localhost/home/fred/data.db
      +** Open the database file "/home/fred/data.db". +**
      file://darkstar/home/fred/data.db +** An error. "darkstar" is not a recognized authority. +**
      +** file:///C:/Documents%20and%20Settings/fred/Desktop/data.db +** Windows only: Open the file "data.db" on fred's desktop on drive +** C:. Note that the %20 escaping in this example is not strictly +** necessary - space characters can be used literally +** in URI filenames. +**
      file:data.db?mode=ro&cache=private +** Open file "data.db" in the current directory for read-only access. +** Regardless of whether or not shared-cache mode is enabled by +** default, use a private cache. +**
      file:/home/fred/data.db?vfs=unix-dotfile +** Open file "/home/fred/data.db". Use the special VFS "unix-dotfile" +** that uses dot-files in place of posix advisory locking. +**
      file:data.db?mode=readonly +** An error. "readonly" is not a valid option for the "mode" parameter. +**
      +** +** ^URI hexadecimal escape sequences (%HH) are supported within the path and +** query components of a URI. A hexadecimal escape sequence consists of a +** percent sign - "%" - followed by exactly two hexadecimal digits +** specifying an octet value. ^Before the path or query components of a +** URI filename are interpreted, they are encoded using UTF-8 and all +** hexadecimal escape sequences replaced by a single byte containing the +** corresponding octet. If this process generates an invalid UTF-8 encoding, +** the results are undefined. +** +** Note to Windows users: The encoding used for the filename argument +** of sqlite3_open() and sqlite3_open_v2() must be UTF-8, not whatever +** 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(). +** +** Note to Windows Runtime users: The temporary directory must be set +** prior to calling sqlite3_open() or sqlite3_open_v2(). Otherwise, various +** features that require the use of temporary files may fail. +** +** See also: [sqlite3_temp_directory] +*/ +SQLITE_API int sqlite3_open( + const char *filename, /* Database filename (UTF-8) */ + sqlite3 **ppDb /* OUT: SQLite db handle */ +); +SQLITE_API int sqlite3_open16( + const void *filename, /* Database filename (UTF-16) */ + sqlite3 **ppDb /* OUT: SQLite db handle */ +); +SQLITE_API int sqlite3_open_v2( + const char *filename, /* Database filename (UTF-8) */ + sqlite3 **ppDb, /* OUT: SQLite db handle */ + int flags, /* Flags */ + const char *zVfs /* Name of VFS module to use */ +); + +/* +** CAPI3REF: Obtain Values For URI Parameters +** +** These are utility routines, useful to VFS implementations, that check +** to see if a database file was a URI that contained a specific query +** parameter, and if so obtains the value of that query parameter. +** +** If F is the database filename pointer passed into the xOpen() method of +** a VFS implementation when the flags parameter to xOpen() has one or +** more of the [SQLITE_OPEN_URI] or [SQLITE_OPEN_MAIN_DB] bits set and +** P is the name of the query parameter, then +** sqlite3_uri_parameter(F,P) returns the value of the P +** parameter if it exists or a NULL pointer if P does not appear as a +** query parameter on F. If P is a query parameter of F +** has no explicit value, then sqlite3_uri_parameter(F,P) returns +** a pointer to an empty string. +** +** The sqlite3_uri_boolean(F,P,B) routine assumes that P is a boolean +** parameter and returns true (1) or false (0) according to the value +** of P. The sqlite3_uri_boolean(F,P,B) routine returns true (1) if the +** value of query parameter P is one of "yes", "true", or "on" in any +** case or if the value begins with a non-zero number. The +** sqlite3_uri_boolean(F,P,B) routines returns false (0) if the value of +** query parameter P is one of "no", "false", or "off" in any case or +** if the value begins with a numeric zero. If P is not a query +** parameter on F or if the value of P is does not match any of the +** above, then sqlite3_uri_boolean(F,P,B) returns (B!=0). +** +** The sqlite3_uri_int64(F,P,D) routine converts the value of P into a +** 64-bit signed integer and returns that integer, or D if P does not +** exist. If the value of P is something other than an integer, then +** zero is returned. +** +** If F is a NULL pointer, then sqlite3_uri_parameter(F,P) returns NULL and +** sqlite3_uri_boolean(F,P,B) returns B. If F is not a NULL pointer and +** is not a database file pathname pointer that SQLite passed into the xOpen +** VFS method, then the behavior of this routine is undefined and probably +** undesirable. +*/ +SQLITE_API const char *sqlite3_uri_parameter(const char *zFilename, const char *zParam); +SQLITE_API int sqlite3_uri_boolean(const char *zFile, const char *zParam, int bDefault); +SQLITE_API sqlite3_int64 sqlite3_uri_int64(const char*, const char*, sqlite3_int64); + + +/* +** CAPI3REF: Error Codes And Messages +** METHOD: sqlite3 +** +** ^If the most recent sqlite3_* API call associated with +** [database connection] D failed, then the sqlite3_errcode(D) interface +** returns the numeric [result code] or [extended result code] for that +** API call. +** If the most recent API call was successful, +** then the return value from 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 +** text that describes the error, as either UTF-8 or UTF-16 respectively. +** ^(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.)^ +** +** ^The sqlite3_errstr() interface returns the English-language text +** that describes the [result code], as UTF-8. +** ^(Memory to hold the error message string is managed internally +** and must not be freed by the application)^. +** +** When the serialized [threading mode] is in use, it might be the +** case that a second error occurs on a separate thread in between +** the time of the first error and the call to these interfaces. +** When that happens, the second error will be reported since these +** interfaces always report the most recent result. To avoid +** this, each thread can obtain exclusive use of the [database connection] D +** by invoking [sqlite3_mutex_enter]([sqlite3_db_mutex](D)) before beginning +** to use D and invoking [sqlite3_mutex_leave]([sqlite3_db_mutex](D)) after +** all calls to the interfaces listed here are completed. +** +** 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. +*/ +SQLITE_API int sqlite3_errcode(sqlite3 *db); +SQLITE_API int sqlite3_extended_errcode(sqlite3 *db); +SQLITE_API const char *sqlite3_errmsg(sqlite3*); +SQLITE_API const void *sqlite3_errmsg16(sqlite3*); +SQLITE_API const char *sqlite3_errstr(int); + +/* +** CAPI3REF: Prepared Statement Object +** KEYWORDS: {prepared statement} {prepared statements} +** +** An instance of this object represents a single SQL statement that +** has been compiled into binary form and is ready to be evaluated. +** +** Think of each SQL statement as a separate computer program. The +** original SQL text is source code. A prepared statement object +** is the compiled object code. All SQL must be converted into a +** prepared statement before it can be run. +** +** The life-cycle of a prepared statement object usually goes like this: +** +**
        +**
      1. Create the prepared statement object using [sqlite3_prepare_v2()]. +**
      2. Bind values to [parameters] using the sqlite3_bind_*() +** interfaces. +**
      3. Run the SQL by calling [sqlite3_step()] one or more times. +**
      4. Reset the prepared statement using [sqlite3_reset()] then go back +** to step 2. Do this zero or more times. +**
      5. Destroy the object using [sqlite3_finalize()]. +**
      +*/ +typedef struct sqlite3_stmt sqlite3_stmt; + +/* +** CAPI3REF: Run-time Limits +** METHOD: sqlite3 +** +** ^(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.)^ +** +** ^If the new limit is a negative number, the limit is unchanged. +** ^(For each limit category SQLITE_LIMIT_NAME there is a +** [limits | hard upper bound] +** set at compile-time by a C preprocessor macro called +** [limits | SQLITE_MAX_NAME]. +** (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. +** +** ^Regardless of whether or not the limit was changed, the +** [sqlite3_limit()] interface returns the prior value of the limit. +** ^Hence, to find the current value of a limit without changing it, +** simply invoke this interface with the third parameter set to -1. +** +** 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 +** separate databases controlled by JavaScript applications downloaded +** off the Internet. The internal databases can be given the +** large, default limits. Databases managed by external sources can +** be given much smaller limits designed to prevent a denial of service +** attack. Developers might also want to use the [sqlite3_set_authorizer()] +** interface to further control untrusted SQL. The size of the database +** created by an untrusted script can be contained using the +** [max_page_count] [PRAGMA]. +** +** New run-time limit categories may be added in future releases. +*/ +SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal); + +/* +** 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()]. +** The synopsis of the meanings of the various limits is shown below. +** Additional information is available at [limits | Limits in SQLite]. +** +**
      +** [[SQLITE_LIMIT_LENGTH]] ^(
      SQLITE_LIMIT_LENGTH
      +**
      The maximum size of any string or BLOB or table row, in bytes.
      )^ +** +** [[SQLITE_LIMIT_SQL_LENGTH]] ^(
      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.
      )^ +** +** [[SQLITE_LIMIT_EXPR_DEPTH]] ^(
      SQLITE_LIMIT_EXPR_DEPTH
      +**
      The maximum depth of the parse tree on any expression.
      )^ +** +** [[SQLITE_LIMIT_COMPOUND_SELECT]] ^(
      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. If [sqlite3_prepare_v2()] or +** the equivalent tries to allocate space for more than this many opcodes +** in a single prepared statement, an SQLITE_NOMEM error is returned.
      )^ +** +** [[SQLITE_LIMIT_FUNCTION_ARG]] ^(
      SQLITE_LIMIT_FUNCTION_ARG
      +**
      The maximum number of arguments on a function.
      )^ +** +** [[SQLITE_LIMIT_ATTACHED]] ^(
      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.
      )^ +** +** [[SQLITE_LIMIT_VARIABLE_NUMBER]] +** ^(
      SQLITE_LIMIT_VARIABLE_NUMBER
      +**
      The maximum index number of any [parameter] in an SQL statement.)^ +** +** [[SQLITE_LIMIT_TRIGGER_DEPTH]] ^(
      SQLITE_LIMIT_TRIGGER_DEPTH
      +**
      The maximum depth of recursion for triggers.
      )^ +** +** [[SQLITE_LIMIT_WORKER_THREADS]] ^(
      SQLITE_LIMIT_WORKER_THREADS
      +**
      The maximum number of auxiliary worker threads that a single +** [prepared statement] may start.
      )^ +**
      +*/ +#define SQLITE_LIMIT_LENGTH 0 +#define SQLITE_LIMIT_SQL_LENGTH 1 +#define SQLITE_LIMIT_COLUMN 2 +#define SQLITE_LIMIT_EXPR_DEPTH 3 +#define SQLITE_LIMIT_COMPOUND_SELECT 4 +#define SQLITE_LIMIT_VDBE_OP 5 +#define SQLITE_LIMIT_FUNCTION_ARG 6 +#define SQLITE_LIMIT_ATTACHED 7 +#define SQLITE_LIMIT_LIKE_PATTERN_LENGTH 8 +#define SQLITE_LIMIT_VARIABLE_NUMBER 9 +#define SQLITE_LIMIT_TRIGGER_DEPTH 10 +#define SQLITE_LIMIT_WORKER_THREADS 11 + +/* +** CAPI3REF: Prepare Flags +** +** These constants define various flags that can be passed into +** "prepFlags" parameter of the [sqlite3_prepare_v3()] and +** [sqlite3_prepare16_v3()] interfaces. +** +** New flags may be added in future releases of SQLite. +** +**
      +** [[SQLITE_PREPARE_PERSISTENT]] ^(
      SQLITE_PREPARE_PERSISTENT
      +**
      The SQLITE_PREPARE_PERSISTENT flag is a hint to the query planner +** that the prepared statement will be retained for a long time and +** probably reused many times.)^ ^Without this flag, [sqlite3_prepare_v3()] +** and [sqlite3_prepare16_v3()] assume that the prepared statement will +** be used just once or at most a few times and then destroyed using +** [sqlite3_finalize()] relatively soon. The current implementation acts +** on this hint by avoiding the use of [lookaside memory] so as not to +** deplete the limited store of lookaside memory. Future versions of +** SQLite may act on this hint differently. +**
      +*/ +#define SQLITE_PREPARE_PERSISTENT 0x01 + +/* +** CAPI3REF: Compiling An SQL Statement +** KEYWORDS: {SQL statement compiler} +** METHOD: sqlite3 +** CONSTRUCTOR: sqlite3_stmt +** +** To execute an SQL statement, it must first be compiled into a byte-code +** program using one of these routines. Or, in other words, these routines +** are constructors for the [prepared statement] object. +** +** The preferred routine to use is [sqlite3_prepare_v2()]. The +** [sqlite3_prepare()] interface is legacy and should be avoided. +** [sqlite3_prepare_v3()] has an extra "prepFlags" option that is used +** for special purposes. +** +** The use of the UTF-8 interfaces is preferred, as SQLite currently +** does all parsing using UTF-8. The UTF-16 interfaces are provided +** as a convenience. The UTF-16 interfaces work by converting the +** input text into UTF-8, then invoking the corresponding UTF-8 interface. +** +** The first argument, "db", is a [database connection] obtained from a +** prior successful call to [sqlite3_open()], [sqlite3_open_v2()] or +** [sqlite3_open16()]. The database connection must not have been closed. +** +** The second argument, "zSql", is the statement to be compiled, encoded +** as either UTF-8 or UTF-16. The sqlite3_prepare(), sqlite3_prepare_v2(), +** and sqlite3_prepare_v3() +** interfaces use UTF-8, and sqlite3_prepare16(), sqlite3_prepare16_v2(), +** and sqlite3_prepare16_v3() use UTF-16. +** +** ^If the nByte argument is negative, then zSql is read up to the +** first zero terminator. ^If nByte is positive, then it is the +** number of bytes read from zSql. ^If nByte is zero, then no prepared +** statement is generated. +** If the caller knows that the supplied string is nul-terminated, then +** there is a small performance advantage to passing an nByte parameter that +** is the number of bytes in the input string including +** the nul-terminator. +** +** ^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 +** 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, the sqlite3_prepare() family of routines return [SQLITE_OK]; +** otherwise an [error code] is returned. +** +** The sqlite3_prepare_v2(), sqlite3_prepare_v3(), sqlite3_prepare16_v2(), +** and sqlite3_prepare16_v3() interfaces are recommended for all new programs. +** The older interfaces (sqlite3_prepare() and sqlite3_prepare16()) +** are retained for backwards compatibility, but their use is discouraged. +** ^In the "vX" 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 differently in three ways: +** +**
        +**
      1. +** ^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. As many as [SQLITE_MAX_SCHEMA_RETRY] +** retries will occur before sqlite3_step() gives up and returns an error. +**
      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 +** [sqlite3_step()] would only return a generic [SQLITE_ERROR] result code +** 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. +** +**
      5. +** ^If the specific value bound to [parameter | host parameter] in the +** WHERE clause might influence the choice of query plan for a statement, +** then the statement will 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 that [parameter]. +** ^The specific value of WHERE-clause [parameter] might influence the +** choice of query plan if the parameter is the left-hand side of a [LIKE] +** or [GLOB] operator or if the parameter is compared to an indexed column +** and the [SQLITE_ENABLE_STAT3] compile-time option is enabled. +**
      6. +** +**

        ^sqlite3_prepare_v3() differs from sqlite3_prepare_v2() only in having +** the extra prepFlags parameter, which is a bit array consisting of zero or +** more of the [SQLITE_PREPARE_PERSISTENT|SQLITE_PREPARE_*] flags. ^The +** sqlite3_prepare_v2() interface works exactly the same as +** sqlite3_prepare_v3() with a zero prepFlags parameter. +**

      +*/ +SQLITE_API int sqlite3_prepare( + sqlite3 *db, /* Database handle */ + const char *zSql, /* SQL statement, UTF-8 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const char **pzTail /* OUT: Pointer to unused portion of zSql */ +); +SQLITE_API int sqlite3_prepare_v2( + sqlite3 *db, /* Database handle */ + const char *zSql, /* SQL statement, UTF-8 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const char **pzTail /* OUT: Pointer to unused portion of zSql */ +); +SQLITE_API int sqlite3_prepare_v3( + sqlite3 *db, /* Database handle */ + const char *zSql, /* SQL statement, UTF-8 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + unsigned int prepFlags, /* Zero or more SQLITE_PREPARE_ flags */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const char **pzTail /* OUT: Pointer to unused portion of zSql */ +); +SQLITE_API int sqlite3_prepare16( + sqlite3 *db, /* Database handle */ + const void *zSql, /* SQL statement, UTF-16 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const void **pzTail /* OUT: Pointer to unused portion of zSql */ +); +SQLITE_API int sqlite3_prepare16_v2( + sqlite3 *db, /* Database handle */ + const void *zSql, /* SQL statement, UTF-16 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const void **pzTail /* OUT: Pointer to unused portion of zSql */ +); +SQLITE_API int sqlite3_prepare16_v3( + sqlite3 *db, /* Database handle */ + const void *zSql, /* SQL statement, UTF-16 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + unsigned int prepFlags, /* Zero or more SQLITE_PREPARE_ flags */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const void **pzTail /* OUT: Pointer to unused portion of zSql */ +); + +/* +** CAPI3REF: Retrieving Statement SQL +** METHOD: sqlite3_stmt +** +** ^The sqlite3_sql(P) interface returns a pointer to a copy of the UTF-8 +** SQL text used to create [prepared statement] P if P was +** created by [sqlite3_prepare_v2()], [sqlite3_prepare_v3()], +** [sqlite3_prepare16_v2()], or [sqlite3_prepare16_v3()]. +** ^The sqlite3_expanded_sql(P) interface returns a pointer to a UTF-8 +** string containing the SQL text of prepared statement P with +** [bound parameters] expanded. +** +** ^(For example, if a prepared statement is created using the SQL +** text "SELECT $abc,:xyz" and if parameter $abc is bound to integer 2345 +** and parameter :xyz is unbound, then sqlite3_sql() will return +** the original string, "SELECT $abc,:xyz" but sqlite3_expanded_sql() +** will return "SELECT 2345,NULL".)^ +** +** ^The sqlite3_expanded_sql() interface returns NULL if insufficient memory +** is available to hold the result, or if the result would exceed the +** the maximum string length determined by the [SQLITE_LIMIT_LENGTH]. +** +** ^The [SQLITE_TRACE_SIZE_LIMIT] compile-time option limits the size of +** bound parameter expansions. ^The [SQLITE_OMIT_TRACE] compile-time +** option causes sqlite3_expanded_sql() to always return NULL. +** +** ^The string returned by sqlite3_sql(P) is managed by SQLite and is +** automatically freed when the prepared statement is finalized. +** ^The string returned by sqlite3_expanded_sql(P), on the other hand, +** is obtained from [sqlite3_malloc()] and must be free by the application +** by passing it to [sqlite3_free()]. +*/ +SQLITE_API const char *sqlite3_sql(sqlite3_stmt *pStmt); +SQLITE_API char *sqlite3_expanded_sql(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Determine If An SQL Statement Writes The Database +** METHOD: sqlite3_stmt +** +** ^The sqlite3_stmt_readonly(X) interface returns true (non-zero) if +** and only if the [prepared statement] X makes no direct changes to +** the content of the database file. +** +** Note that [application-defined SQL functions] or +** [virtual tables] might change the database indirectly as a side effect. +** ^(For example, if an application defines a function "eval()" that +** calls [sqlite3_exec()], then the following SQL statement would +** change the database file through side-effects: +** +**
      +**    SELECT eval('DELETE FROM t1') FROM t2;
      +** 
      +** +** But because the [SELECT] statement does not change the database file +** directly, sqlite3_stmt_readonly() would still return true.)^ +** +** ^Transaction control statements such as [BEGIN], [COMMIT], [ROLLBACK], +** [SAVEPOINT], and [RELEASE] cause sqlite3_stmt_readonly() to return true, +** since the statements themselves do not actually modify the database but +** rather they control the timing of when other statements modify the +** database. ^The [ATTACH] and [DETACH] statements also cause +** sqlite3_stmt_readonly() to return true since, while those statements +** change the configuration of a database connection, they do not make +** changes to the content of the database files on disk. +** ^The sqlite3_stmt_readonly() interface returns true for [BEGIN] since +** [BEGIN] merely sets internal flags, but the [BEGIN|BEGIN IMMEDIATE] and +** [BEGIN|BEGIN EXCLUSIVE] commands do touch the database and so +** sqlite3_stmt_readonly() returns false for those commands. +*/ +SQLITE_API int sqlite3_stmt_readonly(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Determine If A Prepared Statement Has Been Reset +** METHOD: sqlite3_stmt +** +** ^The sqlite3_stmt_busy(S) interface returns true (non-zero) if the +** [prepared statement] S has been stepped at least once using +** [sqlite3_step(S)] but has neither run to completion (returned +** [SQLITE_DONE] from [sqlite3_step(S)]) nor +** been reset using [sqlite3_reset(S)]. ^The sqlite3_stmt_busy(S) +** interface returns false if S is a NULL pointer. If S is not a +** NULL pointer and is not a pointer to a valid [prepared statement] +** object, then the behavior is undefined and probably undesirable. +** +** This interface can be used in combination [sqlite3_next_stmt()] +** to locate all prepared statements associated with a database +** connection that are in need of being reset. This can be used, +** for example, in diagnostic routines to search for prepared +** statements that are holding a transaction open. +*/ +SQLITE_API int sqlite3_stmt_busy(sqlite3_stmt*); + +/* +** 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 +** can be integers, floating point values, strings, BLOBs, or NULL. +** +** An sqlite3_value object may be either "protected" or "unprotected". +** Some interfaces require a protected sqlite3_value. Other interfaces +** will accept either a protected or an unprotected sqlite3_value. +** Every interface that accepts sqlite3_value arguments specifies +** whether or not it requires a protected sqlite3_value. The +** [sqlite3_value_dup()] interface can be used to construct a new +** protected sqlite3_value from an unprotected sqlite3_value. +** +** The terms "protected" and "unprotected" refer to whether or not +** a mutex is held. An internal mutex is held for a protected +** sqlite3_value object but no mutex is held for an unprotected +** sqlite3_value object. If SQLite is compiled to be single-threaded +** (with [SQLITE_THREADSAFE=0] and with [sqlite3_threadsafe()] returning 0) +** or if SQLite is run in one of reduced mutex modes +** [SQLITE_CONFIG_SINGLETHREAD] or [SQLITE_CONFIG_MULTITHREAD] +** then there is no distinction between protected and unprotected +** sqlite3_value objects and they can be used interchangeably. However, +** for maximum code portability it is recommended that applications +** still make the distinction between protected and unprotected +** sqlite3_value objects even when not strictly required. +** +** ^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 +** [sqlite3_column_value()] is unprotected. +** Unprotected sqlite3_value objects may only be used as arguments +** to [sqlite3_result_value()], [sqlite3_bind_value()], and +** [sqlite3_value_dup()]. +** The [sqlite3_value_blob | sqlite3_value_type()] family of +** interfaces require protected sqlite3_value objects. +*/ +typedef struct sqlite3_value sqlite3_value; + +/* +** 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 +** 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()], +** [sqlite3_aggregate_context()], [sqlite3_user_data()], +** [sqlite3_context_db_handle()], [sqlite3_get_auxdata()], +** and/or [sqlite3_set_auxdata()]. +*/ +typedef struct sqlite3_context sqlite3_context; + +/* +** CAPI3REF: Binding Values To Prepared Statements +** KEYWORDS: {host parameter} {host parameters} {host parameter name} +** KEYWORDS: {SQL parameter} {SQL parameters} {parameter binding} +** METHOD: sqlite3_stmt +** +** ^(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: +** +**
        +**
      • ? +**
      • ?NNN +**
      • :VVV +**
      • @VVV +**
      • $VVV +**
      +** +** In the templates above, NNN represents an integer literal, +** and VVV represents an alphanumeric identifier.)^ ^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 +** 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 +** 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 +** for "?NNN" parameters is the value of NNN. +** ^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. +** ^If the third parameter to sqlite3_bind_text() or sqlite3_bind_text16() +** or sqlite3_bind_blob() is a NULL pointer then the fourth parameter +** is ignored and the end result is the same as sqlite3_bind_null(). +** +** ^(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 to sqlite3_bind_text() or sqlite3_bind_text16() +** is negative, then the length of the string is +** the number of bytes up to the first zero terminator. +** If the fourth parameter to sqlite3_bind_blob() is negative, then +** the behavior is undefined. +** If a non-negative fourth parameter is provided to sqlite3_bind_text() +** or sqlite3_bind_text16() or sqlite3_bind_text64() then +** that parameter must be the byte offset +** where the NUL terminator would occur assuming the string were NUL +** terminated. If any NUL characters occur at byte offsets less than +** the value of the fourth parameter then the resulting string value will +** contain embedded NULs. The result of expressions involving strings +** with embedded NULs is undefined. +** +** ^The fifth argument to the BLOB and string binding interfaces +** is a destructor used to dispose of the BLOB or +** string after SQLite has finished with it. ^The destructor is called +** to dispose of the BLOB or string even if the call to bind API fails. +** ^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 +** SQLite makes its own private copy of the data immediately, before +** the sqlite3_bind_*() routine returns. +** +** ^The sixth argument to sqlite3_bind_text64() must be one of +** [SQLITE_UTF8], [SQLITE_UTF16], [SQLITE_UTF16BE], or [SQLITE_UTF16LE] +** to specify the encoding of the text in the third parameter. If +** the sixth argument to sqlite3_bind_text64() is not one of the +** allowed values shown above, or if the text encoding is different +** from the encoding specified by the sixth parameter, then the behavior +** is undefined. +** +** ^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_pointer(S,I,P,T,D) routine causes the I-th parameter in +** [prepared statement] S to have an SQL value of NULL, but to also be +** associated with the pointer P of type T. ^D is either a NULL pointer or +** a pointer to a destructor function for P. ^SQLite will invoke the +** destructor D with a single argument of P when it is finished using +** P. The T parameter should be a static string, preferably a string +** literal. The sqlite3_bind_pointer() routine is part of the +** [pointer passing interface] added for SQLite 3.20.0. +** +** ^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. +** +** ^The sqlite3_bind_* routines return [SQLITE_OK] on success or an +** [error code] if anything goes wrong. +** ^[SQLITE_TOOBIG] might be returned if the size of a string or BLOB +** exceeds limits imposed by [sqlite3_limit]([SQLITE_LIMIT_LENGTH]) or +** [SQLITE_MAX_LENGTH]. +** ^[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_blob64(sqlite3_stmt*, int, const void*, sqlite3_uint64, + void(*)(void*)); +SQLITE_API int sqlite3_bind_double(sqlite3_stmt*, int, double); +SQLITE_API int sqlite3_bind_int(sqlite3_stmt*, int, int); +SQLITE_API int sqlite3_bind_int64(sqlite3_stmt*, int, sqlite3_int64); +SQLITE_API int sqlite3_bind_null(sqlite3_stmt*, int); +SQLITE_API int sqlite3_bind_text(sqlite3_stmt*,int,const char*,int,void(*)(void*)); +SQLITE_API int sqlite3_bind_text16(sqlite3_stmt*, int, const void*, int, void(*)(void*)); +SQLITE_API int sqlite3_bind_text64(sqlite3_stmt*, int, const char*, sqlite3_uint64, + void(*)(void*), unsigned char encoding); +SQLITE_API int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*); +SQLITE_API int sqlite3_bind_pointer(sqlite3_stmt*, int, void*, const char*,void(*)(void*)); +SQLITE_API int sqlite3_bind_zeroblob(sqlite3_stmt*, int, int n); +SQLITE_API int sqlite3_bind_zeroblob64(sqlite3_stmt*, int, sqlite3_uint64); + +/* +** CAPI3REF: Number Of SQL Parameters +** METHOD: sqlite3_stmt +** +** ^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) +** parameter. For all forms except ?NNN, this will correspond to the +** 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()]. +*/ +SQLITE_API int sqlite3_bind_parameter_count(sqlite3_stmt*); + +/* +** CAPI3REF: Name Of A Host Parameter +** METHOD: sqlite3_stmt +** +** ^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 referred to as "nameless" or "anonymous parameters". +** +** ^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 +** always in UTF-8 encoding even if the named parameter was +** originally specified as UTF-16 in [sqlite3_prepare16()], +** [sqlite3_prepare16_v2()], or [sqlite3_prepare16_v3()]. +** +** See also: [sqlite3_bind_blob|sqlite3_bind()], +** [sqlite3_bind_parameter_count()], and +** [sqlite3_bind_parameter_index()]. +*/ +SQLITE_API const char *sqlite3_bind_parameter_name(sqlite3_stmt*, int); + +/* +** CAPI3REF: Index Of A Parameter With A Given Name +** METHOD: sqlite3_stmt +** +** ^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 +** name must be given in UTF-8 even if the original statement +** was prepared from UTF-16 text using [sqlite3_prepare16_v2()] or +** [sqlite3_prepare16_v3()]. +** +** See also: [sqlite3_bind_blob|sqlite3_bind()], +** [sqlite3_bind_parameter_count()], and +** [sqlite3_bind_parameter_name()]. +*/ +SQLITE_API int sqlite3_bind_parameter_index(sqlite3_stmt*, const char *zName); + +/* +** CAPI3REF: Reset All Bindings On A Prepared Statement +** METHOD: sqlite3_stmt +** +** ^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. +*/ +SQLITE_API int sqlite3_clear_bindings(sqlite3_stmt*); + +/* +** CAPI3REF: Number Of Columns In A Result Set +** METHOD: sqlite3_stmt +** +** ^Return the number of columns in the result set returned by the +** [prepared statement]. ^If this routine returns 0, that means the +** [prepared statement] returns no data (for example an [UPDATE]). +** ^However, just because this routine returns a positive number does not +** mean that one or more rows of data will be returned. ^A SELECT statement +** will always have a positive sqlite3_column_count() but depending on the +** WHERE clause constraints and the table content, it might return no rows. +** +** See also: [sqlite3_data_count()] +*/ +SQLITE_API int sqlite3_column_count(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Column Names In A Result Set +** METHOD: sqlite3_stmt +** +** ^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. +** +** ^The returned string pointer is valid until either the [prepared statement] +** is destroyed by [sqlite3_finalize()] or until the statement is automatically +** reprepared by the first call to [sqlite3_step()] for a particular run +** 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 +** (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 +** 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. +*/ +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 +** METHOD: sqlite3_stmt +** +** ^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 +** using [sqlite3_finalize()] or until the statement is automatically +** reprepared by the first call to [sqlite3_step()] for a particular run +** or until the same information is requested +** again in a different encoding. +** +** ^The names returned are the original un-aliased names of the +** database, table, and column. +** +** ^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 +** 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, +** or column that query result column was extracted from. +** +** ^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. +** +** 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. +** +** If two or more threads call one or more +** [sqlite3_column_database_name | column metadata interfaces] +** for the same [prepared statement] and result column +** at the same time then the results are undefined. +*/ +SQLITE_API const char *sqlite3_column_database_name(sqlite3_stmt*,int); +SQLITE_API const void *sqlite3_column_database_name16(sqlite3_stmt*,int); +SQLITE_API const char *sqlite3_column_table_name(sqlite3_stmt*,int); +SQLITE_API const void *sqlite3_column_table_name16(sqlite3_stmt*,int); +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 +** METHOD: sqlite3_stmt +** +** ^(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 +** expression or subquery, then a NULL pointer is returned. +** ^The returned string is always UTF-8 encoded. +** +** ^(For example, given the database schema: +** +** CREATE TABLE t1(c1 VARIANT); +** +** and the following statement to be compiled: +** +** 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).)^ +** +** ^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 +** is associated with individual values, not with the containers +** used to hold those values. +*/ +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 +** METHOD: sqlite3_stmt +** +** After a [prepared statement] has been prepared using any of +** [sqlite3_prepare_v2()], [sqlite3_prepare_v3()], [sqlite3_prepare16_v2()], +** or [sqlite3_prepare16_v3()] or one of the legacy +** interfaces [sqlite3_prepare()] or [sqlite3_prepare16()], this function +** must be called one or more times to evaluate the statement. +** +** The details of the behavior of the sqlite3_step() interface depend +** on whether the statement was prepared using the newer "vX" interfaces +** [sqlite3_prepare_v3()], [sqlite3_prepare_v2()], [sqlite3_prepare16_v3()], +** [sqlite3_prepare16_v2()] or the older legacy +** interfaces [sqlite3_prepare()] and [sqlite3_prepare16()]. The use of the +** new "vX" 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], +** [SQLITE_DONE], [SQLITE_ROW], [SQLITE_ERROR], or [SQLITE_MISUSE]. +** ^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] +** or occurs outside of an explicit transaction, then you can retry the +** statement. If the statement is not a [COMMIT] and occurs within an +** explicit transaction then you should rollback the transaction before +** continuing. +** +** ^[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] +** 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 +** 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, +** [SQLITE_INTERRUPT], [SQLITE_SCHEMA], [SQLITE_CORRUPT], and so forth) +** can be obtained by calling [sqlite3_reset()] on the +** [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. +** Perhaps it was called on a [prepared statement] that has +** already been [sqlite3_finalize | finalized] or on one that had +** previously returned [SQLITE_ERROR] or [SQLITE_DONE]. Or it could +** be the case that the same database connection is being used by two or +** more threads at the same moment in time. +** +** For all versions of SQLite up to and including 3.6.23.1, a call to +** [sqlite3_reset()] was required after sqlite3_step() returned anything +** other than [SQLITE_ROW] before any subsequent invocation of +** sqlite3_step(). Failure to reset the prepared statement using +** [sqlite3_reset()] would result in an [SQLITE_MISUSE] return from +** sqlite3_step(). But after [version 3.6.23.1] ([dateof:3.6.23.1], +** sqlite3_step() began +** calling [sqlite3_reset()] automatically in this circumstance rather +** than returning [SQLITE_MISUSE]. This is not considered a compatibility +** break because any application that ever receives an SQLITE_MISUSE error +** is broken by definition. The [SQLITE_OMIT_AUTORESET] compile-time option +** can be used to restore the legacy behavior. +** +** Goofy Interface Alert: In the legacy interface, the sqlite3_step() +** API always returns a generic error code, [SQLITE_ERROR], following any +** error other than [SQLITE_BUSY] and [SQLITE_MISUSE]. You must call +** [sqlite3_reset()] or [sqlite3_finalize()] in order to find one of the +** specific [error codes] that better describes the error. +** We admit that this is a goofy design. The problem has been fixed +** with the "v2" interface. If you prepare all of your SQL statements +** using [sqlite3_prepare_v3()] or [sqlite3_prepare_v2()] +** or [sqlite3_prepare16_v2()] or [sqlite3_prepare16_v3()] instead +** 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 "vX" interfaces is recommended. +*/ +SQLITE_API int sqlite3_step(sqlite3_stmt*); + +/* +** CAPI3REF: Number of columns in a result set +** METHOD: sqlite3_stmt +** +** ^The sqlite3_data_count(P) interface returns the number of columns in the +** current row of the result set of [prepared statement] P. +** ^If prepared statement P does not have results ready to return +** (via calls to the [sqlite3_column_int | sqlite3_column_*()] of +** interfaces) then sqlite3_data_count(P) returns 0. +** ^The sqlite3_data_count(P) routine also returns 0 if P is a NULL pointer. +** ^The sqlite3_data_count(P) routine returns 0 if the previous call to +** [sqlite3_step](P) returned [SQLITE_DONE]. ^The sqlite3_data_count(P) +** will return non-zero if previous call to [sqlite3_step](P) returned +** [SQLITE_ROW], except in the case of the [PRAGMA incremental_vacuum] +** where it always returns zero since each step of that multi-step +** pragma returns 0 columns of data. +** +** See also: [sqlite3_column_count()] +*/ +SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Fundamental Datatypes +** KEYWORDS: SQLITE_TEXT +** +** ^(Every value in SQLite has one of five fundamental datatypes: +** +**
        +**
      • 64-bit signed integer +**
      • 64-bit IEEE floating point number +**
      • string +**
      • BLOB +**
      • NULL +**
      )^ +** +** These constants are codes for each of those types. +** +** Note that the SQLITE_TEXT constant was also used in SQLite version 2 +** for a completely different meaning. Software that links against both +** SQLite version 2 and SQLite version 3 should use SQLITE3_TEXT, not +** SQLITE_TEXT. +*/ +#define SQLITE_INTEGER 1 +#define SQLITE_FLOAT 2 +#define SQLITE_BLOB 4 +#define SQLITE_NULL 5 +#ifdef SQLITE_TEXT +# undef SQLITE_TEXT +#else +# define SQLITE_TEXT 3 +#endif +#define SQLITE3_TEXT 3 + +/* +** CAPI3REF: Result Values From A Query +** KEYWORDS: {column access functions} +** METHOD: sqlite3_stmt +** +** Summary: +**
      +**
      sqlite3_column_blobBLOB result +**
      sqlite3_column_doubleREAL result +**
      sqlite3_column_int32-bit INTEGER result +**
      sqlite3_column_int6464-bit INTEGER result +**
      sqlite3_column_textUTF-8 TEXT result +**
      sqlite3_column_text16UTF-16 TEXT result +**
      sqlite3_column_valueThe result as an +** [sqlite3_value|unprotected sqlite3_value] object. +**
          +**
      sqlite3_column_bytesSize of a BLOB +** or a UTF-8 TEXT result in bytes +**
      sqlite3_column_bytes16   +** →  Size of UTF-16 +** TEXT in bytes +**
      sqlite3_column_typeDefault +** datatype of the result +**
      +** +** Details: +** +** ^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. +** ^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. +** These routines may only be called when the most recent call to +** [sqlite3_step()] has returned [SQLITE_ROW] and neither +** [sqlite3_reset()] nor [sqlite3_finalize()] have been called subsequently. +** If any of these routines are called after [sqlite3_reset()] or +** [sqlite3_finalize()] or after [sqlite3_step()] has returned +** something other than [SQLITE_ROW], the results are undefined. +** If [sqlite3_step()] or [sqlite3_reset()] or [sqlite3_finalize()] +** are called from a different thread while any of these routines +** are pending, then the results are undefined. +** +** The first six interfaces (_blob, _double, _int, _int64, _text, and _text16) +** each return the value of a result column in a specific data format. If +** the result column is not initially in the requested format (for example, +** if the query returns an integer but the sqlite3_column_text() interface +** is used to extract the value) then an automatic type conversion is performed. +** +** ^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], +** [SQLITE_FLOAT], [SQLITE_TEXT], [SQLITE_BLOB], or [SQLITE_NULL]. +** The return value of sqlite3_column_type() can be used to decide which +** of the first six interface should be used to extract the column value. +** The value returned by sqlite3_column_type() is only meaningful if no +** automatic type conversions have occurred for the value in question. +** After a type conversion, the result of calling sqlite3_column_type() +** is undefined, though harmless. Future +** versions of SQLite may change the behavior of sqlite3_column_type() +** following a type conversion. +** +** If the result is a BLOB or a TEXT string, then the sqlite3_column_bytes() +** or sqlite3_column_bytes16() interfaces can be used to determine the size +** of that BLOB or string. +** +** ^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 +** the string to UTF-8 and then returns the number of bytes. +** ^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. +** ^If the result is NULL, then sqlite3_column_bytes() returns zero. +** +** ^If the result is a BLOB or UTF-16 string then the sqlite3_column_bytes16() +** routine returns the number of bytes in that BLOB or string. +** ^If the result is a UTF-8 string, then sqlite3_column_bytes16() converts +** the string to UTF-16 and then returns the number of bytes. +** ^If the result is a numeric value then sqlite3_column_bytes16() uses +** [sqlite3_snprintf()] to convert that value to a UTF-16 string and returns +** the number of bytes in that string. +** ^If the result is NULL, then sqlite3_column_bytes16() returns zero. +** +** ^The values returned by [sqlite3_column_bytes()] and +** [sqlite3_column_bytes16()] do not include the zero terminators at the end +** of the string. ^For clarity: the values returned by +** [sqlite3_column_bytes()] and [sqlite3_column_bytes16()] are 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 +** value from sqlite3_column_blob() for a zero-length BLOB is a NULL pointer. +** +** Warning: ^The object returned by [sqlite3_column_value()] is an +** [unprotected sqlite3_value] object. In a multithreaded environment, +** an unprotected sqlite3_value object may only be used safely with +** [sqlite3_bind_value()] and [sqlite3_result_value()]. +** If the [unprotected sqlite3_value] object returned by +** [sqlite3_column_value()] is used in any other way, including calls +** to routines like [sqlite3_value_int()], [sqlite3_value_text()], +** or [sqlite3_value_bytes()], the behavior is not threadsafe. +** Hence, the sqlite3_column_value() interface +** is normally only useful within the implementation of +** [application-defined SQL functions] or [virtual tables], not within +** top-level application code. +** +** The these routines may attempt to convert the datatype of the result. +** ^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 +** that are applied: +** +**
      +** +**
      Internal
      Type
      Requested
      Type
      Conversion +** +**
      NULL INTEGER Result is 0 +**
      NULL FLOAT Result is 0.0 +**
      NULL TEXT Result is a NULL pointer +**
      NULL BLOB Result is a NULL pointer +**
      INTEGER FLOAT Convert from integer to float +**
      INTEGER TEXT ASCII rendering of the integer +**
      INTEGER BLOB Same as INTEGER->TEXT +**
      FLOAT INTEGER [CAST] to INTEGER +**
      FLOAT TEXT ASCII rendering of the float +**
      FLOAT BLOB [CAST] to BLOB +**
      TEXT INTEGER [CAST] to INTEGER +**
      TEXT FLOAT [CAST] to REAL +**
      TEXT BLOB No change +**
      BLOB INTEGER [CAST] to INTEGER +**
      BLOB FLOAT [CAST] to REAL +**
      BLOB TEXT Add a zero terminator if needed +**
      +**
      )^ +** +** 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 +** in the following cases: +** +**
        +**
      • The initial content is a BLOB and sqlite3_column_text() or +** sqlite3_column_text16() is called. A zero-terminator might +** need to be added to the string.
      • +**
      • The initial content is UTF-8 text and sqlite3_column_bytes16() or +** sqlite3_column_text16() is called. The content must be converted +** to UTF-16.
      • +**
      • 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 +** not invalidate a prior pointer, though of course the content of the buffer +** that the prior pointer references 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 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 +** into the desired format, then invoke sqlite3_column_bytes() or +** sqlite3_column_bytes16() to find the size of the result. Do not mix calls +** to sqlite3_column_text() or sqlite3_column_blob() with calls to +** 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 +** described above, or until [sqlite3_step()] or [sqlite3_reset()] or +** [sqlite3_finalize()] is called. ^The memory space used to hold strings +** and BLOBs is freed automatically. Do not pass the pointers returned +** from [sqlite3_column_blob()], [sqlite3_column_text()], etc. into +** [sqlite3_free()]. +** +** ^(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].)^ +*/ +SQLITE_API const void *sqlite3_column_blob(sqlite3_stmt*, int iCol); +SQLITE_API double sqlite3_column_double(sqlite3_stmt*, int iCol); +SQLITE_API int sqlite3_column_int(sqlite3_stmt*, int iCol); +SQLITE_API sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol); +SQLITE_API const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol); +SQLITE_API const void *sqlite3_column_text16(sqlite3_stmt*, int iCol); +SQLITE_API sqlite3_value *sqlite3_column_value(sqlite3_stmt*, int iCol); +SQLITE_API int sqlite3_column_bytes(sqlite3_stmt*, int iCol); +SQLITE_API int sqlite3_column_bytes16(sqlite3_stmt*, int iCol); +SQLITE_API int sqlite3_column_type(sqlite3_stmt*, int iCol); + +/* +** CAPI3REF: Destroy A Prepared Statement Object +** DESTRUCTOR: sqlite3_stmt +** +** ^The sqlite3_finalize() function is called to delete a [prepared statement]. +** ^If the most recent evaluation of the statement encountered no errors +** or if the statement is never been evaluated, then sqlite3_finalize() returns +** SQLITE_OK. ^If the most recent evaluation of statement S failed, then +** sqlite3_finalize(S) returns the appropriate [error code] or +** [extended error code]. +** +** ^The sqlite3_finalize(S) routine can be called at any point during +** the life cycle of [prepared statement] S: +** before statement S is ever evaluated, after +** one or more calls to [sqlite3_reset()], or after any call +** to [sqlite3_step()] regardless of whether or not the statement has +** completed execution. +** +** ^Invoking sqlite3_finalize() on a NULL pointer is a harmless no-op. +** +** The application must finalize every [prepared statement] in order to avoid +** resource leaks. It is a grievous error for the application to try to use +** a prepared statement after it has been finalized. Any use of a prepared +** statement after it has been finalized can result in undefined and +** undesirable behavior such as segfaults and heap corruption. +*/ +SQLITE_API int sqlite3_finalize(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Reset A Prepared Statement Object +** METHOD: sqlite3_stmt +** +** 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 +** the [sqlite3_bind_blob | sqlite3_bind_*() API] retain their values. +** Use [sqlite3_clear_bindings()] to reset the bindings. +** +** ^The [sqlite3_reset(S)] interface resets the [prepared statement] S +** back to the beginning of its program. +** +** ^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 indicated an error, then +** [sqlite3_reset(S)] returns an appropriate [error code]. +** +** ^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 +** KEYWORDS: {function creation routines} +** KEYWORDS: {application-defined SQL function} +** KEYWORDS: {application-defined SQL functions} +** METHOD: sqlite3 +** +** ^These 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 differences between +** these routines are the text encoding expected for +** the second parameter (the name of the function being created) +** and the presence or absence of a destructor callback for +** the application data pointer. +** +** ^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 in a UTF-8 +** representation, exclusive of the zero-terminator. ^Note that the name +** length limit is in UTF-8 bytes, not characters nor UTF-16 bytes. +** ^Any attempt to create a function with a longer name +** will result in [SQLITE_MISUSE] being returned. +** +** ^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 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 +** undefined. +** +** ^The fourth parameter, eTextRep, specifies what +** [SQLITE_UTF8 | text encoding] this SQL function prefers for +** its parameters. The application should set this parameter to +** [SQLITE_UTF16LE] if the function implementation invokes +** [sqlite3_value_text16le()] on an input, or [SQLITE_UTF16BE] if the +** implementation invokes [sqlite3_value_text16be()] on an input, or +** [SQLITE_UTF16] if [sqlite3_value_text16()] is used, or [SQLITE_UTF8] +** otherwise. ^The same SQL function may be registered multiple times using +** different preferred text encodings, with different implementations for +** each encoding. +** ^When multiple implementations of the same function are available, SQLite +** will pick the one that involves the least amount of data conversion. +** +** ^The fourth parameter may optionally be ORed with [SQLITE_DETERMINISTIC] +** to signal that the function will always return the same result given +** the same inputs within a single SQL statement. Most SQL functions are +** deterministic. The built-in [random()] SQL function is an example of a +** function that is not deterministic. The SQLite query planner is able to +** perform additional optimizations on deterministic functions, so use +** of the [SQLITE_DETERMINISTIC] flag is recommended where possible. +** +** ^(The fifth parameter is an arbitrary pointer. The implementation of the +** function can gain access to this pointer using [sqlite3_user_data()].)^ +** +** ^The sixth, seventh and eighth 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 must be passed as the xStep and xFinal +** parameters. ^An aggregate SQL function requires an implementation of xStep +** and xFinal and NULL pointer must be passed for xFunc. ^To delete an existing +** SQL function or aggregate, pass NULL pointers for all three function +** callbacks. +** +** ^(If the ninth parameter to sqlite3_create_function_v2() is not NULL, +** then it is destructor for the application data pointer. +** The destructor is invoked when the function is deleted, either by being +** overloaded or when the database connection closes.)^ +** ^The destructor is also invoked if the call to +** sqlite3_create_function_v2() fails. +** ^When the destructor callback of the tenth parameter is invoked, it +** is passed a single argument which is a copy of the application data +** pointer which was the fifth parameter to sqlite3_create_function_v2(). +** +** ^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 +** the implementation that most closely matches the way in which the +** 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 +** 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 +** 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. +** +** ^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. +*/ +SQLITE_API int sqlite3_create_function( + sqlite3 *db, + const char *zFunctionName, + int nArg, + int eTextRep, + void *pApp, + void (*xFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*) +); +SQLITE_API int sqlite3_create_function16( + sqlite3 *db, + const void *zFunctionName, + int nArg, + int eTextRep, + void *pApp, + void (*xFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*) +); +SQLITE_API int sqlite3_create_function_v2( + sqlite3 *db, + const char *zFunctionName, + int nArg, + int eTextRep, + void *pApp, + void (*xFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*), + void(*xDestroy)(void*) +); + +/* +** CAPI3REF: Text Encodings +** +** These constant define integer codes that represent the various +** text encodings supported by SQLite. +*/ +#define SQLITE_UTF8 1 /* IMP: R-37514-35566 */ +#define SQLITE_UTF16LE 2 /* IMP: R-03371-37637 */ +#define SQLITE_UTF16BE 3 /* IMP: R-51971-34154 */ +#define SQLITE_UTF16 4 /* Use native byte order */ +#define SQLITE_ANY 5 /* Deprecated */ +#define SQLITE_UTF16_ALIGNED 8 /* sqlite3_create_collation only */ + +/* +** CAPI3REF: Function Flags +** +** These constants may be ORed together with the +** [SQLITE_UTF8 | preferred text encoding] as the fourth argument +** to [sqlite3_create_function()], [sqlite3_create_function16()], or +** [sqlite3_create_function_v2()]. +*/ +#define SQLITE_DETERMINISTIC 0x800 + +/* +** CAPI3REF: Deprecated Functions +** DEPRECATED +** +** These functions are [deprecated]. In order to maintain +** backwards compatibility with older code, these functions continue +** to be supported. However, new applications should avoid +** the use of these functions. To encourage programmers to avoid +** these functions, we will not explain what they do. +*/ +#ifndef SQLITE_OMIT_DEPRECATED +SQLITE_API SQLITE_DEPRECATED int sqlite3_aggregate_count(sqlite3_context*); +SQLITE_API SQLITE_DEPRECATED int sqlite3_expired(sqlite3_stmt*); +SQLITE_API SQLITE_DEPRECATED int sqlite3_transfer_bindings(sqlite3_stmt*, sqlite3_stmt*); +SQLITE_API SQLITE_DEPRECATED int sqlite3_global_recover(void); +SQLITE_API SQLITE_DEPRECATED void sqlite3_thread_cleanup(void); +SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void(*)(void*,sqlite3_int64,int), + void*,sqlite3_int64); +#endif + +/* +** CAPI3REF: Obtaining SQL Values +** METHOD: sqlite3_value +** +** Summary: +**
      +**
      sqlite3_value_blobBLOB value +**
      sqlite3_value_doubleREAL value +**
      sqlite3_value_int32-bit INTEGER value +**
      sqlite3_value_int6464-bit INTEGER value +**
      sqlite3_value_pointerPointer value +**
      sqlite3_value_textUTF-8 TEXT value +**
      sqlite3_value_text16UTF-16 TEXT value in +** the native byteorder +**
      sqlite3_value_text16beUTF-16be TEXT value +**
      sqlite3_value_text16leUTF-16le TEXT value +**
          +**
      sqlite3_value_bytesSize of a BLOB +** or a UTF-8 TEXT in bytes +**
      sqlite3_value_bytes16   +** →  Size of UTF-16 +** TEXT in bytes +**
      sqlite3_value_typeDefault +** datatype of the value +**
      sqlite3_value_numeric_type   +** →  Best numeric datatype of the value +**
      sqlite3_value_nochange   +** →  True if the column is unchanged in an UPDATE +** against a virtual table. +**
      +** +** Details: +** +** These routines extract type, size, and content information from +** [protected sqlite3_value] objects. Protected sqlite3_value objects +** are used to pass parameter information into implementation of +** [application-defined SQL functions] and [virtual tables]. +** +** These routines work only with [protected sqlite3_value] objects. +** Any attempt to use these routines on an [unprotected sqlite3_value] +** is not threadsafe. +** +** ^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 +** sqlite3_value_text16be() and sqlite3_value_text16le() interfaces +** extract UTF-16 strings as big-endian and little-endian respectively. +** +** ^If [sqlite3_value] object V was initialized +** using [sqlite3_bind_pointer(S,I,P,X,D)] or [sqlite3_result_pointer(C,P,X,D)] +** and if X and Y are strings that compare equal according to strcmp(X,Y), +** then sqlite3_value_pointer(V,Y) will return the pointer P. ^Otherwise, +** sqlite3_value_pointer(V,Y) returns a NULL. The sqlite3_bind_pointer() +** routine is part of the [pointer passing interface] added for SQLite 3.20.0. +** +** ^(The sqlite3_value_type(V) interface returns the +** [SQLITE_INTEGER | datatype code] for the initial datatype of the +** [sqlite3_value] object V. The returned value is one of [SQLITE_INTEGER], +** [SQLITE_FLOAT], [SQLITE_TEXT], [SQLITE_BLOB], or [SQLITE_NULL].)^ +** Other interfaces might change the datatype for an sqlite3_value object. +** For example, if the datatype is initially SQLITE_INTEGER and +** sqlite3_value_text(V) is called to extract a text value for that +** integer, then subsequent calls to sqlite3_value_type(V) might return +** SQLITE_TEXT. Whether or not a persistent internal datatype conversion +** occurs is undefined and may change from one release of SQLite to the next. +** +** ^(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.)^ +** +** ^Within the [xUpdate] method of a [virtual table], the +** sqlite3_value_nochange(X) interface returns true if and only if +** the column corresponding to X is unchanged by the UPDATE operation +** that the xUpdate method call was invoked to implement and if +** and the prior [xColumn] method call that was invoked to extracted +** the value for that column returned without setting a result (probably +** because it queried [sqlite3_vtab_nochange()] and found that the column +** was unchanging). ^Within an [xUpdate] method, any value for which +** sqlite3_value_nochange(X) is true will in all other respects appear +** to be a NULL value. If sqlite3_value_nochange(X) is invoked anywhere other +** than within an [xUpdate] method call for an UPDATE statement, then +** the return value is arbitrary and meaningless. +** +** Please pay particular attention to the fact that the pointer returned +** from [sqlite3_value_blob()], [sqlite3_value_text()], or +** [sqlite3_value_text16()] can be invalidated by a subsequent call to +** [sqlite3_value_bytes()], [sqlite3_value_bytes16()], [sqlite3_value_text()], +** or [sqlite3_value_text16()]. +** +** These routines must be called from the same thread as +** the SQL function that supplied the [sqlite3_value*] parameters. +*/ +SQLITE_API const void *sqlite3_value_blob(sqlite3_value*); +SQLITE_API double sqlite3_value_double(sqlite3_value*); +SQLITE_API int sqlite3_value_int(sqlite3_value*); +SQLITE_API sqlite3_int64 sqlite3_value_int64(sqlite3_value*); +SQLITE_API void *sqlite3_value_pointer(sqlite3_value*, const char*); +SQLITE_API const unsigned char *sqlite3_value_text(sqlite3_value*); +SQLITE_API const void *sqlite3_value_text16(sqlite3_value*); +SQLITE_API const void *sqlite3_value_text16le(sqlite3_value*); +SQLITE_API const void *sqlite3_value_text16be(sqlite3_value*); +SQLITE_API int sqlite3_value_bytes(sqlite3_value*); +SQLITE_API int sqlite3_value_bytes16(sqlite3_value*); +SQLITE_API int sqlite3_value_type(sqlite3_value*); +SQLITE_API int sqlite3_value_numeric_type(sqlite3_value*); +SQLITE_API int sqlite3_value_nochange(sqlite3_value*); + +/* +** CAPI3REF: Finding The Subtype Of SQL Values +** METHOD: sqlite3_value +** +** The sqlite3_value_subtype(V) function returns the subtype for +** an [application-defined SQL function] argument V. The subtype +** information can be used to pass a limited amount of context from +** one SQL function to another. Use the [sqlite3_result_subtype()] +** routine to set the subtype for the return value of an SQL function. +*/ +SQLITE_API unsigned int sqlite3_value_subtype(sqlite3_value*); + +/* +** CAPI3REF: Copy And Free SQL Values +** METHOD: sqlite3_value +** +** ^The sqlite3_value_dup(V) interface makes a copy of the [sqlite3_value] +** object D and returns a pointer to that copy. ^The [sqlite3_value] returned +** is a [protected sqlite3_value] object even if the input is not. +** ^The sqlite3_value_dup(V) interface returns NULL if V is NULL or if a +** memory allocation fails. +** +** ^The sqlite3_value_free(V) interface frees an [sqlite3_value] object +** previously obtained from [sqlite3_value_dup()]. ^If V is a NULL pointer +** then sqlite3_value_free(V) is a harmless no-op. +*/ +SQLITE_API sqlite3_value *sqlite3_value_dup(const sqlite3_value*); +SQLITE_API void sqlite3_value_free(sqlite3_value*); + +/* +** CAPI3REF: Obtain Aggregate Function Context +** METHOD: sqlite3_context +** +** Implementations 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 sqlite3_aggregate_context(C,N) routine returns a NULL pointer +** when first called if N is less than or equal to zero or if a memory +** allocate error occurs. +** +** ^(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.)^ Within the xFinal callback, it is customary to set +** N=0 in calls to sqlite3_aggregate_context(C,N) so that no +** pointless memory allocations occur. +** +** ^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 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. +*/ +SQLITE_API void *sqlite3_aggregate_context(sqlite3_context*, int nBytes); + +/* +** CAPI3REF: User Data For Functions +** METHOD: sqlite3_context +** +** ^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. +** +** This routine must be called from the same thread in which +** the application-defined function is running. +*/ +SQLITE_API void *sqlite3_user_data(sqlite3_context*); + +/* +** CAPI3REF: Database Connection For Functions +** METHOD: sqlite3_context +** +** ^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. +*/ +SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context*); + +/* +** CAPI3REF: Function Auxiliary Data +** METHOD: sqlite3_context +** +** These functions may be used by (non-aggregate) SQL functions to +** associate metadata with argument values. If the same value is passed to +** multiple invocations of the same SQL function during query execution, under +** some circumstances the associated metadata may be preserved. An example +** of where this might be useful is in a regular-expression matching +** function. The compiled version of the regular expression can be stored as +** metadata associated with the pattern string. +** Then as long as the pattern string remains the same, +** the compiled regular expression can be reused on multiple +** invocations of the same function. +** +** ^The sqlite3_get_auxdata(C,N) interface returns a pointer to the metadata +** associated by the sqlite3_set_auxdata(C,N,P,X) function with the Nth argument +** value to the application-defined function. ^N is zero for the left-most +** function argument. ^If there is no metadata +** associated with the function argument, the sqlite3_get_auxdata(C,N) interface +** returns a NULL pointer. +** +** ^The sqlite3_set_auxdata(C,N,P,X) interface saves P as metadata for the N-th +** argument of the application-defined function. ^Subsequent +** calls to sqlite3_get_auxdata(C,N) return P from the most recent +** sqlite3_set_auxdata(C,N,P,X) call if the metadata is still valid or +** NULL if the metadata has been discarded. +** ^After each call to sqlite3_set_auxdata(C,N,P,X) where X is not NULL, +** SQLite will invoke the destructor function X with parameter P exactly +** once, when the metadata is discarded. +** SQLite is free to discard the metadata at any time, including:
        +**
      • ^(when the corresponding function parameter changes)^, or +**
      • ^(when [sqlite3_reset()] or [sqlite3_finalize()] is called for the +** SQL statement)^, or +**
      • ^(when sqlite3_set_auxdata() is invoked again on the same +** parameter)^, or +**
      • ^(during the original sqlite3_set_auxdata() call when a memory +** allocation error occurs.)^
      +** +** Note the last bullet in particular. The destructor X in +** sqlite3_set_auxdata(C,N,P,X) might be called immediately, before the +** sqlite3_set_auxdata() interface even returns. Hence sqlite3_set_auxdata() +** should be called near the end of the function implementation and the +** function implementation should not make any use of P after +** sqlite3_set_auxdata() has been called. +** +** ^(In practice, metadata is preserved between function calls for +** function parameters that are compile-time constants, including literal +** values and [parameters] and expressions composed from the same.)^ +** +** The value of the N parameter to these interfaces should be non-negative. +** Future enhancements may make use of negative N values to define new +** kinds of function caching behavior. +** +** These routines must be called from the same thread in which +** the SQL function is running. +*/ +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 +** +** These are special values for the destructor that is passed in as the +** 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 +** 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. +** +** The typedef is necessary to work around problems in certain +** C++ compilers. +*/ +typedef void (*sqlite3_destructor_type)(void*); +#define SQLITE_STATIC ((sqlite3_destructor_type)0) +#define SQLITE_TRANSIENT ((sqlite3_destructor_type)-1) + +/* +** CAPI3REF: Setting The Result Of An SQL Function +** METHOD: sqlite3_context +** +** These routines are used by the xFunc or xFinal callbacks that +** implement SQL functions and aggregates. See +** [sqlite3_create_function()] and [sqlite3_create_function16()] +** for additional information. +** +** These functions work very much like the [parameter binding] family of +** 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 +** 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(C,N) and sqlite3_result_zeroblob64(C,N) +** interfaces set the result of the application-defined function to be +** a BLOB containing all zero bytes and N bytes in size. +** +** ^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 +** cause the implemented SQL function to throw an exception. +** ^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 +** interprets the string from sqlite3_result_error16() as UTF-16 in native +** 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 +** 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() +** 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() +** or sqlite3_result_error16() resets the error code to SQLITE_ERROR. +** +** ^The sqlite3_result_error_toobig() interface causes SQLite to throw an +** error indicating that a string or BLOB is too long to represent. +** +** ^The sqlite3_result_error_nomem() interface causes SQLite to throw an +** error indicating that a memory allocation failed. +** +** ^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 +** 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 +** of the application-defined function to be NULL. +** +** ^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. +** ^The sqlite3_result_text64() interface sets the return value of an +** application-defined function to be a text string in an encoding +** specified by the fifth (and last) parameter, which must be one +** of [SQLITE_UTF8], [SQLITE_UTF16], [SQLITE_UTF16BE], or [SQLITE_UTF16LE]. +** ^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 +** 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 +** 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 3rd parameter is non-negative, then it +** must be the byte offset into the string where the NUL terminator would +** appear if the string where NUL terminated. If any NUL characters occur +** in the string at a byte offset that is less than the value of the 3rd +** parameter, then the resulting string will contain embedded NULs and the +** result of expressions operating on strings with embedded NULs is undefined. +** ^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 +** 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 +** or sqlite3_result_blob is the special constant SQLITE_TRANSIENT +** then SQLite makes a copy of the result into space obtained +** from [sqlite3_malloc()] before it returns. +** +** ^The sqlite3_result_value() interface sets the result of +** the application-defined function to be a copy of 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 +** [unprotected sqlite3_value] object is required, so either +** kind of [sqlite3_value] object can be used with this interface. +** +** ^The sqlite3_result_pointer(C,P,T,D) interface sets the result to an +** SQL NULL value, just like [sqlite3_result_null(C)], except that it +** also associates the host-language pointer P or type T with that +** NULL value such that the pointer can be retrieved within an +** [application-defined SQL function] using [sqlite3_value_pointer()]. +** ^If the D parameter is not NULL, then it is a pointer to a destructor +** for the P parameter. ^SQLite invokes D with P as its only argument +** when SQLite is finished with P. The T parameter should be a static +** string and preferably a string literal. The sqlite3_result_pointer() +** routine is part of the [pointer passing interface] added for SQLite 3.20.0. +** +** 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. +*/ +SQLITE_API void sqlite3_result_blob(sqlite3_context*, const void*, int, void(*)(void*)); +SQLITE_API void sqlite3_result_blob64(sqlite3_context*,const void*, + sqlite3_uint64,void(*)(void*)); +SQLITE_API void sqlite3_result_double(sqlite3_context*, double); +SQLITE_API void sqlite3_result_error(sqlite3_context*, const char*, int); +SQLITE_API void sqlite3_result_error16(sqlite3_context*, const void*, int); +SQLITE_API void sqlite3_result_error_toobig(sqlite3_context*); +SQLITE_API void sqlite3_result_error_nomem(sqlite3_context*); +SQLITE_API void sqlite3_result_error_code(sqlite3_context*, int); +SQLITE_API void sqlite3_result_int(sqlite3_context*, int); +SQLITE_API void sqlite3_result_int64(sqlite3_context*, sqlite3_int64); +SQLITE_API void sqlite3_result_null(sqlite3_context*); +SQLITE_API void sqlite3_result_text(sqlite3_context*, const char*, int, void(*)(void*)); +SQLITE_API void sqlite3_result_text64(sqlite3_context*, const char*,sqlite3_uint64, + void(*)(void*), unsigned char encoding); +SQLITE_API void sqlite3_result_text16(sqlite3_context*, const void*, int, void(*)(void*)); +SQLITE_API void sqlite3_result_text16le(sqlite3_context*, const void*, int,void(*)(void*)); +SQLITE_API void sqlite3_result_text16be(sqlite3_context*, const void*, int,void(*)(void*)); +SQLITE_API void sqlite3_result_value(sqlite3_context*, sqlite3_value*); +SQLITE_API void sqlite3_result_pointer(sqlite3_context*, void*,const char*,void(*)(void*)); +SQLITE_API void sqlite3_result_zeroblob(sqlite3_context*, int n); +SQLITE_API int sqlite3_result_zeroblob64(sqlite3_context*, sqlite3_uint64 n); + + +/* +** CAPI3REF: Setting The Subtype Of An SQL Function +** METHOD: sqlite3_context +** +** The sqlite3_result_subtype(C,T) function causes the subtype of +** the result from the [application-defined SQL function] with +** [sqlite3_context] C to be the value T. Only the lower 8 bits +** of the subtype T are preserved in current versions of SQLite; +** higher order bits are discarded. +** The number of subtype bytes preserved by SQLite might increase +** in future releases of SQLite. +*/ +SQLITE_API void sqlite3_result_subtype(sqlite3_context*,unsigned int); + +/* +** CAPI3REF: Define New Collating Sequences +** METHOD: sqlite3 +** +** ^These functions add, remove, or modify a [collation] associated +** with the [database connection] specified as the first argument. +** +** ^The name of the collation is a UTF-8 string +** for sqlite3_create_collation() and sqlite3_create_collation_v2() +** and a UTF-16 string in native byte order for sqlite3_create_collation16(). +** ^Collation names that compare equal according to [sqlite3_strnicmp()] are +** considered to be the same name. +** +** ^(The third argument (eTextRep) must be one of the constants: +**
        +**
      • [SQLITE_UTF8], +**
      • [SQLITE_UTF16LE], +**
      • [SQLITE_UTF16BE], +**
      • [SQLITE_UTF16], or +**
      • [SQLITE_UTF16_ALIGNED]. +**
      )^ +** ^The eTextRep argument determines the encoding of strings passed +** to the collating function callback, xCallback. +** ^The [SQLITE_UTF16] and [SQLITE_UTF16_ALIGNED] values for eTextRep +** force strings to be UTF16 with native byte order. +** ^The [SQLITE_UTF16_ALIGNED] value for eTextRep forces strings to begin +** on an even byte address. +** +** ^The fourth argument, pArg, is an application data pointer that is passed +** through as the first argument to the collating function callback. +** +** ^The fifth argument, xCallback, is a pointer to the collating function. +** ^Multiple collating functions can be registered using the same name but +** with different eTextRep parameters and SQLite will use whichever +** function requires the least amount of data transformation. +** ^If the xCallback argument is NULL then the collating function is +** deleted. ^When all collating functions having the same name are deleted, +** that collation is no longer usable. +** +** ^The collating function callback is invoked with a copy of the pArg +** application data pointer and with two strings in the encoding specified +** by the eTextRep argument. The collating function must return an +** integer that is negative, zero, or positive +** if the first string is less than, equal to, or greater than the second, +** respectively. A collating function must always return the same answer +** given the same inputs. If two or more collating functions are registered +** to the same collation name (using different eTextRep values) then all +** must give an equivalent answer when invoked with equivalent strings. +** The collating function must obey the following properties for all +** strings A, B, and C: +** +**
        +**
      1. If A==B then B==A. +**
      2. If A==B and B==C then A==C. +**
      3. If A<B THEN B>A. +**
      4. If A<B and B<C then A<C. +**
      +** +** If a collating function fails any of the above constraints and that +** collating function is registered and used, then the behavior of SQLite +** is undefined. +** +** ^The sqlite3_create_collation_v2() works like sqlite3_create_collation() +** with the addition that the xDestroy callback is invoked on pArg when +** the collating function is deleted. +** ^Collating functions are deleted when they are overridden by later +** calls to the collation creation functions or when the +** [database connection] is closed using [sqlite3_close()]. +** +** ^The xDestroy callback is not called if the +** sqlite3_create_collation_v2() function fails. Applications that invoke +** sqlite3_create_collation_v2() with a non-NULL xDestroy argument should +** check the return code and dispose of the application data pointer +** themselves rather than expecting SQLite to deal with it for them. +** This is different from every other SQLite interface. The inconsistency +** is unfortunate but cannot be changed without breaking backwards +** compatibility. +** +** See also: [sqlite3_collation_needed()] and [sqlite3_collation_needed16()]. +*/ +SQLITE_API int sqlite3_create_collation( + sqlite3*, + const char *zName, + int eTextRep, + void *pArg, + int(*xCompare)(void*,int,const void*,int,const void*) +); +SQLITE_API int sqlite3_create_collation_v2( + sqlite3*, + const char *zName, + int eTextRep, + void *pArg, + int(*xCompare)(void*,int,const void*,int,const void*), + void(*xDestroy)(void*) +); +SQLITE_API int sqlite3_create_collation16( + sqlite3*, + const void *zName, + int eTextRep, + void *pArg, + int(*xCompare)(void*,int,const void*,int,const void*) +); + +/* +** CAPI3REF: Collation Needed Callbacks +** METHOD: sqlite3 +** +** ^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 invoked whenever an undefined collation +** sequence is required. +** +** ^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. ^If sqlite3_collation_needed16() is used, +** the names are passed as UTF-16 in machine native byte order. +** ^A call to either function replaces the existing collation-needed callback. +** +** ^(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.)^ +** +** The callback function should register the desired collation using +** [sqlite3_create_collation()], [sqlite3_create_collation16()], or +** [sqlite3_create_collation_v2()]. +*/ +SQLITE_API int sqlite3_collation_needed( + sqlite3*, + void*, + void(*)(void*,sqlite3*,int eTextRep,const char*) +); +SQLITE_API int sqlite3_collation_needed16( + sqlite3*, + void*, + void(*)(void*,sqlite3*,int eTextRep,const void*) +); + +#ifdef SQLITE_HAS_CODEC +/* +** Specify the key for an encrypted database. This routine should be +** called right after sqlite3_open(). +** +** The code to implement this API is not available in the public release +** of SQLite. +*/ +SQLITE_API int sqlite3_key( + sqlite3 *db, /* Database to be rekeyed */ + const void *pKey, int nKey /* The key */ +); +SQLITE_API int sqlite3_key_v2( + sqlite3 *db, /* Database to be rekeyed */ + const char *zDbName, /* Name of the database */ + const void *pKey, int nKey /* The key */ +); + +/* +** Change the key on an open database. If the current database is not +** encrypted, this routine will encrypt it. If pNew==0 or nNew==0, the +** database is decrypted. +** +** The code to implement this API is not available in the public release +** of SQLite. +*/ +SQLITE_API int sqlite3_rekey( + sqlite3 *db, /* Database to be rekeyed */ + const void *pKey, int nKey /* The new key */ +); +SQLITE_API int sqlite3_rekey_v2( + sqlite3 *db, /* Database to be rekeyed */ + const char *zDbName, /* Name of the database */ + const void *pKey, int nKey /* The new key */ +); + +/* +** Specify the activation key for a SEE database. Unless +** activated, none of the SEE routines will work. +*/ +SQLITE_API void sqlite3_activate_see( + const char *zPassPhrase /* Activation phrase */ +); +#endif + +#ifdef SQLITE_ENABLE_CEROD +/* +** Specify the activation key for a CEROD database. Unless +** activated, none of the CEROD routines will work. +*/ +SQLITE_API void sqlite3_activate_cerod( + const char *zPassPhrase /* Activation phrase */ +); +#endif + +/* +** CAPI3REF: Suspend Execution For A Short Time +** +** 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 +** millisecond time resolution, then the time will be rounded up to +** 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() +** method of the default [sqlite3_vfs] object. If the xSleep() method +** of the default VFS is not implemented correctly, or not implemented at +** all, then the behavior of sqlite3_sleep() may deviate from the description +** in the previous paragraphs. +*/ +SQLITE_API int sqlite3_sleep(int); + +/* +** CAPI3REF: Name Of The Folder Holding Temporary Files +** +** ^(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 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. +** +** Applications are strongly discouraged from using this global variable. +** It is required to set a temporary folder on Windows Runtime (WinRT). +** But for all other platforms, it is highly recommended that applications +** neither read nor write this variable. This global variable is a relic +** that exists for backwards compatibility of legacy applications and should +** be avoided in new projects. +** +** It is not safe to read or modify this variable in more than one +** thread at a time. It is not safe to read or modify this variable +** if a [database connection] is being used at the same time in a separate +** thread. +** It is intended that this variable be set once +** as part of process initialization and before any SQLite interface +** 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] 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 +** using [sqlite3_free]. +** Hence, if this variable is modified directly, either it should be +** made NULL or made to point to memory obtained from [sqlite3_malloc] +** or else the use of the [temp_store_directory pragma] should be avoided. +** Except when requested by the [temp_store_directory pragma], SQLite +** does not free the memory that sqlite3_temp_directory points to. If +** the application wants that memory to be freed, it must do +** so itself, taking care to only do so after all [database connection] +** objects have been destroyed. +** +** Note to Windows Runtime users: The temporary directory must be set +** prior to calling [sqlite3_open] or [sqlite3_open_v2]. Otherwise, various +** features that require the use of temporary files may fail. Here is an +** example of how to do this using C++ with the Windows Runtime: +** +**
      +** LPCWSTR zPath = Windows::Storage::ApplicationData::Current->
      +**       TemporaryFolder->Path->Data();
      +** char zPathBuf[MAX_PATH + 1];
      +** memset(zPathBuf, 0, sizeof(zPathBuf));
      +** WideCharToMultiByte(CP_UTF8, 0, zPath, -1, zPathBuf, sizeof(zPathBuf),
      +**       NULL, NULL);
      +** sqlite3_temp_directory = sqlite3_mprintf("%s", zPathBuf);
      +** 
      +*/ +SQLITE_API SQLITE_EXTERN char *sqlite3_temp_directory; + +/* +** CAPI3REF: Name Of The Folder Holding Database Files +** +** ^(If this global variable is made to point to a string which is +** the name of a folder (a.k.a. directory), then all database files +** specified with a relative pathname and created or accessed by +** SQLite when using a built-in windows [sqlite3_vfs | VFS] will be assumed +** to be relative to that directory.)^ ^If this variable is a NULL +** pointer, then SQLite assumes that all database files specified +** with a relative pathname are relative to the current directory +** for the process. Only the windows VFS makes use of this global +** variable; it is ignored by the unix VFS. +** +** Changing the value of this variable while a database connection is +** open can result in a corrupt database. +** +** It is not safe to read or modify this variable in more than one +** thread at a time. It is not safe to read or modify this variable +** if a [database connection] is being used at the same time in a separate +** thread. +** It is intended that this variable be set once +** as part of process initialization and before any SQLite interface +** routines have been called and that this variable remain unchanged +** thereafter. +** +** ^The [data_store_directory pragma] may modify this variable and cause +** it to point to memory obtained from [sqlite3_malloc]. ^Furthermore, +** the [data_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 +** using [sqlite3_free]. +** Hence, if this variable is modified directly, either it should be +** made NULL or made to point to memory obtained from [sqlite3_malloc] +** or else the use of the [data_store_directory pragma] should be avoided. +*/ +SQLITE_API SQLITE_EXTERN char *sqlite3_data_directory; + +/* +** CAPI3REF: Test For Auto-Commit Mode +** KEYWORDS: {autocommit mode} +** METHOD: sqlite3 +** +** ^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]. +** +** If certain kinds of errors occur on a statement within a multi-statement +** transaction (errors including [SQLITE_FULL], [SQLITE_IOERR], +** [SQLITE_NOMEM], [SQLITE_BUSY], and [SQLITE_INTERRUPT]) then the +** transaction might be rolled back automatically. The only way to +** find out whether SQLite automatically rolled back the transaction after +** an error is to use this function. +** +** If another thread changes the autocommit status of the database +** connection while this routine is running, then the return value +** is undefined. +*/ +SQLITE_API int sqlite3_get_autocommit(sqlite3*); + +/* +** CAPI3REF: Find The Database Handle Of A Prepared Statement +** METHOD: sqlite3_stmt +** +** ^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. +*/ +SQLITE_API sqlite3 *sqlite3_db_handle(sqlite3_stmt*); + +/* +** CAPI3REF: Return The Filename For A Database Connection +** METHOD: sqlite3 +** +** ^The sqlite3_db_filename(D,N) interface returns a pointer to a filename +** associated with database N of connection D. ^The main database file +** has the name "main". If there is no attached database N on the database +** connection D, or if database N is a temporary or in-memory database, then +** a NULL pointer is returned. +** +** ^The filename returned by this function is the output of the +** xFullPathname method of the [VFS]. ^In other words, the filename +** will be an absolute pathname, even if the filename used +** to open the database originally was a URI or relative pathname. +*/ +SQLITE_API const char *sqlite3_db_filename(sqlite3 *db, const char *zDbName); + +/* +** CAPI3REF: Determine if a database is read-only +** METHOD: sqlite3 +** +** ^The sqlite3_db_readonly(D,N) interface returns 1 if the database N +** of connection D is read-only, 0 if it is read/write, or -1 if N is not +** the name of a database on connection D. +*/ +SQLITE_API int sqlite3_db_readonly(sqlite3 *db, const char *zDbName); + +/* +** CAPI3REF: Find the next prepared statement +** METHOD: sqlite3 +** +** ^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 +** 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. +*/ +SQLITE_API sqlite3_stmt *sqlite3_next_stmt(sqlite3 *pDb, sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Commit And Rollback Notification Callbacks +** METHOD: sqlite3 +** +** ^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() +** for the same database connection is overridden. +** ^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_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, +** then the commit is converted into a rollback. +** +** ^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 commit and rollback hook callbacks are not reentrant. +** The callback implementation must not do anything that will modify +** the database connection that invoked the callback. Any actions +** to modify the database connection must be deferred until after the +** completion of the [sqlite3_step()] call that triggered the commit +** or rollback hook in the first place. +** Note that running any other SQL statements, including SELECT statements, +** or merely calling [sqlite3_prepare_v2()] and [sqlite3_step()] will modify +** the database connections for the meaning of "modify" in this paragraph. +** +** ^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 +** returns non-zero, then the [COMMIT] is converted into a [ROLLBACK]. +** ^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 +** 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 +** automatically rolled back because the database connection is closed. +** +** See also the [sqlite3_update_hook()] interface. +*/ +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 +** METHOD: sqlite3 +** +** ^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 in +** a [rowid table]. +** ^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 +** row is updated, inserted or deleted in a rowid table. +** ^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], +** 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 +** 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 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 [WITHOUT ROWID] tables are modified. +** +** ^In the current implementation, the update hook +** is not invoked when conflicting rows are deleted because of an +** [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. +** +** The update hook implementation must not do anything that will modify +** the database connection that invoked the update hook. Any actions +** to modify the database connection must be deferred until after the +** completion of the [sqlite3_step()] call that triggered the update hook. +** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their +** database connections for the meaning of "modify" in this paragraph. +** +** ^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()], [sqlite3_rollback_hook()], +** and [sqlite3_preupdate_hook()] interfaces. +*/ +SQLITE_API void *sqlite3_update_hook( + sqlite3*, + void(*)(void *,int ,char const *,char const *,sqlite3_int64), + void* +); + +/* +** CAPI3REF: Enable Or Disable Shared Pager 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.)^ +** +** ^Cache sharing is enabled and disabled for an entire process. +** This is a change as of SQLite [version 3.5.0] ([dateof: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 +** 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.)^ +** +** ^(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 +** future releases of SQLite. Applications that care about shared +** cache setting should set it explicitly. +** +** Note: This method is disabled on MacOS X 10.7 and iOS version 5.0 +** and will always return SQLITE_MISUSE. On those systems, +** shared cache mode should be enabled per-database connection via +** [sqlite3_open_v2()] with [SQLITE_OPEN_SHAREDCACHE]. +** +** This interface is threadsafe on processors where writing a +** 32-bit integer is atomic. +** +** See Also: [SQLite Shared-Cache Mode] +*/ +SQLITE_API int sqlite3_enable_shared_cache(int); + +/* +** CAPI3REF: Attempt To Free Heap Memory +** +** ^The sqlite3_release_memory() interface attempts to free N bytes +** of heap memory by deallocating non-essential memory allocations +** 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, +** which might be more or less than the amount requested. +** ^The sqlite3_release_memory() routine is a no-op returning zero +** if SQLite is not compiled with [SQLITE_ENABLE_MEMORY_MANAGEMENT]. +** +** See also: [sqlite3_db_release_memory()] +*/ +SQLITE_API int sqlite3_release_memory(int); + +/* +** CAPI3REF: Free Memory Used By A Database Connection +** METHOD: sqlite3 +** +** ^The sqlite3_db_release_memory(D) interface attempts to free as much heap +** memory as possible from database connection D. Unlike the +** [sqlite3_release_memory()] interface, this interface is in effect even +** when the [SQLITE_ENABLE_MEMORY_MANAGEMENT] compile-time option is +** omitted. +** +** See also: [sqlite3_release_memory()] +*/ +SQLITE_API int sqlite3_db_release_memory(sqlite3*); + +/* +** CAPI3REF: Impose A Limit On Heap Size +** +** ^The sqlite3_soft_heap_limit64() interface sets and/or queries the +** soft limit on the amount of heap memory that may be allocated by SQLite. +** ^SQLite strives to keep heap memory utilization below the soft heap +** limit by reducing the number of pages held in the page cache +** as heap memory usages approaches the limit. +** ^The soft heap limit is "soft" because even though SQLite strives to stay +** below the limit, it will exceed the limit rather than generate +** an [SQLITE_NOMEM] error. In other words, the soft heap limit +** is advisory only. +** +** ^The return value from sqlite3_soft_heap_limit64() is the size of +** the soft heap limit prior to the call, or negative in the case of an +** error. ^If the argument N is negative +** then no change is made to the soft heap limit. Hence, the current +** size of the soft heap limit can be determined by invoking +** sqlite3_soft_heap_limit64() with a negative argument. +** +** ^If the argument N is zero then the soft heap limit is disabled. +** +** ^(The soft heap limit is not enforced in the current implementation +** if one or more of following conditions are true: +** +**
        +**
      • The soft heap limit is set to zero. +**
      • Memory accounting is disabled using a combination of the +** [sqlite3_config]([SQLITE_CONFIG_MEMSTATUS],...) start-time option and +** the [SQLITE_DEFAULT_MEMSTATUS] compile-time option. +**
      • An alternative page cache implementation is specified using +** [sqlite3_config]([SQLITE_CONFIG_PCACHE2],...). +**
      • The page cache allocates from its own memory pool supplied +** by [sqlite3_config]([SQLITE_CONFIG_PAGECACHE],...) rather than +** from the heap. +**
      )^ +** +** Beginning with SQLite [version 3.7.3] ([dateof:3.7.3]), +** the soft heap limit is enforced +** regardless of whether or not the [SQLITE_ENABLE_MEMORY_MANAGEMENT] +** compile-time option is invoked. With [SQLITE_ENABLE_MEMORY_MANAGEMENT], +** the soft heap limit is enforced on every memory allocation. Without +** [SQLITE_ENABLE_MEMORY_MANAGEMENT], the soft heap limit is only enforced +** when memory is allocated by the page cache. Testing suggests that because +** the page cache is the predominate memory user in SQLite, most +** applications will achieve adequate soft heap limit enforcement without +** the use of [SQLITE_ENABLE_MEMORY_MANAGEMENT]. +** +** The circumstances under which SQLite will enforce the soft heap limit may +** changes in future releases of SQLite. +*/ +SQLITE_API sqlite3_int64 sqlite3_soft_heap_limit64(sqlite3_int64 N); + +/* +** CAPI3REF: Deprecated Soft Heap Limit Interface +** DEPRECATED +** +** This is a deprecated version of the [sqlite3_soft_heap_limit64()] +** interface. This routine is provided for historical compatibility +** only. All new applications should use the +** [sqlite3_soft_heap_limit64()] interface rather than this one. +*/ +SQLITE_API SQLITE_DEPRECATED void sqlite3_soft_heap_limit(int N); + + +/* +** CAPI3REF: Extract Metadata About A Column Of A Table +** METHOD: sqlite3 +** +** ^(The sqlite3_table_column_metadata(X,D,T,C,....) routine returns +** information about column C of table T in database D +** on [database connection] X.)^ ^The sqlite3_table_column_metadata() +** interface returns SQLITE_OK and fills in the non-NULL pointers in +** the final five arguments with appropriate values if the specified +** column exists. ^The sqlite3_table_column_metadata() interface returns +** SQLITE_ERROR and if the specified column does not exist. +** ^If the column-name parameter to sqlite3_table_column_metadata() is a +** NULL pointer, then this routine simply checks for the existence of the +** table and returns SQLITE_OK if the table exists and SQLITE_ERROR if it +** does not. If the table name parameter T in a call to +** sqlite3_table_column_metadata(X,D,T,C,...) is NULL then the result is +** undefined behavior. +** +** ^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 +** name of the desired column, respectively. +** +** ^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 +** +**
      5th const char* Data type +**
      6th const char* Name of default collation sequence +**
      7th int True if column has a NOT NULL constraint +**
      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 +** declaration type and collation sequence is valid 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 column is "rowid", "oid" or "_rowid_" and the table +** is not a [WITHOUT ROWID] table 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 +** [INTEGER PRIMARY KEY] column, then the outputs +** for the [rowid] are set as follows: +** +**
      +**     data type: "INTEGER"
      +**     collation sequence: "BINARY"
      +**     not null: 0
      +**     primary key: 1
      +**     auto increment: 0
      +** 
      )^ +** +** ^This function causes all database schemas to be read from disk and +** parsed, if that has not already been done, and returns an error if +** any errors are encountered while loading the schema. +*/ +SQLITE_API int sqlite3_table_column_metadata( + sqlite3 *db, /* Connection handle */ + const char *zDbName, /* Database name or NULL */ + const char *zTableName, /* Table name */ + const char *zColumnName, /* Column name */ + char const **pzDataType, /* OUTPUT: Declared data type */ + char const **pzCollSeq, /* OUTPUT: Collation sequence name */ + int *pNotNull, /* OUTPUT: True if NOT NULL constraint exists */ + int *pPrimaryKey, /* OUTPUT: True if column part of PK */ + int *pAutoinc /* OUTPUT: True if column is auto-increment */ +); + +/* +** CAPI3REF: Load An Extension +** METHOD: sqlite3 +** +** ^This interface loads an SQLite extension library from the named file. +** +** ^The sqlite3_load_extension() interface attempts to load an +** [SQLite extension] library contained in the file zFile. If +** the file cannot be loaded directly, attempts are made to load +** with various operating-system specific extensions added. +** So for example, if "samplelib" cannot be loaded, then names like +** "samplelib.so" or "samplelib.dylib" or "samplelib.dll" might +** be tried also. +** +** ^The entry point is zProc. +** ^(zProc may be 0, in which case SQLite will try to come up with an +** entry point name on its own. It first tries "sqlite3_extension_init". +** If that does not work, it constructs a name "sqlite3_X_init" where the +** X is consists of the lower-case equivalent of all ASCII alphabetic +** characters in the filename from the last "/" to the first following +** "." and omitting any initial "lib".)^ +** ^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()]. +** +** ^Extension loading must be enabled using +** [sqlite3_enable_load_extension()] or +** [sqlite3_db_config](db,[SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION],1,NULL) +** prior to calling this API, +** otherwise an error will be returned. +** +** Security warning: It is recommended that the +** [SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION] method be used to enable only this +** interface. The use of the [sqlite3_enable_load_extension()] interface +** should be avoided. This will keep the SQL function [load_extension()] +** disabled and prevent SQL injections from giving attackers +** access to extension loading capabilities. +** +** See also the [load_extension() SQL function]. +*/ +SQLITE_API int sqlite3_load_extension( + sqlite3 *db, /* Load the extension into this database connection */ + const char *zFile, /* Name of the shared library containing extension */ + const char *zProc, /* Entry point. Derived from zFile if 0 */ + char **pzErrMsg /* Put error message here if not 0 */ +); + +/* +** CAPI3REF: Enable Or Disable Extension Loading +** METHOD: sqlite3 +** +** ^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. +** ^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. +** +** ^This interface enables or disables both the C-API +** [sqlite3_load_extension()] and the SQL function [load_extension()]. +** ^(Use [sqlite3_db_config](db,[SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION],..) +** to enable or disable only the C-API.)^ +** +** Security warning: It is recommended that extension loading +** be disabled using the [SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION] method +** rather than this interface, so the [load_extension()] SQL function +** remains disabled. This will prevent SQL injections from giving attackers +** access to extension loading capabilities. +*/ +SQLITE_API int sqlite3_enable_load_extension(sqlite3 *db, int onoff); + +/* +** CAPI3REF: Automatically Load Statically Linked Extensions +** +** ^This interface causes the xEntryPoint() function to be invoked for +** each new [database connection] that is created. The idea here is that +** xEntryPoint() is the entry point for a statically linked [SQLite extension] +** that is to be automatically loaded into all new database connections. +** +** ^(Even though the function prototype shows that xEntryPoint() takes +** no arguments and returns void, SQLite invokes xEntryPoint() with three +** arguments and expects an integer result as if the signature of the +** entry point where as follows: +** +**
      +**    int xEntryPoint(
      +**      sqlite3 *db,
      +**      const char **pzErrMsg,
      +**      const struct sqlite3_api_routines *pThunk
      +**    );
      +** 
      )^ +** +** If the xEntryPoint routine encounters an error, it should make *pzErrMsg +** point to an appropriate error message (obtained from [sqlite3_mprintf()]) +** and return an appropriate [error code]. ^SQLite ensures that *pzErrMsg +** is NULL before calling the xEntryPoint(). ^SQLite will invoke +** [sqlite3_free()] on *pzErrMsg after xEntryPoint() returns. ^If any +** xEntryPoint() returns an error, the [sqlite3_open()], [sqlite3_open16()], +** or [sqlite3_open_v2()] call that provoked the xEntryPoint() will fail. +** +** ^Calling sqlite3_auto_extension(X) with an entry point X that is already +** on the list of automatic extensions is a harmless no-op. ^No entry point +** will be called more than once for each database connection that is opened. +** +** See also: [sqlite3_reset_auto_extension()] +** and [sqlite3_cancel_auto_extension()] +*/ +SQLITE_API int sqlite3_auto_extension(void(*xEntryPoint)(void)); + +/* +** CAPI3REF: Cancel Automatic Extension Loading +** +** ^The [sqlite3_cancel_auto_extension(X)] interface unregisters the +** initialization routine X that was registered using a prior call to +** [sqlite3_auto_extension(X)]. ^The [sqlite3_cancel_auto_extension(X)] +** routine returns 1 if initialization routine X was successfully +** unregistered and it returns 0 if X was not on the list of initialization +** routines. +*/ +SQLITE_API int sqlite3_cancel_auto_extension(void(*xEntryPoint)(void)); + +/* +** CAPI3REF: Reset Automatic Extension Loading +** +** ^This interface disables all automatic extensions previously +** registered using [sqlite3_auto_extension()]. +*/ +SQLITE_API void sqlite3_reset_auto_extension(void); + +/* +** The interface to the virtual-table mechanism is currently considered +** to be experimental. The interface might change in incompatible ways. +** If this is a problem for you, do not use the interface at this time. +** +** When the virtual-table mechanism stabilizes, we will declare the +** interface fixed, support it indefinitely, and remove this comment. +*/ + +/* +** Structures used by the virtual table interface +*/ +typedef struct sqlite3_vtab sqlite3_vtab; +typedef struct sqlite3_index_info sqlite3_index_info; +typedef struct sqlite3_vtab_cursor sqlite3_vtab_cursor; +typedef struct sqlite3_module sqlite3_module; + +/* +** CAPI3REF: Virtual Table Object +** KEYWORDS: sqlite3_module {virtual table module} +** +** This structure, sometimes called a "virtual table 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 +** 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 +** module or until the [database connection] closes. The content +** of this structure must not change while it is registered with +** any database connection. +*/ +struct sqlite3_module { + int iVersion; + int (*xCreate)(sqlite3*, void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVTab, char**); + int (*xConnect)(sqlite3*, void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVTab, char**); + int (*xBestIndex)(sqlite3_vtab *pVTab, sqlite3_index_info*); + int (*xDisconnect)(sqlite3_vtab *pVTab); + int (*xDestroy)(sqlite3_vtab *pVTab); + int (*xOpen)(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor); + int (*xClose)(sqlite3_vtab_cursor*); + int (*xFilter)(sqlite3_vtab_cursor*, int idxNum, const char *idxStr, + int argc, sqlite3_value **argv); + int (*xNext)(sqlite3_vtab_cursor*); + int (*xEof)(sqlite3_vtab_cursor*); + int (*xColumn)(sqlite3_vtab_cursor*, sqlite3_context*, int); + int (*xRowid)(sqlite3_vtab_cursor*, sqlite3_int64 *pRowid); + int (*xUpdate)(sqlite3_vtab *, int, sqlite3_value **, sqlite3_int64 *); + int (*xBegin)(sqlite3_vtab *pVTab); + int (*xSync)(sqlite3_vtab *pVTab); + int (*xCommit)(sqlite3_vtab *pVTab); + int (*xRollback)(sqlite3_vtab *pVTab); + int (*xFindFunction)(sqlite3_vtab *pVtab, int nArg, const char *zName, + void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), + void **ppArg); + int (*xRename)(sqlite3_vtab *pVtab, const char *zNew); + /* The methods above are in version 1 of the sqlite_module object. Those + ** below are for version 2 and greater. */ + int (*xSavepoint)(sqlite3_vtab *pVTab, int); + int (*xRelease)(sqlite3_vtab *pVTab, int); + int (*xRollbackTo)(sqlite3_vtab *pVTab, int); +}; + +/* +** CAPI3REF: Virtual Table Indexing Information +** KEYWORDS: sqlite3_index_info +** +** The sqlite3_index_info structure and its substructures is used as part +** of the [virtual table] interface to +** pass information into and receive the reply from the [xBestIndex] +** method of a [virtual table module]. The fields under **Inputs** are the +** 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: +** +**
      column OP expr
      +** +** where OP is =, <, <=, >, or >=.)^ ^(The particular operator is +** stored in aConstraint[].op using one of the +** [SQLITE_INDEX_CONSTRAINT_EQ | SQLITE_INDEX_CONSTRAINT_ values].)^ +** ^(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.)^ +** +** ^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 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. +** +** The colUsed field indicates which columns of the virtual table may be +** required by the current scan. Virtual table columns are numbered from +** zero in the order in which they appear within the CREATE TABLE statement +** passed to sqlite3_declare_vtab(). For the first 63 columns (columns 0-62), +** the corresponding bit is set within the colUsed mask if the column may be +** required by SQLite. If the table has at least 64 columns and any column +** to the right of the first 63 is required, then bit 63 of colUsed is also +** set. In other words, column iCol may be required if the expression +** (colUsed & ((sqlite3_uint64)1 << (iCol>=63 ? 63 : iCol))) evaluates to +** non-zero. +** +** The [xBestIndex] method must fill aConstraintUsage[] with information +** 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 +** is true, then the constraint is assumed to be fully handled by the +** virtual table and is not checked again by SQLite.)^ +** +** ^The idxNum and idxPtr values are recorded and passed into the +** [xFilter] method. +** ^[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 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 a particular +** strategy. A cost of N indicates that the cost of the strategy is similar +** to a linear scan of an SQLite table with N rows. A cost of log(N) +** indicates that the expense of the operation is similar to that of a +** binary search on a unique indexed field of an SQLite table with N rows. +** +** ^The estimatedRows value is an estimate of the number of rows that +** will be returned by the strategy. +** +** The xBestIndex method may optionally populate the idxFlags field with a +** mask of SQLITE_INDEX_SCAN_* flags. Currently there is only one such flag - +** SQLITE_INDEX_SCAN_UNIQUE. If the xBestIndex method sets this flag, SQLite +** assumes that the strategy may visit at most one row. +** +** Additionally, if xBestIndex sets the SQLITE_INDEX_SCAN_UNIQUE flag, then +** SQLite also assumes that if a call to the xUpdate() method is made as +** part of the same statement to delete or update a virtual table row and the +** implementation returns SQLITE_CONSTRAINT, then there is no need to rollback +** any database changes. In other words, if the xUpdate() returns +** SQLITE_CONSTRAINT, the database contents must be exactly as they were +** before xUpdate was called. By contrast, if SQLITE_INDEX_SCAN_UNIQUE is not +** set and xUpdate returns SQLITE_CONSTRAINT, any database changes made by +** the xUpdate method are automatically rolled back by SQLite. +** +** IMPORTANT: The estimatedRows field was added to the sqlite3_index_info +** structure for SQLite [version 3.8.2] ([dateof:3.8.2]). +** If a virtual table extension is +** used with an SQLite version earlier than 3.8.2, the results of attempting +** to read or write the estimatedRows field are undefined (but are likely +** to included crashing the application). The estimatedRows field should +** therefore only be used if [sqlite3_libversion_number()] returns a +** value greater than or equal to 3008002. Similarly, the idxFlags field +** was added for [version 3.9.0] ([dateof:3.9.0]). +** It may therefore only be used if +** sqlite3_libversion_number() returns a value greater than or equal to +** 3009000. +*/ +struct sqlite3_index_info { + /* Inputs */ + int nConstraint; /* Number of entries in aConstraint */ + struct sqlite3_index_constraint { + int iColumn; /* Column constrained. -1 for ROWID */ + unsigned char op; /* Constraint operator */ + unsigned char usable; /* True if this constraint is usable */ + int iTermOffset; /* Used internally - xBestIndex should ignore */ + } *aConstraint; /* Table of WHERE clause constraints */ + int nOrderBy; /* Number of terms in the ORDER BY clause */ + struct sqlite3_index_orderby { + int iColumn; /* Column number */ + unsigned char desc; /* True for DESC. False for ASC. */ + } *aOrderBy; /* The ORDER BY clause */ + /* Outputs */ + struct sqlite3_index_constraint_usage { + int argvIndex; /* if >0, constraint is part of argv to xFilter */ + unsigned char omit; /* Do not code a test for this constraint */ + } *aConstraintUsage; + int idxNum; /* Number used to identify the index */ + char *idxStr; /* String, possibly obtained from sqlite3_malloc */ + int needToFreeIdxStr; /* Free idxStr using sqlite3_free() if true */ + int orderByConsumed; /* True if output is already ordered */ + double estimatedCost; /* Estimated cost of using this index */ + /* Fields below are only available in SQLite 3.8.2 and later */ + sqlite3_int64 estimatedRows; /* Estimated number of rows returned */ + /* Fields below are only available in SQLite 3.9.0 and later */ + int idxFlags; /* Mask of SQLITE_INDEX_SCAN_* flags */ + /* Fields below are only available in SQLite 3.10.0 and later */ + sqlite3_uint64 colUsed; /* Input: Mask of columns used by statement */ +}; + +/* +** CAPI3REF: Virtual Table Scan Flags +*/ +#define SQLITE_INDEX_SCAN_UNIQUE 1 /* Scan visits at most 1 row */ + +/* +** CAPI3REF: Virtual Table Constraint Operator Codes +** +** These macros defined the allowed values for the +** [sqlite3_index_info].aConstraint[].op field. Each value represents +** an operator that is part of a constraint term in the wHERE clause of +** a query that uses a [virtual table]. +*/ +#define SQLITE_INDEX_CONSTRAINT_EQ 2 +#define SQLITE_INDEX_CONSTRAINT_GT 4 +#define SQLITE_INDEX_CONSTRAINT_LE 8 +#define SQLITE_INDEX_CONSTRAINT_LT 16 +#define SQLITE_INDEX_CONSTRAINT_GE 32 +#define SQLITE_INDEX_CONSTRAINT_MATCH 64 +#define SQLITE_INDEX_CONSTRAINT_LIKE 65 +#define SQLITE_INDEX_CONSTRAINT_GLOB 66 +#define SQLITE_INDEX_CONSTRAINT_REGEXP 67 +#define SQLITE_INDEX_CONSTRAINT_NE 68 +#define SQLITE_INDEX_CONSTRAINT_ISNOT 69 +#define SQLITE_INDEX_CONSTRAINT_ISNOTNULL 70 +#define SQLITE_INDEX_CONSTRAINT_ISNULL 71 +#define SQLITE_INDEX_CONSTRAINT_IS 72 + +/* +** CAPI3REF: Register A Virtual Table Implementation +** METHOD: sqlite3 +** +** ^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 +** 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. +** +** ^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 destructor will also +** be invoked if the call to sqlite3_create_module_v2() fails. +** ^The sqlite3_create_module() +** interface is equivalent to sqlite3_create_module_v2() with a NULL +** destructor. +*/ +SQLITE_API int sqlite3_create_module( + sqlite3 *db, /* SQLite connection to register module with */ + const char *zName, /* Name of the module */ + const sqlite3_module *p, /* Methods for the module */ + void *pClientData /* Client data for xCreate/xConnect */ +); +SQLITE_API int sqlite3_create_module_v2( + sqlite3 *db, /* SQLite connection to register module with */ + const char *zName, /* Name of the module */ + const sqlite3_module *p, /* Methods for the module */ + void *pClientData, /* Client data for xCreate/xConnect */ + void(*xDestroy)(void*) /* Module destructor function */ +); + +/* +** CAPI3REF: Virtual Table Instance Object +** KEYWORDS: sqlite3_vtab +** +** Every [virtual table module] implementation uses a subclass +** 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 +** 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 +** is delivered up to the client application, the string will be automatically +** freed by sqlite3_free() and the zErrMsg field will be zeroed. +*/ +struct sqlite3_vtab { + const sqlite3_module *pModule; /* The module for this virtual table */ + int nRef; /* Number of open cursors */ + char *zErrMsg; /* Error message from sqlite3_mprintf() */ + /* Virtual table implementations will typically add additional fields */ +}; + +/* +** CAPI3REF: Virtual Table Cursor Object +** KEYWORDS: sqlite3_vtab_cursor {virtual table cursor} +** +** Every [virtual table module] implementation uses a subclass of the +** following structure to describe cursors that point into the +** [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. 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. +** +** This superclass exists in order to define fields of the cursor that +** are common to all implementations. +*/ +struct sqlite3_vtab_cursor { + sqlite3_vtab *pVtab; /* Virtual table of this cursor */ + /* Virtual table implementations will typically add additional fields */ +}; + +/* +** CAPI3REF: Declare The Schema Of A Virtual Table +** +** ^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. +*/ +SQLITE_API int sqlite3_declare_vtab(sqlite3*, const char *zSQL); + +/* +** CAPI3REF: Overload A Function For A Virtual Table +** METHOD: sqlite3 +** +** ^(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.)^ +** +** ^(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 +** 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 +** by a [virtual table]. +*/ +SQLITE_API int sqlite3_overload_function(sqlite3*, const char *zFuncName, int nArg); + +/* +** The interface to the virtual-table mechanism defined above (back up +** to a comment remarkably similar to this one) is currently considered +** to be experimental. The interface might change in incompatible ways. +** If this is a problem for you, do not use the interface at this time. +** +** When the virtual-table mechanism stabilizes, we will declare the +** interface fixed, support it indefinitely, and remove this comment. +*/ + +/* +** 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()] +** and destroyed by [sqlite3_blob_close()]. +** ^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. +*/ +typedef struct sqlite3_blob sqlite3_blob; + +/* +** CAPI3REF: Open A BLOB For Incremental I/O +** METHOD: sqlite3 +** CONSTRUCTOR: sqlite3_blob +** +** ^(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;
      +** 
      )^ +** +** ^(Parameter zDb is not the filename that contains the database, but +** rather the symbolic name of the database. For attached databases, this is +** the name that appears after the AS keyword in the [ATTACH] statement. +** For the main database file, the database name is "main". For TEMP +** tables, the database name is "temp".)^ +** +** ^If the flags parameter is non-zero, then the BLOB is opened for read +** and write access. ^If the flags parameter is zero, the BLOB is opened for +** read-only access. +** +** ^(On success, [SQLITE_OK] is returned and the new [BLOB handle] is stored +** in *ppBlob. Otherwise an [error code] is returned and, unless the error +** code is SQLITE_MISUSE, *ppBlob is set to NULL.)^ ^This means that, provided +** the API is not misused, it is always safe to call [sqlite3_blob_close()] +** on *ppBlob after this function it returns. +** +** This function fails with SQLITE_ERROR if any of the following are true: +**
        +**
      • ^(Database zDb does not exist)^, +**
      • ^(Table zTable does not exist within database zDb)^, +**
      • ^(Table zTable is a WITHOUT ROWID table)^, +**
      • ^(Column zColumn does not exist)^, +**
      • ^(Row iRow is not present in the table)^, +**
      • ^(The specified column of row iRow contains a value that is not +** a TEXT or BLOB value)^, +**
      • ^(Column zColumn is part of an index, PRIMARY KEY or UNIQUE +** constraint and the blob is being opened for read/write access)^, +**
      • ^([foreign key constraints | Foreign key constraints] are enabled, +** column zColumn is part of a [child key] definition and the blob is +** being opened for read/write access)^. +**
      +** +** ^Unless it returns SQLITE_MISUSE, this function sets the +** [database connection] error code and message accessible via +** [sqlite3_errcode()] and [sqlite3_errmsg()] and related functions. +** +** A BLOB referenced by sqlite3_blob_open() may be read using the +** [sqlite3_blob_read()] interface and modified by using +** [sqlite3_blob_write()]. The [BLOB handle] can be moved to a +** different row of the same table using the [sqlite3_blob_reopen()] +** interface. However, the column, table, or database of a [BLOB handle] +** cannot be changed after the [BLOB handle] is opened. +** +** ^(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 +** an expired BLOB handle fail with a return code of [SQLITE_ABORT]. +** ^(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 +** interface. Use the [UPDATE] SQL command to change the size of a +** blob. +** +** ^The [sqlite3_bind_zeroblob()] and [sqlite3_result_zeroblob()] interfaces +** and the built-in [zeroblob] SQL function may be used to create a +** zero-filled blob to read or write using the incremental-blob interface. +** +** To avoid a resource leak, every open [BLOB handle] should eventually +** be released by a call to [sqlite3_blob_close()]. +** +** See also: [sqlite3_blob_close()], +** [sqlite3_blob_reopen()], [sqlite3_blob_read()], +** [sqlite3_blob_bytes()], [sqlite3_blob_write()]. +*/ +SQLITE_API int sqlite3_blob_open( + sqlite3*, + const char *zDb, + const char *zTable, + const char *zColumn, + sqlite3_int64 iRow, + int flags, + sqlite3_blob **ppBlob +); + +/* +** CAPI3REF: Move a BLOB Handle to a New Row +** METHOD: sqlite3_blob +** +** ^This function is used to move an existing [BLOB handle] so that it points +** to a different row of the same database table. ^The new row is identified +** by the rowid value passed as the second argument. Only the row can be +** changed. ^The database, table and column on which the blob handle is open +** remain the same. Moving an existing [BLOB handle] to a new row is +** faster than closing the existing handle and opening a new one. +** +** ^(The new row must meet the same criteria as for [sqlite3_blob_open()] - +** it must exist and there must be either a blob or text value stored in +** the nominated column.)^ ^If the new row is not present in the table, or if +** it does not contain a blob or text value, or if another error occurs, an +** SQLite error code is returned and the blob handle is considered aborted. +** ^All subsequent calls to [sqlite3_blob_read()], [sqlite3_blob_write()] or +** [sqlite3_blob_reopen()] on an aborted blob handle immediately return +** SQLITE_ABORT. ^Calling [sqlite3_blob_bytes()] on an aborted blob handle +** always returns zero. +** +** ^This function sets the database handle error code and message. +*/ +SQLITE_API int sqlite3_blob_reopen(sqlite3_blob *, sqlite3_int64); + +/* +** CAPI3REF: Close A BLOB Handle +** DESTRUCTOR: sqlite3_blob +** +** ^This function closes an open [BLOB handle]. ^(The BLOB handle is closed +** unconditionally. Even if this routine returns an error code, the +** handle is still closed.)^ +** +** ^If the blob handle being closed was opened for read-write access, and if +** the database is in auto-commit mode and there are no other open read-write +** blob handles or active write statements, the current transaction is +** committed. ^If an error occurs while committing the transaction, an error +** code is returned and the transaction rolled back. +** +** Calling this function with an argument that is not a NULL pointer or an +** open blob handle results in undefined behaviour. ^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. ^Otherwise, if this function +** is passed a valid open blob handle, the values returned by the +** sqlite3_errcode() and sqlite3_errmsg() functions are set before returning. +*/ +SQLITE_API int sqlite3_blob_close(sqlite3_blob *); + +/* +** CAPI3REF: Return The Size Of An Open BLOB +** METHOD: sqlite3_blob +** +** ^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. +** +** 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 +** been closed by [sqlite3_blob_close()]. Passing any other pointer in +** to this routine results in undefined and probably undesirable behavior. +*/ +SQLITE_API int sqlite3_blob_bytes(sqlite3_blob *); + +/* +** CAPI3REF: Read Data From A BLOB Incrementally +** METHOD: sqlite3_blob +** +** ^(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.)^ +** +** ^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) +** can be determined using the [sqlite3_blob_bytes()] interface. +** +** ^An attempt to read from an expired [BLOB handle] fails with an +** error code of [SQLITE_ABORT]. +** +** ^(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 +** been closed by [sqlite3_blob_close()]. Passing any other pointer in +** to this routine results in undefined and probably undesirable behavior. +** +** See also: [sqlite3_blob_write()]. +*/ +SQLITE_API int sqlite3_blob_read(sqlite3_blob *, void *Z, int N, int iOffset); + +/* +** CAPI3REF: Write Data Into A BLOB Incrementally +** METHOD: sqlite3_blob +** +** ^(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.)^ +** +** ^(On success, sqlite3_blob_write() returns SQLITE_OK. +** Otherwise, an [error code] or an [extended error code] is returned.)^ +** ^Unless SQLITE_MISUSE is returned, this function sets the +** [database connection] error code and message accessible via +** [sqlite3_errcode()] and [sqlite3_errmsg()] and related functions. +** +** ^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 +** 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. The size of the +** BLOB (and hence the maximum value of N+iOffset) can be determined +** using the [sqlite3_blob_bytes()] interface. ^If N or iOffset are less +** than zero [SQLITE_ERROR] is returned and no data is written. +** +** ^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. +** +** 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 +** been closed by [sqlite3_blob_close()]. Passing any other pointer in +** to this routine results in undefined and probably undesirable behavior. +** +** See also: [sqlite3_blob_read()]. +*/ +SQLITE_API int sqlite3_blob_write(sqlite3_blob *, const void *z, int n, int iOffset); + +/* +** CAPI3REF: Virtual File System Objects +** +** A virtual filesystem (VFS) is an [sqlite3_vfs] object +** that SQLite uses to interact +** with the underlying operating system. Most SQLite builds come with a +** single default VFS that is appropriate for the host computer. +** 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. +** +** ^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.)^ +*/ +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 +** +** The SQLite core uses these routines for thread +** synchronization. Though they are intended for internal +** use by SQLite, code that links against SQLite is +** permitted to use any of these routines. +** +** The SQLite source code contains multiple implementations +** of these mutex routines. An appropriate implementation +** is selected automatically at compile-time. The following +** implementations are available in the SQLite core: +** +**
        +**
      • SQLITE_MUTEX_PTHREADS +**
      • SQLITE_MUTEX_W32 +**
      • SQLITE_MUTEX_NOOP +**
      +** +** 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_PTHREADS and +** SQLITE_MUTEX_W32 implementations are appropriate for use on Unix +** and Windows. +** +** 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(). +** +** ^The sqlite3_mutex_alloc() routine allocates a new +** mutex and returns a pointer to it. ^The sqlite3_mutex_alloc() +** routine returns NULL if it is unable to allocate the requested +** mutex. The argument to sqlite3_mutex_alloc() must one of these +** integer constants: +** +**
        +**
      • SQLITE_MUTEX_FAST +**
      • SQLITE_MUTEX_RECURSIVE +**
      • SQLITE_MUTEX_STATIC_MASTER +**
      • SQLITE_MUTEX_STATIC_MEM +**
      • SQLITE_MUTEX_STATIC_OPEN +**
      • SQLITE_MUTEX_STATIC_PRNG +**
      • SQLITE_MUTEX_STATIC_LRU +**
      • SQLITE_MUTEX_STATIC_PMEM +**
      • SQLITE_MUTEX_STATIC_APP1 +**
      • SQLITE_MUTEX_STATIC_APP2 +**
      • SQLITE_MUTEX_STATIC_APP3 +**
      • SQLITE_MUTEX_STATIC_VFS1 +**
      • SQLITE_MUTEX_STATIC_VFS2 +**
      • SQLITE_MUTEX_STATIC_VFS3 +**
      +** +** ^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. 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. +** +** ^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. ^Nine 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. +** +** ^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. ^For the static +** mutex types, the same mutex is returned on every call that has +** the same type number. +** +** ^The sqlite3_mutex_free() routine deallocates a previously +** allocated dynamic mutex. Attempting to deallocate a static +** mutex results in undefined behavior. +** +** ^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 mutex other +** than an SQLITE_MUTEX_RECURSIVE more than once, the behavior is undefined. +** +** ^(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. The SQLite core only ever uses +** sqlite3_mutex_try() as an optimization so this is acceptable +** 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. +** +** ^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. +** +** See also: [sqlite3_mutex_held()] and [sqlite3_mutex_notheld()]. +*/ +SQLITE_API sqlite3_mutex *sqlite3_mutex_alloc(int); +SQLITE_API void sqlite3_mutex_free(sqlite3_mutex*); +SQLITE_API void sqlite3_mutex_enter(sqlite3_mutex*); +SQLITE_API int sqlite3_mutex_try(sqlite3_mutex*); +SQLITE_API void sqlite3_mutex_leave(sqlite3_mutex*); + +/* +** CAPI3REF: Mutex Methods Object +** +** An instance of this structure defines the low-level routines +** used to allocate and use mutexes. +** +** Usually, the default mutex implementations provided by SQLite are +** sufficient, however the application has the option of substituting a custom +** implementation for specialized deployments or systems for which SQLite +** does not provide a suitable implementation. In this case, the application +** creates and populates an instance of this structure to pass +** to sqlite3_config() along with the [SQLITE_CONFIG_MUTEX] option. +** Additionally, an instance of this structure can be used as an +** 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 +** part of system initialization by the sqlite3_initialize() function. +** ^The xMutexInit routine is called by SQLite exactly once for each +** effective call to [sqlite3_initialize()]. +** +** ^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. ^The xMutexEnd() +** interface is invoked exactly once for each call to [sqlite3_shutdown()]. +** +** ^(The remaining seven methods defined by this structure (xMutexAlloc, +** xMutexFree, xMutexEnter, xMutexTry, xMutexLeave, xMutexHeld and +** xMutexNotheld) implement the following interfaces (respectively): +** +**
        +**
      • [sqlite3_mutex_alloc()]
      • +**
      • [sqlite3_mutex_free()]
      • +**
      • [sqlite3_mutex_enter()]
      • +**
      • [sqlite3_mutex_try()]
      • +**
      • [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 +** of a valid mutex handle. The implementations of the methods defined +** by this structure are not required to handle this case, the results +** of passing a NULL pointer instead of a valid mutex handle are undefined +** (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 +** invoke xMutexInit() multiple 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 +** memory allocation for a fast or recursive mutex. +** +** ^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. +*/ +typedef struct sqlite3_mutex_methods sqlite3_mutex_methods; +struct sqlite3_mutex_methods { + int (*xMutexInit)(void); + int (*xMutexEnd)(void); + sqlite3_mutex *(*xMutexAlloc)(int); + void (*xMutexFree)(sqlite3_mutex *); + void (*xMutexEnter)(sqlite3_mutex *); + int (*xMutexTry)(sqlite3_mutex *); + void (*xMutexLeave)(sqlite3_mutex *); + int (*xMutexHeld)(sqlite3_mutex *); + int (*xMutexNotheld)(sqlite3_mutex *); +}; + +/* +** CAPI3REF: Mutex Verification Routines +** +** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routines +** 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. The SQLite core only +** provides implementations for these routines when it is compiled +** 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. +** +** These routines should return true if the mutex in their argument +** is held or not held, respectively, by the calling thread. +** +** The implementation is not required to provide 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. +** +** 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 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. 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 +** +** The [sqlite3_mutex_alloc()] interface takes a single argument +** which is one of these integer constants. +** +** The set of static mutexes may change from one SQLite release to the +** next. Applications that override the built-in mutex logic must be +** prepared to accommodate additional static mutexes. +*/ +#define SQLITE_MUTEX_FAST 0 +#define SQLITE_MUTEX_RECURSIVE 1 +#define SQLITE_MUTEX_STATIC_MASTER 2 +#define SQLITE_MUTEX_STATIC_MEM 3 /* sqlite3_malloc() */ +#define SQLITE_MUTEX_STATIC_MEM2 4 /* NOT USED */ +#define SQLITE_MUTEX_STATIC_OPEN 4 /* sqlite3BtreeOpen() */ +#define SQLITE_MUTEX_STATIC_PRNG 5 /* sqlite3_randomness() */ +#define SQLITE_MUTEX_STATIC_LRU 6 /* lru page list */ +#define SQLITE_MUTEX_STATIC_LRU2 7 /* NOT USED */ +#define SQLITE_MUTEX_STATIC_PMEM 7 /* sqlite3PageMalloc() */ +#define SQLITE_MUTEX_STATIC_APP1 8 /* For use by application */ +#define SQLITE_MUTEX_STATIC_APP2 9 /* For use by application */ +#define SQLITE_MUTEX_STATIC_APP3 10 /* For use by application */ +#define SQLITE_MUTEX_STATIC_VFS1 11 /* For use by built-in VFS */ +#define SQLITE_MUTEX_STATIC_VFS2 12 /* For use by extension VFS */ +#define SQLITE_MUTEX_STATIC_VFS3 13 /* For use by application VFS */ + +/* +** CAPI3REF: Retrieve the mutex for a database connection +** METHOD: sqlite3 +** +** ^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 +** routine returns a NULL pointer. +*/ +SQLITE_API sqlite3_mutex *sqlite3_db_mutex(sqlite3*); + +/* +** CAPI3REF: Low-Level Control Of Database Files +** METHOD: sqlite3 +** +** ^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. ^The +** name of the database is "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. ^The return value of the xFileControl +** method becomes the return value of this routine. +** +** ^The [SQLITE_FCNTL_FILE_POINTER] value for the op parameter causes +** a pointer to the underlying [sqlite3_file] object to be written into +** the space pointed to by the 4th parameter. ^The [SQLITE_FCNTL_FILE_POINTER] +** case is a short-circuit path which does not actually invoke the +** underlying sqlite3_io_methods.xFileControl method. +** +** ^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()]. 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. +** +** See also: [file control opcodes] +*/ +SQLITE_API int sqlite3_file_control(sqlite3*, const char *zDbName, int op, void*); + +/* +** CAPI3REF: Testing Interface +** +** ^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 +** the number, meaning, and operation of all subsequent parameters. +** +** This interface is not for use by applications. It exists solely +** for verifying the correct operation of the SQLite library. Depending +** on how the SQLite library is compiled, this interface might not exist. +** +** The details of the operation codes, their meanings, the parameters +** they take, and what they do are all subject to change without notice. +** Unlike most of the SQLite API, this function is not guaranteed to +** operate consistently from one release to the next. +*/ +SQLITE_API int sqlite3_test_control(int op, ...); + +/* +** CAPI3REF: Testing Interface Operation Codes +** +** These constants are the valid operation code parameters used +** as the first argument to [sqlite3_test_control()]. +** +** These parameters and their meanings are subject to change +** without notice. These values are for testing purposes only. +** 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 +#define SQLITE_TESTCTRL_BITVEC_TEST 8 +#define SQLITE_TESTCTRL_FAULT_INSTALL 9 +#define SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS 10 +#define SQLITE_TESTCTRL_PENDING_BYTE 11 +#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_SCRATCHMALLOC 17 /* NOT USED */ +#define SQLITE_TESTCTRL_LOCALTIME_FAULT 18 +#define SQLITE_TESTCTRL_EXPLAIN_STMT 19 /* NOT USED */ +#define SQLITE_TESTCTRL_ONCE_RESET_THRESHOLD 19 +#define SQLITE_TESTCTRL_NEVER_CORRUPT 20 +#define SQLITE_TESTCTRL_VDBE_COVERAGE 21 +#define SQLITE_TESTCTRL_BYTEORDER 22 +#define SQLITE_TESTCTRL_ISINIT 23 +#define SQLITE_TESTCTRL_SORTER_MMAP 24 +#define SQLITE_TESTCTRL_IMPOSTER 25 +#define SQLITE_TESTCTRL_PARSER_COVERAGE 26 +#define SQLITE_TESTCTRL_LAST 26 /* Largest TESTCTRL */ + +/* +** CAPI3REF: SQLite Runtime Status +** +** ^These interfaces are used to retrieve runtime status information +** about the performance 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 [status parameters | 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 +** 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.)^ +** +** ^The sqlite3_status() and sqlite3_status64() routines return +** SQLITE_OK on success and a non-zero [error code] on failure. +** +** If either the current value or the highwater mark is too large to +** be represented by a 32-bit integer, then the values returned by +** sqlite3_status() are undefined. +** +** See also: [sqlite3_db_status()] +*/ +SQLITE_API int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetFlag); +SQLITE_API int sqlite3_status64( + int op, + sqlite3_int64 *pCurrent, + sqlite3_int64 *pHighwater, + int resetFlag +); + + +/* +** CAPI3REF: Status Parameters +** KEYWORDS: {status parameters} +** +** 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 +** and internal memory usage by the SQLite library. 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].
      )^ +** +** [[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.
      )^ +** +** [[SQLITE_STATUS_MALLOC_COUNT]] ^(
      SQLITE_STATUS_MALLOC_COUNT
      +**
      This parameter records the number of separate memory allocations +** currently checked out.
      )^ +** +** [[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.
      )^ +** +** [[SQLITE_STATUS_PAGECACHE_OVERFLOW]] +** ^(
      SQLITE_STATUS_PAGECACHE_OVERFLOW
      +**
      This parameter returns the number of bytes of page cache +** allocation which could not be satisfied 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.
      )^ +** +** [[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.
      )^ +** +** [[SQLITE_STATUS_SCRATCH_USED]]
      SQLITE_STATUS_SCRATCH_USED
      +**
      No longer used.
      +** +** [[SQLITE_STATUS_SCRATCH_OVERFLOW]] ^(
      SQLITE_STATUS_SCRATCH_OVERFLOW
      +**
      No longer used.
      +** +** [[SQLITE_STATUS_SCRATCH_SIZE]]
      SQLITE_STATUS_SCRATCH_SIZE
      +**
      No longer used.
      +** +** [[SQLITE_STATUS_PARSER_STACK]] ^(
      SQLITE_STATUS_PARSER_STACK
      +**
      The *pHighwater parameter records the deepest parser stack. +** The *pCurrent value is undefined. The *pHighwater value is only +** meaningful if SQLite is compiled with [YYTRACKMAXSTACKDEPTH].
      )^ +**
      +** +** New status parameters may be added from time to time. +*/ +#define SQLITE_STATUS_MEMORY_USED 0 +#define SQLITE_STATUS_PAGECACHE_USED 1 +#define SQLITE_STATUS_PAGECACHE_OVERFLOW 2 +#define SQLITE_STATUS_SCRATCH_USED 3 /* NOT USED */ +#define SQLITE_STATUS_SCRATCH_OVERFLOW 4 /* NOT USED */ +#define SQLITE_STATUS_MALLOC_SIZE 5 +#define SQLITE_STATUS_PARSER_STACK 6 +#define SQLITE_STATUS_PAGECACHE_SIZE 7 +#define SQLITE_STATUS_SCRATCH_SIZE 8 /* NOT USED */ +#define SQLITE_STATUS_MALLOC_COUNT 9 + +/* +** CAPI3REF: Database Connection Status +** METHOD: sqlite3 +** +** ^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 an integer constant, taken from the set of +** [SQLITE_DBSTATUS options], that +** determines the parameter to interrogate. The set of +** [SQLITE_DBSTATUS options] is likely +** to grow 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 resetFlg is true, then the highest instantaneous value is +** reset back down to the current value. +** +** ^The sqlite3_db_status() routine returns SQLITE_OK on success and a +** non-zero [error code] on failure. +** +** See also: [sqlite3_status()] and [sqlite3_stmt_status()]. +*/ +SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int resetFlg); + +/* +** CAPI3REF: Status Parameters for database connections +** KEYWORDS: {SQLITE_DBSTATUS options} +** +** These constants are the available integer "verbs" that can be passed as +** the second argument to the [sqlite3_db_status()] interface. +** +** New verbs may be added in future releases of SQLite. Existing verbs +** might be discontinued. Applications should check the return code from +** [sqlite3_db_status()] to make sure that the call worked. +** The [sqlite3_db_status()] interface will return a non-zero error code +** 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.
      )^ +** +** [[SQLITE_DBSTATUS_LOOKASIDE_HIT]] ^(
      SQLITE_DBSTATUS_LOOKASIDE_HIT
      +**
      This parameter returns the number malloc attempts that were +** satisfied using lookaside memory. Only the high-water value is meaningful; +** the current value is always zero.)^ +** +** [[SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE]] +** ^(
      SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE
      +**
      This parameter returns the number malloc attempts that might have +** been satisfied using lookaside memory but failed due to the amount of +** memory requested being larger than the lookaside slot size. +** Only the high-water value is meaningful; +** the current value is always zero.)^ +** +** [[SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL]] +** ^(
      SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL
      +**
      This parameter returns the number malloc attempts that might have +** been satisfied using lookaside memory but failed due to all lookaside +** memory already being in use. +** Only the high-water value is meaningful; +** the current value is always zero.)^ +** +** [[SQLITE_DBSTATUS_CACHE_USED]] ^(
      SQLITE_DBSTATUS_CACHE_USED
      +**
      This parameter returns the approximate number of bytes of heap +** memory used by all pager caches associated with the database connection.)^ +** ^The highwater mark associated with SQLITE_DBSTATUS_CACHE_USED is always 0. +** +** [[SQLITE_DBSTATUS_CACHE_USED_SHARED]] +** ^(
      SQLITE_DBSTATUS_CACHE_USED_SHARED
      +**
      This parameter is similar to DBSTATUS_CACHE_USED, except that if a +** pager cache is shared between two or more connections the bytes of heap +** memory used by that pager cache is divided evenly between the attached +** connections.)^ In other words, if none of the pager caches associated +** with the database connection are shared, this request returns the same +** value as DBSTATUS_CACHE_USED. Or, if one or more or the pager caches are +** shared, the value returned by this call will be smaller than that returned +** by DBSTATUS_CACHE_USED. ^The highwater mark associated with +** SQLITE_DBSTATUS_CACHE_USED_SHARED is always 0. +** +** [[SQLITE_DBSTATUS_SCHEMA_USED]] ^(
      SQLITE_DBSTATUS_SCHEMA_USED
      +**
      This parameter returns the approximate number of bytes of heap +** memory used to store the schema for all databases associated +** with the connection - main, temp, and any [ATTACH]-ed databases.)^ +** ^The full amount of memory used by the schemas is reported, even if the +** schema memory is shared with other database connections due to +** [shared cache mode] being enabled. +** ^The highwater mark associated with SQLITE_DBSTATUS_SCHEMA_USED is always 0. +** +** [[SQLITE_DBSTATUS_STMT_USED]] ^(
      SQLITE_DBSTATUS_STMT_USED
      +**
      This parameter returns the approximate number of bytes of heap +** and lookaside memory used by all prepared statements associated with +** the database connection.)^ +** ^The highwater mark associated with SQLITE_DBSTATUS_STMT_USED is always 0. +**
      +** +** [[SQLITE_DBSTATUS_CACHE_HIT]] ^(
      SQLITE_DBSTATUS_CACHE_HIT
      +**
      This parameter returns the number of pager cache hits that have +** occurred.)^ ^The highwater mark associated with SQLITE_DBSTATUS_CACHE_HIT +** is always 0. +**
      +** +** [[SQLITE_DBSTATUS_CACHE_MISS]] ^(
      SQLITE_DBSTATUS_CACHE_MISS
      +**
      This parameter returns the number of pager cache misses that have +** occurred.)^ ^The highwater mark associated with SQLITE_DBSTATUS_CACHE_MISS +** is always 0. +**
      +** +** [[SQLITE_DBSTATUS_CACHE_WRITE]] ^(
      SQLITE_DBSTATUS_CACHE_WRITE
      +**
      This parameter returns the number of dirty cache entries that have +** been written to disk. Specifically, the number of pages written to the +** wal file in wal mode databases, or the number of pages written to the +** database file in rollback mode databases. Any pages written as part of +** transaction rollback or database recovery operations are not included. +** If an IO or other error occurs while writing a page to disk, the effect +** on subsequent SQLITE_DBSTATUS_CACHE_WRITE requests is undefined.)^ ^The +** highwater mark associated with SQLITE_DBSTATUS_CACHE_WRITE is always 0. +**
      +** +** [[SQLITE_DBSTATUS_DEFERRED_FKS]] ^(
      SQLITE_DBSTATUS_DEFERRED_FKS
      +**
      This parameter returns zero for the current value if and only if +** all foreign key constraints (deferred or immediate) have been +** resolved.)^ ^The highwater mark is always 0. +**
      +**
      +*/ +#define SQLITE_DBSTATUS_LOOKASIDE_USED 0 +#define SQLITE_DBSTATUS_CACHE_USED 1 +#define SQLITE_DBSTATUS_SCHEMA_USED 2 +#define SQLITE_DBSTATUS_STMT_USED 3 +#define SQLITE_DBSTATUS_LOOKASIDE_HIT 4 +#define SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE 5 +#define SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL 6 +#define SQLITE_DBSTATUS_CACHE_HIT 7 +#define SQLITE_DBSTATUS_CACHE_MISS 8 +#define SQLITE_DBSTATUS_CACHE_WRITE 9 +#define SQLITE_DBSTATUS_DEFERRED_FKS 10 +#define SQLITE_DBSTATUS_CACHE_USED_SHARED 11 +#define SQLITE_DBSTATUS_MAX 11 /* Largest defined DBSTATUS */ + + +/* +** CAPI3REF: Prepared Statement Status +** METHOD: sqlite3_stmt +** +** ^(Each prepared statement maintains various +** [SQLITE_STMTSTATUS counters] that measure the number +** 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 +** 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 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 +** interface call returns. +** +** See also: [sqlite3_status()] and [sqlite3_db_status()]. +*/ +SQLITE_API int sqlite3_stmt_status(sqlite3_stmt*, int op,int resetFlg); + +/* +** CAPI3REF: Status Parameters for prepared statements +** KEYWORDS: {SQLITE_STMTSTATUS counter} {SQLITE_STMTSTATUS counters} +** +** These preprocessor macros define integer codes that name counter +** values associated with the [sqlite3_stmt_status()] interface. +** The meanings of the various counters are as follows: +** +**
      +** [[SQLITE_STMTSTATUS_FULLSCAN_STEP]]
      SQLITE_STMTSTATUS_FULLSCAN_STEP
      +**
      ^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]]
      SQLITE_STMTSTATUS_SORT
      +**
      ^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.
      +** +** [[SQLITE_STMTSTATUS_AUTOINDEX]]
      SQLITE_STMTSTATUS_AUTOINDEX
      +**
      ^This is the number of rows inserted into transient indices that +** were created automatically in order to help joins run faster. +** A non-zero value in this counter may indicate an opportunity to +** improvement performance by adding permanent indices that do not +** need to be reinitialized each time the statement is run.
      +** +** [[SQLITE_STMTSTATUS_VM_STEP]]
      SQLITE_STMTSTATUS_VM_STEP
      +**
      ^This is the number of virtual machine operations executed +** by the prepared statement if that number is less than or equal +** to 2147483647. The number of virtual machine operations can be +** used as a proxy for the total work done by the prepared statement. +** If the number of virtual machine operations exceeds 2147483647 +** then the value returned by this statement status code is undefined. +** +** [[SQLITE_STMTSTATUS_REPREPARE]]
      SQLITE_STMTSTATUS_REPREPARE
      +**
      ^This is the number of times that the prepare statement has been +** automatically regenerated due to schema changes or change to +** [bound parameters] that might affect the query plan. +** +** [[SQLITE_STMTSTATUS_RUN]]
      SQLITE_STMTSTATUS_RUN
      +**
      ^This is the number of times that the prepared statement has +** been run. A single "run" for the purposes of this counter is one +** or more calls to [sqlite3_step()] followed by a call to [sqlite3_reset()]. +** The counter is incremented on the first [sqlite3_step()] call of each +** cycle. +** +** [[SQLITE_STMTSTATUS_MEMUSED]]
      SQLITE_STMTSTATUS_MEMUSED
      +**
      ^This is the approximate number of bytes of heap memory +** used to store the prepared statement. ^This value is not actually +** a counter, and so the resetFlg parameter to sqlite3_stmt_status() +** is ignored when the opcode is SQLITE_STMTSTATUS_MEMUSED. +**
      +**
      +*/ +#define SQLITE_STMTSTATUS_FULLSCAN_STEP 1 +#define SQLITE_STMTSTATUS_SORT 2 +#define SQLITE_STMTSTATUS_AUTOINDEX 3 +#define SQLITE_STMTSTATUS_VM_STEP 4 +#define SQLITE_STMTSTATUS_REPREPARE 5 +#define SQLITE_STMTSTATUS_RUN 6 +#define SQLITE_STMTSTATUS_MEMUSED 99 + +/* +** CAPI3REF: Custom Page Cache Object +** +** The sqlite3_pcache type is opaque. It is implemented by +** the pluggable module. The SQLite core has no knowledge of +** its size or internal structure and never deals with the +** sqlite3_pcache object except by holding and passing pointers +** to the object. +** +** See [sqlite3_pcache_methods2] for additional information. +*/ +typedef struct sqlite3_pcache sqlite3_pcache; + +/* +** CAPI3REF: Custom Page Cache Object +** +** The sqlite3_pcache_page object represents a single page in the +** page cache. The page cache will allocate instances of this +** object. Various methods of the page cache use pointers to instances +** of this object as parameters or as their return value. +** +** See [sqlite3_pcache_methods2] for additional information. +*/ +typedef struct sqlite3_pcache_page sqlite3_pcache_page; +struct sqlite3_pcache_page { + void *pBuf; /* The content of the page */ + void *pExtra; /* Extra information associated with the page */ +}; + +/* +** CAPI3REF: Application Defined Page Cache. +** KEYWORDS: {page cache} +** +** ^(The [sqlite3_config]([SQLITE_CONFIG_PCACHE2], ...) interface can +** register an alternative page cache implementation by passing in an +** instance of the sqlite3_pcache_methods2 structure.)^ +** In many applications, most of the heap memory allocated by +** SQLite is used for the page cache. +** By implementing a +** custom page cache using this API, an application can better control +** the amount of memory consumed by SQLite, the way in which +** that memory is allocated and released, and the policies used to +** determine exactly which parts of a database file are cached and for +** how long. +** +** The alternative page cache mechanism is an +** extreme measure that is only needed by the most demanding applications. +** The built-in page cache is recommended for most uses. +** +** ^(The contents of the sqlite3_pcache_methods2 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.)^ +** +** [[the xInit() page cache method]] +** ^(The xInit() method is called once for each effective +** call to [sqlite3_initialize()])^ +** (usually only once during the lifetime of the process). ^(The xInit() +** method is passed a copy of the sqlite3_pcache_methods2.pArg value.)^ +** The intent of the xInit() method is to set up global data structures +** required by the custom page cache implementation. +** ^(If the xInit() method is NULL, then the +** built-in default page cache is used instead of the application defined +** page cache.)^ +** +** [[the xShutdown() page cache method]] +** ^The xShutdown() method is called by [sqlite3_shutdown()]. +** It can be used to clean up +** any outstanding resources before process shutdown, if required. +** ^The xShutdown() method may be NULL. +** +** ^SQLite automatically serializes calls to 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 +** call to xShutdown(). +** +** [[the xCreate() page cache methods]] +** ^SQLite invokes the xCreate() method to construct a new cache instance. +** SQLite will typically create one cache instance for each open database file, +** 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 always a power of two. ^The +** second parameter szExtra is a number of bytes of extra storage +** associated with each page cache entry. ^The szExtra parameter will +** a number less than 250. SQLite will use the +** extra szExtra bytes on each page to store metadata about the underlying +** database page on disk. The value passed into szExtra depends +** on the SQLite version, the target platform, and how SQLite was compiled. +** ^The third 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 +** 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 +** never invoke xUnpin() except to deliberately delete a page. +** ^In other words, calls to xUnpin() on a cache with bPurgeable set to +** false will always have the "discard" flag set to true. +** ^Hence, a cache created with bPurgeable false will +** never contain any unpinned pages. +** +** [[the xCachesize() page cache method]] +** ^(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 +** value; it is advisory only. +** +** [[the xPagecount() page cache methods]] +** The xPagecount() method must return the number of pages currently +** stored in the cache, both pinned and unpinned. +** +** [[the xFetch() page cache methods]] +** The xFetch() method locates a page in the cache and returns a pointer to +** an sqlite3_pcache_page object associated with that page, or a NULL pointer. +** The pBuf element of the returned sqlite3_pcache_page object will be a +** pointer to a buffer of szPage bytes used to store the content of a +** single database page. The pExtra element of sqlite3_pcache_page will be +** a pointer to the szExtra bytes of extra storage that SQLite has requested +** for each entry in the page cache. +** +** The page to be fetched is determined by the key. ^The minimum 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 +** 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 +** cache implementation should use the value of the createFlag +** parameter to help it determined what action to take: +** +** +**
      createFlag Behavior when page is not already in cache +**
      0 Do not allocate a new page. Return NULL. +**
      1 Allocate a new page if it easy and convenient to do so. +** 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. SQLite +** will only use a createFlag of 2 after a prior call with a createFlag of 1 +** failed.)^ In between the to xFetch() calls, SQLite may +** attempt to unpin one or more cache pages by spilling the content of +** pinned pages to disk and synching the operating system disk cache. +** +** [[the xUnpin() page cache method]] +** ^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 must be evicted from the cache. +** ^If the discard parameter is +** zero, then the page may be discarded or retained at the discretion of +** page cache implementation. ^The page cache implementation +** may choose to evict unpinned pages at any time. +** +** The cache must not perform any reference counting. A single +** call to xUnpin() unpins the page regardless of the number of prior calls +** to xFetch(). +** +** [[the xRekey() page cache methods]] +** The xRekey() method is used to change the key value associated with the +** page passed as the second argument. If the cache +** previously contains an entry associated with newKey, it must be +** 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 +** existing cache entries with page numbers (keys) greater than or equal +** 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() page cache method]] +** ^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_methods2 +** functions. +** +** [[the xShrink() page cache method]] +** ^SQLite invokes the xShrink() method when it wants the page cache to +** free up as much of heap memory as possible. The page cache implementation +** is not obligated to free any memory, but well-behaved implementations should +** do their best. +*/ +typedef struct sqlite3_pcache_methods2 sqlite3_pcache_methods2; +struct sqlite3_pcache_methods2 { + int iVersion; + void *pArg; + int (*xInit)(void*); + void (*xShutdown)(void*); + sqlite3_pcache *(*xCreate)(int szPage, int szExtra, int bPurgeable); + void (*xCachesize)(sqlite3_pcache*, int nCachesize); + int (*xPagecount)(sqlite3_pcache*); + sqlite3_pcache_page *(*xFetch)(sqlite3_pcache*, unsigned key, int createFlag); + void (*xUnpin)(sqlite3_pcache*, sqlite3_pcache_page*, int discard); + void (*xRekey)(sqlite3_pcache*, sqlite3_pcache_page*, + unsigned oldKey, unsigned newKey); + void (*xTruncate)(sqlite3_pcache*, unsigned iLimit); + void (*xDestroy)(sqlite3_pcache*); + void (*xShrink)(sqlite3_pcache*); +}; + +/* +** This is the obsolete pcache_methods object that has now been replaced +** by sqlite3_pcache_methods2. This object is not used by SQLite. It is +** retained in the header file for backwards compatibility only. +*/ +typedef struct sqlite3_pcache_methods sqlite3_pcache_methods; +struct sqlite3_pcache_methods { + void *pArg; + int (*xInit)(void*); + void (*xShutdown)(void*); + sqlite3_pcache *(*xCreate)(int szPage, int bPurgeable); + void (*xCachesize)(sqlite3_pcache*, int nCachesize); + int (*xPagecount)(sqlite3_pcache*); + void *(*xFetch)(sqlite3_pcache*, unsigned key, int createFlag); + void (*xUnpin)(sqlite3_pcache*, void*, int discard); + void (*xRekey)(sqlite3_pcache*, void*, unsigned oldKey, unsigned newKey); + void (*xTruncate)(sqlite3_pcache*, unsigned iLimit); + void (*xDestroy)(sqlite3_pcache*); +}; + + +/* +** CAPI3REF: Online Backup Object +** +** The sqlite3_backup object records state information about an ongoing +** 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()]. +** +** See Also: [Using the SQLite Online Backup API] +*/ +typedef struct sqlite3_backup sqlite3_backup; + +/* +** CAPI3REF: Online Backup API. +** +** 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] +** +** ^SQLite holds a write transaction open on the destination database file +** for the duration of the backup operation. +** ^The source database is read-locked only while it is 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 database connections from +** reading or writing to the source database while the backup is underway. +** +** ^(To perform a backup operation: +**
        +**
      1. sqlite3_backup_init() is called once to initialize the +** backup, +**
      2. sqlite3_backup_step() is called one or more times to transfer +** the data between the two databases, and finally +**
      3. 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()]] sqlite3_backup_init() +** +** ^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 fail with +** an error. +** +** ^A call to sqlite3_backup_init() will fail, returning NULL, if +** there is already a read or read-write transaction open on the +** destination database. +** +** ^If an error occurs within sqlite3_backup_init(D,N,S,M), then NULL is +** returned and an error code and error message are stored 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()]] sqlite3_backup_step() +** +** ^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 returns [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. +** +** ^(The sqlite3_backup_step() might return [SQLITE_READONLY] if +**
        +**
      1. the destination database was opened read-only, or +**
      2. the destination database is using write-ahead-log journaling +** and the destination and source page sizes differ, or +**
      3. the destination database is an in-memory database and the +** destination and source page sizes differ. +**
      )^ +** +** ^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 +** 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 +** [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 +** [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.)^ 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. +** +** ^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]. ^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 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 automatically +** updated at the same time. +** +** [[sqlite3_backup_finish()]] sqlite3_backup_finish() +** +** 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 +** 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()]] +** sqlite3_backup_remaining() and sqlite3_backup_pagecount() +** +** ^The sqlite3_backup_remaining() routine returns the number of pages still +** to be backed up at the conclusion of the most recent sqlite3_backup_step(). +** ^The sqlite3_backup_pagecount() routine returns the total number of pages +** in the source database at the conclusion of the most recent +** sqlite3_backup_step(). +** ^(The values returned by these functions are only updated by +** sqlite3_backup_step(). If the source database is modified in a way that +** changes the size of the source database or the number of pages remaining, +** those changes are not reflected in the output of sqlite3_backup_pagecount() +** and sqlite3_backup_remaining() until after the next +** sqlite3_backup_step().)^ +** +** Concurrent Usage of Database Handles +** +** ^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 +** connections, then the source database connection may be used concurrently +** from within other threads. +** +** 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(). 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 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(). +** +** The [sqlite3_backup] object itself is partially threadsafe. Multiple +** threads may safely make multiple concurrent calls to sqlite3_backup_step(). +** However, the sqlite3_backup_remaining() and sqlite3_backup_pagecount() +** APIs are not strictly speaking threadsafe. If they are invoked at the +** same time as another thread is invoking sqlite3_backup_step() it is +** possible that they return invalid values. +*/ +SQLITE_API sqlite3_backup *sqlite3_backup_init( + sqlite3 *pDest, /* Destination database handle */ + const char *zDestName, /* Destination database name */ + sqlite3 *pSource, /* Source database handle */ + const char *zSourceName /* Source database name */ +); +SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage); +SQLITE_API int sqlite3_backup_finish(sqlite3_backup *p); +SQLITE_API int sqlite3_backup_remaining(sqlite3_backup *p); +SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p); + +/* +** CAPI3REF: Unlock Notification +** METHOD: sqlite3 +** +** ^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 +** when the connection currently holding the required lock relinquishes it. +** ^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 +** its current transaction, either by committing it or rolling it back. +** +** ^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 +** 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 +** 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, +** 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().)^ +** +** ^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 +** 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 +** called with a NULL pointer as its second argument, then any existing +** unlock-notify callback is canceled. ^The blocked connections +** unlock-notify callback may also be canceled by closing the blocked +** connection using [sqlite3_close()]. +** +** The unlock-notify callback is not reentrant. If an application invokes +** 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 +** returns SQLITE_OK. +** +** Callback Invocation Details +** +** When an unlock-notify callback is registered, the application provides a +** single void* pointer that is passed to the callback when it is invoked. +** However, the signature of the callback function allows SQLite to pass +** it an array of void* context pointers. The first argument passed to +** an unlock-notify callback is a pointer to an array of void* pointers, +** and the second is the number of entries in the array. +** +** 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 +** 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. +** This gives the application an opportunity to prioritize any actions +** related to the set of unblocked database connections. +** +** Deadlock Detection +** +** Assuming that after registering for an unlock-notify callback a +** database waits for the callback to be issued before taking any further +** action (a reasonable assumption), then using this API may cause the +** application to deadlock. For example, if connection X is waiting for +** connection Y's transaction to be concluded, and similarly connection +** Y is waiting on connection X's transaction, then neither connection +** 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 +** 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 +** 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 +** number of levels of indirection are allowed. +** +** The "DROP TABLE" Exception +** +** When a call to [sqlite3_step()] returns SQLITE_LOCKED, it is almost +** always appropriate to call sqlite3_unlock_notify(). There is however, +** one exception. When executing a "DROP TABLE" or "DROP INDEX" statement, +** SQLite checks if there are any currently executing SELECT statements +** that belong to the same connection. If there are, SQLITE_LOCKED is +** returned. In this case there is no "blocking connection", so invoking +** sqlite3_unlock_notify() results in the unlock-notify callback being +** invoked immediately. If the application then re-attempts the "DROP TABLE" +** 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 +** 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_API int sqlite3_unlock_notify( + sqlite3 *pBlocked, /* Waiting connection */ + void (*xNotify)(void **apArg, int nArg), /* Callback function to invoke */ + void *pNotifyArg /* Argument to pass to xNotify */ +); + + +/* +** CAPI3REF: String Comparison +** +** ^The [sqlite3_stricmp()] and [sqlite3_strnicmp()] APIs allow applications +** and extensions to compare the contents of two buffers containing UTF-8 +** strings in a case-independent fashion, using the same definition of "case +** independence" that SQLite uses internally when comparing identifiers. +*/ +SQLITE_API int sqlite3_stricmp(const char *, const char *); +SQLITE_API int sqlite3_strnicmp(const char *, const char *, int); + +/* +** CAPI3REF: String Globbing +* +** ^The [sqlite3_strglob(P,X)] interface returns zero if and only if +** string X matches the [GLOB] pattern P. +** ^The definition of [GLOB] pattern matching used in +** [sqlite3_strglob(P,X)] is the same as for the "X GLOB P" operator in the +** SQL dialect understood by SQLite. ^The [sqlite3_strglob(P,X)] function +** is case sensitive. +** +** Note that this routine returns zero on a match and non-zero if the strings +** do not match, the same as [sqlite3_stricmp()] and [sqlite3_strnicmp()]. +** +** See also: [sqlite3_strlike()]. +*/ +SQLITE_API int sqlite3_strglob(const char *zGlob, const char *zStr); + +/* +** CAPI3REF: String LIKE Matching +* +** ^The [sqlite3_strlike(P,X,E)] interface returns zero if and only if +** string X matches the [LIKE] pattern P with escape character E. +** ^The definition of [LIKE] pattern matching used in +** [sqlite3_strlike(P,X,E)] is the same as for the "X LIKE P ESCAPE E" +** operator in the SQL dialect understood by SQLite. ^For "X LIKE P" without +** the ESCAPE clause, set the E parameter of [sqlite3_strlike(P,X,E)] to 0. +** ^As with the LIKE operator, the [sqlite3_strlike(P,X,E)] function is case +** insensitive - equivalent upper and lower case ASCII characters match +** one another. +** +** ^The [sqlite3_strlike(P,X,E)] function matches Unicode characters, though +** only ASCII characters are case folded. +** +** Note that this routine returns zero on a match and non-zero if the strings +** do not match, the same as [sqlite3_stricmp()] and [sqlite3_strnicmp()]. +** +** See also: [sqlite3_strglob()]. +*/ +SQLITE_API int sqlite3_strlike(const char *zGlob, const char *zStr, unsigned int cEsc); + +/* +** CAPI3REF: Error Logging Interface +** +** ^The [sqlite3_log()] interface writes a message into the [error log] +** established by the [SQLITE_CONFIG_LOG] option to [sqlite3_config()]. +** ^If logging is enabled, the zFormat string and subsequent arguments are +** used with [sqlite3_snprintf()] to generate the final output string. +** +** The sqlite3_log() interface is intended for use by extensions such as +** virtual tables, collating functions, and SQL functions. While there is +** nothing to prevent an application from calling sqlite3_log(), doing so +** is considered bad form. +** +** The zFormat string must not be NULL. +** +** To avoid deadlocks and other threading problems, the sqlite3_log() routine +** will not use dynamically allocated memory. The log message is stored in +** a fixed-length buffer on the stack. If the log message is longer than +** a few hundred characters, it will be truncated to the length of the +** buffer. +*/ +SQLITE_API void sqlite3_log(int iErrCode, const char *zFormat, ...); + +/* +** CAPI3REF: Write-Ahead Log Commit Hook +** METHOD: sqlite3 +** +** ^The [sqlite3_wal_hook()] function is used to register a callback that +** is invoked each time data is committed to a database in wal mode. +** +** ^(The callback is invoked by SQLite after the commit has taken place and +** the associated write-lock on the database released)^, so the implementation +** may read, write or [checkpoint] the database as required. +** +** ^The first parameter passed to the callback function when it is invoked +** is a copy of the third parameter passed to sqlite3_wal_hook() when +** registering the callback. ^The second is a copy of the database handle. +** ^The third parameter is the name of the database that was written to - +** either "main" or the name of an [ATTACH]-ed database. ^The fourth parameter +** is the number of pages currently in the write-ahead log file, +** including those that were just committed. +** +** The callback function should normally return [SQLITE_OK]. ^If an error +** code is returned, that error will propagate back up through the +** SQLite code base to cause the statement that provoked the callback +** to report an error, though the commit will have still occurred. If the +** callback returns [SQLITE_ROW] or [SQLITE_DONE], or if it returns a value +** that does not correspond to any valid SQLite error code, the results +** are undefined. +** +** A single database handle may have at most a single write-ahead log callback +** registered at one time. ^Calling [sqlite3_wal_hook()] replaces any +** previously registered write-ahead log callback. ^Note that the +** [sqlite3_wal_autocheckpoint()] interface and the +** [wal_autocheckpoint pragma] both invoke [sqlite3_wal_hook()] and will +** overwrite any prior [sqlite3_wal_hook()] settings. +*/ +SQLITE_API void *sqlite3_wal_hook( + sqlite3*, + int(*)(void *,sqlite3*,const char*,int), + void* +); + +/* +** CAPI3REF: Configure an auto-checkpoint +** METHOD: sqlite3 +** +** ^The [sqlite3_wal_autocheckpoint(D,N)] is a wrapper around +** [sqlite3_wal_hook()] that causes any database on [database connection] D +** to automatically [checkpoint] +** after committing a transaction if there are N or +** more frames in the [write-ahead log] file. ^Passing zero or +** a negative value as the nFrame parameter disables automatic +** checkpoints entirely. +** +** ^The callback registered by this function replaces any existing callback +** registered using [sqlite3_wal_hook()]. ^Likewise, registering a callback +** using [sqlite3_wal_hook()] disables the automatic checkpoint mechanism +** configured by this function. +** +** ^The [wal_autocheckpoint pragma] can be used to invoke this interface +** from SQL. +** +** ^Checkpoints initiated by this mechanism are +** [sqlite3_wal_checkpoint_v2|PASSIVE]. +** +** ^Every new [database connection] defaults to having the auto-checkpoint +** enabled with a threshold of 1000 or [SQLITE_DEFAULT_WAL_AUTOCHECKPOINT] +** pages. The use of this interface +** is only necessary if the default setting is found to be suboptimal +** for a particular application. +*/ +SQLITE_API int sqlite3_wal_autocheckpoint(sqlite3 *db, int N); + +/* +** CAPI3REF: Checkpoint a database +** METHOD: sqlite3 +** +** ^(The sqlite3_wal_checkpoint(D,X) is equivalent to +** [sqlite3_wal_checkpoint_v2](D,X,[SQLITE_CHECKPOINT_PASSIVE],0,0).)^ +** +** In brief, sqlite3_wal_checkpoint(D,X) causes the content in the +** [write-ahead log] for database X on [database connection] D to be +** transferred into the database file and for the write-ahead log to +** be reset. See the [checkpointing] documentation for addition +** information. +** +** This interface used to be the only way to cause a checkpoint to +** occur. But then the newer and more powerful [sqlite3_wal_checkpoint_v2()] +** interface was added. This interface is retained for backwards +** compatibility and as a convenience for applications that need to manually +** start a callback but which do not need the full power (and corresponding +** complication) of [sqlite3_wal_checkpoint_v2()]. +*/ +SQLITE_API int sqlite3_wal_checkpoint(sqlite3 *db, const char *zDb); + +/* +** CAPI3REF: Checkpoint a database +** METHOD: sqlite3 +** +** ^(The sqlite3_wal_checkpoint_v2(D,X,M,L,C) interface runs a checkpoint +** operation on database X of [database connection] D in mode M. Status +** information is written back into integers pointed to by L and C.)^ +** ^(The M parameter must be a valid [checkpoint mode]:)^ +** +**
      +**
      SQLITE_CHECKPOINT_PASSIVE
      +** ^Checkpoint as many frames as possible without waiting for any database +** readers or writers to finish, then sync the database file if all frames +** in the log were checkpointed. ^The [busy-handler callback] +** is never invoked in the SQLITE_CHECKPOINT_PASSIVE mode. +** ^On the other hand, passive mode might leave the checkpoint unfinished +** if there are concurrent readers or writers. +** +**
      SQLITE_CHECKPOINT_FULL
      +** ^This mode blocks (it invokes the +** [sqlite3_busy_handler|busy-handler callback]) until there is no +** database writer and all readers are reading from the most recent database +** snapshot. ^It then checkpoints all frames in the log file and syncs the +** database file. ^This mode blocks new database writers while it is pending, +** but new database readers are allowed to continue unimpeded. +** +**
      SQLITE_CHECKPOINT_RESTART
      +** ^This mode works the same way as SQLITE_CHECKPOINT_FULL with the addition +** that after checkpointing the log file it blocks (calls the +** [busy-handler callback]) +** until all readers are reading from the database file only. ^This ensures +** that the next writer will restart the log file from the beginning. +** ^Like SQLITE_CHECKPOINT_FULL, this mode blocks new +** database writer attempts while it is pending, but does not impede readers. +** +**
      SQLITE_CHECKPOINT_TRUNCATE
      +** ^This mode works the same way as SQLITE_CHECKPOINT_RESTART with the +** addition that it also truncates the log file to zero bytes just prior +** to a successful return. +**
      +** +** ^If pnLog is not NULL, then *pnLog is set to the total number of frames in +** the log file or to -1 if the checkpoint could not run because +** of an error or because the database is not in [WAL mode]. ^If pnCkpt is not +** NULL,then *pnCkpt is set to the total number of checkpointed frames in the +** log file (including any that were already checkpointed before the function +** was called) or to -1 if the checkpoint could not run due to an error or +** because the database is not in WAL mode. ^Note that upon successful +** completion of an SQLITE_CHECKPOINT_TRUNCATE, the log file will have been +** truncated to zero bytes and so both *pnLog and *pnCkpt will be set to zero. +** +** ^All calls obtain an exclusive "checkpoint" lock on the database file. ^If +** any other process is running a checkpoint operation at the same time, the +** lock cannot be obtained and SQLITE_BUSY is returned. ^Even if there is a +** busy-handler configured, it will not be invoked in this case. +** +** ^The SQLITE_CHECKPOINT_FULL, RESTART and TRUNCATE modes also obtain the +** exclusive "writer" lock on the database file. ^If the writer lock cannot be +** obtained immediately, and a busy-handler is configured, it is invoked and +** the writer lock retried until either the busy-handler returns 0 or the lock +** is successfully obtained. ^The busy-handler is also invoked while waiting for +** database readers as described above. ^If the busy-handler returns 0 before +** the writer lock is obtained or while waiting for database readers, the +** checkpoint operation proceeds from that point in the same way as +** SQLITE_CHECKPOINT_PASSIVE - checkpointing as many frames as possible +** without blocking any further. ^SQLITE_BUSY is returned in this case. +** +** ^If parameter zDb is NULL or points to a zero length string, then the +** specified operation is attempted on all WAL databases [attached] to +** [database connection] db. In this case the +** values written to output parameters *pnLog and *pnCkpt are undefined. ^If +** an SQLITE_BUSY error is encountered when processing one or more of the +** attached WAL databases, the operation is still attempted on any remaining +** attached databases and SQLITE_BUSY is returned at the end. ^If any other +** error occurs while processing an attached database, processing is abandoned +** and the error code is returned to the caller immediately. ^If no error +** (SQLITE_BUSY or otherwise) is encountered while processing the attached +** databases, SQLITE_OK is returned. +** +** ^If database zDb is the name of an attached database that is not in WAL +** mode, SQLITE_OK is returned and both *pnLog and *pnCkpt set to -1. ^If +** zDb is not NULL (or a zero length string) and is not the name of any +** attached database, SQLITE_ERROR is returned to the caller. +** +** ^Unless it returns SQLITE_MISUSE, +** the sqlite3_wal_checkpoint_v2() interface +** sets the error information that is queried by +** [sqlite3_errcode()] and [sqlite3_errmsg()]. +** +** ^The [PRAGMA wal_checkpoint] command can be used to invoke this interface +** from SQL. +*/ +SQLITE_API int sqlite3_wal_checkpoint_v2( + sqlite3 *db, /* Database handle */ + const char *zDb, /* Name of attached database (or NULL) */ + int eMode, /* SQLITE_CHECKPOINT_* value */ + int *pnLog, /* OUT: Size of WAL log in frames */ + int *pnCkpt /* OUT: Total number of frames checkpointed */ +); + +/* +** CAPI3REF: Checkpoint Mode Values +** KEYWORDS: {checkpoint mode} +** +** These constants define all valid values for the "checkpoint mode" passed +** as the third parameter to the [sqlite3_wal_checkpoint_v2()] interface. +** See the [sqlite3_wal_checkpoint_v2()] documentation for details on the +** meaning of each of these checkpoint modes. +*/ +#define SQLITE_CHECKPOINT_PASSIVE 0 /* Do as much as possible w/o blocking */ +#define SQLITE_CHECKPOINT_FULL 1 /* Wait for writers, then checkpoint */ +#define SQLITE_CHECKPOINT_RESTART 2 /* Like FULL but wait for for readers */ +#define SQLITE_CHECKPOINT_TRUNCATE 3 /* Like RESTART but also truncate WAL */ + +/* +** CAPI3REF: Virtual Table Interface Configuration +** +** This function may be called by either the [xConnect] or [xCreate] method +** of a [virtual table] implementation to configure +** various facets of the virtual table interface. +** +** If this interface is invoked outside the context of an xConnect or +** xCreate virtual table method then the behavior is undefined. +** +** At present, there is only one option that may be configured using +** this function. (See [SQLITE_VTAB_CONSTRAINT_SUPPORT].) Further options +** may be added in the future. +*/ +SQLITE_API int sqlite3_vtab_config(sqlite3*, int op, ...); + +/* +** CAPI3REF: Virtual Table Configuration Options +** +** These macros define the various options to the +** [sqlite3_vtab_config()] interface that [virtual table] implementations +** can use to customize and optimize their behavior. +** +**
      +**
      SQLITE_VTAB_CONSTRAINT_SUPPORT +**
      Calls of the form +** [sqlite3_vtab_config](db,SQLITE_VTAB_CONSTRAINT_SUPPORT,X) are supported, +** where X is an integer. If X is zero, then the [virtual table] whose +** [xCreate] or [xConnect] method invoked [sqlite3_vtab_config()] does not +** support constraints. In this configuration (which is the default) if +** a call to the [xUpdate] method returns [SQLITE_CONSTRAINT], then the entire +** statement is rolled back as if [ON CONFLICT | OR ABORT] had been +** specified as part of the users SQL statement, regardless of the actual +** ON CONFLICT mode specified. +** +** If X is non-zero, then the virtual table implementation guarantees +** that if [xUpdate] returns [SQLITE_CONSTRAINT], it will do so before +** any modifications to internal or persistent data structures have been made. +** If the [ON CONFLICT] mode is ABORT, FAIL, IGNORE or ROLLBACK, SQLite +** is able to roll back a statement or database transaction, and abandon +** or continue processing the current SQL statement as appropriate. +** If the ON CONFLICT mode is REPLACE and the [xUpdate] method returns +** [SQLITE_CONSTRAINT], SQLite handles this as if the ON CONFLICT mode +** had been ABORT. +** +** Virtual table implementations that are required to handle OR REPLACE +** must do so within the [xUpdate] method. If a call to the +** [sqlite3_vtab_on_conflict()] function indicates that the current ON +** CONFLICT policy is REPLACE, the virtual table implementation should +** silently replace the appropriate rows within the xUpdate callback and +** return SQLITE_OK. Or, if this is not possible, it may return +** SQLITE_CONSTRAINT, in which case SQLite falls back to OR ABORT +** constraint handling. +**
      +*/ +#define SQLITE_VTAB_CONSTRAINT_SUPPORT 1 + +/* +** CAPI3REF: Determine The Virtual Table Conflict Policy +** +** This function may only be called from within a call to the [xUpdate] method +** of a [virtual table] implementation for an INSERT or UPDATE operation. ^The +** value returned is one of [SQLITE_ROLLBACK], [SQLITE_IGNORE], [SQLITE_FAIL], +** [SQLITE_ABORT], or [SQLITE_REPLACE], according to the [ON CONFLICT] mode +** of the SQL statement that triggered the call to the [xUpdate] method of the +** [virtual table]. +*/ +SQLITE_API int sqlite3_vtab_on_conflict(sqlite3 *); + +/* +** CAPI3REF: Determine If Virtual Table Column Access Is For UPDATE +** +** If the sqlite3_vtab_nochange(X) routine is called within the [xColumn] +** method of a [virtual table], then it returns true if and only if the +** column is being fetched as part of an UPDATE operation during which the +** column value will not change. Applications might use this to substitute +** a lighter-weight value to return that the corresponding [xUpdate] method +** understands as a "no-change" value. +** +** If the [xColumn] method calls sqlite3_vtab_nochange() and finds that +** the column is not changed by the UPDATE statement, they the xColumn +** method can optionally return without setting a result, without calling +** any of the [sqlite3_result_int|sqlite3_result_xxxxx() interfaces]. +** In that case, [sqlite3_value_nochange(X)] will return true for the +** same column in the [xUpdate] method. +*/ +SQLITE_API int sqlite3_vtab_nochange(sqlite3_context*); + +/* +** CAPI3REF: Determine The Collation For a Virtual Table Constraint +** +** This function may only be called from within a call to the [xBestIndex] +** method of a [virtual table]. +** +** The first argument must be the sqlite3_index_info object that is the +** first parameter to the xBestIndex() method. The second argument must be +** an index into the aConstraint[] array belonging to the sqlite3_index_info +** structure passed to xBestIndex. This function returns a pointer to a buffer +** containing the name of the collation sequence for the corresponding +** constraint. +*/ +SQLITE_API SQLITE_EXPERIMENTAL const char *sqlite3_vtab_collation(sqlite3_index_info*,int); + +/* +** CAPI3REF: Conflict resolution modes +** KEYWORDS: {conflict resolution mode} +** +** These constants are returned by [sqlite3_vtab_on_conflict()] to +** inform a [virtual table] implementation what the [ON CONFLICT] mode +** is for the SQL statement being evaluated. +** +** Note that the [SQLITE_IGNORE] constant is also used as a potential +** return value from the [sqlite3_set_authorizer()] callback and that +** [SQLITE_ABORT] is also a [result code]. +*/ +#define SQLITE_ROLLBACK 1 +/* #define SQLITE_IGNORE 2 // Also used by sqlite3_authorizer() callback */ +#define SQLITE_FAIL 3 +/* #define SQLITE_ABORT 4 // Also an error code */ +#define SQLITE_REPLACE 5 + +/* +** CAPI3REF: Prepared Statement Scan Status Opcodes +** KEYWORDS: {scanstatus options} +** +** The following constants can be used for the T parameter to the +** [sqlite3_stmt_scanstatus(S,X,T,V)] interface. Each constant designates a +** different metric for sqlite3_stmt_scanstatus() to return. +** +** When the value returned to V is a string, space to hold that string is +** managed by the prepared statement S and will be automatically freed when +** S is finalized. +** +**
      +** [[SQLITE_SCANSTAT_NLOOP]]
      SQLITE_SCANSTAT_NLOOP
      +**
      ^The [sqlite3_int64] variable pointed to by the T parameter will be +** set to the total number of times that the X-th loop has run.
      +** +** [[SQLITE_SCANSTAT_NVISIT]]
      SQLITE_SCANSTAT_NVISIT
      +**
      ^The [sqlite3_int64] variable pointed to by the T parameter will be set +** to the total number of rows examined by all iterations of the X-th loop.
      +** +** [[SQLITE_SCANSTAT_EST]]
      SQLITE_SCANSTAT_EST
      +**
      ^The "double" variable pointed to by the T parameter will be set to the +** query planner's estimate for the average number of rows output from each +** iteration of the X-th loop. If the query planner's estimates was accurate, +** then this value will approximate the quotient NVISIT/NLOOP and the +** product of this value for all prior loops with the same SELECTID will +** be the NLOOP value for the current loop. +** +** [[SQLITE_SCANSTAT_NAME]]
      SQLITE_SCANSTAT_NAME
      +**
      ^The "const char *" variable pointed to by the T parameter will be set +** to a zero-terminated UTF-8 string containing the name of the index or table +** used for the X-th loop. +** +** [[SQLITE_SCANSTAT_EXPLAIN]]
      SQLITE_SCANSTAT_EXPLAIN
      +**
      ^The "const char *" variable pointed to by the T parameter will be set +** to a zero-terminated UTF-8 string containing the [EXPLAIN QUERY PLAN] +** description for the X-th loop. +** +** [[SQLITE_SCANSTAT_SELECTID]]
      SQLITE_SCANSTAT_SELECT
      +**
      ^The "int" variable pointed to by the T parameter will be set to the +** "select-id" for the X-th loop. The select-id identifies which query or +** subquery the loop is part of. The main query has a select-id of zero. +** The select-id is the same value as is output in the first column +** of an [EXPLAIN QUERY PLAN] query. +**
      +*/ +#define SQLITE_SCANSTAT_NLOOP 0 +#define SQLITE_SCANSTAT_NVISIT 1 +#define SQLITE_SCANSTAT_EST 2 +#define SQLITE_SCANSTAT_NAME 3 +#define SQLITE_SCANSTAT_EXPLAIN 4 +#define SQLITE_SCANSTAT_SELECTID 5 + +/* +** CAPI3REF: Prepared Statement Scan Status +** METHOD: sqlite3_stmt +** +** This interface returns information about the predicted and measured +** performance for pStmt. Advanced applications can use this +** interface to compare the predicted and the measured performance and +** issue warnings and/or rerun [ANALYZE] if discrepancies are found. +** +** Since this interface is expected to be rarely used, it is only +** available if SQLite is compiled using the [SQLITE_ENABLE_STMT_SCANSTATUS] +** compile-time option. +** +** The "iScanStatusOp" parameter determines which status information to return. +** The "iScanStatusOp" must be one of the [scanstatus options] or the behavior +** of this interface is undefined. +** ^The requested measurement is written into a variable pointed to by +** the "pOut" parameter. +** Parameter "idx" identifies the specific loop to retrieve statistics for. +** Loops are numbered starting from zero. ^If idx is out of range - less than +** zero or greater than or equal to the total number of loops used to implement +** the statement - a non-zero value is returned and the variable that pOut +** points to is unchanged. +** +** ^Statistics might not be available for all loops in all statements. ^In cases +** where there exist loops with no available statistics, this function behaves +** as if the loop did not exist - it returns non-zero and leave the variable +** that pOut points to unchanged. +** +** See also: [sqlite3_stmt_scanstatus_reset()] +*/ +SQLITE_API int sqlite3_stmt_scanstatus( + sqlite3_stmt *pStmt, /* Prepared statement for which info desired */ + int idx, /* Index of loop to report on */ + int iScanStatusOp, /* Information desired. SQLITE_SCANSTAT_* */ + void *pOut /* Result written here */ +); + +/* +** CAPI3REF: Zero Scan-Status Counters +** METHOD: sqlite3_stmt +** +** ^Zero all [sqlite3_stmt_scanstatus()] related event counters. +** +** This API is only available if the library is built with pre-processor +** symbol [SQLITE_ENABLE_STMT_SCANSTATUS] defined. +*/ +SQLITE_API void sqlite3_stmt_scanstatus_reset(sqlite3_stmt*); + +/* +** CAPI3REF: Flush caches to disk mid-transaction +** +** ^If a write-transaction is open on [database connection] D when the +** [sqlite3_db_cacheflush(D)] interface invoked, any dirty +** pages in the pager-cache that are not currently in use are written out +** to disk. A dirty page may be in use if a database cursor created by an +** active SQL statement is reading from it, or if it is page 1 of a database +** file (page 1 is always "in use"). ^The [sqlite3_db_cacheflush(D)] +** interface flushes caches for all schemas - "main", "temp", and +** any [attached] databases. +** +** ^If this function needs to obtain extra database locks before dirty pages +** can be flushed to disk, it does so. ^If those locks cannot be obtained +** immediately and there is a busy-handler callback configured, it is invoked +** in the usual manner. ^If the required lock still cannot be obtained, then +** the database is skipped and an attempt made to flush any dirty pages +** belonging to the next (if any) database. ^If any databases are skipped +** because locks cannot be obtained, but no other error occurs, this +** function returns SQLITE_BUSY. +** +** ^If any other error occurs while flushing dirty pages to disk (for +** example an IO error or out-of-memory condition), then processing is +** abandoned and an SQLite [error code] is returned to the caller immediately. +** +** ^Otherwise, if no error occurs, [sqlite3_db_cacheflush()] returns SQLITE_OK. +** +** ^This function does not set the database handle error code or message +** returned by the [sqlite3_errcode()] and [sqlite3_errmsg()] functions. +*/ +SQLITE_API int sqlite3_db_cacheflush(sqlite3*); + +/* +** CAPI3REF: The pre-update hook. +** +** ^These interfaces are only available if SQLite is compiled using the +** [SQLITE_ENABLE_PREUPDATE_HOOK] compile-time option. +** +** ^The [sqlite3_preupdate_hook()] interface registers a callback function +** that is invoked prior to each [INSERT], [UPDATE], and [DELETE] operation +** on a database table. +** ^At most one preupdate hook may be registered at a time on a single +** [database connection]; each call to [sqlite3_preupdate_hook()] overrides +** the previous setting. +** ^The preupdate hook is disabled by invoking [sqlite3_preupdate_hook()] +** with a NULL pointer as the second parameter. +** ^The third parameter to [sqlite3_preupdate_hook()] is passed through as +** the first parameter to callbacks. +** +** ^The preupdate hook only fires for changes to real database tables; the +** preupdate hook is not invoked for changes to [virtual tables] or to +** system tables like sqlite_master or sqlite_stat1. +** +** ^The second parameter to the preupdate callback is a pointer to +** the [database connection] that registered the preupdate hook. +** ^The third parameter to the preupdate callback is one of the constants +** [SQLITE_INSERT], [SQLITE_DELETE], or [SQLITE_UPDATE] to identify the +** kind of update operation that is about to occur. +** ^(The fourth parameter to the preupdate callback is the name of the +** database within the database connection that is being modified. This +** will be "main" for the main database or "temp" for TEMP tables or +** the name given after the AS keyword in the [ATTACH] statement for attached +** databases.)^ +** ^The fifth parameter to the preupdate callback is the name of the +** table that is being modified. +** +** For an UPDATE or DELETE operation on a [rowid table], the sixth +** parameter passed to the preupdate callback is the initial [rowid] of the +** row being modified or deleted. For an INSERT operation on a rowid table, +** or any operation on a WITHOUT ROWID table, the value of the sixth +** parameter is undefined. For an INSERT or UPDATE on a rowid table the +** seventh parameter is the final rowid value of the row being inserted +** or updated. The value of the seventh parameter passed to the callback +** function is not defined for operations on WITHOUT ROWID tables, or for +** INSERT operations on rowid tables. +** +** The [sqlite3_preupdate_old()], [sqlite3_preupdate_new()], +** [sqlite3_preupdate_count()], and [sqlite3_preupdate_depth()] interfaces +** provide additional information about a preupdate event. These routines +** may only be called from within a preupdate callback. Invoking any of +** these routines from outside of a preupdate callback or with a +** [database connection] pointer that is different from the one supplied +** to the preupdate callback results in undefined and probably undesirable +** behavior. +** +** ^The [sqlite3_preupdate_count(D)] interface returns the number of columns +** in the row that is being inserted, updated, or deleted. +** +** ^The [sqlite3_preupdate_old(D,N,P)] interface writes into P a pointer to +** a [protected sqlite3_value] that contains the value of the Nth column of +** the table row before it is updated. The N parameter must be between 0 +** and one less than the number of columns or the behavior will be +** undefined. This must only be used within SQLITE_UPDATE and SQLITE_DELETE +** preupdate callbacks; if it is used by an SQLITE_INSERT callback then the +** behavior is undefined. The [sqlite3_value] that P points to +** will be destroyed when the preupdate callback returns. +** +** ^The [sqlite3_preupdate_new(D,N,P)] interface writes into P a pointer to +** a [protected sqlite3_value] that contains the value of the Nth column of +** the table row after it is updated. The N parameter must be between 0 +** and one less than the number of columns or the behavior will be +** undefined. This must only be used within SQLITE_INSERT and SQLITE_UPDATE +** preupdate callbacks; if it is used by an SQLITE_DELETE callback then the +** behavior is undefined. The [sqlite3_value] that P points to +** will be destroyed when the preupdate callback returns. +** +** ^The [sqlite3_preupdate_depth(D)] interface returns 0 if the preupdate +** callback was invoked as a result of a direct insert, update, or delete +** operation; or 1 for inserts, updates, or deletes invoked by top-level +** triggers; or 2 for changes resulting from triggers called by top-level +** triggers; and so forth. +** +** See also: [sqlite3_update_hook()] +*/ +#if defined(SQLITE_ENABLE_PREUPDATE_HOOK) +SQLITE_API void *sqlite3_preupdate_hook( + sqlite3 *db, + void(*xPreUpdate)( + void *pCtx, /* Copy of third arg to preupdate_hook() */ + sqlite3 *db, /* Database handle */ + int op, /* SQLITE_UPDATE, DELETE or INSERT */ + char const *zDb, /* Database name */ + char const *zName, /* Table name */ + sqlite3_int64 iKey1, /* Rowid of row about to be deleted/updated */ + sqlite3_int64 iKey2 /* New rowid value (for a rowid UPDATE) */ + ), + void* +); +SQLITE_API int sqlite3_preupdate_old(sqlite3 *, int, sqlite3_value **); +SQLITE_API int sqlite3_preupdate_count(sqlite3 *); +SQLITE_API int sqlite3_preupdate_depth(sqlite3 *); +SQLITE_API int sqlite3_preupdate_new(sqlite3 *, int, sqlite3_value **); +#endif + +/* +** CAPI3REF: Low-level system error code +** +** ^Attempt to return the underlying operating system error code or error +** number that caused the most recent I/O error or failure to open a file. +** The return value is OS-dependent. For example, on unix systems, after +** [sqlite3_open_v2()] returns [SQLITE_CANTOPEN], this interface could be +** called to get back the underlying "errno" that caused the problem, such +** as ENOSPC, EAUTH, EISDIR, and so forth. +*/ +SQLITE_API int sqlite3_system_errno(sqlite3*); + +/* +** CAPI3REF: Database Snapshot +** KEYWORDS: {snapshot} {sqlite3_snapshot} +** EXPERIMENTAL +** +** An instance of the snapshot object records the state of a [WAL mode] +** database for some specific point in history. +** +** In [WAL mode], multiple [database connections] that are open on the +** same database file can each be reading a different historical version +** of the database file. When a [database connection] begins a read +** transaction, that connection sees an unchanging copy of the database +** as it existed for the point in time when the transaction first started. +** Subsequent changes to the database from other connections are not seen +** by the reader until a new read transaction is started. +** +** The sqlite3_snapshot object records state information about an historical +** version of the database file so that it is possible to later open a new read +** transaction that sees that historical version of the database rather than +** the most recent version. +** +** The constructor for this object is [sqlite3_snapshot_get()]. The +** [sqlite3_snapshot_open()] method causes a fresh read transaction to refer +** to an historical snapshot (if possible). The destructor for +** sqlite3_snapshot objects is [sqlite3_snapshot_free()]. +*/ +typedef struct sqlite3_snapshot { + unsigned char hidden[48]; +} sqlite3_snapshot; + +/* +** CAPI3REF: Record A Database Snapshot +** EXPERIMENTAL +** +** ^The [sqlite3_snapshot_get(D,S,P)] interface attempts to make a +** new [sqlite3_snapshot] object that records the current state of +** schema S in database connection D. ^On success, the +** [sqlite3_snapshot_get(D,S,P)] interface writes a pointer to the newly +** created [sqlite3_snapshot] object into *P and returns SQLITE_OK. +** If there is not already a read-transaction open on schema S when +** this function is called, one is opened automatically. +** +** The following must be true for this function to succeed. If any of +** the following statements are false when sqlite3_snapshot_get() is +** called, SQLITE_ERROR is returned. The final value of *P is undefined +** in this case. +** +**
        +**
      • The database handle must be in [autocommit mode]. +** +**
      • Schema S of [database connection] D must be a [WAL mode] database. +** +**
      • There must not be a write transaction open on schema S of database +** connection D. +** +**
      • One or more transactions must have been written to the current wal +** file since it was created on disk (by any connection). This means +** that a snapshot cannot be taken on a wal mode database with no wal +** file immediately after it is first opened. At least one transaction +** must be written to it first. +**
      +** +** This function may also return SQLITE_NOMEM. If it is called with the +** database handle in autocommit mode but fails for some other reason, +** whether or not a read transaction is opened on schema S is undefined. +** +** The [sqlite3_snapshot] object returned from a successful call to +** [sqlite3_snapshot_get()] must be freed using [sqlite3_snapshot_free()] +** to avoid a memory leak. +** +** The [sqlite3_snapshot_get()] interface is only available when the +** SQLITE_ENABLE_SNAPSHOT compile-time option is used. +*/ +SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_get( + sqlite3 *db, + const char *zSchema, + sqlite3_snapshot **ppSnapshot +); + +/* +** CAPI3REF: Start a read transaction on an historical snapshot +** EXPERIMENTAL +** +** ^The [sqlite3_snapshot_open(D,S,P)] interface starts a +** read transaction for schema S of +** [database connection] D such that the read transaction +** refers to historical [snapshot] P, rather than the most +** recent change to the database. +** ^The [sqlite3_snapshot_open()] interface returns SQLITE_OK on success +** or an appropriate [error code] if it fails. +** +** ^In order to succeed, a call to [sqlite3_snapshot_open(D,S,P)] must be +** the first operation following the [BEGIN] that takes the schema S +** out of [autocommit mode]. +** ^In other words, schema S must not currently be in +** a transaction for [sqlite3_snapshot_open(D,S,P)] to work, but the +** database connection D must be out of [autocommit mode]. +** ^A [snapshot] will fail to open if it has been overwritten by a +** [checkpoint]. +** ^(A call to [sqlite3_snapshot_open(D,S,P)] will fail if the +** database connection D does not know that the database file for +** schema S is in [WAL mode]. A database connection might not know +** that the database file is in [WAL mode] if there has been no prior +** I/O on that database connection, or if the database entered [WAL mode] +** after the most recent I/O on the database connection.)^ +** (Hint: Run "[PRAGMA application_id]" against a newly opened +** database connection in order to make it ready to use snapshots.) +** +** The [sqlite3_snapshot_open()] interface is only available when the +** SQLITE_ENABLE_SNAPSHOT compile-time option is used. +*/ +SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_open( + sqlite3 *db, + const char *zSchema, + sqlite3_snapshot *pSnapshot +); + +/* +** CAPI3REF: Destroy a snapshot +** EXPERIMENTAL +** +** ^The [sqlite3_snapshot_free(P)] interface destroys [sqlite3_snapshot] P. +** The application must eventually free every [sqlite3_snapshot] object +** using this routine to avoid a memory leak. +** +** The [sqlite3_snapshot_free()] interface is only available when the +** SQLITE_ENABLE_SNAPSHOT compile-time option is used. +*/ +SQLITE_API SQLITE_EXPERIMENTAL void sqlite3_snapshot_free(sqlite3_snapshot*); + +/* +** CAPI3REF: Compare the ages of two snapshot handles. +** EXPERIMENTAL +** +** The sqlite3_snapshot_cmp(P1, P2) interface is used to compare the ages +** of two valid snapshot handles. +** +** If the two snapshot handles are not associated with the same database +** file, the result of the comparison is undefined. +** +** Additionally, the result of the comparison is only valid if both of the +** snapshot handles were obtained by calling sqlite3_snapshot_get() since the +** last time the wal file was deleted. The wal file is deleted when the +** database is changed back to rollback mode or when the number of database +** clients drops to zero. If either snapshot handle was obtained before the +** wal file was last deleted, the value returned by this function +** is undefined. +** +** Otherwise, this API returns a negative value if P1 refers to an older +** snapshot than P2, zero if the two handles refer to the same database +** snapshot, and a positive value if P1 is a newer snapshot than P2. +*/ +SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_cmp( + sqlite3_snapshot *p1, + sqlite3_snapshot *p2 +); + +/* +** CAPI3REF: Recover snapshots from a wal file +** EXPERIMENTAL +** +** If all connections disconnect from a database file but do not perform +** a checkpoint, the existing wal file is opened along with the database +** file the next time the database is opened. At this point it is only +** possible to successfully call sqlite3_snapshot_open() to open the most +** recent snapshot of the database (the one at the head of the wal file), +** even though the wal file may contain other valid snapshots for which +** clients have sqlite3_snapshot handles. +** +** This function attempts to scan the wal file associated with database zDb +** of database handle db and make all valid snapshots available to +** sqlite3_snapshot_open(). It is an error if there is already a read +** transaction open on the database, or if the database is not a wal mode +** database. +** +** SQLITE_OK is returned if successful, or an SQLite error code otherwise. +*/ +SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_recover(sqlite3 *db, const char *zDb); + +/* +** Undo the hack that converts floating point types to integer for +** builds on processors without floating point support. +*/ +#ifdef SQLITE_OMIT_FLOATING_POINT +# undef double +#endif + +#ifdef __cplusplus +} /* End of the 'extern "C"' block */ +#endif +#endif /* SQLITE3_H */ + +/******** Begin file sqlite3rtree.h *********/ +/* +** 2010 August 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. +** +************************************************************************* +*/ + +#ifndef _SQLITE3RTREE_H_ +#define _SQLITE3RTREE_H_ + + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct sqlite3_rtree_geometry sqlite3_rtree_geometry; +typedef struct sqlite3_rtree_query_info sqlite3_rtree_query_info; + +/* The double-precision datatype used by RTree depends on the +** SQLITE_RTREE_INT_ONLY compile-time option. +*/ +#ifdef SQLITE_RTREE_INT_ONLY + typedef sqlite3_int64 sqlite3_rtree_dbl; +#else + typedef double sqlite3_rtree_dbl; +#endif + +/* +** Register a geometry callback named zGeom that can be used as part of an +** R-Tree geometry query as follows: +** +** SELECT ... FROM WHERE MATCH $zGeom(... params ...) +*/ +SQLITE_API int sqlite3_rtree_geometry_callback( + sqlite3 *db, + const char *zGeom, + int (*xGeom)(sqlite3_rtree_geometry*, int, sqlite3_rtree_dbl*,int*), + void *pContext +); + + +/* +** A pointer to a structure of the following type is passed as the first +** argument to callbacks registered using rtree_geometry_callback(). +*/ +struct sqlite3_rtree_geometry { + void *pContext; /* Copy of pContext passed to s_r_g_c() */ + int nParam; /* Size of array aParam[] */ + sqlite3_rtree_dbl *aParam; /* Parameters passed to SQL geom function */ + void *pUser; /* Callback implementation user data */ + void (*xDelUser)(void *); /* Called by SQLite to clean up pUser */ +}; + +/* +** Register a 2nd-generation geometry callback named zScore that can be +** used as part of an R-Tree geometry query as follows: +** +** SELECT ... FROM WHERE MATCH $zQueryFunc(... params ...) +*/ +SQLITE_API int sqlite3_rtree_query_callback( + sqlite3 *db, + const char *zQueryFunc, + int (*xQueryFunc)(sqlite3_rtree_query_info*), + void *pContext, + void (*xDestructor)(void*) +); + + +/* +** A pointer to a structure of the following type is passed as the +** argument to scored geometry callback registered using +** sqlite3_rtree_query_callback(). +** +** Note that the first 5 fields of this structure are identical to +** sqlite3_rtree_geometry. This structure is a subclass of +** sqlite3_rtree_geometry. +*/ +struct sqlite3_rtree_query_info { + void *pContext; /* pContext from when function registered */ + int nParam; /* Number of function parameters */ + sqlite3_rtree_dbl *aParam; /* value of function parameters */ + void *pUser; /* callback can use this, if desired */ + void (*xDelUser)(void*); /* function to free pUser */ + sqlite3_rtree_dbl *aCoord; /* Coordinates of node or entry to check */ + unsigned int *anQueue; /* Number of pending entries in the queue */ + int nCoord; /* Number of coordinates */ + int iLevel; /* Level of current node or entry */ + int mxLevel; /* The largest iLevel value in the tree */ + sqlite3_int64 iRowid; /* Rowid for current entry */ + sqlite3_rtree_dbl rParentScore; /* Score of parent node */ + int eParentWithin; /* Visibility of parent node */ + int eWithin; /* OUT: Visiblity */ + sqlite3_rtree_dbl rScore; /* OUT: Write the score here */ + /* The following fields are only available in 3.8.11 and later */ + sqlite3_value **apSqlParam; /* Original SQL values of parameters */ +}; + +/* +** Allowed values for sqlite3_rtree_query.eWithin and .eParentWithin. +*/ +#define NOT_WITHIN 0 /* Object completely outside of query region */ +#define PARTLY_WITHIN 1 /* Object partially overlaps query region */ +#define FULLY_WITHIN 2 /* Object fully contained within query region */ + + +#ifdef __cplusplus +} /* end of the 'extern "C"' block */ +#endif + +#endif /* ifndef _SQLITE3RTREE_H_ */ + +/******** End of sqlite3rtree.h *********/ +/******** Begin file sqlite3session.h *********/ + +#if !defined(__SQLITESESSION_H_) && defined(SQLITE_ENABLE_SESSION) +#define __SQLITESESSION_H_ 1 + +/* +** Make sure we can call this stuff from C++. +*/ +#ifdef __cplusplus +extern "C" { +#endif + + +/* +** CAPI3REF: Session Object Handle +*/ +typedef struct sqlite3_session sqlite3_session; + +/* +** CAPI3REF: Changeset Iterator Handle +*/ +typedef struct sqlite3_changeset_iter sqlite3_changeset_iter; + +/* +** CAPI3REF: Create A New Session Object +** +** Create a new session object attached to database handle db. If successful, +** a pointer to the new object is written to *ppSession and SQLITE_OK is +** returned. If an error occurs, *ppSession is set to NULL and an SQLite +** error code (e.g. SQLITE_NOMEM) is returned. +** +** It is possible to create multiple session objects attached to a single +** database handle. +** +** Session objects created using this function should be deleted using the +** [sqlite3session_delete()] function before the database handle that they +** are attached to is itself closed. If the database handle is closed before +** the session object is deleted, then the results of calling any session +** module function, including [sqlite3session_delete()] on the session object +** are undefined. +** +** Because the session module uses the [sqlite3_preupdate_hook()] API, it +** is not possible for an application to register a pre-update hook on a +** database handle that has one or more session objects attached. Nor is +** it possible to create a session object attached to a database handle for +** which a pre-update hook is already defined. The results of attempting +** either of these things are undefined. +** +** The session object will be used to create changesets for tables in +** database zDb, where zDb is either "main", or "temp", or the name of an +** attached database. It is not an error if database zDb is not attached +** to the database when the session object is created. +*/ +SQLITE_API int sqlite3session_create( + sqlite3 *db, /* Database handle */ + const char *zDb, /* Name of db (e.g. "main") */ + sqlite3_session **ppSession /* OUT: New session object */ +); + +/* +** CAPI3REF: Delete A Session Object +** +** Delete a session object previously allocated using +** [sqlite3session_create()]. Once a session object has been deleted, the +** results of attempting to use pSession with any other session module +** function are undefined. +** +** Session objects must be deleted before the database handle to which they +** are attached is closed. Refer to the documentation for +** [sqlite3session_create()] for details. +*/ +SQLITE_API void sqlite3session_delete(sqlite3_session *pSession); + + +/* +** CAPI3REF: Enable Or Disable A Session Object +** +** Enable or disable the recording of changes by a session object. When +** enabled, a session object records changes made to the database. When +** disabled - it does not. A newly created session object is enabled. +** Refer to the documentation for [sqlite3session_changeset()] for further +** details regarding how enabling and disabling a session object affects +** the eventual changesets. +** +** Passing zero to this function disables the session. Passing a value +** greater than zero enables it. Passing a value less than zero is a +** no-op, and may be used to query the current state of the session. +** +** The return value indicates the final state of the session object: 0 if +** the session is disabled, or 1 if it is enabled. +*/ +SQLITE_API int sqlite3session_enable(sqlite3_session *pSession, int bEnable); + +/* +** CAPI3REF: Set Or Clear the Indirect Change Flag +** +** Each change recorded by a session object is marked as either direct or +** indirect. A change is marked as indirect if either: +** +**
        +**
      • The session object "indirect" flag is set when the change is +** made, or +**
      • The change is made by an SQL trigger or foreign key action +** instead of directly as a result of a users SQL statement. +**
      +** +** If a single row is affected by more than one operation within a session, +** then the change is considered indirect if all operations meet the criteria +** for an indirect change above, or direct otherwise. +** +** This function is used to set, clear or query the session object indirect +** flag. If the second argument passed to this function is zero, then the +** indirect flag is cleared. If it is greater than zero, the indirect flag +** is set. Passing a value less than zero does not modify the current value +** of the indirect flag, and may be used to query the current state of the +** indirect flag for the specified session object. +** +** The return value indicates the final state of the indirect flag: 0 if +** it is clear, or 1 if it is set. +*/ +SQLITE_API int sqlite3session_indirect(sqlite3_session *pSession, int bIndirect); + +/* +** CAPI3REF: Attach A Table To A Session Object +** +** If argument zTab is not NULL, then it is the name of a table to attach +** to the session object passed as the first argument. All subsequent changes +** made to the table while the session object is enabled will be recorded. See +** documentation for [sqlite3session_changeset()] for further details. +** +** Or, if argument zTab is NULL, then changes are recorded for all tables +** in the database. If additional tables are added to the database (by +** executing "CREATE TABLE" statements) after this call is made, changes for +** the new tables are also recorded. +** +** Changes can only be recorded for tables that have a PRIMARY KEY explicitly +** defined as part of their CREATE TABLE statement. It does not matter if the +** PRIMARY KEY is an "INTEGER PRIMARY KEY" (rowid alias) or not. The PRIMARY +** KEY may consist of a single column, or may be a composite key. +** +** It is not an error if the named table does not exist in the database. Nor +** is it an error if the named table does not have a PRIMARY KEY. However, +** no changes will be recorded in either of these scenarios. +** +** Changes are not recorded for individual rows that have NULL values stored +** in one or more of their PRIMARY KEY columns. +** +** SQLITE_OK is returned if the call completes without error. Or, if an error +** occurs, an SQLite error code (e.g. SQLITE_NOMEM) is returned. +** +**

      Special sqlite_stat1 Handling

      +** +** As of SQLite version 3.22.0, the "sqlite_stat1" table is an exception to +** some of the rules above. In SQLite, the schema of sqlite_stat1 is: +**
      +**        CREATE TABLE sqlite_stat1(tbl,idx,stat)  
      +**  
      +** +** Even though sqlite_stat1 does not have a PRIMARY KEY, changes are +** recorded for it as if the PRIMARY KEY is (tbl,idx). Additionally, changes +** are recorded for rows for which (idx IS NULL) is true. However, for such +** rows a zero-length blob (SQL value X'') is stored in the changeset or +** patchset instead of a NULL value. This allows such changesets to be +** manipulated by legacy implementations of sqlite3changeset_invert(), +** concat() and similar. +** +** The sqlite3changeset_apply() function automatically converts the +** zero-length blob back to a NULL value when updating the sqlite_stat1 +** table. However, if the application calls sqlite3changeset_new(), +** sqlite3changeset_old() or sqlite3changeset_conflict on a changeset +** iterator directly (including on a changeset iterator passed to a +** conflict-handler callback) then the X'' value is returned. The application +** must translate X'' to NULL itself if required. +** +** Legacy (older than 3.22.0) versions of the sessions module cannot capture +** changes made to the sqlite_stat1 table. Legacy versions of the +** sqlite3changeset_apply() function silently ignore any modifications to the +** sqlite_stat1 table that are part of a changeset or patchset. +*/ +SQLITE_API int sqlite3session_attach( + sqlite3_session *pSession, /* Session object */ + const char *zTab /* Table name */ +); + +/* +** CAPI3REF: Set a table filter on a Session Object. +** +** The second argument (xFilter) is the "filter callback". For changes to rows +** in tables that are not attached to the Session object, the filter is called +** to determine whether changes to the table's rows should be tracked or not. +** If xFilter returns 0, changes is not tracked. Note that once a table is +** attached, xFilter will not be called again. +*/ +SQLITE_API void sqlite3session_table_filter( + sqlite3_session *pSession, /* Session object */ + int(*xFilter)( + void *pCtx, /* Copy of third arg to _filter_table() */ + const char *zTab /* Table name */ + ), + void *pCtx /* First argument passed to xFilter */ +); + +/* +** CAPI3REF: Generate A Changeset From A Session Object +** +** Obtain a changeset containing changes to the tables attached to the +** session object passed as the first argument. If successful, +** set *ppChangeset to point to a buffer containing the changeset +** and *pnChangeset to the size of the changeset in bytes before returning +** SQLITE_OK. If an error occurs, set both *ppChangeset and *pnChangeset to +** zero and return an SQLite error code. +** +** A changeset consists of zero or more INSERT, UPDATE and/or DELETE changes, +** each representing a change to a single row of an attached table. An INSERT +** change contains the values of each field of a new database row. A DELETE +** contains the original values of each field of a deleted database row. An +** UPDATE change contains the original values of each field of an updated +** database row along with the updated values for each updated non-primary-key +** column. It is not possible for an UPDATE change to represent a change that +** modifies the values of primary key columns. If such a change is made, it +** is represented in a changeset as a DELETE followed by an INSERT. +** +** Changes are not recorded for rows that have NULL values stored in one or +** more of their PRIMARY KEY columns. If such a row is inserted or deleted, +** no corresponding change is present in the changesets returned by this +** function. If an existing row with one or more NULL values stored in +** PRIMARY KEY columns is updated so that all PRIMARY KEY columns are non-NULL, +** only an INSERT is appears in the changeset. Similarly, if an existing row +** with non-NULL PRIMARY KEY values is updated so that one or more of its +** PRIMARY KEY columns are set to NULL, the resulting changeset contains a +** DELETE change only. +** +** The contents of a changeset may be traversed using an iterator created +** using the [sqlite3changeset_start()] API. A changeset may be applied to +** a database with a compatible schema using the [sqlite3changeset_apply()] +** API. +** +** Within a changeset generated by this function, all changes related to a +** single table are grouped together. In other words, when iterating through +** a changeset or when applying a changeset to a database, all changes related +** to a single table are processed before moving on to the next table. Tables +** are sorted in the same order in which they were attached (or auto-attached) +** to the sqlite3_session object. The order in which the changes related to +** a single table are stored is undefined. +** +** Following a successful call to this function, it is the responsibility of +** the caller to eventually free the buffer that *ppChangeset points to using +** [sqlite3_free()]. +** +**

      Changeset Generation

      +** +** Once a table has been attached to a session object, the session object +** records the primary key values of all new rows inserted into the table. +** It also records the original primary key and other column values of any +** deleted or updated rows. For each unique primary key value, data is only +** recorded once - the first time a row with said primary key is inserted, +** updated or deleted in the lifetime of the session. +** +** There is one exception to the previous paragraph: when a row is inserted, +** updated or deleted, if one or more of its primary key columns contain a +** NULL value, no record of the change is made. +** +** The session object therefore accumulates two types of records - those +** that consist of primary key values only (created when the user inserts +** a new record) and those that consist of the primary key values and the +** original values of other table columns (created when the users deletes +** or updates a record). +** +** When this function is called, the requested changeset is created using +** both the accumulated records and the current contents of the database +** file. Specifically: +** +**
        +**
      • For each record generated by an insert, the database is queried +** for a row with a matching primary key. If one is found, an INSERT +** change is added to the changeset. If no such row is found, no change +** is added to the changeset. +** +**
      • For each record generated by an update or delete, the database is +** queried for a row with a matching primary key. If such a row is +** found and one or more of the non-primary key fields have been +** modified from their original values, an UPDATE change is added to +** the changeset. Or, if no such row is found in the table, a DELETE +** change is added to the changeset. If there is a row with a matching +** primary key in the database, but all fields contain their original +** values, no change is added to the changeset. +**
      +** +** This means, amongst other things, that if a row is inserted and then later +** deleted while a session object is active, neither the insert nor the delete +** will be present in the changeset. Or if a row is deleted and then later a +** row with the same primary key values inserted while a session object is +** active, the resulting changeset will contain an UPDATE change instead of +** a DELETE and an INSERT. +** +** When a session object is disabled (see the [sqlite3session_enable()] API), +** it does not accumulate records when rows are inserted, updated or deleted. +** This may appear to have some counter-intuitive effects if a single row +** is written to more than once during a session. For example, if a row +** is inserted while a session object is enabled, then later deleted while +** the same session object is disabled, no INSERT record will appear in the +** changeset, even though the delete took place while the session was disabled. +** Or, if one field of a row is updated while a session is disabled, and +** another field of the same row is updated while the session is enabled, the +** resulting changeset will contain an UPDATE change that updates both fields. +*/ +SQLITE_API int sqlite3session_changeset( + sqlite3_session *pSession, /* Session object */ + int *pnChangeset, /* OUT: Size of buffer at *ppChangeset */ + void **ppChangeset /* OUT: Buffer containing changeset */ +); + +/* +** CAPI3REF: Load The Difference Between Tables Into A Session +** +** If it is not already attached to the session object passed as the first +** argument, this function attaches table zTbl in the same manner as the +** [sqlite3session_attach()] function. If zTbl does not exist, or if it +** does not have a primary key, this function is a no-op (but does not return +** an error). +** +** Argument zFromDb must be the name of a database ("main", "temp" etc.) +** attached to the same database handle as the session object that contains +** a table compatible with the table attached to the session by this function. +** A table is considered compatible if it: +** +**
        +**
      • Has the same name, +**
      • Has the same set of columns declared in the same order, and +**
      • Has the same PRIMARY KEY definition. +**
      +** +** If the tables are not compatible, SQLITE_SCHEMA is returned. If the tables +** are compatible but do not have any PRIMARY KEY columns, it is not an error +** but no changes are added to the session object. As with other session +** APIs, tables without PRIMARY KEYs are simply ignored. +** +** This function adds a set of changes to the session object that could be +** used to update the table in database zFrom (call this the "from-table") +** so that its content is the same as the table attached to the session +** object (call this the "to-table"). Specifically: +** +**
        +**
      • For each row (primary key) that exists in the to-table but not in +** the from-table, an INSERT record is added to the session object. +** +**
      • For each row (primary key) that exists in the to-table but not in +** the from-table, a DELETE record is added to the session object. +** +**
      • For each row (primary key) that exists in both tables, but features +** different non-PK values in each, an UPDATE record is added to the +** session. +**
      +** +** To clarify, if this function is called and then a changeset constructed +** using [sqlite3session_changeset()], then after applying that changeset to +** database zFrom the contents of the two compatible tables would be +** identical. +** +** It an error if database zFrom does not exist or does not contain the +** required compatible table. +** +** If the operation successful, SQLITE_OK is returned. Otherwise, an SQLite +** error code. In this case, if argument pzErrMsg is not NULL, *pzErrMsg +** may be set to point to a buffer containing an English language error +** message. It is the responsibility of the caller to free this buffer using +** sqlite3_free(). +*/ +SQLITE_API int sqlite3session_diff( + sqlite3_session *pSession, + const char *zFromDb, + const char *zTbl, + char **pzErrMsg +); + + +/* +** CAPI3REF: Generate A Patchset From A Session Object +** +** The differences between a patchset and a changeset are that: +** +**
        +**
      • DELETE records consist of the primary key fields only. The +** original values of other fields are omitted. +**
      • The original values of any modified fields are omitted from +** UPDATE records. +**
      +** +** A patchset blob may be used with up to date versions of all +** sqlite3changeset_xxx API functions except for sqlite3changeset_invert(), +** which returns SQLITE_CORRUPT if it is passed a patchset. Similarly, +** attempting to use a patchset blob with old versions of the +** sqlite3changeset_xxx APIs also provokes an SQLITE_CORRUPT error. +** +** Because the non-primary key "old.*" fields are omitted, no +** SQLITE_CHANGESET_DATA conflicts can be detected or reported if a patchset +** is passed to the sqlite3changeset_apply() API. Other conflict types work +** in the same way as for changesets. +** +** Changes within a patchset are ordered in the same way as for changesets +** generated by the sqlite3session_changeset() function (i.e. all changes for +** a single table are grouped together, tables appear in the order in which +** they were attached to the session object). +*/ +SQLITE_API int sqlite3session_patchset( + sqlite3_session *pSession, /* Session object */ + int *pnPatchset, /* OUT: Size of buffer at *ppPatchset */ + void **ppPatchset /* OUT: Buffer containing patchset */ +); + +/* +** CAPI3REF: Test if a changeset has recorded any changes. +** +** Return non-zero if no changes to attached tables have been recorded by +** the session object passed as the first argument. Otherwise, if one or +** more changes have been recorded, return zero. +** +** Even if this function returns zero, it is possible that calling +** [sqlite3session_changeset()] on the session handle may still return a +** changeset that contains no changes. This can happen when a row in +** an attached table is modified and then later on the original values +** are restored. However, if this function returns non-zero, then it is +** guaranteed that a call to sqlite3session_changeset() will return a +** changeset containing zero changes. +*/ +SQLITE_API int sqlite3session_isempty(sqlite3_session *pSession); + +/* +** CAPI3REF: Create An Iterator To Traverse A Changeset +** +** Create an iterator used to iterate through the contents of a changeset. +** If successful, *pp is set to point to the iterator handle and SQLITE_OK +** is returned. Otherwise, if an error occurs, *pp is set to zero and an +** SQLite error code is returned. +** +** The following functions can be used to advance and query a changeset +** iterator created by this function: +** +**
        +**
      • [sqlite3changeset_next()] +**
      • [sqlite3changeset_op()] +**
      • [sqlite3changeset_new()] +**
      • [sqlite3changeset_old()] +**
      +** +** It is the responsibility of the caller to eventually destroy the iterator +** by passing it to [sqlite3changeset_finalize()]. The buffer containing the +** changeset (pChangeset) must remain valid until after the iterator is +** destroyed. +** +** Assuming the changeset blob was created by one of the +** [sqlite3session_changeset()], [sqlite3changeset_concat()] or +** [sqlite3changeset_invert()] functions, all changes within the changeset +** that apply to a single table are grouped together. This means that when +** an application iterates through a changeset using an iterator created by +** this function, all changes that relate to a single table are visited +** consecutively. There is no chance that the iterator will visit a change +** the applies to table X, then one for table Y, and then later on visit +** another change for table X. +*/ +SQLITE_API int sqlite3changeset_start( + sqlite3_changeset_iter **pp, /* OUT: New changeset iterator handle */ + int nChangeset, /* Size of changeset blob in bytes */ + void *pChangeset /* Pointer to blob containing changeset */ +); + + +/* +** CAPI3REF: Advance A Changeset Iterator +** +** This function may only be used with iterators created by function +** [sqlite3changeset_start()]. If it is called on an iterator passed to +** a conflict-handler callback by [sqlite3changeset_apply()], SQLITE_MISUSE +** is returned and the call has no effect. +** +** Immediately after an iterator is created by sqlite3changeset_start(), it +** does not point to any change in the changeset. Assuming the changeset +** is not empty, the first call to this function advances the iterator to +** point to the first change in the changeset. Each subsequent call advances +** the iterator to point to the next change in the changeset (if any). If +** no error occurs and the iterator points to a valid change after a call +** to sqlite3changeset_next() has advanced it, SQLITE_ROW is returned. +** Otherwise, if all changes in the changeset have already been visited, +** SQLITE_DONE is returned. +** +** If an error occurs, an SQLite error code is returned. Possible error +** codes include SQLITE_CORRUPT (if the changeset buffer is corrupt) or +** SQLITE_NOMEM. +*/ +SQLITE_API int sqlite3changeset_next(sqlite3_changeset_iter *pIter); + +/* +** CAPI3REF: Obtain The Current Operation From A Changeset Iterator +** +** The pIter argument passed to this function may either be an iterator +** passed to a conflict-handler by [sqlite3changeset_apply()], or an iterator +** created by [sqlite3changeset_start()]. In the latter case, the most recent +** call to [sqlite3changeset_next()] must have returned [SQLITE_ROW]. If this +** is not the case, this function returns [SQLITE_MISUSE]. +** +** If argument pzTab is not NULL, then *pzTab is set to point to a +** nul-terminated utf-8 encoded string containing the name of the table +** affected by the current change. The buffer remains valid until either +** sqlite3changeset_next() is called on the iterator or until the +** conflict-handler function returns. If pnCol is not NULL, then *pnCol is +** set to the number of columns in the table affected by the change. If +** pbIncorrect is not NULL, then *pbIndirect is set to true (1) if the change +** is an indirect change, or false (0) otherwise. See the documentation for +** [sqlite3session_indirect()] for a description of direct and indirect +** changes. Finally, if pOp is not NULL, then *pOp is set to one of +** [SQLITE_INSERT], [SQLITE_DELETE] or [SQLITE_UPDATE], depending on the +** type of change that the iterator currently points to. +** +** If no error occurs, SQLITE_OK is returned. If an error does occur, an +** SQLite error code is returned. The values of the output variables may not +** be trusted in this case. +*/ +SQLITE_API int sqlite3changeset_op( + sqlite3_changeset_iter *pIter, /* Iterator object */ + const char **pzTab, /* OUT: Pointer to table name */ + int *pnCol, /* OUT: Number of columns in table */ + int *pOp, /* OUT: SQLITE_INSERT, DELETE or UPDATE */ + int *pbIndirect /* OUT: True for an 'indirect' change */ +); + +/* +** CAPI3REF: Obtain The Primary Key Definition Of A Table +** +** For each modified table, a changeset includes the following: +** +**
        +**
      • The number of columns in the table, and +**
      • Which of those columns make up the tables PRIMARY KEY. +**
      +** +** This function is used to find which columns comprise the PRIMARY KEY of +** the table modified by the change that iterator pIter currently points to. +** If successful, *pabPK is set to point to an array of nCol entries, where +** nCol is the number of columns in the table. Elements of *pabPK are set to +** 0x01 if the corresponding column is part of the tables primary key, or +** 0x00 if it is not. +** +** If argument pnCol is not NULL, then *pnCol is set to the number of columns +** in the table. +** +** If this function is called when the iterator does not point to a valid +** entry, SQLITE_MISUSE is returned and the output variables zeroed. Otherwise, +** SQLITE_OK is returned and the output variables populated as described +** above. +*/ +SQLITE_API int sqlite3changeset_pk( + sqlite3_changeset_iter *pIter, /* Iterator object */ + unsigned char **pabPK, /* OUT: Array of boolean - true for PK cols */ + int *pnCol /* OUT: Number of entries in output array */ +); + +/* +** CAPI3REF: Obtain old.* Values From A Changeset Iterator +** +** The pIter argument passed to this function may either be an iterator +** passed to a conflict-handler by [sqlite3changeset_apply()], or an iterator +** created by [sqlite3changeset_start()]. In the latter case, the most recent +** call to [sqlite3changeset_next()] must have returned SQLITE_ROW. +** Furthermore, it may only be called if the type of change that the iterator +** currently points to is either [SQLITE_DELETE] or [SQLITE_UPDATE]. Otherwise, +** this function returns [SQLITE_MISUSE] and sets *ppValue to NULL. +** +** Argument iVal must be greater than or equal to 0, and less than the number +** of columns in the table affected by the current change. Otherwise, +** [SQLITE_RANGE] is returned and *ppValue is set to NULL. +** +** If successful, this function sets *ppValue to point to a protected +** sqlite3_value object containing the iVal'th value from the vector of +** original row values stored as part of the UPDATE or DELETE change and +** returns SQLITE_OK. The name of the function comes from the fact that this +** is similar to the "old.*" columns available to update or delete triggers. +** +** If some other error occurs (e.g. an OOM condition), an SQLite error code +** is returned and *ppValue is set to NULL. +*/ +SQLITE_API int sqlite3changeset_old( + sqlite3_changeset_iter *pIter, /* Changeset iterator */ + int iVal, /* Column number */ + sqlite3_value **ppValue /* OUT: Old value (or NULL pointer) */ +); + +/* +** CAPI3REF: Obtain new.* Values From A Changeset Iterator +** +** The pIter argument passed to this function may either be an iterator +** passed to a conflict-handler by [sqlite3changeset_apply()], or an iterator +** created by [sqlite3changeset_start()]. In the latter case, the most recent +** call to [sqlite3changeset_next()] must have returned SQLITE_ROW. +** Furthermore, it may only be called if the type of change that the iterator +** currently points to is either [SQLITE_UPDATE] or [SQLITE_INSERT]. Otherwise, +** this function returns [SQLITE_MISUSE] and sets *ppValue to NULL. +** +** Argument iVal must be greater than or equal to 0, and less than the number +** of columns in the table affected by the current change. Otherwise, +** [SQLITE_RANGE] is returned and *ppValue is set to NULL. +** +** If successful, this function sets *ppValue to point to a protected +** sqlite3_value object containing the iVal'th value from the vector of +** new row values stored as part of the UPDATE or INSERT change and +** returns SQLITE_OK. If the change is an UPDATE and does not include +** a new value for the requested column, *ppValue is set to NULL and +** SQLITE_OK returned. The name of the function comes from the fact that +** this is similar to the "new.*" columns available to update or delete +** triggers. +** +** If some other error occurs (e.g. an OOM condition), an SQLite error code +** is returned and *ppValue is set to NULL. +*/ +SQLITE_API int sqlite3changeset_new( + sqlite3_changeset_iter *pIter, /* Changeset iterator */ + int iVal, /* Column number */ + sqlite3_value **ppValue /* OUT: New value (or NULL pointer) */ +); + +/* +** CAPI3REF: Obtain Conflicting Row Values From A Changeset Iterator +** +** This function should only be used with iterator objects passed to a +** conflict-handler callback by [sqlite3changeset_apply()] with either +** [SQLITE_CHANGESET_DATA] or [SQLITE_CHANGESET_CONFLICT]. If this function +** is called on any other iterator, [SQLITE_MISUSE] is returned and *ppValue +** is set to NULL. +** +** Argument iVal must be greater than or equal to 0, and less than the number +** of columns in the table affected by the current change. Otherwise, +** [SQLITE_RANGE] is returned and *ppValue is set to NULL. +** +** If successful, this function sets *ppValue to point to a protected +** sqlite3_value object containing the iVal'th value from the +** "conflicting row" associated with the current conflict-handler callback +** and returns SQLITE_OK. +** +** If some other error occurs (e.g. an OOM condition), an SQLite error code +** is returned and *ppValue is set to NULL. +*/ +SQLITE_API int sqlite3changeset_conflict( + sqlite3_changeset_iter *pIter, /* Changeset iterator */ + int iVal, /* Column number */ + sqlite3_value **ppValue /* OUT: Value from conflicting row */ +); + +/* +** CAPI3REF: Determine The Number Of Foreign Key Constraint Violations +** +** This function may only be called with an iterator passed to an +** SQLITE_CHANGESET_FOREIGN_KEY conflict handler callback. In this case +** it sets the output variable to the total number of known foreign key +** violations in the destination database and returns SQLITE_OK. +** +** In all other cases this function returns SQLITE_MISUSE. +*/ +SQLITE_API int sqlite3changeset_fk_conflicts( + sqlite3_changeset_iter *pIter, /* Changeset iterator */ + int *pnOut /* OUT: Number of FK violations */ +); + + +/* +** CAPI3REF: Finalize A Changeset Iterator +** +** This function is used to finalize an iterator allocated with +** [sqlite3changeset_start()]. +** +** This function should only be called on iterators created using the +** [sqlite3changeset_start()] function. If an application calls this +** function with an iterator passed to a conflict-handler by +** [sqlite3changeset_apply()], [SQLITE_MISUSE] is immediately returned and the +** call has no effect. +** +** If an error was encountered within a call to an sqlite3changeset_xxx() +** function (for example an [SQLITE_CORRUPT] in [sqlite3changeset_next()] or an +** [SQLITE_NOMEM] in [sqlite3changeset_new()]) then an error code corresponding +** to that error is returned by this function. Otherwise, SQLITE_OK is +** returned. This is to allow the following pattern (pseudo-code): +** +** sqlite3changeset_start(); +** while( SQLITE_ROW==sqlite3changeset_next() ){ +** // Do something with change. +** } +** rc = sqlite3changeset_finalize(); +** if( rc!=SQLITE_OK ){ +** // An error has occurred +** } +*/ +SQLITE_API int sqlite3changeset_finalize(sqlite3_changeset_iter *pIter); + +/* +** CAPI3REF: Invert A Changeset +** +** This function is used to "invert" a changeset object. Applying an inverted +** changeset to a database reverses the effects of applying the uninverted +** changeset. Specifically: +** +**
        +**
      • Each DELETE change is changed to an INSERT, and +**
      • Each INSERT change is changed to a DELETE, and +**
      • For each UPDATE change, the old.* and new.* values are exchanged. +**
      +** +** This function does not change the order in which changes appear within +** the changeset. It merely reverses the sense of each individual change. +** +** If successful, a pointer to a buffer containing the inverted changeset +** is stored in *ppOut, the size of the same buffer is stored in *pnOut, and +** SQLITE_OK is returned. If an error occurs, both *pnOut and *ppOut are +** zeroed and an SQLite error code returned. +** +** It is the responsibility of the caller to eventually call sqlite3_free() +** on the *ppOut pointer to free the buffer allocation following a successful +** call to this function. +** +** WARNING/TODO: This function currently assumes that the input is a valid +** changeset. If it is not, the results are undefined. +*/ +SQLITE_API int sqlite3changeset_invert( + int nIn, const void *pIn, /* Input changeset */ + int *pnOut, void **ppOut /* OUT: Inverse of input */ +); + +/* +** CAPI3REF: Concatenate Two Changeset Objects +** +** This function is used to concatenate two changesets, A and B, into a +** single changeset. The result is a changeset equivalent to applying +** changeset A followed by changeset B. +** +** This function combines the two input changesets using an +** sqlite3_changegroup object. Calling it produces similar results as the +** following code fragment: +** +** sqlite3_changegroup *pGrp; +** rc = sqlite3_changegroup_new(&pGrp); +** if( rc==SQLITE_OK ) rc = sqlite3changegroup_add(pGrp, nA, pA); +** if( rc==SQLITE_OK ) rc = sqlite3changegroup_add(pGrp, nB, pB); +** if( rc==SQLITE_OK ){ +** rc = sqlite3changegroup_output(pGrp, pnOut, ppOut); +** }else{ +** *ppOut = 0; +** *pnOut = 0; +** } +** +** Refer to the sqlite3_changegroup documentation below for details. +*/ +SQLITE_API int sqlite3changeset_concat( + int nA, /* Number of bytes in buffer pA */ + void *pA, /* Pointer to buffer containing changeset A */ + int nB, /* Number of bytes in buffer pB */ + void *pB, /* Pointer to buffer containing changeset B */ + int *pnOut, /* OUT: Number of bytes in output changeset */ + void **ppOut /* OUT: Buffer containing output changeset */ +); + + +/* +** CAPI3REF: Changegroup Handle +*/ +typedef struct sqlite3_changegroup sqlite3_changegroup; + +/* +** CAPI3REF: Create A New Changegroup Object +** +** An sqlite3_changegroup object is used to combine two or more changesets +** (or patchsets) into a single changeset (or patchset). A single changegroup +** object may combine changesets or patchsets, but not both. The output is +** always in the same format as the input. +** +** If successful, this function returns SQLITE_OK and populates (*pp) with +** a pointer to a new sqlite3_changegroup object before returning. The caller +** should eventually free the returned object using a call to +** sqlite3changegroup_delete(). If an error occurs, an SQLite error code +** (i.e. SQLITE_NOMEM) is returned and *pp is set to NULL. +** +** The usual usage pattern for an sqlite3_changegroup object is as follows: +** +**
        +**
      • It is created using a call to sqlite3changegroup_new(). +** +**
      • Zero or more changesets (or patchsets) are added to the object +** by calling sqlite3changegroup_add(). +** +**
      • The result of combining all input changesets together is obtained +** by the application via a call to sqlite3changegroup_output(). +** +**
      • The object is deleted using a call to sqlite3changegroup_delete(). +**
      +** +** Any number of calls to add() and output() may be made between the calls to +** new() and delete(), and in any order. +** +** As well as the regular sqlite3changegroup_add() and +** sqlite3changegroup_output() functions, also available are the streaming +** versions sqlite3changegroup_add_strm() and sqlite3changegroup_output_strm(). +*/ +SQLITE_API int sqlite3changegroup_new(sqlite3_changegroup **pp); + +/* +** CAPI3REF: Add A Changeset To A Changegroup +** +** Add all changes within the changeset (or patchset) in buffer pData (size +** nData bytes) to the changegroup. +** +** If the buffer contains a patchset, then all prior calls to this function +** on the same changegroup object must also have specified patchsets. Or, if +** the buffer contains a changeset, so must have the earlier calls to this +** function. Otherwise, SQLITE_ERROR is returned and no changes are added +** to the changegroup. +** +** Rows within the changeset and changegroup are identified by the values in +** their PRIMARY KEY columns. A change in the changeset is considered to +** apply to the same row as a change already present in the changegroup if +** the two rows have the same primary key. +** +** Changes to rows that do not already appear in the changegroup are +** simply copied into it. Or, if both the new changeset and the changegroup +** contain changes that apply to a single row, the final contents of the +** changegroup depends on the type of each change, as follows: +** +** +** +** +**
      Existing Change New Change Output Change +**
      INSERT INSERT +** The new change is ignored. This case does not occur if the new +** changeset was recorded immediately after the changesets already +** added to the changegroup. +**
      INSERT UPDATE +** The INSERT change remains in the changegroup. The values in the +** INSERT change are modified as if the row was inserted by the +** existing change and then updated according to the new change. +**
      INSERT DELETE +** The existing INSERT is removed from the changegroup. The DELETE is +** not added. +**
      UPDATE INSERT +** The new change is ignored. This case does not occur if the new +** changeset was recorded immediately after the changesets already +** added to the changegroup. +**
      UPDATE UPDATE +** The existing UPDATE remains within the changegroup. It is amended +** so that the accompanying values are as if the row was updated once +** by the existing change and then again by the new change. +**
      UPDATE DELETE +** The existing UPDATE is replaced by the new DELETE within the +** changegroup. +**
      DELETE INSERT +** If one or more of the column values in the row inserted by the +** new change differ from those in the row deleted by the existing +** change, the existing DELETE is replaced by an UPDATE within the +** changegroup. Otherwise, if the inserted row is exactly the same +** as the deleted row, the existing DELETE is simply discarded. +**
      DELETE UPDATE +** The new change is ignored. This case does not occur if the new +** changeset was recorded immediately after the changesets already +** added to the changegroup. +**
      DELETE DELETE +** The new change is ignored. This case does not occur if the new +** changeset was recorded immediately after the changesets already +** added to the changegroup. +**
      +** +** If the new changeset contains changes to a table that is already present +** in the changegroup, then the number of columns and the position of the +** primary key columns for the table must be consistent. If this is not the +** case, this function fails with SQLITE_SCHEMA. If the input changeset +** appears to be corrupt and the corruption is detected, SQLITE_CORRUPT is +** returned. Or, if an out-of-memory condition occurs during processing, this +** function returns SQLITE_NOMEM. In all cases, if an error occurs the +** final contents of the changegroup is undefined. +** +** If no error occurs, SQLITE_OK is returned. +*/ +SQLITE_API int sqlite3changegroup_add(sqlite3_changegroup*, int nData, void *pData); + +/* +** CAPI3REF: Obtain A Composite Changeset From A Changegroup +** +** Obtain a buffer containing a changeset (or patchset) representing the +** current contents of the changegroup. If the inputs to the changegroup +** were themselves changesets, the output is a changeset. Or, if the +** inputs were patchsets, the output is also a patchset. +** +** As with the output of the sqlite3session_changeset() and +** sqlite3session_patchset() functions, all changes related to a single +** table are grouped together in the output of this function. Tables appear +** in the same order as for the very first changeset added to the changegroup. +** If the second or subsequent changesets added to the changegroup contain +** changes for tables that do not appear in the first changeset, they are +** appended onto the end of the output changeset, again in the order in +** which they are first encountered. +** +** If an error occurs, an SQLite error code is returned and the output +** variables (*pnData) and (*ppData) are set to 0. Otherwise, SQLITE_OK +** is returned and the output variables are set to the size of and a +** pointer to the output buffer, respectively. In this case it is the +** responsibility of the caller to eventually free the buffer using a +** call to sqlite3_free(). +*/ +SQLITE_API int sqlite3changegroup_output( + sqlite3_changegroup*, + int *pnData, /* OUT: Size of output buffer in bytes */ + void **ppData /* OUT: Pointer to output buffer */ +); + +/* +** CAPI3REF: Delete A Changegroup Object +*/ +SQLITE_API void sqlite3changegroup_delete(sqlite3_changegroup*); + +/* +** CAPI3REF: Apply A Changeset To A Database +** +** Apply a changeset to a database. This function attempts to update the +** "main" database attached to handle db with the changes found in the +** changeset passed via the second and third arguments. +** +** The fourth argument (xFilter) passed to this function is the "filter +** callback". If it is not NULL, then for each table affected by at least one +** change in the changeset, the filter callback is invoked with +** the table name as the second argument, and a copy of the context pointer +** passed as the sixth argument to this function as the first. If the "filter +** callback" returns zero, then no attempt is made to apply any changes to +** the table. Otherwise, if the return value is non-zero or the xFilter +** argument to this function is NULL, all changes related to the table are +** attempted. +** +** For each table that is not excluded by the filter callback, this function +** tests that the target database contains a compatible table. A table is +** considered compatible if all of the following are true: +** +**
        +**
      • The table has the same name as the name recorded in the +** changeset, and +**
      • The table has at least as many columns as recorded in the +** changeset, and +**
      • The table has primary key columns in the same position as +** recorded in the changeset. +**
      +** +** If there is no compatible table, it is not an error, but none of the +** changes associated with the table are applied. A warning message is issued +** via the sqlite3_log() mechanism with the error code SQLITE_SCHEMA. At most +** one such warning is issued for each table in the changeset. +** +** For each change for which there is a compatible table, an attempt is made +** to modify the table contents according to the UPDATE, INSERT or DELETE +** change. If a change cannot be applied cleanly, the conflict handler +** function passed as the fifth argument to sqlite3changeset_apply() may be +** invoked. A description of exactly when the conflict handler is invoked for +** each type of change is below. +** +** Unlike the xFilter argument, xConflict may not be passed NULL. The results +** of passing anything other than a valid function pointer as the xConflict +** argument are undefined. +** +** Each time the conflict handler function is invoked, it must return one +** of [SQLITE_CHANGESET_OMIT], [SQLITE_CHANGESET_ABORT] or +** [SQLITE_CHANGESET_REPLACE]. SQLITE_CHANGESET_REPLACE may only be returned +** if the second argument passed to the conflict handler is either +** SQLITE_CHANGESET_DATA or SQLITE_CHANGESET_CONFLICT. If the conflict-handler +** returns an illegal value, any changes already made are rolled back and +** the call to sqlite3changeset_apply() returns SQLITE_MISUSE. Different +** actions are taken by sqlite3changeset_apply() depending on the value +** returned by each invocation of the conflict-handler function. Refer to +** the documentation for the three +** [SQLITE_CHANGESET_OMIT|available return values] for details. +** +**
      +**
      DELETE Changes
      +** For each DELETE change, this function checks if the target database +** contains a row with the same primary key value (or values) as the +** original row values stored in the changeset. If it does, and the values +** stored in all non-primary key columns also match the values stored in +** the changeset the row is deleted from the target database. +** +** If a row with matching primary key values is found, but one or more of +** the non-primary key fields contains a value different from the original +** row value stored in the changeset, the conflict-handler function is +** invoked with [SQLITE_CHANGESET_DATA] as the second argument. If the +** database table has more columns than are recorded in the changeset, +** only the values of those non-primary key fields are compared against +** the current database contents - any trailing database table columns +** are ignored. +** +** If no row with matching primary key values is found in the database, +** the conflict-handler function is invoked with [SQLITE_CHANGESET_NOTFOUND] +** passed as the second argument. +** +** If the DELETE operation is attempted, but SQLite returns SQLITE_CONSTRAINT +** (which can only happen if a foreign key constraint is violated), the +** conflict-handler function is invoked with [SQLITE_CHANGESET_CONSTRAINT] +** passed as the second argument. This includes the case where the DELETE +** operation is attempted because an earlier call to the conflict handler +** function returned [SQLITE_CHANGESET_REPLACE]. +** +**
      INSERT Changes
      +** For each INSERT change, an attempt is made to insert the new row into +** the database. If the changeset row contains fewer fields than the +** database table, the trailing fields are populated with their default +** values. +** +** If the attempt to insert the row fails because the database already +** contains a row with the same primary key values, the conflict handler +** function is invoked with the second argument set to +** [SQLITE_CHANGESET_CONFLICT]. +** +** If the attempt to insert the row fails because of some other constraint +** violation (e.g. NOT NULL or UNIQUE), the conflict handler function is +** invoked with the second argument set to [SQLITE_CHANGESET_CONSTRAINT]. +** This includes the case where the INSERT operation is re-attempted because +** an earlier call to the conflict handler function returned +** [SQLITE_CHANGESET_REPLACE]. +** +**
      UPDATE Changes
      +** For each UPDATE change, this function checks if the target database +** contains a row with the same primary key value (or values) as the +** original row values stored in the changeset. If it does, and the values +** stored in all modified non-primary key columns also match the values +** stored in the changeset the row is updated within the target database. +** +** If a row with matching primary key values is found, but one or more of +** the modified non-primary key fields contains a value different from an +** original row value stored in the changeset, the conflict-handler function +** is invoked with [SQLITE_CHANGESET_DATA] as the second argument. Since +** UPDATE changes only contain values for non-primary key fields that are +** to be modified, only those fields need to match the original values to +** avoid the SQLITE_CHANGESET_DATA conflict-handler callback. +** +** If no row with matching primary key values is found in the database, +** the conflict-handler function is invoked with [SQLITE_CHANGESET_NOTFOUND] +** passed as the second argument. +** +** If the UPDATE operation is attempted, but SQLite returns +** SQLITE_CONSTRAINT, the conflict-handler function is invoked with +** [SQLITE_CHANGESET_CONSTRAINT] passed as the second argument. +** This includes the case where the UPDATE operation is attempted after +** an earlier call to the conflict handler function returned +** [SQLITE_CHANGESET_REPLACE]. +**
      +** +** It is safe to execute SQL statements, including those that write to the +** table that the callback related to, from within the xConflict callback. +** This can be used to further customize the applications conflict +** resolution strategy. +** +** All changes made by this function are enclosed in a savepoint transaction. +** If any other error (aside from a constraint failure when attempting to +** write to the target database) occurs, then the savepoint transaction is +** rolled back, restoring the target database to its original state, and an +** SQLite error code returned. +*/ +SQLITE_API int sqlite3changeset_apply( + sqlite3 *db, /* Apply change to "main" db of this handle */ + int nChangeset, /* Size of changeset in bytes */ + void *pChangeset, /* Changeset blob */ + int(*xFilter)( + void *pCtx, /* Copy of sixth arg to _apply() */ + const char *zTab /* Table name */ + ), + int(*xConflict)( + void *pCtx, /* Copy of sixth arg to _apply() */ + int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */ + sqlite3_changeset_iter *p /* Handle describing change and conflict */ + ), + void *pCtx /* First argument passed to xConflict */ +); + +/* +** CAPI3REF: Constants Passed To The Conflict Handler +** +** Values that may be passed as the second argument to a conflict-handler. +** +**
      +**
      SQLITE_CHANGESET_DATA
      +** The conflict handler is invoked with CHANGESET_DATA as the second argument +** when processing a DELETE or UPDATE change if a row with the required +** PRIMARY KEY fields is present in the database, but one or more other +** (non primary-key) fields modified by the update do not contain the +** expected "before" values. +** +** The conflicting row, in this case, is the database row with the matching +** primary key. +** +**
      SQLITE_CHANGESET_NOTFOUND
      +** The conflict handler is invoked with CHANGESET_NOTFOUND as the second +** argument when processing a DELETE or UPDATE change if a row with the +** required PRIMARY KEY fields is not present in the database. +** +** There is no conflicting row in this case. The results of invoking the +** sqlite3changeset_conflict() API are undefined. +** +**
      SQLITE_CHANGESET_CONFLICT
      +** CHANGESET_CONFLICT is passed as the second argument to the conflict +** handler while processing an INSERT change if the operation would result +** in duplicate primary key values. +** +** The conflicting row in this case is the database row with the matching +** primary key. +** +**
      SQLITE_CHANGESET_FOREIGN_KEY
      +** If foreign key handling is enabled, and applying a changeset leaves the +** database in a state containing foreign key violations, the conflict +** handler is invoked with CHANGESET_FOREIGN_KEY as the second argument +** exactly once before the changeset is committed. If the conflict handler +** returns CHANGESET_OMIT, the changes, including those that caused the +** foreign key constraint violation, are committed. Or, if it returns +** CHANGESET_ABORT, the changeset is rolled back. +** +** No current or conflicting row information is provided. The only function +** it is possible to call on the supplied sqlite3_changeset_iter handle +** is sqlite3changeset_fk_conflicts(). +** +**
      SQLITE_CHANGESET_CONSTRAINT
      +** If any other constraint violation occurs while applying a change (i.e. +** a UNIQUE, CHECK or NOT NULL constraint), the conflict handler is +** invoked with CHANGESET_CONSTRAINT as the second argument. +** +** There is no conflicting row in this case. The results of invoking the +** sqlite3changeset_conflict() API are undefined. +** +**
      +*/ +#define SQLITE_CHANGESET_DATA 1 +#define SQLITE_CHANGESET_NOTFOUND 2 +#define SQLITE_CHANGESET_CONFLICT 3 +#define SQLITE_CHANGESET_CONSTRAINT 4 +#define SQLITE_CHANGESET_FOREIGN_KEY 5 + +/* +** CAPI3REF: Constants Returned By The Conflict Handler +** +** A conflict handler callback must return one of the following three values. +** +**
      +**
      SQLITE_CHANGESET_OMIT
      +** If a conflict handler returns this value no special action is taken. The +** change that caused the conflict is not applied. The session module +** continues to the next change in the changeset. +** +**
      SQLITE_CHANGESET_REPLACE
      +** This value may only be returned if the second argument to the conflict +** handler was SQLITE_CHANGESET_DATA or SQLITE_CHANGESET_CONFLICT. If this +** is not the case, any changes applied so far are rolled back and the +** call to sqlite3changeset_apply() returns SQLITE_MISUSE. +** +** If CHANGESET_REPLACE is returned by an SQLITE_CHANGESET_DATA conflict +** handler, then the conflicting row is either updated or deleted, depending +** on the type of change. +** +** If CHANGESET_REPLACE is returned by an SQLITE_CHANGESET_CONFLICT conflict +** handler, then the conflicting row is removed from the database and a +** second attempt to apply the change is made. If this second attempt fails, +** the original row is restored to the database before continuing. +** +**
      SQLITE_CHANGESET_ABORT
      +** If this value is returned, any changes applied so far are rolled back +** and the call to sqlite3changeset_apply() returns SQLITE_ABORT. +**
      +*/ +#define SQLITE_CHANGESET_OMIT 0 +#define SQLITE_CHANGESET_REPLACE 1 +#define SQLITE_CHANGESET_ABORT 2 + +/* +** CAPI3REF: Streaming Versions of API functions. +** +** The six streaming API xxx_strm() functions serve similar purposes to the +** corresponding non-streaming API functions: +** +** +** +**
      Streaming functionNon-streaming equivalent
      sqlite3changeset_apply_strm[sqlite3changeset_apply] +**
      sqlite3changeset_concat_strm[sqlite3changeset_concat] +**
      sqlite3changeset_invert_strm[sqlite3changeset_invert] +**
      sqlite3changeset_start_strm[sqlite3changeset_start] +**
      sqlite3session_changeset_strm[sqlite3session_changeset] +**
      sqlite3session_patchset_strm[sqlite3session_patchset] +**
      +** +** Non-streaming functions that accept changesets (or patchsets) as input +** require that the entire changeset be stored in a single buffer in memory. +** Similarly, those that return a changeset or patchset do so by returning +** a pointer to a single large buffer allocated using sqlite3_malloc(). +** Normally this is convenient. However, if an application running in a +** low-memory environment is required to handle very large changesets, the +** large contiguous memory allocations required can become onerous. +** +** In order to avoid this problem, instead of a single large buffer, input +** is passed to a streaming API functions by way of a callback function that +** the sessions module invokes to incrementally request input data as it is +** required. In all cases, a pair of API function parameters such as +** +**
      +**        int nChangeset,
      +**        void *pChangeset,
      +**  
      +** +** Is replaced by: +** +**
      +**        int (*xInput)(void *pIn, void *pData, int *pnData),
      +**        void *pIn,
      +**  
      +** +** Each time the xInput callback is invoked by the sessions module, the first +** argument passed is a copy of the supplied pIn context pointer. The second +** argument, pData, points to a buffer (*pnData) bytes in size. Assuming no +** error occurs the xInput method should copy up to (*pnData) bytes of data +** into the buffer and set (*pnData) to the actual number of bytes copied +** before returning SQLITE_OK. If the input is completely exhausted, (*pnData) +** should be set to zero to indicate this. Or, if an error occurs, an SQLite +** error code should be returned. In all cases, if an xInput callback returns +** an error, all processing is abandoned and the streaming API function +** returns a copy of the error code to the caller. +** +** In the case of sqlite3changeset_start_strm(), the xInput callback may be +** invoked by the sessions module at any point during the lifetime of the +** iterator. If such an xInput callback returns an error, the iterator enters +** an error state, whereby all subsequent calls to iterator functions +** immediately fail with the same error code as returned by xInput. +** +** Similarly, streaming API functions that return changesets (or patchsets) +** return them in chunks by way of a callback function instead of via a +** pointer to a single large buffer. In this case, a pair of parameters such +** as: +** +**
      +**        int *pnChangeset,
      +**        void **ppChangeset,
      +**  
      +** +** Is replaced by: +** +**
      +**        int (*xOutput)(void *pOut, const void *pData, int nData),
      +**        void *pOut
      +**  
      +** +** The xOutput callback is invoked zero or more times to return data to +** the application. The first parameter passed to each call is a copy of the +** pOut pointer supplied by the application. The second parameter, pData, +** points to a buffer nData bytes in size containing the chunk of output +** data being returned. If the xOutput callback successfully processes the +** supplied data, it should return SQLITE_OK to indicate success. Otherwise, +** it should return some other SQLite error code. In this case processing +** is immediately abandoned and the streaming API function returns a copy +** of the xOutput error code to the application. +** +** The sessions module never invokes an xOutput callback with the third +** parameter set to a value less than or equal to zero. Other than this, +** no guarantees are made as to the size of the chunks of data returned. +*/ +SQLITE_API int sqlite3changeset_apply_strm( + sqlite3 *db, /* Apply change to "main" db of this handle */ + int (*xInput)(void *pIn, void *pData, int *pnData), /* Input function */ + void *pIn, /* First arg for xInput */ + int(*xFilter)( + void *pCtx, /* Copy of sixth arg to _apply() */ + const char *zTab /* Table name */ + ), + int(*xConflict)( + void *pCtx, /* Copy of sixth arg to _apply() */ + int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */ + sqlite3_changeset_iter *p /* Handle describing change and conflict */ + ), + void *pCtx /* First argument passed to xConflict */ +); +SQLITE_API int sqlite3changeset_concat_strm( + int (*xInputA)(void *pIn, void *pData, int *pnData), + void *pInA, + int (*xInputB)(void *pIn, void *pData, int *pnData), + void *pInB, + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut +); +SQLITE_API int sqlite3changeset_invert_strm( + int (*xInput)(void *pIn, void *pData, int *pnData), + void *pIn, + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut +); +SQLITE_API int sqlite3changeset_start_strm( + sqlite3_changeset_iter **pp, + int (*xInput)(void *pIn, void *pData, int *pnData), + void *pIn +); +SQLITE_API int sqlite3session_changeset_strm( + sqlite3_session *pSession, + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut +); +SQLITE_API int sqlite3session_patchset_strm( + sqlite3_session *pSession, + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut +); +SQLITE_API int sqlite3changegroup_add_strm(sqlite3_changegroup*, + int (*xInput)(void *pIn, void *pData, int *pnData), + void *pIn +); +SQLITE_API int sqlite3changegroup_output_strm(sqlite3_changegroup*, + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut +); + + +/* +** Make sure we can call this stuff from C++. +*/ +#ifdef __cplusplus +} +#endif + +#endif /* !defined(__SQLITESESSION_H_) && defined(SQLITE_ENABLE_SESSION) */ + +/******** End of sqlite3session.h *********/ +/******** Begin file fts5.h *********/ +/* +** 2014 May 31 +** +** 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. +** +****************************************************************************** +** +** Interfaces to extend FTS5. Using the interfaces defined in this file, +** FTS5 may be extended with: +** +** * custom tokenizers, and +** * custom auxiliary functions. +*/ + + +#ifndef _FTS5_H +#define _FTS5_H + + +#ifdef __cplusplus +extern "C" { +#endif + +/************************************************************************* +** CUSTOM AUXILIARY FUNCTIONS +** +** Virtual table implementations may overload SQL functions by implementing +** the sqlite3_module.xFindFunction() method. +*/ + +typedef struct Fts5ExtensionApi Fts5ExtensionApi; +typedef struct Fts5Context Fts5Context; +typedef struct Fts5PhraseIter Fts5PhraseIter; + +typedef void (*fts5_extension_function)( + const Fts5ExtensionApi *pApi, /* API offered by current FTS version */ + Fts5Context *pFts, /* First arg to pass to pApi functions */ + sqlite3_context *pCtx, /* Context for returning result/error */ + int nVal, /* Number of values in apVal[] array */ + sqlite3_value **apVal /* Array of trailing arguments */ +); + +struct Fts5PhraseIter { + const unsigned char *a; + const unsigned char *b; +}; + +/* +** EXTENSION API FUNCTIONS +** +** xUserData(pFts): +** Return a copy of the context pointer the extension function was +** registered with. +** +** xColumnTotalSize(pFts, iCol, pnToken): +** If parameter iCol is less than zero, set output variable *pnToken +** to the total number of tokens in the FTS5 table. Or, if iCol is +** non-negative but less than the number of columns in the table, return +** the total number of tokens in column iCol, considering all rows in +** the FTS5 table. +** +** If parameter iCol is greater than or equal to the number of columns +** in the table, SQLITE_RANGE is returned. Or, if an error occurs (e.g. +** an OOM condition or IO error), an appropriate SQLite error code is +** returned. +** +** xColumnCount(pFts): +** Return the number of columns in the table. +** +** xColumnSize(pFts, iCol, pnToken): +** If parameter iCol is less than zero, set output variable *pnToken +** to the total number of tokens in the current row. Or, if iCol is +** non-negative but less than the number of columns in the table, set +** *pnToken to the number of tokens in column iCol of the current row. +** +** If parameter iCol is greater than or equal to the number of columns +** in the table, SQLITE_RANGE is returned. Or, if an error occurs (e.g. +** an OOM condition or IO error), an appropriate SQLite error code is +** returned. +** +** This function may be quite inefficient if used with an FTS5 table +** created with the "columnsize=0" option. +** +** xColumnText: +** This function attempts to retrieve the text of column iCol of the +** current document. If successful, (*pz) is set to point to a buffer +** containing the text in utf-8 encoding, (*pn) is set to the size in bytes +** (not characters) of the buffer and SQLITE_OK is returned. Otherwise, +** if an error occurs, an SQLite error code is returned and the final values +** of (*pz) and (*pn) are undefined. +** +** xPhraseCount: +** Returns the number of phrases in the current query expression. +** +** xPhraseSize: +** Returns the number of tokens in phrase iPhrase of the query. Phrases +** are numbered starting from zero. +** +** xInstCount: +** Set *pnInst to the total number of occurrences of all phrases within +** the query within the current row. Return SQLITE_OK if successful, or +** an error code (i.e. SQLITE_NOMEM) if an error occurs. +** +** This API can be quite slow if used with an FTS5 table created with the +** "detail=none" or "detail=column" option. If the FTS5 table is created +** with either "detail=none" or "detail=column" and "content=" option +** (i.e. if it is a contentless table), then this API always returns 0. +** +** xInst: +** Query for the details of phrase match iIdx within the current row. +** Phrase matches are numbered starting from zero, so the iIdx argument +** should be greater than or equal to zero and smaller than the value +** output by xInstCount(). +** +** Usually, output parameter *piPhrase is set to the phrase number, *piCol +** to the column in which it occurs and *piOff the token offset of the +** first token of the phrase. The exception is if the table was created +** with the offsets=0 option specified. In this case *piOff is always +** set to -1. +** +** Returns SQLITE_OK if successful, or an error code (i.e. SQLITE_NOMEM) +** if an error occurs. +** +** This API can be quite slow if used with an FTS5 table created with the +** "detail=none" or "detail=column" option. +** +** xRowid: +** Returns the rowid of the current row. +** +** xTokenize: +** Tokenize text using the tokenizer belonging to the FTS5 table. +** +** xQueryPhrase(pFts5, iPhrase, pUserData, xCallback): +** This API function is used to query the FTS table for phrase iPhrase +** of the current query. Specifically, a query equivalent to: +** +** ... FROM ftstable WHERE ftstable MATCH $p ORDER BY rowid +** +** with $p set to a phrase equivalent to the phrase iPhrase of the +** current query is executed. Any column filter that applies to +** phrase iPhrase of the current query is included in $p. For each +** row visited, the callback function passed as the fourth argument +** is invoked. The context and API objects passed to the callback +** function may be used to access the properties of each matched row. +** Invoking Api.xUserData() returns a copy of the pointer passed as +** the third argument to pUserData. +** +** If the callback function returns any value other than SQLITE_OK, the +** query is abandoned and the xQueryPhrase function returns immediately. +** If the returned value is SQLITE_DONE, xQueryPhrase returns SQLITE_OK. +** Otherwise, the error code is propagated upwards. +** +** If the query runs to completion without incident, SQLITE_OK is returned. +** Or, if some error occurs before the query completes or is aborted by +** the callback, an SQLite error code is returned. +** +** +** xSetAuxdata(pFts5, pAux, xDelete) +** +** Save the pointer passed as the second argument as the extension functions +** "auxiliary data". The pointer may then be retrieved by the current or any +** future invocation of the same fts5 extension function made as part of +** of the same MATCH query using the xGetAuxdata() API. +** +** Each extension function is allocated a single auxiliary data slot for +** each FTS query (MATCH expression). If the extension function is invoked +** more than once for a single FTS query, then all invocations share a +** single auxiliary data context. +** +** If there is already an auxiliary data pointer when this function is +** invoked, then it is replaced by the new pointer. If an xDelete callback +** was specified along with the original pointer, it is invoked at this +** point. +** +** The xDelete callback, if one is specified, is also invoked on the +** auxiliary data pointer after the FTS5 query has finished. +** +** If an error (e.g. an OOM condition) occurs within this function, an +** the auxiliary data is set to NULL and an error code returned. If the +** xDelete parameter was not NULL, it is invoked on the auxiliary data +** pointer before returning. +** +** +** xGetAuxdata(pFts5, bClear) +** +** Returns the current auxiliary data pointer for the fts5 extension +** function. See the xSetAuxdata() method for details. +** +** If the bClear argument is non-zero, then the auxiliary data is cleared +** (set to NULL) before this function returns. In this case the xDelete, +** if any, is not invoked. +** +** +** xRowCount(pFts5, pnRow) +** +** This function is used to retrieve the total number of rows in the table. +** In other words, the same value that would be returned by: +** +** SELECT count(*) FROM ftstable; +** +** xPhraseFirst() +** This function is used, along with type Fts5PhraseIter and the xPhraseNext +** method, to iterate through all instances of a single query phrase within +** the current row. This is the same information as is accessible via the +** xInstCount/xInst APIs. While the xInstCount/xInst APIs are more convenient +** to use, this API may be faster under some circumstances. To iterate +** through instances of phrase iPhrase, use the following code: +** +** Fts5PhraseIter iter; +** int iCol, iOff; +** for(pApi->xPhraseFirst(pFts, iPhrase, &iter, &iCol, &iOff); +** iCol>=0; +** pApi->xPhraseNext(pFts, &iter, &iCol, &iOff) +** ){ +** // An instance of phrase iPhrase at offset iOff of column iCol +** } +** +** The Fts5PhraseIter structure is defined above. Applications should not +** modify this structure directly - it should only be used as shown above +** with the xPhraseFirst() and xPhraseNext() API methods (and by +** xPhraseFirstColumn() and xPhraseNextColumn() as illustrated below). +** +** This API can be quite slow if used with an FTS5 table created with the +** "detail=none" or "detail=column" option. If the FTS5 table is created +** with either "detail=none" or "detail=column" and "content=" option +** (i.e. if it is a contentless table), then this API always iterates +** through an empty set (all calls to xPhraseFirst() set iCol to -1). +** +** xPhraseNext() +** See xPhraseFirst above. +** +** xPhraseFirstColumn() +** This function and xPhraseNextColumn() are similar to the xPhraseFirst() +** and xPhraseNext() APIs described above. The difference is that instead +** of iterating through all instances of a phrase in the current row, these +** APIs are used to iterate through the set of columns in the current row +** that contain one or more instances of a specified phrase. For example: +** +** Fts5PhraseIter iter; +** int iCol; +** for(pApi->xPhraseFirstColumn(pFts, iPhrase, &iter, &iCol); +** iCol>=0; +** pApi->xPhraseNextColumn(pFts, &iter, &iCol) +** ){ +** // Column iCol contains at least one instance of phrase iPhrase +** } +** +** This API can be quite slow if used with an FTS5 table created with the +** "detail=none" option. If the FTS5 table is created with either +** "detail=none" "content=" option (i.e. if it is a contentless table), +** then this API always iterates through an empty set (all calls to +** xPhraseFirstColumn() set iCol to -1). +** +** The information accessed using this API and its companion +** xPhraseFirstColumn() may also be obtained using xPhraseFirst/xPhraseNext +** (or xInst/xInstCount). The chief advantage of this API is that it is +** significantly more efficient than those alternatives when used with +** "detail=column" tables. +** +** xPhraseNextColumn() +** See xPhraseFirstColumn above. +*/ +struct Fts5ExtensionApi { + int iVersion; /* Currently always set to 3 */ + + void *(*xUserData)(Fts5Context*); + + int (*xColumnCount)(Fts5Context*); + int (*xRowCount)(Fts5Context*, sqlite3_int64 *pnRow); + int (*xColumnTotalSize)(Fts5Context*, int iCol, sqlite3_int64 *pnToken); + + int (*xTokenize)(Fts5Context*, + const char *pText, int nText, /* Text to tokenize */ + void *pCtx, /* Context passed to xToken() */ + int (*xToken)(void*, int, const char*, int, int, int) /* Callback */ + ); + + int (*xPhraseCount)(Fts5Context*); + int (*xPhraseSize)(Fts5Context*, int iPhrase); + + int (*xInstCount)(Fts5Context*, int *pnInst); + int (*xInst)(Fts5Context*, int iIdx, int *piPhrase, int *piCol, int *piOff); + + sqlite3_int64 (*xRowid)(Fts5Context*); + int (*xColumnText)(Fts5Context*, int iCol, const char **pz, int *pn); + int (*xColumnSize)(Fts5Context*, int iCol, int *pnToken); + + int (*xQueryPhrase)(Fts5Context*, int iPhrase, void *pUserData, + int(*)(const Fts5ExtensionApi*,Fts5Context*,void*) + ); + int (*xSetAuxdata)(Fts5Context*, void *pAux, void(*xDelete)(void*)); + void *(*xGetAuxdata)(Fts5Context*, int bClear); + + int (*xPhraseFirst)(Fts5Context*, int iPhrase, Fts5PhraseIter*, int*, int*); + void (*xPhraseNext)(Fts5Context*, Fts5PhraseIter*, int *piCol, int *piOff); + + int (*xPhraseFirstColumn)(Fts5Context*, int iPhrase, Fts5PhraseIter*, int*); + void (*xPhraseNextColumn)(Fts5Context*, Fts5PhraseIter*, int *piCol); +}; + +/* +** CUSTOM AUXILIARY FUNCTIONS +*************************************************************************/ + +/************************************************************************* +** CUSTOM TOKENIZERS +** +** Applications may also register custom tokenizer types. A tokenizer +** is registered by providing fts5 with a populated instance of the +** following structure. All structure methods must be defined, setting +** any member of the fts5_tokenizer struct to NULL leads to undefined +** behaviour. The structure methods are expected to function as follows: +** +** xCreate: +** This function is used to allocate and initialize a tokenizer instance. +** A tokenizer instance is required to actually tokenize text. +** +** The first argument passed to this function is a copy of the (void*) +** pointer provided by the application when the fts5_tokenizer object +** was registered with FTS5 (the third argument to xCreateTokenizer()). +** The second and third arguments are an array of nul-terminated strings +** containing the tokenizer arguments, if any, specified following the +** tokenizer name as part of the CREATE VIRTUAL TABLE statement used +** to create the FTS5 table. +** +** The final argument is an output variable. If successful, (*ppOut) +** should be set to point to the new tokenizer handle and SQLITE_OK +** returned. If an error occurs, some value other than SQLITE_OK should +** be returned. In this case, fts5 assumes that the final value of *ppOut +** is undefined. +** +** xDelete: +** This function is invoked to delete a tokenizer handle previously +** allocated using xCreate(). Fts5 guarantees that this function will +** be invoked exactly once for each successful call to xCreate(). +** +** xTokenize: +** This function is expected to tokenize the nText byte string indicated +** by argument pText. pText may or may not be nul-terminated. The first +** argument passed to this function is a pointer to an Fts5Tokenizer object +** returned by an earlier call to xCreate(). +** +** The second argument indicates the reason that FTS5 is requesting +** tokenization of the supplied text. This is always one of the following +** four values: +** +**
      • FTS5_TOKENIZE_DOCUMENT - A document is being inserted into +** or removed from the FTS table. The tokenizer is being invoked to +** determine the set of tokens to add to (or delete from) the +** FTS index. +** +**
      • FTS5_TOKENIZE_QUERY - A MATCH query is being executed +** against the FTS index. The tokenizer is being called to tokenize +** a bareword or quoted string specified as part of the query. +** +**
      • (FTS5_TOKENIZE_QUERY | FTS5_TOKENIZE_PREFIX) - Same as +** FTS5_TOKENIZE_QUERY, except that the bareword or quoted string is +** followed by a "*" character, indicating that the last token +** returned by the tokenizer will be treated as a token prefix. +** +**
      • FTS5_TOKENIZE_AUX - The tokenizer is being invoked to +** satisfy an fts5_api.xTokenize() request made by an auxiliary +** function. Or an fts5_api.xColumnSize() request made by the same +** on a columnsize=0 database. +**
      +** +** For each token in the input string, the supplied callback xToken() must +** be invoked. The first argument to it should be a copy of the pointer +** passed as the second argument to xTokenize(). The third and fourth +** arguments are a pointer to a buffer containing the token text, and the +** size of the token in bytes. The 4th and 5th arguments are the byte offsets +** of the first byte of and first byte immediately following the text from +** which the token is derived within the input. +** +** The second argument passed to the xToken() callback ("tflags") should +** normally be set to 0. The exception is if the tokenizer supports +** synonyms. In this case see the discussion below for details. +** +** FTS5 assumes the xToken() callback is invoked for each token in the +** order that they occur within the input text. +** +** If an xToken() callback returns any value other than SQLITE_OK, then +** the tokenization should be abandoned and the xTokenize() method should +** immediately return a copy of the xToken() return value. Or, if the +** input buffer is exhausted, xTokenize() should return SQLITE_OK. Finally, +** if an error occurs with the xTokenize() implementation itself, it +** may abandon the tokenization and return any error code other than +** SQLITE_OK or SQLITE_DONE. +** +** SYNONYM SUPPORT +** +** Custom tokenizers may also support synonyms. Consider a case in which a +** user wishes to query for a phrase such as "first place". Using the +** built-in tokenizers, the FTS5 query 'first + place' will match instances +** of "first place" within the document set, but not alternative forms +** such as "1st place". In some applications, it would be better to match +** all instances of "first place" or "1st place" regardless of which form +** the user specified in the MATCH query text. +** +** There are several ways to approach this in FTS5: +** +**
      1. By mapping all synonyms to a single token. In this case, the +** In the above example, this means that the tokenizer returns the +** same token for inputs "first" and "1st". Say that token is in +** fact "first", so that when the user inserts the document "I won +** 1st place" entries are added to the index for tokens "i", "won", +** "first" and "place". If the user then queries for '1st + place', +** the tokenizer substitutes "first" for "1st" and the query works +** as expected. +** +**
      2. By adding multiple synonyms for a single term to the FTS index. +** In this case, when tokenizing query text, the tokenizer may +** provide multiple synonyms for a single term within the document. +** FTS5 then queries the index for each synonym individually. For +** example, faced with the query: +** +** +** ... MATCH 'first place' +** +** the tokenizer offers both "1st" and "first" as synonyms for the +** first token in the MATCH query and FTS5 effectively runs a query +** similar to: +** +** +** ... MATCH '(first OR 1st) place' +** +** except that, for the purposes of auxiliary functions, the query +** still appears to contain just two phrases - "(first OR 1st)" +** being treated as a single phrase. +** +**
      3. By adding multiple synonyms for a single term to the FTS index. +** Using this method, when tokenizing document text, the tokenizer +** provides multiple synonyms for each token. So that when a +** document such as "I won first place" is tokenized, entries are +** added to the FTS index for "i", "won", "first", "1st" and +** "place". +** +** This way, even if the tokenizer does not provide synonyms +** when tokenizing query text (it should not - to do would be +** inefficient), it doesn't matter if the user queries for +** 'first + place' or '1st + place', as there are entires in the +** FTS index corresponding to both forms of the first token. +**
      +** +** Whether it is parsing document or query text, any call to xToken that +** specifies a tflags argument with the FTS5_TOKEN_COLOCATED bit +** is considered to supply a synonym for the previous token. For example, +** when parsing the document "I won first place", a tokenizer that supports +** synonyms would call xToken() 5 times, as follows: +** +** +** xToken(pCtx, 0, "i", 1, 0, 1); +** xToken(pCtx, 0, "won", 3, 2, 5); +** xToken(pCtx, 0, "first", 5, 6, 11); +** xToken(pCtx, FTS5_TOKEN_COLOCATED, "1st", 3, 6, 11); +** xToken(pCtx, 0, "place", 5, 12, 17); +** +** +** It is an error to specify the FTS5_TOKEN_COLOCATED flag the first time +** xToken() is called. Multiple synonyms may be specified for a single token +** by making multiple calls to xToken(FTS5_TOKEN_COLOCATED) in sequence. +** There is no limit to the number of synonyms that may be provided for a +** single token. +** +** In many cases, method (1) above is the best approach. It does not add +** extra data to the FTS index or require FTS5 to query for multiple terms, +** so it is efficient in terms of disk space and query speed. However, it +** does not support prefix queries very well. If, as suggested above, the +** token "first" is subsituted for "1st" by the tokenizer, then the query: +** +** +** ... MATCH '1s*' +** +** will not match documents that contain the token "1st" (as the tokenizer +** will probably not map "1s" to any prefix of "first"). +** +** For full prefix support, method (3) may be preferred. In this case, +** because the index contains entries for both "first" and "1st", prefix +** queries such as 'fi*' or '1s*' will match correctly. However, because +** extra entries are added to the FTS index, this method uses more space +** within the database. +** +** Method (2) offers a midpoint between (1) and (3). Using this method, +** a query such as '1s*' will match documents that contain the literal +** token "1st", but not "first" (assuming the tokenizer is not able to +** provide synonyms for prefixes). However, a non-prefix query like '1st' +** will match against "1st" and "first". This method does not require +** extra disk space, as no extra entries are added to the FTS index. +** On the other hand, it may require more CPU cycles to run MATCH queries, +** as separate queries of the FTS index are required for each synonym. +** +** When using methods (2) or (3), it is important that the tokenizer only +** provide synonyms when tokenizing document text (method (2)) or query +** text (method (3)), not both. Doing so will not cause any errors, but is +** inefficient. +*/ +typedef struct Fts5Tokenizer Fts5Tokenizer; +typedef struct fts5_tokenizer fts5_tokenizer; +struct fts5_tokenizer { + int (*xCreate)(void*, const char **azArg, int nArg, Fts5Tokenizer **ppOut); + void (*xDelete)(Fts5Tokenizer*); + int (*xTokenize)(Fts5Tokenizer*, + void *pCtx, + int flags, /* Mask of FTS5_TOKENIZE_* flags */ + const char *pText, int nText, + int (*xToken)( + void *pCtx, /* Copy of 2nd argument to xTokenize() */ + int tflags, /* Mask of FTS5_TOKEN_* flags */ + const char *pToken, /* Pointer to buffer containing token */ + int nToken, /* Size of token in bytes */ + int iStart, /* Byte offset of token within input text */ + int iEnd /* Byte offset of end of token within input text */ + ) + ); +}; + +/* Flags that may be passed as the third argument to xTokenize() */ +#define FTS5_TOKENIZE_QUERY 0x0001 +#define FTS5_TOKENIZE_PREFIX 0x0002 +#define FTS5_TOKENIZE_DOCUMENT 0x0004 +#define FTS5_TOKENIZE_AUX 0x0008 + +/* Flags that may be passed by the tokenizer implementation back to FTS5 +** as the third argument to the supplied xToken callback. */ +#define FTS5_TOKEN_COLOCATED 0x0001 /* Same position as prev. token */ + +/* +** END OF CUSTOM TOKENIZERS +*************************************************************************/ + +/************************************************************************* +** FTS5 EXTENSION REGISTRATION API +*/ +typedef struct fts5_api fts5_api; +struct fts5_api { + int iVersion; /* Currently always set to 2 */ + + /* Create a new tokenizer */ + int (*xCreateTokenizer)( + fts5_api *pApi, + const char *zName, + void *pContext, + fts5_tokenizer *pTokenizer, + void (*xDestroy)(void*) + ); + + /* Find an existing tokenizer */ + int (*xFindTokenizer)( + fts5_api *pApi, + const char *zName, + void **ppContext, + fts5_tokenizer *pTokenizer + ); + + /* Create a new auxiliary function */ + int (*xCreateFunction)( + fts5_api *pApi, + const char *zName, + void *pContext, + fts5_extension_function xFunction, + void (*xDestroy)(void*) + ); +}; + +/* +** END OF REGISTRATION API +*************************************************************************/ + +#ifdef __cplusplus +} /* end of the 'extern "C"' block */ +#endif + +#endif /* _FTS5_H */ + +/******** End of fts5.h *********/ diff --git a/hdssd/external/solaris/sqlite-3.22.0/sqlite3ext.h b/hdssd/external/solaris/sqlite-3.22.0/sqlite3ext.h new file mode 100644 index 0000000..ac92a74 --- /dev/null +++ b/hdssd/external/solaris/sqlite-3.22.0/sqlite3ext.h @@ -0,0 +1,585 @@ +/* +** 2006 June 7 +** +** 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 header file defines the SQLite interface for use by +** shared libraries that want to be imported as extensions into +** an SQLite instance. Shared libraries that intend to be loaded +** as extensions by SQLite should #include this file instead of +** sqlite3.h. +*/ +#ifndef SQLITE3EXT_H +#define SQLITE3EXT_H +#include "sqlite3.h" + +/* +** The following structure holds pointers to all of the SQLite API +** routines. +** +** WARNING: In order to maintain backwards compatibility, add new +** interfaces to the end of this structure only. If you insert new +** interfaces in the middle of this structure, then older different +** versions of SQLite will not be able to load each other's shared +** libraries! +*/ +struct sqlite3_api_routines { + void * (*aggregate_context)(sqlite3_context*,int nBytes); + int (*aggregate_count)(sqlite3_context*); + int (*bind_blob)(sqlite3_stmt*,int,const void*,int n,void(*)(void*)); + int (*bind_double)(sqlite3_stmt*,int,double); + int (*bind_int)(sqlite3_stmt*,int,int); + int (*bind_int64)(sqlite3_stmt*,int,sqlite_int64); + int (*bind_null)(sqlite3_stmt*,int); + int (*bind_parameter_count)(sqlite3_stmt*); + int (*bind_parameter_index)(sqlite3_stmt*,const char*zName); + const char * (*bind_parameter_name)(sqlite3_stmt*,int); + int (*bind_text)(sqlite3_stmt*,int,const char*,int n,void(*)(void*)); + int (*bind_text16)(sqlite3_stmt*,int,const void*,int,void(*)(void*)); + int (*bind_value)(sqlite3_stmt*,int,const sqlite3_value*); + int (*busy_handler)(sqlite3*,int(*)(void*,int),void*); + int (*busy_timeout)(sqlite3*,int ms); + int (*changes)(sqlite3*); + int (*close)(sqlite3*); + int (*collation_needed)(sqlite3*,void*,void(*)(void*,sqlite3*, + int eTextRep,const char*)); + int (*collation_needed16)(sqlite3*,void*,void(*)(void*,sqlite3*, + int eTextRep,const void*)); + const void * (*column_blob)(sqlite3_stmt*,int iCol); + int (*column_bytes)(sqlite3_stmt*,int iCol); + int (*column_bytes16)(sqlite3_stmt*,int iCol); + int (*column_count)(sqlite3_stmt*pStmt); + const char * (*column_database_name)(sqlite3_stmt*,int); + const void * (*column_database_name16)(sqlite3_stmt*,int); + const char * (*column_decltype)(sqlite3_stmt*,int i); + const void * (*column_decltype16)(sqlite3_stmt*,int); + double (*column_double)(sqlite3_stmt*,int iCol); + int (*column_int)(sqlite3_stmt*,int iCol); + sqlite_int64 (*column_int64)(sqlite3_stmt*,int iCol); + const char * (*column_name)(sqlite3_stmt*,int); + const void * (*column_name16)(sqlite3_stmt*,int); + const char * (*column_origin_name)(sqlite3_stmt*,int); + const void * (*column_origin_name16)(sqlite3_stmt*,int); + const char * (*column_table_name)(sqlite3_stmt*,int); + const void * (*column_table_name16)(sqlite3_stmt*,int); + const unsigned char * (*column_text)(sqlite3_stmt*,int iCol); + const void * (*column_text16)(sqlite3_stmt*,int iCol); + int (*column_type)(sqlite3_stmt*,int iCol); + sqlite3_value* (*column_value)(sqlite3_stmt*,int iCol); + void * (*commit_hook)(sqlite3*,int(*)(void*),void*); + int (*complete)(const char*sql); + int (*complete16)(const void*sql); + int (*create_collation)(sqlite3*,const char*,int,void*, + int(*)(void*,int,const void*,int,const void*)); + int (*create_collation16)(sqlite3*,const void*,int,void*, + int(*)(void*,int,const void*,int,const void*)); + int (*create_function)(sqlite3*,const char*,int,int,void*, + void (*xFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*)); + int (*create_function16)(sqlite3*,const void*,int,int,void*, + void (*xFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*)); + int (*create_module)(sqlite3*,const char*,const sqlite3_module*,void*); + int (*data_count)(sqlite3_stmt*pStmt); + sqlite3 * (*db_handle)(sqlite3_stmt*); + int (*declare_vtab)(sqlite3*,const char*); + int (*enable_shared_cache)(int); + int (*errcode)(sqlite3*db); + const char * (*errmsg)(sqlite3*); + const void * (*errmsg16)(sqlite3*); + int (*exec)(sqlite3*,const char*,sqlite3_callback,void*,char**); + int (*expired)(sqlite3_stmt*); + int (*finalize)(sqlite3_stmt*pStmt); + void (*free)(void*); + void (*free_table)(char**result); + int (*get_autocommit)(sqlite3*); + void * (*get_auxdata)(sqlite3_context*,int); + int (*get_table)(sqlite3*,const char*,char***,int*,int*,char**); + int (*global_recover)(void); + void (*interruptx)(sqlite3*); + sqlite_int64 (*last_insert_rowid)(sqlite3*); + const char * (*libversion)(void); + int (*libversion_number)(void); + void *(*malloc)(int); + char * (*mprintf)(const char*,...); + int (*open)(const char*,sqlite3**); + int (*open16)(const void*,sqlite3**); + int (*prepare)(sqlite3*,const char*,int,sqlite3_stmt**,const char**); + int (*prepare16)(sqlite3*,const void*,int,sqlite3_stmt**,const void**); + void * (*profile)(sqlite3*,void(*)(void*,const char*,sqlite_uint64),void*); + void (*progress_handler)(sqlite3*,int,int(*)(void*),void*); + void *(*realloc)(void*,int); + int (*reset)(sqlite3_stmt*pStmt); + void (*result_blob)(sqlite3_context*,const void*,int,void(*)(void*)); + void (*result_double)(sqlite3_context*,double); + void (*result_error)(sqlite3_context*,const char*,int); + void (*result_error16)(sqlite3_context*,const void*,int); + void (*result_int)(sqlite3_context*,int); + void (*result_int64)(sqlite3_context*,sqlite_int64); + void (*result_null)(sqlite3_context*); + void (*result_text)(sqlite3_context*,const char*,int,void(*)(void*)); + void (*result_text16)(sqlite3_context*,const void*,int,void(*)(void*)); + void (*result_text16be)(sqlite3_context*,const void*,int,void(*)(void*)); + void (*result_text16le)(sqlite3_context*,const void*,int,void(*)(void*)); + void (*result_value)(sqlite3_context*,sqlite3_value*); + void * (*rollback_hook)(sqlite3*,void(*)(void*),void*); + int (*set_authorizer)(sqlite3*,int(*)(void*,int,const char*,const char*, + const char*,const char*),void*); + void (*set_auxdata)(sqlite3_context*,int,void*,void (*)(void*)); + char * (*xsnprintf)(int,char*,const char*,...); + int (*step)(sqlite3_stmt*); + int (*table_column_metadata)(sqlite3*,const char*,const char*,const char*, + char const**,char const**,int*,int*,int*); + void (*thread_cleanup)(void); + int (*total_changes)(sqlite3*); + void * (*trace)(sqlite3*,void(*xTrace)(void*,const char*),void*); + int (*transfer_bindings)(sqlite3_stmt*,sqlite3_stmt*); + void * (*update_hook)(sqlite3*,void(*)(void*,int ,char const*,char const*, + sqlite_int64),void*); + void * (*user_data)(sqlite3_context*); + const void * (*value_blob)(sqlite3_value*); + int (*value_bytes)(sqlite3_value*); + int (*value_bytes16)(sqlite3_value*); + double (*value_double)(sqlite3_value*); + int (*value_int)(sqlite3_value*); + sqlite_int64 (*value_int64)(sqlite3_value*); + int (*value_numeric_type)(sqlite3_value*); + const unsigned char * (*value_text)(sqlite3_value*); + const void * (*value_text16)(sqlite3_value*); + const void * (*value_text16be)(sqlite3_value*); + const void * (*value_text16le)(sqlite3_value*); + int (*value_type)(sqlite3_value*); + char *(*vmprintf)(const char*,va_list); + /* Added ??? */ + int (*overload_function)(sqlite3*, const char *zFuncName, int nArg); + /* Added by 3.3.13 */ + int (*prepare_v2)(sqlite3*,const char*,int,sqlite3_stmt**,const char**); + int (*prepare16_v2)(sqlite3*,const void*,int,sqlite3_stmt**,const void**); + int (*clear_bindings)(sqlite3_stmt*); + /* Added by 3.4.1 */ + int (*create_module_v2)(sqlite3*,const char*,const sqlite3_module*,void*, + void (*xDestroy)(void *)); + /* Added by 3.5.0 */ + int (*bind_zeroblob)(sqlite3_stmt*,int,int); + int (*blob_bytes)(sqlite3_blob*); + int (*blob_close)(sqlite3_blob*); + int (*blob_open)(sqlite3*,const char*,const char*,const char*,sqlite3_int64, + int,sqlite3_blob**); + int (*blob_read)(sqlite3_blob*,void*,int,int); + int (*blob_write)(sqlite3_blob*,const void*,int,int); + int (*create_collation_v2)(sqlite3*,const char*,int,void*, + int(*)(void*,int,const void*,int,const void*), + void(*)(void*)); + int (*file_control)(sqlite3*,const char*,int,void*); + sqlite3_int64 (*memory_highwater)(int); + sqlite3_int64 (*memory_used)(void); + sqlite3_mutex *(*mutex_alloc)(int); + void (*mutex_enter)(sqlite3_mutex*); + void (*mutex_free)(sqlite3_mutex*); + void (*mutex_leave)(sqlite3_mutex*); + int (*mutex_try)(sqlite3_mutex*); + int (*open_v2)(const char*,sqlite3**,int,const char*); + int (*release_memory)(int); + void (*result_error_nomem)(sqlite3_context*); + void (*result_error_toobig)(sqlite3_context*); + int (*sleep)(int); + void (*soft_heap_limit)(int); + sqlite3_vfs *(*vfs_find)(const char*); + int (*vfs_register)(sqlite3_vfs*,int); + int (*vfs_unregister)(sqlite3_vfs*); + int (*xthreadsafe)(void); + void (*result_zeroblob)(sqlite3_context*,int); + void (*result_error_code)(sqlite3_context*,int); + int (*test_control)(int, ...); + void (*randomness)(int,void*); + sqlite3 *(*context_db_handle)(sqlite3_context*); + int (*extended_result_codes)(sqlite3*,int); + int (*limit)(sqlite3*,int,int); + sqlite3_stmt *(*next_stmt)(sqlite3*,sqlite3_stmt*); + const char *(*sql)(sqlite3_stmt*); + int (*status)(int,int*,int*,int); + int (*backup_finish)(sqlite3_backup*); + sqlite3_backup *(*backup_init)(sqlite3*,const char*,sqlite3*,const char*); + int (*backup_pagecount)(sqlite3_backup*); + int (*backup_remaining)(sqlite3_backup*); + int (*backup_step)(sqlite3_backup*,int); + const char *(*compileoption_get)(int); + int (*compileoption_used)(const char*); + int (*create_function_v2)(sqlite3*,const char*,int,int,void*, + void (*xFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*), + void(*xDestroy)(void*)); + int (*db_config)(sqlite3*,int,...); + sqlite3_mutex *(*db_mutex)(sqlite3*); + int (*db_status)(sqlite3*,int,int*,int*,int); + int (*extended_errcode)(sqlite3*); + void (*log)(int,const char*,...); + sqlite3_int64 (*soft_heap_limit64)(sqlite3_int64); + const char *(*sourceid)(void); + int (*stmt_status)(sqlite3_stmt*,int,int); + int (*strnicmp)(const char*,const char*,int); + int (*unlock_notify)(sqlite3*,void(*)(void**,int),void*); + int (*wal_autocheckpoint)(sqlite3*,int); + int (*wal_checkpoint)(sqlite3*,const char*); + void *(*wal_hook)(sqlite3*,int(*)(void*,sqlite3*,const char*,int),void*); + int (*blob_reopen)(sqlite3_blob*,sqlite3_int64); + int (*vtab_config)(sqlite3*,int op,...); + int (*vtab_on_conflict)(sqlite3*); + /* Version 3.7.16 and later */ + int (*close_v2)(sqlite3*); + const char *(*db_filename)(sqlite3*,const char*); + int (*db_readonly)(sqlite3*,const char*); + int (*db_release_memory)(sqlite3*); + const char *(*errstr)(int); + int (*stmt_busy)(sqlite3_stmt*); + int (*stmt_readonly)(sqlite3_stmt*); + int (*stricmp)(const char*,const char*); + int (*uri_boolean)(const char*,const char*,int); + sqlite3_int64 (*uri_int64)(const char*,const char*,sqlite3_int64); + const char *(*uri_parameter)(const char*,const char*); + char *(*xvsnprintf)(int,char*,const char*,va_list); + int (*wal_checkpoint_v2)(sqlite3*,const char*,int,int*,int*); + /* Version 3.8.7 and later */ + int (*auto_extension)(void(*)(void)); + int (*bind_blob64)(sqlite3_stmt*,int,const void*,sqlite3_uint64, + void(*)(void*)); + int (*bind_text64)(sqlite3_stmt*,int,const char*,sqlite3_uint64, + void(*)(void*),unsigned char); + int (*cancel_auto_extension)(void(*)(void)); + int (*load_extension)(sqlite3*,const char*,const char*,char**); + void *(*malloc64)(sqlite3_uint64); + sqlite3_uint64 (*msize)(void*); + void *(*realloc64)(void*,sqlite3_uint64); + void (*reset_auto_extension)(void); + void (*result_blob64)(sqlite3_context*,const void*,sqlite3_uint64, + void(*)(void*)); + void (*result_text64)(sqlite3_context*,const char*,sqlite3_uint64, + void(*)(void*), unsigned char); + int (*strglob)(const char*,const char*); + /* Version 3.8.11 and later */ + sqlite3_value *(*value_dup)(const sqlite3_value*); + void (*value_free)(sqlite3_value*); + int (*result_zeroblob64)(sqlite3_context*,sqlite3_uint64); + int (*bind_zeroblob64)(sqlite3_stmt*, int, sqlite3_uint64); + /* Version 3.9.0 and later */ + unsigned int (*value_subtype)(sqlite3_value*); + void (*result_subtype)(sqlite3_context*,unsigned int); + /* Version 3.10.0 and later */ + int (*status64)(int,sqlite3_int64*,sqlite3_int64*,int); + int (*strlike)(const char*,const char*,unsigned int); + int (*db_cacheflush)(sqlite3*); + /* Version 3.12.0 and later */ + int (*system_errno)(sqlite3*); + /* Version 3.14.0 and later */ + int (*trace_v2)(sqlite3*,unsigned,int(*)(unsigned,void*,void*,void*),void*); + char *(*expanded_sql)(sqlite3_stmt*); + /* Version 3.18.0 and later */ + void (*set_last_insert_rowid)(sqlite3*,sqlite3_int64); + /* Version 3.20.0 and later */ + int (*prepare_v3)(sqlite3*,const char*,int,unsigned int, + sqlite3_stmt**,const char**); + int (*prepare16_v3)(sqlite3*,const void*,int,unsigned int, + sqlite3_stmt**,const void**); + int (*bind_pointer)(sqlite3_stmt*,int,void*,const char*,void(*)(void*)); + void (*result_pointer)(sqlite3_context*,void*,const char*,void(*)(void*)); + void *(*value_pointer)(sqlite3_value*,const char*); + int (*vtab_nochange)(sqlite3_context*); + int (*value_nochange)(sqlite3_value*); + const char *(*vtab_collation)(sqlite3_index_info*,int); +}; + +/* +** This is the function signature used for all extension entry points. It +** is also defined in the file "loadext.c". +*/ +typedef int (*sqlite3_loadext_entry)( + sqlite3 *db, /* Handle to the database. */ + char **pzErrMsg, /* Used to set error string on failure. */ + const sqlite3_api_routines *pThunk /* Extension API function pointers. */ +); + +/* +** The following macros redefine the API routines so that they are +** redirected through the global sqlite3_api structure. +** +** This header file is also used by the loadext.c source file +** (part of the main SQLite library - not an extension) so that +** it can get access to the sqlite3_api_routines structure +** definition. But the main library does not want to redefine +** the API. So the redefinition macros are only valid if the +** SQLITE_CORE macros is undefined. +*/ +#if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) +#define sqlite3_aggregate_context sqlite3_api->aggregate_context +#ifndef SQLITE_OMIT_DEPRECATED +#define sqlite3_aggregate_count sqlite3_api->aggregate_count +#endif +#define sqlite3_bind_blob sqlite3_api->bind_blob +#define sqlite3_bind_double sqlite3_api->bind_double +#define sqlite3_bind_int sqlite3_api->bind_int +#define sqlite3_bind_int64 sqlite3_api->bind_int64 +#define sqlite3_bind_null sqlite3_api->bind_null +#define sqlite3_bind_parameter_count sqlite3_api->bind_parameter_count +#define sqlite3_bind_parameter_index sqlite3_api->bind_parameter_index +#define sqlite3_bind_parameter_name sqlite3_api->bind_parameter_name +#define sqlite3_bind_text sqlite3_api->bind_text +#define sqlite3_bind_text16 sqlite3_api->bind_text16 +#define sqlite3_bind_value sqlite3_api->bind_value +#define sqlite3_busy_handler sqlite3_api->busy_handler +#define sqlite3_busy_timeout sqlite3_api->busy_timeout +#define sqlite3_changes sqlite3_api->changes +#define sqlite3_close sqlite3_api->close +#define sqlite3_collation_needed sqlite3_api->collation_needed +#define sqlite3_collation_needed16 sqlite3_api->collation_needed16 +#define sqlite3_column_blob sqlite3_api->column_blob +#define sqlite3_column_bytes sqlite3_api->column_bytes +#define sqlite3_column_bytes16 sqlite3_api->column_bytes16 +#define sqlite3_column_count sqlite3_api->column_count +#define sqlite3_column_database_name sqlite3_api->column_database_name +#define sqlite3_column_database_name16 sqlite3_api->column_database_name16 +#define sqlite3_column_decltype sqlite3_api->column_decltype +#define sqlite3_column_decltype16 sqlite3_api->column_decltype16 +#define sqlite3_column_double sqlite3_api->column_double +#define sqlite3_column_int sqlite3_api->column_int +#define sqlite3_column_int64 sqlite3_api->column_int64 +#define sqlite3_column_name sqlite3_api->column_name +#define sqlite3_column_name16 sqlite3_api->column_name16 +#define sqlite3_column_origin_name sqlite3_api->column_origin_name +#define sqlite3_column_origin_name16 sqlite3_api->column_origin_name16 +#define sqlite3_column_table_name sqlite3_api->column_table_name +#define sqlite3_column_table_name16 sqlite3_api->column_table_name16 +#define sqlite3_column_text sqlite3_api->column_text +#define sqlite3_column_text16 sqlite3_api->column_text16 +#define sqlite3_column_type sqlite3_api->column_type +#define sqlite3_column_value sqlite3_api->column_value +#define sqlite3_commit_hook sqlite3_api->commit_hook +#define sqlite3_complete sqlite3_api->complete +#define sqlite3_complete16 sqlite3_api->complete16 +#define sqlite3_create_collation sqlite3_api->create_collation +#define sqlite3_create_collation16 sqlite3_api->create_collation16 +#define sqlite3_create_function sqlite3_api->create_function +#define sqlite3_create_function16 sqlite3_api->create_function16 +#define sqlite3_create_module sqlite3_api->create_module +#define sqlite3_create_module_v2 sqlite3_api->create_module_v2 +#define sqlite3_data_count sqlite3_api->data_count +#define sqlite3_db_handle sqlite3_api->db_handle +#define sqlite3_declare_vtab sqlite3_api->declare_vtab +#define sqlite3_enable_shared_cache sqlite3_api->enable_shared_cache +#define sqlite3_errcode sqlite3_api->errcode +#define sqlite3_errmsg sqlite3_api->errmsg +#define sqlite3_errmsg16 sqlite3_api->errmsg16 +#define sqlite3_exec sqlite3_api->exec +#ifndef SQLITE_OMIT_DEPRECATED +#define sqlite3_expired sqlite3_api->expired +#endif +#define sqlite3_finalize sqlite3_api->finalize +#define sqlite3_free sqlite3_api->free +#define sqlite3_free_table sqlite3_api->free_table +#define sqlite3_get_autocommit sqlite3_api->get_autocommit +#define sqlite3_get_auxdata sqlite3_api->get_auxdata +#define sqlite3_get_table sqlite3_api->get_table +#ifndef SQLITE_OMIT_DEPRECATED +#define sqlite3_global_recover sqlite3_api->global_recover +#endif +#define sqlite3_interrupt sqlite3_api->interruptx +#define sqlite3_last_insert_rowid sqlite3_api->last_insert_rowid +#define sqlite3_libversion sqlite3_api->libversion +#define sqlite3_libversion_number sqlite3_api->libversion_number +#define sqlite3_malloc sqlite3_api->malloc +#define sqlite3_mprintf sqlite3_api->mprintf +#define sqlite3_open sqlite3_api->open +#define sqlite3_open16 sqlite3_api->open16 +#define sqlite3_prepare sqlite3_api->prepare +#define sqlite3_prepare16 sqlite3_api->prepare16 +#define sqlite3_prepare_v2 sqlite3_api->prepare_v2 +#define sqlite3_prepare16_v2 sqlite3_api->prepare16_v2 +#define sqlite3_profile sqlite3_api->profile +#define sqlite3_progress_handler sqlite3_api->progress_handler +#define sqlite3_realloc sqlite3_api->realloc +#define sqlite3_reset sqlite3_api->reset +#define sqlite3_result_blob sqlite3_api->result_blob +#define sqlite3_result_double sqlite3_api->result_double +#define sqlite3_result_error sqlite3_api->result_error +#define sqlite3_result_error16 sqlite3_api->result_error16 +#define sqlite3_result_int sqlite3_api->result_int +#define sqlite3_result_int64 sqlite3_api->result_int64 +#define sqlite3_result_null sqlite3_api->result_null +#define sqlite3_result_text sqlite3_api->result_text +#define sqlite3_result_text16 sqlite3_api->result_text16 +#define sqlite3_result_text16be sqlite3_api->result_text16be +#define sqlite3_result_text16le sqlite3_api->result_text16le +#define sqlite3_result_value sqlite3_api->result_value +#define sqlite3_rollback_hook sqlite3_api->rollback_hook +#define sqlite3_set_authorizer sqlite3_api->set_authorizer +#define sqlite3_set_auxdata sqlite3_api->set_auxdata +#define sqlite3_snprintf sqlite3_api->xsnprintf +#define sqlite3_step sqlite3_api->step +#define sqlite3_table_column_metadata sqlite3_api->table_column_metadata +#define sqlite3_thread_cleanup sqlite3_api->thread_cleanup +#define sqlite3_total_changes sqlite3_api->total_changes +#define sqlite3_trace sqlite3_api->trace +#ifndef SQLITE_OMIT_DEPRECATED +#define sqlite3_transfer_bindings sqlite3_api->transfer_bindings +#endif +#define sqlite3_update_hook sqlite3_api->update_hook +#define sqlite3_user_data sqlite3_api->user_data +#define sqlite3_value_blob sqlite3_api->value_blob +#define sqlite3_value_bytes sqlite3_api->value_bytes +#define sqlite3_value_bytes16 sqlite3_api->value_bytes16 +#define sqlite3_value_double sqlite3_api->value_double +#define sqlite3_value_int sqlite3_api->value_int +#define sqlite3_value_int64 sqlite3_api->value_int64 +#define sqlite3_value_numeric_type sqlite3_api->value_numeric_type +#define sqlite3_value_text sqlite3_api->value_text +#define sqlite3_value_text16 sqlite3_api->value_text16 +#define sqlite3_value_text16be sqlite3_api->value_text16be +#define sqlite3_value_text16le sqlite3_api->value_text16le +#define sqlite3_value_type sqlite3_api->value_type +#define sqlite3_vmprintf sqlite3_api->vmprintf +#define sqlite3_vsnprintf sqlite3_api->xvsnprintf +#define sqlite3_overload_function sqlite3_api->overload_function +#define sqlite3_prepare_v2 sqlite3_api->prepare_v2 +#define sqlite3_prepare16_v2 sqlite3_api->prepare16_v2 +#define sqlite3_clear_bindings sqlite3_api->clear_bindings +#define sqlite3_bind_zeroblob sqlite3_api->bind_zeroblob +#define sqlite3_blob_bytes sqlite3_api->blob_bytes +#define sqlite3_blob_close sqlite3_api->blob_close +#define sqlite3_blob_open sqlite3_api->blob_open +#define sqlite3_blob_read sqlite3_api->blob_read +#define sqlite3_blob_write sqlite3_api->blob_write +#define sqlite3_create_collation_v2 sqlite3_api->create_collation_v2 +#define sqlite3_file_control sqlite3_api->file_control +#define sqlite3_memory_highwater sqlite3_api->memory_highwater +#define sqlite3_memory_used sqlite3_api->memory_used +#define sqlite3_mutex_alloc sqlite3_api->mutex_alloc +#define sqlite3_mutex_enter sqlite3_api->mutex_enter +#define sqlite3_mutex_free sqlite3_api->mutex_free +#define sqlite3_mutex_leave sqlite3_api->mutex_leave +#define sqlite3_mutex_try sqlite3_api->mutex_try +#define sqlite3_open_v2 sqlite3_api->open_v2 +#define sqlite3_release_memory sqlite3_api->release_memory +#define sqlite3_result_error_nomem sqlite3_api->result_error_nomem +#define sqlite3_result_error_toobig sqlite3_api->result_error_toobig +#define sqlite3_sleep sqlite3_api->sleep +#define sqlite3_soft_heap_limit sqlite3_api->soft_heap_limit +#define sqlite3_vfs_find sqlite3_api->vfs_find +#define sqlite3_vfs_register sqlite3_api->vfs_register +#define sqlite3_vfs_unregister sqlite3_api->vfs_unregister +#define sqlite3_threadsafe sqlite3_api->xthreadsafe +#define sqlite3_result_zeroblob sqlite3_api->result_zeroblob +#define sqlite3_result_error_code sqlite3_api->result_error_code +#define sqlite3_test_control sqlite3_api->test_control +#define sqlite3_randomness sqlite3_api->randomness +#define sqlite3_context_db_handle sqlite3_api->context_db_handle +#define sqlite3_extended_result_codes sqlite3_api->extended_result_codes +#define sqlite3_limit sqlite3_api->limit +#define sqlite3_next_stmt sqlite3_api->next_stmt +#define sqlite3_sql sqlite3_api->sql +#define sqlite3_status sqlite3_api->status +#define sqlite3_backup_finish sqlite3_api->backup_finish +#define sqlite3_backup_init sqlite3_api->backup_init +#define sqlite3_backup_pagecount sqlite3_api->backup_pagecount +#define sqlite3_backup_remaining sqlite3_api->backup_remaining +#define sqlite3_backup_step sqlite3_api->backup_step +#define sqlite3_compileoption_get sqlite3_api->compileoption_get +#define sqlite3_compileoption_used sqlite3_api->compileoption_used +#define sqlite3_create_function_v2 sqlite3_api->create_function_v2 +#define sqlite3_db_config sqlite3_api->db_config +#define sqlite3_db_mutex sqlite3_api->db_mutex +#define sqlite3_db_status sqlite3_api->db_status +#define sqlite3_extended_errcode sqlite3_api->extended_errcode +#define sqlite3_log sqlite3_api->log +#define sqlite3_soft_heap_limit64 sqlite3_api->soft_heap_limit64 +#define sqlite3_sourceid sqlite3_api->sourceid +#define sqlite3_stmt_status sqlite3_api->stmt_status +#define sqlite3_strnicmp sqlite3_api->strnicmp +#define sqlite3_unlock_notify sqlite3_api->unlock_notify +#define sqlite3_wal_autocheckpoint sqlite3_api->wal_autocheckpoint +#define sqlite3_wal_checkpoint sqlite3_api->wal_checkpoint +#define sqlite3_wal_hook sqlite3_api->wal_hook +#define sqlite3_blob_reopen sqlite3_api->blob_reopen +#define sqlite3_vtab_config sqlite3_api->vtab_config +#define sqlite3_vtab_on_conflict sqlite3_api->vtab_on_conflict +/* Version 3.7.16 and later */ +#define sqlite3_close_v2 sqlite3_api->close_v2 +#define sqlite3_db_filename sqlite3_api->db_filename +#define sqlite3_db_readonly sqlite3_api->db_readonly +#define sqlite3_db_release_memory sqlite3_api->db_release_memory +#define sqlite3_errstr sqlite3_api->errstr +#define sqlite3_stmt_busy sqlite3_api->stmt_busy +#define sqlite3_stmt_readonly sqlite3_api->stmt_readonly +#define sqlite3_stricmp sqlite3_api->stricmp +#define sqlite3_uri_boolean sqlite3_api->uri_boolean +#define sqlite3_uri_int64 sqlite3_api->uri_int64 +#define sqlite3_uri_parameter sqlite3_api->uri_parameter +#define sqlite3_uri_vsnprintf sqlite3_api->xvsnprintf +#define sqlite3_wal_checkpoint_v2 sqlite3_api->wal_checkpoint_v2 +/* Version 3.8.7 and later */ +#define sqlite3_auto_extension sqlite3_api->auto_extension +#define sqlite3_bind_blob64 sqlite3_api->bind_blob64 +#define sqlite3_bind_text64 sqlite3_api->bind_text64 +#define sqlite3_cancel_auto_extension sqlite3_api->cancel_auto_extension +#define sqlite3_load_extension sqlite3_api->load_extension +#define sqlite3_malloc64 sqlite3_api->malloc64 +#define sqlite3_msize sqlite3_api->msize +#define sqlite3_realloc64 sqlite3_api->realloc64 +#define sqlite3_reset_auto_extension sqlite3_api->reset_auto_extension +#define sqlite3_result_blob64 sqlite3_api->result_blob64 +#define sqlite3_result_text64 sqlite3_api->result_text64 +#define sqlite3_strglob sqlite3_api->strglob +/* Version 3.8.11 and later */ +#define sqlite3_value_dup sqlite3_api->value_dup +#define sqlite3_value_free sqlite3_api->value_free +#define sqlite3_result_zeroblob64 sqlite3_api->result_zeroblob64 +#define sqlite3_bind_zeroblob64 sqlite3_api->bind_zeroblob64 +/* Version 3.9.0 and later */ +#define sqlite3_value_subtype sqlite3_api->value_subtype +#define sqlite3_result_subtype sqlite3_api->result_subtype +/* Version 3.10.0 and later */ +#define sqlite3_status64 sqlite3_api->status64 +#define sqlite3_strlike sqlite3_api->strlike +#define sqlite3_db_cacheflush sqlite3_api->db_cacheflush +/* Version 3.12.0 and later */ +#define sqlite3_system_errno sqlite3_api->system_errno +/* Version 3.14.0 and later */ +#define sqlite3_trace_v2 sqlite3_api->trace_v2 +#define sqlite3_expanded_sql sqlite3_api->expanded_sql +/* Version 3.18.0 and later */ +#define sqlite3_set_last_insert_rowid sqlite3_api->set_last_insert_rowid +/* Version 3.20.0 and later */ +#define sqlite3_prepare_v3 sqlite3_api->prepare_v3 +#define sqlite3_prepare16_v3 sqlite3_api->prepare16_v3 +#define sqlite3_bind_pointer sqlite3_api->bind_pointer +#define sqlite3_result_pointer sqlite3_api->result_pointer +#define sqlite3_value_pointer sqlite3_api->value_pointer +/* Version 3.22.0 and later */ +#define sqlite3_vtab_nochange sqlite3_api->vtab_nochange +#define sqlite3_value_nochange sqltie3_api->value_nochange +#define sqlite3_vtab_collation sqltie3_api->vtab_collation +#endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */ + +#if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) + /* This case when the file really is being compiled as a loadable + ** extension */ +# define SQLITE_EXTENSION_INIT1 const sqlite3_api_routines *sqlite3_api=0; +# define SQLITE_EXTENSION_INIT2(v) sqlite3_api=v; +# define SQLITE_EXTENSION_INIT3 \ + extern const sqlite3_api_routines *sqlite3_api; +#else + /* This case when the file is being statically linked into the + ** application */ +# define SQLITE_EXTENSION_INIT1 /*no-op*/ +# define SQLITE_EXTENSION_INIT2(v) (void)v; /* unused parameter */ +# define SQLITE_EXTENSION_INIT3 /*no-op*/ +#endif + +#endif /* SQLITE3EXT_H */ diff --git a/hdssd/external/solaris/zlib-1.2.11/crc32.h b/hdssd/external/solaris/zlib-1.2.11/crc32.h new file mode 100644 index 0000000..9e0c778 --- /dev/null +++ b/hdssd/external/solaris/zlib-1.2.11/crc32.h @@ -0,0 +1,441 @@ +/* crc32.h -- tables for rapid CRC calculation + * Generated automatically by crc32.c + */ + +local const z_crc_t FAR crc_table[TBLS][256] = +{ + { + 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL, + 0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL, + 0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL, + 0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL, + 0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL, + 0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL, + 0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL, + 0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL, + 0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL, + 0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL, + 0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL, + 0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL, + 0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL, + 0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL, + 0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL, + 0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL, + 0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL, + 0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL, + 0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL, + 0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL, + 0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL, + 0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL, + 0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL, + 0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL, + 0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL, + 0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL, + 0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL, + 0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL, + 0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL, + 0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL, + 0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL, + 0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL, + 0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL, + 0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL, + 0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL, + 0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL, + 0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL, + 0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL, + 0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL, + 0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL, + 0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL, + 0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL, + 0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL, + 0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL, + 0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL, + 0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL, + 0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL, + 0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL, + 0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL, + 0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL, + 0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL, + 0x2d02ef8dUL +#ifdef BYFOUR + }, + { + 0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL, + 0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL, + 0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL, + 0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL, + 0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL, + 0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL, + 0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL, + 0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL, + 0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL, + 0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL, + 0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL, + 0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL, + 0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL, + 0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL, + 0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL, + 0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL, + 0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL, + 0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL, + 0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL, + 0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL, + 0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL, + 0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL, + 0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL, + 0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL, + 0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL, + 0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL, + 0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL, + 0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL, + 0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL, + 0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL, + 0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL, + 0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL, + 0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL, + 0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL, + 0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL, + 0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL, + 0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL, + 0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL, + 0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL, + 0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL, + 0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL, + 0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL, + 0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL, + 0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL, + 0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL, + 0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL, + 0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL, + 0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL, + 0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL, + 0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL, + 0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL, + 0x9324fd72UL + }, + { + 0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL, + 0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL, + 0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL, + 0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL, + 0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL, + 0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL, + 0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL, + 0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL, + 0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL, + 0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL, + 0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL, + 0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL, + 0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL, + 0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL, + 0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL, + 0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL, + 0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL, + 0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL, + 0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL, + 0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL, + 0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL, + 0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL, + 0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL, + 0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL, + 0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL, + 0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL, + 0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL, + 0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL, + 0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL, + 0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL, + 0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL, + 0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL, + 0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL, + 0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL, + 0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL, + 0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL, + 0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL, + 0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL, + 0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL, + 0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL, + 0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL, + 0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL, + 0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL, + 0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL, + 0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL, + 0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL, + 0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL, + 0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL, + 0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL, + 0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL, + 0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL, + 0xbe9834edUL + }, + { + 0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL, + 0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL, + 0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL, + 0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL, + 0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL, + 0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL, + 0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL, + 0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL, + 0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL, + 0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL, + 0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL, + 0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL, + 0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL, + 0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL, + 0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL, + 0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL, + 0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL, + 0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL, + 0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL, + 0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL, + 0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL, + 0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL, + 0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL, + 0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL, + 0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL, + 0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL, + 0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL, + 0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL, + 0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL, + 0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL, + 0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL, + 0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL, + 0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL, + 0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL, + 0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL, + 0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL, + 0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL, + 0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL, + 0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL, + 0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL, + 0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL, + 0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL, + 0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL, + 0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL, + 0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL, + 0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL, + 0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL, + 0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL, + 0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL, + 0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL, + 0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL, + 0xde0506f1UL + }, + { + 0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL, + 0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL, + 0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL, + 0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL, + 0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL, + 0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL, + 0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL, + 0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL, + 0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL, + 0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL, + 0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL, + 0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL, + 0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL, + 0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL, + 0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL, + 0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL, + 0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL, + 0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL, + 0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL, + 0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL, + 0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL, + 0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL, + 0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL, + 0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL, + 0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL, + 0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL, + 0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL, + 0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL, + 0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL, + 0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL, + 0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL, + 0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL, + 0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL, + 0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL, + 0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL, + 0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL, + 0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL, + 0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL, + 0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL, + 0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL, + 0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL, + 0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL, + 0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL, + 0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL, + 0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL, + 0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL, + 0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL, + 0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL, + 0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL, + 0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL, + 0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL, + 0x8def022dUL + }, + { + 0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL, + 0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL, + 0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL, + 0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL, + 0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL, + 0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL, + 0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL, + 0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL, + 0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL, + 0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL, + 0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL, + 0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL, + 0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL, + 0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL, + 0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL, + 0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL, + 0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL, + 0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL, + 0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL, + 0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL, + 0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL, + 0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL, + 0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL, + 0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL, + 0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL, + 0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL, + 0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL, + 0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL, + 0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL, + 0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL, + 0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL, + 0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL, + 0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL, + 0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL, + 0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL, + 0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL, + 0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL, + 0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL, + 0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL, + 0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL, + 0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL, + 0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL, + 0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL, + 0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL, + 0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL, + 0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL, + 0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL, + 0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL, + 0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL, + 0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL, + 0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL, + 0x72fd2493UL + }, + { + 0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL, + 0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL, + 0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL, + 0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL, + 0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL, + 0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL, + 0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL, + 0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL, + 0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL, + 0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL, + 0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL, + 0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL, + 0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL, + 0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL, + 0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL, + 0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL, + 0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL, + 0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL, + 0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL, + 0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL, + 0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL, + 0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL, + 0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL, + 0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL, + 0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL, + 0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL, + 0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL, + 0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL, + 0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL, + 0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL, + 0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL, + 0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL, + 0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL, + 0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL, + 0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL, + 0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL, + 0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL, + 0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL, + 0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL, + 0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL, + 0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL, + 0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL, + 0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL, + 0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL, + 0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL, + 0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL, + 0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL, + 0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL, + 0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL, + 0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL, + 0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL, + 0xed3498beUL + }, + { + 0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL, + 0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL, + 0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL, + 0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL, + 0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL, + 0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL, + 0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL, + 0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL, + 0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL, + 0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL, + 0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL, + 0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL, + 0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL, + 0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL, + 0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL, + 0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL, + 0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL, + 0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL, + 0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL, + 0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL, + 0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL, + 0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL, + 0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL, + 0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL, + 0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL, + 0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL, + 0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL, + 0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL, + 0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL, + 0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL, + 0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL, + 0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL, + 0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL, + 0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL, + 0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL, + 0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL, + 0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL, + 0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL, + 0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL, + 0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL, + 0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL, + 0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL, + 0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL, + 0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL, + 0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL, + 0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL, + 0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL, + 0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL, + 0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL, + 0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL, + 0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL, + 0xf10605deUL +#endif + } +}; diff --git a/hdssd/external/solaris/zlib-1.2.11/deflate.h b/hdssd/external/solaris/zlib-1.2.11/deflate.h new file mode 100644 index 0000000..23ecdd3 --- /dev/null +++ b/hdssd/external/solaris/zlib-1.2.11/deflate.h @@ -0,0 +1,349 @@ +/* deflate.h -- internal compression state + * Copyright (C) 1995-2016 Jean-loup Gailly + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* @(#) $Id$ */ + +#ifndef DEFLATE_H +#define DEFLATE_H + +#include "zutil.h" + +/* define NO_GZIP when compiling if you want to disable gzip header and + trailer creation by deflate(). NO_GZIP would be used to avoid linking in + the crc code when it is not needed. For shared libraries, gzip encoding + should be left enabled. */ +#ifndef NO_GZIP +# define GZIP +#endif + +/* =========================================================================== + * Internal compression state. + */ + +#define LENGTH_CODES 29 +/* number of length codes, not counting the special END_BLOCK code */ + +#define LITERALS 256 +/* number of literal bytes 0..255 */ + +#define L_CODES (LITERALS+1+LENGTH_CODES) +/* number of Literal or Length codes, including the END_BLOCK code */ + +#define D_CODES 30 +/* number of distance codes */ + +#define BL_CODES 19 +/* number of codes used to transfer the bit lengths */ + +#define HEAP_SIZE (2*L_CODES+1) +/* maximum heap size */ + +#define MAX_BITS 15 +/* All codes must not exceed MAX_BITS bits */ + +#define Buf_size 16 +/* size of bit buffer in bi_buf */ + +#define INIT_STATE 42 /* zlib header -> BUSY_STATE */ +#ifdef GZIP +# define GZIP_STATE 57 /* gzip header -> BUSY_STATE | EXTRA_STATE */ +#endif +#define EXTRA_STATE 69 /* gzip extra block -> NAME_STATE */ +#define NAME_STATE 73 /* gzip file name -> COMMENT_STATE */ +#define COMMENT_STATE 91 /* gzip comment -> HCRC_STATE */ +#define HCRC_STATE 103 /* gzip header CRC -> BUSY_STATE */ +#define BUSY_STATE 113 /* deflate -> FINISH_STATE */ +#define FINISH_STATE 666 /* stream complete */ +/* Stream status */ + + +/* Data structure describing a single value and its code string. */ +typedef struct ct_data_s { + union { + ush freq; /* frequency count */ + ush code; /* bit string */ + } fc; + union { + ush dad; /* father node in Huffman tree */ + ush len; /* length of bit string */ + } dl; +} FAR ct_data; + +#define Freq fc.freq +#define Code fc.code +#define Dad dl.dad +#define Len dl.len + +typedef struct static_tree_desc_s static_tree_desc; + +typedef struct tree_desc_s { + ct_data *dyn_tree; /* the dynamic tree */ + int max_code; /* largest code with non zero frequency */ + const static_tree_desc *stat_desc; /* the corresponding static tree */ +} FAR tree_desc; + +typedef ush Pos; +typedef Pos FAR Posf; +typedef unsigned IPos; + +/* A Pos is an index in the character window. We use short instead of int to + * save space in the various tables. IPos is used only for parameter passing. + */ + +typedef struct internal_state { + z_streamp strm; /* pointer back to this zlib stream */ + int status; /* as the name implies */ + Bytef *pending_buf; /* output still pending */ + ulg pending_buf_size; /* size of pending_buf */ + Bytef *pending_out; /* next pending byte to output to the stream */ + ulg pending; /* nb of bytes in the pending buffer */ + int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ + gz_headerp gzhead; /* gzip header information to write */ + ulg gzindex; /* where in extra, name, or comment */ + Byte method; /* can only be DEFLATED */ + int last_flush; /* value of flush param for previous deflate call */ + + /* used by deflate.c: */ + + uInt w_size; /* LZ77 window size (32K by default) */ + uInt w_bits; /* log2(w_size) (8..16) */ + uInt w_mask; /* w_size - 1 */ + + Bytef *window; + /* Sliding window. Input bytes are read into the second half of the window, + * and move to the first half later to keep a dictionary of at least wSize + * bytes. With this organization, matches are limited to a distance of + * wSize-MAX_MATCH bytes, but this ensures that IO is always + * performed with a length multiple of the block size. Also, it limits + * the window size to 64K, which is quite useful on MSDOS. + * To do: use the user input buffer as sliding window. + */ + + ulg window_size; + /* Actual size of window: 2*wSize, except when the user input buffer + * is directly used as sliding window. + */ + + Posf *prev; + /* Link to older string with same hash index. To limit the size of this + * array to 64K, this link is maintained only for the last 32K strings. + * An index in this array is thus a window index modulo 32K. + */ + + Posf *head; /* Heads of the hash chains or NIL. */ + + uInt ins_h; /* hash index of string to be inserted */ + uInt hash_size; /* number of elements in hash table */ + uInt hash_bits; /* log2(hash_size) */ + uInt hash_mask; /* hash_size-1 */ + + uInt hash_shift; + /* Number of bits by which ins_h must be shifted at each input + * step. It must be such that after MIN_MATCH steps, the oldest + * byte no longer takes part in the hash key, that is: + * hash_shift * MIN_MATCH >= hash_bits + */ + + long block_start; + /* Window position at the beginning of the current output block. Gets + * negative when the window is moved backwards. + */ + + uInt match_length; /* length of best match */ + IPos prev_match; /* previous match */ + int match_available; /* set if previous match exists */ + uInt strstart; /* start of string to insert */ + uInt match_start; /* start of matching string */ + uInt lookahead; /* number of valid bytes ahead in window */ + + uInt prev_length; + /* Length of the best match at previous step. Matches not greater than this + * are discarded. This is used in the lazy match evaluation. + */ + + uInt max_chain_length; + /* To speed up deflation, hash chains are never searched beyond this + * length. A higher limit improves compression ratio but degrades the + * speed. + */ + + uInt max_lazy_match; + /* Attempt to find a better match only when the current match is strictly + * smaller than this value. This mechanism is used only for compression + * levels >= 4. + */ +# define max_insert_length max_lazy_match + /* Insert new strings in the hash table only if the match length is not + * greater than this length. This saves time but degrades compression. + * max_insert_length is used only for compression levels <= 3. + */ + + int level; /* compression level (1..9) */ + int strategy; /* favor or force Huffman coding*/ + + uInt good_match; + /* Use a faster search when the previous match is longer than this */ + + int nice_match; /* Stop searching when current match exceeds this */ + + /* used by trees.c: */ + /* Didn't use ct_data typedef below to suppress compiler warning */ + struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ + struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ + struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ + + struct tree_desc_s l_desc; /* desc. for literal tree */ + struct tree_desc_s d_desc; /* desc. for distance tree */ + struct tree_desc_s bl_desc; /* desc. for bit length tree */ + + ush bl_count[MAX_BITS+1]; + /* number of codes at each bit length for an optimal tree */ + + int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ + int heap_len; /* number of elements in the heap */ + int heap_max; /* element of largest frequency */ + /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. + * The same heap array is used to build all trees. + */ + + uch depth[2*L_CODES+1]; + /* Depth of each subtree used as tie breaker for trees of equal frequency + */ + + uchf *l_buf; /* buffer for literals or lengths */ + + uInt lit_bufsize; + /* Size of match buffer for literals/lengths. There are 4 reasons for + * limiting lit_bufsize to 64K: + * - frequencies can be kept in 16 bit counters + * - if compression is not successful for the first block, all input + * data is still in the window so we can still emit a stored block even + * when input comes from standard input. (This can also be done for + * all blocks if lit_bufsize is not greater than 32K.) + * - if compression is not successful for a file smaller than 64K, we can + * even emit a stored file instead of a stored block (saving 5 bytes). + * This is applicable only for zip (not gzip or zlib). + * - creating new Huffman trees less frequently may not provide fast + * adaptation to changes in the input data statistics. (Take for + * example a binary file with poorly compressible code followed by + * a highly compressible string table.) Smaller buffer sizes give + * fast adaptation but have of course the overhead of transmitting + * trees more frequently. + * - I can't count above 4 + */ + + uInt last_lit; /* running index in l_buf */ + + ushf *d_buf; + /* Buffer for distances. To simplify the code, d_buf and l_buf have + * the same number of elements. To use different lengths, an extra flag + * array would be necessary. + */ + + ulg opt_len; /* bit length of current block with optimal trees */ + ulg static_len; /* bit length of current block with static trees */ + uInt matches; /* number of string matches in current block */ + uInt insert; /* bytes at end of window left to insert */ + +#ifdef ZLIB_DEBUG + ulg compressed_len; /* total bit length of compressed file mod 2^32 */ + ulg bits_sent; /* bit length of compressed data sent mod 2^32 */ +#endif + + ush bi_buf; + /* Output buffer. bits are inserted starting at the bottom (least + * significant bits). + */ + int bi_valid; + /* Number of valid bits in bi_buf. All bits above the last valid bit + * are always zero. + */ + + ulg high_water; + /* High water mark offset in window for initialized bytes -- bytes above + * this are set to zero in order to avoid memory check warnings when + * longest match routines access bytes past the input. This is then + * updated to the new high water mark. + */ + +} FAR deflate_state; + +/* Output a byte on the stream. + * IN assertion: there is enough room in pending_buf. + */ +#define put_byte(s, c) {s->pending_buf[s->pending++] = (Bytef)(c);} + + +#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) +/* Minimum amount of lookahead, except at the end of the input file. + * See deflate.c for comments about the MIN_MATCH+1. + */ + +#define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD) +/* In order to simplify the code, particularly on 16 bit machines, match + * distances are limited to MAX_DIST instead of WSIZE. + */ + +#define WIN_INIT MAX_MATCH +/* Number of bytes after end of data in window to initialize in order to avoid + memory checker errors from longest match routines */ + + /* in trees.c */ +void ZLIB_INTERNAL _tr_init OF((deflate_state *s)); +int ZLIB_INTERNAL _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); +void ZLIB_INTERNAL _tr_flush_block OF((deflate_state *s, charf *buf, + ulg stored_len, int last)); +void ZLIB_INTERNAL _tr_flush_bits OF((deflate_state *s)); +void ZLIB_INTERNAL _tr_align OF((deflate_state *s)); +void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf, + ulg stored_len, int last)); + +#define d_code(dist) \ + ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)]) +/* Mapping from a distance to a distance code. dist is the distance - 1 and + * must not have side effects. _dist_code[256] and _dist_code[257] are never + * used. + */ + +#ifndef ZLIB_DEBUG +/* Inline versions of _tr_tally for speed: */ + +#if defined(GEN_TREES_H) || !defined(STDC) + extern uch ZLIB_INTERNAL _length_code[]; + extern uch ZLIB_INTERNAL _dist_code[]; +#else + extern const uch ZLIB_INTERNAL _length_code[]; + extern const uch ZLIB_INTERNAL _dist_code[]; +#endif + +# define _tr_tally_lit(s, c, flush) \ + { uch cc = (c); \ + s->d_buf[s->last_lit] = 0; \ + s->l_buf[s->last_lit++] = cc; \ + s->dyn_ltree[cc].Freq++; \ + flush = (s->last_lit == s->lit_bufsize-1); \ + } +# define _tr_tally_dist(s, distance, length, flush) \ + { uch len = (uch)(length); \ + ush dist = (ush)(distance); \ + s->d_buf[s->last_lit] = dist; \ + s->l_buf[s->last_lit++] = len; \ + dist--; \ + s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ + s->dyn_dtree[d_code(dist)].Freq++; \ + flush = (s->last_lit == s->lit_bufsize-1); \ + } +#else +# define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) +# define _tr_tally_dist(s, distance, length, flush) \ + flush = _tr_tally(s, distance, length) +#endif + +#endif /* DEFLATE_H */ diff --git a/hdssd/external/solaris/zlib-1.2.11/gzguts.h b/hdssd/external/solaris/zlib-1.2.11/gzguts.h new file mode 100644 index 0000000..990a4d2 --- /dev/null +++ b/hdssd/external/solaris/zlib-1.2.11/gzguts.h @@ -0,0 +1,218 @@ +/* gzguts.h -- zlib internal header definitions for gz* operations + * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013, 2016 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#ifdef _LARGEFILE64_SOURCE +# ifndef _LARGEFILE_SOURCE +# define _LARGEFILE_SOURCE 1 +# endif +# ifdef _FILE_OFFSET_BITS +# undef _FILE_OFFSET_BITS +# endif +#endif + +#ifdef HAVE_HIDDEN +# define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) +#else +# define ZLIB_INTERNAL +#endif + +#include +#include "zlib.h" +#ifdef STDC +# include +# include +# include +#endif + +#ifndef _POSIX_SOURCE +# define _POSIX_SOURCE +#endif +#include + +#ifdef _WIN32 +# include +#endif + +#if defined(__TURBOC__) || defined(_MSC_VER) || defined(_WIN32) +# include +#endif + +#if defined(_WIN32) || defined(__CYGWIN__) +# define WIDECHAR +#endif + +#ifdef WINAPI_FAMILY +# define open _open +# define read _read +# define write _write +# define close _close +#endif + +#ifdef NO_DEFLATE /* for compatibility with old definition */ +# define NO_GZCOMPRESS +#endif + +#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif + +#if defined(__CYGWIN__) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif + +#if defined(MSDOS) && defined(__BORLANDC__) && (BORLANDC > 0x410) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif + +#ifndef HAVE_VSNPRINTF +# ifdef MSDOS +/* vsnprintf may exist on some MS-DOS compilers (DJGPP?), + but for now we just assume it doesn't. */ +# define NO_vsnprintf +# endif +# ifdef __TURBOC__ +# define NO_vsnprintf +# endif +# ifdef WIN32 +/* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */ +# if !defined(vsnprintf) && !defined(NO_vsnprintf) +# if !defined(_MSC_VER) || ( defined(_MSC_VER) && _MSC_VER < 1500 ) +# define vsnprintf _vsnprintf +# endif +# endif +# endif +# ifdef __SASC +# define NO_vsnprintf +# endif +# ifdef VMS +# define NO_vsnprintf +# endif +# ifdef __OS400__ +# define NO_vsnprintf +# endif +# ifdef __MVS__ +# define NO_vsnprintf +# endif +#endif + +/* unlike snprintf (which is required in C99), _snprintf does not guarantee + null termination of the result -- however this is only used in gzlib.c where + the result is assured to fit in the space provided */ +#if defined(_MSC_VER) && _MSC_VER < 1900 +# define snprintf _snprintf +#endif + +#ifndef local +# define local static +#endif +/* since "static" is used to mean two completely different things in C, we + define "local" for the non-static meaning of "static", for readability + (compile with -Dlocal if your debugger can't find static symbols) */ + +/* gz* functions always use library allocation functions */ +#ifndef STDC + extern voidp malloc OF((uInt size)); + extern void free OF((voidpf ptr)); +#endif + +/* get errno and strerror definition */ +#if defined UNDER_CE +# include +# define zstrerror() gz_strwinerror((DWORD)GetLastError()) +#else +# ifndef NO_STRERROR +# include +# define zstrerror() strerror(errno) +# else +# define zstrerror() "stdio error (consult errno)" +# endif +#endif + +/* provide prototypes for these when building zlib without LFS */ +#if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0 + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); + ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); +#endif + +/* default memLevel */ +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif + +/* default i/o buffer size -- double this for output when reading (this and + twice this must be able to fit in an unsigned type) */ +#define GZBUFSIZE 8192 + +/* gzip modes, also provide a little integrity check on the passed structure */ +#define GZ_NONE 0 +#define GZ_READ 7247 +#define GZ_WRITE 31153 +#define GZ_APPEND 1 /* mode set to GZ_WRITE after the file is opened */ + +/* values for gz_state how */ +#define LOOK 0 /* look for a gzip header */ +#define COPY 1 /* copy input directly */ +#define GZIP 2 /* decompress a gzip stream */ + +/* internal gzip file state data structure */ +typedef struct { + /* exposed contents for gzgetc() macro */ + struct gzFile_s x; /* "x" for exposed */ + /* x.have: number of bytes available at x.next */ + /* x.next: next output data to deliver or write */ + /* x.pos: current position in uncompressed data */ + /* used for both reading and writing */ + int mode; /* see gzip modes above */ + int fd; /* file descriptor */ + char *path; /* path or fd for error messages */ + unsigned size; /* buffer size, zero if not allocated yet */ + unsigned want; /* requested buffer size, default is GZBUFSIZE */ + unsigned char *in; /* input buffer (double-sized when writing) */ + unsigned char *out; /* output buffer (double-sized when reading) */ + int direct; /* 0 if processing gzip, 1 if transparent */ + /* just for reading */ + int how; /* 0: get header, 1: copy, 2: decompress */ + z_off64_t start; /* where the gzip data started, for rewinding */ + int eof; /* true if end of input file reached */ + int past; /* true if read requested past end */ + /* just for writing */ + int level; /* compression level */ + int strategy; /* compression strategy */ + /* seek request */ + z_off64_t skip; /* amount to skip (already rewound if backwards) */ + int seek; /* true if seek request pending */ + /* error information */ + int err; /* error code */ + char *msg; /* error message */ + /* zlib inflate or deflate stream */ + z_stream strm; /* stream structure in-place (not a pointer) */ +} gz_state; +typedef gz_state FAR *gz_statep; + +/* shared functions */ +void ZLIB_INTERNAL gz_error OF((gz_statep, int, const char *)); +#if defined UNDER_CE +char ZLIB_INTERNAL *gz_strwinerror OF((DWORD error)); +#endif + +/* GT_OFF(x), where x is an unsigned value, is true if x > maximum z_off64_t + value -- needed when comparing unsigned to z_off64_t, which is signed + (possible z_off64_t types off_t, off64_t, and long are all signed) */ +#ifdef INT_MAX +# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > INT_MAX) +#else +unsigned ZLIB_INTERNAL gz_intmax OF((void)); +# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax()) +#endif diff --git a/hdssd/external/solaris/zlib-1.2.11/inffast.h b/hdssd/external/solaris/zlib-1.2.11/inffast.h new file mode 100644 index 0000000..e5c1aa4 --- /dev/null +++ b/hdssd/external/solaris/zlib-1.2.11/inffast.h @@ -0,0 +1,11 @@ +/* inffast.h -- header to use inffast.c + * Copyright (C) 1995-2003, 2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +void ZLIB_INTERNAL inflate_fast OF((z_streamp strm, unsigned start)); diff --git a/hdssd/external/solaris/zlib-1.2.11/inffixed.h b/hdssd/external/solaris/zlib-1.2.11/inffixed.h new file mode 100644 index 0000000..d628327 --- /dev/null +++ b/hdssd/external/solaris/zlib-1.2.11/inffixed.h @@ -0,0 +1,94 @@ + /* inffixed.h -- table for decoding fixed codes + * Generated automatically by makefixed(). + */ + + /* WARNING: this file should *not* be used by applications. + It is part of the implementation of this library and is + subject to change. Applications should only use zlib.h. + */ + + static const code lenfix[512] = { + {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48}, + {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128}, + {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59}, + {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176}, + {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20}, + {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100}, + {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8}, + {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216}, + {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76}, + {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114}, + {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2}, + {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148}, + {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42}, + {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86}, + {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15}, + {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236}, + {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62}, + {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142}, + {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31}, + {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162}, + {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25}, + {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105}, + {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4}, + {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202}, + {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69}, + {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125}, + {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13}, + {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195}, + {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35}, + {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91}, + {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19}, + {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246}, + {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55}, + {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135}, + {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99}, + {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190}, + {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16}, + {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96}, + {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6}, + {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209}, + {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72}, + {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116}, + {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4}, + {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153}, + {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44}, + {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82}, + {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11}, + {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229}, + {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58}, + {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138}, + {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51}, + {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173}, + {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30}, + {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110}, + {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0}, + {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195}, + {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65}, + {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121}, + {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9}, + {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258}, + {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37}, + {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93}, + {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23}, + {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251}, + {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51}, + {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131}, + {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67}, + {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183}, + {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23}, + {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103}, + {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9}, + {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223}, + {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79}, + {0,9,255} + }; + + static const code distfix[32] = { + {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025}, + {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193}, + {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385}, + {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577}, + {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073}, + {22,5,193},{64,5,0} + }; diff --git a/hdssd/external/solaris/zlib-1.2.11/inflate.h b/hdssd/external/solaris/zlib-1.2.11/inflate.h new file mode 100644 index 0000000..a46cce6 --- /dev/null +++ b/hdssd/external/solaris/zlib-1.2.11/inflate.h @@ -0,0 +1,125 @@ +/* inflate.h -- internal inflate state definition + * Copyright (C) 1995-2016 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* define NO_GZIP when compiling if you want to disable gzip header and + trailer decoding by inflate(). NO_GZIP would be used to avoid linking in + the crc code when it is not needed. For shared libraries, gzip decoding + should be left enabled. */ +#ifndef NO_GZIP +# define GUNZIP +#endif + +/* Possible inflate modes between inflate() calls */ +typedef enum { + HEAD = 16180, /* i: waiting for magic header */ + FLAGS, /* i: waiting for method and flags (gzip) */ + TIME, /* i: waiting for modification time (gzip) */ + OS, /* i: waiting for extra flags and operating system (gzip) */ + EXLEN, /* i: waiting for extra length (gzip) */ + EXTRA, /* i: waiting for extra bytes (gzip) */ + NAME, /* i: waiting for end of file name (gzip) */ + COMMENT, /* i: waiting for end of comment (gzip) */ + HCRC, /* i: waiting for header crc (gzip) */ + DICTID, /* i: waiting for dictionary check value */ + DICT, /* waiting for inflateSetDictionary() call */ + TYPE, /* i: waiting for type bits, including last-flag bit */ + TYPEDO, /* i: same, but skip check to exit inflate on new block */ + STORED, /* i: waiting for stored size (length and complement) */ + COPY_, /* i/o: same as COPY below, but only first time in */ + COPY, /* i/o: waiting for input or output to copy stored block */ + TABLE, /* i: waiting for dynamic block table lengths */ + LENLENS, /* i: waiting for code length code lengths */ + CODELENS, /* i: waiting for length/lit and distance code lengths */ + LEN_, /* i: same as LEN below, but only first time in */ + LEN, /* i: waiting for length/lit/eob code */ + LENEXT, /* i: waiting for length extra bits */ + DIST, /* i: waiting for distance code */ + DISTEXT, /* i: waiting for distance extra bits */ + MATCH, /* o: waiting for output space to copy string */ + LIT, /* o: waiting for output space to write literal */ + CHECK, /* i: waiting for 32-bit check value */ + LENGTH, /* i: waiting for 32-bit length (gzip) */ + DONE, /* finished check, done -- remain here until reset */ + BAD, /* got a data error -- remain here until reset */ + MEM, /* got an inflate() memory error -- remain here until reset */ + SYNC /* looking for synchronization bytes to restart inflate() */ +} inflate_mode; + +/* + State transitions between above modes - + + (most modes can go to BAD or MEM on error -- not shown for clarity) + + Process header: + HEAD -> (gzip) or (zlib) or (raw) + (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME -> COMMENT -> + HCRC -> TYPE + (zlib) -> DICTID or TYPE + DICTID -> DICT -> TYPE + (raw) -> TYPEDO + Read deflate blocks: + TYPE -> TYPEDO -> STORED or TABLE or LEN_ or CHECK + STORED -> COPY_ -> COPY -> TYPE + TABLE -> LENLENS -> CODELENS -> LEN_ + LEN_ -> LEN + Read deflate codes in fixed or dynamic block: + LEN -> LENEXT or LIT or TYPE + LENEXT -> DIST -> DISTEXT -> MATCH -> LEN + LIT -> LEN + Process trailer: + CHECK -> LENGTH -> DONE + */ + +/* State maintained between inflate() calls -- approximately 7K bytes, not + including the allocated sliding window, which is up to 32K bytes. */ +struct inflate_state { + z_streamp strm; /* pointer back to this zlib stream */ + inflate_mode mode; /* current inflate mode */ + int last; /* true if processing last block */ + int wrap; /* bit 0 true for zlib, bit 1 true for gzip, + bit 2 true to validate check value */ + int havedict; /* true if dictionary provided */ + int flags; /* gzip header method and flags (0 if zlib) */ + unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */ + unsigned long check; /* protected copy of check value */ + unsigned long total; /* protected copy of output count */ + gz_headerp head; /* where to save gzip header information */ + /* sliding window */ + unsigned wbits; /* log base 2 of requested window size */ + unsigned wsize; /* window size or zero if not using window */ + unsigned whave; /* valid bytes in the window */ + unsigned wnext; /* window write index */ + unsigned char FAR *window; /* allocated sliding window, if needed */ + /* bit accumulator */ + unsigned long hold; /* input bit accumulator */ + unsigned bits; /* number of bits in "in" */ + /* for string and stored block copying */ + unsigned length; /* literal or length of data to copy */ + unsigned offset; /* distance back to copy string from */ + /* for table and code decoding */ + unsigned extra; /* extra bits needed */ + /* fixed and dynamic code tables */ + code const FAR *lencode; /* starting table for length/literal codes */ + code const FAR *distcode; /* starting table for distance codes */ + unsigned lenbits; /* index bits for lencode */ + unsigned distbits; /* index bits for distcode */ + /* dynamic table building */ + unsigned ncode; /* number of code length code lengths */ + unsigned nlen; /* number of length code lengths */ + unsigned ndist; /* number of distance code lengths */ + unsigned have; /* number of code lengths in lens[] */ + code FAR *next; /* next available space in codes[] */ + unsigned short lens[320]; /* temporary storage for code lengths */ + unsigned short work[288]; /* work area for code table building */ + code codes[ENOUGH]; /* space for code tables */ + int sane; /* if false, allow invalid distance too far */ + int back; /* bits back of last unprocessed length/lit */ + unsigned was; /* initial length of match */ +}; diff --git a/hdssd/external/solaris/zlib-1.2.11/inftrees.h b/hdssd/external/solaris/zlib-1.2.11/inftrees.h new file mode 100644 index 0000000..baa53a0 --- /dev/null +++ b/hdssd/external/solaris/zlib-1.2.11/inftrees.h @@ -0,0 +1,62 @@ +/* inftrees.h -- header to use inftrees.c + * Copyright (C) 1995-2005, 2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* Structure for decoding tables. Each entry provides either the + information needed to do the operation requested by the code that + indexed that table entry, or it provides a pointer to another + table that indexes more bits of the code. op indicates whether + the entry is a pointer to another table, a literal, a length or + distance, an end-of-block, or an invalid code. For a table + pointer, the low four bits of op is the number of index bits of + that table. For a length or distance, the low four bits of op + is the number of extra bits to get after the code. bits is + the number of bits in this code or part of the code to drop off + of the bit buffer. val is the actual byte to output in the case + of a literal, the base length or distance, or the offset from + the current table to the next table. Each entry is four bytes. */ +typedef struct { + unsigned char op; /* operation, extra bits, table bits */ + unsigned char bits; /* bits in this part of the code */ + unsigned short val; /* offset in table or code value */ +} code; + +/* op values as set by inflate_table(): + 00000000 - literal + 0000tttt - table link, tttt != 0 is the number of table index bits + 0001eeee - length or distance, eeee is the number of extra bits + 01100000 - end of block + 01000000 - invalid code + */ + +/* Maximum size of the dynamic table. The maximum number of code structures is + 1444, which is the sum of 852 for literal/length codes and 592 for distance + codes. These values were found by exhaustive searches using the program + examples/enough.c found in the zlib distribtution. The arguments to that + program are the number of symbols, the initial root table size, and the + maximum bit length of a code. "enough 286 9 15" for literal/length codes + returns returns 852, and "enough 30 6 15" for distance codes returns 592. + The initial root table size (9 or 6) is found in the fifth argument of the + inflate_table() calls in inflate.c and infback.c. If the root table size is + changed, then these maximum sizes would be need to be recalculated and + updated. */ +#define ENOUGH_LENS 852 +#define ENOUGH_DISTS 592 +#define ENOUGH (ENOUGH_LENS+ENOUGH_DISTS) + +/* Type of code to build for inflate_table() */ +typedef enum { + CODES, + LENS, + DISTS +} codetype; + +int ZLIB_INTERNAL inflate_table OF((codetype type, unsigned short FAR *lens, + unsigned codes, code FAR * FAR *table, + unsigned FAR *bits, unsigned short FAR *work)); diff --git a/hdssd/external/solaris/zlib-1.2.11/libz.a b/hdssd/external/solaris/zlib-1.2.11/libz.a new file mode 100644 index 0000000000000000000000000000000000000000..a144ac375b9eb4a2fa90d25ac84d1134b4d14ebe GIT binary patch literal 109120 zcmeFa30O^Q-#@wS1Ku$ig27PmHD8OBu;HfgCR*J z744JhI2@8RAzRXkgF>cI|IfWEr*q!tdEV!FfA4kuuK#uYwrjQS@q2&g`+MK(UQ6Fm zZb2R^#;6XW|N65XYU^NYKV-;|VKi-{sOtWgrfuzQ96EYPR4Iz`q$u8xf4#JfDeCXn zm~x8xKe-NFrl_v#0$^QL|6jRSszsFI(tSX&{?+AtnPUB;YsNH+)pdPWPqE0gpqyg4 z{2yGwEfnitT`{f{>tA1P%l$lq2HR1c_hlXdtK5D3J?)2lE7|ZZ)mcY*dxk9Y2=Z7K z;^yw>Ng*}ZZrO&;`=9+g%Deg~a@2B9FF&^s&+j~gJwyJInd<2o*i|sWe|cAOmZ$%6 zAAj$zEU*h)ALQe`;#=o&DCnx4yT;$MD?Q6C$Zb_{S8lSuPsp;a%pA{<@jf0QJ^}u2 zLErk$3i4U?tutCUd%7+64C?AKHek)4I1ylW-=IzUN6;uAe+8Xm-8_7|rwL` zELi5{797%53#gqKbk@%E2Rf@Dn64Hb2zS;h_^DuFXTe`->?&OE?=dUD$N$?Xb5PI) zuj{S=W!IJKq_z7nT~!LscUH`I^Yd8_xpvh}cMJMP_g@**+2JpgcjL;qfaRXS^MXCU zv8kKHJG*vj-LjCNWj>Guwam}c-#cUl8ZP&wNGWjf_NSID_X&oUb`^%W`T4C^RD1cY z30|?x-7f&5A@;1d!|ZSe34^7O_-E3N^4{R# z7ZB`;dx)o>AMDV3L$If(FK){N0zLh4CqrUr?+xy2yu6^K-WxhAJp4S}f>7C6@~y8T z5#Z%Tj1G+z2}N0uXQ&TU(tCqvfEW4O36~6vENFKlm7OO8AemwShrUMKWwxtH3pi0dOM&e5>vN9Eu5q z{5t)VbwKB2^lc8p)YE5aiddQslZygFOA*I;$YiRi3af{C;{;92H?t3v?*T zkx7-ZqJ$pp1$;4|%~0pEG$}rlDxr|R5-y-wsMj)JDC2$MDD-Hq z(G*jpEQ?2Jkn(Jvge5F)|6HIfHXyJ`8zz;~;xm*|lz{4G>ew!m>PocGUJxVncr6Al zgyI4L#m^li5eOJ6JzSsa8LoTeG?U7(&~FmPr}6|8YoKF$YrdfG;#578SvfpLrvziy zXi8XBni6(}ri4?jDdCoBN|XSbMaCyMh2x&Uqtr_^CA?ZqiLzW%!mrbmsKirZjc|@w z?YX8zBY{J)>NO>*C{u0Fl&HmWD3v&lSiMnGq8`qcslL#ZXui^vXeF>2KFYO7-x#(` zfOcx(Y_WC}n^BQcVqr3yVkK}XokXr!fOfj^92se+*V#^=w9BHzJ&vOt_$0{R=GYEi z-7ZiP8-OR6#cfJmG?7CD6``RTcwhnFiqnXy=1&70|2-TGc*+-uIw2j?J(@vqmf> zR_~&l@BuU__!i5SX-9$fWHuv+VNzv~;RCwx@!P~YQq3@*Y$L2kR|4&=01CQ;}v(O+UuD0A$OD^B3?Iz{(M zd&C%NpLF1ptVs!D1vHf+xwhi2`{Z?m zy+k0@WQ6H_u@Jn|jWd-QfahxQsEgGU3!~U#b?{y_M)yf`G9^}FQp75JhEj&DZc3&$ zwUfL9LvfNtVs%oMpnLQ&lT2x#4G(vf!HzIzeM#>qHl;)IXv>Z=q15-A(}FBru_~c= zb7Kd6gf>DWp{+YzgkIp^6L=dDy(F{|S_uvRineoIv}wxzuhIrI|Ni^tgt=7v>+Y4H zpN+g)SDBzAp-oX7F_HpdN4+6Macz))(3!XBXodzI38-qvuQNZqBgYYUwjT$0vrr~i z<53Q34MH(j`p1KNUL|I0f*NKhXXjuU1{l`eYwm3Y{SL;)76H%@mm|W;1TqkHU9Lt zjvyt7Bvu9Z)3!GBEVmGk6|~LJK{ob->}+g?s#252jT=D^m^5SFKzgwCU~9V$O#aQk zM79v)w;!2Jhkna-Oh+V3WK7!fNCrPYOn;p;EAm{$Uy6e46*@um0zaj7_#?$d>d83d zPQ(nIP~pT#8v zP^hv^+$&8t%Y!Pj3zSz~HVjo zc4p&+-}9}Mql$Y)_c|w7zA}q`^Y;8|=g5mrwLNRfe^~Xf{*RXO+}RO#w_MZli=V&T zH(mDC{nLh>p4VUKvRr3+@cgP*?V=+C{F#Isoe5O zWg1()9#hTr9h#foIyO7r?|$L+ijzg3#CBDFPbNHaUGtzqZac}rzLm(*~_N43-%w(zi>=z06RZ%nbLOtRrTuZGiuL7g90{gTexDH_Rns; zPULx6jb8h}DT;M}H7~x5E^4|bFkgLU%MM;%Zl9#$`eTjx<%8ELUr*MeJ`IUeN#FBW zGu~j+N{vGPs?k=_%l!^Cc(}5BeP_2A`?im-{}6Z*CV|etI0p!-T3x%`83bz*=`F*kKCwoUUpk&^6+D>J>*;aTY0DmJY`i{8 zY4xc7Y^UQF)dYg;>h#tHD{}kM0b9LF*!5}x0iH2kNs(9_)eW_rO7^dp{ls0m}2 zkBrnncFg5Hbk4S)TBTu8b6VACnmuRAdnfJ&$seL-!2MUG31 z>)DmulFIh9+|t{&meq;77T0F>I<&kb>xIV~vo$M^9%irFr+Qe0m+^)crRKWVGqL@nd!~<@Z~I++zuOa} zs&(rsHOgMi;6}_H&N*9>=56LyD$)Ni*=N%9G5(?VGw-aNQeENlK>SF}YgpCD=8U4u zIkkm}S0-iO-ei;8{_MhqH^#pfl$So9 zvfGsWB`b{B<^dM5IcgV&T~gn3#6{_mkrlgXH?e<1BU>jsd-re)t2vjJ`(5Gw5ZW?f zzDwHHnND%neyQHczf)2;xwWZr=aZJ|8z*yTs^?~gO;3!l+OsX*`1X_%;p{oprh;`X zfp^`SoMNmqE9VW%ZO}E2&#hF7h>Qz2ieGey$}q^XYQ3Lfe zxo9Ttj}#^Un56e4Eqfw;F(cINb>rjI#|N`PeL?P(uDpVkO402rm-d^NPTFJDz&l3eUMVt) zj9l%sv*!wz!o}l48{=L4s;l*^X7*OM4_nsX$m;MI%J|{=cuFXZu${9j(>*FCcg~%M zEm!m}H?=HiDoKldUmbTZQ@QBbIpf{whiz+px0pAX|LVK`<=sH%lOLBD1w5W;ZtYcT z|9I0CW$E0;xgOKsdYZ7a-##_UC`qx2jP@RwBsHtQl9~UtHtAEv+nXb9H-7z|$?z>Y znCJLvOTJ&M14_ zp!Mly?oD}RXZD!Y8aDs? zN~`_uH;v1!cJI^~5?A$sy_Yv9GTKDRPCR5#_#}_oxO23%xjBs>} z&JGJK6`l9Fq4#lY!^Dw`zlLsj;OU!tCCsJe)f|;!ADkW5=Bs3$IU-DI-syOA@IKMk zAY%Wll9j_ak>&pEi5C|stE4~R-6;8kyL)4{(oFp=nmV)dweF1Et8rjUh5Edv$0|KP zE$3J5o1>a&rK;vSX|%D~(ZF8y*C+K!4(;7r(rcj6AhnY{U%DMKIPs{&&?onuaOj&~ zbUwtlYo9So6$DR<)*I!btJ`K{s-M4SLyryh(;cQyln>u)Svm50%$^ZyAJ03Ee>G~% z)=0HcvJu~nX3z4pU)p2gu){wD46V6jKg1w|WxJp_(q{j?vvzlVpAXh%Jrwyqjp~=N zH?4n@ZJU|Z;_IgF)2Eq8`+rY295m@GdaGx?E@yy6L2aLbUnCO;j8R=}wc5DF^6c76 z*6)5v7&I*TRA9nx+3JPAe+cfqC^P86;De$2`WdgCJ<}qj$LpXq_YO@6+woxCrm1-| zf6(CTZ@lf^cRdr5vTkheeH*yaU%$Wl>sP-b>#S8_omoLBY#LI+J;4Syr?Ob_-o~(DI$J9A} zW=x4*vwmi+$Cnw#DmSLNoQs(r|M1wv%L(z5c+ICLh-bVXA1?aY={LLaVy%V2V<$J5 zkK6TQueq;R%$hft?Y&@4(U|$?Dpcltl>PYKh~tH`HtN>Rz8H4TrEYlRVtUS_MP4tr zE=<{WX2~DXLtF=b<}3}E;Ii!0pjD5D8Zq(@tIyS)x&7)%@UiNKQD#own(u8_ zzd=K($!vZ~k(p>{{Cazr^-= zyo}bK0?W@;8;m|BULO0=HFM2d>Y4MKl88;sk)zFCPh6ngqT&?$?uNzD54-obzMt9t zTlKmnlB$AX3u?aX(7Zq9$?)3M?}{FsP1^PFUEi_?!=^s1^i{8_$na_^Z>q|>XO+FV z)IEiJM|x}U-G;!GWul%-t}Ja6Ts|Dz|7wkS*fj(3hsTc!;@v&jr(s* zKb`*T-YZGJT>t*+bv5nRH^(c7{I+$~xZAS3J#VqkTScFa6GyH35*lMM)_UKw0fup@ zV-6o!KKI0aljm<@<;<0&qH7-$!%p2k?4T3(Q|tO8@wow_gP}?~hinU{B)q-z!|okJ zZGN1(OnHyST18V*P9Je z2mdiBWzD>`$IdxANk0y}d}PG9w?{XAJ)V5=z)!iCgG+OGhQH^D(=MJ1|7}P1Z}-*D zYMmK*X0n!h)-KO^g_R~N3iObV>Yd=f+XFsCqJ%!^u6pC?`vtN)&%j#{dOzBZ2zfEfmYhs@<}=O zd7D9LV$a)+{gZ?Dj?KDCpX6_tbX{t9dW^xIUlyy5^v=!RMwJel<=}JR#WM9Ri<;|3 zKRvL`bL+M{4@byzZttDx5;}N*C89OQFubH#D@8gU_tE=El7?usUBlZG1rdyDxX!qh5K<3Y%Xu%t-Tm z|LJ*3;sGgHO;?T8w;$bnKda|(@5)UUW$U8%`S)oVY4(8=kr3q-J;-tUzvw7e)h`)#!}am3%o%gr#qS&A`(^Ih9;`pCNuL`o{#Z1o|4)6N^${JM zx6Wyoyz=y5*Q{S(F3KA@@9CYTlV*iwwZAaD=RUHpU(L3OD!xLhKY!VXg|;Ko_Nqkm8SLMnvGr$u?ugV?7sQWKl)h~JxyR&zgHFGjF~!bg?c1G+ z+Hvs~7uV4Ts(Y<#xjt3qoM~P5l_gv0Ar?a?<&J2 zzq{Yrv#d7nj}nzV-)+c!Hf#kovAVRVZ_)Ngw$E)m=I=GB_~e$bGLfr%A@xEr>*uOd zIsW!~e3d!9f@UNfyEU-=-1l3xwXQu5i4j!)W`6Qwx`UziMCRC9)2gdpYa|<3f}q=( zZNCOzKeQm_wMmmf+@!CkhG$IBUV3xw^jExFuXlJn7;mj6rcTc^_kj)BR?88Yq}qq=A%67(Cmwm{q66^#T*=JZQVA@Z0`AkiH)^ieq6Fz zIOMT@XokJ@E$y9?PjDO?CKN_&rk}{8*DiK_uQU1CqOY&#jfwXQ=k+Zg<2L^4u3N{$ zhGpEY*yQBkf5~jg#R?qIgzckxBI`w8&MxPM%TN}L2yT#Tj@f3S)aW=}KmTsD_3TCSuG`ze@ zd2h?gz@f)Ho*mu4Jkf6Zea)2o2kU!3yC>gXU3S1?TAs>>N%q(m2;JDZtZ`HQ|=X>o2#PG8f@XXhW> zUvOLN*oFMWeD(nTcBN(6)#_J8&(zLr+ZZrNd)kVHCwjU4Jle`DFUsk`THfmWtRlKB z-du36X~&i`tNY~U@s8COCk-yoZ%n?fyl%)RN^4KLN}NHw=Ho(*m7ARH;x_l?)b4$hD zmCt;}eW~^zGI6{2snUE&O|TVr{L@~X!ONzp9>2a(eu__ zu2^t(O8~7>?sYz?-tCs=r`o0Q*Q*Db#Fu8}q*q?+G5YMH%^Eq@BV8|?JLOj(qa*TP z=AA80P_N75B$S;A89wRW^V6YaKk1p>=SJv12o|b&Jc%5+Ja){=RT}9oD>ta!)~x@j zU1eYYOiJ}kqVf;p_h~hk9p!IZ@rKpAt%T>ZWP$sK8{VGGYI{G!-+8|NYmLg=Nh!))C$k*vrPt>Db2e$vf#=9wF}uXE;$z5m1kYk+AB+JZ9O5szA_v>!RugkPJ^Sy&n zp8BCZWic8T?>#-&^k8G(NB7mr%kFL+TUY-2ESyV}%xgV)*oDQ=h9Mk|)YS_GI6yQr3P zWRLnKqen_EyPMc}>_t&dwnm2G?)G+<=2%&9ulOyW&=UH?)-;#-*W#RJ@^@DMGP$ti z&d$cB)*IC=Pt<4To}3<*nY+g-BJs9y{I=P`k|_ey>N$4f^@Ozn8vk6h+it^31+cb3Aj&l0T9rjvsK-H^Ap>;Mz=I+u=cxr+HFrlenx>XiI}~eN zkvdFkDeSv9El%}T+-@Be>ZYr+ZRLbr?ydg6&UqXTMR@VCX#l9P@?_4Y0gL*Zr_pQyHD^7}>xoDwKQ{T{3Ppc--L3GH;baa~US5GYe zH}+Gxv0%AF>5QY9(X6_pod$hxrVW;SEiym-Saj-Dsbh{+gfPi3TV?ABk@NNEdUHw# zP7M3JBGj|){d&hi=bT0MAx0{_hMEhxZ;IwjJ-gfayTDq{^|no6lD4-EzZaK$ZQB@K zdT+G!#?4myoe_n~(FyD37M&UHnU+2^K4PS5M!d=O)?AhCH!=k?mozQY^lO>;n`8B= zA2mxt#tB{CvQ3?y{~YM|GvgFmHL2460I$Jn&y`&2SY)J8QO})Ds}~o#tcY(69amlL z=hAzomEN*2d-cOsM*SZeQ)7fw{P{Vy5z;94%w2cpwSMc=^S`Bz-Y-wYx9YZAKTY@NtLf`^1udwiRattPv2&< zQ%W+7yrUy+%%n*J^E0p1e@d$TI^yQritoQR-Y)XZV7|I!9~`5Sl)cFz@ym^_7aa7m900l8XlKn`TuEmWTkwHFz&RP>F&H= z0;NCga4L+PxWtsB?B~$)vZJ2u7ER3oW8-Ifb28?J$y(RX+kC@)TAwQpo0qnj#{ZP2 zdG8TRWN&eB!euJcQ)->7+M`S3gn68{F;#+t+YS*t%i#z6AwAafhI;Fq) z&I|IQ8*h&6F8#y3_N&aasiFG9<09QJrD+fP`eIk92vhS0Bz zbA3G@w77&_8KyGl)mjJV4`(t}@|%-{M+VTu$3h&|ME!AqKgyR57JeX z|0ub^%ig$~yG4JdQvPfm&AlV?P@aQf-jYA-9)3OCFstc$e#A_{*E2!uI$NI;m!7w46zNJ z>2BDQuRpzhLl61H=?;~adx!6dxjypzN3{{7UX6EDi`+WqyAiTcp0n7a7xq|cAMnHB zVfL45hO#mYhC~)GuswTkzs+;syLJy*+JmE>`ij!_X7p>bZR&r0v6b1h>F%cA_m`TO z9BiQV-irDT$XRFJr?$XiqU6iK)v99#v>30py0rGJWx_A-tWPBm8zkGE5cuKug{w0c z^$tEb_(70yzkQ(=GiR?2dfg*r!l8R>);-t}HZyPPCVjrf4}INlZ%hec*6-^*cHOU1 z?uM_wUj07Hy2x+a_^?&AtquXtqFVj^w&waSei6Eo{hjTKp$>0-_?u3?e>oT=;AL{ItRQ9JX7it&t?b1u`4 zJ&d0opKy8N>1N)f_cO#3eins~A8+@YQ}9A9v3bMfvAurWHE!05*K@tugXfJYTC+f< z;@tcnWgq7h9v|^to$kh2_rfmDZX90c@@NjdcC|Bls?>ceo4hhA@~WE3H)mVj`xjI>FaP8*&1tp(H?Z1>9e)s47joPyG)6;JxUD*psUH|2^w%YX&sa1zQbcu<4(+7e&Ee>ll@m1dF;n)MM<|$ zg(b%6I2=B*zV#%&xbrr_X6TOH%FCwyxb(5c9-m#e_rCav*?IrN z*j?e1xjS-AuWsMIJRzc3b76QxR&VA`&4bNzZ|;lqNS(c9gh7vO8bSBAN=xf94iwPo zx42%%Kl!Je*tqVG%&EeGr-dg2PW8Kb>ZHNu*J*?P7@WFx-kKCA$8*On5Bw;7J8s00 z<6k!({prBPiT!(e7v=BzMdkRb)49S02i*7CHP;S%u*|pL zd56lMng--t**TN{!*cnB04)D2^NTB{Jgi#zW^m{u`Fw%L!lVU;vs!JAHR>h_T33HO zIrbOX_m57cUGpBt4_aduaO=0gO{ezj8E9L5K9}N{SZc7Xf8*_*WA_FppQNv5U7xgp zKjyTZbn!2H4063ks+LmQvV9z84N_nB;y_*VqAlAFJRN;!+g8sU`G|)uGxy$h956U^ ztDye*lhB3VX;i%wuPC1V@yJJu=F3S3oXu@aTxKpvta~3YdDA}ryK6tBiSHT6zO0&2 znl#knoayc>260K!P3HX#Cw(p0NIS7(_O=K?B#48JwEiPiysJ%FDMz=f8~4n*zj;%o z_weX-Wfm=c{P%G_n2q#`N{HC*I4Jt%!hHkhO2+5dDt}aels>(8!R^)NdN5|4|&y{i*+$B2k}beVx|LJ9xTMzU$X4*TEz67QI}0=jptx zuvwGt8NO)u>pRk2W#YD)-=Eq26250oV0q%p0cSqVj#@UqK754j!VwWFd(#^H2lwIs zyj5dW>WJKw$Kne=Z~dY)XyD`?Q)aw7{dTR1U7U8}&UF_p;(Jvepr>AMS!bQ;ER(Um zmL2nQT4}sA?!)@w<}(k(B`taL+VrWCq3?7_SmnDtcieyfBd>PZcY9PyhCR#OP(6`a zf#rYcbK6JT_s;jQar;zZ!cAP6faSk()z7SAd;gqMb5!_x2{VFvwGX^?OndA1=RzJ| z)B3Gi5R-oKr1?Z`LkH8f$Cx! zarU86_wD;f4m}tXH>=Is`r!GwW?yO>6NRgn{1~eLc*rel`-~HlcWO^)aOBXNBMR3> z%b)1HcU}B-(X+|%W9Gf?%M14#?>46V_^n-6Z)Xe(b8y;JvBd0>|JfaDH&(p*^>RQ( zuSKe7jy$gKt^0QK`t+%lJ~wo-HA7Fh9w|9L{Aw7BY0EhL^q`(d4I2RdvyJzp>3eN0 zSzR;6vNphS^7*^5&6~L@`y2Ald_P&^Xm9H?M$Ti(##t@$|9t8F{b#As-n08;WZm3w zOFbmk?Y!4(o>FaijD(y!R3e8L$bpBhGgg}~$@x(NT5--Q9%qfnIU}^w&2pd&m^~5> z(n97a-G?0H$kUfnt(syg*PiC*_ojLkXwmIw21(c-ah{BvPmGUnB~LjDXm4=N zTEZr9-*Ci61TJ9WOd6$;qxs~^M`b?>dCdZ(!vQN#S*+1Q0T!=bfzx}y3@0!F3os3F zH~N1t|9AOGWPBE~B{G6s4T+414s^)KLm?v~_X5bB$SCWZj6@0#l-_<}Q#8U*fp=uk7YoXY7# z8O3uP<$1js1EQ~4y=8_tE4hH^DDoWWuMs&+mfeG)Cd><;H$KN7nmcDuRT*+SU5BgWL4)w5L@uq@>K?mi%~ zk66(kKHwec1K7j|6yhwV!Ut#r9`OS@IM}6!LsmU-c&&s-QCU2in`k6soy8bAYVvks z#|qsTEawrK5uZTh`W|OSKT={o+G!GhK>S0CvREaX5^J;qP6ZUjE&Wh*hBXs;E==kpkjJfLDH(AL&DN;qVOh*X2h9@FNEQsSU%Qd>}Rq zKcF=dK7`*9W3W(X)=cAEMT9?6!<4IEF46`_L*M9??k^68!6%oMO-2IORPa+ zk2nFP+7*B7A0h4Y_jrWle|mB;iuk33&U4RPhT0tqzcCbt2=npYM7I7>x{8GnD72vaFsU?o=R*y2se)G&vxipDc*dS)L5C^miXmx3Xe4}sKQ<=)&JUKb zB1Y1zoE~Ch@Sep)iOD=*1sU}G-=w<>*N8uH)%r)cLeB}VIQRZnTuDEIYc6oj7ASD- z$;2^+pywoTHN<-^Jj~0gLdca#l~b_C5TZAmJLg2G*WZ6cuhh1GuK)6XX)q~qPpzr3aC?&JN}_cZYe z*Z=rsP7F=XNwdKhLMJ(c%|>347K852v+UG(q*1Q;0sn91KmJ)x&bxP&bDX=C=XWbF z`m>xn>d$g+H~3rvvvXW-?4RwG!KbcrW#-RvK9K4v=OfdFCy~py@{n%jfTPk0pT805 zPP+IQm+*nemyfgLgb#`|C*YGv-m`B$qzKsibUrhZs#3S z7*X%8Gy62!sSzf2{kqy2qJY5agl7R>QKh()a4DFMJM=|y7N6*LXFJPjNC)HU`gP$q z5CsHwS34QdaOf-}{Yf2oP7T4;)dxwdkNERn&g`q=*ZC&$x0Czd&g~EW$LIF#1`q3e zk?`L+x4)Rs(SZ#)x32=6{;md_|C-StdwVk!CE#Bnld@Gu^9X@=hm7R_4 zFnWroo4=J`z?wjMlA90SeWl&}m(%3ET-u4e@l7l6>;8ue9`Y4@B-~VjbUNh9g{*1( zBR|qcppYApqTpLONi+CIeteWNEJae0ViVEehv|pKCL*V(4zxSoc`8wsx~3p5A@6Ke zDN7}o1JtFM+smEBRFo0z5Ytm?%Sb7ea52D2VO-=MrFf4Lex0TS40RswLbambIo#VS zxKf%)mSeMm;>ko(1H@Pq?gQd=0AD1fYq?Spb5v2U#H4O&?~nRqT{%@Jl8Q_iik&T> zd1SueF_aW{EiU#k(v=5}cV-i3;9B>qF|lwT}{OpgvqtpC;i(4Eu-m8%TXz zZ#fxXE!LQ3#Yljklu}jjYo}N-=VNR>_!L0e5*iWnsFZT01FE=EItKW_xRg-$CFv4H z#p;<{PK}`{@Y4ghm`5qo%E@RW7s(BhEXDjImSUqAPJ4Se*Rj1;B%f9zl5n=*=Ji&a`IHedVm z9YLb=z$1akvXnkeT&M9!qpsN~w3~4@2|^@4rgWPd))@b=)W8u8R9&-1)eBw}o#3s>ixuRc3-2%{OQ^Tb# znN&tY6=TUniv9$q(+e&=KFW;I$PrK)**r1-Io4b+cofxQMsweoQP4N#14M5CKLoh3 z`3z+mj(9j7`clrN{Yuflo=Y#REpQAvC8czwHgua9235Yylea>mMvwKi)g<_5gh^? z)^^7MF=!pZ0r342fk!spj|NR4xK_MDpIQ+u!L^R84|9acITa$R=X22W0`xS1cC>MY z%#5<28)aO28er=mhrYqis92>%Z_K6q?d#iI?t6J1>V3Nu=OyJFvq$56dwX0$HW?QGz$3|~E**h8$?u{}mrIw_nj zG4HI?D1mIqo;l%v2R~`5R7BgL{{YCwfRqtgfuC0i9~5%xY)kr~{5@$OMdST>Gui<8 zCs=dwyYrp&10Jafgzug9j(jrV8}eOzPbB$n_MSl6{{wrECFTE$$AArc-_-se@tC2) z2wc(+{nry)XE3LcIkIa$J76#EgE>zP@_59gO1YTpR+BzeTsji^vfUK;6FbLy?dl1- z5-Ntxs7J#$C$cFGz;vnL$obmP=LDgNtb$8v06(HXlL?=hqm&`qm_aV2tVb;R>ySB3 z=$=)=MZHu)cqokGi4Bn^KCL%=z%=OG_yjgX-n-|^?AqJHk^Ux2_yICrtk5J2Hls>l zlKu&7%J6`Ngq?+V?yH21TAe=4tJTLGqz^wPqM0fY{bQMkj;a&U8)2`JEh2h5Y}TH{ z0AxJ)Bg;gL139Y#mR161Q(LnR{BkO#)|12sX7Dd)OP-;CSD#7-i;1m^6WKB~^ifM- zi~p@Y(4||19x?a|nv|Gi$2QQdtKd1077$(`FF^h?+GY_sB!a$J>_hA`m$IYSVvSlh z4gW6F0v<=T!3(rYBfQ3aM>gUlqNkY8G-BBjKH;(#YdDL(4E=Bj0+yu0oui0MD) zs$F6h+6pkvf8-zRhz^nQ(65989{~LT9LE|C?Z;&(2jqz#(1pG7DmV&1sYP%?{Vd3J zL=?VR!5o!n0nRXzK4>RV2M^RE>?DRrlW#pBFJnQUNepHk1zrIT!I8o|_yTZ+HEcQL zAtAg_LfROYZWKqNOVXX?e56GsYGNviO|yU#*|+(cz>%;>dABx}|D=s2X=7L1UW)!~ z$nUm-7Gf90?Ke7o(RD&2gE$}xzAjGH@eA5rj$+GI$+JNg^oV?ep<^E4Zu#pxz}@`U zd4T%^X>kxxWV1!`A=dG=qSQT}K7jaI z;eQzJd{U43O`XIXM7D?lj1dcPnG`9JfpP^`!foKfAEhYtQ^ORvld`DZ5^hY-x&-h@ zC95OO=BJCHgL^1l(hojGK-$)DCFENaZ32cn60v~+lT6@pH3y@viVL}NB?CHq6<7U@ zNP;*VV|Vy2Z4y6$XWVeuBA572#2oMuADC1LcL+nV!zrYtVhzv+8$(-^+cBIE1UAW= zFq~%4#s$yJk>1qIm5{l8IGbUgK-{Z{<4hR#P~bsyaIy)*D(_4$MmnT3?Txf@8QOp* zz><>KOcQuVq73mAbO|va$zy!NLmS+=rQi{hYyy``A!d_s74=6I_090p+9h1c_D*|h z#GO1-uFC>_eJF}b!M9}Mb>!3mODQ{@EmLn$qDlO&opf0S|3$&?VtzR)VPQ_;g8%$j z#LML(@Tn)wPVJCI$J!@WrUJN#PiYq7Iz{XX{#0jyb}7D@AqT$&4Cfxnqun}!r;y>? zA$j1Zm@Bvp=Qre8ow$y}8qyKI+ol$>1Aq7#cCXvZ;&eRPQ&h!j`-e#R<<^uT`tzfdXm-7YjGwAR)(qj_dbF$3MSR1R zv#Tr_tx}XVqO3xlw#nkkITcnEzZqraC@WK^)zF_?X3iLN^#yPE=&N+l9&oz%*QNRB z&-+_{el}OGO!@=g6GR4(EekT9fV&dzDny^U$6#^99#SP76MRnva>e@bn=B0Kc{F6L zkcE1uEYv$?pk=Om2fh=TR)FUT9GS2YaN!fwO93O6 z77JtgQNmQnh1gUB;!wi-GBa8i{BI;N0`MUGe_D?^=nskc0aK<$=pc3y%WiKY@+L7q z><_j{6F+~O&|-@@TPBkDrRbX=?w64G{}-7^EF|p-FOa{|L9^-)#Kw>xK42>mOTo{7qT6D^PXdF$ z1nvfer=&lzwJ5BoN-QW$Z8y=GyoF4(7tzLaxl5#cFxzc@Gy4f6l6#R&V3;=@*f2#`}c@4Q3!v`2wai9ksF&&S<2TU#43Xk|j zl81eH3yRxT!JfIXCX7}LCDtM`0?jsn^O4Aj*c9;KHA7yV{mmfQ%>js&q0TR=Y4?7 z;x3*eejq$o1Fa@yojgYj2^>MIn)u)1Ibax9vE|=*4x7e0T)}f?!gG=*V}kFC!FTn4 z!uJmfzQf=AFY?{IlkYeF5#M1$#1{(Uh)%N^A$;LCohJTJ!FS>ZO=ZIWDc>78u!UnZ zp=oN0fSyeF4&BxT&#>n!QOA1FF&y9EOI2rB=^~k07Mp>sE54g&g?U!B6#a?b#bCb< zc&JA4D8e#}91AI$GM z#AZmWfwk+d8gojE&=iL_414kXDl5cF;6n;W&L(3E8EOvb!?+TDEJx0fSyMvP^HVu; zuFPCaVpx6@N3JBZ5bJ<TK|RJA6Eg%TR-n=a!huDBwhNkDRIGlmbRGbR!&o6?|V!VAAH{jkmFMXZe zF)w}90_?xcOGGx9Hx#j692>D7WZ2!#YIz-YMr@44dI~#(essoqjfg$E<_?8_1AQ!A zvWL*=PYGQ$nD;B#Vyc-f5g_K&C}B&CQ^km(@a&XN(JOY^cXVMZB&yh6Zycmup2GJ ze8|B#9qV7B6ODjZMPW?_o*o-a^XttS(2jm6Cu27VCEOIm+6~qUS>hQ)N9Of=6VzCi()>tEK{R;;F`w-RzHPC0$pXe3o z100BNP$sqk-I+jqI%whwioe9bUMCRUC3*umWG?QQLzCr1R#lxoxPssd{o9^qO>^NB zS#jL^Ve>_efi-#!Zo){lyLij$(tsHEuP*-5A0B6ddXjo_Xx!Z$gU=sw2~ zZ(-e{un}T=6?$P!*HL?0Wj6v+1*c)t;TQNXPY*2~thWG>$+leV+Gc-l)33RR| zzJbhh9p(RhtN?sEZRtx`hb?^>{&!m$-NE}A|Q!3^x;_DiSujA2zQeKBG#hJj) z`eB`=h!x~rey$O5*J8bAHiJ-cPZq+iZXxCymw8e7qSNeUMZdx zz$O&?F32M$Rm{`hk$Uj6YmaLN$#?D%b$>?XOv?Y&J`rFG$_SkQV4ny!W~Uer{ovQg z9v+!1`penaw_r=glRVn=2EGH37kB3MI`a;ld9sch02)L|m&9a0et^u3HqJ7pS2OT| zQVC5Zs?!|o`}N4;w12H2?Mf8;85)rHTY__yqA%uLJjX)Wb5d5WXvcJwJtk!Y_TTzf zlJdXuU15hpDPrbQ9*GSVd_GR-M81pfsU#1*>f(E{f)5-q_J+iU;APi->tRy>^Tbpg@F^4F`6o}pg{@<6gXWfF@1Y;ou$ZIx zwLI*r>Ly<%`xn5Sth)piJorrLY!y#}Sc5hw0Sv?%#we#zP7|8pA4It0`7k}8nJ2Mq z#XmO>WVWGrHDZvYSLJ-Q5iOS$v__#ifUCM`D; zll{#Bq`VpRrDhTbMcq}!oUVa5iPTMlKO}WxMcri?neX8fX_`FeN!3k0OkkGr5PO(O z#wVdK+Tr;a#V_Sa9EkjY&#-1Q385c4C?`A{0vH1DW<2rV$YY*>98wkhv?6Kn!?KJk zaUl4U=PBR^$%_F~tSG~?1n_Da%EqH?yrK-xGm+;5u44ZP<@_q(RSJJV=1I`PPd1@+ zr1%yw@QzQ=O->hqL;o$I@6({~;}L7}$upWnwpcBey{Qd-)MSI(+sJ%C z`qr4yqe^&mBsp*t2O6SuFi)^$EbBfbuzQRK9_sZfnx}s=jxa7Xg}ETs5m8t z6>Cai&!Vjrw#4trPzO^?7?nDnV&7M>$IHg^2G}QLLOTF&KhPOM@MVrtLO%9;G1u@> zFC_K>TUkNoYtW{YqGOU%!K27Gur;E%VzoNp2mK(=wJpFC?K;3~1Ux(kUl`MmQfp8b ztAum0KL?snKDU-HVZlDJzl!f=_mpW#RT*92GDD7f#D?SX%ud|EqlbX^&I#yOr6yq? zFlR_x^#rs;Qung6HAgt`%x)+$+9Yp2i~ZH zm#bNjG3X>ThDf<$J(LSjt{KJc%T6|7;EUYYfX_}A^kqXH4n#+yI2}5M^%1_IjXf{K zK_$QweTjTr6GfCd)*kA~oX2b?MXcJq_SEV2|MGsy~mbFhX}CGme;c>ABvBB3Yo zut#!!8_y!uNgp}slhWA-&r1K^2Q-LNxQu>x8wdUHtM0#~NR9HYqhxH-wDls3Mrt%1BY84qb~r1hW&YD}txi*a=0$+LuAR4>@xGL%tl zhFXF)JIgqz58Qn+Fr5+9Ovd_8o9IYtw{=rPCSR2}$?eGlx7i**T);SaTw zF)our;wP3_8J9c{Q^cE?M`+zxj#xL5E7MIj5$j@J#~u~N0$c(M`{_H0d=YnZPab1* zO&H1qxD(%M$sA+UN8p)M1>k{KqeyuQ^pivG^<@VuSUPcRi@--S`=3FZP7bfT}&QKWT`llxvu4}4N3d~O9zOd8<{rA+1u$ln$F zM>wC)G9YUKQU*S9vA3(5%!Ur8FxsGt58iP>lPkfW!E--*hB``UCFS6`!fwEC4Z?5m zON-!&xyb>0S{lqzu{M!OsuH7$yf%{pU(8VOTbL`^j5g*!Klm#Jees|VI!EN#MW1@2 zj(ZXGSG^4Toc+i;4QF4%u~v&7N#lF>INOsVR_tkEd=_xDBzZC(>{uHYi_n;A!l*GR zGGb%;xNCzqI3G(l{z62aYe@x-uv_>` zK~_KbbyJx@u_u;FQ)MCv*%Nz#eK1{&OML$`xkxG?_!ab`bP#h9+I7MS%~GmYHo0#X z8)7c~74)&t{yL%YxT#nO8g!nEXl^G?Lg)t0GDy1SAMji;|ER*ov5%(EMZ|fuU%s+f z7|xXmKO(*cyp1Iy#X3Z%3l7TOl_E|i{kqLPWd3U+<(M}$q%`@zIw%d;j34QTc*2#O zUrP`sXO-ZYF2*K0q6GhA8AC}}WoDEHNfVnOH~`j+WUg2Xu+#xZ!B+ySFM*+J@(qRo z_S(Ao!~+icDOCX$?i>P#*hGv8o`)f}%14Yh68(?&aL*z*eKe!=i2a}~8*`r@*0$P2 z?pPyq@k|@O33ImmAM&gOJj0yBPodC{LuuE8PoN(>Yx|Yp1m1M)VM6aQMt7cdFIVua zyY7@jcMx;y;yjQ5YjCo*R>z#K*iS{BpbEN!=RMFHN|1>7rULrGBugl?gYL9NlKs>U z-D%rQbO*jk!=$*)r9(g377_j5e68b*4mrDl|Nlfu8~otlDiG3CjzB`4{QuZ{7x=2K z>&}1Qhpw((=;})7fh2q^$pQlgnV0b+=ENomO`MiAwDrum;{yT*8Vn5J*6H{kj)kXX zTz87GBFnOiuZ1i-u1hE-R3@HqqqvDXbz7BDR1M8AH$W2NxGp7x$QaQ7`#bj>?nQ>g z{-^Vq|9n2VVsZA~XFu0oYwfl7S$prv$5IC-AL|~NeC!!y5O$c?7QjcJB*Oc}ZY`t*e22;*@Q>dpj zHU7O;Q=OUQmUTt9j&GY~g&7}ehm$ScPtC}1$4V-+Z60G#${B~w{>$OHE#1e;?a*_x zoN#ya`t93@^R()_+k5};lWk7T$#T2w*&D2IN8|_Fk5r=vN1V{`LR0!Z#xHc+YR1nk z;KxCJx*gH+@$LpU1Rs}nx7fv=y+W^>psat-+yk6@xV{Jcdip#1+amC~oIK`}-Uk0m zcA#f7Z*jo$I&iYICv1g8%iRU0jCIEF7iOd0)HE1D@9Rl-LzL z=0)eL$0-+m+>ss8TYPVJc7<8TCO=P)I5fUhv_L=KLz_*EH38{5k~ce} zF8dy>b)qf47nIrb5$lrZ<(^z!cLKReJ?~MtcUAebze&R?mkhR3W59OyJwitOAU7N#WFhqZ@+Sq_vp=yL&Yo1pRkrq z*uxzKYq!5J&#FP!Y&=o2!feBah49VYX6<(JSR|V5g;t@_itm-0$><#QJ!?~o-8L%|9)U(hmxq&9XD4%~;kj0)cn^Bm0-hR>HPxc$-sqw6o`S{WFTroj@76(A zlc9wzl=--5%Qmsq>L2_!ie|QspIrqWXb# zNK135b;ybWxw{f8_rsIebDC206~6O(W9^5Ipda-lR;J#Rtbg7czwalX5VVhele$DZ z(Cs4RdolClV$~&|ZorX8HyS(M2i+8jZWvn(>*&x;%7k6BOm$~`{$-V&Pdm^IYq_$s zaS}VD>BK=~En{!#IppjZ`J9Dz_7^g4x26+&TJ6Lc=)-+JW!`S_#^>+91?@ne8Xr%v zM}&2k%iASgYbW~Egm#6*4{!VJdi(vg%i{-V#EceL$Rbm^*Y?^}*A=tE`E44ZO^0dI zS=!VePA57TJD5MBpJ#QBbF^uIcJ7;IC-&2>F}11RF=w)EI?0{`*7m(NefKEu{4t_L zV}$mCRKUC30hW4+F=7w<8eV4qgikw+4WYY44?LGjCaCYg$s+o9X&+^3Y#3#1Kz4a! z!?QDxPsp*3daWH`#~QaQJQ>Z{Fr=}e)D(I1(7A4r#)cur2ISCEjSuAIAnP{vLT}Lb zgYfAp$t?Q26g^(!lI!la%WuK9hqw;{vv#x?_G2@K^qNxY7!T1Fy>oXv8biK_3|m9p z9P~-)&d+E4rc!kouD0&$V^7Bs=J-b^S^tr_NKGGejP9siu@jyk05ru{F+mLZxijx+*i~SaG_jGkWMEZ3*v!mxn4(bayfD>qcI0n}O_^ccMFQEZLe0 zvo2g_m+hXBVXRrpSd+>hYc^@D8RGpD$eNDu+U-XfYa}m57;C`mgW!D&v{uc!4D+C`=2q^crrsgDLF9+ z-!Rr|UFt5;b(7Di>X+12lqsc`tv$HyV zujT7yd(DoMExQIGevY)As{w?c(*BJ+DGV!hBqRI4Jw=^@$g*Khgv*j{KTAG$wwTMtc8xW_Tf4}<%o;GT66_U<^ItnP@U6T-dZ+mMg@olT7Q zO=%zZ4&Sjod3{1Uu`jQ`BYC|uYK3~VUyX4AJ!f5ZoV@rq@WUG0M4wh$-CnBzUWjX~ zr2X`P6+*^LB0NH0U}>m%%Ef=y6FT0=x>K}|buPEhEt-Dl;+v8$y#GG*?9ir*e*C}J zbL;rI2ULbHKVzLvcI;&@NoWWB=ss%48GD}=9+0c>%f*)@U(vVMc)FNt>XZ*UfTx2~ zc0pfqWvVB+vM+<2LjNt(dP+xfW%sd?@o{8UNV<0#9r)OcbfS~?e+gN{dPVZZf^_X$ zldaB|3R0mr7g(L*LFMg@@qJdfJ2%F&FTe`M_}dxd8S_`B7@HX5Ey>>v8fW2i#`vs$ zs5QUS&`?LrE`oMsYsvbU35loFHu0YHchL}gn%)l$c|0rH!Dht!zCpR4QeKSnzoPQ< z=|tAN9e~EEkJnQy;hwrmpG~Z15l8ZR z(NVtHcX9{i;o?Kc7F*{x{9ZS*UGJ5a@pct>TqhaUg$#pMONN=N?L?yD@oPCl(mK`p0wKip*n&E_dBYe}WTGic$3^_4>Rrhd-V;C#L zUDC0uxhoYqKf2JAK+n<(wy0dno2;@~(@gY*7mxQe!w=~4l0V?QSh7ItD{7y{gQi2{ zgKGc8v55Q@v2J?Rd5?HVbd79#KXiS0-y`oCBX@%b&3k^5Pt%8?Y3R91YXe#%7=oUU zA_IeQC|Dmr_hc-xFU@<1r?n+--s8(cukUG_H=cB7b)3?p=qfwt3wSKvsqtiKWjWmuD|9RyRzcWrE37B{Tv*{Jvf)W&;`9#IWED1)4U?Q~4#I}BVLIPq zY7llb8&*zOT@V(OO;}YB7L-j`c@UOYZgCKnS8mkZZOUd~ho}1J{Z76ybvN1iZdbxx zrc0nH$^JXgN0@JojY7{>T~!+{Xb3oqP1I>c~yVq%Kh-t?P>7;Ql%$% zS!>VAUGd9A`t;`@SEbL>K7F2kfAo1pxvRQL?yCHJ8f9Kyij4B)uIA;MV=*r;MfQ4h z8jRQ2%6My7-ufqPhK@y}-$xDyragG@hVmc?iCRPsqO^Jpn+_Q*|SZdrQ1DLyLQ99{l#cvW){z8%$`sIoeH zqp8rb`Bo>m^yDCECbI^C92_6-jBFk6(0AG0%*WtS`XD2oorrhp<>`Zi0p2I9^&k^J zh(36wwVpxI6f&(jK2Pt3G}~{q9>?sSa1-yM2}3nns*v{|8;} z^8Qbmia_6)$ag1c7j2U5q4#ZEbfC43fbT~9c44QV;2ZX(xmUn}rov#CVqHGcfK_|)$MeP5|N?AfuQBXIUW)@I3Sk?xECL-K>a zz@F-6`G+GmvfZuaePB;DPvN_=XDyWLtc4yM`L8*;p8o#TQ_AOq*|9Y$U!{|drZESe zot5JLaJMh-TXD+7cV^2=?9=m6z9sQ3lDLc9e($>=-Y9MQ(*s>4vu)^C~b2S?ufyX4Qqk!RC)I3gTfb{@qYiucoO&L}H^ zzV$(IG)ws^9X6w3zH`T!$IjxLPA#&v3W&?Lk!NrQKm+FiRB0X-21m?ou6721zKKU= zkE*pW;R%{D%p==KKOMU9a3_4WVPlYQFQ7ESr{eCg4Bve$t=FEAU6^Q4`1Nsj;|}UR z5|$lhM!3et%kzU<&wsuAM{@h8uakdNxV?P;^fe04$L*EqZ|H;XpJuK{-;<6yGMCPT zp(}8LEoYO}pmsj&?;rNtbCcfXwP&91585+F{=D{J-*mJx-ZXwJl;*jWpQ`i$&1WsDH!G#L8EP!s((RIwilIf$Sjo6MM-kk1syv`vbnX zQ~o@@SSj#|okU7mO!=&lWm5>t?FL4^H*Yx@jDknz{L4 z7KaU<{QV=_!y)-{c7?y+yx+HH?f1{R>G#jN>G#jN>G#gMi7Q{FQ#;PIW*$1-ntAMK zYsNj&n%R-xt~1ExF=RCTy$C+9-5dMrxsGXOit3p%D`ICN)n{XKQU>1oIZ+-OfuzPUYH6GMVNE+*>Tpk zv4b;l($x)4N|z55XRsr%8^X}ZKrCH;V3J*YFqW=AowOTW`ht0WjQr#KfA5fNz0N3| z{Dl9;Ud~Vgf4{~vey)7+cn9B8-52Z-y3{G%7CNwt53Z0vj zrXRfU?<#yRdbZvj1aODO%5BaP&ZcEPHv2%KL%Oui|0ONqq$PZMHoy0TH(e#X;VR+P zR|!vCCERO=S5NAcSD&ccZz@^#7*ab9w4^!1>Dq8dE9X?E?D8l&=HBSVi_mche?>KR zji;NfjRUOB(ND5nc6`>v3m-mf%f z-VUO_<-gxR*izs@Km9gi>@yS{)Q`B?Un2W>lDfZWOz6R6wtjsR-oIqbN7B4^{P$lm zrg1ng{x>GX|GNqPkqQ3e9Ittbu#UGiY@JHF2&lsWy7Y`tIYkMyZ5(OZ`!;ff{i?O=KNBS5oqsZ;mwLszwVzo}=_}T) z+i(dLcM>Itzx;vqs}0$=6EypQRcn7cc(H87rWN;ZHY;>=}r zP~LOz^;&S>x(7C|xpyVi|E%ZF_DNoVA7Sm5%|V_YyR0&PKX}x$3>g6LNDdk3U2e%Z zvnJ2ICC}|<-I6=zu{?Koo*Ox$e7rc&-zE2}dG1xl)D@A3ew0^Nnspj@Xi^Zq9k(AI zdJEZ8n2i%A|7nU-3oq`^bDuJ%JcvVkF2y;ITlo+_l7JulI0eg%sS4Z=AzOTR?2SBk z#+b?=oIIO-cbxo+Rfna<#L2f<`OAHGp1V7jfBfZKcoA*C!Oy4kMZccZt8_TeJ?ht4 z;k3(ZOM@|GcjerZ;<-9ZB3@93a>8f&`Il3l2H%~ajWYswXD&{Ha)US(v?0Jr#e<;C zk6&>j7eBcyhlk{vyl~nW&g+mLf>Crgk|-I84V`bD`o_2ilG@zXFr zM>7rdQINJ_M=ot6Z4dgfvBmFS%4}@Q#c$l0i*Mz%>slule(jb#_x3zDxC+|a6wT3j zlb!3+Ch8W@ZPW4`&9tn^#c2UQ0S&Yaf;C_hkQsez@a0&O_b6zv%dY>NVd^^{cHY=CsjpuW5=2Fj~ zy>su$#hE*t7w4^9oOx}zIP<_mP`7!hTz%%#uArXt!AVfJg`^GYws2`K&xJd3dEP`m zL7bZga&Z>XzM$`J23J9xn`ui>|67*i;@pzX#kplP7w6W7T%21U$<_1L$8z<&ttHp4 z+iuIX>$X>OdEN$of^t7po6B?YJ-IlG>AN7#V$ufnw-@E&*voQp?9N=A5AV&z`7rbx z(Hk>LW_yzU5o&crs^ZWD?+z;l3=^g!K z7UqTF{4}&wNZDRml@rAKFzz64oc~T~7X!i1d$)G|eJfYAfA)Q!cfM%h!ZyqMy`S^W ztsP!rP$0kQCQf}m*m>t$RzHXi-oD}f`&X~u;^m_MSW_}gD9EqS6d5eN!FdVoE(OnJ z;E%bqDR)G}akC6aRK?9^bgXM|Zv@&%m1dkQ#_a$W{uEEecL5uJhWC8`Hg^NH_;*0> zx8i;fScHG5qL5m|(MsdAtjO%;slV;OQv9b#AH}^KsG1x%$4SrmA)KHeH}iS_I_b-B zuL7`(F)#8|{6~N#_)n5v`P~CF;O}Pq`!w!{fZOno(w-XJ>wsDK2Y8kOj{$e#A0vGP z_pbs;%HK`->_Ih~0POM1Ym{GtdnJHvpy}huo?6oZ+=2fD=~aV&3rxY^N%?o;{$1b} z{KJ%AiTk$z&bl!Bc?zG80w2eJhV%uve;uf{!7b&_!~NU9Lf*eY`Q^Cp16uLF%v1RO zJ>aAG-y(ex?tc$V#q|v3x8wdia6A5QQ+_?}^}uZWukxG({1@Pt@t^nm|5NxYX#Y09 z|NjI28+kuS{;KZ^;9C5>JVU_4z=!c42nqM1tC|8>9rH{+kj`)~ODFPt{x@8_xb z+kiXqe~pwgck-e<8j4 z|7!gISAPGmB98d~i#!$o5kUO^1JWzMfd8NJ`#<3S|Kaz4!2hohH=qCCA-($ZYW)9~ ze*Xvj|2%Q?`Tx75R}BLG|AOED0snu?@BiN-j`;t}JcZ9k0rCHjNw5CD8vp-|-~aa! zNBsY%JcaMy1H}LTM0)jq!2f^j_kY0u|I_dPfdBt1ar62Ag5UpF(C|8Cs* z{C}MHs!zcGPfXzd|L*tyTH=WR|D31l`=0^v|Bpzo{=6Fh|Fz%$tBE82{}Z0V*M9=U z|34(X`aj_Rr~Up9`2QdM{tx*7E5yy`|945R{=XXkf79>(cH)TtU*M_u+W_(Z_erlB z1pNP`-~R#s|AXKE0ssF6ar62AC!|+J))`+)fWpGhx#2K@i5 z-~R#s|1ZD)1O7im+;EHFh=3gV&a0`stq4#)d2=^rM2U422V(iheh#FTzTV}Yae(b|HD(%;xn z(5CcdQwmCz{%cBa%-Z$8&C=c~%Uc(-wtQ~mYK7*)v#VtO>+GuGX1(9CVS{!5iuIqf zvSHSSO_mn+R;+JdZEgPC{VO-D^P*kKUkiSI+|8DjApKuZzW4ry8?5`+Zr;o)q{U+7 z4IA#eA-h~h+#nv8L#^JlV%;3SDwnbf-UpQk3JJn5PiJ}SkE%lOK1dh5c~7_+eBX*q zmNe14bSu|x2~eDy7b|}G~z;g*d6bTps;JO`%Z=Tl%@(*eqW1Q zb1>Py?28Lb%{j{C+s+U9w%1tennZV*#UA|(ZQyKhzG;pW9{P5FbbNfMIL#R)8TNyi zBC1oeE<|_~RF$W~J-XN2CQ-sH4ncZ@Cj9kGfIXCwH-Hs@QK*jyp{FB%TqT zG1Xn|Bc1jW{1tgzWb#t3wscfBe+rui*%*usQcu43mgBzAkvzVH=er%1$3Hxo^w=mA zffI&)W7tPp&{N}RVxzNrmmO|#?mp7uEN5?&&XRq*qpEr7v){1IPPJ>NB|FByQXA8> zshe-c$8fVhEqbgKE^{N>z(J|-CY;gUYrs*t@aAT5^l9N}NO^&y!^PYWjIHliW^gtY z`T01y#>Y`(ggFl9EF`)T?c>^e(^=0xv@*U&@3xDQX6pP1 zeS__rV`#?`(E)KAMGJl%W@Mty68CxUJ92~Qh40&yi(C^$-l74KkUb@cv-u?ZT3*3ZozbAQoG4E8Td#O{6N1xCx zd16;!s-OJ^G{RXPZZCD@&II9;xPK~~3QrU8{w>v+_q&Dr{C9kh{ZrwTchBe@crO!e z_LN!IWZN9UR^z?2`P}8SS?1&2OZTM(R>985iqKOFG6e_AGS}?lJiH#h+jekfo7=l$ zDs-|6+B*%7*MN72@(R8<&x(Tgsd3zH%A+aOx4Q${qz{_l+jSM-GL=+cq;!r;;#}16 z_M>uk`LOCZN;^awviDiflug}bQVjU#m+k&QcYz?6xXx~SVh_R_wcOgHvW-Y)k3vv;k6b|lmD ztS#W=9r~_}cCOnQbvAZIox2ZDJ2Xt4hI*pT7V0|$?T*3|!_dnpHX?<4qO0e_OLwQD zE6-pnR0$1i1eRr{9eP7HBsS&h3>fiZcb2Dqr2~E(i8`weN1ZjPaJtCd?VWpbi*R-j zTMX*GY>2X-o?~++=+^PBGE?*%`^k=0ngn}+6Gv}4baE(}3J;eb`oYjmhu-Wd=KK9_ zTjvc;rvAvYjQXHtB93?YI6exFC70;0?+MrW^aaoVSpCAgsOW33=Fpq;Z+Wd7`ql_; z>a~t~uNqd}ORRD6^e*&IWI%#F8WqCbNSpe>z{{pA6}CCMJ)OYTT4(q!lRQHfm8WXj zKc#ku4_)k(+#ar4iEVYtBwbTT8xruj$-qw?lQYoO#Ye^a!awD%67JOp@TYKGBz&t6 zgnOHGgoT7_a1c{ol6}gHHoe_}{PS_YahG=ohZR#>g8Y!l_jE^{d!YH{9h_r8USXT` zoOQ58c{Wi$>b|s|Fy*QI$#=A)(((M@UVD!&-IL-zzd~o+N3>r_dun7CNWG?D2NIGj zeY4d{yw%ECgi)sryv}+H+@EZ5Zqpq>ZeO}+iff`LS{%Et$)3!!O?9DPYuP_$u%Rw} zGiGt_yQT9XId8yT&2m8@{>w3$sj34?<^WnJIgcy%*3?34BoE(NT@#(a|2! z(DP}JhD1}e;}Q)WrB2>BSCWQ*vg4d&p-)5KzY+~84fWXU(NOsz-4CGr77dA>wmYZj z=Y{N<8mCWB3Kyf(4rPwk96ENm{LpuX$`57s6g%VH1!v&(}k3l7# z&Qj`p40%vK%98)CWWyg<;jT%3|r^P-qN8=D~ zn>H47#2uX-Bi@-O+Vt_yd3w%WZl4>v#Wn1qlH2R&e~_#YP84<+oOFPb=NPNi@4^Lm zVQ;ouiflb2eGGfvCD_-7XlE&RYL)JhEqa-$p{?wxP3wI3CF)n?#d375d!C$S%7Qr0 z(r1U0ru-oLQxB`pd>ZT)4Q9_xn;i5PG~>y!K#w?w9Zp+UyU zA7{tO3x`F6M?`~vkfS^3)1y0N;bnApP;^&li|&?Bq`NO=>8`P}Annl|1>wW_js7boVwm7EVXX(x#^%gFbYL?i#O5cNd)M+=##vy`#V zqlIT@xY|=KSrZp6?1>u5=cSTu&{iA$E19Nq2a0--X^iblu?f>TO)>EZG^~36UPm%x ze4d#qUKk`^s>w$GHadH#rsq00)PwGoLJ#BJ62e317-96f&`!(t^fP4mlA#jYq#jv3 zJ_N7zM4S-g+j;RDG`U20;9S)oQ7?@R-&GxX{u6mj=DedK(qB=3OCGv#yRX0fqtZ+m zKmS~OL>uOd?k2pu-hX$4-nl6!L4U2`S;6ze>c=kb69Ts-^hpvL^z|hSAmC5Yv*g-Q zcpw$d6mFZDW?#7G79M|wq*s$R0gwL3qcPHpr=Fl6I^olvVrQ%NAEY8q$rtB3g?-^e z?@)hlEbqX^bBD(2l&!lk6R9YBS^E}`bN)<4itt^`Z+aLnyCOFG$rg`~&dqF*&ZRiu z^c}`}WY@)*;%dD0<|&M|xp~UPuypo(d~h!Ao6=#x`CqGTJE$w|iO>eoWPbZ=)qd&d z(seS$w%HYNBHLz}B>1}2e(8>+EuYx_$Nl#2Dz?xq)c#C_J6|G{`!#TIVM3k$(y!C^ zRG!}_*v`JEPq2l4PoIR}Z=blm8Pi9fFsyx9e3AmUJ2}sAH0f;WWR9r0UMieY9lJIE zn^4DR{5l>J-tyl;o3pa|+xgD-(%<>>n$L0e^dIUS&&QzSi|9X`$7UB#IdpzI_|dtc zix`hz;|!8 z%hcl<_Avdl`(sn4Hi2G&{q8yM+`p8W(#3v7?r<$(94>YHox*6oZr1O-=ML8<^sOUN z%OW4o?%3V!jp2o9?D;jG@|?bl@sxA!EM!>usi=kBvZZy5*bryG-b|bWHI_N6b87KN zjEOM^4|OKmho1eq?VXM4;gb4P8pB!OR>PSlYteqy4N(``5mWfHX4 za<;1RRsvjJg#B0EgSPR{XllcIEyKR&z2Z;xA`{1due`ipBKx?(_xZMpe5LV!{`-$| zg5*+ymhtIO<^9@(_rE#8ziNVi6If_7CRFRC4?dh?u*cfmeQO__J=d^sCdZ9t!zQff zutW4M3W>XJ#g^4~XnD(bXDuD`UdWU%Fah*U{eq}lR;LBFV*3y(gM7fzfqKhFZWnAbeEHX)cGJg31TVT%Jayu=fM_F#M<4TLCie^K zcRfK$?9DGPbVCQYr+#m% z3ArygT1OclnB>;Gf5hH&*UaE)qkj}IaF(BAu7}R}L)J zsBZt%S#*oRrcCtD7g~|8%yuH(&8Ck08xPQ)eJ!T+mD%aqqfJ)nLCPI%GTM8X*gwf_ zgV>G#wo6et9^suN@p;=T;;TZp$Do;4}@C!~=E_f?Z*}^UE zsE^mTh1UR=;CYYmd9d6m_uDk-FzuVzCjVWb+BWfB(B7b}YWL2t-JmufY)-gZzv>5<*niubiK&O=B_GiMBndE7NU%fv^Jf-pC z;8!{?57Hcnjb9j?V{`XnCak#Ji~b|6&nrEBUMkvAKKQ+S6o>o^l$Y{QUUDm5hiyS? z>52n-Znx{H*G%<0xc&{%s@vy^b{acc=-UD}*C)xZD{;d3o|7VJS6TG&shWT&x@lO%ficVkq^Wc&^_6VOmzl?17 zAv~8j)s(T%G-Ymk_?y}N#S+mIexbnc>+*qDgB1UAKRgXjs?21H>k7+N^Dm9 zWk{+bxvvL=q-T_7(}f*B+#gI@eaOIX$^EXPHyFn5=vXeA z(fF-j9U#2=<9xyExHX1LZ%`aT0=O1XfB5lYwYUYrFX+b!dV}<8vlLK1O0TE-Vm=V0 z!5Mpy|E{JtXo~Y*yTy-QA!{VMX~U`& zTUKCS`nmg=F!9{7$$M^Ey>7+q_t=qYT_AgBwRuGITISg7qqihyT;Jc~`yUbln9F|#dj-Dt*yAd-h92}bc-{c zbx7`x_U`E^l>Zd#3D16mjee{hq+6Ut3Um8t-=Xo56P%lIOzrJ+)ZQh^?}XML`cm@S zA=)>r_V#-I+vGpZ3s-xy`SzkV4u(_FZnZOIbDpM|w^MCQ*+ta1P35GUQnP?IlErz> zSG?)2;a)uU&=U`L0eO_l5AN7+ZdkWSS*(jx0kUUMU7}hq*})wptZ%dtmvz18=kHA( zpASP=)I;}+hEmDnuT%bOgPh-XswovEAC;K^T7cUC`$$u28L$ypKH8K*Cvl6AfyeYM zP2c%(_wKVyT_6Lq>qcJtZ{5K<(C{z2X2;abPhU6cCm+}7oPu-I{RW=e!*98}9gU%d zX}&#*k$FzF_@)m!^1L8okScW1I|KQU`MGT-d4&ah`(cNFE;ezfkR^`8SfE#Zdq zYZjl!CZJCGSWk8P{IjiA!>QIZ`DYff$2@A2kMz_1#GeZ;l^69ZBy7qsWj;IT>WuPw z+Wsze^6rd!{G`ztCmR_nDI@mRY6Izf-iUqE_xrpN`?}vopEqKML@W8{6ddt*Ble2o z(f0Dr%4T@OhBspS71mYR3~$&awQg*$(oz=pMOmiFjlHb*+%dp;7t%>${nEcj0e810 zo01>0wm5tO{hal*@=@-L*;R?X4}3CJN@dUOpHu(QI z>vsA^F20^rX{hq^9zWhc)@mh=mbpgX-=5-byq617q5fzFTb@igwgErUwNdLW#O2>SGGk1lD;g*zl_liwi;YV$rrna|QZSEg7 ziDtgmQFZ)7!Ut);3O*LAulRNz9gC)B>09~97U-oVWxFpxW3E|uu9f>wpd+_G&7B;k zMl?*nL|?3IUIyJ(QMbwz_j|lt+5AcOdAIB(trMqAqTdFuU$84_Zz*&b?`&mV9{Vrb z6de>#3UBb_GV!kRS00K7eOHOjPeQK;NYi_r;ha)a-^Ff&Bb-Tt%!qTw7-x{BEXt|x z44e8d&C7%jQr^z8OvruIZls=N;KI^bPof>_(B^;RSGtCs*V*-19GQCINcf>m_G#Ih z^*d^JWM{;&sc#waqc>B>e&&8JPQlhGWvaSsnm@LScJ@p`Cr_EOuA1gM_TcZFf}K^$ z6hA*RQ+QDRs9WTIA+0-eBHiKV3^Y)@v&!Zy1XH9lhj}Ir=-Fx4Q)ljNux7daDb+W; zUv^Dy!JkN0W$Wx-sxy7Zoyw_(z18i%dP?-=7CeWnI8XQsUSIhK zicWkUiq3UIza{=u7<98xJV*YXy&?T`%_8InJkjFU^*2@5j4wZ)on`XnhwR)WKgzxM z@C-B*K5048V=DWxY}t~BZ;OBbFr%^;KaM?|!ul)QZxY`_-%*e6!IR2Hb_QkNuChn` zvf-=zvIE&w?8Qe0g9Gl}NmU7Nk`I|?XtNo9QC%KA=HUSxN;a3ee_*LDmBNF7G1Wz3st2}$j7`UHhHs)Sbs>*A$msG+G^KCClaVu)W^fuq*T;m!P#LP_v$V_t{67lDNUKkIo-1sQ`j-?^w zW5i&y)dsK5V*ECuy5g4B-NlniC;on7 zfmOSWxQFK)`o}@VpL6Jl`Y%sELO;3qisC;>ypb#9$@`sp&+{L$^}0Cb*YA4&`Ro33 zo1U&O)6qQ^XZ!oY$)D2SflMz|{AX{lYJ01W8*FK7v13N(G8KfE_mpr)UDfg1u^B3R z5*>_l&`WlNZBMV$SfaiQWEt%XWYBM@kJbPA{Ve<`{?5wdi#ZoP+8NvWuG^amO+R$u ztDgLq9?+YS43vJ$EG<*$jUU)6@2PD6W$X+RZ<7w&ls4o~4f1Rfx*PhPX#2vS{*<=L zmfh2T6<@X`=zf>kvV&*M{X(q&R!N@WmMy#VbI+Dt`Z=`i+p=FskO%YYltGsc?AYHS zkErMk{c{QQ@?&2Iz1Wd#|1e{)?AMEWn15Z18=m04H%lL%S$lP2*wK9q{dyVgyPGpZ zmy`A$#{Lt?yP(W1D$~;$;bG~D(h&pQ5qtK}gYR$`IK#dh`=*TS*~`Egwp<>5RtrCG z`@H|$4VR6v0WBmV(1OP8UhLSrrbyjBpf-pO zFh}`#Fs{+hcdDPWW0~HK$HnK8+l>F=?3iX6d^fV$OMeTxS7ScULfaaXqKsXhU6f>~ zWca`|$%pfQda#i3tuG@x@=4g9T;sR*`k&HX*^i4Ju*bBn;jHHn{K~yDE2cg**D0V) zt9BJT*X)oTIqSO238LU0`|;Eo#=iI1k4qM1<>2{@Eg`1%ogm3zE8a`z*Djzp9Ig8ETH_ZYUma_@?*(#Tz2F-YunxJB;oBO zafF+9(%7QY-gUd8&(FuErVu(@#@Ki_&y72ysV!a6)W+^;>h7Ls@0mP4uhg6$z9|r0 zi_Ynvr#q@F4<|d5yFV&=pf6W3mso?mSl1hY9(qj$xWQIUwmYe1yu16U8K%5fXZ1mU z+pxDBN!p=3VLLR!_m2$UmPRIL!kwkoIQ}=?UbhlGsg%02&q1_){w3iu&}EB!_zzy$Ec6$Mjh64M8PR|ftQMfQ}}V+2snkGbk}Go6){EN zS$5&yQk_MgqU}_&*|!TnAJ;tpa8)mM;ojUvvdoAkR8R2__o!bSWNileSk(=l_ah&` zvGBa{47e7adwo3b$>KRg*%dbVum(`$<2t7NkUL)9wC{(S+k(SY;CCZ=uj%4$r;eyw zf_z%8bjm~a;K-vGeRvNt=N{!L`Qhj3?IofQFV&ZPztw@f6Q85weGFTwWonD&7Cn{C zOQDr0xWC+X{Do`ZV>`}gth>OIXH&E*+5CFC#g(4Ueu328&(5&pUD#gkVc*QtH)O)c zDoq*t1Z8*)-F~qRlzbWehuG z*>K;0ZR(rY$(@A8L)hbHWWW73w$a#}9_t9(HM?i>tu?xJTyQ~bhF*T}RCYcFipZbHIu+4Ww+pAwjw3)46O!W)&t|xuHi~5yNzc*DsZMG6|jP z-LJB4^hw%l(e?tKb}wr!$nd^nq*K@)Y^~MT#NDet*7yfa+|`|I|0U_e(9m6s)6y%i zkt}xm(#5wRPvDpA-lRkC{;k>_!H-wH5+Jmk2 zQ#0&h+7Q|Szl-14FCrWir=oTVG`2)#ie|t;d2h1$jn1m(kB_vt6`C_C59+rZ`nl&x z=%+V4K2ASXJk9+xN0Tl#+iscm2@E1HgiGH>djkEuyG!*C#>S`ov5`8Opx%bpMFq%v90y-WS? zz9609-5XM^=?3OXOTlAeI%A1+4)SkHHA^=zal%UA;rX;H){|_14V;uQE{diL6b@}c z|L0C=tRlX?Ei{tfB4~D23VVW%7F&0=Xilzok)DVhLVqd6e@TDY(~M2QG*3re!d)bu z-S$zwEB8bk@B8#YzA1ydCE}&Iht6#!KTm#A?zgZrUJ9+9>>!VxX|~3xHzn7FN9la| zx}J1Dt>xL&89k|9`P=|bUYfjnF*YOmUOicB&~L@OJ8sxple#T==v=$jqxZo3$c0!h z-!3Tk-$M@-^y4z*hMo&L!YS;x(;>#=GR6vDw>~$L-=9xjraPv~eEu$xuG7n&s%IBq zgw&F*z*c{2Z^FvjYtKV3jVykLx@O1Ma9Vr8kXLpwx=Fsh_Dqefd$8Bu<=Jbeld{)7 zhP^g2Dc@e3eJ&R*#icz4`B~nR%%Eepe~R@=_LW|2Abyng@Xh@_?der}0(rIja(NZB zr$X&X(H^w{8}vjE^N`MBr|^q&ok%Kc+x$2Ek*yaf1N-W<_M~VXWL+NKy!F3e{RsJ# zr_)`Iw@%6tJxczeC%++jhhIxl1?l9mDr-|WHr3MqQxQux)n7vI3ukHn+D7AhW487Na6e4SqUUuCZ(p`c=bo%u6-*hW8iq?Z)(!+9f;C6WE_o z_UsHRzMJ_gxI)iizQT7t@`=Lh@bo+Hb|jgr(1*diWKZSsUlDEib!w12$*W^+fE#3p z<>RJW^b)L3K7RT7WPqD^Hoj52qgi?S&bPgJl3%vU+0Xhtx*c=abKH09eM=Z|Sx?Ew z3H|%3@WOL6`+VoetV>_Wc zI~4`&`VqZLHOa4otEN544(wKbvFgtnI>6tvo|hpl_EAKm*vO z@h!q)uAHtt2%o^e(GER1>zjH_#vh`clg^c->jwey)++u9x9kTL|A%_-$2}=G<#7*=W2L=xshr(FYpV7Db^~Wy zQ*8sW)$=K1K5IQ8%D12?+UqO>HUi6`ncABfi^(T`pr-ltgEh^s;Z6)<K+wq+k6UHsXv+lDyj z`*vFD!(R^>eLv0GjNoUFhrV4n)0J+7I>Qg_Eg{`t+C0G;|6bBjrzIKcKTQ8lqm1De z106fj&Z^@>M_VlH37j}~8FAWFiXN0a++vl|{sg)Z`?qB?>r{>M@J=vxwhD{5ImvC*FLUy6HKmG6dz56V9@7dMx-n-9Ygi5%*-Zzfukuc+tYrK0qG)6JL%2uL;{%=uUfvp5> zwd5y$X}T$8rJJysX|jTINU(pgYP(9D&~Vy1;zsDK>-+46qScj(+m`ktR>? zwR*6f5smAcIyN-2oq3P_%xF`pcBIKIV{PKny&XMS+L|ib8je8sw3Fsc@%>)A@mI@_ zja2Y$DJj|>glOU8GUUx9(fMG+isF~eR5A6DJkUB~q0*+Ct@*$#l9-3nj{I#8e?1fT zaDooSm|YaSgZ9gn#_y8_iZkN%Nk)Bgqwl9~p5L?4;XQrg`90i^hSS(Y7=3r5PcrJ0 zW~Eb~?8x?s?mw8SF#NJ#(Y*>&f-SwgV$=MfW+a2%>v~-Q|HXOwkBxQ;_Yzz9s)=tmuw(h?z8i`u- z-TsttM!PNU7q!|>F)ot7r+*AZtwro*ETMmxRT|dmOx;n^D9@glEjldU(QJFRF^7pu zyWduR`R(>?4)5^V8O`=tm^=M^zt?X3x2UePEwDLUDF5Mz`plMXP((I|ZLVp{?=NU_ zmhuVui#BUaC_5E#*t6)312N`ArP%G=4$YRrdzRu?NY*5q6{dBl3V6uujM>n$N!TVd ziFQp9Z4tjfy0UNsPAbl{IEi_rC6DtdY%vHc&9pE+@IH$l@&QM3D-XsS_{@|srvHF6 z-hR)#`;0spm&dD~jKd%BD*I$5^RhSr2khm&{Qe)`4wHMivUH4$Lw*|ZDsl^6&DvpV zUviQBBf`t08GT+Bq4gc2m}MUi_RKxz_gwb!(JAuWohnkE*|XIpWu? zQsL^eyt++NSWq|QL$UAwu+oBa)+4bMjG#~VW>l9j{!kzX{Q3pBvivw6uJUk~#g&IU zuRT>NLo%585#QMCI5>!QRkqKg4?SG@@>q9Rp6{vj^s_Q_>UT(YLFYA)G{zZAuN`SN zB@^o6$3@i)%JGD|40VPC7;NV}qYW2WvbVS70RHIOfPv@o8B zf6;>c0sch`<9YZOEsPIBtCFAYC0b|>Xn}W*#%7Nex;5Tm%M0$oE%`>Ajoi7%J@&V} z@%XJ)I3Kr?+oQ-qcef>+-o!Xz4Mwr?N;#4x><@AI&ZPU$tWX*~ZyV=G@|5m}9hj@N zua=#yHfMiW^Y>adwrOSx_zQ!RDTGhq+gaR~Ew%f>*Id^mC8H&ik)5-;B5CaG(q-Va z7`<{nWh47-oe6;4vpDM3mR{NhKD|4dG)}1=%G=L(it0=FPtFjI3=1h7xmfCl|BK>l z45Xd1$&_piJ;B)(8V}`HpHM#QwcdE}HLV2&{bkUTO_B_MagOmX&M^+oG5y6k#+RRC z`ipan3q1+(i*t;xe2)1q&N2SQImSA7xE*LVzc|PEf6F<>?He|2THU_ITH{>{X0@+b z-Tql)9$5d`^&5U?y~Xtm8#k@yY~c;-t@~GRS+ijk5{qB3FF$*Io3(lE@2>X3gLHmw zoQ?9C;7DQbeNf7#b{$!qz3nYOzh9iE>>md0pR^p{`O-PdAK*OYEM9~D)eg#_ch!GE zxPK6}-|t>0UH)Gv@Lu7pAEt`AAD%EinYpw|@g?EJ_wrBWJ~GFcPz#Y2eC4k-%9S6%izlR?>A(FFTH!0)|NY>E_y3J1j?(mv{`-*$@4wBv24?54 z`tMI<--j*Vf0|+~!p>*?m(cIGFEokvE#dtm{(GkRP3-RtM}7Y^P`aG=dwu^+#>|T1 zAM*Woau=9z;I}t)H~9&letSbOa%&pDU%${s(huX$;@dx}X!aG)MtWc)RJPi`((%d% zC2=>Pe*vMN)32@PJf-{BatmViK1M${duyTZ$?ho+j!^Ogy-OUu8yo$A%kMzE{Gg>z ze{OyIvJGpwXePK&F-XJ<)4r*lD;E8b;OXUmDb&9a(U0R_G3ooV*Gc-GJ9W9E@BVe2 z5f4TJ|0h>$x^zm^<(DM-39_d@`5qk`bt%(Tt2h7JX70lDe&GkrrF#pRfnK_|F#HUB zSLDY@;V$*v&{&OhO@7f@=#My4>G!CGn>e2PHCQ)@L;S#9Fw1ynBI%5&0^67pKaTD* z)LBVhIC<&pBhT&n;c1@R{cySW`r#R#(3=-uZup_n&r^?}+`|32@c48;?HFau_tWAo ze$1E(KW*tyHcnBkF{Pu~IC7W8b9t7LPmq7vvOM>LdG78!H+cr}Cq?tzEqU%!xq6ll z_;qMwx#bPN4swrW!zC9Jv{7yM+~n!uP~n7mIFUP@4KG@X`}J(N+!eEO?X4K~CC!abWhsn3Haf)^j|4cTH+?D73@V&-x-;$SSk=#pi zX{+w`rPOYsXKf(ZJOHYyU*YThl*c8JElJ4yJ_oG z+NtnL)wwV0t{TGqqVHC@FK6A=`*H8hx@(r<#;>%sui+lZy6Y7FYS!JLcBOsygSd&O z_)}*Aulw#e?l*k*eB6|+IE92w9nQKV>x^lBImZhvv^kIi*HMRZUj|-B9fTYGt|On? zAe?+^{qX5_F75Pta_;M$Twh;Ld4Y_&fqDjI&9?H~i!QnU|9fUh3`FR+#hBTTWS!ps zQQuv`QwoRl9)7dO;K{$py1oDD8}G+*vKPmXck^CfXDJ|Dag<*IxE7%Ag8Xi!4?+*) z4}L03zv}^|@$>u8a(FI?!-J#P*UEV*&Pjf-yN zWRm#{u6$m}+y(RITHf#doL3U>^9oZZ?OIVGX0uwWZ)S$=|n-WuI%2{*9UY-v>*Dzn6$zfi% znmf&>O}p9533I#6*Uj-z7Q=k~yX>!ml=@5hf0g8;zbgN4GFrX<66TZUztIC>zkJ=} zgC#hh7p~>zwGW#W=3(=-P$=|pI1~v*L$OdiR2oWzYC~42Eo6tBY~KZC2PFn2sf23& zYWS<=ua3Vd{MGZ@W8J?OJF|9}L`2c%1PF1BFbgmS3XSI8cU2(R0@u=eL z!~P4K+p*IN7mq3~HZ({MlMz(H6*sz7bS4inj(Vhc^e2eN&*Ot1WNFLtKDIaX+OjO@=QhZylw?YHi z{r#bXHswEQbOyjr_VT@mw!EY~2ck~+RL$an!J5UR%IiSPs2?Vsy=n15`r;gRbNPKy zDch2R^u_6_bmKtGt`lyd0NEwzEC;@)o4SN+UQn9-v}0^C=eIx`2V`&9pVm3% zzduNr_Ti+V8}-{?%uOerm}APmJjWCdP{)C3X39anA8woDggJxmr26aJLKD(?bkMcz z;>XUlK|h>FsPv?(XFv25$}c<+-1#PaF8_WSHhF@{p+2rcH(T|p}zg( z&3C{W>;=B=_IckB!zpn43U^N^4&Oi=nPFNI{!VpgtU%GG>C^$9c5dv4kmM#s~<#tWx>&rNv2Qa_H;-Q~M!d%-e5 z@fE(@cd!4y<4n8IEb1Nn0=-XtN_U!A_C*L?s9;MFiKp~5{U+##g|&pGfCAvB=!b;^ zy#F{5{8W~H6ZFHl%5eZaMN4`L&-9g7KOXwUSMlF_^ux=PL-f8&`r*PW>xVban>%;W z`_>QVF7b+1O{5P~Qv0TY_RAbf%<0eJCjNfydAFQ~gx8!bC;V#0!gJ#RVnN(nwi& zQm9-d1$QdP%^SF90WSmVfVY4K;2Gc^;M>4$z^lMRz;pCdr-9s^s&TYx-L)F`?h5`bo^JwEfF3~iv>pL&0S*Gc3!DRTcdEwC zH}JOt{lI;|_ke1k3(!5SBfvu70Px$uSs-_(YTW!S{@K7DU_J0QFcsJZ=$_W2!0o_S zfzJaMfe`R8@L}LX9=H+sGvGe}{{rOhRE?Xz!hb#RMPM!P z1E3Cg3eY{R{{y%gcm?=;3p!lK?VE%w7z?Y4p5MchAC!o8RLjd>37KH%wS)PFT zAy0r=QBg?uH$Tl2F#nDxVE&OO!0fLm1emYz1k8Wr37B_z0&rweNHe(K=LwjP@dV5_ zc>-n{Pr$su6EL6Q37GHm1em22g#hy;Pr&>JPr&>GPXOhjC1M`6`05)vQyLIO-cXR{Iz;2)&I1Wh8COj%GAnyY5D#7)S!ez!V?` zR0ETMsXz#*0E&P*K!1~gGN2KN0F^)qP!H(V-Wou^P&g8e78Jzz74nPwzasyq^WyV= zB@=$7KjT;SGk%kP&R_Y@`D1yiBAKkLtl~GBU$y_M@qe`wesvRmQ+~#;{%8Cee$HRx z&-wHEzaU1x7Znv3mz1bG)n)1yp*G?FD*Rv4|5f@w;Vu6s9OnN5d7ozOYRGcV3 zm;J63CS4z$t!kNUsqqx-NUnVKNX*1LlPd?Fn4L+aVy5`nxsLAeEPi5Uy3F0}lto$Z z>W(;(k!n+nO?6dIGF>zp;~cPsrg*T_3hiWFZE&WkALTv!SmIC4<6N$pcF_p=9$>wS zwUtCic>G5_EvDowd!L`WHC;B?${uTMl1Is7m~^A~cO>1Sp@pWzHsKL$cG-VsRjHf< z>}fwU)0AXzKd~?sKRnCSa|Um`bCH?SLD|DI(;=1n_}o;yE0zfl&9qC{zYH(s@i{Sw@xT=nobbNd3BHy7-$J~ptg`q-;yvDapOFuW^frm#LS z1v_%#VaZo$=U}y&GDaR93GQj2oWX^x<&=Pf+3ALJyi?e=o1FMT)_Vvej;ZS?bV97t zut(9VI>`D)M{N8@uiR=H!9(2`>E}_l=IuSzD+dl%XH0kX%2$uptO}owafch}2AW*X zyRsXoLw#3_i)m_B8OkbCJ-qU`KWbl%&6*nPpv9TcIqGtn_k+~sFBUp+t+$<>ZexSa znGCGokzf73Sh`&G`O58XLq}}uDb|UWz)-tW2R(BWz&nJ z(C#ko8SV%>#iTEOqRoly;!K^6NTxmoZ+rni?h3cpJBJ}6dRDu7*thHUx@9_V)lHeY z9k#{Yujx4D{*h=8dfvW&ie0?3-iq?RXkRwolukXnY~6YNtK!RD@a0gx8Gum?O0lm5Ax+zC71`hVMd8}O>G^Uimj zqobpvFLd;QzL4#0A!8YctpKrImzv$!>G)~gF`c>@GUXYLjj+MSKtN6$j~jM`o9o-; zb_kIb8N2w5kYy6n48{r}n1*vzPvg1u%&3fp>S0pml=3jdp^iccCANd+_g{PMqhr~` zcJ9oRd+&2MY@K&~z3W}?`>uC=ubqB&fl2k(`MM|guZ~fM8T^|!0{=*pfG4fnNb@!L z_VoOmy}uW`Q;khXVS8HPVe2^j+X>IculK9Qh_A3G7jakf^*-@93sjQP+1vCOeB0R` zv^;f7t{OYmI+EP_57d#GG4%5|It!h#9mI9IdUZd1m;OTI-adFnSz3E3OP|&VNcYnG zZ2GAiGsR_jgR-<*8)o(080@m{|9)1ofG3=NGWr($BF-x;EVgC80*?7^o7xX9M#hpg`rO8MFR$3!m|^ZSV}_^$ti7}yY-k^PlX=VDICi|D zec(8C|2${VgWVZ(VpgEDPM_LN8Nan4A3u=rTaoGEbB)Y*!XxCKJ~UVJ{<$kU0&~Y` zgWr0d_hO@|L|^B;iT)mFGBNB|iuut>?%{}y-e9g!xV2d~dDu_pT{~rC(OKEgWUfWJ zx__=e=UcZ1E!ddKk+Nlz;`zm-;hQO@jrrkm(S5w3JN_|vFwi)7_yjhOx$g9S&b!3OHZSF2$t%EsO zzikw}hk%*8u0GhFi*eUX!?s)TC;dorYLfQtFJv?Khk3NH7Et~24W>qZBaJzo3;Hf) zXi=F*D4WXha;HBBzQ~5YCceB`9n|!}*QZzqfDaXiN=)s!rf%H>Mw?*yt2W^|+JnR| z!dv)OA>JM+GcAYOedejBCckrQK)d8Mz=z6n^GwA#zIz)CXH0uwuGz`CSNLiUG-kOQ zAy+jpyIpOiZKDoR7bI`!d1TkzT$`nbZ#TWR5)% zZ)50P)j{9`Wq!*=$sD?9v#x-is%^Aa@VHX6po>$@f%)gsV|3nrgK>0LuKHQ-gg=nT z)rdZ)lTkY=8pX5Q&Nr|&L*5@&A0_vL;+c5|Z86cNwv=|XGMt0Y>wXU1Q_0J_%pDaGT}?aZx_W}0`bBuB`f>=~slG@j(WQ^=pUavmW$nf9 zCGg7L;J;=Y_NL%38BvCjCf2WxOpU32y}US6HiAvq&-w#?FO1H*$0$B^J}q1?-Vs&*;&`p2_<19je3?wyXIXJ!5L`9|w~&ivXn z*{iJ0!jH8e+SmM53D$w0TI|Kf>aqvbx1fD(Bu?yDUG^~Ha&z|3i%ryJU*(=kdnXQU zNrL=5>RqM6#)W^-u5*>itvpFP1@1SM4}Q~U=Ye}Gu;1~mQ#j{18KkH)#%q5j^3(4QvX`hmEqaPBg6uWcvpW3)39aqe4)(_ilN zt48baBi+;3m|ohS@R)N$_EJ4PDL2Bw}`luz{| z^9lOCIpXC=yMyxZEzySPj9&}1_13o^J{~u*zWVlq)SVQx%<6}hkTylz0L{>YofI9t#1RdmyGi-gojlxEck&=K*)y=Bt2gfTi5B`> zhez8NG!s@yyQVX$ti@(bZ~VF^@b8fOc>4k`^qc<}eqGLQq4lE-gx?I#Sg-mei*lwn z2>T_-GO-gpoY}u3x7aWEORhWP^B=>%Zl=HJ9jH6G4|=M0)}7o#oY?51jy~Mg`0vFp zt1$6XexgP98^rk4tNt!yh31cf=U`*|(5^<>-x9y=Vu@eV+t@xZ(Ad6jvV?U`)-TW9 zn7iWq^``CHtU315h8#-LHen}dQD!;oir<~=6X+W)@vCIt4mEjZvc_+f zZT$B2UVK06ztrKfeWbrQ*RP6fGq#CwO2+^=rxX_(i9PQakln^Uw!Daae3^6y>4zu| z;pM#wOZhhJ0RC^*Q>U?W&`@@MF>OPc?fd^!HUL{NIXdfanf|4p(b)bBhjA6>hj#L+5T&~XDXlc`5p@T zh)oHGa;;-=-!xLU_p@%vSZKSLQa+XOg$TOqBN^^sgyhAYQEXzt@t{09ZUqxhq!wH+%->eM=NQn2TM#dqlM6CmhqggxJI50bt{mY0 z#_@RzGT6@e1pRjMt5P2yo?L$>`NB%^g8e;J;syE7dEp~o{2*!J#~ktcDauQlB7S)B ze&`;L{}6us5PoFi$KJ`0%K7XEQ9so2Lw6$l8DqBsKZrm3*^nPK>=PTZByWf=-uAr-TgY_!Iz;;d^rP8=;LR0@V%J6(yf>N6o1Z#m+mYLnkCQE zb01tOdG^=m?;eAvT2v1yk~3@ zA4+6tqk`&)_ow0gT$KeoOJBeG>(H~eA+zF;Xuyv;kP3MpR8H$+ma(&GK2d^Bl{}b{ z4t|F+i2vv!cU}16{lDmoXW7$%ZiV+zEZ<&|E9QN}cS7E44Bzw~yuXz@9~Pq)9YvYv8Wfd7Z;GIt-PzA~o0VwgQ*-;A>d1pE62 z-%@;zdvHhKpKoHHzcBBGmGH!DPcB$W`yV@q&JUEC)XDl~mpG4Kzb78lsy_8GQ;!{} zA^(fxH!jN$k|r4PThQJ6o?DoS?@VxKQhg>q$Q{SjH}(;Q_L}*Ddd2G?o#J)Dlkxhk zd2}`14{yFg|99)u&nAy8-kQg5UKm?q>WWyk+7RNiALzwtx`CXX=g zZ`h|gE&dX|SGskg1|IItRg&(L(pUUHB^@PQ(|Bc0{H-9}ZAzy)LHM$#klC2h4VrS& zX@8RL&n;73A0ypSo6eLsAG!2nr4ui>2lDS_i-=n_Sby(c?g5Mq*JoDjs=s&78`RTa zI1}4jiVcECFMK2$=RWlc>|)bSFupIM@B>8LO2H|sm5^fR!tp2^+d*HcH6 z7wChIa+m9=BzKr}1hJ#@Of7nd4&-C-@{IC*c;fE49u?_ztKzX zEAx^g$t-hprsV*0iotNM276q}9Gdpzv|u9|N506M5#t-RN5S(R-+1-nl&xyC>4C?3 z)!yFpz+=i=`O*()Q+|}QOnC|iuxQXX(Bzj8KK31*+J`+wXPOA750I}QuI@lc3P0_5 z)oA1E;LpTHZ+!i+3-$94AA&x3ar({0^A9f(AM5A8!kcscdHf^zZ-8GZ=9B79(cDNS zGJApXfAb*oBSXp0Pcc7&47`TZjCHpy%%-11cVAo>V2eyG^CZpaZtbMzM;NnAF3eSq zW6vfN;oR#mdNX#tsUO2O^(OMM{<(gN`x+XaTpCpN#+UtMoV24Irlvpx@z4j+5Dbz3 zM1!dtNgkQf{MPg2`}D$G>STicFZWq157O7E4r+c&`IA?z(kN^@b@EB(oyS@4o>czm z{=i(nd3$o%Pj)ZORf&$1q#t{C{#E4vN##EYuHod=+sgA8IJYg#7wFhdzI~0RS~N^D z4w&Q{R@gw@Uy*upG4~mg|M+~hf#jX^V%QG86?5c#e}`Y8yq{j0;~sI^e9|L-?OC0J z9(B?OVM*4MZf`hwa9_j8!$b8M-M5(@Oqdk+CedDJsyi5WAFB##j`L!BQ%`aq@&J42 z#_Q*Qegaybo*$I&sLNF!hnAyDOzIflBxC-)iat`xmSa&SwWEZ-?EGB$ad7s>GqHh^ zt^cs2BUjBm8x7lT3AjJKu>W!nA~-n;9=EediJ^}kbCNB z?85;2@{U6X^Q0wTW6mG>YCh_X-nyXjB>dSI_xN7L)Z3Gk{cG66XBXwuPc6u$b~O09 zr}MkeTSu9!+=*Md8`&%F^GlcqL;jRYUH{)qtNh1+)H1G8*`p9%Ee?R!Jg2w)Is(?E?ByseZZQd-2cVG zoMv2Y<&K8T-T9;`kLHjkXa~PWTSi+{nOlVIBy10Q7ChI!ls4iIpQkS~M0+}%cwyzq zM9%D?FRJ!npwy?`@aR|Z-DTRdy`_H3*z9b4ztRr-P3T`@FSP8ZeLO^eyHEQoxf7N) zMe`K@w4c6=^1vpZ72e=^^?S{_zS60w1AM<=Bpy`sCv(j^l0h?iQL!Bxe!6bKQuW`k zedXY-*cpFtDf10R5r8QW?vKOZ{raXTR!C6-Q~XjX&B`y6h6R z@%p0;^f43AJ?OVU_l52A{Bm^C9G&e~Pb5uaUx`Vf4~@wGN9UH%SBCCg9e(RTNrpbV z-}*Ft7i@iE0@{z29XWe8o~u4N+ppu^tVZEM$7=_Yxw^&Bo^8B$4{cJKwuU=w@-}QR z5yZ&%*^~23`UJAvQIfOiVx(;$&0f|H#-U?JJW!kbByCw^vE9wnHfd}qz8|1%q90;d z4=S`xz_x8tyOa!K|Kg+I98PAEgN^OjU_mSj>FD(t*m+na=6z^(PIgN$44niseZ0QWLicVTX( zVL$V92h7$<=ILznHd19m5B^+r zrz?mxoF{+A$}KOk-}y~&A8ZUXSM`I7ZRrr@SqbO%Hq? z+nXMlo1>4AQ@Ph(r0qV>d$HcHwex_K+0IL=%!~cn(Q4XV%}WzLir=@3=A{{vx43!0 z=8Kg3;M^Q%4yGnG2gn${mT^8o$F&B09%tjG|yN5SCId&kJdkM_&hIs zwfP@lj@|LS*7BYFHP@{0Fn>4y%>HD`#JsqtxdZxKnTCDbb9$g`>*Pzf2F>uj<{bGW z^TUkE$uB#L{MwLj?K$2<@u{C}yCIWiK0D3+>DEJyny1L5L^Js|oFm_JlpB86o|C*; zchy|L==FZzOli1I+@;!L1-}0?nb8QEbThB31P>VdCAphnA$!uKt2>uRvy?B$C ze(8GCif&0}Tg6{X3-o`7d2i%dGXfoi{b%7(-o1pqh^)oW{f&Xzmc1$${hr@~uYbWi zDj7?@Gi19I-sa$K?ib;$WP1qS(*J6HQ@lm4hmh|ibZCAYeXCWz@RoVotlDVHTj|L@ z@%DOqu7R~V_VH_-qlmYWPN{s7>31A&FLpBT3qJ97#Og`V_N`l4BPM_GgSC!-p!^>_ z4-Mk$!DLo-KT?Be1VbXPOgx;^C56Gh18F6X6NxZYTUT z+>ekDFLt?^ik18}IQOlT=UKrYKkM8?4WE)Q z|4)OO{9>Ih{9n1?2;cw4`PlW)ly%`>A@0q@sdxG9gg)gT(dUv|Rb=#6Pz8WijhG_f@A-7fq(;@SsKo*1+yi64*R|Ee+7cjNE5_@5xG z8`O_D_wU(c;B@Z$LbovvAH1x-9ltO>6yeii5aR~t?+Y`%vS_pa;NVsw6CRd`#6xqr=uRe0huTh?soUUkp<^{Z@7X3Oe( zHdxRl4%6C5HV07Kiy5M-4HJi5-$XRbwcCYE-o|sj-M`Tsc z=Qgcz8FYulty^{9`iHlyjnKLRSekWri2?VjbsN?Jghk-|MfV!(%N+^#Z!qqU=fvDxkr_Bh!4SCT&#q>WS&HRDXY(p6ZL!@T`VuxJKmyf5j$aYSy}Z zft#KP{blQ#210+qt*>xw*~wxKv=m_Ibnq|teD`l6qv*k;+NYAgg0Xk@2`F!mgY}bg zFw-eEUNUr7oTp5bvG61u#4yF;a`+a?*~OnyUWF-Mn)hm6)hQS6dg8FdeENy#yACg< zaq({03%s<*Phq0t#v(t!8_tlV&G{*xDBiCFN4NnO$$uGd^w_XRAMRPVJ~{->`JMMa z=ku`}iN^Cm&ViSlvY9QhfB&bS^VzUwO}E#*ZgmeAZ{4%`bC}i5Ywmf-!`4Sd41e!i zw|pQI=B!)w`;{}s-ivN=tj_B}X(;T{+6&v5^SbEho+P+?b_M_1pc z&OmhE(WC3v-TO%=f=54LCHoNV;zlB_LSPSVx!>6MVJoQEw;?+e<2Q8sn#}>4N}}>V z<6x1Lb+89K@&j-$Hd!}E=)fO z2hXs>I&W#lcx8tbM=yLeSMy4~&c4QbfEgzgo~T}2hmX=k@m>Rdq{vTUlEn-=Tyi^p z8D51epD5n114ppEsYI=j*RO`S;Roy=_K@%Y zO1rdtH0c}m*|6^;qxBWmpK@l9{TZ@LVu-Ulhp{^an>B*H(q4V)ajQ?9zG-{)PsFrS z*eltpciXA0k)5iI?9^a~AK9r^Y)fhfcI7?n*0eqBj`!VubNc3Gx}XXF>E`o}UH7%id}aOoDqw zUQGvPHgTIr5?&tH7m)Uf7onzh(i7whc$ zW$y3a4nf-&z8Bg`?b#EK3)g0s(-!FdAw&6=1Sj!nVSX+_ghA{V7%)FN{h{-ibXbTDR5-}ZpTDK zHez3qEj)|4aQ?9;sPZBF|1Fz05b>Gcgo9_;ym&MI+j-y5=ItTQ#~lv+L^?Cm=D}A^ zB)_lCD_KIEciFuAA6>nEBX^-}ydkt=@7E8zsVlto;)B_{n94A1@5(4cQ9mr~WNrD} zLtL_gf6r$7``%Yv^kO5Z=d;9w<0hlYIr>1EyMo=m>VK*HW#6Lxw8d~Z#$0xZ;F(Xv zQ-n43Q1=Uuw5_WphijSJfU{_{aMF23nQ z+zZ&0CEscNpD_*z^*_4W<%87&wKsgOeJV>^Gn8Jf&=r%L$}dX z?>6ZM+VN2|PB7_ppO^MC#1t1=5<9o~DeavbxXsKN_I%Nmnz+?VLED^xM36c?4`rhr zpP1(*I=LfGX>tFU-`b&u{9P^L<8a;FDO<+JDdX+xkJ$38bNo)i z*Rlik*r7pRdj`q^_&1mIR|`kO>M7{|m%|Nnr~2XPu8^mdz54x9E=J$t9~Bq;H;=Jr z4jFL9$W;5NjP^GKgUj?CTJ~LTojQt47n4_Cqs>d_JgeE~&R%zK1@!AaL8El^-HhZf z-oj6XuceHG;sdbHdpqub;J1tX&k8T@{~|h$C%vv47^)0+gM>l&*EZub<1E-_W=1ZRMqE&g|zgGDmw=`!At3@k( zOVf|7S_}@Af2eV{_Hq3EaHHj^zLQlK3}v+ksatvnp5=qch_YlPCxw53KH68$n0nP2 z=*w{b0Zl~?YUF&5;dyH3bKtHhe%B^pyz5s`HfO>+?$8#vM`jGIy z{oJ+S7~c9eu>IDcaEz6C&E%aDj9gm#*%!^ZmlEd|-Ruvybfm{zzDmRX^+K8pxU*$` z>MC&H--?d$Jyfq`q&{zD{L~Na*!=AY@>dykt`+_leG@Yrx4)O4ctPJ-dNn)ibcVij zeLp;Lbj`x1q-2cIsd~{J&1E3xX5Yj<4c->)PegBR7km*e(ZalJ+Toeg$Na%W+)Fnh zpWeFsUHo3TbB>Ai*8S~^@U^;MaLD6IYj5~2BXzD?av+`kekktpopJU`@Ak_%gOCgc zGqORP%a`7Han2`sVf$_>!m?T3F4A~Jy3IDSvh8(Q)lb>5g~E-V%g$8~%-Q;u%fHIn zxhHfM!X#Ap(7&sNqquH{yfD?p^^$u8(llOW()0d$?=EC+>tetjYj9C7!g?v)FRqhL z$5Xw86BgCW3&36I`45%1<7Z6edh%AzkXYQDVR2&&$zj_qnXA~Z6cgQ)u^hS+x}y&q zm(aEHNI%p@^wEdfPWvF3_?%Z*jeN52l8<;J8SO+ik`eAuK3}r(vGeStTM_KGye=JU z&88+=8UOV9)!RQFo^KML|7Yd72tGbZIe%WB3WpD}iwWk&#D`MxP&^^Mog;I4V)-fB zWW%%5{J3TiSUQ95m+hx-xvQ1EIkcTtZ{bBBJlW3Kd;ILURyr&B1|eT&qc<_>h-{I=EJK2s+ECZ{<4%t?hby`@Np_F#beokY8Hz!-i=;s%`g0 zGv9oUWXL@mtEZ%cYKI1Bhjz@dZF_mGYwvf~UH#&~oLn_DhdPcOBmYX#_~I>jcot~i z8@iLLgcf}(HqxESF8180U5Rv9<%`PI1pgx4?^C&U=PIIdp_kgj_yhFx9p$q6Q1^Gp zWUKP{v1lh=UUWoys&cCDqH?PL0&R68&~Sk={t9I}bfxXjT+!Qf^^1q#|G_JB($6+q zkN>r=`AqGP$42K`peGKEw~ugEO8Bu&t-{ZlCiYxe-MxB0anFai%X*ucmK(WUl%SHGpJaVPEkg_3+!X36i0k?AtG;%*b|MddCRpMv3B zHS{EMbMv?R`{&Nl`I?EQISQ?nR0A(@a(T<>2s$>+2;R(6DQxTaQd`|C0(;7Z#1sYGBtPQER!9{dVr)?R3Pv3OAah0(CzCHvKj{UY7x&^6XQyae!PfbZn@67CY}weWtLZ^Y{x zofq(v`ybu!Pxy^XruhA+7n$;V-ym^Z9gC6e|Nr~~9JpqS{uy(N7baeMU-vE7bl++= zKHTGNysvo2Kp3vL@9`A)f0?-!<~=HIHzv^)H-`Vy5A|AA8#5F>njGM141ch1A;4Tr zQu6_t6IJ?o#+07tH=4WAaa#Mh_%t&KACGPqpY;zrM|R4&e}nKL!nMaw`0m2p%x{Bp zf6^Fz%fzgA?t2K=yh9ZJ0I+>rexD9qB}-iVM^X8U_?>a?ZMZ4F8FB7EhW<9(6VCm$ zFnyuC&tRJJ_+?!9AoTdS2b}vG!1i(ZzXX5w;t__26CawXTD5T#TL$eP=HRq_@cu`8 z)~sKD;}U=^Yt}qy*6XizcH3yA2{(n@|7f^JgorL+_4+mUY$nk8kjQOI2vJ!i8}GYs z%bFg=uz>a3Y`+i{?pe71(KQ?IBRI@s%Z5#x`9_mGM3pU3>=b1!3rnZHK+*mHee0;; z|LU}V$qM$vy7(o;iPq;z_7uSf;cOIVtjPcSMetcLlX_$tE|2nR#t(l>zu;GZRrXHcSDinw_WwovuUIina|Jw!_*|Kq_OFBw z7Ec%HNFVX45cwW7fX+dZf&jss^ zV^fq)(=CE4h^u{v1^A94_|77Dc@cbf5e#jGv@46?OcC5&1g|ZE*B8N*tAGdj7GP*C zz>gKdK@t3T5&T3E3{MJaw->>EMeslo{7ey?ErN%N;5{K+bq2oeE%M)21fzR}d=D1E zhl}7`5&TLK{Av;WS`j=}1dkWN6Cqr69(ulCaBu)7AKre6MLH_npUq$^L^&5C*o#7AN>%xi}XRGFfD7X_y7L^9KMjF<9s?&RJLjrF+Cg?mPQGtAk@)8Ki1zSdAOtRrM@*S(Va z(q{I+ZOgRw@09C%abM!M9y$8Vmq-@LY%wAnXVw4iBX1y z;zxqA;Ev<2AuV&|8I8UFR6HduxU$;!cV6ijzcasQ=M^XACePi9HwpcF;(j^f{i-vJ zxqTD=nP_%%8#jqg;=XR>k+t~GC?DeeW>LJ4DBhUp3-dUk_@w(Ijcd4gmaS5itaCbuV@}DYntsheOU9^o?#AS zyIm)!3x=~M5g1#yG$$ObAuQsqqB{ol1O(+dAg0;LJB=$|`)AI#zL+I`%aDa&^p0k+-d5T65VE*0J;+ z_!QPLPjxJPbRGjs);X1z>X`CT{^YZav*0aJzSx3RaC3ix*FCEBzfi|kFlQ+py92j$ z>{pqu=G#bF@tk#H?xjk4ez2RlPpe~I*Xd+75e(%uca4sDT@ilryH5BeYvy4qckee7wUzulW4MDd5q#M%r(XQK{oL0a4Eqhx^Q>f&yB-}4%rpDarU5>x9{x1X z+UP{m>+I(~zKMC+s$=uAsuMRu3u|L`UTwS568F2dd|6v3xGyk^uEqYaDBc$p@3i;{ zPso42;*;*r6c_)_Y%*xgLE~I>e~d8d1nYu9ZCEFAsp&f5y`xSDkM0Nv2E#fbIR}F? z>je01o$#m=p6bM(oP-zGz;E%ixK79|y5YsAL^F12EpGASK7Q+w6}H5aeqxurZq}Bu zOIGe1q)$aUvk>0B!!AWSL-{k(L&DJ+ub?w0WS7vPNN33NlZr$(C^F4F1V3aTl3nP=gF2yHxX` zWpHF_k9b91?PtKRxkvc!Q?4uJ{z8%6VU9XlgSb|6>{_!go+GASUL8X=k)7Fzo#_j8 zy*g~i1GVGLc8zN|Ym&4Bs!Qmr-P0&K2)B1oOv+XbTN!c>>$11-uTVN<&ibR_ERN>P zmtFcO`T4wkjjSsWE_zurvFl~Qa9%pFa63Fbn#{kW&(V&(n@HwYf)D;ofVoz>l&*i>5{og)$+?(H_z)!3Ng zM|d3lDb_o?XUU5&(ZJv=mI)=5|#l1P=IrqjVp!GTBDLEyujly}X=E#p6 z&6Pzocj_*xnKZYPM)Yt=zh~DGxruTEj^jf^r^x898 z*?!C8hJDhJ#5;Kmy$SjuU6j9SlC>OLPiV&l>pmCR6zs%Lp%XcpMaoNI;z#kCRh;%D zi$2Wc2W7P~q#n^ufs6I+?bs{o|4Nm8fVF7&vHL)Z`Wj(n%!x1D4aeJ*aN`|Y5fpH_ZOhH1$V+|XnB^4US?8Bb*Bi)CXs z^F74l3E!}9Njg`TZ95Y6Bhq%C(3kug%J4PSL)r^J7_wzrOj_w$CHIt7ApZ{X>poNI zo4#Hec{;Z{OENL|`1SzzHBFEgd}^c3>=j=2NF|v8N z%FEfj6T}^`eKAv~z8LpCMeWW_PL`#o$&dON<6d)LFyB}_OZhsoiCpYdhi~#7nS?99 z%8;Qi4~}fClR7~;7K$G#OYod`RXe(SlzY15AMCdLPr=L195__ZWVgpD!Fwa-^S&pZv!X znL-~@`XE2apS*97eB_2U4?cV3-y!#Q?oopG9ps_1UWI?B(}OmpRs0hD&hy&H>v7&E zc)!fMmbY89ps!bH4O947Q)6w^p>ItP)n z+E>BSwb#j)3pQe}cLe54M>Zi^9RInq-qiUwZKJk z{b^rA-dr>7cL|*5`x>(Lz?9-?ZPh0nTyGKfUq$!TxaEfpF6c60rxjni;A|}Ir0h$q zOLYqUS|NUm4;s%Gja{y!3@av**nr(Oe2jiXxS#Xg^8^1b;0{vqvHLXNYwXhd9%C2k zZ6X@GC?Dm|w|Qej@FN%sTBSprOF7GVma`EZ?SZ+HI_Hn03&CzvaSM8a8+&1@CWt3k zJb;!K#StxeaAVghhC8sQ}pDi}9Zs7>5cN;vJf_=CLjq67Jyrrh+; zGboBFqaJjj_iKZpjCjU)0G(0)b1*MA`&%`3^4jv`E&C7*nN(|Fevj~&`qshjObk2= zu}5J)dUrU!M-Jg$IPTR`{@|d#Wo)7;RPuJ?`)^Ce#C<*FUq?ahTbVrmI_MLvTZ}*~J zt9nkD8{gN5W0~Nx_53Jtcg20i_c=ShKQRw|8nk1XGX1s(CjL70TX~S*;3?#zNmR*j zESV|jvD~5;dGv}_(pAgu1a&te})_0GwkQuVOQT2szpZ2pb#(G`4@f_`^8<&&k!f1@u=f+s$ zRyQtvKH^b(U~K&-Zm1jCV%_-JUqI-A6Qqv$ltH1Gj(&`4^ z*@*fZ{_M-~_OiNhWGWDEZ5x1I3`T8$)sai*Wou>6G;T5PehPkW4?+cV^LHE81>?q) z5WT^e%6+(poV$R5K!vxVF&TqNe~)my3@w$`QcbQdjK2`rJ``UMdk)H8<#(S8Uuw8g z7q`~@h5t5wmV;k=4&?q#Ui-N8zca(VVut%)&Tw~w|15q{e(Pt1_pt8y41O7x-yh5f ze|&~}2l3y=FQQjz?c?YhoZ)_chI=G*mn?Vr{n?E0znI~EZHD`=-r>IgQM)){H!*at z(X>081XiuzxbZ>#DvV#QL9oAtEepZUj^Z;%*CRrYqH+B%X%E5=xv9b`>T|?1*L?sK^664~RbQ#m?;%HAxqf46@ zGp5S623uaAIOtfERzM2)qqKX9;4xQT@~l4Z z$|(3EX2`{#h1{ZY>HeYu?76hiGONp_6}+S<&e9_Ij-vSE(`BrIr?oDxn(wcJ&NOsJ{7n1P{7j>Jk-pUe zN3y6pJWYRnVmfU-^hC0#hn^^Hee-l)^^Z-bZI~#)zufb6KX08`ZHk^pc>mf$;UCIs zpL+hPO`~Pi6I;$cn641Ef8mdPG~^R5hp#apZXS0jujH?IY2K@O)$X`>%^BeD^F~k9 zeqM)%(ztjn$gpI+^HX|-Ap?Ux7PrG~dvIT7o%yqy*Y&)|InJarn!FvjU%95ee=N1k;P)1bcFiH@9|lk`n|ubmTPZ3BGQab9kAwwv(` zXY%Mz{+;p`jgH=yb2l9MQADfyUndhe&98SH2VVqdSK*KLd^p~;GqpNhX-fvHaircN+C?eO8H z?!2at`l`yw8f;E{!2MnEMCAlePgFk2vsdL(`Y(L1cwXBxl$|sDg*nAy877Nm*dCaK z_yHY{E503bac8jPN*~yshat{_G0G{q9_KgMosnE0_z-ga{huS(yFQ>?Z;Z-K+5GpC zt7wG3wja$nu`Lfz^O7U*Ddb8%E!jk1zZH_}+$#NUV@ywI5^r8D5r+~Z2$#D+wV#?Op({!lWPztbnJGuXQz z&R?6oQ};n!yf%CHo7ZMnXr05-SC+lAIBqcP@x4UL#|P2NXimFW|JF#i$ivRVPL-2e4?w5xIJS<{_$^8rxm97$ci;F(`4Q7$ffD*;!K@z z%KiR!BX(a@zQ}H%Pya!*7u$~Q;d)1X6Lx<*?xlC=T;pI+jy&u=1xMqu{kHyBs8I}t zvy>xalIVIk&lh_|^KPO^M^v=(S1?x(GJd5*{G}V!s@EdY}@)Ef8olyHAw1L zpgJ66S(o%FSJtEl!aW(Kk4umv@!wo9YmG|ITIV&u=LYH^=`L|IX==NXAzA3%qsaxx{JiVVazW1_8_snP$OOWjyU4i-i zVA$?``6TuGPU^JXTShq+(6-oq&I#G8-Bt%aQN-8x>*w6~bND(x;;Zbw`Z==s>gSxI z4G@3Szwp`87nK=V&zWJXY(Gad21Cr71txudo_FU-(K?ioZfSj7^VhOF8SwBeYTI9u z?W%XOP}|e0bj&y2AseK#_xv`(hnccD=4A69oorq!lFc0voyg{pYkPE7l=b_d3cnYG z*U3t2u1_F4FYD|ace1I^B$}^h9;}0~=xkn<^c_5`6=!5ClH9S-2G2SY5`X#aql3#&ii@19lV|NciAW4-OS!7Gdee$8JnBcce2DU&ZT-+ z2@mZ6Ybn+~m5K(@ge^TmUF%jj`4rZ$u%p(7YyB!(!_fMN${Vc#6Tj^mMk&&4(&KhMJS#ptp!rE`a^1~=iEFNrxDCqpC?gc%z!q0)pMln=G>_iLcR+Tu z=ThSx#Od&8x8N6Zr^r`lia#lQNd-yROWjf7XW84Ey}k>OySHjMf56aH<<<#$=D}Tj<=j0!hr&xbd`o8vneQ!bC5?2;WhiwNb z2kSg42X!&Qen!qGn+n!PS#KpjaL_+Kr}W~FaG?X`$_JTtsy#*zsw9gE^g(l|3X>d_ zhjbjBzXWaeo0aU_Ne4r$Ph&r@$ND~PVo_jfBHkz+e9&IaNS<1wvUeh~2JyS%m+BDd zcg*aMf3x4p4S!FvV(j5bj{m!K2X~<#q;-_YULUpnAgkA(EwU@tUaOC&z6f>9j++|L z{a)5#f^ZCVe=wN4+!*TjBio|B=FBma>gjk#&QPA;x9dWoO}Mkzwk%@3M)`|Y>aW(L z=CPKs7M|PrePmEVnL6NiH}B`*9K+ z(3ECBV2#JNhc4_h@{8Iux1XEs)ZsPr@7nln zcYXig-}gOpf493%@?HD8DeBBe>TRFPoQ;fvH95n7Q^`F1jp4uUrK;?q7nyf% zOo6^v5ZCt?6pl4ZuH<(w^X_tMx!FFLL_JHwA7h;R*JrrzoZ_Z5`iLo>oZGsFD{Gu+!q`wFCLoj~dT59n8vmCpU-jQG1}xW7Kb{ZiZUi;-M|3fWUs6 zp>USdeQY6I{J8(o&lFBwhVdQFXCvz@sC%XMw zQT#E7NB)$z*3nSrQ|BC<>YJuP-$rO~{uR&@@v36`^n7^5_ov~?gv)n1aY<`w7L1LE z)@3ShpDu4DWr@mOdACcug7_JiR&e(;{gsEO=jtmdSMi3(R#C<%toKzGev zexoPhfLealM#$Fi(6|}%uLZd$<$h<(^QZTb#3QVfS3D3t_&sx;zitflv?+xrYL8~j f^Vg$CarD9B5iP= 199901L +# ifndef STDC99 +# define STDC99 +# endif +# endif +#endif +#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) +# define STDC +#endif +#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) +# define STDC +#endif +#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) +# define STDC +#endif +#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) +# define STDC +#endif + +#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ +# define STDC +#endif + +#ifndef STDC +# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ +# define const /* note: need a more gentle solution here */ +# endif +#endif + +#if defined(ZLIB_CONST) && !defined(z_const) +# define z_const const +#else +# define z_const +#endif + +#ifdef Z_SOLO + typedef unsigned long z_size_t; +#else +# define z_longlong long long +# if defined(NO_SIZE_T) + typedef unsigned NO_SIZE_T z_size_t; +# elif defined(STDC) +# include + typedef size_t z_size_t; +# else + typedef unsigned long z_size_t; +# endif +# undef z_longlong +#endif + +/* Maximum value for memLevel in deflateInit2 */ +#ifndef MAX_MEM_LEVEL +# ifdef MAXSEG_64K +# define MAX_MEM_LEVEL 8 +# else +# define MAX_MEM_LEVEL 9 +# endif +#endif + +/* Maximum value for windowBits in deflateInit2 and inflateInit2. + * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files + * created by gzip. (Files created by minigzip can still be extracted by + * gzip.) + */ +#ifndef MAX_WBITS +# define MAX_WBITS 15 /* 32K LZ77 window */ +#endif + +/* The memory requirements for deflate are (in bytes): + (1 << (windowBits+2)) + (1 << (memLevel+9)) + that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) + plus a few kilobytes for small objects. For example, if you want to reduce + the default memory requirements from 256K to 128K, compile with + make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" + Of course this will generally degrade compression (there's no free lunch). + + The memory requirements for inflate are (in bytes) 1 << windowBits + that is, 32K for windowBits=15 (default value) plus about 7 kilobytes + for small objects. +*/ + + /* Type declarations */ + +#ifndef OF /* function prototypes */ +# ifdef STDC +# define OF(args) args +# else +# define OF(args) () +# endif +#endif + +#ifndef Z_ARG /* function prototypes for stdarg */ +# if defined(STDC) || defined(Z_HAVE_STDARG_H) +# define Z_ARG(args) args +# else +# define Z_ARG(args) () +# endif +#endif + +/* The following definitions for FAR are needed only for MSDOS mixed + * model programming (small or medium model with some far allocations). + * This was tested only with MSC; for other MSDOS compilers you may have + * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, + * just define FAR to be empty. + */ +#ifdef SYS16BIT +# if defined(M_I86SM) || defined(M_I86MM) + /* MSC small or medium model */ +# define SMALL_MEDIUM +# ifdef _MSC_VER +# define FAR _far +# else +# define FAR far +# endif +# endif +# if (defined(__SMALL__) || defined(__MEDIUM__)) + /* Turbo C small or medium model */ +# define SMALL_MEDIUM +# ifdef __BORLANDC__ +# define FAR _far +# else +# define FAR far +# endif +# endif +#endif + +#if defined(WINDOWS) || defined(WIN32) + /* If building or using zlib as a DLL, define ZLIB_DLL. + * This is not mandatory, but it offers a little performance increase. + */ +# ifdef ZLIB_DLL +# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) +# ifdef ZLIB_INTERNAL +# define ZEXTERN extern __declspec(dllexport) +# else +# define ZEXTERN extern __declspec(dllimport) +# endif +# endif +# endif /* ZLIB_DLL */ + /* If building or using zlib with the WINAPI/WINAPIV calling convention, + * define ZLIB_WINAPI. + * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. + */ +# ifdef ZLIB_WINAPI +# ifdef FAR +# undef FAR +# endif +# include + /* No need for _export, use ZLIB.DEF instead. */ + /* For complete Windows compatibility, use WINAPI, not __stdcall. */ +# define ZEXPORT WINAPI +# ifdef WIN32 +# define ZEXPORTVA WINAPIV +# else +# define ZEXPORTVA FAR CDECL +# endif +# endif +#endif + +#if defined (__BEOS__) +# ifdef ZLIB_DLL +# ifdef ZLIB_INTERNAL +# define ZEXPORT __declspec(dllexport) +# define ZEXPORTVA __declspec(dllexport) +# else +# define ZEXPORT __declspec(dllimport) +# define ZEXPORTVA __declspec(dllimport) +# endif +# endif +#endif + +#ifndef ZEXTERN +# define ZEXTERN extern +#endif +#ifndef ZEXPORT +# define ZEXPORT +#endif +#ifndef ZEXPORTVA +# define ZEXPORTVA +#endif + +#ifndef FAR +# define FAR +#endif + +#if !defined(__MACTYPES__) +typedef unsigned char Byte; /* 8 bits */ +#endif +typedef unsigned int uInt; /* 16 bits or more */ +typedef unsigned long uLong; /* 32 bits or more */ + +#ifdef SMALL_MEDIUM + /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ +# define Bytef Byte FAR +#else + typedef Byte FAR Bytef; +#endif +typedef char FAR charf; +typedef int FAR intf; +typedef uInt FAR uIntf; +typedef uLong FAR uLongf; + +#ifdef STDC + typedef void const *voidpc; + typedef void FAR *voidpf; + typedef void *voidp; +#else + typedef Byte const *voidpc; + typedef Byte FAR *voidpf; + typedef Byte *voidp; +#endif + +#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC) +# include +# if (UINT_MAX == 0xffffffffUL) +# define Z_U4 unsigned +# elif (ULONG_MAX == 0xffffffffUL) +# define Z_U4 unsigned long +# elif (USHRT_MAX == 0xffffffffUL) +# define Z_U4 unsigned short +# endif +#endif + +#ifdef Z_U4 + typedef Z_U4 z_crc_t; +#else + typedef unsigned long z_crc_t; +#endif + +#if 1 /* was set to #if 1 by ./configure */ +# define Z_HAVE_UNISTD_H +#endif + +#if 1 /* was set to #if 1 by ./configure */ +# define Z_HAVE_STDARG_H +#endif + +#ifdef STDC +# ifndef Z_SOLO +# include /* for off_t */ +# endif +#endif + +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifndef Z_SOLO +# include /* for va_list */ +# endif +#endif + +#ifdef _WIN32 +# ifndef Z_SOLO +# include /* for wchar_t */ +# endif +#endif + +/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and + * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even + * though the former does not conform to the LFS document), but considering + * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as + * equivalently requesting no 64-bit operations + */ +#if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1 +# undef _LARGEFILE64_SOURCE +#endif + +#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H) +# define Z_HAVE_UNISTD_H +#endif +#ifndef Z_SOLO +# if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) +# include /* for SEEK_*, off_t, and _LFS64_LARGEFILE */ +# ifdef VMS +# include /* for off_t */ +# endif +# ifndef z_off_t +# define z_off_t off_t +# endif +# endif +#endif + +#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0 +# define Z_LFS64 +#endif + +#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64) +# define Z_LARGE64 +#endif + +#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64) +# define Z_WANT64 +#endif + +#if !defined(SEEK_SET) && !defined(Z_SOLO) +# define SEEK_SET 0 /* Seek from beginning of file. */ +# define SEEK_CUR 1 /* Seek from current position. */ +# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ +#endif + +#ifndef z_off_t +# define z_off_t long +#endif + +#if !defined(_WIN32) && defined(Z_LARGE64) +# define z_off64_t off64_t +#else +# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO) +# define z_off64_t __int64 +# else +# define z_off64_t z_off_t +# endif +#endif + +/* MVS linker does not support external names larger than 8 bytes */ +#if defined(__MVS__) + #pragma map(deflateInit_,"DEIN") + #pragma map(deflateInit2_,"DEIN2") + #pragma map(deflateEnd,"DEEND") + #pragma map(deflateBound,"DEBND") + #pragma map(inflateInit_,"ININ") + #pragma map(inflateInit2_,"ININ2") + #pragma map(inflateEnd,"INEND") + #pragma map(inflateSync,"INSY") + #pragma map(inflateSetDictionary,"INSEDI") + #pragma map(compressBound,"CMBND") + #pragma map(inflate_table,"INTABL") + #pragma map(inflate_fast,"INFA") + #pragma map(inflate_copyright,"INCOPY") +#endif + +#endif /* ZCONF_H */ diff --git a/hdssd/external/solaris/zlib-1.2.11/zlib.h b/hdssd/external/solaris/zlib-1.2.11/zlib.h new file mode 100644 index 0000000..f09cdaf --- /dev/null +++ b/hdssd/external/solaris/zlib-1.2.11/zlib.h @@ -0,0 +1,1912 @@ +/* zlib.h -- interface of the 'zlib' general purpose compression library + version 1.2.11, January 15th, 2017 + + Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + + + The data format used by the zlib library is described by RFCs (Request for + Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950 + (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format). +*/ + +#ifndef ZLIB_H +#define ZLIB_H + +#include "zconf.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define ZLIB_VERSION "1.2.11" +#define ZLIB_VERNUM 0x12b0 +#define ZLIB_VER_MAJOR 1 +#define ZLIB_VER_MINOR 2 +#define ZLIB_VER_REVISION 11 +#define ZLIB_VER_SUBREVISION 0 + +/* + The 'zlib' compression library provides in-memory compression and + decompression functions, including integrity checks of the uncompressed data. + This version of the library supports only one compression method (deflation) + but other algorithms will be added later and will have the same stream + interface. + + Compression can be done in a single step if the buffers are large enough, + or can be done by repeated calls of the compression function. In the latter + case, the application must provide more input and/or consume the output + (providing more output space) before each call. + + The compressed data format used by default by the in-memory functions is + the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped + around a deflate stream, which is itself documented in RFC 1951. + + The library also supports reading and writing files in gzip (.gz) format + with an interface similar to that of stdio using the functions that start + with "gz". The gzip format is different from the zlib format. gzip is a + gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. + + This library can optionally read and write gzip and raw deflate streams in + memory as well. + + The zlib format was designed to be compact and fast for use in memory + and on communications channels. The gzip format was designed for single- + file compression on file systems, has a larger header than zlib to maintain + directory information, and uses a different, slower check method than zlib. + + The library does not install any signal handler. The decoder checks + the consistency of the compressed data, so the library should never crash + even in the case of corrupted input. +*/ + +typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); +typedef void (*free_func) OF((voidpf opaque, voidpf address)); + +struct internal_state; + +typedef struct z_stream_s { + z_const Bytef *next_in; /* next input byte */ + uInt avail_in; /* number of bytes available at next_in */ + uLong total_in; /* total number of input bytes read so far */ + + Bytef *next_out; /* next output byte will go here */ + uInt avail_out; /* remaining free space at next_out */ + uLong total_out; /* total number of bytes output so far */ + + z_const char *msg; /* last error message, NULL if no error */ + struct internal_state FAR *state; /* not visible by applications */ + + alloc_func zalloc; /* used to allocate the internal state */ + free_func zfree; /* used to free the internal state */ + voidpf opaque; /* private data object passed to zalloc and zfree */ + + int data_type; /* best guess about the data type: binary or text + for deflate, or the decoding state for inflate */ + uLong adler; /* Adler-32 or CRC-32 value of the uncompressed data */ + uLong reserved; /* reserved for future use */ +} z_stream; + +typedef z_stream FAR *z_streamp; + +/* + gzip header information passed to and from zlib routines. See RFC 1952 + for more details on the meanings of these fields. +*/ +typedef struct gz_header_s { + int text; /* true if compressed data believed to be text */ + uLong time; /* modification time */ + int xflags; /* extra flags (not used when writing a gzip file) */ + int os; /* operating system */ + Bytef *extra; /* pointer to extra field or Z_NULL if none */ + uInt extra_len; /* extra field length (valid if extra != Z_NULL) */ + uInt extra_max; /* space at extra (only when reading header) */ + Bytef *name; /* pointer to zero-terminated file name or Z_NULL */ + uInt name_max; /* space at name (only when reading header) */ + Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */ + uInt comm_max; /* space at comment (only when reading header) */ + int hcrc; /* true if there was or will be a header crc */ + int done; /* true when done reading gzip header (not used + when writing a gzip file) */ +} gz_header; + +typedef gz_header FAR *gz_headerp; + +/* + The application must update next_in and avail_in when avail_in has dropped + to zero. It must update next_out and avail_out when avail_out has dropped + to zero. The application must initialize zalloc, zfree and opaque before + calling the init function. All other fields are set by the compression + library and must not be updated by the application. + + The opaque value provided by the application will be passed as the first + parameter for calls of zalloc and zfree. This can be useful for custom + memory management. The compression library attaches no meaning to the + opaque value. + + zalloc must return Z_NULL if there is not enough memory for the object. + If zlib is used in a multi-threaded application, zalloc and zfree must be + thread safe. In that case, zlib is thread-safe. When zalloc and zfree are + Z_NULL on entry to the initialization function, they are set to internal + routines that use the standard library functions malloc() and free(). + + On 16-bit systems, the functions zalloc and zfree must be able to allocate + exactly 65536 bytes, but will not be required to allocate more than this if + the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, pointers + returned by zalloc for objects of exactly 65536 bytes *must* have their + offset normalized to zero. The default allocation function provided by this + library ensures this (see zutil.c). To reduce memory requirements and avoid + any allocation of 64K objects, at the expense of compression ratio, compile + the library with -DMAX_WBITS=14 (see zconf.h). + + The fields total_in and total_out can be used for statistics or progress + reports. After compression, total_in holds the total size of the + uncompressed data and may be saved for use by the decompressor (particularly + if the decompressor wants to decompress everything in a single step). +*/ + + /* constants */ + +#define Z_NO_FLUSH 0 +#define Z_PARTIAL_FLUSH 1 +#define Z_SYNC_FLUSH 2 +#define Z_FULL_FLUSH 3 +#define Z_FINISH 4 +#define Z_BLOCK 5 +#define Z_TREES 6 +/* Allowed flush values; see deflate() and inflate() below for details */ + +#define Z_OK 0 +#define Z_STREAM_END 1 +#define Z_NEED_DICT 2 +#define Z_ERRNO (-1) +#define Z_STREAM_ERROR (-2) +#define Z_DATA_ERROR (-3) +#define Z_MEM_ERROR (-4) +#define Z_BUF_ERROR (-5) +#define Z_VERSION_ERROR (-6) +/* Return codes for the compression/decompression functions. Negative values + * are errors, positive values are used for special but normal events. + */ + +#define Z_NO_COMPRESSION 0 +#define Z_BEST_SPEED 1 +#define Z_BEST_COMPRESSION 9 +#define Z_DEFAULT_COMPRESSION (-1) +/* compression levels */ + +#define Z_FILTERED 1 +#define Z_HUFFMAN_ONLY 2 +#define Z_RLE 3 +#define Z_FIXED 4 +#define Z_DEFAULT_STRATEGY 0 +/* compression strategy; see deflateInit2() below for details */ + +#define Z_BINARY 0 +#define Z_TEXT 1 +#define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */ +#define Z_UNKNOWN 2 +/* Possible values of the data_type field for deflate() */ + +#define Z_DEFLATED 8 +/* The deflate compression method (the only one supported in this version) */ + +#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ + +#define zlib_version zlibVersion() +/* for compatibility with versions < 1.0.2 */ + + + /* basic functions */ + +ZEXTERN const char * ZEXPORT zlibVersion OF((void)); +/* The application can compare zlibVersion and ZLIB_VERSION for consistency. + If the first character differs, the library code actually used is not + compatible with the zlib.h header file used by the application. This check + is automatically made by deflateInit and inflateInit. + */ + +/* +ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); + + Initializes the internal stream state for compression. The fields + zalloc, zfree and opaque must be initialized before by the caller. If + zalloc and zfree are set to Z_NULL, deflateInit updates them to use default + allocation functions. + + The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: + 1 gives best speed, 9 gives best compression, 0 gives no compression at all + (the input data is simply copied a block at a time). Z_DEFAULT_COMPRESSION + requests a default compromise between speed and compression (currently + equivalent to level 6). + + deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if level is not a valid compression level, or + Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible + with the version assumed by the caller (ZLIB_VERSION). msg is set to null + if there is no error message. deflateInit does not perform any compression: + this will be done by deflate(). +*/ + + +ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); +/* + deflate compresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce + some output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. deflate performs one or both of the + following actions: + + - Compress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in and avail_in are updated and + processing will resume at this point for the next call of deflate(). + + - Generate more output starting at next_out and update next_out and avail_out + accordingly. This action is forced if the parameter flush is non zero. + Forcing flush frequently degrades the compression ratio, so this parameter + should be set only when necessary. Some output may be provided even if + flush is zero. + + Before the call of deflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming more + output, and updating avail_in or avail_out accordingly; avail_out should + never be zero before the call. The application can consume the compressed + output when it wants, for example when the output buffer is full (avail_out + == 0), or after each call of deflate(). If deflate returns Z_OK and with + zero avail_out, it must be called again after making room in the output + buffer because there might be more output pending. See deflatePending(), + which can be used if desired to determine whether or not there is more ouput + in that case. + + Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to + decide how much data to accumulate before producing output, in order to + maximize compression. + + If the parameter flush is set to Z_SYNC_FLUSH, all pending output is + flushed to the output buffer and the output is aligned on a byte boundary, so + that the decompressor can get all input data available so far. (In + particular avail_in is zero after the call if enough output space has been + provided before the call.) Flushing may degrade compression for some + compression algorithms and so it should be used only when necessary. This + completes the current deflate block and follows it with an empty stored block + that is three bits plus filler bits to the next byte, followed by four bytes + (00 00 ff ff). + + If flush is set to Z_PARTIAL_FLUSH, all pending output is flushed to the + output buffer, but the output is not aligned to a byte boundary. All of the + input data so far will be available to the decompressor, as for Z_SYNC_FLUSH. + This completes the current deflate block and follows it with an empty fixed + codes block that is 10 bits long. This assures that enough bytes are output + in order for the decompressor to finish the block before the empty fixed + codes block. + + If flush is set to Z_BLOCK, a deflate block is completed and emitted, as + for Z_SYNC_FLUSH, but the output is not aligned on a byte boundary, and up to + seven bits of the current block are held to be written as the next byte after + the next deflate block is completed. In this case, the decompressor may not + be provided enough bits at this point in order to complete decompression of + the data provided so far to the compressor. It may need to wait for the next + block to be emitted. This is for advanced applications that need to control + the emission of deflate blocks. + + If flush is set to Z_FULL_FLUSH, all output is flushed as with + Z_SYNC_FLUSH, and the compression state is reset so that decompression can + restart from this point if previous compressed data has been damaged or if + random access is desired. Using Z_FULL_FLUSH too often can seriously degrade + compression. + + If deflate returns with avail_out == 0, this function must be called again + with the same value of the flush parameter and more output space (updated + avail_out), until the flush is complete (deflate returns with non-zero + avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that + avail_out is greater than six to avoid repeated flush markers due to + avail_out == 0 on return. + + If the parameter flush is set to Z_FINISH, pending input is processed, + pending output is flushed and deflate returns with Z_STREAM_END if there was + enough output space. If deflate returns with Z_OK or Z_BUF_ERROR, this + function must be called again with Z_FINISH and more output space (updated + avail_out) but no more input data, until it returns with Z_STREAM_END or an + error. After deflate has returned Z_STREAM_END, the only possible operations + on the stream are deflateReset or deflateEnd. + + Z_FINISH can be used in the first deflate call after deflateInit if all the + compression is to be done in a single step. In order to complete in one + call, avail_out must be at least the value returned by deflateBound (see + below). Then deflate is guaranteed to return Z_STREAM_END. If not enough + output space is provided, deflate will not return Z_STREAM_END, and it must + be called again as described above. + + deflate() sets strm->adler to the Adler-32 checksum of all input read + so far (that is, total_in bytes). If a gzip stream is being generated, then + strm->adler will be the CRC-32 checksum of the input read so far. (See + deflateInit2 below.) + + deflate() may update strm->data_type if it can make a good guess about + the input data type (Z_BINARY or Z_TEXT). If in doubt, the data is + considered binary. This field is only for information purposes and does not + affect the compression algorithm in any manner. + + deflate() returns Z_OK if some progress has been made (more input + processed or more output produced), Z_STREAM_END if all input has been + consumed and all output has been produced (only when flush is set to + Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example + if next_in or next_out was Z_NULL or the state was inadvertently written over + by the application), or Z_BUF_ERROR if no progress is possible (for example + avail_in or avail_out was zero). Note that Z_BUF_ERROR is not fatal, and + deflate() can be called again with more input and more output space to + continue compressing. +*/ + + +ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any pending + output. + + deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the + stream state was inconsistent, Z_DATA_ERROR if the stream was freed + prematurely (some input or output was discarded). In the error case, msg + may be set but then points to a static string (which must not be + deallocated). +*/ + + +/* +ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); + + Initializes the internal stream state for decompression. The fields + next_in, avail_in, zalloc, zfree and opaque must be initialized before by + the caller. In the current version of inflate, the provided input is not + read or consumed. The allocation of a sliding window will be deferred to + the first call of inflate (if the decompression does not complete on the + first call). If zalloc and zfree are set to Z_NULL, inflateInit updates + them to use default allocation functions. + + inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller, or Z_STREAM_ERROR if the parameters are + invalid, such as a null pointer to the structure. msg is set to null if + there is no error message. inflateInit does not perform any decompression. + Actual decompression will be done by inflate(). So next_in, and avail_in, + next_out, and avail_out are unused and unchanged. The current + implementation of inflateInit() does not process any header information -- + that is deferred until inflate() is called. +*/ + + +ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); +/* + inflate decompresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce + some output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. inflate performs one or both of the + following actions: + + - Decompress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), then next_in and avail_in are updated + accordingly, and processing will resume at this point for the next call of + inflate(). + + - Generate more output starting at next_out and update next_out and avail_out + accordingly. inflate() provides as much output as possible, until there is + no more input data or no more space in the output buffer (see below about + the flush parameter). + + Before the call of inflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming more + output, and updating the next_* and avail_* values accordingly. If the + caller of inflate() does not provide both available input and available + output space, it is possible that there will be no progress made. The + application can consume the uncompressed output when it wants, for example + when the output buffer is full (avail_out == 0), or after each call of + inflate(). If inflate returns Z_OK and with zero avail_out, it must be + called again after making room in the output buffer because there might be + more output pending. + + The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FINISH, + Z_BLOCK, or Z_TREES. Z_SYNC_FLUSH requests that inflate() flush as much + output as possible to the output buffer. Z_BLOCK requests that inflate() + stop if and when it gets to the next deflate block boundary. When decoding + the zlib or gzip format, this will cause inflate() to return immediately + after the header and before the first block. When doing a raw inflate, + inflate() will go ahead and process the first block, and will return when it + gets to the end of that block, or when it runs out of data. + + The Z_BLOCK option assists in appending to or combining deflate streams. + To assist in this, on return inflate() always sets strm->data_type to the + number of unused bits in the last byte taken from strm->next_in, plus 64 if + inflate() is currently decoding the last block in the deflate stream, plus + 128 if inflate() returned immediately after decoding an end-of-block code or + decoding the complete header up to just before the first byte of the deflate + stream. The end-of-block will not be indicated until all of the uncompressed + data from that block has been written to strm->next_out. The number of + unused bits may in general be greater than seven, except when bit 7 of + data_type is set, in which case the number of unused bits will be less than + eight. data_type is set as noted here every time inflate() returns for all + flush options, and so can be used to determine the amount of currently + consumed input in bits. + + The Z_TREES option behaves as Z_BLOCK does, but it also returns when the + end of each deflate block header is reached, before any actual data in that + block is decoded. This allows the caller to determine the length of the + deflate block header for later use in random access within a deflate block. + 256 is added to the value of strm->data_type when inflate() returns + immediately after reaching the end of the deflate block header. + + inflate() should normally be called until it returns Z_STREAM_END or an + error. However if all decompression is to be performed in a single step (a + single call of inflate), the parameter flush should be set to Z_FINISH. In + this case all pending input is processed and all pending output is flushed; + avail_out must be large enough to hold all of the uncompressed data for the + operation to complete. (The size of the uncompressed data may have been + saved by the compressor for this purpose.) The use of Z_FINISH is not + required to perform an inflation in one step. However it may be used to + inform inflate that a faster approach can be used for the single inflate() + call. Z_FINISH also informs inflate to not maintain a sliding window if the + stream completes, which reduces inflate's memory footprint. If the stream + does not complete, either because not all of the stream is provided or not + enough output space is provided, then a sliding window will be allocated and + inflate() can be called again to continue the operation as if Z_NO_FLUSH had + been used. + + In this implementation, inflate() always flushes as much output as + possible to the output buffer, and always uses the faster approach on the + first call. So the effects of the flush parameter in this implementation are + on the return value of inflate() as noted below, when inflate() returns early + when Z_BLOCK or Z_TREES is used, and when inflate() avoids the allocation of + memory for a sliding window when Z_FINISH is used. + + If a preset dictionary is needed after this call (see inflateSetDictionary + below), inflate sets strm->adler to the Adler-32 checksum of the dictionary + chosen by the compressor and returns Z_NEED_DICT; otherwise it sets + strm->adler to the Adler-32 checksum of all output produced so far (that is, + total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described + below. At the end of the stream, inflate() checks that its computed Adler-32 + checksum is equal to that saved by the compressor and returns Z_STREAM_END + only if the checksum is correct. + + inflate() can decompress and check either zlib-wrapped or gzip-wrapped + deflate data. The header type is detected automatically, if requested when + initializing with inflateInit2(). Any information contained in the gzip + header is not retained unless inflateGetHeader() is used. When processing + gzip-wrapped deflate data, strm->adler32 is set to the CRC-32 of the output + produced so far. The CRC-32 is checked against the gzip trailer, as is the + uncompressed length, modulo 2^32. + + inflate() returns Z_OK if some progress has been made (more input processed + or more output produced), Z_STREAM_END if the end of the compressed data has + been reached and all uncompressed output has been produced, Z_NEED_DICT if a + preset dictionary is needed at this point, Z_DATA_ERROR if the input data was + corrupted (input stream not conforming to the zlib format or incorrect check + value, in which case strm->msg points to a string with a more specific + error), Z_STREAM_ERROR if the stream structure was inconsistent (for example + next_in or next_out was Z_NULL, or the state was inadvertently written over + by the application), Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR + if no progress was possible or if there was not enough room in the output + buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and + inflate() can be called again with more input and more output space to + continue decompressing. If Z_DATA_ERROR is returned, the application may + then call inflateSync() to look for a good compression block if a partial + recovery of the data is to be attempted. +*/ + + +ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any pending + output. + + inflateEnd returns Z_OK if success, or Z_STREAM_ERROR if the stream state + was inconsistent. +*/ + + + /* Advanced functions */ + +/* + The following functions are needed only in some special applications. +*/ + +/* +ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, + int level, + int method, + int windowBits, + int memLevel, + int strategy)); + + This is another version of deflateInit with more compression options. The + fields next_in, zalloc, zfree and opaque must be initialized before by the + caller. + + The method parameter is the compression method. It must be Z_DEFLATED in + this version of the library. + + The windowBits parameter is the base two logarithm of the window size + (the size of the history buffer). It should be in the range 8..15 for this + version of the library. Larger values of this parameter result in better + compression at the expense of memory usage. The default value is 15 if + deflateInit is used instead. + + For the current implementation of deflate(), a windowBits value of 8 (a + window size of 256 bytes) is not supported. As a result, a request for 8 + will result in 9 (a 512-byte window). In that case, providing 8 to + inflateInit2() will result in an error when the zlib header with 9 is + checked against the initialization of inflate(). The remedy is to not use 8 + with deflateInit2() with this initialization, or at least in that case use 9 + with inflateInit2(). + + windowBits can also be -8..-15 for raw deflate. In this case, -windowBits + determines the window size. deflate() will then generate raw deflate data + with no zlib header or trailer, and will not compute a check value. + + windowBits can also be greater than 15 for optional gzip encoding. Add + 16 to windowBits to write a simple gzip header and trailer around the + compressed data instead of a zlib wrapper. The gzip header will have no + file name, no extra data, no comment, no modification time (set to zero), no + header crc, and the operating system will be set to the appropriate value, + if the operating system was determined at compile time. If a gzip stream is + being written, strm->adler is a CRC-32 instead of an Adler-32. + + For raw deflate or gzip encoding, a request for a 256-byte window is + rejected as invalid, since only the zlib header provides a means of + transmitting the window size to the decompressor. + + The memLevel parameter specifies how much memory should be allocated + for the internal compression state. memLevel=1 uses minimum memory but is + slow and reduces compression ratio; memLevel=9 uses maximum memory for + optimal speed. The default value is 8. See zconf.h for total memory usage + as a function of windowBits and memLevel. + + The strategy parameter is used to tune the compression algorithm. Use the + value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a + filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no + string match), or Z_RLE to limit match distances to one (run-length + encoding). Filtered data consists mostly of small values with a somewhat + random distribution. In this case, the compression algorithm is tuned to + compress them better. The effect of Z_FILTERED is to force more Huffman + coding and less string matching; it is somewhat intermediate between + Z_DEFAULT_STRATEGY and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as + fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data. The + strategy parameter only affects the compression ratio but not the + correctness of the compressed output even if it is not set appropriately. + Z_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler + decoder for special applications. + + deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if any parameter is invalid (such as an invalid + method), or Z_VERSION_ERROR if the zlib library version (zlib_version) is + incompatible with the version assumed by the caller (ZLIB_VERSION). msg is + set to null if there is no error message. deflateInit2 does not perform any + compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the compression dictionary from the given byte sequence + without producing any compressed output. When using the zlib format, this + function must be called immediately after deflateInit, deflateInit2 or + deflateReset, and before any call of deflate. When doing raw deflate, this + function must be called either before any call of deflate, or immediately + after the completion of a deflate block, i.e. after all input has been + consumed and all output has been delivered when using any of the flush + options Z_BLOCK, Z_PARTIAL_FLUSH, Z_SYNC_FLUSH, or Z_FULL_FLUSH. The + compressor and decompressor must use exactly the same dictionary (see + inflateSetDictionary). + + The dictionary should consist of strings (byte sequences) that are likely + to be encountered later in the data to be compressed, with the most commonly + used strings preferably put towards the end of the dictionary. Using a + dictionary is most useful when the data to be compressed is short and can be + predicted with good accuracy; the data can then be compressed better than + with the default empty dictionary. + + Depending on the size of the compression data structures selected by + deflateInit or deflateInit2, a part of the dictionary may in effect be + discarded, for example if the dictionary is larger than the window size + provided in deflateInit or deflateInit2. Thus the strings most likely to be + useful should be put at the end of the dictionary, not at the front. In + addition, the current implementation of deflate will use at most the window + size minus 262 bytes of the provided dictionary. + + Upon return of this function, strm->adler is set to the Adler-32 value + of the dictionary; the decompressor may later use this value to determine + which dictionary has been used by the compressor. (The Adler-32 value + applies to the whole dictionary even if only a subset of the dictionary is + actually used by the compressor.) If a raw deflate was requested, then the + Adler-32 value is not computed and strm->adler is not set. + + deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a + parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is + inconsistent (for example if deflate has already been called for this stream + or if not at a block boundary for raw deflate). deflateSetDictionary does + not perform any compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateGetDictionary OF((z_streamp strm, + Bytef *dictionary, + uInt *dictLength)); +/* + Returns the sliding dictionary being maintained by deflate. dictLength is + set to the number of bytes in the dictionary, and that many bytes are copied + to dictionary. dictionary must have enough space, where 32768 bytes is + always enough. If deflateGetDictionary() is called with dictionary equal to + Z_NULL, then only the dictionary length is returned, and nothing is copied. + Similary, if dictLength is Z_NULL, then it is not set. + + deflateGetDictionary() may return a length less than the window size, even + when more than the window size in input has been provided. It may return up + to 258 bytes less in that case, due to how zlib's implementation of deflate + manages the sliding window and lookahead for matches, where matches can be + up to 258 bytes long. If the application needs the last window-size bytes of + input, then that would need to be saved by the application outside of zlib. + + deflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the + stream state is inconsistent. +*/ + +ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when several compression strategies will be + tried, for example when there are several ways of pre-processing the input + data with a filter. The streams that will be discarded should then be freed + by calling deflateEnd. Note that deflateCopy duplicates the internal + compression state which can be quite large, so this strategy is slow and can + consume lots of memory. + + deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being Z_NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); +/* + This function is equivalent to deflateEnd followed by deflateInit, but + does not free and reallocate the internal compression state. The stream + will leave the compression level and any other attributes that may have been + set unchanged. + + deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL). +*/ + +ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, + int level, + int strategy)); +/* + Dynamically update the compression level and compression strategy. The + interpretation of level and strategy is as in deflateInit2(). This can be + used to switch between compression and straight copy of the input data, or + to switch to a different kind of input data requiring a different strategy. + If the compression approach (which is a function of the level) or the + strategy is changed, and if any input has been consumed in a previous + deflate() call, then the input available so far is compressed with the old + level and strategy using deflate(strm, Z_BLOCK). There are three approaches + for the compression levels 0, 1..3, and 4..9 respectively. The new level + and strategy will take effect at the next call of deflate(). + + If a deflate(strm, Z_BLOCK) is performed by deflateParams(), and it does + not have enough output space to complete, then the parameter change will not + take effect. In this case, deflateParams() can be called again with the + same parameters and more output space to try again. + + In order to assure a change in the parameters on the first try, the + deflate stream should be flushed using deflate() with Z_BLOCK or other flush + request until strm.avail_out is not zero, before calling deflateParams(). + Then no more input data should be provided before the deflateParams() call. + If this is done, the old level and strategy will be applied to the data + compressed before deflateParams(), and the new level and strategy will be + applied to the the data compressed after deflateParams(). + + deflateParams returns Z_OK on success, Z_STREAM_ERROR if the source stream + state was inconsistent or if a parameter was invalid, or Z_BUF_ERROR if + there was not enough output space to complete the compression of the + available input data before a change in the strategy or approach. Note that + in the case of a Z_BUF_ERROR, the parameters are not changed. A return + value of Z_BUF_ERROR is not fatal, in which case deflateParams() can be + retried with more output space. +*/ + +ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, + int good_length, + int max_lazy, + int nice_length, + int max_chain)); +/* + Fine tune deflate's internal compression parameters. This should only be + used by someone who understands the algorithm used by zlib's deflate for + searching for the best matching string, and even then only by the most + fanatic optimizer trying to squeeze out the last compressed bit for their + specific input data. Read the deflate.c source code for the meaning of the + max_lazy, good_length, nice_length, and max_chain parameters. + + deflateTune() can be called after deflateInit() or deflateInit2(), and + returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. + */ + +ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, + uLong sourceLen)); +/* + deflateBound() returns an upper bound on the compressed size after + deflation of sourceLen bytes. It must be called after deflateInit() or + deflateInit2(), and after deflateSetHeader(), if used. This would be used + to allocate an output buffer for deflation in a single pass, and so would be + called before deflate(). If that first deflate() call is provided the + sourceLen input bytes, an output buffer allocated to the size returned by + deflateBound(), and the flush value Z_FINISH, then deflate() is guaranteed + to return Z_STREAM_END. Note that it is possible for the compressed size to + be larger than the value returned by deflateBound() if flush options other + than Z_FINISH or Z_NO_FLUSH are used. +*/ + +ZEXTERN int ZEXPORT deflatePending OF((z_streamp strm, + unsigned *pending, + int *bits)); +/* + deflatePending() returns the number of bytes and bits of output that have + been generated, but not yet provided in the available output. The bytes not + provided would be due to the available output space having being consumed. + The number of bits of output not provided are between 0 and 7, where they + await more bits to join them in order to fill out a full byte. If pending + or bits are Z_NULL, then those values are not set. + + deflatePending returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. + */ + +ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + deflatePrime() inserts bits in the deflate output stream. The intent + is that this function is used to start off the deflate output with the bits + leftover from a previous deflate stream when appending to it. As such, this + function can only be used for raw deflate, and must be used before the first + deflate() call after a deflateInit2() or deflateReset(). bits must be less + than or equal to 16, and that many of the least significant bits of value + will be inserted in the output. + + deflatePrime returns Z_OK if success, Z_BUF_ERROR if there was not enough + room in the internal buffer to insert the bits, or Z_STREAM_ERROR if the + source stream state was inconsistent. +*/ + +ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, + gz_headerp head)); +/* + deflateSetHeader() provides gzip header information for when a gzip + stream is requested by deflateInit2(). deflateSetHeader() may be called + after deflateInit2() or deflateReset() and before the first call of + deflate(). The text, time, os, extra field, name, and comment information + in the provided gz_header structure are written to the gzip header (xflag is + ignored -- the extra flags are set according to the compression level). The + caller must assure that, if not Z_NULL, name and comment are terminated with + a zero byte, and that if extra is not Z_NULL, that extra_len bytes are + available there. If hcrc is true, a gzip header crc is included. Note that + the current versions of the command-line version of gzip (up through version + 1.3.x) do not support header crc's, and will report that it is a "multi-part + gzip file" and give up. + + If deflateSetHeader is not used, the default gzip header has text false, + the time set to zero, and os set to 255, with no extra, name, or comment + fields. The gzip header is returned to the default state by deflateReset(). + + deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, + int windowBits)); + + This is another version of inflateInit with an extra parameter. The + fields next_in, avail_in, zalloc, zfree and opaque must be initialized + before by the caller. + + The windowBits parameter is the base two logarithm of the maximum window + size (the size of the history buffer). It should be in the range 8..15 for + this version of the library. The default value is 15 if inflateInit is used + instead. windowBits must be greater than or equal to the windowBits value + provided to deflateInit2() while compressing, or it must be equal to 15 if + deflateInit2() was not used. If a compressed stream with a larger window + size is given as input, inflate() will return with the error code + Z_DATA_ERROR instead of trying to allocate a larger window. + + windowBits can also be zero to request that inflate use the window size in + the zlib header of the compressed stream. + + windowBits can also be -8..-15 for raw inflate. In this case, -windowBits + determines the window size. inflate() will then process raw deflate data, + not looking for a zlib or gzip header, not generating a check value, and not + looking for any check values for comparison at the end of the stream. This + is for use with other formats that use the deflate compressed data format + such as zip. Those formats provide their own check values. If a custom + format is developed using the raw deflate format for compressed data, it is + recommended that a check value such as an Adler-32 or a CRC-32 be applied to + the uncompressed data as is done in the zlib, gzip, and zip formats. For + most applications, the zlib format should be used as is. Note that comments + above on the use in deflateInit2() applies to the magnitude of windowBits. + + windowBits can also be greater than 15 for optional gzip decoding. Add + 32 to windowBits to enable zlib and gzip decoding with automatic header + detection, or add 16 to decode only the gzip format (the zlib format will + return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a + CRC-32 instead of an Adler-32. Unlike the gunzip utility and gzread() (see + below), inflate() will not automatically decode concatenated gzip streams. + inflate() will return Z_STREAM_END at the end of the gzip stream. The state + would need to be reset to continue decoding a subsequent gzip stream. + + inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller, or Z_STREAM_ERROR if the parameters are + invalid, such as a null pointer to the structure. msg is set to null if + there is no error message. inflateInit2 does not perform any decompression + apart from possibly reading the zlib header if present: actual decompression + will be done by inflate(). (So next_in and avail_in may be modified, but + next_out and avail_out are unused and unchanged.) The current implementation + of inflateInit2() does not process any header information -- that is + deferred until inflate() is called. +*/ + +ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the decompression dictionary from the given uncompressed byte + sequence. This function must be called immediately after a call of inflate, + if that call returned Z_NEED_DICT. The dictionary chosen by the compressor + can be determined from the Adler-32 value returned by that call of inflate. + The compressor and decompressor must use exactly the same dictionary (see + deflateSetDictionary). For raw inflate, this function can be called at any + time to set the dictionary. If the provided dictionary is smaller than the + window and there is already data in the window, then the provided dictionary + will amend what's there. The application must insure that the dictionary + that was used for compression is provided. + + inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a + parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is + inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the + expected one (incorrect Adler-32 value). inflateSetDictionary does not + perform any decompression: this will be done by subsequent calls of + inflate(). +*/ + +ZEXTERN int ZEXPORT inflateGetDictionary OF((z_streamp strm, + Bytef *dictionary, + uInt *dictLength)); +/* + Returns the sliding dictionary being maintained by inflate. dictLength is + set to the number of bytes in the dictionary, and that many bytes are copied + to dictionary. dictionary must have enough space, where 32768 bytes is + always enough. If inflateGetDictionary() is called with dictionary equal to + Z_NULL, then only the dictionary length is returned, and nothing is copied. + Similary, if dictLength is Z_NULL, then it is not set. + + inflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the + stream state is inconsistent. +*/ + +ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); +/* + Skips invalid compressed data until a possible full flush point (see above + for the description of deflate with Z_FULL_FLUSH) can be found, or until all + available input is skipped. No output is provided. + + inflateSync searches for a 00 00 FF FF pattern in the compressed data. + All full flush points have this pattern, but not all occurrences of this + pattern are full flush points. + + inflateSync returns Z_OK if a possible full flush point has been found, + Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point + has been found, or Z_STREAM_ERROR if the stream structure was inconsistent. + In the success case, the application may save the current current value of + total_in which indicates where valid compressed data was found. In the + error case, the application may repeatedly call inflateSync, providing more + input each time, until success or end of the input data. +*/ + +ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when randomly accessing a large stream. The + first pass through the stream can periodically record the inflate state, + allowing restarting inflate at those points when randomly accessing the + stream. + + inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being Z_NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); +/* + This function is equivalent to inflateEnd followed by inflateInit, + but does not free and reallocate the internal decompression state. The + stream will keep attributes that may have been set by inflateInit2. + + inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL). +*/ + +ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm, + int windowBits)); +/* + This function is the same as inflateReset, but it also permits changing + the wrap and window size requests. The windowBits parameter is interpreted + the same as it is for inflateInit2. If the window size is changed, then the + memory allocated for the window is freed, and the window will be reallocated + by inflate() if needed. + + inflateReset2 returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL), or if + the windowBits parameter is invalid. +*/ + +ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + This function inserts bits in the inflate input stream. The intent is + that this function is used to start inflating at a bit position in the + middle of a byte. The provided bits will be used before any bytes are used + from next_in. This function should only be used with raw inflate, and + should be used before the first inflate() call after inflateInit2() or + inflateReset(). bits must be less than or equal to 16, and that many of the + least significant bits of value will be inserted in the input. + + If bits is negative, then the input stream bit buffer is emptied. Then + inflatePrime() can be called again to put bits in the buffer. This is used + to clear out bits leftover after feeding inflate a block description prior + to feeding inflate codes. + + inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm)); +/* + This function returns two values, one in the lower 16 bits of the return + value, and the other in the remaining upper bits, obtained by shifting the + return value down 16 bits. If the upper value is -1 and the lower value is + zero, then inflate() is currently decoding information outside of a block. + If the upper value is -1 and the lower value is non-zero, then inflate is in + the middle of a stored block, with the lower value equaling the number of + bytes from the input remaining to copy. If the upper value is not -1, then + it is the number of bits back from the current bit position in the input of + the code (literal or length/distance pair) currently being processed. In + that case the lower value is the number of bytes already emitted for that + code. + + A code is being processed if inflate is waiting for more input to complete + decoding of the code, or if it has completed decoding but is waiting for + more output space to write the literal or match data. + + inflateMark() is used to mark locations in the input data for random + access, which may be at bit positions, and to note those cases where the + output of a code may span boundaries of random access blocks. The current + location in the input stream can be determined from avail_in and data_type + as noted in the description for the Z_BLOCK flush parameter for inflate. + + inflateMark returns the value noted above, or -65536 if the provided + source stream state was inconsistent. +*/ + +ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, + gz_headerp head)); +/* + inflateGetHeader() requests that gzip header information be stored in the + provided gz_header structure. inflateGetHeader() may be called after + inflateInit2() or inflateReset(), and before the first call of inflate(). + As inflate() processes the gzip stream, head->done is zero until the header + is completed, at which time head->done is set to one. If a zlib stream is + being decoded, then head->done is set to -1 to indicate that there will be + no gzip header information forthcoming. Note that Z_BLOCK or Z_TREES can be + used to force inflate() to return immediately after header processing is + complete and before any actual data is decompressed. + + The text, time, xflags, and os fields are filled in with the gzip header + contents. hcrc is set to true if there is a header CRC. (The header CRC + was valid if done is set to one.) If extra is not Z_NULL, then extra_max + contains the maximum number of bytes to write to extra. Once done is true, + extra_len contains the actual extra field length, and extra contains the + extra field, or that field truncated if extra_max is less than extra_len. + If name is not Z_NULL, then up to name_max characters are written there, + terminated with a zero unless the length is greater than name_max. If + comment is not Z_NULL, then up to comm_max characters are written there, + terminated with a zero unless the length is greater than comm_max. When any + of extra, name, or comment are not Z_NULL and the respective field is not + present in the header, then that field is set to Z_NULL to signal its + absence. This allows the use of deflateSetHeader() with the returned + structure to duplicate the header. However if those fields are set to + allocated memory, then the application will need to save those pointers + elsewhere so that they can be eventually freed. + + If inflateGetHeader is not used, then the header information is simply + discarded. The header is always checked for validity, including the header + CRC if present. inflateReset() will reset the process to discard the header + information. The application would need to call inflateGetHeader() again to + retrieve the header from the next gzip stream. + + inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, + unsigned char FAR *window)); + + Initialize the internal stream state for decompression using inflateBack() + calls. The fields zalloc, zfree and opaque in strm must be initialized + before the call. If zalloc and zfree are Z_NULL, then the default library- + derived memory allocation routines are used. windowBits is the base two + logarithm of the window size, in the range 8..15. window is a caller + supplied buffer of that size. Except for special applications where it is + assured that deflate was used with small window sizes, windowBits must be 15 + and a 32K byte window must be supplied to be able to decompress general + deflate streams. + + See inflateBack() for the usage of these routines. + + inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of + the parameters are invalid, Z_MEM_ERROR if the internal state could not be + allocated, or Z_VERSION_ERROR if the version of the library does not match + the version of the header file. +*/ + +typedef unsigned (*in_func) OF((void FAR *, + z_const unsigned char FAR * FAR *)); +typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); + +ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, + in_func in, void FAR *in_desc, + out_func out, void FAR *out_desc)); +/* + inflateBack() does a raw inflate with a single call using a call-back + interface for input and output. This is potentially more efficient than + inflate() for file i/o applications, in that it avoids copying between the + output and the sliding window by simply making the window itself the output + buffer. inflate() can be faster on modern CPUs when used with large + buffers. inflateBack() trusts the application to not change the output + buffer passed by the output function, at least until inflateBack() returns. + + inflateBackInit() must be called first to allocate the internal state + and to initialize the state with the user-provided window buffer. + inflateBack() may then be used multiple times to inflate a complete, raw + deflate stream with each call. inflateBackEnd() is then called to free the + allocated state. + + A raw deflate stream is one with no zlib or gzip header or trailer. + This routine would normally be used in a utility that reads zip or gzip + files and writes out uncompressed files. The utility would decode the + header and process the trailer on its own, hence this routine expects only + the raw deflate stream to decompress. This is different from the default + behavior of inflate(), which expects a zlib header and trailer around the + deflate stream. + + inflateBack() uses two subroutines supplied by the caller that are then + called by inflateBack() for input and output. inflateBack() calls those + routines until it reads a complete deflate stream and writes out all of the + uncompressed data, or until it encounters an error. The function's + parameters and return types are defined above in the in_func and out_func + typedefs. inflateBack() will call in(in_desc, &buf) which should return the + number of bytes of provided input, and a pointer to that input in buf. If + there is no input available, in() must return zero -- buf is ignored in that + case -- and inflateBack() will return a buffer error. inflateBack() will + call out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. + out() should return zero on success, or non-zero on failure. If out() + returns non-zero, inflateBack() will return with an error. Neither in() nor + out() are permitted to change the contents of the window provided to + inflateBackInit(), which is also the buffer that out() uses to write from. + The length written by out() will be at most the window size. Any non-zero + amount of input may be provided by in(). + + For convenience, inflateBack() can be provided input on the first call by + setting strm->next_in and strm->avail_in. If that input is exhausted, then + in() will be called. Therefore strm->next_in must be initialized before + calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called + immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in + must also be initialized, and then if strm->avail_in is not zero, input will + initially be taken from strm->next_in[0 .. strm->avail_in - 1]. + + The in_desc and out_desc parameters of inflateBack() is passed as the + first parameter of in() and out() respectively when they are called. These + descriptors can be optionally used to pass any information that the caller- + supplied in() and out() functions need to do their job. + + On return, inflateBack() will set strm->next_in and strm->avail_in to + pass back any unused input that was provided by the last in() call. The + return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR + if in() or out() returned an error, Z_DATA_ERROR if there was a format error + in the deflate stream (in which case strm->msg is set to indicate the nature + of the error), or Z_STREAM_ERROR if the stream was not properly initialized. + In the case of Z_BUF_ERROR, an input or output error can be distinguished + using strm->next_in which will be Z_NULL only if in() returned an error. If + strm->next_in is not Z_NULL, then the Z_BUF_ERROR was due to out() returning + non-zero. (in() will always be called before out(), so strm->next_in is + assured to be defined if out() returns non-zero.) Note that inflateBack() + cannot return Z_OK. +*/ + +ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); +/* + All memory allocated by inflateBackInit() is freed. + + inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream + state was inconsistent. +*/ + +ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); +/* Return flags indicating compile-time options. + + Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: + 1.0: size of uInt + 3.2: size of uLong + 5.4: size of voidpf (pointer) + 7.6: size of z_off_t + + Compiler, assembler, and debug options: + 8: ZLIB_DEBUG + 9: ASMV or ASMINF -- use ASM code + 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention + 11: 0 (reserved) + + One-time table building (smaller code, but not thread-safe if true): + 12: BUILDFIXED -- build static block decoding tables when needed + 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed + 14,15: 0 (reserved) + + Library content (indicates missing functionality): + 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking + deflate code when not needed) + 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect + and decode gzip streams (to avoid linking crc code) + 18-19: 0 (reserved) + + Operation variations (changes in library functionality): + 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate + 21: FASTEST -- deflate algorithm with only one, lowest compression level + 22,23: 0 (reserved) + + The sprintf variant used by gzprintf (zero is best): + 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format + 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! + 26: 0 = returns value, 1 = void -- 1 means inferred string length returned + + Remainder: + 27-31: 0 (reserved) + */ + +#ifndef Z_SOLO + + /* utility functions */ + +/* + The following utility functions are implemented on top of the basic + stream-oriented functions. To simplify the interface, some default options + are assumed (compression level and memory usage, standard memory allocation + functions). The source code of these utility functions can be modified if + you need special options. +*/ + +ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Compresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total size + of the destination buffer, which must be at least the value returned by + compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed data. compress() is equivalent to compress2() with a level + parameter of Z_DEFAULT_COMPRESSION. + + compress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer. +*/ + +ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen, + int level)); +/* + Compresses the source buffer into the destination buffer. The level + parameter has the same meaning as in deflateInit. sourceLen is the byte + length of the source buffer. Upon entry, destLen is the total size of the + destination buffer, which must be at least the value returned by + compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed data. + + compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, + Z_STREAM_ERROR if the level parameter is invalid. +*/ + +ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); +/* + compressBound() returns an upper bound on the compressed size after + compress() or compress2() on sourceLen bytes. It would be used before a + compress() or compress2() call to allocate the destination buffer. +*/ + +ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Decompresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total size + of the destination buffer, which must be large enough to hold the entire + uncompressed data. (The size of the uncompressed data must have been saved + previously by the compressor and transmitted to the decompressor by some + mechanism outside the scope of this compression library.) Upon exit, destLen + is the actual size of the uncompressed data. + + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. In + the case where there is not enough room, uncompress() will fill the output + buffer with the uncompressed data up to that point. +*/ + +ZEXTERN int ZEXPORT uncompress2 OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong *sourceLen)); +/* + Same as uncompress, except that sourceLen is a pointer, where the + length of the source is *sourceLen. On return, *sourceLen is the number of + source bytes consumed. +*/ + + /* gzip file access functions */ + +/* + This library supports reading and writing files in gzip (.gz) format with + an interface similar to that of stdio, using the functions that start with + "gz". The gzip format is different from the zlib format. gzip is a gzip + wrapper, documented in RFC 1952, wrapped around a deflate stream. +*/ + +typedef struct gzFile_s *gzFile; /* semi-opaque gzip file descriptor */ + +/* +ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); + + Opens a gzip (.gz) file for reading or writing. The mode parameter is as + in fopen ("rb" or "wb") but can also include a compression level ("wb9") or + a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only + compression as in "wb1h", 'R' for run-length encoding as in "wb1R", or 'F' + for fixed code compression as in "wb9F". (See the description of + deflateInit2 for more information about the strategy parameter.) 'T' will + request transparent writing or appending with no compression and not using + the gzip format. + + "a" can be used instead of "w" to request that the gzip stream that will + be written be appended to the file. "+" will result in an error, since + reading and writing to the same gzip file is not supported. The addition of + "x" when writing will create the file exclusively, which fails if the file + already exists. On systems that support it, the addition of "e" when + reading or writing will set the flag to close the file on an execve() call. + + These functions, as well as gzip, will read and decode a sequence of gzip + streams in a file. The append function of gzopen() can be used to create + such a file. (Also see gzflush() for another way to do this.) When + appending, gzopen does not test whether the file begins with a gzip stream, + nor does it look for the end of the gzip streams to begin appending. gzopen + will simply append a gzip stream to the existing file. + + gzopen can be used to read a file which is not in gzip format; in this + case gzread will directly read from the file without decompression. When + reading, this will be detected automatically by looking for the magic two- + byte gzip header. + + gzopen returns NULL if the file could not be opened, if there was + insufficient memory to allocate the gzFile state, or if an invalid mode was + specified (an 'r', 'w', or 'a' was not provided, or '+' was provided). + errno can be checked to determine if the reason gzopen failed was that the + file could not be opened. +*/ + +ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); +/* + gzdopen associates a gzFile with the file descriptor fd. File descriptors + are obtained from calls like open, dup, creat, pipe or fileno (if the file + has been previously opened with fopen). The mode parameter is as in gzopen. + + The next call of gzclose on the returned gzFile will also close the file + descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor + fd. If you want to keep fd open, use fd = dup(fd_keep); gz = gzdopen(fd, + mode);. The duplicated descriptor should be saved to avoid a leak, since + gzdopen does not close fd if it fails. If you are using fileno() to get the + file descriptor from a FILE *, then you will have to use dup() to avoid + double-close()ing the file descriptor. Both gzclose() and fclose() will + close the associated file descriptor, so they need to have different file + descriptors. + + gzdopen returns NULL if there was insufficient memory to allocate the + gzFile state, if an invalid mode was specified (an 'r', 'w', or 'a' was not + provided, or '+' was provided), or if fd is -1. The file descriptor is not + used until the next gz* read, write, seek, or close operation, so gzdopen + will not detect if fd is invalid (unless fd is -1). +*/ + +ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); +/* + Set the internal buffer size used by this library's functions. The + default buffer size is 8192 bytes. This function must be called after + gzopen() or gzdopen(), and before any other calls that read or write the + file. The buffer memory allocation is always deferred to the first read or + write. Three times that size in buffer space is allocated. A larger buffer + size of, for example, 64K or 128K bytes will noticeably increase the speed + of decompression (reading). + + The new buffer size also affects the maximum length for gzprintf(). + + gzbuffer() returns 0 on success, or -1 on failure, such as being called + too late. +*/ + +ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); +/* + Dynamically update the compression level or strategy. See the description + of deflateInit2 for the meaning of these parameters. Previously provided + data is flushed before the parameter change. + + gzsetparams returns Z_OK if success, Z_STREAM_ERROR if the file was not + opened for writing, Z_ERRNO if there is an error writing the flushed data, + or Z_MEM_ERROR if there is a memory allocation error. +*/ + +ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); +/* + Reads the given number of uncompressed bytes from the compressed file. If + the input file is not in gzip format, gzread copies the given number of + bytes into the buffer directly from the file. + + After reaching the end of a gzip stream in the input, gzread will continue + to read, looking for another gzip stream. Any number of gzip streams may be + concatenated in the input file, and will all be decompressed by gzread(). + If something other than a gzip stream is encountered after a gzip stream, + that remaining trailing garbage is ignored (and no error is returned). + + gzread can be used to read a gzip file that is being concurrently written. + Upon reaching the end of the input, gzread will return with the available + data. If the error code returned by gzerror is Z_OK or Z_BUF_ERROR, then + gzclearerr can be used to clear the end of file indicator in order to permit + gzread to be tried again. Z_OK indicates that a gzip stream was completed + on the last gzread. Z_BUF_ERROR indicates that the input file ended in the + middle of a gzip stream. Note that gzread does not return -1 in the event + of an incomplete gzip stream. This error is deferred until gzclose(), which + will return Z_BUF_ERROR if the last gzread ended in the middle of a gzip + stream. Alternatively, gzerror can be used before gzclose to detect this + case. + + gzread returns the number of uncompressed bytes actually read, less than + len for end of file, or -1 for error. If len is too large to fit in an int, + then nothing is read, -1 is returned, and the error state is set to + Z_STREAM_ERROR. +*/ + +ZEXTERN z_size_t ZEXPORT gzfread OF((voidp buf, z_size_t size, z_size_t nitems, + gzFile file)); +/* + Read up to nitems items of size size from file to buf, otherwise operating + as gzread() does. This duplicates the interface of stdio's fread(), with + size_t request and return types. If the library defines size_t, then + z_size_t is identical to size_t. If not, then z_size_t is an unsigned + integer type that can contain a pointer. + + gzfread() returns the number of full items read of size size, or zero if + the end of the file was reached and a full item could not be read, or if + there was an error. gzerror() must be consulted if zero is returned in + order to determine if there was an error. If the multiplication of size and + nitems overflows, i.e. the product does not fit in a z_size_t, then nothing + is read, zero is returned, and the error state is set to Z_STREAM_ERROR. + + In the event that the end of file is reached and only a partial item is + available at the end, i.e. the remaining uncompressed data length is not a + multiple of size, then the final partial item is nevetheless read into buf + and the end-of-file flag is set. The length of the partial item read is not + provided, but could be inferred from the result of gztell(). This behavior + is the same as the behavior of fread() implementations in common libraries, + but it prevents the direct use of gzfread() to read a concurrently written + file, reseting and retrying on end-of-file, when size is not 1. +*/ + +ZEXTERN int ZEXPORT gzwrite OF((gzFile file, + voidpc buf, unsigned len)); +/* + Writes the given number of uncompressed bytes into the compressed file. + gzwrite returns the number of uncompressed bytes written or 0 in case of + error. +*/ + +ZEXTERN z_size_t ZEXPORT gzfwrite OF((voidpc buf, z_size_t size, + z_size_t nitems, gzFile file)); +/* + gzfwrite() writes nitems items of size size from buf to file, duplicating + the interface of stdio's fwrite(), with size_t request and return types. If + the library defines size_t, then z_size_t is identical to size_t. If not, + then z_size_t is an unsigned integer type that can contain a pointer. + + gzfwrite() returns the number of full items written of size size, or zero + if there was an error. If the multiplication of size and nitems overflows, + i.e. the product does not fit in a z_size_t, then nothing is written, zero + is returned, and the error state is set to Z_STREAM_ERROR. +*/ + +ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...)); +/* + Converts, formats, and writes the arguments to the compressed file under + control of the format string, as in fprintf. gzprintf returns the number of + uncompressed bytes actually written, or a negative zlib error code in case + of error. The number of uncompressed bytes written is limited to 8191, or + one less than the buffer size given to gzbuffer(). The caller should assure + that this limit is not exceeded. If it is exceeded, then gzprintf() will + return an error (0) with nothing written. In this case, there may also be a + buffer overflow with unpredictable consequences, which is possible only if + zlib was compiled with the insecure functions sprintf() or vsprintf() + because the secure snprintf() or vsnprintf() functions were not available. + This can be determined using zlibCompileFlags(). +*/ + +ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); +/* + Writes the given null-terminated string to the compressed file, excluding + the terminating null character. + + gzputs returns the number of characters written, or -1 in case of error. +*/ + +ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); +/* + Reads bytes from the compressed file until len-1 characters are read, or a + newline character is read and transferred to buf, or an end-of-file + condition is encountered. If any characters are read or if len == 1, the + string is terminated with a null character. If no characters are read due + to an end-of-file or len < 1, then the buffer is left untouched. + + gzgets returns buf which is a null-terminated string, or it returns NULL + for end-of-file or in case of error. If there was an error, the contents at + buf are indeterminate. +*/ + +ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); +/* + Writes c, converted to an unsigned char, into the compressed file. gzputc + returns the value that was written, or -1 in case of error. +*/ + +ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); +/* + Reads one byte from the compressed file. gzgetc returns this byte or -1 + in case of end of file or error. This is implemented as a macro for speed. + As such, it does not do all of the checking the other functions do. I.e. + it does not check to see if file is NULL, nor whether the structure file + points to has been clobbered or not. +*/ + +ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); +/* + Push one character back onto the stream to be read as the first character + on the next read. At least one character of push-back is allowed. + gzungetc() returns the character pushed, or -1 on failure. gzungetc() will + fail if c is -1, and may fail if a character has been pushed but not read + yet. If gzungetc is used immediately after gzopen or gzdopen, at least the + output buffer size of pushed characters is allowed. (See gzbuffer above.) + The pushed character will be discarded if the stream is repositioned with + gzseek() or gzrewind(). +*/ + +ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); +/* + Flushes all pending output into the compressed file. The parameter flush + is as in the deflate() function. The return value is the zlib error number + (see function gzerror below). gzflush is only permitted when writing. + + If the flush parameter is Z_FINISH, the remaining data is written and the + gzip stream is completed in the output. If gzwrite() is called again, a new + gzip stream will be started in the output. gzread() is able to read such + concatenated gzip streams. + + gzflush should be called only when strictly necessary because it will + degrade compression if called too often. +*/ + +/* +ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, + z_off_t offset, int whence)); + + Sets the starting position for the next gzread or gzwrite on the given + compressed file. The offset represents a number of bytes in the + uncompressed data stream. The whence parameter is defined as in lseek(2); + the value SEEK_END is not supported. + + If the file is opened for reading, this function is emulated but can be + extremely slow. If the file is opened for writing, only forward seeks are + supported; gzseek then compresses a sequence of zeroes up to the new + starting position. + + gzseek returns the resulting offset location as measured in bytes from + the beginning of the uncompressed stream, or -1 in case of error, in + particular if the file is opened for writing and the new starting position + would be before the current position. +*/ + +ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); +/* + Rewinds the given file. This function is supported only for reading. + + gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) +*/ + +/* +ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); + + Returns the starting position for the next gzread or gzwrite on the given + compressed file. This position represents a number of bytes in the + uncompressed data stream, and is zero when starting, even if appending or + reading a gzip stream from the middle of a file using gzdopen(). + + gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) +*/ + +/* +ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file)); + + Returns the current offset in the file being read or written. This offset + includes the count of bytes that precede the gzip stream, for example when + appending or when using gzdopen() for reading. When reading, the offset + does not include as yet unused buffered input. This information can be used + for a progress indicator. On error, gzoffset() returns -1. +*/ + +ZEXTERN int ZEXPORT gzeof OF((gzFile file)); +/* + Returns true (1) if the end-of-file indicator has been set while reading, + false (0) otherwise. Note that the end-of-file indicator is set only if the + read tried to go past the end of the input, but came up short. Therefore, + just like feof(), gzeof() may return false even if there is no more data to + read, in the event that the last read request was for the exact number of + bytes remaining in the input file. This will happen if the input file size + is an exact multiple of the buffer size. + + If gzeof() returns true, then the read functions will return no more data, + unless the end-of-file indicator is reset by gzclearerr() and the input file + has grown since the previous end of file was detected. +*/ + +ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); +/* + Returns true (1) if file is being copied directly while reading, or false + (0) if file is a gzip stream being decompressed. + + If the input file is empty, gzdirect() will return true, since the input + does not contain a gzip stream. + + If gzdirect() is used immediately after gzopen() or gzdopen() it will + cause buffers to be allocated to allow reading the file to determine if it + is a gzip file. Therefore if gzbuffer() is used, it should be called before + gzdirect(). + + When writing, gzdirect() returns true (1) if transparent writing was + requested ("wT" for the gzopen() mode), or false (0) otherwise. (Note: + gzdirect() is not needed when writing. Transparent writing must be + explicitly requested, so the application already knows the answer. When + linking statically, using gzdirect() will include all of the zlib code for + gzip file reading and decompression, which may not be desired.) +*/ + +ZEXTERN int ZEXPORT gzclose OF((gzFile file)); +/* + Flushes all pending output if necessary, closes the compressed file and + deallocates the (de)compression state. Note that once file is closed, you + cannot call gzerror with file, since its structures have been deallocated. + gzclose must not be called more than once on the same file, just as free + must not be called more than once on the same allocation. + + gzclose will return Z_STREAM_ERROR if file is not valid, Z_ERRNO on a + file operation error, Z_MEM_ERROR if out of memory, Z_BUF_ERROR if the + last read ended in the middle of a gzip stream, or Z_OK on success. +*/ + +ZEXTERN int ZEXPORT gzclose_r OF((gzFile file)); +ZEXTERN int ZEXPORT gzclose_w OF((gzFile file)); +/* + Same as gzclose(), but gzclose_r() is only for use when reading, and + gzclose_w() is only for use when writing or appending. The advantage to + using these instead of gzclose() is that they avoid linking in zlib + compression or decompression code that is not used when only reading or only + writing respectively. If gzclose() is used, then both compression and + decompression code will be included the application when linking to a static + zlib library. +*/ + +ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); +/* + Returns the error message for the last error which occurred on the given + compressed file. errnum is set to zlib error number. If an error occurred + in the file system and not in the compression library, errnum is set to + Z_ERRNO and the application may consult errno to get the exact error code. + + The application must not modify the returned string. Future calls to + this function may invalidate the previously returned string. If file is + closed, then the string previously returned by gzerror will no longer be + available. + + gzerror() should be used to distinguish errors from end-of-file for those + functions above that do not distinguish those cases in their return values. +*/ + +ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); +/* + Clears the error and end-of-file flags for file. This is analogous to the + clearerr() function in stdio. This is useful for continuing to read a gzip + file that is being written concurrently. +*/ + +#endif /* !Z_SOLO */ + + /* checksum functions */ + +/* + These functions are not related to compression but are exported + anyway because they might be useful in applications using the compression + library. +*/ + +ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); +/* + Update a running Adler-32 checksum with the bytes buf[0..len-1] and + return the updated checksum. If buf is Z_NULL, this function returns the + required initial value for the checksum. + + An Adler-32 checksum is almost as reliable as a CRC-32 but can be computed + much faster. + + Usage example: + + uLong adler = adler32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + adler = adler32(adler, buffer, length); + } + if (adler != original_adler) error(); +*/ + +ZEXTERN uLong ZEXPORT adler32_z OF((uLong adler, const Bytef *buf, + z_size_t len)); +/* + Same as adler32(), but with a size_t length. +*/ + +/* +ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, + z_off_t len2)); + + Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 + and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for + each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of + seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. Note + that the z_off_t type (like off_t) is a signed integer. If len2 is + negative, the result has no meaning or utility. +*/ + +ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); +/* + Update a running CRC-32 with the bytes buf[0..len-1] and return the + updated CRC-32. If buf is Z_NULL, this function returns the required + initial value for the crc. Pre- and post-conditioning (one's complement) is + performed within this function so it shouldn't be done by the application. + + Usage example: + + uLong crc = crc32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + crc = crc32(crc, buffer, length); + } + if (crc != original_crc) error(); +*/ + +ZEXTERN uLong ZEXPORT crc32_z OF((uLong adler, const Bytef *buf, + z_size_t len)); +/* + Same as crc32(), but with a size_t length. +*/ + +/* +ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); + + Combine two CRC-32 check values into one. For two sequences of bytes, + seq1 and seq2 with lengths len1 and len2, CRC-32 check values were + calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 + check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and + len2. +*/ + + + /* various hacks, don't look :) */ + +/* deflateInit and inflateInit are macros to allow checking the zlib version + * and the compiler's view of z_stream: + */ +ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, + int windowBits, int memLevel, + int strategy, const char *version, + int stream_size)); +ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, + unsigned char FAR *window, + const char *version, + int stream_size)); +#ifdef Z_PREFIX_SET +# define z_deflateInit(strm, level) \ + deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream)) +# define z_inflateInit(strm) \ + inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream)) +# define z_deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ + deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ + (strategy), ZLIB_VERSION, (int)sizeof(z_stream)) +# define z_inflateInit2(strm, windowBits) \ + inflateInit2_((strm), (windowBits), ZLIB_VERSION, \ + (int)sizeof(z_stream)) +# define z_inflateBackInit(strm, windowBits, window) \ + inflateBackInit_((strm), (windowBits), (window), \ + ZLIB_VERSION, (int)sizeof(z_stream)) +#else +# define deflateInit(strm, level) \ + deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream)) +# define inflateInit(strm) \ + inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream)) +# define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ + deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ + (strategy), ZLIB_VERSION, (int)sizeof(z_stream)) +# define inflateInit2(strm, windowBits) \ + inflateInit2_((strm), (windowBits), ZLIB_VERSION, \ + (int)sizeof(z_stream)) +# define inflateBackInit(strm, windowBits, window) \ + inflateBackInit_((strm), (windowBits), (window), \ + ZLIB_VERSION, (int)sizeof(z_stream)) +#endif + +#ifndef Z_SOLO + +/* gzgetc() macro and its supporting function and exposed data structure. Note + * that the real internal state is much larger than the exposed structure. + * This abbreviated structure exposes just enough for the gzgetc() macro. The + * user should not mess with these exposed elements, since their names or + * behavior could change in the future, perhaps even capriciously. They can + * only be used by the gzgetc() macro. You have been warned. + */ +struct gzFile_s { + unsigned have; + unsigned char *next; + z_off64_t pos; +}; +ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ +#ifdef Z_PREFIX_SET +# undef z_gzgetc +# define z_gzgetc(g) \ + ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : (gzgetc)(g)) +#else +# define gzgetc(g) \ + ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : (gzgetc)(g)) +#endif + +/* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or + * change the regular functions to 64 bits if _FILE_OFFSET_BITS is 64 (if + * both are true, the application gets the *64 functions, and the regular + * functions are changed to 64 bits) -- in case these are set on systems + * without large file support, _LFS64_LARGEFILE must also be true + */ +#ifdef Z_LARGE64 + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); + ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t)); +#endif + +#if !defined(ZLIB_INTERNAL) && defined(Z_WANT64) +# ifdef Z_PREFIX_SET +# define z_gzopen z_gzopen64 +# define z_gzseek z_gzseek64 +# define z_gztell z_gztell64 +# define z_gzoffset z_gzoffset64 +# define z_adler32_combine z_adler32_combine64 +# define z_crc32_combine z_crc32_combine64 +# else +# define gzopen gzopen64 +# define gzseek gzseek64 +# define gztell gztell64 +# define gzoffset gzoffset64 +# define adler32_combine adler32_combine64 +# define crc32_combine crc32_combine64 +# endif +# ifndef Z_LARGE64 + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN z_off_t ZEXPORT gzseek64 OF((gzFile, z_off_t, int)); + ZEXTERN z_off_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN z_off_t ZEXPORT gzoffset64 OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); +# endif +#else + ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *)); + ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int)); + ZEXTERN z_off_t ZEXPORT gztell OF((gzFile)); + ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); +#endif + +#else /* Z_SOLO */ + + ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); + +#endif /* !Z_SOLO */ + +/* undocumented functions */ +ZEXTERN const char * ZEXPORT zError OF((int)); +ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp)); +ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table OF((void)); +ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int)); +ZEXTERN int ZEXPORT inflateValidate OF((z_streamp, int)); +ZEXTERN unsigned long ZEXPORT inflateCodesUsed OF ((z_streamp)); +ZEXTERN int ZEXPORT inflateResetKeep OF((z_streamp)); +ZEXTERN int ZEXPORT deflateResetKeep OF((z_streamp)); +#if (defined(_WIN32) || defined(__CYGWIN__)) && !defined(Z_SOLO) +ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path, + const char *mode)); +#endif +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifndef Z_SOLO +ZEXTERN int ZEXPORTVA gzvprintf Z_ARG((gzFile file, + const char *format, + va_list va)); +# endif +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* ZLIB_H */ diff --git a/hdssd/external/solaris/zlib-1.2.11/zutil.h b/hdssd/external/solaris/zlib-1.2.11/zutil.h new file mode 100644 index 0000000..b079ea6 --- /dev/null +++ b/hdssd/external/solaris/zlib-1.2.11/zutil.h @@ -0,0 +1,271 @@ +/* zutil.h -- internal interface and configuration of the compression library + * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* @(#) $Id$ */ + +#ifndef ZUTIL_H +#define ZUTIL_H + +#ifdef HAVE_HIDDEN +# define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) +#else +# define ZLIB_INTERNAL +#endif + +#include "zlib.h" + +#if defined(STDC) && !defined(Z_SOLO) +# if !(defined(_WIN32_WCE) && defined(_MSC_VER)) +# include +# endif +# include +# include +#endif + +#ifdef Z_SOLO + typedef long ptrdiff_t; /* guess -- will be caught if guess is wrong */ +#endif + +#ifndef local +# define local static +#endif +/* since "static" is used to mean two completely different things in C, we + define "local" for the non-static meaning of "static", for readability + (compile with -Dlocal if your debugger can't find static symbols) */ + +typedef unsigned char uch; +typedef uch FAR uchf; +typedef unsigned short ush; +typedef ush FAR ushf; +typedef unsigned long ulg; + +extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ +/* (size given to avoid silly warnings with Visual C++) */ + +#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] + +#define ERR_RETURN(strm,err) \ + return (strm->msg = ERR_MSG(err), (err)) +/* To be used only when the state is known to be valid */ + + /* common constants */ + +#ifndef DEF_WBITS +# define DEF_WBITS MAX_WBITS +#endif +/* default windowBits for decompression. MAX_WBITS is for compression only */ + +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif +/* default memLevel */ + +#define STORED_BLOCK 0 +#define STATIC_TREES 1 +#define DYN_TREES 2 +/* The three kinds of block type */ + +#define MIN_MATCH 3 +#define MAX_MATCH 258 +/* The minimum and maximum match lengths */ + +#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ + + /* target dependencies */ + +#if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) +# define OS_CODE 0x00 +# ifndef Z_SOLO +# if defined(__TURBOC__) || defined(__BORLANDC__) +# if (__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) + /* Allow compilation with ANSI keywords only enabled */ + void _Cdecl farfree( void *block ); + void *_Cdecl farmalloc( unsigned long nbytes ); +# else +# include +# endif +# else /* MSC or DJGPP */ +# include +# endif +# endif +#endif + +#ifdef AMIGA +# define OS_CODE 1 +#endif + +#if defined(VAXC) || defined(VMS) +# define OS_CODE 2 +# define F_OPEN(name, mode) \ + fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") +#endif + +#ifdef __370__ +# if __TARGET_LIB__ < 0x20000000 +# define OS_CODE 4 +# elif __TARGET_LIB__ < 0x40000000 +# define OS_CODE 11 +# else +# define OS_CODE 8 +# endif +#endif + +#if defined(ATARI) || defined(atarist) +# define OS_CODE 5 +#endif + +#ifdef OS2 +# define OS_CODE 6 +# if defined(M_I86) && !defined(Z_SOLO) +# include +# endif +#endif + +#if defined(MACOS) || defined(TARGET_OS_MAC) +# define OS_CODE 7 +# ifndef Z_SOLO +# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os +# include /* for fdopen */ +# else +# ifndef fdopen +# define fdopen(fd,mode) NULL /* No fdopen() */ +# endif +# endif +# endif +#endif + +#ifdef __acorn +# define OS_CODE 13 +#endif + +#if defined(WIN32) && !defined(__CYGWIN__) +# define OS_CODE 10 +#endif + +#ifdef _BEOS_ +# define OS_CODE 16 +#endif + +#ifdef __TOS_OS400__ +# define OS_CODE 18 +#endif + +#ifdef __APPLE__ +# define OS_CODE 19 +#endif + +#if defined(_BEOS_) || defined(RISCOS) +# define fdopen(fd,mode) NULL /* No fdopen() */ +#endif + +#if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX +# if defined(_WIN32_WCE) +# define fdopen(fd,mode) NULL /* No fdopen() */ +# ifndef _PTRDIFF_T_DEFINED + typedef int ptrdiff_t; +# define _PTRDIFF_T_DEFINED +# endif +# else +# define fdopen(fd,type) _fdopen(fd,type) +# endif +#endif + +#if defined(__BORLANDC__) && !defined(MSDOS) + #pragma warn -8004 + #pragma warn -8008 + #pragma warn -8066 +#endif + +/* provide prototypes for these when building zlib without LFS */ +#if !defined(_WIN32) && \ + (!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0) + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); +#endif + + /* common defaults */ + +#ifndef OS_CODE +# define OS_CODE 3 /* assume Unix */ +#endif + +#ifndef F_OPEN +# define F_OPEN(name, mode) fopen((name), (mode)) +#endif + + /* functions */ + +#if defined(pyr) || defined(Z_SOLO) +# define NO_MEMCPY +#endif +#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) + /* Use our own functions for small and medium model with MSC <= 5.0. + * You may have to use the same strategy for Borland C (untested). + * The __SC__ check is for Symantec. + */ +# define NO_MEMCPY +#endif +#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY) +# define HAVE_MEMCPY +#endif +#ifdef HAVE_MEMCPY +# ifdef SMALL_MEDIUM /* MSDOS small or medium model */ +# define zmemcpy _fmemcpy +# define zmemcmp _fmemcmp +# define zmemzero(dest, len) _fmemset(dest, 0, len) +# else +# define zmemcpy memcpy +# define zmemcmp memcmp +# define zmemzero(dest, len) memset(dest, 0, len) +# endif +#else + void ZLIB_INTERNAL zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); + int ZLIB_INTERNAL zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); + void ZLIB_INTERNAL zmemzero OF((Bytef* dest, uInt len)); +#endif + +/* Diagnostic functions */ +#ifdef ZLIB_DEBUG +# include + extern int ZLIB_INTERNAL z_verbose; + extern void ZLIB_INTERNAL z_error OF((char *m)); +# define Assert(cond,msg) {if(!(cond)) z_error(msg);} +# define Trace(x) {if (z_verbose>=0) fprintf x ;} +# define Tracev(x) {if (z_verbose>0) fprintf x ;} +# define Tracevv(x) {if (z_verbose>1) fprintf x ;} +# define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;} +# define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;} +#else +# define Assert(cond,msg) +# define Trace(x) +# define Tracev(x) +# define Tracevv(x) +# define Tracec(c,x) +# define Tracecv(c,x) +#endif + +#ifndef Z_SOLO + voidpf ZLIB_INTERNAL zcalloc OF((voidpf opaque, unsigned items, + unsigned size)); + void ZLIB_INTERNAL zcfree OF((voidpf opaque, voidpf ptr)); +#endif + +#define ZALLOC(strm, items, size) \ + (*((strm)->zalloc))((strm)->opaque, (items), (size)) +#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) +#define TRY_FREE(s, p) {if (p) ZFREE(s, p);} + +/* Reverse the bytes in a 32-bit value */ +#define ZSWAP32(q) ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ + (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) + +#endif /* ZUTIL_H */ diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/atomic/gcc_builtins.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/atomic/gcc_builtins.h new file mode 100644 index 0000000..4600a0e --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/atomic/gcc_builtins.h @@ -0,0 +1,38 @@ +/* Copyright (C) 2008 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#define MY_ATOMIC_MODE "atomic_builtins" + +#define make_atomic_add_body(S) \ + v= __sync_fetch_and_add(a, v); +#define make_atomic_swap_body(S) \ + v= __sync_lock_test_and_set(a, v); +#define make_atomic_cas_body(S) \ + int ## S sav; \ + sav= __sync_val_compare_and_swap(a, *cmp, set); \ + if (!(ret= (sav == *cmp))) *cmp= sav; + +#ifdef MY_ATOMIC_MODE_DUMMY +#define make_atomic_load_body(S) ret= *a +#define make_atomic_store_body(S) *a= v +#define MY_ATOMIC_MODE "gcc-builtins-up" + +#else +#define MY_ATOMIC_MODE "gcc-builtins-smp" +#define make_atomic_load_body(S) \ + ret= __sync_fetch_and_or(a, 0); +#define make_atomic_store_body(S) \ + (void) __sync_lock_test_and_set(a, v); +#endif diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/atomic/generic-msvc.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/atomic/generic-msvc.h new file mode 100644 index 0000000..a8601e9 --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/atomic/generic-msvc.h @@ -0,0 +1,115 @@ +/* Copyright (C) 2006-2008 MySQL AB, 2008-2009 Sun Microsystems, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef _atomic_h_cleanup_ +#define _atomic_h_cleanup_ "atomic/generic-msvc.h" + +/* + We don't implement anything specific for MY_ATOMIC_MODE_DUMMY, always use + intrinsics. + 8 and 16-bit atomics are not implemented, but it can be done if necessary. +*/ + +/* + x86 compilers (both VS2003 or VS2005) never use instrinsics, but generate + function calls to kernel32 instead, even in the optimized build. + We force intrinsics as described in MSDN documentation for + _InterlockedCompareExchange. +*/ +#ifdef _M_IX86 + +#if (_MSC_VER >= 1500) +#include +#else +C_MODE_START +/*Visual Studio 2003 and earlier do not have prototypes for atomic intrinsics*/ +LONG _InterlockedExchange (LONG volatile *Target,LONG Value); +LONG _InterlockedCompareExchange (LONG volatile *Target, LONG Value, LONG Comp); +LONG _InterlockedExchangeAdd (LONG volatile *Addend, LONG Value); +C_MODE_END + +#pragma intrinsic(_InterlockedExchangeAdd) +#pragma intrinsic(_InterlockedCompareExchange) +#pragma intrinsic(_InterlockedExchange) +#endif + +#define InterlockedExchange _InterlockedExchange +#define InterlockedExchangeAdd _InterlockedExchangeAdd +#define InterlockedCompareExchange _InterlockedCompareExchange +/* + No need to do something special for InterlockedCompareExchangePointer + as it is a #define to InterlockedCompareExchange. The same applies to + InterlockedExchangePointer. +*/ +#endif /*_M_IX86*/ + +#define MY_ATOMIC_MODE "msvc-intrinsics" +#define IL_EXCHG_ADD32(X,Y) InterlockedExchangeAdd((volatile LONG *)(X),(Y)) +#define IL_COMP_EXCHG32(X,Y,Z) InterlockedCompareExchange((volatile LONG *)(X),(Y),(Z)) +#define IL_COMP_EXCHGptr InterlockedCompareExchangePointer +#define IL_EXCHG32(X,Y) InterlockedExchange((volatile LONG *)(X),(Y)) +#define IL_EXCHGptr InterlockedExchangePointer +#define make_atomic_add_body(S) \ + v= IL_EXCHG_ADD ## S (a, v) +#define make_atomic_cas_body(S) \ + int ## S initial_cmp= *cmp; \ + int ## S initial_a= IL_COMP_EXCHG ## S (a, set, initial_cmp); \ + if (!(ret= (initial_a == initial_cmp))) *cmp= initial_a; +#define make_atomic_swap_body(S) \ + v= IL_EXCHG ## S (a, v) +#define make_atomic_load_body(S) \ + ret= 0; /* avoid compiler warning */ \ + ret= IL_COMP_EXCHG ## S (a, ret, ret); + +/* + my_yield_processor (equivalent of x86 PAUSE instruction) should be used + to improve performance on hyperthreaded CPUs. Intel recommends to use it in + spin loops also on non-HT machines to reduce power consumption (see e.g + http://softwarecommunity.intel.com/articles/eng/2004.htm) + + Running benchmarks for spinlocks implemented with InterlockedCompareExchange + and YieldProcessor shows that much better performance is achieved by calling + YieldProcessor in a loop - that is, yielding longer. On Intel boxes setting + loop count in the range 200-300 brought best results. + */ +#ifndef YIELD_LOOPS +#define YIELD_LOOPS 200 +#endif + +static __inline int my_yield_processor() +{ + int i; + for(i=0; irw) +#define my_atomic_rwlock_init(name) pthread_mutex_init(& (name)->rw, 0) +#define my_atomic_rwlock_rdlock(name) pthread_mutex_lock(& (name)->rw) +#define my_atomic_rwlock_wrlock(name) pthread_mutex_lock(& (name)->rw) +#define my_atomic_rwlock_rdunlock(name) pthread_mutex_unlock(& (name)->rw) +#define my_atomic_rwlock_wrunlock(name) pthread_mutex_unlock(& (name)->rw) +#define MY_ATOMIC_MODE "mutex" +#ifndef MY_ATOMIC_MODE_RWLOCKS +#define MY_ATOMIC_MODE_RWLOCKS 1 +#endif +#endif + +#define make_atomic_add_body(S) int ## S sav; sav= *a; *a+= v; v=sav; +#define make_atomic_fas_body(S) int ## S sav; sav= *a; *a= v; v=sav; +#define make_atomic_cas_body(S) if ((ret= (*a == *cmp))) *a= set; else *cmp=*a; +#define make_atomic_load_body(S) ret= *a; +#define make_atomic_store_body(S) *a= v; + diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/atomic/x86-gcc.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/atomic/x86-gcc.h new file mode 100644 index 0000000..5a34bc2 --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/atomic/x86-gcc.h @@ -0,0 +1,69 @@ +/* Copyright (C) 2006 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* + XXX 64-bit atomic operations can be implemented using + cmpxchg8b, if necessary. Though I've heard that not all 64-bit + architectures support double-word (128-bit) cas. +*/ + +#ifdef __x86_64__ +# ifdef MY_ATOMIC_NO_XADD +# define MY_ATOMIC_MODE "gcc-amd64" LOCK_prefix "-no-xadd" +# else +# define MY_ATOMIC_MODE "gcc-amd64" LOCK_prefix +# endif +#else +# ifdef MY_ATOMIC_NO_XADD +# define MY_ATOMIC_MODE "gcc-x86" LOCK_prefix "-no-xadd" +# else +# define MY_ATOMIC_MODE "gcc-x86" LOCK_prefix +# endif +#endif + +/* fix -ansi errors while maintaining readability */ +#ifndef asm +#define asm __asm__ +#endif + +#ifndef MY_ATOMIC_NO_XADD +#define make_atomic_add_body(S) \ + asm volatile (LOCK_prefix "; xadd %0, %1;" : "+r" (v) , "+m" (*a)) +#endif +#define make_atomic_fas_body(S) \ + asm volatile ("xchg %0, %1;" : "+r" (v) , "+m" (*a)) +#define make_atomic_cas_body(S) \ + asm volatile (LOCK_prefix "; cmpxchg %3, %0; setz %2;" \ + : "+m" (*a), "+a" (*cmp), "=q" (ret): "r" (set)) + +#ifdef MY_ATOMIC_MODE_DUMMY +#define make_atomic_load_body(S) ret=*a +#define make_atomic_store_body(S) *a=v +#else +/* + Actually 32-bit reads/writes are always atomic on x86 + But we add LOCK_prefix here anyway to force memory barriers +*/ +#define make_atomic_load_body(S) \ + ret=0; \ + asm volatile (LOCK_prefix "; cmpxchg %2, %0" \ + : "+m" (*a), "+a" (ret): "r" (ret)) +#define make_atomic_store_body(S) \ + asm volatile ("; xchg %0, %1;" : "+m" (*a), "+r" (v)) +#endif + +/* TODO test on intel whether the below helps. on AMD it makes no difference */ +//#define LF_BACKOFF ({asm volatile ("rep; nop"); 1; }) + diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/base64.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/base64.h new file mode 100644 index 0000000..155d669 --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/base64.h @@ -0,0 +1,49 @@ +/* Copyright (C) 2003 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __BASE64_H_INCLUDED__ +#define __BASE64_H_INCLUDED__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + Calculate how much memory needed for dst of base64_encode() +*/ +int my_base64_needed_encoded_length(int length_of_data); + +/* + Calculate how much memory needed for dst of base64_decode() +*/ +int my_base64_needed_decoded_length(int length_of_encoded_data); + + +/* + Encode data as a base64 string +*/ +int my_base64_encode(const void *src, size_t src_len, char *dst); + +/* + Decode a base64 string into data +*/ +int my_base64_decode(const char *src, size_t src_len, + void *dst, const char **end_ptr); + + +#ifdef __cplusplus +} +#endif +#endif /* !__BASE64_H_INCLUDED__ */ diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/config-win.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/config-win.h new file mode 100644 index 0000000..9457721 --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/config-win.h @@ -0,0 +1,392 @@ +/* Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* Defines for Win32 to make it compatible for MySQL */ + +#define BIG_TABLES + +/* + Minimal version of Windows we should be able to run on. + Currently Windows 2000 +*/ +#define _WIN32_WINNT 0x0500 + + +#if defined(_MSC_VER) && _MSC_VER >= 1400 +/* Avoid endless warnings about sprintf() etc. being unsafe. */ +#define _CRT_SECURE_NO_DEPRECATE 1 +#endif + +#include +#include /* chmod() constants*/ +#include +#include +#include +#include +#include +#include +#include /* getpid()*/ + +#define HAVE_SMEM 1 + +#if defined(_WIN64) || defined(WIN64) +#define SYSTEM_TYPE "Win64" +#elif defined(_WIN32) || defined(WIN32) +#define SYSTEM_TYPE "Win32" +#else +#define SYSTEM_TYPE "Windows" +#endif + +#if defined(_M_IA64) +#define MACHINE_TYPE "ia64" +#elif defined(_M_IX86) +#define MACHINE_TYPE "ia32" +#elif defined(_M_ALPHA) +#define MACHINE_TYPE "axp" +#else +#define MACHINE_TYPE "unknown" /* Define to machine type name */ +#endif + +#if !(defined(_WIN64) || defined(WIN64)) +#ifndef _WIN32 +#define _WIN32 /* Compatible with old source */ +#endif +#ifndef __WIN32__ +#define __WIN32__ +#endif +#endif /* _WIN64 */ +#ifndef __WIN__ +#define __WIN__ /* To make it easier in VC++ */ +#endif + +#ifndef MAX_INDEXES +#define MAX_INDEXES 64 +#endif + +/* File and lock constants */ +#ifdef __BORLANDC__ +#define F_RDLCK LK_NBLCK /* read lock */ +#define F_WRLCK LK_NBRLCK /* write lock */ +#define F_UNLCK LK_UNLCK /* remove lock(s) */ +#else +#define F_RDLCK _LK_NBLCK /* read lock */ +#define F_WRLCK _LK_NBRLCK /* write lock */ +#define F_UNLCK _LK_UNLCK /* remove lock(s) */ +#endif + +#define F_EXCLUSIVE 1 /* We have only exclusive locking */ +#define F_TO_EOF (INT_MAX32/2) /* size for lock of all file */ +#define F_OK 0 /* parameter to access() */ +#define W_OK 2 + +#define S_IROTH S_IREAD /* for my_lib */ + +/* for MY_S_ISFIFO() macro from my_lib */ +#if defined (_S_IFIFO) && !defined (S_IFIFO) +#define S_IFIFO _S_IFIFO +#endif + +/* Winsock2 constant (Vista SDK and later)*/ +#define IPPROTO_IPV6 41 +#ifndef IPV6_V6ONLY +#define IPV6_V6ONLY 27 +#endif + +/* + Constants used by chmod. Note, that group/others is ignored + - because unsupported by Windows due to different access control model. +*/ +#define S_IRWXU S_IREAD|S_IWRITE +#define S_IRWXG 0 +#define S_IRWXO 0 +typedef int mode_t; + +#ifdef __BORLANDC__ +#define FILE_BINARY O_BINARY /* my_fopen in binary mode */ +#define O_TEMPORARY 0 +#define O_SHORT_LIVED 0 +#define SH_DENYNO _SH_DENYNO +#else +#define O_BINARY _O_BINARY /* compability with older style names */ +#define FILE_BINARY _O_BINARY /* my_fopen in binary mode */ +#define O_TEMPORARY _O_TEMPORARY +#define O_SHORT_LIVED _O_SHORT_LIVED +#define SH_DENYNO _SH_DENYNO +#endif +#define NO_OPEN_3 /* For my_create() */ + +#define SIGQUIT SIGTERM /* No SIGQUIT */ + +#undef _REENTRANT /* Crashes something for win32 */ +#undef SAFE_MUTEX /* Can't be used on windows */ + +#define LONGLONG_MIN 0x8000000000000000LL +#define LONGLONG_MAX 0x7FFFFFFFFFFFFFFFLL +#define ULONGLONG_MAX 0xFFFFFFFFFFFFFFFFULL + +/* Type information */ + +#if !defined(HAVE_UINT) +#undef HAVE_UINT +#define HAVE_UINT +typedef unsigned short ushort; +typedef unsigned int uint; +#endif /* !defined(HAVE_UINT) */ + +typedef unsigned __int64 ulonglong; /* Microsofts 64 bit types */ +typedef __int64 longlong; +#ifndef HAVE_SIGSET_T +typedef int sigset_t; +#endif +#define longlong_defined +/* + off_t should not be __int64 because of conflicts in header files; + Use my_off_t or os_off_t instead +*/ +#ifndef HAVE_OFF_T +typedef long off_t; +#endif +typedef __int64 os_off_t; +#ifdef _WIN64 +typedef UINT_PTR rf_SetTimer; +#else +typedef uint rf_SetTimer; +#endif + +#ifndef HAVE_SIZE_T +#ifndef _SIZE_T_DEFINED +typedef SIZE_T size_t; +#define _SIZE_T_DEFINED +#endif +#endif + +#ifndef HAVE_SSIZE_T +#ifndef _SSIZE_T_DEFINED +typedef SSIZE_T ssize_t; +#define _SSIZE_T_DEFINED +#endif +#endif + +#define Socket_defined +#define my_socket SOCKET +#define SIGPIPE SIGINT +#define RETQSORTTYPE void +#define QSORT_TYPE_IS_VOID +#define SOCKET_SIZE_TYPE int +#define my_socket_defined +#define byte_defined +#define HUGE_PTR +#define STDCALL __stdcall /* Used by libmysql.dll */ +#define isnan(X) _isnan(X) +#define finite(X) _finite(X) + +#ifndef UNDEF_THREAD_HACK +#define THREAD +#endif +#define VOID_SIGHANDLER +#define SIZEOF_CHAR 1 +#define SIZEOF_INT 4 +#define SIZEOF_LONG 4 +#define SIZEOF_LONG_LONG 8 +#define SIZEOF_OFF_T 8 +#ifdef _WIN64 +#define SIZEOF_CHARP 8 +#else +#define SIZEOF_CHARP 4 +#endif +#define HAVE_BROKEN_NETINET_INCLUDES +#ifdef _WIN32 +#define HAVE_NAMED_PIPE /* We can only create pipes on NT */ +#endif + +/* ERROR is defined in wingdi.h */ +#undef ERROR + +/* We need to close files to break connections on shutdown */ +#ifndef SIGNAL_WITH_VIO_CLOSE +#define SIGNAL_WITH_VIO_CLOSE +#endif + +/* All windows servers should support .sym files */ +#undef USE_SYMDIR +#define USE_SYMDIR + +/* If LOAD DATA LOCAL INFILE should be enabled by default */ +#define ENABLED_LOCAL_INFILE 1 + +/* If query profiling should be enabled by default */ +#define ENABLED_PROFILING 1 + +/* Convert some simple functions to Posix */ + +#define my_sigset(A,B) signal((A),(B)) +#define finite(A) _finite(A) +#define sleep(A) Sleep((A)*1000) +#define popen(A,B) _popen((A),(B)) +#define pclose(A) _pclose(A) + +#ifndef __BORLANDC__ +#define access(A,B) _access(A,B) +#endif + +#if !defined(__cplusplus) +#define inline __inline +#endif /* __cplusplus */ + +#ifdef _WIN64 +#define ulonglong2double(A) ((double) (ulonglong) (A)) +#define my_off_t2double(A) ((double) (my_off_t) (A)) + +#else +inline double ulonglong2double(ulonglong value) +{ + longlong nr=(longlong) value; + if (nr >= 0) + return (double) nr; + return (18446744073709551616.0 + (double) nr); +} +#define my_off_t2double(A) ulonglong2double(A) +#endif /* _WIN64 */ + +inline ulonglong double2ulonglong(double d) +{ + double t= d - (double) 0x8000000000000000ULL; + + if (t >= 0) + return ((ulonglong) t) + 0x8000000000000000ULL; + return (ulonglong) d; +} + +#if SIZEOF_OFF_T > 4 +#define lseek(A,B,C) _lseeki64((A),(longlong) (B),(C)) +#define tell(A) _telli64(A) +#endif + +#define STACK_DIRECTION -1 + +/* Difference between GetSystemTimeAsFileTime() and now() */ +#define OFFSET_TO_EPOCH 116444736000000000ULL + +#define HAVE_PERROR +#define HAVE_VFPRINT +#define HAVE_RENAME /* Have rename() as function */ +#define HAVE_BINARY_STREAMS /* Have "b" flag in streams */ +#define HAVE_LONG_JMP /* Have long jump function */ +#define HAVE_LOCKING /* have locking() call */ +#define HAVE_ERRNO_AS_DEFINE /* errno is a define */ +#define HAVE_STDLIB /* everything is include in this file */ +#define HAVE_MEMCPY +#define HAVE_MEMMOVE +#define HAVE_GETCWD +#define HAVE_TELL +#define HAVE_TZNAME +#define HAVE_PUTENV +#define HAVE_SELECT +#define HAVE_SETLOCALE +#define HAVE_SOCKET /* Giangi */ +#define HAVE_FLOAT_H +#define HAVE_LIMITS_H +#define HAVE_STDDEF_H +#define NO_FCNTL_NONBLOCK /* No FCNTL */ +#define HAVE_ALLOCA +#define HAVE_STRPBRK +#define HAVE_STRSTR +#define HAVE_COMPRESS +#define HAVE_CREATESEMAPHORE +#define HAVE_ISNAN +#define HAVE_FINITE +#define HAVE_QUERY_CACHE +#define SPRINTF_RETURNS_INT +#define HAVE_SETFILEPOINTER +#define HAVE_VIO_READ_BUFF +#if defined(_MSC_VER) && _MSC_VER >= 1400 +/* strnlen() appeared in Studio 2005 */ +#define HAVE_STRNLEN +#endif +#define HAVE_WINSOCK2 + +#define strcasecmp stricmp +#define strncasecmp strnicmp + +#ifndef _WIN32 +#undef FILE_SHARE_DELETE +#define FILE_SHARE_DELETE 0 /* Not implemented on Win 98/ME */ +#endif + +#ifdef NOT_USED +#define HAVE_SNPRINTF /* Gave link error */ +#define _snprintf snprintf +#endif + +#ifdef _MSC_VER +#define HAVE_LDIV /* The optimizer breaks in zortech for ldiv */ +#define HAVE_ANSI_INCLUDE +#define HAVE_SYS_UTIME_H +#define HAVE_STRTOUL +#endif +#define my_reinterpret_cast(A) reinterpret_cast +#define my_const_cast(A) const_cast + + +/* MYSQL OPTIONS */ + +#ifdef _CUSTOMCONFIG_ +#include +#else +#define DEFAULT_MYSQL_HOME "c:\\mysql" +#define DATADIR "c:\\mysql\\data" +#define PACKAGE "mysql" +#define DEFAULT_BASEDIR "C:\\" +#define SHAREDIR "share" +#define DEFAULT_CHARSET_HOME "C:/mysql/" +#endif +#ifndef DEFAULT_HOME_ENV +#define DEFAULT_HOME_ENV MYSQL_HOME +#endif +#ifndef DEFAULT_GROUP_SUFFIX_ENV +#define DEFAULT_GROUP_SUFFIX_ENV MYSQL_GROUP_SUFFIX +#endif + +/* File name handling */ + +#define FN_LIBCHAR '\\' +#define FN_ROOTDIR "\\" +#define FN_DEVCHAR ':' +#define FN_NETWORK_DRIVES /* Uses \\ to indicate network drives */ +#define FN_NO_CASE_SENCE /* Files are not case-sensitive */ +#define OS_FILE_LIMIT UINT_MAX /* No limit*/ + +#define DO_NOT_REMOVE_THREAD_WRAPPERS +#define thread_safe_increment(V,L) InterlockedIncrement((long*) &(V)) +#define thread_safe_decrement(V,L) InterlockedDecrement((long*) &(V)) +/* The following is only used for statistics, so it should be good enough */ +#ifdef _WIN32 /* This should also work on Win98 but .. */ +#define thread_safe_add(V,C,L) InterlockedExchangeAdd((long*) &(V),(C)) +#define thread_safe_sub(V,C,L) InterlockedExchangeAdd((long*) &(V),-(long) (C)) +#endif + +#define shared_memory_buffer_length 16000 +#define default_shared_memory_base_name "MYSQL" + +#define HAVE_SPATIAL 1 +#define HAVE_RTREE_KEYS 1 + +#define HAVE_OPENSSL 1 +#define HAVE_YASSL 1 + +#define COMMUNITY_SERVER 1 +#define ENABLED_PROFILING 1 + +#define HAVE_BOOL 1 diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/decimal.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/decimal.h new file mode 100644 index 0000000..530ed9e --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/decimal.h @@ -0,0 +1,107 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef _decimal_h +#define _decimal_h + +typedef enum +{TRUNCATE=0, HALF_EVEN, HALF_UP, CEILING, FLOOR} + decimal_round_mode; +typedef int32 decimal_digit_t; + +typedef struct st_decimal_t { + int intg, frac, len; + my_bool sign; + decimal_digit_t *buf; +} decimal_t; + +int internal_str2dec(const char *from, decimal_t *to, char **end, + my_bool fixed); +int decimal2string(decimal_t *from, char *to, int *to_len, + int fixed_precision, int fixed_decimals, + char filler); +int decimal2ulonglong(decimal_t *from, ulonglong *to); +int ulonglong2decimal(ulonglong from, decimal_t *to); +int decimal2longlong(decimal_t *from, longlong *to); +int longlong2decimal(longlong from, decimal_t *to); +int decimal2double(decimal_t *from, double *to); +int double2decimal(double from, decimal_t *to); +int decimal_actual_fraction(decimal_t *from); +int decimal2bin(decimal_t *from, uchar *to, int precision, int scale); +int bin2decimal(const uchar *from, decimal_t *to, int precision, int scale); + +int decimal_size(int precision, int scale); +int decimal_bin_size(int precision, int scale); +int decimal_result_size(decimal_t *from1, decimal_t *from2, char op, + int param); + +int decimal_intg(decimal_t *from); +int decimal_add(decimal_t *from1, decimal_t *from2, decimal_t *to); +int decimal_sub(decimal_t *from1, decimal_t *from2, decimal_t *to); +int decimal_cmp(decimal_t *from1, decimal_t *from2); +int decimal_mul(decimal_t *from1, decimal_t *from2, decimal_t *to); +int decimal_div(decimal_t *from1, decimal_t *from2, decimal_t *to, + int scale_incr); +int decimal_mod(decimal_t *from1, decimal_t *from2, decimal_t *to); +int decimal_round(decimal_t *from, decimal_t *to, int new_scale, + decimal_round_mode mode); +int decimal_is_zero(decimal_t *from); +void max_decimal(int precision, int frac, decimal_t *to); + +#define string2decimal(A,B,C) internal_str2dec((A), (B), (C), 0) +#define string2decimal_fixed(A,B,C) internal_str2dec((A), (B), (C), 1) + +/* set a decimal_t to zero */ + +#define decimal_make_zero(dec) do { \ + (dec)->buf[0]=0; \ + (dec)->intg=1; \ + (dec)->frac=0; \ + (dec)->sign=0; \ + } while(0) + +/* + returns the length of the buffer to hold string representation + of the decimal (including decimal dot, possible sign and \0) +*/ + +#define decimal_string_size(dec) (((dec)->intg ? (dec)->intg : 1) + \ + (dec)->frac + ((dec)->frac > 0) + 2) + +/* negate a decimal */ +#define decimal_neg(dec) do { (dec)->sign^=1; } while(0) + +/* + conventions: + + decimal_smth() == 0 -- everything's ok + decimal_smth() <= 1 -- result is usable, but precision loss is possible + decimal_smth() <= 2 -- result can be unusable, most significant digits + could've been lost + decimal_smth() > 2 -- no result was generated +*/ + +#define E_DEC_OK 0 +#define E_DEC_TRUNCATED 1 +#define E_DEC_OVERFLOW 2 +#define E_DEC_DIV_ZERO 4 +#define E_DEC_BAD_NUM 8 +#define E_DEC_OOM 16 + +#define E_DEC_ERROR 31 +#define E_DEC_FATAL_ERROR 30 + +#endif + diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/errmsg.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/errmsg.h new file mode 100644 index 0000000..92d70ab --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/errmsg.h @@ -0,0 +1,103 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* Error messages for MySQL clients */ +/* (Error messages for the daemon are in sql/share/errmsg.txt) */ + +#ifdef __cplusplus +extern "C" { +#endif +void init_client_errs(void); +void finish_client_errs(void); +extern const char *client_errors[]; /* Error messages */ +#ifdef __cplusplus +} +#endif + +#define CR_MIN_ERROR 2000 /* For easier client code */ +#define CR_MAX_ERROR 2999 +#if !defined(ER) +#define ER(X) client_errors[(X)-CR_MIN_ERROR] +#endif +#define CLIENT_ERRMAP 2 /* Errormap used by my_error() */ + +/* Do not add error numbers before CR_ERROR_FIRST. */ +/* If necessary to add lower numbers, change CR_ERROR_FIRST accordingly. */ +#define CR_ERROR_FIRST 2000 /*Copy first error nr.*/ +#define CR_UNKNOWN_ERROR 2000 +#define CR_SOCKET_CREATE_ERROR 2001 +#define CR_CONNECTION_ERROR 2002 +#define CR_CONN_HOST_ERROR 2003 +#define CR_IPSOCK_ERROR 2004 +#define CR_UNKNOWN_HOST 2005 +#define CR_SERVER_GONE_ERROR 2006 +#define CR_VERSION_ERROR 2007 +#define CR_OUT_OF_MEMORY 2008 +#define CR_WRONG_HOST_INFO 2009 +#define CR_LOCALHOST_CONNECTION 2010 +#define CR_TCP_CONNECTION 2011 +#define CR_SERVER_HANDSHAKE_ERR 2012 +#define CR_SERVER_LOST 2013 +#define CR_COMMANDS_OUT_OF_SYNC 2014 +#define CR_NAMEDPIPE_CONNECTION 2015 +#define CR_NAMEDPIPEWAIT_ERROR 2016 +#define CR_NAMEDPIPEOPEN_ERROR 2017 +#define CR_NAMEDPIPESETSTATE_ERROR 2018 +#define CR_CANT_READ_CHARSET 2019 +#define CR_NET_PACKET_TOO_LARGE 2020 +#define CR_EMBEDDED_CONNECTION 2021 +#define CR_PROBE_SLAVE_STATUS 2022 +#define CR_PROBE_SLAVE_HOSTS 2023 +#define CR_PROBE_SLAVE_CONNECT 2024 +#define CR_PROBE_MASTER_CONNECT 2025 +#define CR_SSL_CONNECTION_ERROR 2026 +#define CR_MALFORMED_PACKET 2027 +#define CR_WRONG_LICENSE 2028 + +/* new 4.1 error codes */ +#define CR_NULL_POINTER 2029 +#define CR_NO_PREPARE_STMT 2030 +#define CR_PARAMS_NOT_BOUND 2031 +#define CR_DATA_TRUNCATED 2032 +#define CR_NO_PARAMETERS_EXISTS 2033 +#define CR_INVALID_PARAMETER_NO 2034 +#define CR_INVALID_BUFFER_USE 2035 +#define CR_UNSUPPORTED_PARAM_TYPE 2036 + +#define CR_SHARED_MEMORY_CONNECTION 2037 +#define CR_SHARED_MEMORY_CONNECT_REQUEST_ERROR 2038 +#define CR_SHARED_MEMORY_CONNECT_ANSWER_ERROR 2039 +#define CR_SHARED_MEMORY_CONNECT_FILE_MAP_ERROR 2040 +#define CR_SHARED_MEMORY_CONNECT_MAP_ERROR 2041 +#define CR_SHARED_MEMORY_FILE_MAP_ERROR 2042 +#define CR_SHARED_MEMORY_MAP_ERROR 2043 +#define CR_SHARED_MEMORY_EVENT_ERROR 2044 +#define CR_SHARED_MEMORY_CONNECT_ABANDONED_ERROR 2045 +#define CR_SHARED_MEMORY_CONNECT_SET_ERROR 2046 +#define CR_CONN_UNKNOW_PROTOCOL 2047 +#define CR_INVALID_CONN_HANDLE 2048 +#define CR_SECURE_AUTH 2049 +#define CR_FETCH_CANCELED 2050 +#define CR_NO_DATA 2051 +#define CR_NO_STMT_METADATA 2052 +#define CR_NO_RESULT_SET 2053 +#define CR_NOT_IMPLEMENTED 2054 +#define CR_SERVER_LOST_EXTENDED 2055 +#define CR_STMT_CLOSED 2056 +#define CR_NEW_STMT_METADATA 2057 +#define CR_ALREADY_CONNECTED 2058 +#define CR_ERROR_LAST /*Copy last error nr:*/ 2058 +/* Add error numbers before CR_ERROR_LAST and change it accordingly. */ + diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/hash.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/hash.h new file mode 100644 index 0000000..c1797c8 --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/hash.h @@ -0,0 +1,84 @@ +/* Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* Dynamic hashing of record with different key-length */ + +#ifndef _hash_h +#define _hash_h +#ifdef __cplusplus +extern "C" { +#endif + +/* + Overhead to store an element in hash + Can be used to approximate memory consumption for a hash + */ +#define HASH_OVERHEAD (sizeof(char*)*2) + +/* flags for hash_init */ +#define HASH_UNIQUE 1 /* hash_insert fails on duplicate key */ + +typedef uchar *(*my_hash_get_key)(const uchar *,size_t*,my_bool); +typedef void (*my_hash_free_key)(void *); +typedef my_bool (*my_hash_walk_action)(void *,void *); + +typedef struct st_hash { + size_t key_offset,key_length; /* Length of key if const length */ + size_t blength; + ulong records; + uint flags; + DYNAMIC_ARRAY array; /* Place for hash_keys */ + my_hash_get_key get_key; + void (*free)(void *); + CHARSET_INFO *charset; +} HASH; + +/* A search iterator state */ +typedef uint HASH_SEARCH_STATE; + +#define my_hash_init(A,B,C,D,E,F,G,H) \ + _my_hash_init(A,0,B,C,D,E,F,G,H CALLER_INFO) +#define my_hash_init2(A,B,C,D,E,F,G,H,I) \ + _my_hash_init(A,B,C,D,E,F,G,H,I CALLER_INFO) +my_bool _my_hash_init(HASH *hash, uint growth_size, CHARSET_INFO *charset, + ulong default_array_elements, size_t key_offset, + size_t key_length, my_hash_get_key get_key, + void (*free_element)(void*), + uint flags CALLER_INFO_PROTO); +void my_hash_free(HASH *tree); +void my_hash_reset(HASH *hash); +uchar *my_hash_element(HASH *hash, ulong idx); +uchar *my_hash_search(const HASH *info, const uchar *key, size_t length); +uchar *my_hash_first(const HASH *info, const uchar *key, size_t length, + HASH_SEARCH_STATE *state); +uchar *my_hash_next(const HASH *info, const uchar *key, size_t length, + HASH_SEARCH_STATE *state); +my_bool my_hash_insert(HASH *info, const uchar *data); +my_bool my_hash_delete(HASH *hash, uchar *record); +my_bool my_hash_update(HASH *hash, uchar *record, uchar *old_key, + size_t old_key_length); +void my_hash_replace(HASH *hash, HASH_SEARCH_STATE *state, uchar *new_row); +my_bool my_hash_check(HASH *hash); /* Only in debug library */ +my_bool my_hash_iterate(HASH *hash, my_hash_walk_action action, void *argument); + +#define my_hash_clear(H) bzero((char*) (H), sizeof(*(H))) +#define my_hash_inited(H) ((H)->array.buffer != 0) +#define my_hash_init_opt(A,B,C,D,E,F,G,H) \ + (!my_hash_inited(A) && _my_hash_init(A,0,B,C,D,E,F,G, H CALLER_INFO)) + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/keycache.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/keycache.h new file mode 100644 index 0000000..0375d10 --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/keycache.h @@ -0,0 +1,153 @@ +/* Copyright (C) 2003 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/** + @file + Key cache API +*/ + +#ifndef _keycache_h +#define _keycache_h +C_MODE_START + +/* declare structures that is used by st_key_cache */ + +struct st_block_link; +typedef struct st_block_link BLOCK_LINK; +struct st_keycache_page; +typedef struct st_keycache_page KEYCACHE_PAGE; +struct st_hash_link; +typedef struct st_hash_link HASH_LINK; + +/* info about requests in a waiting queue */ +typedef struct st_keycache_wqueue +{ + struct st_my_thread_var *last_thread; /* circular list of waiting threads */ +} KEYCACHE_WQUEUE; + +/** Callback called when any block is flushed */ +typedef int (*KEYCACHE_POST_WRITE_CALLBACK)(void *arg, const uchar *buffert, + uint length, my_off_t filepos); + +#define CHANGED_BLOCKS_HASH 128 /* must be power of 2 */ + +/* + The key cache structure + It also contains read-only statistics parameters. +*/ + +typedef struct st_key_cache +{ + my_bool key_cache_inited; + my_bool in_resize; /* true during resize operation */ + my_bool resize_in_flush; /* true during flush of resize operation */ + my_bool can_be_used; /* usage of cache for read/write is allowed */ + size_t key_cache_mem_size; /* specified size of the cache memory */ + uint key_cache_block_size; /* size of the page buffer of a cache block */ + ulong min_warm_blocks; /* min number of warm blocks; */ + ulong age_threshold; /* age threshold for hot blocks */ + ulonglong keycache_time; /* total number of block link operations */ + uint hash_entries; /* max number of entries in the hash table */ + int hash_links; /* max number of hash links */ + int hash_links_used; /* number of hash links currently used */ + int disk_blocks; /* max number of blocks in the cache */ + ulong blocks_used; /* maximum number of concurrently used blocks */ + ulong blocks_unused; /* number of currently unused blocks */ + ulong blocks_changed; /* number of currently dirty blocks */ + ulong warm_blocks; /* number of blocks in warm sub-chain */ + ulong cnt_for_resize_op; /* counter to block resize operation */ + long blocks_available; /* number of blocks available in the LRU chain */ + HASH_LINK **hash_root; /* arr. of entries into hash table buckets */ + HASH_LINK *hash_link_root; /* memory for hash table links */ + HASH_LINK *free_hash_list; /* list of free hash links */ + BLOCK_LINK *free_block_list; /* list of free blocks */ + BLOCK_LINK *block_root; /* memory for block links */ + uchar HUGE_PTR *block_mem; /* memory for block buffers */ + BLOCK_LINK *used_last; /* ptr to the last block of the LRU chain */ + BLOCK_LINK *used_ins; /* ptr to the insertion block in LRU chain */ + pthread_mutex_t cache_lock; /* to lock access to the cache structure */ + KEYCACHE_WQUEUE resize_queue; /* threads waiting during resize operation */ + /* + Waiting for a zero resize count. Using a queue for symmetry though + only one thread can wait here. + */ + KEYCACHE_WQUEUE waiting_for_resize_cnt; + KEYCACHE_WQUEUE waiting_for_hash_link; /* waiting for a free hash link */ + KEYCACHE_WQUEUE waiting_for_block; /* requests waiting for a free block */ + BLOCK_LINK *changed_blocks[CHANGED_BLOCKS_HASH]; /* hash for dirty file bl.*/ + BLOCK_LINK *file_blocks[CHANGED_BLOCKS_HASH]; /* hash for other file bl.*/ + KEYCACHE_POST_WRITE_CALLBACK post_write;/**< Called when flushing any block*/ + + /* + The following variables are and variables used to hold parameters for + initializing the key cache. + */ + + ulonglong param_buff_size; /* size the memory allocated for the cache */ + ulong param_block_size; /* size of the blocks in the key cache */ + ulong param_division_limit; /* min. percentage of warm blocks */ + ulong param_age_threshold; /* determines when hot block is downgraded */ + + /* Statistics variables. These are reset in reset_key_cache_counters(). */ + ulong global_blocks_changed; /* number of currently dirty blocks */ + ulonglong global_cache_w_requests;/* number of write requests (write hits) */ + ulonglong global_cache_write; /* number of writes from cache to files */ + ulonglong global_cache_r_requests;/* number of read requests (read hits) */ + ulonglong global_cache_read; /* number of reads from files to cache */ + + int blocks; /* max number of blocks in the cache */ + my_bool in_init; /* Set to 1 in MySQL during init/resize */ +} KEY_CACHE; + +/* The default key cache */ +extern KEY_CACHE dflt_key_cache_var, *dflt_key_cache; + +extern int init_key_cache(KEY_CACHE *keycache, uint key_cache_block_size, + size_t use_mem, uint division_limit, + uint age_threshold); +extern int resize_key_cache(KEY_CACHE *keycache, uint key_cache_block_size, + size_t use_mem, uint division_limit, + uint age_threshold); +extern void change_key_cache_param(KEY_CACHE *keycache, uint division_limit, + uint age_threshold); +extern uchar *key_cache_read(KEY_CACHE *keycache, + File file, my_off_t filepos, int level, + uchar *buff, uint length, + uint block_length,int return_buffer); +extern int key_cache_insert(KEY_CACHE *keycache, + File file, my_off_t filepos, int level, + uchar *buff, uint length); +extern int key_cache_write(KEY_CACHE *keycache, + File file, my_off_t filepos, int level, + uchar *buff, uint length, + uint block_length, int force_write, + void *post_write_arg); +extern int flush_key_blocks(KEY_CACHE *keycache, + int file, enum flush_type type); +extern void end_key_cache(KEY_CACHE *keycache, my_bool cleanup); + +/* Functions to handle multiple key caches */ +extern my_bool multi_keycache_init(void); +extern void multi_keycache_free(void); +extern KEY_CACHE *multi_key_cache_search(uchar *key, uint length, + KEY_CACHE *def); +extern my_bool multi_key_cache_set(const uchar *key, uint length, + KEY_CACHE *key_cache); +extern void multi_key_cache_change(KEY_CACHE *old_data, + KEY_CACHE *new_data); +extern int reset_key_cache_counters(const char *name, + KEY_CACHE *key_cache); +C_MODE_END +#endif /* _keycache_h */ diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/lf.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/lf.h new file mode 100644 index 0000000..83358aa --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/lf.h @@ -0,0 +1,260 @@ +/* Copyright (C) 2007-2008 MySQL AB, 2008-2009 Sun Microsystems, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef _lf_h +#define _lf_h + +#include + +/* + Helpers to define both func() and _func(), where + func() is a _func() protected by my_atomic_rwlock_wrlock() +*/ + +#define lock_wrap(f, t, proto_args, args, lock) \ +t _ ## f proto_args; \ +static inline t f proto_args \ +{ \ + t ret; \ + my_atomic_rwlock_wrlock(lock); \ + ret= _ ## f args; \ + my_atomic_rwlock_wrunlock(lock); \ + return ret; \ +} + +#define lock_wrap_void(f, proto_args, args, lock) \ +void _ ## f proto_args; \ +static inline void f proto_args \ +{ \ + my_atomic_rwlock_wrlock(lock); \ + _ ## f args; \ + my_atomic_rwlock_wrunlock(lock); \ +} + +#define nolock_wrap(f, t, proto_args, args) \ +t _ ## f proto_args; \ +static inline t f proto_args \ +{ \ + return _ ## f args; \ +} + +#define nolock_wrap_void(f, proto_args, args) \ +void _ ## f proto_args; \ +static inline void f proto_args \ +{ \ + _ ## f args; \ +} + +/* + wait-free dynamic array, see lf_dynarray.c + + 4 levels of 256 elements each mean 4311810304 elements in an array - it + should be enough for a while +*/ +#define LF_DYNARRAY_LEVEL_LENGTH 256 +#define LF_DYNARRAY_LEVELS 4 + +typedef struct { + void * volatile level[LF_DYNARRAY_LEVELS]; + uint size_of_element; + my_atomic_rwlock_t lock; +} LF_DYNARRAY; + +typedef int (*lf_dynarray_func)(void *, void *); + +void lf_dynarray_init(LF_DYNARRAY *array, uint element_size); +void lf_dynarray_destroy(LF_DYNARRAY *array); + +nolock_wrap(lf_dynarray_value, void *, + (LF_DYNARRAY *array, uint idx), + (array, idx)) +lock_wrap(lf_dynarray_lvalue, void *, + (LF_DYNARRAY *array, uint idx), + (array, idx), + &array->lock) +nolock_wrap(lf_dynarray_iterate, int, + (LF_DYNARRAY *array, lf_dynarray_func func, void *arg), + (array, func, arg)) + +/* + pin manager for memory allocator, lf_alloc-pin.c +*/ + +#define LF_PINBOX_PINS 4 +#define LF_PURGATORY_SIZE 10 + +typedef void lf_pinbox_free_func(void *, void *, void*); + +typedef struct { + LF_DYNARRAY pinarray; + lf_pinbox_free_func *free_func; + void *free_func_arg; + uint free_ptr_offset; + uint32 volatile pinstack_top_ver; /* this is a versioned pointer */ + uint32 volatile pins_in_array; /* number of elements in array */ +} LF_PINBOX; + +typedef struct { + void * volatile pin[LF_PINBOX_PINS]; + LF_PINBOX *pinbox; + void **stack_ends_here; + void *purgatory; + uint32 purgatory_count; + uint32 volatile link; +/* we want sizeof(LF_PINS) to be 64 to avoid false sharing */ +#if SIZEOF_INT*2+SIZEOF_CHARP*(LF_PINBOX_PINS+3) != 64 + char pad[64-sizeof(uint32)*2-sizeof(void*)*(LF_PINBOX_PINS+3)]; +#endif +} LF_PINS; + +/* + shortcut macros to do an atomic_wrlock on a structure that uses pins + (e.g. lf_hash). +*/ +#define lf_rwlock_by_pins(PINS) \ + my_atomic_rwlock_wrlock(&(PINS)->pinbox->pinarray.lock) +#define lf_rwunlock_by_pins(PINS) \ + my_atomic_rwlock_wrunlock(&(PINS)->pinbox->pinarray.lock) + +/* + compile-time assert, to require "no less than N" pins + it's enough if it'll fail on at least one compiler, so + we'll enable it on GCC only, which supports zero-length arrays. +*/ +#if defined(__GNUC__) && defined(MY_LF_EXTRA_DEBUG) +#define LF_REQUIRE_PINS(N) \ + static const char require_pins[LF_PINBOX_PINS-N] \ + __attribute__ ((unused)); \ + static const int LF_NUM_PINS_IN_THIS_FILE= N; +#define _lf_pin(PINS, PIN, ADDR) \ + ( \ + assert(PIN < LF_NUM_PINS_IN_THIS_FILE), \ + my_atomic_storeptr(&(PINS)->pin[PIN], (ADDR)) \ + ) +#else +#define LF_REQUIRE_PINS(N) +#define _lf_pin(PINS, PIN, ADDR) my_atomic_storeptr(&(PINS)->pin[PIN], (ADDR)) +#endif + +#define _lf_unpin(PINS, PIN) _lf_pin(PINS, PIN, NULL) +#define lf_pin(PINS, PIN, ADDR) \ + do { \ + lf_rwlock_by_pins(PINS); \ + _lf_pin(PINS, PIN, ADDR); \ + lf_rwunlock_by_pins(PINS); \ + } while (0) +#define lf_unpin(PINS, PIN) lf_pin(PINS, PIN, NULL) +#define _lf_assert_pin(PINS, PIN) assert((PINS)->pin[PIN] != 0) +#define _lf_assert_unpin(PINS, PIN) assert((PINS)->pin[PIN] == 0) + +void lf_pinbox_init(LF_PINBOX *pinbox, uint free_ptr_offset, + lf_pinbox_free_func *free_func, void * free_func_arg); +void lf_pinbox_destroy(LF_PINBOX *pinbox); + +lock_wrap(lf_pinbox_get_pins, LF_PINS *, + (LF_PINBOX *pinbox), + (pinbox), + &pinbox->pinarray.lock) +lock_wrap_void(lf_pinbox_put_pins, + (LF_PINS *pins), + (pins), + &pins->pinbox->pinarray.lock) +lock_wrap_void(lf_pinbox_free, + (LF_PINS *pins, void *addr), + (pins, addr), + &pins->pinbox->pinarray.lock) + +/* + memory allocator, lf_alloc-pin.c +*/ + +typedef struct st_lf_allocator { + LF_PINBOX pinbox; + uchar * volatile top; + uint element_size; + uint32 volatile mallocs; + void (*constructor)(uchar *); /* called, when an object is malloc()'ed */ + void (*destructor)(uchar *); /* called, when an object is free()'d */ +} LF_ALLOCATOR; + +void lf_alloc_init(LF_ALLOCATOR *allocator, uint size, uint free_ptr_offset); +void lf_alloc_destroy(LF_ALLOCATOR *allocator); +uint lf_alloc_pool_count(LF_ALLOCATOR *allocator); +/* + shortcut macros to access underlying pinbox functions from an LF_ALLOCATOR + see _lf_pinbox_get_pins() and _lf_pinbox_put_pins() +*/ +#define _lf_alloc_free(PINS, PTR) _lf_pinbox_free((PINS), (PTR)) +#define lf_alloc_free(PINS, PTR) lf_pinbox_free((PINS), (PTR)) +#define _lf_alloc_get_pins(A) _lf_pinbox_get_pins(&(A)->pinbox) +#define lf_alloc_get_pins(A) lf_pinbox_get_pins(&(A)->pinbox) +#define _lf_alloc_put_pins(PINS) _lf_pinbox_put_pins(PINS) +#define lf_alloc_put_pins(PINS) lf_pinbox_put_pins(PINS) +#define lf_alloc_direct_free(ALLOC, ADDR) my_free((uchar*)(ADDR), MYF(0)) + +lock_wrap(lf_alloc_new, void *, + (LF_PINS *pins), + (pins), + &pins->pinbox->pinarray.lock) + +/* + extendible hash, lf_hash.c +*/ +#include + +#define LF_HASH_UNIQUE 1 + +/* lf_hash overhead per element (that is, sizeof(LF_SLIST) */ +extern const int LF_HASH_OVERHEAD; + +typedef struct { + LF_DYNARRAY array; /* hash itself */ + LF_ALLOCATOR alloc; /* allocator for elements */ + my_hash_get_key get_key; /* see HASH */ + CHARSET_INFO *charset; /* see HASH */ + uint key_offset, key_length; /* see HASH */ + uint element_size; /* size of memcpy'ed area on insert */ + uint flags; /* LF_HASH_UNIQUE, etc */ + int32 volatile size; /* size of array */ + int32 volatile count; /* number of elements in the hash */ +} LF_HASH; + +void lf_hash_init(LF_HASH *hash, uint element_size, uint flags, + uint key_offset, uint key_length, my_hash_get_key get_key, + CHARSET_INFO *charset); +void lf_hash_destroy(LF_HASH *hash); +int lf_hash_insert(LF_HASH *hash, LF_PINS *pins, const void *data); +void *lf_hash_search(LF_HASH *hash, LF_PINS *pins, const void *key, uint keylen); +int lf_hash_delete(LF_HASH *hash, LF_PINS *pins, const void *key, uint keylen); +/* + shortcut macros to access underlying pinbox functions from an LF_HASH + see _lf_pinbox_get_pins() and _lf_pinbox_put_pins() +*/ +#define _lf_hash_get_pins(HASH) _lf_alloc_get_pins(&(HASH)->alloc) +#define lf_hash_get_pins(HASH) lf_alloc_get_pins(&(HASH)->alloc) +#define _lf_hash_put_pins(PINS) _lf_pinbox_put_pins(PINS) +#define lf_hash_put_pins(PINS) lf_pinbox_put_pins(PINS) +#define lf_hash_search_unpin(PINS) lf_unpin((PINS), 2) +/* + cleanup +*/ + +#undef lock_wrap_void +#undef lock_wrap +#undef nolock_wrap_void +#undef nolock_wrap + +#endif + diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/m_ctype.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/m_ctype.h new file mode 100644 index 0000000..33229a3 --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/m_ctype.h @@ -0,0 +1,654 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* + A better inplementation of the UNIX ctype(3) library. + Notes: my_global.h should be included before ctype.h +*/ + +#ifndef _m_ctype_h +#define _m_ctype_h + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define MY_CS_NAME_SIZE 32 +#define MY_CS_CTYPE_TABLE_SIZE 257 +#define MY_CS_TO_LOWER_TABLE_SIZE 256 +#define MY_CS_TO_UPPER_TABLE_SIZE 256 +#define MY_CS_SORT_ORDER_TABLE_SIZE 256 +#define MY_CS_TO_UNI_TABLE_SIZE 256 + +#define CHARSET_DIR "charsets/" + +#define my_wc_t ulong + +typedef struct unicase_info_st +{ + uint16 toupper; + uint16 tolower; + uint16 sort; +} MY_UNICASE_INFO; + + +extern MY_UNICASE_INFO *my_unicase_default[256]; +extern MY_UNICASE_INFO *my_unicase_turkish[256]; + +typedef struct uni_ctype_st +{ + uchar pctype; + uchar *ctype; +} MY_UNI_CTYPE; + +extern MY_UNI_CTYPE my_uni_ctype[256]; + +/* wm_wc and wc_mb return codes */ +#define MY_CS_ILSEQ 0 /* Wrong by sequence: wb_wc */ +#define MY_CS_ILUNI 0 /* Cannot encode Unicode to charset: wc_mb */ +#define MY_CS_TOOSMALL -101 /* Need at least one byte: wc_mb and mb_wc */ +#define MY_CS_TOOSMALL2 -102 /* Need at least two bytes: wc_mb and mb_wc */ +#define MY_CS_TOOSMALL3 -103 /* Need at least three bytes: wc_mb and mb_wc */ +/* These following three are currently not really used */ +#define MY_CS_TOOSMALL4 -104 /* Need at least 4 bytes: wc_mb and mb_wc */ +#define MY_CS_TOOSMALL5 -105 /* Need at least 5 bytes: wc_mb and mb_wc */ +#define MY_CS_TOOSMALL6 -106 /* Need at least 6 bytes: wc_mb and mb_wc */ +/* A helper macros for "need at least n bytes" */ +#define MY_CS_TOOSMALLN(n) (-100-(n)) + +#define MY_SEQ_INTTAIL 1 +#define MY_SEQ_SPACES 2 + + /* My charsets_list flags */ +#define MY_CS_COMPILED 1 /* compiled-in sets */ +#define MY_CS_CONFIG 2 /* sets that have a *.conf file */ +#define MY_CS_INDEX 4 /* sets listed in the Index file */ +#define MY_CS_LOADED 8 /* sets that are currently loaded */ +#define MY_CS_BINSORT 16 /* if binary sort order */ +#define MY_CS_PRIMARY 32 /* if primary collation */ +#define MY_CS_STRNXFRM 64 /* if strnxfrm is used for sort */ +#define MY_CS_UNICODE 128 /* is a charset is full unicode */ +#define MY_CS_READY 256 /* if a charset is initialized */ +#define MY_CS_AVAILABLE 512 /* If either compiled-in or loaded*/ +#define MY_CS_CSSORT 1024 /* if case sensitive sort order */ +#define MY_CS_HIDDEN 2048 /* don't display in SHOW */ +#define MY_CS_PUREASCII 4096 /* if a charset is pure ascii */ +#define MY_CS_NONASCII 8192 /* if not ASCII-compatible */ +#define MY_CHARSET_UNDEFINED 0 + +/* Character repertoire flags */ +#define MY_REPERTOIRE_ASCII 1 /* Pure ASCII U+0000..U+007F */ +#define MY_REPERTOIRE_EXTENDED 2 /* Extended characters: U+0080..U+FFFF */ +#define MY_REPERTOIRE_UNICODE30 3 /* ASCII | EXTENDED: U+0000..U+FFFF */ + +/* Flags for strxfrm */ +#define MY_STRXFRM_LEVEL1 0x00000001 /* for primary weights */ +#define MY_STRXFRM_LEVEL2 0x00000002 /* for secondary weights */ +#define MY_STRXFRM_LEVEL3 0x00000004 /* for tertiary weights */ +#define MY_STRXFRM_LEVEL4 0x00000008 /* fourth level weights */ +#define MY_STRXFRM_LEVEL5 0x00000010 /* fifth level weights */ +#define MY_STRXFRM_LEVEL6 0x00000020 /* sixth level weights */ +#define MY_STRXFRM_LEVEL_ALL 0x0000003F /* Bit OR for the above six */ +#define MY_STRXFRM_NLEVELS 6 /* Number of possible levels*/ + +#define MY_STRXFRM_PAD_WITH_SPACE 0x00000040 /* if pad result with spaces */ +#define MY_STRXFRM_PAD_TO_MAXLEN 0x00000080 /* if pad tail(for filesort) */ + +#define MY_STRXFRM_DESC_LEVEL1 0x00000100 /* if desc order for level1 */ +#define MY_STRXFRM_DESC_LEVEL2 0x00000200 /* if desc order for level2 */ +#define MY_STRXFRM_DESC_LEVEL3 0x00000300 /* if desc order for level3 */ +#define MY_STRXFRM_DESC_LEVEL4 0x00000800 /* if desc order for level4 */ +#define MY_STRXFRM_DESC_LEVEL5 0x00001000 /* if desc order for level5 */ +#define MY_STRXFRM_DESC_LEVEL6 0x00002000 /* if desc order for level6 */ +#define MY_STRXFRM_DESC_SHIFT 8 + +#define MY_STRXFRM_UNUSED_00004000 0x00004000 /* for future extensions */ +#define MY_STRXFRM_UNUSED_00008000 0x00008000 /* for future extensions */ + +#define MY_STRXFRM_REVERSE_LEVEL1 0x00010000 /* if reverse order for level1 */ +#define MY_STRXFRM_REVERSE_LEVEL2 0x00020000 /* if reverse order for level2 */ +#define MY_STRXFRM_REVERSE_LEVEL3 0x00040000 /* if reverse order for level3 */ +#define MY_STRXFRM_REVERSE_LEVEL4 0x00080000 /* if reverse order for level4 */ +#define MY_STRXFRM_REVERSE_LEVEL5 0x00100000 /* if reverse order for level5 */ +#define MY_STRXFRM_REVERSE_LEVEL6 0x00200000 /* if reverse order for level6 */ +#define MY_STRXFRM_REVERSE_SHIFT 16 + + +typedef struct my_uni_idx_st +{ + uint16 from; + uint16 to; + uchar *tab; +} MY_UNI_IDX; + +typedef struct +{ + uint beg; + uint end; + uint mb_len; +} my_match_t; + +enum my_lex_states +{ + MY_LEX_START, MY_LEX_CHAR, MY_LEX_IDENT, + MY_LEX_IDENT_SEP, MY_LEX_IDENT_START, + MY_LEX_REAL, MY_LEX_HEX_NUMBER, MY_LEX_BIN_NUMBER, + MY_LEX_CMP_OP, MY_LEX_LONG_CMP_OP, MY_LEX_STRING, MY_LEX_COMMENT, MY_LEX_END, + MY_LEX_OPERATOR_OR_IDENT, MY_LEX_NUMBER_IDENT, MY_LEX_INT_OR_REAL, + MY_LEX_REAL_OR_POINT, MY_LEX_BOOL, MY_LEX_EOL, MY_LEX_ESCAPE, + MY_LEX_LONG_COMMENT, MY_LEX_END_LONG_COMMENT, MY_LEX_SEMICOLON, + MY_LEX_SET_VAR, MY_LEX_USER_END, MY_LEX_HOSTNAME, MY_LEX_SKIP, + MY_LEX_USER_VARIABLE_DELIMITER, MY_LEX_SYSTEM_VAR, + MY_LEX_IDENT_OR_KEYWORD, + MY_LEX_IDENT_OR_HEX, MY_LEX_IDENT_OR_BIN, MY_LEX_IDENT_OR_NCHAR, + MY_LEX_STRING_OR_DELIMITER +}; + +struct charset_info_st; + + +/* See strings/CHARSET_INFO.txt for information about this structure */ +typedef struct my_collation_handler_st +{ + my_bool (*init)(struct charset_info_st *, void *(*alloc)(size_t)); + /* Collation routines */ + int (*strnncoll)(struct charset_info_st *, + const uchar *, size_t, const uchar *, size_t, my_bool); + int (*strnncollsp)(struct charset_info_st *, + const uchar *, size_t, const uchar *, size_t, + my_bool diff_if_only_endspace_difference); + size_t (*strnxfrm)(struct charset_info_st *, + uchar *dst, size_t dstlen, uint nweights, + const uchar *src, size_t srclen, uint flags); + size_t (*strnxfrmlen)(struct charset_info_st *, size_t); + my_bool (*like_range)(struct charset_info_st *, + const char *s, size_t s_length, + pchar w_prefix, pchar w_one, pchar w_many, + size_t res_length, + char *min_str, char *max_str, + size_t *min_len, size_t *max_len); + int (*wildcmp)(struct charset_info_st *, + const char *str,const char *str_end, + const char *wildstr,const char *wildend, + int escape,int w_one, int w_many); + + int (*strcasecmp)(struct charset_info_st *, const char *, const char *); + + uint (*instr)(struct charset_info_st *, + const char *b, size_t b_length, + const char *s, size_t s_length, + my_match_t *match, uint nmatch); + + /* Hash calculation */ + void (*hash_sort)(struct charset_info_st *cs, const uchar *key, size_t len, + ulong *nr1, ulong *nr2); + my_bool (*propagate)(struct charset_info_st *cs, const uchar *str, size_t len); +} MY_COLLATION_HANDLER; + +extern MY_COLLATION_HANDLER my_collation_mb_bin_handler; +extern MY_COLLATION_HANDLER my_collation_8bit_bin_handler; +extern MY_COLLATION_HANDLER my_collation_8bit_simple_ci_handler; +extern MY_COLLATION_HANDLER my_collation_ucs2_uca_handler; + +/* Some typedef to make it easy for C++ to make function pointers */ +typedef int (*my_charset_conv_mb_wc)(struct charset_info_st *, my_wc_t *, + const uchar *, const uchar *); +typedef int (*my_charset_conv_wc_mb)(struct charset_info_st *, my_wc_t, + uchar *, uchar *); +typedef size_t (*my_charset_conv_case)(struct charset_info_st *, + char *, size_t, char *, size_t); + + +/* See strings/CHARSET_INFO.txt about information on this structure */ +typedef struct my_charset_handler_st +{ + my_bool (*init)(struct charset_info_st *, void *(*alloc)(size_t)); + /* Multibyte routines */ + uint (*ismbchar)(struct charset_info_st *, const char *, const char *); + uint (*mbcharlen)(struct charset_info_st *, uint c); + size_t (*numchars)(struct charset_info_st *, const char *b, const char *e); + size_t (*charpos)(struct charset_info_st *, const char *b, const char *e, + size_t pos); + size_t (*well_formed_len)(struct charset_info_st *, + const char *b,const char *e, + size_t nchars, int *error); + size_t (*lengthsp)(struct charset_info_st *, const char *ptr, size_t length); + size_t (*numcells)(struct charset_info_st *, const char *b, const char *e); + + /* Unicode conversion */ + my_charset_conv_mb_wc mb_wc; + my_charset_conv_wc_mb wc_mb; + + /* CTYPE scanner */ + int (*ctype)(struct charset_info_st *cs, int *ctype, + const uchar *s, const uchar *e); + + /* Functions for case and sort conversion */ + size_t (*caseup_str)(struct charset_info_st *, char *); + size_t (*casedn_str)(struct charset_info_st *, char *); + + my_charset_conv_case caseup; + my_charset_conv_case casedn; + + /* Charset dependant snprintf() */ + size_t (*snprintf)(struct charset_info_st *, char *to, size_t n, + const char *fmt, + ...) ATTRIBUTE_FORMAT_FPTR(printf, 4, 5); + size_t (*long10_to_str)(struct charset_info_st *, char *to, size_t n, + int radix, long int val); + size_t (*longlong10_to_str)(struct charset_info_st *, char *to, size_t n, + int radix, longlong val); + + void (*fill)(struct charset_info_st *, char *to, size_t len, int fill); + + /* String-to-number conversion routines */ + long (*strntol)(struct charset_info_st *, const char *s, size_t l, + int base, char **e, int *err); + ulong (*strntoul)(struct charset_info_st *, const char *s, size_t l, + int base, char **e, int *err); + longlong (*strntoll)(struct charset_info_st *, const char *s, size_t l, + int base, char **e, int *err); + ulonglong (*strntoull)(struct charset_info_st *, const char *s, size_t l, + int base, char **e, int *err); + double (*strntod)(struct charset_info_st *, char *s, size_t l, char **e, + int *err); + longlong (*strtoll10)(struct charset_info_st *cs, + const char *nptr, char **endptr, int *error); + ulonglong (*strntoull10rnd)(struct charset_info_st *cs, + const char *str, size_t length, + int unsigned_fl, + char **endptr, int *error); + size_t (*scan)(struct charset_info_st *, const char *b, const char *e, + int sq); +} MY_CHARSET_HANDLER; + +extern MY_CHARSET_HANDLER my_charset_8bit_handler; +extern MY_CHARSET_HANDLER my_charset_ucs2_handler; + + +/* See strings/CHARSET_INFO.txt about information on this structure */ +typedef struct charset_info_st +{ + uint number; + uint primary_number; + uint binary_number; + uint state; + const char *csname; + const char *name; + const char *comment; + const char *tailoring; + uchar *ctype; + uchar *to_lower; + uchar *to_upper; + uchar *sort_order; + uint16 *contractions; + uint16 **sort_order_big; + uint16 *tab_to_uni; + MY_UNI_IDX *tab_from_uni; + MY_UNICASE_INFO **caseinfo; + uchar *state_map; + uchar *ident_map; + uint strxfrm_multiply; + uchar caseup_multiply; + uchar casedn_multiply; + uint mbminlen; + uint mbmaxlen; + uint16 min_sort_char; + uint16 max_sort_char; /* For LIKE optimization */ + uchar pad_char; + my_bool escape_with_backslash_is_dangerous; + uchar levels_for_compare; + uchar levels_for_order; + + MY_CHARSET_HANDLER *cset; + MY_COLLATION_HANDLER *coll; + +} CHARSET_INFO; +#define ILLEGAL_CHARSET_INFO_NUMBER (~0U) + + +extern MYSQL_PLUGIN_IMPORT CHARSET_INFO my_charset_bin; +extern CHARSET_INFO my_charset_big5_chinese_ci; +extern CHARSET_INFO my_charset_big5_bin; +extern CHARSET_INFO my_charset_cp932_japanese_ci; +extern CHARSET_INFO my_charset_cp932_bin; +extern CHARSET_INFO my_charset_cp1250_czech_ci; +extern CHARSET_INFO my_charset_eucjpms_japanese_ci; +extern CHARSET_INFO my_charset_eucjpms_bin; +extern CHARSET_INFO my_charset_euckr_korean_ci; +extern CHARSET_INFO my_charset_euckr_bin; +extern MYSQL_PLUGIN_IMPORT CHARSET_INFO my_charset_filename; +extern CHARSET_INFO my_charset_gb2312_chinese_ci; +extern CHARSET_INFO my_charset_gb2312_bin; +extern CHARSET_INFO my_charset_gbk_chinese_ci; +extern CHARSET_INFO my_charset_gbk_bin; +extern MYSQL_PLUGIN_IMPORT CHARSET_INFO my_charset_latin1; +extern CHARSET_INFO my_charset_latin1_german2_ci; +extern CHARSET_INFO my_charset_latin1_bin; +extern CHARSET_INFO my_charset_latin2_czech_ci; +extern CHARSET_INFO my_charset_sjis_japanese_ci; +extern CHARSET_INFO my_charset_sjis_bin; +extern CHARSET_INFO my_charset_tis620_thai_ci; +extern CHARSET_INFO my_charset_tis620_bin; +extern CHARSET_INFO my_charset_ucs2_general_ci; +extern CHARSET_INFO my_charset_ucs2_bin; +extern CHARSET_INFO my_charset_ucs2_unicode_ci; +extern CHARSET_INFO my_charset_ujis_japanese_ci; +extern CHARSET_INFO my_charset_ujis_bin; +extern CHARSET_INFO my_charset_utf16_bin; +extern CHARSET_INFO my_charset_utf16_general_ci; +extern CHARSET_INFO my_charset_utf16_unicode_ci; +extern CHARSET_INFO my_charset_utf32_bin; +extern CHARSET_INFO my_charset_utf32_general_ci; +extern CHARSET_INFO my_charset_utf32_unicode_ci; +extern CHARSET_INFO my_charset_utf8mb3_bin; +extern CHARSET_INFO my_charset_utf8mb3_general_ci; +extern CHARSET_INFO my_charset_utf8mb3_unicode_ci; +extern CHARSET_INFO my_charset_utf8mb4_bin; +extern MYSQL_PLUGIN_IMPORT CHARSET_INFO my_charset_utf8mb4_general_ci; +extern CHARSET_INFO my_charset_utf8mb4_unicode_ci; + +#define MY_UTF8MB3 "utf8mb3" +#define MY_UTF8MB4 "utf8" +#define my_charset_utf8_general_ci my_charset_utf8mb4_general_ci +#define my_charset_utf8_bin my_charset_utf8mb4_bin + + +/* declarations for simple charsets */ +extern size_t my_strnxfrm_simple(CHARSET_INFO *, + uchar *dst, size_t dstlen, uint nweights, + const uchar *src, size_t srclen, uint flags); +size_t my_strnxfrmlen_simple(CHARSET_INFO *, size_t); +extern int my_strnncoll_simple(CHARSET_INFO *, const uchar *, size_t, + const uchar *, size_t, my_bool); + +extern int my_strnncollsp_simple(CHARSET_INFO *, const uchar *, size_t, + const uchar *, size_t, + my_bool diff_if_only_endspace_difference); + +extern void my_hash_sort_simple(CHARSET_INFO *cs, + const uchar *key, size_t len, + ulong *nr1, ulong *nr2); + +extern size_t my_lengthsp_8bit(CHARSET_INFO *cs, const char *ptr, size_t length); + +extern uint my_instr_simple(struct charset_info_st *, + const char *b, size_t b_length, + const char *s, size_t s_length, + my_match_t *match, uint nmatch); + + +/* Functions for 8bit */ +extern size_t my_caseup_str_8bit(CHARSET_INFO *, char *); +extern size_t my_casedn_str_8bit(CHARSET_INFO *, char *); +extern size_t my_caseup_8bit(CHARSET_INFO *, char *src, size_t srclen, + char *dst, size_t dstlen); +extern size_t my_casedn_8bit(CHARSET_INFO *, char *src, size_t srclen, + char *dst, size_t dstlen); + +extern int my_strcasecmp_8bit(CHARSET_INFO * cs, const char *, const char *); + +int my_mb_wc_8bit(CHARSET_INFO *cs,my_wc_t *wc, const uchar *s,const uchar *e); +int my_wc_mb_8bit(CHARSET_INFO *cs,my_wc_t wc, uchar *s, uchar *e); + +int my_mb_ctype_8bit(CHARSET_INFO *,int *, const uchar *,const uchar *); +int my_mb_ctype_mb(CHARSET_INFO *,int *, const uchar *,const uchar *); + +size_t my_scan_8bit(CHARSET_INFO *cs, const char *b, const char *e, int sq); + +size_t my_snprintf_8bit(struct charset_info_st *, char *to, size_t n, + const char *fmt, ...) + ATTRIBUTE_FORMAT(printf, 4, 5); + +long my_strntol_8bit(CHARSET_INFO *, const char *s, size_t l, int base, + char **e, int *err); +ulong my_strntoul_8bit(CHARSET_INFO *, const char *s, size_t l, int base, + char **e, int *err); +longlong my_strntoll_8bit(CHARSET_INFO *, const char *s, size_t l, int base, + char **e, int *err); +ulonglong my_strntoull_8bit(CHARSET_INFO *, const char *s, size_t l, int base, + char **e, int *err); +double my_strntod_8bit(CHARSET_INFO *, char *s, size_t l,char **e, + int *err); +size_t my_long10_to_str_8bit(CHARSET_INFO *, char *to, size_t l, int radix, + long int val); +size_t my_longlong10_to_str_8bit(CHARSET_INFO *, char *to, size_t l, int radix, + longlong val); + +longlong my_strtoll10_8bit(CHARSET_INFO *cs, + const char *nptr, char **endptr, int *error); +longlong my_strtoll10_ucs2(CHARSET_INFO *cs, + const char *nptr, char **endptr, int *error); + +ulonglong my_strntoull10rnd_8bit(CHARSET_INFO *cs, + const char *str, size_t length, int + unsigned_fl, char **endptr, int *error); +ulonglong my_strntoull10rnd_ucs2(CHARSET_INFO *cs, + const char *str, size_t length, + int unsigned_fl, char **endptr, int *error); + +void my_fill_8bit(CHARSET_INFO *cs, char* to, size_t l, int fill); + +my_bool my_like_range_simple(CHARSET_INFO *cs, + const char *ptr, size_t ptr_length, + pbool escape, pbool w_one, pbool w_many, + size_t res_length, + char *min_str, char *max_str, + size_t *min_length, size_t *max_length); + +my_bool my_like_range_mb(CHARSET_INFO *cs, + const char *ptr, size_t ptr_length, + pbool escape, pbool w_one, pbool w_many, + size_t res_length, + char *min_str, char *max_str, + size_t *min_length, size_t *max_length); + +my_bool my_like_range_ucs2(CHARSET_INFO *cs, + const char *ptr, size_t ptr_length, + pbool escape, pbool w_one, pbool w_many, + size_t res_length, + char *min_str, char *max_str, + size_t *min_length, size_t *max_length); + +my_bool my_like_range_utf16(CHARSET_INFO *cs, + const char *ptr, size_t ptr_length, + pbool escape, pbool w_one, pbool w_many, + size_t res_length, + char *min_str, char *max_str, + size_t *min_length, size_t *max_length); + +my_bool my_like_range_utf32(CHARSET_INFO *cs, + const char *ptr, size_t ptr_length, + pbool escape, pbool w_one, pbool w_many, + size_t res_length, + char *min_str, char *max_str, + size_t *min_length, size_t *max_length); + + +int my_wildcmp_8bit(CHARSET_INFO *, + const char *str,const char *str_end, + const char *wildstr,const char *wildend, + int escape, int w_one, int w_many); + +int my_wildcmp_bin(CHARSET_INFO *, + const char *str,const char *str_end, + const char *wildstr,const char *wildend, + int escape, int w_one, int w_many); + +size_t my_numchars_8bit(CHARSET_INFO *, const char *b, const char *e); +size_t my_numcells_8bit(CHARSET_INFO *, const char *b, const char *e); +size_t my_charpos_8bit(CHARSET_INFO *, const char *b, const char *e, size_t pos); +size_t my_well_formed_len_8bit(CHARSET_INFO *, const char *b, const char *e, + size_t pos, int *error); +uint my_mbcharlen_8bit(CHARSET_INFO *, uint c); + + +/* Functions for multibyte charsets */ +extern size_t my_caseup_str_mb(CHARSET_INFO *, char *); +extern size_t my_casedn_str_mb(CHARSET_INFO *, char *); +extern size_t my_caseup_mb(CHARSET_INFO *, char *src, size_t srclen, + char *dst, size_t dstlen); +extern size_t my_casedn_mb(CHARSET_INFO *, char *src, size_t srclen, + char *dst, size_t dstlen); +extern int my_strcasecmp_mb(CHARSET_INFO * cs,const char *, const char *); + +int my_wildcmp_mb(CHARSET_INFO *, + const char *str,const char *str_end, + const char *wildstr,const char *wildend, + int escape, int w_one, int w_many); +size_t my_numchars_mb(CHARSET_INFO *, const char *b, const char *e); +size_t my_numcells_mb(CHARSET_INFO *, const char *b, const char *e); +size_t my_charpos_mb(CHARSET_INFO *, const char *b, const char *e, size_t pos); +size_t my_well_formed_len_mb(CHARSET_INFO *, const char *b, const char *e, + size_t pos, int *error); +uint my_instr_mb(struct charset_info_st *, + const char *b, size_t b_length, + const char *s, size_t s_length, + my_match_t *match, uint nmatch); + +int my_strnncoll_mb_bin(CHARSET_INFO * cs, + const uchar *s, size_t slen, + const uchar *t, size_t tlen, + my_bool t_is_prefix); + +int my_strnncollsp_mb_bin(CHARSET_INFO *cs, + const uchar *a, size_t a_length, + const uchar *b, size_t b_length, + my_bool diff_if_only_endspace_difference); + +int my_wildcmp_mb_bin(CHARSET_INFO *cs, + const char *str,const char *str_end, + const char *wildstr,const char *wildend, + int escape, int w_one, int w_many); + +int my_strcasecmp_mb_bin(CHARSET_INFO * cs __attribute__((unused)), + const char *s, const char *t); + +void my_hash_sort_mb_bin(CHARSET_INFO *cs __attribute__((unused)), + const uchar *key, size_t len,ulong *nr1, ulong *nr2); + +size_t my_strnxfrm_mb(CHARSET_INFO *, + uchar *dst, size_t dstlen, uint nweights, + const uchar *src, size_t srclen, uint flags); + +size_t my_strnxfrm_unicode(CHARSET_INFO *, + uchar *dst, size_t dstlen, uint nweights, + const uchar *src, size_t srclen, uint flags); + +int my_wildcmp_unicode(CHARSET_INFO *cs, + const char *str, const char *str_end, + const char *wildstr, const char *wildend, + int escape, int w_one, int w_many, + MY_UNICASE_INFO **weights); + +extern my_bool my_parse_charset_xml(const char *bug, size_t len, + int (*add)(CHARSET_INFO *cs)); +extern char *my_strchr(CHARSET_INFO *cs, const char *str, const char *end, + pchar c); + +my_bool my_propagate_simple(CHARSET_INFO *cs, const uchar *str, size_t len); +my_bool my_propagate_complex(CHARSET_INFO *cs, const uchar *str, size_t len); + + +uint my_string_repertoire(CHARSET_INFO *cs, const char *str, ulong len); +my_bool my_charset_is_ascii_based(CHARSET_INFO *cs); +my_bool my_charset_is_8bit_pure_ascii(CHARSET_INFO *cs); +uint my_charset_repertoire(CHARSET_INFO *cs); + + +uint my_strxfrm_flag_normalize(uint flags, uint nlevels); +void my_strxfrm_desc_and_reverse(uchar *str, uchar *strend, + uint flags, uint level); +size_t my_strxfrm_pad_desc_and_reverse(CHARSET_INFO *cs, + uchar *str, uchar *frmend, uchar *strend, + uint nweights, uint flags, uint level); + +my_bool my_charset_is_ascii_compatible(CHARSET_INFO *cs); + +#define _MY_U 01 /* Upper case */ +#define _MY_L 02 /* Lower case */ +#define _MY_NMR 04 /* Numeral (digit) */ +#define _MY_SPC 010 /* Spacing character */ +#define _MY_PNT 020 /* Punctuation */ +#define _MY_CTR 040 /* Control character */ +#define _MY_B 0100 /* Blank */ +#define _MY_X 0200 /* heXadecimal digit */ + + +#define my_isascii(c) (!((c) & ~0177)) +#define my_toascii(c) ((c) & 0177) +#define my_tocntrl(c) ((c) & 31) +#define my_toprint(c) ((c) | 64) +#define my_toupper(s,c) (char) ((s)->to_upper[(uchar) (c)]) +#define my_tolower(s,c) (char) ((s)->to_lower[(uchar) (c)]) +#define my_isalpha(s, c) (((s)->ctype+1)[(uchar) (c)] & (_MY_U | _MY_L)) +#define my_isupper(s, c) (((s)->ctype+1)[(uchar) (c)] & _MY_U) +#define my_islower(s, c) (((s)->ctype+1)[(uchar) (c)] & _MY_L) +#define my_isdigit(s, c) (((s)->ctype+1)[(uchar) (c)] & _MY_NMR) +#define my_isxdigit(s, c) (((s)->ctype+1)[(uchar) (c)] & _MY_X) +#define my_isalnum(s, c) (((s)->ctype+1)[(uchar) (c)] & (_MY_U | _MY_L | _MY_NMR)) +#define my_isspace(s, c) (((s)->ctype+1)[(uchar) (c)] & _MY_SPC) +#define my_ispunct(s, c) (((s)->ctype+1)[(uchar) (c)] & _MY_PNT) +#define my_isprint(s, c) (((s)->ctype+1)[(uchar) (c)] & (_MY_PNT | _MY_U | _MY_L | _MY_NMR | _MY_B)) +#define my_isgraph(s, c) (((s)->ctype+1)[(uchar) (c)] & (_MY_PNT | _MY_U | _MY_L | _MY_NMR)) +#define my_iscntrl(s, c) (((s)->ctype+1)[(uchar) (c)] & _MY_CTR) + +/* Some macros that should be cleaned up a little */ +#define my_isvar(s,c) (my_isalnum(s,c) || (c) == '_') +#define my_isvar_start(s,c) (my_isalpha(s,c) || (c) == '_') + +#define my_binary_compare(s) ((s)->state & MY_CS_BINSORT) +#define use_strnxfrm(s) ((s)->state & MY_CS_STRNXFRM) +#define my_strnxfrm(cs, d, dl, s, sl) \ + ((cs)->coll->strnxfrm((cs), (d), (dl), (dl), (s), (sl), MY_STRXFRM_PAD_WITH_SPACE)) +#define my_strnncoll(s, a, b, c, d) ((s)->coll->strnncoll((s), (a), (b), (c), (d), 0)) +#define my_like_range(s, a, b, c, d, e, f, g, h, i, j) \ + ((s)->coll->like_range((s), (a), (b), (c), (d), (e), (f), (g), (h), (i), (j))) +#define my_wildcmp(cs,s,se,w,we,e,o,m) ((cs)->coll->wildcmp((cs),(s),(se),(w),(we),(e),(o),(m))) +#define my_strcasecmp(s, a, b) ((s)->coll->strcasecmp((s), (a), (b))) +#define my_charpos(cs, b, e, num) (cs)->cset->charpos((cs), (const char*) (b), (const char *)(e), (num)) + + +#define use_mb(s) ((s)->cset->ismbchar != NULL) +#define my_ismbchar(s, a, b) ((s)->cset->ismbchar((s), (a), (b))) +#ifdef USE_MB +#define my_mbcharlen(s, a) ((s)->cset->mbcharlen((s),(a))) +#else +#define my_mbcharlen(s, a) 1 +#endif + +#define my_caseup_str(s, a) ((s)->cset->caseup_str((s), (a))) +#define my_casedn_str(s, a) ((s)->cset->casedn_str((s), (a))) +#define my_strntol(s, a, b, c, d, e) ((s)->cset->strntol((s),(a),(b),(c),(d),(e))) +#define my_strntoul(s, a, b, c, d, e) ((s)->cset->strntoul((s),(a),(b),(c),(d),(e))) +#define my_strntoll(s, a, b, c, d, e) ((s)->cset->strntoll((s),(a),(b),(c),(d),(e))) +#define my_strntoull(s, a, b, c,d, e) ((s)->cset->strntoull((s),(a),(b),(c),(d),(e))) +#define my_strntod(s, a, b, c, d) ((s)->cset->strntod((s),(a),(b),(c),(d))) + + +/* XXX: still need to take care of this one */ +#ifdef MY_CHARSET_TIS620 +#error The TIS620 charset is broken at the moment. Tell tim to fix it. +#define USE_TIS620 +#include "t_ctype.h" +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* _m_ctype_h */ diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/m_string.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/m_string.h new file mode 100644 index 0000000..bb8bad4 --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/m_string.h @@ -0,0 +1,393 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* There may be prolems include all of theese. Try to test in + configure with ones are needed? */ + +/* This is needed for the definitions of strchr... on solaris */ + +#ifndef _m_string_h +#define _m_string_h +#ifndef __USE_GNU +#define __USE_GNU /* We want to use stpcpy */ +#endif +#if defined(HAVE_STRINGS_H) +#include +#endif +#if defined(HAVE_STRING_H) +#include +#endif + +/* need by my_vsnprintf */ +#include + +#ifdef _AIX +#undef HAVE_BCMP +#endif + +/* This is needed for the definitions of bzero... on solaris */ +#if defined(HAVE_STRINGS_H) +#include +#endif + +/* This is needed for the definitions of memcpy... on solaris */ +#if defined(HAVE_MEMORY_H) && !defined(__cplusplus) +#include +#endif + +#if !defined(HAVE_MEMCPY) && !defined(HAVE_MEMMOVE) +# define memcpy(d, s, n) bcopy ((s), (d), (n)) +# define memset(A,C,B) bfill((A),(B),(C)) +# define memmove(d, s, n) bmove ((d), (s), (n)) +#elif defined(HAVE_MEMMOVE) +# define bmove(d, s, n) memmove((d), (s), (n)) +#else +# define memmove(d, s, n) bmove((d), (s), (n)) /* our bmove */ +#endif + +/* Unixware 7 */ +#if !defined(HAVE_BFILL) +# define bfill(A,B,C) memset((A),(C),(B)) +# define bmove_align(A,B,C) memcpy((A),(B),(C)) +#endif + +#if !defined(HAVE_BCMP) +# define bcopy(s, d, n) memcpy((d), (s), (n)) +# define bcmp(A,B,C) memcmp((A),(B),(C)) +# define bzero(A,B) memset((A),0,(B)) +# define bmove_align(A,B,C) memcpy((A),(B),(C)) +#endif + +#if defined(__cplusplus) +extern "C" { +#endif + +/* + my_str_malloc() and my_str_free() are assigned to implementations in + strings/alloc.c, but can be overridden in the calling program. + */ +extern void *(*my_str_malloc)(size_t); +extern void (*my_str_free)(void *); + +#if defined(HAVE_STPCPY) +#define strmov(A,B) stpcpy((A),(B)) +#ifndef stpcpy +extern char *stpcpy(char *, const char *); /* For AIX with gcc 2.95.3 */ +#endif +#endif + +/* Declared in int2str() */ +extern char NEAR _dig_vec_upper[]; +extern char NEAR _dig_vec_lower[]; + +#ifdef BAD_STRING_COMPILER +#define strmov(A,B) (memccpy(A,B,0,INT_MAX)-1) +#else +#define strmov_overlapp(A,B) strmov(A,B) +#define strmake_overlapp(A,B,C) strmake(A,B,C) +#endif + +#ifdef BAD_MEMCPY /* Problem with gcc on Alpha */ +#define memcpy_fixed(A,B,C) bmove((A),(B),(C)) +#else +#define memcpy_fixed(A,B,C) memcpy((A),(B),(C)) +#endif + +#if (!defined(USE_BMOVE512) || defined(HAVE_purify)) && !defined(bmove512) +#define bmove512(A,B,C) memcpy(A,B,C) +#endif + + /* Prototypes for string functions */ + +#if !defined(bfill) && !defined(HAVE_BFILL) +extern void bfill(uchar *dst,size_t len,pchar fill); +#endif + +#if !defined(bzero) && !defined(HAVE_BZERO) +extern void bzero(uchar * dst,size_t len); +#endif + +#if !defined(bcmp) && !defined(HAVE_BCMP) +extern size_t bcmp(const uchar *s1,const uchar *s2,size_t len); +#endif +#ifdef HAVE_purify +extern size_t my_bcmp(const uchar *s1,const uchar *s2,size_t len); +#undef bcmp +#define bcmp(A,B,C) my_bcmp((A),(B),(C)) +#define bzero_if_purify(A,B) bzero(A,B) +#else +#define bzero_if_purify(A,B) +#endif /* HAVE_purify */ + +#if defined(_lint) || defined(FORCE_INIT_OF_VARS) +#define LINT_INIT_STRUCT(var) bzero(&var, sizeof(var)) /* No uninitialize-warning */ +#else +#define LINT_INIT_STRUCT(var) +#endif + +#ifndef bmove512 +extern void bmove512(uchar *dst,const uchar *src,size_t len); +#endif + +#if !defined(HAVE_BMOVE) && !defined(bmove) +extern void bmove(uuchar *dst, const uchar *src,size_t len); +#endif + +extern void bmove_upp(uchar *dst,const uchar *src,size_t len); +extern void bchange(uchar *dst,size_t old_len,const uchar *src, + size_t new_len,size_t tot_len); +extern void strappend(char *s,size_t len,pchar fill); +extern char *strend(const char *s); +extern char *strcend(const char *, pchar); +extern char *strfield(char *src,int fields,int chars,int blanks, + int tabch); +extern char *strfill(char * s,size_t len,pchar fill); +extern size_t strinstr(const char *str,const char *search); +extern size_t r_strinstr(const char *str, size_t from, const char *search); +extern char *strkey(char *dst,char *head,char *tail,char *flags); +extern char *strmake(char *dst,const char *src,size_t length); +#ifndef strmake_overlapp +extern char *strmake_overlapp(char *dst,const char *src, size_t length); +#endif + +#ifndef strmov +extern char *strmov(char *dst,const char *src); +#endif +extern char *strnmov(char *dst,const char *src,size_t n); +extern char *strsuff(const char *src,const char *suffix); +extern char *strcont(const char *src,const char *set); +extern char *strxcat _VARARGS((char *dst,const char *src, ...)); +extern char *strxmov _VARARGS((char *dst,const char *src, ...)); +extern char *strxcpy _VARARGS((char *dst,const char *src, ...)); +extern char *strxncat _VARARGS((char *dst,size_t len, const char *src, ...)); +extern char *strxnmov _VARARGS((char *dst,size_t len, const char *src, ...)); +extern char *strxncpy _VARARGS((char *dst,size_t len, const char *src, ...)); + +/* Prototypes of normal stringfunctions (with may ours) */ + +#ifdef WANT_STRING_PROTOTYPES +extern char *strcat(char *, const char *); +extern char *strchr(const char *, pchar); +extern char *strrchr(const char *, pchar); +extern char *strcpy(char *, const char *); +extern int strcmp(const char *, const char *); +#ifndef __GNUC__ +extern size_t strlen(const char *); +#endif +#endif +#ifndef HAVE_STRNLEN +extern size_t strnlen(const char *s, size_t n); +#endif + +#if !defined(__cplusplus) +#ifndef HAVE_STRPBRK +extern char *strpbrk(const char *, const char *); +#endif +#ifndef HAVE_STRSTR +extern char *strstr(const char *, const char *); +#endif +#endif +extern int is_prefix(const char *, const char *); + +/* Conversion routines */ +typedef enum { + MY_GCVT_ARG_FLOAT, + MY_GCVT_ARG_DOUBLE +} my_gcvt_arg_type; + +double my_strtod(const char *str, char **end, int *error); +double my_atof(const char *nptr); +size_t my_fcvt(double x, int precision, char *to, my_bool *error); +size_t my_gcvt(double x, my_gcvt_arg_type type, int width, char *to, + my_bool *error); + +#define NOT_FIXED_DEC 31 + +/* + The longest string my_fcvt can return is 311 + "precision" bytes. + Here we assume that we never cal my_fcvt() with precision >= NOT_FIXED_DEC + (+ 1 byte for the terminating '\0'). +*/ +#define FLOATING_POINT_BUFFER (311 + NOT_FIXED_DEC) + +/* + We want to use the 'e' format in some cases even if we have enough space + for the 'f' one just to mimic sprintf("%.15g") behavior for large integers, + and to improve it for numbers < 10^(-4). + That is, for |x| < 1 we require |x| >= 10^(-15), and for |x| > 1 we require + it to be integer and be <= 10^DBL_DIG for the 'f' format to be used. + We don't lose precision, but make cases like "1e200" or "0.00001" look nicer. +*/ +#define MAX_DECPT_FOR_F_FORMAT DBL_DIG + +/* + The maximum possible field width for my_gcvt() conversion. + (DBL_DIG + 2) significant digits + sign + "." + ("e-NNN" or + MAX_DECPT_FOR_F_FORMAT zeros for cases when |x|<1 and the 'f' format is used). +*/ +#define MY_GCVT_MAX_FIELD_WIDTH (DBL_DIG + 4 + max(5, MAX_DECPT_FOR_F_FORMAT)) + + +extern char *llstr(longlong value,char *buff); +extern char *ullstr(longlong value,char *buff); +#ifndef HAVE_STRTOUL +extern long strtol(const char *str, char **ptr, int base); +extern ulong strtoul(const char *str, char **ptr, int base); +#endif + +extern char *int2str(long val, char *dst, int radix, int upcase); +extern char *int10_to_str(long val,char *dst,int radix); +extern char *str2int(const char *src,int radix,long lower,long upper, + long *val); +longlong my_strtoll10(const char *nptr, char **endptr, int *error); +#if SIZEOF_LONG == SIZEOF_LONG_LONG +#define ll2str(A,B,C,D) int2str((A),(B),(C),(D)) +#define longlong2str(A,B,C) int2str((A),(B),(C),1) +#define longlong10_to_str(A,B,C) int10_to_str((A),(B),(C)) +#undef strtoll +#define strtoll(A,B,C) strtol((A),(B),(C)) +#define strtoull(A,B,C) strtoul((A),(B),(C)) +#ifndef HAVE_STRTOULL +#define HAVE_STRTOULL +#endif +#ifndef HAVE_STRTOLL +#define HAVE_STRTOLL +#endif +#else +#ifdef HAVE_LONG_LONG +extern char *ll2str(longlong val,char *dst,int radix, int upcase); +#define longlong2str(A,B,C) ll2str((A),(B),(C),1) +extern char *longlong10_to_str(longlong val,char *dst,int radix); +#if (!defined(HAVE_STRTOULL) || defined(NO_STRTOLL_PROTO)) +extern longlong strtoll(const char *str, char **ptr, int base); +extern ulonglong strtoull(const char *str, char **ptr, int base); +#endif +#endif +#endif + +/* my_vsnprintf.c */ + +extern size_t my_vsnprintf(char *str, size_t n, + const char *format, va_list ap); +extern size_t my_snprintf(char *to, size_t n, const char *fmt, ...) + ATTRIBUTE_FORMAT(printf, 3, 4); + +#if defined(__cplusplus) +} +#endif + +/* + LEX_STRING -- a pair of a C-string and its length. + (it's part of the plugin API as a MYSQL_LEX_STRING) +*/ + +typedef struct st_mysql_lex_string LEX_STRING; + +#define STRING_WITH_LEN(X) (X), ((size_t) (sizeof(X) - 1)) +#define USTRING_WITH_LEN(X) ((uchar*) X), ((size_t) (sizeof(X) - 1)) +#define C_STRING_WITH_LEN(X) ((char *) (X)), ((size_t) (sizeof(X) - 1)) + +/* A variant with const */ +struct st_mysql_const_lex_string +{ + const char *str; + size_t length; +}; +typedef struct st_mysql_const_lex_string LEX_CSTRING; + +/* A variant with const and unsigned */ +struct st_mysql_const_unsigned_lex_string +{ + const uchar *str; + size_t length; +}; +typedef struct st_mysql_const_unsigned_lex_string LEX_CUSTRING; + +/* SPACE_INT is a word that contains only spaces */ +#if SIZEOF_INT == 4 +#define SPACE_INT 0x20202020 +#elif SIZEOF_INT == 8 +#define SPACE_INT 0x2020202020202020 +#else +#error define the appropriate constant for a word full of spaces +#endif + +/** + Skip trailing space. + + On most systems reading memory in larger chunks (ideally equal to the size of + the chinks that the machine physically reads from memory) causes fewer memory + access loops and hence increased performance. + This is why the 'int' type is used : it's closest to that (according to how + it's defined in C). + So when we determine the amount of whitespace at the end of a string we do + the following : + 1. We divide the string into 3 zones : + a) from the start of the string (__start) to the first multiple + of sizeof(int) (__start_words) + b) from the end of the string (__end) to the last multiple of sizeof(int) + (__end_words) + c) a zone that is aligned to sizeof(int) and can be safely accessed + through an int * + 2. We start comparing backwards from (c) char-by-char. If all we find is + space then we continue + 3. If there are elements in zone (b) we compare them as unsigned ints to a + int mask (SPACE_INT) consisting of all spaces + 4. Finally we compare the remaining part (a) of the string char by char. + This covers for the last non-space unsigned int from 3. (if any) + + This algorithm works well for relatively larger strings, but it will slow + the things down for smaller strings (because of the additional calculations + and checks compared to the naive method). Thus the barrier of length 20 + is added. + + @param ptr pointer to the input string + @param len the length of the string + @return the last non-space character +*/ + +static inline const uchar *skip_trailing_space(const uchar *ptr,size_t len) +{ + const uchar *end= ptr + len; + + if (len > 20) + { + const uchar *end_words= (const uchar *)(intptr) + (((ulonglong)(intptr)end) / SIZEOF_INT * SIZEOF_INT); + const uchar *start_words= (const uchar *)(intptr) + ((((ulonglong)(intptr)ptr) + SIZEOF_INT - 1) / SIZEOF_INT * SIZEOF_INT); + + DBUG_ASSERT(((ulonglong)(intptr)ptr) >= SIZEOF_INT); + if (end_words > ptr) + { + while (end > end_words && end[-1] == 0x20) + end--; + if (end[-1] == 0x20 && start_words < end_words) + while (end > start_words && ((unsigned *)end)[-1] == SPACE_INT) + end -= SIZEOF_INT; + } + } + while (end > ptr && end[-1] == 0x20) + end--; + return (end); +} + +#ifdef SAFEMALLOC +#define TRASH(A,B) bfill(A, B, 0x8F) +#else +#define TRASH(A,B) /* nothing */ +#endif /* SAFEMALLOC */ + +#endif /* _m_string_h */ diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/my_aes.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_aes.h new file mode 100644 index 0000000..8ea128c --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_aes.h @@ -0,0 +1,65 @@ +/* Copyright (C) 2002 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + + +/* Header file for my_aes.c */ +/* Wrapper to give simple interface for MySQL to AES standard encryption */ + +#include "mysys/rijndael.h" + +C_MODE_START + +#define AES_KEY_LENGTH 128 /* Must be 128 192 or 256 */ + +/* + my_aes_encrypt - Crypt buffer with AES encryption algorithm. + source - Pointer to data for encryption + source_length - size of encryption data + dest - buffer to place encrypted data (must be large enough) + key - Key to be used for encryption + kel_length - Length of the key. Will handle keys of any length + + returns - size of encrypted data, or negative in case of error. +*/ + +int my_aes_encrypt(const char *source, int source_length, char *dest, + const char *key, int key_length); + +/* + my_aes_decrypt - DeCrypt buffer with AES encryption algorithm. + source - Pointer to data for decryption + source_length - size of encrypted data + dest - buffer to place decrypted data (must be large enough) + key - Key to be used for decryption + kel_length - Length of the key. Will handle keys of any length + + returns - size of original data, or negative in case of error. +*/ + + +int my_aes_decrypt(const char *source, int source_length, char *dest, + const char *key, int key_length); + +/* + my_aes_get_size - get size of buffer which will be large enough for encrypted + data + source_length - length of data to be encrypted + + returns - size of buffer required to store encrypted data +*/ + +int my_aes_get_size(int source_length); + +C_MODE_END diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/my_alarm.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_alarm.h new file mode 100644 index 0000000..dd2d564 --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_alarm.h @@ -0,0 +1,58 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* + File to include when we want to use alarm or a loop_counter to display + some information when a program is running +*/ +#ifndef _my_alarm_h +#define _my_alarm_h +#ifdef __cplusplus +extern "C" { +#endif + +extern int volatile my_have_got_alarm; +extern ulong my_time_to_wait_for_lock; + +#if defined(HAVE_ALARM) && !defined(NO_ALARM_LOOP) +#include +#define ALARM_VARIABLES uint alarm_old=0; \ + sig_return alarm_signal=0 +#define ALARM_INIT my_have_got_alarm=0 ; \ + alarm_old=(uint) alarm(MY_HOW_OFTEN_TO_ALARM); \ + alarm_signal=signal(SIGALRM,my_set_alarm_variable); +#define ALARM_END (void) signal(SIGALRM,alarm_signal); \ + (void) alarm(alarm_old); +#define ALARM_TEST my_have_got_alarm +#ifdef DONT_REMEMBER_SIGNAL +#define ALARM_REINIT (void) alarm(MY_HOW_OFTEN_TO_ALARM); \ + (void) signal(SIGALRM,my_set_alarm_variable);\ + my_have_got_alarm=0; +#else +#define ALARM_REINIT (void) alarm((uint) MY_HOW_OFTEN_TO_ALARM); \ + my_have_got_alarm=0; +#endif /* DONT_REMEMBER_SIGNAL */ +#else +#define ALARM_VARIABLES long alarm_pos=0,alarm_end_pos=MY_HOW_OFTEN_TO_WRITE-1 +#define ALARM_INIT +#define ALARM_END +#define ALARM_TEST (alarm_pos++ >= alarm_end_pos) +#define ALARM_REINIT alarm_end_pos+=MY_HOW_OFTEN_TO_WRITE +#endif /* HAVE_ALARM */ + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/my_alloc.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_alloc.h new file mode 100644 index 0000000..6ade4d0 --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_alloc.h @@ -0,0 +1,51 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* + Data structures for mysys/my_alloc.c (root memory allocator) +*/ + +#ifndef _my_alloc_h +#define _my_alloc_h + +#define ALLOC_MAX_BLOCK_TO_DROP 4096 +#define ALLOC_MAX_BLOCK_USAGE_BEFORE_DROP 10 + +typedef struct st_used_mem +{ /* struct for once_alloc (block) */ + struct st_used_mem *next; /* Next block in use */ + size_t left; /* memory left in block */ + size_t size; /* size of block */ +} USED_MEM; + + +typedef struct st_mem_root +{ + USED_MEM *free; /* blocks with free memory in it */ + USED_MEM *used; /* blocks almost without free memory */ + USED_MEM *pre_alloc; /* preallocated block */ + /* if block have less memory it will be put in 'used' list */ + size_t min_malloc; + size_t block_size; /* initial block size */ + unsigned int block_num; /* allocated blocks counter */ + /* + first free block in queue test counter (if it exceed + MAX_BLOCK_USAGE_BEFORE_DROP block will be dropped in 'used' list) + */ + unsigned int first_block_usage; + + void (*error_handler)(void); +} MEM_ROOT; +#endif diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/my_atomic.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_atomic.h new file mode 100644 index 0000000..40b8895 --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_atomic.h @@ -0,0 +1,254 @@ +/* Copyright (C) 2006 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* + This header defines five atomic operations: + + my_atomic_add#(&var, what) + add 'what' to *var, and return the old value of *var + + my_atomic_fas#(&var, what) + 'Fetch And Store' + store 'what' in *var, and return the old value of *var + + my_atomic_cas#(&var, &old, new) + 'Compare And Swap' + if *var is equal to *old, then store 'new' in *var, and return TRUE + otherwise store *var in *old, and return FALSE + + my_atomic_load#(&var) + return *var + + my_atomic_store#(&var, what) + store 'what' in *var + + '#' is substituted by a size suffix - 8, 16, 32, or ptr + (e.g. my_atomic_add8, my_atomic_fas32, my_atomic_casptr). + + NOTE This operations are not always atomic, so they always must be + enclosed in my_atomic_rwlock_rdlock(lock)/my_atomic_rwlock_rdunlock(lock) + or my_atomic_rwlock_wrlock(lock)/my_atomic_rwlock_wrunlock(lock). + Hint: if a code block makes intensive use of atomic ops, it make sense + to take/release rwlock once for the whole block, not for every statement. + + On architectures where these operations are really atomic, rwlocks will + be optimized away. + 8- and 16-bit atomics aren't implemented for windows (see generic-msvc.h), + but can be added, if necessary. +*/ + +#ifndef my_atomic_rwlock_init + +#define intptr void * + +#ifndef MY_ATOMIC_MODE_RWLOCKS +#include "atomic/nolock.h" +#endif + +#ifndef make_atomic_cas_body +/* nolock.h was not able to generate even a CAS function, fall back */ +#include "atomic/rwlock.h" +#else +/* define missing functions by using the already generated ones */ +#ifndef make_atomic_add_body +#define make_atomic_add_body(S) \ + int ## S tmp=*a; \ + while (!my_atomic_cas ## S(a, &tmp, tmp+v)); \ + v=tmp; +#endif +#ifndef make_atomic_fas_body +#define make_atomic_fas_body(S) \ + int ## S tmp=*a; \ + while (!my_atomic_cas ## S(a, &tmp, v)); \ + v=tmp; +#endif +#ifndef make_atomic_load_body +#define make_atomic_load_body(S) \ + ret= 0; /* avoid compiler warning */ \ + (void)(my_atomic_cas ## S(a, &ret, ret)); +#endif +#ifndef make_atomic_store_body +#define make_atomic_store_body(S) \ + (void)(my_atomic_fas ## S (a, v)); +#endif +#endif + +/* + transparent_union doesn't work in g++ + Bug ? + + Darwin's gcc doesn't want to put pointers in a transparent_union + when built with -arch ppc64. Complains: + warning: 'transparent_union' attribute ignored +*/ +#if defined(__GNUC__) && !defined(__cplusplus) && \ + ! (defined(__APPLE__) && defined(_ARCH_PPC64)) +/* + we want to be able to use my_atomic_xxx functions with + both signed and unsigned integers. But gcc will issue a warning + "passing arg N of `my_atomic_XXX' as [un]signed due to prototype" + if the signedness of the argument doesn't match the prototype, or + "pointer targets in passing argument N of my_atomic_XXX differ in signedness" + if int* is used where uint* is expected (or vice versa). + Let's shut these warnings up +*/ +#define make_transparent_unions(S) \ + typedef union { \ + int ## S i; \ + uint ## S u; \ + } U_ ## S __attribute__ ((transparent_union)); \ + typedef union { \ + int ## S volatile *i; \ + uint ## S volatile *u; \ + } Uv_ ## S __attribute__ ((transparent_union)); +#define uintptr intptr +make_transparent_unions(8) +make_transparent_unions(16) +make_transparent_unions(32) +make_transparent_unions(ptr) +#undef uintptr +#undef make_transparent_unions +#define a U_a.i +#define cmp U_cmp.i +#define v U_v.i +#define set U_set.i +#else +#define U_32 int32 +#define U_ptr intptr +#define Uv_32 int32 +#define Uv_ptr intptr +#define U_a volatile *a +#define U_cmp *cmp +#define U_v v +#define U_set set +#endif /* __GCC__ transparent_union magic */ + +#ifdef HAVE_INLINE + +#define make_atomic_cas(S) \ +STATIC_INLINE int my_atomic_cas ## S(Uv_ ## S U_a, \ + Uv_ ## S U_cmp, U_ ## S U_set) \ +{ \ + int8 ret; \ + make_atomic_cas_body(S); \ + return ret; \ +} + +#define make_atomic_add(S) \ +STATIC_INLINE int ## S my_atomic_add ## S( \ + Uv_ ## S U_a, U_ ## S U_v) \ +{ \ + make_atomic_add_body(S); \ + return v; \ +} + +#define make_atomic_fas(S) \ +STATIC_INLINE int ## S my_atomic_fas ## S( \ + Uv_ ## S U_a, U_ ## S U_v) \ +{ \ + make_atomic_fas_body(S); \ + return v; \ +} + +#define make_atomic_load(S) \ +STATIC_INLINE int ## S my_atomic_load ## S(Uv_ ## S U_a) \ +{ \ + int ## S ret; \ + make_atomic_load_body(S); \ + return ret; \ +} + +#define make_atomic_store(S) \ +STATIC_INLINE void my_atomic_store ## S( \ + Uv_ ## S U_a, U_ ## S U_v) \ +{ \ + make_atomic_store_body(S); \ +} + +#else /* no inline functions */ + +#define make_atomic_add(S) \ +extern int ## S my_atomic_add ## S(Uv_ ## S U_a, U_ ## S U_v); + +#define make_atomic_fas(S) \ +extern int ## S my_atomic_fas ## S(Uv_ ## S U_a, U_ ## S U_v); + +#define make_atomic_cas(S) \ +extern int my_atomic_cas ## S(Uv_ ## S U_a, Uv_ ## S U_cmp, U_ ## S U_set); + +#define make_atomic_load(S) \ +extern int ## S my_atomic_load ## S(Uv_ ## S U_a); + +#define make_atomic_store(S) \ +extern void my_atomic_store ## S(Uv_ ## S U_a, U_ ## S U_v); + +#endif + +make_atomic_cas(32) +make_atomic_cas(ptr) + +make_atomic_add(32) + +make_atomic_load(32) +make_atomic_load(ptr) + +make_atomic_fas(32) +make_atomic_fas(ptr) + +make_atomic_store(32) +make_atomic_store(ptr) + +#ifdef _atomic_h_cleanup_ +#include _atomic_h_cleanup_ +#undef _atomic_h_cleanup_ +#endif + +#undef U_32 +#undef U_ptr +#undef a +#undef cmp +#undef v +#undef set +#undef U_a +#undef U_cmp +#undef U_v +#undef U_set +#undef make_atomic_add +#undef make_atomic_cas +#undef make_atomic_load +#undef make_atomic_store +#undef make_atomic_fas +#undef make_atomic_add_body +#undef make_atomic_cas_body +#undef make_atomic_load_body +#undef make_atomic_store_body +#undef make_atomic_fas_body +#undef intptr + +/* + the macro below defines (as an expression) the code that + will be run in spin-loops. Intel manuals recummend to have PAUSE there. + It is expected to be defined in include/atomic/ *.h files +*/ +#ifndef LF_BACKOFF +#define LF_BACKOFF (1) +#endif + +#define MY_ATOMIC_OK 0 +#define MY_ATOMIC_NOT_1CPU 1 +extern int my_atomic_initialize(); + +#endif + diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/my_attribute.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_attribute.h new file mode 100644 index 0000000..8309d85 --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_attribute.h @@ -0,0 +1,63 @@ +/* Copyright (C) 2000-2003 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* + Helper macros used for setting different __attributes__ + on functions in a portable fashion +*/ + +#ifndef _my_attribute_h +#define _my_attribute_h + +/* + Disable __attribute__() on gcc < 2.7, g++ < 3.4, and non-gcc compilers. + Some forms of __attribute__ are actually supported in earlier versions of + g++, but we just disable them all because we only use them to generate + compilation warnings. +*/ +#ifndef __attribute__ +# if !defined(__GNUC__) +# define __attribute__(A) +# elif GCC_VERSION < 2008 +# define __attribute__(A) +# elif defined(__cplusplus) && GCC_VERSION < 3004 +# define __attribute__(A) +# endif +#endif + +/* + __attribute__((format(...))) is only supported in gcc >= 2.8 and g++ >= 3.4 + But that's already covered by the __attribute__ tests above, so this is + just a convenience macro. +*/ +#ifndef ATTRIBUTE_FORMAT +# define ATTRIBUTE_FORMAT(style, m, n) __attribute__((format(style, m, n))) +#endif + +/* + + __attribute__((format(...))) on a function pointer is not supported + until gcc 3.1 +*/ +#ifndef ATTRIBUTE_FORMAT_FPTR +# if (GCC_VERSION >= 3001) +# define ATTRIBUTE_FORMAT_FPTR(style, m, n) ATTRIBUTE_FORMAT(style, m, n) +# else +# define ATTRIBUTE_FORMAT_FPTR(style, m, n) +# endif /* GNUC >= 3.1 */ +#endif + + +#endif diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/my_base.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_base.h new file mode 100644 index 0000000..e228b39 --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_base.h @@ -0,0 +1,626 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* This file includes constants used with all databases */ + +#ifndef _my_base_h +#define _my_base_h + +#ifndef stdin /* Included first in handler */ +#define CHSIZE_USED +#include +#include /* This includes types */ +#include +#include +#include + +#ifndef EOVERFLOW +#define EOVERFLOW 84 +#endif + +#if !defined(USE_MY_FUNC) && !defined(THREAD) +#include /* For faster code, after test */ +#endif /* USE_MY_FUNC */ +#endif /* stdin */ +#include + +/* The following is bits in the flag parameter to ha_open() */ + +#define HA_OPEN_ABORT_IF_LOCKED 0 /* default */ +#define HA_OPEN_WAIT_IF_LOCKED 1 +#define HA_OPEN_IGNORE_IF_LOCKED 2 +#define HA_OPEN_TMP_TABLE 4 /* Table is a temp table */ +#define HA_OPEN_DELAY_KEY_WRITE 8 /* Don't update index */ +#define HA_OPEN_ABORT_IF_CRASHED 16 +#define HA_OPEN_FOR_REPAIR 32 /* open even if crashed */ +#define HA_OPEN_FROM_SQL_LAYER 64 +#define HA_OPEN_MMAP 128 /* open memory mapped */ +#define HA_OPEN_COPY 256 /* Open copy (for repair) */ +/* Internal temp table, used for temporary results */ +#define HA_OPEN_INTERNAL_TABLE 512 + +/* The following is parameter to ha_rkey() how to use key */ + +/* + We define a complete-field prefix of a key value as a prefix where + the last included field in the prefix contains the full field, not + just some bytes from the start of the field. A partial-field prefix + is allowed to contain only a few first bytes from the last included + field. + + Below HA_READ_KEY_EXACT, ..., HA_READ_BEFORE_KEY can take a + complete-field prefix of a key value as the search + key. HA_READ_PREFIX and HA_READ_PREFIX_LAST could also take a + partial-field prefix, but currently (4.0.10) they are only used with + complete-field prefixes. MySQL uses a padding trick to implement + LIKE 'abc%' queries. + + NOTE that in InnoDB HA_READ_PREFIX_LAST will NOT work with a + partial-field prefix because InnoDB currently strips spaces from the + end of varchar fields! +*/ + +enum ha_rkey_function { + HA_READ_KEY_EXACT, /* Find first record else error */ + HA_READ_KEY_OR_NEXT, /* Record or next record */ + HA_READ_KEY_OR_PREV, /* Record or previous */ + HA_READ_AFTER_KEY, /* Find next rec. after key-record */ + HA_READ_BEFORE_KEY, /* Find next rec. before key-record */ + HA_READ_PREFIX, /* Key which as same prefix */ + HA_READ_PREFIX_LAST, /* Last key with the same prefix */ + HA_READ_PREFIX_LAST_OR_PREV, /* Last or prev key with the same prefix */ + HA_READ_MBR_CONTAIN, + HA_READ_MBR_INTERSECT, + HA_READ_MBR_WITHIN, + HA_READ_MBR_DISJOINT, + HA_READ_MBR_EQUAL +}; + + /* Key algorithm types */ + +enum ha_key_alg { + HA_KEY_ALG_UNDEF= 0, /* Not specified (old file) */ + HA_KEY_ALG_BTREE= 1, /* B-tree, default one */ + HA_KEY_ALG_RTREE= 2, /* R-tree, for spatial searches */ + HA_KEY_ALG_HASH= 3, /* HASH keys (HEAP tables) */ + HA_KEY_ALG_FULLTEXT= 4 /* FULLTEXT (MyISAM tables) */ +}; + + /* Index and table build methods */ + +enum ha_build_method { + HA_BUILD_DEFAULT, + HA_BUILD_ONLINE, + HA_BUILD_OFFLINE +}; + + /* Storage media types */ + +enum ha_storage_media { + HA_SM_DEFAULT= 0, /* Not specified (engine default) */ + HA_SM_DISK= 1, /* DISK storage */ + HA_SM_MEMORY= 2 /* MAIN MEMORY storage */ +}; + + /* The following is parameter to ha_extra() */ + +enum ha_extra_function { + HA_EXTRA_NORMAL=0, /* Optimize for space (def) */ + HA_EXTRA_QUICK=1, /* Optimize for speed */ + HA_EXTRA_NOT_USED=2, + HA_EXTRA_CACHE=3, /* Cache record in HA_rrnd() */ + HA_EXTRA_NO_CACHE=4, /* End caching of records (def) */ + HA_EXTRA_NO_READCHECK=5, /* No readcheck on update */ + HA_EXTRA_READCHECK=6, /* Use readcheck (def) */ + HA_EXTRA_KEYREAD=7, /* Read only key to database */ + HA_EXTRA_NO_KEYREAD=8, /* Normal read of records (def) */ + HA_EXTRA_NO_USER_CHANGE=9, /* No user is allowed to write */ + HA_EXTRA_KEY_CACHE=10, + HA_EXTRA_NO_KEY_CACHE=11, + HA_EXTRA_WAIT_LOCK=12, /* Wait until file is avalably (def) */ + HA_EXTRA_NO_WAIT_LOCK=13, /* If file is locked, return quickly */ + HA_EXTRA_WRITE_CACHE=14, /* Use write cache in ha_write() */ + HA_EXTRA_FLUSH_CACHE=15, /* flush write_record_cache */ + HA_EXTRA_NO_KEYS=16, /* Remove all update of keys */ + HA_EXTRA_KEYREAD_CHANGE_POS=17, /* Keyread, but change pos */ + /* xxxxchk -r must be used */ + HA_EXTRA_REMEMBER_POS=18, /* Remember pos for next/prev */ + HA_EXTRA_RESTORE_POS=19, + HA_EXTRA_REINIT_CACHE=20, /* init cache from current record */ + HA_EXTRA_FORCE_REOPEN=21, /* Datafile have changed on disk */ + HA_EXTRA_FLUSH, /* Flush tables to disk */ + HA_EXTRA_NO_ROWS, /* Don't write rows */ + HA_EXTRA_RESET_STATE, /* Reset positions */ + HA_EXTRA_IGNORE_DUP_KEY, /* Dup keys don't rollback everything*/ + HA_EXTRA_NO_IGNORE_DUP_KEY, + HA_EXTRA_PREPARE_FOR_DROP, + HA_EXTRA_PREPARE_FOR_UPDATE, /* Remove read cache if problems */ + HA_EXTRA_PRELOAD_BUFFER_SIZE, /* Set buffer size for preloading */ + /* + On-the-fly switching between unique and non-unique key inserting. + */ + HA_EXTRA_CHANGE_KEY_TO_UNIQUE, + HA_EXTRA_CHANGE_KEY_TO_DUP, + /* + When using HA_EXTRA_KEYREAD, overwrite only key member fields and keep + other fields intact. When this is off (by default) InnoDB will use memcpy + to overwrite entire row. + */ + HA_EXTRA_KEYREAD_PRESERVE_FIELDS, + HA_EXTRA_MMAP, + /* + Ignore if the a tuple is not found, continue processing the + transaction and ignore that 'row'. Needed for idempotency + handling on the slave + + Currently only used by NDB storage engine. Partition handler ignores flag. + */ + HA_EXTRA_IGNORE_NO_KEY, + HA_EXTRA_NO_IGNORE_NO_KEY, + /* + Mark the table as a log table. For some handlers (e.g. CSV) this results + in a special locking for the table. + */ + HA_EXTRA_MARK_AS_LOG_TABLE, + /* + Informs handler that write_row() which tries to insert new row into the + table and encounters some already existing row with same primary/unique + key can replace old row with new row instead of reporting error (basically + it informs handler that we do REPLACE instead of simple INSERT). + Off by default. + */ + HA_EXTRA_WRITE_CAN_REPLACE, + HA_EXTRA_WRITE_CANNOT_REPLACE, + /* + Inform handler that delete_row()/update_row() cannot batch deletes/updates + and should perform them immediately. This may be needed when table has + AFTER DELETE/UPDATE triggers which access to subject table. + These flags are reset by the handler::extra(HA_EXTRA_RESET) call. + */ + HA_EXTRA_DELETE_CANNOT_BATCH, + HA_EXTRA_UPDATE_CANNOT_BATCH, + /* + Inform handler that an "INSERT...ON DUPLICATE KEY UPDATE" will be + executed. This condition is unset by HA_EXTRA_NO_IGNORE_DUP_KEY. + */ + HA_EXTRA_INSERT_WITH_UPDATE, + /* Inform handler that we will do a rename */ + HA_EXTRA_PREPARE_FOR_RENAME, + /* + Special actions for MERGE tables. + */ + HA_EXTRA_ADD_CHILDREN_LIST, + HA_EXTRA_ATTACH_CHILDREN, + HA_EXTRA_IS_ATTACHED_CHILDREN, + HA_EXTRA_DETACH_CHILDREN, + HA_EXTRA_ORDERBY_LIMIT, + HA_EXTRA_NO_ORDERBY_LIMIT, + /* Inform handler we will force a close as part of flush */ + HA_EXTRA_PREPARE_FOR_FORCED_CLOSE, + HA_EXTRA_ALLOW_LOG_DELETE +}; + +/* Compatible option, to be deleted in 6.0 */ +#define HA_EXTRA_PREPARE_FOR_DELETE HA_EXTRA_PREPARE_FOR_DROP + + /* The following is parameter to ha_panic() */ + +enum ha_panic_function { + HA_PANIC_CLOSE, /* Close all databases */ + HA_PANIC_WRITE, /* Unlock and write status */ + HA_PANIC_READ /* Lock and read keyinfo */ +}; + + /* The following is parameter to ha_create(); keytypes */ + +enum ha_base_keytype { + HA_KEYTYPE_END=0, + HA_KEYTYPE_TEXT=1, /* Key is sorted as letters */ + HA_KEYTYPE_BINARY=2, /* Key is sorted as unsigned chars */ + HA_KEYTYPE_SHORT_INT=3, + HA_KEYTYPE_LONG_INT=4, + HA_KEYTYPE_FLOAT=5, + HA_KEYTYPE_DOUBLE=6, + HA_KEYTYPE_NUM=7, /* Not packed num with pre-space */ + HA_KEYTYPE_USHORT_INT=8, + HA_KEYTYPE_ULONG_INT=9, + HA_KEYTYPE_LONGLONG=10, + HA_KEYTYPE_ULONGLONG=11, + HA_KEYTYPE_INT24=12, + HA_KEYTYPE_UINT24=13, + HA_KEYTYPE_INT8=14, + /* Varchar (0-255 bytes) with length packed with 1 byte */ + HA_KEYTYPE_VARTEXT1=15, /* Key is sorted as letters */ + HA_KEYTYPE_VARBINARY1=16, /* Key is sorted as unsigned chars */ + /* Varchar (0-65535 bytes) with length packed with 2 bytes */ + HA_KEYTYPE_VARTEXT2=17, /* Key is sorted as letters */ + HA_KEYTYPE_VARBINARY2=18, /* Key is sorted as unsigned chars */ + HA_KEYTYPE_BIT=19 +}; + +#define HA_MAX_KEYTYPE 31 /* Must be log2-1 */ + +/* + These flags kan be OR:ed to key-flag + Note that these can only be up to 16 bits! +*/ + +#define HA_NOSAME 1 /* Set if not dupplicated records */ +#define HA_PACK_KEY 2 /* Pack string key to previous key */ +#define HA_AUTO_KEY 16 +#define HA_BINARY_PACK_KEY 32 /* Packing of all keys to prev key */ +#define HA_FULLTEXT 128 /* For full-text search */ +#define HA_UNIQUE_CHECK 256 /* Check the key for uniqueness */ +#define HA_SPATIAL 1024 /* For spatial search */ +#define HA_NULL_ARE_EQUAL 2048 /* NULL in key are cmp as equal */ +#define HA_GENERATED_KEY 8192 /* Automaticly generated key */ +#define HA_RTREE_INDEX 16384 /* For RTREE search */ + + /* The combination of the above can be used for key type comparison. */ +#define HA_KEYFLAG_MASK (HA_NOSAME | HA_PACK_KEY | HA_AUTO_KEY | \ + HA_BINARY_PACK_KEY | HA_FULLTEXT | HA_UNIQUE_CHECK | \ + HA_SPATIAL | HA_NULL_ARE_EQUAL | HA_GENERATED_KEY | \ + HA_RTREE_INDEX) + +#define HA_KEY_HAS_PART_KEY_SEG 65536 /* Key contains partial segments */ + + /* Automatic bits in key-flag */ + +#define HA_SPACE_PACK_USED 4 /* Test for if SPACE_PACK used */ +#define HA_VAR_LENGTH_KEY 8 +#define HA_NULL_PART_KEY 64 +#define HA_USES_COMMENT 4096 +#define HA_USES_PARSER 16384 /* Fulltext index uses [pre]parser */ +#define HA_USES_BLOCK_SIZE ((uint) 32768) +#define HA_SORT_ALLOWS_SAME 512 /* Intern bit when sorting records */ +#if MYSQL_VERSION_ID < 0x50200 +/* + Key has a part that can have end space. If this is an unique key + we have to handle it differently from other unique keys as we can find + many matching rows for one key (because end space are not compared) +*/ +#define HA_END_SPACE_KEY 0 /* was: 4096 */ +#else +#error HA_END_SPACE_KEY is obsolete, please remove it +#endif + + + /* These flags can be added to key-seg-flag */ + +#define HA_SPACE_PACK 1 /* Pack space in key-seg */ +#define HA_PART_KEY_SEG 4 /* Used by MySQL for part-key-cols */ +#define HA_VAR_LENGTH_PART 8 +#define HA_NULL_PART 16 +#define HA_BLOB_PART 32 +#define HA_SWAP_KEY 64 +#define HA_REVERSE_SORT 128 /* Sort key in reverse order */ +#define HA_NO_SORT 256 /* do not bother sorting on this keyseg */ +/* + End space in unique/varchar are considered equal. (Like 'a' and 'a ') + Only needed for internal temporary tables. +*/ +#define HA_END_SPACE_ARE_EQUAL 512 +#define HA_BIT_PART 1024 + + /* optionbits for database */ +#define HA_OPTION_PACK_RECORD 1 +#define HA_OPTION_PACK_KEYS 2 +#define HA_OPTION_COMPRESS_RECORD 4 +#define HA_OPTION_LONG_BLOB_PTR 8 /* new ISAM format */ +#define HA_OPTION_TMP_TABLE 16 +#define HA_OPTION_CHECKSUM 32 +#define HA_OPTION_DELAY_KEY_WRITE 64 +#define HA_OPTION_NO_PACK_KEYS 128 /* Reserved for MySQL */ +#define HA_OPTION_CREATE_FROM_ENGINE 256 +#define HA_OPTION_RELIES_ON_SQL_LAYER 512 +#define HA_OPTION_NULL_FIELDS 1024 +#define HA_OPTION_PAGE_CHECKSUM 2048 +#define HA_OPTION_TEMP_COMPRESS_RECORD (1L << 15) /* set by isamchk */ +#define HA_OPTION_READ_ONLY_DATA (1L << 16) /* Set by isamchk */ +#define HA_OPTION_NO_CHECKSUM (1L << 17) +#define HA_OPTION_NO_DELAY_KEY_WRITE (1L << 18) + + /* Bits in flag to create() */ + +#define HA_DONT_TOUCH_DATA 1 /* Don't empty datafile (isamchk) */ +#define HA_PACK_RECORD 2 /* Request packed record format */ +#define HA_CREATE_TMP_TABLE 4 +#define HA_CREATE_CHECKSUM 8 +#define HA_CREATE_KEEP_FILES 16 /* don't overwrite .MYD and MYI */ +#define HA_CREATE_PAGE_CHECKSUM 32 +#define HA_CREATE_DELAY_KEY_WRITE 64 +#define HA_CREATE_RELIES_ON_SQL_LAYER 128 + +/* + The following flags (OR-ed) are passed to handler::info() method. + The method copies misc handler information out of the storage engine + to data structures accessible from MySQL + + Same flags are also passed down to mi_status, myrg_status, etc. +*/ + +/* this one is not used */ +#define HA_STATUS_POS 1 +/* + assuming the table keeps shared actual copy of the 'info' and + local, possibly outdated copy, the following flag means that + it should not try to get the actual data (locking the shared structure) + slightly outdated version will suffice +*/ +#define HA_STATUS_NO_LOCK 2 +/* update the time of the last modification (in handler::update_time) */ +#define HA_STATUS_TIME 4 +/* + update the 'constant' part of the info: + handler::max_data_file_length, max_index_file_length, create_time + sortkey, ref_length, block_size, data_file_name, index_file_name. + handler::table->s->keys_in_use, keys_for_keyread, rec_per_key +*/ +#define HA_STATUS_CONST 8 +/* + update the 'variable' part of the info: + handler::records, deleted, data_file_length, index_file_length, + delete_length, check_time, mean_rec_length +*/ +#define HA_STATUS_VARIABLE 16 +/* + get the information about the key that caused last duplicate value error + update handler::errkey and handler::dupp_ref + see handler::get_dup_key() +*/ +#define HA_STATUS_ERRKEY 32 +/* + update handler::auto_increment_value +*/ +#define HA_STATUS_AUTO 64 + +/* + Errorcodes given by handler functions + + opt_sum_query() assumes these codes are > 1 + Do not add error numbers before HA_ERR_FIRST. + If necessary to add lower numbers, change HA_ERR_FIRST accordingly. +*/ +#define HA_ERR_FIRST 120 /* Copy of first error nr.*/ + +#define HA_ERR_KEY_NOT_FOUND 120 /* Didn't find key on read or update */ +#define HA_ERR_FOUND_DUPP_KEY 121 /* Dupplicate key on write */ +#define HA_ERR_INTERNAL_ERROR 122 /* Internal error */ +#define HA_ERR_RECORD_CHANGED 123 /* Uppdate with is recoverable */ +#define HA_ERR_WRONG_INDEX 124 /* Wrong index given to function */ +#define HA_ERR_CRASHED 126 /* Indexfile is crashed */ +#define HA_ERR_WRONG_IN_RECORD 127 /* Record-file is crashed */ +#define HA_ERR_OUT_OF_MEM 128 /* Record-file is crashed */ +#define HA_ERR_NOT_A_TABLE 130 /* not a MYI file - no signature */ +#define HA_ERR_WRONG_COMMAND 131 /* Command not supported */ +#define HA_ERR_OLD_FILE 132 /* old databasfile */ +#define HA_ERR_NO_ACTIVE_RECORD 133 /* No record read in update() */ +#define HA_ERR_RECORD_DELETED 134 /* A record is not there */ +#define HA_ERR_RECORD_FILE_FULL 135 /* No more room in file */ +#define HA_ERR_INDEX_FILE_FULL 136 /* No more room in file */ +#define HA_ERR_END_OF_FILE 137 /* end in next/prev/first/last */ +#define HA_ERR_UNSUPPORTED 138 /* unsupported extension used */ +#define HA_ERR_TO_BIG_ROW 139 /* Too big row */ +#define HA_WRONG_CREATE_OPTION 140 /* Wrong create option */ +#define HA_ERR_FOUND_DUPP_UNIQUE 141 /* Dupplicate unique on write */ +#define HA_ERR_UNKNOWN_CHARSET 142 /* Can't open charset */ +#define HA_ERR_WRONG_MRG_TABLE_DEF 143 /* conflicting tables in MERGE */ +#define HA_ERR_CRASHED_ON_REPAIR 144 /* Last (automatic?) repair failed */ +#define HA_ERR_CRASHED_ON_USAGE 145 /* Table must be repaired */ +#define HA_ERR_LOCK_WAIT_TIMEOUT 146 +#define HA_ERR_LOCK_TABLE_FULL 147 +#define HA_ERR_READ_ONLY_TRANSACTION 148 /* Updates not allowed */ +#define HA_ERR_LOCK_DEADLOCK 149 +#define HA_ERR_CANNOT_ADD_FOREIGN 150 /* Cannot add a foreign key constr. */ +#define HA_ERR_NO_REFERENCED_ROW 151 /* Cannot add a child row */ +#define HA_ERR_ROW_IS_REFERENCED 152 /* Cannot delete a parent row */ +#define HA_ERR_NO_SAVEPOINT 153 /* No savepoint with that name */ +#define HA_ERR_NON_UNIQUE_BLOCK_SIZE 154 /* Non unique key block size */ +#define HA_ERR_NO_SUCH_TABLE 155 /* The table does not exist in engine */ +#define HA_ERR_TABLE_EXIST 156 /* The table existed in storage engine */ +#define HA_ERR_NO_CONNECTION 157 /* Could not connect to storage engine */ +/* NULLs are not supported in spatial index */ +#define HA_ERR_NULL_IN_SPATIAL 158 +#define HA_ERR_TABLE_DEF_CHANGED 159 /* The table changed in storage engine */ +/* There's no partition in table for given value */ +#define HA_ERR_NO_PARTITION_FOUND 160 +#define HA_ERR_RBR_LOGGING_FAILED 161 /* Row-based binlogging of row failed */ +#define HA_ERR_DROP_INDEX_FK 162 /* Index needed in foreign key constr */ +/* + Upholding foreign key constraints would lead to a duplicate key error + in some other table. +*/ +#define HA_ERR_FOREIGN_DUPLICATE_KEY 163 +/* The table changed in storage engine */ +#define HA_ERR_TABLE_NEEDS_UPGRADE 164 +#define HA_ERR_TABLE_READONLY 165 /* The table is not writable */ + +#define HA_ERR_AUTOINC_READ_FAILED 166 /* Failed to get next autoinc value */ +#define HA_ERR_AUTOINC_ERANGE 167 /* Failed to set row autoinc value */ +#define HA_ERR_GENERIC 168 /* Generic error */ +/* row not actually updated: new values same as the old values */ +#define HA_ERR_RECORD_IS_THE_SAME 169 +/* It is not possible to log this statement */ +#define HA_ERR_LOGGING_IMPOSSIBLE 170 +#define HA_ERR_TABLESPACE_EXIST 171 +/* The event was corrupt, leading to illegal data being read */ +#define HA_ERR_CORRUPT_EVENT 172 +#define HA_ERR_NEW_FILE 173 /* New file format */ +/* The event could not be processed no other handler error happened */ +#define HA_ERR_ROWS_EVENT_APPLY 174 +#define HA_ERR_INITIALIZATION 175 /* Error during initialization */ +#define HA_ERR_FILE_TOO_SHORT 176 /* File too short */ +#define HA_ERR_WRONG_CRC 177 /* Wrong CRC on page */ +#define HA_ERR_LOCK_OR_ACTIVE_TRANSACTION 178 +#define HA_ERR_NO_SUCH_TABLESPACE 179 +#define HA_ERR_TABLESPACE_NOT_EMPTY 180 +#define HA_ERR_TABLESPACE_DATAFILE_EXIST 181 +#define HA_ERR_ROW_NOT_VISIBLE 182 +#define HA_ERR_LAST 182 /* Copy of last error nr */ + +/* Number of different errors */ +#define HA_ERR_ERRORS (HA_ERR_LAST - HA_ERR_FIRST + 1) + + /* Other constants */ + +#define HA_NAMELEN 64 /* Max length of saved filename */ +#define NO_SUCH_KEY (~(uint)0) /* used as a key no. */ + +typedef ulong key_part_map; +#define HA_WHOLE_KEY (~(key_part_map)0) + + /* Intern constants in databases */ + + /* bits in _search */ +#define SEARCH_FIND 1 +#define SEARCH_NO_FIND 2 +#define SEARCH_SAME 4 +#define SEARCH_BIGGER 8 +#define SEARCH_SMALLER 16 +#define SEARCH_SAVE_BUFF 32 +#define SEARCH_UPDATE 64 +#define SEARCH_PREFIX 128 +#define SEARCH_LAST 256 +#define MBR_CONTAIN 512 +#define MBR_INTERSECT 1024 +#define MBR_WITHIN 2048 +#define MBR_DISJOINT 4096 +#define MBR_EQUAL 8192 +#define MBR_DATA 16384 +#define SEARCH_NULL_ARE_EQUAL 32768 /* NULL in keys are equal */ +#define SEARCH_NULL_ARE_NOT_EQUAL 65536 /* NULL in keys are not equal */ +/* Use this when inserting a key in position order */ +#define SEARCH_INSERT SEARCH_NULL_ARE_NOT_EQUAL*2 +/* Only part of the key is specified while reading */ +#define SEARCH_PART_KEY SEARCH_INSERT*2 +/* Used when user key (key 2) contains transaction id's */ +#define SEARCH_USER_KEY_HAS_TRANSID SEARCH_PART_KEY*2 +/* Used when page key (key 1) contains transaction id's */ +#define SEARCH_PAGE_KEY_HAS_TRANSID SEARCH_USER_KEY_HAS_TRANSID*2 + + /* bits in opt_flag */ +#define QUICK_USED 1 +#define READ_CACHE_USED 2 +#define READ_CHECK_USED 4 +#define KEY_READ_USED 8 +#define WRITE_CACHE_USED 16 +#define OPT_NO_ROWS 32 + + /* bits in update */ +#define HA_STATE_CHANGED 1 /* Database has changed */ +#define HA_STATE_AKTIV 2 /* Has a current record */ +#define HA_STATE_WRITTEN 4 /* Record is written */ +#define HA_STATE_DELETED 8 +#define HA_STATE_NEXT_FOUND 16 /* Next found record (record before) */ +#define HA_STATE_PREV_FOUND 32 /* Prev found record (record after) */ +#define HA_STATE_NO_KEY 64 /* Last read didn't find record */ +#define HA_STATE_KEY_CHANGED 128 +#define HA_STATE_WRITE_AT_END 256 /* set in _ps_find_writepos */ +#define HA_STATE_BUFF_SAVED 512 /* If current keybuff is info->buff */ +#define HA_STATE_ROW_CHANGED 1024 /* To invalide ROW cache */ +#define HA_STATE_EXTEND_BLOCK 2048 +#define HA_STATE_RNEXT_SAME 4096 /* rnext_same occupied lastkey2 */ + +/* myisampack expects no more than 32 field types. */ +enum en_fieldtype { + FIELD_LAST=-1,FIELD_NORMAL,FIELD_SKIP_ENDSPACE,FIELD_SKIP_PRESPACE, + FIELD_SKIP_ZERO,FIELD_BLOB,FIELD_CONSTANT,FIELD_INTERVALL,FIELD_ZERO, + FIELD_VARCHAR,FIELD_CHECK, + FIELD_enum_val_count +}; + +enum data_file_type { + STATIC_RECORD, DYNAMIC_RECORD, COMPRESSED_RECORD, BLOCK_RECORD +}; + +/* For key ranges */ + +/* from -inf */ +#define NO_MIN_RANGE 1 + +/* to +inf */ +#define NO_MAX_RANGE 2 + +/* X < key, i.e. not including the left endpoint */ +#define NEAR_MIN 4 + +/* X > key, i.e. not including the right endpoint */ +#define NEAR_MAX 8 + +/* + This flag means that index is a unique index, and the interval is + equivalent to "AND(keypart_i = const_i)", where all of const_i are not NULLs. +*/ +#define UNIQUE_RANGE 16 + +/* + This flag means that the interval is equivalent to + "AND(keypart_i = const_i)", where not all key parts may be used but all of + const_i are not NULLs. +*/ +#define EQ_RANGE 32 + +/* + This flag has the same meaning as UNIQUE_RANGE, except that for at least + one keypart the condition is "keypart IS NULL". +*/ +#define NULL_RANGE 64 + +#define GEOM_FLAG 128 + +#define SKIP_RANGE 256 +#define EMPTY_RANGE 512 + +typedef struct st_key_range +{ + const uchar *key; + uint length; + key_part_map keypart_map; + enum ha_rkey_function flag; +} key_range; + +typedef struct st_key_multi_range +{ + key_range start_key; + key_range end_key; + char *ptr; /* Free to use by caller (ptr to row etc) */ + uint range_flag; /* key range flags see above */ +} KEY_MULTI_RANGE; + + +/* For number of records */ +#ifdef BIG_TABLES +#define rows2double(A) ulonglong2double(A) +typedef my_off_t ha_rows; +#else +#define rows2double(A) (double) (A) +typedef ulong ha_rows; +#endif + +#define HA_POS_ERROR (~ (ha_rows) 0) +#define HA_OFFSET_ERROR (~ (my_off_t) 0) + +#if SYSTEM_SIZEOF_OFF_T == 4 +#define MAX_FILE_SIZE INT_MAX32 +#else +#define MAX_FILE_SIZE LONGLONG_MAX +#endif + +#define HA_VARCHAR_PACKLENGTH(field_length) ((field_length) < 256 ? 1 :2) + +/* invalidator function reference for Query Cache */ +typedef void (* invalidator_by_filename)(const char * filename); + +#endif /* _my_base_h */ diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/my_bit.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_bit.h new file mode 100644 index 0000000..2e464e8 --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_bit.h @@ -0,0 +1,109 @@ +/* + Some useful bit functions +*/ + +C_MODE_START +#ifdef HAVE_INLINE + +extern const char _my_bits_nbits[256]; +extern const uchar _my_bits_reverse_table[256]; + +/* + Find smallest X in 2^X >= value + This can be used to divide a number with value by doing a shift instead +*/ + +STATIC_INLINE uint my_bit_log2(ulong value) +{ + uint bit; + for (bit=0 ; value > 1 ; value>>=1, bit++) ; + return bit; +} + +STATIC_INLINE uint my_count_bits(ulonglong v) +{ +#if SIZEOF_LONG_LONG > 4 + /* The following code is a bit faster on 16 bit machines than if we would + only shift v */ + ulong v2=(ulong) (v >> 32); + return (uint) (uchar) (_my_bits_nbits[(uchar) v] + + _my_bits_nbits[(uchar) (v >> 8)] + + _my_bits_nbits[(uchar) (v >> 16)] + + _my_bits_nbits[(uchar) (v >> 24)] + + _my_bits_nbits[(uchar) (v2)] + + _my_bits_nbits[(uchar) (v2 >> 8)] + + _my_bits_nbits[(uchar) (v2 >> 16)] + + _my_bits_nbits[(uchar) (v2 >> 24)]); +#else + return (uint) (uchar) (_my_bits_nbits[(uchar) v] + + _my_bits_nbits[(uchar) (v >> 8)] + + _my_bits_nbits[(uchar) (v >> 16)] + + _my_bits_nbits[(uchar) (v >> 24)]); +#endif +} + +STATIC_INLINE uint my_count_bits_ushort(ushort v) +{ + return _my_bits_nbits[v]; +} + + +/* + Next highest power of two + + SYNOPSIS + my_round_up_to_next_power() + v Value to check + + RETURN + Next or equal power of 2 + Note: 0 will return 0 + + NOTES + Algorithm by Sean Anderson, according to: + http://graphics.stanford.edu/~seander/bithacks.html + (Orignal code public domain) + + Comments shows how this works with 01100000000000000000000000001011 +*/ + +STATIC_INLINE uint32 my_round_up_to_next_power(uint32 v) +{ + v--; /* 01100000000000000000000000001010 */ + v|= v >> 1; /* 01110000000000000000000000001111 */ + v|= v >> 2; /* 01111100000000000000000000001111 */ + v|= v >> 4; /* 01111111110000000000000000001111 */ + v|= v >> 8; /* 01111111111111111100000000001111 */ + v|= v >> 16; /* 01111111111111111111111111111111 */ + return v+1; /* 10000000000000000000000000000000 */ +} + +STATIC_INLINE uint32 my_clear_highest_bit(uint32 v) +{ + uint32 w=v >> 1; + w|= w >> 1; + w|= w >> 2; + w|= w >> 4; + w|= w >> 8; + w|= w >> 16; + return v & w; +} + +STATIC_INLINE uint32 my_reverse_bits(uint32 key) +{ + return + (_my_bits_reverse_table[ key & 255] << 24) | + (_my_bits_reverse_table[(key>> 8) & 255] << 16) | + (_my_bits_reverse_table[(key>>16) & 255] << 8) | + _my_bits_reverse_table[(key>>24) ]; +} + +#else /* HAVE_INLINE */ +extern uint my_bit_log2(ulong value); +extern uint32 my_round_up_to_next_power(uint32 v); +uint32 my_clear_highest_bit(uint32 v); +uint32 my_reverse_bits(uint32 key); +extern uint my_count_bits(ulonglong v); +extern uint my_count_bits_ushort(ushort v); +#endif /* HAVE_INLINE */ +C_MODE_END diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/my_bitmap.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_bitmap.h new file mode 100644 index 0000000..d8c9a0c --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_bitmap.h @@ -0,0 +1,182 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef _my_bitmap_h_ +#define _my_bitmap_h_ + +#define MY_BIT_NONE (~(uint) 0) + +#include + +typedef uint32 my_bitmap_map; + +typedef struct st_bitmap +{ + my_bitmap_map *bitmap; + uint n_bits; /* number of bits occupied by the above */ + my_bitmap_map last_word_mask; + my_bitmap_map *last_word_ptr; + /* + mutex will be acquired for the duration of each bitmap operation if + thread_safe flag in bitmap_init was set. Otherwise, we optimize by not + acquiring the mutex + */ +#ifdef THREAD + pthread_mutex_t *mutex; +#endif +} MY_BITMAP; + +#ifdef __cplusplus +extern "C" { +#endif +extern void create_last_word_mask(MY_BITMAP *map); +extern my_bool bitmap_init(MY_BITMAP *map, my_bitmap_map *buf, uint n_bits, + my_bool thread_safe); +extern my_bool bitmap_is_clear_all(const MY_BITMAP *map); +extern my_bool bitmap_is_prefix(const MY_BITMAP *map, uint prefix_size); +extern my_bool bitmap_is_set_all(const MY_BITMAP *map); +extern my_bool bitmap_is_subset(const MY_BITMAP *map1, const MY_BITMAP *map2); +extern my_bool bitmap_is_overlapping(const MY_BITMAP *map1, + const MY_BITMAP *map2); +extern my_bool bitmap_test_and_set(MY_BITMAP *map, uint bitmap_bit); +extern my_bool bitmap_test_and_clear(MY_BITMAP *map, uint bitmap_bit); +extern my_bool bitmap_fast_test_and_set(MY_BITMAP *map, uint bitmap_bit); +extern uint bitmap_set_next(MY_BITMAP *map); +extern uint bitmap_get_first(const MY_BITMAP *map); +extern uint bitmap_get_first_set(const MY_BITMAP *map); +extern uint bitmap_bits_set(const MY_BITMAP *map); +extern void bitmap_free(MY_BITMAP *map); +extern void bitmap_set_above(MY_BITMAP *map, uint from_byte, uint use_bit); +extern void bitmap_set_prefix(MY_BITMAP *map, uint prefix_size); +extern void bitmap_intersect(MY_BITMAP *map, const MY_BITMAP *map2); +extern void bitmap_subtract(MY_BITMAP *map, const MY_BITMAP *map2); +extern void bitmap_union(MY_BITMAP *map, const MY_BITMAP *map2); +extern void bitmap_xor(MY_BITMAP *map, const MY_BITMAP *map2); +extern void bitmap_invert(MY_BITMAP *map); +extern void bitmap_copy(MY_BITMAP *map, const MY_BITMAP *map2); + +extern uint bitmap_lock_set_next(MY_BITMAP *map); +extern void bitmap_lock_clear_bit(MY_BITMAP *map, uint bitmap_bit); +#ifdef NOT_USED +extern uint bitmap_lock_bits_set(const MY_BITMAP *map); +extern my_bool bitmap_lock_is_set_all(const MY_BITMAP *map); +extern uint bitmap_lock_get_first(const MY_BITMAP *map); +extern uint bitmap_lock_get_first_set(const MY_BITMAP *map); +extern my_bool bitmap_lock_is_subset(const MY_BITMAP *map1, + const MY_BITMAP *map2); +extern my_bool bitmap_lock_is_prefix(const MY_BITMAP *map, uint prefix_size); +extern my_bool bitmap_lock_is_set(const MY_BITMAP *map, uint bitmap_bit); +extern my_bool bitmap_lock_is_clear_all(const MY_BITMAP *map); +extern my_bool bitmap_lock_cmp(const MY_BITMAP *map1, const MY_BITMAP *map2); +extern void bitmap_lock_set_all(MY_BITMAP *map); +extern void bitmap_lock_clear_all(MY_BITMAP *map); +extern void bitmap_lock_set_bit(MY_BITMAP *map, uint bitmap_bit); +extern void bitmap_lock_flip_bit(MY_BITMAP *map, uint bitmap_bit); +extern void bitmap_lock_set_prefix(MY_BITMAP *map, uint prefix_size); +extern void bitmap_lock_intersect(MY_BITMAP *map, const MY_BITMAP *map2); +extern void bitmap_lock_subtract(MY_BITMAP *map, const MY_BITMAP *map2); +extern void bitmap_lock_union(MY_BITMAP *map, const MY_BITMAP *map2); +extern void bitmap_lock_xor(MY_BITMAP *map, const MY_BITMAP *map2); +extern void bitmap_lock_invert(MY_BITMAP *map); +#endif +/* Fast, not thread safe, bitmap functions */ +#define bitmap_buffer_size(bits) (((bits)+31)/32)*4 +#define no_bytes_in_map(map) (((map)->n_bits + 7)/8) +#define no_words_in_map(map) (((map)->n_bits + 31)/32) +#define bytes_word_aligned(bytes) (4*((bytes + 3)/4)) +#define _bitmap_set_bit(MAP, BIT) (((uchar*)(MAP)->bitmap)[(BIT) / 8] \ + |= (1 << ((BIT) & 7))) +#define _bitmap_flip_bit(MAP, BIT) (((uchar*)(MAP)->bitmap)[(BIT) / 8] \ + ^= (1 << ((BIT) & 7))) +#define _bitmap_clear_bit(MAP, BIT) (((uchar*)(MAP)->bitmap)[(BIT) / 8] \ + &= ~ (1 << ((BIT) & 7))) +#define _bitmap_is_set(MAP, BIT) (uint) (((uchar*)(MAP)->bitmap)[(BIT) / 8] \ + & (1 << ((BIT) & 7))) +/* + WARNING! + + The below symbols are inline functions in DEBUG builds and macros in + non-DEBUG builds. The latter evaluate their 'bit' argument twice. + + NEVER use an increment/decrement operator with the 'bit' argument. + It would work with DEBUG builds, but fails later in production builds! + + FORBIDDEN: bitmap_set_bit($my_bitmap, (field++)->field_index); +*/ +#ifndef DBUG_OFF +static inline void +bitmap_set_bit(MY_BITMAP *map,uint bit) +{ + DBUG_ASSERT(bit < (map)->n_bits); + _bitmap_set_bit(map,bit); +} +static inline void +bitmap_flip_bit(MY_BITMAP *map,uint bit) +{ + DBUG_ASSERT(bit < (map)->n_bits); + _bitmap_flip_bit(map,bit); +} +static inline void +bitmap_clear_bit(MY_BITMAP *map,uint bit) +{ + DBUG_ASSERT(bit < (map)->n_bits); + _bitmap_clear_bit(map,bit); +} +static inline uint +bitmap_is_set(const MY_BITMAP *map,uint bit) +{ + DBUG_ASSERT(bit < (map)->n_bits); + return _bitmap_is_set(map,bit); +} +#else +#define bitmap_set_bit(MAP, BIT) _bitmap_set_bit(MAP, BIT) +#define bitmap_flip_bit(MAP, BIT) _bitmap_flip_bit(MAP, BIT) +#define bitmap_clear_bit(MAP, BIT) _bitmap_clear_bit(MAP, BIT) +#define bitmap_is_set(MAP, BIT) _bitmap_is_set(MAP, BIT) +#endif + +static inline my_bool bitmap_cmp(const MY_BITMAP *map1, const MY_BITMAP *map2) +{ + *(map1)->last_word_ptr|= (map1)->last_word_mask; + *(map2)->last_word_ptr|= (map2)->last_word_mask; + return memcmp((map1)->bitmap, (map2)->bitmap, 4*no_words_in_map((map1)))==0; +} + +#define bitmap_clear_all(MAP) \ + { memset((MAP)->bitmap, 0, 4*no_words_in_map((MAP))); } +#define bitmap_set_all(MAP) \ + (memset((MAP)->bitmap, 0xFF, 4*no_words_in_map((MAP)))) + +/** + check, set and clear a bit of interest of an integer. + + If the bit is out of range @retval -1. Otherwise + bit_is_set @return 0 or 1 reflecting the bit is set or not; + bit_do_set @return 1 (bit is set 1) + bit_do_clear @return 0 (bit is cleared to 0) +*/ + +#define bit_is_set(I,B) (sizeof(I) * CHAR_BIT > (B) ? \ + (((I) & (1ULL << (B))) == 0 ? 0 : 1) : -1) +#define bit_do_set(I,B) (sizeof(I) * CHAR_BIT > (B) ? \ + ((I) |= (1ULL << (B)), 1) : -1) +#define bit_do_clear(I,B) (sizeof(I) * CHAR_BIT > (B) ? \ + ((I) &= ~(1ULL << (B)), 0) : -1) + +#ifdef __cplusplus +} +#endif + +#endif /* _my_bitmap_h_ */ diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/my_charsets.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_charsets.h new file mode 100644 index 0000000..ecb0de9 --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_charsets.h @@ -0,0 +1,57 @@ +/* Copyright (C) 2008 Sun Microsystems, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* Character set configuration (hard-coded) */ +#define HAVE_CHARSET_armscii8 1 +#define HAVE_CHARSET_ascii 1 +#define HAVE_CHARSET_big5 1 +#define HAVE_CHARSET_cp1250 1 +#define HAVE_CHARSET_cp1251 1 +#define HAVE_CHARSET_cp1256 1 +#define HAVE_CHARSET_cp1257 1 +#define HAVE_CHARSET_cp850 1 +#define HAVE_CHARSET_cp852 1 +#define HAVE_CHARSET_cp866 1 +#define HAVE_CHARSET_cp932 1 +#define HAVE_CHARSET_dec8 1 +#define HAVE_CHARSET_eucjpms 1 +#define HAVE_CHARSET_euckr 1 +#define HAVE_CHARSET_gb2312 1 +#define HAVE_CHARSET_gbk 1 +#define HAVE_CHARSET_greek 1 +#define HAVE_CHARSET_hebrew 1 +#define HAVE_CHARSET_hp8 1 +#define HAVE_CHARSET_keybcs2 1 +#define HAVE_CHARSET_koi8r 1 +#define HAVE_CHARSET_koi8u 1 +#define HAVE_CHARSET_latin1 1 +#define HAVE_CHARSET_latin2 1 +#define HAVE_CHARSET_latin5 1 +#define HAVE_CHARSET_latin7 1 +#define HAVE_CHARSET_macce 1 +#define HAVE_CHARSET_macroman 1 +#define HAVE_CHARSET_sjis 1 +#define HAVE_CHARSET_swe7 1 +#define HAVE_CHARSET_tis620 1 +#define HAVE_CHARSET_ucs2 1 +#define HAVE_CHARSET_ujis 1 +#define HAVE_CHARSET_utf16 1 +#define HAVE_CHARSET_utf32 1 +#define HAVE_CHARSET_utf8mb3 1 +#define HAVE_CHARSET_utf8mb4 1 +#define HAVE_UCA_COLLATIONS 1 +#define MYSQL_DEFAULT_CHARSET_NAME "latin1" +#define MYSQL_DEFAULT_COLLATION_NAME "latin1_swedish_ci" +#define USE_MB 1 diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/my_config.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_config.h new file mode 100644 index 0000000..adea8db --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_config.h @@ -0,0 +1,295 @@ + +/* Headers we may want to use. */ +/* #undef HAVE_ALLOCA_H */ +/* #undef HAVE_ARPA_INET_H */ +/* #undef HAVE_CRYPT_H */ +/* #undef HAVE_DIRENT_H */ +/* #undef HAVE_EXECINFO_H */ +#define HAVE_FCNTL_H 1 +/* #undef HAVE_FENV_H */ +#define HAVE_FLOAT_H 1 +/* #undef HAVE_FPU_CONTROL_H */ +/* #undef HAVE_GRP_H */ +/* #undef HAVE_IEEEFP_H */ +#define HAVE_LIMITS_H 1 +#define HAVE_MALLOC_H 1 +#define HAVE_MEMORY_H 1 +/* #undef HAVE_NETINET_IN_H */ +/* #undef HAVE_PATHS_H */ +/* #undef HAVE_PWD_H */ +/* #undef HAVE_SCHED_H */ +/* #undef HAVE_SELECT_H */ +#define HAVE_STDDEF_H 1 +#define HAVE_STDLIB_H 1 +/* #undef HAVE_STRINGS_H */ +#define HAVE_STRING_H 1 +/* #undef HAVE_SYNCH_H */ +/* #undef HAVE_SYSENT_H */ +/* #undef HAVE_SYS_FPU_H */ +/* #undef HAVE_SYS_IOCTL_H */ +/* #undef HAVE_SYS_IPC_H */ +/* #undef HAVE_SYS_MMAN_H */ +/* #undef HAVE_SYS_PRCTL_H */ +/* #undef HAVE_SYS_SELECT_H */ +/* #undef HAVE_SYS_SHM_H */ +/* #undef HAVE_SYS_SOCKET_H */ +#define HAVE_SYS_STAT_H 1 +/* #undef HAVE_SYS_STREAM_H */ +#define HAVE_SYS_TIMEB_H 1 +#define HAVE_SYS_TYPES_H 1 +/* #undef HAVE_SYS_UN_H */ +/* #undef HAVE_TERMIOS_H */ +/* #undef HAVE_TERMIO_H */ +/* #undef HAVE_UNISTD_H */ +/* #undef HAVE_UTIME_H */ + +/* Functions we may want to use. */ +#define HAVE_ACCESS 1 +/* #undef HAVE_AIOWAIT */ +/* #undef HAVE_ALARM */ +/* #undef HAVE_ALLOCA */ +/* #undef HAVE_BCMP */ +/* #undef HAVE_BFILL */ +/* #undef HAVE_BMOVE */ +/* #undef HAVE_BZERO */ +/* #undef HAVE_CLOCK_GETTIME */ +/* #undef HAVE_COMPRESS */ +/* #undef HAVE_CRYPT */ +/* #undef HAVE_DLERROR */ +/* #undef HAVE_DLOPEN */ +/* #undef HAVE_FCHMOD */ +/* #undef HAVE_FCNTL */ +/* #undef HAVE_FCONVERT */ +/* #undef HAVE_FDATASYNC */ +/* #undef HAVE_FESETROUND */ +/* #undef HAVE_FINITE */ +/* #undef HAVE_FP_EXCEPT */ +/* #undef HAVE_FSEEKO */ +/* #undef HAVE_FSYNC */ +/* #undef HAVE_GETADDRINFO */ +#define HAVE_GETCWD 1 +/* #undef HAVE_GETHOSTBYADDR_R */ +/* #undef HAVE_GETHOSTBYNAME_R */ +/* #undef HAVE_GETHRTIME */ +/* #undef HAVE_GETNAMEINFO */ +/* #undef HAVE_GETPAGESIZE */ +/* #undef HAVE_GETPASS */ +/* #undef HAVE_GETPASSPHRASE */ +/* #undef HAVE_GETPWNAM */ +/* #undef HAVE_GETPWUID */ +/* #undef HAVE_GETRLIMIT */ +/* #undef HAVE_GETRUSAGE */ +/* #undef HAVE_GETWD */ +/* #undef HAVE_GMTIME_R */ +/* #undef HAVE_INITGROUPS */ +/* #undef HAVE_ISNAN */ +#define HAVE_LDIV 1 +/* #undef HAVE_LOCALTIME_R */ +/* #undef HAVE_LOG2 */ +#define HAVE_LONGJMP 1 +/* #undef HAVE_LSTAT */ +/* #undef HAVE_MADVISE */ +/* #undef HAVE_DECL_MADVISE */ +/* #undef HAVE_MALLINFO */ +#define HAVE_MEMCPY 1 +#define HAVE_MEMCPY 1 +#define HAVE_MEMMOVE 1 +#define HAVE_MEMMOVE 1 +/* #undef HAVE_MKSTEMP */ +/* #undef HAVE_MLOCK */ +/* #undef HAVE_MLOCKALL */ +/* #undef HAVE_MMAP */ +/* #undef HAVE_MMAP64 */ +#define HAVE_PERROR 1 +/* #undef HAVE_POLL */ +/* #undef HAVE_PREAD */ +/* #undef HAVE_PTHREAD_ATTR_CREATE */ +/* #undef HAVE_PTHREAD_ATTR_GETSTACKSIZE */ +/* #undef HAVE_PTHREAD_ATTR_SETPRIO */ +/* #undef HAVE_PTHREAD_ATTR_SETSCHEDPARAM */ +/* #undef HAVE_PTHREAD_ATTR_SETSCOPE */ +/* #undef HAVE_PTHREAD_ATTR_SETSTACKSIZE */ +/* #undef HAVE_PTHREAD_CONDATTR_CREATE */ +/* #undef HAVE_PTHREAD_INIT */ +/* #undef HAVE_PTHREAD_KEY_DELETE */ +/* #undef HAVE_PTHREAD_KEY_DELETE */ +/* #undef HAVE_PTHREAD_KILL */ +/* #undef HAVE_PTHREAD_RWLOCK_RDLOCK */ +/* #undef HAVE_PTHREAD_SETPRIO_NP */ +/* #undef HAVE_PTHREAD_SETSCHEDPARAM */ +/* #undef HAVE_PTHREAD_SIGMASK */ +/* #undef HAVE_PTHREAD_THREADMASK */ +/* #undef HAVE_PTHREAD_YIELD_NP */ +/* #undef HAVE_READDIR_R */ +/* #undef HAVE_READLINK */ +/* #undef HAVE_REALPATH */ +#define HAVE_RENAME 1 +/* #undef HAVE_RINT */ +/* #undef HAVE_SCHED_YIELD */ +/* #undef HAVE_SELECT */ +/* #undef HAVE_SETFD */ +/* #undef HAVE_SETFILEPOINTER */ +/* #undef HAVE_SIGACTION */ +/* #undef HAVE_SIGTHREADMASK */ +/* #undef HAVE_SIGWAIT */ +/* #undef HAVE_SLEEP */ +/* #undef HAVE_SNPRINTF */ +/* #undef HAVE_STPCPY */ +#define HAVE_STRERROR 1 +/* #undef HAVE_STRLCPY */ +#define HAVE_STRNLEN 1 +#define HAVE_STRPBRK 1 +/* #undef HAVE_STRSEP */ +#define HAVE_STRSTR 1 +/* #undef HAVE_STRTOK_R */ +/* #undef HAVE_STRTOK_R */ +#define HAVE_STRTOL 1 +/* #undef HAVE_STRTOLL */ +#define HAVE_STRTOUL 1 +/* #undef HAVE_STRTOULL */ +#define HAVE_TELL 1 +/* #undef HAVE_THR_SETCONCURRENCY */ +/* #undef HAVE_THR_YIELD */ +/* #undef HAVE_VASPRINTF */ +#define HAVE_VSNPRINTF 1 + +/* Symbols we may use */ +/* #undef HAVE_SYS_ERRLIST */ +/* used by stacktrace functions */ +/* #undef HAVE_BSS_START */ + +/* Does "struct timespec" have a "sec" and "nsec" field? */ +/* #undef HAVE_TIMESPEC_TS_SEC */ + +/* Types we may use */ +#define SIZEOF_CHAR 1 +#if SIZEOF_CHAR +# define HAVE_CHAR 1 +#endif + +#define SIZEOF_CHARP 4 +#if SIZEOF_CHARP +# define HAVE_CHARP 1 +#endif + +#define SIZEOF_SHORT 2 +#if SIZEOF_SHORT +# define HAVE_SHORT 1 +#endif + +#define SIZEOF_INT 4 +#if SIZEOF_INT +# define HAVE_INT 1 +#endif + +#define SIZEOF_LONG 4 +#if SIZEOF_LONG +# define HAVE_LONG 1 +#endif + +#define SIZEOF_LONG_LONG 8 +#if SIZEOF_LONG_LONG +# define HAVE_LONG_LONG 1 +#endif + +#define SIZEOF_OFF_T 4 +#if SIZEOF_OFF_T +# define HAVE_OFF_T 1 +#endif + +/* #undef SIZEOF_SIGSET_T */ +#if SIZEOF_SIGSET_T +# define HAVE_SIGSET_T 1 +#endif + +#define SIZEOF_SIZE_T 4 +#if SIZEOF_SIZE_T +# define HAVE_SIZE_T 1 +#endif + +/* #undef SIZEOF_UCHAR */ +#if SIZEOF_UCHAR +# define HAVE_UCHAR 1 +#endif + +/* #undef SIZEOF_UINT */ +#if SIZEOF_UINT +# define HAVE_UINT 1 +#endif + +/* #undef SIZEOF_ULONG */ +#if SIZEOF_ULONG +# define HAVE_ULONG 1 +#endif + +/* #undef SIZEOF_INT8 */ +#if SIZEOF_INT8 +# define HAVE_INT8 1 +#endif +/* #undef SIZEOF_UINT8 */ +#if SIZEOF_UINT8 +# define HAVE_UINT8 1 +#endif + +/* #undef SIZEOF_INT16 */ +#if SIZEOF_INT16 +# define HAVE_INT16 1 +#endif +/* #undef SIZEOF_UINT16 */ +#if SIZEOF_UINT16 +# define HAVE_UINT16 1 +#endif + +/* #undef SIZEOF_INT32 */ +#if SIZEOF_INT32 +# define HAVE_INT32 1 +#endif +/* #undef SIZEOF_UINT32 */ +#if SIZEOF_UINT32 +# define HAVE_UINT32 1 +#endif +/* #undef SIZEOF_U_INT32_T */ +#if SIZEOF_U_INT32_T +# define HAVE_U_INT32_T 1 +#endif + +/* #undef SIZEOF_INT64 */ +#if SIZEOF_INT64 +# define HAVE_INT64 1 +#endif +/* #undef SIZEOF_UINT64 */ +#if SIZEOF_UINT64 +# define HAVE_UINT64 1 +#endif + +/* #undef SIZEOF_SOCKLEN_T */ +#if SIZEOF_SOCKLEN_T +# define HAVE_SOCKLEN_T 1 +#endif + +/* XXX mysql_client_test uses this -- rip it out, please! */ +#define MAX_INDEXES 64 + +#define QSORT_TYPE_IS_VOID 1 +#define RETQSORTTYPE void + +#define SIGNAL_RETURN_TYPE_IS_VOID 1 +#define RETSIGTYPE void + +/* #undef WORDS_BIGENDIAN */ + +/* Define to `__inline__' or `__inline' if that's what the C compiler calls + it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +# define inline +#endif + +#define TIME_WITH_SYS_TIME 1 + +#define STACK_DIRECTION -1 + +#define SHAREDIR "share" +#define THREAD 1 +#define THREAD_SAFE_CLIENT 1 + +#define DEFAULT_CHARSET_HOME "C:/mysql/" diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/my_config.h.in b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_config.h.in new file mode 100644 index 0000000..58282d2 --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_config.h.in @@ -0,0 +1,295 @@ + +/* Headers we may want to use. */ +#cmakedefine HAVE_ALLOCA_H 1 +#cmakedefine HAVE_ARPA_INET_H 1 +#cmakedefine HAVE_CRYPT_H 1 +#cmakedefine HAVE_DIRENT_H 1 +#cmakedefine HAVE_EXECINFO_H 1 +#cmakedefine HAVE_FCNTL_H 1 +#cmakedefine HAVE_FENV_H 1 +#cmakedefine HAVE_FLOAT_H 1 +#cmakedefine HAVE_FPU_CONTROL_H 1 +#cmakedefine HAVE_GRP_H 1 +#cmakedefine HAVE_IEEEFP_H 1 +#cmakedefine HAVE_LIMITS_H 1 +#cmakedefine HAVE_MALLOC_H 1 +#cmakedefine HAVE_MEMORY_H 1 +#cmakedefine HAVE_NETINET_IN_H 1 +#cmakedefine HAVE_PATHS_H 1 +#cmakedefine HAVE_PWD_H 1 +#cmakedefine HAVE_SCHED_H 1 +#cmakedefine HAVE_SELECT_H 1 +#cmakedefine HAVE_STDDEF_H 1 +#cmakedefine HAVE_STDLIB_H 1 +#cmakedefine HAVE_STRINGS_H 1 +#cmakedefine HAVE_STRING_H 1 +#cmakedefine HAVE_SYNCH_H 1 +#cmakedefine HAVE_SYSENT_H 1 +#cmakedefine HAVE_SYS_FPU_H 1 +#cmakedefine HAVE_SYS_IOCTL_H 1 +#cmakedefine HAVE_SYS_IPC_H 1 +#cmakedefine HAVE_SYS_MMAN_H 1 +#cmakedefine HAVE_SYS_PRCTL_H 1 +#cmakedefine HAVE_SYS_SELECT_H 1 +#cmakedefine HAVE_SYS_SHM_H 1 +#cmakedefine HAVE_SYS_SOCKET_H 1 +#cmakedefine HAVE_SYS_STAT_H 1 +#cmakedefine HAVE_SYS_STREAM_H 1 +#cmakedefine HAVE_SYS_TIMEB_H 1 +#cmakedefine HAVE_SYS_TYPES_H 1 +#cmakedefine HAVE_SYS_UN_H 1 +#cmakedefine HAVE_TERMIOS_H 1 +#cmakedefine HAVE_TERMIO_H 1 +#cmakedefine HAVE_UNISTD_H 1 +#cmakedefine HAVE_UTIME_H 1 + +/* Functions we may want to use. */ +#cmakedefine HAVE_ACCESS 1 +#cmakedefine HAVE_AIOWAIT 1 +#cmakedefine HAVE_ALARM 1 +#cmakedefine HAVE_ALLOCA 1 +#cmakedefine HAVE_BCMP 1 +#cmakedefine HAVE_BFILL 1 +#cmakedefine HAVE_BMOVE 1 +#cmakedefine HAVE_BZERO 1 +#cmakedefine HAVE_CLOCK_GETTIME 1 +#cmakedefine HAVE_COMPRESS 1 +#cmakedefine HAVE_CRYPT 1 +#cmakedefine HAVE_DLERROR 1 +#cmakedefine HAVE_DLOPEN 1 +#cmakedefine HAVE_FCHMOD 1 +#cmakedefine HAVE_FCNTL 1 +#cmakedefine HAVE_FCONVERT 1 +#cmakedefine HAVE_FDATASYNC 1 +#cmakedefine HAVE_FESETROUND 1 +#cmakedefine HAVE_FINITE 1 +#cmakedefine HAVE_FP_EXCEPT 1 +#cmakedefine HAVE_FSEEKO 1 +#cmakedefine HAVE_FSYNC 1 +#cmakedefine HAVE_GETADDRINFO 1 +#cmakedefine HAVE_GETCWD 1 +#cmakedefine HAVE_GETHOSTBYADDR_R 1 +#cmakedefine HAVE_GETHOSTBYNAME_R 1 +#cmakedefine HAVE_GETHRTIME 1 +#cmakedefine HAVE_GETNAMEINFO 1 +#cmakedefine HAVE_GETPAGESIZE 1 +#cmakedefine HAVE_GETPASS 1 +#cmakedefine HAVE_GETPASSPHRASE 1 +#cmakedefine HAVE_GETPWNAM 1 +#cmakedefine HAVE_GETPWUID 1 +#cmakedefine HAVE_GETRLIMIT 1 +#cmakedefine HAVE_GETRUSAGE 1 +#cmakedefine HAVE_GETWD 1 +#cmakedefine HAVE_GMTIME_R 1 +#cmakedefine HAVE_INITGROUPS 1 +#cmakedefine HAVE_ISNAN 1 +#cmakedefine HAVE_LDIV 1 +#cmakedefine HAVE_LOCALTIME_R 1 +#cmakedefine HAVE_LOG2 1 +#cmakedefine HAVE_LONGJMP 1 +#cmakedefine HAVE_LSTAT 1 +#cmakedefine HAVE_MADVISE 1 +#cmakedefine HAVE_DECL_MADVISE 1 +#cmakedefine HAVE_MALLINFO 1 +#cmakedefine HAVE_MEMCPY 1 +#cmakedefine HAVE_MEMCPY 1 +#cmakedefine HAVE_MEMMOVE 1 +#cmakedefine HAVE_MEMMOVE 1 +#cmakedefine HAVE_MKSTEMP 1 +#cmakedefine HAVE_MLOCK 1 +#cmakedefine HAVE_MLOCKALL 1 +#cmakedefine HAVE_MMAP 1 +#cmakedefine HAVE_MMAP64 1 +#cmakedefine HAVE_PERROR 1 +#cmakedefine HAVE_POLL 1 +#cmakedefine HAVE_PREAD 1 +#cmakedefine HAVE_PTHREAD_ATTR_CREATE 1 +#cmakedefine HAVE_PTHREAD_ATTR_GETSTACKSIZE 1 +#cmakedefine HAVE_PTHREAD_ATTR_SETPRIO 1 +#cmakedefine HAVE_PTHREAD_ATTR_SETSCHEDPARAM 1 +#cmakedefine HAVE_PTHREAD_ATTR_SETSCOPE 1 +#cmakedefine HAVE_PTHREAD_ATTR_SETSTACKSIZE 1 +#cmakedefine HAVE_PTHREAD_CONDATTR_CREATE 1 +#cmakedefine HAVE_PTHREAD_INIT 1 +#cmakedefine HAVE_PTHREAD_KEY_DELETE 1 +#cmakedefine HAVE_PTHREAD_KEY_DELETE 1 +#cmakedefine HAVE_PTHREAD_KILL 1 +#cmakedefine HAVE_PTHREAD_RWLOCK_RDLOCK 1 +#cmakedefine HAVE_PTHREAD_SETPRIO_NP 1 +#cmakedefine HAVE_PTHREAD_SETSCHEDPARAM 1 +#cmakedefine HAVE_PTHREAD_SIGMASK 1 +#cmakedefine HAVE_PTHREAD_THREADMASK 1 +#cmakedefine HAVE_PTHREAD_YIELD_NP 1 +#cmakedefine HAVE_READDIR_R 1 +#cmakedefine HAVE_READLINK 1 +#cmakedefine HAVE_REALPATH 1 +#cmakedefine HAVE_RENAME 1 +#cmakedefine HAVE_RINT 1 +#cmakedefine HAVE_SCHED_YIELD 1 +#cmakedefine HAVE_SELECT 1 +#cmakedefine HAVE_SETFD 1 +#cmakedefine HAVE_SETFILEPOINTER 1 +#cmakedefine HAVE_SIGACTION 1 +#cmakedefine HAVE_SIGTHREADMASK 1 +#cmakedefine HAVE_SIGWAIT 1 +#cmakedefine HAVE_SLEEP 1 +#cmakedefine HAVE_SNPRINTF 1 +#cmakedefine HAVE_STPCPY 1 +#cmakedefine HAVE_STRERROR 1 +#cmakedefine HAVE_STRLCPY 1 +#cmakedefine HAVE_STRNLEN 1 +#cmakedefine HAVE_STRPBRK 1 +#cmakedefine HAVE_STRSEP 1 +#cmakedefine HAVE_STRSTR 1 +#cmakedefine HAVE_STRTOK_R 1 +#cmakedefine HAVE_STRTOK_R 1 +#cmakedefine HAVE_STRTOL 1 +#cmakedefine HAVE_STRTOLL 1 +#cmakedefine HAVE_STRTOUL 1 +#cmakedefine HAVE_STRTOULL 1 +#cmakedefine HAVE_TELL 1 +#cmakedefine HAVE_THR_SETCONCURRENCY 1 +#cmakedefine HAVE_THR_YIELD 1 +#cmakedefine HAVE_VASPRINTF 1 +#cmakedefine HAVE_VSNPRINTF 1 + +/* Symbols we may use */ +#cmakedefine HAVE_SYS_ERRLIST 1 +/* used by stacktrace functions */ +#cmakedefine HAVE_BSS_START 1 + +/* Does "struct timespec" have a "sec" and "nsec" field? */ +#cmakedefine HAVE_TIMESPEC_TS_SEC 1 + +/* Types we may use */ +#cmakedefine SIZEOF_CHAR @SIZEOF_CHAR@ +#if SIZEOF_CHAR +# define HAVE_CHAR 1 +#endif + +#cmakedefine SIZEOF_CHARP @SIZEOF_CHARP@ +#if SIZEOF_CHARP +# define HAVE_CHARP 1 +#endif + +#cmakedefine SIZEOF_SHORT @SIZEOF_SHORT@ +#if SIZEOF_SHORT +# define HAVE_SHORT 1 +#endif + +#cmakedefine SIZEOF_INT @SIZEOF_INT@ +#if SIZEOF_INT +# define HAVE_INT 1 +#endif + +#cmakedefine SIZEOF_LONG @SIZEOF_LONG@ +#if SIZEOF_LONG +# define HAVE_LONG 1 +#endif + +#cmakedefine SIZEOF_LONG_LONG @SIZEOF_LONG_LONG@ +#if SIZEOF_LONG_LONG +# define HAVE_LONG_LONG 1 +#endif + +#cmakedefine SIZEOF_OFF_T @SIZEOF_OFF_T@ +#if SIZEOF_OFF_T +# define HAVE_OFF_T 1 +#endif + +#cmakedefine SIZEOF_SIGSET_T @SIZEOF_SIGSET_T@ +#if SIZEOF_SIGSET_T +# define HAVE_SIGSET_T 1 +#endif + +#cmakedefine SIZEOF_SIZE_T @SIZEOF_SIZE_T@ +#if SIZEOF_SIZE_T +# define HAVE_SIZE_T 1 +#endif + +#cmakedefine SIZEOF_UCHAR @SIZEOF_UCHAR@ +#if SIZEOF_UCHAR +# define HAVE_UCHAR 1 +#endif + +#cmakedefine SIZEOF_UINT @SIZEOF_UINT@ +#if SIZEOF_UINT +# define HAVE_UINT 1 +#endif + +#cmakedefine SIZEOF_ULONG @SIZEOF_ULONG@ +#if SIZEOF_ULONG +# define HAVE_ULONG 1 +#endif + +#cmakedefine SIZEOF_INT8 @SIZEOF_INT8@ +#if SIZEOF_INT8 +# define HAVE_INT8 1 +#endif +#cmakedefine SIZEOF_UINT8 @SIZEOF_UINT8@ +#if SIZEOF_UINT8 +# define HAVE_UINT8 1 +#endif + +#cmakedefine SIZEOF_INT16 @SIZEOF_INT16@ +#if SIZEOF_INT16 +# define HAVE_INT16 1 +#endif +#cmakedefine SIZEOF_UINT16 @SIZEOF_UINT16@ +#if SIZEOF_UINT16 +# define HAVE_UINT16 1 +#endif + +#cmakedefine SIZEOF_INT32 @SIZEOF_INT32@ +#if SIZEOF_INT32 +# define HAVE_INT32 1 +#endif +#cmakedefine SIZEOF_UINT32 @SIZEOF_UINT32@ +#if SIZEOF_UINT32 +# define HAVE_UINT32 1 +#endif +#cmakedefine SIZEOF_U_INT32_T @SIZEOF_U_INT32_T@ +#if SIZEOF_U_INT32_T +# define HAVE_U_INT32_T 1 +#endif + +#cmakedefine SIZEOF_INT64 @SIZEOF_INT64@ +#if SIZEOF_INT64 +# define HAVE_INT64 1 +#endif +#cmakedefine SIZEOF_UINT64 @SIZEOF_UINT64@ +#if SIZEOF_UINT64 +# define HAVE_UINT64 1 +#endif + +#cmakedefine SIZEOF_SOCKLEN_T @SIZEOF_SOCKLEN_T@ +#if SIZEOF_SOCKLEN_T +# define HAVE_SOCKLEN_T 1 +#endif + +/* XXX mysql_client_test uses this -- rip it out, please! */ +#define MAX_INDEXES 64 + +#cmakedefine QSORT_TYPE_IS_VOID 1 +#define RETQSORTTYPE @RETQSORTTYPE@ + +#cmakedefine SIGNAL_RETURN_TYPE_IS_VOID 1 +#define RETSIGTYPE @RETSIGTYPE@ + +#cmakedefine WORDS_BIGENDIAN 1 + +/* Define to `__inline__' or `__inline' if that's what the C compiler calls + it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +# define inline @C_INLINE@ +#endif + +#define TIME_WITH_SYS_TIME 1 + +#define STACK_DIRECTION -1 + +#define SHAREDIR "@SHAREDIR@" +#define THREAD 1 +#define THREAD_SAFE_CLIENT 1 + +#define DEFAULT_CHARSET_HOME "@DEFAULT_CHARSET_HOME@" diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/my_dbug.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_dbug.h new file mode 100644 index 0000000..c4a2f88 --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_dbug.h @@ -0,0 +1,140 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef _dbug_h +#define _dbug_h + +#ifdef __cplusplus +extern "C" { +#endif +#if !defined(DBUG_OFF) && !defined(_lint) + +struct _db_stack_frame_ { + const char *func; /* function name of the previous stack frame */ + const char *file; /* filename of the function of previous frame */ + uint level; /* this nesting level, highest bit enables tracing */ + struct _db_stack_frame_ *prev; /* pointer to the previous frame */ +}; + +struct _db_code_state_; +extern my_bool _dbug_on_; +extern my_bool _db_keyword_(struct _db_code_state_ *, const char *, int); +extern int _db_explain_(struct _db_code_state_ *cs, char *buf, size_t len); +extern int _db_explain_init_(char *buf, size_t len); +extern int _db_is_pushed_(void); +extern void _db_setjmp_(void); +extern void _db_longjmp_(void); +extern void _db_process_(const char *name); +extern void _db_push_(const char *control); +extern void _db_pop_(void); +extern void _db_set_(const char *control); +extern void _db_set_init_(const char *control); +extern void _db_enter_(const char *_func_, const char *_file_, uint _line_, + struct _db_stack_frame_ *_stack_frame_); +extern void _db_return_(uint _line_, struct _db_stack_frame_ *_stack_frame_); +extern void _db_pargs_(uint _line_,const char *keyword); +extern void _db_doprnt_ _VARARGS((const char *format,...)) + ATTRIBUTE_FORMAT(printf, 1, 2); +extern void _db_dump_(uint _line_,const char *keyword, + const unsigned char *memory, size_t length); +extern void _db_end_(void); +extern void _db_lock_file_(void); +extern void _db_unlock_file_(void); +extern FILE *_db_fp_(void); +extern void _db_flush_(); + +#define DBUG_ENTER(a) struct _db_stack_frame_ _db_stack_frame_; \ + _db_enter_ (a,__FILE__,__LINE__,&_db_stack_frame_) +#define DBUG_LEAVE _db_return_ (__LINE__, &_db_stack_frame_) +#define DBUG_RETURN(a1) do {DBUG_LEAVE; return(a1);} while(0) +#define DBUG_VOID_RETURN do {DBUG_LEAVE; return;} while(0) +#define DBUG_EXECUTE(keyword,a1) \ + do {if (_db_keyword_(0, (keyword), 0)) { a1 }} while(0) +#define DBUG_EXECUTE_IF(keyword,a1) \ + do {if (_db_keyword_(0, (keyword), 1)) { a1 }} while(0) +#define DBUG_EVALUATE(keyword,a1,a2) \ + (_db_keyword_(0,(keyword), 0) ? (a1) : (a2)) +#define DBUG_EVALUATE_IF(keyword,a1,a2) \ + (_db_keyword_(0,(keyword), 1) ? (a1) : (a2)) +#define DBUG_PRINT(keyword,arglist) \ + do {_db_pargs_(__LINE__,keyword); _db_doprnt_ arglist;} while(0) +#define DBUG_PUSH(a1) _db_push_ (a1) +#define DBUG_POP() _db_pop_ () +#define DBUG_SET(a1) _db_set_ (a1) +#define DBUG_SET_INITIAL(a1) _db_set_init_ (a1) +#define DBUG_PROCESS(a1) _db_process_(a1) +#define DBUG_FILE _db_fp_() +#define DBUG_SETJMP(a1) (_db_setjmp_ (), setjmp (a1)) +#define DBUG_LONGJMP(a1,a2) (_db_longjmp_ (), longjmp (a1, a2)) +#define DBUG_DUMP(keyword,a1,a2) _db_dump_(__LINE__,keyword,a1,a2) +#define DBUG_END() _db_end_ () +#define DBUG_LOCK_FILE _db_lock_file_() +#define DBUG_UNLOCK_FILE _db_unlock_file_() +#define DBUG_ASSERT(A) assert(A) +#define DBUG_EXPLAIN(buf,len) _db_explain_(0, (buf),(len)) +#define DBUG_EXPLAIN_INITIAL(buf,len) _db_explain_init_((buf),(len)) +#define DEBUGGER_OFF do { _dbug_on_= 0; } while(0) +#define DEBUGGER_ON do { _dbug_on_= 1; } while(0) +#define IF_DBUG(A) A +#ifndef __WIN__ +#define DBUG_ABORT() (_db_flush_(), abort()) +#else +/* + Avoid popup with abort/retry/ignore buttons. When BUG#31745 is fixed we can + call abort() instead of _exit(3) (now it would cause a "test signal" popup). +*/ +#include +#define DBUG_ABORT() (_db_flush_(),\ + (void)_CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE),\ + (void)_CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDERR),\ + _exit(3)) +#endif + +#else /* No debugger */ + +#define DBUG_ENTER(a1) +#define DBUG_LEAVE +#define DBUG_RETURN(a1) do { return(a1); } while(0) +#define DBUG_VOID_RETURN do { return; } while(0) +#define DBUG_EXECUTE(keyword,a1) do { } while(0) +#define DBUG_EXECUTE_IF(keyword,a1) do { } while(0) +#define DBUG_EVALUATE(keyword,a1,a2) (a2) +#define DBUG_EVALUATE_IF(keyword,a1,a2) (a2) +#define DBUG_PRINT(keyword,arglist) do { } while(0) +#define DBUG_PUSH(a1) do { } while(0) +#define DBUG_SET(a1) do { } while(0) +#define DBUG_SET_INITIAL(a1) do { } while(0) +#define DBUG_POP() do { } while(0) +#define DBUG_PROCESS(a1) do { } while(0) +#define DBUG_SETJMP(a1) setjmp(a1) +#define DBUG_LONGJMP(a1) longjmp(a1) +#define DBUG_DUMP(keyword,a1,a2) do { } while(0) +#define DBUG_END() do { } while(0) +#define DBUG_ASSERT(A) do { } while(0) +#define DBUG_LOCK_FILE do { } while(0) +#define DBUG_FILE (stderr) +#define DBUG_UNLOCK_FILE do { } while(0) +#define DBUG_EXPLAIN(buf,len) +#define DBUG_EXPLAIN_INITIAL(buf,len) +#define DEBUGGER_OFF do { } while(0) +#define DEBUGGER_ON do { } while(0) +#define IF_DBUG(A) +#define DBUG_ABORT() abort() + +#endif +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/my_dir.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_dir.h new file mode 100644 index 0000000..90d708a --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_dir.h @@ -0,0 +1,109 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef _my_dir_h +#define _my_dir_h +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef MY_DIR_H +#define MY_DIR_H + +#include + + /* Defines for my_dir and my_stat */ + +#define MY_S_IFMT S_IFMT /* type of file */ +#define MY_S_IFDIR S_IFDIR /* directory */ +#define MY_S_IFCHR S_IFCHR /* character special */ +#define MY_S_IFBLK S_IFBLK /* block special */ +#define MY_S_IFREG S_IFREG /* regular */ +#define MY_S_IFIFO S_IFIFO /* fifo */ +#define MY_S_ISUID S_ISUID /* set user id on execution */ +#define MY_S_ISGID S_ISGID /* set group id on execution */ +#define MY_S_ISVTX S_ISVTX /* save swapped text even after use */ +#define MY_S_IREAD S_IREAD /* read permission, owner */ +#define MY_S_IWRITE S_IWRITE /* write permission, owner */ +#define MY_S_IEXEC S_IEXEC /* execute/search permission, owner */ + +#define MY_S_ISDIR(m) (((m) & MY_S_IFMT) == MY_S_IFDIR) +#define MY_S_ISCHR(m) (((m) & MY_S_IFMT) == MY_S_IFCHR) +#define MY_S_ISBLK(m) (((m) & MY_S_IFMT) == MY_S_IFBLK) +#define MY_S_ISREG(m) (((m) & MY_S_IFMT) == MY_S_IFREG) +#define MY_S_ISFIFO(m) (((m) & MY_S_IFMT) == MY_S_IFIFO) + +#define MY_DONT_SORT 512 /* my_lib; Don't sort files */ +#define MY_WANT_STAT 1024 /* my_lib; stat files */ + + /* typedefs for my_dir & my_stat */ + +#ifdef USE_MY_STAT_STRUCT + +typedef struct my_stat +{ + dev_t st_dev; /* major & minor device numbers */ + ino_t st_ino; /* inode number */ + ushort st_mode; /* file permissons (& suid sgid .. bits) */ + short st_nlink; /* number of links to file */ + ushort st_uid; /* user id */ + ushort st_gid; /* group id */ + dev_t st_rdev; /* more major & minor device numbers (???) */ + off_t st_size; /* size of file */ + time_t st_atime; /* time for last read */ + time_t st_mtime; /* time for last contens modify */ + time_t st_ctime; /* time for last inode or contents modify */ +} MY_STAT; + +#else + +#if(_MSC_VER) +#define MY_STAT struct _stati64 /* 64 bit file size */ +#else +#define MY_STAT struct stat /* Orginal struct have what we need */ +#endif + +#endif /* USE_MY_STAT_STRUCT */ + +/* Struct describing one file returned from my_dir */ +typedef struct fileinfo +{ + char *name; + MY_STAT *mystat; +} FILEINFO; + +typedef struct st_my_dir /* Struct returned from my_dir */ +{ + /* + These members are just copies of parts of DYNAMIC_ARRAY structure, + which is allocated right after the end of MY_DIR structure (MEM_ROOT + for storing names is also resides there). We've left them here because + we don't want to change code that uses my_dir. + */ + struct fileinfo *dir_entry; + uint number_off_files; +} MY_DIR; + +extern MY_DIR *my_dir(const char *path,myf MyFlags); +extern void my_dirend(MY_DIR *buffer); +extern MY_STAT *my_stat(const char *path, MY_STAT *stat_area, myf my_flags); +extern int my_fstat(int filenr, MY_STAT *stat_area, myf MyFlags); + +#endif /* MY_DIR_H */ + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/my_getopt.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_getopt.h new file mode 100644 index 0000000..7cbad60 --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_getopt.h @@ -0,0 +1,86 @@ +/* Copyright (C) 2002-2004 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef _my_getopt_h +#define _my_getopt_h + +C_MODE_START + +#define GET_NO_ARG 1 +#define GET_BOOL 2 +#define GET_INT 3 +#define GET_UINT 4 +#define GET_LONG 5 +#define GET_ULONG 6 +#define GET_LL 7 +#define GET_ULL 8 +#define GET_STR 9 +#define GET_STR_ALLOC 10 +#define GET_DISABLED 11 +#define GET_ENUM 12 +#define GET_SET 13 +#define GET_DOUBLE 14 + +#define GET_ASK_ADDR 128 +#define GET_TYPE_MASK 127 + +enum get_opt_arg_type { NO_ARG, OPT_ARG, REQUIRED_ARG }; + +struct st_typelib; + +struct my_option +{ + const char *name; /* Name of the option */ + int id; /* unique id or short option */ + const char *comment; /* option comment, for autom. --help */ + uchar **value; /* The variable value */ + uchar **u_max_value; /* The user def. max variable value */ + struct st_typelib *typelib; /* Pointer to possible values */ + ulong var_type; + enum get_opt_arg_type arg_type; + longlong def_value; /* Default value */ + longlong min_value; /* Min allowed value */ + longlong max_value; /* Max allowed value */ + longlong sub_size; /* Subtract this from given value */ + long block_size; /* Value should be a mult. of this */ + void *app_type; /* To be used by an application */ +}; + +typedef my_bool (* my_get_one_option) (int, const struct my_option *, char * ); +typedef void (* my_error_reporter) (enum loglevel level, const char *format, ... ); + +extern char *disabled_my_option; +extern my_bool my_getopt_print_errors; +extern my_bool my_getopt_skip_unknown; +extern my_error_reporter my_getopt_error_reporter; + +extern int handle_options (int *argc, char ***argv, + const struct my_option *longopts, my_get_one_option); +extern void my_cleanup_options(const struct my_option *options); +extern void my_print_help(const struct my_option *options); +extern void my_print_variables(const struct my_option *options); +extern void my_getopt_register_get_addr(uchar ** (*func_addr)(const char *, uint, + const struct my_option *, int *)); + +ulonglong getopt_ull_limit_value(ulonglong num, const struct my_option *optp, + my_bool *fix); +longlong getopt_ll_limit_value(longlong, const struct my_option *, + my_bool *fix); +my_bool getopt_compare_strings(const char *s, const char *t, uint length); + +C_MODE_END + +#endif /* _my_getopt_h */ + diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/my_global.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_global.h new file mode 100644 index 0000000..131507c --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_global.h @@ -0,0 +1,1616 @@ +/* Copyright (C) 2000-2003 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* This is the include file that should be included 'first' in every C file. */ + +#ifndef _global_h +#define _global_h + +/* + InnoDB depends on some MySQL internals which other plugins should not + need. This is because of InnoDB's foreign key support, "safe" binlog + truncation, and other similar legacy features. + + We define accessors for these internals unconditionally, but do not + expose them in mysql/plugin.h. They are declared in ha_innodb.h for + InnoDB's use. +*/ +#define INNODB_COMPATIBILITY_HOOKS + +#ifdef __CYGWIN__ +/* We use a Unix API, so pretend it's not Windows */ +#undef WIN +#undef WIN32 +#undef _WIN +#undef _WIN32 +#undef _WIN64 +#undef __WIN__ +#undef __WIN32__ +#define HAVE_ERRNO_AS_DEFINE +#endif /* __CYGWIN__ */ + +#if defined(__QNXNTO__) && !defined(FD_SETSIZE) +#define FD_SETSIZE 1024 /* Max number of file descriptor bits in + fd_set, used when calling 'select' + Must be defined before including + "sys/select.h" and "sys/time.h" + */ +#endif + + +/* to make command line shorter we'll define USE_PRAGMA_INTERFACE here */ +#ifdef USE_PRAGMA_IMPLEMENTATION +#define USE_PRAGMA_INTERFACE +#endif + +#if defined(i386) && !defined(__i386__) +#define __i386__ +#endif + +/* Macros to make switching between C and C++ mode easier */ +#ifdef __cplusplus +#define C_MODE_START extern "C" { +#define C_MODE_END } +#define STATIC_CAST(TYPE) static_cast +#else +#define C_MODE_START +#define C_MODE_END +#define STATIC_CAST(TYPE) (TYPE) +#endif + +#if defined(_WIN32) || defined(_WIN64) || defined(__WIN32__) || defined(WIN32) +#include +#else +#include +#if defined(__cplusplus) && defined(inline) +#undef inline /* fix configure problem */ +#endif +#endif /* _WIN32... */ + +#include + +/* Make it easier to add conditional code for windows */ +#ifdef __WIN__ +#define IF_WIN(A,B) (A) +#else +#define IF_WIN(A,B) (B) +#endif + +#ifndef EMBEDDED_LIBRARY +#ifdef WITH_NDB_BINLOG +#define HAVE_NDB_BINLOG 1 +#endif +#endif /* !EMBEDDED_LIBRARY */ + +#ifndef EMBEDDED_LIBRARY +#define HAVE_REPLICATION +#define HAVE_EXTERNAL_CLIENT +#endif + +/* Some defines to avoid ifdefs in the code */ +#ifndef NETWARE_YIELD +#define NETWARE_YIELD +#define NETWARE_SET_SCREEN_MODE(A) +#endif + +/* Workaround for _LARGE_FILES and _LARGE_FILE_API incompatibility on AIX */ +#if defined(_AIX) && defined(_LARGE_FILE_API) +#undef _LARGE_FILE_API +#endif + +/* + The macros below are used to allow build of Universal/fat binaries of + MySQL and MySQL applications under darwin. +*/ +#if defined(__APPLE__) && defined(__MACH__) +# undef SIZEOF_CHARP +# undef SIZEOF_SHORT +# undef SIZEOF_INT +# undef SIZEOF_LONG +# undef SIZEOF_LONG_LONG +# undef SIZEOF_OFF_T +# undef WORDS_BIGENDIAN +# define SIZEOF_SHORT 2 +# define SIZEOF_INT 4 +# define SIZEOF_LONG_LONG 8 +# define SIZEOF_OFF_T 8 +# if defined(__i386__) || defined(__ppc__) +# define SIZEOF_CHARP 4 +# define SIZEOF_LONG 4 +# elif defined(__x86_64__) || defined(__ppc64__) +# define SIZEOF_CHARP 8 +# define SIZEOF_LONG 8 +# else +# error Building FAT binary for an unknown architecture. +# endif +# if defined(__ppc__) || defined(__ppc64__) +# define WORDS_BIGENDIAN +# endif +#endif /* defined(__APPLE__) && defined(__MACH__) */ + + +/* + The macros below are borrowed from include/linux/compiler.h in the + Linux kernel. Use them to indicate the likelyhood of the truthfulness + of a condition. This serves two purposes - newer versions of gcc will be + able to optimize for branch predication, which could yield siginficant + performance gains in frequently executed sections of the code, and the + other reason to use them is for documentation +*/ + +#if !defined(__GNUC__) || (__GNUC__ == 2 && __GNUC_MINOR__ < 96) +#define __builtin_expect(x, expected_value) (x) +#endif + +/** + The semantics of builtin_expect() are that + 1) its two arguments are long + 2) it's likely that they are == + Those of our likely(x) are that x can be bool/int/longlong/pointer. +*/ +#define likely(x) __builtin_expect(((x) != 0),1) +#define unlikely(x) __builtin_expect(((x) != 0),0) + +/* + The macros below are useful in optimising places where it has been + discovered that cache misses stall the process and where a prefetch + of the cache line can improve matters. This is available in GCC 3.1.1 + and later versions. + PREFETCH_READ says that addr is going to be used for reading and that + it is to be kept in caches if possible for a while + PREFETCH_WRITE also says that the item to be cached is likely to be + updated. + The *LOCALITY scripts are also available for experimentation purposes + mostly and should only be used if they are verified to improve matters. + For more input see GCC manual (available in GCC 3.1.1 and later) +*/ + +#if (__GNUC__ > 3) || (__GNUC__ == 3 && __GNUC_MINOR > 10) +#define PREFETCH_READ(addr) __builtin_prefetch(addr, 0, 3) +#define PREFETCH_WRITE(addr) \ + __builtin_prefetch(addr, 1, 3) +#define PREFETCH_READ_LOCALITY(addr, locality) \ + __builtin_prefetch(addr, 0, locality) +#define PREFETCH_WRITE_LOCALITY(addr, locality) \ + __builtin_prefetch(addr, 1, locality) +#else +#define PREFETCH_READ(addr) +#define PREFETCH_READ_LOCALITY(addr, locality) +#define PREFETCH_WRITE(addr) +#define PREFETCH_WRITE_LOCALITY(addr, locality) +#endif + +/* + The following macro is used to ensure that code often used in most + SQL statements and definitely for parts of the SQL processing are + kept in a code segment by itself. This has the advantage that the + risk of common code being overlapping in caches of the CPU is less. + This can be a cause of big performance problems. + Routines should be put in this category with care and when they are + put there one should also strive to make as much of the error handling + as possible (or uncommon code of the routine) to execute in a + separate method to avoid moving to much code to this code segment. + + It is very easy to use, simply add HOT_METHOD at the end of the + function declaration. + For more input see GCC manual (available in GCC 2.95 and later) +*/ + +#if (__GNUC__ > 2) || (__GNUC__ == 2 && __GNUC_MINOR > 94) +#define HOT_METHOD \ + __attribute__ ((section ("hot_code_section"))) +#else +#define HOT_METHOD +#endif + +/* + The following macro is used to ensure that popular global variables + are located next to each other to avoid that they contend for the + same cache lines. + + It is very easy to use, simply add HOT_DATA at the end of the declaration + of the variable, the variable must be initialised because of the way + that linker works so a declaration using HOT_DATA should look like: + uint global_hot_data HOT_DATA = 0; + For more input see GCC manual (available in GCC 2.95 and later) +*/ + +#if (__GNUC__ > 2) || (__GNUC__ == 2 && __GNUC_MINOR > 94) +#define HOT_DATA \ + __attribute__ ((section ("hot_data_section"))) +#else +#define HOT_DATA +#endif + +/* + now let's figure out if inline functions are supported + autoconf defines 'inline' to be empty, if not +*/ +#define inline_test_1(X) X ## 1 +#define inline_test_2(X) inline_test_1(X) +#if inline_test_2(inline) != 1 +#define HAVE_INLINE +#endif +#undef inline_test_2 +#undef inline_test_1 +/* helper macro for "instantiating" inline functions */ +#define STATIC_INLINE static inline + +/* + The following macros are used to control inlining a bit more than + usual. These macros are used to ensure that inlining always or + never occurs (independent of compilation mode). + For more input see GCC manual (available in GCC 3.1.1 and later) +*/ + +#if (__GNUC__ > 3) || (__GNUC__ == 3 && __GNUC_MINOR > 10) +#define ALWAYS_INLINE __attribute__ ((always_inline)) +#define NEVER_INLINE __attribute__ ((noinline)) +#else +#define ALWAYS_INLINE +#define NEVER_INLINE +#endif + + +/* Fix problem with S_ISLNK() on Linux */ +#if defined(TARGET_OS_LINUX) || defined(__GLIBC__) +#undef _GNU_SOURCE +#define _GNU_SOURCE 1 +#endif + +/* + Temporary solution to solve bug#7156. Include "sys/types.h" before + the thread headers, else the function madvise() will not be defined +*/ +#if defined(HAVE_SYS_TYPES_H) && ( defined(sun) || defined(__sun) ) +#include +#endif + +/* The client defines this to avoid all thread code */ +#if defined(UNDEF_THREADS_HACK) +#undef THREAD +#undef HAVE_LINUXTHREADS +#undef HAVE_NPTL +#endif + +#ifdef HAVE_THREADS_WITHOUT_SOCKETS +/* MIT pthreads does not work with unix sockets */ +#undef HAVE_SYS_UN_H +#endif + +#define __EXTENSIONS__ 1 /* We want some extension */ +#ifndef __STDC_EXT__ +#define __STDC_EXT__ 1 /* To get large file support on hpux */ +#endif + +/* + Solaris 9 include file refers to X/Open document + + System Interfaces and Headers, Issue 5 + + saying we should define _XOPEN_SOURCE=500 to get POSIX.1c prototypes, + but apparently other systems (namely FreeBSD) don't agree. + + On a newer Solaris 10, the above file recognizes also _XOPEN_SOURCE=600. + Furthermore, it tests that if a program requires older standard + (_XOPEN_SOURCE<600 or _POSIX_C_SOURCE<200112L) it cannot be + run on a new compiler (that defines _STDC_C99) and issues an #error. + It's also an #error if a program requires new standard (_XOPEN_SOURCE=600 + or _POSIX_C_SOURCE=200112L) and a compiler does not define _STDC_C99. + + To add more to this mess, Sun Studio C compiler defines _STDC_C99 while + C++ compiler does not! + + So, in a desperate attempt to get correct prototypes for both + C and C++ code, we define either _XOPEN_SOURCE=600 or _XOPEN_SOURCE=500 + depending on the compiler's announced C standard support. + + Cleaner solutions are welcome. +*/ +#ifdef __sun +#if __STDC_VERSION__ - 0 >= 199901L +#define _XOPEN_SOURCE 600 +#else +#define _XOPEN_SOURCE 500 +#endif +#endif + +#if defined(THREAD) && !defined(__WIN__) +#ifndef _POSIX_PTHREAD_SEMANTICS +#define _POSIX_PTHREAD_SEMANTICS /* We want posix threads */ +#endif + +#if !defined(SCO) +#define _REENTRANT 1 /* Some thread libraries require this */ +#endif +#if !defined(_THREAD_SAFE) && !defined(_AIX) +#define _THREAD_SAFE /* Required for OSF1 */ +#endif +#if defined(HPUX10) || defined(HPUX11) +C_MODE_START /* HPUX needs this, signal.h bug */ +#include +C_MODE_END +#else +#include /* AIX must have this included first */ +#endif +#if !defined(SCO) && !defined(_REENTRANT) +#define _REENTRANT 1 /* Threads requires reentrant code */ +#endif +#endif /* THREAD */ + +/* Go around some bugs in different OS and compilers */ +#ifdef _AIX /* By soren@t.dk */ +#define _H_STRINGS +#define _SYS_STREAM_H +/* #define _AIX32_CURSES */ /* XXX: this breaks AIX 4.3.3 (others?). */ +#define ulonglong2double(A) my_ulonglong2double(A) +#define my_off_t2double(A) my_ulonglong2double(A) +C_MODE_START +double my_ulonglong2double(unsigned long long A); +C_MODE_END +#endif /* _AIX */ + +#ifdef HAVE_BROKEN_SNPRINTF /* HPUX 10.20 don't have this defined */ +#undef HAVE_SNPRINTF +#endif +#ifdef HAVE_BROKEN_PREAD +/* + pread()/pwrite() are not 64 bit safe on HP-UX 11.0 without + installing the kernel patch PHKL_20349 or greater +*/ +#undef HAVE_PREAD +#undef HAVE_PWRITE +#endif +#if defined(HAVE_BROKEN_INLINE) && !defined(__cplusplus) +#undef inline +#define inline +#endif + +#ifdef UNDEF_HAVE_GETHOSTBYNAME_R /* For OSF4.x */ +#undef HAVE_GETHOSTBYNAME_R +#endif +#ifdef UNDEF_HAVE_INITGROUPS /* For AIX 4.3 */ +#undef HAVE_INITGROUPS +#endif + +/* gcc/egcs issues */ + +#if defined(__GNUC) && defined(__EXCEPTIONS) +#error "Please add -fno-exceptions to CXXFLAGS and reconfigure/recompile" +#endif + + +/* Fix a bug in gcc 2.8.0 on IRIX 6.2 */ +#if SIZEOF_LONG == 4 && defined(__LONG_MAX__) && (__GNUC__ == 2 && __GNUC_MINOR__ == 8) +#undef __LONG_MAX__ /* Is a longlong value in gcc 2.8.0 ??? */ +#define __LONG_MAX__ 2147483647 +#endif + +/* egcs 1.1.2 has a problem with memcpy on Alpha */ +#if defined(__GNUC__) && defined(__alpha__) && ! (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)) +#define BAD_MEMCPY +#endif + +#if defined(_lint) && !defined(lint) +#define lint +#endif +#if SIZEOF_LONG_LONG > 4 && !defined(_LONG_LONG) +#define _LONG_LONG 1 /* For AIX string library */ +#endif + +#ifndef stdin +#include +#endif +#include +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STDDEF_H +#include +#endif + +#include +#ifdef HAVE_LIMITS_H +#include +#endif +#ifdef HAVE_FLOAT_H +#include +#endif +#ifdef HAVE_FENV_H +#include /* For fesetround() */ +#endif + +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_FCNTL_H +#include +#endif +#ifdef HAVE_SYS_STAT_H +#include +#endif +#ifdef HAVE_SYS_TIMEB_H +#include /* Avoid warnings on SCO */ +#endif +#if TIME_WITH_SYS_TIME +# include +# include +#else +# if HAVE_SYS_TIME_H +# include +# else +# include +# endif +#endif /* TIME_WITH_SYS_TIME */ +#ifdef HAVE_UNISTD_H +#include +#endif +#if defined(__cplusplus) && defined(NO_CPLUSPLUS_ALLOCA) +#undef HAVE_ALLOCA +#undef HAVE_ALLOCA_H +#endif +#ifdef HAVE_ALLOCA_H +#include +#endif + +#include /* Recommended by debian */ +/* We need the following to go around a problem with openssl on solaris */ +#if defined(HAVE_CRYPT_H) +#include +#endif + +/* + A lot of our programs uses asserts, so better to always include it + This also fixes a problem when people uses DBUG_ASSERT without including + assert.h +*/ +#include + +/* an assert that works at compile-time. only for constant expression */ +#ifdef _some_old_compiler_that_does_not_understand_the_construct_below_ +#define compile_time_assert(X) do { } while(0) +#else +#define compile_time_assert(X) \ + do \ + { \ + typedef char compile_time_assert[(X) ? 1 : -1]; \ + } while(0) +#endif + +/* Go around some bugs in different OS and compilers */ +#if defined (HPUX11) && defined(_LARGEFILE_SOURCE) +#define _LARGEFILE64_SOURCE +#endif +#if defined(_HPUX_SOURCE) && defined(HAVE_SYS_STREAM_H) +#include /* HPUX 10.20 defines ulong here. UGLY !!! */ +#define HAVE_ULONG +#endif +#if defined(HPUX10) && defined(_LARGEFILE64_SOURCE) && defined(THREAD) +/* Fix bug in setrlimit */ +#undef setrlimit +#define setrlimit cma_setrlimit64 +#endif +/* Declare madvise where it is not declared for C++, like Solaris */ +#if HAVE_MADVISE && !HAVE_DECL_MADVISE && defined(__cplusplus) +extern "C" int madvise(void *addr, size_t len, int behav); +#endif + +#ifdef __QNXNTO__ +/* This has to be after include limits.h */ +#define HAVE_ERRNO_AS_DEFINE +#define HAVE_FCNTL_LOCK +#undef HAVE_FINITE +#undef LONGLONG_MIN /* These get wrongly defined in QNX 6.2 */ +#undef LONGLONG_MAX /* standard system library 'limits.h' */ +#endif + +/* We can not live without the following defines */ + +#define USE_MYFUNC 1 /* Must use syscall indirection */ +#define MASTER 1 /* Compile without unireg */ +#define ENGLISH 1 /* Messages in English */ +#define POSIX_MISTAKE 1 /* regexp: Fix stupid spec error */ +#define USE_REGEX 1 /* We want the use the regex library */ +/* Do not define for ultra sparcs */ +#define USE_BMOVE512 1 /* Use this unless system bmove is faster */ + +#define QUOTE_ARG(x) #x /* Quote argument (before cpp) */ +#define STRINGIFY_ARG(x) QUOTE_ARG(x) /* Quote argument, after cpp */ + +/* Paranoid settings. Define I_AM_PARANOID if you are paranoid */ +#ifdef I_AM_PARANOID +#define DONT_ALLOW_USER_CHANGE 1 +#define DONT_USE_MYSQL_PWD 1 +#endif + +/* Does the system remember a signal handler after a signal ? */ +#ifndef HAVE_BSD_SIGNALS +#define DONT_REMEMBER_SIGNAL +#endif + +#if defined(_lint) || defined(FORCE_INIT_OF_VARS) +#define LINT_INIT(var) var=0 /* No uninitialize-warning */ +#else +#define LINT_INIT(var) +#endif + +#if defined(_lint) || defined(FORCE_INIT_OF_VARS) || defined(HAVE_purify) +#define PURIFY_OR_LINT_INIT(var) var=0 +#else +#define PURIFY_OR_LINT_INIT(var) +#endif + +#if !defined(HAVE_UINT) +#undef HAVE_UINT +#define HAVE_UINT +typedef unsigned int uint; +typedef unsigned short ushort; +#endif + +#define CMP_NUM(a,b) (((a) < (b)) ? -1 : ((a) == (b)) ? 0 : 1) +#define sgn(a) (((a) < 0) ? -1 : ((a) > 0) ? 1 : 0) +#define swap_variables(t, a, b) { t swap_dummy; swap_dummy= a; a= b; b= swap_dummy; } +#define test(a) ((a) ? 1 : 0) +#define set_if_bigger(a,b) do { if ((a) < (b)) (a)=(b); } while(0) +#define set_if_smaller(a,b) do { if ((a) > (b)) (a)=(b); } while(0) +#define test_all_bits(a,b) (((a) & (b)) == (b)) +#define set_bits(type, bit_count) (sizeof(type)*8 <= (bit_count) ? ~(type) 0 : ((((type) 1) << (bit_count)) - (type) 1)) +#define array_elements(A) ((uint) (sizeof(A)/sizeof(A[0]))) + +/* Define some general constants */ +#ifndef TRUE +#define TRUE (1) /* Logical true */ +#define FALSE (0) /* Logical false */ +#endif + +#if defined(__GNUC__) +#define function_volatile volatile +#define my_reinterpret_cast(A) reinterpret_cast +#define my_const_cast(A) const_cast +# ifndef GCC_VERSION +# define GCC_VERSION (__GNUC__ * 1000 + __GNUC_MINOR__) +# endif +#elif !defined(my_reinterpret_cast) +#define my_reinterpret_cast(A) (A) +#define my_const_cast(A) (A) +#endif + +#include + +/* + Wen using the embedded library, users might run into link problems, + duplicate declaration of __cxa_pure_virtual, solved by declaring it a + weak symbol. +*/ +#if defined(USE_MYSYS_NEW) && ! defined(DONT_DECLARE_CXA_PURE_VIRTUAL) +C_MODE_START +int __cxa_pure_virtual () __attribute__ ((weak)); +C_MODE_END +#endif + +/* From old s-system.h */ + +/* + Support macros for non ansi & other old compilers. Since such + things are no longer supported we do nothing. We keep then since + some of our code may still be needed to upgrade old customers. +*/ +#define _VARARGS(X) X +#define _STATIC_VARARGS(X) X + +/* The DBUG_ON flag always takes precedence over default DBUG_OFF */ +#if defined(DBUG_ON) && defined(DBUG_OFF) +#undef DBUG_OFF +#endif + +/* We might be forced to turn debug off, if not turned off already */ +#if (defined(FORCE_DBUG_OFF) || defined(_lint)) && !defined(DBUG_OFF) +# define DBUG_OFF +# ifdef DBUG_ON +# undef DBUG_ON +# endif +#endif + +typedef char my_bool; /* Small bool */ +#include + +#define MIN_ARRAY_SIZE 0 /* Zero or One. Gcc allows zero*/ +#define ASCII_BITS_USED 8 /* Bit char used */ +#define NEAR_F /* No near function handling */ + +/* Some types that is different between systems */ + +typedef int File; /* File descriptor */ +#ifndef Socket_defined +typedef int my_socket; /* File descriptor for sockets */ +#define INVALID_SOCKET -1 +#endif +/* Type for fuctions that handles signals */ +#define sig_handler void +C_MODE_START +typedef void (*sig_return)();/* Returns type from signal */ +C_MODE_END +#if defined(__GNUC__) && !defined(_lint) +typedef char pchar; /* Mixed prototypes can take char */ +typedef char puchar; /* Mixed prototypes can take char */ +typedef char pbool; /* Mixed prototypes can take char */ +typedef short pshort; /* Mixed prototypes can take short int */ +typedef float pfloat; /* Mixed prototypes can take float */ +#else +typedef int pchar; /* Mixed prototypes can't take char */ +typedef uint puchar; /* Mixed prototypes can't take char */ +typedef int pbool; /* Mixed prototypes can't take char */ +typedef int pshort; /* Mixed prototypes can't take short int */ +typedef double pfloat; /* Mixed prototypes can't take float */ +#endif +C_MODE_START +typedef int (*qsort_cmp)(const void *,const void *); +typedef int (*qsort_cmp2)(void*, const void *,const void *); +C_MODE_END +#define qsort_t RETQSORTTYPE /* Broken GCC cant handle typedef !!!! */ +#ifdef HAVE_SYS_SOCKET_H +#include +#endif + +/* file create flags */ + +#ifndef O_SHARE /* Probably not windows */ +#define O_SHARE 0 /* Flag to my_open for shared files */ +#ifndef O_BINARY +#define O_BINARY 0 /* Flag to my_open for binary files */ +#endif +#ifndef FILE_BINARY +#define FILE_BINARY O_BINARY /* Flag to my_fopen for binary streams */ +#endif +#ifdef HAVE_FCNTL +#define HAVE_FCNTL_LOCK +#define F_TO_EOF 0L /* Param to lockf() to lock rest of file */ +#endif +#endif /* O_SHARE */ + +#ifndef O_TEMPORARY +#define O_TEMPORARY 0 +#endif +#ifndef O_SHORT_LIVED +#define O_SHORT_LIVED 0 +#endif +#ifndef O_NOFOLLOW +#define O_NOFOLLOW 0 +#endif + +/* additional file share flags for win32 */ +#ifdef __WIN__ +#define _SH_DENYRWD 0x110 /* deny read/write mode & delete */ +#define _SH_DENYWRD 0x120 /* deny write mode & delete */ +#define _SH_DENYRDD 0x130 /* deny read mode & delete */ +#define _SH_DENYDEL 0x140 /* deny delete only */ +#endif /* __WIN__ */ + + +/* #define USE_RECORD_LOCK */ + + /* Unsigned types supported by the compiler */ +#define UNSINT8 /* unsigned int8 (char) */ +#define UNSINT16 /* unsigned int16 */ +#define UNSINT32 /* unsigned int32 */ + + /* General constants */ +#define FN_LEN 256 /* Max file name len */ +#define FN_HEADLEN 253 /* Max length of filepart of file name */ +#define FN_EXTLEN 20 /* Max length of extension (part of FN_LEN) */ +#define FN_REFLEN 512 /* Max length of full path-name */ +#define FN_EXTCHAR '.' +#define FN_HOMELIB '~' /* ~/ is used as abbrev for home dir */ +#define FN_CURLIB '.' /* ./ is used as abbrev for current dir */ +#define FN_PARENTDIR ".." /* Parent directory; Must be a string */ + +#ifndef FN_LIBCHAR +#define FN_LIBCHAR '/' +#define FN_ROOTDIR "/" +#endif + +/* + MY_FILE_MIN is Windows speciality and is used to quickly detect + the mismatch of CRT and mysys file IO usage on Windows at runtime. + CRT file descriptors can be in the range 0-2047, whereas descriptors returned + by my_open() will start with 2048. If a file descriptor with value less then + MY_FILE_MIN is passed to mysys IO function, chances are it stemms from + open()/fileno() and not my_open()/my_fileno. + + For Posix, mysys functions are light wrappers around libc, and MY_FILE_MIN + is logically 0. +*/ + +#ifdef _WIN32 +#define MY_FILE_MIN 2048 +#else +#define MY_FILE_MIN 0 +#endif + +/* + MY_NFILE is the default size of my_file_info array. + + It is larger on Windows, because it all file handles are stored in my_file_info + Default size is 16384 and this should be enough for most cases.If it is not + enough, --max-open-files with larger value can be used. + + For Posix , my_file_info array is only used to store filenames for + error reporting and its size is not a limitation for number of open files. +*/ +#ifdef _WIN32 +#define MY_NFILE (16384 + MY_FILE_MIN) +#else +#define MY_NFILE 64 +#endif + +#ifndef OS_FILE_LIMIT +#define OS_FILE_LIMIT 65535 +#endif + +/* #define EXT_IN_LIBNAME */ +/* #define FN_NO_CASE_SENCE */ +/* #define FN_UPPER_CASE TRUE */ + +/* + Io buffer size; Must be a power of 2 and a multiple of 512. May be + smaller what the disk page size. This influences the speed of the + isam btree library. eg to big to slow. +*/ +#define IO_SIZE 4096 +/* + How much overhead does malloc have. The code often allocates + something like 1024-MALLOC_OVERHEAD bytes +*/ +#ifdef SAFEMALLOC +#define MALLOC_OVERHEAD (8+24+4) +#else +#define MALLOC_OVERHEAD 8 +#endif + /* get memory in huncs */ +#define ONCE_ALLOC_INIT (uint) (4096-MALLOC_OVERHEAD) + /* Typical record cash */ +#define RECORD_CACHE_SIZE (uint) (64*1024-MALLOC_OVERHEAD) + /* Typical key cash */ +#define KEY_CACHE_SIZE (uint) (8*1024*1024-MALLOC_OVERHEAD) + /* Default size of a key cache block */ +#define KEY_CACHE_BLOCK_SIZE (uint) 1024 + + + /* Some things that this system doesn't have */ + +#define NO_HASH /* Not needed anymore */ +#ifdef _WIN32 +#define NO_DIR_LIBRARY /* Not standard dir-library */ +#endif + +/* Some defines of functions for portability */ + +#undef remove /* Crashes MySQL on SCO 5.0.0 */ +#ifndef __WIN__ +#define closesocket(A) close(A) +#ifndef ulonglong2double +#define ulonglong2double(A) ((double) (ulonglong) (A)) +#define my_off_t2double(A) ((double) (my_off_t) (A)) +#endif +#ifndef double2ulonglong +#define double2ulonglong(A) ((ulonglong) (double) (A)) +#endif +#endif + +#ifndef offsetof +#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) +#endif +#define ulong_to_double(X) ((double) (ulong) (X)) +#define SET_STACK_SIZE(X) /* Not needed on real machines */ + +#ifndef STACK_DIRECTION +#error "please add -DSTACK_DIRECTION=1 or -1 to your CPPFLAGS" +#endif + +#if !defined(HAVE_STRTOK_R) +inline char *strtok_r(char *str, const char *delim, char **saveptr) +{ + return strtok(str,delim); +} +#endif + +/* This is from the old m-machine.h file */ + +#if SIZEOF_LONG_LONG > 4 +#define HAVE_LONG_LONG 1 +#endif + +/* + Some pre-ANSI-C99 systems like AIX 5.1 and Linux/GCC 2.95 define + ULONGLONG_MAX, LONGLONG_MIN, LONGLONG_MAX; we use them if they're defined. + Also on Windows we define these constants by hand in config-win.h. +*/ + +#if defined(HAVE_LONG_LONG) && !defined(LONGLONG_MIN) +#define LONGLONG_MIN ((long long) 0x8000000000000000LL) +#define LONGLONG_MAX ((long long) 0x7FFFFFFFFFFFFFFFLL) +#endif + +#if defined(HAVE_LONG_LONG) && !defined(ULONGLONG_MAX) +/* First check for ANSI C99 definition: */ +#ifdef ULLONG_MAX +#define ULONGLONG_MAX ULLONG_MAX +#else +#define ULONGLONG_MAX ((unsigned long long)(~0ULL)) +#endif +#endif /* defined (HAVE_LONG_LONG) && !defined(ULONGLONG_MAX)*/ + +#define INT_MIN32 (~0x7FFFFFFFL) +#define INT_MAX32 0x7FFFFFFFL +#define UINT_MAX32 0xFFFFFFFFL +#define INT_MIN24 (~0x007FFFFF) +#define INT_MAX24 0x007FFFFF +#define UINT_MAX24 0x00FFFFFF +#define INT_MIN16 (~0x7FFF) +#define INT_MAX16 0x7FFF +#define UINT_MAX16 0xFFFF +#define INT_MIN8 (~0x7F) +#define INT_MAX8 0x7F +#define UINT_MAX8 0xFF + +/* From limits.h instead */ +#ifndef DBL_MIN +#define DBL_MIN 4.94065645841246544e-324 +#define FLT_MIN ((float)1.40129846432481707e-45) +#endif +#ifndef DBL_MAX +#define DBL_MAX 1.79769313486231470e+308 +#define FLT_MAX ((float)3.40282346638528860e+38) +#endif +#ifndef SIZE_T_MAX +#define SIZE_T_MAX ~((size_t) 0) +#endif + +#ifndef isfinite +#ifdef HAVE_FINITE +#define isfinite(x) finite(x) +#else +#define finite(x) (1.0 / fabs(x) > 0.0) +#endif /* HAVE_FINITE */ +#endif /* isfinite */ + +#ifndef HAVE_ISNAN +#define isnan(x) ((x) != (x)) +#endif + +#ifdef HAVE_ISINF +/* Check if C compiler is affected by GCC bug #39228 */ +#if !defined(__cplusplus) && defined(HAVE_BROKEN_ISINF) +/* Force store/reload of the argument to/from a 64-bit double */ +static inline double my_isinf(double x) +{ + volatile double t= x; + return isinf(t); +} +#else +/* System-provided isinf() is available and safe to use */ +#define my_isinf(X) isinf(X) +#endif +#else /* !HAVE_ISINF */ +#define my_isinf(X) (!finite(X) && !isnan(X)) +#endif + +/* Define missing math constants. */ +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif +#ifndef M_E +#define M_E 2.7182818284590452354 +#endif +#ifndef M_LN2 +#define M_LN2 0.69314718055994530942 +#endif + +/* + Max size that must be added to a so that we know Size to make + adressable obj. +*/ +#if SIZEOF_CHARP == 4 +typedef long my_ptrdiff_t; +#else +typedef long long my_ptrdiff_t; +#endif + +#define MY_ALIGN(A,L) (((A) + (L) - 1) & ~((L) - 1)) +#define ALIGN_SIZE(A) MY_ALIGN((A),sizeof(double)) +/* Size to make adressable obj. */ +#define ALIGN_PTR(A, t) ((t*) MY_ALIGN((A),sizeof(t))) + /* Offset of field f in structure t */ +#define OFFSET(t, f) ((size_t)(char *)&((t *)0)->f) +#define ADD_TO_PTR(ptr,size,type) (type) ((uchar*) (ptr)+size) +#define PTR_BYTE_DIFF(A,B) (my_ptrdiff_t) ((uchar*) (A) - (uchar*) (B)) + +#define MY_DIV_UP(A, B) (((A) + (B) - 1) / (B)) +#define MY_ALIGNED_BYTE_ARRAY(N, S, T) T N[MY_DIV_UP(S, sizeof(T))] + +/* + Custom version of standard offsetof() macro which can be used to get + offsets of members in class for non-POD types (according to the current + version of C++ standard offsetof() macro can't be used in such cases and + attempt to do so causes warnings to be emitted, OTOH in many cases it is + still OK to assume that all instances of the class has the same offsets + for the same members). + + This is temporary solution which should be removed once File_parser class + and related routines are refactored. +*/ + +#define my_offsetof(TYPE, MEMBER) \ + ((size_t)((char *)&(((TYPE *)0x10)->MEMBER) - (char*)0x10)) + +#define NullS STATIC_CAST(char *)(0) +/* Nowdays we do not support MessyDos */ +#ifndef NEAR +#define NEAR /* Who needs segments ? */ +#define FAR /* On a good machine */ +#ifndef HUGE_PTR +#define HUGE_PTR +#endif +#endif +#if defined(__IBMC__) || defined(__IBMCPP__) +/* This was _System _Export but caused a lot of warnings on _AIX43 */ +#define STDCALL +#elif !defined( STDCALL) +#define STDCALL +#endif + +/* Typdefs for easyier portability */ + +#ifndef HAVE_UCHAR +typedef unsigned char uchar; /* Short for unsigned char */ +#endif + +#ifndef HAVE_INT8 +typedef signed char int8; /* Signed integer >= 8 bits */ +#endif +#ifndef HAVE_UINT8 +typedef unsigned char uint8; /* Unsigned integer >= 8 bits */ +#endif +#ifndef HAVE_INT16 +typedef short int16; +#endif +#ifndef HAVE_UINT16 +typedef unsigned short uint16; +#endif +#if SIZEOF_INT == 4 +#ifndef HAVE_INT32 +typedef int int32; +#endif +#ifndef HAVE_UINT32 +typedef unsigned int uint32; +#endif +#elif SIZEOF_LONG == 4 +#ifndef HAVE_INT32 +typedef long int32; +#endif +#ifndef HAVE_UINT32 +typedef unsigned long uint32; +#endif +#else +#error Neither int or long is of 4 bytes width +#endif + +#if !defined(HAVE_ULONG) && !defined(__USE_MISC) +typedef unsigned long ulong; /* Short for unsigned long */ +#endif +#ifndef longlong_defined +/* + Using [unsigned] long long is preferable as [u]longlong because we use + [unsigned] long long unconditionally in many places, + for example in constants with [U]LL suffix. +*/ +#if defined(HAVE_LONG_LONG) && SIZEOF_LONG_LONG == 8 +typedef unsigned long long int ulonglong; /* ulong or unsigned long long */ +typedef long long int longlong; +#else +typedef unsigned long ulonglong; /* ulong or unsigned long long */ +typedef long longlong; +#endif +#endif +#ifndef HAVE_INT64 +typedef longlong int64; +#endif +#ifndef HAVE_UINT64 +typedef ulonglong uint64; +#endif + +#if defined(NO_CLIENT_LONG_LONG) +typedef unsigned long my_ulonglong; +#elif defined (__WIN__) +typedef unsigned __int64 my_ulonglong; +#else +typedef unsigned long long my_ulonglong; +#endif + +#if SIZEOF_CHARP == SIZEOF_INT +typedef int intptr; +#elif SIZEOF_CHARP == SIZEOF_LONG +typedef long intptr; +#elif SIZEOF_CHARP == SIZEOF_LONG_LONG +typedef long long intptr; +#else +#error sizeof(void *) is neither sizeof(int) nor sizeof(long) nor sizeof(long long) +#endif + +#define MY_ERRPTR ((void*)(intptr)1) + +#ifdef USE_RAID +/* + The following is done with a if to not get problems with pre-processors + with late define evaluation +*/ +#if SIZEOF_OFF_T == 4 +#define SYSTEM_SIZEOF_OFF_T 4 +#else +#define SYSTEM_SIZEOF_OFF_T 8 +#endif +#undef SIZEOF_OFF_T +#define SIZEOF_OFF_T 8 +#else +#define SYSTEM_SIZEOF_OFF_T SIZEOF_OFF_T +#endif /* USE_RAID */ + +#if SIZEOF_OFF_T > 4 +typedef ulonglong my_off_t; +#else +typedef unsigned long my_off_t; +#endif +#define MY_FILEPOS_ERROR (~STATIC_CAST(my_off_t)(0)) +#if !defined(__WIN__) +typedef off_t os_off_t; +#endif + +#if defined(__WIN__) +#define socket_errno WSAGetLastError() +#define SOCKET_EINTR WSAEINTR +#define SOCKET_EAGAIN WSAEINPROGRESS +#define SOCKET_ETIMEDOUT WSAETIMEDOUT +#define SOCKET_EWOULDBLOCK WSAEWOULDBLOCK +#define SOCKET_EADDRINUSE WSAEADDRINUSE +#define SOCKET_ENFILE ENFILE +#define SOCKET_EMFILE EMFILE +#else /* Unix */ +#define socket_errno errno +#define closesocket(A) close(A) +#define SOCKET_EINTR EINTR +#define SOCKET_EAGAIN EAGAIN +#define SOCKET_ETIMEDOUT SOCKET_EINTR +#define SOCKET_EWOULDBLOCK EWOULDBLOCK +#define SOCKET_EADDRINUSE EADDRINUSE +#define SOCKET_ENFILE ENFILE +#define SOCKET_EMFILE EMFILE +#endif + +typedef uint8 int7; /* Most effective integer 0 <= x <= 127 */ +typedef short int15; /* Most effective integer 0 <= x <= 32767 */ +typedef int myf; /* Type of MyFlags in my_funcs */ + /* Macros for converting *constants* to the right type */ +#define INT8(v) (int8) (v) +#define INT16(v) (int16) (v) +#define INT32(v) (int32) (v) +#define MYF(v) STATIC_CAST(myf)(v) + +/* + Defines to make it possible to prioritize register assignments. No + longer that important with modern compilers. +*/ +#ifndef USING_X +#define reg1 register +#define reg2 register +#define reg3 register +#define reg4 register +#define reg5 register +#define reg6 register +#define reg7 register +#define reg8 register +#define reg9 register +#define reg10 register +#define reg11 register +#define reg12 register +#define reg13 register +#define reg14 register +#define reg15 register +#define reg16 register +#endif + +/* + Sometimes we want to make sure that the variable is not put into + a register in debugging mode so we can see its value in the core +*/ + +#ifndef DBUG_OFF +#define dbug_volatile volatile +#else +#define dbug_volatile +#endif + +/* Some helper macros */ +#define YESNO(X) ((X) ? "yes" : "no") + +/* Defines for time function */ +#define SCALE_SEC 100 +#define SCALE_USEC 10000 +#define MY_HOW_OFTEN_TO_ALARM 2 /* How often we want info on screen */ +#define MY_HOW_OFTEN_TO_WRITE 10000 /* How often we want info on screen */ + +/* + Define-funktions for reading and storing in machine independent format + (low byte first) +*/ + +/* Optimized store functions for Intel x86 */ +#if defined(__i386__) || defined(_WIN32) +#define sint2korr(A) (*((const int16 *) (A))) +#define sint3korr(A) ((int32) ((((uchar) (A)[2]) & 128) ? \ + (((uint32) 255L << 24) | \ + (((uint32) (uchar) (A)[2]) << 16) |\ + (((uint32) (uchar) (A)[1]) << 8) | \ + ((uint32) (uchar) (A)[0])) : \ + (((uint32) (uchar) (A)[2]) << 16) |\ + (((uint32) (uchar) (A)[1]) << 8) | \ + ((uint32) (uchar) (A)[0]))) +#define sint4korr(A) (*((const long *) (A))) +#define uint2korr(A) (*((const uint16 *) (A))) +#if defined(HAVE_purify) && !defined(_WIN32) +#define uint3korr(A) (uint32) (((uint32) ((uchar) (A)[0])) +\ + (((uint32) ((uchar) (A)[1])) << 8) +\ + (((uint32) ((uchar) (A)[2])) << 16)) +#else +/* + ATTENTION ! + + Please, note, uint3korr reads 4 bytes (not 3) ! + It means, that you have to provide enough allocated space ! +*/ +#define uint3korr(A) (long) (*((const unsigned int *) (A)) & 0xFFFFFF) +#endif /* HAVE_purify && !_WIN32 */ +#define uint4korr(A) (*((const uint32 *) (A))) +#define uint5korr(A) ((ulonglong)(((uint32) ((uchar) (A)[0])) +\ + (((uint32) ((uchar) (A)[1])) << 8) +\ + (((uint32) ((uchar) (A)[2])) << 16) +\ + (((uint32) ((uchar) (A)[3])) << 24)) +\ + (((ulonglong) ((uchar) (A)[4])) << 32)) +#define uint6korr(A) ((ulonglong)(((uint32) ((uchar) (A)[0])) + \ + (((uint32) ((uchar) (A)[1])) << 8) + \ + (((uint32) ((uchar) (A)[2])) << 16) + \ + (((uint32) ((uchar) (A)[3])) << 24)) + \ + (((ulonglong) ((uchar) (A)[4])) << 32) + \ + (((ulonglong) ((uchar) (A)[5])) << 40)) +#define uint8korr(A) (*((const ulonglong *) (A))) +#define sint8korr(A) (*((const longlong *) (A))) +#define int2store(T,A) *((uint16*) (T))= (uint16) (A) +#define int3store(T,A) do { *(T)= (uchar) ((A));\ + *(T+1)=(uchar) (((uint) (A) >> 8));\ + *(T+2)=(uchar) (((A) >> 16)); } while (0) +#define int4store(T,A) *((long *) (T))= (long) (A) +#define int5store(T,A) do { *(T)= (uchar)((A));\ + *((T)+1)=(uchar) (((A) >> 8));\ + *((T)+2)=(uchar) (((A) >> 16));\ + *((T)+3)=(uchar) (((A) >> 24)); \ + *((T)+4)=(uchar) (((A) >> 32)); } while(0) +#define int6store(T,A) do { *(T)= (uchar)((A)); \ + *((T)+1)=(uchar) (((A) >> 8)); \ + *((T)+2)=(uchar) (((A) >> 16)); \ + *((T)+3)=(uchar) (((A) >> 24)); \ + *((T)+4)=(uchar) (((A) >> 32)); \ + *((T)+5)=(uchar) (((A) >> 40)); } while(0) +#define int8store(T,A) *((ulonglong *) (T))= (ulonglong) (A) + +typedef union { + double v; + long m[2]; +} doubleget_union; +#define doubleget(V,M) \ +do { doubleget_union _tmp; \ + _tmp.m[0] = *((const long*)(M)); \ + _tmp.m[1] = *(((const long*) (M))+1); \ + (V) = _tmp.v; } while(0) +#define doublestore(T,V) do { *((long *) T) = ((const doubleget_union *)&V)->m[0]; \ + *(((long *) T)+1) = ((const doubleget_union *)&V)->m[1]; \ + } while (0) +#define float4get(V,M) do { *((float *) &(V)) = *((const float*) (M)); } while(0) +#define float8get(V,M) doubleget((V),(M)) +#define float4store(V,M) memcpy((uchar*) V,(const uchar*) (&M),sizeof(float)) +#define floatstore(T,V) memcpy((uchar*)(T), (const uchar*)(&V),sizeof(float)) +#define floatget(V,M) memcpy((uchar*) &V,(const uchar*) (M),sizeof(float)) +#define float8store(V,M) doublestore((V),(M)) +#else + +/* + We're here if it's not a IA-32 architecture (Win32 and UNIX IA-32 defines + were done before) +*/ +#define sint2korr(A) (int16) (((int16) ((uchar) (A)[0])) +\ + ((int16) ((int16) (A)[1]) << 8)) +#define sint3korr(A) ((int32) ((((uchar) (A)[2]) & 128) ? \ + (((uint32) 255L << 24) | \ + (((uint32) (uchar) (A)[2]) << 16) |\ + (((uint32) (uchar) (A)[1]) << 8) | \ + ((uint32) (uchar) (A)[0])) : \ + (((uint32) (uchar) (A)[2]) << 16) |\ + (((uint32) (uchar) (A)[1]) << 8) | \ + ((uint32) (uchar) (A)[0]))) +#define sint4korr(A) (int32) (((int32) ((uchar) (A)[0])) +\ + (((int32) ((uchar) (A)[1]) << 8)) +\ + (((int32) ((uchar) (A)[2]) << 16)) +\ + (((int32) ((int16) (A)[3]) << 24))) +#define sint8korr(A) (longlong) uint8korr(A) +#define uint2korr(A) (uint16) (((uint16) ((uchar) (A)[0])) +\ + ((uint16) ((uchar) (A)[1]) << 8)) +#define uint3korr(A) (uint32) (((uint32) ((uchar) (A)[0])) +\ + (((uint32) ((uchar) (A)[1])) << 8) +\ + (((uint32) ((uchar) (A)[2])) << 16)) +#define uint4korr(A) (uint32) (((uint32) ((uchar) (A)[0])) +\ + (((uint32) ((uchar) (A)[1])) << 8) +\ + (((uint32) ((uchar) (A)[2])) << 16) +\ + (((uint32) ((uchar) (A)[3])) << 24)) +#define uint5korr(A) ((ulonglong)(((uint32) ((uchar) (A)[0])) +\ + (((uint32) ((uchar) (A)[1])) << 8) +\ + (((uint32) ((uchar) (A)[2])) << 16) +\ + (((uint32) ((uchar) (A)[3])) << 24)) +\ + (((ulonglong) ((uchar) (A)[4])) << 32)) +#define uint6korr(A) ((ulonglong)(((uint32) ((uchar) (A)[0])) + \ + (((uint32) ((uchar) (A)[1])) << 8) + \ + (((uint32) ((uchar) (A)[2])) << 16) + \ + (((uint32) ((uchar) (A)[3])) << 24)) + \ + (((ulonglong) ((uchar) (A)[4])) << 32) + \ + (((ulonglong) ((uchar) (A)[5])) << 40)) +#define uint8korr(A) ((ulonglong)(((uint32) ((uchar) (A)[0])) +\ + (((uint32) ((uchar) (A)[1])) << 8) +\ + (((uint32) ((uchar) (A)[2])) << 16) +\ + (((uint32) ((uchar) (A)[3])) << 24)) +\ + (((ulonglong) (((uint32) ((uchar) (A)[4])) +\ + (((uint32) ((uchar) (A)[5])) << 8) +\ + (((uint32) ((uchar) (A)[6])) << 16) +\ + (((uint32) ((uchar) (A)[7])) << 24))) <<\ + 32)) +#define int2store(T,A) do { uint def_temp= (uint) (A) ;\ + *((uchar*) (T))= (uchar)(def_temp); \ + *((uchar*) (T)+1)=(uchar)((def_temp >> 8)); \ + } while(0) +#define int3store(T,A) do { /*lint -save -e734 */\ + *((uchar*)(T))=(uchar) ((A));\ + *((uchar*) (T)+1)=(uchar) (((A) >> 8));\ + *((uchar*)(T)+2)=(uchar) (((A) >> 16)); \ + /*lint -restore */} while(0) +#define int4store(T,A) do { *((char *)(T))=(char) ((A));\ + *(((char *)(T))+1)=(char) (((A) >> 8));\ + *(((char *)(T))+2)=(char) (((A) >> 16));\ + *(((char *)(T))+3)=(char) (((A) >> 24)); } while(0) +#define int5store(T,A) do { *((char *)(T))= (char)((A)); \ + *(((char *)(T))+1)= (char)(((A) >> 8)); \ + *(((char *)(T))+2)= (char)(((A) >> 16)); \ + *(((char *)(T))+3)= (char)(((A) >> 24)); \ + *(((char *)(T))+4)= (char)(((A) >> 32)); \ + } while(0) +#define int6store(T,A) do { *((char *)(T))= (char)((A)); \ + *(((char *)(T))+1)= (char)(((A) >> 8)); \ + *(((char *)(T))+2)= (char)(((A) >> 16)); \ + *(((char *)(T))+3)= (char)(((A) >> 24)); \ + *(((char *)(T))+4)= (char)(((A) >> 32)); \ + *(((char *)(T))+5)= (char)(((A) >> 40)); \ + } while(0) +#define int8store(T,A) do { uint def_temp= (uint) (A), def_temp2= (uint) ((A) >> 32); \ + int4store((T),def_temp); \ + int4store((T+4),def_temp2); } while(0) +#ifdef WORDS_BIGENDIAN +#define float4store(T,A) do { *(T)= ((uchar *) &A)[3];\ + *((T)+1)=(char) ((uchar *) &A)[2];\ + *((T)+2)=(char) ((uchar *) &A)[1];\ + *((T)+3)=(char) ((uchar *) &A)[0]; } while(0) + +#define float4get(V,M) do { float def_temp;\ + ((uchar*) &def_temp)[0]=(M)[3];\ + ((uchar*) &def_temp)[1]=(M)[2];\ + ((uchar*) &def_temp)[2]=(M)[1];\ + ((uchar*) &def_temp)[3]=(M)[0];\ + (V)=def_temp; } while(0) +#define float8store(T,V) do { *(T)= ((uchar *) &V)[7];\ + *((T)+1)=(char) ((uchar *) &V)[6];\ + *((T)+2)=(char) ((uchar *) &V)[5];\ + *((T)+3)=(char) ((uchar *) &V)[4];\ + *((T)+4)=(char) ((uchar *) &V)[3];\ + *((T)+5)=(char) ((uchar *) &V)[2];\ + *((T)+6)=(char) ((uchar *) &V)[1];\ + *((T)+7)=(char) ((uchar *) &V)[0]; } while(0) + +#define float8get(V,M) do { double def_temp;\ + ((uchar*) &def_temp)[0]=(M)[7];\ + ((uchar*) &def_temp)[1]=(M)[6];\ + ((uchar*) &def_temp)[2]=(M)[5];\ + ((uchar*) &def_temp)[3]=(M)[4];\ + ((uchar*) &def_temp)[4]=(M)[3];\ + ((uchar*) &def_temp)[5]=(M)[2];\ + ((uchar*) &def_temp)[6]=(M)[1];\ + ((uchar*) &def_temp)[7]=(M)[0];\ + (V) = def_temp; } while(0) +#else +#define float4get(V,M) memcpy_fixed((uchar*) &V,(uchar*) (M),sizeof(float)) +#define float4store(V,M) memcpy_fixed((uchar*) V,(uchar*) (&M),sizeof(float)) + +#if defined(__FLOAT_WORD_ORDER) && (__FLOAT_WORD_ORDER == __BIG_ENDIAN) +#define doublestore(T,V) do { *(((char*)T)+0)=(char) ((uchar *) &V)[4];\ + *(((char*)T)+1)=(char) ((uchar *) &V)[5];\ + *(((char*)T)+2)=(char) ((uchar *) &V)[6];\ + *(((char*)T)+3)=(char) ((uchar *) &V)[7];\ + *(((char*)T)+4)=(char) ((uchar *) &V)[0];\ + *(((char*)T)+5)=(char) ((uchar *) &V)[1];\ + *(((char*)T)+6)=(char) ((uchar *) &V)[2];\ + *(((char*)T)+7)=(char) ((uchar *) &V)[3]; }\ + while(0) +#define doubleget(V,M) do { double def_temp;\ + ((uchar*) &def_temp)[0]=(M)[4];\ + ((uchar*) &def_temp)[1]=(M)[5];\ + ((uchar*) &def_temp)[2]=(M)[6];\ + ((uchar*) &def_temp)[3]=(M)[7];\ + ((uchar*) &def_temp)[4]=(M)[0];\ + ((uchar*) &def_temp)[5]=(M)[1];\ + ((uchar*) &def_temp)[6]=(M)[2];\ + ((uchar*) &def_temp)[7]=(M)[3];\ + (V) = def_temp; } while(0) +#endif /* __FLOAT_WORD_ORDER */ + +#define float8get(V,M) doubleget((V),(M)) +#define float8store(V,M) doublestore((V),(M)) +#endif /* WORDS_BIGENDIAN */ + +#endif /* __i386__ OR _WIN32 */ + +/* + Macro for reading 32-bit integer from network byte order (big-endian) + from unaligned memory location. +*/ +#define int4net(A) (int32) (((uint32) ((uchar) (A)[3])) |\ + (((uint32) ((uchar) (A)[2])) << 8) |\ + (((uint32) ((uchar) (A)[1])) << 16) |\ + (((uint32) ((uchar) (A)[0])) << 24)) +/* + Define-funktions for reading and storing in machine format from/to + short/long to/from some place in memory V should be a (not + register) variable, M is a pointer to byte +*/ + +#ifdef WORDS_BIGENDIAN + +#define ushortget(V,M) do { V = (uint16) (((uint16) ((uchar) (M)[1]))+\ + ((uint16) ((uint16) (M)[0]) << 8)); } while(0) +#define shortget(V,M) do { V = (short) (((short) ((uchar) (M)[1]))+\ + ((short) ((short) (M)[0]) << 8)); } while(0) +#define longget(V,M) do { int32 def_temp;\ + ((uchar*) &def_temp)[0]=(M)[0];\ + ((uchar*) &def_temp)[1]=(M)[1];\ + ((uchar*) &def_temp)[2]=(M)[2];\ + ((uchar*) &def_temp)[3]=(M)[3];\ + (V)=def_temp; } while(0) +#define ulongget(V,M) do { uint32 def_temp;\ + ((uchar*) &def_temp)[0]=(M)[0];\ + ((uchar*) &def_temp)[1]=(M)[1];\ + ((uchar*) &def_temp)[2]=(M)[2];\ + ((uchar*) &def_temp)[3]=(M)[3];\ + (V)=def_temp; } while(0) +#define shortstore(T,A) do { uint def_temp=(uint) (A) ;\ + *(((char*)T)+1)=(char)(def_temp); \ + *(((char*)T)+0)=(char)(def_temp >> 8); } while(0) +#define longstore(T,A) do { *(((char*)T)+3)=((A));\ + *(((char*)T)+2)=(((A) >> 8));\ + *(((char*)T)+1)=(((A) >> 16));\ + *(((char*)T)+0)=(((A) >> 24)); } while(0) + +#define floatget(V,M) memcpy_fixed((uchar*) &V,(uchar*) (M),sizeof(float)) +#define floatstore(T,V) memcpy_fixed((uchar*) (T),(uchar*)(&V),sizeof(float)) +#define doubleget(V,M) memcpy_fixed((uchar*) &V,(uchar*) (M),sizeof(double)) +#define doublestore(T,V) memcpy_fixed((uchar*) (T),(uchar*) &V,sizeof(double)) +#define longlongget(V,M) memcpy_fixed((uchar*) &V,(uchar*) (M),sizeof(ulonglong)) +#define longlongstore(T,V) memcpy_fixed((uchar*) (T),(uchar*) &V,sizeof(ulonglong)) + +#else + +#define ushortget(V,M) do { V = uint2korr(M); } while(0) +#define shortget(V,M) do { V = sint2korr(M); } while(0) +#define longget(V,M) do { V = sint4korr(M); } while(0) +#define ulongget(V,M) do { V = uint4korr(M); } while(0) +#define shortstore(T,V) int2store(T,V) +#define longstore(T,V) int4store(T,V) +#ifndef floatstore +#define floatstore(T,V) memcpy_fixed((uchar*) (T),(uchar*) (&V),sizeof(float)) +#define floatget(V,M) memcpy_fixed((uchar*) &V, (uchar*) (M), sizeof(float)) +#endif +#ifndef doubleget +#define doubleget(V,M) memcpy_fixed((uchar*) &V,(uchar*) (M),sizeof(double)) +#define doublestore(T,V) memcpy_fixed((uchar*) (T),(uchar*) &V,sizeof(double)) +#endif /* doubleget */ +#define longlongget(V,M) memcpy_fixed((uchar*) &V,(uchar*) (M),sizeof(ulonglong)) +#define longlongstore(T,V) memcpy_fixed((uchar*) (T),(uchar*) &V,sizeof(ulonglong)) + +#endif /* WORDS_BIGENDIAN */ + +/* sprintf does not always return the number of bytes :- */ +#ifdef SPRINTF_RETURNS_INT +#define my_sprintf(buff,args) sprintf args +#else +#ifdef SPRINTF_RETURNS_PTR +#define my_sprintf(buff,args) ((int)(sprintf args - buff)) +#else +#define my_sprintf(buff,args) ((ulong) sprintf args, (ulong) strlen(buff)) +#endif +#endif + +#ifndef THREAD +#define thread_safe_increment(V,L) (V)++ +#define thread_safe_decrement(V,L) (V)-- +#define thread_safe_add(V,C,L) (V)+=(C) +#define thread_safe_sub(V,C,L) (V)-=(C) +#define statistic_increment(V,L) (V)++ +#define statistic_decrement(V,L) (V)-- +#define statistic_add(V,C,L) (V)+=(C) +#define statistic_sub(V,C,L) (V)-=(C) +#endif + +#if defined(HAVE_CHARSET_utf8mb3) || defined(HAVE_CHARSET_utf8mb4) +#define MYSQL_UNIVERSAL_CLIENT_CHARSET "utf8" +#else +#define MYSQL_UNIVERSAL_CLIENT_CHARSET MYSQL_DEFAULT_CHARSET_NAME +#endif + +#if defined(EMBEDDED_LIBRARY) && !defined(HAVE_EMBEDDED_PRIVILEGE_CONTROL) +#define NO_EMBEDDED_ACCESS_CHECKS +#endif + +#ifdef HAVE_DLOPEN +#if defined(__WIN__) +#define dlsym(lib, name) GetProcAddress((HMODULE)lib, name) +#define dlopen(libname, unused) LoadLibraryEx(libname, NULL, 0) +#define dlclose(lib) FreeLibrary((HMODULE)lib) +#elif defined(HAVE_DLFCN_H) +#include +#endif +#endif + +/* FreeBSD 2.2.2 does not define RTLD_NOW) */ +#ifndef RTLD_NOW +#define RTLD_NOW 1 +#endif + +#ifndef HAVE_DLERROR +#define dlerror() "" +#endif + + +#ifndef __NETWARE__ +/* + * Include standard definitions of operator new and delete. + */ +#ifdef __cplusplus +#include +#endif +#else +/* + * Define placement versions of operator new and operator delete since + * we don't have when building for Netware. + */ +#ifdef __cplusplus +inline void *operator new(size_t, void *ptr) { return ptr; } +inline void *operator new[](size_t, void *ptr) { return ptr; } +inline void operator delete(void*, void*) { /* Do nothing */ } +inline void operator delete[](void*, void*) { /* Do nothing */ } +#endif +#endif + +/* Length of decimal number represented by INT32. */ +#define MY_INT32_NUM_DECIMAL_DIGITS 11 + +/* Length of decimal number represented by INT64. */ +#define MY_INT64_NUM_DECIMAL_DIGITS 21 + +/* Define some useful general macros (should be done after all headers). */ +#if !defined(max) +#define max(a, b) ((a) > (b) ? (a) : (b)) +#define min(a, b) ((a) < (b) ? (a) : (b)) +#endif +/* + Only Linux is known to need an explicit sync of the directory to make sure a + file creation/deletion/renaming in(from,to) this directory durable. +*/ +#ifdef TARGET_OS_LINUX +#define NEED_EXPLICIT_SYNC_DIR 1 +#else +/* + On linux default rwlock scheduling policy is good enough for + waiting_threads.c, on other systems use our special implementation + (which is slower). + + QQ perhaps this should be tested in configure ? how ? +*/ +#define WT_RWLOCKS_USE_MUTEXES 1 +#endif + +#if !defined(__cplusplus) && !defined(bool) +#define bool In_C_you_should_use_my_bool_instead() +#endif + +/* Provide __func__ macro definition for platforms that miss it. */ +#if __STDC_VERSION__ < 199901L +# if __GNUC__ >= 2 +# define __func__ __FUNCTION__ +# else +# define __func__ "" +# endif +#elif defined(_MSC_VER) +# if _MSC_VER < 1300 +# define __func__ "" +# else +# define __func__ __FUNCTION__ +# endif +#elif defined(__BORLANDC__) +# define __func__ __FUNC__ +#else +# define __func__ "" +#endif + +#ifndef HAVE_RINT +/** + All integers up to this number can be represented exactly as double precision + values (DBL_MANT_DIG == 53 for IEEE 754 hardware). +*/ +#define MAX_EXACT_INTEGER ((1LL << DBL_MANT_DIG) - 1) + +/** + rint(3) implementation for platforms that do not have it. + Always rounds to the nearest integer with ties being rounded to the nearest + even integer to mimic glibc's rint() behavior in the "round-to-nearest" + FPU mode. Hardware-specific optimizations are possible (frndint on x86). + Unlike this implementation, hardware will also honor the FPU rounding mode. +*/ + +static inline double rint(double x) +{ + double f, i; + f = modf(x, &i); + + /* + All doubles with absolute values > MAX_EXACT_INTEGER are even anyway, + no need to check it. + */ + if (x > 0.0) + i += (double) ((f > 0.5) || (f == 0.5 && + i <= (double) MAX_EXACT_INTEGER && + (longlong) i % 2)); + else + i -= (double) ((f < -0.5) || (f == -0.5 && + i >= (double) -MAX_EXACT_INTEGER && + (longlong) i % 2)); + return i; +} +#endif /* HAVE_RINT */ + +/* + MYSQL_PLUGIN_IMPORT macro is used to export mysqld data + (i.e variables) for usage in storage engine loadable plugins. + Outside of Windows, it is dummy. +*/ +#ifndef MYSQL_PLUGIN_IMPORT +#if (defined(_WIN32) && defined(MYSQL_DYNAMIC_PLUGIN)) +#define MYSQL_PLUGIN_IMPORT __declspec(dllimport) +#else +#define MYSQL_PLUGIN_IMPORT +#endif +#endif + +#endif /* my_global_h */ diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/my_libwrap.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_libwrap.h new file mode 100644 index 0000000..9a85794 --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_libwrap.h @@ -0,0 +1,27 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifdef HAVE_LIBWRAP +#include +#include +#ifdef NEED_SYS_SYSLOG_H +#include +#endif /* NEED_SYS_SYSLOG_H */ + +extern void my_fromhost(struct request_info *req); +extern int my_hosts_access(struct request_info *req); +extern char *my_eval_client(struct request_info *req); + +#endif /* HAVE_LIBWRAP */ diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/my_list.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_list.h new file mode 100644 index 0000000..775b565 --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_list.h @@ -0,0 +1,45 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef _list_h_ +#define _list_h_ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct st_list { + struct st_list *prev,*next; + void *data; +} LIST; + +typedef int (*list_walk_action)(void *,void *); + +extern LIST *list_add(LIST *root,LIST *element); +extern LIST *list_delete(LIST *root,LIST *element); +extern LIST *list_cons(void *data,LIST *root); +extern LIST *list_reverse(LIST *root); +extern void list_free(LIST *root,unsigned int free_data); +extern unsigned int list_length(LIST *); +extern int list_walk(LIST *,list_walk_action action,unsigned char * argument); + +#define list_rest(a) ((a)->next) +#define list_push(a,b) (a)=list_cons((b),(a)) +#define list_pop(A) {LIST *old=(A); (A)=list_delete(old,old) ; my_free((unsigned char *) old,MYF(MY_FAE)); } + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/my_md5.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_md5.h new file mode 100644 index 0000000..6458f27 --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_md5.h @@ -0,0 +1,54 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* See md5.c for explanation and copyright information. */ + +/* + * $FreeBSD: src/contrib/cvs/lib/md5.h,v 1.2 1999/12/11 15:10:02 peter Exp $ + */ + +/* Unlike previous versions of this code, uint32 need not be exactly + 32 bits, merely 32 bits or more. Choosing a data type which is 32 + bits instead of 64 is not important; speed is considerably more + important. ANSI guarantees that "unsigned long" will be big enough, + and always using it seems to have few disadvantages. */ +typedef uint32 cvs_uint32; + +typedef struct { + cvs_uint32 buf[4]; + cvs_uint32 bits[2]; + unsigned char in[64]; +} my_MD5Context; + +#ifdef __cplusplus +extern "C" { +#endif +void my_MD5Init (my_MD5Context *context); +void my_MD5Update (my_MD5Context *context, + unsigned char const *buf, unsigned len); +void my_MD5Final (unsigned char digest[16], + my_MD5Context *context); + +#ifdef __cplusplus +} +#endif + +#define MY_MD5_HASH(digest,buf,len) \ +do { \ + my_MD5Context ctx; \ + my_MD5Init (&ctx); \ + my_MD5Update (&ctx, buf, len); \ + my_MD5Final (digest, &ctx); \ +} while (0) diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/my_net.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_net.h new file mode 100644 index 0000000..18fb3db --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_net.h @@ -0,0 +1,114 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* + thread safe version of some common functions: + my_inet_ntoa + + This file is also used to make handling of sockets and ioctl() + portable accross systems. + +*/ + +#ifndef _my_net_h +#define _my_net_h +C_MODE_START + +#include +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_ARPA_INET_H +#include +#endif +#ifdef HAVE_POLL +#include +#endif +#ifdef HAVE_SYS_IOCTL_H +#include +#endif + +#if !defined(__WIN__) && !defined(HAVE_BROKEN_NETINET_INCLUDES) && !defined(__NETWARE__) +#include +#include +#include +#if !defined(alpha_linux_port) +#include +#endif +#endif + +#if defined(__WIN__) +#define O_NONBLOCK 1 /* For emulation of fcntl() */ + +/* + SHUT_RDWR is called SD_BOTH in windows and + is defined to 2 in winsock2.h + #define SD_BOTH 0x02 +*/ +#define SHUT_RDWR 0x02 + +#endif + +/* + On OSes which don't have the in_addr_t, we guess that using uint32 is the best + possible choice. We guess this from the fact that on HP-UX64bit & FreeBSD64bit + & Solaris64bit, in_addr_t is equivalent to uint32. And on Linux32bit too. +*/ +#ifndef HAVE_IN_ADDR_T +#define in_addr_t uint32 +#endif + +/* Thread safe or portable version of some functions */ + +void my_inet_ntoa(struct in_addr in, char *buf); + +/* + Handling of gethostbyname_r() +*/ + +#if !defined(HAVE_GETHOSTBYNAME_R) +struct hostent *my_gethostbyname_r(const char *name, + struct hostent *result, char *buffer, + int buflen, int *h_errnop); +void my_gethostbyname_r_free(); +#elif defined(HAVE_PTHREAD_ATTR_CREATE) || defined(_AIX) || defined(HAVE_GETHOSTBYNAME_R_GLIBC2_STYLE) +struct hostent *my_gethostbyname_r(const char *name, + struct hostent *result, char *buffer, + int buflen, int *h_errnop); +#define my_gethostbyname_r_free() +#if !defined(HAVE_GETHOSTBYNAME_R_GLIBC2_STYLE) && !defined(HPUX10) +#define GETHOSTBYNAME_BUFF_SIZE sizeof(struct hostent_data) +#endif /* !defined(HAVE_GETHOSTBYNAME_R_GLIBC2_STYLE) */ + +#elif defined(HAVE_GETHOSTBYNAME_R_RETURN_INT) +#define GETHOSTBYNAME_BUFF_SIZE sizeof(struct hostent_data) +struct hostent *my_gethostbyname_r(const char *name, + struct hostent *result, char *buffer, + int buflen, int *h_errnop); +#define my_gethostbyname_r_free() +#else +#define my_gethostbyname_r(A,B,C,D,E) gethostbyname_r((A),(B),(C),(D),(E)) +#define my_gethostbyname_r_free() +#endif /* !defined(HAVE_GETHOSTBYNAME_R) */ + +#ifndef GETHOSTBYNAME_BUFF_SIZE +#define GETHOSTBYNAME_BUFF_SIZE 2048 +#endif + +C_MODE_END +#endif diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/my_no_pthread.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_no_pthread.h new file mode 100644 index 0000000..b11dbff --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_no_pthread.h @@ -0,0 +1,50 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + + +#if !defined(_my_no_pthread_h) && !defined(THREAD) +#define _my_no_pthread_h + + +/* + This block is to access some thread-related type definitions + even in builds which do not need thread functions, + as some variables (based on these types) are declared + even in non-threaded builds. + Case in point: 'mf_keycache.c' +*/ +#if defined(__WIN__) +#else /* Normal threads */ +#include + +#endif /* defined(__WIN__) */ + + +/* + This undefs some pthread mutex locks when one isn't using threads + to make thread safe code, that should also work in single thread + environment, easier to use. +*/ +#define pthread_mutex_init(A,B) +#define pthread_mutex_lock(A) +#define pthread_mutex_unlock(A) +#define pthread_mutex_destroy(A) +#define my_rwlock_init(A,B) +#define rw_rdlock(A) +#define rw_wrlock(A) +#define rw_unlock(A) +#define rwlock_destroy(A) + +#endif diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/my_nosys.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_nosys.h new file mode 100644 index 0000000..df5639b --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_nosys.h @@ -0,0 +1,52 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* + Header to remove use of my_functions in functions where we need speed and + where calls to posix functions should work +*/ +#ifndef _my_nosys_h +#define _my_nosys_h +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef __MY_NOSYS__ +#define __MY_NOSYS__ + +#ifndef HAVE_STDLIB_H +#include +#endif + +#undef my_read /* Can be predefined in raid.h */ +#undef my_write +#undef my_seek +#define my_read(a,b,c,d) my_quick_read(a,b,c,d) +#define my_write(a,b,c,d) my_quick_write(a,b,c) +extern size_t my_quick_read(File Filedes,uchar *Buffer,size_t Count, + myf myFlags); +extern size_t my_quick_write(File Filedes,const uchar *Buffer,size_t Count); + +#if !defined(SAFEMALLOC) && defined(USE_HALLOC) +#define my_malloc(a,b) halloc(a,1) +#define my_no_flags_free(a) hfree(a) +#endif + +#endif /* __MY_NOSYS__ */ + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/my_pthread.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_pthread.h new file mode 100644 index 0000000..ab26860 --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_pthread.h @@ -0,0 +1,734 @@ +/* Copyright (C) 2000-2008 MySQL AB, 2008-2009 Sun Microsystems, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* Defines to make different thread packages compatible */ + +#ifndef _my_pthread_h +#define _my_pthread_h + +#ifndef ETIME +#define ETIME ETIMEDOUT /* For FreeBSD */ +#endif + +#ifdef __cplusplus +#define EXTERNC extern "C" +extern "C" { +#else +#define EXTERNC +#endif /* __cplusplus */ + +#if defined(__WIN__) +typedef CRITICAL_SECTION pthread_mutex_t; +typedef DWORD pthread_t; +typedef struct thread_attr { + DWORD dwStackSize ; + DWORD dwCreatingFlag ; +} pthread_attr_t ; + +typedef struct { int dummy; } pthread_condattr_t; + +/* Implementation of posix conditions */ + +typedef struct st_pthread_link { + DWORD thread_id; + struct st_pthread_link *next; +} pthread_link; + +typedef struct { + uint32 waiting; + CRITICAL_SECTION lock_waiting; + + enum { + SIGNAL= 0, + BROADCAST= 1, + MAX_EVENTS= 2 + } EVENTS; + + HANDLE events[MAX_EVENTS]; + HANDLE broadcast_block_event; + +} pthread_cond_t; + + +typedef int pthread_mutexattr_t; +#define pthread_self() GetCurrentThreadId() +#define pthread_handler_t EXTERNC void * __cdecl +typedef void * (__cdecl *pthread_handler)(void *); + +/* + Struct and macros to be used in combination with the + windows implementation of pthread_cond_timedwait +*/ + +/* + Declare a union to make sure FILETIME is properly aligned + so it can be used directly as a 64 bit value. The value + stored is in 100ns units. + */ +union ft64 { + FILETIME ft; + __int64 i64; +}; + +struct timespec { + union ft64 tv; + /* The max timeout value in millisecond for pthread_cond_timedwait */ + long max_timeout_msec; +}; + +#define set_timespec_time_nsec(ABSTIME,TIME,NSEC) do { \ + (ABSTIME).tv.i64= (TIME)+(__int64)(NSEC)/100; \ + (ABSTIME).max_timeout_msec= (long)((NSEC)/1000000); \ +} while(0) + +#define set_timespec_nsec(ABSTIME,NSEC) do { \ + union ft64 tv; \ + GetSystemTimeAsFileTime(&tv.ft); \ + set_timespec_time_nsec((ABSTIME), tv.i64, (NSEC)); \ +} while(0) + +int win_pthread_mutex_trylock(pthread_mutex_t *mutex); +int pthread_create(pthread_t *,pthread_attr_t *,pthread_handler,void *); +int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr); +int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex); +int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, + struct timespec *abstime); +int pthread_cond_signal(pthread_cond_t *cond); +int pthread_cond_broadcast(pthread_cond_t *cond); +int pthread_cond_destroy(pthread_cond_t *cond); +int pthread_attr_init(pthread_attr_t *connect_att); +int pthread_attr_setstacksize(pthread_attr_t *connect_att,DWORD stack); +int pthread_attr_destroy(pthread_attr_t *connect_att); +struct tm *localtime_r(const time_t *timep,struct tm *tmp); +struct tm *gmtime_r(const time_t *timep,struct tm *tmp); + +void pthread_exit(void *a); +int pthread_join(pthread_t thread, void **value_ptr); + + +#define ETIMEDOUT 145 /* Win32 doesn't have this */ +#define HAVE_LOCALTIME_R 1 +#define _REENTRANT 1 +#define HAVE_PTHREAD_ATTR_SETSTACKSIZE 1 + + +#undef SAFE_MUTEX /* This will cause conflicts */ +#define pthread_key(T,V) DWORD V +#define pthread_key_create(A,B) ((*A=TlsAlloc())==0xFFFFFFFF) +#define pthread_key_delete(A) TlsFree(A) +#define my_pthread_setspecific_ptr(T,V) (!TlsSetValue((T),(V))) +#define pthread_setspecific(A,B) (!TlsSetValue((A),(B))) +#define pthread_getspecific(A) (TlsGetValue(A)) +#define my_pthread_getspecific(T,A) ((T) TlsGetValue(A)) +#define my_pthread_getspecific_ptr(T,V) ((T) TlsGetValue(V)) + +#define pthread_equal(A,B) ((A) == (B)) +#define pthread_mutex_init(A,B) (InitializeCriticalSection(A),0) +#define pthread_mutex_lock(A) (EnterCriticalSection(A),0) +#define pthread_mutex_trylock(A) win_pthread_mutex_trylock((A)) +#define pthread_mutex_unlock(A) (LeaveCriticalSection(A),0) +#define pthread_mutex_destroy(A) DeleteCriticalSection(A) +#define pthread_kill(A,B) pthread_dummy((A) ? 0 : ESRCH) + + +/* Dummy defines for easier code */ +#define pthread_attr_setdetachstate(A,B) pthread_dummy(0) +#define pthread_attr_setscope(A,B) +#define pthread_detach_this_thread() +#define pthread_condattr_init(A) +#define pthread_condattr_destroy(A) +#define pthread_yield() SwitchToThread() + + +#else /* Normal threads */ + +#ifdef HAVE_rts_threads +#define sigwait org_sigwait +#include +#undef sigwait +#endif +#include +#ifndef _REENTRANT +#define _REENTRANT +#endif +#ifdef HAVE_THR_SETCONCURRENCY +#include /* Probably solaris */ +#endif +#ifdef HAVE_SCHED_H +#include +#endif +#ifdef HAVE_SYNCH_H +#include +#endif + +#ifdef __NETWARE__ +void my_pthread_exit(void *status); +#define pthread_exit(A) my_pthread_exit(A) +#endif + +#define pthread_key(T,V) pthread_key_t V +#define my_pthread_getspecific_ptr(T,V) my_pthread_getspecific(T,(V)) +#define my_pthread_setspecific_ptr(T,V) pthread_setspecific(T,(void*) (V)) +#define pthread_detach_this_thread() +#define pthread_handler_t EXTERNC void * +typedef void *(* pthread_handler)(void *); + +/* Test first for RTS or FSU threads */ + +#if defined(PTHREAD_SCOPE_GLOBAL) && !defined(PTHREAD_SCOPE_SYSTEM) +#define HAVE_rts_threads +extern int my_pthread_create_detached; +#define pthread_sigmask(A,B,C) sigprocmask((A),(B),(C)) +#define PTHREAD_CREATE_DETACHED &my_pthread_create_detached +#define PTHREAD_SCOPE_SYSTEM PTHREAD_SCOPE_GLOBAL +#define PTHREAD_SCOPE_PROCESS PTHREAD_SCOPE_LOCAL +#define USE_ALARM_THREAD +#endif /* defined(PTHREAD_SCOPE_GLOBAL) && !defined(PTHREAD_SCOPE_SYSTEM) */ + +#if defined(_BSDI_VERSION) && _BSDI_VERSION < 199910 +int sigwait(sigset_t *set, int *sig); +#endif + +#ifndef HAVE_NONPOSIX_SIGWAIT +#define my_sigwait(A,B) sigwait((A),(B)) +#else +int my_sigwait(const sigset_t *set,int *sig); +#endif + +#ifdef HAVE_NONPOSIX_PTHREAD_MUTEX_INIT +#ifndef SAFE_MUTEX +#define pthread_mutex_init(a,b) my_pthread_mutex_noposix_init((a),(b)) +extern int my_pthread_mutex_noposix_init(pthread_mutex_t *mp, + const pthread_mutexattr_t *attr); +#endif /* SAFE_MUTEX */ +#define pthread_cond_init(a,b) my_pthread_cond_noposix_init((a),(b)) +extern int my_pthread_cond_noposix_init(pthread_cond_t *mp, + const pthread_condattr_t *attr); +#endif /* HAVE_NONPOSIX_PTHREAD_MUTEX_INIT */ + +#if defined(HAVE_SIGTHREADMASK) && !defined(HAVE_PTHREAD_SIGMASK) +#define pthread_sigmask(A,B,C) sigthreadmask((A),(B),(C)) +#endif + +#if !defined(HAVE_SIGWAIT) && !defined(HAVE_rts_threads) && !defined(sigwait) && !defined(alpha_linux_port) && !defined(HAVE_NONPOSIX_SIGWAIT) && !defined(HAVE_DEC_3_2_THREADS) && !defined(_AIX) +int sigwait(sigset_t *setp, int *sigp); /* Use our implemention */ +#endif + + +/* + We define my_sigset() and use that instead of the system sigset() so that + we can favor an implementation based on sigaction(). On some systems, such + as Mac OS X, sigset() results in flags such as SA_RESTART being set, and + we want to make sure that no such flags are set. +*/ +#if defined(HAVE_SIGACTION) && !defined(my_sigset) +#define my_sigset(A,B) do { struct sigaction l_s; sigset_t l_set; int l_rc; \ + DBUG_ASSERT((A) != 0); \ + sigemptyset(&l_set); \ + l_s.sa_handler = (B); \ + l_s.sa_mask = l_set; \ + l_s.sa_flags = 0; \ + l_rc= sigaction((A), &l_s, (struct sigaction *) NULL);\ + DBUG_ASSERT(l_rc == 0); \ + } while (0) +#elif defined(HAVE_SIGSET) && !defined(my_sigset) +#define my_sigset(A,B) sigset((A),(B)) +#elif !defined(my_sigset) +#define my_sigset(A,B) signal((A),(B)) +#endif + +#if !defined(HAVE_PTHREAD_ATTR_SETSCOPE) || defined(HAVE_DEC_3_2_THREADS) +#define pthread_attr_setscope(A,B) +#undef HAVE_GETHOSTBYADDR_R /* No definition */ +#endif + +#if defined(HAVE_BROKEN_PTHREAD_COND_TIMEDWAIT) && !defined(SAFE_MUTEX) +extern int my_pthread_cond_timedwait(pthread_cond_t *cond, + pthread_mutex_t *mutex, + struct timespec *abstime); +#define pthread_cond_timedwait(A,B,C) my_pthread_cond_timedwait((A),(B),(C)) +#endif + +#if !defined( HAVE_NONPOSIX_PTHREAD_GETSPECIFIC) +#define my_pthread_getspecific(A,B) ((A) pthread_getspecific(B)) +#else +#define my_pthread_getspecific(A,B) ((A) my_pthread_getspecific_imp(B)) +void *my_pthread_getspecific_imp(pthread_key_t key); +#endif + +#ifndef HAVE_LOCALTIME_R +struct tm *localtime_r(const time_t *clock, struct tm *res); +#endif + +#ifndef HAVE_GMTIME_R +struct tm *gmtime_r(const time_t *clock, struct tm *res); +#endif + +#ifdef HAVE_PTHREAD_CONDATTR_CREATE +/* DCE threads on HPUX 10.20 */ +#define pthread_condattr_init pthread_condattr_create +#define pthread_condattr_destroy pthread_condattr_delete +#endif + +/* FSU THREADS */ +#if !defined(HAVE_PTHREAD_KEY_DELETE) && !defined(pthread_key_delete) +#define pthread_key_delete(A) pthread_dummy(0) +#endif + +#if ((defined(HAVE_PTHREAD_ATTR_CREATE) && !defined(HAVE_SIGWAIT)) || defined(HAVE_DEC_3_2_THREADS)) +/* This is set on AIX_3_2 and Siemens unix (and DEC OSF/1 3.2 too) */ +#define pthread_key_create(A,B) \ + pthread_keycreate(A,(B) ?\ + (pthread_destructor_t) (B) :\ + (pthread_destructor_t) pthread_dummy) +#define pthread_attr_init(A) pthread_attr_create(A) +#define pthread_attr_destroy(A) pthread_attr_delete(A) +#define pthread_attr_setdetachstate(A,B) pthread_dummy(0) +#define pthread_create(A,B,C,D) pthread_create((A),*(B),(C),(D)) +#ifndef pthread_sigmask +#define pthread_sigmask(A,B,C) sigprocmask((A),(B),(C)) +#endif +#define pthread_kill(A,B) pthread_dummy((A) ? 0 : ESRCH) +#undef pthread_detach_this_thread +#define pthread_detach_this_thread() { pthread_t tmp=pthread_self() ; pthread_detach(&tmp); } +#elif !defined(__NETWARE__) /* HAVE_PTHREAD_ATTR_CREATE && !HAVE_SIGWAIT */ +#ifndef HAVE_PTHREAD_KILL +# define HAVE_PTHREAD_KILL +#endif +#endif + +#endif /* defined(__WIN__) */ + +#if defined(HPUX10) && !defined(DONT_REMAP_PTHREAD_FUNCTIONS) +#undef pthread_cond_timedwait +#define pthread_cond_timedwait(a,b,c) my_pthread_cond_timedwait((a),(b),(c)) +int my_pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, + struct timespec *abstime); +#endif + +#if defined(HPUX10) +#define pthread_attr_getstacksize(A,B) my_pthread_attr_getstacksize(A,B) +void my_pthread_attr_getstacksize(pthread_attr_t *attrib, size_t *size); +#endif + +#if defined(HAVE_POSIX1003_4a_MUTEX) && !defined(DONT_REMAP_PTHREAD_FUNCTIONS) +#undef pthread_mutex_trylock +#define pthread_mutex_trylock(a) my_pthread_mutex_trylock((a)) +int my_pthread_mutex_trylock(pthread_mutex_t *mutex); +#endif + +#if !defined(HAVE_PTHREAD_YIELD_ONE_ARG) && !defined(HAVE_PTHREAD_YIELD_ZERO_ARG) +/* no pthread_yield() available */ +#ifdef HAVE_SCHED_YIELD +#define pthread_yield() sched_yield() +#elif defined(HAVE_PTHREAD_YIELD_NP) /* can be Mac OS X */ +#define pthread_yield() pthread_yield_np() +#elif defined(HAVE_THR_YIELD) +#define pthread_yield() thr_yield() +#endif +#endif + +/* + The defines set_timespec and set_timespec_nsec should be used + for calculating an absolute time at which + pthread_cond_timedwait should timeout +*/ + +#define set_timespec(ABSTIME,SEC) set_timespec_nsec((ABSTIME),(SEC)*1000000000ULL) + +#ifndef set_timespec_nsec +#define set_timespec_nsec(ABSTIME,NSEC) \ + set_timespec_time_nsec((ABSTIME),my_getsystime(),(NSEC)) +#endif /* !set_timespec_nsec */ + +/* adapt for two different flavors of struct timespec */ +#ifdef HAVE_TIMESPEC_TS_SEC +#define MY_tv_sec ts_sec +#define MY_tv_nsec ts_nsec +#else +#define MY_tv_sec tv_sec +#define MY_tv_nsec tv_nsec +#endif /* HAVE_TIMESPEC_TS_SEC */ + +#ifndef set_timespec_time_nsec +#define set_timespec_time_nsec(ABSTIME,TIME,NSEC) do { \ + ulonglong nsec= (NSEC); \ + ulonglong now= (TIME) + (nsec/100); \ + (ABSTIME).MY_tv_sec= (now / 10000000ULL); \ + (ABSTIME).MY_tv_nsec= (now % 10000000ULL * 100 + (nsec % 100)); \ +} while(0) +#endif /* !set_timespec_time_nsec */ + +/* safe_mutex adds checking to mutex for easier debugging */ + +#if defined(__NETWARE__) && !defined(SAFE_MUTEX_DETECT_DESTROY) +#define SAFE_MUTEX_DETECT_DESTROY +#endif +struct st_hash; + +typedef struct st_safe_mutex_t +{ + pthread_mutex_t global,mutex; + const char *file, *name; + uint line,count; + myf create_flags, active_flags; + ulong id; + pthread_t thread; + struct st_hash *locked_mutex, *used_mutex; + struct st_safe_mutex_t *prev, *next; +#ifdef SAFE_MUTEX_DETECT_DESTROY + struct st_safe_mutex_info_t *info; /* to track destroying of mutexes */ +#endif +} safe_mutex_t; + +typedef struct st_safe_mutex_deadlock_t +{ + const char *file, *name; + safe_mutex_t *mutex; + uint line; + ulong count; + ulong id; + my_bool warning_only; +} safe_mutex_deadlock_t; + +#ifdef SAFE_MUTEX_DETECT_DESTROY +/* + Used to track the destroying of mutexes. This needs to be a seperate + structure because the safe_mutex_t structure could be freed before + the mutexes are destroyed. +*/ + +typedef struct st_safe_mutex_info_t +{ + struct st_safe_mutex_info_t *next; + struct st_safe_mutex_info_t *prev; + const char *init_file; + uint32 init_line; +} safe_mutex_info_t; +#endif /* SAFE_MUTEX_DETECT_DESTROY */ + +int safe_mutex_init(safe_mutex_t *mp, const pthread_mutexattr_t *attr, + const char *name, myf my_flags, + const char *file, uint line); +int safe_mutex_lock(safe_mutex_t *mp, myf my_flags, const char *file, + uint line); +int safe_mutex_unlock(safe_mutex_t *mp,const char *file, uint line); +int safe_mutex_destroy(safe_mutex_t *mp,const char *file, uint line); +int safe_cond_wait(pthread_cond_t *cond, safe_mutex_t *mp,const char *file, + uint line); +int safe_cond_timedwait(pthread_cond_t *cond, safe_mutex_t *mp, + struct timespec *abstime, const char *file, uint line); +void safe_mutex_global_init(void); +void safe_mutex_end(FILE *file); +void safe_mutex_free_deadlock_data(safe_mutex_t *mp); + + /* Wrappers if safe mutex is actually used */ +#define MYF_TRY_LOCK 1 +#define MYF_NO_DEADLOCK_DETECTION 2 + +#ifdef SAFE_MUTEX +#undef pthread_mutex_init +#undef pthread_mutex_lock +#undef pthread_mutex_unlock +#undef pthread_mutex_destroy +#undef pthread_mutex_wait +#undef pthread_mutex_timedwait +#undef pthread_mutex_t +#undef pthread_cond_wait +#undef pthread_cond_timedwait +#undef pthread_mutex_trylock +#define my_pthread_mutex_init(A,B,C,D) safe_mutex_init((A),(B),(C),(D),__FILE__,__LINE__) +#define pthread_mutex_init(A,B) safe_mutex_init((A),(B),#A,0,__FILE__,__LINE__) +#define pthread_mutex_lock(A) safe_mutex_lock((A), 0, __FILE__, __LINE__) +#define my_pthread_mutex_lock(A,B) safe_mutex_lock((A), (B), __FILE__, __LINE__) +#define pthread_mutex_unlock(A) safe_mutex_unlock((A),__FILE__,__LINE__) +#define pthread_mutex_destroy(A) safe_mutex_destroy((A),__FILE__,__LINE__) +#define pthread_cond_wait(A,B) safe_cond_wait((A),(B),__FILE__,__LINE__) +#define pthread_cond_timedwait(A,B,C) safe_cond_timedwait((A),(B),(C),__FILE__,__LINE__) +#define pthread_mutex_trylock(A) safe_mutex_lock((A), MYF_TRY_LOCK, __FILE__, __LINE__) +#define pthread_mutex_t safe_mutex_t +#define safe_mutex_assert_owner(mp) \ + DBUG_ASSERT((mp)->count > 0 && \ + pthread_equal(pthread_self(), (mp)->thread)) +#define safe_mutex_assert_not_owner(mp) \ + DBUG_ASSERT(! (mp)->count || \ + ! pthread_equal(pthread_self(), (mp)->thread)) +#else +#define my_pthread_mutex_init(A,B,C,D) pthread_mutex_init((A),(B)) +#define my_pthread_mutex_lock(A,B) pthread_mutex_lock(A) +#define safe_mutex_assert_owner(mp) +#define safe_mutex_assert_not_owner(mp) +#endif /* SAFE_MUTEX */ + +#if defined(MY_PTHREAD_FASTMUTEX) && !defined(SAFE_MUTEX) +typedef struct st_my_pthread_fastmutex_t +{ + pthread_mutex_t mutex; + uint spins; + uint rng_state; +} my_pthread_fastmutex_t; +void fastmutex_global_init(void); + +int my_pthread_fastmutex_init(my_pthread_fastmutex_t *mp, + const pthread_mutexattr_t *attr); +int my_pthread_fastmutex_lock(my_pthread_fastmutex_t *mp); + +#undef pthread_mutex_init +#undef pthread_mutex_lock +#undef pthread_mutex_unlock +#undef pthread_mutex_destroy +#undef pthread_mutex_wait +#undef pthread_mutex_timedwait +#undef pthread_mutex_t +#undef pthread_cond_wait +#undef pthread_cond_timedwait +#undef pthread_mutex_trylock +#define pthread_mutex_init(A,B) my_pthread_fastmutex_init((A),(B)) +#define pthread_mutex_lock(A) my_pthread_fastmutex_lock(A) +#define pthread_mutex_unlock(A) pthread_mutex_unlock(&(A)->mutex) +#define pthread_mutex_destroy(A) pthread_mutex_destroy(&(A)->mutex) +#define pthread_cond_wait(A,B) pthread_cond_wait((A),&(B)->mutex) +#define pthread_cond_timedwait(A,B,C) pthread_cond_timedwait((A),&(B)->mutex,(C)) +#define pthread_mutex_trylock(A) pthread_mutex_trylock(&(A)->mutex) +#define pthread_mutex_t my_pthread_fastmutex_t +#endif /* defined(MY_PTHREAD_FASTMUTEX) && !defined(SAFE_MUTEX) */ + + /* READ-WRITE thread locking */ + +#ifdef HAVE_BROKEN_RWLOCK /* For OpenUnix */ +#undef HAVE_PTHREAD_RWLOCK_RDLOCK +#undef HAVE_RWLOCK_INIT +#undef HAVE_RWLOCK_T +#endif + +#if defined(USE_MUTEX_INSTEAD_OF_RW_LOCKS) +/* use these defs for simple mutex locking */ +#define rw_lock_t pthread_mutex_t +#define my_rwlock_init(A,B) pthread_mutex_init((A),(B)) +#define rw_rdlock(A) pthread_mutex_lock((A)) +#define rw_wrlock(A) pthread_mutex_lock((A)) +#define rw_tryrdlock(A) pthread_mutex_trylock((A)) +#define rw_trywrlock(A) pthread_mutex_trylock((A)) +#define rw_unlock(A) pthread_mutex_unlock((A)) +#define rwlock_destroy(A) pthread_mutex_destroy((A)) +#elif defined(HAVE_PTHREAD_RWLOCK_RDLOCK) +#define rw_lock_t pthread_rwlock_t +#define my_rwlock_init(A,B) pthread_rwlock_init((A),(B)) +#define rw_rdlock(A) pthread_rwlock_rdlock(A) +#define rw_wrlock(A) pthread_rwlock_wrlock(A) +#define rw_tryrdlock(A) pthread_rwlock_tryrdlock((A)) +#define rw_trywrlock(A) pthread_rwlock_trywrlock((A)) +#define rw_unlock(A) pthread_rwlock_unlock(A) +#define rwlock_destroy(A) pthread_rwlock_destroy(A) +#elif defined(HAVE_RWLOCK_INIT) +#ifdef HAVE_RWLOCK_T /* For example Solaris 2.6-> */ +#define rw_lock_t rwlock_t +#endif +#define my_rwlock_init(A,B) rwlock_init((A),USYNC_THREAD,0) +#else +/* Use our own version of read/write locks */ +typedef struct _my_rw_lock_t { + pthread_mutex_t lock; /* lock for structure */ + pthread_cond_t readers; /* waiting readers */ + pthread_cond_t writers; /* waiting writers */ + int state; /* -1:writer,0:free,>0:readers */ + int waiters; /* number of waiting writers */ +} my_rw_lock_t; + +#define rw_lock_t my_rw_lock_t +#define rw_rdlock(A) my_rw_rdlock((A)) +#define rw_wrlock(A) my_rw_wrlock((A)) +#define rw_tryrdlock(A) my_rw_tryrdlock((A)) +#define rw_trywrlock(A) my_rw_trywrlock((A)) +#define rw_unlock(A) my_rw_unlock((A)) +#define rwlock_destroy(A) my_rwlock_destroy((A)) + +extern int my_rwlock_init(my_rw_lock_t *, void *); +extern int my_rwlock_destroy(my_rw_lock_t *); +extern int my_rw_rdlock(my_rw_lock_t *); +extern int my_rw_wrlock(my_rw_lock_t *); +extern int my_rw_unlock(my_rw_lock_t *); +extern int my_rw_tryrdlock(my_rw_lock_t *); +extern int my_rw_trywrlock(my_rw_lock_t *); +#endif /* USE_MUTEX_INSTEAD_OF_RW_LOCKS */ + +#define GETHOSTBYADDR_BUFF_SIZE 2048 + +#ifndef HAVE_THR_SETCONCURRENCY +#define thr_setconcurrency(A) pthread_dummy(0) +#endif +#if !defined(HAVE_PTHREAD_ATTR_SETSTACKSIZE) && ! defined(pthread_attr_setstacksize) +#define pthread_attr_setstacksize(A,B) pthread_dummy(0) +#endif + +/* Define mutex types, see my_thr_init.c */ +#define MY_MUTEX_INIT_SLOW NULL +#ifdef PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP +extern pthread_mutexattr_t my_fast_mutexattr; +#define MY_MUTEX_INIT_FAST &my_fast_mutexattr +#else +#define MY_MUTEX_INIT_FAST NULL +#endif +#ifdef PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP +extern pthread_mutexattr_t my_errorcheck_mutexattr; +#define MY_MUTEX_INIT_ERRCHK &my_errorcheck_mutexattr +#else +#define MY_MUTEX_INIT_ERRCHK NULL +#endif + +#ifndef ESRCH +/* Define it to something */ +#define ESRCH 1 +#endif + +typedef ulong my_thread_id; + +extern void my_threadattr_global_init(void); +extern my_bool my_thread_global_init(void); +extern void my_thread_global_end(void); +extern my_bool my_thread_init(void); +extern void my_thread_end(void); +extern const char *my_thread_name(void); +extern my_thread_id my_thread_dbug_id(void); +extern int pthread_dummy(int); + +/* All thread specific variables are in the following struct */ + +#define THREAD_NAME_SIZE 10 +#ifndef DEFAULT_THREAD_STACK +#if SIZEOF_CHARP > 4 +/* + MySQL can survive with 32K, but some glibc libraries require > 128K stack + To resolve hostnames. Also recursive stored procedures needs stack. +*/ +#define DEFAULT_THREAD_STACK (256*1024L) +#else +#define DEFAULT_THREAD_STACK (195*1024) +#endif +#endif + +#define MY_PTHREAD_LOCK_READ 0 +#define MY_PTHREAD_LOCK_WRITE 1 + +struct st_my_thread_var +{ + int thr_errno; + pthread_cond_t suspend; + pthread_mutex_t mutex; + pthread_mutex_t * volatile current_mutex; + pthread_cond_t * volatile current_cond; + pthread_t pthread_self; + my_thread_id id; + int cmp_length; + int volatile abort; + my_bool init; + struct st_my_thread_var *next,**prev; + void *opt_info; + uint lock_type; /* used by conditional release the queue */ + void *stack_ends_here; + safe_mutex_t *mutex_in_use; +#ifndef DBUG_OFF + void *dbug; + char name[THREAD_NAME_SIZE+1]; +#endif +}; + +extern struct st_my_thread_var *_my_thread_var(void) __attribute__ ((const)); +extern void **my_thread_var_dbug(); +extern safe_mutex_t **my_thread_var_mutex_in_use(); +extern uint my_thread_end_wait_time; +extern my_bool safe_mutex_deadlock_detector; +#define my_thread_var (_my_thread_var()) +#define my_errno my_thread_var->thr_errno +/* + Keep track of shutdown,signal, and main threads so that my_end() will not + report errors with them +*/ + +/* Which kind of thread library is in use */ + +#define THD_LIB_OTHER 1 +#define THD_LIB_NPTL 2 +#define THD_LIB_LT 4 + +extern uint thd_lib_detected; + +/* + thread_safe_xxx functions are for critical statistic or counters. + The implementation is guaranteed to be thread safe, on all platforms. + Note that the calling code should *not* assume the counter is protected + by the mutex given, as the implementation of these helpers may change + to use my_atomic operations instead. +*/ + +/* + Warning: + When compiling without threads, this file is not included. + See the *other* declarations of thread_safe_xxx in include/my_global.h + + Second warning: + See include/config-win.h, for yet another implementation. +*/ +#ifdef THREAD +#ifndef thread_safe_increment +#define thread_safe_increment(V,L) \ + (pthread_mutex_lock((L)), (V)++, pthread_mutex_unlock((L))) +#define thread_safe_decrement(V,L) \ + (pthread_mutex_lock((L)), (V)--, pthread_mutex_unlock((L))) +#endif + +#ifndef thread_safe_add +#define thread_safe_add(V,C,L) \ + (pthread_mutex_lock((L)), (V)+=(C), pthread_mutex_unlock((L))) +#define thread_safe_sub(V,C,L) \ + (pthread_mutex_lock((L)), (V)-=(C), pthread_mutex_unlock((L))) +#endif +#endif + +/* + statistics_xxx functions are for non critical statistic, + maintained in global variables. + When compiling with SAFE_STATISTICS: + - race conditions can not occur. + - some locking occurs, which may cause performance degradation. + + When compiling without SAFE_STATISTICS: + - race conditions can occur, making the result slightly inaccurate. + - the lock given is not honored. +*/ +#ifdef SAFE_STATISTICS +#define statistic_increment(V,L) thread_safe_increment((V),(L)) +#define statistic_decrement(V,L) thread_safe_decrement((V),(L)) +#define statistic_add(V,C,L) thread_safe_add((V),(C),(L)) +#define statistic_sub(V,C,L) thread_safe_sub((V),(C),(L)) +#else +#define statistic_decrement(V,L) (V)-- +#define statistic_increment(V,L) (V)++ +#define statistic_add(V,C,L) (V)+=(C) +#define statistic_sub(V,C,L) (V)-=(C) +#endif /* SAFE_STATISTICS */ + +/* + No locking needed, the counter is owned by the thread +*/ +#define status_var_increment(V) (V)++ +#define status_var_decrement(V) (V)-- +#define status_var_add(V,C) (V)+=(C) +#define status_var_sub(V,C) (V)-=(C) + +#ifdef __cplusplus +} +#endif +#endif /* _my_ptread_h */ diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/my_stacktrace.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_stacktrace.h new file mode 100644 index 0000000..e7ce42c --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_stacktrace.h @@ -0,0 +1,66 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef _my_stacktrace_h_ +#define _my_stacktrace_h_ + +#include + +#ifdef TARGET_OS_LINUX +#if defined (__x86_64__) || defined (__i386__) || \ + (defined(__alpha__) && defined(__GNUC__)) +#define HAVE_STACKTRACE 1 +#endif +#elif defined(__WIN__) +#define HAVE_STACKTRACE 1 +#endif + +#if HAVE_BACKTRACE && (HAVE_BACKTRACE_SYMBOLS || HAVE_BACKTRACE_SYMBOLS_FD) +#undef HAVE_STACKTRACE +#define HAVE_STACKTRACE 1 +#endif + +#if !defined(__NETWARE__) +#define HAVE_WRITE_CORE +#endif + +#if HAVE_BACKTRACE && HAVE_BACKTRACE_SYMBOLS && \ + HAVE_CXXABI_H && HAVE_ABI_CXA_DEMANGLE && \ + HAVE_WEAK_SYMBOL +#define BACKTRACE_DEMANGLE 1 +#endif + +C_MODE_START + +#if defined(HAVE_STACKTRACE) || defined(HAVE_BACKTRACE) +void my_init_stacktrace(); +void my_print_stacktrace(uchar* stack_bottom, ulong thread_stack); +void my_safe_print_str(const char* name, const char* val, int max_len); +void my_write_core(int sig); +#if BACKTRACE_DEMANGLE +char *my_demangle(const char *mangled_name, int *status); +#endif +#ifdef __WIN__ +void my_set_exception_pointers(EXCEPTION_POINTERS *ep); +#endif +#endif + +#ifdef HAVE_WRITE_CORE +void my_write_core(int sig); +#endif + +C_MODE_END + +#endif /* _my_stacktrace_h_ */ diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/my_sys.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_sys.h new file mode 100644 index 0000000..c8ec791 --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_sys.h @@ -0,0 +1,1082 @@ +/* Copyright (C) 2000-2003 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/** + @file + mysys library API +*/ + +#ifndef _my_sys_h +#define _my_sys_h +C_MODE_START + +#ifdef HAVE_AIOWAIT +#include /* Used by record-cache */ +typedef struct my_aio_result { + aio_result_t result; + int pending; +} my_aio_result; +#endif + +#ifndef THREAD +extern int NEAR my_errno; /* Last error in mysys */ +#else +#include +#endif + +#include /* for CHARSET_INFO */ +#include +#include + +#define MYSYS_PROGRAM_DONT_USE_CURSES() { error_handler_hook = my_message_no_curses; mysys_uses_curses=0;} +#define MY_INIT(name); { my_progname= name; my_init(); } + +/** + Max length of an error message generated by mysys utilities. + Some mysys functions produce error messages. These mostly go + to stderr. + This constant defines the size of the buffer used to format + the message. It should be kept in sync with MYSQL_ERRMSG_SIZE, + since sometimes mysys errors are stored in the server diagnostics + area, and we would like to avoid unexpected truncation. +*/ +#define MYSYS_ERRMSG_SIZE (512) + +#define MY_FILE_ERROR ((size_t) -1) + + /* General bitmaps for my_func's */ +#define MY_FFNF 1 /* Fatal if file not found */ +#define MY_FNABP 2 /* Fatal if not all bytes read/writen */ +#define MY_NABP 4 /* Error if not all bytes read/writen */ +#define MY_FAE 8 /* Fatal if any error */ +#define MY_WME 16 /* Write message on error */ +#define MY_WAIT_IF_FULL 32 /* Wait and try again if disk full error */ +#define MY_IGNORE_BADFD 32 /* my_sync: ignore 'bad descriptor' errors */ +#define MY_SYNC_DIR 1024 /* my_create/delete/rename: sync directory */ +#define MY_RAID 64 /* Support for RAID */ +#define MY_FULL_IO 512 /* For my_read - loop intil I/O is complete */ +#define MY_DONT_CHECK_FILESIZE 128 /* Option to init_io_cache() */ +#define MY_LINK_WARNING 32 /* my_redel() gives warning if links */ +#define MY_COPYTIME 64 /* my_redel() copys time */ +#define MY_DELETE_OLD 256 /* my_create_with_symlink() */ +#define MY_RESOLVE_LINK 128 /* my_realpath(); Only resolve links */ +#define MY_HOLD_ORIGINAL_MODES 128 /* my_copy() holds to file modes */ +#define MY_REDEL_MAKE_BACKUP 256 +#define MY_SEEK_NOT_DONE 32 /* my_lock may have to do a seek */ +#define MY_SHORT_WAIT 64 /* my_lock() don't wait if can't lock */ +#define MY_FORCE_LOCK 128 /* use my_lock() even if disable_locking */ +#define MY_NO_WAIT 256 /* my_lock() don't wait at all */ +#define MY_ZEROFILL 32 /* my_malloc(), fill array with zero */ +#define MY_ALLOW_ZERO_PTR 64 /* my_realloc() ; zero ptr -> malloc */ +#define MY_FREE_ON_ERROR 128 /* my_realloc() ; Free old ptr on error */ +#define MY_HOLD_ON_ERROR 256 /* my_realloc() ; Return old ptr on error */ +#define MY_DONT_OVERWRITE_FILE 2048 /* my_copy: Don't overwrite file */ +#define MY_THREADSAFE 2048 /* my_seek(): lock fd mutex */ + +#define MY_CHECK_ERROR 1 /* Params to my_end; Check open-close */ +#define MY_GIVE_INFO 2 /* Give time info about process*/ +#define MY_DONT_FREE_DBUG 4 /* Do not call DBUG_END() in my_end() */ + +#define MY_REMOVE_NONE 0 /* Params for modify_defaults_file */ +#define MY_REMOVE_OPTION 1 +#define MY_REMOVE_SECTION 2 + +#define ME_HIGHBYTE 8 /* Shift for colours */ +#define ME_NOCUR 1 /* Don't use curses message */ +#define ME_OLDWIN 2 /* Use old window */ +#define ME_BELL 4 /* Ring bell then printing message */ +#define ME_HOLDTANG 8 /* Don't delete last keys */ +#define ME_WAITTOT 16 /* Wait for errtime secs of for a action */ +#define ME_WAITTANG 32 /* Wait for a user action */ +#define ME_NOREFRESH 64 /* Dont refresh screen */ +#define ME_NOINPUT 128 /* Dont use the input libary */ +#define ME_COLOUR1 ((1 << ME_HIGHBYTE)) /* Possibly error-colours */ +#define ME_COLOUR2 ((2 << ME_HIGHBYTE)) +#define ME_COLOUR3 ((3 << ME_HIGHBYTE)) +#define ME_FATALERROR 1024 /* Fatal statement error */ +#define ME_JUST_INFO 8192 /**< not error but just info */ +#define ME_JUST_WARNING 16384 /**< not error but just warning */ + + /* Bits in last argument to fn_format */ +#define MY_REPLACE_DIR 1 /* replace dir in name with 'dir' */ +#define MY_REPLACE_EXT 2 /* replace extension with 'ext' */ +#define MY_UNPACK_FILENAME 4 /* Unpack name (~ -> home) */ +#define MY_PACK_FILENAME 8 /* Pack name (home -> ~) */ +#define MY_RESOLVE_SYMLINKS 16 /* Resolve all symbolic links */ +#define MY_RETURN_REAL_PATH 32 /* return full path for file */ +#define MY_SAFE_PATH 64 /* Return NULL if too long path */ +#define MY_RELATIVE_PATH 128 /* name is relative to 'dir' */ +#define MY_APPEND_EXT 256 /* add 'ext' as additional extension*/ + + + /* My seek flags */ +#define MY_SEEK_SET 0 +#define MY_SEEK_CUR 1 +#define MY_SEEK_END 2 + + /* Some constants */ +#define MY_WAIT_FOR_USER_TO_FIX_PANIC 60 /* in seconds */ +#define MY_WAIT_GIVE_USER_A_MESSAGE 10 /* Every 10 times of prev */ +#define MIN_COMPRESS_LENGTH 50 /* Don't compress small bl. */ +#define DFLT_INIT_HITS 3 + + /* root_alloc flags */ +#define MY_KEEP_PREALLOC 1 +#define MY_MARK_BLOCKS_FREE 2 /* move used to free list and reuse them */ + + /* Internal error numbers (for assembler functions) */ +#define MY_ERRNO_EDOM 33 +#define MY_ERRNO_ERANGE 34 + + /* Bits for get_date timeflag */ +#define GETDATE_DATE_TIME 1 +#define GETDATE_SHORT_DATE 2 +#define GETDATE_HHMMSSTIME 4 +#define GETDATE_GMT 8 +#define GETDATE_FIXEDLENGTH 16 + + /* defines when allocating data */ +#ifdef SAFEMALLOC +#define my_malloc(SZ,FLAG) _mymalloc((SZ), __FILE__, __LINE__, FLAG ) +#define my_malloc_ci(SZ,FLAG) _mymalloc((SZ), sFile, uLine, FLAG ) +#define my_realloc(PTR,SZ,FLAG) _myrealloc((PTR), (SZ), __FILE__, __LINE__, FLAG ) +#define my_checkmalloc() _sanity( __FILE__, __LINE__ ) +#define my_free(PTR,FLAG) _myfree((PTR), __FILE__, __LINE__,FLAG) +#define my_memdup(A,B,C) _my_memdup((A),(B), __FILE__,__LINE__,C) +#define my_strdup(A,C) _my_strdup((A), __FILE__,__LINE__,C) +#define my_strndup(A,B,C) _my_strndup((A),(B),__FILE__,__LINE__,C) +#define QUICK_SAFEMALLOC sf_malloc_quick=1 +#define NORMAL_SAFEMALLOC sf_malloc_quick=0 +extern uint sf_malloc_prehunc,sf_malloc_endhunc,sf_malloc_quick; +extern ulonglong sf_malloc_mem_limit; + +#define CALLER_INFO_PROTO , const char *sFile, uint uLine +#define CALLER_INFO , __FILE__, __LINE__ +#define ORIG_CALLER_INFO , sFile, uLine +#else +#define my_checkmalloc() +#undef TERMINATE +#define TERMINATE(A,B) {} +#define QUICK_SAFEMALLOC +#define NORMAL_SAFEMALLOC +extern void *my_malloc(size_t Size,myf MyFlags); +#define my_malloc_ci(SZ,FLAG) my_malloc( SZ, FLAG ) +extern void *my_realloc(void *oldpoint, size_t Size, myf MyFlags); +extern void my_no_flags_free(void *ptr); +extern void *my_memdup(const void *from,size_t length,myf MyFlags); +extern char *my_strdup(const char *from,myf MyFlags); +extern char *my_strndup(const char *from, size_t length, + myf MyFlags); +/* we do use FG (as a no-op) in below so that a typo on FG is caught */ +#define my_free(PTR,FG) ((void)FG,my_no_flags_free(PTR)) +#define CALLER_INFO_PROTO /* nothing */ +#define CALLER_INFO /* nothing */ +#define ORIG_CALLER_INFO /* nothing */ +#endif + +/* + ERROR INJECTION: Non-thread-safe global variable to request error inject. + Set this variable to non-zero to request the next my_malloc() to fail. + This works with my_malloc.c:my_malloc() and safemalloc.c:_mymalloc(). + If using this in tests, note that the error messages produced by + my_malloc and safemalloc are different. You may need to modify the + results with --replace_regex. You may find examples in + client/backup_stream.c and backup_client_coverage.test. + The global variable is defined in my_static.c. +*/ +IF_DBUG(extern int my_malloc_error_inject); + +#ifdef HAVE_LARGE_PAGES +extern uint my_get_large_page_size(void); +extern uchar * my_large_malloc(size_t size, myf my_flags); +extern void my_large_free(uchar * ptr, myf my_flags); +#else +#define my_get_large_page_size() (0) +#define my_large_malloc(A,B) my_malloc_lock((A),(B)) +#define my_large_free(A,B) my_free_lock((A),(B)) +#endif /* HAVE_LARGE_PAGES */ + +#ifdef HAVE_ALLOCA +#if defined(_AIX) && !defined(__GNUC__) && !defined(_AIX43) +#pragma alloca +#endif /* _AIX */ +#if defined(__MWERKS__) +#undef alloca +#define alloca _alloca +#endif /* __MWERKS__ */ +#if defined(__GNUC__) && !defined(HAVE_ALLOCA_H) && ! defined(alloca) +#define alloca __builtin_alloca +#endif /* GNUC */ +#define my_alloca(SZ) alloca((size_t) (SZ)) +#define my_afree(PTR) {} +#else +#define my_alloca(SZ) my_malloc(SZ,MYF(0)) +#define my_afree(PTR) my_free(PTR,MYF(MY_WME)) +#endif /* HAVE_ALLOCA */ + +#ifndef errno /* did we already get it? */ +#ifdef HAVE_ERRNO_AS_DEFINE +#include /* errno is a define */ +#else +extern int errno; /* declare errno */ +#endif +#endif /* #ifndef errno */ +extern char *home_dir; /* Home directory for user */ +extern const char *my_progname; /* program-name (printed in errors) */ +extern const char *my_progname_short; /* like above but without directory */ +extern char NEAR curr_dir[]; /* Current directory for user */ +extern void (*error_handler_hook)(uint my_err, const char *str,myf MyFlags); +extern void (*fatal_error_handler_hook)(uint my_err, const char *str, + myf MyFlags); +extern uint my_file_limit; +extern ulong my_thread_stack_size; + +extern const char *(*proc_info_hook)(void *, const char *, const char *, + const char *, const unsigned int); + +#if defined(ENABLED_DEBUG_SYNC) +extern void (*debug_sync_C_callback_ptr)(const char *, size_t); +#define DEBUG_SYNC_C(_sync_point_name_) do { \ + if (debug_sync_C_callback_ptr != NULL) \ + (*debug_sync_C_callback_ptr)(STRING_WITH_LEN(_sync_point_name_)); } \ + while(0) +#else +#define DEBUG_SYNC_C(_sync_point_name_) +#endif /* defined(ENABLED_DEBUG_SYNC) */ + +#ifdef HAVE_LARGE_PAGES +extern my_bool my_use_large_pages; +extern uint my_large_page_size; +#endif + +/* charsets */ +#define MY_ALL_CHARSETS_SIZE 2048 +extern MYSQL_PLUGIN_IMPORT CHARSET_INFO *default_charset_info; +extern MYSQL_PLUGIN_IMPORT CHARSET_INFO *all_charsets[MY_ALL_CHARSETS_SIZE]; +extern CHARSET_INFO compiled_charsets[]; + +/* statistics */ +extern ulong my_file_opened,my_stream_opened, my_tmp_file_created; +extern ulong my_file_total_opened; +extern uint mysys_usage_id; +extern my_bool my_init_done; + + /* Point to current my_message() */ +extern void (*my_sigtstp_cleanup)(void), + /* Executed before jump to shell */ + (*my_sigtstp_restart)(void), + (*my_abort_hook)(int); + /* Executed when comming from shell */ +extern MYSQL_PLUGIN_IMPORT int NEAR my_umask; /* Default creation mask */ +extern int NEAR my_umask_dir, + NEAR my_recived_signals, /* Signals we have got */ + NEAR my_safe_to_handle_signal, /* Set when allowed to SIGTSTP */ + NEAR my_dont_interrupt; /* call remember_intr when set */ +extern my_bool NEAR mysys_uses_curses, my_use_symdir; +extern size_t sf_malloc_cur_memory, sf_malloc_max_memory; + +extern ulong my_default_record_cache_size; +extern my_bool NEAR my_disable_locking,NEAR my_disable_async_io, + NEAR my_disable_flush_key_blocks, NEAR my_disable_symlinks; +extern char wild_many,wild_one,wild_prefix; +extern const char *charsets_dir; +/* from default.c */ +extern char *my_defaults_extra_file; +extern const char *my_defaults_group_suffix; +extern const char *my_defaults_file; + +extern my_bool timed_mutexes; + +typedef struct wild_file_pack /* Struct to hold info when selecting files */ +{ + uint wilds; /* How many wildcards */ + uint not_pos; /* Start of not-theese-files */ + char * *wild; /* Pointer to wildcards */ +} WF_PACK; + +enum loglevel { + ERROR_LEVEL, + WARNING_LEVEL, + INFORMATION_LEVEL +}; + +enum cache_type +{ + TYPE_NOT_SET= 0, READ_CACHE, WRITE_CACHE, + SEQ_READ_APPEND /* sequential read or append */, + READ_FIFO, READ_NET,WRITE_NET}; + +enum flush_type +{ + FLUSH_KEEP, /* flush block and keep it in the cache */ + FLUSH_RELEASE, /* flush block and remove it from the cache */ + FLUSH_IGNORE_CHANGED, /* remove block from the cache */ + /* + As my_disable_flush_pagecache_blocks is always 0, the following option + is strictly equivalent to FLUSH_KEEP + */ + FLUSH_FORCE_WRITE, + /** + @brief like FLUSH_KEEP but return immediately if file is already being + flushed (even partially) by another thread; only for page cache, + forbidden for key cache. + */ + FLUSH_KEEP_LAZY +}; + +typedef struct st_record_cache /* Used when cacheing records */ +{ + File file; + int rc_seek,error,inited; + uint rc_length,read_length,reclength; + my_off_t rc_record_pos,end_of_file; + uchar *rc_buff,*rc_buff2,*rc_pos,*rc_end,*rc_request_pos; +#ifdef HAVE_AIOWAIT + int use_async_io; + my_aio_result aio_result; +#endif + enum cache_type type; +} RECORD_CACHE; + +enum file_type +{ + UNOPEN = 0, FILE_BY_OPEN, FILE_BY_CREATE, STREAM_BY_FOPEN, STREAM_BY_FDOPEN, + FILE_BY_MKSTEMP, FILE_BY_DUP +}; + +struct st_my_file_info +{ + char *name; +#ifdef _WIN32 + HANDLE fhandle; /* win32 file handle */ + int oflag; /* open flags, e.g O_APPEND */ +#endif + enum file_type type; +#if defined(THREAD) && !defined(HAVE_PREAD) && !defined(_WIN32) + pthread_mutex_t mutex; +#endif +}; + +extern struct st_my_file_info *my_file_info; + +typedef struct st_dynamic_array +{ + uchar *buffer; + uint elements,max_element; + uint alloc_increment; + uint size_of_element; +} DYNAMIC_ARRAY; + +typedef struct st_my_tmpdir +{ + DYNAMIC_ARRAY full_list; + char **list; + uint cur, max; +#ifdef THREAD + pthread_mutex_t mutex; +#endif +} MY_TMPDIR; + +typedef struct st_dynamic_string +{ + char *str; + size_t length,max_length,alloc_increment; +} DYNAMIC_STRING; + +struct st_io_cache; +/** Function called when certain events happen to an IO_CACHE */ +typedef int (*IO_CACHE_CALLBACK)(struct st_io_cache *cache, + const uchar *buffert, uint length, + my_off_t filepos); + +#ifdef THREAD +typedef struct st_io_cache_share +{ + pthread_mutex_t mutex; /* To sync on reads into buffer. */ + pthread_cond_t cond; /* To wait for signals. */ + pthread_cond_t cond_writer; /* For a synchronized writer. */ + /* Offset in file corresponding to the first byte of buffer. */ + my_off_t pos_in_file; + /* If a synchronized write cache is the source of the data. */ + struct st_io_cache *source_cache; + uchar *buffer; /* The read buffer. */ + uchar *read_end; /* Behind last valid byte of buffer. */ + int running_threads; /* threads not in lock. */ + int total_threads; /* threads sharing the cache. */ + int error; /* Last error. */ +#ifdef NOT_YET_IMPLEMENTED + /* whether the structure should be free'd */ + my_bool alloced; +#endif +} IO_CACHE_SHARE; +#endif + +typedef struct st_io_cache /* Used when cacheing files */ +{ + /* Offset in file corresponding to the first byte of uchar* buffer. */ + my_off_t pos_in_file; + /* + The offset of end of file for READ_CACHE and WRITE_CACHE. + For SEQ_READ_APPEND it the maximum of the actual end of file and + the position represented by read_end. + */ + my_off_t end_of_file; + /* Points to current read position in the buffer */ + uchar *read_pos; + /* the non-inclusive boundary in the buffer for the currently valid read */ + uchar *read_end; + uchar *buffer; /* The read buffer */ + /* Used in ASYNC_IO */ + uchar *request_pos; + + /* Only used in WRITE caches and in SEQ_READ_APPEND to buffer writes */ + uchar *write_buffer; + /* + Only used in SEQ_READ_APPEND, and points to the current read position + in the write buffer. Note that reads in SEQ_READ_APPEND caches can + happen from both read buffer (uchar* buffer) and write buffer + (uchar* write_buffer). + */ + uchar *append_read_pos; + /* Points to current write position in the write buffer */ + uchar *write_pos; + /* The non-inclusive boundary of the valid write area */ + uchar *write_end; + + /* + Current_pos and current_end are convenience variables used by + my_b_tell() and other routines that need to know the current offset + current_pos points to &write_pos, and current_end to &write_end in a + WRITE_CACHE, and &read_pos and &read_end respectively otherwise + */ + uchar **current_pos, **current_end; +#ifdef THREAD + /* + The lock is for append buffer used in SEQ_READ_APPEND cache + need mutex copying from append buffer to read buffer. + */ + pthread_mutex_t append_buffer_lock; + /* + The following is used when several threads are reading the + same file in parallel. They are synchronized on disk + accesses reading the cached part of the file asynchronously. + It should be set to NULL to disable the feature. Only + READ_CACHE mode is supported. + */ + IO_CACHE_SHARE *share; +#endif + /* + A caller will use my_b_read() macro to read from the cache + if the data is already in cache, it will be simply copied with + memcpy() and internal variables will be accordinging updated with + no functions invoked. However, if the data is not fully in the cache, + my_b_read() will call read_function to fetch the data. read_function + must never be invoked directly. + */ + int (*read_function)(struct st_io_cache *,uchar *,size_t); + /* + Same idea as in the case of read_function, except my_b_write() needs to + be replaced with my_b_append() for a SEQ_READ_APPEND cache + */ + int (*write_function)(struct st_io_cache *,const uchar *,size_t); + /* + Specifies the type of the cache. Depending on the type of the cache + certain operations might not be available and yield unpredicatable + results. Details to be documented later + */ + enum cache_type type; + /* + Callbacks were added and are currently used for binary logging of LOAD + DATA INFILE - when a block is read from the file, we create a block + create/append event, and when IO_CACHE is closed, we create an end event; + also used to write the MyISAM WRITE_CACHE blocks to the MyISAM physical + log. These functions could, of course be used for other things. Note: some + callbacks share the same argument ("arg"). + */ + IO_CACHE_CALLBACK pre_read; /**< called before reading from disk */ + IO_CACHE_CALLBACK post_read; /**< called after reading from disk */ + IO_CACHE_CALLBACK pre_close; /**< called before ending the cache */ + /** Called _after_ writing to disk; not honoured by SEQ_READ_APPEND */ + IO_CACHE_CALLBACK post_write; + /* + Counts the number of times, when we were forced to use disk. We use it to + increase the binlog_cache_disk_use status variable. + */ + ulong disk_writes; + void *arg; /**< used by pre/post_read,post_write */ + char *file_name; /* if used with 'open_cached_file' */ + char *dir,*prefix; + File file; /* file descriptor */ + /* + seek_not_done is set by my_b_seek() to inform the upcoming read/write + operation that a seek needs to be preformed prior to the actual I/O + error is 0 if the cache operation was successful, -1 if there was a + "hard" error, and the actual number of I/O-ed bytes if the read/write was + partial. + */ + int seek_not_done,error; + /** + Cumulative 'error' since last [re]init_io_cache(). Useful if cache's user + polls for errors only once in a while. + */ + int hard_write_error_in_the_past; + /* buffer_length is memory size allocated for buffer or write_buffer */ + size_t buffer_length; + /* read_length is the same as buffer_length except when we use async io */ + size_t read_length; + myf myflags; /* Flags used to my_read/my_write */ + /* + alloced_buffer is 1 if the buffer was allocated by init_io_cache() and + 0 if it was supplied by the user. + Currently READ_NET is the only one that will use a buffer allocated + somewhere else + */ + my_bool alloced_buffer; +#ifdef HAVE_AIOWAIT + /* + As inidicated by ifdef, this is for async I/O, which is not currently + used (because it's not reliable on all systems) + */ + uint inited; + my_off_t aio_read_pos; + my_aio_result aio_result; +#endif +} IO_CACHE; + +typedef int (*qsort2_cmp)(const void *, const void *, const void *); + + /* defines for mf_iocache */ + + /* Test if buffer is inited */ +#define my_b_clear(info) (info)->buffer=0 +#define my_b_inited(info) (info)->buffer +#define my_b_EOF INT_MIN + +#define my_b_read(info,Buffer,Count) \ + ((info)->read_pos + (Count) <= (info)->read_end ?\ + (memcpy(Buffer,(info)->read_pos,(size_t) (Count)), \ + ((info)->read_pos+=(Count)),0) :\ + (*(info)->read_function)((info),Buffer,Count)) + +#define my_b_write(info,Buffer,Count) \ + ((info)->write_pos + (Count) <=(info)->write_end ?\ + (memcpy((info)->write_pos, (Buffer), (size_t)(Count)),\ + ((info)->write_pos+=(Count)),0) : \ + (*(info)->write_function)((info),(Buffer),(Count))) + +#define my_b_get(info) \ + ((info)->read_pos != (info)->read_end ?\ + ((info)->read_pos++, (int) (uchar) (info)->read_pos[-1]) :\ + _my_b_get(info)) + + /* my_b_write_byte dosn't have any err-check */ +#define my_b_write_byte(info,chr) \ + (((info)->write_pos < (info)->write_end) ?\ + ((*(info)->write_pos++)=(chr)) :\ + (_my_b_write(info,0,0) , ((*(info)->write_pos++)=(chr)))) + +#define my_b_fill_cache(info) \ + (((info)->read_end=(info)->read_pos),(*(info)->read_function)(info,0,0)) + +#define my_b_tell(info) ((info)->pos_in_file + \ + (size_t) (*(info)->current_pos - (info)->request_pos)) + +#define my_b_get_buffer_start(info) (info)->request_pos +#define my_b_get_bytes_in_buffer(info) (char*) (info)->read_end - \ + (char*) my_b_get_buffer_start(info) +#define my_b_get_pos_in_file(info) (info)->pos_in_file + +/* tell write offset in the SEQ_APPEND cache */ +int my_b_copy_to_file(IO_CACHE *cache, FILE *file); +my_off_t my_b_append_tell(IO_CACHE* info); +my_off_t my_b_safe_tell(IO_CACHE* info); /* picks the correct tell() */ + +#define my_b_bytes_in_cache(info) (size_t) (*(info)->current_end - \ + *(info)->current_pos) + +typedef uint32 ha_checksum; +extern ha_checksum my_crc_dbug_check; + +/* Define the type of function to be passed to process_default_option_files */ +typedef int (*Process_option_func)(void *ctx, const char *group_name, + const char *option); + +#include + + + /* Prototypes for mysys and my_func functions */ + +extern int my_copy(const char *from,const char *to,myf MyFlags); +extern int my_append(const char *from,const char *to,myf MyFlags); +extern int my_delete(const char *name,myf MyFlags); +extern int my_getwd(char * buf,size_t size,myf MyFlags); +extern int my_setwd(const char *dir,myf MyFlags); +extern int my_lock(File fd,int op,my_off_t start, my_off_t length,myf MyFlags); +extern void *my_once_alloc(size_t Size,myf MyFlags); +extern void my_once_free(void); +extern char *my_once_strdup(const char *src,myf myflags); +extern void *my_once_memdup(const void *src, size_t len, myf myflags); +extern File my_open(const char *FileName,int Flags,myf MyFlags); +extern File my_register_filename(File fd, const char *FileName, + enum file_type type_of_file, + uint error_message_number, myf MyFlags); +extern File my_create(const char *FileName,int CreateFlags, + int AccessFlags, myf MyFlags); +extern int my_close(File Filedes,myf MyFlags); +extern File my_dup(File file, myf MyFlags); +extern int my_mkdir(const char *dir, int Flags, myf MyFlags); +extern int my_readlink(char *to, const char *filename, myf MyFlags); +extern int my_is_symlink(const char *filename); +extern int my_realpath(char *to, const char *filename, myf MyFlags); +extern File my_create_with_symlink(const char *linkname, const char *filename, + int createflags, int access_flags, + myf MyFlags); +extern int my_delete_with_symlink(const char *name, myf MyFlags); +extern int my_rename_with_symlink(const char *from,const char *to,myf MyFlags); +extern int my_symlink(const char *content, const char *linkname, myf MyFlags); +extern size_t my_read(File Filedes,uchar *Buffer,size_t Count,myf MyFlags); +extern size_t my_pread(File Filedes,uchar *Buffer,size_t Count,my_off_t offset, + myf MyFlags); +extern int my_rename(const char *from,const char *to,myf MyFlags); +extern my_off_t my_seek(File fd,my_off_t pos,int whence,myf MyFlags); +extern my_off_t my_tell(File fd,myf MyFlags); +extern size_t my_write(File Filedes,const uchar *Buffer,size_t Count, + myf MyFlags); +extern size_t my_pwrite(File Filedes,const uchar *Buffer,size_t Count, + my_off_t offset,myf MyFlags); +extern size_t my_fread(FILE *stream,uchar *Buffer,size_t Count,myf MyFlags); +extern size_t my_fwrite(FILE *stream,const uchar *Buffer,size_t Count, + myf MyFlags); +extern my_off_t my_fseek(FILE *stream,my_off_t pos,int whence,myf MyFlags); +extern my_off_t my_ftell(FILE *stream,myf MyFlags); +extern void *_mymalloc(size_t uSize,const char *sFile, + uint uLine, myf MyFlag); +extern void *_myrealloc(void *pPtr,size_t uSize,const char *sFile, + uint uLine, myf MyFlag); +extern void * my_multi_malloc _VARARGS((myf MyFlags, ...)); +extern void _myfree(void *pPtr,const char *sFile,uint uLine, myf MyFlag); +extern int _sanity(const char *sFile, uint uLine); +extern void *_my_memdup(const void *from, size_t length, + const char *sFile, uint uLine,myf MyFlag); +extern char * _my_strdup(const char *from, const char *sFile, uint uLine, + myf MyFlag); +extern char *_my_strndup(const char *from, size_t length, + const char *sFile, uint uLine, + myf MyFlag); + +/* implemented in my_memmem.c */ +extern void *my_memmem(const void *haystack, size_t haystacklen, + const void *needle, size_t needlelen); + + +#ifdef _WIN32 +extern int my_access(const char *path, int amode); +#else +#define my_access access +#endif + +extern int check_if_legal_filename(const char *path); +extern int check_if_legal_tablename(const char *path); + +#ifdef _WIN32 +extern int nt_share_delete(const char *name,myf MyFlags); +#define my_delete_allow_opened(fname,flags) nt_share_delete((fname),(flags)) +#else +#define my_delete_allow_opened(fname,flags) my_delete((fname),(flags)) +#endif + +#ifdef _WIN32 +/* Windows-only functions (CRT equivalents)*/ +extern File my_sopen(const char *path, int oflag, int shflag, int pmode); +extern HANDLE my_get_osfhandle(File fd); +extern void my_osmaperr(unsigned long last_error); +#endif + +#ifndef TERMINATE +extern void TERMINATE(FILE *file, uint flag); +#endif +extern void init_glob_errs(void); +extern void wait_for_free_space(const char *filename, int errors); +extern FILE *my_fopen(const char *FileName,int Flags,myf MyFlags); +extern FILE *my_fdopen(File Filedes,const char *name, int Flags,myf MyFlags); +extern int my_fclose(FILE *fd,myf MyFlags); +extern File my_fileno(FILE *fd); +extern int my_chsize(File fd,my_off_t newlength, int filler, myf MyFlags); +extern int my_chmod(const char *name, mode_t mode, myf my_flags); +extern int my_sync(File fd, myf my_flags); +extern int my_sync_dir(const char *dir_name, myf my_flags); +extern int my_sync_dir_by_file(const char *file_name, myf my_flags); +extern void my_error _VARARGS((int nr,myf MyFlags, ...)); +extern void my_printf_error _VARARGS((uint my_err, const char *format, + myf MyFlags, ...)) + ATTRIBUTE_FORMAT(printf, 2, 4); +extern void my_printv_error(uint error, const char *format, myf MyFlags, + va_list ap); +extern int my_error_register(const char **errmsgs, int first, int last); +extern const char **my_error_unregister(int first, int last); +extern void my_message(uint my_err, const char *str,myf MyFlags); +extern void my_message_no_curses(uint my_err, const char *str,myf MyFlags); +extern my_bool my_init(void); +extern void my_end(int infoflag); +extern int my_redel(const char *from, const char *to, int MyFlags); +extern int my_copystat(const char *from, const char *to, int MyFlags); +extern char * my_filename(File fd); + +#ifndef THREAD +extern void dont_break(void); +extern void allow_break(void); +#else +#define dont_break() +#define allow_break() +#endif + +#ifdef EXTRA_DEBUG +void my_print_open_files(void); +#else +#define my_print_open_files() +#endif + +extern my_bool init_tmpdir(MY_TMPDIR *tmpdir, const char *pathlist); +extern char *my_tmpdir(MY_TMPDIR *tmpdir); +extern void free_tmpdir(MY_TMPDIR *tmpdir); + +extern void my_remember_signal(int signal_number,sig_handler (*func)(int)); +extern size_t dirname_part(char * to,const char *name, size_t *to_res_length); +extern size_t dirname_length(const char *name); +#define base_name(A) (A+dirname_length(A)) +extern int test_if_hard_path(const char *dir_name); +extern my_bool has_path(const char *name); +extern char *convert_dirname(char *to, const char *from, const char *from_end); +extern void to_unix_path(char * name); +extern char * fn_ext(const char *name); +extern char * fn_same(char * toname,const char *name,int flag); +extern char * fn_format(char * to,const char *name,const char *dir, + const char *form, uint flag); +extern size_t strlength(const char *str); +extern void pack_dirname(char * to,const char *from); +extern size_t normalize_dirname(char * to, const char *from); +extern size_t unpack_dirname(char * to,const char *from); +extern size_t cleanup_dirname(char * to,const char *from); +extern size_t system_filename(char * to,const char *from); +extern size_t unpack_filename(char * to,const char *from); +extern char * intern_filename(char * to,const char *from); +extern char * directory_file_name(char * dst, const char *src); +extern int pack_filename(char * to, const char *name, size_t max_length); +extern char * my_path(char * to,const char *progname, + const char *own_pathname_part); +extern char * my_load_path(char * to, const char *path, + const char *own_path_prefix); +extern int wild_compare(const char *str,const char *wildstr, + pbool str_is_pattern); +extern WF_PACK *wf_comp(char * str); +extern int wf_test(struct wild_file_pack *wf_pack,const char *name); +extern void wf_end(struct wild_file_pack *buffer); +extern size_t strip_sp(char * str); +extern my_bool array_append_string_unique(const char *str, + const char **array, size_t size); +extern void get_date(char * to,int timeflag,time_t use_time); +extern void soundex(CHARSET_INFO *, char * out_pntr, char * in_pntr, + pbool remove_garbage); +extern int init_record_cache(RECORD_CACHE *info,size_t cachesize,File file, + size_t reclength,enum cache_type type, + pbool use_async_io); +extern int read_cache_record(RECORD_CACHE *info,uchar *to); +extern int end_record_cache(RECORD_CACHE *info); +extern int write_cache_record(RECORD_CACHE *info,my_off_t filepos, + const uchar *record,size_t length); +extern int flush_write_cache(RECORD_CACHE *info); +extern long my_clock(void); +extern sig_handler sigtstp_handler(int signal_number); +extern void handle_recived_signals(void); + +extern sig_handler my_set_alarm_variable(int signo); +extern void my_string_ptr_sort(uchar *base,uint items,size_t size); +extern void radixsort_for_str_ptr(uchar* base[], uint number_of_elements, + size_t size_of_element,uchar *buffer[]); +extern qsort_t my_qsort(void *base_ptr, size_t total_elems, size_t size, + qsort_cmp cmp); +extern qsort_t my_qsort2(void *base_ptr, size_t total_elems, size_t size, + qsort2_cmp cmp, void *cmp_argument); +extern qsort2_cmp get_ptr_compare(size_t); +void my_store_ptr(uchar *buff, size_t pack_length, my_off_t pos); +my_off_t my_get_ptr(uchar *ptr, size_t pack_length); +extern int init_io_cache(IO_CACHE *info,File file,size_t cachesize, + enum cache_type type,my_off_t seek_offset, + pbool use_async_io, myf cache_myflags); +extern my_bool reinit_io_cache(IO_CACHE *info,enum cache_type type, + my_off_t seek_offset,pbool use_async_io, + pbool clear_cache); +extern void setup_io_cache(IO_CACHE* info); +extern int _my_b_read(IO_CACHE *info,uchar *Buffer,size_t Count); +#ifdef THREAD +extern int _my_b_read_r(IO_CACHE *info,uchar *Buffer,size_t Count); +extern void init_io_cache_share(IO_CACHE *read_cache, IO_CACHE_SHARE *cshare, + IO_CACHE *write_cache, uint num_threads); +extern void remove_io_thread(IO_CACHE *info); +#endif +extern int _my_b_seq_read(IO_CACHE *info,uchar *Buffer,size_t Count); +extern int _my_b_net_read(IO_CACHE *info,uchar *Buffer,size_t Count); +extern int _my_b_get(IO_CACHE *info); +extern int _my_b_async_read(IO_CACHE *info,uchar *Buffer,size_t Count); +extern int _my_b_write(IO_CACHE *info,const uchar *Buffer,size_t Count); +extern int my_b_append(IO_CACHE *info,const uchar *Buffer,size_t Count); +extern int my_b_safe_write(IO_CACHE *info,const uchar *Buffer,size_t Count); + +extern int my_block_write(IO_CACHE *info, const uchar *Buffer, + size_t Count, my_off_t pos); +extern int my_b_flush_io_cache(IO_CACHE *info, int need_append_buffer_lock); + +#define flush_io_cache(info) my_b_flush_io_cache((info),1) + +extern int end_io_cache(IO_CACHE *info); +extern size_t my_b_fill(IO_CACHE *info); +extern void my_b_seek(IO_CACHE *info,my_off_t pos); +extern size_t my_b_gets(IO_CACHE *info, char *to, size_t max_length); +extern my_off_t my_b_filelength(IO_CACHE *info); +extern size_t my_b_printf(IO_CACHE *info, const char* fmt, ...); +extern size_t my_b_vprintf(IO_CACHE *info, const char* fmt, va_list ap); +extern my_bool open_cached_file(IO_CACHE *cache,const char *dir, + const char *prefix, size_t cache_size, + myf cache_myflags); +extern my_bool real_open_cached_file(IO_CACHE *cache); +extern void close_cached_file(IO_CACHE *cache); +File create_temp_file(char *to, const char *dir, const char *pfx, + int mode, myf MyFlags); +#define my_init_dynamic_array(A,B,C,D) init_dynamic_array2(A,B,NULL,C,D CALLER_INFO) +#define my_init_dynamic_array_ci(A,B,C,D) init_dynamic_array2(A,B,NULL,C,D ORIG_CALLER_INFO) +#define my_init_dynamic_array2(A,B,C,D,E) init_dynamic_array2(A,B,C,D,E CALLER_INFO) +#define my_init_dynamic_array2_ci(A,B,C,D,E) init_dynamic_array2(A,B,C,D,E ORIG_CALLER_INFO) +extern my_bool init_dynamic_array2(DYNAMIC_ARRAY *array,uint element_size, + void *init_buffer, uint init_alloc, + uint alloc_increment + CALLER_INFO_PROTO); +/* init_dynamic_array() function is deprecated */ +extern my_bool init_dynamic_array(DYNAMIC_ARRAY *array,uint element_size, + uint init_alloc,uint alloc_increment + CALLER_INFO_PROTO); +extern my_bool insert_dynamic(DYNAMIC_ARRAY *array, const uchar * element); +extern uchar *alloc_dynamic(DYNAMIC_ARRAY *array); +extern uchar *pop_dynamic(DYNAMIC_ARRAY*); +extern my_bool set_dynamic(DYNAMIC_ARRAY *array,uchar * element,uint array_index); +extern my_bool allocate_dynamic(DYNAMIC_ARRAY *array, uint max_elements); +extern void get_dynamic(DYNAMIC_ARRAY *array,uchar * element,uint array_index); +extern void delete_dynamic(DYNAMIC_ARRAY *array); +extern void delete_dynamic_element(DYNAMIC_ARRAY *array, uint array_index); +extern void freeze_size(DYNAMIC_ARRAY *array); +extern int get_index_dynamic(DYNAMIC_ARRAY *array, uchar * element); +#define dynamic_array_ptr(array,array_index) ((array)->buffer+(array_index)*(array)->size_of_element) +#define dynamic_element(array,array_index,type) ((type)((array)->buffer) +(array_index)) +#define push_dynamic(A,B) insert_dynamic((A),(B)) +#define reset_dynamic(array) ((array)->elements= 0) +#define sort_dynamic(A,cmp) my_qsort((A)->buffer, (A)->elements, (A)->size_of_element, (cmp)) + +extern my_bool init_dynamic_string(DYNAMIC_STRING *str, const char *init_str, + size_t init_alloc,size_t alloc_increment); +extern my_bool dynstr_append(DYNAMIC_STRING *str, const char *append); +my_bool dynstr_append_mem(DYNAMIC_STRING *str, const char *append, + size_t length); +extern my_bool dynstr_append_os_quoted(DYNAMIC_STRING *str, const char *append, + ...); +extern my_bool dynstr_set(DYNAMIC_STRING *str, const char *init_str); +extern my_bool dynstr_realloc(DYNAMIC_STRING *str, size_t additional_size); +extern my_bool dynstr_trunc(DYNAMIC_STRING *str, size_t n); +extern void dynstr_free(DYNAMIC_STRING *str); +#ifdef HAVE_MLOCK +extern void *my_malloc_lock(size_t length,myf flags); +extern void my_free_lock(void *ptr,myf flags); +#else +#define my_malloc_lock(A,B) my_malloc((A),(B)) +#define my_free_lock(A,B) my_free((A),(B)) +#endif +#define alloc_root_inited(A) ((A)->min_malloc != 0) +#define ALLOC_ROOT_MIN_BLOCK_SIZE (MALLOC_OVERHEAD + sizeof(USED_MEM) + 8) +#define clear_alloc_root(A) do { (A)->free= (A)->used= (A)->pre_alloc= 0; (A)->min_malloc=0;} while(0) +extern void init_alloc_root(MEM_ROOT *mem_root, size_t block_size, + size_t pre_alloc_size); +extern void *alloc_root(MEM_ROOT *mem_root, size_t Size); +extern void *multi_alloc_root(MEM_ROOT *mem_root, ...); +extern void free_root(MEM_ROOT *root, myf MyFLAGS); +extern void set_prealloc_root(MEM_ROOT *root, char *ptr); +extern void reset_root_defaults(MEM_ROOT *mem_root, size_t block_size, + size_t prealloc_size); +extern char *strdup_root(MEM_ROOT *root,const char *str); +extern char *strmake_root(MEM_ROOT *root,const char *str,size_t len); +extern void *memdup_root(MEM_ROOT *root,const void *str, size_t len); +extern int get_defaults_options(int argc, char **argv, + char **defaults, char **extra_defaults, + char **group_suffix); +extern const char *args_separator; +extern int my_load_defaults(const char *conf_file, const char **groups, + int *argc, char ***argv, const char ***); +extern int load_defaults(const char *conf_file, const char **groups, + int *argc, char ***argv); +extern int modify_defaults_file(const char *file_location, const char *option, + const char *option_value, + const char *section_name, int remove_option); +extern int my_search_option_files(const char *conf_file, int *argc, + char ***argv, uint *args_used, + Process_option_func func, void *func_ctx, + const char **default_directories); +extern void free_defaults(char **argv); +extern void my_print_default_files(const char *conf_file); +extern void print_defaults(const char *conf_file, const char **groups); +extern my_bool my_compress(uchar *, size_t *, size_t *); +extern my_bool my_uncompress(uchar *, size_t , size_t *); +extern uchar *my_compress_alloc(const uchar *packet, size_t *len, + size_t *complen); +extern int packfrm(uchar *, size_t, uchar **, size_t *); +extern int unpackfrm(uchar **, size_t *, const uchar *); + +extern ha_checksum my_checksum(ha_checksum crc, const uchar *mem, + size_t count); +#ifndef DBUG_OFF +extern void my_debug_put_break_here(void); +#else +#define my_debug_put_break_here() do {} while(0) +#endif + +extern void my_sleep(ulong m_seconds); +extern ulong crc32(ulong crc, const uchar *buf, uint len); +extern uint my_set_max_open_files(uint files); +void my_free_open_file_info(void); + +extern time_t my_time(myf flags); +extern ulonglong my_getsystime(void); +extern ulonglong my_micro_time(); +extern ulonglong my_micro_time_and_time(time_t *time_arg); +time_t my_time_possible_from_micro(ulonglong microtime); +extern my_bool my_gethwaddr(uchar *to); +extern int my_getncpus(); + +#ifdef HAVE_SYS_MMAN_H +#include + +#ifndef MAP_NOSYNC +#define MAP_NOSYNC 0 +#endif +#ifndef MAP_NORESERVE +#define MAP_NORESERVE 0 /* For irix and AIX */ +#endif + +#ifdef HAVE_MMAP64 +#define my_mmap(a,b,c,d,e,f) mmap64(a,b,c,d,e,f) +#else +#define my_mmap(a,b,c,d,e,f) mmap(a,b,c,d,e,f) +#endif +#define my_munmap(a,b) munmap((a),(b)) + +#else +/* not a complete set of mmap() flags, but only those that nesessary */ +#define PROT_READ 1 +#define PROT_WRITE 2 +#define MAP_NORESERVE 0 +#define MAP_SHARED 0x0001 +#define MAP_PRIVATE 0x0002 +#define MAP_NOSYNC 0x0800 +#define MAP_FAILED ((void *)-1) +#define MS_SYNC 0x0000 + +#ifndef __NETWARE__ +#define HAVE_MMAP +#endif + +void *my_mmap(void *, size_t, int, int, int, my_off_t); +int my_munmap(void *, size_t); +#endif + +/* my_getpagesize */ +#ifdef HAVE_GETPAGESIZE +#define my_getpagesize() getpagesize() +#else +int my_getpagesize(void); +#endif + +int my_msync(int, void *, size_t, int); + +#define MY_UUID_SIZE 16 +#define MY_UUID_STRING_LENGTH (8+1+4+1+4+1+4+1+12) + +void my_uuid_init(ulong seed1, ulong seed2); +void my_uuid(uchar *guid); +void my_uuid2str(const uchar *guid, char *s); +void my_uuid_end(); + +struct my_rnd_struct { + unsigned long seed1,seed2,max_value; + double max_value_dbl; +}; + +void my_rnd_init(struct my_rnd_struct *rand_st, ulong seed1, ulong seed2); +double my_rnd(struct my_rnd_struct *rand_st); + +/* character sets */ +extern uint get_charset_number(const char *cs_name, uint cs_flags); +extern uint get_collation_number(const char *name); +extern const char *get_charset_name(uint cs_number); + +extern CHARSET_INFO *get_charset(uint cs_number, myf flags); +extern CHARSET_INFO *get_charset_by_name(const char *cs_name, myf flags); +extern CHARSET_INFO *get_charset_by_csname(const char *cs_name, + uint cs_flags, myf my_flags); + +extern my_bool resolve_charset(const char *cs_name, + CHARSET_INFO *default_cs, + CHARSET_INFO **cs); +extern my_bool resolve_collation(const char *cl_name, + CHARSET_INFO *default_cl, + CHARSET_INFO **cl); + +extern void free_charsets(void); +extern char *get_charsets_dir(char *buf); +extern my_bool my_charset_same(CHARSET_INFO *cs1, CHARSET_INFO *cs2); +extern my_bool init_compiled_charsets(myf flags); +extern void add_compiled_collation(CHARSET_INFO *cs); +extern size_t escape_string_for_mysql(CHARSET_INFO *charset_info, + char *to, size_t to_length, + const char *from, size_t length); +#ifdef __WIN__ +#define BACKSLASH_MBTAIL +/* File system character set */ +extern CHARSET_INFO *fs_character_set(void); +#endif +extern size_t escape_quotes_for_mysql(CHARSET_INFO *charset_info, + char *to, size_t to_length, + const char *from, size_t length); + +extern void thd_increment_bytes_sent(ulong length); +extern void thd_increment_bytes_received(ulong length); +extern void thd_increment_net_big_packet_count(ulong length); + +#ifdef __WIN__ +extern my_bool have_tcpip; /* Is set if tcpip is used */ + +/* implemented in my_windac.c */ + +int my_security_attr_create(SECURITY_ATTRIBUTES **psa, const char **perror, + DWORD owner_rights, DWORD everybody_rights); + +void my_security_attr_free(SECURITY_ATTRIBUTES *sa); + +/* implemented in my_conio.c */ +char* my_cgets(char *string, size_t clen, size_t* plen); + +#endif +#ifdef __NETWARE__ +void netware_reg_user(const char *ip, const char *user, + const char *application); +#endif + +C_MODE_END +#endif /* _my_sys_h */ diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/my_time.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_time.h new file mode 100644 index 0000000..58995f1 --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_time.h @@ -0,0 +1,172 @@ +/* Copyright (C) 2004-2005 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* + This is a private header of sql-common library, containing + declarations for my_time.c +*/ + +#ifndef _my_time_h_ +#define _my_time_h_ +#include "my_global.h" +#include "mysql_time.h" + +C_MODE_START + +extern ulonglong log_10_int[20]; +extern uchar days_in_month[]; + +/* + Portable time_t replacement. + Should be signed and hold seconds for 1902 -- 2038-01-19 range + i.e at least a 32bit variable + + Using the system built in time_t is not an option as + we rely on the above requirements in the time functions + + For example QNX has an unsigned time_t type +*/ +typedef long my_time_t; + +#define MY_TIME_T_MAX LONG_MAX +#define MY_TIME_T_MIN LONG_MIN + +/* Time handling defaults */ +#define TIMESTAMP_MAX_YEAR 2038 +#define TIMESTAMP_MIN_YEAR (1900 + YY_PART_YEAR - 1) +#define TIMESTAMP_MAX_VALUE INT_MAX32 +#define TIMESTAMP_MIN_VALUE 1 + +/* two-digit years < this are 20..; >= this are 19.. */ +#define YY_PART_YEAR 70 + +/* Flags to str_to_datetime */ +#define TIME_FUZZY_DATE 1 +#define TIME_DATETIME_ONLY 2 +/* Must be same as MODE_NO_ZERO_IN_DATE */ +#define TIME_NO_ZERO_IN_DATE (65536L*2*2*2*2*2*2*2) +/* Must be same as MODE_NO_ZERO_DATE */ +#define TIME_NO_ZERO_DATE (TIME_NO_ZERO_IN_DATE*2) +#define TIME_INVALID_DATES (TIME_NO_ZERO_DATE*2) + +#define MYSQL_TIME_WARN_TRUNCATED 1 +#define MYSQL_TIME_WARN_OUT_OF_RANGE 2 + +/* Limits for the TIME data type */ +#define TIME_MAX_HOUR 838 +#define TIME_MAX_MINUTE 59 +#define TIME_MAX_SECOND 59 +#define TIME_MAX_VALUE (TIME_MAX_HOUR*10000 + TIME_MAX_MINUTE*100 + \ + TIME_MAX_SECOND) +#define TIME_MAX_VALUE_SECONDS (TIME_MAX_HOUR * 3600L + \ + TIME_MAX_MINUTE * 60L + TIME_MAX_SECOND) + +my_bool check_date(const MYSQL_TIME *ltime, my_bool not_zero_date, + ulong flags, int *was_cut); +enum enum_mysql_timestamp_type +str_to_datetime(const char *str, uint length, MYSQL_TIME *l_time, + uint flags, int *was_cut); +longlong number_to_datetime(longlong nr, MYSQL_TIME *time_res, + uint flags, int *was_cut); +ulonglong TIME_to_ulonglong_datetime(const MYSQL_TIME *); +ulonglong TIME_to_ulonglong_date(const MYSQL_TIME *); +ulonglong TIME_to_ulonglong_time(const MYSQL_TIME *); +ulonglong TIME_to_ulonglong(const MYSQL_TIME *); + + +my_bool str_to_time(const char *str,uint length, MYSQL_TIME *l_time, + int *warning); + +int check_time_range(struct st_mysql_time *, int *warning); + +long calc_daynr(uint year,uint month,uint day); +uint calc_days_in_year(uint year); +uint year_2000_handling(uint year); + +void my_init_time(void); + + +/* + Function to check sanity of a TIMESTAMP value + + DESCRIPTION + Check if a given MYSQL_TIME value fits in TIMESTAMP range. + This function doesn't make precise check, but rather a rough + estimate. + + RETURN VALUES + FALSE The value seems sane + TRUE The MYSQL_TIME value is definitely out of range +*/ + +static inline my_bool validate_timestamp_range(const MYSQL_TIME *t) +{ + if ((t->year > TIMESTAMP_MAX_YEAR || t->year < TIMESTAMP_MIN_YEAR) || + (t->year == TIMESTAMP_MAX_YEAR && (t->month > 1 || t->day > 19)) || + (t->year == TIMESTAMP_MIN_YEAR && (t->month < 12 || t->day < 31))) + return FALSE; + + return TRUE; +} + +my_time_t +my_system_gmt_sec(const MYSQL_TIME *t, long *my_timezone, + my_bool *in_dst_time_gap); + +void set_zero_time(MYSQL_TIME *tm, enum enum_mysql_timestamp_type time_type); + +/* + Required buffer length for my_time_to_str, my_date_to_str, + my_datetime_to_str and TIME_to_string functions. Note, that the + caller is still responsible to check that given TIME structure + has values in valid ranges, otherwise size of the buffer could + be not enough. We also rely on the fact that even wrong values + sent using binary protocol fit in this buffer. +*/ +#define MAX_DATE_STRING_REP_LENGTH 30 + +int my_time_to_str(const MYSQL_TIME *l_time, char *to); +int my_date_to_str(const MYSQL_TIME *l_time, char *to); +int my_datetime_to_str(const MYSQL_TIME *l_time, char *to); +int my_TIME_to_str(const MYSQL_TIME *l_time, char *to); + +/* + Available interval types used in any statement. + + 'interval_type' must be sorted so that simple intervals comes first, + ie year, quarter, month, week, day, hour, etc. The order based on + interval size is also important and the intervals should be kept in a + large to smaller order. (get_interval_value() depends on this) + + Note: If you change the order of elements in this enum you should fix + order of elements in 'interval_type_to_name' and 'interval_names' + arrays + + See also interval_type_to_name, get_interval_value, interval_names +*/ + +enum interval_type +{ + INTERVAL_YEAR, INTERVAL_QUARTER, INTERVAL_MONTH, INTERVAL_WEEK, INTERVAL_DAY, + INTERVAL_HOUR, INTERVAL_MINUTE, INTERVAL_SECOND, INTERVAL_MICROSECOND, + INTERVAL_YEAR_MONTH, INTERVAL_DAY_HOUR, INTERVAL_DAY_MINUTE, + INTERVAL_DAY_SECOND, INTERVAL_HOUR_MINUTE, INTERVAL_HOUR_SECOND, + INTERVAL_MINUTE_SECOND, INTERVAL_DAY_MICROSECOND, INTERVAL_HOUR_MICROSECOND, + INTERVAL_MINUTE_MICROSECOND, INTERVAL_SECOND_MICROSECOND, INTERVAL_LAST +}; + +C_MODE_END + +#endif /* _my_time_h_ */ diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/my_tree.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_tree.h new file mode 100644 index 0000000..e387b25 --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_tree.h @@ -0,0 +1,96 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef _tree_h +#define _tree_h +#ifdef __cplusplus +extern "C" { +#endif + +#include "my_base.h" /* get 'enum ha_rkey_function' */ + +/* Worst case tree is half full. This gives use 2^(MAX_TREE_HEIGHT/2) leafs */ +#define MAX_TREE_HEIGHT 64 + +#define ELEMENT_KEY(tree,element)\ +(tree->offset_to_key ? (void*)((uchar*) element+tree->offset_to_key) :\ + *((void**) (element+1))) + +#define tree_set_pointer(element,ptr) *((uchar **) (element+1))=((uchar*) (ptr)) + +#define TREE_NO_DUPS 1 + +typedef enum { left_root_right, right_root_left } TREE_WALK; +typedef uint32 element_count; +typedef int (*tree_walk_action)(void *,element_count,void *); + +typedef enum { free_init, free_free, free_end } TREE_FREE; +typedef void (*tree_element_free)(void*, TREE_FREE, void *); + +typedef struct st_tree_element { + struct st_tree_element *left,*right; + uint32 count:31, + colour:1; /* black is marked as 1 */ +} TREE_ELEMENT; + +#define ELEMENT_CHILD(element, offs) (*(TREE_ELEMENT**)((char*)element + offs)) + +typedef struct st_tree { + TREE_ELEMENT *root,null_element; + TREE_ELEMENT **parents[MAX_TREE_HEIGHT]; + uint offset_to_key,elements_in_tree,size_of_element; + ulong memory_limit, allocated; + qsort_cmp2 compare; + void *custom_arg; + MEM_ROOT mem_root; + my_bool with_delete; + tree_element_free free; + uint flag; +} TREE; + + /* Functions on whole tree */ +void init_tree(TREE *tree, ulong default_alloc_size, ulong memory_limit, + int size, qsort_cmp2 compare, my_bool with_delete, + tree_element_free free_element, void *custom_arg); +void delete_tree(TREE*); +void reset_tree(TREE*); + + /* similar to delete tree, except we do not my_free() blocks in mem_root */ +#define is_tree_inited(tree) ((tree)->root != 0) + + /* Functions on leafs */ +TREE_ELEMENT *tree_insert(TREE *tree,void *key, uint key_size, + void *custom_arg); +void *tree_search(TREE *tree, void *key, void *custom_arg); +int tree_walk(TREE *tree,tree_walk_action action, + void *argument, TREE_WALK visit); +int tree_delete(TREE *tree, void *key, uint key_size, void *custom_arg); +void *tree_search_key(TREE *tree, const void *key, + TREE_ELEMENT **parents, TREE_ELEMENT ***last_pos, + enum ha_rkey_function flag, void *custom_arg); +void *tree_search_edge(TREE *tree, TREE_ELEMENT **parents, + TREE_ELEMENT ***last_pos, int child_offs); +void *tree_search_next(TREE *tree, TREE_ELEMENT ***last_pos, int l_offs, + int r_offs); +ha_rows tree_record_pos(TREE *tree, const void *key, + enum ha_rkey_function search_flag, void *custom_arg); +#define reset_free_element(tree) (tree)->free= 0 + +#define TREE_ELEMENT_EXTRA_SIZE (sizeof(TREE_ELEMENT) + sizeof(void*)) + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/my_trie.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_trie.h new file mode 100644 index 0000000..72dd485 --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_trie.h @@ -0,0 +1,141 @@ +/* Copyright (C) 2005 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef _trie_h +#define _trie_h +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct st_trie_node +{ + uint16 leaf; /* Depth from root node if match, 0 else */ + uchar c; /* Label on this edge */ + struct st_trie_node *next; /* Next label */ + struct st_trie_node *links; /* Array of edges leaving this node */ + struct st_trie_node *fail; /* AC failure function */ +} TRIE_NODE; + +typedef struct st_trie +{ + TRIE_NODE root; + MEM_ROOT mem_root; + CHARSET_INFO *charset; + uint32 nnodes; + uint32 nwords; +} TRIE; + +typedef struct st_ac_trie_state +{ + TRIE *trie; + TRIE_NODE *node; +} AC_TRIE_STATE; + +extern TRIE *trie_init (TRIE *trie, CHARSET_INFO *charset); +extern void trie_free (TRIE *trie); +extern my_bool trie_insert (TRIE *trie, const uchar *key, uint keylen); +extern my_bool ac_trie_prepare (TRIE *trie); +extern void ac_trie_init (TRIE *trie, AC_TRIE_STATE *state); + + +/* `trie_goto' is internal function and shouldn't be used. */ + +static inline TRIE_NODE *trie_goto (TRIE_NODE *root, TRIE_NODE *node, uchar c) +{ + TRIE_NODE *next; + DBUG_ENTER("trie_goto"); + for (next= node->links; next; next= next->next) + if (next->c == c) + DBUG_RETURN(next); + if (root == node) + DBUG_RETURN(root); + DBUG_RETURN(NULL); +} + + +/* + SYNOPSIS + int ac_trie_next (AC_TRIE_STATE *state, uchar *c); + state - valid pointer to `AC_TRIE_STATE' + c - character to lookup + + DESCRIPTION + Implementation of search using Aho-Corasick automaton. + Performs char-by-char search. + + RETURN VALUE + `ac_trie_next' returns length of matched word or 0. +*/ + +static inline int ac_trie_next (AC_TRIE_STATE *state, uchar *c) +{ + TRIE_NODE *root, *node; + DBUG_ENTER("ac_trie_next"); + DBUG_ASSERT(state && c); + root= &state->trie->root; + node= state->node; + while (! (state->node= trie_goto(root, node, *c))) + node= node->fail; + DBUG_RETURN(state->node->leaf); +} + + +/* + SYNOPSIS + my_bool trie_search (TRIE *trie, const uchar *key, uint keylen); + trie - valid pointer to `TRIE' + key - valid pointer to key to insert + keylen - non-0 key length + + DESCRIPTION + Performs key lookup in trie. + + RETURN VALUE + `trie_search' returns `true' if key is in `trie'. Otherwise, + `false' is returned. + + NOTES + Consecutive search here is "best by test". arrays are very short, so + binary search or hashing would add too much complexity that would + overweight speed gain. Especially because compiler can optimize simple + consecutive loop better (tested) +*/ + +static inline my_bool trie_search (TRIE *trie, const uchar *key, uint keylen) +{ + TRIE_NODE *node; + uint k; + DBUG_ENTER("trie_search"); + DBUG_ASSERT(trie && key && keylen); + node= &trie->root; + + for (k= 0; k < keylen; k++) + { + uchar p; + if (! (node= node->links)) + DBUG_RETURN(FALSE); + p= key[k]; + while (p != node->c) + if (! (node= node->next)) + DBUG_RETURN(FALSE); + } + + DBUG_RETURN(node->leaf > 0); +} + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/my_uctype.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_uctype.h new file mode 100644 index 0000000..9aaf478 --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_uctype.h @@ -0,0 +1,1479 @@ +/* Copyright (C) 2006 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ + +/* + Unicode ctype data + Generated from UnicodeData-5.0.0d9.txt +*/ +static unsigned char uctype_page00[256]= +{ + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 8, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 16, 16, 16, 16, 16, 16, + 16, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, + 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 16, 16, 16, 16, 16, + 16, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 16, 16, 16, 16, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 8, 16, 16, 16, 16, 16, 16, 16, 16, 16, 2, 16, 16, 32, 16, 16, + 16, 16, 20, 20, 16, 2, 16, 16, 16, 20, 2, 16, 20, 20, 20, 16, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 16, 1, 1, 1, 1, 1, 1, 1, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 16, 2, 2, 2, 2, 2, 2, 2, 2 +}; + +static unsigned char uctype_page01[256]= +{ + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, + 2, 1, 2, 1, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, + 2, 1, 1, 2, 1, 2, 1, 1, 2, 1, 1, 1, 2, 2, 1, 1, + 1, 1, 2, 1, 1, 2, 1, 1, 1, 2, 2, 2, 1, 1, 2, 1, + 1, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, + 2, 1, 1, 1, 2, 1, 2, 1, 1, 2, 2, 2, 1, 2, 2, 2, + 2, 2, 2, 2, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 1, + 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 2, 1, 1, 2, 1, 2, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2 +}; + +static unsigned char uctype_page02[256]= +{ + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 2, 1, 1, 2, + 2, 1, 2, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 16, 16, 16, 16, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 2, 2, 2, 2, 2, 16, 16, 16, 16, 16, 16, 16, 16, 16, 2, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16 +}; + +static unsigned char uctype_page03[256]= +{ + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 0, 0, 0, 0, 16, 16, 0, 0, 0, 0, 2, 2, 2, 2, 16, 0, + 0, 0, 0, 0, 16, 16, 1, 16, 1, 1, 1, 0, 1, 0, 1, 1, + 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, + 2, 2, 1, 1, 1, 2, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 2, 2, 2, 2, 1, 2, 16, 1, 2, 1, 1, 2, 2, 1, 1, 1 +}; + +static unsigned char uctype_page04[256]= +{ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 16, 18, 18, 18, 18, 0, 18, 18, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2 +}; + +static unsigned char uctype_page05[256]= +{ + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 2, 16, 16, 16, 16, 16, 16, + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 0, 16, 16, 0, 0, 0, 0, 0, + 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 16, 18, + 16, 18, 18, 16, 18, 18, 16, 18, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, + 2, 2, 2, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_page06[256]= +{ + 32, 32, 32, 32, 0, 0, 0, 0, 0, 0, 0, 16, 16, 16, 16, 16, + 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 16, 0, 0, 16, 16, + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 16, 16, 16, 16, 2, 2, + 18, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 16, 2, 18, 18, 18, 18, 18, 18, 18, 32, 18, 18, + 18, 18, 18, 18, 18, 2, 2, 18, 18, 16, 18, 18, 18, 18, 2, 2, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 16, 16, 2 +}; + +static unsigned char uctype_page07[256]= +{ + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 32, + 2, 18, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 2, 2, 16, 16, 16, 16, 2, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_page09[256]= +{ + 0, 18, 18, 18, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 18, 2, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, + 2, 18, 18, 18, 18, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 18, 18, 16, 16, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, + 0, 18, 18, 18, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, + 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, + 2, 0, 2, 0, 0, 0, 2, 2, 2, 2, 0, 0, 18, 2, 18, 18, + 18, 18, 18, 18, 18, 0, 0, 18, 18, 0, 0, 18, 18, 18, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 2, 2, 0, 2, + 2, 2, 18, 18, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 2, 2, 16, 16, 20, 20, 20, 20, 20, 20, 16, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_page0A[256]= +{ + 0, 18, 18, 18, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 2, + 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, + 2, 0, 2, 2, 0, 2, 2, 0, 2, 2, 0, 0, 18, 0, 18, 18, + 18, 18, 18, 0, 0, 0, 0, 18, 18, 0, 0, 18, 18, 18, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 2, 0, + 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 18, 18, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 18, 18, 18, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, + 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, + 2, 0, 2, 2, 0, 2, 2, 2, 2, 2, 0, 0, 18, 2, 18, 18, + 18, 18, 18, 18, 18, 18, 0, 18, 18, 18, 0, 18, 18, 18, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 18, 18, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_page0B[256]= +{ + 0, 18, 18, 18, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, + 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, + 2, 0, 2, 2, 0, 2, 2, 2, 2, 2, 0, 0, 18, 2, 18, 18, + 18, 18, 18, 18, 0, 0, 0, 18, 18, 0, 0, 18, 18, 18, 0, 0, + 0, 0, 0, 0, 0, 0, 18, 18, 0, 0, 0, 0, 2, 2, 0, 2, + 2, 2, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 16, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 18, 2, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, + 2, 0, 2, 2, 2, 2, 0, 0, 0, 2, 2, 0, 2, 0, 2, 2, + 0, 0, 0, 2, 2, 0, 0, 0, 2, 2, 2, 0, 0, 0, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 18, 18, + 18, 18, 18, 0, 0, 0, 18, 18, 18, 0, 18, 18, 18, 18, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 20, 20, 20, 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_page0C[256]= +{ + 0, 18, 18, 18, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, + 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 18, 18, + 18, 18, 18, 18, 18, 0, 18, 18, 18, 0, 18, 18, 18, 18, 0, 0, + 0, 0, 0, 0, 0, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 18, 18, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, + 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 0, 0, 18, 2, 18, 18, + 18, 18, 18, 18, 18, 0, 18, 18, 18, 0, 18, 18, 18, 18, 0, 0, + 0, 0, 0, 0, 0, 18, 18, 0, 0, 0, 0, 0, 0, 0, 2, 0, + 2, 2, 18, 18, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 0, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_page0D[256]= +{ + 0, 0, 18, 18, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, + 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 18, 18, + 18, 18, 18, 18, 0, 0, 18, 18, 18, 0, 18, 18, 18, 18, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 18, 18, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 18, 0, 0, 0, 0, 18, + 18, 18, 18, 18, 18, 0, 18, 0, 18, 18, 18, 18, 18, 18, 18, 18, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 18, 18, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_page0E[256]= +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 18, 2, 2, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 16, + 2, 2, 2, 2, 2, 2, 2, 18, 18, 18, 18, 18, 18, 18, 18, 16, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 16, 16, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 2, 0, 2, 0, 0, 2, 2, 0, 2, 0, 0, 2, 0, 0, + 0, 0, 0, 0, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, + 0, 2, 2, 2, 0, 2, 0, 2, 0, 0, 2, 2, 0, 2, 2, 2, + 2, 18, 2, 2, 18, 18, 18, 18, 18, 18, 0, 18, 18, 2, 0, 0, + 2, 2, 2, 2, 2, 0, 2, 0, 18, 18, 18, 18, 18, 18, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 2, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_page0F[256]= +{ + 2, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 18, 18, 16, 16, 16, 16, 16, 16, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 16, 18, 16, 18, 16, 18, 16, 16, 16, 16, 18, 18, + 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, + 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 16, 18, 18, 2, 2, 2, 2, 0, 0, 0, 0, + 18, 18, 18, 18, 18, 18, 18, 18, 0, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 16, 16, + 16, 16, 16, 16, 16, 16, 18, 16, 16, 16, 16, 16, 16, 0, 0, 16, + 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_page10[256]= +{ + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 0, 2, 2, 2, 2, 2, 0, 2, 2, 0, 18, 18, 18, 18, + 18, 18, 18, 0, 0, 0, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 16, 16, 16, 16, 16, 16, + 2, 2, 2, 2, 2, 2, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 2, 0, 0, 0 +}; + +static unsigned char uctype_page11[256]= +{ + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_page12[256]= +{ + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 0, 2, 0, 2, 2, 2, 2, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 0, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, + 2, 0, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 +}; + +static unsigned char uctype_page13[256]= +{ + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 0, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 18, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_page14[256]= +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 +}; + +static unsigned char uctype_page16[256]= +{ + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 16, 2, + 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 16, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 16, 16, 7, 7, + 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_page17[256]= +{ + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, + 2, 2, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 18, 18, 18, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, + 2, 0, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 32, 32, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 16, 16, 16, 2, 16, 16, 16, 16, 2, 18, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_page18[256]= +{ + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 18, 18, 18, 8, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 18, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_page19[256]= +{ + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, + 16, 0, 0, 0, 16, 16, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, + 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 2, 2, 2, 2, 2, 2, 2, 18, 18, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16 +}; + +static unsigned char uctype_page1A[256]= +{ + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 18, 18, 18, 18, 18, 0, 0, 16, 16, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_page1B[256]= +{ + 18, 18, 18, 18, 18, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_page1D[256]= +{ + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18 +}; + +static unsigned char uctype_page1E[256]= +{ + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_page1F[256]= +{ + 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 0, 1, 0, 1, 0, 1, 0, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 0, 2, 2, 1, 1, 1, 1, 1, 16, 2, 16, + 16, 16, 2, 2, 2, 0, 2, 2, 1, 1, 1, 1, 1, 16, 16, 16, + 2, 2, 2, 2, 0, 0, 2, 2, 1, 1, 1, 1, 0, 16, 16, 16, + 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 16, 16, 16, + 0, 0, 2, 2, 2, 0, 2, 2, 1, 1, 1, 1, 1, 16, 16, 0 +}; + +static unsigned char uctype_page20[256]= +{ + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 32, 32, 32, 32, 32, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 8, 8, 32, 32, 32, 32, 32, 8, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 8, + 32, 32, 32, 32, 0, 0, 0, 0, 0, 0, 32, 32, 32, 32, 32, 32, + 20, 2, 0, 0, 20, 20, 20, 20, 20, 20, 16, 16, 16, 16, 16, 2, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 16, 16, 16, 16, 16, 0, + 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_page21[256]= +{ + 16, 16, 1, 16, 16, 16, 16, 1, 16, 16, 2, 1, 1, 1, 2, 2, + 1, 1, 1, 2, 16, 1, 16, 16, 16, 1, 1, 1, 1, 1, 16, 16, + 16, 16, 16, 16, 1, 16, 1, 16, 1, 16, 1, 1, 1, 1, 16, 2, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 16, 16, 2, 2, 1, 1, + 16, 16, 16, 16, 16, 1, 2, 2, 2, 2, 16, 16, 16, 16, 2, 0, + 0, 0, 0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16 +}; + +static unsigned char uctype_page23[256]= +{ + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_page24[256]= +{ + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20 +}; + +static unsigned char uctype_page26[256]= +{ + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_page27[256]= +{ + 0, 16, 16, 16, 16, 0, 16, 16, 16, 16, 0, 0, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 0, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 16, 0, 16, + 16, 16, 16, 0, 0, 0, 16, 0, 16, 16, 16, 16, 16, 16, 16, 0, + 0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 16, 0, 0, 0, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16 +}; + +static unsigned char uctype_page2B[256]= +{ + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, + 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_page2C[256]= +{ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, + 1, 2, 1, 1, 1, 2, 2, 1, 2, 1, 2, 1, 2, 0, 0, 0, + 0, 0, 0, 0, 2, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 2, 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 16, 16, 16, 20, 16, 16 +}; + +static unsigned char uctype_page2D[256]= +{ + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 0, + 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 0, + 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 0, + 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_page2E[256]= +{ + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 16, 16, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_page2F[256]= +{ + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 0 +}; + +static unsigned char uctype_page30[256]= +{ + 8, 16, 16, 16, 16, 2, 2, 7, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 7, 7, 7, 7, 7, 7, 7, 7, 7, 18, 18, 18, 18, 18, 18, + 16, 2, 2, 2, 2, 2, 16, 16, 7, 7, 7, 2, 2, 16, 16, 16, + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 0, 0, 18, 18, 16, 16, 2, 2, 2, + 16, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 2, 2, 2, 2 +}; + +static unsigned char uctype_page31[256]= +{ + 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, + 16, 16, 20, 20, 20, 20, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 +}; + +static unsigned char uctype_page32[256]= +{ + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 16, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0 +}; + +static unsigned char uctype_page4D[256]= +{ + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16 +}; + +static unsigned char uctype_page9F[256]= +{ + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_pageA4[256]= +{ + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_pageA7[256]= +{ + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 2, 2, 2, 2, 0, 0, 0, 0, 0, + 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_pageA8[256]= +{ + 2, 2, 18, 2, 2, 2, 18, 2, 2, 2, 2, 18, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 18, 18, 18, 18, 18, 16, 16, 16, 16, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_pageD7[256]= +{ + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_pageD8[256]= +{ + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_pageDB[256]= +{ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32 +}; + +static unsigned char uctype_pageDC[256]= +{ + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_pageDF[256]= +{ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32 +}; + +static unsigned char uctype_pageE0[256]= +{ + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_pageF8[256]= +{ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32 +}; + +static unsigned char uctype_pageFA[256]= +{ + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static unsigned char uctype_pageFB[256]= +{ + 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 18, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 0, 2, 0, + 2, 2, 0, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 +}; + +static unsigned char uctype_pageFD[256]= +{ + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 16, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 16, 0, 0 +}; + +static unsigned char uctype_pageFE[256]= +{ + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, + 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 0, 16, 16, 16, 16, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 32 +}; + +static unsigned char uctype_pageFF[256]= +{ + 0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 16, 16, 16, 16, 16, 16, + 16, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 16, 16, 16, 16, + 16, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, + 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, + 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 0, 0, 0, + 16, 16, 16, 16, 16, 16, 16, 0, 16, 16, 16, 16, 16, 16, 16, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 32, 32, 16, 16, 0, 0 +}; + +MY_UNI_CTYPE my_uni_ctype[256]={ + {0,uctype_page00}, + {0,uctype_page01}, + {0,uctype_page02}, + {0,uctype_page03}, + {0,uctype_page04}, + {0,uctype_page05}, + {0,uctype_page06}, + {0,uctype_page07}, + {0,NULL}, + {0,uctype_page09}, + {0,uctype_page0A}, + {0,uctype_page0B}, + {0,uctype_page0C}, + {0,uctype_page0D}, + {0,uctype_page0E}, + {0,uctype_page0F}, + {0,uctype_page10}, + {0,uctype_page11}, + {0,uctype_page12}, + {0,uctype_page13}, + {0,uctype_page14}, + {2,NULL}, + {0,uctype_page16}, + {0,uctype_page17}, + {0,uctype_page18}, + {0,uctype_page19}, + {0,uctype_page1A}, + {0,uctype_page1B}, + {0,NULL}, + {0,uctype_page1D}, + {0,uctype_page1E}, + {0,uctype_page1F}, + {0,uctype_page20}, + {0,uctype_page21}, + {16,NULL}, + {0,uctype_page23}, + {0,uctype_page24}, + {16,NULL}, + {0,uctype_page26}, + {0,uctype_page27}, + {16,NULL}, + {16,NULL}, + {16,NULL}, + {0,uctype_page2B}, + {0,uctype_page2C}, + {0,uctype_page2D}, + {0,uctype_page2E}, + {0,uctype_page2F}, + {0,uctype_page30}, + {0,uctype_page31}, + {0,uctype_page32}, + {16,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {0,uctype_page4D}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {0,uctype_page9F}, + {2,NULL}, + {2,NULL}, + {2,NULL}, + {2,NULL}, + {0,uctype_pageA4}, + {0,NULL}, + {0,NULL}, + {0,uctype_pageA7}, + {0,uctype_pageA8}, + {0,NULL}, + {0,NULL}, + {0,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {3,NULL}, + {0,uctype_pageD7}, + {0,uctype_pageD8}, + {0,NULL}, + {0,NULL}, + {0,uctype_pageDB}, + {0,uctype_pageDC}, + {0,NULL}, + {0,NULL}, + {0,uctype_pageDF}, + {0,uctype_pageE0}, + {0,NULL}, + {0,NULL}, + {0,NULL}, + {0,NULL}, + {0,NULL}, + {0,NULL}, + {0,NULL}, + {0,NULL}, + {0,NULL}, + {0,NULL}, + {0,NULL}, + {0,NULL}, + {0,NULL}, + {0,NULL}, + {0,NULL}, + {0,NULL}, + {0,NULL}, + {0,NULL}, + {0,NULL}, + {0,NULL}, + {0,NULL}, + {0,NULL}, + {0,NULL}, + {0,uctype_pageF8}, + {2,NULL}, + {0,uctype_pageFA}, + {0,uctype_pageFB}, + {2,NULL}, + {0,uctype_pageFD}, + {0,uctype_pageFE}, + {0,uctype_pageFF} +}; + + diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/my_vle.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_vle.h new file mode 100644 index 0000000..c09f822 --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_vle.h @@ -0,0 +1,38 @@ +/* Copyright (C) 2005 MySQL AB + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef VLE_H +#define VLE_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "my_global.h" + +/* + The size (in bytes) required to store the object ITEM, which can be + either an expression or a type (since sizeof() is used on the item). +*/ +#define my_vle_sizeof(ITEM) (((sizeof(ITEM) * CHAR_BIT) + 6) / 7) + +uchar *my_vle_encode(uchar *vle, size_t max, ulong value); +uchar const *my_vle_decode(ulong *value_ptr, uchar const *vle); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/my_xml.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_xml.h new file mode 100644 index 0000000..6a453ee --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/my_xml.h @@ -0,0 +1,89 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + + +#ifndef _my_xml_h +#define _my_xml_h + +#ifdef __cplusplus +extern "C" { +#endif + + +#define MY_XML_OK 0 +#define MY_XML_ERROR 1 + +/* + A flag whether to use absolute tag names in call-back functions, + like "a", "a.b" and "a.b.c" (used in character set file parser), + or relative names like "a", "b" and "c". +*/ +#define MY_XML_FLAG_RELATIVE_NAMES 1 + +/* + A flag whether to skip normilization of text values before calling + call-back functions: i.e. skip leading/trailing spaces, + \r, \n, \t characters. +*/ +#define MY_XML_FLAG_SKIP_TEXT_NORMALIZATION 2 + +enum my_xml_node_type +{ + MY_XML_NODE_TAG, /* can have TAG, ATTR and TEXT children */ + MY_XML_NODE_ATTR, /* can have TEXT children */ + MY_XML_NODE_TEXT /* cannot have children */ +}; + +typedef struct xml_stack_st +{ + int flags; + enum my_xml_node_type current_node_type; + char errstr[128]; + char attr[128]; + char *attrend; + const char *beg; + const char *cur; + const char *end; + void *user_data; + int (*enter)(struct xml_stack_st *st,const char *val, size_t len); + int (*value)(struct xml_stack_st *st,const char *val, size_t len); + int (*leave_xml)(struct xml_stack_st *st,const char *val, size_t len); +} MY_XML_PARSER; + +void my_xml_parser_create(MY_XML_PARSER *st); +void my_xml_parser_free(MY_XML_PARSER *st); +int my_xml_parse(MY_XML_PARSER *st,const char *str, size_t len); + +void my_xml_set_value_handler(MY_XML_PARSER *st, int (*)(MY_XML_PARSER *, + const char *, + size_t len)); +void my_xml_set_enter_handler(MY_XML_PARSER *st, int (*)(MY_XML_PARSER *, + const char *, + size_t len)); +void my_xml_set_leave_handler(MY_XML_PARSER *st, int (*)(MY_XML_PARSER *, + const char *, + size_t len)); +void my_xml_set_user_data(MY_XML_PARSER *st, void *); + +size_t my_xml_error_pos(MY_XML_PARSER *st); +uint my_xml_error_lineno(MY_XML_PARSER *st); + +const char *my_xml_error_string(MY_XML_PARSER *st); + +#ifdef __cplusplus +} +#endif + +#endif /* _my_xml_h */ diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/myisampack.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/myisampack.h new file mode 100644 index 0000000..34a085e --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/myisampack.h @@ -0,0 +1,238 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* + Storing of values in high byte first order. + + integer keys and file pointers are stored with high byte first to get + better compression +*/ + +/* these two are for uniformity */ +#define mi_sint1korr(A) ((int8)(*A)) +#define mi_uint1korr(A) ((uint8)(*A)) + +#define mi_sint2korr(A) ((int16) (((int16) (((const uchar*) (A))[1])) +\ + ((int16) ((int16) ((const char*) (A))[0]) << 8))) +#define mi_sint3korr(A) ((int32) (((((const uchar*) (A))[0]) & 128) ? \ + (((uint32) 255L << 24) | \ + (((uint32) ((const uchar*) (A))[0]) << 16) |\ + (((uint32) ((const uchar*) (A))[1]) << 8) | \ + ((uint32) ((const uchar*) (A))[2])) : \ + (((uint32) ((const uchar*) (A))[0]) << 16) |\ + (((uint32) ((const uchar*) (A))[1]) << 8) | \ + ((uint32) ((const uchar*) (A))[2]))) +#define mi_sint4korr(A) ((int32) (((int32) (((const uchar*) (A))[3])) +\ + ((int32) (((const uchar*) (A))[2]) << 8) +\ + ((int32) (((const uchar*) (A))[1]) << 16) +\ + ((int32) ((int16) ((const char*) (A))[0]) << 24))) +#define mi_sint8korr(A) ((longlong) mi_uint8korr(A)) +#define mi_uint2korr(A) ((uint16) (((uint16) (((const uchar*) (A))[1])) +\ + ((uint16) (((const uchar*) (A))[0]) << 8))) +#define mi_uint3korr(A) ((uint32) (((uint32) (((const uchar*) (A))[2])) +\ + (((uint32) (((const uchar*) (A))[1])) << 8) +\ + (((uint32) (((const uchar*) (A))[0])) << 16))) +#define mi_uint4korr(A) ((uint32) (((uint32) (((const uchar*) (A))[3])) +\ + (((uint32) (((const uchar*) (A))[2])) << 8) +\ + (((uint32) (((const uchar*) (A))[1])) << 16) +\ + (((uint32) (((const uchar*) (A))[0])) << 24))) +#define mi_uint5korr(A) ((ulonglong)(((uint32) (((const uchar*) (A))[4])) +\ + (((uint32) (((const uchar*) (A))[3])) << 8) +\ + (((uint32) (((const uchar*) (A))[2])) << 16) +\ + (((uint32) (((const uchar*) (A))[1])) << 24)) +\ + (((ulonglong) (((const uchar*) (A))[0])) << 32)) +#define mi_uint6korr(A) ((ulonglong)(((uint32) (((const uchar*) (A))[5])) +\ + (((uint32) (((const uchar*) (A))[4])) << 8) +\ + (((uint32) (((const uchar*) (A))[3])) << 16) +\ + (((uint32) (((const uchar*) (A))[2])) << 24)) +\ + (((ulonglong) (((uint32) (((const uchar*) (A))[1])) +\ + (((uint32) (((const uchar*) (A))[0]) << 8)))) <<\ + 32)) +#define mi_uint7korr(A) ((ulonglong)(((uint32) (((const uchar*) (A))[6])) +\ + (((uint32) (((const uchar*) (A))[5])) << 8) +\ + (((uint32) (((const uchar*) (A))[4])) << 16) +\ + (((uint32) (((const uchar*) (A))[3])) << 24)) +\ + (((ulonglong) (((uint32) (((const uchar*) (A))[2])) +\ + (((uint32) (((const uchar*) (A))[1])) << 8) +\ + (((uint32) (((const uchar*) (A))[0])) << 16))) <<\ + 32)) +#define mi_uint8korr(A) ((ulonglong)(((uint32) (((const uchar*) (A))[7])) +\ + (((uint32) (((const uchar*) (A))[6])) << 8) +\ + (((uint32) (((const uchar*) (A))[5])) << 16) +\ + (((uint32) (((const uchar*) (A))[4])) << 24)) +\ + (((ulonglong) (((uint32) (((const uchar*) (A))[3])) +\ + (((uint32) (((const uchar*) (A))[2])) << 8) +\ + (((uint32) (((const uchar*) (A))[1])) << 16) +\ + (((uint32) (((const uchar*) (A))[0])) << 24))) <<\ + 32)) + +/* This one is for uniformity */ +#define mi_int1store(T,A) *((uchar*)(T))= (uchar) (A) + +#define mi_int2store(T,A) { uint def_temp= (uint) (A) ;\ + ((uchar*) (T))[1]= (uchar) (def_temp);\ + ((uchar*) (T))[0]= (uchar) (def_temp >> 8); } +#define mi_int3store(T,A) { /*lint -save -e734 */\ + ulong def_temp= (ulong) (A);\ + ((uchar*) (T))[2]= (uchar) (def_temp);\ + ((uchar*) (T))[1]= (uchar) (def_temp >> 8);\ + ((uchar*) (T))[0]= (uchar) (def_temp >> 16);\ + /*lint -restore */} +#define mi_int4store(T,A) { ulong def_temp= (ulong) (A);\ + ((uchar*) (T))[3]= (uchar) (def_temp);\ + ((uchar*) (T))[2]= (uchar) (def_temp >> 8);\ + ((uchar*) (T))[1]= (uchar) (def_temp >> 16);\ + ((uchar*) (T))[0]= (uchar) (def_temp >> 24); } +#define mi_int5store(T,A) { ulong def_temp= (ulong) (A),\ + def_temp2= (ulong) ((A) >> 32);\ + ((uchar*) (T))[4]= (uchar) (def_temp);\ + ((uchar*) (T))[3]= (uchar) (def_temp >> 8);\ + ((uchar*) (T))[2]= (uchar) (def_temp >> 16);\ + ((uchar*) (T))[1]= (uchar) (def_temp >> 24);\ + ((uchar*) (T))[0]= (uchar) (def_temp2); } +#define mi_int6store(T,A) { ulong def_temp= (ulong) (A),\ + def_temp2= (ulong) ((A) >> 32);\ + ((uchar*) (T))[5]= (uchar) (def_temp);\ + ((uchar*) (T))[4]= (uchar) (def_temp >> 8);\ + ((uchar*) (T))[3]= (uchar) (def_temp >> 16);\ + ((uchar*) (T))[2]= (uchar) (def_temp >> 24);\ + ((uchar*) (T))[1]= (uchar) (def_temp2);\ + ((uchar*) (T))[0]= (uchar) (def_temp2 >> 8); } +#define mi_int7store(T,A) { ulong def_temp= (ulong) (A),\ + def_temp2= (ulong) ((A) >> 32);\ + ((uchar*) (T))[6]= (uchar) (def_temp);\ + ((uchar*) (T))[5]= (uchar) (def_temp >> 8);\ + ((uchar*) (T))[4]= (uchar) (def_temp >> 16);\ + ((uchar*) (T))[3]= (uchar) (def_temp >> 24);\ + ((uchar*) (T))[2]= (uchar) (def_temp2);\ + ((uchar*) (T))[1]= (uchar) (def_temp2 >> 8);\ + ((uchar*) (T))[0]= (uchar) (def_temp2 >> 16); } +#define mi_int8store(T,A) { ulong def_temp3= (ulong) (A),\ + def_temp4= (ulong) ((A) >> 32);\ + mi_int4store((uchar*) (T) + 0, def_temp4);\ + mi_int4store((uchar*) (T) + 4, def_temp3); } + +#ifdef WORDS_BIGENDIAN + +#define mi_float4store(T,A) { ((uchar*) (T))[0]= ((uchar*) &A)[0];\ + ((uchar*) (T))[1]= ((uchar*) &A)[1];\ + ((uchar*) (T))[2]= ((uchar*) &A)[2];\ + ((uchar*) (T))[3]= ((uchar*) &A)[3]; } + +#define mi_float4get(V,M) { float def_temp;\ + ((uchar*) &def_temp)[0]= ((const uchar*) (M))[0];\ + ((uchar*) &def_temp)[1]= ((const uchar*) (M))[1]; \ + ((uchar*) &def_temp)[2]= ((const uchar*) (M))[2];\ + ((uchar*) &def_temp)[3]= ((const uchar*) (M))[3];\ + (V)= def_temp; } + +#define mi_float8store(T,V) { ((uchar*) (T))[0]= ((const uchar*) &V)[0];\ + ((uchar*) (T))[1]= ((const uchar*) &V)[1];\ + ((uchar*) (T))[2]= ((const uchar*) &V)[2];\ + ((uchar*) (T))[3]= ((const uchar*) &V)[3];\ + ((uchar*) (T))[4]= ((const uchar*) &V)[4];\ + ((uchar*) (T))[5]= ((const uchar*) &V)[5];\ + ((uchar*) (T))[6]= ((const uchar*) &V)[6];\ + ((uchar*) (T))[7]= ((const uchar*) &V)[7]; } + +#define mi_float8get(V,M) { double def_temp;\ + ((uchar*) &def_temp)[0]= ((const uchar*) (M))[0];\ + ((uchar*) &def_temp)[1]= ((const uchar*) (M))[1];\ + ((uchar*) &def_temp)[2]= ((const uchar*) (M))[2];\ + ((uchar*) &def_temp)[3]= ((const uchar*) (M))[3];\ + ((uchar*) &def_temp)[4]= ((const uchar*) (M))[4];\ + ((uchar*) &def_temp)[5]= ((const uchar*) (M))[5];\ + ((uchar*) &def_temp)[6]= ((const uchar*) (M))[6];\ + ((uchar*) &def_temp)[7]= ((const uchar*) (M))[7]; \ + (V)= def_temp; } +#else + +#define mi_float4store(T,A) { ((uchar*) (T))[0]= ((const uchar*) &A)[3];\ + ((uchar*) (T))[1]= ((const uchar*) &A)[2];\ + ((uchar*) (T))[2]= ((const uchar*) &A)[1];\ + ((uchar*) (T))[3]= ((const uchar*) &A)[0]; } + +#define mi_float4get(V,M) { float def_temp;\ + ((uchar*) &def_temp)[0]= ((const uchar*) (M))[3];\ + ((uchar*) &def_temp)[1]= ((const uchar*) (M))[2];\ + ((uchar*) &def_temp)[2]= ((const uchar*) (M))[1];\ + ((uchar*) &def_temp)[3]= ((const uchar*) (M))[0];\ + (V)= def_temp; } + +#if defined(__FLOAT_WORD_ORDER) && (__FLOAT_WORD_ORDER == __BIG_ENDIAN) +#define mi_float8store(T,V) { ((uchar*) (T))[0]= ((const uchar*) &V)[3];\ + ((uchar*) (T))[1]= ((const uchar*) &V)[2];\ + ((uchar*) (T))[2]= ((const uchar*) &V)[1];\ + ((uchar*) (T))[3]= ((const uchar*) &V)[0];\ + ((uchar*) (T))[4]= ((const uchar*) &V)[7];\ + ((uchar*) (T))[5]= ((const uchar*) &V)[6];\ + ((uchar*) (T))[6]= ((const uchar*) &V)[5];\ + ((uchar*) (T))[7]= ((const uchar*) &V)[4];} + +#define mi_float8get(V,M) { double def_temp;\ + ((uchar*) &def_temp)[0]= ((const uchar*) (M))[3];\ + ((uchar*) &def_temp)[1]= ((const uchar*) (M))[2];\ + ((uchar*) &def_temp)[2]= ((const uchar*) (M))[1];\ + ((uchar*) &def_temp)[3]= ((const uchar*) (M))[0];\ + ((uchar*) &def_temp)[4]= ((const uchar*) (M))[7];\ + ((uchar*) &def_temp)[5]= ((const uchar*) (M))[6];\ + ((uchar*) &def_temp)[6]= ((const uchar*) (M))[5];\ + ((uchar*) &def_temp)[7]= ((const uchar*) (M))[4];\ + (V)= def_temp; } + +#else +#define mi_float8store(T,V) { ((uchar*) (T))[0]= ((const uchar*) &V)[7];\ + ((uchar*) (T))[1]= ((const uchar*) &V)[6];\ + ((uchar*) (T))[2]= ((const uchar*) &V)[5];\ + ((uchar*) (T))[3]= ((const uchar*) &V)[4];\ + ((uchar*) (T))[4]= ((const uchar*) &V)[3];\ + ((uchar*) (T))[5]= ((const uchar*) &V)[2];\ + ((uchar*) (T))[6]= ((const uchar*) &V)[1];\ + ((uchar*) (T))[7]= ((const uchar*) &V)[0];} + +#define mi_float8get(V,M) { double def_temp;\ + ((uchar*) &def_temp)[0]= ((const uchar*) (M))[7];\ + ((uchar*) &def_temp)[1]= ((const uchar*) (M))[6];\ + ((uchar*) &def_temp)[2]= ((const uchar*) (M))[5];\ + ((uchar*) &def_temp)[3]= ((const uchar*) (M))[4];\ + ((uchar*) &def_temp)[4]= ((const uchar*) (M))[3];\ + ((uchar*) &def_temp)[5]= ((const uchar*) (M))[2];\ + ((uchar*) &def_temp)[6]= ((const uchar*) (M))[1];\ + ((uchar*) &def_temp)[7]= ((const uchar*) (M))[0];\ + (V)= def_temp; } +#endif /* __FLOAT_WORD_ORDER */ +#endif /* WORDS_BIGENDIAN */ + +/* Fix to avoid warnings when sizeof(ha_rows) == sizeof(long) */ + +#ifdef BIG_TABLES +#define mi_rowstore(T,A) mi_int8store(T, A) +#define mi_rowkorr(T) mi_uint8korr(T) +#else +#define mi_rowstore(T,A) { mi_int4store(T, 0);\ + mi_int4store(((uchar*) (T) + 4), A); } +#define mi_rowkorr(T) mi_uint4korr((const uchar*) (T) + 4) +#endif + +#if SIZEOF_OFF_T > 4 +#define mi_sizestore(T,A) mi_int8store(T, A) +#define mi_sizekorr(T) mi_uint8korr(T) +#else +#define mi_sizestore(T,A) { if ((A) == HA_OFFSET_ERROR)\ + bfill((char*) (T), 8, 255);\ + else { mi_int4store((T), 0);\ + mi_int4store(((T) + 4), A); }} +#define mi_sizekorr(T) mi_uint4korr((const uchar*) (T) + 4) +#endif diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/mysql.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/mysql.h new file mode 100644 index 0000000..88333c4 --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/mysql.h @@ -0,0 +1,755 @@ +/* Copyright (C) 2000-2003 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* + This file defines the client API to MySQL and also the ABI of the + dynamically linked libmysqlclient. + + The ABI should never be changed in a released product of MySQL + thus you need to take great care when changing the file. In case + the file is changed so the ABI is broken, you must also + update the SHAREDLIB_MAJOR_VERSION in configure.in . + +*/ + +#ifndef _mysql_h +#define _mysql_h + +#ifdef _AIX /* large-file support will break without this */ +#include +#endif + +#ifdef __CYGWIN__ /* CYGWIN implements a UNIX API */ +#undef WIN +#undef _WIN +#undef _WIN32 +#undef _WIN64 +#undef __WIN__ +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef _global_h /* If not standard header */ +#include +#ifdef __LCC__ +#include /* For windows */ +#endif +typedef char my_bool; +#if (defined(_WIN32) || defined(_WIN64)) && !defined(__WIN__) +#define __WIN__ +#endif +#if !defined(__WIN__) +#define STDCALL +#else +#define STDCALL __stdcall +#endif + +#ifndef my_socket_defined +#ifdef __WIN__ +#define my_socket SOCKET +#else +typedef int my_socket; +#endif /* __WIN__ */ +#endif /* my_socket_defined */ +#endif /* _global_h */ + +#include "mysql_version.h" +#include "mysql_com.h" +#include "mysql_time.h" + +#include "my_list.h" /* for LISTs used in 'MYSQL' and 'MYSQL_STMT' */ + +extern unsigned int mysql_port; +extern char *mysql_unix_port; + +#define CLIENT_NET_READ_TIMEOUT 365*24*3600 /* Timeout on read */ +#define CLIENT_NET_WRITE_TIMEOUT 365*24*3600 /* Timeout on write */ + +#ifdef __NETWARE__ +#pragma pack(push, 8) /* 8 byte alignment */ +#endif + +#define IS_PRI_KEY(n) ((n) & PRI_KEY_FLAG) +#define IS_NOT_NULL(n) ((n) & NOT_NULL_FLAG) +#define IS_BLOB(n) ((n) & BLOB_FLAG) +#define IS_NUM(t) ((t) <= MYSQL_TYPE_INT24 || (t) == MYSQL_TYPE_YEAR || (t) == MYSQL_TYPE_NEWDECIMAL) +#define IS_NUM_FIELD(f) ((f)->flags & NUM_FLAG) +#define INTERNAL_NUM_FIELD(f) (((f)->type <= MYSQL_TYPE_INT24 && ((f)->type != MYSQL_TYPE_TIMESTAMP || (f)->length == 14 || (f)->length == 8)) || (f)->type == MYSQL_TYPE_YEAR) +#define IS_LONGDATA(t) ((t) >= MYSQL_TYPE_TINY_BLOB && (t) <= MYSQL_TYPE_STRING) + + +typedef struct st_mysql_field { + char *name; /* Name of column */ + char *org_name; /* Original column name, if an alias */ + char *table; /* Table of column if column was a field */ + char *org_table; /* Org table name, if table was an alias */ + char *db; /* Database for table */ + char *catalog; /* Catalog for table */ + char *def; /* Default value (set by mysql_list_fields) */ + unsigned long length; /* Width of column (create length) */ + unsigned long max_length; /* Max width for selected set */ + unsigned int name_length; + unsigned int org_name_length; + unsigned int table_length; + unsigned int org_table_length; + unsigned int db_length; + unsigned int catalog_length; + unsigned int def_length; + unsigned int flags; /* Div flags */ + unsigned int decimals; /* Number of decimals in field */ + unsigned int charsetnr; /* Character set */ + enum enum_field_types type; /* Type of field. See mysql_com.h for types */ + void *extension; +} MYSQL_FIELD; + +typedef char **MYSQL_ROW; /* return data as array of strings */ +typedef unsigned int MYSQL_FIELD_OFFSET; /* offset to current field */ + +#ifndef _global_h +#if defined(NO_CLIENT_LONG_LONG) +typedef unsigned long my_ulonglong; +#elif defined (__WIN__) +typedef unsigned __int64 my_ulonglong; +#else +typedef unsigned long long my_ulonglong; +#endif +#endif + +#include "typelib.h" + +#define MYSQL_COUNT_ERROR (~(my_ulonglong) 0) + +/* backward compatibility define - to be removed eventually */ +#define ER_WARN_DATA_TRUNCATED WARN_DATA_TRUNCATED + +typedef struct st_mysql_rows { + struct st_mysql_rows *next; /* list of rows */ + MYSQL_ROW data; + unsigned long length; +} MYSQL_ROWS; + +typedef MYSQL_ROWS *MYSQL_ROW_OFFSET; /* offset to current row */ + +#include "my_alloc.h" + +typedef struct embedded_query_result EMBEDDED_QUERY_RESULT; +typedef struct st_mysql_data { + MYSQL_ROWS *data; + struct embedded_query_result *embedded_info; + MEM_ROOT alloc; + my_ulonglong rows; + unsigned int fields; + /* extra info for embedded library */ + void *extension; +} MYSQL_DATA; + +enum mysql_option +{ + MYSQL_OPT_CONNECT_TIMEOUT, MYSQL_OPT_COMPRESS, MYSQL_OPT_NAMED_PIPE, + MYSQL_INIT_COMMAND, MYSQL_READ_DEFAULT_FILE, MYSQL_READ_DEFAULT_GROUP, + MYSQL_SET_CHARSET_DIR, MYSQL_SET_CHARSET_NAME, MYSQL_OPT_LOCAL_INFILE, + MYSQL_OPT_PROTOCOL, MYSQL_SHARED_MEMORY_BASE_NAME, MYSQL_OPT_READ_TIMEOUT, + MYSQL_OPT_WRITE_TIMEOUT, MYSQL_OPT_USE_RESULT, + MYSQL_OPT_USE_REMOTE_CONNECTION, MYSQL_OPT_USE_EMBEDDED_CONNECTION, + MYSQL_OPT_GUESS_CONNECTION, MYSQL_SET_CLIENT_IP, MYSQL_SECURE_AUTH, + MYSQL_REPORT_DATA_TRUNCATION, MYSQL_OPT_RECONNECT, + MYSQL_OPT_SSL_VERIFY_SERVER_CERT +}; + +struct st_mysql_options { + unsigned int connect_timeout, read_timeout, write_timeout; + unsigned int port, protocol; + unsigned long client_flag; + char *host,*user,*password,*unix_socket,*db; + struct st_dynamic_array *init_commands; + char *my_cnf_file,*my_cnf_group, *charset_dir, *charset_name; + char *ssl_key; /* PEM key file */ + char *ssl_cert; /* PEM cert file */ + char *ssl_ca; /* PEM CA file */ + char *ssl_capath; /* PEM directory of CA-s? */ + char *ssl_cipher; /* cipher to use */ + char *shared_memory_base_name; + unsigned long max_allowed_packet; + my_bool use_ssl; /* if to use SSL or not */ + my_bool compress,named_pipe; + my_bool unused1; + my_bool unused2; + my_bool unused3; + my_bool unused4; + enum mysql_option methods_to_use; + char *client_ip; + /* Refuse client connecting to server if it uses old (pre-4.1.1) protocol */ + my_bool secure_auth; + /* 0 - never report, 1 - always report (default) */ + my_bool report_data_truncation; + + /* function pointers for local infile support */ + int (*local_infile_init)(void **, const char *, void *); + int (*local_infile_read)(void *, char *, unsigned int); + void (*local_infile_end)(void *); + int (*local_infile_error)(void *, char *, unsigned int); + void *local_infile_userdata; + void *extension; +}; + +enum mysql_status +{ + MYSQL_STATUS_READY,MYSQL_STATUS_GET_RESULT,MYSQL_STATUS_USE_RESULT +}; + +enum mysql_protocol_type +{ + MYSQL_PROTOCOL_DEFAULT, MYSQL_PROTOCOL_TCP, MYSQL_PROTOCOL_SOCKET, + MYSQL_PROTOCOL_PIPE, MYSQL_PROTOCOL_MEMORY +}; + +typedef struct character_set +{ + unsigned int number; /* character set number */ + unsigned int state; /* character set state */ + const char *csname; /* collation name */ + const char *name; /* character set name */ + const char *comment; /* comment */ + const char *dir; /* character set directory */ + unsigned int mbminlen; /* min. length for multibyte strings */ + unsigned int mbmaxlen; /* max. length for multibyte strings */ +} MY_CHARSET_INFO; + +struct st_mysql_methods; +struct st_mysql_stmt; + +typedef struct st_mysql +{ + NET net; /* Communication parameters */ + unsigned char *connector_fd; /* ConnectorFd for SSL */ + char *host,*user,*passwd,*unix_socket,*server_version,*host_info; + char *info, *db; + struct charset_info_st *charset; + MYSQL_FIELD *fields; + MEM_ROOT field_alloc; + my_ulonglong affected_rows; + my_ulonglong insert_id; /* id if insert on table with NEXTNR */ + my_ulonglong extra_info; /* Not used */ + unsigned long thread_id; /* Id for connection in server */ + unsigned long packet_length; + unsigned int port; + unsigned long client_flag,server_capabilities; + unsigned int protocol_version; + unsigned int field_count; + unsigned int server_status; + unsigned int server_language; + unsigned int warning_count; + struct st_mysql_options options; + enum mysql_status status; + my_bool free_me; /* If free in mysql_close */ + my_bool reconnect; /* set to 1 if automatic reconnect */ + + /* session-wide random string */ + char scramble[SCRAMBLE_LENGTH+1]; + my_bool unused1; + void *unused2, *unused3, *unused4, *unused5; + + LIST *stmts; /* list of all statements */ + const struct st_mysql_methods *methods; + void *thd; + /* + Points to boolean flag in MYSQL_RES or MYSQL_STMT. We set this flag + from mysql_stmt_close if close had to cancel result set of this object. + */ + my_bool *unbuffered_fetch_owner; + /* needed for embedded server - no net buffer to store the 'info' */ + char *info_buffer; + void *extension; +} MYSQL; + + +typedef struct st_mysql_res { + my_ulonglong row_count; + MYSQL_FIELD *fields; + MYSQL_DATA *data; + MYSQL_ROWS *data_cursor; + unsigned long *lengths; /* column lengths of current row */ + MYSQL *handle; /* for unbuffered reads */ + const struct st_mysql_methods *methods; + MYSQL_ROW row; /* If unbuffered read */ + MYSQL_ROW current_row; /* buffer to current row */ + MEM_ROOT field_alloc; + unsigned int field_count, current_field; + my_bool eof; /* Used by mysql_fetch_row */ + /* mysql_stmt_close() had to cancel this result */ + my_bool unbuffered_fetch_cancelled; + void *extension; +} MYSQL_RES; + + +#if !defined(MYSQL_SERVER) && !defined(MYSQL_CLIENT) +#define MYSQL_CLIENT +#endif + + +typedef struct st_mysql_parameters +{ + unsigned long *p_max_allowed_packet; + unsigned long *p_net_buffer_length; + void *extension; +} MYSQL_PARAMETERS; + +#if !defined(MYSQL_SERVER) && !defined(EMBEDDED_LIBRARY) +#define max_allowed_packet (*mysql_get_parameters()->p_max_allowed_packet) +#define net_buffer_length (*mysql_get_parameters()->p_net_buffer_length) +#endif + +/* + Set up and bring down the server; to ensure that applications will + work when linked against either the standard client library or the + embedded server library, these functions should be called. +*/ +int STDCALL mysql_server_init(int argc, char **argv, char **groups); +void STDCALL mysql_server_end(void); + +/* + mysql_server_init/end need to be called when using libmysqld or + libmysqlclient (exactly, mysql_server_init() is called by mysql_init() so + you don't need to call it explicitely; but you need to call + mysql_server_end() to free memory). The names are a bit misleading + (mysql_SERVER* to be used when using libmysqlCLIENT). So we add more general + names which suit well whether you're using libmysqld or libmysqlclient. We + intend to promote these aliases over the mysql_server* ones. +*/ +#define mysql_library_init mysql_server_init +#define mysql_library_end mysql_server_end + +MYSQL_PARAMETERS *STDCALL mysql_get_parameters(void); + +/* + Set up and bring down a thread; these function should be called + for each thread in an application which opens at least one MySQL + connection. All uses of the connection(s) should be between these + function calls. +*/ +my_bool STDCALL mysql_thread_init(void); +void STDCALL mysql_thread_end(void); + +/* + Functions to get information from the MYSQL and MYSQL_RES structures + Should definitely be used if one uses shared libraries. +*/ + +my_ulonglong STDCALL mysql_num_rows(MYSQL_RES *res); +unsigned int STDCALL mysql_num_fields(MYSQL_RES *res); +my_bool STDCALL mysql_eof(MYSQL_RES *res); +MYSQL_FIELD *STDCALL mysql_fetch_field_direct(MYSQL_RES *res, + unsigned int fieldnr); +MYSQL_FIELD * STDCALL mysql_fetch_fields(MYSQL_RES *res); +MYSQL_ROW_OFFSET STDCALL mysql_row_tell(MYSQL_RES *res); +MYSQL_FIELD_OFFSET STDCALL mysql_field_tell(MYSQL_RES *res); + +unsigned int STDCALL mysql_field_count(MYSQL *mysql); +my_ulonglong STDCALL mysql_affected_rows(MYSQL *mysql); +my_ulonglong STDCALL mysql_insert_id(MYSQL *mysql); +unsigned int STDCALL mysql_errno(MYSQL *mysql); +const char * STDCALL mysql_error(MYSQL *mysql); +const char *STDCALL mysql_sqlstate(MYSQL *mysql); +unsigned int STDCALL mysql_warning_count(MYSQL *mysql); +const char * STDCALL mysql_info(MYSQL *mysql); +unsigned long STDCALL mysql_thread_id(MYSQL *mysql); +const char * STDCALL mysql_character_set_name(MYSQL *mysql); +int STDCALL mysql_set_character_set(MYSQL *mysql, const char *csname); + +MYSQL * STDCALL mysql_init(MYSQL *mysql); +my_bool STDCALL mysql_ssl_set(MYSQL *mysql, const char *key, + const char *cert, const char *ca, + const char *capath, const char *cipher); +const char * STDCALL mysql_get_ssl_cipher(MYSQL *mysql); +my_bool STDCALL mysql_change_user(MYSQL *mysql, const char *user, + const char *passwd, const char *db); +MYSQL * STDCALL mysql_real_connect(MYSQL *mysql, const char *host, + const char *user, + const char *passwd, + const char *db, + unsigned int port, + const char *unix_socket, + unsigned long clientflag); +int STDCALL mysql_select_db(MYSQL *mysql, const char *db); +int STDCALL mysql_query(MYSQL *mysql, const char *q); +int STDCALL mysql_send_query(MYSQL *mysql, const char *q, + unsigned long length); +int STDCALL mysql_real_query(MYSQL *mysql, const char *q, + unsigned long length); +MYSQL_RES * STDCALL mysql_store_result(MYSQL *mysql); +MYSQL_RES * STDCALL mysql_use_result(MYSQL *mysql); + +void STDCALL mysql_get_character_set_info(MYSQL *mysql, + MY_CHARSET_INFO *charset); + +/* local infile support */ + +#define LOCAL_INFILE_ERROR_LEN 512 + +void +mysql_set_local_infile_handler(MYSQL *mysql, + int (*local_infile_init)(void **, const char *, + void *), + int (*local_infile_read)(void *, char *, + unsigned int), + void (*local_infile_end)(void *), + int (*local_infile_error)(void *, char*, + unsigned int), + void *); + +void +mysql_set_local_infile_default(MYSQL *mysql); + +int STDCALL mysql_shutdown(MYSQL *mysql, + enum mysql_enum_shutdown_level + shutdown_level); +int STDCALL mysql_dump_debug_info(MYSQL *mysql); +int STDCALL mysql_refresh(MYSQL *mysql, + unsigned int refresh_options); +int STDCALL mysql_kill(MYSQL *mysql,unsigned long pid); +int STDCALL mysql_set_server_option(MYSQL *mysql, + enum enum_mysql_set_option + option); +int STDCALL mysql_ping(MYSQL *mysql); +const char * STDCALL mysql_stat(MYSQL *mysql); +const char * STDCALL mysql_get_server_info(MYSQL *mysql); +const char * STDCALL mysql_get_client_info(void); +unsigned long STDCALL mysql_get_client_version(void); +const char * STDCALL mysql_get_host_info(MYSQL *mysql); +unsigned long STDCALL mysql_get_server_version(MYSQL *mysql); +unsigned int STDCALL mysql_get_proto_info(MYSQL *mysql); +MYSQL_RES * STDCALL mysql_list_dbs(MYSQL *mysql,const char *wild); +MYSQL_RES * STDCALL mysql_list_tables(MYSQL *mysql,const char *wild); +MYSQL_RES * STDCALL mysql_list_processes(MYSQL *mysql); +int STDCALL mysql_options(MYSQL *mysql,enum mysql_option option, + const void *arg); +void STDCALL mysql_free_result(MYSQL_RES *result); +void STDCALL mysql_data_seek(MYSQL_RES *result, + my_ulonglong offset); +MYSQL_ROW_OFFSET STDCALL mysql_row_seek(MYSQL_RES *result, + MYSQL_ROW_OFFSET offset); +MYSQL_FIELD_OFFSET STDCALL mysql_field_seek(MYSQL_RES *result, + MYSQL_FIELD_OFFSET offset); +MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result); +unsigned long * STDCALL mysql_fetch_lengths(MYSQL_RES *result); +MYSQL_FIELD * STDCALL mysql_fetch_field(MYSQL_RES *result); +MYSQL_RES * STDCALL mysql_list_fields(MYSQL *mysql, const char *table, + const char *wild); +unsigned long STDCALL mysql_escape_string(char *to,const char *from, + unsigned long from_length); +unsigned long STDCALL mysql_hex_string(char *to,const char *from, + unsigned long from_length); +unsigned long STDCALL mysql_real_escape_string(MYSQL *mysql, + char *to,const char *from, + unsigned long length); +void STDCALL mysql_debug(const char *debug); +void STDCALL myodbc_remove_escape(MYSQL *mysql,char *name); +unsigned int STDCALL mysql_thread_safe(void); +my_bool STDCALL mysql_embedded(void); +my_bool STDCALL mysql_read_query_result(MYSQL *mysql); + + +/* + The following definitions are added for the enhanced + client-server protocol +*/ + +/* statement state */ +enum enum_mysql_stmt_state +{ + MYSQL_STMT_INIT_DONE= 1, MYSQL_STMT_PREPARE_DONE, MYSQL_STMT_EXECUTE_DONE, + MYSQL_STMT_FETCH_DONE +}; + + +/* + This structure is used to define bind information, and + internally by the client library. + Public members with their descriptions are listed below + (conventionally `On input' refers to the binds given to + mysql_stmt_bind_param, `On output' refers to the binds given + to mysql_stmt_bind_result): + + buffer_type - One of the MYSQL_* types, used to describe + the host language type of buffer. + On output: if column type is different from + buffer_type, column value is automatically converted + to buffer_type before it is stored in the buffer. + buffer - On input: points to the buffer with input data. + On output: points to the buffer capable to store + output data. + The type of memory pointed by buffer must correspond + to buffer_type. See the correspondence table in + the comment to mysql_stmt_bind_param. + + The two above members are mandatory for any kind of bind. + + buffer_length - the length of the buffer. You don't have to set + it for any fixed length buffer: float, double, + int, etc. It must be set however for variable-length + types, such as BLOBs or STRINGs. + + length - On input: in case when lengths of input values + are different for each execute, you can set this to + point at a variable containining value length. This + way the value length can be different in each execute. + If length is not NULL, buffer_length is not used. + Note, length can even point at buffer_length if + you keep bind structures around while fetching: + this way you can change buffer_length before + each execution, everything will work ok. + On output: if length is set, mysql_stmt_fetch will + write column length into it. + + is_null - On input: points to a boolean variable that should + be set to TRUE for NULL values. + This member is useful only if your data may be + NULL in some but not all cases. + If your data is never NULL, is_null should be set to 0. + If your data is always NULL, set buffer_type + to MYSQL_TYPE_NULL, and is_null will not be used. + + is_unsigned - On input: used to signify that values provided for one + of numeric types are unsigned. + On output describes signedness of the output buffer. + If, taking into account is_unsigned flag, column data + is out of range of the output buffer, data for this column + is regarded truncated. Note that this has no correspondence + to the sign of result set column, if you need to find it out + use mysql_stmt_result_metadata. + error - where to write a truncation error if it is present. + possible error value is: + 0 no truncation + 1 value is out of range or buffer is too small + + Please note that MYSQL_BIND also has internals members. +*/ + +typedef struct st_mysql_bind +{ + unsigned long *length; /* output length pointer */ + my_bool *is_null; /* Pointer to null indicator */ + void *buffer; /* buffer to get/put data */ + /* set this if you want to track data truncations happened during fetch */ + my_bool *error; + unsigned char *row_ptr; /* for the current data position */ + void (*store_param_func)(NET *net, struct st_mysql_bind *param); + void (*fetch_result)(struct st_mysql_bind *, MYSQL_FIELD *, + unsigned char **row); + void (*skip_result)(struct st_mysql_bind *, MYSQL_FIELD *, + unsigned char **row); + /* output buffer length, must be set when fetching str/binary */ + unsigned long buffer_length; + unsigned long offset; /* offset position for char/binary fetch */ + unsigned long length_value; /* Used if length is 0 */ + unsigned int param_number; /* For null count and error messages */ + unsigned int pack_length; /* Internal length for packed data */ + enum enum_field_types buffer_type; /* buffer type */ + my_bool error_value; /* used if error is 0 */ + my_bool is_unsigned; /* set if integer type is unsigned */ + my_bool long_data_used; /* If used with mysql_send_long_data */ + my_bool is_null_value; /* Used if is_null is 0 */ + void *extension; +} MYSQL_BIND; + + +/* statement handler */ +typedef struct st_mysql_stmt +{ + MEM_ROOT mem_root; /* root allocations */ + LIST list; /* list to keep track of all stmts */ + MYSQL *mysql; /* connection handle */ + MYSQL_BIND *params; /* input parameters */ + MYSQL_BIND *bind; /* output parameters */ + MYSQL_FIELD *fields; /* result set metadata */ + MYSQL_DATA result; /* cached result set */ + MYSQL_ROWS *data_cursor; /* current row in cached result */ + /* + mysql_stmt_fetch() calls this function to fetch one row (it's different + for buffered, unbuffered and cursor fetch). + */ + int (*read_row_func)(struct st_mysql_stmt *stmt, + unsigned char **row); + /* copy of mysql->affected_rows after statement execution */ + my_ulonglong affected_rows; + my_ulonglong insert_id; /* copy of mysql->insert_id */ + unsigned long stmt_id; /* Id for prepared statement */ + unsigned long flags; /* i.e. type of cursor to open */ + unsigned long prefetch_rows; /* number of rows per one COM_FETCH */ + /* + Copied from mysql->server_status after execute/fetch to know + server-side cursor status for this statement. + */ + unsigned int server_status; + unsigned int last_errno; /* error code */ + unsigned int param_count; /* input parameter count */ + unsigned int field_count; /* number of columns in result set */ + enum enum_mysql_stmt_state state; /* statement state */ + char last_error[MYSQL_ERRMSG_SIZE]; /* error message */ + char sqlstate[SQLSTATE_LENGTH+1]; + /* Types of input parameters should be sent to server */ + my_bool send_types_to_server; + my_bool bind_param_done; /* input buffers were supplied */ + unsigned char bind_result_done; /* output buffers were supplied */ + /* mysql_stmt_close() had to cancel this result */ + my_bool unbuffered_fetch_cancelled; + /* + Is set to true if we need to calculate field->max_length for + metadata fields when doing mysql_stmt_store_result. + */ + my_bool update_max_length; + void *extension; +} MYSQL_STMT; + +enum enum_stmt_attr_type +{ + /* + When doing mysql_stmt_store_result calculate max_length attribute + of statement metadata. This is to be consistent with the old API, + where this was done automatically. + In the new API we do that only by request because it slows down + mysql_stmt_store_result sufficiently. + */ + STMT_ATTR_UPDATE_MAX_LENGTH, + /* + unsigned long with combination of cursor flags (read only, for update, + etc) + */ + STMT_ATTR_CURSOR_TYPE, + /* + Amount of rows to retrieve from server per one fetch if using cursors. + Accepts unsigned long attribute in the range 1 - ulong_max + */ + STMT_ATTR_PREFETCH_ROWS +}; + + +typedef struct st_mysql_methods +{ + my_bool (*read_query_result)(MYSQL *mysql); + my_bool (*advanced_command)(MYSQL *mysql, + enum enum_server_command command, + const unsigned char *header, + unsigned long header_length, + const unsigned char *arg, + unsigned long arg_length, + my_bool skip_check, + MYSQL_STMT *stmt); + MYSQL_DATA *(*read_rows)(MYSQL *mysql,MYSQL_FIELD *mysql_fields, + unsigned int fields); + MYSQL_RES * (*use_result)(MYSQL *mysql); + void (*fetch_lengths)(unsigned long *to, + MYSQL_ROW column, unsigned int field_count); + void (*flush_use_result)(MYSQL *mysql, my_bool flush_all_results); +#if !defined(MYSQL_SERVER) || defined(EMBEDDED_LIBRARY) + MYSQL_FIELD * (*list_fields)(MYSQL *mysql); + my_bool (*read_prepare_result)(MYSQL *mysql, MYSQL_STMT *stmt); + int (*stmt_execute)(MYSQL_STMT *stmt); + int (*read_binary_rows)(MYSQL_STMT *stmt); + int (*unbuffered_fetch)(MYSQL *mysql, char **row); + void (*free_embedded_thd)(MYSQL *mysql); + const char *(*read_statistics)(MYSQL *mysql); + my_bool (*next_result)(MYSQL *mysql); + int (*read_change_user_result)(MYSQL *mysql, char *buff, const char *passwd); + int (*read_rows_from_cursor)(MYSQL_STMT *stmt); +#endif +} MYSQL_METHODS; + + +MYSQL_STMT * STDCALL mysql_stmt_init(MYSQL *mysql); +int STDCALL mysql_stmt_prepare(MYSQL_STMT *stmt, const char *query, + unsigned long length); +int STDCALL mysql_stmt_execute(MYSQL_STMT *stmt); +int STDCALL mysql_stmt_fetch(MYSQL_STMT *stmt); +int STDCALL mysql_stmt_fetch_column(MYSQL_STMT *stmt, MYSQL_BIND *bind_arg, + unsigned int column, + unsigned long offset); +int STDCALL mysql_stmt_store_result(MYSQL_STMT *stmt); +unsigned long STDCALL mysql_stmt_param_count(MYSQL_STMT * stmt); +my_bool STDCALL mysql_stmt_attr_set(MYSQL_STMT *stmt, + enum enum_stmt_attr_type attr_type, + const void *attr); +my_bool STDCALL mysql_stmt_attr_get(MYSQL_STMT *stmt, + enum enum_stmt_attr_type attr_type, + void *attr); +my_bool STDCALL mysql_stmt_bind_param(MYSQL_STMT * stmt, MYSQL_BIND * bnd); +my_bool STDCALL mysql_stmt_bind_result(MYSQL_STMT * stmt, MYSQL_BIND * bnd); +my_bool STDCALL mysql_stmt_close(MYSQL_STMT * stmt); +my_bool STDCALL mysql_stmt_reset(MYSQL_STMT * stmt); +my_bool STDCALL mysql_stmt_free_result(MYSQL_STMT *stmt); +my_bool STDCALL mysql_stmt_send_long_data(MYSQL_STMT *stmt, + unsigned int param_number, + const char *data, + unsigned long length); +MYSQL_RES *STDCALL mysql_stmt_result_metadata(MYSQL_STMT *stmt); +MYSQL_RES *STDCALL mysql_stmt_param_metadata(MYSQL_STMT *stmt); +unsigned int STDCALL mysql_stmt_errno(MYSQL_STMT * stmt); +const char *STDCALL mysql_stmt_error(MYSQL_STMT * stmt); +const char *STDCALL mysql_stmt_sqlstate(MYSQL_STMT * stmt); +MYSQL_ROW_OFFSET STDCALL mysql_stmt_row_seek(MYSQL_STMT *stmt, + MYSQL_ROW_OFFSET offset); +MYSQL_ROW_OFFSET STDCALL mysql_stmt_row_tell(MYSQL_STMT *stmt); +void STDCALL mysql_stmt_data_seek(MYSQL_STMT *stmt, my_ulonglong offset); +my_ulonglong STDCALL mysql_stmt_num_rows(MYSQL_STMT *stmt); +my_ulonglong STDCALL mysql_stmt_affected_rows(MYSQL_STMT *stmt); +my_ulonglong STDCALL mysql_stmt_insert_id(MYSQL_STMT *stmt); +unsigned int STDCALL mysql_stmt_field_count(MYSQL_STMT *stmt); + +my_bool STDCALL mysql_commit(MYSQL * mysql); +my_bool STDCALL mysql_rollback(MYSQL * mysql); +my_bool STDCALL mysql_autocommit(MYSQL * mysql, my_bool auto_mode); +my_bool STDCALL mysql_more_results(MYSQL *mysql); +int STDCALL mysql_next_result(MYSQL *mysql); +int STDCALL mysql_stmt_next_result(MYSQL_STMT *stmt); +void STDCALL mysql_close(MYSQL *sock); + + +/* status return codes */ +#define MYSQL_NO_DATA 100 +#define MYSQL_DATA_TRUNCATED 101 + +#define mysql_reload(mysql) mysql_refresh((mysql),REFRESH_GRANT) + +#ifdef USE_OLD_FUNCTIONS +MYSQL * STDCALL mysql_connect(MYSQL *mysql, const char *host, + const char *user, const char *passwd); +int STDCALL mysql_create_db(MYSQL *mysql, const char *DB); +int STDCALL mysql_drop_db(MYSQL *mysql, const char *DB); +#endif +#define HAVE_MYSQL_REAL_CONNECT + +/* + The following functions are mainly exported because of mysqlbinlog; + They are not for general usage +*/ + +#define simple_command(mysql, command, arg, length, skip_check) \ + (*(mysql)->methods->advanced_command)(mysql, command, 0, \ + 0, arg, length, skip_check, NULL) +#define stmt_command(mysql, command, arg, length, stmt) \ + (*(mysql)->methods->advanced_command)(mysql, command, 0, \ + 0, arg, length, 1, stmt) + +#ifdef __NETWARE__ +#pragma pack(pop) /* restore alignment */ +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* _mysql_h */ diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/mysql.h.pp b/hdssd/external/win/mysql-connector-c-6.0.2/include/mysql.h.pp new file mode 100644 index 0000000..a8d854b --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/mysql.h.pp @@ -0,0 +1,617 @@ +#include +typedef char my_bool; +typedef int my_socket; +#include "mysql_version.h" +#include "mysql_com.h" +enum enum_server_command +{ + COM_SLEEP, 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, COM_DELAYED_INSERT, COM_CHANGE_USER, COM_BINLOG_DUMP, + COM_TABLE_DUMP, COM_CONNECT_OUT, COM_REGISTER_SLAVE, + COM_STMT_PREPARE, COM_STMT_EXECUTE, COM_STMT_SEND_LONG_DATA, COM_STMT_CLOSE, + COM_STMT_RESET, COM_SET_OPTION, COM_STMT_FETCH, COM_DAEMON, + COM_END +}; +struct st_vio; +typedef struct st_vio Vio; +typedef struct st_net { + Vio *vio; + unsigned char *buff,*buff_end,*write_pos,*read_pos; + my_socket fd; + unsigned long remain_in_buf,length, buf_length, where_b; + unsigned long max_packet,max_packet_size; + unsigned int pkt_nr,compress_pkt_nr; + unsigned int write_timeout, read_timeout, retry_count; + int fcntl; + unsigned int *return_status; + unsigned char reading_or_writing; + char save_char; + my_bool unused1; + my_bool unused2; + my_bool compress; + my_bool unused3; + unsigned char *unused; + unsigned int last_errno; + unsigned char error; + my_bool unused4; + my_bool unused5; + char last_error[512]; + char sqlstate[5 +1]; + void *extension; +} NET; +enum enum_field_types { MYSQL_TYPE_DECIMAL, MYSQL_TYPE_TINY, + MYSQL_TYPE_SHORT, MYSQL_TYPE_LONG, + MYSQL_TYPE_FLOAT, MYSQL_TYPE_DOUBLE, + MYSQL_TYPE_NULL, MYSQL_TYPE_TIMESTAMP, + MYSQL_TYPE_LONGLONG,MYSQL_TYPE_INT24, + MYSQL_TYPE_DATE, MYSQL_TYPE_TIME, + MYSQL_TYPE_DATETIME, MYSQL_TYPE_YEAR, + MYSQL_TYPE_NEWDATE, MYSQL_TYPE_VARCHAR, + MYSQL_TYPE_BIT, + MYSQL_TYPE_NEWDECIMAL=246, + MYSQL_TYPE_ENUM=247, + MYSQL_TYPE_SET=248, + MYSQL_TYPE_TINY_BLOB=249, + MYSQL_TYPE_MEDIUM_BLOB=250, + MYSQL_TYPE_LONG_BLOB=251, + MYSQL_TYPE_BLOB=252, + MYSQL_TYPE_VAR_STRING=253, + MYSQL_TYPE_STRING=254, + MYSQL_TYPE_GEOMETRY=255, + MAX_NO_FIELD_TYPES +}; +enum mysql_enum_shutdown_level { + SHUTDOWN_DEFAULT = 0, + SHUTDOWN_WAIT_CONNECTIONS= (unsigned char)(1 << 0), + SHUTDOWN_WAIT_TRANSACTIONS= (unsigned char)(1 << 1), + SHUTDOWN_WAIT_UPDATES= (unsigned char)(1 << 3), + SHUTDOWN_WAIT_ALL_BUFFERS= ((unsigned char)(1 << 3) << 1), + SHUTDOWN_WAIT_CRITICAL_BUFFERS= ((unsigned char)(1 << 3) << 1) + 1, + KILL_QUERY= 254, + KILL_CONNECTION= 255 +}; +enum enum_cursor_type +{ + CURSOR_TYPE_NO_CURSOR= 0, + CURSOR_TYPE_READ_ONLY= 1, + CURSOR_TYPE_FOR_UPDATE= 2, + CURSOR_TYPE_SCROLLABLE= 4 +}; +enum enum_mysql_set_option +{ + MYSQL_OPTION_MULTI_STATEMENTS_ON, + MYSQL_OPTION_MULTI_STATEMENTS_OFF +}; +my_bool my_net_init(NET *net, Vio* vio); +void my_net_local_init(NET *net); +void net_end(NET *net); + void net_clear(NET *net, my_bool clear_buffer); +my_bool net_realloc(NET *net, size_t length); +my_bool net_flush(NET *net); +my_bool my_net_write(NET *net,const unsigned char *packet, size_t len); +my_bool net_write_command(NET *net,unsigned char command, + const unsigned char *header, size_t head_len, + const unsigned char *packet, size_t len); +int net_real_write(NET *net,const unsigned char *packet, size_t len); +unsigned long my_net_read(NET *net); +struct sockaddr; +int my_connect(my_socket s, const struct sockaddr *name, unsigned int namelen, + unsigned int timeout); +struct my_rnd_struct; +enum Item_result +{ + STRING_RESULT=0, REAL_RESULT, INT_RESULT, ROW_RESULT, DECIMAL_RESULT +}; +typedef struct st_udf_args +{ + unsigned int arg_count; + enum Item_result *arg_type; + char **args; + unsigned long *lengths; + char *maybe_null; + char **attributes; + unsigned long *attribute_lengths; + void *extension; +} UDF_ARGS; +typedef struct st_udf_init +{ + my_bool maybe_null; + unsigned int decimals; + unsigned long max_length; + char *ptr; + my_bool const_item; + void *extension; +} UDF_INIT; +void create_random_string(char *to, unsigned int length, + struct my_rnd_struct *rand_st); +void hash_password(unsigned long *to, const char *password, unsigned int password_len); +void make_scrambled_password_323(char *to, const char *password); +void scramble_323(char *to, const char *message, const char *password); +my_bool check_scramble_323(const char *, const char *message, + unsigned long *salt); +void get_salt_from_password_323(unsigned long *res, const char *password); +void make_password_from_salt_323(char *to, const unsigned long *salt); +void make_scrambled_password(char *to, const char *password); +void scramble(char *to, const char *message, const char *password); +my_bool check_scramble(const char *reply, const char *message, + const unsigned char *hash_stage2); +void get_salt_from_password(unsigned char *res, const char *password); +void make_password_from_salt(char *to, const unsigned char *hash_stage2); +char *octet2hex(char *to, const char *str, unsigned int len); +char *get_tty_password(const char *opt_message); +const char *mysql_errno_to_sqlstate(unsigned int mysql_errno); +my_bool my_thread_init(void); +void my_thread_end(void); +#include "mysql_time.h" +enum enum_mysql_timestamp_type +{ + MYSQL_TIMESTAMP_NONE= -2, MYSQL_TIMESTAMP_ERROR= -1, + MYSQL_TIMESTAMP_DATE= 0, MYSQL_TIMESTAMP_DATETIME= 1, MYSQL_TIMESTAMP_TIME= 2 +}; +typedef struct st_mysql_time +{ + unsigned int year, month, day, hour, minute, second; + unsigned long second_part; + my_bool neg; + enum enum_mysql_timestamp_type time_type; +} MYSQL_TIME; +#include "my_list.h" +typedef struct st_list { + struct st_list *prev,*next; + void *data; +} LIST; +typedef int (*list_walk_action)(void *,void *); +extern LIST *list_add(LIST *root,LIST *element); +extern LIST *list_delete(LIST *root,LIST *element); +extern LIST *list_cons(void *data,LIST *root); +extern LIST *list_reverse(LIST *root); +extern void list_free(LIST *root,unsigned int free_data); +extern unsigned int list_length(LIST *); +extern int list_walk(LIST *,list_walk_action action,unsigned char * argument); +extern unsigned int mysql_port; +extern char *mysql_unix_port; +typedef struct st_mysql_field { + char *name; + char *org_name; + char *table; + char *org_table; + char *db; + char *catalog; + char *def; + unsigned long length; + unsigned long max_length; + unsigned int name_length; + unsigned int org_name_length; + unsigned int table_length; + unsigned int org_table_length; + unsigned int db_length; + unsigned int catalog_length; + unsigned int def_length; + unsigned int flags; + unsigned int decimals; + unsigned int charsetnr; + enum enum_field_types type; + void *extension; +} MYSQL_FIELD; +typedef char **MYSQL_ROW; +typedef unsigned int MYSQL_FIELD_OFFSET; +typedef unsigned long long my_ulonglong; +#include "typelib.h" +#include "my_alloc.h" +typedef struct st_used_mem +{ + struct st_used_mem *next; + size_t left; + size_t size; +} USED_MEM; +typedef struct st_mem_root +{ + USED_MEM *free; + USED_MEM *used; + USED_MEM *pre_alloc; + size_t min_malloc; + size_t block_size; + unsigned int block_num; + unsigned int first_block_usage; + void (*error_handler)(void); +} MEM_ROOT; +typedef struct st_typelib { + unsigned int count; + const char *name; + const char **type_names; + unsigned int *type_lengths; +} TYPELIB; +extern my_ulonglong find_typeset(char *x, TYPELIB *typelib,int *error_position); +extern int find_type_or_exit(const char *x, TYPELIB *typelib, + const char *option); +extern int find_type(char *x, const TYPELIB *typelib, unsigned int full_name); +extern void make_type(char *to,unsigned int nr,TYPELIB *typelib); +extern const char *get_type(TYPELIB *typelib,unsigned int nr); +extern TYPELIB *copy_typelib(MEM_ROOT *root, TYPELIB *from); +extern TYPELIB sql_protocol_typelib; +typedef struct st_mysql_rows { + struct st_mysql_rows *next; + MYSQL_ROW data; + unsigned long length; +} MYSQL_ROWS; +typedef MYSQL_ROWS *MYSQL_ROW_OFFSET; +#include "my_alloc.h" +typedef struct embedded_query_result EMBEDDED_QUERY_RESULT; +typedef struct st_mysql_data { + MYSQL_ROWS *data; + struct embedded_query_result *embedded_info; + MEM_ROOT alloc; + my_ulonglong rows; + unsigned int fields; + void *extension; +} MYSQL_DATA; +enum mysql_option +{ + MYSQL_OPT_CONNECT_TIMEOUT, MYSQL_OPT_COMPRESS, MYSQL_OPT_NAMED_PIPE, + MYSQL_INIT_COMMAND, MYSQL_READ_DEFAULT_FILE, MYSQL_READ_DEFAULT_GROUP, + MYSQL_SET_CHARSET_DIR, MYSQL_SET_CHARSET_NAME, MYSQL_OPT_LOCAL_INFILE, + MYSQL_OPT_PROTOCOL, MYSQL_SHARED_MEMORY_BASE_NAME, MYSQL_OPT_READ_TIMEOUT, + MYSQL_OPT_WRITE_TIMEOUT, MYSQL_OPT_USE_RESULT, + MYSQL_OPT_USE_REMOTE_CONNECTION, MYSQL_OPT_USE_EMBEDDED_CONNECTION, + MYSQL_OPT_GUESS_CONNECTION, MYSQL_SET_CLIENT_IP, MYSQL_SECURE_AUTH, + MYSQL_REPORT_DATA_TRUNCATION, MYSQL_OPT_RECONNECT, + MYSQL_OPT_SSL_VERIFY_SERVER_CERT +}; +struct st_mysql_options { + unsigned int connect_timeout, read_timeout, write_timeout; + unsigned int port, protocol; + unsigned long client_flag; + char *host,*user,*password,*unix_socket,*db; + struct st_dynamic_array *init_commands; + char *my_cnf_file,*my_cnf_group, *charset_dir, *charset_name; + char *ssl_key; + char *ssl_cert; + char *ssl_ca; + char *ssl_capath; + char *ssl_cipher; + char *shared_memory_base_name; + unsigned long max_allowed_packet; + my_bool use_ssl; + my_bool compress,named_pipe; + my_bool unused1; + my_bool unused2; + my_bool unused3; + my_bool unused4; + enum mysql_option methods_to_use; + char *client_ip; + my_bool secure_auth; + my_bool report_data_truncation; + int (*local_infile_init)(void **, const char *, void *); + int (*local_infile_read)(void *, char *, unsigned int); + void (*local_infile_end)(void *); + int (*local_infile_error)(void *, char *, unsigned int); + void *local_infile_userdata; + void *extension; +}; +enum mysql_status +{ + MYSQL_STATUS_READY,MYSQL_STATUS_GET_RESULT,MYSQL_STATUS_USE_RESULT +}; +enum mysql_protocol_type +{ + MYSQL_PROTOCOL_DEFAULT, MYSQL_PROTOCOL_TCP, MYSQL_PROTOCOL_SOCKET, + MYSQL_PROTOCOL_PIPE, MYSQL_PROTOCOL_MEMORY +}; +typedef struct character_set +{ + unsigned int number; + unsigned int state; + const char *csname; + const char *name; + const char *comment; + const char *dir; + unsigned int mbminlen; + unsigned int mbmaxlen; +} MY_CHARSET_INFO; +struct st_mysql_methods; +struct st_mysql_stmt; +typedef struct st_mysql +{ + NET net; + unsigned char *connector_fd; + char *host,*user,*passwd,*unix_socket,*server_version,*host_info; + char *info, *db; + struct charset_info_st *charset; + MYSQL_FIELD *fields; + MEM_ROOT field_alloc; + my_ulonglong affected_rows; + my_ulonglong insert_id; + my_ulonglong extra_info; + unsigned long thread_id; + unsigned long packet_length; + unsigned int port; + unsigned long client_flag,server_capabilities; + unsigned int protocol_version; + unsigned int field_count; + unsigned int server_status; + unsigned int server_language; + unsigned int warning_count; + struct st_mysql_options options; + enum mysql_status status; + my_bool free_me; + my_bool reconnect; + char scramble[20 +1]; + my_bool unused1; + void *unused2, *unused3, *unused4, *unused5; + LIST *stmts; + const struct st_mysql_methods *methods; + void *thd; + my_bool *unbuffered_fetch_owner; + char *info_buffer; + void *extension; +} MYSQL; +typedef struct st_mysql_res { + my_ulonglong row_count; + MYSQL_FIELD *fields; + MYSQL_DATA *data; + MYSQL_ROWS *data_cursor; + unsigned long *lengths; + MYSQL *handle; + const struct st_mysql_methods *methods; + MYSQL_ROW row; + MYSQL_ROW current_row; + MEM_ROOT field_alloc; + unsigned int field_count, current_field; + my_bool eof; + my_bool unbuffered_fetch_cancelled; + void *extension; +} MYSQL_RES; +typedef struct st_mysql_parameters +{ + unsigned long *p_max_allowed_packet; + unsigned long *p_net_buffer_length; + void *extension; +} MYSQL_PARAMETERS; +int mysql_server_init(int argc, char **argv, char **groups); +void mysql_server_end(void); +MYSQL_PARAMETERS * mysql_get_parameters(void); +my_bool mysql_thread_init(void); +void mysql_thread_end(void); +my_ulonglong mysql_num_rows(MYSQL_RES *res); +unsigned int mysql_num_fields(MYSQL_RES *res); +my_bool mysql_eof(MYSQL_RES *res); +MYSQL_FIELD * mysql_fetch_field_direct(MYSQL_RES *res, + unsigned int fieldnr); +MYSQL_FIELD * mysql_fetch_fields(MYSQL_RES *res); +MYSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES *res); +MYSQL_FIELD_OFFSET mysql_field_tell(MYSQL_RES *res); +unsigned int mysql_field_count(MYSQL *mysql); +my_ulonglong mysql_affected_rows(MYSQL *mysql); +my_ulonglong mysql_insert_id(MYSQL *mysql); +unsigned int mysql_errno(MYSQL *mysql); +const char * mysql_error(MYSQL *mysql); +const char * mysql_sqlstate(MYSQL *mysql); +unsigned int mysql_warning_count(MYSQL *mysql); +const char * mysql_info(MYSQL *mysql); +unsigned long mysql_thread_id(MYSQL *mysql); +const char * mysql_character_set_name(MYSQL *mysql); +int mysql_set_character_set(MYSQL *mysql, const char *csname); +MYSQL * mysql_init(MYSQL *mysql); +my_bool mysql_ssl_set(MYSQL *mysql, const char *key, + const char *cert, const char *ca, + const char *capath, const char *cipher); +const char * mysql_get_ssl_cipher(MYSQL *mysql); +my_bool mysql_change_user(MYSQL *mysql, const char *user, + const char *passwd, const char *db); +MYSQL * mysql_real_connect(MYSQL *mysql, const char *host, + const char *user, + const char *passwd, + const char *db, + unsigned int port, + const char *unix_socket, + unsigned long clientflag); +int mysql_select_db(MYSQL *mysql, const char *db); +int mysql_query(MYSQL *mysql, const char *q); +int mysql_send_query(MYSQL *mysql, const char *q, + unsigned long length); +int mysql_real_query(MYSQL *mysql, const char *q, + unsigned long length); +MYSQL_RES * mysql_store_result(MYSQL *mysql); +MYSQL_RES * mysql_use_result(MYSQL *mysql); +void mysql_get_character_set_info(MYSQL *mysql, + MY_CHARSET_INFO *charset); +void +mysql_set_local_infile_handler(MYSQL *mysql, + int (*local_infile_init)(void **, const char *, + void *), + int (*local_infile_read)(void *, char *, + unsigned int), + void (*local_infile_end)(void *), + int (*local_infile_error)(void *, char*, + unsigned int), + void *); +void +mysql_set_local_infile_default(MYSQL *mysql); +int mysql_shutdown(MYSQL *mysql, + enum mysql_enum_shutdown_level + shutdown_level); +int mysql_dump_debug_info(MYSQL *mysql); +int mysql_refresh(MYSQL *mysql, + unsigned int refresh_options); +int mysql_kill(MYSQL *mysql,unsigned long pid); +int mysql_set_server_option(MYSQL *mysql, + enum enum_mysql_set_option + option); +int mysql_ping(MYSQL *mysql); +const char * mysql_stat(MYSQL *mysql); +const char * mysql_get_server_info(MYSQL *mysql); +const char * mysql_get_client_info(void); +unsigned long mysql_get_client_version(void); +const char * mysql_get_host_info(MYSQL *mysql); +unsigned long mysql_get_server_version(MYSQL *mysql); +unsigned int mysql_get_proto_info(MYSQL *mysql); +MYSQL_RES * mysql_list_dbs(MYSQL *mysql,const char *wild); +MYSQL_RES * mysql_list_tables(MYSQL *mysql,const char *wild); +MYSQL_RES * mysql_list_processes(MYSQL *mysql); +int mysql_options(MYSQL *mysql,enum mysql_option option, + const void *arg); +void mysql_free_result(MYSQL_RES *result); +void mysql_data_seek(MYSQL_RES *result, + my_ulonglong offset); +MYSQL_ROW_OFFSET mysql_row_seek(MYSQL_RES *result, + MYSQL_ROW_OFFSET offset); +MYSQL_FIELD_OFFSET mysql_field_seek(MYSQL_RES *result, + MYSQL_FIELD_OFFSET offset); +MYSQL_ROW mysql_fetch_row(MYSQL_RES *result); +unsigned long * mysql_fetch_lengths(MYSQL_RES *result); +MYSQL_FIELD * mysql_fetch_field(MYSQL_RES *result); +MYSQL_RES * mysql_list_fields(MYSQL *mysql, const char *table, + const char *wild); +unsigned long mysql_escape_string(char *to,const char *from, + unsigned long from_length); +unsigned long mysql_hex_string(char *to,const char *from, + unsigned long from_length); +unsigned long mysql_real_escape_string(MYSQL *mysql, + char *to,const char *from, + unsigned long length); +void mysql_debug(const char *debug); +void myodbc_remove_escape(MYSQL *mysql,char *name); +unsigned int mysql_thread_safe(void); +my_bool mysql_embedded(void); +my_bool mysql_read_query_result(MYSQL *mysql); +enum enum_mysql_stmt_state +{ + MYSQL_STMT_INIT_DONE= 1, MYSQL_STMT_PREPARE_DONE, MYSQL_STMT_EXECUTE_DONE, + MYSQL_STMT_FETCH_DONE +}; +typedef struct st_mysql_bind +{ + unsigned long *length; + my_bool *is_null; + void *buffer; + my_bool *error; + unsigned char *row_ptr; + void (*store_param_func)(NET *net, struct st_mysql_bind *param); + void (*fetch_result)(struct st_mysql_bind *, MYSQL_FIELD *, + unsigned char **row); + void (*skip_result)(struct st_mysql_bind *, MYSQL_FIELD *, + unsigned char **row); + unsigned long buffer_length; + unsigned long offset; + unsigned long length_value; + unsigned int param_number; + unsigned int pack_length; + enum enum_field_types buffer_type; + my_bool error_value; + my_bool is_unsigned; + my_bool long_data_used; + my_bool is_null_value; + void *extension; +} MYSQL_BIND; +typedef struct st_mysql_stmt +{ + MEM_ROOT mem_root; + LIST list; + MYSQL *mysql; + MYSQL_BIND *params; + MYSQL_BIND *bind; + MYSQL_FIELD *fields; + MYSQL_DATA result; + MYSQL_ROWS *data_cursor; + int (*read_row_func)(struct st_mysql_stmt *stmt, + unsigned char **row); + my_ulonglong affected_rows; + my_ulonglong insert_id; + unsigned long stmt_id; + unsigned long flags; + unsigned long prefetch_rows; + unsigned int server_status; + unsigned int last_errno; + unsigned int param_count; + unsigned int field_count; + enum enum_mysql_stmt_state state; + char last_error[512]; + char sqlstate[5 +1]; + my_bool send_types_to_server; + my_bool bind_param_done; + unsigned char bind_result_done; + my_bool unbuffered_fetch_cancelled; + my_bool update_max_length; + void *extension; +} MYSQL_STMT; +enum enum_stmt_attr_type +{ + STMT_ATTR_UPDATE_MAX_LENGTH, + STMT_ATTR_CURSOR_TYPE, + STMT_ATTR_PREFETCH_ROWS +}; +typedef struct st_mysql_methods +{ + my_bool (*read_query_result)(MYSQL *mysql); + my_bool (*advanced_command)(MYSQL *mysql, + enum enum_server_command command, + const unsigned char *header, + unsigned long header_length, + const unsigned char *arg, + unsigned long arg_length, + my_bool skip_check, + MYSQL_STMT *stmt); + MYSQL_DATA *(*read_rows)(MYSQL *mysql,MYSQL_FIELD *mysql_fields, + unsigned int fields); + MYSQL_RES * (*use_result)(MYSQL *mysql); + void (*fetch_lengths)(unsigned long *to, + MYSQL_ROW column, unsigned int field_count); + void (*flush_use_result)(MYSQL *mysql, my_bool flush_all_results); + MYSQL_FIELD * (*list_fields)(MYSQL *mysql); + my_bool (*read_prepare_result)(MYSQL *mysql, MYSQL_STMT *stmt); + int (*stmt_execute)(MYSQL_STMT *stmt); + int (*read_binary_rows)(MYSQL_STMT *stmt); + int (*unbuffered_fetch)(MYSQL *mysql, char **row); + void (*free_embedded_thd)(MYSQL *mysql); + const char *(*read_statistics)(MYSQL *mysql); + my_bool (*next_result)(MYSQL *mysql); + int (*read_change_user_result)(MYSQL *mysql, char *buff, const char *passwd); + int (*read_rows_from_cursor)(MYSQL_STMT *stmt); +} MYSQL_METHODS; +MYSQL_STMT * mysql_stmt_init(MYSQL *mysql); +int mysql_stmt_prepare(MYSQL_STMT *stmt, const char *query, + unsigned long length); +int mysql_stmt_execute(MYSQL_STMT *stmt); +int mysql_stmt_fetch(MYSQL_STMT *stmt); +int mysql_stmt_fetch_column(MYSQL_STMT *stmt, MYSQL_BIND *bind_arg, + unsigned int column, + unsigned long offset); +int mysql_stmt_store_result(MYSQL_STMT *stmt); +unsigned long mysql_stmt_param_count(MYSQL_STMT * stmt); +my_bool mysql_stmt_attr_set(MYSQL_STMT *stmt, + enum enum_stmt_attr_type attr_type, + const void *attr); +my_bool mysql_stmt_attr_get(MYSQL_STMT *stmt, + enum enum_stmt_attr_type attr_type, + void *attr); +my_bool mysql_stmt_bind_param(MYSQL_STMT * stmt, MYSQL_BIND * bnd); +my_bool mysql_stmt_bind_result(MYSQL_STMT * stmt, MYSQL_BIND * bnd); +my_bool mysql_stmt_close(MYSQL_STMT * stmt); +my_bool mysql_stmt_reset(MYSQL_STMT * stmt); +my_bool mysql_stmt_free_result(MYSQL_STMT *stmt); +my_bool mysql_stmt_send_long_data(MYSQL_STMT *stmt, + unsigned int param_number, + const char *data, + unsigned long length); +MYSQL_RES * mysql_stmt_result_metadata(MYSQL_STMT *stmt); +MYSQL_RES * mysql_stmt_param_metadata(MYSQL_STMT *stmt); +unsigned int mysql_stmt_errno(MYSQL_STMT * stmt); +const char * mysql_stmt_error(MYSQL_STMT * stmt); +const char * mysql_stmt_sqlstate(MYSQL_STMT * stmt); +MYSQL_ROW_OFFSET mysql_stmt_row_seek(MYSQL_STMT *stmt, + MYSQL_ROW_OFFSET offset); +MYSQL_ROW_OFFSET mysql_stmt_row_tell(MYSQL_STMT *stmt); +void mysql_stmt_data_seek(MYSQL_STMT *stmt, my_ulonglong offset); +my_ulonglong mysql_stmt_num_rows(MYSQL_STMT *stmt); +my_ulonglong mysql_stmt_affected_rows(MYSQL_STMT *stmt); +my_ulonglong mysql_stmt_insert_id(MYSQL_STMT *stmt); +unsigned int mysql_stmt_field_count(MYSQL_STMT *stmt); +my_bool mysql_commit(MYSQL * mysql); +my_bool mysql_rollback(MYSQL * mysql); +my_bool mysql_autocommit(MYSQL * mysql, my_bool auto_mode); +my_bool mysql_more_results(MYSQL *mysql); +int mysql_next_result(MYSQL *mysql); +int mysql_stmt_next_result(MYSQL_STMT *stmt); +void mysql_close(MYSQL *sock); diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/mysql_com.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/mysql_com.h new file mode 100644 index 0000000..8b16fd2 --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/mysql_com.h @@ -0,0 +1,543 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* +** Common definition between mysql server & client +*/ + +#ifndef _mysql_com_h +#define _mysql_com_h + +#define HOSTNAME_LENGTH 60 +#define SYSTEM_CHARSET_MBMAXLEN 4 +#define NAME_CHAR_LEN 64 /* Field/table name length */ +#define USERNAME_CHAR_LENGTH 16 +#define NAME_LEN (NAME_CHAR_LEN*SYSTEM_CHARSET_MBMAXLEN) +#define USERNAME_LENGTH (USERNAME_CHAR_LENGTH*SYSTEM_CHARSET_MBMAXLEN) + +#define SERVER_VERSION_LENGTH 60 +#define SQLSTATE_LENGTH 5 + +/* + Maximum length of comments +*/ +#define TABLE_COMMENT_INLINE_MAXLEN 180 /* pre 6.0: 60 (3-byte) characters */ +#define TABLE_COMMENT_MAXLEN 2048 +#define COLUMN_COMMENT_MAXLEN 1024 +#define INDEX_COMMENT_MAXLEN 1024 + + +/* + USER_HOST_BUFF_SIZE -- length of string buffer, that is enough to contain + username and hostname parts of the user identifier with trailing zero in + MySQL standard format: + user_name_part@host_name_part\0 +*/ +#define USER_HOST_BUFF_SIZE HOSTNAME_LENGTH + USERNAME_LENGTH + 2 + +#define LOCAL_HOST "localhost" +#define LOCAL_HOST_NAMEDPIPE "." + + +#if defined(__WIN__) && !defined( _CUSTOMCONFIG_) +#define MYSQL_NAMEDPIPE "MySQL" +#define MYSQL_SERVICENAME "MySQL" +#endif /* __WIN__ */ + +/* + You should add new commands to the end of this list, otherwise old + servers won't be able to handle them as 'unsupported'. +*/ + +enum enum_server_command +{ + COM_SLEEP, 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, COM_DELAYED_INSERT, COM_CHANGE_USER, COM_BINLOG_DUMP, + COM_TABLE_DUMP, COM_CONNECT_OUT, COM_REGISTER_SLAVE, + COM_STMT_PREPARE, COM_STMT_EXECUTE, COM_STMT_SEND_LONG_DATA, COM_STMT_CLOSE, + COM_STMT_RESET, COM_SET_OPTION, COM_STMT_FETCH, COM_DAEMON, + /* don't forget to update const char *command_name[] in sql_parse.cc */ + + /* Must be last */ + COM_END +}; + + +/* + Length of random string sent by server on handshake; this is also length of + obfuscated password, recieved from client +*/ +#define SCRAMBLE_LENGTH 20 +#define SCRAMBLE_LENGTH_323 8 +/* length of password stored in the db: new passwords are preceeded with '*' */ +#define SCRAMBLED_PASSWORD_CHAR_LENGTH (SCRAMBLE_LENGTH*2+1) +#define SCRAMBLED_PASSWORD_CHAR_LENGTH_323 (SCRAMBLE_LENGTH_323*2) + + +#define NOT_NULL_FLAG 1 /* Field can't be NULL */ +#define PRI_KEY_FLAG 2 /* Field is part of a primary key */ +#define UNIQUE_KEY_FLAG 4 /* Field is part of a unique key */ +#define MULTIPLE_KEY_FLAG 8 /* Field is part of a key */ +#define BLOB_FLAG 16 /* Field is a blob */ +#define UNSIGNED_FLAG 32 /* Field is unsigned */ +#define ZEROFILL_FLAG 64 /* Field is zerofill */ +#define BINARY_FLAG 128 /* Field is binary */ + +/* The following are only sent to new clients */ +#define ENUM_FLAG 256 /* field is an enum */ +#define AUTO_INCREMENT_FLAG 512 /* field is a autoincrement field */ +#define TIMESTAMP_FLAG 1024 /* Field is a timestamp */ +#define SET_FLAG 2048 /* field is a set */ +#define NO_DEFAULT_VALUE_FLAG 4096 /* Field doesn't have default value */ +#define ON_UPDATE_NOW_FLAG 8192 /* Field is set to NOW on UPDATE */ +#define NUM_FLAG 32768 /* Field is num (for clients) */ +#define PART_KEY_FLAG 16384 /* Intern; Part of some key */ +#define GROUP_FLAG 32768 /* Intern: Group field */ +#define UNIQUE_FLAG 65536 /* Intern: Used by sql_yacc */ +#define BINCMP_FLAG 131072 /* Intern: Used by sql_yacc */ +#define GET_FIXED_FIELDS_FLAG (1 << 18) /* Used to get fields in item tree */ +#define FIELD_IN_PART_FUNC_FLAG (1 << 19)/* Field part of partition func */ +#define FIELD_IN_ADD_INDEX (1<< 20) /* Intern: Field used in ADD INDEX */ +#define FIELD_IS_RENAMED (1<< 21) /* Intern: Field is being renamed */ +#define FIELD_STORAGE_FLAGS 22 /* Storage type: bit 22, 23 and 24 */ +#define COLUMN_FORMAT_FLAGS 25 /* Column format: bit 25, 26 and 27 */ + +#define REFRESH_GRANT 1 /* Refresh grant tables */ +#define REFRESH_LOG 2 /* Start on new log file */ +#define REFRESH_TABLES 4 /* close all tables */ +#define REFRESH_HOSTS 8 /* Flush host cache */ +#define REFRESH_STATUS 16 /* Flush status variables */ +#define REFRESH_THREADS 32 /* Flush thread cache */ +#define REFRESH_SLAVE 64 /* Reset master info and restart slave + thread */ +#define REFRESH_MASTER 128 /* Remove all bin logs in the index + and truncate the index */ + +/* The following can't be set with mysql_refresh() */ +#define REFRESH_READ_LOCK 16384 /* Lock tables for read */ +#define REFRESH_FAST 32768 /* Intern flag */ + +/* RESET (remove all queries) from query cache */ +#define REFRESH_QUERY_CACHE 65536 +#define REFRESH_QUERY_CACHE_FREE 0x20000L /* pack query cache */ +#define REFRESH_DES_KEY_FILE 0x40000L +#define REFRESH_USER_RESOURCES 0x80000L +#define REFRESH_BACKUP_LOG 0x200000L + +#define CLIENT_LONG_PASSWORD 1 /* new more secure passwords */ +#define CLIENT_FOUND_ROWS 2 /* Found instead of affected rows */ +#define CLIENT_LONG_FLAG 4 /* Get all column flags */ +#define CLIENT_CONNECT_WITH_DB 8 /* One can specify db on connect */ +#define CLIENT_NO_SCHEMA 16 /* Don't allow database.table.column */ +#define CLIENT_COMPRESS 32 /* Can use compression protocol */ +#define CLIENT_ODBC 64 /* Odbc client */ +#define CLIENT_LOCAL_FILES 128 /* Can use LOAD DATA LOCAL */ +#define CLIENT_IGNORE_SPACE 256 /* Ignore spaces before '(' */ +#define CLIENT_PROTOCOL_41 512 /* New 4.1 protocol */ +#define CLIENT_INTERACTIVE 1024 /* This is an interactive client */ +#define CLIENT_SSL 2048 /* Switch to SSL after handshake */ +#define CLIENT_IGNORE_SIGPIPE 4096 /* IGNORE sigpipes */ +#define CLIENT_TRANSACTIONS 8192 /* Client knows about transactions */ +#define CLIENT_RESERVED 16384 /* Old flag for 4.1 protocol */ +#define CLIENT_SECURE_CONNECTION 32768 /* New 4.1 authentication */ +#define CLIENT_MULTI_STATEMENTS (1UL << 16) /* Enable/disable multi-stmt support */ +#define CLIENT_MULTI_RESULTS (1UL << 17) /* Enable/disable multi-results */ +#define CLIENT_PS_MULTI_RESULTS (1UL << 18) /* Multi-results in PS-protocol */ + +#define CLIENT_SSL_VERIFY_SERVER_CERT (1UL << 30) +#define CLIENT_REMEMBER_OPTIONS (1UL << 31) + +/* Gather all possible capabilites (flags) supported by the server */ +#define CLIENT_ALL_FLAGS (CLIENT_LONG_PASSWORD | \ + CLIENT_FOUND_ROWS | \ + CLIENT_LONG_FLAG | \ + CLIENT_CONNECT_WITH_DB | \ + CLIENT_NO_SCHEMA | \ + CLIENT_COMPRESS | \ + CLIENT_ODBC | \ + CLIENT_LOCAL_FILES | \ + CLIENT_IGNORE_SPACE | \ + CLIENT_PROTOCOL_41 | \ + CLIENT_INTERACTIVE | \ + CLIENT_SSL | \ + CLIENT_IGNORE_SIGPIPE | \ + CLIENT_TRANSACTIONS | \ + CLIENT_RESERVED | \ + CLIENT_SECURE_CONNECTION | \ + CLIENT_MULTI_STATEMENTS | \ + CLIENT_MULTI_RESULTS | \ + CLIENT_PS_MULTI_RESULTS | \ + CLIENT_SSL_VERIFY_SERVER_CERT | \ + CLIENT_REMEMBER_OPTIONS) + +/* + Switch off the flags that are optional and depending on build flags + If any of the optional flags is supported by the build it will be switched + on before sending to the client during the connection handshake. +*/ +#define CLIENT_BASIC_FLAGS (((CLIENT_ALL_FLAGS & ~CLIENT_SSL) \ + & ~CLIENT_COMPRESS) \ + & ~CLIENT_SSL_VERIFY_SERVER_CERT) + +#define SERVER_STATUS_IN_TRANS 1 /* Transaction has started */ +#define SERVER_STATUS_AUTOCOMMIT 2 /* Server in auto_commit mode */ +#define SERVER_MORE_RESULTS_EXISTS 8 /* Multi query - next query exists */ +#define SERVER_QUERY_NO_GOOD_INDEX_USED 16 +#define SERVER_QUERY_NO_INDEX_USED 32 +/** + The server was able to fulfill the clients request and opened a + read-only non-scrollable cursor for a query. This flag comes + in reply to COM_STMT_EXECUTE and COM_STMT_FETCH commands. +*/ +#define SERVER_STATUS_CURSOR_EXISTS 64 +/** + This flag is sent when a read-only cursor is exhausted, in reply to + COM_STMT_FETCH command. +*/ +#define SERVER_STATUS_LAST_ROW_SENT 128 +#define SERVER_STATUS_DB_DROPPED 256 /* A database was dropped */ +#define SERVER_STATUS_NO_BACKSLASH_ESCAPES 512 +/** + Sent to the client if after a prepared statement reprepare + we discovered that the new statement returns a different + number of result set columns. +*/ +#define SERVER_STATUS_METADATA_CHANGED 1024 +/* + Tell clients that this query was logged to the slow query log. + Not yet set in the server, but interface is defined for applications + to use. See WorkLog 4098. +*/ +#define SERVER_QUERY_WAS_SLOW 2048 + +/** + To mark ResultSet containing output parameter values. +*/ +#define SERVER_PS_OUT_PARAMS 4096 + +/** + Server status flags that must be cleared when starting + execution of a new SQL statement. + Flags from this set are only added to the + current server status by the execution engine, but + never removed -- the execution engine expects them + to disappear automagically by the next command. +*/ +#define SERVER_STATUS_CLEAR_SET (SERVER_QUERY_NO_GOOD_INDEX_USED| \ + SERVER_QUERY_NO_INDEX_USED|\ + SERVER_MORE_RESULTS_EXISTS|\ + SERVER_STATUS_METADATA_CHANGED) + +#define MYSQL_ERRMSG_SIZE 512 +#define NET_READ_TIMEOUT 30 /* Timeout on read */ +#define NET_WRITE_TIMEOUT 60 /* Timeout on write */ +#define NET_WAIT_TIMEOUT 8*60*60 /* Wait for new query */ + +#define ONLY_KILL_QUERY 1 + + +struct st_vio; /* Only C */ +typedef struct st_vio Vio; + +#define MAX_TINYINT_WIDTH 3 /* Max width for a TINY w.o. sign */ +#define MAX_SMALLINT_WIDTH 5 /* Max width for a SHORT w.o. sign */ +#define MAX_MEDIUMINT_WIDTH 8 /* Max width for a INT24 w.o. sign */ +#define MAX_INT_WIDTH 10 /* Max width for a LONG w.o. sign */ +#define MAX_BIGINT_WIDTH 20 /* Max width for a LONGLONG */ +#define MAX_CHAR_WIDTH 255 /* Max length for a CHAR colum */ +#define MAX_BLOB_WIDTH 16777216 /* Default width for blob */ + +typedef struct st_net { +#if !defined(CHECK_EMBEDDED_DIFFERENCES) || !defined(EMBEDDED_LIBRARY) + Vio *vio; + unsigned char *buff,*buff_end,*write_pos,*read_pos; + my_socket fd; /* For Perl DBI/dbd */ + /* + The following variable is set if we are doing several queries in one + command ( as in LOAD TABLE ... FROM MASTER ), + and do not want to confuse the client with OK at the wrong time + */ + unsigned long remain_in_buf,length, buf_length, where_b; + unsigned long max_packet,max_packet_size; + unsigned int pkt_nr,compress_pkt_nr; + unsigned int write_timeout, read_timeout, retry_count; + int fcntl; + unsigned int *return_status; + unsigned char reading_or_writing; + char save_char; + my_bool unused1; /* Please remove with the next incompatible ABI change. */ + my_bool unused2; /* Please remove with the next incompatible ABI change */ + my_bool compress; + my_bool unused3; /* Please remove with the next incompatible ABI change. */ + /* + Pointer to query object in query cache, do not equal NULL (0) for + queries in cache that have not stored its results yet + */ +#endif + /* + Unused, please remove with the next incompatible ABI change. + */ + unsigned char *unused; + unsigned int last_errno; + unsigned char error; + my_bool unused4; /* Please remove with the next incompatible ABI change. */ + my_bool unused5; /* Please remove with the next incompatible ABI change. */ + /** Client library error message buffer. Actually belongs to struct MYSQL. */ + char last_error[MYSQL_ERRMSG_SIZE]; + /** Client library sqlstate buffer. Set along with the error message. */ + char sqlstate[SQLSTATE_LENGTH+1]; + void *extension; +} NET; + + +#define packet_error (~(unsigned long) 0) + +enum enum_field_types { MYSQL_TYPE_DECIMAL, MYSQL_TYPE_TINY, + MYSQL_TYPE_SHORT, MYSQL_TYPE_LONG, + MYSQL_TYPE_FLOAT, MYSQL_TYPE_DOUBLE, + MYSQL_TYPE_NULL, MYSQL_TYPE_TIMESTAMP, + MYSQL_TYPE_LONGLONG,MYSQL_TYPE_INT24, + MYSQL_TYPE_DATE, MYSQL_TYPE_TIME, + MYSQL_TYPE_DATETIME, MYSQL_TYPE_YEAR, + MYSQL_TYPE_NEWDATE, MYSQL_TYPE_VARCHAR, + MYSQL_TYPE_BIT, + MYSQL_TYPE_NEWDECIMAL=246, + MYSQL_TYPE_ENUM=247, + MYSQL_TYPE_SET=248, + MYSQL_TYPE_TINY_BLOB=249, + MYSQL_TYPE_MEDIUM_BLOB=250, + MYSQL_TYPE_LONG_BLOB=251, + MYSQL_TYPE_BLOB=252, + MYSQL_TYPE_VAR_STRING=253, + MYSQL_TYPE_STRING=254, + MYSQL_TYPE_GEOMETRY=255, + MAX_NO_FIELD_TYPES /* Should always be last */ +}; + +/* For backward compatibility */ +#define CLIENT_MULTI_QUERIES CLIENT_MULTI_STATEMENTS +#define FIELD_TYPE_DECIMAL MYSQL_TYPE_DECIMAL +#define FIELD_TYPE_NEWDECIMAL MYSQL_TYPE_NEWDECIMAL +#define FIELD_TYPE_TINY MYSQL_TYPE_TINY +#define FIELD_TYPE_SHORT MYSQL_TYPE_SHORT +#define FIELD_TYPE_LONG MYSQL_TYPE_LONG +#define FIELD_TYPE_FLOAT MYSQL_TYPE_FLOAT +#define FIELD_TYPE_DOUBLE MYSQL_TYPE_DOUBLE +#define FIELD_TYPE_NULL MYSQL_TYPE_NULL +#define FIELD_TYPE_TIMESTAMP MYSQL_TYPE_TIMESTAMP +#define FIELD_TYPE_LONGLONG MYSQL_TYPE_LONGLONG +#define FIELD_TYPE_INT24 MYSQL_TYPE_INT24 +#define FIELD_TYPE_DATE MYSQL_TYPE_DATE +#define FIELD_TYPE_TIME MYSQL_TYPE_TIME +#define FIELD_TYPE_DATETIME MYSQL_TYPE_DATETIME +#define FIELD_TYPE_YEAR MYSQL_TYPE_YEAR +#define FIELD_TYPE_NEWDATE MYSQL_TYPE_NEWDATE +#define FIELD_TYPE_ENUM MYSQL_TYPE_ENUM +#define FIELD_TYPE_SET MYSQL_TYPE_SET +#define FIELD_TYPE_TINY_BLOB MYSQL_TYPE_TINY_BLOB +#define FIELD_TYPE_MEDIUM_BLOB MYSQL_TYPE_MEDIUM_BLOB +#define FIELD_TYPE_LONG_BLOB MYSQL_TYPE_LONG_BLOB +#define FIELD_TYPE_BLOB MYSQL_TYPE_BLOB +#define FIELD_TYPE_VAR_STRING MYSQL_TYPE_VAR_STRING +#define FIELD_TYPE_STRING MYSQL_TYPE_STRING +#define FIELD_TYPE_CHAR MYSQL_TYPE_TINY +#define FIELD_TYPE_INTERVAL MYSQL_TYPE_ENUM +#define FIELD_TYPE_GEOMETRY MYSQL_TYPE_GEOMETRY +#define FIELD_TYPE_BIT MYSQL_TYPE_BIT + + +/* Shutdown/kill enums and constants */ + +/* Bits for THD::killable. */ +#define MYSQL_SHUTDOWN_KILLABLE_CONNECT (unsigned char)(1 << 0) +#define MYSQL_SHUTDOWN_KILLABLE_TRANS (unsigned char)(1 << 1) +#define MYSQL_SHUTDOWN_KILLABLE_LOCK_TABLE (unsigned char)(1 << 2) +#define MYSQL_SHUTDOWN_KILLABLE_UPDATE (unsigned char)(1 << 3) + +enum mysql_enum_shutdown_level { + /* + We want levels to be in growing order of hardness (because we use number + comparisons). Note that DEFAULT does not respect the growing property, but + it's ok. + */ + SHUTDOWN_DEFAULT = 0, + /* wait for existing connections to finish */ + SHUTDOWN_WAIT_CONNECTIONS= MYSQL_SHUTDOWN_KILLABLE_CONNECT, + /* wait for existing trans to finish */ + SHUTDOWN_WAIT_TRANSACTIONS= MYSQL_SHUTDOWN_KILLABLE_TRANS, + /* wait for existing updates to finish (=> no partial MyISAM update) */ + SHUTDOWN_WAIT_UPDATES= MYSQL_SHUTDOWN_KILLABLE_UPDATE, + /* flush InnoDB buffers and other storage engines' buffers*/ + SHUTDOWN_WAIT_ALL_BUFFERS= (MYSQL_SHUTDOWN_KILLABLE_UPDATE << 1), + /* don't flush InnoDB buffers, flush other storage engines' buffers*/ + SHUTDOWN_WAIT_CRITICAL_BUFFERS= (MYSQL_SHUTDOWN_KILLABLE_UPDATE << 1) + 1, + /* Now the 2 levels of the KILL command */ +#if MYSQL_VERSION_ID >= 50000 + KILL_QUERY= 254, +#endif + KILL_CONNECTION= 255 +}; + + +enum enum_cursor_type +{ + CURSOR_TYPE_NO_CURSOR= 0, + CURSOR_TYPE_READ_ONLY= 1, + CURSOR_TYPE_FOR_UPDATE= 2, + CURSOR_TYPE_SCROLLABLE= 4 +}; + + +/* options for mysql_set_option */ +enum enum_mysql_set_option +{ + MYSQL_OPTION_MULTI_STATEMENTS_ON, + MYSQL_OPTION_MULTI_STATEMENTS_OFF +}; + +#define net_new_transaction(net) ((net)->pkt_nr=0) + +#ifdef __cplusplus +extern "C" { +#endif + +my_bool my_net_init(NET *net, Vio* vio); +void my_net_local_init(NET *net); +void net_end(NET *net); + void net_clear(NET *net, my_bool clear_buffer); +my_bool net_realloc(NET *net, size_t length); +my_bool net_flush(NET *net); +my_bool my_net_write(NET *net,const unsigned char *packet, size_t len); +my_bool net_write_command(NET *net,unsigned char command, + const unsigned char *header, size_t head_len, + const unsigned char *packet, size_t len); +int net_real_write(NET *net,const unsigned char *packet, size_t len); +unsigned long my_net_read(NET *net); + +#ifdef _global_h +void my_net_set_write_timeout(NET *net, uint timeout); +void my_net_set_read_timeout(NET *net, uint timeout); +#endif + +struct sockaddr; +int my_connect(my_socket s, const struct sockaddr *name, unsigned int namelen, + unsigned int timeout); +struct my_rnd_struct; + +#ifdef __cplusplus +} +#endif + + /* The following is for user defined functions */ + +enum Item_result +{ + STRING_RESULT=0, REAL_RESULT, INT_RESULT, ROW_RESULT, DECIMAL_RESULT +#ifdef MYSQL_SERVER + ,IMPOSSIBLE_RESULT /* Yes, we know this is ugly, don't tell us */ + ,MAX_NO_ITEM_RESULTS = IMPOSSIBLE_RESULT /* Should always be last */ +#endif +}; + +typedef struct st_udf_args +{ + unsigned int arg_count; /* Number of arguments */ + enum Item_result *arg_type; /* Pointer to item_results */ + char **args; /* Pointer to argument */ + unsigned long *lengths; /* Length of string arguments */ + char *maybe_null; /* Set to 1 for all maybe_null args */ + char **attributes; /* Pointer to attribute name */ + unsigned long *attribute_lengths; /* Length of attribute arguments */ + void *extension; +} UDF_ARGS; + + /* This holds information about the result */ + +typedef struct st_udf_init +{ + my_bool maybe_null; /* 1 if function can return NULL */ + unsigned int decimals; /* for real functions */ + unsigned long max_length; /* For string functions */ + char *ptr; /* free pointer for function data */ + my_bool const_item; /* 1 if function always returns the same value */ + void *extension; +} UDF_INIT; +/* + TODO: add a notion for determinism of the UDF. + See Item_udf_func::update_used_tables () +*/ + + /* Constants when using compression */ +#define NET_HEADER_SIZE 4 /* standard header size */ +#define COMP_HEADER_SIZE 3 /* compression header extra size */ + + /* Prototypes to password functions */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + These functions are used for authentication by client and server and + implemented in sql/password.c +*/ + +void create_random_string(char *to, unsigned int length, + struct my_rnd_struct *rand_st); + +void hash_password(unsigned long *to, const char *password, unsigned int password_len); +void make_scrambled_password_323(char *to, const char *password); +void scramble_323(char *to, const char *message, const char *password); +my_bool check_scramble_323(const char *, const char *message, + unsigned long *salt); +void get_salt_from_password_323(unsigned long *res, const char *password); +void make_password_from_salt_323(char *to, const unsigned long *salt); + +void make_scrambled_password(char *to, const char *password); +void scramble(char *to, const char *message, const char *password); +my_bool check_scramble(const char *reply, const char *message, + const unsigned char *hash_stage2); +void get_salt_from_password(unsigned char *res, const char *password); +void make_password_from_salt(char *to, const unsigned char *hash_stage2); +char *octet2hex(char *to, const char *str, unsigned int len); + +/* end of password.c */ + +char *get_tty_password(const char *opt_message); +const char *mysql_errno_to_sqlstate(unsigned int mysql_errno); + +/* Some other useful functions */ + +my_bool my_thread_init(void); +void my_thread_end(void); + +#ifdef _global_h +ulong STDCALL net_field_length(uchar **packet); +my_ulonglong net_field_length_ll(uchar **packet); +uchar *net_store_length(uchar *pkg, ulonglong length); +#endif + +#ifdef __cplusplus +} +#endif + +#define NULL_LENGTH ((unsigned long) ~0) /* For net_store_length */ +#define MYSQL_STMT_HEADER 4 +#define MYSQL_LONG_DATA_HEADER 6 + +#define NOT_FIXED_DEC 31 +#endif diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/mysql_time.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/mysql_time.h new file mode 100644 index 0000000..0a3f17a --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/mysql_time.h @@ -0,0 +1,55 @@ +/* Copyright (C) 2004 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef _mysql_time_h_ +#define _mysql_time_h_ + +/* + Time declarations shared between the server and client API: + you should not add anything to this header unless it's used + (and hence should be visible) in mysql.h. + If you're looking for a place to add new time-related declaration, + it's most likely my_time.h. See also "C API Handling of Date + and Time Values" chapter in documentation. +*/ + +enum enum_mysql_timestamp_type +{ + MYSQL_TIMESTAMP_NONE= -2, MYSQL_TIMESTAMP_ERROR= -1, + MYSQL_TIMESTAMP_DATE= 0, MYSQL_TIMESTAMP_DATETIME= 1, MYSQL_TIMESTAMP_TIME= 2 +}; + + +/* + Structure which is used to represent datetime values inside MySQL. + + We assume that values in this structure are normalized, i.e. year <= 9999, + month <= 12, day <= 31, hour <= 23, hour <= 59, hour <= 59. Many functions + in server such as my_system_gmt_sec() or make_time() family of functions + rely on this (actually now usage of make_*() family relies on a bit weaker + restriction). Also functions that produce MYSQL_TIME as result ensure this. + There is one exception to this rule though if this structure holds time + value (time_type == MYSQL_TIMESTAMP_TIME) days and hour member can hold + bigger values. +*/ +typedef struct st_mysql_time +{ + unsigned int year, month, day, hour, minute, second; + unsigned long second_part; + my_bool neg; + enum enum_mysql_timestamp_type time_type; +} MYSQL_TIME; + +#endif /* _mysql_time_h_ */ diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/mysql_version.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/mysql_version.h new file mode 100644 index 0000000..3f052b8 --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/mysql_version.h @@ -0,0 +1,26 @@ +/* Copyright Abandoned 1996, 1999, 2001 MySQL AB + This file is public domain and comes with NO WARRANTY of any kind */ + +/* Version numbers for protocol & mysqld */ + +#ifndef _mysql_version_h +#define _mysql_version_h + +#ifdef _CUSTOMCONFIG_ +# include +#else +# define PROTOCOL_VERSION 10 +# define MYSQL_SERVER_VERSION "6.0.0" +# define MYSQL_VERSION_ID 60000 +# define MYSQL_PORT 3306 +# define MYSQL_PORT_DEFAULT 0 +# define MYSQL_UNIX_ADDR "/tmp/mysql.sock" +# define MYSQL_CONFIG_NAME "my" +# define MYSQL_COMPILATION_COMMENT "Source distribution" +#endif /* _CUSTOMCONFIG_ */ + +#ifndef LICENSE +# define LICENSE GPL +#endif /* LICENSE */ + +#endif /* _mysql_version_h */ diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/mysql_version.h.in b/hdssd/external/win/mysql-connector-c-6.0.2/include/mysql_version.h.in new file mode 100644 index 0000000..a707c67 --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/mysql_version.h.in @@ -0,0 +1,26 @@ +/* Copyright Abandoned 1996, 1999, 2001 MySQL AB + This file is public domain and comes with NO WARRANTY of any kind */ + +/* Version numbers for protocol & mysqld */ + +#ifndef _mysql_version_h +#define _mysql_version_h + +#ifdef _CUSTOMCONFIG_ +# include +#else +# define PROTOCOL_VERSION @PROTOCOL_VERSION@ +# define MYSQL_SERVER_VERSION "@MYSQL_SERVER_VERSION@" +# define MYSQL_VERSION_ID @MYSQL_VERSION_ID@ +# define MYSQL_PORT @MYSQL_TCP_PORT@ +# define MYSQL_PORT_DEFAULT @MYSQL_TCP_PORT_DEFAULT@ +# define MYSQL_UNIX_ADDR "@MYSQL_UNIX_ADDR@" +# define MYSQL_CONFIG_NAME "my" +# define MYSQL_COMPILATION_COMMENT "@COMPILATION_COMMENT@" +#endif /* _CUSTOMCONFIG_ */ + +#ifndef LICENSE +# define LICENSE GPL +#endif /* LICENSE */ + +#endif /* _mysql_version_h */ diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/mysqld_error.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/mysqld_error.h new file mode 100644 index 0000000..653e583 --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/mysqld_error.h @@ -0,0 +1,730 @@ +/* Autogenerated file, please don't edit */ + +#define ER_ERROR_FIRST 1000 +#define ER_HASHCHK 1000 +#define ER_NISAMCHK 1001 +#define ER_NO 1002 +#define ER_YES 1003 +#define ER_CANT_CREATE_FILE 1004 +#define ER_CANT_CREATE_TABLE 1005 +#define ER_CANT_CREATE_DB 1006 +#define ER_DB_CREATE_EXISTS 1007 +#define ER_DB_DROP_EXISTS 1008 +#define ER_DB_DROP_DELETE 1009 +#define ER_DB_DROP_RMDIR 1010 +#define ER_CANT_DELETE_FILE 1011 +#define ER_CANT_FIND_SYSTEM_REC 1012 +#define ER_CANT_GET_STAT 1013 +#define ER_CANT_GET_WD 1014 +#define ER_CANT_LOCK 1015 +#define ER_CANT_OPEN_FILE 1016 +#define ER_FILE_NOT_FOUND 1017 +#define ER_CANT_READ_DIR 1018 +#define ER_CANT_SET_WD 1019 +#define ER_CHECKREAD 1020 +#define ER_DISK_FULL 1021 +#define ER_DUP_KEY 1022 +#define ER_ERROR_ON_CLOSE 1023 +#define ER_ERROR_ON_READ 1024 +#define ER_ERROR_ON_RENAME 1025 +#define ER_ERROR_ON_WRITE 1026 +#define ER_FILE_USED 1027 +#define ER_FILSORT_ABORT 1028 +#define ER_FORM_NOT_FOUND 1029 +#define ER_GET_ERRNO 1030 +#define ER_ILLEGAL_HA 1031 +#define ER_KEY_NOT_FOUND 1032 +#define ER_NOT_FORM_FILE 1033 +#define ER_NOT_KEYFILE 1034 +#define ER_OLD_KEYFILE 1035 +#define ER_OPEN_AS_READONLY 1036 +#define ER_OUTOFMEMORY 1037 +#define ER_OUT_OF_SORTMEMORY 1038 +#define ER_UNEXPECTED_EOF 1039 +#define ER_CON_COUNT_ERROR 1040 +#define ER_OUT_OF_RESOURCES 1041 +#define ER_BAD_HOST_ERROR 1042 +#define ER_HANDSHAKE_ERROR 1043 +#define ER_DBACCESS_DENIED_ERROR 1044 +#define ER_ACCESS_DENIED_ERROR 1045 +#define ER_NO_DB_ERROR 1046 +#define ER_UNKNOWN_COM_ERROR 1047 +#define ER_BAD_NULL_ERROR 1048 +#define ER_BAD_DB_ERROR 1049 +#define ER_TABLE_EXISTS_ERROR 1050 +#define ER_BAD_TABLE_ERROR 1051 +#define ER_NON_UNIQ_ERROR 1052 +#define ER_SERVER_SHUTDOWN 1053 +#define ER_BAD_FIELD_ERROR 1054 +#define ER_WRONG_FIELD_WITH_GROUP 1055 +#define ER_WRONG_GROUP_FIELD 1056 +#define ER_WRONG_SUM_SELECT 1057 +#define ER_WRONG_VALUE_COUNT 1058 +#define ER_TOO_LONG_IDENT 1059 +#define ER_DUP_FIELDNAME 1060 +#define ER_DUP_KEYNAME 1061 +#define ER_DUP_ENTRY 1062 +#define ER_WRONG_FIELD_SPEC 1063 +#define ER_PARSE_ERROR 1064 +#define ER_EMPTY_QUERY 1065 +#define ER_NONUNIQ_TABLE 1066 +#define ER_INVALID_DEFAULT 1067 +#define ER_MULTIPLE_PRI_KEY 1068 +#define ER_TOO_MANY_KEYS 1069 +#define ER_TOO_MANY_KEY_PARTS 1070 +#define ER_TOO_LONG_KEY 1071 +#define ER_KEY_COLUMN_DOES_NOT_EXITS 1072 +#define ER_BLOB_USED_AS_KEY 1073 +#define ER_TOO_BIG_FIELDLENGTH 1074 +#define ER_WRONG_AUTO_KEY 1075 +#define ER_READY 1076 +#define ER_NORMAL_SHUTDOWN 1077 +#define ER_GOT_SIGNAL 1078 +#define ER_SHUTDOWN_COMPLETE 1079 +#define ER_FORCING_CLOSE 1080 +#define ER_IPSOCK_ERROR 1081 +#define ER_NO_SUCH_INDEX 1082 +#define ER_WRONG_FIELD_TERMINATORS 1083 +#define ER_BLOBS_AND_NO_TERMINATED 1084 +#define ER_TEXTFILE_NOT_READABLE 1085 +#define ER_FILE_EXISTS_ERROR 1086 +#define ER_LOAD_INFO 1087 +#define ER_ALTER_INFO 1088 +#define ER_WRONG_SUB_KEY 1089 +#define ER_CANT_REMOVE_ALL_FIELDS 1090 +#define ER_CANT_DROP_FIELD_OR_KEY 1091 +#define ER_INSERT_INFO 1092 +#define ER_UPDATE_TABLE_USED 1093 +#define ER_NO_SUCH_THREAD 1094 +#define ER_KILL_DENIED_ERROR 1095 +#define ER_NO_TABLES_USED 1096 +#define ER_TOO_BIG_SET 1097 +#define ER_NO_UNIQUE_LOGFILE 1098 +#define ER_TABLE_NOT_LOCKED_FOR_WRITE 1099 +#define ER_TABLE_NOT_LOCKED 1100 +#define ER_BLOB_CANT_HAVE_DEFAULT 1101 +#define ER_WRONG_DB_NAME 1102 +#define ER_WRONG_TABLE_NAME 1103 +#define ER_TOO_BIG_SELECT 1104 +#define ER_UNKNOWN_ERROR 1105 +#define ER_UNKNOWN_PROCEDURE 1106 +#define ER_WRONG_PARAMCOUNT_TO_PROCEDURE 1107 +#define ER_WRONG_PARAMETERS_TO_PROCEDURE 1108 +#define ER_UNKNOWN_TABLE 1109 +#define ER_FIELD_SPECIFIED_TWICE 1110 +#define ER_INVALID_GROUP_FUNC_USE 1111 +#define ER_UNSUPPORTED_EXTENSION 1112 +#define ER_TABLE_MUST_HAVE_COLUMNS 1113 +#define ER_RECORD_FILE_FULL 1114 +#define ER_UNKNOWN_CHARACTER_SET 1115 +#define ER_TOO_MANY_TABLES 1116 +#define ER_TOO_MANY_FIELDS 1117 +#define ER_TOO_BIG_ROWSIZE 1118 +#define ER_STACK_OVERRUN 1119 +#define ER_WRONG_OUTER_JOIN 1120 +#define ER_NULL_COLUMN_IN_INDEX 1121 +#define ER_CANT_FIND_UDF 1122 +#define ER_CANT_INITIALIZE_UDF 1123 +#define ER_UDF_NO_PATHS 1124 +#define ER_UDF_EXISTS 1125 +#define ER_CANT_OPEN_LIBRARY 1126 +#define ER_CANT_FIND_DL_ENTRY 1127 +#define ER_FUNCTION_NOT_DEFINED 1128 +#define ER_HOST_IS_BLOCKED 1129 +#define ER_HOST_NOT_PRIVILEGED 1130 +#define ER_PASSWORD_ANONYMOUS_USER 1131 +#define ER_PASSWORD_NOT_ALLOWED 1132 +#define ER_PASSWORD_NO_MATCH 1133 +#define ER_UPDATE_INFO 1134 +#define ER_CANT_CREATE_THREAD 1135 +#define ER_WRONG_VALUE_COUNT_ON_ROW 1136 +#define ER_CANT_REOPEN_TABLE 1137 +#define ER_INVALID_USE_OF_NULL 1138 +#define ER_REGEXP_ERROR 1139 +#define ER_MIX_OF_GROUP_FUNC_AND_FIELDS 1140 +#define ER_NONEXISTING_GRANT 1141 +#define ER_TABLEACCESS_DENIED_ERROR 1142 +#define ER_COLUMNACCESS_DENIED_ERROR 1143 +#define ER_ILLEGAL_GRANT_FOR_TABLE 1144 +#define ER_GRANT_WRONG_HOST_OR_USER 1145 +#define ER_NO_SUCH_TABLE 1146 +#define ER_NONEXISTING_TABLE_GRANT 1147 +#define ER_NOT_ALLOWED_COMMAND 1148 +#define ER_SYNTAX_ERROR 1149 +#define ER_DELAYED_CANT_CHANGE_LOCK 1150 +#define ER_TOO_MANY_DELAYED_THREADS 1151 +#define ER_ABORTING_CONNECTION 1152 +#define ER_NET_PACKET_TOO_LARGE 1153 +#define ER_NET_READ_ERROR_FROM_PIPE 1154 +#define ER_NET_FCNTL_ERROR 1155 +#define ER_NET_PACKETS_OUT_OF_ORDER 1156 +#define ER_NET_UNCOMPRESS_ERROR 1157 +#define ER_NET_READ_ERROR 1158 +#define ER_NET_READ_INTERRUPTED 1159 +#define ER_NET_ERROR_ON_WRITE 1160 +#define ER_NET_WRITE_INTERRUPTED 1161 +#define ER_TOO_LONG_STRING 1162 +#define ER_TABLE_CANT_HANDLE_BLOB 1163 +#define ER_TABLE_CANT_HANDLE_AUTO_INCREMENT 1164 +#define ER_DELAYED_INSERT_TABLE_LOCKED 1165 +#define ER_WRONG_COLUMN_NAME 1166 +#define ER_WRONG_KEY_COLUMN 1167 +#define ER_WRONG_MRG_TABLE 1168 +#define ER_DUP_UNIQUE 1169 +#define ER_BLOB_KEY_WITHOUT_LENGTH 1170 +#define ER_PRIMARY_CANT_HAVE_NULL 1171 +#define ER_TOO_MANY_ROWS 1172 +#define ER_REQUIRES_PRIMARY_KEY 1173 +#define ER_NO_RAID_COMPILED 1174 +#define ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE 1175 +#define ER_KEY_DOES_NOT_EXITS 1176 +#define ER_CHECK_NO_SUCH_TABLE 1177 +#define ER_CHECK_NOT_IMPLEMENTED 1178 +#define ER_CANT_DO_THIS_DURING_AN_TRANSACTION 1179 +#define ER_ERROR_DURING_COMMIT 1180 +#define ER_ERROR_DURING_ROLLBACK 1181 +#define ER_ERROR_DURING_FLUSH_LOGS 1182 +#define ER_ERROR_DURING_CHECKPOINT 1183 +#define ER_NEW_ABORTING_CONNECTION 1184 +#define ER_DUMP_NOT_IMPLEMENTED 1185 +#define ER_FLUSH_MASTER_BINLOG_CLOSED 1186 +#define ER_INDEX_REBUILD 1187 +#define ER_MASTER 1188 +#define ER_MASTER_NET_READ 1189 +#define ER_MASTER_NET_WRITE 1190 +#define ER_FT_MATCHING_KEY_NOT_FOUND 1191 +#define ER_LOCK_OR_ACTIVE_TRANSACTION 1192 +#define ER_UNKNOWN_SYSTEM_VARIABLE 1193 +#define ER_CRASHED_ON_USAGE 1194 +#define ER_CRASHED_ON_REPAIR 1195 +#define ER_WARNING_NOT_COMPLETE_ROLLBACK 1196 +#define ER_TRANS_CACHE_FULL 1197 +#define ER_SLAVE_MUST_STOP 1198 +#define ER_SLAVE_NOT_RUNNING 1199 +#define ER_BAD_SLAVE 1200 +#define ER_MASTER_INFO 1201 +#define ER_SLAVE_THREAD 1202 +#define ER_TOO_MANY_USER_CONNECTIONS 1203 +#define ER_SET_CONSTANTS_ONLY 1204 +#define ER_LOCK_WAIT_TIMEOUT 1205 +#define ER_LOCK_TABLE_FULL 1206 +#define ER_READ_ONLY_TRANSACTION 1207 +#define ER_DROP_DB_WITH_READ_LOCK 1208 +#define ER_CREATE_DB_WITH_READ_LOCK 1209 +#define ER_WRONG_ARGUMENTS 1210 +#define ER_NO_PERMISSION_TO_CREATE_USER 1211 +#define ER_UNION_TABLES_IN_DIFFERENT_DIR 1212 +#define ER_LOCK_DEADLOCK 1213 +#define ER_TABLE_CANT_HANDLE_FT 1214 +#define ER_CANNOT_ADD_FOREIGN 1215 +#define ER_NO_REFERENCED_ROW 1216 +#define ER_ROW_IS_REFERENCED 1217 +#define ER_CONNECT_TO_MASTER 1218 +#define ER_QUERY_ON_MASTER 1219 +#define ER_ERROR_WHEN_EXECUTING_COMMAND 1220 +#define ER_WRONG_USAGE 1221 +#define ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT 1222 +#define ER_CANT_UPDATE_WITH_READLOCK 1223 +#define ER_MIXING_NOT_ALLOWED 1224 +#define ER_DUP_ARGUMENT 1225 +#define ER_USER_LIMIT_REACHED 1226 +#define ER_SPECIFIC_ACCESS_DENIED_ERROR 1227 +#define ER_LOCAL_VARIABLE 1228 +#define ER_GLOBAL_VARIABLE 1229 +#define ER_NO_DEFAULT 1230 +#define ER_WRONG_VALUE_FOR_VAR 1231 +#define ER_WRONG_TYPE_FOR_VAR 1232 +#define ER_VAR_CANT_BE_READ 1233 +#define ER_CANT_USE_OPTION_HERE 1234 +#define ER_NOT_SUPPORTED_YET 1235 +#define ER_MASTER_FATAL_ERROR_READING_BINLOG 1236 +#define ER_SLAVE_IGNORED_TABLE 1237 +#define ER_INCORRECT_GLOBAL_LOCAL_VAR 1238 +#define ER_WRONG_FK_DEF 1239 +#define ER_KEY_REF_DO_NOT_MATCH_TABLE_REF 1240 +#define ER_OPERAND_COLUMNS 1241 +#define ER_SUBQUERY_NO_1_ROW 1242 +#define ER_UNKNOWN_STMT_HANDLER 1243 +#define ER_CORRUPT_HELP_DB 1244 +#define ER_CYCLIC_REFERENCE 1245 +#define ER_AUTO_CONVERT 1246 +#define ER_ILLEGAL_REFERENCE 1247 +#define ER_DERIVED_MUST_HAVE_ALIAS 1248 +#define ER_SELECT_REDUCED 1249 +#define ER_TABLENAME_NOT_ALLOWED_HERE 1250 +#define ER_NOT_SUPPORTED_AUTH_MODE 1251 +#define ER_SPATIAL_CANT_HAVE_NULL 1252 +#define ER_COLLATION_CHARSET_MISMATCH 1253 +#define ER_SLAVE_WAS_RUNNING 1254 +#define ER_SLAVE_WAS_NOT_RUNNING 1255 +#define ER_TOO_BIG_FOR_UNCOMPRESS 1256 +#define ER_ZLIB_Z_MEM_ERROR 1257 +#define ER_ZLIB_Z_BUF_ERROR 1258 +#define ER_ZLIB_Z_DATA_ERROR 1259 +#define ER_CUT_VALUE_GROUP_CONCAT 1260 +#define ER_WARN_TOO_FEW_RECORDS 1261 +#define ER_WARN_TOO_MANY_RECORDS 1262 +#define ER_WARN_NULL_TO_NOTNULL 1263 +#define ER_WARN_DATA_OUT_OF_RANGE 1264 +#define WARN_DATA_TRUNCATED 1265 +#define ER_WARN_USING_OTHER_HANDLER 1266 +#define ER_CANT_AGGREGATE_2COLLATIONS 1267 +#define ER_DROP_USER 1268 +#define ER_REVOKE_GRANTS 1269 +#define ER_CANT_AGGREGATE_3COLLATIONS 1270 +#define ER_CANT_AGGREGATE_NCOLLATIONS 1271 +#define ER_VARIABLE_IS_NOT_STRUCT 1272 +#define ER_UNKNOWN_COLLATION 1273 +#define ER_SLAVE_IGNORED_SSL_PARAMS 1274 +#define ER_SERVER_IS_IN_SECURE_AUTH_MODE 1275 +#define ER_WARN_FIELD_RESOLVED 1276 +#define ER_BAD_SLAVE_UNTIL_COND 1277 +#define ER_MISSING_SKIP_SLAVE 1278 +#define ER_UNTIL_COND_IGNORED 1279 +#define ER_WRONG_NAME_FOR_INDEX 1280 +#define ER_WRONG_NAME_FOR_CATALOG 1281 +#define ER_WARN_QC_RESIZE 1282 +#define ER_BAD_FT_COLUMN 1283 +#define ER_UNKNOWN_KEY_CACHE 1284 +#define ER_WARN_HOSTNAME_WONT_WORK 1285 +#define ER_UNKNOWN_STORAGE_ENGINE 1286 +#define ER_WARN_DEPRECATED_SYNTAX 1287 +#define ER_NON_UPDATABLE_TABLE 1288 +#define ER_FEATURE_DISABLED 1289 +#define ER_OPTION_PREVENTS_STATEMENT 1290 +#define ER_DUPLICATED_VALUE_IN_TYPE 1291 +#define ER_TRUNCATED_WRONG_VALUE 1292 +#define ER_TOO_MUCH_AUTO_TIMESTAMP_COLS 1293 +#define ER_INVALID_ON_UPDATE 1294 +#define ER_UNSUPPORTED_PS 1295 +#define ER_GET_ERRMSG 1296 +#define ER_GET_TEMPORARY_ERRMSG 1297 +#define ER_UNKNOWN_TIME_ZONE 1298 +#define ER_WARN_INVALID_TIMESTAMP 1299 +#define ER_INVALID_CHARACTER_STRING 1300 +#define ER_WARN_ALLOWED_PACKET_OVERFLOWED 1301 +#define ER_CONFLICTING_DECLARATIONS 1302 +#define ER_SP_NO_RECURSIVE_CREATE 1303 +#define ER_SP_ALREADY_EXISTS 1304 +#define ER_SP_DOES_NOT_EXIST 1305 +#define ER_SP_DROP_FAILED 1306 +#define ER_SP_STORE_FAILED 1307 +#define ER_SP_LILABEL_MISMATCH 1308 +#define ER_SP_LABEL_REDEFINE 1309 +#define ER_SP_LABEL_MISMATCH 1310 +#define ER_SP_UNINIT_VAR 1311 +#define ER_SP_BADSELECT 1312 +#define ER_SP_BADRETURN 1313 +#define ER_SP_BADSTATEMENT 1314 +#define ER_UPDATE_LOG_DEPRECATED_IGNORED 1315 +#define ER_UPDATE_LOG_DEPRECATED_TRANSLATED 1316 +#define ER_QUERY_INTERRUPTED 1317 +#define ER_SP_WRONG_NO_OF_ARGS 1318 +#define ER_SP_COND_MISMATCH 1319 +#define ER_SP_NORETURN 1320 +#define ER_SP_NORETURNEND 1321 +#define ER_SP_BAD_CURSOR_QUERY 1322 +#define ER_SP_BAD_CURSOR_SELECT 1323 +#define ER_SP_CURSOR_MISMATCH 1324 +#define ER_SP_CURSOR_ALREADY_OPEN 1325 +#define ER_SP_CURSOR_NOT_OPEN 1326 +#define ER_SP_UNDECLARED_VAR 1327 +#define ER_SP_WRONG_NO_OF_FETCH_ARGS 1328 +#define ER_SP_FETCH_NO_DATA 1329 +#define ER_SP_DUP_PARAM 1330 +#define ER_SP_DUP_VAR 1331 +#define ER_SP_DUP_COND 1332 +#define ER_SP_DUP_CURS 1333 +#define ER_SP_CANT_ALTER 1334 +#define ER_SP_SUBSELECT_NYI 1335 +#define ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG 1336 +#define ER_SP_VARCOND_AFTER_CURSHNDLR 1337 +#define ER_SP_CURSOR_AFTER_HANDLER 1338 +#define ER_SP_CASE_NOT_FOUND 1339 +#define ER_FPARSER_TOO_BIG_FILE 1340 +#define ER_FPARSER_BAD_HEADER 1341 +#define ER_FPARSER_EOF_IN_COMMENT 1342 +#define ER_FPARSER_ERROR_IN_PARAMETER 1343 +#define ER_FPARSER_EOF_IN_UNKNOWN_PARAMETER 1344 +#define ER_VIEW_NO_EXPLAIN 1345 +#define ER_FRM_UNKNOWN_TYPE 1346 +#define ER_WRONG_OBJECT 1347 +#define ER_NONUPDATEABLE_COLUMN 1348 +#define ER_VIEW_SELECT_DERIVED 1349 +#define ER_VIEW_SELECT_CLAUSE 1350 +#define ER_VIEW_SELECT_VARIABLE 1351 +#define ER_VIEW_SELECT_TMPTABLE 1352 +#define ER_VIEW_WRONG_LIST 1353 +#define ER_WARN_VIEW_MERGE 1354 +#define ER_WARN_VIEW_WITHOUT_KEY 1355 +#define ER_VIEW_INVALID 1356 +#define ER_SP_NO_DROP_SP 1357 +#define ER_SP_GOTO_IN_HNDLR 1358 +#define ER_TRG_ALREADY_EXISTS 1359 +#define ER_TRG_DOES_NOT_EXIST 1360 +#define ER_TRG_ON_VIEW_OR_TEMP_TABLE 1361 +#define ER_TRG_CANT_CHANGE_ROW 1362 +#define ER_TRG_NO_SUCH_ROW_IN_TRG 1363 +#define ER_NO_DEFAULT_FOR_FIELD 1364 +#define ER_DIVISION_BY_ZERO 1365 +#define ER_TRUNCATED_WRONG_VALUE_FOR_FIELD 1366 +#define ER_ILLEGAL_VALUE_FOR_TYPE 1367 +#define ER_VIEW_NONUPD_CHECK 1368 +#define ER_VIEW_CHECK_FAILED 1369 +#define ER_PROCACCESS_DENIED_ERROR 1370 +#define ER_RELAY_LOG_FAIL 1371 +#define ER_PASSWD_LENGTH 1372 +#define ER_UNKNOWN_TARGET_BINLOG 1373 +#define ER_IO_ERR_LOG_INDEX_READ 1374 +#define ER_BINLOG_PURGE_PROHIBITED 1375 +#define ER_FSEEK_FAIL 1376 +#define ER_BINLOG_PURGE_FATAL_ERR 1377 +#define ER_LOG_IN_USE 1378 +#define ER_LOG_PURGE_UNKNOWN_ERR 1379 +#define ER_RELAY_LOG_INIT 1380 +#define ER_NO_BINARY_LOGGING 1381 +#define ER_RESERVED_SYNTAX 1382 +#define ER_WSAS_FAILED 1383 +#define ER_DIFF_GROUPS_PROC 1384 +#define ER_NO_GROUP_FOR_PROC 1385 +#define ER_ORDER_WITH_PROC 1386 +#define ER_LOGGING_PROHIBIT_CHANGING_OF 1387 +#define ER_NO_FILE_MAPPING 1388 +#define ER_WRONG_MAGIC 1389 +#define ER_PS_MANY_PARAM 1390 +#define ER_KEY_PART_0 1391 +#define ER_VIEW_CHECKSUM 1392 +#define ER_VIEW_MULTIUPDATE 1393 +#define ER_VIEW_NO_INSERT_FIELD_LIST 1394 +#define ER_VIEW_DELETE_MERGE_VIEW 1395 +#define ER_CANNOT_USER 1396 +#define ER_XAER_NOTA 1397 +#define ER_XAER_INVAL 1398 +#define ER_XAER_RMFAIL 1399 +#define ER_XAER_OUTSIDE 1400 +#define ER_XAER_RMERR 1401 +#define ER_XA_RBROLLBACK 1402 +#define ER_NONEXISTING_PROC_GRANT 1403 +#define ER_PROC_AUTO_GRANT_FAIL 1404 +#define ER_PROC_AUTO_REVOKE_FAIL 1405 +#define ER_DATA_TOO_LONG 1406 +#define ER_SP_BAD_SQLSTATE 1407 +#define ER_STARTUP 1408 +#define ER_LOAD_FROM_FIXED_SIZE_ROWS_TO_VAR 1409 +#define ER_CANT_CREATE_USER_WITH_GRANT 1410 +#define ER_WRONG_VALUE_FOR_TYPE 1411 +#define ER_TABLE_DEF_CHANGED 1412 +#define ER_SP_DUP_HANDLER 1413 +#define ER_SP_NOT_VAR_ARG 1414 +#define ER_SP_NO_RETSET 1415 +#define ER_CANT_CREATE_GEOMETRY_OBJECT 1416 +#define ER_FAILED_ROUTINE_BREAK_BINLOG 1417 +#define ER_BINLOG_UNSAFE_ROUTINE 1418 +#define ER_BINLOG_CREATE_ROUTINE_NEED_SUPER 1419 +#define ER_EXEC_STMT_WITH_OPEN_CURSOR 1420 +#define ER_STMT_HAS_NO_OPEN_CURSOR 1421 +#define ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG 1422 +#define ER_NO_DEFAULT_FOR_VIEW_FIELD 1423 +#define ER_SP_NO_RECURSION 1424 +#define ER_TOO_BIG_SCALE 1425 +#define ER_TOO_BIG_PRECISION 1426 +#define ER_M_BIGGER_THAN_D 1427 +#define ER_WRONG_LOCK_OF_SYSTEM_TABLE 1428 +#define ER_CONNECT_TO_FOREIGN_DATA_SOURCE 1429 +#define ER_QUERY_ON_FOREIGN_DATA_SOURCE 1430 +#define ER_FOREIGN_DATA_SOURCE_DOESNT_EXIST 1431 +#define ER_FOREIGN_DATA_STRING_INVALID_CANT_CREATE 1432 +#define ER_FOREIGN_DATA_STRING_INVALID 1433 +#define ER_CANT_CREATE_FEDERATED_TABLE 1434 +#define ER_TRG_IN_WRONG_SCHEMA 1435 +#define ER_STACK_OVERRUN_NEED_MORE 1436 +#define ER_TOO_LONG_BODY 1437 +#define ER_WARN_CANT_DROP_DEFAULT_KEYCACHE 1438 +#define ER_TOO_BIG_DISPLAYWIDTH 1439 +#define ER_XAER_DUPID 1440 +#define ER_DATETIME_FUNCTION_OVERFLOW 1441 +#define ER_CANT_UPDATE_USED_TABLE_IN_SF_OR_TRG 1442 +#define ER_VIEW_PREVENT_UPDATE 1443 +#define ER_PS_NO_RECURSION 1444 +#define ER_SP_CANT_SET_AUTOCOMMIT 1445 +#define ER_MALFORMED_DEFINER 1446 +#define ER_VIEW_FRM_NO_USER 1447 +#define ER_VIEW_OTHER_USER 1448 +#define ER_NO_SUCH_USER 1449 +#define ER_FORBID_SCHEMA_CHANGE 1450 +#define ER_ROW_IS_REFERENCED_2 1451 +#define ER_NO_REFERENCED_ROW_2 1452 +#define ER_SP_BAD_VAR_SHADOW 1453 +#define ER_TRG_NO_DEFINER 1454 +#define ER_OLD_FILE_FORMAT 1455 +#define ER_SP_RECURSION_LIMIT 1456 +#define ER_SP_PROC_TABLE_CORRUPT 1457 +#define ER_SP_WRONG_NAME 1458 +#define ER_TABLE_NEEDS_UPGRADE 1459 +#define ER_SP_NO_AGGREGATE 1460 +#define ER_MAX_PREPARED_STMT_COUNT_REACHED 1461 +#define ER_VIEW_RECURSIVE 1462 +#define ER_NON_GROUPING_FIELD_USED 1463 +#define ER_TABLE_CANT_HANDLE_SPKEYS 1464 +#define ER_NO_TRIGGERS_ON_SYSTEM_SCHEMA 1465 +#define ER_REMOVED_SPACES 1466 +#define ER_AUTOINC_READ_FAILED 1467 +#define ER_USERNAME 1468 +#define ER_HOSTNAME 1469 +#define ER_WRONG_STRING_LENGTH 1470 +#define ER_NON_INSERTABLE_TABLE 1471 +#define ER_ADMIN_WRONG_MRG_TABLE 1472 +#define ER_TOO_HIGH_LEVEL_OF_NESTING_FOR_SELECT 1473 +#define ER_NAME_BECOMES_EMPTY 1474 +#define ER_AMBIGUOUS_FIELD_TERM 1475 +#define ER_FOREIGN_SERVER_EXISTS 1476 +#define ER_FOREIGN_SERVER_DOESNT_EXIST 1477 +#define ER_ILLEGAL_HA_CREATE_OPTION 1478 +#define ER_PARTITION_REQUIRES_VALUES_ERROR 1479 +#define ER_PARTITION_WRONG_VALUES_ERROR 1480 +#define ER_PARTITION_MAXVALUE_ERROR 1481 +#define ER_PARTITION_SUBPARTITION_ERROR 1482 +#define ER_PARTITION_SUBPART_MIX_ERROR 1483 +#define ER_PARTITION_WRONG_NO_PART_ERROR 1484 +#define ER_PARTITION_WRONG_NO_SUBPART_ERROR 1485 +#define ER_CONST_EXPR_IN_PARTITION_FUNC_ERROR 1486 +#define ER_NO_CONST_EXPR_IN_RANGE_OR_LIST_ERROR 1487 +#define ER_FIELD_NOT_FOUND_PART_ERROR 1488 +#define ER_LIST_OF_FIELDS_ONLY_IN_HASH_ERROR 1489 +#define ER_INCONSISTENT_PARTITION_INFO_ERROR 1490 +#define ER_PARTITION_FUNC_NOT_ALLOWED_ERROR 1491 +#define ER_PARTITIONS_MUST_BE_DEFINED_ERROR 1492 +#define ER_RANGE_NOT_INCREASING_ERROR 1493 +#define ER_INCONSISTENT_TYPE_OF_FUNCTIONS_ERROR 1494 +#define ER_MULTIPLE_DEF_CONST_IN_LIST_PART_ERROR 1495 +#define ER_PARTITION_ENTRY_ERROR 1496 +#define ER_MIX_HANDLER_ERROR 1497 +#define ER_PARTITION_NOT_DEFINED_ERROR 1498 +#define ER_TOO_MANY_PARTITIONS_ERROR 1499 +#define ER_SUBPARTITION_ERROR 1500 +#define ER_CANT_CREATE_HANDLER_FILE 1501 +#define ER_BLOB_FIELD_IN_PART_FUNC_ERROR 1502 +#define ER_UNIQUE_KEY_NEED_ALL_FIELDS_IN_PF 1503 +#define ER_NO_PARTS_ERROR 1504 +#define ER_PARTITION_MGMT_ON_NONPARTITIONED 1505 +#define ER_FOREIGN_KEY_ON_PARTITIONED 1506 +#define ER_DROP_PARTITION_NON_EXISTENT 1507 +#define ER_DROP_LAST_PARTITION 1508 +#define ER_COALESCE_ONLY_ON_HASH_PARTITION 1509 +#define ER_REORG_HASH_ONLY_ON_SAME_NO 1510 +#define ER_REORG_NO_PARAM_ERROR 1511 +#define ER_ONLY_ON_RANGE_LIST_PARTITION 1512 +#define ER_ADD_PARTITION_SUBPART_ERROR 1513 +#define ER_ADD_PARTITION_NO_NEW_PARTITION 1514 +#define ER_COALESCE_PARTITION_NO_PARTITION 1515 +#define ER_REORG_PARTITION_NOT_EXIST 1516 +#define ER_SAME_NAME_PARTITION 1517 +#define ER_NO_BINLOG_ERROR 1518 +#define ER_CONSECUTIVE_REORG_PARTITIONS 1519 +#define ER_REORG_OUTSIDE_RANGE 1520 +#define ER_PARTITION_FUNCTION_FAILURE 1521 +#define ER_PART_STATE_ERROR 1522 +#define ER_LIMITED_PART_RANGE 1523 +#define ER_PLUGIN_IS_NOT_LOADED 1524 +#define ER_WRONG_VALUE 1525 +#define ER_NO_PARTITION_FOR_GIVEN_VALUE 1526 +#define ER_FILEGROUP_OPTION_ONLY_ONCE 1527 +#define ER_CREATE_FILEGROUP_FAILED 1528 +#define ER_DROP_FILEGROUP_FAILED 1529 +#define ER_TABLESPACE_AUTO_EXTEND_ERROR 1530 +#define ER_WRONG_SIZE_NUMBER 1531 +#define ER_SIZE_OVERFLOW_ERROR 1532 +#define ER_ALTER_FILEGROUP_FAILED 1533 +#define ER_BINLOG_ROW_LOGGING_FAILED 1534 +#define ER_BINLOG_ROW_WRONG_TABLE_DEF 1535 +#define ER_BINLOG_ROW_RBR_TO_SBR 1536 +#define ER_EVENT_ALREADY_EXISTS 1537 +#define ER_EVENT_STORE_FAILED 1538 +#define ER_EVENT_DOES_NOT_EXIST 1539 +#define ER_EVENT_CANT_ALTER 1540 +#define ER_EVENT_DROP_FAILED 1541 +#define ER_EVENT_INTERVAL_NOT_POSITIVE_OR_TOO_BIG 1542 +#define ER_EVENT_ENDS_BEFORE_STARTS 1543 +#define ER_EVENT_EXEC_TIME_IN_THE_PAST 1544 +#define ER_EVENT_OPEN_TABLE_FAILED 1545 +#define ER_EVENT_NEITHER_M_EXPR_NOR_M_AT 1546 +#define ER_COL_COUNT_DOESNT_MATCH_CORRUPTED 1547 +#define ER_CANNOT_LOAD_FROM_TABLE 1548 +#define ER_EVENT_CANNOT_DELETE 1549 +#define ER_EVENT_COMPILE_ERROR 1550 +#define ER_EVENT_SAME_NAME 1551 +#define ER_EVENT_DATA_TOO_LONG 1552 +#define ER_DROP_INDEX_FK 1553 +#define ER_WARN_DEPRECATED_SYNTAX_WITH_VER 1554 +#define ER_CANT_WRITE_LOCK_LOG_TABLE 1555 +#define ER_CANT_LOCK_LOG_TABLE 1556 +#define ER_FOREIGN_DUPLICATE_KEY 1557 +#define ER_COL_COUNT_DOESNT_MATCH_PLEASE_UPDATE 1558 +#define ER_TEMP_TABLE_PREVENTS_SWITCH_OUT_OF_RBR 1559 +#define ER_STORED_FUNCTION_PREVENTS_SWITCH_BINLOG_FORMAT 1560 +#define ER_NDB_CANT_SWITCH_BINLOG_FORMAT 1561 +#define ER_PARTITION_NO_TEMPORARY 1562 +#define ER_PARTITION_CONST_DOMAIN_ERROR 1563 +#define ER_PARTITION_FUNCTION_IS_NOT_ALLOWED 1564 +#define ER_DDL_LOG_ERROR 1565 +#define ER_NULL_IN_VALUES_LESS_THAN 1566 +#define ER_WRONG_PARTITION_NAME 1567 +#define ER_CANT_CHANGE_TX_ISOLATION 1568 +#define ER_DUP_ENTRY_AUTOINCREMENT_CASE 1569 +#define ER_EVENT_MODIFY_QUEUE_ERROR 1570 +#define ER_EVENT_SET_VAR_ERROR 1571 +#define ER_PARTITION_MERGE_ERROR 1572 +#define ER_CANT_ACTIVATE_LOG 1573 +#define ER_RBR_NOT_AVAILABLE 1574 +#define ER_BASE64_DECODE_ERROR 1575 +#define ER_EVENT_RECURSION_FORBIDDEN 1576 +#define ER_EVENTS_DB_ERROR 1577 +#define ER_ONLY_INTEGERS_ALLOWED 1578 +#define ER_UNSUPORTED_LOG_ENGINE 1579 +#define ER_BAD_LOG_STATEMENT 1580 +#define ER_CANT_RENAME_LOG_TABLE 1581 +#define ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT 1582 +#define ER_WRONG_PARAMETERS_TO_NATIVE_FCT 1583 +#define ER_WRONG_PARAMETERS_TO_STORED_FCT 1584 +#define ER_NATIVE_FCT_NAME_COLLISION 1585 +#define ER_DUP_ENTRY_WITH_KEY_NAME 1586 +#define ER_BINLOG_PURGE_EMFILE 1587 +#define ER_EVENT_CANNOT_CREATE_IN_THE_PAST 1588 +#define ER_EVENT_CANNOT_ALTER_IN_THE_PAST 1589 +#define ER_SLAVE_INCIDENT 1590 +#define ER_NO_PARTITION_FOR_GIVEN_VALUE_SILENT 1591 +#define ER_BINLOG_UNSAFE_STATEMENT 1592 +#define ER_SLAVE_FATAL_ERROR 1593 +#define ER_SLAVE_RELAY_LOG_READ_FAILURE 1594 +#define ER_SLAVE_RELAY_LOG_WRITE_FAILURE 1595 +#define ER_SLAVE_CREATE_EVENT_FAILURE 1596 +#define ER_SLAVE_MASTER_COM_FAILURE 1597 +#define ER_BINLOG_LOGGING_IMPOSSIBLE 1598 +#define ER_VIEW_NO_CREATION_CTX 1599 +#define ER_VIEW_INVALID_CREATION_CTX 1600 +#define ER_SR_INVALID_CREATION_CTX 1601 +#define ER_TRG_CORRUPTED_FILE 1602 +#define ER_TRG_NO_CREATION_CTX 1603 +#define ER_TRG_INVALID_CREATION_CTX 1604 +#define ER_EVENT_INVALID_CREATION_CTX 1605 +#define ER_TRG_CANT_OPEN_TABLE 1606 +#define ER_CANT_CREATE_SROUTINE 1607 +#define ER_SLAVE_AMBIGOUS_EXEC_MODE 1608 +#define ER_NO_FORMAT_DESCRIPTION_EVENT_BEFORE_BINLOG_STATEMENT 1609 +#define ER_SLAVE_CORRUPT_EVENT 1610 +#define ER_LOAD_DATA_INVALID_COLUMN 1611 +#define ER_LOG_PURGE_NO_FILE 1612 +#define ER_NEED_REPREPARE 1613 +#define ER_DELAYED_NOT_SUPPORTED 1614 +#define ER_WARN_AUTO_CONVERT_LOCK 1615 +#define ER_NO_AUTO_CONVERT_LOCK_STRICT 1616 +#define ER_NO_AUTO_CONVERT_LOCK_TRANSACTION 1617 +#define ER_NO_STORAGE_ENGINE 1618 +#define ER_BACKUP_BACKUP_START 1619 +#define ER_BACKUP_BACKUP_DONE 1620 +#define ER_BACKUP_RESTORE_START 1621 +#define ER_BACKUP_RESTORE_DONE 1622 +#define ER_BACKUP_NOTHING_TO_BACKUP 1623 +#define ER_BACKUP_CANNOT_INCLUDE_DB 1624 +#define ER_BACKUP_BACKUP 1625 +#define ER_BACKUP_RESTORE 1626 +#define ER_BACKUP_RUNNING 1627 +#define ER_BACKUP_BACKUP_PREPARE 1628 +#define ER_BACKUP_RESTORE_PREPARE 1629 +#define ER_BACKUP_INVALID_LOC 1630 +#define ER_BACKUP_READ_LOC 1631 +#define ER_BACKUP_WRITE_LOC 1632 +#define ER_BACKUP_LIST_DBS 1633 +#define ER_BACKUP_LIST_TABLES 1634 +#define ER_BACKUP_LIST_DB_TABLES 1635 +#define ER_BACKUP_SKIP_VIEW 1636 +#define ER_BACKUP_NO_ENGINE 1637 +#define ER_BACKUP_TABLE_OPEN 1638 +#define ER_BACKUP_READ_HEADER 1639 +#define ER_BACKUP_WRITE_HEADER 1640 +#define ER_BACKUP_NO_BACKUP_DRIVER 1641 +#define ER_BACKUP_NOT_ACCEPTED 1642 +#define ER_BACKUP_CREATE_BACKUP_DRIVER 1643 +#define ER_BACKUP_CREATE_RESTORE_DRIVER 1644 +#define ER_BACKUP_TOO_MANY_IMAGES 1645 +#define ER_BACKUP_WRITE_META 1646 +#define ER_BACKUP_READ_META 1647 +#define ER_BACKUP_CREATE_META 1648 +#define ER_BACKUP_GET_BUF 1649 +#define ER_BACKUP_WRITE_DATA 1650 +#define ER_BACKUP_READ_DATA 1651 +#define ER_BACKUP_NEXT_CHUNK 1652 +#define ER_BACKUP_INIT_BACKUP_DRIVER 1653 +#define ER_BACKUP_INIT_RESTORE_DRIVER 1654 +#define ER_BACKUP_STOP_BACKUP_DRIVER 1655 +#define ER_BACKUP_STOP_RESTORE_DRIVERS 1656 +#define ER_BACKUP_PREPARE_DRIVER 1657 +#define ER_BACKUP_CREATE_VP 1658 +#define ER_BACKUP_UNLOCK_DRIVER 1659 +#define ER_BACKUP_CANCEL_BACKUP 1660 +#define ER_BACKUP_CANCEL_RESTORE 1661 +#define ER_BACKUP_GET_DATA 1662 +#define ER_BACKUP_SEND_DATA 1663 +#define ER_BACKUP_SEND_DATA_RETRY 1664 +#define ER_BACKUP_OPEN_TABLES 1665 +#define ER_BACKUP_THREAD_INIT 1666 +#define ER_BACKUP_PROGRESS_TABLES 1667 +#define ER_TABLESPACE_EXIST 1668 +#define ER_NO_SUCH_TABLESPACE 1669 +#define ER_SLAVE_HEARTBEAT_FAILURE 1670 +#define ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE 1671 +#define ER_BACKUP_CANT_FIND_SE 1672 +#define ER_BACKUP_NO_NATIVE_BE 1673 +#define ER_BACKUP_UNKNOWN_BE 1674 +#define ER_BACKUP_WRONG_TABLE_BE 1675 +#define ER_BACKUP_CANT_RESTORE_DB 1676 +#define ER_BACKUP_CANT_RESTORE_TABLE 1677 +#define ER_BACKUP_CANT_RESTORE_VIEW 1678 +#define ER_BACKUP_CANT_RESTORE_SROUT 1679 +#define ER_BACKUP_CANT_RESTORE_EVENT 1680 +#define ER_BACKUP_CANT_RESTORE_TRIGGER 1681 +#define ER_BACKUP_CATALOG_ADD_DB 1682 +#define ER_BACKUP_CATALOG_ADD_TABLE 1683 +#define ER_BACKUP_CATALOG_ADD_VIEW 1684 +#define ER_BACKUP_CATALOG_ADD_SROUT 1685 +#define ER_BACKUP_CATALOG_ADD_EVENT 1686 +#define ER_BACKUP_CATALOG_ADD_TRIGGER 1687 +#define ER_BACKUP_UNKNOWN_OBJECT 1688 +#define ER_BACKUP_UNKNOWN_OBJECT_TYPE 1689 +#define ER_BACKUP_OPEN_WR 1690 +#define ER_BACKUP_OPEN_RD 1691 +#define ER_BACKUP_BAD_MAGIC 1692 +#define ER_BACKUP_CONTEXT_CREATE 1693 +#define ER_BACKUP_CONTEXT_REMOVE 1694 +#define ER_BAD_PATH 1695 +#define ER_DDL_BLOCK 1696 +#define ER_BACKUP_LOGGER_INIT 1697 +#define ER_BACKUP_WRITE_SUMMARY 1698 +#define ER_BACKUP_READ_SUMMARY 1699 +#define ER_BACKUP_GET_META_DB 1700 +#define ER_BACKUP_GET_META_TABLE 1701 +#define ER_BACKUP_GET_META_VIEW 1702 +#define ER_BACKUP_GET_META_SROUT 1703 +#define ER_BACKUP_GET_META_EVENT 1704 +#define ER_BACKUP_GET_META_TRIGGER 1705 +#define ER_BACKUP_CREATE_BE 1706 +#define ER_BACKUP_LIST_PERDB 1707 +#define ER_BACKUP_LIST_DB_VIEWS 1708 +#define ER_BACKUP_LIST_DB_SROUT 1709 +#define ER_BACKUP_LIST_DB_EVENTS 1710 +#define ER_BACKUP_LIST_DB_TRIGGERS 1711 +#define ER_BACKUP_LOG_WRITE_ERROR 1712 +#define ER_TABLESPACE_NOT_EMPTY 1713 +#define ER_BACKUP_CAT_ENUM 1714 +#define ER_BACKUP_CANT_RESTORE_TS 1715 +#define ER_BACKUP_TS_CHANGE 1716 +#define ER_BACKUP_GET_META_TS 1717 +#define ER_TABLESPACE_DATAFILE_EXIST 1718 +#define ER_BACKUP_CATALOG_ADD_TS 1719 +#define ER_DEBUG_SYNC_TIMEOUT 1720 +#define ER_DEBUG_SYNC_HIT_LIMIT 1721 +#define ER_BACKUP_FAILED_TO_INIT_COMPRESSION 1722 +#define ER_BACKUP_OBTAIN_NAME_LOCK_FAILED 1723 +#define ER_BACKUP_RELEASE_NAME_LOCK_FAILED 1724 +#define ER_BACKUP_BACKUPDIR 1725 +#define ER_ERROR_LAST 1725 diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/mysys/rijndael.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/mysys/rijndael.h new file mode 100644 index 0000000..89963a8 --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/mysys/rijndael.h @@ -0,0 +1,41 @@ +/* Copyright (C) 2002 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + + +/* + rijndael-alg-fst.h + + @version 3.0 (December 2000) + Optimised ANSI C code for the Rijndael cipher (now AES) + @author Vincent Rijmen + @author Antoon Bosselaers + @author Paulo Barreto + + This code is hereby placed in the public domain. + Modified by Peter Zaitsev to fit MySQL coding style. + */ + +#define AES_MAXKC (256/32) +#define AES_MAXKB (256/8) +#define AES_MAXNR 14 + +int rijndaelKeySetupEnc(uint32 rk[/*4*(Nr + 1)*/], const uint8 cipherKey[], + int keyBits); +int rijndaelKeySetupDec(uint32 rk[/*4*(Nr + 1)*/], const uint8 cipherKey[], + int keyBits); +void rijndaelEncrypt(const uint32 rk[/*4*(Nr + 1)*/], int Nr, + const uint8 pt[16], uint8 ct[16]); +void rijndaelDecrypt(const uint32 rk[/*4*(Nr + 1)*/], int Nr, + const uint8 ct[16], uint8 pt[16]); diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/mysys_err.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/mysys_err.h new file mode 100644 index 0000000..7167395 --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/mysys_err.h @@ -0,0 +1,90 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef _mysys_err_h +#define _mysys_err_h +#ifdef __cplusplus +extern "C" { +#endif + +#define GLOBERRS (EE_ERROR_LAST - EE_ERROR_FIRST + 1) /* Nr of global errors */ +#define EE(X) (globerrs[(X) - EE_ERROR_FIRST]) + +extern const char * NEAR globerrs[]; /* my_error_messages is here */ + +/* Error message numbers in global map */ +/* + Do not add error numbers before EE_ERROR_FIRST. + If necessary to add lower numbers, change EE_ERROR_FIRST accordingly. + + We start with error 1 to not confuse peoples with 'error 0' +*/ + +#define EE_ERROR_FIRST 1 /*Copy first error nr.*/ +#define EE_CANTCREATEFILE 1 +#define EE_READ 2 +#define EE_WRITE 3 +#define EE_BADCLOSE 4 +#define EE_OUTOFMEMORY 5 +#define EE_DELETE 6 +#define EE_LINK 7 +#define EE_EOFERR 9 +#define EE_CANTLOCK 10 +#define EE_CANTUNLOCK 11 +#define EE_DIR 12 +#define EE_STAT 13 +#define EE_CANT_CHSIZE 14 +#define EE_CANT_OPEN_STREAM 15 +#define EE_GETWD 16 +#define EE_SETWD 17 +#define EE_LINK_WARNING 18 +#define EE_OPEN_WARNING 19 +#define EE_DISK_FULL 20 +#define EE_CANT_MKDIR 21 +#define EE_UNKNOWN_CHARSET 22 +#define EE_OUT_OF_FILERESOURCES 23 +#define EE_CANT_READLINK 24 +#define EE_CANT_SYMLINK 25 +#define EE_REALPATH 26 +#define EE_SYNC 27 +#define EE_UNKNOWN_COLLATION 28 +#define EE_FILENOTFOUND 29 +#define EE_FILE_NOT_CLOSED 30 +#define EE_CANT_CHMOD 31 +#define EE_ERROR_LAST 31 /* Copy last error nr */ +/* Add error numbers before EE_ERROR_LAST and change it accordingly. */ + + /* exit codes for all MySQL programs */ + +#define EXIT_UNSPECIFIED_ERROR 1 +#define EXIT_UNKNOWN_OPTION 2 +#define EXIT_AMBIGUOUS_OPTION 3 +#define EXIT_NO_ARGUMENT_ALLOWED 4 +#define EXIT_ARGUMENT_REQUIRED 5 +#define EXIT_VAR_PREFIX_NOT_UNIQUE 6 +#define EXIT_UNKNOWN_VARIABLE 7 +#define EXIT_OUT_OF_MEMORY 8 +#define EXIT_UNKNOWN_SUFFIX 9 +#define EXIT_NO_PTR_TO_VARIABLE 10 +#define EXIT_CANNOT_CONNECT_TO_SERVICE 11 +#define EXIT_OPTION_DISABLED 12 +#define EXIT_ARGUMENT_INVALID 13 + + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/queues.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/queues.h new file mode 100644 index 0000000..d01b73b --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/queues.h @@ -0,0 +1,72 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* + Code for generell handling of priority Queues. + Implemention of queues from "Algoritms in C" by Robert Sedgewick. + Copyright Monty Program KB. + By monty. +*/ + +#ifndef _queues_h +#define _queues_h +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct st_queue { + uchar **root; + void *first_cmp_arg; + uint elements; + uint max_elements; + uint offset_to_key; /* compare is done on element+offset */ + int max_at_top; /* Normally 1, set to -1 if queue_top gives max */ + int (*compare)(void *, uchar *,uchar *); + uint auto_extent; +} QUEUE; + +#define queue_top(queue) ((queue)->root[1]) +#define queue_element(queue,index) ((queue)->root[index+1]) +#define queue_end(queue) ((queue)->root[(queue)->elements]) +#define queue_replaced(queue) _downheap(queue,1) +#define queue_set_cmp_arg(queue, set_arg) (queue)->first_cmp_arg= set_arg +#define queue_set_max_at_top(queue, set_arg) \ + (queue)->max_at_top= set_arg ? -1 : 1 +typedef int (*queue_compare)(void *,uchar *, uchar *); + +int init_queue(QUEUE *queue,uint max_elements,uint offset_to_key, + pbool max_at_top, queue_compare compare, + void *first_cmp_arg); +int init_queue_ex(QUEUE *queue,uint max_elements,uint offset_to_key, + pbool max_at_top, queue_compare compare, + void *first_cmp_arg, uint auto_extent); +int reinit_queue(QUEUE *queue,uint max_elements,uint offset_to_key, + pbool max_at_top, queue_compare compare, + void *first_cmp_arg); +int resize_queue(QUEUE *queue, uint max_elements); +void delete_queue(QUEUE *queue); +void queue_insert(QUEUE *queue,uchar *element); +int queue_insert_safe(QUEUE *queue, uchar *element); +uchar *queue_remove(QUEUE *queue,uint idx); +#define queue_remove_all(queue) { (queue)->elements= 0; } +#define queue_is_full(queue) (queue->elements == queue->max_elements) +void _downheap(QUEUE *queue,uint idx); +void queue_fix(QUEUE *queue); +#define is_queue_inited(queue) ((queue)->root != 0) + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/service_versions.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/service_versions.h new file mode 100644 index 0000000..114957c --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/service_versions.h @@ -0,0 +1,24 @@ +/* Copyright (C) 2009 Sun Microsystems, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifdef _WIN32 +#define SERVICE_VERSION __declspec(dllexport) void * +#else +#define SERVICE_VERSION void * +#endif + +#define VERSION_my_snprintf 0x0100 +#define VERSION_thd_alloc 0x0100 + diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/sha1.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/sha1.h new file mode 100644 index 0000000..e476456 --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/sha1.h @@ -0,0 +1,66 @@ +/* Copyright (C) 2002, 2006 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* + This is the header file for code which implements the Secure + Hashing Algorithm 1 as defined in FIPS PUB 180-1 published + April 17, 1995. + + Many of the variable names in this code, especially the + single character names, were used because those were the names + used in the publication. + + Please read the file sha1.c for more information. + + Modified 2002 by Peter Zaitsev to better follow MySQL standards +*/ + + +enum sha_result_codes +{ + SHA_SUCCESS = 0, + SHA_NULL, /* Null pointer parameter */ + SHA_INPUT_TOO_LONG, /* input data too long */ + SHA_STATE_ERROR /* called Input after Result */ +}; + +#define SHA1_HASH_SIZE 20 /* Hash size in bytes */ + +/* + This structure will hold context information for the SHA-1 + hashing operation +*/ + +typedef struct SHA1_CONTEXT +{ + ulonglong Length; /* Message length in bits */ + uint32 Intermediate_Hash[SHA1_HASH_SIZE/4]; /* Message Digest */ + int Computed; /* Is the digest computed? */ + int Corrupted; /* Is the message digest corrupted? */ + int16 Message_Block_Index; /* Index into message block array */ + uint8 Message_Block[64]; /* 512-bit message blocks */ +} SHA1_CONTEXT; + +/* + Function Prototypes +*/ + +C_MODE_START + +int mysql_sha1_reset(SHA1_CONTEXT*); +int mysql_sha1_input(SHA1_CONTEXT*, const uint8 *, unsigned int); +int mysql_sha1_result(SHA1_CONTEXT* , uint8 Message_Digest[SHA1_HASH_SIZE]); + +C_MODE_END diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/sha2.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/sha2.h new file mode 100644 index 0000000..49dbac5 --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/sha2.h @@ -0,0 +1,72 @@ +/* Copyright (C) 2007 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef included_sha2_h +#define included_sha2_h + +#include + +#if defined(HAVE_YASSL) || defined(HAVE_OPENSSL) + +# ifdef HAVE_STDDEF_H +# include +# endif + +# ifndef HAVE_YASSL +# include + +# else + +#include "../extra/yassl/taocrypt/include/sha.hpp" + +# ifdef __cplusplus +extern "C" { +# endif + +#ifndef SHA512_DIGEST_LENGTH +#define SHA512_DIGEST_LENGTH TaoCrypt::SHA512::DIGEST_SIZE +#endif + +#ifndef SHA384_DIGEST_LENGTH +#define SHA384_DIGEST_LENGTH TaoCrypt::SHA384::DIGEST_SIZE +#endif + +#ifndef SHA256_DIGEST_LENGTH +#define SHA256_DIGEST_LENGTH TaoCrypt::SHA256::DIGEST_SIZE +#endif + +#ifndef SHA224_DIGEST_LENGTH +#define SHA224_DIGEST_LENGTH TaoCrypt::SHA224::DIGEST_SIZE +#endif + +#define GEN_YASSL_SHA2_BRIDGE(size) \ +unsigned char* SHA##size(const unsigned char *input_ptr, size_t input_length, \ + char unsigned *output_ptr); + +GEN_YASSL_SHA2_BRIDGE(512); +GEN_YASSL_SHA2_BRIDGE(384); +GEN_YASSL_SHA2_BRIDGE(256); +GEN_YASSL_SHA2_BRIDGE(224); + +#undef GEN_YASSL_SHA2_BRIDGE + +# ifdef __cplusplus +} +# endif + +# endif /* HAVE_YASSL */ + +#endif /* HAVE_OPENSSL || HAVE_YASSL */ +#endif /* included_sha2_h */ diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/sql_common.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/sql_common.h new file mode 100644 index 0000000..9e43d07 --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/sql_common.h @@ -0,0 +1,50 @@ +/* Copyright (C) 2003-2004, 2006 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + + +extern const char *unknown_sqlstate; +extern const char *cant_connect_sqlstate; +extern const char *not_error_sqlstate; + +#ifdef __cplusplus +extern "C" { +#endif + +extern CHARSET_INFO *default_client_charset_info; +MYSQL_FIELD *unpack_fields(MYSQL_DATA *data,MEM_ROOT *alloc,uint fields, + my_bool default_value, uint server_capabilities); +void free_rows(MYSQL_DATA *cur); +void free_old_query(MYSQL *mysql); +void end_server(MYSQL *mysql); +my_bool mysql_reconnect(MYSQL *mysql); +void mysql_read_default_options(struct st_mysql_options *options, + const char *filename,const char *group); +my_bool +cli_advanced_command(MYSQL *mysql, enum enum_server_command command, + const unsigned char *header, ulong header_length, + const unsigned char *arg, ulong arg_length, + my_bool skip_check, MYSQL_STMT *stmt); +unsigned long cli_safe_read(MYSQL *mysql); +void net_clear_error(NET *net); +void set_stmt_errmsg(MYSQL_STMT *stmt, NET *net); +void set_stmt_error(MYSQL_STMT *stmt, int errcode, const char *sqlstate, + const char *err); +void set_mysql_error(MYSQL *mysql, int errcode, const char *sqlstate); +#ifdef __cplusplus +} +#endif + +#define protocol_41(A) ((A)->server_capabilities & CLIENT_PROTOCOL_41) + diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/sslopt-case.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/sslopt-case.h new file mode 100644 index 0000000..ee6c83c --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/sslopt-case.h @@ -0,0 +1,28 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#if defined(HAVE_OPENSSL) && !defined(EMBEDDED_LIBRARY) + case OPT_SSL_KEY: + case OPT_SSL_CERT: + case OPT_SSL_CA: + case OPT_SSL_CAPATH: + case OPT_SSL_CIPHER: + /* + Enable use of SSL if we are using any ssl option + One can disable SSL later by using --skip-ssl or --ssl=0 + */ + opt_use_ssl= 1; + break; +#endif diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/sslopt-longopts.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/sslopt-longopts.h new file mode 100644 index 0000000..06422e5 --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/sslopt-longopts.h @@ -0,0 +1,45 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#if defined(HAVE_OPENSSL) && !defined(EMBEDDED_LIBRARY) + + {"ssl", OPT_SSL_SSL, + "Enable SSL for connection (automatically enabled with other flags). Disable with --skip-ssl.", + (uchar **) &opt_use_ssl, (uchar **) &opt_use_ssl, 0, GET_BOOL, NO_ARG, 0, 0, 0, + 0, 0, 0}, + {"ssl-ca", OPT_SSL_CA, + "CA file in PEM format (check OpenSSL docs, implies --ssl).", + (uchar **) &opt_ssl_ca, (uchar **) &opt_ssl_ca, 0, GET_STR, REQUIRED_ARG, + 0, 0, 0, 0, 0, 0}, + {"ssl-capath", OPT_SSL_CAPATH, + "CA directory (check OpenSSL docs, implies --ssl).", + (uchar **) &opt_ssl_capath, (uchar **) &opt_ssl_capath, 0, GET_STR, REQUIRED_ARG, + 0, 0, 0, 0, 0, 0}, + {"ssl-cert", OPT_SSL_CERT, "X509 cert in PEM format (implies --ssl).", + (uchar **) &opt_ssl_cert, (uchar **) &opt_ssl_cert, 0, GET_STR, REQUIRED_ARG, + 0, 0, 0, 0, 0, 0}, + {"ssl-cipher", OPT_SSL_CIPHER, "SSL cipher to use (implies --ssl).", + (uchar **) &opt_ssl_cipher, (uchar **) &opt_ssl_cipher, 0, GET_STR, REQUIRED_ARG, + 0, 0, 0, 0, 0, 0}, + {"ssl-key", OPT_SSL_KEY, "X509 key in PEM format (implies --ssl).", + (uchar **) &opt_ssl_key, (uchar **) &opt_ssl_key, 0, GET_STR, REQUIRED_ARG, + 0, 0, 0, 0, 0, 0}, +#ifdef MYSQL_CLIENT + {"ssl-verify-server-cert", OPT_SSL_VERIFY_SERVER_CERT, + "Verify server's \"Common Name\" in its cert against hostname used when connecting. This option is disabled by default.", + (uchar **) &opt_ssl_verify_server_cert, (uchar **) &opt_ssl_verify_server_cert, + 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, +#endif +#endif /* HAVE_OPENSSL */ diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/sslopt-vars.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/sslopt-vars.h new file mode 100644 index 0000000..9d25c33 --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/sslopt-vars.h @@ -0,0 +1,31 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#if defined(HAVE_OPENSSL) && !defined(EMBEDDED_LIBRARY) +#ifdef SSL_VARS_NOT_STATIC +#define SSL_STATIC +#else +#define SSL_STATIC static +#endif +SSL_STATIC my_bool opt_use_ssl = 0; +SSL_STATIC char *opt_ssl_ca = 0; +SSL_STATIC char *opt_ssl_capath = 0; +SSL_STATIC char *opt_ssl_cert = 0; +SSL_STATIC char *opt_ssl_cipher = 0; +SSL_STATIC char *opt_ssl_key = 0; +#ifdef MYSQL_CLIENT +SSL_STATIC my_bool opt_ssl_verify_server_cert= 0; +#endif +#endif diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/t_ctype.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/t_ctype.h new file mode 100644 index 0000000..1560001 --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/t_ctype.h @@ -0,0 +1,254 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* + Copyright (C) 1998, 1999 by Pruet Boonma, all rights reserved. + Copyright (C) 1998 by Theppitak Karoonboonyanan, all rights reserved. + Permission to use, copy, modify, distribute and sell this software + and its documentation for any purpose is hereby granted without fee, + provided that the above copyright notice appear in all copies. + Smaphan Raruenrom and Pruet Boonma makes no representations about + the suitability of this software for any purpose. It is provided + "as is" without express or implied warranty. +*/ + +/* LC_COLLATE category + Level information */ + +#ifndef _t_ctype_h +#define _t_ctype_h + +#define TOT_LEVELS 5 +#define LAST_LEVEL 4 /* TOT_LEVELS - 1 */ + +#define IGNORE 0 + + +/* level 1 symbols & order */ +enum l1_symbols { + L1_08 = TOT_LEVELS, + L1_18, + L1_28, + L1_38, + L1_48, + L1_58, + L1_68, + L1_78, + L1_88, + L1_98, + L1_A8, + L1_B8, + L1_C8, + L1_D8, + L1_E8, + L1_F8, + L1_G8, + L1_H8, + L1_I8, + L1_J8, + L1_K8, + L1_L8, + L1_M8, + L1_N8, + L1_O8, + L1_P8, + L1_Q8, + L1_R8, + L1_S8, + L1_T8, + L1_U8, + L1_V8, + L1_W8, + L1_X8, + L1_Y8, + L1_Z8, + L1_KO_KAI, + L1_KHO_KHAI, + L1_KHO_KHUAT, + L1_KHO_KHWAI, + L1_KHO_KHON, + L1_KHO_RAKHANG, + L1_NGO_NGU, + L1_CHO_CHAN, + L1_CHO_CHING, + L1_CHO_CHANG, + L1_SO_SO, + L1_CHO_CHOE, + L1_YO_YING, + L1_DO_CHADA, + L1_TO_PATAK, + L1_THO_THAN, + L1_THO_NANGMONTHO, + L1_THO_PHUTHAO, + L1_NO_NEN, + L1_DO_DEK, + L1_TO_TAO, + L1_THO_THUNG, + L1_THO_THAHAN, + L1_THO_THONG, + L1_NO_NU, + L1_BO_BAIMAI, + L1_PO_PLA, + L1_PHO_PHUNG, + L1_FO_FA, + L1_PHO_PHAN, + L1_FO_FAN, + L1_PHO_SAMPHAO, + L1_MO_MA, + L1_YO_YAK, + L1_RO_RUA, + L1_RU, + L1_LO_LING, + L1_LU, + L1_WO_WAEN, + L1_SO_SALA, + L1_SO_RUSI, + L1_SO_SUA, + L1_HO_HIP, + L1_LO_CHULA, + L1_O_ANG, + L1_HO_NOKHUK, + L1_NKHIT, + L1_SARA_A, + L1_MAI_HAN_AKAT, + L1_SARA_AA, + L1_SARA_AM, + L1_SARA_I, + L1_SARA_II, + L1_SARA_UE, + L1_SARA_UEE, + L1_SARA_U, + L1_SARA_UU, + L1_SARA_E, + L1_SARA_AE, + L1_SARA_O, + L1_SARA_AI_MAIMUAN, + L1_SARA_AI_MAIMALAI +}; + +/* level 2 symbols & order */ +enum l2_symbols { + L2_BLANK = TOT_LEVELS, + L2_THAII, + L2_YAMAK, + L2_PINTHU, + L2_GARAN, + L2_TYKHU, + L2_TONE1, + L2_TONE2, + L2_TONE3, + L2_TONE4 +}; + +/* level 3 symbols & order */ +enum l3_symbols { + L3_BLANK = TOT_LEVELS, + L3_SPACE, + L3_NB_SACE, + L3_LOW_LINE, + L3_HYPHEN, + L3_COMMA, + L3_SEMICOLON, + L3_COLON, + L3_EXCLAMATION, + L3_QUESTION, + L3_SOLIDUS, + L3_FULL_STOP, + L3_PAIYAN_NOI, + L3_MAI_YAMOK, + L3_GRAVE, + L3_CIRCUMFLEX, + L3_TILDE, + L3_APOSTROPHE, + L3_QUOTATION, + L3_L_PARANTHESIS, + L3_L_BRACKET, + L3_L_BRACE, + L3_R_BRACE, + L3_R_BRACKET, + L3_R_PARENTHESIS, + L3_AT, + L3_BAHT, + L3_DOLLAR, + L3_FONGMAN, + L3_ANGKHANKHU, + L3_KHOMUT, + L3_ASTERISK, + L3_BK_SOLIDUS, + L3_AMPERSAND, + L3_NUMBER, + L3_PERCENT, + L3_PLUS, + L3_LESS_THAN, + L3_EQUAL, + L3_GREATER_THAN, + L3_V_LINE +}; + +/* level 4 symbols & order */ +enum l4_symbols { + L4_BLANK = TOT_LEVELS, + L4_MIN, + L4_CAP, + L4_EXT +}; + +enum level_symbols { + L_UPRUPR = TOT_LEVELS, + L_UPPER, + L_MIDDLE, + L_LOWER +}; + +#define _is(c) (t_ctype[(c)][LAST_LEVEL]) +#define _level 8 +#define _consnt 16 +#define _ldvowel 32 +#define _fllwvowel 64 +#define _uprvowel 128 +#define _lwrvowel 256 +#define _tone 512 +#define _diacrt1 1024 +#define _diacrt2 2048 +#define _combine 4096 +#define _stone 8192 +#define _tdig 16384 +#define _rearvowel (_fllwvowel | _uprvowel | _lwrvowel) +#define _diacrt (_diacrt1 | _diacrt2) +#define levelof(c) ( _is(c) & _level ) +#define isthai(c) ( (c) >= 128 ) +#define istalpha(c) ( _is(c) & (_consnt|_ldvowel|_rearvowel|\ + _tone|_diacrt1|_diacrt2) ) +#define isconsnt(c) ( _is(c) & _consnt ) +#define isldvowel(c) ( _is(c) & _ldvowel ) +#define isfllwvowel(c) ( _is(c) & _fllwvowel ) +#define ismidvowel(c) ( _is(c) & (_ldvowel|_fllwvowel) ) +#define isuprvowel(c) ( _is(c) & _uprvowel ) +#define islwrvowel(c) ( _is(c) & _lwrvowel ) +#define isuprlwrvowel(c) ( _is(c) & (_lwrvowel | _uprvowel)) +#define isrearvowel(c) ( _is(c) & _rearvowel ) +#define isvowel(c) ( _is(c) & (_ldvowel|_rearvowel) ) +#define istone(c) ( _is(c) & _tone ) +#define isunldable(c) ( _is(c) & (_rearvowel|_tone|_diacrt1|_diacrt2) ) +#define iscombinable(c) ( _is(c) & _combine ) +#define istdigit(c) ( _is(c) & _tdig ) +#define isstone(c) ( _is(c) & _stone ) +#define isdiacrt1(c) ( _is(c) & _diacrt1) +#define isdiacrt2(c) ( _is(c) & _diacrt2) +#define isdiacrt(c) ( _is(c) & _diacrt) + +/* Function prototype called by sql/field.cc */ +void ThNormalize(uchar* ptr, uint field_length, const uchar* from, uint length); + +#endif diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/thr_alarm.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/thr_alarm.h new file mode 100644 index 0000000..fb90603 --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/thr_alarm.h @@ -0,0 +1,110 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* Prototypes when using thr_alarm library functions */ + +#ifndef _thr_alarm_h +#define _thr_alarm_h +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef USE_ALARM_THREAD +#define USE_ONE_SIGNAL_HAND /* One must call process_alarm */ +#endif +#ifdef HAVE_rts_threads +#undef USE_ONE_SIGNAL_HAND +#define USE_ALARM_THREAD +#define THR_SERVER_ALARM SIGUSR1 +#else +#define THR_SERVER_ALARM SIGALRM +#endif + +typedef struct st_alarm_info +{ + ulong next_alarm_time; + uint active_alarms; + uint max_used_alarms; +} ALARM_INFO; + +void thr_alarm_info(ALARM_INFO *info); + +#if defined(DONT_USE_THR_ALARM) || !defined(THREAD) + +#define USE_ALARM_THREAD +#undef USE_ONE_SIGNAL_HAND + +typedef my_bool thr_alarm_t; +typedef my_bool ALARM; + +#define thr_alarm_init(A) (*(A))=0 +#define thr_alarm_in_use(A) (*(A) != 0) +#define thr_end_alarm(A) +#define thr_alarm(A,B,C) ((*(A)=1)-1) +/* The following should maybe be (*(A)) */ +#define thr_got_alarm(A) 0 +#define init_thr_alarm(A) +#define thr_alarm_kill(A) +#define resize_thr_alarm(N) +#define end_thr_alarm(A) + +#else +#if defined(__WIN__) +typedef struct st_thr_alarm_entry +{ + rf_SetTimer crono; +} thr_alarm_entry; + +#else /* System with posix threads */ + +typedef int thr_alarm_entry; + +#define thr_got_alarm(thr_alarm) (**(thr_alarm)) + +#endif /* __WIN__ */ + +typedef thr_alarm_entry* thr_alarm_t; + +typedef struct st_alarm { + ulong expire_time; + thr_alarm_entry alarmed; /* set when alarm is due */ + pthread_t thread; + my_thread_id thread_id; + my_bool malloced; +} ALARM; + +extern uint thr_client_alarm; +extern pthread_t alarm_thread; + +#define thr_alarm_init(A) (*(A))=0 +#define thr_alarm_in_use(A) (*(A)!= 0) +void init_thr_alarm(uint max_alarm); +void resize_thr_alarm(uint max_alarms); +my_bool thr_alarm(thr_alarm_t *alarmed, uint sec, ALARM *buff); +void thr_alarm_kill(my_thread_id thread_id); +void thr_end_alarm(thr_alarm_t *alarmed); +void end_thr_alarm(my_bool free_structures); +sig_handler process_alarm(int); +#ifndef thr_got_alarm +my_bool thr_got_alarm(thr_alarm_t *alrm); +#endif + + +#endif /* DONT_USE_THR_ALARM */ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ +#endif /* _thr_alarm_h */ diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/thr_lock.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/thr_lock.h new file mode 100644 index 0000000..38f0478 --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/thr_lock.h @@ -0,0 +1,181 @@ +/* Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* For use with thr_lock:s */ + +#ifndef _thr_lock_h +#define _thr_lock_h +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +struct st_thr_lock; +extern ulong locks_immediate,locks_waited ; + +/** + Lock types are used to request a lock on a table. Changes in this enumeration + might affect transactional locks as well. + Important: if a new lock type is added, a matching lock description + must be added to sql_test.cc's lock_descriptions array. + @see set_handler_table_locks + @see read_lock_type_for_table +*/ +enum thr_lock_type { TL_IGNORE=-1, + TL_UNLOCK, /* UNLOCK ANY LOCK */ + /* + Parser only! At open_tables() becomes TL_READ or + TL_READ_NO_INSERT depending on the binary log format + (SBR/RBR) and on the table category (log table). + Used for tables that are read by statements which + modify tables. + */ + TL_READ_DEFAULT, + TL_READ, /* Read lock */ + TL_READ_WITH_SHARED_LOCKS, + /* High prior. than TL_WRITE. Allow concurrent insert */ + TL_READ_HIGH_PRIORITY, + /* READ, Don't allow concurrent insert */ + TL_READ_NO_INSERT, + /* + Write lock, but allow other threads to read / write. + Used by BDB tables in MySQL to mark that someone is + reading/writing to the table. + */ + TL_WRITE_ALLOW_WRITE, + /* + Write lock, but allow other threads to read. + Used by ALTER TABLE in MySQL to allow readers + to use the table until ALTER TABLE is finished. + */ + TL_WRITE_ALLOW_READ, + /* + WRITE lock used by concurrent insert. Will allow + READ, if one could use concurrent insert on table. + */ + TL_WRITE_CONCURRENT_INSERT, + /* Write used by INSERT DELAYED. Allows READ locks */ + TL_WRITE_DELAYED, + /* + parser only! Late bound low_priority flag. + At open_tables() becomes thd->update_lock_default. + */ + TL_WRITE_DEFAULT, + /* WRITE lock that has lower priority than TL_READ */ + TL_WRITE_LOW_PRIORITY, + /* Normal WRITE lock */ + TL_WRITE, + /* Abort new lock request with an error */ + TL_WRITE_ONLY}; + +enum enum_thr_lock_result { THR_LOCK_SUCCESS= 0, THR_LOCK_ABORTED= 1, + THR_LOCK_WAIT_TIMEOUT= 2, THR_LOCK_DEADLOCK= 3 }; + + +extern ulong max_write_lock_count; +extern ulong table_lock_wait_timeout; +extern my_bool thr_lock_inited; +extern enum thr_lock_type thr_upgraded_concurrent_insert_lock; + +/* + A description of the thread which owns the lock. The address + of an instance of this structure is used to uniquely identify the thread. +*/ + +typedef struct st_thr_lock_info +{ + pthread_t thread; + my_thread_id thread_id; + ulong n_cursors; +} THR_LOCK_INFO; + +/* + Lock owner identifier. Globally identifies the lock owner within the + thread and among all the threads. The address of an instance of this + structure is used as id. +*/ + +typedef struct st_thr_lock_owner +{ + THR_LOCK_INFO *info; +} THR_LOCK_OWNER; + + +typedef struct st_thr_lock_data { + THR_LOCK_OWNER *owner; + struct st_thr_lock_data *next,**prev; + struct st_thr_lock *lock; + pthread_cond_t *cond; + enum thr_lock_type type; + void *status_param; /* Param to status functions */ + void *debug_print_param; +} THR_LOCK_DATA; + +struct st_lock_list { + THR_LOCK_DATA *data,**last; +}; + +typedef struct st_thr_lock { + LIST list; + pthread_mutex_t mutex; + struct st_lock_list read_wait; + struct st_lock_list read; + struct st_lock_list write_wait; + struct st_lock_list write; + /* write_lock_count is incremented for write locks and reset on read locks */ + ulong write_lock_count; + uint read_no_write_count; + void (*get_status)(void*, my_bool); /* When one gets a lock */ + void (*copy_status)(void*,void*); + void (*update_status)(void*); /* Before release of write */ + void (*restore_status)(void*); /* Before release of read */ + my_bool (*check_status)(void *); + my_bool allow_multiple_concurrent_insert; +} THR_LOCK; + + +extern LIST *thr_lock_thread_list; +extern pthread_mutex_t THR_LOCK_lock; + +my_bool init_thr_lock(void); /* Must be called once/thread */ +#define thr_lock_owner_init(owner, info_arg) (owner)->info= (info_arg) +void thr_lock_info_init(THR_LOCK_INFO *info); +void thr_lock_init(THR_LOCK *lock); +void thr_lock_delete(THR_LOCK *lock); +void thr_lock_data_init(THR_LOCK *lock,THR_LOCK_DATA *data, + void *status_param); +enum enum_thr_lock_result thr_lock(THR_LOCK_DATA *data, + THR_LOCK_OWNER *owner, + enum thr_lock_type lock_type); +void thr_unlock(THR_LOCK_DATA *data); +enum enum_thr_lock_result thr_multi_lock(THR_LOCK_DATA **data, + uint count, THR_LOCK_OWNER *owner); +void thr_multi_unlock(THR_LOCK_DATA **data,uint count); +void +thr_lock_merge_status(THR_LOCK_DATA **data, uint count); +void thr_abort_locks(THR_LOCK *lock, my_bool upgrade_lock); +my_bool thr_abort_locks_for_thread(THR_LOCK *lock, my_thread_id thread); +void thr_print_locks(void); /* For debugging */ +my_bool thr_upgrade_write_delay_lock(THR_LOCK_DATA *data, + enum thr_lock_type new_lock_type); +void thr_downgrade_write_lock(THR_LOCK_DATA *data, + enum thr_lock_type new_lock_type); +my_bool thr_reschedule_write_lock(THR_LOCK_DATA *data); +#ifdef __cplusplus +} +#endif +#endif /* _thr_lock_h */ diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/typelib.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/typelib.h new file mode 100644 index 0000000..46106d1 --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/typelib.h @@ -0,0 +1,39 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + + +#ifndef _typelib_h +#define _typelib_h + +#include "my_alloc.h" + +typedef struct st_typelib { /* Different types saved here */ + unsigned int count; /* How many types */ + const char *name; /* Name of typelib */ + const char **type_names; + unsigned int *type_lengths; +} TYPELIB; + +extern my_ulonglong find_typeset(char *x, TYPELIB *typelib,int *error_position); +extern int find_type_or_exit(const char *x, TYPELIB *typelib, + const char *option); +extern int find_type(char *x, const TYPELIB *typelib, unsigned int full_name); +extern void make_type(char *to,unsigned int nr,TYPELIB *typelib); +extern const char *get_type(TYPELIB *typelib,unsigned int nr); +extern TYPELIB *copy_typelib(MEM_ROOT *root, TYPELIB *from); + +extern TYPELIB sql_protocol_typelib; + +#endif /* _typelib_h */ diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/violite.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/violite.h new file mode 100644 index 0000000..2720047 --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/violite.h @@ -0,0 +1,222 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* + * Vio Lite. + * Purpose: include file for Vio that will work with C and C++ + */ + +#ifndef vio_violite_h_ +#define vio_violite_h_ + +#include "my_net.h" /* needed because of struct in_addr */ + + +/* Simple vio interface in C; The functions are implemented in violite.c */ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +enum enum_vio_type +{ + VIO_CLOSED, VIO_TYPE_TCPIP, VIO_TYPE_SOCKET, VIO_TYPE_NAMEDPIPE, + VIO_TYPE_SSL, VIO_TYPE_SHARED_MEMORY +}; + + +#define VIO_LOCALHOST 1 /* a localhost connection */ +#define VIO_BUFFERED_READ 2 /* use buffered read */ +#define VIO_READ_BUFFER_SIZE 16384 /* size of read buffer */ + +Vio* vio_new(my_socket sd, enum enum_vio_type type, uint flags); +#ifdef __WIN__ +Vio* vio_new_win32pipe(HANDLE hPipe); +Vio* vio_new_win32shared_memory(NET *net,HANDLE handle_file_map, + HANDLE handle_map, + HANDLE event_server_wrote, + HANDLE event_server_read, + HANDLE event_client_wrote, + HANDLE event_client_read, + HANDLE event_conn_closed); +size_t vio_read_pipe(Vio *vio, uchar * buf, size_t size); +size_t vio_write_pipe(Vio *vio, const uchar * buf, size_t size); +int vio_close_pipe(Vio * vio); +#else +#define HANDLE void * +#endif /* __WIN__ */ + +void vio_delete(Vio* vio); +int vio_close(Vio* vio); +void vio_reset(Vio* vio, enum enum_vio_type type, + my_socket sd, HANDLE hPipe, uint flags); +size_t vio_read(Vio *vio, uchar * buf, size_t size); +size_t vio_read_buff(Vio *vio, uchar * buf, size_t size); +size_t vio_write(Vio *vio, const uchar * buf, size_t size); +int vio_blocking(Vio *vio, my_bool onoff, my_bool *old_mode); +my_bool vio_is_blocking(Vio *vio); +/* setsockopt TCP_NODELAY at IPPROTO_TCP level, when possible */ +int vio_fastsend(Vio *vio); +/* setsockopt SO_KEEPALIVE at SOL_SOCKET level, when possible */ +int vio_keepalive(Vio *vio, my_bool onoff); +/* Whenever we should retry the last read/write operation. */ +my_bool vio_should_retry(Vio *vio); +/* Check that operation was timed out */ +my_bool vio_was_interrupted(Vio *vio); +/* Short text description of the socket for those, who are curious.. */ +const char* vio_description(Vio *vio); +/* Return the type of the connection */ +enum enum_vio_type vio_type(Vio* vio); +/* Return last error number */ +int vio_errno(Vio*vio); +/* Get socket number */ +my_socket vio_fd(Vio*vio); +/* Remote peer's address and name in text form */ +my_bool vio_peer_addr(Vio *vio, char *buf, uint16 *port, size_t buflen); +my_bool vio_poll_read(Vio *vio,uint timeout); +my_bool vio_peek_read(Vio *vio, uint *bytes); +ssize_t vio_pending(Vio *vio); + +#ifdef HAVE_OPENSSL +#include +#if OPENSSL_VERSION_NUMBER < 0x0090700f +#define DES_cblock des_cblock +#define DES_key_schedule des_key_schedule +#define DES_set_key_unchecked(k,ks) des_set_key_unchecked((k),*(ks)) +#define DES_ede3_cbc_encrypt(i,o,l,k1,k2,k3,iv,e) des_ede3_cbc_encrypt((i),(o),(l),*(k1),*(k2),*(k3),(iv),(e)) +#endif + +#define HEADER_DES_LOCL_H dummy_something +#define YASSL_MYSQL_COMPATIBLE +#ifndef YASSL_PREFIX +#define YASSL_PREFIX +#endif +/* Set yaSSL to use same type as MySQL do for socket handles */ +typedef my_socket YASSL_SOCKET_T; +#define YASSL_SOCKET_T_DEFINED +#include +#include + +#ifndef EMBEDDED_LIBRARY + +struct st_VioSSLFd +{ + SSL_CTX *ssl_context; +}; + +int sslaccept(struct st_VioSSLFd*, Vio *, long timeout); +int sslconnect(struct st_VioSSLFd*, Vio *, long timeout); + +struct st_VioSSLFd +*new_VioSSLConnectorFd(const char *key_file, const char *cert_file, + const char *ca_file, const char *ca_path, + const char *cipher); +struct st_VioSSLFd +*new_VioSSLAcceptorFd(const char *key_file, const char *cert_file, + const char *ca_file,const char *ca_path, + const char *cipher); +void free_vio_ssl_acceptor_fd(struct st_VioSSLFd *fd); +#endif /* ! EMBEDDED_LIBRARY */ +#endif /* HAVE_OPENSSL */ + +#ifdef HAVE_SMEM +size_t vio_read_shared_memory(Vio *vio, uchar * buf, size_t size); +size_t vio_write_shared_memory(Vio *vio, const uchar * buf, size_t size); +int vio_close_shared_memory(Vio * vio); +#endif + +void vio_end(void); + +#ifdef __cplusplus +} +#endif + +#if !defined(DONT_MAP_VIO) +#define vio_delete(vio) (vio)->viodelete(vio) +#define vio_errno(vio) (vio)->vioerrno(vio) +#define vio_read(vio, buf, size) ((vio)->read)(vio,buf,size) +#define vio_write(vio, buf, size) ((vio)->write)(vio, buf, size) +#define vio_blocking(vio, set_blocking_mode, old_mode)\ + (vio)->vioblocking(vio, set_blocking_mode, old_mode) +#define vio_is_blocking(vio) (vio)->is_blocking(vio) +#define vio_fastsend(vio) (vio)->fastsend(vio) +#define vio_keepalive(vio, set_keep_alive) (vio)->viokeepalive(vio, set_keep_alive) +#define vio_should_retry(vio) (vio)->should_retry(vio) +#define vio_was_interrupted(vio) (vio)->was_interrupted(vio) +#define vio_close(vio) ((vio)->vioclose)(vio) +#define vio_peer_addr(vio, buf, prt, buflen) (vio)->peer_addr(vio, buf, prt, buflen) +#define vio_timeout(vio, which, seconds) (vio)->timeout(vio, which, seconds) +#endif /* !defined(DONT_MAP_VIO) */ + +/* This enumerator is used in parser - should be always visible */ +enum SSL_type +{ + SSL_TYPE_NOT_SPECIFIED= -1, + SSL_TYPE_NONE, + SSL_TYPE_ANY, + SSL_TYPE_X509, + SSL_TYPE_SPECIFIED +}; + + +/* HFTODO - hide this if we don't want client in embedded server */ +/* This structure is for every connection on both sides */ +struct st_vio +{ + my_socket sd; /* my_socket - real or imaginary */ + HANDLE hPipe; + my_bool localhost; /* Are we from localhost? */ + int fcntl_mode; /* Buffered fcntl(sd,F_GETFL) */ + struct sockaddr_storage local; /* Local internet address */ + struct sockaddr_storage remote; /* Remote internet address */ + int addrLen; /* Length of remote address */ + enum enum_vio_type type; /* Type of connection */ + char desc[30]; /* String description */ + char *read_buffer; /* buffer for vio_read_buff */ + char *read_pos; /* start of unfetched data in the + read buffer */ + char *read_end; /* end of unfetched data */ + /* function pointers. They are similar for socket/SSL/whatever */ + void (*viodelete)(Vio*); + int (*vioerrno)(Vio*); + size_t (*read)(Vio*, uchar *, size_t); + size_t (*write)(Vio*, const uchar *, size_t); + int (*vioblocking)(Vio*, my_bool, my_bool *); + my_bool (*is_blocking)(Vio*); + int (*viokeepalive)(Vio*, my_bool); + int (*fastsend)(Vio*); + my_bool (*peer_addr)(Vio*, char *, uint16*, size_t); + void (*in_addr)(Vio*, struct sockaddr_storage*); + my_bool (*should_retry)(Vio*); + my_bool (*was_interrupted)(Vio*); + int (*vioclose)(Vio*); + void (*timeout)(Vio*, unsigned int which, unsigned int timeout); +#ifdef HAVE_OPENSSL + void *ssl_arg; +#endif +#ifdef HAVE_SMEM + HANDLE handle_file_map; + char *handle_map; + HANDLE event_server_wrote; + HANDLE event_server_read; + HANDLE event_client_wrote; + HANDLE event_client_read; + HANDLE event_conn_closed; + size_t shared_memory_remain; + char *shared_memory_pos; + NET *net; +#endif /* HAVE_SMEM */ +}; +#endif /* vio_violite_h_ */ diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/waiting_threads.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/waiting_threads.h new file mode 100644 index 0000000..1e58052 --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/waiting_threads.h @@ -0,0 +1,130 @@ +/* Copyright (C) 2008 MySQL AB, 2008-2009 Sun Microsystems, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef _waiting_threads_h +#define _waiting_threads_h + +#include +#include + +#include + +C_MODE_START + +typedef struct st_wt_resource_id WT_RESOURCE_ID; +typedef struct st_wt_resource WT_RESOURCE; + +typedef struct st_wt_resource_type { + my_bool (*compare)(const void *a, const void *b); + const void *(*make_key)(const WT_RESOURCE_ID *id, uint *len); /* not used */ +} WT_RESOURCE_TYPE; + +struct st_wt_resource_id { + ulonglong value; + const WT_RESOURCE_TYPE *type; +}; +/* the below differs from sizeof(WT_RESOURCE_ID) by the amount of padding */ +#define sizeof_WT_RESOURCE_ID (sizeof(ulonglong)+sizeof(void*)) + +#define WT_WAIT_STATS 24 +#define WT_CYCLE_STATS 32 +extern ulonglong wt_wait_table[WT_WAIT_STATS]; +extern uint32 wt_wait_stats[WT_WAIT_STATS+1]; +extern uint32 wt_cycle_stats[2][WT_CYCLE_STATS+1]; +extern uint32 wt_success_stats; + +typedef struct st_wt_thd { + /* + XXX + there's no protection (mutex) against concurrent access of the + dynarray below. it is assumed that a caller will have it anyway + (not to protect this array but to protect its own - caller's - + data structures), and we'll get it for free. A caller needs to + ensure that a blocker won't release a resource before a blocked + thread starts waiting, which is usually done with a mutex. + + If the above assumption is wrong, we'll need to add a mutex here. + */ + DYNAMIC_ARRAY my_resources; + /* + 'waiting_for' is modified under waiting_for->lock, and only by thd itself + 'waiting_for' is read lock-free (using pinning protocol), but a thd object + can read its own 'waiting_for' without any locks or tricks. + */ + WT_RESOURCE *waiting_for; + LF_PINS *pins; + + /* pointers to values */ + const ulong *timeout_short; + const ulong *deadlock_search_depth_short; + const ulong *timeout_long; + const ulong *deadlock_search_depth_long; + + /* + weight relates to the desirability of a transaction being killed if it's + part of a deadlock. In a deadlock situation transactions with lower weights + are killed first. + + Examples of using the weight to implement different selection strategies: + + 1. Latest + Keep all weights equal. + 2. Random + Assight weights at random. + (variant: modify a weight randomly before every lock request) + 3. Youngest + Set weight to -NOW() + 4. Minimum locks + count locks granted in your lock manager, store the value as a weight + 5. Minimum work + depends on the definition of "work". For example, store the number + of rows modifies in this transaction (or a length of REDO log for a + transaction) as a weight. + + It is only statistically relevant and is not protected by any locks. + */ + ulong volatile weight; + /* + 'killed' is indirectly protected by waiting_for->lock because + a killed thread needs to clear its 'waiting_for' and thus needs a lock. + That is a thread needs an exclusive lock to read 'killed' reliably. + But other threads may change 'killed' from 0 to 1, a shared + lock is enough for that. + */ + my_bool killed; +#ifndef DBUG_OFF + const char *name; +#endif +} WT_THD; + +#define WT_TIMEOUT ETIMEDOUT +#define WT_OK 0 +#define WT_DEADLOCK -1 +#define WT_DEPTH_EXCEEDED -2 +#define WT_FREE_TO_GO -3 + +void wt_init(void); +void wt_end(void); +void wt_thd_lazy_init(WT_THD *, const ulong *, const ulong *, const ulong *, const ulong *); +void wt_thd_destroy(WT_THD *); +int wt_thd_will_wait_for(WT_THD *, WT_THD *, const WT_RESOURCE_ID *); +int wt_thd_cond_timedwait(WT_THD *, pthread_mutex_t *); +void wt_thd_release(WT_THD *, const WT_RESOURCE_ID *); +#define wt_thd_release_all(THD) wt_thd_release((THD), 0) +my_bool wt_resource_id_memcmp(const void *, const void *); + +C_MODE_END + +#endif diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/include/wqueue.h b/hdssd/external/win/mysql-connector-c-6.0.2/include/wqueue.h new file mode 100644 index 0000000..658f3d6 --- /dev/null +++ b/hdssd/external/win/mysql-connector-c-6.0.2/include/wqueue.h @@ -0,0 +1,27 @@ + +#ifndef _wqueue_h +#define _wqueue_h + +#include +#include + +/* info about requests in a waiting queue */ +typedef struct st_pagecache_wqueue +{ + struct st_my_thread_var *last_thread; /* circular list of waiting + threads */ +} WQUEUE; + +#ifdef THREAD +void wqueue_link_into_queue(WQUEUE *wqueue, struct st_my_thread_var *thread); +void wqueue_unlink_from_queue(WQUEUE *wqueue, struct st_my_thread_var *thread); +void wqueue_add_to_queue(WQUEUE *wqueue, struct st_my_thread_var *thread); +void wqueue_add_and_wait(WQUEUE *wqueue, + struct st_my_thread_var *thread, + pthread_mutex_t *lock); +void wqueue_release_queue(WQUEUE *wqueue); +void wqueue_release_one_locktype_from_queue(WQUEUE *wqueue); + +#endif + +#endif diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/libmysql.dll b/hdssd/external/win/mysql-connector-c-6.0.2/libmysql.dll new file mode 100644 index 0000000000000000000000000000000000000000..c45aa75c2df75f36c85d21edce66522147550230 GIT binary patch literal 2060288 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 wXrA!Yw}q#^?GTK6mrf9#Y7*xGqjD8+l^MFj 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 GoR^eI2 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

      N&{2h>`QR-`9?Ebz#^EqOYEyTKS+%>VJZ3 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 jrId>r( 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

      Z)ekp(cnPNjxoXO+t-r<* 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%0AWC<#dyDmvmA3 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 Rjy-{6PvF=S_=_j-KL8c&eT4u3 literal 0 HcmV?d00001 diff --git a/hdssd/external/win/mysql-connector-c-6.0.2/libmysql.lib b/hdssd/external/win/mysql-connector-c-6.0.2/libmysql.lib new file mode 100644 index 0000000000000000000000000000000000000000..f345b894d7104ca5b9ccf5249420fa2c6406f3c8 GIT binary patch literal 25594 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 aqZd7*_-Ty*?0?=w*5wV482)fafc_sk3ec$l literal 0 HcmV?d00001 diff --git a/hdssd/external/win/openssl/include/openssl/aes.h b/hdssd/external/win/openssl/include/openssl/aes.h new file mode 100644 index 0000000..faa66c4 --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/aes.h @@ -0,0 +1,149 @@ +/* crypto/aes/aes.h */ +/* ==================================================================== + * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + */ + +#ifndef HEADER_AES_H +# define HEADER_AES_H + +# include + +# ifdef OPENSSL_NO_AES +# error AES is disabled. +# endif + +# include + +# define AES_ENCRYPT 1 +# define AES_DECRYPT 0 + +/* + * Because array size can't be a const in C, the following two are macros. + * Both sizes are in bytes. + */ +# define AES_MAXNR 14 +# define AES_BLOCK_SIZE 16 + +#ifdef __cplusplus +extern "C" { +#endif + +/* This should be a hidden type, but EVP requires that the size be known */ +struct aes_key_st { +# ifdef AES_LONG + unsigned long rd_key[4 * (AES_MAXNR + 1)]; +# else + unsigned int rd_key[4 * (AES_MAXNR + 1)]; +# endif + int rounds; +}; +typedef struct aes_key_st AES_KEY; + +const char *AES_options(void); + +int AES_set_encrypt_key(const unsigned char *userKey, const int bits, + AES_KEY *key); +int AES_set_decrypt_key(const unsigned char *userKey, const int bits, + AES_KEY *key); + +int private_AES_set_encrypt_key(const unsigned char *userKey, const int bits, + AES_KEY *key); +int private_AES_set_decrypt_key(const unsigned char *userKey, const int bits, + AES_KEY *key); + +void AES_encrypt(const unsigned char *in, unsigned char *out, + const AES_KEY *key); +void AES_decrypt(const unsigned char *in, unsigned char *out, + const AES_KEY *key); + +void AES_ecb_encrypt(const unsigned char *in, unsigned char *out, + const AES_KEY *key, const int enc); +void AES_cbc_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const AES_KEY *key, + unsigned char *ivec, const int enc); +void AES_cfb128_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const AES_KEY *key, + unsigned char *ivec, int *num, const int enc); +void AES_cfb1_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const AES_KEY *key, + unsigned char *ivec, int *num, const int enc); +void AES_cfb8_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const AES_KEY *key, + unsigned char *ivec, int *num, const int enc); +void AES_ofb128_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const AES_KEY *key, + unsigned char *ivec, int *num); +void AES_ctr128_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const AES_KEY *key, + unsigned char ivec[AES_BLOCK_SIZE], + unsigned char ecount_buf[AES_BLOCK_SIZE], + unsigned int *num); +/* NB: the IV is _two_ blocks long */ +void AES_ige_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const AES_KEY *key, + unsigned char *ivec, const int enc); +/* NB: the IV is _four_ blocks long */ +void AES_bi_ige_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const AES_KEY *key, + const AES_KEY *key2, const unsigned char *ivec, + const int enc); + +int AES_wrap_key(AES_KEY *key, const unsigned char *iv, + unsigned char *out, + const unsigned char *in, unsigned int inlen); +int AES_unwrap_key(AES_KEY *key, const unsigned char *iv, + unsigned char *out, + const unsigned char *in, unsigned int inlen); + + +#ifdef __cplusplus +} +#endif + +#endif /* !HEADER_AES_H */ diff --git a/hdssd/external/win/openssl/include/openssl/asn1.h b/hdssd/external/win/openssl/include/openssl/asn1.h new file mode 100644 index 0000000..68e791f --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/asn1.h @@ -0,0 +1,1419 @@ +/* crypto/asn1/asn1.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_ASN1_H +# define HEADER_ASN1_H + +# include +# include +# ifndef OPENSSL_NO_BIO +# include +# endif +# include +# include + +# include + +# include +# ifndef OPENSSL_NO_DEPRECATED +# include +# endif + +# ifdef OPENSSL_BUILD_SHLIBCRYPTO +# undef OPENSSL_EXTERN +# define OPENSSL_EXTERN OPENSSL_EXPORT +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +# define V_ASN1_UNIVERSAL 0x00 +# define V_ASN1_APPLICATION 0x40 +# define V_ASN1_CONTEXT_SPECIFIC 0x80 +# define V_ASN1_PRIVATE 0xc0 + +# define V_ASN1_CONSTRUCTED 0x20 +# define V_ASN1_PRIMITIVE_TAG 0x1f +# define V_ASN1_PRIMATIVE_TAG 0x1f + +# define V_ASN1_APP_CHOOSE -2/* let the recipient choose */ +# define V_ASN1_OTHER -3/* used in ASN1_TYPE */ +# define V_ASN1_ANY -4/* used in ASN1 template code */ + +# define V_ASN1_NEG 0x100/* negative flag */ + +# define V_ASN1_UNDEF -1 +# define V_ASN1_EOC 0 +# define V_ASN1_BOOLEAN 1 /**/ +# define V_ASN1_INTEGER 2 +# define V_ASN1_NEG_INTEGER (2 | V_ASN1_NEG) +# define V_ASN1_BIT_STRING 3 +# define V_ASN1_OCTET_STRING 4 +# define V_ASN1_NULL 5 +# define V_ASN1_OBJECT 6 +# define V_ASN1_OBJECT_DESCRIPTOR 7 +# define V_ASN1_EXTERNAL 8 +# define V_ASN1_REAL 9 +# define V_ASN1_ENUMERATED 10 +# define V_ASN1_NEG_ENUMERATED (10 | V_ASN1_NEG) +# define V_ASN1_UTF8STRING 12 +# define V_ASN1_SEQUENCE 16 +# define V_ASN1_SET 17 +# define V_ASN1_NUMERICSTRING 18 /**/ +# define V_ASN1_PRINTABLESTRING 19 +# define V_ASN1_T61STRING 20 +# define V_ASN1_TELETEXSTRING 20/* alias */ +# define V_ASN1_VIDEOTEXSTRING 21 /**/ +# define V_ASN1_IA5STRING 22 +# define V_ASN1_UTCTIME 23 +# define V_ASN1_GENERALIZEDTIME 24 /**/ +# define V_ASN1_GRAPHICSTRING 25 /**/ +# define V_ASN1_ISO64STRING 26 /**/ +# define V_ASN1_VISIBLESTRING 26/* alias */ +# define V_ASN1_GENERALSTRING 27 /**/ +# define V_ASN1_UNIVERSALSTRING 28 /**/ +# define V_ASN1_BMPSTRING 30 +/* For use with d2i_ASN1_type_bytes() */ +# define B_ASN1_NUMERICSTRING 0x0001 +# define B_ASN1_PRINTABLESTRING 0x0002 +# define B_ASN1_T61STRING 0x0004 +# define B_ASN1_TELETEXSTRING 0x0004 +# define B_ASN1_VIDEOTEXSTRING 0x0008 +# define B_ASN1_IA5STRING 0x0010 +# define B_ASN1_GRAPHICSTRING 0x0020 +# define B_ASN1_ISO64STRING 0x0040 +# define B_ASN1_VISIBLESTRING 0x0040 +# define B_ASN1_GENERALSTRING 0x0080 +# define B_ASN1_UNIVERSALSTRING 0x0100 +# define B_ASN1_OCTET_STRING 0x0200 +# define B_ASN1_BIT_STRING 0x0400 +# define B_ASN1_BMPSTRING 0x0800 +# define B_ASN1_UNKNOWN 0x1000 +# define B_ASN1_UTF8STRING 0x2000 +# define B_ASN1_UTCTIME 0x4000 +# define B_ASN1_GENERALIZEDTIME 0x8000 +# define B_ASN1_SEQUENCE 0x10000 +/* For use with ASN1_mbstring_copy() */ +# define MBSTRING_FLAG 0x1000 +# define MBSTRING_UTF8 (MBSTRING_FLAG) +# define MBSTRING_ASC (MBSTRING_FLAG|1) +# define MBSTRING_BMP (MBSTRING_FLAG|2) +# define MBSTRING_UNIV (MBSTRING_FLAG|4) +# define SMIME_OLDMIME 0x400 +# define SMIME_CRLFEOL 0x800 +# define SMIME_STREAM 0x1000 + struct X509_algor_st; +DECLARE_STACK_OF(X509_ALGOR) + +# define DECLARE_ASN1_SET_OF(type)/* filled in by mkstack.pl */ +# define IMPLEMENT_ASN1_SET_OF(type)/* nothing, no longer needed */ + +/* + * We MUST make sure that, except for constness, asn1_ctx_st and + * asn1_const_ctx are exactly the same. Fortunately, as soon as the old ASN1 + * parsing macros are gone, we can throw this away as well... + */ +typedef struct asn1_ctx_st { + unsigned char *p; /* work char pointer */ + int eos; /* end of sequence read for indefinite + * encoding */ + int error; /* error code to use when returning an error */ + int inf; /* constructed if 0x20, indefinite is 0x21 */ + int tag; /* tag from last 'get object' */ + int xclass; /* class from last 'get object' */ + long slen; /* length of last 'get object' */ + unsigned char *max; /* largest value of p allowed */ + unsigned char *q; /* temporary variable */ + unsigned char **pp; /* variable */ + int line; /* used in error processing */ +} ASN1_CTX; + +typedef struct asn1_const_ctx_st { + const unsigned char *p; /* work char pointer */ + int eos; /* end of sequence read for indefinite + * encoding */ + int error; /* error code to use when returning an error */ + int inf; /* constructed if 0x20, indefinite is 0x21 */ + int tag; /* tag from last 'get object' */ + int xclass; /* class from last 'get object' */ + long slen; /* length of last 'get object' */ + const unsigned char *max; /* largest value of p allowed */ + const unsigned char *q; /* temporary variable */ + const unsigned char **pp; /* variable */ + int line; /* used in error processing */ +} ASN1_const_CTX; + +/* + * These are used internally in the ASN1_OBJECT to keep track of whether the + * names and data need to be free()ed + */ +# define ASN1_OBJECT_FLAG_DYNAMIC 0x01/* internal use */ +# define ASN1_OBJECT_FLAG_CRITICAL 0x02/* critical x509v3 object id */ +# define ASN1_OBJECT_FLAG_DYNAMIC_STRINGS 0x04/* internal use */ +# define ASN1_OBJECT_FLAG_DYNAMIC_DATA 0x08/* internal use */ +struct asn1_object_st { + const char *sn, *ln; + int nid; + int length; + const unsigned char *data; /* data remains const after init */ + int flags; /* Should we free this one */ +}; + +# define ASN1_STRING_FLAG_BITS_LEFT 0x08/* Set if 0x07 has bits left value */ +/* + * This indicates that the ASN1_STRING is not a real value but just a place + * holder for the location where indefinite length constructed data should be + * inserted in the memory buffer + */ +# define ASN1_STRING_FLAG_NDEF 0x010 + +/* + * This flag is used by the CMS code to indicate that a string is not + * complete and is a place holder for content when it had all been accessed. + * The flag will be reset when content has been written to it. + */ + +# define ASN1_STRING_FLAG_CONT 0x020 +/* + * This flag is used by ASN1 code to indicate an ASN1_STRING is an MSTRING + * type. + */ +# define ASN1_STRING_FLAG_MSTRING 0x040 +/* This is the base type that holds just about everything :-) */ +struct asn1_string_st { + int length; + int type; + unsigned char *data; + /* + * The value of the following field depends on the type being held. It + * is mostly being used for BIT_STRING so if the input data has a + * non-zero 'unused bits' value, it will be handled correctly + */ + long flags; +}; + +/* + * ASN1_ENCODING structure: this is used to save the received encoding of an + * ASN1 type. This is useful to get round problems with invalid encodings + * which can break signatures. + */ + +typedef struct ASN1_ENCODING_st { + unsigned char *enc; /* DER encoding */ + long len; /* Length of encoding */ + int modified; /* set to 1 if 'enc' is invalid */ +} ASN1_ENCODING; + +/* Used with ASN1 LONG type: if a long is set to this it is omitted */ +# define ASN1_LONG_UNDEF 0x7fffffffL + +# define STABLE_FLAGS_MALLOC 0x01 +# define STABLE_NO_MASK 0x02 +# define DIRSTRING_TYPE \ + (B_ASN1_PRINTABLESTRING|B_ASN1_T61STRING|B_ASN1_BMPSTRING|B_ASN1_UTF8STRING) +# define PKCS9STRING_TYPE (DIRSTRING_TYPE|B_ASN1_IA5STRING) + +typedef struct asn1_string_table_st { + int nid; + long minsize; + long maxsize; + unsigned long mask; + unsigned long flags; +} ASN1_STRING_TABLE; + +DECLARE_STACK_OF(ASN1_STRING_TABLE) + +/* size limits: this stuff is taken straight from RFC2459 */ + +# define ub_name 32768 +# define ub_common_name 64 +# define ub_locality_name 128 +# define ub_state_name 128 +# define ub_organization_name 64 +# define ub_organization_unit_name 64 +# define ub_title 64 +# define ub_email_address 128 + +/* + * Declarations for template structures: for full definitions see asn1t.h + */ +typedef struct ASN1_TEMPLATE_st ASN1_TEMPLATE; +typedef struct ASN1_TLC_st ASN1_TLC; +/* This is just an opaque pointer */ +typedef struct ASN1_VALUE_st ASN1_VALUE; + +/* Declare ASN1 functions: the implement macro in in asn1t.h */ + +# define DECLARE_ASN1_FUNCTIONS(type) DECLARE_ASN1_FUNCTIONS_name(type, type) + +# define DECLARE_ASN1_ALLOC_FUNCTIONS(type) \ + DECLARE_ASN1_ALLOC_FUNCTIONS_name(type, type) + +# define DECLARE_ASN1_FUNCTIONS_name(type, name) \ + DECLARE_ASN1_ALLOC_FUNCTIONS_name(type, name) \ + DECLARE_ASN1_ENCODE_FUNCTIONS(type, name, name) + +# define DECLARE_ASN1_FUNCTIONS_fname(type, itname, name) \ + DECLARE_ASN1_ALLOC_FUNCTIONS_name(type, name) \ + DECLARE_ASN1_ENCODE_FUNCTIONS(type, itname, name) + +# define DECLARE_ASN1_ENCODE_FUNCTIONS(type, itname, name) \ + type *d2i_##name(type **a, const unsigned char **in, long len); \ + int i2d_##name(type *a, unsigned char **out); \ + DECLARE_ASN1_ITEM(itname) + +# define DECLARE_ASN1_ENCODE_FUNCTIONS_const(type, name) \ + type *d2i_##name(type **a, const unsigned char **in, long len); \ + int i2d_##name(const type *a, unsigned char **out); \ + DECLARE_ASN1_ITEM(name) + +# define DECLARE_ASN1_NDEF_FUNCTION(name) \ + int i2d_##name##_NDEF(name *a, unsigned char **out); + +# define DECLARE_ASN1_FUNCTIONS_const(name) \ + DECLARE_ASN1_ALLOC_FUNCTIONS(name) \ + DECLARE_ASN1_ENCODE_FUNCTIONS_const(name, name) + +# define DECLARE_ASN1_ALLOC_FUNCTIONS_name(type, name) \ + type *name##_new(void); \ + void name##_free(type *a); + +# define DECLARE_ASN1_PRINT_FUNCTION(stname) \ + DECLARE_ASN1_PRINT_FUNCTION_fname(stname, stname) + +# define DECLARE_ASN1_PRINT_FUNCTION_fname(stname, fname) \ + int fname##_print_ctx(BIO *out, stname *x, int indent, \ + const ASN1_PCTX *pctx); + +# define D2I_OF(type) type *(*)(type **,const unsigned char **,long) +# define I2D_OF(type) int (*)(type *,unsigned char **) +# define I2D_OF_const(type) int (*)(const type *,unsigned char **) + +# define CHECKED_D2I_OF(type, d2i) \ + ((d2i_of_void*) (1 ? d2i : ((D2I_OF(type))0))) +# define CHECKED_I2D_OF(type, i2d) \ + ((i2d_of_void*) (1 ? i2d : ((I2D_OF(type))0))) +# define CHECKED_NEW_OF(type, xnew) \ + ((void *(*)(void)) (1 ? xnew : ((type *(*)(void))0))) +# define CHECKED_PTR_OF(type, p) \ + ((void*) (1 ? p : (type*)0)) +# define CHECKED_PPTR_OF(type, p) \ + ((void**) (1 ? p : (type**)0)) + +# define TYPEDEF_D2I_OF(type) typedef type *d2i_of_##type(type **,const unsigned char **,long) +# define TYPEDEF_I2D_OF(type) typedef int i2d_of_##type(type *,unsigned char **) +# define TYPEDEF_D2I2D_OF(type) TYPEDEF_D2I_OF(type); TYPEDEF_I2D_OF(type) + +TYPEDEF_D2I2D_OF(void); + +/*- + * The following macros and typedefs allow an ASN1_ITEM + * to be embedded in a structure and referenced. Since + * the ASN1_ITEM pointers need to be globally accessible + * (possibly from shared libraries) they may exist in + * different forms. On platforms that support it the + * ASN1_ITEM structure itself will be globally exported. + * Other platforms will export a function that returns + * an ASN1_ITEM pointer. + * + * To handle both cases transparently the macros below + * should be used instead of hard coding an ASN1_ITEM + * pointer in a structure. + * + * The structure will look like this: + * + * typedef struct SOMETHING_st { + * ... + * ASN1_ITEM_EXP *iptr; + * ... + * } SOMETHING; + * + * It would be initialised as e.g.: + * + * SOMETHING somevar = {...,ASN1_ITEM_ref(X509),...}; + * + * and the actual pointer extracted with: + * + * const ASN1_ITEM *it = ASN1_ITEM_ptr(somevar.iptr); + * + * Finally an ASN1_ITEM pointer can be extracted from an + * appropriate reference with: ASN1_ITEM_rptr(X509). This + * would be used when a function takes an ASN1_ITEM * argument. + * + */ + +# ifndef OPENSSL_EXPORT_VAR_AS_FUNCTION + +/* ASN1_ITEM pointer exported type */ +typedef const ASN1_ITEM ASN1_ITEM_EXP; + +/* Macro to obtain ASN1_ITEM pointer from exported type */ +# define ASN1_ITEM_ptr(iptr) (iptr) + +/* Macro to include ASN1_ITEM pointer from base type */ +# define ASN1_ITEM_ref(iptr) (&(iptr##_it)) + +# define ASN1_ITEM_rptr(ref) (&(ref##_it)) + +# define DECLARE_ASN1_ITEM(name) \ + OPENSSL_EXTERN const ASN1_ITEM name##_it; + +# else + +/* + * Platforms that can't easily handle shared global variables are declared as + * functions returning ASN1_ITEM pointers. + */ + +/* ASN1_ITEM pointer exported type */ +typedef const ASN1_ITEM *ASN1_ITEM_EXP (void); + +/* Macro to obtain ASN1_ITEM pointer from exported type */ +# define ASN1_ITEM_ptr(iptr) (iptr()) + +/* Macro to include ASN1_ITEM pointer from base type */ +# define ASN1_ITEM_ref(iptr) (iptr##_it) + +# define ASN1_ITEM_rptr(ref) (ref##_it()) + +# define DECLARE_ASN1_ITEM(name) \ + const ASN1_ITEM * name##_it(void); + +# endif + +/* Parameters used by ASN1_STRING_print_ex() */ + +/* + * These determine which characters to escape: RFC2253 special characters, + * control characters and MSB set characters + */ + +# define ASN1_STRFLGS_ESC_2253 1 +# define ASN1_STRFLGS_ESC_CTRL 2 +# define ASN1_STRFLGS_ESC_MSB 4 + +/* + * This flag determines how we do escaping: normally RC2253 backslash only, + * set this to use backslash and quote. + */ + +# define ASN1_STRFLGS_ESC_QUOTE 8 + +/* These three flags are internal use only. */ + +/* Character is a valid PrintableString character */ +# define CHARTYPE_PRINTABLESTRING 0x10 +/* Character needs escaping if it is the first character */ +# define CHARTYPE_FIRST_ESC_2253 0x20 +/* Character needs escaping if it is the last character */ +# define CHARTYPE_LAST_ESC_2253 0x40 + +/* + * NB the internal flags are safely reused below by flags handled at the top + * level. + */ + +/* + * If this is set we convert all character strings to UTF8 first + */ + +# define ASN1_STRFLGS_UTF8_CONVERT 0x10 + +/* + * If this is set we don't attempt to interpret content: just assume all + * strings are 1 byte per character. This will produce some pretty odd + * looking output! + */ + +# define ASN1_STRFLGS_IGNORE_TYPE 0x20 + +/* If this is set we include the string type in the output */ +# define ASN1_STRFLGS_SHOW_TYPE 0x40 + +/* + * This determines which strings to display and which to 'dump' (hex dump of + * content octets or DER encoding). We can only dump non character strings or + * everything. If we don't dump 'unknown' they are interpreted as character + * strings with 1 octet per character and are subject to the usual escaping + * options. + */ + +# define ASN1_STRFLGS_DUMP_ALL 0x80 +# define ASN1_STRFLGS_DUMP_UNKNOWN 0x100 + +/* + * These determine what 'dumping' does, we can dump the content octets or the + * DER encoding: both use the RFC2253 #XXXXX notation. + */ + +# define ASN1_STRFLGS_DUMP_DER 0x200 + +/* + * All the string flags consistent with RFC2253, escaping control characters + * isn't essential in RFC2253 but it is advisable anyway. + */ + +# define ASN1_STRFLGS_RFC2253 (ASN1_STRFLGS_ESC_2253 | \ + ASN1_STRFLGS_ESC_CTRL | \ + ASN1_STRFLGS_ESC_MSB | \ + ASN1_STRFLGS_UTF8_CONVERT | \ + ASN1_STRFLGS_DUMP_UNKNOWN | \ + ASN1_STRFLGS_DUMP_DER) + +DECLARE_STACK_OF(ASN1_INTEGER) +DECLARE_ASN1_SET_OF(ASN1_INTEGER) + +DECLARE_STACK_OF(ASN1_GENERALSTRING) + +typedef struct asn1_type_st { + int type; + union { + char *ptr; + ASN1_BOOLEAN boolean; + ASN1_STRING *asn1_string; + ASN1_OBJECT *object; + ASN1_INTEGER *integer; + ASN1_ENUMERATED *enumerated; + ASN1_BIT_STRING *bit_string; + ASN1_OCTET_STRING *octet_string; + ASN1_PRINTABLESTRING *printablestring; + ASN1_T61STRING *t61string; + ASN1_IA5STRING *ia5string; + ASN1_GENERALSTRING *generalstring; + ASN1_BMPSTRING *bmpstring; + ASN1_UNIVERSALSTRING *universalstring; + ASN1_UTCTIME *utctime; + ASN1_GENERALIZEDTIME *generalizedtime; + ASN1_VISIBLESTRING *visiblestring; + ASN1_UTF8STRING *utf8string; + /* + * set and sequence are left complete and still contain the set or + * sequence bytes + */ + ASN1_STRING *set; + ASN1_STRING *sequence; + ASN1_VALUE *asn1_value; + } value; +} ASN1_TYPE; + +DECLARE_STACK_OF(ASN1_TYPE) +DECLARE_ASN1_SET_OF(ASN1_TYPE) + +typedef STACK_OF(ASN1_TYPE) ASN1_SEQUENCE_ANY; + +DECLARE_ASN1_ENCODE_FUNCTIONS_const(ASN1_SEQUENCE_ANY, ASN1_SEQUENCE_ANY) +DECLARE_ASN1_ENCODE_FUNCTIONS_const(ASN1_SEQUENCE_ANY, ASN1_SET_ANY) + +typedef struct NETSCAPE_X509_st { + ASN1_OCTET_STRING *header; + X509 *cert; +} NETSCAPE_X509; + +/* This is used to contain a list of bit names */ +typedef struct BIT_STRING_BITNAME_st { + int bitnum; + const char *lname; + const char *sname; +} BIT_STRING_BITNAME; + +# define M_ASN1_STRING_length(x) ((x)->length) +# define M_ASN1_STRING_length_set(x, n) ((x)->length = (n)) +# define M_ASN1_STRING_type(x) ((x)->type) +# define M_ASN1_STRING_data(x) ((x)->data) + +/* Macros for string operations */ +# define M_ASN1_BIT_STRING_new() (ASN1_BIT_STRING *)\ + ASN1_STRING_type_new(V_ASN1_BIT_STRING) +# define M_ASN1_BIT_STRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_ASN1_BIT_STRING_dup(a) (ASN1_BIT_STRING *)\ + ASN1_STRING_dup((const ASN1_STRING *)a) +# define M_ASN1_BIT_STRING_cmp(a,b) ASN1_STRING_cmp(\ + (const ASN1_STRING *)a,(const ASN1_STRING *)b) +# define M_ASN1_BIT_STRING_set(a,b,c) ASN1_STRING_set((ASN1_STRING *)a,b,c) + +# define M_ASN1_INTEGER_new() (ASN1_INTEGER *)\ + ASN1_STRING_type_new(V_ASN1_INTEGER) +# define M_ASN1_INTEGER_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_ASN1_INTEGER_dup(a) (ASN1_INTEGER *)\ + ASN1_STRING_dup((const ASN1_STRING *)a) +# define M_ASN1_INTEGER_cmp(a,b) ASN1_STRING_cmp(\ + (const ASN1_STRING *)a,(const ASN1_STRING *)b) + +# define M_ASN1_ENUMERATED_new() (ASN1_ENUMERATED *)\ + ASN1_STRING_type_new(V_ASN1_ENUMERATED) +# define M_ASN1_ENUMERATED_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_ASN1_ENUMERATED_dup(a) (ASN1_ENUMERATED *)\ + ASN1_STRING_dup((const ASN1_STRING *)a) +# define M_ASN1_ENUMERATED_cmp(a,b) ASN1_STRING_cmp(\ + (const ASN1_STRING *)a,(const ASN1_STRING *)b) + +# define M_ASN1_OCTET_STRING_new() (ASN1_OCTET_STRING *)\ + ASN1_STRING_type_new(V_ASN1_OCTET_STRING) +# define M_ASN1_OCTET_STRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_ASN1_OCTET_STRING_dup(a) (ASN1_OCTET_STRING *)\ + ASN1_STRING_dup((const ASN1_STRING *)a) +# define M_ASN1_OCTET_STRING_cmp(a,b) ASN1_STRING_cmp(\ + (const ASN1_STRING *)a,(const ASN1_STRING *)b) +# define M_ASN1_OCTET_STRING_set(a,b,c) ASN1_STRING_set((ASN1_STRING *)a,b,c) +# define M_ASN1_OCTET_STRING_print(a,b) ASN1_STRING_print(a,(ASN1_STRING *)b) +# define M_i2d_ASN1_OCTET_STRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_OCTET_STRING,\ + V_ASN1_UNIVERSAL) + +# define B_ASN1_TIME \ + B_ASN1_UTCTIME | \ + B_ASN1_GENERALIZEDTIME + +# define B_ASN1_PRINTABLE \ + B_ASN1_NUMERICSTRING| \ + B_ASN1_PRINTABLESTRING| \ + B_ASN1_T61STRING| \ + B_ASN1_IA5STRING| \ + B_ASN1_BIT_STRING| \ + B_ASN1_UNIVERSALSTRING|\ + B_ASN1_BMPSTRING|\ + B_ASN1_UTF8STRING|\ + B_ASN1_SEQUENCE|\ + B_ASN1_UNKNOWN + +# define B_ASN1_DIRECTORYSTRING \ + B_ASN1_PRINTABLESTRING| \ + B_ASN1_TELETEXSTRING|\ + B_ASN1_BMPSTRING|\ + B_ASN1_UNIVERSALSTRING|\ + B_ASN1_UTF8STRING + +# define B_ASN1_DISPLAYTEXT \ + B_ASN1_IA5STRING| \ + B_ASN1_VISIBLESTRING| \ + B_ASN1_BMPSTRING|\ + B_ASN1_UTF8STRING + +# define M_ASN1_PRINTABLE_new() ASN1_STRING_type_new(V_ASN1_T61STRING) +# define M_ASN1_PRINTABLE_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_i2d_ASN1_PRINTABLE(a,pp) i2d_ASN1_bytes((ASN1_STRING *)a,\ + pp,a->type,V_ASN1_UNIVERSAL) +# define M_d2i_ASN1_PRINTABLE(a,pp,l) \ + d2i_ASN1_type_bytes((ASN1_STRING **)a,pp,l, \ + B_ASN1_PRINTABLE) + +# define M_DIRECTORYSTRING_new() ASN1_STRING_type_new(V_ASN1_PRINTABLESTRING) +# define M_DIRECTORYSTRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_i2d_DIRECTORYSTRING(a,pp) i2d_ASN1_bytes((ASN1_STRING *)a,\ + pp,a->type,V_ASN1_UNIVERSAL) +# define M_d2i_DIRECTORYSTRING(a,pp,l) \ + d2i_ASN1_type_bytes((ASN1_STRING **)a,pp,l, \ + B_ASN1_DIRECTORYSTRING) + +# define M_DISPLAYTEXT_new() ASN1_STRING_type_new(V_ASN1_VISIBLESTRING) +# define M_DISPLAYTEXT_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_i2d_DISPLAYTEXT(a,pp) i2d_ASN1_bytes((ASN1_STRING *)a,\ + pp,a->type,V_ASN1_UNIVERSAL) +# define M_d2i_DISPLAYTEXT(a,pp,l) \ + d2i_ASN1_type_bytes((ASN1_STRING **)a,pp,l, \ + B_ASN1_DISPLAYTEXT) + +# define M_ASN1_PRINTABLESTRING_new() (ASN1_PRINTABLESTRING *)\ + ASN1_STRING_type_new(V_ASN1_PRINTABLESTRING) +# define M_ASN1_PRINTABLESTRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_i2d_ASN1_PRINTABLESTRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_PRINTABLESTRING,\ + V_ASN1_UNIVERSAL) +# define M_d2i_ASN1_PRINTABLESTRING(a,pp,l) \ + (ASN1_PRINTABLESTRING *)d2i_ASN1_type_bytes\ + ((ASN1_STRING **)a,pp,l,B_ASN1_PRINTABLESTRING) + +# define M_ASN1_T61STRING_new() (ASN1_T61STRING *)\ + ASN1_STRING_type_new(V_ASN1_T61STRING) +# define M_ASN1_T61STRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_i2d_ASN1_T61STRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_T61STRING,\ + V_ASN1_UNIVERSAL) +# define M_d2i_ASN1_T61STRING(a,pp,l) \ + (ASN1_T61STRING *)d2i_ASN1_type_bytes\ + ((ASN1_STRING **)a,pp,l,B_ASN1_T61STRING) + +# define M_ASN1_IA5STRING_new() (ASN1_IA5STRING *)\ + ASN1_STRING_type_new(V_ASN1_IA5STRING) +# define M_ASN1_IA5STRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_ASN1_IA5STRING_dup(a) \ + (ASN1_IA5STRING *)ASN1_STRING_dup((const ASN1_STRING *)a) +# define M_i2d_ASN1_IA5STRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_IA5STRING,\ + V_ASN1_UNIVERSAL) +# define M_d2i_ASN1_IA5STRING(a,pp,l) \ + (ASN1_IA5STRING *)d2i_ASN1_type_bytes((ASN1_STRING **)a,pp,l,\ + B_ASN1_IA5STRING) + +# define M_ASN1_UTCTIME_new() (ASN1_UTCTIME *)\ + ASN1_STRING_type_new(V_ASN1_UTCTIME) +# define M_ASN1_UTCTIME_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_ASN1_UTCTIME_dup(a) (ASN1_UTCTIME *)\ + ASN1_STRING_dup((const ASN1_STRING *)a) + +# define M_ASN1_GENERALIZEDTIME_new() (ASN1_GENERALIZEDTIME *)\ + ASN1_STRING_type_new(V_ASN1_GENERALIZEDTIME) +# define M_ASN1_GENERALIZEDTIME_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_ASN1_GENERALIZEDTIME_dup(a) (ASN1_GENERALIZEDTIME *)ASN1_STRING_dup(\ + (const ASN1_STRING *)a) + +# define M_ASN1_TIME_new() (ASN1_TIME *)\ + ASN1_STRING_type_new(V_ASN1_UTCTIME) +# define M_ASN1_TIME_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_ASN1_TIME_dup(a) (ASN1_TIME *)\ + ASN1_STRING_dup((const ASN1_STRING *)a) + +# define M_ASN1_GENERALSTRING_new() (ASN1_GENERALSTRING *)\ + ASN1_STRING_type_new(V_ASN1_GENERALSTRING) +# define M_ASN1_GENERALSTRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_i2d_ASN1_GENERALSTRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_GENERALSTRING,\ + V_ASN1_UNIVERSAL) +# define M_d2i_ASN1_GENERALSTRING(a,pp,l) \ + (ASN1_GENERALSTRING *)d2i_ASN1_type_bytes\ + ((ASN1_STRING **)a,pp,l,B_ASN1_GENERALSTRING) + +# define M_ASN1_UNIVERSALSTRING_new() (ASN1_UNIVERSALSTRING *)\ + ASN1_STRING_type_new(V_ASN1_UNIVERSALSTRING) +# define M_ASN1_UNIVERSALSTRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_i2d_ASN1_UNIVERSALSTRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_UNIVERSALSTRING,\ + V_ASN1_UNIVERSAL) +# define M_d2i_ASN1_UNIVERSALSTRING(a,pp,l) \ + (ASN1_UNIVERSALSTRING *)d2i_ASN1_type_bytes\ + ((ASN1_STRING **)a,pp,l,B_ASN1_UNIVERSALSTRING) + +# define M_ASN1_BMPSTRING_new() (ASN1_BMPSTRING *)\ + ASN1_STRING_type_new(V_ASN1_BMPSTRING) +# define M_ASN1_BMPSTRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_i2d_ASN1_BMPSTRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_BMPSTRING,\ + V_ASN1_UNIVERSAL) +# define M_d2i_ASN1_BMPSTRING(a,pp,l) \ + (ASN1_BMPSTRING *)d2i_ASN1_type_bytes\ + ((ASN1_STRING **)a,pp,l,B_ASN1_BMPSTRING) + +# define M_ASN1_VISIBLESTRING_new() (ASN1_VISIBLESTRING *)\ + ASN1_STRING_type_new(V_ASN1_VISIBLESTRING) +# define M_ASN1_VISIBLESTRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_i2d_ASN1_VISIBLESTRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_VISIBLESTRING,\ + V_ASN1_UNIVERSAL) +# define M_d2i_ASN1_VISIBLESTRING(a,pp,l) \ + (ASN1_VISIBLESTRING *)d2i_ASN1_type_bytes\ + ((ASN1_STRING **)a,pp,l,B_ASN1_VISIBLESTRING) + +# define M_ASN1_UTF8STRING_new() (ASN1_UTF8STRING *)\ + ASN1_STRING_type_new(V_ASN1_UTF8STRING) +# define M_ASN1_UTF8STRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_i2d_ASN1_UTF8STRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_UTF8STRING,\ + V_ASN1_UNIVERSAL) +# define M_d2i_ASN1_UTF8STRING(a,pp,l) \ + (ASN1_UTF8STRING *)d2i_ASN1_type_bytes\ + ((ASN1_STRING **)a,pp,l,B_ASN1_UTF8STRING) + + /* for the is_set parameter to i2d_ASN1_SET */ +# define IS_SEQUENCE 0 +# define IS_SET 1 + +DECLARE_ASN1_FUNCTIONS_fname(ASN1_TYPE, ASN1_ANY, ASN1_TYPE) + +int ASN1_TYPE_get(ASN1_TYPE *a); +void ASN1_TYPE_set(ASN1_TYPE *a, int type, void *value); +int ASN1_TYPE_set1(ASN1_TYPE *a, int type, const void *value); +int ASN1_TYPE_cmp(const ASN1_TYPE *a, const ASN1_TYPE *b); + +ASN1_OBJECT *ASN1_OBJECT_new(void); +void ASN1_OBJECT_free(ASN1_OBJECT *a); +int i2d_ASN1_OBJECT(ASN1_OBJECT *a, unsigned char **pp); +ASN1_OBJECT *c2i_ASN1_OBJECT(ASN1_OBJECT **a, const unsigned char **pp, + long length); +ASN1_OBJECT *d2i_ASN1_OBJECT(ASN1_OBJECT **a, const unsigned char **pp, + long length); + +DECLARE_ASN1_ITEM(ASN1_OBJECT) + +DECLARE_STACK_OF(ASN1_OBJECT) +DECLARE_ASN1_SET_OF(ASN1_OBJECT) + +ASN1_STRING *ASN1_STRING_new(void); +void ASN1_STRING_free(ASN1_STRING *a); +void ASN1_STRING_clear_free(ASN1_STRING *a); +int ASN1_STRING_copy(ASN1_STRING *dst, const ASN1_STRING *str); +ASN1_STRING *ASN1_STRING_dup(const ASN1_STRING *a); +ASN1_STRING *ASN1_STRING_type_new(int type); +int ASN1_STRING_cmp(const ASN1_STRING *a, const ASN1_STRING *b); + /* + * Since this is used to store all sorts of things, via macros, for now, + * make its data void * + */ +int ASN1_STRING_set(ASN1_STRING *str, const void *data, int len); +void ASN1_STRING_set0(ASN1_STRING *str, void *data, int len); +int ASN1_STRING_length(const ASN1_STRING *x); +void ASN1_STRING_length_set(ASN1_STRING *x, int n); +int ASN1_STRING_type(ASN1_STRING *x); +unsigned char *ASN1_STRING_data(ASN1_STRING *x); + +DECLARE_ASN1_FUNCTIONS(ASN1_BIT_STRING) +int i2c_ASN1_BIT_STRING(ASN1_BIT_STRING *a, unsigned char **pp); +ASN1_BIT_STRING *c2i_ASN1_BIT_STRING(ASN1_BIT_STRING **a, + const unsigned char **pp, long length); +int ASN1_BIT_STRING_set(ASN1_BIT_STRING *a, unsigned char *d, int length); +int ASN1_BIT_STRING_set_bit(ASN1_BIT_STRING *a, int n, int value); +int ASN1_BIT_STRING_get_bit(ASN1_BIT_STRING *a, int n); +int ASN1_BIT_STRING_check(ASN1_BIT_STRING *a, + unsigned char *flags, int flags_len); + +# ifndef OPENSSL_NO_BIO +int ASN1_BIT_STRING_name_print(BIO *out, ASN1_BIT_STRING *bs, + BIT_STRING_BITNAME *tbl, int indent); +# endif +int ASN1_BIT_STRING_num_asc(char *name, BIT_STRING_BITNAME *tbl); +int ASN1_BIT_STRING_set_asc(ASN1_BIT_STRING *bs, char *name, int value, + BIT_STRING_BITNAME *tbl); + +int i2d_ASN1_BOOLEAN(int a, unsigned char **pp); +int d2i_ASN1_BOOLEAN(int *a, const unsigned char **pp, long length); + +DECLARE_ASN1_FUNCTIONS(ASN1_INTEGER) +int i2c_ASN1_INTEGER(ASN1_INTEGER *a, unsigned char **pp); +ASN1_INTEGER *c2i_ASN1_INTEGER(ASN1_INTEGER **a, const unsigned char **pp, + long length); +ASN1_INTEGER *d2i_ASN1_UINTEGER(ASN1_INTEGER **a, const unsigned char **pp, + long length); +ASN1_INTEGER *ASN1_INTEGER_dup(const ASN1_INTEGER *x); +int ASN1_INTEGER_cmp(const ASN1_INTEGER *x, const ASN1_INTEGER *y); + +DECLARE_ASN1_FUNCTIONS(ASN1_ENUMERATED) + +int ASN1_UTCTIME_check(const ASN1_UTCTIME *a); +ASN1_UTCTIME *ASN1_UTCTIME_set(ASN1_UTCTIME *s, time_t t); +ASN1_UTCTIME *ASN1_UTCTIME_adj(ASN1_UTCTIME *s, time_t t, + int offset_day, long offset_sec); +int ASN1_UTCTIME_set_string(ASN1_UTCTIME *s, const char *str); +int ASN1_UTCTIME_cmp_time_t(const ASN1_UTCTIME *s, time_t t); +# if 0 +time_t ASN1_UTCTIME_get(const ASN1_UTCTIME *s); +# endif + +int ASN1_GENERALIZEDTIME_check(const ASN1_GENERALIZEDTIME *a); +ASN1_GENERALIZEDTIME *ASN1_GENERALIZEDTIME_set(ASN1_GENERALIZEDTIME *s, + time_t t); +ASN1_GENERALIZEDTIME *ASN1_GENERALIZEDTIME_adj(ASN1_GENERALIZEDTIME *s, + time_t t, int offset_day, + long offset_sec); +int ASN1_GENERALIZEDTIME_set_string(ASN1_GENERALIZEDTIME *s, const char *str); +int ASN1_TIME_diff(int *pday, int *psec, + const ASN1_TIME *from, const ASN1_TIME *to); + +DECLARE_ASN1_FUNCTIONS(ASN1_OCTET_STRING) +ASN1_OCTET_STRING *ASN1_OCTET_STRING_dup(const ASN1_OCTET_STRING *a); +int ASN1_OCTET_STRING_cmp(const ASN1_OCTET_STRING *a, + const ASN1_OCTET_STRING *b); +int ASN1_OCTET_STRING_set(ASN1_OCTET_STRING *str, const unsigned char *data, + int len); + +DECLARE_ASN1_FUNCTIONS(ASN1_VISIBLESTRING) +DECLARE_ASN1_FUNCTIONS(ASN1_UNIVERSALSTRING) +DECLARE_ASN1_FUNCTIONS(ASN1_UTF8STRING) +DECLARE_ASN1_FUNCTIONS(ASN1_NULL) +DECLARE_ASN1_FUNCTIONS(ASN1_BMPSTRING) + +int UTF8_getc(const unsigned char *str, int len, unsigned long *val); +int UTF8_putc(unsigned char *str, int len, unsigned long value); + +DECLARE_ASN1_FUNCTIONS_name(ASN1_STRING, ASN1_PRINTABLE) + +DECLARE_ASN1_FUNCTIONS_name(ASN1_STRING, DIRECTORYSTRING) +DECLARE_ASN1_FUNCTIONS_name(ASN1_STRING, DISPLAYTEXT) +DECLARE_ASN1_FUNCTIONS(ASN1_PRINTABLESTRING) +DECLARE_ASN1_FUNCTIONS(ASN1_T61STRING) +DECLARE_ASN1_FUNCTIONS(ASN1_IA5STRING) +DECLARE_ASN1_FUNCTIONS(ASN1_GENERALSTRING) +DECLARE_ASN1_FUNCTIONS(ASN1_UTCTIME) +DECLARE_ASN1_FUNCTIONS(ASN1_GENERALIZEDTIME) +DECLARE_ASN1_FUNCTIONS(ASN1_TIME) + +DECLARE_ASN1_ITEM(ASN1_OCTET_STRING_NDEF) + +ASN1_TIME *ASN1_TIME_set(ASN1_TIME *s, time_t t); +ASN1_TIME *ASN1_TIME_adj(ASN1_TIME *s, time_t t, + int offset_day, long offset_sec); +int ASN1_TIME_check(ASN1_TIME *t); +ASN1_GENERALIZEDTIME *ASN1_TIME_to_generalizedtime(ASN1_TIME *t, ASN1_GENERALIZEDTIME + **out); +int ASN1_TIME_set_string(ASN1_TIME *s, const char *str); + +int i2d_ASN1_SET(STACK_OF(OPENSSL_BLOCK) *a, unsigned char **pp, + i2d_of_void *i2d, int ex_tag, int ex_class, int is_set); +STACK_OF(OPENSSL_BLOCK) *d2i_ASN1_SET(STACK_OF(OPENSSL_BLOCK) **a, + const unsigned char **pp, + long length, d2i_of_void *d2i, + void (*free_func) (OPENSSL_BLOCK), + int ex_tag, int ex_class); + +# ifndef OPENSSL_NO_BIO +int i2a_ASN1_INTEGER(BIO *bp, ASN1_INTEGER *a); +int a2i_ASN1_INTEGER(BIO *bp, ASN1_INTEGER *bs, char *buf, int size); +int i2a_ASN1_ENUMERATED(BIO *bp, ASN1_ENUMERATED *a); +int a2i_ASN1_ENUMERATED(BIO *bp, ASN1_ENUMERATED *bs, char *buf, int size); +int i2a_ASN1_OBJECT(BIO *bp, ASN1_OBJECT *a); +int a2i_ASN1_STRING(BIO *bp, ASN1_STRING *bs, char *buf, int size); +int i2a_ASN1_STRING(BIO *bp, ASN1_STRING *a, int type); +# endif +int i2t_ASN1_OBJECT(char *buf, int buf_len, ASN1_OBJECT *a); + +int a2d_ASN1_OBJECT(unsigned char *out, int olen, const char *buf, int num); +ASN1_OBJECT *ASN1_OBJECT_create(int nid, unsigned char *data, int len, + const char *sn, const char *ln); + +int ASN1_INTEGER_set(ASN1_INTEGER *a, long v); +long ASN1_INTEGER_get(const ASN1_INTEGER *a); +ASN1_INTEGER *BN_to_ASN1_INTEGER(const BIGNUM *bn, ASN1_INTEGER *ai); +BIGNUM *ASN1_INTEGER_to_BN(const ASN1_INTEGER *ai, BIGNUM *bn); + +int ASN1_ENUMERATED_set(ASN1_ENUMERATED *a, long v); +long ASN1_ENUMERATED_get(ASN1_ENUMERATED *a); +ASN1_ENUMERATED *BN_to_ASN1_ENUMERATED(BIGNUM *bn, ASN1_ENUMERATED *ai); +BIGNUM *ASN1_ENUMERATED_to_BN(ASN1_ENUMERATED *ai, BIGNUM *bn); + +/* General */ +/* given a string, return the correct type, max is the maximum length */ +int ASN1_PRINTABLE_type(const unsigned char *s, int max); + +int i2d_ASN1_bytes(ASN1_STRING *a, unsigned char **pp, int tag, int xclass); +ASN1_STRING *d2i_ASN1_bytes(ASN1_STRING **a, const unsigned char **pp, + long length, int Ptag, int Pclass); +unsigned long ASN1_tag2bit(int tag); +/* type is one or more of the B_ASN1_ values. */ +ASN1_STRING *d2i_ASN1_type_bytes(ASN1_STRING **a, const unsigned char **pp, + long length, int type); + +/* PARSING */ +int asn1_Finish(ASN1_CTX *c); +int asn1_const_Finish(ASN1_const_CTX *c); + +/* SPECIALS */ +int ASN1_get_object(const unsigned char **pp, long *plength, int *ptag, + int *pclass, long omax); +int ASN1_check_infinite_end(unsigned char **p, long len); +int ASN1_const_check_infinite_end(const unsigned char **p, long len); +void ASN1_put_object(unsigned char **pp, int constructed, int length, + int tag, int xclass); +int ASN1_put_eoc(unsigned char **pp); +int ASN1_object_size(int constructed, int length, int tag); + +/* Used to implement other functions */ +void *ASN1_dup(i2d_of_void *i2d, d2i_of_void *d2i, void *x); + +# define ASN1_dup_of(type,i2d,d2i,x) \ + ((type*)ASN1_dup(CHECKED_I2D_OF(type, i2d), \ + CHECKED_D2I_OF(type, d2i), \ + CHECKED_PTR_OF(type, x))) + +# define ASN1_dup_of_const(type,i2d,d2i,x) \ + ((type*)ASN1_dup(CHECKED_I2D_OF(const type, i2d), \ + CHECKED_D2I_OF(type, d2i), \ + CHECKED_PTR_OF(const type, x))) + +void *ASN1_item_dup(const ASN1_ITEM *it, void *x); + +/* ASN1 alloc/free macros for when a type is only used internally */ + +# define M_ASN1_new_of(type) (type *)ASN1_item_new(ASN1_ITEM_rptr(type)) +# define M_ASN1_free_of(x, type) \ + ASN1_item_free(CHECKED_PTR_OF(type, x), ASN1_ITEM_rptr(type)) + +# ifndef OPENSSL_NO_FP_API +void *ASN1_d2i_fp(void *(*xnew) (void), d2i_of_void *d2i, FILE *in, void **x); + +# define ASN1_d2i_fp_of(type,xnew,d2i,in,x) \ + ((type*)ASN1_d2i_fp(CHECKED_NEW_OF(type, xnew), \ + CHECKED_D2I_OF(type, d2i), \ + in, \ + CHECKED_PPTR_OF(type, x))) + +void *ASN1_item_d2i_fp(const ASN1_ITEM *it, FILE *in, void *x); +int ASN1_i2d_fp(i2d_of_void *i2d, FILE *out, void *x); + +# define ASN1_i2d_fp_of(type,i2d,out,x) \ + (ASN1_i2d_fp(CHECKED_I2D_OF(type, i2d), \ + out, \ + CHECKED_PTR_OF(type, x))) + +# define ASN1_i2d_fp_of_const(type,i2d,out,x) \ + (ASN1_i2d_fp(CHECKED_I2D_OF(const type, i2d), \ + out, \ + CHECKED_PTR_OF(const type, x))) + +int ASN1_item_i2d_fp(const ASN1_ITEM *it, FILE *out, void *x); +int ASN1_STRING_print_ex_fp(FILE *fp, ASN1_STRING *str, unsigned long flags); +# endif + +int ASN1_STRING_to_UTF8(unsigned char **out, ASN1_STRING *in); + +# ifndef OPENSSL_NO_BIO +void *ASN1_d2i_bio(void *(*xnew) (void), d2i_of_void *d2i, BIO *in, void **x); + +# define ASN1_d2i_bio_of(type,xnew,d2i,in,x) \ + ((type*)ASN1_d2i_bio( CHECKED_NEW_OF(type, xnew), \ + CHECKED_D2I_OF(type, d2i), \ + in, \ + CHECKED_PPTR_OF(type, x))) + +void *ASN1_item_d2i_bio(const ASN1_ITEM *it, BIO *in, void *x); +int ASN1_i2d_bio(i2d_of_void *i2d, BIO *out, unsigned char *x); + +# define ASN1_i2d_bio_of(type,i2d,out,x) \ + (ASN1_i2d_bio(CHECKED_I2D_OF(type, i2d), \ + out, \ + CHECKED_PTR_OF(type, x))) + +# define ASN1_i2d_bio_of_const(type,i2d,out,x) \ + (ASN1_i2d_bio(CHECKED_I2D_OF(const type, i2d), \ + out, \ + CHECKED_PTR_OF(const type, x))) + +int ASN1_item_i2d_bio(const ASN1_ITEM *it, BIO *out, void *x); +int ASN1_UTCTIME_print(BIO *fp, const ASN1_UTCTIME *a); +int ASN1_GENERALIZEDTIME_print(BIO *fp, const ASN1_GENERALIZEDTIME *a); +int ASN1_TIME_print(BIO *fp, const ASN1_TIME *a); +int ASN1_STRING_print(BIO *bp, const ASN1_STRING *v); +int ASN1_STRING_print_ex(BIO *out, ASN1_STRING *str, unsigned long flags); +int ASN1_bn_print(BIO *bp, const char *number, const BIGNUM *num, + unsigned char *buf, int off); +int ASN1_parse(BIO *bp, const unsigned char *pp, long len, int indent); +int ASN1_parse_dump(BIO *bp, const unsigned char *pp, long len, int indent, + int dump); +# endif +const char *ASN1_tag2str(int tag); + +/* Used to load and write netscape format cert */ + +DECLARE_ASN1_FUNCTIONS(NETSCAPE_X509) + +int ASN1_UNIVERSALSTRING_to_string(ASN1_UNIVERSALSTRING *s); + +int ASN1_TYPE_set_octetstring(ASN1_TYPE *a, unsigned char *data, int len); +int ASN1_TYPE_get_octetstring(ASN1_TYPE *a, unsigned char *data, int max_len); +int ASN1_TYPE_set_int_octetstring(ASN1_TYPE *a, long num, + unsigned char *data, int len); +int ASN1_TYPE_get_int_octetstring(ASN1_TYPE *a, long *num, + unsigned char *data, int max_len); + +STACK_OF(OPENSSL_BLOCK) *ASN1_seq_unpack(const unsigned char *buf, int len, + d2i_of_void *d2i, + void (*free_func) (OPENSSL_BLOCK)); +unsigned char *ASN1_seq_pack(STACK_OF(OPENSSL_BLOCK) *safes, i2d_of_void *i2d, + unsigned char **buf, int *len); +void *ASN1_unpack_string(ASN1_STRING *oct, d2i_of_void *d2i); +void *ASN1_item_unpack(ASN1_STRING *oct, const ASN1_ITEM *it); +ASN1_STRING *ASN1_pack_string(void *obj, i2d_of_void *i2d, + ASN1_OCTET_STRING **oct); + +# define ASN1_pack_string_of(type,obj,i2d,oct) \ + (ASN1_pack_string(CHECKED_PTR_OF(type, obj), \ + CHECKED_I2D_OF(type, i2d), \ + oct)) + +ASN1_STRING *ASN1_item_pack(void *obj, const ASN1_ITEM *it, + ASN1_OCTET_STRING **oct); + +void ASN1_STRING_set_default_mask(unsigned long mask); +int ASN1_STRING_set_default_mask_asc(const char *p); +unsigned long ASN1_STRING_get_default_mask(void); +int ASN1_mbstring_copy(ASN1_STRING **out, const unsigned char *in, int len, + int inform, unsigned long mask); +int ASN1_mbstring_ncopy(ASN1_STRING **out, const unsigned char *in, int len, + int inform, unsigned long mask, + long minsize, long maxsize); + +ASN1_STRING *ASN1_STRING_set_by_NID(ASN1_STRING **out, + const unsigned char *in, int inlen, + int inform, int nid); +ASN1_STRING_TABLE *ASN1_STRING_TABLE_get(int nid); +int ASN1_STRING_TABLE_add(int, long, long, unsigned long, unsigned long); +void ASN1_STRING_TABLE_cleanup(void); + +/* ASN1 template functions */ + +/* Old API compatible functions */ +ASN1_VALUE *ASN1_item_new(const ASN1_ITEM *it); +void ASN1_item_free(ASN1_VALUE *val, const ASN1_ITEM *it); +ASN1_VALUE *ASN1_item_d2i(ASN1_VALUE **val, const unsigned char **in, + long len, const ASN1_ITEM *it); +int ASN1_item_i2d(ASN1_VALUE *val, unsigned char **out, const ASN1_ITEM *it); +int ASN1_item_ndef_i2d(ASN1_VALUE *val, unsigned char **out, + const ASN1_ITEM *it); + +void ASN1_add_oid_module(void); + +ASN1_TYPE *ASN1_generate_nconf(char *str, CONF *nconf); +ASN1_TYPE *ASN1_generate_v3(char *str, X509V3_CTX *cnf); + +/* ASN1 Print flags */ + +/* Indicate missing OPTIONAL fields */ +# define ASN1_PCTX_FLAGS_SHOW_ABSENT 0x001 +/* Mark start and end of SEQUENCE */ +# define ASN1_PCTX_FLAGS_SHOW_SEQUENCE 0x002 +/* Mark start and end of SEQUENCE/SET OF */ +# define ASN1_PCTX_FLAGS_SHOW_SSOF 0x004 +/* Show the ASN1 type of primitives */ +# define ASN1_PCTX_FLAGS_SHOW_TYPE 0x008 +/* Don't show ASN1 type of ANY */ +# define ASN1_PCTX_FLAGS_NO_ANY_TYPE 0x010 +/* Don't show ASN1 type of MSTRINGs */ +# define ASN1_PCTX_FLAGS_NO_MSTRING_TYPE 0x020 +/* Don't show field names in SEQUENCE */ +# define ASN1_PCTX_FLAGS_NO_FIELD_NAME 0x040 +/* Show structure names of each SEQUENCE field */ +# define ASN1_PCTX_FLAGS_SHOW_FIELD_STRUCT_NAME 0x080 +/* Don't show structure name even at top level */ +# define ASN1_PCTX_FLAGS_NO_STRUCT_NAME 0x100 + +int ASN1_item_print(BIO *out, ASN1_VALUE *ifld, int indent, + const ASN1_ITEM *it, const ASN1_PCTX *pctx); +ASN1_PCTX *ASN1_PCTX_new(void); +void ASN1_PCTX_free(ASN1_PCTX *p); +unsigned long ASN1_PCTX_get_flags(ASN1_PCTX *p); +void ASN1_PCTX_set_flags(ASN1_PCTX *p, unsigned long flags); +unsigned long ASN1_PCTX_get_nm_flags(ASN1_PCTX *p); +void ASN1_PCTX_set_nm_flags(ASN1_PCTX *p, unsigned long flags); +unsigned long ASN1_PCTX_get_cert_flags(ASN1_PCTX *p); +void ASN1_PCTX_set_cert_flags(ASN1_PCTX *p, unsigned long flags); +unsigned long ASN1_PCTX_get_oid_flags(ASN1_PCTX *p); +void ASN1_PCTX_set_oid_flags(ASN1_PCTX *p, unsigned long flags); +unsigned long ASN1_PCTX_get_str_flags(ASN1_PCTX *p); +void ASN1_PCTX_set_str_flags(ASN1_PCTX *p, unsigned long flags); + +BIO_METHOD *BIO_f_asn1(void); + +BIO *BIO_new_NDEF(BIO *out, ASN1_VALUE *val, const ASN1_ITEM *it); + +int i2d_ASN1_bio_stream(BIO *out, ASN1_VALUE *val, BIO *in, int flags, + const ASN1_ITEM *it); +int PEM_write_bio_ASN1_stream(BIO *out, ASN1_VALUE *val, BIO *in, int flags, + const char *hdr, const ASN1_ITEM *it); +int SMIME_write_ASN1(BIO *bio, ASN1_VALUE *val, BIO *data, int flags, + int ctype_nid, int econt_nid, + STACK_OF(X509_ALGOR) *mdalgs, const ASN1_ITEM *it); +ASN1_VALUE *SMIME_read_ASN1(BIO *bio, BIO **bcont, const ASN1_ITEM *it); +int SMIME_crlf_copy(BIO *in, BIO *out, int flags); +int SMIME_text(BIO *in, BIO *out); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_ASN1_strings(void); + +/* Error codes for the ASN1 functions. */ + +/* Function codes. */ +# define ASN1_F_A2D_ASN1_OBJECT 100 +# define ASN1_F_A2I_ASN1_ENUMERATED 101 +# define ASN1_F_A2I_ASN1_INTEGER 102 +# define ASN1_F_A2I_ASN1_STRING 103 +# define ASN1_F_APPEND_EXP 176 +# define ASN1_F_ASN1_BIT_STRING_SET_BIT 183 +# define ASN1_F_ASN1_CB 177 +# define ASN1_F_ASN1_CHECK_TLEN 104 +# define ASN1_F_ASN1_COLLATE_PRIMITIVE 105 +# define ASN1_F_ASN1_COLLECT 106 +# define ASN1_F_ASN1_D2I_EX_PRIMITIVE 108 +# define ASN1_F_ASN1_D2I_FP 109 +# define ASN1_F_ASN1_D2I_READ_BIO 107 +# define ASN1_F_ASN1_DIGEST 184 +# define ASN1_F_ASN1_DO_ADB 110 +# define ASN1_F_ASN1_DUP 111 +# define ASN1_F_ASN1_ENUMERATED_SET 112 +# define ASN1_F_ASN1_ENUMERATED_TO_BN 113 +# define ASN1_F_ASN1_EX_C2I 204 +# define ASN1_F_ASN1_FIND_END 190 +# define ASN1_F_ASN1_GENERALIZEDTIME_ADJ 216 +# define ASN1_F_ASN1_GENERALIZEDTIME_SET 185 +# define ASN1_F_ASN1_GENERATE_V3 178 +# define ASN1_F_ASN1_GET_OBJECT 114 +# define ASN1_F_ASN1_HEADER_NEW 115 +# define ASN1_F_ASN1_I2D_BIO 116 +# define ASN1_F_ASN1_I2D_FP 117 +# define ASN1_F_ASN1_INTEGER_SET 118 +# define ASN1_F_ASN1_INTEGER_TO_BN 119 +# define ASN1_F_ASN1_ITEM_D2I_FP 206 +# define ASN1_F_ASN1_ITEM_DUP 191 +# define ASN1_F_ASN1_ITEM_EX_COMBINE_NEW 121 +# define ASN1_F_ASN1_ITEM_EX_D2I 120 +# define ASN1_F_ASN1_ITEM_I2D_BIO 192 +# define ASN1_F_ASN1_ITEM_I2D_FP 193 +# define ASN1_F_ASN1_ITEM_PACK 198 +# define ASN1_F_ASN1_ITEM_SIGN 195 +# define ASN1_F_ASN1_ITEM_SIGN_CTX 220 +# define ASN1_F_ASN1_ITEM_UNPACK 199 +# define ASN1_F_ASN1_ITEM_VERIFY 197 +# define ASN1_F_ASN1_MBSTRING_NCOPY 122 +# define ASN1_F_ASN1_OBJECT_NEW 123 +# define ASN1_F_ASN1_OUTPUT_DATA 214 +# define ASN1_F_ASN1_PACK_STRING 124 +# define ASN1_F_ASN1_PCTX_NEW 205 +# define ASN1_F_ASN1_PKCS5_PBE_SET 125 +# define ASN1_F_ASN1_SEQ_PACK 126 +# define ASN1_F_ASN1_SEQ_UNPACK 127 +# define ASN1_F_ASN1_SIGN 128 +# define ASN1_F_ASN1_STR2TYPE 179 +# define ASN1_F_ASN1_STRING_SET 186 +# define ASN1_F_ASN1_STRING_TABLE_ADD 129 +# define ASN1_F_ASN1_STRING_TYPE_NEW 130 +# define ASN1_F_ASN1_TEMPLATE_EX_D2I 132 +# define ASN1_F_ASN1_TEMPLATE_NEW 133 +# define ASN1_F_ASN1_TEMPLATE_NOEXP_D2I 131 +# define ASN1_F_ASN1_TIME_ADJ 217 +# define ASN1_F_ASN1_TIME_SET 175 +# define ASN1_F_ASN1_TYPE_GET_INT_OCTETSTRING 134 +# define ASN1_F_ASN1_TYPE_GET_OCTETSTRING 135 +# define ASN1_F_ASN1_UNPACK_STRING 136 +# define ASN1_F_ASN1_UTCTIME_ADJ 218 +# define ASN1_F_ASN1_UTCTIME_SET 187 +# define ASN1_F_ASN1_VERIFY 137 +# define ASN1_F_B64_READ_ASN1 209 +# define ASN1_F_B64_WRITE_ASN1 210 +# define ASN1_F_BIO_NEW_NDEF 208 +# define ASN1_F_BITSTR_CB 180 +# define ASN1_F_BN_TO_ASN1_ENUMERATED 138 +# define ASN1_F_BN_TO_ASN1_INTEGER 139 +# define ASN1_F_C2I_ASN1_BIT_STRING 189 +# define ASN1_F_C2I_ASN1_INTEGER 194 +# define ASN1_F_C2I_ASN1_OBJECT 196 +# define ASN1_F_COLLECT_DATA 140 +# define ASN1_F_D2I_ASN1_BIT_STRING 141 +# define ASN1_F_D2I_ASN1_BOOLEAN 142 +# define ASN1_F_D2I_ASN1_BYTES 143 +# define ASN1_F_D2I_ASN1_GENERALIZEDTIME 144 +# define ASN1_F_D2I_ASN1_HEADER 145 +# define ASN1_F_D2I_ASN1_INTEGER 146 +# define ASN1_F_D2I_ASN1_OBJECT 147 +# define ASN1_F_D2I_ASN1_SET 148 +# define ASN1_F_D2I_ASN1_TYPE_BYTES 149 +# define ASN1_F_D2I_ASN1_UINTEGER 150 +# define ASN1_F_D2I_ASN1_UTCTIME 151 +# define ASN1_F_D2I_AUTOPRIVATEKEY 207 +# define ASN1_F_D2I_NETSCAPE_RSA 152 +# define ASN1_F_D2I_NETSCAPE_RSA_2 153 +# define ASN1_F_D2I_PRIVATEKEY 154 +# define ASN1_F_D2I_PUBLICKEY 155 +# define ASN1_F_D2I_RSA_NET 200 +# define ASN1_F_D2I_RSA_NET_2 201 +# define ASN1_F_D2I_X509 156 +# define ASN1_F_D2I_X509_CINF 157 +# define ASN1_F_D2I_X509_PKEY 159 +# define ASN1_F_I2D_ASN1_BIO_STREAM 211 +# define ASN1_F_I2D_ASN1_SET 188 +# define ASN1_F_I2D_ASN1_TIME 160 +# define ASN1_F_I2D_DSA_PUBKEY 161 +# define ASN1_F_I2D_EC_PUBKEY 181 +# define ASN1_F_I2D_PRIVATEKEY 163 +# define ASN1_F_I2D_PUBLICKEY 164 +# define ASN1_F_I2D_RSA_NET 162 +# define ASN1_F_I2D_RSA_PUBKEY 165 +# define ASN1_F_LONG_C2I 166 +# define ASN1_F_OID_MODULE_INIT 174 +# define ASN1_F_PARSE_TAGGING 182 +# define ASN1_F_PKCS5_PBE2_SET_IV 167 +# define ASN1_F_PKCS5_PBE_SET 202 +# define ASN1_F_PKCS5_PBE_SET0_ALGOR 215 +# define ASN1_F_PKCS5_PBKDF2_SET 219 +# define ASN1_F_SMIME_READ_ASN1 212 +# define ASN1_F_SMIME_TEXT 213 +# define ASN1_F_X509_CINF_NEW 168 +# define ASN1_F_X509_CRL_ADD0_REVOKED 169 +# define ASN1_F_X509_INFO_NEW 170 +# define ASN1_F_X509_NAME_ENCODE 203 +# define ASN1_F_X509_NAME_EX_D2I 158 +# define ASN1_F_X509_NAME_EX_NEW 171 +# define ASN1_F_X509_NEW 172 +# define ASN1_F_X509_PKEY_NEW 173 + +/* Reason codes. */ +# define ASN1_R_ADDING_OBJECT 171 +# define ASN1_R_ASN1_PARSE_ERROR 203 +# define ASN1_R_ASN1_SIG_PARSE_ERROR 204 +# define ASN1_R_AUX_ERROR 100 +# define ASN1_R_BAD_CLASS 101 +# define ASN1_R_BAD_OBJECT_HEADER 102 +# define ASN1_R_BAD_PASSWORD_READ 103 +# define ASN1_R_BAD_TAG 104 +# define ASN1_R_BMPSTRING_IS_WRONG_LENGTH 214 +# define ASN1_R_BN_LIB 105 +# define ASN1_R_BOOLEAN_IS_WRONG_LENGTH 106 +# define ASN1_R_BUFFER_TOO_SMALL 107 +# define ASN1_R_CIPHER_HAS_NO_OBJECT_IDENTIFIER 108 +# define ASN1_R_CONTEXT_NOT_INITIALISED 217 +# define ASN1_R_DATA_IS_WRONG 109 +# define ASN1_R_DECODE_ERROR 110 +# define ASN1_R_DECODING_ERROR 111 +# define ASN1_R_DEPTH_EXCEEDED 174 +# define ASN1_R_DIGEST_AND_KEY_TYPE_NOT_SUPPORTED 198 +# define ASN1_R_ENCODE_ERROR 112 +# define ASN1_R_ERROR_GETTING_TIME 173 +# define ASN1_R_ERROR_LOADING_SECTION 172 +# define ASN1_R_ERROR_PARSING_SET_ELEMENT 113 +# define ASN1_R_ERROR_SETTING_CIPHER_PARAMS 114 +# define ASN1_R_EXPECTING_AN_INTEGER 115 +# define ASN1_R_EXPECTING_AN_OBJECT 116 +# define ASN1_R_EXPECTING_A_BOOLEAN 117 +# define ASN1_R_EXPECTING_A_TIME 118 +# define ASN1_R_EXPLICIT_LENGTH_MISMATCH 119 +# define ASN1_R_EXPLICIT_TAG_NOT_CONSTRUCTED 120 +# define ASN1_R_FIELD_MISSING 121 +# define ASN1_R_FIRST_NUM_TOO_LARGE 122 +# define ASN1_R_HEADER_TOO_LONG 123 +# define ASN1_R_ILLEGAL_BITSTRING_FORMAT 175 +# define ASN1_R_ILLEGAL_BOOLEAN 176 +# define ASN1_R_ILLEGAL_CHARACTERS 124 +# define ASN1_R_ILLEGAL_FORMAT 177 +# define ASN1_R_ILLEGAL_HEX 178 +# define ASN1_R_ILLEGAL_IMPLICIT_TAG 179 +# define ASN1_R_ILLEGAL_INTEGER 180 +# define ASN1_R_ILLEGAL_NESTED_TAGGING 181 +# define ASN1_R_ILLEGAL_NULL 125 +# define ASN1_R_ILLEGAL_NULL_VALUE 182 +# define ASN1_R_ILLEGAL_OBJECT 183 +# define ASN1_R_ILLEGAL_OPTIONAL_ANY 126 +# define ASN1_R_ILLEGAL_OPTIONS_ON_ITEM_TEMPLATE 170 +# define ASN1_R_ILLEGAL_TAGGED_ANY 127 +# define ASN1_R_ILLEGAL_TIME_VALUE 184 +# define ASN1_R_INTEGER_NOT_ASCII_FORMAT 185 +# define ASN1_R_INTEGER_TOO_LARGE_FOR_LONG 128 +# define ASN1_R_INVALID_BIT_STRING_BITS_LEFT 220 +# define ASN1_R_INVALID_BMPSTRING_LENGTH 129 +# define ASN1_R_INVALID_DIGIT 130 +# define ASN1_R_INVALID_MIME_TYPE 205 +# define ASN1_R_INVALID_MODIFIER 186 +# define ASN1_R_INVALID_NUMBER 187 +# define ASN1_R_INVALID_OBJECT_ENCODING 216 +# define ASN1_R_INVALID_SEPARATOR 131 +# define ASN1_R_INVALID_TIME_FORMAT 132 +# define ASN1_R_INVALID_UNIVERSALSTRING_LENGTH 133 +# define ASN1_R_INVALID_UTF8STRING 134 +# define ASN1_R_IV_TOO_LARGE 135 +# define ASN1_R_LENGTH_ERROR 136 +# define ASN1_R_LIST_ERROR 188 +# define ASN1_R_MIME_NO_CONTENT_TYPE 206 +# define ASN1_R_MIME_PARSE_ERROR 207 +# define ASN1_R_MIME_SIG_PARSE_ERROR 208 +# define ASN1_R_MISSING_EOC 137 +# define ASN1_R_MISSING_SECOND_NUMBER 138 +# define ASN1_R_MISSING_VALUE 189 +# define ASN1_R_MSTRING_NOT_UNIVERSAL 139 +# define ASN1_R_MSTRING_WRONG_TAG 140 +# define ASN1_R_NESTED_ASN1_STRING 197 +# define ASN1_R_NON_HEX_CHARACTERS 141 +# define ASN1_R_NOT_ASCII_FORMAT 190 +# define ASN1_R_NOT_ENOUGH_DATA 142 +# define ASN1_R_NO_CONTENT_TYPE 209 +# define ASN1_R_NO_DEFAULT_DIGEST 201 +# define ASN1_R_NO_MATCHING_CHOICE_TYPE 143 +# define ASN1_R_NO_MULTIPART_BODY_FAILURE 210 +# define ASN1_R_NO_MULTIPART_BOUNDARY 211 +# define ASN1_R_NO_SIG_CONTENT_TYPE 212 +# define ASN1_R_NULL_IS_WRONG_LENGTH 144 +# define ASN1_R_OBJECT_NOT_ASCII_FORMAT 191 +# define ASN1_R_ODD_NUMBER_OF_CHARS 145 +# define ASN1_R_PRIVATE_KEY_HEADER_MISSING 146 +# define ASN1_R_SECOND_NUMBER_TOO_LARGE 147 +# define ASN1_R_SEQUENCE_LENGTH_MISMATCH 148 +# define ASN1_R_SEQUENCE_NOT_CONSTRUCTED 149 +# define ASN1_R_SEQUENCE_OR_SET_NEEDS_CONFIG 192 +# define ASN1_R_SHORT_LINE 150 +# define ASN1_R_SIG_INVALID_MIME_TYPE 213 +# define ASN1_R_STREAMING_NOT_SUPPORTED 202 +# define ASN1_R_STRING_TOO_LONG 151 +# define ASN1_R_STRING_TOO_SHORT 152 +# define ASN1_R_TAG_VALUE_TOO_HIGH 153 +# define ASN1_R_THE_ASN1_OBJECT_IDENTIFIER_IS_NOT_KNOWN_FOR_THIS_MD 154 +# define ASN1_R_TIME_NOT_ASCII_FORMAT 193 +# define ASN1_R_TOO_LONG 155 +# define ASN1_R_TYPE_NOT_CONSTRUCTED 156 +# define ASN1_R_TYPE_NOT_PRIMITIVE 218 +# define ASN1_R_UNABLE_TO_DECODE_RSA_KEY 157 +# define ASN1_R_UNABLE_TO_DECODE_RSA_PRIVATE_KEY 158 +# define ASN1_R_UNEXPECTED_EOC 159 +# define ASN1_R_UNIVERSALSTRING_IS_WRONG_LENGTH 215 +# define ASN1_R_UNKNOWN_FORMAT 160 +# define ASN1_R_UNKNOWN_MESSAGE_DIGEST_ALGORITHM 161 +# define ASN1_R_UNKNOWN_OBJECT_TYPE 162 +# define ASN1_R_UNKNOWN_PUBLIC_KEY_TYPE 163 +# define ASN1_R_UNKNOWN_SIGNATURE_ALGORITHM 199 +# define ASN1_R_UNKNOWN_TAG 194 +# define ASN1_R_UNKOWN_FORMAT 195 +# define ASN1_R_UNSUPPORTED_ANY_DEFINED_BY_TYPE 164 +# define ASN1_R_UNSUPPORTED_CIPHER 165 +# define ASN1_R_UNSUPPORTED_ENCRYPTION_ALGORITHM 166 +# define ASN1_R_UNSUPPORTED_PUBLIC_KEY_TYPE 167 +# define ASN1_R_UNSUPPORTED_TYPE 196 +# define ASN1_R_WRONG_PUBLIC_KEY_TYPE 200 +# define ASN1_R_WRONG_TAG 168 +# define ASN1_R_WRONG_TYPE 169 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/win/openssl/include/openssl/asn1_mac.h b/hdssd/external/win/openssl/include/openssl/asn1_mac.h new file mode 100644 index 0000000..abc6dc3 --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/asn1_mac.h @@ -0,0 +1,579 @@ +/* crypto/asn1/asn1_mac.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_ASN1_MAC_H +# define HEADER_ASN1_MAC_H + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# ifndef ASN1_MAC_ERR_LIB +# define ASN1_MAC_ERR_LIB ERR_LIB_ASN1 +# endif + +# define ASN1_MAC_H_err(f,r,line) \ + ERR_PUT_error(ASN1_MAC_ERR_LIB,(f),(r),__FILE__,(line)) + +# define M_ASN1_D2I_vars(a,type,func) \ + ASN1_const_CTX c; \ + type ret=NULL; \ + \ + c.pp=(const unsigned char **)pp; \ + c.q= *(const unsigned char **)pp; \ + c.error=ERR_R_NESTED_ASN1_ERROR; \ + if ((a == NULL) || ((*a) == NULL)) \ + { if ((ret=(type)func()) == NULL) \ + { c.line=__LINE__; goto err; } } \ + else ret=(*a); + +# define M_ASN1_D2I_Init() \ + c.p= *(const unsigned char **)pp; \ + c.max=(length == 0)?0:(c.p+length); + +# define M_ASN1_D2I_Finish_2(a) \ + if (!asn1_const_Finish(&c)) \ + { c.line=__LINE__; goto err; } \ + *(const unsigned char **)pp=c.p; \ + if (a != NULL) (*a)=ret; \ + return(ret); + +# define M_ASN1_D2I_Finish(a,func,e) \ + M_ASN1_D2I_Finish_2(a); \ +err:\ + ASN1_MAC_H_err((e),c.error,c.line); \ + asn1_add_error(*(const unsigned char **)pp,(int)(c.q- *pp)); \ + if ((ret != NULL) && ((a == NULL) || (*a != ret))) func(ret); \ + return(NULL) + +# define M_ASN1_D2I_start_sequence() \ + if (!asn1_GetSequence(&c,&length)) \ + { c.line=__LINE__; goto err; } +/* Begin reading ASN1 without a surrounding sequence */ +# define M_ASN1_D2I_begin() \ + c.slen = length; + +/* End reading ASN1 with no check on length */ +# define M_ASN1_D2I_Finish_nolen(a, func, e) \ + *pp=c.p; \ + if (a != NULL) (*a)=ret; \ + return(ret); \ +err:\ + ASN1_MAC_H_err((e),c.error,c.line); \ + asn1_add_error(*pp,(int)(c.q- *pp)); \ + if ((ret != NULL) && ((a == NULL) || (*a != ret))) func(ret); \ + return(NULL) + +# define M_ASN1_D2I_end_sequence() \ + (((c.inf&1) == 0)?(c.slen <= 0): \ + (c.eos=ASN1_const_check_infinite_end(&c.p,c.slen))) + +/* Don't use this with d2i_ASN1_BOOLEAN() */ +# define M_ASN1_D2I_get(b, func) \ + c.q=c.p; \ + if (func(&(b),&c.p,c.slen) == NULL) \ + {c.line=__LINE__; goto err; } \ + c.slen-=(c.p-c.q); + +/* Don't use this with d2i_ASN1_BOOLEAN() */ +# define M_ASN1_D2I_get_x(type,b,func) \ + c.q=c.p; \ + if (((D2I_OF(type))func)(&(b),&c.p,c.slen) == NULL) \ + {c.line=__LINE__; goto err; } \ + c.slen-=(c.p-c.q); + +/* use this instead () */ +# define M_ASN1_D2I_get_int(b,func) \ + c.q=c.p; \ + if (func(&(b),&c.p,c.slen) < 0) \ + {c.line=__LINE__; goto err; } \ + c.slen-=(c.p-c.q); + +# define M_ASN1_D2I_get_opt(b,func,type) \ + if ((c.slen != 0) && ((M_ASN1_next & (~V_ASN1_CONSTRUCTED)) \ + == (V_ASN1_UNIVERSAL|(type)))) \ + { \ + M_ASN1_D2I_get(b,func); \ + } + +# define M_ASN1_D2I_get_int_opt(b,func,type) \ + if ((c.slen != 0) && ((M_ASN1_next & (~V_ASN1_CONSTRUCTED)) \ + == (V_ASN1_UNIVERSAL|(type)))) \ + { \ + M_ASN1_D2I_get_int(b,func); \ + } + +# define M_ASN1_D2I_get_imp(b,func, type) \ + M_ASN1_next=(_tmp& V_ASN1_CONSTRUCTED)|type; \ + c.q=c.p; \ + if (func(&(b),&c.p,c.slen) == NULL) \ + {c.line=__LINE__; M_ASN1_next_prev = _tmp; goto err; } \ + c.slen-=(c.p-c.q);\ + M_ASN1_next_prev=_tmp; + +# define M_ASN1_D2I_get_IMP_opt(b,func,tag,type) \ + if ((c.slen != 0) && ((M_ASN1_next & (~V_ASN1_CONSTRUCTED)) == \ + (V_ASN1_CONTEXT_SPECIFIC|(tag)))) \ + { \ + unsigned char _tmp = M_ASN1_next; \ + M_ASN1_D2I_get_imp(b,func, type);\ + } + +# define M_ASN1_D2I_get_set(r,func,free_func) \ + M_ASN1_D2I_get_imp_set(r,func,free_func, \ + V_ASN1_SET,V_ASN1_UNIVERSAL); + +# define M_ASN1_D2I_get_set_type(type,r,func,free_func) \ + M_ASN1_D2I_get_imp_set_type(type,r,func,free_func, \ + V_ASN1_SET,V_ASN1_UNIVERSAL); + +# define M_ASN1_D2I_get_set_opt(r,func,free_func) \ + if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \ + V_ASN1_CONSTRUCTED|V_ASN1_SET)))\ + { M_ASN1_D2I_get_set(r,func,free_func); } + +# define M_ASN1_D2I_get_set_opt_type(type,r,func,free_func) \ + if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \ + V_ASN1_CONSTRUCTED|V_ASN1_SET)))\ + { M_ASN1_D2I_get_set_type(type,r,func,free_func); } + +# define M_ASN1_I2D_len_SET_opt(a,f) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + M_ASN1_I2D_len_SET(a,f); + +# define M_ASN1_I2D_put_SET_opt(a,f) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + M_ASN1_I2D_put_SET(a,f); + +# define M_ASN1_I2D_put_SEQUENCE_opt(a,f) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + M_ASN1_I2D_put_SEQUENCE(a,f); + +# define M_ASN1_I2D_put_SEQUENCE_opt_type(type,a,f) \ + if ((a != NULL) && (sk_##type##_num(a) != 0)) \ + M_ASN1_I2D_put_SEQUENCE_type(type,a,f); + +# define M_ASN1_D2I_get_IMP_set_opt(b,func,free_func,tag) \ + if ((c.slen != 0) && \ + (M_ASN1_next == \ + (V_ASN1_CONTEXT_SPECIFIC|V_ASN1_CONSTRUCTED|(tag))))\ + { \ + M_ASN1_D2I_get_imp_set(b,func,free_func,\ + tag,V_ASN1_CONTEXT_SPECIFIC); \ + } + +# define M_ASN1_D2I_get_IMP_set_opt_type(type,b,func,free_func,tag) \ + if ((c.slen != 0) && \ + (M_ASN1_next == \ + (V_ASN1_CONTEXT_SPECIFIC|V_ASN1_CONSTRUCTED|(tag))))\ + { \ + M_ASN1_D2I_get_imp_set_type(type,b,func,free_func,\ + tag,V_ASN1_CONTEXT_SPECIFIC); \ + } + +# define M_ASN1_D2I_get_seq(r,func,free_func) \ + M_ASN1_D2I_get_imp_set(r,func,free_func,\ + V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL); + +# define M_ASN1_D2I_get_seq_type(type,r,func,free_func) \ + M_ASN1_D2I_get_imp_set_type(type,r,func,free_func,\ + V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL) + +# define M_ASN1_D2I_get_seq_opt(r,func,free_func) \ + if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \ + V_ASN1_CONSTRUCTED|V_ASN1_SEQUENCE)))\ + { M_ASN1_D2I_get_seq(r,func,free_func); } + +# define M_ASN1_D2I_get_seq_opt_type(type,r,func,free_func) \ + if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \ + V_ASN1_CONSTRUCTED|V_ASN1_SEQUENCE)))\ + { M_ASN1_D2I_get_seq_type(type,r,func,free_func); } + +# define M_ASN1_D2I_get_IMP_set(r,func,free_func,x) \ + M_ASN1_D2I_get_imp_set(r,func,free_func,\ + x,V_ASN1_CONTEXT_SPECIFIC); + +# define M_ASN1_D2I_get_IMP_set_type(type,r,func,free_func,x) \ + M_ASN1_D2I_get_imp_set_type(type,r,func,free_func,\ + x,V_ASN1_CONTEXT_SPECIFIC); + +# define M_ASN1_D2I_get_imp_set(r,func,free_func,a,b) \ + c.q=c.p; \ + if (d2i_ASN1_SET(&(r),&c.p,c.slen,(char *(*)())func,\ + (void (*)())free_func,a,b) == NULL) \ + { c.line=__LINE__; goto err; } \ + c.slen-=(c.p-c.q); + +# define M_ASN1_D2I_get_imp_set_type(type,r,func,free_func,a,b) \ + c.q=c.p; \ + if (d2i_ASN1_SET_OF_##type(&(r),&c.p,c.slen,func,\ + free_func,a,b) == NULL) \ + { c.line=__LINE__; goto err; } \ + c.slen-=(c.p-c.q); + +# define M_ASN1_D2I_get_set_strings(r,func,a,b) \ + c.q=c.p; \ + if (d2i_ASN1_STRING_SET(&(r),&c.p,c.slen,a,b) == NULL) \ + { c.line=__LINE__; goto err; } \ + c.slen-=(c.p-c.q); + +# define M_ASN1_D2I_get_EXP_opt(r,func,tag) \ + if ((c.slen != 0L) && (M_ASN1_next == \ + (V_ASN1_CONSTRUCTED|V_ASN1_CONTEXT_SPECIFIC|tag))) \ + { \ + int Tinf,Ttag,Tclass; \ + long Tlen; \ + \ + c.q=c.p; \ + Tinf=ASN1_get_object(&c.p,&Tlen,&Ttag,&Tclass,c.slen); \ + if (Tinf & 0x80) \ + { c.error=ERR_R_BAD_ASN1_OBJECT_HEADER; \ + c.line=__LINE__; goto err; } \ + if (Tinf == (V_ASN1_CONSTRUCTED+1)) \ + Tlen = c.slen - (c.p - c.q) - 2; \ + if (func(&(r),&c.p,Tlen) == NULL) \ + { c.line=__LINE__; goto err; } \ + if (Tinf == (V_ASN1_CONSTRUCTED+1)) { \ + Tlen = c.slen - (c.p - c.q); \ + if(!ASN1_const_check_infinite_end(&c.p, Tlen)) \ + { c.error=ERR_R_MISSING_ASN1_EOS; \ + c.line=__LINE__; goto err; } \ + }\ + c.slen-=(c.p-c.q); \ + } + +# define M_ASN1_D2I_get_EXP_set_opt(r,func,free_func,tag,b) \ + if ((c.slen != 0) && (M_ASN1_next == \ + (V_ASN1_CONSTRUCTED|V_ASN1_CONTEXT_SPECIFIC|tag))) \ + { \ + int Tinf,Ttag,Tclass; \ + long Tlen; \ + \ + c.q=c.p; \ + Tinf=ASN1_get_object(&c.p,&Tlen,&Ttag,&Tclass,c.slen); \ + if (Tinf & 0x80) \ + { c.error=ERR_R_BAD_ASN1_OBJECT_HEADER; \ + c.line=__LINE__; goto err; } \ + if (Tinf == (V_ASN1_CONSTRUCTED+1)) \ + Tlen = c.slen - (c.p - c.q) - 2; \ + if (d2i_ASN1_SET(&(r),&c.p,Tlen,(char *(*)())func, \ + (void (*)())free_func, \ + b,V_ASN1_UNIVERSAL) == NULL) \ + { c.line=__LINE__; goto err; } \ + if (Tinf == (V_ASN1_CONSTRUCTED+1)) { \ + Tlen = c.slen - (c.p - c.q); \ + if(!ASN1_check_infinite_end(&c.p, Tlen)) \ + { c.error=ERR_R_MISSING_ASN1_EOS; \ + c.line=__LINE__; goto err; } \ + }\ + c.slen-=(c.p-c.q); \ + } + +# define M_ASN1_D2I_get_EXP_set_opt_type(type,r,func,free_func,tag,b) \ + if ((c.slen != 0) && (M_ASN1_next == \ + (V_ASN1_CONSTRUCTED|V_ASN1_CONTEXT_SPECIFIC|tag))) \ + { \ + int Tinf,Ttag,Tclass; \ + long Tlen; \ + \ + c.q=c.p; \ + Tinf=ASN1_get_object(&c.p,&Tlen,&Ttag,&Tclass,c.slen); \ + if (Tinf & 0x80) \ + { c.error=ERR_R_BAD_ASN1_OBJECT_HEADER; \ + c.line=__LINE__; goto err; } \ + if (Tinf == (V_ASN1_CONSTRUCTED+1)) \ + Tlen = c.slen - (c.p - c.q) - 2; \ + if (d2i_ASN1_SET_OF_##type(&(r),&c.p,Tlen,func, \ + free_func,b,V_ASN1_UNIVERSAL) == NULL) \ + { c.line=__LINE__; goto err; } \ + if (Tinf == (V_ASN1_CONSTRUCTED+1)) { \ + Tlen = c.slen - (c.p - c.q); \ + if(!ASN1_check_infinite_end(&c.p, Tlen)) \ + { c.error=ERR_R_MISSING_ASN1_EOS; \ + c.line=__LINE__; goto err; } \ + }\ + c.slen-=(c.p-c.q); \ + } + +/* New macros */ +# define M_ASN1_New_Malloc(ret,type) \ + if ((ret=(type *)OPENSSL_malloc(sizeof(type))) == NULL) \ + { c.line=__LINE__; goto err2; } + +# define M_ASN1_New(arg,func) \ + if (((arg)=func()) == NULL) return(NULL) + +# define M_ASN1_New_Error(a) \ +/*- err: ASN1_MAC_H_err((a),ERR_R_NESTED_ASN1_ERROR,c.line); \ + return(NULL);*/ \ + err2: ASN1_MAC_H_err((a),ERR_R_MALLOC_FAILURE,c.line); \ + return(NULL) + +/* + * BIG UGLY WARNING! This is so damn ugly I wanna puke. Unfortunately, some + * macros that use ASN1_const_CTX still insist on writing in the input + * stream. ARGH! ARGH! ARGH! Let's get rid of this macro package. Please? -- + * Richard Levitte + */ +# define M_ASN1_next (*((unsigned char *)(c.p))) +# define M_ASN1_next_prev (*((unsigned char *)(c.q))) + +/*************************************************/ + +# define M_ASN1_I2D_vars(a) int r=0,ret=0; \ + unsigned char *p; \ + if (a == NULL) return(0) + +/* Length Macros */ +# define M_ASN1_I2D_len(a,f) ret+=f(a,NULL) +# define M_ASN1_I2D_len_IMP_opt(a,f) if (a != NULL) M_ASN1_I2D_len(a,f) + +# define M_ASN1_I2D_len_SET(a,f) \ + ret+=i2d_ASN1_SET(a,NULL,f,V_ASN1_SET,V_ASN1_UNIVERSAL,IS_SET); + +# define M_ASN1_I2D_len_SET_type(type,a,f) \ + ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,V_ASN1_SET, \ + V_ASN1_UNIVERSAL,IS_SET); + +# define M_ASN1_I2D_len_SEQUENCE(a,f) \ + ret+=i2d_ASN1_SET(a,NULL,f,V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL, \ + IS_SEQUENCE); + +# define M_ASN1_I2D_len_SEQUENCE_type(type,a,f) \ + ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,V_ASN1_SEQUENCE, \ + V_ASN1_UNIVERSAL,IS_SEQUENCE) + +# define M_ASN1_I2D_len_SEQUENCE_opt(a,f) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + M_ASN1_I2D_len_SEQUENCE(a,f); + +# define M_ASN1_I2D_len_SEQUENCE_opt_type(type,a,f) \ + if ((a != NULL) && (sk_##type##_num(a) != 0)) \ + M_ASN1_I2D_len_SEQUENCE_type(type,a,f); + +# define M_ASN1_I2D_len_IMP_SET(a,f,x) \ + ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC,IS_SET); + +# define M_ASN1_I2D_len_IMP_SET_type(type,a,f,x) \ + ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,x, \ + V_ASN1_CONTEXT_SPECIFIC,IS_SET); + +# define M_ASN1_I2D_len_IMP_SET_opt(a,f,x) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC, \ + IS_SET); + +# define M_ASN1_I2D_len_IMP_SET_opt_type(type,a,f,x) \ + if ((a != NULL) && (sk_##type##_num(a) != 0)) \ + ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,x, \ + V_ASN1_CONTEXT_SPECIFIC,IS_SET); + +# define M_ASN1_I2D_len_IMP_SEQUENCE(a,f,x) \ + ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC, \ + IS_SEQUENCE); + +# define M_ASN1_I2D_len_IMP_SEQUENCE_opt(a,f,x) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC, \ + IS_SEQUENCE); + +# define M_ASN1_I2D_len_IMP_SEQUENCE_opt_type(type,a,f,x) \ + if ((a != NULL) && (sk_##type##_num(a) != 0)) \ + ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,x, \ + V_ASN1_CONTEXT_SPECIFIC, \ + IS_SEQUENCE); + +# define M_ASN1_I2D_len_EXP_opt(a,f,mtag,v) \ + if (a != NULL)\ + { \ + v=f(a,NULL); \ + ret+=ASN1_object_size(1,v,mtag); \ + } + +# define M_ASN1_I2D_len_EXP_SET_opt(a,f,mtag,tag,v) \ + if ((a != NULL) && (sk_num(a) != 0))\ + { \ + v=i2d_ASN1_SET(a,NULL,f,tag,V_ASN1_UNIVERSAL,IS_SET); \ + ret+=ASN1_object_size(1,v,mtag); \ + } + +# define M_ASN1_I2D_len_EXP_SEQUENCE_opt(a,f,mtag,tag,v) \ + if ((a != NULL) && (sk_num(a) != 0))\ + { \ + v=i2d_ASN1_SET(a,NULL,f,tag,V_ASN1_UNIVERSAL, \ + IS_SEQUENCE); \ + ret+=ASN1_object_size(1,v,mtag); \ + } + +# define M_ASN1_I2D_len_EXP_SEQUENCE_opt_type(type,a,f,mtag,tag,v) \ + if ((a != NULL) && (sk_##type##_num(a) != 0))\ + { \ + v=i2d_ASN1_SET_OF_##type(a,NULL,f,tag, \ + V_ASN1_UNIVERSAL, \ + IS_SEQUENCE); \ + ret+=ASN1_object_size(1,v,mtag); \ + } + +/* Put Macros */ +# define M_ASN1_I2D_put(a,f) f(a,&p) + +# define M_ASN1_I2D_put_IMP_opt(a,f,t) \ + if (a != NULL) \ + { \ + unsigned char *q=p; \ + f(a,&p); \ + *q=(V_ASN1_CONTEXT_SPECIFIC|t|(*q&V_ASN1_CONSTRUCTED));\ + } + +# define M_ASN1_I2D_put_SET(a,f) i2d_ASN1_SET(a,&p,f,V_ASN1_SET,\ + V_ASN1_UNIVERSAL,IS_SET) +# define M_ASN1_I2D_put_SET_type(type,a,f) \ + i2d_ASN1_SET_OF_##type(a,&p,f,V_ASN1_SET,V_ASN1_UNIVERSAL,IS_SET) +# define M_ASN1_I2D_put_IMP_SET(a,f,x) i2d_ASN1_SET(a,&p,f,x,\ + V_ASN1_CONTEXT_SPECIFIC,IS_SET) +# define M_ASN1_I2D_put_IMP_SET_type(type,a,f,x) \ + i2d_ASN1_SET_OF_##type(a,&p,f,x,V_ASN1_CONTEXT_SPECIFIC,IS_SET) +# define M_ASN1_I2D_put_IMP_SEQUENCE(a,f,x) i2d_ASN1_SET(a,&p,f,x,\ + V_ASN1_CONTEXT_SPECIFIC,IS_SEQUENCE) + +# define M_ASN1_I2D_put_SEQUENCE(a,f) i2d_ASN1_SET(a,&p,f,V_ASN1_SEQUENCE,\ + V_ASN1_UNIVERSAL,IS_SEQUENCE) + +# define M_ASN1_I2D_put_SEQUENCE_type(type,a,f) \ + i2d_ASN1_SET_OF_##type(a,&p,f,V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL, \ + IS_SEQUENCE) + +# define M_ASN1_I2D_put_SEQUENCE_opt(a,f) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + M_ASN1_I2D_put_SEQUENCE(a,f); + +# define M_ASN1_I2D_put_IMP_SET_opt(a,f,x) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + { i2d_ASN1_SET(a,&p,f,x,V_ASN1_CONTEXT_SPECIFIC, \ + IS_SET); } + +# define M_ASN1_I2D_put_IMP_SET_opt_type(type,a,f,x) \ + if ((a != NULL) && (sk_##type##_num(a) != 0)) \ + { i2d_ASN1_SET_OF_##type(a,&p,f,x, \ + V_ASN1_CONTEXT_SPECIFIC, \ + IS_SET); } + +# define M_ASN1_I2D_put_IMP_SEQUENCE_opt(a,f,x) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + { i2d_ASN1_SET(a,&p,f,x,V_ASN1_CONTEXT_SPECIFIC, \ + IS_SEQUENCE); } + +# define M_ASN1_I2D_put_IMP_SEQUENCE_opt_type(type,a,f,x) \ + if ((a != NULL) && (sk_##type##_num(a) != 0)) \ + { i2d_ASN1_SET_OF_##type(a,&p,f,x, \ + V_ASN1_CONTEXT_SPECIFIC, \ + IS_SEQUENCE); } + +# define M_ASN1_I2D_put_EXP_opt(a,f,tag,v) \ + if (a != NULL) \ + { \ + ASN1_put_object(&p,1,v,tag,V_ASN1_CONTEXT_SPECIFIC); \ + f(a,&p); \ + } + +# define M_ASN1_I2D_put_EXP_SET_opt(a,f,mtag,tag,v) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + { \ + ASN1_put_object(&p,1,v,mtag,V_ASN1_CONTEXT_SPECIFIC); \ + i2d_ASN1_SET(a,&p,f,tag,V_ASN1_UNIVERSAL,IS_SET); \ + } + +# define M_ASN1_I2D_put_EXP_SEQUENCE_opt(a,f,mtag,tag,v) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + { \ + ASN1_put_object(&p,1,v,mtag,V_ASN1_CONTEXT_SPECIFIC); \ + i2d_ASN1_SET(a,&p,f,tag,V_ASN1_UNIVERSAL,IS_SEQUENCE); \ + } + +# define M_ASN1_I2D_put_EXP_SEQUENCE_opt_type(type,a,f,mtag,tag,v) \ + if ((a != NULL) && (sk_##type##_num(a) != 0)) \ + { \ + ASN1_put_object(&p,1,v,mtag,V_ASN1_CONTEXT_SPECIFIC); \ + i2d_ASN1_SET_OF_##type(a,&p,f,tag,V_ASN1_UNIVERSAL, \ + IS_SEQUENCE); \ + } + +# define M_ASN1_I2D_seq_total() \ + r=ASN1_object_size(1,ret,V_ASN1_SEQUENCE); \ + if (pp == NULL) return(r); \ + p= *pp; \ + ASN1_put_object(&p,1,ret,V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL) + +# define M_ASN1_I2D_INF_seq_start(tag,ctx) \ + *(p++)=(V_ASN1_CONSTRUCTED|(tag)|(ctx)); \ + *(p++)=0x80 + +# define M_ASN1_I2D_INF_seq_end() *(p++)=0x00; *(p++)=0x00 + +# define M_ASN1_I2D_finish() *pp=p; \ + return(r); + +int asn1_GetSequence(ASN1_const_CTX *c, long *length); +void asn1_add_error(const unsigned char *address, int offset); +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/win/openssl/include/openssl/asn1t.h b/hdssd/external/win/openssl/include/openssl/asn1t.h new file mode 100644 index 0000000..99bc0ee --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/asn1t.h @@ -0,0 +1,973 @@ +/* asn1t.h */ +/* + * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project + * 2000. + */ +/* ==================================================================== + * Copyright (c) 2000-2005 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +#ifndef HEADER_ASN1T_H +# define HEADER_ASN1T_H + +# include +# include +# include + +# ifdef OPENSSL_BUILD_SHLIBCRYPTO +# undef OPENSSL_EXTERN +# define OPENSSL_EXTERN OPENSSL_EXPORT +# endif + +/* ASN1 template defines, structures and functions */ + +#ifdef __cplusplus +extern "C" { +#endif + +# ifndef OPENSSL_EXPORT_VAR_AS_FUNCTION + +/* Macro to obtain ASN1_ADB pointer from a type (only used internally) */ +# define ASN1_ADB_ptr(iptr) ((const ASN1_ADB *)(iptr)) + +/* Macros for start and end of ASN1_ITEM definition */ + +# define ASN1_ITEM_start(itname) \ + OPENSSL_GLOBAL const ASN1_ITEM itname##_it = { + +# define ASN1_ITEM_end(itname) \ + }; + +# else + +/* Macro to obtain ASN1_ADB pointer from a type (only used internally) */ +# define ASN1_ADB_ptr(iptr) ((const ASN1_ADB *)(iptr())) + +/* Macros for start and end of ASN1_ITEM definition */ + +# define ASN1_ITEM_start(itname) \ + const ASN1_ITEM * itname##_it(void) \ + { \ + static const ASN1_ITEM local_it = { + +# define ASN1_ITEM_end(itname) \ + }; \ + return &local_it; \ + } + +# endif + +/* Macros to aid ASN1 template writing */ + +# define ASN1_ITEM_TEMPLATE(tname) \ + static const ASN1_TEMPLATE tname##_item_tt + +# define ASN1_ITEM_TEMPLATE_END(tname) \ + ;\ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_PRIMITIVE,\ + -1,\ + &tname##_item_tt,\ + 0,\ + NULL,\ + 0,\ + #tname \ + ASN1_ITEM_end(tname) + +/* This is a ASN1 type which just embeds a template */ + +/*- + * This pair helps declare a SEQUENCE. We can do: + * + * ASN1_SEQUENCE(stname) = { + * ... SEQUENCE components ... + * } ASN1_SEQUENCE_END(stname) + * + * This will produce an ASN1_ITEM called stname_it + * for a structure called stname. + * + * If you want the same structure but a different + * name then use: + * + * ASN1_SEQUENCE(itname) = { + * ... SEQUENCE components ... + * } ASN1_SEQUENCE_END_name(stname, itname) + * + * This will create an item called itname_it using + * a structure called stname. + */ + +# define ASN1_SEQUENCE(tname) \ + static const ASN1_TEMPLATE tname##_seq_tt[] + +# define ASN1_SEQUENCE_END(stname) ASN1_SEQUENCE_END_name(stname, stname) + +# define ASN1_SEQUENCE_END_name(stname, tname) \ + ;\ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_SEQUENCE,\ + V_ASN1_SEQUENCE,\ + tname##_seq_tt,\ + sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ + NULL,\ + sizeof(stname),\ + #stname \ + ASN1_ITEM_end(tname) + +# define ASN1_NDEF_SEQUENCE(tname) \ + ASN1_SEQUENCE(tname) + +# define ASN1_NDEF_SEQUENCE_cb(tname, cb) \ + ASN1_SEQUENCE_cb(tname, cb) + +# define ASN1_SEQUENCE_cb(tname, cb) \ + static const ASN1_AUX tname##_aux = {NULL, 0, 0, 0, cb, 0}; \ + ASN1_SEQUENCE(tname) + +# define ASN1_BROKEN_SEQUENCE(tname) \ + static const ASN1_AUX tname##_aux = {NULL, ASN1_AFLG_BROKEN, 0, 0, 0, 0}; \ + ASN1_SEQUENCE(tname) + +# define ASN1_SEQUENCE_ref(tname, cb, lck) \ + static const ASN1_AUX tname##_aux = {NULL, ASN1_AFLG_REFCOUNT, offsetof(tname, references), lck, cb, 0}; \ + ASN1_SEQUENCE(tname) + +# define ASN1_SEQUENCE_enc(tname, enc, cb) \ + static const ASN1_AUX tname##_aux = {NULL, ASN1_AFLG_ENCODING, 0, 0, cb, offsetof(tname, enc)}; \ + ASN1_SEQUENCE(tname) + +# define ASN1_NDEF_SEQUENCE_END(tname) \ + ;\ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_NDEF_SEQUENCE,\ + V_ASN1_SEQUENCE,\ + tname##_seq_tt,\ + sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ + NULL,\ + sizeof(tname),\ + #tname \ + ASN1_ITEM_end(tname) + +# define ASN1_BROKEN_SEQUENCE_END(stname) ASN1_SEQUENCE_END_ref(stname, stname) + +# define ASN1_SEQUENCE_END_enc(stname, tname) ASN1_SEQUENCE_END_ref(stname, tname) + +# define ASN1_SEQUENCE_END_cb(stname, tname) ASN1_SEQUENCE_END_ref(stname, tname) + +# define ASN1_SEQUENCE_END_ref(stname, tname) \ + ;\ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_SEQUENCE,\ + V_ASN1_SEQUENCE,\ + tname##_seq_tt,\ + sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ + &tname##_aux,\ + sizeof(stname),\ + #stname \ + ASN1_ITEM_end(tname) + +# define ASN1_NDEF_SEQUENCE_END_cb(stname, tname) \ + ;\ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_NDEF_SEQUENCE,\ + V_ASN1_SEQUENCE,\ + tname##_seq_tt,\ + sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ + &tname##_aux,\ + sizeof(stname),\ + #stname \ + ASN1_ITEM_end(tname) + +/*- + * This pair helps declare a CHOICE type. We can do: + * + * ASN1_CHOICE(chname) = { + * ... CHOICE options ... + * ASN1_CHOICE_END(chname) + * + * This will produce an ASN1_ITEM called chname_it + * for a structure called chname. The structure + * definition must look like this: + * typedef struct { + * int type; + * union { + * ASN1_SOMETHING *opt1; + * ASN1_SOMEOTHER *opt2; + * } value; + * } chname; + * + * the name of the selector must be 'type'. + * to use an alternative selector name use the + * ASN1_CHOICE_END_selector() version. + */ + +# define ASN1_CHOICE(tname) \ + static const ASN1_TEMPLATE tname##_ch_tt[] + +# define ASN1_CHOICE_cb(tname, cb) \ + static const ASN1_AUX tname##_aux = {NULL, 0, 0, 0, cb, 0}; \ + ASN1_CHOICE(tname) + +# define ASN1_CHOICE_END(stname) ASN1_CHOICE_END_name(stname, stname) + +# define ASN1_CHOICE_END_name(stname, tname) ASN1_CHOICE_END_selector(stname, tname, type) + +# define ASN1_CHOICE_END_selector(stname, tname, selname) \ + ;\ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_CHOICE,\ + offsetof(stname,selname) ,\ + tname##_ch_tt,\ + sizeof(tname##_ch_tt) / sizeof(ASN1_TEMPLATE),\ + NULL,\ + sizeof(stname),\ + #stname \ + ASN1_ITEM_end(tname) + +# define ASN1_CHOICE_END_cb(stname, tname, selname) \ + ;\ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_CHOICE,\ + offsetof(stname,selname) ,\ + tname##_ch_tt,\ + sizeof(tname##_ch_tt) / sizeof(ASN1_TEMPLATE),\ + &tname##_aux,\ + sizeof(stname),\ + #stname \ + ASN1_ITEM_end(tname) + +/* This helps with the template wrapper form of ASN1_ITEM */ + +# define ASN1_EX_TEMPLATE_TYPE(flags, tag, name, type) { \ + (flags), (tag), 0,\ + #name, ASN1_ITEM_ref(type) } + +/* These help with SEQUENCE or CHOICE components */ + +/* used to declare other types */ + +# define ASN1_EX_TYPE(flags, tag, stname, field, type) { \ + (flags), (tag), offsetof(stname, field),\ + #field, ASN1_ITEM_ref(type) } + +/* used when the structure is combined with the parent */ + +# define ASN1_EX_COMBINE(flags, tag, type) { \ + (flags)|ASN1_TFLG_COMBINE, (tag), 0, NULL, ASN1_ITEM_ref(type) } + +/* implicit and explicit helper macros */ + +# define ASN1_IMP_EX(stname, field, type, tag, ex) \ + ASN1_EX_TYPE(ASN1_TFLG_IMPLICIT | ex, tag, stname, field, type) + +# define ASN1_EXP_EX(stname, field, type, tag, ex) \ + ASN1_EX_TYPE(ASN1_TFLG_EXPLICIT | ex, tag, stname, field, type) + +/* Any defined by macros: the field used is in the table itself */ + +# ifndef OPENSSL_EXPORT_VAR_AS_FUNCTION +# define ASN1_ADB_OBJECT(tblname) { ASN1_TFLG_ADB_OID, -1, 0, #tblname, (const ASN1_ITEM *)&(tblname##_adb) } +# define ASN1_ADB_INTEGER(tblname) { ASN1_TFLG_ADB_INT, -1, 0, #tblname, (const ASN1_ITEM *)&(tblname##_adb) } +# else +# define ASN1_ADB_OBJECT(tblname) { ASN1_TFLG_ADB_OID, -1, 0, #tblname, tblname##_adb } +# define ASN1_ADB_INTEGER(tblname) { ASN1_TFLG_ADB_INT, -1, 0, #tblname, tblname##_adb } +# endif +/* Plain simple type */ +# define ASN1_SIMPLE(stname, field, type) ASN1_EX_TYPE(0,0, stname, field, type) + +/* OPTIONAL simple type */ +# define ASN1_OPT(stname, field, type) ASN1_EX_TYPE(ASN1_TFLG_OPTIONAL, 0, stname, field, type) + +/* IMPLICIT tagged simple type */ +# define ASN1_IMP(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, 0) + +/* IMPLICIT tagged OPTIONAL simple type */ +# define ASN1_IMP_OPT(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL) + +/* Same as above but EXPLICIT */ + +# define ASN1_EXP(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, 0) +# define ASN1_EXP_OPT(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL) + +/* SEQUENCE OF type */ +# define ASN1_SEQUENCE_OF(stname, field, type) \ + ASN1_EX_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, stname, field, type) + +/* OPTIONAL SEQUENCE OF */ +# define ASN1_SEQUENCE_OF_OPT(stname, field, type) \ + ASN1_EX_TYPE(ASN1_TFLG_SEQUENCE_OF|ASN1_TFLG_OPTIONAL, 0, stname, field, type) + +/* Same as above but for SET OF */ + +# define ASN1_SET_OF(stname, field, type) \ + ASN1_EX_TYPE(ASN1_TFLG_SET_OF, 0, stname, field, type) + +# define ASN1_SET_OF_OPT(stname, field, type) \ + ASN1_EX_TYPE(ASN1_TFLG_SET_OF|ASN1_TFLG_OPTIONAL, 0, stname, field, type) + +/* Finally compound types of SEQUENCE, SET, IMPLICIT, EXPLICIT and OPTIONAL */ + +# define ASN1_IMP_SET_OF(stname, field, type, tag) \ + ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF) + +# define ASN1_EXP_SET_OF(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF) + +# define ASN1_IMP_SET_OF_OPT(stname, field, type, tag) \ + ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF|ASN1_TFLG_OPTIONAL) + +# define ASN1_EXP_SET_OF_OPT(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF|ASN1_TFLG_OPTIONAL) + +# define ASN1_IMP_SEQUENCE_OF(stname, field, type, tag) \ + ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF) + +# define ASN1_IMP_SEQUENCE_OF_OPT(stname, field, type, tag) \ + ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF|ASN1_TFLG_OPTIONAL) + +# define ASN1_EXP_SEQUENCE_OF(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF) + +# define ASN1_EXP_SEQUENCE_OF_OPT(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF|ASN1_TFLG_OPTIONAL) + +/* EXPLICIT using indefinite length constructed form */ +# define ASN1_NDEF_EXP(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_NDEF) + +/* EXPLICIT OPTIONAL using indefinite length constructed form */ +# define ASN1_NDEF_EXP_OPT(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL|ASN1_TFLG_NDEF) + +/* Macros for the ASN1_ADB structure */ + +# define ASN1_ADB(name) \ + static const ASN1_ADB_TABLE name##_adbtbl[] + +# ifndef OPENSSL_EXPORT_VAR_AS_FUNCTION + +# define ASN1_ADB_END(name, flags, field, app_table, def, none) \ + ;\ + static const ASN1_ADB name##_adb = {\ + flags,\ + offsetof(name, field),\ + app_table,\ + name##_adbtbl,\ + sizeof(name##_adbtbl) / sizeof(ASN1_ADB_TABLE),\ + def,\ + none\ + } + +# else + +# define ASN1_ADB_END(name, flags, field, app_table, def, none) \ + ;\ + static const ASN1_ITEM *name##_adb(void) \ + { \ + static const ASN1_ADB internal_adb = \ + {\ + flags,\ + offsetof(name, field),\ + app_table,\ + name##_adbtbl,\ + sizeof(name##_adbtbl) / sizeof(ASN1_ADB_TABLE),\ + def,\ + none\ + }; \ + return (const ASN1_ITEM *) &internal_adb; \ + } \ + void dummy_function(void) + +# endif + +# define ADB_ENTRY(val, template) {val, template} + +# define ASN1_ADB_TEMPLATE(name) \ + static const ASN1_TEMPLATE name##_tt + +/* + * This is the ASN1 template structure that defines a wrapper round the + * actual type. It determines the actual position of the field in the value + * structure, various flags such as OPTIONAL and the field name. + */ + +struct ASN1_TEMPLATE_st { + unsigned long flags; /* Various flags */ + long tag; /* tag, not used if no tagging */ + unsigned long offset; /* Offset of this field in structure */ +# ifndef NO_ASN1_FIELD_NAMES + const char *field_name; /* Field name */ +# endif + ASN1_ITEM_EXP *item; /* Relevant ASN1_ITEM or ASN1_ADB */ +}; + +/* Macro to extract ASN1_ITEM and ASN1_ADB pointer from ASN1_TEMPLATE */ + +# define ASN1_TEMPLATE_item(t) (t->item_ptr) +# define ASN1_TEMPLATE_adb(t) (t->item_ptr) + +typedef struct ASN1_ADB_TABLE_st ASN1_ADB_TABLE; +typedef struct ASN1_ADB_st ASN1_ADB; + +struct ASN1_ADB_st { + unsigned long flags; /* Various flags */ + unsigned long offset; /* Offset of selector field */ + STACK_OF(ASN1_ADB_TABLE) **app_items; /* Application defined items */ + const ASN1_ADB_TABLE *tbl; /* Table of possible types */ + long tblcount; /* Number of entries in tbl */ + const ASN1_TEMPLATE *default_tt; /* Type to use if no match */ + const ASN1_TEMPLATE *null_tt; /* Type to use if selector is NULL */ +}; + +struct ASN1_ADB_TABLE_st { + long value; /* NID for an object or value for an int */ + const ASN1_TEMPLATE tt; /* item for this value */ +}; + +/* template flags */ + +/* Field is optional */ +# define ASN1_TFLG_OPTIONAL (0x1) + +/* Field is a SET OF */ +# define ASN1_TFLG_SET_OF (0x1 << 1) + +/* Field is a SEQUENCE OF */ +# define ASN1_TFLG_SEQUENCE_OF (0x2 << 1) + +/* + * Special case: this refers to a SET OF that will be sorted into DER order + * when encoded *and* the corresponding STACK will be modified to match the + * new order. + */ +# define ASN1_TFLG_SET_ORDER (0x3 << 1) + +/* Mask for SET OF or SEQUENCE OF */ +# define ASN1_TFLG_SK_MASK (0x3 << 1) + +/* + * These flags mean the tag should be taken from the tag field. If EXPLICIT + * then the underlying type is used for the inner tag. + */ + +/* IMPLICIT tagging */ +# define ASN1_TFLG_IMPTAG (0x1 << 3) + +/* EXPLICIT tagging, inner tag from underlying type */ +# define ASN1_TFLG_EXPTAG (0x2 << 3) + +# define ASN1_TFLG_TAG_MASK (0x3 << 3) + +/* context specific IMPLICIT */ +# define ASN1_TFLG_IMPLICIT ASN1_TFLG_IMPTAG|ASN1_TFLG_CONTEXT + +/* context specific EXPLICIT */ +# define ASN1_TFLG_EXPLICIT ASN1_TFLG_EXPTAG|ASN1_TFLG_CONTEXT + +/* + * If tagging is in force these determine the type of tag to use. Otherwise + * the tag is determined by the underlying type. These values reflect the + * actual octet format. + */ + +/* Universal tag */ +# define ASN1_TFLG_UNIVERSAL (0x0<<6) +/* Application tag */ +# define ASN1_TFLG_APPLICATION (0x1<<6) +/* Context specific tag */ +# define ASN1_TFLG_CONTEXT (0x2<<6) +/* Private tag */ +# define ASN1_TFLG_PRIVATE (0x3<<6) + +# define ASN1_TFLG_TAG_CLASS (0x3<<6) + +/* + * These are for ANY DEFINED BY type. In this case the 'item' field points to + * an ASN1_ADB structure which contains a table of values to decode the + * relevant type + */ + +# define ASN1_TFLG_ADB_MASK (0x3<<8) + +# define ASN1_TFLG_ADB_OID (0x1<<8) + +# define ASN1_TFLG_ADB_INT (0x1<<9) + +/* + * This flag means a parent structure is passed instead of the field: this is + * useful is a SEQUENCE is being combined with a CHOICE for example. Since + * this means the structure and item name will differ we need to use the + * ASN1_CHOICE_END_name() macro for example. + */ + +# define ASN1_TFLG_COMBINE (0x1<<10) + +/* + * This flag when present in a SEQUENCE OF, SET OF or EXPLICIT causes + * indefinite length constructed encoding to be used if required. + */ + +# define ASN1_TFLG_NDEF (0x1<<11) + +/* This is the actual ASN1 item itself */ + +struct ASN1_ITEM_st { + char itype; /* The item type, primitive, SEQUENCE, CHOICE + * or extern */ + long utype; /* underlying type */ + const ASN1_TEMPLATE *templates; /* If SEQUENCE or CHOICE this contains + * the contents */ + long tcount; /* Number of templates if SEQUENCE or CHOICE */ + const void *funcs; /* functions that handle this type */ + long size; /* Structure size (usually) */ +# ifndef NO_ASN1_FIELD_NAMES + const char *sname; /* Structure name */ +# endif +}; + +/*- + * These are values for the itype field and + * determine how the type is interpreted. + * + * For PRIMITIVE types the underlying type + * determines the behaviour if items is NULL. + * + * Otherwise templates must contain a single + * template and the type is treated in the + * same way as the type specified in the template. + * + * For SEQUENCE types the templates field points + * to the members, the size field is the + * structure size. + * + * For CHOICE types the templates field points + * to each possible member (typically a union) + * and the 'size' field is the offset of the + * selector. + * + * The 'funcs' field is used for application + * specific functions. + * + * For COMPAT types the funcs field gives a + * set of functions that handle this type, this + * supports the old d2i, i2d convention. + * + * The EXTERN type uses a new style d2i/i2d. + * The new style should be used where possible + * because it avoids things like the d2i IMPLICIT + * hack. + * + * MSTRING is a multiple string type, it is used + * for a CHOICE of character strings where the + * actual strings all occupy an ASN1_STRING + * structure. In this case the 'utype' field + * has a special meaning, it is used as a mask + * of acceptable types using the B_ASN1 constants. + * + * NDEF_SEQUENCE is the same as SEQUENCE except + * that it will use indefinite length constructed + * encoding if requested. + * + */ + +# define ASN1_ITYPE_PRIMITIVE 0x0 + +# define ASN1_ITYPE_SEQUENCE 0x1 + +# define ASN1_ITYPE_CHOICE 0x2 + +# define ASN1_ITYPE_COMPAT 0x3 + +# define ASN1_ITYPE_EXTERN 0x4 + +# define ASN1_ITYPE_MSTRING 0x5 + +# define ASN1_ITYPE_NDEF_SEQUENCE 0x6 + +/* + * Cache for ASN1 tag and length, so we don't keep re-reading it for things + * like CHOICE + */ + +struct ASN1_TLC_st { + char valid; /* Values below are valid */ + int ret; /* return value */ + long plen; /* length */ + int ptag; /* class value */ + int pclass; /* class value */ + int hdrlen; /* header length */ +}; + +/* Typedefs for ASN1 function pointers */ + +typedef ASN1_VALUE *ASN1_new_func(void); +typedef void ASN1_free_func(ASN1_VALUE *a); +typedef ASN1_VALUE *ASN1_d2i_func(ASN1_VALUE **a, const unsigned char **in, + long length); +typedef int ASN1_i2d_func(ASN1_VALUE *a, unsigned char **in); + +typedef int ASN1_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, + const ASN1_ITEM *it, int tag, int aclass, char opt, + ASN1_TLC *ctx); + +typedef int ASN1_ex_i2d(ASN1_VALUE **pval, unsigned char **out, + const ASN1_ITEM *it, int tag, int aclass); +typedef int ASN1_ex_new_func(ASN1_VALUE **pval, const ASN1_ITEM *it); +typedef void ASN1_ex_free_func(ASN1_VALUE **pval, const ASN1_ITEM *it); + +typedef int ASN1_ex_print_func(BIO *out, ASN1_VALUE **pval, + int indent, const char *fname, + const ASN1_PCTX *pctx); + +typedef int ASN1_primitive_i2c(ASN1_VALUE **pval, unsigned char *cont, + int *putype, const ASN1_ITEM *it); +typedef int ASN1_primitive_c2i(ASN1_VALUE **pval, const unsigned char *cont, + int len, int utype, char *free_cont, + const ASN1_ITEM *it); +typedef int ASN1_primitive_print(BIO *out, ASN1_VALUE **pval, + const ASN1_ITEM *it, int indent, + const ASN1_PCTX *pctx); + +typedef struct ASN1_COMPAT_FUNCS_st { + ASN1_new_func *asn1_new; + ASN1_free_func *asn1_free; + ASN1_d2i_func *asn1_d2i; + ASN1_i2d_func *asn1_i2d; +} ASN1_COMPAT_FUNCS; + +typedef struct ASN1_EXTERN_FUNCS_st { + void *app_data; + ASN1_ex_new_func *asn1_ex_new; + ASN1_ex_free_func *asn1_ex_free; + ASN1_ex_free_func *asn1_ex_clear; + ASN1_ex_d2i *asn1_ex_d2i; + ASN1_ex_i2d *asn1_ex_i2d; + ASN1_ex_print_func *asn1_ex_print; +} ASN1_EXTERN_FUNCS; + +typedef struct ASN1_PRIMITIVE_FUNCS_st { + void *app_data; + unsigned long flags; + ASN1_ex_new_func *prim_new; + ASN1_ex_free_func *prim_free; + ASN1_ex_free_func *prim_clear; + ASN1_primitive_c2i *prim_c2i; + ASN1_primitive_i2c *prim_i2c; + ASN1_primitive_print *prim_print; +} ASN1_PRIMITIVE_FUNCS; + +/* + * This is the ASN1_AUX structure: it handles various miscellaneous + * requirements. For example the use of reference counts and an informational + * callback. The "informational callback" is called at various points during + * the ASN1 encoding and decoding. It can be used to provide minor + * customisation of the structures used. This is most useful where the + * supplied routines *almost* do the right thing but need some extra help at + * a few points. If the callback returns zero then it is assumed a fatal + * error has occurred and the main operation should be abandoned. If major + * changes in the default behaviour are required then an external type is + * more appropriate. + */ + +typedef int ASN1_aux_cb(int operation, ASN1_VALUE **in, const ASN1_ITEM *it, + void *exarg); + +typedef struct ASN1_AUX_st { + void *app_data; + int flags; + int ref_offset; /* Offset of reference value */ + int ref_lock; /* Lock type to use */ + ASN1_aux_cb *asn1_cb; + int enc_offset; /* Offset of ASN1_ENCODING structure */ +} ASN1_AUX; + +/* For print related callbacks exarg points to this structure */ +typedef struct ASN1_PRINT_ARG_st { + BIO *out; + int indent; + const ASN1_PCTX *pctx; +} ASN1_PRINT_ARG; + +/* For streaming related callbacks exarg points to this structure */ +typedef struct ASN1_STREAM_ARG_st { + /* BIO to stream through */ + BIO *out; + /* BIO with filters appended */ + BIO *ndef_bio; + /* Streaming I/O boundary */ + unsigned char **boundary; +} ASN1_STREAM_ARG; + +/* Flags in ASN1_AUX */ + +/* Use a reference count */ +# define ASN1_AFLG_REFCOUNT 1 +/* Save the encoding of structure (useful for signatures) */ +# define ASN1_AFLG_ENCODING 2 +/* The Sequence length is invalid */ +# define ASN1_AFLG_BROKEN 4 + +/* operation values for asn1_cb */ + +# define ASN1_OP_NEW_PRE 0 +# define ASN1_OP_NEW_POST 1 +# define ASN1_OP_FREE_PRE 2 +# define ASN1_OP_FREE_POST 3 +# define ASN1_OP_D2I_PRE 4 +# define ASN1_OP_D2I_POST 5 +# define ASN1_OP_I2D_PRE 6 +# define ASN1_OP_I2D_POST 7 +# define ASN1_OP_PRINT_PRE 8 +# define ASN1_OP_PRINT_POST 9 +# define ASN1_OP_STREAM_PRE 10 +# define ASN1_OP_STREAM_POST 11 +# define ASN1_OP_DETACHED_PRE 12 +# define ASN1_OP_DETACHED_POST 13 + +/* Macro to implement a primitive type */ +# define IMPLEMENT_ASN1_TYPE(stname) IMPLEMENT_ASN1_TYPE_ex(stname, stname, 0) +# define IMPLEMENT_ASN1_TYPE_ex(itname, vname, ex) \ + ASN1_ITEM_start(itname) \ + ASN1_ITYPE_PRIMITIVE, V_##vname, NULL, 0, NULL, ex, #itname \ + ASN1_ITEM_end(itname) + +/* Macro to implement a multi string type */ +# define IMPLEMENT_ASN1_MSTRING(itname, mask) \ + ASN1_ITEM_start(itname) \ + ASN1_ITYPE_MSTRING, mask, NULL, 0, NULL, sizeof(ASN1_STRING), #itname \ + ASN1_ITEM_end(itname) + +/* Macro to implement an ASN1_ITEM in terms of old style funcs */ + +# define IMPLEMENT_COMPAT_ASN1(sname) IMPLEMENT_COMPAT_ASN1_type(sname, V_ASN1_SEQUENCE) + +# define IMPLEMENT_COMPAT_ASN1_type(sname, tag) \ + static const ASN1_COMPAT_FUNCS sname##_ff = { \ + (ASN1_new_func *)sname##_new, \ + (ASN1_free_func *)sname##_free, \ + (ASN1_d2i_func *)d2i_##sname, \ + (ASN1_i2d_func *)i2d_##sname, \ + }; \ + ASN1_ITEM_start(sname) \ + ASN1_ITYPE_COMPAT, \ + tag, \ + NULL, \ + 0, \ + &sname##_ff, \ + 0, \ + #sname \ + ASN1_ITEM_end(sname) + +# define IMPLEMENT_EXTERN_ASN1(sname, tag, fptrs) \ + ASN1_ITEM_start(sname) \ + ASN1_ITYPE_EXTERN, \ + tag, \ + NULL, \ + 0, \ + &fptrs, \ + 0, \ + #sname \ + ASN1_ITEM_end(sname) + +/* Macro to implement standard functions in terms of ASN1_ITEM structures */ + +# define IMPLEMENT_ASN1_FUNCTIONS(stname) IMPLEMENT_ASN1_FUNCTIONS_fname(stname, stname, stname) + +# define IMPLEMENT_ASN1_FUNCTIONS_name(stname, itname) IMPLEMENT_ASN1_FUNCTIONS_fname(stname, itname, itname) + +# define IMPLEMENT_ASN1_FUNCTIONS_ENCODE_name(stname, itname) \ + IMPLEMENT_ASN1_FUNCTIONS_ENCODE_fname(stname, itname, itname) + +# define IMPLEMENT_STATIC_ASN1_ALLOC_FUNCTIONS(stname) \ + IMPLEMENT_ASN1_ALLOC_FUNCTIONS_pfname(static, stname, stname, stname) + +# define IMPLEMENT_ASN1_ALLOC_FUNCTIONS(stname) \ + IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, stname, stname) + +# define IMPLEMENT_ASN1_ALLOC_FUNCTIONS_pfname(pre, stname, itname, fname) \ + pre stname *fname##_new(void) \ + { \ + return (stname *)ASN1_item_new(ASN1_ITEM_rptr(itname)); \ + } \ + pre void fname##_free(stname *a) \ + { \ + ASN1_item_free((ASN1_VALUE *)a, ASN1_ITEM_rptr(itname)); \ + } + +# define IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname) \ + stname *fname##_new(void) \ + { \ + return (stname *)ASN1_item_new(ASN1_ITEM_rptr(itname)); \ + } \ + void fname##_free(stname *a) \ + { \ + ASN1_item_free((ASN1_VALUE *)a, ASN1_ITEM_rptr(itname)); \ + } + +# define IMPLEMENT_ASN1_FUNCTIONS_fname(stname, itname, fname) \ + IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(stname, itname, fname) \ + IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname) + +# define IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(stname, itname, fname) \ + stname *d2i_##fname(stname **a, const unsigned char **in, long len) \ + { \ + return (stname *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, ASN1_ITEM_rptr(itname));\ + } \ + int i2d_##fname(stname *a, unsigned char **out) \ + { \ + return ASN1_item_i2d((ASN1_VALUE *)a, out, ASN1_ITEM_rptr(itname));\ + } + +# define IMPLEMENT_ASN1_NDEF_FUNCTION(stname) \ + int i2d_##stname##_NDEF(stname *a, unsigned char **out) \ + { \ + return ASN1_item_ndef_i2d((ASN1_VALUE *)a, out, ASN1_ITEM_rptr(stname));\ + } + +/* + * This includes evil casts to remove const: they will go away when full ASN1 + * constification is done. + */ +# define IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(stname, itname, fname) \ + stname *d2i_##fname(stname **a, const unsigned char **in, long len) \ + { \ + return (stname *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, ASN1_ITEM_rptr(itname));\ + } \ + int i2d_##fname(const stname *a, unsigned char **out) \ + { \ + return ASN1_item_i2d((ASN1_VALUE *)a, out, ASN1_ITEM_rptr(itname));\ + } + +# define IMPLEMENT_ASN1_DUP_FUNCTION(stname) \ + stname * stname##_dup(stname *x) \ + { \ + return ASN1_item_dup(ASN1_ITEM_rptr(stname), x); \ + } + +# define IMPLEMENT_ASN1_PRINT_FUNCTION(stname) \ + IMPLEMENT_ASN1_PRINT_FUNCTION_fname(stname, stname, stname) + +# define IMPLEMENT_ASN1_PRINT_FUNCTION_fname(stname, itname, fname) \ + int fname##_print_ctx(BIO *out, stname *x, int indent, \ + const ASN1_PCTX *pctx) \ + { \ + return ASN1_item_print(out, (ASN1_VALUE *)x, indent, \ + ASN1_ITEM_rptr(itname), pctx); \ + } + +# define IMPLEMENT_ASN1_FUNCTIONS_const(name) \ + IMPLEMENT_ASN1_FUNCTIONS_const_fname(name, name, name) + +# define IMPLEMENT_ASN1_FUNCTIONS_const_fname(stname, itname, fname) \ + IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(stname, itname, fname) \ + IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname) + +/* external definitions for primitive types */ + +DECLARE_ASN1_ITEM(ASN1_BOOLEAN) +DECLARE_ASN1_ITEM(ASN1_TBOOLEAN) +DECLARE_ASN1_ITEM(ASN1_FBOOLEAN) +DECLARE_ASN1_ITEM(ASN1_SEQUENCE) +DECLARE_ASN1_ITEM(CBIGNUM) +DECLARE_ASN1_ITEM(BIGNUM) +DECLARE_ASN1_ITEM(LONG) +DECLARE_ASN1_ITEM(ZLONG) + +DECLARE_STACK_OF(ASN1_VALUE) + +/* Functions used internally by the ASN1 code */ + +int ASN1_item_ex_new(ASN1_VALUE **pval, const ASN1_ITEM *it); +void ASN1_item_ex_free(ASN1_VALUE **pval, const ASN1_ITEM *it); +int ASN1_template_new(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt); +int ASN1_primitive_new(ASN1_VALUE **pval, const ASN1_ITEM *it); + +void ASN1_template_free(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt); +int ASN1_template_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, + const ASN1_TEMPLATE *tt); +int ASN1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, + const ASN1_ITEM *it, int tag, int aclass, char opt, + ASN1_TLC *ctx); + +int ASN1_item_ex_i2d(ASN1_VALUE **pval, unsigned char **out, + const ASN1_ITEM *it, int tag, int aclass); +int ASN1_template_i2d(ASN1_VALUE **pval, unsigned char **out, + const ASN1_TEMPLATE *tt); +void ASN1_primitive_free(ASN1_VALUE **pval, const ASN1_ITEM *it); + +int asn1_ex_i2c(ASN1_VALUE **pval, unsigned char *cont, int *putype, + const ASN1_ITEM *it); +int asn1_ex_c2i(ASN1_VALUE **pval, const unsigned char *cont, int len, + int utype, char *free_cont, const ASN1_ITEM *it); + +int asn1_get_choice_selector(ASN1_VALUE **pval, const ASN1_ITEM *it); +int asn1_set_choice_selector(ASN1_VALUE **pval, int value, + const ASN1_ITEM *it); + +ASN1_VALUE **asn1_get_field_ptr(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt); + +const ASN1_TEMPLATE *asn1_do_adb(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt, + int nullerr); + +int asn1_do_lock(ASN1_VALUE **pval, int op, const ASN1_ITEM *it); + +void asn1_enc_init(ASN1_VALUE **pval, const ASN1_ITEM *it); +void asn1_enc_free(ASN1_VALUE **pval, const ASN1_ITEM *it); +int asn1_enc_restore(int *len, unsigned char **out, ASN1_VALUE **pval, + const ASN1_ITEM *it); +int asn1_enc_save(ASN1_VALUE **pval, const unsigned char *in, int inlen, + const ASN1_ITEM *it); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/win/openssl/include/openssl/bio.h b/hdssd/external/win/openssl/include/openssl/bio.h new file mode 100644 index 0000000..6790aed --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/bio.h @@ -0,0 +1,883 @@ +/* crypto/bio/bio.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_BIO_H +# define HEADER_BIO_H + +# include + +# ifndef OPENSSL_NO_FP_API +# include +# endif +# include + +# include + +# ifndef OPENSSL_NO_SCTP +# ifndef OPENSSL_SYS_VMS +# include +# else +# include +# endif +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* These are the 'types' of BIOs */ +# define BIO_TYPE_NONE 0 +# define BIO_TYPE_MEM (1|0x0400) +# define BIO_TYPE_FILE (2|0x0400) + +# define BIO_TYPE_FD (4|0x0400|0x0100) +# define BIO_TYPE_SOCKET (5|0x0400|0x0100) +# define BIO_TYPE_NULL (6|0x0400) +# define BIO_TYPE_SSL (7|0x0200) +# define BIO_TYPE_MD (8|0x0200)/* passive filter */ +# define BIO_TYPE_BUFFER (9|0x0200)/* filter */ +# define BIO_TYPE_CIPHER (10|0x0200)/* filter */ +# define BIO_TYPE_BASE64 (11|0x0200)/* filter */ +# define BIO_TYPE_CONNECT (12|0x0400|0x0100)/* socket - connect */ +# define BIO_TYPE_ACCEPT (13|0x0400|0x0100)/* socket for accept */ +# define BIO_TYPE_PROXY_CLIENT (14|0x0200)/* client proxy BIO */ +# define BIO_TYPE_PROXY_SERVER (15|0x0200)/* server proxy BIO */ +# define BIO_TYPE_NBIO_TEST (16|0x0200)/* server proxy BIO */ +# define BIO_TYPE_NULL_FILTER (17|0x0200) +# define BIO_TYPE_BER (18|0x0200)/* BER -> bin filter */ +# define BIO_TYPE_BIO (19|0x0400)/* (half a) BIO pair */ +# define BIO_TYPE_LINEBUFFER (20|0x0200)/* filter */ +# define BIO_TYPE_DGRAM (21|0x0400|0x0100) +# ifndef OPENSSL_NO_SCTP +# define BIO_TYPE_DGRAM_SCTP (24|0x0400|0x0100) +# endif +# define BIO_TYPE_ASN1 (22|0x0200)/* filter */ +# define BIO_TYPE_COMP (23|0x0200)/* filter */ + +# define BIO_TYPE_DESCRIPTOR 0x0100/* socket, fd, connect or accept */ +# define BIO_TYPE_FILTER 0x0200 +# define BIO_TYPE_SOURCE_SINK 0x0400 + +/* + * BIO_FILENAME_READ|BIO_CLOSE to open or close on free. + * BIO_set_fp(in,stdin,BIO_NOCLOSE); + */ +# define BIO_NOCLOSE 0x00 +# define BIO_CLOSE 0x01 + +/* + * These are used in the following macros and are passed to BIO_ctrl() + */ +# define BIO_CTRL_RESET 1/* opt - rewind/zero etc */ +# define BIO_CTRL_EOF 2/* opt - are we at the eof */ +# define BIO_CTRL_INFO 3/* opt - extra tit-bits */ +# define BIO_CTRL_SET 4/* man - set the 'IO' type */ +# define BIO_CTRL_GET 5/* man - get the 'IO' type */ +# define BIO_CTRL_PUSH 6/* opt - internal, used to signify change */ +# define BIO_CTRL_POP 7/* opt - internal, used to signify change */ +# define BIO_CTRL_GET_CLOSE 8/* man - set the 'close' on free */ +# define BIO_CTRL_SET_CLOSE 9/* man - set the 'close' on free */ +# define BIO_CTRL_PENDING 10/* opt - is their more data buffered */ +# define BIO_CTRL_FLUSH 11/* opt - 'flush' buffered output */ +# define BIO_CTRL_DUP 12/* man - extra stuff for 'duped' BIO */ +# define BIO_CTRL_WPENDING 13/* opt - number of bytes still to write */ +/* callback is int cb(BIO *bio,state,ret); */ +# define BIO_CTRL_SET_CALLBACK 14/* opt - set callback function */ +# define BIO_CTRL_GET_CALLBACK 15/* opt - set callback function */ + +# define BIO_CTRL_SET_FILENAME 30/* BIO_s_file special */ + +/* dgram BIO stuff */ +# define BIO_CTRL_DGRAM_CONNECT 31/* BIO dgram special */ +# define BIO_CTRL_DGRAM_SET_CONNECTED 32/* allow for an externally connected + * socket to be passed in */ +# define BIO_CTRL_DGRAM_SET_RECV_TIMEOUT 33/* setsockopt, essentially */ +# define BIO_CTRL_DGRAM_GET_RECV_TIMEOUT 34/* getsockopt, essentially */ +# define BIO_CTRL_DGRAM_SET_SEND_TIMEOUT 35/* setsockopt, essentially */ +# define BIO_CTRL_DGRAM_GET_SEND_TIMEOUT 36/* getsockopt, essentially */ + +# define BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP 37/* flag whether the last */ +# define BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP 38/* I/O operation tiemd out */ + +/* #ifdef IP_MTU_DISCOVER */ +# define BIO_CTRL_DGRAM_MTU_DISCOVER 39/* set DF bit on egress packets */ +/* #endif */ + +# define BIO_CTRL_DGRAM_QUERY_MTU 40/* as kernel for current MTU */ +# define BIO_CTRL_DGRAM_GET_FALLBACK_MTU 47 +# define BIO_CTRL_DGRAM_GET_MTU 41/* get cached value for MTU */ +# define BIO_CTRL_DGRAM_SET_MTU 42/* set cached value for MTU. + * want to use this if asking + * the kernel fails */ + +# define BIO_CTRL_DGRAM_MTU_EXCEEDED 43/* check whether the MTU was + * exceed in the previous write + * operation */ + +# define BIO_CTRL_DGRAM_GET_PEER 46 +# define BIO_CTRL_DGRAM_SET_PEER 44/* Destination for the data */ + +# define BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT 45/* Next DTLS handshake timeout + * to adjust socket timeouts */ +# define BIO_CTRL_DGRAM_SET_DONT_FRAG 48 + +# define BIO_CTRL_DGRAM_GET_MTU_OVERHEAD 49 + +# ifndef OPENSSL_NO_SCTP +/* SCTP stuff */ +# define BIO_CTRL_DGRAM_SCTP_SET_IN_HANDSHAKE 50 +# define BIO_CTRL_DGRAM_SCTP_ADD_AUTH_KEY 51 +# define BIO_CTRL_DGRAM_SCTP_NEXT_AUTH_KEY 52 +# define BIO_CTRL_DGRAM_SCTP_AUTH_CCS_RCVD 53 +# define BIO_CTRL_DGRAM_SCTP_GET_SNDINFO 60 +# define BIO_CTRL_DGRAM_SCTP_SET_SNDINFO 61 +# define BIO_CTRL_DGRAM_SCTP_GET_RCVINFO 62 +# define BIO_CTRL_DGRAM_SCTP_SET_RCVINFO 63 +# define BIO_CTRL_DGRAM_SCTP_GET_PRINFO 64 +# define BIO_CTRL_DGRAM_SCTP_SET_PRINFO 65 +# define BIO_CTRL_DGRAM_SCTP_SAVE_SHUTDOWN 70 +# endif + +/* modifiers */ +# define BIO_FP_READ 0x02 +# define BIO_FP_WRITE 0x04 +# define BIO_FP_APPEND 0x08 +# define BIO_FP_TEXT 0x10 + +# define BIO_FLAGS_READ 0x01 +# define BIO_FLAGS_WRITE 0x02 +# define BIO_FLAGS_IO_SPECIAL 0x04 +# define BIO_FLAGS_RWS (BIO_FLAGS_READ|BIO_FLAGS_WRITE|BIO_FLAGS_IO_SPECIAL) +# define BIO_FLAGS_SHOULD_RETRY 0x08 +# ifndef BIO_FLAGS_UPLINK +/* + * "UPLINK" flag denotes file descriptors provided by application. It + * defaults to 0, as most platforms don't require UPLINK interface. + */ +# define BIO_FLAGS_UPLINK 0 +# endif + +/* Used in BIO_gethostbyname() */ +# define BIO_GHBN_CTRL_HITS 1 +# define BIO_GHBN_CTRL_MISSES 2 +# define BIO_GHBN_CTRL_CACHE_SIZE 3 +# define BIO_GHBN_CTRL_GET_ENTRY 4 +# define BIO_GHBN_CTRL_FLUSH 5 + +/* Mostly used in the SSL BIO */ +/*- + * Not used anymore + * #define BIO_FLAGS_PROTOCOL_DELAYED_READ 0x10 + * #define BIO_FLAGS_PROTOCOL_DELAYED_WRITE 0x20 + * #define BIO_FLAGS_PROTOCOL_STARTUP 0x40 + */ + +# define BIO_FLAGS_BASE64_NO_NL 0x100 + +/* + * This is used with memory BIOs: it means we shouldn't free up or change the + * data in any way. + */ +# define BIO_FLAGS_MEM_RDONLY 0x200 + +typedef struct bio_st BIO; + +void BIO_set_flags(BIO *b, int flags); +int BIO_test_flags(const BIO *b, int flags); +void BIO_clear_flags(BIO *b, int flags); + +# define BIO_get_flags(b) BIO_test_flags(b, ~(0x0)) +# define BIO_set_retry_special(b) \ + BIO_set_flags(b, (BIO_FLAGS_IO_SPECIAL|BIO_FLAGS_SHOULD_RETRY)) +# define BIO_set_retry_read(b) \ + BIO_set_flags(b, (BIO_FLAGS_READ|BIO_FLAGS_SHOULD_RETRY)) +# define BIO_set_retry_write(b) \ + BIO_set_flags(b, (BIO_FLAGS_WRITE|BIO_FLAGS_SHOULD_RETRY)) + +/* These are normally used internally in BIOs */ +# define BIO_clear_retry_flags(b) \ + BIO_clear_flags(b, (BIO_FLAGS_RWS|BIO_FLAGS_SHOULD_RETRY)) +# define BIO_get_retry_flags(b) \ + BIO_test_flags(b, (BIO_FLAGS_RWS|BIO_FLAGS_SHOULD_RETRY)) + +/* These should be used by the application to tell why we should retry */ +# define BIO_should_read(a) BIO_test_flags(a, BIO_FLAGS_READ) +# define BIO_should_write(a) BIO_test_flags(a, BIO_FLAGS_WRITE) +# define BIO_should_io_special(a) BIO_test_flags(a, BIO_FLAGS_IO_SPECIAL) +# define BIO_retry_type(a) BIO_test_flags(a, BIO_FLAGS_RWS) +# define BIO_should_retry(a) BIO_test_flags(a, BIO_FLAGS_SHOULD_RETRY) + +/* + * The next three are used in conjunction with the BIO_should_io_special() + * condition. After this returns true, BIO *BIO_get_retry_BIO(BIO *bio, int + * *reason); will walk the BIO stack and return the 'reason' for the special + * and the offending BIO. Given a BIO, BIO_get_retry_reason(bio) will return + * the code. + */ +/* + * Returned from the SSL bio when the certificate retrieval code had an error + */ +# define BIO_RR_SSL_X509_LOOKUP 0x01 +/* Returned from the connect BIO when a connect would have blocked */ +# define BIO_RR_CONNECT 0x02 +/* Returned from the accept BIO when an accept would have blocked */ +# define BIO_RR_ACCEPT 0x03 + +/* These are passed by the BIO callback */ +# define BIO_CB_FREE 0x01 +# define BIO_CB_READ 0x02 +# define BIO_CB_WRITE 0x03 +# define BIO_CB_PUTS 0x04 +# define BIO_CB_GETS 0x05 +# define BIO_CB_CTRL 0x06 + +/* + * The callback is called before and after the underling operation, The + * BIO_CB_RETURN flag indicates if it is after the call + */ +# define BIO_CB_RETURN 0x80 +# define BIO_CB_return(a) ((a)|BIO_CB_RETURN) +# define BIO_cb_pre(a) (!((a)&BIO_CB_RETURN)) +# define BIO_cb_post(a) ((a)&BIO_CB_RETURN) + +long (*BIO_get_callback(const BIO *b)) (struct bio_st *, int, const char *, + int, long, long); +void BIO_set_callback(BIO *b, + long (*callback) (struct bio_st *, int, const char *, + int, long, long)); +char *BIO_get_callback_arg(const BIO *b); +void BIO_set_callback_arg(BIO *b, char *arg); + +const char *BIO_method_name(const BIO *b); +int BIO_method_type(const BIO *b); + +typedef void bio_info_cb (struct bio_st *, int, const char *, int, long, + long); + +typedef struct bio_method_st { + int type; + const char *name; + int (*bwrite) (BIO *, const char *, int); + int (*bread) (BIO *, char *, int); + int (*bputs) (BIO *, const char *); + int (*bgets) (BIO *, char *, int); + long (*ctrl) (BIO *, int, long, void *); + int (*create) (BIO *); + int (*destroy) (BIO *); + long (*callback_ctrl) (BIO *, int, bio_info_cb *); +} BIO_METHOD; + +struct bio_st { + BIO_METHOD *method; + /* bio, mode, argp, argi, argl, ret */ + long (*callback) (struct bio_st *, int, const char *, int, long, long); + char *cb_arg; /* first argument for the callback */ + int init; + int shutdown; + int flags; /* extra storage */ + int retry_reason; + int num; + void *ptr; + struct bio_st *next_bio; /* used by filter BIOs */ + struct bio_st *prev_bio; /* used by filter BIOs */ + int references; + unsigned long num_read; + unsigned long num_write; + CRYPTO_EX_DATA ex_data; +}; + +DECLARE_STACK_OF(BIO) + +typedef struct bio_f_buffer_ctx_struct { + /*- + * Buffers are setup like this: + * + * <---------------------- size -----------------------> + * +---------------------------------------------------+ + * | consumed | remaining | free space | + * +---------------------------------------------------+ + * <-- off --><------- len -------> + */ + /*- BIO *bio; *//* + * this is now in the BIO struct + */ + int ibuf_size; /* how big is the input buffer */ + int obuf_size; /* how big is the output buffer */ + char *ibuf; /* the char array */ + int ibuf_len; /* how many bytes are in it */ + int ibuf_off; /* write/read offset */ + char *obuf; /* the char array */ + int obuf_len; /* how many bytes are in it */ + int obuf_off; /* write/read offset */ +} BIO_F_BUFFER_CTX; + +/* Prefix and suffix callback in ASN1 BIO */ +typedef int asn1_ps_func (BIO *b, unsigned char **pbuf, int *plen, + void *parg); + +# ifndef OPENSSL_NO_SCTP +/* SCTP parameter structs */ +struct bio_dgram_sctp_sndinfo { + uint16_t snd_sid; + uint16_t snd_flags; + uint32_t snd_ppid; + uint32_t snd_context; +}; + +struct bio_dgram_sctp_rcvinfo { + uint16_t rcv_sid; + uint16_t rcv_ssn; + uint16_t rcv_flags; + uint32_t rcv_ppid; + uint32_t rcv_tsn; + uint32_t rcv_cumtsn; + uint32_t rcv_context; +}; + +struct bio_dgram_sctp_prinfo { + uint16_t pr_policy; + uint32_t pr_value; +}; +# endif + +/* connect BIO stuff */ +# define BIO_CONN_S_BEFORE 1 +# define BIO_CONN_S_GET_IP 2 +# define BIO_CONN_S_GET_PORT 3 +# define BIO_CONN_S_CREATE_SOCKET 4 +# define BIO_CONN_S_CONNECT 5 +# define BIO_CONN_S_OK 6 +# define BIO_CONN_S_BLOCKED_CONNECT 7 +# define BIO_CONN_S_NBIO 8 +/* + * #define BIO_CONN_get_param_hostname BIO_ctrl + */ + +# define BIO_C_SET_CONNECT 100 +# define BIO_C_DO_STATE_MACHINE 101 +# define BIO_C_SET_NBIO 102 +# define BIO_C_SET_PROXY_PARAM 103 +# define BIO_C_SET_FD 104 +# define BIO_C_GET_FD 105 +# define BIO_C_SET_FILE_PTR 106 +# define BIO_C_GET_FILE_PTR 107 +# define BIO_C_SET_FILENAME 108 +# define BIO_C_SET_SSL 109 +# define BIO_C_GET_SSL 110 +# define BIO_C_SET_MD 111 +# define BIO_C_GET_MD 112 +# define BIO_C_GET_CIPHER_STATUS 113 +# define BIO_C_SET_BUF_MEM 114 +# define BIO_C_GET_BUF_MEM_PTR 115 +# define BIO_C_GET_BUFF_NUM_LINES 116 +# define BIO_C_SET_BUFF_SIZE 117 +# define BIO_C_SET_ACCEPT 118 +# define BIO_C_SSL_MODE 119 +# define BIO_C_GET_MD_CTX 120 +# define BIO_C_GET_PROXY_PARAM 121 +# define BIO_C_SET_BUFF_READ_DATA 122/* data to read first */ +# define BIO_C_GET_CONNECT 123 +# define BIO_C_GET_ACCEPT 124 +# define BIO_C_SET_SSL_RENEGOTIATE_BYTES 125 +# define BIO_C_GET_SSL_NUM_RENEGOTIATES 126 +# define BIO_C_SET_SSL_RENEGOTIATE_TIMEOUT 127 +# define BIO_C_FILE_SEEK 128 +# define BIO_C_GET_CIPHER_CTX 129 +# define BIO_C_SET_BUF_MEM_EOF_RETURN 130/* return end of input + * value */ +# define BIO_C_SET_BIND_MODE 131 +# define BIO_C_GET_BIND_MODE 132 +# define BIO_C_FILE_TELL 133 +# define BIO_C_GET_SOCKS 134 +# define BIO_C_SET_SOCKS 135 + +# define BIO_C_SET_WRITE_BUF_SIZE 136/* for BIO_s_bio */ +# define BIO_C_GET_WRITE_BUF_SIZE 137 +# define BIO_C_MAKE_BIO_PAIR 138 +# define BIO_C_DESTROY_BIO_PAIR 139 +# define BIO_C_GET_WRITE_GUARANTEE 140 +# define BIO_C_GET_READ_REQUEST 141 +# define BIO_C_SHUTDOWN_WR 142 +# define BIO_C_NREAD0 143 +# define BIO_C_NREAD 144 +# define BIO_C_NWRITE0 145 +# define BIO_C_NWRITE 146 +# define BIO_C_RESET_READ_REQUEST 147 +# define BIO_C_SET_MD_CTX 148 + +# define BIO_C_SET_PREFIX 149 +# define BIO_C_GET_PREFIX 150 +# define BIO_C_SET_SUFFIX 151 +# define BIO_C_GET_SUFFIX 152 + +# define BIO_C_SET_EX_ARG 153 +# define BIO_C_GET_EX_ARG 154 + +# define BIO_set_app_data(s,arg) BIO_set_ex_data(s,0,arg) +# define BIO_get_app_data(s) BIO_get_ex_data(s,0) + +/* BIO_s_connect() and BIO_s_socks4a_connect() */ +# define BIO_set_conn_hostname(b,name) BIO_ctrl(b,BIO_C_SET_CONNECT,0,(char *)name) +# define BIO_set_conn_port(b,port) BIO_ctrl(b,BIO_C_SET_CONNECT,1,(char *)port) +# define BIO_set_conn_ip(b,ip) BIO_ctrl(b,BIO_C_SET_CONNECT,2,(char *)ip) +# define BIO_set_conn_int_port(b,port) BIO_ctrl(b,BIO_C_SET_CONNECT,3,(char *)port) +# define BIO_get_conn_hostname(b) BIO_ptr_ctrl(b,BIO_C_GET_CONNECT,0) +# define BIO_get_conn_port(b) BIO_ptr_ctrl(b,BIO_C_GET_CONNECT,1) +# define BIO_get_conn_ip(b) BIO_ptr_ctrl(b,BIO_C_GET_CONNECT,2) +# define BIO_get_conn_int_port(b) BIO_ctrl(b,BIO_C_GET_CONNECT,3,NULL) + +# define BIO_set_nbio(b,n) BIO_ctrl(b,BIO_C_SET_NBIO,(n),NULL) + +/* BIO_s_accept() */ +# define BIO_set_accept_port(b,name) BIO_ctrl(b,BIO_C_SET_ACCEPT,0,(char *)name) +# define BIO_get_accept_port(b) BIO_ptr_ctrl(b,BIO_C_GET_ACCEPT,0) +/* #define BIO_set_nbio(b,n) BIO_ctrl(b,BIO_C_SET_NBIO,(n),NULL) */ +# define BIO_set_nbio_accept(b,n) BIO_ctrl(b,BIO_C_SET_ACCEPT,1,(n)?(void *)"a":NULL) +# define BIO_set_accept_bios(b,bio) BIO_ctrl(b,BIO_C_SET_ACCEPT,2,(char *)bio) + +# define BIO_BIND_NORMAL 0 +# define BIO_BIND_REUSEADDR_IF_UNUSED 1 +# define BIO_BIND_REUSEADDR 2 +# define BIO_set_bind_mode(b,mode) BIO_ctrl(b,BIO_C_SET_BIND_MODE,mode,NULL) +# define BIO_get_bind_mode(b,mode) BIO_ctrl(b,BIO_C_GET_BIND_MODE,0,NULL) + +/* BIO_s_accept() and BIO_s_connect() */ +# define BIO_do_connect(b) BIO_do_handshake(b) +# define BIO_do_accept(b) BIO_do_handshake(b) +# define BIO_do_handshake(b) BIO_ctrl(b,BIO_C_DO_STATE_MACHINE,0,NULL) + +/* BIO_s_proxy_client() */ +# define BIO_set_url(b,url) BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,0,(char *)(url)) +# define BIO_set_proxies(b,p) BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,1,(char *)(p)) +/* BIO_set_nbio(b,n) */ +# define BIO_set_filter_bio(b,s) BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,2,(char *)(s)) +/* BIO *BIO_get_filter_bio(BIO *bio); */ +# define BIO_set_proxy_cb(b,cb) BIO_callback_ctrl(b,BIO_C_SET_PROXY_PARAM,3,(void *(*cb)())) +# define BIO_set_proxy_header(b,sk) BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,4,(char *)sk) +# define BIO_set_no_connect_return(b,bool) BIO_int_ctrl(b,BIO_C_SET_PROXY_PARAM,5,bool) + +# define BIO_get_proxy_header(b,skp) BIO_ctrl(b,BIO_C_GET_PROXY_PARAM,0,(char *)skp) +# define BIO_get_proxies(b,pxy_p) BIO_ctrl(b,BIO_C_GET_PROXY_PARAM,1,(char *)(pxy_p)) +# define BIO_get_url(b,url) BIO_ctrl(b,BIO_C_GET_PROXY_PARAM,2,(char *)(url)) +# define BIO_get_no_connect_return(b) BIO_ctrl(b,BIO_C_GET_PROXY_PARAM,5,NULL) + +/* BIO_s_datagram(), BIO_s_fd(), BIO_s_socket(), BIO_s_accept() and BIO_s_connect() */ +# define BIO_set_fd(b,fd,c) BIO_int_ctrl(b,BIO_C_SET_FD,c,fd) +# define BIO_get_fd(b,c) BIO_ctrl(b,BIO_C_GET_FD,0,(char *)c) + +/* BIO_s_file() */ +# define BIO_set_fp(b,fp,c) BIO_ctrl(b,BIO_C_SET_FILE_PTR,c,(char *)fp) +# define BIO_get_fp(b,fpp) BIO_ctrl(b,BIO_C_GET_FILE_PTR,0,(char *)fpp) + +/* BIO_s_fd() and BIO_s_file() */ +# define BIO_seek(b,ofs) (int)BIO_ctrl(b,BIO_C_FILE_SEEK,ofs,NULL) +# define BIO_tell(b) (int)BIO_ctrl(b,BIO_C_FILE_TELL,0,NULL) + +/* + * name is cast to lose const, but might be better to route through a + * function so we can do it safely + */ +# ifdef CONST_STRICT +/* + * If you are wondering why this isn't defined, its because CONST_STRICT is + * purely a compile-time kludge to allow const to be checked. + */ +int BIO_read_filename(BIO *b, const char *name); +# else +# define BIO_read_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \ + BIO_CLOSE|BIO_FP_READ,(char *)name) +# endif +# define BIO_write_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \ + BIO_CLOSE|BIO_FP_WRITE,name) +# define BIO_append_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \ + BIO_CLOSE|BIO_FP_APPEND,name) +# define BIO_rw_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \ + BIO_CLOSE|BIO_FP_READ|BIO_FP_WRITE,name) + +/* + * WARNING WARNING, this ups the reference count on the read bio of the SSL + * structure. This is because the ssl read BIO is now pointed to by the + * next_bio field in the bio. So when you free the BIO, make sure you are + * doing a BIO_free_all() to catch the underlying BIO. + */ +# define BIO_set_ssl(b,ssl,c) BIO_ctrl(b,BIO_C_SET_SSL,c,(char *)ssl) +# define BIO_get_ssl(b,sslp) BIO_ctrl(b,BIO_C_GET_SSL,0,(char *)sslp) +# define BIO_set_ssl_mode(b,client) BIO_ctrl(b,BIO_C_SSL_MODE,client,NULL) +# define BIO_set_ssl_renegotiate_bytes(b,num) \ + BIO_ctrl(b,BIO_C_SET_SSL_RENEGOTIATE_BYTES,num,NULL); +# define BIO_get_num_renegotiates(b) \ + BIO_ctrl(b,BIO_C_GET_SSL_NUM_RENEGOTIATES,0,NULL); +# define BIO_set_ssl_renegotiate_timeout(b,seconds) \ + BIO_ctrl(b,BIO_C_SET_SSL_RENEGOTIATE_TIMEOUT,seconds,NULL); + +/* defined in evp.h */ +/* #define BIO_set_md(b,md) BIO_ctrl(b,BIO_C_SET_MD,1,(char *)md) */ + +# define BIO_get_mem_data(b,pp) BIO_ctrl(b,BIO_CTRL_INFO,0,(char *)pp) +# define BIO_set_mem_buf(b,bm,c) BIO_ctrl(b,BIO_C_SET_BUF_MEM,c,(char *)bm) +# define BIO_get_mem_ptr(b,pp) BIO_ctrl(b,BIO_C_GET_BUF_MEM_PTR,0,(char *)pp) +# define BIO_set_mem_eof_return(b,v) \ + BIO_ctrl(b,BIO_C_SET_BUF_MEM_EOF_RETURN,v,NULL) + +/* For the BIO_f_buffer() type */ +# define BIO_get_buffer_num_lines(b) BIO_ctrl(b,BIO_C_GET_BUFF_NUM_LINES,0,NULL) +# define BIO_set_buffer_size(b,size) BIO_ctrl(b,BIO_C_SET_BUFF_SIZE,size,NULL) +# define BIO_set_read_buffer_size(b,size) BIO_int_ctrl(b,BIO_C_SET_BUFF_SIZE,size,0) +# define BIO_set_write_buffer_size(b,size) BIO_int_ctrl(b,BIO_C_SET_BUFF_SIZE,size,1) +# define BIO_set_buffer_read_data(b,buf,num) BIO_ctrl(b,BIO_C_SET_BUFF_READ_DATA,num,buf) + +/* Don't use the next one unless you know what you are doing :-) */ +# define BIO_dup_state(b,ret) BIO_ctrl(b,BIO_CTRL_DUP,0,(char *)(ret)) + +# define BIO_reset(b) (int)BIO_ctrl(b,BIO_CTRL_RESET,0,NULL) +# define BIO_eof(b) (int)BIO_ctrl(b,BIO_CTRL_EOF,0,NULL) +# define BIO_set_close(b,c) (int)BIO_ctrl(b,BIO_CTRL_SET_CLOSE,(c),NULL) +# define BIO_get_close(b) (int)BIO_ctrl(b,BIO_CTRL_GET_CLOSE,0,NULL) +# define BIO_pending(b) (int)BIO_ctrl(b,BIO_CTRL_PENDING,0,NULL) +# define BIO_wpending(b) (int)BIO_ctrl(b,BIO_CTRL_WPENDING,0,NULL) +/* ...pending macros have inappropriate return type */ +size_t BIO_ctrl_pending(BIO *b); +size_t BIO_ctrl_wpending(BIO *b); +# define BIO_flush(b) (int)BIO_ctrl(b,BIO_CTRL_FLUSH,0,NULL) +# define BIO_get_info_callback(b,cbp) (int)BIO_ctrl(b,BIO_CTRL_GET_CALLBACK,0, \ + cbp) +# define BIO_set_info_callback(b,cb) (int)BIO_callback_ctrl(b,BIO_CTRL_SET_CALLBACK,cb) + +/* For the BIO_f_buffer() type */ +# define BIO_buffer_get_num_lines(b) BIO_ctrl(b,BIO_CTRL_GET,0,NULL) + +/* For BIO_s_bio() */ +# define BIO_set_write_buf_size(b,size) (int)BIO_ctrl(b,BIO_C_SET_WRITE_BUF_SIZE,size,NULL) +# define BIO_get_write_buf_size(b,size) (size_t)BIO_ctrl(b,BIO_C_GET_WRITE_BUF_SIZE,size,NULL) +# define BIO_make_bio_pair(b1,b2) (int)BIO_ctrl(b1,BIO_C_MAKE_BIO_PAIR,0,b2) +# define BIO_destroy_bio_pair(b) (int)BIO_ctrl(b,BIO_C_DESTROY_BIO_PAIR,0,NULL) +# define BIO_shutdown_wr(b) (int)BIO_ctrl(b, BIO_C_SHUTDOWN_WR, 0, NULL) +/* macros with inappropriate type -- but ...pending macros use int too: */ +# define BIO_get_write_guarantee(b) (int)BIO_ctrl(b,BIO_C_GET_WRITE_GUARANTEE,0,NULL) +# define BIO_get_read_request(b) (int)BIO_ctrl(b,BIO_C_GET_READ_REQUEST,0,NULL) +size_t BIO_ctrl_get_write_guarantee(BIO *b); +size_t BIO_ctrl_get_read_request(BIO *b); +int BIO_ctrl_reset_read_request(BIO *b); + +/* ctrl macros for dgram */ +# define BIO_ctrl_dgram_connect(b,peer) \ + (int)BIO_ctrl(b,BIO_CTRL_DGRAM_CONNECT,0, (char *)peer) +# define BIO_ctrl_set_connected(b, state, peer) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_SET_CONNECTED, state, (char *)peer) +# define BIO_dgram_recv_timedout(b) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP, 0, NULL) +# define BIO_dgram_send_timedout(b) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP, 0, NULL) +# define BIO_dgram_get_peer(b,peer) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_GET_PEER, 0, (char *)peer) +# define BIO_dgram_set_peer(b,peer) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_SET_PEER, 0, (char *)peer) +# define BIO_dgram_get_mtu_overhead(b) \ + (unsigned int)BIO_ctrl((b), BIO_CTRL_DGRAM_GET_MTU_OVERHEAD, 0, NULL) + +/* These two aren't currently implemented */ +/* int BIO_get_ex_num(BIO *bio); */ +/* void BIO_set_ex_free_func(BIO *bio,int idx,void (*cb)()); */ +int BIO_set_ex_data(BIO *bio, int idx, void *data); +void *BIO_get_ex_data(BIO *bio, int idx); +int BIO_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); +unsigned long BIO_number_read(BIO *bio); +unsigned long BIO_number_written(BIO *bio); + +/* For BIO_f_asn1() */ +int BIO_asn1_set_prefix(BIO *b, asn1_ps_func *prefix, + asn1_ps_func *prefix_free); +int BIO_asn1_get_prefix(BIO *b, asn1_ps_func **pprefix, + asn1_ps_func **pprefix_free); +int BIO_asn1_set_suffix(BIO *b, asn1_ps_func *suffix, + asn1_ps_func *suffix_free); +int BIO_asn1_get_suffix(BIO *b, asn1_ps_func **psuffix, + asn1_ps_func **psuffix_free); + +# ifndef OPENSSL_NO_FP_API +BIO_METHOD *BIO_s_file(void); +BIO *BIO_new_file(const char *filename, const char *mode); +BIO *BIO_new_fp(FILE *stream, int close_flag); +# define BIO_s_file_internal BIO_s_file +# endif +BIO *BIO_new(BIO_METHOD *type); +int BIO_set(BIO *a, BIO_METHOD *type); +int BIO_free(BIO *a); +void BIO_vfree(BIO *a); +int BIO_read(BIO *b, void *data, int len); +int BIO_gets(BIO *bp, char *buf, int size); +int BIO_write(BIO *b, const void *data, int len); +int BIO_puts(BIO *bp, const char *buf); +int BIO_indent(BIO *b, int indent, int max); +long BIO_ctrl(BIO *bp, int cmd, long larg, void *parg); +long BIO_callback_ctrl(BIO *b, int cmd, + void (*fp) (struct bio_st *, int, const char *, int, + long, long)); +char *BIO_ptr_ctrl(BIO *bp, int cmd, long larg); +long BIO_int_ctrl(BIO *bp, int cmd, long larg, int iarg); +BIO *BIO_push(BIO *b, BIO *append); +BIO *BIO_pop(BIO *b); +void BIO_free_all(BIO *a); +BIO *BIO_find_type(BIO *b, int bio_type); +BIO *BIO_next(BIO *b); +BIO *BIO_get_retry_BIO(BIO *bio, int *reason); +int BIO_get_retry_reason(BIO *bio); +BIO *BIO_dup_chain(BIO *in); + +int BIO_nread0(BIO *bio, char **buf); +int BIO_nread(BIO *bio, char **buf, int num); +int BIO_nwrite0(BIO *bio, char **buf); +int BIO_nwrite(BIO *bio, char **buf, int num); + +long BIO_debug_callback(BIO *bio, int cmd, const char *argp, int argi, + long argl, long ret); + +BIO_METHOD *BIO_s_mem(void); +BIO *BIO_new_mem_buf(const void *buf, int len); +BIO_METHOD *BIO_s_socket(void); +BIO_METHOD *BIO_s_connect(void); +BIO_METHOD *BIO_s_accept(void); +BIO_METHOD *BIO_s_fd(void); +# ifndef OPENSSL_SYS_OS2 +BIO_METHOD *BIO_s_log(void); +# endif +BIO_METHOD *BIO_s_bio(void); +BIO_METHOD *BIO_s_null(void); +BIO_METHOD *BIO_f_null(void); +BIO_METHOD *BIO_f_buffer(void); +# ifdef OPENSSL_SYS_VMS +BIO_METHOD *BIO_f_linebuffer(void); +# endif +BIO_METHOD *BIO_f_nbio_test(void); +# ifndef OPENSSL_NO_DGRAM +BIO_METHOD *BIO_s_datagram(void); +# ifndef OPENSSL_NO_SCTP +BIO_METHOD *BIO_s_datagram_sctp(void); +# endif +# endif + +/* BIO_METHOD *BIO_f_ber(void); */ + +int BIO_sock_should_retry(int i); +int BIO_sock_non_fatal_error(int error); +int BIO_dgram_non_fatal_error(int error); + +int BIO_fd_should_retry(int i); +int BIO_fd_non_fatal_error(int error); +int BIO_dump_cb(int (*cb) (const void *data, size_t len, void *u), + void *u, const char *s, int len); +int BIO_dump_indent_cb(int (*cb) (const void *data, size_t len, void *u), + void *u, const char *s, int len, int indent); +int BIO_dump(BIO *b, const char *bytes, int len); +int BIO_dump_indent(BIO *b, const char *bytes, int len, int indent); +# ifndef OPENSSL_NO_FP_API +int BIO_dump_fp(FILE *fp, const char *s, int len); +int BIO_dump_indent_fp(FILE *fp, const char *s, int len, int indent); +# endif +int BIO_hex_string(BIO *out, int indent, int width, unsigned char *data, + int datalen); + +struct hostent *BIO_gethostbyname(const char *name); +/*- + * We might want a thread-safe interface too: + * struct hostent *BIO_gethostbyname_r(const char *name, + * struct hostent *result, void *buffer, size_t buflen); + * or something similar (caller allocates a struct hostent, + * pointed to by "result", and additional buffer space for the various + * substructures; if the buffer does not suffice, NULL is returned + * and an appropriate error code is set). + */ +int BIO_sock_error(int sock); +int BIO_socket_ioctl(int fd, long type, void *arg); +int BIO_socket_nbio(int fd, int mode); +int BIO_get_port(const char *str, unsigned short *port_ptr); +int BIO_get_host_ip(const char *str, unsigned char *ip); +int BIO_get_accept_socket(char *host_port, int mode); +int BIO_accept(int sock, char **ip_port); +int BIO_sock_init(void); +void BIO_sock_cleanup(void); +int BIO_set_tcp_ndelay(int sock, int turn_on); + +BIO *BIO_new_socket(int sock, int close_flag); +BIO *BIO_new_dgram(int fd, int close_flag); +# ifndef OPENSSL_NO_SCTP +BIO *BIO_new_dgram_sctp(int fd, int close_flag); +int BIO_dgram_is_sctp(BIO *bio); +int BIO_dgram_sctp_notification_cb(BIO *b, + void (*handle_notifications) (BIO *bio, + void + *context, + void *buf), + void *context); +int BIO_dgram_sctp_wait_for_dry(BIO *b); +int BIO_dgram_sctp_msg_waiting(BIO *b); +# endif +BIO *BIO_new_fd(int fd, int close_flag); +BIO *BIO_new_connect(const char *host_port); +BIO *BIO_new_accept(const char *host_port); + +int BIO_new_bio_pair(BIO **bio1, size_t writebuf1, + BIO **bio2, size_t writebuf2); +/* + * If successful, returns 1 and in *bio1, *bio2 two BIO pair endpoints. + * Otherwise returns 0 and sets *bio1 and *bio2 to NULL. Size 0 uses default + * value. + */ + +void BIO_copy_next_retry(BIO *b); + +/* + * long BIO_ghbn_ctrl(int cmd,int iarg,char *parg); + */ + +# ifdef __GNUC__ +# define __bio_h__attr__ __attribute__ +# else +# define __bio_h__attr__(x) +# endif +int BIO_printf(BIO *bio, const char *format, ...) +__bio_h__attr__((__format__(__printf__, 2, 3))); +int BIO_vprintf(BIO *bio, const char *format, va_list args) +__bio_h__attr__((__format__(__printf__, 2, 0))); +int BIO_snprintf(char *buf, size_t n, const char *format, ...) +__bio_h__attr__((__format__(__printf__, 3, 4))); +int BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args) +__bio_h__attr__((__format__(__printf__, 3, 0))); +# undef __bio_h__attr__ + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_BIO_strings(void); + +/* Error codes for the BIO functions. */ + +/* Function codes. */ +# define BIO_F_ACPT_STATE 100 +# define BIO_F_BIO_ACCEPT 101 +# define BIO_F_BIO_BER_GET_HEADER 102 +# define BIO_F_BIO_CALLBACK_CTRL 131 +# define BIO_F_BIO_CTRL 103 +# define BIO_F_BIO_GETHOSTBYNAME 120 +# define BIO_F_BIO_GETS 104 +# define BIO_F_BIO_GET_ACCEPT_SOCKET 105 +# define BIO_F_BIO_GET_HOST_IP 106 +# define BIO_F_BIO_GET_PORT 107 +# define BIO_F_BIO_MAKE_PAIR 121 +# define BIO_F_BIO_NEW 108 +# define BIO_F_BIO_NEW_FILE 109 +# define BIO_F_BIO_NEW_MEM_BUF 126 +# define BIO_F_BIO_NREAD 123 +# define BIO_F_BIO_NREAD0 124 +# define BIO_F_BIO_NWRITE 125 +# define BIO_F_BIO_NWRITE0 122 +# define BIO_F_BIO_PUTS 110 +# define BIO_F_BIO_READ 111 +# define BIO_F_BIO_SOCK_INIT 112 +# define BIO_F_BIO_WRITE 113 +# define BIO_F_BUFFER_CTRL 114 +# define BIO_F_CONN_CTRL 127 +# define BIO_F_CONN_STATE 115 +# define BIO_F_DGRAM_SCTP_READ 132 +# define BIO_F_DGRAM_SCTP_WRITE 133 +# define BIO_F_FILE_CTRL 116 +# define BIO_F_FILE_READ 130 +# define BIO_F_LINEBUFFER_CTRL 129 +# define BIO_F_MEM_READ 128 +# define BIO_F_MEM_WRITE 117 +# define BIO_F_SSL_NEW 118 +# define BIO_F_WSASTARTUP 119 + +/* Reason codes. */ +# define BIO_R_ACCEPT_ERROR 100 +# define BIO_R_BAD_FOPEN_MODE 101 +# define BIO_R_BAD_HOSTNAME_LOOKUP 102 +# define BIO_R_BROKEN_PIPE 124 +# define BIO_R_CONNECT_ERROR 103 +# define BIO_R_EOF_ON_MEMORY_BIO 127 +# define BIO_R_ERROR_SETTING_NBIO 104 +# define BIO_R_ERROR_SETTING_NBIO_ON_ACCEPTED_SOCKET 105 +# define BIO_R_ERROR_SETTING_NBIO_ON_ACCEPT_SOCKET 106 +# define BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET 107 +# define BIO_R_INVALID_ARGUMENT 125 +# define BIO_R_INVALID_IP_ADDRESS 108 +# define BIO_R_IN_USE 123 +# define BIO_R_KEEPALIVE 109 +# define BIO_R_NBIO_CONNECT_ERROR 110 +# define BIO_R_NO_ACCEPT_PORT_SPECIFIED 111 +# define BIO_R_NO_HOSTNAME_SPECIFIED 112 +# define BIO_R_NO_PORT_DEFINED 113 +# define BIO_R_NO_PORT_SPECIFIED 114 +# define BIO_R_NO_SUCH_FILE 128 +# define BIO_R_NULL_PARAMETER 115 +# define BIO_R_TAG_MISMATCH 116 +# define BIO_R_UNABLE_TO_BIND_SOCKET 117 +# define BIO_R_UNABLE_TO_CREATE_SOCKET 118 +# define BIO_R_UNABLE_TO_LISTEN_SOCKET 119 +# define BIO_R_UNINITIALIZED 120 +# define BIO_R_UNSUPPORTED_METHOD 121 +# define BIO_R_WRITE_TO_READ_ONLY_BIO 126 +# define BIO_R_WSASTARTUP 122 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/win/openssl/include/openssl/blowfish.h b/hdssd/external/win/openssl/include/openssl/blowfish.h new file mode 100644 index 0000000..8329302 --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/blowfish.h @@ -0,0 +1,130 @@ +/* crypto/bf/blowfish.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_BLOWFISH_H +# define HEADER_BLOWFISH_H + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# ifdef OPENSSL_NO_BF +# error BF is disabled. +# endif + +# define BF_ENCRYPT 1 +# define BF_DECRYPT 0 + +/*- + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + * ! BF_LONG has to be at least 32 bits wide. If it's wider, then ! + * ! BF_LONG_LOG2 has to be defined along. ! + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + */ + +# if defined(__LP32__) +# define BF_LONG unsigned long +# elif defined(OPENSSL_SYS_CRAY) || defined(__ILP64__) +# define BF_LONG unsigned long +# define BF_LONG_LOG2 3 +/* + * _CRAY note. I could declare short, but I have no idea what impact + * does it have on performance on none-T3E machines. I could declare + * int, but at least on C90 sizeof(int) can be chosen at compile time. + * So I've chosen long... + * + */ +# else +# define BF_LONG unsigned int +# endif + +# define BF_ROUNDS 16 +# define BF_BLOCK 8 + +typedef struct bf_key_st { + BF_LONG P[BF_ROUNDS + 2]; + BF_LONG S[4 * 256]; +} BF_KEY; + +# ifdef OPENSSL_FIPS +void private_BF_set_key(BF_KEY *key, int len, const unsigned char *data); +# endif +void BF_set_key(BF_KEY *key, int len, const unsigned char *data); + +void BF_encrypt(BF_LONG *data, const BF_KEY *key); +void BF_decrypt(BF_LONG *data, const BF_KEY *key); + +void BF_ecb_encrypt(const unsigned char *in, unsigned char *out, + const BF_KEY *key, int enc); +void BF_cbc_encrypt(const unsigned char *in, unsigned char *out, long length, + const BF_KEY *schedule, unsigned char *ivec, int enc); +void BF_cfb64_encrypt(const unsigned char *in, unsigned char *out, + long length, const BF_KEY *schedule, + unsigned char *ivec, int *num, int enc); +void BF_ofb64_encrypt(const unsigned char *in, unsigned char *out, + long length, const BF_KEY *schedule, + unsigned char *ivec, int *num); +const char *BF_options(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/win/openssl/include/openssl/bn.h b/hdssd/external/win/openssl/include/openssl/bn.h new file mode 100644 index 0000000..86264ae --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/bn.h @@ -0,0 +1,949 @@ +/* crypto/bn/bn.h */ +/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ +/* ==================================================================== + * Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * + * Portions of the attached software ("Contribution") are developed by + * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project. + * + * The Contribution is licensed pursuant to the Eric Young open source + * license provided above. + * + * The binary polynomial arithmetic software is originally written by + * Sheueling Chang Shantz and Douglas Stebila of Sun Microsystems Laboratories. + * + */ + +#ifndef HEADER_BN_H +# define HEADER_BN_H + +# include +# include +# ifndef OPENSSL_NO_FP_API +# include /* FILE */ +# endif +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * These preprocessor symbols control various aspects of the bignum headers + * and library code. They're not defined by any "normal" configuration, as + * they are intended for development and testing purposes. NB: defining all + * three can be useful for debugging application code as well as openssl + * itself. BN_DEBUG - turn on various debugging alterations to the bignum + * code BN_DEBUG_RAND - uses random poisoning of unused words to trip up + * mismanagement of bignum internals. You must also define BN_DEBUG. + */ +/* #define BN_DEBUG */ +/* #define BN_DEBUG_RAND */ + +# ifndef OPENSSL_SMALL_FOOTPRINT +# define BN_MUL_COMBA +# define BN_SQR_COMBA +# define BN_RECURSION +# endif + +/* + * This next option uses the C libraries (2 word)/(1 word) function. If it is + * not defined, I use my C version (which is slower). The reason for this + * flag is that when the particular C compiler library routine is used, and + * the library is linked with a different compiler, the library is missing. + * This mostly happens when the library is built with gcc and then linked + * using normal cc. This would be a common occurrence because gcc normally + * produces code that is 2 times faster than system compilers for the big + * number stuff. For machines with only one compiler (or shared libraries), + * this should be on. Again this in only really a problem on machines using + * "long long's", are 32bit, and are not using my assembler code. + */ +# if defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_WINDOWS) || \ + defined(OPENSSL_SYS_WIN32) || defined(linux) +# ifndef BN_DIV2W +# define BN_DIV2W +# endif +# endif + +/* + * assuming long is 64bit - this is the DEC Alpha unsigned long long is only + * 64 bits :-(, don't define BN_LLONG for the DEC Alpha + */ +# ifdef SIXTY_FOUR_BIT_LONG +# define BN_ULLONG unsigned long long +# define BN_ULONG unsigned long +# define BN_LONG long +# define BN_BITS 128 +# define BN_BYTES 8 +# define BN_BITS2 64 +# define BN_BITS4 32 +# define BN_MASK (0xffffffffffffffffffffffffffffffffLL) +# define BN_MASK2 (0xffffffffffffffffL) +# define BN_MASK2l (0xffffffffL) +# define BN_MASK2h (0xffffffff00000000L) +# define BN_MASK2h1 (0xffffffff80000000L) +# define BN_TBIT (0x8000000000000000L) +# define BN_DEC_CONV (10000000000000000000UL) +# define BN_DEC_FMT1 "%lu" +# define BN_DEC_FMT2 "%019lu" +# define BN_DEC_NUM 19 +# define BN_HEX_FMT1 "%lX" +# define BN_HEX_FMT2 "%016lX" +# endif + +/* + * This is where the long long data type is 64 bits, but long is 32. For + * machines where there are 64bit registers, this is the mode to use. IRIX, + * on R4000 and above should use this mode, along with the relevant assembler + * code :-). Do NOT define BN_LLONG. + */ +# ifdef SIXTY_FOUR_BIT +# undef BN_LLONG +# undef BN_ULLONG +# define BN_ULONG unsigned long long +# define BN_LONG long long +# define BN_BITS 128 +# define BN_BYTES 8 +# define BN_BITS2 64 +# define BN_BITS4 32 +# define BN_MASK2 (0xffffffffffffffffLL) +# define BN_MASK2l (0xffffffffL) +# define BN_MASK2h (0xffffffff00000000LL) +# define BN_MASK2h1 (0xffffffff80000000LL) +# define BN_TBIT (0x8000000000000000LL) +# define BN_DEC_CONV (10000000000000000000ULL) +# define BN_DEC_FMT1 "%llu" +# define BN_DEC_FMT2 "%019llu" +# define BN_DEC_NUM 19 +# define BN_HEX_FMT1 "%llX" +# define BN_HEX_FMT2 "%016llX" +# endif + +# ifdef THIRTY_TWO_BIT +# ifdef BN_LLONG +# if defined(_WIN32) && !defined(__GNUC__) +# define BN_ULLONG unsigned __int64 +# define BN_MASK (0xffffffffffffffffI64) +# else +# define BN_ULLONG unsigned long long +# define BN_MASK (0xffffffffffffffffLL) +# endif +# endif +# define BN_ULONG unsigned int +# define BN_LONG int +# define BN_BITS 64 +# define BN_BYTES 4 +# define BN_BITS2 32 +# define BN_BITS4 16 +# define BN_MASK2 (0xffffffffL) +# define BN_MASK2l (0xffff) +# define BN_MASK2h1 (0xffff8000L) +# define BN_MASK2h (0xffff0000L) +# define BN_TBIT (0x80000000L) +# define BN_DEC_CONV (1000000000L) +# define BN_DEC_FMT1 "%u" +# define BN_DEC_FMT2 "%09u" +# define BN_DEC_NUM 9 +# define BN_HEX_FMT1 "%X" +# define BN_HEX_FMT2 "%08X" +# endif + +# define BN_DEFAULT_BITS 1280 + +# define BN_FLG_MALLOCED 0x01 +# define BN_FLG_STATIC_DATA 0x02 + +/* + * avoid leaking exponent information through timing, + * BN_mod_exp_mont() will call BN_mod_exp_mont_consttime, + * BN_div() will call BN_div_no_branch, + * BN_mod_inverse() will call BN_mod_inverse_no_branch. + */ +# define BN_FLG_CONSTTIME 0x04 + +# ifdef OPENSSL_NO_DEPRECATED +/* deprecated name for the flag */ +# define BN_FLG_EXP_CONSTTIME BN_FLG_CONSTTIME +/* + * avoid leaking exponent information through timings + * (BN_mod_exp_mont() will call BN_mod_exp_mont_consttime) + */ +# endif + +# ifndef OPENSSL_NO_DEPRECATED +# define BN_FLG_FREE 0x8000 + /* used for debuging */ +# endif +# define BN_set_flags(b,n) ((b)->flags|=(n)) +# define BN_get_flags(b,n) ((b)->flags&(n)) + +/* + * get a clone of a BIGNUM with changed flags, for *temporary* use only (the + * two BIGNUMs cannot not be used in parallel!) + */ +# define BN_with_flags(dest,b,n) ((dest)->d=(b)->d, \ + (dest)->top=(b)->top, \ + (dest)->dmax=(b)->dmax, \ + (dest)->neg=(b)->neg, \ + (dest)->flags=(((dest)->flags & BN_FLG_MALLOCED) \ + | ((b)->flags & ~BN_FLG_MALLOCED) \ + | BN_FLG_STATIC_DATA \ + | (n))) + +/* Already declared in ossl_typ.h */ +# if 0 +typedef struct bignum_st BIGNUM; +/* Used for temp variables (declaration hidden in bn_lcl.h) */ +typedef struct bignum_ctx BN_CTX; +typedef struct bn_blinding_st BN_BLINDING; +typedef struct bn_mont_ctx_st BN_MONT_CTX; +typedef struct bn_recp_ctx_st BN_RECP_CTX; +typedef struct bn_gencb_st BN_GENCB; +# endif + +struct bignum_st { + BN_ULONG *d; /* Pointer to an array of 'BN_BITS2' bit + * chunks. */ + int top; /* Index of last used d +1. */ + /* The next are internal book keeping for bn_expand. */ + int dmax; /* Size of the d array. */ + int neg; /* one if the number is negative */ + int flags; +}; + +/* Used for montgomery multiplication */ +struct bn_mont_ctx_st { + int ri; /* number of bits in R */ + BIGNUM RR; /* used to convert to montgomery form */ + BIGNUM N; /* The modulus */ + BIGNUM Ni; /* R*(1/R mod N) - N*Ni = 1 (Ni is only + * stored for bignum algorithm) */ + BN_ULONG n0[2]; /* least significant word(s) of Ni; (type + * changed with 0.9.9, was "BN_ULONG n0;" + * before) */ + int flags; +}; + +/* + * Used for reciprocal division/mod functions It cannot be shared between + * threads + */ +struct bn_recp_ctx_st { + BIGNUM N; /* the divisor */ + BIGNUM Nr; /* the reciprocal */ + int num_bits; + int shift; + int flags; +}; + +/* Used for slow "generation" functions. */ +struct bn_gencb_st { + unsigned int ver; /* To handle binary (in)compatibility */ + void *arg; /* callback-specific data */ + union { + /* if(ver==1) - handles old style callbacks */ + void (*cb_1) (int, int, void *); + /* if(ver==2) - new callback style */ + int (*cb_2) (int, int, BN_GENCB *); + } cb; +}; +/* Wrapper function to make using BN_GENCB easier, */ +int BN_GENCB_call(BN_GENCB *cb, int a, int b); +/* Macro to populate a BN_GENCB structure with an "old"-style callback */ +# define BN_GENCB_set_old(gencb, callback, cb_arg) { \ + BN_GENCB *tmp_gencb = (gencb); \ + tmp_gencb->ver = 1; \ + tmp_gencb->arg = (cb_arg); \ + tmp_gencb->cb.cb_1 = (callback); } +/* Macro to populate a BN_GENCB structure with a "new"-style callback */ +# define BN_GENCB_set(gencb, callback, cb_arg) { \ + BN_GENCB *tmp_gencb = (gencb); \ + tmp_gencb->ver = 2; \ + tmp_gencb->arg = (cb_arg); \ + tmp_gencb->cb.cb_2 = (callback); } + +# define BN_prime_checks 0 /* default: select number of iterations based + * on the size of the number */ + +/* + * number of Miller-Rabin iterations for an error rate of less than 2^-80 for + * random 'b'-bit input, b >= 100 (taken from table 4.4 in the Handbook of + * Applied Cryptography [Menezes, van Oorschot, Vanstone; CRC Press 1996]; + * original paper: Damgaard, Landrock, Pomerance: Average case error + * estimates for the strong probable prime test. -- Math. Comp. 61 (1993) + * 177-194) + */ +# define BN_prime_checks_for_size(b) ((b) >= 1300 ? 2 : \ + (b) >= 850 ? 3 : \ + (b) >= 650 ? 4 : \ + (b) >= 550 ? 5 : \ + (b) >= 450 ? 6 : \ + (b) >= 400 ? 7 : \ + (b) >= 350 ? 8 : \ + (b) >= 300 ? 9 : \ + (b) >= 250 ? 12 : \ + (b) >= 200 ? 15 : \ + (b) >= 150 ? 18 : \ + /* b >= 100 */ 27) + +# define BN_num_bytes(a) ((BN_num_bits(a)+7)/8) + +/* Note that BN_abs_is_word didn't work reliably for w == 0 until 0.9.8 */ +# define BN_abs_is_word(a,w) ((((a)->top == 1) && ((a)->d[0] == (BN_ULONG)(w))) || \ + (((w) == 0) && ((a)->top == 0))) +# define BN_is_zero(a) ((a)->top == 0) +# define BN_is_one(a) (BN_abs_is_word((a),1) && !(a)->neg) +# define BN_is_word(a,w) (BN_abs_is_word((a),(w)) && (!(w) || !(a)->neg)) +# define BN_is_odd(a) (((a)->top > 0) && ((a)->d[0] & 1)) + +# define BN_one(a) (BN_set_word((a),1)) +# define BN_zero_ex(a) \ + do { \ + BIGNUM *_tmp_bn = (a); \ + _tmp_bn->top = 0; \ + _tmp_bn->neg = 0; \ + } while(0) +# ifdef OPENSSL_NO_DEPRECATED +# define BN_zero(a) BN_zero_ex(a) +# else +# define BN_zero(a) (BN_set_word((a),0)) +# endif + +const BIGNUM *BN_value_one(void); +char *BN_options(void); +BN_CTX *BN_CTX_new(void); +# ifndef OPENSSL_NO_DEPRECATED +void BN_CTX_init(BN_CTX *c); +# endif +void BN_CTX_free(BN_CTX *c); +void BN_CTX_start(BN_CTX *ctx); +BIGNUM *BN_CTX_get(BN_CTX *ctx); +void BN_CTX_end(BN_CTX *ctx); +int BN_rand(BIGNUM *rnd, int bits, int top, int bottom); +int BN_pseudo_rand(BIGNUM *rnd, int bits, int top, int bottom); +int BN_rand_range(BIGNUM *rnd, const BIGNUM *range); +int BN_pseudo_rand_range(BIGNUM *rnd, const BIGNUM *range); +int BN_num_bits(const BIGNUM *a); +int BN_num_bits_word(BN_ULONG); +BIGNUM *BN_new(void); +void BN_init(BIGNUM *); +void BN_clear_free(BIGNUM *a); +BIGNUM *BN_copy(BIGNUM *a, const BIGNUM *b); +void BN_swap(BIGNUM *a, BIGNUM *b); +BIGNUM *BN_bin2bn(const unsigned char *s, int len, BIGNUM *ret); +int BN_bn2bin(const BIGNUM *a, unsigned char *to); +BIGNUM *BN_mpi2bn(const unsigned char *s, int len, BIGNUM *ret); +int BN_bn2mpi(const BIGNUM *a, unsigned char *to); +int BN_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); +int BN_usub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); +int BN_uadd(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); +int BN_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); +int BN_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx); +int BN_sqr(BIGNUM *r, const BIGNUM *a, BN_CTX *ctx); +/** BN_set_negative sets sign of a BIGNUM + * \param b pointer to the BIGNUM object + * \param n 0 if the BIGNUM b should be positive and a value != 0 otherwise + */ +void BN_set_negative(BIGNUM *b, int n); +/** BN_is_negative returns 1 if the BIGNUM is negative + * \param a pointer to the BIGNUM object + * \return 1 if a < 0 and 0 otherwise + */ +# define BN_is_negative(a) ((a)->neg != 0) + +int BN_div(BIGNUM *dv, BIGNUM *rem, const BIGNUM *m, const BIGNUM *d, + BN_CTX *ctx); +# define BN_mod(rem,m,d,ctx) BN_div(NULL,(rem),(m),(d),(ctx)) +int BN_nnmod(BIGNUM *r, const BIGNUM *m, const BIGNUM *d, BN_CTX *ctx); +int BN_mod_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, + BN_CTX *ctx); +int BN_mod_add_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const BIGNUM *m); +int BN_mod_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, + BN_CTX *ctx); +int BN_mod_sub_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const BIGNUM *m); +int BN_mod_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, + BN_CTX *ctx); +int BN_mod_sqr(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx); +int BN_mod_lshift1(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx); +int BN_mod_lshift1_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *m); +int BN_mod_lshift(BIGNUM *r, const BIGNUM *a, int n, const BIGNUM *m, + BN_CTX *ctx); +int BN_mod_lshift_quick(BIGNUM *r, const BIGNUM *a, int n, const BIGNUM *m); + +BN_ULONG BN_mod_word(const BIGNUM *a, BN_ULONG w); +BN_ULONG BN_div_word(BIGNUM *a, BN_ULONG w); +int BN_mul_word(BIGNUM *a, BN_ULONG w); +int BN_add_word(BIGNUM *a, BN_ULONG w); +int BN_sub_word(BIGNUM *a, BN_ULONG w); +int BN_set_word(BIGNUM *a, BN_ULONG w); +BN_ULONG BN_get_word(const BIGNUM *a); + +int BN_cmp(const BIGNUM *a, const BIGNUM *b); +void BN_free(BIGNUM *a); +int BN_is_bit_set(const BIGNUM *a, int n); +int BN_lshift(BIGNUM *r, const BIGNUM *a, int n); +int BN_lshift1(BIGNUM *r, const BIGNUM *a); +int BN_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); + +int BN_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx); +int BN_mod_exp_mont(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx); +int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx, + BN_MONT_CTX *in_mont); +int BN_mod_exp_mont_word(BIGNUM *r, BN_ULONG a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx); +int BN_mod_exp2_mont(BIGNUM *r, const BIGNUM *a1, const BIGNUM *p1, + const BIGNUM *a2, const BIGNUM *p2, const BIGNUM *m, + BN_CTX *ctx, BN_MONT_CTX *m_ctx); +int BN_mod_exp_simple(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx); + +int BN_mask_bits(BIGNUM *a, int n); +# ifndef OPENSSL_NO_FP_API +int BN_print_fp(FILE *fp, const BIGNUM *a); +# endif +# ifdef HEADER_BIO_H +int BN_print(BIO *fp, const BIGNUM *a); +# else +int BN_print(void *fp, const BIGNUM *a); +# endif +int BN_reciprocal(BIGNUM *r, const BIGNUM *m, int len, BN_CTX *ctx); +int BN_rshift(BIGNUM *r, const BIGNUM *a, int n); +int BN_rshift1(BIGNUM *r, const BIGNUM *a); +void BN_clear(BIGNUM *a); +BIGNUM *BN_dup(const BIGNUM *a); +int BN_ucmp(const BIGNUM *a, const BIGNUM *b); +int BN_set_bit(BIGNUM *a, int n); +int BN_clear_bit(BIGNUM *a, int n); +char *BN_bn2hex(const BIGNUM *a); +char *BN_bn2dec(const BIGNUM *a); +int BN_hex2bn(BIGNUM **a, const char *str); +int BN_dec2bn(BIGNUM **a, const char *str); +int BN_asc2bn(BIGNUM **a, const char *str); +int BN_gcd(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx); +int BN_kronecker(const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx); /* returns + * -2 for + * error */ +BIGNUM *BN_mod_inverse(BIGNUM *ret, + const BIGNUM *a, const BIGNUM *n, BN_CTX *ctx); +BIGNUM *BN_mod_sqrt(BIGNUM *ret, + const BIGNUM *a, const BIGNUM *n, BN_CTX *ctx); + +void BN_consttime_swap(BN_ULONG swap, BIGNUM *a, BIGNUM *b, int nwords); + +/* Deprecated versions */ +# ifndef OPENSSL_NO_DEPRECATED +BIGNUM *BN_generate_prime(BIGNUM *ret, int bits, int safe, + const BIGNUM *add, const BIGNUM *rem, + void (*callback) (int, int, void *), void *cb_arg); +int BN_is_prime(const BIGNUM *p, int nchecks, + void (*callback) (int, int, void *), + BN_CTX *ctx, void *cb_arg); +int BN_is_prime_fasttest(const BIGNUM *p, int nchecks, + void (*callback) (int, int, void *), BN_CTX *ctx, + void *cb_arg, int do_trial_division); +# endif /* !defined(OPENSSL_NO_DEPRECATED) */ + +/* Newer versions */ +int BN_generate_prime_ex(BIGNUM *ret, int bits, int safe, const BIGNUM *add, + const BIGNUM *rem, BN_GENCB *cb); +int BN_is_prime_ex(const BIGNUM *p, int nchecks, BN_CTX *ctx, BN_GENCB *cb); +int BN_is_prime_fasttest_ex(const BIGNUM *p, int nchecks, BN_CTX *ctx, + int do_trial_division, BN_GENCB *cb); + +int BN_X931_generate_Xpq(BIGNUM *Xp, BIGNUM *Xq, int nbits, BN_CTX *ctx); + +int BN_X931_derive_prime_ex(BIGNUM *p, BIGNUM *p1, BIGNUM *p2, + const BIGNUM *Xp, const BIGNUM *Xp1, + const BIGNUM *Xp2, const BIGNUM *e, BN_CTX *ctx, + BN_GENCB *cb); +int BN_X931_generate_prime_ex(BIGNUM *p, BIGNUM *p1, BIGNUM *p2, BIGNUM *Xp1, + BIGNUM *Xp2, const BIGNUM *Xp, const BIGNUM *e, + BN_CTX *ctx, BN_GENCB *cb); + +BN_MONT_CTX *BN_MONT_CTX_new(void); +void BN_MONT_CTX_init(BN_MONT_CTX *ctx); +int BN_mod_mul_montgomery(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + BN_MONT_CTX *mont, BN_CTX *ctx); +# define BN_to_montgomery(r,a,mont,ctx) BN_mod_mul_montgomery(\ + (r),(a),&((mont)->RR),(mont),(ctx)) +int BN_from_montgomery(BIGNUM *r, const BIGNUM *a, + BN_MONT_CTX *mont, BN_CTX *ctx); +void BN_MONT_CTX_free(BN_MONT_CTX *mont); +int BN_MONT_CTX_set(BN_MONT_CTX *mont, const BIGNUM *mod, BN_CTX *ctx); +BN_MONT_CTX *BN_MONT_CTX_copy(BN_MONT_CTX *to, BN_MONT_CTX *from); +BN_MONT_CTX *BN_MONT_CTX_set_locked(BN_MONT_CTX **pmont, int lock, + const BIGNUM *mod, BN_CTX *ctx); + +/* BN_BLINDING flags */ +# define BN_BLINDING_NO_UPDATE 0x00000001 +# define BN_BLINDING_NO_RECREATE 0x00000002 + +BN_BLINDING *BN_BLINDING_new(const BIGNUM *A, const BIGNUM *Ai, BIGNUM *mod); +void BN_BLINDING_free(BN_BLINDING *b); +int BN_BLINDING_update(BN_BLINDING *b, BN_CTX *ctx); +int BN_BLINDING_convert(BIGNUM *n, BN_BLINDING *b, BN_CTX *ctx); +int BN_BLINDING_invert(BIGNUM *n, BN_BLINDING *b, BN_CTX *ctx); +int BN_BLINDING_convert_ex(BIGNUM *n, BIGNUM *r, BN_BLINDING *b, BN_CTX *); +int BN_BLINDING_invert_ex(BIGNUM *n, const BIGNUM *r, BN_BLINDING *b, + BN_CTX *); +# ifndef OPENSSL_NO_DEPRECATED +unsigned long BN_BLINDING_get_thread_id(const BN_BLINDING *); +void BN_BLINDING_set_thread_id(BN_BLINDING *, unsigned long); +# endif +CRYPTO_THREADID *BN_BLINDING_thread_id(BN_BLINDING *); +unsigned long BN_BLINDING_get_flags(const BN_BLINDING *); +void BN_BLINDING_set_flags(BN_BLINDING *, unsigned long); +BN_BLINDING *BN_BLINDING_create_param(BN_BLINDING *b, + const BIGNUM *e, BIGNUM *m, BN_CTX *ctx, + int (*bn_mod_exp) (BIGNUM *r, + const BIGNUM *a, + const BIGNUM *p, + const BIGNUM *m, + BN_CTX *ctx, + BN_MONT_CTX *m_ctx), + BN_MONT_CTX *m_ctx); + +# ifndef OPENSSL_NO_DEPRECATED +void BN_set_params(int mul, int high, int low, int mont); +int BN_get_params(int which); /* 0, mul, 1 high, 2 low, 3 mont */ +# endif + +void BN_RECP_CTX_init(BN_RECP_CTX *recp); +BN_RECP_CTX *BN_RECP_CTX_new(void); +void BN_RECP_CTX_free(BN_RECP_CTX *recp); +int BN_RECP_CTX_set(BN_RECP_CTX *recp, const BIGNUM *rdiv, BN_CTX *ctx); +int BN_mod_mul_reciprocal(BIGNUM *r, const BIGNUM *x, const BIGNUM *y, + BN_RECP_CTX *recp, BN_CTX *ctx); +int BN_mod_exp_recp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx); +int BN_div_recp(BIGNUM *dv, BIGNUM *rem, const BIGNUM *m, + BN_RECP_CTX *recp, BN_CTX *ctx); + +# ifndef OPENSSL_NO_EC2M + +/* + * Functions for arithmetic over binary polynomials represented by BIGNUMs. + * The BIGNUM::neg property of BIGNUMs representing binary polynomials is + * ignored. Note that input arguments are not const so that their bit arrays + * can be expanded to the appropriate size if needed. + */ + +/* + * r = a + b + */ +int BN_GF2m_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); +# define BN_GF2m_sub(r, a, b) BN_GF2m_add(r, a, b) +/* + * r=a mod p + */ +int BN_GF2m_mod(BIGNUM *r, const BIGNUM *a, const BIGNUM *p); +/* r = (a * b) mod p */ +int BN_GF2m_mod_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const BIGNUM *p, BN_CTX *ctx); +/* r = (a * a) mod p */ +int BN_GF2m_mod_sqr(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); +/* r = (1 / b) mod p */ +int BN_GF2m_mod_inv(BIGNUM *r, const BIGNUM *b, const BIGNUM *p, BN_CTX *ctx); +/* r = (a / b) mod p */ +int BN_GF2m_mod_div(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const BIGNUM *p, BN_CTX *ctx); +/* r = (a ^ b) mod p */ +int BN_GF2m_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const BIGNUM *p, BN_CTX *ctx); +/* r = sqrt(a) mod p */ +int BN_GF2m_mod_sqrt(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + BN_CTX *ctx); +/* r^2 + r = a mod p */ +int BN_GF2m_mod_solve_quad(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + BN_CTX *ctx); +# define BN_GF2m_cmp(a, b) BN_ucmp((a), (b)) +/*- + * Some functions allow for representation of the irreducible polynomials + * as an unsigned int[], say p. The irreducible f(t) is then of the form: + * t^p[0] + t^p[1] + ... + t^p[k] + * where m = p[0] > p[1] > ... > p[k] = 0. + */ +/* r = a mod p */ +int BN_GF2m_mod_arr(BIGNUM *r, const BIGNUM *a, const int p[]); +/* r = (a * b) mod p */ +int BN_GF2m_mod_mul_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const int p[], BN_CTX *ctx); +/* r = (a * a) mod p */ +int BN_GF2m_mod_sqr_arr(BIGNUM *r, const BIGNUM *a, const int p[], + BN_CTX *ctx); +/* r = (1 / b) mod p */ +int BN_GF2m_mod_inv_arr(BIGNUM *r, const BIGNUM *b, const int p[], + BN_CTX *ctx); +/* r = (a / b) mod p */ +int BN_GF2m_mod_div_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const int p[], BN_CTX *ctx); +/* r = (a ^ b) mod p */ +int BN_GF2m_mod_exp_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const int p[], BN_CTX *ctx); +/* r = sqrt(a) mod p */ +int BN_GF2m_mod_sqrt_arr(BIGNUM *r, const BIGNUM *a, + const int p[], BN_CTX *ctx); +/* r^2 + r = a mod p */ +int BN_GF2m_mod_solve_quad_arr(BIGNUM *r, const BIGNUM *a, + const int p[], BN_CTX *ctx); +int BN_GF2m_poly2arr(const BIGNUM *a, int p[], int max); +int BN_GF2m_arr2poly(const int p[], BIGNUM *a); + +# endif + +/* + * faster mod functions for the 'NIST primes' 0 <= a < p^2 + */ +int BN_nist_mod_192(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); +int BN_nist_mod_224(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); +int BN_nist_mod_256(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); +int BN_nist_mod_384(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); +int BN_nist_mod_521(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); + +const BIGNUM *BN_get0_nist_prime_192(void); +const BIGNUM *BN_get0_nist_prime_224(void); +const BIGNUM *BN_get0_nist_prime_256(void); +const BIGNUM *BN_get0_nist_prime_384(void); +const BIGNUM *BN_get0_nist_prime_521(void); + +/* library internal functions */ + +# define bn_expand(a,bits) \ + ( \ + bits > (INT_MAX - BN_BITS2 + 1) ? \ + NULL \ + : \ + (((bits+BN_BITS2-1)/BN_BITS2) <= (a)->dmax) ? \ + (a) \ + : \ + bn_expand2((a),(bits+BN_BITS2-1)/BN_BITS2) \ + ) + +# define bn_wexpand(a,words) (((words) <= (a)->dmax)?(a):bn_expand2((a),(words))) +BIGNUM *bn_expand2(BIGNUM *a, int words); +# ifndef OPENSSL_NO_DEPRECATED +BIGNUM *bn_dup_expand(const BIGNUM *a, int words); /* unused */ +# endif + +/*- + * Bignum consistency macros + * There is one "API" macro, bn_fix_top(), for stripping leading zeroes from + * bignum data after direct manipulations on the data. There is also an + * "internal" macro, bn_check_top(), for verifying that there are no leading + * zeroes. Unfortunately, some auditing is required due to the fact that + * bn_fix_top() has become an overabused duct-tape because bignum data is + * occasionally passed around in an inconsistent state. So the following + * changes have been made to sort this out; + * - bn_fix_top()s implementation has been moved to bn_correct_top() + * - if BN_DEBUG isn't defined, bn_fix_top() maps to bn_correct_top(), and + * bn_check_top() is as before. + * - if BN_DEBUG *is* defined; + * - bn_check_top() tries to pollute unused words even if the bignum 'top' is + * consistent. (ed: only if BN_DEBUG_RAND is defined) + * - bn_fix_top() maps to bn_check_top() rather than "fixing" anything. + * The idea is to have debug builds flag up inconsistent bignums when they + * occur. If that occurs in a bn_fix_top(), we examine the code in question; if + * the use of bn_fix_top() was appropriate (ie. it follows directly after code + * that manipulates the bignum) it is converted to bn_correct_top(), and if it + * was not appropriate, we convert it permanently to bn_check_top() and track + * down the cause of the bug. Eventually, no internal code should be using the + * bn_fix_top() macro. External applications and libraries should try this with + * their own code too, both in terms of building against the openssl headers + * with BN_DEBUG defined *and* linking with a version of OpenSSL built with it + * defined. This not only improves external code, it provides more test + * coverage for openssl's own code. + */ + +# ifdef BN_DEBUG + +/* We only need assert() when debugging */ +# include + +# ifdef BN_DEBUG_RAND +/* To avoid "make update" cvs wars due to BN_DEBUG, use some tricks */ +# ifndef RAND_pseudo_bytes +int RAND_pseudo_bytes(unsigned char *buf, int num); +# define BN_DEBUG_TRIX +# endif +# define bn_pollute(a) \ + do { \ + const BIGNUM *_bnum1 = (a); \ + if(_bnum1->top < _bnum1->dmax) { \ + unsigned char _tmp_char; \ + /* We cast away const without the compiler knowing, any \ + * *genuinely* constant variables that aren't mutable \ + * wouldn't be constructed with top!=dmax. */ \ + BN_ULONG *_not_const; \ + memcpy(&_not_const, &_bnum1->d, sizeof(BN_ULONG*)); \ + /* Debug only - safe to ignore error return */ \ + RAND_pseudo_bytes(&_tmp_char, 1); \ + memset((unsigned char *)(_not_const + _bnum1->top), _tmp_char, \ + (_bnum1->dmax - _bnum1->top) * sizeof(BN_ULONG)); \ + } \ + } while(0) +# ifdef BN_DEBUG_TRIX +# undef RAND_pseudo_bytes +# endif +# else +# define bn_pollute(a) +# endif +# define bn_check_top(a) \ + do { \ + const BIGNUM *_bnum2 = (a); \ + if (_bnum2 != NULL) { \ + assert((_bnum2->top == 0) || \ + (_bnum2->d[_bnum2->top - 1] != 0)); \ + bn_pollute(_bnum2); \ + } \ + } while(0) + +# define bn_fix_top(a) bn_check_top(a) + +# define bn_check_size(bn, bits) bn_wcheck_size(bn, ((bits+BN_BITS2-1))/BN_BITS2) +# define bn_wcheck_size(bn, words) \ + do { \ + const BIGNUM *_bnum2 = (bn); \ + assert((words) <= (_bnum2)->dmax && (words) >= (_bnum2)->top); \ + /* avoid unused variable warning with NDEBUG */ \ + (void)(_bnum2); \ + } while(0) + +# else /* !BN_DEBUG */ + +# define bn_pollute(a) +# define bn_check_top(a) +# define bn_fix_top(a) bn_correct_top(a) +# define bn_check_size(bn, bits) +# define bn_wcheck_size(bn, words) + +# endif + +# define bn_correct_top(a) \ + { \ + BN_ULONG *ftl; \ + int tmp_top = (a)->top; \ + if (tmp_top > 0) \ + { \ + for (ftl= &((a)->d[tmp_top-1]); tmp_top > 0; tmp_top--) \ + if (*(ftl--)) break; \ + (a)->top = tmp_top; \ + } \ + bn_pollute(a); \ + } + +BN_ULONG bn_mul_add_words(BN_ULONG *rp, const BN_ULONG *ap, int num, + BN_ULONG w); +BN_ULONG bn_mul_words(BN_ULONG *rp, const BN_ULONG *ap, int num, BN_ULONG w); +void bn_sqr_words(BN_ULONG *rp, const BN_ULONG *ap, int num); +BN_ULONG bn_div_words(BN_ULONG h, BN_ULONG l, BN_ULONG d); +BN_ULONG bn_add_words(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp, + int num); +BN_ULONG bn_sub_words(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp, + int num); + +/* Primes from RFC 2409 */ +BIGNUM *get_rfc2409_prime_768(BIGNUM *bn); +BIGNUM *get_rfc2409_prime_1024(BIGNUM *bn); + +/* Primes from RFC 3526 */ +BIGNUM *get_rfc3526_prime_1536(BIGNUM *bn); +BIGNUM *get_rfc3526_prime_2048(BIGNUM *bn); +BIGNUM *get_rfc3526_prime_3072(BIGNUM *bn); +BIGNUM *get_rfc3526_prime_4096(BIGNUM *bn); +BIGNUM *get_rfc3526_prime_6144(BIGNUM *bn); +BIGNUM *get_rfc3526_prime_8192(BIGNUM *bn); + +int BN_bntest_rand(BIGNUM *rnd, int bits, int top, int bottom); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_BN_strings(void); + +/* Error codes for the BN functions. */ + +/* Function codes. */ +# define BN_F_BNRAND 127 +# define BN_F_BN_BLINDING_CONVERT_EX 100 +# define BN_F_BN_BLINDING_CREATE_PARAM 128 +# define BN_F_BN_BLINDING_INVERT_EX 101 +# define BN_F_BN_BLINDING_NEW 102 +# define BN_F_BN_BLINDING_UPDATE 103 +# define BN_F_BN_BN2DEC 104 +# define BN_F_BN_BN2HEX 105 +# define BN_F_BN_CTX_GET 116 +# define BN_F_BN_CTX_NEW 106 +# define BN_F_BN_CTX_START 129 +# define BN_F_BN_DIV 107 +# define BN_F_BN_DIV_NO_BRANCH 138 +# define BN_F_BN_DIV_RECP 130 +# define BN_F_BN_EXP 123 +# define BN_F_BN_EXPAND2 108 +# define BN_F_BN_EXPAND_INTERNAL 120 +# define BN_F_BN_GF2M_MOD 131 +# define BN_F_BN_GF2M_MOD_EXP 132 +# define BN_F_BN_GF2M_MOD_MUL 133 +# define BN_F_BN_GF2M_MOD_SOLVE_QUAD 134 +# define BN_F_BN_GF2M_MOD_SOLVE_QUAD_ARR 135 +# define BN_F_BN_GF2M_MOD_SQR 136 +# define BN_F_BN_GF2M_MOD_SQRT 137 +# define BN_F_BN_LSHIFT 145 +# define BN_F_BN_MOD_EXP2_MONT 118 +# define BN_F_BN_MOD_EXP_MONT 109 +# define BN_F_BN_MOD_EXP_MONT_CONSTTIME 124 +# define BN_F_BN_MOD_EXP_MONT_WORD 117 +# define BN_F_BN_MOD_EXP_RECP 125 +# define BN_F_BN_MOD_EXP_SIMPLE 126 +# define BN_F_BN_MOD_INVERSE 110 +# define BN_F_BN_MOD_INVERSE_NO_BRANCH 139 +# define BN_F_BN_MOD_LSHIFT_QUICK 119 +# define BN_F_BN_MOD_MUL_RECIPROCAL 111 +# define BN_F_BN_MOD_SQRT 121 +# define BN_F_BN_MPI2BN 112 +# define BN_F_BN_NEW 113 +# define BN_F_BN_RAND 114 +# define BN_F_BN_RAND_RANGE 122 +# define BN_F_BN_RSHIFT 146 +# define BN_F_BN_USUB 115 + +/* Reason codes. */ +# define BN_R_ARG2_LT_ARG3 100 +# define BN_R_BAD_RECIPROCAL 101 +# define BN_R_BIGNUM_TOO_LONG 114 +# define BN_R_BITS_TOO_SMALL 118 +# define BN_R_CALLED_WITH_EVEN_MODULUS 102 +# define BN_R_DIV_BY_ZERO 103 +# define BN_R_ENCODING_ERROR 104 +# define BN_R_EXPAND_ON_STATIC_BIGNUM_DATA 105 +# define BN_R_INPUT_NOT_REDUCED 110 +# define BN_R_INVALID_LENGTH 106 +# define BN_R_INVALID_RANGE 115 +# define BN_R_INVALID_SHIFT 119 +# define BN_R_NOT_A_SQUARE 111 +# define BN_R_NOT_INITIALIZED 107 +# define BN_R_NO_INVERSE 108 +# define BN_R_NO_SOLUTION 116 +# define BN_R_P_IS_NOT_PRIME 112 +# define BN_R_TOO_MANY_ITERATIONS 113 +# define BN_R_TOO_MANY_TEMPORARY_VARIABLES 109 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/win/openssl/include/openssl/buffer.h b/hdssd/external/win/openssl/include/openssl/buffer.h new file mode 100644 index 0000000..efd240a --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/buffer.h @@ -0,0 +1,125 @@ +/* crypto/buffer/buffer.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_BUFFER_H +# define HEADER_BUFFER_H + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# include + +# if !defined(NO_SYS_TYPES_H) +# include +# endif + +/* Already declared in ossl_typ.h */ +/* typedef struct buf_mem_st BUF_MEM; */ + +struct buf_mem_st { + size_t length; /* current number of bytes */ + char *data; + size_t max; /* size of buffer */ +}; + +BUF_MEM *BUF_MEM_new(void); +void BUF_MEM_free(BUF_MEM *a); +int BUF_MEM_grow(BUF_MEM *str, size_t len); +int BUF_MEM_grow_clean(BUF_MEM *str, size_t len); +size_t BUF_strnlen(const char *str, size_t maxlen); +char *BUF_strdup(const char *str); + +/* + * Like strndup, but in addition, explicitly guarantees to never read past the + * first |siz| bytes of |str|. + */ +char *BUF_strndup(const char *str, size_t siz); + +void *BUF_memdup(const void *data, size_t siz); +void BUF_reverse(unsigned char *out, const unsigned char *in, size_t siz); + +/* safe string functions */ +size_t BUF_strlcpy(char *dst, const char *src, size_t siz); +size_t BUF_strlcat(char *dst, const char *src, size_t siz); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_BUF_strings(void); + +/* Error codes for the BUF functions. */ + +/* Function codes. */ +# define BUF_F_BUF_MEMDUP 103 +# define BUF_F_BUF_MEM_GROW 100 +# define BUF_F_BUF_MEM_GROW_CLEAN 105 +# define BUF_F_BUF_MEM_NEW 101 +# define BUF_F_BUF_STRDUP 102 +# define BUF_F_BUF_STRNDUP 104 + +/* Reason codes. */ + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/win/openssl/include/openssl/camellia.h b/hdssd/external/win/openssl/include/openssl/camellia.h new file mode 100644 index 0000000..45e8d25 --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/camellia.h @@ -0,0 +1,132 @@ +/* crypto/camellia/camellia.h */ +/* ==================================================================== + * Copyright (c) 2006 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + */ + +#ifndef HEADER_CAMELLIA_H +# define HEADER_CAMELLIA_H + +# include + +# ifdef OPENSSL_NO_CAMELLIA +# error CAMELLIA is disabled. +# endif + +# include + +# define CAMELLIA_ENCRYPT 1 +# define CAMELLIA_DECRYPT 0 + +/* + * Because array size can't be a const in C, the following two are macros. + * Both sizes are in bytes. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* This should be a hidden type, but EVP requires that the size be known */ + +# define CAMELLIA_BLOCK_SIZE 16 +# define CAMELLIA_TABLE_BYTE_LEN 272 +# define CAMELLIA_TABLE_WORD_LEN (CAMELLIA_TABLE_BYTE_LEN / 4) + +typedef unsigned int KEY_TABLE_TYPE[CAMELLIA_TABLE_WORD_LEN]; /* to match + * with WORD */ + +struct camellia_key_st { + union { + double d; /* ensures 64-bit align */ + KEY_TABLE_TYPE rd_key; + } u; + int grand_rounds; +}; +typedef struct camellia_key_st CAMELLIA_KEY; + +# ifdef OPENSSL_FIPS +int private_Camellia_set_key(const unsigned char *userKey, const int bits, + CAMELLIA_KEY *key); +# endif +int Camellia_set_key(const unsigned char *userKey, const int bits, + CAMELLIA_KEY *key); + +void Camellia_encrypt(const unsigned char *in, unsigned char *out, + const CAMELLIA_KEY *key); +void Camellia_decrypt(const unsigned char *in, unsigned char *out, + const CAMELLIA_KEY *key); + +void Camellia_ecb_encrypt(const unsigned char *in, unsigned char *out, + const CAMELLIA_KEY *key, const int enc); +void Camellia_cbc_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const CAMELLIA_KEY *key, + unsigned char *ivec, const int enc); +void Camellia_cfb128_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const CAMELLIA_KEY *key, + unsigned char *ivec, int *num, const int enc); +void Camellia_cfb1_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const CAMELLIA_KEY *key, + unsigned char *ivec, int *num, const int enc); +void Camellia_cfb8_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const CAMELLIA_KEY *key, + unsigned char *ivec, int *num, const int enc); +void Camellia_ofb128_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const CAMELLIA_KEY *key, + unsigned char *ivec, int *num); +void Camellia_ctr128_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const CAMELLIA_KEY *key, + unsigned char ivec[CAMELLIA_BLOCK_SIZE], + unsigned char ecount_buf[CAMELLIA_BLOCK_SIZE], + unsigned int *num); + +#ifdef __cplusplus +} +#endif + +#endif /* !HEADER_Camellia_H */ diff --git a/hdssd/external/win/openssl/include/openssl/cast.h b/hdssd/external/win/openssl/include/openssl/cast.h new file mode 100644 index 0000000..0003ec9 --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/cast.h @@ -0,0 +1,107 @@ +/* crypto/cast/cast.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_CAST_H +# define HEADER_CAST_H + +#ifdef __cplusplus +extern "C" { +#endif + +# include + +# ifdef OPENSSL_NO_CAST +# error CAST is disabled. +# endif + +# define CAST_ENCRYPT 1 +# define CAST_DECRYPT 0 + +# define CAST_LONG unsigned int + +# define CAST_BLOCK 8 +# define CAST_KEY_LENGTH 16 + +typedef struct cast_key_st { + CAST_LONG data[32]; + int short_key; /* Use reduced rounds for short key */ +} CAST_KEY; + +# ifdef OPENSSL_FIPS +void private_CAST_set_key(CAST_KEY *key, int len, const unsigned char *data); +# endif +void CAST_set_key(CAST_KEY *key, int len, const unsigned char *data); +void CAST_ecb_encrypt(const unsigned char *in, unsigned char *out, + const CAST_KEY *key, int enc); +void CAST_encrypt(CAST_LONG *data, const CAST_KEY *key); +void CAST_decrypt(CAST_LONG *data, const CAST_KEY *key); +void CAST_cbc_encrypt(const unsigned char *in, unsigned char *out, + long length, const CAST_KEY *ks, unsigned char *iv, + int enc); +void CAST_cfb64_encrypt(const unsigned char *in, unsigned char *out, + long length, const CAST_KEY *schedule, + unsigned char *ivec, int *num, int enc); +void CAST_ofb64_encrypt(const unsigned char *in, unsigned char *out, + long length, const CAST_KEY *schedule, + unsigned char *ivec, int *num); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/win/openssl/include/openssl/cmac.h b/hdssd/external/win/openssl/include/openssl/cmac.h new file mode 100644 index 0000000..175be83 --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/cmac.h @@ -0,0 +1,82 @@ +/* crypto/cmac/cmac.h */ +/* + * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL + * project. + */ +/* ==================================================================== + * Copyright (c) 2010 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + */ + +#ifndef HEADER_CMAC_H +# define HEADER_CMAC_H + +#ifdef __cplusplus +extern "C" { +#endif + +# include + +/* Opaque */ +typedef struct CMAC_CTX_st CMAC_CTX; + +CMAC_CTX *CMAC_CTX_new(void); +void CMAC_CTX_cleanup(CMAC_CTX *ctx); +void CMAC_CTX_free(CMAC_CTX *ctx); +EVP_CIPHER_CTX *CMAC_CTX_get0_cipher_ctx(CMAC_CTX *ctx); +int CMAC_CTX_copy(CMAC_CTX *out, const CMAC_CTX *in); + +int CMAC_Init(CMAC_CTX *ctx, const void *key, size_t keylen, + const EVP_CIPHER *cipher, ENGINE *impl); +int CMAC_Update(CMAC_CTX *ctx, const void *data, size_t dlen); +int CMAC_Final(CMAC_CTX *ctx, unsigned char *out, size_t *poutlen); +int CMAC_resume(CMAC_CTX *ctx); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/win/openssl/include/openssl/cms.h b/hdssd/external/win/openssl/include/openssl/cms.h new file mode 100644 index 0000000..e6c7f96 --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/cms.h @@ -0,0 +1,555 @@ +/* crypto/cms/cms.h */ +/* + * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL + * project. + */ +/* ==================================================================== + * Copyright (c) 2008 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + */ + +#ifndef HEADER_CMS_H +# define HEADER_CMS_H + +# include + +# ifdef OPENSSL_NO_CMS +# error CMS is disabled. +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct CMS_ContentInfo_st CMS_ContentInfo; +typedef struct CMS_SignerInfo_st CMS_SignerInfo; +typedef struct CMS_CertificateChoices CMS_CertificateChoices; +typedef struct CMS_RevocationInfoChoice_st CMS_RevocationInfoChoice; +typedef struct CMS_RecipientInfo_st CMS_RecipientInfo; +typedef struct CMS_ReceiptRequest_st CMS_ReceiptRequest; +typedef struct CMS_Receipt_st CMS_Receipt; +typedef struct CMS_RecipientEncryptedKey_st CMS_RecipientEncryptedKey; +typedef struct CMS_OtherKeyAttribute_st CMS_OtherKeyAttribute; + +DECLARE_STACK_OF(CMS_SignerInfo) +DECLARE_STACK_OF(GENERAL_NAMES) +DECLARE_STACK_OF(CMS_RecipientEncryptedKey) +DECLARE_ASN1_FUNCTIONS(CMS_ContentInfo) +DECLARE_ASN1_FUNCTIONS(CMS_ReceiptRequest) +DECLARE_ASN1_PRINT_FUNCTION(CMS_ContentInfo) + +# define CMS_SIGNERINFO_ISSUER_SERIAL 0 +# define CMS_SIGNERINFO_KEYIDENTIFIER 1 + +# define CMS_RECIPINFO_NONE -1 +# define CMS_RECIPINFO_TRANS 0 +# define CMS_RECIPINFO_AGREE 1 +# define CMS_RECIPINFO_KEK 2 +# define CMS_RECIPINFO_PASS 3 +# define CMS_RECIPINFO_OTHER 4 + +/* S/MIME related flags */ + +# define CMS_TEXT 0x1 +# define CMS_NOCERTS 0x2 +# define CMS_NO_CONTENT_VERIFY 0x4 +# define CMS_NO_ATTR_VERIFY 0x8 +# define CMS_NOSIGS \ + (CMS_NO_CONTENT_VERIFY|CMS_NO_ATTR_VERIFY) +# define CMS_NOINTERN 0x10 +# define CMS_NO_SIGNER_CERT_VERIFY 0x20 +# define CMS_NOVERIFY 0x20 +# define CMS_DETACHED 0x40 +# define CMS_BINARY 0x80 +# define CMS_NOATTR 0x100 +# define CMS_NOSMIMECAP 0x200 +# define CMS_NOOLDMIMETYPE 0x400 +# define CMS_CRLFEOL 0x800 +# define CMS_STREAM 0x1000 +# define CMS_NOCRL 0x2000 +# define CMS_PARTIAL 0x4000 +# define CMS_REUSE_DIGEST 0x8000 +# define CMS_USE_KEYID 0x10000 +# define CMS_DEBUG_DECRYPT 0x20000 +# define CMS_KEY_PARAM 0x40000 + +const ASN1_OBJECT *CMS_get0_type(CMS_ContentInfo *cms); + +BIO *CMS_dataInit(CMS_ContentInfo *cms, BIO *icont); +int CMS_dataFinal(CMS_ContentInfo *cms, BIO *bio); + +ASN1_OCTET_STRING **CMS_get0_content(CMS_ContentInfo *cms); +int CMS_is_detached(CMS_ContentInfo *cms); +int CMS_set_detached(CMS_ContentInfo *cms, int detached); + +# ifdef HEADER_PEM_H +DECLARE_PEM_rw_const(CMS, CMS_ContentInfo) +# endif +int CMS_stream(unsigned char ***boundary, CMS_ContentInfo *cms); +CMS_ContentInfo *d2i_CMS_bio(BIO *bp, CMS_ContentInfo **cms); +int i2d_CMS_bio(BIO *bp, CMS_ContentInfo *cms); + +BIO *BIO_new_CMS(BIO *out, CMS_ContentInfo *cms); +int i2d_CMS_bio_stream(BIO *out, CMS_ContentInfo *cms, BIO *in, int flags); +int PEM_write_bio_CMS_stream(BIO *out, CMS_ContentInfo *cms, BIO *in, + int flags); +CMS_ContentInfo *SMIME_read_CMS(BIO *bio, BIO **bcont); +int SMIME_write_CMS(BIO *bio, CMS_ContentInfo *cms, BIO *data, int flags); + +int CMS_final(CMS_ContentInfo *cms, BIO *data, BIO *dcont, + unsigned int flags); + +CMS_ContentInfo *CMS_sign(X509 *signcert, EVP_PKEY *pkey, + STACK_OF(X509) *certs, BIO *data, + unsigned int flags); + +CMS_ContentInfo *CMS_sign_receipt(CMS_SignerInfo *si, + X509 *signcert, EVP_PKEY *pkey, + STACK_OF(X509) *certs, unsigned int flags); + +int CMS_data(CMS_ContentInfo *cms, BIO *out, unsigned int flags); +CMS_ContentInfo *CMS_data_create(BIO *in, unsigned int flags); + +int CMS_digest_verify(CMS_ContentInfo *cms, BIO *dcont, BIO *out, + unsigned int flags); +CMS_ContentInfo *CMS_digest_create(BIO *in, const EVP_MD *md, + unsigned int flags); + +int CMS_EncryptedData_decrypt(CMS_ContentInfo *cms, + const unsigned char *key, size_t keylen, + BIO *dcont, BIO *out, unsigned int flags); + +CMS_ContentInfo *CMS_EncryptedData_encrypt(BIO *in, const EVP_CIPHER *cipher, + const unsigned char *key, + size_t keylen, unsigned int flags); + +int CMS_EncryptedData_set1_key(CMS_ContentInfo *cms, const EVP_CIPHER *ciph, + const unsigned char *key, size_t keylen); + +int CMS_verify(CMS_ContentInfo *cms, STACK_OF(X509) *certs, + X509_STORE *store, BIO *dcont, BIO *out, unsigned int flags); + +int CMS_verify_receipt(CMS_ContentInfo *rcms, CMS_ContentInfo *ocms, + STACK_OF(X509) *certs, + X509_STORE *store, unsigned int flags); + +STACK_OF(X509) *CMS_get0_signers(CMS_ContentInfo *cms); + +CMS_ContentInfo *CMS_encrypt(STACK_OF(X509) *certs, BIO *in, + const EVP_CIPHER *cipher, unsigned int flags); + +int CMS_decrypt(CMS_ContentInfo *cms, EVP_PKEY *pkey, X509 *cert, + BIO *dcont, BIO *out, unsigned int flags); + +int CMS_decrypt_set1_pkey(CMS_ContentInfo *cms, EVP_PKEY *pk, X509 *cert); +int CMS_decrypt_set1_key(CMS_ContentInfo *cms, + unsigned char *key, size_t keylen, + unsigned char *id, size_t idlen); +int CMS_decrypt_set1_password(CMS_ContentInfo *cms, + unsigned char *pass, ossl_ssize_t passlen); + +STACK_OF(CMS_RecipientInfo) *CMS_get0_RecipientInfos(CMS_ContentInfo *cms); +int CMS_RecipientInfo_type(CMS_RecipientInfo *ri); +EVP_PKEY_CTX *CMS_RecipientInfo_get0_pkey_ctx(CMS_RecipientInfo *ri); +CMS_ContentInfo *CMS_EnvelopedData_create(const EVP_CIPHER *cipher); +CMS_RecipientInfo *CMS_add1_recipient_cert(CMS_ContentInfo *cms, + X509 *recip, unsigned int flags); +int CMS_RecipientInfo_set0_pkey(CMS_RecipientInfo *ri, EVP_PKEY *pkey); +int CMS_RecipientInfo_ktri_cert_cmp(CMS_RecipientInfo *ri, X509 *cert); +int CMS_RecipientInfo_ktri_get0_algs(CMS_RecipientInfo *ri, + EVP_PKEY **pk, X509 **recip, + X509_ALGOR **palg); +int CMS_RecipientInfo_ktri_get0_signer_id(CMS_RecipientInfo *ri, + ASN1_OCTET_STRING **keyid, + X509_NAME **issuer, + ASN1_INTEGER **sno); + +CMS_RecipientInfo *CMS_add0_recipient_key(CMS_ContentInfo *cms, int nid, + unsigned char *key, size_t keylen, + unsigned char *id, size_t idlen, + ASN1_GENERALIZEDTIME *date, + ASN1_OBJECT *otherTypeId, + ASN1_TYPE *otherType); + +int CMS_RecipientInfo_kekri_get0_id(CMS_RecipientInfo *ri, + X509_ALGOR **palg, + ASN1_OCTET_STRING **pid, + ASN1_GENERALIZEDTIME **pdate, + ASN1_OBJECT **potherid, + ASN1_TYPE **pothertype); + +int CMS_RecipientInfo_set0_key(CMS_RecipientInfo *ri, + unsigned char *key, size_t keylen); + +int CMS_RecipientInfo_kekri_id_cmp(CMS_RecipientInfo *ri, + const unsigned char *id, size_t idlen); + +int CMS_RecipientInfo_set0_password(CMS_RecipientInfo *ri, + unsigned char *pass, + ossl_ssize_t passlen); + +CMS_RecipientInfo *CMS_add0_recipient_password(CMS_ContentInfo *cms, + int iter, int wrap_nid, + int pbe_nid, + unsigned char *pass, + ossl_ssize_t passlen, + const EVP_CIPHER *kekciph); + +int CMS_RecipientInfo_decrypt(CMS_ContentInfo *cms, CMS_RecipientInfo *ri); +int CMS_RecipientInfo_encrypt(CMS_ContentInfo *cms, CMS_RecipientInfo *ri); + +int CMS_uncompress(CMS_ContentInfo *cms, BIO *dcont, BIO *out, + unsigned int flags); +CMS_ContentInfo *CMS_compress(BIO *in, int comp_nid, unsigned int flags); + +int CMS_set1_eContentType(CMS_ContentInfo *cms, const ASN1_OBJECT *oid); +const ASN1_OBJECT *CMS_get0_eContentType(CMS_ContentInfo *cms); + +CMS_CertificateChoices *CMS_add0_CertificateChoices(CMS_ContentInfo *cms); +int CMS_add0_cert(CMS_ContentInfo *cms, X509 *cert); +int CMS_add1_cert(CMS_ContentInfo *cms, X509 *cert); +STACK_OF(X509) *CMS_get1_certs(CMS_ContentInfo *cms); + +CMS_RevocationInfoChoice *CMS_add0_RevocationInfoChoice(CMS_ContentInfo *cms); +int CMS_add0_crl(CMS_ContentInfo *cms, X509_CRL *crl); +int CMS_add1_crl(CMS_ContentInfo *cms, X509_CRL *crl); +STACK_OF(X509_CRL) *CMS_get1_crls(CMS_ContentInfo *cms); + +int CMS_SignedData_init(CMS_ContentInfo *cms); +CMS_SignerInfo *CMS_add1_signer(CMS_ContentInfo *cms, + X509 *signer, EVP_PKEY *pk, const EVP_MD *md, + unsigned int flags); +EVP_PKEY_CTX *CMS_SignerInfo_get0_pkey_ctx(CMS_SignerInfo *si); +EVP_MD_CTX *CMS_SignerInfo_get0_md_ctx(CMS_SignerInfo *si); +STACK_OF(CMS_SignerInfo) *CMS_get0_SignerInfos(CMS_ContentInfo *cms); + +void CMS_SignerInfo_set1_signer_cert(CMS_SignerInfo *si, X509 *signer); +int CMS_SignerInfo_get0_signer_id(CMS_SignerInfo *si, + ASN1_OCTET_STRING **keyid, + X509_NAME **issuer, ASN1_INTEGER **sno); +int CMS_SignerInfo_cert_cmp(CMS_SignerInfo *si, X509 *cert); +int CMS_set1_signers_certs(CMS_ContentInfo *cms, STACK_OF(X509) *certs, + unsigned int flags); +void CMS_SignerInfo_get0_algs(CMS_SignerInfo *si, EVP_PKEY **pk, + X509 **signer, X509_ALGOR **pdig, + X509_ALGOR **psig); +ASN1_OCTET_STRING *CMS_SignerInfo_get0_signature(CMS_SignerInfo *si); +int CMS_SignerInfo_sign(CMS_SignerInfo *si); +int CMS_SignerInfo_verify(CMS_SignerInfo *si); +int CMS_SignerInfo_verify_content(CMS_SignerInfo *si, BIO *chain); + +int CMS_add_smimecap(CMS_SignerInfo *si, STACK_OF(X509_ALGOR) *algs); +int CMS_add_simple_smimecap(STACK_OF(X509_ALGOR) **algs, + int algnid, int keysize); +int CMS_add_standard_smimecap(STACK_OF(X509_ALGOR) **smcap); + +int CMS_signed_get_attr_count(const CMS_SignerInfo *si); +int CMS_signed_get_attr_by_NID(const CMS_SignerInfo *si, int nid, + int lastpos); +int CMS_signed_get_attr_by_OBJ(const CMS_SignerInfo *si, ASN1_OBJECT *obj, + int lastpos); +X509_ATTRIBUTE *CMS_signed_get_attr(const CMS_SignerInfo *si, int loc); +X509_ATTRIBUTE *CMS_signed_delete_attr(CMS_SignerInfo *si, int loc); +int CMS_signed_add1_attr(CMS_SignerInfo *si, X509_ATTRIBUTE *attr); +int CMS_signed_add1_attr_by_OBJ(CMS_SignerInfo *si, + const ASN1_OBJECT *obj, int type, + const void *bytes, int len); +int CMS_signed_add1_attr_by_NID(CMS_SignerInfo *si, + int nid, int type, + const void *bytes, int len); +int CMS_signed_add1_attr_by_txt(CMS_SignerInfo *si, + const char *attrname, int type, + const void *bytes, int len); +void *CMS_signed_get0_data_by_OBJ(CMS_SignerInfo *si, ASN1_OBJECT *oid, + int lastpos, int type); + +int CMS_unsigned_get_attr_count(const CMS_SignerInfo *si); +int CMS_unsigned_get_attr_by_NID(const CMS_SignerInfo *si, int nid, + int lastpos); +int CMS_unsigned_get_attr_by_OBJ(const CMS_SignerInfo *si, ASN1_OBJECT *obj, + int lastpos); +X509_ATTRIBUTE *CMS_unsigned_get_attr(const CMS_SignerInfo *si, int loc); +X509_ATTRIBUTE *CMS_unsigned_delete_attr(CMS_SignerInfo *si, int loc); +int CMS_unsigned_add1_attr(CMS_SignerInfo *si, X509_ATTRIBUTE *attr); +int CMS_unsigned_add1_attr_by_OBJ(CMS_SignerInfo *si, + const ASN1_OBJECT *obj, int type, + const void *bytes, int len); +int CMS_unsigned_add1_attr_by_NID(CMS_SignerInfo *si, + int nid, int type, + const void *bytes, int len); +int CMS_unsigned_add1_attr_by_txt(CMS_SignerInfo *si, + const char *attrname, int type, + const void *bytes, int len); +void *CMS_unsigned_get0_data_by_OBJ(CMS_SignerInfo *si, ASN1_OBJECT *oid, + int lastpos, int type); + +# ifdef HEADER_X509V3_H + +int CMS_get1_ReceiptRequest(CMS_SignerInfo *si, CMS_ReceiptRequest **prr); +CMS_ReceiptRequest *CMS_ReceiptRequest_create0(unsigned char *id, int idlen, + int allorfirst, + STACK_OF(GENERAL_NAMES) + *receiptList, STACK_OF(GENERAL_NAMES) + *receiptsTo); +int CMS_add1_ReceiptRequest(CMS_SignerInfo *si, CMS_ReceiptRequest *rr); +void CMS_ReceiptRequest_get0_values(CMS_ReceiptRequest *rr, + ASN1_STRING **pcid, + int *pallorfirst, + STACK_OF(GENERAL_NAMES) **plist, + STACK_OF(GENERAL_NAMES) **prto); +# endif +int CMS_RecipientInfo_kari_get0_alg(CMS_RecipientInfo *ri, + X509_ALGOR **palg, + ASN1_OCTET_STRING **pukm); +STACK_OF(CMS_RecipientEncryptedKey) +*CMS_RecipientInfo_kari_get0_reks(CMS_RecipientInfo *ri); + +int CMS_RecipientInfo_kari_get0_orig_id(CMS_RecipientInfo *ri, + X509_ALGOR **pubalg, + ASN1_BIT_STRING **pubkey, + ASN1_OCTET_STRING **keyid, + X509_NAME **issuer, + ASN1_INTEGER **sno); + +int CMS_RecipientInfo_kari_orig_id_cmp(CMS_RecipientInfo *ri, X509 *cert); + +int CMS_RecipientEncryptedKey_get0_id(CMS_RecipientEncryptedKey *rek, + ASN1_OCTET_STRING **keyid, + ASN1_GENERALIZEDTIME **tm, + CMS_OtherKeyAttribute **other, + X509_NAME **issuer, ASN1_INTEGER **sno); +int CMS_RecipientEncryptedKey_cert_cmp(CMS_RecipientEncryptedKey *rek, + X509 *cert); +int CMS_RecipientInfo_kari_set0_pkey(CMS_RecipientInfo *ri, EVP_PKEY *pk); +EVP_CIPHER_CTX *CMS_RecipientInfo_kari_get0_ctx(CMS_RecipientInfo *ri); +int CMS_RecipientInfo_kari_decrypt(CMS_ContentInfo *cms, + CMS_RecipientInfo *ri, + CMS_RecipientEncryptedKey *rek); + +int CMS_SharedInfo_encode(unsigned char **pder, X509_ALGOR *kekalg, + ASN1_OCTET_STRING *ukm, int keylen); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_CMS_strings(void); + +/* Error codes for the CMS functions. */ + +/* Function codes. */ +# define CMS_F_CHECK_CONTENT 99 +# define CMS_F_CMS_ADD0_CERT 164 +# define CMS_F_CMS_ADD0_RECIPIENT_KEY 100 +# define CMS_F_CMS_ADD0_RECIPIENT_PASSWORD 165 +# define CMS_F_CMS_ADD1_RECEIPTREQUEST 158 +# define CMS_F_CMS_ADD1_RECIPIENT_CERT 101 +# define CMS_F_CMS_ADD1_SIGNER 102 +# define CMS_F_CMS_ADD1_SIGNINGTIME 103 +# define CMS_F_CMS_COMPRESS 104 +# define CMS_F_CMS_COMPRESSEDDATA_CREATE 105 +# define CMS_F_CMS_COMPRESSEDDATA_INIT_BIO 106 +# define CMS_F_CMS_COPY_CONTENT 107 +# define CMS_F_CMS_COPY_MESSAGEDIGEST 108 +# define CMS_F_CMS_DATA 109 +# define CMS_F_CMS_DATAFINAL 110 +# define CMS_F_CMS_DATAINIT 111 +# define CMS_F_CMS_DECRYPT 112 +# define CMS_F_CMS_DECRYPT_SET1_KEY 113 +# define CMS_F_CMS_DECRYPT_SET1_PASSWORD 166 +# define CMS_F_CMS_DECRYPT_SET1_PKEY 114 +# define CMS_F_CMS_DIGESTALGORITHM_FIND_CTX 115 +# define CMS_F_CMS_DIGESTALGORITHM_INIT_BIO 116 +# define CMS_F_CMS_DIGESTEDDATA_DO_FINAL 117 +# define CMS_F_CMS_DIGEST_VERIFY 118 +# define CMS_F_CMS_ENCODE_RECEIPT 161 +# define CMS_F_CMS_ENCRYPT 119 +# define CMS_F_CMS_ENCRYPTEDCONTENT_INIT_BIO 120 +# define CMS_F_CMS_ENCRYPTEDDATA_DECRYPT 121 +# define CMS_F_CMS_ENCRYPTEDDATA_ENCRYPT 122 +# define CMS_F_CMS_ENCRYPTEDDATA_SET1_KEY 123 +# define CMS_F_CMS_ENVELOPEDDATA_CREATE 124 +# define CMS_F_CMS_ENVELOPEDDATA_INIT_BIO 125 +# define CMS_F_CMS_ENVELOPED_DATA_INIT 126 +# define CMS_F_CMS_ENV_ASN1_CTRL 171 +# define CMS_F_CMS_FINAL 127 +# define CMS_F_CMS_GET0_CERTIFICATE_CHOICES 128 +# define CMS_F_CMS_GET0_CONTENT 129 +# define CMS_F_CMS_GET0_ECONTENT_TYPE 130 +# define CMS_F_CMS_GET0_ENVELOPED 131 +# define CMS_F_CMS_GET0_REVOCATION_CHOICES 132 +# define CMS_F_CMS_GET0_SIGNED 133 +# define CMS_F_CMS_MSGSIGDIGEST_ADD1 162 +# define CMS_F_CMS_RECEIPTREQUEST_CREATE0 159 +# define CMS_F_CMS_RECEIPT_VERIFY 160 +# define CMS_F_CMS_RECIPIENTINFO_DECRYPT 134 +# define CMS_F_CMS_RECIPIENTINFO_ENCRYPT 169 +# define CMS_F_CMS_RECIPIENTINFO_KARI_ENCRYPT 178 +# define CMS_F_CMS_RECIPIENTINFO_KARI_GET0_ALG 175 +# define CMS_F_CMS_RECIPIENTINFO_KARI_GET0_ORIG_ID 173 +# define CMS_F_CMS_RECIPIENTINFO_KARI_GET0_REKS 172 +# define CMS_F_CMS_RECIPIENTINFO_KARI_ORIG_ID_CMP 174 +# define CMS_F_CMS_RECIPIENTINFO_KEKRI_DECRYPT 135 +# define CMS_F_CMS_RECIPIENTINFO_KEKRI_ENCRYPT 136 +# define CMS_F_CMS_RECIPIENTINFO_KEKRI_GET0_ID 137 +# define CMS_F_CMS_RECIPIENTINFO_KEKRI_ID_CMP 138 +# define CMS_F_CMS_RECIPIENTINFO_KTRI_CERT_CMP 139 +# define CMS_F_CMS_RECIPIENTINFO_KTRI_DECRYPT 140 +# define CMS_F_CMS_RECIPIENTINFO_KTRI_ENCRYPT 141 +# define CMS_F_CMS_RECIPIENTINFO_KTRI_GET0_ALGS 142 +# define CMS_F_CMS_RECIPIENTINFO_KTRI_GET0_SIGNER_ID 143 +# define CMS_F_CMS_RECIPIENTINFO_PWRI_CRYPT 167 +# define CMS_F_CMS_RECIPIENTINFO_SET0_KEY 144 +# define CMS_F_CMS_RECIPIENTINFO_SET0_PASSWORD 168 +# define CMS_F_CMS_RECIPIENTINFO_SET0_PKEY 145 +# define CMS_F_CMS_SD_ASN1_CTRL 170 +# define CMS_F_CMS_SET1_IAS 176 +# define CMS_F_CMS_SET1_KEYID 177 +# define CMS_F_CMS_SET1_SIGNERIDENTIFIER 146 +# define CMS_F_CMS_SET_DETACHED 147 +# define CMS_F_CMS_SIGN 148 +# define CMS_F_CMS_SIGNED_DATA_INIT 149 +# define CMS_F_CMS_SIGNERINFO_CONTENT_SIGN 150 +# define CMS_F_CMS_SIGNERINFO_SIGN 151 +# define CMS_F_CMS_SIGNERINFO_VERIFY 152 +# define CMS_F_CMS_SIGNERINFO_VERIFY_CERT 153 +# define CMS_F_CMS_SIGNERINFO_VERIFY_CONTENT 154 +# define CMS_F_CMS_SIGN_RECEIPT 163 +# define CMS_F_CMS_STREAM 155 +# define CMS_F_CMS_UNCOMPRESS 156 +# define CMS_F_CMS_VERIFY 157 + +/* Reason codes. */ +# define CMS_R_ADD_SIGNER_ERROR 99 +# define CMS_R_CERTIFICATE_ALREADY_PRESENT 175 +# define CMS_R_CERTIFICATE_HAS_NO_KEYID 160 +# define CMS_R_CERTIFICATE_VERIFY_ERROR 100 +# define CMS_R_CIPHER_INITIALISATION_ERROR 101 +# define CMS_R_CIPHER_PARAMETER_INITIALISATION_ERROR 102 +# define CMS_R_CMS_DATAFINAL_ERROR 103 +# define CMS_R_CMS_LIB 104 +# define CMS_R_CONTENTIDENTIFIER_MISMATCH 170 +# define CMS_R_CONTENT_NOT_FOUND 105 +# define CMS_R_CONTENT_TYPE_MISMATCH 171 +# define CMS_R_CONTENT_TYPE_NOT_COMPRESSED_DATA 106 +# define CMS_R_CONTENT_TYPE_NOT_ENVELOPED_DATA 107 +# define CMS_R_CONTENT_TYPE_NOT_SIGNED_DATA 108 +# define CMS_R_CONTENT_VERIFY_ERROR 109 +# define CMS_R_CTRL_ERROR 110 +# define CMS_R_CTRL_FAILURE 111 +# define CMS_R_DECRYPT_ERROR 112 +# define CMS_R_DIGEST_ERROR 161 +# define CMS_R_ERROR_GETTING_PUBLIC_KEY 113 +# define CMS_R_ERROR_READING_MESSAGEDIGEST_ATTRIBUTE 114 +# define CMS_R_ERROR_SETTING_KEY 115 +# define CMS_R_ERROR_SETTING_RECIPIENTINFO 116 +# define CMS_R_INVALID_ENCRYPTED_KEY_LENGTH 117 +# define CMS_R_INVALID_KEY_ENCRYPTION_PARAMETER 176 +# define CMS_R_INVALID_KEY_LENGTH 118 +# define CMS_R_MD_BIO_INIT_ERROR 119 +# define CMS_R_MESSAGEDIGEST_ATTRIBUTE_WRONG_LENGTH 120 +# define CMS_R_MESSAGEDIGEST_WRONG_LENGTH 121 +# define CMS_R_MSGSIGDIGEST_ERROR 172 +# define CMS_R_MSGSIGDIGEST_VERIFICATION_FAILURE 162 +# define CMS_R_MSGSIGDIGEST_WRONG_LENGTH 163 +# define CMS_R_NEED_ONE_SIGNER 164 +# define CMS_R_NOT_A_SIGNED_RECEIPT 165 +# define CMS_R_NOT_ENCRYPTED_DATA 122 +# define CMS_R_NOT_KEK 123 +# define CMS_R_NOT_KEY_AGREEMENT 181 +# define CMS_R_NOT_KEY_TRANSPORT 124 +# define CMS_R_NOT_PWRI 177 +# define CMS_R_NOT_SUPPORTED_FOR_THIS_KEY_TYPE 125 +# define CMS_R_NO_CIPHER 126 +# define CMS_R_NO_CONTENT 127 +# define CMS_R_NO_CONTENT_TYPE 173 +# define CMS_R_NO_DEFAULT_DIGEST 128 +# define CMS_R_NO_DIGEST_SET 129 +# define CMS_R_NO_KEY 130 +# define CMS_R_NO_KEY_OR_CERT 174 +# define CMS_R_NO_MATCHING_DIGEST 131 +# define CMS_R_NO_MATCHING_RECIPIENT 132 +# define CMS_R_NO_MATCHING_SIGNATURE 166 +# define CMS_R_NO_MSGSIGDIGEST 167 +# define CMS_R_NO_PASSWORD 178 +# define CMS_R_NO_PRIVATE_KEY 133 +# define CMS_R_NO_PUBLIC_KEY 134 +# define CMS_R_NO_RECEIPT_REQUEST 168 +# define CMS_R_NO_SIGNERS 135 +# define CMS_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE 136 +# define CMS_R_RECEIPT_DECODE_ERROR 169 +# define CMS_R_RECIPIENT_ERROR 137 +# define CMS_R_SIGNER_CERTIFICATE_NOT_FOUND 138 +# define CMS_R_SIGNFINAL_ERROR 139 +# define CMS_R_SMIME_TEXT_ERROR 140 +# define CMS_R_STORE_INIT_ERROR 141 +# define CMS_R_TYPE_NOT_COMPRESSED_DATA 142 +# define CMS_R_TYPE_NOT_DATA 143 +# define CMS_R_TYPE_NOT_DIGESTED_DATA 144 +# define CMS_R_TYPE_NOT_ENCRYPTED_DATA 145 +# define CMS_R_TYPE_NOT_ENVELOPED_DATA 146 +# define CMS_R_UNABLE_TO_FINALIZE_CONTEXT 147 +# define CMS_R_UNKNOWN_CIPHER 148 +# define CMS_R_UNKNOWN_DIGEST_ALGORIHM 149 +# define CMS_R_UNKNOWN_ID 150 +# define CMS_R_UNSUPPORTED_COMPRESSION_ALGORITHM 151 +# define CMS_R_UNSUPPORTED_CONTENT_TYPE 152 +# define CMS_R_UNSUPPORTED_KEK_ALGORITHM 153 +# define CMS_R_UNSUPPORTED_KEY_ENCRYPTION_ALGORITHM 179 +# define CMS_R_UNSUPPORTED_RECIPIENT_TYPE 154 +# define CMS_R_UNSUPPORTED_RECPIENTINFO_TYPE 155 +# define CMS_R_UNSUPPORTED_TYPE 156 +# define CMS_R_UNWRAP_ERROR 157 +# define CMS_R_UNWRAP_FAILURE 180 +# define CMS_R_VERIFICATION_FAILURE 158 +# define CMS_R_WRAP_ERROR 159 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/win/openssl/include/openssl/comp.h b/hdssd/external/win/openssl/include/openssl/comp.h new file mode 100644 index 0000000..406c428 --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/comp.h @@ -0,0 +1,79 @@ + +#ifndef HEADER_COMP_H +# define HEADER_COMP_H + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct comp_ctx_st COMP_CTX; + +typedef struct comp_method_st { + int type; /* NID for compression library */ + const char *name; /* A text string to identify the library */ + int (*init) (COMP_CTX *ctx); + void (*finish) (COMP_CTX *ctx); + int (*compress) (COMP_CTX *ctx, + unsigned char *out, unsigned int olen, + unsigned char *in, unsigned int ilen); + int (*expand) (COMP_CTX *ctx, + unsigned char *out, unsigned int olen, + unsigned char *in, unsigned int ilen); + /* + * The following two do NOTHING, but are kept for backward compatibility + */ + long (*ctrl) (void); + long (*callback_ctrl) (void); +} COMP_METHOD; + +struct comp_ctx_st { + COMP_METHOD *meth; + unsigned long compress_in; + unsigned long compress_out; + unsigned long expand_in; + unsigned long expand_out; + CRYPTO_EX_DATA ex_data; +}; + +COMP_CTX *COMP_CTX_new(COMP_METHOD *meth); +void COMP_CTX_free(COMP_CTX *ctx); +int COMP_compress_block(COMP_CTX *ctx, unsigned char *out, int olen, + unsigned char *in, int ilen); +int COMP_expand_block(COMP_CTX *ctx, unsigned char *out, int olen, + unsigned char *in, int ilen); +COMP_METHOD *COMP_rle(void); +COMP_METHOD *COMP_zlib(void); +void COMP_zlib_cleanup(void); + +# ifdef HEADER_BIO_H +# ifdef ZLIB +BIO_METHOD *BIO_f_zlib(void); +# endif +# endif + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_COMP_strings(void); + +/* Error codes for the COMP functions. */ + +/* Function codes. */ +# define COMP_F_BIO_ZLIB_FLUSH 99 +# define COMP_F_BIO_ZLIB_NEW 100 +# define COMP_F_BIO_ZLIB_READ 101 +# define COMP_F_BIO_ZLIB_WRITE 102 + +/* Reason codes. */ +# define COMP_R_ZLIB_DEFLATE_ERROR 99 +# define COMP_R_ZLIB_INFLATE_ERROR 100 +# define COMP_R_ZLIB_NOT_SUPPORTED 101 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/win/openssl/include/openssl/conf.h b/hdssd/external/win/openssl/include/openssl/conf.h new file mode 100644 index 0000000..8d926d5 --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/conf.h @@ -0,0 +1,267 @@ +/* crypto/conf/conf.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_CONF_H +# define HEADER_CONF_H + +# include +# include +# include +# include +# include + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + char *section; + char *name; + char *value; +} CONF_VALUE; + +DECLARE_STACK_OF(CONF_VALUE) +DECLARE_LHASH_OF(CONF_VALUE); + +struct conf_st; +struct conf_method_st; +typedef struct conf_method_st CONF_METHOD; + +struct conf_method_st { + const char *name; + CONF *(*create) (CONF_METHOD *meth); + int (*init) (CONF *conf); + int (*destroy) (CONF *conf); + int (*destroy_data) (CONF *conf); + int (*load_bio) (CONF *conf, BIO *bp, long *eline); + int (*dump) (const CONF *conf, BIO *bp); + int (*is_number) (const CONF *conf, char c); + int (*to_int) (const CONF *conf, char c); + int (*load) (CONF *conf, const char *name, long *eline); +}; + +/* Module definitions */ + +typedef struct conf_imodule_st CONF_IMODULE; +typedef struct conf_module_st CONF_MODULE; + +DECLARE_STACK_OF(CONF_MODULE) +DECLARE_STACK_OF(CONF_IMODULE) + +/* DSO module function typedefs */ +typedef int conf_init_func (CONF_IMODULE *md, const CONF *cnf); +typedef void conf_finish_func (CONF_IMODULE *md); + +# define CONF_MFLAGS_IGNORE_ERRORS 0x1 +# define CONF_MFLAGS_IGNORE_RETURN_CODES 0x2 +# define CONF_MFLAGS_SILENT 0x4 +# define CONF_MFLAGS_NO_DSO 0x8 +# define CONF_MFLAGS_IGNORE_MISSING_FILE 0x10 +# define CONF_MFLAGS_DEFAULT_SECTION 0x20 + +int CONF_set_default_method(CONF_METHOD *meth); +void CONF_set_nconf(CONF *conf, LHASH_OF(CONF_VALUE) *hash); +LHASH_OF(CONF_VALUE) *CONF_load(LHASH_OF(CONF_VALUE) *conf, const char *file, + long *eline); +# ifndef OPENSSL_NO_FP_API +LHASH_OF(CONF_VALUE) *CONF_load_fp(LHASH_OF(CONF_VALUE) *conf, FILE *fp, + long *eline); +# endif +LHASH_OF(CONF_VALUE) *CONF_load_bio(LHASH_OF(CONF_VALUE) *conf, BIO *bp, + long *eline); +STACK_OF(CONF_VALUE) *CONF_get_section(LHASH_OF(CONF_VALUE) *conf, + const char *section); +char *CONF_get_string(LHASH_OF(CONF_VALUE) *conf, const char *group, + const char *name); +long CONF_get_number(LHASH_OF(CONF_VALUE) *conf, const char *group, + const char *name); +void CONF_free(LHASH_OF(CONF_VALUE) *conf); +int CONF_dump_fp(LHASH_OF(CONF_VALUE) *conf, FILE *out); +int CONF_dump_bio(LHASH_OF(CONF_VALUE) *conf, BIO *out); + +void OPENSSL_config(const char *config_name); +void OPENSSL_no_config(void); + +/* + * New conf code. The semantics are different from the functions above. If + * that wasn't the case, the above functions would have been replaced + */ + +struct conf_st { + CONF_METHOD *meth; + void *meth_data; + LHASH_OF(CONF_VALUE) *data; +}; + +CONF *NCONF_new(CONF_METHOD *meth); +CONF_METHOD *NCONF_default(void); +CONF_METHOD *NCONF_WIN32(void); +# if 0 /* Just to give you an idea of what I have in + * mind */ +CONF_METHOD *NCONF_XML(void); +# endif +void NCONF_free(CONF *conf); +void NCONF_free_data(CONF *conf); + +int NCONF_load(CONF *conf, const char *file, long *eline); +# ifndef OPENSSL_NO_FP_API +int NCONF_load_fp(CONF *conf, FILE *fp, long *eline); +# endif +int NCONF_load_bio(CONF *conf, BIO *bp, long *eline); +STACK_OF(CONF_VALUE) *NCONF_get_section(const CONF *conf, + const char *section); +char *NCONF_get_string(const CONF *conf, const char *group, const char *name); +int NCONF_get_number_e(const CONF *conf, const char *group, const char *name, + long *result); +int NCONF_dump_fp(const CONF *conf, FILE *out); +int NCONF_dump_bio(const CONF *conf, BIO *out); + +# if 0 /* The following function has no error + * checking, and should therefore be avoided */ +long NCONF_get_number(CONF *conf, char *group, char *name); +# else +# define NCONF_get_number(c,g,n,r) NCONF_get_number_e(c,g,n,r) +# endif + +/* Module functions */ + +int CONF_modules_load(const CONF *cnf, const char *appname, + unsigned long flags); +int CONF_modules_load_file(const char *filename, const char *appname, + unsigned long flags); +void CONF_modules_unload(int all); +void CONF_modules_finish(void); +void CONF_modules_free(void); +int CONF_module_add(const char *name, conf_init_func *ifunc, + conf_finish_func *ffunc); + +const char *CONF_imodule_get_name(const CONF_IMODULE *md); +const char *CONF_imodule_get_value(const CONF_IMODULE *md); +void *CONF_imodule_get_usr_data(const CONF_IMODULE *md); +void CONF_imodule_set_usr_data(CONF_IMODULE *md, void *usr_data); +CONF_MODULE *CONF_imodule_get_module(const CONF_IMODULE *md); +unsigned long CONF_imodule_get_flags(const CONF_IMODULE *md); +void CONF_imodule_set_flags(CONF_IMODULE *md, unsigned long flags); +void *CONF_module_get_usr_data(CONF_MODULE *pmod); +void CONF_module_set_usr_data(CONF_MODULE *pmod, void *usr_data); + +char *CONF_get1_default_config_file(void); + +int CONF_parse_list(const char *list, int sep, int nospc, + int (*list_cb) (const char *elem, int len, void *usr), + void *arg); + +void OPENSSL_load_builtin_modules(void); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_CONF_strings(void); + +/* Error codes for the CONF functions. */ + +/* Function codes. */ +# define CONF_F_CONF_DUMP_FP 104 +# define CONF_F_CONF_LOAD 100 +# define CONF_F_CONF_LOAD_BIO 102 +# define CONF_F_CONF_LOAD_FP 103 +# define CONF_F_CONF_MODULES_LOAD 116 +# define CONF_F_CONF_PARSE_LIST 119 +# define CONF_F_DEF_LOAD 120 +# define CONF_F_DEF_LOAD_BIO 121 +# define CONF_F_MODULE_INIT 115 +# define CONF_F_MODULE_LOAD_DSO 117 +# define CONF_F_MODULE_RUN 118 +# define CONF_F_NCONF_DUMP_BIO 105 +# define CONF_F_NCONF_DUMP_FP 106 +# define CONF_F_NCONF_GET_NUMBER 107 +# define CONF_F_NCONF_GET_NUMBER_E 112 +# define CONF_F_NCONF_GET_SECTION 108 +# define CONF_F_NCONF_GET_STRING 109 +# define CONF_F_NCONF_LOAD 113 +# define CONF_F_NCONF_LOAD_BIO 110 +# define CONF_F_NCONF_LOAD_FP 114 +# define CONF_F_NCONF_NEW 111 +# define CONF_F_STR_COPY 101 + +/* Reason codes. */ +# define CONF_R_ERROR_LOADING_DSO 110 +# define CONF_R_LIST_CANNOT_BE_NULL 115 +# define CONF_R_MISSING_CLOSE_SQUARE_BRACKET 100 +# define CONF_R_MISSING_EQUAL_SIGN 101 +# define CONF_R_MISSING_FINISH_FUNCTION 111 +# define CONF_R_MISSING_INIT_FUNCTION 112 +# define CONF_R_MODULE_INITIALIZATION_ERROR 109 +# define CONF_R_NO_CLOSE_BRACE 102 +# define CONF_R_NO_CONF 105 +# define CONF_R_NO_CONF_OR_ENVIRONMENT_VARIABLE 106 +# define CONF_R_NO_SECTION 107 +# define CONF_R_NO_SUCH_FILE 114 +# define CONF_R_NO_VALUE 108 +# define CONF_R_UNABLE_TO_CREATE_NEW_SECTION 103 +# define CONF_R_UNKNOWN_MODULE_NAME 113 +# define CONF_R_VARIABLE_HAS_NO_VALUE 104 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/win/openssl/include/openssl/conf_api.h b/hdssd/external/win/openssl/include/openssl/conf_api.h new file mode 100644 index 0000000..e478f7d --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/conf_api.h @@ -0,0 +1,89 @@ +/* conf_api.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_CONF_API_H +# define HEADER_CONF_API_H + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Up until OpenSSL 0.9.5a, this was new_section */ +CONF_VALUE *_CONF_new_section(CONF *conf, const char *section); +/* Up until OpenSSL 0.9.5a, this was get_section */ +CONF_VALUE *_CONF_get_section(const CONF *conf, const char *section); +/* Up until OpenSSL 0.9.5a, this was CONF_get_section */ +STACK_OF(CONF_VALUE) *_CONF_get_section_values(const CONF *conf, + const char *section); + +int _CONF_add_string(CONF *conf, CONF_VALUE *section, CONF_VALUE *value); +char *_CONF_get_string(const CONF *conf, const char *section, + const char *name); +long _CONF_get_number(const CONF *conf, const char *section, + const char *name); + +int _CONF_new_data(CONF *conf); +void _CONF_free_data(CONF *conf); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/win/openssl/include/openssl/crypto.h b/hdssd/external/win/openssl/include/openssl/crypto.h new file mode 100644 index 0000000..6c644ce --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/crypto.h @@ -0,0 +1,661 @@ +/* crypto/crypto.h */ +/* ==================================================================== + * Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * ECDH support in OpenSSL originally developed by + * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project. + */ + +#ifndef HEADER_CRYPTO_H +# define HEADER_CRYPTO_H + +# include + +# include + +# ifndef OPENSSL_NO_FP_API +# include +# endif + +# include +# include +# include +# include + +# ifdef CHARSET_EBCDIC +# include +# endif + +/* + * Resolve problems on some operating systems with symbol names that clash + * one way or another + */ +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Backward compatibility to SSLeay */ +/* + * This is more to be used to check the correct DLL is being used in the MS + * world. + */ +# define SSLEAY_VERSION_NUMBER OPENSSL_VERSION_NUMBER +# define SSLEAY_VERSION 0 +/* #define SSLEAY_OPTIONS 1 no longer supported */ +# define SSLEAY_CFLAGS 2 +# define SSLEAY_BUILT_ON 3 +# define SSLEAY_PLATFORM 4 +# define SSLEAY_DIR 5 + +/* Already declared in ossl_typ.h */ +# if 0 +typedef struct crypto_ex_data_st CRYPTO_EX_DATA; +/* Called when a new object is created */ +typedef int CRYPTO_EX_new (void *parent, void *ptr, CRYPTO_EX_DATA *ad, + int idx, long argl, void *argp); +/* Called when an object is free()ed */ +typedef void CRYPTO_EX_free (void *parent, void *ptr, CRYPTO_EX_DATA *ad, + int idx, long argl, void *argp); +/* Called when we need to dup an object */ +typedef int CRYPTO_EX_dup (CRYPTO_EX_DATA *to, CRYPTO_EX_DATA *from, + void *from_d, int idx, long argl, void *argp); +# endif + +/* A generic structure to pass assorted data in a expandable way */ +typedef struct openssl_item_st { + int code; + void *value; /* Not used for flag attributes */ + size_t value_size; /* Max size of value for output, length for + * input */ + size_t *value_length; /* Returned length of value for output */ +} OPENSSL_ITEM; + +/* + * When changing the CRYPTO_LOCK_* list, be sure to maintin the text lock + * names in cryptlib.c + */ + +# define CRYPTO_LOCK_ERR 1 +# define CRYPTO_LOCK_EX_DATA 2 +# define CRYPTO_LOCK_X509 3 +# define CRYPTO_LOCK_X509_INFO 4 +# define CRYPTO_LOCK_X509_PKEY 5 +# define CRYPTO_LOCK_X509_CRL 6 +# define CRYPTO_LOCK_X509_REQ 7 +# define CRYPTO_LOCK_DSA 8 +# define CRYPTO_LOCK_RSA 9 +# define CRYPTO_LOCK_EVP_PKEY 10 +# define CRYPTO_LOCK_X509_STORE 11 +# define CRYPTO_LOCK_SSL_CTX 12 +# define CRYPTO_LOCK_SSL_CERT 13 +# define CRYPTO_LOCK_SSL_SESSION 14 +# define CRYPTO_LOCK_SSL_SESS_CERT 15 +# define CRYPTO_LOCK_SSL 16 +# define CRYPTO_LOCK_SSL_METHOD 17 +# define CRYPTO_LOCK_RAND 18 +# define CRYPTO_LOCK_RAND2 19 +# define CRYPTO_LOCK_MALLOC 20 +# define CRYPTO_LOCK_BIO 21 +# define CRYPTO_LOCK_GETHOSTBYNAME 22 +# define CRYPTO_LOCK_GETSERVBYNAME 23 +# define CRYPTO_LOCK_READDIR 24 +# define CRYPTO_LOCK_RSA_BLINDING 25 +# define CRYPTO_LOCK_DH 26 +# define CRYPTO_LOCK_MALLOC2 27 +# define CRYPTO_LOCK_DSO 28 +# define CRYPTO_LOCK_DYNLOCK 29 +# define CRYPTO_LOCK_ENGINE 30 +# define CRYPTO_LOCK_UI 31 +# define CRYPTO_LOCK_ECDSA 32 +# define CRYPTO_LOCK_EC 33 +# define CRYPTO_LOCK_ECDH 34 +# define CRYPTO_LOCK_BN 35 +# define CRYPTO_LOCK_EC_PRE_COMP 36 +# define CRYPTO_LOCK_STORE 37 +# define CRYPTO_LOCK_COMP 38 +# define CRYPTO_LOCK_FIPS 39 +# define CRYPTO_LOCK_FIPS2 40 +# define CRYPTO_NUM_LOCKS 41 + +# define CRYPTO_LOCK 1 +# define CRYPTO_UNLOCK 2 +# define CRYPTO_READ 4 +# define CRYPTO_WRITE 8 + +# ifndef OPENSSL_NO_LOCKING +# ifndef CRYPTO_w_lock +# define CRYPTO_w_lock(type) \ + CRYPTO_lock(CRYPTO_LOCK|CRYPTO_WRITE,type,__FILE__,__LINE__) +# define CRYPTO_w_unlock(type) \ + CRYPTO_lock(CRYPTO_UNLOCK|CRYPTO_WRITE,type,__FILE__,__LINE__) +# define CRYPTO_r_lock(type) \ + CRYPTO_lock(CRYPTO_LOCK|CRYPTO_READ,type,__FILE__,__LINE__) +# define CRYPTO_r_unlock(type) \ + CRYPTO_lock(CRYPTO_UNLOCK|CRYPTO_READ,type,__FILE__,__LINE__) +# define CRYPTO_add(addr,amount,type) \ + CRYPTO_add_lock(addr,amount,type,__FILE__,__LINE__) +# endif +# else +# define CRYPTO_w_lock(a) +# define CRYPTO_w_unlock(a) +# define CRYPTO_r_lock(a) +# define CRYPTO_r_unlock(a) +# define CRYPTO_add(a,b,c) ((*(a))+=(b)) +# endif + +/* + * Some applications as well as some parts of OpenSSL need to allocate and + * deallocate locks in a dynamic fashion. The following typedef makes this + * possible in a type-safe manner. + */ +/* struct CRYPTO_dynlock_value has to be defined by the application. */ +typedef struct { + int references; + struct CRYPTO_dynlock_value *data; +} CRYPTO_dynlock; + +/* + * The following can be used to detect memory leaks in the SSLeay library. It + * used, it turns on malloc checking + */ + +# define CRYPTO_MEM_CHECK_OFF 0x0/* an enume */ +# define CRYPTO_MEM_CHECK_ON 0x1/* a bit */ +# define CRYPTO_MEM_CHECK_ENABLE 0x2/* a bit */ +# define CRYPTO_MEM_CHECK_DISABLE 0x3/* an enume */ + +/* + * The following are bit values to turn on or off options connected to the + * malloc checking functionality + */ + +/* Adds time to the memory checking information */ +# define V_CRYPTO_MDEBUG_TIME 0x1/* a bit */ +/* Adds thread number to the memory checking information */ +# define V_CRYPTO_MDEBUG_THREAD 0x2/* a bit */ + +# define V_CRYPTO_MDEBUG_ALL (V_CRYPTO_MDEBUG_TIME | V_CRYPTO_MDEBUG_THREAD) + +/* predec of the BIO type */ +typedef struct bio_st BIO_dummy; + +struct crypto_ex_data_st { + STACK_OF(void) *sk; + /* gcc is screwing up this data structure :-( */ + int dummy; +}; +DECLARE_STACK_OF(void) + +/* + * This stuff is basically class callback functions The current classes are + * SSL_CTX, SSL, SSL_SESSION, and a few more + */ + +typedef struct crypto_ex_data_func_st { + long argl; /* Arbitary long */ + void *argp; /* Arbitary void * */ + CRYPTO_EX_new *new_func; + CRYPTO_EX_free *free_func; + CRYPTO_EX_dup *dup_func; +} CRYPTO_EX_DATA_FUNCS; + +DECLARE_STACK_OF(CRYPTO_EX_DATA_FUNCS) + +/* + * Per class, we have a STACK of CRYPTO_EX_DATA_FUNCS for each CRYPTO_EX_DATA + * entry. + */ + +# define CRYPTO_EX_INDEX_BIO 0 +# define CRYPTO_EX_INDEX_SSL 1 +# define CRYPTO_EX_INDEX_SSL_CTX 2 +# define CRYPTO_EX_INDEX_SSL_SESSION 3 +# define CRYPTO_EX_INDEX_X509_STORE 4 +# define CRYPTO_EX_INDEX_X509_STORE_CTX 5 +# define CRYPTO_EX_INDEX_RSA 6 +# define CRYPTO_EX_INDEX_DSA 7 +# define CRYPTO_EX_INDEX_DH 8 +# define CRYPTO_EX_INDEX_ENGINE 9 +# define CRYPTO_EX_INDEX_X509 10 +# define CRYPTO_EX_INDEX_UI 11 +# define CRYPTO_EX_INDEX_ECDSA 12 +# define CRYPTO_EX_INDEX_ECDH 13 +# define CRYPTO_EX_INDEX_COMP 14 +# define CRYPTO_EX_INDEX_STORE 15 + +/* + * Dynamically assigned indexes start from this value (don't use directly, + * use via CRYPTO_ex_data_new_class). + */ +# define CRYPTO_EX_INDEX_USER 100 + +/* + * This is the default callbacks, but we can have others as well: this is + * needed in Win32 where the application malloc and the library malloc may + * not be the same. + */ +# define CRYPTO_malloc_init() CRYPTO_set_mem_functions(\ + malloc, realloc, free) + +# if defined CRYPTO_MDEBUG_ALL || defined CRYPTO_MDEBUG_TIME || defined CRYPTO_MDEBUG_THREAD +# ifndef CRYPTO_MDEBUG /* avoid duplicate #define */ +# define CRYPTO_MDEBUG +# endif +# endif + +/* + * Set standard debugging functions (not done by default unless CRYPTO_MDEBUG + * is defined) + */ +# define CRYPTO_malloc_debug_init() do {\ + CRYPTO_set_mem_debug_functions(\ + CRYPTO_dbg_malloc,\ + CRYPTO_dbg_realloc,\ + CRYPTO_dbg_free,\ + CRYPTO_dbg_set_options,\ + CRYPTO_dbg_get_options);\ + } while(0) + +int CRYPTO_mem_ctrl(int mode); +int CRYPTO_is_mem_check_on(void); + +/* for applications */ +# define MemCheck_start() CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON) +# define MemCheck_stop() CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_OFF) + +/* for library-internal use */ +# define MemCheck_on() CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ENABLE) +# define MemCheck_off() CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_DISABLE) +# define is_MemCheck_on() CRYPTO_is_mem_check_on() + +# define OPENSSL_malloc(num) CRYPTO_malloc((int)num,__FILE__,__LINE__) +# define OPENSSL_strdup(str) CRYPTO_strdup((str),__FILE__,__LINE__) +# define OPENSSL_realloc(addr,num) \ + CRYPTO_realloc((char *)addr,(int)num,__FILE__,__LINE__) +# define OPENSSL_realloc_clean(addr,old_num,num) \ + CRYPTO_realloc_clean(addr,old_num,num,__FILE__,__LINE__) +# define OPENSSL_remalloc(addr,num) \ + CRYPTO_remalloc((char **)addr,(int)num,__FILE__,__LINE__) +# define OPENSSL_freeFunc CRYPTO_free +# define OPENSSL_free(addr) CRYPTO_free(addr) + +# define OPENSSL_malloc_locked(num) \ + CRYPTO_malloc_locked((int)num,__FILE__,__LINE__) +# define OPENSSL_free_locked(addr) CRYPTO_free_locked(addr) + +const char *SSLeay_version(int type); +unsigned long SSLeay(void); + +int OPENSSL_issetugid(void); + +/* An opaque type representing an implementation of "ex_data" support */ +typedef struct st_CRYPTO_EX_DATA_IMPL CRYPTO_EX_DATA_IMPL; +/* Return an opaque pointer to the current "ex_data" implementation */ +const CRYPTO_EX_DATA_IMPL *CRYPTO_get_ex_data_implementation(void); +/* Sets the "ex_data" implementation to be used (if it's not too late) */ +int CRYPTO_set_ex_data_implementation(const CRYPTO_EX_DATA_IMPL *i); +/* Get a new "ex_data" class, and return the corresponding "class_index" */ +int CRYPTO_ex_data_new_class(void); +/* Within a given class, get/register a new index */ +int CRYPTO_get_ex_new_index(int class_index, long argl, void *argp, + CRYPTO_EX_new *new_func, CRYPTO_EX_dup *dup_func, + CRYPTO_EX_free *free_func); +/* + * Initialise/duplicate/free CRYPTO_EX_DATA variables corresponding to a + * given class (invokes whatever per-class callbacks are applicable) + */ +int CRYPTO_new_ex_data(int class_index, void *obj, CRYPTO_EX_DATA *ad); +int CRYPTO_dup_ex_data(int class_index, CRYPTO_EX_DATA *to, + CRYPTO_EX_DATA *from); +void CRYPTO_free_ex_data(int class_index, void *obj, CRYPTO_EX_DATA *ad); +/* + * Get/set data in a CRYPTO_EX_DATA variable corresponding to a particular + * index (relative to the class type involved) + */ +int CRYPTO_set_ex_data(CRYPTO_EX_DATA *ad, int idx, void *val); +void *CRYPTO_get_ex_data(const CRYPTO_EX_DATA *ad, int idx); +/* + * This function cleans up all "ex_data" state. It mustn't be called under + * potential race-conditions. + */ +void CRYPTO_cleanup_all_ex_data(void); + +int CRYPTO_get_new_lockid(char *name); + +int CRYPTO_num_locks(void); /* return CRYPTO_NUM_LOCKS (shared libs!) */ +void CRYPTO_lock(int mode, int type, const char *file, int line); +void CRYPTO_set_locking_callback(void (*func) (int mode, int type, + const char *file, int line)); +void (*CRYPTO_get_locking_callback(void)) (int mode, int type, + const char *file, int line); +void CRYPTO_set_add_lock_callback(int (*func) + (int *num, int mount, int type, + const char *file, int line)); +int (*CRYPTO_get_add_lock_callback(void)) (int *num, int mount, int type, + const char *file, int line); + +/* Don't use this structure directly. */ +typedef struct crypto_threadid_st { + void *ptr; + unsigned long val; +} CRYPTO_THREADID; +/* Only use CRYPTO_THREADID_set_[numeric|pointer]() within callbacks */ +void CRYPTO_THREADID_set_numeric(CRYPTO_THREADID *id, unsigned long val); +void CRYPTO_THREADID_set_pointer(CRYPTO_THREADID *id, void *ptr); +int CRYPTO_THREADID_set_callback(void (*threadid_func) (CRYPTO_THREADID *)); +void (*CRYPTO_THREADID_get_callback(void)) (CRYPTO_THREADID *); +void CRYPTO_THREADID_current(CRYPTO_THREADID *id); +int CRYPTO_THREADID_cmp(const CRYPTO_THREADID *a, const CRYPTO_THREADID *b); +void CRYPTO_THREADID_cpy(CRYPTO_THREADID *dest, const CRYPTO_THREADID *src); +unsigned long CRYPTO_THREADID_hash(const CRYPTO_THREADID *id); +# ifndef OPENSSL_NO_DEPRECATED +void CRYPTO_set_id_callback(unsigned long (*func) (void)); +unsigned long (*CRYPTO_get_id_callback(void)) (void); +unsigned long CRYPTO_thread_id(void); +# endif + +const char *CRYPTO_get_lock_name(int type); +int CRYPTO_add_lock(int *pointer, int amount, int type, const char *file, + int line); + +int CRYPTO_get_new_dynlockid(void); +void CRYPTO_destroy_dynlockid(int i); +struct CRYPTO_dynlock_value *CRYPTO_get_dynlock_value(int i); +void CRYPTO_set_dynlock_create_callback(struct CRYPTO_dynlock_value + *(*dyn_create_function) (const char + *file, + int line)); +void CRYPTO_set_dynlock_lock_callback(void (*dyn_lock_function) + (int mode, + struct CRYPTO_dynlock_value *l, + const char *file, int line)); +void CRYPTO_set_dynlock_destroy_callback(void (*dyn_destroy_function) + (struct CRYPTO_dynlock_value *l, + const char *file, int line)); +struct CRYPTO_dynlock_value +*(*CRYPTO_get_dynlock_create_callback(void)) (const char *file, int line); +void (*CRYPTO_get_dynlock_lock_callback(void)) (int mode, + struct CRYPTO_dynlock_value + *l, const char *file, + int line); +void (*CRYPTO_get_dynlock_destroy_callback(void)) (struct CRYPTO_dynlock_value + *l, const char *file, + int line); + +/* + * CRYPTO_set_mem_functions includes CRYPTO_set_locked_mem_functions -- call + * the latter last if you need different functions + */ +int CRYPTO_set_mem_functions(void *(*m) (size_t), void *(*r) (void *, size_t), + void (*f) (void *)); +int CRYPTO_set_locked_mem_functions(void *(*m) (size_t), + void (*free_func) (void *)); +int CRYPTO_set_mem_ex_functions(void *(*m) (size_t, const char *, int), + void *(*r) (void *, size_t, const char *, + int), void (*f) (void *)); +int CRYPTO_set_locked_mem_ex_functions(void *(*m) (size_t, const char *, int), + void (*free_func) (void *)); +int CRYPTO_set_mem_debug_functions(void (*m) + (void *, int, const char *, int, int), + void (*r) (void *, void *, int, + const char *, int, int), + void (*f) (void *, int), void (*so) (long), + long (*go) (void)); +void CRYPTO_get_mem_functions(void *(**m) (size_t), + void *(**r) (void *, size_t), + void (**f) (void *)); +void CRYPTO_get_locked_mem_functions(void *(**m) (size_t), + void (**f) (void *)); +void CRYPTO_get_mem_ex_functions(void *(**m) (size_t, const char *, int), + void *(**r) (void *, size_t, const char *, + int), void (**f) (void *)); +void CRYPTO_get_locked_mem_ex_functions(void + *(**m) (size_t, const char *, int), + void (**f) (void *)); +void CRYPTO_get_mem_debug_functions(void (**m) + (void *, int, const char *, int, int), + void (**r) (void *, void *, int, + const char *, int, int), + void (**f) (void *, int), + void (**so) (long), long (**go) (void)); + +void *CRYPTO_malloc_locked(int num, const char *file, int line); +void CRYPTO_free_locked(void *ptr); +void *CRYPTO_malloc(int num, const char *file, int line); +char *CRYPTO_strdup(const char *str, const char *file, int line); +void CRYPTO_free(void *ptr); +void *CRYPTO_realloc(void *addr, int num, const char *file, int line); +void *CRYPTO_realloc_clean(void *addr, int old_num, int num, const char *file, + int line); +void *CRYPTO_remalloc(void *addr, int num, const char *file, int line); + +void OPENSSL_cleanse(void *ptr, size_t len); + +void CRYPTO_set_mem_debug_options(long bits); +long CRYPTO_get_mem_debug_options(void); + +# define CRYPTO_push_info(info) \ + CRYPTO_push_info_(info, __FILE__, __LINE__); +int CRYPTO_push_info_(const char *info, const char *file, int line); +int CRYPTO_pop_info(void); +int CRYPTO_remove_all_info(void); + +/* + * Default debugging functions (enabled by CRYPTO_malloc_debug_init() macro; + * used as default in CRYPTO_MDEBUG compilations): + */ +/*- + * The last argument has the following significance: + * + * 0: called before the actual memory allocation has taken place + * 1: called after the actual memory allocation has taken place + */ +void CRYPTO_dbg_malloc(void *addr, int num, const char *file, int line, + int before_p); +void CRYPTO_dbg_realloc(void *addr1, void *addr2, int num, const char *file, + int line, int before_p); +void CRYPTO_dbg_free(void *addr, int before_p); +/*- + * Tell the debugging code about options. By default, the following values + * apply: + * + * 0: Clear all options. + * V_CRYPTO_MDEBUG_TIME (1): Set the "Show Time" option. + * V_CRYPTO_MDEBUG_THREAD (2): Set the "Show Thread Number" option. + * V_CRYPTO_MDEBUG_ALL (3): 1 + 2 + */ +void CRYPTO_dbg_set_options(long bits); +long CRYPTO_dbg_get_options(void); + +# ifndef OPENSSL_NO_FP_API +void CRYPTO_mem_leaks_fp(FILE *); +# endif +void CRYPTO_mem_leaks(struct bio_st *bio); +/* unsigned long order, char *file, int line, int num_bytes, char *addr */ +typedef void *CRYPTO_MEM_LEAK_CB (unsigned long, const char *, int, int, + void *); +void CRYPTO_mem_leaks_cb(CRYPTO_MEM_LEAK_CB *cb); + +/* die if we have to */ +void OpenSSLDie(const char *file, int line, const char *assertion); +# define OPENSSL_assert(e) (void)((e) ? 0 : (OpenSSLDie(__FILE__, __LINE__, #e),1)) + +unsigned long *OPENSSL_ia32cap_loc(void); +# define OPENSSL_ia32cap (*(OPENSSL_ia32cap_loc())) +int OPENSSL_isservice(void); + +int FIPS_mode(void); +int FIPS_mode_set(int r); + +void OPENSSL_init(void); + +# define fips_md_init(alg) fips_md_init_ctx(alg, alg) + +# ifdef OPENSSL_FIPS +# define fips_md_init_ctx(alg, cx) \ + int alg##_Init(cx##_CTX *c) \ + { \ + if (FIPS_mode()) OpenSSLDie(__FILE__, __LINE__, \ + "Low level API call to digest " #alg " forbidden in FIPS mode!"); \ + return private_##alg##_Init(c); \ + } \ + int private_##alg##_Init(cx##_CTX *c) + +# define fips_cipher_abort(alg) \ + if (FIPS_mode()) OpenSSLDie(__FILE__, __LINE__, \ + "Low level API call to cipher " #alg " forbidden in FIPS mode!") + +# else +# define fips_md_init_ctx(alg, cx) \ + int alg##_Init(cx##_CTX *c) +# define fips_cipher_abort(alg) while(0) +# endif + +/* + * CRYPTO_memcmp returns zero iff the |len| bytes at |a| and |b| are equal. + * It takes an amount of time dependent on |len|, but independent of the + * contents of |a| and |b|. Unlike memcmp, it cannot be used to put elements + * into a defined order as the return value when a != b is undefined, other + * than to be non-zero. + */ +int CRYPTO_memcmp(const volatile void *a, const volatile void *b, size_t len); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_CRYPTO_strings(void); + +/* Error codes for the CRYPTO functions. */ + +/* Function codes. */ +# define CRYPTO_F_CRYPTO_GET_EX_NEW_INDEX 100 +# define CRYPTO_F_CRYPTO_GET_NEW_DYNLOCKID 103 +# define CRYPTO_F_CRYPTO_GET_NEW_LOCKID 101 +# define CRYPTO_F_CRYPTO_SET_EX_DATA 102 +# define CRYPTO_F_DEF_ADD_INDEX 104 +# define CRYPTO_F_DEF_GET_CLASS 105 +# define CRYPTO_F_FIPS_MODE_SET 109 +# define CRYPTO_F_INT_DUP_EX_DATA 106 +# define CRYPTO_F_INT_FREE_EX_DATA 107 +# define CRYPTO_F_INT_NEW_EX_DATA 108 + +/* Reason codes. */ +# define CRYPTO_R_FIPS_MODE_NOT_SUPPORTED 101 +# define CRYPTO_R_NO_DYNLOCK_CREATE_CALLBACK 100 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/win/openssl/include/openssl/des.h b/hdssd/external/win/openssl/include/openssl/des.h new file mode 100644 index 0000000..1b40144 --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/des.h @@ -0,0 +1,257 @@ +/* crypto/des/des.h */ +/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_NEW_DES_H +# define HEADER_NEW_DES_H + +# include /* OPENSSL_EXTERN, OPENSSL_NO_DES, DES_LONG + * (via openssl/opensslconf.h */ + +# ifdef OPENSSL_NO_DES +# error DES is disabled. +# endif + +# ifdef OPENSSL_BUILD_SHLIBCRYPTO +# undef OPENSSL_EXTERN +# define OPENSSL_EXTERN OPENSSL_EXPORT +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef unsigned char DES_cblock[8]; +typedef /* const */ unsigned char const_DES_cblock[8]; +/* + * With "const", gcc 2.8.1 on Solaris thinks that DES_cblock * and + * const_DES_cblock * are incompatible pointer types. + */ + +typedef struct DES_ks { + union { + DES_cblock cblock; + /* + * make sure things are correct size on machines with 8 byte longs + */ + DES_LONG deslong[2]; + } ks[16]; +} DES_key_schedule; + +# ifndef OPENSSL_DISABLE_OLD_DES_SUPPORT +# ifndef OPENSSL_ENABLE_OLD_DES_SUPPORT +# define OPENSSL_ENABLE_OLD_DES_SUPPORT +# endif +# endif + +# ifdef OPENSSL_ENABLE_OLD_DES_SUPPORT +# include +# endif + +# define DES_KEY_SZ (sizeof(DES_cblock)) +# define DES_SCHEDULE_SZ (sizeof(DES_key_schedule)) + +# define DES_ENCRYPT 1 +# define DES_DECRYPT 0 + +# define DES_CBC_MODE 0 +# define DES_PCBC_MODE 1 + +# define DES_ecb2_encrypt(i,o,k1,k2,e) \ + DES_ecb3_encrypt((i),(o),(k1),(k2),(k1),(e)) + +# define DES_ede2_cbc_encrypt(i,o,l,k1,k2,iv,e) \ + DES_ede3_cbc_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(e)) + +# define DES_ede2_cfb64_encrypt(i,o,l,k1,k2,iv,n,e) \ + DES_ede3_cfb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n),(e)) + +# define DES_ede2_ofb64_encrypt(i,o,l,k1,k2,iv,n) \ + DES_ede3_ofb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n)) + +OPENSSL_DECLARE_GLOBAL(int, DES_check_key); /* defaults to false */ +# define DES_check_key OPENSSL_GLOBAL_REF(DES_check_key) +OPENSSL_DECLARE_GLOBAL(int, DES_rw_mode); /* defaults to DES_PCBC_MODE */ +# define DES_rw_mode OPENSSL_GLOBAL_REF(DES_rw_mode) + +const char *DES_options(void); +void DES_ecb3_encrypt(const_DES_cblock *input, DES_cblock *output, + DES_key_schedule *ks1, DES_key_schedule *ks2, + DES_key_schedule *ks3, int enc); +DES_LONG DES_cbc_cksum(const unsigned char *input, DES_cblock *output, + long length, DES_key_schedule *schedule, + const_DES_cblock *ivec); +/* DES_cbc_encrypt does not update the IV! Use DES_ncbc_encrypt instead. */ +void DES_cbc_encrypt(const unsigned char *input, unsigned char *output, + long length, DES_key_schedule *schedule, + DES_cblock *ivec, int enc); +void DES_ncbc_encrypt(const unsigned char *input, unsigned char *output, + long length, DES_key_schedule *schedule, + DES_cblock *ivec, int enc); +void DES_xcbc_encrypt(const unsigned char *input, unsigned char *output, + long length, DES_key_schedule *schedule, + DES_cblock *ivec, const_DES_cblock *inw, + const_DES_cblock *outw, int enc); +void DES_cfb_encrypt(const unsigned char *in, unsigned char *out, int numbits, + long length, DES_key_schedule *schedule, + DES_cblock *ivec, int enc); +void DES_ecb_encrypt(const_DES_cblock *input, DES_cblock *output, + DES_key_schedule *ks, int enc); + +/* + * This is the DES encryption function that gets called by just about every + * other DES routine in the library. You should not use this function except + * to implement 'modes' of DES. I say this because the functions that call + * this routine do the conversion from 'char *' to long, and this needs to be + * done to make sure 'non-aligned' memory access do not occur. The + * characters are loaded 'little endian'. Data is a pointer to 2 unsigned + * long's and ks is the DES_key_schedule to use. enc, is non zero specifies + * encryption, zero if decryption. + */ +void DES_encrypt1(DES_LONG *data, DES_key_schedule *ks, int enc); + +/* + * This functions is the same as DES_encrypt1() except that the DES initial + * permutation (IP) and final permutation (FP) have been left out. As for + * DES_encrypt1(), you should not use this function. It is used by the + * routines in the library that implement triple DES. IP() DES_encrypt2() + * DES_encrypt2() DES_encrypt2() FP() is the same as DES_encrypt1() + * DES_encrypt1() DES_encrypt1() except faster :-). + */ +void DES_encrypt2(DES_LONG *data, DES_key_schedule *ks, int enc); + +void DES_encrypt3(DES_LONG *data, DES_key_schedule *ks1, + DES_key_schedule *ks2, DES_key_schedule *ks3); +void DES_decrypt3(DES_LONG *data, DES_key_schedule *ks1, + DES_key_schedule *ks2, DES_key_schedule *ks3); +void DES_ede3_cbc_encrypt(const unsigned char *input, unsigned char *output, + long length, + DES_key_schedule *ks1, DES_key_schedule *ks2, + DES_key_schedule *ks3, DES_cblock *ivec, int enc); +void DES_ede3_cbcm_encrypt(const unsigned char *in, unsigned char *out, + long length, + DES_key_schedule *ks1, DES_key_schedule *ks2, + DES_key_schedule *ks3, + DES_cblock *ivec1, DES_cblock *ivec2, int enc); +void DES_ede3_cfb64_encrypt(const unsigned char *in, unsigned char *out, + long length, DES_key_schedule *ks1, + DES_key_schedule *ks2, DES_key_schedule *ks3, + DES_cblock *ivec, int *num, int enc); +void DES_ede3_cfb_encrypt(const unsigned char *in, unsigned char *out, + int numbits, long length, DES_key_schedule *ks1, + DES_key_schedule *ks2, DES_key_schedule *ks3, + DES_cblock *ivec, int enc); +void DES_ede3_ofb64_encrypt(const unsigned char *in, unsigned char *out, + long length, DES_key_schedule *ks1, + DES_key_schedule *ks2, DES_key_schedule *ks3, + DES_cblock *ivec, int *num); +# if 0 +void DES_xwhite_in2out(const_DES_cblock *DES_key, const_DES_cblock *in_white, + DES_cblock *out_white); +# endif + +int DES_enc_read(int fd, void *buf, int len, DES_key_schedule *sched, + DES_cblock *iv); +int DES_enc_write(int fd, const void *buf, int len, DES_key_schedule *sched, + DES_cblock *iv); +char *DES_fcrypt(const char *buf, const char *salt, char *ret); +char *DES_crypt(const char *buf, const char *salt); +void DES_ofb_encrypt(const unsigned char *in, unsigned char *out, int numbits, + long length, DES_key_schedule *schedule, + DES_cblock *ivec); +void DES_pcbc_encrypt(const unsigned char *input, unsigned char *output, + long length, DES_key_schedule *schedule, + DES_cblock *ivec, int enc); +DES_LONG DES_quad_cksum(const unsigned char *input, DES_cblock output[], + long length, int out_count, DES_cblock *seed); +int DES_random_key(DES_cblock *ret); +void DES_set_odd_parity(DES_cblock *key); +int DES_check_key_parity(const_DES_cblock *key); +int DES_is_weak_key(const_DES_cblock *key); +/* + * DES_set_key (= set_key = DES_key_sched = key_sched) calls + * DES_set_key_checked if global variable DES_check_key is set, + * DES_set_key_unchecked otherwise. + */ +int DES_set_key(const_DES_cblock *key, DES_key_schedule *schedule); +int DES_key_sched(const_DES_cblock *key, DES_key_schedule *schedule); +int DES_set_key_checked(const_DES_cblock *key, DES_key_schedule *schedule); +void DES_set_key_unchecked(const_DES_cblock *key, DES_key_schedule *schedule); +# ifdef OPENSSL_FIPS +void private_DES_set_key_unchecked(const_DES_cblock *key, + DES_key_schedule *schedule); +# endif +void DES_string_to_key(const char *str, DES_cblock *key); +void DES_string_to_2keys(const char *str, DES_cblock *key1, DES_cblock *key2); +void DES_cfb64_encrypt(const unsigned char *in, unsigned char *out, + long length, DES_key_schedule *schedule, + DES_cblock *ivec, int *num, int enc); +void DES_ofb64_encrypt(const unsigned char *in, unsigned char *out, + long length, DES_key_schedule *schedule, + DES_cblock *ivec, int *num); + +int DES_read_password(DES_cblock *key, const char *prompt, int verify); +int DES_read_2passwords(DES_cblock *key1, DES_cblock *key2, + const char *prompt, int verify); + +# define DES_fixup_key_parity DES_set_odd_parity + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/win/openssl/include/openssl/des_old.h b/hdssd/external/win/openssl/include/openssl/des_old.h new file mode 100644 index 0000000..ee7607a --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/des_old.h @@ -0,0 +1,497 @@ +/* crypto/des/des_old.h */ + +/*- + * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING + * + * The function names in here are deprecated and are only present to + * provide an interface compatible with openssl 0.9.6 and older as + * well as libdes. OpenSSL now provides functions where "des_" has + * been replaced with "DES_" in the names, to make it possible to + * make incompatible changes that are needed for C type security and + * other stuff. + * + * This include files has two compatibility modes: + * + * - If OPENSSL_DES_LIBDES_COMPATIBILITY is defined, you get an API + * that is compatible with libdes and SSLeay. + * - If OPENSSL_DES_LIBDES_COMPATIBILITY isn't defined, you get an + * API that is compatible with OpenSSL 0.9.5x to 0.9.6x. + * + * Note that these modes break earlier snapshots of OpenSSL, where + * libdes compatibility was the only available mode or (later on) the + * prefered compatibility mode. However, after much consideration + * (and more or less violent discussions with external parties), it + * was concluded that OpenSSL should be compatible with earlier versions + * of itself before anything else. Also, in all honesty, libdes is + * an old beast that shouldn't really be used any more. + * + * Please consider starting to use the DES_ functions rather than the + * des_ ones. The des_ functions will disappear completely before + * OpenSSL 1.0! + * + * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING + */ + +/* + * Written by Richard Levitte (richard@levitte.org) for the OpenSSL project + * 2001. + */ +/* ==================================================================== + * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_DES_H +# define HEADER_DES_H + +# include /* OPENSSL_EXTERN, OPENSSL_NO_DES, DES_LONG */ + +# ifdef OPENSSL_NO_DES +# error DES is disabled. +# endif + +# ifndef HEADER_NEW_DES_H +# error You must include des.h, not des_old.h directly. +# endif + +# ifdef _KERBEROS_DES_H +# error replaces . +# endif + +# include + +# ifdef OPENSSL_BUILD_SHLIBCRYPTO +# undef OPENSSL_EXTERN +# define OPENSSL_EXTERN OPENSSL_EXPORT +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +# ifdef _ +# undef _ +# endif + +typedef unsigned char _ossl_old_des_cblock[8]; +typedef struct _ossl_old_des_ks_struct { + union { + _ossl_old_des_cblock _; + /* + * make sure things are correct size on machines with 8 byte longs + */ + DES_LONG pad[2]; + } ks; +} _ossl_old_des_key_schedule[16]; + +# ifndef OPENSSL_DES_LIBDES_COMPATIBILITY +# define des_cblock DES_cblock +# define const_des_cblock const_DES_cblock +# define des_key_schedule DES_key_schedule +# define des_ecb3_encrypt(i,o,k1,k2,k3,e)\ + DES_ecb3_encrypt((i),(o),&(k1),&(k2),&(k3),(e)) +# define des_ede3_cbc_encrypt(i,o,l,k1,k2,k3,iv,e)\ + DES_ede3_cbc_encrypt((i),(o),(l),&(k1),&(k2),&(k3),(iv),(e)) +# define des_ede3_cbcm_encrypt(i,o,l,k1,k2,k3,iv1,iv2,e)\ + DES_ede3_cbcm_encrypt((i),(o),(l),&(k1),&(k2),&(k3),(iv1),(iv2),(e)) +# define des_ede3_cfb64_encrypt(i,o,l,k1,k2,k3,iv,n,e)\ + DES_ede3_cfb64_encrypt((i),(o),(l),&(k1),&(k2),&(k3),(iv),(n),(e)) +# define des_ede3_ofb64_encrypt(i,o,l,k1,k2,k3,iv,n)\ + DES_ede3_ofb64_encrypt((i),(o),(l),&(k1),&(k2),&(k3),(iv),(n)) +# define des_options()\ + DES_options() +# define des_cbc_cksum(i,o,l,k,iv)\ + DES_cbc_cksum((i),(o),(l),&(k),(iv)) +# define des_cbc_encrypt(i,o,l,k,iv,e)\ + DES_cbc_encrypt((i),(o),(l),&(k),(iv),(e)) +# define des_ncbc_encrypt(i,o,l,k,iv,e)\ + DES_ncbc_encrypt((i),(o),(l),&(k),(iv),(e)) +# define des_xcbc_encrypt(i,o,l,k,iv,inw,outw,e)\ + DES_xcbc_encrypt((i),(o),(l),&(k),(iv),(inw),(outw),(e)) +# define des_cfb_encrypt(i,o,n,l,k,iv,e)\ + DES_cfb_encrypt((i),(o),(n),(l),&(k),(iv),(e)) +# define des_ecb_encrypt(i,o,k,e)\ + DES_ecb_encrypt((i),(o),&(k),(e)) +# define des_encrypt1(d,k,e)\ + DES_encrypt1((d),&(k),(e)) +# define des_encrypt2(d,k,e)\ + DES_encrypt2((d),&(k),(e)) +# define des_encrypt3(d,k1,k2,k3)\ + DES_encrypt3((d),&(k1),&(k2),&(k3)) +# define des_decrypt3(d,k1,k2,k3)\ + DES_decrypt3((d),&(k1),&(k2),&(k3)) +# define des_xwhite_in2out(k,i,o)\ + DES_xwhite_in2out((k),(i),(o)) +# define des_enc_read(f,b,l,k,iv)\ + DES_enc_read((f),(b),(l),&(k),(iv)) +# define des_enc_write(f,b,l,k,iv)\ + DES_enc_write((f),(b),(l),&(k),(iv)) +# define des_fcrypt(b,s,r)\ + DES_fcrypt((b),(s),(r)) +# if 0 +# define des_crypt(b,s)\ + DES_crypt((b),(s)) +# if !defined(PERL5) && !defined(__FreeBSD__) && !defined(NeXT) && !defined(__OpenBSD__) +# define crypt(b,s)\ + DES_crypt((b),(s)) +# endif +# endif +# define des_ofb_encrypt(i,o,n,l,k,iv)\ + DES_ofb_encrypt((i),(o),(n),(l),&(k),(iv)) +# define des_pcbc_encrypt(i,o,l,k,iv,e)\ + DES_pcbc_encrypt((i),(o),(l),&(k),(iv),(e)) +# define des_quad_cksum(i,o,l,c,s)\ + DES_quad_cksum((i),(o),(l),(c),(s)) +# define des_random_seed(k)\ + _ossl_096_des_random_seed((k)) +# define des_random_key(r)\ + DES_random_key((r)) +# define des_read_password(k,p,v) \ + DES_read_password((k),(p),(v)) +# define des_read_2passwords(k1,k2,p,v) \ + DES_read_2passwords((k1),(k2),(p),(v)) +# define des_set_odd_parity(k)\ + DES_set_odd_parity((k)) +# define des_check_key_parity(k)\ + DES_check_key_parity((k)) +# define des_is_weak_key(k)\ + DES_is_weak_key((k)) +# define des_set_key(k,ks)\ + DES_set_key((k),&(ks)) +# define des_key_sched(k,ks)\ + DES_key_sched((k),&(ks)) +# define des_set_key_checked(k,ks)\ + DES_set_key_checked((k),&(ks)) +# define des_set_key_unchecked(k,ks)\ + DES_set_key_unchecked((k),&(ks)) +# define des_string_to_key(s,k)\ + DES_string_to_key((s),(k)) +# define des_string_to_2keys(s,k1,k2)\ + DES_string_to_2keys((s),(k1),(k2)) +# define des_cfb64_encrypt(i,o,l,ks,iv,n,e)\ + DES_cfb64_encrypt((i),(o),(l),&(ks),(iv),(n),(e)) +# define des_ofb64_encrypt(i,o,l,ks,iv,n)\ + DES_ofb64_encrypt((i),(o),(l),&(ks),(iv),(n)) + +# define des_ecb2_encrypt(i,o,k1,k2,e) \ + des_ecb3_encrypt((i),(o),(k1),(k2),(k1),(e)) + +# define des_ede2_cbc_encrypt(i,o,l,k1,k2,iv,e) \ + des_ede3_cbc_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(e)) + +# define des_ede2_cfb64_encrypt(i,o,l,k1,k2,iv,n,e) \ + des_ede3_cfb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n),(e)) + +# define des_ede2_ofb64_encrypt(i,o,l,k1,k2,iv,n) \ + des_ede3_ofb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n)) + +# define des_check_key DES_check_key +# define des_rw_mode DES_rw_mode +# else /* libdes compatibility */ +/* + * Map all symbol names to _ossl_old_des_* form, so we avoid all clashes with + * libdes + */ +# define des_cblock _ossl_old_des_cblock +# define des_key_schedule _ossl_old_des_key_schedule +# define des_ecb3_encrypt(i,o,k1,k2,k3,e)\ + _ossl_old_des_ecb3_encrypt((i),(o),(k1),(k2),(k3),(e)) +# define des_ede3_cbc_encrypt(i,o,l,k1,k2,k3,iv,e)\ + _ossl_old_des_ede3_cbc_encrypt((i),(o),(l),(k1),(k2),(k3),(iv),(e)) +# define des_ede3_cfb64_encrypt(i,o,l,k1,k2,k3,iv,n,e)\ + _ossl_old_des_ede3_cfb64_encrypt((i),(o),(l),(k1),(k2),(k3),(iv),(n),(e)) +# define des_ede3_ofb64_encrypt(i,o,l,k1,k2,k3,iv,n)\ + _ossl_old_des_ede3_ofb64_encrypt((i),(o),(l),(k1),(k2),(k3),(iv),(n)) +# define des_options()\ + _ossl_old_des_options() +# define des_cbc_cksum(i,o,l,k,iv)\ + _ossl_old_des_cbc_cksum((i),(o),(l),(k),(iv)) +# define des_cbc_encrypt(i,o,l,k,iv,e)\ + _ossl_old_des_cbc_encrypt((i),(o),(l),(k),(iv),(e)) +# define des_ncbc_encrypt(i,o,l,k,iv,e)\ + _ossl_old_des_ncbc_encrypt((i),(o),(l),(k),(iv),(e)) +# define des_xcbc_encrypt(i,o,l,k,iv,inw,outw,e)\ + _ossl_old_des_xcbc_encrypt((i),(o),(l),(k),(iv),(inw),(outw),(e)) +# define des_cfb_encrypt(i,o,n,l,k,iv,e)\ + _ossl_old_des_cfb_encrypt((i),(o),(n),(l),(k),(iv),(e)) +# define des_ecb_encrypt(i,o,k,e)\ + _ossl_old_des_ecb_encrypt((i),(o),(k),(e)) +# define des_encrypt(d,k,e)\ + _ossl_old_des_encrypt((d),(k),(e)) +# define des_encrypt2(d,k,e)\ + _ossl_old_des_encrypt2((d),(k),(e)) +# define des_encrypt3(d,k1,k2,k3)\ + _ossl_old_des_encrypt3((d),(k1),(k2),(k3)) +# define des_decrypt3(d,k1,k2,k3)\ + _ossl_old_des_decrypt3((d),(k1),(k2),(k3)) +# define des_xwhite_in2out(k,i,o)\ + _ossl_old_des_xwhite_in2out((k),(i),(o)) +# define des_enc_read(f,b,l,k,iv)\ + _ossl_old_des_enc_read((f),(b),(l),(k),(iv)) +# define des_enc_write(f,b,l,k,iv)\ + _ossl_old_des_enc_write((f),(b),(l),(k),(iv)) +# define des_fcrypt(b,s,r)\ + _ossl_old_des_fcrypt((b),(s),(r)) +# define des_crypt(b,s)\ + _ossl_old_des_crypt((b),(s)) +# if 0 +# define crypt(b,s)\ + _ossl_old_crypt((b),(s)) +# endif +# define des_ofb_encrypt(i,o,n,l,k,iv)\ + _ossl_old_des_ofb_encrypt((i),(o),(n),(l),(k),(iv)) +# define des_pcbc_encrypt(i,o,l,k,iv,e)\ + _ossl_old_des_pcbc_encrypt((i),(o),(l),(k),(iv),(e)) +# define des_quad_cksum(i,o,l,c,s)\ + _ossl_old_des_quad_cksum((i),(o),(l),(c),(s)) +# define des_random_seed(k)\ + _ossl_old_des_random_seed((k)) +# define des_random_key(r)\ + _ossl_old_des_random_key((r)) +# define des_read_password(k,p,v) \ + _ossl_old_des_read_password((k),(p),(v)) +# define des_read_2passwords(k1,k2,p,v) \ + _ossl_old_des_read_2passwords((k1),(k2),(p),(v)) +# define des_set_odd_parity(k)\ + _ossl_old_des_set_odd_parity((k)) +# define des_is_weak_key(k)\ + _ossl_old_des_is_weak_key((k)) +# define des_set_key(k,ks)\ + _ossl_old_des_set_key((k),(ks)) +# define des_key_sched(k,ks)\ + _ossl_old_des_key_sched((k),(ks)) +# define des_string_to_key(s,k)\ + _ossl_old_des_string_to_key((s),(k)) +# define des_string_to_2keys(s,k1,k2)\ + _ossl_old_des_string_to_2keys((s),(k1),(k2)) +# define des_cfb64_encrypt(i,o,l,ks,iv,n,e)\ + _ossl_old_des_cfb64_encrypt((i),(o),(l),(ks),(iv),(n),(e)) +# define des_ofb64_encrypt(i,o,l,ks,iv,n)\ + _ossl_old_des_ofb64_encrypt((i),(o),(l),(ks),(iv),(n)) + +# define des_ecb2_encrypt(i,o,k1,k2,e) \ + des_ecb3_encrypt((i),(o),(k1),(k2),(k1),(e)) + +# define des_ede2_cbc_encrypt(i,o,l,k1,k2,iv,e) \ + des_ede3_cbc_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(e)) + +# define des_ede2_cfb64_encrypt(i,o,l,k1,k2,iv,n,e) \ + des_ede3_cfb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n),(e)) + +# define des_ede2_ofb64_encrypt(i,o,l,k1,k2,iv,n) \ + des_ede3_ofb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n)) + +# define des_check_key DES_check_key +# define des_rw_mode DES_rw_mode +# endif + +const char *_ossl_old_des_options(void); +void _ossl_old_des_ecb3_encrypt(_ossl_old_des_cblock *input, + _ossl_old_des_cblock *output, + _ossl_old_des_key_schedule ks1, + _ossl_old_des_key_schedule ks2, + _ossl_old_des_key_schedule ks3, int enc); +DES_LONG _ossl_old_des_cbc_cksum(_ossl_old_des_cblock *input, + _ossl_old_des_cblock *output, long length, + _ossl_old_des_key_schedule schedule, + _ossl_old_des_cblock *ivec); +void _ossl_old_des_cbc_encrypt(_ossl_old_des_cblock *input, + _ossl_old_des_cblock *output, long length, + _ossl_old_des_key_schedule schedule, + _ossl_old_des_cblock *ivec, int enc); +void _ossl_old_des_ncbc_encrypt(_ossl_old_des_cblock *input, + _ossl_old_des_cblock *output, long length, + _ossl_old_des_key_schedule schedule, + _ossl_old_des_cblock *ivec, int enc); +void _ossl_old_des_xcbc_encrypt(_ossl_old_des_cblock *input, + _ossl_old_des_cblock *output, long length, + _ossl_old_des_key_schedule schedule, + _ossl_old_des_cblock *ivec, + _ossl_old_des_cblock *inw, + _ossl_old_des_cblock *outw, int enc); +void _ossl_old_des_cfb_encrypt(unsigned char *in, unsigned char *out, + int numbits, long length, + _ossl_old_des_key_schedule schedule, + _ossl_old_des_cblock *ivec, int enc); +void _ossl_old_des_ecb_encrypt(_ossl_old_des_cblock *input, + _ossl_old_des_cblock *output, + _ossl_old_des_key_schedule ks, int enc); +void _ossl_old_des_encrypt(DES_LONG *data, _ossl_old_des_key_schedule ks, + int enc); +void _ossl_old_des_encrypt2(DES_LONG *data, _ossl_old_des_key_schedule ks, + int enc); +void _ossl_old_des_encrypt3(DES_LONG *data, _ossl_old_des_key_schedule ks1, + _ossl_old_des_key_schedule ks2, + _ossl_old_des_key_schedule ks3); +void _ossl_old_des_decrypt3(DES_LONG *data, _ossl_old_des_key_schedule ks1, + _ossl_old_des_key_schedule ks2, + _ossl_old_des_key_schedule ks3); +void _ossl_old_des_ede3_cbc_encrypt(_ossl_old_des_cblock *input, + _ossl_old_des_cblock *output, long length, + _ossl_old_des_key_schedule ks1, + _ossl_old_des_key_schedule ks2, + _ossl_old_des_key_schedule ks3, + _ossl_old_des_cblock *ivec, int enc); +void _ossl_old_des_ede3_cfb64_encrypt(unsigned char *in, unsigned char *out, + long length, + _ossl_old_des_key_schedule ks1, + _ossl_old_des_key_schedule ks2, + _ossl_old_des_key_schedule ks3, + _ossl_old_des_cblock *ivec, int *num, + int enc); +void _ossl_old_des_ede3_ofb64_encrypt(unsigned char *in, unsigned char *out, + long length, + _ossl_old_des_key_schedule ks1, + _ossl_old_des_key_schedule ks2, + _ossl_old_des_key_schedule ks3, + _ossl_old_des_cblock *ivec, int *num); +# if 0 +void _ossl_old_des_xwhite_in2out(_ossl_old_des_cblock (*des_key), + _ossl_old_des_cblock (*in_white), + _ossl_old_des_cblock (*out_white)); +# endif + +int _ossl_old_des_enc_read(int fd, char *buf, int len, + _ossl_old_des_key_schedule sched, + _ossl_old_des_cblock *iv); +int _ossl_old_des_enc_write(int fd, char *buf, int len, + _ossl_old_des_key_schedule sched, + _ossl_old_des_cblock *iv); +char *_ossl_old_des_fcrypt(const char *buf, const char *salt, char *ret); +char *_ossl_old_des_crypt(const char *buf, const char *salt); +# if !defined(PERL5) && !defined(NeXT) +char *_ossl_old_crypt(const char *buf, const char *salt); +# endif +void _ossl_old_des_ofb_encrypt(unsigned char *in, unsigned char *out, + int numbits, long length, + _ossl_old_des_key_schedule schedule, + _ossl_old_des_cblock *ivec); +void _ossl_old_des_pcbc_encrypt(_ossl_old_des_cblock *input, + _ossl_old_des_cblock *output, long length, + _ossl_old_des_key_schedule schedule, + _ossl_old_des_cblock *ivec, int enc); +DES_LONG _ossl_old_des_quad_cksum(_ossl_old_des_cblock *input, + _ossl_old_des_cblock *output, long length, + int out_count, _ossl_old_des_cblock *seed); +void _ossl_old_des_random_seed(_ossl_old_des_cblock key); +void _ossl_old_des_random_key(_ossl_old_des_cblock ret); +int _ossl_old_des_read_password(_ossl_old_des_cblock *key, const char *prompt, + int verify); +int _ossl_old_des_read_2passwords(_ossl_old_des_cblock *key1, + _ossl_old_des_cblock *key2, + const char *prompt, int verify); +void _ossl_old_des_set_odd_parity(_ossl_old_des_cblock *key); +int _ossl_old_des_is_weak_key(_ossl_old_des_cblock *key); +int _ossl_old_des_set_key(_ossl_old_des_cblock *key, + _ossl_old_des_key_schedule schedule); +int _ossl_old_des_key_sched(_ossl_old_des_cblock *key, + _ossl_old_des_key_schedule schedule); +void _ossl_old_des_string_to_key(char *str, _ossl_old_des_cblock *key); +void _ossl_old_des_string_to_2keys(char *str, _ossl_old_des_cblock *key1, + _ossl_old_des_cblock *key2); +void _ossl_old_des_cfb64_encrypt(unsigned char *in, unsigned char *out, + long length, + _ossl_old_des_key_schedule schedule, + _ossl_old_des_cblock *ivec, int *num, + int enc); +void _ossl_old_des_ofb64_encrypt(unsigned char *in, unsigned char *out, + long length, + _ossl_old_des_key_schedule schedule, + _ossl_old_des_cblock *ivec, int *num); + +void _ossl_096_des_random_seed(des_cblock *key); + +/* + * The following definitions provide compatibility with the MIT Kerberos + * library. The _ossl_old_des_key_schedule structure is not binary + * compatible. + */ + +# define _KERBEROS_DES_H + +# define KRBDES_ENCRYPT DES_ENCRYPT +# define KRBDES_DECRYPT DES_DECRYPT + +# ifdef KERBEROS +# define ENCRYPT DES_ENCRYPT +# define DECRYPT DES_DECRYPT +# endif + +# ifndef NCOMPAT +# define C_Block des_cblock +# define Key_schedule des_key_schedule +# define KEY_SZ DES_KEY_SZ +# define string_to_key des_string_to_key +# define read_pw_string des_read_pw_string +# define random_key des_random_key +# define pcbc_encrypt des_pcbc_encrypt +# define set_key des_set_key +# define key_sched des_key_sched +# define ecb_encrypt des_ecb_encrypt +# define cbc_encrypt des_cbc_encrypt +# define ncbc_encrypt des_ncbc_encrypt +# define xcbc_encrypt des_xcbc_encrypt +# define cbc_cksum des_cbc_cksum +# define quad_cksum des_quad_cksum +# define check_parity des_check_key_parity +# endif + +# define des_fixup_key_parity DES_fixup_key_parity + +#ifdef __cplusplus +} +#endif + +/* for DES_read_pw_string et al */ +# include + +#endif diff --git a/hdssd/external/win/openssl/include/openssl/dh.h b/hdssd/external/win/openssl/include/openssl/dh.h new file mode 100644 index 0000000..a5bd901 --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/dh.h @@ -0,0 +1,393 @@ +/* crypto/dh/dh.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_DH_H +# define HEADER_DH_H + +# include + +# ifdef OPENSSL_NO_DH +# error DH is disabled. +# endif + +# ifndef OPENSSL_NO_BIO +# include +# endif +# include +# ifndef OPENSSL_NO_DEPRECATED +# include +# endif + +# ifndef OPENSSL_DH_MAX_MODULUS_BITS +# define OPENSSL_DH_MAX_MODULUS_BITS 10000 +# endif + +# define DH_FLAG_CACHE_MONT_P 0x01 + +/* + * new with 0.9.7h; the built-in DH + * implementation now uses constant time + * modular exponentiation for secret exponents + * by default. This flag causes the + * faster variable sliding window method to + * be used for all exponents. + */ +# define DH_FLAG_NO_EXP_CONSTTIME 0x02 + +/* + * If this flag is set the DH method is FIPS compliant and can be used in + * FIPS mode. This is set in the validated module method. If an application + * sets this flag in its own methods it is its reposibility to ensure the + * result is compliant. + */ + +# define DH_FLAG_FIPS_METHOD 0x0400 + +/* + * If this flag is set the operations normally disabled in FIPS mode are + * permitted it is then the applications responsibility to ensure that the + * usage is compliant. + */ + +# define DH_FLAG_NON_FIPS_ALLOW 0x0400 + +#ifdef __cplusplus +extern "C" { +#endif + +/* Already defined in ossl_typ.h */ +/* typedef struct dh_st DH; */ +/* typedef struct dh_method DH_METHOD; */ + +struct dh_method { + const char *name; + /* Methods here */ + int (*generate_key) (DH *dh); + int (*compute_key) (unsigned char *key, const BIGNUM *pub_key, DH *dh); + /* Can be null */ + int (*bn_mod_exp) (const DH *dh, BIGNUM *r, const BIGNUM *a, + const BIGNUM *p, const BIGNUM *m, BN_CTX *ctx, + BN_MONT_CTX *m_ctx); + int (*init) (DH *dh); + int (*finish) (DH *dh); + int flags; + char *app_data; + /* If this is non-NULL, it will be used to generate parameters */ + int (*generate_params) (DH *dh, int prime_len, int generator, + BN_GENCB *cb); +}; + +struct dh_st { + /* + * This first argument is used to pick up errors when a DH is passed + * instead of a EVP_PKEY + */ + int pad; + int version; + BIGNUM *p; + BIGNUM *g; + long length; /* optional */ + BIGNUM *pub_key; /* g^x % p */ + BIGNUM *priv_key; /* x */ + int flags; + BN_MONT_CTX *method_mont_p; + /* Place holders if we want to do X9.42 DH */ + BIGNUM *q; + BIGNUM *j; + unsigned char *seed; + int seedlen; + BIGNUM *counter; + int references; + CRYPTO_EX_DATA ex_data; + const DH_METHOD *meth; + ENGINE *engine; +}; + +# define DH_GENERATOR_2 2 +/* #define DH_GENERATOR_3 3 */ +# define DH_GENERATOR_5 5 + +/* DH_check error codes */ +# define DH_CHECK_P_NOT_PRIME 0x01 +# define DH_CHECK_P_NOT_SAFE_PRIME 0x02 +# define DH_UNABLE_TO_CHECK_GENERATOR 0x04 +# define DH_NOT_SUITABLE_GENERATOR 0x08 +# define DH_CHECK_Q_NOT_PRIME 0x10 +# define DH_CHECK_INVALID_Q_VALUE 0x20 +# define DH_CHECK_INVALID_J_VALUE 0x40 + +/* DH_check_pub_key error codes */ +# define DH_CHECK_PUBKEY_TOO_SMALL 0x01 +# define DH_CHECK_PUBKEY_TOO_LARGE 0x02 +# define DH_CHECK_PUBKEY_INVALID 0x04 + +/* + * primes p where (p-1)/2 is prime too are called "safe"; we define this for + * backward compatibility: + */ +# define DH_CHECK_P_NOT_STRONG_PRIME DH_CHECK_P_NOT_SAFE_PRIME + +# define d2i_DHparams_fp(fp,x) (DH *)ASN1_d2i_fp((char *(*)())DH_new, \ + (char *(*)())d2i_DHparams,(fp),(unsigned char **)(x)) +# define i2d_DHparams_fp(fp,x) ASN1_i2d_fp(i2d_DHparams,(fp), \ + (unsigned char *)(x)) +# define d2i_DHparams_bio(bp,x) ASN1_d2i_bio_of(DH,DH_new,d2i_DHparams,bp,x) +# define i2d_DHparams_bio(bp,x) ASN1_i2d_bio_of_const(DH,i2d_DHparams,bp,x) + +DH *DHparams_dup(DH *); + +const DH_METHOD *DH_OpenSSL(void); + +void DH_set_default_method(const DH_METHOD *meth); +const DH_METHOD *DH_get_default_method(void); +int DH_set_method(DH *dh, const DH_METHOD *meth); +DH *DH_new_method(ENGINE *engine); + +DH *DH_new(void); +void DH_free(DH *dh); +int DH_up_ref(DH *dh); +int DH_size(const DH *dh); +int DH_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); +int DH_set_ex_data(DH *d, int idx, void *arg); +void *DH_get_ex_data(DH *d, int idx); + +/* Deprecated version */ +# ifndef OPENSSL_NO_DEPRECATED +DH *DH_generate_parameters(int prime_len, int generator, + void (*callback) (int, int, void *), void *cb_arg); +# endif /* !defined(OPENSSL_NO_DEPRECATED) */ + +/* New version */ +int DH_generate_parameters_ex(DH *dh, int prime_len, int generator, + BN_GENCB *cb); + +int DH_check(const DH *dh, int *codes); +int DH_check_pub_key(const DH *dh, const BIGNUM *pub_key, int *codes); +int DH_generate_key(DH *dh); +int DH_compute_key(unsigned char *key, const BIGNUM *pub_key, DH *dh); +int DH_compute_key_padded(unsigned char *key, const BIGNUM *pub_key, DH *dh); +DH *d2i_DHparams(DH **a, const unsigned char **pp, long length); +int i2d_DHparams(const DH *a, unsigned char **pp); +DH *d2i_DHxparams(DH **a, const unsigned char **pp, long length); +int i2d_DHxparams(const DH *a, unsigned char **pp); +# ifndef OPENSSL_NO_FP_API +int DHparams_print_fp(FILE *fp, const DH *x); +# endif +# ifndef OPENSSL_NO_BIO +int DHparams_print(BIO *bp, const DH *x); +# else +int DHparams_print(char *bp, const DH *x); +# endif + +/* RFC 5114 parameters */ +DH *DH_get_1024_160(void); +DH *DH_get_2048_224(void); +DH *DH_get_2048_256(void); + +/* RFC2631 KDF */ +int DH_KDF_X9_42(unsigned char *out, size_t outlen, + const unsigned char *Z, size_t Zlen, + ASN1_OBJECT *key_oid, + const unsigned char *ukm, size_t ukmlen, const EVP_MD *md); + +# define EVP_PKEY_CTX_set_dh_paramgen_prime_len(ctx, len) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DH, EVP_PKEY_OP_PARAMGEN, \ + EVP_PKEY_CTRL_DH_PARAMGEN_PRIME_LEN, len, NULL) + +# define EVP_PKEY_CTX_set_dh_paramgen_subprime_len(ctx, len) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DH, EVP_PKEY_OP_PARAMGEN, \ + EVP_PKEY_CTRL_DH_PARAMGEN_SUBPRIME_LEN, len, NULL) + +# define EVP_PKEY_CTX_set_dh_paramgen_type(ctx, typ) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DH, EVP_PKEY_OP_PARAMGEN, \ + EVP_PKEY_CTRL_DH_PARAMGEN_TYPE, typ, NULL) + +# define EVP_PKEY_CTX_set_dh_paramgen_generator(ctx, gen) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DH, EVP_PKEY_OP_PARAMGEN, \ + EVP_PKEY_CTRL_DH_PARAMGEN_GENERATOR, gen, NULL) + +# define EVP_PKEY_CTX_set_dh_rfc5114(ctx, gen) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, EVP_PKEY_OP_PARAMGEN, \ + EVP_PKEY_CTRL_DH_RFC5114, gen, NULL) + +# define EVP_PKEY_CTX_set_dhx_rfc5114(ctx, gen) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, EVP_PKEY_OP_PARAMGEN, \ + EVP_PKEY_CTRL_DH_RFC5114, gen, NULL) + +# define EVP_PKEY_CTX_set_dh_kdf_type(ctx, kdf) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_DH_KDF_TYPE, kdf, NULL) + +# define EVP_PKEY_CTX_get_dh_kdf_type(ctx) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_DH_KDF_TYPE, -2, NULL) + +# define EVP_PKEY_CTX_set0_dh_kdf_oid(ctx, oid) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_DH_KDF_OID, 0, (void *)oid) + +# define EVP_PKEY_CTX_get0_dh_kdf_oid(ctx, poid) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_GET_DH_KDF_OID, 0, (void *)poid) + +# define EVP_PKEY_CTX_set_dh_kdf_md(ctx, md) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_DH_KDF_MD, 0, (void *)md) + +# define EVP_PKEY_CTX_get_dh_kdf_md(ctx, pmd) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_GET_DH_KDF_MD, 0, (void *)pmd) + +# define EVP_PKEY_CTX_set_dh_kdf_outlen(ctx, len) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_DH_KDF_OUTLEN, len, NULL) + +# define EVP_PKEY_CTX_get_dh_kdf_outlen(ctx, plen) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_GET_DH_KDF_OUTLEN, 0, (void *)plen) + +# define EVP_PKEY_CTX_set0_dh_kdf_ukm(ctx, p, plen) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_DH_KDF_UKM, plen, (void *)p) + +# define EVP_PKEY_CTX_get0_dh_kdf_ukm(ctx, p) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_GET_DH_KDF_UKM, 0, (void *)p) + +# define EVP_PKEY_CTRL_DH_PARAMGEN_PRIME_LEN (EVP_PKEY_ALG_CTRL + 1) +# define EVP_PKEY_CTRL_DH_PARAMGEN_GENERATOR (EVP_PKEY_ALG_CTRL + 2) +# define EVP_PKEY_CTRL_DH_RFC5114 (EVP_PKEY_ALG_CTRL + 3) +# define EVP_PKEY_CTRL_DH_PARAMGEN_SUBPRIME_LEN (EVP_PKEY_ALG_CTRL + 4) +# define EVP_PKEY_CTRL_DH_PARAMGEN_TYPE (EVP_PKEY_ALG_CTRL + 5) +# define EVP_PKEY_CTRL_DH_KDF_TYPE (EVP_PKEY_ALG_CTRL + 6) +# define EVP_PKEY_CTRL_DH_KDF_MD (EVP_PKEY_ALG_CTRL + 7) +# define EVP_PKEY_CTRL_GET_DH_KDF_MD (EVP_PKEY_ALG_CTRL + 8) +# define EVP_PKEY_CTRL_DH_KDF_OUTLEN (EVP_PKEY_ALG_CTRL + 9) +# define EVP_PKEY_CTRL_GET_DH_KDF_OUTLEN (EVP_PKEY_ALG_CTRL + 10) +# define EVP_PKEY_CTRL_DH_KDF_UKM (EVP_PKEY_ALG_CTRL + 11) +# define EVP_PKEY_CTRL_GET_DH_KDF_UKM (EVP_PKEY_ALG_CTRL + 12) +# define EVP_PKEY_CTRL_DH_KDF_OID (EVP_PKEY_ALG_CTRL + 13) +# define EVP_PKEY_CTRL_GET_DH_KDF_OID (EVP_PKEY_ALG_CTRL + 14) + +/* KDF types */ +# define EVP_PKEY_DH_KDF_NONE 1 +# define EVP_PKEY_DH_KDF_X9_42 2 + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_DH_strings(void); + +/* Error codes for the DH functions. */ + +/* Function codes. */ +# define DH_F_COMPUTE_KEY 102 +# define DH_F_DHPARAMS_PRINT_FP 101 +# define DH_F_DH_BUILTIN_GENPARAMS 106 +# define DH_F_DH_CMS_DECRYPT 117 +# define DH_F_DH_CMS_SET_PEERKEY 118 +# define DH_F_DH_CMS_SET_SHARED_INFO 119 +# define DH_F_DH_COMPUTE_KEY 114 +# define DH_F_DH_GENERATE_KEY 115 +# define DH_F_DH_GENERATE_PARAMETERS_EX 116 +# define DH_F_DH_NEW_METHOD 105 +# define DH_F_DH_PARAM_DECODE 107 +# define DH_F_DH_PRIV_DECODE 110 +# define DH_F_DH_PRIV_ENCODE 111 +# define DH_F_DH_PUB_DECODE 108 +# define DH_F_DH_PUB_ENCODE 109 +# define DH_F_DO_DH_PRINT 100 +# define DH_F_GENERATE_KEY 103 +# define DH_F_GENERATE_PARAMETERS 104 +# define DH_F_PKEY_DH_DERIVE 112 +# define DH_F_PKEY_DH_KEYGEN 113 + +/* Reason codes. */ +# define DH_R_BAD_GENERATOR 101 +# define DH_R_BN_DECODE_ERROR 109 +# define DH_R_BN_ERROR 106 +# define DH_R_DECODE_ERROR 104 +# define DH_R_INVALID_PUBKEY 102 +# define DH_R_KDF_PARAMETER_ERROR 112 +# define DH_R_KEYS_NOT_SET 108 +# define DH_R_KEY_SIZE_TOO_SMALL 110 +# define DH_R_MODULUS_TOO_LARGE 103 +# define DH_R_NON_FIPS_METHOD 111 +# define DH_R_NO_PARAMETERS_SET 107 +# define DH_R_NO_PRIVATE_VALUE 100 +# define DH_R_PARAMETER_ENCODING_ERROR 105 +# define DH_R_PEER_KEY_ERROR 113 +# define DH_R_SHARED_INFO_ERROR 114 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/win/openssl/include/openssl/dsa.h b/hdssd/external/win/openssl/include/openssl/dsa.h new file mode 100644 index 0000000..545358f --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/dsa.h @@ -0,0 +1,332 @@ +/* crypto/dsa/dsa.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +/* + * The DSS routines are based on patches supplied by + * Steven Schoch . He basically did the + * work and I have just tweaked them a little to fit into my + * stylistic vision for SSLeay :-) */ + +#ifndef HEADER_DSA_H +# define HEADER_DSA_H + +# include + +# ifdef OPENSSL_NO_DSA +# error DSA is disabled. +# endif + +# ifndef OPENSSL_NO_BIO +# include +# endif +# include +# include + +# ifndef OPENSSL_NO_DEPRECATED +# include +# ifndef OPENSSL_NO_DH +# include +# endif +# endif + +# ifndef OPENSSL_DSA_MAX_MODULUS_BITS +# define OPENSSL_DSA_MAX_MODULUS_BITS 10000 +# endif + +# define DSA_FLAG_CACHE_MONT_P 0x01 +/* + * new with 0.9.7h; the built-in DSA implementation now uses constant time + * modular exponentiation for secret exponents by default. This flag causes + * the faster variable sliding window method to be used for all exponents. + */ +# define DSA_FLAG_NO_EXP_CONSTTIME 0x02 + +/* + * If this flag is set the DSA method is FIPS compliant and can be used in + * FIPS mode. This is set in the validated module method. If an application + * sets this flag in its own methods it is its reposibility to ensure the + * result is compliant. + */ + +# define DSA_FLAG_FIPS_METHOD 0x0400 + +/* + * If this flag is set the operations normally disabled in FIPS mode are + * permitted it is then the applications responsibility to ensure that the + * usage is compliant. + */ + +# define DSA_FLAG_NON_FIPS_ALLOW 0x0400 + +#ifdef __cplusplus +extern "C" { +#endif + +/* Already defined in ossl_typ.h */ +/* typedef struct dsa_st DSA; */ +/* typedef struct dsa_method DSA_METHOD; */ + +typedef struct DSA_SIG_st { + BIGNUM *r; + BIGNUM *s; +} DSA_SIG; + +struct dsa_method { + const char *name; + DSA_SIG *(*dsa_do_sign) (const unsigned char *dgst, int dlen, DSA *dsa); + int (*dsa_sign_setup) (DSA *dsa, BN_CTX *ctx_in, BIGNUM **kinvp, + BIGNUM **rp); + int (*dsa_do_verify) (const unsigned char *dgst, int dgst_len, + DSA_SIG *sig, DSA *dsa); + int (*dsa_mod_exp) (DSA *dsa, BIGNUM *rr, BIGNUM *a1, BIGNUM *p1, + BIGNUM *a2, BIGNUM *p2, BIGNUM *m, BN_CTX *ctx, + BN_MONT_CTX *in_mont); + /* Can be null */ + int (*bn_mod_exp) (DSA *dsa, BIGNUM *r, BIGNUM *a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx); + int (*init) (DSA *dsa); + int (*finish) (DSA *dsa); + int flags; + char *app_data; + /* If this is non-NULL, it is used to generate DSA parameters */ + int (*dsa_paramgen) (DSA *dsa, int bits, + const unsigned char *seed, int seed_len, + int *counter_ret, unsigned long *h_ret, + BN_GENCB *cb); + /* If this is non-NULL, it is used to generate DSA keys */ + int (*dsa_keygen) (DSA *dsa); +}; + +struct dsa_st { + /* + * This first variable is used to pick up errors where a DSA is passed + * instead of of a EVP_PKEY + */ + int pad; + long version; + int write_params; + BIGNUM *p; + BIGNUM *q; /* == 20 */ + BIGNUM *g; + BIGNUM *pub_key; /* y public key */ + BIGNUM *priv_key; /* x private key */ + BIGNUM *kinv; /* Signing pre-calc */ + BIGNUM *r; /* Signing pre-calc */ + int flags; + /* Normally used to cache montgomery values */ + BN_MONT_CTX *method_mont_p; + int references; + CRYPTO_EX_DATA ex_data; + const DSA_METHOD *meth; + /* functional reference if 'meth' is ENGINE-provided */ + ENGINE *engine; +}; + +# define d2i_DSAparams_fp(fp,x) (DSA *)ASN1_d2i_fp((char *(*)())DSA_new, \ + (char *(*)())d2i_DSAparams,(fp),(unsigned char **)(x)) +# define i2d_DSAparams_fp(fp,x) ASN1_i2d_fp(i2d_DSAparams,(fp), \ + (unsigned char *)(x)) +# define d2i_DSAparams_bio(bp,x) ASN1_d2i_bio_of(DSA,DSA_new,d2i_DSAparams,bp,x) +# define i2d_DSAparams_bio(bp,x) ASN1_i2d_bio_of_const(DSA,i2d_DSAparams,bp,x) + +DSA *DSAparams_dup(DSA *x); +DSA_SIG *DSA_SIG_new(void); +void DSA_SIG_free(DSA_SIG *a); +int i2d_DSA_SIG(const DSA_SIG *a, unsigned char **pp); +DSA_SIG *d2i_DSA_SIG(DSA_SIG **v, const unsigned char **pp, long length); + +DSA_SIG *DSA_do_sign(const unsigned char *dgst, int dlen, DSA *dsa); +int DSA_do_verify(const unsigned char *dgst, int dgst_len, + DSA_SIG *sig, DSA *dsa); + +const DSA_METHOD *DSA_OpenSSL(void); + +void DSA_set_default_method(const DSA_METHOD *); +const DSA_METHOD *DSA_get_default_method(void); +int DSA_set_method(DSA *dsa, const DSA_METHOD *); + +DSA *DSA_new(void); +DSA *DSA_new_method(ENGINE *engine); +void DSA_free(DSA *r); +/* "up" the DSA object's reference count */ +int DSA_up_ref(DSA *r); +int DSA_size(const DSA *); + /* next 4 return -1 on error */ +int DSA_sign_setup(DSA *dsa, BN_CTX *ctx_in, BIGNUM **kinvp, BIGNUM **rp); +int DSA_sign(int type, const unsigned char *dgst, int dlen, + unsigned char *sig, unsigned int *siglen, DSA *dsa); +int DSA_verify(int type, const unsigned char *dgst, int dgst_len, + const unsigned char *sigbuf, int siglen, DSA *dsa); +int DSA_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); +int DSA_set_ex_data(DSA *d, int idx, void *arg); +void *DSA_get_ex_data(DSA *d, int idx); + +DSA *d2i_DSAPublicKey(DSA **a, const unsigned char **pp, long length); +DSA *d2i_DSAPrivateKey(DSA **a, const unsigned char **pp, long length); +DSA *d2i_DSAparams(DSA **a, const unsigned char **pp, long length); + +/* Deprecated version */ +# ifndef OPENSSL_NO_DEPRECATED +DSA *DSA_generate_parameters(int bits, + unsigned char *seed, int seed_len, + int *counter_ret, unsigned long *h_ret, void + (*callback) (int, int, void *), void *cb_arg); +# endif /* !defined(OPENSSL_NO_DEPRECATED) */ + +/* New version */ +int DSA_generate_parameters_ex(DSA *dsa, int bits, + const unsigned char *seed, int seed_len, + int *counter_ret, unsigned long *h_ret, + BN_GENCB *cb); + +int DSA_generate_key(DSA *a); +int i2d_DSAPublicKey(const DSA *a, unsigned char **pp); +int i2d_DSAPrivateKey(const DSA *a, unsigned char **pp); +int i2d_DSAparams(const DSA *a, unsigned char **pp); + +# ifndef OPENSSL_NO_BIO +int DSAparams_print(BIO *bp, const DSA *x); +int DSA_print(BIO *bp, const DSA *x, int off); +# endif +# ifndef OPENSSL_NO_FP_API +int DSAparams_print_fp(FILE *fp, const DSA *x); +int DSA_print_fp(FILE *bp, const DSA *x, int off); +# endif + +# define DSS_prime_checks 50 +/* + * Primality test according to FIPS PUB 186[-1], Appendix 2.1: 50 rounds of + * Rabin-Miller + */ +# define DSA_is_prime(n, callback, cb_arg) \ + BN_is_prime(n, DSS_prime_checks, callback, NULL, cb_arg) + +# ifndef OPENSSL_NO_DH +/* + * Convert DSA structure (key or just parameters) into DH structure (be + * careful to avoid small subgroup attacks when using this!) + */ +DH *DSA_dup_DH(const DSA *r); +# endif + +# define EVP_PKEY_CTX_set_dsa_paramgen_bits(ctx, nbits) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DSA, EVP_PKEY_OP_PARAMGEN, \ + EVP_PKEY_CTRL_DSA_PARAMGEN_BITS, nbits, NULL) + +# define EVP_PKEY_CTRL_DSA_PARAMGEN_BITS (EVP_PKEY_ALG_CTRL + 1) +# define EVP_PKEY_CTRL_DSA_PARAMGEN_Q_BITS (EVP_PKEY_ALG_CTRL + 2) +# define EVP_PKEY_CTRL_DSA_PARAMGEN_MD (EVP_PKEY_ALG_CTRL + 3) + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_DSA_strings(void); + +/* Error codes for the DSA functions. */ + +/* Function codes. */ +# define DSA_F_D2I_DSA_SIG 110 +# define DSA_F_DO_DSA_PRINT 104 +# define DSA_F_DSAPARAMS_PRINT 100 +# define DSA_F_DSAPARAMS_PRINT_FP 101 +# define DSA_F_DSA_BUILTIN_PARAMGEN2 126 +# define DSA_F_DSA_DO_SIGN 112 +# define DSA_F_DSA_DO_VERIFY 113 +# define DSA_F_DSA_GENERATE_KEY 124 +# define DSA_F_DSA_GENERATE_PARAMETERS_EX 123 +# define DSA_F_DSA_NEW_METHOD 103 +# define DSA_F_DSA_PARAM_DECODE 119 +# define DSA_F_DSA_PRINT_FP 105 +# define DSA_F_DSA_PRIV_DECODE 115 +# define DSA_F_DSA_PRIV_ENCODE 116 +# define DSA_F_DSA_PUB_DECODE 117 +# define DSA_F_DSA_PUB_ENCODE 118 +# define DSA_F_DSA_SIGN 106 +# define DSA_F_DSA_SIGN_SETUP 107 +# define DSA_F_DSA_SIG_NEW 109 +# define DSA_F_DSA_SIG_PRINT 125 +# define DSA_F_DSA_VERIFY 108 +# define DSA_F_I2D_DSA_SIG 111 +# define DSA_F_OLD_DSA_PRIV_DECODE 122 +# define DSA_F_PKEY_DSA_CTRL 120 +# define DSA_F_PKEY_DSA_KEYGEN 121 +# define DSA_F_SIG_CB 114 + +/* Reason codes. */ +# define DSA_R_BAD_Q_VALUE 102 +# define DSA_R_BN_DECODE_ERROR 108 +# define DSA_R_BN_ERROR 109 +# define DSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE 100 +# define DSA_R_DECODE_ERROR 104 +# define DSA_R_INVALID_DIGEST_TYPE 106 +# define DSA_R_INVALID_PARAMETERS 112 +# define DSA_R_MISSING_PARAMETERS 101 +# define DSA_R_MODULUS_TOO_LARGE 103 +# define DSA_R_NEED_NEW_SETUP_VALUES 110 +# define DSA_R_NON_FIPS_DSA_METHOD 111 +# define DSA_R_NO_PARAMETERS_SET 107 +# define DSA_R_PARAMETER_ENCODING_ERROR 105 +# define DSA_R_Q_NOT_PRIME 113 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/win/openssl/include/openssl/dso.h b/hdssd/external/win/openssl/include/openssl/dso.h new file mode 100644 index 0000000..c9013f5 --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/dso.h @@ -0,0 +1,451 @@ +/* dso.h */ +/* + * Written by Geoff Thorpe (geoff@geoffthorpe.net) for the OpenSSL project + * 2000. + */ +/* ==================================================================== + * Copyright (c) 2000 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_DSO_H +# define HEADER_DSO_H + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* These values are used as commands to DSO_ctrl() */ +# define DSO_CTRL_GET_FLAGS 1 +# define DSO_CTRL_SET_FLAGS 2 +# define DSO_CTRL_OR_FLAGS 3 + +/* + * By default, DSO_load() will translate the provided filename into a form + * typical for the platform (more specifically the DSO_METHOD) using the + * dso_name_converter function of the method. Eg. win32 will transform "blah" + * into "blah.dll", and dlfcn will transform it into "libblah.so". The + * behaviour can be overriden by setting the name_converter callback in the + * DSO object (using DSO_set_name_converter()). This callback could even + * utilise the DSO_METHOD's converter too if it only wants to override + * behaviour for one or two possible DSO methods. However, the following flag + * can be set in a DSO to prevent *any* native name-translation at all - eg. + * if the caller has prompted the user for a path to a driver library so the + * filename should be interpreted as-is. + */ +# define DSO_FLAG_NO_NAME_TRANSLATION 0x01 +/* + * An extra flag to give if only the extension should be added as + * translation. This is obviously only of importance on Unix and other + * operating systems where the translation also may prefix the name with + * something, like 'lib', and ignored everywhere else. This flag is also + * ignored if DSO_FLAG_NO_NAME_TRANSLATION is used at the same time. + */ +# define DSO_FLAG_NAME_TRANSLATION_EXT_ONLY 0x02 + +/* + * The following flag controls the translation of symbol names to upper case. + * This is currently only being implemented for OpenVMS. + */ +# define DSO_FLAG_UPCASE_SYMBOL 0x10 + +/* + * This flag loads the library with public symbols. Meaning: The exported + * symbols of this library are public to all libraries loaded after this + * library. At the moment only implemented in unix. + */ +# define DSO_FLAG_GLOBAL_SYMBOLS 0x20 + +typedef void (*DSO_FUNC_TYPE) (void); + +typedef struct dso_st DSO; + +/* + * The function prototype used for method functions (or caller-provided + * callbacks) that transform filenames. They are passed a DSO structure + * pointer (or NULL if they are to be used independantly of a DSO object) and + * a filename to transform. They should either return NULL (if there is an + * error condition) or a newly allocated string containing the transformed + * form that the caller will need to free with OPENSSL_free() when done. + */ +typedef char *(*DSO_NAME_CONVERTER_FUNC)(DSO *, const char *); +/* + * The function prototype used for method functions (or caller-provided + * callbacks) that merge two file specifications. They are passed a DSO + * structure pointer (or NULL if they are to be used independantly of a DSO + * object) and two file specifications to merge. They should either return + * NULL (if there is an error condition) or a newly allocated string + * containing the result of merging that the caller will need to free with + * OPENSSL_free() when done. Here, merging means that bits and pieces are + * taken from each of the file specifications and added together in whatever + * fashion that is sensible for the DSO method in question. The only rule + * that really applies is that if the two specification contain pieces of the + * same type, the copy from the first string takes priority. One could see + * it as the first specification is the one given by the user and the second + * being a bunch of defaults to add on if they're missing in the first. + */ +typedef char *(*DSO_MERGER_FUNC)(DSO *, const char *, const char *); + +typedef struct dso_meth_st { + const char *name; + /* + * Loads a shared library, NB: new DSO_METHODs must ensure that a + * successful load populates the loaded_filename field, and likewise a + * successful unload OPENSSL_frees and NULLs it out. + */ + int (*dso_load) (DSO *dso); + /* Unloads a shared library */ + int (*dso_unload) (DSO *dso); + /* Binds a variable */ + void *(*dso_bind_var) (DSO *dso, const char *symname); + /* + * Binds a function - assumes a return type of DSO_FUNC_TYPE. This should + * be cast to the real function prototype by the caller. Platforms that + * don't have compatible representations for different prototypes (this + * is possible within ANSI C) are highly unlikely to have shared + * libraries at all, let alone a DSO_METHOD implemented for them. + */ + DSO_FUNC_TYPE (*dso_bind_func) (DSO *dso, const char *symname); +/* I don't think this would actually be used in any circumstances. */ +# if 0 + /* Unbinds a variable */ + int (*dso_unbind_var) (DSO *dso, char *symname, void *symptr); + /* Unbinds a function */ + int (*dso_unbind_func) (DSO *dso, char *symname, DSO_FUNC_TYPE symptr); +# endif + /* + * The generic (yuck) "ctrl()" function. NB: Negative return values + * (rather than zero) indicate errors. + */ + long (*dso_ctrl) (DSO *dso, int cmd, long larg, void *parg); + /* + * The default DSO_METHOD-specific function for converting filenames to a + * canonical native form. + */ + DSO_NAME_CONVERTER_FUNC dso_name_converter; + /* + * The default DSO_METHOD-specific function for converting filenames to a + * canonical native form. + */ + DSO_MERGER_FUNC dso_merger; + /* [De]Initialisation handlers. */ + int (*init) (DSO *dso); + int (*finish) (DSO *dso); + /* Return pathname of the module containing location */ + int (*pathbyaddr) (void *addr, char *path, int sz); + /* Perform global symbol lookup, i.e. among *all* modules */ + void *(*globallookup) (const char *symname); +} DSO_METHOD; + +/**********************************************************************/ +/* The low-level handle type used to refer to a loaded shared library */ + +struct dso_st { + DSO_METHOD *meth; + /* + * Standard dlopen uses a (void *). Win32 uses a HANDLE. VMS doesn't use + * anything but will need to cache the filename for use in the dso_bind + * handler. All in all, let each method control its own destiny. + * "Handles" and such go in a STACK. + */ + STACK_OF(void) *meth_data; + int references; + int flags; + /* + * For use by applications etc ... use this for your bits'n'pieces, don't + * touch meth_data! + */ + CRYPTO_EX_DATA ex_data; + /* + * If this callback function pointer is set to non-NULL, then it will be + * used in DSO_load() in place of meth->dso_name_converter. NB: This + * should normally set using DSO_set_name_converter(). + */ + DSO_NAME_CONVERTER_FUNC name_converter; + /* + * If this callback function pointer is set to non-NULL, then it will be + * used in DSO_load() in place of meth->dso_merger. NB: This should + * normally set using DSO_set_merger(). + */ + DSO_MERGER_FUNC merger; + /* + * This is populated with (a copy of) the platform-independant filename + * used for this DSO. + */ + char *filename; + /* + * This is populated with (a copy of) the translated filename by which + * the DSO was actually loaded. It is NULL iff the DSO is not currently + * loaded. NB: This is here because the filename translation process may + * involve a callback being invoked more than once not only to convert to + * a platform-specific form, but also to try different filenames in the + * process of trying to perform a load. As such, this variable can be + * used to indicate (a) whether this DSO structure corresponds to a + * loaded library or not, and (b) the filename with which it was actually + * loaded. + */ + char *loaded_filename; +}; + +DSO *DSO_new(void); +DSO *DSO_new_method(DSO_METHOD *method); +int DSO_free(DSO *dso); +int DSO_flags(DSO *dso); +int DSO_up_ref(DSO *dso); +long DSO_ctrl(DSO *dso, int cmd, long larg, void *parg); + +/* + * This function sets the DSO's name_converter callback. If it is non-NULL, + * then it will be used instead of the associated DSO_METHOD's function. If + * oldcb is non-NULL then it is set to the function pointer value being + * replaced. Return value is non-zero for success. + */ +int DSO_set_name_converter(DSO *dso, DSO_NAME_CONVERTER_FUNC cb, + DSO_NAME_CONVERTER_FUNC *oldcb); +/* + * These functions can be used to get/set the platform-independant filename + * used for a DSO. NB: set will fail if the DSO is already loaded. + */ +const char *DSO_get_filename(DSO *dso); +int DSO_set_filename(DSO *dso, const char *filename); +/* + * This function will invoke the DSO's name_converter callback to translate a + * filename, or if the callback isn't set it will instead use the DSO_METHOD's + * converter. If "filename" is NULL, the "filename" in the DSO itself will be + * used. If the DSO_FLAG_NO_NAME_TRANSLATION flag is set, then the filename is + * simply duplicated. NB: This function is usually called from within a + * DSO_METHOD during the processing of a DSO_load() call, and is exposed so + * that caller-created DSO_METHODs can do the same thing. A non-NULL return + * value will need to be OPENSSL_free()'d. + */ +char *DSO_convert_filename(DSO *dso, const char *filename); +/* + * This function will invoke the DSO's merger callback to merge two file + * specifications, or if the callback isn't set it will instead use the + * DSO_METHOD's merger. A non-NULL return value will need to be + * OPENSSL_free()'d. + */ +char *DSO_merge(DSO *dso, const char *filespec1, const char *filespec2); +/* + * If the DSO is currently loaded, this returns the filename that it was + * loaded under, otherwise it returns NULL. So it is also useful as a test as + * to whether the DSO is currently loaded. NB: This will not necessarily + * return the same value as DSO_convert_filename(dso, dso->filename), because + * the DSO_METHOD's load function may have tried a variety of filenames (with + * and/or without the aid of the converters) before settling on the one it + * actually loaded. + */ +const char *DSO_get_loaded_filename(DSO *dso); + +void DSO_set_default_method(DSO_METHOD *meth); +DSO_METHOD *DSO_get_default_method(void); +DSO_METHOD *DSO_get_method(DSO *dso); +DSO_METHOD *DSO_set_method(DSO *dso, DSO_METHOD *meth); + +/* + * The all-singing all-dancing load function, you normally pass NULL for the + * first and third parameters. Use DSO_up and DSO_free for subsequent + * reference count handling. Any flags passed in will be set in the + * constructed DSO after its init() function but before the load operation. + * If 'dso' is non-NULL, 'flags' is ignored. + */ +DSO *DSO_load(DSO *dso, const char *filename, DSO_METHOD *meth, int flags); + +/* This function binds to a variable inside a shared library. */ +void *DSO_bind_var(DSO *dso, const char *symname); + +/* This function binds to a function inside a shared library. */ +DSO_FUNC_TYPE DSO_bind_func(DSO *dso, const char *symname); + +/* + * This method is the default, but will beg, borrow, or steal whatever method + * should be the default on any particular platform (including + * DSO_METH_null() if necessary). + */ +DSO_METHOD *DSO_METHOD_openssl(void); + +/* + * This method is defined for all platforms - if a platform has no DSO + * support then this will be the only method! + */ +DSO_METHOD *DSO_METHOD_null(void); + +/* + * If DSO_DLFCN is defined, the standard dlfcn.h-style functions (dlopen, + * dlclose, dlsym, etc) will be used and incorporated into this method. If + * not, this method will return NULL. + */ +DSO_METHOD *DSO_METHOD_dlfcn(void); + +/* + * If DSO_DL is defined, the standard dl.h-style functions (shl_load, + * shl_unload, shl_findsym, etc) will be used and incorporated into this + * method. If not, this method will return NULL. + */ +DSO_METHOD *DSO_METHOD_dl(void); + +/* If WIN32 is defined, use DLLs. If not, return NULL. */ +DSO_METHOD *DSO_METHOD_win32(void); + +/* If VMS is defined, use shared images. If not, return NULL. */ +DSO_METHOD *DSO_METHOD_vms(void); + +/* + * This function writes null-terminated pathname of DSO module containing + * 'addr' into 'sz' large caller-provided 'path' and returns the number of + * characters [including trailing zero] written to it. If 'sz' is 0 or + * negative, 'path' is ignored and required amount of charachers [including + * trailing zero] to accomodate pathname is returned. If 'addr' is NULL, then + * pathname of cryptolib itself is returned. Negative or zero return value + * denotes error. + */ +int DSO_pathbyaddr(void *addr, char *path, int sz); + +/* + * This function should be used with caution! It looks up symbols in *all* + * loaded modules and if module gets unloaded by somebody else attempt to + * dereference the pointer is doomed to have fatal consequences. Primary + * usage for this function is to probe *core* system functionality, e.g. + * check if getnameinfo(3) is available at run-time without bothering about + * OS-specific details such as libc.so.versioning or where does it actually + * reside: in libc itself or libsocket. + */ +void *DSO_global_lookup(const char *name); + +/* If BeOS is defined, use shared images. If not, return NULL. */ +DSO_METHOD *DSO_METHOD_beos(void); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_DSO_strings(void); + +/* Error codes for the DSO functions. */ + +/* Function codes. */ +# define DSO_F_BEOS_BIND_FUNC 144 +# define DSO_F_BEOS_BIND_VAR 145 +# define DSO_F_BEOS_LOAD 146 +# define DSO_F_BEOS_NAME_CONVERTER 147 +# define DSO_F_BEOS_UNLOAD 148 +# define DSO_F_DLFCN_BIND_FUNC 100 +# define DSO_F_DLFCN_BIND_VAR 101 +# define DSO_F_DLFCN_LOAD 102 +# define DSO_F_DLFCN_MERGER 130 +# define DSO_F_DLFCN_NAME_CONVERTER 123 +# define DSO_F_DLFCN_UNLOAD 103 +# define DSO_F_DL_BIND_FUNC 104 +# define DSO_F_DL_BIND_VAR 105 +# define DSO_F_DL_LOAD 106 +# define DSO_F_DL_MERGER 131 +# define DSO_F_DL_NAME_CONVERTER 124 +# define DSO_F_DL_UNLOAD 107 +# define DSO_F_DSO_BIND_FUNC 108 +# define DSO_F_DSO_BIND_VAR 109 +# define DSO_F_DSO_CONVERT_FILENAME 126 +# define DSO_F_DSO_CTRL 110 +# define DSO_F_DSO_FREE 111 +# define DSO_F_DSO_GET_FILENAME 127 +# define DSO_F_DSO_GET_LOADED_FILENAME 128 +# define DSO_F_DSO_GLOBAL_LOOKUP 139 +# define DSO_F_DSO_LOAD 112 +# define DSO_F_DSO_MERGE 132 +# define DSO_F_DSO_NEW_METHOD 113 +# define DSO_F_DSO_PATHBYADDR 140 +# define DSO_F_DSO_SET_FILENAME 129 +# define DSO_F_DSO_SET_NAME_CONVERTER 122 +# define DSO_F_DSO_UP_REF 114 +# define DSO_F_GLOBAL_LOOKUP_FUNC 138 +# define DSO_F_PATHBYADDR 137 +# define DSO_F_VMS_BIND_SYM 115 +# define DSO_F_VMS_LOAD 116 +# define DSO_F_VMS_MERGER 133 +# define DSO_F_VMS_UNLOAD 117 +# define DSO_F_WIN32_BIND_FUNC 118 +# define DSO_F_WIN32_BIND_VAR 119 +# define DSO_F_WIN32_GLOBALLOOKUP 142 +# define DSO_F_WIN32_GLOBALLOOKUP_FUNC 143 +# define DSO_F_WIN32_JOINER 135 +# define DSO_F_WIN32_LOAD 120 +# define DSO_F_WIN32_MERGER 134 +# define DSO_F_WIN32_NAME_CONVERTER 125 +# define DSO_F_WIN32_PATHBYADDR 141 +# define DSO_F_WIN32_SPLITTER 136 +# define DSO_F_WIN32_UNLOAD 121 + +/* Reason codes. */ +# define DSO_R_CTRL_FAILED 100 +# define DSO_R_DSO_ALREADY_LOADED 110 +# define DSO_R_EMPTY_FILE_STRUCTURE 113 +# define DSO_R_FAILURE 114 +# define DSO_R_FILENAME_TOO_BIG 101 +# define DSO_R_FINISH_FAILED 102 +# define DSO_R_INCORRECT_FILE_SYNTAX 115 +# define DSO_R_LOAD_FAILED 103 +# define DSO_R_NAME_TRANSLATION_FAILED 109 +# define DSO_R_NO_FILENAME 111 +# define DSO_R_NO_FILE_SPECIFICATION 116 +# define DSO_R_NULL_HANDLE 104 +# define DSO_R_SET_FILENAME_FAILED 112 +# define DSO_R_STACK_ERROR 105 +# define DSO_R_SYM_FAILURE 106 +# define DSO_R_UNLOAD_FAILED 107 +# define DSO_R_UNSUPPORTED 108 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/win/openssl/include/openssl/dtls1.h b/hdssd/external/win/openssl/include/openssl/dtls1.h new file mode 100644 index 0000000..30bbcf2 --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/dtls1.h @@ -0,0 +1,272 @@ +/* ssl/dtls1.h */ +/* + * DTLS implementation written by Nagendra Modadugu + * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. + */ +/* ==================================================================== + * Copyright (c) 1999-2005 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_DTLS1_H +# define HEADER_DTLS1_H + +# include +# include +# ifdef OPENSSL_SYS_VMS +# include +# include +# endif +# ifdef OPENSSL_SYS_WIN32 +/* Needed for struct timeval */ +# include +# elif defined(OPENSSL_SYS_NETWARE) && !defined(_WINSOCK2API_) +# include +# else +# if defined(OPENSSL_SYS_VXWORKS) +# include +# else +# include +# endif +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +# define DTLS1_VERSION 0xFEFF +# define DTLS1_2_VERSION 0xFEFD +# define DTLS_MAX_VERSION DTLS1_2_VERSION +# define DTLS1_VERSION_MAJOR 0xFE + +# define DTLS1_BAD_VER 0x0100 + +/* Special value for method supporting multiple versions */ +# define DTLS_ANY_VERSION 0x1FFFF + +# if 0 +/* this alert description is not specified anywhere... */ +# define DTLS1_AD_MISSING_HANDSHAKE_MESSAGE 110 +# endif + +/* lengths of messages */ +# define DTLS1_COOKIE_LENGTH 256 + +# define DTLS1_RT_HEADER_LENGTH 13 + +# define DTLS1_HM_HEADER_LENGTH 12 + +# define DTLS1_HM_BAD_FRAGMENT -2 +# define DTLS1_HM_FRAGMENT_RETRY -3 + +# define DTLS1_CCS_HEADER_LENGTH 1 + +# ifdef DTLS1_AD_MISSING_HANDSHAKE_MESSAGE +# define DTLS1_AL_HEADER_LENGTH 7 +# else +# define DTLS1_AL_HEADER_LENGTH 2 +# endif + +# ifndef OPENSSL_NO_SSL_INTERN + +# ifndef OPENSSL_NO_SCTP +# define DTLS1_SCTP_AUTH_LABEL "EXPORTER_DTLS_OVER_SCTP" +# endif + +/* Max MTU overhead we know about so far is 40 for IPv6 + 8 for UDP */ +# define DTLS1_MAX_MTU_OVERHEAD 48 + +typedef struct dtls1_bitmap_st { + unsigned long map; /* track 32 packets on 32-bit systems and 64 + * - on 64-bit systems */ + unsigned char max_seq_num[8]; /* max record number seen so far, 64-bit + * value in big-endian encoding */ +} DTLS1_BITMAP; + +struct dtls1_retransmit_state { + EVP_CIPHER_CTX *enc_write_ctx; /* cryptographic state */ + EVP_MD_CTX *write_hash; /* used for mac generation */ +# ifndef OPENSSL_NO_COMP + COMP_CTX *compress; /* compression */ +# else + char *compress; +# endif + SSL_SESSION *session; + unsigned short epoch; +}; + +struct hm_header_st { + unsigned char type; + unsigned long msg_len; + unsigned short seq; + unsigned long frag_off; + unsigned long frag_len; + unsigned int is_ccs; + struct dtls1_retransmit_state saved_retransmit_state; +}; + +struct ccs_header_st { + unsigned char type; + unsigned short seq; +}; + +struct dtls1_timeout_st { + /* Number of read timeouts so far */ + unsigned int read_timeouts; + /* Number of write timeouts so far */ + unsigned int write_timeouts; + /* Number of alerts received so far */ + unsigned int num_alerts; +}; + +typedef struct record_pqueue_st { + unsigned short epoch; + pqueue q; +} record_pqueue; + +typedef struct hm_fragment_st { + struct hm_header_st msg_header; + unsigned char *fragment; + unsigned char *reassembly; +} hm_fragment; + +typedef struct dtls1_state_st { + unsigned int send_cookie; + unsigned char cookie[DTLS1_COOKIE_LENGTH]; + unsigned char rcvd_cookie[DTLS1_COOKIE_LENGTH]; + unsigned int cookie_len; + /* + * The current data and handshake epoch. This is initially + * undefined, and starts at zero once the initial handshake is + * completed + */ + unsigned short r_epoch; + unsigned short w_epoch; + /* records being received in the current epoch */ + DTLS1_BITMAP bitmap; + /* renegotiation starts a new set of sequence numbers */ + DTLS1_BITMAP next_bitmap; + /* handshake message numbers */ + unsigned short handshake_write_seq; + unsigned short next_handshake_write_seq; + unsigned short handshake_read_seq; + /* save last sequence number for retransmissions */ + unsigned char last_write_sequence[8]; + /* Received handshake records (processed and unprocessed) */ + record_pqueue unprocessed_rcds; + record_pqueue processed_rcds; + /* Buffered handshake messages */ + pqueue buffered_messages; + /* Buffered (sent) handshake records */ + pqueue sent_messages; + /* + * Buffered application records. Only for records between CCS and + * Finished to prevent either protocol violation or unnecessary message + * loss. + */ + record_pqueue buffered_app_data; + /* Is set when listening for new connections with dtls1_listen() */ + unsigned int listen; + unsigned int link_mtu; /* max on-the-wire DTLS packet size */ + unsigned int mtu; /* max DTLS packet size */ + struct hm_header_st w_msg_hdr; + struct hm_header_st r_msg_hdr; + struct dtls1_timeout_st timeout; + /* + * Indicates when the last handshake msg or heartbeat sent will timeout + */ + struct timeval next_timeout; + /* Timeout duration */ + unsigned short timeout_duration; + /* + * storage for Alert/Handshake protocol data received but not yet + * processed by ssl3_read_bytes: + */ + unsigned char alert_fragment[DTLS1_AL_HEADER_LENGTH]; + unsigned int alert_fragment_len; + unsigned char handshake_fragment[DTLS1_HM_HEADER_LENGTH]; + unsigned int handshake_fragment_len; + unsigned int retransmitting; + /* + * Set when the handshake is ready to process peer's ChangeCipherSpec message. + * Cleared after the message has been processed. + */ + unsigned int change_cipher_spec_ok; +# ifndef OPENSSL_NO_SCTP + /* used when SSL_ST_XX_FLUSH is entered */ + int next_state; + int shutdown_received; +# endif +} DTLS1_STATE; + +typedef struct dtls1_record_data_st { + unsigned char *packet; + unsigned int packet_length; + SSL3_BUFFER rbuf; + SSL3_RECORD rrec; +# ifndef OPENSSL_NO_SCTP + struct bio_dgram_sctp_rcvinfo recordinfo; +# endif +} DTLS1_RECORD_DATA; + +# endif + +/* Timeout multipliers (timeout slice is defined in apps/timeouts.h */ +# define DTLS1_TMO_READ_COUNT 2 +# define DTLS1_TMO_WRITE_COUNT 2 + +# define DTLS1_TMO_ALERT_COUNT 12 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/win/openssl/include/openssl/e_os2.h b/hdssd/external/win/openssl/include/openssl/e_os2.h new file mode 100644 index 0000000..7be9989 --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/e_os2.h @@ -0,0 +1,328 @@ +/* e_os2.h */ +/* ==================================================================== + * Copyright (c) 1998-2000 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#include + +#ifndef HEADER_E_OS2_H +# define HEADER_E_OS2_H + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************************************************** + * Detect operating systems. This probably needs completing. + * The result is that at least one OPENSSL_SYS_os macro should be defined. + * However, if none is defined, Unix is assumed. + **/ + +# define OPENSSL_SYS_UNIX + +/* ---------------------- Macintosh, before MacOS X ----------------------- */ +# if defined(__MWERKS__) && defined(macintosh) || defined(OPENSSL_SYSNAME_MAC) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_MACINTOSH_CLASSIC +# endif + +/* ---------------------- NetWare ----------------------------------------- */ +# if defined(NETWARE) || defined(OPENSSL_SYSNAME_NETWARE) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_NETWARE +# endif + +/* --------------------- Microsoft operating systems ---------------------- */ + +/* + * Note that MSDOS actually denotes 32-bit environments running on top of + * MS-DOS, such as DJGPP one. + */ +# if defined(OPENSSL_SYSNAME_MSDOS) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_MSDOS +# endif + +/* + * For 32 bit environment, there seems to be the CygWin environment and then + * all the others that try to do the same thing Microsoft does... + */ +# if defined(OPENSSL_SYSNAME_UWIN) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_WIN32_UWIN +# else +# if defined(__CYGWIN__) || defined(OPENSSL_SYSNAME_CYGWIN) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_WIN32_CYGWIN +# else +# if defined(_WIN32) || defined(OPENSSL_SYSNAME_WIN32) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_WIN32 +# endif +# if defined(_WIN64) || defined(OPENSSL_SYSNAME_WIN64) +# undef OPENSSL_SYS_UNIX +# if !defined(OPENSSL_SYS_WIN64) +# define OPENSSL_SYS_WIN64 +# endif +# endif +# if defined(OPENSSL_SYSNAME_WINNT) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_WINNT +# endif +# if defined(OPENSSL_SYSNAME_WINCE) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_WINCE +# endif +# endif +# endif + +/* Anything that tries to look like Microsoft is "Windows" */ +# if defined(OPENSSL_SYS_WIN32) || defined(OPENSSL_SYS_WIN64) || defined(OPENSSL_SYS_WINNT) || defined(OPENSSL_SYS_WINCE) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_WINDOWS +# ifndef OPENSSL_SYS_MSDOS +# define OPENSSL_SYS_MSDOS +# endif +# endif + +/* + * DLL settings. This part is a bit tough, because it's up to the + * application implementor how he or she will link the application, so it + * requires some macro to be used. + */ +# ifdef OPENSSL_SYS_WINDOWS +# ifndef OPENSSL_OPT_WINDLL +# if defined(_WINDLL) /* This is used when building OpenSSL to + * indicate that DLL linkage should be used */ +# define OPENSSL_OPT_WINDLL +# endif +# endif +# endif + +/* ------------------------------- OpenVMS -------------------------------- */ +# if defined(__VMS) || defined(VMS) || defined(OPENSSL_SYSNAME_VMS) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_VMS +# if defined(__DECC) +# define OPENSSL_SYS_VMS_DECC +# elif defined(__DECCXX) +# define OPENSSL_SYS_VMS_DECC +# define OPENSSL_SYS_VMS_DECCXX +# else +# define OPENSSL_SYS_VMS_NODECC +# endif +# endif + +/* -------------------------------- OS/2 ---------------------------------- */ +# if defined(__EMX__) || defined(__OS2__) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_OS2 +# endif + +/* -------------------------------- Unix ---------------------------------- */ +# ifdef OPENSSL_SYS_UNIX +# if defined(linux) || defined(__linux__) || defined(OPENSSL_SYSNAME_LINUX) +# define OPENSSL_SYS_LINUX +# endif +# ifdef OPENSSL_SYSNAME_MPE +# define OPENSSL_SYS_MPE +# endif +# ifdef OPENSSL_SYSNAME_SNI +# define OPENSSL_SYS_SNI +# endif +# ifdef OPENSSL_SYSNAME_ULTRASPARC +# define OPENSSL_SYS_ULTRASPARC +# endif +# ifdef OPENSSL_SYSNAME_NEWS4 +# define OPENSSL_SYS_NEWS4 +# endif +# ifdef OPENSSL_SYSNAME_MACOSX +# define OPENSSL_SYS_MACOSX +# endif +# ifdef OPENSSL_SYSNAME_MACOSX_RHAPSODY +# define OPENSSL_SYS_MACOSX_RHAPSODY +# define OPENSSL_SYS_MACOSX +# endif +# ifdef OPENSSL_SYSNAME_SUNOS +# define OPENSSL_SYS_SUNOS +# endif +# if defined(_CRAY) || defined(OPENSSL_SYSNAME_CRAY) +# define OPENSSL_SYS_CRAY +# endif +# if defined(_AIX) || defined(OPENSSL_SYSNAME_AIX) +# define OPENSSL_SYS_AIX +# endif +# endif + +/* -------------------------------- VOS ----------------------------------- */ +# if defined(__VOS__) || defined(OPENSSL_SYSNAME_VOS) +# define OPENSSL_SYS_VOS +# ifdef __HPPA__ +# define OPENSSL_SYS_VOS_HPPA +# endif +# ifdef __IA32__ +# define OPENSSL_SYS_VOS_IA32 +# endif +# endif + +/* ------------------------------ VxWorks --------------------------------- */ +# ifdef OPENSSL_SYSNAME_VXWORKS +# define OPENSSL_SYS_VXWORKS +# endif + +/* -------------------------------- BeOS ---------------------------------- */ +# if defined(__BEOS__) +# define OPENSSL_SYS_BEOS +# include +# if defined(BONE_VERSION) +# define OPENSSL_SYS_BEOS_BONE +# else +# define OPENSSL_SYS_BEOS_R5 +# endif +# endif + +/** + * That's it for OS-specific stuff + *****************************************************************************/ + +/* Specials for I/O an exit */ +# ifdef OPENSSL_SYS_MSDOS +# define OPENSSL_UNISTD_IO +# define OPENSSL_DECLARE_EXIT extern void exit(int); +# else +# define OPENSSL_UNISTD_IO OPENSSL_UNISTD +# define OPENSSL_DECLARE_EXIT /* declared in unistd.h */ +# endif + +/*- + * Definitions of OPENSSL_GLOBAL and OPENSSL_EXTERN, to define and declare + * certain global symbols that, with some compilers under VMS, have to be + * defined and declared explicitely with globaldef and globalref. + * Definitions of OPENSSL_EXPORT and OPENSSL_IMPORT, to define and declare + * DLL exports and imports for compilers under Win32. These are a little + * more complicated to use. Basically, for any library that exports some + * global variables, the following code must be present in the header file + * that declares them, before OPENSSL_EXTERN is used: + * + * #ifdef SOME_BUILD_FLAG_MACRO + * # undef OPENSSL_EXTERN + * # define OPENSSL_EXTERN OPENSSL_EXPORT + * #endif + * + * The default is to have OPENSSL_EXPORT, OPENSSL_IMPORT and OPENSSL_GLOBAL + * have some generally sensible values, and for OPENSSL_EXTERN to have the + * value OPENSSL_IMPORT. + */ + +# if defined(OPENSSL_SYS_VMS_NODECC) +# define OPENSSL_EXPORT globalref +# define OPENSSL_IMPORT globalref +# define OPENSSL_GLOBAL globaldef +# elif defined(OPENSSL_SYS_WINDOWS) && defined(OPENSSL_OPT_WINDLL) +# define OPENSSL_EXPORT extern __declspec(dllexport) +# define OPENSSL_IMPORT extern __declspec(dllimport) +# define OPENSSL_GLOBAL +# else +# define OPENSSL_EXPORT extern +# define OPENSSL_IMPORT extern +# define OPENSSL_GLOBAL +# endif +# define OPENSSL_EXTERN OPENSSL_IMPORT + +/*- + * Macros to allow global variables to be reached through function calls when + * required (if a shared library version requires it, for example. + * The way it's done allows definitions like this: + * + * // in foobar.c + * OPENSSL_IMPLEMENT_GLOBAL(int,foobar,0) + * // in foobar.h + * OPENSSL_DECLARE_GLOBAL(int,foobar); + * #define foobar OPENSSL_GLOBAL_REF(foobar) + */ +# ifdef OPENSSL_EXPORT_VAR_AS_FUNCTION +# define OPENSSL_IMPLEMENT_GLOBAL(type,name,value) \ + type *_shadow_##name(void) \ + { static type _hide_##name=value; return &_hide_##name; } +# define OPENSSL_DECLARE_GLOBAL(type,name) type *_shadow_##name(void) +# define OPENSSL_GLOBAL_REF(name) (*(_shadow_##name())) +# else +# define OPENSSL_IMPLEMENT_GLOBAL(type,name,value) OPENSSL_GLOBAL type _shadow_##name=value; +# define OPENSSL_DECLARE_GLOBAL(type,name) OPENSSL_EXPORT type _shadow_##name +# define OPENSSL_GLOBAL_REF(name) _shadow_##name +# endif + +# if defined(OPENSSL_SYS_MACINTOSH_CLASSIC) && macintosh==1 && !defined(MAC_OS_GUSI_SOURCE) +# define ossl_ssize_t long +# endif + +# ifdef OPENSSL_SYS_MSDOS +# define ossl_ssize_t long +# endif + +# if defined(NeXT) || defined(OPENSSL_SYS_NEWS4) || defined(OPENSSL_SYS_SUNOS) +# define ssize_t int +# endif + +# if defined(__ultrix) && !defined(ssize_t) +# define ossl_ssize_t int +# endif + +# ifndef ossl_ssize_t +# define ossl_ssize_t ssize_t +# endif + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/win/openssl/include/openssl/ebcdic.h b/hdssd/external/win/openssl/include/openssl/ebcdic.h new file mode 100644 index 0000000..4cbdfeb --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/ebcdic.h @@ -0,0 +1,26 @@ +/* crypto/ebcdic.h */ + +#ifndef HEADER_EBCDIC_H +# define HEADER_EBCDIC_H + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Avoid name clashes with other applications */ +# define os_toascii _openssl_os_toascii +# define os_toebcdic _openssl_os_toebcdic +# define ebcdic2ascii _openssl_ebcdic2ascii +# define ascii2ebcdic _openssl_ascii2ebcdic + +extern const unsigned char os_toascii[256]; +extern const unsigned char os_toebcdic[256]; +void *ebcdic2ascii(void *dest, const void *srce, size_t count); +void *ascii2ebcdic(void *dest, const void *srce, size_t count); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/win/openssl/include/openssl/ec.h b/hdssd/external/win/openssl/include/openssl/ec.h new file mode 100644 index 0000000..81e6faf --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/ec.h @@ -0,0 +1,1282 @@ +/* crypto/ec/ec.h */ +/* + * Originally written by Bodo Moeller for the OpenSSL project. + */ +/** + * \file crypto/ec/ec.h Include file for the OpenSSL EC functions + * \author Originally written by Bodo Moeller for the OpenSSL project + */ +/* ==================================================================== + * Copyright (c) 1998-2005 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * + * Portions of the attached software ("Contribution") are developed by + * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project. + * + * The Contribution is licensed pursuant to the OpenSSL open source + * license provided above. + * + * The elliptic curve binary polynomial software is originally written by + * Sheueling Chang Shantz and Douglas Stebila of Sun Microsystems Laboratories. + * + */ + +#ifndef HEADER_EC_H +# define HEADER_EC_H + +# include + +# ifdef OPENSSL_NO_EC +# error EC is disabled. +# endif + +# include +# include +# ifndef OPENSSL_NO_DEPRECATED +# include +# endif + +# ifdef __cplusplus +extern "C" { +# elif defined(__SUNPRO_C) +# if __SUNPRO_C >= 0x520 +# pragma error_messages (off,E_ARRAY_OF_INCOMPLETE_NONAME,E_ARRAY_OF_INCOMPLETE) +# endif +# endif + +# ifndef OPENSSL_ECC_MAX_FIELD_BITS +# define OPENSSL_ECC_MAX_FIELD_BITS 661 +# endif + +/** Enum for the point conversion form as defined in X9.62 (ECDSA) + * for the encoding of a elliptic curve point (x,y) */ +typedef enum { + /** the point is encoded as z||x, where the octet z specifies + * which solution of the quadratic equation y is */ + POINT_CONVERSION_COMPRESSED = 2, + /** the point is encoded as z||x||y, where z is the octet 0x04 */ + POINT_CONVERSION_UNCOMPRESSED = 4, + /** the point is encoded as z||x||y, where the octet z specifies + * which solution of the quadratic equation y is */ + POINT_CONVERSION_HYBRID = 6 +} point_conversion_form_t; + +typedef struct ec_method_st EC_METHOD; + +typedef struct ec_group_st + /*- + EC_METHOD *meth; + -- field definition + -- curve coefficients + -- optional generator with associated information (order, cofactor) + -- optional extra data (precomputed table for fast computation of multiples of generator) + -- ASN1 stuff + */ + EC_GROUP; + +typedef struct ec_point_st EC_POINT; + +/********************************************************************/ +/* EC_METHODs for curves over GF(p) */ +/********************************************************************/ + +/** Returns the basic GFp ec methods which provides the basis for the + * optimized methods. + * \return EC_METHOD object + */ +const EC_METHOD *EC_GFp_simple_method(void); + +/** Returns GFp methods using montgomery multiplication. + * \return EC_METHOD object + */ +const EC_METHOD *EC_GFp_mont_method(void); + +/** Returns GFp methods using optimized methods for NIST recommended curves + * \return EC_METHOD object + */ +const EC_METHOD *EC_GFp_nist_method(void); + +# ifndef OPENSSL_NO_EC_NISTP_64_GCC_128 +/** Returns 64-bit optimized methods for nistp224 + * \return EC_METHOD object + */ +const EC_METHOD *EC_GFp_nistp224_method(void); + +/** Returns 64-bit optimized methods for nistp256 + * \return EC_METHOD object + */ +const EC_METHOD *EC_GFp_nistp256_method(void); + +/** Returns 64-bit optimized methods for nistp521 + * \return EC_METHOD object + */ +const EC_METHOD *EC_GFp_nistp521_method(void); +# endif + +# ifndef OPENSSL_NO_EC2M +/********************************************************************/ +/* EC_METHOD for curves over GF(2^m) */ +/********************************************************************/ + +/** Returns the basic GF2m ec method + * \return EC_METHOD object + */ +const EC_METHOD *EC_GF2m_simple_method(void); + +# endif + +/********************************************************************/ +/* EC_GROUP functions */ +/********************************************************************/ + +/** Creates a new EC_GROUP object + * \param meth EC_METHOD to use + * \return newly created EC_GROUP object or NULL in case of an error. + */ +EC_GROUP *EC_GROUP_new(const EC_METHOD *meth); + +/** Frees a EC_GROUP object + * \param group EC_GROUP object to be freed. + */ +void EC_GROUP_free(EC_GROUP *group); + +/** Clears and frees a EC_GROUP object + * \param group EC_GROUP object to be cleared and freed. + */ +void EC_GROUP_clear_free(EC_GROUP *group); + +/** Copies EC_GROUP objects. Note: both EC_GROUPs must use the same EC_METHOD. + * \param dst destination EC_GROUP object + * \param src source EC_GROUP object + * \return 1 on success and 0 if an error occurred. + */ +int EC_GROUP_copy(EC_GROUP *dst, const EC_GROUP *src); + +/** Creates a new EC_GROUP object and copies the copies the content + * form src to the newly created EC_KEY object + * \param src source EC_GROUP object + * \return newly created EC_GROUP object or NULL in case of an error. + */ +EC_GROUP *EC_GROUP_dup(const EC_GROUP *src); + +/** Returns the EC_METHOD of the EC_GROUP object. + * \param group EC_GROUP object + * \return EC_METHOD used in this EC_GROUP object. + */ +const EC_METHOD *EC_GROUP_method_of(const EC_GROUP *group); + +/** Returns the field type of the EC_METHOD. + * \param meth EC_METHOD object + * \return NID of the underlying field type OID. + */ +int EC_METHOD_get_field_type(const EC_METHOD *meth); + +/** Sets the generator and it's order/cofactor of a EC_GROUP object. + * \param group EC_GROUP object + * \param generator EC_POINT object with the generator. + * \param order the order of the group generated by the generator. + * \param cofactor the index of the sub-group generated by the generator + * in the group of all points on the elliptic curve. + * \return 1 on success and 0 if an error occured + */ +int EC_GROUP_set_generator(EC_GROUP *group, const EC_POINT *generator, + const BIGNUM *order, const BIGNUM *cofactor); + +/** Returns the generator of a EC_GROUP object. + * \param group EC_GROUP object + * \return the currently used generator (possibly NULL). + */ +const EC_POINT *EC_GROUP_get0_generator(const EC_GROUP *group); + +/** Returns the montgomery data for order(Generator) + * \param group EC_GROUP object + * \return the currently used generator (possibly NULL). +*/ +BN_MONT_CTX *EC_GROUP_get_mont_data(const EC_GROUP *group); + +/** Gets the order of a EC_GROUP + * \param group EC_GROUP object + * \param order BIGNUM to which the order is copied + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_GROUP_get_order(const EC_GROUP *group, BIGNUM *order, BN_CTX *ctx); + +/** Gets the cofactor of a EC_GROUP + * \param group EC_GROUP object + * \param cofactor BIGNUM to which the cofactor is copied + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_GROUP_get_cofactor(const EC_GROUP *group, BIGNUM *cofactor, + BN_CTX *ctx); + +/** Sets the name of a EC_GROUP object + * \param group EC_GROUP object + * \param nid NID of the curve name OID + */ +void EC_GROUP_set_curve_name(EC_GROUP *group, int nid); + +/** Returns the curve name of a EC_GROUP object + * \param group EC_GROUP object + * \return NID of the curve name OID or 0 if not set. + */ +int EC_GROUP_get_curve_name(const EC_GROUP *group); + +void EC_GROUP_set_asn1_flag(EC_GROUP *group, int flag); +int EC_GROUP_get_asn1_flag(const EC_GROUP *group); + +void EC_GROUP_set_point_conversion_form(EC_GROUP *group, + point_conversion_form_t form); +point_conversion_form_t EC_GROUP_get_point_conversion_form(const EC_GROUP *); + +unsigned char *EC_GROUP_get0_seed(const EC_GROUP *x); +size_t EC_GROUP_get_seed_len(const EC_GROUP *); +size_t EC_GROUP_set_seed(EC_GROUP *, const unsigned char *, size_t len); + +/** Sets the parameter of a ec over GFp defined by y^2 = x^3 + a*x + b + * \param group EC_GROUP object + * \param p BIGNUM with the prime number + * \param a BIGNUM with parameter a of the equation + * \param b BIGNUM with parameter b of the equation + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_GROUP_set_curve_GFp(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a, + const BIGNUM *b, BN_CTX *ctx); + +/** Gets the parameter of the ec over GFp defined by y^2 = x^3 + a*x + b + * \param group EC_GROUP object + * \param p BIGNUM for the prime number + * \param a BIGNUM for parameter a of the equation + * \param b BIGNUM for parameter b of the equation + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_GROUP_get_curve_GFp(const EC_GROUP *group, BIGNUM *p, BIGNUM *a, + BIGNUM *b, BN_CTX *ctx); + +# ifndef OPENSSL_NO_EC2M +/** Sets the parameter of a ec over GF2m defined by y^2 + x*y = x^3 + a*x^2 + b + * \param group EC_GROUP object + * \param p BIGNUM with the polynomial defining the underlying field + * \param a BIGNUM with parameter a of the equation + * \param b BIGNUM with parameter b of the equation + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_GROUP_set_curve_GF2m(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a, + const BIGNUM *b, BN_CTX *ctx); + +/** Gets the parameter of the ec over GF2m defined by y^2 + x*y = x^3 + a*x^2 + b + * \param group EC_GROUP object + * \param p BIGNUM for the polynomial defining the underlying field + * \param a BIGNUM for parameter a of the equation + * \param b BIGNUM for parameter b of the equation + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_GROUP_get_curve_GF2m(const EC_GROUP *group, BIGNUM *p, BIGNUM *a, + BIGNUM *b, BN_CTX *ctx); +# endif +/** Returns the number of bits needed to represent a field element + * \param group EC_GROUP object + * \return number of bits needed to represent a field element + */ +int EC_GROUP_get_degree(const EC_GROUP *group); + +/** Checks whether the parameter in the EC_GROUP define a valid ec group + * \param group EC_GROUP object + * \param ctx BN_CTX object (optional) + * \return 1 if group is a valid ec group and 0 otherwise + */ +int EC_GROUP_check(const EC_GROUP *group, BN_CTX *ctx); + +/** Checks whether the discriminant of the elliptic curve is zero or not + * \param group EC_GROUP object + * \param ctx BN_CTX object (optional) + * \return 1 if the discriminant is not zero and 0 otherwise + */ +int EC_GROUP_check_discriminant(const EC_GROUP *group, BN_CTX *ctx); + +/** Compares two EC_GROUP objects + * \param a first EC_GROUP object + * \param b second EC_GROUP object + * \param ctx BN_CTX object (optional) + * \return 0 if both groups are equal and 1 otherwise + */ +int EC_GROUP_cmp(const EC_GROUP *a, const EC_GROUP *b, BN_CTX *ctx); + +/* + * EC_GROUP_new_GF*() calls EC_GROUP_new() and EC_GROUP_set_GF*() after + * choosing an appropriate EC_METHOD + */ + +/** Creates a new EC_GROUP object with the specified parameters defined + * over GFp (defined by the equation y^2 = x^3 + a*x + b) + * \param p BIGNUM with the prime number + * \param a BIGNUM with the parameter a of the equation + * \param b BIGNUM with the parameter b of the equation + * \param ctx BN_CTX object (optional) + * \return newly created EC_GROUP object with the specified parameters + */ +EC_GROUP *EC_GROUP_new_curve_GFp(const BIGNUM *p, const BIGNUM *a, + const BIGNUM *b, BN_CTX *ctx); +# ifndef OPENSSL_NO_EC2M +/** Creates a new EC_GROUP object with the specified parameters defined + * over GF2m (defined by the equation y^2 + x*y = x^3 + a*x^2 + b) + * \param p BIGNUM with the polynomial defining the underlying field + * \param a BIGNUM with the parameter a of the equation + * \param b BIGNUM with the parameter b of the equation + * \param ctx BN_CTX object (optional) + * \return newly created EC_GROUP object with the specified parameters + */ +EC_GROUP *EC_GROUP_new_curve_GF2m(const BIGNUM *p, const BIGNUM *a, + const BIGNUM *b, BN_CTX *ctx); +# endif +/** Creates a EC_GROUP object with a curve specified by a NID + * \param nid NID of the OID of the curve name + * \return newly created EC_GROUP object with specified curve or NULL + * if an error occurred + */ +EC_GROUP *EC_GROUP_new_by_curve_name(int nid); + +/********************************************************************/ +/* handling of internal curves */ +/********************************************************************/ + +typedef struct { + int nid; + const char *comment; +} EC_builtin_curve; + +/* + * EC_builtin_curves(EC_builtin_curve *r, size_t size) returns number of all + * available curves or zero if a error occurred. In case r ist not zero + * nitems EC_builtin_curve structures are filled with the data of the first + * nitems internal groups + */ +size_t EC_get_builtin_curves(EC_builtin_curve *r, size_t nitems); + +const char *EC_curve_nid2nist(int nid); +int EC_curve_nist2nid(const char *name); + +/********************************************************************/ +/* EC_POINT functions */ +/********************************************************************/ + +/** Creates a new EC_POINT object for the specified EC_GROUP + * \param group EC_GROUP the underlying EC_GROUP object + * \return newly created EC_POINT object or NULL if an error occurred + */ +EC_POINT *EC_POINT_new(const EC_GROUP *group); + +/** Frees a EC_POINT object + * \param point EC_POINT object to be freed + */ +void EC_POINT_free(EC_POINT *point); + +/** Clears and frees a EC_POINT object + * \param point EC_POINT object to be cleared and freed + */ +void EC_POINT_clear_free(EC_POINT *point); + +/** Copies EC_POINT object + * \param dst destination EC_POINT object + * \param src source EC_POINT object + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_copy(EC_POINT *dst, const EC_POINT *src); + +/** Creates a new EC_POINT object and copies the content of the supplied + * EC_POINT + * \param src source EC_POINT object + * \param group underlying the EC_GROUP object + * \return newly created EC_POINT object or NULL if an error occurred + */ +EC_POINT *EC_POINT_dup(const EC_POINT *src, const EC_GROUP *group); + +/** Returns the EC_METHOD used in EC_POINT object + * \param point EC_POINT object + * \return the EC_METHOD used + */ +const EC_METHOD *EC_POINT_method_of(const EC_POINT *point); + +/** Sets a point to infinity (neutral element) + * \param group underlying EC_GROUP object + * \param point EC_POINT to set to infinity + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_set_to_infinity(const EC_GROUP *group, EC_POINT *point); + +/** Sets the jacobian projective coordinates of a EC_POINT over GFp + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param x BIGNUM with the x-coordinate + * \param y BIGNUM with the y-coordinate + * \param z BIGNUM with the z-coordinate + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_set_Jprojective_coordinates_GFp(const EC_GROUP *group, + EC_POINT *p, const BIGNUM *x, + const BIGNUM *y, const BIGNUM *z, + BN_CTX *ctx); + +/** Gets the jacobian projective coordinates of a EC_POINT over GFp + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param x BIGNUM for the x-coordinate + * \param y BIGNUM for the y-coordinate + * \param z BIGNUM for the z-coordinate + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_get_Jprojective_coordinates_GFp(const EC_GROUP *group, + const EC_POINT *p, BIGNUM *x, + BIGNUM *y, BIGNUM *z, + BN_CTX *ctx); + +/** Sets the affine coordinates of a EC_POINT over GFp + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param x BIGNUM with the x-coordinate + * \param y BIGNUM with the y-coordinate + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_set_affine_coordinates_GFp(const EC_GROUP *group, EC_POINT *p, + const BIGNUM *x, const BIGNUM *y, + BN_CTX *ctx); + +/** Gets the affine coordinates of a EC_POINT over GFp + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param x BIGNUM for the x-coordinate + * \param y BIGNUM for the y-coordinate + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_get_affine_coordinates_GFp(const EC_GROUP *group, + const EC_POINT *p, BIGNUM *x, + BIGNUM *y, BN_CTX *ctx); + +/** Sets the x9.62 compressed coordinates of a EC_POINT over GFp + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param x BIGNUM with x-coordinate + * \param y_bit integer with the y-Bit (either 0 or 1) + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_set_compressed_coordinates_GFp(const EC_GROUP *group, + EC_POINT *p, const BIGNUM *x, + int y_bit, BN_CTX *ctx); +# ifndef OPENSSL_NO_EC2M +/** Sets the affine coordinates of a EC_POINT over GF2m + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param x BIGNUM with the x-coordinate + * \param y BIGNUM with the y-coordinate + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_set_affine_coordinates_GF2m(const EC_GROUP *group, EC_POINT *p, + const BIGNUM *x, const BIGNUM *y, + BN_CTX *ctx); + +/** Gets the affine coordinates of a EC_POINT over GF2m + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param x BIGNUM for the x-coordinate + * \param y BIGNUM for the y-coordinate + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_get_affine_coordinates_GF2m(const EC_GROUP *group, + const EC_POINT *p, BIGNUM *x, + BIGNUM *y, BN_CTX *ctx); + +/** Sets the x9.62 compressed coordinates of a EC_POINT over GF2m + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param x BIGNUM with x-coordinate + * \param y_bit integer with the y-Bit (either 0 or 1) + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_set_compressed_coordinates_GF2m(const EC_GROUP *group, + EC_POINT *p, const BIGNUM *x, + int y_bit, BN_CTX *ctx); +# endif +/** Encodes a EC_POINT object to a octet string + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param form point conversion form + * \param buf memory buffer for the result. If NULL the function returns + * required buffer size. + * \param len length of the memory buffer + * \param ctx BN_CTX object (optional) + * \return the length of the encoded octet string or 0 if an error occurred + */ +size_t EC_POINT_point2oct(const EC_GROUP *group, const EC_POINT *p, + point_conversion_form_t form, + unsigned char *buf, size_t len, BN_CTX *ctx); + +/** Decodes a EC_POINT from a octet string + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param buf memory buffer with the encoded ec point + * \param len length of the encoded ec point + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_oct2point(const EC_GROUP *group, EC_POINT *p, + const unsigned char *buf, size_t len, BN_CTX *ctx); + +/* other interfaces to point2oct/oct2point: */ +BIGNUM *EC_POINT_point2bn(const EC_GROUP *, const EC_POINT *, + point_conversion_form_t form, BIGNUM *, BN_CTX *); +EC_POINT *EC_POINT_bn2point(const EC_GROUP *, const BIGNUM *, + EC_POINT *, BN_CTX *); +char *EC_POINT_point2hex(const EC_GROUP *, const EC_POINT *, + point_conversion_form_t form, BN_CTX *); +EC_POINT *EC_POINT_hex2point(const EC_GROUP *, const char *, + EC_POINT *, BN_CTX *); + +/********************************************************************/ +/* functions for doing EC_POINT arithmetic */ +/********************************************************************/ + +/** Computes the sum of two EC_POINT + * \param group underlying EC_GROUP object + * \param r EC_POINT object for the result (r = a + b) + * \param a EC_POINT object with the first summand + * \param b EC_POINT object with the second summand + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, + const EC_POINT *b, BN_CTX *ctx); + +/** Computes the double of a EC_POINT + * \param group underlying EC_GROUP object + * \param r EC_POINT object for the result (r = 2 * a) + * \param a EC_POINT object + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_dbl(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, + BN_CTX *ctx); + +/** Computes the inverse of a EC_POINT + * \param group underlying EC_GROUP object + * \param a EC_POINT object to be inverted (it's used for the result as well) + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_invert(const EC_GROUP *group, EC_POINT *a, BN_CTX *ctx); + +/** Checks whether the point is the neutral element of the group + * \param group the underlying EC_GROUP object + * \param p EC_POINT object + * \return 1 if the point is the neutral element and 0 otherwise + */ +int EC_POINT_is_at_infinity(const EC_GROUP *group, const EC_POINT *p); + +/** Checks whether the point is on the curve + * \param group underlying EC_GROUP object + * \param point EC_POINT object to check + * \param ctx BN_CTX object (optional) + * \return 1 if point if on the curve and 0 otherwise + */ +int EC_POINT_is_on_curve(const EC_GROUP *group, const EC_POINT *point, + BN_CTX *ctx); + +/** Compares two EC_POINTs + * \param group underlying EC_GROUP object + * \param a first EC_POINT object + * \param b second EC_POINT object + * \param ctx BN_CTX object (optional) + * \return 0 if both points are equal and a value != 0 otherwise + */ +int EC_POINT_cmp(const EC_GROUP *group, const EC_POINT *a, const EC_POINT *b, + BN_CTX *ctx); + +int EC_POINT_make_affine(const EC_GROUP *group, EC_POINT *point, BN_CTX *ctx); +int EC_POINTs_make_affine(const EC_GROUP *group, size_t num, + EC_POINT *points[], BN_CTX *ctx); + +/** Computes r = generator * n sum_{i=0}^{num-1} p[i] * m[i] + * \param group underlying EC_GROUP object + * \param r EC_POINT object for the result + * \param n BIGNUM with the multiplier for the group generator (optional) + * \param num number futher summands + * \param p array of size num of EC_POINT objects + * \param m array of size num of BIGNUM objects + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINTs_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *n, + size_t num, const EC_POINT *p[], const BIGNUM *m[], + BN_CTX *ctx); + +/** Computes r = generator * n + q * m + * \param group underlying EC_GROUP object + * \param r EC_POINT object for the result + * \param n BIGNUM with the multiplier for the group generator (optional) + * \param q EC_POINT object with the first factor of the second summand + * \param m BIGNUM with the second factor of the second summand + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *n, + const EC_POINT *q, const BIGNUM *m, BN_CTX *ctx); + +/** Stores multiples of generator for faster point multiplication + * \param group EC_GROUP object + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_GROUP_precompute_mult(EC_GROUP *group, BN_CTX *ctx); + +/** Reports whether a precomputation has been done + * \param group EC_GROUP object + * \return 1 if a pre-computation has been done and 0 otherwise + */ +int EC_GROUP_have_precompute_mult(const EC_GROUP *group); + +/********************************************************************/ +/* ASN1 stuff */ +/********************************************************************/ + +/* + * EC_GROUP_get_basis_type() returns the NID of the basis type used to + * represent the field elements + */ +int EC_GROUP_get_basis_type(const EC_GROUP *); +# ifndef OPENSSL_NO_EC2M +int EC_GROUP_get_trinomial_basis(const EC_GROUP *, unsigned int *k); +int EC_GROUP_get_pentanomial_basis(const EC_GROUP *, unsigned int *k1, + unsigned int *k2, unsigned int *k3); +# endif + +# define OPENSSL_EC_NAMED_CURVE 0x001 + +typedef struct ecpk_parameters_st ECPKPARAMETERS; + +EC_GROUP *d2i_ECPKParameters(EC_GROUP **, const unsigned char **in, long len); +int i2d_ECPKParameters(const EC_GROUP *, unsigned char **out); + +# define d2i_ECPKParameters_bio(bp,x) ASN1_d2i_bio_of(EC_GROUP,NULL,d2i_ECPKParameters,bp,x) +# define i2d_ECPKParameters_bio(bp,x) ASN1_i2d_bio_of_const(EC_GROUP,i2d_ECPKParameters,bp,x) +# define d2i_ECPKParameters_fp(fp,x) (EC_GROUP *)ASN1_d2i_fp(NULL, \ + (char *(*)())d2i_ECPKParameters,(fp),(unsigned char **)(x)) +# define i2d_ECPKParameters_fp(fp,x) ASN1_i2d_fp(i2d_ECPKParameters,(fp), \ + (unsigned char *)(x)) + +# ifndef OPENSSL_NO_BIO +int ECPKParameters_print(BIO *bp, const EC_GROUP *x, int off); +# endif +# ifndef OPENSSL_NO_FP_API +int ECPKParameters_print_fp(FILE *fp, const EC_GROUP *x, int off); +# endif + +/********************************************************************/ +/* EC_KEY functions */ +/********************************************************************/ + +typedef struct ec_key_st EC_KEY; + +/* some values for the encoding_flag */ +# define EC_PKEY_NO_PARAMETERS 0x001 +# define EC_PKEY_NO_PUBKEY 0x002 + +/* some values for the flags field */ +# define EC_FLAG_NON_FIPS_ALLOW 0x1 +# define EC_FLAG_FIPS_CHECKED 0x2 + +/** Creates a new EC_KEY object. + * \return EC_KEY object or NULL if an error occurred. + */ +EC_KEY *EC_KEY_new(void); + +int EC_KEY_get_flags(const EC_KEY *key); + +void EC_KEY_set_flags(EC_KEY *key, int flags); + +void EC_KEY_clear_flags(EC_KEY *key, int flags); + +/** Creates a new EC_KEY object using a named curve as underlying + * EC_GROUP object. + * \param nid NID of the named curve. + * \return EC_KEY object or NULL if an error occurred. + */ +EC_KEY *EC_KEY_new_by_curve_name(int nid); + +/** Frees a EC_KEY object. + * \param key EC_KEY object to be freed. + */ +void EC_KEY_free(EC_KEY *key); + +/** Copies a EC_KEY object. + * \param dst destination EC_KEY object + * \param src src EC_KEY object + * \return dst or NULL if an error occurred. + */ +EC_KEY *EC_KEY_copy(EC_KEY *dst, const EC_KEY *src); + +/** Creates a new EC_KEY object and copies the content from src to it. + * \param src the source EC_KEY object + * \return newly created EC_KEY object or NULL if an error occurred. + */ +EC_KEY *EC_KEY_dup(const EC_KEY *src); + +/** Increases the internal reference count of a EC_KEY object. + * \param key EC_KEY object + * \return 1 on success and 0 if an error occurred. + */ +int EC_KEY_up_ref(EC_KEY *key); + +/** Returns the EC_GROUP object of a EC_KEY object + * \param key EC_KEY object + * \return the EC_GROUP object (possibly NULL). + */ +const EC_GROUP *EC_KEY_get0_group(const EC_KEY *key); + +/** Sets the EC_GROUP of a EC_KEY object. + * \param key EC_KEY object + * \param group EC_GROUP to use in the EC_KEY object (note: the EC_KEY + * object will use an own copy of the EC_GROUP). + * \return 1 on success and 0 if an error occurred. + */ +int EC_KEY_set_group(EC_KEY *key, const EC_GROUP *group); + +/** Returns the private key of a EC_KEY object. + * \param key EC_KEY object + * \return a BIGNUM with the private key (possibly NULL). + */ +const BIGNUM *EC_KEY_get0_private_key(const EC_KEY *key); + +/** Sets the private key of a EC_KEY object. + * \param key EC_KEY object + * \param prv BIGNUM with the private key (note: the EC_KEY object + * will use an own copy of the BIGNUM). + * \return 1 on success and 0 if an error occurred. + */ +int EC_KEY_set_private_key(EC_KEY *key, const BIGNUM *prv); + +/** Returns the public key of a EC_KEY object. + * \param key the EC_KEY object + * \return a EC_POINT object with the public key (possibly NULL) + */ +const EC_POINT *EC_KEY_get0_public_key(const EC_KEY *key); + +/** Sets the public key of a EC_KEY object. + * \param key EC_KEY object + * \param pub EC_POINT object with the public key (note: the EC_KEY object + * will use an own copy of the EC_POINT object). + * \return 1 on success and 0 if an error occurred. + */ +int EC_KEY_set_public_key(EC_KEY *key, const EC_POINT *pub); + +unsigned EC_KEY_get_enc_flags(const EC_KEY *key); +void EC_KEY_set_enc_flags(EC_KEY *eckey, unsigned int flags); +point_conversion_form_t EC_KEY_get_conv_form(const EC_KEY *key); +void EC_KEY_set_conv_form(EC_KEY *eckey, point_conversion_form_t cform); +/* functions to set/get method specific data */ +void *EC_KEY_get_key_method_data(EC_KEY *key, + void *(*dup_func) (void *), + void (*free_func) (void *), + void (*clear_free_func) (void *)); +/** Sets the key method data of an EC_KEY object, if none has yet been set. + * \param key EC_KEY object + * \param data opaque data to install. + * \param dup_func a function that duplicates |data|. + * \param free_func a function that frees |data|. + * \param clear_free_func a function that wipes and frees |data|. + * \return the previously set data pointer, or NULL if |data| was inserted. + */ +void *EC_KEY_insert_key_method_data(EC_KEY *key, void *data, + void *(*dup_func) (void *), + void (*free_func) (void *), + void (*clear_free_func) (void *)); +/* wrapper functions for the underlying EC_GROUP object */ +void EC_KEY_set_asn1_flag(EC_KEY *eckey, int asn1_flag); + +/** Creates a table of pre-computed multiples of the generator to + * accelerate further EC_KEY operations. + * \param key EC_KEY object + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occurred. + */ +int EC_KEY_precompute_mult(EC_KEY *key, BN_CTX *ctx); + +/** Creates a new ec private (and optional a new public) key. + * \param key EC_KEY object + * \return 1 on success and 0 if an error occurred. + */ +int EC_KEY_generate_key(EC_KEY *key); + +/** Verifies that a private and/or public key is valid. + * \param key the EC_KEY object + * \return 1 on success and 0 otherwise. + */ +int EC_KEY_check_key(const EC_KEY *key); + +/** Sets a public key from affine coordindates performing + * neccessary NIST PKV tests. + * \param key the EC_KEY object + * \param x public key x coordinate + * \param y public key y coordinate + * \return 1 on success and 0 otherwise. + */ +int EC_KEY_set_public_key_affine_coordinates(EC_KEY *key, BIGNUM *x, + BIGNUM *y); + +/********************************************************************/ +/* de- and encoding functions for SEC1 ECPrivateKey */ +/********************************************************************/ + +/** Decodes a private key from a memory buffer. + * \param key a pointer to a EC_KEY object which should be used (or NULL) + * \param in pointer to memory with the DER encoded private key + * \param len length of the DER encoded private key + * \return the decoded private key or NULL if an error occurred. + */ +EC_KEY *d2i_ECPrivateKey(EC_KEY **key, const unsigned char **in, long len); + +/** Encodes a private key object and stores the result in a buffer. + * \param key the EC_KEY object to encode + * \param out the buffer for the result (if NULL the function returns number + * of bytes needed). + * \return 1 on success and 0 if an error occurred. + */ +int i2d_ECPrivateKey(EC_KEY *key, unsigned char **out); + +/********************************************************************/ +/* de- and encoding functions for EC parameters */ +/********************************************************************/ + +/** Decodes ec parameter from a memory buffer. + * \param key a pointer to a EC_KEY object which should be used (or NULL) + * \param in pointer to memory with the DER encoded ec parameters + * \param len length of the DER encoded ec parameters + * \return a EC_KEY object with the decoded parameters or NULL if an error + * occurred. + */ +EC_KEY *d2i_ECParameters(EC_KEY **key, const unsigned char **in, long len); + +/** Encodes ec parameter and stores the result in a buffer. + * \param key the EC_KEY object with ec paramters to encode + * \param out the buffer for the result (if NULL the function returns number + * of bytes needed). + * \return 1 on success and 0 if an error occurred. + */ +int i2d_ECParameters(EC_KEY *key, unsigned char **out); + +/********************************************************************/ +/* de- and encoding functions for EC public key */ +/* (octet string, not DER -- hence 'o2i' and 'i2o') */ +/********************************************************************/ + +/** Decodes a ec public key from a octet string. + * \param key a pointer to a EC_KEY object which should be used + * \param in memory buffer with the encoded public key + * \param len length of the encoded public key + * \return EC_KEY object with decoded public key or NULL if an error + * occurred. + */ +EC_KEY *o2i_ECPublicKey(EC_KEY **key, const unsigned char **in, long len); + +/** Encodes a ec public key in an octet string. + * \param key the EC_KEY object with the public key + * \param out the buffer for the result (if NULL the function returns number + * of bytes needed). + * \return 1 on success and 0 if an error occurred + */ +int i2o_ECPublicKey(EC_KEY *key, unsigned char **out); + +# ifndef OPENSSL_NO_BIO +/** Prints out the ec parameters on human readable form. + * \param bp BIO object to which the information is printed + * \param key EC_KEY object + * \return 1 on success and 0 if an error occurred + */ +int ECParameters_print(BIO *bp, const EC_KEY *key); + +/** Prints out the contents of a EC_KEY object + * \param bp BIO object to which the information is printed + * \param key EC_KEY object + * \param off line offset + * \return 1 on success and 0 if an error occurred + */ +int EC_KEY_print(BIO *bp, const EC_KEY *key, int off); + +# endif +# ifndef OPENSSL_NO_FP_API +/** Prints out the ec parameters on human readable form. + * \param fp file descriptor to which the information is printed + * \param key EC_KEY object + * \return 1 on success and 0 if an error occurred + */ +int ECParameters_print_fp(FILE *fp, const EC_KEY *key); + +/** Prints out the contents of a EC_KEY object + * \param fp file descriptor to which the information is printed + * \param key EC_KEY object + * \param off line offset + * \return 1 on success and 0 if an error occurred + */ +int EC_KEY_print_fp(FILE *fp, const EC_KEY *key, int off); + +# endif + +# define ECParameters_dup(x) ASN1_dup_of(EC_KEY,i2d_ECParameters,d2i_ECParameters,x) + +# ifndef __cplusplus +# if defined(__SUNPRO_C) +# if __SUNPRO_C >= 0x520 +# pragma error_messages (default,E_ARRAY_OF_INCOMPLETE_NONAME,E_ARRAY_OF_INCOMPLETE) +# endif +# endif +# endif + +# define EVP_PKEY_CTX_set_ec_paramgen_curve_nid(ctx, nid) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_PARAMGEN|EVP_PKEY_OP_KEYGEN, \ + EVP_PKEY_CTRL_EC_PARAMGEN_CURVE_NID, nid, NULL) + +# define EVP_PKEY_CTX_set_ec_param_enc(ctx, flag) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_PARAMGEN|EVP_PKEY_OP_KEYGEN, \ + EVP_PKEY_CTRL_EC_PARAM_ENC, flag, NULL) + +# define EVP_PKEY_CTX_set_ecdh_cofactor_mode(ctx, flag) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_EC_ECDH_COFACTOR, flag, NULL) + +# define EVP_PKEY_CTX_get_ecdh_cofactor_mode(ctx) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_EC_ECDH_COFACTOR, -2, NULL) + +# define EVP_PKEY_CTX_set_ecdh_kdf_type(ctx, kdf) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_EC_KDF_TYPE, kdf, NULL) + +# define EVP_PKEY_CTX_get_ecdh_kdf_type(ctx) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_EC_KDF_TYPE, -2, NULL) + +# define EVP_PKEY_CTX_set_ecdh_kdf_md(ctx, md) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_EC_KDF_MD, 0, (void *)md) + +# define EVP_PKEY_CTX_get_ecdh_kdf_md(ctx, pmd) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_GET_EC_KDF_MD, 0, (void *)pmd) + +# define EVP_PKEY_CTX_set_ecdh_kdf_outlen(ctx, len) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_EC_KDF_OUTLEN, len, NULL) + +# define EVP_PKEY_CTX_get_ecdh_kdf_outlen(ctx, plen) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_GET_EC_KDF_OUTLEN, 0, (void *)plen) + +# define EVP_PKEY_CTX_set0_ecdh_kdf_ukm(ctx, p, plen) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_EC_KDF_UKM, plen, (void *)p) + +# define EVP_PKEY_CTX_get0_ecdh_kdf_ukm(ctx, p) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_GET_EC_KDF_UKM, 0, (void *)p) + +# define EVP_PKEY_CTRL_EC_PARAMGEN_CURVE_NID (EVP_PKEY_ALG_CTRL + 1) +# define EVP_PKEY_CTRL_EC_PARAM_ENC (EVP_PKEY_ALG_CTRL + 2) +# define EVP_PKEY_CTRL_EC_ECDH_COFACTOR (EVP_PKEY_ALG_CTRL + 3) +# define EVP_PKEY_CTRL_EC_KDF_TYPE (EVP_PKEY_ALG_CTRL + 4) +# define EVP_PKEY_CTRL_EC_KDF_MD (EVP_PKEY_ALG_CTRL + 5) +# define EVP_PKEY_CTRL_GET_EC_KDF_MD (EVP_PKEY_ALG_CTRL + 6) +# define EVP_PKEY_CTRL_EC_KDF_OUTLEN (EVP_PKEY_ALG_CTRL + 7) +# define EVP_PKEY_CTRL_GET_EC_KDF_OUTLEN (EVP_PKEY_ALG_CTRL + 8) +# define EVP_PKEY_CTRL_EC_KDF_UKM (EVP_PKEY_ALG_CTRL + 9) +# define EVP_PKEY_CTRL_GET_EC_KDF_UKM (EVP_PKEY_ALG_CTRL + 10) +/* KDF types */ +# define EVP_PKEY_ECDH_KDF_NONE 1 +# define EVP_PKEY_ECDH_KDF_X9_62 2 + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_EC_strings(void); + +/* Error codes for the EC functions. */ + +/* Function codes. */ +# define EC_F_BN_TO_FELEM 224 +# define EC_F_COMPUTE_WNAF 143 +# define EC_F_D2I_ECPARAMETERS 144 +# define EC_F_D2I_ECPKPARAMETERS 145 +# define EC_F_D2I_ECPRIVATEKEY 146 +# define EC_F_DO_EC_KEY_PRINT 221 +# define EC_F_ECDH_CMS_DECRYPT 238 +# define EC_F_ECDH_CMS_SET_SHARED_INFO 239 +# define EC_F_ECKEY_PARAM2TYPE 223 +# define EC_F_ECKEY_PARAM_DECODE 212 +# define EC_F_ECKEY_PRIV_DECODE 213 +# define EC_F_ECKEY_PRIV_ENCODE 214 +# define EC_F_ECKEY_PUB_DECODE 215 +# define EC_F_ECKEY_PUB_ENCODE 216 +# define EC_F_ECKEY_TYPE2PARAM 220 +# define EC_F_ECPARAMETERS_PRINT 147 +# define EC_F_ECPARAMETERS_PRINT_FP 148 +# define EC_F_ECPKPARAMETERS_PRINT 149 +# define EC_F_ECPKPARAMETERS_PRINT_FP 150 +# define EC_F_ECP_NISTZ256_GET_AFFINE 240 +# define EC_F_ECP_NISTZ256_MULT_PRECOMPUTE 243 +# define EC_F_ECP_NISTZ256_POINTS_MUL 241 +# define EC_F_ECP_NISTZ256_PRE_COMP_NEW 244 +# define EC_F_ECP_NISTZ256_SET_WORDS 245 +# define EC_F_ECP_NISTZ256_WINDOWED_MUL 242 +# define EC_F_ECP_NIST_MOD_192 203 +# define EC_F_ECP_NIST_MOD_224 204 +# define EC_F_ECP_NIST_MOD_256 205 +# define EC_F_ECP_NIST_MOD_521 206 +# define EC_F_EC_ASN1_GROUP2CURVE 153 +# define EC_F_EC_ASN1_GROUP2FIELDID 154 +# define EC_F_EC_ASN1_GROUP2PARAMETERS 155 +# define EC_F_EC_ASN1_GROUP2PKPARAMETERS 156 +# define EC_F_EC_ASN1_PARAMETERS2GROUP 157 +# define EC_F_EC_ASN1_PKPARAMETERS2GROUP 158 +# define EC_F_EC_EX_DATA_SET_DATA 211 +# define EC_F_EC_GF2M_MONTGOMERY_POINT_MULTIPLY 208 +# define EC_F_EC_GF2M_SIMPLE_GROUP_CHECK_DISCRIMINANT 159 +# define EC_F_EC_GF2M_SIMPLE_GROUP_SET_CURVE 195 +# define EC_F_EC_GF2M_SIMPLE_OCT2POINT 160 +# define EC_F_EC_GF2M_SIMPLE_POINT2OCT 161 +# define EC_F_EC_GF2M_SIMPLE_POINT_GET_AFFINE_COORDINATES 162 +# define EC_F_EC_GF2M_SIMPLE_POINT_SET_AFFINE_COORDINATES 163 +# define EC_F_EC_GF2M_SIMPLE_SET_COMPRESSED_COORDINATES 164 +# define EC_F_EC_GFP_MONT_FIELD_DECODE 133 +# define EC_F_EC_GFP_MONT_FIELD_ENCODE 134 +# define EC_F_EC_GFP_MONT_FIELD_MUL 131 +# define EC_F_EC_GFP_MONT_FIELD_SET_TO_ONE 209 +# define EC_F_EC_GFP_MONT_FIELD_SQR 132 +# define EC_F_EC_GFP_MONT_GROUP_SET_CURVE 189 +# define EC_F_EC_GFP_MONT_GROUP_SET_CURVE_GFP 135 +# define EC_F_EC_GFP_NISTP224_GROUP_SET_CURVE 225 +# define EC_F_EC_GFP_NISTP224_POINTS_MUL 228 +# define EC_F_EC_GFP_NISTP224_POINT_GET_AFFINE_COORDINATES 226 +# define EC_F_EC_GFP_NISTP256_GROUP_SET_CURVE 230 +# define EC_F_EC_GFP_NISTP256_POINTS_MUL 231 +# define EC_F_EC_GFP_NISTP256_POINT_GET_AFFINE_COORDINATES 232 +# define EC_F_EC_GFP_NISTP521_GROUP_SET_CURVE 233 +# define EC_F_EC_GFP_NISTP521_POINTS_MUL 234 +# define EC_F_EC_GFP_NISTP521_POINT_GET_AFFINE_COORDINATES 235 +# define EC_F_EC_GFP_NIST_FIELD_MUL 200 +# define EC_F_EC_GFP_NIST_FIELD_SQR 201 +# define EC_F_EC_GFP_NIST_GROUP_SET_CURVE 202 +# define EC_F_EC_GFP_SIMPLE_GROUP_CHECK_DISCRIMINANT 165 +# define EC_F_EC_GFP_SIMPLE_GROUP_SET_CURVE 166 +# define EC_F_EC_GFP_SIMPLE_GROUP_SET_CURVE_GFP 100 +# define EC_F_EC_GFP_SIMPLE_GROUP_SET_GENERATOR 101 +# define EC_F_EC_GFP_SIMPLE_MAKE_AFFINE 102 +# define EC_F_EC_GFP_SIMPLE_OCT2POINT 103 +# define EC_F_EC_GFP_SIMPLE_POINT2OCT 104 +# define EC_F_EC_GFP_SIMPLE_POINTS_MAKE_AFFINE 137 +# define EC_F_EC_GFP_SIMPLE_POINT_GET_AFFINE_COORDINATES 167 +# define EC_F_EC_GFP_SIMPLE_POINT_GET_AFFINE_COORDINATES_GFP 105 +# define EC_F_EC_GFP_SIMPLE_POINT_SET_AFFINE_COORDINATES 168 +# define EC_F_EC_GFP_SIMPLE_POINT_SET_AFFINE_COORDINATES_GFP 128 +# define EC_F_EC_GFP_SIMPLE_SET_COMPRESSED_COORDINATES 169 +# define EC_F_EC_GFP_SIMPLE_SET_COMPRESSED_COORDINATES_GFP 129 +# define EC_F_EC_GROUP_CHECK 170 +# define EC_F_EC_GROUP_CHECK_DISCRIMINANT 171 +# define EC_F_EC_GROUP_COPY 106 +# define EC_F_EC_GROUP_GET0_GENERATOR 139 +# define EC_F_EC_GROUP_GET_COFACTOR 140 +# define EC_F_EC_GROUP_GET_CURVE_GF2M 172 +# define EC_F_EC_GROUP_GET_CURVE_GFP 130 +# define EC_F_EC_GROUP_GET_DEGREE 173 +# define EC_F_EC_GROUP_GET_ORDER 141 +# define EC_F_EC_GROUP_GET_PENTANOMIAL_BASIS 193 +# define EC_F_EC_GROUP_GET_TRINOMIAL_BASIS 194 +# define EC_F_EC_GROUP_NEW 108 +# define EC_F_EC_GROUP_NEW_BY_CURVE_NAME 174 +# define EC_F_EC_GROUP_NEW_FROM_DATA 175 +# define EC_F_EC_GROUP_PRECOMPUTE_MULT 142 +# define EC_F_EC_GROUP_SET_CURVE_GF2M 176 +# define EC_F_EC_GROUP_SET_CURVE_GFP 109 +# define EC_F_EC_GROUP_SET_EXTRA_DATA 110 +# define EC_F_EC_GROUP_SET_GENERATOR 111 +# define EC_F_EC_KEY_CHECK_KEY 177 +# define EC_F_EC_KEY_COPY 178 +# define EC_F_EC_KEY_GENERATE_KEY 179 +# define EC_F_EC_KEY_NEW 182 +# define EC_F_EC_KEY_PRINT 180 +# define EC_F_EC_KEY_PRINT_FP 181 +# define EC_F_EC_KEY_SET_PUBLIC_KEY_AFFINE_COORDINATES 229 +# define EC_F_EC_POINTS_MAKE_AFFINE 136 +# define EC_F_EC_POINT_ADD 112 +# define EC_F_EC_POINT_CMP 113 +# define EC_F_EC_POINT_COPY 114 +# define EC_F_EC_POINT_DBL 115 +# define EC_F_EC_POINT_GET_AFFINE_COORDINATES_GF2M 183 +# define EC_F_EC_POINT_GET_AFFINE_COORDINATES_GFP 116 +# define EC_F_EC_POINT_GET_JPROJECTIVE_COORDINATES_GFP 117 +# define EC_F_EC_POINT_INVERT 210 +# define EC_F_EC_POINT_IS_AT_INFINITY 118 +# define EC_F_EC_POINT_IS_ON_CURVE 119 +# define EC_F_EC_POINT_MAKE_AFFINE 120 +# define EC_F_EC_POINT_MUL 184 +# define EC_F_EC_POINT_NEW 121 +# define EC_F_EC_POINT_OCT2POINT 122 +# define EC_F_EC_POINT_POINT2OCT 123 +# define EC_F_EC_POINT_SET_AFFINE_COORDINATES_GF2M 185 +# define EC_F_EC_POINT_SET_AFFINE_COORDINATES_GFP 124 +# define EC_F_EC_POINT_SET_COMPRESSED_COORDINATES_GF2M 186 +# define EC_F_EC_POINT_SET_COMPRESSED_COORDINATES_GFP 125 +# define EC_F_EC_POINT_SET_JPROJECTIVE_COORDINATES_GFP 126 +# define EC_F_EC_POINT_SET_TO_INFINITY 127 +# define EC_F_EC_PRE_COMP_DUP 207 +# define EC_F_EC_PRE_COMP_NEW 196 +# define EC_F_EC_WNAF_MUL 187 +# define EC_F_EC_WNAF_PRECOMPUTE_MULT 188 +# define EC_F_I2D_ECPARAMETERS 190 +# define EC_F_I2D_ECPKPARAMETERS 191 +# define EC_F_I2D_ECPRIVATEKEY 192 +# define EC_F_I2O_ECPUBLICKEY 151 +# define EC_F_NISTP224_PRE_COMP_NEW 227 +# define EC_F_NISTP256_PRE_COMP_NEW 236 +# define EC_F_NISTP521_PRE_COMP_NEW 237 +# define EC_F_O2I_ECPUBLICKEY 152 +# define EC_F_OLD_EC_PRIV_DECODE 222 +# define EC_F_PKEY_EC_CTRL 197 +# define EC_F_PKEY_EC_CTRL_STR 198 +# define EC_F_PKEY_EC_DERIVE 217 +# define EC_F_PKEY_EC_KEYGEN 199 +# define EC_F_PKEY_EC_PARAMGEN 219 +# define EC_F_PKEY_EC_SIGN 218 + +/* Reason codes. */ +# define EC_R_ASN1_ERROR 115 +# define EC_R_ASN1_UNKNOWN_FIELD 116 +# define EC_R_BIGNUM_OUT_OF_RANGE 144 +# define EC_R_BUFFER_TOO_SMALL 100 +# define EC_R_COORDINATES_OUT_OF_RANGE 146 +# define EC_R_D2I_ECPKPARAMETERS_FAILURE 117 +# define EC_R_DECODE_ERROR 142 +# define EC_R_DISCRIMINANT_IS_ZERO 118 +# define EC_R_EC_GROUP_NEW_BY_NAME_FAILURE 119 +# define EC_R_FIELD_TOO_LARGE 143 +# define EC_R_GF2M_NOT_SUPPORTED 147 +# define EC_R_GROUP2PKPARAMETERS_FAILURE 120 +# define EC_R_I2D_ECPKPARAMETERS_FAILURE 121 +# define EC_R_INCOMPATIBLE_OBJECTS 101 +# define EC_R_INVALID_ARGUMENT 112 +# define EC_R_INVALID_COMPRESSED_POINT 110 +# define EC_R_INVALID_COMPRESSION_BIT 109 +# define EC_R_INVALID_CURVE 141 +# define EC_R_INVALID_DIGEST 151 +# define EC_R_INVALID_DIGEST_TYPE 138 +# define EC_R_INVALID_ENCODING 102 +# define EC_R_INVALID_FIELD 103 +# define EC_R_INVALID_FORM 104 +# define EC_R_INVALID_GROUP_ORDER 122 +# define EC_R_INVALID_PENTANOMIAL_BASIS 132 +# define EC_R_INVALID_PRIVATE_KEY 123 +# define EC_R_INVALID_TRINOMIAL_BASIS 137 +# define EC_R_KDF_PARAMETER_ERROR 148 +# define EC_R_KEYS_NOT_SET 140 +# define EC_R_MISSING_PARAMETERS 124 +# define EC_R_MISSING_PRIVATE_KEY 125 +# define EC_R_NOT_A_NIST_PRIME 135 +# define EC_R_NOT_A_SUPPORTED_NIST_PRIME 136 +# define EC_R_NOT_IMPLEMENTED 126 +# define EC_R_NOT_INITIALIZED 111 +# define EC_R_NO_FIELD_MOD 133 +# define EC_R_NO_PARAMETERS_SET 139 +# define EC_R_PASSED_NULL_PARAMETER 134 +# define EC_R_PEER_KEY_ERROR 149 +# define EC_R_PKPARAMETERS2GROUP_FAILURE 127 +# define EC_R_POINT_AT_INFINITY 106 +# define EC_R_POINT_IS_NOT_ON_CURVE 107 +# define EC_R_SHARED_INFO_ERROR 150 +# define EC_R_SLOT_FULL 108 +# define EC_R_UNDEFINED_GENERATOR 113 +# define EC_R_UNDEFINED_ORDER 128 +# define EC_R_UNKNOWN_GROUP 129 +# define EC_R_UNKNOWN_ORDER 114 +# define EC_R_UNSUPPORTED_FIELD 131 +# define EC_R_WRONG_CURVE_PARAMETERS 145 +# define EC_R_WRONG_ORDER 130 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/win/openssl/include/openssl/ecdh.h b/hdssd/external/win/openssl/include/openssl/ecdh.h new file mode 100644 index 0000000..25348b3 --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/ecdh.h @@ -0,0 +1,134 @@ +/* crypto/ecdh/ecdh.h */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * + * The Elliptic Curve Public-Key Crypto Library (ECC Code) included + * herein is developed by SUN MICROSYSTEMS, INC., and is contributed + * to the OpenSSL project. + * + * The ECC Code is licensed pursuant to the OpenSSL open source + * license provided below. + * + * The ECDH software is originally written by Douglas Stebila of + * Sun Microsystems Laboratories. + * + */ +/* ==================================================================== + * Copyright (c) 2000-2002 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +#ifndef HEADER_ECDH_H +# define HEADER_ECDH_H + +# include + +# ifdef OPENSSL_NO_ECDH +# error ECDH is disabled. +# endif + +# include +# include +# ifndef OPENSSL_NO_DEPRECATED +# include +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +# define EC_FLAG_COFACTOR_ECDH 0x1000 + +const ECDH_METHOD *ECDH_OpenSSL(void); + +void ECDH_set_default_method(const ECDH_METHOD *); +const ECDH_METHOD *ECDH_get_default_method(void); +int ECDH_set_method(EC_KEY *, const ECDH_METHOD *); + +int ECDH_compute_key(void *out, size_t outlen, const EC_POINT *pub_key, + EC_KEY *ecdh, void *(*KDF) (const void *in, size_t inlen, + void *out, size_t *outlen)); + +int ECDH_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new + *new_func, CRYPTO_EX_dup *dup_func, + CRYPTO_EX_free *free_func); +int ECDH_set_ex_data(EC_KEY *d, int idx, void *arg); +void *ECDH_get_ex_data(EC_KEY *d, int idx); + +int ECDH_KDF_X9_62(unsigned char *out, size_t outlen, + const unsigned char *Z, size_t Zlen, + const unsigned char *sinfo, size_t sinfolen, + const EVP_MD *md); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_ECDH_strings(void); + +/* Error codes for the ECDH functions. */ + +/* Function codes. */ +# define ECDH_F_ECDH_CHECK 102 +# define ECDH_F_ECDH_COMPUTE_KEY 100 +# define ECDH_F_ECDH_DATA_NEW_METHOD 101 + +/* Reason codes. */ +# define ECDH_R_KDF_FAILED 102 +# define ECDH_R_NON_FIPS_METHOD 103 +# define ECDH_R_NO_PRIVATE_VALUE 100 +# define ECDH_R_POINT_ARITHMETIC_FAILURE 101 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/win/openssl/include/openssl/ecdsa.h b/hdssd/external/win/openssl/include/openssl/ecdsa.h new file mode 100644 index 0000000..a6f0930 --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/ecdsa.h @@ -0,0 +1,335 @@ +/* crypto/ecdsa/ecdsa.h */ +/** + * \file crypto/ecdsa/ecdsa.h Include file for the OpenSSL ECDSA functions + * \author Written by Nils Larsch for the OpenSSL project + */ +/* ==================================================================== + * Copyright (c) 2000-2005 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +#ifndef HEADER_ECDSA_H +# define HEADER_ECDSA_H + +# include + +# ifdef OPENSSL_NO_ECDSA +# error ECDSA is disabled. +# endif + +# include +# include +# ifndef OPENSSL_NO_DEPRECATED +# include +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct ECDSA_SIG_st { + BIGNUM *r; + BIGNUM *s; +} ECDSA_SIG; + +/** Allocates and initialize a ECDSA_SIG structure + * \return pointer to a ECDSA_SIG structure or NULL if an error occurred + */ +ECDSA_SIG *ECDSA_SIG_new(void); + +/** frees a ECDSA_SIG structure + * \param sig pointer to the ECDSA_SIG structure + */ +void ECDSA_SIG_free(ECDSA_SIG *sig); + +/** DER encode content of ECDSA_SIG object (note: this function modifies *pp + * (*pp += length of the DER encoded signature)). + * \param sig pointer to the ECDSA_SIG object + * \param pp pointer to a unsigned char pointer for the output or NULL + * \return the length of the DER encoded ECDSA_SIG object or 0 + */ +int i2d_ECDSA_SIG(const ECDSA_SIG *sig, unsigned char **pp); + +/** Decodes a DER encoded ECDSA signature (note: this function changes *pp + * (*pp += len)). + * \param sig pointer to ECDSA_SIG pointer (may be NULL) + * \param pp memory buffer with the DER encoded signature + * \param len length of the buffer + * \return pointer to the decoded ECDSA_SIG structure (or NULL) + */ +ECDSA_SIG *d2i_ECDSA_SIG(ECDSA_SIG **sig, const unsigned char **pp, long len); + +/** Computes the ECDSA signature of the given hash value using + * the supplied private key and returns the created signature. + * \param dgst pointer to the hash value + * \param dgst_len length of the hash value + * \param eckey EC_KEY object containing a private EC key + * \return pointer to a ECDSA_SIG structure or NULL if an error occurred + */ +ECDSA_SIG *ECDSA_do_sign(const unsigned char *dgst, int dgst_len, + EC_KEY *eckey); + +/** Computes ECDSA signature of a given hash value using the supplied + * private key (note: sig must point to ECDSA_size(eckey) bytes of memory). + * \param dgst pointer to the hash value to sign + * \param dgstlen length of the hash value + * \param kinv BIGNUM with a pre-computed inverse k (optional) + * \param rp BIGNUM with a pre-computed rp value (optioanl), + * see ECDSA_sign_setup + * \param eckey EC_KEY object containing a private EC key + * \return pointer to a ECDSA_SIG structure or NULL if an error occurred + */ +ECDSA_SIG *ECDSA_do_sign_ex(const unsigned char *dgst, int dgstlen, + const BIGNUM *kinv, const BIGNUM *rp, + EC_KEY *eckey); + +/** Verifies that the supplied signature is a valid ECDSA + * signature of the supplied hash value using the supplied public key. + * \param dgst pointer to the hash value + * \param dgst_len length of the hash value + * \param sig ECDSA_SIG structure + * \param eckey EC_KEY object containing a public EC key + * \return 1 if the signature is valid, 0 if the signature is invalid + * and -1 on error + */ +int ECDSA_do_verify(const unsigned char *dgst, int dgst_len, + const ECDSA_SIG *sig, EC_KEY *eckey); + +const ECDSA_METHOD *ECDSA_OpenSSL(void); + +/** Sets the default ECDSA method + * \param meth new default ECDSA_METHOD + */ +void ECDSA_set_default_method(const ECDSA_METHOD *meth); + +/** Returns the default ECDSA method + * \return pointer to ECDSA_METHOD structure containing the default method + */ +const ECDSA_METHOD *ECDSA_get_default_method(void); + +/** Sets method to be used for the ECDSA operations + * \param eckey EC_KEY object + * \param meth new method + * \return 1 on success and 0 otherwise + */ +int ECDSA_set_method(EC_KEY *eckey, const ECDSA_METHOD *meth); + +/** Returns the maximum length of the DER encoded signature + * \param eckey EC_KEY object + * \return numbers of bytes required for the DER encoded signature + */ +int ECDSA_size(const EC_KEY *eckey); + +/** Precompute parts of the signing operation + * \param eckey EC_KEY object containing a private EC key + * \param ctx BN_CTX object (optional) + * \param kinv BIGNUM pointer for the inverse of k + * \param rp BIGNUM pointer for x coordinate of k * generator + * \return 1 on success and 0 otherwise + */ +int ECDSA_sign_setup(EC_KEY *eckey, BN_CTX *ctx, BIGNUM **kinv, BIGNUM **rp); + +/** Computes ECDSA signature of a given hash value using the supplied + * private key (note: sig must point to ECDSA_size(eckey) bytes of memory). + * \param type this parameter is ignored + * \param dgst pointer to the hash value to sign + * \param dgstlen length of the hash value + * \param sig memory for the DER encoded created signature + * \param siglen pointer to the length of the returned signature + * \param eckey EC_KEY object containing a private EC key + * \return 1 on success and 0 otherwise + */ +int ECDSA_sign(int type, const unsigned char *dgst, int dgstlen, + unsigned char *sig, unsigned int *siglen, EC_KEY *eckey); + +/** Computes ECDSA signature of a given hash value using the supplied + * private key (note: sig must point to ECDSA_size(eckey) bytes of memory). + * \param type this parameter is ignored + * \param dgst pointer to the hash value to sign + * \param dgstlen length of the hash value + * \param sig buffer to hold the DER encoded signature + * \param siglen pointer to the length of the returned signature + * \param kinv BIGNUM with a pre-computed inverse k (optional) + * \param rp BIGNUM with a pre-computed rp value (optioanl), + * see ECDSA_sign_setup + * \param eckey EC_KEY object containing a private EC key + * \return 1 on success and 0 otherwise + */ +int ECDSA_sign_ex(int type, const unsigned char *dgst, int dgstlen, + unsigned char *sig, unsigned int *siglen, + const BIGNUM *kinv, const BIGNUM *rp, EC_KEY *eckey); + +/** Verifies that the given signature is valid ECDSA signature + * of the supplied hash value using the specified public key. + * \param type this parameter is ignored + * \param dgst pointer to the hash value + * \param dgstlen length of the hash value + * \param sig pointer to the DER encoded signature + * \param siglen length of the DER encoded signature + * \param eckey EC_KEY object containing a public EC key + * \return 1 if the signature is valid, 0 if the signature is invalid + * and -1 on error + */ +int ECDSA_verify(int type, const unsigned char *dgst, int dgstlen, + const unsigned char *sig, int siglen, EC_KEY *eckey); + +/* the standard ex_data functions */ +int ECDSA_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new + *new_func, CRYPTO_EX_dup *dup_func, + CRYPTO_EX_free *free_func); +int ECDSA_set_ex_data(EC_KEY *d, int idx, void *arg); +void *ECDSA_get_ex_data(EC_KEY *d, int idx); + +/** Allocates and initialize a ECDSA_METHOD structure + * \param ecdsa_method pointer to ECDSA_METHOD to copy. (May be NULL) + * \return pointer to a ECDSA_METHOD structure or NULL if an error occurred + */ + +ECDSA_METHOD *ECDSA_METHOD_new(const ECDSA_METHOD *ecdsa_method); + +/** frees a ECDSA_METHOD structure + * \param ecdsa_method pointer to the ECDSA_METHOD structure + */ +void ECDSA_METHOD_free(ECDSA_METHOD *ecdsa_method); + +/** Sets application specific data in the ECDSA_METHOD + * \param ecdsa_method pointer to existing ECDSA_METHOD + * \param app application specific data to set + */ + +void ECDSA_METHOD_set_app_data(ECDSA_METHOD *ecdsa_method, void *app); + +/** Returns application specific data from a ECDSA_METHOD structure + * \param ecdsa_method pointer to ECDSA_METHOD structure + * \return pointer to application specific data. + */ + +void *ECDSA_METHOD_get_app_data(ECDSA_METHOD *ecdsa_method); + +/** Set the ECDSA_do_sign function in the ECDSA_METHOD + * \param ecdsa_method pointer to existing ECDSA_METHOD + * \param ecdsa_do_sign a funtion of type ECDSA_do_sign + */ + +void ECDSA_METHOD_set_sign(ECDSA_METHOD *ecdsa_method, + ECDSA_SIG *(*ecdsa_do_sign) (const unsigned char + *dgst, int dgst_len, + const BIGNUM *inv, + const BIGNUM *rp, + EC_KEY *eckey)); + +/** Set the ECDSA_sign_setup function in the ECDSA_METHOD + * \param ecdsa_method pointer to existing ECDSA_METHOD + * \param ecdsa_sign_setup a funtion of type ECDSA_sign_setup + */ + +void ECDSA_METHOD_set_sign_setup(ECDSA_METHOD *ecdsa_method, + int (*ecdsa_sign_setup) (EC_KEY *eckey, + BN_CTX *ctx, + BIGNUM **kinv, + BIGNUM **r)); + +/** Set the ECDSA_do_verify function in the ECDSA_METHOD + * \param ecdsa_method pointer to existing ECDSA_METHOD + * \param ecdsa_do_verify a funtion of type ECDSA_do_verify + */ + +void ECDSA_METHOD_set_verify(ECDSA_METHOD *ecdsa_method, + int (*ecdsa_do_verify) (const unsigned char + *dgst, int dgst_len, + const ECDSA_SIG *sig, + EC_KEY *eckey)); + +void ECDSA_METHOD_set_flags(ECDSA_METHOD *ecdsa_method, int flags); + +/** Set the flags field in the ECDSA_METHOD + * \param ecdsa_method pointer to existing ECDSA_METHOD + * \param flags flags value to set + */ + +void ECDSA_METHOD_set_name(ECDSA_METHOD *ecdsa_method, char *name); + +/** Set the name field in the ECDSA_METHOD + * \param ecdsa_method pointer to existing ECDSA_METHOD + * \param name name to set + */ + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_ECDSA_strings(void); + +/* Error codes for the ECDSA functions. */ + +/* Function codes. */ +# define ECDSA_F_ECDSA_CHECK 104 +# define ECDSA_F_ECDSA_DATA_NEW_METHOD 100 +# define ECDSA_F_ECDSA_DO_SIGN 101 +# define ECDSA_F_ECDSA_DO_VERIFY 102 +# define ECDSA_F_ECDSA_METHOD_NEW 105 +# define ECDSA_F_ECDSA_SIGN_SETUP 103 + +/* Reason codes. */ +# define ECDSA_R_BAD_SIGNATURE 100 +# define ECDSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE 101 +# define ECDSA_R_ERR_EC_LIB 102 +# define ECDSA_R_MISSING_PARAMETERS 103 +# define ECDSA_R_NEED_NEW_SETUP_VALUES 106 +# define ECDSA_R_NON_FIPS_METHOD 107 +# define ECDSA_R_RANDOM_NUMBER_GENERATION_FAILED 104 +# define ECDSA_R_SIGNATURE_MALLOC_FAILED 105 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/win/openssl/include/openssl/engine.h b/hdssd/external/win/openssl/include/openssl/engine.h new file mode 100644 index 0000000..bd7b591 --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/engine.h @@ -0,0 +1,960 @@ +/* openssl/engine.h */ +/* + * Written by Geoff Thorpe (geoff@geoffthorpe.net) for the OpenSSL project + * 2000. + */ +/* ==================================================================== + * Copyright (c) 1999-2004 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * ECDH support in OpenSSL originally developed by + * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project. + */ + +#ifndef HEADER_ENGINE_H +# define HEADER_ENGINE_H + +# include + +# ifdef OPENSSL_NO_ENGINE +# error ENGINE is disabled. +# endif + +# ifndef OPENSSL_NO_DEPRECATED +# include +# ifndef OPENSSL_NO_RSA +# include +# endif +# ifndef OPENSSL_NO_DSA +# include +# endif +# ifndef OPENSSL_NO_DH +# include +# endif +# ifndef OPENSSL_NO_ECDH +# include +# endif +# ifndef OPENSSL_NO_ECDSA +# include +# endif +# include +# include +# include +# endif + +# include +# include + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * These flags are used to control combinations of algorithm (methods) by + * bitwise "OR"ing. + */ +# define ENGINE_METHOD_RSA (unsigned int)0x0001 +# define ENGINE_METHOD_DSA (unsigned int)0x0002 +# define ENGINE_METHOD_DH (unsigned int)0x0004 +# define ENGINE_METHOD_RAND (unsigned int)0x0008 +# define ENGINE_METHOD_ECDH (unsigned int)0x0010 +# define ENGINE_METHOD_ECDSA (unsigned int)0x0020 +# define ENGINE_METHOD_CIPHERS (unsigned int)0x0040 +# define ENGINE_METHOD_DIGESTS (unsigned int)0x0080 +# define ENGINE_METHOD_STORE (unsigned int)0x0100 +# define ENGINE_METHOD_PKEY_METHS (unsigned int)0x0200 +# define ENGINE_METHOD_PKEY_ASN1_METHS (unsigned int)0x0400 +/* Obvious all-or-nothing cases. */ +# define ENGINE_METHOD_ALL (unsigned int)0xFFFF +# define ENGINE_METHOD_NONE (unsigned int)0x0000 + +/* + * This(ese) flag(s) controls behaviour of the ENGINE_TABLE mechanism used + * internally to control registration of ENGINE implementations, and can be + * set by ENGINE_set_table_flags(). The "NOINIT" flag prevents attempts to + * initialise registered ENGINEs if they are not already initialised. + */ +# define ENGINE_TABLE_FLAG_NOINIT (unsigned int)0x0001 + +/* ENGINE flags that can be set by ENGINE_set_flags(). */ +/* Not used */ +/* #define ENGINE_FLAGS_MALLOCED 0x0001 */ + +/* + * This flag is for ENGINEs that wish to handle the various 'CMD'-related + * control commands on their own. Without this flag, ENGINE_ctrl() handles + * these control commands on behalf of the ENGINE using their "cmd_defns" + * data. + */ +# define ENGINE_FLAGS_MANUAL_CMD_CTRL (int)0x0002 + +/* + * This flag is for ENGINEs who return new duplicate structures when found + * via "ENGINE_by_id()". When an ENGINE must store state (eg. if + * ENGINE_ctrl() commands are called in sequence as part of some stateful + * process like key-generation setup and execution), it can set this flag - + * then each attempt to obtain the ENGINE will result in it being copied into + * a new structure. Normally, ENGINEs don't declare this flag so + * ENGINE_by_id() just increments the existing ENGINE's structural reference + * count. + */ +# define ENGINE_FLAGS_BY_ID_COPY (int)0x0004 + +/* + * This flag if for an ENGINE that does not want its methods registered as + * part of ENGINE_register_all_complete() for example if the methods are not + * usable as default methods. + */ + +# define ENGINE_FLAGS_NO_REGISTER_ALL (int)0x0008 + +/* + * ENGINEs can support their own command types, and these flags are used in + * ENGINE_CTRL_GET_CMD_FLAGS to indicate to the caller what kind of input + * each command expects. Currently only numeric and string input is + * supported. If a control command supports none of the _NUMERIC, _STRING, or + * _NO_INPUT options, then it is regarded as an "internal" control command - + * and not for use in config setting situations. As such, they're not + * available to the ENGINE_ctrl_cmd_string() function, only raw ENGINE_ctrl() + * access. Changes to this list of 'command types' should be reflected + * carefully in ENGINE_cmd_is_executable() and ENGINE_ctrl_cmd_string(). + */ + +/* accepts a 'long' input value (3rd parameter to ENGINE_ctrl) */ +# define ENGINE_CMD_FLAG_NUMERIC (unsigned int)0x0001 +/* + * accepts string input (cast from 'void*' to 'const char *', 4th parameter + * to ENGINE_ctrl) + */ +# define ENGINE_CMD_FLAG_STRING (unsigned int)0x0002 +/* + * Indicates that the control command takes *no* input. Ie. the control + * command is unparameterised. + */ +# define ENGINE_CMD_FLAG_NO_INPUT (unsigned int)0x0004 +/* + * Indicates that the control command is internal. This control command won't + * be shown in any output, and is only usable through the ENGINE_ctrl_cmd() + * function. + */ +# define ENGINE_CMD_FLAG_INTERNAL (unsigned int)0x0008 + +/* + * NB: These 3 control commands are deprecated and should not be used. + * ENGINEs relying on these commands should compile conditional support for + * compatibility (eg. if these symbols are defined) but should also migrate + * the same functionality to their own ENGINE-specific control functions that + * can be "discovered" by calling applications. The fact these control + * commands wouldn't be "executable" (ie. usable by text-based config) + * doesn't change the fact that application code can find and use them + * without requiring per-ENGINE hacking. + */ + +/* + * These flags are used to tell the ctrl function what should be done. All + * command numbers are shared between all engines, even if some don't make + * sense to some engines. In such a case, they do nothing but return the + * error ENGINE_R_CTRL_COMMAND_NOT_IMPLEMENTED. + */ +# define ENGINE_CTRL_SET_LOGSTREAM 1 +# define ENGINE_CTRL_SET_PASSWORD_CALLBACK 2 +# define ENGINE_CTRL_HUP 3/* Close and reinitialise + * any handles/connections + * etc. */ +# define ENGINE_CTRL_SET_USER_INTERFACE 4/* Alternative to callback */ +# define ENGINE_CTRL_SET_CALLBACK_DATA 5/* User-specific data, used + * when calling the password + * callback and the user + * interface */ +# define ENGINE_CTRL_LOAD_CONFIGURATION 6/* Load a configuration, + * given a string that + * represents a file name + * or so */ +# define ENGINE_CTRL_LOAD_SECTION 7/* Load data from a given + * section in the already + * loaded configuration */ + +/* + * These control commands allow an application to deal with an arbitrary + * engine in a dynamic way. Warn: Negative return values indicate errors FOR + * THESE COMMANDS because zero is used to indicate 'end-of-list'. Other + * commands, including ENGINE-specific command types, return zero for an + * error. An ENGINE can choose to implement these ctrl functions, and can + * internally manage things however it chooses - it does so by setting the + * ENGINE_FLAGS_MANUAL_CMD_CTRL flag (using ENGINE_set_flags()). Otherwise + * the ENGINE_ctrl() code handles this on the ENGINE's behalf using the + * cmd_defns data (set using ENGINE_set_cmd_defns()). This means an ENGINE's + * ctrl() handler need only implement its own commands - the above "meta" + * commands will be taken care of. + */ + +/* + * Returns non-zero if the supplied ENGINE has a ctrl() handler. If "not", + * then all the remaining control commands will return failure, so it is + * worth checking this first if the caller is trying to "discover" the + * engine's capabilities and doesn't want errors generated unnecessarily. + */ +# define ENGINE_CTRL_HAS_CTRL_FUNCTION 10 +/* + * Returns a positive command number for the first command supported by the + * engine. Returns zero if no ctrl commands are supported. + */ +# define ENGINE_CTRL_GET_FIRST_CMD_TYPE 11 +/* + * The 'long' argument specifies a command implemented by the engine, and the + * return value is the next command supported, or zero if there are no more. + */ +# define ENGINE_CTRL_GET_NEXT_CMD_TYPE 12 +/* + * The 'void*' argument is a command name (cast from 'const char *'), and the + * return value is the command that corresponds to it. + */ +# define ENGINE_CTRL_GET_CMD_FROM_NAME 13 +/* + * The next two allow a command to be converted into its corresponding string + * form. In each case, the 'long' argument supplies the command. In the + * NAME_LEN case, the return value is the length of the command name (not + * counting a trailing EOL). In the NAME case, the 'void*' argument must be a + * string buffer large enough, and it will be populated with the name of the + * command (WITH a trailing EOL). + */ +# define ENGINE_CTRL_GET_NAME_LEN_FROM_CMD 14 +# define ENGINE_CTRL_GET_NAME_FROM_CMD 15 +/* The next two are similar but give a "short description" of a command. */ +# define ENGINE_CTRL_GET_DESC_LEN_FROM_CMD 16 +# define ENGINE_CTRL_GET_DESC_FROM_CMD 17 +/* + * With this command, the return value is the OR'd combination of + * ENGINE_CMD_FLAG_*** values that indicate what kind of input a given + * engine-specific ctrl command expects. + */ +# define ENGINE_CTRL_GET_CMD_FLAGS 18 + +/* + * ENGINE implementations should start the numbering of their own control + * commands from this value. (ie. ENGINE_CMD_BASE, ENGINE_CMD_BASE + 1, etc). + */ +# define ENGINE_CMD_BASE 200 + +/* + * NB: These 2 nCipher "chil" control commands are deprecated, and their + * functionality is now available through ENGINE-specific control commands + * (exposed through the above-mentioned 'CMD'-handling). Code using these 2 + * commands should be migrated to the more general command handling before + * these are removed. + */ + +/* Flags specific to the nCipher "chil" engine */ +# define ENGINE_CTRL_CHIL_SET_FORKCHECK 100 + /* + * Depending on the value of the (long)i argument, this sets or + * unsets the SimpleForkCheck flag in the CHIL API to enable or + * disable checking and workarounds for applications that fork(). + */ +# define ENGINE_CTRL_CHIL_NO_LOCKING 101 + /* + * This prevents the initialisation function from providing mutex + * callbacks to the nCipher library. + */ + +/* + * If an ENGINE supports its own specific control commands and wishes the + * framework to handle the above 'ENGINE_CMD_***'-manipulation commands on + * its behalf, it should supply a null-terminated array of ENGINE_CMD_DEFN + * entries to ENGINE_set_cmd_defns(). It should also implement a ctrl() + * handler that supports the stated commands (ie. the "cmd_num" entries as + * described by the array). NB: The array must be ordered in increasing order + * of cmd_num. "null-terminated" means that the last ENGINE_CMD_DEFN element + * has cmd_num set to zero and/or cmd_name set to NULL. + */ +typedef struct ENGINE_CMD_DEFN_st { + unsigned int cmd_num; /* The command number */ + const char *cmd_name; /* The command name itself */ + const char *cmd_desc; /* A short description of the command */ + unsigned int cmd_flags; /* The input the command expects */ +} ENGINE_CMD_DEFN; + +/* Generic function pointer */ +typedef int (*ENGINE_GEN_FUNC_PTR) (void); +/* Generic function pointer taking no arguments */ +typedef int (*ENGINE_GEN_INT_FUNC_PTR) (ENGINE *); +/* Specific control function pointer */ +typedef int (*ENGINE_CTRL_FUNC_PTR) (ENGINE *, int, long, void *, + void (*f) (void)); +/* Generic load_key function pointer */ +typedef EVP_PKEY *(*ENGINE_LOAD_KEY_PTR)(ENGINE *, const char *, + UI_METHOD *ui_method, + void *callback_data); +typedef int (*ENGINE_SSL_CLIENT_CERT_PTR) (ENGINE *, SSL *ssl, + STACK_OF(X509_NAME) *ca_dn, + X509 **pcert, EVP_PKEY **pkey, + STACK_OF(X509) **pother, + UI_METHOD *ui_method, + void *callback_data); +/*- + * These callback types are for an ENGINE's handler for cipher and digest logic. + * These handlers have these prototypes; + * int foo(ENGINE *e, const EVP_CIPHER **cipher, const int **nids, int nid); + * int foo(ENGINE *e, const EVP_MD **digest, const int **nids, int nid); + * Looking at how to implement these handlers in the case of cipher support, if + * the framework wants the EVP_CIPHER for 'nid', it will call; + * foo(e, &p_evp_cipher, NULL, nid); (return zero for failure) + * If the framework wants a list of supported 'nid's, it will call; + * foo(e, NULL, &p_nids, 0); (returns number of 'nids' or -1 for error) + */ +/* + * Returns to a pointer to the array of supported cipher 'nid's. If the + * second parameter is non-NULL it is set to the size of the returned array. + */ +typedef int (*ENGINE_CIPHERS_PTR) (ENGINE *, const EVP_CIPHER **, + const int **, int); +typedef int (*ENGINE_DIGESTS_PTR) (ENGINE *, const EVP_MD **, const int **, + int); +typedef int (*ENGINE_PKEY_METHS_PTR) (ENGINE *, EVP_PKEY_METHOD **, + const int **, int); +typedef int (*ENGINE_PKEY_ASN1_METHS_PTR) (ENGINE *, EVP_PKEY_ASN1_METHOD **, + const int **, int); +/* + * STRUCTURE functions ... all of these functions deal with pointers to + * ENGINE structures where the pointers have a "structural reference". This + * means that their reference is to allowed access to the structure but it + * does not imply that the structure is functional. To simply increment or + * decrement the structural reference count, use ENGINE_by_id and + * ENGINE_free. NB: This is not required when iterating using ENGINE_get_next + * as it will automatically decrement the structural reference count of the + * "current" ENGINE and increment the structural reference count of the + * ENGINE it returns (unless it is NULL). + */ + +/* Get the first/last "ENGINE" type available. */ +ENGINE *ENGINE_get_first(void); +ENGINE *ENGINE_get_last(void); +/* Iterate to the next/previous "ENGINE" type (NULL = end of the list). */ +ENGINE *ENGINE_get_next(ENGINE *e); +ENGINE *ENGINE_get_prev(ENGINE *e); +/* Add another "ENGINE" type into the array. */ +int ENGINE_add(ENGINE *e); +/* Remove an existing "ENGINE" type from the array. */ +int ENGINE_remove(ENGINE *e); +/* Retrieve an engine from the list by its unique "id" value. */ +ENGINE *ENGINE_by_id(const char *id); +/* Add all the built-in engines. */ +void ENGINE_load_openssl(void); +void ENGINE_load_dynamic(void); +# ifndef OPENSSL_NO_STATIC_ENGINE +void ENGINE_load_4758cca(void); +void ENGINE_load_aep(void); +void ENGINE_load_atalla(void); +void ENGINE_load_chil(void); +void ENGINE_load_cswift(void); +void ENGINE_load_nuron(void); +void ENGINE_load_sureware(void); +void ENGINE_load_ubsec(void); +void ENGINE_load_padlock(void); +void ENGINE_load_capi(void); +# ifndef OPENSSL_NO_GMP +void ENGINE_load_gmp(void); +# endif +# ifndef OPENSSL_NO_GOST +void ENGINE_load_gost(void); +# endif +# endif +void ENGINE_load_cryptodev(void); +void ENGINE_load_rdrand(void); +void ENGINE_load_builtin_engines(void); + +/* + * Get and set global flags (ENGINE_TABLE_FLAG_***) for the implementation + * "registry" handling. + */ +unsigned int ENGINE_get_table_flags(void); +void ENGINE_set_table_flags(unsigned int flags); + +/*- Manage registration of ENGINEs per "table". For each type, there are 3 + * functions; + * ENGINE_register_***(e) - registers the implementation from 'e' (if it has one) + * ENGINE_unregister_***(e) - unregister the implementation from 'e' + * ENGINE_register_all_***() - call ENGINE_register_***() for each 'e' in the list + * Cleanup is automatically registered from each table when required, so + * ENGINE_cleanup() will reverse any "register" operations. + */ + +int ENGINE_register_RSA(ENGINE *e); +void ENGINE_unregister_RSA(ENGINE *e); +void ENGINE_register_all_RSA(void); + +int ENGINE_register_DSA(ENGINE *e); +void ENGINE_unregister_DSA(ENGINE *e); +void ENGINE_register_all_DSA(void); + +int ENGINE_register_ECDH(ENGINE *e); +void ENGINE_unregister_ECDH(ENGINE *e); +void ENGINE_register_all_ECDH(void); + +int ENGINE_register_ECDSA(ENGINE *e); +void ENGINE_unregister_ECDSA(ENGINE *e); +void ENGINE_register_all_ECDSA(void); + +int ENGINE_register_DH(ENGINE *e); +void ENGINE_unregister_DH(ENGINE *e); +void ENGINE_register_all_DH(void); + +int ENGINE_register_RAND(ENGINE *e); +void ENGINE_unregister_RAND(ENGINE *e); +void ENGINE_register_all_RAND(void); + +int ENGINE_register_STORE(ENGINE *e); +void ENGINE_unregister_STORE(ENGINE *e); +void ENGINE_register_all_STORE(void); + +int ENGINE_register_ciphers(ENGINE *e); +void ENGINE_unregister_ciphers(ENGINE *e); +void ENGINE_register_all_ciphers(void); + +int ENGINE_register_digests(ENGINE *e); +void ENGINE_unregister_digests(ENGINE *e); +void ENGINE_register_all_digests(void); + +int ENGINE_register_pkey_meths(ENGINE *e); +void ENGINE_unregister_pkey_meths(ENGINE *e); +void ENGINE_register_all_pkey_meths(void); + +int ENGINE_register_pkey_asn1_meths(ENGINE *e); +void ENGINE_unregister_pkey_asn1_meths(ENGINE *e); +void ENGINE_register_all_pkey_asn1_meths(void); + +/* + * These functions register all support from the above categories. Note, use + * of these functions can result in static linkage of code your application + * may not need. If you only need a subset of functionality, consider using + * more selective initialisation. + */ +int ENGINE_register_complete(ENGINE *e); +int ENGINE_register_all_complete(void); + +/* + * Send parametrised control commands to the engine. The possibilities to + * send down an integer, a pointer to data or a function pointer are + * provided. Any of the parameters may or may not be NULL, depending on the + * command number. In actuality, this function only requires a structural + * (rather than functional) reference to an engine, but many control commands + * may require the engine be functional. The caller should be aware of trying + * commands that require an operational ENGINE, and only use functional + * references in such situations. + */ +int ENGINE_ctrl(ENGINE *e, int cmd, long i, void *p, void (*f) (void)); + +/* + * This function tests if an ENGINE-specific command is usable as a + * "setting". Eg. in an application's config file that gets processed through + * ENGINE_ctrl_cmd_string(). If this returns zero, it is not available to + * ENGINE_ctrl_cmd_string(), only ENGINE_ctrl(). + */ +int ENGINE_cmd_is_executable(ENGINE *e, int cmd); + +/* + * This function works like ENGINE_ctrl() with the exception of taking a + * command name instead of a command number, and can handle optional + * commands. See the comment on ENGINE_ctrl_cmd_string() for an explanation + * on how to use the cmd_name and cmd_optional. + */ +int ENGINE_ctrl_cmd(ENGINE *e, const char *cmd_name, + long i, void *p, void (*f) (void), int cmd_optional); + +/* + * This function passes a command-name and argument to an ENGINE. The + * cmd_name is converted to a command number and the control command is + * called using 'arg' as an argument (unless the ENGINE doesn't support such + * a command, in which case no control command is called). The command is + * checked for input flags, and if necessary the argument will be converted + * to a numeric value. If cmd_optional is non-zero, then if the ENGINE + * doesn't support the given cmd_name the return value will be success + * anyway. This function is intended for applications to use so that users + * (or config files) can supply engine-specific config data to the ENGINE at + * run-time to control behaviour of specific engines. As such, it shouldn't + * be used for calling ENGINE_ctrl() functions that return data, deal with + * binary data, or that are otherwise supposed to be used directly through + * ENGINE_ctrl() in application code. Any "return" data from an ENGINE_ctrl() + * operation in this function will be lost - the return value is interpreted + * as failure if the return value is zero, success otherwise, and this + * function returns a boolean value as a result. In other words, vendors of + * 'ENGINE'-enabled devices should write ENGINE implementations with + * parameterisations that work in this scheme, so that compliant ENGINE-based + * applications can work consistently with the same configuration for the + * same ENGINE-enabled devices, across applications. + */ +int ENGINE_ctrl_cmd_string(ENGINE *e, const char *cmd_name, const char *arg, + int cmd_optional); + +/* + * These functions are useful for manufacturing new ENGINE structures. They + * don't address reference counting at all - one uses them to populate an + * ENGINE structure with personalised implementations of things prior to + * using it directly or adding it to the builtin ENGINE list in OpenSSL. + * These are also here so that the ENGINE structure doesn't have to be + * exposed and break binary compatibility! + */ +ENGINE *ENGINE_new(void); +int ENGINE_free(ENGINE *e); +int ENGINE_up_ref(ENGINE *e); +int ENGINE_set_id(ENGINE *e, const char *id); +int ENGINE_set_name(ENGINE *e, const char *name); +int ENGINE_set_RSA(ENGINE *e, const RSA_METHOD *rsa_meth); +int ENGINE_set_DSA(ENGINE *e, const DSA_METHOD *dsa_meth); +int ENGINE_set_ECDH(ENGINE *e, const ECDH_METHOD *ecdh_meth); +int ENGINE_set_ECDSA(ENGINE *e, const ECDSA_METHOD *ecdsa_meth); +int ENGINE_set_DH(ENGINE *e, const DH_METHOD *dh_meth); +int ENGINE_set_RAND(ENGINE *e, const RAND_METHOD *rand_meth); +int ENGINE_set_STORE(ENGINE *e, const STORE_METHOD *store_meth); +int ENGINE_set_destroy_function(ENGINE *e, ENGINE_GEN_INT_FUNC_PTR destroy_f); +int ENGINE_set_init_function(ENGINE *e, ENGINE_GEN_INT_FUNC_PTR init_f); +int ENGINE_set_finish_function(ENGINE *e, ENGINE_GEN_INT_FUNC_PTR finish_f); +int ENGINE_set_ctrl_function(ENGINE *e, ENGINE_CTRL_FUNC_PTR ctrl_f); +int ENGINE_set_load_privkey_function(ENGINE *e, + ENGINE_LOAD_KEY_PTR loadpriv_f); +int ENGINE_set_load_pubkey_function(ENGINE *e, ENGINE_LOAD_KEY_PTR loadpub_f); +int ENGINE_set_load_ssl_client_cert_function(ENGINE *e, + ENGINE_SSL_CLIENT_CERT_PTR + loadssl_f); +int ENGINE_set_ciphers(ENGINE *e, ENGINE_CIPHERS_PTR f); +int ENGINE_set_digests(ENGINE *e, ENGINE_DIGESTS_PTR f); +int ENGINE_set_pkey_meths(ENGINE *e, ENGINE_PKEY_METHS_PTR f); +int ENGINE_set_pkey_asn1_meths(ENGINE *e, ENGINE_PKEY_ASN1_METHS_PTR f); +int ENGINE_set_flags(ENGINE *e, int flags); +int ENGINE_set_cmd_defns(ENGINE *e, const ENGINE_CMD_DEFN *defns); +/* These functions allow control over any per-structure ENGINE data. */ +int ENGINE_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, + CRYPTO_EX_free *free_func); +int ENGINE_set_ex_data(ENGINE *e, int idx, void *arg); +void *ENGINE_get_ex_data(const ENGINE *e, int idx); + +/* + * This function cleans up anything that needs it. Eg. the ENGINE_add() + * function automatically ensures the list cleanup function is registered to + * be called from ENGINE_cleanup(). Similarly, all ENGINE_register_*** + * functions ensure ENGINE_cleanup() will clean up after them. + */ +void ENGINE_cleanup(void); + +/* + * These return values from within the ENGINE structure. These can be useful + * with functional references as well as structural references - it depends + * which you obtained. Using the result for functional purposes if you only + * obtained a structural reference may be problematic! + */ +const char *ENGINE_get_id(const ENGINE *e); +const char *ENGINE_get_name(const ENGINE *e); +const RSA_METHOD *ENGINE_get_RSA(const ENGINE *e); +const DSA_METHOD *ENGINE_get_DSA(const ENGINE *e); +const ECDH_METHOD *ENGINE_get_ECDH(const ENGINE *e); +const ECDSA_METHOD *ENGINE_get_ECDSA(const ENGINE *e); +const DH_METHOD *ENGINE_get_DH(const ENGINE *e); +const RAND_METHOD *ENGINE_get_RAND(const ENGINE *e); +const STORE_METHOD *ENGINE_get_STORE(const ENGINE *e); +ENGINE_GEN_INT_FUNC_PTR ENGINE_get_destroy_function(const ENGINE *e); +ENGINE_GEN_INT_FUNC_PTR ENGINE_get_init_function(const ENGINE *e); +ENGINE_GEN_INT_FUNC_PTR ENGINE_get_finish_function(const ENGINE *e); +ENGINE_CTRL_FUNC_PTR ENGINE_get_ctrl_function(const ENGINE *e); +ENGINE_LOAD_KEY_PTR ENGINE_get_load_privkey_function(const ENGINE *e); +ENGINE_LOAD_KEY_PTR ENGINE_get_load_pubkey_function(const ENGINE *e); +ENGINE_SSL_CLIENT_CERT_PTR ENGINE_get_ssl_client_cert_function(const ENGINE + *e); +ENGINE_CIPHERS_PTR ENGINE_get_ciphers(const ENGINE *e); +ENGINE_DIGESTS_PTR ENGINE_get_digests(const ENGINE *e); +ENGINE_PKEY_METHS_PTR ENGINE_get_pkey_meths(const ENGINE *e); +ENGINE_PKEY_ASN1_METHS_PTR ENGINE_get_pkey_asn1_meths(const ENGINE *e); +const EVP_CIPHER *ENGINE_get_cipher(ENGINE *e, int nid); +const EVP_MD *ENGINE_get_digest(ENGINE *e, int nid); +const EVP_PKEY_METHOD *ENGINE_get_pkey_meth(ENGINE *e, int nid); +const EVP_PKEY_ASN1_METHOD *ENGINE_get_pkey_asn1_meth(ENGINE *e, int nid); +const EVP_PKEY_ASN1_METHOD *ENGINE_get_pkey_asn1_meth_str(ENGINE *e, + const char *str, + int len); +const EVP_PKEY_ASN1_METHOD *ENGINE_pkey_asn1_find_str(ENGINE **pe, + const char *str, + int len); +const ENGINE_CMD_DEFN *ENGINE_get_cmd_defns(const ENGINE *e); +int ENGINE_get_flags(const ENGINE *e); + +/* + * FUNCTIONAL functions. These functions deal with ENGINE structures that + * have (or will) be initialised for use. Broadly speaking, the structural + * functions are useful for iterating the list of available engine types, + * creating new engine types, and other "list" operations. These functions + * actually deal with ENGINEs that are to be used. As such these functions + * can fail (if applicable) when particular engines are unavailable - eg. if + * a hardware accelerator is not attached or not functioning correctly. Each + * ENGINE has 2 reference counts; structural and functional. Every time a + * functional reference is obtained or released, a corresponding structural + * reference is automatically obtained or released too. + */ + +/* + * Initialise a engine type for use (or up its reference count if it's + * already in use). This will fail if the engine is not currently operational + * and cannot initialise. + */ +int ENGINE_init(ENGINE *e); +/* + * Free a functional reference to a engine type. This does not require a + * corresponding call to ENGINE_free as it also releases a structural + * reference. + */ +int ENGINE_finish(ENGINE *e); + +/* + * The following functions handle keys that are stored in some secondary + * location, handled by the engine. The storage may be on a card or + * whatever. + */ +EVP_PKEY *ENGINE_load_private_key(ENGINE *e, const char *key_id, + UI_METHOD *ui_method, void *callback_data); +EVP_PKEY *ENGINE_load_public_key(ENGINE *e, const char *key_id, + UI_METHOD *ui_method, void *callback_data); +int ENGINE_load_ssl_client_cert(ENGINE *e, SSL *s, + STACK_OF(X509_NAME) *ca_dn, X509 **pcert, + EVP_PKEY **ppkey, STACK_OF(X509) **pother, + UI_METHOD *ui_method, void *callback_data); + +/* + * This returns a pointer for the current ENGINE structure that is (by + * default) performing any RSA operations. The value returned is an + * incremented reference, so it should be free'd (ENGINE_finish) before it is + * discarded. + */ +ENGINE *ENGINE_get_default_RSA(void); +/* Same for the other "methods" */ +ENGINE *ENGINE_get_default_DSA(void); +ENGINE *ENGINE_get_default_ECDH(void); +ENGINE *ENGINE_get_default_ECDSA(void); +ENGINE *ENGINE_get_default_DH(void); +ENGINE *ENGINE_get_default_RAND(void); +/* + * These functions can be used to get a functional reference to perform + * ciphering or digesting corresponding to "nid". + */ +ENGINE *ENGINE_get_cipher_engine(int nid); +ENGINE *ENGINE_get_digest_engine(int nid); +ENGINE *ENGINE_get_pkey_meth_engine(int nid); +ENGINE *ENGINE_get_pkey_asn1_meth_engine(int nid); + +/* + * This sets a new default ENGINE structure for performing RSA operations. If + * the result is non-zero (success) then the ENGINE structure will have had + * its reference count up'd so the caller should still free their own + * reference 'e'. + */ +int ENGINE_set_default_RSA(ENGINE *e); +int ENGINE_set_default_string(ENGINE *e, const char *def_list); +/* Same for the other "methods" */ +int ENGINE_set_default_DSA(ENGINE *e); +int ENGINE_set_default_ECDH(ENGINE *e); +int ENGINE_set_default_ECDSA(ENGINE *e); +int ENGINE_set_default_DH(ENGINE *e); +int ENGINE_set_default_RAND(ENGINE *e); +int ENGINE_set_default_ciphers(ENGINE *e); +int ENGINE_set_default_digests(ENGINE *e); +int ENGINE_set_default_pkey_meths(ENGINE *e); +int ENGINE_set_default_pkey_asn1_meths(ENGINE *e); + +/* + * The combination "set" - the flags are bitwise "OR"d from the + * ENGINE_METHOD_*** defines above. As with the "ENGINE_register_complete()" + * function, this function can result in unnecessary static linkage. If your + * application requires only specific functionality, consider using more + * selective functions. + */ +int ENGINE_set_default(ENGINE *e, unsigned int flags); + +void ENGINE_add_conf_module(void); + +/* Deprecated functions ... */ +/* int ENGINE_clear_defaults(void); */ + +/**************************/ +/* DYNAMIC ENGINE SUPPORT */ +/**************************/ + +/* Binary/behaviour compatibility levels */ +# define OSSL_DYNAMIC_VERSION (unsigned long)0x00020000 +/* + * Binary versions older than this are too old for us (whether we're a loader + * or a loadee) + */ +# define OSSL_DYNAMIC_OLDEST (unsigned long)0x00020000 + +/* + * When compiling an ENGINE entirely as an external shared library, loadable + * by the "dynamic" ENGINE, these types are needed. The 'dynamic_fns' + * structure type provides the calling application's (or library's) error + * functionality and memory management function pointers to the loaded + * library. These should be used/set in the loaded library code so that the + * loading application's 'state' will be used/changed in all operations. The + * 'static_state' pointer allows the loaded library to know if it shares the + * same static data as the calling application (or library), and thus whether + * these callbacks need to be set or not. + */ +typedef void *(*dyn_MEM_malloc_cb) (size_t); +typedef void *(*dyn_MEM_realloc_cb) (void *, size_t); +typedef void (*dyn_MEM_free_cb) (void *); +typedef struct st_dynamic_MEM_fns { + dyn_MEM_malloc_cb malloc_cb; + dyn_MEM_realloc_cb realloc_cb; + dyn_MEM_free_cb free_cb; +} dynamic_MEM_fns; +/* + * FIXME: Perhaps the memory and locking code (crypto.h) should declare and + * use these types so we (and any other dependant code) can simplify a bit?? + */ +typedef void (*dyn_lock_locking_cb) (int, int, const char *, int); +typedef int (*dyn_lock_add_lock_cb) (int *, int, int, const char *, int); +typedef struct CRYPTO_dynlock_value *(*dyn_dynlock_create_cb) (const char *, + int); +typedef void (*dyn_dynlock_lock_cb) (int, struct CRYPTO_dynlock_value *, + const char *, int); +typedef void (*dyn_dynlock_destroy_cb) (struct CRYPTO_dynlock_value *, + const char *, int); +typedef struct st_dynamic_LOCK_fns { + dyn_lock_locking_cb lock_locking_cb; + dyn_lock_add_lock_cb lock_add_lock_cb; + dyn_dynlock_create_cb dynlock_create_cb; + dyn_dynlock_lock_cb dynlock_lock_cb; + dyn_dynlock_destroy_cb dynlock_destroy_cb; +} dynamic_LOCK_fns; +/* The top-level structure */ +typedef struct st_dynamic_fns { + void *static_state; + const ERR_FNS *err_fns; + const CRYPTO_EX_DATA_IMPL *ex_data_fns; + dynamic_MEM_fns mem_fns; + dynamic_LOCK_fns lock_fns; +} dynamic_fns; + +/* + * The version checking function should be of this prototype. NB: The + * ossl_version value passed in is the OSSL_DYNAMIC_VERSION of the loading + * code. If this function returns zero, it indicates a (potential) version + * incompatibility and the loaded library doesn't believe it can proceed. + * Otherwise, the returned value is the (latest) version supported by the + * loading library. The loader may still decide that the loaded code's + * version is unsatisfactory and could veto the load. The function is + * expected to be implemented with the symbol name "v_check", and a default + * implementation can be fully instantiated with + * IMPLEMENT_DYNAMIC_CHECK_FN(). + */ +typedef unsigned long (*dynamic_v_check_fn) (unsigned long ossl_version); +# define IMPLEMENT_DYNAMIC_CHECK_FN() \ + OPENSSL_EXPORT unsigned long v_check(unsigned long v); \ + OPENSSL_EXPORT unsigned long v_check(unsigned long v) { \ + if(v >= OSSL_DYNAMIC_OLDEST) return OSSL_DYNAMIC_VERSION; \ + return 0; } + +/* + * This function is passed the ENGINE structure to initialise with its own + * function and command settings. It should not adjust the structural or + * functional reference counts. If this function returns zero, (a) the load + * will be aborted, (b) the previous ENGINE state will be memcpy'd back onto + * the structure, and (c) the shared library will be unloaded. So + * implementations should do their own internal cleanup in failure + * circumstances otherwise they could leak. The 'id' parameter, if non-NULL, + * represents the ENGINE id that the loader is looking for. If this is NULL, + * the shared library can choose to return failure or to initialise a + * 'default' ENGINE. If non-NULL, the shared library must initialise only an + * ENGINE matching the passed 'id'. The function is expected to be + * implemented with the symbol name "bind_engine". A standard implementation + * can be instantiated with IMPLEMENT_DYNAMIC_BIND_FN(fn) where the parameter + * 'fn' is a callback function that populates the ENGINE structure and + * returns an int value (zero for failure). 'fn' should have prototype; + * [static] int fn(ENGINE *e, const char *id); + */ +typedef int (*dynamic_bind_engine) (ENGINE *e, const char *id, + const dynamic_fns *fns); +# define IMPLEMENT_DYNAMIC_BIND_FN(fn) \ + OPENSSL_EXPORT \ + int bind_engine(ENGINE *e, const char *id, const dynamic_fns *fns); \ + OPENSSL_EXPORT \ + int bind_engine(ENGINE *e, const char *id, const dynamic_fns *fns) { \ + if(ENGINE_get_static_state() == fns->static_state) goto skip_cbs; \ + if(!CRYPTO_set_mem_functions(fns->mem_fns.malloc_cb, \ + fns->mem_fns.realloc_cb, fns->mem_fns.free_cb)) \ + return 0; \ + CRYPTO_set_locking_callback(fns->lock_fns.lock_locking_cb); \ + CRYPTO_set_add_lock_callback(fns->lock_fns.lock_add_lock_cb); \ + CRYPTO_set_dynlock_create_callback(fns->lock_fns.dynlock_create_cb); \ + CRYPTO_set_dynlock_lock_callback(fns->lock_fns.dynlock_lock_cb); \ + CRYPTO_set_dynlock_destroy_callback(fns->lock_fns.dynlock_destroy_cb); \ + if(!CRYPTO_set_ex_data_implementation(fns->ex_data_fns)) \ + return 0; \ + if(!ERR_set_implementation(fns->err_fns)) return 0; \ + skip_cbs: \ + if(!fn(e,id)) return 0; \ + return 1; } + +/* + * If the loading application (or library) and the loaded ENGINE library + * share the same static data (eg. they're both dynamically linked to the + * same libcrypto.so) we need a way to avoid trying to set system callbacks - + * this would fail, and for the same reason that it's unnecessary to try. If + * the loaded ENGINE has (or gets from through the loader) its own copy of + * the libcrypto static data, we will need to set the callbacks. The easiest + * way to detect this is to have a function that returns a pointer to some + * static data and let the loading application and loaded ENGINE compare + * their respective values. + */ +void *ENGINE_get_static_state(void); + +# if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(HAVE_CRYPTODEV) +void ENGINE_setup_bsd_cryptodev(void); +# endif + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_ENGINE_strings(void); + +/* Error codes for the ENGINE functions. */ + +/* Function codes. */ +# define ENGINE_F_DYNAMIC_CTRL 180 +# define ENGINE_F_DYNAMIC_GET_DATA_CTX 181 +# define ENGINE_F_DYNAMIC_LOAD 182 +# define ENGINE_F_DYNAMIC_SET_DATA_CTX 183 +# define ENGINE_F_ENGINE_ADD 105 +# define ENGINE_F_ENGINE_BY_ID 106 +# define ENGINE_F_ENGINE_CMD_IS_EXECUTABLE 170 +# define ENGINE_F_ENGINE_CTRL 142 +# define ENGINE_F_ENGINE_CTRL_CMD 178 +# define ENGINE_F_ENGINE_CTRL_CMD_STRING 171 +# define ENGINE_F_ENGINE_FINISH 107 +# define ENGINE_F_ENGINE_FREE_UTIL 108 +# define ENGINE_F_ENGINE_GET_CIPHER 185 +# define ENGINE_F_ENGINE_GET_DEFAULT_TYPE 177 +# define ENGINE_F_ENGINE_GET_DIGEST 186 +# define ENGINE_F_ENGINE_GET_NEXT 115 +# define ENGINE_F_ENGINE_GET_PKEY_ASN1_METH 193 +# define ENGINE_F_ENGINE_GET_PKEY_METH 192 +# define ENGINE_F_ENGINE_GET_PREV 116 +# define ENGINE_F_ENGINE_INIT 119 +# define ENGINE_F_ENGINE_LIST_ADD 120 +# define ENGINE_F_ENGINE_LIST_REMOVE 121 +# define ENGINE_F_ENGINE_LOAD_PRIVATE_KEY 150 +# define ENGINE_F_ENGINE_LOAD_PUBLIC_KEY 151 +# define ENGINE_F_ENGINE_LOAD_SSL_CLIENT_CERT 194 +# define ENGINE_F_ENGINE_NEW 122 +# define ENGINE_F_ENGINE_REMOVE 123 +# define ENGINE_F_ENGINE_SET_DEFAULT_STRING 189 +# define ENGINE_F_ENGINE_SET_DEFAULT_TYPE 126 +# define ENGINE_F_ENGINE_SET_ID 129 +# define ENGINE_F_ENGINE_SET_NAME 130 +# define ENGINE_F_ENGINE_TABLE_REGISTER 184 +# define ENGINE_F_ENGINE_UNLOAD_KEY 152 +# define ENGINE_F_ENGINE_UNLOCKED_FINISH 191 +# define ENGINE_F_ENGINE_UP_REF 190 +# define ENGINE_F_INT_CTRL_HELPER 172 +# define ENGINE_F_INT_ENGINE_CONFIGURE 188 +# define ENGINE_F_INT_ENGINE_MODULE_INIT 187 +# define ENGINE_F_LOG_MESSAGE 141 + +/* Reason codes. */ +# define ENGINE_R_ALREADY_LOADED 100 +# define ENGINE_R_ARGUMENT_IS_NOT_A_NUMBER 133 +# define ENGINE_R_CMD_NOT_EXECUTABLE 134 +# define ENGINE_R_COMMAND_TAKES_INPUT 135 +# define ENGINE_R_COMMAND_TAKES_NO_INPUT 136 +# define ENGINE_R_CONFLICTING_ENGINE_ID 103 +# define ENGINE_R_CTRL_COMMAND_NOT_IMPLEMENTED 119 +# define ENGINE_R_DH_NOT_IMPLEMENTED 139 +# define ENGINE_R_DSA_NOT_IMPLEMENTED 140 +# define ENGINE_R_DSO_FAILURE 104 +# define ENGINE_R_DSO_NOT_FOUND 132 +# define ENGINE_R_ENGINES_SECTION_ERROR 148 +# define ENGINE_R_ENGINE_CONFIGURATION_ERROR 102 +# define ENGINE_R_ENGINE_IS_NOT_IN_LIST 105 +# define ENGINE_R_ENGINE_SECTION_ERROR 149 +# define ENGINE_R_FAILED_LOADING_PRIVATE_KEY 128 +# define ENGINE_R_FAILED_LOADING_PUBLIC_KEY 129 +# define ENGINE_R_FINISH_FAILED 106 +# define ENGINE_R_GET_HANDLE_FAILED 107 +# define ENGINE_R_ID_OR_NAME_MISSING 108 +# define ENGINE_R_INIT_FAILED 109 +# define ENGINE_R_INTERNAL_LIST_ERROR 110 +# define ENGINE_R_INVALID_ARGUMENT 143 +# define ENGINE_R_INVALID_CMD_NAME 137 +# define ENGINE_R_INVALID_CMD_NUMBER 138 +# define ENGINE_R_INVALID_INIT_VALUE 151 +# define ENGINE_R_INVALID_STRING 150 +# define ENGINE_R_NOT_INITIALISED 117 +# define ENGINE_R_NOT_LOADED 112 +# define ENGINE_R_NO_CONTROL_FUNCTION 120 +# define ENGINE_R_NO_INDEX 144 +# define ENGINE_R_NO_LOAD_FUNCTION 125 +# define ENGINE_R_NO_REFERENCE 130 +# define ENGINE_R_NO_SUCH_ENGINE 116 +# define ENGINE_R_NO_UNLOAD_FUNCTION 126 +# define ENGINE_R_PROVIDE_PARAMETERS 113 +# define ENGINE_R_RSA_NOT_IMPLEMENTED 141 +# define ENGINE_R_UNIMPLEMENTED_CIPHER 146 +# define ENGINE_R_UNIMPLEMENTED_DIGEST 147 +# define ENGINE_R_UNIMPLEMENTED_PUBLIC_KEY_METHOD 101 +# define ENGINE_R_VERSION_INCOMPATIBILITY 145 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/win/openssl/include/openssl/err.h b/hdssd/external/win/openssl/include/openssl/err.h new file mode 100644 index 0000000..585aa8b --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/err.h @@ -0,0 +1,389 @@ +/* crypto/err/err.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ +/* ==================================================================== + * Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_ERR_H +# define HEADER_ERR_H + +# include + +# ifndef OPENSSL_NO_FP_API +# include +# include +# endif + +# include +# ifndef OPENSSL_NO_BIO +# include +# endif +# ifndef OPENSSL_NO_LHASH +# include +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +# ifndef OPENSSL_NO_ERR +# define ERR_PUT_error(a,b,c,d,e) ERR_put_error(a,b,c,d,e) +# else +# define ERR_PUT_error(a,b,c,d,e) ERR_put_error(a,b,c,NULL,0) +# endif + +# include + +# define ERR_TXT_MALLOCED 0x01 +# define ERR_TXT_STRING 0x02 + +# define ERR_FLAG_MARK 0x01 + +# define ERR_NUM_ERRORS 16 +typedef struct err_state_st { + CRYPTO_THREADID tid; + int err_flags[ERR_NUM_ERRORS]; + unsigned long err_buffer[ERR_NUM_ERRORS]; + char *err_data[ERR_NUM_ERRORS]; + int err_data_flags[ERR_NUM_ERRORS]; + const char *err_file[ERR_NUM_ERRORS]; + int err_line[ERR_NUM_ERRORS]; + int top, bottom; +} ERR_STATE; + +/* library */ +# define ERR_LIB_NONE 1 +# define ERR_LIB_SYS 2 +# define ERR_LIB_BN 3 +# define ERR_LIB_RSA 4 +# define ERR_LIB_DH 5 +# define ERR_LIB_EVP 6 +# define ERR_LIB_BUF 7 +# define ERR_LIB_OBJ 8 +# define ERR_LIB_PEM 9 +# define ERR_LIB_DSA 10 +# define ERR_LIB_X509 11 +/* #define ERR_LIB_METH 12 */ +# define ERR_LIB_ASN1 13 +# define ERR_LIB_CONF 14 +# define ERR_LIB_CRYPTO 15 +# define ERR_LIB_EC 16 +# define ERR_LIB_SSL 20 +/* #define ERR_LIB_SSL23 21 */ +/* #define ERR_LIB_SSL2 22 */ +/* #define ERR_LIB_SSL3 23 */ +/* #define ERR_LIB_RSAREF 30 */ +/* #define ERR_LIB_PROXY 31 */ +# define ERR_LIB_BIO 32 +# define ERR_LIB_PKCS7 33 +# define ERR_LIB_X509V3 34 +# define ERR_LIB_PKCS12 35 +# define ERR_LIB_RAND 36 +# define ERR_LIB_DSO 37 +# define ERR_LIB_ENGINE 38 +# define ERR_LIB_OCSP 39 +# define ERR_LIB_UI 40 +# define ERR_LIB_COMP 41 +# define ERR_LIB_ECDSA 42 +# define ERR_LIB_ECDH 43 +# define ERR_LIB_STORE 44 +# define ERR_LIB_FIPS 45 +# define ERR_LIB_CMS 46 +# define ERR_LIB_TS 47 +# define ERR_LIB_HMAC 48 +# define ERR_LIB_JPAKE 49 + +# define ERR_LIB_USER 128 + +# define SYSerr(f,r) ERR_PUT_error(ERR_LIB_SYS,(f),(r),__FILE__,__LINE__) +# define BNerr(f,r) ERR_PUT_error(ERR_LIB_BN,(f),(r),__FILE__,__LINE__) +# define RSAerr(f,r) ERR_PUT_error(ERR_LIB_RSA,(f),(r),__FILE__,__LINE__) +# define DHerr(f,r) ERR_PUT_error(ERR_LIB_DH,(f),(r),__FILE__,__LINE__) +# define EVPerr(f,r) ERR_PUT_error(ERR_LIB_EVP,(f),(r),__FILE__,__LINE__) +# define BUFerr(f,r) ERR_PUT_error(ERR_LIB_BUF,(f),(r),__FILE__,__LINE__) +# define OBJerr(f,r) ERR_PUT_error(ERR_LIB_OBJ,(f),(r),__FILE__,__LINE__) +# define PEMerr(f,r) ERR_PUT_error(ERR_LIB_PEM,(f),(r),__FILE__,__LINE__) +# define DSAerr(f,r) ERR_PUT_error(ERR_LIB_DSA,(f),(r),__FILE__,__LINE__) +# define X509err(f,r) ERR_PUT_error(ERR_LIB_X509,(f),(r),__FILE__,__LINE__) +# define ASN1err(f,r) ERR_PUT_error(ERR_LIB_ASN1,(f),(r),__FILE__,__LINE__) +# define CONFerr(f,r) ERR_PUT_error(ERR_LIB_CONF,(f),(r),__FILE__,__LINE__) +# define CRYPTOerr(f,r) ERR_PUT_error(ERR_LIB_CRYPTO,(f),(r),__FILE__,__LINE__) +# define ECerr(f,r) ERR_PUT_error(ERR_LIB_EC,(f),(r),__FILE__,__LINE__) +# define SSLerr(f,r) ERR_PUT_error(ERR_LIB_SSL,(f),(r),__FILE__,__LINE__) +# define BIOerr(f,r) ERR_PUT_error(ERR_LIB_BIO,(f),(r),__FILE__,__LINE__) +# define PKCS7err(f,r) ERR_PUT_error(ERR_LIB_PKCS7,(f),(r),__FILE__,__LINE__) +# define X509V3err(f,r) ERR_PUT_error(ERR_LIB_X509V3,(f),(r),__FILE__,__LINE__) +# define PKCS12err(f,r) ERR_PUT_error(ERR_LIB_PKCS12,(f),(r),__FILE__,__LINE__) +# define RANDerr(f,r) ERR_PUT_error(ERR_LIB_RAND,(f),(r),__FILE__,__LINE__) +# define DSOerr(f,r) ERR_PUT_error(ERR_LIB_DSO,(f),(r),__FILE__,__LINE__) +# define ENGINEerr(f,r) ERR_PUT_error(ERR_LIB_ENGINE,(f),(r),__FILE__,__LINE__) +# define OCSPerr(f,r) ERR_PUT_error(ERR_LIB_OCSP,(f),(r),__FILE__,__LINE__) +# define UIerr(f,r) ERR_PUT_error(ERR_LIB_UI,(f),(r),__FILE__,__LINE__) +# define COMPerr(f,r) ERR_PUT_error(ERR_LIB_COMP,(f),(r),__FILE__,__LINE__) +# define ECDSAerr(f,r) ERR_PUT_error(ERR_LIB_ECDSA,(f),(r),__FILE__,__LINE__) +# define ECDHerr(f,r) ERR_PUT_error(ERR_LIB_ECDH,(f),(r),__FILE__,__LINE__) +# define STOREerr(f,r) ERR_PUT_error(ERR_LIB_STORE,(f),(r),__FILE__,__LINE__) +# define FIPSerr(f,r) ERR_PUT_error(ERR_LIB_FIPS,(f),(r),__FILE__,__LINE__) +# define CMSerr(f,r) ERR_PUT_error(ERR_LIB_CMS,(f),(r),__FILE__,__LINE__) +# define TSerr(f,r) ERR_PUT_error(ERR_LIB_TS,(f),(r),__FILE__,__LINE__) +# define HMACerr(f,r) ERR_PUT_error(ERR_LIB_HMAC,(f),(r),__FILE__,__LINE__) +# define JPAKEerr(f,r) ERR_PUT_error(ERR_LIB_JPAKE,(f),(r),__FILE__,__LINE__) + +/* + * Borland C seems too stupid to be able to shift and do longs in the + * pre-processor :-( + */ +# define ERR_PACK(l,f,r) (((((unsigned long)l)&0xffL)*0x1000000)| \ + ((((unsigned long)f)&0xfffL)*0x1000)| \ + ((((unsigned long)r)&0xfffL))) +# define ERR_GET_LIB(l) (int)((((unsigned long)l)>>24L)&0xffL) +# define ERR_GET_FUNC(l) (int)((((unsigned long)l)>>12L)&0xfffL) +# define ERR_GET_REASON(l) (int)((l)&0xfffL) +# define ERR_FATAL_ERROR(l) (int)((l)&ERR_R_FATAL) + +/* OS functions */ +# define SYS_F_FOPEN 1 +# define SYS_F_CONNECT 2 +# define SYS_F_GETSERVBYNAME 3 +# define SYS_F_SOCKET 4 +# define SYS_F_IOCTLSOCKET 5 +# define SYS_F_BIND 6 +# define SYS_F_LISTEN 7 +# define SYS_F_ACCEPT 8 +# define SYS_F_WSASTARTUP 9/* Winsock stuff */ +# define SYS_F_OPENDIR 10 +# define SYS_F_FREAD 11 + +/* reasons */ +# define ERR_R_SYS_LIB ERR_LIB_SYS/* 2 */ +# define ERR_R_BN_LIB ERR_LIB_BN/* 3 */ +# define ERR_R_RSA_LIB ERR_LIB_RSA/* 4 */ +# define ERR_R_DH_LIB ERR_LIB_DH/* 5 */ +# define ERR_R_EVP_LIB ERR_LIB_EVP/* 6 */ +# define ERR_R_BUF_LIB ERR_LIB_BUF/* 7 */ +# define ERR_R_OBJ_LIB ERR_LIB_OBJ/* 8 */ +# define ERR_R_PEM_LIB ERR_LIB_PEM/* 9 */ +# define ERR_R_DSA_LIB ERR_LIB_DSA/* 10 */ +# define ERR_R_X509_LIB ERR_LIB_X509/* 11 */ +# define ERR_R_ASN1_LIB ERR_LIB_ASN1/* 13 */ +# define ERR_R_CONF_LIB ERR_LIB_CONF/* 14 */ +# define ERR_R_CRYPTO_LIB ERR_LIB_CRYPTO/* 15 */ +# define ERR_R_EC_LIB ERR_LIB_EC/* 16 */ +# define ERR_R_SSL_LIB ERR_LIB_SSL/* 20 */ +# define ERR_R_BIO_LIB ERR_LIB_BIO/* 32 */ +# define ERR_R_PKCS7_LIB ERR_LIB_PKCS7/* 33 */ +# define ERR_R_X509V3_LIB ERR_LIB_X509V3/* 34 */ +# define ERR_R_PKCS12_LIB ERR_LIB_PKCS12/* 35 */ +# define ERR_R_RAND_LIB ERR_LIB_RAND/* 36 */ +# define ERR_R_DSO_LIB ERR_LIB_DSO/* 37 */ +# define ERR_R_ENGINE_LIB ERR_LIB_ENGINE/* 38 */ +# define ERR_R_OCSP_LIB ERR_LIB_OCSP/* 39 */ +# define ERR_R_UI_LIB ERR_LIB_UI/* 40 */ +# define ERR_R_COMP_LIB ERR_LIB_COMP/* 41 */ +# define ERR_R_ECDSA_LIB ERR_LIB_ECDSA/* 42 */ +# define ERR_R_ECDH_LIB ERR_LIB_ECDH/* 43 */ +# define ERR_R_STORE_LIB ERR_LIB_STORE/* 44 */ +# define ERR_R_TS_LIB ERR_LIB_TS/* 45 */ + +# define ERR_R_NESTED_ASN1_ERROR 58 +# define ERR_R_BAD_ASN1_OBJECT_HEADER 59 +# define ERR_R_BAD_GET_ASN1_OBJECT_CALL 60 +# define ERR_R_EXPECTING_AN_ASN1_SEQUENCE 61 +# define ERR_R_ASN1_LENGTH_MISMATCH 62 +# define ERR_R_MISSING_ASN1_EOS 63 + +/* fatal error */ +# define ERR_R_FATAL 64 +# define ERR_R_MALLOC_FAILURE (1|ERR_R_FATAL) +# define ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED (2|ERR_R_FATAL) +# define ERR_R_PASSED_NULL_PARAMETER (3|ERR_R_FATAL) +# define ERR_R_INTERNAL_ERROR (4|ERR_R_FATAL) +# define ERR_R_DISABLED (5|ERR_R_FATAL) + +/* + * 99 is the maximum possible ERR_R_... code, higher values are reserved for + * the individual libraries + */ + +typedef struct ERR_string_data_st { + unsigned long error; + const char *string; +} ERR_STRING_DATA; + +void ERR_put_error(int lib, int func, int reason, const char *file, int line); +void ERR_set_error_data(char *data, int flags); + +unsigned long ERR_get_error(void); +unsigned long ERR_get_error_line(const char **file, int *line); +unsigned long ERR_get_error_line_data(const char **file, int *line, + const char **data, int *flags); +unsigned long ERR_peek_error(void); +unsigned long ERR_peek_error_line(const char **file, int *line); +unsigned long ERR_peek_error_line_data(const char **file, int *line, + const char **data, int *flags); +unsigned long ERR_peek_last_error(void); +unsigned long ERR_peek_last_error_line(const char **file, int *line); +unsigned long ERR_peek_last_error_line_data(const char **file, int *line, + const char **data, int *flags); +void ERR_clear_error(void); +char *ERR_error_string(unsigned long e, char *buf); +void ERR_error_string_n(unsigned long e, char *buf, size_t len); +const char *ERR_lib_error_string(unsigned long e); +const char *ERR_func_error_string(unsigned long e); +const char *ERR_reason_error_string(unsigned long e); +void ERR_print_errors_cb(int (*cb) (const char *str, size_t len, void *u), + void *u); +# ifndef OPENSSL_NO_FP_API +void ERR_print_errors_fp(FILE *fp); +# endif +# ifndef OPENSSL_NO_BIO +void ERR_print_errors(BIO *bp); +# endif +void ERR_add_error_data(int num, ...); +void ERR_add_error_vdata(int num, va_list args); +void ERR_load_strings(int lib, ERR_STRING_DATA str[]); +void ERR_unload_strings(int lib, ERR_STRING_DATA str[]); +void ERR_load_ERR_strings(void); +void ERR_load_crypto_strings(void); +void ERR_free_strings(void); + +void ERR_remove_thread_state(const CRYPTO_THREADID *tid); +# ifndef OPENSSL_NO_DEPRECATED +void ERR_remove_state(unsigned long pid); /* if zero we look it up */ +# endif +ERR_STATE *ERR_get_state(void); + +# ifndef OPENSSL_NO_LHASH +LHASH_OF(ERR_STRING_DATA) *ERR_get_string_table(void); +LHASH_OF(ERR_STATE) *ERR_get_err_state_table(void); +void ERR_release_err_state_table(LHASH_OF(ERR_STATE) **hash); +# endif + +int ERR_get_next_error_library(void); + +int ERR_set_mark(void); +int ERR_pop_to_mark(void); + +/* Already defined in ossl_typ.h */ +/* typedef struct st_ERR_FNS ERR_FNS; */ +/* + * An application can use this function and provide the return value to + * loaded modules that should use the application's ERR state/functionality + */ +const ERR_FNS *ERR_get_implementation(void); +/* + * A loaded module should call this function prior to any ERR operations + * using the application's "ERR_FNS". + */ +int ERR_set_implementation(const ERR_FNS *fns); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/win/openssl/include/openssl/evp.h b/hdssd/external/win/openssl/include/openssl/evp.h new file mode 100644 index 0000000..39ab793 --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/evp.h @@ -0,0 +1,1534 @@ +/* crypto/evp/evp.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_ENVELOPE_H +# define HEADER_ENVELOPE_H + +# ifdef OPENSSL_ALGORITHM_DEFINES +# include +# else +# define OPENSSL_ALGORITHM_DEFINES +# include +# undef OPENSSL_ALGORITHM_DEFINES +# endif + +# include + +# include + +# ifndef OPENSSL_NO_BIO +# include +# endif + +/*- +#define EVP_RC2_KEY_SIZE 16 +#define EVP_RC4_KEY_SIZE 16 +#define EVP_BLOWFISH_KEY_SIZE 16 +#define EVP_CAST5_KEY_SIZE 16 +#define EVP_RC5_32_12_16_KEY_SIZE 16 +*/ +# define EVP_MAX_MD_SIZE 64/* longest known is SHA512 */ +# define EVP_MAX_KEY_LENGTH 64 +# define EVP_MAX_IV_LENGTH 16 +# define EVP_MAX_BLOCK_LENGTH 32 + +# define PKCS5_SALT_LEN 8 +/* Default PKCS#5 iteration count */ +# define PKCS5_DEFAULT_ITER 2048 + +# include + +# define EVP_PK_RSA 0x0001 +# define EVP_PK_DSA 0x0002 +# define EVP_PK_DH 0x0004 +# define EVP_PK_EC 0x0008 +# define EVP_PKT_SIGN 0x0010 +# define EVP_PKT_ENC 0x0020 +# define EVP_PKT_EXCH 0x0040 +# define EVP_PKS_RSA 0x0100 +# define EVP_PKS_DSA 0x0200 +# define EVP_PKS_EC 0x0400 + +# define EVP_PKEY_NONE NID_undef +# define EVP_PKEY_RSA NID_rsaEncryption +# define EVP_PKEY_RSA2 NID_rsa +# define EVP_PKEY_DSA NID_dsa +# define EVP_PKEY_DSA1 NID_dsa_2 +# define EVP_PKEY_DSA2 NID_dsaWithSHA +# define EVP_PKEY_DSA3 NID_dsaWithSHA1 +# define EVP_PKEY_DSA4 NID_dsaWithSHA1_2 +# define EVP_PKEY_DH NID_dhKeyAgreement +# define EVP_PKEY_DHX NID_dhpublicnumber +# define EVP_PKEY_EC NID_X9_62_id_ecPublicKey +# define EVP_PKEY_HMAC NID_hmac +# define EVP_PKEY_CMAC NID_cmac + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Type needs to be a bit field Sub-type needs to be for variations on the + * method, as in, can it do arbitrary encryption.... + */ +struct evp_pkey_st { + int type; + int save_type; + int references; + const EVP_PKEY_ASN1_METHOD *ameth; + ENGINE *engine; + union { + char *ptr; +# ifndef OPENSSL_NO_RSA + struct rsa_st *rsa; /* RSA */ +# endif +# ifndef OPENSSL_NO_DSA + struct dsa_st *dsa; /* DSA */ +# endif +# ifndef OPENSSL_NO_DH + struct dh_st *dh; /* DH */ +# endif +# ifndef OPENSSL_NO_EC + struct ec_key_st *ec; /* ECC */ +# endif + } pkey; + int save_parameters; + STACK_OF(X509_ATTRIBUTE) *attributes; /* [ 0 ] */ +} /* EVP_PKEY */ ; + +# define EVP_PKEY_MO_SIGN 0x0001 +# define EVP_PKEY_MO_VERIFY 0x0002 +# define EVP_PKEY_MO_ENCRYPT 0x0004 +# define EVP_PKEY_MO_DECRYPT 0x0008 + +# ifndef EVP_MD +struct env_md_st { + int type; + int pkey_type; + int md_size; + unsigned long flags; + int (*init) (EVP_MD_CTX *ctx); + int (*update) (EVP_MD_CTX *ctx, const void *data, size_t count); + int (*final) (EVP_MD_CTX *ctx, unsigned char *md); + int (*copy) (EVP_MD_CTX *to, const EVP_MD_CTX *from); + int (*cleanup) (EVP_MD_CTX *ctx); + /* FIXME: prototype these some day */ + int (*sign) (int type, const unsigned char *m, unsigned int m_length, + unsigned char *sigret, unsigned int *siglen, void *key); + int (*verify) (int type, const unsigned char *m, unsigned int m_length, + const unsigned char *sigbuf, unsigned int siglen, + void *key); + int required_pkey_type[5]; /* EVP_PKEY_xxx */ + int block_size; + int ctx_size; /* how big does the ctx->md_data need to be */ + /* control function */ + int (*md_ctrl) (EVP_MD_CTX *ctx, int cmd, int p1, void *p2); +} /* EVP_MD */ ; + +typedef int evp_sign_method(int type, const unsigned char *m, + unsigned int m_length, unsigned char *sigret, + unsigned int *siglen, void *key); +typedef int evp_verify_method(int type, const unsigned char *m, + unsigned int m_length, + const unsigned char *sigbuf, + unsigned int siglen, void *key); + +/* digest can only handle a single block */ +# define EVP_MD_FLAG_ONESHOT 0x0001 + +/* + * digest is a "clone" digest used + * which is a copy of an existing + * one for a specific public key type. + * EVP_dss1() etc + */ +# define EVP_MD_FLAG_PKEY_DIGEST 0x0002 + +/* Digest uses EVP_PKEY_METHOD for signing instead of MD specific signing */ + +# define EVP_MD_FLAG_PKEY_METHOD_SIGNATURE 0x0004 + +/* DigestAlgorithmIdentifier flags... */ + +# define EVP_MD_FLAG_DIGALGID_MASK 0x0018 + +/* NULL or absent parameter accepted. Use NULL */ + +# define EVP_MD_FLAG_DIGALGID_NULL 0x0000 + +/* NULL or absent parameter accepted. Use NULL for PKCS#1 otherwise absent */ + +# define EVP_MD_FLAG_DIGALGID_ABSENT 0x0008 + +/* Custom handling via ctrl */ + +# define EVP_MD_FLAG_DIGALGID_CUSTOM 0x0018 + +/* Note if suitable for use in FIPS mode */ +# define EVP_MD_FLAG_FIPS 0x0400 + +/* Digest ctrls */ + +# define EVP_MD_CTRL_DIGALGID 0x1 +# define EVP_MD_CTRL_MICALG 0x2 + +/* Minimum Algorithm specific ctrl value */ + +# define EVP_MD_CTRL_ALG_CTRL 0x1000 + +# define EVP_PKEY_NULL_method NULL,NULL,{0,0,0,0} + +# ifndef OPENSSL_NO_DSA +# define EVP_PKEY_DSA_method (evp_sign_method *)DSA_sign, \ + (evp_verify_method *)DSA_verify, \ + {EVP_PKEY_DSA,EVP_PKEY_DSA2,EVP_PKEY_DSA3, \ + EVP_PKEY_DSA4,0} +# else +# define EVP_PKEY_DSA_method EVP_PKEY_NULL_method +# endif + +# ifndef OPENSSL_NO_ECDSA +# define EVP_PKEY_ECDSA_method (evp_sign_method *)ECDSA_sign, \ + (evp_verify_method *)ECDSA_verify, \ + {EVP_PKEY_EC,0,0,0} +# else +# define EVP_PKEY_ECDSA_method EVP_PKEY_NULL_method +# endif + +# ifndef OPENSSL_NO_RSA +# define EVP_PKEY_RSA_method (evp_sign_method *)RSA_sign, \ + (evp_verify_method *)RSA_verify, \ + {EVP_PKEY_RSA,EVP_PKEY_RSA2,0,0} +# define EVP_PKEY_RSA_ASN1_OCTET_STRING_method \ + (evp_sign_method *)RSA_sign_ASN1_OCTET_STRING, \ + (evp_verify_method *)RSA_verify_ASN1_OCTET_STRING, \ + {EVP_PKEY_RSA,EVP_PKEY_RSA2,0,0} +# else +# define EVP_PKEY_RSA_method EVP_PKEY_NULL_method +# define EVP_PKEY_RSA_ASN1_OCTET_STRING_method EVP_PKEY_NULL_method +# endif + +# endif /* !EVP_MD */ + +struct env_md_ctx_st { + const EVP_MD *digest; + ENGINE *engine; /* functional reference if 'digest' is + * ENGINE-provided */ + unsigned long flags; + void *md_data; + /* Public key context for sign/verify */ + EVP_PKEY_CTX *pctx; + /* Update function: usually copied from EVP_MD */ + int (*update) (EVP_MD_CTX *ctx, const void *data, size_t count); +} /* EVP_MD_CTX */ ; + +/* values for EVP_MD_CTX flags */ + +# define EVP_MD_CTX_FLAG_ONESHOT 0x0001/* digest update will be + * called once only */ +# define EVP_MD_CTX_FLAG_CLEANED 0x0002/* context has already been + * cleaned */ +# define EVP_MD_CTX_FLAG_REUSE 0x0004/* Don't free up ctx->md_data + * in EVP_MD_CTX_cleanup */ +/* + * FIPS and pad options are ignored in 1.0.0, definitions are here so we + * don't accidentally reuse the values for other purposes. + */ + +# define EVP_MD_CTX_FLAG_NON_FIPS_ALLOW 0x0008/* Allow use of non FIPS + * digest in FIPS mode */ + +/* + * The following PAD options are also currently ignored in 1.0.0, digest + * parameters are handled through EVP_DigestSign*() and EVP_DigestVerify*() + * instead. + */ +# define EVP_MD_CTX_FLAG_PAD_MASK 0xF0/* RSA mode to use */ +# define EVP_MD_CTX_FLAG_PAD_PKCS1 0x00/* PKCS#1 v1.5 mode */ +# define EVP_MD_CTX_FLAG_PAD_X931 0x10/* X9.31 mode */ +# define EVP_MD_CTX_FLAG_PAD_PSS 0x20/* PSS mode */ + +# define EVP_MD_CTX_FLAG_NO_INIT 0x0100/* Don't initialize md_data */ + +struct evp_cipher_st { + int nid; + int block_size; + /* Default value for variable length ciphers */ + int key_len; + int iv_len; + /* Various flags */ + unsigned long flags; + /* init key */ + int (*init) (EVP_CIPHER_CTX *ctx, const unsigned char *key, + const unsigned char *iv, int enc); + /* encrypt/decrypt data */ + int (*do_cipher) (EVP_CIPHER_CTX *ctx, unsigned char *out, + const unsigned char *in, size_t inl); + /* cleanup ctx */ + int (*cleanup) (EVP_CIPHER_CTX *); + /* how big ctx->cipher_data needs to be */ + int ctx_size; + /* Populate a ASN1_TYPE with parameters */ + int (*set_asn1_parameters) (EVP_CIPHER_CTX *, ASN1_TYPE *); + /* Get parameters from a ASN1_TYPE */ + int (*get_asn1_parameters) (EVP_CIPHER_CTX *, ASN1_TYPE *); + /* Miscellaneous operations */ + int (*ctrl) (EVP_CIPHER_CTX *, int type, int arg, void *ptr); + /* Application data */ + void *app_data; +} /* EVP_CIPHER */ ; + +/* Values for cipher flags */ + +/* Modes for ciphers */ + +# define EVP_CIPH_STREAM_CIPHER 0x0 +# define EVP_CIPH_ECB_MODE 0x1 +# define EVP_CIPH_CBC_MODE 0x2 +# define EVP_CIPH_CFB_MODE 0x3 +# define EVP_CIPH_OFB_MODE 0x4 +# define EVP_CIPH_CTR_MODE 0x5 +# define EVP_CIPH_GCM_MODE 0x6 +# define EVP_CIPH_CCM_MODE 0x7 +# define EVP_CIPH_XTS_MODE 0x10001 +# define EVP_CIPH_WRAP_MODE 0x10002 +# define EVP_CIPH_MODE 0xF0007 +/* Set if variable length cipher */ +# define EVP_CIPH_VARIABLE_LENGTH 0x8 +/* Set if the iv handling should be done by the cipher itself */ +# define EVP_CIPH_CUSTOM_IV 0x10 +/* Set if the cipher's init() function should be called if key is NULL */ +# define EVP_CIPH_ALWAYS_CALL_INIT 0x20 +/* Call ctrl() to init cipher parameters */ +# define EVP_CIPH_CTRL_INIT 0x40 +/* Don't use standard key length function */ +# define EVP_CIPH_CUSTOM_KEY_LENGTH 0x80 +/* Don't use standard block padding */ +# define EVP_CIPH_NO_PADDING 0x100 +/* cipher handles random key generation */ +# define EVP_CIPH_RAND_KEY 0x200 +/* cipher has its own additional copying logic */ +# define EVP_CIPH_CUSTOM_COPY 0x400 +/* Allow use default ASN1 get/set iv */ +# define EVP_CIPH_FLAG_DEFAULT_ASN1 0x1000 +/* Buffer length in bits not bytes: CFB1 mode only */ +# define EVP_CIPH_FLAG_LENGTH_BITS 0x2000 +/* Note if suitable for use in FIPS mode */ +# define EVP_CIPH_FLAG_FIPS 0x4000 +/* Allow non FIPS cipher in FIPS mode */ +# define EVP_CIPH_FLAG_NON_FIPS_ALLOW 0x8000 +/* + * Cipher handles any and all padding logic as well as finalisation. + */ +# define EVP_CIPH_FLAG_CUSTOM_CIPHER 0x100000 +# define EVP_CIPH_FLAG_AEAD_CIPHER 0x200000 +# define EVP_CIPH_FLAG_TLS1_1_MULTIBLOCK 0x400000 + +/* + * Cipher context flag to indicate we can handle wrap mode: if allowed in + * older applications it could overflow buffers. + */ + +# define EVP_CIPHER_CTX_FLAG_WRAP_ALLOW 0x1 + +/* ctrl() values */ + +# define EVP_CTRL_INIT 0x0 +# define EVP_CTRL_SET_KEY_LENGTH 0x1 +# define EVP_CTRL_GET_RC2_KEY_BITS 0x2 +# define EVP_CTRL_SET_RC2_KEY_BITS 0x3 +# define EVP_CTRL_GET_RC5_ROUNDS 0x4 +# define EVP_CTRL_SET_RC5_ROUNDS 0x5 +# define EVP_CTRL_RAND_KEY 0x6 +# define EVP_CTRL_PBE_PRF_NID 0x7 +# define EVP_CTRL_COPY 0x8 +# define EVP_CTRL_GCM_SET_IVLEN 0x9 +# define EVP_CTRL_GCM_GET_TAG 0x10 +# define EVP_CTRL_GCM_SET_TAG 0x11 +# define EVP_CTRL_GCM_SET_IV_FIXED 0x12 +# define EVP_CTRL_GCM_IV_GEN 0x13 +# define EVP_CTRL_CCM_SET_IVLEN EVP_CTRL_GCM_SET_IVLEN +# define EVP_CTRL_CCM_GET_TAG EVP_CTRL_GCM_GET_TAG +# define EVP_CTRL_CCM_SET_TAG EVP_CTRL_GCM_SET_TAG +# define EVP_CTRL_CCM_SET_L 0x14 +# define EVP_CTRL_CCM_SET_MSGLEN 0x15 +/* + * AEAD cipher deduces payload length and returns number of bytes required to + * store MAC and eventual padding. Subsequent call to EVP_Cipher even + * appends/verifies MAC. + */ +# define EVP_CTRL_AEAD_TLS1_AAD 0x16 +/* Used by composite AEAD ciphers, no-op in GCM, CCM... */ +# define EVP_CTRL_AEAD_SET_MAC_KEY 0x17 +/* Set the GCM invocation field, decrypt only */ +# define EVP_CTRL_GCM_SET_IV_INV 0x18 + +# define EVP_CTRL_TLS1_1_MULTIBLOCK_AAD 0x19 +# define EVP_CTRL_TLS1_1_MULTIBLOCK_ENCRYPT 0x1a +# define EVP_CTRL_TLS1_1_MULTIBLOCK_DECRYPT 0x1b +# define EVP_CTRL_TLS1_1_MULTIBLOCK_MAX_BUFSIZE 0x1c + +/* RFC 5246 defines additional data to be 13 bytes in length */ +# define EVP_AEAD_TLS1_AAD_LEN 13 + +typedef struct { + unsigned char *out; + const unsigned char *inp; + size_t len; + unsigned int interleave; +} EVP_CTRL_TLS1_1_MULTIBLOCK_PARAM; + +/* GCM TLS constants */ +/* Length of fixed part of IV derived from PRF */ +# define EVP_GCM_TLS_FIXED_IV_LEN 4 +/* Length of explicit part of IV part of TLS records */ +# define EVP_GCM_TLS_EXPLICIT_IV_LEN 8 +/* Length of tag for TLS */ +# define EVP_GCM_TLS_TAG_LEN 16 + +typedef struct evp_cipher_info_st { + const EVP_CIPHER *cipher; + unsigned char iv[EVP_MAX_IV_LENGTH]; +} EVP_CIPHER_INFO; + +struct evp_cipher_ctx_st { + const EVP_CIPHER *cipher; + ENGINE *engine; /* functional reference if 'cipher' is + * ENGINE-provided */ + int encrypt; /* encrypt or decrypt */ + int buf_len; /* number we have left */ + unsigned char oiv[EVP_MAX_IV_LENGTH]; /* original iv */ + unsigned char iv[EVP_MAX_IV_LENGTH]; /* working iv */ + unsigned char buf[EVP_MAX_BLOCK_LENGTH]; /* saved partial block */ + int num; /* used by cfb/ofb/ctr mode */ + void *app_data; /* application stuff */ + int key_len; /* May change for variable length cipher */ + unsigned long flags; /* Various flags */ + void *cipher_data; /* per EVP data */ + int final_used; + int block_mask; + unsigned char final[EVP_MAX_BLOCK_LENGTH]; /* possible final block */ +} /* EVP_CIPHER_CTX */ ; + +typedef struct evp_Encode_Ctx_st { + /* number saved in a partial encode/decode */ + int num; + /* + * The length is either the output line length (in input bytes) or the + * shortest input line length that is ok. Once decoding begins, the + * length is adjusted up each time a longer line is decoded + */ + int length; + /* data to encode */ + unsigned char enc_data[80]; + /* number read on current line */ + int line_num; + int expect_nl; +} EVP_ENCODE_CTX; + +/* Password based encryption function */ +typedef int (EVP_PBE_KEYGEN) (EVP_CIPHER_CTX *ctx, const char *pass, + int passlen, ASN1_TYPE *param, + const EVP_CIPHER *cipher, const EVP_MD *md, + int en_de); + +# ifndef OPENSSL_NO_RSA +# define EVP_PKEY_assign_RSA(pkey,rsa) EVP_PKEY_assign((pkey),EVP_PKEY_RSA,\ + (char *)(rsa)) +# endif + +# ifndef OPENSSL_NO_DSA +# define EVP_PKEY_assign_DSA(pkey,dsa) EVP_PKEY_assign((pkey),EVP_PKEY_DSA,\ + (char *)(dsa)) +# endif + +# ifndef OPENSSL_NO_DH +# define EVP_PKEY_assign_DH(pkey,dh) EVP_PKEY_assign((pkey),EVP_PKEY_DH,\ + (char *)(dh)) +# endif + +# ifndef OPENSSL_NO_EC +# define EVP_PKEY_assign_EC_KEY(pkey,eckey) EVP_PKEY_assign((pkey),EVP_PKEY_EC,\ + (char *)(eckey)) +# endif + +/* Add some extra combinations */ +# define EVP_get_digestbynid(a) EVP_get_digestbyname(OBJ_nid2sn(a)) +# define EVP_get_digestbyobj(a) EVP_get_digestbynid(OBJ_obj2nid(a)) +# define EVP_get_cipherbynid(a) EVP_get_cipherbyname(OBJ_nid2sn(a)) +# define EVP_get_cipherbyobj(a) EVP_get_cipherbynid(OBJ_obj2nid(a)) + +int EVP_MD_type(const EVP_MD *md); +# define EVP_MD_nid(e) EVP_MD_type(e) +# define EVP_MD_name(e) OBJ_nid2sn(EVP_MD_nid(e)) +int EVP_MD_pkey_type(const EVP_MD *md); +int EVP_MD_size(const EVP_MD *md); +int EVP_MD_block_size(const EVP_MD *md); +unsigned long EVP_MD_flags(const EVP_MD *md); + +const EVP_MD *EVP_MD_CTX_md(const EVP_MD_CTX *ctx); +# define EVP_MD_CTX_size(e) EVP_MD_size(EVP_MD_CTX_md(e)) +# define EVP_MD_CTX_block_size(e) EVP_MD_block_size(EVP_MD_CTX_md(e)) +# define EVP_MD_CTX_type(e) EVP_MD_type(EVP_MD_CTX_md(e)) + +int EVP_CIPHER_nid(const EVP_CIPHER *cipher); +# define EVP_CIPHER_name(e) OBJ_nid2sn(EVP_CIPHER_nid(e)) +int EVP_CIPHER_block_size(const EVP_CIPHER *cipher); +int EVP_CIPHER_key_length(const EVP_CIPHER *cipher); +int EVP_CIPHER_iv_length(const EVP_CIPHER *cipher); +unsigned long EVP_CIPHER_flags(const EVP_CIPHER *cipher); +# define EVP_CIPHER_mode(e) (EVP_CIPHER_flags(e) & EVP_CIPH_MODE) + +const EVP_CIPHER *EVP_CIPHER_CTX_cipher(const EVP_CIPHER_CTX *ctx); +int EVP_CIPHER_CTX_nid(const EVP_CIPHER_CTX *ctx); +int EVP_CIPHER_CTX_block_size(const EVP_CIPHER_CTX *ctx); +int EVP_CIPHER_CTX_key_length(const EVP_CIPHER_CTX *ctx); +int EVP_CIPHER_CTX_iv_length(const EVP_CIPHER_CTX *ctx); +int EVP_CIPHER_CTX_copy(EVP_CIPHER_CTX *out, const EVP_CIPHER_CTX *in); +void *EVP_CIPHER_CTX_get_app_data(const EVP_CIPHER_CTX *ctx); +void EVP_CIPHER_CTX_set_app_data(EVP_CIPHER_CTX *ctx, void *data); +# define EVP_CIPHER_CTX_type(c) EVP_CIPHER_type(EVP_CIPHER_CTX_cipher(c)) +unsigned long EVP_CIPHER_CTX_flags(const EVP_CIPHER_CTX *ctx); +# define EVP_CIPHER_CTX_mode(e) (EVP_CIPHER_CTX_flags(e) & EVP_CIPH_MODE) + +# define EVP_ENCODE_LENGTH(l) (((l+2)/3*4)+(l/48+1)*2+80) +# define EVP_DECODE_LENGTH(l) ((l+3)/4*3+80) + +# define EVP_SignInit_ex(a,b,c) EVP_DigestInit_ex(a,b,c) +# define EVP_SignInit(a,b) EVP_DigestInit(a,b) +# define EVP_SignUpdate(a,b,c) EVP_DigestUpdate(a,b,c) +# define EVP_VerifyInit_ex(a,b,c) EVP_DigestInit_ex(a,b,c) +# define EVP_VerifyInit(a,b) EVP_DigestInit(a,b) +# define EVP_VerifyUpdate(a,b,c) EVP_DigestUpdate(a,b,c) +# define EVP_OpenUpdate(a,b,c,d,e) EVP_DecryptUpdate(a,b,c,d,e) +# define EVP_SealUpdate(a,b,c,d,e) EVP_EncryptUpdate(a,b,c,d,e) +# define EVP_DigestSignUpdate(a,b,c) EVP_DigestUpdate(a,b,c) +# define EVP_DigestVerifyUpdate(a,b,c) EVP_DigestUpdate(a,b,c) + +# ifdef CONST_STRICT +void BIO_set_md(BIO *, const EVP_MD *md); +# else +# define BIO_set_md(b,md) BIO_ctrl(b,BIO_C_SET_MD,0,(char *)md) +# endif +# define BIO_get_md(b,mdp) BIO_ctrl(b,BIO_C_GET_MD,0,(char *)mdp) +# define BIO_get_md_ctx(b,mdcp) BIO_ctrl(b,BIO_C_GET_MD_CTX,0,(char *)mdcp) +# define BIO_set_md_ctx(b,mdcp) BIO_ctrl(b,BIO_C_SET_MD_CTX,0,(char *)mdcp) +# define BIO_get_cipher_status(b) BIO_ctrl(b,BIO_C_GET_CIPHER_STATUS,0,NULL) +# define BIO_get_cipher_ctx(b,c_pp) BIO_ctrl(b,BIO_C_GET_CIPHER_CTX,0,(char *)c_pp) + +int EVP_Cipher(EVP_CIPHER_CTX *c, + unsigned char *out, const unsigned char *in, unsigned int inl); + +# define EVP_add_cipher_alias(n,alias) \ + OBJ_NAME_add((alias),OBJ_NAME_TYPE_CIPHER_METH|OBJ_NAME_ALIAS,(n)) +# define EVP_add_digest_alias(n,alias) \ + OBJ_NAME_add((alias),OBJ_NAME_TYPE_MD_METH|OBJ_NAME_ALIAS,(n)) +# define EVP_delete_cipher_alias(alias) \ + OBJ_NAME_remove(alias,OBJ_NAME_TYPE_CIPHER_METH|OBJ_NAME_ALIAS); +# define EVP_delete_digest_alias(alias) \ + OBJ_NAME_remove(alias,OBJ_NAME_TYPE_MD_METH|OBJ_NAME_ALIAS); + +void EVP_MD_CTX_init(EVP_MD_CTX *ctx); +int EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx); +EVP_MD_CTX *EVP_MD_CTX_create(void); +void EVP_MD_CTX_destroy(EVP_MD_CTX *ctx); +int EVP_MD_CTX_copy_ex(EVP_MD_CTX *out, const EVP_MD_CTX *in); +void EVP_MD_CTX_set_flags(EVP_MD_CTX *ctx, int flags); +void EVP_MD_CTX_clear_flags(EVP_MD_CTX *ctx, int flags); +int EVP_MD_CTX_test_flags(const EVP_MD_CTX *ctx, int flags); +int EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl); +int EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *d, size_t cnt); +int EVP_DigestFinal_ex(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *s); +int EVP_Digest(const void *data, size_t count, + unsigned char *md, unsigned int *size, const EVP_MD *type, + ENGINE *impl); + +int EVP_MD_CTX_copy(EVP_MD_CTX *out, const EVP_MD_CTX *in); +int EVP_DigestInit(EVP_MD_CTX *ctx, const EVP_MD *type); +int EVP_DigestFinal(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *s); + +int EVP_read_pw_string(char *buf, int length, const char *prompt, int verify); +int EVP_read_pw_string_min(char *buf, int minlen, int maxlen, + const char *prompt, int verify); +void EVP_set_pw_prompt(const char *prompt); +char *EVP_get_pw_prompt(void); + +int EVP_BytesToKey(const EVP_CIPHER *type, const EVP_MD *md, + const unsigned char *salt, const unsigned char *data, + int datal, int count, unsigned char *key, + unsigned char *iv); + +void EVP_CIPHER_CTX_set_flags(EVP_CIPHER_CTX *ctx, int flags); +void EVP_CIPHER_CTX_clear_flags(EVP_CIPHER_CTX *ctx, int flags); +int EVP_CIPHER_CTX_test_flags(const EVP_CIPHER_CTX *ctx, int flags); + +int EVP_EncryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, + const unsigned char *key, const unsigned char *iv); +int EVP_EncryptInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, + ENGINE *impl, const unsigned char *key, + const unsigned char *iv); +int EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, + const unsigned char *in, int inl); +int EVP_EncryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl); +int EVP_EncryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl); + +int EVP_DecryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, + const unsigned char *key, const unsigned char *iv); +int EVP_DecryptInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, + ENGINE *impl, const unsigned char *key, + const unsigned char *iv); +int EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, + const unsigned char *in, int inl); +int EVP_DecryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *outm, int *outl); +int EVP_DecryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *outm, int *outl); + +int EVP_CipherInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, + const unsigned char *key, const unsigned char *iv, + int enc); +int EVP_CipherInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, + ENGINE *impl, const unsigned char *key, + const unsigned char *iv, int enc); +int EVP_CipherUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, + const unsigned char *in, int inl); +int EVP_CipherFinal(EVP_CIPHER_CTX *ctx, unsigned char *outm, int *outl); +int EVP_CipherFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *outm, int *outl); + +int EVP_SignFinal(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *s, + EVP_PKEY *pkey); + +int EVP_VerifyFinal(EVP_MD_CTX *ctx, const unsigned char *sigbuf, + unsigned int siglen, EVP_PKEY *pkey); + +int EVP_DigestSignInit(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx, + const EVP_MD *type, ENGINE *e, EVP_PKEY *pkey); +int EVP_DigestSignFinal(EVP_MD_CTX *ctx, + unsigned char *sigret, size_t *siglen); + +int EVP_DigestVerifyInit(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx, + const EVP_MD *type, ENGINE *e, EVP_PKEY *pkey); +int EVP_DigestVerifyFinal(EVP_MD_CTX *ctx, + const unsigned char *sig, size_t siglen); + +int EVP_OpenInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type, + const unsigned char *ek, int ekl, const unsigned char *iv, + EVP_PKEY *priv); +int EVP_OpenFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl); + +int EVP_SealInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type, + unsigned char **ek, int *ekl, unsigned char *iv, + EVP_PKEY **pubk, int npubk); +int EVP_SealFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl); + +void EVP_EncodeInit(EVP_ENCODE_CTX *ctx); +void EVP_EncodeUpdate(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl, + const unsigned char *in, int inl); +void EVP_EncodeFinal(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl); +int EVP_EncodeBlock(unsigned char *t, const unsigned char *f, int n); + +void EVP_DecodeInit(EVP_ENCODE_CTX *ctx); +int EVP_DecodeUpdate(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl, + const unsigned char *in, int inl); +int EVP_DecodeFinal(EVP_ENCODE_CTX *ctx, unsigned + char *out, int *outl); +int EVP_DecodeBlock(unsigned char *t, const unsigned char *f, int n); + +void EVP_CIPHER_CTX_init(EVP_CIPHER_CTX *a); +int EVP_CIPHER_CTX_cleanup(EVP_CIPHER_CTX *a); +EVP_CIPHER_CTX *EVP_CIPHER_CTX_new(void); +void EVP_CIPHER_CTX_free(EVP_CIPHER_CTX *a); +int EVP_CIPHER_CTX_set_key_length(EVP_CIPHER_CTX *x, int keylen); +int EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX *c, int pad); +int EVP_CIPHER_CTX_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr); +int EVP_CIPHER_CTX_rand_key(EVP_CIPHER_CTX *ctx, unsigned char *key); + +# ifndef OPENSSL_NO_BIO +BIO_METHOD *BIO_f_md(void); +BIO_METHOD *BIO_f_base64(void); +BIO_METHOD *BIO_f_cipher(void); +BIO_METHOD *BIO_f_reliable(void); +void BIO_set_cipher(BIO *b, const EVP_CIPHER *c, const unsigned char *k, + const unsigned char *i, int enc); +# endif + +const EVP_MD *EVP_md_null(void); +# ifndef OPENSSL_NO_MD2 +const EVP_MD *EVP_md2(void); +# endif +# ifndef OPENSSL_NO_MD4 +const EVP_MD *EVP_md4(void); +# endif +# ifndef OPENSSL_NO_MD5 +const EVP_MD *EVP_md5(void); +# endif +# ifndef OPENSSL_NO_SHA +const EVP_MD *EVP_sha(void); +const EVP_MD *EVP_sha1(void); +const EVP_MD *EVP_dss(void); +const EVP_MD *EVP_dss1(void); +const EVP_MD *EVP_ecdsa(void); +# endif +# ifndef OPENSSL_NO_SHA256 +const EVP_MD *EVP_sha224(void); +const EVP_MD *EVP_sha256(void); +# endif +# ifndef OPENSSL_NO_SHA512 +const EVP_MD *EVP_sha384(void); +const EVP_MD *EVP_sha512(void); +# endif +# ifndef OPENSSL_NO_MDC2 +const EVP_MD *EVP_mdc2(void); +# endif +# ifndef OPENSSL_NO_RIPEMD +const EVP_MD *EVP_ripemd160(void); +# endif +# ifndef OPENSSL_NO_WHIRLPOOL +const EVP_MD *EVP_whirlpool(void); +# endif +const EVP_CIPHER *EVP_enc_null(void); /* does nothing :-) */ +# ifndef OPENSSL_NO_DES +const EVP_CIPHER *EVP_des_ecb(void); +const EVP_CIPHER *EVP_des_ede(void); +const EVP_CIPHER *EVP_des_ede3(void); +const EVP_CIPHER *EVP_des_ede_ecb(void); +const EVP_CIPHER *EVP_des_ede3_ecb(void); +const EVP_CIPHER *EVP_des_cfb64(void); +# define EVP_des_cfb EVP_des_cfb64 +const EVP_CIPHER *EVP_des_cfb1(void); +const EVP_CIPHER *EVP_des_cfb8(void); +const EVP_CIPHER *EVP_des_ede_cfb64(void); +# define EVP_des_ede_cfb EVP_des_ede_cfb64 +# if 0 +const EVP_CIPHER *EVP_des_ede_cfb1(void); +const EVP_CIPHER *EVP_des_ede_cfb8(void); +# endif +const EVP_CIPHER *EVP_des_ede3_cfb64(void); +# define EVP_des_ede3_cfb EVP_des_ede3_cfb64 +const EVP_CIPHER *EVP_des_ede3_cfb1(void); +const EVP_CIPHER *EVP_des_ede3_cfb8(void); +const EVP_CIPHER *EVP_des_ofb(void); +const EVP_CIPHER *EVP_des_ede_ofb(void); +const EVP_CIPHER *EVP_des_ede3_ofb(void); +const EVP_CIPHER *EVP_des_cbc(void); +const EVP_CIPHER *EVP_des_ede_cbc(void); +const EVP_CIPHER *EVP_des_ede3_cbc(void); +const EVP_CIPHER *EVP_desx_cbc(void); +const EVP_CIPHER *EVP_des_ede3_wrap(void); +/* + * This should now be supported through the dev_crypto ENGINE. But also, why + * are rc4 and md5 declarations made here inside a "NO_DES" precompiler + * branch? + */ +# if 0 +# ifdef OPENSSL_OPENBSD_DEV_CRYPTO +const EVP_CIPHER *EVP_dev_crypto_des_ede3_cbc(void); +const EVP_CIPHER *EVP_dev_crypto_rc4(void); +const EVP_MD *EVP_dev_crypto_md5(void); +# endif +# endif +# endif +# ifndef OPENSSL_NO_RC4 +const EVP_CIPHER *EVP_rc4(void); +const EVP_CIPHER *EVP_rc4_40(void); +# ifndef OPENSSL_NO_MD5 +const EVP_CIPHER *EVP_rc4_hmac_md5(void); +# endif +# endif +# ifndef OPENSSL_NO_IDEA +const EVP_CIPHER *EVP_idea_ecb(void); +const EVP_CIPHER *EVP_idea_cfb64(void); +# define EVP_idea_cfb EVP_idea_cfb64 +const EVP_CIPHER *EVP_idea_ofb(void); +const EVP_CIPHER *EVP_idea_cbc(void); +# endif +# ifndef OPENSSL_NO_RC2 +const EVP_CIPHER *EVP_rc2_ecb(void); +const EVP_CIPHER *EVP_rc2_cbc(void); +const EVP_CIPHER *EVP_rc2_40_cbc(void); +const EVP_CIPHER *EVP_rc2_64_cbc(void); +const EVP_CIPHER *EVP_rc2_cfb64(void); +# define EVP_rc2_cfb EVP_rc2_cfb64 +const EVP_CIPHER *EVP_rc2_ofb(void); +# endif +# ifndef OPENSSL_NO_BF +const EVP_CIPHER *EVP_bf_ecb(void); +const EVP_CIPHER *EVP_bf_cbc(void); +const EVP_CIPHER *EVP_bf_cfb64(void); +# define EVP_bf_cfb EVP_bf_cfb64 +const EVP_CIPHER *EVP_bf_ofb(void); +# endif +# ifndef OPENSSL_NO_CAST +const EVP_CIPHER *EVP_cast5_ecb(void); +const EVP_CIPHER *EVP_cast5_cbc(void); +const EVP_CIPHER *EVP_cast5_cfb64(void); +# define EVP_cast5_cfb EVP_cast5_cfb64 +const EVP_CIPHER *EVP_cast5_ofb(void); +# endif +# ifndef OPENSSL_NO_RC5 +const EVP_CIPHER *EVP_rc5_32_12_16_cbc(void); +const EVP_CIPHER *EVP_rc5_32_12_16_ecb(void); +const EVP_CIPHER *EVP_rc5_32_12_16_cfb64(void); +# define EVP_rc5_32_12_16_cfb EVP_rc5_32_12_16_cfb64 +const EVP_CIPHER *EVP_rc5_32_12_16_ofb(void); +# endif +# ifndef OPENSSL_NO_AES +const EVP_CIPHER *EVP_aes_128_ecb(void); +const EVP_CIPHER *EVP_aes_128_cbc(void); +const EVP_CIPHER *EVP_aes_128_cfb1(void); +const EVP_CIPHER *EVP_aes_128_cfb8(void); +const EVP_CIPHER *EVP_aes_128_cfb128(void); +# define EVP_aes_128_cfb EVP_aes_128_cfb128 +const EVP_CIPHER *EVP_aes_128_ofb(void); +const EVP_CIPHER *EVP_aes_128_ctr(void); +const EVP_CIPHER *EVP_aes_128_ccm(void); +const EVP_CIPHER *EVP_aes_128_gcm(void); +const EVP_CIPHER *EVP_aes_128_xts(void); +const EVP_CIPHER *EVP_aes_128_wrap(void); +const EVP_CIPHER *EVP_aes_192_ecb(void); +const EVP_CIPHER *EVP_aes_192_cbc(void); +const EVP_CIPHER *EVP_aes_192_cfb1(void); +const EVP_CIPHER *EVP_aes_192_cfb8(void); +const EVP_CIPHER *EVP_aes_192_cfb128(void); +# define EVP_aes_192_cfb EVP_aes_192_cfb128 +const EVP_CIPHER *EVP_aes_192_ofb(void); +const EVP_CIPHER *EVP_aes_192_ctr(void); +const EVP_CIPHER *EVP_aes_192_ccm(void); +const EVP_CIPHER *EVP_aes_192_gcm(void); +const EVP_CIPHER *EVP_aes_192_wrap(void); +const EVP_CIPHER *EVP_aes_256_ecb(void); +const EVP_CIPHER *EVP_aes_256_cbc(void); +const EVP_CIPHER *EVP_aes_256_cfb1(void); +const EVP_CIPHER *EVP_aes_256_cfb8(void); +const EVP_CIPHER *EVP_aes_256_cfb128(void); +# define EVP_aes_256_cfb EVP_aes_256_cfb128 +const EVP_CIPHER *EVP_aes_256_ofb(void); +const EVP_CIPHER *EVP_aes_256_ctr(void); +const EVP_CIPHER *EVP_aes_256_ccm(void); +const EVP_CIPHER *EVP_aes_256_gcm(void); +const EVP_CIPHER *EVP_aes_256_xts(void); +const EVP_CIPHER *EVP_aes_256_wrap(void); +# if !defined(OPENSSL_NO_SHA) && !defined(OPENSSL_NO_SHA1) +const EVP_CIPHER *EVP_aes_128_cbc_hmac_sha1(void); +const EVP_CIPHER *EVP_aes_256_cbc_hmac_sha1(void); +# endif +# ifndef OPENSSL_NO_SHA256 +const EVP_CIPHER *EVP_aes_128_cbc_hmac_sha256(void); +const EVP_CIPHER *EVP_aes_256_cbc_hmac_sha256(void); +# endif +# endif +# ifndef OPENSSL_NO_CAMELLIA +const EVP_CIPHER *EVP_camellia_128_ecb(void); +const EVP_CIPHER *EVP_camellia_128_cbc(void); +const EVP_CIPHER *EVP_camellia_128_cfb1(void); +const EVP_CIPHER *EVP_camellia_128_cfb8(void); +const EVP_CIPHER *EVP_camellia_128_cfb128(void); +# define EVP_camellia_128_cfb EVP_camellia_128_cfb128 +const EVP_CIPHER *EVP_camellia_128_ofb(void); +const EVP_CIPHER *EVP_camellia_192_ecb(void); +const EVP_CIPHER *EVP_camellia_192_cbc(void); +const EVP_CIPHER *EVP_camellia_192_cfb1(void); +const EVP_CIPHER *EVP_camellia_192_cfb8(void); +const EVP_CIPHER *EVP_camellia_192_cfb128(void); +# define EVP_camellia_192_cfb EVP_camellia_192_cfb128 +const EVP_CIPHER *EVP_camellia_192_ofb(void); +const EVP_CIPHER *EVP_camellia_256_ecb(void); +const EVP_CIPHER *EVP_camellia_256_cbc(void); +const EVP_CIPHER *EVP_camellia_256_cfb1(void); +const EVP_CIPHER *EVP_camellia_256_cfb8(void); +const EVP_CIPHER *EVP_camellia_256_cfb128(void); +# define EVP_camellia_256_cfb EVP_camellia_256_cfb128 +const EVP_CIPHER *EVP_camellia_256_ofb(void); +# endif + +# ifndef OPENSSL_NO_SEED +const EVP_CIPHER *EVP_seed_ecb(void); +const EVP_CIPHER *EVP_seed_cbc(void); +const EVP_CIPHER *EVP_seed_cfb128(void); +# define EVP_seed_cfb EVP_seed_cfb128 +const EVP_CIPHER *EVP_seed_ofb(void); +# endif + +void OPENSSL_add_all_algorithms_noconf(void); +void OPENSSL_add_all_algorithms_conf(void); + +# ifdef OPENSSL_LOAD_CONF +# define OpenSSL_add_all_algorithms() \ + OPENSSL_add_all_algorithms_conf() +# else +# define OpenSSL_add_all_algorithms() \ + OPENSSL_add_all_algorithms_noconf() +# endif + +void OpenSSL_add_all_ciphers(void); +void OpenSSL_add_all_digests(void); +# define SSLeay_add_all_algorithms() OpenSSL_add_all_algorithms() +# define SSLeay_add_all_ciphers() OpenSSL_add_all_ciphers() +# define SSLeay_add_all_digests() OpenSSL_add_all_digests() + +int EVP_add_cipher(const EVP_CIPHER *cipher); +int EVP_add_digest(const EVP_MD *digest); + +const EVP_CIPHER *EVP_get_cipherbyname(const char *name); +const EVP_MD *EVP_get_digestbyname(const char *name); +void EVP_cleanup(void); + +void EVP_CIPHER_do_all(void (*fn) (const EVP_CIPHER *ciph, + const char *from, const char *to, void *x), + void *arg); +void EVP_CIPHER_do_all_sorted(void (*fn) + (const EVP_CIPHER *ciph, const char *from, + const char *to, void *x), void *arg); + +void EVP_MD_do_all(void (*fn) (const EVP_MD *ciph, + const char *from, const char *to, void *x), + void *arg); +void EVP_MD_do_all_sorted(void (*fn) + (const EVP_MD *ciph, const char *from, + const char *to, void *x), void *arg); + +int EVP_PKEY_decrypt_old(unsigned char *dec_key, + const unsigned char *enc_key, int enc_key_len, + EVP_PKEY *private_key); +int EVP_PKEY_encrypt_old(unsigned char *enc_key, + const unsigned char *key, int key_len, + EVP_PKEY *pub_key); +int EVP_PKEY_type(int type); +int EVP_PKEY_id(const EVP_PKEY *pkey); +int EVP_PKEY_base_id(const EVP_PKEY *pkey); +int EVP_PKEY_bits(EVP_PKEY *pkey); +int EVP_PKEY_size(EVP_PKEY *pkey); +int EVP_PKEY_set_type(EVP_PKEY *pkey, int type); +int EVP_PKEY_set_type_str(EVP_PKEY *pkey, const char *str, int len); +int EVP_PKEY_assign(EVP_PKEY *pkey, int type, void *key); +void *EVP_PKEY_get0(EVP_PKEY *pkey); + +# ifndef OPENSSL_NO_RSA +struct rsa_st; +int EVP_PKEY_set1_RSA(EVP_PKEY *pkey, struct rsa_st *key); +struct rsa_st *EVP_PKEY_get1_RSA(EVP_PKEY *pkey); +# endif +# ifndef OPENSSL_NO_DSA +struct dsa_st; +int EVP_PKEY_set1_DSA(EVP_PKEY *pkey, struct dsa_st *key); +struct dsa_st *EVP_PKEY_get1_DSA(EVP_PKEY *pkey); +# endif +# ifndef OPENSSL_NO_DH +struct dh_st; +int EVP_PKEY_set1_DH(EVP_PKEY *pkey, struct dh_st *key); +struct dh_st *EVP_PKEY_get1_DH(EVP_PKEY *pkey); +# endif +# ifndef OPENSSL_NO_EC +struct ec_key_st; +int EVP_PKEY_set1_EC_KEY(EVP_PKEY *pkey, struct ec_key_st *key); +struct ec_key_st *EVP_PKEY_get1_EC_KEY(EVP_PKEY *pkey); +# endif + +EVP_PKEY *EVP_PKEY_new(void); +void EVP_PKEY_free(EVP_PKEY *pkey); + +EVP_PKEY *d2i_PublicKey(int type, EVP_PKEY **a, const unsigned char **pp, + long length); +int i2d_PublicKey(EVP_PKEY *a, unsigned char **pp); + +EVP_PKEY *d2i_PrivateKey(int type, EVP_PKEY **a, const unsigned char **pp, + long length); +EVP_PKEY *d2i_AutoPrivateKey(EVP_PKEY **a, const unsigned char **pp, + long length); +int i2d_PrivateKey(EVP_PKEY *a, unsigned char **pp); + +int EVP_PKEY_copy_parameters(EVP_PKEY *to, const EVP_PKEY *from); +int EVP_PKEY_missing_parameters(const EVP_PKEY *pkey); +int EVP_PKEY_save_parameters(EVP_PKEY *pkey, int mode); +int EVP_PKEY_cmp_parameters(const EVP_PKEY *a, const EVP_PKEY *b); + +int EVP_PKEY_cmp(const EVP_PKEY *a, const EVP_PKEY *b); + +int EVP_PKEY_print_public(BIO *out, const EVP_PKEY *pkey, + int indent, ASN1_PCTX *pctx); +int EVP_PKEY_print_private(BIO *out, const EVP_PKEY *pkey, + int indent, ASN1_PCTX *pctx); +int EVP_PKEY_print_params(BIO *out, const EVP_PKEY *pkey, + int indent, ASN1_PCTX *pctx); + +int EVP_PKEY_get_default_digest_nid(EVP_PKEY *pkey, int *pnid); + +int EVP_CIPHER_type(const EVP_CIPHER *ctx); + +/* calls methods */ +int EVP_CIPHER_param_to_asn1(EVP_CIPHER_CTX *c, ASN1_TYPE *type); +int EVP_CIPHER_asn1_to_param(EVP_CIPHER_CTX *c, ASN1_TYPE *type); + +/* These are used by EVP_CIPHER methods */ +int EVP_CIPHER_set_asn1_iv(EVP_CIPHER_CTX *c, ASN1_TYPE *type); +int EVP_CIPHER_get_asn1_iv(EVP_CIPHER_CTX *c, ASN1_TYPE *type); + +/* PKCS5 password based encryption */ +int PKCS5_PBE_keyivgen(EVP_CIPHER_CTX *ctx, const char *pass, int passlen, + ASN1_TYPE *param, const EVP_CIPHER *cipher, + const EVP_MD *md, int en_de); +int PKCS5_PBKDF2_HMAC_SHA1(const char *pass, int passlen, + const unsigned char *salt, int saltlen, int iter, + int keylen, unsigned char *out); +int PKCS5_PBKDF2_HMAC(const char *pass, int passlen, + const unsigned char *salt, int saltlen, int iter, + const EVP_MD *digest, int keylen, unsigned char *out); +int PKCS5_v2_PBE_keyivgen(EVP_CIPHER_CTX *ctx, const char *pass, int passlen, + ASN1_TYPE *param, const EVP_CIPHER *cipher, + const EVP_MD *md, int en_de); + +void PKCS5_PBE_add(void); + +int EVP_PBE_CipherInit(ASN1_OBJECT *pbe_obj, const char *pass, int passlen, + ASN1_TYPE *param, EVP_CIPHER_CTX *ctx, int en_de); + +/* PBE type */ + +/* Can appear as the outermost AlgorithmIdentifier */ +# define EVP_PBE_TYPE_OUTER 0x0 +/* Is an PRF type OID */ +# define EVP_PBE_TYPE_PRF 0x1 + +int EVP_PBE_alg_add_type(int pbe_type, int pbe_nid, int cipher_nid, + int md_nid, EVP_PBE_KEYGEN *keygen); +int EVP_PBE_alg_add(int nid, const EVP_CIPHER *cipher, const EVP_MD *md, + EVP_PBE_KEYGEN *keygen); +int EVP_PBE_find(int type, int pbe_nid, int *pcnid, int *pmnid, + EVP_PBE_KEYGEN **pkeygen); +void EVP_PBE_cleanup(void); + +# define ASN1_PKEY_ALIAS 0x1 +# define ASN1_PKEY_DYNAMIC 0x2 +# define ASN1_PKEY_SIGPARAM_NULL 0x4 + +# define ASN1_PKEY_CTRL_PKCS7_SIGN 0x1 +# define ASN1_PKEY_CTRL_PKCS7_ENCRYPT 0x2 +# define ASN1_PKEY_CTRL_DEFAULT_MD_NID 0x3 +# define ASN1_PKEY_CTRL_CMS_SIGN 0x5 +# define ASN1_PKEY_CTRL_CMS_ENVELOPE 0x7 +# define ASN1_PKEY_CTRL_CMS_RI_TYPE 0x8 + +int EVP_PKEY_asn1_get_count(void); +const EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_get0(int idx); +const EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_find(ENGINE **pe, int type); +const EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_find_str(ENGINE **pe, + const char *str, int len); +int EVP_PKEY_asn1_add0(const EVP_PKEY_ASN1_METHOD *ameth); +int EVP_PKEY_asn1_add_alias(int to, int from); +int EVP_PKEY_asn1_get0_info(int *ppkey_id, int *pkey_base_id, + int *ppkey_flags, const char **pinfo, + const char **ppem_str, + const EVP_PKEY_ASN1_METHOD *ameth); + +const EVP_PKEY_ASN1_METHOD *EVP_PKEY_get0_asn1(EVP_PKEY *pkey); +EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_new(int id, int flags, + const char *pem_str, + const char *info); +void EVP_PKEY_asn1_copy(EVP_PKEY_ASN1_METHOD *dst, + const EVP_PKEY_ASN1_METHOD *src); +void EVP_PKEY_asn1_free(EVP_PKEY_ASN1_METHOD *ameth); +void EVP_PKEY_asn1_set_public(EVP_PKEY_ASN1_METHOD *ameth, + int (*pub_decode) (EVP_PKEY *pk, + X509_PUBKEY *pub), + int (*pub_encode) (X509_PUBKEY *pub, + const EVP_PKEY *pk), + int (*pub_cmp) (const EVP_PKEY *a, + const EVP_PKEY *b), + int (*pub_print) (BIO *out, + const EVP_PKEY *pkey, + int indent, ASN1_PCTX *pctx), + int (*pkey_size) (const EVP_PKEY *pk), + int (*pkey_bits) (const EVP_PKEY *pk)); +void EVP_PKEY_asn1_set_private(EVP_PKEY_ASN1_METHOD *ameth, + int (*priv_decode) (EVP_PKEY *pk, + PKCS8_PRIV_KEY_INFO + *p8inf), + int (*priv_encode) (PKCS8_PRIV_KEY_INFO *p8, + const EVP_PKEY *pk), + int (*priv_print) (BIO *out, + const EVP_PKEY *pkey, + int indent, + ASN1_PCTX *pctx)); +void EVP_PKEY_asn1_set_param(EVP_PKEY_ASN1_METHOD *ameth, + int (*param_decode) (EVP_PKEY *pkey, + const unsigned char **pder, + int derlen), + int (*param_encode) (const EVP_PKEY *pkey, + unsigned char **pder), + int (*param_missing) (const EVP_PKEY *pk), + int (*param_copy) (EVP_PKEY *to, + const EVP_PKEY *from), + int (*param_cmp) (const EVP_PKEY *a, + const EVP_PKEY *b), + int (*param_print) (BIO *out, + const EVP_PKEY *pkey, + int indent, + ASN1_PCTX *pctx)); + +void EVP_PKEY_asn1_set_free(EVP_PKEY_ASN1_METHOD *ameth, + void (*pkey_free) (EVP_PKEY *pkey)); +void EVP_PKEY_asn1_set_ctrl(EVP_PKEY_ASN1_METHOD *ameth, + int (*pkey_ctrl) (EVP_PKEY *pkey, int op, + long arg1, void *arg2)); +void EVP_PKEY_asn1_set_item(EVP_PKEY_ASN1_METHOD *ameth, + int (*item_verify) (EVP_MD_CTX *ctx, + const ASN1_ITEM *it, + void *asn, + X509_ALGOR *a, + ASN1_BIT_STRING *sig, + EVP_PKEY *pkey), + int (*item_sign) (EVP_MD_CTX *ctx, + const ASN1_ITEM *it, + void *asn, + X509_ALGOR *alg1, + X509_ALGOR *alg2, + ASN1_BIT_STRING *sig)); + +# define EVP_PKEY_OP_UNDEFINED 0 +# define EVP_PKEY_OP_PARAMGEN (1<<1) +# define EVP_PKEY_OP_KEYGEN (1<<2) +# define EVP_PKEY_OP_SIGN (1<<3) +# define EVP_PKEY_OP_VERIFY (1<<4) +# define EVP_PKEY_OP_VERIFYRECOVER (1<<5) +# define EVP_PKEY_OP_SIGNCTX (1<<6) +# define EVP_PKEY_OP_VERIFYCTX (1<<7) +# define EVP_PKEY_OP_ENCRYPT (1<<8) +# define EVP_PKEY_OP_DECRYPT (1<<9) +# define EVP_PKEY_OP_DERIVE (1<<10) + +# define EVP_PKEY_OP_TYPE_SIG \ + (EVP_PKEY_OP_SIGN | EVP_PKEY_OP_VERIFY | EVP_PKEY_OP_VERIFYRECOVER \ + | EVP_PKEY_OP_SIGNCTX | EVP_PKEY_OP_VERIFYCTX) + +# define EVP_PKEY_OP_TYPE_CRYPT \ + (EVP_PKEY_OP_ENCRYPT | EVP_PKEY_OP_DECRYPT) + +# define EVP_PKEY_OP_TYPE_NOGEN \ + (EVP_PKEY_OP_SIG | EVP_PKEY_OP_CRYPT | EVP_PKEY_OP_DERIVE) + +# define EVP_PKEY_OP_TYPE_GEN \ + (EVP_PKEY_OP_PARAMGEN | EVP_PKEY_OP_KEYGEN) + +# define EVP_PKEY_CTX_set_signature_md(ctx, md) \ + EVP_PKEY_CTX_ctrl(ctx, -1, EVP_PKEY_OP_TYPE_SIG, \ + EVP_PKEY_CTRL_MD, 0, (void *)md) + +# define EVP_PKEY_CTX_get_signature_md(ctx, pmd) \ + EVP_PKEY_CTX_ctrl(ctx, -1, EVP_PKEY_OP_TYPE_SIG, \ + EVP_PKEY_CTRL_GET_MD, 0, (void *)pmd) + +# define EVP_PKEY_CTRL_MD 1 +# define EVP_PKEY_CTRL_PEER_KEY 2 + +# define EVP_PKEY_CTRL_PKCS7_ENCRYPT 3 +# define EVP_PKEY_CTRL_PKCS7_DECRYPT 4 + +# define EVP_PKEY_CTRL_PKCS7_SIGN 5 + +# define EVP_PKEY_CTRL_SET_MAC_KEY 6 + +# define EVP_PKEY_CTRL_DIGESTINIT 7 + +/* Used by GOST key encryption in TLS */ +# define EVP_PKEY_CTRL_SET_IV 8 + +# define EVP_PKEY_CTRL_CMS_ENCRYPT 9 +# define EVP_PKEY_CTRL_CMS_DECRYPT 10 +# define EVP_PKEY_CTRL_CMS_SIGN 11 + +# define EVP_PKEY_CTRL_CIPHER 12 + +# define EVP_PKEY_CTRL_GET_MD 13 + +# define EVP_PKEY_ALG_CTRL 0x1000 + +# define EVP_PKEY_FLAG_AUTOARGLEN 2 +/* + * Method handles all operations: don't assume any digest related defaults. + */ +# define EVP_PKEY_FLAG_SIGCTX_CUSTOM 4 + +const EVP_PKEY_METHOD *EVP_PKEY_meth_find(int type); +EVP_PKEY_METHOD *EVP_PKEY_meth_new(int id, int flags); +void EVP_PKEY_meth_get0_info(int *ppkey_id, int *pflags, + const EVP_PKEY_METHOD *meth); +void EVP_PKEY_meth_copy(EVP_PKEY_METHOD *dst, const EVP_PKEY_METHOD *src); +void EVP_PKEY_meth_free(EVP_PKEY_METHOD *pmeth); +int EVP_PKEY_meth_add0(const EVP_PKEY_METHOD *pmeth); + +EVP_PKEY_CTX *EVP_PKEY_CTX_new(EVP_PKEY *pkey, ENGINE *e); +EVP_PKEY_CTX *EVP_PKEY_CTX_new_id(int id, ENGINE *e); +EVP_PKEY_CTX *EVP_PKEY_CTX_dup(EVP_PKEY_CTX *ctx); +void EVP_PKEY_CTX_free(EVP_PKEY_CTX *ctx); + +int EVP_PKEY_CTX_ctrl(EVP_PKEY_CTX *ctx, int keytype, int optype, + int cmd, int p1, void *p2); +int EVP_PKEY_CTX_ctrl_str(EVP_PKEY_CTX *ctx, const char *type, + const char *value); + +int EVP_PKEY_CTX_get_operation(EVP_PKEY_CTX *ctx); +void EVP_PKEY_CTX_set0_keygen_info(EVP_PKEY_CTX *ctx, int *dat, int datlen); + +EVP_PKEY *EVP_PKEY_new_mac_key(int type, ENGINE *e, + const unsigned char *key, int keylen); + +void EVP_PKEY_CTX_set_data(EVP_PKEY_CTX *ctx, void *data); +void *EVP_PKEY_CTX_get_data(EVP_PKEY_CTX *ctx); +EVP_PKEY *EVP_PKEY_CTX_get0_pkey(EVP_PKEY_CTX *ctx); + +EVP_PKEY *EVP_PKEY_CTX_get0_peerkey(EVP_PKEY_CTX *ctx); + +void EVP_PKEY_CTX_set_app_data(EVP_PKEY_CTX *ctx, void *data); +void *EVP_PKEY_CTX_get_app_data(EVP_PKEY_CTX *ctx); + +int EVP_PKEY_sign_init(EVP_PKEY_CTX *ctx); +int EVP_PKEY_sign(EVP_PKEY_CTX *ctx, + unsigned char *sig, size_t *siglen, + const unsigned char *tbs, size_t tbslen); +int EVP_PKEY_verify_init(EVP_PKEY_CTX *ctx); +int EVP_PKEY_verify(EVP_PKEY_CTX *ctx, + const unsigned char *sig, size_t siglen, + const unsigned char *tbs, size_t tbslen); +int EVP_PKEY_verify_recover_init(EVP_PKEY_CTX *ctx); +int EVP_PKEY_verify_recover(EVP_PKEY_CTX *ctx, + unsigned char *rout, size_t *routlen, + const unsigned char *sig, size_t siglen); +int EVP_PKEY_encrypt_init(EVP_PKEY_CTX *ctx); +int EVP_PKEY_encrypt(EVP_PKEY_CTX *ctx, + unsigned char *out, size_t *outlen, + const unsigned char *in, size_t inlen); +int EVP_PKEY_decrypt_init(EVP_PKEY_CTX *ctx); +int EVP_PKEY_decrypt(EVP_PKEY_CTX *ctx, + unsigned char *out, size_t *outlen, + const unsigned char *in, size_t inlen); + +int EVP_PKEY_derive_init(EVP_PKEY_CTX *ctx); +int EVP_PKEY_derive_set_peer(EVP_PKEY_CTX *ctx, EVP_PKEY *peer); +int EVP_PKEY_derive(EVP_PKEY_CTX *ctx, unsigned char *key, size_t *keylen); + +typedef int EVP_PKEY_gen_cb (EVP_PKEY_CTX *ctx); + +int EVP_PKEY_paramgen_init(EVP_PKEY_CTX *ctx); +int EVP_PKEY_paramgen(EVP_PKEY_CTX *ctx, EVP_PKEY **ppkey); +int EVP_PKEY_keygen_init(EVP_PKEY_CTX *ctx); +int EVP_PKEY_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY **ppkey); + +void EVP_PKEY_CTX_set_cb(EVP_PKEY_CTX *ctx, EVP_PKEY_gen_cb *cb); +EVP_PKEY_gen_cb *EVP_PKEY_CTX_get_cb(EVP_PKEY_CTX *ctx); + +int EVP_PKEY_CTX_get_keygen_info(EVP_PKEY_CTX *ctx, int idx); + +void EVP_PKEY_meth_set_init(EVP_PKEY_METHOD *pmeth, + int (*init) (EVP_PKEY_CTX *ctx)); + +void EVP_PKEY_meth_set_copy(EVP_PKEY_METHOD *pmeth, + int (*copy) (EVP_PKEY_CTX *dst, + EVP_PKEY_CTX *src)); + +void EVP_PKEY_meth_set_cleanup(EVP_PKEY_METHOD *pmeth, + void (*cleanup) (EVP_PKEY_CTX *ctx)); + +void EVP_PKEY_meth_set_paramgen(EVP_PKEY_METHOD *pmeth, + int (*paramgen_init) (EVP_PKEY_CTX *ctx), + int (*paramgen) (EVP_PKEY_CTX *ctx, + EVP_PKEY *pkey)); + +void EVP_PKEY_meth_set_keygen(EVP_PKEY_METHOD *pmeth, + int (*keygen_init) (EVP_PKEY_CTX *ctx), + int (*keygen) (EVP_PKEY_CTX *ctx, + EVP_PKEY *pkey)); + +void EVP_PKEY_meth_set_sign(EVP_PKEY_METHOD *pmeth, + int (*sign_init) (EVP_PKEY_CTX *ctx), + int (*sign) (EVP_PKEY_CTX *ctx, + unsigned char *sig, size_t *siglen, + const unsigned char *tbs, + size_t tbslen)); + +void EVP_PKEY_meth_set_verify(EVP_PKEY_METHOD *pmeth, + int (*verify_init) (EVP_PKEY_CTX *ctx), + int (*verify) (EVP_PKEY_CTX *ctx, + const unsigned char *sig, + size_t siglen, + const unsigned char *tbs, + size_t tbslen)); + +void EVP_PKEY_meth_set_verify_recover(EVP_PKEY_METHOD *pmeth, + int (*verify_recover_init) (EVP_PKEY_CTX + *ctx), + int (*verify_recover) (EVP_PKEY_CTX + *ctx, + unsigned char + *sig, + size_t *siglen, + const unsigned + char *tbs, + size_t tbslen)); + +void EVP_PKEY_meth_set_signctx(EVP_PKEY_METHOD *pmeth, + int (*signctx_init) (EVP_PKEY_CTX *ctx, + EVP_MD_CTX *mctx), + int (*signctx) (EVP_PKEY_CTX *ctx, + unsigned char *sig, + size_t *siglen, + EVP_MD_CTX *mctx)); + +void EVP_PKEY_meth_set_verifyctx(EVP_PKEY_METHOD *pmeth, + int (*verifyctx_init) (EVP_PKEY_CTX *ctx, + EVP_MD_CTX *mctx), + int (*verifyctx) (EVP_PKEY_CTX *ctx, + const unsigned char *sig, + int siglen, + EVP_MD_CTX *mctx)); + +void EVP_PKEY_meth_set_encrypt(EVP_PKEY_METHOD *pmeth, + int (*encrypt_init) (EVP_PKEY_CTX *ctx), + int (*encryptfn) (EVP_PKEY_CTX *ctx, + unsigned char *out, + size_t *outlen, + const unsigned char *in, + size_t inlen)); + +void EVP_PKEY_meth_set_decrypt(EVP_PKEY_METHOD *pmeth, + int (*decrypt_init) (EVP_PKEY_CTX *ctx), + int (*decrypt) (EVP_PKEY_CTX *ctx, + unsigned char *out, + size_t *outlen, + const unsigned char *in, + size_t inlen)); + +void EVP_PKEY_meth_set_derive(EVP_PKEY_METHOD *pmeth, + int (*derive_init) (EVP_PKEY_CTX *ctx), + int (*derive) (EVP_PKEY_CTX *ctx, + unsigned char *key, + size_t *keylen)); + +void EVP_PKEY_meth_set_ctrl(EVP_PKEY_METHOD *pmeth, + int (*ctrl) (EVP_PKEY_CTX *ctx, int type, int p1, + void *p2), + int (*ctrl_str) (EVP_PKEY_CTX *ctx, + const char *type, + const char *value)); + +void EVP_add_alg_module(void); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_EVP_strings(void); + +/* Error codes for the EVP functions. */ + +/* Function codes. */ +# define EVP_F_AESNI_INIT_KEY 165 +# define EVP_F_AESNI_XTS_CIPHER 176 +# define EVP_F_AES_INIT_KEY 133 +# define EVP_F_AES_T4_INIT_KEY 178 +# define EVP_F_AES_XTS 172 +# define EVP_F_AES_XTS_CIPHER 175 +# define EVP_F_ALG_MODULE_INIT 177 +# define EVP_F_CAMELLIA_INIT_KEY 159 +# define EVP_F_CMAC_INIT 173 +# define EVP_F_CMLL_T4_INIT_KEY 179 +# define EVP_F_D2I_PKEY 100 +# define EVP_F_DO_SIGVER_INIT 161 +# define EVP_F_DSAPKEY2PKCS8 134 +# define EVP_F_DSA_PKEY2PKCS8 135 +# define EVP_F_ECDSA_PKEY2PKCS8 129 +# define EVP_F_ECKEY_PKEY2PKCS8 132 +# define EVP_F_EVP_CIPHERINIT_EX 123 +# define EVP_F_EVP_CIPHER_CTX_COPY 163 +# define EVP_F_EVP_CIPHER_CTX_CTRL 124 +# define EVP_F_EVP_CIPHER_CTX_SET_KEY_LENGTH 122 +# define EVP_F_EVP_DECRYPTFINAL_EX 101 +# define EVP_F_EVP_DIGESTINIT_EX 128 +# define EVP_F_EVP_ENCRYPTFINAL_EX 127 +# define EVP_F_EVP_MD_CTX_COPY_EX 110 +# define EVP_F_EVP_MD_SIZE 162 +# define EVP_F_EVP_OPENINIT 102 +# define EVP_F_EVP_PBE_ALG_ADD 115 +# define EVP_F_EVP_PBE_ALG_ADD_TYPE 160 +# define EVP_F_EVP_PBE_CIPHERINIT 116 +# define EVP_F_EVP_PKCS82PKEY 111 +# define EVP_F_EVP_PKCS82PKEY_BROKEN 136 +# define EVP_F_EVP_PKEY2PKCS8_BROKEN 113 +# define EVP_F_EVP_PKEY_COPY_PARAMETERS 103 +# define EVP_F_EVP_PKEY_CTX_CTRL 137 +# define EVP_F_EVP_PKEY_CTX_CTRL_STR 150 +# define EVP_F_EVP_PKEY_CTX_DUP 156 +# define EVP_F_EVP_PKEY_DECRYPT 104 +# define EVP_F_EVP_PKEY_DECRYPT_INIT 138 +# define EVP_F_EVP_PKEY_DECRYPT_OLD 151 +# define EVP_F_EVP_PKEY_DERIVE 153 +# define EVP_F_EVP_PKEY_DERIVE_INIT 154 +# define EVP_F_EVP_PKEY_DERIVE_SET_PEER 155 +# define EVP_F_EVP_PKEY_ENCRYPT 105 +# define EVP_F_EVP_PKEY_ENCRYPT_INIT 139 +# define EVP_F_EVP_PKEY_ENCRYPT_OLD 152 +# define EVP_F_EVP_PKEY_GET1_DH 119 +# define EVP_F_EVP_PKEY_GET1_DSA 120 +# define EVP_F_EVP_PKEY_GET1_ECDSA 130 +# define EVP_F_EVP_PKEY_GET1_EC_KEY 131 +# define EVP_F_EVP_PKEY_GET1_RSA 121 +# define EVP_F_EVP_PKEY_KEYGEN 146 +# define EVP_F_EVP_PKEY_KEYGEN_INIT 147 +# define EVP_F_EVP_PKEY_NEW 106 +# define EVP_F_EVP_PKEY_PARAMGEN 148 +# define EVP_F_EVP_PKEY_PARAMGEN_INIT 149 +# define EVP_F_EVP_PKEY_SIGN 140 +# define EVP_F_EVP_PKEY_SIGN_INIT 141 +# define EVP_F_EVP_PKEY_VERIFY 142 +# define EVP_F_EVP_PKEY_VERIFY_INIT 143 +# define EVP_F_EVP_PKEY_VERIFY_RECOVER 144 +# define EVP_F_EVP_PKEY_VERIFY_RECOVER_INIT 145 +# define EVP_F_EVP_RIJNDAEL 126 +# define EVP_F_EVP_SIGNFINAL 107 +# define EVP_F_EVP_VERIFYFINAL 108 +# define EVP_F_FIPS_CIPHERINIT 166 +# define EVP_F_FIPS_CIPHER_CTX_COPY 170 +# define EVP_F_FIPS_CIPHER_CTX_CTRL 167 +# define EVP_F_FIPS_CIPHER_CTX_SET_KEY_LENGTH 171 +# define EVP_F_FIPS_DIGESTINIT 168 +# define EVP_F_FIPS_MD_CTX_COPY 169 +# define EVP_F_HMAC_INIT_EX 174 +# define EVP_F_INT_CTX_NEW 157 +# define EVP_F_PKCS5_PBE_KEYIVGEN 117 +# define EVP_F_PKCS5_V2_PBE_KEYIVGEN 118 +# define EVP_F_PKCS5_V2_PBKDF2_KEYIVGEN 164 +# define EVP_F_PKCS8_SET_BROKEN 112 +# define EVP_F_PKEY_SET_TYPE 158 +# define EVP_F_RC2_MAGIC_TO_METH 109 +# define EVP_F_RC5_CTRL 125 + +/* Reason codes. */ +# define EVP_R_AES_IV_SETUP_FAILED 162 +# define EVP_R_AES_KEY_SETUP_FAILED 143 +# define EVP_R_ASN1_LIB 140 +# define EVP_R_BAD_BLOCK_LENGTH 136 +# define EVP_R_BAD_DECRYPT 100 +# define EVP_R_BAD_KEY_LENGTH 137 +# define EVP_R_BN_DECODE_ERROR 112 +# define EVP_R_BN_PUBKEY_ERROR 113 +# define EVP_R_BUFFER_TOO_SMALL 155 +# define EVP_R_CAMELLIA_KEY_SETUP_FAILED 157 +# define EVP_R_CIPHER_PARAMETER_ERROR 122 +# define EVP_R_COMMAND_NOT_SUPPORTED 147 +# define EVP_R_CTRL_NOT_IMPLEMENTED 132 +# define EVP_R_CTRL_OPERATION_NOT_IMPLEMENTED 133 +# define EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH 138 +# define EVP_R_DECODE_ERROR 114 +# define EVP_R_DIFFERENT_KEY_TYPES 101 +# define EVP_R_DIFFERENT_PARAMETERS 153 +# define EVP_R_DISABLED_FOR_FIPS 163 +# define EVP_R_ENCODE_ERROR 115 +# define EVP_R_ERROR_LOADING_SECTION 165 +# define EVP_R_ERROR_SETTING_FIPS_MODE 166 +# define EVP_R_EVP_PBE_CIPHERINIT_ERROR 119 +# define EVP_R_EXPECTING_AN_RSA_KEY 127 +# define EVP_R_EXPECTING_A_DH_KEY 128 +# define EVP_R_EXPECTING_A_DSA_KEY 129 +# define EVP_R_EXPECTING_A_ECDSA_KEY 141 +# define EVP_R_EXPECTING_A_EC_KEY 142 +# define EVP_R_FIPS_MODE_NOT_SUPPORTED 167 +# define EVP_R_INITIALIZATION_ERROR 134 +# define EVP_R_INPUT_NOT_INITIALIZED 111 +# define EVP_R_INVALID_DIGEST 152 +# define EVP_R_INVALID_FIPS_MODE 168 +# define EVP_R_INVALID_KEY_LENGTH 130 +# define EVP_R_INVALID_OPERATION 148 +# define EVP_R_IV_TOO_LARGE 102 +# define EVP_R_KEYGEN_FAILURE 120 +# define EVP_R_MESSAGE_DIGEST_IS_NULL 159 +# define EVP_R_METHOD_NOT_SUPPORTED 144 +# define EVP_R_MISSING_PARAMETERS 103 +# define EVP_R_NO_CIPHER_SET 131 +# define EVP_R_NO_DEFAULT_DIGEST 158 +# define EVP_R_NO_DIGEST_SET 139 +# define EVP_R_NO_DSA_PARAMETERS 116 +# define EVP_R_NO_KEY_SET 154 +# define EVP_R_NO_OPERATION_SET 149 +# define EVP_R_NO_SIGN_FUNCTION_CONFIGURED 104 +# define EVP_R_NO_VERIFY_FUNCTION_CONFIGURED 105 +# define EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE 150 +# define EVP_R_OPERATON_NOT_INITIALIZED 151 +# define EVP_R_PKCS8_UNKNOWN_BROKEN_TYPE 117 +# define EVP_R_PRIVATE_KEY_DECODE_ERROR 145 +# define EVP_R_PRIVATE_KEY_ENCODE_ERROR 146 +# define EVP_R_PUBLIC_KEY_NOT_RSA 106 +# define EVP_R_TOO_LARGE 164 +# define EVP_R_UNKNOWN_CIPHER 160 +# define EVP_R_UNKNOWN_DIGEST 161 +# define EVP_R_UNKNOWN_OPTION 169 +# define EVP_R_UNKNOWN_PBE_ALGORITHM 121 +# define EVP_R_UNSUPORTED_NUMBER_OF_ROUNDS 135 +# define EVP_R_UNSUPPORTED_ALGORITHM 156 +# define EVP_R_UNSUPPORTED_CIPHER 107 +# define EVP_R_UNSUPPORTED_KEYLENGTH 123 +# define EVP_R_UNSUPPORTED_KEY_DERIVATION_FUNCTION 124 +# define EVP_R_UNSUPPORTED_KEY_SIZE 108 +# define EVP_R_UNSUPPORTED_PRF 125 +# define EVP_R_UNSUPPORTED_PRIVATE_KEY_ALGORITHM 118 +# define EVP_R_UNSUPPORTED_SALT_TYPE 126 +# define EVP_R_WRAP_MODE_NOT_ALLOWED 170 +# define EVP_R_WRONG_FINAL_BLOCK_LENGTH 109 +# define EVP_R_WRONG_PUBLIC_KEY_TYPE 110 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/win/openssl/include/openssl/hmac.h b/hdssd/external/win/openssl/include/openssl/hmac.h new file mode 100644 index 0000000..b8b55cd --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/hmac.h @@ -0,0 +1,109 @@ +/* crypto/hmac/hmac.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ +#ifndef HEADER_HMAC_H +# define HEADER_HMAC_H + +# include + +# ifdef OPENSSL_NO_HMAC +# error HMAC is disabled. +# endif + +# include + +# define HMAC_MAX_MD_CBLOCK 128/* largest known is SHA512 */ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct hmac_ctx_st { + const EVP_MD *md; + EVP_MD_CTX md_ctx; + EVP_MD_CTX i_ctx; + EVP_MD_CTX o_ctx; + unsigned int key_length; + unsigned char key[HMAC_MAX_MD_CBLOCK]; +} HMAC_CTX; + +# define HMAC_size(e) (EVP_MD_size((e)->md)) + +void HMAC_CTX_init(HMAC_CTX *ctx); +void HMAC_CTX_cleanup(HMAC_CTX *ctx); + +/* deprecated */ +# define HMAC_cleanup(ctx) HMAC_CTX_cleanup(ctx) + +/* deprecated */ +int HMAC_Init(HMAC_CTX *ctx, const void *key, int len, const EVP_MD *md); +int HMAC_Init_ex(HMAC_CTX *ctx, const void *key, int len, + const EVP_MD *md, ENGINE *impl); +int HMAC_Update(HMAC_CTX *ctx, const unsigned char *data, size_t len); +int HMAC_Final(HMAC_CTX *ctx, unsigned char *md, unsigned int *len); +unsigned char *HMAC(const EVP_MD *evp_md, const void *key, int key_len, + const unsigned char *d, size_t n, unsigned char *md, + unsigned int *md_len); +int HMAC_CTX_copy(HMAC_CTX *dctx, HMAC_CTX *sctx); + +void HMAC_CTX_set_flags(HMAC_CTX *ctx, unsigned long flags); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/win/openssl/include/openssl/idea.h b/hdssd/external/win/openssl/include/openssl/idea.h new file mode 100644 index 0000000..6075984 --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/idea.h @@ -0,0 +1,105 @@ +/* crypto/idea/idea.h */ +/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_IDEA_H +# define HEADER_IDEA_H + +# include /* IDEA_INT, OPENSSL_NO_IDEA */ + +# ifdef OPENSSL_NO_IDEA +# error IDEA is disabled. +# endif + +# define IDEA_ENCRYPT 1 +# define IDEA_DECRYPT 0 + +# define IDEA_BLOCK 8 +# define IDEA_KEY_LENGTH 16 + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct idea_key_st { + IDEA_INT data[9][6]; +} IDEA_KEY_SCHEDULE; + +const char *idea_options(void); +void idea_ecb_encrypt(const unsigned char *in, unsigned char *out, + IDEA_KEY_SCHEDULE *ks); +# ifdef OPENSSL_FIPS +void private_idea_set_encrypt_key(const unsigned char *key, + IDEA_KEY_SCHEDULE *ks); +# endif +void idea_set_encrypt_key(const unsigned char *key, IDEA_KEY_SCHEDULE *ks); +void idea_set_decrypt_key(IDEA_KEY_SCHEDULE *ek, IDEA_KEY_SCHEDULE *dk); +void idea_cbc_encrypt(const unsigned char *in, unsigned char *out, + long length, IDEA_KEY_SCHEDULE *ks, unsigned char *iv, + int enc); +void idea_cfb64_encrypt(const unsigned char *in, unsigned char *out, + long length, IDEA_KEY_SCHEDULE *ks, unsigned char *iv, + int *num, int enc); +void idea_ofb64_encrypt(const unsigned char *in, unsigned char *out, + long length, IDEA_KEY_SCHEDULE *ks, unsigned char *iv, + int *num); +void idea_encrypt(unsigned long *in, IDEA_KEY_SCHEDULE *ks); +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/win/openssl/include/openssl/krb5_asn.h b/hdssd/external/win/openssl/include/openssl/krb5_asn.h new file mode 100644 index 0000000..9cf5a26 --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/krb5_asn.h @@ -0,0 +1,240 @@ +/* krb5_asn.h */ +/* + * Written by Vern Staats for the OpenSSL project, ** + * using ocsp/{*.h,*asn*.c} as a starting point + */ + +/* ==================================================================== + * Copyright (c) 1998-2000 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_KRB5_ASN_H +# define HEADER_KRB5_ASN_H + +/* + * #include + */ +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * ASN.1 from Kerberos RFC 1510 + */ + +/*- EncryptedData ::= SEQUENCE { + * etype[0] INTEGER, -- EncryptionType + * kvno[1] INTEGER OPTIONAL, + * cipher[2] OCTET STRING -- ciphertext + * } + */ +typedef struct krb5_encdata_st { + ASN1_INTEGER *etype; + ASN1_INTEGER *kvno; + ASN1_OCTET_STRING *cipher; +} KRB5_ENCDATA; + +DECLARE_STACK_OF(KRB5_ENCDATA) + +/*- PrincipalName ::= SEQUENCE { + * name-type[0] INTEGER, + * name-string[1] SEQUENCE OF GeneralString + * } + */ +typedef struct krb5_princname_st { + ASN1_INTEGER *nametype; + STACK_OF(ASN1_GENERALSTRING) *namestring; +} KRB5_PRINCNAME; + +DECLARE_STACK_OF(KRB5_PRINCNAME) + +/*- Ticket ::= [APPLICATION 1] SEQUENCE { + * tkt-vno[0] INTEGER, + * realm[1] Realm, + * sname[2] PrincipalName, + * enc-part[3] EncryptedData + * } + */ +typedef struct krb5_tktbody_st { + ASN1_INTEGER *tktvno; + ASN1_GENERALSTRING *realm; + KRB5_PRINCNAME *sname; + KRB5_ENCDATA *encdata; +} KRB5_TKTBODY; + +typedef STACK_OF(KRB5_TKTBODY) KRB5_TICKET; +DECLARE_STACK_OF(KRB5_TKTBODY) + +/*- AP-REQ ::= [APPLICATION 14] SEQUENCE { + * pvno[0] INTEGER, + * msg-type[1] INTEGER, + * ap-options[2] APOptions, + * ticket[3] Ticket, + * authenticator[4] EncryptedData + * } + * + * APOptions ::= BIT STRING { + * reserved(0), use-session-key(1), mutual-required(2) } + */ +typedef struct krb5_ap_req_st { + ASN1_INTEGER *pvno; + ASN1_INTEGER *msgtype; + ASN1_BIT_STRING *apoptions; + KRB5_TICKET *ticket; + KRB5_ENCDATA *authenticator; +} KRB5_APREQBODY; + +typedef STACK_OF(KRB5_APREQBODY) KRB5_APREQ; +DECLARE_STACK_OF(KRB5_APREQBODY) + +/* Authenticator Stuff */ + +/*- Checksum ::= SEQUENCE { + * cksumtype[0] INTEGER, + * checksum[1] OCTET STRING + * } + */ +typedef struct krb5_checksum_st { + ASN1_INTEGER *ctype; + ASN1_OCTET_STRING *checksum; +} KRB5_CHECKSUM; + +DECLARE_STACK_OF(KRB5_CHECKSUM) + +/*- EncryptionKey ::= SEQUENCE { + * keytype[0] INTEGER, + * keyvalue[1] OCTET STRING + * } + */ +typedef struct krb5_encryptionkey_st { + ASN1_INTEGER *ktype; + ASN1_OCTET_STRING *keyvalue; +} KRB5_ENCKEY; + +DECLARE_STACK_OF(KRB5_ENCKEY) + +/*- AuthorizationData ::= SEQUENCE OF SEQUENCE { + * ad-type[0] INTEGER, + * ad-data[1] OCTET STRING + * } + */ +typedef struct krb5_authorization_st { + ASN1_INTEGER *adtype; + ASN1_OCTET_STRING *addata; +} KRB5_AUTHDATA; + +DECLARE_STACK_OF(KRB5_AUTHDATA) + +/*- -- Unencrypted authenticator + * Authenticator ::= [APPLICATION 2] SEQUENCE { + * authenticator-vno[0] INTEGER, + * crealm[1] Realm, + * cname[2] PrincipalName, + * cksum[3] Checksum OPTIONAL, + * cusec[4] INTEGER, + * ctime[5] KerberosTime, + * subkey[6] EncryptionKey OPTIONAL, + * seq-number[7] INTEGER OPTIONAL, + * authorization-data[8] AuthorizationData OPTIONAL + * } + */ +typedef struct krb5_authenticator_st { + ASN1_INTEGER *avno; + ASN1_GENERALSTRING *crealm; + KRB5_PRINCNAME *cname; + KRB5_CHECKSUM *cksum; + ASN1_INTEGER *cusec; + ASN1_GENERALIZEDTIME *ctime; + KRB5_ENCKEY *subkey; + ASN1_INTEGER *seqnum; + KRB5_AUTHDATA *authorization; +} KRB5_AUTHENTBODY; + +typedef STACK_OF(KRB5_AUTHENTBODY) KRB5_AUTHENT; +DECLARE_STACK_OF(KRB5_AUTHENTBODY) + +/*- DECLARE_ASN1_FUNCTIONS(type) = DECLARE_ASN1_FUNCTIONS_name(type, type) = + * type *name##_new(void); + * void name##_free(type *a); + * DECLARE_ASN1_ENCODE_FUNCTIONS(type, name, name) = + * DECLARE_ASN1_ENCODE_FUNCTIONS(type, itname, name) = + * type *d2i_##name(type **a, const unsigned char **in, long len); + * int i2d_##name(type *a, unsigned char **out); + * DECLARE_ASN1_ITEM(itname) = OPENSSL_EXTERN const ASN1_ITEM itname##_it + */ + +DECLARE_ASN1_FUNCTIONS(KRB5_ENCDATA) +DECLARE_ASN1_FUNCTIONS(KRB5_PRINCNAME) +DECLARE_ASN1_FUNCTIONS(KRB5_TKTBODY) +DECLARE_ASN1_FUNCTIONS(KRB5_APREQBODY) +DECLARE_ASN1_FUNCTIONS(KRB5_TICKET) +DECLARE_ASN1_FUNCTIONS(KRB5_APREQ) + +DECLARE_ASN1_FUNCTIONS(KRB5_CHECKSUM) +DECLARE_ASN1_FUNCTIONS(KRB5_ENCKEY) +DECLARE_ASN1_FUNCTIONS(KRB5_AUTHDATA) +DECLARE_ASN1_FUNCTIONS(KRB5_AUTHENTBODY) +DECLARE_ASN1_FUNCTIONS(KRB5_AUTHENT) + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/win/openssl/include/openssl/kssl.h b/hdssd/external/win/openssl/include/openssl/kssl.h new file mode 100644 index 0000000..ae8a51f --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/kssl.h @@ -0,0 +1,197 @@ +/* ssl/kssl.h */ +/* + * Written by Vern Staats for the OpenSSL project + * 2000. project 2000. + */ +/* ==================================================================== + * Copyright (c) 2000 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +/* + ** 19990701 VRS Started. + */ + +#ifndef KSSL_H +# define KSSL_H + +# include + +# ifndef OPENSSL_NO_KRB5 + +# include +# include +# include +# ifdef OPENSSL_SYS_WIN32 +/* + * These can sometimes get redefined indirectly by krb5 header files after + * they get undefed in ossl_typ.h + */ +# undef X509_NAME +# undef X509_EXTENSIONS +# undef OCSP_REQUEST +# undef OCSP_RESPONSE +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Depending on which KRB5 implementation used, some types from + * the other may be missing. Resolve that here and now + */ +# ifdef KRB5_HEIMDAL +typedef unsigned char krb5_octet; +# define FAR +# else + +# ifndef FAR +# define FAR +# endif + +# endif + +/*- + * Uncomment this to debug kssl problems or + * to trace usage of the Kerberos session key + * + * #define KSSL_DEBUG + */ + +# ifndef KRB5SVC +# define KRB5SVC "host" +# endif + +# ifndef KRB5KEYTAB +# define KRB5KEYTAB "/etc/krb5.keytab" +# endif + +# ifndef KRB5SENDAUTH +# define KRB5SENDAUTH 1 +# endif + +# ifndef KRB5CHECKAUTH +# define KRB5CHECKAUTH 1 +# endif + +# ifndef KSSL_CLOCKSKEW +# define KSSL_CLOCKSKEW 300; +# endif + +# define KSSL_ERR_MAX 255 +typedef struct kssl_err_st { + int reason; + char text[KSSL_ERR_MAX + 1]; +} KSSL_ERR; + +/*- Context for passing + * (1) Kerberos session key to SSL, and + * (2) Config data between application and SSL lib + */ +typedef struct kssl_ctx_st { + /* used by: disposition: */ + char *service_name; /* C,S default ok (kssl) */ + char *service_host; /* C input, REQUIRED */ + char *client_princ; /* S output from krb5 ticket */ + char *keytab_file; /* S NULL (/etc/krb5.keytab) */ + char *cred_cache; /* C NULL (default) */ + krb5_enctype enctype; + int length; + krb5_octet FAR *key; +} KSSL_CTX; + +# define KSSL_CLIENT 1 +# define KSSL_SERVER 2 +# define KSSL_SERVICE 3 +# define KSSL_KEYTAB 4 + +# define KSSL_CTX_OK 0 +# define KSSL_CTX_ERR 1 +# define KSSL_NOMEM 2 + +/* Public (for use by applications that use OpenSSL with Kerberos 5 support */ +krb5_error_code kssl_ctx_setstring(KSSL_CTX *kssl_ctx, int which, char *text); +KSSL_CTX *kssl_ctx_new(void); +KSSL_CTX *kssl_ctx_free(KSSL_CTX *kssl_ctx); +void kssl_ctx_show(KSSL_CTX *kssl_ctx); +krb5_error_code kssl_ctx_setprinc(KSSL_CTX *kssl_ctx, int which, + krb5_data *realm, krb5_data *entity, + int nentities); +krb5_error_code kssl_cget_tkt(KSSL_CTX *kssl_ctx, krb5_data **enc_tktp, + krb5_data *authenp, KSSL_ERR *kssl_err); +krb5_error_code kssl_sget_tkt(KSSL_CTX *kssl_ctx, krb5_data *indata, + krb5_ticket_times *ttimes, KSSL_ERR *kssl_err); +krb5_error_code kssl_ctx_setkey(KSSL_CTX *kssl_ctx, krb5_keyblock *session); +void kssl_err_set(KSSL_ERR *kssl_err, int reason, char *text); +void kssl_krb5_free_data_contents(krb5_context context, krb5_data *data); +krb5_error_code kssl_build_principal_2(krb5_context context, + krb5_principal *princ, int rlen, + const char *realm, int slen, + const char *svc, int hlen, + const char *host); +krb5_error_code kssl_validate_times(krb5_timestamp atime, + krb5_ticket_times *ttimes); +krb5_error_code kssl_check_authent(KSSL_CTX *kssl_ctx, krb5_data *authentp, + krb5_timestamp *atimep, + KSSL_ERR *kssl_err); +unsigned char *kssl_skip_confound(krb5_enctype enctype, unsigned char *authn); + +void SSL_set0_kssl_ctx(SSL *s, KSSL_CTX *kctx); +KSSL_CTX *SSL_get0_kssl_ctx(SSL *s); +char *kssl_ctx_get0_client_princ(KSSL_CTX *kctx); + +#ifdef __cplusplus +} +#endif +# endif /* OPENSSL_NO_KRB5 */ +#endif /* KSSL_H */ diff --git a/hdssd/external/win/openssl/include/openssl/lhash.h b/hdssd/external/win/openssl/include/openssl/lhash.h new file mode 100644 index 0000000..b6c328b --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/lhash.h @@ -0,0 +1,240 @@ +/* crypto/lhash/lhash.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +/* + * Header for dynamic hash table routines Author - Eric Young + */ + +#ifndef HEADER_LHASH_H +# define HEADER_LHASH_H + +# include +# ifndef OPENSSL_NO_FP_API +# include +# endif + +# ifndef OPENSSL_NO_BIO +# include +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct lhash_node_st { + void *data; + struct lhash_node_st *next; +# ifndef OPENSSL_NO_HASH_COMP + unsigned long hash; +# endif +} LHASH_NODE; + +typedef int (*LHASH_COMP_FN_TYPE) (const void *, const void *); +typedef unsigned long (*LHASH_HASH_FN_TYPE) (const void *); +typedef void (*LHASH_DOALL_FN_TYPE) (void *); +typedef void (*LHASH_DOALL_ARG_FN_TYPE) (void *, void *); + +/* + * Macros for declaring and implementing type-safe wrappers for LHASH + * callbacks. This way, callbacks can be provided to LHASH structures without + * function pointer casting and the macro-defined callbacks provide + * per-variable casting before deferring to the underlying type-specific + * callbacks. NB: It is possible to place a "static" in front of both the + * DECLARE and IMPLEMENT macros if the functions are strictly internal. + */ + +/* First: "hash" functions */ +# define DECLARE_LHASH_HASH_FN(name, o_type) \ + unsigned long name##_LHASH_HASH(const void *); +# define IMPLEMENT_LHASH_HASH_FN(name, o_type) \ + unsigned long name##_LHASH_HASH(const void *arg) { \ + const o_type *a = arg; \ + return name##_hash(a); } +# define LHASH_HASH_FN(name) name##_LHASH_HASH + +/* Second: "compare" functions */ +# define DECLARE_LHASH_COMP_FN(name, o_type) \ + int name##_LHASH_COMP(const void *, const void *); +# define IMPLEMENT_LHASH_COMP_FN(name, o_type) \ + int name##_LHASH_COMP(const void *arg1, const void *arg2) { \ + const o_type *a = arg1; \ + const o_type *b = arg2; \ + return name##_cmp(a,b); } +# define LHASH_COMP_FN(name) name##_LHASH_COMP + +/* Third: "doall" functions */ +# define DECLARE_LHASH_DOALL_FN(name, o_type) \ + void name##_LHASH_DOALL(void *); +# define IMPLEMENT_LHASH_DOALL_FN(name, o_type) \ + void name##_LHASH_DOALL(void *arg) { \ + o_type *a = arg; \ + name##_doall(a); } +# define LHASH_DOALL_FN(name) name##_LHASH_DOALL + +/* Fourth: "doall_arg" functions */ +# define DECLARE_LHASH_DOALL_ARG_FN(name, o_type, a_type) \ + void name##_LHASH_DOALL_ARG(void *, void *); +# define IMPLEMENT_LHASH_DOALL_ARG_FN(name, o_type, a_type) \ + void name##_LHASH_DOALL_ARG(void *arg1, void *arg2) { \ + o_type *a = arg1; \ + a_type *b = arg2; \ + name##_doall_arg(a, b); } +# define LHASH_DOALL_ARG_FN(name) name##_LHASH_DOALL_ARG + +typedef struct lhash_st { + LHASH_NODE **b; + LHASH_COMP_FN_TYPE comp; + LHASH_HASH_FN_TYPE hash; + unsigned int num_nodes; + unsigned int num_alloc_nodes; + unsigned int p; + unsigned int pmax; + unsigned long up_load; /* load times 256 */ + unsigned long down_load; /* load times 256 */ + unsigned long num_items; + unsigned long num_expands; + unsigned long num_expand_reallocs; + unsigned long num_contracts; + unsigned long num_contract_reallocs; + unsigned long num_hash_calls; + unsigned long num_comp_calls; + unsigned long num_insert; + unsigned long num_replace; + unsigned long num_delete; + unsigned long num_no_delete; + unsigned long num_retrieve; + unsigned long num_retrieve_miss; + unsigned long num_hash_comps; + int error; +} _LHASH; /* Do not use _LHASH directly, use LHASH_OF + * and friends */ + +# define LH_LOAD_MULT 256 + +/* + * Indicates a malloc() error in the last call, this is only bad in + * lh_insert(). + */ +# define lh_error(lh) ((lh)->error) + +_LHASH *lh_new(LHASH_HASH_FN_TYPE h, LHASH_COMP_FN_TYPE c); +void lh_free(_LHASH *lh); +void *lh_insert(_LHASH *lh, void *data); +void *lh_delete(_LHASH *lh, const void *data); +void *lh_retrieve(_LHASH *lh, const void *data); +void lh_doall(_LHASH *lh, LHASH_DOALL_FN_TYPE func); +void lh_doall_arg(_LHASH *lh, LHASH_DOALL_ARG_FN_TYPE func, void *arg); +unsigned long lh_strhash(const char *c); +unsigned long lh_num_items(const _LHASH *lh); + +# ifndef OPENSSL_NO_FP_API +void lh_stats(const _LHASH *lh, FILE *out); +void lh_node_stats(const _LHASH *lh, FILE *out); +void lh_node_usage_stats(const _LHASH *lh, FILE *out); +# endif + +# ifndef OPENSSL_NO_BIO +void lh_stats_bio(const _LHASH *lh, BIO *out); +void lh_node_stats_bio(const _LHASH *lh, BIO *out); +void lh_node_usage_stats_bio(const _LHASH *lh, BIO *out); +# endif + +/* Type checking... */ + +# define LHASH_OF(type) struct lhash_st_##type + +# define DECLARE_LHASH_OF(type) LHASH_OF(type) { int dummy; } + +# define CHECKED_LHASH_OF(type,lh) \ + ((_LHASH *)CHECKED_PTR_OF(LHASH_OF(type),lh)) + +/* Define wrapper functions. */ +# define LHM_lh_new(type, name) \ + ((LHASH_OF(type) *)lh_new(LHASH_HASH_FN(name), LHASH_COMP_FN(name))) +# define LHM_lh_error(type, lh) \ + lh_error(CHECKED_LHASH_OF(type,lh)) +# define LHM_lh_insert(type, lh, inst) \ + ((type *)lh_insert(CHECKED_LHASH_OF(type, lh), \ + CHECKED_PTR_OF(type, inst))) +# define LHM_lh_retrieve(type, lh, inst) \ + ((type *)lh_retrieve(CHECKED_LHASH_OF(type, lh), \ + CHECKED_PTR_OF(type, inst))) +# define LHM_lh_delete(type, lh, inst) \ + ((type *)lh_delete(CHECKED_LHASH_OF(type, lh), \ + CHECKED_PTR_OF(type, inst))) +# define LHM_lh_doall(type, lh,fn) lh_doall(CHECKED_LHASH_OF(type, lh), fn) +# define LHM_lh_doall_arg(type, lh, fn, arg_type, arg) \ + lh_doall_arg(CHECKED_LHASH_OF(type, lh), fn, CHECKED_PTR_OF(arg_type, arg)) +# define LHM_lh_num_items(type, lh) lh_num_items(CHECKED_LHASH_OF(type, lh)) +# define LHM_lh_down_load(type, lh) (CHECKED_LHASH_OF(type, lh)->down_load) +# define LHM_lh_node_stats_bio(type, lh, out) \ + lh_node_stats_bio(CHECKED_LHASH_OF(type, lh), out) +# define LHM_lh_node_usage_stats_bio(type, lh, out) \ + lh_node_usage_stats_bio(CHECKED_LHASH_OF(type, lh), out) +# define LHM_lh_stats_bio(type, lh, out) \ + lh_stats_bio(CHECKED_LHASH_OF(type, lh), out) +# define LHM_lh_free(type, lh) lh_free(CHECKED_LHASH_OF(type, lh)) + +DECLARE_LHASH_OF(OPENSSL_STRING); +DECLARE_LHASH_OF(OPENSSL_CSTRING); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/win/openssl/include/openssl/md4.h b/hdssd/external/win/openssl/include/openssl/md4.h new file mode 100644 index 0000000..11fd712 --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/md4.h @@ -0,0 +1,119 @@ +/* crypto/md4/md4.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_MD4_H +# define HEADER_MD4_H + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# ifdef OPENSSL_NO_MD4 +# error MD4 is disabled. +# endif + +/*- + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + * ! MD4_LONG has to be at least 32 bits wide. If it's wider, then ! + * ! MD4_LONG_LOG2 has to be defined along. ! + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + */ + +# if defined(__LP32__) +# define MD4_LONG unsigned long +# elif defined(OPENSSL_SYS_CRAY) || defined(__ILP64__) +# define MD4_LONG unsigned long +# define MD4_LONG_LOG2 3 +/* + * _CRAY note. I could declare short, but I have no idea what impact + * does it have on performance on none-T3E machines. I could declare + * int, but at least on C90 sizeof(int) can be chosen at compile time. + * So I've chosen long... + * + */ +# else +# define MD4_LONG unsigned int +# endif + +# define MD4_CBLOCK 64 +# define MD4_LBLOCK (MD4_CBLOCK/4) +# define MD4_DIGEST_LENGTH 16 + +typedef struct MD4state_st { + MD4_LONG A, B, C, D; + MD4_LONG Nl, Nh; + MD4_LONG data[MD4_LBLOCK]; + unsigned int num; +} MD4_CTX; + +# ifdef OPENSSL_FIPS +int private_MD4_Init(MD4_CTX *c); +# endif +int MD4_Init(MD4_CTX *c); +int MD4_Update(MD4_CTX *c, const void *data, size_t len); +int MD4_Final(unsigned char *md, MD4_CTX *c); +unsigned char *MD4(const unsigned char *d, size_t n, unsigned char *md); +void MD4_Transform(MD4_CTX *c, const unsigned char *b); +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/win/openssl/include/openssl/md5.h b/hdssd/external/win/openssl/include/openssl/md5.h new file mode 100644 index 0000000..2659038 --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/md5.h @@ -0,0 +1,119 @@ +/* crypto/md5/md5.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_MD5_H +# define HEADER_MD5_H + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# ifdef OPENSSL_NO_MD5 +# error MD5 is disabled. +# endif + +/* + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + * ! MD5_LONG has to be at least 32 bits wide. If it's wider, then ! + * ! MD5_LONG_LOG2 has to be defined along. ! + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + */ + +# if defined(__LP32__) +# define MD5_LONG unsigned long +# elif defined(OPENSSL_SYS_CRAY) || defined(__ILP64__) +# define MD5_LONG unsigned long +# define MD5_LONG_LOG2 3 +/* + * _CRAY note. I could declare short, but I have no idea what impact + * does it have on performance on none-T3E machines. I could declare + * int, but at least on C90 sizeof(int) can be chosen at compile time. + * So I've chosen long... + * + */ +# else +# define MD5_LONG unsigned int +# endif + +# define MD5_CBLOCK 64 +# define MD5_LBLOCK (MD5_CBLOCK/4) +# define MD5_DIGEST_LENGTH 16 + +typedef struct MD5state_st { + MD5_LONG A, B, C, D; + MD5_LONG Nl, Nh; + MD5_LONG data[MD5_LBLOCK]; + unsigned int num; +} MD5_CTX; + +# ifdef OPENSSL_FIPS +int private_MD5_Init(MD5_CTX *c); +# endif +int MD5_Init(MD5_CTX *c); +int MD5_Update(MD5_CTX *c, const void *data, size_t len); +int MD5_Final(unsigned char *md, MD5_CTX *c); +unsigned char *MD5(const unsigned char *d, size_t n, unsigned char *md); +void MD5_Transform(MD5_CTX *c, const unsigned char *b); +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/win/openssl/include/openssl/mdc2.h b/hdssd/external/win/openssl/include/openssl/mdc2.h new file mode 100644 index 0000000..7efe53b --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/mdc2.h @@ -0,0 +1,94 @@ +/* crypto/mdc2/mdc2.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_MDC2_H +# define HEADER_MDC2_H + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# ifdef OPENSSL_NO_MDC2 +# error MDC2 is disabled. +# endif + +# define MDC2_BLOCK 8 +# define MDC2_DIGEST_LENGTH 16 + +typedef struct mdc2_ctx_st { + unsigned int num; + unsigned char data[MDC2_BLOCK]; + DES_cblock h, hh; + int pad_type; /* either 1 or 2, default 1 */ +} MDC2_CTX; + +# ifdef OPENSSL_FIPS +int private_MDC2_Init(MDC2_CTX *c); +# endif +int MDC2_Init(MDC2_CTX *c); +int MDC2_Update(MDC2_CTX *c, const unsigned char *data, size_t len); +int MDC2_Final(unsigned char *md, MDC2_CTX *c); +unsigned char *MDC2(const unsigned char *d, size_t n, unsigned char *md); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/win/openssl/include/openssl/modes.h b/hdssd/external/win/openssl/include/openssl/modes.h new file mode 100644 index 0000000..fd48849 --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/modes.h @@ -0,0 +1,163 @@ +/* ==================================================================== + * Copyright (c) 2008 The OpenSSL Project. All rights reserved. + * + * Rights for redistribution and usage in source and binary + * forms are granted according to the OpenSSL license. + */ + +#include + +#ifdef __cplusplus +extern "C" { +#endif +typedef void (*block128_f) (const unsigned char in[16], + unsigned char out[16], const void *key); + +typedef void (*cbc128_f) (const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], int enc); + +typedef void (*ctr128_f) (const unsigned char *in, unsigned char *out, + size_t blocks, const void *key, + const unsigned char ivec[16]); + +typedef void (*ccm128_f) (const unsigned char *in, unsigned char *out, + size_t blocks, const void *key, + const unsigned char ivec[16], + unsigned char cmac[16]); + +void CRYPTO_cbc128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], block128_f block); +void CRYPTO_cbc128_decrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], block128_f block); + +void CRYPTO_ctr128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], + unsigned char ecount_buf[16], unsigned int *num, + block128_f block); + +void CRYPTO_ctr128_encrypt_ctr32(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], + unsigned char ecount_buf[16], + unsigned int *num, ctr128_f ctr); + +void CRYPTO_ofb128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], int *num, + block128_f block); + +void CRYPTO_cfb128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], int *num, + int enc, block128_f block); +void CRYPTO_cfb128_8_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const void *key, + unsigned char ivec[16], int *num, + int enc, block128_f block); +void CRYPTO_cfb128_1_encrypt(const unsigned char *in, unsigned char *out, + size_t bits, const void *key, + unsigned char ivec[16], int *num, + int enc, block128_f block); + +size_t CRYPTO_cts128_encrypt_block(const unsigned char *in, + unsigned char *out, size_t len, + const void *key, unsigned char ivec[16], + block128_f block); +size_t CRYPTO_cts128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], cbc128_f cbc); +size_t CRYPTO_cts128_decrypt_block(const unsigned char *in, + unsigned char *out, size_t len, + const void *key, unsigned char ivec[16], + block128_f block); +size_t CRYPTO_cts128_decrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], cbc128_f cbc); + +size_t CRYPTO_nistcts128_encrypt_block(const unsigned char *in, + unsigned char *out, size_t len, + const void *key, + unsigned char ivec[16], + block128_f block); +size_t CRYPTO_nistcts128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], cbc128_f cbc); +size_t CRYPTO_nistcts128_decrypt_block(const unsigned char *in, + unsigned char *out, size_t len, + const void *key, + unsigned char ivec[16], + block128_f block); +size_t CRYPTO_nistcts128_decrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], cbc128_f cbc); + +typedef struct gcm128_context GCM128_CONTEXT; + +GCM128_CONTEXT *CRYPTO_gcm128_new(void *key, block128_f block); +void CRYPTO_gcm128_init(GCM128_CONTEXT *ctx, void *key, block128_f block); +void CRYPTO_gcm128_setiv(GCM128_CONTEXT *ctx, const unsigned char *iv, + size_t len); +int CRYPTO_gcm128_aad(GCM128_CONTEXT *ctx, const unsigned char *aad, + size_t len); +int CRYPTO_gcm128_encrypt(GCM128_CONTEXT *ctx, + const unsigned char *in, unsigned char *out, + size_t len); +int CRYPTO_gcm128_decrypt(GCM128_CONTEXT *ctx, + const unsigned char *in, unsigned char *out, + size_t len); +int CRYPTO_gcm128_encrypt_ctr32(GCM128_CONTEXT *ctx, + const unsigned char *in, unsigned char *out, + size_t len, ctr128_f stream); +int CRYPTO_gcm128_decrypt_ctr32(GCM128_CONTEXT *ctx, + const unsigned char *in, unsigned char *out, + size_t len, ctr128_f stream); +int CRYPTO_gcm128_finish(GCM128_CONTEXT *ctx, const unsigned char *tag, + size_t len); +void CRYPTO_gcm128_tag(GCM128_CONTEXT *ctx, unsigned char *tag, size_t len); +void CRYPTO_gcm128_release(GCM128_CONTEXT *ctx); + +typedef struct ccm128_context CCM128_CONTEXT; + +void CRYPTO_ccm128_init(CCM128_CONTEXT *ctx, + unsigned int M, unsigned int L, void *key, + block128_f block); +int CRYPTO_ccm128_setiv(CCM128_CONTEXT *ctx, const unsigned char *nonce, + size_t nlen, size_t mlen); +void CRYPTO_ccm128_aad(CCM128_CONTEXT *ctx, const unsigned char *aad, + size_t alen); +int CRYPTO_ccm128_encrypt(CCM128_CONTEXT *ctx, const unsigned char *inp, + unsigned char *out, size_t len); +int CRYPTO_ccm128_decrypt(CCM128_CONTEXT *ctx, const unsigned char *inp, + unsigned char *out, size_t len); +int CRYPTO_ccm128_encrypt_ccm64(CCM128_CONTEXT *ctx, const unsigned char *inp, + unsigned char *out, size_t len, + ccm128_f stream); +int CRYPTO_ccm128_decrypt_ccm64(CCM128_CONTEXT *ctx, const unsigned char *inp, + unsigned char *out, size_t len, + ccm128_f stream); +size_t CRYPTO_ccm128_tag(CCM128_CONTEXT *ctx, unsigned char *tag, size_t len); + +typedef struct xts128_context XTS128_CONTEXT; + +int CRYPTO_xts128_encrypt(const XTS128_CONTEXT *ctx, + const unsigned char iv[16], + const unsigned char *inp, unsigned char *out, + size_t len, int enc); + +size_t CRYPTO_128_wrap(void *key, const unsigned char *iv, + unsigned char *out, + const unsigned char *in, size_t inlen, + block128_f block); + +size_t CRYPTO_128_unwrap(void *key, const unsigned char *iv, + unsigned char *out, + const unsigned char *in, size_t inlen, + block128_f block); + +#ifdef __cplusplus +} +#endif diff --git a/hdssd/external/win/openssl/include/openssl/obj_mac.h b/hdssd/external/win/openssl/include/openssl/obj_mac.h new file mode 100644 index 0000000..779c309 --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/obj_mac.h @@ -0,0 +1,4194 @@ +/* crypto/objects/obj_mac.h */ + +/* + * THIS FILE IS GENERATED FROM objects.txt by objects.pl via the following + * command: perl objects.pl objects.txt obj_mac.num obj_mac.h + */ + +/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#define SN_undef "UNDEF" +#define LN_undef "undefined" +#define NID_undef 0 +#define OBJ_undef 0L + +#define SN_itu_t "ITU-T" +#define LN_itu_t "itu-t" +#define NID_itu_t 645 +#define OBJ_itu_t 0L + +#define NID_ccitt 404 +#define OBJ_ccitt OBJ_itu_t + +#define SN_iso "ISO" +#define LN_iso "iso" +#define NID_iso 181 +#define OBJ_iso 1L + +#define SN_joint_iso_itu_t "JOINT-ISO-ITU-T" +#define LN_joint_iso_itu_t "joint-iso-itu-t" +#define NID_joint_iso_itu_t 646 +#define OBJ_joint_iso_itu_t 2L + +#define NID_joint_iso_ccitt 393 +#define OBJ_joint_iso_ccitt OBJ_joint_iso_itu_t + +#define SN_member_body "member-body" +#define LN_member_body "ISO Member Body" +#define NID_member_body 182 +#define OBJ_member_body OBJ_iso,2L + +#define SN_identified_organization "identified-organization" +#define NID_identified_organization 676 +#define OBJ_identified_organization OBJ_iso,3L + +#define SN_hmac_md5 "HMAC-MD5" +#define LN_hmac_md5 "hmac-md5" +#define NID_hmac_md5 780 +#define OBJ_hmac_md5 OBJ_identified_organization,6L,1L,5L,5L,8L,1L,1L + +#define SN_hmac_sha1 "HMAC-SHA1" +#define LN_hmac_sha1 "hmac-sha1" +#define NID_hmac_sha1 781 +#define OBJ_hmac_sha1 OBJ_identified_organization,6L,1L,5L,5L,8L,1L,2L + +#define SN_certicom_arc "certicom-arc" +#define NID_certicom_arc 677 +#define OBJ_certicom_arc OBJ_identified_organization,132L + +#define SN_international_organizations "international-organizations" +#define LN_international_organizations "International Organizations" +#define NID_international_organizations 647 +#define OBJ_international_organizations OBJ_joint_iso_itu_t,23L + +#define SN_wap "wap" +#define NID_wap 678 +#define OBJ_wap OBJ_international_organizations,43L + +#define SN_wap_wsg "wap-wsg" +#define NID_wap_wsg 679 +#define OBJ_wap_wsg OBJ_wap,1L + +#define SN_selected_attribute_types "selected-attribute-types" +#define LN_selected_attribute_types "Selected Attribute Types" +#define NID_selected_attribute_types 394 +#define OBJ_selected_attribute_types OBJ_joint_iso_itu_t,5L,1L,5L + +#define SN_clearance "clearance" +#define NID_clearance 395 +#define OBJ_clearance OBJ_selected_attribute_types,55L + +#define SN_ISO_US "ISO-US" +#define LN_ISO_US "ISO US Member Body" +#define NID_ISO_US 183 +#define OBJ_ISO_US OBJ_member_body,840L + +#define SN_X9_57 "X9-57" +#define LN_X9_57 "X9.57" +#define NID_X9_57 184 +#define OBJ_X9_57 OBJ_ISO_US,10040L + +#define SN_X9cm "X9cm" +#define LN_X9cm "X9.57 CM ?" +#define NID_X9cm 185 +#define OBJ_X9cm OBJ_X9_57,4L + +#define SN_dsa "DSA" +#define LN_dsa "dsaEncryption" +#define NID_dsa 116 +#define OBJ_dsa OBJ_X9cm,1L + +#define SN_dsaWithSHA1 "DSA-SHA1" +#define LN_dsaWithSHA1 "dsaWithSHA1" +#define NID_dsaWithSHA1 113 +#define OBJ_dsaWithSHA1 OBJ_X9cm,3L + +#define SN_ansi_X9_62 "ansi-X9-62" +#define LN_ansi_X9_62 "ANSI X9.62" +#define NID_ansi_X9_62 405 +#define OBJ_ansi_X9_62 OBJ_ISO_US,10045L + +#define OBJ_X9_62_id_fieldType OBJ_ansi_X9_62,1L + +#define SN_X9_62_prime_field "prime-field" +#define NID_X9_62_prime_field 406 +#define OBJ_X9_62_prime_field OBJ_X9_62_id_fieldType,1L + +#define SN_X9_62_characteristic_two_field "characteristic-two-field" +#define NID_X9_62_characteristic_two_field 407 +#define OBJ_X9_62_characteristic_two_field OBJ_X9_62_id_fieldType,2L + +#define SN_X9_62_id_characteristic_two_basis "id-characteristic-two-basis" +#define NID_X9_62_id_characteristic_two_basis 680 +#define OBJ_X9_62_id_characteristic_two_basis OBJ_X9_62_characteristic_two_field,3L + +#define SN_X9_62_onBasis "onBasis" +#define NID_X9_62_onBasis 681 +#define OBJ_X9_62_onBasis OBJ_X9_62_id_characteristic_two_basis,1L + +#define SN_X9_62_tpBasis "tpBasis" +#define NID_X9_62_tpBasis 682 +#define OBJ_X9_62_tpBasis OBJ_X9_62_id_characteristic_two_basis,2L + +#define SN_X9_62_ppBasis "ppBasis" +#define NID_X9_62_ppBasis 683 +#define OBJ_X9_62_ppBasis OBJ_X9_62_id_characteristic_two_basis,3L + +#define OBJ_X9_62_id_publicKeyType OBJ_ansi_X9_62,2L + +#define SN_X9_62_id_ecPublicKey "id-ecPublicKey" +#define NID_X9_62_id_ecPublicKey 408 +#define OBJ_X9_62_id_ecPublicKey OBJ_X9_62_id_publicKeyType,1L + +#define OBJ_X9_62_ellipticCurve OBJ_ansi_X9_62,3L + +#define OBJ_X9_62_c_TwoCurve OBJ_X9_62_ellipticCurve,0L + +#define SN_X9_62_c2pnb163v1 "c2pnb163v1" +#define NID_X9_62_c2pnb163v1 684 +#define OBJ_X9_62_c2pnb163v1 OBJ_X9_62_c_TwoCurve,1L + +#define SN_X9_62_c2pnb163v2 "c2pnb163v2" +#define NID_X9_62_c2pnb163v2 685 +#define OBJ_X9_62_c2pnb163v2 OBJ_X9_62_c_TwoCurve,2L + +#define SN_X9_62_c2pnb163v3 "c2pnb163v3" +#define NID_X9_62_c2pnb163v3 686 +#define OBJ_X9_62_c2pnb163v3 OBJ_X9_62_c_TwoCurve,3L + +#define SN_X9_62_c2pnb176v1 "c2pnb176v1" +#define NID_X9_62_c2pnb176v1 687 +#define OBJ_X9_62_c2pnb176v1 OBJ_X9_62_c_TwoCurve,4L + +#define SN_X9_62_c2tnb191v1 "c2tnb191v1" +#define NID_X9_62_c2tnb191v1 688 +#define OBJ_X9_62_c2tnb191v1 OBJ_X9_62_c_TwoCurve,5L + +#define SN_X9_62_c2tnb191v2 "c2tnb191v2" +#define NID_X9_62_c2tnb191v2 689 +#define OBJ_X9_62_c2tnb191v2 OBJ_X9_62_c_TwoCurve,6L + +#define SN_X9_62_c2tnb191v3 "c2tnb191v3" +#define NID_X9_62_c2tnb191v3 690 +#define OBJ_X9_62_c2tnb191v3 OBJ_X9_62_c_TwoCurve,7L + +#define SN_X9_62_c2onb191v4 "c2onb191v4" +#define NID_X9_62_c2onb191v4 691 +#define OBJ_X9_62_c2onb191v4 OBJ_X9_62_c_TwoCurve,8L + +#define SN_X9_62_c2onb191v5 "c2onb191v5" +#define NID_X9_62_c2onb191v5 692 +#define OBJ_X9_62_c2onb191v5 OBJ_X9_62_c_TwoCurve,9L + +#define SN_X9_62_c2pnb208w1 "c2pnb208w1" +#define NID_X9_62_c2pnb208w1 693 +#define OBJ_X9_62_c2pnb208w1 OBJ_X9_62_c_TwoCurve,10L + +#define SN_X9_62_c2tnb239v1 "c2tnb239v1" +#define NID_X9_62_c2tnb239v1 694 +#define OBJ_X9_62_c2tnb239v1 OBJ_X9_62_c_TwoCurve,11L + +#define SN_X9_62_c2tnb239v2 "c2tnb239v2" +#define NID_X9_62_c2tnb239v2 695 +#define OBJ_X9_62_c2tnb239v2 OBJ_X9_62_c_TwoCurve,12L + +#define SN_X9_62_c2tnb239v3 "c2tnb239v3" +#define NID_X9_62_c2tnb239v3 696 +#define OBJ_X9_62_c2tnb239v3 OBJ_X9_62_c_TwoCurve,13L + +#define SN_X9_62_c2onb239v4 "c2onb239v4" +#define NID_X9_62_c2onb239v4 697 +#define OBJ_X9_62_c2onb239v4 OBJ_X9_62_c_TwoCurve,14L + +#define SN_X9_62_c2onb239v5 "c2onb239v5" +#define NID_X9_62_c2onb239v5 698 +#define OBJ_X9_62_c2onb239v5 OBJ_X9_62_c_TwoCurve,15L + +#define SN_X9_62_c2pnb272w1 "c2pnb272w1" +#define NID_X9_62_c2pnb272w1 699 +#define OBJ_X9_62_c2pnb272w1 OBJ_X9_62_c_TwoCurve,16L + +#define SN_X9_62_c2pnb304w1 "c2pnb304w1" +#define NID_X9_62_c2pnb304w1 700 +#define OBJ_X9_62_c2pnb304w1 OBJ_X9_62_c_TwoCurve,17L + +#define SN_X9_62_c2tnb359v1 "c2tnb359v1" +#define NID_X9_62_c2tnb359v1 701 +#define OBJ_X9_62_c2tnb359v1 OBJ_X9_62_c_TwoCurve,18L + +#define SN_X9_62_c2pnb368w1 "c2pnb368w1" +#define NID_X9_62_c2pnb368w1 702 +#define OBJ_X9_62_c2pnb368w1 OBJ_X9_62_c_TwoCurve,19L + +#define SN_X9_62_c2tnb431r1 "c2tnb431r1" +#define NID_X9_62_c2tnb431r1 703 +#define OBJ_X9_62_c2tnb431r1 OBJ_X9_62_c_TwoCurve,20L + +#define OBJ_X9_62_primeCurve OBJ_X9_62_ellipticCurve,1L + +#define SN_X9_62_prime192v1 "prime192v1" +#define NID_X9_62_prime192v1 409 +#define OBJ_X9_62_prime192v1 OBJ_X9_62_primeCurve,1L + +#define SN_X9_62_prime192v2 "prime192v2" +#define NID_X9_62_prime192v2 410 +#define OBJ_X9_62_prime192v2 OBJ_X9_62_primeCurve,2L + +#define SN_X9_62_prime192v3 "prime192v3" +#define NID_X9_62_prime192v3 411 +#define OBJ_X9_62_prime192v3 OBJ_X9_62_primeCurve,3L + +#define SN_X9_62_prime239v1 "prime239v1" +#define NID_X9_62_prime239v1 412 +#define OBJ_X9_62_prime239v1 OBJ_X9_62_primeCurve,4L + +#define SN_X9_62_prime239v2 "prime239v2" +#define NID_X9_62_prime239v2 413 +#define OBJ_X9_62_prime239v2 OBJ_X9_62_primeCurve,5L + +#define SN_X9_62_prime239v3 "prime239v3" +#define NID_X9_62_prime239v3 414 +#define OBJ_X9_62_prime239v3 OBJ_X9_62_primeCurve,6L + +#define SN_X9_62_prime256v1 "prime256v1" +#define NID_X9_62_prime256v1 415 +#define OBJ_X9_62_prime256v1 OBJ_X9_62_primeCurve,7L + +#define OBJ_X9_62_id_ecSigType OBJ_ansi_X9_62,4L + +#define SN_ecdsa_with_SHA1 "ecdsa-with-SHA1" +#define NID_ecdsa_with_SHA1 416 +#define OBJ_ecdsa_with_SHA1 OBJ_X9_62_id_ecSigType,1L + +#define SN_ecdsa_with_Recommended "ecdsa-with-Recommended" +#define NID_ecdsa_with_Recommended 791 +#define OBJ_ecdsa_with_Recommended OBJ_X9_62_id_ecSigType,2L + +#define SN_ecdsa_with_Specified "ecdsa-with-Specified" +#define NID_ecdsa_with_Specified 792 +#define OBJ_ecdsa_with_Specified OBJ_X9_62_id_ecSigType,3L + +#define SN_ecdsa_with_SHA224 "ecdsa-with-SHA224" +#define NID_ecdsa_with_SHA224 793 +#define OBJ_ecdsa_with_SHA224 OBJ_ecdsa_with_Specified,1L + +#define SN_ecdsa_with_SHA256 "ecdsa-with-SHA256" +#define NID_ecdsa_with_SHA256 794 +#define OBJ_ecdsa_with_SHA256 OBJ_ecdsa_with_Specified,2L + +#define SN_ecdsa_with_SHA384 "ecdsa-with-SHA384" +#define NID_ecdsa_with_SHA384 795 +#define OBJ_ecdsa_with_SHA384 OBJ_ecdsa_with_Specified,3L + +#define SN_ecdsa_with_SHA512 "ecdsa-with-SHA512" +#define NID_ecdsa_with_SHA512 796 +#define OBJ_ecdsa_with_SHA512 OBJ_ecdsa_with_Specified,4L + +#define OBJ_secg_ellipticCurve OBJ_certicom_arc,0L + +#define SN_secp112r1 "secp112r1" +#define NID_secp112r1 704 +#define OBJ_secp112r1 OBJ_secg_ellipticCurve,6L + +#define SN_secp112r2 "secp112r2" +#define NID_secp112r2 705 +#define OBJ_secp112r2 OBJ_secg_ellipticCurve,7L + +#define SN_secp128r1 "secp128r1" +#define NID_secp128r1 706 +#define OBJ_secp128r1 OBJ_secg_ellipticCurve,28L + +#define SN_secp128r2 "secp128r2" +#define NID_secp128r2 707 +#define OBJ_secp128r2 OBJ_secg_ellipticCurve,29L + +#define SN_secp160k1 "secp160k1" +#define NID_secp160k1 708 +#define OBJ_secp160k1 OBJ_secg_ellipticCurve,9L + +#define SN_secp160r1 "secp160r1" +#define NID_secp160r1 709 +#define OBJ_secp160r1 OBJ_secg_ellipticCurve,8L + +#define SN_secp160r2 "secp160r2" +#define NID_secp160r2 710 +#define OBJ_secp160r2 OBJ_secg_ellipticCurve,30L + +#define SN_secp192k1 "secp192k1" +#define NID_secp192k1 711 +#define OBJ_secp192k1 OBJ_secg_ellipticCurve,31L + +#define SN_secp224k1 "secp224k1" +#define NID_secp224k1 712 +#define OBJ_secp224k1 OBJ_secg_ellipticCurve,32L + +#define SN_secp224r1 "secp224r1" +#define NID_secp224r1 713 +#define OBJ_secp224r1 OBJ_secg_ellipticCurve,33L + +#define SN_secp256k1 "secp256k1" +#define NID_secp256k1 714 +#define OBJ_secp256k1 OBJ_secg_ellipticCurve,10L + +#define SN_secp384r1 "secp384r1" +#define NID_secp384r1 715 +#define OBJ_secp384r1 OBJ_secg_ellipticCurve,34L + +#define SN_secp521r1 "secp521r1" +#define NID_secp521r1 716 +#define OBJ_secp521r1 OBJ_secg_ellipticCurve,35L + +#define SN_sect113r1 "sect113r1" +#define NID_sect113r1 717 +#define OBJ_sect113r1 OBJ_secg_ellipticCurve,4L + +#define SN_sect113r2 "sect113r2" +#define NID_sect113r2 718 +#define OBJ_sect113r2 OBJ_secg_ellipticCurve,5L + +#define SN_sect131r1 "sect131r1" +#define NID_sect131r1 719 +#define OBJ_sect131r1 OBJ_secg_ellipticCurve,22L + +#define SN_sect131r2 "sect131r2" +#define NID_sect131r2 720 +#define OBJ_sect131r2 OBJ_secg_ellipticCurve,23L + +#define SN_sect163k1 "sect163k1" +#define NID_sect163k1 721 +#define OBJ_sect163k1 OBJ_secg_ellipticCurve,1L + +#define SN_sect163r1 "sect163r1" +#define NID_sect163r1 722 +#define OBJ_sect163r1 OBJ_secg_ellipticCurve,2L + +#define SN_sect163r2 "sect163r2" +#define NID_sect163r2 723 +#define OBJ_sect163r2 OBJ_secg_ellipticCurve,15L + +#define SN_sect193r1 "sect193r1" +#define NID_sect193r1 724 +#define OBJ_sect193r1 OBJ_secg_ellipticCurve,24L + +#define SN_sect193r2 "sect193r2" +#define NID_sect193r2 725 +#define OBJ_sect193r2 OBJ_secg_ellipticCurve,25L + +#define SN_sect233k1 "sect233k1" +#define NID_sect233k1 726 +#define OBJ_sect233k1 OBJ_secg_ellipticCurve,26L + +#define SN_sect233r1 "sect233r1" +#define NID_sect233r1 727 +#define OBJ_sect233r1 OBJ_secg_ellipticCurve,27L + +#define SN_sect239k1 "sect239k1" +#define NID_sect239k1 728 +#define OBJ_sect239k1 OBJ_secg_ellipticCurve,3L + +#define SN_sect283k1 "sect283k1" +#define NID_sect283k1 729 +#define OBJ_sect283k1 OBJ_secg_ellipticCurve,16L + +#define SN_sect283r1 "sect283r1" +#define NID_sect283r1 730 +#define OBJ_sect283r1 OBJ_secg_ellipticCurve,17L + +#define SN_sect409k1 "sect409k1" +#define NID_sect409k1 731 +#define OBJ_sect409k1 OBJ_secg_ellipticCurve,36L + +#define SN_sect409r1 "sect409r1" +#define NID_sect409r1 732 +#define OBJ_sect409r1 OBJ_secg_ellipticCurve,37L + +#define SN_sect571k1 "sect571k1" +#define NID_sect571k1 733 +#define OBJ_sect571k1 OBJ_secg_ellipticCurve,38L + +#define SN_sect571r1 "sect571r1" +#define NID_sect571r1 734 +#define OBJ_sect571r1 OBJ_secg_ellipticCurve,39L + +#define OBJ_wap_wsg_idm_ecid OBJ_wap_wsg,4L + +#define SN_wap_wsg_idm_ecid_wtls1 "wap-wsg-idm-ecid-wtls1" +#define NID_wap_wsg_idm_ecid_wtls1 735 +#define OBJ_wap_wsg_idm_ecid_wtls1 OBJ_wap_wsg_idm_ecid,1L + +#define SN_wap_wsg_idm_ecid_wtls3 "wap-wsg-idm-ecid-wtls3" +#define NID_wap_wsg_idm_ecid_wtls3 736 +#define OBJ_wap_wsg_idm_ecid_wtls3 OBJ_wap_wsg_idm_ecid,3L + +#define SN_wap_wsg_idm_ecid_wtls4 "wap-wsg-idm-ecid-wtls4" +#define NID_wap_wsg_idm_ecid_wtls4 737 +#define OBJ_wap_wsg_idm_ecid_wtls4 OBJ_wap_wsg_idm_ecid,4L + +#define SN_wap_wsg_idm_ecid_wtls5 "wap-wsg-idm-ecid-wtls5" +#define NID_wap_wsg_idm_ecid_wtls5 738 +#define OBJ_wap_wsg_idm_ecid_wtls5 OBJ_wap_wsg_idm_ecid,5L + +#define SN_wap_wsg_idm_ecid_wtls6 "wap-wsg-idm-ecid-wtls6" +#define NID_wap_wsg_idm_ecid_wtls6 739 +#define OBJ_wap_wsg_idm_ecid_wtls6 OBJ_wap_wsg_idm_ecid,6L + +#define SN_wap_wsg_idm_ecid_wtls7 "wap-wsg-idm-ecid-wtls7" +#define NID_wap_wsg_idm_ecid_wtls7 740 +#define OBJ_wap_wsg_idm_ecid_wtls7 OBJ_wap_wsg_idm_ecid,7L + +#define SN_wap_wsg_idm_ecid_wtls8 "wap-wsg-idm-ecid-wtls8" +#define NID_wap_wsg_idm_ecid_wtls8 741 +#define OBJ_wap_wsg_idm_ecid_wtls8 OBJ_wap_wsg_idm_ecid,8L + +#define SN_wap_wsg_idm_ecid_wtls9 "wap-wsg-idm-ecid-wtls9" +#define NID_wap_wsg_idm_ecid_wtls9 742 +#define OBJ_wap_wsg_idm_ecid_wtls9 OBJ_wap_wsg_idm_ecid,9L + +#define SN_wap_wsg_idm_ecid_wtls10 "wap-wsg-idm-ecid-wtls10" +#define NID_wap_wsg_idm_ecid_wtls10 743 +#define OBJ_wap_wsg_idm_ecid_wtls10 OBJ_wap_wsg_idm_ecid,10L + +#define SN_wap_wsg_idm_ecid_wtls11 "wap-wsg-idm-ecid-wtls11" +#define NID_wap_wsg_idm_ecid_wtls11 744 +#define OBJ_wap_wsg_idm_ecid_wtls11 OBJ_wap_wsg_idm_ecid,11L + +#define SN_wap_wsg_idm_ecid_wtls12 "wap-wsg-idm-ecid-wtls12" +#define NID_wap_wsg_idm_ecid_wtls12 745 +#define OBJ_wap_wsg_idm_ecid_wtls12 OBJ_wap_wsg_idm_ecid,12L + +#define SN_cast5_cbc "CAST5-CBC" +#define LN_cast5_cbc "cast5-cbc" +#define NID_cast5_cbc 108 +#define OBJ_cast5_cbc OBJ_ISO_US,113533L,7L,66L,10L + +#define SN_cast5_ecb "CAST5-ECB" +#define LN_cast5_ecb "cast5-ecb" +#define NID_cast5_ecb 109 + +#define SN_cast5_cfb64 "CAST5-CFB" +#define LN_cast5_cfb64 "cast5-cfb" +#define NID_cast5_cfb64 110 + +#define SN_cast5_ofb64 "CAST5-OFB" +#define LN_cast5_ofb64 "cast5-ofb" +#define NID_cast5_ofb64 111 + +#define LN_pbeWithMD5AndCast5_CBC "pbeWithMD5AndCast5CBC" +#define NID_pbeWithMD5AndCast5_CBC 112 +#define OBJ_pbeWithMD5AndCast5_CBC OBJ_ISO_US,113533L,7L,66L,12L + +#define SN_id_PasswordBasedMAC "id-PasswordBasedMAC" +#define LN_id_PasswordBasedMAC "password based MAC" +#define NID_id_PasswordBasedMAC 782 +#define OBJ_id_PasswordBasedMAC OBJ_ISO_US,113533L,7L,66L,13L + +#define SN_id_DHBasedMac "id-DHBasedMac" +#define LN_id_DHBasedMac "Diffie-Hellman based MAC" +#define NID_id_DHBasedMac 783 +#define OBJ_id_DHBasedMac OBJ_ISO_US,113533L,7L,66L,30L + +#define SN_rsadsi "rsadsi" +#define LN_rsadsi "RSA Data Security, Inc." +#define NID_rsadsi 1 +#define OBJ_rsadsi OBJ_ISO_US,113549L + +#define SN_pkcs "pkcs" +#define LN_pkcs "RSA Data Security, Inc. PKCS" +#define NID_pkcs 2 +#define OBJ_pkcs OBJ_rsadsi,1L + +#define SN_pkcs1 "pkcs1" +#define NID_pkcs1 186 +#define OBJ_pkcs1 OBJ_pkcs,1L + +#define LN_rsaEncryption "rsaEncryption" +#define NID_rsaEncryption 6 +#define OBJ_rsaEncryption OBJ_pkcs1,1L + +#define SN_md2WithRSAEncryption "RSA-MD2" +#define LN_md2WithRSAEncryption "md2WithRSAEncryption" +#define NID_md2WithRSAEncryption 7 +#define OBJ_md2WithRSAEncryption OBJ_pkcs1,2L + +#define SN_md4WithRSAEncryption "RSA-MD4" +#define LN_md4WithRSAEncryption "md4WithRSAEncryption" +#define NID_md4WithRSAEncryption 396 +#define OBJ_md4WithRSAEncryption OBJ_pkcs1,3L + +#define SN_md5WithRSAEncryption "RSA-MD5" +#define LN_md5WithRSAEncryption "md5WithRSAEncryption" +#define NID_md5WithRSAEncryption 8 +#define OBJ_md5WithRSAEncryption OBJ_pkcs1,4L + +#define SN_sha1WithRSAEncryption "RSA-SHA1" +#define LN_sha1WithRSAEncryption "sha1WithRSAEncryption" +#define NID_sha1WithRSAEncryption 65 +#define OBJ_sha1WithRSAEncryption OBJ_pkcs1,5L + +#define SN_rsaesOaep "RSAES-OAEP" +#define LN_rsaesOaep "rsaesOaep" +#define NID_rsaesOaep 919 +#define OBJ_rsaesOaep OBJ_pkcs1,7L + +#define SN_mgf1 "MGF1" +#define LN_mgf1 "mgf1" +#define NID_mgf1 911 +#define OBJ_mgf1 OBJ_pkcs1,8L + +#define SN_pSpecified "PSPECIFIED" +#define LN_pSpecified "pSpecified" +#define NID_pSpecified 935 +#define OBJ_pSpecified OBJ_pkcs1,9L + +#define SN_rsassaPss "RSASSA-PSS" +#define LN_rsassaPss "rsassaPss" +#define NID_rsassaPss 912 +#define OBJ_rsassaPss OBJ_pkcs1,10L + +#define SN_sha256WithRSAEncryption "RSA-SHA256" +#define LN_sha256WithRSAEncryption "sha256WithRSAEncryption" +#define NID_sha256WithRSAEncryption 668 +#define OBJ_sha256WithRSAEncryption OBJ_pkcs1,11L + +#define SN_sha384WithRSAEncryption "RSA-SHA384" +#define LN_sha384WithRSAEncryption "sha384WithRSAEncryption" +#define NID_sha384WithRSAEncryption 669 +#define OBJ_sha384WithRSAEncryption OBJ_pkcs1,12L + +#define SN_sha512WithRSAEncryption "RSA-SHA512" +#define LN_sha512WithRSAEncryption "sha512WithRSAEncryption" +#define NID_sha512WithRSAEncryption 670 +#define OBJ_sha512WithRSAEncryption OBJ_pkcs1,13L + +#define SN_sha224WithRSAEncryption "RSA-SHA224" +#define LN_sha224WithRSAEncryption "sha224WithRSAEncryption" +#define NID_sha224WithRSAEncryption 671 +#define OBJ_sha224WithRSAEncryption OBJ_pkcs1,14L + +#define SN_pkcs3 "pkcs3" +#define NID_pkcs3 27 +#define OBJ_pkcs3 OBJ_pkcs,3L + +#define LN_dhKeyAgreement "dhKeyAgreement" +#define NID_dhKeyAgreement 28 +#define OBJ_dhKeyAgreement OBJ_pkcs3,1L + +#define SN_pkcs5 "pkcs5" +#define NID_pkcs5 187 +#define OBJ_pkcs5 OBJ_pkcs,5L + +#define SN_pbeWithMD2AndDES_CBC "PBE-MD2-DES" +#define LN_pbeWithMD2AndDES_CBC "pbeWithMD2AndDES-CBC" +#define NID_pbeWithMD2AndDES_CBC 9 +#define OBJ_pbeWithMD2AndDES_CBC OBJ_pkcs5,1L + +#define SN_pbeWithMD5AndDES_CBC "PBE-MD5-DES" +#define LN_pbeWithMD5AndDES_CBC "pbeWithMD5AndDES-CBC" +#define NID_pbeWithMD5AndDES_CBC 10 +#define OBJ_pbeWithMD5AndDES_CBC OBJ_pkcs5,3L + +#define SN_pbeWithMD2AndRC2_CBC "PBE-MD2-RC2-64" +#define LN_pbeWithMD2AndRC2_CBC "pbeWithMD2AndRC2-CBC" +#define NID_pbeWithMD2AndRC2_CBC 168 +#define OBJ_pbeWithMD2AndRC2_CBC OBJ_pkcs5,4L + +#define SN_pbeWithMD5AndRC2_CBC "PBE-MD5-RC2-64" +#define LN_pbeWithMD5AndRC2_CBC "pbeWithMD5AndRC2-CBC" +#define NID_pbeWithMD5AndRC2_CBC 169 +#define OBJ_pbeWithMD5AndRC2_CBC OBJ_pkcs5,6L + +#define SN_pbeWithSHA1AndDES_CBC "PBE-SHA1-DES" +#define LN_pbeWithSHA1AndDES_CBC "pbeWithSHA1AndDES-CBC" +#define NID_pbeWithSHA1AndDES_CBC 170 +#define OBJ_pbeWithSHA1AndDES_CBC OBJ_pkcs5,10L + +#define SN_pbeWithSHA1AndRC2_CBC "PBE-SHA1-RC2-64" +#define LN_pbeWithSHA1AndRC2_CBC "pbeWithSHA1AndRC2-CBC" +#define NID_pbeWithSHA1AndRC2_CBC 68 +#define OBJ_pbeWithSHA1AndRC2_CBC OBJ_pkcs5,11L + +#define LN_id_pbkdf2 "PBKDF2" +#define NID_id_pbkdf2 69 +#define OBJ_id_pbkdf2 OBJ_pkcs5,12L + +#define LN_pbes2 "PBES2" +#define NID_pbes2 161 +#define OBJ_pbes2 OBJ_pkcs5,13L + +#define LN_pbmac1 "PBMAC1" +#define NID_pbmac1 162 +#define OBJ_pbmac1 OBJ_pkcs5,14L + +#define SN_pkcs7 "pkcs7" +#define NID_pkcs7 20 +#define OBJ_pkcs7 OBJ_pkcs,7L + +#define LN_pkcs7_data "pkcs7-data" +#define NID_pkcs7_data 21 +#define OBJ_pkcs7_data OBJ_pkcs7,1L + +#define LN_pkcs7_signed "pkcs7-signedData" +#define NID_pkcs7_signed 22 +#define OBJ_pkcs7_signed OBJ_pkcs7,2L + +#define LN_pkcs7_enveloped "pkcs7-envelopedData" +#define NID_pkcs7_enveloped 23 +#define OBJ_pkcs7_enveloped OBJ_pkcs7,3L + +#define LN_pkcs7_signedAndEnveloped "pkcs7-signedAndEnvelopedData" +#define NID_pkcs7_signedAndEnveloped 24 +#define OBJ_pkcs7_signedAndEnveloped OBJ_pkcs7,4L + +#define LN_pkcs7_digest "pkcs7-digestData" +#define NID_pkcs7_digest 25 +#define OBJ_pkcs7_digest OBJ_pkcs7,5L + +#define LN_pkcs7_encrypted "pkcs7-encryptedData" +#define NID_pkcs7_encrypted 26 +#define OBJ_pkcs7_encrypted OBJ_pkcs7,6L + +#define SN_pkcs9 "pkcs9" +#define NID_pkcs9 47 +#define OBJ_pkcs9 OBJ_pkcs,9L + +#define LN_pkcs9_emailAddress "emailAddress" +#define NID_pkcs9_emailAddress 48 +#define OBJ_pkcs9_emailAddress OBJ_pkcs9,1L + +#define LN_pkcs9_unstructuredName "unstructuredName" +#define NID_pkcs9_unstructuredName 49 +#define OBJ_pkcs9_unstructuredName OBJ_pkcs9,2L + +#define LN_pkcs9_contentType "contentType" +#define NID_pkcs9_contentType 50 +#define OBJ_pkcs9_contentType OBJ_pkcs9,3L + +#define LN_pkcs9_messageDigest "messageDigest" +#define NID_pkcs9_messageDigest 51 +#define OBJ_pkcs9_messageDigest OBJ_pkcs9,4L + +#define LN_pkcs9_signingTime "signingTime" +#define NID_pkcs9_signingTime 52 +#define OBJ_pkcs9_signingTime OBJ_pkcs9,5L + +#define LN_pkcs9_countersignature "countersignature" +#define NID_pkcs9_countersignature 53 +#define OBJ_pkcs9_countersignature OBJ_pkcs9,6L + +#define LN_pkcs9_challengePassword "challengePassword" +#define NID_pkcs9_challengePassword 54 +#define OBJ_pkcs9_challengePassword OBJ_pkcs9,7L + +#define LN_pkcs9_unstructuredAddress "unstructuredAddress" +#define NID_pkcs9_unstructuredAddress 55 +#define OBJ_pkcs9_unstructuredAddress OBJ_pkcs9,8L + +#define LN_pkcs9_extCertAttributes "extendedCertificateAttributes" +#define NID_pkcs9_extCertAttributes 56 +#define OBJ_pkcs9_extCertAttributes OBJ_pkcs9,9L + +#define SN_ext_req "extReq" +#define LN_ext_req "Extension Request" +#define NID_ext_req 172 +#define OBJ_ext_req OBJ_pkcs9,14L + +#define SN_SMIMECapabilities "SMIME-CAPS" +#define LN_SMIMECapabilities "S/MIME Capabilities" +#define NID_SMIMECapabilities 167 +#define OBJ_SMIMECapabilities OBJ_pkcs9,15L + +#define SN_SMIME "SMIME" +#define LN_SMIME "S/MIME" +#define NID_SMIME 188 +#define OBJ_SMIME OBJ_pkcs9,16L + +#define SN_id_smime_mod "id-smime-mod" +#define NID_id_smime_mod 189 +#define OBJ_id_smime_mod OBJ_SMIME,0L + +#define SN_id_smime_ct "id-smime-ct" +#define NID_id_smime_ct 190 +#define OBJ_id_smime_ct OBJ_SMIME,1L + +#define SN_id_smime_aa "id-smime-aa" +#define NID_id_smime_aa 191 +#define OBJ_id_smime_aa OBJ_SMIME,2L + +#define SN_id_smime_alg "id-smime-alg" +#define NID_id_smime_alg 192 +#define OBJ_id_smime_alg OBJ_SMIME,3L + +#define SN_id_smime_cd "id-smime-cd" +#define NID_id_smime_cd 193 +#define OBJ_id_smime_cd OBJ_SMIME,4L + +#define SN_id_smime_spq "id-smime-spq" +#define NID_id_smime_spq 194 +#define OBJ_id_smime_spq OBJ_SMIME,5L + +#define SN_id_smime_cti "id-smime-cti" +#define NID_id_smime_cti 195 +#define OBJ_id_smime_cti OBJ_SMIME,6L + +#define SN_id_smime_mod_cms "id-smime-mod-cms" +#define NID_id_smime_mod_cms 196 +#define OBJ_id_smime_mod_cms OBJ_id_smime_mod,1L + +#define SN_id_smime_mod_ess "id-smime-mod-ess" +#define NID_id_smime_mod_ess 197 +#define OBJ_id_smime_mod_ess OBJ_id_smime_mod,2L + +#define SN_id_smime_mod_oid "id-smime-mod-oid" +#define NID_id_smime_mod_oid 198 +#define OBJ_id_smime_mod_oid OBJ_id_smime_mod,3L + +#define SN_id_smime_mod_msg_v3 "id-smime-mod-msg-v3" +#define NID_id_smime_mod_msg_v3 199 +#define OBJ_id_smime_mod_msg_v3 OBJ_id_smime_mod,4L + +#define SN_id_smime_mod_ets_eSignature_88 "id-smime-mod-ets-eSignature-88" +#define NID_id_smime_mod_ets_eSignature_88 200 +#define OBJ_id_smime_mod_ets_eSignature_88 OBJ_id_smime_mod,5L + +#define SN_id_smime_mod_ets_eSignature_97 "id-smime-mod-ets-eSignature-97" +#define NID_id_smime_mod_ets_eSignature_97 201 +#define OBJ_id_smime_mod_ets_eSignature_97 OBJ_id_smime_mod,6L + +#define SN_id_smime_mod_ets_eSigPolicy_88 "id-smime-mod-ets-eSigPolicy-88" +#define NID_id_smime_mod_ets_eSigPolicy_88 202 +#define OBJ_id_smime_mod_ets_eSigPolicy_88 OBJ_id_smime_mod,7L + +#define SN_id_smime_mod_ets_eSigPolicy_97 "id-smime-mod-ets-eSigPolicy-97" +#define NID_id_smime_mod_ets_eSigPolicy_97 203 +#define OBJ_id_smime_mod_ets_eSigPolicy_97 OBJ_id_smime_mod,8L + +#define SN_id_smime_ct_receipt "id-smime-ct-receipt" +#define NID_id_smime_ct_receipt 204 +#define OBJ_id_smime_ct_receipt OBJ_id_smime_ct,1L + +#define SN_id_smime_ct_authData "id-smime-ct-authData" +#define NID_id_smime_ct_authData 205 +#define OBJ_id_smime_ct_authData OBJ_id_smime_ct,2L + +#define SN_id_smime_ct_publishCert "id-smime-ct-publishCert" +#define NID_id_smime_ct_publishCert 206 +#define OBJ_id_smime_ct_publishCert OBJ_id_smime_ct,3L + +#define SN_id_smime_ct_TSTInfo "id-smime-ct-TSTInfo" +#define NID_id_smime_ct_TSTInfo 207 +#define OBJ_id_smime_ct_TSTInfo OBJ_id_smime_ct,4L + +#define SN_id_smime_ct_TDTInfo "id-smime-ct-TDTInfo" +#define NID_id_smime_ct_TDTInfo 208 +#define OBJ_id_smime_ct_TDTInfo OBJ_id_smime_ct,5L + +#define SN_id_smime_ct_contentInfo "id-smime-ct-contentInfo" +#define NID_id_smime_ct_contentInfo 209 +#define OBJ_id_smime_ct_contentInfo OBJ_id_smime_ct,6L + +#define SN_id_smime_ct_DVCSRequestData "id-smime-ct-DVCSRequestData" +#define NID_id_smime_ct_DVCSRequestData 210 +#define OBJ_id_smime_ct_DVCSRequestData OBJ_id_smime_ct,7L + +#define SN_id_smime_ct_DVCSResponseData "id-smime-ct-DVCSResponseData" +#define NID_id_smime_ct_DVCSResponseData 211 +#define OBJ_id_smime_ct_DVCSResponseData OBJ_id_smime_ct,8L + +#define SN_id_smime_ct_compressedData "id-smime-ct-compressedData" +#define NID_id_smime_ct_compressedData 786 +#define OBJ_id_smime_ct_compressedData OBJ_id_smime_ct,9L + +#define SN_id_ct_asciiTextWithCRLF "id-ct-asciiTextWithCRLF" +#define NID_id_ct_asciiTextWithCRLF 787 +#define OBJ_id_ct_asciiTextWithCRLF OBJ_id_smime_ct,27L + +#define SN_id_smime_aa_receiptRequest "id-smime-aa-receiptRequest" +#define NID_id_smime_aa_receiptRequest 212 +#define OBJ_id_smime_aa_receiptRequest OBJ_id_smime_aa,1L + +#define SN_id_smime_aa_securityLabel "id-smime-aa-securityLabel" +#define NID_id_smime_aa_securityLabel 213 +#define OBJ_id_smime_aa_securityLabel OBJ_id_smime_aa,2L + +#define SN_id_smime_aa_mlExpandHistory "id-smime-aa-mlExpandHistory" +#define NID_id_smime_aa_mlExpandHistory 214 +#define OBJ_id_smime_aa_mlExpandHistory OBJ_id_smime_aa,3L + +#define SN_id_smime_aa_contentHint "id-smime-aa-contentHint" +#define NID_id_smime_aa_contentHint 215 +#define OBJ_id_smime_aa_contentHint OBJ_id_smime_aa,4L + +#define SN_id_smime_aa_msgSigDigest "id-smime-aa-msgSigDigest" +#define NID_id_smime_aa_msgSigDigest 216 +#define OBJ_id_smime_aa_msgSigDigest OBJ_id_smime_aa,5L + +#define SN_id_smime_aa_encapContentType "id-smime-aa-encapContentType" +#define NID_id_smime_aa_encapContentType 217 +#define OBJ_id_smime_aa_encapContentType OBJ_id_smime_aa,6L + +#define SN_id_smime_aa_contentIdentifier "id-smime-aa-contentIdentifier" +#define NID_id_smime_aa_contentIdentifier 218 +#define OBJ_id_smime_aa_contentIdentifier OBJ_id_smime_aa,7L + +#define SN_id_smime_aa_macValue "id-smime-aa-macValue" +#define NID_id_smime_aa_macValue 219 +#define OBJ_id_smime_aa_macValue OBJ_id_smime_aa,8L + +#define SN_id_smime_aa_equivalentLabels "id-smime-aa-equivalentLabels" +#define NID_id_smime_aa_equivalentLabels 220 +#define OBJ_id_smime_aa_equivalentLabels OBJ_id_smime_aa,9L + +#define SN_id_smime_aa_contentReference "id-smime-aa-contentReference" +#define NID_id_smime_aa_contentReference 221 +#define OBJ_id_smime_aa_contentReference OBJ_id_smime_aa,10L + +#define SN_id_smime_aa_encrypKeyPref "id-smime-aa-encrypKeyPref" +#define NID_id_smime_aa_encrypKeyPref 222 +#define OBJ_id_smime_aa_encrypKeyPref OBJ_id_smime_aa,11L + +#define SN_id_smime_aa_signingCertificate "id-smime-aa-signingCertificate" +#define NID_id_smime_aa_signingCertificate 223 +#define OBJ_id_smime_aa_signingCertificate OBJ_id_smime_aa,12L + +#define SN_id_smime_aa_smimeEncryptCerts "id-smime-aa-smimeEncryptCerts" +#define NID_id_smime_aa_smimeEncryptCerts 224 +#define OBJ_id_smime_aa_smimeEncryptCerts OBJ_id_smime_aa,13L + +#define SN_id_smime_aa_timeStampToken "id-smime-aa-timeStampToken" +#define NID_id_smime_aa_timeStampToken 225 +#define OBJ_id_smime_aa_timeStampToken OBJ_id_smime_aa,14L + +#define SN_id_smime_aa_ets_sigPolicyId "id-smime-aa-ets-sigPolicyId" +#define NID_id_smime_aa_ets_sigPolicyId 226 +#define OBJ_id_smime_aa_ets_sigPolicyId OBJ_id_smime_aa,15L + +#define SN_id_smime_aa_ets_commitmentType "id-smime-aa-ets-commitmentType" +#define NID_id_smime_aa_ets_commitmentType 227 +#define OBJ_id_smime_aa_ets_commitmentType OBJ_id_smime_aa,16L + +#define SN_id_smime_aa_ets_signerLocation "id-smime-aa-ets-signerLocation" +#define NID_id_smime_aa_ets_signerLocation 228 +#define OBJ_id_smime_aa_ets_signerLocation OBJ_id_smime_aa,17L + +#define SN_id_smime_aa_ets_signerAttr "id-smime-aa-ets-signerAttr" +#define NID_id_smime_aa_ets_signerAttr 229 +#define OBJ_id_smime_aa_ets_signerAttr OBJ_id_smime_aa,18L + +#define SN_id_smime_aa_ets_otherSigCert "id-smime-aa-ets-otherSigCert" +#define NID_id_smime_aa_ets_otherSigCert 230 +#define OBJ_id_smime_aa_ets_otherSigCert OBJ_id_smime_aa,19L + +#define SN_id_smime_aa_ets_contentTimestamp "id-smime-aa-ets-contentTimestamp" +#define NID_id_smime_aa_ets_contentTimestamp 231 +#define OBJ_id_smime_aa_ets_contentTimestamp OBJ_id_smime_aa,20L + +#define SN_id_smime_aa_ets_CertificateRefs "id-smime-aa-ets-CertificateRefs" +#define NID_id_smime_aa_ets_CertificateRefs 232 +#define OBJ_id_smime_aa_ets_CertificateRefs OBJ_id_smime_aa,21L + +#define SN_id_smime_aa_ets_RevocationRefs "id-smime-aa-ets-RevocationRefs" +#define NID_id_smime_aa_ets_RevocationRefs 233 +#define OBJ_id_smime_aa_ets_RevocationRefs OBJ_id_smime_aa,22L + +#define SN_id_smime_aa_ets_certValues "id-smime-aa-ets-certValues" +#define NID_id_smime_aa_ets_certValues 234 +#define OBJ_id_smime_aa_ets_certValues OBJ_id_smime_aa,23L + +#define SN_id_smime_aa_ets_revocationValues "id-smime-aa-ets-revocationValues" +#define NID_id_smime_aa_ets_revocationValues 235 +#define OBJ_id_smime_aa_ets_revocationValues OBJ_id_smime_aa,24L + +#define SN_id_smime_aa_ets_escTimeStamp "id-smime-aa-ets-escTimeStamp" +#define NID_id_smime_aa_ets_escTimeStamp 236 +#define OBJ_id_smime_aa_ets_escTimeStamp OBJ_id_smime_aa,25L + +#define SN_id_smime_aa_ets_certCRLTimestamp "id-smime-aa-ets-certCRLTimestamp" +#define NID_id_smime_aa_ets_certCRLTimestamp 237 +#define OBJ_id_smime_aa_ets_certCRLTimestamp OBJ_id_smime_aa,26L + +#define SN_id_smime_aa_ets_archiveTimeStamp "id-smime-aa-ets-archiveTimeStamp" +#define NID_id_smime_aa_ets_archiveTimeStamp 238 +#define OBJ_id_smime_aa_ets_archiveTimeStamp OBJ_id_smime_aa,27L + +#define SN_id_smime_aa_signatureType "id-smime-aa-signatureType" +#define NID_id_smime_aa_signatureType 239 +#define OBJ_id_smime_aa_signatureType OBJ_id_smime_aa,28L + +#define SN_id_smime_aa_dvcs_dvc "id-smime-aa-dvcs-dvc" +#define NID_id_smime_aa_dvcs_dvc 240 +#define OBJ_id_smime_aa_dvcs_dvc OBJ_id_smime_aa,29L + +#define SN_id_smime_alg_ESDHwith3DES "id-smime-alg-ESDHwith3DES" +#define NID_id_smime_alg_ESDHwith3DES 241 +#define OBJ_id_smime_alg_ESDHwith3DES OBJ_id_smime_alg,1L + +#define SN_id_smime_alg_ESDHwithRC2 "id-smime-alg-ESDHwithRC2" +#define NID_id_smime_alg_ESDHwithRC2 242 +#define OBJ_id_smime_alg_ESDHwithRC2 OBJ_id_smime_alg,2L + +#define SN_id_smime_alg_3DESwrap "id-smime-alg-3DESwrap" +#define NID_id_smime_alg_3DESwrap 243 +#define OBJ_id_smime_alg_3DESwrap OBJ_id_smime_alg,3L + +#define SN_id_smime_alg_RC2wrap "id-smime-alg-RC2wrap" +#define NID_id_smime_alg_RC2wrap 244 +#define OBJ_id_smime_alg_RC2wrap OBJ_id_smime_alg,4L + +#define SN_id_smime_alg_ESDH "id-smime-alg-ESDH" +#define NID_id_smime_alg_ESDH 245 +#define OBJ_id_smime_alg_ESDH OBJ_id_smime_alg,5L + +#define SN_id_smime_alg_CMS3DESwrap "id-smime-alg-CMS3DESwrap" +#define NID_id_smime_alg_CMS3DESwrap 246 +#define OBJ_id_smime_alg_CMS3DESwrap OBJ_id_smime_alg,6L + +#define SN_id_smime_alg_CMSRC2wrap "id-smime-alg-CMSRC2wrap" +#define NID_id_smime_alg_CMSRC2wrap 247 +#define OBJ_id_smime_alg_CMSRC2wrap OBJ_id_smime_alg,7L + +#define SN_id_alg_PWRI_KEK "id-alg-PWRI-KEK" +#define NID_id_alg_PWRI_KEK 893 +#define OBJ_id_alg_PWRI_KEK OBJ_id_smime_alg,9L + +#define SN_id_smime_cd_ldap "id-smime-cd-ldap" +#define NID_id_smime_cd_ldap 248 +#define OBJ_id_smime_cd_ldap OBJ_id_smime_cd,1L + +#define SN_id_smime_spq_ets_sqt_uri "id-smime-spq-ets-sqt-uri" +#define NID_id_smime_spq_ets_sqt_uri 249 +#define OBJ_id_smime_spq_ets_sqt_uri OBJ_id_smime_spq,1L + +#define SN_id_smime_spq_ets_sqt_unotice "id-smime-spq-ets-sqt-unotice" +#define NID_id_smime_spq_ets_sqt_unotice 250 +#define OBJ_id_smime_spq_ets_sqt_unotice OBJ_id_smime_spq,2L + +#define SN_id_smime_cti_ets_proofOfOrigin "id-smime-cti-ets-proofOfOrigin" +#define NID_id_smime_cti_ets_proofOfOrigin 251 +#define OBJ_id_smime_cti_ets_proofOfOrigin OBJ_id_smime_cti,1L + +#define SN_id_smime_cti_ets_proofOfReceipt "id-smime-cti-ets-proofOfReceipt" +#define NID_id_smime_cti_ets_proofOfReceipt 252 +#define OBJ_id_smime_cti_ets_proofOfReceipt OBJ_id_smime_cti,2L + +#define SN_id_smime_cti_ets_proofOfDelivery "id-smime-cti-ets-proofOfDelivery" +#define NID_id_smime_cti_ets_proofOfDelivery 253 +#define OBJ_id_smime_cti_ets_proofOfDelivery OBJ_id_smime_cti,3L + +#define SN_id_smime_cti_ets_proofOfSender "id-smime-cti-ets-proofOfSender" +#define NID_id_smime_cti_ets_proofOfSender 254 +#define OBJ_id_smime_cti_ets_proofOfSender OBJ_id_smime_cti,4L + +#define SN_id_smime_cti_ets_proofOfApproval "id-smime-cti-ets-proofOfApproval" +#define NID_id_smime_cti_ets_proofOfApproval 255 +#define OBJ_id_smime_cti_ets_proofOfApproval OBJ_id_smime_cti,5L + +#define SN_id_smime_cti_ets_proofOfCreation "id-smime-cti-ets-proofOfCreation" +#define NID_id_smime_cti_ets_proofOfCreation 256 +#define OBJ_id_smime_cti_ets_proofOfCreation OBJ_id_smime_cti,6L + +#define LN_friendlyName "friendlyName" +#define NID_friendlyName 156 +#define OBJ_friendlyName OBJ_pkcs9,20L + +#define LN_localKeyID "localKeyID" +#define NID_localKeyID 157 +#define OBJ_localKeyID OBJ_pkcs9,21L + +#define SN_ms_csp_name "CSPName" +#define LN_ms_csp_name "Microsoft CSP Name" +#define NID_ms_csp_name 417 +#define OBJ_ms_csp_name 1L,3L,6L,1L,4L,1L,311L,17L,1L + +#define SN_LocalKeySet "LocalKeySet" +#define LN_LocalKeySet "Microsoft Local Key set" +#define NID_LocalKeySet 856 +#define OBJ_LocalKeySet 1L,3L,6L,1L,4L,1L,311L,17L,2L + +#define OBJ_certTypes OBJ_pkcs9,22L + +#define LN_x509Certificate "x509Certificate" +#define NID_x509Certificate 158 +#define OBJ_x509Certificate OBJ_certTypes,1L + +#define LN_sdsiCertificate "sdsiCertificate" +#define NID_sdsiCertificate 159 +#define OBJ_sdsiCertificate OBJ_certTypes,2L + +#define OBJ_crlTypes OBJ_pkcs9,23L + +#define LN_x509Crl "x509Crl" +#define NID_x509Crl 160 +#define OBJ_x509Crl OBJ_crlTypes,1L + +#define OBJ_pkcs12 OBJ_pkcs,12L + +#define OBJ_pkcs12_pbeids OBJ_pkcs12,1L + +#define SN_pbe_WithSHA1And128BitRC4 "PBE-SHA1-RC4-128" +#define LN_pbe_WithSHA1And128BitRC4 "pbeWithSHA1And128BitRC4" +#define NID_pbe_WithSHA1And128BitRC4 144 +#define OBJ_pbe_WithSHA1And128BitRC4 OBJ_pkcs12_pbeids,1L + +#define SN_pbe_WithSHA1And40BitRC4 "PBE-SHA1-RC4-40" +#define LN_pbe_WithSHA1And40BitRC4 "pbeWithSHA1And40BitRC4" +#define NID_pbe_WithSHA1And40BitRC4 145 +#define OBJ_pbe_WithSHA1And40BitRC4 OBJ_pkcs12_pbeids,2L + +#define SN_pbe_WithSHA1And3_Key_TripleDES_CBC "PBE-SHA1-3DES" +#define LN_pbe_WithSHA1And3_Key_TripleDES_CBC "pbeWithSHA1And3-KeyTripleDES-CBC" +#define NID_pbe_WithSHA1And3_Key_TripleDES_CBC 146 +#define OBJ_pbe_WithSHA1And3_Key_TripleDES_CBC OBJ_pkcs12_pbeids,3L + +#define SN_pbe_WithSHA1And2_Key_TripleDES_CBC "PBE-SHA1-2DES" +#define LN_pbe_WithSHA1And2_Key_TripleDES_CBC "pbeWithSHA1And2-KeyTripleDES-CBC" +#define NID_pbe_WithSHA1And2_Key_TripleDES_CBC 147 +#define OBJ_pbe_WithSHA1And2_Key_TripleDES_CBC OBJ_pkcs12_pbeids,4L + +#define SN_pbe_WithSHA1And128BitRC2_CBC "PBE-SHA1-RC2-128" +#define LN_pbe_WithSHA1And128BitRC2_CBC "pbeWithSHA1And128BitRC2-CBC" +#define NID_pbe_WithSHA1And128BitRC2_CBC 148 +#define OBJ_pbe_WithSHA1And128BitRC2_CBC OBJ_pkcs12_pbeids,5L + +#define SN_pbe_WithSHA1And40BitRC2_CBC "PBE-SHA1-RC2-40" +#define LN_pbe_WithSHA1And40BitRC2_CBC "pbeWithSHA1And40BitRC2-CBC" +#define NID_pbe_WithSHA1And40BitRC2_CBC 149 +#define OBJ_pbe_WithSHA1And40BitRC2_CBC OBJ_pkcs12_pbeids,6L + +#define OBJ_pkcs12_Version1 OBJ_pkcs12,10L + +#define OBJ_pkcs12_BagIds OBJ_pkcs12_Version1,1L + +#define LN_keyBag "keyBag" +#define NID_keyBag 150 +#define OBJ_keyBag OBJ_pkcs12_BagIds,1L + +#define LN_pkcs8ShroudedKeyBag "pkcs8ShroudedKeyBag" +#define NID_pkcs8ShroudedKeyBag 151 +#define OBJ_pkcs8ShroudedKeyBag OBJ_pkcs12_BagIds,2L + +#define LN_certBag "certBag" +#define NID_certBag 152 +#define OBJ_certBag OBJ_pkcs12_BagIds,3L + +#define LN_crlBag "crlBag" +#define NID_crlBag 153 +#define OBJ_crlBag OBJ_pkcs12_BagIds,4L + +#define LN_secretBag "secretBag" +#define NID_secretBag 154 +#define OBJ_secretBag OBJ_pkcs12_BagIds,5L + +#define LN_safeContentsBag "safeContentsBag" +#define NID_safeContentsBag 155 +#define OBJ_safeContentsBag OBJ_pkcs12_BagIds,6L + +#define SN_md2 "MD2" +#define LN_md2 "md2" +#define NID_md2 3 +#define OBJ_md2 OBJ_rsadsi,2L,2L + +#define SN_md4 "MD4" +#define LN_md4 "md4" +#define NID_md4 257 +#define OBJ_md4 OBJ_rsadsi,2L,4L + +#define SN_md5 "MD5" +#define LN_md5 "md5" +#define NID_md5 4 +#define OBJ_md5 OBJ_rsadsi,2L,5L + +#define SN_md5_sha1 "MD5-SHA1" +#define LN_md5_sha1 "md5-sha1" +#define NID_md5_sha1 114 + +#define LN_hmacWithMD5 "hmacWithMD5" +#define NID_hmacWithMD5 797 +#define OBJ_hmacWithMD5 OBJ_rsadsi,2L,6L + +#define LN_hmacWithSHA1 "hmacWithSHA1" +#define NID_hmacWithSHA1 163 +#define OBJ_hmacWithSHA1 OBJ_rsadsi,2L,7L + +#define LN_hmacWithSHA224 "hmacWithSHA224" +#define NID_hmacWithSHA224 798 +#define OBJ_hmacWithSHA224 OBJ_rsadsi,2L,8L + +#define LN_hmacWithSHA256 "hmacWithSHA256" +#define NID_hmacWithSHA256 799 +#define OBJ_hmacWithSHA256 OBJ_rsadsi,2L,9L + +#define LN_hmacWithSHA384 "hmacWithSHA384" +#define NID_hmacWithSHA384 800 +#define OBJ_hmacWithSHA384 OBJ_rsadsi,2L,10L + +#define LN_hmacWithSHA512 "hmacWithSHA512" +#define NID_hmacWithSHA512 801 +#define OBJ_hmacWithSHA512 OBJ_rsadsi,2L,11L + +#define SN_rc2_cbc "RC2-CBC" +#define LN_rc2_cbc "rc2-cbc" +#define NID_rc2_cbc 37 +#define OBJ_rc2_cbc OBJ_rsadsi,3L,2L + +#define SN_rc2_ecb "RC2-ECB" +#define LN_rc2_ecb "rc2-ecb" +#define NID_rc2_ecb 38 + +#define SN_rc2_cfb64 "RC2-CFB" +#define LN_rc2_cfb64 "rc2-cfb" +#define NID_rc2_cfb64 39 + +#define SN_rc2_ofb64 "RC2-OFB" +#define LN_rc2_ofb64 "rc2-ofb" +#define NID_rc2_ofb64 40 + +#define SN_rc2_40_cbc "RC2-40-CBC" +#define LN_rc2_40_cbc "rc2-40-cbc" +#define NID_rc2_40_cbc 98 + +#define SN_rc2_64_cbc "RC2-64-CBC" +#define LN_rc2_64_cbc "rc2-64-cbc" +#define NID_rc2_64_cbc 166 + +#define SN_rc4 "RC4" +#define LN_rc4 "rc4" +#define NID_rc4 5 +#define OBJ_rc4 OBJ_rsadsi,3L,4L + +#define SN_rc4_40 "RC4-40" +#define LN_rc4_40 "rc4-40" +#define NID_rc4_40 97 + +#define SN_des_ede3_cbc "DES-EDE3-CBC" +#define LN_des_ede3_cbc "des-ede3-cbc" +#define NID_des_ede3_cbc 44 +#define OBJ_des_ede3_cbc OBJ_rsadsi,3L,7L + +#define SN_rc5_cbc "RC5-CBC" +#define LN_rc5_cbc "rc5-cbc" +#define NID_rc5_cbc 120 +#define OBJ_rc5_cbc OBJ_rsadsi,3L,8L + +#define SN_rc5_ecb "RC5-ECB" +#define LN_rc5_ecb "rc5-ecb" +#define NID_rc5_ecb 121 + +#define SN_rc5_cfb64 "RC5-CFB" +#define LN_rc5_cfb64 "rc5-cfb" +#define NID_rc5_cfb64 122 + +#define SN_rc5_ofb64 "RC5-OFB" +#define LN_rc5_ofb64 "rc5-ofb" +#define NID_rc5_ofb64 123 + +#define SN_ms_ext_req "msExtReq" +#define LN_ms_ext_req "Microsoft Extension Request" +#define NID_ms_ext_req 171 +#define OBJ_ms_ext_req 1L,3L,6L,1L,4L,1L,311L,2L,1L,14L + +#define SN_ms_code_ind "msCodeInd" +#define LN_ms_code_ind "Microsoft Individual Code Signing" +#define NID_ms_code_ind 134 +#define OBJ_ms_code_ind 1L,3L,6L,1L,4L,1L,311L,2L,1L,21L + +#define SN_ms_code_com "msCodeCom" +#define LN_ms_code_com "Microsoft Commercial Code Signing" +#define NID_ms_code_com 135 +#define OBJ_ms_code_com 1L,3L,6L,1L,4L,1L,311L,2L,1L,22L + +#define SN_ms_ctl_sign "msCTLSign" +#define LN_ms_ctl_sign "Microsoft Trust List Signing" +#define NID_ms_ctl_sign 136 +#define OBJ_ms_ctl_sign 1L,3L,6L,1L,4L,1L,311L,10L,3L,1L + +#define SN_ms_sgc "msSGC" +#define LN_ms_sgc "Microsoft Server Gated Crypto" +#define NID_ms_sgc 137 +#define OBJ_ms_sgc 1L,3L,6L,1L,4L,1L,311L,10L,3L,3L + +#define SN_ms_efs "msEFS" +#define LN_ms_efs "Microsoft Encrypted File System" +#define NID_ms_efs 138 +#define OBJ_ms_efs 1L,3L,6L,1L,4L,1L,311L,10L,3L,4L + +#define SN_ms_smartcard_login "msSmartcardLogin" +#define LN_ms_smartcard_login "Microsoft Smartcardlogin" +#define NID_ms_smartcard_login 648 +#define OBJ_ms_smartcard_login 1L,3L,6L,1L,4L,1L,311L,20L,2L,2L + +#define SN_ms_upn "msUPN" +#define LN_ms_upn "Microsoft Universal Principal Name" +#define NID_ms_upn 649 +#define OBJ_ms_upn 1L,3L,6L,1L,4L,1L,311L,20L,2L,3L + +#define SN_idea_cbc "IDEA-CBC" +#define LN_idea_cbc "idea-cbc" +#define NID_idea_cbc 34 +#define OBJ_idea_cbc 1L,3L,6L,1L,4L,1L,188L,7L,1L,1L,2L + +#define SN_idea_ecb "IDEA-ECB" +#define LN_idea_ecb "idea-ecb" +#define NID_idea_ecb 36 + +#define SN_idea_cfb64 "IDEA-CFB" +#define LN_idea_cfb64 "idea-cfb" +#define NID_idea_cfb64 35 + +#define SN_idea_ofb64 "IDEA-OFB" +#define LN_idea_ofb64 "idea-ofb" +#define NID_idea_ofb64 46 + +#define SN_bf_cbc "BF-CBC" +#define LN_bf_cbc "bf-cbc" +#define NID_bf_cbc 91 +#define OBJ_bf_cbc 1L,3L,6L,1L,4L,1L,3029L,1L,2L + +#define SN_bf_ecb "BF-ECB" +#define LN_bf_ecb "bf-ecb" +#define NID_bf_ecb 92 + +#define SN_bf_cfb64 "BF-CFB" +#define LN_bf_cfb64 "bf-cfb" +#define NID_bf_cfb64 93 + +#define SN_bf_ofb64 "BF-OFB" +#define LN_bf_ofb64 "bf-ofb" +#define NID_bf_ofb64 94 + +#define SN_id_pkix "PKIX" +#define NID_id_pkix 127 +#define OBJ_id_pkix 1L,3L,6L,1L,5L,5L,7L + +#define SN_id_pkix_mod "id-pkix-mod" +#define NID_id_pkix_mod 258 +#define OBJ_id_pkix_mod OBJ_id_pkix,0L + +#define SN_id_pe "id-pe" +#define NID_id_pe 175 +#define OBJ_id_pe OBJ_id_pkix,1L + +#define SN_id_qt "id-qt" +#define NID_id_qt 259 +#define OBJ_id_qt OBJ_id_pkix,2L + +#define SN_id_kp "id-kp" +#define NID_id_kp 128 +#define OBJ_id_kp OBJ_id_pkix,3L + +#define SN_id_it "id-it" +#define NID_id_it 260 +#define OBJ_id_it OBJ_id_pkix,4L + +#define SN_id_pkip "id-pkip" +#define NID_id_pkip 261 +#define OBJ_id_pkip OBJ_id_pkix,5L + +#define SN_id_alg "id-alg" +#define NID_id_alg 262 +#define OBJ_id_alg OBJ_id_pkix,6L + +#define SN_id_cmc "id-cmc" +#define NID_id_cmc 263 +#define OBJ_id_cmc OBJ_id_pkix,7L + +#define SN_id_on "id-on" +#define NID_id_on 264 +#define OBJ_id_on OBJ_id_pkix,8L + +#define SN_id_pda "id-pda" +#define NID_id_pda 265 +#define OBJ_id_pda OBJ_id_pkix,9L + +#define SN_id_aca "id-aca" +#define NID_id_aca 266 +#define OBJ_id_aca OBJ_id_pkix,10L + +#define SN_id_qcs "id-qcs" +#define NID_id_qcs 267 +#define OBJ_id_qcs OBJ_id_pkix,11L + +#define SN_id_cct "id-cct" +#define NID_id_cct 268 +#define OBJ_id_cct OBJ_id_pkix,12L + +#define SN_id_ppl "id-ppl" +#define NID_id_ppl 662 +#define OBJ_id_ppl OBJ_id_pkix,21L + +#define SN_id_ad "id-ad" +#define NID_id_ad 176 +#define OBJ_id_ad OBJ_id_pkix,48L + +#define SN_id_pkix1_explicit_88 "id-pkix1-explicit-88" +#define NID_id_pkix1_explicit_88 269 +#define OBJ_id_pkix1_explicit_88 OBJ_id_pkix_mod,1L + +#define SN_id_pkix1_implicit_88 "id-pkix1-implicit-88" +#define NID_id_pkix1_implicit_88 270 +#define OBJ_id_pkix1_implicit_88 OBJ_id_pkix_mod,2L + +#define SN_id_pkix1_explicit_93 "id-pkix1-explicit-93" +#define NID_id_pkix1_explicit_93 271 +#define OBJ_id_pkix1_explicit_93 OBJ_id_pkix_mod,3L + +#define SN_id_pkix1_implicit_93 "id-pkix1-implicit-93" +#define NID_id_pkix1_implicit_93 272 +#define OBJ_id_pkix1_implicit_93 OBJ_id_pkix_mod,4L + +#define SN_id_mod_crmf "id-mod-crmf" +#define NID_id_mod_crmf 273 +#define OBJ_id_mod_crmf OBJ_id_pkix_mod,5L + +#define SN_id_mod_cmc "id-mod-cmc" +#define NID_id_mod_cmc 274 +#define OBJ_id_mod_cmc OBJ_id_pkix_mod,6L + +#define SN_id_mod_kea_profile_88 "id-mod-kea-profile-88" +#define NID_id_mod_kea_profile_88 275 +#define OBJ_id_mod_kea_profile_88 OBJ_id_pkix_mod,7L + +#define SN_id_mod_kea_profile_93 "id-mod-kea-profile-93" +#define NID_id_mod_kea_profile_93 276 +#define OBJ_id_mod_kea_profile_93 OBJ_id_pkix_mod,8L + +#define SN_id_mod_cmp "id-mod-cmp" +#define NID_id_mod_cmp 277 +#define OBJ_id_mod_cmp OBJ_id_pkix_mod,9L + +#define SN_id_mod_qualified_cert_88 "id-mod-qualified-cert-88" +#define NID_id_mod_qualified_cert_88 278 +#define OBJ_id_mod_qualified_cert_88 OBJ_id_pkix_mod,10L + +#define SN_id_mod_qualified_cert_93 "id-mod-qualified-cert-93" +#define NID_id_mod_qualified_cert_93 279 +#define OBJ_id_mod_qualified_cert_93 OBJ_id_pkix_mod,11L + +#define SN_id_mod_attribute_cert "id-mod-attribute-cert" +#define NID_id_mod_attribute_cert 280 +#define OBJ_id_mod_attribute_cert OBJ_id_pkix_mod,12L + +#define SN_id_mod_timestamp_protocol "id-mod-timestamp-protocol" +#define NID_id_mod_timestamp_protocol 281 +#define OBJ_id_mod_timestamp_protocol OBJ_id_pkix_mod,13L + +#define SN_id_mod_ocsp "id-mod-ocsp" +#define NID_id_mod_ocsp 282 +#define OBJ_id_mod_ocsp OBJ_id_pkix_mod,14L + +#define SN_id_mod_dvcs "id-mod-dvcs" +#define NID_id_mod_dvcs 283 +#define OBJ_id_mod_dvcs OBJ_id_pkix_mod,15L + +#define SN_id_mod_cmp2000 "id-mod-cmp2000" +#define NID_id_mod_cmp2000 284 +#define OBJ_id_mod_cmp2000 OBJ_id_pkix_mod,16L + +#define SN_info_access "authorityInfoAccess" +#define LN_info_access "Authority Information Access" +#define NID_info_access 177 +#define OBJ_info_access OBJ_id_pe,1L + +#define SN_biometricInfo "biometricInfo" +#define LN_biometricInfo "Biometric Info" +#define NID_biometricInfo 285 +#define OBJ_biometricInfo OBJ_id_pe,2L + +#define SN_qcStatements "qcStatements" +#define NID_qcStatements 286 +#define OBJ_qcStatements OBJ_id_pe,3L + +#define SN_ac_auditEntity "ac-auditEntity" +#define NID_ac_auditEntity 287 +#define OBJ_ac_auditEntity OBJ_id_pe,4L + +#define SN_ac_targeting "ac-targeting" +#define NID_ac_targeting 288 +#define OBJ_ac_targeting OBJ_id_pe,5L + +#define SN_aaControls "aaControls" +#define NID_aaControls 289 +#define OBJ_aaControls OBJ_id_pe,6L + +#define SN_sbgp_ipAddrBlock "sbgp-ipAddrBlock" +#define NID_sbgp_ipAddrBlock 290 +#define OBJ_sbgp_ipAddrBlock OBJ_id_pe,7L + +#define SN_sbgp_autonomousSysNum "sbgp-autonomousSysNum" +#define NID_sbgp_autonomousSysNum 291 +#define OBJ_sbgp_autonomousSysNum OBJ_id_pe,8L + +#define SN_sbgp_routerIdentifier "sbgp-routerIdentifier" +#define NID_sbgp_routerIdentifier 292 +#define OBJ_sbgp_routerIdentifier OBJ_id_pe,9L + +#define SN_ac_proxying "ac-proxying" +#define NID_ac_proxying 397 +#define OBJ_ac_proxying OBJ_id_pe,10L + +#define SN_sinfo_access "subjectInfoAccess" +#define LN_sinfo_access "Subject Information Access" +#define NID_sinfo_access 398 +#define OBJ_sinfo_access OBJ_id_pe,11L + +#define SN_proxyCertInfo "proxyCertInfo" +#define LN_proxyCertInfo "Proxy Certificate Information" +#define NID_proxyCertInfo 663 +#define OBJ_proxyCertInfo OBJ_id_pe,14L + +#define SN_id_qt_cps "id-qt-cps" +#define LN_id_qt_cps "Policy Qualifier CPS" +#define NID_id_qt_cps 164 +#define OBJ_id_qt_cps OBJ_id_qt,1L + +#define SN_id_qt_unotice "id-qt-unotice" +#define LN_id_qt_unotice "Policy Qualifier User Notice" +#define NID_id_qt_unotice 165 +#define OBJ_id_qt_unotice OBJ_id_qt,2L + +#define SN_textNotice "textNotice" +#define NID_textNotice 293 +#define OBJ_textNotice OBJ_id_qt,3L + +#define SN_server_auth "serverAuth" +#define LN_server_auth "TLS Web Server Authentication" +#define NID_server_auth 129 +#define OBJ_server_auth OBJ_id_kp,1L + +#define SN_client_auth "clientAuth" +#define LN_client_auth "TLS Web Client Authentication" +#define NID_client_auth 130 +#define OBJ_client_auth OBJ_id_kp,2L + +#define SN_code_sign "codeSigning" +#define LN_code_sign "Code Signing" +#define NID_code_sign 131 +#define OBJ_code_sign OBJ_id_kp,3L + +#define SN_email_protect "emailProtection" +#define LN_email_protect "E-mail Protection" +#define NID_email_protect 132 +#define OBJ_email_protect OBJ_id_kp,4L + +#define SN_ipsecEndSystem "ipsecEndSystem" +#define LN_ipsecEndSystem "IPSec End System" +#define NID_ipsecEndSystem 294 +#define OBJ_ipsecEndSystem OBJ_id_kp,5L + +#define SN_ipsecTunnel "ipsecTunnel" +#define LN_ipsecTunnel "IPSec Tunnel" +#define NID_ipsecTunnel 295 +#define OBJ_ipsecTunnel OBJ_id_kp,6L + +#define SN_ipsecUser "ipsecUser" +#define LN_ipsecUser "IPSec User" +#define NID_ipsecUser 296 +#define OBJ_ipsecUser OBJ_id_kp,7L + +#define SN_time_stamp "timeStamping" +#define LN_time_stamp "Time Stamping" +#define NID_time_stamp 133 +#define OBJ_time_stamp OBJ_id_kp,8L + +#define SN_OCSP_sign "OCSPSigning" +#define LN_OCSP_sign "OCSP Signing" +#define NID_OCSP_sign 180 +#define OBJ_OCSP_sign OBJ_id_kp,9L + +#define SN_dvcs "DVCS" +#define LN_dvcs "dvcs" +#define NID_dvcs 297 +#define OBJ_dvcs OBJ_id_kp,10L + +#define SN_id_it_caProtEncCert "id-it-caProtEncCert" +#define NID_id_it_caProtEncCert 298 +#define OBJ_id_it_caProtEncCert OBJ_id_it,1L + +#define SN_id_it_signKeyPairTypes "id-it-signKeyPairTypes" +#define NID_id_it_signKeyPairTypes 299 +#define OBJ_id_it_signKeyPairTypes OBJ_id_it,2L + +#define SN_id_it_encKeyPairTypes "id-it-encKeyPairTypes" +#define NID_id_it_encKeyPairTypes 300 +#define OBJ_id_it_encKeyPairTypes OBJ_id_it,3L + +#define SN_id_it_preferredSymmAlg "id-it-preferredSymmAlg" +#define NID_id_it_preferredSymmAlg 301 +#define OBJ_id_it_preferredSymmAlg OBJ_id_it,4L + +#define SN_id_it_caKeyUpdateInfo "id-it-caKeyUpdateInfo" +#define NID_id_it_caKeyUpdateInfo 302 +#define OBJ_id_it_caKeyUpdateInfo OBJ_id_it,5L + +#define SN_id_it_currentCRL "id-it-currentCRL" +#define NID_id_it_currentCRL 303 +#define OBJ_id_it_currentCRL OBJ_id_it,6L + +#define SN_id_it_unsupportedOIDs "id-it-unsupportedOIDs" +#define NID_id_it_unsupportedOIDs 304 +#define OBJ_id_it_unsupportedOIDs OBJ_id_it,7L + +#define SN_id_it_subscriptionRequest "id-it-subscriptionRequest" +#define NID_id_it_subscriptionRequest 305 +#define OBJ_id_it_subscriptionRequest OBJ_id_it,8L + +#define SN_id_it_subscriptionResponse "id-it-subscriptionResponse" +#define NID_id_it_subscriptionResponse 306 +#define OBJ_id_it_subscriptionResponse OBJ_id_it,9L + +#define SN_id_it_keyPairParamReq "id-it-keyPairParamReq" +#define NID_id_it_keyPairParamReq 307 +#define OBJ_id_it_keyPairParamReq OBJ_id_it,10L + +#define SN_id_it_keyPairParamRep "id-it-keyPairParamRep" +#define NID_id_it_keyPairParamRep 308 +#define OBJ_id_it_keyPairParamRep OBJ_id_it,11L + +#define SN_id_it_revPassphrase "id-it-revPassphrase" +#define NID_id_it_revPassphrase 309 +#define OBJ_id_it_revPassphrase OBJ_id_it,12L + +#define SN_id_it_implicitConfirm "id-it-implicitConfirm" +#define NID_id_it_implicitConfirm 310 +#define OBJ_id_it_implicitConfirm OBJ_id_it,13L + +#define SN_id_it_confirmWaitTime "id-it-confirmWaitTime" +#define NID_id_it_confirmWaitTime 311 +#define OBJ_id_it_confirmWaitTime OBJ_id_it,14L + +#define SN_id_it_origPKIMessage "id-it-origPKIMessage" +#define NID_id_it_origPKIMessage 312 +#define OBJ_id_it_origPKIMessage OBJ_id_it,15L + +#define SN_id_it_suppLangTags "id-it-suppLangTags" +#define NID_id_it_suppLangTags 784 +#define OBJ_id_it_suppLangTags OBJ_id_it,16L + +#define SN_id_regCtrl "id-regCtrl" +#define NID_id_regCtrl 313 +#define OBJ_id_regCtrl OBJ_id_pkip,1L + +#define SN_id_regInfo "id-regInfo" +#define NID_id_regInfo 314 +#define OBJ_id_regInfo OBJ_id_pkip,2L + +#define SN_id_regCtrl_regToken "id-regCtrl-regToken" +#define NID_id_regCtrl_regToken 315 +#define OBJ_id_regCtrl_regToken OBJ_id_regCtrl,1L + +#define SN_id_regCtrl_authenticator "id-regCtrl-authenticator" +#define NID_id_regCtrl_authenticator 316 +#define OBJ_id_regCtrl_authenticator OBJ_id_regCtrl,2L + +#define SN_id_regCtrl_pkiPublicationInfo "id-regCtrl-pkiPublicationInfo" +#define NID_id_regCtrl_pkiPublicationInfo 317 +#define OBJ_id_regCtrl_pkiPublicationInfo OBJ_id_regCtrl,3L + +#define SN_id_regCtrl_pkiArchiveOptions "id-regCtrl-pkiArchiveOptions" +#define NID_id_regCtrl_pkiArchiveOptions 318 +#define OBJ_id_regCtrl_pkiArchiveOptions OBJ_id_regCtrl,4L + +#define SN_id_regCtrl_oldCertID "id-regCtrl-oldCertID" +#define NID_id_regCtrl_oldCertID 319 +#define OBJ_id_regCtrl_oldCertID OBJ_id_regCtrl,5L + +#define SN_id_regCtrl_protocolEncrKey "id-regCtrl-protocolEncrKey" +#define NID_id_regCtrl_protocolEncrKey 320 +#define OBJ_id_regCtrl_protocolEncrKey OBJ_id_regCtrl,6L + +#define SN_id_regInfo_utf8Pairs "id-regInfo-utf8Pairs" +#define NID_id_regInfo_utf8Pairs 321 +#define OBJ_id_regInfo_utf8Pairs OBJ_id_regInfo,1L + +#define SN_id_regInfo_certReq "id-regInfo-certReq" +#define NID_id_regInfo_certReq 322 +#define OBJ_id_regInfo_certReq OBJ_id_regInfo,2L + +#define SN_id_alg_des40 "id-alg-des40" +#define NID_id_alg_des40 323 +#define OBJ_id_alg_des40 OBJ_id_alg,1L + +#define SN_id_alg_noSignature "id-alg-noSignature" +#define NID_id_alg_noSignature 324 +#define OBJ_id_alg_noSignature OBJ_id_alg,2L + +#define SN_id_alg_dh_sig_hmac_sha1 "id-alg-dh-sig-hmac-sha1" +#define NID_id_alg_dh_sig_hmac_sha1 325 +#define OBJ_id_alg_dh_sig_hmac_sha1 OBJ_id_alg,3L + +#define SN_id_alg_dh_pop "id-alg-dh-pop" +#define NID_id_alg_dh_pop 326 +#define OBJ_id_alg_dh_pop OBJ_id_alg,4L + +#define SN_id_cmc_statusInfo "id-cmc-statusInfo" +#define NID_id_cmc_statusInfo 327 +#define OBJ_id_cmc_statusInfo OBJ_id_cmc,1L + +#define SN_id_cmc_identification "id-cmc-identification" +#define NID_id_cmc_identification 328 +#define OBJ_id_cmc_identification OBJ_id_cmc,2L + +#define SN_id_cmc_identityProof "id-cmc-identityProof" +#define NID_id_cmc_identityProof 329 +#define OBJ_id_cmc_identityProof OBJ_id_cmc,3L + +#define SN_id_cmc_dataReturn "id-cmc-dataReturn" +#define NID_id_cmc_dataReturn 330 +#define OBJ_id_cmc_dataReturn OBJ_id_cmc,4L + +#define SN_id_cmc_transactionId "id-cmc-transactionId" +#define NID_id_cmc_transactionId 331 +#define OBJ_id_cmc_transactionId OBJ_id_cmc,5L + +#define SN_id_cmc_senderNonce "id-cmc-senderNonce" +#define NID_id_cmc_senderNonce 332 +#define OBJ_id_cmc_senderNonce OBJ_id_cmc,6L + +#define SN_id_cmc_recipientNonce "id-cmc-recipientNonce" +#define NID_id_cmc_recipientNonce 333 +#define OBJ_id_cmc_recipientNonce OBJ_id_cmc,7L + +#define SN_id_cmc_addExtensions "id-cmc-addExtensions" +#define NID_id_cmc_addExtensions 334 +#define OBJ_id_cmc_addExtensions OBJ_id_cmc,8L + +#define SN_id_cmc_encryptedPOP "id-cmc-encryptedPOP" +#define NID_id_cmc_encryptedPOP 335 +#define OBJ_id_cmc_encryptedPOP OBJ_id_cmc,9L + +#define SN_id_cmc_decryptedPOP "id-cmc-decryptedPOP" +#define NID_id_cmc_decryptedPOP 336 +#define OBJ_id_cmc_decryptedPOP OBJ_id_cmc,10L + +#define SN_id_cmc_lraPOPWitness "id-cmc-lraPOPWitness" +#define NID_id_cmc_lraPOPWitness 337 +#define OBJ_id_cmc_lraPOPWitness OBJ_id_cmc,11L + +#define SN_id_cmc_getCert "id-cmc-getCert" +#define NID_id_cmc_getCert 338 +#define OBJ_id_cmc_getCert OBJ_id_cmc,15L + +#define SN_id_cmc_getCRL "id-cmc-getCRL" +#define NID_id_cmc_getCRL 339 +#define OBJ_id_cmc_getCRL OBJ_id_cmc,16L + +#define SN_id_cmc_revokeRequest "id-cmc-revokeRequest" +#define NID_id_cmc_revokeRequest 340 +#define OBJ_id_cmc_revokeRequest OBJ_id_cmc,17L + +#define SN_id_cmc_regInfo "id-cmc-regInfo" +#define NID_id_cmc_regInfo 341 +#define OBJ_id_cmc_regInfo OBJ_id_cmc,18L + +#define SN_id_cmc_responseInfo "id-cmc-responseInfo" +#define NID_id_cmc_responseInfo 342 +#define OBJ_id_cmc_responseInfo OBJ_id_cmc,19L + +#define SN_id_cmc_queryPending "id-cmc-queryPending" +#define NID_id_cmc_queryPending 343 +#define OBJ_id_cmc_queryPending OBJ_id_cmc,21L + +#define SN_id_cmc_popLinkRandom "id-cmc-popLinkRandom" +#define NID_id_cmc_popLinkRandom 344 +#define OBJ_id_cmc_popLinkRandom OBJ_id_cmc,22L + +#define SN_id_cmc_popLinkWitness "id-cmc-popLinkWitness" +#define NID_id_cmc_popLinkWitness 345 +#define OBJ_id_cmc_popLinkWitness OBJ_id_cmc,23L + +#define SN_id_cmc_confirmCertAcceptance "id-cmc-confirmCertAcceptance" +#define NID_id_cmc_confirmCertAcceptance 346 +#define OBJ_id_cmc_confirmCertAcceptance OBJ_id_cmc,24L + +#define SN_id_on_personalData "id-on-personalData" +#define NID_id_on_personalData 347 +#define OBJ_id_on_personalData OBJ_id_on,1L + +#define SN_id_on_permanentIdentifier "id-on-permanentIdentifier" +#define LN_id_on_permanentIdentifier "Permanent Identifier" +#define NID_id_on_permanentIdentifier 858 +#define OBJ_id_on_permanentIdentifier OBJ_id_on,3L + +#define SN_id_pda_dateOfBirth "id-pda-dateOfBirth" +#define NID_id_pda_dateOfBirth 348 +#define OBJ_id_pda_dateOfBirth OBJ_id_pda,1L + +#define SN_id_pda_placeOfBirth "id-pda-placeOfBirth" +#define NID_id_pda_placeOfBirth 349 +#define OBJ_id_pda_placeOfBirth OBJ_id_pda,2L + +#define SN_id_pda_gender "id-pda-gender" +#define NID_id_pda_gender 351 +#define OBJ_id_pda_gender OBJ_id_pda,3L + +#define SN_id_pda_countryOfCitizenship "id-pda-countryOfCitizenship" +#define NID_id_pda_countryOfCitizenship 352 +#define OBJ_id_pda_countryOfCitizenship OBJ_id_pda,4L + +#define SN_id_pda_countryOfResidence "id-pda-countryOfResidence" +#define NID_id_pda_countryOfResidence 353 +#define OBJ_id_pda_countryOfResidence OBJ_id_pda,5L + +#define SN_id_aca_authenticationInfo "id-aca-authenticationInfo" +#define NID_id_aca_authenticationInfo 354 +#define OBJ_id_aca_authenticationInfo OBJ_id_aca,1L + +#define SN_id_aca_accessIdentity "id-aca-accessIdentity" +#define NID_id_aca_accessIdentity 355 +#define OBJ_id_aca_accessIdentity OBJ_id_aca,2L + +#define SN_id_aca_chargingIdentity "id-aca-chargingIdentity" +#define NID_id_aca_chargingIdentity 356 +#define OBJ_id_aca_chargingIdentity OBJ_id_aca,3L + +#define SN_id_aca_group "id-aca-group" +#define NID_id_aca_group 357 +#define OBJ_id_aca_group OBJ_id_aca,4L + +#define SN_id_aca_role "id-aca-role" +#define NID_id_aca_role 358 +#define OBJ_id_aca_role OBJ_id_aca,5L + +#define SN_id_aca_encAttrs "id-aca-encAttrs" +#define NID_id_aca_encAttrs 399 +#define OBJ_id_aca_encAttrs OBJ_id_aca,6L + +#define SN_id_qcs_pkixQCSyntax_v1 "id-qcs-pkixQCSyntax-v1" +#define NID_id_qcs_pkixQCSyntax_v1 359 +#define OBJ_id_qcs_pkixQCSyntax_v1 OBJ_id_qcs,1L + +#define SN_id_cct_crs "id-cct-crs" +#define NID_id_cct_crs 360 +#define OBJ_id_cct_crs OBJ_id_cct,1L + +#define SN_id_cct_PKIData "id-cct-PKIData" +#define NID_id_cct_PKIData 361 +#define OBJ_id_cct_PKIData OBJ_id_cct,2L + +#define SN_id_cct_PKIResponse "id-cct-PKIResponse" +#define NID_id_cct_PKIResponse 362 +#define OBJ_id_cct_PKIResponse OBJ_id_cct,3L + +#define SN_id_ppl_anyLanguage "id-ppl-anyLanguage" +#define LN_id_ppl_anyLanguage "Any language" +#define NID_id_ppl_anyLanguage 664 +#define OBJ_id_ppl_anyLanguage OBJ_id_ppl,0L + +#define SN_id_ppl_inheritAll "id-ppl-inheritAll" +#define LN_id_ppl_inheritAll "Inherit all" +#define NID_id_ppl_inheritAll 665 +#define OBJ_id_ppl_inheritAll OBJ_id_ppl,1L + +#define SN_Independent "id-ppl-independent" +#define LN_Independent "Independent" +#define NID_Independent 667 +#define OBJ_Independent OBJ_id_ppl,2L + +#define SN_ad_OCSP "OCSP" +#define LN_ad_OCSP "OCSP" +#define NID_ad_OCSP 178 +#define OBJ_ad_OCSP OBJ_id_ad,1L + +#define SN_ad_ca_issuers "caIssuers" +#define LN_ad_ca_issuers "CA Issuers" +#define NID_ad_ca_issuers 179 +#define OBJ_ad_ca_issuers OBJ_id_ad,2L + +#define SN_ad_timeStamping "ad_timestamping" +#define LN_ad_timeStamping "AD Time Stamping" +#define NID_ad_timeStamping 363 +#define OBJ_ad_timeStamping OBJ_id_ad,3L + +#define SN_ad_dvcs "AD_DVCS" +#define LN_ad_dvcs "ad dvcs" +#define NID_ad_dvcs 364 +#define OBJ_ad_dvcs OBJ_id_ad,4L + +#define SN_caRepository "caRepository" +#define LN_caRepository "CA Repository" +#define NID_caRepository 785 +#define OBJ_caRepository OBJ_id_ad,5L + +#define OBJ_id_pkix_OCSP OBJ_ad_OCSP + +#define SN_id_pkix_OCSP_basic "basicOCSPResponse" +#define LN_id_pkix_OCSP_basic "Basic OCSP Response" +#define NID_id_pkix_OCSP_basic 365 +#define OBJ_id_pkix_OCSP_basic OBJ_id_pkix_OCSP,1L + +#define SN_id_pkix_OCSP_Nonce "Nonce" +#define LN_id_pkix_OCSP_Nonce "OCSP Nonce" +#define NID_id_pkix_OCSP_Nonce 366 +#define OBJ_id_pkix_OCSP_Nonce OBJ_id_pkix_OCSP,2L + +#define SN_id_pkix_OCSP_CrlID "CrlID" +#define LN_id_pkix_OCSP_CrlID "OCSP CRL ID" +#define NID_id_pkix_OCSP_CrlID 367 +#define OBJ_id_pkix_OCSP_CrlID OBJ_id_pkix_OCSP,3L + +#define SN_id_pkix_OCSP_acceptableResponses "acceptableResponses" +#define LN_id_pkix_OCSP_acceptableResponses "Acceptable OCSP Responses" +#define NID_id_pkix_OCSP_acceptableResponses 368 +#define OBJ_id_pkix_OCSP_acceptableResponses OBJ_id_pkix_OCSP,4L + +#define SN_id_pkix_OCSP_noCheck "noCheck" +#define LN_id_pkix_OCSP_noCheck "OCSP No Check" +#define NID_id_pkix_OCSP_noCheck 369 +#define OBJ_id_pkix_OCSP_noCheck OBJ_id_pkix_OCSP,5L + +#define SN_id_pkix_OCSP_archiveCutoff "archiveCutoff" +#define LN_id_pkix_OCSP_archiveCutoff "OCSP Archive Cutoff" +#define NID_id_pkix_OCSP_archiveCutoff 370 +#define OBJ_id_pkix_OCSP_archiveCutoff OBJ_id_pkix_OCSP,6L + +#define SN_id_pkix_OCSP_serviceLocator "serviceLocator" +#define LN_id_pkix_OCSP_serviceLocator "OCSP Service Locator" +#define NID_id_pkix_OCSP_serviceLocator 371 +#define OBJ_id_pkix_OCSP_serviceLocator OBJ_id_pkix_OCSP,7L + +#define SN_id_pkix_OCSP_extendedStatus "extendedStatus" +#define LN_id_pkix_OCSP_extendedStatus "Extended OCSP Status" +#define NID_id_pkix_OCSP_extendedStatus 372 +#define OBJ_id_pkix_OCSP_extendedStatus OBJ_id_pkix_OCSP,8L + +#define SN_id_pkix_OCSP_valid "valid" +#define NID_id_pkix_OCSP_valid 373 +#define OBJ_id_pkix_OCSP_valid OBJ_id_pkix_OCSP,9L + +#define SN_id_pkix_OCSP_path "path" +#define NID_id_pkix_OCSP_path 374 +#define OBJ_id_pkix_OCSP_path OBJ_id_pkix_OCSP,10L + +#define SN_id_pkix_OCSP_trustRoot "trustRoot" +#define LN_id_pkix_OCSP_trustRoot "Trust Root" +#define NID_id_pkix_OCSP_trustRoot 375 +#define OBJ_id_pkix_OCSP_trustRoot OBJ_id_pkix_OCSP,11L + +#define SN_algorithm "algorithm" +#define LN_algorithm "algorithm" +#define NID_algorithm 376 +#define OBJ_algorithm 1L,3L,14L,3L,2L + +#define SN_md5WithRSA "RSA-NP-MD5" +#define LN_md5WithRSA "md5WithRSA" +#define NID_md5WithRSA 104 +#define OBJ_md5WithRSA OBJ_algorithm,3L + +#define SN_des_ecb "DES-ECB" +#define LN_des_ecb "des-ecb" +#define NID_des_ecb 29 +#define OBJ_des_ecb OBJ_algorithm,6L + +#define SN_des_cbc "DES-CBC" +#define LN_des_cbc "des-cbc" +#define NID_des_cbc 31 +#define OBJ_des_cbc OBJ_algorithm,7L + +#define SN_des_ofb64 "DES-OFB" +#define LN_des_ofb64 "des-ofb" +#define NID_des_ofb64 45 +#define OBJ_des_ofb64 OBJ_algorithm,8L + +#define SN_des_cfb64 "DES-CFB" +#define LN_des_cfb64 "des-cfb" +#define NID_des_cfb64 30 +#define OBJ_des_cfb64 OBJ_algorithm,9L + +#define SN_rsaSignature "rsaSignature" +#define NID_rsaSignature 377 +#define OBJ_rsaSignature OBJ_algorithm,11L + +#define SN_dsa_2 "DSA-old" +#define LN_dsa_2 "dsaEncryption-old" +#define NID_dsa_2 67 +#define OBJ_dsa_2 OBJ_algorithm,12L + +#define SN_dsaWithSHA "DSA-SHA" +#define LN_dsaWithSHA "dsaWithSHA" +#define NID_dsaWithSHA 66 +#define OBJ_dsaWithSHA OBJ_algorithm,13L + +#define SN_shaWithRSAEncryption "RSA-SHA" +#define LN_shaWithRSAEncryption "shaWithRSAEncryption" +#define NID_shaWithRSAEncryption 42 +#define OBJ_shaWithRSAEncryption OBJ_algorithm,15L + +#define SN_des_ede_ecb "DES-EDE" +#define LN_des_ede_ecb "des-ede" +#define NID_des_ede_ecb 32 +#define OBJ_des_ede_ecb OBJ_algorithm,17L + +#define SN_des_ede3_ecb "DES-EDE3" +#define LN_des_ede3_ecb "des-ede3" +#define NID_des_ede3_ecb 33 + +#define SN_des_ede_cbc "DES-EDE-CBC" +#define LN_des_ede_cbc "des-ede-cbc" +#define NID_des_ede_cbc 43 + +#define SN_des_ede_cfb64 "DES-EDE-CFB" +#define LN_des_ede_cfb64 "des-ede-cfb" +#define NID_des_ede_cfb64 60 + +#define SN_des_ede3_cfb64 "DES-EDE3-CFB" +#define LN_des_ede3_cfb64 "des-ede3-cfb" +#define NID_des_ede3_cfb64 61 + +#define SN_des_ede_ofb64 "DES-EDE-OFB" +#define LN_des_ede_ofb64 "des-ede-ofb" +#define NID_des_ede_ofb64 62 + +#define SN_des_ede3_ofb64 "DES-EDE3-OFB" +#define LN_des_ede3_ofb64 "des-ede3-ofb" +#define NID_des_ede3_ofb64 63 + +#define SN_desx_cbc "DESX-CBC" +#define LN_desx_cbc "desx-cbc" +#define NID_desx_cbc 80 + +#define SN_sha "SHA" +#define LN_sha "sha" +#define NID_sha 41 +#define OBJ_sha OBJ_algorithm,18L + +#define SN_sha1 "SHA1" +#define LN_sha1 "sha1" +#define NID_sha1 64 +#define OBJ_sha1 OBJ_algorithm,26L + +#define SN_dsaWithSHA1_2 "DSA-SHA1-old" +#define LN_dsaWithSHA1_2 "dsaWithSHA1-old" +#define NID_dsaWithSHA1_2 70 +#define OBJ_dsaWithSHA1_2 OBJ_algorithm,27L + +#define SN_sha1WithRSA "RSA-SHA1-2" +#define LN_sha1WithRSA "sha1WithRSA" +#define NID_sha1WithRSA 115 +#define OBJ_sha1WithRSA OBJ_algorithm,29L + +#define SN_ripemd160 "RIPEMD160" +#define LN_ripemd160 "ripemd160" +#define NID_ripemd160 117 +#define OBJ_ripemd160 1L,3L,36L,3L,2L,1L + +#define SN_ripemd160WithRSA "RSA-RIPEMD160" +#define LN_ripemd160WithRSA "ripemd160WithRSA" +#define NID_ripemd160WithRSA 119 +#define OBJ_ripemd160WithRSA 1L,3L,36L,3L,3L,1L,2L + +#define SN_sxnet "SXNetID" +#define LN_sxnet "Strong Extranet ID" +#define NID_sxnet 143 +#define OBJ_sxnet 1L,3L,101L,1L,4L,1L + +#define SN_X500 "X500" +#define LN_X500 "directory services (X.500)" +#define NID_X500 11 +#define OBJ_X500 2L,5L + +#define SN_X509 "X509" +#define NID_X509 12 +#define OBJ_X509 OBJ_X500,4L + +#define SN_commonName "CN" +#define LN_commonName "commonName" +#define NID_commonName 13 +#define OBJ_commonName OBJ_X509,3L + +#define SN_surname "SN" +#define LN_surname "surname" +#define NID_surname 100 +#define OBJ_surname OBJ_X509,4L + +#define LN_serialNumber "serialNumber" +#define NID_serialNumber 105 +#define OBJ_serialNumber OBJ_X509,5L + +#define SN_countryName "C" +#define LN_countryName "countryName" +#define NID_countryName 14 +#define OBJ_countryName OBJ_X509,6L + +#define SN_localityName "L" +#define LN_localityName "localityName" +#define NID_localityName 15 +#define OBJ_localityName OBJ_X509,7L + +#define SN_stateOrProvinceName "ST" +#define LN_stateOrProvinceName "stateOrProvinceName" +#define NID_stateOrProvinceName 16 +#define OBJ_stateOrProvinceName OBJ_X509,8L + +#define SN_streetAddress "street" +#define LN_streetAddress "streetAddress" +#define NID_streetAddress 660 +#define OBJ_streetAddress OBJ_X509,9L + +#define SN_organizationName "O" +#define LN_organizationName "organizationName" +#define NID_organizationName 17 +#define OBJ_organizationName OBJ_X509,10L + +#define SN_organizationalUnitName "OU" +#define LN_organizationalUnitName "organizationalUnitName" +#define NID_organizationalUnitName 18 +#define OBJ_organizationalUnitName OBJ_X509,11L + +#define SN_title "title" +#define LN_title "title" +#define NID_title 106 +#define OBJ_title OBJ_X509,12L + +#define LN_description "description" +#define NID_description 107 +#define OBJ_description OBJ_X509,13L + +#define LN_searchGuide "searchGuide" +#define NID_searchGuide 859 +#define OBJ_searchGuide OBJ_X509,14L + +#define LN_businessCategory "businessCategory" +#define NID_businessCategory 860 +#define OBJ_businessCategory OBJ_X509,15L + +#define LN_postalAddress "postalAddress" +#define NID_postalAddress 861 +#define OBJ_postalAddress OBJ_X509,16L + +#define LN_postalCode "postalCode" +#define NID_postalCode 661 +#define OBJ_postalCode OBJ_X509,17L + +#define LN_postOfficeBox "postOfficeBox" +#define NID_postOfficeBox 862 +#define OBJ_postOfficeBox OBJ_X509,18L + +#define LN_physicalDeliveryOfficeName "physicalDeliveryOfficeName" +#define NID_physicalDeliveryOfficeName 863 +#define OBJ_physicalDeliveryOfficeName OBJ_X509,19L + +#define LN_telephoneNumber "telephoneNumber" +#define NID_telephoneNumber 864 +#define OBJ_telephoneNumber OBJ_X509,20L + +#define LN_telexNumber "telexNumber" +#define NID_telexNumber 865 +#define OBJ_telexNumber OBJ_X509,21L + +#define LN_teletexTerminalIdentifier "teletexTerminalIdentifier" +#define NID_teletexTerminalIdentifier 866 +#define OBJ_teletexTerminalIdentifier OBJ_X509,22L + +#define LN_facsimileTelephoneNumber "facsimileTelephoneNumber" +#define NID_facsimileTelephoneNumber 867 +#define OBJ_facsimileTelephoneNumber OBJ_X509,23L + +#define LN_x121Address "x121Address" +#define NID_x121Address 868 +#define OBJ_x121Address OBJ_X509,24L + +#define LN_internationaliSDNNumber "internationaliSDNNumber" +#define NID_internationaliSDNNumber 869 +#define OBJ_internationaliSDNNumber OBJ_X509,25L + +#define LN_registeredAddress "registeredAddress" +#define NID_registeredAddress 870 +#define OBJ_registeredAddress OBJ_X509,26L + +#define LN_destinationIndicator "destinationIndicator" +#define NID_destinationIndicator 871 +#define OBJ_destinationIndicator OBJ_X509,27L + +#define LN_preferredDeliveryMethod "preferredDeliveryMethod" +#define NID_preferredDeliveryMethod 872 +#define OBJ_preferredDeliveryMethod OBJ_X509,28L + +#define LN_presentationAddress "presentationAddress" +#define NID_presentationAddress 873 +#define OBJ_presentationAddress OBJ_X509,29L + +#define LN_supportedApplicationContext "supportedApplicationContext" +#define NID_supportedApplicationContext 874 +#define OBJ_supportedApplicationContext OBJ_X509,30L + +#define SN_member "member" +#define NID_member 875 +#define OBJ_member OBJ_X509,31L + +#define SN_owner "owner" +#define NID_owner 876 +#define OBJ_owner OBJ_X509,32L + +#define LN_roleOccupant "roleOccupant" +#define NID_roleOccupant 877 +#define OBJ_roleOccupant OBJ_X509,33L + +#define SN_seeAlso "seeAlso" +#define NID_seeAlso 878 +#define OBJ_seeAlso OBJ_X509,34L + +#define LN_userPassword "userPassword" +#define NID_userPassword 879 +#define OBJ_userPassword OBJ_X509,35L + +#define LN_userCertificate "userCertificate" +#define NID_userCertificate 880 +#define OBJ_userCertificate OBJ_X509,36L + +#define LN_cACertificate "cACertificate" +#define NID_cACertificate 881 +#define OBJ_cACertificate OBJ_X509,37L + +#define LN_authorityRevocationList "authorityRevocationList" +#define NID_authorityRevocationList 882 +#define OBJ_authorityRevocationList OBJ_X509,38L + +#define LN_certificateRevocationList "certificateRevocationList" +#define NID_certificateRevocationList 883 +#define OBJ_certificateRevocationList OBJ_X509,39L + +#define LN_crossCertificatePair "crossCertificatePair" +#define NID_crossCertificatePair 884 +#define OBJ_crossCertificatePair OBJ_X509,40L + +#define SN_name "name" +#define LN_name "name" +#define NID_name 173 +#define OBJ_name OBJ_X509,41L + +#define SN_givenName "GN" +#define LN_givenName "givenName" +#define NID_givenName 99 +#define OBJ_givenName OBJ_X509,42L + +#define SN_initials "initials" +#define LN_initials "initials" +#define NID_initials 101 +#define OBJ_initials OBJ_X509,43L + +#define LN_generationQualifier "generationQualifier" +#define NID_generationQualifier 509 +#define OBJ_generationQualifier OBJ_X509,44L + +#define LN_x500UniqueIdentifier "x500UniqueIdentifier" +#define NID_x500UniqueIdentifier 503 +#define OBJ_x500UniqueIdentifier OBJ_X509,45L + +#define SN_dnQualifier "dnQualifier" +#define LN_dnQualifier "dnQualifier" +#define NID_dnQualifier 174 +#define OBJ_dnQualifier OBJ_X509,46L + +#define LN_enhancedSearchGuide "enhancedSearchGuide" +#define NID_enhancedSearchGuide 885 +#define OBJ_enhancedSearchGuide OBJ_X509,47L + +#define LN_protocolInformation "protocolInformation" +#define NID_protocolInformation 886 +#define OBJ_protocolInformation OBJ_X509,48L + +#define LN_distinguishedName "distinguishedName" +#define NID_distinguishedName 887 +#define OBJ_distinguishedName OBJ_X509,49L + +#define LN_uniqueMember "uniqueMember" +#define NID_uniqueMember 888 +#define OBJ_uniqueMember OBJ_X509,50L + +#define LN_houseIdentifier "houseIdentifier" +#define NID_houseIdentifier 889 +#define OBJ_houseIdentifier OBJ_X509,51L + +#define LN_supportedAlgorithms "supportedAlgorithms" +#define NID_supportedAlgorithms 890 +#define OBJ_supportedAlgorithms OBJ_X509,52L + +#define LN_deltaRevocationList "deltaRevocationList" +#define NID_deltaRevocationList 891 +#define OBJ_deltaRevocationList OBJ_X509,53L + +#define SN_dmdName "dmdName" +#define NID_dmdName 892 +#define OBJ_dmdName OBJ_X509,54L + +#define LN_pseudonym "pseudonym" +#define NID_pseudonym 510 +#define OBJ_pseudonym OBJ_X509,65L + +#define SN_role "role" +#define LN_role "role" +#define NID_role 400 +#define OBJ_role OBJ_X509,72L + +#define SN_X500algorithms "X500algorithms" +#define LN_X500algorithms "directory services - algorithms" +#define NID_X500algorithms 378 +#define OBJ_X500algorithms OBJ_X500,8L + +#define SN_rsa "RSA" +#define LN_rsa "rsa" +#define NID_rsa 19 +#define OBJ_rsa OBJ_X500algorithms,1L,1L + +#define SN_mdc2WithRSA "RSA-MDC2" +#define LN_mdc2WithRSA "mdc2WithRSA" +#define NID_mdc2WithRSA 96 +#define OBJ_mdc2WithRSA OBJ_X500algorithms,3L,100L + +#define SN_mdc2 "MDC2" +#define LN_mdc2 "mdc2" +#define NID_mdc2 95 +#define OBJ_mdc2 OBJ_X500algorithms,3L,101L + +#define SN_id_ce "id-ce" +#define NID_id_ce 81 +#define OBJ_id_ce OBJ_X500,29L + +#define SN_subject_directory_attributes "subjectDirectoryAttributes" +#define LN_subject_directory_attributes "X509v3 Subject Directory Attributes" +#define NID_subject_directory_attributes 769 +#define OBJ_subject_directory_attributes OBJ_id_ce,9L + +#define SN_subject_key_identifier "subjectKeyIdentifier" +#define LN_subject_key_identifier "X509v3 Subject Key Identifier" +#define NID_subject_key_identifier 82 +#define OBJ_subject_key_identifier OBJ_id_ce,14L + +#define SN_key_usage "keyUsage" +#define LN_key_usage "X509v3 Key Usage" +#define NID_key_usage 83 +#define OBJ_key_usage OBJ_id_ce,15L + +#define SN_private_key_usage_period "privateKeyUsagePeriod" +#define LN_private_key_usage_period "X509v3 Private Key Usage Period" +#define NID_private_key_usage_period 84 +#define OBJ_private_key_usage_period OBJ_id_ce,16L + +#define SN_subject_alt_name "subjectAltName" +#define LN_subject_alt_name "X509v3 Subject Alternative Name" +#define NID_subject_alt_name 85 +#define OBJ_subject_alt_name OBJ_id_ce,17L + +#define SN_issuer_alt_name "issuerAltName" +#define LN_issuer_alt_name "X509v3 Issuer Alternative Name" +#define NID_issuer_alt_name 86 +#define OBJ_issuer_alt_name OBJ_id_ce,18L + +#define SN_basic_constraints "basicConstraints" +#define LN_basic_constraints "X509v3 Basic Constraints" +#define NID_basic_constraints 87 +#define OBJ_basic_constraints OBJ_id_ce,19L + +#define SN_crl_number "crlNumber" +#define LN_crl_number "X509v3 CRL Number" +#define NID_crl_number 88 +#define OBJ_crl_number OBJ_id_ce,20L + +#define SN_crl_reason "CRLReason" +#define LN_crl_reason "X509v3 CRL Reason Code" +#define NID_crl_reason 141 +#define OBJ_crl_reason OBJ_id_ce,21L + +#define SN_invalidity_date "invalidityDate" +#define LN_invalidity_date "Invalidity Date" +#define NID_invalidity_date 142 +#define OBJ_invalidity_date OBJ_id_ce,24L + +#define SN_delta_crl "deltaCRL" +#define LN_delta_crl "X509v3 Delta CRL Indicator" +#define NID_delta_crl 140 +#define OBJ_delta_crl OBJ_id_ce,27L + +#define SN_issuing_distribution_point "issuingDistributionPoint" +#define LN_issuing_distribution_point "X509v3 Issuing Distrubution Point" +#define NID_issuing_distribution_point 770 +#define OBJ_issuing_distribution_point OBJ_id_ce,28L + +#define SN_certificate_issuer "certificateIssuer" +#define LN_certificate_issuer "X509v3 Certificate Issuer" +#define NID_certificate_issuer 771 +#define OBJ_certificate_issuer OBJ_id_ce,29L + +#define SN_name_constraints "nameConstraints" +#define LN_name_constraints "X509v3 Name Constraints" +#define NID_name_constraints 666 +#define OBJ_name_constraints OBJ_id_ce,30L + +#define SN_crl_distribution_points "crlDistributionPoints" +#define LN_crl_distribution_points "X509v3 CRL Distribution Points" +#define NID_crl_distribution_points 103 +#define OBJ_crl_distribution_points OBJ_id_ce,31L + +#define SN_certificate_policies "certificatePolicies" +#define LN_certificate_policies "X509v3 Certificate Policies" +#define NID_certificate_policies 89 +#define OBJ_certificate_policies OBJ_id_ce,32L + +#define SN_any_policy "anyPolicy" +#define LN_any_policy "X509v3 Any Policy" +#define NID_any_policy 746 +#define OBJ_any_policy OBJ_certificate_policies,0L + +#define SN_policy_mappings "policyMappings" +#define LN_policy_mappings "X509v3 Policy Mappings" +#define NID_policy_mappings 747 +#define OBJ_policy_mappings OBJ_id_ce,33L + +#define SN_authority_key_identifier "authorityKeyIdentifier" +#define LN_authority_key_identifier "X509v3 Authority Key Identifier" +#define NID_authority_key_identifier 90 +#define OBJ_authority_key_identifier OBJ_id_ce,35L + +#define SN_policy_constraints "policyConstraints" +#define LN_policy_constraints "X509v3 Policy Constraints" +#define NID_policy_constraints 401 +#define OBJ_policy_constraints OBJ_id_ce,36L + +#define SN_ext_key_usage "extendedKeyUsage" +#define LN_ext_key_usage "X509v3 Extended Key Usage" +#define NID_ext_key_usage 126 +#define OBJ_ext_key_usage OBJ_id_ce,37L + +#define SN_freshest_crl "freshestCRL" +#define LN_freshest_crl "X509v3 Freshest CRL" +#define NID_freshest_crl 857 +#define OBJ_freshest_crl OBJ_id_ce,46L + +#define SN_inhibit_any_policy "inhibitAnyPolicy" +#define LN_inhibit_any_policy "X509v3 Inhibit Any Policy" +#define NID_inhibit_any_policy 748 +#define OBJ_inhibit_any_policy OBJ_id_ce,54L + +#define SN_target_information "targetInformation" +#define LN_target_information "X509v3 AC Targeting" +#define NID_target_information 402 +#define OBJ_target_information OBJ_id_ce,55L + +#define SN_no_rev_avail "noRevAvail" +#define LN_no_rev_avail "X509v3 No Revocation Available" +#define NID_no_rev_avail 403 +#define OBJ_no_rev_avail OBJ_id_ce,56L + +#define SN_anyExtendedKeyUsage "anyExtendedKeyUsage" +#define LN_anyExtendedKeyUsage "Any Extended Key Usage" +#define NID_anyExtendedKeyUsage 910 +#define OBJ_anyExtendedKeyUsage OBJ_ext_key_usage,0L + +#define SN_netscape "Netscape" +#define LN_netscape "Netscape Communications Corp." +#define NID_netscape 57 +#define OBJ_netscape 2L,16L,840L,1L,113730L + +#define SN_netscape_cert_extension "nsCertExt" +#define LN_netscape_cert_extension "Netscape Certificate Extension" +#define NID_netscape_cert_extension 58 +#define OBJ_netscape_cert_extension OBJ_netscape,1L + +#define SN_netscape_data_type "nsDataType" +#define LN_netscape_data_type "Netscape Data Type" +#define NID_netscape_data_type 59 +#define OBJ_netscape_data_type OBJ_netscape,2L + +#define SN_netscape_cert_type "nsCertType" +#define LN_netscape_cert_type "Netscape Cert Type" +#define NID_netscape_cert_type 71 +#define OBJ_netscape_cert_type OBJ_netscape_cert_extension,1L + +#define SN_netscape_base_url "nsBaseUrl" +#define LN_netscape_base_url "Netscape Base Url" +#define NID_netscape_base_url 72 +#define OBJ_netscape_base_url OBJ_netscape_cert_extension,2L + +#define SN_netscape_revocation_url "nsRevocationUrl" +#define LN_netscape_revocation_url "Netscape Revocation Url" +#define NID_netscape_revocation_url 73 +#define OBJ_netscape_revocation_url OBJ_netscape_cert_extension,3L + +#define SN_netscape_ca_revocation_url "nsCaRevocationUrl" +#define LN_netscape_ca_revocation_url "Netscape CA Revocation Url" +#define NID_netscape_ca_revocation_url 74 +#define OBJ_netscape_ca_revocation_url OBJ_netscape_cert_extension,4L + +#define SN_netscape_renewal_url "nsRenewalUrl" +#define LN_netscape_renewal_url "Netscape Renewal Url" +#define NID_netscape_renewal_url 75 +#define OBJ_netscape_renewal_url OBJ_netscape_cert_extension,7L + +#define SN_netscape_ca_policy_url "nsCaPolicyUrl" +#define LN_netscape_ca_policy_url "Netscape CA Policy Url" +#define NID_netscape_ca_policy_url 76 +#define OBJ_netscape_ca_policy_url OBJ_netscape_cert_extension,8L + +#define SN_netscape_ssl_server_name "nsSslServerName" +#define LN_netscape_ssl_server_name "Netscape SSL Server Name" +#define NID_netscape_ssl_server_name 77 +#define OBJ_netscape_ssl_server_name OBJ_netscape_cert_extension,12L + +#define SN_netscape_comment "nsComment" +#define LN_netscape_comment "Netscape Comment" +#define NID_netscape_comment 78 +#define OBJ_netscape_comment OBJ_netscape_cert_extension,13L + +#define SN_netscape_cert_sequence "nsCertSequence" +#define LN_netscape_cert_sequence "Netscape Certificate Sequence" +#define NID_netscape_cert_sequence 79 +#define OBJ_netscape_cert_sequence OBJ_netscape_data_type,5L + +#define SN_ns_sgc "nsSGC" +#define LN_ns_sgc "Netscape Server Gated Crypto" +#define NID_ns_sgc 139 +#define OBJ_ns_sgc OBJ_netscape,4L,1L + +#define SN_org "ORG" +#define LN_org "org" +#define NID_org 379 +#define OBJ_org OBJ_iso,3L + +#define SN_dod "DOD" +#define LN_dod "dod" +#define NID_dod 380 +#define OBJ_dod OBJ_org,6L + +#define SN_iana "IANA" +#define LN_iana "iana" +#define NID_iana 381 +#define OBJ_iana OBJ_dod,1L + +#define OBJ_internet OBJ_iana + +#define SN_Directory "directory" +#define LN_Directory "Directory" +#define NID_Directory 382 +#define OBJ_Directory OBJ_internet,1L + +#define SN_Management "mgmt" +#define LN_Management "Management" +#define NID_Management 383 +#define OBJ_Management OBJ_internet,2L + +#define SN_Experimental "experimental" +#define LN_Experimental "Experimental" +#define NID_Experimental 384 +#define OBJ_Experimental OBJ_internet,3L + +#define SN_Private "private" +#define LN_Private "Private" +#define NID_Private 385 +#define OBJ_Private OBJ_internet,4L + +#define SN_Security "security" +#define LN_Security "Security" +#define NID_Security 386 +#define OBJ_Security OBJ_internet,5L + +#define SN_SNMPv2 "snmpv2" +#define LN_SNMPv2 "SNMPv2" +#define NID_SNMPv2 387 +#define OBJ_SNMPv2 OBJ_internet,6L + +#define LN_Mail "Mail" +#define NID_Mail 388 +#define OBJ_Mail OBJ_internet,7L + +#define SN_Enterprises "enterprises" +#define LN_Enterprises "Enterprises" +#define NID_Enterprises 389 +#define OBJ_Enterprises OBJ_Private,1L + +#define SN_dcObject "dcobject" +#define LN_dcObject "dcObject" +#define NID_dcObject 390 +#define OBJ_dcObject OBJ_Enterprises,1466L,344L + +#define SN_mime_mhs "mime-mhs" +#define LN_mime_mhs "MIME MHS" +#define NID_mime_mhs 504 +#define OBJ_mime_mhs OBJ_Mail,1L + +#define SN_mime_mhs_headings "mime-mhs-headings" +#define LN_mime_mhs_headings "mime-mhs-headings" +#define NID_mime_mhs_headings 505 +#define OBJ_mime_mhs_headings OBJ_mime_mhs,1L + +#define SN_mime_mhs_bodies "mime-mhs-bodies" +#define LN_mime_mhs_bodies "mime-mhs-bodies" +#define NID_mime_mhs_bodies 506 +#define OBJ_mime_mhs_bodies OBJ_mime_mhs,2L + +#define SN_id_hex_partial_message "id-hex-partial-message" +#define LN_id_hex_partial_message "id-hex-partial-message" +#define NID_id_hex_partial_message 507 +#define OBJ_id_hex_partial_message OBJ_mime_mhs_headings,1L + +#define SN_id_hex_multipart_message "id-hex-multipart-message" +#define LN_id_hex_multipart_message "id-hex-multipart-message" +#define NID_id_hex_multipart_message 508 +#define OBJ_id_hex_multipart_message OBJ_mime_mhs_headings,2L + +#define SN_rle_compression "RLE" +#define LN_rle_compression "run length compression" +#define NID_rle_compression 124 +#define OBJ_rle_compression 1L,1L,1L,1L,666L,1L + +#define SN_zlib_compression "ZLIB" +#define LN_zlib_compression "zlib compression" +#define NID_zlib_compression 125 +#define OBJ_zlib_compression OBJ_id_smime_alg,8L + +#define OBJ_csor 2L,16L,840L,1L,101L,3L + +#define OBJ_nistAlgorithms OBJ_csor,4L + +#define OBJ_aes OBJ_nistAlgorithms,1L + +#define SN_aes_128_ecb "AES-128-ECB" +#define LN_aes_128_ecb "aes-128-ecb" +#define NID_aes_128_ecb 418 +#define OBJ_aes_128_ecb OBJ_aes,1L + +#define SN_aes_128_cbc "AES-128-CBC" +#define LN_aes_128_cbc "aes-128-cbc" +#define NID_aes_128_cbc 419 +#define OBJ_aes_128_cbc OBJ_aes,2L + +#define SN_aes_128_ofb128 "AES-128-OFB" +#define LN_aes_128_ofb128 "aes-128-ofb" +#define NID_aes_128_ofb128 420 +#define OBJ_aes_128_ofb128 OBJ_aes,3L + +#define SN_aes_128_cfb128 "AES-128-CFB" +#define LN_aes_128_cfb128 "aes-128-cfb" +#define NID_aes_128_cfb128 421 +#define OBJ_aes_128_cfb128 OBJ_aes,4L + +#define SN_id_aes128_wrap "id-aes128-wrap" +#define NID_id_aes128_wrap 788 +#define OBJ_id_aes128_wrap OBJ_aes,5L + +#define SN_aes_128_gcm "id-aes128-GCM" +#define LN_aes_128_gcm "aes-128-gcm" +#define NID_aes_128_gcm 895 +#define OBJ_aes_128_gcm OBJ_aes,6L + +#define SN_aes_128_ccm "id-aes128-CCM" +#define LN_aes_128_ccm "aes-128-ccm" +#define NID_aes_128_ccm 896 +#define OBJ_aes_128_ccm OBJ_aes,7L + +#define SN_id_aes128_wrap_pad "id-aes128-wrap-pad" +#define NID_id_aes128_wrap_pad 897 +#define OBJ_id_aes128_wrap_pad OBJ_aes,8L + +#define SN_aes_192_ecb "AES-192-ECB" +#define LN_aes_192_ecb "aes-192-ecb" +#define NID_aes_192_ecb 422 +#define OBJ_aes_192_ecb OBJ_aes,21L + +#define SN_aes_192_cbc "AES-192-CBC" +#define LN_aes_192_cbc "aes-192-cbc" +#define NID_aes_192_cbc 423 +#define OBJ_aes_192_cbc OBJ_aes,22L + +#define SN_aes_192_ofb128 "AES-192-OFB" +#define LN_aes_192_ofb128 "aes-192-ofb" +#define NID_aes_192_ofb128 424 +#define OBJ_aes_192_ofb128 OBJ_aes,23L + +#define SN_aes_192_cfb128 "AES-192-CFB" +#define LN_aes_192_cfb128 "aes-192-cfb" +#define NID_aes_192_cfb128 425 +#define OBJ_aes_192_cfb128 OBJ_aes,24L + +#define SN_id_aes192_wrap "id-aes192-wrap" +#define NID_id_aes192_wrap 789 +#define OBJ_id_aes192_wrap OBJ_aes,25L + +#define SN_aes_192_gcm "id-aes192-GCM" +#define LN_aes_192_gcm "aes-192-gcm" +#define NID_aes_192_gcm 898 +#define OBJ_aes_192_gcm OBJ_aes,26L + +#define SN_aes_192_ccm "id-aes192-CCM" +#define LN_aes_192_ccm "aes-192-ccm" +#define NID_aes_192_ccm 899 +#define OBJ_aes_192_ccm OBJ_aes,27L + +#define SN_id_aes192_wrap_pad "id-aes192-wrap-pad" +#define NID_id_aes192_wrap_pad 900 +#define OBJ_id_aes192_wrap_pad OBJ_aes,28L + +#define SN_aes_256_ecb "AES-256-ECB" +#define LN_aes_256_ecb "aes-256-ecb" +#define NID_aes_256_ecb 426 +#define OBJ_aes_256_ecb OBJ_aes,41L + +#define SN_aes_256_cbc "AES-256-CBC" +#define LN_aes_256_cbc "aes-256-cbc" +#define NID_aes_256_cbc 427 +#define OBJ_aes_256_cbc OBJ_aes,42L + +#define SN_aes_256_ofb128 "AES-256-OFB" +#define LN_aes_256_ofb128 "aes-256-ofb" +#define NID_aes_256_ofb128 428 +#define OBJ_aes_256_ofb128 OBJ_aes,43L + +#define SN_aes_256_cfb128 "AES-256-CFB" +#define LN_aes_256_cfb128 "aes-256-cfb" +#define NID_aes_256_cfb128 429 +#define OBJ_aes_256_cfb128 OBJ_aes,44L + +#define SN_id_aes256_wrap "id-aes256-wrap" +#define NID_id_aes256_wrap 790 +#define OBJ_id_aes256_wrap OBJ_aes,45L + +#define SN_aes_256_gcm "id-aes256-GCM" +#define LN_aes_256_gcm "aes-256-gcm" +#define NID_aes_256_gcm 901 +#define OBJ_aes_256_gcm OBJ_aes,46L + +#define SN_aes_256_ccm "id-aes256-CCM" +#define LN_aes_256_ccm "aes-256-ccm" +#define NID_aes_256_ccm 902 +#define OBJ_aes_256_ccm OBJ_aes,47L + +#define SN_id_aes256_wrap_pad "id-aes256-wrap-pad" +#define NID_id_aes256_wrap_pad 903 +#define OBJ_id_aes256_wrap_pad OBJ_aes,48L + +#define SN_aes_128_cfb1 "AES-128-CFB1" +#define LN_aes_128_cfb1 "aes-128-cfb1" +#define NID_aes_128_cfb1 650 + +#define SN_aes_192_cfb1 "AES-192-CFB1" +#define LN_aes_192_cfb1 "aes-192-cfb1" +#define NID_aes_192_cfb1 651 + +#define SN_aes_256_cfb1 "AES-256-CFB1" +#define LN_aes_256_cfb1 "aes-256-cfb1" +#define NID_aes_256_cfb1 652 + +#define SN_aes_128_cfb8 "AES-128-CFB8" +#define LN_aes_128_cfb8 "aes-128-cfb8" +#define NID_aes_128_cfb8 653 + +#define SN_aes_192_cfb8 "AES-192-CFB8" +#define LN_aes_192_cfb8 "aes-192-cfb8" +#define NID_aes_192_cfb8 654 + +#define SN_aes_256_cfb8 "AES-256-CFB8" +#define LN_aes_256_cfb8 "aes-256-cfb8" +#define NID_aes_256_cfb8 655 + +#define SN_aes_128_ctr "AES-128-CTR" +#define LN_aes_128_ctr "aes-128-ctr" +#define NID_aes_128_ctr 904 + +#define SN_aes_192_ctr "AES-192-CTR" +#define LN_aes_192_ctr "aes-192-ctr" +#define NID_aes_192_ctr 905 + +#define SN_aes_256_ctr "AES-256-CTR" +#define LN_aes_256_ctr "aes-256-ctr" +#define NID_aes_256_ctr 906 + +#define SN_aes_128_xts "AES-128-XTS" +#define LN_aes_128_xts "aes-128-xts" +#define NID_aes_128_xts 913 + +#define SN_aes_256_xts "AES-256-XTS" +#define LN_aes_256_xts "aes-256-xts" +#define NID_aes_256_xts 914 + +#define SN_des_cfb1 "DES-CFB1" +#define LN_des_cfb1 "des-cfb1" +#define NID_des_cfb1 656 + +#define SN_des_cfb8 "DES-CFB8" +#define LN_des_cfb8 "des-cfb8" +#define NID_des_cfb8 657 + +#define SN_des_ede3_cfb1 "DES-EDE3-CFB1" +#define LN_des_ede3_cfb1 "des-ede3-cfb1" +#define NID_des_ede3_cfb1 658 + +#define SN_des_ede3_cfb8 "DES-EDE3-CFB8" +#define LN_des_ede3_cfb8 "des-ede3-cfb8" +#define NID_des_ede3_cfb8 659 + +#define OBJ_nist_hashalgs OBJ_nistAlgorithms,2L + +#define SN_sha256 "SHA256" +#define LN_sha256 "sha256" +#define NID_sha256 672 +#define OBJ_sha256 OBJ_nist_hashalgs,1L + +#define SN_sha384 "SHA384" +#define LN_sha384 "sha384" +#define NID_sha384 673 +#define OBJ_sha384 OBJ_nist_hashalgs,2L + +#define SN_sha512 "SHA512" +#define LN_sha512 "sha512" +#define NID_sha512 674 +#define OBJ_sha512 OBJ_nist_hashalgs,3L + +#define SN_sha224 "SHA224" +#define LN_sha224 "sha224" +#define NID_sha224 675 +#define OBJ_sha224 OBJ_nist_hashalgs,4L + +#define OBJ_dsa_with_sha2 OBJ_nistAlgorithms,3L + +#define SN_dsa_with_SHA224 "dsa_with_SHA224" +#define NID_dsa_with_SHA224 802 +#define OBJ_dsa_with_SHA224 OBJ_dsa_with_sha2,1L + +#define SN_dsa_with_SHA256 "dsa_with_SHA256" +#define NID_dsa_with_SHA256 803 +#define OBJ_dsa_with_SHA256 OBJ_dsa_with_sha2,2L + +#define SN_hold_instruction_code "holdInstructionCode" +#define LN_hold_instruction_code "Hold Instruction Code" +#define NID_hold_instruction_code 430 +#define OBJ_hold_instruction_code OBJ_id_ce,23L + +#define OBJ_holdInstruction OBJ_X9_57,2L + +#define SN_hold_instruction_none "holdInstructionNone" +#define LN_hold_instruction_none "Hold Instruction None" +#define NID_hold_instruction_none 431 +#define OBJ_hold_instruction_none OBJ_holdInstruction,1L + +#define SN_hold_instruction_call_issuer "holdInstructionCallIssuer" +#define LN_hold_instruction_call_issuer "Hold Instruction Call Issuer" +#define NID_hold_instruction_call_issuer 432 +#define OBJ_hold_instruction_call_issuer OBJ_holdInstruction,2L + +#define SN_hold_instruction_reject "holdInstructionReject" +#define LN_hold_instruction_reject "Hold Instruction Reject" +#define NID_hold_instruction_reject 433 +#define OBJ_hold_instruction_reject OBJ_holdInstruction,3L + +#define SN_data "data" +#define NID_data 434 +#define OBJ_data OBJ_itu_t,9L + +#define SN_pss "pss" +#define NID_pss 435 +#define OBJ_pss OBJ_data,2342L + +#define SN_ucl "ucl" +#define NID_ucl 436 +#define OBJ_ucl OBJ_pss,19200300L + +#define SN_pilot "pilot" +#define NID_pilot 437 +#define OBJ_pilot OBJ_ucl,100L + +#define LN_pilotAttributeType "pilotAttributeType" +#define NID_pilotAttributeType 438 +#define OBJ_pilotAttributeType OBJ_pilot,1L + +#define LN_pilotAttributeSyntax "pilotAttributeSyntax" +#define NID_pilotAttributeSyntax 439 +#define OBJ_pilotAttributeSyntax OBJ_pilot,3L + +#define LN_pilotObjectClass "pilotObjectClass" +#define NID_pilotObjectClass 440 +#define OBJ_pilotObjectClass OBJ_pilot,4L + +#define LN_pilotGroups "pilotGroups" +#define NID_pilotGroups 441 +#define OBJ_pilotGroups OBJ_pilot,10L + +#define LN_iA5StringSyntax "iA5StringSyntax" +#define NID_iA5StringSyntax 442 +#define OBJ_iA5StringSyntax OBJ_pilotAttributeSyntax,4L + +#define LN_caseIgnoreIA5StringSyntax "caseIgnoreIA5StringSyntax" +#define NID_caseIgnoreIA5StringSyntax 443 +#define OBJ_caseIgnoreIA5StringSyntax OBJ_pilotAttributeSyntax,5L + +#define LN_pilotObject "pilotObject" +#define NID_pilotObject 444 +#define OBJ_pilotObject OBJ_pilotObjectClass,3L + +#define LN_pilotPerson "pilotPerson" +#define NID_pilotPerson 445 +#define OBJ_pilotPerson OBJ_pilotObjectClass,4L + +#define SN_account "account" +#define NID_account 446 +#define OBJ_account OBJ_pilotObjectClass,5L + +#define SN_document "document" +#define NID_document 447 +#define OBJ_document OBJ_pilotObjectClass,6L + +#define SN_room "room" +#define NID_room 448 +#define OBJ_room OBJ_pilotObjectClass,7L + +#define LN_documentSeries "documentSeries" +#define NID_documentSeries 449 +#define OBJ_documentSeries OBJ_pilotObjectClass,9L + +#define SN_Domain "domain" +#define LN_Domain "Domain" +#define NID_Domain 392 +#define OBJ_Domain OBJ_pilotObjectClass,13L + +#define LN_rFC822localPart "rFC822localPart" +#define NID_rFC822localPart 450 +#define OBJ_rFC822localPart OBJ_pilotObjectClass,14L + +#define LN_dNSDomain "dNSDomain" +#define NID_dNSDomain 451 +#define OBJ_dNSDomain OBJ_pilotObjectClass,15L + +#define LN_domainRelatedObject "domainRelatedObject" +#define NID_domainRelatedObject 452 +#define OBJ_domainRelatedObject OBJ_pilotObjectClass,17L + +#define LN_friendlyCountry "friendlyCountry" +#define NID_friendlyCountry 453 +#define OBJ_friendlyCountry OBJ_pilotObjectClass,18L + +#define LN_simpleSecurityObject "simpleSecurityObject" +#define NID_simpleSecurityObject 454 +#define OBJ_simpleSecurityObject OBJ_pilotObjectClass,19L + +#define LN_pilotOrganization "pilotOrganization" +#define NID_pilotOrganization 455 +#define OBJ_pilotOrganization OBJ_pilotObjectClass,20L + +#define LN_pilotDSA "pilotDSA" +#define NID_pilotDSA 456 +#define OBJ_pilotDSA OBJ_pilotObjectClass,21L + +#define LN_qualityLabelledData "qualityLabelledData" +#define NID_qualityLabelledData 457 +#define OBJ_qualityLabelledData OBJ_pilotObjectClass,22L + +#define SN_userId "UID" +#define LN_userId "userId" +#define NID_userId 458 +#define OBJ_userId OBJ_pilotAttributeType,1L + +#define LN_textEncodedORAddress "textEncodedORAddress" +#define NID_textEncodedORAddress 459 +#define OBJ_textEncodedORAddress OBJ_pilotAttributeType,2L + +#define SN_rfc822Mailbox "mail" +#define LN_rfc822Mailbox "rfc822Mailbox" +#define NID_rfc822Mailbox 460 +#define OBJ_rfc822Mailbox OBJ_pilotAttributeType,3L + +#define SN_info "info" +#define NID_info 461 +#define OBJ_info OBJ_pilotAttributeType,4L + +#define LN_favouriteDrink "favouriteDrink" +#define NID_favouriteDrink 462 +#define OBJ_favouriteDrink OBJ_pilotAttributeType,5L + +#define LN_roomNumber "roomNumber" +#define NID_roomNumber 463 +#define OBJ_roomNumber OBJ_pilotAttributeType,6L + +#define SN_photo "photo" +#define NID_photo 464 +#define OBJ_photo OBJ_pilotAttributeType,7L + +#define LN_userClass "userClass" +#define NID_userClass 465 +#define OBJ_userClass OBJ_pilotAttributeType,8L + +#define SN_host "host" +#define NID_host 466 +#define OBJ_host OBJ_pilotAttributeType,9L + +#define SN_manager "manager" +#define NID_manager 467 +#define OBJ_manager OBJ_pilotAttributeType,10L + +#define LN_documentIdentifier "documentIdentifier" +#define NID_documentIdentifier 468 +#define OBJ_documentIdentifier OBJ_pilotAttributeType,11L + +#define LN_documentTitle "documentTitle" +#define NID_documentTitle 469 +#define OBJ_documentTitle OBJ_pilotAttributeType,12L + +#define LN_documentVersion "documentVersion" +#define NID_documentVersion 470 +#define OBJ_documentVersion OBJ_pilotAttributeType,13L + +#define LN_documentAuthor "documentAuthor" +#define NID_documentAuthor 471 +#define OBJ_documentAuthor OBJ_pilotAttributeType,14L + +#define LN_documentLocation "documentLocation" +#define NID_documentLocation 472 +#define OBJ_documentLocation OBJ_pilotAttributeType,15L + +#define LN_homeTelephoneNumber "homeTelephoneNumber" +#define NID_homeTelephoneNumber 473 +#define OBJ_homeTelephoneNumber OBJ_pilotAttributeType,20L + +#define SN_secretary "secretary" +#define NID_secretary 474 +#define OBJ_secretary OBJ_pilotAttributeType,21L + +#define LN_otherMailbox "otherMailbox" +#define NID_otherMailbox 475 +#define OBJ_otherMailbox OBJ_pilotAttributeType,22L + +#define LN_lastModifiedTime "lastModifiedTime" +#define NID_lastModifiedTime 476 +#define OBJ_lastModifiedTime OBJ_pilotAttributeType,23L + +#define LN_lastModifiedBy "lastModifiedBy" +#define NID_lastModifiedBy 477 +#define OBJ_lastModifiedBy OBJ_pilotAttributeType,24L + +#define SN_domainComponent "DC" +#define LN_domainComponent "domainComponent" +#define NID_domainComponent 391 +#define OBJ_domainComponent OBJ_pilotAttributeType,25L + +#define LN_aRecord "aRecord" +#define NID_aRecord 478 +#define OBJ_aRecord OBJ_pilotAttributeType,26L + +#define LN_pilotAttributeType27 "pilotAttributeType27" +#define NID_pilotAttributeType27 479 +#define OBJ_pilotAttributeType27 OBJ_pilotAttributeType,27L + +#define LN_mXRecord "mXRecord" +#define NID_mXRecord 480 +#define OBJ_mXRecord OBJ_pilotAttributeType,28L + +#define LN_nSRecord "nSRecord" +#define NID_nSRecord 481 +#define OBJ_nSRecord OBJ_pilotAttributeType,29L + +#define LN_sOARecord "sOARecord" +#define NID_sOARecord 482 +#define OBJ_sOARecord OBJ_pilotAttributeType,30L + +#define LN_cNAMERecord "cNAMERecord" +#define NID_cNAMERecord 483 +#define OBJ_cNAMERecord OBJ_pilotAttributeType,31L + +#define LN_associatedDomain "associatedDomain" +#define NID_associatedDomain 484 +#define OBJ_associatedDomain OBJ_pilotAttributeType,37L + +#define LN_associatedName "associatedName" +#define NID_associatedName 485 +#define OBJ_associatedName OBJ_pilotAttributeType,38L + +#define LN_homePostalAddress "homePostalAddress" +#define NID_homePostalAddress 486 +#define OBJ_homePostalAddress OBJ_pilotAttributeType,39L + +#define LN_personalTitle "personalTitle" +#define NID_personalTitle 487 +#define OBJ_personalTitle OBJ_pilotAttributeType,40L + +#define LN_mobileTelephoneNumber "mobileTelephoneNumber" +#define NID_mobileTelephoneNumber 488 +#define OBJ_mobileTelephoneNumber OBJ_pilotAttributeType,41L + +#define LN_pagerTelephoneNumber "pagerTelephoneNumber" +#define NID_pagerTelephoneNumber 489 +#define OBJ_pagerTelephoneNumber OBJ_pilotAttributeType,42L + +#define LN_friendlyCountryName "friendlyCountryName" +#define NID_friendlyCountryName 490 +#define OBJ_friendlyCountryName OBJ_pilotAttributeType,43L + +#define LN_organizationalStatus "organizationalStatus" +#define NID_organizationalStatus 491 +#define OBJ_organizationalStatus OBJ_pilotAttributeType,45L + +#define LN_janetMailbox "janetMailbox" +#define NID_janetMailbox 492 +#define OBJ_janetMailbox OBJ_pilotAttributeType,46L + +#define LN_mailPreferenceOption "mailPreferenceOption" +#define NID_mailPreferenceOption 493 +#define OBJ_mailPreferenceOption OBJ_pilotAttributeType,47L + +#define LN_buildingName "buildingName" +#define NID_buildingName 494 +#define OBJ_buildingName OBJ_pilotAttributeType,48L + +#define LN_dSAQuality "dSAQuality" +#define NID_dSAQuality 495 +#define OBJ_dSAQuality OBJ_pilotAttributeType,49L + +#define LN_singleLevelQuality "singleLevelQuality" +#define NID_singleLevelQuality 496 +#define OBJ_singleLevelQuality OBJ_pilotAttributeType,50L + +#define LN_subtreeMinimumQuality "subtreeMinimumQuality" +#define NID_subtreeMinimumQuality 497 +#define OBJ_subtreeMinimumQuality OBJ_pilotAttributeType,51L + +#define LN_subtreeMaximumQuality "subtreeMaximumQuality" +#define NID_subtreeMaximumQuality 498 +#define OBJ_subtreeMaximumQuality OBJ_pilotAttributeType,52L + +#define LN_personalSignature "personalSignature" +#define NID_personalSignature 499 +#define OBJ_personalSignature OBJ_pilotAttributeType,53L + +#define LN_dITRedirect "dITRedirect" +#define NID_dITRedirect 500 +#define OBJ_dITRedirect OBJ_pilotAttributeType,54L + +#define SN_audio "audio" +#define NID_audio 501 +#define OBJ_audio OBJ_pilotAttributeType,55L + +#define LN_documentPublisher "documentPublisher" +#define NID_documentPublisher 502 +#define OBJ_documentPublisher OBJ_pilotAttributeType,56L + +#define SN_id_set "id-set" +#define LN_id_set "Secure Electronic Transactions" +#define NID_id_set 512 +#define OBJ_id_set OBJ_international_organizations,42L + +#define SN_set_ctype "set-ctype" +#define LN_set_ctype "content types" +#define NID_set_ctype 513 +#define OBJ_set_ctype OBJ_id_set,0L + +#define SN_set_msgExt "set-msgExt" +#define LN_set_msgExt "message extensions" +#define NID_set_msgExt 514 +#define OBJ_set_msgExt OBJ_id_set,1L + +#define SN_set_attr "set-attr" +#define NID_set_attr 515 +#define OBJ_set_attr OBJ_id_set,3L + +#define SN_set_policy "set-policy" +#define NID_set_policy 516 +#define OBJ_set_policy OBJ_id_set,5L + +#define SN_set_certExt "set-certExt" +#define LN_set_certExt "certificate extensions" +#define NID_set_certExt 517 +#define OBJ_set_certExt OBJ_id_set,7L + +#define SN_set_brand "set-brand" +#define NID_set_brand 518 +#define OBJ_set_brand OBJ_id_set,8L + +#define SN_setct_PANData "setct-PANData" +#define NID_setct_PANData 519 +#define OBJ_setct_PANData OBJ_set_ctype,0L + +#define SN_setct_PANToken "setct-PANToken" +#define NID_setct_PANToken 520 +#define OBJ_setct_PANToken OBJ_set_ctype,1L + +#define SN_setct_PANOnly "setct-PANOnly" +#define NID_setct_PANOnly 521 +#define OBJ_setct_PANOnly OBJ_set_ctype,2L + +#define SN_setct_OIData "setct-OIData" +#define NID_setct_OIData 522 +#define OBJ_setct_OIData OBJ_set_ctype,3L + +#define SN_setct_PI "setct-PI" +#define NID_setct_PI 523 +#define OBJ_setct_PI OBJ_set_ctype,4L + +#define SN_setct_PIData "setct-PIData" +#define NID_setct_PIData 524 +#define OBJ_setct_PIData OBJ_set_ctype,5L + +#define SN_setct_PIDataUnsigned "setct-PIDataUnsigned" +#define NID_setct_PIDataUnsigned 525 +#define OBJ_setct_PIDataUnsigned OBJ_set_ctype,6L + +#define SN_setct_HODInput "setct-HODInput" +#define NID_setct_HODInput 526 +#define OBJ_setct_HODInput OBJ_set_ctype,7L + +#define SN_setct_AuthResBaggage "setct-AuthResBaggage" +#define NID_setct_AuthResBaggage 527 +#define OBJ_setct_AuthResBaggage OBJ_set_ctype,8L + +#define SN_setct_AuthRevReqBaggage "setct-AuthRevReqBaggage" +#define NID_setct_AuthRevReqBaggage 528 +#define OBJ_setct_AuthRevReqBaggage OBJ_set_ctype,9L + +#define SN_setct_AuthRevResBaggage "setct-AuthRevResBaggage" +#define NID_setct_AuthRevResBaggage 529 +#define OBJ_setct_AuthRevResBaggage OBJ_set_ctype,10L + +#define SN_setct_CapTokenSeq "setct-CapTokenSeq" +#define NID_setct_CapTokenSeq 530 +#define OBJ_setct_CapTokenSeq OBJ_set_ctype,11L + +#define SN_setct_PInitResData "setct-PInitResData" +#define NID_setct_PInitResData 531 +#define OBJ_setct_PInitResData OBJ_set_ctype,12L + +#define SN_setct_PI_TBS "setct-PI-TBS" +#define NID_setct_PI_TBS 532 +#define OBJ_setct_PI_TBS OBJ_set_ctype,13L + +#define SN_setct_PResData "setct-PResData" +#define NID_setct_PResData 533 +#define OBJ_setct_PResData OBJ_set_ctype,14L + +#define SN_setct_AuthReqTBS "setct-AuthReqTBS" +#define NID_setct_AuthReqTBS 534 +#define OBJ_setct_AuthReqTBS OBJ_set_ctype,16L + +#define SN_setct_AuthResTBS "setct-AuthResTBS" +#define NID_setct_AuthResTBS 535 +#define OBJ_setct_AuthResTBS OBJ_set_ctype,17L + +#define SN_setct_AuthResTBSX "setct-AuthResTBSX" +#define NID_setct_AuthResTBSX 536 +#define OBJ_setct_AuthResTBSX OBJ_set_ctype,18L + +#define SN_setct_AuthTokenTBS "setct-AuthTokenTBS" +#define NID_setct_AuthTokenTBS 537 +#define OBJ_setct_AuthTokenTBS OBJ_set_ctype,19L + +#define SN_setct_CapTokenData "setct-CapTokenData" +#define NID_setct_CapTokenData 538 +#define OBJ_setct_CapTokenData OBJ_set_ctype,20L + +#define SN_setct_CapTokenTBS "setct-CapTokenTBS" +#define NID_setct_CapTokenTBS 539 +#define OBJ_setct_CapTokenTBS OBJ_set_ctype,21L + +#define SN_setct_AcqCardCodeMsg "setct-AcqCardCodeMsg" +#define NID_setct_AcqCardCodeMsg 540 +#define OBJ_setct_AcqCardCodeMsg OBJ_set_ctype,22L + +#define SN_setct_AuthRevReqTBS "setct-AuthRevReqTBS" +#define NID_setct_AuthRevReqTBS 541 +#define OBJ_setct_AuthRevReqTBS OBJ_set_ctype,23L + +#define SN_setct_AuthRevResData "setct-AuthRevResData" +#define NID_setct_AuthRevResData 542 +#define OBJ_setct_AuthRevResData OBJ_set_ctype,24L + +#define SN_setct_AuthRevResTBS "setct-AuthRevResTBS" +#define NID_setct_AuthRevResTBS 543 +#define OBJ_setct_AuthRevResTBS OBJ_set_ctype,25L + +#define SN_setct_CapReqTBS "setct-CapReqTBS" +#define NID_setct_CapReqTBS 544 +#define OBJ_setct_CapReqTBS OBJ_set_ctype,26L + +#define SN_setct_CapReqTBSX "setct-CapReqTBSX" +#define NID_setct_CapReqTBSX 545 +#define OBJ_setct_CapReqTBSX OBJ_set_ctype,27L + +#define SN_setct_CapResData "setct-CapResData" +#define NID_setct_CapResData 546 +#define OBJ_setct_CapResData OBJ_set_ctype,28L + +#define SN_setct_CapRevReqTBS "setct-CapRevReqTBS" +#define NID_setct_CapRevReqTBS 547 +#define OBJ_setct_CapRevReqTBS OBJ_set_ctype,29L + +#define SN_setct_CapRevReqTBSX "setct-CapRevReqTBSX" +#define NID_setct_CapRevReqTBSX 548 +#define OBJ_setct_CapRevReqTBSX OBJ_set_ctype,30L + +#define SN_setct_CapRevResData "setct-CapRevResData" +#define NID_setct_CapRevResData 549 +#define OBJ_setct_CapRevResData OBJ_set_ctype,31L + +#define SN_setct_CredReqTBS "setct-CredReqTBS" +#define NID_setct_CredReqTBS 550 +#define OBJ_setct_CredReqTBS OBJ_set_ctype,32L + +#define SN_setct_CredReqTBSX "setct-CredReqTBSX" +#define NID_setct_CredReqTBSX 551 +#define OBJ_setct_CredReqTBSX OBJ_set_ctype,33L + +#define SN_setct_CredResData "setct-CredResData" +#define NID_setct_CredResData 552 +#define OBJ_setct_CredResData OBJ_set_ctype,34L + +#define SN_setct_CredRevReqTBS "setct-CredRevReqTBS" +#define NID_setct_CredRevReqTBS 553 +#define OBJ_setct_CredRevReqTBS OBJ_set_ctype,35L + +#define SN_setct_CredRevReqTBSX "setct-CredRevReqTBSX" +#define NID_setct_CredRevReqTBSX 554 +#define OBJ_setct_CredRevReqTBSX OBJ_set_ctype,36L + +#define SN_setct_CredRevResData "setct-CredRevResData" +#define NID_setct_CredRevResData 555 +#define OBJ_setct_CredRevResData OBJ_set_ctype,37L + +#define SN_setct_PCertReqData "setct-PCertReqData" +#define NID_setct_PCertReqData 556 +#define OBJ_setct_PCertReqData OBJ_set_ctype,38L + +#define SN_setct_PCertResTBS "setct-PCertResTBS" +#define NID_setct_PCertResTBS 557 +#define OBJ_setct_PCertResTBS OBJ_set_ctype,39L + +#define SN_setct_BatchAdminReqData "setct-BatchAdminReqData" +#define NID_setct_BatchAdminReqData 558 +#define OBJ_setct_BatchAdminReqData OBJ_set_ctype,40L + +#define SN_setct_BatchAdminResData "setct-BatchAdminResData" +#define NID_setct_BatchAdminResData 559 +#define OBJ_setct_BatchAdminResData OBJ_set_ctype,41L + +#define SN_setct_CardCInitResTBS "setct-CardCInitResTBS" +#define NID_setct_CardCInitResTBS 560 +#define OBJ_setct_CardCInitResTBS OBJ_set_ctype,42L + +#define SN_setct_MeAqCInitResTBS "setct-MeAqCInitResTBS" +#define NID_setct_MeAqCInitResTBS 561 +#define OBJ_setct_MeAqCInitResTBS OBJ_set_ctype,43L + +#define SN_setct_RegFormResTBS "setct-RegFormResTBS" +#define NID_setct_RegFormResTBS 562 +#define OBJ_setct_RegFormResTBS OBJ_set_ctype,44L + +#define SN_setct_CertReqData "setct-CertReqData" +#define NID_setct_CertReqData 563 +#define OBJ_setct_CertReqData OBJ_set_ctype,45L + +#define SN_setct_CertReqTBS "setct-CertReqTBS" +#define NID_setct_CertReqTBS 564 +#define OBJ_setct_CertReqTBS OBJ_set_ctype,46L + +#define SN_setct_CertResData "setct-CertResData" +#define NID_setct_CertResData 565 +#define OBJ_setct_CertResData OBJ_set_ctype,47L + +#define SN_setct_CertInqReqTBS "setct-CertInqReqTBS" +#define NID_setct_CertInqReqTBS 566 +#define OBJ_setct_CertInqReqTBS OBJ_set_ctype,48L + +#define SN_setct_ErrorTBS "setct-ErrorTBS" +#define NID_setct_ErrorTBS 567 +#define OBJ_setct_ErrorTBS OBJ_set_ctype,49L + +#define SN_setct_PIDualSignedTBE "setct-PIDualSignedTBE" +#define NID_setct_PIDualSignedTBE 568 +#define OBJ_setct_PIDualSignedTBE OBJ_set_ctype,50L + +#define SN_setct_PIUnsignedTBE "setct-PIUnsignedTBE" +#define NID_setct_PIUnsignedTBE 569 +#define OBJ_setct_PIUnsignedTBE OBJ_set_ctype,51L + +#define SN_setct_AuthReqTBE "setct-AuthReqTBE" +#define NID_setct_AuthReqTBE 570 +#define OBJ_setct_AuthReqTBE OBJ_set_ctype,52L + +#define SN_setct_AuthResTBE "setct-AuthResTBE" +#define NID_setct_AuthResTBE 571 +#define OBJ_setct_AuthResTBE OBJ_set_ctype,53L + +#define SN_setct_AuthResTBEX "setct-AuthResTBEX" +#define NID_setct_AuthResTBEX 572 +#define OBJ_setct_AuthResTBEX OBJ_set_ctype,54L + +#define SN_setct_AuthTokenTBE "setct-AuthTokenTBE" +#define NID_setct_AuthTokenTBE 573 +#define OBJ_setct_AuthTokenTBE OBJ_set_ctype,55L + +#define SN_setct_CapTokenTBE "setct-CapTokenTBE" +#define NID_setct_CapTokenTBE 574 +#define OBJ_setct_CapTokenTBE OBJ_set_ctype,56L + +#define SN_setct_CapTokenTBEX "setct-CapTokenTBEX" +#define NID_setct_CapTokenTBEX 575 +#define OBJ_setct_CapTokenTBEX OBJ_set_ctype,57L + +#define SN_setct_AcqCardCodeMsgTBE "setct-AcqCardCodeMsgTBE" +#define NID_setct_AcqCardCodeMsgTBE 576 +#define OBJ_setct_AcqCardCodeMsgTBE OBJ_set_ctype,58L + +#define SN_setct_AuthRevReqTBE "setct-AuthRevReqTBE" +#define NID_setct_AuthRevReqTBE 577 +#define OBJ_setct_AuthRevReqTBE OBJ_set_ctype,59L + +#define SN_setct_AuthRevResTBE "setct-AuthRevResTBE" +#define NID_setct_AuthRevResTBE 578 +#define OBJ_setct_AuthRevResTBE OBJ_set_ctype,60L + +#define SN_setct_AuthRevResTBEB "setct-AuthRevResTBEB" +#define NID_setct_AuthRevResTBEB 579 +#define OBJ_setct_AuthRevResTBEB OBJ_set_ctype,61L + +#define SN_setct_CapReqTBE "setct-CapReqTBE" +#define NID_setct_CapReqTBE 580 +#define OBJ_setct_CapReqTBE OBJ_set_ctype,62L + +#define SN_setct_CapReqTBEX "setct-CapReqTBEX" +#define NID_setct_CapReqTBEX 581 +#define OBJ_setct_CapReqTBEX OBJ_set_ctype,63L + +#define SN_setct_CapResTBE "setct-CapResTBE" +#define NID_setct_CapResTBE 582 +#define OBJ_setct_CapResTBE OBJ_set_ctype,64L + +#define SN_setct_CapRevReqTBE "setct-CapRevReqTBE" +#define NID_setct_CapRevReqTBE 583 +#define OBJ_setct_CapRevReqTBE OBJ_set_ctype,65L + +#define SN_setct_CapRevReqTBEX "setct-CapRevReqTBEX" +#define NID_setct_CapRevReqTBEX 584 +#define OBJ_setct_CapRevReqTBEX OBJ_set_ctype,66L + +#define SN_setct_CapRevResTBE "setct-CapRevResTBE" +#define NID_setct_CapRevResTBE 585 +#define OBJ_setct_CapRevResTBE OBJ_set_ctype,67L + +#define SN_setct_CredReqTBE "setct-CredReqTBE" +#define NID_setct_CredReqTBE 586 +#define OBJ_setct_CredReqTBE OBJ_set_ctype,68L + +#define SN_setct_CredReqTBEX "setct-CredReqTBEX" +#define NID_setct_CredReqTBEX 587 +#define OBJ_setct_CredReqTBEX OBJ_set_ctype,69L + +#define SN_setct_CredResTBE "setct-CredResTBE" +#define NID_setct_CredResTBE 588 +#define OBJ_setct_CredResTBE OBJ_set_ctype,70L + +#define SN_setct_CredRevReqTBE "setct-CredRevReqTBE" +#define NID_setct_CredRevReqTBE 589 +#define OBJ_setct_CredRevReqTBE OBJ_set_ctype,71L + +#define SN_setct_CredRevReqTBEX "setct-CredRevReqTBEX" +#define NID_setct_CredRevReqTBEX 590 +#define OBJ_setct_CredRevReqTBEX OBJ_set_ctype,72L + +#define SN_setct_CredRevResTBE "setct-CredRevResTBE" +#define NID_setct_CredRevResTBE 591 +#define OBJ_setct_CredRevResTBE OBJ_set_ctype,73L + +#define SN_setct_BatchAdminReqTBE "setct-BatchAdminReqTBE" +#define NID_setct_BatchAdminReqTBE 592 +#define OBJ_setct_BatchAdminReqTBE OBJ_set_ctype,74L + +#define SN_setct_BatchAdminResTBE "setct-BatchAdminResTBE" +#define NID_setct_BatchAdminResTBE 593 +#define OBJ_setct_BatchAdminResTBE OBJ_set_ctype,75L + +#define SN_setct_RegFormReqTBE "setct-RegFormReqTBE" +#define NID_setct_RegFormReqTBE 594 +#define OBJ_setct_RegFormReqTBE OBJ_set_ctype,76L + +#define SN_setct_CertReqTBE "setct-CertReqTBE" +#define NID_setct_CertReqTBE 595 +#define OBJ_setct_CertReqTBE OBJ_set_ctype,77L + +#define SN_setct_CertReqTBEX "setct-CertReqTBEX" +#define NID_setct_CertReqTBEX 596 +#define OBJ_setct_CertReqTBEX OBJ_set_ctype,78L + +#define SN_setct_CertResTBE "setct-CertResTBE" +#define NID_setct_CertResTBE 597 +#define OBJ_setct_CertResTBE OBJ_set_ctype,79L + +#define SN_setct_CRLNotificationTBS "setct-CRLNotificationTBS" +#define NID_setct_CRLNotificationTBS 598 +#define OBJ_setct_CRLNotificationTBS OBJ_set_ctype,80L + +#define SN_setct_CRLNotificationResTBS "setct-CRLNotificationResTBS" +#define NID_setct_CRLNotificationResTBS 599 +#define OBJ_setct_CRLNotificationResTBS OBJ_set_ctype,81L + +#define SN_setct_BCIDistributionTBS "setct-BCIDistributionTBS" +#define NID_setct_BCIDistributionTBS 600 +#define OBJ_setct_BCIDistributionTBS OBJ_set_ctype,82L + +#define SN_setext_genCrypt "setext-genCrypt" +#define LN_setext_genCrypt "generic cryptogram" +#define NID_setext_genCrypt 601 +#define OBJ_setext_genCrypt OBJ_set_msgExt,1L + +#define SN_setext_miAuth "setext-miAuth" +#define LN_setext_miAuth "merchant initiated auth" +#define NID_setext_miAuth 602 +#define OBJ_setext_miAuth OBJ_set_msgExt,3L + +#define SN_setext_pinSecure "setext-pinSecure" +#define NID_setext_pinSecure 603 +#define OBJ_setext_pinSecure OBJ_set_msgExt,4L + +#define SN_setext_pinAny "setext-pinAny" +#define NID_setext_pinAny 604 +#define OBJ_setext_pinAny OBJ_set_msgExt,5L + +#define SN_setext_track2 "setext-track2" +#define NID_setext_track2 605 +#define OBJ_setext_track2 OBJ_set_msgExt,7L + +#define SN_setext_cv "setext-cv" +#define LN_setext_cv "additional verification" +#define NID_setext_cv 606 +#define OBJ_setext_cv OBJ_set_msgExt,8L + +#define SN_set_policy_root "set-policy-root" +#define NID_set_policy_root 607 +#define OBJ_set_policy_root OBJ_set_policy,0L + +#define SN_setCext_hashedRoot "setCext-hashedRoot" +#define NID_setCext_hashedRoot 608 +#define OBJ_setCext_hashedRoot OBJ_set_certExt,0L + +#define SN_setCext_certType "setCext-certType" +#define NID_setCext_certType 609 +#define OBJ_setCext_certType OBJ_set_certExt,1L + +#define SN_setCext_merchData "setCext-merchData" +#define NID_setCext_merchData 610 +#define OBJ_setCext_merchData OBJ_set_certExt,2L + +#define SN_setCext_cCertRequired "setCext-cCertRequired" +#define NID_setCext_cCertRequired 611 +#define OBJ_setCext_cCertRequired OBJ_set_certExt,3L + +#define SN_setCext_tunneling "setCext-tunneling" +#define NID_setCext_tunneling 612 +#define OBJ_setCext_tunneling OBJ_set_certExt,4L + +#define SN_setCext_setExt "setCext-setExt" +#define NID_setCext_setExt 613 +#define OBJ_setCext_setExt OBJ_set_certExt,5L + +#define SN_setCext_setQualf "setCext-setQualf" +#define NID_setCext_setQualf 614 +#define OBJ_setCext_setQualf OBJ_set_certExt,6L + +#define SN_setCext_PGWYcapabilities "setCext-PGWYcapabilities" +#define NID_setCext_PGWYcapabilities 615 +#define OBJ_setCext_PGWYcapabilities OBJ_set_certExt,7L + +#define SN_setCext_TokenIdentifier "setCext-TokenIdentifier" +#define NID_setCext_TokenIdentifier 616 +#define OBJ_setCext_TokenIdentifier OBJ_set_certExt,8L + +#define SN_setCext_Track2Data "setCext-Track2Data" +#define NID_setCext_Track2Data 617 +#define OBJ_setCext_Track2Data OBJ_set_certExt,9L + +#define SN_setCext_TokenType "setCext-TokenType" +#define NID_setCext_TokenType 618 +#define OBJ_setCext_TokenType OBJ_set_certExt,10L + +#define SN_setCext_IssuerCapabilities "setCext-IssuerCapabilities" +#define NID_setCext_IssuerCapabilities 619 +#define OBJ_setCext_IssuerCapabilities OBJ_set_certExt,11L + +#define SN_setAttr_Cert "setAttr-Cert" +#define NID_setAttr_Cert 620 +#define OBJ_setAttr_Cert OBJ_set_attr,0L + +#define SN_setAttr_PGWYcap "setAttr-PGWYcap" +#define LN_setAttr_PGWYcap "payment gateway capabilities" +#define NID_setAttr_PGWYcap 621 +#define OBJ_setAttr_PGWYcap OBJ_set_attr,1L + +#define SN_setAttr_TokenType "setAttr-TokenType" +#define NID_setAttr_TokenType 622 +#define OBJ_setAttr_TokenType OBJ_set_attr,2L + +#define SN_setAttr_IssCap "setAttr-IssCap" +#define LN_setAttr_IssCap "issuer capabilities" +#define NID_setAttr_IssCap 623 +#define OBJ_setAttr_IssCap OBJ_set_attr,3L + +#define SN_set_rootKeyThumb "set-rootKeyThumb" +#define NID_set_rootKeyThumb 624 +#define OBJ_set_rootKeyThumb OBJ_setAttr_Cert,0L + +#define SN_set_addPolicy "set-addPolicy" +#define NID_set_addPolicy 625 +#define OBJ_set_addPolicy OBJ_setAttr_Cert,1L + +#define SN_setAttr_Token_EMV "setAttr-Token-EMV" +#define NID_setAttr_Token_EMV 626 +#define OBJ_setAttr_Token_EMV OBJ_setAttr_TokenType,1L + +#define SN_setAttr_Token_B0Prime "setAttr-Token-B0Prime" +#define NID_setAttr_Token_B0Prime 627 +#define OBJ_setAttr_Token_B0Prime OBJ_setAttr_TokenType,2L + +#define SN_setAttr_IssCap_CVM "setAttr-IssCap-CVM" +#define NID_setAttr_IssCap_CVM 628 +#define OBJ_setAttr_IssCap_CVM OBJ_setAttr_IssCap,3L + +#define SN_setAttr_IssCap_T2 "setAttr-IssCap-T2" +#define NID_setAttr_IssCap_T2 629 +#define OBJ_setAttr_IssCap_T2 OBJ_setAttr_IssCap,4L + +#define SN_setAttr_IssCap_Sig "setAttr-IssCap-Sig" +#define NID_setAttr_IssCap_Sig 630 +#define OBJ_setAttr_IssCap_Sig OBJ_setAttr_IssCap,5L + +#define SN_setAttr_GenCryptgrm "setAttr-GenCryptgrm" +#define LN_setAttr_GenCryptgrm "generate cryptogram" +#define NID_setAttr_GenCryptgrm 631 +#define OBJ_setAttr_GenCryptgrm OBJ_setAttr_IssCap_CVM,1L + +#define SN_setAttr_T2Enc "setAttr-T2Enc" +#define LN_setAttr_T2Enc "encrypted track 2" +#define NID_setAttr_T2Enc 632 +#define OBJ_setAttr_T2Enc OBJ_setAttr_IssCap_T2,1L + +#define SN_setAttr_T2cleartxt "setAttr-T2cleartxt" +#define LN_setAttr_T2cleartxt "cleartext track 2" +#define NID_setAttr_T2cleartxt 633 +#define OBJ_setAttr_T2cleartxt OBJ_setAttr_IssCap_T2,2L + +#define SN_setAttr_TokICCsig "setAttr-TokICCsig" +#define LN_setAttr_TokICCsig "ICC or token signature" +#define NID_setAttr_TokICCsig 634 +#define OBJ_setAttr_TokICCsig OBJ_setAttr_IssCap_Sig,1L + +#define SN_setAttr_SecDevSig "setAttr-SecDevSig" +#define LN_setAttr_SecDevSig "secure device signature" +#define NID_setAttr_SecDevSig 635 +#define OBJ_setAttr_SecDevSig OBJ_setAttr_IssCap_Sig,2L + +#define SN_set_brand_IATA_ATA "set-brand-IATA-ATA" +#define NID_set_brand_IATA_ATA 636 +#define OBJ_set_brand_IATA_ATA OBJ_set_brand,1L + +#define SN_set_brand_Diners "set-brand-Diners" +#define NID_set_brand_Diners 637 +#define OBJ_set_brand_Diners OBJ_set_brand,30L + +#define SN_set_brand_AmericanExpress "set-brand-AmericanExpress" +#define NID_set_brand_AmericanExpress 638 +#define OBJ_set_brand_AmericanExpress OBJ_set_brand,34L + +#define SN_set_brand_JCB "set-brand-JCB" +#define NID_set_brand_JCB 639 +#define OBJ_set_brand_JCB OBJ_set_brand,35L + +#define SN_set_brand_Visa "set-brand-Visa" +#define NID_set_brand_Visa 640 +#define OBJ_set_brand_Visa OBJ_set_brand,4L + +#define SN_set_brand_MasterCard "set-brand-MasterCard" +#define NID_set_brand_MasterCard 641 +#define OBJ_set_brand_MasterCard OBJ_set_brand,5L + +#define SN_set_brand_Novus "set-brand-Novus" +#define NID_set_brand_Novus 642 +#define OBJ_set_brand_Novus OBJ_set_brand,6011L + +#define SN_des_cdmf "DES-CDMF" +#define LN_des_cdmf "des-cdmf" +#define NID_des_cdmf 643 +#define OBJ_des_cdmf OBJ_rsadsi,3L,10L + +#define SN_rsaOAEPEncryptionSET "rsaOAEPEncryptionSET" +#define NID_rsaOAEPEncryptionSET 644 +#define OBJ_rsaOAEPEncryptionSET OBJ_rsadsi,1L,1L,6L + +#define SN_ipsec3 "Oakley-EC2N-3" +#define LN_ipsec3 "ipsec3" +#define NID_ipsec3 749 + +#define SN_ipsec4 "Oakley-EC2N-4" +#define LN_ipsec4 "ipsec4" +#define NID_ipsec4 750 + +#define SN_whirlpool "whirlpool" +#define NID_whirlpool 804 +#define OBJ_whirlpool OBJ_iso,0L,10118L,3L,0L,55L + +#define SN_cryptopro "cryptopro" +#define NID_cryptopro 805 +#define OBJ_cryptopro OBJ_member_body,643L,2L,2L + +#define SN_cryptocom "cryptocom" +#define NID_cryptocom 806 +#define OBJ_cryptocom OBJ_member_body,643L,2L,9L + +#define SN_id_GostR3411_94_with_GostR3410_2001 "id-GostR3411-94-with-GostR3410-2001" +#define LN_id_GostR3411_94_with_GostR3410_2001 "GOST R 34.11-94 with GOST R 34.10-2001" +#define NID_id_GostR3411_94_with_GostR3410_2001 807 +#define OBJ_id_GostR3411_94_with_GostR3410_2001 OBJ_cryptopro,3L + +#define SN_id_GostR3411_94_with_GostR3410_94 "id-GostR3411-94-with-GostR3410-94" +#define LN_id_GostR3411_94_with_GostR3410_94 "GOST R 34.11-94 with GOST R 34.10-94" +#define NID_id_GostR3411_94_with_GostR3410_94 808 +#define OBJ_id_GostR3411_94_with_GostR3410_94 OBJ_cryptopro,4L + +#define SN_id_GostR3411_94 "md_gost94" +#define LN_id_GostR3411_94 "GOST R 34.11-94" +#define NID_id_GostR3411_94 809 +#define OBJ_id_GostR3411_94 OBJ_cryptopro,9L + +#define SN_id_HMACGostR3411_94 "id-HMACGostR3411-94" +#define LN_id_HMACGostR3411_94 "HMAC GOST 34.11-94" +#define NID_id_HMACGostR3411_94 810 +#define OBJ_id_HMACGostR3411_94 OBJ_cryptopro,10L + +#define SN_id_GostR3410_2001 "gost2001" +#define LN_id_GostR3410_2001 "GOST R 34.10-2001" +#define NID_id_GostR3410_2001 811 +#define OBJ_id_GostR3410_2001 OBJ_cryptopro,19L + +#define SN_id_GostR3410_94 "gost94" +#define LN_id_GostR3410_94 "GOST R 34.10-94" +#define NID_id_GostR3410_94 812 +#define OBJ_id_GostR3410_94 OBJ_cryptopro,20L + +#define SN_id_Gost28147_89 "gost89" +#define LN_id_Gost28147_89 "GOST 28147-89" +#define NID_id_Gost28147_89 813 +#define OBJ_id_Gost28147_89 OBJ_cryptopro,21L + +#define SN_gost89_cnt "gost89-cnt" +#define NID_gost89_cnt 814 + +#define SN_id_Gost28147_89_MAC "gost-mac" +#define LN_id_Gost28147_89_MAC "GOST 28147-89 MAC" +#define NID_id_Gost28147_89_MAC 815 +#define OBJ_id_Gost28147_89_MAC OBJ_cryptopro,22L + +#define SN_id_GostR3411_94_prf "prf-gostr3411-94" +#define LN_id_GostR3411_94_prf "GOST R 34.11-94 PRF" +#define NID_id_GostR3411_94_prf 816 +#define OBJ_id_GostR3411_94_prf OBJ_cryptopro,23L + +#define SN_id_GostR3410_2001DH "id-GostR3410-2001DH" +#define LN_id_GostR3410_2001DH "GOST R 34.10-2001 DH" +#define NID_id_GostR3410_2001DH 817 +#define OBJ_id_GostR3410_2001DH OBJ_cryptopro,98L + +#define SN_id_GostR3410_94DH "id-GostR3410-94DH" +#define LN_id_GostR3410_94DH "GOST R 34.10-94 DH" +#define NID_id_GostR3410_94DH 818 +#define OBJ_id_GostR3410_94DH OBJ_cryptopro,99L + +#define SN_id_Gost28147_89_CryptoPro_KeyMeshing "id-Gost28147-89-CryptoPro-KeyMeshing" +#define NID_id_Gost28147_89_CryptoPro_KeyMeshing 819 +#define OBJ_id_Gost28147_89_CryptoPro_KeyMeshing OBJ_cryptopro,14L,1L + +#define SN_id_Gost28147_89_None_KeyMeshing "id-Gost28147-89-None-KeyMeshing" +#define NID_id_Gost28147_89_None_KeyMeshing 820 +#define OBJ_id_Gost28147_89_None_KeyMeshing OBJ_cryptopro,14L,0L + +#define SN_id_GostR3411_94_TestParamSet "id-GostR3411-94-TestParamSet" +#define NID_id_GostR3411_94_TestParamSet 821 +#define OBJ_id_GostR3411_94_TestParamSet OBJ_cryptopro,30L,0L + +#define SN_id_GostR3411_94_CryptoProParamSet "id-GostR3411-94-CryptoProParamSet" +#define NID_id_GostR3411_94_CryptoProParamSet 822 +#define OBJ_id_GostR3411_94_CryptoProParamSet OBJ_cryptopro,30L,1L + +#define SN_id_Gost28147_89_TestParamSet "id-Gost28147-89-TestParamSet" +#define NID_id_Gost28147_89_TestParamSet 823 +#define OBJ_id_Gost28147_89_TestParamSet OBJ_cryptopro,31L,0L + +#define SN_id_Gost28147_89_CryptoPro_A_ParamSet "id-Gost28147-89-CryptoPro-A-ParamSet" +#define NID_id_Gost28147_89_CryptoPro_A_ParamSet 824 +#define OBJ_id_Gost28147_89_CryptoPro_A_ParamSet OBJ_cryptopro,31L,1L + +#define SN_id_Gost28147_89_CryptoPro_B_ParamSet "id-Gost28147-89-CryptoPro-B-ParamSet" +#define NID_id_Gost28147_89_CryptoPro_B_ParamSet 825 +#define OBJ_id_Gost28147_89_CryptoPro_B_ParamSet OBJ_cryptopro,31L,2L + +#define SN_id_Gost28147_89_CryptoPro_C_ParamSet "id-Gost28147-89-CryptoPro-C-ParamSet" +#define NID_id_Gost28147_89_CryptoPro_C_ParamSet 826 +#define OBJ_id_Gost28147_89_CryptoPro_C_ParamSet OBJ_cryptopro,31L,3L + +#define SN_id_Gost28147_89_CryptoPro_D_ParamSet "id-Gost28147-89-CryptoPro-D-ParamSet" +#define NID_id_Gost28147_89_CryptoPro_D_ParamSet 827 +#define OBJ_id_Gost28147_89_CryptoPro_D_ParamSet OBJ_cryptopro,31L,4L + +#define SN_id_Gost28147_89_CryptoPro_Oscar_1_1_ParamSet "id-Gost28147-89-CryptoPro-Oscar-1-1-ParamSet" +#define NID_id_Gost28147_89_CryptoPro_Oscar_1_1_ParamSet 828 +#define OBJ_id_Gost28147_89_CryptoPro_Oscar_1_1_ParamSet OBJ_cryptopro,31L,5L + +#define SN_id_Gost28147_89_CryptoPro_Oscar_1_0_ParamSet "id-Gost28147-89-CryptoPro-Oscar-1-0-ParamSet" +#define NID_id_Gost28147_89_CryptoPro_Oscar_1_0_ParamSet 829 +#define OBJ_id_Gost28147_89_CryptoPro_Oscar_1_0_ParamSet OBJ_cryptopro,31L,6L + +#define SN_id_Gost28147_89_CryptoPro_RIC_1_ParamSet "id-Gost28147-89-CryptoPro-RIC-1-ParamSet" +#define NID_id_Gost28147_89_CryptoPro_RIC_1_ParamSet 830 +#define OBJ_id_Gost28147_89_CryptoPro_RIC_1_ParamSet OBJ_cryptopro,31L,7L + +#define SN_id_GostR3410_94_TestParamSet "id-GostR3410-94-TestParamSet" +#define NID_id_GostR3410_94_TestParamSet 831 +#define OBJ_id_GostR3410_94_TestParamSet OBJ_cryptopro,32L,0L + +#define SN_id_GostR3410_94_CryptoPro_A_ParamSet "id-GostR3410-94-CryptoPro-A-ParamSet" +#define NID_id_GostR3410_94_CryptoPro_A_ParamSet 832 +#define OBJ_id_GostR3410_94_CryptoPro_A_ParamSet OBJ_cryptopro,32L,2L + +#define SN_id_GostR3410_94_CryptoPro_B_ParamSet "id-GostR3410-94-CryptoPro-B-ParamSet" +#define NID_id_GostR3410_94_CryptoPro_B_ParamSet 833 +#define OBJ_id_GostR3410_94_CryptoPro_B_ParamSet OBJ_cryptopro,32L,3L + +#define SN_id_GostR3410_94_CryptoPro_C_ParamSet "id-GostR3410-94-CryptoPro-C-ParamSet" +#define NID_id_GostR3410_94_CryptoPro_C_ParamSet 834 +#define OBJ_id_GostR3410_94_CryptoPro_C_ParamSet OBJ_cryptopro,32L,4L + +#define SN_id_GostR3410_94_CryptoPro_D_ParamSet "id-GostR3410-94-CryptoPro-D-ParamSet" +#define NID_id_GostR3410_94_CryptoPro_D_ParamSet 835 +#define OBJ_id_GostR3410_94_CryptoPro_D_ParamSet OBJ_cryptopro,32L,5L + +#define SN_id_GostR3410_94_CryptoPro_XchA_ParamSet "id-GostR3410-94-CryptoPro-XchA-ParamSet" +#define NID_id_GostR3410_94_CryptoPro_XchA_ParamSet 836 +#define OBJ_id_GostR3410_94_CryptoPro_XchA_ParamSet OBJ_cryptopro,33L,1L + +#define SN_id_GostR3410_94_CryptoPro_XchB_ParamSet "id-GostR3410-94-CryptoPro-XchB-ParamSet" +#define NID_id_GostR3410_94_CryptoPro_XchB_ParamSet 837 +#define OBJ_id_GostR3410_94_CryptoPro_XchB_ParamSet OBJ_cryptopro,33L,2L + +#define SN_id_GostR3410_94_CryptoPro_XchC_ParamSet "id-GostR3410-94-CryptoPro-XchC-ParamSet" +#define NID_id_GostR3410_94_CryptoPro_XchC_ParamSet 838 +#define OBJ_id_GostR3410_94_CryptoPro_XchC_ParamSet OBJ_cryptopro,33L,3L + +#define SN_id_GostR3410_2001_TestParamSet "id-GostR3410-2001-TestParamSet" +#define NID_id_GostR3410_2001_TestParamSet 839 +#define OBJ_id_GostR3410_2001_TestParamSet OBJ_cryptopro,35L,0L + +#define SN_id_GostR3410_2001_CryptoPro_A_ParamSet "id-GostR3410-2001-CryptoPro-A-ParamSet" +#define NID_id_GostR3410_2001_CryptoPro_A_ParamSet 840 +#define OBJ_id_GostR3410_2001_CryptoPro_A_ParamSet OBJ_cryptopro,35L,1L + +#define SN_id_GostR3410_2001_CryptoPro_B_ParamSet "id-GostR3410-2001-CryptoPro-B-ParamSet" +#define NID_id_GostR3410_2001_CryptoPro_B_ParamSet 841 +#define OBJ_id_GostR3410_2001_CryptoPro_B_ParamSet OBJ_cryptopro,35L,2L + +#define SN_id_GostR3410_2001_CryptoPro_C_ParamSet "id-GostR3410-2001-CryptoPro-C-ParamSet" +#define NID_id_GostR3410_2001_CryptoPro_C_ParamSet 842 +#define OBJ_id_GostR3410_2001_CryptoPro_C_ParamSet OBJ_cryptopro,35L,3L + +#define SN_id_GostR3410_2001_CryptoPro_XchA_ParamSet "id-GostR3410-2001-CryptoPro-XchA-ParamSet" +#define NID_id_GostR3410_2001_CryptoPro_XchA_ParamSet 843 +#define OBJ_id_GostR3410_2001_CryptoPro_XchA_ParamSet OBJ_cryptopro,36L,0L + +#define SN_id_GostR3410_2001_CryptoPro_XchB_ParamSet "id-GostR3410-2001-CryptoPro-XchB-ParamSet" +#define NID_id_GostR3410_2001_CryptoPro_XchB_ParamSet 844 +#define OBJ_id_GostR3410_2001_CryptoPro_XchB_ParamSet OBJ_cryptopro,36L,1L + +#define SN_id_GostR3410_94_a "id-GostR3410-94-a" +#define NID_id_GostR3410_94_a 845 +#define OBJ_id_GostR3410_94_a OBJ_id_GostR3410_94,1L + +#define SN_id_GostR3410_94_aBis "id-GostR3410-94-aBis" +#define NID_id_GostR3410_94_aBis 846 +#define OBJ_id_GostR3410_94_aBis OBJ_id_GostR3410_94,2L + +#define SN_id_GostR3410_94_b "id-GostR3410-94-b" +#define NID_id_GostR3410_94_b 847 +#define OBJ_id_GostR3410_94_b OBJ_id_GostR3410_94,3L + +#define SN_id_GostR3410_94_bBis "id-GostR3410-94-bBis" +#define NID_id_GostR3410_94_bBis 848 +#define OBJ_id_GostR3410_94_bBis OBJ_id_GostR3410_94,4L + +#define SN_id_Gost28147_89_cc "id-Gost28147-89-cc" +#define LN_id_Gost28147_89_cc "GOST 28147-89 Cryptocom ParamSet" +#define NID_id_Gost28147_89_cc 849 +#define OBJ_id_Gost28147_89_cc OBJ_cryptocom,1L,6L,1L + +#define SN_id_GostR3410_94_cc "gost94cc" +#define LN_id_GostR3410_94_cc "GOST 34.10-94 Cryptocom" +#define NID_id_GostR3410_94_cc 850 +#define OBJ_id_GostR3410_94_cc OBJ_cryptocom,1L,5L,3L + +#define SN_id_GostR3410_2001_cc "gost2001cc" +#define LN_id_GostR3410_2001_cc "GOST 34.10-2001 Cryptocom" +#define NID_id_GostR3410_2001_cc 851 +#define OBJ_id_GostR3410_2001_cc OBJ_cryptocom,1L,5L,4L + +#define SN_id_GostR3411_94_with_GostR3410_94_cc "id-GostR3411-94-with-GostR3410-94-cc" +#define LN_id_GostR3411_94_with_GostR3410_94_cc "GOST R 34.11-94 with GOST R 34.10-94 Cryptocom" +#define NID_id_GostR3411_94_with_GostR3410_94_cc 852 +#define OBJ_id_GostR3411_94_with_GostR3410_94_cc OBJ_cryptocom,1L,3L,3L + +#define SN_id_GostR3411_94_with_GostR3410_2001_cc "id-GostR3411-94-with-GostR3410-2001-cc" +#define LN_id_GostR3411_94_with_GostR3410_2001_cc "GOST R 34.11-94 with GOST R 34.10-2001 Cryptocom" +#define NID_id_GostR3411_94_with_GostR3410_2001_cc 853 +#define OBJ_id_GostR3411_94_with_GostR3410_2001_cc OBJ_cryptocom,1L,3L,4L + +#define SN_id_GostR3410_2001_ParamSet_cc "id-GostR3410-2001-ParamSet-cc" +#define LN_id_GostR3410_2001_ParamSet_cc "GOST R 3410-2001 Parameter Set Cryptocom" +#define NID_id_GostR3410_2001_ParamSet_cc 854 +#define OBJ_id_GostR3410_2001_ParamSet_cc OBJ_cryptocom,1L,8L,1L + +#define SN_camellia_128_cbc "CAMELLIA-128-CBC" +#define LN_camellia_128_cbc "camellia-128-cbc" +#define NID_camellia_128_cbc 751 +#define OBJ_camellia_128_cbc 1L,2L,392L,200011L,61L,1L,1L,1L,2L + +#define SN_camellia_192_cbc "CAMELLIA-192-CBC" +#define LN_camellia_192_cbc "camellia-192-cbc" +#define NID_camellia_192_cbc 752 +#define OBJ_camellia_192_cbc 1L,2L,392L,200011L,61L,1L,1L,1L,3L + +#define SN_camellia_256_cbc "CAMELLIA-256-CBC" +#define LN_camellia_256_cbc "camellia-256-cbc" +#define NID_camellia_256_cbc 753 +#define OBJ_camellia_256_cbc 1L,2L,392L,200011L,61L,1L,1L,1L,4L + +#define SN_id_camellia128_wrap "id-camellia128-wrap" +#define NID_id_camellia128_wrap 907 +#define OBJ_id_camellia128_wrap 1L,2L,392L,200011L,61L,1L,1L,3L,2L + +#define SN_id_camellia192_wrap "id-camellia192-wrap" +#define NID_id_camellia192_wrap 908 +#define OBJ_id_camellia192_wrap 1L,2L,392L,200011L,61L,1L,1L,3L,3L + +#define SN_id_camellia256_wrap "id-camellia256-wrap" +#define NID_id_camellia256_wrap 909 +#define OBJ_id_camellia256_wrap 1L,2L,392L,200011L,61L,1L,1L,3L,4L + +#define OBJ_ntt_ds 0L,3L,4401L,5L + +#define OBJ_camellia OBJ_ntt_ds,3L,1L,9L + +#define SN_camellia_128_ecb "CAMELLIA-128-ECB" +#define LN_camellia_128_ecb "camellia-128-ecb" +#define NID_camellia_128_ecb 754 +#define OBJ_camellia_128_ecb OBJ_camellia,1L + +#define SN_camellia_128_ofb128 "CAMELLIA-128-OFB" +#define LN_camellia_128_ofb128 "camellia-128-ofb" +#define NID_camellia_128_ofb128 766 +#define OBJ_camellia_128_ofb128 OBJ_camellia,3L + +#define SN_camellia_128_cfb128 "CAMELLIA-128-CFB" +#define LN_camellia_128_cfb128 "camellia-128-cfb" +#define NID_camellia_128_cfb128 757 +#define OBJ_camellia_128_cfb128 OBJ_camellia,4L + +#define SN_camellia_192_ecb "CAMELLIA-192-ECB" +#define LN_camellia_192_ecb "camellia-192-ecb" +#define NID_camellia_192_ecb 755 +#define OBJ_camellia_192_ecb OBJ_camellia,21L + +#define SN_camellia_192_ofb128 "CAMELLIA-192-OFB" +#define LN_camellia_192_ofb128 "camellia-192-ofb" +#define NID_camellia_192_ofb128 767 +#define OBJ_camellia_192_ofb128 OBJ_camellia,23L + +#define SN_camellia_192_cfb128 "CAMELLIA-192-CFB" +#define LN_camellia_192_cfb128 "camellia-192-cfb" +#define NID_camellia_192_cfb128 758 +#define OBJ_camellia_192_cfb128 OBJ_camellia,24L + +#define SN_camellia_256_ecb "CAMELLIA-256-ECB" +#define LN_camellia_256_ecb "camellia-256-ecb" +#define NID_camellia_256_ecb 756 +#define OBJ_camellia_256_ecb OBJ_camellia,41L + +#define SN_camellia_256_ofb128 "CAMELLIA-256-OFB" +#define LN_camellia_256_ofb128 "camellia-256-ofb" +#define NID_camellia_256_ofb128 768 +#define OBJ_camellia_256_ofb128 OBJ_camellia,43L + +#define SN_camellia_256_cfb128 "CAMELLIA-256-CFB" +#define LN_camellia_256_cfb128 "camellia-256-cfb" +#define NID_camellia_256_cfb128 759 +#define OBJ_camellia_256_cfb128 OBJ_camellia,44L + +#define SN_camellia_128_cfb1 "CAMELLIA-128-CFB1" +#define LN_camellia_128_cfb1 "camellia-128-cfb1" +#define NID_camellia_128_cfb1 760 + +#define SN_camellia_192_cfb1 "CAMELLIA-192-CFB1" +#define LN_camellia_192_cfb1 "camellia-192-cfb1" +#define NID_camellia_192_cfb1 761 + +#define SN_camellia_256_cfb1 "CAMELLIA-256-CFB1" +#define LN_camellia_256_cfb1 "camellia-256-cfb1" +#define NID_camellia_256_cfb1 762 + +#define SN_camellia_128_cfb8 "CAMELLIA-128-CFB8" +#define LN_camellia_128_cfb8 "camellia-128-cfb8" +#define NID_camellia_128_cfb8 763 + +#define SN_camellia_192_cfb8 "CAMELLIA-192-CFB8" +#define LN_camellia_192_cfb8 "camellia-192-cfb8" +#define NID_camellia_192_cfb8 764 + +#define SN_camellia_256_cfb8 "CAMELLIA-256-CFB8" +#define LN_camellia_256_cfb8 "camellia-256-cfb8" +#define NID_camellia_256_cfb8 765 + +#define SN_kisa "KISA" +#define LN_kisa "kisa" +#define NID_kisa 773 +#define OBJ_kisa OBJ_member_body,410L,200004L + +#define SN_seed_ecb "SEED-ECB" +#define LN_seed_ecb "seed-ecb" +#define NID_seed_ecb 776 +#define OBJ_seed_ecb OBJ_kisa,1L,3L + +#define SN_seed_cbc "SEED-CBC" +#define LN_seed_cbc "seed-cbc" +#define NID_seed_cbc 777 +#define OBJ_seed_cbc OBJ_kisa,1L,4L + +#define SN_seed_cfb128 "SEED-CFB" +#define LN_seed_cfb128 "seed-cfb" +#define NID_seed_cfb128 779 +#define OBJ_seed_cfb128 OBJ_kisa,1L,5L + +#define SN_seed_ofb128 "SEED-OFB" +#define LN_seed_ofb128 "seed-ofb" +#define NID_seed_ofb128 778 +#define OBJ_seed_ofb128 OBJ_kisa,1L,6L + +#define SN_hmac "HMAC" +#define LN_hmac "hmac" +#define NID_hmac 855 + +#define SN_cmac "CMAC" +#define LN_cmac "cmac" +#define NID_cmac 894 + +#define SN_rc4_hmac_md5 "RC4-HMAC-MD5" +#define LN_rc4_hmac_md5 "rc4-hmac-md5" +#define NID_rc4_hmac_md5 915 + +#define SN_aes_128_cbc_hmac_sha1 "AES-128-CBC-HMAC-SHA1" +#define LN_aes_128_cbc_hmac_sha1 "aes-128-cbc-hmac-sha1" +#define NID_aes_128_cbc_hmac_sha1 916 + +#define SN_aes_192_cbc_hmac_sha1 "AES-192-CBC-HMAC-SHA1" +#define LN_aes_192_cbc_hmac_sha1 "aes-192-cbc-hmac-sha1" +#define NID_aes_192_cbc_hmac_sha1 917 + +#define SN_aes_256_cbc_hmac_sha1 "AES-256-CBC-HMAC-SHA1" +#define LN_aes_256_cbc_hmac_sha1 "aes-256-cbc-hmac-sha1" +#define NID_aes_256_cbc_hmac_sha1 918 + +#define SN_aes_128_cbc_hmac_sha256 "AES-128-CBC-HMAC-SHA256" +#define LN_aes_128_cbc_hmac_sha256 "aes-128-cbc-hmac-sha256" +#define NID_aes_128_cbc_hmac_sha256 948 + +#define SN_aes_192_cbc_hmac_sha256 "AES-192-CBC-HMAC-SHA256" +#define LN_aes_192_cbc_hmac_sha256 "aes-192-cbc-hmac-sha256" +#define NID_aes_192_cbc_hmac_sha256 949 + +#define SN_aes_256_cbc_hmac_sha256 "AES-256-CBC-HMAC-SHA256" +#define LN_aes_256_cbc_hmac_sha256 "aes-256-cbc-hmac-sha256" +#define NID_aes_256_cbc_hmac_sha256 950 + +#define SN_dhpublicnumber "dhpublicnumber" +#define LN_dhpublicnumber "X9.42 DH" +#define NID_dhpublicnumber 920 +#define OBJ_dhpublicnumber OBJ_ISO_US,10046L,2L,1L + +#define SN_brainpoolP160r1 "brainpoolP160r1" +#define NID_brainpoolP160r1 921 +#define OBJ_brainpoolP160r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,1L + +#define SN_brainpoolP160t1 "brainpoolP160t1" +#define NID_brainpoolP160t1 922 +#define OBJ_brainpoolP160t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,2L + +#define SN_brainpoolP192r1 "brainpoolP192r1" +#define NID_brainpoolP192r1 923 +#define OBJ_brainpoolP192r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,3L + +#define SN_brainpoolP192t1 "brainpoolP192t1" +#define NID_brainpoolP192t1 924 +#define OBJ_brainpoolP192t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,4L + +#define SN_brainpoolP224r1 "brainpoolP224r1" +#define NID_brainpoolP224r1 925 +#define OBJ_brainpoolP224r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,5L + +#define SN_brainpoolP224t1 "brainpoolP224t1" +#define NID_brainpoolP224t1 926 +#define OBJ_brainpoolP224t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,6L + +#define SN_brainpoolP256r1 "brainpoolP256r1" +#define NID_brainpoolP256r1 927 +#define OBJ_brainpoolP256r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,7L + +#define SN_brainpoolP256t1 "brainpoolP256t1" +#define NID_brainpoolP256t1 928 +#define OBJ_brainpoolP256t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,8L + +#define SN_brainpoolP320r1 "brainpoolP320r1" +#define NID_brainpoolP320r1 929 +#define OBJ_brainpoolP320r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,9L + +#define SN_brainpoolP320t1 "brainpoolP320t1" +#define NID_brainpoolP320t1 930 +#define OBJ_brainpoolP320t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,10L + +#define SN_brainpoolP384r1 "brainpoolP384r1" +#define NID_brainpoolP384r1 931 +#define OBJ_brainpoolP384r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,11L + +#define SN_brainpoolP384t1 "brainpoolP384t1" +#define NID_brainpoolP384t1 932 +#define OBJ_brainpoolP384t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,12L + +#define SN_brainpoolP512r1 "brainpoolP512r1" +#define NID_brainpoolP512r1 933 +#define OBJ_brainpoolP512r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,13L + +#define SN_brainpoolP512t1 "brainpoolP512t1" +#define NID_brainpoolP512t1 934 +#define OBJ_brainpoolP512t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,14L + +#define OBJ_x9_63_scheme 1L,3L,133L,16L,840L,63L,0L + +#define OBJ_secg_scheme OBJ_certicom_arc,1L + +#define SN_dhSinglePass_stdDH_sha1kdf_scheme "dhSinglePass-stdDH-sha1kdf-scheme" +#define NID_dhSinglePass_stdDH_sha1kdf_scheme 936 +#define OBJ_dhSinglePass_stdDH_sha1kdf_scheme OBJ_x9_63_scheme,2L + +#define SN_dhSinglePass_stdDH_sha224kdf_scheme "dhSinglePass-stdDH-sha224kdf-scheme" +#define NID_dhSinglePass_stdDH_sha224kdf_scheme 937 +#define OBJ_dhSinglePass_stdDH_sha224kdf_scheme OBJ_secg_scheme,11L,0L + +#define SN_dhSinglePass_stdDH_sha256kdf_scheme "dhSinglePass-stdDH-sha256kdf-scheme" +#define NID_dhSinglePass_stdDH_sha256kdf_scheme 938 +#define OBJ_dhSinglePass_stdDH_sha256kdf_scheme OBJ_secg_scheme,11L,1L + +#define SN_dhSinglePass_stdDH_sha384kdf_scheme "dhSinglePass-stdDH-sha384kdf-scheme" +#define NID_dhSinglePass_stdDH_sha384kdf_scheme 939 +#define OBJ_dhSinglePass_stdDH_sha384kdf_scheme OBJ_secg_scheme,11L,2L + +#define SN_dhSinglePass_stdDH_sha512kdf_scheme "dhSinglePass-stdDH-sha512kdf-scheme" +#define NID_dhSinglePass_stdDH_sha512kdf_scheme 940 +#define OBJ_dhSinglePass_stdDH_sha512kdf_scheme OBJ_secg_scheme,11L,3L + +#define SN_dhSinglePass_cofactorDH_sha1kdf_scheme "dhSinglePass-cofactorDH-sha1kdf-scheme" +#define NID_dhSinglePass_cofactorDH_sha1kdf_scheme 941 +#define OBJ_dhSinglePass_cofactorDH_sha1kdf_scheme OBJ_x9_63_scheme,3L + +#define SN_dhSinglePass_cofactorDH_sha224kdf_scheme "dhSinglePass-cofactorDH-sha224kdf-scheme" +#define NID_dhSinglePass_cofactorDH_sha224kdf_scheme 942 +#define OBJ_dhSinglePass_cofactorDH_sha224kdf_scheme OBJ_secg_scheme,14L,0L + +#define SN_dhSinglePass_cofactorDH_sha256kdf_scheme "dhSinglePass-cofactorDH-sha256kdf-scheme" +#define NID_dhSinglePass_cofactorDH_sha256kdf_scheme 943 +#define OBJ_dhSinglePass_cofactorDH_sha256kdf_scheme OBJ_secg_scheme,14L,1L + +#define SN_dhSinglePass_cofactorDH_sha384kdf_scheme "dhSinglePass-cofactorDH-sha384kdf-scheme" +#define NID_dhSinglePass_cofactorDH_sha384kdf_scheme 944 +#define OBJ_dhSinglePass_cofactorDH_sha384kdf_scheme OBJ_secg_scheme,14L,2L + +#define SN_dhSinglePass_cofactorDH_sha512kdf_scheme "dhSinglePass-cofactorDH-sha512kdf-scheme" +#define NID_dhSinglePass_cofactorDH_sha512kdf_scheme 945 +#define OBJ_dhSinglePass_cofactorDH_sha512kdf_scheme OBJ_secg_scheme,14L,3L + +#define SN_dh_std_kdf "dh-std-kdf" +#define NID_dh_std_kdf 946 + +#define SN_dh_cofactor_kdf "dh-cofactor-kdf" +#define NID_dh_cofactor_kdf 947 + +#define SN_ct_precert_scts "ct_precert_scts" +#define LN_ct_precert_scts "CT Precertificate SCTs" +#define NID_ct_precert_scts 951 +#define OBJ_ct_precert_scts 1L,3L,6L,1L,4L,1L,11129L,2L,4L,2L + +#define SN_ct_precert_poison "ct_precert_poison" +#define LN_ct_precert_poison "CT Precertificate Poison" +#define NID_ct_precert_poison 952 +#define OBJ_ct_precert_poison 1L,3L,6L,1L,4L,1L,11129L,2L,4L,3L + +#define SN_ct_precert_signer "ct_precert_signer" +#define LN_ct_precert_signer "CT Precertificate Signer" +#define NID_ct_precert_signer 953 +#define OBJ_ct_precert_signer 1L,3L,6L,1L,4L,1L,11129L,2L,4L,4L + +#define SN_ct_cert_scts "ct_cert_scts" +#define LN_ct_cert_scts "CT Certificate SCTs" +#define NID_ct_cert_scts 954 +#define OBJ_ct_cert_scts 1L,3L,6L,1L,4L,1L,11129L,2L,4L,5L + +#define SN_jurisdictionLocalityName "jurisdictionL" +#define LN_jurisdictionLocalityName "jurisdictionLocalityName" +#define NID_jurisdictionLocalityName 955 +#define OBJ_jurisdictionLocalityName 1L,3L,6L,1L,4L,1L,311L,60L,2L,1L,1L + +#define SN_jurisdictionStateOrProvinceName "jurisdictionST" +#define LN_jurisdictionStateOrProvinceName "jurisdictionStateOrProvinceName" +#define NID_jurisdictionStateOrProvinceName 956 +#define OBJ_jurisdictionStateOrProvinceName 1L,3L,6L,1L,4L,1L,311L,60L,2L,1L,2L + +#define SN_jurisdictionCountryName "jurisdictionC" +#define LN_jurisdictionCountryName "jurisdictionCountryName" +#define NID_jurisdictionCountryName 957 +#define OBJ_jurisdictionCountryName 1L,3L,6L,1L,4L,1L,311L,60L,2L,1L,3L diff --git a/hdssd/external/win/openssl/include/openssl/objects.h b/hdssd/external/win/openssl/include/openssl/objects.h new file mode 100644 index 0000000..b8dafa8 --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/objects.h @@ -0,0 +1,1143 @@ +/* crypto/objects/objects.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_OBJECTS_H +# define HEADER_OBJECTS_H + +# define USE_OBJ_MAC + +# ifdef USE_OBJ_MAC +# include +# else +# define SN_undef "UNDEF" +# define LN_undef "undefined" +# define NID_undef 0 +# define OBJ_undef 0L + +# define SN_Algorithm "Algorithm" +# define LN_algorithm "algorithm" +# define NID_algorithm 38 +# define OBJ_algorithm 1L,3L,14L,3L,2L + +# define LN_rsadsi "rsadsi" +# define NID_rsadsi 1 +# define OBJ_rsadsi 1L,2L,840L,113549L + +# define LN_pkcs "pkcs" +# define NID_pkcs 2 +# define OBJ_pkcs OBJ_rsadsi,1L + +# define SN_md2 "MD2" +# define LN_md2 "md2" +# define NID_md2 3 +# define OBJ_md2 OBJ_rsadsi,2L,2L + +# define SN_md5 "MD5" +# define LN_md5 "md5" +# define NID_md5 4 +# define OBJ_md5 OBJ_rsadsi,2L,5L + +# define SN_rc4 "RC4" +# define LN_rc4 "rc4" +# define NID_rc4 5 +# define OBJ_rc4 OBJ_rsadsi,3L,4L + +# define LN_rsaEncryption "rsaEncryption" +# define NID_rsaEncryption 6 +# define OBJ_rsaEncryption OBJ_pkcs,1L,1L + +# define SN_md2WithRSAEncryption "RSA-MD2" +# define LN_md2WithRSAEncryption "md2WithRSAEncryption" +# define NID_md2WithRSAEncryption 7 +# define OBJ_md2WithRSAEncryption OBJ_pkcs,1L,2L + +# define SN_md5WithRSAEncryption "RSA-MD5" +# define LN_md5WithRSAEncryption "md5WithRSAEncryption" +# define NID_md5WithRSAEncryption 8 +# define OBJ_md5WithRSAEncryption OBJ_pkcs,1L,4L + +# define SN_pbeWithMD2AndDES_CBC "PBE-MD2-DES" +# define LN_pbeWithMD2AndDES_CBC "pbeWithMD2AndDES-CBC" +# define NID_pbeWithMD2AndDES_CBC 9 +# define OBJ_pbeWithMD2AndDES_CBC OBJ_pkcs,5L,1L + +# define SN_pbeWithMD5AndDES_CBC "PBE-MD5-DES" +# define LN_pbeWithMD5AndDES_CBC "pbeWithMD5AndDES-CBC" +# define NID_pbeWithMD5AndDES_CBC 10 +# define OBJ_pbeWithMD5AndDES_CBC OBJ_pkcs,5L,3L + +# define LN_X500 "X500" +# define NID_X500 11 +# define OBJ_X500 2L,5L + +# define LN_X509 "X509" +# define NID_X509 12 +# define OBJ_X509 OBJ_X500,4L + +# define SN_commonName "CN" +# define LN_commonName "commonName" +# define NID_commonName 13 +# define OBJ_commonName OBJ_X509,3L + +# define SN_countryName "C" +# define LN_countryName "countryName" +# define NID_countryName 14 +# define OBJ_countryName OBJ_X509,6L + +# define SN_localityName "L" +# define LN_localityName "localityName" +# define NID_localityName 15 +# define OBJ_localityName OBJ_X509,7L + +/* Postal Address? PA */ + +/* should be "ST" (rfc1327) but MS uses 'S' */ +# define SN_stateOrProvinceName "ST" +# define LN_stateOrProvinceName "stateOrProvinceName" +# define NID_stateOrProvinceName 16 +# define OBJ_stateOrProvinceName OBJ_X509,8L + +# define SN_organizationName "O" +# define LN_organizationName "organizationName" +# define NID_organizationName 17 +# define OBJ_organizationName OBJ_X509,10L + +# define SN_organizationalUnitName "OU" +# define LN_organizationalUnitName "organizationalUnitName" +# define NID_organizationalUnitName 18 +# define OBJ_organizationalUnitName OBJ_X509,11L + +# define SN_rsa "RSA" +# define LN_rsa "rsa" +# define NID_rsa 19 +# define OBJ_rsa OBJ_X500,8L,1L,1L + +# define LN_pkcs7 "pkcs7" +# define NID_pkcs7 20 +# define OBJ_pkcs7 OBJ_pkcs,7L + +# define LN_pkcs7_data "pkcs7-data" +# define NID_pkcs7_data 21 +# define OBJ_pkcs7_data OBJ_pkcs7,1L + +# define LN_pkcs7_signed "pkcs7-signedData" +# define NID_pkcs7_signed 22 +# define OBJ_pkcs7_signed OBJ_pkcs7,2L + +# define LN_pkcs7_enveloped "pkcs7-envelopedData" +# define NID_pkcs7_enveloped 23 +# define OBJ_pkcs7_enveloped OBJ_pkcs7,3L + +# define LN_pkcs7_signedAndEnveloped "pkcs7-signedAndEnvelopedData" +# define NID_pkcs7_signedAndEnveloped 24 +# define OBJ_pkcs7_signedAndEnveloped OBJ_pkcs7,4L + +# define LN_pkcs7_digest "pkcs7-digestData" +# define NID_pkcs7_digest 25 +# define OBJ_pkcs7_digest OBJ_pkcs7,5L + +# define LN_pkcs7_encrypted "pkcs7-encryptedData" +# define NID_pkcs7_encrypted 26 +# define OBJ_pkcs7_encrypted OBJ_pkcs7,6L + +# define LN_pkcs3 "pkcs3" +# define NID_pkcs3 27 +# define OBJ_pkcs3 OBJ_pkcs,3L + +# define LN_dhKeyAgreement "dhKeyAgreement" +# define NID_dhKeyAgreement 28 +# define OBJ_dhKeyAgreement OBJ_pkcs3,1L + +# define SN_des_ecb "DES-ECB" +# define LN_des_ecb "des-ecb" +# define NID_des_ecb 29 +# define OBJ_des_ecb OBJ_algorithm,6L + +# define SN_des_cfb64 "DES-CFB" +# define LN_des_cfb64 "des-cfb" +# define NID_des_cfb64 30 +/* IV + num */ +# define OBJ_des_cfb64 OBJ_algorithm,9L + +# define SN_des_cbc "DES-CBC" +# define LN_des_cbc "des-cbc" +# define NID_des_cbc 31 +/* IV */ +# define OBJ_des_cbc OBJ_algorithm,7L + +# define SN_des_ede "DES-EDE" +# define LN_des_ede "des-ede" +# define NID_des_ede 32 +/* ?? */ +# define OBJ_des_ede OBJ_algorithm,17L + +# define SN_des_ede3 "DES-EDE3" +# define LN_des_ede3 "des-ede3" +# define NID_des_ede3 33 + +# define SN_idea_cbc "IDEA-CBC" +# define LN_idea_cbc "idea-cbc" +# define NID_idea_cbc 34 +# define OBJ_idea_cbc 1L,3L,6L,1L,4L,1L,188L,7L,1L,1L,2L + +# define SN_idea_cfb64 "IDEA-CFB" +# define LN_idea_cfb64 "idea-cfb" +# define NID_idea_cfb64 35 + +# define SN_idea_ecb "IDEA-ECB" +# define LN_idea_ecb "idea-ecb" +# define NID_idea_ecb 36 + +# define SN_rc2_cbc "RC2-CBC" +# define LN_rc2_cbc "rc2-cbc" +# define NID_rc2_cbc 37 +# define OBJ_rc2_cbc OBJ_rsadsi,3L,2L + +# define SN_rc2_ecb "RC2-ECB" +# define LN_rc2_ecb "rc2-ecb" +# define NID_rc2_ecb 38 + +# define SN_rc2_cfb64 "RC2-CFB" +# define LN_rc2_cfb64 "rc2-cfb" +# define NID_rc2_cfb64 39 + +# define SN_rc2_ofb64 "RC2-OFB" +# define LN_rc2_ofb64 "rc2-ofb" +# define NID_rc2_ofb64 40 + +# define SN_sha "SHA" +# define LN_sha "sha" +# define NID_sha 41 +# define OBJ_sha OBJ_algorithm,18L + +# define SN_shaWithRSAEncryption "RSA-SHA" +# define LN_shaWithRSAEncryption "shaWithRSAEncryption" +# define NID_shaWithRSAEncryption 42 +# define OBJ_shaWithRSAEncryption OBJ_algorithm,15L + +# define SN_des_ede_cbc "DES-EDE-CBC" +# define LN_des_ede_cbc "des-ede-cbc" +# define NID_des_ede_cbc 43 + +# define SN_des_ede3_cbc "DES-EDE3-CBC" +# define LN_des_ede3_cbc "des-ede3-cbc" +# define NID_des_ede3_cbc 44 +# define OBJ_des_ede3_cbc OBJ_rsadsi,3L,7L + +# define SN_des_ofb64 "DES-OFB" +# define LN_des_ofb64 "des-ofb" +# define NID_des_ofb64 45 +# define OBJ_des_ofb64 OBJ_algorithm,8L + +# define SN_idea_ofb64 "IDEA-OFB" +# define LN_idea_ofb64 "idea-ofb" +# define NID_idea_ofb64 46 + +# define LN_pkcs9 "pkcs9" +# define NID_pkcs9 47 +# define OBJ_pkcs9 OBJ_pkcs,9L + +# define SN_pkcs9_emailAddress "Email" +# define LN_pkcs9_emailAddress "emailAddress" +# define NID_pkcs9_emailAddress 48 +# define OBJ_pkcs9_emailAddress OBJ_pkcs9,1L + +# define LN_pkcs9_unstructuredName "unstructuredName" +# define NID_pkcs9_unstructuredName 49 +# define OBJ_pkcs9_unstructuredName OBJ_pkcs9,2L + +# define LN_pkcs9_contentType "contentType" +# define NID_pkcs9_contentType 50 +# define OBJ_pkcs9_contentType OBJ_pkcs9,3L + +# define LN_pkcs9_messageDigest "messageDigest" +# define NID_pkcs9_messageDigest 51 +# define OBJ_pkcs9_messageDigest OBJ_pkcs9,4L + +# define LN_pkcs9_signingTime "signingTime" +# define NID_pkcs9_signingTime 52 +# define OBJ_pkcs9_signingTime OBJ_pkcs9,5L + +# define LN_pkcs9_countersignature "countersignature" +# define NID_pkcs9_countersignature 53 +# define OBJ_pkcs9_countersignature OBJ_pkcs9,6L + +# define LN_pkcs9_challengePassword "challengePassword" +# define NID_pkcs9_challengePassword 54 +# define OBJ_pkcs9_challengePassword OBJ_pkcs9,7L + +# define LN_pkcs9_unstructuredAddress "unstructuredAddress" +# define NID_pkcs9_unstructuredAddress 55 +# define OBJ_pkcs9_unstructuredAddress OBJ_pkcs9,8L + +# define LN_pkcs9_extCertAttributes "extendedCertificateAttributes" +# define NID_pkcs9_extCertAttributes 56 +# define OBJ_pkcs9_extCertAttributes OBJ_pkcs9,9L + +# define SN_netscape "Netscape" +# define LN_netscape "Netscape Communications Corp." +# define NID_netscape 57 +# define OBJ_netscape 2L,16L,840L,1L,113730L + +# define SN_netscape_cert_extension "nsCertExt" +# define LN_netscape_cert_extension "Netscape Certificate Extension" +# define NID_netscape_cert_extension 58 +# define OBJ_netscape_cert_extension OBJ_netscape,1L + +# define SN_netscape_data_type "nsDataType" +# define LN_netscape_data_type "Netscape Data Type" +# define NID_netscape_data_type 59 +# define OBJ_netscape_data_type OBJ_netscape,2L + +# define SN_des_ede_cfb64 "DES-EDE-CFB" +# define LN_des_ede_cfb64 "des-ede-cfb" +# define NID_des_ede_cfb64 60 + +# define SN_des_ede3_cfb64 "DES-EDE3-CFB" +# define LN_des_ede3_cfb64 "des-ede3-cfb" +# define NID_des_ede3_cfb64 61 + +# define SN_des_ede_ofb64 "DES-EDE-OFB" +# define LN_des_ede_ofb64 "des-ede-ofb" +# define NID_des_ede_ofb64 62 + +# define SN_des_ede3_ofb64 "DES-EDE3-OFB" +# define LN_des_ede3_ofb64 "des-ede3-ofb" +# define NID_des_ede3_ofb64 63 + +/* I'm not sure about the object ID */ +# define SN_sha1 "SHA1" +# define LN_sha1 "sha1" +# define NID_sha1 64 +# define OBJ_sha1 OBJ_algorithm,26L +/* 28 Jun 1996 - eay */ +/* #define OBJ_sha1 1L,3L,14L,2L,26L,05L <- wrong */ + +# define SN_sha1WithRSAEncryption "RSA-SHA1" +# define LN_sha1WithRSAEncryption "sha1WithRSAEncryption" +# define NID_sha1WithRSAEncryption 65 +# define OBJ_sha1WithRSAEncryption OBJ_pkcs,1L,5L + +# define SN_dsaWithSHA "DSA-SHA" +# define LN_dsaWithSHA "dsaWithSHA" +# define NID_dsaWithSHA 66 +# define OBJ_dsaWithSHA OBJ_algorithm,13L + +# define SN_dsa_2 "DSA-old" +# define LN_dsa_2 "dsaEncryption-old" +# define NID_dsa_2 67 +# define OBJ_dsa_2 OBJ_algorithm,12L + +/* proposed by microsoft to RSA */ +# define SN_pbeWithSHA1AndRC2_CBC "PBE-SHA1-RC2-64" +# define LN_pbeWithSHA1AndRC2_CBC "pbeWithSHA1AndRC2-CBC" +# define NID_pbeWithSHA1AndRC2_CBC 68 +# define OBJ_pbeWithSHA1AndRC2_CBC OBJ_pkcs,5L,11L + +/* + * proposed by microsoft to RSA as pbeWithSHA1AndRC4: it is now defined + * explicitly in PKCS#5 v2.0 as id-PBKDF2 which is something completely + * different. + */ +# define LN_id_pbkdf2 "PBKDF2" +# define NID_id_pbkdf2 69 +# define OBJ_id_pbkdf2 OBJ_pkcs,5L,12L + +# define SN_dsaWithSHA1_2 "DSA-SHA1-old" +# define LN_dsaWithSHA1_2 "dsaWithSHA1-old" +# define NID_dsaWithSHA1_2 70 +/* Got this one from 'sdn706r20.pdf' which is actually an NSA document :-) */ +# define OBJ_dsaWithSHA1_2 OBJ_algorithm,27L + +# define SN_netscape_cert_type "nsCertType" +# define LN_netscape_cert_type "Netscape Cert Type" +# define NID_netscape_cert_type 71 +# define OBJ_netscape_cert_type OBJ_netscape_cert_extension,1L + +# define SN_netscape_base_url "nsBaseUrl" +# define LN_netscape_base_url "Netscape Base Url" +# define NID_netscape_base_url 72 +# define OBJ_netscape_base_url OBJ_netscape_cert_extension,2L + +# define SN_netscape_revocation_url "nsRevocationUrl" +# define LN_netscape_revocation_url "Netscape Revocation Url" +# define NID_netscape_revocation_url 73 +# define OBJ_netscape_revocation_url OBJ_netscape_cert_extension,3L + +# define SN_netscape_ca_revocation_url "nsCaRevocationUrl" +# define LN_netscape_ca_revocation_url "Netscape CA Revocation Url" +# define NID_netscape_ca_revocation_url 74 +# define OBJ_netscape_ca_revocation_url OBJ_netscape_cert_extension,4L + +# define SN_netscape_renewal_url "nsRenewalUrl" +# define LN_netscape_renewal_url "Netscape Renewal Url" +# define NID_netscape_renewal_url 75 +# define OBJ_netscape_renewal_url OBJ_netscape_cert_extension,7L + +# define SN_netscape_ca_policy_url "nsCaPolicyUrl" +# define LN_netscape_ca_policy_url "Netscape CA Policy Url" +# define NID_netscape_ca_policy_url 76 +# define OBJ_netscape_ca_policy_url OBJ_netscape_cert_extension,8L + +# define SN_netscape_ssl_server_name "nsSslServerName" +# define LN_netscape_ssl_server_name "Netscape SSL Server Name" +# define NID_netscape_ssl_server_name 77 +# define OBJ_netscape_ssl_server_name OBJ_netscape_cert_extension,12L + +# define SN_netscape_comment "nsComment" +# define LN_netscape_comment "Netscape Comment" +# define NID_netscape_comment 78 +# define OBJ_netscape_comment OBJ_netscape_cert_extension,13L + +# define SN_netscape_cert_sequence "nsCertSequence" +# define LN_netscape_cert_sequence "Netscape Certificate Sequence" +# define NID_netscape_cert_sequence 79 +# define OBJ_netscape_cert_sequence OBJ_netscape_data_type,5L + +# define SN_desx_cbc "DESX-CBC" +# define LN_desx_cbc "desx-cbc" +# define NID_desx_cbc 80 + +# define SN_id_ce "id-ce" +# define NID_id_ce 81 +# define OBJ_id_ce 2L,5L,29L + +# define SN_subject_key_identifier "subjectKeyIdentifier" +# define LN_subject_key_identifier "X509v3 Subject Key Identifier" +# define NID_subject_key_identifier 82 +# define OBJ_subject_key_identifier OBJ_id_ce,14L + +# define SN_key_usage "keyUsage" +# define LN_key_usage "X509v3 Key Usage" +# define NID_key_usage 83 +# define OBJ_key_usage OBJ_id_ce,15L + +# define SN_private_key_usage_period "privateKeyUsagePeriod" +# define LN_private_key_usage_period "X509v3 Private Key Usage Period" +# define NID_private_key_usage_period 84 +# define OBJ_private_key_usage_period OBJ_id_ce,16L + +# define SN_subject_alt_name "subjectAltName" +# define LN_subject_alt_name "X509v3 Subject Alternative Name" +# define NID_subject_alt_name 85 +# define OBJ_subject_alt_name OBJ_id_ce,17L + +# define SN_issuer_alt_name "issuerAltName" +# define LN_issuer_alt_name "X509v3 Issuer Alternative Name" +# define NID_issuer_alt_name 86 +# define OBJ_issuer_alt_name OBJ_id_ce,18L + +# define SN_basic_constraints "basicConstraints" +# define LN_basic_constraints "X509v3 Basic Constraints" +# define NID_basic_constraints 87 +# define OBJ_basic_constraints OBJ_id_ce,19L + +# define SN_crl_number "crlNumber" +# define LN_crl_number "X509v3 CRL Number" +# define NID_crl_number 88 +# define OBJ_crl_number OBJ_id_ce,20L + +# define SN_certificate_policies "certificatePolicies" +# define LN_certificate_policies "X509v3 Certificate Policies" +# define NID_certificate_policies 89 +# define OBJ_certificate_policies OBJ_id_ce,32L + +# define SN_authority_key_identifier "authorityKeyIdentifier" +# define LN_authority_key_identifier "X509v3 Authority Key Identifier" +# define NID_authority_key_identifier 90 +# define OBJ_authority_key_identifier OBJ_id_ce,35L + +# define SN_bf_cbc "BF-CBC" +# define LN_bf_cbc "bf-cbc" +# define NID_bf_cbc 91 +# define OBJ_bf_cbc 1L,3L,6L,1L,4L,1L,3029L,1L,2L + +# define SN_bf_ecb "BF-ECB" +# define LN_bf_ecb "bf-ecb" +# define NID_bf_ecb 92 + +# define SN_bf_cfb64 "BF-CFB" +# define LN_bf_cfb64 "bf-cfb" +# define NID_bf_cfb64 93 + +# define SN_bf_ofb64 "BF-OFB" +# define LN_bf_ofb64 "bf-ofb" +# define NID_bf_ofb64 94 + +# define SN_mdc2 "MDC2" +# define LN_mdc2 "mdc2" +# define NID_mdc2 95 +# define OBJ_mdc2 2L,5L,8L,3L,101L +/* An alternative? 1L,3L,14L,3L,2L,19L */ + +# define SN_mdc2WithRSA "RSA-MDC2" +# define LN_mdc2WithRSA "mdc2withRSA" +# define NID_mdc2WithRSA 96 +# define OBJ_mdc2WithRSA 2L,5L,8L,3L,100L + +# define SN_rc4_40 "RC4-40" +# define LN_rc4_40 "rc4-40" +# define NID_rc4_40 97 + +# define SN_rc2_40_cbc "RC2-40-CBC" +# define LN_rc2_40_cbc "rc2-40-cbc" +# define NID_rc2_40_cbc 98 + +# define SN_givenName "G" +# define LN_givenName "givenName" +# define NID_givenName 99 +# define OBJ_givenName OBJ_X509,42L + +# define SN_surname "S" +# define LN_surname "surname" +# define NID_surname 100 +# define OBJ_surname OBJ_X509,4L + +# define SN_initials "I" +# define LN_initials "initials" +# define NID_initials 101 +# define OBJ_initials OBJ_X509,43L + +# define SN_uniqueIdentifier "UID" +# define LN_uniqueIdentifier "uniqueIdentifier" +# define NID_uniqueIdentifier 102 +# define OBJ_uniqueIdentifier OBJ_X509,45L + +# define SN_crl_distribution_points "crlDistributionPoints" +# define LN_crl_distribution_points "X509v3 CRL Distribution Points" +# define NID_crl_distribution_points 103 +# define OBJ_crl_distribution_points OBJ_id_ce,31L + +# define SN_md5WithRSA "RSA-NP-MD5" +# define LN_md5WithRSA "md5WithRSA" +# define NID_md5WithRSA 104 +# define OBJ_md5WithRSA OBJ_algorithm,3L + +# define SN_serialNumber "SN" +# define LN_serialNumber "serialNumber" +# define NID_serialNumber 105 +# define OBJ_serialNumber OBJ_X509,5L + +# define SN_title "T" +# define LN_title "title" +# define NID_title 106 +# define OBJ_title OBJ_X509,12L + +# define SN_description "D" +# define LN_description "description" +# define NID_description 107 +# define OBJ_description OBJ_X509,13L + +/* CAST5 is CAST-128, I'm just sticking with the documentation */ +# define SN_cast5_cbc "CAST5-CBC" +# define LN_cast5_cbc "cast5-cbc" +# define NID_cast5_cbc 108 +# define OBJ_cast5_cbc 1L,2L,840L,113533L,7L,66L,10L + +# define SN_cast5_ecb "CAST5-ECB" +# define LN_cast5_ecb "cast5-ecb" +# define NID_cast5_ecb 109 + +# define SN_cast5_cfb64 "CAST5-CFB" +# define LN_cast5_cfb64 "cast5-cfb" +# define NID_cast5_cfb64 110 + +# define SN_cast5_ofb64 "CAST5-OFB" +# define LN_cast5_ofb64 "cast5-ofb" +# define NID_cast5_ofb64 111 + +# define LN_pbeWithMD5AndCast5_CBC "pbeWithMD5AndCast5CBC" +# define NID_pbeWithMD5AndCast5_CBC 112 +# define OBJ_pbeWithMD5AndCast5_CBC 1L,2L,840L,113533L,7L,66L,12L + +/*- + * This is one sun will soon be using :-( + * id-dsa-with-sha1 ID ::= { + * iso(1) member-body(2) us(840) x9-57 (10040) x9cm(4) 3 } + */ +# define SN_dsaWithSHA1 "DSA-SHA1" +# define LN_dsaWithSHA1 "dsaWithSHA1" +# define NID_dsaWithSHA1 113 +# define OBJ_dsaWithSHA1 1L,2L,840L,10040L,4L,3L + +# define NID_md5_sha1 114 +# define SN_md5_sha1 "MD5-SHA1" +# define LN_md5_sha1 "md5-sha1" + +# define SN_sha1WithRSA "RSA-SHA1-2" +# define LN_sha1WithRSA "sha1WithRSA" +# define NID_sha1WithRSA 115 +# define OBJ_sha1WithRSA OBJ_algorithm,29L + +# define SN_dsa "DSA" +# define LN_dsa "dsaEncryption" +# define NID_dsa 116 +# define OBJ_dsa 1L,2L,840L,10040L,4L,1L + +# define SN_ripemd160 "RIPEMD160" +# define LN_ripemd160 "ripemd160" +# define NID_ripemd160 117 +# define OBJ_ripemd160 1L,3L,36L,3L,2L,1L + +/* + * The name should actually be rsaSignatureWithripemd160, but I'm going to + * continue using the convention I'm using with the other ciphers + */ +# define SN_ripemd160WithRSA "RSA-RIPEMD160" +# define LN_ripemd160WithRSA "ripemd160WithRSA" +# define NID_ripemd160WithRSA 119 +# define OBJ_ripemd160WithRSA 1L,3L,36L,3L,3L,1L,2L + +/*- + * Taken from rfc2040 + * RC5_CBC_Parameters ::= SEQUENCE { + * version INTEGER (v1_0(16)), + * rounds INTEGER (8..127), + * blockSizeInBits INTEGER (64, 128), + * iv OCTET STRING OPTIONAL + * } + */ +# define SN_rc5_cbc "RC5-CBC" +# define LN_rc5_cbc "rc5-cbc" +# define NID_rc5_cbc 120 +# define OBJ_rc5_cbc OBJ_rsadsi,3L,8L + +# define SN_rc5_ecb "RC5-ECB" +# define LN_rc5_ecb "rc5-ecb" +# define NID_rc5_ecb 121 + +# define SN_rc5_cfb64 "RC5-CFB" +# define LN_rc5_cfb64 "rc5-cfb" +# define NID_rc5_cfb64 122 + +# define SN_rc5_ofb64 "RC5-OFB" +# define LN_rc5_ofb64 "rc5-ofb" +# define NID_rc5_ofb64 123 + +# define SN_rle_compression "RLE" +# define LN_rle_compression "run length compression" +# define NID_rle_compression 124 +# define OBJ_rle_compression 1L,1L,1L,1L,666L,1L + +# define SN_zlib_compression "ZLIB" +# define LN_zlib_compression "zlib compression" +# define NID_zlib_compression 125 +# define OBJ_zlib_compression 1L,1L,1L,1L,666L,2L + +# define SN_ext_key_usage "extendedKeyUsage" +# define LN_ext_key_usage "X509v3 Extended Key Usage" +# define NID_ext_key_usage 126 +# define OBJ_ext_key_usage OBJ_id_ce,37 + +# define SN_id_pkix "PKIX" +# define NID_id_pkix 127 +# define OBJ_id_pkix 1L,3L,6L,1L,5L,5L,7L + +# define SN_id_kp "id-kp" +# define NID_id_kp 128 +# define OBJ_id_kp OBJ_id_pkix,3L + +/* PKIX extended key usage OIDs */ + +# define SN_server_auth "serverAuth" +# define LN_server_auth "TLS Web Server Authentication" +# define NID_server_auth 129 +# define OBJ_server_auth OBJ_id_kp,1L + +# define SN_client_auth "clientAuth" +# define LN_client_auth "TLS Web Client Authentication" +# define NID_client_auth 130 +# define OBJ_client_auth OBJ_id_kp,2L + +# define SN_code_sign "codeSigning" +# define LN_code_sign "Code Signing" +# define NID_code_sign 131 +# define OBJ_code_sign OBJ_id_kp,3L + +# define SN_email_protect "emailProtection" +# define LN_email_protect "E-mail Protection" +# define NID_email_protect 132 +# define OBJ_email_protect OBJ_id_kp,4L + +# define SN_time_stamp "timeStamping" +# define LN_time_stamp "Time Stamping" +# define NID_time_stamp 133 +# define OBJ_time_stamp OBJ_id_kp,8L + +/* Additional extended key usage OIDs: Microsoft */ + +# define SN_ms_code_ind "msCodeInd" +# define LN_ms_code_ind "Microsoft Individual Code Signing" +# define NID_ms_code_ind 134 +# define OBJ_ms_code_ind 1L,3L,6L,1L,4L,1L,311L,2L,1L,21L + +# define SN_ms_code_com "msCodeCom" +# define LN_ms_code_com "Microsoft Commercial Code Signing" +# define NID_ms_code_com 135 +# define OBJ_ms_code_com 1L,3L,6L,1L,4L,1L,311L,2L,1L,22L + +# define SN_ms_ctl_sign "msCTLSign" +# define LN_ms_ctl_sign "Microsoft Trust List Signing" +# define NID_ms_ctl_sign 136 +# define OBJ_ms_ctl_sign 1L,3L,6L,1L,4L,1L,311L,10L,3L,1L + +# define SN_ms_sgc "msSGC" +# define LN_ms_sgc "Microsoft Server Gated Crypto" +# define NID_ms_sgc 137 +# define OBJ_ms_sgc 1L,3L,6L,1L,4L,1L,311L,10L,3L,3L + +# define SN_ms_efs "msEFS" +# define LN_ms_efs "Microsoft Encrypted File System" +# define NID_ms_efs 138 +# define OBJ_ms_efs 1L,3L,6L,1L,4L,1L,311L,10L,3L,4L + +/* Additional usage: Netscape */ + +# define SN_ns_sgc "nsSGC" +# define LN_ns_sgc "Netscape Server Gated Crypto" +# define NID_ns_sgc 139 +# define OBJ_ns_sgc OBJ_netscape,4L,1L + +# define SN_delta_crl "deltaCRL" +# define LN_delta_crl "X509v3 Delta CRL Indicator" +# define NID_delta_crl 140 +# define OBJ_delta_crl OBJ_id_ce,27L + +# define SN_crl_reason "CRLReason" +# define LN_crl_reason "CRL Reason Code" +# define NID_crl_reason 141 +# define OBJ_crl_reason OBJ_id_ce,21L + +# define SN_invalidity_date "invalidityDate" +# define LN_invalidity_date "Invalidity Date" +# define NID_invalidity_date 142 +# define OBJ_invalidity_date OBJ_id_ce,24L + +# define SN_sxnet "SXNetID" +# define LN_sxnet "Strong Extranet ID" +# define NID_sxnet 143 +# define OBJ_sxnet 1L,3L,101L,1L,4L,1L + +/* PKCS12 and related OBJECT IDENTIFIERS */ + +# define OBJ_pkcs12 OBJ_pkcs,12L +# define OBJ_pkcs12_pbeids OBJ_pkcs12, 1 + +# define SN_pbe_WithSHA1And128BitRC4 "PBE-SHA1-RC4-128" +# define LN_pbe_WithSHA1And128BitRC4 "pbeWithSHA1And128BitRC4" +# define NID_pbe_WithSHA1And128BitRC4 144 +# define OBJ_pbe_WithSHA1And128BitRC4 OBJ_pkcs12_pbeids, 1L + +# define SN_pbe_WithSHA1And40BitRC4 "PBE-SHA1-RC4-40" +# define LN_pbe_WithSHA1And40BitRC4 "pbeWithSHA1And40BitRC4" +# define NID_pbe_WithSHA1And40BitRC4 145 +# define OBJ_pbe_WithSHA1And40BitRC4 OBJ_pkcs12_pbeids, 2L + +# define SN_pbe_WithSHA1And3_Key_TripleDES_CBC "PBE-SHA1-3DES" +# define LN_pbe_WithSHA1And3_Key_TripleDES_CBC "pbeWithSHA1And3-KeyTripleDES-CBC" +# define NID_pbe_WithSHA1And3_Key_TripleDES_CBC 146 +# define OBJ_pbe_WithSHA1And3_Key_TripleDES_CBC OBJ_pkcs12_pbeids, 3L + +# define SN_pbe_WithSHA1And2_Key_TripleDES_CBC "PBE-SHA1-2DES" +# define LN_pbe_WithSHA1And2_Key_TripleDES_CBC "pbeWithSHA1And2-KeyTripleDES-CBC" +# define NID_pbe_WithSHA1And2_Key_TripleDES_CBC 147 +# define OBJ_pbe_WithSHA1And2_Key_TripleDES_CBC OBJ_pkcs12_pbeids, 4L + +# define SN_pbe_WithSHA1And128BitRC2_CBC "PBE-SHA1-RC2-128" +# define LN_pbe_WithSHA1And128BitRC2_CBC "pbeWithSHA1And128BitRC2-CBC" +# define NID_pbe_WithSHA1And128BitRC2_CBC 148 +# define OBJ_pbe_WithSHA1And128BitRC2_CBC OBJ_pkcs12_pbeids, 5L + +# define SN_pbe_WithSHA1And40BitRC2_CBC "PBE-SHA1-RC2-40" +# define LN_pbe_WithSHA1And40BitRC2_CBC "pbeWithSHA1And40BitRC2-CBC" +# define NID_pbe_WithSHA1And40BitRC2_CBC 149 +# define OBJ_pbe_WithSHA1And40BitRC2_CBC OBJ_pkcs12_pbeids, 6L + +# define OBJ_pkcs12_Version1 OBJ_pkcs12, 10L + +# define OBJ_pkcs12_BagIds OBJ_pkcs12_Version1, 1L + +# define LN_keyBag "keyBag" +# define NID_keyBag 150 +# define OBJ_keyBag OBJ_pkcs12_BagIds, 1L + +# define LN_pkcs8ShroudedKeyBag "pkcs8ShroudedKeyBag" +# define NID_pkcs8ShroudedKeyBag 151 +# define OBJ_pkcs8ShroudedKeyBag OBJ_pkcs12_BagIds, 2L + +# define LN_certBag "certBag" +# define NID_certBag 152 +# define OBJ_certBag OBJ_pkcs12_BagIds, 3L + +# define LN_crlBag "crlBag" +# define NID_crlBag 153 +# define OBJ_crlBag OBJ_pkcs12_BagIds, 4L + +# define LN_secretBag "secretBag" +# define NID_secretBag 154 +# define OBJ_secretBag OBJ_pkcs12_BagIds, 5L + +# define LN_safeContentsBag "safeContentsBag" +# define NID_safeContentsBag 155 +# define OBJ_safeContentsBag OBJ_pkcs12_BagIds, 6L + +# define LN_friendlyName "friendlyName" +# define NID_friendlyName 156 +# define OBJ_friendlyName OBJ_pkcs9, 20L + +# define LN_localKeyID "localKeyID" +# define NID_localKeyID 157 +# define OBJ_localKeyID OBJ_pkcs9, 21L + +# define OBJ_certTypes OBJ_pkcs9, 22L + +# define LN_x509Certificate "x509Certificate" +# define NID_x509Certificate 158 +# define OBJ_x509Certificate OBJ_certTypes, 1L + +# define LN_sdsiCertificate "sdsiCertificate" +# define NID_sdsiCertificate 159 +# define OBJ_sdsiCertificate OBJ_certTypes, 2L + +# define OBJ_crlTypes OBJ_pkcs9, 23L + +# define LN_x509Crl "x509Crl" +# define NID_x509Crl 160 +# define OBJ_x509Crl OBJ_crlTypes, 1L + +/* PKCS#5 v2 OIDs */ + +# define LN_pbes2 "PBES2" +# define NID_pbes2 161 +# define OBJ_pbes2 OBJ_pkcs,5L,13L + +# define LN_pbmac1 "PBMAC1" +# define NID_pbmac1 162 +# define OBJ_pbmac1 OBJ_pkcs,5L,14L + +# define LN_hmacWithSHA1 "hmacWithSHA1" +# define NID_hmacWithSHA1 163 +# define OBJ_hmacWithSHA1 OBJ_rsadsi,2L,7L + +/* Policy Qualifier Ids */ + +# define LN_id_qt_cps "Policy Qualifier CPS" +# define SN_id_qt_cps "id-qt-cps" +# define NID_id_qt_cps 164 +# define OBJ_id_qt_cps OBJ_id_pkix,2L,1L + +# define LN_id_qt_unotice "Policy Qualifier User Notice" +# define SN_id_qt_unotice "id-qt-unotice" +# define NID_id_qt_unotice 165 +# define OBJ_id_qt_unotice OBJ_id_pkix,2L,2L + +# define SN_rc2_64_cbc "RC2-64-CBC" +# define LN_rc2_64_cbc "rc2-64-cbc" +# define NID_rc2_64_cbc 166 + +# define SN_SMIMECapabilities "SMIME-CAPS" +# define LN_SMIMECapabilities "S/MIME Capabilities" +# define NID_SMIMECapabilities 167 +# define OBJ_SMIMECapabilities OBJ_pkcs9,15L + +# define SN_pbeWithMD2AndRC2_CBC "PBE-MD2-RC2-64" +# define LN_pbeWithMD2AndRC2_CBC "pbeWithMD2AndRC2-CBC" +# define NID_pbeWithMD2AndRC2_CBC 168 +# define OBJ_pbeWithMD2AndRC2_CBC OBJ_pkcs,5L,4L + +# define SN_pbeWithMD5AndRC2_CBC "PBE-MD5-RC2-64" +# define LN_pbeWithMD5AndRC2_CBC "pbeWithMD5AndRC2-CBC" +# define NID_pbeWithMD5AndRC2_CBC 169 +# define OBJ_pbeWithMD5AndRC2_CBC OBJ_pkcs,5L,6L + +# define SN_pbeWithSHA1AndDES_CBC "PBE-SHA1-DES" +# define LN_pbeWithSHA1AndDES_CBC "pbeWithSHA1AndDES-CBC" +# define NID_pbeWithSHA1AndDES_CBC 170 +# define OBJ_pbeWithSHA1AndDES_CBC OBJ_pkcs,5L,10L + +/* Extension request OIDs */ + +# define LN_ms_ext_req "Microsoft Extension Request" +# define SN_ms_ext_req "msExtReq" +# define NID_ms_ext_req 171 +# define OBJ_ms_ext_req 1L,3L,6L,1L,4L,1L,311L,2L,1L,14L + +# define LN_ext_req "Extension Request" +# define SN_ext_req "extReq" +# define NID_ext_req 172 +# define OBJ_ext_req OBJ_pkcs9,14L + +# define SN_name "name" +# define LN_name "name" +# define NID_name 173 +# define OBJ_name OBJ_X509,41L + +# define SN_dnQualifier "dnQualifier" +# define LN_dnQualifier "dnQualifier" +# define NID_dnQualifier 174 +# define OBJ_dnQualifier OBJ_X509,46L + +# define SN_id_pe "id-pe" +# define NID_id_pe 175 +# define OBJ_id_pe OBJ_id_pkix,1L + +# define SN_id_ad "id-ad" +# define NID_id_ad 176 +# define OBJ_id_ad OBJ_id_pkix,48L + +# define SN_info_access "authorityInfoAccess" +# define LN_info_access "Authority Information Access" +# define NID_info_access 177 +# define OBJ_info_access OBJ_id_pe,1L + +# define SN_ad_OCSP "OCSP" +# define LN_ad_OCSP "OCSP" +# define NID_ad_OCSP 178 +# define OBJ_ad_OCSP OBJ_id_ad,1L + +# define SN_ad_ca_issuers "caIssuers" +# define LN_ad_ca_issuers "CA Issuers" +# define NID_ad_ca_issuers 179 +# define OBJ_ad_ca_issuers OBJ_id_ad,2L + +# define SN_OCSP_sign "OCSPSigning" +# define LN_OCSP_sign "OCSP Signing" +# define NID_OCSP_sign 180 +# define OBJ_OCSP_sign OBJ_id_kp,9L +# endif /* USE_OBJ_MAC */ + +# include +# include + +# define OBJ_NAME_TYPE_UNDEF 0x00 +# define OBJ_NAME_TYPE_MD_METH 0x01 +# define OBJ_NAME_TYPE_CIPHER_METH 0x02 +# define OBJ_NAME_TYPE_PKEY_METH 0x03 +# define OBJ_NAME_TYPE_COMP_METH 0x04 +# define OBJ_NAME_TYPE_NUM 0x05 + +# define OBJ_NAME_ALIAS 0x8000 + +# define OBJ_BSEARCH_VALUE_ON_NOMATCH 0x01 +# define OBJ_BSEARCH_FIRST_VALUE_ON_MATCH 0x02 + + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct obj_name_st { + int type; + int alias; + const char *name; + const char *data; +} OBJ_NAME; + +# define OBJ_create_and_add_object(a,b,c) OBJ_create(a,b,c) + +int OBJ_NAME_init(void); +int OBJ_NAME_new_index(unsigned long (*hash_func) (const char *), + int (*cmp_func) (const char *, const char *), + void (*free_func) (const char *, int, const char *)); +const char *OBJ_NAME_get(const char *name, int type); +int OBJ_NAME_add(const char *name, int type, const char *data); +int OBJ_NAME_remove(const char *name, int type); +void OBJ_NAME_cleanup(int type); /* -1 for everything */ +void OBJ_NAME_do_all(int type, void (*fn) (const OBJ_NAME *, void *arg), + void *arg); +void OBJ_NAME_do_all_sorted(int type, + void (*fn) (const OBJ_NAME *, void *arg), + void *arg); + +ASN1_OBJECT *OBJ_dup(const ASN1_OBJECT *o); +ASN1_OBJECT *OBJ_nid2obj(int n); +const char *OBJ_nid2ln(int n); +const char *OBJ_nid2sn(int n); +int OBJ_obj2nid(const ASN1_OBJECT *o); +ASN1_OBJECT *OBJ_txt2obj(const char *s, int no_name); +int OBJ_obj2txt(char *buf, int buf_len, const ASN1_OBJECT *a, int no_name); +int OBJ_txt2nid(const char *s); +int OBJ_ln2nid(const char *s); +int OBJ_sn2nid(const char *s); +int OBJ_cmp(const ASN1_OBJECT *a, const ASN1_OBJECT *b); +const void *OBJ_bsearch_(const void *key, const void *base, int num, int size, + int (*cmp) (const void *, const void *)); +const void *OBJ_bsearch_ex_(const void *key, const void *base, int num, + int size, + int (*cmp) (const void *, const void *), + int flags); + +# define _DECLARE_OBJ_BSEARCH_CMP_FN(scope, type1, type2, nm) \ + static int nm##_cmp_BSEARCH_CMP_FN(const void *, const void *); \ + static int nm##_cmp(type1 const *, type2 const *); \ + scope type2 * OBJ_bsearch_##nm(type1 *key, type2 const *base, int num) + +# define DECLARE_OBJ_BSEARCH_CMP_FN(type1, type2, cmp) \ + _DECLARE_OBJ_BSEARCH_CMP_FN(static, type1, type2, cmp) +# define DECLARE_OBJ_BSEARCH_GLOBAL_CMP_FN(type1, type2, nm) \ + type2 * OBJ_bsearch_##nm(type1 *key, type2 const *base, int num) + +/*- + * Unsolved problem: if a type is actually a pointer type, like + * nid_triple is, then its impossible to get a const where you need + * it. Consider: + * + * typedef int nid_triple[3]; + * const void *a_; + * const nid_triple const *a = a_; + * + * The assignement discards a const because what you really want is: + * + * const int const * const *a = a_; + * + * But if you do that, you lose the fact that a is an array of 3 ints, + * which breaks comparison functions. + * + * Thus we end up having to cast, sadly, or unpack the + * declarations. Or, as I finally did in this case, delcare nid_triple + * to be a struct, which it should have been in the first place. + * + * Ben, August 2008. + * + * Also, strictly speaking not all types need be const, but handling + * the non-constness means a lot of complication, and in practice + * comparison routines do always not touch their arguments. + */ + +# define IMPLEMENT_OBJ_BSEARCH_CMP_FN(type1, type2, nm) \ + static int nm##_cmp_BSEARCH_CMP_FN(const void *a_, const void *b_) \ + { \ + type1 const *a = a_; \ + type2 const *b = b_; \ + return nm##_cmp(a,b); \ + } \ + static type2 *OBJ_bsearch_##nm(type1 *key, type2 const *base, int num) \ + { \ + return (type2 *)OBJ_bsearch_(key, base, num, sizeof(type2), \ + nm##_cmp_BSEARCH_CMP_FN); \ + } \ + extern void dummy_prototype(void) + +# define IMPLEMENT_OBJ_BSEARCH_GLOBAL_CMP_FN(type1, type2, nm) \ + static int nm##_cmp_BSEARCH_CMP_FN(const void *a_, const void *b_) \ + { \ + type1 const *a = a_; \ + type2 const *b = b_; \ + return nm##_cmp(a,b); \ + } \ + type2 *OBJ_bsearch_##nm(type1 *key, type2 const *base, int num) \ + { \ + return (type2 *)OBJ_bsearch_(key, base, num, sizeof(type2), \ + nm##_cmp_BSEARCH_CMP_FN); \ + } \ + extern void dummy_prototype(void) + +# define OBJ_bsearch(type1,key,type2,base,num,cmp) \ + ((type2 *)OBJ_bsearch_(CHECKED_PTR_OF(type1,key),CHECKED_PTR_OF(type2,base), \ + num,sizeof(type2), \ + ((void)CHECKED_PTR_OF(type1,cmp##_type_1), \ + (void)CHECKED_PTR_OF(type2,cmp##_type_2), \ + cmp##_BSEARCH_CMP_FN))) + +# define OBJ_bsearch_ex(type1,key,type2,base,num,cmp,flags) \ + ((type2 *)OBJ_bsearch_ex_(CHECKED_PTR_OF(type1,key),CHECKED_PTR_OF(type2,base), \ + num,sizeof(type2), \ + ((void)CHECKED_PTR_OF(type1,cmp##_type_1), \ + (void)type_2=CHECKED_PTR_OF(type2,cmp##_type_2), \ + cmp##_BSEARCH_CMP_FN)),flags) + +int OBJ_new_nid(int num); +int OBJ_add_object(const ASN1_OBJECT *obj); +int OBJ_create(const char *oid, const char *sn, const char *ln); +void OBJ_cleanup(void); +int OBJ_create_objects(BIO *in); + +int OBJ_find_sigid_algs(int signid, int *pdig_nid, int *ppkey_nid); +int OBJ_find_sigid_by_algs(int *psignid, int dig_nid, int pkey_nid); +int OBJ_add_sigid(int signid, int dig_id, int pkey_id); +void OBJ_sigid_free(void); + +extern int obj_cleanup_defer; +void check_defer(int nid); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_OBJ_strings(void); + +/* Error codes for the OBJ functions. */ + +/* Function codes. */ +# define OBJ_F_OBJ_ADD_OBJECT 105 +# define OBJ_F_OBJ_CREATE 100 +# define OBJ_F_OBJ_DUP 101 +# define OBJ_F_OBJ_NAME_NEW_INDEX 106 +# define OBJ_F_OBJ_NID2LN 102 +# define OBJ_F_OBJ_NID2OBJ 103 +# define OBJ_F_OBJ_NID2SN 104 + +/* Reason codes. */ +# define OBJ_R_MALLOC_FAILURE 100 +# define OBJ_R_UNKNOWN_NID 101 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/win/openssl/include/openssl/ocsp.h b/hdssd/external/win/openssl/include/openssl/ocsp.h new file mode 100644 index 0000000..ca2ee76 --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/ocsp.h @@ -0,0 +1,637 @@ +/* ocsp.h */ +/* + * Written by Tom Titchener for the OpenSSL + * project. + */ + +/* + * History: This file was transfered to Richard Levitte from CertCo by Kathy + * Weinhold in mid-spring 2000 to be included in OpenSSL or released as a + * patch kit. + */ + +/* ==================================================================== + * Copyright (c) 1998-2000 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_OCSP_H +# define HEADER_OCSP_H + +# include +# include +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Various flags and values */ + +# define OCSP_DEFAULT_NONCE_LENGTH 16 + +# define OCSP_NOCERTS 0x1 +# define OCSP_NOINTERN 0x2 +# define OCSP_NOSIGS 0x4 +# define OCSP_NOCHAIN 0x8 +# define OCSP_NOVERIFY 0x10 +# define OCSP_NOEXPLICIT 0x20 +# define OCSP_NOCASIGN 0x40 +# define OCSP_NODELEGATED 0x80 +# define OCSP_NOCHECKS 0x100 +# define OCSP_TRUSTOTHER 0x200 +# define OCSP_RESPID_KEY 0x400 +# define OCSP_NOTIME 0x800 + +/*- CertID ::= SEQUENCE { + * hashAlgorithm AlgorithmIdentifier, + * issuerNameHash OCTET STRING, -- Hash of Issuer's DN + * issuerKeyHash OCTET STRING, -- Hash of Issuers public key (excluding the tag & length fields) + * serialNumber CertificateSerialNumber } + */ +typedef struct ocsp_cert_id_st { + X509_ALGOR *hashAlgorithm; + ASN1_OCTET_STRING *issuerNameHash; + ASN1_OCTET_STRING *issuerKeyHash; + ASN1_INTEGER *serialNumber; +} OCSP_CERTID; + +DECLARE_STACK_OF(OCSP_CERTID) + +/*- Request ::= SEQUENCE { + * reqCert CertID, + * singleRequestExtensions [0] EXPLICIT Extensions OPTIONAL } + */ +typedef struct ocsp_one_request_st { + OCSP_CERTID *reqCert; + STACK_OF(X509_EXTENSION) *singleRequestExtensions; +} OCSP_ONEREQ; + +DECLARE_STACK_OF(OCSP_ONEREQ) +DECLARE_ASN1_SET_OF(OCSP_ONEREQ) + +/*- TBSRequest ::= SEQUENCE { + * version [0] EXPLICIT Version DEFAULT v1, + * requestorName [1] EXPLICIT GeneralName OPTIONAL, + * requestList SEQUENCE OF Request, + * requestExtensions [2] EXPLICIT Extensions OPTIONAL } + */ +typedef struct ocsp_req_info_st { + ASN1_INTEGER *version; + GENERAL_NAME *requestorName; + STACK_OF(OCSP_ONEREQ) *requestList; + STACK_OF(X509_EXTENSION) *requestExtensions; +} OCSP_REQINFO; + +/*- Signature ::= SEQUENCE { + * signatureAlgorithm AlgorithmIdentifier, + * signature BIT STRING, + * certs [0] EXPLICIT SEQUENCE OF Certificate OPTIONAL } + */ +typedef struct ocsp_signature_st { + X509_ALGOR *signatureAlgorithm; + ASN1_BIT_STRING *signature; + STACK_OF(X509) *certs; +} OCSP_SIGNATURE; + +/*- OCSPRequest ::= SEQUENCE { + * tbsRequest TBSRequest, + * optionalSignature [0] EXPLICIT Signature OPTIONAL } + */ +typedef struct ocsp_request_st { + OCSP_REQINFO *tbsRequest; + OCSP_SIGNATURE *optionalSignature; /* OPTIONAL */ +} OCSP_REQUEST; + +/*- OCSPResponseStatus ::= ENUMERATED { + * successful (0), --Response has valid confirmations + * malformedRequest (1), --Illegal confirmation request + * internalError (2), --Internal error in issuer + * tryLater (3), --Try again later + * --(4) is not used + * sigRequired (5), --Must sign the request + * unauthorized (6) --Request unauthorized + * } + */ +# define OCSP_RESPONSE_STATUS_SUCCESSFUL 0 +# define OCSP_RESPONSE_STATUS_MALFORMEDREQUEST 1 +# define OCSP_RESPONSE_STATUS_INTERNALERROR 2 +# define OCSP_RESPONSE_STATUS_TRYLATER 3 +# define OCSP_RESPONSE_STATUS_SIGREQUIRED 5 +# define OCSP_RESPONSE_STATUS_UNAUTHORIZED 6 + +/*- ResponseBytes ::= SEQUENCE { + * responseType OBJECT IDENTIFIER, + * response OCTET STRING } + */ +typedef struct ocsp_resp_bytes_st { + ASN1_OBJECT *responseType; + ASN1_OCTET_STRING *response; +} OCSP_RESPBYTES; + +/*- OCSPResponse ::= SEQUENCE { + * responseStatus OCSPResponseStatus, + * responseBytes [0] EXPLICIT ResponseBytes OPTIONAL } + */ +struct ocsp_response_st { + ASN1_ENUMERATED *responseStatus; + OCSP_RESPBYTES *responseBytes; +}; + +/*- ResponderID ::= CHOICE { + * byName [1] Name, + * byKey [2] KeyHash } + */ +# define V_OCSP_RESPID_NAME 0 +# define V_OCSP_RESPID_KEY 1 +struct ocsp_responder_id_st { + int type; + union { + X509_NAME *byName; + ASN1_OCTET_STRING *byKey; + } value; +}; + +DECLARE_STACK_OF(OCSP_RESPID) +DECLARE_ASN1_FUNCTIONS(OCSP_RESPID) + +/*- KeyHash ::= OCTET STRING --SHA-1 hash of responder's public key + * --(excluding the tag and length fields) + */ + +/*- RevokedInfo ::= SEQUENCE { + * revocationTime GeneralizedTime, + * revocationReason [0] EXPLICIT CRLReason OPTIONAL } + */ +typedef struct ocsp_revoked_info_st { + ASN1_GENERALIZEDTIME *revocationTime; + ASN1_ENUMERATED *revocationReason; +} OCSP_REVOKEDINFO; + +/*- CertStatus ::= CHOICE { + * good [0] IMPLICIT NULL, + * revoked [1] IMPLICIT RevokedInfo, + * unknown [2] IMPLICIT UnknownInfo } + */ +# define V_OCSP_CERTSTATUS_GOOD 0 +# define V_OCSP_CERTSTATUS_REVOKED 1 +# define V_OCSP_CERTSTATUS_UNKNOWN 2 +typedef struct ocsp_cert_status_st { + int type; + union { + ASN1_NULL *good; + OCSP_REVOKEDINFO *revoked; + ASN1_NULL *unknown; + } value; +} OCSP_CERTSTATUS; + +/*- SingleResponse ::= SEQUENCE { + * certID CertID, + * certStatus CertStatus, + * thisUpdate GeneralizedTime, + * nextUpdate [0] EXPLICIT GeneralizedTime OPTIONAL, + * singleExtensions [1] EXPLICIT Extensions OPTIONAL } + */ +typedef struct ocsp_single_response_st { + OCSP_CERTID *certId; + OCSP_CERTSTATUS *certStatus; + ASN1_GENERALIZEDTIME *thisUpdate; + ASN1_GENERALIZEDTIME *nextUpdate; + STACK_OF(X509_EXTENSION) *singleExtensions; +} OCSP_SINGLERESP; + +DECLARE_STACK_OF(OCSP_SINGLERESP) +DECLARE_ASN1_SET_OF(OCSP_SINGLERESP) + +/*- ResponseData ::= SEQUENCE { + * version [0] EXPLICIT Version DEFAULT v1, + * responderID ResponderID, + * producedAt GeneralizedTime, + * responses SEQUENCE OF SingleResponse, + * responseExtensions [1] EXPLICIT Extensions OPTIONAL } + */ +typedef struct ocsp_response_data_st { + ASN1_INTEGER *version; + OCSP_RESPID *responderId; + ASN1_GENERALIZEDTIME *producedAt; + STACK_OF(OCSP_SINGLERESP) *responses; + STACK_OF(X509_EXTENSION) *responseExtensions; +} OCSP_RESPDATA; + +/*- BasicOCSPResponse ::= SEQUENCE { + * tbsResponseData ResponseData, + * signatureAlgorithm AlgorithmIdentifier, + * signature BIT STRING, + * certs [0] EXPLICIT SEQUENCE OF Certificate OPTIONAL } + */ + /* + * Note 1: The value for "signature" is specified in the OCSP rfc2560 as + * follows: "The value for the signature SHALL be computed on the hash of + * the DER encoding ResponseData." This means that you must hash the + * DER-encoded tbsResponseData, and then run it through a crypto-signing + * function, which will (at least w/RSA) do a hash-'n'-private-encrypt + * operation. This seems a bit odd, but that's the spec. Also note that + * the data structures do not leave anywhere to independently specify the + * algorithm used for the initial hash. So, we look at the + * signature-specification algorithm, and try to do something intelligent. + * -- Kathy Weinhold, CertCo + */ + /* + * Note 2: It seems that the mentioned passage from RFC 2560 (section + * 4.2.1) is open for interpretation. I've done tests against another + * responder, and found that it doesn't do the double hashing that the RFC + * seems to say one should. Therefore, all relevant functions take a flag + * saying which variant should be used. -- Richard Levitte, OpenSSL team + * and CeloCom + */ +typedef struct ocsp_basic_response_st { + OCSP_RESPDATA *tbsResponseData; + X509_ALGOR *signatureAlgorithm; + ASN1_BIT_STRING *signature; + STACK_OF(X509) *certs; +} OCSP_BASICRESP; + +/*- + * CRLReason ::= ENUMERATED { + * unspecified (0), + * keyCompromise (1), + * cACompromise (2), + * affiliationChanged (3), + * superseded (4), + * cessationOfOperation (5), + * certificateHold (6), + * removeFromCRL (8) } + */ +# define OCSP_REVOKED_STATUS_NOSTATUS -1 +# define OCSP_REVOKED_STATUS_UNSPECIFIED 0 +# define OCSP_REVOKED_STATUS_KEYCOMPROMISE 1 +# define OCSP_REVOKED_STATUS_CACOMPROMISE 2 +# define OCSP_REVOKED_STATUS_AFFILIATIONCHANGED 3 +# define OCSP_REVOKED_STATUS_SUPERSEDED 4 +# define OCSP_REVOKED_STATUS_CESSATIONOFOPERATION 5 +# define OCSP_REVOKED_STATUS_CERTIFICATEHOLD 6 +# define OCSP_REVOKED_STATUS_REMOVEFROMCRL 8 + +/*- + * CrlID ::= SEQUENCE { + * crlUrl [0] EXPLICIT IA5String OPTIONAL, + * crlNum [1] EXPLICIT INTEGER OPTIONAL, + * crlTime [2] EXPLICIT GeneralizedTime OPTIONAL } + */ +typedef struct ocsp_crl_id_st { + ASN1_IA5STRING *crlUrl; + ASN1_INTEGER *crlNum; + ASN1_GENERALIZEDTIME *crlTime; +} OCSP_CRLID; + +/*- + * ServiceLocator ::= SEQUENCE { + * issuer Name, + * locator AuthorityInfoAccessSyntax OPTIONAL } + */ +typedef struct ocsp_service_locator_st { + X509_NAME *issuer; + STACK_OF(ACCESS_DESCRIPTION) *locator; +} OCSP_SERVICELOC; + +# define PEM_STRING_OCSP_REQUEST "OCSP REQUEST" +# define PEM_STRING_OCSP_RESPONSE "OCSP RESPONSE" + +# define d2i_OCSP_REQUEST_bio(bp,p) ASN1_d2i_bio_of(OCSP_REQUEST,OCSP_REQUEST_new,d2i_OCSP_REQUEST,bp,p) + +# define d2i_OCSP_RESPONSE_bio(bp,p) ASN1_d2i_bio_of(OCSP_RESPONSE,OCSP_RESPONSE_new,d2i_OCSP_RESPONSE,bp,p) + +# define PEM_read_bio_OCSP_REQUEST(bp,x,cb) (OCSP_REQUEST *)PEM_ASN1_read_bio( \ + (char *(*)())d2i_OCSP_REQUEST,PEM_STRING_OCSP_REQUEST,bp,(char **)x,cb,NULL) + +# define PEM_read_bio_OCSP_RESPONSE(bp,x,cb)(OCSP_RESPONSE *)PEM_ASN1_read_bio(\ + (char *(*)())d2i_OCSP_RESPONSE,PEM_STRING_OCSP_RESPONSE,bp,(char **)x,cb,NULL) + +# define PEM_write_bio_OCSP_REQUEST(bp,o) \ + PEM_ASN1_write_bio((int (*)())i2d_OCSP_REQUEST,PEM_STRING_OCSP_REQUEST,\ + bp,(char *)o, NULL,NULL,0,NULL,NULL) + +# define PEM_write_bio_OCSP_RESPONSE(bp,o) \ + PEM_ASN1_write_bio((int (*)())i2d_OCSP_RESPONSE,PEM_STRING_OCSP_RESPONSE,\ + bp,(char *)o, NULL,NULL,0,NULL,NULL) + +# define i2d_OCSP_RESPONSE_bio(bp,o) ASN1_i2d_bio_of(OCSP_RESPONSE,i2d_OCSP_RESPONSE,bp,o) + +# define i2d_OCSP_REQUEST_bio(bp,o) ASN1_i2d_bio_of(OCSP_REQUEST,i2d_OCSP_REQUEST,bp,o) + +# define OCSP_REQUEST_sign(o,pkey,md) \ + ASN1_item_sign(ASN1_ITEM_rptr(OCSP_REQINFO),\ + o->optionalSignature->signatureAlgorithm,NULL,\ + o->optionalSignature->signature,o->tbsRequest,pkey,md) + +# define OCSP_BASICRESP_sign(o,pkey,md,d) \ + ASN1_item_sign(ASN1_ITEM_rptr(OCSP_RESPDATA),o->signatureAlgorithm,NULL,\ + o->signature,o->tbsResponseData,pkey,md) + +# define OCSP_REQUEST_verify(a,r) ASN1_item_verify(ASN1_ITEM_rptr(OCSP_REQINFO),\ + a->optionalSignature->signatureAlgorithm,\ + a->optionalSignature->signature,a->tbsRequest,r) + +# define OCSP_BASICRESP_verify(a,r,d) ASN1_item_verify(ASN1_ITEM_rptr(OCSP_RESPDATA),\ + a->signatureAlgorithm,a->signature,a->tbsResponseData,r) + +# define ASN1_BIT_STRING_digest(data,type,md,len) \ + ASN1_item_digest(ASN1_ITEM_rptr(ASN1_BIT_STRING),type,data,md,len) + +# define OCSP_CERTSTATUS_dup(cs)\ + (OCSP_CERTSTATUS*)ASN1_dup((int(*)())i2d_OCSP_CERTSTATUS,\ + (char *(*)())d2i_OCSP_CERTSTATUS,(char *)(cs)) + +OCSP_CERTID *OCSP_CERTID_dup(OCSP_CERTID *id); + +OCSP_RESPONSE *OCSP_sendreq_bio(BIO *b, const char *path, OCSP_REQUEST *req); +OCSP_REQ_CTX *OCSP_sendreq_new(BIO *io, const char *path, OCSP_REQUEST *req, + int maxline); +int OCSP_REQ_CTX_nbio(OCSP_REQ_CTX *rctx); +int OCSP_sendreq_nbio(OCSP_RESPONSE **presp, OCSP_REQ_CTX *rctx); +OCSP_REQ_CTX *OCSP_REQ_CTX_new(BIO *io, int maxline); +void OCSP_REQ_CTX_free(OCSP_REQ_CTX *rctx); +void OCSP_set_max_response_length(OCSP_REQ_CTX *rctx, unsigned long len); +int OCSP_REQ_CTX_i2d(OCSP_REQ_CTX *rctx, const ASN1_ITEM *it, + ASN1_VALUE *val); +int OCSP_REQ_CTX_nbio_d2i(OCSP_REQ_CTX *rctx, ASN1_VALUE **pval, + const ASN1_ITEM *it); +BIO *OCSP_REQ_CTX_get0_mem_bio(OCSP_REQ_CTX *rctx); +int OCSP_REQ_CTX_i2d(OCSP_REQ_CTX *rctx, const ASN1_ITEM *it, + ASN1_VALUE *val); +int OCSP_REQ_CTX_http(OCSP_REQ_CTX *rctx, const char *op, const char *path); +int OCSP_REQ_CTX_set1_req(OCSP_REQ_CTX *rctx, OCSP_REQUEST *req); +int OCSP_REQ_CTX_add1_header(OCSP_REQ_CTX *rctx, + const char *name, const char *value); + +OCSP_CERTID *OCSP_cert_to_id(const EVP_MD *dgst, X509 *subject, X509 *issuer); + +OCSP_CERTID *OCSP_cert_id_new(const EVP_MD *dgst, + X509_NAME *issuerName, + ASN1_BIT_STRING *issuerKey, + ASN1_INTEGER *serialNumber); + +OCSP_ONEREQ *OCSP_request_add0_id(OCSP_REQUEST *req, OCSP_CERTID *cid); + +int OCSP_request_add1_nonce(OCSP_REQUEST *req, unsigned char *val, int len); +int OCSP_basic_add1_nonce(OCSP_BASICRESP *resp, unsigned char *val, int len); +int OCSP_check_nonce(OCSP_REQUEST *req, OCSP_BASICRESP *bs); +int OCSP_copy_nonce(OCSP_BASICRESP *resp, OCSP_REQUEST *req); + +int OCSP_request_set1_name(OCSP_REQUEST *req, X509_NAME *nm); +int OCSP_request_add1_cert(OCSP_REQUEST *req, X509 *cert); + +int OCSP_request_sign(OCSP_REQUEST *req, + X509 *signer, + EVP_PKEY *key, + const EVP_MD *dgst, + STACK_OF(X509) *certs, unsigned long flags); + +int OCSP_response_status(OCSP_RESPONSE *resp); +OCSP_BASICRESP *OCSP_response_get1_basic(OCSP_RESPONSE *resp); + +int OCSP_resp_count(OCSP_BASICRESP *bs); +OCSP_SINGLERESP *OCSP_resp_get0(OCSP_BASICRESP *bs, int idx); +int OCSP_resp_find(OCSP_BASICRESP *bs, OCSP_CERTID *id, int last); +int OCSP_single_get0_status(OCSP_SINGLERESP *single, int *reason, + ASN1_GENERALIZEDTIME **revtime, + ASN1_GENERALIZEDTIME **thisupd, + ASN1_GENERALIZEDTIME **nextupd); +int OCSP_resp_find_status(OCSP_BASICRESP *bs, OCSP_CERTID *id, int *status, + int *reason, + ASN1_GENERALIZEDTIME **revtime, + ASN1_GENERALIZEDTIME **thisupd, + ASN1_GENERALIZEDTIME **nextupd); +int OCSP_check_validity(ASN1_GENERALIZEDTIME *thisupd, + ASN1_GENERALIZEDTIME *nextupd, long sec, long maxsec); + +int OCSP_request_verify(OCSP_REQUEST *req, STACK_OF(X509) *certs, + X509_STORE *store, unsigned long flags); + +int OCSP_parse_url(const char *url, char **phost, char **pport, char **ppath, + int *pssl); + +int OCSP_id_issuer_cmp(OCSP_CERTID *a, OCSP_CERTID *b); +int OCSP_id_cmp(OCSP_CERTID *a, OCSP_CERTID *b); + +int OCSP_request_onereq_count(OCSP_REQUEST *req); +OCSP_ONEREQ *OCSP_request_onereq_get0(OCSP_REQUEST *req, int i); +OCSP_CERTID *OCSP_onereq_get0_id(OCSP_ONEREQ *one); +int OCSP_id_get0_info(ASN1_OCTET_STRING **piNameHash, ASN1_OBJECT **pmd, + ASN1_OCTET_STRING **pikeyHash, + ASN1_INTEGER **pserial, OCSP_CERTID *cid); +int OCSP_request_is_signed(OCSP_REQUEST *req); +OCSP_RESPONSE *OCSP_response_create(int status, OCSP_BASICRESP *bs); +OCSP_SINGLERESP *OCSP_basic_add1_status(OCSP_BASICRESP *rsp, + OCSP_CERTID *cid, + int status, int reason, + ASN1_TIME *revtime, + ASN1_TIME *thisupd, + ASN1_TIME *nextupd); +int OCSP_basic_add1_cert(OCSP_BASICRESP *resp, X509 *cert); +int OCSP_basic_sign(OCSP_BASICRESP *brsp, + X509 *signer, EVP_PKEY *key, const EVP_MD *dgst, + STACK_OF(X509) *certs, unsigned long flags); + +X509_EXTENSION *OCSP_crlID_new(char *url, long *n, char *tim); + +X509_EXTENSION *OCSP_accept_responses_new(char **oids); + +X509_EXTENSION *OCSP_archive_cutoff_new(char *tim); + +X509_EXTENSION *OCSP_url_svcloc_new(X509_NAME *issuer, char **urls); + +int OCSP_REQUEST_get_ext_count(OCSP_REQUEST *x); +int OCSP_REQUEST_get_ext_by_NID(OCSP_REQUEST *x, int nid, int lastpos); +int OCSP_REQUEST_get_ext_by_OBJ(OCSP_REQUEST *x, ASN1_OBJECT *obj, + int lastpos); +int OCSP_REQUEST_get_ext_by_critical(OCSP_REQUEST *x, int crit, int lastpos); +X509_EXTENSION *OCSP_REQUEST_get_ext(OCSP_REQUEST *x, int loc); +X509_EXTENSION *OCSP_REQUEST_delete_ext(OCSP_REQUEST *x, int loc); +void *OCSP_REQUEST_get1_ext_d2i(OCSP_REQUEST *x, int nid, int *crit, + int *idx); +int OCSP_REQUEST_add1_ext_i2d(OCSP_REQUEST *x, int nid, void *value, int crit, + unsigned long flags); +int OCSP_REQUEST_add_ext(OCSP_REQUEST *x, X509_EXTENSION *ex, int loc); + +int OCSP_ONEREQ_get_ext_count(OCSP_ONEREQ *x); +int OCSP_ONEREQ_get_ext_by_NID(OCSP_ONEREQ *x, int nid, int lastpos); +int OCSP_ONEREQ_get_ext_by_OBJ(OCSP_ONEREQ *x, ASN1_OBJECT *obj, int lastpos); +int OCSP_ONEREQ_get_ext_by_critical(OCSP_ONEREQ *x, int crit, int lastpos); +X509_EXTENSION *OCSP_ONEREQ_get_ext(OCSP_ONEREQ *x, int loc); +X509_EXTENSION *OCSP_ONEREQ_delete_ext(OCSP_ONEREQ *x, int loc); +void *OCSP_ONEREQ_get1_ext_d2i(OCSP_ONEREQ *x, int nid, int *crit, int *idx); +int OCSP_ONEREQ_add1_ext_i2d(OCSP_ONEREQ *x, int nid, void *value, int crit, + unsigned long flags); +int OCSP_ONEREQ_add_ext(OCSP_ONEREQ *x, X509_EXTENSION *ex, int loc); + +int OCSP_BASICRESP_get_ext_count(OCSP_BASICRESP *x); +int OCSP_BASICRESP_get_ext_by_NID(OCSP_BASICRESP *x, int nid, int lastpos); +int OCSP_BASICRESP_get_ext_by_OBJ(OCSP_BASICRESP *x, ASN1_OBJECT *obj, + int lastpos); +int OCSP_BASICRESP_get_ext_by_critical(OCSP_BASICRESP *x, int crit, + int lastpos); +X509_EXTENSION *OCSP_BASICRESP_get_ext(OCSP_BASICRESP *x, int loc); +X509_EXTENSION *OCSP_BASICRESP_delete_ext(OCSP_BASICRESP *x, int loc); +void *OCSP_BASICRESP_get1_ext_d2i(OCSP_BASICRESP *x, int nid, int *crit, + int *idx); +int OCSP_BASICRESP_add1_ext_i2d(OCSP_BASICRESP *x, int nid, void *value, + int crit, unsigned long flags); +int OCSP_BASICRESP_add_ext(OCSP_BASICRESP *x, X509_EXTENSION *ex, int loc); + +int OCSP_SINGLERESP_get_ext_count(OCSP_SINGLERESP *x); +int OCSP_SINGLERESP_get_ext_by_NID(OCSP_SINGLERESP *x, int nid, int lastpos); +int OCSP_SINGLERESP_get_ext_by_OBJ(OCSP_SINGLERESP *x, ASN1_OBJECT *obj, + int lastpos); +int OCSP_SINGLERESP_get_ext_by_critical(OCSP_SINGLERESP *x, int crit, + int lastpos); +X509_EXTENSION *OCSP_SINGLERESP_get_ext(OCSP_SINGLERESP *x, int loc); +X509_EXTENSION *OCSP_SINGLERESP_delete_ext(OCSP_SINGLERESP *x, int loc); +void *OCSP_SINGLERESP_get1_ext_d2i(OCSP_SINGLERESP *x, int nid, int *crit, + int *idx); +int OCSP_SINGLERESP_add1_ext_i2d(OCSP_SINGLERESP *x, int nid, void *value, + int crit, unsigned long flags); +int OCSP_SINGLERESP_add_ext(OCSP_SINGLERESP *x, X509_EXTENSION *ex, int loc); + +DECLARE_ASN1_FUNCTIONS(OCSP_SINGLERESP) +DECLARE_ASN1_FUNCTIONS(OCSP_CERTSTATUS) +DECLARE_ASN1_FUNCTIONS(OCSP_REVOKEDINFO) +DECLARE_ASN1_FUNCTIONS(OCSP_BASICRESP) +DECLARE_ASN1_FUNCTIONS(OCSP_RESPDATA) +DECLARE_ASN1_FUNCTIONS(OCSP_RESPID) +DECLARE_ASN1_FUNCTIONS(OCSP_RESPONSE) +DECLARE_ASN1_FUNCTIONS(OCSP_RESPBYTES) +DECLARE_ASN1_FUNCTIONS(OCSP_ONEREQ) +DECLARE_ASN1_FUNCTIONS(OCSP_CERTID) +DECLARE_ASN1_FUNCTIONS(OCSP_REQUEST) +DECLARE_ASN1_FUNCTIONS(OCSP_SIGNATURE) +DECLARE_ASN1_FUNCTIONS(OCSP_REQINFO) +DECLARE_ASN1_FUNCTIONS(OCSP_CRLID) +DECLARE_ASN1_FUNCTIONS(OCSP_SERVICELOC) + +const char *OCSP_response_status_str(long s); +const char *OCSP_cert_status_str(long s); +const char *OCSP_crl_reason_str(long s); + +int OCSP_REQUEST_print(BIO *bp, OCSP_REQUEST *a, unsigned long flags); +int OCSP_RESPONSE_print(BIO *bp, OCSP_RESPONSE *o, unsigned long flags); + +int OCSP_basic_verify(OCSP_BASICRESP *bs, STACK_OF(X509) *certs, + X509_STORE *st, unsigned long flags); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_OCSP_strings(void); + +/* Error codes for the OCSP functions. */ + +/* Function codes. */ +# define OCSP_F_ASN1_STRING_ENCODE 100 +# define OCSP_F_D2I_OCSP_NONCE 102 +# define OCSP_F_OCSP_BASIC_ADD1_STATUS 103 +# define OCSP_F_OCSP_BASIC_SIGN 104 +# define OCSP_F_OCSP_BASIC_VERIFY 105 +# define OCSP_F_OCSP_CERT_ID_NEW 101 +# define OCSP_F_OCSP_CHECK_DELEGATED 106 +# define OCSP_F_OCSP_CHECK_IDS 107 +# define OCSP_F_OCSP_CHECK_ISSUER 108 +# define OCSP_F_OCSP_CHECK_VALIDITY 115 +# define OCSP_F_OCSP_MATCH_ISSUERID 109 +# define OCSP_F_OCSP_PARSE_URL 114 +# define OCSP_F_OCSP_REQUEST_SIGN 110 +# define OCSP_F_OCSP_REQUEST_VERIFY 116 +# define OCSP_F_OCSP_RESPONSE_GET1_BASIC 111 +# define OCSP_F_OCSP_SENDREQ_BIO 112 +# define OCSP_F_OCSP_SENDREQ_NBIO 117 +# define OCSP_F_PARSE_HTTP_LINE1 118 +# define OCSP_F_REQUEST_VERIFY 113 + +/* Reason codes. */ +# define OCSP_R_BAD_DATA 100 +# define OCSP_R_CERTIFICATE_VERIFY_ERROR 101 +# define OCSP_R_DIGEST_ERR 102 +# define OCSP_R_ERROR_IN_NEXTUPDATE_FIELD 122 +# define OCSP_R_ERROR_IN_THISUPDATE_FIELD 123 +# define OCSP_R_ERROR_PARSING_URL 121 +# define OCSP_R_MISSING_OCSPSIGNING_USAGE 103 +# define OCSP_R_NEXTUPDATE_BEFORE_THISUPDATE 124 +# define OCSP_R_NOT_BASIC_RESPONSE 104 +# define OCSP_R_NO_CERTIFICATES_IN_CHAIN 105 +# define OCSP_R_NO_CONTENT 106 +# define OCSP_R_NO_PUBLIC_KEY 107 +# define OCSP_R_NO_RESPONSE_DATA 108 +# define OCSP_R_NO_REVOKED_TIME 109 +# define OCSP_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE 110 +# define OCSP_R_REQUEST_NOT_SIGNED 128 +# define OCSP_R_RESPONSE_CONTAINS_NO_REVOCATION_DATA 111 +# define OCSP_R_ROOT_CA_NOT_TRUSTED 112 +# define OCSP_R_SERVER_READ_ERROR 113 +# define OCSP_R_SERVER_RESPONSE_ERROR 114 +# define OCSP_R_SERVER_RESPONSE_PARSE_ERROR 115 +# define OCSP_R_SERVER_WRITE_ERROR 116 +# define OCSP_R_SIGNATURE_FAILURE 117 +# define OCSP_R_SIGNER_CERTIFICATE_NOT_FOUND 118 +# define OCSP_R_STATUS_EXPIRED 125 +# define OCSP_R_STATUS_NOT_YET_VALID 126 +# define OCSP_R_STATUS_TOO_OLD 127 +# define OCSP_R_UNKNOWN_MESSAGE_DIGEST 119 +# define OCSP_R_UNKNOWN_NID 120 +# define OCSP_R_UNSUPPORTED_REQUESTORNAME_TYPE 129 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/win/openssl/include/openssl/opensslconf.h b/hdssd/external/win/openssl/include/openssl/opensslconf.h new file mode 100644 index 0000000..4b17a58 --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/opensslconf.h @@ -0,0 +1,271 @@ +/* opensslconf.h */ +/* WARNING: Generated automatically from opensslconf.h.in by Configure. */ + +#ifdef __cplusplus +extern "C" { +#endif +/* OpenSSL was configured with the following options: */ +#ifndef OPENSSL_SYSNAME_WIN32 +# define OPENSSL_SYSNAME_WIN32 +#endif +#ifndef OPENSSL_DOING_MAKEDEPEND + + +#ifndef OPENSSL_NO_EC_NISTP_64_GCC_128 +# define OPENSSL_NO_EC_NISTP_64_GCC_128 +#endif +#ifndef OPENSSL_NO_GMP +# define OPENSSL_NO_GMP +#endif +#ifndef OPENSSL_NO_JPAKE +# define OPENSSL_NO_JPAKE +#endif +#ifndef OPENSSL_NO_KRB5 +# define OPENSSL_NO_KRB5 +#endif +#ifndef OPENSSL_NO_LIBUNBOUND +# define OPENSSL_NO_LIBUNBOUND +#endif +#ifndef OPENSSL_NO_MD2 +# define OPENSSL_NO_MD2 +#endif +#ifndef OPENSSL_NO_RC5 +# define OPENSSL_NO_RC5 +#endif +#ifndef OPENSSL_NO_RFC3779 +# define OPENSSL_NO_RFC3779 +#endif +#ifndef OPENSSL_NO_SCTP +# define OPENSSL_NO_SCTP +#endif +#ifndef OPENSSL_NO_SSL_TRACE +# define OPENSSL_NO_SSL_TRACE +#endif +#ifndef OPENSSL_NO_SSL2 +# define OPENSSL_NO_SSL2 +#endif +#ifndef OPENSSL_NO_STORE +# define OPENSSL_NO_STORE +#endif +#ifndef OPENSSL_NO_UNIT_TEST +# define OPENSSL_NO_UNIT_TEST +#endif +#ifndef OPENSSL_NO_WEAK_SSL_CIPHERS +# define OPENSSL_NO_WEAK_SSL_CIPHERS +#endif + +#endif /* OPENSSL_DOING_MAKEDEPEND */ + +#ifndef OPENSSL_THREADS +# define OPENSSL_THREADS +#endif + +/* The OPENSSL_NO_* macros are also defined as NO_* if the application + asks for it. This is a transient feature that is provided for those + who haven't had the time to do the appropriate changes in their + applications. */ +#ifdef OPENSSL_ALGORITHM_DEFINES +# if defined(OPENSSL_NO_EC_NISTP_64_GCC_128) && !defined(NO_EC_NISTP_64_GCC_128) +# define NO_EC_NISTP_64_GCC_128 +# endif +# if defined(OPENSSL_NO_GMP) && !defined(NO_GMP) +# define NO_GMP +# endif +# if defined(OPENSSL_NO_JPAKE) && !defined(NO_JPAKE) +# define NO_JPAKE +# endif +# if defined(OPENSSL_NO_KRB5) && !defined(NO_KRB5) +# define NO_KRB5 +# endif +# if defined(OPENSSL_NO_LIBUNBOUND) && !defined(NO_LIBUNBOUND) +# define NO_LIBUNBOUND +# endif +# if defined(OPENSSL_NO_MD2) && !defined(NO_MD2) +# define NO_MD2 +# endif +# if defined(OPENSSL_NO_RC5) && !defined(NO_RC5) +# define NO_RC5 +# endif +# if defined(OPENSSL_NO_RFC3779) && !defined(NO_RFC3779) +# define NO_RFC3779 +# endif +# if defined(OPENSSL_NO_SCTP) && !defined(NO_SCTP) +# define NO_SCTP +# endif +# if defined(OPENSSL_NO_SSL_TRACE) && !defined(NO_SSL_TRACE) +# define NO_SSL_TRACE +# endif +# if defined(OPENSSL_NO_SSL2) && !defined(NO_SSL2) +# define NO_SSL2 +# endif +# if defined(OPENSSL_NO_STORE) && !defined(NO_STORE) +# define NO_STORE +# endif +# if defined(OPENSSL_NO_UNIT_TEST) && !defined(NO_UNIT_TEST) +# define NO_UNIT_TEST +# endif +# if defined(OPENSSL_NO_WEAK_SSL_CIPHERS) && !defined(NO_WEAK_SSL_CIPHERS) +# define NO_WEAK_SSL_CIPHERS +# endif +#endif + +#define OPENSSL_CPUID_OBJ + +/* crypto/opensslconf.h.in */ + +/* Generate 80386 code? */ +#undef I386_ONLY + +#if !(defined(VMS) || defined(__VMS)) /* VMS uses logical names instead */ +#if defined(HEADER_CRYPTLIB_H) && !defined(OPENSSLDIR) +#define ENGINESDIR "/usr/local/ssl/lib/engines" +#define OPENSSLDIR "/usr/local/ssl" +#endif +#endif + +#undef OPENSSL_UNISTD +#define OPENSSL_UNISTD + +#undef OPENSSL_EXPORT_VAR_AS_FUNCTION +#define OPENSSL_EXPORT_VAR_AS_FUNCTION + +#if defined(HEADER_IDEA_H) && !defined(IDEA_INT) +#define IDEA_INT unsigned int +#endif + +#if defined(HEADER_MD2_H) && !defined(MD2_INT) +#define MD2_INT unsigned int +#endif + +#if defined(HEADER_RC2_H) && !defined(RC2_INT) +/* I need to put in a mod for the alpha - eay */ +#define RC2_INT unsigned int +#endif + +#if defined(HEADER_RC4_H) +#if !defined(RC4_INT) +/* using int types make the structure larger but make the code faster + * on most boxes I have tested - up to %20 faster. */ +/* + * I don't know what does "most" mean, but declaring "int" is a must on: + * - Intel P6 because partial register stalls are very expensive; + * - elder Alpha because it lacks byte load/store instructions; + */ +#define RC4_INT unsigned int +#endif +#if !defined(RC4_CHUNK) +/* + * This enables code handling data aligned at natural CPU word + * boundary. See crypto/rc4/rc4_enc.c for further details. + */ +#undef RC4_CHUNK +#endif +#endif + +#if (defined(HEADER_NEW_DES_H) || defined(HEADER_DES_H)) && !defined(DES_LONG) +/* If this is set to 'unsigned int' on a DEC Alpha, this gives about a + * %20 speed up (longs are 8 bytes, int's are 4). */ +#ifndef DES_LONG +#define DES_LONG unsigned long +#endif +#endif + +#if defined(HEADER_BN_H) && !defined(CONFIG_HEADER_BN_H) +#define CONFIG_HEADER_BN_H +#define BN_LLONG + +/* Should we define BN_DIV2W here? */ + +/* Only one for the following should be defined */ +#undef SIXTY_FOUR_BIT_LONG +#undef SIXTY_FOUR_BIT +#define THIRTY_TWO_BIT +#endif + +#if defined(HEADER_RC4_LOCL_H) && !defined(CONFIG_HEADER_RC4_LOCL_H) +#define CONFIG_HEADER_RC4_LOCL_H +/* if this is defined data[i] is used instead of *data, this is a %20 + * speedup on x86 */ +#define RC4_INDEX +#endif + +#if defined(HEADER_BF_LOCL_H) && !defined(CONFIG_HEADER_BF_LOCL_H) +#define CONFIG_HEADER_BF_LOCL_H +#undef BF_PTR +#endif /* HEADER_BF_LOCL_H */ + +#if defined(HEADER_DES_LOCL_H) && !defined(CONFIG_HEADER_DES_LOCL_H) +#define CONFIG_HEADER_DES_LOCL_H +#ifndef DES_DEFAULT_OPTIONS +/* the following is tweaked from a config script, that is why it is a + * protected undef/define */ +#ifndef DES_PTR +#undef DES_PTR +#endif + +/* This helps C compiler generate the correct code for multiple functional + * units. It reduces register dependancies at the expense of 2 more + * registers */ +#ifndef DES_RISC1 +#undef DES_RISC1 +#endif + +#ifndef DES_RISC2 +#undef DES_RISC2 +#endif + +#if defined(DES_RISC1) && defined(DES_RISC2) +#error YOU SHOULD NOT HAVE BOTH DES_RISC1 AND DES_RISC2 DEFINED!!!!! +#endif + +/* Unroll the inner loop, this sometimes helps, sometimes hinders. + * Very mucy CPU dependant */ +#ifndef DES_UNROLL +#undef DES_UNROLL +#endif + +/* These default values were supplied by + * Peter Gutman + * They are only used if nothing else has been defined */ +#if !defined(DES_PTR) && !defined(DES_RISC1) && !defined(DES_RISC2) && !defined(DES_UNROLL) +/* Special defines which change the way the code is built depending on the + CPU and OS. For SGI machines you can use _MIPS_SZLONG (32 or 64) to find + even newer MIPS CPU's, but at the moment one size fits all for + optimization options. Older Sparc's work better with only UNROLL, but + there's no way to tell at compile time what it is you're running on */ + +#if defined( __sun ) || defined ( sun ) /* Newer Sparc's */ +# define DES_PTR +# define DES_RISC1 +# define DES_UNROLL +#elif defined( __ultrix ) /* Older MIPS */ +# define DES_PTR +# define DES_RISC2 +# define DES_UNROLL +#elif defined( __osf1__ ) /* Alpha */ +# define DES_PTR +# define DES_RISC2 +#elif defined ( _AIX ) /* RS6000 */ + /* Unknown */ +#elif defined( __hpux ) /* HP-PA */ + /* Unknown */ +#elif defined( __aux ) /* 68K */ + /* Unknown */ +#elif defined( __dgux ) /* 88K (but P6 in latest boxes) */ +# define DES_UNROLL +#elif defined( __sgi ) /* Newer MIPS */ +# define DES_PTR +# define DES_RISC2 +# define DES_UNROLL +#elif defined(i386) || defined(__i386__) /* x86 boxes, should be gcc */ +# define DES_PTR +# define DES_RISC1 +# define DES_UNROLL +#endif /* Systems-specific speed defines */ +#endif + +#endif /* DES_DEFAULT_OPTIONS */ +#endif /* HEADER_DES_LOCL_H */ +#ifdef __cplusplus +} +#endif diff --git a/hdssd/external/win/openssl/include/openssl/opensslv.h b/hdssd/external/win/openssl/include/openssl/opensslv.h new file mode 100644 index 0000000..4334fd1 --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/opensslv.h @@ -0,0 +1,97 @@ +#ifndef HEADER_OPENSSLV_H +# define HEADER_OPENSSLV_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*- + * Numeric release version identifier: + * MNNFFPPS: major minor fix patch status + * The status nibble has one of the values 0 for development, 1 to e for betas + * 1 to 14, and f for release. The patch level is exactly that. + * For example: + * 0.9.3-dev 0x00903000 + * 0.9.3-beta1 0x00903001 + * 0.9.3-beta2-dev 0x00903002 + * 0.9.3-beta2 0x00903002 (same as ...beta2-dev) + * 0.9.3 0x0090300f + * 0.9.3a 0x0090301f + * 0.9.4 0x0090400f + * 1.2.3z 0x102031af + * + * For continuity reasons (because 0.9.5 is already out, and is coded + * 0x00905100), between 0.9.5 and 0.9.6 the coding of the patch level + * part is slightly different, by setting the highest bit. This means + * that 0.9.5a looks like this: 0x0090581f. At 0.9.6, we can start + * with 0x0090600S... + * + * (Prior to 0.9.3-dev a different scheme was used: 0.9.2b is 0x0922.) + * (Prior to 0.9.5a beta1, a different scheme was used: MMNNFFRBB for + * major minor fix final patch/beta) + */ +# define OPENSSL_VERSION_NUMBER 0x1000207fL +# ifdef OPENSSL_FIPS +# define OPENSSL_VERSION_TEXT "OpenSSL 1.0.2g-fips 1 Mar 2016" +# else +# define OPENSSL_VERSION_TEXT "OpenSSL 1.0.2g 1 Mar 2016" +# endif +# define OPENSSL_VERSION_PTEXT " part of " OPENSSL_VERSION_TEXT + +/*- + * The macros below are to be used for shared library (.so, .dll, ...) + * versioning. That kind of versioning works a bit differently between + * operating systems. The most usual scheme is to set a major and a minor + * number, and have the runtime loader check that the major number is equal + * to what it was at application link time, while the minor number has to + * be greater or equal to what it was at application link time. With this + * scheme, the version number is usually part of the file name, like this: + * + * libcrypto.so.0.9 + * + * Some unixen also make a softlink with the major verson number only: + * + * libcrypto.so.0 + * + * On Tru64 and IRIX 6.x it works a little bit differently. There, the + * shared library version is stored in the file, and is actually a series + * of versions, separated by colons. The rightmost version present in the + * library when linking an application is stored in the application to be + * matched at run time. When the application is run, a check is done to + * see if the library version stored in the application matches any of the + * versions in the version string of the library itself. + * This version string can be constructed in any way, depending on what + * kind of matching is desired. However, to implement the same scheme as + * the one used in the other unixen, all compatible versions, from lowest + * to highest, should be part of the string. Consecutive builds would + * give the following versions strings: + * + * 3.0 + * 3.0:3.1 + * 3.0:3.1:3.2 + * 4.0 + * 4.0:4.1 + * + * Notice how version 4 is completely incompatible with version, and + * therefore give the breach you can see. + * + * There may be other schemes as well that I haven't yet discovered. + * + * So, here's the way it works here: first of all, the library version + * number doesn't need at all to match the overall OpenSSL version. + * However, it's nice and more understandable if it actually does. + * The current library version is stored in the macro SHLIB_VERSION_NUMBER, + * which is just a piece of text in the format "M.m.e" (Major, minor, edit). + * For the sake of Tru64, IRIX, and any other OS that behaves in similar ways, + * we need to keep a history of version numbers, which is done in the + * macro SHLIB_VERSION_HISTORY. The numbers are separated by colons and + * should only keep the versions that are binary compatible with the current. + */ +# define SHLIB_VERSION_HISTORY "" +# define SHLIB_VERSION_NUMBER "1.0.0" + + +#ifdef __cplusplus +} +#endif +#endif /* HEADER_OPENSSLV_H */ diff --git a/hdssd/external/win/openssl/include/openssl/ossl_typ.h b/hdssd/external/win/openssl/include/openssl/ossl_typ.h new file mode 100644 index 0000000..9144ea2 --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/ossl_typ.h @@ -0,0 +1,211 @@ +/* ==================================================================== + * Copyright (c) 1998-2001 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_OPENSSL_TYPES_H +# define HEADER_OPENSSL_TYPES_H + +#ifdef __cplusplus +extern "C" { +#endif + +# include + +# ifdef NO_ASN1_TYPEDEFS +# define ASN1_INTEGER ASN1_STRING +# define ASN1_ENUMERATED ASN1_STRING +# define ASN1_BIT_STRING ASN1_STRING +# define ASN1_OCTET_STRING ASN1_STRING +# define ASN1_PRINTABLESTRING ASN1_STRING +# define ASN1_T61STRING ASN1_STRING +# define ASN1_IA5STRING ASN1_STRING +# define ASN1_UTCTIME ASN1_STRING +# define ASN1_GENERALIZEDTIME ASN1_STRING +# define ASN1_TIME ASN1_STRING +# define ASN1_GENERALSTRING ASN1_STRING +# define ASN1_UNIVERSALSTRING ASN1_STRING +# define ASN1_BMPSTRING ASN1_STRING +# define ASN1_VISIBLESTRING ASN1_STRING +# define ASN1_UTF8STRING ASN1_STRING +# define ASN1_BOOLEAN int +# define ASN1_NULL int +# else +typedef struct asn1_string_st ASN1_INTEGER; +typedef struct asn1_string_st ASN1_ENUMERATED; +typedef struct asn1_string_st ASN1_BIT_STRING; +typedef struct asn1_string_st ASN1_OCTET_STRING; +typedef struct asn1_string_st ASN1_PRINTABLESTRING; +typedef struct asn1_string_st ASN1_T61STRING; +typedef struct asn1_string_st ASN1_IA5STRING; +typedef struct asn1_string_st ASN1_GENERALSTRING; +typedef struct asn1_string_st ASN1_UNIVERSALSTRING; +typedef struct asn1_string_st ASN1_BMPSTRING; +typedef struct asn1_string_st ASN1_UTCTIME; +typedef struct asn1_string_st ASN1_TIME; +typedef struct asn1_string_st ASN1_GENERALIZEDTIME; +typedef struct asn1_string_st ASN1_VISIBLESTRING; +typedef struct asn1_string_st ASN1_UTF8STRING; +typedef struct asn1_string_st ASN1_STRING; +typedef int ASN1_BOOLEAN; +typedef int ASN1_NULL; +# endif + +typedef struct asn1_object_st ASN1_OBJECT; + +typedef struct ASN1_ITEM_st ASN1_ITEM; +typedef struct asn1_pctx_st ASN1_PCTX; + +# ifdef OPENSSL_SYS_WIN32 +# undef X509_NAME +# undef X509_EXTENSIONS +# undef X509_CERT_PAIR +# undef PKCS7_ISSUER_AND_SERIAL +# undef OCSP_REQUEST +# undef OCSP_RESPONSE +# endif + +# ifdef BIGNUM +# undef BIGNUM +# endif +typedef struct bignum_st BIGNUM; +typedef struct bignum_ctx BN_CTX; +typedef struct bn_blinding_st BN_BLINDING; +typedef struct bn_mont_ctx_st BN_MONT_CTX; +typedef struct bn_recp_ctx_st BN_RECP_CTX; +typedef struct bn_gencb_st BN_GENCB; + +typedef struct buf_mem_st BUF_MEM; + +typedef struct evp_cipher_st EVP_CIPHER; +typedef struct evp_cipher_ctx_st EVP_CIPHER_CTX; +typedef struct env_md_st EVP_MD; +typedef struct env_md_ctx_st EVP_MD_CTX; +typedef struct evp_pkey_st EVP_PKEY; + +typedef struct evp_pkey_asn1_method_st EVP_PKEY_ASN1_METHOD; + +typedef struct evp_pkey_method_st EVP_PKEY_METHOD; +typedef struct evp_pkey_ctx_st EVP_PKEY_CTX; + +typedef struct dh_st DH; +typedef struct dh_method DH_METHOD; + +typedef struct dsa_st DSA; +typedef struct dsa_method DSA_METHOD; + +typedef struct rsa_st RSA; +typedef struct rsa_meth_st RSA_METHOD; + +typedef struct rand_meth_st RAND_METHOD; + +typedef struct ecdh_method ECDH_METHOD; +typedef struct ecdsa_method ECDSA_METHOD; + +typedef struct x509_st X509; +typedef struct X509_algor_st X509_ALGOR; +typedef struct X509_crl_st X509_CRL; +typedef struct x509_crl_method_st X509_CRL_METHOD; +typedef struct x509_revoked_st X509_REVOKED; +typedef struct X509_name_st X509_NAME; +typedef struct X509_pubkey_st X509_PUBKEY; +typedef struct x509_store_st X509_STORE; +typedef struct x509_store_ctx_st X509_STORE_CTX; + +typedef struct pkcs8_priv_key_info_st PKCS8_PRIV_KEY_INFO; + +typedef struct v3_ext_ctx X509V3_CTX; +typedef struct conf_st CONF; + +typedef struct store_st STORE; +typedef struct store_method_st STORE_METHOD; + +typedef struct ui_st UI; +typedef struct ui_method_st UI_METHOD; + +typedef struct st_ERR_FNS ERR_FNS; + +typedef struct engine_st ENGINE; +typedef struct ssl_st SSL; +typedef struct ssl_ctx_st SSL_CTX; + +typedef struct X509_POLICY_NODE_st X509_POLICY_NODE; +typedef struct X509_POLICY_LEVEL_st X509_POLICY_LEVEL; +typedef struct X509_POLICY_TREE_st X509_POLICY_TREE; +typedef struct X509_POLICY_CACHE_st X509_POLICY_CACHE; + +typedef struct AUTHORITY_KEYID_st AUTHORITY_KEYID; +typedef struct DIST_POINT_st DIST_POINT; +typedef struct ISSUING_DIST_POINT_st ISSUING_DIST_POINT; +typedef struct NAME_CONSTRAINTS_st NAME_CONSTRAINTS; + + /* If placed in pkcs12.h, we end up with a circular depency with pkcs7.h */ +# define DECLARE_PKCS12_STACK_OF(type)/* Nothing */ +# define IMPLEMENT_PKCS12_STACK_OF(type)/* Nothing */ + +typedef struct crypto_ex_data_st CRYPTO_EX_DATA; +/* Callback types for crypto.h */ +typedef int CRYPTO_EX_new (void *parent, void *ptr, CRYPTO_EX_DATA *ad, + int idx, long argl, void *argp); +typedef void CRYPTO_EX_free (void *parent, void *ptr, CRYPTO_EX_DATA *ad, + int idx, long argl, void *argp); +typedef int CRYPTO_EX_dup (CRYPTO_EX_DATA *to, CRYPTO_EX_DATA *from, + void *from_d, int idx, long argl, void *argp); + +typedef struct ocsp_req_ctx_st OCSP_REQ_CTX; +typedef struct ocsp_response_st OCSP_RESPONSE; +typedef struct ocsp_responder_id_st OCSP_RESPID; + +#ifdef __cplusplus +} +#endif +#endif /* def HEADER_OPENSSL_TYPES_H */ diff --git a/hdssd/external/win/openssl/include/openssl/pem.h b/hdssd/external/win/openssl/include/openssl/pem.h new file mode 100644 index 0000000..d3b23fc --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/pem.h @@ -0,0 +1,615 @@ +/* crypto/pem/pem.h */ +/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_PEM_H +# define HEADER_PEM_H + +# include +# ifndef OPENSSL_NO_BIO +# include +# endif +# ifndef OPENSSL_NO_STACK +# include +# endif +# include +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# define PEM_BUFSIZE 1024 + +# define PEM_OBJ_UNDEF 0 +# define PEM_OBJ_X509 1 +# define PEM_OBJ_X509_REQ 2 +# define PEM_OBJ_CRL 3 +# define PEM_OBJ_SSL_SESSION 4 +# define PEM_OBJ_PRIV_KEY 10 +# define PEM_OBJ_PRIV_RSA 11 +# define PEM_OBJ_PRIV_DSA 12 +# define PEM_OBJ_PRIV_DH 13 +# define PEM_OBJ_PUB_RSA 14 +# define PEM_OBJ_PUB_DSA 15 +# define PEM_OBJ_PUB_DH 16 +# define PEM_OBJ_DHPARAMS 17 +# define PEM_OBJ_DSAPARAMS 18 +# define PEM_OBJ_PRIV_RSA_PUBLIC 19 +# define PEM_OBJ_PRIV_ECDSA 20 +# define PEM_OBJ_PUB_ECDSA 21 +# define PEM_OBJ_ECPARAMETERS 22 + +# define PEM_ERROR 30 +# define PEM_DEK_DES_CBC 40 +# define PEM_DEK_IDEA_CBC 45 +# define PEM_DEK_DES_EDE 50 +# define PEM_DEK_DES_ECB 60 +# define PEM_DEK_RSA 70 +# define PEM_DEK_RSA_MD2 80 +# define PEM_DEK_RSA_MD5 90 + +# define PEM_MD_MD2 NID_md2 +# define PEM_MD_MD5 NID_md5 +# define PEM_MD_SHA NID_sha +# define PEM_MD_MD2_RSA NID_md2WithRSAEncryption +# define PEM_MD_MD5_RSA NID_md5WithRSAEncryption +# define PEM_MD_SHA_RSA NID_sha1WithRSAEncryption + +# define PEM_STRING_X509_OLD "X509 CERTIFICATE" +# define PEM_STRING_X509 "CERTIFICATE" +# define PEM_STRING_X509_PAIR "CERTIFICATE PAIR" +# define PEM_STRING_X509_TRUSTED "TRUSTED CERTIFICATE" +# define PEM_STRING_X509_REQ_OLD "NEW CERTIFICATE REQUEST" +# define PEM_STRING_X509_REQ "CERTIFICATE REQUEST" +# define PEM_STRING_X509_CRL "X509 CRL" +# define PEM_STRING_EVP_PKEY "ANY PRIVATE KEY" +# define PEM_STRING_PUBLIC "PUBLIC KEY" +# define PEM_STRING_RSA "RSA PRIVATE KEY" +# define PEM_STRING_RSA_PUBLIC "RSA PUBLIC KEY" +# define PEM_STRING_DSA "DSA PRIVATE KEY" +# define PEM_STRING_DSA_PUBLIC "DSA PUBLIC KEY" +# define PEM_STRING_PKCS7 "PKCS7" +# define PEM_STRING_PKCS7_SIGNED "PKCS #7 SIGNED DATA" +# define PEM_STRING_PKCS8 "ENCRYPTED PRIVATE KEY" +# define PEM_STRING_PKCS8INF "PRIVATE KEY" +# define PEM_STRING_DHPARAMS "DH PARAMETERS" +# define PEM_STRING_DHXPARAMS "X9.42 DH PARAMETERS" +# define PEM_STRING_SSL_SESSION "SSL SESSION PARAMETERS" +# define PEM_STRING_DSAPARAMS "DSA PARAMETERS" +# define PEM_STRING_ECDSA_PUBLIC "ECDSA PUBLIC KEY" +# define PEM_STRING_ECPARAMETERS "EC PARAMETERS" +# define PEM_STRING_ECPRIVATEKEY "EC PRIVATE KEY" +# define PEM_STRING_PARAMETERS "PARAMETERS" +# define PEM_STRING_CMS "CMS" + + /* + * Note that this structure is initialised by PEM_SealInit and cleaned up + * by PEM_SealFinal (at least for now) + */ +typedef struct PEM_Encode_Seal_st { + EVP_ENCODE_CTX encode; + EVP_MD_CTX md; + EVP_CIPHER_CTX cipher; +} PEM_ENCODE_SEAL_CTX; + +/* enc_type is one off */ +# define PEM_TYPE_ENCRYPTED 10 +# define PEM_TYPE_MIC_ONLY 20 +# define PEM_TYPE_MIC_CLEAR 30 +# define PEM_TYPE_CLEAR 40 + +typedef struct pem_recip_st { + char *name; + X509_NAME *dn; + int cipher; + int key_enc; + /* char iv[8]; unused and wrong size */ +} PEM_USER; + +typedef struct pem_ctx_st { + int type; /* what type of object */ + struct { + int version; + int mode; + } proc_type; + + char *domain; + + struct { + int cipher; + /*- + unused, and wrong size + unsigned char iv[8]; */ + } DEK_info; + + PEM_USER *originator; + + int num_recipient; + PEM_USER **recipient; +/*- + XXX(ben): don#t think this is used! + STACK *x509_chain; / * certificate chain */ + EVP_MD *md; /* signature type */ + + int md_enc; /* is the md encrypted or not? */ + int md_len; /* length of md_data */ + char *md_data; /* message digest, could be pkey encrypted */ + + EVP_CIPHER *dec; /* date encryption cipher */ + int key_len; /* key length */ + unsigned char *key; /* key */ + /*- + unused, and wrong size + unsigned char iv[8]; */ + + int data_enc; /* is the data encrypted */ + int data_len; + unsigned char *data; +} PEM_CTX; + +/* + * These macros make the PEM_read/PEM_write functions easier to maintain and + * write. Now they are all implemented with either: IMPLEMENT_PEM_rw(...) or + * IMPLEMENT_PEM_rw_cb(...) + */ + +# ifdef OPENSSL_NO_FP_API + +# define IMPLEMENT_PEM_read_fp(name, type, str, asn1) /**/ +# define IMPLEMENT_PEM_write_fp(name, type, str, asn1) /**/ +# define IMPLEMENT_PEM_write_fp_const(name, type, str, asn1) /**/ +# define IMPLEMENT_PEM_write_cb_fp(name, type, str, asn1) /**/ +# define IMPLEMENT_PEM_write_cb_fp_const(name, type, str, asn1) /**/ +# else + +# define IMPLEMENT_PEM_read_fp(name, type, str, asn1) \ +type *PEM_read_##name(FILE *fp, type **x, pem_password_cb *cb, void *u)\ +{ \ +return PEM_ASN1_read((d2i_of_void *)d2i_##asn1, str,fp,(void **)x,cb,u); \ +} + +# define IMPLEMENT_PEM_write_fp(name, type, str, asn1) \ +int PEM_write_##name(FILE *fp, type *x) \ +{ \ +return PEM_ASN1_write((i2d_of_void *)i2d_##asn1,str,fp,x,NULL,NULL,0,NULL,NULL); \ +} + +# define IMPLEMENT_PEM_write_fp_const(name, type, str, asn1) \ +int PEM_write_##name(FILE *fp, const type *x) \ +{ \ +return PEM_ASN1_write((i2d_of_void *)i2d_##asn1,str,fp,(void *)x,NULL,NULL,0,NULL,NULL); \ +} + +# define IMPLEMENT_PEM_write_cb_fp(name, type, str, asn1) \ +int PEM_write_##name(FILE *fp, type *x, const EVP_CIPHER *enc, \ + unsigned char *kstr, int klen, pem_password_cb *cb, \ + void *u) \ + { \ + return PEM_ASN1_write((i2d_of_void *)i2d_##asn1,str,fp,x,enc,kstr,klen,cb,u); \ + } + +# define IMPLEMENT_PEM_write_cb_fp_const(name, type, str, asn1) \ +int PEM_write_##name(FILE *fp, type *x, const EVP_CIPHER *enc, \ + unsigned char *kstr, int klen, pem_password_cb *cb, \ + void *u) \ + { \ + return PEM_ASN1_write((i2d_of_void *)i2d_##asn1,str,fp,x,enc,kstr,klen,cb,u); \ + } + +# endif + +# define IMPLEMENT_PEM_read_bio(name, type, str, asn1) \ +type *PEM_read_bio_##name(BIO *bp, type **x, pem_password_cb *cb, void *u)\ +{ \ +return PEM_ASN1_read_bio((d2i_of_void *)d2i_##asn1, str,bp,(void **)x,cb,u); \ +} + +# define IMPLEMENT_PEM_write_bio(name, type, str, asn1) \ +int PEM_write_bio_##name(BIO *bp, type *x) \ +{ \ +return PEM_ASN1_write_bio((i2d_of_void *)i2d_##asn1,str,bp,x,NULL,NULL,0,NULL,NULL); \ +} + +# define IMPLEMENT_PEM_write_bio_const(name, type, str, asn1) \ +int PEM_write_bio_##name(BIO *bp, const type *x) \ +{ \ +return PEM_ASN1_write_bio((i2d_of_void *)i2d_##asn1,str,bp,(void *)x,NULL,NULL,0,NULL,NULL); \ +} + +# define IMPLEMENT_PEM_write_cb_bio(name, type, str, asn1) \ +int PEM_write_bio_##name(BIO *bp, type *x, const EVP_CIPHER *enc, \ + unsigned char *kstr, int klen, pem_password_cb *cb, void *u) \ + { \ + return PEM_ASN1_write_bio((i2d_of_void *)i2d_##asn1,str,bp,x,enc,kstr,klen,cb,u); \ + } + +# define IMPLEMENT_PEM_write_cb_bio_const(name, type, str, asn1) \ +int PEM_write_bio_##name(BIO *bp, type *x, const EVP_CIPHER *enc, \ + unsigned char *kstr, int klen, pem_password_cb *cb, void *u) \ + { \ + return PEM_ASN1_write_bio((i2d_of_void *)i2d_##asn1,str,bp,(void *)x,enc,kstr,klen,cb,u); \ + } + +# define IMPLEMENT_PEM_write(name, type, str, asn1) \ + IMPLEMENT_PEM_write_bio(name, type, str, asn1) \ + IMPLEMENT_PEM_write_fp(name, type, str, asn1) + +# define IMPLEMENT_PEM_write_const(name, type, str, asn1) \ + IMPLEMENT_PEM_write_bio_const(name, type, str, asn1) \ + IMPLEMENT_PEM_write_fp_const(name, type, str, asn1) + +# define IMPLEMENT_PEM_write_cb(name, type, str, asn1) \ + IMPLEMENT_PEM_write_cb_bio(name, type, str, asn1) \ + IMPLEMENT_PEM_write_cb_fp(name, type, str, asn1) + +# define IMPLEMENT_PEM_write_cb_const(name, type, str, asn1) \ + IMPLEMENT_PEM_write_cb_bio_const(name, type, str, asn1) \ + IMPLEMENT_PEM_write_cb_fp_const(name, type, str, asn1) + +# define IMPLEMENT_PEM_read(name, type, str, asn1) \ + IMPLEMENT_PEM_read_bio(name, type, str, asn1) \ + IMPLEMENT_PEM_read_fp(name, type, str, asn1) + +# define IMPLEMENT_PEM_rw(name, type, str, asn1) \ + IMPLEMENT_PEM_read(name, type, str, asn1) \ + IMPLEMENT_PEM_write(name, type, str, asn1) + +# define IMPLEMENT_PEM_rw_const(name, type, str, asn1) \ + IMPLEMENT_PEM_read(name, type, str, asn1) \ + IMPLEMENT_PEM_write_const(name, type, str, asn1) + +# define IMPLEMENT_PEM_rw_cb(name, type, str, asn1) \ + IMPLEMENT_PEM_read(name, type, str, asn1) \ + IMPLEMENT_PEM_write_cb(name, type, str, asn1) + +/* These are the same except they are for the declarations */ + +# if defined(OPENSSL_NO_FP_API) + +# define DECLARE_PEM_read_fp(name, type) /**/ +# define DECLARE_PEM_write_fp(name, type) /**/ +# define DECLARE_PEM_write_cb_fp(name, type) /**/ +# else + +# define DECLARE_PEM_read_fp(name, type) \ + type *PEM_read_##name(FILE *fp, type **x, pem_password_cb *cb, void *u); + +# define DECLARE_PEM_write_fp(name, type) \ + int PEM_write_##name(FILE *fp, type *x); + +# define DECLARE_PEM_write_fp_const(name, type) \ + int PEM_write_##name(FILE *fp, const type *x); + +# define DECLARE_PEM_write_cb_fp(name, type) \ + int PEM_write_##name(FILE *fp, type *x, const EVP_CIPHER *enc, \ + unsigned char *kstr, int klen, pem_password_cb *cb, void *u); + +# endif + +# ifndef OPENSSL_NO_BIO +# define DECLARE_PEM_read_bio(name, type) \ + type *PEM_read_bio_##name(BIO *bp, type **x, pem_password_cb *cb, void *u); + +# define DECLARE_PEM_write_bio(name, type) \ + int PEM_write_bio_##name(BIO *bp, type *x); + +# define DECLARE_PEM_write_bio_const(name, type) \ + int PEM_write_bio_##name(BIO *bp, const type *x); + +# define DECLARE_PEM_write_cb_bio(name, type) \ + int PEM_write_bio_##name(BIO *bp, type *x, const EVP_CIPHER *enc, \ + unsigned char *kstr, int klen, pem_password_cb *cb, void *u); + +# else + +# define DECLARE_PEM_read_bio(name, type) /**/ +# define DECLARE_PEM_write_bio(name, type) /**/ +# define DECLARE_PEM_write_bio_const(name, type) /**/ +# define DECLARE_PEM_write_cb_bio(name, type) /**/ +# endif +# define DECLARE_PEM_write(name, type) \ + DECLARE_PEM_write_bio(name, type) \ + DECLARE_PEM_write_fp(name, type) +# define DECLARE_PEM_write_const(name, type) \ + DECLARE_PEM_write_bio_const(name, type) \ + DECLARE_PEM_write_fp_const(name, type) +# define DECLARE_PEM_write_cb(name, type) \ + DECLARE_PEM_write_cb_bio(name, type) \ + DECLARE_PEM_write_cb_fp(name, type) +# define DECLARE_PEM_read(name, type) \ + DECLARE_PEM_read_bio(name, type) \ + DECLARE_PEM_read_fp(name, type) +# define DECLARE_PEM_rw(name, type) \ + DECLARE_PEM_read(name, type) \ + DECLARE_PEM_write(name, type) +# define DECLARE_PEM_rw_const(name, type) \ + DECLARE_PEM_read(name, type) \ + DECLARE_PEM_write_const(name, type) +# define DECLARE_PEM_rw_cb(name, type) \ + DECLARE_PEM_read(name, type) \ + DECLARE_PEM_write_cb(name, type) +# if 1 +/* "userdata": new with OpenSSL 0.9.4 */ +typedef int pem_password_cb (char *buf, int size, int rwflag, void *userdata); +# else +/* OpenSSL 0.9.3, 0.9.3a */ +typedef int pem_password_cb (char *buf, int size, int rwflag); +# endif + +int PEM_get_EVP_CIPHER_INFO(char *header, EVP_CIPHER_INFO *cipher); +int PEM_do_header(EVP_CIPHER_INFO *cipher, unsigned char *data, long *len, + pem_password_cb *callback, void *u); + +# ifndef OPENSSL_NO_BIO +int PEM_read_bio(BIO *bp, char **name, char **header, + unsigned char **data, long *len); +int PEM_write_bio(BIO *bp, const char *name, const char *hdr, + const unsigned char *data, long len); +int PEM_bytes_read_bio(unsigned char **pdata, long *plen, char **pnm, + const char *name, BIO *bp, pem_password_cb *cb, + void *u); +void *PEM_ASN1_read_bio(d2i_of_void *d2i, const char *name, BIO *bp, void **x, + pem_password_cb *cb, void *u); +int PEM_ASN1_write_bio(i2d_of_void *i2d, const char *name, BIO *bp, void *x, + const EVP_CIPHER *enc, unsigned char *kstr, int klen, + pem_password_cb *cb, void *u); + +STACK_OF(X509_INFO) *PEM_X509_INFO_read_bio(BIO *bp, STACK_OF(X509_INFO) *sk, + pem_password_cb *cb, void *u); +int PEM_X509_INFO_write_bio(BIO *bp, X509_INFO *xi, EVP_CIPHER *enc, + unsigned char *kstr, int klen, + pem_password_cb *cd, void *u); +# endif + +int PEM_read(FILE *fp, char **name, char **header, + unsigned char **data, long *len); +int PEM_write(FILE *fp, const char *name, const char *hdr, + const unsigned char *data, long len); +void *PEM_ASN1_read(d2i_of_void *d2i, const char *name, FILE *fp, void **x, + pem_password_cb *cb, void *u); +int PEM_ASN1_write(i2d_of_void *i2d, const char *name, FILE *fp, + void *x, const EVP_CIPHER *enc, unsigned char *kstr, + int klen, pem_password_cb *callback, void *u); +STACK_OF(X509_INFO) *PEM_X509_INFO_read(FILE *fp, STACK_OF(X509_INFO) *sk, + pem_password_cb *cb, void *u); + +int PEM_SealInit(PEM_ENCODE_SEAL_CTX *ctx, EVP_CIPHER *type, + EVP_MD *md_type, unsigned char **ek, int *ekl, + unsigned char *iv, EVP_PKEY **pubk, int npubk); +void PEM_SealUpdate(PEM_ENCODE_SEAL_CTX *ctx, unsigned char *out, int *outl, + unsigned char *in, int inl); +int PEM_SealFinal(PEM_ENCODE_SEAL_CTX *ctx, unsigned char *sig, int *sigl, + unsigned char *out, int *outl, EVP_PKEY *priv); + +void PEM_SignInit(EVP_MD_CTX *ctx, EVP_MD *type); +void PEM_SignUpdate(EVP_MD_CTX *ctx, unsigned char *d, unsigned int cnt); +int PEM_SignFinal(EVP_MD_CTX *ctx, unsigned char *sigret, + unsigned int *siglen, EVP_PKEY *pkey); + +int PEM_def_callback(char *buf, int num, int w, void *key); +void PEM_proc_type(char *buf, int type); +void PEM_dek_info(char *buf, const char *type, int len, char *str); + +# include + +DECLARE_PEM_rw(X509, X509) +DECLARE_PEM_rw(X509_AUX, X509) +DECLARE_PEM_rw(X509_CERT_PAIR, X509_CERT_PAIR) +DECLARE_PEM_rw(X509_REQ, X509_REQ) +DECLARE_PEM_write(X509_REQ_NEW, X509_REQ) +DECLARE_PEM_rw(X509_CRL, X509_CRL) +DECLARE_PEM_rw(PKCS7, PKCS7) +DECLARE_PEM_rw(NETSCAPE_CERT_SEQUENCE, NETSCAPE_CERT_SEQUENCE) +DECLARE_PEM_rw(PKCS8, X509_SIG) +DECLARE_PEM_rw(PKCS8_PRIV_KEY_INFO, PKCS8_PRIV_KEY_INFO) +# ifndef OPENSSL_NO_RSA +DECLARE_PEM_rw_cb(RSAPrivateKey, RSA) +DECLARE_PEM_rw_const(RSAPublicKey, RSA) +DECLARE_PEM_rw(RSA_PUBKEY, RSA) +# endif +# ifndef OPENSSL_NO_DSA +DECLARE_PEM_rw_cb(DSAPrivateKey, DSA) +DECLARE_PEM_rw(DSA_PUBKEY, DSA) +DECLARE_PEM_rw_const(DSAparams, DSA) +# endif +# ifndef OPENSSL_NO_EC +DECLARE_PEM_rw_const(ECPKParameters, EC_GROUP) +DECLARE_PEM_rw_cb(ECPrivateKey, EC_KEY) +DECLARE_PEM_rw(EC_PUBKEY, EC_KEY) +# endif +# ifndef OPENSSL_NO_DH +DECLARE_PEM_rw_const(DHparams, DH) +DECLARE_PEM_write_const(DHxparams, DH) +# endif +DECLARE_PEM_rw_cb(PrivateKey, EVP_PKEY) +DECLARE_PEM_rw(PUBKEY, EVP_PKEY) + +int PEM_write_bio_PKCS8PrivateKey_nid(BIO *bp, EVP_PKEY *x, int nid, + char *kstr, int klen, + pem_password_cb *cb, void *u); +int PEM_write_bio_PKCS8PrivateKey(BIO *, EVP_PKEY *, const EVP_CIPHER *, + char *, int, pem_password_cb *, void *); +int i2d_PKCS8PrivateKey_bio(BIO *bp, EVP_PKEY *x, const EVP_CIPHER *enc, + char *kstr, int klen, + pem_password_cb *cb, void *u); +int i2d_PKCS8PrivateKey_nid_bio(BIO *bp, EVP_PKEY *x, int nid, + char *kstr, int klen, + pem_password_cb *cb, void *u); +EVP_PKEY *d2i_PKCS8PrivateKey_bio(BIO *bp, EVP_PKEY **x, pem_password_cb *cb, + void *u); + +int i2d_PKCS8PrivateKey_fp(FILE *fp, EVP_PKEY *x, const EVP_CIPHER *enc, + char *kstr, int klen, + pem_password_cb *cb, void *u); +int i2d_PKCS8PrivateKey_nid_fp(FILE *fp, EVP_PKEY *x, int nid, + char *kstr, int klen, + pem_password_cb *cb, void *u); +int PEM_write_PKCS8PrivateKey_nid(FILE *fp, EVP_PKEY *x, int nid, + char *kstr, int klen, + pem_password_cb *cb, void *u); + +EVP_PKEY *d2i_PKCS8PrivateKey_fp(FILE *fp, EVP_PKEY **x, pem_password_cb *cb, + void *u); + +int PEM_write_PKCS8PrivateKey(FILE *fp, EVP_PKEY *x, const EVP_CIPHER *enc, + char *kstr, int klen, pem_password_cb *cd, + void *u); + +EVP_PKEY *PEM_read_bio_Parameters(BIO *bp, EVP_PKEY **x); +int PEM_write_bio_Parameters(BIO *bp, EVP_PKEY *x); + +EVP_PKEY *b2i_PrivateKey(const unsigned char **in, long length); +EVP_PKEY *b2i_PublicKey(const unsigned char **in, long length); +EVP_PKEY *b2i_PrivateKey_bio(BIO *in); +EVP_PKEY *b2i_PublicKey_bio(BIO *in); +int i2b_PrivateKey_bio(BIO *out, EVP_PKEY *pk); +int i2b_PublicKey_bio(BIO *out, EVP_PKEY *pk); +# ifndef OPENSSL_NO_RC4 +EVP_PKEY *b2i_PVK_bio(BIO *in, pem_password_cb *cb, void *u); +int i2b_PVK_bio(BIO *out, EVP_PKEY *pk, int enclevel, + pem_password_cb *cb, void *u); +# endif + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_PEM_strings(void); + +/* Error codes for the PEM functions. */ + +/* Function codes. */ +# define PEM_F_B2I_DSS 127 +# define PEM_F_B2I_PVK_BIO 128 +# define PEM_F_B2I_RSA 129 +# define PEM_F_CHECK_BITLEN_DSA 130 +# define PEM_F_CHECK_BITLEN_RSA 131 +# define PEM_F_D2I_PKCS8PRIVATEKEY_BIO 120 +# define PEM_F_D2I_PKCS8PRIVATEKEY_FP 121 +# define PEM_F_DO_B2I 132 +# define PEM_F_DO_B2I_BIO 133 +# define PEM_F_DO_BLOB_HEADER 134 +# define PEM_F_DO_PK8PKEY 126 +# define PEM_F_DO_PK8PKEY_FP 125 +# define PEM_F_DO_PVK_BODY 135 +# define PEM_F_DO_PVK_HEADER 136 +# define PEM_F_I2B_PVK 137 +# define PEM_F_I2B_PVK_BIO 138 +# define PEM_F_LOAD_IV 101 +# define PEM_F_PEM_ASN1_READ 102 +# define PEM_F_PEM_ASN1_READ_BIO 103 +# define PEM_F_PEM_ASN1_WRITE 104 +# define PEM_F_PEM_ASN1_WRITE_BIO 105 +# define PEM_F_PEM_DEF_CALLBACK 100 +# define PEM_F_PEM_DO_HEADER 106 +# define PEM_F_PEM_F_PEM_WRITE_PKCS8PRIVATEKEY 118 +# define PEM_F_PEM_GET_EVP_CIPHER_INFO 107 +# define PEM_F_PEM_PK8PKEY 119 +# define PEM_F_PEM_READ 108 +# define PEM_F_PEM_READ_BIO 109 +# define PEM_F_PEM_READ_BIO_DHPARAMS 141 +# define PEM_F_PEM_READ_BIO_PARAMETERS 140 +# define PEM_F_PEM_READ_BIO_PRIVATEKEY 123 +# define PEM_F_PEM_READ_DHPARAMS 142 +# define PEM_F_PEM_READ_PRIVATEKEY 124 +# define PEM_F_PEM_SEALFINAL 110 +# define PEM_F_PEM_SEALINIT 111 +# define PEM_F_PEM_SIGNFINAL 112 +# define PEM_F_PEM_WRITE 113 +# define PEM_F_PEM_WRITE_BIO 114 +# define PEM_F_PEM_WRITE_PRIVATEKEY 139 +# define PEM_F_PEM_X509_INFO_READ 115 +# define PEM_F_PEM_X509_INFO_READ_BIO 116 +# define PEM_F_PEM_X509_INFO_WRITE_BIO 117 + +/* Reason codes. */ +# define PEM_R_BAD_BASE64_DECODE 100 +# define PEM_R_BAD_DECRYPT 101 +# define PEM_R_BAD_END_LINE 102 +# define PEM_R_BAD_IV_CHARS 103 +# define PEM_R_BAD_MAGIC_NUMBER 116 +# define PEM_R_BAD_PASSWORD_READ 104 +# define PEM_R_BAD_VERSION_NUMBER 117 +# define PEM_R_BIO_WRITE_FAILURE 118 +# define PEM_R_CIPHER_IS_NULL 127 +# define PEM_R_ERROR_CONVERTING_PRIVATE_KEY 115 +# define PEM_R_EXPECTING_PRIVATE_KEY_BLOB 119 +# define PEM_R_EXPECTING_PUBLIC_KEY_BLOB 120 +# define PEM_R_INCONSISTENT_HEADER 121 +# define PEM_R_KEYBLOB_HEADER_PARSE_ERROR 122 +# define PEM_R_KEYBLOB_TOO_SHORT 123 +# define PEM_R_NOT_DEK_INFO 105 +# define PEM_R_NOT_ENCRYPTED 106 +# define PEM_R_NOT_PROC_TYPE 107 +# define PEM_R_NO_START_LINE 108 +# define PEM_R_PROBLEMS_GETTING_PASSWORD 109 +# define PEM_R_PUBLIC_KEY_NO_RSA 110 +# define PEM_R_PVK_DATA_TOO_SHORT 124 +# define PEM_R_PVK_TOO_SHORT 125 +# define PEM_R_READ_KEY 111 +# define PEM_R_SHORT_HEADER 112 +# define PEM_R_UNSUPPORTED_CIPHER 113 +# define PEM_R_UNSUPPORTED_ENCRYPTION 114 +# define PEM_R_UNSUPPORTED_KEY_COMPONENTS 126 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/win/openssl/include/openssl/pem2.h b/hdssd/external/win/openssl/include/openssl/pem2.h new file mode 100644 index 0000000..84897d5 --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/pem2.h @@ -0,0 +1,70 @@ +/* ==================================================================== + * Copyright (c) 1999 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +/* + * This header only exists to break a circular dependency between pem and err + * Ben 30 Jan 1999. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef HEADER_PEM_H +void ERR_load_PEM_strings(void); +#endif + +#ifdef __cplusplus +} +#endif diff --git a/hdssd/external/win/openssl/include/openssl/pkcs12.h b/hdssd/external/win/openssl/include/openssl/pkcs12.h new file mode 100644 index 0000000..a39adf5 --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/pkcs12.h @@ -0,0 +1,342 @@ +/* pkcs12.h */ +/* + * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project + * 1999. + */ +/* ==================================================================== + * Copyright (c) 1999 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_PKCS12_H +# define HEADER_PKCS12_H + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# define PKCS12_KEY_ID 1 +# define PKCS12_IV_ID 2 +# define PKCS12_MAC_ID 3 + +/* Default iteration count */ +# ifndef PKCS12_DEFAULT_ITER +# define PKCS12_DEFAULT_ITER PKCS5_DEFAULT_ITER +# endif + +# define PKCS12_MAC_KEY_LENGTH 20 + +# define PKCS12_SALT_LEN 8 + +/* Uncomment out next line for unicode password and names, otherwise ASCII */ + +/* + * #define PBE_UNICODE + */ + +# ifdef PBE_UNICODE +# define PKCS12_key_gen PKCS12_key_gen_uni +# define PKCS12_add_friendlyname PKCS12_add_friendlyname_uni +# else +# define PKCS12_key_gen PKCS12_key_gen_asc +# define PKCS12_add_friendlyname PKCS12_add_friendlyname_asc +# endif + +/* MS key usage constants */ + +# define KEY_EX 0x10 +# define KEY_SIG 0x80 + +typedef struct { + X509_SIG *dinfo; + ASN1_OCTET_STRING *salt; + ASN1_INTEGER *iter; /* defaults to 1 */ +} PKCS12_MAC_DATA; + +typedef struct { + ASN1_INTEGER *version; + PKCS12_MAC_DATA *mac; + PKCS7 *authsafes; +} PKCS12; + +typedef struct { + ASN1_OBJECT *type; + union { + struct pkcs12_bag_st *bag; /* secret, crl and certbag */ + struct pkcs8_priv_key_info_st *keybag; /* keybag */ + X509_SIG *shkeybag; /* shrouded key bag */ + STACK_OF(PKCS12_SAFEBAG) *safes; + ASN1_TYPE *other; + } value; + STACK_OF(X509_ATTRIBUTE) *attrib; +} PKCS12_SAFEBAG; + +DECLARE_STACK_OF(PKCS12_SAFEBAG) +DECLARE_ASN1_SET_OF(PKCS12_SAFEBAG) +DECLARE_PKCS12_STACK_OF(PKCS12_SAFEBAG) + +typedef struct pkcs12_bag_st { + ASN1_OBJECT *type; + union { + ASN1_OCTET_STRING *x509cert; + ASN1_OCTET_STRING *x509crl; + ASN1_OCTET_STRING *octet; + ASN1_IA5STRING *sdsicert; + ASN1_TYPE *other; /* Secret or other bag */ + } value; +} PKCS12_BAGS; + +# define PKCS12_ERROR 0 +# define PKCS12_OK 1 + +/* Compatibility macros */ + +# define M_PKCS12_x5092certbag PKCS12_x5092certbag +# define M_PKCS12_x509crl2certbag PKCS12_x509crl2certbag + +# define M_PKCS12_certbag2x509 PKCS12_certbag2x509 +# define M_PKCS12_certbag2x509crl PKCS12_certbag2x509crl + +# define M_PKCS12_unpack_p7data PKCS12_unpack_p7data +# define M_PKCS12_pack_authsafes PKCS12_pack_authsafes +# define M_PKCS12_unpack_authsafes PKCS12_unpack_authsafes +# define M_PKCS12_unpack_p7encdata PKCS12_unpack_p7encdata + +# define M_PKCS12_decrypt_skey PKCS12_decrypt_skey +# define M_PKCS8_decrypt PKCS8_decrypt + +# define M_PKCS12_bag_type(bg) OBJ_obj2nid((bg)->type) +# define M_PKCS12_cert_bag_type(bg) OBJ_obj2nid((bg)->value.bag->type) +# define M_PKCS12_crl_bag_type M_PKCS12_cert_bag_type + +# define PKCS12_get_attr(bag, attr_nid) \ + PKCS12_get_attr_gen(bag->attrib, attr_nid) + +# define PKCS8_get_attr(p8, attr_nid) \ + PKCS12_get_attr_gen(p8->attributes, attr_nid) + +# define PKCS12_mac_present(p12) ((p12)->mac ? 1 : 0) + +PKCS12_SAFEBAG *PKCS12_x5092certbag(X509 *x509); +PKCS12_SAFEBAG *PKCS12_x509crl2certbag(X509_CRL *crl); +X509 *PKCS12_certbag2x509(PKCS12_SAFEBAG *bag); +X509_CRL *PKCS12_certbag2x509crl(PKCS12_SAFEBAG *bag); + +PKCS12_SAFEBAG *PKCS12_item_pack_safebag(void *obj, const ASN1_ITEM *it, + int nid1, int nid2); +PKCS12_SAFEBAG *PKCS12_MAKE_KEYBAG(PKCS8_PRIV_KEY_INFO *p8); +PKCS8_PRIV_KEY_INFO *PKCS8_decrypt(X509_SIG *p8, const char *pass, + int passlen); +PKCS8_PRIV_KEY_INFO *PKCS12_decrypt_skey(PKCS12_SAFEBAG *bag, + const char *pass, int passlen); +X509_SIG *PKCS8_encrypt(int pbe_nid, const EVP_CIPHER *cipher, + const char *pass, int passlen, unsigned char *salt, + int saltlen, int iter, PKCS8_PRIV_KEY_INFO *p8); +PKCS12_SAFEBAG *PKCS12_MAKE_SHKEYBAG(int pbe_nid, const char *pass, + int passlen, unsigned char *salt, + int saltlen, int iter, + PKCS8_PRIV_KEY_INFO *p8); +PKCS7 *PKCS12_pack_p7data(STACK_OF(PKCS12_SAFEBAG) *sk); +STACK_OF(PKCS12_SAFEBAG) *PKCS12_unpack_p7data(PKCS7 *p7); +PKCS7 *PKCS12_pack_p7encdata(int pbe_nid, const char *pass, int passlen, + unsigned char *salt, int saltlen, int iter, + STACK_OF(PKCS12_SAFEBAG) *bags); +STACK_OF(PKCS12_SAFEBAG) *PKCS12_unpack_p7encdata(PKCS7 *p7, const char *pass, + int passlen); + +int PKCS12_pack_authsafes(PKCS12 *p12, STACK_OF(PKCS7) *safes); +STACK_OF(PKCS7) *PKCS12_unpack_authsafes(PKCS12 *p12); + +int PKCS12_add_localkeyid(PKCS12_SAFEBAG *bag, unsigned char *name, + int namelen); +int PKCS12_add_friendlyname_asc(PKCS12_SAFEBAG *bag, const char *name, + int namelen); +int PKCS12_add_CSPName_asc(PKCS12_SAFEBAG *bag, const char *name, + int namelen); +int PKCS12_add_friendlyname_uni(PKCS12_SAFEBAG *bag, + const unsigned char *name, int namelen); +int PKCS8_add_keyusage(PKCS8_PRIV_KEY_INFO *p8, int usage); +ASN1_TYPE *PKCS12_get_attr_gen(STACK_OF(X509_ATTRIBUTE) *attrs, int attr_nid); +char *PKCS12_get_friendlyname(PKCS12_SAFEBAG *bag); +unsigned char *PKCS12_pbe_crypt(X509_ALGOR *algor, const char *pass, + int passlen, unsigned char *in, int inlen, + unsigned char **data, int *datalen, + int en_de); +void *PKCS12_item_decrypt_d2i(X509_ALGOR *algor, const ASN1_ITEM *it, + const char *pass, int passlen, + ASN1_OCTET_STRING *oct, int zbuf); +ASN1_OCTET_STRING *PKCS12_item_i2d_encrypt(X509_ALGOR *algor, + const ASN1_ITEM *it, + const char *pass, int passlen, + void *obj, int zbuf); +PKCS12 *PKCS12_init(int mode); +int PKCS12_key_gen_asc(const char *pass, int passlen, unsigned char *salt, + int saltlen, int id, int iter, int n, + unsigned char *out, const EVP_MD *md_type); +int PKCS12_key_gen_uni(unsigned char *pass, int passlen, unsigned char *salt, + int saltlen, int id, int iter, int n, + unsigned char *out, const EVP_MD *md_type); +int PKCS12_PBE_keyivgen(EVP_CIPHER_CTX *ctx, const char *pass, int passlen, + ASN1_TYPE *param, const EVP_CIPHER *cipher, + const EVP_MD *md_type, int en_de); +int PKCS12_gen_mac(PKCS12 *p12, const char *pass, int passlen, + unsigned char *mac, unsigned int *maclen); +int PKCS12_verify_mac(PKCS12 *p12, const char *pass, int passlen); +int PKCS12_set_mac(PKCS12 *p12, const char *pass, int passlen, + unsigned char *salt, int saltlen, int iter, + const EVP_MD *md_type); +int PKCS12_setup_mac(PKCS12 *p12, int iter, unsigned char *salt, + int saltlen, const EVP_MD *md_type); +unsigned char *OPENSSL_asc2uni(const char *asc, int asclen, + unsigned char **uni, int *unilen); +char *OPENSSL_uni2asc(unsigned char *uni, int unilen); + +DECLARE_ASN1_FUNCTIONS(PKCS12) +DECLARE_ASN1_FUNCTIONS(PKCS12_MAC_DATA) +DECLARE_ASN1_FUNCTIONS(PKCS12_SAFEBAG) +DECLARE_ASN1_FUNCTIONS(PKCS12_BAGS) + +DECLARE_ASN1_ITEM(PKCS12_SAFEBAGS) +DECLARE_ASN1_ITEM(PKCS12_AUTHSAFES) + +void PKCS12_PBE_add(void); +int PKCS12_parse(PKCS12 *p12, const char *pass, EVP_PKEY **pkey, X509 **cert, + STACK_OF(X509) **ca); +PKCS12 *PKCS12_create(char *pass, char *name, EVP_PKEY *pkey, X509 *cert, + STACK_OF(X509) *ca, int nid_key, int nid_cert, int iter, + int mac_iter, int keytype); + +PKCS12_SAFEBAG *PKCS12_add_cert(STACK_OF(PKCS12_SAFEBAG) **pbags, X509 *cert); +PKCS12_SAFEBAG *PKCS12_add_key(STACK_OF(PKCS12_SAFEBAG) **pbags, + EVP_PKEY *key, int key_usage, int iter, + int key_nid, char *pass); +int PKCS12_add_safe(STACK_OF(PKCS7) **psafes, STACK_OF(PKCS12_SAFEBAG) *bags, + int safe_nid, int iter, char *pass); +PKCS12 *PKCS12_add_safes(STACK_OF(PKCS7) *safes, int p7_nid); + +int i2d_PKCS12_bio(BIO *bp, PKCS12 *p12); +int i2d_PKCS12_fp(FILE *fp, PKCS12 *p12); +PKCS12 *d2i_PKCS12_bio(BIO *bp, PKCS12 **p12); +PKCS12 *d2i_PKCS12_fp(FILE *fp, PKCS12 **p12); +int PKCS12_newpass(PKCS12 *p12, char *oldpass, char *newpass); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_PKCS12_strings(void); + +/* Error codes for the PKCS12 functions. */ + +/* Function codes. */ +# define PKCS12_F_PARSE_BAG 129 +# define PKCS12_F_PARSE_BAGS 103 +# define PKCS12_F_PKCS12_ADD_FRIENDLYNAME 100 +# define PKCS12_F_PKCS12_ADD_FRIENDLYNAME_ASC 127 +# define PKCS12_F_PKCS12_ADD_FRIENDLYNAME_UNI 102 +# define PKCS12_F_PKCS12_ADD_LOCALKEYID 104 +# define PKCS12_F_PKCS12_CREATE 105 +# define PKCS12_F_PKCS12_GEN_MAC 107 +# define PKCS12_F_PKCS12_INIT 109 +# define PKCS12_F_PKCS12_ITEM_DECRYPT_D2I 106 +# define PKCS12_F_PKCS12_ITEM_I2D_ENCRYPT 108 +# define PKCS12_F_PKCS12_ITEM_PACK_SAFEBAG 117 +# define PKCS12_F_PKCS12_KEY_GEN_ASC 110 +# define PKCS12_F_PKCS12_KEY_GEN_UNI 111 +# define PKCS12_F_PKCS12_MAKE_KEYBAG 112 +# define PKCS12_F_PKCS12_MAKE_SHKEYBAG 113 +# define PKCS12_F_PKCS12_NEWPASS 128 +# define PKCS12_F_PKCS12_PACK_P7DATA 114 +# define PKCS12_F_PKCS12_PACK_P7ENCDATA 115 +# define PKCS12_F_PKCS12_PARSE 118 +# define PKCS12_F_PKCS12_PBE_CRYPT 119 +# define PKCS12_F_PKCS12_PBE_KEYIVGEN 120 +# define PKCS12_F_PKCS12_SETUP_MAC 122 +# define PKCS12_F_PKCS12_SET_MAC 123 +# define PKCS12_F_PKCS12_UNPACK_AUTHSAFES 130 +# define PKCS12_F_PKCS12_UNPACK_P7DATA 131 +# define PKCS12_F_PKCS12_VERIFY_MAC 126 +# define PKCS12_F_PKCS8_ADD_KEYUSAGE 124 +# define PKCS12_F_PKCS8_ENCRYPT 125 + +/* Reason codes. */ +# define PKCS12_R_CANT_PACK_STRUCTURE 100 +# define PKCS12_R_CONTENT_TYPE_NOT_DATA 121 +# define PKCS12_R_DECODE_ERROR 101 +# define PKCS12_R_ENCODE_ERROR 102 +# define PKCS12_R_ENCRYPT_ERROR 103 +# define PKCS12_R_ERROR_SETTING_ENCRYPTED_DATA_TYPE 120 +# define PKCS12_R_INVALID_NULL_ARGUMENT 104 +# define PKCS12_R_INVALID_NULL_PKCS12_POINTER 105 +# define PKCS12_R_IV_GEN_ERROR 106 +# define PKCS12_R_KEY_GEN_ERROR 107 +# define PKCS12_R_MAC_ABSENT 108 +# define PKCS12_R_MAC_GENERATION_ERROR 109 +# define PKCS12_R_MAC_SETUP_ERROR 110 +# define PKCS12_R_MAC_STRING_SET_ERROR 111 +# define PKCS12_R_MAC_VERIFY_ERROR 112 +# define PKCS12_R_MAC_VERIFY_FAILURE 113 +# define PKCS12_R_PARSE_ERROR 114 +# define PKCS12_R_PKCS12_ALGOR_CIPHERINIT_ERROR 115 +# define PKCS12_R_PKCS12_CIPHERFINAL_ERROR 116 +# define PKCS12_R_PKCS12_PBE_CRYPT_ERROR 117 +# define PKCS12_R_UNKNOWN_DIGEST_ALGORITHM 118 +# define PKCS12_R_UNSUPPORTED_PKCS12_MODE 119 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/win/openssl/include/openssl/pkcs7.h b/hdssd/external/win/openssl/include/openssl/pkcs7.h new file mode 100644 index 0000000..b51b386 --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/pkcs7.h @@ -0,0 +1,481 @@ +/* crypto/pkcs7/pkcs7.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_PKCS7_H +# define HEADER_PKCS7_H + +# include +# include +# include + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# ifdef OPENSSL_SYS_WIN32 +/* Under Win32 thes are defined in wincrypt.h */ +# undef PKCS7_ISSUER_AND_SERIAL +# undef PKCS7_SIGNER_INFO +# endif + +/*- +Encryption_ID DES-CBC +Digest_ID MD5 +Digest_Encryption_ID rsaEncryption +Key_Encryption_ID rsaEncryption +*/ + +typedef struct pkcs7_issuer_and_serial_st { + X509_NAME *issuer; + ASN1_INTEGER *serial; +} PKCS7_ISSUER_AND_SERIAL; + +typedef struct pkcs7_signer_info_st { + ASN1_INTEGER *version; /* version 1 */ + PKCS7_ISSUER_AND_SERIAL *issuer_and_serial; + X509_ALGOR *digest_alg; + STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */ + X509_ALGOR *digest_enc_alg; + ASN1_OCTET_STRING *enc_digest; + STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */ + /* The private key to sign with */ + EVP_PKEY *pkey; +} PKCS7_SIGNER_INFO; + +DECLARE_STACK_OF(PKCS7_SIGNER_INFO) +DECLARE_ASN1_SET_OF(PKCS7_SIGNER_INFO) + +typedef struct pkcs7_recip_info_st { + ASN1_INTEGER *version; /* version 0 */ + PKCS7_ISSUER_AND_SERIAL *issuer_and_serial; + X509_ALGOR *key_enc_algor; + ASN1_OCTET_STRING *enc_key; + X509 *cert; /* get the pub-key from this */ +} PKCS7_RECIP_INFO; + +DECLARE_STACK_OF(PKCS7_RECIP_INFO) +DECLARE_ASN1_SET_OF(PKCS7_RECIP_INFO) + +typedef struct pkcs7_signed_st { + ASN1_INTEGER *version; /* version 1 */ + STACK_OF(X509_ALGOR) *md_algs; /* md used */ + STACK_OF(X509) *cert; /* [ 0 ] */ + STACK_OF(X509_CRL) *crl; /* [ 1 ] */ + STACK_OF(PKCS7_SIGNER_INFO) *signer_info; + struct pkcs7_st *contents; +} PKCS7_SIGNED; +/* + * The above structure is very very similar to PKCS7_SIGN_ENVELOPE. How about + * merging the two + */ + +typedef struct pkcs7_enc_content_st { + ASN1_OBJECT *content_type; + X509_ALGOR *algorithm; + ASN1_OCTET_STRING *enc_data; /* [ 0 ] */ + const EVP_CIPHER *cipher; +} PKCS7_ENC_CONTENT; + +typedef struct pkcs7_enveloped_st { + ASN1_INTEGER *version; /* version 0 */ + STACK_OF(PKCS7_RECIP_INFO) *recipientinfo; + PKCS7_ENC_CONTENT *enc_data; +} PKCS7_ENVELOPE; + +typedef struct pkcs7_signedandenveloped_st { + ASN1_INTEGER *version; /* version 1 */ + STACK_OF(X509_ALGOR) *md_algs; /* md used */ + STACK_OF(X509) *cert; /* [ 0 ] */ + STACK_OF(X509_CRL) *crl; /* [ 1 ] */ + STACK_OF(PKCS7_SIGNER_INFO) *signer_info; + PKCS7_ENC_CONTENT *enc_data; + STACK_OF(PKCS7_RECIP_INFO) *recipientinfo; +} PKCS7_SIGN_ENVELOPE; + +typedef struct pkcs7_digest_st { + ASN1_INTEGER *version; /* version 0 */ + X509_ALGOR *md; /* md used */ + struct pkcs7_st *contents; + ASN1_OCTET_STRING *digest; +} PKCS7_DIGEST; + +typedef struct pkcs7_encrypted_st { + ASN1_INTEGER *version; /* version 0 */ + PKCS7_ENC_CONTENT *enc_data; +} PKCS7_ENCRYPT; + +typedef struct pkcs7_st { + /* + * The following is non NULL if it contains ASN1 encoding of this + * structure + */ + unsigned char *asn1; + long length; +# define PKCS7_S_HEADER 0 +# define PKCS7_S_BODY 1 +# define PKCS7_S_TAIL 2 + int state; /* used during processing */ + int detached; + ASN1_OBJECT *type; + /* content as defined by the type */ + /* + * all encryption/message digests are applied to the 'contents', leaving + * out the 'type' field. + */ + union { + char *ptr; + /* NID_pkcs7_data */ + ASN1_OCTET_STRING *data; + /* NID_pkcs7_signed */ + PKCS7_SIGNED *sign; + /* NID_pkcs7_enveloped */ + PKCS7_ENVELOPE *enveloped; + /* NID_pkcs7_signedAndEnveloped */ + PKCS7_SIGN_ENVELOPE *signed_and_enveloped; + /* NID_pkcs7_digest */ + PKCS7_DIGEST *digest; + /* NID_pkcs7_encrypted */ + PKCS7_ENCRYPT *encrypted; + /* Anything else */ + ASN1_TYPE *other; + } d; +} PKCS7; + +DECLARE_STACK_OF(PKCS7) +DECLARE_ASN1_SET_OF(PKCS7) +DECLARE_PKCS12_STACK_OF(PKCS7) + +# define PKCS7_OP_SET_DETACHED_SIGNATURE 1 +# define PKCS7_OP_GET_DETACHED_SIGNATURE 2 + +# define PKCS7_get_signed_attributes(si) ((si)->auth_attr) +# define PKCS7_get_attributes(si) ((si)->unauth_attr) + +# define PKCS7_type_is_signed(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_signed) +# define PKCS7_type_is_encrypted(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_encrypted) +# define PKCS7_type_is_enveloped(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_enveloped) +# define PKCS7_type_is_signedAndEnveloped(a) \ + (OBJ_obj2nid((a)->type) == NID_pkcs7_signedAndEnveloped) +# define PKCS7_type_is_data(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_data) +# define PKCS7_type_is_digest(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_digest) + +# define PKCS7_set_detached(p,v) \ + PKCS7_ctrl(p,PKCS7_OP_SET_DETACHED_SIGNATURE,v,NULL) +# define PKCS7_get_detached(p) \ + PKCS7_ctrl(p,PKCS7_OP_GET_DETACHED_SIGNATURE,0,NULL) + +# define PKCS7_is_detached(p7) (PKCS7_type_is_signed(p7) && PKCS7_get_detached(p7)) + +/* S/MIME related flags */ + +# define PKCS7_TEXT 0x1 +# define PKCS7_NOCERTS 0x2 +# define PKCS7_NOSIGS 0x4 +# define PKCS7_NOCHAIN 0x8 +# define PKCS7_NOINTERN 0x10 +# define PKCS7_NOVERIFY 0x20 +# define PKCS7_DETACHED 0x40 +# define PKCS7_BINARY 0x80 +# define PKCS7_NOATTR 0x100 +# define PKCS7_NOSMIMECAP 0x200 +# define PKCS7_NOOLDMIMETYPE 0x400 +# define PKCS7_CRLFEOL 0x800 +# define PKCS7_STREAM 0x1000 +# define PKCS7_NOCRL 0x2000 +# define PKCS7_PARTIAL 0x4000 +# define PKCS7_REUSE_DIGEST 0x8000 + +/* Flags: for compatibility with older code */ + +# define SMIME_TEXT PKCS7_TEXT +# define SMIME_NOCERTS PKCS7_NOCERTS +# define SMIME_NOSIGS PKCS7_NOSIGS +# define SMIME_NOCHAIN PKCS7_NOCHAIN +# define SMIME_NOINTERN PKCS7_NOINTERN +# define SMIME_NOVERIFY PKCS7_NOVERIFY +# define SMIME_DETACHED PKCS7_DETACHED +# define SMIME_BINARY PKCS7_BINARY +# define SMIME_NOATTR PKCS7_NOATTR + +DECLARE_ASN1_FUNCTIONS(PKCS7_ISSUER_AND_SERIAL) + +int PKCS7_ISSUER_AND_SERIAL_digest(PKCS7_ISSUER_AND_SERIAL *data, + const EVP_MD *type, unsigned char *md, + unsigned int *len); +# ifndef OPENSSL_NO_FP_API +PKCS7 *d2i_PKCS7_fp(FILE *fp, PKCS7 **p7); +int i2d_PKCS7_fp(FILE *fp, PKCS7 *p7); +# endif +PKCS7 *PKCS7_dup(PKCS7 *p7); +PKCS7 *d2i_PKCS7_bio(BIO *bp, PKCS7 **p7); +int i2d_PKCS7_bio(BIO *bp, PKCS7 *p7); +int i2d_PKCS7_bio_stream(BIO *out, PKCS7 *p7, BIO *in, int flags); +int PEM_write_bio_PKCS7_stream(BIO *out, PKCS7 *p7, BIO *in, int flags); + +DECLARE_ASN1_FUNCTIONS(PKCS7_SIGNER_INFO) +DECLARE_ASN1_FUNCTIONS(PKCS7_RECIP_INFO) +DECLARE_ASN1_FUNCTIONS(PKCS7_SIGNED) +DECLARE_ASN1_FUNCTIONS(PKCS7_ENC_CONTENT) +DECLARE_ASN1_FUNCTIONS(PKCS7_ENVELOPE) +DECLARE_ASN1_FUNCTIONS(PKCS7_SIGN_ENVELOPE) +DECLARE_ASN1_FUNCTIONS(PKCS7_DIGEST) +DECLARE_ASN1_FUNCTIONS(PKCS7_ENCRYPT) +DECLARE_ASN1_FUNCTIONS(PKCS7) + +DECLARE_ASN1_ITEM(PKCS7_ATTR_SIGN) +DECLARE_ASN1_ITEM(PKCS7_ATTR_VERIFY) + +DECLARE_ASN1_NDEF_FUNCTION(PKCS7) +DECLARE_ASN1_PRINT_FUNCTION(PKCS7) + +long PKCS7_ctrl(PKCS7 *p7, int cmd, long larg, char *parg); + +int PKCS7_set_type(PKCS7 *p7, int type); +int PKCS7_set0_type_other(PKCS7 *p7, int type, ASN1_TYPE *other); +int PKCS7_set_content(PKCS7 *p7, PKCS7 *p7_data); +int PKCS7_SIGNER_INFO_set(PKCS7_SIGNER_INFO *p7i, X509 *x509, EVP_PKEY *pkey, + const EVP_MD *dgst); +int PKCS7_SIGNER_INFO_sign(PKCS7_SIGNER_INFO *si); +int PKCS7_add_signer(PKCS7 *p7, PKCS7_SIGNER_INFO *p7i); +int PKCS7_add_certificate(PKCS7 *p7, X509 *x509); +int PKCS7_add_crl(PKCS7 *p7, X509_CRL *x509); +int PKCS7_content_new(PKCS7 *p7, int nid); +int PKCS7_dataVerify(X509_STORE *cert_store, X509_STORE_CTX *ctx, + BIO *bio, PKCS7 *p7, PKCS7_SIGNER_INFO *si); +int PKCS7_signatureVerify(BIO *bio, PKCS7 *p7, PKCS7_SIGNER_INFO *si, + X509 *x509); + +BIO *PKCS7_dataInit(PKCS7 *p7, BIO *bio); +int PKCS7_dataFinal(PKCS7 *p7, BIO *bio); +BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKEY *pkey, BIO *in_bio, X509 *pcert); + +PKCS7_SIGNER_INFO *PKCS7_add_signature(PKCS7 *p7, X509 *x509, + EVP_PKEY *pkey, const EVP_MD *dgst); +X509 *PKCS7_cert_from_signer_info(PKCS7 *p7, PKCS7_SIGNER_INFO *si); +int PKCS7_set_digest(PKCS7 *p7, const EVP_MD *md); +STACK_OF(PKCS7_SIGNER_INFO) *PKCS7_get_signer_info(PKCS7 *p7); + +PKCS7_RECIP_INFO *PKCS7_add_recipient(PKCS7 *p7, X509 *x509); +void PKCS7_SIGNER_INFO_get0_algs(PKCS7_SIGNER_INFO *si, EVP_PKEY **pk, + X509_ALGOR **pdig, X509_ALGOR **psig); +void PKCS7_RECIP_INFO_get0_alg(PKCS7_RECIP_INFO *ri, X509_ALGOR **penc); +int PKCS7_add_recipient_info(PKCS7 *p7, PKCS7_RECIP_INFO *ri); +int PKCS7_RECIP_INFO_set(PKCS7_RECIP_INFO *p7i, X509 *x509); +int PKCS7_set_cipher(PKCS7 *p7, const EVP_CIPHER *cipher); +int PKCS7_stream(unsigned char ***boundary, PKCS7 *p7); + +PKCS7_ISSUER_AND_SERIAL *PKCS7_get_issuer_and_serial(PKCS7 *p7, int idx); +ASN1_OCTET_STRING *PKCS7_digest_from_attributes(STACK_OF(X509_ATTRIBUTE) *sk); +int PKCS7_add_signed_attribute(PKCS7_SIGNER_INFO *p7si, int nid, int type, + void *data); +int PKCS7_add_attribute(PKCS7_SIGNER_INFO *p7si, int nid, int atrtype, + void *value); +ASN1_TYPE *PKCS7_get_attribute(PKCS7_SIGNER_INFO *si, int nid); +ASN1_TYPE *PKCS7_get_signed_attribute(PKCS7_SIGNER_INFO *si, int nid); +int PKCS7_set_signed_attributes(PKCS7_SIGNER_INFO *p7si, + STACK_OF(X509_ATTRIBUTE) *sk); +int PKCS7_set_attributes(PKCS7_SIGNER_INFO *p7si, + STACK_OF(X509_ATTRIBUTE) *sk); + +PKCS7 *PKCS7_sign(X509 *signcert, EVP_PKEY *pkey, STACK_OF(X509) *certs, + BIO *data, int flags); + +PKCS7_SIGNER_INFO *PKCS7_sign_add_signer(PKCS7 *p7, + X509 *signcert, EVP_PKEY *pkey, + const EVP_MD *md, int flags); + +int PKCS7_final(PKCS7 *p7, BIO *data, int flags); +int PKCS7_verify(PKCS7 *p7, STACK_OF(X509) *certs, X509_STORE *store, + BIO *indata, BIO *out, int flags); +STACK_OF(X509) *PKCS7_get0_signers(PKCS7 *p7, STACK_OF(X509) *certs, + int flags); +PKCS7 *PKCS7_encrypt(STACK_OF(X509) *certs, BIO *in, const EVP_CIPHER *cipher, + int flags); +int PKCS7_decrypt(PKCS7 *p7, EVP_PKEY *pkey, X509 *cert, BIO *data, + int flags); + +int PKCS7_add_attrib_smimecap(PKCS7_SIGNER_INFO *si, + STACK_OF(X509_ALGOR) *cap); +STACK_OF(X509_ALGOR) *PKCS7_get_smimecap(PKCS7_SIGNER_INFO *si); +int PKCS7_simple_smimecap(STACK_OF(X509_ALGOR) *sk, int nid, int arg); + +int PKCS7_add_attrib_content_type(PKCS7_SIGNER_INFO *si, ASN1_OBJECT *coid); +int PKCS7_add0_attrib_signing_time(PKCS7_SIGNER_INFO *si, ASN1_TIME *t); +int PKCS7_add1_attrib_digest(PKCS7_SIGNER_INFO *si, + const unsigned char *md, int mdlen); + +int SMIME_write_PKCS7(BIO *bio, PKCS7 *p7, BIO *data, int flags); +PKCS7 *SMIME_read_PKCS7(BIO *bio, BIO **bcont); + +BIO *BIO_new_PKCS7(BIO *out, PKCS7 *p7); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_PKCS7_strings(void); + +/* Error codes for the PKCS7 functions. */ + +/* Function codes. */ +# define PKCS7_F_B64_READ_PKCS7 120 +# define PKCS7_F_B64_WRITE_PKCS7 121 +# define PKCS7_F_DO_PKCS7_SIGNED_ATTRIB 136 +# define PKCS7_F_I2D_PKCS7_BIO_STREAM 140 +# define PKCS7_F_PKCS7_ADD0_ATTRIB_SIGNING_TIME 135 +# define PKCS7_F_PKCS7_ADD_ATTRIB_SMIMECAP 118 +# define PKCS7_F_PKCS7_ADD_CERTIFICATE 100 +# define PKCS7_F_PKCS7_ADD_CRL 101 +# define PKCS7_F_PKCS7_ADD_RECIPIENT_INFO 102 +# define PKCS7_F_PKCS7_ADD_SIGNATURE 131 +# define PKCS7_F_PKCS7_ADD_SIGNER 103 +# define PKCS7_F_PKCS7_BIO_ADD_DIGEST 125 +# define PKCS7_F_PKCS7_COPY_EXISTING_DIGEST 138 +# define PKCS7_F_PKCS7_CTRL 104 +# define PKCS7_F_PKCS7_DATADECODE 112 +# define PKCS7_F_PKCS7_DATAFINAL 128 +# define PKCS7_F_PKCS7_DATAINIT 105 +# define PKCS7_F_PKCS7_DATASIGN 106 +# define PKCS7_F_PKCS7_DATAVERIFY 107 +# define PKCS7_F_PKCS7_DECRYPT 114 +# define PKCS7_F_PKCS7_DECRYPT_RINFO 133 +# define PKCS7_F_PKCS7_ENCODE_RINFO 132 +# define PKCS7_F_PKCS7_ENCRYPT 115 +# define PKCS7_F_PKCS7_FINAL 134 +# define PKCS7_F_PKCS7_FIND_DIGEST 127 +# define PKCS7_F_PKCS7_GET0_SIGNERS 124 +# define PKCS7_F_PKCS7_RECIP_INFO_SET 130 +# define PKCS7_F_PKCS7_SET_CIPHER 108 +# define PKCS7_F_PKCS7_SET_CONTENT 109 +# define PKCS7_F_PKCS7_SET_DIGEST 126 +# define PKCS7_F_PKCS7_SET_TYPE 110 +# define PKCS7_F_PKCS7_SIGN 116 +# define PKCS7_F_PKCS7_SIGNATUREVERIFY 113 +# define PKCS7_F_PKCS7_SIGNER_INFO_SET 129 +# define PKCS7_F_PKCS7_SIGNER_INFO_SIGN 139 +# define PKCS7_F_PKCS7_SIGN_ADD_SIGNER 137 +# define PKCS7_F_PKCS7_SIMPLE_SMIMECAP 119 +# define PKCS7_F_PKCS7_VERIFY 117 +# define PKCS7_F_SMIME_READ_PKCS7 122 +# define PKCS7_F_SMIME_TEXT 123 + +/* Reason codes. */ +# define PKCS7_R_CERTIFICATE_VERIFY_ERROR 117 +# define PKCS7_R_CIPHER_HAS_NO_OBJECT_IDENTIFIER 144 +# define PKCS7_R_CIPHER_NOT_INITIALIZED 116 +# define PKCS7_R_CONTENT_AND_DATA_PRESENT 118 +# define PKCS7_R_CTRL_ERROR 152 +# define PKCS7_R_DECODE_ERROR 130 +# define PKCS7_R_DECRYPTED_KEY_IS_WRONG_LENGTH 100 +# define PKCS7_R_DECRYPT_ERROR 119 +# define PKCS7_R_DIGEST_FAILURE 101 +# define PKCS7_R_ENCRYPTION_CTRL_FAILURE 149 +# define PKCS7_R_ENCRYPTION_NOT_SUPPORTED_FOR_THIS_KEY_TYPE 150 +# define PKCS7_R_ERROR_ADDING_RECIPIENT 120 +# define PKCS7_R_ERROR_SETTING_CIPHER 121 +# define PKCS7_R_INVALID_MIME_TYPE 131 +# define PKCS7_R_INVALID_NULL_POINTER 143 +# define PKCS7_R_INVALID_SIGNED_DATA_TYPE 155 +# define PKCS7_R_MIME_NO_CONTENT_TYPE 132 +# define PKCS7_R_MIME_PARSE_ERROR 133 +# define PKCS7_R_MIME_SIG_PARSE_ERROR 134 +# define PKCS7_R_MISSING_CERIPEND_INFO 103 +# define PKCS7_R_NO_CONTENT 122 +# define PKCS7_R_NO_CONTENT_TYPE 135 +# define PKCS7_R_NO_DEFAULT_DIGEST 151 +# define PKCS7_R_NO_MATCHING_DIGEST_TYPE_FOUND 154 +# define PKCS7_R_NO_MULTIPART_BODY_FAILURE 136 +# define PKCS7_R_NO_MULTIPART_BOUNDARY 137 +# define PKCS7_R_NO_RECIPIENT_MATCHES_CERTIFICATE 115 +# define PKCS7_R_NO_RECIPIENT_MATCHES_KEY 146 +# define PKCS7_R_NO_SIGNATURES_ON_DATA 123 +# define PKCS7_R_NO_SIGNERS 142 +# define PKCS7_R_NO_SIG_CONTENT_TYPE 138 +# define PKCS7_R_OPERATION_NOT_SUPPORTED_ON_THIS_TYPE 104 +# define PKCS7_R_PKCS7_ADD_SIGNATURE_ERROR 124 +# define PKCS7_R_PKCS7_ADD_SIGNER_ERROR 153 +# define PKCS7_R_PKCS7_DATAFINAL 126 +# define PKCS7_R_PKCS7_DATAFINAL_ERROR 125 +# define PKCS7_R_PKCS7_DATASIGN 145 +# define PKCS7_R_PKCS7_PARSE_ERROR 139 +# define PKCS7_R_PKCS7_SIG_PARSE_ERROR 140 +# define PKCS7_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE 127 +# define PKCS7_R_SIGNATURE_FAILURE 105 +# define PKCS7_R_SIGNER_CERTIFICATE_NOT_FOUND 128 +# define PKCS7_R_SIGNING_CTRL_FAILURE 147 +# define PKCS7_R_SIGNING_NOT_SUPPORTED_FOR_THIS_KEY_TYPE 148 +# define PKCS7_R_SIG_INVALID_MIME_TYPE 141 +# define PKCS7_R_SMIME_TEXT_ERROR 129 +# define PKCS7_R_UNABLE_TO_FIND_CERTIFICATE 106 +# define PKCS7_R_UNABLE_TO_FIND_MEM_BIO 107 +# define PKCS7_R_UNABLE_TO_FIND_MESSAGE_DIGEST 108 +# define PKCS7_R_UNKNOWN_DIGEST_TYPE 109 +# define PKCS7_R_UNKNOWN_OPERATION 110 +# define PKCS7_R_UNSUPPORTED_CIPHER_TYPE 111 +# define PKCS7_R_UNSUPPORTED_CONTENT_TYPE 112 +# define PKCS7_R_WRONG_CONTENT_TYPE 113 +# define PKCS7_R_WRONG_PKCS7_TYPE 114 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/win/openssl/include/openssl/pqueue.h b/hdssd/external/win/openssl/include/openssl/pqueue.h new file mode 100644 index 0000000..d40d9c7 --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/pqueue.h @@ -0,0 +1,99 @@ +/* crypto/pqueue/pqueue.h */ +/* + * DTLS implementation written by Nagendra Modadugu + * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. + */ +/* ==================================================================== + * Copyright (c) 1999-2005 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_PQUEUE_H +# define HEADER_PQUEUE_H + +# include +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif +typedef struct _pqueue *pqueue; + +typedef struct _pitem { + unsigned char priority[8]; /* 64-bit value in big-endian encoding */ + void *data; + struct _pitem *next; +} pitem; + +typedef struct _pitem *piterator; + +pitem *pitem_new(unsigned char *prio64be, void *data); +void pitem_free(pitem *item); + +pqueue pqueue_new(void); +void pqueue_free(pqueue pq); + +pitem *pqueue_insert(pqueue pq, pitem *item); +pitem *pqueue_peek(pqueue pq); +pitem *pqueue_pop(pqueue pq); +pitem *pqueue_find(pqueue pq, unsigned char *prio64be); +pitem *pqueue_iterator(pqueue pq); +pitem *pqueue_next(piterator *iter); + +void pqueue_print(pqueue pq); +int pqueue_size(pqueue pq); + +#ifdef __cplusplus +} +#endif +#endif /* ! HEADER_PQUEUE_H */ diff --git a/hdssd/external/win/openssl/include/openssl/rand.h b/hdssd/external/win/openssl/include/openssl/rand.h new file mode 100644 index 0000000..2553afd --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/rand.h @@ -0,0 +1,150 @@ +/* crypto/rand/rand.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_RAND_H +# define HEADER_RAND_H + +# include +# include +# include + +# if defined(OPENSSL_SYS_WINDOWS) +# include +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +# if defined(OPENSSL_FIPS) +# define FIPS_RAND_SIZE_T size_t +# endif + +/* Already defined in ossl_typ.h */ +/* typedef struct rand_meth_st RAND_METHOD; */ + +struct rand_meth_st { + void (*seed) (const void *buf, int num); + int (*bytes) (unsigned char *buf, int num); + void (*cleanup) (void); + void (*add) (const void *buf, int num, double entropy); + int (*pseudorand) (unsigned char *buf, int num); + int (*status) (void); +}; + +# ifdef BN_DEBUG +extern int rand_predictable; +# endif + +int RAND_set_rand_method(const RAND_METHOD *meth); +const RAND_METHOD *RAND_get_rand_method(void); +# ifndef OPENSSL_NO_ENGINE +int RAND_set_rand_engine(ENGINE *engine); +# endif +RAND_METHOD *RAND_SSLeay(void); +void RAND_cleanup(void); +int RAND_bytes(unsigned char *buf, int num); +int RAND_pseudo_bytes(unsigned char *buf, int num); +void RAND_seed(const void *buf, int num); +void RAND_add(const void *buf, int num, double entropy); +int RAND_load_file(const char *file, long max_bytes); +int RAND_write_file(const char *file); +const char *RAND_file_name(char *file, size_t num); +int RAND_status(void); +int RAND_query_egd_bytes(const char *path, unsigned char *buf, int bytes); +int RAND_egd(const char *path); +int RAND_egd_bytes(const char *path, int bytes); +int RAND_poll(void); + +# if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_WIN32) + +void RAND_screen(void); +int RAND_event(UINT, WPARAM, LPARAM); + +# endif + +# ifdef OPENSSL_FIPS +void RAND_set_fips_drbg_type(int type, int flags); +int RAND_init_fips(void); +# endif + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_RAND_strings(void); + +/* Error codes for the RAND functions. */ + +/* Function codes. */ +# define RAND_F_RAND_GET_RAND_METHOD 101 +# define RAND_F_RAND_INIT_FIPS 102 +# define RAND_F_SSLEAY_RAND_BYTES 100 + +/* Reason codes. */ +# define RAND_R_DUAL_EC_DRBG_DISABLED 104 +# define RAND_R_ERROR_INITIALISING_DRBG 102 +# define RAND_R_ERROR_INSTANTIATING_DRBG 103 +# define RAND_R_NO_FIPS_RANDOM_METHOD_SET 101 +# define RAND_R_PRNG_NOT_SEEDED 100 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/win/openssl/include/openssl/rc2.h b/hdssd/external/win/openssl/include/openssl/rc2.h new file mode 100644 index 0000000..29d02d7 --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/rc2.h @@ -0,0 +1,103 @@ +/* crypto/rc2/rc2.h */ +/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_RC2_H +# define HEADER_RC2_H + +# include /* OPENSSL_NO_RC2, RC2_INT */ +# ifdef OPENSSL_NO_RC2 +# error RC2 is disabled. +# endif + +# define RC2_ENCRYPT 1 +# define RC2_DECRYPT 0 + +# define RC2_BLOCK 8 +# define RC2_KEY_LENGTH 16 + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct rc2_key_st { + RC2_INT data[64]; +} RC2_KEY; + +# ifdef OPENSSL_FIPS +void private_RC2_set_key(RC2_KEY *key, int len, const unsigned char *data, + int bits); +# endif +void RC2_set_key(RC2_KEY *key, int len, const unsigned char *data, int bits); +void RC2_ecb_encrypt(const unsigned char *in, unsigned char *out, + RC2_KEY *key, int enc); +void RC2_encrypt(unsigned long *data, RC2_KEY *key); +void RC2_decrypt(unsigned long *data, RC2_KEY *key); +void RC2_cbc_encrypt(const unsigned char *in, unsigned char *out, long length, + RC2_KEY *ks, unsigned char *iv, int enc); +void RC2_cfb64_encrypt(const unsigned char *in, unsigned char *out, + long length, RC2_KEY *schedule, unsigned char *ivec, + int *num, int enc); +void RC2_ofb64_encrypt(const unsigned char *in, unsigned char *out, + long length, RC2_KEY *schedule, unsigned char *ivec, + int *num); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/win/openssl/include/openssl/rc4.h b/hdssd/external/win/openssl/include/openssl/rc4.h new file mode 100644 index 0000000..39162b1 --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/rc4.h @@ -0,0 +1,88 @@ +/* crypto/rc4/rc4.h */ +/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_RC4_H +# define HEADER_RC4_H + +# include /* OPENSSL_NO_RC4, RC4_INT */ +# ifdef OPENSSL_NO_RC4 +# error RC4 is disabled. +# endif + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct rc4_key_st { + RC4_INT x, y; + RC4_INT data[256]; +} RC4_KEY; + +const char *RC4_options(void); +void RC4_set_key(RC4_KEY *key, int len, const unsigned char *data); +void private_RC4_set_key(RC4_KEY *key, int len, const unsigned char *data); +void RC4(RC4_KEY *key, size_t len, const unsigned char *indata, + unsigned char *outdata); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/win/openssl/include/openssl/ripemd.h b/hdssd/external/win/openssl/include/openssl/ripemd.h new file mode 100644 index 0000000..b88ef25 --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/ripemd.h @@ -0,0 +1,105 @@ +/* crypto/ripemd/ripemd.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_RIPEMD_H +# define HEADER_RIPEMD_H + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# ifdef OPENSSL_NO_RIPEMD +# error RIPEMD is disabled. +# endif + +# if defined(__LP32__) +# define RIPEMD160_LONG unsigned long +# elif defined(OPENSSL_SYS_CRAY) || defined(__ILP64__) +# define RIPEMD160_LONG unsigned long +# define RIPEMD160_LONG_LOG2 3 +# else +# define RIPEMD160_LONG unsigned int +# endif + +# define RIPEMD160_CBLOCK 64 +# define RIPEMD160_LBLOCK (RIPEMD160_CBLOCK/4) +# define RIPEMD160_DIGEST_LENGTH 20 + +typedef struct RIPEMD160state_st { + RIPEMD160_LONG A, B, C, D, E; + RIPEMD160_LONG Nl, Nh; + RIPEMD160_LONG data[RIPEMD160_LBLOCK]; + unsigned int num; +} RIPEMD160_CTX; + +# ifdef OPENSSL_FIPS +int private_RIPEMD160_Init(RIPEMD160_CTX *c); +# endif +int RIPEMD160_Init(RIPEMD160_CTX *c); +int RIPEMD160_Update(RIPEMD160_CTX *c, const void *data, size_t len); +int RIPEMD160_Final(unsigned char *md, RIPEMD160_CTX *c); +unsigned char *RIPEMD160(const unsigned char *d, size_t n, unsigned char *md); +void RIPEMD160_Transform(RIPEMD160_CTX *c, const unsigned char *b); +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/win/openssl/include/openssl/rsa.h b/hdssd/external/win/openssl/include/openssl/rsa.h new file mode 100644 index 0000000..d2ee374 --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/rsa.h @@ -0,0 +1,664 @@ +/* crypto/rsa/rsa.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_RSA_H +# define HEADER_RSA_H + +# include + +# ifndef OPENSSL_NO_BIO +# include +# endif +# include +# include +# ifndef OPENSSL_NO_DEPRECATED +# include +# endif + +# ifdef OPENSSL_NO_RSA +# error RSA is disabled. +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* Declared already in ossl_typ.h */ +/* typedef struct rsa_st RSA; */ +/* typedef struct rsa_meth_st RSA_METHOD; */ + +struct rsa_meth_st { + const char *name; + int (*rsa_pub_enc) (int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, int padding); + int (*rsa_pub_dec) (int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, int padding); + int (*rsa_priv_enc) (int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, int padding); + int (*rsa_priv_dec) (int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, int padding); + /* Can be null */ + int (*rsa_mod_exp) (BIGNUM *r0, const BIGNUM *I, RSA *rsa, BN_CTX *ctx); + /* Can be null */ + int (*bn_mod_exp) (BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx); + /* called at new */ + int (*init) (RSA *rsa); + /* called at free */ + int (*finish) (RSA *rsa); + /* RSA_METHOD_FLAG_* things */ + int flags; + /* may be needed! */ + char *app_data; + /* + * New sign and verify functions: some libraries don't allow arbitrary + * data to be signed/verified: this allows them to be used. Note: for + * this to work the RSA_public_decrypt() and RSA_private_encrypt() should + * *NOT* be used RSA_sign(), RSA_verify() should be used instead. Note: + * for backwards compatibility this functionality is only enabled if the + * RSA_FLAG_SIGN_VER option is set in 'flags'. + */ + int (*rsa_sign) (int type, + const unsigned char *m, unsigned int m_length, + unsigned char *sigret, unsigned int *siglen, + const RSA *rsa); + int (*rsa_verify) (int dtype, const unsigned char *m, + unsigned int m_length, const unsigned char *sigbuf, + unsigned int siglen, const RSA *rsa); + /* + * If this callback is NULL, the builtin software RSA key-gen will be + * used. This is for behavioural compatibility whilst the code gets + * rewired, but one day it would be nice to assume there are no such + * things as "builtin software" implementations. + */ + int (*rsa_keygen) (RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb); +}; + +struct rsa_st { + /* + * The first parameter is used to pickup errors where this is passed + * instead of aEVP_PKEY, it is set to 0 + */ + int pad; + long version; + const RSA_METHOD *meth; + /* functional reference if 'meth' is ENGINE-provided */ + ENGINE *engine; + BIGNUM *n; + BIGNUM *e; + BIGNUM *d; + BIGNUM *p; + BIGNUM *q; + BIGNUM *dmp1; + BIGNUM *dmq1; + BIGNUM *iqmp; + /* be careful using this if the RSA structure is shared */ + CRYPTO_EX_DATA ex_data; + int references; + int flags; + /* Used to cache montgomery values */ + BN_MONT_CTX *_method_mod_n; + BN_MONT_CTX *_method_mod_p; + BN_MONT_CTX *_method_mod_q; + /* + * all BIGNUM values are actually in the following data, if it is not + * NULL + */ + char *bignum_data; + BN_BLINDING *blinding; + BN_BLINDING *mt_blinding; +}; + +# ifndef OPENSSL_RSA_MAX_MODULUS_BITS +# define OPENSSL_RSA_MAX_MODULUS_BITS 16384 +# endif + +# ifndef OPENSSL_RSA_SMALL_MODULUS_BITS +# define OPENSSL_RSA_SMALL_MODULUS_BITS 3072 +# endif +# ifndef OPENSSL_RSA_MAX_PUBEXP_BITS + +/* exponent limit enforced for "large" modulus only */ +# define OPENSSL_RSA_MAX_PUBEXP_BITS 64 +# endif + +# define RSA_3 0x3L +# define RSA_F4 0x10001L + +# define RSA_METHOD_FLAG_NO_CHECK 0x0001/* don't check pub/private + * match */ + +# define RSA_FLAG_CACHE_PUBLIC 0x0002 +# define RSA_FLAG_CACHE_PRIVATE 0x0004 +# define RSA_FLAG_BLINDING 0x0008 +# define RSA_FLAG_THREAD_SAFE 0x0010 +/* + * This flag means the private key operations will be handled by rsa_mod_exp + * and that they do not depend on the private key components being present: + * for example a key stored in external hardware. Without this flag + * bn_mod_exp gets called when private key components are absent. + */ +# define RSA_FLAG_EXT_PKEY 0x0020 + +/* + * This flag in the RSA_METHOD enables the new rsa_sign, rsa_verify + * functions. + */ +# define RSA_FLAG_SIGN_VER 0x0040 + +/* + * new with 0.9.6j and 0.9.7b; the built-in + * RSA implementation now uses blinding by + * default (ignoring RSA_FLAG_BLINDING), + * but other engines might not need it + */ +# define RSA_FLAG_NO_BLINDING 0x0080 +/* + * new with 0.9.8f; the built-in RSA + * implementation now uses constant time + * operations by default in private key operations, + * e.g., constant time modular exponentiation, + * modular inverse without leaking branches, + * division without leaking branches. This + * flag disables these constant time + * operations and results in faster RSA + * private key operations. + */ +# define RSA_FLAG_NO_CONSTTIME 0x0100 +# ifdef OPENSSL_USE_DEPRECATED +/* deprecated name for the flag*/ +/* + * new with 0.9.7h; the built-in RSA + * implementation now uses constant time + * modular exponentiation for secret exponents + * by default. This flag causes the + * faster variable sliding window method to + * be used for all exponents. + */ +# define RSA_FLAG_NO_EXP_CONSTTIME RSA_FLAG_NO_CONSTTIME +# endif + +# define EVP_PKEY_CTX_set_rsa_padding(ctx, pad) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, -1, EVP_PKEY_CTRL_RSA_PADDING, \ + pad, NULL) + +# define EVP_PKEY_CTX_get_rsa_padding(ctx, ppad) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, -1, \ + EVP_PKEY_CTRL_GET_RSA_PADDING, 0, ppad) + +# define EVP_PKEY_CTX_set_rsa_pss_saltlen(ctx, len) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, \ + (EVP_PKEY_OP_SIGN|EVP_PKEY_OP_VERIFY), \ + EVP_PKEY_CTRL_RSA_PSS_SALTLEN, \ + len, NULL) + +# define EVP_PKEY_CTX_get_rsa_pss_saltlen(ctx, plen) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, \ + (EVP_PKEY_OP_SIGN|EVP_PKEY_OP_VERIFY), \ + EVP_PKEY_CTRL_GET_RSA_PSS_SALTLEN, \ + 0, plen) + +# define EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, bits) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, EVP_PKEY_OP_KEYGEN, \ + EVP_PKEY_CTRL_RSA_KEYGEN_BITS, bits, NULL) + +# define EVP_PKEY_CTX_set_rsa_keygen_pubexp(ctx, pubexp) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, EVP_PKEY_OP_KEYGEN, \ + EVP_PKEY_CTRL_RSA_KEYGEN_PUBEXP, 0, pubexp) + +# define EVP_PKEY_CTX_set_rsa_mgf1_md(ctx, md) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, \ + EVP_PKEY_OP_TYPE_SIG | EVP_PKEY_OP_TYPE_CRYPT, \ + EVP_PKEY_CTRL_RSA_MGF1_MD, 0, (void *)md) + +# define EVP_PKEY_CTX_set_rsa_oaep_md(ctx, md) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, EVP_PKEY_OP_TYPE_CRYPT, \ + EVP_PKEY_CTRL_RSA_OAEP_MD, 0, (void *)md) + +# define EVP_PKEY_CTX_get_rsa_mgf1_md(ctx, pmd) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, \ + EVP_PKEY_OP_TYPE_SIG | EVP_PKEY_OP_TYPE_CRYPT, \ + EVP_PKEY_CTRL_GET_RSA_MGF1_MD, 0, (void *)pmd) + +# define EVP_PKEY_CTX_get_rsa_oaep_md(ctx, pmd) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, EVP_PKEY_OP_TYPE_CRYPT, \ + EVP_PKEY_CTRL_GET_RSA_OAEP_MD, 0, (void *)pmd) + +# define EVP_PKEY_CTX_set0_rsa_oaep_label(ctx, l, llen) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, EVP_PKEY_OP_TYPE_CRYPT, \ + EVP_PKEY_CTRL_RSA_OAEP_LABEL, llen, (void *)l) + +# define EVP_PKEY_CTX_get0_rsa_oaep_label(ctx, l) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, EVP_PKEY_OP_TYPE_CRYPT, \ + EVP_PKEY_CTRL_GET_RSA_OAEP_LABEL, 0, (void *)l) + +# define EVP_PKEY_CTRL_RSA_PADDING (EVP_PKEY_ALG_CTRL + 1) +# define EVP_PKEY_CTRL_RSA_PSS_SALTLEN (EVP_PKEY_ALG_CTRL + 2) + +# define EVP_PKEY_CTRL_RSA_KEYGEN_BITS (EVP_PKEY_ALG_CTRL + 3) +# define EVP_PKEY_CTRL_RSA_KEYGEN_PUBEXP (EVP_PKEY_ALG_CTRL + 4) +# define EVP_PKEY_CTRL_RSA_MGF1_MD (EVP_PKEY_ALG_CTRL + 5) + +# define EVP_PKEY_CTRL_GET_RSA_PADDING (EVP_PKEY_ALG_CTRL + 6) +# define EVP_PKEY_CTRL_GET_RSA_PSS_SALTLEN (EVP_PKEY_ALG_CTRL + 7) +# define EVP_PKEY_CTRL_GET_RSA_MGF1_MD (EVP_PKEY_ALG_CTRL + 8) + +# define EVP_PKEY_CTRL_RSA_OAEP_MD (EVP_PKEY_ALG_CTRL + 9) +# define EVP_PKEY_CTRL_RSA_OAEP_LABEL (EVP_PKEY_ALG_CTRL + 10) + +# define EVP_PKEY_CTRL_GET_RSA_OAEP_MD (EVP_PKEY_ALG_CTRL + 11) +# define EVP_PKEY_CTRL_GET_RSA_OAEP_LABEL (EVP_PKEY_ALG_CTRL + 12) + +# define RSA_PKCS1_PADDING 1 +# define RSA_SSLV23_PADDING 2 +# define RSA_NO_PADDING 3 +# define RSA_PKCS1_OAEP_PADDING 4 +# define RSA_X931_PADDING 5 +/* EVP_PKEY_ only */ +# define RSA_PKCS1_PSS_PADDING 6 + +# define RSA_PKCS1_PADDING_SIZE 11 + +# define RSA_set_app_data(s,arg) RSA_set_ex_data(s,0,arg) +# define RSA_get_app_data(s) RSA_get_ex_data(s,0) + +RSA *RSA_new(void); +RSA *RSA_new_method(ENGINE *engine); +int RSA_size(const RSA *rsa); + +/* Deprecated version */ +# ifndef OPENSSL_NO_DEPRECATED +RSA *RSA_generate_key(int bits, unsigned long e, void + (*callback) (int, int, void *), void *cb_arg); +# endif /* !defined(OPENSSL_NO_DEPRECATED) */ + +/* New version */ +int RSA_generate_key_ex(RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb); + +int RSA_check_key(const RSA *); + /* next 4 return -1 on error */ +int RSA_public_encrypt(int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, int padding); +int RSA_private_encrypt(int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, int padding); +int RSA_public_decrypt(int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, int padding); +int RSA_private_decrypt(int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, int padding); +void RSA_free(RSA *r); +/* "up" the RSA object's reference count */ +int RSA_up_ref(RSA *r); + +int RSA_flags(const RSA *r); + +void RSA_set_default_method(const RSA_METHOD *meth); +const RSA_METHOD *RSA_get_default_method(void); +const RSA_METHOD *RSA_get_method(const RSA *rsa); +int RSA_set_method(RSA *rsa, const RSA_METHOD *meth); + +/* This function needs the memory locking malloc callbacks to be installed */ +int RSA_memory_lock(RSA *r); + +/* these are the actual SSLeay RSA functions */ +const RSA_METHOD *RSA_PKCS1_SSLeay(void); + +const RSA_METHOD *RSA_null_method(void); + +DECLARE_ASN1_ENCODE_FUNCTIONS_const(RSA, RSAPublicKey) +DECLARE_ASN1_ENCODE_FUNCTIONS_const(RSA, RSAPrivateKey) + +typedef struct rsa_pss_params_st { + X509_ALGOR *hashAlgorithm; + X509_ALGOR *maskGenAlgorithm; + ASN1_INTEGER *saltLength; + ASN1_INTEGER *trailerField; +} RSA_PSS_PARAMS; + +DECLARE_ASN1_FUNCTIONS(RSA_PSS_PARAMS) + +typedef struct rsa_oaep_params_st { + X509_ALGOR *hashFunc; + X509_ALGOR *maskGenFunc; + X509_ALGOR *pSourceFunc; +} RSA_OAEP_PARAMS; + +DECLARE_ASN1_FUNCTIONS(RSA_OAEP_PARAMS) + +# ifndef OPENSSL_NO_FP_API +int RSA_print_fp(FILE *fp, const RSA *r, int offset); +# endif + +# ifndef OPENSSL_NO_BIO +int RSA_print(BIO *bp, const RSA *r, int offset); +# endif + +# ifndef OPENSSL_NO_RC4 +int i2d_RSA_NET(const RSA *a, unsigned char **pp, + int (*cb) (char *buf, int len, const char *prompt, + int verify), int sgckey); +RSA *d2i_RSA_NET(RSA **a, const unsigned char **pp, long length, + int (*cb) (char *buf, int len, const char *prompt, + int verify), int sgckey); + +int i2d_Netscape_RSA(const RSA *a, unsigned char **pp, + int (*cb) (char *buf, int len, const char *prompt, + int verify)); +RSA *d2i_Netscape_RSA(RSA **a, const unsigned char **pp, long length, + int (*cb) (char *buf, int len, const char *prompt, + int verify)); +# endif + +/* + * The following 2 functions sign and verify a X509_SIG ASN1 object inside + * PKCS#1 padded RSA encryption + */ +int RSA_sign(int type, const unsigned char *m, unsigned int m_length, + unsigned char *sigret, unsigned int *siglen, RSA *rsa); +int RSA_verify(int type, const unsigned char *m, unsigned int m_length, + const unsigned char *sigbuf, unsigned int siglen, RSA *rsa); + +/* + * The following 2 function sign and verify a ASN1_OCTET_STRING object inside + * PKCS#1 padded RSA encryption + */ +int RSA_sign_ASN1_OCTET_STRING(int type, + const unsigned char *m, unsigned int m_length, + unsigned char *sigret, unsigned int *siglen, + RSA *rsa); +int RSA_verify_ASN1_OCTET_STRING(int type, const unsigned char *m, + unsigned int m_length, unsigned char *sigbuf, + unsigned int siglen, RSA *rsa); + +int RSA_blinding_on(RSA *rsa, BN_CTX *ctx); +void RSA_blinding_off(RSA *rsa); +BN_BLINDING *RSA_setup_blinding(RSA *rsa, BN_CTX *ctx); + +int RSA_padding_add_PKCS1_type_1(unsigned char *to, int tlen, + const unsigned char *f, int fl); +int RSA_padding_check_PKCS1_type_1(unsigned char *to, int tlen, + const unsigned char *f, int fl, + int rsa_len); +int RSA_padding_add_PKCS1_type_2(unsigned char *to, int tlen, + const unsigned char *f, int fl); +int RSA_padding_check_PKCS1_type_2(unsigned char *to, int tlen, + const unsigned char *f, int fl, + int rsa_len); +int PKCS1_MGF1(unsigned char *mask, long len, const unsigned char *seed, + long seedlen, const EVP_MD *dgst); +int RSA_padding_add_PKCS1_OAEP(unsigned char *to, int tlen, + const unsigned char *f, int fl, + const unsigned char *p, int pl); +int RSA_padding_check_PKCS1_OAEP(unsigned char *to, int tlen, + const unsigned char *f, int fl, int rsa_len, + const unsigned char *p, int pl); +int RSA_padding_add_PKCS1_OAEP_mgf1(unsigned char *to, int tlen, + const unsigned char *from, int flen, + const unsigned char *param, int plen, + const EVP_MD *md, const EVP_MD *mgf1md); +int RSA_padding_check_PKCS1_OAEP_mgf1(unsigned char *to, int tlen, + const unsigned char *from, int flen, + int num, const unsigned char *param, + int plen, const EVP_MD *md, + const EVP_MD *mgf1md); +int RSA_padding_add_SSLv23(unsigned char *to, int tlen, + const unsigned char *f, int fl); +int RSA_padding_check_SSLv23(unsigned char *to, int tlen, + const unsigned char *f, int fl, int rsa_len); +int RSA_padding_add_none(unsigned char *to, int tlen, const unsigned char *f, + int fl); +int RSA_padding_check_none(unsigned char *to, int tlen, + const unsigned char *f, int fl, int rsa_len); +int RSA_padding_add_X931(unsigned char *to, int tlen, const unsigned char *f, + int fl); +int RSA_padding_check_X931(unsigned char *to, int tlen, + const unsigned char *f, int fl, int rsa_len); +int RSA_X931_hash_id(int nid); + +int RSA_verify_PKCS1_PSS(RSA *rsa, const unsigned char *mHash, + const EVP_MD *Hash, const unsigned char *EM, + int sLen); +int RSA_padding_add_PKCS1_PSS(RSA *rsa, unsigned char *EM, + const unsigned char *mHash, const EVP_MD *Hash, + int sLen); + +int RSA_verify_PKCS1_PSS_mgf1(RSA *rsa, const unsigned char *mHash, + const EVP_MD *Hash, const EVP_MD *mgf1Hash, + const unsigned char *EM, int sLen); + +int RSA_padding_add_PKCS1_PSS_mgf1(RSA *rsa, unsigned char *EM, + const unsigned char *mHash, + const EVP_MD *Hash, const EVP_MD *mgf1Hash, + int sLen); + +int RSA_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); +int RSA_set_ex_data(RSA *r, int idx, void *arg); +void *RSA_get_ex_data(const RSA *r, int idx); + +RSA *RSAPublicKey_dup(RSA *rsa); +RSA *RSAPrivateKey_dup(RSA *rsa); + +/* + * If this flag is set the RSA method is FIPS compliant and can be used in + * FIPS mode. This is set in the validated module method. If an application + * sets this flag in its own methods it is its responsibility to ensure the + * result is compliant. + */ + +# define RSA_FLAG_FIPS_METHOD 0x0400 + +/* + * If this flag is set the operations normally disabled in FIPS mode are + * permitted it is then the applications responsibility to ensure that the + * usage is compliant. + */ + +# define RSA_FLAG_NON_FIPS_ALLOW 0x0400 +/* + * Application has decided PRNG is good enough to generate a key: don't + * check. + */ +# define RSA_FLAG_CHECKED 0x0800 + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_RSA_strings(void); + +/* Error codes for the RSA functions. */ + +/* Function codes. */ +# define RSA_F_CHECK_PADDING_MD 140 +# define RSA_F_DO_RSA_PRINT 146 +# define RSA_F_INT_RSA_VERIFY 145 +# define RSA_F_MEMORY_LOCK 100 +# define RSA_F_OLD_RSA_PRIV_DECODE 147 +# define RSA_F_PKEY_RSA_CTRL 143 +# define RSA_F_PKEY_RSA_CTRL_STR 144 +# define RSA_F_PKEY_RSA_SIGN 142 +# define RSA_F_PKEY_RSA_VERIFY 154 +# define RSA_F_PKEY_RSA_VERIFYRECOVER 141 +# define RSA_F_RSA_ALGOR_TO_MD 157 +# define RSA_F_RSA_BUILTIN_KEYGEN 129 +# define RSA_F_RSA_CHECK_KEY 123 +# define RSA_F_RSA_CMS_DECRYPT 158 +# define RSA_F_RSA_EAY_PRIVATE_DECRYPT 101 +# define RSA_F_RSA_EAY_PRIVATE_ENCRYPT 102 +# define RSA_F_RSA_EAY_PUBLIC_DECRYPT 103 +# define RSA_F_RSA_EAY_PUBLIC_ENCRYPT 104 +# define RSA_F_RSA_GENERATE_KEY 105 +# define RSA_F_RSA_GENERATE_KEY_EX 155 +# define RSA_F_RSA_ITEM_VERIFY 156 +# define RSA_F_RSA_MEMORY_LOCK 130 +# define RSA_F_RSA_MGF1_TO_MD 159 +# define RSA_F_RSA_NEW_METHOD 106 +# define RSA_F_RSA_NULL 124 +# define RSA_F_RSA_NULL_MOD_EXP 131 +# define RSA_F_RSA_NULL_PRIVATE_DECRYPT 132 +# define RSA_F_RSA_NULL_PRIVATE_ENCRYPT 133 +# define RSA_F_RSA_NULL_PUBLIC_DECRYPT 134 +# define RSA_F_RSA_NULL_PUBLIC_ENCRYPT 135 +# define RSA_F_RSA_PADDING_ADD_NONE 107 +# define RSA_F_RSA_PADDING_ADD_PKCS1_OAEP 121 +# define RSA_F_RSA_PADDING_ADD_PKCS1_OAEP_MGF1 160 +# define RSA_F_RSA_PADDING_ADD_PKCS1_PSS 125 +# define RSA_F_RSA_PADDING_ADD_PKCS1_PSS_MGF1 148 +# define RSA_F_RSA_PADDING_ADD_PKCS1_TYPE_1 108 +# define RSA_F_RSA_PADDING_ADD_PKCS1_TYPE_2 109 +# define RSA_F_RSA_PADDING_ADD_SSLV23 110 +# define RSA_F_RSA_PADDING_ADD_X931 127 +# define RSA_F_RSA_PADDING_CHECK_NONE 111 +# define RSA_F_RSA_PADDING_CHECK_PKCS1_OAEP 122 +# define RSA_F_RSA_PADDING_CHECK_PKCS1_OAEP_MGF1 161 +# define RSA_F_RSA_PADDING_CHECK_PKCS1_TYPE_1 112 +# define RSA_F_RSA_PADDING_CHECK_PKCS1_TYPE_2 113 +# define RSA_F_RSA_PADDING_CHECK_SSLV23 114 +# define RSA_F_RSA_PADDING_CHECK_X931 128 +# define RSA_F_RSA_PRINT 115 +# define RSA_F_RSA_PRINT_FP 116 +# define RSA_F_RSA_PRIVATE_DECRYPT 150 +# define RSA_F_RSA_PRIVATE_ENCRYPT 151 +# define RSA_F_RSA_PRIV_DECODE 137 +# define RSA_F_RSA_PRIV_ENCODE 138 +# define RSA_F_RSA_PSS_TO_CTX 162 +# define RSA_F_RSA_PUBLIC_DECRYPT 152 +# define RSA_F_RSA_PUBLIC_ENCRYPT 153 +# define RSA_F_RSA_PUB_DECODE 139 +# define RSA_F_RSA_SETUP_BLINDING 136 +# define RSA_F_RSA_SIGN 117 +# define RSA_F_RSA_SIGN_ASN1_OCTET_STRING 118 +# define RSA_F_RSA_VERIFY 119 +# define RSA_F_RSA_VERIFY_ASN1_OCTET_STRING 120 +# define RSA_F_RSA_VERIFY_PKCS1_PSS 126 +# define RSA_F_RSA_VERIFY_PKCS1_PSS_MGF1 149 + +/* Reason codes. */ +# define RSA_R_ALGORITHM_MISMATCH 100 +# define RSA_R_BAD_E_VALUE 101 +# define RSA_R_BAD_FIXED_HEADER_DECRYPT 102 +# define RSA_R_BAD_PAD_BYTE_COUNT 103 +# define RSA_R_BAD_SIGNATURE 104 +# define RSA_R_BLOCK_TYPE_IS_NOT_01 106 +# define RSA_R_BLOCK_TYPE_IS_NOT_02 107 +# define RSA_R_DATA_GREATER_THAN_MOD_LEN 108 +# define RSA_R_DATA_TOO_LARGE 109 +# define RSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE 110 +# define RSA_R_DATA_TOO_LARGE_FOR_MODULUS 132 +# define RSA_R_DATA_TOO_SMALL 111 +# define RSA_R_DATA_TOO_SMALL_FOR_KEY_SIZE 122 +# define RSA_R_DIGEST_DOES_NOT_MATCH 166 +# define RSA_R_DIGEST_TOO_BIG_FOR_RSA_KEY 112 +# define RSA_R_DMP1_NOT_CONGRUENT_TO_D 124 +# define RSA_R_DMQ1_NOT_CONGRUENT_TO_D 125 +# define RSA_R_D_E_NOT_CONGRUENT_TO_1 123 +# define RSA_R_FIRST_OCTET_INVALID 133 +# define RSA_R_ILLEGAL_OR_UNSUPPORTED_PADDING_MODE 144 +# define RSA_R_INVALID_DIGEST 160 +# define RSA_R_INVALID_DIGEST_LENGTH 143 +# define RSA_R_INVALID_HEADER 137 +# define RSA_R_INVALID_KEYBITS 145 +# define RSA_R_INVALID_LABEL 161 +# define RSA_R_INVALID_MESSAGE_LENGTH 131 +# define RSA_R_INVALID_MGF1_MD 156 +# define RSA_R_INVALID_OAEP_PARAMETERS 162 +# define RSA_R_INVALID_PADDING 138 +# define RSA_R_INVALID_PADDING_MODE 141 +# define RSA_R_INVALID_PSS_PARAMETERS 149 +# define RSA_R_INVALID_PSS_SALTLEN 146 +# define RSA_R_INVALID_SALT_LENGTH 150 +# define RSA_R_INVALID_TRAILER 139 +# define RSA_R_INVALID_X931_DIGEST 142 +# define RSA_R_IQMP_NOT_INVERSE_OF_Q 126 +# define RSA_R_KEY_SIZE_TOO_SMALL 120 +# define RSA_R_LAST_OCTET_INVALID 134 +# define RSA_R_MODULUS_TOO_LARGE 105 +# define RSA_R_NON_FIPS_RSA_METHOD 157 +# define RSA_R_NO_PUBLIC_EXPONENT 140 +# define RSA_R_NULL_BEFORE_BLOCK_MISSING 113 +# define RSA_R_N_DOES_NOT_EQUAL_P_Q 127 +# define RSA_R_OAEP_DECODING_ERROR 121 +# define RSA_R_OPERATION_NOT_ALLOWED_IN_FIPS_MODE 158 +# define RSA_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE 148 +# define RSA_R_PADDING_CHECK_FAILED 114 +# define RSA_R_PKCS_DECODING_ERROR 159 +# define RSA_R_P_NOT_PRIME 128 +# define RSA_R_Q_NOT_PRIME 129 +# define RSA_R_RSA_OPERATIONS_NOT_SUPPORTED 130 +# define RSA_R_SLEN_CHECK_FAILED 136 +# define RSA_R_SLEN_RECOVERY_FAILED 135 +# define RSA_R_SSLV3_ROLLBACK_ATTACK 115 +# define RSA_R_THE_ASN1_OBJECT_IDENTIFIER_IS_NOT_KNOWN_FOR_THIS_MD 116 +# define RSA_R_UNKNOWN_ALGORITHM_TYPE 117 +# define RSA_R_UNKNOWN_DIGEST 163 +# define RSA_R_UNKNOWN_MASK_DIGEST 151 +# define RSA_R_UNKNOWN_PADDING_TYPE 118 +# define RSA_R_UNKNOWN_PSS_DIGEST 152 +# define RSA_R_UNSUPPORTED_ENCRYPTION_TYPE 164 +# define RSA_R_UNSUPPORTED_LABEL_SOURCE 165 +# define RSA_R_UNSUPPORTED_MASK_ALGORITHM 153 +# define RSA_R_UNSUPPORTED_MASK_PARAMETER 154 +# define RSA_R_UNSUPPORTED_SIGNATURE_TYPE 155 +# define RSA_R_VALUE_MISSING 147 +# define RSA_R_WRONG_SIGNATURE_LENGTH 119 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/win/openssl/include/openssl/safestack.h b/hdssd/external/win/openssl/include/openssl/safestack.h new file mode 100644 index 0000000..1d4f87e --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/safestack.h @@ -0,0 +1,2672 @@ +/* ==================================================================== + * Copyright (c) 1999 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_SAFESTACK_H +# define HEADER_SAFESTACK_H + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# ifndef CHECKED_PTR_OF +# define CHECKED_PTR_OF(type, p) \ + ((void*) (1 ? p : (type*)0)) +# endif + +/* + * In C++ we get problems because an explicit cast is needed from (void *) we + * use CHECKED_STACK_OF to ensure the correct type is passed in the macros + * below. + */ + +# define CHECKED_STACK_OF(type, p) \ + ((_STACK*) (1 ? p : (STACK_OF(type)*)0)) + +# define CHECKED_SK_COPY_FUNC(type, p) \ + ((void *(*)(void *)) ((1 ? p : (type *(*)(const type *))0))) + +# define CHECKED_SK_FREE_FUNC(type, p) \ + ((void (*)(void *)) ((1 ? p : (void (*)(type *))0))) + +# define CHECKED_SK_CMP_FUNC(type, p) \ + ((int (*)(const void *, const void *)) \ + ((1 ? p : (int (*)(const type * const *, const type * const *))0))) + +# define STACK_OF(type) struct stack_st_##type +# define PREDECLARE_STACK_OF(type) STACK_OF(type); + +# define DECLARE_STACK_OF(type) \ +STACK_OF(type) \ + { \ + _STACK stack; \ + }; +# define DECLARE_SPECIAL_STACK_OF(type, type2) \ +STACK_OF(type) \ + { \ + _STACK stack; \ + }; + +/* nada (obsolete in new safestack approach)*/ +# define IMPLEMENT_STACK_OF(type) + +/*- + * Strings are special: normally an lhash entry will point to a single + * (somewhat) mutable object. In the case of strings: + * + * a) Instead of a single char, there is an array of chars, NUL-terminated. + * b) The string may have be immutable. + * + * So, they need their own declarations. Especially important for + * type-checking tools, such as Deputy. + * + * In practice, however, it appears to be hard to have a const + * string. For now, I'm settling for dealing with the fact it is a + * string at all. + */ +typedef char *OPENSSL_STRING; + +typedef const char *OPENSSL_CSTRING; + +/* + * Confusingly, LHASH_OF(STRING) deals with char ** throughout, but + * STACK_OF(STRING) is really more like STACK_OF(char), only, as mentioned + * above, instead of a single char each entry is a NUL-terminated array of + * chars. So, we have to implement STRING specially for STACK_OF. This is + * dealt with in the autogenerated macros below. + */ + +DECLARE_SPECIAL_STACK_OF(OPENSSL_STRING, char) + +/* + * Similarly, we sometimes use a block of characters, NOT nul-terminated. + * These should also be distinguished from "normal" stacks. + */ +typedef void *OPENSSL_BLOCK; +DECLARE_SPECIAL_STACK_OF(OPENSSL_BLOCK, void) + +/* + * SKM_sk_... stack macros are internal to safestack.h: never use them + * directly, use sk__... instead + */ +# define SKM_sk_new(type, cmp) \ + ((STACK_OF(type) *)sk_new(CHECKED_SK_CMP_FUNC(type, cmp))) +# define SKM_sk_new_null(type) \ + ((STACK_OF(type) *)sk_new_null()) +# define SKM_sk_free(type, st) \ + sk_free(CHECKED_STACK_OF(type, st)) +# define SKM_sk_num(type, st) \ + sk_num(CHECKED_STACK_OF(type, st)) +# define SKM_sk_value(type, st,i) \ + ((type *)sk_value(CHECKED_STACK_OF(type, st), i)) +# define SKM_sk_set(type, st,i,val) \ + sk_set(CHECKED_STACK_OF(type, st), i, CHECKED_PTR_OF(type, val)) +# define SKM_sk_zero(type, st) \ + sk_zero(CHECKED_STACK_OF(type, st)) +# define SKM_sk_push(type, st, val) \ + sk_push(CHECKED_STACK_OF(type, st), CHECKED_PTR_OF(type, val)) +# define SKM_sk_unshift(type, st, val) \ + sk_unshift(CHECKED_STACK_OF(type, st), CHECKED_PTR_OF(type, val)) +# define SKM_sk_find(type, st, val) \ + sk_find(CHECKED_STACK_OF(type, st), CHECKED_PTR_OF(type, val)) +# define SKM_sk_find_ex(type, st, val) \ + sk_find_ex(CHECKED_STACK_OF(type, st), \ + CHECKED_PTR_OF(type, val)) +# define SKM_sk_delete(type, st, i) \ + (type *)sk_delete(CHECKED_STACK_OF(type, st), i) +# define SKM_sk_delete_ptr(type, st, ptr) \ + (type *)sk_delete_ptr(CHECKED_STACK_OF(type, st), CHECKED_PTR_OF(type, ptr)) +# define SKM_sk_insert(type, st,val, i) \ + sk_insert(CHECKED_STACK_OF(type, st), CHECKED_PTR_OF(type, val), i) +# define SKM_sk_set_cmp_func(type, st, cmp) \ + ((int (*)(const type * const *,const type * const *)) \ + sk_set_cmp_func(CHECKED_STACK_OF(type, st), CHECKED_SK_CMP_FUNC(type, cmp))) +# define SKM_sk_dup(type, st) \ + (STACK_OF(type) *)sk_dup(CHECKED_STACK_OF(type, st)) +# define SKM_sk_pop_free(type, st, free_func) \ + sk_pop_free(CHECKED_STACK_OF(type, st), CHECKED_SK_FREE_FUNC(type, free_func)) +# define SKM_sk_deep_copy(type, st, copy_func, free_func) \ + (STACK_OF(type) *)sk_deep_copy(CHECKED_STACK_OF(type, st), CHECKED_SK_COPY_FUNC(type, copy_func), CHECKED_SK_FREE_FUNC(type, free_func)) +# define SKM_sk_shift(type, st) \ + (type *)sk_shift(CHECKED_STACK_OF(type, st)) +# define SKM_sk_pop(type, st) \ + (type *)sk_pop(CHECKED_STACK_OF(type, st)) +# define SKM_sk_sort(type, st) \ + sk_sort(CHECKED_STACK_OF(type, st)) +# define SKM_sk_is_sorted(type, st) \ + sk_is_sorted(CHECKED_STACK_OF(type, st)) +# define SKM_ASN1_SET_OF_d2i(type, st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + (STACK_OF(type) *)d2i_ASN1_SET( \ + (STACK_OF(OPENSSL_BLOCK) **)CHECKED_PTR_OF(STACK_OF(type)*, st), \ + pp, length, \ + CHECKED_D2I_OF(type, d2i_func), \ + CHECKED_SK_FREE_FUNC(type, free_func), \ + ex_tag, ex_class) +# define SKM_ASN1_SET_OF_i2d(type, st, pp, i2d_func, ex_tag, ex_class, is_set) \ + i2d_ASN1_SET((STACK_OF(OPENSSL_BLOCK) *)CHECKED_STACK_OF(type, st), pp, \ + CHECKED_I2D_OF(type, i2d_func), \ + ex_tag, ex_class, is_set) +# define SKM_ASN1_seq_pack(type, st, i2d_func, buf, len) \ + ASN1_seq_pack(CHECKED_PTR_OF(STACK_OF(type), st), \ + CHECKED_I2D_OF(type, i2d_func), buf, len) +# define SKM_ASN1_seq_unpack(type, buf, len, d2i_func, free_func) \ + (STACK_OF(type) *)ASN1_seq_unpack(buf, len, CHECKED_D2I_OF(type, d2i_func), CHECKED_SK_FREE_FUNC(type, free_func)) +# define SKM_PKCS12_decrypt_d2i(type, algor, d2i_func, free_func, pass, passlen, oct, seq) \ + (STACK_OF(type) *)PKCS12_decrypt_d2i(algor, \ + CHECKED_D2I_OF(type, d2i_func), \ + CHECKED_SK_FREE_FUNC(type, free_func), \ + pass, passlen, oct, seq) +/* + * This block of defines is updated by util/mkstack.pl, please do not touch! + */ +# define sk_ACCESS_DESCRIPTION_new(cmp) SKM_sk_new(ACCESS_DESCRIPTION, (cmp)) +# define sk_ACCESS_DESCRIPTION_new_null() SKM_sk_new_null(ACCESS_DESCRIPTION) +# define sk_ACCESS_DESCRIPTION_free(st) SKM_sk_free(ACCESS_DESCRIPTION, (st)) +# define sk_ACCESS_DESCRIPTION_num(st) SKM_sk_num(ACCESS_DESCRIPTION, (st)) +# define sk_ACCESS_DESCRIPTION_value(st, i) SKM_sk_value(ACCESS_DESCRIPTION, (st), (i)) +# define sk_ACCESS_DESCRIPTION_set(st, i, val) SKM_sk_set(ACCESS_DESCRIPTION, (st), (i), (val)) +# define sk_ACCESS_DESCRIPTION_zero(st) SKM_sk_zero(ACCESS_DESCRIPTION, (st)) +# define sk_ACCESS_DESCRIPTION_push(st, val) SKM_sk_push(ACCESS_DESCRIPTION, (st), (val)) +# define sk_ACCESS_DESCRIPTION_unshift(st, val) SKM_sk_unshift(ACCESS_DESCRIPTION, (st), (val)) +# define sk_ACCESS_DESCRIPTION_find(st, val) SKM_sk_find(ACCESS_DESCRIPTION, (st), (val)) +# define sk_ACCESS_DESCRIPTION_find_ex(st, val) SKM_sk_find_ex(ACCESS_DESCRIPTION, (st), (val)) +# define sk_ACCESS_DESCRIPTION_delete(st, i) SKM_sk_delete(ACCESS_DESCRIPTION, (st), (i)) +# define sk_ACCESS_DESCRIPTION_delete_ptr(st, ptr) SKM_sk_delete_ptr(ACCESS_DESCRIPTION, (st), (ptr)) +# define sk_ACCESS_DESCRIPTION_insert(st, val, i) SKM_sk_insert(ACCESS_DESCRIPTION, (st), (val), (i)) +# define sk_ACCESS_DESCRIPTION_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ACCESS_DESCRIPTION, (st), (cmp)) +# define sk_ACCESS_DESCRIPTION_dup(st) SKM_sk_dup(ACCESS_DESCRIPTION, st) +# define sk_ACCESS_DESCRIPTION_pop_free(st, free_func) SKM_sk_pop_free(ACCESS_DESCRIPTION, (st), (free_func)) +# define sk_ACCESS_DESCRIPTION_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(ACCESS_DESCRIPTION, (st), (copy_func), (free_func)) +# define sk_ACCESS_DESCRIPTION_shift(st) SKM_sk_shift(ACCESS_DESCRIPTION, (st)) +# define sk_ACCESS_DESCRIPTION_pop(st) SKM_sk_pop(ACCESS_DESCRIPTION, (st)) +# define sk_ACCESS_DESCRIPTION_sort(st) SKM_sk_sort(ACCESS_DESCRIPTION, (st)) +# define sk_ACCESS_DESCRIPTION_is_sorted(st) SKM_sk_is_sorted(ACCESS_DESCRIPTION, (st)) +# define sk_ASIdOrRange_new(cmp) SKM_sk_new(ASIdOrRange, (cmp)) +# define sk_ASIdOrRange_new_null() SKM_sk_new_null(ASIdOrRange) +# define sk_ASIdOrRange_free(st) SKM_sk_free(ASIdOrRange, (st)) +# define sk_ASIdOrRange_num(st) SKM_sk_num(ASIdOrRange, (st)) +# define sk_ASIdOrRange_value(st, i) SKM_sk_value(ASIdOrRange, (st), (i)) +# define sk_ASIdOrRange_set(st, i, val) SKM_sk_set(ASIdOrRange, (st), (i), (val)) +# define sk_ASIdOrRange_zero(st) SKM_sk_zero(ASIdOrRange, (st)) +# define sk_ASIdOrRange_push(st, val) SKM_sk_push(ASIdOrRange, (st), (val)) +# define sk_ASIdOrRange_unshift(st, val) SKM_sk_unshift(ASIdOrRange, (st), (val)) +# define sk_ASIdOrRange_find(st, val) SKM_sk_find(ASIdOrRange, (st), (val)) +# define sk_ASIdOrRange_find_ex(st, val) SKM_sk_find_ex(ASIdOrRange, (st), (val)) +# define sk_ASIdOrRange_delete(st, i) SKM_sk_delete(ASIdOrRange, (st), (i)) +# define sk_ASIdOrRange_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASIdOrRange, (st), (ptr)) +# define sk_ASIdOrRange_insert(st, val, i) SKM_sk_insert(ASIdOrRange, (st), (val), (i)) +# define sk_ASIdOrRange_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASIdOrRange, (st), (cmp)) +# define sk_ASIdOrRange_dup(st) SKM_sk_dup(ASIdOrRange, st) +# define sk_ASIdOrRange_pop_free(st, free_func) SKM_sk_pop_free(ASIdOrRange, (st), (free_func)) +# define sk_ASIdOrRange_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(ASIdOrRange, (st), (copy_func), (free_func)) +# define sk_ASIdOrRange_shift(st) SKM_sk_shift(ASIdOrRange, (st)) +# define sk_ASIdOrRange_pop(st) SKM_sk_pop(ASIdOrRange, (st)) +# define sk_ASIdOrRange_sort(st) SKM_sk_sort(ASIdOrRange, (st)) +# define sk_ASIdOrRange_is_sorted(st) SKM_sk_is_sorted(ASIdOrRange, (st)) +# define sk_ASN1_GENERALSTRING_new(cmp) SKM_sk_new(ASN1_GENERALSTRING, (cmp)) +# define sk_ASN1_GENERALSTRING_new_null() SKM_sk_new_null(ASN1_GENERALSTRING) +# define sk_ASN1_GENERALSTRING_free(st) SKM_sk_free(ASN1_GENERALSTRING, (st)) +# define sk_ASN1_GENERALSTRING_num(st) SKM_sk_num(ASN1_GENERALSTRING, (st)) +# define sk_ASN1_GENERALSTRING_value(st, i) SKM_sk_value(ASN1_GENERALSTRING, (st), (i)) +# define sk_ASN1_GENERALSTRING_set(st, i, val) SKM_sk_set(ASN1_GENERALSTRING, (st), (i), (val)) +# define sk_ASN1_GENERALSTRING_zero(st) SKM_sk_zero(ASN1_GENERALSTRING, (st)) +# define sk_ASN1_GENERALSTRING_push(st, val) SKM_sk_push(ASN1_GENERALSTRING, (st), (val)) +# define sk_ASN1_GENERALSTRING_unshift(st, val) SKM_sk_unshift(ASN1_GENERALSTRING, (st), (val)) +# define sk_ASN1_GENERALSTRING_find(st, val) SKM_sk_find(ASN1_GENERALSTRING, (st), (val)) +# define sk_ASN1_GENERALSTRING_find_ex(st, val) SKM_sk_find_ex(ASN1_GENERALSTRING, (st), (val)) +# define sk_ASN1_GENERALSTRING_delete(st, i) SKM_sk_delete(ASN1_GENERALSTRING, (st), (i)) +# define sk_ASN1_GENERALSTRING_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASN1_GENERALSTRING, (st), (ptr)) +# define sk_ASN1_GENERALSTRING_insert(st, val, i) SKM_sk_insert(ASN1_GENERALSTRING, (st), (val), (i)) +# define sk_ASN1_GENERALSTRING_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASN1_GENERALSTRING, (st), (cmp)) +# define sk_ASN1_GENERALSTRING_dup(st) SKM_sk_dup(ASN1_GENERALSTRING, st) +# define sk_ASN1_GENERALSTRING_pop_free(st, free_func) SKM_sk_pop_free(ASN1_GENERALSTRING, (st), (free_func)) +# define sk_ASN1_GENERALSTRING_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(ASN1_GENERALSTRING, (st), (copy_func), (free_func)) +# define sk_ASN1_GENERALSTRING_shift(st) SKM_sk_shift(ASN1_GENERALSTRING, (st)) +# define sk_ASN1_GENERALSTRING_pop(st) SKM_sk_pop(ASN1_GENERALSTRING, (st)) +# define sk_ASN1_GENERALSTRING_sort(st) SKM_sk_sort(ASN1_GENERALSTRING, (st)) +# define sk_ASN1_GENERALSTRING_is_sorted(st) SKM_sk_is_sorted(ASN1_GENERALSTRING, (st)) +# define sk_ASN1_INTEGER_new(cmp) SKM_sk_new(ASN1_INTEGER, (cmp)) +# define sk_ASN1_INTEGER_new_null() SKM_sk_new_null(ASN1_INTEGER) +# define sk_ASN1_INTEGER_free(st) SKM_sk_free(ASN1_INTEGER, (st)) +# define sk_ASN1_INTEGER_num(st) SKM_sk_num(ASN1_INTEGER, (st)) +# define sk_ASN1_INTEGER_value(st, i) SKM_sk_value(ASN1_INTEGER, (st), (i)) +# define sk_ASN1_INTEGER_set(st, i, val) SKM_sk_set(ASN1_INTEGER, (st), (i), (val)) +# define sk_ASN1_INTEGER_zero(st) SKM_sk_zero(ASN1_INTEGER, (st)) +# define sk_ASN1_INTEGER_push(st, val) SKM_sk_push(ASN1_INTEGER, (st), (val)) +# define sk_ASN1_INTEGER_unshift(st, val) SKM_sk_unshift(ASN1_INTEGER, (st), (val)) +# define sk_ASN1_INTEGER_find(st, val) SKM_sk_find(ASN1_INTEGER, (st), (val)) +# define sk_ASN1_INTEGER_find_ex(st, val) SKM_sk_find_ex(ASN1_INTEGER, (st), (val)) +# define sk_ASN1_INTEGER_delete(st, i) SKM_sk_delete(ASN1_INTEGER, (st), (i)) +# define sk_ASN1_INTEGER_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASN1_INTEGER, (st), (ptr)) +# define sk_ASN1_INTEGER_insert(st, val, i) SKM_sk_insert(ASN1_INTEGER, (st), (val), (i)) +# define sk_ASN1_INTEGER_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASN1_INTEGER, (st), (cmp)) +# define sk_ASN1_INTEGER_dup(st) SKM_sk_dup(ASN1_INTEGER, st) +# define sk_ASN1_INTEGER_pop_free(st, free_func) SKM_sk_pop_free(ASN1_INTEGER, (st), (free_func)) +# define sk_ASN1_INTEGER_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(ASN1_INTEGER, (st), (copy_func), (free_func)) +# define sk_ASN1_INTEGER_shift(st) SKM_sk_shift(ASN1_INTEGER, (st)) +# define sk_ASN1_INTEGER_pop(st) SKM_sk_pop(ASN1_INTEGER, (st)) +# define sk_ASN1_INTEGER_sort(st) SKM_sk_sort(ASN1_INTEGER, (st)) +# define sk_ASN1_INTEGER_is_sorted(st) SKM_sk_is_sorted(ASN1_INTEGER, (st)) +# define sk_ASN1_OBJECT_new(cmp) SKM_sk_new(ASN1_OBJECT, (cmp)) +# define sk_ASN1_OBJECT_new_null() SKM_sk_new_null(ASN1_OBJECT) +# define sk_ASN1_OBJECT_free(st) SKM_sk_free(ASN1_OBJECT, (st)) +# define sk_ASN1_OBJECT_num(st) SKM_sk_num(ASN1_OBJECT, (st)) +# define sk_ASN1_OBJECT_value(st, i) SKM_sk_value(ASN1_OBJECT, (st), (i)) +# define sk_ASN1_OBJECT_set(st, i, val) SKM_sk_set(ASN1_OBJECT, (st), (i), (val)) +# define sk_ASN1_OBJECT_zero(st) SKM_sk_zero(ASN1_OBJECT, (st)) +# define sk_ASN1_OBJECT_push(st, val) SKM_sk_push(ASN1_OBJECT, (st), (val)) +# define sk_ASN1_OBJECT_unshift(st, val) SKM_sk_unshift(ASN1_OBJECT, (st), (val)) +# define sk_ASN1_OBJECT_find(st, val) SKM_sk_find(ASN1_OBJECT, (st), (val)) +# define sk_ASN1_OBJECT_find_ex(st, val) SKM_sk_find_ex(ASN1_OBJECT, (st), (val)) +# define sk_ASN1_OBJECT_delete(st, i) SKM_sk_delete(ASN1_OBJECT, (st), (i)) +# define sk_ASN1_OBJECT_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASN1_OBJECT, (st), (ptr)) +# define sk_ASN1_OBJECT_insert(st, val, i) SKM_sk_insert(ASN1_OBJECT, (st), (val), (i)) +# define sk_ASN1_OBJECT_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASN1_OBJECT, (st), (cmp)) +# define sk_ASN1_OBJECT_dup(st) SKM_sk_dup(ASN1_OBJECT, st) +# define sk_ASN1_OBJECT_pop_free(st, free_func) SKM_sk_pop_free(ASN1_OBJECT, (st), (free_func)) +# define sk_ASN1_OBJECT_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(ASN1_OBJECT, (st), (copy_func), (free_func)) +# define sk_ASN1_OBJECT_shift(st) SKM_sk_shift(ASN1_OBJECT, (st)) +# define sk_ASN1_OBJECT_pop(st) SKM_sk_pop(ASN1_OBJECT, (st)) +# define sk_ASN1_OBJECT_sort(st) SKM_sk_sort(ASN1_OBJECT, (st)) +# define sk_ASN1_OBJECT_is_sorted(st) SKM_sk_is_sorted(ASN1_OBJECT, (st)) +# define sk_ASN1_STRING_TABLE_new(cmp) SKM_sk_new(ASN1_STRING_TABLE, (cmp)) +# define sk_ASN1_STRING_TABLE_new_null() SKM_sk_new_null(ASN1_STRING_TABLE) +# define sk_ASN1_STRING_TABLE_free(st) SKM_sk_free(ASN1_STRING_TABLE, (st)) +# define sk_ASN1_STRING_TABLE_num(st) SKM_sk_num(ASN1_STRING_TABLE, (st)) +# define sk_ASN1_STRING_TABLE_value(st, i) SKM_sk_value(ASN1_STRING_TABLE, (st), (i)) +# define sk_ASN1_STRING_TABLE_set(st, i, val) SKM_sk_set(ASN1_STRING_TABLE, (st), (i), (val)) +# define sk_ASN1_STRING_TABLE_zero(st) SKM_sk_zero(ASN1_STRING_TABLE, (st)) +# define sk_ASN1_STRING_TABLE_push(st, val) SKM_sk_push(ASN1_STRING_TABLE, (st), (val)) +# define sk_ASN1_STRING_TABLE_unshift(st, val) SKM_sk_unshift(ASN1_STRING_TABLE, (st), (val)) +# define sk_ASN1_STRING_TABLE_find(st, val) SKM_sk_find(ASN1_STRING_TABLE, (st), (val)) +# define sk_ASN1_STRING_TABLE_find_ex(st, val) SKM_sk_find_ex(ASN1_STRING_TABLE, (st), (val)) +# define sk_ASN1_STRING_TABLE_delete(st, i) SKM_sk_delete(ASN1_STRING_TABLE, (st), (i)) +# define sk_ASN1_STRING_TABLE_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASN1_STRING_TABLE, (st), (ptr)) +# define sk_ASN1_STRING_TABLE_insert(st, val, i) SKM_sk_insert(ASN1_STRING_TABLE, (st), (val), (i)) +# define sk_ASN1_STRING_TABLE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASN1_STRING_TABLE, (st), (cmp)) +# define sk_ASN1_STRING_TABLE_dup(st) SKM_sk_dup(ASN1_STRING_TABLE, st) +# define sk_ASN1_STRING_TABLE_pop_free(st, free_func) SKM_sk_pop_free(ASN1_STRING_TABLE, (st), (free_func)) +# define sk_ASN1_STRING_TABLE_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(ASN1_STRING_TABLE, (st), (copy_func), (free_func)) +# define sk_ASN1_STRING_TABLE_shift(st) SKM_sk_shift(ASN1_STRING_TABLE, (st)) +# define sk_ASN1_STRING_TABLE_pop(st) SKM_sk_pop(ASN1_STRING_TABLE, (st)) +# define sk_ASN1_STRING_TABLE_sort(st) SKM_sk_sort(ASN1_STRING_TABLE, (st)) +# define sk_ASN1_STRING_TABLE_is_sorted(st) SKM_sk_is_sorted(ASN1_STRING_TABLE, (st)) +# define sk_ASN1_TYPE_new(cmp) SKM_sk_new(ASN1_TYPE, (cmp)) +# define sk_ASN1_TYPE_new_null() SKM_sk_new_null(ASN1_TYPE) +# define sk_ASN1_TYPE_free(st) SKM_sk_free(ASN1_TYPE, (st)) +# define sk_ASN1_TYPE_num(st) SKM_sk_num(ASN1_TYPE, (st)) +# define sk_ASN1_TYPE_value(st, i) SKM_sk_value(ASN1_TYPE, (st), (i)) +# define sk_ASN1_TYPE_set(st, i, val) SKM_sk_set(ASN1_TYPE, (st), (i), (val)) +# define sk_ASN1_TYPE_zero(st) SKM_sk_zero(ASN1_TYPE, (st)) +# define sk_ASN1_TYPE_push(st, val) SKM_sk_push(ASN1_TYPE, (st), (val)) +# define sk_ASN1_TYPE_unshift(st, val) SKM_sk_unshift(ASN1_TYPE, (st), (val)) +# define sk_ASN1_TYPE_find(st, val) SKM_sk_find(ASN1_TYPE, (st), (val)) +# define sk_ASN1_TYPE_find_ex(st, val) SKM_sk_find_ex(ASN1_TYPE, (st), (val)) +# define sk_ASN1_TYPE_delete(st, i) SKM_sk_delete(ASN1_TYPE, (st), (i)) +# define sk_ASN1_TYPE_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASN1_TYPE, (st), (ptr)) +# define sk_ASN1_TYPE_insert(st, val, i) SKM_sk_insert(ASN1_TYPE, (st), (val), (i)) +# define sk_ASN1_TYPE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASN1_TYPE, (st), (cmp)) +# define sk_ASN1_TYPE_dup(st) SKM_sk_dup(ASN1_TYPE, st) +# define sk_ASN1_TYPE_pop_free(st, free_func) SKM_sk_pop_free(ASN1_TYPE, (st), (free_func)) +# define sk_ASN1_TYPE_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(ASN1_TYPE, (st), (copy_func), (free_func)) +# define sk_ASN1_TYPE_shift(st) SKM_sk_shift(ASN1_TYPE, (st)) +# define sk_ASN1_TYPE_pop(st) SKM_sk_pop(ASN1_TYPE, (st)) +# define sk_ASN1_TYPE_sort(st) SKM_sk_sort(ASN1_TYPE, (st)) +# define sk_ASN1_TYPE_is_sorted(st) SKM_sk_is_sorted(ASN1_TYPE, (st)) +# define sk_ASN1_UTF8STRING_new(cmp) SKM_sk_new(ASN1_UTF8STRING, (cmp)) +# define sk_ASN1_UTF8STRING_new_null() SKM_sk_new_null(ASN1_UTF8STRING) +# define sk_ASN1_UTF8STRING_free(st) SKM_sk_free(ASN1_UTF8STRING, (st)) +# define sk_ASN1_UTF8STRING_num(st) SKM_sk_num(ASN1_UTF8STRING, (st)) +# define sk_ASN1_UTF8STRING_value(st, i) SKM_sk_value(ASN1_UTF8STRING, (st), (i)) +# define sk_ASN1_UTF8STRING_set(st, i, val) SKM_sk_set(ASN1_UTF8STRING, (st), (i), (val)) +# define sk_ASN1_UTF8STRING_zero(st) SKM_sk_zero(ASN1_UTF8STRING, (st)) +# define sk_ASN1_UTF8STRING_push(st, val) SKM_sk_push(ASN1_UTF8STRING, (st), (val)) +# define sk_ASN1_UTF8STRING_unshift(st, val) SKM_sk_unshift(ASN1_UTF8STRING, (st), (val)) +# define sk_ASN1_UTF8STRING_find(st, val) SKM_sk_find(ASN1_UTF8STRING, (st), (val)) +# define sk_ASN1_UTF8STRING_find_ex(st, val) SKM_sk_find_ex(ASN1_UTF8STRING, (st), (val)) +# define sk_ASN1_UTF8STRING_delete(st, i) SKM_sk_delete(ASN1_UTF8STRING, (st), (i)) +# define sk_ASN1_UTF8STRING_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASN1_UTF8STRING, (st), (ptr)) +# define sk_ASN1_UTF8STRING_insert(st, val, i) SKM_sk_insert(ASN1_UTF8STRING, (st), (val), (i)) +# define sk_ASN1_UTF8STRING_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASN1_UTF8STRING, (st), (cmp)) +# define sk_ASN1_UTF8STRING_dup(st) SKM_sk_dup(ASN1_UTF8STRING, st) +# define sk_ASN1_UTF8STRING_pop_free(st, free_func) SKM_sk_pop_free(ASN1_UTF8STRING, (st), (free_func)) +# define sk_ASN1_UTF8STRING_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(ASN1_UTF8STRING, (st), (copy_func), (free_func)) +# define sk_ASN1_UTF8STRING_shift(st) SKM_sk_shift(ASN1_UTF8STRING, (st)) +# define sk_ASN1_UTF8STRING_pop(st) SKM_sk_pop(ASN1_UTF8STRING, (st)) +# define sk_ASN1_UTF8STRING_sort(st) SKM_sk_sort(ASN1_UTF8STRING, (st)) +# define sk_ASN1_UTF8STRING_is_sorted(st) SKM_sk_is_sorted(ASN1_UTF8STRING, (st)) +# define sk_ASN1_VALUE_new(cmp) SKM_sk_new(ASN1_VALUE, (cmp)) +# define sk_ASN1_VALUE_new_null() SKM_sk_new_null(ASN1_VALUE) +# define sk_ASN1_VALUE_free(st) SKM_sk_free(ASN1_VALUE, (st)) +# define sk_ASN1_VALUE_num(st) SKM_sk_num(ASN1_VALUE, (st)) +# define sk_ASN1_VALUE_value(st, i) SKM_sk_value(ASN1_VALUE, (st), (i)) +# define sk_ASN1_VALUE_set(st, i, val) SKM_sk_set(ASN1_VALUE, (st), (i), (val)) +# define sk_ASN1_VALUE_zero(st) SKM_sk_zero(ASN1_VALUE, (st)) +# define sk_ASN1_VALUE_push(st, val) SKM_sk_push(ASN1_VALUE, (st), (val)) +# define sk_ASN1_VALUE_unshift(st, val) SKM_sk_unshift(ASN1_VALUE, (st), (val)) +# define sk_ASN1_VALUE_find(st, val) SKM_sk_find(ASN1_VALUE, (st), (val)) +# define sk_ASN1_VALUE_find_ex(st, val) SKM_sk_find_ex(ASN1_VALUE, (st), (val)) +# define sk_ASN1_VALUE_delete(st, i) SKM_sk_delete(ASN1_VALUE, (st), (i)) +# define sk_ASN1_VALUE_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASN1_VALUE, (st), (ptr)) +# define sk_ASN1_VALUE_insert(st, val, i) SKM_sk_insert(ASN1_VALUE, (st), (val), (i)) +# define sk_ASN1_VALUE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASN1_VALUE, (st), (cmp)) +# define sk_ASN1_VALUE_dup(st) SKM_sk_dup(ASN1_VALUE, st) +# define sk_ASN1_VALUE_pop_free(st, free_func) SKM_sk_pop_free(ASN1_VALUE, (st), (free_func)) +# define sk_ASN1_VALUE_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(ASN1_VALUE, (st), (copy_func), (free_func)) +# define sk_ASN1_VALUE_shift(st) SKM_sk_shift(ASN1_VALUE, (st)) +# define sk_ASN1_VALUE_pop(st) SKM_sk_pop(ASN1_VALUE, (st)) +# define sk_ASN1_VALUE_sort(st) SKM_sk_sort(ASN1_VALUE, (st)) +# define sk_ASN1_VALUE_is_sorted(st) SKM_sk_is_sorted(ASN1_VALUE, (st)) +# define sk_BIO_new(cmp) SKM_sk_new(BIO, (cmp)) +# define sk_BIO_new_null() SKM_sk_new_null(BIO) +# define sk_BIO_free(st) SKM_sk_free(BIO, (st)) +# define sk_BIO_num(st) SKM_sk_num(BIO, (st)) +# define sk_BIO_value(st, i) SKM_sk_value(BIO, (st), (i)) +# define sk_BIO_set(st, i, val) SKM_sk_set(BIO, (st), (i), (val)) +# define sk_BIO_zero(st) SKM_sk_zero(BIO, (st)) +# define sk_BIO_push(st, val) SKM_sk_push(BIO, (st), (val)) +# define sk_BIO_unshift(st, val) SKM_sk_unshift(BIO, (st), (val)) +# define sk_BIO_find(st, val) SKM_sk_find(BIO, (st), (val)) +# define sk_BIO_find_ex(st, val) SKM_sk_find_ex(BIO, (st), (val)) +# define sk_BIO_delete(st, i) SKM_sk_delete(BIO, (st), (i)) +# define sk_BIO_delete_ptr(st, ptr) SKM_sk_delete_ptr(BIO, (st), (ptr)) +# define sk_BIO_insert(st, val, i) SKM_sk_insert(BIO, (st), (val), (i)) +# define sk_BIO_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(BIO, (st), (cmp)) +# define sk_BIO_dup(st) SKM_sk_dup(BIO, st) +# define sk_BIO_pop_free(st, free_func) SKM_sk_pop_free(BIO, (st), (free_func)) +# define sk_BIO_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(BIO, (st), (copy_func), (free_func)) +# define sk_BIO_shift(st) SKM_sk_shift(BIO, (st)) +# define sk_BIO_pop(st) SKM_sk_pop(BIO, (st)) +# define sk_BIO_sort(st) SKM_sk_sort(BIO, (st)) +# define sk_BIO_is_sorted(st) SKM_sk_is_sorted(BIO, (st)) +# define sk_BY_DIR_ENTRY_new(cmp) SKM_sk_new(BY_DIR_ENTRY, (cmp)) +# define sk_BY_DIR_ENTRY_new_null() SKM_sk_new_null(BY_DIR_ENTRY) +# define sk_BY_DIR_ENTRY_free(st) SKM_sk_free(BY_DIR_ENTRY, (st)) +# define sk_BY_DIR_ENTRY_num(st) SKM_sk_num(BY_DIR_ENTRY, (st)) +# define sk_BY_DIR_ENTRY_value(st, i) SKM_sk_value(BY_DIR_ENTRY, (st), (i)) +# define sk_BY_DIR_ENTRY_set(st, i, val) SKM_sk_set(BY_DIR_ENTRY, (st), (i), (val)) +# define sk_BY_DIR_ENTRY_zero(st) SKM_sk_zero(BY_DIR_ENTRY, (st)) +# define sk_BY_DIR_ENTRY_push(st, val) SKM_sk_push(BY_DIR_ENTRY, (st), (val)) +# define sk_BY_DIR_ENTRY_unshift(st, val) SKM_sk_unshift(BY_DIR_ENTRY, (st), (val)) +# define sk_BY_DIR_ENTRY_find(st, val) SKM_sk_find(BY_DIR_ENTRY, (st), (val)) +# define sk_BY_DIR_ENTRY_find_ex(st, val) SKM_sk_find_ex(BY_DIR_ENTRY, (st), (val)) +# define sk_BY_DIR_ENTRY_delete(st, i) SKM_sk_delete(BY_DIR_ENTRY, (st), (i)) +# define sk_BY_DIR_ENTRY_delete_ptr(st, ptr) SKM_sk_delete_ptr(BY_DIR_ENTRY, (st), (ptr)) +# define sk_BY_DIR_ENTRY_insert(st, val, i) SKM_sk_insert(BY_DIR_ENTRY, (st), (val), (i)) +# define sk_BY_DIR_ENTRY_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(BY_DIR_ENTRY, (st), (cmp)) +# define sk_BY_DIR_ENTRY_dup(st) SKM_sk_dup(BY_DIR_ENTRY, st) +# define sk_BY_DIR_ENTRY_pop_free(st, free_func) SKM_sk_pop_free(BY_DIR_ENTRY, (st), (free_func)) +# define sk_BY_DIR_ENTRY_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(BY_DIR_ENTRY, (st), (copy_func), (free_func)) +# define sk_BY_DIR_ENTRY_shift(st) SKM_sk_shift(BY_DIR_ENTRY, (st)) +# define sk_BY_DIR_ENTRY_pop(st) SKM_sk_pop(BY_DIR_ENTRY, (st)) +# define sk_BY_DIR_ENTRY_sort(st) SKM_sk_sort(BY_DIR_ENTRY, (st)) +# define sk_BY_DIR_ENTRY_is_sorted(st) SKM_sk_is_sorted(BY_DIR_ENTRY, (st)) +# define sk_BY_DIR_HASH_new(cmp) SKM_sk_new(BY_DIR_HASH, (cmp)) +# define sk_BY_DIR_HASH_new_null() SKM_sk_new_null(BY_DIR_HASH) +# define sk_BY_DIR_HASH_free(st) SKM_sk_free(BY_DIR_HASH, (st)) +# define sk_BY_DIR_HASH_num(st) SKM_sk_num(BY_DIR_HASH, (st)) +# define sk_BY_DIR_HASH_value(st, i) SKM_sk_value(BY_DIR_HASH, (st), (i)) +# define sk_BY_DIR_HASH_set(st, i, val) SKM_sk_set(BY_DIR_HASH, (st), (i), (val)) +# define sk_BY_DIR_HASH_zero(st) SKM_sk_zero(BY_DIR_HASH, (st)) +# define sk_BY_DIR_HASH_push(st, val) SKM_sk_push(BY_DIR_HASH, (st), (val)) +# define sk_BY_DIR_HASH_unshift(st, val) SKM_sk_unshift(BY_DIR_HASH, (st), (val)) +# define sk_BY_DIR_HASH_find(st, val) SKM_sk_find(BY_DIR_HASH, (st), (val)) +# define sk_BY_DIR_HASH_find_ex(st, val) SKM_sk_find_ex(BY_DIR_HASH, (st), (val)) +# define sk_BY_DIR_HASH_delete(st, i) SKM_sk_delete(BY_DIR_HASH, (st), (i)) +# define sk_BY_DIR_HASH_delete_ptr(st, ptr) SKM_sk_delete_ptr(BY_DIR_HASH, (st), (ptr)) +# define sk_BY_DIR_HASH_insert(st, val, i) SKM_sk_insert(BY_DIR_HASH, (st), (val), (i)) +# define sk_BY_DIR_HASH_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(BY_DIR_HASH, (st), (cmp)) +# define sk_BY_DIR_HASH_dup(st) SKM_sk_dup(BY_DIR_HASH, st) +# define sk_BY_DIR_HASH_pop_free(st, free_func) SKM_sk_pop_free(BY_DIR_HASH, (st), (free_func)) +# define sk_BY_DIR_HASH_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(BY_DIR_HASH, (st), (copy_func), (free_func)) +# define sk_BY_DIR_HASH_shift(st) SKM_sk_shift(BY_DIR_HASH, (st)) +# define sk_BY_DIR_HASH_pop(st) SKM_sk_pop(BY_DIR_HASH, (st)) +# define sk_BY_DIR_HASH_sort(st) SKM_sk_sort(BY_DIR_HASH, (st)) +# define sk_BY_DIR_HASH_is_sorted(st) SKM_sk_is_sorted(BY_DIR_HASH, (st)) +# define sk_CMS_CertificateChoices_new(cmp) SKM_sk_new(CMS_CertificateChoices, (cmp)) +# define sk_CMS_CertificateChoices_new_null() SKM_sk_new_null(CMS_CertificateChoices) +# define sk_CMS_CertificateChoices_free(st) SKM_sk_free(CMS_CertificateChoices, (st)) +# define sk_CMS_CertificateChoices_num(st) SKM_sk_num(CMS_CertificateChoices, (st)) +# define sk_CMS_CertificateChoices_value(st, i) SKM_sk_value(CMS_CertificateChoices, (st), (i)) +# define sk_CMS_CertificateChoices_set(st, i, val) SKM_sk_set(CMS_CertificateChoices, (st), (i), (val)) +# define sk_CMS_CertificateChoices_zero(st) SKM_sk_zero(CMS_CertificateChoices, (st)) +# define sk_CMS_CertificateChoices_push(st, val) SKM_sk_push(CMS_CertificateChoices, (st), (val)) +# define sk_CMS_CertificateChoices_unshift(st, val) SKM_sk_unshift(CMS_CertificateChoices, (st), (val)) +# define sk_CMS_CertificateChoices_find(st, val) SKM_sk_find(CMS_CertificateChoices, (st), (val)) +# define sk_CMS_CertificateChoices_find_ex(st, val) SKM_sk_find_ex(CMS_CertificateChoices, (st), (val)) +# define sk_CMS_CertificateChoices_delete(st, i) SKM_sk_delete(CMS_CertificateChoices, (st), (i)) +# define sk_CMS_CertificateChoices_delete_ptr(st, ptr) SKM_sk_delete_ptr(CMS_CertificateChoices, (st), (ptr)) +# define sk_CMS_CertificateChoices_insert(st, val, i) SKM_sk_insert(CMS_CertificateChoices, (st), (val), (i)) +# define sk_CMS_CertificateChoices_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CMS_CertificateChoices, (st), (cmp)) +# define sk_CMS_CertificateChoices_dup(st) SKM_sk_dup(CMS_CertificateChoices, st) +# define sk_CMS_CertificateChoices_pop_free(st, free_func) SKM_sk_pop_free(CMS_CertificateChoices, (st), (free_func)) +# define sk_CMS_CertificateChoices_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(CMS_CertificateChoices, (st), (copy_func), (free_func)) +# define sk_CMS_CertificateChoices_shift(st) SKM_sk_shift(CMS_CertificateChoices, (st)) +# define sk_CMS_CertificateChoices_pop(st) SKM_sk_pop(CMS_CertificateChoices, (st)) +# define sk_CMS_CertificateChoices_sort(st) SKM_sk_sort(CMS_CertificateChoices, (st)) +# define sk_CMS_CertificateChoices_is_sorted(st) SKM_sk_is_sorted(CMS_CertificateChoices, (st)) +# define sk_CMS_RecipientEncryptedKey_new(cmp) SKM_sk_new(CMS_RecipientEncryptedKey, (cmp)) +# define sk_CMS_RecipientEncryptedKey_new_null() SKM_sk_new_null(CMS_RecipientEncryptedKey) +# define sk_CMS_RecipientEncryptedKey_free(st) SKM_sk_free(CMS_RecipientEncryptedKey, (st)) +# define sk_CMS_RecipientEncryptedKey_num(st) SKM_sk_num(CMS_RecipientEncryptedKey, (st)) +# define sk_CMS_RecipientEncryptedKey_value(st, i) SKM_sk_value(CMS_RecipientEncryptedKey, (st), (i)) +# define sk_CMS_RecipientEncryptedKey_set(st, i, val) SKM_sk_set(CMS_RecipientEncryptedKey, (st), (i), (val)) +# define sk_CMS_RecipientEncryptedKey_zero(st) SKM_sk_zero(CMS_RecipientEncryptedKey, (st)) +# define sk_CMS_RecipientEncryptedKey_push(st, val) SKM_sk_push(CMS_RecipientEncryptedKey, (st), (val)) +# define sk_CMS_RecipientEncryptedKey_unshift(st, val) SKM_sk_unshift(CMS_RecipientEncryptedKey, (st), (val)) +# define sk_CMS_RecipientEncryptedKey_find(st, val) SKM_sk_find(CMS_RecipientEncryptedKey, (st), (val)) +# define sk_CMS_RecipientEncryptedKey_find_ex(st, val) SKM_sk_find_ex(CMS_RecipientEncryptedKey, (st), (val)) +# define sk_CMS_RecipientEncryptedKey_delete(st, i) SKM_sk_delete(CMS_RecipientEncryptedKey, (st), (i)) +# define sk_CMS_RecipientEncryptedKey_delete_ptr(st, ptr) SKM_sk_delete_ptr(CMS_RecipientEncryptedKey, (st), (ptr)) +# define sk_CMS_RecipientEncryptedKey_insert(st, val, i) SKM_sk_insert(CMS_RecipientEncryptedKey, (st), (val), (i)) +# define sk_CMS_RecipientEncryptedKey_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CMS_RecipientEncryptedKey, (st), (cmp)) +# define sk_CMS_RecipientEncryptedKey_dup(st) SKM_sk_dup(CMS_RecipientEncryptedKey, st) +# define sk_CMS_RecipientEncryptedKey_pop_free(st, free_func) SKM_sk_pop_free(CMS_RecipientEncryptedKey, (st), (free_func)) +# define sk_CMS_RecipientEncryptedKey_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(CMS_RecipientEncryptedKey, (st), (copy_func), (free_func)) +# define sk_CMS_RecipientEncryptedKey_shift(st) SKM_sk_shift(CMS_RecipientEncryptedKey, (st)) +# define sk_CMS_RecipientEncryptedKey_pop(st) SKM_sk_pop(CMS_RecipientEncryptedKey, (st)) +# define sk_CMS_RecipientEncryptedKey_sort(st) SKM_sk_sort(CMS_RecipientEncryptedKey, (st)) +# define sk_CMS_RecipientEncryptedKey_is_sorted(st) SKM_sk_is_sorted(CMS_RecipientEncryptedKey, (st)) +# define sk_CMS_RecipientInfo_new(cmp) SKM_sk_new(CMS_RecipientInfo, (cmp)) +# define sk_CMS_RecipientInfo_new_null() SKM_sk_new_null(CMS_RecipientInfo) +# define sk_CMS_RecipientInfo_free(st) SKM_sk_free(CMS_RecipientInfo, (st)) +# define sk_CMS_RecipientInfo_num(st) SKM_sk_num(CMS_RecipientInfo, (st)) +# define sk_CMS_RecipientInfo_value(st, i) SKM_sk_value(CMS_RecipientInfo, (st), (i)) +# define sk_CMS_RecipientInfo_set(st, i, val) SKM_sk_set(CMS_RecipientInfo, (st), (i), (val)) +# define sk_CMS_RecipientInfo_zero(st) SKM_sk_zero(CMS_RecipientInfo, (st)) +# define sk_CMS_RecipientInfo_push(st, val) SKM_sk_push(CMS_RecipientInfo, (st), (val)) +# define sk_CMS_RecipientInfo_unshift(st, val) SKM_sk_unshift(CMS_RecipientInfo, (st), (val)) +# define sk_CMS_RecipientInfo_find(st, val) SKM_sk_find(CMS_RecipientInfo, (st), (val)) +# define sk_CMS_RecipientInfo_find_ex(st, val) SKM_sk_find_ex(CMS_RecipientInfo, (st), (val)) +# define sk_CMS_RecipientInfo_delete(st, i) SKM_sk_delete(CMS_RecipientInfo, (st), (i)) +# define sk_CMS_RecipientInfo_delete_ptr(st, ptr) SKM_sk_delete_ptr(CMS_RecipientInfo, (st), (ptr)) +# define sk_CMS_RecipientInfo_insert(st, val, i) SKM_sk_insert(CMS_RecipientInfo, (st), (val), (i)) +# define sk_CMS_RecipientInfo_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CMS_RecipientInfo, (st), (cmp)) +# define sk_CMS_RecipientInfo_dup(st) SKM_sk_dup(CMS_RecipientInfo, st) +# define sk_CMS_RecipientInfo_pop_free(st, free_func) SKM_sk_pop_free(CMS_RecipientInfo, (st), (free_func)) +# define sk_CMS_RecipientInfo_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(CMS_RecipientInfo, (st), (copy_func), (free_func)) +# define sk_CMS_RecipientInfo_shift(st) SKM_sk_shift(CMS_RecipientInfo, (st)) +# define sk_CMS_RecipientInfo_pop(st) SKM_sk_pop(CMS_RecipientInfo, (st)) +# define sk_CMS_RecipientInfo_sort(st) SKM_sk_sort(CMS_RecipientInfo, (st)) +# define sk_CMS_RecipientInfo_is_sorted(st) SKM_sk_is_sorted(CMS_RecipientInfo, (st)) +# define sk_CMS_RevocationInfoChoice_new(cmp) SKM_sk_new(CMS_RevocationInfoChoice, (cmp)) +# define sk_CMS_RevocationInfoChoice_new_null() SKM_sk_new_null(CMS_RevocationInfoChoice) +# define sk_CMS_RevocationInfoChoice_free(st) SKM_sk_free(CMS_RevocationInfoChoice, (st)) +# define sk_CMS_RevocationInfoChoice_num(st) SKM_sk_num(CMS_RevocationInfoChoice, (st)) +# define sk_CMS_RevocationInfoChoice_value(st, i) SKM_sk_value(CMS_RevocationInfoChoice, (st), (i)) +# define sk_CMS_RevocationInfoChoice_set(st, i, val) SKM_sk_set(CMS_RevocationInfoChoice, (st), (i), (val)) +# define sk_CMS_RevocationInfoChoice_zero(st) SKM_sk_zero(CMS_RevocationInfoChoice, (st)) +# define sk_CMS_RevocationInfoChoice_push(st, val) SKM_sk_push(CMS_RevocationInfoChoice, (st), (val)) +# define sk_CMS_RevocationInfoChoice_unshift(st, val) SKM_sk_unshift(CMS_RevocationInfoChoice, (st), (val)) +# define sk_CMS_RevocationInfoChoice_find(st, val) SKM_sk_find(CMS_RevocationInfoChoice, (st), (val)) +# define sk_CMS_RevocationInfoChoice_find_ex(st, val) SKM_sk_find_ex(CMS_RevocationInfoChoice, (st), (val)) +# define sk_CMS_RevocationInfoChoice_delete(st, i) SKM_sk_delete(CMS_RevocationInfoChoice, (st), (i)) +# define sk_CMS_RevocationInfoChoice_delete_ptr(st, ptr) SKM_sk_delete_ptr(CMS_RevocationInfoChoice, (st), (ptr)) +# define sk_CMS_RevocationInfoChoice_insert(st, val, i) SKM_sk_insert(CMS_RevocationInfoChoice, (st), (val), (i)) +# define sk_CMS_RevocationInfoChoice_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CMS_RevocationInfoChoice, (st), (cmp)) +# define sk_CMS_RevocationInfoChoice_dup(st) SKM_sk_dup(CMS_RevocationInfoChoice, st) +# define sk_CMS_RevocationInfoChoice_pop_free(st, free_func) SKM_sk_pop_free(CMS_RevocationInfoChoice, (st), (free_func)) +# define sk_CMS_RevocationInfoChoice_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(CMS_RevocationInfoChoice, (st), (copy_func), (free_func)) +# define sk_CMS_RevocationInfoChoice_shift(st) SKM_sk_shift(CMS_RevocationInfoChoice, (st)) +# define sk_CMS_RevocationInfoChoice_pop(st) SKM_sk_pop(CMS_RevocationInfoChoice, (st)) +# define sk_CMS_RevocationInfoChoice_sort(st) SKM_sk_sort(CMS_RevocationInfoChoice, (st)) +# define sk_CMS_RevocationInfoChoice_is_sorted(st) SKM_sk_is_sorted(CMS_RevocationInfoChoice, (st)) +# define sk_CMS_SignerInfo_new(cmp) SKM_sk_new(CMS_SignerInfo, (cmp)) +# define sk_CMS_SignerInfo_new_null() SKM_sk_new_null(CMS_SignerInfo) +# define sk_CMS_SignerInfo_free(st) SKM_sk_free(CMS_SignerInfo, (st)) +# define sk_CMS_SignerInfo_num(st) SKM_sk_num(CMS_SignerInfo, (st)) +# define sk_CMS_SignerInfo_value(st, i) SKM_sk_value(CMS_SignerInfo, (st), (i)) +# define sk_CMS_SignerInfo_set(st, i, val) SKM_sk_set(CMS_SignerInfo, (st), (i), (val)) +# define sk_CMS_SignerInfo_zero(st) SKM_sk_zero(CMS_SignerInfo, (st)) +# define sk_CMS_SignerInfo_push(st, val) SKM_sk_push(CMS_SignerInfo, (st), (val)) +# define sk_CMS_SignerInfo_unshift(st, val) SKM_sk_unshift(CMS_SignerInfo, (st), (val)) +# define sk_CMS_SignerInfo_find(st, val) SKM_sk_find(CMS_SignerInfo, (st), (val)) +# define sk_CMS_SignerInfo_find_ex(st, val) SKM_sk_find_ex(CMS_SignerInfo, (st), (val)) +# define sk_CMS_SignerInfo_delete(st, i) SKM_sk_delete(CMS_SignerInfo, (st), (i)) +# define sk_CMS_SignerInfo_delete_ptr(st, ptr) SKM_sk_delete_ptr(CMS_SignerInfo, (st), (ptr)) +# define sk_CMS_SignerInfo_insert(st, val, i) SKM_sk_insert(CMS_SignerInfo, (st), (val), (i)) +# define sk_CMS_SignerInfo_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CMS_SignerInfo, (st), (cmp)) +# define sk_CMS_SignerInfo_dup(st) SKM_sk_dup(CMS_SignerInfo, st) +# define sk_CMS_SignerInfo_pop_free(st, free_func) SKM_sk_pop_free(CMS_SignerInfo, (st), (free_func)) +# define sk_CMS_SignerInfo_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(CMS_SignerInfo, (st), (copy_func), (free_func)) +# define sk_CMS_SignerInfo_shift(st) SKM_sk_shift(CMS_SignerInfo, (st)) +# define sk_CMS_SignerInfo_pop(st) SKM_sk_pop(CMS_SignerInfo, (st)) +# define sk_CMS_SignerInfo_sort(st) SKM_sk_sort(CMS_SignerInfo, (st)) +# define sk_CMS_SignerInfo_is_sorted(st) SKM_sk_is_sorted(CMS_SignerInfo, (st)) +# define sk_CONF_IMODULE_new(cmp) SKM_sk_new(CONF_IMODULE, (cmp)) +# define sk_CONF_IMODULE_new_null() SKM_sk_new_null(CONF_IMODULE) +# define sk_CONF_IMODULE_free(st) SKM_sk_free(CONF_IMODULE, (st)) +# define sk_CONF_IMODULE_num(st) SKM_sk_num(CONF_IMODULE, (st)) +# define sk_CONF_IMODULE_value(st, i) SKM_sk_value(CONF_IMODULE, (st), (i)) +# define sk_CONF_IMODULE_set(st, i, val) SKM_sk_set(CONF_IMODULE, (st), (i), (val)) +# define sk_CONF_IMODULE_zero(st) SKM_sk_zero(CONF_IMODULE, (st)) +# define sk_CONF_IMODULE_push(st, val) SKM_sk_push(CONF_IMODULE, (st), (val)) +# define sk_CONF_IMODULE_unshift(st, val) SKM_sk_unshift(CONF_IMODULE, (st), (val)) +# define sk_CONF_IMODULE_find(st, val) SKM_sk_find(CONF_IMODULE, (st), (val)) +# define sk_CONF_IMODULE_find_ex(st, val) SKM_sk_find_ex(CONF_IMODULE, (st), (val)) +# define sk_CONF_IMODULE_delete(st, i) SKM_sk_delete(CONF_IMODULE, (st), (i)) +# define sk_CONF_IMODULE_delete_ptr(st, ptr) SKM_sk_delete_ptr(CONF_IMODULE, (st), (ptr)) +# define sk_CONF_IMODULE_insert(st, val, i) SKM_sk_insert(CONF_IMODULE, (st), (val), (i)) +# define sk_CONF_IMODULE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CONF_IMODULE, (st), (cmp)) +# define sk_CONF_IMODULE_dup(st) SKM_sk_dup(CONF_IMODULE, st) +# define sk_CONF_IMODULE_pop_free(st, free_func) SKM_sk_pop_free(CONF_IMODULE, (st), (free_func)) +# define sk_CONF_IMODULE_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(CONF_IMODULE, (st), (copy_func), (free_func)) +# define sk_CONF_IMODULE_shift(st) SKM_sk_shift(CONF_IMODULE, (st)) +# define sk_CONF_IMODULE_pop(st) SKM_sk_pop(CONF_IMODULE, (st)) +# define sk_CONF_IMODULE_sort(st) SKM_sk_sort(CONF_IMODULE, (st)) +# define sk_CONF_IMODULE_is_sorted(st) SKM_sk_is_sorted(CONF_IMODULE, (st)) +# define sk_CONF_MODULE_new(cmp) SKM_sk_new(CONF_MODULE, (cmp)) +# define sk_CONF_MODULE_new_null() SKM_sk_new_null(CONF_MODULE) +# define sk_CONF_MODULE_free(st) SKM_sk_free(CONF_MODULE, (st)) +# define sk_CONF_MODULE_num(st) SKM_sk_num(CONF_MODULE, (st)) +# define sk_CONF_MODULE_value(st, i) SKM_sk_value(CONF_MODULE, (st), (i)) +# define sk_CONF_MODULE_set(st, i, val) SKM_sk_set(CONF_MODULE, (st), (i), (val)) +# define sk_CONF_MODULE_zero(st) SKM_sk_zero(CONF_MODULE, (st)) +# define sk_CONF_MODULE_push(st, val) SKM_sk_push(CONF_MODULE, (st), (val)) +# define sk_CONF_MODULE_unshift(st, val) SKM_sk_unshift(CONF_MODULE, (st), (val)) +# define sk_CONF_MODULE_find(st, val) SKM_sk_find(CONF_MODULE, (st), (val)) +# define sk_CONF_MODULE_find_ex(st, val) SKM_sk_find_ex(CONF_MODULE, (st), (val)) +# define sk_CONF_MODULE_delete(st, i) SKM_sk_delete(CONF_MODULE, (st), (i)) +# define sk_CONF_MODULE_delete_ptr(st, ptr) SKM_sk_delete_ptr(CONF_MODULE, (st), (ptr)) +# define sk_CONF_MODULE_insert(st, val, i) SKM_sk_insert(CONF_MODULE, (st), (val), (i)) +# define sk_CONF_MODULE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CONF_MODULE, (st), (cmp)) +# define sk_CONF_MODULE_dup(st) SKM_sk_dup(CONF_MODULE, st) +# define sk_CONF_MODULE_pop_free(st, free_func) SKM_sk_pop_free(CONF_MODULE, (st), (free_func)) +# define sk_CONF_MODULE_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(CONF_MODULE, (st), (copy_func), (free_func)) +# define sk_CONF_MODULE_shift(st) SKM_sk_shift(CONF_MODULE, (st)) +# define sk_CONF_MODULE_pop(st) SKM_sk_pop(CONF_MODULE, (st)) +# define sk_CONF_MODULE_sort(st) SKM_sk_sort(CONF_MODULE, (st)) +# define sk_CONF_MODULE_is_sorted(st) SKM_sk_is_sorted(CONF_MODULE, (st)) +# define sk_CONF_VALUE_new(cmp) SKM_sk_new(CONF_VALUE, (cmp)) +# define sk_CONF_VALUE_new_null() SKM_sk_new_null(CONF_VALUE) +# define sk_CONF_VALUE_free(st) SKM_sk_free(CONF_VALUE, (st)) +# define sk_CONF_VALUE_num(st) SKM_sk_num(CONF_VALUE, (st)) +# define sk_CONF_VALUE_value(st, i) SKM_sk_value(CONF_VALUE, (st), (i)) +# define sk_CONF_VALUE_set(st, i, val) SKM_sk_set(CONF_VALUE, (st), (i), (val)) +# define sk_CONF_VALUE_zero(st) SKM_sk_zero(CONF_VALUE, (st)) +# define sk_CONF_VALUE_push(st, val) SKM_sk_push(CONF_VALUE, (st), (val)) +# define sk_CONF_VALUE_unshift(st, val) SKM_sk_unshift(CONF_VALUE, (st), (val)) +# define sk_CONF_VALUE_find(st, val) SKM_sk_find(CONF_VALUE, (st), (val)) +# define sk_CONF_VALUE_find_ex(st, val) SKM_sk_find_ex(CONF_VALUE, (st), (val)) +# define sk_CONF_VALUE_delete(st, i) SKM_sk_delete(CONF_VALUE, (st), (i)) +# define sk_CONF_VALUE_delete_ptr(st, ptr) SKM_sk_delete_ptr(CONF_VALUE, (st), (ptr)) +# define sk_CONF_VALUE_insert(st, val, i) SKM_sk_insert(CONF_VALUE, (st), (val), (i)) +# define sk_CONF_VALUE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CONF_VALUE, (st), (cmp)) +# define sk_CONF_VALUE_dup(st) SKM_sk_dup(CONF_VALUE, st) +# define sk_CONF_VALUE_pop_free(st, free_func) SKM_sk_pop_free(CONF_VALUE, (st), (free_func)) +# define sk_CONF_VALUE_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(CONF_VALUE, (st), (copy_func), (free_func)) +# define sk_CONF_VALUE_shift(st) SKM_sk_shift(CONF_VALUE, (st)) +# define sk_CONF_VALUE_pop(st) SKM_sk_pop(CONF_VALUE, (st)) +# define sk_CONF_VALUE_sort(st) SKM_sk_sort(CONF_VALUE, (st)) +# define sk_CONF_VALUE_is_sorted(st) SKM_sk_is_sorted(CONF_VALUE, (st)) +# define sk_CRYPTO_EX_DATA_FUNCS_new(cmp) SKM_sk_new(CRYPTO_EX_DATA_FUNCS, (cmp)) +# define sk_CRYPTO_EX_DATA_FUNCS_new_null() SKM_sk_new_null(CRYPTO_EX_DATA_FUNCS) +# define sk_CRYPTO_EX_DATA_FUNCS_free(st) SKM_sk_free(CRYPTO_EX_DATA_FUNCS, (st)) +# define sk_CRYPTO_EX_DATA_FUNCS_num(st) SKM_sk_num(CRYPTO_EX_DATA_FUNCS, (st)) +# define sk_CRYPTO_EX_DATA_FUNCS_value(st, i) SKM_sk_value(CRYPTO_EX_DATA_FUNCS, (st), (i)) +# define sk_CRYPTO_EX_DATA_FUNCS_set(st, i, val) SKM_sk_set(CRYPTO_EX_DATA_FUNCS, (st), (i), (val)) +# define sk_CRYPTO_EX_DATA_FUNCS_zero(st) SKM_sk_zero(CRYPTO_EX_DATA_FUNCS, (st)) +# define sk_CRYPTO_EX_DATA_FUNCS_push(st, val) SKM_sk_push(CRYPTO_EX_DATA_FUNCS, (st), (val)) +# define sk_CRYPTO_EX_DATA_FUNCS_unshift(st, val) SKM_sk_unshift(CRYPTO_EX_DATA_FUNCS, (st), (val)) +# define sk_CRYPTO_EX_DATA_FUNCS_find(st, val) SKM_sk_find(CRYPTO_EX_DATA_FUNCS, (st), (val)) +# define sk_CRYPTO_EX_DATA_FUNCS_find_ex(st, val) SKM_sk_find_ex(CRYPTO_EX_DATA_FUNCS, (st), (val)) +# define sk_CRYPTO_EX_DATA_FUNCS_delete(st, i) SKM_sk_delete(CRYPTO_EX_DATA_FUNCS, (st), (i)) +# define sk_CRYPTO_EX_DATA_FUNCS_delete_ptr(st, ptr) SKM_sk_delete_ptr(CRYPTO_EX_DATA_FUNCS, (st), (ptr)) +# define sk_CRYPTO_EX_DATA_FUNCS_insert(st, val, i) SKM_sk_insert(CRYPTO_EX_DATA_FUNCS, (st), (val), (i)) +# define sk_CRYPTO_EX_DATA_FUNCS_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CRYPTO_EX_DATA_FUNCS, (st), (cmp)) +# define sk_CRYPTO_EX_DATA_FUNCS_dup(st) SKM_sk_dup(CRYPTO_EX_DATA_FUNCS, st) +# define sk_CRYPTO_EX_DATA_FUNCS_pop_free(st, free_func) SKM_sk_pop_free(CRYPTO_EX_DATA_FUNCS, (st), (free_func)) +# define sk_CRYPTO_EX_DATA_FUNCS_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(CRYPTO_EX_DATA_FUNCS, (st), (copy_func), (free_func)) +# define sk_CRYPTO_EX_DATA_FUNCS_shift(st) SKM_sk_shift(CRYPTO_EX_DATA_FUNCS, (st)) +# define sk_CRYPTO_EX_DATA_FUNCS_pop(st) SKM_sk_pop(CRYPTO_EX_DATA_FUNCS, (st)) +# define sk_CRYPTO_EX_DATA_FUNCS_sort(st) SKM_sk_sort(CRYPTO_EX_DATA_FUNCS, (st)) +# define sk_CRYPTO_EX_DATA_FUNCS_is_sorted(st) SKM_sk_is_sorted(CRYPTO_EX_DATA_FUNCS, (st)) +# define sk_CRYPTO_dynlock_new(cmp) SKM_sk_new(CRYPTO_dynlock, (cmp)) +# define sk_CRYPTO_dynlock_new_null() SKM_sk_new_null(CRYPTO_dynlock) +# define sk_CRYPTO_dynlock_free(st) SKM_sk_free(CRYPTO_dynlock, (st)) +# define sk_CRYPTO_dynlock_num(st) SKM_sk_num(CRYPTO_dynlock, (st)) +# define sk_CRYPTO_dynlock_value(st, i) SKM_sk_value(CRYPTO_dynlock, (st), (i)) +# define sk_CRYPTO_dynlock_set(st, i, val) SKM_sk_set(CRYPTO_dynlock, (st), (i), (val)) +# define sk_CRYPTO_dynlock_zero(st) SKM_sk_zero(CRYPTO_dynlock, (st)) +# define sk_CRYPTO_dynlock_push(st, val) SKM_sk_push(CRYPTO_dynlock, (st), (val)) +# define sk_CRYPTO_dynlock_unshift(st, val) SKM_sk_unshift(CRYPTO_dynlock, (st), (val)) +# define sk_CRYPTO_dynlock_find(st, val) SKM_sk_find(CRYPTO_dynlock, (st), (val)) +# define sk_CRYPTO_dynlock_find_ex(st, val) SKM_sk_find_ex(CRYPTO_dynlock, (st), (val)) +# define sk_CRYPTO_dynlock_delete(st, i) SKM_sk_delete(CRYPTO_dynlock, (st), (i)) +# define sk_CRYPTO_dynlock_delete_ptr(st, ptr) SKM_sk_delete_ptr(CRYPTO_dynlock, (st), (ptr)) +# define sk_CRYPTO_dynlock_insert(st, val, i) SKM_sk_insert(CRYPTO_dynlock, (st), (val), (i)) +# define sk_CRYPTO_dynlock_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CRYPTO_dynlock, (st), (cmp)) +# define sk_CRYPTO_dynlock_dup(st) SKM_sk_dup(CRYPTO_dynlock, st) +# define sk_CRYPTO_dynlock_pop_free(st, free_func) SKM_sk_pop_free(CRYPTO_dynlock, (st), (free_func)) +# define sk_CRYPTO_dynlock_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(CRYPTO_dynlock, (st), (copy_func), (free_func)) +# define sk_CRYPTO_dynlock_shift(st) SKM_sk_shift(CRYPTO_dynlock, (st)) +# define sk_CRYPTO_dynlock_pop(st) SKM_sk_pop(CRYPTO_dynlock, (st)) +# define sk_CRYPTO_dynlock_sort(st) SKM_sk_sort(CRYPTO_dynlock, (st)) +# define sk_CRYPTO_dynlock_is_sorted(st) SKM_sk_is_sorted(CRYPTO_dynlock, (st)) +# define sk_DIST_POINT_new(cmp) SKM_sk_new(DIST_POINT, (cmp)) +# define sk_DIST_POINT_new_null() SKM_sk_new_null(DIST_POINT) +# define sk_DIST_POINT_free(st) SKM_sk_free(DIST_POINT, (st)) +# define sk_DIST_POINT_num(st) SKM_sk_num(DIST_POINT, (st)) +# define sk_DIST_POINT_value(st, i) SKM_sk_value(DIST_POINT, (st), (i)) +# define sk_DIST_POINT_set(st, i, val) SKM_sk_set(DIST_POINT, (st), (i), (val)) +# define sk_DIST_POINT_zero(st) SKM_sk_zero(DIST_POINT, (st)) +# define sk_DIST_POINT_push(st, val) SKM_sk_push(DIST_POINT, (st), (val)) +# define sk_DIST_POINT_unshift(st, val) SKM_sk_unshift(DIST_POINT, (st), (val)) +# define sk_DIST_POINT_find(st, val) SKM_sk_find(DIST_POINT, (st), (val)) +# define sk_DIST_POINT_find_ex(st, val) SKM_sk_find_ex(DIST_POINT, (st), (val)) +# define sk_DIST_POINT_delete(st, i) SKM_sk_delete(DIST_POINT, (st), (i)) +# define sk_DIST_POINT_delete_ptr(st, ptr) SKM_sk_delete_ptr(DIST_POINT, (st), (ptr)) +# define sk_DIST_POINT_insert(st, val, i) SKM_sk_insert(DIST_POINT, (st), (val), (i)) +# define sk_DIST_POINT_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(DIST_POINT, (st), (cmp)) +# define sk_DIST_POINT_dup(st) SKM_sk_dup(DIST_POINT, st) +# define sk_DIST_POINT_pop_free(st, free_func) SKM_sk_pop_free(DIST_POINT, (st), (free_func)) +# define sk_DIST_POINT_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(DIST_POINT, (st), (copy_func), (free_func)) +# define sk_DIST_POINT_shift(st) SKM_sk_shift(DIST_POINT, (st)) +# define sk_DIST_POINT_pop(st) SKM_sk_pop(DIST_POINT, (st)) +# define sk_DIST_POINT_sort(st) SKM_sk_sort(DIST_POINT, (st)) +# define sk_DIST_POINT_is_sorted(st) SKM_sk_is_sorted(DIST_POINT, (st)) +# define sk_ENGINE_new(cmp) SKM_sk_new(ENGINE, (cmp)) +# define sk_ENGINE_new_null() SKM_sk_new_null(ENGINE) +# define sk_ENGINE_free(st) SKM_sk_free(ENGINE, (st)) +# define sk_ENGINE_num(st) SKM_sk_num(ENGINE, (st)) +# define sk_ENGINE_value(st, i) SKM_sk_value(ENGINE, (st), (i)) +# define sk_ENGINE_set(st, i, val) SKM_sk_set(ENGINE, (st), (i), (val)) +# define sk_ENGINE_zero(st) SKM_sk_zero(ENGINE, (st)) +# define sk_ENGINE_push(st, val) SKM_sk_push(ENGINE, (st), (val)) +# define sk_ENGINE_unshift(st, val) SKM_sk_unshift(ENGINE, (st), (val)) +# define sk_ENGINE_find(st, val) SKM_sk_find(ENGINE, (st), (val)) +# define sk_ENGINE_find_ex(st, val) SKM_sk_find_ex(ENGINE, (st), (val)) +# define sk_ENGINE_delete(st, i) SKM_sk_delete(ENGINE, (st), (i)) +# define sk_ENGINE_delete_ptr(st, ptr) SKM_sk_delete_ptr(ENGINE, (st), (ptr)) +# define sk_ENGINE_insert(st, val, i) SKM_sk_insert(ENGINE, (st), (val), (i)) +# define sk_ENGINE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ENGINE, (st), (cmp)) +# define sk_ENGINE_dup(st) SKM_sk_dup(ENGINE, st) +# define sk_ENGINE_pop_free(st, free_func) SKM_sk_pop_free(ENGINE, (st), (free_func)) +# define sk_ENGINE_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(ENGINE, (st), (copy_func), (free_func)) +# define sk_ENGINE_shift(st) SKM_sk_shift(ENGINE, (st)) +# define sk_ENGINE_pop(st) SKM_sk_pop(ENGINE, (st)) +# define sk_ENGINE_sort(st) SKM_sk_sort(ENGINE, (st)) +# define sk_ENGINE_is_sorted(st) SKM_sk_is_sorted(ENGINE, (st)) +# define sk_ENGINE_CLEANUP_ITEM_new(cmp) SKM_sk_new(ENGINE_CLEANUP_ITEM, (cmp)) +# define sk_ENGINE_CLEANUP_ITEM_new_null() SKM_sk_new_null(ENGINE_CLEANUP_ITEM) +# define sk_ENGINE_CLEANUP_ITEM_free(st) SKM_sk_free(ENGINE_CLEANUP_ITEM, (st)) +# define sk_ENGINE_CLEANUP_ITEM_num(st) SKM_sk_num(ENGINE_CLEANUP_ITEM, (st)) +# define sk_ENGINE_CLEANUP_ITEM_value(st, i) SKM_sk_value(ENGINE_CLEANUP_ITEM, (st), (i)) +# define sk_ENGINE_CLEANUP_ITEM_set(st, i, val) SKM_sk_set(ENGINE_CLEANUP_ITEM, (st), (i), (val)) +# define sk_ENGINE_CLEANUP_ITEM_zero(st) SKM_sk_zero(ENGINE_CLEANUP_ITEM, (st)) +# define sk_ENGINE_CLEANUP_ITEM_push(st, val) SKM_sk_push(ENGINE_CLEANUP_ITEM, (st), (val)) +# define sk_ENGINE_CLEANUP_ITEM_unshift(st, val) SKM_sk_unshift(ENGINE_CLEANUP_ITEM, (st), (val)) +# define sk_ENGINE_CLEANUP_ITEM_find(st, val) SKM_sk_find(ENGINE_CLEANUP_ITEM, (st), (val)) +# define sk_ENGINE_CLEANUP_ITEM_find_ex(st, val) SKM_sk_find_ex(ENGINE_CLEANUP_ITEM, (st), (val)) +# define sk_ENGINE_CLEANUP_ITEM_delete(st, i) SKM_sk_delete(ENGINE_CLEANUP_ITEM, (st), (i)) +# define sk_ENGINE_CLEANUP_ITEM_delete_ptr(st, ptr) SKM_sk_delete_ptr(ENGINE_CLEANUP_ITEM, (st), (ptr)) +# define sk_ENGINE_CLEANUP_ITEM_insert(st, val, i) SKM_sk_insert(ENGINE_CLEANUP_ITEM, (st), (val), (i)) +# define sk_ENGINE_CLEANUP_ITEM_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ENGINE_CLEANUP_ITEM, (st), (cmp)) +# define sk_ENGINE_CLEANUP_ITEM_dup(st) SKM_sk_dup(ENGINE_CLEANUP_ITEM, st) +# define sk_ENGINE_CLEANUP_ITEM_pop_free(st, free_func) SKM_sk_pop_free(ENGINE_CLEANUP_ITEM, (st), (free_func)) +# define sk_ENGINE_CLEANUP_ITEM_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(ENGINE_CLEANUP_ITEM, (st), (copy_func), (free_func)) +# define sk_ENGINE_CLEANUP_ITEM_shift(st) SKM_sk_shift(ENGINE_CLEANUP_ITEM, (st)) +# define sk_ENGINE_CLEANUP_ITEM_pop(st) SKM_sk_pop(ENGINE_CLEANUP_ITEM, (st)) +# define sk_ENGINE_CLEANUP_ITEM_sort(st) SKM_sk_sort(ENGINE_CLEANUP_ITEM, (st)) +# define sk_ENGINE_CLEANUP_ITEM_is_sorted(st) SKM_sk_is_sorted(ENGINE_CLEANUP_ITEM, (st)) +# define sk_ESS_CERT_ID_new(cmp) SKM_sk_new(ESS_CERT_ID, (cmp)) +# define sk_ESS_CERT_ID_new_null() SKM_sk_new_null(ESS_CERT_ID) +# define sk_ESS_CERT_ID_free(st) SKM_sk_free(ESS_CERT_ID, (st)) +# define sk_ESS_CERT_ID_num(st) SKM_sk_num(ESS_CERT_ID, (st)) +# define sk_ESS_CERT_ID_value(st, i) SKM_sk_value(ESS_CERT_ID, (st), (i)) +# define sk_ESS_CERT_ID_set(st, i, val) SKM_sk_set(ESS_CERT_ID, (st), (i), (val)) +# define sk_ESS_CERT_ID_zero(st) SKM_sk_zero(ESS_CERT_ID, (st)) +# define sk_ESS_CERT_ID_push(st, val) SKM_sk_push(ESS_CERT_ID, (st), (val)) +# define sk_ESS_CERT_ID_unshift(st, val) SKM_sk_unshift(ESS_CERT_ID, (st), (val)) +# define sk_ESS_CERT_ID_find(st, val) SKM_sk_find(ESS_CERT_ID, (st), (val)) +# define sk_ESS_CERT_ID_find_ex(st, val) SKM_sk_find_ex(ESS_CERT_ID, (st), (val)) +# define sk_ESS_CERT_ID_delete(st, i) SKM_sk_delete(ESS_CERT_ID, (st), (i)) +# define sk_ESS_CERT_ID_delete_ptr(st, ptr) SKM_sk_delete_ptr(ESS_CERT_ID, (st), (ptr)) +# define sk_ESS_CERT_ID_insert(st, val, i) SKM_sk_insert(ESS_CERT_ID, (st), (val), (i)) +# define sk_ESS_CERT_ID_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ESS_CERT_ID, (st), (cmp)) +# define sk_ESS_CERT_ID_dup(st) SKM_sk_dup(ESS_CERT_ID, st) +# define sk_ESS_CERT_ID_pop_free(st, free_func) SKM_sk_pop_free(ESS_CERT_ID, (st), (free_func)) +# define sk_ESS_CERT_ID_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(ESS_CERT_ID, (st), (copy_func), (free_func)) +# define sk_ESS_CERT_ID_shift(st) SKM_sk_shift(ESS_CERT_ID, (st)) +# define sk_ESS_CERT_ID_pop(st) SKM_sk_pop(ESS_CERT_ID, (st)) +# define sk_ESS_CERT_ID_sort(st) SKM_sk_sort(ESS_CERT_ID, (st)) +# define sk_ESS_CERT_ID_is_sorted(st) SKM_sk_is_sorted(ESS_CERT_ID, (st)) +# define sk_EVP_MD_new(cmp) SKM_sk_new(EVP_MD, (cmp)) +# define sk_EVP_MD_new_null() SKM_sk_new_null(EVP_MD) +# define sk_EVP_MD_free(st) SKM_sk_free(EVP_MD, (st)) +# define sk_EVP_MD_num(st) SKM_sk_num(EVP_MD, (st)) +# define sk_EVP_MD_value(st, i) SKM_sk_value(EVP_MD, (st), (i)) +# define sk_EVP_MD_set(st, i, val) SKM_sk_set(EVP_MD, (st), (i), (val)) +# define sk_EVP_MD_zero(st) SKM_sk_zero(EVP_MD, (st)) +# define sk_EVP_MD_push(st, val) SKM_sk_push(EVP_MD, (st), (val)) +# define sk_EVP_MD_unshift(st, val) SKM_sk_unshift(EVP_MD, (st), (val)) +# define sk_EVP_MD_find(st, val) SKM_sk_find(EVP_MD, (st), (val)) +# define sk_EVP_MD_find_ex(st, val) SKM_sk_find_ex(EVP_MD, (st), (val)) +# define sk_EVP_MD_delete(st, i) SKM_sk_delete(EVP_MD, (st), (i)) +# define sk_EVP_MD_delete_ptr(st, ptr) SKM_sk_delete_ptr(EVP_MD, (st), (ptr)) +# define sk_EVP_MD_insert(st, val, i) SKM_sk_insert(EVP_MD, (st), (val), (i)) +# define sk_EVP_MD_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(EVP_MD, (st), (cmp)) +# define sk_EVP_MD_dup(st) SKM_sk_dup(EVP_MD, st) +# define sk_EVP_MD_pop_free(st, free_func) SKM_sk_pop_free(EVP_MD, (st), (free_func)) +# define sk_EVP_MD_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(EVP_MD, (st), (copy_func), (free_func)) +# define sk_EVP_MD_shift(st) SKM_sk_shift(EVP_MD, (st)) +# define sk_EVP_MD_pop(st) SKM_sk_pop(EVP_MD, (st)) +# define sk_EVP_MD_sort(st) SKM_sk_sort(EVP_MD, (st)) +# define sk_EVP_MD_is_sorted(st) SKM_sk_is_sorted(EVP_MD, (st)) +# define sk_EVP_PBE_CTL_new(cmp) SKM_sk_new(EVP_PBE_CTL, (cmp)) +# define sk_EVP_PBE_CTL_new_null() SKM_sk_new_null(EVP_PBE_CTL) +# define sk_EVP_PBE_CTL_free(st) SKM_sk_free(EVP_PBE_CTL, (st)) +# define sk_EVP_PBE_CTL_num(st) SKM_sk_num(EVP_PBE_CTL, (st)) +# define sk_EVP_PBE_CTL_value(st, i) SKM_sk_value(EVP_PBE_CTL, (st), (i)) +# define sk_EVP_PBE_CTL_set(st, i, val) SKM_sk_set(EVP_PBE_CTL, (st), (i), (val)) +# define sk_EVP_PBE_CTL_zero(st) SKM_sk_zero(EVP_PBE_CTL, (st)) +# define sk_EVP_PBE_CTL_push(st, val) SKM_sk_push(EVP_PBE_CTL, (st), (val)) +# define sk_EVP_PBE_CTL_unshift(st, val) SKM_sk_unshift(EVP_PBE_CTL, (st), (val)) +# define sk_EVP_PBE_CTL_find(st, val) SKM_sk_find(EVP_PBE_CTL, (st), (val)) +# define sk_EVP_PBE_CTL_find_ex(st, val) SKM_sk_find_ex(EVP_PBE_CTL, (st), (val)) +# define sk_EVP_PBE_CTL_delete(st, i) SKM_sk_delete(EVP_PBE_CTL, (st), (i)) +# define sk_EVP_PBE_CTL_delete_ptr(st, ptr) SKM_sk_delete_ptr(EVP_PBE_CTL, (st), (ptr)) +# define sk_EVP_PBE_CTL_insert(st, val, i) SKM_sk_insert(EVP_PBE_CTL, (st), (val), (i)) +# define sk_EVP_PBE_CTL_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(EVP_PBE_CTL, (st), (cmp)) +# define sk_EVP_PBE_CTL_dup(st) SKM_sk_dup(EVP_PBE_CTL, st) +# define sk_EVP_PBE_CTL_pop_free(st, free_func) SKM_sk_pop_free(EVP_PBE_CTL, (st), (free_func)) +# define sk_EVP_PBE_CTL_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(EVP_PBE_CTL, (st), (copy_func), (free_func)) +# define sk_EVP_PBE_CTL_shift(st) SKM_sk_shift(EVP_PBE_CTL, (st)) +# define sk_EVP_PBE_CTL_pop(st) SKM_sk_pop(EVP_PBE_CTL, (st)) +# define sk_EVP_PBE_CTL_sort(st) SKM_sk_sort(EVP_PBE_CTL, (st)) +# define sk_EVP_PBE_CTL_is_sorted(st) SKM_sk_is_sorted(EVP_PBE_CTL, (st)) +# define sk_EVP_PKEY_ASN1_METHOD_new(cmp) SKM_sk_new(EVP_PKEY_ASN1_METHOD, (cmp)) +# define sk_EVP_PKEY_ASN1_METHOD_new_null() SKM_sk_new_null(EVP_PKEY_ASN1_METHOD) +# define sk_EVP_PKEY_ASN1_METHOD_free(st) SKM_sk_free(EVP_PKEY_ASN1_METHOD, (st)) +# define sk_EVP_PKEY_ASN1_METHOD_num(st) SKM_sk_num(EVP_PKEY_ASN1_METHOD, (st)) +# define sk_EVP_PKEY_ASN1_METHOD_value(st, i) SKM_sk_value(EVP_PKEY_ASN1_METHOD, (st), (i)) +# define sk_EVP_PKEY_ASN1_METHOD_set(st, i, val) SKM_sk_set(EVP_PKEY_ASN1_METHOD, (st), (i), (val)) +# define sk_EVP_PKEY_ASN1_METHOD_zero(st) SKM_sk_zero(EVP_PKEY_ASN1_METHOD, (st)) +# define sk_EVP_PKEY_ASN1_METHOD_push(st, val) SKM_sk_push(EVP_PKEY_ASN1_METHOD, (st), (val)) +# define sk_EVP_PKEY_ASN1_METHOD_unshift(st, val) SKM_sk_unshift(EVP_PKEY_ASN1_METHOD, (st), (val)) +# define sk_EVP_PKEY_ASN1_METHOD_find(st, val) SKM_sk_find(EVP_PKEY_ASN1_METHOD, (st), (val)) +# define sk_EVP_PKEY_ASN1_METHOD_find_ex(st, val) SKM_sk_find_ex(EVP_PKEY_ASN1_METHOD, (st), (val)) +# define sk_EVP_PKEY_ASN1_METHOD_delete(st, i) SKM_sk_delete(EVP_PKEY_ASN1_METHOD, (st), (i)) +# define sk_EVP_PKEY_ASN1_METHOD_delete_ptr(st, ptr) SKM_sk_delete_ptr(EVP_PKEY_ASN1_METHOD, (st), (ptr)) +# define sk_EVP_PKEY_ASN1_METHOD_insert(st, val, i) SKM_sk_insert(EVP_PKEY_ASN1_METHOD, (st), (val), (i)) +# define sk_EVP_PKEY_ASN1_METHOD_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(EVP_PKEY_ASN1_METHOD, (st), (cmp)) +# define sk_EVP_PKEY_ASN1_METHOD_dup(st) SKM_sk_dup(EVP_PKEY_ASN1_METHOD, st) +# define sk_EVP_PKEY_ASN1_METHOD_pop_free(st, free_func) SKM_sk_pop_free(EVP_PKEY_ASN1_METHOD, (st), (free_func)) +# define sk_EVP_PKEY_ASN1_METHOD_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(EVP_PKEY_ASN1_METHOD, (st), (copy_func), (free_func)) +# define sk_EVP_PKEY_ASN1_METHOD_shift(st) SKM_sk_shift(EVP_PKEY_ASN1_METHOD, (st)) +# define sk_EVP_PKEY_ASN1_METHOD_pop(st) SKM_sk_pop(EVP_PKEY_ASN1_METHOD, (st)) +# define sk_EVP_PKEY_ASN1_METHOD_sort(st) SKM_sk_sort(EVP_PKEY_ASN1_METHOD, (st)) +# define sk_EVP_PKEY_ASN1_METHOD_is_sorted(st) SKM_sk_is_sorted(EVP_PKEY_ASN1_METHOD, (st)) +# define sk_EVP_PKEY_METHOD_new(cmp) SKM_sk_new(EVP_PKEY_METHOD, (cmp)) +# define sk_EVP_PKEY_METHOD_new_null() SKM_sk_new_null(EVP_PKEY_METHOD) +# define sk_EVP_PKEY_METHOD_free(st) SKM_sk_free(EVP_PKEY_METHOD, (st)) +# define sk_EVP_PKEY_METHOD_num(st) SKM_sk_num(EVP_PKEY_METHOD, (st)) +# define sk_EVP_PKEY_METHOD_value(st, i) SKM_sk_value(EVP_PKEY_METHOD, (st), (i)) +# define sk_EVP_PKEY_METHOD_set(st, i, val) SKM_sk_set(EVP_PKEY_METHOD, (st), (i), (val)) +# define sk_EVP_PKEY_METHOD_zero(st) SKM_sk_zero(EVP_PKEY_METHOD, (st)) +# define sk_EVP_PKEY_METHOD_push(st, val) SKM_sk_push(EVP_PKEY_METHOD, (st), (val)) +# define sk_EVP_PKEY_METHOD_unshift(st, val) SKM_sk_unshift(EVP_PKEY_METHOD, (st), (val)) +# define sk_EVP_PKEY_METHOD_find(st, val) SKM_sk_find(EVP_PKEY_METHOD, (st), (val)) +# define sk_EVP_PKEY_METHOD_find_ex(st, val) SKM_sk_find_ex(EVP_PKEY_METHOD, (st), (val)) +# define sk_EVP_PKEY_METHOD_delete(st, i) SKM_sk_delete(EVP_PKEY_METHOD, (st), (i)) +# define sk_EVP_PKEY_METHOD_delete_ptr(st, ptr) SKM_sk_delete_ptr(EVP_PKEY_METHOD, (st), (ptr)) +# define sk_EVP_PKEY_METHOD_insert(st, val, i) SKM_sk_insert(EVP_PKEY_METHOD, (st), (val), (i)) +# define sk_EVP_PKEY_METHOD_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(EVP_PKEY_METHOD, (st), (cmp)) +# define sk_EVP_PKEY_METHOD_dup(st) SKM_sk_dup(EVP_PKEY_METHOD, st) +# define sk_EVP_PKEY_METHOD_pop_free(st, free_func) SKM_sk_pop_free(EVP_PKEY_METHOD, (st), (free_func)) +# define sk_EVP_PKEY_METHOD_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(EVP_PKEY_METHOD, (st), (copy_func), (free_func)) +# define sk_EVP_PKEY_METHOD_shift(st) SKM_sk_shift(EVP_PKEY_METHOD, (st)) +# define sk_EVP_PKEY_METHOD_pop(st) SKM_sk_pop(EVP_PKEY_METHOD, (st)) +# define sk_EVP_PKEY_METHOD_sort(st) SKM_sk_sort(EVP_PKEY_METHOD, (st)) +# define sk_EVP_PKEY_METHOD_is_sorted(st) SKM_sk_is_sorted(EVP_PKEY_METHOD, (st)) +# define sk_GENERAL_NAME_new(cmp) SKM_sk_new(GENERAL_NAME, (cmp)) +# define sk_GENERAL_NAME_new_null() SKM_sk_new_null(GENERAL_NAME) +# define sk_GENERAL_NAME_free(st) SKM_sk_free(GENERAL_NAME, (st)) +# define sk_GENERAL_NAME_num(st) SKM_sk_num(GENERAL_NAME, (st)) +# define sk_GENERAL_NAME_value(st, i) SKM_sk_value(GENERAL_NAME, (st), (i)) +# define sk_GENERAL_NAME_set(st, i, val) SKM_sk_set(GENERAL_NAME, (st), (i), (val)) +# define sk_GENERAL_NAME_zero(st) SKM_sk_zero(GENERAL_NAME, (st)) +# define sk_GENERAL_NAME_push(st, val) SKM_sk_push(GENERAL_NAME, (st), (val)) +# define sk_GENERAL_NAME_unshift(st, val) SKM_sk_unshift(GENERAL_NAME, (st), (val)) +# define sk_GENERAL_NAME_find(st, val) SKM_sk_find(GENERAL_NAME, (st), (val)) +# define sk_GENERAL_NAME_find_ex(st, val) SKM_sk_find_ex(GENERAL_NAME, (st), (val)) +# define sk_GENERAL_NAME_delete(st, i) SKM_sk_delete(GENERAL_NAME, (st), (i)) +# define sk_GENERAL_NAME_delete_ptr(st, ptr) SKM_sk_delete_ptr(GENERAL_NAME, (st), (ptr)) +# define sk_GENERAL_NAME_insert(st, val, i) SKM_sk_insert(GENERAL_NAME, (st), (val), (i)) +# define sk_GENERAL_NAME_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(GENERAL_NAME, (st), (cmp)) +# define sk_GENERAL_NAME_dup(st) SKM_sk_dup(GENERAL_NAME, st) +# define sk_GENERAL_NAME_pop_free(st, free_func) SKM_sk_pop_free(GENERAL_NAME, (st), (free_func)) +# define sk_GENERAL_NAME_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(GENERAL_NAME, (st), (copy_func), (free_func)) +# define sk_GENERAL_NAME_shift(st) SKM_sk_shift(GENERAL_NAME, (st)) +# define sk_GENERAL_NAME_pop(st) SKM_sk_pop(GENERAL_NAME, (st)) +# define sk_GENERAL_NAME_sort(st) SKM_sk_sort(GENERAL_NAME, (st)) +# define sk_GENERAL_NAME_is_sorted(st) SKM_sk_is_sorted(GENERAL_NAME, (st)) +# define sk_GENERAL_NAMES_new(cmp) SKM_sk_new(GENERAL_NAMES, (cmp)) +# define sk_GENERAL_NAMES_new_null() SKM_sk_new_null(GENERAL_NAMES) +# define sk_GENERAL_NAMES_free(st) SKM_sk_free(GENERAL_NAMES, (st)) +# define sk_GENERAL_NAMES_num(st) SKM_sk_num(GENERAL_NAMES, (st)) +# define sk_GENERAL_NAMES_value(st, i) SKM_sk_value(GENERAL_NAMES, (st), (i)) +# define sk_GENERAL_NAMES_set(st, i, val) SKM_sk_set(GENERAL_NAMES, (st), (i), (val)) +# define sk_GENERAL_NAMES_zero(st) SKM_sk_zero(GENERAL_NAMES, (st)) +# define sk_GENERAL_NAMES_push(st, val) SKM_sk_push(GENERAL_NAMES, (st), (val)) +# define sk_GENERAL_NAMES_unshift(st, val) SKM_sk_unshift(GENERAL_NAMES, (st), (val)) +# define sk_GENERAL_NAMES_find(st, val) SKM_sk_find(GENERAL_NAMES, (st), (val)) +# define sk_GENERAL_NAMES_find_ex(st, val) SKM_sk_find_ex(GENERAL_NAMES, (st), (val)) +# define sk_GENERAL_NAMES_delete(st, i) SKM_sk_delete(GENERAL_NAMES, (st), (i)) +# define sk_GENERAL_NAMES_delete_ptr(st, ptr) SKM_sk_delete_ptr(GENERAL_NAMES, (st), (ptr)) +# define sk_GENERAL_NAMES_insert(st, val, i) SKM_sk_insert(GENERAL_NAMES, (st), (val), (i)) +# define sk_GENERAL_NAMES_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(GENERAL_NAMES, (st), (cmp)) +# define sk_GENERAL_NAMES_dup(st) SKM_sk_dup(GENERAL_NAMES, st) +# define sk_GENERAL_NAMES_pop_free(st, free_func) SKM_sk_pop_free(GENERAL_NAMES, (st), (free_func)) +# define sk_GENERAL_NAMES_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(GENERAL_NAMES, (st), (copy_func), (free_func)) +# define sk_GENERAL_NAMES_shift(st) SKM_sk_shift(GENERAL_NAMES, (st)) +# define sk_GENERAL_NAMES_pop(st) SKM_sk_pop(GENERAL_NAMES, (st)) +# define sk_GENERAL_NAMES_sort(st) SKM_sk_sort(GENERAL_NAMES, (st)) +# define sk_GENERAL_NAMES_is_sorted(st) SKM_sk_is_sorted(GENERAL_NAMES, (st)) +# define sk_GENERAL_SUBTREE_new(cmp) SKM_sk_new(GENERAL_SUBTREE, (cmp)) +# define sk_GENERAL_SUBTREE_new_null() SKM_sk_new_null(GENERAL_SUBTREE) +# define sk_GENERAL_SUBTREE_free(st) SKM_sk_free(GENERAL_SUBTREE, (st)) +# define sk_GENERAL_SUBTREE_num(st) SKM_sk_num(GENERAL_SUBTREE, (st)) +# define sk_GENERAL_SUBTREE_value(st, i) SKM_sk_value(GENERAL_SUBTREE, (st), (i)) +# define sk_GENERAL_SUBTREE_set(st, i, val) SKM_sk_set(GENERAL_SUBTREE, (st), (i), (val)) +# define sk_GENERAL_SUBTREE_zero(st) SKM_sk_zero(GENERAL_SUBTREE, (st)) +# define sk_GENERAL_SUBTREE_push(st, val) SKM_sk_push(GENERAL_SUBTREE, (st), (val)) +# define sk_GENERAL_SUBTREE_unshift(st, val) SKM_sk_unshift(GENERAL_SUBTREE, (st), (val)) +# define sk_GENERAL_SUBTREE_find(st, val) SKM_sk_find(GENERAL_SUBTREE, (st), (val)) +# define sk_GENERAL_SUBTREE_find_ex(st, val) SKM_sk_find_ex(GENERAL_SUBTREE, (st), (val)) +# define sk_GENERAL_SUBTREE_delete(st, i) SKM_sk_delete(GENERAL_SUBTREE, (st), (i)) +# define sk_GENERAL_SUBTREE_delete_ptr(st, ptr) SKM_sk_delete_ptr(GENERAL_SUBTREE, (st), (ptr)) +# define sk_GENERAL_SUBTREE_insert(st, val, i) SKM_sk_insert(GENERAL_SUBTREE, (st), (val), (i)) +# define sk_GENERAL_SUBTREE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(GENERAL_SUBTREE, (st), (cmp)) +# define sk_GENERAL_SUBTREE_dup(st) SKM_sk_dup(GENERAL_SUBTREE, st) +# define sk_GENERAL_SUBTREE_pop_free(st, free_func) SKM_sk_pop_free(GENERAL_SUBTREE, (st), (free_func)) +# define sk_GENERAL_SUBTREE_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(GENERAL_SUBTREE, (st), (copy_func), (free_func)) +# define sk_GENERAL_SUBTREE_shift(st) SKM_sk_shift(GENERAL_SUBTREE, (st)) +# define sk_GENERAL_SUBTREE_pop(st) SKM_sk_pop(GENERAL_SUBTREE, (st)) +# define sk_GENERAL_SUBTREE_sort(st) SKM_sk_sort(GENERAL_SUBTREE, (st)) +# define sk_GENERAL_SUBTREE_is_sorted(st) SKM_sk_is_sorted(GENERAL_SUBTREE, (st)) +# define sk_IPAddressFamily_new(cmp) SKM_sk_new(IPAddressFamily, (cmp)) +# define sk_IPAddressFamily_new_null() SKM_sk_new_null(IPAddressFamily) +# define sk_IPAddressFamily_free(st) SKM_sk_free(IPAddressFamily, (st)) +# define sk_IPAddressFamily_num(st) SKM_sk_num(IPAddressFamily, (st)) +# define sk_IPAddressFamily_value(st, i) SKM_sk_value(IPAddressFamily, (st), (i)) +# define sk_IPAddressFamily_set(st, i, val) SKM_sk_set(IPAddressFamily, (st), (i), (val)) +# define sk_IPAddressFamily_zero(st) SKM_sk_zero(IPAddressFamily, (st)) +# define sk_IPAddressFamily_push(st, val) SKM_sk_push(IPAddressFamily, (st), (val)) +# define sk_IPAddressFamily_unshift(st, val) SKM_sk_unshift(IPAddressFamily, (st), (val)) +# define sk_IPAddressFamily_find(st, val) SKM_sk_find(IPAddressFamily, (st), (val)) +# define sk_IPAddressFamily_find_ex(st, val) SKM_sk_find_ex(IPAddressFamily, (st), (val)) +# define sk_IPAddressFamily_delete(st, i) SKM_sk_delete(IPAddressFamily, (st), (i)) +# define sk_IPAddressFamily_delete_ptr(st, ptr) SKM_sk_delete_ptr(IPAddressFamily, (st), (ptr)) +# define sk_IPAddressFamily_insert(st, val, i) SKM_sk_insert(IPAddressFamily, (st), (val), (i)) +# define sk_IPAddressFamily_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(IPAddressFamily, (st), (cmp)) +# define sk_IPAddressFamily_dup(st) SKM_sk_dup(IPAddressFamily, st) +# define sk_IPAddressFamily_pop_free(st, free_func) SKM_sk_pop_free(IPAddressFamily, (st), (free_func)) +# define sk_IPAddressFamily_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(IPAddressFamily, (st), (copy_func), (free_func)) +# define sk_IPAddressFamily_shift(st) SKM_sk_shift(IPAddressFamily, (st)) +# define sk_IPAddressFamily_pop(st) SKM_sk_pop(IPAddressFamily, (st)) +# define sk_IPAddressFamily_sort(st) SKM_sk_sort(IPAddressFamily, (st)) +# define sk_IPAddressFamily_is_sorted(st) SKM_sk_is_sorted(IPAddressFamily, (st)) +# define sk_IPAddressOrRange_new(cmp) SKM_sk_new(IPAddressOrRange, (cmp)) +# define sk_IPAddressOrRange_new_null() SKM_sk_new_null(IPAddressOrRange) +# define sk_IPAddressOrRange_free(st) SKM_sk_free(IPAddressOrRange, (st)) +# define sk_IPAddressOrRange_num(st) SKM_sk_num(IPAddressOrRange, (st)) +# define sk_IPAddressOrRange_value(st, i) SKM_sk_value(IPAddressOrRange, (st), (i)) +# define sk_IPAddressOrRange_set(st, i, val) SKM_sk_set(IPAddressOrRange, (st), (i), (val)) +# define sk_IPAddressOrRange_zero(st) SKM_sk_zero(IPAddressOrRange, (st)) +# define sk_IPAddressOrRange_push(st, val) SKM_sk_push(IPAddressOrRange, (st), (val)) +# define sk_IPAddressOrRange_unshift(st, val) SKM_sk_unshift(IPAddressOrRange, (st), (val)) +# define sk_IPAddressOrRange_find(st, val) SKM_sk_find(IPAddressOrRange, (st), (val)) +# define sk_IPAddressOrRange_find_ex(st, val) SKM_sk_find_ex(IPAddressOrRange, (st), (val)) +# define sk_IPAddressOrRange_delete(st, i) SKM_sk_delete(IPAddressOrRange, (st), (i)) +# define sk_IPAddressOrRange_delete_ptr(st, ptr) SKM_sk_delete_ptr(IPAddressOrRange, (st), (ptr)) +# define sk_IPAddressOrRange_insert(st, val, i) SKM_sk_insert(IPAddressOrRange, (st), (val), (i)) +# define sk_IPAddressOrRange_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(IPAddressOrRange, (st), (cmp)) +# define sk_IPAddressOrRange_dup(st) SKM_sk_dup(IPAddressOrRange, st) +# define sk_IPAddressOrRange_pop_free(st, free_func) SKM_sk_pop_free(IPAddressOrRange, (st), (free_func)) +# define sk_IPAddressOrRange_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(IPAddressOrRange, (st), (copy_func), (free_func)) +# define sk_IPAddressOrRange_shift(st) SKM_sk_shift(IPAddressOrRange, (st)) +# define sk_IPAddressOrRange_pop(st) SKM_sk_pop(IPAddressOrRange, (st)) +# define sk_IPAddressOrRange_sort(st) SKM_sk_sort(IPAddressOrRange, (st)) +# define sk_IPAddressOrRange_is_sorted(st) SKM_sk_is_sorted(IPAddressOrRange, (st)) +# define sk_KRB5_APREQBODY_new(cmp) SKM_sk_new(KRB5_APREQBODY, (cmp)) +# define sk_KRB5_APREQBODY_new_null() SKM_sk_new_null(KRB5_APREQBODY) +# define sk_KRB5_APREQBODY_free(st) SKM_sk_free(KRB5_APREQBODY, (st)) +# define sk_KRB5_APREQBODY_num(st) SKM_sk_num(KRB5_APREQBODY, (st)) +# define sk_KRB5_APREQBODY_value(st, i) SKM_sk_value(KRB5_APREQBODY, (st), (i)) +# define sk_KRB5_APREQBODY_set(st, i, val) SKM_sk_set(KRB5_APREQBODY, (st), (i), (val)) +# define sk_KRB5_APREQBODY_zero(st) SKM_sk_zero(KRB5_APREQBODY, (st)) +# define sk_KRB5_APREQBODY_push(st, val) SKM_sk_push(KRB5_APREQBODY, (st), (val)) +# define sk_KRB5_APREQBODY_unshift(st, val) SKM_sk_unshift(KRB5_APREQBODY, (st), (val)) +# define sk_KRB5_APREQBODY_find(st, val) SKM_sk_find(KRB5_APREQBODY, (st), (val)) +# define sk_KRB5_APREQBODY_find_ex(st, val) SKM_sk_find_ex(KRB5_APREQBODY, (st), (val)) +# define sk_KRB5_APREQBODY_delete(st, i) SKM_sk_delete(KRB5_APREQBODY, (st), (i)) +# define sk_KRB5_APREQBODY_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_APREQBODY, (st), (ptr)) +# define sk_KRB5_APREQBODY_insert(st, val, i) SKM_sk_insert(KRB5_APREQBODY, (st), (val), (i)) +# define sk_KRB5_APREQBODY_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_APREQBODY, (st), (cmp)) +# define sk_KRB5_APREQBODY_dup(st) SKM_sk_dup(KRB5_APREQBODY, st) +# define sk_KRB5_APREQBODY_pop_free(st, free_func) SKM_sk_pop_free(KRB5_APREQBODY, (st), (free_func)) +# define sk_KRB5_APREQBODY_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(KRB5_APREQBODY, (st), (copy_func), (free_func)) +# define sk_KRB5_APREQBODY_shift(st) SKM_sk_shift(KRB5_APREQBODY, (st)) +# define sk_KRB5_APREQBODY_pop(st) SKM_sk_pop(KRB5_APREQBODY, (st)) +# define sk_KRB5_APREQBODY_sort(st) SKM_sk_sort(KRB5_APREQBODY, (st)) +# define sk_KRB5_APREQBODY_is_sorted(st) SKM_sk_is_sorted(KRB5_APREQBODY, (st)) +# define sk_KRB5_AUTHDATA_new(cmp) SKM_sk_new(KRB5_AUTHDATA, (cmp)) +# define sk_KRB5_AUTHDATA_new_null() SKM_sk_new_null(KRB5_AUTHDATA) +# define sk_KRB5_AUTHDATA_free(st) SKM_sk_free(KRB5_AUTHDATA, (st)) +# define sk_KRB5_AUTHDATA_num(st) SKM_sk_num(KRB5_AUTHDATA, (st)) +# define sk_KRB5_AUTHDATA_value(st, i) SKM_sk_value(KRB5_AUTHDATA, (st), (i)) +# define sk_KRB5_AUTHDATA_set(st, i, val) SKM_sk_set(KRB5_AUTHDATA, (st), (i), (val)) +# define sk_KRB5_AUTHDATA_zero(st) SKM_sk_zero(KRB5_AUTHDATA, (st)) +# define sk_KRB5_AUTHDATA_push(st, val) SKM_sk_push(KRB5_AUTHDATA, (st), (val)) +# define sk_KRB5_AUTHDATA_unshift(st, val) SKM_sk_unshift(KRB5_AUTHDATA, (st), (val)) +# define sk_KRB5_AUTHDATA_find(st, val) SKM_sk_find(KRB5_AUTHDATA, (st), (val)) +# define sk_KRB5_AUTHDATA_find_ex(st, val) SKM_sk_find_ex(KRB5_AUTHDATA, (st), (val)) +# define sk_KRB5_AUTHDATA_delete(st, i) SKM_sk_delete(KRB5_AUTHDATA, (st), (i)) +# define sk_KRB5_AUTHDATA_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_AUTHDATA, (st), (ptr)) +# define sk_KRB5_AUTHDATA_insert(st, val, i) SKM_sk_insert(KRB5_AUTHDATA, (st), (val), (i)) +# define sk_KRB5_AUTHDATA_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_AUTHDATA, (st), (cmp)) +# define sk_KRB5_AUTHDATA_dup(st) SKM_sk_dup(KRB5_AUTHDATA, st) +# define sk_KRB5_AUTHDATA_pop_free(st, free_func) SKM_sk_pop_free(KRB5_AUTHDATA, (st), (free_func)) +# define sk_KRB5_AUTHDATA_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(KRB5_AUTHDATA, (st), (copy_func), (free_func)) +# define sk_KRB5_AUTHDATA_shift(st) SKM_sk_shift(KRB5_AUTHDATA, (st)) +# define sk_KRB5_AUTHDATA_pop(st) SKM_sk_pop(KRB5_AUTHDATA, (st)) +# define sk_KRB5_AUTHDATA_sort(st) SKM_sk_sort(KRB5_AUTHDATA, (st)) +# define sk_KRB5_AUTHDATA_is_sorted(st) SKM_sk_is_sorted(KRB5_AUTHDATA, (st)) +# define sk_KRB5_AUTHENTBODY_new(cmp) SKM_sk_new(KRB5_AUTHENTBODY, (cmp)) +# define sk_KRB5_AUTHENTBODY_new_null() SKM_sk_new_null(KRB5_AUTHENTBODY) +# define sk_KRB5_AUTHENTBODY_free(st) SKM_sk_free(KRB5_AUTHENTBODY, (st)) +# define sk_KRB5_AUTHENTBODY_num(st) SKM_sk_num(KRB5_AUTHENTBODY, (st)) +# define sk_KRB5_AUTHENTBODY_value(st, i) SKM_sk_value(KRB5_AUTHENTBODY, (st), (i)) +# define sk_KRB5_AUTHENTBODY_set(st, i, val) SKM_sk_set(KRB5_AUTHENTBODY, (st), (i), (val)) +# define sk_KRB5_AUTHENTBODY_zero(st) SKM_sk_zero(KRB5_AUTHENTBODY, (st)) +# define sk_KRB5_AUTHENTBODY_push(st, val) SKM_sk_push(KRB5_AUTHENTBODY, (st), (val)) +# define sk_KRB5_AUTHENTBODY_unshift(st, val) SKM_sk_unshift(KRB5_AUTHENTBODY, (st), (val)) +# define sk_KRB5_AUTHENTBODY_find(st, val) SKM_sk_find(KRB5_AUTHENTBODY, (st), (val)) +# define sk_KRB5_AUTHENTBODY_find_ex(st, val) SKM_sk_find_ex(KRB5_AUTHENTBODY, (st), (val)) +# define sk_KRB5_AUTHENTBODY_delete(st, i) SKM_sk_delete(KRB5_AUTHENTBODY, (st), (i)) +# define sk_KRB5_AUTHENTBODY_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_AUTHENTBODY, (st), (ptr)) +# define sk_KRB5_AUTHENTBODY_insert(st, val, i) SKM_sk_insert(KRB5_AUTHENTBODY, (st), (val), (i)) +# define sk_KRB5_AUTHENTBODY_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_AUTHENTBODY, (st), (cmp)) +# define sk_KRB5_AUTHENTBODY_dup(st) SKM_sk_dup(KRB5_AUTHENTBODY, st) +# define sk_KRB5_AUTHENTBODY_pop_free(st, free_func) SKM_sk_pop_free(KRB5_AUTHENTBODY, (st), (free_func)) +# define sk_KRB5_AUTHENTBODY_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(KRB5_AUTHENTBODY, (st), (copy_func), (free_func)) +# define sk_KRB5_AUTHENTBODY_shift(st) SKM_sk_shift(KRB5_AUTHENTBODY, (st)) +# define sk_KRB5_AUTHENTBODY_pop(st) SKM_sk_pop(KRB5_AUTHENTBODY, (st)) +# define sk_KRB5_AUTHENTBODY_sort(st) SKM_sk_sort(KRB5_AUTHENTBODY, (st)) +# define sk_KRB5_AUTHENTBODY_is_sorted(st) SKM_sk_is_sorted(KRB5_AUTHENTBODY, (st)) +# define sk_KRB5_CHECKSUM_new(cmp) SKM_sk_new(KRB5_CHECKSUM, (cmp)) +# define sk_KRB5_CHECKSUM_new_null() SKM_sk_new_null(KRB5_CHECKSUM) +# define sk_KRB5_CHECKSUM_free(st) SKM_sk_free(KRB5_CHECKSUM, (st)) +# define sk_KRB5_CHECKSUM_num(st) SKM_sk_num(KRB5_CHECKSUM, (st)) +# define sk_KRB5_CHECKSUM_value(st, i) SKM_sk_value(KRB5_CHECKSUM, (st), (i)) +# define sk_KRB5_CHECKSUM_set(st, i, val) SKM_sk_set(KRB5_CHECKSUM, (st), (i), (val)) +# define sk_KRB5_CHECKSUM_zero(st) SKM_sk_zero(KRB5_CHECKSUM, (st)) +# define sk_KRB5_CHECKSUM_push(st, val) SKM_sk_push(KRB5_CHECKSUM, (st), (val)) +# define sk_KRB5_CHECKSUM_unshift(st, val) SKM_sk_unshift(KRB5_CHECKSUM, (st), (val)) +# define sk_KRB5_CHECKSUM_find(st, val) SKM_sk_find(KRB5_CHECKSUM, (st), (val)) +# define sk_KRB5_CHECKSUM_find_ex(st, val) SKM_sk_find_ex(KRB5_CHECKSUM, (st), (val)) +# define sk_KRB5_CHECKSUM_delete(st, i) SKM_sk_delete(KRB5_CHECKSUM, (st), (i)) +# define sk_KRB5_CHECKSUM_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_CHECKSUM, (st), (ptr)) +# define sk_KRB5_CHECKSUM_insert(st, val, i) SKM_sk_insert(KRB5_CHECKSUM, (st), (val), (i)) +# define sk_KRB5_CHECKSUM_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_CHECKSUM, (st), (cmp)) +# define sk_KRB5_CHECKSUM_dup(st) SKM_sk_dup(KRB5_CHECKSUM, st) +# define sk_KRB5_CHECKSUM_pop_free(st, free_func) SKM_sk_pop_free(KRB5_CHECKSUM, (st), (free_func)) +# define sk_KRB5_CHECKSUM_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(KRB5_CHECKSUM, (st), (copy_func), (free_func)) +# define sk_KRB5_CHECKSUM_shift(st) SKM_sk_shift(KRB5_CHECKSUM, (st)) +# define sk_KRB5_CHECKSUM_pop(st) SKM_sk_pop(KRB5_CHECKSUM, (st)) +# define sk_KRB5_CHECKSUM_sort(st) SKM_sk_sort(KRB5_CHECKSUM, (st)) +# define sk_KRB5_CHECKSUM_is_sorted(st) SKM_sk_is_sorted(KRB5_CHECKSUM, (st)) +# define sk_KRB5_ENCDATA_new(cmp) SKM_sk_new(KRB5_ENCDATA, (cmp)) +# define sk_KRB5_ENCDATA_new_null() SKM_sk_new_null(KRB5_ENCDATA) +# define sk_KRB5_ENCDATA_free(st) SKM_sk_free(KRB5_ENCDATA, (st)) +# define sk_KRB5_ENCDATA_num(st) SKM_sk_num(KRB5_ENCDATA, (st)) +# define sk_KRB5_ENCDATA_value(st, i) SKM_sk_value(KRB5_ENCDATA, (st), (i)) +# define sk_KRB5_ENCDATA_set(st, i, val) SKM_sk_set(KRB5_ENCDATA, (st), (i), (val)) +# define sk_KRB5_ENCDATA_zero(st) SKM_sk_zero(KRB5_ENCDATA, (st)) +# define sk_KRB5_ENCDATA_push(st, val) SKM_sk_push(KRB5_ENCDATA, (st), (val)) +# define sk_KRB5_ENCDATA_unshift(st, val) SKM_sk_unshift(KRB5_ENCDATA, (st), (val)) +# define sk_KRB5_ENCDATA_find(st, val) SKM_sk_find(KRB5_ENCDATA, (st), (val)) +# define sk_KRB5_ENCDATA_find_ex(st, val) SKM_sk_find_ex(KRB5_ENCDATA, (st), (val)) +# define sk_KRB5_ENCDATA_delete(st, i) SKM_sk_delete(KRB5_ENCDATA, (st), (i)) +# define sk_KRB5_ENCDATA_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_ENCDATA, (st), (ptr)) +# define sk_KRB5_ENCDATA_insert(st, val, i) SKM_sk_insert(KRB5_ENCDATA, (st), (val), (i)) +# define sk_KRB5_ENCDATA_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_ENCDATA, (st), (cmp)) +# define sk_KRB5_ENCDATA_dup(st) SKM_sk_dup(KRB5_ENCDATA, st) +# define sk_KRB5_ENCDATA_pop_free(st, free_func) SKM_sk_pop_free(KRB5_ENCDATA, (st), (free_func)) +# define sk_KRB5_ENCDATA_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(KRB5_ENCDATA, (st), (copy_func), (free_func)) +# define sk_KRB5_ENCDATA_shift(st) SKM_sk_shift(KRB5_ENCDATA, (st)) +# define sk_KRB5_ENCDATA_pop(st) SKM_sk_pop(KRB5_ENCDATA, (st)) +# define sk_KRB5_ENCDATA_sort(st) SKM_sk_sort(KRB5_ENCDATA, (st)) +# define sk_KRB5_ENCDATA_is_sorted(st) SKM_sk_is_sorted(KRB5_ENCDATA, (st)) +# define sk_KRB5_ENCKEY_new(cmp) SKM_sk_new(KRB5_ENCKEY, (cmp)) +# define sk_KRB5_ENCKEY_new_null() SKM_sk_new_null(KRB5_ENCKEY) +# define sk_KRB5_ENCKEY_free(st) SKM_sk_free(KRB5_ENCKEY, (st)) +# define sk_KRB5_ENCKEY_num(st) SKM_sk_num(KRB5_ENCKEY, (st)) +# define sk_KRB5_ENCKEY_value(st, i) SKM_sk_value(KRB5_ENCKEY, (st), (i)) +# define sk_KRB5_ENCKEY_set(st, i, val) SKM_sk_set(KRB5_ENCKEY, (st), (i), (val)) +# define sk_KRB5_ENCKEY_zero(st) SKM_sk_zero(KRB5_ENCKEY, (st)) +# define sk_KRB5_ENCKEY_push(st, val) SKM_sk_push(KRB5_ENCKEY, (st), (val)) +# define sk_KRB5_ENCKEY_unshift(st, val) SKM_sk_unshift(KRB5_ENCKEY, (st), (val)) +# define sk_KRB5_ENCKEY_find(st, val) SKM_sk_find(KRB5_ENCKEY, (st), (val)) +# define sk_KRB5_ENCKEY_find_ex(st, val) SKM_sk_find_ex(KRB5_ENCKEY, (st), (val)) +# define sk_KRB5_ENCKEY_delete(st, i) SKM_sk_delete(KRB5_ENCKEY, (st), (i)) +# define sk_KRB5_ENCKEY_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_ENCKEY, (st), (ptr)) +# define sk_KRB5_ENCKEY_insert(st, val, i) SKM_sk_insert(KRB5_ENCKEY, (st), (val), (i)) +# define sk_KRB5_ENCKEY_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_ENCKEY, (st), (cmp)) +# define sk_KRB5_ENCKEY_dup(st) SKM_sk_dup(KRB5_ENCKEY, st) +# define sk_KRB5_ENCKEY_pop_free(st, free_func) SKM_sk_pop_free(KRB5_ENCKEY, (st), (free_func)) +# define sk_KRB5_ENCKEY_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(KRB5_ENCKEY, (st), (copy_func), (free_func)) +# define sk_KRB5_ENCKEY_shift(st) SKM_sk_shift(KRB5_ENCKEY, (st)) +# define sk_KRB5_ENCKEY_pop(st) SKM_sk_pop(KRB5_ENCKEY, (st)) +# define sk_KRB5_ENCKEY_sort(st) SKM_sk_sort(KRB5_ENCKEY, (st)) +# define sk_KRB5_ENCKEY_is_sorted(st) SKM_sk_is_sorted(KRB5_ENCKEY, (st)) +# define sk_KRB5_PRINCNAME_new(cmp) SKM_sk_new(KRB5_PRINCNAME, (cmp)) +# define sk_KRB5_PRINCNAME_new_null() SKM_sk_new_null(KRB5_PRINCNAME) +# define sk_KRB5_PRINCNAME_free(st) SKM_sk_free(KRB5_PRINCNAME, (st)) +# define sk_KRB5_PRINCNAME_num(st) SKM_sk_num(KRB5_PRINCNAME, (st)) +# define sk_KRB5_PRINCNAME_value(st, i) SKM_sk_value(KRB5_PRINCNAME, (st), (i)) +# define sk_KRB5_PRINCNAME_set(st, i, val) SKM_sk_set(KRB5_PRINCNAME, (st), (i), (val)) +# define sk_KRB5_PRINCNAME_zero(st) SKM_sk_zero(KRB5_PRINCNAME, (st)) +# define sk_KRB5_PRINCNAME_push(st, val) SKM_sk_push(KRB5_PRINCNAME, (st), (val)) +# define sk_KRB5_PRINCNAME_unshift(st, val) SKM_sk_unshift(KRB5_PRINCNAME, (st), (val)) +# define sk_KRB5_PRINCNAME_find(st, val) SKM_sk_find(KRB5_PRINCNAME, (st), (val)) +# define sk_KRB5_PRINCNAME_find_ex(st, val) SKM_sk_find_ex(KRB5_PRINCNAME, (st), (val)) +# define sk_KRB5_PRINCNAME_delete(st, i) SKM_sk_delete(KRB5_PRINCNAME, (st), (i)) +# define sk_KRB5_PRINCNAME_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_PRINCNAME, (st), (ptr)) +# define sk_KRB5_PRINCNAME_insert(st, val, i) SKM_sk_insert(KRB5_PRINCNAME, (st), (val), (i)) +# define sk_KRB5_PRINCNAME_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_PRINCNAME, (st), (cmp)) +# define sk_KRB5_PRINCNAME_dup(st) SKM_sk_dup(KRB5_PRINCNAME, st) +# define sk_KRB5_PRINCNAME_pop_free(st, free_func) SKM_sk_pop_free(KRB5_PRINCNAME, (st), (free_func)) +# define sk_KRB5_PRINCNAME_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(KRB5_PRINCNAME, (st), (copy_func), (free_func)) +# define sk_KRB5_PRINCNAME_shift(st) SKM_sk_shift(KRB5_PRINCNAME, (st)) +# define sk_KRB5_PRINCNAME_pop(st) SKM_sk_pop(KRB5_PRINCNAME, (st)) +# define sk_KRB5_PRINCNAME_sort(st) SKM_sk_sort(KRB5_PRINCNAME, (st)) +# define sk_KRB5_PRINCNAME_is_sorted(st) SKM_sk_is_sorted(KRB5_PRINCNAME, (st)) +# define sk_KRB5_TKTBODY_new(cmp) SKM_sk_new(KRB5_TKTBODY, (cmp)) +# define sk_KRB5_TKTBODY_new_null() SKM_sk_new_null(KRB5_TKTBODY) +# define sk_KRB5_TKTBODY_free(st) SKM_sk_free(KRB5_TKTBODY, (st)) +# define sk_KRB5_TKTBODY_num(st) SKM_sk_num(KRB5_TKTBODY, (st)) +# define sk_KRB5_TKTBODY_value(st, i) SKM_sk_value(KRB5_TKTBODY, (st), (i)) +# define sk_KRB5_TKTBODY_set(st, i, val) SKM_sk_set(KRB5_TKTBODY, (st), (i), (val)) +# define sk_KRB5_TKTBODY_zero(st) SKM_sk_zero(KRB5_TKTBODY, (st)) +# define sk_KRB5_TKTBODY_push(st, val) SKM_sk_push(KRB5_TKTBODY, (st), (val)) +# define sk_KRB5_TKTBODY_unshift(st, val) SKM_sk_unshift(KRB5_TKTBODY, (st), (val)) +# define sk_KRB5_TKTBODY_find(st, val) SKM_sk_find(KRB5_TKTBODY, (st), (val)) +# define sk_KRB5_TKTBODY_find_ex(st, val) SKM_sk_find_ex(KRB5_TKTBODY, (st), (val)) +# define sk_KRB5_TKTBODY_delete(st, i) SKM_sk_delete(KRB5_TKTBODY, (st), (i)) +# define sk_KRB5_TKTBODY_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_TKTBODY, (st), (ptr)) +# define sk_KRB5_TKTBODY_insert(st, val, i) SKM_sk_insert(KRB5_TKTBODY, (st), (val), (i)) +# define sk_KRB5_TKTBODY_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_TKTBODY, (st), (cmp)) +# define sk_KRB5_TKTBODY_dup(st) SKM_sk_dup(KRB5_TKTBODY, st) +# define sk_KRB5_TKTBODY_pop_free(st, free_func) SKM_sk_pop_free(KRB5_TKTBODY, (st), (free_func)) +# define sk_KRB5_TKTBODY_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(KRB5_TKTBODY, (st), (copy_func), (free_func)) +# define sk_KRB5_TKTBODY_shift(st) SKM_sk_shift(KRB5_TKTBODY, (st)) +# define sk_KRB5_TKTBODY_pop(st) SKM_sk_pop(KRB5_TKTBODY, (st)) +# define sk_KRB5_TKTBODY_sort(st) SKM_sk_sort(KRB5_TKTBODY, (st)) +# define sk_KRB5_TKTBODY_is_sorted(st) SKM_sk_is_sorted(KRB5_TKTBODY, (st)) +# define sk_MEM_OBJECT_DATA_new(cmp) SKM_sk_new(MEM_OBJECT_DATA, (cmp)) +# define sk_MEM_OBJECT_DATA_new_null() SKM_sk_new_null(MEM_OBJECT_DATA) +# define sk_MEM_OBJECT_DATA_free(st) SKM_sk_free(MEM_OBJECT_DATA, (st)) +# define sk_MEM_OBJECT_DATA_num(st) SKM_sk_num(MEM_OBJECT_DATA, (st)) +# define sk_MEM_OBJECT_DATA_value(st, i) SKM_sk_value(MEM_OBJECT_DATA, (st), (i)) +# define sk_MEM_OBJECT_DATA_set(st, i, val) SKM_sk_set(MEM_OBJECT_DATA, (st), (i), (val)) +# define sk_MEM_OBJECT_DATA_zero(st) SKM_sk_zero(MEM_OBJECT_DATA, (st)) +# define sk_MEM_OBJECT_DATA_push(st, val) SKM_sk_push(MEM_OBJECT_DATA, (st), (val)) +# define sk_MEM_OBJECT_DATA_unshift(st, val) SKM_sk_unshift(MEM_OBJECT_DATA, (st), (val)) +# define sk_MEM_OBJECT_DATA_find(st, val) SKM_sk_find(MEM_OBJECT_DATA, (st), (val)) +# define sk_MEM_OBJECT_DATA_find_ex(st, val) SKM_sk_find_ex(MEM_OBJECT_DATA, (st), (val)) +# define sk_MEM_OBJECT_DATA_delete(st, i) SKM_sk_delete(MEM_OBJECT_DATA, (st), (i)) +# define sk_MEM_OBJECT_DATA_delete_ptr(st, ptr) SKM_sk_delete_ptr(MEM_OBJECT_DATA, (st), (ptr)) +# define sk_MEM_OBJECT_DATA_insert(st, val, i) SKM_sk_insert(MEM_OBJECT_DATA, (st), (val), (i)) +# define sk_MEM_OBJECT_DATA_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(MEM_OBJECT_DATA, (st), (cmp)) +# define sk_MEM_OBJECT_DATA_dup(st) SKM_sk_dup(MEM_OBJECT_DATA, st) +# define sk_MEM_OBJECT_DATA_pop_free(st, free_func) SKM_sk_pop_free(MEM_OBJECT_DATA, (st), (free_func)) +# define sk_MEM_OBJECT_DATA_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(MEM_OBJECT_DATA, (st), (copy_func), (free_func)) +# define sk_MEM_OBJECT_DATA_shift(st) SKM_sk_shift(MEM_OBJECT_DATA, (st)) +# define sk_MEM_OBJECT_DATA_pop(st) SKM_sk_pop(MEM_OBJECT_DATA, (st)) +# define sk_MEM_OBJECT_DATA_sort(st) SKM_sk_sort(MEM_OBJECT_DATA, (st)) +# define sk_MEM_OBJECT_DATA_is_sorted(st) SKM_sk_is_sorted(MEM_OBJECT_DATA, (st)) +# define sk_MIME_HEADER_new(cmp) SKM_sk_new(MIME_HEADER, (cmp)) +# define sk_MIME_HEADER_new_null() SKM_sk_new_null(MIME_HEADER) +# define sk_MIME_HEADER_free(st) SKM_sk_free(MIME_HEADER, (st)) +# define sk_MIME_HEADER_num(st) SKM_sk_num(MIME_HEADER, (st)) +# define sk_MIME_HEADER_value(st, i) SKM_sk_value(MIME_HEADER, (st), (i)) +# define sk_MIME_HEADER_set(st, i, val) SKM_sk_set(MIME_HEADER, (st), (i), (val)) +# define sk_MIME_HEADER_zero(st) SKM_sk_zero(MIME_HEADER, (st)) +# define sk_MIME_HEADER_push(st, val) SKM_sk_push(MIME_HEADER, (st), (val)) +# define sk_MIME_HEADER_unshift(st, val) SKM_sk_unshift(MIME_HEADER, (st), (val)) +# define sk_MIME_HEADER_find(st, val) SKM_sk_find(MIME_HEADER, (st), (val)) +# define sk_MIME_HEADER_find_ex(st, val) SKM_sk_find_ex(MIME_HEADER, (st), (val)) +# define sk_MIME_HEADER_delete(st, i) SKM_sk_delete(MIME_HEADER, (st), (i)) +# define sk_MIME_HEADER_delete_ptr(st, ptr) SKM_sk_delete_ptr(MIME_HEADER, (st), (ptr)) +# define sk_MIME_HEADER_insert(st, val, i) SKM_sk_insert(MIME_HEADER, (st), (val), (i)) +# define sk_MIME_HEADER_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(MIME_HEADER, (st), (cmp)) +# define sk_MIME_HEADER_dup(st) SKM_sk_dup(MIME_HEADER, st) +# define sk_MIME_HEADER_pop_free(st, free_func) SKM_sk_pop_free(MIME_HEADER, (st), (free_func)) +# define sk_MIME_HEADER_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(MIME_HEADER, (st), (copy_func), (free_func)) +# define sk_MIME_HEADER_shift(st) SKM_sk_shift(MIME_HEADER, (st)) +# define sk_MIME_HEADER_pop(st) SKM_sk_pop(MIME_HEADER, (st)) +# define sk_MIME_HEADER_sort(st) SKM_sk_sort(MIME_HEADER, (st)) +# define sk_MIME_HEADER_is_sorted(st) SKM_sk_is_sorted(MIME_HEADER, (st)) +# define sk_MIME_PARAM_new(cmp) SKM_sk_new(MIME_PARAM, (cmp)) +# define sk_MIME_PARAM_new_null() SKM_sk_new_null(MIME_PARAM) +# define sk_MIME_PARAM_free(st) SKM_sk_free(MIME_PARAM, (st)) +# define sk_MIME_PARAM_num(st) SKM_sk_num(MIME_PARAM, (st)) +# define sk_MIME_PARAM_value(st, i) SKM_sk_value(MIME_PARAM, (st), (i)) +# define sk_MIME_PARAM_set(st, i, val) SKM_sk_set(MIME_PARAM, (st), (i), (val)) +# define sk_MIME_PARAM_zero(st) SKM_sk_zero(MIME_PARAM, (st)) +# define sk_MIME_PARAM_push(st, val) SKM_sk_push(MIME_PARAM, (st), (val)) +# define sk_MIME_PARAM_unshift(st, val) SKM_sk_unshift(MIME_PARAM, (st), (val)) +# define sk_MIME_PARAM_find(st, val) SKM_sk_find(MIME_PARAM, (st), (val)) +# define sk_MIME_PARAM_find_ex(st, val) SKM_sk_find_ex(MIME_PARAM, (st), (val)) +# define sk_MIME_PARAM_delete(st, i) SKM_sk_delete(MIME_PARAM, (st), (i)) +# define sk_MIME_PARAM_delete_ptr(st, ptr) SKM_sk_delete_ptr(MIME_PARAM, (st), (ptr)) +# define sk_MIME_PARAM_insert(st, val, i) SKM_sk_insert(MIME_PARAM, (st), (val), (i)) +# define sk_MIME_PARAM_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(MIME_PARAM, (st), (cmp)) +# define sk_MIME_PARAM_dup(st) SKM_sk_dup(MIME_PARAM, st) +# define sk_MIME_PARAM_pop_free(st, free_func) SKM_sk_pop_free(MIME_PARAM, (st), (free_func)) +# define sk_MIME_PARAM_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(MIME_PARAM, (st), (copy_func), (free_func)) +# define sk_MIME_PARAM_shift(st) SKM_sk_shift(MIME_PARAM, (st)) +# define sk_MIME_PARAM_pop(st) SKM_sk_pop(MIME_PARAM, (st)) +# define sk_MIME_PARAM_sort(st) SKM_sk_sort(MIME_PARAM, (st)) +# define sk_MIME_PARAM_is_sorted(st) SKM_sk_is_sorted(MIME_PARAM, (st)) +# define sk_NAME_FUNCS_new(cmp) SKM_sk_new(NAME_FUNCS, (cmp)) +# define sk_NAME_FUNCS_new_null() SKM_sk_new_null(NAME_FUNCS) +# define sk_NAME_FUNCS_free(st) SKM_sk_free(NAME_FUNCS, (st)) +# define sk_NAME_FUNCS_num(st) SKM_sk_num(NAME_FUNCS, (st)) +# define sk_NAME_FUNCS_value(st, i) SKM_sk_value(NAME_FUNCS, (st), (i)) +# define sk_NAME_FUNCS_set(st, i, val) SKM_sk_set(NAME_FUNCS, (st), (i), (val)) +# define sk_NAME_FUNCS_zero(st) SKM_sk_zero(NAME_FUNCS, (st)) +# define sk_NAME_FUNCS_push(st, val) SKM_sk_push(NAME_FUNCS, (st), (val)) +# define sk_NAME_FUNCS_unshift(st, val) SKM_sk_unshift(NAME_FUNCS, (st), (val)) +# define sk_NAME_FUNCS_find(st, val) SKM_sk_find(NAME_FUNCS, (st), (val)) +# define sk_NAME_FUNCS_find_ex(st, val) SKM_sk_find_ex(NAME_FUNCS, (st), (val)) +# define sk_NAME_FUNCS_delete(st, i) SKM_sk_delete(NAME_FUNCS, (st), (i)) +# define sk_NAME_FUNCS_delete_ptr(st, ptr) SKM_sk_delete_ptr(NAME_FUNCS, (st), (ptr)) +# define sk_NAME_FUNCS_insert(st, val, i) SKM_sk_insert(NAME_FUNCS, (st), (val), (i)) +# define sk_NAME_FUNCS_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(NAME_FUNCS, (st), (cmp)) +# define sk_NAME_FUNCS_dup(st) SKM_sk_dup(NAME_FUNCS, st) +# define sk_NAME_FUNCS_pop_free(st, free_func) SKM_sk_pop_free(NAME_FUNCS, (st), (free_func)) +# define sk_NAME_FUNCS_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(NAME_FUNCS, (st), (copy_func), (free_func)) +# define sk_NAME_FUNCS_shift(st) SKM_sk_shift(NAME_FUNCS, (st)) +# define sk_NAME_FUNCS_pop(st) SKM_sk_pop(NAME_FUNCS, (st)) +# define sk_NAME_FUNCS_sort(st) SKM_sk_sort(NAME_FUNCS, (st)) +# define sk_NAME_FUNCS_is_sorted(st) SKM_sk_is_sorted(NAME_FUNCS, (st)) +# define sk_OCSP_CERTID_new(cmp) SKM_sk_new(OCSP_CERTID, (cmp)) +# define sk_OCSP_CERTID_new_null() SKM_sk_new_null(OCSP_CERTID) +# define sk_OCSP_CERTID_free(st) SKM_sk_free(OCSP_CERTID, (st)) +# define sk_OCSP_CERTID_num(st) SKM_sk_num(OCSP_CERTID, (st)) +# define sk_OCSP_CERTID_value(st, i) SKM_sk_value(OCSP_CERTID, (st), (i)) +# define sk_OCSP_CERTID_set(st, i, val) SKM_sk_set(OCSP_CERTID, (st), (i), (val)) +# define sk_OCSP_CERTID_zero(st) SKM_sk_zero(OCSP_CERTID, (st)) +# define sk_OCSP_CERTID_push(st, val) SKM_sk_push(OCSP_CERTID, (st), (val)) +# define sk_OCSP_CERTID_unshift(st, val) SKM_sk_unshift(OCSP_CERTID, (st), (val)) +# define sk_OCSP_CERTID_find(st, val) SKM_sk_find(OCSP_CERTID, (st), (val)) +# define sk_OCSP_CERTID_find_ex(st, val) SKM_sk_find_ex(OCSP_CERTID, (st), (val)) +# define sk_OCSP_CERTID_delete(st, i) SKM_sk_delete(OCSP_CERTID, (st), (i)) +# define sk_OCSP_CERTID_delete_ptr(st, ptr) SKM_sk_delete_ptr(OCSP_CERTID, (st), (ptr)) +# define sk_OCSP_CERTID_insert(st, val, i) SKM_sk_insert(OCSP_CERTID, (st), (val), (i)) +# define sk_OCSP_CERTID_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(OCSP_CERTID, (st), (cmp)) +# define sk_OCSP_CERTID_dup(st) SKM_sk_dup(OCSP_CERTID, st) +# define sk_OCSP_CERTID_pop_free(st, free_func) SKM_sk_pop_free(OCSP_CERTID, (st), (free_func)) +# define sk_OCSP_CERTID_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(OCSP_CERTID, (st), (copy_func), (free_func)) +# define sk_OCSP_CERTID_shift(st) SKM_sk_shift(OCSP_CERTID, (st)) +# define sk_OCSP_CERTID_pop(st) SKM_sk_pop(OCSP_CERTID, (st)) +# define sk_OCSP_CERTID_sort(st) SKM_sk_sort(OCSP_CERTID, (st)) +# define sk_OCSP_CERTID_is_sorted(st) SKM_sk_is_sorted(OCSP_CERTID, (st)) +# define sk_OCSP_ONEREQ_new(cmp) SKM_sk_new(OCSP_ONEREQ, (cmp)) +# define sk_OCSP_ONEREQ_new_null() SKM_sk_new_null(OCSP_ONEREQ) +# define sk_OCSP_ONEREQ_free(st) SKM_sk_free(OCSP_ONEREQ, (st)) +# define sk_OCSP_ONEREQ_num(st) SKM_sk_num(OCSP_ONEREQ, (st)) +# define sk_OCSP_ONEREQ_value(st, i) SKM_sk_value(OCSP_ONEREQ, (st), (i)) +# define sk_OCSP_ONEREQ_set(st, i, val) SKM_sk_set(OCSP_ONEREQ, (st), (i), (val)) +# define sk_OCSP_ONEREQ_zero(st) SKM_sk_zero(OCSP_ONEREQ, (st)) +# define sk_OCSP_ONEREQ_push(st, val) SKM_sk_push(OCSP_ONEREQ, (st), (val)) +# define sk_OCSP_ONEREQ_unshift(st, val) SKM_sk_unshift(OCSP_ONEREQ, (st), (val)) +# define sk_OCSP_ONEREQ_find(st, val) SKM_sk_find(OCSP_ONEREQ, (st), (val)) +# define sk_OCSP_ONEREQ_find_ex(st, val) SKM_sk_find_ex(OCSP_ONEREQ, (st), (val)) +# define sk_OCSP_ONEREQ_delete(st, i) SKM_sk_delete(OCSP_ONEREQ, (st), (i)) +# define sk_OCSP_ONEREQ_delete_ptr(st, ptr) SKM_sk_delete_ptr(OCSP_ONEREQ, (st), (ptr)) +# define sk_OCSP_ONEREQ_insert(st, val, i) SKM_sk_insert(OCSP_ONEREQ, (st), (val), (i)) +# define sk_OCSP_ONEREQ_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(OCSP_ONEREQ, (st), (cmp)) +# define sk_OCSP_ONEREQ_dup(st) SKM_sk_dup(OCSP_ONEREQ, st) +# define sk_OCSP_ONEREQ_pop_free(st, free_func) SKM_sk_pop_free(OCSP_ONEREQ, (st), (free_func)) +# define sk_OCSP_ONEREQ_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(OCSP_ONEREQ, (st), (copy_func), (free_func)) +# define sk_OCSP_ONEREQ_shift(st) SKM_sk_shift(OCSP_ONEREQ, (st)) +# define sk_OCSP_ONEREQ_pop(st) SKM_sk_pop(OCSP_ONEREQ, (st)) +# define sk_OCSP_ONEREQ_sort(st) SKM_sk_sort(OCSP_ONEREQ, (st)) +# define sk_OCSP_ONEREQ_is_sorted(st) SKM_sk_is_sorted(OCSP_ONEREQ, (st)) +# define sk_OCSP_RESPID_new(cmp) SKM_sk_new(OCSP_RESPID, (cmp)) +# define sk_OCSP_RESPID_new_null() SKM_sk_new_null(OCSP_RESPID) +# define sk_OCSP_RESPID_free(st) SKM_sk_free(OCSP_RESPID, (st)) +# define sk_OCSP_RESPID_num(st) SKM_sk_num(OCSP_RESPID, (st)) +# define sk_OCSP_RESPID_value(st, i) SKM_sk_value(OCSP_RESPID, (st), (i)) +# define sk_OCSP_RESPID_set(st, i, val) SKM_sk_set(OCSP_RESPID, (st), (i), (val)) +# define sk_OCSP_RESPID_zero(st) SKM_sk_zero(OCSP_RESPID, (st)) +# define sk_OCSP_RESPID_push(st, val) SKM_sk_push(OCSP_RESPID, (st), (val)) +# define sk_OCSP_RESPID_unshift(st, val) SKM_sk_unshift(OCSP_RESPID, (st), (val)) +# define sk_OCSP_RESPID_find(st, val) SKM_sk_find(OCSP_RESPID, (st), (val)) +# define sk_OCSP_RESPID_find_ex(st, val) SKM_sk_find_ex(OCSP_RESPID, (st), (val)) +# define sk_OCSP_RESPID_delete(st, i) SKM_sk_delete(OCSP_RESPID, (st), (i)) +# define sk_OCSP_RESPID_delete_ptr(st, ptr) SKM_sk_delete_ptr(OCSP_RESPID, (st), (ptr)) +# define sk_OCSP_RESPID_insert(st, val, i) SKM_sk_insert(OCSP_RESPID, (st), (val), (i)) +# define sk_OCSP_RESPID_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(OCSP_RESPID, (st), (cmp)) +# define sk_OCSP_RESPID_dup(st) SKM_sk_dup(OCSP_RESPID, st) +# define sk_OCSP_RESPID_pop_free(st, free_func) SKM_sk_pop_free(OCSP_RESPID, (st), (free_func)) +# define sk_OCSP_RESPID_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(OCSP_RESPID, (st), (copy_func), (free_func)) +# define sk_OCSP_RESPID_shift(st) SKM_sk_shift(OCSP_RESPID, (st)) +# define sk_OCSP_RESPID_pop(st) SKM_sk_pop(OCSP_RESPID, (st)) +# define sk_OCSP_RESPID_sort(st) SKM_sk_sort(OCSP_RESPID, (st)) +# define sk_OCSP_RESPID_is_sorted(st) SKM_sk_is_sorted(OCSP_RESPID, (st)) +# define sk_OCSP_SINGLERESP_new(cmp) SKM_sk_new(OCSP_SINGLERESP, (cmp)) +# define sk_OCSP_SINGLERESP_new_null() SKM_sk_new_null(OCSP_SINGLERESP) +# define sk_OCSP_SINGLERESP_free(st) SKM_sk_free(OCSP_SINGLERESP, (st)) +# define sk_OCSP_SINGLERESP_num(st) SKM_sk_num(OCSP_SINGLERESP, (st)) +# define sk_OCSP_SINGLERESP_value(st, i) SKM_sk_value(OCSP_SINGLERESP, (st), (i)) +# define sk_OCSP_SINGLERESP_set(st, i, val) SKM_sk_set(OCSP_SINGLERESP, (st), (i), (val)) +# define sk_OCSP_SINGLERESP_zero(st) SKM_sk_zero(OCSP_SINGLERESP, (st)) +# define sk_OCSP_SINGLERESP_push(st, val) SKM_sk_push(OCSP_SINGLERESP, (st), (val)) +# define sk_OCSP_SINGLERESP_unshift(st, val) SKM_sk_unshift(OCSP_SINGLERESP, (st), (val)) +# define sk_OCSP_SINGLERESP_find(st, val) SKM_sk_find(OCSP_SINGLERESP, (st), (val)) +# define sk_OCSP_SINGLERESP_find_ex(st, val) SKM_sk_find_ex(OCSP_SINGLERESP, (st), (val)) +# define sk_OCSP_SINGLERESP_delete(st, i) SKM_sk_delete(OCSP_SINGLERESP, (st), (i)) +# define sk_OCSP_SINGLERESP_delete_ptr(st, ptr) SKM_sk_delete_ptr(OCSP_SINGLERESP, (st), (ptr)) +# define sk_OCSP_SINGLERESP_insert(st, val, i) SKM_sk_insert(OCSP_SINGLERESP, (st), (val), (i)) +# define sk_OCSP_SINGLERESP_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(OCSP_SINGLERESP, (st), (cmp)) +# define sk_OCSP_SINGLERESP_dup(st) SKM_sk_dup(OCSP_SINGLERESP, st) +# define sk_OCSP_SINGLERESP_pop_free(st, free_func) SKM_sk_pop_free(OCSP_SINGLERESP, (st), (free_func)) +# define sk_OCSP_SINGLERESP_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(OCSP_SINGLERESP, (st), (copy_func), (free_func)) +# define sk_OCSP_SINGLERESP_shift(st) SKM_sk_shift(OCSP_SINGLERESP, (st)) +# define sk_OCSP_SINGLERESP_pop(st) SKM_sk_pop(OCSP_SINGLERESP, (st)) +# define sk_OCSP_SINGLERESP_sort(st) SKM_sk_sort(OCSP_SINGLERESP, (st)) +# define sk_OCSP_SINGLERESP_is_sorted(st) SKM_sk_is_sorted(OCSP_SINGLERESP, (st)) +# define sk_PKCS12_SAFEBAG_new(cmp) SKM_sk_new(PKCS12_SAFEBAG, (cmp)) +# define sk_PKCS12_SAFEBAG_new_null() SKM_sk_new_null(PKCS12_SAFEBAG) +# define sk_PKCS12_SAFEBAG_free(st) SKM_sk_free(PKCS12_SAFEBAG, (st)) +# define sk_PKCS12_SAFEBAG_num(st) SKM_sk_num(PKCS12_SAFEBAG, (st)) +# define sk_PKCS12_SAFEBAG_value(st, i) SKM_sk_value(PKCS12_SAFEBAG, (st), (i)) +# define sk_PKCS12_SAFEBAG_set(st, i, val) SKM_sk_set(PKCS12_SAFEBAG, (st), (i), (val)) +# define sk_PKCS12_SAFEBAG_zero(st) SKM_sk_zero(PKCS12_SAFEBAG, (st)) +# define sk_PKCS12_SAFEBAG_push(st, val) SKM_sk_push(PKCS12_SAFEBAG, (st), (val)) +# define sk_PKCS12_SAFEBAG_unshift(st, val) SKM_sk_unshift(PKCS12_SAFEBAG, (st), (val)) +# define sk_PKCS12_SAFEBAG_find(st, val) SKM_sk_find(PKCS12_SAFEBAG, (st), (val)) +# define sk_PKCS12_SAFEBAG_find_ex(st, val) SKM_sk_find_ex(PKCS12_SAFEBAG, (st), (val)) +# define sk_PKCS12_SAFEBAG_delete(st, i) SKM_sk_delete(PKCS12_SAFEBAG, (st), (i)) +# define sk_PKCS12_SAFEBAG_delete_ptr(st, ptr) SKM_sk_delete_ptr(PKCS12_SAFEBAG, (st), (ptr)) +# define sk_PKCS12_SAFEBAG_insert(st, val, i) SKM_sk_insert(PKCS12_SAFEBAG, (st), (val), (i)) +# define sk_PKCS12_SAFEBAG_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(PKCS12_SAFEBAG, (st), (cmp)) +# define sk_PKCS12_SAFEBAG_dup(st) SKM_sk_dup(PKCS12_SAFEBAG, st) +# define sk_PKCS12_SAFEBAG_pop_free(st, free_func) SKM_sk_pop_free(PKCS12_SAFEBAG, (st), (free_func)) +# define sk_PKCS12_SAFEBAG_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(PKCS12_SAFEBAG, (st), (copy_func), (free_func)) +# define sk_PKCS12_SAFEBAG_shift(st) SKM_sk_shift(PKCS12_SAFEBAG, (st)) +# define sk_PKCS12_SAFEBAG_pop(st) SKM_sk_pop(PKCS12_SAFEBAG, (st)) +# define sk_PKCS12_SAFEBAG_sort(st) SKM_sk_sort(PKCS12_SAFEBAG, (st)) +# define sk_PKCS12_SAFEBAG_is_sorted(st) SKM_sk_is_sorted(PKCS12_SAFEBAG, (st)) +# define sk_PKCS7_new(cmp) SKM_sk_new(PKCS7, (cmp)) +# define sk_PKCS7_new_null() SKM_sk_new_null(PKCS7) +# define sk_PKCS7_free(st) SKM_sk_free(PKCS7, (st)) +# define sk_PKCS7_num(st) SKM_sk_num(PKCS7, (st)) +# define sk_PKCS7_value(st, i) SKM_sk_value(PKCS7, (st), (i)) +# define sk_PKCS7_set(st, i, val) SKM_sk_set(PKCS7, (st), (i), (val)) +# define sk_PKCS7_zero(st) SKM_sk_zero(PKCS7, (st)) +# define sk_PKCS7_push(st, val) SKM_sk_push(PKCS7, (st), (val)) +# define sk_PKCS7_unshift(st, val) SKM_sk_unshift(PKCS7, (st), (val)) +# define sk_PKCS7_find(st, val) SKM_sk_find(PKCS7, (st), (val)) +# define sk_PKCS7_find_ex(st, val) SKM_sk_find_ex(PKCS7, (st), (val)) +# define sk_PKCS7_delete(st, i) SKM_sk_delete(PKCS7, (st), (i)) +# define sk_PKCS7_delete_ptr(st, ptr) SKM_sk_delete_ptr(PKCS7, (st), (ptr)) +# define sk_PKCS7_insert(st, val, i) SKM_sk_insert(PKCS7, (st), (val), (i)) +# define sk_PKCS7_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(PKCS7, (st), (cmp)) +# define sk_PKCS7_dup(st) SKM_sk_dup(PKCS7, st) +# define sk_PKCS7_pop_free(st, free_func) SKM_sk_pop_free(PKCS7, (st), (free_func)) +# define sk_PKCS7_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(PKCS7, (st), (copy_func), (free_func)) +# define sk_PKCS7_shift(st) SKM_sk_shift(PKCS7, (st)) +# define sk_PKCS7_pop(st) SKM_sk_pop(PKCS7, (st)) +# define sk_PKCS7_sort(st) SKM_sk_sort(PKCS7, (st)) +# define sk_PKCS7_is_sorted(st) SKM_sk_is_sorted(PKCS7, (st)) +# define sk_PKCS7_RECIP_INFO_new(cmp) SKM_sk_new(PKCS7_RECIP_INFO, (cmp)) +# define sk_PKCS7_RECIP_INFO_new_null() SKM_sk_new_null(PKCS7_RECIP_INFO) +# define sk_PKCS7_RECIP_INFO_free(st) SKM_sk_free(PKCS7_RECIP_INFO, (st)) +# define sk_PKCS7_RECIP_INFO_num(st) SKM_sk_num(PKCS7_RECIP_INFO, (st)) +# define sk_PKCS7_RECIP_INFO_value(st, i) SKM_sk_value(PKCS7_RECIP_INFO, (st), (i)) +# define sk_PKCS7_RECIP_INFO_set(st, i, val) SKM_sk_set(PKCS7_RECIP_INFO, (st), (i), (val)) +# define sk_PKCS7_RECIP_INFO_zero(st) SKM_sk_zero(PKCS7_RECIP_INFO, (st)) +# define sk_PKCS7_RECIP_INFO_push(st, val) SKM_sk_push(PKCS7_RECIP_INFO, (st), (val)) +# define sk_PKCS7_RECIP_INFO_unshift(st, val) SKM_sk_unshift(PKCS7_RECIP_INFO, (st), (val)) +# define sk_PKCS7_RECIP_INFO_find(st, val) SKM_sk_find(PKCS7_RECIP_INFO, (st), (val)) +# define sk_PKCS7_RECIP_INFO_find_ex(st, val) SKM_sk_find_ex(PKCS7_RECIP_INFO, (st), (val)) +# define sk_PKCS7_RECIP_INFO_delete(st, i) SKM_sk_delete(PKCS7_RECIP_INFO, (st), (i)) +# define sk_PKCS7_RECIP_INFO_delete_ptr(st, ptr) SKM_sk_delete_ptr(PKCS7_RECIP_INFO, (st), (ptr)) +# define sk_PKCS7_RECIP_INFO_insert(st, val, i) SKM_sk_insert(PKCS7_RECIP_INFO, (st), (val), (i)) +# define sk_PKCS7_RECIP_INFO_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(PKCS7_RECIP_INFO, (st), (cmp)) +# define sk_PKCS7_RECIP_INFO_dup(st) SKM_sk_dup(PKCS7_RECIP_INFO, st) +# define sk_PKCS7_RECIP_INFO_pop_free(st, free_func) SKM_sk_pop_free(PKCS7_RECIP_INFO, (st), (free_func)) +# define sk_PKCS7_RECIP_INFO_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(PKCS7_RECIP_INFO, (st), (copy_func), (free_func)) +# define sk_PKCS7_RECIP_INFO_shift(st) SKM_sk_shift(PKCS7_RECIP_INFO, (st)) +# define sk_PKCS7_RECIP_INFO_pop(st) SKM_sk_pop(PKCS7_RECIP_INFO, (st)) +# define sk_PKCS7_RECIP_INFO_sort(st) SKM_sk_sort(PKCS7_RECIP_INFO, (st)) +# define sk_PKCS7_RECIP_INFO_is_sorted(st) SKM_sk_is_sorted(PKCS7_RECIP_INFO, (st)) +# define sk_PKCS7_SIGNER_INFO_new(cmp) SKM_sk_new(PKCS7_SIGNER_INFO, (cmp)) +# define sk_PKCS7_SIGNER_INFO_new_null() SKM_sk_new_null(PKCS7_SIGNER_INFO) +# define sk_PKCS7_SIGNER_INFO_free(st) SKM_sk_free(PKCS7_SIGNER_INFO, (st)) +# define sk_PKCS7_SIGNER_INFO_num(st) SKM_sk_num(PKCS7_SIGNER_INFO, (st)) +# define sk_PKCS7_SIGNER_INFO_value(st, i) SKM_sk_value(PKCS7_SIGNER_INFO, (st), (i)) +# define sk_PKCS7_SIGNER_INFO_set(st, i, val) SKM_sk_set(PKCS7_SIGNER_INFO, (st), (i), (val)) +# define sk_PKCS7_SIGNER_INFO_zero(st) SKM_sk_zero(PKCS7_SIGNER_INFO, (st)) +# define sk_PKCS7_SIGNER_INFO_push(st, val) SKM_sk_push(PKCS7_SIGNER_INFO, (st), (val)) +# define sk_PKCS7_SIGNER_INFO_unshift(st, val) SKM_sk_unshift(PKCS7_SIGNER_INFO, (st), (val)) +# define sk_PKCS7_SIGNER_INFO_find(st, val) SKM_sk_find(PKCS7_SIGNER_INFO, (st), (val)) +# define sk_PKCS7_SIGNER_INFO_find_ex(st, val) SKM_sk_find_ex(PKCS7_SIGNER_INFO, (st), (val)) +# define sk_PKCS7_SIGNER_INFO_delete(st, i) SKM_sk_delete(PKCS7_SIGNER_INFO, (st), (i)) +# define sk_PKCS7_SIGNER_INFO_delete_ptr(st, ptr) SKM_sk_delete_ptr(PKCS7_SIGNER_INFO, (st), (ptr)) +# define sk_PKCS7_SIGNER_INFO_insert(st, val, i) SKM_sk_insert(PKCS7_SIGNER_INFO, (st), (val), (i)) +# define sk_PKCS7_SIGNER_INFO_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(PKCS7_SIGNER_INFO, (st), (cmp)) +# define sk_PKCS7_SIGNER_INFO_dup(st) SKM_sk_dup(PKCS7_SIGNER_INFO, st) +# define sk_PKCS7_SIGNER_INFO_pop_free(st, free_func) SKM_sk_pop_free(PKCS7_SIGNER_INFO, (st), (free_func)) +# define sk_PKCS7_SIGNER_INFO_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(PKCS7_SIGNER_INFO, (st), (copy_func), (free_func)) +# define sk_PKCS7_SIGNER_INFO_shift(st) SKM_sk_shift(PKCS7_SIGNER_INFO, (st)) +# define sk_PKCS7_SIGNER_INFO_pop(st) SKM_sk_pop(PKCS7_SIGNER_INFO, (st)) +# define sk_PKCS7_SIGNER_INFO_sort(st) SKM_sk_sort(PKCS7_SIGNER_INFO, (st)) +# define sk_PKCS7_SIGNER_INFO_is_sorted(st) SKM_sk_is_sorted(PKCS7_SIGNER_INFO, (st)) +# define sk_POLICYINFO_new(cmp) SKM_sk_new(POLICYINFO, (cmp)) +# define sk_POLICYINFO_new_null() SKM_sk_new_null(POLICYINFO) +# define sk_POLICYINFO_free(st) SKM_sk_free(POLICYINFO, (st)) +# define sk_POLICYINFO_num(st) SKM_sk_num(POLICYINFO, (st)) +# define sk_POLICYINFO_value(st, i) SKM_sk_value(POLICYINFO, (st), (i)) +# define sk_POLICYINFO_set(st, i, val) SKM_sk_set(POLICYINFO, (st), (i), (val)) +# define sk_POLICYINFO_zero(st) SKM_sk_zero(POLICYINFO, (st)) +# define sk_POLICYINFO_push(st, val) SKM_sk_push(POLICYINFO, (st), (val)) +# define sk_POLICYINFO_unshift(st, val) SKM_sk_unshift(POLICYINFO, (st), (val)) +# define sk_POLICYINFO_find(st, val) SKM_sk_find(POLICYINFO, (st), (val)) +# define sk_POLICYINFO_find_ex(st, val) SKM_sk_find_ex(POLICYINFO, (st), (val)) +# define sk_POLICYINFO_delete(st, i) SKM_sk_delete(POLICYINFO, (st), (i)) +# define sk_POLICYINFO_delete_ptr(st, ptr) SKM_sk_delete_ptr(POLICYINFO, (st), (ptr)) +# define sk_POLICYINFO_insert(st, val, i) SKM_sk_insert(POLICYINFO, (st), (val), (i)) +# define sk_POLICYINFO_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(POLICYINFO, (st), (cmp)) +# define sk_POLICYINFO_dup(st) SKM_sk_dup(POLICYINFO, st) +# define sk_POLICYINFO_pop_free(st, free_func) SKM_sk_pop_free(POLICYINFO, (st), (free_func)) +# define sk_POLICYINFO_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(POLICYINFO, (st), (copy_func), (free_func)) +# define sk_POLICYINFO_shift(st) SKM_sk_shift(POLICYINFO, (st)) +# define sk_POLICYINFO_pop(st) SKM_sk_pop(POLICYINFO, (st)) +# define sk_POLICYINFO_sort(st) SKM_sk_sort(POLICYINFO, (st)) +# define sk_POLICYINFO_is_sorted(st) SKM_sk_is_sorted(POLICYINFO, (st)) +# define sk_POLICYQUALINFO_new(cmp) SKM_sk_new(POLICYQUALINFO, (cmp)) +# define sk_POLICYQUALINFO_new_null() SKM_sk_new_null(POLICYQUALINFO) +# define sk_POLICYQUALINFO_free(st) SKM_sk_free(POLICYQUALINFO, (st)) +# define sk_POLICYQUALINFO_num(st) SKM_sk_num(POLICYQUALINFO, (st)) +# define sk_POLICYQUALINFO_value(st, i) SKM_sk_value(POLICYQUALINFO, (st), (i)) +# define sk_POLICYQUALINFO_set(st, i, val) SKM_sk_set(POLICYQUALINFO, (st), (i), (val)) +# define sk_POLICYQUALINFO_zero(st) SKM_sk_zero(POLICYQUALINFO, (st)) +# define sk_POLICYQUALINFO_push(st, val) SKM_sk_push(POLICYQUALINFO, (st), (val)) +# define sk_POLICYQUALINFO_unshift(st, val) SKM_sk_unshift(POLICYQUALINFO, (st), (val)) +# define sk_POLICYQUALINFO_find(st, val) SKM_sk_find(POLICYQUALINFO, (st), (val)) +# define sk_POLICYQUALINFO_find_ex(st, val) SKM_sk_find_ex(POLICYQUALINFO, (st), (val)) +# define sk_POLICYQUALINFO_delete(st, i) SKM_sk_delete(POLICYQUALINFO, (st), (i)) +# define sk_POLICYQUALINFO_delete_ptr(st, ptr) SKM_sk_delete_ptr(POLICYQUALINFO, (st), (ptr)) +# define sk_POLICYQUALINFO_insert(st, val, i) SKM_sk_insert(POLICYQUALINFO, (st), (val), (i)) +# define sk_POLICYQUALINFO_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(POLICYQUALINFO, (st), (cmp)) +# define sk_POLICYQUALINFO_dup(st) SKM_sk_dup(POLICYQUALINFO, st) +# define sk_POLICYQUALINFO_pop_free(st, free_func) SKM_sk_pop_free(POLICYQUALINFO, (st), (free_func)) +# define sk_POLICYQUALINFO_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(POLICYQUALINFO, (st), (copy_func), (free_func)) +# define sk_POLICYQUALINFO_shift(st) SKM_sk_shift(POLICYQUALINFO, (st)) +# define sk_POLICYQUALINFO_pop(st) SKM_sk_pop(POLICYQUALINFO, (st)) +# define sk_POLICYQUALINFO_sort(st) SKM_sk_sort(POLICYQUALINFO, (st)) +# define sk_POLICYQUALINFO_is_sorted(st) SKM_sk_is_sorted(POLICYQUALINFO, (st)) +# define sk_POLICY_MAPPING_new(cmp) SKM_sk_new(POLICY_MAPPING, (cmp)) +# define sk_POLICY_MAPPING_new_null() SKM_sk_new_null(POLICY_MAPPING) +# define sk_POLICY_MAPPING_free(st) SKM_sk_free(POLICY_MAPPING, (st)) +# define sk_POLICY_MAPPING_num(st) SKM_sk_num(POLICY_MAPPING, (st)) +# define sk_POLICY_MAPPING_value(st, i) SKM_sk_value(POLICY_MAPPING, (st), (i)) +# define sk_POLICY_MAPPING_set(st, i, val) SKM_sk_set(POLICY_MAPPING, (st), (i), (val)) +# define sk_POLICY_MAPPING_zero(st) SKM_sk_zero(POLICY_MAPPING, (st)) +# define sk_POLICY_MAPPING_push(st, val) SKM_sk_push(POLICY_MAPPING, (st), (val)) +# define sk_POLICY_MAPPING_unshift(st, val) SKM_sk_unshift(POLICY_MAPPING, (st), (val)) +# define sk_POLICY_MAPPING_find(st, val) SKM_sk_find(POLICY_MAPPING, (st), (val)) +# define sk_POLICY_MAPPING_find_ex(st, val) SKM_sk_find_ex(POLICY_MAPPING, (st), (val)) +# define sk_POLICY_MAPPING_delete(st, i) SKM_sk_delete(POLICY_MAPPING, (st), (i)) +# define sk_POLICY_MAPPING_delete_ptr(st, ptr) SKM_sk_delete_ptr(POLICY_MAPPING, (st), (ptr)) +# define sk_POLICY_MAPPING_insert(st, val, i) SKM_sk_insert(POLICY_MAPPING, (st), (val), (i)) +# define sk_POLICY_MAPPING_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(POLICY_MAPPING, (st), (cmp)) +# define sk_POLICY_MAPPING_dup(st) SKM_sk_dup(POLICY_MAPPING, st) +# define sk_POLICY_MAPPING_pop_free(st, free_func) SKM_sk_pop_free(POLICY_MAPPING, (st), (free_func)) +# define sk_POLICY_MAPPING_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(POLICY_MAPPING, (st), (copy_func), (free_func)) +# define sk_POLICY_MAPPING_shift(st) SKM_sk_shift(POLICY_MAPPING, (st)) +# define sk_POLICY_MAPPING_pop(st) SKM_sk_pop(POLICY_MAPPING, (st)) +# define sk_POLICY_MAPPING_sort(st) SKM_sk_sort(POLICY_MAPPING, (st)) +# define sk_POLICY_MAPPING_is_sorted(st) SKM_sk_is_sorted(POLICY_MAPPING, (st)) +# define sk_SCT_new(cmp) SKM_sk_new(SCT, (cmp)) +# define sk_SCT_new_null() SKM_sk_new_null(SCT) +# define sk_SCT_free(st) SKM_sk_free(SCT, (st)) +# define sk_SCT_num(st) SKM_sk_num(SCT, (st)) +# define sk_SCT_value(st, i) SKM_sk_value(SCT, (st), (i)) +# define sk_SCT_set(st, i, val) SKM_sk_set(SCT, (st), (i), (val)) +# define sk_SCT_zero(st) SKM_sk_zero(SCT, (st)) +# define sk_SCT_push(st, val) SKM_sk_push(SCT, (st), (val)) +# define sk_SCT_unshift(st, val) SKM_sk_unshift(SCT, (st), (val)) +# define sk_SCT_find(st, val) SKM_sk_find(SCT, (st), (val)) +# define sk_SCT_find_ex(st, val) SKM_sk_find_ex(SCT, (st), (val)) +# define sk_SCT_delete(st, i) SKM_sk_delete(SCT, (st), (i)) +# define sk_SCT_delete_ptr(st, ptr) SKM_sk_delete_ptr(SCT, (st), (ptr)) +# define sk_SCT_insert(st, val, i) SKM_sk_insert(SCT, (st), (val), (i)) +# define sk_SCT_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(SCT, (st), (cmp)) +# define sk_SCT_dup(st) SKM_sk_dup(SCT, st) +# define sk_SCT_pop_free(st, free_func) SKM_sk_pop_free(SCT, (st), (free_func)) +# define sk_SCT_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(SCT, (st), (copy_func), (free_func)) +# define sk_SCT_shift(st) SKM_sk_shift(SCT, (st)) +# define sk_SCT_pop(st) SKM_sk_pop(SCT, (st)) +# define sk_SCT_sort(st) SKM_sk_sort(SCT, (st)) +# define sk_SCT_is_sorted(st) SKM_sk_is_sorted(SCT, (st)) +# define sk_SRP_gN_new(cmp) SKM_sk_new(SRP_gN, (cmp)) +# define sk_SRP_gN_new_null() SKM_sk_new_null(SRP_gN) +# define sk_SRP_gN_free(st) SKM_sk_free(SRP_gN, (st)) +# define sk_SRP_gN_num(st) SKM_sk_num(SRP_gN, (st)) +# define sk_SRP_gN_value(st, i) SKM_sk_value(SRP_gN, (st), (i)) +# define sk_SRP_gN_set(st, i, val) SKM_sk_set(SRP_gN, (st), (i), (val)) +# define sk_SRP_gN_zero(st) SKM_sk_zero(SRP_gN, (st)) +# define sk_SRP_gN_push(st, val) SKM_sk_push(SRP_gN, (st), (val)) +# define sk_SRP_gN_unshift(st, val) SKM_sk_unshift(SRP_gN, (st), (val)) +# define sk_SRP_gN_find(st, val) SKM_sk_find(SRP_gN, (st), (val)) +# define sk_SRP_gN_find_ex(st, val) SKM_sk_find_ex(SRP_gN, (st), (val)) +# define sk_SRP_gN_delete(st, i) SKM_sk_delete(SRP_gN, (st), (i)) +# define sk_SRP_gN_delete_ptr(st, ptr) SKM_sk_delete_ptr(SRP_gN, (st), (ptr)) +# define sk_SRP_gN_insert(st, val, i) SKM_sk_insert(SRP_gN, (st), (val), (i)) +# define sk_SRP_gN_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(SRP_gN, (st), (cmp)) +# define sk_SRP_gN_dup(st) SKM_sk_dup(SRP_gN, st) +# define sk_SRP_gN_pop_free(st, free_func) SKM_sk_pop_free(SRP_gN, (st), (free_func)) +# define sk_SRP_gN_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(SRP_gN, (st), (copy_func), (free_func)) +# define sk_SRP_gN_shift(st) SKM_sk_shift(SRP_gN, (st)) +# define sk_SRP_gN_pop(st) SKM_sk_pop(SRP_gN, (st)) +# define sk_SRP_gN_sort(st) SKM_sk_sort(SRP_gN, (st)) +# define sk_SRP_gN_is_sorted(st) SKM_sk_is_sorted(SRP_gN, (st)) +# define sk_SRP_gN_cache_new(cmp) SKM_sk_new(SRP_gN_cache, (cmp)) +# define sk_SRP_gN_cache_new_null() SKM_sk_new_null(SRP_gN_cache) +# define sk_SRP_gN_cache_free(st) SKM_sk_free(SRP_gN_cache, (st)) +# define sk_SRP_gN_cache_num(st) SKM_sk_num(SRP_gN_cache, (st)) +# define sk_SRP_gN_cache_value(st, i) SKM_sk_value(SRP_gN_cache, (st), (i)) +# define sk_SRP_gN_cache_set(st, i, val) SKM_sk_set(SRP_gN_cache, (st), (i), (val)) +# define sk_SRP_gN_cache_zero(st) SKM_sk_zero(SRP_gN_cache, (st)) +# define sk_SRP_gN_cache_push(st, val) SKM_sk_push(SRP_gN_cache, (st), (val)) +# define sk_SRP_gN_cache_unshift(st, val) SKM_sk_unshift(SRP_gN_cache, (st), (val)) +# define sk_SRP_gN_cache_find(st, val) SKM_sk_find(SRP_gN_cache, (st), (val)) +# define sk_SRP_gN_cache_find_ex(st, val) SKM_sk_find_ex(SRP_gN_cache, (st), (val)) +# define sk_SRP_gN_cache_delete(st, i) SKM_sk_delete(SRP_gN_cache, (st), (i)) +# define sk_SRP_gN_cache_delete_ptr(st, ptr) SKM_sk_delete_ptr(SRP_gN_cache, (st), (ptr)) +# define sk_SRP_gN_cache_insert(st, val, i) SKM_sk_insert(SRP_gN_cache, (st), (val), (i)) +# define sk_SRP_gN_cache_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(SRP_gN_cache, (st), (cmp)) +# define sk_SRP_gN_cache_dup(st) SKM_sk_dup(SRP_gN_cache, st) +# define sk_SRP_gN_cache_pop_free(st, free_func) SKM_sk_pop_free(SRP_gN_cache, (st), (free_func)) +# define sk_SRP_gN_cache_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(SRP_gN_cache, (st), (copy_func), (free_func)) +# define sk_SRP_gN_cache_shift(st) SKM_sk_shift(SRP_gN_cache, (st)) +# define sk_SRP_gN_cache_pop(st) SKM_sk_pop(SRP_gN_cache, (st)) +# define sk_SRP_gN_cache_sort(st) SKM_sk_sort(SRP_gN_cache, (st)) +# define sk_SRP_gN_cache_is_sorted(st) SKM_sk_is_sorted(SRP_gN_cache, (st)) +# define sk_SRP_user_pwd_new(cmp) SKM_sk_new(SRP_user_pwd, (cmp)) +# define sk_SRP_user_pwd_new_null() SKM_sk_new_null(SRP_user_pwd) +# define sk_SRP_user_pwd_free(st) SKM_sk_free(SRP_user_pwd, (st)) +# define sk_SRP_user_pwd_num(st) SKM_sk_num(SRP_user_pwd, (st)) +# define sk_SRP_user_pwd_value(st, i) SKM_sk_value(SRP_user_pwd, (st), (i)) +# define sk_SRP_user_pwd_set(st, i, val) SKM_sk_set(SRP_user_pwd, (st), (i), (val)) +# define sk_SRP_user_pwd_zero(st) SKM_sk_zero(SRP_user_pwd, (st)) +# define sk_SRP_user_pwd_push(st, val) SKM_sk_push(SRP_user_pwd, (st), (val)) +# define sk_SRP_user_pwd_unshift(st, val) SKM_sk_unshift(SRP_user_pwd, (st), (val)) +# define sk_SRP_user_pwd_find(st, val) SKM_sk_find(SRP_user_pwd, (st), (val)) +# define sk_SRP_user_pwd_find_ex(st, val) SKM_sk_find_ex(SRP_user_pwd, (st), (val)) +# define sk_SRP_user_pwd_delete(st, i) SKM_sk_delete(SRP_user_pwd, (st), (i)) +# define sk_SRP_user_pwd_delete_ptr(st, ptr) SKM_sk_delete_ptr(SRP_user_pwd, (st), (ptr)) +# define sk_SRP_user_pwd_insert(st, val, i) SKM_sk_insert(SRP_user_pwd, (st), (val), (i)) +# define sk_SRP_user_pwd_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(SRP_user_pwd, (st), (cmp)) +# define sk_SRP_user_pwd_dup(st) SKM_sk_dup(SRP_user_pwd, st) +# define sk_SRP_user_pwd_pop_free(st, free_func) SKM_sk_pop_free(SRP_user_pwd, (st), (free_func)) +# define sk_SRP_user_pwd_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(SRP_user_pwd, (st), (copy_func), (free_func)) +# define sk_SRP_user_pwd_shift(st) SKM_sk_shift(SRP_user_pwd, (st)) +# define sk_SRP_user_pwd_pop(st) SKM_sk_pop(SRP_user_pwd, (st)) +# define sk_SRP_user_pwd_sort(st) SKM_sk_sort(SRP_user_pwd, (st)) +# define sk_SRP_user_pwd_is_sorted(st) SKM_sk_is_sorted(SRP_user_pwd, (st)) +# define sk_SRTP_PROTECTION_PROFILE_new(cmp) SKM_sk_new(SRTP_PROTECTION_PROFILE, (cmp)) +# define sk_SRTP_PROTECTION_PROFILE_new_null() SKM_sk_new_null(SRTP_PROTECTION_PROFILE) +# define sk_SRTP_PROTECTION_PROFILE_free(st) SKM_sk_free(SRTP_PROTECTION_PROFILE, (st)) +# define sk_SRTP_PROTECTION_PROFILE_num(st) SKM_sk_num(SRTP_PROTECTION_PROFILE, (st)) +# define sk_SRTP_PROTECTION_PROFILE_value(st, i) SKM_sk_value(SRTP_PROTECTION_PROFILE, (st), (i)) +# define sk_SRTP_PROTECTION_PROFILE_set(st, i, val) SKM_sk_set(SRTP_PROTECTION_PROFILE, (st), (i), (val)) +# define sk_SRTP_PROTECTION_PROFILE_zero(st) SKM_sk_zero(SRTP_PROTECTION_PROFILE, (st)) +# define sk_SRTP_PROTECTION_PROFILE_push(st, val) SKM_sk_push(SRTP_PROTECTION_PROFILE, (st), (val)) +# define sk_SRTP_PROTECTION_PROFILE_unshift(st, val) SKM_sk_unshift(SRTP_PROTECTION_PROFILE, (st), (val)) +# define sk_SRTP_PROTECTION_PROFILE_find(st, val) SKM_sk_find(SRTP_PROTECTION_PROFILE, (st), (val)) +# define sk_SRTP_PROTECTION_PROFILE_find_ex(st, val) SKM_sk_find_ex(SRTP_PROTECTION_PROFILE, (st), (val)) +# define sk_SRTP_PROTECTION_PROFILE_delete(st, i) SKM_sk_delete(SRTP_PROTECTION_PROFILE, (st), (i)) +# define sk_SRTP_PROTECTION_PROFILE_delete_ptr(st, ptr) SKM_sk_delete_ptr(SRTP_PROTECTION_PROFILE, (st), (ptr)) +# define sk_SRTP_PROTECTION_PROFILE_insert(st, val, i) SKM_sk_insert(SRTP_PROTECTION_PROFILE, (st), (val), (i)) +# define sk_SRTP_PROTECTION_PROFILE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(SRTP_PROTECTION_PROFILE, (st), (cmp)) +# define sk_SRTP_PROTECTION_PROFILE_dup(st) SKM_sk_dup(SRTP_PROTECTION_PROFILE, st) +# define sk_SRTP_PROTECTION_PROFILE_pop_free(st, free_func) SKM_sk_pop_free(SRTP_PROTECTION_PROFILE, (st), (free_func)) +# define sk_SRTP_PROTECTION_PROFILE_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(SRTP_PROTECTION_PROFILE, (st), (copy_func), (free_func)) +# define sk_SRTP_PROTECTION_PROFILE_shift(st) SKM_sk_shift(SRTP_PROTECTION_PROFILE, (st)) +# define sk_SRTP_PROTECTION_PROFILE_pop(st) SKM_sk_pop(SRTP_PROTECTION_PROFILE, (st)) +# define sk_SRTP_PROTECTION_PROFILE_sort(st) SKM_sk_sort(SRTP_PROTECTION_PROFILE, (st)) +# define sk_SRTP_PROTECTION_PROFILE_is_sorted(st) SKM_sk_is_sorted(SRTP_PROTECTION_PROFILE, (st)) +# define sk_SSL_CIPHER_new(cmp) SKM_sk_new(SSL_CIPHER, (cmp)) +# define sk_SSL_CIPHER_new_null() SKM_sk_new_null(SSL_CIPHER) +# define sk_SSL_CIPHER_free(st) SKM_sk_free(SSL_CIPHER, (st)) +# define sk_SSL_CIPHER_num(st) SKM_sk_num(SSL_CIPHER, (st)) +# define sk_SSL_CIPHER_value(st, i) SKM_sk_value(SSL_CIPHER, (st), (i)) +# define sk_SSL_CIPHER_set(st, i, val) SKM_sk_set(SSL_CIPHER, (st), (i), (val)) +# define sk_SSL_CIPHER_zero(st) SKM_sk_zero(SSL_CIPHER, (st)) +# define sk_SSL_CIPHER_push(st, val) SKM_sk_push(SSL_CIPHER, (st), (val)) +# define sk_SSL_CIPHER_unshift(st, val) SKM_sk_unshift(SSL_CIPHER, (st), (val)) +# define sk_SSL_CIPHER_find(st, val) SKM_sk_find(SSL_CIPHER, (st), (val)) +# define sk_SSL_CIPHER_find_ex(st, val) SKM_sk_find_ex(SSL_CIPHER, (st), (val)) +# define sk_SSL_CIPHER_delete(st, i) SKM_sk_delete(SSL_CIPHER, (st), (i)) +# define sk_SSL_CIPHER_delete_ptr(st, ptr) SKM_sk_delete_ptr(SSL_CIPHER, (st), (ptr)) +# define sk_SSL_CIPHER_insert(st, val, i) SKM_sk_insert(SSL_CIPHER, (st), (val), (i)) +# define sk_SSL_CIPHER_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(SSL_CIPHER, (st), (cmp)) +# define sk_SSL_CIPHER_dup(st) SKM_sk_dup(SSL_CIPHER, st) +# define sk_SSL_CIPHER_pop_free(st, free_func) SKM_sk_pop_free(SSL_CIPHER, (st), (free_func)) +# define sk_SSL_CIPHER_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(SSL_CIPHER, (st), (copy_func), (free_func)) +# define sk_SSL_CIPHER_shift(st) SKM_sk_shift(SSL_CIPHER, (st)) +# define sk_SSL_CIPHER_pop(st) SKM_sk_pop(SSL_CIPHER, (st)) +# define sk_SSL_CIPHER_sort(st) SKM_sk_sort(SSL_CIPHER, (st)) +# define sk_SSL_CIPHER_is_sorted(st) SKM_sk_is_sorted(SSL_CIPHER, (st)) +# define sk_SSL_COMP_new(cmp) SKM_sk_new(SSL_COMP, (cmp)) +# define sk_SSL_COMP_new_null() SKM_sk_new_null(SSL_COMP) +# define sk_SSL_COMP_free(st) SKM_sk_free(SSL_COMP, (st)) +# define sk_SSL_COMP_num(st) SKM_sk_num(SSL_COMP, (st)) +# define sk_SSL_COMP_value(st, i) SKM_sk_value(SSL_COMP, (st), (i)) +# define sk_SSL_COMP_set(st, i, val) SKM_sk_set(SSL_COMP, (st), (i), (val)) +# define sk_SSL_COMP_zero(st) SKM_sk_zero(SSL_COMP, (st)) +# define sk_SSL_COMP_push(st, val) SKM_sk_push(SSL_COMP, (st), (val)) +# define sk_SSL_COMP_unshift(st, val) SKM_sk_unshift(SSL_COMP, (st), (val)) +# define sk_SSL_COMP_find(st, val) SKM_sk_find(SSL_COMP, (st), (val)) +# define sk_SSL_COMP_find_ex(st, val) SKM_sk_find_ex(SSL_COMP, (st), (val)) +# define sk_SSL_COMP_delete(st, i) SKM_sk_delete(SSL_COMP, (st), (i)) +# define sk_SSL_COMP_delete_ptr(st, ptr) SKM_sk_delete_ptr(SSL_COMP, (st), (ptr)) +# define sk_SSL_COMP_insert(st, val, i) SKM_sk_insert(SSL_COMP, (st), (val), (i)) +# define sk_SSL_COMP_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(SSL_COMP, (st), (cmp)) +# define sk_SSL_COMP_dup(st) SKM_sk_dup(SSL_COMP, st) +# define sk_SSL_COMP_pop_free(st, free_func) SKM_sk_pop_free(SSL_COMP, (st), (free_func)) +# define sk_SSL_COMP_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(SSL_COMP, (st), (copy_func), (free_func)) +# define sk_SSL_COMP_shift(st) SKM_sk_shift(SSL_COMP, (st)) +# define sk_SSL_COMP_pop(st) SKM_sk_pop(SSL_COMP, (st)) +# define sk_SSL_COMP_sort(st) SKM_sk_sort(SSL_COMP, (st)) +# define sk_SSL_COMP_is_sorted(st) SKM_sk_is_sorted(SSL_COMP, (st)) +# define sk_STACK_OF_X509_NAME_ENTRY_new(cmp) SKM_sk_new(STACK_OF_X509_NAME_ENTRY, (cmp)) +# define sk_STACK_OF_X509_NAME_ENTRY_new_null() SKM_sk_new_null(STACK_OF_X509_NAME_ENTRY) +# define sk_STACK_OF_X509_NAME_ENTRY_free(st) SKM_sk_free(STACK_OF_X509_NAME_ENTRY, (st)) +# define sk_STACK_OF_X509_NAME_ENTRY_num(st) SKM_sk_num(STACK_OF_X509_NAME_ENTRY, (st)) +# define sk_STACK_OF_X509_NAME_ENTRY_value(st, i) SKM_sk_value(STACK_OF_X509_NAME_ENTRY, (st), (i)) +# define sk_STACK_OF_X509_NAME_ENTRY_set(st, i, val) SKM_sk_set(STACK_OF_X509_NAME_ENTRY, (st), (i), (val)) +# define sk_STACK_OF_X509_NAME_ENTRY_zero(st) SKM_sk_zero(STACK_OF_X509_NAME_ENTRY, (st)) +# define sk_STACK_OF_X509_NAME_ENTRY_push(st, val) SKM_sk_push(STACK_OF_X509_NAME_ENTRY, (st), (val)) +# define sk_STACK_OF_X509_NAME_ENTRY_unshift(st, val) SKM_sk_unshift(STACK_OF_X509_NAME_ENTRY, (st), (val)) +# define sk_STACK_OF_X509_NAME_ENTRY_find(st, val) SKM_sk_find(STACK_OF_X509_NAME_ENTRY, (st), (val)) +# define sk_STACK_OF_X509_NAME_ENTRY_find_ex(st, val) SKM_sk_find_ex(STACK_OF_X509_NAME_ENTRY, (st), (val)) +# define sk_STACK_OF_X509_NAME_ENTRY_delete(st, i) SKM_sk_delete(STACK_OF_X509_NAME_ENTRY, (st), (i)) +# define sk_STACK_OF_X509_NAME_ENTRY_delete_ptr(st, ptr) SKM_sk_delete_ptr(STACK_OF_X509_NAME_ENTRY, (st), (ptr)) +# define sk_STACK_OF_X509_NAME_ENTRY_insert(st, val, i) SKM_sk_insert(STACK_OF_X509_NAME_ENTRY, (st), (val), (i)) +# define sk_STACK_OF_X509_NAME_ENTRY_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(STACK_OF_X509_NAME_ENTRY, (st), (cmp)) +# define sk_STACK_OF_X509_NAME_ENTRY_dup(st) SKM_sk_dup(STACK_OF_X509_NAME_ENTRY, st) +# define sk_STACK_OF_X509_NAME_ENTRY_pop_free(st, free_func) SKM_sk_pop_free(STACK_OF_X509_NAME_ENTRY, (st), (free_func)) +# define sk_STACK_OF_X509_NAME_ENTRY_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(STACK_OF_X509_NAME_ENTRY, (st), (copy_func), (free_func)) +# define sk_STACK_OF_X509_NAME_ENTRY_shift(st) SKM_sk_shift(STACK_OF_X509_NAME_ENTRY, (st)) +# define sk_STACK_OF_X509_NAME_ENTRY_pop(st) SKM_sk_pop(STACK_OF_X509_NAME_ENTRY, (st)) +# define sk_STACK_OF_X509_NAME_ENTRY_sort(st) SKM_sk_sort(STACK_OF_X509_NAME_ENTRY, (st)) +# define sk_STACK_OF_X509_NAME_ENTRY_is_sorted(st) SKM_sk_is_sorted(STACK_OF_X509_NAME_ENTRY, (st)) +# define sk_STORE_ATTR_INFO_new(cmp) SKM_sk_new(STORE_ATTR_INFO, (cmp)) +# define sk_STORE_ATTR_INFO_new_null() SKM_sk_new_null(STORE_ATTR_INFO) +# define sk_STORE_ATTR_INFO_free(st) SKM_sk_free(STORE_ATTR_INFO, (st)) +# define sk_STORE_ATTR_INFO_num(st) SKM_sk_num(STORE_ATTR_INFO, (st)) +# define sk_STORE_ATTR_INFO_value(st, i) SKM_sk_value(STORE_ATTR_INFO, (st), (i)) +# define sk_STORE_ATTR_INFO_set(st, i, val) SKM_sk_set(STORE_ATTR_INFO, (st), (i), (val)) +# define sk_STORE_ATTR_INFO_zero(st) SKM_sk_zero(STORE_ATTR_INFO, (st)) +# define sk_STORE_ATTR_INFO_push(st, val) SKM_sk_push(STORE_ATTR_INFO, (st), (val)) +# define sk_STORE_ATTR_INFO_unshift(st, val) SKM_sk_unshift(STORE_ATTR_INFO, (st), (val)) +# define sk_STORE_ATTR_INFO_find(st, val) SKM_sk_find(STORE_ATTR_INFO, (st), (val)) +# define sk_STORE_ATTR_INFO_find_ex(st, val) SKM_sk_find_ex(STORE_ATTR_INFO, (st), (val)) +# define sk_STORE_ATTR_INFO_delete(st, i) SKM_sk_delete(STORE_ATTR_INFO, (st), (i)) +# define sk_STORE_ATTR_INFO_delete_ptr(st, ptr) SKM_sk_delete_ptr(STORE_ATTR_INFO, (st), (ptr)) +# define sk_STORE_ATTR_INFO_insert(st, val, i) SKM_sk_insert(STORE_ATTR_INFO, (st), (val), (i)) +# define sk_STORE_ATTR_INFO_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(STORE_ATTR_INFO, (st), (cmp)) +# define sk_STORE_ATTR_INFO_dup(st) SKM_sk_dup(STORE_ATTR_INFO, st) +# define sk_STORE_ATTR_INFO_pop_free(st, free_func) SKM_sk_pop_free(STORE_ATTR_INFO, (st), (free_func)) +# define sk_STORE_ATTR_INFO_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(STORE_ATTR_INFO, (st), (copy_func), (free_func)) +# define sk_STORE_ATTR_INFO_shift(st) SKM_sk_shift(STORE_ATTR_INFO, (st)) +# define sk_STORE_ATTR_INFO_pop(st) SKM_sk_pop(STORE_ATTR_INFO, (st)) +# define sk_STORE_ATTR_INFO_sort(st) SKM_sk_sort(STORE_ATTR_INFO, (st)) +# define sk_STORE_ATTR_INFO_is_sorted(st) SKM_sk_is_sorted(STORE_ATTR_INFO, (st)) +# define sk_STORE_OBJECT_new(cmp) SKM_sk_new(STORE_OBJECT, (cmp)) +# define sk_STORE_OBJECT_new_null() SKM_sk_new_null(STORE_OBJECT) +# define sk_STORE_OBJECT_free(st) SKM_sk_free(STORE_OBJECT, (st)) +# define sk_STORE_OBJECT_num(st) SKM_sk_num(STORE_OBJECT, (st)) +# define sk_STORE_OBJECT_value(st, i) SKM_sk_value(STORE_OBJECT, (st), (i)) +# define sk_STORE_OBJECT_set(st, i, val) SKM_sk_set(STORE_OBJECT, (st), (i), (val)) +# define sk_STORE_OBJECT_zero(st) SKM_sk_zero(STORE_OBJECT, (st)) +# define sk_STORE_OBJECT_push(st, val) SKM_sk_push(STORE_OBJECT, (st), (val)) +# define sk_STORE_OBJECT_unshift(st, val) SKM_sk_unshift(STORE_OBJECT, (st), (val)) +# define sk_STORE_OBJECT_find(st, val) SKM_sk_find(STORE_OBJECT, (st), (val)) +# define sk_STORE_OBJECT_find_ex(st, val) SKM_sk_find_ex(STORE_OBJECT, (st), (val)) +# define sk_STORE_OBJECT_delete(st, i) SKM_sk_delete(STORE_OBJECT, (st), (i)) +# define sk_STORE_OBJECT_delete_ptr(st, ptr) SKM_sk_delete_ptr(STORE_OBJECT, (st), (ptr)) +# define sk_STORE_OBJECT_insert(st, val, i) SKM_sk_insert(STORE_OBJECT, (st), (val), (i)) +# define sk_STORE_OBJECT_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(STORE_OBJECT, (st), (cmp)) +# define sk_STORE_OBJECT_dup(st) SKM_sk_dup(STORE_OBJECT, st) +# define sk_STORE_OBJECT_pop_free(st, free_func) SKM_sk_pop_free(STORE_OBJECT, (st), (free_func)) +# define sk_STORE_OBJECT_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(STORE_OBJECT, (st), (copy_func), (free_func)) +# define sk_STORE_OBJECT_shift(st) SKM_sk_shift(STORE_OBJECT, (st)) +# define sk_STORE_OBJECT_pop(st) SKM_sk_pop(STORE_OBJECT, (st)) +# define sk_STORE_OBJECT_sort(st) SKM_sk_sort(STORE_OBJECT, (st)) +# define sk_STORE_OBJECT_is_sorted(st) SKM_sk_is_sorted(STORE_OBJECT, (st)) +# define sk_SXNETID_new(cmp) SKM_sk_new(SXNETID, (cmp)) +# define sk_SXNETID_new_null() SKM_sk_new_null(SXNETID) +# define sk_SXNETID_free(st) SKM_sk_free(SXNETID, (st)) +# define sk_SXNETID_num(st) SKM_sk_num(SXNETID, (st)) +# define sk_SXNETID_value(st, i) SKM_sk_value(SXNETID, (st), (i)) +# define sk_SXNETID_set(st, i, val) SKM_sk_set(SXNETID, (st), (i), (val)) +# define sk_SXNETID_zero(st) SKM_sk_zero(SXNETID, (st)) +# define sk_SXNETID_push(st, val) SKM_sk_push(SXNETID, (st), (val)) +# define sk_SXNETID_unshift(st, val) SKM_sk_unshift(SXNETID, (st), (val)) +# define sk_SXNETID_find(st, val) SKM_sk_find(SXNETID, (st), (val)) +# define sk_SXNETID_find_ex(st, val) SKM_sk_find_ex(SXNETID, (st), (val)) +# define sk_SXNETID_delete(st, i) SKM_sk_delete(SXNETID, (st), (i)) +# define sk_SXNETID_delete_ptr(st, ptr) SKM_sk_delete_ptr(SXNETID, (st), (ptr)) +# define sk_SXNETID_insert(st, val, i) SKM_sk_insert(SXNETID, (st), (val), (i)) +# define sk_SXNETID_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(SXNETID, (st), (cmp)) +# define sk_SXNETID_dup(st) SKM_sk_dup(SXNETID, st) +# define sk_SXNETID_pop_free(st, free_func) SKM_sk_pop_free(SXNETID, (st), (free_func)) +# define sk_SXNETID_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(SXNETID, (st), (copy_func), (free_func)) +# define sk_SXNETID_shift(st) SKM_sk_shift(SXNETID, (st)) +# define sk_SXNETID_pop(st) SKM_sk_pop(SXNETID, (st)) +# define sk_SXNETID_sort(st) SKM_sk_sort(SXNETID, (st)) +# define sk_SXNETID_is_sorted(st) SKM_sk_is_sorted(SXNETID, (st)) +# define sk_UI_STRING_new(cmp) SKM_sk_new(UI_STRING, (cmp)) +# define sk_UI_STRING_new_null() SKM_sk_new_null(UI_STRING) +# define sk_UI_STRING_free(st) SKM_sk_free(UI_STRING, (st)) +# define sk_UI_STRING_num(st) SKM_sk_num(UI_STRING, (st)) +# define sk_UI_STRING_value(st, i) SKM_sk_value(UI_STRING, (st), (i)) +# define sk_UI_STRING_set(st, i, val) SKM_sk_set(UI_STRING, (st), (i), (val)) +# define sk_UI_STRING_zero(st) SKM_sk_zero(UI_STRING, (st)) +# define sk_UI_STRING_push(st, val) SKM_sk_push(UI_STRING, (st), (val)) +# define sk_UI_STRING_unshift(st, val) SKM_sk_unshift(UI_STRING, (st), (val)) +# define sk_UI_STRING_find(st, val) SKM_sk_find(UI_STRING, (st), (val)) +# define sk_UI_STRING_find_ex(st, val) SKM_sk_find_ex(UI_STRING, (st), (val)) +# define sk_UI_STRING_delete(st, i) SKM_sk_delete(UI_STRING, (st), (i)) +# define sk_UI_STRING_delete_ptr(st, ptr) SKM_sk_delete_ptr(UI_STRING, (st), (ptr)) +# define sk_UI_STRING_insert(st, val, i) SKM_sk_insert(UI_STRING, (st), (val), (i)) +# define sk_UI_STRING_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(UI_STRING, (st), (cmp)) +# define sk_UI_STRING_dup(st) SKM_sk_dup(UI_STRING, st) +# define sk_UI_STRING_pop_free(st, free_func) SKM_sk_pop_free(UI_STRING, (st), (free_func)) +# define sk_UI_STRING_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(UI_STRING, (st), (copy_func), (free_func)) +# define sk_UI_STRING_shift(st) SKM_sk_shift(UI_STRING, (st)) +# define sk_UI_STRING_pop(st) SKM_sk_pop(UI_STRING, (st)) +# define sk_UI_STRING_sort(st) SKM_sk_sort(UI_STRING, (st)) +# define sk_UI_STRING_is_sorted(st) SKM_sk_is_sorted(UI_STRING, (st)) +# define sk_X509_new(cmp) SKM_sk_new(X509, (cmp)) +# define sk_X509_new_null() SKM_sk_new_null(X509) +# define sk_X509_free(st) SKM_sk_free(X509, (st)) +# define sk_X509_num(st) SKM_sk_num(X509, (st)) +# define sk_X509_value(st, i) SKM_sk_value(X509, (st), (i)) +# define sk_X509_set(st, i, val) SKM_sk_set(X509, (st), (i), (val)) +# define sk_X509_zero(st) SKM_sk_zero(X509, (st)) +# define sk_X509_push(st, val) SKM_sk_push(X509, (st), (val)) +# define sk_X509_unshift(st, val) SKM_sk_unshift(X509, (st), (val)) +# define sk_X509_find(st, val) SKM_sk_find(X509, (st), (val)) +# define sk_X509_find_ex(st, val) SKM_sk_find_ex(X509, (st), (val)) +# define sk_X509_delete(st, i) SKM_sk_delete(X509, (st), (i)) +# define sk_X509_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509, (st), (ptr)) +# define sk_X509_insert(st, val, i) SKM_sk_insert(X509, (st), (val), (i)) +# define sk_X509_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509, (st), (cmp)) +# define sk_X509_dup(st) SKM_sk_dup(X509, st) +# define sk_X509_pop_free(st, free_func) SKM_sk_pop_free(X509, (st), (free_func)) +# define sk_X509_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509, (st), (copy_func), (free_func)) +# define sk_X509_shift(st) SKM_sk_shift(X509, (st)) +# define sk_X509_pop(st) SKM_sk_pop(X509, (st)) +# define sk_X509_sort(st) SKM_sk_sort(X509, (st)) +# define sk_X509_is_sorted(st) SKM_sk_is_sorted(X509, (st)) +# define sk_X509V3_EXT_METHOD_new(cmp) SKM_sk_new(X509V3_EXT_METHOD, (cmp)) +# define sk_X509V3_EXT_METHOD_new_null() SKM_sk_new_null(X509V3_EXT_METHOD) +# define sk_X509V3_EXT_METHOD_free(st) SKM_sk_free(X509V3_EXT_METHOD, (st)) +# define sk_X509V3_EXT_METHOD_num(st) SKM_sk_num(X509V3_EXT_METHOD, (st)) +# define sk_X509V3_EXT_METHOD_value(st, i) SKM_sk_value(X509V3_EXT_METHOD, (st), (i)) +# define sk_X509V3_EXT_METHOD_set(st, i, val) SKM_sk_set(X509V3_EXT_METHOD, (st), (i), (val)) +# define sk_X509V3_EXT_METHOD_zero(st) SKM_sk_zero(X509V3_EXT_METHOD, (st)) +# define sk_X509V3_EXT_METHOD_push(st, val) SKM_sk_push(X509V3_EXT_METHOD, (st), (val)) +# define sk_X509V3_EXT_METHOD_unshift(st, val) SKM_sk_unshift(X509V3_EXT_METHOD, (st), (val)) +# define sk_X509V3_EXT_METHOD_find(st, val) SKM_sk_find(X509V3_EXT_METHOD, (st), (val)) +# define sk_X509V3_EXT_METHOD_find_ex(st, val) SKM_sk_find_ex(X509V3_EXT_METHOD, (st), (val)) +# define sk_X509V3_EXT_METHOD_delete(st, i) SKM_sk_delete(X509V3_EXT_METHOD, (st), (i)) +# define sk_X509V3_EXT_METHOD_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509V3_EXT_METHOD, (st), (ptr)) +# define sk_X509V3_EXT_METHOD_insert(st, val, i) SKM_sk_insert(X509V3_EXT_METHOD, (st), (val), (i)) +# define sk_X509V3_EXT_METHOD_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509V3_EXT_METHOD, (st), (cmp)) +# define sk_X509V3_EXT_METHOD_dup(st) SKM_sk_dup(X509V3_EXT_METHOD, st) +# define sk_X509V3_EXT_METHOD_pop_free(st, free_func) SKM_sk_pop_free(X509V3_EXT_METHOD, (st), (free_func)) +# define sk_X509V3_EXT_METHOD_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509V3_EXT_METHOD, (st), (copy_func), (free_func)) +# define sk_X509V3_EXT_METHOD_shift(st) SKM_sk_shift(X509V3_EXT_METHOD, (st)) +# define sk_X509V3_EXT_METHOD_pop(st) SKM_sk_pop(X509V3_EXT_METHOD, (st)) +# define sk_X509V3_EXT_METHOD_sort(st) SKM_sk_sort(X509V3_EXT_METHOD, (st)) +# define sk_X509V3_EXT_METHOD_is_sorted(st) SKM_sk_is_sorted(X509V3_EXT_METHOD, (st)) +# define sk_X509_ALGOR_new(cmp) SKM_sk_new(X509_ALGOR, (cmp)) +# define sk_X509_ALGOR_new_null() SKM_sk_new_null(X509_ALGOR) +# define sk_X509_ALGOR_free(st) SKM_sk_free(X509_ALGOR, (st)) +# define sk_X509_ALGOR_num(st) SKM_sk_num(X509_ALGOR, (st)) +# define sk_X509_ALGOR_value(st, i) SKM_sk_value(X509_ALGOR, (st), (i)) +# define sk_X509_ALGOR_set(st, i, val) SKM_sk_set(X509_ALGOR, (st), (i), (val)) +# define sk_X509_ALGOR_zero(st) SKM_sk_zero(X509_ALGOR, (st)) +# define sk_X509_ALGOR_push(st, val) SKM_sk_push(X509_ALGOR, (st), (val)) +# define sk_X509_ALGOR_unshift(st, val) SKM_sk_unshift(X509_ALGOR, (st), (val)) +# define sk_X509_ALGOR_find(st, val) SKM_sk_find(X509_ALGOR, (st), (val)) +# define sk_X509_ALGOR_find_ex(st, val) SKM_sk_find_ex(X509_ALGOR, (st), (val)) +# define sk_X509_ALGOR_delete(st, i) SKM_sk_delete(X509_ALGOR, (st), (i)) +# define sk_X509_ALGOR_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_ALGOR, (st), (ptr)) +# define sk_X509_ALGOR_insert(st, val, i) SKM_sk_insert(X509_ALGOR, (st), (val), (i)) +# define sk_X509_ALGOR_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_ALGOR, (st), (cmp)) +# define sk_X509_ALGOR_dup(st) SKM_sk_dup(X509_ALGOR, st) +# define sk_X509_ALGOR_pop_free(st, free_func) SKM_sk_pop_free(X509_ALGOR, (st), (free_func)) +# define sk_X509_ALGOR_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_ALGOR, (st), (copy_func), (free_func)) +# define sk_X509_ALGOR_shift(st) SKM_sk_shift(X509_ALGOR, (st)) +# define sk_X509_ALGOR_pop(st) SKM_sk_pop(X509_ALGOR, (st)) +# define sk_X509_ALGOR_sort(st) SKM_sk_sort(X509_ALGOR, (st)) +# define sk_X509_ALGOR_is_sorted(st) SKM_sk_is_sorted(X509_ALGOR, (st)) +# define sk_X509_ATTRIBUTE_new(cmp) SKM_sk_new(X509_ATTRIBUTE, (cmp)) +# define sk_X509_ATTRIBUTE_new_null() SKM_sk_new_null(X509_ATTRIBUTE) +# define sk_X509_ATTRIBUTE_free(st) SKM_sk_free(X509_ATTRIBUTE, (st)) +# define sk_X509_ATTRIBUTE_num(st) SKM_sk_num(X509_ATTRIBUTE, (st)) +# define sk_X509_ATTRIBUTE_value(st, i) SKM_sk_value(X509_ATTRIBUTE, (st), (i)) +# define sk_X509_ATTRIBUTE_set(st, i, val) SKM_sk_set(X509_ATTRIBUTE, (st), (i), (val)) +# define sk_X509_ATTRIBUTE_zero(st) SKM_sk_zero(X509_ATTRIBUTE, (st)) +# define sk_X509_ATTRIBUTE_push(st, val) SKM_sk_push(X509_ATTRIBUTE, (st), (val)) +# define sk_X509_ATTRIBUTE_unshift(st, val) SKM_sk_unshift(X509_ATTRIBUTE, (st), (val)) +# define sk_X509_ATTRIBUTE_find(st, val) SKM_sk_find(X509_ATTRIBUTE, (st), (val)) +# define sk_X509_ATTRIBUTE_find_ex(st, val) SKM_sk_find_ex(X509_ATTRIBUTE, (st), (val)) +# define sk_X509_ATTRIBUTE_delete(st, i) SKM_sk_delete(X509_ATTRIBUTE, (st), (i)) +# define sk_X509_ATTRIBUTE_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_ATTRIBUTE, (st), (ptr)) +# define sk_X509_ATTRIBUTE_insert(st, val, i) SKM_sk_insert(X509_ATTRIBUTE, (st), (val), (i)) +# define sk_X509_ATTRIBUTE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_ATTRIBUTE, (st), (cmp)) +# define sk_X509_ATTRIBUTE_dup(st) SKM_sk_dup(X509_ATTRIBUTE, st) +# define sk_X509_ATTRIBUTE_pop_free(st, free_func) SKM_sk_pop_free(X509_ATTRIBUTE, (st), (free_func)) +# define sk_X509_ATTRIBUTE_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_ATTRIBUTE, (st), (copy_func), (free_func)) +# define sk_X509_ATTRIBUTE_shift(st) SKM_sk_shift(X509_ATTRIBUTE, (st)) +# define sk_X509_ATTRIBUTE_pop(st) SKM_sk_pop(X509_ATTRIBUTE, (st)) +# define sk_X509_ATTRIBUTE_sort(st) SKM_sk_sort(X509_ATTRIBUTE, (st)) +# define sk_X509_ATTRIBUTE_is_sorted(st) SKM_sk_is_sorted(X509_ATTRIBUTE, (st)) +# define sk_X509_CRL_new(cmp) SKM_sk_new(X509_CRL, (cmp)) +# define sk_X509_CRL_new_null() SKM_sk_new_null(X509_CRL) +# define sk_X509_CRL_free(st) SKM_sk_free(X509_CRL, (st)) +# define sk_X509_CRL_num(st) SKM_sk_num(X509_CRL, (st)) +# define sk_X509_CRL_value(st, i) SKM_sk_value(X509_CRL, (st), (i)) +# define sk_X509_CRL_set(st, i, val) SKM_sk_set(X509_CRL, (st), (i), (val)) +# define sk_X509_CRL_zero(st) SKM_sk_zero(X509_CRL, (st)) +# define sk_X509_CRL_push(st, val) SKM_sk_push(X509_CRL, (st), (val)) +# define sk_X509_CRL_unshift(st, val) SKM_sk_unshift(X509_CRL, (st), (val)) +# define sk_X509_CRL_find(st, val) SKM_sk_find(X509_CRL, (st), (val)) +# define sk_X509_CRL_find_ex(st, val) SKM_sk_find_ex(X509_CRL, (st), (val)) +# define sk_X509_CRL_delete(st, i) SKM_sk_delete(X509_CRL, (st), (i)) +# define sk_X509_CRL_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_CRL, (st), (ptr)) +# define sk_X509_CRL_insert(st, val, i) SKM_sk_insert(X509_CRL, (st), (val), (i)) +# define sk_X509_CRL_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_CRL, (st), (cmp)) +# define sk_X509_CRL_dup(st) SKM_sk_dup(X509_CRL, st) +# define sk_X509_CRL_pop_free(st, free_func) SKM_sk_pop_free(X509_CRL, (st), (free_func)) +# define sk_X509_CRL_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_CRL, (st), (copy_func), (free_func)) +# define sk_X509_CRL_shift(st) SKM_sk_shift(X509_CRL, (st)) +# define sk_X509_CRL_pop(st) SKM_sk_pop(X509_CRL, (st)) +# define sk_X509_CRL_sort(st) SKM_sk_sort(X509_CRL, (st)) +# define sk_X509_CRL_is_sorted(st) SKM_sk_is_sorted(X509_CRL, (st)) +# define sk_X509_EXTENSION_new(cmp) SKM_sk_new(X509_EXTENSION, (cmp)) +# define sk_X509_EXTENSION_new_null() SKM_sk_new_null(X509_EXTENSION) +# define sk_X509_EXTENSION_free(st) SKM_sk_free(X509_EXTENSION, (st)) +# define sk_X509_EXTENSION_num(st) SKM_sk_num(X509_EXTENSION, (st)) +# define sk_X509_EXTENSION_value(st, i) SKM_sk_value(X509_EXTENSION, (st), (i)) +# define sk_X509_EXTENSION_set(st, i, val) SKM_sk_set(X509_EXTENSION, (st), (i), (val)) +# define sk_X509_EXTENSION_zero(st) SKM_sk_zero(X509_EXTENSION, (st)) +# define sk_X509_EXTENSION_push(st, val) SKM_sk_push(X509_EXTENSION, (st), (val)) +# define sk_X509_EXTENSION_unshift(st, val) SKM_sk_unshift(X509_EXTENSION, (st), (val)) +# define sk_X509_EXTENSION_find(st, val) SKM_sk_find(X509_EXTENSION, (st), (val)) +# define sk_X509_EXTENSION_find_ex(st, val) SKM_sk_find_ex(X509_EXTENSION, (st), (val)) +# define sk_X509_EXTENSION_delete(st, i) SKM_sk_delete(X509_EXTENSION, (st), (i)) +# define sk_X509_EXTENSION_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_EXTENSION, (st), (ptr)) +# define sk_X509_EXTENSION_insert(st, val, i) SKM_sk_insert(X509_EXTENSION, (st), (val), (i)) +# define sk_X509_EXTENSION_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_EXTENSION, (st), (cmp)) +# define sk_X509_EXTENSION_dup(st) SKM_sk_dup(X509_EXTENSION, st) +# define sk_X509_EXTENSION_pop_free(st, free_func) SKM_sk_pop_free(X509_EXTENSION, (st), (free_func)) +# define sk_X509_EXTENSION_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_EXTENSION, (st), (copy_func), (free_func)) +# define sk_X509_EXTENSION_shift(st) SKM_sk_shift(X509_EXTENSION, (st)) +# define sk_X509_EXTENSION_pop(st) SKM_sk_pop(X509_EXTENSION, (st)) +# define sk_X509_EXTENSION_sort(st) SKM_sk_sort(X509_EXTENSION, (st)) +# define sk_X509_EXTENSION_is_sorted(st) SKM_sk_is_sorted(X509_EXTENSION, (st)) +# define sk_X509_INFO_new(cmp) SKM_sk_new(X509_INFO, (cmp)) +# define sk_X509_INFO_new_null() SKM_sk_new_null(X509_INFO) +# define sk_X509_INFO_free(st) SKM_sk_free(X509_INFO, (st)) +# define sk_X509_INFO_num(st) SKM_sk_num(X509_INFO, (st)) +# define sk_X509_INFO_value(st, i) SKM_sk_value(X509_INFO, (st), (i)) +# define sk_X509_INFO_set(st, i, val) SKM_sk_set(X509_INFO, (st), (i), (val)) +# define sk_X509_INFO_zero(st) SKM_sk_zero(X509_INFO, (st)) +# define sk_X509_INFO_push(st, val) SKM_sk_push(X509_INFO, (st), (val)) +# define sk_X509_INFO_unshift(st, val) SKM_sk_unshift(X509_INFO, (st), (val)) +# define sk_X509_INFO_find(st, val) SKM_sk_find(X509_INFO, (st), (val)) +# define sk_X509_INFO_find_ex(st, val) SKM_sk_find_ex(X509_INFO, (st), (val)) +# define sk_X509_INFO_delete(st, i) SKM_sk_delete(X509_INFO, (st), (i)) +# define sk_X509_INFO_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_INFO, (st), (ptr)) +# define sk_X509_INFO_insert(st, val, i) SKM_sk_insert(X509_INFO, (st), (val), (i)) +# define sk_X509_INFO_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_INFO, (st), (cmp)) +# define sk_X509_INFO_dup(st) SKM_sk_dup(X509_INFO, st) +# define sk_X509_INFO_pop_free(st, free_func) SKM_sk_pop_free(X509_INFO, (st), (free_func)) +# define sk_X509_INFO_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_INFO, (st), (copy_func), (free_func)) +# define sk_X509_INFO_shift(st) SKM_sk_shift(X509_INFO, (st)) +# define sk_X509_INFO_pop(st) SKM_sk_pop(X509_INFO, (st)) +# define sk_X509_INFO_sort(st) SKM_sk_sort(X509_INFO, (st)) +# define sk_X509_INFO_is_sorted(st) SKM_sk_is_sorted(X509_INFO, (st)) +# define sk_X509_LOOKUP_new(cmp) SKM_sk_new(X509_LOOKUP, (cmp)) +# define sk_X509_LOOKUP_new_null() SKM_sk_new_null(X509_LOOKUP) +# define sk_X509_LOOKUP_free(st) SKM_sk_free(X509_LOOKUP, (st)) +# define sk_X509_LOOKUP_num(st) SKM_sk_num(X509_LOOKUP, (st)) +# define sk_X509_LOOKUP_value(st, i) SKM_sk_value(X509_LOOKUP, (st), (i)) +# define sk_X509_LOOKUP_set(st, i, val) SKM_sk_set(X509_LOOKUP, (st), (i), (val)) +# define sk_X509_LOOKUP_zero(st) SKM_sk_zero(X509_LOOKUP, (st)) +# define sk_X509_LOOKUP_push(st, val) SKM_sk_push(X509_LOOKUP, (st), (val)) +# define sk_X509_LOOKUP_unshift(st, val) SKM_sk_unshift(X509_LOOKUP, (st), (val)) +# define sk_X509_LOOKUP_find(st, val) SKM_sk_find(X509_LOOKUP, (st), (val)) +# define sk_X509_LOOKUP_find_ex(st, val) SKM_sk_find_ex(X509_LOOKUP, (st), (val)) +# define sk_X509_LOOKUP_delete(st, i) SKM_sk_delete(X509_LOOKUP, (st), (i)) +# define sk_X509_LOOKUP_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_LOOKUP, (st), (ptr)) +# define sk_X509_LOOKUP_insert(st, val, i) SKM_sk_insert(X509_LOOKUP, (st), (val), (i)) +# define sk_X509_LOOKUP_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_LOOKUP, (st), (cmp)) +# define sk_X509_LOOKUP_dup(st) SKM_sk_dup(X509_LOOKUP, st) +# define sk_X509_LOOKUP_pop_free(st, free_func) SKM_sk_pop_free(X509_LOOKUP, (st), (free_func)) +# define sk_X509_LOOKUP_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_LOOKUP, (st), (copy_func), (free_func)) +# define sk_X509_LOOKUP_shift(st) SKM_sk_shift(X509_LOOKUP, (st)) +# define sk_X509_LOOKUP_pop(st) SKM_sk_pop(X509_LOOKUP, (st)) +# define sk_X509_LOOKUP_sort(st) SKM_sk_sort(X509_LOOKUP, (st)) +# define sk_X509_LOOKUP_is_sorted(st) SKM_sk_is_sorted(X509_LOOKUP, (st)) +# define sk_X509_NAME_new(cmp) SKM_sk_new(X509_NAME, (cmp)) +# define sk_X509_NAME_new_null() SKM_sk_new_null(X509_NAME) +# define sk_X509_NAME_free(st) SKM_sk_free(X509_NAME, (st)) +# define sk_X509_NAME_num(st) SKM_sk_num(X509_NAME, (st)) +# define sk_X509_NAME_value(st, i) SKM_sk_value(X509_NAME, (st), (i)) +# define sk_X509_NAME_set(st, i, val) SKM_sk_set(X509_NAME, (st), (i), (val)) +# define sk_X509_NAME_zero(st) SKM_sk_zero(X509_NAME, (st)) +# define sk_X509_NAME_push(st, val) SKM_sk_push(X509_NAME, (st), (val)) +# define sk_X509_NAME_unshift(st, val) SKM_sk_unshift(X509_NAME, (st), (val)) +# define sk_X509_NAME_find(st, val) SKM_sk_find(X509_NAME, (st), (val)) +# define sk_X509_NAME_find_ex(st, val) SKM_sk_find_ex(X509_NAME, (st), (val)) +# define sk_X509_NAME_delete(st, i) SKM_sk_delete(X509_NAME, (st), (i)) +# define sk_X509_NAME_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_NAME, (st), (ptr)) +# define sk_X509_NAME_insert(st, val, i) SKM_sk_insert(X509_NAME, (st), (val), (i)) +# define sk_X509_NAME_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_NAME, (st), (cmp)) +# define sk_X509_NAME_dup(st) SKM_sk_dup(X509_NAME, st) +# define sk_X509_NAME_pop_free(st, free_func) SKM_sk_pop_free(X509_NAME, (st), (free_func)) +# define sk_X509_NAME_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_NAME, (st), (copy_func), (free_func)) +# define sk_X509_NAME_shift(st) SKM_sk_shift(X509_NAME, (st)) +# define sk_X509_NAME_pop(st) SKM_sk_pop(X509_NAME, (st)) +# define sk_X509_NAME_sort(st) SKM_sk_sort(X509_NAME, (st)) +# define sk_X509_NAME_is_sorted(st) SKM_sk_is_sorted(X509_NAME, (st)) +# define sk_X509_NAME_ENTRY_new(cmp) SKM_sk_new(X509_NAME_ENTRY, (cmp)) +# define sk_X509_NAME_ENTRY_new_null() SKM_sk_new_null(X509_NAME_ENTRY) +# define sk_X509_NAME_ENTRY_free(st) SKM_sk_free(X509_NAME_ENTRY, (st)) +# define sk_X509_NAME_ENTRY_num(st) SKM_sk_num(X509_NAME_ENTRY, (st)) +# define sk_X509_NAME_ENTRY_value(st, i) SKM_sk_value(X509_NAME_ENTRY, (st), (i)) +# define sk_X509_NAME_ENTRY_set(st, i, val) SKM_sk_set(X509_NAME_ENTRY, (st), (i), (val)) +# define sk_X509_NAME_ENTRY_zero(st) SKM_sk_zero(X509_NAME_ENTRY, (st)) +# define sk_X509_NAME_ENTRY_push(st, val) SKM_sk_push(X509_NAME_ENTRY, (st), (val)) +# define sk_X509_NAME_ENTRY_unshift(st, val) SKM_sk_unshift(X509_NAME_ENTRY, (st), (val)) +# define sk_X509_NAME_ENTRY_find(st, val) SKM_sk_find(X509_NAME_ENTRY, (st), (val)) +# define sk_X509_NAME_ENTRY_find_ex(st, val) SKM_sk_find_ex(X509_NAME_ENTRY, (st), (val)) +# define sk_X509_NAME_ENTRY_delete(st, i) SKM_sk_delete(X509_NAME_ENTRY, (st), (i)) +# define sk_X509_NAME_ENTRY_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_NAME_ENTRY, (st), (ptr)) +# define sk_X509_NAME_ENTRY_insert(st, val, i) SKM_sk_insert(X509_NAME_ENTRY, (st), (val), (i)) +# define sk_X509_NAME_ENTRY_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_NAME_ENTRY, (st), (cmp)) +# define sk_X509_NAME_ENTRY_dup(st) SKM_sk_dup(X509_NAME_ENTRY, st) +# define sk_X509_NAME_ENTRY_pop_free(st, free_func) SKM_sk_pop_free(X509_NAME_ENTRY, (st), (free_func)) +# define sk_X509_NAME_ENTRY_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_NAME_ENTRY, (st), (copy_func), (free_func)) +# define sk_X509_NAME_ENTRY_shift(st) SKM_sk_shift(X509_NAME_ENTRY, (st)) +# define sk_X509_NAME_ENTRY_pop(st) SKM_sk_pop(X509_NAME_ENTRY, (st)) +# define sk_X509_NAME_ENTRY_sort(st) SKM_sk_sort(X509_NAME_ENTRY, (st)) +# define sk_X509_NAME_ENTRY_is_sorted(st) SKM_sk_is_sorted(X509_NAME_ENTRY, (st)) +# define sk_X509_OBJECT_new(cmp) SKM_sk_new(X509_OBJECT, (cmp)) +# define sk_X509_OBJECT_new_null() SKM_sk_new_null(X509_OBJECT) +# define sk_X509_OBJECT_free(st) SKM_sk_free(X509_OBJECT, (st)) +# define sk_X509_OBJECT_num(st) SKM_sk_num(X509_OBJECT, (st)) +# define sk_X509_OBJECT_value(st, i) SKM_sk_value(X509_OBJECT, (st), (i)) +# define sk_X509_OBJECT_set(st, i, val) SKM_sk_set(X509_OBJECT, (st), (i), (val)) +# define sk_X509_OBJECT_zero(st) SKM_sk_zero(X509_OBJECT, (st)) +# define sk_X509_OBJECT_push(st, val) SKM_sk_push(X509_OBJECT, (st), (val)) +# define sk_X509_OBJECT_unshift(st, val) SKM_sk_unshift(X509_OBJECT, (st), (val)) +# define sk_X509_OBJECT_find(st, val) SKM_sk_find(X509_OBJECT, (st), (val)) +# define sk_X509_OBJECT_find_ex(st, val) SKM_sk_find_ex(X509_OBJECT, (st), (val)) +# define sk_X509_OBJECT_delete(st, i) SKM_sk_delete(X509_OBJECT, (st), (i)) +# define sk_X509_OBJECT_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_OBJECT, (st), (ptr)) +# define sk_X509_OBJECT_insert(st, val, i) SKM_sk_insert(X509_OBJECT, (st), (val), (i)) +# define sk_X509_OBJECT_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_OBJECT, (st), (cmp)) +# define sk_X509_OBJECT_dup(st) SKM_sk_dup(X509_OBJECT, st) +# define sk_X509_OBJECT_pop_free(st, free_func) SKM_sk_pop_free(X509_OBJECT, (st), (free_func)) +# define sk_X509_OBJECT_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_OBJECT, (st), (copy_func), (free_func)) +# define sk_X509_OBJECT_shift(st) SKM_sk_shift(X509_OBJECT, (st)) +# define sk_X509_OBJECT_pop(st) SKM_sk_pop(X509_OBJECT, (st)) +# define sk_X509_OBJECT_sort(st) SKM_sk_sort(X509_OBJECT, (st)) +# define sk_X509_OBJECT_is_sorted(st) SKM_sk_is_sorted(X509_OBJECT, (st)) +# define sk_X509_POLICY_DATA_new(cmp) SKM_sk_new(X509_POLICY_DATA, (cmp)) +# define sk_X509_POLICY_DATA_new_null() SKM_sk_new_null(X509_POLICY_DATA) +# define sk_X509_POLICY_DATA_free(st) SKM_sk_free(X509_POLICY_DATA, (st)) +# define sk_X509_POLICY_DATA_num(st) SKM_sk_num(X509_POLICY_DATA, (st)) +# define sk_X509_POLICY_DATA_value(st, i) SKM_sk_value(X509_POLICY_DATA, (st), (i)) +# define sk_X509_POLICY_DATA_set(st, i, val) SKM_sk_set(X509_POLICY_DATA, (st), (i), (val)) +# define sk_X509_POLICY_DATA_zero(st) SKM_sk_zero(X509_POLICY_DATA, (st)) +# define sk_X509_POLICY_DATA_push(st, val) SKM_sk_push(X509_POLICY_DATA, (st), (val)) +# define sk_X509_POLICY_DATA_unshift(st, val) SKM_sk_unshift(X509_POLICY_DATA, (st), (val)) +# define sk_X509_POLICY_DATA_find(st, val) SKM_sk_find(X509_POLICY_DATA, (st), (val)) +# define sk_X509_POLICY_DATA_find_ex(st, val) SKM_sk_find_ex(X509_POLICY_DATA, (st), (val)) +# define sk_X509_POLICY_DATA_delete(st, i) SKM_sk_delete(X509_POLICY_DATA, (st), (i)) +# define sk_X509_POLICY_DATA_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_POLICY_DATA, (st), (ptr)) +# define sk_X509_POLICY_DATA_insert(st, val, i) SKM_sk_insert(X509_POLICY_DATA, (st), (val), (i)) +# define sk_X509_POLICY_DATA_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_POLICY_DATA, (st), (cmp)) +# define sk_X509_POLICY_DATA_dup(st) SKM_sk_dup(X509_POLICY_DATA, st) +# define sk_X509_POLICY_DATA_pop_free(st, free_func) SKM_sk_pop_free(X509_POLICY_DATA, (st), (free_func)) +# define sk_X509_POLICY_DATA_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_POLICY_DATA, (st), (copy_func), (free_func)) +# define sk_X509_POLICY_DATA_shift(st) SKM_sk_shift(X509_POLICY_DATA, (st)) +# define sk_X509_POLICY_DATA_pop(st) SKM_sk_pop(X509_POLICY_DATA, (st)) +# define sk_X509_POLICY_DATA_sort(st) SKM_sk_sort(X509_POLICY_DATA, (st)) +# define sk_X509_POLICY_DATA_is_sorted(st) SKM_sk_is_sorted(X509_POLICY_DATA, (st)) +# define sk_X509_POLICY_NODE_new(cmp) SKM_sk_new(X509_POLICY_NODE, (cmp)) +# define sk_X509_POLICY_NODE_new_null() SKM_sk_new_null(X509_POLICY_NODE) +# define sk_X509_POLICY_NODE_free(st) SKM_sk_free(X509_POLICY_NODE, (st)) +# define sk_X509_POLICY_NODE_num(st) SKM_sk_num(X509_POLICY_NODE, (st)) +# define sk_X509_POLICY_NODE_value(st, i) SKM_sk_value(X509_POLICY_NODE, (st), (i)) +# define sk_X509_POLICY_NODE_set(st, i, val) SKM_sk_set(X509_POLICY_NODE, (st), (i), (val)) +# define sk_X509_POLICY_NODE_zero(st) SKM_sk_zero(X509_POLICY_NODE, (st)) +# define sk_X509_POLICY_NODE_push(st, val) SKM_sk_push(X509_POLICY_NODE, (st), (val)) +# define sk_X509_POLICY_NODE_unshift(st, val) SKM_sk_unshift(X509_POLICY_NODE, (st), (val)) +# define sk_X509_POLICY_NODE_find(st, val) SKM_sk_find(X509_POLICY_NODE, (st), (val)) +# define sk_X509_POLICY_NODE_find_ex(st, val) SKM_sk_find_ex(X509_POLICY_NODE, (st), (val)) +# define sk_X509_POLICY_NODE_delete(st, i) SKM_sk_delete(X509_POLICY_NODE, (st), (i)) +# define sk_X509_POLICY_NODE_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_POLICY_NODE, (st), (ptr)) +# define sk_X509_POLICY_NODE_insert(st, val, i) SKM_sk_insert(X509_POLICY_NODE, (st), (val), (i)) +# define sk_X509_POLICY_NODE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_POLICY_NODE, (st), (cmp)) +# define sk_X509_POLICY_NODE_dup(st) SKM_sk_dup(X509_POLICY_NODE, st) +# define sk_X509_POLICY_NODE_pop_free(st, free_func) SKM_sk_pop_free(X509_POLICY_NODE, (st), (free_func)) +# define sk_X509_POLICY_NODE_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_POLICY_NODE, (st), (copy_func), (free_func)) +# define sk_X509_POLICY_NODE_shift(st) SKM_sk_shift(X509_POLICY_NODE, (st)) +# define sk_X509_POLICY_NODE_pop(st) SKM_sk_pop(X509_POLICY_NODE, (st)) +# define sk_X509_POLICY_NODE_sort(st) SKM_sk_sort(X509_POLICY_NODE, (st)) +# define sk_X509_POLICY_NODE_is_sorted(st) SKM_sk_is_sorted(X509_POLICY_NODE, (st)) +# define sk_X509_PURPOSE_new(cmp) SKM_sk_new(X509_PURPOSE, (cmp)) +# define sk_X509_PURPOSE_new_null() SKM_sk_new_null(X509_PURPOSE) +# define sk_X509_PURPOSE_free(st) SKM_sk_free(X509_PURPOSE, (st)) +# define sk_X509_PURPOSE_num(st) SKM_sk_num(X509_PURPOSE, (st)) +# define sk_X509_PURPOSE_value(st, i) SKM_sk_value(X509_PURPOSE, (st), (i)) +# define sk_X509_PURPOSE_set(st, i, val) SKM_sk_set(X509_PURPOSE, (st), (i), (val)) +# define sk_X509_PURPOSE_zero(st) SKM_sk_zero(X509_PURPOSE, (st)) +# define sk_X509_PURPOSE_push(st, val) SKM_sk_push(X509_PURPOSE, (st), (val)) +# define sk_X509_PURPOSE_unshift(st, val) SKM_sk_unshift(X509_PURPOSE, (st), (val)) +# define sk_X509_PURPOSE_find(st, val) SKM_sk_find(X509_PURPOSE, (st), (val)) +# define sk_X509_PURPOSE_find_ex(st, val) SKM_sk_find_ex(X509_PURPOSE, (st), (val)) +# define sk_X509_PURPOSE_delete(st, i) SKM_sk_delete(X509_PURPOSE, (st), (i)) +# define sk_X509_PURPOSE_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_PURPOSE, (st), (ptr)) +# define sk_X509_PURPOSE_insert(st, val, i) SKM_sk_insert(X509_PURPOSE, (st), (val), (i)) +# define sk_X509_PURPOSE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_PURPOSE, (st), (cmp)) +# define sk_X509_PURPOSE_dup(st) SKM_sk_dup(X509_PURPOSE, st) +# define sk_X509_PURPOSE_pop_free(st, free_func) SKM_sk_pop_free(X509_PURPOSE, (st), (free_func)) +# define sk_X509_PURPOSE_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_PURPOSE, (st), (copy_func), (free_func)) +# define sk_X509_PURPOSE_shift(st) SKM_sk_shift(X509_PURPOSE, (st)) +# define sk_X509_PURPOSE_pop(st) SKM_sk_pop(X509_PURPOSE, (st)) +# define sk_X509_PURPOSE_sort(st) SKM_sk_sort(X509_PURPOSE, (st)) +# define sk_X509_PURPOSE_is_sorted(st) SKM_sk_is_sorted(X509_PURPOSE, (st)) +# define sk_X509_REVOKED_new(cmp) SKM_sk_new(X509_REVOKED, (cmp)) +# define sk_X509_REVOKED_new_null() SKM_sk_new_null(X509_REVOKED) +# define sk_X509_REVOKED_free(st) SKM_sk_free(X509_REVOKED, (st)) +# define sk_X509_REVOKED_num(st) SKM_sk_num(X509_REVOKED, (st)) +# define sk_X509_REVOKED_value(st, i) SKM_sk_value(X509_REVOKED, (st), (i)) +# define sk_X509_REVOKED_set(st, i, val) SKM_sk_set(X509_REVOKED, (st), (i), (val)) +# define sk_X509_REVOKED_zero(st) SKM_sk_zero(X509_REVOKED, (st)) +# define sk_X509_REVOKED_push(st, val) SKM_sk_push(X509_REVOKED, (st), (val)) +# define sk_X509_REVOKED_unshift(st, val) SKM_sk_unshift(X509_REVOKED, (st), (val)) +# define sk_X509_REVOKED_find(st, val) SKM_sk_find(X509_REVOKED, (st), (val)) +# define sk_X509_REVOKED_find_ex(st, val) SKM_sk_find_ex(X509_REVOKED, (st), (val)) +# define sk_X509_REVOKED_delete(st, i) SKM_sk_delete(X509_REVOKED, (st), (i)) +# define sk_X509_REVOKED_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_REVOKED, (st), (ptr)) +# define sk_X509_REVOKED_insert(st, val, i) SKM_sk_insert(X509_REVOKED, (st), (val), (i)) +# define sk_X509_REVOKED_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_REVOKED, (st), (cmp)) +# define sk_X509_REVOKED_dup(st) SKM_sk_dup(X509_REVOKED, st) +# define sk_X509_REVOKED_pop_free(st, free_func) SKM_sk_pop_free(X509_REVOKED, (st), (free_func)) +# define sk_X509_REVOKED_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_REVOKED, (st), (copy_func), (free_func)) +# define sk_X509_REVOKED_shift(st) SKM_sk_shift(X509_REVOKED, (st)) +# define sk_X509_REVOKED_pop(st) SKM_sk_pop(X509_REVOKED, (st)) +# define sk_X509_REVOKED_sort(st) SKM_sk_sort(X509_REVOKED, (st)) +# define sk_X509_REVOKED_is_sorted(st) SKM_sk_is_sorted(X509_REVOKED, (st)) +# define sk_X509_TRUST_new(cmp) SKM_sk_new(X509_TRUST, (cmp)) +# define sk_X509_TRUST_new_null() SKM_sk_new_null(X509_TRUST) +# define sk_X509_TRUST_free(st) SKM_sk_free(X509_TRUST, (st)) +# define sk_X509_TRUST_num(st) SKM_sk_num(X509_TRUST, (st)) +# define sk_X509_TRUST_value(st, i) SKM_sk_value(X509_TRUST, (st), (i)) +# define sk_X509_TRUST_set(st, i, val) SKM_sk_set(X509_TRUST, (st), (i), (val)) +# define sk_X509_TRUST_zero(st) SKM_sk_zero(X509_TRUST, (st)) +# define sk_X509_TRUST_push(st, val) SKM_sk_push(X509_TRUST, (st), (val)) +# define sk_X509_TRUST_unshift(st, val) SKM_sk_unshift(X509_TRUST, (st), (val)) +# define sk_X509_TRUST_find(st, val) SKM_sk_find(X509_TRUST, (st), (val)) +# define sk_X509_TRUST_find_ex(st, val) SKM_sk_find_ex(X509_TRUST, (st), (val)) +# define sk_X509_TRUST_delete(st, i) SKM_sk_delete(X509_TRUST, (st), (i)) +# define sk_X509_TRUST_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_TRUST, (st), (ptr)) +# define sk_X509_TRUST_insert(st, val, i) SKM_sk_insert(X509_TRUST, (st), (val), (i)) +# define sk_X509_TRUST_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_TRUST, (st), (cmp)) +# define sk_X509_TRUST_dup(st) SKM_sk_dup(X509_TRUST, st) +# define sk_X509_TRUST_pop_free(st, free_func) SKM_sk_pop_free(X509_TRUST, (st), (free_func)) +# define sk_X509_TRUST_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_TRUST, (st), (copy_func), (free_func)) +# define sk_X509_TRUST_shift(st) SKM_sk_shift(X509_TRUST, (st)) +# define sk_X509_TRUST_pop(st) SKM_sk_pop(X509_TRUST, (st)) +# define sk_X509_TRUST_sort(st) SKM_sk_sort(X509_TRUST, (st)) +# define sk_X509_TRUST_is_sorted(st) SKM_sk_is_sorted(X509_TRUST, (st)) +# define sk_X509_VERIFY_PARAM_new(cmp) SKM_sk_new(X509_VERIFY_PARAM, (cmp)) +# define sk_X509_VERIFY_PARAM_new_null() SKM_sk_new_null(X509_VERIFY_PARAM) +# define sk_X509_VERIFY_PARAM_free(st) SKM_sk_free(X509_VERIFY_PARAM, (st)) +# define sk_X509_VERIFY_PARAM_num(st) SKM_sk_num(X509_VERIFY_PARAM, (st)) +# define sk_X509_VERIFY_PARAM_value(st, i) SKM_sk_value(X509_VERIFY_PARAM, (st), (i)) +# define sk_X509_VERIFY_PARAM_set(st, i, val) SKM_sk_set(X509_VERIFY_PARAM, (st), (i), (val)) +# define sk_X509_VERIFY_PARAM_zero(st) SKM_sk_zero(X509_VERIFY_PARAM, (st)) +# define sk_X509_VERIFY_PARAM_push(st, val) SKM_sk_push(X509_VERIFY_PARAM, (st), (val)) +# define sk_X509_VERIFY_PARAM_unshift(st, val) SKM_sk_unshift(X509_VERIFY_PARAM, (st), (val)) +# define sk_X509_VERIFY_PARAM_find(st, val) SKM_sk_find(X509_VERIFY_PARAM, (st), (val)) +# define sk_X509_VERIFY_PARAM_find_ex(st, val) SKM_sk_find_ex(X509_VERIFY_PARAM, (st), (val)) +# define sk_X509_VERIFY_PARAM_delete(st, i) SKM_sk_delete(X509_VERIFY_PARAM, (st), (i)) +# define sk_X509_VERIFY_PARAM_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_VERIFY_PARAM, (st), (ptr)) +# define sk_X509_VERIFY_PARAM_insert(st, val, i) SKM_sk_insert(X509_VERIFY_PARAM, (st), (val), (i)) +# define sk_X509_VERIFY_PARAM_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_VERIFY_PARAM, (st), (cmp)) +# define sk_X509_VERIFY_PARAM_dup(st) SKM_sk_dup(X509_VERIFY_PARAM, st) +# define sk_X509_VERIFY_PARAM_pop_free(st, free_func) SKM_sk_pop_free(X509_VERIFY_PARAM, (st), (free_func)) +# define sk_X509_VERIFY_PARAM_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_VERIFY_PARAM, (st), (copy_func), (free_func)) +# define sk_X509_VERIFY_PARAM_shift(st) SKM_sk_shift(X509_VERIFY_PARAM, (st)) +# define sk_X509_VERIFY_PARAM_pop(st) SKM_sk_pop(X509_VERIFY_PARAM, (st)) +# define sk_X509_VERIFY_PARAM_sort(st) SKM_sk_sort(X509_VERIFY_PARAM, (st)) +# define sk_X509_VERIFY_PARAM_is_sorted(st) SKM_sk_is_sorted(X509_VERIFY_PARAM, (st)) +# define sk_nid_triple_new(cmp) SKM_sk_new(nid_triple, (cmp)) +# define sk_nid_triple_new_null() SKM_sk_new_null(nid_triple) +# define sk_nid_triple_free(st) SKM_sk_free(nid_triple, (st)) +# define sk_nid_triple_num(st) SKM_sk_num(nid_triple, (st)) +# define sk_nid_triple_value(st, i) SKM_sk_value(nid_triple, (st), (i)) +# define sk_nid_triple_set(st, i, val) SKM_sk_set(nid_triple, (st), (i), (val)) +# define sk_nid_triple_zero(st) SKM_sk_zero(nid_triple, (st)) +# define sk_nid_triple_push(st, val) SKM_sk_push(nid_triple, (st), (val)) +# define sk_nid_triple_unshift(st, val) SKM_sk_unshift(nid_triple, (st), (val)) +# define sk_nid_triple_find(st, val) SKM_sk_find(nid_triple, (st), (val)) +# define sk_nid_triple_find_ex(st, val) SKM_sk_find_ex(nid_triple, (st), (val)) +# define sk_nid_triple_delete(st, i) SKM_sk_delete(nid_triple, (st), (i)) +# define sk_nid_triple_delete_ptr(st, ptr) SKM_sk_delete_ptr(nid_triple, (st), (ptr)) +# define sk_nid_triple_insert(st, val, i) SKM_sk_insert(nid_triple, (st), (val), (i)) +# define sk_nid_triple_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(nid_triple, (st), (cmp)) +# define sk_nid_triple_dup(st) SKM_sk_dup(nid_triple, st) +# define sk_nid_triple_pop_free(st, free_func) SKM_sk_pop_free(nid_triple, (st), (free_func)) +# define sk_nid_triple_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(nid_triple, (st), (copy_func), (free_func)) +# define sk_nid_triple_shift(st) SKM_sk_shift(nid_triple, (st)) +# define sk_nid_triple_pop(st) SKM_sk_pop(nid_triple, (st)) +# define sk_nid_triple_sort(st) SKM_sk_sort(nid_triple, (st)) +# define sk_nid_triple_is_sorted(st) SKM_sk_is_sorted(nid_triple, (st)) +# define sk_void_new(cmp) SKM_sk_new(void, (cmp)) +# define sk_void_new_null() SKM_sk_new_null(void) +# define sk_void_free(st) SKM_sk_free(void, (st)) +# define sk_void_num(st) SKM_sk_num(void, (st)) +# define sk_void_value(st, i) SKM_sk_value(void, (st), (i)) +# define sk_void_set(st, i, val) SKM_sk_set(void, (st), (i), (val)) +# define sk_void_zero(st) SKM_sk_zero(void, (st)) +# define sk_void_push(st, val) SKM_sk_push(void, (st), (val)) +# define sk_void_unshift(st, val) SKM_sk_unshift(void, (st), (val)) +# define sk_void_find(st, val) SKM_sk_find(void, (st), (val)) +# define sk_void_find_ex(st, val) SKM_sk_find_ex(void, (st), (val)) +# define sk_void_delete(st, i) SKM_sk_delete(void, (st), (i)) +# define sk_void_delete_ptr(st, ptr) SKM_sk_delete_ptr(void, (st), (ptr)) +# define sk_void_insert(st, val, i) SKM_sk_insert(void, (st), (val), (i)) +# define sk_void_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(void, (st), (cmp)) +# define sk_void_dup(st) SKM_sk_dup(void, st) +# define sk_void_pop_free(st, free_func) SKM_sk_pop_free(void, (st), (free_func)) +# define sk_void_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(void, (st), (copy_func), (free_func)) +# define sk_void_shift(st) SKM_sk_shift(void, (st)) +# define sk_void_pop(st) SKM_sk_pop(void, (st)) +# define sk_void_sort(st) SKM_sk_sort(void, (st)) +# define sk_void_is_sorted(st) SKM_sk_is_sorted(void, (st)) +# define sk_OPENSSL_STRING_new(cmp) ((STACK_OF(OPENSSL_STRING) *)sk_new(CHECKED_SK_CMP_FUNC(char, cmp))) +# define sk_OPENSSL_STRING_new_null() ((STACK_OF(OPENSSL_STRING) *)sk_new_null()) +# define sk_OPENSSL_STRING_push(st, val) sk_push(CHECKED_STACK_OF(OPENSSL_STRING, st), CHECKED_PTR_OF(char, val)) +# define sk_OPENSSL_STRING_find(st, val) sk_find(CHECKED_STACK_OF(OPENSSL_STRING, st), CHECKED_PTR_OF(char, val)) +# define sk_OPENSSL_STRING_value(st, i) ((OPENSSL_STRING)sk_value(CHECKED_STACK_OF(OPENSSL_STRING, st), i)) +# define sk_OPENSSL_STRING_num(st) SKM_sk_num(OPENSSL_STRING, st) +# define sk_OPENSSL_STRING_pop_free(st, free_func) sk_pop_free(CHECKED_STACK_OF(OPENSSL_STRING, st), CHECKED_SK_FREE_FUNC(char, free_func)) +# define sk_OPENSSL_STRING_deep_copy(st, copy_func, free_func) ((STACK_OF(OPENSSL_STRING) *)sk_deep_copy(CHECKED_STACK_OF(OPENSSL_STRING, st), CHECKED_SK_COPY_FUNC(char, copy_func), CHECKED_SK_FREE_FUNC(char, free_func))) +# define sk_OPENSSL_STRING_insert(st, val, i) sk_insert(CHECKED_STACK_OF(OPENSSL_STRING, st), CHECKED_PTR_OF(char, val), i) +# define sk_OPENSSL_STRING_free(st) SKM_sk_free(OPENSSL_STRING, st) +# define sk_OPENSSL_STRING_set(st, i, val) sk_set(CHECKED_STACK_OF(OPENSSL_STRING, st), i, CHECKED_PTR_OF(char, val)) +# define sk_OPENSSL_STRING_zero(st) SKM_sk_zero(OPENSSL_STRING, (st)) +# define sk_OPENSSL_STRING_unshift(st, val) sk_unshift(CHECKED_STACK_OF(OPENSSL_STRING, st), CHECKED_PTR_OF(char, val)) +# define sk_OPENSSL_STRING_find_ex(st, val) sk_find_ex((_STACK *)CHECKED_CONST_PTR_OF(STACK_OF(OPENSSL_STRING), st), CHECKED_CONST_PTR_OF(char, val)) +# define sk_OPENSSL_STRING_delete(st, i) SKM_sk_delete(OPENSSL_STRING, (st), (i)) +# define sk_OPENSSL_STRING_delete_ptr(st, ptr) (OPENSSL_STRING *)sk_delete_ptr(CHECKED_STACK_OF(OPENSSL_STRING, st), CHECKED_PTR_OF(char, ptr)) +# define sk_OPENSSL_STRING_set_cmp_func(st, cmp) \ + ((int (*)(const char * const *,const char * const *)) \ + sk_set_cmp_func(CHECKED_STACK_OF(OPENSSL_STRING, st), CHECKED_SK_CMP_FUNC(char, cmp))) +# define sk_OPENSSL_STRING_dup(st) SKM_sk_dup(OPENSSL_STRING, st) +# define sk_OPENSSL_STRING_shift(st) SKM_sk_shift(OPENSSL_STRING, (st)) +# define sk_OPENSSL_STRING_pop(st) (char *)sk_pop(CHECKED_STACK_OF(OPENSSL_STRING, st)) +# define sk_OPENSSL_STRING_sort(st) SKM_sk_sort(OPENSSL_STRING, (st)) +# define sk_OPENSSL_STRING_is_sorted(st) SKM_sk_is_sorted(OPENSSL_STRING, (st)) +# define sk_OPENSSL_BLOCK_new(cmp) ((STACK_OF(OPENSSL_BLOCK) *)sk_new(CHECKED_SK_CMP_FUNC(void, cmp))) +# define sk_OPENSSL_BLOCK_new_null() ((STACK_OF(OPENSSL_BLOCK) *)sk_new_null()) +# define sk_OPENSSL_BLOCK_push(st, val) sk_push(CHECKED_STACK_OF(OPENSSL_BLOCK, st), CHECKED_PTR_OF(void, val)) +# define sk_OPENSSL_BLOCK_find(st, val) sk_find(CHECKED_STACK_OF(OPENSSL_BLOCK, st), CHECKED_PTR_OF(void, val)) +# define sk_OPENSSL_BLOCK_value(st, i) ((OPENSSL_BLOCK)sk_value(CHECKED_STACK_OF(OPENSSL_BLOCK, st), i)) +# define sk_OPENSSL_BLOCK_num(st) SKM_sk_num(OPENSSL_BLOCK, st) +# define sk_OPENSSL_BLOCK_pop_free(st, free_func) sk_pop_free(CHECKED_STACK_OF(OPENSSL_BLOCK, st), CHECKED_SK_FREE_FUNC(void, free_func)) +# define sk_OPENSSL_BLOCK_deep_copy(st, copy_func, free_func) ((STACK_OF(OPENSSL_BLOCK) *)sk_deep_copy(CHECKED_STACK_OF(OPENSSL_BLOCK, st), CHECKED_SK_COPY_FUNC(void, copy_func), CHECKED_SK_FREE_FUNC(void, free_func))) +# define sk_OPENSSL_BLOCK_insert(st, val, i) sk_insert(CHECKED_STACK_OF(OPENSSL_BLOCK, st), CHECKED_PTR_OF(void, val), i) +# define sk_OPENSSL_BLOCK_free(st) SKM_sk_free(OPENSSL_BLOCK, st) +# define sk_OPENSSL_BLOCK_set(st, i, val) sk_set(CHECKED_STACK_OF(OPENSSL_BLOCK, st), i, CHECKED_PTR_OF(void, val)) +# define sk_OPENSSL_BLOCK_zero(st) SKM_sk_zero(OPENSSL_BLOCK, (st)) +# define sk_OPENSSL_BLOCK_unshift(st, val) sk_unshift(CHECKED_STACK_OF(OPENSSL_BLOCK, st), CHECKED_PTR_OF(void, val)) +# define sk_OPENSSL_BLOCK_find_ex(st, val) sk_find_ex((_STACK *)CHECKED_CONST_PTR_OF(STACK_OF(OPENSSL_BLOCK), st), CHECKED_CONST_PTR_OF(void, val)) +# define sk_OPENSSL_BLOCK_delete(st, i) SKM_sk_delete(OPENSSL_BLOCK, (st), (i)) +# define sk_OPENSSL_BLOCK_delete_ptr(st, ptr) (OPENSSL_BLOCK *)sk_delete_ptr(CHECKED_STACK_OF(OPENSSL_BLOCK, st), CHECKED_PTR_OF(void, ptr)) +# define sk_OPENSSL_BLOCK_set_cmp_func(st, cmp) \ + ((int (*)(const void * const *,const void * const *)) \ + sk_set_cmp_func(CHECKED_STACK_OF(OPENSSL_BLOCK, st), CHECKED_SK_CMP_FUNC(void, cmp))) +# define sk_OPENSSL_BLOCK_dup(st) SKM_sk_dup(OPENSSL_BLOCK, st) +# define sk_OPENSSL_BLOCK_shift(st) SKM_sk_shift(OPENSSL_BLOCK, (st)) +# define sk_OPENSSL_BLOCK_pop(st) (void *)sk_pop(CHECKED_STACK_OF(OPENSSL_BLOCK, st)) +# define sk_OPENSSL_BLOCK_sort(st) SKM_sk_sort(OPENSSL_BLOCK, (st)) +# define sk_OPENSSL_BLOCK_is_sorted(st) SKM_sk_is_sorted(OPENSSL_BLOCK, (st)) +# define sk_OPENSSL_PSTRING_new(cmp) ((STACK_OF(OPENSSL_PSTRING) *)sk_new(CHECKED_SK_CMP_FUNC(OPENSSL_STRING, cmp))) +# define sk_OPENSSL_PSTRING_new_null() ((STACK_OF(OPENSSL_PSTRING) *)sk_new_null()) +# define sk_OPENSSL_PSTRING_push(st, val) sk_push(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_PTR_OF(OPENSSL_STRING, val)) +# define sk_OPENSSL_PSTRING_find(st, val) sk_find(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_PTR_OF(OPENSSL_STRING, val)) +# define sk_OPENSSL_PSTRING_value(st, i) ((OPENSSL_PSTRING)sk_value(CHECKED_STACK_OF(OPENSSL_PSTRING, st), i)) +# define sk_OPENSSL_PSTRING_num(st) SKM_sk_num(OPENSSL_PSTRING, st) +# define sk_OPENSSL_PSTRING_pop_free(st, free_func) sk_pop_free(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_SK_FREE_FUNC(OPENSSL_STRING, free_func)) +# define sk_OPENSSL_PSTRING_deep_copy(st, copy_func, free_func) ((STACK_OF(OPENSSL_PSTRING) *)sk_deep_copy(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_SK_COPY_FUNC(OPENSSL_STRING, copy_func), CHECKED_SK_FREE_FUNC(OPENSSL_STRING, free_func))) +# define sk_OPENSSL_PSTRING_insert(st, val, i) sk_insert(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_PTR_OF(OPENSSL_STRING, val), i) +# define sk_OPENSSL_PSTRING_free(st) SKM_sk_free(OPENSSL_PSTRING, st) +# define sk_OPENSSL_PSTRING_set(st, i, val) sk_set(CHECKED_STACK_OF(OPENSSL_PSTRING, st), i, CHECKED_PTR_OF(OPENSSL_STRING, val)) +# define sk_OPENSSL_PSTRING_zero(st) SKM_sk_zero(OPENSSL_PSTRING, (st)) +# define sk_OPENSSL_PSTRING_unshift(st, val) sk_unshift(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_PTR_OF(OPENSSL_STRING, val)) +# define sk_OPENSSL_PSTRING_find_ex(st, val) sk_find_ex((_STACK *)CHECKED_CONST_PTR_OF(STACK_OF(OPENSSL_PSTRING), st), CHECKED_CONST_PTR_OF(OPENSSL_STRING, val)) +# define sk_OPENSSL_PSTRING_delete(st, i) SKM_sk_delete(OPENSSL_PSTRING, (st), (i)) +# define sk_OPENSSL_PSTRING_delete_ptr(st, ptr) (OPENSSL_PSTRING *)sk_delete_ptr(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_PTR_OF(OPENSSL_STRING, ptr)) +# define sk_OPENSSL_PSTRING_set_cmp_func(st, cmp) \ + ((int (*)(const OPENSSL_STRING * const *,const OPENSSL_STRING * const *)) \ + sk_set_cmp_func(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_SK_CMP_FUNC(OPENSSL_STRING, cmp))) +# define sk_OPENSSL_PSTRING_dup(st) SKM_sk_dup(OPENSSL_PSTRING, st) +# define sk_OPENSSL_PSTRING_shift(st) SKM_sk_shift(OPENSSL_PSTRING, (st)) +# define sk_OPENSSL_PSTRING_pop(st) (OPENSSL_STRING *)sk_pop(CHECKED_STACK_OF(OPENSSL_PSTRING, st)) +# define sk_OPENSSL_PSTRING_sort(st) SKM_sk_sort(OPENSSL_PSTRING, (st)) +# define sk_OPENSSL_PSTRING_is_sorted(st) SKM_sk_is_sorted(OPENSSL_PSTRING, (st)) +# define d2i_ASN1_SET_OF_ACCESS_DESCRIPTION(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(ACCESS_DESCRIPTION, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_ACCESS_DESCRIPTION(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(ACCESS_DESCRIPTION, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_ACCESS_DESCRIPTION(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(ACCESS_DESCRIPTION, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_ACCESS_DESCRIPTION(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(ACCESS_DESCRIPTION, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_ASN1_INTEGER(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(ASN1_INTEGER, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_ASN1_INTEGER(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(ASN1_INTEGER, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_ASN1_INTEGER(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(ASN1_INTEGER, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_ASN1_INTEGER(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(ASN1_INTEGER, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_ASN1_OBJECT(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(ASN1_OBJECT, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_ASN1_OBJECT(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(ASN1_OBJECT, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_ASN1_OBJECT(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(ASN1_OBJECT, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_ASN1_OBJECT(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(ASN1_OBJECT, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_ASN1_TYPE(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(ASN1_TYPE, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_ASN1_TYPE(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(ASN1_TYPE, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_ASN1_TYPE(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(ASN1_TYPE, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_ASN1_TYPE(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(ASN1_TYPE, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_ASN1_UTF8STRING(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(ASN1_UTF8STRING, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_ASN1_UTF8STRING(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(ASN1_UTF8STRING, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_ASN1_UTF8STRING(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(ASN1_UTF8STRING, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_ASN1_UTF8STRING(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(ASN1_UTF8STRING, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_DIST_POINT(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(DIST_POINT, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_DIST_POINT(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(DIST_POINT, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_DIST_POINT(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(DIST_POINT, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_DIST_POINT(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(DIST_POINT, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_ESS_CERT_ID(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(ESS_CERT_ID, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_ESS_CERT_ID(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(ESS_CERT_ID, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_ESS_CERT_ID(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(ESS_CERT_ID, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_ESS_CERT_ID(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(ESS_CERT_ID, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_EVP_MD(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(EVP_MD, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_EVP_MD(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(EVP_MD, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_EVP_MD(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(EVP_MD, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_EVP_MD(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(EVP_MD, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_GENERAL_NAME(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(GENERAL_NAME, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_GENERAL_NAME(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(GENERAL_NAME, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_GENERAL_NAME(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(GENERAL_NAME, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_GENERAL_NAME(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(GENERAL_NAME, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_OCSP_ONEREQ(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(OCSP_ONEREQ, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_OCSP_ONEREQ(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(OCSP_ONEREQ, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_OCSP_ONEREQ(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(OCSP_ONEREQ, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_OCSP_ONEREQ(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(OCSP_ONEREQ, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_OCSP_SINGLERESP(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(OCSP_SINGLERESP, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_OCSP_SINGLERESP(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(OCSP_SINGLERESP, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_OCSP_SINGLERESP(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(OCSP_SINGLERESP, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_OCSP_SINGLERESP(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(OCSP_SINGLERESP, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_PKCS12_SAFEBAG(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(PKCS12_SAFEBAG, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_PKCS12_SAFEBAG(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(PKCS12_SAFEBAG, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_PKCS12_SAFEBAG(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(PKCS12_SAFEBAG, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_PKCS12_SAFEBAG(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(PKCS12_SAFEBAG, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_PKCS7(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(PKCS7, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_PKCS7(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(PKCS7, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_PKCS7(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(PKCS7, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_PKCS7(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(PKCS7, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_PKCS7_RECIP_INFO(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(PKCS7_RECIP_INFO, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_PKCS7_RECIP_INFO(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(PKCS7_RECIP_INFO, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_PKCS7_RECIP_INFO(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(PKCS7_RECIP_INFO, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_PKCS7_RECIP_INFO(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(PKCS7_RECIP_INFO, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_PKCS7_SIGNER_INFO(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(PKCS7_SIGNER_INFO, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_PKCS7_SIGNER_INFO(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(PKCS7_SIGNER_INFO, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_PKCS7_SIGNER_INFO(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(PKCS7_SIGNER_INFO, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_PKCS7_SIGNER_INFO(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(PKCS7_SIGNER_INFO, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_POLICYINFO(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(POLICYINFO, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_POLICYINFO(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(POLICYINFO, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_POLICYINFO(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(POLICYINFO, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_POLICYINFO(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(POLICYINFO, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_POLICYQUALINFO(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(POLICYQUALINFO, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_POLICYQUALINFO(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(POLICYQUALINFO, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_POLICYQUALINFO(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(POLICYQUALINFO, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_POLICYQUALINFO(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(POLICYQUALINFO, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_SXNETID(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(SXNETID, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_SXNETID(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(SXNETID, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_SXNETID(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(SXNETID, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_SXNETID(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(SXNETID, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_X509(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(X509, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_X509(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(X509, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_X509(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(X509, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_X509(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(X509, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_X509_ALGOR(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(X509_ALGOR, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_X509_ALGOR(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(X509_ALGOR, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_X509_ALGOR(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(X509_ALGOR, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_X509_ALGOR(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(X509_ALGOR, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_X509_ATTRIBUTE(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(X509_ATTRIBUTE, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_X509_ATTRIBUTE(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(X509_ATTRIBUTE, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_X509_ATTRIBUTE(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(X509_ATTRIBUTE, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_X509_ATTRIBUTE(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(X509_ATTRIBUTE, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_X509_CRL(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(X509_CRL, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_X509_CRL(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(X509_CRL, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_X509_CRL(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(X509_CRL, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_X509_CRL(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(X509_CRL, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_X509_EXTENSION(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(X509_EXTENSION, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_X509_EXTENSION(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(X509_EXTENSION, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_X509_EXTENSION(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(X509_EXTENSION, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_X509_EXTENSION(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(X509_EXTENSION, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_X509_NAME_ENTRY(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(X509_NAME_ENTRY, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_X509_NAME_ENTRY(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(X509_NAME_ENTRY, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_X509_NAME_ENTRY(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(X509_NAME_ENTRY, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_X509_NAME_ENTRY(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(X509_NAME_ENTRY, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_X509_REVOKED(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(X509_REVOKED, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_X509_REVOKED(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(X509_REVOKED, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_X509_REVOKED(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(X509_REVOKED, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_X509_REVOKED(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(X509_REVOKED, (buf), (len), (d2i_func), (free_func)) +# define PKCS12_decrypt_d2i_PKCS12_SAFEBAG(algor, d2i_func, free_func, pass, passlen, oct, seq) \ + SKM_PKCS12_decrypt_d2i(PKCS12_SAFEBAG, (algor), (d2i_func), (free_func), (pass), (passlen), (oct), (seq)) +# define PKCS12_decrypt_d2i_PKCS7(algor, d2i_func, free_func, pass, passlen, oct, seq) \ + SKM_PKCS12_decrypt_d2i(PKCS7, (algor), (d2i_func), (free_func), (pass), (passlen), (oct), (seq)) +# define lh_ADDED_OBJ_new() LHM_lh_new(ADDED_OBJ,added_obj) +# define lh_ADDED_OBJ_insert(lh,inst) LHM_lh_insert(ADDED_OBJ,lh,inst) +# define lh_ADDED_OBJ_retrieve(lh,inst) LHM_lh_retrieve(ADDED_OBJ,lh,inst) +# define lh_ADDED_OBJ_delete(lh,inst) LHM_lh_delete(ADDED_OBJ,lh,inst) +# define lh_ADDED_OBJ_doall(lh,fn) LHM_lh_doall(ADDED_OBJ,lh,fn) +# define lh_ADDED_OBJ_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(ADDED_OBJ,lh,fn,arg_type,arg) +# define lh_ADDED_OBJ_error(lh) LHM_lh_error(ADDED_OBJ,lh) +# define lh_ADDED_OBJ_num_items(lh) LHM_lh_num_items(ADDED_OBJ,lh) +# define lh_ADDED_OBJ_down_load(lh) LHM_lh_down_load(ADDED_OBJ,lh) +# define lh_ADDED_OBJ_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(ADDED_OBJ,lh,out) +# define lh_ADDED_OBJ_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(ADDED_OBJ,lh,out) +# define lh_ADDED_OBJ_stats_bio(lh,out) \ + LHM_lh_stats_bio(ADDED_OBJ,lh,out) +# define lh_ADDED_OBJ_free(lh) LHM_lh_free(ADDED_OBJ,lh) +# define lh_APP_INFO_new() LHM_lh_new(APP_INFO,app_info) +# define lh_APP_INFO_insert(lh,inst) LHM_lh_insert(APP_INFO,lh,inst) +# define lh_APP_INFO_retrieve(lh,inst) LHM_lh_retrieve(APP_INFO,lh,inst) +# define lh_APP_INFO_delete(lh,inst) LHM_lh_delete(APP_INFO,lh,inst) +# define lh_APP_INFO_doall(lh,fn) LHM_lh_doall(APP_INFO,lh,fn) +# define lh_APP_INFO_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(APP_INFO,lh,fn,arg_type,arg) +# define lh_APP_INFO_error(lh) LHM_lh_error(APP_INFO,lh) +# define lh_APP_INFO_num_items(lh) LHM_lh_num_items(APP_INFO,lh) +# define lh_APP_INFO_down_load(lh) LHM_lh_down_load(APP_INFO,lh) +# define lh_APP_INFO_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(APP_INFO,lh,out) +# define lh_APP_INFO_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(APP_INFO,lh,out) +# define lh_APP_INFO_stats_bio(lh,out) \ + LHM_lh_stats_bio(APP_INFO,lh,out) +# define lh_APP_INFO_free(lh) LHM_lh_free(APP_INFO,lh) +# define lh_CONF_VALUE_new() LHM_lh_new(CONF_VALUE,conf_value) +# define lh_CONF_VALUE_insert(lh,inst) LHM_lh_insert(CONF_VALUE,lh,inst) +# define lh_CONF_VALUE_retrieve(lh,inst) LHM_lh_retrieve(CONF_VALUE,lh,inst) +# define lh_CONF_VALUE_delete(lh,inst) LHM_lh_delete(CONF_VALUE,lh,inst) +# define lh_CONF_VALUE_doall(lh,fn) LHM_lh_doall(CONF_VALUE,lh,fn) +# define lh_CONF_VALUE_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(CONF_VALUE,lh,fn,arg_type,arg) +# define lh_CONF_VALUE_error(lh) LHM_lh_error(CONF_VALUE,lh) +# define lh_CONF_VALUE_num_items(lh) LHM_lh_num_items(CONF_VALUE,lh) +# define lh_CONF_VALUE_down_load(lh) LHM_lh_down_load(CONF_VALUE,lh) +# define lh_CONF_VALUE_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(CONF_VALUE,lh,out) +# define lh_CONF_VALUE_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(CONF_VALUE,lh,out) +# define lh_CONF_VALUE_stats_bio(lh,out) \ + LHM_lh_stats_bio(CONF_VALUE,lh,out) +# define lh_CONF_VALUE_free(lh) LHM_lh_free(CONF_VALUE,lh) +# define lh_ENGINE_PILE_new() LHM_lh_new(ENGINE_PILE,engine_pile) +# define lh_ENGINE_PILE_insert(lh,inst) LHM_lh_insert(ENGINE_PILE,lh,inst) +# define lh_ENGINE_PILE_retrieve(lh,inst) LHM_lh_retrieve(ENGINE_PILE,lh,inst) +# define lh_ENGINE_PILE_delete(lh,inst) LHM_lh_delete(ENGINE_PILE,lh,inst) +# define lh_ENGINE_PILE_doall(lh,fn) LHM_lh_doall(ENGINE_PILE,lh,fn) +# define lh_ENGINE_PILE_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(ENGINE_PILE,lh,fn,arg_type,arg) +# define lh_ENGINE_PILE_error(lh) LHM_lh_error(ENGINE_PILE,lh) +# define lh_ENGINE_PILE_num_items(lh) LHM_lh_num_items(ENGINE_PILE,lh) +# define lh_ENGINE_PILE_down_load(lh) LHM_lh_down_load(ENGINE_PILE,lh) +# define lh_ENGINE_PILE_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(ENGINE_PILE,lh,out) +# define lh_ENGINE_PILE_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(ENGINE_PILE,lh,out) +# define lh_ENGINE_PILE_stats_bio(lh,out) \ + LHM_lh_stats_bio(ENGINE_PILE,lh,out) +# define lh_ENGINE_PILE_free(lh) LHM_lh_free(ENGINE_PILE,lh) +# define lh_ERR_STATE_new() LHM_lh_new(ERR_STATE,err_state) +# define lh_ERR_STATE_insert(lh,inst) LHM_lh_insert(ERR_STATE,lh,inst) +# define lh_ERR_STATE_retrieve(lh,inst) LHM_lh_retrieve(ERR_STATE,lh,inst) +# define lh_ERR_STATE_delete(lh,inst) LHM_lh_delete(ERR_STATE,lh,inst) +# define lh_ERR_STATE_doall(lh,fn) LHM_lh_doall(ERR_STATE,lh,fn) +# define lh_ERR_STATE_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(ERR_STATE,lh,fn,arg_type,arg) +# define lh_ERR_STATE_error(lh) LHM_lh_error(ERR_STATE,lh) +# define lh_ERR_STATE_num_items(lh) LHM_lh_num_items(ERR_STATE,lh) +# define lh_ERR_STATE_down_load(lh) LHM_lh_down_load(ERR_STATE,lh) +# define lh_ERR_STATE_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(ERR_STATE,lh,out) +# define lh_ERR_STATE_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(ERR_STATE,lh,out) +# define lh_ERR_STATE_stats_bio(lh,out) \ + LHM_lh_stats_bio(ERR_STATE,lh,out) +# define lh_ERR_STATE_free(lh) LHM_lh_free(ERR_STATE,lh) +# define lh_ERR_STRING_DATA_new() LHM_lh_new(ERR_STRING_DATA,err_string_data) +# define lh_ERR_STRING_DATA_insert(lh,inst) LHM_lh_insert(ERR_STRING_DATA,lh,inst) +# define lh_ERR_STRING_DATA_retrieve(lh,inst) LHM_lh_retrieve(ERR_STRING_DATA,lh,inst) +# define lh_ERR_STRING_DATA_delete(lh,inst) LHM_lh_delete(ERR_STRING_DATA,lh,inst) +# define lh_ERR_STRING_DATA_doall(lh,fn) LHM_lh_doall(ERR_STRING_DATA,lh,fn) +# define lh_ERR_STRING_DATA_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(ERR_STRING_DATA,lh,fn,arg_type,arg) +# define lh_ERR_STRING_DATA_error(lh) LHM_lh_error(ERR_STRING_DATA,lh) +# define lh_ERR_STRING_DATA_num_items(lh) LHM_lh_num_items(ERR_STRING_DATA,lh) +# define lh_ERR_STRING_DATA_down_load(lh) LHM_lh_down_load(ERR_STRING_DATA,lh) +# define lh_ERR_STRING_DATA_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(ERR_STRING_DATA,lh,out) +# define lh_ERR_STRING_DATA_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(ERR_STRING_DATA,lh,out) +# define lh_ERR_STRING_DATA_stats_bio(lh,out) \ + LHM_lh_stats_bio(ERR_STRING_DATA,lh,out) +# define lh_ERR_STRING_DATA_free(lh) LHM_lh_free(ERR_STRING_DATA,lh) +# define lh_EX_CLASS_ITEM_new() LHM_lh_new(EX_CLASS_ITEM,ex_class_item) +# define lh_EX_CLASS_ITEM_insert(lh,inst) LHM_lh_insert(EX_CLASS_ITEM,lh,inst) +# define lh_EX_CLASS_ITEM_retrieve(lh,inst) LHM_lh_retrieve(EX_CLASS_ITEM,lh,inst) +# define lh_EX_CLASS_ITEM_delete(lh,inst) LHM_lh_delete(EX_CLASS_ITEM,lh,inst) +# define lh_EX_CLASS_ITEM_doall(lh,fn) LHM_lh_doall(EX_CLASS_ITEM,lh,fn) +# define lh_EX_CLASS_ITEM_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(EX_CLASS_ITEM,lh,fn,arg_type,arg) +# define lh_EX_CLASS_ITEM_error(lh) LHM_lh_error(EX_CLASS_ITEM,lh) +# define lh_EX_CLASS_ITEM_num_items(lh) LHM_lh_num_items(EX_CLASS_ITEM,lh) +# define lh_EX_CLASS_ITEM_down_load(lh) LHM_lh_down_load(EX_CLASS_ITEM,lh) +# define lh_EX_CLASS_ITEM_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(EX_CLASS_ITEM,lh,out) +# define lh_EX_CLASS_ITEM_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(EX_CLASS_ITEM,lh,out) +# define lh_EX_CLASS_ITEM_stats_bio(lh,out) \ + LHM_lh_stats_bio(EX_CLASS_ITEM,lh,out) +# define lh_EX_CLASS_ITEM_free(lh) LHM_lh_free(EX_CLASS_ITEM,lh) +# define lh_FUNCTION_new() LHM_lh_new(FUNCTION,function) +# define lh_FUNCTION_insert(lh,inst) LHM_lh_insert(FUNCTION,lh,inst) +# define lh_FUNCTION_retrieve(lh,inst) LHM_lh_retrieve(FUNCTION,lh,inst) +# define lh_FUNCTION_delete(lh,inst) LHM_lh_delete(FUNCTION,lh,inst) +# define lh_FUNCTION_doall(lh,fn) LHM_lh_doall(FUNCTION,lh,fn) +# define lh_FUNCTION_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(FUNCTION,lh,fn,arg_type,arg) +# define lh_FUNCTION_error(lh) LHM_lh_error(FUNCTION,lh) +# define lh_FUNCTION_num_items(lh) LHM_lh_num_items(FUNCTION,lh) +# define lh_FUNCTION_down_load(lh) LHM_lh_down_load(FUNCTION,lh) +# define lh_FUNCTION_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(FUNCTION,lh,out) +# define lh_FUNCTION_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(FUNCTION,lh,out) +# define lh_FUNCTION_stats_bio(lh,out) \ + LHM_lh_stats_bio(FUNCTION,lh,out) +# define lh_FUNCTION_free(lh) LHM_lh_free(FUNCTION,lh) +# define lh_MEM_new() LHM_lh_new(MEM,mem) +# define lh_MEM_insert(lh,inst) LHM_lh_insert(MEM,lh,inst) +# define lh_MEM_retrieve(lh,inst) LHM_lh_retrieve(MEM,lh,inst) +# define lh_MEM_delete(lh,inst) LHM_lh_delete(MEM,lh,inst) +# define lh_MEM_doall(lh,fn) LHM_lh_doall(MEM,lh,fn) +# define lh_MEM_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(MEM,lh,fn,arg_type,arg) +# define lh_MEM_error(lh) LHM_lh_error(MEM,lh) +# define lh_MEM_num_items(lh) LHM_lh_num_items(MEM,lh) +# define lh_MEM_down_load(lh) LHM_lh_down_load(MEM,lh) +# define lh_MEM_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(MEM,lh,out) +# define lh_MEM_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(MEM,lh,out) +# define lh_MEM_stats_bio(lh,out) \ + LHM_lh_stats_bio(MEM,lh,out) +# define lh_MEM_free(lh) LHM_lh_free(MEM,lh) +# define lh_OBJ_NAME_new() LHM_lh_new(OBJ_NAME,obj_name) +# define lh_OBJ_NAME_insert(lh,inst) LHM_lh_insert(OBJ_NAME,lh,inst) +# define lh_OBJ_NAME_retrieve(lh,inst) LHM_lh_retrieve(OBJ_NAME,lh,inst) +# define lh_OBJ_NAME_delete(lh,inst) LHM_lh_delete(OBJ_NAME,lh,inst) +# define lh_OBJ_NAME_doall(lh,fn) LHM_lh_doall(OBJ_NAME,lh,fn) +# define lh_OBJ_NAME_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(OBJ_NAME,lh,fn,arg_type,arg) +# define lh_OBJ_NAME_error(lh) LHM_lh_error(OBJ_NAME,lh) +# define lh_OBJ_NAME_num_items(lh) LHM_lh_num_items(OBJ_NAME,lh) +# define lh_OBJ_NAME_down_load(lh) LHM_lh_down_load(OBJ_NAME,lh) +# define lh_OBJ_NAME_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(OBJ_NAME,lh,out) +# define lh_OBJ_NAME_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(OBJ_NAME,lh,out) +# define lh_OBJ_NAME_stats_bio(lh,out) \ + LHM_lh_stats_bio(OBJ_NAME,lh,out) +# define lh_OBJ_NAME_free(lh) LHM_lh_free(OBJ_NAME,lh) +# define lh_OPENSSL_CSTRING_new() LHM_lh_new(OPENSSL_CSTRING,openssl_cstring) +# define lh_OPENSSL_CSTRING_insert(lh,inst) LHM_lh_insert(OPENSSL_CSTRING,lh,inst) +# define lh_OPENSSL_CSTRING_retrieve(lh,inst) LHM_lh_retrieve(OPENSSL_CSTRING,lh,inst) +# define lh_OPENSSL_CSTRING_delete(lh,inst) LHM_lh_delete(OPENSSL_CSTRING,lh,inst) +# define lh_OPENSSL_CSTRING_doall(lh,fn) LHM_lh_doall(OPENSSL_CSTRING,lh,fn) +# define lh_OPENSSL_CSTRING_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(OPENSSL_CSTRING,lh,fn,arg_type,arg) +# define lh_OPENSSL_CSTRING_error(lh) LHM_lh_error(OPENSSL_CSTRING,lh) +# define lh_OPENSSL_CSTRING_num_items(lh) LHM_lh_num_items(OPENSSL_CSTRING,lh) +# define lh_OPENSSL_CSTRING_down_load(lh) LHM_lh_down_load(OPENSSL_CSTRING,lh) +# define lh_OPENSSL_CSTRING_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(OPENSSL_CSTRING,lh,out) +# define lh_OPENSSL_CSTRING_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(OPENSSL_CSTRING,lh,out) +# define lh_OPENSSL_CSTRING_stats_bio(lh,out) \ + LHM_lh_stats_bio(OPENSSL_CSTRING,lh,out) +# define lh_OPENSSL_CSTRING_free(lh) LHM_lh_free(OPENSSL_CSTRING,lh) +# define lh_OPENSSL_STRING_new() LHM_lh_new(OPENSSL_STRING,openssl_string) +# define lh_OPENSSL_STRING_insert(lh,inst) LHM_lh_insert(OPENSSL_STRING,lh,inst) +# define lh_OPENSSL_STRING_retrieve(lh,inst) LHM_lh_retrieve(OPENSSL_STRING,lh,inst) +# define lh_OPENSSL_STRING_delete(lh,inst) LHM_lh_delete(OPENSSL_STRING,lh,inst) +# define lh_OPENSSL_STRING_doall(lh,fn) LHM_lh_doall(OPENSSL_STRING,lh,fn) +# define lh_OPENSSL_STRING_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(OPENSSL_STRING,lh,fn,arg_type,arg) +# define lh_OPENSSL_STRING_error(lh) LHM_lh_error(OPENSSL_STRING,lh) +# define lh_OPENSSL_STRING_num_items(lh) LHM_lh_num_items(OPENSSL_STRING,lh) +# define lh_OPENSSL_STRING_down_load(lh) LHM_lh_down_load(OPENSSL_STRING,lh) +# define lh_OPENSSL_STRING_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(OPENSSL_STRING,lh,out) +# define lh_OPENSSL_STRING_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(OPENSSL_STRING,lh,out) +# define lh_OPENSSL_STRING_stats_bio(lh,out) \ + LHM_lh_stats_bio(OPENSSL_STRING,lh,out) +# define lh_OPENSSL_STRING_free(lh) LHM_lh_free(OPENSSL_STRING,lh) +# define lh_SSL_SESSION_new() LHM_lh_new(SSL_SESSION,ssl_session) +# define lh_SSL_SESSION_insert(lh,inst) LHM_lh_insert(SSL_SESSION,lh,inst) +# define lh_SSL_SESSION_retrieve(lh,inst) LHM_lh_retrieve(SSL_SESSION,lh,inst) +# define lh_SSL_SESSION_delete(lh,inst) LHM_lh_delete(SSL_SESSION,lh,inst) +# define lh_SSL_SESSION_doall(lh,fn) LHM_lh_doall(SSL_SESSION,lh,fn) +# define lh_SSL_SESSION_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(SSL_SESSION,lh,fn,arg_type,arg) +# define lh_SSL_SESSION_error(lh) LHM_lh_error(SSL_SESSION,lh) +# define lh_SSL_SESSION_num_items(lh) LHM_lh_num_items(SSL_SESSION,lh) +# define lh_SSL_SESSION_down_load(lh) LHM_lh_down_load(SSL_SESSION,lh) +# define lh_SSL_SESSION_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(SSL_SESSION,lh,out) +# define lh_SSL_SESSION_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(SSL_SESSION,lh,out) +# define lh_SSL_SESSION_stats_bio(lh,out) \ + LHM_lh_stats_bio(SSL_SESSION,lh,out) +# define lh_SSL_SESSION_free(lh) LHM_lh_free(SSL_SESSION,lh) +#ifdef __cplusplus +} +#endif +#endif /* !defined HEADER_SAFESTACK_H */ diff --git a/hdssd/external/win/openssl/include/openssl/seed.h b/hdssd/external/win/openssl/include/openssl/seed.h new file mode 100644 index 0000000..8cbf0d9 --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/seed.h @@ -0,0 +1,149 @@ +/* + * Copyright (c) 2007 KISA(Korea Information Security Agency). All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Neither the name of author nor the names of its contributors may + * be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY 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 + * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ +/* ==================================================================== + * Copyright (c) 1998-2007 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_SEED_H +# define HEADER_SEED_H + +# include +# include +# include + +# ifdef OPENSSL_NO_SEED +# error SEED is disabled. +# endif + +/* look whether we need 'long' to get 32 bits */ +# ifdef AES_LONG +# ifndef SEED_LONG +# define SEED_LONG 1 +# endif +# endif + +# if !defined(NO_SYS_TYPES_H) +# include +# endif + +# define SEED_BLOCK_SIZE 16 +# define SEED_KEY_LENGTH 16 + + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct seed_key_st { +# ifdef SEED_LONG + unsigned long data[32]; +# else + unsigned int data[32]; +# endif +} SEED_KEY_SCHEDULE; + +# ifdef OPENSSL_FIPS +void private_SEED_set_key(const unsigned char rawkey[SEED_KEY_LENGTH], + SEED_KEY_SCHEDULE *ks); +# endif +void SEED_set_key(const unsigned char rawkey[SEED_KEY_LENGTH], + SEED_KEY_SCHEDULE *ks); + +void SEED_encrypt(const unsigned char s[SEED_BLOCK_SIZE], + unsigned char d[SEED_BLOCK_SIZE], + const SEED_KEY_SCHEDULE *ks); +void SEED_decrypt(const unsigned char s[SEED_BLOCK_SIZE], + unsigned char d[SEED_BLOCK_SIZE], + const SEED_KEY_SCHEDULE *ks); + +void SEED_ecb_encrypt(const unsigned char *in, unsigned char *out, + const SEED_KEY_SCHEDULE *ks, int enc); +void SEED_cbc_encrypt(const unsigned char *in, unsigned char *out, size_t len, + const SEED_KEY_SCHEDULE *ks, + unsigned char ivec[SEED_BLOCK_SIZE], int enc); +void SEED_cfb128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const SEED_KEY_SCHEDULE *ks, + unsigned char ivec[SEED_BLOCK_SIZE], int *num, + int enc); +void SEED_ofb128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const SEED_KEY_SCHEDULE *ks, + unsigned char ivec[SEED_BLOCK_SIZE], int *num); + +#ifdef __cplusplus +} +#endif + +#endif /* HEADER_SEED_H */ diff --git a/hdssd/external/win/openssl/include/openssl/sha.h b/hdssd/external/win/openssl/include/openssl/sha.h new file mode 100644 index 0000000..e5169e4 --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/sha.h @@ -0,0 +1,214 @@ +/* crypto/sha/sha.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_SHA_H +# define HEADER_SHA_H + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# if defined(OPENSSL_NO_SHA) || (defined(OPENSSL_NO_SHA0) && defined(OPENSSL_NO_SHA1)) +# error SHA is disabled. +# endif + +# if defined(OPENSSL_FIPS) +# define FIPS_SHA_SIZE_T size_t +# endif + +/*- + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + * ! SHA_LONG has to be at least 32 bits wide. If it's wider, then ! + * ! SHA_LONG_LOG2 has to be defined along. ! + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + */ + +# if defined(__LP32__) +# define SHA_LONG unsigned long +# elif defined(OPENSSL_SYS_CRAY) || defined(__ILP64__) +# define SHA_LONG unsigned long +# define SHA_LONG_LOG2 3 +# else +# define SHA_LONG unsigned int +# endif + +# define SHA_LBLOCK 16 +# define SHA_CBLOCK (SHA_LBLOCK*4)/* SHA treats input data as a + * contiguous array of 32 bit wide + * big-endian values. */ +# define SHA_LAST_BLOCK (SHA_CBLOCK-8) +# define SHA_DIGEST_LENGTH 20 + +typedef struct SHAstate_st { + SHA_LONG h0, h1, h2, h3, h4; + SHA_LONG Nl, Nh; + SHA_LONG data[SHA_LBLOCK]; + unsigned int num; +} SHA_CTX; + +# ifndef OPENSSL_NO_SHA0 +# ifdef OPENSSL_FIPS +int private_SHA_Init(SHA_CTX *c); +# endif +int SHA_Init(SHA_CTX *c); +int SHA_Update(SHA_CTX *c, const void *data, size_t len); +int SHA_Final(unsigned char *md, SHA_CTX *c); +unsigned char *SHA(const unsigned char *d, size_t n, unsigned char *md); +void SHA_Transform(SHA_CTX *c, const unsigned char *data); +# endif +# ifndef OPENSSL_NO_SHA1 +# ifdef OPENSSL_FIPS +int private_SHA1_Init(SHA_CTX *c); +# endif +int SHA1_Init(SHA_CTX *c); +int SHA1_Update(SHA_CTX *c, const void *data, size_t len); +int SHA1_Final(unsigned char *md, SHA_CTX *c); +unsigned char *SHA1(const unsigned char *d, size_t n, unsigned char *md); +void SHA1_Transform(SHA_CTX *c, const unsigned char *data); +# endif + +# define SHA256_CBLOCK (SHA_LBLOCK*4)/* SHA-256 treats input data as a + * contiguous array of 32 bit wide + * big-endian values. */ +# define SHA224_DIGEST_LENGTH 28 +# define SHA256_DIGEST_LENGTH 32 + +typedef struct SHA256state_st { + SHA_LONG h[8]; + SHA_LONG Nl, Nh; + SHA_LONG data[SHA_LBLOCK]; + unsigned int num, md_len; +} SHA256_CTX; + +# ifndef OPENSSL_NO_SHA256 +# ifdef OPENSSL_FIPS +int private_SHA224_Init(SHA256_CTX *c); +int private_SHA256_Init(SHA256_CTX *c); +# endif +int SHA224_Init(SHA256_CTX *c); +int SHA224_Update(SHA256_CTX *c, const void *data, size_t len); +int SHA224_Final(unsigned char *md, SHA256_CTX *c); +unsigned char *SHA224(const unsigned char *d, size_t n, unsigned char *md); +int SHA256_Init(SHA256_CTX *c); +int SHA256_Update(SHA256_CTX *c, const void *data, size_t len); +int SHA256_Final(unsigned char *md, SHA256_CTX *c); +unsigned char *SHA256(const unsigned char *d, size_t n, unsigned char *md); +void SHA256_Transform(SHA256_CTX *c, const unsigned char *data); +# endif + +# define SHA384_DIGEST_LENGTH 48 +# define SHA512_DIGEST_LENGTH 64 + +# ifndef OPENSSL_NO_SHA512 +/* + * Unlike 32-bit digest algorithms, SHA-512 *relies* on SHA_LONG64 + * being exactly 64-bit wide. See Implementation Notes in sha512.c + * for further details. + */ +/* + * SHA-512 treats input data as a + * contiguous array of 64 bit + * wide big-endian values. + */ +# define SHA512_CBLOCK (SHA_LBLOCK*8) +# if (defined(_WIN32) || defined(_WIN64)) && !defined(__MINGW32__) +# define SHA_LONG64 unsigned __int64 +# define U64(C) C##UI64 +# elif defined(__arch64__) +# define SHA_LONG64 unsigned long +# define U64(C) C##UL +# else +# define SHA_LONG64 unsigned long long +# define U64(C) C##ULL +# endif + +typedef struct SHA512state_st { + SHA_LONG64 h[8]; + SHA_LONG64 Nl, Nh; + union { + SHA_LONG64 d[SHA_LBLOCK]; + unsigned char p[SHA512_CBLOCK]; + } u; + unsigned int num, md_len; +} SHA512_CTX; +# endif + +# ifndef OPENSSL_NO_SHA512 +# ifdef OPENSSL_FIPS +int private_SHA384_Init(SHA512_CTX *c); +int private_SHA512_Init(SHA512_CTX *c); +# endif +int SHA384_Init(SHA512_CTX *c); +int SHA384_Update(SHA512_CTX *c, const void *data, size_t len); +int SHA384_Final(unsigned char *md, SHA512_CTX *c); +unsigned char *SHA384(const unsigned char *d, size_t n, unsigned char *md); +int SHA512_Init(SHA512_CTX *c); +int SHA512_Update(SHA512_CTX *c, const void *data, size_t len); +int SHA512_Final(unsigned char *md, SHA512_CTX *c); +unsigned char *SHA512(const unsigned char *d, size_t n, unsigned char *md); +void SHA512_Transform(SHA512_CTX *c, const unsigned char *data); +# endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/win/openssl/include/openssl/srp.h b/hdssd/external/win/openssl/include/openssl/srp.h new file mode 100644 index 0000000..028892a --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/srp.h @@ -0,0 +1,179 @@ +/* crypto/srp/srp.h */ +/* + * Written by Christophe Renou (christophe.renou@edelweb.fr) with the + * precious help of Peter Sylvester (peter.sylvester@edelweb.fr) for the + * EdelKey project and contributed to the OpenSSL project 2004. + */ +/* ==================================================================== + * Copyright (c) 2004 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +#ifndef __SRP_H__ +# define __SRP_H__ + +# ifndef OPENSSL_NO_SRP + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# include +# include +# include + +typedef struct SRP_gN_cache_st { + char *b64_bn; + BIGNUM *bn; +} SRP_gN_cache; + + +DECLARE_STACK_OF(SRP_gN_cache) + +typedef struct SRP_user_pwd_st { + /* Owned by us. */ + char *id; + BIGNUM *s; + BIGNUM *v; + /* Not owned by us. */ + const BIGNUM *g; + const BIGNUM *N; + /* Owned by us. */ + char *info; +} SRP_user_pwd; + +DECLARE_STACK_OF(SRP_user_pwd) + +void SRP_user_pwd_free(SRP_user_pwd *user_pwd); + +typedef struct SRP_VBASE_st { + STACK_OF(SRP_user_pwd) *users_pwd; + STACK_OF(SRP_gN_cache) *gN_cache; +/* to simulate a user */ + char *seed_key; + BIGNUM *default_g; + BIGNUM *default_N; +} SRP_VBASE; + +/* + * Structure interne pour retenir les couples N et g + */ +typedef struct SRP_gN_st { + char *id; + BIGNUM *g; + BIGNUM *N; +} SRP_gN; + +DECLARE_STACK_OF(SRP_gN) + +SRP_VBASE *SRP_VBASE_new(char *seed_key); +int SRP_VBASE_free(SRP_VBASE *vb); +int SRP_VBASE_init(SRP_VBASE *vb, char *verifier_file); + +/* This method ignores the configured seed and fails for an unknown user. */ +SRP_user_pwd *SRP_VBASE_get_by_user(SRP_VBASE *vb, char *username); +/* NOTE: unlike in SRP_VBASE_get_by_user, caller owns the returned pointer.*/ +SRP_user_pwd *SRP_VBASE_get1_by_user(SRP_VBASE *vb, char *username); + +char *SRP_create_verifier(const char *user, const char *pass, char **salt, + char **verifier, const char *N, const char *g); +int SRP_create_verifier_BN(const char *user, const char *pass, BIGNUM **salt, + BIGNUM **verifier, BIGNUM *N, BIGNUM *g); + +# define SRP_NO_ERROR 0 +# define SRP_ERR_VBASE_INCOMPLETE_FILE 1 +# define SRP_ERR_VBASE_BN_LIB 2 +# define SRP_ERR_OPEN_FILE 3 +# define SRP_ERR_MEMORY 4 + +# define DB_srptype 0 +# define DB_srpverifier 1 +# define DB_srpsalt 2 +# define DB_srpid 3 +# define DB_srpgN 4 +# define DB_srpinfo 5 +# undef DB_NUMBER +# define DB_NUMBER 6 + +# define DB_SRP_INDEX 'I' +# define DB_SRP_VALID 'V' +# define DB_SRP_REVOKED 'R' +# define DB_SRP_MODIF 'v' + +/* see srp.c */ +char *SRP_check_known_gN_param(BIGNUM *g, BIGNUM *N); +SRP_gN *SRP_get_default_gN(const char *id); + +/* server side .... */ +BIGNUM *SRP_Calc_server_key(BIGNUM *A, BIGNUM *v, BIGNUM *u, BIGNUM *b, + BIGNUM *N); +BIGNUM *SRP_Calc_B(BIGNUM *b, BIGNUM *N, BIGNUM *g, BIGNUM *v); +int SRP_Verify_A_mod_N(BIGNUM *A, BIGNUM *N); +BIGNUM *SRP_Calc_u(BIGNUM *A, BIGNUM *B, BIGNUM *N); + +/* client side .... */ +BIGNUM *SRP_Calc_x(BIGNUM *s, const char *user, const char *pass); +BIGNUM *SRP_Calc_A(BIGNUM *a, BIGNUM *N, BIGNUM *g); +BIGNUM *SRP_Calc_client_key(BIGNUM *N, BIGNUM *B, BIGNUM *g, BIGNUM *x, + BIGNUM *a, BIGNUM *u); +int SRP_Verify_B_mod_N(BIGNUM *B, BIGNUM *N); + +# define SRP_MINIMAL_N 1024 + +#ifdef __cplusplus +} +#endif + +# endif +#endif diff --git a/hdssd/external/win/openssl/include/openssl/srtp.h b/hdssd/external/win/openssl/include/openssl/srtp.h new file mode 100644 index 0000000..2279c32 --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/srtp.h @@ -0,0 +1,147 @@ +/* ssl/srtp.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ +/* ==================================================================== + * Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +/* + * DTLS code by Eric Rescorla + * + * Copyright (C) 2006, Network Resonance, Inc. Copyright (C) 2011, RTFM, Inc. + */ + +#ifndef HEADER_D1_SRTP_H +# define HEADER_D1_SRTP_H + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# define SRTP_AES128_CM_SHA1_80 0x0001 +# define SRTP_AES128_CM_SHA1_32 0x0002 +# define SRTP_AES128_F8_SHA1_80 0x0003 +# define SRTP_AES128_F8_SHA1_32 0x0004 +# define SRTP_NULL_SHA1_80 0x0005 +# define SRTP_NULL_SHA1_32 0x0006 + +# ifndef OPENSSL_NO_SRTP + +int SSL_CTX_set_tlsext_use_srtp(SSL_CTX *ctx, const char *profiles); +int SSL_set_tlsext_use_srtp(SSL *ctx, const char *profiles); + +STACK_OF(SRTP_PROTECTION_PROFILE) *SSL_get_srtp_profiles(SSL *ssl); +SRTP_PROTECTION_PROFILE *SSL_get_selected_srtp_profile(SSL *s); + +# endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/win/openssl/include/openssl/ssl.h b/hdssd/external/win/openssl/include/openssl/ssl.h new file mode 100644 index 0000000..04d4007 --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/ssl.h @@ -0,0 +1,3169 @@ +/* ssl/ssl.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ +/* ==================================================================== + * Copyright (c) 1998-2007 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * ECC cipher suite support in OpenSSL originally developed by + * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project. + */ +/* ==================================================================== + * Copyright 2005 Nokia. All rights reserved. + * + * The portions of the attached software ("Contribution") is developed by + * Nokia Corporation and is licensed pursuant to the OpenSSL open source + * license. + * + * The Contribution, originally written by Mika Kousa and Pasi Eronen of + * Nokia Corporation, consists of the "PSK" (Pre-Shared Key) ciphersuites + * support (see RFC 4279) to OpenSSL. + * + * No patent licenses or other rights except those expressly stated in + * the OpenSSL open source license shall be deemed granted or received + * expressly, by implication, estoppel, or otherwise. + * + * No assurances are provided by Nokia that the Contribution does not + * infringe the patent or other intellectual property rights of any third + * party or that the license provides you with all the necessary rights + * to make use of the Contribution. + * + * THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. IN + * ADDITION TO THE DISCLAIMERS INCLUDED IN THE LICENSE, NOKIA + * SPECIFICALLY DISCLAIMS ANY LIABILITY FOR CLAIMS BROUGHT BY YOU OR ANY + * OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS OR + * OTHERWISE. + */ + +#ifndef HEADER_SSL_H +# define HEADER_SSL_H + +# include + +# ifndef OPENSSL_NO_COMP +# include +# endif +# ifndef OPENSSL_NO_BIO +# include +# endif +# ifndef OPENSSL_NO_DEPRECATED +# ifndef OPENSSL_NO_X509 +# include +# endif +# include +# include +# include +# endif +# include +# include + +# include +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* SSLeay version number for ASN.1 encoding of the session information */ +/*- + * Version 0 - initial version + * Version 1 - added the optional peer certificate + */ +# define SSL_SESSION_ASN1_VERSION 0x0001 + +/* text strings for the ciphers */ +# define SSL_TXT_NULL_WITH_MD5 SSL2_TXT_NULL_WITH_MD5 +# define SSL_TXT_RC4_128_WITH_MD5 SSL2_TXT_RC4_128_WITH_MD5 +# define SSL_TXT_RC4_128_EXPORT40_WITH_MD5 SSL2_TXT_RC4_128_EXPORT40_WITH_MD5 +# define SSL_TXT_RC2_128_CBC_WITH_MD5 SSL2_TXT_RC2_128_CBC_WITH_MD5 +# define SSL_TXT_RC2_128_CBC_EXPORT40_WITH_MD5 SSL2_TXT_RC2_128_CBC_EXPORT40_WITH_MD5 +# define SSL_TXT_IDEA_128_CBC_WITH_MD5 SSL2_TXT_IDEA_128_CBC_WITH_MD5 +# define SSL_TXT_DES_64_CBC_WITH_MD5 SSL2_TXT_DES_64_CBC_WITH_MD5 +# define SSL_TXT_DES_64_CBC_WITH_SHA SSL2_TXT_DES_64_CBC_WITH_SHA +# define SSL_TXT_DES_192_EDE3_CBC_WITH_MD5 SSL2_TXT_DES_192_EDE3_CBC_WITH_MD5 +# define SSL_TXT_DES_192_EDE3_CBC_WITH_SHA SSL2_TXT_DES_192_EDE3_CBC_WITH_SHA + +/* + * VRS Additional Kerberos5 entries + */ +# define SSL_TXT_KRB5_DES_64_CBC_SHA SSL3_TXT_KRB5_DES_64_CBC_SHA +# define SSL_TXT_KRB5_DES_192_CBC3_SHA SSL3_TXT_KRB5_DES_192_CBC3_SHA +# define SSL_TXT_KRB5_RC4_128_SHA SSL3_TXT_KRB5_RC4_128_SHA +# define SSL_TXT_KRB5_IDEA_128_CBC_SHA SSL3_TXT_KRB5_IDEA_128_CBC_SHA +# define SSL_TXT_KRB5_DES_64_CBC_MD5 SSL3_TXT_KRB5_DES_64_CBC_MD5 +# define SSL_TXT_KRB5_DES_192_CBC3_MD5 SSL3_TXT_KRB5_DES_192_CBC3_MD5 +# define SSL_TXT_KRB5_RC4_128_MD5 SSL3_TXT_KRB5_RC4_128_MD5 +# define SSL_TXT_KRB5_IDEA_128_CBC_MD5 SSL3_TXT_KRB5_IDEA_128_CBC_MD5 + +# define SSL_TXT_KRB5_DES_40_CBC_SHA SSL3_TXT_KRB5_DES_40_CBC_SHA +# define SSL_TXT_KRB5_RC2_40_CBC_SHA SSL3_TXT_KRB5_RC2_40_CBC_SHA +# define SSL_TXT_KRB5_RC4_40_SHA SSL3_TXT_KRB5_RC4_40_SHA +# define SSL_TXT_KRB5_DES_40_CBC_MD5 SSL3_TXT_KRB5_DES_40_CBC_MD5 +# define SSL_TXT_KRB5_RC2_40_CBC_MD5 SSL3_TXT_KRB5_RC2_40_CBC_MD5 +# define SSL_TXT_KRB5_RC4_40_MD5 SSL3_TXT_KRB5_RC4_40_MD5 + +# define SSL_TXT_KRB5_DES_40_CBC_SHA SSL3_TXT_KRB5_DES_40_CBC_SHA +# define SSL_TXT_KRB5_DES_40_CBC_MD5 SSL3_TXT_KRB5_DES_40_CBC_MD5 +# define SSL_TXT_KRB5_DES_64_CBC_SHA SSL3_TXT_KRB5_DES_64_CBC_SHA +# define SSL_TXT_KRB5_DES_64_CBC_MD5 SSL3_TXT_KRB5_DES_64_CBC_MD5 +# define SSL_TXT_KRB5_DES_192_CBC3_SHA SSL3_TXT_KRB5_DES_192_CBC3_SHA +# define SSL_TXT_KRB5_DES_192_CBC3_MD5 SSL3_TXT_KRB5_DES_192_CBC3_MD5 +# define SSL_MAX_KRB5_PRINCIPAL_LENGTH 256 + +# define SSL_MAX_SSL_SESSION_ID_LENGTH 32 +# define SSL_MAX_SID_CTX_LENGTH 32 + +# define SSL_MIN_RSA_MODULUS_LENGTH_IN_BYTES (512/8) +# define SSL_MAX_KEY_ARG_LENGTH 8 +# define SSL_MAX_MASTER_KEY_LENGTH 48 + +/* These are used to specify which ciphers to use and not to use */ + +# define SSL_TXT_EXP40 "EXPORT40" +# define SSL_TXT_EXP56 "EXPORT56" +# define SSL_TXT_LOW "LOW" +# define SSL_TXT_MEDIUM "MEDIUM" +# define SSL_TXT_HIGH "HIGH" +# define SSL_TXT_FIPS "FIPS" + +# define SSL_TXT_kFZA "kFZA"/* unused! */ +# define SSL_TXT_aFZA "aFZA"/* unused! */ +# define SSL_TXT_eFZA "eFZA"/* unused! */ +# define SSL_TXT_FZA "FZA"/* unused! */ + +# define SSL_TXT_aNULL "aNULL" +# define SSL_TXT_eNULL "eNULL" +# define SSL_TXT_NULL "NULL" + +# define SSL_TXT_kRSA "kRSA" +# define SSL_TXT_kDHr "kDHr" +# define SSL_TXT_kDHd "kDHd" +# define SSL_TXT_kDH "kDH" +# define SSL_TXT_kEDH "kEDH" +# define SSL_TXT_kDHE "kDHE"/* alias for kEDH */ +# define SSL_TXT_kKRB5 "kKRB5" +# define SSL_TXT_kECDHr "kECDHr" +# define SSL_TXT_kECDHe "kECDHe" +# define SSL_TXT_kECDH "kECDH" +# define SSL_TXT_kEECDH "kEECDH" +# define SSL_TXT_kECDHE "kECDHE"/* alias for kEECDH */ +# define SSL_TXT_kPSK "kPSK" +# define SSL_TXT_kGOST "kGOST" +# define SSL_TXT_kSRP "kSRP" + +# define SSL_TXT_aRSA "aRSA" +# define SSL_TXT_aDSS "aDSS" +# define SSL_TXT_aDH "aDH" +# define SSL_TXT_aECDH "aECDH" +# define SSL_TXT_aKRB5 "aKRB5" +# define SSL_TXT_aECDSA "aECDSA" +# define SSL_TXT_aPSK "aPSK" +# define SSL_TXT_aGOST94 "aGOST94" +# define SSL_TXT_aGOST01 "aGOST01" +# define SSL_TXT_aGOST "aGOST" +# define SSL_TXT_aSRP "aSRP" + +# define SSL_TXT_DSS "DSS" +# define SSL_TXT_DH "DH" +# define SSL_TXT_EDH "EDH"/* same as "kEDH:-ADH" */ +# define SSL_TXT_DHE "DHE"/* alias for EDH */ +# define SSL_TXT_ADH "ADH" +# define SSL_TXT_RSA "RSA" +# define SSL_TXT_ECDH "ECDH" +# define SSL_TXT_EECDH "EECDH"/* same as "kEECDH:-AECDH" */ +# define SSL_TXT_ECDHE "ECDHE"/* alias for ECDHE" */ +# define SSL_TXT_AECDH "AECDH" +# define SSL_TXT_ECDSA "ECDSA" +# define SSL_TXT_KRB5 "KRB5" +# define SSL_TXT_PSK "PSK" +# define SSL_TXT_SRP "SRP" + +# define SSL_TXT_DES "DES" +# define SSL_TXT_3DES "3DES" +# define SSL_TXT_RC4 "RC4" +# define SSL_TXT_RC2 "RC2" +# define SSL_TXT_IDEA "IDEA" +# define SSL_TXT_SEED "SEED" +# define SSL_TXT_AES128 "AES128" +# define SSL_TXT_AES256 "AES256" +# define SSL_TXT_AES "AES" +# define SSL_TXT_AES_GCM "AESGCM" +# define SSL_TXT_CAMELLIA128 "CAMELLIA128" +# define SSL_TXT_CAMELLIA256 "CAMELLIA256" +# define SSL_TXT_CAMELLIA "CAMELLIA" + +# define SSL_TXT_MD5 "MD5" +# define SSL_TXT_SHA1 "SHA1" +# define SSL_TXT_SHA "SHA"/* same as "SHA1" */ +# define SSL_TXT_GOST94 "GOST94" +# define SSL_TXT_GOST89MAC "GOST89MAC" +# define SSL_TXT_SHA256 "SHA256" +# define SSL_TXT_SHA384 "SHA384" + +# define SSL_TXT_SSLV2 "SSLv2" +# define SSL_TXT_SSLV3 "SSLv3" +# define SSL_TXT_TLSV1 "TLSv1" +# define SSL_TXT_TLSV1_1 "TLSv1.1" +# define SSL_TXT_TLSV1_2 "TLSv1.2" + +# define SSL_TXT_EXP "EXP" +# define SSL_TXT_EXPORT "EXPORT" + +# define SSL_TXT_ALL "ALL" + +/*- + * COMPLEMENTOF* definitions. These identifiers are used to (de-select) + * ciphers normally not being used. + * Example: "RC4" will activate all ciphers using RC4 including ciphers + * without authentication, which would normally disabled by DEFAULT (due + * the "!ADH" being part of default). Therefore "RC4:!COMPLEMENTOFDEFAULT" + * will make sure that it is also disabled in the specific selection. + * COMPLEMENTOF* identifiers are portable between version, as adjustments + * to the default cipher setup will also be included here. + * + * COMPLEMENTOFDEFAULT does not experience the same special treatment that + * DEFAULT gets, as only selection is being done and no sorting as needed + * for DEFAULT. + */ +# define SSL_TXT_CMPALL "COMPLEMENTOFALL" +# define SSL_TXT_CMPDEF "COMPLEMENTOFDEFAULT" + +/* + * The following cipher list is used by default. It also is substituted when + * an application-defined cipher list string starts with 'DEFAULT'. + */ +# define SSL_DEFAULT_CIPHER_LIST "ALL:!EXPORT:!aNULL:!eNULL:!SSLv2" +/* + * As of OpenSSL 1.0.0, ssl_create_cipher_list() in ssl/ssl_ciph.c always + * starts with a reasonable order, and all we have to do for DEFAULT is + * throwing out anonymous and unencrypted ciphersuites! (The latter are not + * actually enabled by ALL, but "ALL:RSA" would enable some of them.) + */ + +/* Used in SSL_set_shutdown()/SSL_get_shutdown(); */ +# define SSL_SENT_SHUTDOWN 1 +# define SSL_RECEIVED_SHUTDOWN 2 + +#ifdef __cplusplus +} +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +# if (defined(OPENSSL_NO_RSA) || defined(OPENSSL_NO_MD5)) && !defined(OPENSSL_NO_SSL2) +# define OPENSSL_NO_SSL2 +# endif + +# define SSL_FILETYPE_ASN1 X509_FILETYPE_ASN1 +# define SSL_FILETYPE_PEM X509_FILETYPE_PEM + +/* + * This is needed to stop compilers complaining about the 'struct ssl_st *' + * function parameters used to prototype callbacks in SSL_CTX. + */ +typedef struct ssl_st *ssl_crock_st; +typedef struct tls_session_ticket_ext_st TLS_SESSION_TICKET_EXT; +typedef struct ssl_method_st SSL_METHOD; +typedef struct ssl_cipher_st SSL_CIPHER; +typedef struct ssl_session_st SSL_SESSION; +typedef struct tls_sigalgs_st TLS_SIGALGS; +typedef struct ssl_conf_ctx_st SSL_CONF_CTX; + +DECLARE_STACK_OF(SSL_CIPHER) + +/* SRTP protection profiles for use with the use_srtp extension (RFC 5764)*/ +typedef struct srtp_protection_profile_st { + const char *name; + unsigned long id; +} SRTP_PROTECTION_PROFILE; + +DECLARE_STACK_OF(SRTP_PROTECTION_PROFILE) + +typedef int (*tls_session_ticket_ext_cb_fn) (SSL *s, + const unsigned char *data, + int len, void *arg); +typedef int (*tls_session_secret_cb_fn) (SSL *s, void *secret, + int *secret_len, + STACK_OF(SSL_CIPHER) *peer_ciphers, + SSL_CIPHER **cipher, void *arg); + +# ifndef OPENSSL_NO_TLSEXT + +/* Typedefs for handling custom extensions */ + +typedef int (*custom_ext_add_cb) (SSL *s, unsigned int ext_type, + const unsigned char **out, + size_t *outlen, int *al, void *add_arg); + +typedef void (*custom_ext_free_cb) (SSL *s, unsigned int ext_type, + const unsigned char *out, void *add_arg); + +typedef int (*custom_ext_parse_cb) (SSL *s, unsigned int ext_type, + const unsigned char *in, + size_t inlen, int *al, void *parse_arg); + +# endif + +# ifndef OPENSSL_NO_SSL_INTERN + +/* used to hold info on the particular ciphers used */ +struct ssl_cipher_st { + int valid; + const char *name; /* text name */ + unsigned long id; /* id, 4 bytes, first is version */ + /* + * changed in 0.9.9: these four used to be portions of a single value + * 'algorithms' + */ + unsigned long algorithm_mkey; /* key exchange algorithm */ + unsigned long algorithm_auth; /* server authentication */ + unsigned long algorithm_enc; /* symmetric encryption */ + unsigned long algorithm_mac; /* symmetric authentication */ + unsigned long algorithm_ssl; /* (major) protocol version */ + unsigned long algo_strength; /* strength and export flags */ + unsigned long algorithm2; /* Extra flags */ + int strength_bits; /* Number of bits really used */ + int alg_bits; /* Number of bits for algorithm */ +}; + +/* Used to hold functions for SSLv2 or SSLv3/TLSv1 functions */ +struct ssl_method_st { + int version; + int (*ssl_new) (SSL *s); + void (*ssl_clear) (SSL *s); + void (*ssl_free) (SSL *s); + int (*ssl_accept) (SSL *s); + int (*ssl_connect) (SSL *s); + int (*ssl_read) (SSL *s, void *buf, int len); + int (*ssl_peek) (SSL *s, void *buf, int len); + int (*ssl_write) (SSL *s, const void *buf, int len); + int (*ssl_shutdown) (SSL *s); + int (*ssl_renegotiate) (SSL *s); + int (*ssl_renegotiate_check) (SSL *s); + long (*ssl_get_message) (SSL *s, int st1, int stn, int mt, long + max, int *ok); + int (*ssl_read_bytes) (SSL *s, int type, unsigned char *buf, int len, + int peek); + int (*ssl_write_bytes) (SSL *s, int type, const void *buf_, int len); + int (*ssl_dispatch_alert) (SSL *s); + long (*ssl_ctrl) (SSL *s, int cmd, long larg, void *parg); + long (*ssl_ctx_ctrl) (SSL_CTX *ctx, int cmd, long larg, void *parg); + const SSL_CIPHER *(*get_cipher_by_char) (const unsigned char *ptr); + int (*put_cipher_by_char) (const SSL_CIPHER *cipher, unsigned char *ptr); + int (*ssl_pending) (const SSL *s); + int (*num_ciphers) (void); + const SSL_CIPHER *(*get_cipher) (unsigned ncipher); + const struct ssl_method_st *(*get_ssl_method) (int version); + long (*get_timeout) (void); + struct ssl3_enc_method *ssl3_enc; /* Extra SSLv3/TLS stuff */ + int (*ssl_version) (void); + long (*ssl_callback_ctrl) (SSL *s, int cb_id, void (*fp) (void)); + long (*ssl_ctx_callback_ctrl) (SSL_CTX *s, int cb_id, void (*fp) (void)); +}; + +/*- + * Lets make this into an ASN.1 type structure as follows + * SSL_SESSION_ID ::= SEQUENCE { + * version INTEGER, -- structure version number + * SSLversion INTEGER, -- SSL version number + * Cipher OCTET STRING, -- the 3 byte cipher ID + * Session_ID OCTET STRING, -- the Session ID + * Master_key OCTET STRING, -- the master key + * KRB5_principal OCTET STRING -- optional Kerberos principal + * Key_Arg [ 0 ] IMPLICIT OCTET STRING, -- the optional Key argument + * Time [ 1 ] EXPLICIT INTEGER, -- optional Start Time + * Timeout [ 2 ] EXPLICIT INTEGER, -- optional Timeout ins seconds + * Peer [ 3 ] EXPLICIT X509, -- optional Peer Certificate + * Session_ID_context [ 4 ] EXPLICIT OCTET STRING, -- the Session ID context + * Verify_result [ 5 ] EXPLICIT INTEGER, -- X509_V_... code for `Peer' + * HostName [ 6 ] EXPLICIT OCTET STRING, -- optional HostName from servername TLS extension + * PSK_identity_hint [ 7 ] EXPLICIT OCTET STRING, -- optional PSK identity hint + * PSK_identity [ 8 ] EXPLICIT OCTET STRING, -- optional PSK identity + * Ticket_lifetime_hint [9] EXPLICIT INTEGER, -- server's lifetime hint for session ticket + * Ticket [10] EXPLICIT OCTET STRING, -- session ticket (clients only) + * Compression_meth [11] EXPLICIT OCTET STRING, -- optional compression method + * SRP_username [ 12 ] EXPLICIT OCTET STRING -- optional SRP username + * } + * Look in ssl/ssl_asn1.c for more details + * I'm using EXPLICIT tags so I can read the damn things using asn1parse :-). + */ +struct ssl_session_st { + int ssl_version; /* what ssl version session info is being + * kept in here? */ + /* only really used in SSLv2 */ + unsigned int key_arg_length; + unsigned char key_arg[SSL_MAX_KEY_ARG_LENGTH]; + int master_key_length; + unsigned char master_key[SSL_MAX_MASTER_KEY_LENGTH]; + /* session_id - valid? */ + unsigned int session_id_length; + unsigned char session_id[SSL_MAX_SSL_SESSION_ID_LENGTH]; + /* + * this is used to determine whether the session is being reused in the + * appropriate context. It is up to the application to set this, via + * SSL_new + */ + unsigned int sid_ctx_length; + unsigned char sid_ctx[SSL_MAX_SID_CTX_LENGTH]; +# ifndef OPENSSL_NO_KRB5 + unsigned int krb5_client_princ_len; + unsigned char krb5_client_princ[SSL_MAX_KRB5_PRINCIPAL_LENGTH]; +# endif /* OPENSSL_NO_KRB5 */ +# ifndef OPENSSL_NO_PSK + char *psk_identity_hint; + char *psk_identity; +# endif + /* + * Used to indicate that session resumption is not allowed. Applications + * can also set this bit for a new session via not_resumable_session_cb + * to disable session caching and tickets. + */ + int not_resumable; + /* The cert is the certificate used to establish this connection */ + struct sess_cert_st /* SESS_CERT */ *sess_cert; + /* + * This is the cert for the other end. On clients, it will be the same as + * sess_cert->peer_key->x509 (the latter is not enough as sess_cert is + * not retained in the external representation of sessions, see + * ssl_asn1.c). + */ + X509 *peer; + /* + * when app_verify_callback accepts a session where the peer's + * certificate is not ok, we must remember the error for session reuse: + */ + long verify_result; /* only for servers */ + int references; + long timeout; + long time; + unsigned int compress_meth; /* Need to lookup the method */ + const SSL_CIPHER *cipher; + unsigned long cipher_id; /* when ASN.1 loaded, this needs to be used + * to load the 'cipher' structure */ + STACK_OF(SSL_CIPHER) *ciphers; /* shared ciphers? */ + CRYPTO_EX_DATA ex_data; /* application specific data */ + /* + * These are used to make removal of session-ids more efficient and to + * implement a maximum cache size. + */ + struct ssl_session_st *prev, *next; +# ifndef OPENSSL_NO_TLSEXT + char *tlsext_hostname; +# ifndef OPENSSL_NO_EC + size_t tlsext_ecpointformatlist_length; + unsigned char *tlsext_ecpointformatlist; /* peer's list */ + size_t tlsext_ellipticcurvelist_length; + unsigned char *tlsext_ellipticcurvelist; /* peer's list */ +# endif /* OPENSSL_NO_EC */ + /* RFC4507 info */ + unsigned char *tlsext_tick; /* Session ticket */ + size_t tlsext_ticklen; /* Session ticket length */ + long tlsext_tick_lifetime_hint; /* Session lifetime hint in seconds */ +# endif +# ifndef OPENSSL_NO_SRP + char *srp_username; +# endif +}; + +# endif + +# define SSL_OP_MICROSOFT_SESS_ID_BUG 0x00000001L +# define SSL_OP_NETSCAPE_CHALLENGE_BUG 0x00000002L +/* Allow initial connection to servers that don't support RI */ +# define SSL_OP_LEGACY_SERVER_CONNECT 0x00000004L +# define SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG 0x00000008L +# define SSL_OP_TLSEXT_PADDING 0x00000010L +# define SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER 0x00000020L +# define SSL_OP_SAFARI_ECDHE_ECDSA_BUG 0x00000040L +# define SSL_OP_SSLEAY_080_CLIENT_DH_BUG 0x00000080L +# define SSL_OP_TLS_D5_BUG 0x00000100L +# define SSL_OP_TLS_BLOCK_PADDING_BUG 0x00000200L + +/* Hasn't done anything since OpenSSL 0.9.7h, retained for compatibility */ +# define SSL_OP_MSIE_SSLV2_RSA_PADDING 0x0 +/* Refers to ancient SSLREF and SSLv2, retained for compatibility */ +# define SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG 0x0 + +/* + * Disable SSL 3.0/TLS 1.0 CBC vulnerability workaround that was added in + * OpenSSL 0.9.6d. Usually (depending on the application protocol) the + * workaround is not needed. Unfortunately some broken SSL/TLS + * implementations cannot handle it at all, which is why we include it in + * SSL_OP_ALL. + */ +/* added in 0.9.6e */ +# define SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS 0x00000800L + +/* + * SSL_OP_ALL: various bug workarounds that should be rather harmless. This + * used to be 0x000FFFFFL before 0.9.7. + */ +# define SSL_OP_ALL 0x80000BFFL + +/* DTLS options */ +# define SSL_OP_NO_QUERY_MTU 0x00001000L +/* Turn on Cookie Exchange (on relevant for servers) */ +# define SSL_OP_COOKIE_EXCHANGE 0x00002000L +/* Don't use RFC4507 ticket extension */ +# define SSL_OP_NO_TICKET 0x00004000L +/* Use Cisco's "speshul" version of DTLS_BAD_VER (as client) */ +# define SSL_OP_CISCO_ANYCONNECT 0x00008000L + +/* As server, disallow session resumption on renegotiation */ +# define SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION 0x00010000L +/* Don't use compression even if supported */ +# define SSL_OP_NO_COMPRESSION 0x00020000L +/* Permit unsafe legacy renegotiation */ +# define SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION 0x00040000L +/* If set, always create a new key when using tmp_ecdh parameters */ +# define SSL_OP_SINGLE_ECDH_USE 0x00080000L +/* Does nothing: retained for compatibility */ +# define SSL_OP_SINGLE_DH_USE 0x00100000L +/* Does nothing: retained for compatibiity */ +# define SSL_OP_EPHEMERAL_RSA 0x0 +/* + * Set on servers to choose the cipher according to the server's preferences + */ +# define SSL_OP_CIPHER_SERVER_PREFERENCE 0x00400000L +/* + * If set, a server will allow a client to issue a SSLv3.0 version number as + * latest version supported in the premaster secret, even when TLSv1.0 + * (version 3.1) was announced in the client hello. Normally this is + * forbidden to prevent version rollback attacks. + */ +# define SSL_OP_TLS_ROLLBACK_BUG 0x00800000L + +# define SSL_OP_NO_SSLv2 0x01000000L +# define SSL_OP_NO_SSLv3 0x02000000L +# define SSL_OP_NO_TLSv1 0x04000000L +# define SSL_OP_NO_TLSv1_2 0x08000000L +# define SSL_OP_NO_TLSv1_1 0x10000000L + +# define SSL_OP_NO_DTLSv1 0x04000000L +# define SSL_OP_NO_DTLSv1_2 0x08000000L + +# define SSL_OP_NO_SSL_MASK (SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3|\ + SSL_OP_NO_TLSv1|SSL_OP_NO_TLSv1_1|SSL_OP_NO_TLSv1_2) + +/* + * These next two were never actually used for anything since SSLeay zap so + * we have some more flags. + */ +/* + * The next flag deliberately changes the ciphertest, this is a check for the + * PKCS#1 attack + */ +# define SSL_OP_PKCS1_CHECK_1 0x0 +# define SSL_OP_PKCS1_CHECK_2 0x0 + +# define SSL_OP_NETSCAPE_CA_DN_BUG 0x20000000L +# define SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG 0x40000000L +/* + * Make server add server-hello extension from early version of cryptopro + * draft, when GOST ciphersuite is negotiated. Required for interoperability + * with CryptoPro CSP 3.x + */ +# define SSL_OP_CRYPTOPRO_TLSEXT_BUG 0x80000000L + +/* + * Allow SSL_write(..., n) to return r with 0 < r < n (i.e. report success + * when just a single record has been written): + */ +# define SSL_MODE_ENABLE_PARTIAL_WRITE 0x00000001L +/* + * Make it possible to retry SSL_write() with changed buffer location (buffer + * contents must stay the same!); this is not the default to avoid the + * misconception that non-blocking SSL_write() behaves like non-blocking + * write(): + */ +# define SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER 0x00000002L +/* + * Never bother the application with retries if the transport is blocking: + */ +# define SSL_MODE_AUTO_RETRY 0x00000004L +/* Don't attempt to automatically build certificate chain */ +# define SSL_MODE_NO_AUTO_CHAIN 0x00000008L +/* + * Save RAM by releasing read and write buffers when they're empty. (SSL3 and + * TLS only.) "Released" buffers are put onto a free-list in the context or + * just freed (depending on the context's setting for freelist_max_len). + */ +# define SSL_MODE_RELEASE_BUFFERS 0x00000010L +/* + * Send the current time in the Random fields of the ClientHello and + * ServerHello records for compatibility with hypothetical implementations + * that require it. + */ +# define SSL_MODE_SEND_CLIENTHELLO_TIME 0x00000020L +# define SSL_MODE_SEND_SERVERHELLO_TIME 0x00000040L +/* + * Send TLS_FALLBACK_SCSV in the ClientHello. To be set only by applications + * that reconnect with a downgraded protocol version; see + * draft-ietf-tls-downgrade-scsv-00 for details. DO NOT ENABLE THIS if your + * application attempts a normal handshake. Only use this in explicit + * fallback retries, following the guidance in + * draft-ietf-tls-downgrade-scsv-00. + */ +# define SSL_MODE_SEND_FALLBACK_SCSV 0x00000080L + +/* Cert related flags */ +/* + * Many implementations ignore some aspects of the TLS standards such as + * enforcing certifcate chain algorithms. When this is set we enforce them. + */ +# define SSL_CERT_FLAG_TLS_STRICT 0x00000001L + +/* Suite B modes, takes same values as certificate verify flags */ +# define SSL_CERT_FLAG_SUITEB_128_LOS_ONLY 0x10000 +/* Suite B 192 bit only mode */ +# define SSL_CERT_FLAG_SUITEB_192_LOS 0x20000 +/* Suite B 128 bit mode allowing 192 bit algorithms */ +# define SSL_CERT_FLAG_SUITEB_128_LOS 0x30000 + +/* Perform all sorts of protocol violations for testing purposes */ +# define SSL_CERT_FLAG_BROKEN_PROTOCOL 0x10000000 + +/* Flags for building certificate chains */ +/* Treat any existing certificates as untrusted CAs */ +# define SSL_BUILD_CHAIN_FLAG_UNTRUSTED 0x1 +/* Don't include root CA in chain */ +# define SSL_BUILD_CHAIN_FLAG_NO_ROOT 0x2 +/* Just check certificates already there */ +# define SSL_BUILD_CHAIN_FLAG_CHECK 0x4 +/* Ignore verification errors */ +# define SSL_BUILD_CHAIN_FLAG_IGNORE_ERROR 0x8 +/* Clear verification errors from queue */ +# define SSL_BUILD_CHAIN_FLAG_CLEAR_ERROR 0x10 + +/* Flags returned by SSL_check_chain */ +/* Certificate can be used with this session */ +# define CERT_PKEY_VALID 0x1 +/* Certificate can also be used for signing */ +# define CERT_PKEY_SIGN 0x2 +/* EE certificate signing algorithm OK */ +# define CERT_PKEY_EE_SIGNATURE 0x10 +/* CA signature algorithms OK */ +# define CERT_PKEY_CA_SIGNATURE 0x20 +/* EE certificate parameters OK */ +# define CERT_PKEY_EE_PARAM 0x40 +/* CA certificate parameters OK */ +# define CERT_PKEY_CA_PARAM 0x80 +/* Signing explicitly allowed as opposed to SHA1 fallback */ +# define CERT_PKEY_EXPLICIT_SIGN 0x100 +/* Client CA issuer names match (always set for server cert) */ +# define CERT_PKEY_ISSUER_NAME 0x200 +/* Cert type matches client types (always set for server cert) */ +# define CERT_PKEY_CERT_TYPE 0x400 +/* Cert chain suitable to Suite B */ +# define CERT_PKEY_SUITEB 0x800 + +# define SSL_CONF_FLAG_CMDLINE 0x1 +# define SSL_CONF_FLAG_FILE 0x2 +# define SSL_CONF_FLAG_CLIENT 0x4 +# define SSL_CONF_FLAG_SERVER 0x8 +# define SSL_CONF_FLAG_SHOW_ERRORS 0x10 +# define SSL_CONF_FLAG_CERTIFICATE 0x20 +/* Configuration value types */ +# define SSL_CONF_TYPE_UNKNOWN 0x0 +# define SSL_CONF_TYPE_STRING 0x1 +# define SSL_CONF_TYPE_FILE 0x2 +# define SSL_CONF_TYPE_DIR 0x3 + +/* + * Note: SSL[_CTX]_set_{options,mode} use |= op on the previous value, they + * cannot be used to clear bits. + */ + +# define SSL_CTX_set_options(ctx,op) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_OPTIONS,(op),NULL) +# define SSL_CTX_clear_options(ctx,op) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_CLEAR_OPTIONS,(op),NULL) +# define SSL_CTX_get_options(ctx) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_OPTIONS,0,NULL) +# define SSL_set_options(ssl,op) \ + SSL_ctrl((ssl),SSL_CTRL_OPTIONS,(op),NULL) +# define SSL_clear_options(ssl,op) \ + SSL_ctrl((ssl),SSL_CTRL_CLEAR_OPTIONS,(op),NULL) +# define SSL_get_options(ssl) \ + SSL_ctrl((ssl),SSL_CTRL_OPTIONS,0,NULL) + +# define SSL_CTX_set_mode(ctx,op) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_MODE,(op),NULL) +# define SSL_CTX_clear_mode(ctx,op) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_CLEAR_MODE,(op),NULL) +# define SSL_CTX_get_mode(ctx) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_MODE,0,NULL) +# define SSL_clear_mode(ssl,op) \ + SSL_ctrl((ssl),SSL_CTRL_CLEAR_MODE,(op),NULL) +# define SSL_set_mode(ssl,op) \ + SSL_ctrl((ssl),SSL_CTRL_MODE,(op),NULL) +# define SSL_get_mode(ssl) \ + SSL_ctrl((ssl),SSL_CTRL_MODE,0,NULL) +# define SSL_set_mtu(ssl, mtu) \ + SSL_ctrl((ssl),SSL_CTRL_SET_MTU,(mtu),NULL) +# define DTLS_set_link_mtu(ssl, mtu) \ + SSL_ctrl((ssl),DTLS_CTRL_SET_LINK_MTU,(mtu),NULL) +# define DTLS_get_link_min_mtu(ssl) \ + SSL_ctrl((ssl),DTLS_CTRL_GET_LINK_MIN_MTU,0,NULL) + +# define SSL_get_secure_renegotiation_support(ssl) \ + SSL_ctrl((ssl), SSL_CTRL_GET_RI_SUPPORT, 0, NULL) + +# ifndef OPENSSL_NO_HEARTBEATS +# define SSL_heartbeat(ssl) \ + SSL_ctrl((ssl),SSL_CTRL_TLS_EXT_SEND_HEARTBEAT,0,NULL) +# endif + +# define SSL_CTX_set_cert_flags(ctx,op) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_CERT_FLAGS,(op),NULL) +# define SSL_set_cert_flags(s,op) \ + SSL_ctrl((s),SSL_CTRL_CERT_FLAGS,(op),NULL) +# define SSL_CTX_clear_cert_flags(ctx,op) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_CLEAR_CERT_FLAGS,(op),NULL) +# define SSL_clear_cert_flags(s,op) \ + SSL_ctrl((s),SSL_CTRL_CLEAR_CERT_FLAGS,(op),NULL) + +void SSL_CTX_set_msg_callback(SSL_CTX *ctx, + void (*cb) (int write_p, int version, + int content_type, const void *buf, + size_t len, SSL *ssl, void *arg)); +void SSL_set_msg_callback(SSL *ssl, + void (*cb) (int write_p, int version, + int content_type, const void *buf, + size_t len, SSL *ssl, void *arg)); +# define SSL_CTX_set_msg_callback_arg(ctx, arg) SSL_CTX_ctrl((ctx), SSL_CTRL_SET_MSG_CALLBACK_ARG, 0, (arg)) +# define SSL_set_msg_callback_arg(ssl, arg) SSL_ctrl((ssl), SSL_CTRL_SET_MSG_CALLBACK_ARG, 0, (arg)) + +# ifndef OPENSSL_NO_SRP + +# ifndef OPENSSL_NO_SSL_INTERN + +typedef struct srp_ctx_st { + /* param for all the callbacks */ + void *SRP_cb_arg; + /* set client Hello login callback */ + int (*TLS_ext_srp_username_callback) (SSL *, int *, void *); + /* set SRP N/g param callback for verification */ + int (*SRP_verify_param_callback) (SSL *, void *); + /* set SRP client passwd callback */ + char *(*SRP_give_srp_client_pwd_callback) (SSL *, void *); + char *login; + BIGNUM *N, *g, *s, *B, *A; + BIGNUM *a, *b, *v; + char *info; + int strength; + unsigned long srp_Mask; +} SRP_CTX; + +# endif + +/* see tls_srp.c */ +int SSL_SRP_CTX_init(SSL *s); +int SSL_CTX_SRP_CTX_init(SSL_CTX *ctx); +int SSL_SRP_CTX_free(SSL *ctx); +int SSL_CTX_SRP_CTX_free(SSL_CTX *ctx); +int SSL_srp_server_param_with_username(SSL *s, int *ad); +int SRP_generate_server_master_secret(SSL *s, unsigned char *master_key); +int SRP_Calc_A_param(SSL *s); +int SRP_generate_client_master_secret(SSL *s, unsigned char *master_key); + +# endif + +# if defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_WIN32) +# define SSL_MAX_CERT_LIST_DEFAULT 1024*30 + /* 30k max cert list :-) */ +# else +# define SSL_MAX_CERT_LIST_DEFAULT 1024*100 + /* 100k max cert list :-) */ +# endif + +# define SSL_SESSION_CACHE_MAX_SIZE_DEFAULT (1024*20) + +/* + * This callback type is used inside SSL_CTX, SSL, and in the functions that + * set them. It is used to override the generation of SSL/TLS session IDs in + * a server. Return value should be zero on an error, non-zero to proceed. + * Also, callbacks should themselves check if the id they generate is unique + * otherwise the SSL handshake will fail with an error - callbacks can do + * this using the 'ssl' value they're passed by; + * SSL_has_matching_session_id(ssl, id, *id_len) The length value passed in + * is set at the maximum size the session ID can be. In SSLv2 this is 16 + * bytes, whereas SSLv3/TLSv1 it is 32 bytes. The callback can alter this + * length to be less if desired, but under SSLv2 session IDs are supposed to + * be fixed at 16 bytes so the id will be padded after the callback returns + * in this case. It is also an error for the callback to set the size to + * zero. + */ +typedef int (*GEN_SESSION_CB) (const SSL *ssl, unsigned char *id, + unsigned int *id_len); + +typedef struct ssl_comp_st SSL_COMP; + +# ifndef OPENSSL_NO_SSL_INTERN + +struct ssl_comp_st { + int id; + const char *name; +# ifndef OPENSSL_NO_COMP + COMP_METHOD *method; +# else + char *method; +# endif +}; + +DECLARE_STACK_OF(SSL_COMP) +DECLARE_LHASH_OF(SSL_SESSION); + +struct ssl_ctx_st { + const SSL_METHOD *method; + STACK_OF(SSL_CIPHER) *cipher_list; + /* same as above but sorted for lookup */ + STACK_OF(SSL_CIPHER) *cipher_list_by_id; + struct x509_store_st /* X509_STORE */ *cert_store; + LHASH_OF(SSL_SESSION) *sessions; + /* + * Most session-ids that will be cached, default is + * SSL_SESSION_CACHE_MAX_SIZE_DEFAULT. 0 is unlimited. + */ + unsigned long session_cache_size; + struct ssl_session_st *session_cache_head; + struct ssl_session_st *session_cache_tail; + /* + * This can have one of 2 values, ored together, SSL_SESS_CACHE_CLIENT, + * SSL_SESS_CACHE_SERVER, Default is SSL_SESSION_CACHE_SERVER, which + * means only SSL_accept which cache SSL_SESSIONS. + */ + int session_cache_mode; + /* + * If timeout is not 0, it is the default timeout value set when + * SSL_new() is called. This has been put in to make life easier to set + * things up + */ + long session_timeout; + /* + * If this callback is not null, it will be called each time a session id + * is added to the cache. If this function returns 1, it means that the + * callback will do a SSL_SESSION_free() when it has finished using it. + * Otherwise, on 0, it means the callback has finished with it. If + * remove_session_cb is not null, it will be called when a session-id is + * removed from the cache. After the call, OpenSSL will + * SSL_SESSION_free() it. + */ + int (*new_session_cb) (struct ssl_st *ssl, SSL_SESSION *sess); + void (*remove_session_cb) (struct ssl_ctx_st *ctx, SSL_SESSION *sess); + SSL_SESSION *(*get_session_cb) (struct ssl_st *ssl, + unsigned char *data, int len, int *copy); + struct { + int sess_connect; /* SSL new conn - started */ + int sess_connect_renegotiate; /* SSL reneg - requested */ + int sess_connect_good; /* SSL new conne/reneg - finished */ + int sess_accept; /* SSL new accept - started */ + int sess_accept_renegotiate; /* SSL reneg - requested */ + int sess_accept_good; /* SSL accept/reneg - finished */ + int sess_miss; /* session lookup misses */ + int sess_timeout; /* reuse attempt on timeouted session */ + int sess_cache_full; /* session removed due to full cache */ + int sess_hit; /* session reuse actually done */ + int sess_cb_hit; /* session-id that was not in the cache was + * passed back via the callback. This + * indicates that the application is + * supplying session-id's from other + * processes - spooky :-) */ + } stats; + + int references; + + /* if defined, these override the X509_verify_cert() calls */ + int (*app_verify_callback) (X509_STORE_CTX *, void *); + void *app_verify_arg; + /* + * before OpenSSL 0.9.7, 'app_verify_arg' was ignored + * ('app_verify_callback' was called with just one argument) + */ + + /* Default password callback. */ + pem_password_cb *default_passwd_callback; + + /* Default password callback user data. */ + void *default_passwd_callback_userdata; + + /* get client cert callback */ + int (*client_cert_cb) (SSL *ssl, X509 **x509, EVP_PKEY **pkey); + + /* cookie generate callback */ + int (*app_gen_cookie_cb) (SSL *ssl, unsigned char *cookie, + unsigned int *cookie_len); + + /* verify cookie callback */ + int (*app_verify_cookie_cb) (SSL *ssl, unsigned char *cookie, + unsigned int cookie_len); + + CRYPTO_EX_DATA ex_data; + + const EVP_MD *rsa_md5; /* For SSLv2 - name is 'ssl2-md5' */ + const EVP_MD *md5; /* For SSLv3/TLSv1 'ssl3-md5' */ + const EVP_MD *sha1; /* For SSLv3/TLSv1 'ssl3->sha1' */ + + STACK_OF(X509) *extra_certs; + STACK_OF(SSL_COMP) *comp_methods; /* stack of SSL_COMP, SSLv3/TLSv1 */ + + /* Default values used when no per-SSL value is defined follow */ + + /* used if SSL's info_callback is NULL */ + void (*info_callback) (const SSL *ssl, int type, int val); + + /* what we put in client cert requests */ + STACK_OF(X509_NAME) *client_CA; + + /* + * Default values to use in SSL structures follow (these are copied by + * SSL_new) + */ + + unsigned long options; + unsigned long mode; + long max_cert_list; + + struct cert_st /* CERT */ *cert; + int read_ahead; + + /* callback that allows applications to peek at protocol messages */ + void (*msg_callback) (int write_p, int version, int content_type, + const void *buf, size_t len, SSL *ssl, void *arg); + void *msg_callback_arg; + + int verify_mode; + unsigned int sid_ctx_length; + unsigned char sid_ctx[SSL_MAX_SID_CTX_LENGTH]; + /* called 'verify_callback' in the SSL */ + int (*default_verify_callback) (int ok, X509_STORE_CTX *ctx); + + /* Default generate session ID callback. */ + GEN_SESSION_CB generate_session_id; + + X509_VERIFY_PARAM *param; + +# if 0 + int purpose; /* Purpose setting */ + int trust; /* Trust setting */ +# endif + + int quiet_shutdown; + + /* + * Maximum amount of data to send in one fragment. actual record size can + * be more than this due to padding and MAC overheads. + */ + unsigned int max_send_fragment; + +# ifndef OPENSSL_NO_ENGINE + /* + * Engine to pass requests for client certs to + */ + ENGINE *client_cert_engine; +# endif + +# ifndef OPENSSL_NO_TLSEXT + /* TLS extensions servername callback */ + int (*tlsext_servername_callback) (SSL *, int *, void *); + void *tlsext_servername_arg; + /* RFC 4507 session ticket keys */ + unsigned char tlsext_tick_key_name[16]; + unsigned char tlsext_tick_hmac_key[16]; + unsigned char tlsext_tick_aes_key[16]; + /* Callback to support customisation of ticket key setting */ + int (*tlsext_ticket_key_cb) (SSL *ssl, + unsigned char *name, unsigned char *iv, + EVP_CIPHER_CTX *ectx, + HMAC_CTX *hctx, int enc); + + /* certificate status request info */ + /* Callback for status request */ + int (*tlsext_status_cb) (SSL *ssl, void *arg); + void *tlsext_status_arg; + + /* draft-rescorla-tls-opaque-prf-input-00.txt information */ + int (*tlsext_opaque_prf_input_callback) (SSL *, void *peerinput, + size_t len, void *arg); + void *tlsext_opaque_prf_input_callback_arg; +# endif + +# ifndef OPENSSL_NO_PSK + char *psk_identity_hint; + unsigned int (*psk_client_callback) (SSL *ssl, const char *hint, + char *identity, + unsigned int max_identity_len, + unsigned char *psk, + unsigned int max_psk_len); + unsigned int (*psk_server_callback) (SSL *ssl, const char *identity, + unsigned char *psk, + unsigned int max_psk_len); +# endif + +# ifndef OPENSSL_NO_BUF_FREELISTS +# define SSL_MAX_BUF_FREELIST_LEN_DEFAULT 32 + unsigned int freelist_max_len; + struct ssl3_buf_freelist_st *wbuf_freelist; + struct ssl3_buf_freelist_st *rbuf_freelist; +# endif +# ifndef OPENSSL_NO_SRP + SRP_CTX srp_ctx; /* ctx for SRP authentication */ +# endif + +# ifndef OPENSSL_NO_TLSEXT + +# ifndef OPENSSL_NO_NEXTPROTONEG + /* Next protocol negotiation information */ + /* (for experimental NPN extension). */ + + /* + * For a server, this contains a callback function by which the set of + * advertised protocols can be provided. + */ + int (*next_protos_advertised_cb) (SSL *s, const unsigned char **buf, + unsigned int *len, void *arg); + void *next_protos_advertised_cb_arg; + /* + * For a client, this contains a callback function that selects the next + * protocol from the list provided by the server. + */ + int (*next_proto_select_cb) (SSL *s, unsigned char **out, + unsigned char *outlen, + const unsigned char *in, + unsigned int inlen, void *arg); + void *next_proto_select_cb_arg; +# endif + /* SRTP profiles we are willing to do from RFC 5764 */ + STACK_OF(SRTP_PROTECTION_PROFILE) *srtp_profiles; + + /* + * ALPN information (we are in the process of transitioning from NPN to + * ALPN.) + */ + + /*- + * For a server, this contains a callback function that allows the + * server to select the protocol for the connection. + * out: on successful return, this must point to the raw protocol + * name (without the length prefix). + * outlen: on successful return, this contains the length of |*out|. + * in: points to the client's list of supported protocols in + * wire-format. + * inlen: the length of |in|. + */ + int (*alpn_select_cb) (SSL *s, + const unsigned char **out, + unsigned char *outlen, + const unsigned char *in, + unsigned int inlen, void *arg); + void *alpn_select_cb_arg; + + /* + * For a client, this contains the list of supported protocols in wire + * format. + */ + unsigned char *alpn_client_proto_list; + unsigned alpn_client_proto_list_len; + +# ifndef OPENSSL_NO_EC + /* EC extension values inherited by SSL structure */ + size_t tlsext_ecpointformatlist_length; + unsigned char *tlsext_ecpointformatlist; + size_t tlsext_ellipticcurvelist_length; + unsigned char *tlsext_ellipticcurvelist; +# endif /* OPENSSL_NO_EC */ +# endif +}; + +# endif + +# define SSL_SESS_CACHE_OFF 0x0000 +# define SSL_SESS_CACHE_CLIENT 0x0001 +# define SSL_SESS_CACHE_SERVER 0x0002 +# define SSL_SESS_CACHE_BOTH (SSL_SESS_CACHE_CLIENT|SSL_SESS_CACHE_SERVER) +# define SSL_SESS_CACHE_NO_AUTO_CLEAR 0x0080 +/* enough comments already ... see SSL_CTX_set_session_cache_mode(3) */ +# define SSL_SESS_CACHE_NO_INTERNAL_LOOKUP 0x0100 +# define SSL_SESS_CACHE_NO_INTERNAL_STORE 0x0200 +# define SSL_SESS_CACHE_NO_INTERNAL \ + (SSL_SESS_CACHE_NO_INTERNAL_LOOKUP|SSL_SESS_CACHE_NO_INTERNAL_STORE) + +LHASH_OF(SSL_SESSION) *SSL_CTX_sessions(SSL_CTX *ctx); +# define SSL_CTX_sess_number(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_NUMBER,0,NULL) +# define SSL_CTX_sess_connect(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CONNECT,0,NULL) +# define SSL_CTX_sess_connect_good(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CONNECT_GOOD,0,NULL) +# define SSL_CTX_sess_connect_renegotiate(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CONNECT_RENEGOTIATE,0,NULL) +# define SSL_CTX_sess_accept(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_ACCEPT,0,NULL) +# define SSL_CTX_sess_accept_renegotiate(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_ACCEPT_RENEGOTIATE,0,NULL) +# define SSL_CTX_sess_accept_good(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_ACCEPT_GOOD,0,NULL) +# define SSL_CTX_sess_hits(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_HIT,0,NULL) +# define SSL_CTX_sess_cb_hits(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CB_HIT,0,NULL) +# define SSL_CTX_sess_misses(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_MISSES,0,NULL) +# define SSL_CTX_sess_timeouts(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_TIMEOUTS,0,NULL) +# define SSL_CTX_sess_cache_full(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CACHE_FULL,0,NULL) + +void SSL_CTX_sess_set_new_cb(SSL_CTX *ctx, + int (*new_session_cb) (struct ssl_st *ssl, + SSL_SESSION *sess)); +int (*SSL_CTX_sess_get_new_cb(SSL_CTX *ctx)) (struct ssl_st *ssl, + SSL_SESSION *sess); +void SSL_CTX_sess_set_remove_cb(SSL_CTX *ctx, + void (*remove_session_cb) (struct ssl_ctx_st + *ctx, + SSL_SESSION + *sess)); +void (*SSL_CTX_sess_get_remove_cb(SSL_CTX *ctx)) (struct ssl_ctx_st *ctx, + SSL_SESSION *sess); +void SSL_CTX_sess_set_get_cb(SSL_CTX *ctx, + SSL_SESSION *(*get_session_cb) (struct ssl_st + *ssl, + unsigned char + *data, int len, + int *copy)); +SSL_SESSION *(*SSL_CTX_sess_get_get_cb(SSL_CTX *ctx)) (struct ssl_st *ssl, + unsigned char *Data, + int len, int *copy); +void SSL_CTX_set_info_callback(SSL_CTX *ctx, + void (*cb) (const SSL *ssl, int type, + int val)); +void (*SSL_CTX_get_info_callback(SSL_CTX *ctx)) (const SSL *ssl, int type, + int val); +void SSL_CTX_set_client_cert_cb(SSL_CTX *ctx, + int (*client_cert_cb) (SSL *ssl, X509 **x509, + EVP_PKEY **pkey)); +int (*SSL_CTX_get_client_cert_cb(SSL_CTX *ctx)) (SSL *ssl, X509 **x509, + EVP_PKEY **pkey); +# ifndef OPENSSL_NO_ENGINE +int SSL_CTX_set_client_cert_engine(SSL_CTX *ctx, ENGINE *e); +# endif +void SSL_CTX_set_cookie_generate_cb(SSL_CTX *ctx, + int (*app_gen_cookie_cb) (SSL *ssl, + unsigned char + *cookie, + unsigned int + *cookie_len)); +void SSL_CTX_set_cookie_verify_cb(SSL_CTX *ctx, + int (*app_verify_cookie_cb) (SSL *ssl, + unsigned char + *cookie, + unsigned int + cookie_len)); +# ifndef OPENSSL_NO_NEXTPROTONEG +void SSL_CTX_set_next_protos_advertised_cb(SSL_CTX *s, + int (*cb) (SSL *ssl, + const unsigned char + **out, + unsigned int *outlen, + void *arg), void *arg); +void SSL_CTX_set_next_proto_select_cb(SSL_CTX *s, + int (*cb) (SSL *ssl, + unsigned char **out, + unsigned char *outlen, + const unsigned char *in, + unsigned int inlen, + void *arg), void *arg); +void SSL_get0_next_proto_negotiated(const SSL *s, const unsigned char **data, + unsigned *len); +# endif + +# ifndef OPENSSL_NO_TLSEXT +int SSL_select_next_proto(unsigned char **out, unsigned char *outlen, + const unsigned char *in, unsigned int inlen, + const unsigned char *client, + unsigned int client_len); +# endif + +# define OPENSSL_NPN_UNSUPPORTED 0 +# define OPENSSL_NPN_NEGOTIATED 1 +# define OPENSSL_NPN_NO_OVERLAP 2 + +int SSL_CTX_set_alpn_protos(SSL_CTX *ctx, const unsigned char *protos, + unsigned protos_len); +int SSL_set_alpn_protos(SSL *ssl, const unsigned char *protos, + unsigned protos_len); +void SSL_CTX_set_alpn_select_cb(SSL_CTX *ctx, + int (*cb) (SSL *ssl, + const unsigned char **out, + unsigned char *outlen, + const unsigned char *in, + unsigned int inlen, + void *arg), void *arg); +void SSL_get0_alpn_selected(const SSL *ssl, const unsigned char **data, + unsigned *len); + +# ifndef OPENSSL_NO_PSK +/* + * the maximum length of the buffer given to callbacks containing the + * resulting identity/psk + */ +# define PSK_MAX_IDENTITY_LEN 128 +# define PSK_MAX_PSK_LEN 256 +void SSL_CTX_set_psk_client_callback(SSL_CTX *ctx, + unsigned int (*psk_client_callback) (SSL + *ssl, + const + char + *hint, + char + *identity, + unsigned + int + max_identity_len, + unsigned + char + *psk, + unsigned + int + max_psk_len)); +void SSL_set_psk_client_callback(SSL *ssl, + unsigned int (*psk_client_callback) (SSL + *ssl, + const + char + *hint, + char + *identity, + unsigned + int + max_identity_len, + unsigned + char + *psk, + unsigned + int + max_psk_len)); +void SSL_CTX_set_psk_server_callback(SSL_CTX *ctx, + unsigned int (*psk_server_callback) (SSL + *ssl, + const + char + *identity, + unsigned + char + *psk, + unsigned + int + max_psk_len)); +void SSL_set_psk_server_callback(SSL *ssl, + unsigned int (*psk_server_callback) (SSL + *ssl, + const + char + *identity, + unsigned + char + *psk, + unsigned + int + max_psk_len)); +int SSL_CTX_use_psk_identity_hint(SSL_CTX *ctx, const char *identity_hint); +int SSL_use_psk_identity_hint(SSL *s, const char *identity_hint); +const char *SSL_get_psk_identity_hint(const SSL *s); +const char *SSL_get_psk_identity(const SSL *s); +# endif + +# ifndef OPENSSL_NO_TLSEXT +/* Register callbacks to handle custom TLS Extensions for client or server. */ + +int SSL_CTX_add_client_custom_ext(SSL_CTX *ctx, unsigned int ext_type, + custom_ext_add_cb add_cb, + custom_ext_free_cb free_cb, + void *add_arg, + custom_ext_parse_cb parse_cb, + void *parse_arg); + +int SSL_CTX_add_server_custom_ext(SSL_CTX *ctx, unsigned int ext_type, + custom_ext_add_cb add_cb, + custom_ext_free_cb free_cb, + void *add_arg, + custom_ext_parse_cb parse_cb, + void *parse_arg); + +int SSL_extension_supported(unsigned int ext_type); + +# endif + +# define SSL_NOTHING 1 +# define SSL_WRITING 2 +# define SSL_READING 3 +# define SSL_X509_LOOKUP 4 + +/* These will only be used when doing non-blocking IO */ +# define SSL_want_nothing(s) (SSL_want(s) == SSL_NOTHING) +# define SSL_want_read(s) (SSL_want(s) == SSL_READING) +# define SSL_want_write(s) (SSL_want(s) == SSL_WRITING) +# define SSL_want_x509_lookup(s) (SSL_want(s) == SSL_X509_LOOKUP) + +# define SSL_MAC_FLAG_READ_MAC_STREAM 1 +# define SSL_MAC_FLAG_WRITE_MAC_STREAM 2 + +# ifndef OPENSSL_NO_SSL_INTERN + +struct ssl_st { + /* + * protocol version (one of SSL2_VERSION, SSL3_VERSION, TLS1_VERSION, + * DTLS1_VERSION) + */ + int version; + /* SSL_ST_CONNECT or SSL_ST_ACCEPT */ + int type; + /* SSLv3 */ + const SSL_METHOD *method; + /* + * There are 2 BIO's even though they are normally both the same. This + * is so data can be read and written to different handlers + */ +# ifndef OPENSSL_NO_BIO + /* used by SSL_read */ + BIO *rbio; + /* used by SSL_write */ + BIO *wbio; + /* used during session-id reuse to concatenate messages */ + BIO *bbio; +# else + /* used by SSL_read */ + char *rbio; + /* used by SSL_write */ + char *wbio; + char *bbio; +# endif + /* + * This holds a variable that indicates what we were doing when a 0 or -1 + * is returned. This is needed for non-blocking IO so we know what + * request needs re-doing when in SSL_accept or SSL_connect + */ + int rwstate; + /* true when we are actually in SSL_accept() or SSL_connect() */ + int in_handshake; + int (*handshake_func) (SSL *); + /* + * Imagine that here's a boolean member "init" that is switched as soon + * as SSL_set_{accept/connect}_state is called for the first time, so + * that "state" and "handshake_func" are properly initialized. But as + * handshake_func is == 0 until then, we use this test instead of an + * "init" member. + */ + /* are we the server side? - mostly used by SSL_clear */ + int server; + /* + * Generate a new session or reuse an old one. + * NB: For servers, the 'new' session may actually be a previously + * cached session or even the previous session unless + * SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION is set + */ + int new_session; + /* don't send shutdown packets */ + int quiet_shutdown; + /* we have shut things down, 0x01 sent, 0x02 for received */ + int shutdown; + /* where we are */ + int state; + /* where we are when reading */ + int rstate; + BUF_MEM *init_buf; /* buffer used during init */ + void *init_msg; /* pointer to handshake message body, set by + * ssl3_get_message() */ + int init_num; /* amount read/written */ + int init_off; /* amount read/written */ + /* used internally to point at a raw packet */ + unsigned char *packet; + unsigned int packet_length; + struct ssl2_state_st *s2; /* SSLv2 variables */ + struct ssl3_state_st *s3; /* SSLv3 variables */ + struct dtls1_state_st *d1; /* DTLSv1 variables */ + int read_ahead; /* Read as many input bytes as possible (for + * non-blocking reads) */ + /* callback that allows applications to peek at protocol messages */ + void (*msg_callback) (int write_p, int version, int content_type, + const void *buf, size_t len, SSL *ssl, void *arg); + void *msg_callback_arg; + int hit; /* reusing a previous session */ + X509_VERIFY_PARAM *param; +# if 0 + int purpose; /* Purpose setting */ + int trust; /* Trust setting */ +# endif + /* crypto */ + STACK_OF(SSL_CIPHER) *cipher_list; + STACK_OF(SSL_CIPHER) *cipher_list_by_id; + /* + * These are the ones being used, the ones in SSL_SESSION are the ones to + * be 'copied' into these ones + */ + int mac_flags; + EVP_CIPHER_CTX *enc_read_ctx; /* cryptographic state */ + EVP_MD_CTX *read_hash; /* used for mac generation */ +# ifndef OPENSSL_NO_COMP + COMP_CTX *expand; /* uncompress */ +# else + char *expand; +# endif + EVP_CIPHER_CTX *enc_write_ctx; /* cryptographic state */ + EVP_MD_CTX *write_hash; /* used for mac generation */ +# ifndef OPENSSL_NO_COMP + COMP_CTX *compress; /* compression */ +# else + char *compress; +# endif + /* session info */ + /* client cert? */ + /* This is used to hold the server certificate used */ + struct cert_st /* CERT */ *cert; + /* + * the session_id_context is used to ensure sessions are only reused in + * the appropriate context + */ + unsigned int sid_ctx_length; + unsigned char sid_ctx[SSL_MAX_SID_CTX_LENGTH]; + /* This can also be in the session once a session is established */ + SSL_SESSION *session; + /* Default generate session ID callback. */ + GEN_SESSION_CB generate_session_id; + /* Used in SSL2 and SSL3 */ + /* + * 0 don't care about verify failure. + * 1 fail if verify fails + */ + int verify_mode; + /* fail if callback returns 0 */ + int (*verify_callback) (int ok, X509_STORE_CTX *ctx); + /* optional informational callback */ + void (*info_callback) (const SSL *ssl, int type, int val); + /* error bytes to be written */ + int error; + /* actual code */ + int error_code; +# ifndef OPENSSL_NO_KRB5 + /* Kerberos 5 context */ + KSSL_CTX *kssl_ctx; +# endif /* OPENSSL_NO_KRB5 */ +# ifndef OPENSSL_NO_PSK + unsigned int (*psk_client_callback) (SSL *ssl, const char *hint, + char *identity, + unsigned int max_identity_len, + unsigned char *psk, + unsigned int max_psk_len); + unsigned int (*psk_server_callback) (SSL *ssl, const char *identity, + unsigned char *psk, + unsigned int max_psk_len); +# endif + SSL_CTX *ctx; + /* + * set this flag to 1 and a sleep(1) is put into all SSL_read() and + * SSL_write() calls, good for nbio debuging :-) + */ + int debug; + /* extra application data */ + long verify_result; + CRYPTO_EX_DATA ex_data; + /* for server side, keep the list of CA_dn we can use */ + STACK_OF(X509_NAME) *client_CA; + int references; + /* protocol behaviour */ + unsigned long options; + /* API behaviour */ + unsigned long mode; + long max_cert_list; + int first_packet; + /* what was passed, used for SSLv3/TLS rollback check */ + int client_version; + unsigned int max_send_fragment; +# ifndef OPENSSL_NO_TLSEXT + /* TLS extension debug callback */ + void (*tlsext_debug_cb) (SSL *s, int client_server, int type, + unsigned char *data, int len, void *arg); + void *tlsext_debug_arg; + char *tlsext_hostname; + /*- + * no further mod of servername + * 0 : call the servername extension callback. + * 1 : prepare 2, allow last ack just after in server callback. + * 2 : don't call servername callback, no ack in server hello + */ + int servername_done; + /* certificate status request info */ + /* Status type or -1 if no status type */ + int tlsext_status_type; + /* Expect OCSP CertificateStatus message */ + int tlsext_status_expected; + /* OCSP status request only */ + STACK_OF(OCSP_RESPID) *tlsext_ocsp_ids; + X509_EXTENSIONS *tlsext_ocsp_exts; + /* OCSP response received or to be sent */ + unsigned char *tlsext_ocsp_resp; + int tlsext_ocsp_resplen; + /* RFC4507 session ticket expected to be received or sent */ + int tlsext_ticket_expected; +# ifndef OPENSSL_NO_EC + size_t tlsext_ecpointformatlist_length; + /* our list */ + unsigned char *tlsext_ecpointformatlist; + size_t tlsext_ellipticcurvelist_length; + /* our list */ + unsigned char *tlsext_ellipticcurvelist; +# endif /* OPENSSL_NO_EC */ + /* + * draft-rescorla-tls-opaque-prf-input-00.txt information to be used for + * handshakes + */ + void *tlsext_opaque_prf_input; + size_t tlsext_opaque_prf_input_len; + /* TLS Session Ticket extension override */ + TLS_SESSION_TICKET_EXT *tlsext_session_ticket; + /* TLS Session Ticket extension callback */ + tls_session_ticket_ext_cb_fn tls_session_ticket_ext_cb; + void *tls_session_ticket_ext_cb_arg; + /* TLS pre-shared secret session resumption */ + tls_session_secret_cb_fn tls_session_secret_cb; + void *tls_session_secret_cb_arg; + SSL_CTX *initial_ctx; /* initial ctx, used to store sessions */ +# ifndef OPENSSL_NO_NEXTPROTONEG + /* + * Next protocol negotiation. For the client, this is the protocol that + * we sent in NextProtocol and is set when handling ServerHello + * extensions. For a server, this is the client's selected_protocol from + * NextProtocol and is set when handling the NextProtocol message, before + * the Finished message. + */ + unsigned char *next_proto_negotiated; + unsigned char next_proto_negotiated_len; +# endif +# define session_ctx initial_ctx + /* What we'll do */ + STACK_OF(SRTP_PROTECTION_PROFILE) *srtp_profiles; + /* What's been chosen */ + SRTP_PROTECTION_PROFILE *srtp_profile; + /*- + * Is use of the Heartbeat extension negotiated? + * 0: disabled + * 1: enabled + * 2: enabled, but not allowed to send Requests + */ + unsigned int tlsext_heartbeat; + /* Indicates if a HeartbeatRequest is in flight */ + unsigned int tlsext_hb_pending; + /* HeartbeatRequest sequence number */ + unsigned int tlsext_hb_seq; +# else +# define session_ctx ctx +# endif /* OPENSSL_NO_TLSEXT */ + /*- + * 1 if we are renegotiating. + * 2 if we are a server and are inside a handshake + * (i.e. not just sending a HelloRequest) + */ + int renegotiate; +# ifndef OPENSSL_NO_SRP + /* ctx for SRP authentication */ + SRP_CTX srp_ctx; +# endif +# ifndef OPENSSL_NO_TLSEXT + /* + * For a client, this contains the list of supported protocols in wire + * format. + */ + unsigned char *alpn_client_proto_list; + unsigned alpn_client_proto_list_len; +# endif /* OPENSSL_NO_TLSEXT */ +}; + +# endif + +#ifdef __cplusplus +} +#endif + +# include +# include +# include /* This is mostly sslv3 with a few tweaks */ +# include /* Datagram TLS */ +# include +# include /* Support for the use_srtp extension */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* compatibility */ +# define SSL_set_app_data(s,arg) (SSL_set_ex_data(s,0,(char *)arg)) +# define SSL_get_app_data(s) (SSL_get_ex_data(s,0)) +# define SSL_SESSION_set_app_data(s,a) (SSL_SESSION_set_ex_data(s,0,(char *)a)) +# define SSL_SESSION_get_app_data(s) (SSL_SESSION_get_ex_data(s,0)) +# define SSL_CTX_get_app_data(ctx) (SSL_CTX_get_ex_data(ctx,0)) +# define SSL_CTX_set_app_data(ctx,arg) (SSL_CTX_set_ex_data(ctx,0,(char *)arg)) + +/* + * The following are the possible values for ssl->state are are used to + * indicate where we are up to in the SSL connection establishment. The + * macros that follow are about the only things you should need to use and + * even then, only when using non-blocking IO. It can also be useful to work + * out where you were when the connection failed + */ + +# define SSL_ST_CONNECT 0x1000 +# define SSL_ST_ACCEPT 0x2000 +# define SSL_ST_MASK 0x0FFF +# define SSL_ST_INIT (SSL_ST_CONNECT|SSL_ST_ACCEPT) +# define SSL_ST_BEFORE 0x4000 +# define SSL_ST_OK 0x03 +# define SSL_ST_RENEGOTIATE (0x04|SSL_ST_INIT) +# define SSL_ST_ERR 0x05 + +# define SSL_CB_LOOP 0x01 +# define SSL_CB_EXIT 0x02 +# define SSL_CB_READ 0x04 +# define SSL_CB_WRITE 0x08 +# define SSL_CB_ALERT 0x4000/* used in callback */ +# define SSL_CB_READ_ALERT (SSL_CB_ALERT|SSL_CB_READ) +# define SSL_CB_WRITE_ALERT (SSL_CB_ALERT|SSL_CB_WRITE) +# define SSL_CB_ACCEPT_LOOP (SSL_ST_ACCEPT|SSL_CB_LOOP) +# define SSL_CB_ACCEPT_EXIT (SSL_ST_ACCEPT|SSL_CB_EXIT) +# define SSL_CB_CONNECT_LOOP (SSL_ST_CONNECT|SSL_CB_LOOP) +# define SSL_CB_CONNECT_EXIT (SSL_ST_CONNECT|SSL_CB_EXIT) +# define SSL_CB_HANDSHAKE_START 0x10 +# define SSL_CB_HANDSHAKE_DONE 0x20 + +/* Is the SSL_connection established? */ +# define SSL_get_state(a) SSL_state(a) +# define SSL_is_init_finished(a) (SSL_state(a) == SSL_ST_OK) +# define SSL_in_init(a) (SSL_state(a)&SSL_ST_INIT) +# define SSL_in_before(a) (SSL_state(a)&SSL_ST_BEFORE) +# define SSL_in_connect_init(a) (SSL_state(a)&SSL_ST_CONNECT) +# define SSL_in_accept_init(a) (SSL_state(a)&SSL_ST_ACCEPT) + +/* + * The following 2 states are kept in ssl->rstate when reads fail, you should + * not need these + */ +# define SSL_ST_READ_HEADER 0xF0 +# define SSL_ST_READ_BODY 0xF1 +# define SSL_ST_READ_DONE 0xF2 + +/*- + * Obtain latest Finished message + * -- that we sent (SSL_get_finished) + * -- that we expected from peer (SSL_get_peer_finished). + * Returns length (0 == no Finished so far), copies up to 'count' bytes. + */ +size_t SSL_get_finished(const SSL *s, void *buf, size_t count); +size_t SSL_get_peer_finished(const SSL *s, void *buf, size_t count); + +/* + * use either SSL_VERIFY_NONE or SSL_VERIFY_PEER, the last 2 options are + * 'ored' with SSL_VERIFY_PEER if they are desired + */ +# define SSL_VERIFY_NONE 0x00 +# define SSL_VERIFY_PEER 0x01 +# define SSL_VERIFY_FAIL_IF_NO_PEER_CERT 0x02 +# define SSL_VERIFY_CLIENT_ONCE 0x04 + +# define OpenSSL_add_ssl_algorithms() SSL_library_init() +# define SSLeay_add_ssl_algorithms() SSL_library_init() + +/* this is for backward compatibility */ +# if 0 /* NEW_SSLEAY */ +# define SSL_CTX_set_default_verify(a,b,c) SSL_CTX_set_verify(a,b,c) +# define SSL_set_pref_cipher(c,n) SSL_set_cipher_list(c,n) +# define SSL_add_session(a,b) SSL_CTX_add_session((a),(b)) +# define SSL_remove_session(a,b) SSL_CTX_remove_session((a),(b)) +# define SSL_flush_sessions(a,b) SSL_CTX_flush_sessions((a),(b)) +# endif +/* More backward compatibility */ +# define SSL_get_cipher(s) \ + SSL_CIPHER_get_name(SSL_get_current_cipher(s)) +# define SSL_get_cipher_bits(s,np) \ + SSL_CIPHER_get_bits(SSL_get_current_cipher(s),np) +# define SSL_get_cipher_version(s) \ + SSL_CIPHER_get_version(SSL_get_current_cipher(s)) +# define SSL_get_cipher_name(s) \ + SSL_CIPHER_get_name(SSL_get_current_cipher(s)) +# define SSL_get_time(a) SSL_SESSION_get_time(a) +# define SSL_set_time(a,b) SSL_SESSION_set_time((a),(b)) +# define SSL_get_timeout(a) SSL_SESSION_get_timeout(a) +# define SSL_set_timeout(a,b) SSL_SESSION_set_timeout((a),(b)) + +# define d2i_SSL_SESSION_bio(bp,s_id) ASN1_d2i_bio_of(SSL_SESSION,SSL_SESSION_new,d2i_SSL_SESSION,bp,s_id) +# define i2d_SSL_SESSION_bio(bp,s_id) ASN1_i2d_bio_of(SSL_SESSION,i2d_SSL_SESSION,bp,s_id) + +DECLARE_PEM_rw(SSL_SESSION, SSL_SESSION) +# define SSL_AD_REASON_OFFSET 1000/* offset to get SSL_R_... value + * from SSL_AD_... */ +/* These alert types are for SSLv3 and TLSv1 */ +# define SSL_AD_CLOSE_NOTIFY SSL3_AD_CLOSE_NOTIFY +/* fatal */ +# define SSL_AD_UNEXPECTED_MESSAGE SSL3_AD_UNEXPECTED_MESSAGE +/* fatal */ +# define SSL_AD_BAD_RECORD_MAC SSL3_AD_BAD_RECORD_MAC +# define SSL_AD_DECRYPTION_FAILED TLS1_AD_DECRYPTION_FAILED +# define SSL_AD_RECORD_OVERFLOW TLS1_AD_RECORD_OVERFLOW +/* fatal */ +# define SSL_AD_DECOMPRESSION_FAILURE SSL3_AD_DECOMPRESSION_FAILURE +/* fatal */ +# define SSL_AD_HANDSHAKE_FAILURE SSL3_AD_HANDSHAKE_FAILURE +/* Not for TLS */ +# define SSL_AD_NO_CERTIFICATE SSL3_AD_NO_CERTIFICATE +# define SSL_AD_BAD_CERTIFICATE SSL3_AD_BAD_CERTIFICATE +# define SSL_AD_UNSUPPORTED_CERTIFICATE SSL3_AD_UNSUPPORTED_CERTIFICATE +# define SSL_AD_CERTIFICATE_REVOKED SSL3_AD_CERTIFICATE_REVOKED +# define SSL_AD_CERTIFICATE_EXPIRED SSL3_AD_CERTIFICATE_EXPIRED +# define SSL_AD_CERTIFICATE_UNKNOWN SSL3_AD_CERTIFICATE_UNKNOWN +/* fatal */ +# define SSL_AD_ILLEGAL_PARAMETER SSL3_AD_ILLEGAL_PARAMETER +/* fatal */ +# define SSL_AD_UNKNOWN_CA TLS1_AD_UNKNOWN_CA +/* fatal */ +# define SSL_AD_ACCESS_DENIED TLS1_AD_ACCESS_DENIED +/* fatal */ +# define SSL_AD_DECODE_ERROR TLS1_AD_DECODE_ERROR +# define SSL_AD_DECRYPT_ERROR TLS1_AD_DECRYPT_ERROR +/* fatal */ +# define SSL_AD_EXPORT_RESTRICTION TLS1_AD_EXPORT_RESTRICTION +/* fatal */ +# define SSL_AD_PROTOCOL_VERSION TLS1_AD_PROTOCOL_VERSION +/* fatal */ +# define SSL_AD_INSUFFICIENT_SECURITY TLS1_AD_INSUFFICIENT_SECURITY +/* fatal */ +# define SSL_AD_INTERNAL_ERROR TLS1_AD_INTERNAL_ERROR +# define SSL_AD_USER_CANCELLED TLS1_AD_USER_CANCELLED +# define SSL_AD_NO_RENEGOTIATION TLS1_AD_NO_RENEGOTIATION +# define SSL_AD_UNSUPPORTED_EXTENSION TLS1_AD_UNSUPPORTED_EXTENSION +# define SSL_AD_CERTIFICATE_UNOBTAINABLE TLS1_AD_CERTIFICATE_UNOBTAINABLE +# define SSL_AD_UNRECOGNIZED_NAME TLS1_AD_UNRECOGNIZED_NAME +# define SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE TLS1_AD_BAD_CERTIFICATE_STATUS_RESPONSE +# define SSL_AD_BAD_CERTIFICATE_HASH_VALUE TLS1_AD_BAD_CERTIFICATE_HASH_VALUE +/* fatal */ +# define SSL_AD_UNKNOWN_PSK_IDENTITY TLS1_AD_UNKNOWN_PSK_IDENTITY +/* fatal */ +# define SSL_AD_INAPPROPRIATE_FALLBACK TLS1_AD_INAPPROPRIATE_FALLBACK +# define SSL_ERROR_NONE 0 +# define SSL_ERROR_SSL 1 +# define SSL_ERROR_WANT_READ 2 +# define SSL_ERROR_WANT_WRITE 3 +# define SSL_ERROR_WANT_X509_LOOKUP 4 +# define SSL_ERROR_SYSCALL 5/* look at error stack/return + * value/errno */ +# define SSL_ERROR_ZERO_RETURN 6 +# define SSL_ERROR_WANT_CONNECT 7 +# define SSL_ERROR_WANT_ACCEPT 8 +# define SSL_CTRL_NEED_TMP_RSA 1 +# define SSL_CTRL_SET_TMP_RSA 2 +# define SSL_CTRL_SET_TMP_DH 3 +# define SSL_CTRL_SET_TMP_ECDH 4 +# define SSL_CTRL_SET_TMP_RSA_CB 5 +# define SSL_CTRL_SET_TMP_DH_CB 6 +# define SSL_CTRL_SET_TMP_ECDH_CB 7 +# define SSL_CTRL_GET_SESSION_REUSED 8 +# define SSL_CTRL_GET_CLIENT_CERT_REQUEST 9 +# define SSL_CTRL_GET_NUM_RENEGOTIATIONS 10 +# define SSL_CTRL_CLEAR_NUM_RENEGOTIATIONS 11 +# define SSL_CTRL_GET_TOTAL_RENEGOTIATIONS 12 +# define SSL_CTRL_GET_FLAGS 13 +# define SSL_CTRL_EXTRA_CHAIN_CERT 14 +# define SSL_CTRL_SET_MSG_CALLBACK 15 +# define SSL_CTRL_SET_MSG_CALLBACK_ARG 16 +/* only applies to datagram connections */ +# define SSL_CTRL_SET_MTU 17 +/* Stats */ +# define SSL_CTRL_SESS_NUMBER 20 +# define SSL_CTRL_SESS_CONNECT 21 +# define SSL_CTRL_SESS_CONNECT_GOOD 22 +# define SSL_CTRL_SESS_CONNECT_RENEGOTIATE 23 +# define SSL_CTRL_SESS_ACCEPT 24 +# define SSL_CTRL_SESS_ACCEPT_GOOD 25 +# define SSL_CTRL_SESS_ACCEPT_RENEGOTIATE 26 +# define SSL_CTRL_SESS_HIT 27 +# define SSL_CTRL_SESS_CB_HIT 28 +# define SSL_CTRL_SESS_MISSES 29 +# define SSL_CTRL_SESS_TIMEOUTS 30 +# define SSL_CTRL_SESS_CACHE_FULL 31 +# define SSL_CTRL_OPTIONS 32 +# define SSL_CTRL_MODE 33 +# define SSL_CTRL_GET_READ_AHEAD 40 +# define SSL_CTRL_SET_READ_AHEAD 41 +# define SSL_CTRL_SET_SESS_CACHE_SIZE 42 +# define SSL_CTRL_GET_SESS_CACHE_SIZE 43 +# define SSL_CTRL_SET_SESS_CACHE_MODE 44 +# define SSL_CTRL_GET_SESS_CACHE_MODE 45 +# define SSL_CTRL_GET_MAX_CERT_LIST 50 +# define SSL_CTRL_SET_MAX_CERT_LIST 51 +# define SSL_CTRL_SET_MAX_SEND_FRAGMENT 52 +/* see tls1.h for macros based on these */ +# ifndef OPENSSL_NO_TLSEXT +# define SSL_CTRL_SET_TLSEXT_SERVERNAME_CB 53 +# define SSL_CTRL_SET_TLSEXT_SERVERNAME_ARG 54 +# define SSL_CTRL_SET_TLSEXT_HOSTNAME 55 +# define SSL_CTRL_SET_TLSEXT_DEBUG_CB 56 +# define SSL_CTRL_SET_TLSEXT_DEBUG_ARG 57 +# define SSL_CTRL_GET_TLSEXT_TICKET_KEYS 58 +# define SSL_CTRL_SET_TLSEXT_TICKET_KEYS 59 +# define SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT 60 +# define SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT_CB 61 +# define SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT_CB_ARG 62 +# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB 63 +# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB_ARG 64 +# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_TYPE 65 +# define SSL_CTRL_GET_TLSEXT_STATUS_REQ_EXTS 66 +# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_EXTS 67 +# define SSL_CTRL_GET_TLSEXT_STATUS_REQ_IDS 68 +# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_IDS 69 +# define SSL_CTRL_GET_TLSEXT_STATUS_REQ_OCSP_RESP 70 +# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_OCSP_RESP 71 +# define SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB 72 +# define SSL_CTRL_SET_TLS_EXT_SRP_USERNAME_CB 75 +# define SSL_CTRL_SET_SRP_VERIFY_PARAM_CB 76 +# define SSL_CTRL_SET_SRP_GIVE_CLIENT_PWD_CB 77 +# define SSL_CTRL_SET_SRP_ARG 78 +# define SSL_CTRL_SET_TLS_EXT_SRP_USERNAME 79 +# define SSL_CTRL_SET_TLS_EXT_SRP_STRENGTH 80 +# define SSL_CTRL_SET_TLS_EXT_SRP_PASSWORD 81 +# ifndef OPENSSL_NO_HEARTBEATS +# define SSL_CTRL_TLS_EXT_SEND_HEARTBEAT 85 +# define SSL_CTRL_GET_TLS_EXT_HEARTBEAT_PENDING 86 +# define SSL_CTRL_SET_TLS_EXT_HEARTBEAT_NO_REQUESTS 87 +# endif +# endif /* OPENSSL_NO_TLSEXT */ +# define DTLS_CTRL_GET_TIMEOUT 73 +# define DTLS_CTRL_HANDLE_TIMEOUT 74 +# define DTLS_CTRL_LISTEN 75 +# define SSL_CTRL_GET_RI_SUPPORT 76 +# define SSL_CTRL_CLEAR_OPTIONS 77 +# define SSL_CTRL_CLEAR_MODE 78 +# define SSL_CTRL_GET_EXTRA_CHAIN_CERTS 82 +# define SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS 83 +# define SSL_CTRL_CHAIN 88 +# define SSL_CTRL_CHAIN_CERT 89 +# define SSL_CTRL_GET_CURVES 90 +# define SSL_CTRL_SET_CURVES 91 +# define SSL_CTRL_SET_CURVES_LIST 92 +# define SSL_CTRL_GET_SHARED_CURVE 93 +# define SSL_CTRL_SET_ECDH_AUTO 94 +# define SSL_CTRL_SET_SIGALGS 97 +# define SSL_CTRL_SET_SIGALGS_LIST 98 +# define SSL_CTRL_CERT_FLAGS 99 +# define SSL_CTRL_CLEAR_CERT_FLAGS 100 +# define SSL_CTRL_SET_CLIENT_SIGALGS 101 +# define SSL_CTRL_SET_CLIENT_SIGALGS_LIST 102 +# define SSL_CTRL_GET_CLIENT_CERT_TYPES 103 +# define SSL_CTRL_SET_CLIENT_CERT_TYPES 104 +# define SSL_CTRL_BUILD_CERT_CHAIN 105 +# define SSL_CTRL_SET_VERIFY_CERT_STORE 106 +# define SSL_CTRL_SET_CHAIN_CERT_STORE 107 +# define SSL_CTRL_GET_PEER_SIGNATURE_NID 108 +# define SSL_CTRL_GET_SERVER_TMP_KEY 109 +# define SSL_CTRL_GET_RAW_CIPHERLIST 110 +# define SSL_CTRL_GET_EC_POINT_FORMATS 111 +# define SSL_CTRL_GET_CHAIN_CERTS 115 +# define SSL_CTRL_SELECT_CURRENT_CERT 116 +# define SSL_CTRL_SET_CURRENT_CERT 117 +# define SSL_CTRL_CHECK_PROTO_VERSION 119 +# define DTLS_CTRL_SET_LINK_MTU 120 +# define DTLS_CTRL_GET_LINK_MIN_MTU 121 +# define SSL_CERT_SET_FIRST 1 +# define SSL_CERT_SET_NEXT 2 +# define SSL_CERT_SET_SERVER 3 +# define DTLSv1_get_timeout(ssl, arg) \ + SSL_ctrl(ssl,DTLS_CTRL_GET_TIMEOUT,0, (void *)arg) +# define DTLSv1_handle_timeout(ssl) \ + SSL_ctrl(ssl,DTLS_CTRL_HANDLE_TIMEOUT,0, NULL) +# define DTLSv1_listen(ssl, peer) \ + SSL_ctrl(ssl,DTLS_CTRL_LISTEN,0, (void *)peer) +# define SSL_session_reused(ssl) \ + SSL_ctrl((ssl),SSL_CTRL_GET_SESSION_REUSED,0,NULL) +# define SSL_num_renegotiations(ssl) \ + SSL_ctrl((ssl),SSL_CTRL_GET_NUM_RENEGOTIATIONS,0,NULL) +# define SSL_clear_num_renegotiations(ssl) \ + SSL_ctrl((ssl),SSL_CTRL_CLEAR_NUM_RENEGOTIATIONS,0,NULL) +# define SSL_total_renegotiations(ssl) \ + SSL_ctrl((ssl),SSL_CTRL_GET_TOTAL_RENEGOTIATIONS,0,NULL) +# define SSL_CTX_need_tmp_RSA(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_NEED_TMP_RSA,0,NULL) +# define SSL_CTX_set_tmp_rsa(ctx,rsa) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_RSA,0,(char *)rsa) +# define SSL_CTX_set_tmp_dh(ctx,dh) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_DH,0,(char *)dh) +# define SSL_CTX_set_tmp_ecdh(ctx,ecdh) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_ECDH,0,(char *)ecdh) +# define SSL_need_tmp_RSA(ssl) \ + SSL_ctrl(ssl,SSL_CTRL_NEED_TMP_RSA,0,NULL) +# define SSL_set_tmp_rsa(ssl,rsa) \ + SSL_ctrl(ssl,SSL_CTRL_SET_TMP_RSA,0,(char *)rsa) +# define SSL_set_tmp_dh(ssl,dh) \ + SSL_ctrl(ssl,SSL_CTRL_SET_TMP_DH,0,(char *)dh) +# define SSL_set_tmp_ecdh(ssl,ecdh) \ + SSL_ctrl(ssl,SSL_CTRL_SET_TMP_ECDH,0,(char *)ecdh) +# define SSL_CTX_add_extra_chain_cert(ctx,x509) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_EXTRA_CHAIN_CERT,0,(char *)x509) +# define SSL_CTX_get_extra_chain_certs(ctx,px509) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_GET_EXTRA_CHAIN_CERTS,0,px509) +# define SSL_CTX_get_extra_chain_certs_only(ctx,px509) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_GET_EXTRA_CHAIN_CERTS,1,px509) +# define SSL_CTX_clear_extra_chain_certs(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS,0,NULL) +# define SSL_CTX_set0_chain(ctx,sk) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_CHAIN,0,(char *)sk) +# define SSL_CTX_set1_chain(ctx,sk) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_CHAIN,1,(char *)sk) +# define SSL_CTX_add0_chain_cert(ctx,x509) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_CHAIN_CERT,0,(char *)x509) +# define SSL_CTX_add1_chain_cert(ctx,x509) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_CHAIN_CERT,1,(char *)x509) +# define SSL_CTX_get0_chain_certs(ctx,px509) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_GET_CHAIN_CERTS,0,px509) +# define SSL_CTX_clear_chain_certs(ctx) \ + SSL_CTX_set0_chain(ctx,NULL) +# define SSL_CTX_build_cert_chain(ctx, flags) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_BUILD_CERT_CHAIN, flags, NULL) +# define SSL_CTX_select_current_cert(ctx,x509) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SELECT_CURRENT_CERT,0,(char *)x509) +# define SSL_CTX_set_current_cert(ctx, op) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CURRENT_CERT, op, NULL) +# define SSL_CTX_set0_verify_cert_store(ctx,st) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_VERIFY_CERT_STORE,0,(char *)st) +# define SSL_CTX_set1_verify_cert_store(ctx,st) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_VERIFY_CERT_STORE,1,(char *)st) +# define SSL_CTX_set0_chain_cert_store(ctx,st) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CHAIN_CERT_STORE,0,(char *)st) +# define SSL_CTX_set1_chain_cert_store(ctx,st) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CHAIN_CERT_STORE,1,(char *)st) +# define SSL_set0_chain(ctx,sk) \ + SSL_ctrl(ctx,SSL_CTRL_CHAIN,0,(char *)sk) +# define SSL_set1_chain(ctx,sk) \ + SSL_ctrl(ctx,SSL_CTRL_CHAIN,1,(char *)sk) +# define SSL_add0_chain_cert(ctx,x509) \ + SSL_ctrl(ctx,SSL_CTRL_CHAIN_CERT,0,(char *)x509) +# define SSL_add1_chain_cert(ctx,x509) \ + SSL_ctrl(ctx,SSL_CTRL_CHAIN_CERT,1,(char *)x509) +# define SSL_get0_chain_certs(ctx,px509) \ + SSL_ctrl(ctx,SSL_CTRL_GET_CHAIN_CERTS,0,px509) +# define SSL_clear_chain_certs(ctx) \ + SSL_set0_chain(ctx,NULL) +# define SSL_build_cert_chain(s, flags) \ + SSL_ctrl(s,SSL_CTRL_BUILD_CERT_CHAIN, flags, NULL) +# define SSL_select_current_cert(ctx,x509) \ + SSL_ctrl(ctx,SSL_CTRL_SELECT_CURRENT_CERT,0,(char *)x509) +# define SSL_set_current_cert(ctx,op) \ + SSL_ctrl(ctx,SSL_CTRL_SET_CURRENT_CERT, op, NULL) +# define SSL_set0_verify_cert_store(s,st) \ + SSL_ctrl(s,SSL_CTRL_SET_VERIFY_CERT_STORE,0,(char *)st) +# define SSL_set1_verify_cert_store(s,st) \ + SSL_ctrl(s,SSL_CTRL_SET_VERIFY_CERT_STORE,1,(char *)st) +# define SSL_set0_chain_cert_store(s,st) \ + SSL_ctrl(s,SSL_CTRL_SET_CHAIN_CERT_STORE,0,(char *)st) +# define SSL_set1_chain_cert_store(s,st) \ + SSL_ctrl(s,SSL_CTRL_SET_CHAIN_CERT_STORE,1,(char *)st) +# define SSL_get1_curves(ctx, s) \ + SSL_ctrl(ctx,SSL_CTRL_GET_CURVES,0,(char *)s) +# define SSL_CTX_set1_curves(ctx, clist, clistlen) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CURVES,clistlen,(char *)clist) +# define SSL_CTX_set1_curves_list(ctx, s) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CURVES_LIST,0,(char *)s) +# define SSL_set1_curves(ctx, clist, clistlen) \ + SSL_ctrl(ctx,SSL_CTRL_SET_CURVES,clistlen,(char *)clist) +# define SSL_set1_curves_list(ctx, s) \ + SSL_ctrl(ctx,SSL_CTRL_SET_CURVES_LIST,0,(char *)s) +# define SSL_get_shared_curve(s, n) \ + SSL_ctrl(s,SSL_CTRL_GET_SHARED_CURVE,n,NULL) +# define SSL_CTX_set_ecdh_auto(ctx, onoff) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_ECDH_AUTO,onoff,NULL) +# define SSL_set_ecdh_auto(s, onoff) \ + SSL_ctrl(s,SSL_CTRL_SET_ECDH_AUTO,onoff,NULL) +# define SSL_CTX_set1_sigalgs(ctx, slist, slistlen) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SIGALGS,slistlen,(int *)slist) +# define SSL_CTX_set1_sigalgs_list(ctx, s) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SIGALGS_LIST,0,(char *)s) +# define SSL_set1_sigalgs(ctx, slist, slistlen) \ + SSL_ctrl(ctx,SSL_CTRL_SET_SIGALGS,slistlen,(int *)slist) +# define SSL_set1_sigalgs_list(ctx, s) \ + SSL_ctrl(ctx,SSL_CTRL_SET_SIGALGS_LIST,0,(char *)s) +# define SSL_CTX_set1_client_sigalgs(ctx, slist, slistlen) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CLIENT_SIGALGS,slistlen,(int *)slist) +# define SSL_CTX_set1_client_sigalgs_list(ctx, s) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CLIENT_SIGALGS_LIST,0,(char *)s) +# define SSL_set1_client_sigalgs(ctx, slist, slistlen) \ + SSL_ctrl(ctx,SSL_CTRL_SET_CLIENT_SIGALGS,clistlen,(int *)slist) +# define SSL_set1_client_sigalgs_list(ctx, s) \ + SSL_ctrl(ctx,SSL_CTRL_SET_CLIENT_SIGALGS_LIST,0,(char *)s) +# define SSL_get0_certificate_types(s, clist) \ + SSL_ctrl(s, SSL_CTRL_GET_CLIENT_CERT_TYPES, 0, (char *)clist) +# define SSL_CTX_set1_client_certificate_types(ctx, clist, clistlen) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CLIENT_CERT_TYPES,clistlen,(char *)clist) +# define SSL_set1_client_certificate_types(s, clist, clistlen) \ + SSL_ctrl(s,SSL_CTRL_SET_CLIENT_CERT_TYPES,clistlen,(char *)clist) +# define SSL_get_peer_signature_nid(s, pn) \ + SSL_ctrl(s,SSL_CTRL_GET_PEER_SIGNATURE_NID,0,pn) +# define SSL_get_server_tmp_key(s, pk) \ + SSL_ctrl(s,SSL_CTRL_GET_SERVER_TMP_KEY,0,pk) +# define SSL_get0_raw_cipherlist(s, plst) \ + SSL_ctrl(s,SSL_CTRL_GET_RAW_CIPHERLIST,0,(char *)plst) +# define SSL_get0_ec_point_formats(s, plst) \ + SSL_ctrl(s,SSL_CTRL_GET_EC_POINT_FORMATS,0,(char *)plst) +# ifndef OPENSSL_NO_BIO +BIO_METHOD *BIO_f_ssl(void); +BIO *BIO_new_ssl(SSL_CTX *ctx, int client); +BIO *BIO_new_ssl_connect(SSL_CTX *ctx); +BIO *BIO_new_buffer_ssl_connect(SSL_CTX *ctx); +int BIO_ssl_copy_session_id(BIO *to, BIO *from); +void BIO_ssl_shutdown(BIO *ssl_bio); + +# endif + +int SSL_CTX_set_cipher_list(SSL_CTX *, const char *str); +SSL_CTX *SSL_CTX_new(const SSL_METHOD *meth); +void SSL_CTX_free(SSL_CTX *); +long SSL_CTX_set_timeout(SSL_CTX *ctx, long t); +long SSL_CTX_get_timeout(const SSL_CTX *ctx); +X509_STORE *SSL_CTX_get_cert_store(const SSL_CTX *); +void SSL_CTX_set_cert_store(SSL_CTX *, X509_STORE *); +int SSL_want(const SSL *s); +int SSL_clear(SSL *s); + +void SSL_CTX_flush_sessions(SSL_CTX *ctx, long tm); + +const SSL_CIPHER *SSL_get_current_cipher(const SSL *s); +int SSL_CIPHER_get_bits(const SSL_CIPHER *c, int *alg_bits); +char *SSL_CIPHER_get_version(const SSL_CIPHER *c); +const char *SSL_CIPHER_get_name(const SSL_CIPHER *c); +unsigned long SSL_CIPHER_get_id(const SSL_CIPHER *c); + +int SSL_get_fd(const SSL *s); +int SSL_get_rfd(const SSL *s); +int SSL_get_wfd(const SSL *s); +const char *SSL_get_cipher_list(const SSL *s, int n); +char *SSL_get_shared_ciphers(const SSL *s, char *buf, int len); +int SSL_get_read_ahead(const SSL *s); +int SSL_pending(const SSL *s); +# ifndef OPENSSL_NO_SOCK +int SSL_set_fd(SSL *s, int fd); +int SSL_set_rfd(SSL *s, int fd); +int SSL_set_wfd(SSL *s, int fd); +# endif +# ifndef OPENSSL_NO_BIO +void SSL_set_bio(SSL *s, BIO *rbio, BIO *wbio); +BIO *SSL_get_rbio(const SSL *s); +BIO *SSL_get_wbio(const SSL *s); +# endif +int SSL_set_cipher_list(SSL *s, const char *str); +void SSL_set_read_ahead(SSL *s, int yes); +int SSL_get_verify_mode(const SSL *s); +int SSL_get_verify_depth(const SSL *s); +int (*SSL_get_verify_callback(const SSL *s)) (int, X509_STORE_CTX *); +void SSL_set_verify(SSL *s, int mode, + int (*callback) (int ok, X509_STORE_CTX *ctx)); +void SSL_set_verify_depth(SSL *s, int depth); +void SSL_set_cert_cb(SSL *s, int (*cb) (SSL *ssl, void *arg), void *arg); +# ifndef OPENSSL_NO_RSA +int SSL_use_RSAPrivateKey(SSL *ssl, RSA *rsa); +# endif +int SSL_use_RSAPrivateKey_ASN1(SSL *ssl, unsigned char *d, long len); +int SSL_use_PrivateKey(SSL *ssl, EVP_PKEY *pkey); +int SSL_use_PrivateKey_ASN1(int pk, SSL *ssl, const unsigned char *d, + long len); +int SSL_use_certificate(SSL *ssl, X509 *x); +int SSL_use_certificate_ASN1(SSL *ssl, const unsigned char *d, int len); + +# ifndef OPENSSL_NO_TLSEXT +/* Set serverinfo data for the current active cert. */ +int SSL_CTX_use_serverinfo(SSL_CTX *ctx, const unsigned char *serverinfo, + size_t serverinfo_length); +# ifndef OPENSSL_NO_STDIO +int SSL_CTX_use_serverinfo_file(SSL_CTX *ctx, const char *file); +# endif /* NO_STDIO */ + +# endif + +# ifndef OPENSSL_NO_STDIO +int SSL_use_RSAPrivateKey_file(SSL *ssl, const char *file, int type); +int SSL_use_PrivateKey_file(SSL *ssl, const char *file, int type); +int SSL_use_certificate_file(SSL *ssl, const char *file, int type); +int SSL_CTX_use_RSAPrivateKey_file(SSL_CTX *ctx, const char *file, int type); +int SSL_CTX_use_PrivateKey_file(SSL_CTX *ctx, const char *file, int type); +int SSL_CTX_use_certificate_file(SSL_CTX *ctx, const char *file, int type); +/* PEM type */ +int SSL_CTX_use_certificate_chain_file(SSL_CTX *ctx, const char *file); +STACK_OF(X509_NAME) *SSL_load_client_CA_file(const char *file); +int SSL_add_file_cert_subjects_to_stack(STACK_OF(X509_NAME) *stackCAs, + const char *file); +# ifndef OPENSSL_SYS_VMS +/* XXXXX: Better scheme needed! [was: #ifndef MAC_OS_pre_X] */ +# ifndef OPENSSL_SYS_MACINTOSH_CLASSIC +int SSL_add_dir_cert_subjects_to_stack(STACK_OF(X509_NAME) *stackCAs, + const char *dir); +# endif +# endif + +# endif + +void SSL_load_error_strings(void); +const char *SSL_state_string(const SSL *s); +const char *SSL_rstate_string(const SSL *s); +const char *SSL_state_string_long(const SSL *s); +const char *SSL_rstate_string_long(const SSL *s); +long SSL_SESSION_get_time(const SSL_SESSION *s); +long SSL_SESSION_set_time(SSL_SESSION *s, long t); +long SSL_SESSION_get_timeout(const SSL_SESSION *s); +long SSL_SESSION_set_timeout(SSL_SESSION *s, long t); +void SSL_copy_session_id(SSL *to, const SSL *from); +X509 *SSL_SESSION_get0_peer(SSL_SESSION *s); +int SSL_SESSION_set1_id_context(SSL_SESSION *s, const unsigned char *sid_ctx, + unsigned int sid_ctx_len); + +SSL_SESSION *SSL_SESSION_new(void); +const unsigned char *SSL_SESSION_get_id(const SSL_SESSION *s, + unsigned int *len); +unsigned int SSL_SESSION_get_compress_id(const SSL_SESSION *s); +# ifndef OPENSSL_NO_FP_API +int SSL_SESSION_print_fp(FILE *fp, const SSL_SESSION *ses); +# endif +# ifndef OPENSSL_NO_BIO +int SSL_SESSION_print(BIO *fp, const SSL_SESSION *ses); +# endif +void SSL_SESSION_free(SSL_SESSION *ses); +int i2d_SSL_SESSION(SSL_SESSION *in, unsigned char **pp); +int SSL_set_session(SSL *to, SSL_SESSION *session); +int SSL_CTX_add_session(SSL_CTX *s, SSL_SESSION *c); +int SSL_CTX_remove_session(SSL_CTX *, SSL_SESSION *c); +int SSL_CTX_set_generate_session_id(SSL_CTX *, GEN_SESSION_CB); +int SSL_set_generate_session_id(SSL *, GEN_SESSION_CB); +int SSL_has_matching_session_id(const SSL *ssl, const unsigned char *id, + unsigned int id_len); +SSL_SESSION *d2i_SSL_SESSION(SSL_SESSION **a, const unsigned char **pp, + long length); + +# ifdef HEADER_X509_H +X509 *SSL_get_peer_certificate(const SSL *s); +# endif + +STACK_OF(X509) *SSL_get_peer_cert_chain(const SSL *s); + +int SSL_CTX_get_verify_mode(const SSL_CTX *ctx); +int SSL_CTX_get_verify_depth(const SSL_CTX *ctx); +int (*SSL_CTX_get_verify_callback(const SSL_CTX *ctx)) (int, + X509_STORE_CTX *); +void SSL_CTX_set_verify(SSL_CTX *ctx, int mode, + int (*callback) (int, X509_STORE_CTX *)); +void SSL_CTX_set_verify_depth(SSL_CTX *ctx, int depth); +void SSL_CTX_set_cert_verify_callback(SSL_CTX *ctx, + int (*cb) (X509_STORE_CTX *, void *), + void *arg); +void SSL_CTX_set_cert_cb(SSL_CTX *c, int (*cb) (SSL *ssl, void *arg), + void *arg); +# ifndef OPENSSL_NO_RSA +int SSL_CTX_use_RSAPrivateKey(SSL_CTX *ctx, RSA *rsa); +# endif +int SSL_CTX_use_RSAPrivateKey_ASN1(SSL_CTX *ctx, const unsigned char *d, + long len); +int SSL_CTX_use_PrivateKey(SSL_CTX *ctx, EVP_PKEY *pkey); +int SSL_CTX_use_PrivateKey_ASN1(int pk, SSL_CTX *ctx, + const unsigned char *d, long len); +int SSL_CTX_use_certificate(SSL_CTX *ctx, X509 *x); +int SSL_CTX_use_certificate_ASN1(SSL_CTX *ctx, int len, + const unsigned char *d); + +void SSL_CTX_set_default_passwd_cb(SSL_CTX *ctx, pem_password_cb *cb); +void SSL_CTX_set_default_passwd_cb_userdata(SSL_CTX *ctx, void *u); + +int SSL_CTX_check_private_key(const SSL_CTX *ctx); +int SSL_check_private_key(const SSL *ctx); + +int SSL_CTX_set_session_id_context(SSL_CTX *ctx, const unsigned char *sid_ctx, + unsigned int sid_ctx_len); + +SSL *SSL_new(SSL_CTX *ctx); +int SSL_set_session_id_context(SSL *ssl, const unsigned char *sid_ctx, + unsigned int sid_ctx_len); + +int SSL_CTX_set_purpose(SSL_CTX *s, int purpose); +int SSL_set_purpose(SSL *s, int purpose); +int SSL_CTX_set_trust(SSL_CTX *s, int trust); +int SSL_set_trust(SSL *s, int trust); + +int SSL_CTX_set1_param(SSL_CTX *ctx, X509_VERIFY_PARAM *vpm); +int SSL_set1_param(SSL *ssl, X509_VERIFY_PARAM *vpm); + +X509_VERIFY_PARAM *SSL_CTX_get0_param(SSL_CTX *ctx); +X509_VERIFY_PARAM *SSL_get0_param(SSL *ssl); + +# ifndef OPENSSL_NO_SRP +int SSL_CTX_set_srp_username(SSL_CTX *ctx, char *name); +int SSL_CTX_set_srp_password(SSL_CTX *ctx, char *password); +int SSL_CTX_set_srp_strength(SSL_CTX *ctx, int strength); +int SSL_CTX_set_srp_client_pwd_callback(SSL_CTX *ctx, + char *(*cb) (SSL *, void *)); +int SSL_CTX_set_srp_verify_param_callback(SSL_CTX *ctx, + int (*cb) (SSL *, void *)); +int SSL_CTX_set_srp_username_callback(SSL_CTX *ctx, + int (*cb) (SSL *, int *, void *)); +int SSL_CTX_set_srp_cb_arg(SSL_CTX *ctx, void *arg); + +int SSL_set_srp_server_param(SSL *s, const BIGNUM *N, const BIGNUM *g, + BIGNUM *sa, BIGNUM *v, char *info); +int SSL_set_srp_server_param_pw(SSL *s, const char *user, const char *pass, + const char *grp); + +BIGNUM *SSL_get_srp_g(SSL *s); +BIGNUM *SSL_get_srp_N(SSL *s); + +char *SSL_get_srp_username(SSL *s); +char *SSL_get_srp_userinfo(SSL *s); +# endif + +void SSL_certs_clear(SSL *s); +void SSL_free(SSL *ssl); +int SSL_accept(SSL *ssl); +int SSL_connect(SSL *ssl); +int SSL_read(SSL *ssl, void *buf, int num); +int SSL_peek(SSL *ssl, void *buf, int num); +int SSL_write(SSL *ssl, const void *buf, int num); +long SSL_ctrl(SSL *ssl, int cmd, long larg, void *parg); +long SSL_callback_ctrl(SSL *, int, void (*)(void)); +long SSL_CTX_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg); +long SSL_CTX_callback_ctrl(SSL_CTX *, int, void (*)(void)); + +int SSL_get_error(const SSL *s, int ret_code); +const char *SSL_get_version(const SSL *s); + +/* This sets the 'default' SSL version that SSL_new() will create */ +int SSL_CTX_set_ssl_version(SSL_CTX *ctx, const SSL_METHOD *meth); + +# ifndef OPENSSL_NO_SSL2 +const SSL_METHOD *SSLv2_method(void); /* SSLv2 */ +const SSL_METHOD *SSLv2_server_method(void); /* SSLv2 */ +const SSL_METHOD *SSLv2_client_method(void); /* SSLv2 */ +# endif + +# ifndef OPENSSL_NO_SSL3_METHOD +const SSL_METHOD *SSLv3_method(void); /* SSLv3 */ +const SSL_METHOD *SSLv3_server_method(void); /* SSLv3 */ +const SSL_METHOD *SSLv3_client_method(void); /* SSLv3 */ +# endif + +const SSL_METHOD *SSLv23_method(void); /* Negotiate highest available SSL/TLS + * version */ +const SSL_METHOD *SSLv23_server_method(void); /* Negotiate highest available + * SSL/TLS version */ +const SSL_METHOD *SSLv23_client_method(void); /* Negotiate highest available + * SSL/TLS version */ + +const SSL_METHOD *TLSv1_method(void); /* TLSv1.0 */ +const SSL_METHOD *TLSv1_server_method(void); /* TLSv1.0 */ +const SSL_METHOD *TLSv1_client_method(void); /* TLSv1.0 */ + +const SSL_METHOD *TLSv1_1_method(void); /* TLSv1.1 */ +const SSL_METHOD *TLSv1_1_server_method(void); /* TLSv1.1 */ +const SSL_METHOD *TLSv1_1_client_method(void); /* TLSv1.1 */ + +const SSL_METHOD *TLSv1_2_method(void); /* TLSv1.2 */ +const SSL_METHOD *TLSv1_2_server_method(void); /* TLSv1.2 */ +const SSL_METHOD *TLSv1_2_client_method(void); /* TLSv1.2 */ + +const SSL_METHOD *DTLSv1_method(void); /* DTLSv1.0 */ +const SSL_METHOD *DTLSv1_server_method(void); /* DTLSv1.0 */ +const SSL_METHOD *DTLSv1_client_method(void); /* DTLSv1.0 */ + +const SSL_METHOD *DTLSv1_2_method(void); /* DTLSv1.2 */ +const SSL_METHOD *DTLSv1_2_server_method(void); /* DTLSv1.2 */ +const SSL_METHOD *DTLSv1_2_client_method(void); /* DTLSv1.2 */ + +const SSL_METHOD *DTLS_method(void); /* DTLS 1.0 and 1.2 */ +const SSL_METHOD *DTLS_server_method(void); /* DTLS 1.0 and 1.2 */ +const SSL_METHOD *DTLS_client_method(void); /* DTLS 1.0 and 1.2 */ + +STACK_OF(SSL_CIPHER) *SSL_get_ciphers(const SSL *s); + +int SSL_do_handshake(SSL *s); +int SSL_renegotiate(SSL *s); +int SSL_renegotiate_abbreviated(SSL *s); +int SSL_renegotiate_pending(SSL *s); +int SSL_shutdown(SSL *s); + +const SSL_METHOD *SSL_CTX_get_ssl_method(SSL_CTX *ctx); +const SSL_METHOD *SSL_get_ssl_method(SSL *s); +int SSL_set_ssl_method(SSL *s, const SSL_METHOD *method); +const char *SSL_alert_type_string_long(int value); +const char *SSL_alert_type_string(int value); +const char *SSL_alert_desc_string_long(int value); +const char *SSL_alert_desc_string(int value); + +void SSL_set_client_CA_list(SSL *s, STACK_OF(X509_NAME) *name_list); +void SSL_CTX_set_client_CA_list(SSL_CTX *ctx, STACK_OF(X509_NAME) *name_list); +STACK_OF(X509_NAME) *SSL_get_client_CA_list(const SSL *s); +STACK_OF(X509_NAME) *SSL_CTX_get_client_CA_list(const SSL_CTX *s); +int SSL_add_client_CA(SSL *ssl, X509 *x); +int SSL_CTX_add_client_CA(SSL_CTX *ctx, X509 *x); + +void SSL_set_connect_state(SSL *s); +void SSL_set_accept_state(SSL *s); + +long SSL_get_default_timeout(const SSL *s); + +int SSL_library_init(void); + +char *SSL_CIPHER_description(const SSL_CIPHER *, char *buf, int size); +STACK_OF(X509_NAME) *SSL_dup_CA_list(STACK_OF(X509_NAME) *sk); + +SSL *SSL_dup(SSL *ssl); + +X509 *SSL_get_certificate(const SSL *ssl); +/* + * EVP_PKEY + */ struct evp_pkey_st *SSL_get_privatekey(const SSL *ssl); + +X509 *SSL_CTX_get0_certificate(const SSL_CTX *ctx); +EVP_PKEY *SSL_CTX_get0_privatekey(const SSL_CTX *ctx); + +void SSL_CTX_set_quiet_shutdown(SSL_CTX *ctx, int mode); +int SSL_CTX_get_quiet_shutdown(const SSL_CTX *ctx); +void SSL_set_quiet_shutdown(SSL *ssl, int mode); +int SSL_get_quiet_shutdown(const SSL *ssl); +void SSL_set_shutdown(SSL *ssl, int mode); +int SSL_get_shutdown(const SSL *ssl); +int SSL_version(const SSL *ssl); +int SSL_CTX_set_default_verify_paths(SSL_CTX *ctx); +int SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *CAfile, + const char *CApath); +# define SSL_get0_session SSL_get_session/* just peek at pointer */ +SSL_SESSION *SSL_get_session(const SSL *ssl); +SSL_SESSION *SSL_get1_session(SSL *ssl); /* obtain a reference count */ +SSL_CTX *SSL_get_SSL_CTX(const SSL *ssl); +SSL_CTX *SSL_set_SSL_CTX(SSL *ssl, SSL_CTX *ctx); +void SSL_set_info_callback(SSL *ssl, + void (*cb) (const SSL *ssl, int type, int val)); +void (*SSL_get_info_callback(const SSL *ssl)) (const SSL *ssl, int type, + int val); +int SSL_state(const SSL *ssl); +void SSL_set_state(SSL *ssl, int state); + +void SSL_set_verify_result(SSL *ssl, long v); +long SSL_get_verify_result(const SSL *ssl); + +int SSL_set_ex_data(SSL *ssl, int idx, void *data); +void *SSL_get_ex_data(const SSL *ssl, int idx); +int SSL_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); + +int SSL_SESSION_set_ex_data(SSL_SESSION *ss, int idx, void *data); +void *SSL_SESSION_get_ex_data(const SSL_SESSION *ss, int idx); +int SSL_SESSION_get_ex_new_index(long argl, void *argp, + CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, + CRYPTO_EX_free *free_func); + +int SSL_CTX_set_ex_data(SSL_CTX *ssl, int idx, void *data); +void *SSL_CTX_get_ex_data(const SSL_CTX *ssl, int idx); +int SSL_CTX_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, + CRYPTO_EX_free *free_func); + +int SSL_get_ex_data_X509_STORE_CTX_idx(void); + +# define SSL_CTX_sess_set_cache_size(ctx,t) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SESS_CACHE_SIZE,t,NULL) +# define SSL_CTX_sess_get_cache_size(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_GET_SESS_CACHE_SIZE,0,NULL) +# define SSL_CTX_set_session_cache_mode(ctx,m) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SESS_CACHE_MODE,m,NULL) +# define SSL_CTX_get_session_cache_mode(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_GET_SESS_CACHE_MODE,0,NULL) + +# define SSL_CTX_get_default_read_ahead(ctx) SSL_CTX_get_read_ahead(ctx) +# define SSL_CTX_set_default_read_ahead(ctx,m) SSL_CTX_set_read_ahead(ctx,m) +# define SSL_CTX_get_read_ahead(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_GET_READ_AHEAD,0,NULL) +# define SSL_CTX_set_read_ahead(ctx,m) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_READ_AHEAD,m,NULL) +# define SSL_CTX_get_max_cert_list(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_GET_MAX_CERT_LIST,0,NULL) +# define SSL_CTX_set_max_cert_list(ctx,m) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_MAX_CERT_LIST,m,NULL) +# define SSL_get_max_cert_list(ssl) \ + SSL_ctrl(ssl,SSL_CTRL_GET_MAX_CERT_LIST,0,NULL) +# define SSL_set_max_cert_list(ssl,m) \ + SSL_ctrl(ssl,SSL_CTRL_SET_MAX_CERT_LIST,m,NULL) + +# define SSL_CTX_set_max_send_fragment(ctx,m) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_MAX_SEND_FRAGMENT,m,NULL) +# define SSL_set_max_send_fragment(ssl,m) \ + SSL_ctrl(ssl,SSL_CTRL_SET_MAX_SEND_FRAGMENT,m,NULL) + + /* NB: the keylength is only applicable when is_export is true */ +# ifndef OPENSSL_NO_RSA +void SSL_CTX_set_tmp_rsa_callback(SSL_CTX *ctx, + RSA *(*cb) (SSL *ssl, int is_export, + int keylength)); + +void SSL_set_tmp_rsa_callback(SSL *ssl, + RSA *(*cb) (SSL *ssl, int is_export, + int keylength)); +# endif +# ifndef OPENSSL_NO_DH +void SSL_CTX_set_tmp_dh_callback(SSL_CTX *ctx, + DH *(*dh) (SSL *ssl, int is_export, + int keylength)); +void SSL_set_tmp_dh_callback(SSL *ssl, + DH *(*dh) (SSL *ssl, int is_export, + int keylength)); +# endif +# ifndef OPENSSL_NO_ECDH +void SSL_CTX_set_tmp_ecdh_callback(SSL_CTX *ctx, + EC_KEY *(*ecdh) (SSL *ssl, int is_export, + int keylength)); +void SSL_set_tmp_ecdh_callback(SSL *ssl, + EC_KEY *(*ecdh) (SSL *ssl, int is_export, + int keylength)); +# endif + +# ifndef OPENSSL_NO_COMP +const COMP_METHOD *SSL_get_current_compression(SSL *s); +const COMP_METHOD *SSL_get_current_expansion(SSL *s); +const char *SSL_COMP_get_name(const COMP_METHOD *comp); +STACK_OF(SSL_COMP) *SSL_COMP_get_compression_methods(void); +STACK_OF(SSL_COMP) *SSL_COMP_set0_compression_methods(STACK_OF(SSL_COMP) + *meths); +void SSL_COMP_free_compression_methods(void); +int SSL_COMP_add_compression_method(int id, COMP_METHOD *cm); +# else +const void *SSL_get_current_compression(SSL *s); +const void *SSL_get_current_expansion(SSL *s); +const char *SSL_COMP_get_name(const void *comp); +void *SSL_COMP_get_compression_methods(void); +int SSL_COMP_add_compression_method(int id, void *cm); +# endif + +const SSL_CIPHER *SSL_CIPHER_find(SSL *ssl, const unsigned char *ptr); + +/* TLS extensions functions */ +int SSL_set_session_ticket_ext(SSL *s, void *ext_data, int ext_len); + +int SSL_set_session_ticket_ext_cb(SSL *s, tls_session_ticket_ext_cb_fn cb, + void *arg); + +/* Pre-shared secret session resumption functions */ +int SSL_set_session_secret_cb(SSL *s, + tls_session_secret_cb_fn tls_session_secret_cb, + void *arg); + +void SSL_set_debug(SSL *s, int debug); +int SSL_cache_hit(SSL *s); +int SSL_is_server(SSL *s); + +SSL_CONF_CTX *SSL_CONF_CTX_new(void); +int SSL_CONF_CTX_finish(SSL_CONF_CTX *cctx); +void SSL_CONF_CTX_free(SSL_CONF_CTX *cctx); +unsigned int SSL_CONF_CTX_set_flags(SSL_CONF_CTX *cctx, unsigned int flags); +unsigned int SSL_CONF_CTX_clear_flags(SSL_CONF_CTX *cctx, unsigned int flags); +int SSL_CONF_CTX_set1_prefix(SSL_CONF_CTX *cctx, const char *pre); + +void SSL_CONF_CTX_set_ssl(SSL_CONF_CTX *cctx, SSL *ssl); +void SSL_CONF_CTX_set_ssl_ctx(SSL_CONF_CTX *cctx, SSL_CTX *ctx); + +int SSL_CONF_cmd(SSL_CONF_CTX *cctx, const char *cmd, const char *value); +int SSL_CONF_cmd_argv(SSL_CONF_CTX *cctx, int *pargc, char ***pargv); +int SSL_CONF_cmd_value_type(SSL_CONF_CTX *cctx, const char *cmd); + +# ifndef OPENSSL_NO_SSL_TRACE +void SSL_trace(int write_p, int version, int content_type, + const void *buf, size_t len, SSL *ssl, void *arg); +const char *SSL_CIPHER_standard_name(const SSL_CIPHER *c); +# endif + +# ifndef OPENSSL_NO_UNIT_TEST +const struct openssl_ssl_test_functions *SSL_test_functions(void); +# endif + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_SSL_strings(void); + +/* Error codes for the SSL functions. */ + +/* Function codes. */ +# define SSL_F_CHECK_SUITEB_CIPHER_LIST 331 +# define SSL_F_CLIENT_CERTIFICATE 100 +# define SSL_F_CLIENT_FINISHED 167 +# define SSL_F_CLIENT_HELLO 101 +# define SSL_F_CLIENT_MASTER_KEY 102 +# define SSL_F_D2I_SSL_SESSION 103 +# define SSL_F_DO_DTLS1_WRITE 245 +# define SSL_F_DO_SSL3_WRITE 104 +# define SSL_F_DTLS1_ACCEPT 246 +# define SSL_F_DTLS1_ADD_CERT_TO_BUF 295 +# define SSL_F_DTLS1_BUFFER_RECORD 247 +# define SSL_F_DTLS1_CHECK_TIMEOUT_NUM 316 +# define SSL_F_DTLS1_CLIENT_HELLO 248 +# define SSL_F_DTLS1_CONNECT 249 +# define SSL_F_DTLS1_ENC 250 +# define SSL_F_DTLS1_GET_HELLO_VERIFY 251 +# define SSL_F_DTLS1_GET_MESSAGE 252 +# define SSL_F_DTLS1_GET_MESSAGE_FRAGMENT 253 +# define SSL_F_DTLS1_GET_RECORD 254 +# define SSL_F_DTLS1_HANDLE_TIMEOUT 297 +# define SSL_F_DTLS1_HEARTBEAT 305 +# define SSL_F_DTLS1_OUTPUT_CERT_CHAIN 255 +# define SSL_F_DTLS1_PREPROCESS_FRAGMENT 288 +# define SSL_F_DTLS1_PROCESS_OUT_OF_SEQ_MESSAGE 256 +# define SSL_F_DTLS1_PROCESS_RECORD 257 +# define SSL_F_DTLS1_READ_BYTES 258 +# define SSL_F_DTLS1_READ_FAILED 259 +# define SSL_F_DTLS1_SEND_CERTIFICATE_REQUEST 260 +# define SSL_F_DTLS1_SEND_CLIENT_CERTIFICATE 261 +# define SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE 262 +# define SSL_F_DTLS1_SEND_CLIENT_VERIFY 263 +# define SSL_F_DTLS1_SEND_HELLO_VERIFY_REQUEST 264 +# define SSL_F_DTLS1_SEND_SERVER_CERTIFICATE 265 +# define SSL_F_DTLS1_SEND_SERVER_HELLO 266 +# define SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE 267 +# define SSL_F_DTLS1_WRITE_APP_DATA_BYTES 268 +# define SSL_F_GET_CLIENT_FINISHED 105 +# define SSL_F_GET_CLIENT_HELLO 106 +# define SSL_F_GET_CLIENT_MASTER_KEY 107 +# define SSL_F_GET_SERVER_FINISHED 108 +# define SSL_F_GET_SERVER_HELLO 109 +# define SSL_F_GET_SERVER_STATIC_DH_KEY 340 +# define SSL_F_GET_SERVER_VERIFY 110 +# define SSL_F_I2D_SSL_SESSION 111 +# define SSL_F_READ_N 112 +# define SSL_F_REQUEST_CERTIFICATE 113 +# define SSL_F_SERVER_FINISH 239 +# define SSL_F_SERVER_HELLO 114 +# define SSL_F_SERVER_VERIFY 240 +# define SSL_F_SSL23_ACCEPT 115 +# define SSL_F_SSL23_CLIENT_HELLO 116 +# define SSL_F_SSL23_CONNECT 117 +# define SSL_F_SSL23_GET_CLIENT_HELLO 118 +# define SSL_F_SSL23_GET_SERVER_HELLO 119 +# define SSL_F_SSL23_PEEK 237 +# define SSL_F_SSL23_READ 120 +# define SSL_F_SSL23_WRITE 121 +# define SSL_F_SSL2_ACCEPT 122 +# define SSL_F_SSL2_CONNECT 123 +# define SSL_F_SSL2_ENC_INIT 124 +# define SSL_F_SSL2_GENERATE_KEY_MATERIAL 241 +# define SSL_F_SSL2_PEEK 234 +# define SSL_F_SSL2_READ 125 +# define SSL_F_SSL2_READ_INTERNAL 236 +# define SSL_F_SSL2_SET_CERTIFICATE 126 +# define SSL_F_SSL2_WRITE 127 +# define SSL_F_SSL3_ACCEPT 128 +# define SSL_F_SSL3_ADD_CERT_TO_BUF 296 +# define SSL_F_SSL3_CALLBACK_CTRL 233 +# define SSL_F_SSL3_CHANGE_CIPHER_STATE 129 +# define SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM 130 +# define SSL_F_SSL3_CHECK_CLIENT_HELLO 304 +# define SSL_F_SSL3_CHECK_FINISHED 339 +# define SSL_F_SSL3_CLIENT_HELLO 131 +# define SSL_F_SSL3_CONNECT 132 +# define SSL_F_SSL3_CTRL 213 +# define SSL_F_SSL3_CTX_CTRL 133 +# define SSL_F_SSL3_DIGEST_CACHED_RECORDS 293 +# define SSL_F_SSL3_DO_CHANGE_CIPHER_SPEC 292 +# define SSL_F_SSL3_ENC 134 +# define SSL_F_SSL3_GENERATE_KEY_BLOCK 238 +# define SSL_F_SSL3_GENERATE_MASTER_SECRET 388 +# define SSL_F_SSL3_GET_CERTIFICATE_REQUEST 135 +# define SSL_F_SSL3_GET_CERT_STATUS 289 +# define SSL_F_SSL3_GET_CERT_VERIFY 136 +# define SSL_F_SSL3_GET_CLIENT_CERTIFICATE 137 +# define SSL_F_SSL3_GET_CLIENT_HELLO 138 +# define SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE 139 +# define SSL_F_SSL3_GET_FINISHED 140 +# define SSL_F_SSL3_GET_KEY_EXCHANGE 141 +# define SSL_F_SSL3_GET_MESSAGE 142 +# define SSL_F_SSL3_GET_NEW_SESSION_TICKET 283 +# define SSL_F_SSL3_GET_NEXT_PROTO 306 +# define SSL_F_SSL3_GET_RECORD 143 +# define SSL_F_SSL3_GET_SERVER_CERTIFICATE 144 +# define SSL_F_SSL3_GET_SERVER_DONE 145 +# define SSL_F_SSL3_GET_SERVER_HELLO 146 +# define SSL_F_SSL3_HANDSHAKE_MAC 285 +# define SSL_F_SSL3_NEW_SESSION_TICKET 287 +# define SSL_F_SSL3_OUTPUT_CERT_CHAIN 147 +# define SSL_F_SSL3_PEEK 235 +# define SSL_F_SSL3_READ_BYTES 148 +# define SSL_F_SSL3_READ_N 149 +# define SSL_F_SSL3_SEND_CERTIFICATE_REQUEST 150 +# define SSL_F_SSL3_SEND_CLIENT_CERTIFICATE 151 +# define SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE 152 +# define SSL_F_SSL3_SEND_CLIENT_VERIFY 153 +# define SSL_F_SSL3_SEND_SERVER_CERTIFICATE 154 +# define SSL_F_SSL3_SEND_SERVER_HELLO 242 +# define SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE 155 +# define SSL_F_SSL3_SETUP_KEY_BLOCK 157 +# define SSL_F_SSL3_SETUP_READ_BUFFER 156 +# define SSL_F_SSL3_SETUP_WRITE_BUFFER 291 +# define SSL_F_SSL3_WRITE_BYTES 158 +# define SSL_F_SSL3_WRITE_PENDING 159 +# define SSL_F_SSL_ADD_CERT_CHAIN 318 +# define SSL_F_SSL_ADD_CERT_TO_BUF 319 +# define SSL_F_SSL_ADD_CLIENTHELLO_RENEGOTIATE_EXT 298 +# define SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT 277 +# define SSL_F_SSL_ADD_CLIENTHELLO_USE_SRTP_EXT 307 +# define SSL_F_SSL_ADD_DIR_CERT_SUBJECTS_TO_STACK 215 +# define SSL_F_SSL_ADD_FILE_CERT_SUBJECTS_TO_STACK 216 +# define SSL_F_SSL_ADD_SERVERHELLO_RENEGOTIATE_EXT 299 +# define SSL_F_SSL_ADD_SERVERHELLO_TLSEXT 278 +# define SSL_F_SSL_ADD_SERVERHELLO_USE_SRTP_EXT 308 +# define SSL_F_SSL_BAD_METHOD 160 +# define SSL_F_SSL_BUILD_CERT_CHAIN 332 +# define SSL_F_SSL_BYTES_TO_CIPHER_LIST 161 +# define SSL_F_SSL_CERT_DUP 221 +# define SSL_F_SSL_CERT_INST 222 +# define SSL_F_SSL_CERT_INSTANTIATE 214 +# define SSL_F_SSL_CERT_NEW 162 +# define SSL_F_SSL_CHECK_PRIVATE_KEY 163 +# define SSL_F_SSL_CHECK_SERVERHELLO_TLSEXT 280 +# define SSL_F_SSL_CHECK_SRVR_ECC_CERT_AND_ALG 279 +# define SSL_F_SSL_CIPHER_PROCESS_RULESTR 230 +# define SSL_F_SSL_CIPHER_STRENGTH_SORT 231 +# define SSL_F_SSL_CLEAR 164 +# define SSL_F_SSL_COMP_ADD_COMPRESSION_METHOD 165 +# define SSL_F_SSL_CONF_CMD 334 +# define SSL_F_SSL_CREATE_CIPHER_LIST 166 +# define SSL_F_SSL_CTRL 232 +# define SSL_F_SSL_CTX_CHECK_PRIVATE_KEY 168 +# define SSL_F_SSL_CTX_MAKE_PROFILES 309 +# define SSL_F_SSL_CTX_NEW 169 +# define SSL_F_SSL_CTX_SET_CIPHER_LIST 269 +# define SSL_F_SSL_CTX_SET_CLIENT_CERT_ENGINE 290 +# define SSL_F_SSL_CTX_SET_PURPOSE 226 +# define SSL_F_SSL_CTX_SET_SESSION_ID_CONTEXT 219 +# define SSL_F_SSL_CTX_SET_SSL_VERSION 170 +# define SSL_F_SSL_CTX_SET_TRUST 229 +# define SSL_F_SSL_CTX_USE_CERTIFICATE 171 +# define SSL_F_SSL_CTX_USE_CERTIFICATE_ASN1 172 +# define SSL_F_SSL_CTX_USE_CERTIFICATE_CHAIN_FILE 220 +# define SSL_F_SSL_CTX_USE_CERTIFICATE_FILE 173 +# define SSL_F_SSL_CTX_USE_PRIVATEKEY 174 +# define SSL_F_SSL_CTX_USE_PRIVATEKEY_ASN1 175 +# define SSL_F_SSL_CTX_USE_PRIVATEKEY_FILE 176 +# define SSL_F_SSL_CTX_USE_PSK_IDENTITY_HINT 272 +# define SSL_F_SSL_CTX_USE_RSAPRIVATEKEY 177 +# define SSL_F_SSL_CTX_USE_RSAPRIVATEKEY_ASN1 178 +# define SSL_F_SSL_CTX_USE_RSAPRIVATEKEY_FILE 179 +# define SSL_F_SSL_CTX_USE_SERVERINFO 336 +# define SSL_F_SSL_CTX_USE_SERVERINFO_FILE 337 +# define SSL_F_SSL_DO_HANDSHAKE 180 +# define SSL_F_SSL_GET_NEW_SESSION 181 +# define SSL_F_SSL_GET_PREV_SESSION 217 +# define SSL_F_SSL_GET_SERVER_CERT_INDEX 322 +# define SSL_F_SSL_GET_SERVER_SEND_CERT 182 +# define SSL_F_SSL_GET_SERVER_SEND_PKEY 317 +# define SSL_F_SSL_GET_SIGN_PKEY 183 +# define SSL_F_SSL_INIT_WBIO_BUFFER 184 +# define SSL_F_SSL_LOAD_CLIENT_CA_FILE 185 +# define SSL_F_SSL_NEW 186 +# define SSL_F_SSL_PARSE_CLIENTHELLO_RENEGOTIATE_EXT 300 +# define SSL_F_SSL_PARSE_CLIENTHELLO_TLSEXT 302 +# define SSL_F_SSL_PARSE_CLIENTHELLO_USE_SRTP_EXT 310 +# define SSL_F_SSL_PARSE_SERVERHELLO_RENEGOTIATE_EXT 301 +# define SSL_F_SSL_PARSE_SERVERHELLO_TLSEXT 303 +# define SSL_F_SSL_PARSE_SERVERHELLO_USE_SRTP_EXT 311 +# define SSL_F_SSL_PEEK 270 +# define SSL_F_SSL_PREPARE_CLIENTHELLO_TLSEXT 281 +# define SSL_F_SSL_PREPARE_SERVERHELLO_TLSEXT 282 +# define SSL_F_SSL_READ 223 +# define SSL_F_SSL_RSA_PRIVATE_DECRYPT 187 +# define SSL_F_SSL_RSA_PUBLIC_ENCRYPT 188 +# define SSL_F_SSL_SCAN_CLIENTHELLO_TLSEXT 320 +# define SSL_F_SSL_SCAN_SERVERHELLO_TLSEXT 321 +# define SSL_F_SSL_SESSION_DUP 348 +# define SSL_F_SSL_SESSION_NEW 189 +# define SSL_F_SSL_SESSION_PRINT_FP 190 +# define SSL_F_SSL_SESSION_SET1_ID_CONTEXT 312 +# define SSL_F_SSL_SESS_CERT_NEW 225 +# define SSL_F_SSL_SET_CERT 191 +# define SSL_F_SSL_SET_CIPHER_LIST 271 +# define SSL_F_SSL_SET_FD 192 +# define SSL_F_SSL_SET_PKEY 193 +# define SSL_F_SSL_SET_PURPOSE 227 +# define SSL_F_SSL_SET_RFD 194 +# define SSL_F_SSL_SET_SESSION 195 +# define SSL_F_SSL_SET_SESSION_ID_CONTEXT 218 +# define SSL_F_SSL_SET_SESSION_TICKET_EXT 294 +# define SSL_F_SSL_SET_TRUST 228 +# define SSL_F_SSL_SET_WFD 196 +# define SSL_F_SSL_SHUTDOWN 224 +# define SSL_F_SSL_SRP_CTX_INIT 313 +# define SSL_F_SSL_UNDEFINED_CONST_FUNCTION 243 +# define SSL_F_SSL_UNDEFINED_FUNCTION 197 +# define SSL_F_SSL_UNDEFINED_VOID_FUNCTION 244 +# define SSL_F_SSL_USE_CERTIFICATE 198 +# define SSL_F_SSL_USE_CERTIFICATE_ASN1 199 +# define SSL_F_SSL_USE_CERTIFICATE_FILE 200 +# define SSL_F_SSL_USE_PRIVATEKEY 201 +# define SSL_F_SSL_USE_PRIVATEKEY_ASN1 202 +# define SSL_F_SSL_USE_PRIVATEKEY_FILE 203 +# define SSL_F_SSL_USE_PSK_IDENTITY_HINT 273 +# define SSL_F_SSL_USE_RSAPRIVATEKEY 204 +# define SSL_F_SSL_USE_RSAPRIVATEKEY_ASN1 205 +# define SSL_F_SSL_USE_RSAPRIVATEKEY_FILE 206 +# define SSL_F_SSL_VERIFY_CERT_CHAIN 207 +# define SSL_F_SSL_WRITE 208 +# define SSL_F_TLS12_CHECK_PEER_SIGALG 333 +# define SSL_F_TLS1_CERT_VERIFY_MAC 286 +# define SSL_F_TLS1_CHANGE_CIPHER_STATE 209 +# define SSL_F_TLS1_CHECK_SERVERHELLO_TLSEXT 274 +# define SSL_F_TLS1_ENC 210 +# define SSL_F_TLS1_EXPORT_KEYING_MATERIAL 314 +# define SSL_F_TLS1_GET_CURVELIST 338 +# define SSL_F_TLS1_HEARTBEAT 315 +# define SSL_F_TLS1_PREPARE_CLIENTHELLO_TLSEXT 275 +# define SSL_F_TLS1_PREPARE_SERVERHELLO_TLSEXT 276 +# define SSL_F_TLS1_PRF 284 +# define SSL_F_TLS1_SETUP_KEY_BLOCK 211 +# define SSL_F_TLS1_SET_SERVER_SIGALGS 335 +# define SSL_F_WRITE_PENDING 212 + +/* Reason codes. */ +# define SSL_R_APP_DATA_IN_HANDSHAKE 100 +# define SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT 272 +# define SSL_R_BAD_ALERT_RECORD 101 +# define SSL_R_BAD_AUTHENTICATION_TYPE 102 +# define SSL_R_BAD_CHANGE_CIPHER_SPEC 103 +# define SSL_R_BAD_CHECKSUM 104 +# define SSL_R_BAD_DATA 390 +# define SSL_R_BAD_DATA_RETURNED_BY_CALLBACK 106 +# define SSL_R_BAD_DECOMPRESSION 107 +# define SSL_R_BAD_DH_G_LENGTH 108 +# define SSL_R_BAD_DH_G_VALUE 375 +# define SSL_R_BAD_DH_PUB_KEY_LENGTH 109 +# define SSL_R_BAD_DH_PUB_KEY_VALUE 393 +# define SSL_R_BAD_DH_P_LENGTH 110 +# define SSL_R_BAD_DH_P_VALUE 395 +# define SSL_R_BAD_DIGEST_LENGTH 111 +# define SSL_R_BAD_DSA_SIGNATURE 112 +# define SSL_R_BAD_ECC_CERT 304 +# define SSL_R_BAD_ECDSA_SIGNATURE 305 +# define SSL_R_BAD_ECPOINT 306 +# define SSL_R_BAD_HANDSHAKE_LENGTH 332 +# define SSL_R_BAD_HELLO_REQUEST 105 +# define SSL_R_BAD_LENGTH 271 +# define SSL_R_BAD_MAC_DECODE 113 +# define SSL_R_BAD_MAC_LENGTH 333 +# define SSL_R_BAD_MESSAGE_TYPE 114 +# define SSL_R_BAD_PACKET_LENGTH 115 +# define SSL_R_BAD_PROTOCOL_VERSION_NUMBER 116 +# define SSL_R_BAD_PSK_IDENTITY_HINT_LENGTH 316 +# define SSL_R_BAD_RESPONSE_ARGUMENT 117 +# define SSL_R_BAD_RSA_DECRYPT 118 +# define SSL_R_BAD_RSA_ENCRYPT 119 +# define SSL_R_BAD_RSA_E_LENGTH 120 +# define SSL_R_BAD_RSA_MODULUS_LENGTH 121 +# define SSL_R_BAD_RSA_SIGNATURE 122 +# define SSL_R_BAD_SIGNATURE 123 +# define SSL_R_BAD_SRP_A_LENGTH 347 +# define SSL_R_BAD_SRP_B_LENGTH 348 +# define SSL_R_BAD_SRP_G_LENGTH 349 +# define SSL_R_BAD_SRP_N_LENGTH 350 +# define SSL_R_BAD_SRP_PARAMETERS 371 +# define SSL_R_BAD_SRP_S_LENGTH 351 +# define SSL_R_BAD_SRTP_MKI_VALUE 352 +# define SSL_R_BAD_SRTP_PROTECTION_PROFILE_LIST 353 +# define SSL_R_BAD_SSL_FILETYPE 124 +# define SSL_R_BAD_SSL_SESSION_ID_LENGTH 125 +# define SSL_R_BAD_STATE 126 +# define SSL_R_BAD_VALUE 384 +# define SSL_R_BAD_WRITE_RETRY 127 +# define SSL_R_BIO_NOT_SET 128 +# define SSL_R_BLOCK_CIPHER_PAD_IS_WRONG 129 +# define SSL_R_BN_LIB 130 +# define SSL_R_CA_DN_LENGTH_MISMATCH 131 +# define SSL_R_CA_DN_TOO_LONG 132 +# define SSL_R_CCS_RECEIVED_EARLY 133 +# define SSL_R_CERTIFICATE_VERIFY_FAILED 134 +# define SSL_R_CERT_CB_ERROR 377 +# define SSL_R_CERT_LENGTH_MISMATCH 135 +# define SSL_R_CHALLENGE_IS_DIFFERENT 136 +# define SSL_R_CIPHER_CODE_WRONG_LENGTH 137 +# define SSL_R_CIPHER_OR_HASH_UNAVAILABLE 138 +# define SSL_R_CIPHER_TABLE_SRC_ERROR 139 +# define SSL_R_CLIENTHELLO_TLSEXT 226 +# define SSL_R_COMPRESSED_LENGTH_TOO_LONG 140 +# define SSL_R_COMPRESSION_DISABLED 343 +# define SSL_R_COMPRESSION_FAILURE 141 +# define SSL_R_COMPRESSION_ID_NOT_WITHIN_PRIVATE_RANGE 307 +# define SSL_R_COMPRESSION_LIBRARY_ERROR 142 +# define SSL_R_CONNECTION_ID_IS_DIFFERENT 143 +# define SSL_R_CONNECTION_TYPE_NOT_SET 144 +# define SSL_R_COOKIE_MISMATCH 308 +# define SSL_R_DATA_BETWEEN_CCS_AND_FINISHED 145 +# define SSL_R_DATA_LENGTH_TOO_LONG 146 +# define SSL_R_DECRYPTION_FAILED 147 +# define SSL_R_DECRYPTION_FAILED_OR_BAD_RECORD_MAC 281 +# define SSL_R_DH_KEY_TOO_SMALL 372 +# define SSL_R_DH_PUBLIC_VALUE_LENGTH_IS_WRONG 148 +# define SSL_R_DIGEST_CHECK_FAILED 149 +# define SSL_R_DTLS_MESSAGE_TOO_BIG 334 +# define SSL_R_DUPLICATE_COMPRESSION_ID 309 +# define SSL_R_ECC_CERT_NOT_FOR_KEY_AGREEMENT 317 +# define SSL_R_ECC_CERT_NOT_FOR_SIGNING 318 +# define SSL_R_ECC_CERT_SHOULD_HAVE_RSA_SIGNATURE 322 +# define SSL_R_ECC_CERT_SHOULD_HAVE_SHA1_SIGNATURE 323 +# define SSL_R_ECDH_REQUIRED_FOR_SUITEB_MODE 374 +# define SSL_R_ECGROUP_TOO_LARGE_FOR_CIPHER 310 +# define SSL_R_EMPTY_SRTP_PROTECTION_PROFILE_LIST 354 +# define SSL_R_ENCRYPTED_LENGTH_TOO_LONG 150 +# define SSL_R_ERROR_GENERATING_TMP_RSA_KEY 282 +# define SSL_R_ERROR_IN_RECEIVED_CIPHER_LIST 151 +# define SSL_R_EXCESSIVE_MESSAGE_SIZE 152 +# define SSL_R_EXTRA_DATA_IN_MESSAGE 153 +# define SSL_R_GOT_A_FIN_BEFORE_A_CCS 154 +# define SSL_R_GOT_NEXT_PROTO_BEFORE_A_CCS 355 +# define SSL_R_GOT_NEXT_PROTO_WITHOUT_EXTENSION 356 +# define SSL_R_HTTPS_PROXY_REQUEST 155 +# define SSL_R_HTTP_REQUEST 156 +# define SSL_R_ILLEGAL_PADDING 283 +# define SSL_R_ILLEGAL_SUITEB_DIGEST 380 +# define SSL_R_INAPPROPRIATE_FALLBACK 373 +# define SSL_R_INCONSISTENT_COMPRESSION 340 +# define SSL_R_INVALID_CHALLENGE_LENGTH 158 +# define SSL_R_INVALID_COMMAND 280 +# define SSL_R_INVALID_COMPRESSION_ALGORITHM 341 +# define SSL_R_INVALID_NULL_CMD_NAME 385 +# define SSL_R_INVALID_PURPOSE 278 +# define SSL_R_INVALID_SERVERINFO_DATA 388 +# define SSL_R_INVALID_SRP_USERNAME 357 +# define SSL_R_INVALID_STATUS_RESPONSE 328 +# define SSL_R_INVALID_TICKET_KEYS_LENGTH 325 +# define SSL_R_INVALID_TRUST 279 +# define SSL_R_KEY_ARG_TOO_LONG 284 +# define SSL_R_KRB5 285 +# define SSL_R_KRB5_C_CC_PRINC 286 +# define SSL_R_KRB5_C_GET_CRED 287 +# define SSL_R_KRB5_C_INIT 288 +# define SSL_R_KRB5_C_MK_REQ 289 +# define SSL_R_KRB5_S_BAD_TICKET 290 +# define SSL_R_KRB5_S_INIT 291 +# define SSL_R_KRB5_S_RD_REQ 292 +# define SSL_R_KRB5_S_TKT_EXPIRED 293 +# define SSL_R_KRB5_S_TKT_NYV 294 +# define SSL_R_KRB5_S_TKT_SKEW 295 +# define SSL_R_LENGTH_MISMATCH 159 +# define SSL_R_LENGTH_TOO_SHORT 160 +# define SSL_R_LIBRARY_BUG 274 +# define SSL_R_LIBRARY_HAS_NO_CIPHERS 161 +# define SSL_R_MESSAGE_TOO_LONG 296 +# define SSL_R_MISSING_DH_DSA_CERT 162 +# define SSL_R_MISSING_DH_KEY 163 +# define SSL_R_MISSING_DH_RSA_CERT 164 +# define SSL_R_MISSING_DSA_SIGNING_CERT 165 +# define SSL_R_MISSING_ECDH_CERT 382 +# define SSL_R_MISSING_ECDSA_SIGNING_CERT 381 +# define SSL_R_MISSING_EXPORT_TMP_DH_KEY 166 +# define SSL_R_MISSING_EXPORT_TMP_RSA_KEY 167 +# define SSL_R_MISSING_RSA_CERTIFICATE 168 +# define SSL_R_MISSING_RSA_ENCRYPTING_CERT 169 +# define SSL_R_MISSING_RSA_SIGNING_CERT 170 +# define SSL_R_MISSING_SRP_PARAM 358 +# define SSL_R_MISSING_TMP_DH_KEY 171 +# define SSL_R_MISSING_TMP_ECDH_KEY 311 +# define SSL_R_MISSING_TMP_RSA_KEY 172 +# define SSL_R_MISSING_TMP_RSA_PKEY 173 +# define SSL_R_MISSING_VERIFY_MESSAGE 174 +# define SSL_R_MULTIPLE_SGC_RESTARTS 346 +# define SSL_R_NON_SSLV2_INITIAL_PACKET 175 +# define SSL_R_NO_CERTIFICATES_RETURNED 176 +# define SSL_R_NO_CERTIFICATE_ASSIGNED 177 +# define SSL_R_NO_CERTIFICATE_RETURNED 178 +# define SSL_R_NO_CERTIFICATE_SET 179 +# define SSL_R_NO_CERTIFICATE_SPECIFIED 180 +# define SSL_R_NO_CIPHERS_AVAILABLE 181 +# define SSL_R_NO_CIPHERS_PASSED 182 +# define SSL_R_NO_CIPHERS_SPECIFIED 183 +# define SSL_R_NO_CIPHER_LIST 184 +# define SSL_R_NO_CIPHER_MATCH 185 +# define SSL_R_NO_CLIENT_CERT_METHOD 331 +# define SSL_R_NO_CLIENT_CERT_RECEIVED 186 +# define SSL_R_NO_COMPRESSION_SPECIFIED 187 +# define SSL_R_NO_GOST_CERTIFICATE_SENT_BY_PEER 330 +# define SSL_R_NO_METHOD_SPECIFIED 188 +# define SSL_R_NO_PEM_EXTENSIONS 389 +# define SSL_R_NO_PRIVATEKEY 189 +# define SSL_R_NO_PRIVATE_KEY_ASSIGNED 190 +# define SSL_R_NO_PROTOCOLS_AVAILABLE 191 +# define SSL_R_NO_PUBLICKEY 192 +# define SSL_R_NO_RENEGOTIATION 339 +# define SSL_R_NO_REQUIRED_DIGEST 324 +# define SSL_R_NO_SHARED_CIPHER 193 +# define SSL_R_NO_SHARED_SIGATURE_ALGORITHMS 376 +# define SSL_R_NO_SRTP_PROFILES 359 +# define SSL_R_NO_VERIFY_CALLBACK 194 +# define SSL_R_NULL_SSL_CTX 195 +# define SSL_R_NULL_SSL_METHOD_PASSED 196 +# define SSL_R_OLD_SESSION_CIPHER_NOT_RETURNED 197 +# define SSL_R_OLD_SESSION_COMPRESSION_ALGORITHM_NOT_RETURNED 344 +# define SSL_R_ONLY_DTLS_1_2_ALLOWED_IN_SUITEB_MODE 387 +# define SSL_R_ONLY_TLS_1_2_ALLOWED_IN_SUITEB_MODE 379 +# define SSL_R_ONLY_TLS_ALLOWED_IN_FIPS_MODE 297 +# define SSL_R_OPAQUE_PRF_INPUT_TOO_LONG 327 +# define SSL_R_PACKET_LENGTH_TOO_LONG 198 +# define SSL_R_PARSE_TLSEXT 227 +# define SSL_R_PATH_TOO_LONG 270 +# define SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE 199 +# define SSL_R_PEER_ERROR 200 +# define SSL_R_PEER_ERROR_CERTIFICATE 201 +# define SSL_R_PEER_ERROR_NO_CERTIFICATE 202 +# define SSL_R_PEER_ERROR_NO_CIPHER 203 +# define SSL_R_PEER_ERROR_UNSUPPORTED_CERTIFICATE_TYPE 204 +# define SSL_R_PEM_NAME_BAD_PREFIX 391 +# define SSL_R_PEM_NAME_TOO_SHORT 392 +# define SSL_R_PRE_MAC_LENGTH_TOO_LONG 205 +# define SSL_R_PROBLEMS_MAPPING_CIPHER_FUNCTIONS 206 +# define SSL_R_PROTOCOL_IS_SHUTDOWN 207 +# define SSL_R_PSK_IDENTITY_NOT_FOUND 223 +# define SSL_R_PSK_NO_CLIENT_CB 224 +# define SSL_R_PSK_NO_SERVER_CB 225 +# define SSL_R_PUBLIC_KEY_ENCRYPT_ERROR 208 +# define SSL_R_PUBLIC_KEY_IS_NOT_RSA 209 +# define SSL_R_PUBLIC_KEY_NOT_RSA 210 +# define SSL_R_READ_BIO_NOT_SET 211 +# define SSL_R_READ_TIMEOUT_EXPIRED 312 +# define SSL_R_READ_WRONG_PACKET_TYPE 212 +# define SSL_R_RECORD_LENGTH_MISMATCH 213 +# define SSL_R_RECORD_TOO_LARGE 214 +# define SSL_R_RECORD_TOO_SMALL 298 +# define SSL_R_RENEGOTIATE_EXT_TOO_LONG 335 +# define SSL_R_RENEGOTIATION_ENCODING_ERR 336 +# define SSL_R_RENEGOTIATION_MISMATCH 337 +# define SSL_R_REQUIRED_CIPHER_MISSING 215 +# define SSL_R_REQUIRED_COMPRESSSION_ALGORITHM_MISSING 342 +# define SSL_R_REUSE_CERT_LENGTH_NOT_ZERO 216 +# define SSL_R_REUSE_CERT_TYPE_NOT_ZERO 217 +# define SSL_R_REUSE_CIPHER_LIST_NOT_ZERO 218 +# define SSL_R_SCSV_RECEIVED_WHEN_RENEGOTIATING 345 +# define SSL_R_SERVERHELLO_TLSEXT 275 +# define SSL_R_SESSION_ID_CONTEXT_UNINITIALIZED 277 +# define SSL_R_SHORT_READ 219 +# define SSL_R_SHUTDOWN_WHILE_IN_INIT 407 +# define SSL_R_SIGNATURE_ALGORITHMS_ERROR 360 +# define SSL_R_SIGNATURE_FOR_NON_SIGNING_CERTIFICATE 220 +# define SSL_R_SRP_A_CALC 361 +# define SSL_R_SRTP_COULD_NOT_ALLOCATE_PROFILES 362 +# define SSL_R_SRTP_PROTECTION_PROFILE_LIST_TOO_LONG 363 +# define SSL_R_SRTP_UNKNOWN_PROTECTION_PROFILE 364 +# define SSL_R_SSL23_DOING_SESSION_ID_REUSE 221 +# define SSL_R_SSL2_CONNECTION_ID_TOO_LONG 299 +# define SSL_R_SSL3_EXT_INVALID_ECPOINTFORMAT 321 +# define SSL_R_SSL3_EXT_INVALID_SERVERNAME 319 +# define SSL_R_SSL3_EXT_INVALID_SERVERNAME_TYPE 320 +# define SSL_R_SSL3_SESSION_ID_TOO_LONG 300 +# define SSL_R_SSL3_SESSION_ID_TOO_SHORT 222 +# define SSL_R_SSLV3_ALERT_BAD_CERTIFICATE 1042 +# define SSL_R_SSLV3_ALERT_BAD_RECORD_MAC 1020 +# define SSL_R_SSLV3_ALERT_CERTIFICATE_EXPIRED 1045 +# define SSL_R_SSLV3_ALERT_CERTIFICATE_REVOKED 1044 +# define SSL_R_SSLV3_ALERT_CERTIFICATE_UNKNOWN 1046 +# define SSL_R_SSLV3_ALERT_DECOMPRESSION_FAILURE 1030 +# define SSL_R_SSLV3_ALERT_HANDSHAKE_FAILURE 1040 +# define SSL_R_SSLV3_ALERT_ILLEGAL_PARAMETER 1047 +# define SSL_R_SSLV3_ALERT_NO_CERTIFICATE 1041 +# define SSL_R_SSLV3_ALERT_UNEXPECTED_MESSAGE 1010 +# define SSL_R_SSLV3_ALERT_UNSUPPORTED_CERTIFICATE 1043 +# define SSL_R_SSL_CTX_HAS_NO_DEFAULT_SSL_VERSION 228 +# define SSL_R_SSL_HANDSHAKE_FAILURE 229 +# define SSL_R_SSL_LIBRARY_HAS_NO_CIPHERS 230 +# define SSL_R_SSL_SESSION_ID_CALLBACK_FAILED 301 +# define SSL_R_SSL_SESSION_ID_CONFLICT 302 +# define SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG 273 +# define SSL_R_SSL_SESSION_ID_HAS_BAD_LENGTH 303 +# define SSL_R_SSL_SESSION_ID_IS_DIFFERENT 231 +# define SSL_R_TLSV1_ALERT_ACCESS_DENIED 1049 +# define SSL_R_TLSV1_ALERT_DECODE_ERROR 1050 +# define SSL_R_TLSV1_ALERT_DECRYPTION_FAILED 1021 +# define SSL_R_TLSV1_ALERT_DECRYPT_ERROR 1051 +# define SSL_R_TLSV1_ALERT_EXPORT_RESTRICTION 1060 +# define SSL_R_TLSV1_ALERT_INAPPROPRIATE_FALLBACK 1086 +# define SSL_R_TLSV1_ALERT_INSUFFICIENT_SECURITY 1071 +# define SSL_R_TLSV1_ALERT_INTERNAL_ERROR 1080 +# define SSL_R_TLSV1_ALERT_NO_RENEGOTIATION 1100 +# define SSL_R_TLSV1_ALERT_PROTOCOL_VERSION 1070 +# define SSL_R_TLSV1_ALERT_RECORD_OVERFLOW 1022 +# define SSL_R_TLSV1_ALERT_UNKNOWN_CA 1048 +# define SSL_R_TLSV1_ALERT_USER_CANCELLED 1090 +# define SSL_R_TLSV1_BAD_CERTIFICATE_HASH_VALUE 1114 +# define SSL_R_TLSV1_BAD_CERTIFICATE_STATUS_RESPONSE 1113 +# define SSL_R_TLSV1_CERTIFICATE_UNOBTAINABLE 1111 +# define SSL_R_TLSV1_UNRECOGNIZED_NAME 1112 +# define SSL_R_TLSV1_UNSUPPORTED_EXTENSION 1110 +# define SSL_R_TLS_CLIENT_CERT_REQ_WITH_ANON_CIPHER 232 +# define SSL_R_TLS_HEARTBEAT_PEER_DOESNT_ACCEPT 365 +# define SSL_R_TLS_HEARTBEAT_PENDING 366 +# define SSL_R_TLS_ILLEGAL_EXPORTER_LABEL 367 +# define SSL_R_TLS_INVALID_ECPOINTFORMAT_LIST 157 +# define SSL_R_TLS_PEER_DID_NOT_RESPOND_WITH_CERTIFICATE_LIST 233 +# define SSL_R_TLS_RSA_ENCRYPTED_VALUE_LENGTH_IS_WRONG 234 +# define SSL_R_TRIED_TO_USE_UNSUPPORTED_CIPHER 235 +# define SSL_R_UNABLE_TO_DECODE_DH_CERTS 236 +# define SSL_R_UNABLE_TO_DECODE_ECDH_CERTS 313 +# define SSL_R_UNABLE_TO_EXTRACT_PUBLIC_KEY 237 +# define SSL_R_UNABLE_TO_FIND_DH_PARAMETERS 238 +# define SSL_R_UNABLE_TO_FIND_ECDH_PARAMETERS 314 +# define SSL_R_UNABLE_TO_FIND_PUBLIC_KEY_PARAMETERS 239 +# define SSL_R_UNABLE_TO_FIND_SSL_METHOD 240 +# define SSL_R_UNABLE_TO_LOAD_SSL2_MD5_ROUTINES 241 +# define SSL_R_UNABLE_TO_LOAD_SSL3_MD5_ROUTINES 242 +# define SSL_R_UNABLE_TO_LOAD_SSL3_SHA1_ROUTINES 243 +# define SSL_R_UNEXPECTED_MESSAGE 244 +# define SSL_R_UNEXPECTED_RECORD 245 +# define SSL_R_UNINITIALIZED 276 +# define SSL_R_UNKNOWN_ALERT_TYPE 246 +# define SSL_R_UNKNOWN_CERTIFICATE_TYPE 247 +# define SSL_R_UNKNOWN_CIPHER_RETURNED 248 +# define SSL_R_UNKNOWN_CIPHER_TYPE 249 +# define SSL_R_UNKNOWN_CMD_NAME 386 +# define SSL_R_UNKNOWN_DIGEST 368 +# define SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE 250 +# define SSL_R_UNKNOWN_PKEY_TYPE 251 +# define SSL_R_UNKNOWN_PROTOCOL 252 +# define SSL_R_UNKNOWN_REMOTE_ERROR_TYPE 253 +# define SSL_R_UNKNOWN_SSL_VERSION 254 +# define SSL_R_UNKNOWN_STATE 255 +# define SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED 338 +# define SSL_R_UNSUPPORTED_CIPHER 256 +# define SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM 257 +# define SSL_R_UNSUPPORTED_DIGEST_TYPE 326 +# define SSL_R_UNSUPPORTED_ELLIPTIC_CURVE 315 +# define SSL_R_UNSUPPORTED_PROTOCOL 258 +# define SSL_R_UNSUPPORTED_SSL_VERSION 259 +# define SSL_R_UNSUPPORTED_STATUS_TYPE 329 +# define SSL_R_USE_SRTP_NOT_NEGOTIATED 369 +# define SSL_R_WRITE_BIO_NOT_SET 260 +# define SSL_R_WRONG_CERTIFICATE_TYPE 383 +# define SSL_R_WRONG_CIPHER_RETURNED 261 +# define SSL_R_WRONG_CURVE 378 +# define SSL_R_WRONG_MESSAGE_TYPE 262 +# define SSL_R_WRONG_NUMBER_OF_KEY_BITS 263 +# define SSL_R_WRONG_SIGNATURE_LENGTH 264 +# define SSL_R_WRONG_SIGNATURE_SIZE 265 +# define SSL_R_WRONG_SIGNATURE_TYPE 370 +# define SSL_R_WRONG_SSL_VERSION 266 +# define SSL_R_WRONG_VERSION_NUMBER 267 +# define SSL_R_X509_LIB 268 +# define SSL_R_X509_VERIFICATION_SETUP_PROBLEMS 269 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/win/openssl/include/openssl/ssl2.h b/hdssd/external/win/openssl/include/openssl/ssl2.h new file mode 100644 index 0000000..03c7dd8 --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/ssl2.h @@ -0,0 +1,265 @@ +/* ssl/ssl2.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_SSL2_H +# define HEADER_SSL2_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Protocol Version Codes */ +# define SSL2_VERSION 0x0002 +# define SSL2_VERSION_MAJOR 0x00 +# define SSL2_VERSION_MINOR 0x02 +/* #define SSL2_CLIENT_VERSION 0x0002 */ +/* #define SSL2_SERVER_VERSION 0x0002 */ + +/* Protocol Message Codes */ +# define SSL2_MT_ERROR 0 +# define SSL2_MT_CLIENT_HELLO 1 +# define SSL2_MT_CLIENT_MASTER_KEY 2 +# define SSL2_MT_CLIENT_FINISHED 3 +# define SSL2_MT_SERVER_HELLO 4 +# define SSL2_MT_SERVER_VERIFY 5 +# define SSL2_MT_SERVER_FINISHED 6 +# define SSL2_MT_REQUEST_CERTIFICATE 7 +# define SSL2_MT_CLIENT_CERTIFICATE 8 + +/* Error Message Codes */ +# define SSL2_PE_UNDEFINED_ERROR 0x0000 +# define SSL2_PE_NO_CIPHER 0x0001 +# define SSL2_PE_NO_CERTIFICATE 0x0002 +# define SSL2_PE_BAD_CERTIFICATE 0x0004 +# define SSL2_PE_UNSUPPORTED_CERTIFICATE_TYPE 0x0006 + +/* Cipher Kind Values */ +# define SSL2_CK_NULL_WITH_MD5 0x02000000/* v3 */ +# define SSL2_CK_RC4_128_WITH_MD5 0x02010080 +# define SSL2_CK_RC4_128_EXPORT40_WITH_MD5 0x02020080 +# define SSL2_CK_RC2_128_CBC_WITH_MD5 0x02030080 +# define SSL2_CK_RC2_128_CBC_EXPORT40_WITH_MD5 0x02040080 +# define SSL2_CK_IDEA_128_CBC_WITH_MD5 0x02050080 +# define SSL2_CK_DES_64_CBC_WITH_MD5 0x02060040 +# define SSL2_CK_DES_64_CBC_WITH_SHA 0x02060140/* v3 */ +# define SSL2_CK_DES_192_EDE3_CBC_WITH_MD5 0x020700c0 +# define SSL2_CK_DES_192_EDE3_CBC_WITH_SHA 0x020701c0/* v3 */ +# define SSL2_CK_RC4_64_WITH_MD5 0x02080080/* MS hack */ + +# define SSL2_CK_DES_64_CFB64_WITH_MD5_1 0x02ff0800/* SSLeay */ +# define SSL2_CK_NULL 0x02ff0810/* SSLeay */ + +# define SSL2_TXT_DES_64_CFB64_WITH_MD5_1 "DES-CFB-M1" +# define SSL2_TXT_NULL_WITH_MD5 "NULL-MD5" +# define SSL2_TXT_RC4_128_WITH_MD5 "RC4-MD5" +# define SSL2_TXT_RC4_128_EXPORT40_WITH_MD5 "EXP-RC4-MD5" +# define SSL2_TXT_RC2_128_CBC_WITH_MD5 "RC2-CBC-MD5" +# define SSL2_TXT_RC2_128_CBC_EXPORT40_WITH_MD5 "EXP-RC2-CBC-MD5" +# define SSL2_TXT_IDEA_128_CBC_WITH_MD5 "IDEA-CBC-MD5" +# define SSL2_TXT_DES_64_CBC_WITH_MD5 "DES-CBC-MD5" +# define SSL2_TXT_DES_64_CBC_WITH_SHA "DES-CBC-SHA" +# define SSL2_TXT_DES_192_EDE3_CBC_WITH_MD5 "DES-CBC3-MD5" +# define SSL2_TXT_DES_192_EDE3_CBC_WITH_SHA "DES-CBC3-SHA" +# define SSL2_TXT_RC4_64_WITH_MD5 "RC4-64-MD5" + +# define SSL2_TXT_NULL "NULL" + +/* Flags for the SSL_CIPHER.algorithm2 field */ +# define SSL2_CF_5_BYTE_ENC 0x01 +# define SSL2_CF_8_BYTE_ENC 0x02 + +/* Certificate Type Codes */ +# define SSL2_CT_X509_CERTIFICATE 0x01 + +/* Authentication Type Code */ +# define SSL2_AT_MD5_WITH_RSA_ENCRYPTION 0x01 + +# define SSL2_MAX_SSL_SESSION_ID_LENGTH 32 + +/* Upper/Lower Bounds */ +# define SSL2_MAX_MASTER_KEY_LENGTH_IN_BITS 256 +# ifdef OPENSSL_SYS_MPE +# define SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER 29998u +# else +# define SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER 32767u + /* 2^15-1 */ +# endif +# define SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER 16383/* 2^14-1 */ + +# define SSL2_CHALLENGE_LENGTH 16 +/* + * #define SSL2_CHALLENGE_LENGTH 32 + */ +# define SSL2_MIN_CHALLENGE_LENGTH 16 +# define SSL2_MAX_CHALLENGE_LENGTH 32 +# define SSL2_CONNECTION_ID_LENGTH 16 +# define SSL2_MAX_CONNECTION_ID_LENGTH 16 +# define SSL2_SSL_SESSION_ID_LENGTH 16 +# define SSL2_MAX_CERT_CHALLENGE_LENGTH 32 +# define SSL2_MIN_CERT_CHALLENGE_LENGTH 16 +# define SSL2_MAX_KEY_MATERIAL_LENGTH 24 + +# ifndef HEADER_SSL_LOCL_H +# define CERT char +# endif + +# ifndef OPENSSL_NO_SSL_INTERN + +typedef struct ssl2_state_st { + int three_byte_header; + int clear_text; /* clear text */ + int escape; /* not used in SSLv2 */ + int ssl2_rollback; /* used if SSLv23 rolled back to SSLv2 */ + /* + * non-blocking io info, used to make sure the same args were passwd + */ + unsigned int wnum; /* number of bytes sent so far */ + int wpend_tot; + const unsigned char *wpend_buf; + int wpend_off; /* offset to data to write */ + int wpend_len; /* number of bytes passwd to write */ + int wpend_ret; /* number of bytes to return to caller */ + /* buffer raw data */ + int rbuf_left; + int rbuf_offs; + unsigned char *rbuf; + unsigned char *wbuf; + unsigned char *write_ptr; /* used to point to the start due to 2/3 byte + * header. */ + unsigned int padding; + unsigned int rlength; /* passed to ssl2_enc */ + int ract_data_length; /* Set when things are encrypted. */ + unsigned int wlength; /* passed to ssl2_enc */ + int wact_data_length; /* Set when things are decrypted. */ + unsigned char *ract_data; + unsigned char *wact_data; + unsigned char *mac_data; + unsigned char *read_key; + unsigned char *write_key; + /* Stuff specifically to do with this SSL session */ + unsigned int challenge_length; + unsigned char challenge[SSL2_MAX_CHALLENGE_LENGTH]; + unsigned int conn_id_length; + unsigned char conn_id[SSL2_MAX_CONNECTION_ID_LENGTH]; + unsigned int key_material_length; + unsigned char key_material[SSL2_MAX_KEY_MATERIAL_LENGTH * 2]; + unsigned long read_sequence; + unsigned long write_sequence; + struct { + unsigned int conn_id_length; + unsigned int cert_type; + unsigned int cert_length; + unsigned int csl; + unsigned int clear; + unsigned int enc; + unsigned char ccl[SSL2_MAX_CERT_CHALLENGE_LENGTH]; + unsigned int cipher_spec_length; + unsigned int session_id_length; + unsigned int clen; + unsigned int rlen; + } tmp; +} SSL2_STATE; + +# endif + +/* SSLv2 */ +/* client */ +# define SSL2_ST_SEND_CLIENT_HELLO_A (0x10|SSL_ST_CONNECT) +# define SSL2_ST_SEND_CLIENT_HELLO_B (0x11|SSL_ST_CONNECT) +# define SSL2_ST_GET_SERVER_HELLO_A (0x20|SSL_ST_CONNECT) +# define SSL2_ST_GET_SERVER_HELLO_B (0x21|SSL_ST_CONNECT) +# define SSL2_ST_SEND_CLIENT_MASTER_KEY_A (0x30|SSL_ST_CONNECT) +# define SSL2_ST_SEND_CLIENT_MASTER_KEY_B (0x31|SSL_ST_CONNECT) +# define SSL2_ST_SEND_CLIENT_FINISHED_A (0x40|SSL_ST_CONNECT) +# define SSL2_ST_SEND_CLIENT_FINISHED_B (0x41|SSL_ST_CONNECT) +# define SSL2_ST_SEND_CLIENT_CERTIFICATE_A (0x50|SSL_ST_CONNECT) +# define SSL2_ST_SEND_CLIENT_CERTIFICATE_B (0x51|SSL_ST_CONNECT) +# define SSL2_ST_SEND_CLIENT_CERTIFICATE_C (0x52|SSL_ST_CONNECT) +# define SSL2_ST_SEND_CLIENT_CERTIFICATE_D (0x53|SSL_ST_CONNECT) +# define SSL2_ST_GET_SERVER_VERIFY_A (0x60|SSL_ST_CONNECT) +# define SSL2_ST_GET_SERVER_VERIFY_B (0x61|SSL_ST_CONNECT) +# define SSL2_ST_GET_SERVER_FINISHED_A (0x70|SSL_ST_CONNECT) +# define SSL2_ST_GET_SERVER_FINISHED_B (0x71|SSL_ST_CONNECT) +# define SSL2_ST_CLIENT_START_ENCRYPTION (0x80|SSL_ST_CONNECT) +# define SSL2_ST_X509_GET_CLIENT_CERTIFICATE (0x90|SSL_ST_CONNECT) +/* server */ +# define SSL2_ST_GET_CLIENT_HELLO_A (0x10|SSL_ST_ACCEPT) +# define SSL2_ST_GET_CLIENT_HELLO_B (0x11|SSL_ST_ACCEPT) +# define SSL2_ST_GET_CLIENT_HELLO_C (0x12|SSL_ST_ACCEPT) +# define SSL2_ST_SEND_SERVER_HELLO_A (0x20|SSL_ST_ACCEPT) +# define SSL2_ST_SEND_SERVER_HELLO_B (0x21|SSL_ST_ACCEPT) +# define SSL2_ST_GET_CLIENT_MASTER_KEY_A (0x30|SSL_ST_ACCEPT) +# define SSL2_ST_GET_CLIENT_MASTER_KEY_B (0x31|SSL_ST_ACCEPT) +# define SSL2_ST_SEND_SERVER_VERIFY_A (0x40|SSL_ST_ACCEPT) +# define SSL2_ST_SEND_SERVER_VERIFY_B (0x41|SSL_ST_ACCEPT) +# define SSL2_ST_SEND_SERVER_VERIFY_C (0x42|SSL_ST_ACCEPT) +# define SSL2_ST_GET_CLIENT_FINISHED_A (0x50|SSL_ST_ACCEPT) +# define SSL2_ST_GET_CLIENT_FINISHED_B (0x51|SSL_ST_ACCEPT) +# define SSL2_ST_SEND_SERVER_FINISHED_A (0x60|SSL_ST_ACCEPT) +# define SSL2_ST_SEND_SERVER_FINISHED_B (0x61|SSL_ST_ACCEPT) +# define SSL2_ST_SEND_REQUEST_CERTIFICATE_A (0x70|SSL_ST_ACCEPT) +# define SSL2_ST_SEND_REQUEST_CERTIFICATE_B (0x71|SSL_ST_ACCEPT) +# define SSL2_ST_SEND_REQUEST_CERTIFICATE_C (0x72|SSL_ST_ACCEPT) +# define SSL2_ST_SEND_REQUEST_CERTIFICATE_D (0x73|SSL_ST_ACCEPT) +# define SSL2_ST_SERVER_START_ENCRYPTION (0x80|SSL_ST_ACCEPT) +# define SSL2_ST_X509_GET_SERVER_CERTIFICATE (0x90|SSL_ST_ACCEPT) + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/win/openssl/include/openssl/ssl23.h b/hdssd/external/win/openssl/include/openssl/ssl23.h new file mode 100644 index 0000000..9de4685 --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/ssl23.h @@ -0,0 +1,84 @@ +/* ssl/ssl23.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_SSL23_H +# define HEADER_SSL23_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * client + */ +/* write to server */ +# define SSL23_ST_CW_CLNT_HELLO_A (0x210|SSL_ST_CONNECT) +# define SSL23_ST_CW_CLNT_HELLO_B (0x211|SSL_ST_CONNECT) +/* read from server */ +# define SSL23_ST_CR_SRVR_HELLO_A (0x220|SSL_ST_CONNECT) +# define SSL23_ST_CR_SRVR_HELLO_B (0x221|SSL_ST_CONNECT) + +/* server */ +/* read from client */ +# define SSL23_ST_SR_CLNT_HELLO_A (0x210|SSL_ST_ACCEPT) +# define SSL23_ST_SR_CLNT_HELLO_B (0x211|SSL_ST_ACCEPT) + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/win/openssl/include/openssl/ssl3.h b/hdssd/external/win/openssl/include/openssl/ssl3.h new file mode 100644 index 0000000..e681d50 --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/ssl3.h @@ -0,0 +1,774 @@ +/* ssl/ssl3.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ +/* ==================================================================== + * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * ECC cipher suite support in OpenSSL originally developed by + * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project. + */ + +#ifndef HEADER_SSL3_H +# define HEADER_SSL3_H + +# ifndef OPENSSL_NO_COMP +# include +# endif +# include +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Signalling cipher suite value from RFC 5746 + * (TLS_EMPTY_RENEGOTIATION_INFO_SCSV) + */ +# define SSL3_CK_SCSV 0x030000FF + +/* + * Signalling cipher suite value from draft-ietf-tls-downgrade-scsv-00 + * (TLS_FALLBACK_SCSV) + */ +# define SSL3_CK_FALLBACK_SCSV 0x03005600 + +# define SSL3_CK_RSA_NULL_MD5 0x03000001 +# define SSL3_CK_RSA_NULL_SHA 0x03000002 +# define SSL3_CK_RSA_RC4_40_MD5 0x03000003 +# define SSL3_CK_RSA_RC4_128_MD5 0x03000004 +# define SSL3_CK_RSA_RC4_128_SHA 0x03000005 +# define SSL3_CK_RSA_RC2_40_MD5 0x03000006 +# define SSL3_CK_RSA_IDEA_128_SHA 0x03000007 +# define SSL3_CK_RSA_DES_40_CBC_SHA 0x03000008 +# define SSL3_CK_RSA_DES_64_CBC_SHA 0x03000009 +# define SSL3_CK_RSA_DES_192_CBC3_SHA 0x0300000A + +# define SSL3_CK_DH_DSS_DES_40_CBC_SHA 0x0300000B +# define SSL3_CK_DH_DSS_DES_64_CBC_SHA 0x0300000C +# define SSL3_CK_DH_DSS_DES_192_CBC3_SHA 0x0300000D +# define SSL3_CK_DH_RSA_DES_40_CBC_SHA 0x0300000E +# define SSL3_CK_DH_RSA_DES_64_CBC_SHA 0x0300000F +# define SSL3_CK_DH_RSA_DES_192_CBC3_SHA 0x03000010 + +# define SSL3_CK_EDH_DSS_DES_40_CBC_SHA 0x03000011 +# define SSL3_CK_DHE_DSS_DES_40_CBC_SHA SSL3_CK_EDH_DSS_DES_40_CBC_SHA +# define SSL3_CK_EDH_DSS_DES_64_CBC_SHA 0x03000012 +# define SSL3_CK_DHE_DSS_DES_64_CBC_SHA SSL3_CK_EDH_DSS_DES_64_CBC_SHA +# define SSL3_CK_EDH_DSS_DES_192_CBC3_SHA 0x03000013 +# define SSL3_CK_DHE_DSS_DES_192_CBC3_SHA SSL3_CK_EDH_DSS_DES_192_CBC3_SHA +# define SSL3_CK_EDH_RSA_DES_40_CBC_SHA 0x03000014 +# define SSL3_CK_DHE_RSA_DES_40_CBC_SHA SSL3_CK_EDH_RSA_DES_40_CBC_SHA +# define SSL3_CK_EDH_RSA_DES_64_CBC_SHA 0x03000015 +# define SSL3_CK_DHE_RSA_DES_64_CBC_SHA SSL3_CK_EDH_RSA_DES_64_CBC_SHA +# define SSL3_CK_EDH_RSA_DES_192_CBC3_SHA 0x03000016 +# define SSL3_CK_DHE_RSA_DES_192_CBC3_SHA SSL3_CK_EDH_RSA_DES_192_CBC3_SHA + +# define SSL3_CK_ADH_RC4_40_MD5 0x03000017 +# define SSL3_CK_ADH_RC4_128_MD5 0x03000018 +# define SSL3_CK_ADH_DES_40_CBC_SHA 0x03000019 +# define SSL3_CK_ADH_DES_64_CBC_SHA 0x0300001A +# define SSL3_CK_ADH_DES_192_CBC_SHA 0x0300001B + +# if 0 +# define SSL3_CK_FZA_DMS_NULL_SHA 0x0300001C +# define SSL3_CK_FZA_DMS_FZA_SHA 0x0300001D +# if 0 /* Because it clashes with KRB5, is never + * used any more, and is safe to remove + * according to David Hopwood + * of the + * ietf-tls list */ +# define SSL3_CK_FZA_DMS_RC4_SHA 0x0300001E +# endif +# endif + +/* + * VRS Additional Kerberos5 entries + */ +# define SSL3_CK_KRB5_DES_64_CBC_SHA 0x0300001E +# define SSL3_CK_KRB5_DES_192_CBC3_SHA 0x0300001F +# define SSL3_CK_KRB5_RC4_128_SHA 0x03000020 +# define SSL3_CK_KRB5_IDEA_128_CBC_SHA 0x03000021 +# define SSL3_CK_KRB5_DES_64_CBC_MD5 0x03000022 +# define SSL3_CK_KRB5_DES_192_CBC3_MD5 0x03000023 +# define SSL3_CK_KRB5_RC4_128_MD5 0x03000024 +# define SSL3_CK_KRB5_IDEA_128_CBC_MD5 0x03000025 + +# define SSL3_CK_KRB5_DES_40_CBC_SHA 0x03000026 +# define SSL3_CK_KRB5_RC2_40_CBC_SHA 0x03000027 +# define SSL3_CK_KRB5_RC4_40_SHA 0x03000028 +# define SSL3_CK_KRB5_DES_40_CBC_MD5 0x03000029 +# define SSL3_CK_KRB5_RC2_40_CBC_MD5 0x0300002A +# define SSL3_CK_KRB5_RC4_40_MD5 0x0300002B + +# define SSL3_TXT_RSA_NULL_MD5 "NULL-MD5" +# define SSL3_TXT_RSA_NULL_SHA "NULL-SHA" +# define SSL3_TXT_RSA_RC4_40_MD5 "EXP-RC4-MD5" +# define SSL3_TXT_RSA_RC4_128_MD5 "RC4-MD5" +# define SSL3_TXT_RSA_RC4_128_SHA "RC4-SHA" +# define SSL3_TXT_RSA_RC2_40_MD5 "EXP-RC2-CBC-MD5" +# define SSL3_TXT_RSA_IDEA_128_SHA "IDEA-CBC-SHA" +# define SSL3_TXT_RSA_DES_40_CBC_SHA "EXP-DES-CBC-SHA" +# define SSL3_TXT_RSA_DES_64_CBC_SHA "DES-CBC-SHA" +# define SSL3_TXT_RSA_DES_192_CBC3_SHA "DES-CBC3-SHA" + +# define SSL3_TXT_DH_DSS_DES_40_CBC_SHA "EXP-DH-DSS-DES-CBC-SHA" +# define SSL3_TXT_DH_DSS_DES_64_CBC_SHA "DH-DSS-DES-CBC-SHA" +# define SSL3_TXT_DH_DSS_DES_192_CBC3_SHA "DH-DSS-DES-CBC3-SHA" +# define SSL3_TXT_DH_RSA_DES_40_CBC_SHA "EXP-DH-RSA-DES-CBC-SHA" +# define SSL3_TXT_DH_RSA_DES_64_CBC_SHA "DH-RSA-DES-CBC-SHA" +# define SSL3_TXT_DH_RSA_DES_192_CBC3_SHA "DH-RSA-DES-CBC3-SHA" + +# define SSL3_TXT_DHE_DSS_DES_40_CBC_SHA "EXP-DHE-DSS-DES-CBC-SHA" +# define SSL3_TXT_DHE_DSS_DES_64_CBC_SHA "DHE-DSS-DES-CBC-SHA" +# define SSL3_TXT_DHE_DSS_DES_192_CBC3_SHA "DHE-DSS-DES-CBC3-SHA" +# define SSL3_TXT_DHE_RSA_DES_40_CBC_SHA "EXP-DHE-RSA-DES-CBC-SHA" +# define SSL3_TXT_DHE_RSA_DES_64_CBC_SHA "DHE-RSA-DES-CBC-SHA" +# define SSL3_TXT_DHE_RSA_DES_192_CBC3_SHA "DHE-RSA-DES-CBC3-SHA" + +/* + * This next block of six "EDH" labels is for backward compatibility with + * older versions of OpenSSL. New code should use the six "DHE" labels above + * instead: + */ +# define SSL3_TXT_EDH_DSS_DES_40_CBC_SHA "EXP-EDH-DSS-DES-CBC-SHA" +# define SSL3_TXT_EDH_DSS_DES_64_CBC_SHA "EDH-DSS-DES-CBC-SHA" +# define SSL3_TXT_EDH_DSS_DES_192_CBC3_SHA "EDH-DSS-DES-CBC3-SHA" +# define SSL3_TXT_EDH_RSA_DES_40_CBC_SHA "EXP-EDH-RSA-DES-CBC-SHA" +# define SSL3_TXT_EDH_RSA_DES_64_CBC_SHA "EDH-RSA-DES-CBC-SHA" +# define SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA "EDH-RSA-DES-CBC3-SHA" + +# define SSL3_TXT_ADH_RC4_40_MD5 "EXP-ADH-RC4-MD5" +# define SSL3_TXT_ADH_RC4_128_MD5 "ADH-RC4-MD5" +# define SSL3_TXT_ADH_DES_40_CBC_SHA "EXP-ADH-DES-CBC-SHA" +# define SSL3_TXT_ADH_DES_64_CBC_SHA "ADH-DES-CBC-SHA" +# define SSL3_TXT_ADH_DES_192_CBC_SHA "ADH-DES-CBC3-SHA" + +# if 0 +# define SSL3_TXT_FZA_DMS_NULL_SHA "FZA-NULL-SHA" +# define SSL3_TXT_FZA_DMS_FZA_SHA "FZA-FZA-CBC-SHA" +# define SSL3_TXT_FZA_DMS_RC4_SHA "FZA-RC4-SHA" +# endif + +# define SSL3_TXT_KRB5_DES_64_CBC_SHA "KRB5-DES-CBC-SHA" +# define SSL3_TXT_KRB5_DES_192_CBC3_SHA "KRB5-DES-CBC3-SHA" +# define SSL3_TXT_KRB5_RC4_128_SHA "KRB5-RC4-SHA" +# define SSL3_TXT_KRB5_IDEA_128_CBC_SHA "KRB5-IDEA-CBC-SHA" +# define SSL3_TXT_KRB5_DES_64_CBC_MD5 "KRB5-DES-CBC-MD5" +# define SSL3_TXT_KRB5_DES_192_CBC3_MD5 "KRB5-DES-CBC3-MD5" +# define SSL3_TXT_KRB5_RC4_128_MD5 "KRB5-RC4-MD5" +# define SSL3_TXT_KRB5_IDEA_128_CBC_MD5 "KRB5-IDEA-CBC-MD5" + +# define SSL3_TXT_KRB5_DES_40_CBC_SHA "EXP-KRB5-DES-CBC-SHA" +# define SSL3_TXT_KRB5_RC2_40_CBC_SHA "EXP-KRB5-RC2-CBC-SHA" +# define SSL3_TXT_KRB5_RC4_40_SHA "EXP-KRB5-RC4-SHA" +# define SSL3_TXT_KRB5_DES_40_CBC_MD5 "EXP-KRB5-DES-CBC-MD5" +# define SSL3_TXT_KRB5_RC2_40_CBC_MD5 "EXP-KRB5-RC2-CBC-MD5" +# define SSL3_TXT_KRB5_RC4_40_MD5 "EXP-KRB5-RC4-MD5" + +# define SSL3_SSL_SESSION_ID_LENGTH 32 +# define SSL3_MAX_SSL_SESSION_ID_LENGTH 32 + +# define SSL3_MASTER_SECRET_SIZE 48 +# define SSL3_RANDOM_SIZE 32 +# define SSL3_SESSION_ID_SIZE 32 +# define SSL3_RT_HEADER_LENGTH 5 + +# define SSL3_HM_HEADER_LENGTH 4 + +# ifndef SSL3_ALIGN_PAYLOAD + /* + * Some will argue that this increases memory footprint, but it's not + * actually true. Point is that malloc has to return at least 64-bit aligned + * pointers, meaning that allocating 5 bytes wastes 3 bytes in either case. + * Suggested pre-gaping simply moves these wasted bytes from the end of + * allocated region to its front, but makes data payload aligned, which + * improves performance:-) + */ +# define SSL3_ALIGN_PAYLOAD 8 +# else +# if (SSL3_ALIGN_PAYLOAD&(SSL3_ALIGN_PAYLOAD-1))!=0 +# error "insane SSL3_ALIGN_PAYLOAD" +# undef SSL3_ALIGN_PAYLOAD +# endif +# endif + +/* + * This is the maximum MAC (digest) size used by the SSL library. Currently + * maximum of 20 is used by SHA1, but we reserve for future extension for + * 512-bit hashes. + */ + +# define SSL3_RT_MAX_MD_SIZE 64 + +/* + * Maximum block size used in all ciphersuites. Currently 16 for AES. + */ + +# define SSL_RT_MAX_CIPHER_BLOCK_SIZE 16 + +# define SSL3_RT_MAX_EXTRA (16384) + +/* Maximum plaintext length: defined by SSL/TLS standards */ +# define SSL3_RT_MAX_PLAIN_LENGTH 16384 +/* Maximum compression overhead: defined by SSL/TLS standards */ +# define SSL3_RT_MAX_COMPRESSED_OVERHEAD 1024 + +/* + * The standards give a maximum encryption overhead of 1024 bytes. In + * practice the value is lower than this. The overhead is the maximum number + * of padding bytes (256) plus the mac size. + */ +# define SSL3_RT_MAX_ENCRYPTED_OVERHEAD (256 + SSL3_RT_MAX_MD_SIZE) + +/* + * OpenSSL currently only uses a padding length of at most one block so the + * send overhead is smaller. + */ + +# define SSL3_RT_SEND_MAX_ENCRYPTED_OVERHEAD \ + (SSL_RT_MAX_CIPHER_BLOCK_SIZE + SSL3_RT_MAX_MD_SIZE) + +/* If compression isn't used don't include the compression overhead */ + +# ifdef OPENSSL_NO_COMP +# define SSL3_RT_MAX_COMPRESSED_LENGTH SSL3_RT_MAX_PLAIN_LENGTH +# else +# define SSL3_RT_MAX_COMPRESSED_LENGTH \ + (SSL3_RT_MAX_PLAIN_LENGTH+SSL3_RT_MAX_COMPRESSED_OVERHEAD) +# endif +# define SSL3_RT_MAX_ENCRYPTED_LENGTH \ + (SSL3_RT_MAX_ENCRYPTED_OVERHEAD+SSL3_RT_MAX_COMPRESSED_LENGTH) +# define SSL3_RT_MAX_PACKET_SIZE \ + (SSL3_RT_MAX_ENCRYPTED_LENGTH+SSL3_RT_HEADER_LENGTH) + +# define SSL3_MD_CLIENT_FINISHED_CONST "\x43\x4C\x4E\x54" +# define SSL3_MD_SERVER_FINISHED_CONST "\x53\x52\x56\x52" + +# define SSL3_VERSION 0x0300 +# define SSL3_VERSION_MAJOR 0x03 +# define SSL3_VERSION_MINOR 0x00 + +# define SSL3_RT_CHANGE_CIPHER_SPEC 20 +# define SSL3_RT_ALERT 21 +# define SSL3_RT_HANDSHAKE 22 +# define SSL3_RT_APPLICATION_DATA 23 +# define TLS1_RT_HEARTBEAT 24 + +/* Pseudo content types to indicate additional parameters */ +# define TLS1_RT_CRYPTO 0x1000 +# define TLS1_RT_CRYPTO_PREMASTER (TLS1_RT_CRYPTO | 0x1) +# define TLS1_RT_CRYPTO_CLIENT_RANDOM (TLS1_RT_CRYPTO | 0x2) +# define TLS1_RT_CRYPTO_SERVER_RANDOM (TLS1_RT_CRYPTO | 0x3) +# define TLS1_RT_CRYPTO_MASTER (TLS1_RT_CRYPTO | 0x4) + +# define TLS1_RT_CRYPTO_READ 0x0000 +# define TLS1_RT_CRYPTO_WRITE 0x0100 +# define TLS1_RT_CRYPTO_MAC (TLS1_RT_CRYPTO | 0x5) +# define TLS1_RT_CRYPTO_KEY (TLS1_RT_CRYPTO | 0x6) +# define TLS1_RT_CRYPTO_IV (TLS1_RT_CRYPTO | 0x7) +# define TLS1_RT_CRYPTO_FIXED_IV (TLS1_RT_CRYPTO | 0x8) + +/* Pseudo content type for SSL/TLS header info */ +# define SSL3_RT_HEADER 0x100 + +# define SSL3_AL_WARNING 1 +# define SSL3_AL_FATAL 2 + +# define SSL3_AD_CLOSE_NOTIFY 0 +# define SSL3_AD_UNEXPECTED_MESSAGE 10/* fatal */ +# define SSL3_AD_BAD_RECORD_MAC 20/* fatal */ +# define SSL3_AD_DECOMPRESSION_FAILURE 30/* fatal */ +# define SSL3_AD_HANDSHAKE_FAILURE 40/* fatal */ +# define SSL3_AD_NO_CERTIFICATE 41 +# define SSL3_AD_BAD_CERTIFICATE 42 +# define SSL3_AD_UNSUPPORTED_CERTIFICATE 43 +# define SSL3_AD_CERTIFICATE_REVOKED 44 +# define SSL3_AD_CERTIFICATE_EXPIRED 45 +# define SSL3_AD_CERTIFICATE_UNKNOWN 46 +# define SSL3_AD_ILLEGAL_PARAMETER 47/* fatal */ + +# define TLS1_HB_REQUEST 1 +# define TLS1_HB_RESPONSE 2 + +# ifndef OPENSSL_NO_SSL_INTERN + +typedef struct ssl3_record_st { + /* type of record */ + /* + * r + */ int type; + /* How many bytes available */ + /* + * rw + */ unsigned int length; + /* read/write offset into 'buf' */ + /* + * r + */ unsigned int off; + /* pointer to the record data */ + /* + * rw + */ unsigned char *data; + /* where the decode bytes are */ + /* + * rw + */ unsigned char *input; + /* only used with decompression - malloc()ed */ + /* + * r + */ unsigned char *comp; + /* epoch number, needed by DTLS1 */ + /* + * r + */ unsigned long epoch; + /* sequence number, needed by DTLS1 */ + /* + * r + */ unsigned char seq_num[8]; +} SSL3_RECORD; + +typedef struct ssl3_buffer_st { + /* at least SSL3_RT_MAX_PACKET_SIZE bytes, see ssl3_setup_buffers() */ + unsigned char *buf; + /* buffer size */ + size_t len; + /* where to 'copy from' */ + int offset; + /* how many bytes left */ + int left; +} SSL3_BUFFER; + +# endif + +# define SSL3_CT_RSA_SIGN 1 +# define SSL3_CT_DSS_SIGN 2 +# define SSL3_CT_RSA_FIXED_DH 3 +# define SSL3_CT_DSS_FIXED_DH 4 +# define SSL3_CT_RSA_EPHEMERAL_DH 5 +# define SSL3_CT_DSS_EPHEMERAL_DH 6 +# define SSL3_CT_FORTEZZA_DMS 20 +/* + * SSL3_CT_NUMBER is used to size arrays and it must be large enough to + * contain all of the cert types defined either for SSLv3 and TLSv1. + */ +# define SSL3_CT_NUMBER 9 + +# define SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS 0x0001 +# define SSL3_FLAGS_DELAY_CLIENT_FINISHED 0x0002 +# define SSL3_FLAGS_POP_BUFFER 0x0004 +# define TLS1_FLAGS_TLS_PADDING_BUG 0x0008 +# define TLS1_FLAGS_SKIP_CERT_VERIFY 0x0010 +# define TLS1_FLAGS_KEEP_HANDSHAKE 0x0020 +/* + * Set when the handshake is ready to process peer's ChangeCipherSpec message. + * Cleared after the message has been processed. + */ +# define SSL3_FLAGS_CCS_OK 0x0080 + +/* SSL3_FLAGS_SGC_RESTART_DONE is no longer used */ +# define SSL3_FLAGS_SGC_RESTART_DONE 0x0040 + +# ifndef OPENSSL_NO_SSL_INTERN + +typedef struct ssl3_state_st { + long flags; + int delay_buf_pop_ret; + unsigned char read_sequence[8]; + int read_mac_secret_size; + unsigned char read_mac_secret[EVP_MAX_MD_SIZE]; + unsigned char write_sequence[8]; + int write_mac_secret_size; + unsigned char write_mac_secret[EVP_MAX_MD_SIZE]; + unsigned char server_random[SSL3_RANDOM_SIZE]; + unsigned char client_random[SSL3_RANDOM_SIZE]; + /* flags for countermeasure against known-IV weakness */ + int need_empty_fragments; + int empty_fragment_done; + /* The value of 'extra' when the buffers were initialized */ + int init_extra; + SSL3_BUFFER rbuf; /* read IO goes into here */ + SSL3_BUFFER wbuf; /* write IO goes into here */ + SSL3_RECORD rrec; /* each decoded record goes in here */ + SSL3_RECORD wrec; /* goes out from here */ + /* + * storage for Alert/Handshake protocol data received but not yet + * processed by ssl3_read_bytes: + */ + unsigned char alert_fragment[2]; + unsigned int alert_fragment_len; + unsigned char handshake_fragment[4]; + unsigned int handshake_fragment_len; + /* partial write - check the numbers match */ + unsigned int wnum; /* number of bytes sent so far */ + int wpend_tot; /* number bytes written */ + int wpend_type; + int wpend_ret; /* number of bytes submitted */ + const unsigned char *wpend_buf; + /* used during startup, digest all incoming/outgoing packets */ + BIO *handshake_buffer; + /* + * When set of handshake digests is determined, buffer is hashed and + * freed and MD_CTX-es for all required digests are stored in this array + */ + EVP_MD_CTX **handshake_dgst; + /* + * Set whenever an expected ChangeCipherSpec message is processed. + * Unset when the peer's Finished message is received. + * Unexpected ChangeCipherSpec messages trigger a fatal alert. + */ + int change_cipher_spec; + int warn_alert; + int fatal_alert; + /* + * we allow one fatal and one warning alert to be outstanding, send close + * alert via the warning alert + */ + int alert_dispatch; + unsigned char send_alert[2]; + /* + * This flag is set when we should renegotiate ASAP, basically when there + * is no more data in the read or write buffers + */ + int renegotiate; + int total_renegotiations; + int num_renegotiations; + int in_read_app_data; + /* + * Opaque PRF input as used for the current handshake. These fields are + * used only if TLSEXT_TYPE_opaque_prf_input is defined (otherwise, they + * are merely present to improve binary compatibility) + */ + void *client_opaque_prf_input; + size_t client_opaque_prf_input_len; + void *server_opaque_prf_input; + size_t server_opaque_prf_input_len; + struct { + /* actually only needs to be 16+20 */ + unsigned char cert_verify_md[EVP_MAX_MD_SIZE * 2]; + /* actually only need to be 16+20 for SSLv3 and 12 for TLS */ + unsigned char finish_md[EVP_MAX_MD_SIZE * 2]; + int finish_md_len; + unsigned char peer_finish_md[EVP_MAX_MD_SIZE * 2]; + int peer_finish_md_len; + unsigned long message_size; + int message_type; + /* used to hold the new cipher we are going to use */ + const SSL_CIPHER *new_cipher; +# ifndef OPENSSL_NO_DH + DH *dh; +# endif +# ifndef OPENSSL_NO_ECDH + EC_KEY *ecdh; /* holds short lived ECDH key */ +# endif + /* used when SSL_ST_FLUSH_DATA is entered */ + int next_state; + int reuse_message; + /* used for certificate requests */ + int cert_req; + int ctype_num; + char ctype[SSL3_CT_NUMBER]; + STACK_OF(X509_NAME) *ca_names; + int use_rsa_tmp; + int key_block_length; + unsigned char *key_block; + const EVP_CIPHER *new_sym_enc; + const EVP_MD *new_hash; + int new_mac_pkey_type; + int new_mac_secret_size; +# ifndef OPENSSL_NO_COMP + const SSL_COMP *new_compression; +# else + char *new_compression; +# endif + int cert_request; + } tmp; + + /* Connection binding to prevent renegotiation attacks */ + unsigned char previous_client_finished[EVP_MAX_MD_SIZE]; + unsigned char previous_client_finished_len; + unsigned char previous_server_finished[EVP_MAX_MD_SIZE]; + unsigned char previous_server_finished_len; + int send_connection_binding; /* TODOEKR */ + +# ifndef OPENSSL_NO_NEXTPROTONEG + /* + * Set if we saw the Next Protocol Negotiation extension from our peer. + */ + int next_proto_neg_seen; +# endif + +# ifndef OPENSSL_NO_TLSEXT +# ifndef OPENSSL_NO_EC + /* + * This is set to true if we believe that this is a version of Safari + * running on OS X 10.6 or newer. We wish to know this because Safari on + * 10.8 .. 10.8.3 has broken ECDHE-ECDSA support. + */ + char is_probably_safari; +# endif /* !OPENSSL_NO_EC */ + + /* + * ALPN information (we are in the process of transitioning from NPN to + * ALPN.) + */ + + /* + * In a server these point to the selected ALPN protocol after the + * ClientHello has been processed. In a client these contain the protocol + * that the server selected once the ServerHello has been processed. + */ + unsigned char *alpn_selected; + unsigned alpn_selected_len; +# endif /* OPENSSL_NO_TLSEXT */ +} SSL3_STATE; + +# endif + +/* SSLv3 */ +/* + * client + */ +/* extra state */ +# define SSL3_ST_CW_FLUSH (0x100|SSL_ST_CONNECT) +# ifndef OPENSSL_NO_SCTP +# define DTLS1_SCTP_ST_CW_WRITE_SOCK (0x310|SSL_ST_CONNECT) +# define DTLS1_SCTP_ST_CR_READ_SOCK (0x320|SSL_ST_CONNECT) +# endif +/* write to server */ +# define SSL3_ST_CW_CLNT_HELLO_A (0x110|SSL_ST_CONNECT) +# define SSL3_ST_CW_CLNT_HELLO_B (0x111|SSL_ST_CONNECT) +/* read from server */ +# define SSL3_ST_CR_SRVR_HELLO_A (0x120|SSL_ST_CONNECT) +# define SSL3_ST_CR_SRVR_HELLO_B (0x121|SSL_ST_CONNECT) +# define DTLS1_ST_CR_HELLO_VERIFY_REQUEST_A (0x126|SSL_ST_CONNECT) +# define DTLS1_ST_CR_HELLO_VERIFY_REQUEST_B (0x127|SSL_ST_CONNECT) +# define SSL3_ST_CR_CERT_A (0x130|SSL_ST_CONNECT) +# define SSL3_ST_CR_CERT_B (0x131|SSL_ST_CONNECT) +# define SSL3_ST_CR_KEY_EXCH_A (0x140|SSL_ST_CONNECT) +# define SSL3_ST_CR_KEY_EXCH_B (0x141|SSL_ST_CONNECT) +# define SSL3_ST_CR_CERT_REQ_A (0x150|SSL_ST_CONNECT) +# define SSL3_ST_CR_CERT_REQ_B (0x151|SSL_ST_CONNECT) +# define SSL3_ST_CR_SRVR_DONE_A (0x160|SSL_ST_CONNECT) +# define SSL3_ST_CR_SRVR_DONE_B (0x161|SSL_ST_CONNECT) +/* write to server */ +# define SSL3_ST_CW_CERT_A (0x170|SSL_ST_CONNECT) +# define SSL3_ST_CW_CERT_B (0x171|SSL_ST_CONNECT) +# define SSL3_ST_CW_CERT_C (0x172|SSL_ST_CONNECT) +# define SSL3_ST_CW_CERT_D (0x173|SSL_ST_CONNECT) +# define SSL3_ST_CW_KEY_EXCH_A (0x180|SSL_ST_CONNECT) +# define SSL3_ST_CW_KEY_EXCH_B (0x181|SSL_ST_CONNECT) +# define SSL3_ST_CW_CERT_VRFY_A (0x190|SSL_ST_CONNECT) +# define SSL3_ST_CW_CERT_VRFY_B (0x191|SSL_ST_CONNECT) +# define SSL3_ST_CW_CHANGE_A (0x1A0|SSL_ST_CONNECT) +# define SSL3_ST_CW_CHANGE_B (0x1A1|SSL_ST_CONNECT) +# ifndef OPENSSL_NO_NEXTPROTONEG +# define SSL3_ST_CW_NEXT_PROTO_A (0x200|SSL_ST_CONNECT) +# define SSL3_ST_CW_NEXT_PROTO_B (0x201|SSL_ST_CONNECT) +# endif +# define SSL3_ST_CW_FINISHED_A (0x1B0|SSL_ST_CONNECT) +# define SSL3_ST_CW_FINISHED_B (0x1B1|SSL_ST_CONNECT) +/* read from server */ +# define SSL3_ST_CR_CHANGE_A (0x1C0|SSL_ST_CONNECT) +# define SSL3_ST_CR_CHANGE_B (0x1C1|SSL_ST_CONNECT) +# define SSL3_ST_CR_FINISHED_A (0x1D0|SSL_ST_CONNECT) +# define SSL3_ST_CR_FINISHED_B (0x1D1|SSL_ST_CONNECT) +# define SSL3_ST_CR_SESSION_TICKET_A (0x1E0|SSL_ST_CONNECT) +# define SSL3_ST_CR_SESSION_TICKET_B (0x1E1|SSL_ST_CONNECT) +# define SSL3_ST_CR_CERT_STATUS_A (0x1F0|SSL_ST_CONNECT) +# define SSL3_ST_CR_CERT_STATUS_B (0x1F1|SSL_ST_CONNECT) + +/* server */ +/* extra state */ +# define SSL3_ST_SW_FLUSH (0x100|SSL_ST_ACCEPT) +# ifndef OPENSSL_NO_SCTP +# define DTLS1_SCTP_ST_SW_WRITE_SOCK (0x310|SSL_ST_ACCEPT) +# define DTLS1_SCTP_ST_SR_READ_SOCK (0x320|SSL_ST_ACCEPT) +# endif +/* read from client */ +/* Do not change the number values, they do matter */ +# define SSL3_ST_SR_CLNT_HELLO_A (0x110|SSL_ST_ACCEPT) +# define SSL3_ST_SR_CLNT_HELLO_B (0x111|SSL_ST_ACCEPT) +# define SSL3_ST_SR_CLNT_HELLO_C (0x112|SSL_ST_ACCEPT) +# define SSL3_ST_SR_CLNT_HELLO_D (0x115|SSL_ST_ACCEPT) +/* write to client */ +# define DTLS1_ST_SW_HELLO_VERIFY_REQUEST_A (0x113|SSL_ST_ACCEPT) +# define DTLS1_ST_SW_HELLO_VERIFY_REQUEST_B (0x114|SSL_ST_ACCEPT) +# define SSL3_ST_SW_HELLO_REQ_A (0x120|SSL_ST_ACCEPT) +# define SSL3_ST_SW_HELLO_REQ_B (0x121|SSL_ST_ACCEPT) +# define SSL3_ST_SW_HELLO_REQ_C (0x122|SSL_ST_ACCEPT) +# define SSL3_ST_SW_SRVR_HELLO_A (0x130|SSL_ST_ACCEPT) +# define SSL3_ST_SW_SRVR_HELLO_B (0x131|SSL_ST_ACCEPT) +# define SSL3_ST_SW_CERT_A (0x140|SSL_ST_ACCEPT) +# define SSL3_ST_SW_CERT_B (0x141|SSL_ST_ACCEPT) +# define SSL3_ST_SW_KEY_EXCH_A (0x150|SSL_ST_ACCEPT) +# define SSL3_ST_SW_KEY_EXCH_B (0x151|SSL_ST_ACCEPT) +# define SSL3_ST_SW_CERT_REQ_A (0x160|SSL_ST_ACCEPT) +# define SSL3_ST_SW_CERT_REQ_B (0x161|SSL_ST_ACCEPT) +# define SSL3_ST_SW_SRVR_DONE_A (0x170|SSL_ST_ACCEPT) +# define SSL3_ST_SW_SRVR_DONE_B (0x171|SSL_ST_ACCEPT) +/* read from client */ +# define SSL3_ST_SR_CERT_A (0x180|SSL_ST_ACCEPT) +# define SSL3_ST_SR_CERT_B (0x181|SSL_ST_ACCEPT) +# define SSL3_ST_SR_KEY_EXCH_A (0x190|SSL_ST_ACCEPT) +# define SSL3_ST_SR_KEY_EXCH_B (0x191|SSL_ST_ACCEPT) +# define SSL3_ST_SR_CERT_VRFY_A (0x1A0|SSL_ST_ACCEPT) +# define SSL3_ST_SR_CERT_VRFY_B (0x1A1|SSL_ST_ACCEPT) +# define SSL3_ST_SR_CHANGE_A (0x1B0|SSL_ST_ACCEPT) +# define SSL3_ST_SR_CHANGE_B (0x1B1|SSL_ST_ACCEPT) +# ifndef OPENSSL_NO_NEXTPROTONEG +# define SSL3_ST_SR_NEXT_PROTO_A (0x210|SSL_ST_ACCEPT) +# define SSL3_ST_SR_NEXT_PROTO_B (0x211|SSL_ST_ACCEPT) +# endif +# define SSL3_ST_SR_FINISHED_A (0x1C0|SSL_ST_ACCEPT) +# define SSL3_ST_SR_FINISHED_B (0x1C1|SSL_ST_ACCEPT) +/* write to client */ +# define SSL3_ST_SW_CHANGE_A (0x1D0|SSL_ST_ACCEPT) +# define SSL3_ST_SW_CHANGE_B (0x1D1|SSL_ST_ACCEPT) +# define SSL3_ST_SW_FINISHED_A (0x1E0|SSL_ST_ACCEPT) +# define SSL3_ST_SW_FINISHED_B (0x1E1|SSL_ST_ACCEPT) +# define SSL3_ST_SW_SESSION_TICKET_A (0x1F0|SSL_ST_ACCEPT) +# define SSL3_ST_SW_SESSION_TICKET_B (0x1F1|SSL_ST_ACCEPT) +# define SSL3_ST_SW_CERT_STATUS_A (0x200|SSL_ST_ACCEPT) +# define SSL3_ST_SW_CERT_STATUS_B (0x201|SSL_ST_ACCEPT) + +# define SSL3_MT_HELLO_REQUEST 0 +# define SSL3_MT_CLIENT_HELLO 1 +# define SSL3_MT_SERVER_HELLO 2 +# define SSL3_MT_NEWSESSION_TICKET 4 +# define SSL3_MT_CERTIFICATE 11 +# define SSL3_MT_SERVER_KEY_EXCHANGE 12 +# define SSL3_MT_CERTIFICATE_REQUEST 13 +# define SSL3_MT_SERVER_DONE 14 +# define SSL3_MT_CERTIFICATE_VERIFY 15 +# define SSL3_MT_CLIENT_KEY_EXCHANGE 16 +# define SSL3_MT_FINISHED 20 +# define SSL3_MT_CERTIFICATE_STATUS 22 +# ifndef OPENSSL_NO_NEXTPROTONEG +# define SSL3_MT_NEXT_PROTO 67 +# endif +# define DTLS1_MT_HELLO_VERIFY_REQUEST 3 + +# define SSL3_MT_CCS 1 + +/* These are used when changing over to a new cipher */ +# define SSL3_CC_READ 0x01 +# define SSL3_CC_WRITE 0x02 +# define SSL3_CC_CLIENT 0x10 +# define SSL3_CC_SERVER 0x20 +# define SSL3_CHANGE_CIPHER_CLIENT_WRITE (SSL3_CC_CLIENT|SSL3_CC_WRITE) +# define SSL3_CHANGE_CIPHER_SERVER_READ (SSL3_CC_SERVER|SSL3_CC_READ) +# define SSL3_CHANGE_CIPHER_CLIENT_READ (SSL3_CC_CLIENT|SSL3_CC_READ) +# define SSL3_CHANGE_CIPHER_SERVER_WRITE (SSL3_CC_SERVER|SSL3_CC_WRITE) + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/win/openssl/include/openssl/stack.h b/hdssd/external/win/openssl/include/openssl/stack.h new file mode 100644 index 0000000..eb07216 --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/stack.h @@ -0,0 +1,107 @@ +/* crypto/stack/stack.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_STACK_H +# define HEADER_STACK_H + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct stack_st { + int num; + char **data; + int sorted; + int num_alloc; + int (*comp) (const void *, const void *); +} _STACK; /* Use STACK_OF(...) instead */ + +# define M_sk_num(sk) ((sk) ? (sk)->num:-1) +# define M_sk_value(sk,n) ((sk) ? (sk)->data[n] : NULL) + +int sk_num(const _STACK *); +void *sk_value(const _STACK *, int); + +void *sk_set(_STACK *, int, void *); + +_STACK *sk_new(int (*cmp) (const void *, const void *)); +_STACK *sk_new_null(void); +void sk_free(_STACK *); +void sk_pop_free(_STACK *st, void (*func) (void *)); +_STACK *sk_deep_copy(_STACK *, void *(*)(void *), void (*)(void *)); +int sk_insert(_STACK *sk, void *data, int where); +void *sk_delete(_STACK *st, int loc); +void *sk_delete_ptr(_STACK *st, void *p); +int sk_find(_STACK *st, void *data); +int sk_find_ex(_STACK *st, void *data); +int sk_push(_STACK *st, void *data); +int sk_unshift(_STACK *st, void *data); +void *sk_shift(_STACK *st); +void *sk_pop(_STACK *st); +void sk_zero(_STACK *st); +int (*sk_set_cmp_func(_STACK *sk, int (*c) (const void *, const void *))) + (const void *, const void *); +_STACK *sk_dup(_STACK *st); +void sk_sort(_STACK *st); +int sk_is_sorted(const _STACK *st); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/win/openssl/include/openssl/symhacks.h b/hdssd/external/win/openssl/include/openssl/symhacks.h new file mode 100644 index 0000000..239fa4f --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/symhacks.h @@ -0,0 +1,516 @@ +/* ==================================================================== + * Copyright (c) 1999 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_SYMHACKS_H +# define HEADER_SYMHACKS_H + +# include + +/* + * Hacks to solve the problem with linkers incapable of handling very long + * symbol names. In the case of VMS, the limit is 31 characters on VMS for + * VAX. + */ +/* + * Note that this affects util/libeay.num and util/ssleay.num... you may + * change those manually, but that's not recommended, as those files are + * controlled centrally and updated on Unix, and the central definition may + * disagree with yours, which in turn may come with shareable library + * incompatibilities. + */ +# ifdef OPENSSL_SYS_VMS + +/* Hack a long name in crypto/ex_data.c */ +# undef CRYPTO_get_ex_data_implementation +# define CRYPTO_get_ex_data_implementation CRYPTO_get_ex_data_impl +# undef CRYPTO_set_ex_data_implementation +# define CRYPTO_set_ex_data_implementation CRYPTO_set_ex_data_impl + +/* Hack a long name in crypto/asn1/a_mbstr.c */ +# undef ASN1_STRING_set_default_mask_asc +# define ASN1_STRING_set_default_mask_asc ASN1_STRING_set_def_mask_asc + +# if 0 /* No longer needed, since safestack macro + * magic does the job */ +/* Hack the names created with DECLARE_ASN1_SET_OF(PKCS7_SIGNER_INFO) */ +# undef i2d_ASN1_SET_OF_PKCS7_SIGNER_INFO +# define i2d_ASN1_SET_OF_PKCS7_SIGNER_INFO i2d_ASN1_SET_OF_PKCS7_SIGINF +# undef d2i_ASN1_SET_OF_PKCS7_SIGNER_INFO +# define d2i_ASN1_SET_OF_PKCS7_SIGNER_INFO d2i_ASN1_SET_OF_PKCS7_SIGINF +# endif + +# if 0 /* No longer needed, since safestack macro + * magic does the job */ +/* Hack the names created with DECLARE_ASN1_SET_OF(PKCS7_RECIP_INFO) */ +# undef i2d_ASN1_SET_OF_PKCS7_RECIP_INFO +# define i2d_ASN1_SET_OF_PKCS7_RECIP_INFO i2d_ASN1_SET_OF_PKCS7_RECINF +# undef d2i_ASN1_SET_OF_PKCS7_RECIP_INFO +# define d2i_ASN1_SET_OF_PKCS7_RECIP_INFO d2i_ASN1_SET_OF_PKCS7_RECINF +# endif + +# if 0 /* No longer needed, since safestack macro + * magic does the job */ +/* Hack the names created with DECLARE_ASN1_SET_OF(ACCESS_DESCRIPTION) */ +# undef i2d_ASN1_SET_OF_ACCESS_DESCRIPTION +# define i2d_ASN1_SET_OF_ACCESS_DESCRIPTION i2d_ASN1_SET_OF_ACC_DESC +# undef d2i_ASN1_SET_OF_ACCESS_DESCRIPTION +# define d2i_ASN1_SET_OF_ACCESS_DESCRIPTION d2i_ASN1_SET_OF_ACC_DESC +# endif + +/* Hack the names created with DECLARE_PEM_rw(NETSCAPE_CERT_SEQUENCE) */ +# undef PEM_read_NETSCAPE_CERT_SEQUENCE +# define PEM_read_NETSCAPE_CERT_SEQUENCE PEM_read_NS_CERT_SEQ +# undef PEM_write_NETSCAPE_CERT_SEQUENCE +# define PEM_write_NETSCAPE_CERT_SEQUENCE PEM_write_NS_CERT_SEQ +# undef PEM_read_bio_NETSCAPE_CERT_SEQUENCE +# define PEM_read_bio_NETSCAPE_CERT_SEQUENCE PEM_read_bio_NS_CERT_SEQ +# undef PEM_write_bio_NETSCAPE_CERT_SEQUENCE +# define PEM_write_bio_NETSCAPE_CERT_SEQUENCE PEM_write_bio_NS_CERT_SEQ +# undef PEM_write_cb_bio_NETSCAPE_CERT_SEQUENCE +# define PEM_write_cb_bio_NETSCAPE_CERT_SEQUENCE PEM_write_cb_bio_NS_CERT_SEQ + +/* Hack the names created with DECLARE_PEM_rw(PKCS8_PRIV_KEY_INFO) */ +# undef PEM_read_PKCS8_PRIV_KEY_INFO +# define PEM_read_PKCS8_PRIV_KEY_INFO PEM_read_P8_PRIV_KEY_INFO +# undef PEM_write_PKCS8_PRIV_KEY_INFO +# define PEM_write_PKCS8_PRIV_KEY_INFO PEM_write_P8_PRIV_KEY_INFO +# undef PEM_read_bio_PKCS8_PRIV_KEY_INFO +# define PEM_read_bio_PKCS8_PRIV_KEY_INFO PEM_read_bio_P8_PRIV_KEY_INFO +# undef PEM_write_bio_PKCS8_PRIV_KEY_INFO +# define PEM_write_bio_PKCS8_PRIV_KEY_INFO PEM_write_bio_P8_PRIV_KEY_INFO +# undef PEM_write_cb_bio_PKCS8_PRIV_KEY_INFO +# define PEM_write_cb_bio_PKCS8_PRIV_KEY_INFO PEM_wrt_cb_bio_P8_PRIV_KEY_INFO + +/* Hack other PEM names */ +# undef PEM_write_bio_PKCS8PrivateKey_nid +# define PEM_write_bio_PKCS8PrivateKey_nid PEM_write_bio_PKCS8PrivKey_nid + +/* Hack some long X509 names */ +# undef X509_REVOKED_get_ext_by_critical +# define X509_REVOKED_get_ext_by_critical X509_REVOKED_get_ext_by_critic +# undef X509_policy_tree_get0_user_policies +# define X509_policy_tree_get0_user_policies X509_pcy_tree_get0_usr_policies +# undef X509_policy_node_get0_qualifiers +# define X509_policy_node_get0_qualifiers X509_pcy_node_get0_qualifiers +# undef X509_STORE_CTX_get_explicit_policy +# define X509_STORE_CTX_get_explicit_policy X509_STORE_CTX_get_expl_policy +# undef X509_STORE_CTX_get0_current_issuer +# define X509_STORE_CTX_get0_current_issuer X509_STORE_CTX_get0_cur_issuer + +/* Hack some long CRYPTO names */ +# undef CRYPTO_set_dynlock_destroy_callback +# define CRYPTO_set_dynlock_destroy_callback CRYPTO_set_dynlock_destroy_cb +# undef CRYPTO_set_dynlock_create_callback +# define CRYPTO_set_dynlock_create_callback CRYPTO_set_dynlock_create_cb +# undef CRYPTO_set_dynlock_lock_callback +# define CRYPTO_set_dynlock_lock_callback CRYPTO_set_dynlock_lock_cb +# undef CRYPTO_get_dynlock_lock_callback +# define CRYPTO_get_dynlock_lock_callback CRYPTO_get_dynlock_lock_cb +# undef CRYPTO_get_dynlock_destroy_callback +# define CRYPTO_get_dynlock_destroy_callback CRYPTO_get_dynlock_destroy_cb +# undef CRYPTO_get_dynlock_create_callback +# define CRYPTO_get_dynlock_create_callback CRYPTO_get_dynlock_create_cb +# undef CRYPTO_set_locked_mem_ex_functions +# define CRYPTO_set_locked_mem_ex_functions CRYPTO_set_locked_mem_ex_funcs +# undef CRYPTO_get_locked_mem_ex_functions +# define CRYPTO_get_locked_mem_ex_functions CRYPTO_get_locked_mem_ex_funcs + +/* Hack some long SSL/TLS names */ +# undef SSL_CTX_set_default_verify_paths +# define SSL_CTX_set_default_verify_paths SSL_CTX_set_def_verify_paths +# undef SSL_get_ex_data_X509_STORE_CTX_idx +# define SSL_get_ex_data_X509_STORE_CTX_idx SSL_get_ex_d_X509_STORE_CTX_idx +# undef SSL_add_file_cert_subjects_to_stack +# define SSL_add_file_cert_subjects_to_stack SSL_add_file_cert_subjs_to_stk +# undef SSL_add_dir_cert_subjects_to_stack +# define SSL_add_dir_cert_subjects_to_stack SSL_add_dir_cert_subjs_to_stk +# undef SSL_CTX_use_certificate_chain_file +# define SSL_CTX_use_certificate_chain_file SSL_CTX_use_cert_chain_file +# undef SSL_CTX_set_cert_verify_callback +# define SSL_CTX_set_cert_verify_callback SSL_CTX_set_cert_verify_cb +# undef SSL_CTX_set_default_passwd_cb_userdata +# define SSL_CTX_set_default_passwd_cb_userdata SSL_CTX_set_def_passwd_cb_ud +# undef SSL_COMP_get_compression_methods +# define SSL_COMP_get_compression_methods SSL_COMP_get_compress_methods +# undef SSL_COMP_set0_compression_methods +# define SSL_COMP_set0_compression_methods SSL_COMP_set0_compress_methods +# undef SSL_COMP_free_compression_methods +# define SSL_COMP_free_compression_methods SSL_COMP_free_compress_methods +# undef ssl_add_clienthello_renegotiate_ext +# define ssl_add_clienthello_renegotiate_ext ssl_add_clienthello_reneg_ext +# undef ssl_add_serverhello_renegotiate_ext +# define ssl_add_serverhello_renegotiate_ext ssl_add_serverhello_reneg_ext +# undef ssl_parse_clienthello_renegotiate_ext +# define ssl_parse_clienthello_renegotiate_ext ssl_parse_clienthello_reneg_ext +# undef ssl_parse_serverhello_renegotiate_ext +# define ssl_parse_serverhello_renegotiate_ext ssl_parse_serverhello_reneg_ext +# undef SSL_srp_server_param_with_username +# define SSL_srp_server_param_with_username SSL_srp_server_param_with_un +# undef SSL_CTX_set_srp_client_pwd_callback +# define SSL_CTX_set_srp_client_pwd_callback SSL_CTX_set_srp_client_pwd_cb +# undef SSL_CTX_set_srp_verify_param_callback +# define SSL_CTX_set_srp_verify_param_callback SSL_CTX_set_srp_vfy_param_cb +# undef SSL_CTX_set_srp_username_callback +# define SSL_CTX_set_srp_username_callback SSL_CTX_set_srp_un_cb +# undef ssl_add_clienthello_use_srtp_ext +# define ssl_add_clienthello_use_srtp_ext ssl_add_clihello_use_srtp_ext +# undef ssl_add_serverhello_use_srtp_ext +# define ssl_add_serverhello_use_srtp_ext ssl_add_serhello_use_srtp_ext +# undef ssl_parse_clienthello_use_srtp_ext +# define ssl_parse_clienthello_use_srtp_ext ssl_parse_clihello_use_srtp_ext +# undef ssl_parse_serverhello_use_srtp_ext +# define ssl_parse_serverhello_use_srtp_ext ssl_parse_serhello_use_srtp_ext +# undef SSL_CTX_set_next_protos_advertised_cb +# define SSL_CTX_set_next_protos_advertised_cb SSL_CTX_set_next_protos_adv_cb +# undef SSL_CTX_set_next_proto_select_cb +# define SSL_CTX_set_next_proto_select_cb SSL_CTX_set_next_proto_sel_cb + +# undef tls1_send_server_supplemental_data +# define tls1_send_server_supplemental_data tls1_send_server_suppl_data +# undef tls1_send_client_supplemental_data +# define tls1_send_client_supplemental_data tls1_send_client_suppl_data +# undef tls1_get_server_supplemental_data +# define tls1_get_server_supplemental_data tls1_get_server_suppl_data +# undef tls1_get_client_supplemental_data +# define tls1_get_client_supplemental_data tls1_get_client_suppl_data + +# undef ssl3_cbc_record_digest_supported +# define ssl3_cbc_record_digest_supported ssl3_cbc_record_digest_support +# undef ssl_check_clienthello_tlsext_late +# define ssl_check_clienthello_tlsext_late ssl_check_clihello_tlsext_late +# undef ssl_check_clienthello_tlsext_early +# define ssl_check_clienthello_tlsext_early ssl_check_clihello_tlsext_early + +/* Hack some RSA long names */ +# undef RSA_padding_check_PKCS1_OAEP_mgf1 +# define RSA_padding_check_PKCS1_OAEP_mgf1 RSA_pad_check_PKCS1_OAEP_mgf1 + +/* Hack some ENGINE long names */ +# undef ENGINE_get_default_BN_mod_exp_crt +# define ENGINE_get_default_BN_mod_exp_crt ENGINE_get_def_BN_mod_exp_crt +# undef ENGINE_set_default_BN_mod_exp_crt +# define ENGINE_set_default_BN_mod_exp_crt ENGINE_set_def_BN_mod_exp_crt +# undef ENGINE_set_load_privkey_function +# define ENGINE_set_load_privkey_function ENGINE_set_load_privkey_fn +# undef ENGINE_get_load_privkey_function +# define ENGINE_get_load_privkey_function ENGINE_get_load_privkey_fn +# undef ENGINE_unregister_pkey_asn1_meths +# define ENGINE_unregister_pkey_asn1_meths ENGINE_unreg_pkey_asn1_meths +# undef ENGINE_register_all_pkey_asn1_meths +# define ENGINE_register_all_pkey_asn1_meths ENGINE_reg_all_pkey_asn1_meths +# undef ENGINE_set_default_pkey_asn1_meths +# define ENGINE_set_default_pkey_asn1_meths ENGINE_set_def_pkey_asn1_meths +# undef ENGINE_get_pkey_asn1_meth_engine +# define ENGINE_get_pkey_asn1_meth_engine ENGINE_get_pkey_asn1_meth_eng +# undef ENGINE_set_load_ssl_client_cert_function +# define ENGINE_set_load_ssl_client_cert_function \ + ENGINE_set_ld_ssl_clnt_cert_fn +# undef ENGINE_get_ssl_client_cert_function +# define ENGINE_get_ssl_client_cert_function ENGINE_get_ssl_client_cert_fn + +/* Hack some long OCSP names */ +# undef OCSP_REQUEST_get_ext_by_critical +# define OCSP_REQUEST_get_ext_by_critical OCSP_REQUEST_get_ext_by_crit +# undef OCSP_BASICRESP_get_ext_by_critical +# define OCSP_BASICRESP_get_ext_by_critical OCSP_BASICRESP_get_ext_by_crit +# undef OCSP_SINGLERESP_get_ext_by_critical +# define OCSP_SINGLERESP_get_ext_by_critical OCSP_SINGLERESP_get_ext_by_crit + +/* Hack some long DES names */ +# undef _ossl_old_des_ede3_cfb64_encrypt +# define _ossl_old_des_ede3_cfb64_encrypt _ossl_odes_ede3_cfb64_encrypt +# undef _ossl_old_des_ede3_ofb64_encrypt +# define _ossl_old_des_ede3_ofb64_encrypt _ossl_odes_ede3_ofb64_encrypt + +/* Hack some long EVP names */ +# undef OPENSSL_add_all_algorithms_noconf +# define OPENSSL_add_all_algorithms_noconf OPENSSL_add_all_algo_noconf +# undef OPENSSL_add_all_algorithms_conf +# define OPENSSL_add_all_algorithms_conf OPENSSL_add_all_algo_conf +# undef EVP_PKEY_meth_set_verify_recover +# define EVP_PKEY_meth_set_verify_recover EVP_PKEY_meth_set_vrfy_recover + +/* Hack some long EC names */ +# undef EC_GROUP_set_point_conversion_form +# define EC_GROUP_set_point_conversion_form EC_GROUP_set_point_conv_form +# undef EC_GROUP_get_point_conversion_form +# define EC_GROUP_get_point_conversion_form EC_GROUP_get_point_conv_form +# undef EC_GROUP_clear_free_all_extra_data +# define EC_GROUP_clear_free_all_extra_data EC_GROUP_clr_free_all_xtra_data +# undef EC_KEY_set_public_key_affine_coordinates +# define EC_KEY_set_public_key_affine_coordinates \ + EC_KEY_set_pub_key_aff_coords +# undef EC_POINT_set_Jprojective_coordinates_GFp +# define EC_POINT_set_Jprojective_coordinates_GFp \ + EC_POINT_set_Jproj_coords_GFp +# undef EC_POINT_get_Jprojective_coordinates_GFp +# define EC_POINT_get_Jprojective_coordinates_GFp \ + EC_POINT_get_Jproj_coords_GFp +# undef EC_POINT_set_affine_coordinates_GFp +# define EC_POINT_set_affine_coordinates_GFp EC_POINT_set_affine_coords_GFp +# undef EC_POINT_get_affine_coordinates_GFp +# define EC_POINT_get_affine_coordinates_GFp EC_POINT_get_affine_coords_GFp +# undef EC_POINT_set_compressed_coordinates_GFp +# define EC_POINT_set_compressed_coordinates_GFp EC_POINT_set_compr_coords_GFp +# undef EC_POINT_set_affine_coordinates_GF2m +# define EC_POINT_set_affine_coordinates_GF2m EC_POINT_set_affine_coords_GF2m +# undef EC_POINT_get_affine_coordinates_GF2m +# define EC_POINT_get_affine_coordinates_GF2m EC_POINT_get_affine_coords_GF2m +# undef EC_POINT_set_compressed_coordinates_GF2m +# define EC_POINT_set_compressed_coordinates_GF2m \ + EC_POINT_set_compr_coords_GF2m +# undef ec_GF2m_simple_group_clear_finish +# define ec_GF2m_simple_group_clear_finish ec_GF2m_simple_grp_clr_finish +# undef ec_GF2m_simple_group_check_discriminant +# define ec_GF2m_simple_group_check_discriminant ec_GF2m_simple_grp_chk_discrim +# undef ec_GF2m_simple_point_clear_finish +# define ec_GF2m_simple_point_clear_finish ec_GF2m_simple_pt_clr_finish +# undef ec_GF2m_simple_point_set_to_infinity +# define ec_GF2m_simple_point_set_to_infinity ec_GF2m_simple_pt_set_to_inf +# undef ec_GF2m_simple_points_make_affine +# define ec_GF2m_simple_points_make_affine ec_GF2m_simple_pts_make_affine +# undef ec_GF2m_simple_point_set_affine_coordinates +# define ec_GF2m_simple_point_set_affine_coordinates \ + ec_GF2m_smp_pt_set_af_coords +# undef ec_GF2m_simple_point_get_affine_coordinates +# define ec_GF2m_simple_point_get_affine_coordinates \ + ec_GF2m_smp_pt_get_af_coords +# undef ec_GF2m_simple_set_compressed_coordinates +# define ec_GF2m_simple_set_compressed_coordinates \ + ec_GF2m_smp_set_compr_coords +# undef ec_GFp_simple_group_set_curve_GFp +# define ec_GFp_simple_group_set_curve_GFp ec_GFp_simple_grp_set_curve_GFp +# undef ec_GFp_simple_group_get_curve_GFp +# define ec_GFp_simple_group_get_curve_GFp ec_GFp_simple_grp_get_curve_GFp +# undef ec_GFp_simple_group_clear_finish +# define ec_GFp_simple_group_clear_finish ec_GFp_simple_grp_clear_finish +# undef ec_GFp_simple_group_set_generator +# define ec_GFp_simple_group_set_generator ec_GFp_simple_grp_set_generator +# undef ec_GFp_simple_group_get0_generator +# define ec_GFp_simple_group_get0_generator ec_GFp_simple_grp_gt0_generator +# undef ec_GFp_simple_group_get_cofactor +# define ec_GFp_simple_group_get_cofactor ec_GFp_simple_grp_get_cofactor +# undef ec_GFp_simple_point_clear_finish +# define ec_GFp_simple_point_clear_finish ec_GFp_simple_pt_clear_finish +# undef ec_GFp_simple_point_set_to_infinity +# define ec_GFp_simple_point_set_to_infinity ec_GFp_simple_pt_set_to_inf +# undef ec_GFp_simple_points_make_affine +# define ec_GFp_simple_points_make_affine ec_GFp_simple_pts_make_affine +# undef ec_GFp_simple_set_Jprojective_coordinates_GFp +# define ec_GFp_simple_set_Jprojective_coordinates_GFp \ + ec_GFp_smp_set_Jproj_coords_GFp +# undef ec_GFp_simple_get_Jprojective_coordinates_GFp +# define ec_GFp_simple_get_Jprojective_coordinates_GFp \ + ec_GFp_smp_get_Jproj_coords_GFp +# undef ec_GFp_simple_point_set_affine_coordinates_GFp +# define ec_GFp_simple_point_set_affine_coordinates_GFp \ + ec_GFp_smp_pt_set_af_coords_GFp +# undef ec_GFp_simple_point_get_affine_coordinates_GFp +# define ec_GFp_simple_point_get_affine_coordinates_GFp \ + ec_GFp_smp_pt_get_af_coords_GFp +# undef ec_GFp_simple_set_compressed_coordinates_GFp +# define ec_GFp_simple_set_compressed_coordinates_GFp \ + ec_GFp_smp_set_compr_coords_GFp +# undef ec_GFp_simple_point_set_affine_coordinates +# define ec_GFp_simple_point_set_affine_coordinates \ + ec_GFp_smp_pt_set_af_coords +# undef ec_GFp_simple_point_get_affine_coordinates +# define ec_GFp_simple_point_get_affine_coordinates \ + ec_GFp_smp_pt_get_af_coords +# undef ec_GFp_simple_set_compressed_coordinates +# define ec_GFp_simple_set_compressed_coordinates \ + ec_GFp_smp_set_compr_coords +# undef ec_GFp_simple_group_check_discriminant +# define ec_GFp_simple_group_check_discriminant ec_GFp_simple_grp_chk_discrim + +/* Hack som long STORE names */ +# undef STORE_method_set_initialise_function +# define STORE_method_set_initialise_function STORE_meth_set_initialise_fn +# undef STORE_method_set_cleanup_function +# define STORE_method_set_cleanup_function STORE_meth_set_cleanup_fn +# undef STORE_method_set_generate_function +# define STORE_method_set_generate_function STORE_meth_set_generate_fn +# undef STORE_method_set_modify_function +# define STORE_method_set_modify_function STORE_meth_set_modify_fn +# undef STORE_method_set_revoke_function +# define STORE_method_set_revoke_function STORE_meth_set_revoke_fn +# undef STORE_method_set_delete_function +# define STORE_method_set_delete_function STORE_meth_set_delete_fn +# undef STORE_method_set_list_start_function +# define STORE_method_set_list_start_function STORE_meth_set_list_start_fn +# undef STORE_method_set_list_next_function +# define STORE_method_set_list_next_function STORE_meth_set_list_next_fn +# undef STORE_method_set_list_end_function +# define STORE_method_set_list_end_function STORE_meth_set_list_end_fn +# undef STORE_method_set_update_store_function +# define STORE_method_set_update_store_function STORE_meth_set_update_store_fn +# undef STORE_method_set_lock_store_function +# define STORE_method_set_lock_store_function STORE_meth_set_lock_store_fn +# undef STORE_method_set_unlock_store_function +# define STORE_method_set_unlock_store_function STORE_meth_set_unlock_store_fn +# undef STORE_method_get_initialise_function +# define STORE_method_get_initialise_function STORE_meth_get_initialise_fn +# undef STORE_method_get_cleanup_function +# define STORE_method_get_cleanup_function STORE_meth_get_cleanup_fn +# undef STORE_method_get_generate_function +# define STORE_method_get_generate_function STORE_meth_get_generate_fn +# undef STORE_method_get_modify_function +# define STORE_method_get_modify_function STORE_meth_get_modify_fn +# undef STORE_method_get_revoke_function +# define STORE_method_get_revoke_function STORE_meth_get_revoke_fn +# undef STORE_method_get_delete_function +# define STORE_method_get_delete_function STORE_meth_get_delete_fn +# undef STORE_method_get_list_start_function +# define STORE_method_get_list_start_function STORE_meth_get_list_start_fn +# undef STORE_method_get_list_next_function +# define STORE_method_get_list_next_function STORE_meth_get_list_next_fn +# undef STORE_method_get_list_end_function +# define STORE_method_get_list_end_function STORE_meth_get_list_end_fn +# undef STORE_method_get_update_store_function +# define STORE_method_get_update_store_function STORE_meth_get_update_store_fn +# undef STORE_method_get_lock_store_function +# define STORE_method_get_lock_store_function STORE_meth_get_lock_store_fn +# undef STORE_method_get_unlock_store_function +# define STORE_method_get_unlock_store_function STORE_meth_get_unlock_store_fn + +/* Hack some long TS names */ +# undef TS_RESP_CTX_set_status_info_cond +# define TS_RESP_CTX_set_status_info_cond TS_RESP_CTX_set_stat_info_cond +# undef TS_RESP_CTX_set_clock_precision_digits +# define TS_RESP_CTX_set_clock_precision_digits TS_RESP_CTX_set_clk_prec_digits +# undef TS_CONF_set_clock_precision_digits +# define TS_CONF_set_clock_precision_digits TS_CONF_set_clk_prec_digits + +/* Hack some long CMS names */ +# undef CMS_RecipientInfo_ktri_get0_algs +# define CMS_RecipientInfo_ktri_get0_algs CMS_RecipInfo_ktri_get0_algs +# undef CMS_RecipientInfo_ktri_get0_signer_id +# define CMS_RecipientInfo_ktri_get0_signer_id CMS_RecipInfo_ktri_get0_sigr_id +# undef CMS_OtherRevocationInfoFormat_it +# define CMS_OtherRevocationInfoFormat_it CMS_OtherRevocInfoFormat_it +# undef CMS_KeyAgreeRecipientIdentifier_it +# define CMS_KeyAgreeRecipientIdentifier_it CMS_KeyAgreeRecipIdentifier_it +# undef CMS_OriginatorIdentifierOrKey_it +# define CMS_OriginatorIdentifierOrKey_it CMS_OriginatorIdOrKey_it +# undef cms_SignerIdentifier_get0_signer_id +# define cms_SignerIdentifier_get0_signer_id cms_SignerId_get0_signer_id +# undef CMS_RecipientInfo_kari_get0_orig_id +# define CMS_RecipientInfo_kari_get0_orig_id CMS_RecipInfo_kari_get0_orig_id +# undef CMS_RecipientInfo_kari_get0_reks +# define CMS_RecipientInfo_kari_get0_reks CMS_RecipInfo_kari_get0_reks +# undef CMS_RecipientEncryptedKey_cert_cmp +# define CMS_RecipientEncryptedKey_cert_cmp CMS_RecipEncryptedKey_cert_cmp +# undef CMS_RecipientInfo_kari_set0_pkey +# define CMS_RecipientInfo_kari_set0_pkey CMS_RecipInfo_kari_set0_pkey +# undef CMS_RecipientEncryptedKey_get0_id +# define CMS_RecipientEncryptedKey_get0_id CMS_RecipEncryptedKey_get0_id +# undef CMS_RecipientInfo_kari_orig_id_cmp +# define CMS_RecipientInfo_kari_orig_id_cmp CMS_RecipInfo_kari_orig_id_cmp + +/* Hack some long DTLS1 names */ +# undef dtls1_retransmit_buffered_messages +# define dtls1_retransmit_buffered_messages dtls1_retransmit_buffered_msgs + +/* Hack some long SRP names */ +# undef SRP_generate_server_master_secret +# define SRP_generate_server_master_secret SRP_gen_server_master_secret +# undef SRP_generate_client_master_secret +# define SRP_generate_client_master_secret SRP_gen_client_master_secret + +/* Hack some long UI names */ +# undef UI_method_get_prompt_constructor +# define UI_method_get_prompt_constructor UI_method_get_prompt_constructr +# undef UI_method_set_prompt_constructor +# define UI_method_set_prompt_constructor UI_method_set_prompt_constructr + +# endif /* defined OPENSSL_SYS_VMS */ + +/* Case insensitive linking causes problems.... */ +# if defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_OS2) +# undef ERR_load_CRYPTO_strings +# define ERR_load_CRYPTO_strings ERR_load_CRYPTOlib_strings +# undef OCSP_crlID_new +# define OCSP_crlID_new OCSP_crlID2_new + +# undef d2i_ECPARAMETERS +# define d2i_ECPARAMETERS d2i_UC_ECPARAMETERS +# undef i2d_ECPARAMETERS +# define i2d_ECPARAMETERS i2d_UC_ECPARAMETERS +# undef d2i_ECPKPARAMETERS +# define d2i_ECPKPARAMETERS d2i_UC_ECPKPARAMETERS +# undef i2d_ECPKPARAMETERS +# define i2d_ECPKPARAMETERS i2d_UC_ECPKPARAMETERS + +/* + * These functions do not seem to exist! However, I'm paranoid... Original + * command in x509v3.h: These functions are being redefined in another + * directory, and clash when the linker is case-insensitive, so let's hide + * them a little, by giving them an extra 'o' at the beginning of the name... + */ +# undef X509v3_cleanup_extensions +# define X509v3_cleanup_extensions oX509v3_cleanup_extensions +# undef X509v3_add_extension +# define X509v3_add_extension oX509v3_add_extension +# undef X509v3_add_netscape_extensions +# define X509v3_add_netscape_extensions oX509v3_add_netscape_extensions +# undef X509v3_add_standard_extensions +# define X509v3_add_standard_extensions oX509v3_add_standard_extensions + +/* This one clashes with CMS_data_create */ +# undef cms_Data_create +# define cms_Data_create priv_cms_Data_create + +# endif + +#endif /* ! defined HEADER_VMS_IDHACKS_H */ diff --git a/hdssd/external/win/openssl/include/openssl/tls1.h b/hdssd/external/win/openssl/include/openssl/tls1.h new file mode 100644 index 0000000..7e237d0 --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/tls1.h @@ -0,0 +1,810 @@ +/* ssl/tls1.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ +/* ==================================================================== + * Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * + * Portions of the attached software ("Contribution") are developed by + * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project. + * + * The Contribution is licensed pursuant to the OpenSSL open source + * license provided above. + * + * ECC cipher suite support in OpenSSL originally written by + * Vipul Gupta and Sumit Gupta of Sun Microsystems Laboratories. + * + */ +/* ==================================================================== + * Copyright 2005 Nokia. All rights reserved. + * + * The portions of the attached software ("Contribution") is developed by + * Nokia Corporation and is licensed pursuant to the OpenSSL open source + * license. + * + * The Contribution, originally written by Mika Kousa and Pasi Eronen of + * Nokia Corporation, consists of the "PSK" (Pre-Shared Key) ciphersuites + * support (see RFC 4279) to OpenSSL. + * + * No patent licenses or other rights except those expressly stated in + * the OpenSSL open source license shall be deemed granted or received + * expressly, by implication, estoppel, or otherwise. + * + * No assurances are provided by Nokia that the Contribution does not + * infringe the patent or other intellectual property rights of any third + * party or that the license provides you with all the necessary rights + * to make use of the Contribution. + * + * THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. IN + * ADDITION TO THE DISCLAIMERS INCLUDED IN THE LICENSE, NOKIA + * SPECIFICALLY DISCLAIMS ANY LIABILITY FOR CLAIMS BROUGHT BY YOU OR ANY + * OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS OR + * OTHERWISE. + */ + +#ifndef HEADER_TLS1_H +# define HEADER_TLS1_H + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES 0 + +# define TLS1_VERSION 0x0301 +# define TLS1_1_VERSION 0x0302 +# define TLS1_2_VERSION 0x0303 +# define TLS_MAX_VERSION TLS1_2_VERSION + +# define TLS1_VERSION_MAJOR 0x03 +# define TLS1_VERSION_MINOR 0x01 + +# define TLS1_1_VERSION_MAJOR 0x03 +# define TLS1_1_VERSION_MINOR 0x02 + +# define TLS1_2_VERSION_MAJOR 0x03 +# define TLS1_2_VERSION_MINOR 0x03 + +# define TLS1_get_version(s) \ + ((s->version >> 8) == TLS1_VERSION_MAJOR ? s->version : 0) + +# define TLS1_get_client_version(s) \ + ((s->client_version >> 8) == TLS1_VERSION_MAJOR ? s->client_version : 0) + +# define TLS1_AD_DECRYPTION_FAILED 21 +# define TLS1_AD_RECORD_OVERFLOW 22 +# define TLS1_AD_UNKNOWN_CA 48/* fatal */ +# define TLS1_AD_ACCESS_DENIED 49/* fatal */ +# define TLS1_AD_DECODE_ERROR 50/* fatal */ +# define TLS1_AD_DECRYPT_ERROR 51 +# define TLS1_AD_EXPORT_RESTRICTION 60/* fatal */ +# define TLS1_AD_PROTOCOL_VERSION 70/* fatal */ +# define TLS1_AD_INSUFFICIENT_SECURITY 71/* fatal */ +# define TLS1_AD_INTERNAL_ERROR 80/* fatal */ +# define TLS1_AD_INAPPROPRIATE_FALLBACK 86/* fatal */ +# define TLS1_AD_USER_CANCELLED 90 +# define TLS1_AD_NO_RENEGOTIATION 100 +/* codes 110-114 are from RFC3546 */ +# define TLS1_AD_UNSUPPORTED_EXTENSION 110 +# define TLS1_AD_CERTIFICATE_UNOBTAINABLE 111 +# define TLS1_AD_UNRECOGNIZED_NAME 112 +# define TLS1_AD_BAD_CERTIFICATE_STATUS_RESPONSE 113 +# define TLS1_AD_BAD_CERTIFICATE_HASH_VALUE 114 +# define TLS1_AD_UNKNOWN_PSK_IDENTITY 115/* fatal */ + +/* ExtensionType values from RFC3546 / RFC4366 / RFC6066 */ +# define TLSEXT_TYPE_server_name 0 +# define TLSEXT_TYPE_max_fragment_length 1 +# define TLSEXT_TYPE_client_certificate_url 2 +# define TLSEXT_TYPE_trusted_ca_keys 3 +# define TLSEXT_TYPE_truncated_hmac 4 +# define TLSEXT_TYPE_status_request 5 +/* ExtensionType values from RFC4681 */ +# define TLSEXT_TYPE_user_mapping 6 +/* ExtensionType values from RFC5878 */ +# define TLSEXT_TYPE_client_authz 7 +# define TLSEXT_TYPE_server_authz 8 +/* ExtensionType values from RFC6091 */ +# define TLSEXT_TYPE_cert_type 9 + +/* ExtensionType values from RFC4492 */ +# define TLSEXT_TYPE_elliptic_curves 10 +# define TLSEXT_TYPE_ec_point_formats 11 + +/* ExtensionType value from RFC5054 */ +# define TLSEXT_TYPE_srp 12 + +/* ExtensionType values from RFC5246 */ +# define TLSEXT_TYPE_signature_algorithms 13 + +/* ExtensionType value from RFC5764 */ +# define TLSEXT_TYPE_use_srtp 14 + +/* ExtensionType value from RFC5620 */ +# define TLSEXT_TYPE_heartbeat 15 + +/* ExtensionType value from RFC7301 */ +# define TLSEXT_TYPE_application_layer_protocol_negotiation 16 + +/* + * ExtensionType value for TLS padding extension. + * http://tools.ietf.org/html/draft-agl-tls-padding + */ +# define TLSEXT_TYPE_padding 21 + +/* ExtensionType value from RFC4507 */ +# define TLSEXT_TYPE_session_ticket 35 + +/* ExtensionType value from draft-rescorla-tls-opaque-prf-input-00.txt */ +# if 0 +/* + * will have to be provided externally for now , + * i.e. build with -DTLSEXT_TYPE_opaque_prf_input=38183 + * using whatever extension number you'd like to try + */ +# define TLSEXT_TYPE_opaque_prf_input ?? +# endif + +/* Temporary extension type */ +# define TLSEXT_TYPE_renegotiate 0xff01 + +# ifndef OPENSSL_NO_NEXTPROTONEG +/* This is not an IANA defined extension number */ +# define TLSEXT_TYPE_next_proto_neg 13172 +# endif + +/* NameType value from RFC3546 */ +# define TLSEXT_NAMETYPE_host_name 0 +/* status request value from RFC3546 */ +# define TLSEXT_STATUSTYPE_ocsp 1 + +/* ECPointFormat values from RFC4492 */ +# define TLSEXT_ECPOINTFORMAT_first 0 +# define TLSEXT_ECPOINTFORMAT_uncompressed 0 +# define TLSEXT_ECPOINTFORMAT_ansiX962_compressed_prime 1 +# define TLSEXT_ECPOINTFORMAT_ansiX962_compressed_char2 2 +# define TLSEXT_ECPOINTFORMAT_last 2 + +/* Signature and hash algorithms from RFC5246 */ +# define TLSEXT_signature_anonymous 0 +# define TLSEXT_signature_rsa 1 +# define TLSEXT_signature_dsa 2 +# define TLSEXT_signature_ecdsa 3 + +/* Total number of different signature algorithms */ +# define TLSEXT_signature_num 4 + +# define TLSEXT_hash_none 0 +# define TLSEXT_hash_md5 1 +# define TLSEXT_hash_sha1 2 +# define TLSEXT_hash_sha224 3 +# define TLSEXT_hash_sha256 4 +# define TLSEXT_hash_sha384 5 +# define TLSEXT_hash_sha512 6 + +/* Total number of different digest algorithms */ + +# define TLSEXT_hash_num 7 + +/* Flag set for unrecognised algorithms */ +# define TLSEXT_nid_unknown 0x1000000 + +/* ECC curves */ + +# define TLSEXT_curve_P_256 23 +# define TLSEXT_curve_P_384 24 + +# ifndef OPENSSL_NO_TLSEXT + +# define TLSEXT_MAXLEN_host_name 255 + +const char *SSL_get_servername(const SSL *s, const int type); +int SSL_get_servername_type(const SSL *s); +/* + * SSL_export_keying_material exports a value derived from the master secret, + * as specified in RFC 5705. It writes |olen| bytes to |out| given a label and + * optional context. (Since a zero length context is allowed, the |use_context| + * flag controls whether a context is included.) It returns 1 on success and + * zero otherwise. + */ +int SSL_export_keying_material(SSL *s, unsigned char *out, size_t olen, + const char *label, size_t llen, + const unsigned char *p, size_t plen, + int use_context); + +int SSL_get_sigalgs(SSL *s, int idx, + int *psign, int *phash, int *psignandhash, + unsigned char *rsig, unsigned char *rhash); + +int SSL_get_shared_sigalgs(SSL *s, int idx, + int *psign, int *phash, int *psignandhash, + unsigned char *rsig, unsigned char *rhash); + +int SSL_check_chain(SSL *s, X509 *x, EVP_PKEY *pk, STACK_OF(X509) *chain); + +# define SSL_set_tlsext_host_name(s,name) \ +SSL_ctrl(s,SSL_CTRL_SET_TLSEXT_HOSTNAME,TLSEXT_NAMETYPE_host_name,(char *)name) + +# define SSL_set_tlsext_debug_callback(ssl, cb) \ +SSL_callback_ctrl(ssl,SSL_CTRL_SET_TLSEXT_DEBUG_CB,(void (*)(void))cb) + +# define SSL_set_tlsext_debug_arg(ssl, arg) \ +SSL_ctrl(ssl,SSL_CTRL_SET_TLSEXT_DEBUG_ARG,0, (void *)arg) + +# define SSL_set_tlsext_status_type(ssl, type) \ +SSL_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_TYPE,type, NULL) + +# define SSL_get_tlsext_status_exts(ssl, arg) \ +SSL_ctrl(ssl,SSL_CTRL_GET_TLSEXT_STATUS_REQ_EXTS,0, (void *)arg) + +# define SSL_set_tlsext_status_exts(ssl, arg) \ +SSL_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_EXTS,0, (void *)arg) + +# define SSL_get_tlsext_status_ids(ssl, arg) \ +SSL_ctrl(ssl,SSL_CTRL_GET_TLSEXT_STATUS_REQ_IDS,0, (void *)arg) + +# define SSL_set_tlsext_status_ids(ssl, arg) \ +SSL_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_IDS,0, (void *)arg) + +# define SSL_get_tlsext_status_ocsp_resp(ssl, arg) \ +SSL_ctrl(ssl,SSL_CTRL_GET_TLSEXT_STATUS_REQ_OCSP_RESP,0, (void *)arg) + +# define SSL_set_tlsext_status_ocsp_resp(ssl, arg, arglen) \ +SSL_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_OCSP_RESP,arglen, (void *)arg) + +# define SSL_CTX_set_tlsext_servername_callback(ctx, cb) \ +SSL_CTX_callback_ctrl(ctx,SSL_CTRL_SET_TLSEXT_SERVERNAME_CB,(void (*)(void))cb) + +# define SSL_TLSEXT_ERR_OK 0 +# define SSL_TLSEXT_ERR_ALERT_WARNING 1 +# define SSL_TLSEXT_ERR_ALERT_FATAL 2 +# define SSL_TLSEXT_ERR_NOACK 3 + +# define SSL_CTX_set_tlsext_servername_arg(ctx, arg) \ +SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TLSEXT_SERVERNAME_ARG,0, (void *)arg) + +# define SSL_CTX_get_tlsext_ticket_keys(ctx, keys, keylen) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_GET_TLSEXT_TICKET_KEYS,(keylen),(keys)) +# define SSL_CTX_set_tlsext_ticket_keys(ctx, keys, keylen) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_SET_TLSEXT_TICKET_KEYS,(keylen),(keys)) + +# define SSL_CTX_set_tlsext_status_cb(ssl, cb) \ +SSL_CTX_callback_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB,(void (*)(void))cb) + +# define SSL_CTX_set_tlsext_status_arg(ssl, arg) \ +SSL_CTX_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB_ARG,0, (void *)arg) + +# define SSL_set_tlsext_opaque_prf_input(s, src, len) \ +SSL_ctrl(s,SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT, len, src) +# define SSL_CTX_set_tlsext_opaque_prf_input_callback(ctx, cb) \ +SSL_CTX_callback_ctrl(ctx,SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT_CB, (void (*)(void))cb) +# define SSL_CTX_set_tlsext_opaque_prf_input_callback_arg(ctx, arg) \ +SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT_CB_ARG, 0, arg) + +# define SSL_CTX_set_tlsext_ticket_key_cb(ssl, cb) \ +SSL_CTX_callback_ctrl(ssl,SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB,(void (*)(void))cb) + +# ifndef OPENSSL_NO_HEARTBEATS +# define SSL_TLSEXT_HB_ENABLED 0x01 +# define SSL_TLSEXT_HB_DONT_SEND_REQUESTS 0x02 +# define SSL_TLSEXT_HB_DONT_RECV_REQUESTS 0x04 + +# define SSL_get_tlsext_heartbeat_pending(ssl) \ + SSL_ctrl((ssl),SSL_CTRL_GET_TLS_EXT_HEARTBEAT_PENDING,0,NULL) +# define SSL_set_tlsext_heartbeat_no_requests(ssl, arg) \ + SSL_ctrl((ssl),SSL_CTRL_SET_TLS_EXT_HEARTBEAT_NO_REQUESTS,arg,NULL) +# endif +# endif + +/* PSK ciphersuites from 4279 */ +# define TLS1_CK_PSK_WITH_RC4_128_SHA 0x0300008A +# define TLS1_CK_PSK_WITH_3DES_EDE_CBC_SHA 0x0300008B +# define TLS1_CK_PSK_WITH_AES_128_CBC_SHA 0x0300008C +# define TLS1_CK_PSK_WITH_AES_256_CBC_SHA 0x0300008D + +/* + * Additional TLS ciphersuites from expired Internet Draft + * draft-ietf-tls-56-bit-ciphersuites-01.txt (available if + * TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES is defined, see s3_lib.c). We + * actually treat them like SSL 3.0 ciphers, which we probably shouldn't. + * Note that the first two are actually not in the IDs. + */ +# define TLS1_CK_RSA_EXPORT1024_WITH_RC4_56_MD5 0x03000060/* not in + * ID */ +# define TLS1_CK_RSA_EXPORT1024_WITH_RC2_CBC_56_MD5 0x03000061/* not in + * ID */ +# define TLS1_CK_RSA_EXPORT1024_WITH_DES_CBC_SHA 0x03000062 +# define TLS1_CK_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA 0x03000063 +# define TLS1_CK_RSA_EXPORT1024_WITH_RC4_56_SHA 0x03000064 +# define TLS1_CK_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA 0x03000065 +# define TLS1_CK_DHE_DSS_WITH_RC4_128_SHA 0x03000066 + +/* AES ciphersuites from RFC3268 */ +# define TLS1_CK_RSA_WITH_AES_128_SHA 0x0300002F +# define TLS1_CK_DH_DSS_WITH_AES_128_SHA 0x03000030 +# define TLS1_CK_DH_RSA_WITH_AES_128_SHA 0x03000031 +# define TLS1_CK_DHE_DSS_WITH_AES_128_SHA 0x03000032 +# define TLS1_CK_DHE_RSA_WITH_AES_128_SHA 0x03000033 +# define TLS1_CK_ADH_WITH_AES_128_SHA 0x03000034 + +# define TLS1_CK_RSA_WITH_AES_256_SHA 0x03000035 +# define TLS1_CK_DH_DSS_WITH_AES_256_SHA 0x03000036 +# define TLS1_CK_DH_RSA_WITH_AES_256_SHA 0x03000037 +# define TLS1_CK_DHE_DSS_WITH_AES_256_SHA 0x03000038 +# define TLS1_CK_DHE_RSA_WITH_AES_256_SHA 0x03000039 +# define TLS1_CK_ADH_WITH_AES_256_SHA 0x0300003A + +/* TLS v1.2 ciphersuites */ +# define TLS1_CK_RSA_WITH_NULL_SHA256 0x0300003B +# define TLS1_CK_RSA_WITH_AES_128_SHA256 0x0300003C +# define TLS1_CK_RSA_WITH_AES_256_SHA256 0x0300003D +# define TLS1_CK_DH_DSS_WITH_AES_128_SHA256 0x0300003E +# define TLS1_CK_DH_RSA_WITH_AES_128_SHA256 0x0300003F +# define TLS1_CK_DHE_DSS_WITH_AES_128_SHA256 0x03000040 + +/* Camellia ciphersuites from RFC4132 */ +# define TLS1_CK_RSA_WITH_CAMELLIA_128_CBC_SHA 0x03000041 +# define TLS1_CK_DH_DSS_WITH_CAMELLIA_128_CBC_SHA 0x03000042 +# define TLS1_CK_DH_RSA_WITH_CAMELLIA_128_CBC_SHA 0x03000043 +# define TLS1_CK_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA 0x03000044 +# define TLS1_CK_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA 0x03000045 +# define TLS1_CK_ADH_WITH_CAMELLIA_128_CBC_SHA 0x03000046 + +/* TLS v1.2 ciphersuites */ +# define TLS1_CK_DHE_RSA_WITH_AES_128_SHA256 0x03000067 +# define TLS1_CK_DH_DSS_WITH_AES_256_SHA256 0x03000068 +# define TLS1_CK_DH_RSA_WITH_AES_256_SHA256 0x03000069 +# define TLS1_CK_DHE_DSS_WITH_AES_256_SHA256 0x0300006A +# define TLS1_CK_DHE_RSA_WITH_AES_256_SHA256 0x0300006B +# define TLS1_CK_ADH_WITH_AES_128_SHA256 0x0300006C +# define TLS1_CK_ADH_WITH_AES_256_SHA256 0x0300006D + +/* Camellia ciphersuites from RFC4132 */ +# define TLS1_CK_RSA_WITH_CAMELLIA_256_CBC_SHA 0x03000084 +# define TLS1_CK_DH_DSS_WITH_CAMELLIA_256_CBC_SHA 0x03000085 +# define TLS1_CK_DH_RSA_WITH_CAMELLIA_256_CBC_SHA 0x03000086 +# define TLS1_CK_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA 0x03000087 +# define TLS1_CK_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA 0x03000088 +# define TLS1_CK_ADH_WITH_CAMELLIA_256_CBC_SHA 0x03000089 + +/* SEED ciphersuites from RFC4162 */ +# define TLS1_CK_RSA_WITH_SEED_SHA 0x03000096 +# define TLS1_CK_DH_DSS_WITH_SEED_SHA 0x03000097 +# define TLS1_CK_DH_RSA_WITH_SEED_SHA 0x03000098 +# define TLS1_CK_DHE_DSS_WITH_SEED_SHA 0x03000099 +# define TLS1_CK_DHE_RSA_WITH_SEED_SHA 0x0300009A +# define TLS1_CK_ADH_WITH_SEED_SHA 0x0300009B + +/* TLS v1.2 GCM ciphersuites from RFC5288 */ +# define TLS1_CK_RSA_WITH_AES_128_GCM_SHA256 0x0300009C +# define TLS1_CK_RSA_WITH_AES_256_GCM_SHA384 0x0300009D +# define TLS1_CK_DHE_RSA_WITH_AES_128_GCM_SHA256 0x0300009E +# define TLS1_CK_DHE_RSA_WITH_AES_256_GCM_SHA384 0x0300009F +# define TLS1_CK_DH_RSA_WITH_AES_128_GCM_SHA256 0x030000A0 +# define TLS1_CK_DH_RSA_WITH_AES_256_GCM_SHA384 0x030000A1 +# define TLS1_CK_DHE_DSS_WITH_AES_128_GCM_SHA256 0x030000A2 +# define TLS1_CK_DHE_DSS_WITH_AES_256_GCM_SHA384 0x030000A3 +# define TLS1_CK_DH_DSS_WITH_AES_128_GCM_SHA256 0x030000A4 +# define TLS1_CK_DH_DSS_WITH_AES_256_GCM_SHA384 0x030000A5 +# define TLS1_CK_ADH_WITH_AES_128_GCM_SHA256 0x030000A6 +# define TLS1_CK_ADH_WITH_AES_256_GCM_SHA384 0x030000A7 + +/* + * ECC ciphersuites from draft-ietf-tls-ecc-12.txt with changes soon to be in + * draft 13 + */ +# define TLS1_CK_ECDH_ECDSA_WITH_NULL_SHA 0x0300C001 +# define TLS1_CK_ECDH_ECDSA_WITH_RC4_128_SHA 0x0300C002 +# define TLS1_CK_ECDH_ECDSA_WITH_DES_192_CBC3_SHA 0x0300C003 +# define TLS1_CK_ECDH_ECDSA_WITH_AES_128_CBC_SHA 0x0300C004 +# define TLS1_CK_ECDH_ECDSA_WITH_AES_256_CBC_SHA 0x0300C005 + +# define TLS1_CK_ECDHE_ECDSA_WITH_NULL_SHA 0x0300C006 +# define TLS1_CK_ECDHE_ECDSA_WITH_RC4_128_SHA 0x0300C007 +# define TLS1_CK_ECDHE_ECDSA_WITH_DES_192_CBC3_SHA 0x0300C008 +# define TLS1_CK_ECDHE_ECDSA_WITH_AES_128_CBC_SHA 0x0300C009 +# define TLS1_CK_ECDHE_ECDSA_WITH_AES_256_CBC_SHA 0x0300C00A + +# define TLS1_CK_ECDH_RSA_WITH_NULL_SHA 0x0300C00B +# define TLS1_CK_ECDH_RSA_WITH_RC4_128_SHA 0x0300C00C +# define TLS1_CK_ECDH_RSA_WITH_DES_192_CBC3_SHA 0x0300C00D +# define TLS1_CK_ECDH_RSA_WITH_AES_128_CBC_SHA 0x0300C00E +# define TLS1_CK_ECDH_RSA_WITH_AES_256_CBC_SHA 0x0300C00F + +# define TLS1_CK_ECDHE_RSA_WITH_NULL_SHA 0x0300C010 +# define TLS1_CK_ECDHE_RSA_WITH_RC4_128_SHA 0x0300C011 +# define TLS1_CK_ECDHE_RSA_WITH_DES_192_CBC3_SHA 0x0300C012 +# define TLS1_CK_ECDHE_RSA_WITH_AES_128_CBC_SHA 0x0300C013 +# define TLS1_CK_ECDHE_RSA_WITH_AES_256_CBC_SHA 0x0300C014 + +# define TLS1_CK_ECDH_anon_WITH_NULL_SHA 0x0300C015 +# define TLS1_CK_ECDH_anon_WITH_RC4_128_SHA 0x0300C016 +# define TLS1_CK_ECDH_anon_WITH_DES_192_CBC3_SHA 0x0300C017 +# define TLS1_CK_ECDH_anon_WITH_AES_128_CBC_SHA 0x0300C018 +# define TLS1_CK_ECDH_anon_WITH_AES_256_CBC_SHA 0x0300C019 + +/* SRP ciphersuites from RFC 5054 */ +# define TLS1_CK_SRP_SHA_WITH_3DES_EDE_CBC_SHA 0x0300C01A +# define TLS1_CK_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA 0x0300C01B +# define TLS1_CK_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA 0x0300C01C +# define TLS1_CK_SRP_SHA_WITH_AES_128_CBC_SHA 0x0300C01D +# define TLS1_CK_SRP_SHA_RSA_WITH_AES_128_CBC_SHA 0x0300C01E +# define TLS1_CK_SRP_SHA_DSS_WITH_AES_128_CBC_SHA 0x0300C01F +# define TLS1_CK_SRP_SHA_WITH_AES_256_CBC_SHA 0x0300C020 +# define TLS1_CK_SRP_SHA_RSA_WITH_AES_256_CBC_SHA 0x0300C021 +# define TLS1_CK_SRP_SHA_DSS_WITH_AES_256_CBC_SHA 0x0300C022 + +/* ECDH HMAC based ciphersuites from RFC5289 */ + +# define TLS1_CK_ECDHE_ECDSA_WITH_AES_128_SHA256 0x0300C023 +# define TLS1_CK_ECDHE_ECDSA_WITH_AES_256_SHA384 0x0300C024 +# define TLS1_CK_ECDH_ECDSA_WITH_AES_128_SHA256 0x0300C025 +# define TLS1_CK_ECDH_ECDSA_WITH_AES_256_SHA384 0x0300C026 +# define TLS1_CK_ECDHE_RSA_WITH_AES_128_SHA256 0x0300C027 +# define TLS1_CK_ECDHE_RSA_WITH_AES_256_SHA384 0x0300C028 +# define TLS1_CK_ECDH_RSA_WITH_AES_128_SHA256 0x0300C029 +# define TLS1_CK_ECDH_RSA_WITH_AES_256_SHA384 0x0300C02A + +/* ECDH GCM based ciphersuites from RFC5289 */ +# define TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 0x0300C02B +# define TLS1_CK_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 0x0300C02C +# define TLS1_CK_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 0x0300C02D +# define TLS1_CK_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 0x0300C02E +# define TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256 0x0300C02F +# define TLS1_CK_ECDHE_RSA_WITH_AES_256_GCM_SHA384 0x0300C030 +# define TLS1_CK_ECDH_RSA_WITH_AES_128_GCM_SHA256 0x0300C031 +# define TLS1_CK_ECDH_RSA_WITH_AES_256_GCM_SHA384 0x0300C032 + +/* + * XXX * Backward compatibility alert: + * Older versions of OpenSSL gave + * some DHE ciphers names with "EDH" + * instead of "DHE". Going forward, we + * should be using DHE + * everywhere, though we may indefinitely maintain + * aliases for users + * or configurations that used "EDH" + + */ +# define TLS1_TXT_RSA_EXPORT1024_WITH_RC4_56_MD5 "EXP1024-RC4-MD5" +# define TLS1_TXT_RSA_EXPORT1024_WITH_RC2_CBC_56_MD5 "EXP1024-RC2-CBC-MD5" +# define TLS1_TXT_RSA_EXPORT1024_WITH_DES_CBC_SHA "EXP1024-DES-CBC-SHA" +# define TLS1_TXT_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA "EXP1024-DHE-DSS-DES-CBC-SHA" +# define TLS1_TXT_RSA_EXPORT1024_WITH_RC4_56_SHA "EXP1024-RC4-SHA" +# define TLS1_TXT_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA "EXP1024-DHE-DSS-RC4-SHA" +# define TLS1_TXT_DHE_DSS_WITH_RC4_128_SHA "DHE-DSS-RC4-SHA" + +/* AES ciphersuites from RFC3268 */ +# define TLS1_TXT_RSA_WITH_AES_128_SHA "AES128-SHA" +# define TLS1_TXT_DH_DSS_WITH_AES_128_SHA "DH-DSS-AES128-SHA" +# define TLS1_TXT_DH_RSA_WITH_AES_128_SHA "DH-RSA-AES128-SHA" +# define TLS1_TXT_DHE_DSS_WITH_AES_128_SHA "DHE-DSS-AES128-SHA" +# define TLS1_TXT_DHE_RSA_WITH_AES_128_SHA "DHE-RSA-AES128-SHA" +# define TLS1_TXT_ADH_WITH_AES_128_SHA "ADH-AES128-SHA" + +# define TLS1_TXT_RSA_WITH_AES_256_SHA "AES256-SHA" +# define TLS1_TXT_DH_DSS_WITH_AES_256_SHA "DH-DSS-AES256-SHA" +# define TLS1_TXT_DH_RSA_WITH_AES_256_SHA "DH-RSA-AES256-SHA" +# define TLS1_TXT_DHE_DSS_WITH_AES_256_SHA "DHE-DSS-AES256-SHA" +# define TLS1_TXT_DHE_RSA_WITH_AES_256_SHA "DHE-RSA-AES256-SHA" +# define TLS1_TXT_ADH_WITH_AES_256_SHA "ADH-AES256-SHA" + +/* ECC ciphersuites from RFC4492 */ +# define TLS1_TXT_ECDH_ECDSA_WITH_NULL_SHA "ECDH-ECDSA-NULL-SHA" +# define TLS1_TXT_ECDH_ECDSA_WITH_RC4_128_SHA "ECDH-ECDSA-RC4-SHA" +# define TLS1_TXT_ECDH_ECDSA_WITH_DES_192_CBC3_SHA "ECDH-ECDSA-DES-CBC3-SHA" +# define TLS1_TXT_ECDH_ECDSA_WITH_AES_128_CBC_SHA "ECDH-ECDSA-AES128-SHA" +# define TLS1_TXT_ECDH_ECDSA_WITH_AES_256_CBC_SHA "ECDH-ECDSA-AES256-SHA" + +# define TLS1_TXT_ECDHE_ECDSA_WITH_NULL_SHA "ECDHE-ECDSA-NULL-SHA" +# define TLS1_TXT_ECDHE_ECDSA_WITH_RC4_128_SHA "ECDHE-ECDSA-RC4-SHA" +# define TLS1_TXT_ECDHE_ECDSA_WITH_DES_192_CBC3_SHA "ECDHE-ECDSA-DES-CBC3-SHA" +# define TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_CBC_SHA "ECDHE-ECDSA-AES128-SHA" +# define TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_CBC_SHA "ECDHE-ECDSA-AES256-SHA" + +# define TLS1_TXT_ECDH_RSA_WITH_NULL_SHA "ECDH-RSA-NULL-SHA" +# define TLS1_TXT_ECDH_RSA_WITH_RC4_128_SHA "ECDH-RSA-RC4-SHA" +# define TLS1_TXT_ECDH_RSA_WITH_DES_192_CBC3_SHA "ECDH-RSA-DES-CBC3-SHA" +# define TLS1_TXT_ECDH_RSA_WITH_AES_128_CBC_SHA "ECDH-RSA-AES128-SHA" +# define TLS1_TXT_ECDH_RSA_WITH_AES_256_CBC_SHA "ECDH-RSA-AES256-SHA" + +# define TLS1_TXT_ECDHE_RSA_WITH_NULL_SHA "ECDHE-RSA-NULL-SHA" +# define TLS1_TXT_ECDHE_RSA_WITH_RC4_128_SHA "ECDHE-RSA-RC4-SHA" +# define TLS1_TXT_ECDHE_RSA_WITH_DES_192_CBC3_SHA "ECDHE-RSA-DES-CBC3-SHA" +# define TLS1_TXT_ECDHE_RSA_WITH_AES_128_CBC_SHA "ECDHE-RSA-AES128-SHA" +# define TLS1_TXT_ECDHE_RSA_WITH_AES_256_CBC_SHA "ECDHE-RSA-AES256-SHA" + +# define TLS1_TXT_ECDH_anon_WITH_NULL_SHA "AECDH-NULL-SHA" +# define TLS1_TXT_ECDH_anon_WITH_RC4_128_SHA "AECDH-RC4-SHA" +# define TLS1_TXT_ECDH_anon_WITH_DES_192_CBC3_SHA "AECDH-DES-CBC3-SHA" +# define TLS1_TXT_ECDH_anon_WITH_AES_128_CBC_SHA "AECDH-AES128-SHA" +# define TLS1_TXT_ECDH_anon_WITH_AES_256_CBC_SHA "AECDH-AES256-SHA" + +/* PSK ciphersuites from RFC 4279 */ +# define TLS1_TXT_PSK_WITH_RC4_128_SHA "PSK-RC4-SHA" +# define TLS1_TXT_PSK_WITH_3DES_EDE_CBC_SHA "PSK-3DES-EDE-CBC-SHA" +# define TLS1_TXT_PSK_WITH_AES_128_CBC_SHA "PSK-AES128-CBC-SHA" +# define TLS1_TXT_PSK_WITH_AES_256_CBC_SHA "PSK-AES256-CBC-SHA" + +/* SRP ciphersuite from RFC 5054 */ +# define TLS1_TXT_SRP_SHA_WITH_3DES_EDE_CBC_SHA "SRP-3DES-EDE-CBC-SHA" +# define TLS1_TXT_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA "SRP-RSA-3DES-EDE-CBC-SHA" +# define TLS1_TXT_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA "SRP-DSS-3DES-EDE-CBC-SHA" +# define TLS1_TXT_SRP_SHA_WITH_AES_128_CBC_SHA "SRP-AES-128-CBC-SHA" +# define TLS1_TXT_SRP_SHA_RSA_WITH_AES_128_CBC_SHA "SRP-RSA-AES-128-CBC-SHA" +# define TLS1_TXT_SRP_SHA_DSS_WITH_AES_128_CBC_SHA "SRP-DSS-AES-128-CBC-SHA" +# define TLS1_TXT_SRP_SHA_WITH_AES_256_CBC_SHA "SRP-AES-256-CBC-SHA" +# define TLS1_TXT_SRP_SHA_RSA_WITH_AES_256_CBC_SHA "SRP-RSA-AES-256-CBC-SHA" +# define TLS1_TXT_SRP_SHA_DSS_WITH_AES_256_CBC_SHA "SRP-DSS-AES-256-CBC-SHA" + +/* Camellia ciphersuites from RFC4132 */ +# define TLS1_TXT_RSA_WITH_CAMELLIA_128_CBC_SHA "CAMELLIA128-SHA" +# define TLS1_TXT_DH_DSS_WITH_CAMELLIA_128_CBC_SHA "DH-DSS-CAMELLIA128-SHA" +# define TLS1_TXT_DH_RSA_WITH_CAMELLIA_128_CBC_SHA "DH-RSA-CAMELLIA128-SHA" +# define TLS1_TXT_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA "DHE-DSS-CAMELLIA128-SHA" +# define TLS1_TXT_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA "DHE-RSA-CAMELLIA128-SHA" +# define TLS1_TXT_ADH_WITH_CAMELLIA_128_CBC_SHA "ADH-CAMELLIA128-SHA" + +# define TLS1_TXT_RSA_WITH_CAMELLIA_256_CBC_SHA "CAMELLIA256-SHA" +# define TLS1_TXT_DH_DSS_WITH_CAMELLIA_256_CBC_SHA "DH-DSS-CAMELLIA256-SHA" +# define TLS1_TXT_DH_RSA_WITH_CAMELLIA_256_CBC_SHA "DH-RSA-CAMELLIA256-SHA" +# define TLS1_TXT_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA "DHE-DSS-CAMELLIA256-SHA" +# define TLS1_TXT_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA "DHE-RSA-CAMELLIA256-SHA" +# define TLS1_TXT_ADH_WITH_CAMELLIA_256_CBC_SHA "ADH-CAMELLIA256-SHA" + +/* SEED ciphersuites from RFC4162 */ +# define TLS1_TXT_RSA_WITH_SEED_SHA "SEED-SHA" +# define TLS1_TXT_DH_DSS_WITH_SEED_SHA "DH-DSS-SEED-SHA" +# define TLS1_TXT_DH_RSA_WITH_SEED_SHA "DH-RSA-SEED-SHA" +# define TLS1_TXT_DHE_DSS_WITH_SEED_SHA "DHE-DSS-SEED-SHA" +# define TLS1_TXT_DHE_RSA_WITH_SEED_SHA "DHE-RSA-SEED-SHA" +# define TLS1_TXT_ADH_WITH_SEED_SHA "ADH-SEED-SHA" + +/* TLS v1.2 ciphersuites */ +# define TLS1_TXT_RSA_WITH_NULL_SHA256 "NULL-SHA256" +# define TLS1_TXT_RSA_WITH_AES_128_SHA256 "AES128-SHA256" +# define TLS1_TXT_RSA_WITH_AES_256_SHA256 "AES256-SHA256" +# define TLS1_TXT_DH_DSS_WITH_AES_128_SHA256 "DH-DSS-AES128-SHA256" +# define TLS1_TXT_DH_RSA_WITH_AES_128_SHA256 "DH-RSA-AES128-SHA256" +# define TLS1_TXT_DHE_DSS_WITH_AES_128_SHA256 "DHE-DSS-AES128-SHA256" +# define TLS1_TXT_DHE_RSA_WITH_AES_128_SHA256 "DHE-RSA-AES128-SHA256" +# define TLS1_TXT_DH_DSS_WITH_AES_256_SHA256 "DH-DSS-AES256-SHA256" +# define TLS1_TXT_DH_RSA_WITH_AES_256_SHA256 "DH-RSA-AES256-SHA256" +# define TLS1_TXT_DHE_DSS_WITH_AES_256_SHA256 "DHE-DSS-AES256-SHA256" +# define TLS1_TXT_DHE_RSA_WITH_AES_256_SHA256 "DHE-RSA-AES256-SHA256" +# define TLS1_TXT_ADH_WITH_AES_128_SHA256 "ADH-AES128-SHA256" +# define TLS1_TXT_ADH_WITH_AES_256_SHA256 "ADH-AES256-SHA256" + +/* TLS v1.2 GCM ciphersuites from RFC5288 */ +# define TLS1_TXT_RSA_WITH_AES_128_GCM_SHA256 "AES128-GCM-SHA256" +# define TLS1_TXT_RSA_WITH_AES_256_GCM_SHA384 "AES256-GCM-SHA384" +# define TLS1_TXT_DHE_RSA_WITH_AES_128_GCM_SHA256 "DHE-RSA-AES128-GCM-SHA256" +# define TLS1_TXT_DHE_RSA_WITH_AES_256_GCM_SHA384 "DHE-RSA-AES256-GCM-SHA384" +# define TLS1_TXT_DH_RSA_WITH_AES_128_GCM_SHA256 "DH-RSA-AES128-GCM-SHA256" +# define TLS1_TXT_DH_RSA_WITH_AES_256_GCM_SHA384 "DH-RSA-AES256-GCM-SHA384" +# define TLS1_TXT_DHE_DSS_WITH_AES_128_GCM_SHA256 "DHE-DSS-AES128-GCM-SHA256" +# define TLS1_TXT_DHE_DSS_WITH_AES_256_GCM_SHA384 "DHE-DSS-AES256-GCM-SHA384" +# define TLS1_TXT_DH_DSS_WITH_AES_128_GCM_SHA256 "DH-DSS-AES128-GCM-SHA256" +# define TLS1_TXT_DH_DSS_WITH_AES_256_GCM_SHA384 "DH-DSS-AES256-GCM-SHA384" +# define TLS1_TXT_ADH_WITH_AES_128_GCM_SHA256 "ADH-AES128-GCM-SHA256" +# define TLS1_TXT_ADH_WITH_AES_256_GCM_SHA384 "ADH-AES256-GCM-SHA384" + +/* ECDH HMAC based ciphersuites from RFC5289 */ + +# define TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_SHA256 "ECDHE-ECDSA-AES128-SHA256" +# define TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_SHA384 "ECDHE-ECDSA-AES256-SHA384" +# define TLS1_TXT_ECDH_ECDSA_WITH_AES_128_SHA256 "ECDH-ECDSA-AES128-SHA256" +# define TLS1_TXT_ECDH_ECDSA_WITH_AES_256_SHA384 "ECDH-ECDSA-AES256-SHA384" +# define TLS1_TXT_ECDHE_RSA_WITH_AES_128_SHA256 "ECDHE-RSA-AES128-SHA256" +# define TLS1_TXT_ECDHE_RSA_WITH_AES_256_SHA384 "ECDHE-RSA-AES256-SHA384" +# define TLS1_TXT_ECDH_RSA_WITH_AES_128_SHA256 "ECDH-RSA-AES128-SHA256" +# define TLS1_TXT_ECDH_RSA_WITH_AES_256_SHA384 "ECDH-RSA-AES256-SHA384" + +/* ECDH GCM based ciphersuites from RFC5289 */ +# define TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 "ECDHE-ECDSA-AES128-GCM-SHA256" +# define TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 "ECDHE-ECDSA-AES256-GCM-SHA384" +# define TLS1_TXT_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 "ECDH-ECDSA-AES128-GCM-SHA256" +# define TLS1_TXT_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 "ECDH-ECDSA-AES256-GCM-SHA384" +# define TLS1_TXT_ECDHE_RSA_WITH_AES_128_GCM_SHA256 "ECDHE-RSA-AES128-GCM-SHA256" +# define TLS1_TXT_ECDHE_RSA_WITH_AES_256_GCM_SHA384 "ECDHE-RSA-AES256-GCM-SHA384" +# define TLS1_TXT_ECDH_RSA_WITH_AES_128_GCM_SHA256 "ECDH-RSA-AES128-GCM-SHA256" +# define TLS1_TXT_ECDH_RSA_WITH_AES_256_GCM_SHA384 "ECDH-RSA-AES256-GCM-SHA384" + +# define TLS_CT_RSA_SIGN 1 +# define TLS_CT_DSS_SIGN 2 +# define TLS_CT_RSA_FIXED_DH 3 +# define TLS_CT_DSS_FIXED_DH 4 +# define TLS_CT_ECDSA_SIGN 64 +# define TLS_CT_RSA_FIXED_ECDH 65 +# define TLS_CT_ECDSA_FIXED_ECDH 66 +# define TLS_CT_GOST94_SIGN 21 +# define TLS_CT_GOST01_SIGN 22 +/* + * when correcting this number, correct also SSL3_CT_NUMBER in ssl3.h (see + * comment there) + */ +# define TLS_CT_NUMBER 9 + +# define TLS1_FINISH_MAC_LENGTH 12 + +# define TLS_MD_MAX_CONST_SIZE 20 +# define TLS_MD_CLIENT_FINISH_CONST "client finished" +# define TLS_MD_CLIENT_FINISH_CONST_SIZE 15 +# define TLS_MD_SERVER_FINISH_CONST "server finished" +# define TLS_MD_SERVER_FINISH_CONST_SIZE 15 +# define TLS_MD_SERVER_WRITE_KEY_CONST "server write key" +# define TLS_MD_SERVER_WRITE_KEY_CONST_SIZE 16 +# define TLS_MD_KEY_EXPANSION_CONST "key expansion" +# define TLS_MD_KEY_EXPANSION_CONST_SIZE 13 +# define TLS_MD_CLIENT_WRITE_KEY_CONST "client write key" +# define TLS_MD_CLIENT_WRITE_KEY_CONST_SIZE 16 +# define TLS_MD_SERVER_WRITE_KEY_CONST "server write key" +# define TLS_MD_SERVER_WRITE_KEY_CONST_SIZE 16 +# define TLS_MD_IV_BLOCK_CONST "IV block" +# define TLS_MD_IV_BLOCK_CONST_SIZE 8 +# define TLS_MD_MASTER_SECRET_CONST "master secret" +# define TLS_MD_MASTER_SECRET_CONST_SIZE 13 + +# ifdef CHARSET_EBCDIC +# undef TLS_MD_CLIENT_FINISH_CONST +/* + * client finished + */ +# define TLS_MD_CLIENT_FINISH_CONST "\x63\x6c\x69\x65\x6e\x74\x20\x66\x69\x6e\x69\x73\x68\x65\x64" + +# undef TLS_MD_SERVER_FINISH_CONST +/* + * server finished + */ +# define TLS_MD_SERVER_FINISH_CONST "\x73\x65\x72\x76\x65\x72\x20\x66\x69\x6e\x69\x73\x68\x65\x64" + +# undef TLS_MD_SERVER_WRITE_KEY_CONST +/* + * server write key + */ +# define TLS_MD_SERVER_WRITE_KEY_CONST "\x73\x65\x72\x76\x65\x72\x20\x77\x72\x69\x74\x65\x20\x6b\x65\x79" + +# undef TLS_MD_KEY_EXPANSION_CONST +/* + * key expansion + */ +# define TLS_MD_KEY_EXPANSION_CONST "\x6b\x65\x79\x20\x65\x78\x70\x61\x6e\x73\x69\x6f\x6e" + +# undef TLS_MD_CLIENT_WRITE_KEY_CONST +/* + * client write key + */ +# define TLS_MD_CLIENT_WRITE_KEY_CONST "\x63\x6c\x69\x65\x6e\x74\x20\x77\x72\x69\x74\x65\x20\x6b\x65\x79" + +# undef TLS_MD_SERVER_WRITE_KEY_CONST +/* + * server write key + */ +# define TLS_MD_SERVER_WRITE_KEY_CONST "\x73\x65\x72\x76\x65\x72\x20\x77\x72\x69\x74\x65\x20\x6b\x65\x79" + +# undef TLS_MD_IV_BLOCK_CONST +/* + * IV block + */ +# define TLS_MD_IV_BLOCK_CONST "\x49\x56\x20\x62\x6c\x6f\x63\x6b" + +# undef TLS_MD_MASTER_SECRET_CONST +/* + * master secret + */ +# define TLS_MD_MASTER_SECRET_CONST "\x6d\x61\x73\x74\x65\x72\x20\x73\x65\x63\x72\x65\x74" +# endif + +/* TLS Session Ticket extension struct */ +struct tls_session_ticket_ext_st { + unsigned short length; + void *data; +}; + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/win/openssl/include/openssl/ts.h b/hdssd/external/win/openssl/include/openssl/ts.h new file mode 100644 index 0000000..16eccbb --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/ts.h @@ -0,0 +1,862 @@ +/* crypto/ts/ts.h */ +/* + * Written by Zoltan Glozik (zglozik@opentsa.org) for the OpenSSL project + * 2002, 2003, 2004. + */ +/* ==================================================================== + * Copyright (c) 2006 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_TS_H +# define HEADER_TS_H + +# include +# include +# ifndef OPENSSL_NO_BUFFER +# include +# endif +# ifndef OPENSSL_NO_EVP +# include +# endif +# ifndef OPENSSL_NO_BIO +# include +# endif +# include +# include +# include + +# ifndef OPENSSL_NO_RSA +# include +# endif + +# ifndef OPENSSL_NO_DSA +# include +# endif + +# ifndef OPENSSL_NO_DH +# include +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +# ifdef WIN32 +/* Under Win32 this is defined in wincrypt.h */ +# undef X509_NAME +# endif + +# include +# include + +/*- +MessageImprint ::= SEQUENCE { + hashAlgorithm AlgorithmIdentifier, + hashedMessage OCTET STRING } +*/ + +typedef struct TS_msg_imprint_st { + X509_ALGOR *hash_algo; + ASN1_OCTET_STRING *hashed_msg; +} TS_MSG_IMPRINT; + +/*- +TimeStampReq ::= SEQUENCE { + version INTEGER { v1(1) }, + messageImprint MessageImprint, + --a hash algorithm OID and the hash value of the data to be + --time-stamped + reqPolicy TSAPolicyId OPTIONAL, + nonce INTEGER OPTIONAL, + certReq BOOLEAN DEFAULT FALSE, + extensions [0] IMPLICIT Extensions OPTIONAL } +*/ + +typedef struct TS_req_st { + ASN1_INTEGER *version; + TS_MSG_IMPRINT *msg_imprint; + ASN1_OBJECT *policy_id; /* OPTIONAL */ + ASN1_INTEGER *nonce; /* OPTIONAL */ + ASN1_BOOLEAN cert_req; /* DEFAULT FALSE */ + STACK_OF(X509_EXTENSION) *extensions; /* [0] OPTIONAL */ +} TS_REQ; + +/*- +Accuracy ::= SEQUENCE { + seconds INTEGER OPTIONAL, + millis [0] INTEGER (1..999) OPTIONAL, + micros [1] INTEGER (1..999) OPTIONAL } +*/ + +typedef struct TS_accuracy_st { + ASN1_INTEGER *seconds; + ASN1_INTEGER *millis; + ASN1_INTEGER *micros; +} TS_ACCURACY; + +/*- +TSTInfo ::= SEQUENCE { + version INTEGER { v1(1) }, + policy TSAPolicyId, + messageImprint MessageImprint, + -- MUST have the same value as the similar field in + -- TimeStampReq + serialNumber INTEGER, + -- Time-Stamping users MUST be ready to accommodate integers + -- up to 160 bits. + genTime GeneralizedTime, + accuracy Accuracy OPTIONAL, + ordering BOOLEAN DEFAULT FALSE, + nonce INTEGER OPTIONAL, + -- MUST be present if the similar field was present + -- in TimeStampReq. In that case it MUST have the same value. + tsa [0] GeneralName OPTIONAL, + extensions [1] IMPLICIT Extensions OPTIONAL } +*/ + +typedef struct TS_tst_info_st { + ASN1_INTEGER *version; + ASN1_OBJECT *policy_id; + TS_MSG_IMPRINT *msg_imprint; + ASN1_INTEGER *serial; + ASN1_GENERALIZEDTIME *time; + TS_ACCURACY *accuracy; + ASN1_BOOLEAN ordering; + ASN1_INTEGER *nonce; + GENERAL_NAME *tsa; + STACK_OF(X509_EXTENSION) *extensions; +} TS_TST_INFO; + +/*- +PKIStatusInfo ::= SEQUENCE { + status PKIStatus, + statusString PKIFreeText OPTIONAL, + failInfo PKIFailureInfo OPTIONAL } + +From RFC 1510 - section 3.1.1: +PKIFreeText ::= SEQUENCE SIZE (1..MAX) OF UTF8String + -- text encoded as UTF-8 String (note: each UTF8String SHOULD + -- include an RFC 1766 language tag to indicate the language + -- of the contained text) +*/ + +/* Possible values for status. See ts_resp_print.c && ts_resp_verify.c. */ + +# define TS_STATUS_GRANTED 0 +# define TS_STATUS_GRANTED_WITH_MODS 1 +# define TS_STATUS_REJECTION 2 +# define TS_STATUS_WAITING 3 +# define TS_STATUS_REVOCATION_WARNING 4 +# define TS_STATUS_REVOCATION_NOTIFICATION 5 + +/* + * Possible values for failure_info. See ts_resp_print.c && ts_resp_verify.c + */ + +# define TS_INFO_BAD_ALG 0 +# define TS_INFO_BAD_REQUEST 2 +# define TS_INFO_BAD_DATA_FORMAT 5 +# define TS_INFO_TIME_NOT_AVAILABLE 14 +# define TS_INFO_UNACCEPTED_POLICY 15 +# define TS_INFO_UNACCEPTED_EXTENSION 16 +# define TS_INFO_ADD_INFO_NOT_AVAILABLE 17 +# define TS_INFO_SYSTEM_FAILURE 25 + +typedef struct TS_status_info_st { + ASN1_INTEGER *status; + STACK_OF(ASN1_UTF8STRING) *text; + ASN1_BIT_STRING *failure_info; +} TS_STATUS_INFO; + +DECLARE_STACK_OF(ASN1_UTF8STRING) +DECLARE_ASN1_SET_OF(ASN1_UTF8STRING) + +/*- +TimeStampResp ::= SEQUENCE { + status PKIStatusInfo, + timeStampToken TimeStampToken OPTIONAL } +*/ + +typedef struct TS_resp_st { + TS_STATUS_INFO *status_info; + PKCS7 *token; + TS_TST_INFO *tst_info; +} TS_RESP; + +/* The structure below would belong to the ESS component. */ + +/*- +IssuerSerial ::= SEQUENCE { + issuer GeneralNames, + serialNumber CertificateSerialNumber + } +*/ + +typedef struct ESS_issuer_serial { + STACK_OF(GENERAL_NAME) *issuer; + ASN1_INTEGER *serial; +} ESS_ISSUER_SERIAL; + +/*- +ESSCertID ::= SEQUENCE { + certHash Hash, + issuerSerial IssuerSerial OPTIONAL +} +*/ + +typedef struct ESS_cert_id { + ASN1_OCTET_STRING *hash; /* Always SHA-1 digest. */ + ESS_ISSUER_SERIAL *issuer_serial; +} ESS_CERT_ID; + +DECLARE_STACK_OF(ESS_CERT_ID) +DECLARE_ASN1_SET_OF(ESS_CERT_ID) + +/*- +SigningCertificate ::= SEQUENCE { + certs SEQUENCE OF ESSCertID, + policies SEQUENCE OF PolicyInformation OPTIONAL +} +*/ + +typedef struct ESS_signing_cert { + STACK_OF(ESS_CERT_ID) *cert_ids; + STACK_OF(POLICYINFO) *policy_info; +} ESS_SIGNING_CERT; + +TS_REQ *TS_REQ_new(void); +void TS_REQ_free(TS_REQ *a); +int i2d_TS_REQ(const TS_REQ *a, unsigned char **pp); +TS_REQ *d2i_TS_REQ(TS_REQ **a, const unsigned char **pp, long length); + +TS_REQ *TS_REQ_dup(TS_REQ *a); + +TS_REQ *d2i_TS_REQ_fp(FILE *fp, TS_REQ **a); +int i2d_TS_REQ_fp(FILE *fp, TS_REQ *a); +TS_REQ *d2i_TS_REQ_bio(BIO *fp, TS_REQ **a); +int i2d_TS_REQ_bio(BIO *fp, TS_REQ *a); + +TS_MSG_IMPRINT *TS_MSG_IMPRINT_new(void); +void TS_MSG_IMPRINT_free(TS_MSG_IMPRINT *a); +int i2d_TS_MSG_IMPRINT(const TS_MSG_IMPRINT *a, unsigned char **pp); +TS_MSG_IMPRINT *d2i_TS_MSG_IMPRINT(TS_MSG_IMPRINT **a, + const unsigned char **pp, long length); + +TS_MSG_IMPRINT *TS_MSG_IMPRINT_dup(TS_MSG_IMPRINT *a); + +TS_MSG_IMPRINT *d2i_TS_MSG_IMPRINT_fp(FILE *fp, TS_MSG_IMPRINT **a); +int i2d_TS_MSG_IMPRINT_fp(FILE *fp, TS_MSG_IMPRINT *a); +TS_MSG_IMPRINT *d2i_TS_MSG_IMPRINT_bio(BIO *fp, TS_MSG_IMPRINT **a); +int i2d_TS_MSG_IMPRINT_bio(BIO *fp, TS_MSG_IMPRINT *a); + +TS_RESP *TS_RESP_new(void); +void TS_RESP_free(TS_RESP *a); +int i2d_TS_RESP(const TS_RESP *a, unsigned char **pp); +TS_RESP *d2i_TS_RESP(TS_RESP **a, const unsigned char **pp, long length); +TS_TST_INFO *PKCS7_to_TS_TST_INFO(PKCS7 *token); +TS_RESP *TS_RESP_dup(TS_RESP *a); + +TS_RESP *d2i_TS_RESP_fp(FILE *fp, TS_RESP **a); +int i2d_TS_RESP_fp(FILE *fp, TS_RESP *a); +TS_RESP *d2i_TS_RESP_bio(BIO *fp, TS_RESP **a); +int i2d_TS_RESP_bio(BIO *fp, TS_RESP *a); + +TS_STATUS_INFO *TS_STATUS_INFO_new(void); +void TS_STATUS_INFO_free(TS_STATUS_INFO *a); +int i2d_TS_STATUS_INFO(const TS_STATUS_INFO *a, unsigned char **pp); +TS_STATUS_INFO *d2i_TS_STATUS_INFO(TS_STATUS_INFO **a, + const unsigned char **pp, long length); +TS_STATUS_INFO *TS_STATUS_INFO_dup(TS_STATUS_INFO *a); + +TS_TST_INFO *TS_TST_INFO_new(void); +void TS_TST_INFO_free(TS_TST_INFO *a); +int i2d_TS_TST_INFO(const TS_TST_INFO *a, unsigned char **pp); +TS_TST_INFO *d2i_TS_TST_INFO(TS_TST_INFO **a, const unsigned char **pp, + long length); +TS_TST_INFO *TS_TST_INFO_dup(TS_TST_INFO *a); + +TS_TST_INFO *d2i_TS_TST_INFO_fp(FILE *fp, TS_TST_INFO **a); +int i2d_TS_TST_INFO_fp(FILE *fp, TS_TST_INFO *a); +TS_TST_INFO *d2i_TS_TST_INFO_bio(BIO *fp, TS_TST_INFO **a); +int i2d_TS_TST_INFO_bio(BIO *fp, TS_TST_INFO *a); + +TS_ACCURACY *TS_ACCURACY_new(void); +void TS_ACCURACY_free(TS_ACCURACY *a); +int i2d_TS_ACCURACY(const TS_ACCURACY *a, unsigned char **pp); +TS_ACCURACY *d2i_TS_ACCURACY(TS_ACCURACY **a, const unsigned char **pp, + long length); +TS_ACCURACY *TS_ACCURACY_dup(TS_ACCURACY *a); + +ESS_ISSUER_SERIAL *ESS_ISSUER_SERIAL_new(void); +void ESS_ISSUER_SERIAL_free(ESS_ISSUER_SERIAL *a); +int i2d_ESS_ISSUER_SERIAL(const ESS_ISSUER_SERIAL *a, unsigned char **pp); +ESS_ISSUER_SERIAL *d2i_ESS_ISSUER_SERIAL(ESS_ISSUER_SERIAL **a, + const unsigned char **pp, + long length); +ESS_ISSUER_SERIAL *ESS_ISSUER_SERIAL_dup(ESS_ISSUER_SERIAL *a); + +ESS_CERT_ID *ESS_CERT_ID_new(void); +void ESS_CERT_ID_free(ESS_CERT_ID *a); +int i2d_ESS_CERT_ID(const ESS_CERT_ID *a, unsigned char **pp); +ESS_CERT_ID *d2i_ESS_CERT_ID(ESS_CERT_ID **a, const unsigned char **pp, + long length); +ESS_CERT_ID *ESS_CERT_ID_dup(ESS_CERT_ID *a); + +ESS_SIGNING_CERT *ESS_SIGNING_CERT_new(void); +void ESS_SIGNING_CERT_free(ESS_SIGNING_CERT *a); +int i2d_ESS_SIGNING_CERT(const ESS_SIGNING_CERT *a, unsigned char **pp); +ESS_SIGNING_CERT *d2i_ESS_SIGNING_CERT(ESS_SIGNING_CERT **a, + const unsigned char **pp, long length); +ESS_SIGNING_CERT *ESS_SIGNING_CERT_dup(ESS_SIGNING_CERT *a); + +void ERR_load_TS_strings(void); + +int TS_REQ_set_version(TS_REQ *a, long version); +long TS_REQ_get_version(const TS_REQ *a); + +int TS_REQ_set_msg_imprint(TS_REQ *a, TS_MSG_IMPRINT *msg_imprint); +TS_MSG_IMPRINT *TS_REQ_get_msg_imprint(TS_REQ *a); + +int TS_MSG_IMPRINT_set_algo(TS_MSG_IMPRINT *a, X509_ALGOR *alg); +X509_ALGOR *TS_MSG_IMPRINT_get_algo(TS_MSG_IMPRINT *a); + +int TS_MSG_IMPRINT_set_msg(TS_MSG_IMPRINT *a, unsigned char *d, int len); +ASN1_OCTET_STRING *TS_MSG_IMPRINT_get_msg(TS_MSG_IMPRINT *a); + +int TS_REQ_set_policy_id(TS_REQ *a, ASN1_OBJECT *policy); +ASN1_OBJECT *TS_REQ_get_policy_id(TS_REQ *a); + +int TS_REQ_set_nonce(TS_REQ *a, const ASN1_INTEGER *nonce); +const ASN1_INTEGER *TS_REQ_get_nonce(const TS_REQ *a); + +int TS_REQ_set_cert_req(TS_REQ *a, int cert_req); +int TS_REQ_get_cert_req(const TS_REQ *a); + +STACK_OF(X509_EXTENSION) *TS_REQ_get_exts(TS_REQ *a); +void TS_REQ_ext_free(TS_REQ *a); +int TS_REQ_get_ext_count(TS_REQ *a); +int TS_REQ_get_ext_by_NID(TS_REQ *a, int nid, int lastpos); +int TS_REQ_get_ext_by_OBJ(TS_REQ *a, ASN1_OBJECT *obj, int lastpos); +int TS_REQ_get_ext_by_critical(TS_REQ *a, int crit, int lastpos); +X509_EXTENSION *TS_REQ_get_ext(TS_REQ *a, int loc); +X509_EXTENSION *TS_REQ_delete_ext(TS_REQ *a, int loc); +int TS_REQ_add_ext(TS_REQ *a, X509_EXTENSION *ex, int loc); +void *TS_REQ_get_ext_d2i(TS_REQ *a, int nid, int *crit, int *idx); + +/* Function declarations for TS_REQ defined in ts/ts_req_print.c */ + +int TS_REQ_print_bio(BIO *bio, TS_REQ *a); + +/* Function declarations for TS_RESP defined in ts/ts_resp_utils.c */ + +int TS_RESP_set_status_info(TS_RESP *a, TS_STATUS_INFO *info); +TS_STATUS_INFO *TS_RESP_get_status_info(TS_RESP *a); + +/* Caller loses ownership of PKCS7 and TS_TST_INFO objects. */ +void TS_RESP_set_tst_info(TS_RESP *a, PKCS7 *p7, TS_TST_INFO *tst_info); +PKCS7 *TS_RESP_get_token(TS_RESP *a); +TS_TST_INFO *TS_RESP_get_tst_info(TS_RESP *a); + +int TS_TST_INFO_set_version(TS_TST_INFO *a, long version); +long TS_TST_INFO_get_version(const TS_TST_INFO *a); + +int TS_TST_INFO_set_policy_id(TS_TST_INFO *a, ASN1_OBJECT *policy_id); +ASN1_OBJECT *TS_TST_INFO_get_policy_id(TS_TST_INFO *a); + +int TS_TST_INFO_set_msg_imprint(TS_TST_INFO *a, TS_MSG_IMPRINT *msg_imprint); +TS_MSG_IMPRINT *TS_TST_INFO_get_msg_imprint(TS_TST_INFO *a); + +int TS_TST_INFO_set_serial(TS_TST_INFO *a, const ASN1_INTEGER *serial); +const ASN1_INTEGER *TS_TST_INFO_get_serial(const TS_TST_INFO *a); + +int TS_TST_INFO_set_time(TS_TST_INFO *a, const ASN1_GENERALIZEDTIME *gtime); +const ASN1_GENERALIZEDTIME *TS_TST_INFO_get_time(const TS_TST_INFO *a); + +int TS_TST_INFO_set_accuracy(TS_TST_INFO *a, TS_ACCURACY *accuracy); +TS_ACCURACY *TS_TST_INFO_get_accuracy(TS_TST_INFO *a); + +int TS_ACCURACY_set_seconds(TS_ACCURACY *a, const ASN1_INTEGER *seconds); +const ASN1_INTEGER *TS_ACCURACY_get_seconds(const TS_ACCURACY *a); + +int TS_ACCURACY_set_millis(TS_ACCURACY *a, const ASN1_INTEGER *millis); +const ASN1_INTEGER *TS_ACCURACY_get_millis(const TS_ACCURACY *a); + +int TS_ACCURACY_set_micros(TS_ACCURACY *a, const ASN1_INTEGER *micros); +const ASN1_INTEGER *TS_ACCURACY_get_micros(const TS_ACCURACY *a); + +int TS_TST_INFO_set_ordering(TS_TST_INFO *a, int ordering); +int TS_TST_INFO_get_ordering(const TS_TST_INFO *a); + +int TS_TST_INFO_set_nonce(TS_TST_INFO *a, const ASN1_INTEGER *nonce); +const ASN1_INTEGER *TS_TST_INFO_get_nonce(const TS_TST_INFO *a); + +int TS_TST_INFO_set_tsa(TS_TST_INFO *a, GENERAL_NAME *tsa); +GENERAL_NAME *TS_TST_INFO_get_tsa(TS_TST_INFO *a); + +STACK_OF(X509_EXTENSION) *TS_TST_INFO_get_exts(TS_TST_INFO *a); +void TS_TST_INFO_ext_free(TS_TST_INFO *a); +int TS_TST_INFO_get_ext_count(TS_TST_INFO *a); +int TS_TST_INFO_get_ext_by_NID(TS_TST_INFO *a, int nid, int lastpos); +int TS_TST_INFO_get_ext_by_OBJ(TS_TST_INFO *a, ASN1_OBJECT *obj, int lastpos); +int TS_TST_INFO_get_ext_by_critical(TS_TST_INFO *a, int crit, int lastpos); +X509_EXTENSION *TS_TST_INFO_get_ext(TS_TST_INFO *a, int loc); +X509_EXTENSION *TS_TST_INFO_delete_ext(TS_TST_INFO *a, int loc); +int TS_TST_INFO_add_ext(TS_TST_INFO *a, X509_EXTENSION *ex, int loc); +void *TS_TST_INFO_get_ext_d2i(TS_TST_INFO *a, int nid, int *crit, int *idx); + +/* + * Declarations related to response generation, defined in ts/ts_resp_sign.c. + */ + +/* Optional flags for response generation. */ + +/* Don't include the TSA name in response. */ +# define TS_TSA_NAME 0x01 + +/* Set ordering to true in response. */ +# define TS_ORDERING 0x02 + +/* + * Include the signer certificate and the other specified certificates in + * the ESS signing certificate attribute beside the PKCS7 signed data. + * Only the signer certificates is included by default. + */ +# define TS_ESS_CERT_ID_CHAIN 0x04 + +/* Forward declaration. */ +struct TS_resp_ctx; + +/* This must return a unique number less than 160 bits long. */ +typedef ASN1_INTEGER *(*TS_serial_cb) (struct TS_resp_ctx *, void *); + +/* + * This must return the seconds and microseconds since Jan 1, 1970 in the sec + * and usec variables allocated by the caller. Return non-zero for success + * and zero for failure. + */ +typedef int (*TS_time_cb) (struct TS_resp_ctx *, void *, long *sec, + long *usec); + +/* + * This must process the given extension. It can modify the TS_TST_INFO + * object of the context. Return values: !0 (processed), 0 (error, it must + * set the status info/failure info of the response). + */ +typedef int (*TS_extension_cb) (struct TS_resp_ctx *, X509_EXTENSION *, + void *); + +typedef struct TS_resp_ctx { + X509 *signer_cert; + EVP_PKEY *signer_key; + STACK_OF(X509) *certs; /* Certs to include in signed data. */ + STACK_OF(ASN1_OBJECT) *policies; /* Acceptable policies. */ + ASN1_OBJECT *default_policy; /* It may appear in policies, too. */ + STACK_OF(EVP_MD) *mds; /* Acceptable message digests. */ + ASN1_INTEGER *seconds; /* accuracy, 0 means not specified. */ + ASN1_INTEGER *millis; /* accuracy, 0 means not specified. */ + ASN1_INTEGER *micros; /* accuracy, 0 means not specified. */ + unsigned clock_precision_digits; /* fraction of seconds in time stamp + * token. */ + unsigned flags; /* Optional info, see values above. */ + /* Callback functions. */ + TS_serial_cb serial_cb; + void *serial_cb_data; /* User data for serial_cb. */ + TS_time_cb time_cb; + void *time_cb_data; /* User data for time_cb. */ + TS_extension_cb extension_cb; + void *extension_cb_data; /* User data for extension_cb. */ + /* These members are used only while creating the response. */ + TS_REQ *request; + TS_RESP *response; + TS_TST_INFO *tst_info; +} TS_RESP_CTX; + +DECLARE_STACK_OF(EVP_MD) +DECLARE_ASN1_SET_OF(EVP_MD) + +/* Creates a response context that can be used for generating responses. */ +TS_RESP_CTX *TS_RESP_CTX_new(void); +void TS_RESP_CTX_free(TS_RESP_CTX *ctx); + +/* This parameter must be set. */ +int TS_RESP_CTX_set_signer_cert(TS_RESP_CTX *ctx, X509 *signer); + +/* This parameter must be set. */ +int TS_RESP_CTX_set_signer_key(TS_RESP_CTX *ctx, EVP_PKEY *key); + +/* This parameter must be set. */ +int TS_RESP_CTX_set_def_policy(TS_RESP_CTX *ctx, ASN1_OBJECT *def_policy); + +/* No additional certs are included in the response by default. */ +int TS_RESP_CTX_set_certs(TS_RESP_CTX *ctx, STACK_OF(X509) *certs); + +/* + * Adds a new acceptable policy, only the default policy is accepted by + * default. + */ +int TS_RESP_CTX_add_policy(TS_RESP_CTX *ctx, ASN1_OBJECT *policy); + +/* + * Adds a new acceptable message digest. Note that no message digests are + * accepted by default. The md argument is shared with the caller. + */ +int TS_RESP_CTX_add_md(TS_RESP_CTX *ctx, const EVP_MD *md); + +/* Accuracy is not included by default. */ +int TS_RESP_CTX_set_accuracy(TS_RESP_CTX *ctx, + int secs, int millis, int micros); + +/* + * Clock precision digits, i.e. the number of decimal digits: '0' means sec, + * '3' msec, '6' usec, and so on. Default is 0. + */ +int TS_RESP_CTX_set_clock_precision_digits(TS_RESP_CTX *ctx, + unsigned clock_precision_digits); +/* At most we accept usec precision. */ +# define TS_MAX_CLOCK_PRECISION_DIGITS 6 + +/* No flags are set by default. */ +void TS_RESP_CTX_add_flags(TS_RESP_CTX *ctx, int flags); + +/* Default callback always returns a constant. */ +void TS_RESP_CTX_set_serial_cb(TS_RESP_CTX *ctx, TS_serial_cb cb, void *data); + +/* Default callback uses the gettimeofday() and gmtime() system calls. */ +void TS_RESP_CTX_set_time_cb(TS_RESP_CTX *ctx, TS_time_cb cb, void *data); + +/* + * Default callback rejects all extensions. The extension callback is called + * when the TS_TST_INFO object is already set up and not signed yet. + */ +/* FIXME: extension handling is not tested yet. */ +void TS_RESP_CTX_set_extension_cb(TS_RESP_CTX *ctx, + TS_extension_cb cb, void *data); + +/* The following methods can be used in the callbacks. */ +int TS_RESP_CTX_set_status_info(TS_RESP_CTX *ctx, + int status, const char *text); + +/* Sets the status info only if it is still TS_STATUS_GRANTED. */ +int TS_RESP_CTX_set_status_info_cond(TS_RESP_CTX *ctx, + int status, const char *text); + +int TS_RESP_CTX_add_failure_info(TS_RESP_CTX *ctx, int failure); + +/* The get methods below can be used in the extension callback. */ +TS_REQ *TS_RESP_CTX_get_request(TS_RESP_CTX *ctx); + +TS_TST_INFO *TS_RESP_CTX_get_tst_info(TS_RESP_CTX *ctx); + +/* + * Creates the signed TS_TST_INFO and puts it in TS_RESP. + * In case of errors it sets the status info properly. + * Returns NULL only in case of memory allocation/fatal error. + */ +TS_RESP *TS_RESP_create_response(TS_RESP_CTX *ctx, BIO *req_bio); + +/* + * Declarations related to response verification, + * they are defined in ts/ts_resp_verify.c. + */ + +int TS_RESP_verify_signature(PKCS7 *token, STACK_OF(X509) *certs, + X509_STORE *store, X509 **signer_out); + +/* Context structure for the generic verify method. */ + +/* Verify the signer's certificate and the signature of the response. */ +# define TS_VFY_SIGNATURE (1u << 0) +/* Verify the version number of the response. */ +# define TS_VFY_VERSION (1u << 1) +/* Verify if the policy supplied by the user matches the policy of the TSA. */ +# define TS_VFY_POLICY (1u << 2) +/* + * Verify the message imprint provided by the user. This flag should not be + * specified with TS_VFY_DATA. + */ +# define TS_VFY_IMPRINT (1u << 3) +/* + * Verify the message imprint computed by the verify method from the user + * provided data and the MD algorithm of the response. This flag should not + * be specified with TS_VFY_IMPRINT. + */ +# define TS_VFY_DATA (1u << 4) +/* Verify the nonce value. */ +# define TS_VFY_NONCE (1u << 5) +/* Verify if the TSA name field matches the signer certificate. */ +# define TS_VFY_SIGNER (1u << 6) +/* Verify if the TSA name field equals to the user provided name. */ +# define TS_VFY_TSA_NAME (1u << 7) + +/* You can use the following convenience constants. */ +# define TS_VFY_ALL_IMPRINT (TS_VFY_SIGNATURE \ + | TS_VFY_VERSION \ + | TS_VFY_POLICY \ + | TS_VFY_IMPRINT \ + | TS_VFY_NONCE \ + | TS_VFY_SIGNER \ + | TS_VFY_TSA_NAME) +# define TS_VFY_ALL_DATA (TS_VFY_SIGNATURE \ + | TS_VFY_VERSION \ + | TS_VFY_POLICY \ + | TS_VFY_DATA \ + | TS_VFY_NONCE \ + | TS_VFY_SIGNER \ + | TS_VFY_TSA_NAME) + +typedef struct TS_verify_ctx { + /* Set this to the union of TS_VFY_... flags you want to carry out. */ + unsigned flags; + /* Must be set only with TS_VFY_SIGNATURE. certs is optional. */ + X509_STORE *store; + STACK_OF(X509) *certs; + /* Must be set only with TS_VFY_POLICY. */ + ASN1_OBJECT *policy; + /* + * Must be set only with TS_VFY_IMPRINT. If md_alg is NULL, the + * algorithm from the response is used. + */ + X509_ALGOR *md_alg; + unsigned char *imprint; + unsigned imprint_len; + /* Must be set only with TS_VFY_DATA. */ + BIO *data; + /* Must be set only with TS_VFY_TSA_NAME. */ + ASN1_INTEGER *nonce; + /* Must be set only with TS_VFY_TSA_NAME. */ + GENERAL_NAME *tsa_name; +} TS_VERIFY_CTX; + +int TS_RESP_verify_response(TS_VERIFY_CTX *ctx, TS_RESP *response); +int TS_RESP_verify_token(TS_VERIFY_CTX *ctx, PKCS7 *token); + +/* + * Declarations related to response verification context, + * they are defined in ts/ts_verify_ctx.c. + */ + +/* Set all fields to zero. */ +TS_VERIFY_CTX *TS_VERIFY_CTX_new(void); +void TS_VERIFY_CTX_init(TS_VERIFY_CTX *ctx); +void TS_VERIFY_CTX_free(TS_VERIFY_CTX *ctx); +void TS_VERIFY_CTX_cleanup(TS_VERIFY_CTX *ctx); + +/*- + * If ctx is NULL, it allocates and returns a new object, otherwise + * it returns ctx. It initialises all the members as follows: + * flags = TS_VFY_ALL_IMPRINT & ~(TS_VFY_TSA_NAME | TS_VFY_SIGNATURE) + * certs = NULL + * store = NULL + * policy = policy from the request or NULL if absent (in this case + * TS_VFY_POLICY is cleared from flags as well) + * md_alg = MD algorithm from request + * imprint, imprint_len = imprint from request + * data = NULL + * nonce, nonce_len = nonce from the request or NULL if absent (in this case + * TS_VFY_NONCE is cleared from flags as well) + * tsa_name = NULL + * Important: after calling this method TS_VFY_SIGNATURE should be added! + */ +TS_VERIFY_CTX *TS_REQ_to_TS_VERIFY_CTX(TS_REQ *req, TS_VERIFY_CTX *ctx); + +/* Function declarations for TS_RESP defined in ts/ts_resp_print.c */ + +int TS_RESP_print_bio(BIO *bio, TS_RESP *a); +int TS_STATUS_INFO_print_bio(BIO *bio, TS_STATUS_INFO *a); +int TS_TST_INFO_print_bio(BIO *bio, TS_TST_INFO *a); + +/* Common utility functions defined in ts/ts_lib.c */ + +int TS_ASN1_INTEGER_print_bio(BIO *bio, const ASN1_INTEGER *num); +int TS_OBJ_print_bio(BIO *bio, const ASN1_OBJECT *obj); +int TS_ext_print_bio(BIO *bio, const STACK_OF(X509_EXTENSION) *extensions); +int TS_X509_ALGOR_print_bio(BIO *bio, const X509_ALGOR *alg); +int TS_MSG_IMPRINT_print_bio(BIO *bio, TS_MSG_IMPRINT *msg); + +/* + * Function declarations for handling configuration options, defined in + * ts/ts_conf.c + */ + +X509 *TS_CONF_load_cert(const char *file); +STACK_OF(X509) *TS_CONF_load_certs(const char *file); +EVP_PKEY *TS_CONF_load_key(const char *file, const char *pass); +const char *TS_CONF_get_tsa_section(CONF *conf, const char *section); +int TS_CONF_set_serial(CONF *conf, const char *section, TS_serial_cb cb, + TS_RESP_CTX *ctx); +int TS_CONF_set_crypto_device(CONF *conf, const char *section, + const char *device); +int TS_CONF_set_default_engine(const char *name); +int TS_CONF_set_signer_cert(CONF *conf, const char *section, + const char *cert, TS_RESP_CTX *ctx); +int TS_CONF_set_certs(CONF *conf, const char *section, const char *certs, + TS_RESP_CTX *ctx); +int TS_CONF_set_signer_key(CONF *conf, const char *section, + const char *key, const char *pass, + TS_RESP_CTX *ctx); +int TS_CONF_set_def_policy(CONF *conf, const char *section, + const char *policy, TS_RESP_CTX *ctx); +int TS_CONF_set_policies(CONF *conf, const char *section, TS_RESP_CTX *ctx); +int TS_CONF_set_digests(CONF *conf, const char *section, TS_RESP_CTX *ctx); +int TS_CONF_set_accuracy(CONF *conf, const char *section, TS_RESP_CTX *ctx); +int TS_CONF_set_clock_precision_digits(CONF *conf, const char *section, + TS_RESP_CTX *ctx); +int TS_CONF_set_ordering(CONF *conf, const char *section, TS_RESP_CTX *ctx); +int TS_CONF_set_tsa_name(CONF *conf, const char *section, TS_RESP_CTX *ctx); +int TS_CONF_set_ess_cert_id_chain(CONF *conf, const char *section, + TS_RESP_CTX *ctx); + +/* -------------------------------------------------- */ +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_TS_strings(void); + +/* Error codes for the TS functions. */ + +/* Function codes. */ +# define TS_F_D2I_TS_RESP 147 +# define TS_F_DEF_SERIAL_CB 110 +# define TS_F_DEF_TIME_CB 111 +# define TS_F_ESS_ADD_SIGNING_CERT 112 +# define TS_F_ESS_CERT_ID_NEW_INIT 113 +# define TS_F_ESS_SIGNING_CERT_NEW_INIT 114 +# define TS_F_INT_TS_RESP_VERIFY_TOKEN 149 +# define TS_F_PKCS7_TO_TS_TST_INFO 148 +# define TS_F_TS_ACCURACY_SET_MICROS 115 +# define TS_F_TS_ACCURACY_SET_MILLIS 116 +# define TS_F_TS_ACCURACY_SET_SECONDS 117 +# define TS_F_TS_CHECK_IMPRINTS 100 +# define TS_F_TS_CHECK_NONCES 101 +# define TS_F_TS_CHECK_POLICY 102 +# define TS_F_TS_CHECK_SIGNING_CERTS 103 +# define TS_F_TS_CHECK_STATUS_INFO 104 +# define TS_F_TS_COMPUTE_IMPRINT 145 +# define TS_F_TS_CONF_SET_DEFAULT_ENGINE 146 +# define TS_F_TS_GET_STATUS_TEXT 105 +# define TS_F_TS_MSG_IMPRINT_SET_ALGO 118 +# define TS_F_TS_REQ_SET_MSG_IMPRINT 119 +# define TS_F_TS_REQ_SET_NONCE 120 +# define TS_F_TS_REQ_SET_POLICY_ID 121 +# define TS_F_TS_RESP_CREATE_RESPONSE 122 +# define TS_F_TS_RESP_CREATE_TST_INFO 123 +# define TS_F_TS_RESP_CTX_ADD_FAILURE_INFO 124 +# define TS_F_TS_RESP_CTX_ADD_MD 125 +# define TS_F_TS_RESP_CTX_ADD_POLICY 126 +# define TS_F_TS_RESP_CTX_NEW 127 +# define TS_F_TS_RESP_CTX_SET_ACCURACY 128 +# define TS_F_TS_RESP_CTX_SET_CERTS 129 +# define TS_F_TS_RESP_CTX_SET_DEF_POLICY 130 +# define TS_F_TS_RESP_CTX_SET_SIGNER_CERT 131 +# define TS_F_TS_RESP_CTX_SET_STATUS_INFO 132 +# define TS_F_TS_RESP_GET_POLICY 133 +# define TS_F_TS_RESP_SET_GENTIME_WITH_PRECISION 134 +# define TS_F_TS_RESP_SET_STATUS_INFO 135 +# define TS_F_TS_RESP_SET_TST_INFO 150 +# define TS_F_TS_RESP_SIGN 136 +# define TS_F_TS_RESP_VERIFY_SIGNATURE 106 +# define TS_F_TS_RESP_VERIFY_TOKEN 107 +# define TS_F_TS_TST_INFO_SET_ACCURACY 137 +# define TS_F_TS_TST_INFO_SET_MSG_IMPRINT 138 +# define TS_F_TS_TST_INFO_SET_NONCE 139 +# define TS_F_TS_TST_INFO_SET_POLICY_ID 140 +# define TS_F_TS_TST_INFO_SET_SERIAL 141 +# define TS_F_TS_TST_INFO_SET_TIME 142 +# define TS_F_TS_TST_INFO_SET_TSA 143 +# define TS_F_TS_VERIFY 108 +# define TS_F_TS_VERIFY_CERT 109 +# define TS_F_TS_VERIFY_CTX_NEW 144 + +/* Reason codes. */ +# define TS_R_BAD_PKCS7_TYPE 132 +# define TS_R_BAD_TYPE 133 +# define TS_R_CERTIFICATE_VERIFY_ERROR 100 +# define TS_R_COULD_NOT_SET_ENGINE 127 +# define TS_R_COULD_NOT_SET_TIME 115 +# define TS_R_D2I_TS_RESP_INT_FAILED 128 +# define TS_R_DETACHED_CONTENT 134 +# define TS_R_ESS_ADD_SIGNING_CERT_ERROR 116 +# define TS_R_ESS_SIGNING_CERTIFICATE_ERROR 101 +# define TS_R_INVALID_NULL_POINTER 102 +# define TS_R_INVALID_SIGNER_CERTIFICATE_PURPOSE 117 +# define TS_R_MESSAGE_IMPRINT_MISMATCH 103 +# define TS_R_NONCE_MISMATCH 104 +# define TS_R_NONCE_NOT_RETURNED 105 +# define TS_R_NO_CONTENT 106 +# define TS_R_NO_TIME_STAMP_TOKEN 107 +# define TS_R_PKCS7_ADD_SIGNATURE_ERROR 118 +# define TS_R_PKCS7_ADD_SIGNED_ATTR_ERROR 119 +# define TS_R_PKCS7_TO_TS_TST_INFO_FAILED 129 +# define TS_R_POLICY_MISMATCH 108 +# define TS_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE 120 +# define TS_R_RESPONSE_SETUP_ERROR 121 +# define TS_R_SIGNATURE_FAILURE 109 +# define TS_R_THERE_MUST_BE_ONE_SIGNER 110 +# define TS_R_TIME_SYSCALL_ERROR 122 +# define TS_R_TOKEN_NOT_PRESENT 130 +# define TS_R_TOKEN_PRESENT 131 +# define TS_R_TSA_NAME_MISMATCH 111 +# define TS_R_TSA_UNTRUSTED 112 +# define TS_R_TST_INFO_SETUP_ERROR 123 +# define TS_R_TS_DATASIGN 124 +# define TS_R_UNACCEPTABLE_POLICY 125 +# define TS_R_UNSUPPORTED_MD_ALGORITHM 126 +# define TS_R_UNSUPPORTED_VERSION 113 +# define TS_R_WRONG_CONTENT_TYPE 114 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/win/openssl/include/openssl/txt_db.h b/hdssd/external/win/openssl/include/openssl/txt_db.h new file mode 100644 index 0000000..98e23a2 --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/txt_db.h @@ -0,0 +1,112 @@ +/* crypto/txt_db/txt_db.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_TXT_DB_H +# define HEADER_TXT_DB_H + +# include +# ifndef OPENSSL_NO_BIO +# include +# endif +# include +# include + +# define DB_ERROR_OK 0 +# define DB_ERROR_MALLOC 1 +# define DB_ERROR_INDEX_CLASH 2 +# define DB_ERROR_INDEX_OUT_OF_RANGE 3 +# define DB_ERROR_NO_INDEX 4 +# define DB_ERROR_INSERT_INDEX_CLASH 5 + +#ifdef __cplusplus +extern "C" { +#endif + +typedef OPENSSL_STRING *OPENSSL_PSTRING; +DECLARE_SPECIAL_STACK_OF(OPENSSL_PSTRING, OPENSSL_STRING) + +typedef struct txt_db_st { + int num_fields; + STACK_OF(OPENSSL_PSTRING) *data; + LHASH_OF(OPENSSL_STRING) **index; + int (**qual) (OPENSSL_STRING *); + long error; + long arg1; + long arg2; + OPENSSL_STRING *arg_row; +} TXT_DB; + +# ifndef OPENSSL_NO_BIO +TXT_DB *TXT_DB_read(BIO *in, int num); +long TXT_DB_write(BIO *out, TXT_DB *db); +# else +TXT_DB *TXT_DB_read(char *in, int num); +long TXT_DB_write(char *out, TXT_DB *db); +# endif +int TXT_DB_create_index(TXT_DB *db, int field, int (*qual) (OPENSSL_STRING *), + LHASH_HASH_FN_TYPE hash, LHASH_COMP_FN_TYPE cmp); +void TXT_DB_free(TXT_DB *db); +OPENSSL_STRING *TXT_DB_get_by_index(TXT_DB *db, int idx, + OPENSSL_STRING *value); +int TXT_DB_insert(TXT_DB *db, OPENSSL_STRING *value); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/win/openssl/include/openssl/ui.h b/hdssd/external/win/openssl/include/openssl/ui.h new file mode 100644 index 0000000..0dc1633 --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/ui.h @@ -0,0 +1,415 @@ +/* crypto/ui/ui.h */ +/* + * Written by Richard Levitte (richard@levitte.org) for the OpenSSL project + * 2001. + */ +/* ==================================================================== + * Copyright (c) 2001 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_UI_H +# define HEADER_UI_H + +# ifndef OPENSSL_NO_DEPRECATED +# include +# endif +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Declared already in ossl_typ.h */ +/* typedef struct ui_st UI; */ +/* typedef struct ui_method_st UI_METHOD; */ + +/* + * All the following functions return -1 or NULL on error and in some cases + * (UI_process()) -2 if interrupted or in some other way cancelled. When + * everything is fine, they return 0, a positive value or a non-NULL pointer, + * all depending on their purpose. + */ + +/* Creators and destructor. */ +UI *UI_new(void); +UI *UI_new_method(const UI_METHOD *method); +void UI_free(UI *ui); + +/*- + The following functions are used to add strings to be printed and prompt + strings to prompt for data. The names are UI_{add,dup}__string + and UI_{add,dup}_input_boolean. + + UI_{add,dup}__string have the following meanings: + add add a text or prompt string. The pointers given to these + functions are used verbatim, no copying is done. + dup make a copy of the text or prompt string, then add the copy + to the collection of strings in the user interface. + + The function is a name for the functionality that the given + string shall be used for. It can be one of: + input use the string as data prompt. + verify use the string as verification prompt. This + is used to verify a previous input. + info use the string for informational output. + error use the string for error output. + Honestly, there's currently no difference between info and error for the + moment. + + UI_{add,dup}_input_boolean have the same semantics for "add" and "dup", + and are typically used when one wants to prompt for a yes/no response. + + All of the functions in this group take a UI and a prompt string. + The string input and verify addition functions also take a flag argument, + a buffer for the result to end up with, a minimum input size and a maximum + input size (the result buffer MUST be large enough to be able to contain + the maximum number of characters). Additionally, the verify addition + functions takes another buffer to compare the result against. + The boolean input functions take an action description string (which should + be safe to ignore if the expected user action is obvious, for example with + a dialog box with an OK button and a Cancel button), a string of acceptable + characters to mean OK and to mean Cancel. The two last strings are checked + to make sure they don't have common characters. Additionally, the same + flag argument as for the string input is taken, as well as a result buffer. + The result buffer is required to be at least one byte long. Depending on + the answer, the first character from the OK or the Cancel character strings + will be stored in the first byte of the result buffer. No NUL will be + added, so the result is *not* a string. + + On success, the all return an index of the added information. That index + is usefull when retrieving results with UI_get0_result(). */ +int UI_add_input_string(UI *ui, const char *prompt, int flags, + char *result_buf, int minsize, int maxsize); +int UI_dup_input_string(UI *ui, const char *prompt, int flags, + char *result_buf, int minsize, int maxsize); +int UI_add_verify_string(UI *ui, const char *prompt, int flags, + char *result_buf, int minsize, int maxsize, + const char *test_buf); +int UI_dup_verify_string(UI *ui, const char *prompt, int flags, + char *result_buf, int minsize, int maxsize, + const char *test_buf); +int UI_add_input_boolean(UI *ui, const char *prompt, const char *action_desc, + const char *ok_chars, const char *cancel_chars, + int flags, char *result_buf); +int UI_dup_input_boolean(UI *ui, const char *prompt, const char *action_desc, + const char *ok_chars, const char *cancel_chars, + int flags, char *result_buf); +int UI_add_info_string(UI *ui, const char *text); +int UI_dup_info_string(UI *ui, const char *text); +int UI_add_error_string(UI *ui, const char *text); +int UI_dup_error_string(UI *ui, const char *text); + +/* These are the possible flags. They can be or'ed together. */ +/* Use to have echoing of input */ +# define UI_INPUT_FLAG_ECHO 0x01 +/* + * Use a default password. Where that password is found is completely up to + * the application, it might for example be in the user data set with + * UI_add_user_data(). It is not recommended to have more than one input in + * each UI being marked with this flag, or the application might get + * confused. + */ +# define UI_INPUT_FLAG_DEFAULT_PWD 0x02 + +/*- + * The user of these routines may want to define flags of their own. The core + * UI won't look at those, but will pass them on to the method routines. They + * must use higher bits so they don't get confused with the UI bits above. + * UI_INPUT_FLAG_USER_BASE tells which is the lowest bit to use. A good + * example of use is this: + * + * #define MY_UI_FLAG1 (0x01 << UI_INPUT_FLAG_USER_BASE) + * +*/ +# define UI_INPUT_FLAG_USER_BASE 16 + +/*- + * The following function helps construct a prompt. object_desc is a + * textual short description of the object, for example "pass phrase", + * and object_name is the name of the object (might be a card name or + * a file name. + * The returned string shall always be allocated on the heap with + * OPENSSL_malloc(), and need to be free'd with OPENSSL_free(). + * + * If the ui_method doesn't contain a pointer to a user-defined prompt + * constructor, a default string is built, looking like this: + * + * "Enter {object_desc} for {object_name}:" + * + * So, if object_desc has the value "pass phrase" and object_name has + * the value "foo.key", the resulting string is: + * + * "Enter pass phrase for foo.key:" +*/ +char *UI_construct_prompt(UI *ui_method, + const char *object_desc, const char *object_name); + +/* + * The following function is used to store a pointer to user-specific data. + * Any previous such pointer will be returned and replaced. + * + * For callback purposes, this function makes a lot more sense than using + * ex_data, since the latter requires that different parts of OpenSSL or + * applications share the same ex_data index. + * + * Note that the UI_OpenSSL() method completely ignores the user data. Other + * methods may not, however. + */ +void *UI_add_user_data(UI *ui, void *user_data); +/* We need a user data retrieving function as well. */ +void *UI_get0_user_data(UI *ui); + +/* Return the result associated with a prompt given with the index i. */ +const char *UI_get0_result(UI *ui, int i); + +/* When all strings have been added, process the whole thing. */ +int UI_process(UI *ui); + +/* + * Give a user interface parametrised control commands. This can be used to + * send down an integer, a data pointer or a function pointer, as well as be + * used to get information from a UI. + */ +int UI_ctrl(UI *ui, int cmd, long i, void *p, void (*f) (void)); + +/* The commands */ +/* + * Use UI_CONTROL_PRINT_ERRORS with the value 1 to have UI_process print the + * OpenSSL error stack before printing any info or added error messages and + * before any prompting. + */ +# define UI_CTRL_PRINT_ERRORS 1 +/* + * Check if a UI_process() is possible to do again with the same instance of + * a user interface. This makes UI_ctrl() return 1 if it is redoable, and 0 + * if not. + */ +# define UI_CTRL_IS_REDOABLE 2 + +/* Some methods may use extra data */ +# define UI_set_app_data(s,arg) UI_set_ex_data(s,0,arg) +# define UI_get_app_data(s) UI_get_ex_data(s,0) +int UI_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); +int UI_set_ex_data(UI *r, int idx, void *arg); +void *UI_get_ex_data(UI *r, int idx); + +/* Use specific methods instead of the built-in one */ +void UI_set_default_method(const UI_METHOD *meth); +const UI_METHOD *UI_get_default_method(void); +const UI_METHOD *UI_get_method(UI *ui); +const UI_METHOD *UI_set_method(UI *ui, const UI_METHOD *meth); + +/* The method with all the built-in thingies */ +UI_METHOD *UI_OpenSSL(void); + +/* ---------- For method writers ---------- */ +/*- + A method contains a number of functions that implement the low level + of the User Interface. The functions are: + + an opener This function starts a session, maybe by opening + a channel to a tty, or by opening a window. + a writer This function is called to write a given string, + maybe to the tty, maybe as a field label in a + window. + a flusher This function is called to flush everything that + has been output so far. It can be used to actually + display a dialog box after it has been built. + a reader This function is called to read a given prompt, + maybe from the tty, maybe from a field in a + window. Note that it's called wth all string + structures, not only the prompt ones, so it must + check such things itself. + a closer This function closes the session, maybe by closing + the channel to the tty, or closing the window. + + All these functions are expected to return: + + 0 on error. + 1 on success. + -1 on out-of-band events, for example if some prompting has + been canceled (by pressing Ctrl-C, for example). This is + only checked when returned by the flusher or the reader. + + The way this is used, the opener is first called, then the writer for all + strings, then the flusher, then the reader for all strings and finally the + closer. Note that if you want to prompt from a terminal or other command + line interface, the best is to have the reader also write the prompts + instead of having the writer do it. If you want to prompt from a dialog + box, the writer can be used to build up the contents of the box, and the + flusher to actually display the box and run the event loop until all data + has been given, after which the reader only grabs the given data and puts + them back into the UI strings. + + All method functions take a UI as argument. Additionally, the writer and + the reader take a UI_STRING. +*/ + +/* + * The UI_STRING type is the data structure that contains all the needed info + * about a string or a prompt, including test data for a verification prompt. + */ +typedef struct ui_string_st UI_STRING; +DECLARE_STACK_OF(UI_STRING) + +/* + * The different types of strings that are currently supported. This is only + * needed by method authors. + */ +enum UI_string_types { + UIT_NONE = 0, + UIT_PROMPT, /* Prompt for a string */ + UIT_VERIFY, /* Prompt for a string and verify */ + UIT_BOOLEAN, /* Prompt for a yes/no response */ + UIT_INFO, /* Send info to the user */ + UIT_ERROR /* Send an error message to the user */ +}; + +/* Create and manipulate methods */ +UI_METHOD *UI_create_method(char *name); +void UI_destroy_method(UI_METHOD *ui_method); +int UI_method_set_opener(UI_METHOD *method, int (*opener) (UI *ui)); +int UI_method_set_writer(UI_METHOD *method, + int (*writer) (UI *ui, UI_STRING *uis)); +int UI_method_set_flusher(UI_METHOD *method, int (*flusher) (UI *ui)); +int UI_method_set_reader(UI_METHOD *method, + int (*reader) (UI *ui, UI_STRING *uis)); +int UI_method_set_closer(UI_METHOD *method, int (*closer) (UI *ui)); +int UI_method_set_prompt_constructor(UI_METHOD *method, + char *(*prompt_constructor) (UI *ui, + const char + *object_desc, + const char + *object_name)); +int (*UI_method_get_opener(UI_METHOD *method)) (UI *); +int (*UI_method_get_writer(UI_METHOD *method)) (UI *, UI_STRING *); +int (*UI_method_get_flusher(UI_METHOD *method)) (UI *); +int (*UI_method_get_reader(UI_METHOD *method)) (UI *, UI_STRING *); +int (*UI_method_get_closer(UI_METHOD *method)) (UI *); +char *(*UI_method_get_prompt_constructor(UI_METHOD *method)) (UI *, + const char *, + const char *); + +/* + * The following functions are helpers for method writers to access relevant + * data from a UI_STRING. + */ + +/* Return type of the UI_STRING */ +enum UI_string_types UI_get_string_type(UI_STRING *uis); +/* Return input flags of the UI_STRING */ +int UI_get_input_flags(UI_STRING *uis); +/* Return the actual string to output (the prompt, info or error) */ +const char *UI_get0_output_string(UI_STRING *uis); +/* + * Return the optional action string to output (the boolean promtp + * instruction) + */ +const char *UI_get0_action_string(UI_STRING *uis); +/* Return the result of a prompt */ +const char *UI_get0_result_string(UI_STRING *uis); +/* + * Return the string to test the result against. Only useful with verifies. + */ +const char *UI_get0_test_string(UI_STRING *uis); +/* Return the required minimum size of the result */ +int UI_get_result_minsize(UI_STRING *uis); +/* Return the required maximum size of the result */ +int UI_get_result_maxsize(UI_STRING *uis); +/* Set the result of a UI_STRING. */ +int UI_set_result(UI *ui, UI_STRING *uis, const char *result); + +/* A couple of popular utility functions */ +int UI_UTIL_read_pw_string(char *buf, int length, const char *prompt, + int verify); +int UI_UTIL_read_pw(char *buf, char *buff, int size, const char *prompt, + int verify); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_UI_strings(void); + +/* Error codes for the UI functions. */ + +/* Function codes. */ +# define UI_F_GENERAL_ALLOCATE_BOOLEAN 108 +# define UI_F_GENERAL_ALLOCATE_PROMPT 109 +# define UI_F_GENERAL_ALLOCATE_STRING 100 +# define UI_F_UI_CTRL 111 +# define UI_F_UI_DUP_ERROR_STRING 101 +# define UI_F_UI_DUP_INFO_STRING 102 +# define UI_F_UI_DUP_INPUT_BOOLEAN 110 +# define UI_F_UI_DUP_INPUT_STRING 103 +# define UI_F_UI_DUP_VERIFY_STRING 106 +# define UI_F_UI_GET0_RESULT 107 +# define UI_F_UI_NEW_METHOD 104 +# define UI_F_UI_SET_RESULT 105 + +/* Reason codes. */ +# define UI_R_COMMON_OK_AND_CANCEL_CHARACTERS 104 +# define UI_R_INDEX_TOO_LARGE 102 +# define UI_R_INDEX_TOO_SMALL 103 +# define UI_R_NO_RESULT_BUFFER 105 +# define UI_R_RESULT_TOO_LARGE 100 +# define UI_R_RESULT_TOO_SMALL 101 +# define UI_R_UNKNOWN_CONTROL_COMMAND 106 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/win/openssl/include/openssl/ui_compat.h b/hdssd/external/win/openssl/include/openssl/ui_compat.h new file mode 100644 index 0000000..bf54154 --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/ui_compat.h @@ -0,0 +1,88 @@ +/* crypto/ui/ui.h */ +/* + * Written by Richard Levitte (richard@levitte.org) for the OpenSSL project + * 2001. + */ +/* ==================================================================== + * Copyright (c) 2001 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_UI_COMPAT_H +# define HEADER_UI_COMPAT_H + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * The following functions were previously part of the DES section, and are + * provided here for backward compatibility reasons. + */ + +# define des_read_pw_string(b,l,p,v) \ + _ossl_old_des_read_pw_string((b),(l),(p),(v)) +# define des_read_pw(b,bf,s,p,v) \ + _ossl_old_des_read_pw((b),(bf),(s),(p),(v)) + +int _ossl_old_des_read_pw_string(char *buf, int length, const char *prompt, + int verify); +int _ossl_old_des_read_pw(char *buf, char *buff, int size, const char *prompt, + int verify); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/win/openssl/include/openssl/whrlpool.h b/hdssd/external/win/openssl/include/openssl/whrlpool.h new file mode 100644 index 0000000..73c749d --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/whrlpool.h @@ -0,0 +1,41 @@ +#ifndef HEADER_WHRLPOOL_H +# define HEADER_WHRLPOOL_H + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# define WHIRLPOOL_DIGEST_LENGTH (512/8) +# define WHIRLPOOL_BBLOCK 512 +# define WHIRLPOOL_COUNTER (256/8) + +typedef struct { + union { + unsigned char c[WHIRLPOOL_DIGEST_LENGTH]; + /* double q is here to ensure 64-bit alignment */ + double q[WHIRLPOOL_DIGEST_LENGTH / sizeof(double)]; + } H; + unsigned char data[WHIRLPOOL_BBLOCK / 8]; + unsigned int bitoff; + size_t bitlen[WHIRLPOOL_COUNTER / sizeof(size_t)]; +} WHIRLPOOL_CTX; + +# ifndef OPENSSL_NO_WHIRLPOOL +# ifdef OPENSSL_FIPS +int private_WHIRLPOOL_Init(WHIRLPOOL_CTX *c); +# endif +int WHIRLPOOL_Init(WHIRLPOOL_CTX *c); +int WHIRLPOOL_Update(WHIRLPOOL_CTX *c, const void *inp, size_t bytes); +void WHIRLPOOL_BitUpdate(WHIRLPOOL_CTX *c, const void *inp, size_t bits); +int WHIRLPOOL_Final(unsigned char *md, WHIRLPOOL_CTX *c); +unsigned char *WHIRLPOOL(const void *inp, size_t bytes, unsigned char *md); +# endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hdssd/external/win/openssl/include/openssl/x509.h b/hdssd/external/win/openssl/include/openssl/x509.h new file mode 100644 index 0000000..99337b8 --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/x509.h @@ -0,0 +1,1327 @@ +/* crypto/x509/x509.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * ECDH support in OpenSSL originally developed by + * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project. + */ + +#ifndef HEADER_X509_H +# define HEADER_X509_H + +# include +# include +# ifndef OPENSSL_NO_BUFFER +# include +# endif +# ifndef OPENSSL_NO_EVP +# include +# endif +# ifndef OPENSSL_NO_BIO +# include +# endif +# include +# include +# include + +# ifndef OPENSSL_NO_EC +# include +# endif + +# ifndef OPENSSL_NO_ECDSA +# include +# endif + +# ifndef OPENSSL_NO_ECDH +# include +# endif + +# ifndef OPENSSL_NO_DEPRECATED +# ifndef OPENSSL_NO_RSA +# include +# endif +# ifndef OPENSSL_NO_DSA +# include +# endif +# ifndef OPENSSL_NO_DH +# include +# endif +# endif + +# ifndef OPENSSL_NO_SHA +# include +# endif +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# ifdef OPENSSL_SYS_WIN32 +/* Under Win32 these are defined in wincrypt.h */ +# undef X509_NAME +# undef X509_CERT_PAIR +# undef X509_EXTENSIONS +# endif + +# define X509_FILETYPE_PEM 1 +# define X509_FILETYPE_ASN1 2 +# define X509_FILETYPE_DEFAULT 3 + +# define X509v3_KU_DIGITAL_SIGNATURE 0x0080 +# define X509v3_KU_NON_REPUDIATION 0x0040 +# define X509v3_KU_KEY_ENCIPHERMENT 0x0020 +# define X509v3_KU_DATA_ENCIPHERMENT 0x0010 +# define X509v3_KU_KEY_AGREEMENT 0x0008 +# define X509v3_KU_KEY_CERT_SIGN 0x0004 +# define X509v3_KU_CRL_SIGN 0x0002 +# define X509v3_KU_ENCIPHER_ONLY 0x0001 +# define X509v3_KU_DECIPHER_ONLY 0x8000 +# define X509v3_KU_UNDEF 0xffff + +typedef struct X509_objects_st { + int nid; + int (*a2i) (void); + int (*i2a) (void); +} X509_OBJECTS; + +struct X509_algor_st { + ASN1_OBJECT *algorithm; + ASN1_TYPE *parameter; +} /* X509_ALGOR */ ; + +DECLARE_ASN1_SET_OF(X509_ALGOR) + +typedef STACK_OF(X509_ALGOR) X509_ALGORS; + +typedef struct X509_val_st { + ASN1_TIME *notBefore; + ASN1_TIME *notAfter; +} X509_VAL; + +struct X509_pubkey_st { + X509_ALGOR *algor; + ASN1_BIT_STRING *public_key; + EVP_PKEY *pkey; +}; + +typedef struct X509_sig_st { + X509_ALGOR *algor; + ASN1_OCTET_STRING *digest; +} X509_SIG; + +typedef struct X509_name_entry_st { + ASN1_OBJECT *object; + ASN1_STRING *value; + int set; + int size; /* temp variable */ +} X509_NAME_ENTRY; + +DECLARE_STACK_OF(X509_NAME_ENTRY) +DECLARE_ASN1_SET_OF(X509_NAME_ENTRY) + +/* we always keep X509_NAMEs in 2 forms. */ +struct X509_name_st { + STACK_OF(X509_NAME_ENTRY) *entries; + int modified; /* true if 'bytes' needs to be built */ +# ifndef OPENSSL_NO_BUFFER + BUF_MEM *bytes; +# else + char *bytes; +# endif +/* unsigned long hash; Keep the hash around for lookups */ + unsigned char *canon_enc; + int canon_enclen; +} /* X509_NAME */ ; + +DECLARE_STACK_OF(X509_NAME) + +# define X509_EX_V_NETSCAPE_HACK 0x8000 +# define X509_EX_V_INIT 0x0001 +typedef struct X509_extension_st { + ASN1_OBJECT *object; + ASN1_BOOLEAN critical; + ASN1_OCTET_STRING *value; +} X509_EXTENSION; + +typedef STACK_OF(X509_EXTENSION) X509_EXTENSIONS; + +DECLARE_STACK_OF(X509_EXTENSION) +DECLARE_ASN1_SET_OF(X509_EXTENSION) + +/* a sequence of these are used */ +typedef struct x509_attributes_st { + ASN1_OBJECT *object; + int single; /* 0 for a set, 1 for a single item (which is + * wrong) */ + union { + char *ptr; + /* + * 0 + */ STACK_OF(ASN1_TYPE) *set; + /* + * 1 + */ ASN1_TYPE *single; + } value; +} X509_ATTRIBUTE; + +DECLARE_STACK_OF(X509_ATTRIBUTE) +DECLARE_ASN1_SET_OF(X509_ATTRIBUTE) + +typedef struct X509_req_info_st { + ASN1_ENCODING enc; + ASN1_INTEGER *version; + X509_NAME *subject; + X509_PUBKEY *pubkey; + /* d=2 hl=2 l= 0 cons: cont: 00 */ + STACK_OF(X509_ATTRIBUTE) *attributes; /* [ 0 ] */ +} X509_REQ_INFO; + +typedef struct X509_req_st { + X509_REQ_INFO *req_info; + X509_ALGOR *sig_alg; + ASN1_BIT_STRING *signature; + int references; +} X509_REQ; + +typedef struct x509_cinf_st { + ASN1_INTEGER *version; /* [ 0 ] default of v1 */ + ASN1_INTEGER *serialNumber; + X509_ALGOR *signature; + X509_NAME *issuer; + X509_VAL *validity; + X509_NAME *subject; + X509_PUBKEY *key; + ASN1_BIT_STRING *issuerUID; /* [ 1 ] optional in v2 */ + ASN1_BIT_STRING *subjectUID; /* [ 2 ] optional in v2 */ + STACK_OF(X509_EXTENSION) *extensions; /* [ 3 ] optional in v3 */ + ASN1_ENCODING enc; +} X509_CINF; + +/* + * This stuff is certificate "auxiliary info" it contains details which are + * useful in certificate stores and databases. When used this is tagged onto + * the end of the certificate itself + */ + +typedef struct x509_cert_aux_st { + STACK_OF(ASN1_OBJECT) *trust; /* trusted uses */ + STACK_OF(ASN1_OBJECT) *reject; /* rejected uses */ + ASN1_UTF8STRING *alias; /* "friendly name" */ + ASN1_OCTET_STRING *keyid; /* key id of private key */ + STACK_OF(X509_ALGOR) *other; /* other unspecified info */ +} X509_CERT_AUX; + +struct x509_st { + X509_CINF *cert_info; + X509_ALGOR *sig_alg; + ASN1_BIT_STRING *signature; + int valid; + int references; + char *name; + CRYPTO_EX_DATA ex_data; + /* These contain copies of various extension values */ + long ex_pathlen; + long ex_pcpathlen; + unsigned long ex_flags; + unsigned long ex_kusage; + unsigned long ex_xkusage; + unsigned long ex_nscert; + ASN1_OCTET_STRING *skid; + AUTHORITY_KEYID *akid; + X509_POLICY_CACHE *policy_cache; + STACK_OF(DIST_POINT) *crldp; + STACK_OF(GENERAL_NAME) *altname; + NAME_CONSTRAINTS *nc; +# ifndef OPENSSL_NO_RFC3779 + STACK_OF(IPAddressFamily) *rfc3779_addr; + struct ASIdentifiers_st *rfc3779_asid; +# endif +# ifndef OPENSSL_NO_SHA + unsigned char sha1_hash[SHA_DIGEST_LENGTH]; +# endif + X509_CERT_AUX *aux; +} /* X509 */ ; + +DECLARE_STACK_OF(X509) +DECLARE_ASN1_SET_OF(X509) + +/* This is used for a table of trust checking functions */ + +typedef struct x509_trust_st { + int trust; + int flags; + int (*check_trust) (struct x509_trust_st *, X509 *, int); + char *name; + int arg1; + void *arg2; +} X509_TRUST; + +DECLARE_STACK_OF(X509_TRUST) + +typedef struct x509_cert_pair_st { + X509 *forward; + X509 *reverse; +} X509_CERT_PAIR; + +/* standard trust ids */ + +# define X509_TRUST_DEFAULT -1/* Only valid in purpose settings */ + +# define X509_TRUST_COMPAT 1 +# define X509_TRUST_SSL_CLIENT 2 +# define X509_TRUST_SSL_SERVER 3 +# define X509_TRUST_EMAIL 4 +# define X509_TRUST_OBJECT_SIGN 5 +# define X509_TRUST_OCSP_SIGN 6 +# define X509_TRUST_OCSP_REQUEST 7 +# define X509_TRUST_TSA 8 + +/* Keep these up to date! */ +# define X509_TRUST_MIN 1 +# define X509_TRUST_MAX 8 + +/* trust_flags values */ +# define X509_TRUST_DYNAMIC 1 +# define X509_TRUST_DYNAMIC_NAME 2 + +/* check_trust return codes */ + +# define X509_TRUST_TRUSTED 1 +# define X509_TRUST_REJECTED 2 +# define X509_TRUST_UNTRUSTED 3 + +/* Flags for X509_print_ex() */ + +# define X509_FLAG_COMPAT 0 +# define X509_FLAG_NO_HEADER 1L +# define X509_FLAG_NO_VERSION (1L << 1) +# define X509_FLAG_NO_SERIAL (1L << 2) +# define X509_FLAG_NO_SIGNAME (1L << 3) +# define X509_FLAG_NO_ISSUER (1L << 4) +# define X509_FLAG_NO_VALIDITY (1L << 5) +# define X509_FLAG_NO_SUBJECT (1L << 6) +# define X509_FLAG_NO_PUBKEY (1L << 7) +# define X509_FLAG_NO_EXTENSIONS (1L << 8) +# define X509_FLAG_NO_SIGDUMP (1L << 9) +# define X509_FLAG_NO_AUX (1L << 10) +# define X509_FLAG_NO_ATTRIBUTES (1L << 11) +# define X509_FLAG_NO_IDS (1L << 12) + +/* Flags specific to X509_NAME_print_ex() */ + +/* The field separator information */ + +# define XN_FLAG_SEP_MASK (0xf << 16) + +# define XN_FLAG_COMPAT 0/* Traditional SSLeay: use old + * X509_NAME_print */ +# define XN_FLAG_SEP_COMMA_PLUS (1 << 16)/* RFC2253 ,+ */ +# define XN_FLAG_SEP_CPLUS_SPC (2 << 16)/* ,+ spaced: more readable */ +# define XN_FLAG_SEP_SPLUS_SPC (3 << 16)/* ;+ spaced */ +# define XN_FLAG_SEP_MULTILINE (4 << 16)/* One line per field */ + +# define XN_FLAG_DN_REV (1 << 20)/* Reverse DN order */ + +/* How the field name is shown */ + +# define XN_FLAG_FN_MASK (0x3 << 21) + +# define XN_FLAG_FN_SN 0/* Object short name */ +# define XN_FLAG_FN_LN (1 << 21)/* Object long name */ +# define XN_FLAG_FN_OID (2 << 21)/* Always use OIDs */ +# define XN_FLAG_FN_NONE (3 << 21)/* No field names */ + +# define XN_FLAG_SPC_EQ (1 << 23)/* Put spaces round '=' */ + +/* + * This determines if we dump fields we don't recognise: RFC2253 requires + * this. + */ + +# define XN_FLAG_DUMP_UNKNOWN_FIELDS (1 << 24) + +# define XN_FLAG_FN_ALIGN (1 << 25)/* Align field names to 20 + * characters */ + +/* Complete set of RFC2253 flags */ + +# define XN_FLAG_RFC2253 (ASN1_STRFLGS_RFC2253 | \ + XN_FLAG_SEP_COMMA_PLUS | \ + XN_FLAG_DN_REV | \ + XN_FLAG_FN_SN | \ + XN_FLAG_DUMP_UNKNOWN_FIELDS) + +/* readable oneline form */ + +# define XN_FLAG_ONELINE (ASN1_STRFLGS_RFC2253 | \ + ASN1_STRFLGS_ESC_QUOTE | \ + XN_FLAG_SEP_CPLUS_SPC | \ + XN_FLAG_SPC_EQ | \ + XN_FLAG_FN_SN) + +/* readable multiline form */ + +# define XN_FLAG_MULTILINE (ASN1_STRFLGS_ESC_CTRL | \ + ASN1_STRFLGS_ESC_MSB | \ + XN_FLAG_SEP_MULTILINE | \ + XN_FLAG_SPC_EQ | \ + XN_FLAG_FN_LN | \ + XN_FLAG_FN_ALIGN) + +struct x509_revoked_st { + ASN1_INTEGER *serialNumber; + ASN1_TIME *revocationDate; + STACK_OF(X509_EXTENSION) /* optional */ *extensions; + /* Set up if indirect CRL */ + STACK_OF(GENERAL_NAME) *issuer; + /* Revocation reason */ + int reason; + int sequence; /* load sequence */ +}; + +DECLARE_STACK_OF(X509_REVOKED) +DECLARE_ASN1_SET_OF(X509_REVOKED) + +typedef struct X509_crl_info_st { + ASN1_INTEGER *version; + X509_ALGOR *sig_alg; + X509_NAME *issuer; + ASN1_TIME *lastUpdate; + ASN1_TIME *nextUpdate; + STACK_OF(X509_REVOKED) *revoked; + STACK_OF(X509_EXTENSION) /* [0] */ *extensions; + ASN1_ENCODING enc; +} X509_CRL_INFO; + +struct X509_crl_st { + /* actual signature */ + X509_CRL_INFO *crl; + X509_ALGOR *sig_alg; + ASN1_BIT_STRING *signature; + int references; + int flags; + /* Copies of various extensions */ + AUTHORITY_KEYID *akid; + ISSUING_DIST_POINT *idp; + /* Convenient breakdown of IDP */ + int idp_flags; + int idp_reasons; + /* CRL and base CRL numbers for delta processing */ + ASN1_INTEGER *crl_number; + ASN1_INTEGER *base_crl_number; +# ifndef OPENSSL_NO_SHA + unsigned char sha1_hash[SHA_DIGEST_LENGTH]; +# endif + STACK_OF(GENERAL_NAMES) *issuers; + const X509_CRL_METHOD *meth; + void *meth_data; +} /* X509_CRL */ ; + +DECLARE_STACK_OF(X509_CRL) +DECLARE_ASN1_SET_OF(X509_CRL) + +typedef struct private_key_st { + int version; + /* The PKCS#8 data types */ + X509_ALGOR *enc_algor; + ASN1_OCTET_STRING *enc_pkey; /* encrypted pub key */ + /* When decrypted, the following will not be NULL */ + EVP_PKEY *dec_pkey; + /* used to encrypt and decrypt */ + int key_length; + char *key_data; + int key_free; /* true if we should auto free key_data */ + /* expanded version of 'enc_algor' */ + EVP_CIPHER_INFO cipher; + int references; +} X509_PKEY; + +# ifndef OPENSSL_NO_EVP +typedef struct X509_info_st { + X509 *x509; + X509_CRL *crl; + X509_PKEY *x_pkey; + EVP_CIPHER_INFO enc_cipher; + int enc_len; + char *enc_data; + int references; +} X509_INFO; + +DECLARE_STACK_OF(X509_INFO) +# endif + +/* + * The next 2 structures and their 8 routines were sent to me by Pat Richard + * and are used to manipulate Netscapes spki structures - + * useful if you are writing a CA web page + */ +typedef struct Netscape_spkac_st { + X509_PUBKEY *pubkey; + ASN1_IA5STRING *challenge; /* challenge sent in atlas >= PR2 */ +} NETSCAPE_SPKAC; + +typedef struct Netscape_spki_st { + NETSCAPE_SPKAC *spkac; /* signed public key and challenge */ + X509_ALGOR *sig_algor; + ASN1_BIT_STRING *signature; +} NETSCAPE_SPKI; + +/* Netscape certificate sequence structure */ +typedef struct Netscape_certificate_sequence { + ASN1_OBJECT *type; + STACK_OF(X509) *certs; +} NETSCAPE_CERT_SEQUENCE; + +/*- Unused (and iv length is wrong) +typedef struct CBCParameter_st + { + unsigned char iv[8]; + } CBC_PARAM; +*/ + +/* Password based encryption structure */ + +typedef struct PBEPARAM_st { + ASN1_OCTET_STRING *salt; + ASN1_INTEGER *iter; +} PBEPARAM; + +/* Password based encryption V2 structures */ + +typedef struct PBE2PARAM_st { + X509_ALGOR *keyfunc; + X509_ALGOR *encryption; +} PBE2PARAM; + +typedef struct PBKDF2PARAM_st { +/* Usually OCTET STRING but could be anything */ + ASN1_TYPE *salt; + ASN1_INTEGER *iter; + ASN1_INTEGER *keylength; + X509_ALGOR *prf; +} PBKDF2PARAM; + +/* PKCS#8 private key info structure */ + +struct pkcs8_priv_key_info_st { + /* Flag for various broken formats */ + int broken; +# define PKCS8_OK 0 +# define PKCS8_NO_OCTET 1 +# define PKCS8_EMBEDDED_PARAM 2 +# define PKCS8_NS_DB 3 +# define PKCS8_NEG_PRIVKEY 4 + ASN1_INTEGER *version; + X509_ALGOR *pkeyalg; + /* Should be OCTET STRING but some are broken */ + ASN1_TYPE *pkey; + STACK_OF(X509_ATTRIBUTE) *attributes; +}; + +#ifdef __cplusplus +} +#endif + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# define X509_EXT_PACK_UNKNOWN 1 +# define X509_EXT_PACK_STRING 2 + +# define X509_get_version(x) ASN1_INTEGER_get((x)->cert_info->version) +/* #define X509_get_serialNumber(x) ((x)->cert_info->serialNumber) */ +# define X509_get_notBefore(x) ((x)->cert_info->validity->notBefore) +# define X509_get_notAfter(x) ((x)->cert_info->validity->notAfter) +# define X509_extract_key(x) X509_get_pubkey(x)/*****/ +# define X509_REQ_get_version(x) ASN1_INTEGER_get((x)->req_info->version) +# define X509_REQ_get_subject_name(x) ((x)->req_info->subject) +# define X509_REQ_extract_key(a) X509_REQ_get_pubkey(a) +# define X509_name_cmp(a,b) X509_NAME_cmp((a),(b)) +# define X509_get_signature_type(x) EVP_PKEY_type(OBJ_obj2nid((x)->sig_alg->algorithm)) + +# define X509_CRL_get_version(x) ASN1_INTEGER_get((x)->crl->version) +# define X509_CRL_get_lastUpdate(x) ((x)->crl->lastUpdate) +# define X509_CRL_get_nextUpdate(x) ((x)->crl->nextUpdate) +# define X509_CRL_get_issuer(x) ((x)->crl->issuer) +# define X509_CRL_get_REVOKED(x) ((x)->crl->revoked) + +void X509_CRL_set_default_method(const X509_CRL_METHOD *meth); +X509_CRL_METHOD *X509_CRL_METHOD_new(int (*crl_init) (X509_CRL *crl), + int (*crl_free) (X509_CRL *crl), + int (*crl_lookup) (X509_CRL *crl, + X509_REVOKED **ret, + ASN1_INTEGER *ser, + X509_NAME *issuer), + int (*crl_verify) (X509_CRL *crl, + EVP_PKEY *pk)); +void X509_CRL_METHOD_free(X509_CRL_METHOD *m); + +void X509_CRL_set_meth_data(X509_CRL *crl, void *dat); +void *X509_CRL_get_meth_data(X509_CRL *crl); + +/* + * This one is only used so that a binary form can output, as in + * i2d_X509_NAME(X509_get_X509_PUBKEY(x),&buf) + */ +# define X509_get_X509_PUBKEY(x) ((x)->cert_info->key) + +const char *X509_verify_cert_error_string(long n); + +# ifndef OPENSSL_NO_EVP +int X509_verify(X509 *a, EVP_PKEY *r); + +int X509_REQ_verify(X509_REQ *a, EVP_PKEY *r); +int X509_CRL_verify(X509_CRL *a, EVP_PKEY *r); +int NETSCAPE_SPKI_verify(NETSCAPE_SPKI *a, EVP_PKEY *r); + +NETSCAPE_SPKI *NETSCAPE_SPKI_b64_decode(const char *str, int len); +char *NETSCAPE_SPKI_b64_encode(NETSCAPE_SPKI *x); +EVP_PKEY *NETSCAPE_SPKI_get_pubkey(NETSCAPE_SPKI *x); +int NETSCAPE_SPKI_set_pubkey(NETSCAPE_SPKI *x, EVP_PKEY *pkey); + +int NETSCAPE_SPKI_print(BIO *out, NETSCAPE_SPKI *spki); + +int X509_signature_dump(BIO *bp, const ASN1_STRING *sig, int indent); +int X509_signature_print(BIO *bp, X509_ALGOR *alg, ASN1_STRING *sig); + +int X509_sign(X509 *x, EVP_PKEY *pkey, const EVP_MD *md); +int X509_sign_ctx(X509 *x, EVP_MD_CTX *ctx); +int X509_http_nbio(OCSP_REQ_CTX *rctx, X509 **pcert); +int X509_REQ_sign(X509_REQ *x, EVP_PKEY *pkey, const EVP_MD *md); +int X509_REQ_sign_ctx(X509_REQ *x, EVP_MD_CTX *ctx); +int X509_CRL_sign(X509_CRL *x, EVP_PKEY *pkey, const EVP_MD *md); +int X509_CRL_sign_ctx(X509_CRL *x, EVP_MD_CTX *ctx); +int X509_CRL_http_nbio(OCSP_REQ_CTX *rctx, X509_CRL **pcrl); +int NETSCAPE_SPKI_sign(NETSCAPE_SPKI *x, EVP_PKEY *pkey, const EVP_MD *md); + +int X509_pubkey_digest(const X509 *data, const EVP_MD *type, + unsigned char *md, unsigned int *len); +int X509_digest(const X509 *data, const EVP_MD *type, + unsigned char *md, unsigned int *len); +int X509_CRL_digest(const X509_CRL *data, const EVP_MD *type, + unsigned char *md, unsigned int *len); +int X509_REQ_digest(const X509_REQ *data, const EVP_MD *type, + unsigned char *md, unsigned int *len); +int X509_NAME_digest(const X509_NAME *data, const EVP_MD *type, + unsigned char *md, unsigned int *len); +# endif + +# ifndef OPENSSL_NO_FP_API +X509 *d2i_X509_fp(FILE *fp, X509 **x509); +int i2d_X509_fp(FILE *fp, X509 *x509); +X509_CRL *d2i_X509_CRL_fp(FILE *fp, X509_CRL **crl); +int i2d_X509_CRL_fp(FILE *fp, X509_CRL *crl); +X509_REQ *d2i_X509_REQ_fp(FILE *fp, X509_REQ **req); +int i2d_X509_REQ_fp(FILE *fp, X509_REQ *req); +# ifndef OPENSSL_NO_RSA +RSA *d2i_RSAPrivateKey_fp(FILE *fp, RSA **rsa); +int i2d_RSAPrivateKey_fp(FILE *fp, RSA *rsa); +RSA *d2i_RSAPublicKey_fp(FILE *fp, RSA **rsa); +int i2d_RSAPublicKey_fp(FILE *fp, RSA *rsa); +RSA *d2i_RSA_PUBKEY_fp(FILE *fp, RSA **rsa); +int i2d_RSA_PUBKEY_fp(FILE *fp, RSA *rsa); +# endif +# ifndef OPENSSL_NO_DSA +DSA *d2i_DSA_PUBKEY_fp(FILE *fp, DSA **dsa); +int i2d_DSA_PUBKEY_fp(FILE *fp, DSA *dsa); +DSA *d2i_DSAPrivateKey_fp(FILE *fp, DSA **dsa); +int i2d_DSAPrivateKey_fp(FILE *fp, DSA *dsa); +# endif +# ifndef OPENSSL_NO_EC +EC_KEY *d2i_EC_PUBKEY_fp(FILE *fp, EC_KEY **eckey); +int i2d_EC_PUBKEY_fp(FILE *fp, EC_KEY *eckey); +EC_KEY *d2i_ECPrivateKey_fp(FILE *fp, EC_KEY **eckey); +int i2d_ECPrivateKey_fp(FILE *fp, EC_KEY *eckey); +# endif +X509_SIG *d2i_PKCS8_fp(FILE *fp, X509_SIG **p8); +int i2d_PKCS8_fp(FILE *fp, X509_SIG *p8); +PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_fp(FILE *fp, + PKCS8_PRIV_KEY_INFO **p8inf); +int i2d_PKCS8_PRIV_KEY_INFO_fp(FILE *fp, PKCS8_PRIV_KEY_INFO *p8inf); +int i2d_PKCS8PrivateKeyInfo_fp(FILE *fp, EVP_PKEY *key); +int i2d_PrivateKey_fp(FILE *fp, EVP_PKEY *pkey); +EVP_PKEY *d2i_PrivateKey_fp(FILE *fp, EVP_PKEY **a); +int i2d_PUBKEY_fp(FILE *fp, EVP_PKEY *pkey); +EVP_PKEY *d2i_PUBKEY_fp(FILE *fp, EVP_PKEY **a); +# endif + +# ifndef OPENSSL_NO_BIO +X509 *d2i_X509_bio(BIO *bp, X509 **x509); +int i2d_X509_bio(BIO *bp, X509 *x509); +X509_CRL *d2i_X509_CRL_bio(BIO *bp, X509_CRL **crl); +int i2d_X509_CRL_bio(BIO *bp, X509_CRL *crl); +X509_REQ *d2i_X509_REQ_bio(BIO *bp, X509_REQ **req); +int i2d_X509_REQ_bio(BIO *bp, X509_REQ *req); +# ifndef OPENSSL_NO_RSA +RSA *d2i_RSAPrivateKey_bio(BIO *bp, RSA **rsa); +int i2d_RSAPrivateKey_bio(BIO *bp, RSA *rsa); +RSA *d2i_RSAPublicKey_bio(BIO *bp, RSA **rsa); +int i2d_RSAPublicKey_bio(BIO *bp, RSA *rsa); +RSA *d2i_RSA_PUBKEY_bio(BIO *bp, RSA **rsa); +int i2d_RSA_PUBKEY_bio(BIO *bp, RSA *rsa); +# endif +# ifndef OPENSSL_NO_DSA +DSA *d2i_DSA_PUBKEY_bio(BIO *bp, DSA **dsa); +int i2d_DSA_PUBKEY_bio(BIO *bp, DSA *dsa); +DSA *d2i_DSAPrivateKey_bio(BIO *bp, DSA **dsa); +int i2d_DSAPrivateKey_bio(BIO *bp, DSA *dsa); +# endif +# ifndef OPENSSL_NO_EC +EC_KEY *d2i_EC_PUBKEY_bio(BIO *bp, EC_KEY **eckey); +int i2d_EC_PUBKEY_bio(BIO *bp, EC_KEY *eckey); +EC_KEY *d2i_ECPrivateKey_bio(BIO *bp, EC_KEY **eckey); +int i2d_ECPrivateKey_bio(BIO *bp, EC_KEY *eckey); +# endif +X509_SIG *d2i_PKCS8_bio(BIO *bp, X509_SIG **p8); +int i2d_PKCS8_bio(BIO *bp, X509_SIG *p8); +PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_bio(BIO *bp, + PKCS8_PRIV_KEY_INFO **p8inf); +int i2d_PKCS8_PRIV_KEY_INFO_bio(BIO *bp, PKCS8_PRIV_KEY_INFO *p8inf); +int i2d_PKCS8PrivateKeyInfo_bio(BIO *bp, EVP_PKEY *key); +int i2d_PrivateKey_bio(BIO *bp, EVP_PKEY *pkey); +EVP_PKEY *d2i_PrivateKey_bio(BIO *bp, EVP_PKEY **a); +int i2d_PUBKEY_bio(BIO *bp, EVP_PKEY *pkey); +EVP_PKEY *d2i_PUBKEY_bio(BIO *bp, EVP_PKEY **a); +# endif + +X509 *X509_dup(X509 *x509); +X509_ATTRIBUTE *X509_ATTRIBUTE_dup(X509_ATTRIBUTE *xa); +X509_EXTENSION *X509_EXTENSION_dup(X509_EXTENSION *ex); +X509_CRL *X509_CRL_dup(X509_CRL *crl); +X509_REVOKED *X509_REVOKED_dup(X509_REVOKED *rev); +X509_REQ *X509_REQ_dup(X509_REQ *req); +X509_ALGOR *X509_ALGOR_dup(X509_ALGOR *xn); +int X509_ALGOR_set0(X509_ALGOR *alg, ASN1_OBJECT *aobj, int ptype, + void *pval); +void X509_ALGOR_get0(ASN1_OBJECT **paobj, int *pptype, void **ppval, + X509_ALGOR *algor); +void X509_ALGOR_set_md(X509_ALGOR *alg, const EVP_MD *md); +int X509_ALGOR_cmp(const X509_ALGOR *a, const X509_ALGOR *b); + +X509_NAME *X509_NAME_dup(X509_NAME *xn); +X509_NAME_ENTRY *X509_NAME_ENTRY_dup(X509_NAME_ENTRY *ne); + +int X509_cmp_time(const ASN1_TIME *s, time_t *t); +int X509_cmp_current_time(const ASN1_TIME *s); +ASN1_TIME *X509_time_adj(ASN1_TIME *s, long adj, time_t *t); +ASN1_TIME *X509_time_adj_ex(ASN1_TIME *s, + int offset_day, long offset_sec, time_t *t); +ASN1_TIME *X509_gmtime_adj(ASN1_TIME *s, long adj); + +const char *X509_get_default_cert_area(void); +const char *X509_get_default_cert_dir(void); +const char *X509_get_default_cert_file(void); +const char *X509_get_default_cert_dir_env(void); +const char *X509_get_default_cert_file_env(void); +const char *X509_get_default_private_dir(void); + +X509_REQ *X509_to_X509_REQ(X509 *x, EVP_PKEY *pkey, const EVP_MD *md); +X509 *X509_REQ_to_X509(X509_REQ *r, int days, EVP_PKEY *pkey); + +DECLARE_ASN1_FUNCTIONS(X509_ALGOR) +DECLARE_ASN1_ENCODE_FUNCTIONS(X509_ALGORS, X509_ALGORS, X509_ALGORS) +DECLARE_ASN1_FUNCTIONS(X509_VAL) + +DECLARE_ASN1_FUNCTIONS(X509_PUBKEY) + +int X509_PUBKEY_set(X509_PUBKEY **x, EVP_PKEY *pkey); +EVP_PKEY *X509_PUBKEY_get(X509_PUBKEY *key); +int X509_get_pubkey_parameters(EVP_PKEY *pkey, STACK_OF(X509) *chain); +int i2d_PUBKEY(EVP_PKEY *a, unsigned char **pp); +EVP_PKEY *d2i_PUBKEY(EVP_PKEY **a, const unsigned char **pp, long length); +# ifndef OPENSSL_NO_RSA +int i2d_RSA_PUBKEY(RSA *a, unsigned char **pp); +RSA *d2i_RSA_PUBKEY(RSA **a, const unsigned char **pp, long length); +# endif +# ifndef OPENSSL_NO_DSA +int i2d_DSA_PUBKEY(DSA *a, unsigned char **pp); +DSA *d2i_DSA_PUBKEY(DSA **a, const unsigned char **pp, long length); +# endif +# ifndef OPENSSL_NO_EC +int i2d_EC_PUBKEY(EC_KEY *a, unsigned char **pp); +EC_KEY *d2i_EC_PUBKEY(EC_KEY **a, const unsigned char **pp, long length); +# endif + +DECLARE_ASN1_FUNCTIONS(X509_SIG) +DECLARE_ASN1_FUNCTIONS(X509_REQ_INFO) +DECLARE_ASN1_FUNCTIONS(X509_REQ) + +DECLARE_ASN1_FUNCTIONS(X509_ATTRIBUTE) +X509_ATTRIBUTE *X509_ATTRIBUTE_create(int nid, int atrtype, void *value); + +DECLARE_ASN1_FUNCTIONS(X509_EXTENSION) +DECLARE_ASN1_ENCODE_FUNCTIONS(X509_EXTENSIONS, X509_EXTENSIONS, X509_EXTENSIONS) + +DECLARE_ASN1_FUNCTIONS(X509_NAME_ENTRY) + +DECLARE_ASN1_FUNCTIONS(X509_NAME) + +int X509_NAME_set(X509_NAME **xn, X509_NAME *name); + +DECLARE_ASN1_FUNCTIONS(X509_CINF) + +DECLARE_ASN1_FUNCTIONS(X509) +DECLARE_ASN1_FUNCTIONS(X509_CERT_AUX) + +DECLARE_ASN1_FUNCTIONS(X509_CERT_PAIR) + +int X509_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); +int X509_set_ex_data(X509 *r, int idx, void *arg); +void *X509_get_ex_data(X509 *r, int idx); +int i2d_X509_AUX(X509 *a, unsigned char **pp); +X509 *d2i_X509_AUX(X509 **a, const unsigned char **pp, long length); + +int i2d_re_X509_tbs(X509 *x, unsigned char **pp); + +void X509_get0_signature(ASN1_BIT_STRING **psig, X509_ALGOR **palg, + const X509 *x); +int X509_get_signature_nid(const X509 *x); + +int X509_alias_set1(X509 *x, unsigned char *name, int len); +int X509_keyid_set1(X509 *x, unsigned char *id, int len); +unsigned char *X509_alias_get0(X509 *x, int *len); +unsigned char *X509_keyid_get0(X509 *x, int *len); +int (*X509_TRUST_set_default(int (*trust) (int, X509 *, int))) (int, X509 *, + int); +int X509_TRUST_set(int *t, int trust); +int X509_add1_trust_object(X509 *x, ASN1_OBJECT *obj); +int X509_add1_reject_object(X509 *x, ASN1_OBJECT *obj); +void X509_trust_clear(X509 *x); +void X509_reject_clear(X509 *x); + +DECLARE_ASN1_FUNCTIONS(X509_REVOKED) +DECLARE_ASN1_FUNCTIONS(X509_CRL_INFO) +DECLARE_ASN1_FUNCTIONS(X509_CRL) + +int X509_CRL_add0_revoked(X509_CRL *crl, X509_REVOKED *rev); +int X509_CRL_get0_by_serial(X509_CRL *crl, + X509_REVOKED **ret, ASN1_INTEGER *serial); +int X509_CRL_get0_by_cert(X509_CRL *crl, X509_REVOKED **ret, X509 *x); + +X509_PKEY *X509_PKEY_new(void); +void X509_PKEY_free(X509_PKEY *a); +int i2d_X509_PKEY(X509_PKEY *a, unsigned char **pp); +X509_PKEY *d2i_X509_PKEY(X509_PKEY **a, const unsigned char **pp, + long length); + +DECLARE_ASN1_FUNCTIONS(NETSCAPE_SPKI) +DECLARE_ASN1_FUNCTIONS(NETSCAPE_SPKAC) +DECLARE_ASN1_FUNCTIONS(NETSCAPE_CERT_SEQUENCE) + +# ifndef OPENSSL_NO_EVP +X509_INFO *X509_INFO_new(void); +void X509_INFO_free(X509_INFO *a); +char *X509_NAME_oneline(X509_NAME *a, char *buf, int size); + +int ASN1_verify(i2d_of_void *i2d, X509_ALGOR *algor1, + ASN1_BIT_STRING *signature, char *data, EVP_PKEY *pkey); + +int ASN1_digest(i2d_of_void *i2d, const EVP_MD *type, char *data, + unsigned char *md, unsigned int *len); + +int ASN1_sign(i2d_of_void *i2d, X509_ALGOR *algor1, + X509_ALGOR *algor2, ASN1_BIT_STRING *signature, + char *data, EVP_PKEY *pkey, const EVP_MD *type); + +int ASN1_item_digest(const ASN1_ITEM *it, const EVP_MD *type, void *data, + unsigned char *md, unsigned int *len); + +int ASN1_item_verify(const ASN1_ITEM *it, X509_ALGOR *algor1, + ASN1_BIT_STRING *signature, void *data, EVP_PKEY *pkey); + +int ASN1_item_sign(const ASN1_ITEM *it, X509_ALGOR *algor1, + X509_ALGOR *algor2, ASN1_BIT_STRING *signature, void *data, + EVP_PKEY *pkey, const EVP_MD *type); +int ASN1_item_sign_ctx(const ASN1_ITEM *it, X509_ALGOR *algor1, + X509_ALGOR *algor2, ASN1_BIT_STRING *signature, + void *asn, EVP_MD_CTX *ctx); +# endif + +int X509_set_version(X509 *x, long version); +int X509_set_serialNumber(X509 *x, ASN1_INTEGER *serial); +ASN1_INTEGER *X509_get_serialNumber(X509 *x); +int X509_set_issuer_name(X509 *x, X509_NAME *name); +X509_NAME *X509_get_issuer_name(X509 *a); +int X509_set_subject_name(X509 *x, X509_NAME *name); +X509_NAME *X509_get_subject_name(X509 *a); +int X509_set_notBefore(X509 *x, const ASN1_TIME *tm); +int X509_set_notAfter(X509 *x, const ASN1_TIME *tm); +int X509_set_pubkey(X509 *x, EVP_PKEY *pkey); +EVP_PKEY *X509_get_pubkey(X509 *x); +ASN1_BIT_STRING *X509_get0_pubkey_bitstr(const X509 *x); +int X509_certificate_type(X509 *x, EVP_PKEY *pubkey /* optional */ ); + +int X509_REQ_set_version(X509_REQ *x, long version); +int X509_REQ_set_subject_name(X509_REQ *req, X509_NAME *name); +int X509_REQ_set_pubkey(X509_REQ *x, EVP_PKEY *pkey); +EVP_PKEY *X509_REQ_get_pubkey(X509_REQ *req); +int X509_REQ_extension_nid(int nid); +int *X509_REQ_get_extension_nids(void); +void X509_REQ_set_extension_nids(int *nids); +STACK_OF(X509_EXTENSION) *X509_REQ_get_extensions(X509_REQ *req); +int X509_REQ_add_extensions_nid(X509_REQ *req, STACK_OF(X509_EXTENSION) *exts, + int nid); +int X509_REQ_add_extensions(X509_REQ *req, STACK_OF(X509_EXTENSION) *exts); +int X509_REQ_get_attr_count(const X509_REQ *req); +int X509_REQ_get_attr_by_NID(const X509_REQ *req, int nid, int lastpos); +int X509_REQ_get_attr_by_OBJ(const X509_REQ *req, ASN1_OBJECT *obj, + int lastpos); +X509_ATTRIBUTE *X509_REQ_get_attr(const X509_REQ *req, int loc); +X509_ATTRIBUTE *X509_REQ_delete_attr(X509_REQ *req, int loc); +int X509_REQ_add1_attr(X509_REQ *req, X509_ATTRIBUTE *attr); +int X509_REQ_add1_attr_by_OBJ(X509_REQ *req, + const ASN1_OBJECT *obj, int type, + const unsigned char *bytes, int len); +int X509_REQ_add1_attr_by_NID(X509_REQ *req, + int nid, int type, + const unsigned char *bytes, int len); +int X509_REQ_add1_attr_by_txt(X509_REQ *req, + const char *attrname, int type, + const unsigned char *bytes, int len); + +int X509_CRL_set_version(X509_CRL *x, long version); +int X509_CRL_set_issuer_name(X509_CRL *x, X509_NAME *name); +int X509_CRL_set_lastUpdate(X509_CRL *x, const ASN1_TIME *tm); +int X509_CRL_set_nextUpdate(X509_CRL *x, const ASN1_TIME *tm); +int X509_CRL_sort(X509_CRL *crl); + +int X509_REVOKED_set_serialNumber(X509_REVOKED *x, ASN1_INTEGER *serial); +int X509_REVOKED_set_revocationDate(X509_REVOKED *r, ASN1_TIME *tm); + +X509_CRL *X509_CRL_diff(X509_CRL *base, X509_CRL *newer, + EVP_PKEY *skey, const EVP_MD *md, unsigned int flags); + +int X509_REQ_check_private_key(X509_REQ *x509, EVP_PKEY *pkey); + +int X509_check_private_key(X509 *x509, EVP_PKEY *pkey); +int X509_chain_check_suiteb(int *perror_depth, + X509 *x, STACK_OF(X509) *chain, + unsigned long flags); +int X509_CRL_check_suiteb(X509_CRL *crl, EVP_PKEY *pk, unsigned long flags); +STACK_OF(X509) *X509_chain_up_ref(STACK_OF(X509) *chain); + +int X509_issuer_and_serial_cmp(const X509 *a, const X509 *b); +unsigned long X509_issuer_and_serial_hash(X509 *a); + +int X509_issuer_name_cmp(const X509 *a, const X509 *b); +unsigned long X509_issuer_name_hash(X509 *a); + +int X509_subject_name_cmp(const X509 *a, const X509 *b); +unsigned long X509_subject_name_hash(X509 *x); + +# ifndef OPENSSL_NO_MD5 +unsigned long X509_issuer_name_hash_old(X509 *a); +unsigned long X509_subject_name_hash_old(X509 *x); +# endif + +int X509_cmp(const X509 *a, const X509 *b); +int X509_NAME_cmp(const X509_NAME *a, const X509_NAME *b); +unsigned long X509_NAME_hash(X509_NAME *x); +unsigned long X509_NAME_hash_old(X509_NAME *x); + +int X509_CRL_cmp(const X509_CRL *a, const X509_CRL *b); +int X509_CRL_match(const X509_CRL *a, const X509_CRL *b); +# ifndef OPENSSL_NO_FP_API +int X509_print_ex_fp(FILE *bp, X509 *x, unsigned long nmflag, + unsigned long cflag); +int X509_print_fp(FILE *bp, X509 *x); +int X509_CRL_print_fp(FILE *bp, X509_CRL *x); +int X509_REQ_print_fp(FILE *bp, X509_REQ *req); +int X509_NAME_print_ex_fp(FILE *fp, X509_NAME *nm, int indent, + unsigned long flags); +# endif + +# ifndef OPENSSL_NO_BIO +int X509_NAME_print(BIO *bp, X509_NAME *name, int obase); +int X509_NAME_print_ex(BIO *out, X509_NAME *nm, int indent, + unsigned long flags); +int X509_print_ex(BIO *bp, X509 *x, unsigned long nmflag, + unsigned long cflag); +int X509_print(BIO *bp, X509 *x); +int X509_ocspid_print(BIO *bp, X509 *x); +int X509_CERT_AUX_print(BIO *bp, X509_CERT_AUX *x, int indent); +int X509_CRL_print(BIO *bp, X509_CRL *x); +int X509_REQ_print_ex(BIO *bp, X509_REQ *x, unsigned long nmflag, + unsigned long cflag); +int X509_REQ_print(BIO *bp, X509_REQ *req); +# endif + +int X509_NAME_entry_count(X509_NAME *name); +int X509_NAME_get_text_by_NID(X509_NAME *name, int nid, char *buf, int len); +int X509_NAME_get_text_by_OBJ(X509_NAME *name, ASN1_OBJECT *obj, + char *buf, int len); + +/* + * NOTE: you should be passsing -1, not 0 as lastpos. The functions that use + * lastpos, search after that position on. + */ +int X509_NAME_get_index_by_NID(X509_NAME *name, int nid, int lastpos); +int X509_NAME_get_index_by_OBJ(X509_NAME *name, ASN1_OBJECT *obj, + int lastpos); +X509_NAME_ENTRY *X509_NAME_get_entry(X509_NAME *name, int loc); +X509_NAME_ENTRY *X509_NAME_delete_entry(X509_NAME *name, int loc); +int X509_NAME_add_entry(X509_NAME *name, X509_NAME_ENTRY *ne, + int loc, int set); +int X509_NAME_add_entry_by_OBJ(X509_NAME *name, ASN1_OBJECT *obj, int type, + unsigned char *bytes, int len, int loc, + int set); +int X509_NAME_add_entry_by_NID(X509_NAME *name, int nid, int type, + unsigned char *bytes, int len, int loc, + int set); +X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_txt(X509_NAME_ENTRY **ne, + const char *field, int type, + const unsigned char *bytes, + int len); +X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_NID(X509_NAME_ENTRY **ne, int nid, + int type, unsigned char *bytes, + int len); +int X509_NAME_add_entry_by_txt(X509_NAME *name, const char *field, int type, + const unsigned char *bytes, int len, int loc, + int set); +X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_OBJ(X509_NAME_ENTRY **ne, + ASN1_OBJECT *obj, int type, + const unsigned char *bytes, + int len); +int X509_NAME_ENTRY_set_object(X509_NAME_ENTRY *ne, ASN1_OBJECT *obj); +int X509_NAME_ENTRY_set_data(X509_NAME_ENTRY *ne, int type, + const unsigned char *bytes, int len); +ASN1_OBJECT *X509_NAME_ENTRY_get_object(X509_NAME_ENTRY *ne); +ASN1_STRING *X509_NAME_ENTRY_get_data(X509_NAME_ENTRY *ne); + +int X509v3_get_ext_count(const STACK_OF(X509_EXTENSION) *x); +int X509v3_get_ext_by_NID(const STACK_OF(X509_EXTENSION) *x, + int nid, int lastpos); +int X509v3_get_ext_by_OBJ(const STACK_OF(X509_EXTENSION) *x, + ASN1_OBJECT *obj, int lastpos); +int X509v3_get_ext_by_critical(const STACK_OF(X509_EXTENSION) *x, + int crit, int lastpos); +X509_EXTENSION *X509v3_get_ext(const STACK_OF(X509_EXTENSION) *x, int loc); +X509_EXTENSION *X509v3_delete_ext(STACK_OF(X509_EXTENSION) *x, int loc); +STACK_OF(X509_EXTENSION) *X509v3_add_ext(STACK_OF(X509_EXTENSION) **x, + X509_EXTENSION *ex, int loc); + +int X509_get_ext_count(X509 *x); +int X509_get_ext_by_NID(X509 *x, int nid, int lastpos); +int X509_get_ext_by_OBJ(X509 *x, ASN1_OBJECT *obj, int lastpos); +int X509_get_ext_by_critical(X509 *x, int crit, int lastpos); +X509_EXTENSION *X509_get_ext(X509 *x, int loc); +X509_EXTENSION *X509_delete_ext(X509 *x, int loc); +int X509_add_ext(X509 *x, X509_EXTENSION *ex, int loc); +void *X509_get_ext_d2i(X509 *x, int nid, int *crit, int *idx); +int X509_add1_ext_i2d(X509 *x, int nid, void *value, int crit, + unsigned long flags); + +int X509_CRL_get_ext_count(X509_CRL *x); +int X509_CRL_get_ext_by_NID(X509_CRL *x, int nid, int lastpos); +int X509_CRL_get_ext_by_OBJ(X509_CRL *x, ASN1_OBJECT *obj, int lastpos); +int X509_CRL_get_ext_by_critical(X509_CRL *x, int crit, int lastpos); +X509_EXTENSION *X509_CRL_get_ext(X509_CRL *x, int loc); +X509_EXTENSION *X509_CRL_delete_ext(X509_CRL *x, int loc); +int X509_CRL_add_ext(X509_CRL *x, X509_EXTENSION *ex, int loc); +void *X509_CRL_get_ext_d2i(X509_CRL *x, int nid, int *crit, int *idx); +int X509_CRL_add1_ext_i2d(X509_CRL *x, int nid, void *value, int crit, + unsigned long flags); + +int X509_REVOKED_get_ext_count(X509_REVOKED *x); +int X509_REVOKED_get_ext_by_NID(X509_REVOKED *x, int nid, int lastpos); +int X509_REVOKED_get_ext_by_OBJ(X509_REVOKED *x, ASN1_OBJECT *obj, + int lastpos); +int X509_REVOKED_get_ext_by_critical(X509_REVOKED *x, int crit, int lastpos); +X509_EXTENSION *X509_REVOKED_get_ext(X509_REVOKED *x, int loc); +X509_EXTENSION *X509_REVOKED_delete_ext(X509_REVOKED *x, int loc); +int X509_REVOKED_add_ext(X509_REVOKED *x, X509_EXTENSION *ex, int loc); +void *X509_REVOKED_get_ext_d2i(X509_REVOKED *x, int nid, int *crit, int *idx); +int X509_REVOKED_add1_ext_i2d(X509_REVOKED *x, int nid, void *value, int crit, + unsigned long flags); + +X509_EXTENSION *X509_EXTENSION_create_by_NID(X509_EXTENSION **ex, + int nid, int crit, + ASN1_OCTET_STRING *data); +X509_EXTENSION *X509_EXTENSION_create_by_OBJ(X509_EXTENSION **ex, + ASN1_OBJECT *obj, int crit, + ASN1_OCTET_STRING *data); +int X509_EXTENSION_set_object(X509_EXTENSION *ex, ASN1_OBJECT *obj); +int X509_EXTENSION_set_critical(X509_EXTENSION *ex, int crit); +int X509_EXTENSION_set_data(X509_EXTENSION *ex, ASN1_OCTET_STRING *data); +ASN1_OBJECT *X509_EXTENSION_get_object(X509_EXTENSION *ex); +ASN1_OCTET_STRING *X509_EXTENSION_get_data(X509_EXTENSION *ne); +int X509_EXTENSION_get_critical(X509_EXTENSION *ex); + +int X509at_get_attr_count(const STACK_OF(X509_ATTRIBUTE) *x); +int X509at_get_attr_by_NID(const STACK_OF(X509_ATTRIBUTE) *x, int nid, + int lastpos); +int X509at_get_attr_by_OBJ(const STACK_OF(X509_ATTRIBUTE) *sk, + ASN1_OBJECT *obj, int lastpos); +X509_ATTRIBUTE *X509at_get_attr(const STACK_OF(X509_ATTRIBUTE) *x, int loc); +X509_ATTRIBUTE *X509at_delete_attr(STACK_OF(X509_ATTRIBUTE) *x, int loc); +STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr(STACK_OF(X509_ATTRIBUTE) **x, + X509_ATTRIBUTE *attr); +STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_OBJ(STACK_OF(X509_ATTRIBUTE) + **x, const ASN1_OBJECT *obj, + int type, + const unsigned char *bytes, + int len); +STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_NID(STACK_OF(X509_ATTRIBUTE) + **x, int nid, int type, + const unsigned char *bytes, + int len); +STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_txt(STACK_OF(X509_ATTRIBUTE) + **x, const char *attrname, + int type, + const unsigned char *bytes, + int len); +void *X509at_get0_data_by_OBJ(STACK_OF(X509_ATTRIBUTE) *x, ASN1_OBJECT *obj, + int lastpos, int type); +X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_NID(X509_ATTRIBUTE **attr, int nid, + int atrtype, const void *data, + int len); +X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_OBJ(X509_ATTRIBUTE **attr, + const ASN1_OBJECT *obj, + int atrtype, const void *data, + int len); +X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_txt(X509_ATTRIBUTE **attr, + const char *atrname, int type, + const unsigned char *bytes, + int len); +int X509_ATTRIBUTE_set1_object(X509_ATTRIBUTE *attr, const ASN1_OBJECT *obj); +int X509_ATTRIBUTE_set1_data(X509_ATTRIBUTE *attr, int attrtype, + const void *data, int len); +void *X509_ATTRIBUTE_get0_data(X509_ATTRIBUTE *attr, int idx, int atrtype, + void *data); +int X509_ATTRIBUTE_count(X509_ATTRIBUTE *attr); +ASN1_OBJECT *X509_ATTRIBUTE_get0_object(X509_ATTRIBUTE *attr); +ASN1_TYPE *X509_ATTRIBUTE_get0_type(X509_ATTRIBUTE *attr, int idx); + +int EVP_PKEY_get_attr_count(const EVP_PKEY *key); +int EVP_PKEY_get_attr_by_NID(const EVP_PKEY *key, int nid, int lastpos); +int EVP_PKEY_get_attr_by_OBJ(const EVP_PKEY *key, ASN1_OBJECT *obj, + int lastpos); +X509_ATTRIBUTE *EVP_PKEY_get_attr(const EVP_PKEY *key, int loc); +X509_ATTRIBUTE *EVP_PKEY_delete_attr(EVP_PKEY *key, int loc); +int EVP_PKEY_add1_attr(EVP_PKEY *key, X509_ATTRIBUTE *attr); +int EVP_PKEY_add1_attr_by_OBJ(EVP_PKEY *key, + const ASN1_OBJECT *obj, int type, + const unsigned char *bytes, int len); +int EVP_PKEY_add1_attr_by_NID(EVP_PKEY *key, + int nid, int type, + const unsigned char *bytes, int len); +int EVP_PKEY_add1_attr_by_txt(EVP_PKEY *key, + const char *attrname, int type, + const unsigned char *bytes, int len); + +int X509_verify_cert(X509_STORE_CTX *ctx); + +/* lookup a cert from a X509 STACK */ +X509 *X509_find_by_issuer_and_serial(STACK_OF(X509) *sk, X509_NAME *name, + ASN1_INTEGER *serial); +X509 *X509_find_by_subject(STACK_OF(X509) *sk, X509_NAME *name); + +DECLARE_ASN1_FUNCTIONS(PBEPARAM) +DECLARE_ASN1_FUNCTIONS(PBE2PARAM) +DECLARE_ASN1_FUNCTIONS(PBKDF2PARAM) + +int PKCS5_pbe_set0_algor(X509_ALGOR *algor, int alg, int iter, + const unsigned char *salt, int saltlen); + +X509_ALGOR *PKCS5_pbe_set(int alg, int iter, + const unsigned char *salt, int saltlen); +X509_ALGOR *PKCS5_pbe2_set(const EVP_CIPHER *cipher, int iter, + unsigned char *salt, int saltlen); +X509_ALGOR *PKCS5_pbe2_set_iv(const EVP_CIPHER *cipher, int iter, + unsigned char *salt, int saltlen, + unsigned char *aiv, int prf_nid); + +X509_ALGOR *PKCS5_pbkdf2_set(int iter, unsigned char *salt, int saltlen, + int prf_nid, int keylen); + +/* PKCS#8 utilities */ + +DECLARE_ASN1_FUNCTIONS(PKCS8_PRIV_KEY_INFO) + +EVP_PKEY *EVP_PKCS82PKEY(PKCS8_PRIV_KEY_INFO *p8); +PKCS8_PRIV_KEY_INFO *EVP_PKEY2PKCS8(EVP_PKEY *pkey); +PKCS8_PRIV_KEY_INFO *EVP_PKEY2PKCS8_broken(EVP_PKEY *pkey, int broken); +PKCS8_PRIV_KEY_INFO *PKCS8_set_broken(PKCS8_PRIV_KEY_INFO *p8, int broken); + +int PKCS8_pkey_set0(PKCS8_PRIV_KEY_INFO *priv, ASN1_OBJECT *aobj, + int version, int ptype, void *pval, + unsigned char *penc, int penclen); +int PKCS8_pkey_get0(ASN1_OBJECT **ppkalg, + const unsigned char **pk, int *ppklen, + X509_ALGOR **pa, PKCS8_PRIV_KEY_INFO *p8); + +int X509_PUBKEY_set0_param(X509_PUBKEY *pub, ASN1_OBJECT *aobj, + int ptype, void *pval, + unsigned char *penc, int penclen); +int X509_PUBKEY_get0_param(ASN1_OBJECT **ppkalg, + const unsigned char **pk, int *ppklen, + X509_ALGOR **pa, X509_PUBKEY *pub); + +int X509_check_trust(X509 *x, int id, int flags); +int X509_TRUST_get_count(void); +X509_TRUST *X509_TRUST_get0(int idx); +int X509_TRUST_get_by_id(int id); +int X509_TRUST_add(int id, int flags, int (*ck) (X509_TRUST *, X509 *, int), + char *name, int arg1, void *arg2); +void X509_TRUST_cleanup(void); +int X509_TRUST_get_flags(X509_TRUST *xp); +char *X509_TRUST_get0_name(X509_TRUST *xp); +int X509_TRUST_get_trust(X509_TRUST *xp); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_X509_strings(void); + +/* Error codes for the X509 functions. */ + +/* Function codes. */ +# define X509_F_ADD_CERT_DIR 100 +# define X509_F_BY_FILE_CTRL 101 +# define X509_F_CHECK_POLICY 145 +# define X509_F_DIR_CTRL 102 +# define X509_F_GET_CERT_BY_SUBJECT 103 +# define X509_F_NETSCAPE_SPKI_B64_DECODE 129 +# define X509_F_NETSCAPE_SPKI_B64_ENCODE 130 +# define X509_F_X509AT_ADD1_ATTR 135 +# define X509_F_X509V3_ADD_EXT 104 +# define X509_F_X509_ATTRIBUTE_CREATE_BY_NID 136 +# define X509_F_X509_ATTRIBUTE_CREATE_BY_OBJ 137 +# define X509_F_X509_ATTRIBUTE_CREATE_BY_TXT 140 +# define X509_F_X509_ATTRIBUTE_GET0_DATA 139 +# define X509_F_X509_ATTRIBUTE_SET1_DATA 138 +# define X509_F_X509_CHECK_PRIVATE_KEY 128 +# define X509_F_X509_CRL_DIFF 105 +# define X509_F_X509_CRL_PRINT_FP 147 +# define X509_F_X509_EXTENSION_CREATE_BY_NID 108 +# define X509_F_X509_EXTENSION_CREATE_BY_OBJ 109 +# define X509_F_X509_GET_PUBKEY_PARAMETERS 110 +# define X509_F_X509_LOAD_CERT_CRL_FILE 132 +# define X509_F_X509_LOAD_CERT_FILE 111 +# define X509_F_X509_LOAD_CRL_FILE 112 +# define X509_F_X509_NAME_ADD_ENTRY 113 +# define X509_F_X509_NAME_ENTRY_CREATE_BY_NID 114 +# define X509_F_X509_NAME_ENTRY_CREATE_BY_TXT 131 +# define X509_F_X509_NAME_ENTRY_SET_OBJECT 115 +# define X509_F_X509_NAME_ONELINE 116 +# define X509_F_X509_NAME_PRINT 117 +# define X509_F_X509_PRINT_EX_FP 118 +# define X509_F_X509_PUBKEY_GET 119 +# define X509_F_X509_PUBKEY_SET 120 +# define X509_F_X509_REQ_CHECK_PRIVATE_KEY 144 +# define X509_F_X509_REQ_PRINT_EX 121 +# define X509_F_X509_REQ_PRINT_FP 122 +# define X509_F_X509_REQ_TO_X509 123 +# define X509_F_X509_STORE_ADD_CERT 124 +# define X509_F_X509_STORE_ADD_CRL 125 +# define X509_F_X509_STORE_CTX_GET1_ISSUER 146 +# define X509_F_X509_STORE_CTX_INIT 143 +# define X509_F_X509_STORE_CTX_NEW 142 +# define X509_F_X509_STORE_CTX_PURPOSE_INHERIT 134 +# define X509_F_X509_TO_X509_REQ 126 +# define X509_F_X509_TRUST_ADD 133 +# define X509_F_X509_TRUST_SET 141 +# define X509_F_X509_VERIFY_CERT 127 + +/* Reason codes. */ +# define X509_R_AKID_MISMATCH 110 +# define X509_R_BAD_X509_FILETYPE 100 +# define X509_R_BASE64_DECODE_ERROR 118 +# define X509_R_CANT_CHECK_DH_KEY 114 +# define X509_R_CERT_ALREADY_IN_HASH_TABLE 101 +# define X509_R_CRL_ALREADY_DELTA 127 +# define X509_R_CRL_VERIFY_FAILURE 131 +# define X509_R_ERR_ASN1_LIB 102 +# define X509_R_IDP_MISMATCH 128 +# define X509_R_INVALID_DIRECTORY 113 +# define X509_R_INVALID_FIELD_NAME 119 +# define X509_R_INVALID_TRUST 123 +# define X509_R_ISSUER_MISMATCH 129 +# define X509_R_KEY_TYPE_MISMATCH 115 +# define X509_R_KEY_VALUES_MISMATCH 116 +# define X509_R_LOADING_CERT_DIR 103 +# define X509_R_LOADING_DEFAULTS 104 +# define X509_R_METHOD_NOT_SUPPORTED 124 +# define X509_R_NEWER_CRL_NOT_NEWER 132 +# define X509_R_NO_CERT_SET_FOR_US_TO_VERIFY 105 +# define X509_R_NO_CRL_NUMBER 130 +# define X509_R_PUBLIC_KEY_DECODE_ERROR 125 +# define X509_R_PUBLIC_KEY_ENCODE_ERROR 126 +# define X509_R_SHOULD_RETRY 106 +# define X509_R_UNABLE_TO_FIND_PARAMETERS_IN_CHAIN 107 +# define X509_R_UNABLE_TO_GET_CERTS_PUBLIC_KEY 108 +# define X509_R_UNKNOWN_KEY_TYPE 117 +# define X509_R_UNKNOWN_NID 109 +# define X509_R_UNKNOWN_PURPOSE_ID 121 +# define X509_R_UNKNOWN_TRUST_ID 120 +# define X509_R_UNSUPPORTED_ALGORITHM 111 +# define X509_R_WRONG_LOOKUP_TYPE 112 +# define X509_R_WRONG_TYPE 122 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/win/openssl/include/openssl/x509_vfy.h b/hdssd/external/win/openssl/include/openssl/x509_vfy.h new file mode 100644 index 0000000..2663e1c --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/x509_vfy.h @@ -0,0 +1,647 @@ +/* crypto/x509/x509_vfy.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_X509_H +# include +/* + * openssl/x509.h ends up #include-ing this file at about the only + * appropriate moment. + */ +#endif + +#ifndef HEADER_X509_VFY_H +# define HEADER_X509_VFY_H + +# include +# ifndef OPENSSL_NO_LHASH +# include +# endif +# include +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# if 0 +/* Outer object */ +typedef struct x509_hash_dir_st { + int num_dirs; + char **dirs; + int *dirs_type; + int num_dirs_alloced; +} X509_HASH_DIR_CTX; +# endif + +typedef struct x509_file_st { + int num_paths; /* number of paths to files or directories */ + int num_alloced; + char **paths; /* the list of paths or directories */ + int *path_type; +} X509_CERT_FILE_CTX; + +/*******************************/ +/*- +SSL_CTX -> X509_STORE + -> X509_LOOKUP + ->X509_LOOKUP_METHOD + -> X509_LOOKUP + ->X509_LOOKUP_METHOD + +SSL -> X509_STORE_CTX + ->X509_STORE + +The X509_STORE holds the tables etc for verification stuff. +A X509_STORE_CTX is used while validating a single certificate. +The X509_STORE has X509_LOOKUPs for looking up certs. +The X509_STORE then calls a function to actually verify the +certificate chain. +*/ + +# define X509_LU_RETRY -1 +# define X509_LU_FAIL 0 +# define X509_LU_X509 1 +# define X509_LU_CRL 2 +# define X509_LU_PKEY 3 + +typedef struct x509_object_st { + /* one of the above types */ + int type; + union { + char *ptr; + X509 *x509; + X509_CRL *crl; + EVP_PKEY *pkey; + } data; +} X509_OBJECT; + +typedef struct x509_lookup_st X509_LOOKUP; + +DECLARE_STACK_OF(X509_LOOKUP) +DECLARE_STACK_OF(X509_OBJECT) + +/* This is a static that defines the function interface */ +typedef struct x509_lookup_method_st { + const char *name; + int (*new_item) (X509_LOOKUP *ctx); + void (*free) (X509_LOOKUP *ctx); + int (*init) (X509_LOOKUP *ctx); + int (*shutdown) (X509_LOOKUP *ctx); + int (*ctrl) (X509_LOOKUP *ctx, int cmd, const char *argc, long argl, + char **ret); + int (*get_by_subject) (X509_LOOKUP *ctx, int type, X509_NAME *name, + X509_OBJECT *ret); + int (*get_by_issuer_serial) (X509_LOOKUP *ctx, int type, X509_NAME *name, + ASN1_INTEGER *serial, X509_OBJECT *ret); + int (*get_by_fingerprint) (X509_LOOKUP *ctx, int type, + unsigned char *bytes, int len, + X509_OBJECT *ret); + int (*get_by_alias) (X509_LOOKUP *ctx, int type, char *str, int len, + X509_OBJECT *ret); +} X509_LOOKUP_METHOD; + +typedef struct X509_VERIFY_PARAM_ID_st X509_VERIFY_PARAM_ID; + +/* + * This structure hold all parameters associated with a verify operation by + * including an X509_VERIFY_PARAM structure in related structures the + * parameters used can be customized + */ + +typedef struct X509_VERIFY_PARAM_st { + char *name; + time_t check_time; /* Time to use */ + unsigned long inh_flags; /* Inheritance flags */ + unsigned long flags; /* Various verify flags */ + int purpose; /* purpose to check untrusted certificates */ + int trust; /* trust setting to check */ + int depth; /* Verify depth */ + STACK_OF(ASN1_OBJECT) *policies; /* Permissible policies */ + X509_VERIFY_PARAM_ID *id; /* opaque ID data */ +} X509_VERIFY_PARAM; + +DECLARE_STACK_OF(X509_VERIFY_PARAM) + +/* + * This is used to hold everything. It is used for all certificate + * validation. Once we have a certificate chain, the 'verify' function is + * then called to actually check the cert chain. + */ +struct x509_store_st { + /* The following is a cache of trusted certs */ + int cache; /* if true, stash any hits */ + STACK_OF(X509_OBJECT) *objs; /* Cache of all objects */ + /* These are external lookup methods */ + STACK_OF(X509_LOOKUP) *get_cert_methods; + X509_VERIFY_PARAM *param; + /* Callbacks for various operations */ + /* called to verify a certificate */ + int (*verify) (X509_STORE_CTX *ctx); + /* error callback */ + int (*verify_cb) (int ok, X509_STORE_CTX *ctx); + /* get issuers cert from ctx */ + int (*get_issuer) (X509 **issuer, X509_STORE_CTX *ctx, X509 *x); + /* check issued */ + int (*check_issued) (X509_STORE_CTX *ctx, X509 *x, X509 *issuer); + /* Check revocation status of chain */ + int (*check_revocation) (X509_STORE_CTX *ctx); + /* retrieve CRL */ + int (*get_crl) (X509_STORE_CTX *ctx, X509_CRL **crl, X509 *x); + /* Check CRL validity */ + int (*check_crl) (X509_STORE_CTX *ctx, X509_CRL *crl); + /* Check certificate against CRL */ + int (*cert_crl) (X509_STORE_CTX *ctx, X509_CRL *crl, X509 *x); + STACK_OF(X509) *(*lookup_certs) (X509_STORE_CTX *ctx, X509_NAME *nm); + STACK_OF(X509_CRL) *(*lookup_crls) (X509_STORE_CTX *ctx, X509_NAME *nm); + int (*cleanup) (X509_STORE_CTX *ctx); + CRYPTO_EX_DATA ex_data; + int references; +} /* X509_STORE */ ; + +int X509_STORE_set_depth(X509_STORE *store, int depth); + +# define X509_STORE_set_verify_cb_func(ctx,func) ((ctx)->verify_cb=(func)) +# define X509_STORE_set_verify_func(ctx,func) ((ctx)->verify=(func)) + +/* This is the functions plus an instance of the local variables. */ +struct x509_lookup_st { + int init; /* have we been started */ + int skip; /* don't use us. */ + X509_LOOKUP_METHOD *method; /* the functions */ + char *method_data; /* method data */ + X509_STORE *store_ctx; /* who owns us */ +} /* X509_LOOKUP */ ; + +/* + * This is a used when verifying cert chains. Since the gathering of the + * cert chain can take some time (and have to be 'retried', this needs to be + * kept and passed around. + */ +struct x509_store_ctx_st { /* X509_STORE_CTX */ + X509_STORE *ctx; + /* used when looking up certs */ + int current_method; + /* The following are set by the caller */ + /* The cert to check */ + X509 *cert; + /* chain of X509s - untrusted - passed in */ + STACK_OF(X509) *untrusted; + /* set of CRLs passed in */ + STACK_OF(X509_CRL) *crls; + X509_VERIFY_PARAM *param; + /* Other info for use with get_issuer() */ + void *other_ctx; + /* Callbacks for various operations */ + /* called to verify a certificate */ + int (*verify) (X509_STORE_CTX *ctx); + /* error callback */ + int (*verify_cb) (int ok, X509_STORE_CTX *ctx); + /* get issuers cert from ctx */ + int (*get_issuer) (X509 **issuer, X509_STORE_CTX *ctx, X509 *x); + /* check issued */ + int (*check_issued) (X509_STORE_CTX *ctx, X509 *x, X509 *issuer); + /* Check revocation status of chain */ + int (*check_revocation) (X509_STORE_CTX *ctx); + /* retrieve CRL */ + int (*get_crl) (X509_STORE_CTX *ctx, X509_CRL **crl, X509 *x); + /* Check CRL validity */ + int (*check_crl) (X509_STORE_CTX *ctx, X509_CRL *crl); + /* Check certificate against CRL */ + int (*cert_crl) (X509_STORE_CTX *ctx, X509_CRL *crl, X509 *x); + int (*check_policy) (X509_STORE_CTX *ctx); + STACK_OF(X509) *(*lookup_certs) (X509_STORE_CTX *ctx, X509_NAME *nm); + STACK_OF(X509_CRL) *(*lookup_crls) (X509_STORE_CTX *ctx, X509_NAME *nm); + int (*cleanup) (X509_STORE_CTX *ctx); + /* The following is built up */ + /* if 0, rebuild chain */ + int valid; + /* index of last untrusted cert */ + int last_untrusted; + /* chain of X509s - built up and trusted */ + STACK_OF(X509) *chain; + /* Valid policy tree */ + X509_POLICY_TREE *tree; + /* Require explicit policy value */ + int explicit_policy; + /* When something goes wrong, this is why */ + int error_depth; + int error; + X509 *current_cert; + /* cert currently being tested as valid issuer */ + X509 *current_issuer; + /* current CRL */ + X509_CRL *current_crl; + /* score of current CRL */ + int current_crl_score; + /* Reason mask */ + unsigned int current_reasons; + /* For CRL path validation: parent context */ + X509_STORE_CTX *parent; + CRYPTO_EX_DATA ex_data; +} /* X509_STORE_CTX */ ; + +void X509_STORE_CTX_set_depth(X509_STORE_CTX *ctx, int depth); + +# define X509_STORE_CTX_set_app_data(ctx,data) \ + X509_STORE_CTX_set_ex_data(ctx,0,data) +# define X509_STORE_CTX_get_app_data(ctx) \ + X509_STORE_CTX_get_ex_data(ctx,0) + +# define X509_L_FILE_LOAD 1 +# define X509_L_ADD_DIR 2 + +# define X509_LOOKUP_load_file(x,name,type) \ + X509_LOOKUP_ctrl((x),X509_L_FILE_LOAD,(name),(long)(type),NULL) + +# define X509_LOOKUP_add_dir(x,name,type) \ + X509_LOOKUP_ctrl((x),X509_L_ADD_DIR,(name),(long)(type),NULL) + +# define X509_V_OK 0 +# define X509_V_ERR_UNSPECIFIED 1 + +# define X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT 2 +# define X509_V_ERR_UNABLE_TO_GET_CRL 3 +# define X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE 4 +# define X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE 5 +# define X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY 6 +# define X509_V_ERR_CERT_SIGNATURE_FAILURE 7 +# define X509_V_ERR_CRL_SIGNATURE_FAILURE 8 +# define X509_V_ERR_CERT_NOT_YET_VALID 9 +# define X509_V_ERR_CERT_HAS_EXPIRED 10 +# define X509_V_ERR_CRL_NOT_YET_VALID 11 +# define X509_V_ERR_CRL_HAS_EXPIRED 12 +# define X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD 13 +# define X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD 14 +# define X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD 15 +# define X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD 16 +# define X509_V_ERR_OUT_OF_MEM 17 +# define X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT 18 +# define X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN 19 +# define X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY 20 +# define X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE 21 +# define X509_V_ERR_CERT_CHAIN_TOO_LONG 22 +# define X509_V_ERR_CERT_REVOKED 23 +# define X509_V_ERR_INVALID_CA 24 +# define X509_V_ERR_PATH_LENGTH_EXCEEDED 25 +# define X509_V_ERR_INVALID_PURPOSE 26 +# define X509_V_ERR_CERT_UNTRUSTED 27 +# define X509_V_ERR_CERT_REJECTED 28 +/* These are 'informational' when looking for issuer cert */ +# define X509_V_ERR_SUBJECT_ISSUER_MISMATCH 29 +# define X509_V_ERR_AKID_SKID_MISMATCH 30 +# define X509_V_ERR_AKID_ISSUER_SERIAL_MISMATCH 31 +# define X509_V_ERR_KEYUSAGE_NO_CERTSIGN 32 + +# define X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER 33 +# define X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION 34 +# define X509_V_ERR_KEYUSAGE_NO_CRL_SIGN 35 +# define X509_V_ERR_UNHANDLED_CRITICAL_CRL_EXTENSION 36 +# define X509_V_ERR_INVALID_NON_CA 37 +# define X509_V_ERR_PROXY_PATH_LENGTH_EXCEEDED 38 +# define X509_V_ERR_KEYUSAGE_NO_DIGITAL_SIGNATURE 39 +# define X509_V_ERR_PROXY_CERTIFICATES_NOT_ALLOWED 40 + +# define X509_V_ERR_INVALID_EXTENSION 41 +# define X509_V_ERR_INVALID_POLICY_EXTENSION 42 +# define X509_V_ERR_NO_EXPLICIT_POLICY 43 +# define X509_V_ERR_DIFFERENT_CRL_SCOPE 44 +# define X509_V_ERR_UNSUPPORTED_EXTENSION_FEATURE 45 + +# define X509_V_ERR_UNNESTED_RESOURCE 46 + +# define X509_V_ERR_PERMITTED_VIOLATION 47 +# define X509_V_ERR_EXCLUDED_VIOLATION 48 +# define X509_V_ERR_SUBTREE_MINMAX 49 +# define X509_V_ERR_UNSUPPORTED_CONSTRAINT_TYPE 51 +# define X509_V_ERR_UNSUPPORTED_CONSTRAINT_SYNTAX 52 +# define X509_V_ERR_UNSUPPORTED_NAME_SYNTAX 53 +# define X509_V_ERR_CRL_PATH_VALIDATION_ERROR 54 + +/* Suite B mode algorithm violation */ +# define X509_V_ERR_SUITE_B_INVALID_VERSION 56 +# define X509_V_ERR_SUITE_B_INVALID_ALGORITHM 57 +# define X509_V_ERR_SUITE_B_INVALID_CURVE 58 +# define X509_V_ERR_SUITE_B_INVALID_SIGNATURE_ALGORITHM 59 +# define X509_V_ERR_SUITE_B_LOS_NOT_ALLOWED 60 +# define X509_V_ERR_SUITE_B_CANNOT_SIGN_P_384_WITH_P_256 61 + +/* Host, email and IP check errors */ +# define X509_V_ERR_HOSTNAME_MISMATCH 62 +# define X509_V_ERR_EMAIL_MISMATCH 63 +# define X509_V_ERR_IP_ADDRESS_MISMATCH 64 + +/* The application is not happy */ +# define X509_V_ERR_APPLICATION_VERIFICATION 50 + +/* Certificate verify flags */ + +/* Send issuer+subject checks to verify_cb */ +# define X509_V_FLAG_CB_ISSUER_CHECK 0x1 +/* Use check time instead of current time */ +# define X509_V_FLAG_USE_CHECK_TIME 0x2 +/* Lookup CRLs */ +# define X509_V_FLAG_CRL_CHECK 0x4 +/* Lookup CRLs for whole chain */ +# define X509_V_FLAG_CRL_CHECK_ALL 0x8 +/* Ignore unhandled critical extensions */ +# define X509_V_FLAG_IGNORE_CRITICAL 0x10 +/* Disable workarounds for broken certificates */ +# define X509_V_FLAG_X509_STRICT 0x20 +/* Enable proxy certificate validation */ +# define X509_V_FLAG_ALLOW_PROXY_CERTS 0x40 +/* Enable policy checking */ +# define X509_V_FLAG_POLICY_CHECK 0x80 +/* Policy variable require-explicit-policy */ +# define X509_V_FLAG_EXPLICIT_POLICY 0x100 +/* Policy variable inhibit-any-policy */ +# define X509_V_FLAG_INHIBIT_ANY 0x200 +/* Policy variable inhibit-policy-mapping */ +# define X509_V_FLAG_INHIBIT_MAP 0x400 +/* Notify callback that policy is OK */ +# define X509_V_FLAG_NOTIFY_POLICY 0x800 +/* Extended CRL features such as indirect CRLs, alternate CRL signing keys */ +# define X509_V_FLAG_EXTENDED_CRL_SUPPORT 0x1000 +/* Delta CRL support */ +# define X509_V_FLAG_USE_DELTAS 0x2000 +/* Check selfsigned CA signature */ +# define X509_V_FLAG_CHECK_SS_SIGNATURE 0x4000 +/* Use trusted store first */ +# define X509_V_FLAG_TRUSTED_FIRST 0x8000 +/* Suite B 128 bit only mode: not normally used */ +# define X509_V_FLAG_SUITEB_128_LOS_ONLY 0x10000 +/* Suite B 192 bit only mode */ +# define X509_V_FLAG_SUITEB_192_LOS 0x20000 +/* Suite B 128 bit mode allowing 192 bit algorithms */ +# define X509_V_FLAG_SUITEB_128_LOS 0x30000 + +/* Allow partial chains if at least one certificate is in trusted store */ +# define X509_V_FLAG_PARTIAL_CHAIN 0x80000 +/* + * If the initial chain is not trusted, do not attempt to build an alternative + * chain. Alternate chain checking was introduced in 1.0.2b. Setting this flag + * will force the behaviour to match that of previous versions. + */ +# define X509_V_FLAG_NO_ALT_CHAINS 0x100000 + +# define X509_VP_FLAG_DEFAULT 0x1 +# define X509_VP_FLAG_OVERWRITE 0x2 +# define X509_VP_FLAG_RESET_FLAGS 0x4 +# define X509_VP_FLAG_LOCKED 0x8 +# define X509_VP_FLAG_ONCE 0x10 + +/* Internal use: mask of policy related options */ +# define X509_V_FLAG_POLICY_MASK (X509_V_FLAG_POLICY_CHECK \ + | X509_V_FLAG_EXPLICIT_POLICY \ + | X509_V_FLAG_INHIBIT_ANY \ + | X509_V_FLAG_INHIBIT_MAP) + +int X509_OBJECT_idx_by_subject(STACK_OF(X509_OBJECT) *h, int type, + X509_NAME *name); +X509_OBJECT *X509_OBJECT_retrieve_by_subject(STACK_OF(X509_OBJECT) *h, + int type, X509_NAME *name); +X509_OBJECT *X509_OBJECT_retrieve_match(STACK_OF(X509_OBJECT) *h, + X509_OBJECT *x); +void X509_OBJECT_up_ref_count(X509_OBJECT *a); +void X509_OBJECT_free_contents(X509_OBJECT *a); +X509_STORE *X509_STORE_new(void); +void X509_STORE_free(X509_STORE *v); + +STACK_OF(X509) *X509_STORE_get1_certs(X509_STORE_CTX *st, X509_NAME *nm); +STACK_OF(X509_CRL) *X509_STORE_get1_crls(X509_STORE_CTX *st, X509_NAME *nm); +int X509_STORE_set_flags(X509_STORE *ctx, unsigned long flags); +int X509_STORE_set_purpose(X509_STORE *ctx, int purpose); +int X509_STORE_set_trust(X509_STORE *ctx, int trust); +int X509_STORE_set1_param(X509_STORE *ctx, X509_VERIFY_PARAM *pm); + +void X509_STORE_set_verify_cb(X509_STORE *ctx, + int (*verify_cb) (int, X509_STORE_CTX *)); + +void X509_STORE_set_lookup_crls_cb(X509_STORE *ctx, + STACK_OF(X509_CRL) *(*cb) (X509_STORE_CTX + *ctx, + X509_NAME *nm)); + +X509_STORE_CTX *X509_STORE_CTX_new(void); + +int X509_STORE_CTX_get1_issuer(X509 **issuer, X509_STORE_CTX *ctx, X509 *x); + +void X509_STORE_CTX_free(X509_STORE_CTX *ctx); +int X509_STORE_CTX_init(X509_STORE_CTX *ctx, X509_STORE *store, + X509 *x509, STACK_OF(X509) *chain); +void X509_STORE_CTX_trusted_stack(X509_STORE_CTX *ctx, STACK_OF(X509) *sk); +void X509_STORE_CTX_cleanup(X509_STORE_CTX *ctx); + +X509_STORE *X509_STORE_CTX_get0_store(X509_STORE_CTX *ctx); + +X509_LOOKUP *X509_STORE_add_lookup(X509_STORE *v, X509_LOOKUP_METHOD *m); + +X509_LOOKUP_METHOD *X509_LOOKUP_hash_dir(void); +X509_LOOKUP_METHOD *X509_LOOKUP_file(void); + +int X509_STORE_add_cert(X509_STORE *ctx, X509 *x); +int X509_STORE_add_crl(X509_STORE *ctx, X509_CRL *x); + +int X509_STORE_get_by_subject(X509_STORE_CTX *vs, int type, X509_NAME *name, + X509_OBJECT *ret); + +int X509_LOOKUP_ctrl(X509_LOOKUP *ctx, int cmd, const char *argc, + long argl, char **ret); + +# ifndef OPENSSL_NO_STDIO +int X509_load_cert_file(X509_LOOKUP *ctx, const char *file, int type); +int X509_load_crl_file(X509_LOOKUP *ctx, const char *file, int type); +int X509_load_cert_crl_file(X509_LOOKUP *ctx, const char *file, int type); +# endif + +X509_LOOKUP *X509_LOOKUP_new(X509_LOOKUP_METHOD *method); +void X509_LOOKUP_free(X509_LOOKUP *ctx); +int X509_LOOKUP_init(X509_LOOKUP *ctx); +int X509_LOOKUP_by_subject(X509_LOOKUP *ctx, int type, X509_NAME *name, + X509_OBJECT *ret); +int X509_LOOKUP_by_issuer_serial(X509_LOOKUP *ctx, int type, X509_NAME *name, + ASN1_INTEGER *serial, X509_OBJECT *ret); +int X509_LOOKUP_by_fingerprint(X509_LOOKUP *ctx, int type, + unsigned char *bytes, int len, + X509_OBJECT *ret); +int X509_LOOKUP_by_alias(X509_LOOKUP *ctx, int type, char *str, int len, + X509_OBJECT *ret); +int X509_LOOKUP_shutdown(X509_LOOKUP *ctx); + +# ifndef OPENSSL_NO_STDIO +int X509_STORE_load_locations(X509_STORE *ctx, + const char *file, const char *dir); +int X509_STORE_set_default_paths(X509_STORE *ctx); +# endif + +int X509_STORE_CTX_get_ex_new_index(long argl, void *argp, + CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, + CRYPTO_EX_free *free_func); +int X509_STORE_CTX_set_ex_data(X509_STORE_CTX *ctx, int idx, void *data); +void *X509_STORE_CTX_get_ex_data(X509_STORE_CTX *ctx, int idx); +int X509_STORE_CTX_get_error(X509_STORE_CTX *ctx); +void X509_STORE_CTX_set_error(X509_STORE_CTX *ctx, int s); +int X509_STORE_CTX_get_error_depth(X509_STORE_CTX *ctx); +X509 *X509_STORE_CTX_get_current_cert(X509_STORE_CTX *ctx); +X509 *X509_STORE_CTX_get0_current_issuer(X509_STORE_CTX *ctx); +X509_CRL *X509_STORE_CTX_get0_current_crl(X509_STORE_CTX *ctx); +X509_STORE_CTX *X509_STORE_CTX_get0_parent_ctx(X509_STORE_CTX *ctx); +STACK_OF(X509) *X509_STORE_CTX_get_chain(X509_STORE_CTX *ctx); +STACK_OF(X509) *X509_STORE_CTX_get1_chain(X509_STORE_CTX *ctx); +void X509_STORE_CTX_set_cert(X509_STORE_CTX *c, X509 *x); +void X509_STORE_CTX_set_chain(X509_STORE_CTX *c, STACK_OF(X509) *sk); +void X509_STORE_CTX_set0_crls(X509_STORE_CTX *c, STACK_OF(X509_CRL) *sk); +int X509_STORE_CTX_set_purpose(X509_STORE_CTX *ctx, int purpose); +int X509_STORE_CTX_set_trust(X509_STORE_CTX *ctx, int trust); +int X509_STORE_CTX_purpose_inherit(X509_STORE_CTX *ctx, int def_purpose, + int purpose, int trust); +void X509_STORE_CTX_set_flags(X509_STORE_CTX *ctx, unsigned long flags); +void X509_STORE_CTX_set_time(X509_STORE_CTX *ctx, unsigned long flags, + time_t t); +void X509_STORE_CTX_set_verify_cb(X509_STORE_CTX *ctx, + int (*verify_cb) (int, X509_STORE_CTX *)); + +X509_POLICY_TREE *X509_STORE_CTX_get0_policy_tree(X509_STORE_CTX *ctx); +int X509_STORE_CTX_get_explicit_policy(X509_STORE_CTX *ctx); + +X509_VERIFY_PARAM *X509_STORE_CTX_get0_param(X509_STORE_CTX *ctx); +void X509_STORE_CTX_set0_param(X509_STORE_CTX *ctx, X509_VERIFY_PARAM *param); +int X509_STORE_CTX_set_default(X509_STORE_CTX *ctx, const char *name); + +/* X509_VERIFY_PARAM functions */ + +X509_VERIFY_PARAM *X509_VERIFY_PARAM_new(void); +void X509_VERIFY_PARAM_free(X509_VERIFY_PARAM *param); +int X509_VERIFY_PARAM_inherit(X509_VERIFY_PARAM *to, + const X509_VERIFY_PARAM *from); +int X509_VERIFY_PARAM_set1(X509_VERIFY_PARAM *to, + const X509_VERIFY_PARAM *from); +int X509_VERIFY_PARAM_set1_name(X509_VERIFY_PARAM *param, const char *name); +int X509_VERIFY_PARAM_set_flags(X509_VERIFY_PARAM *param, + unsigned long flags); +int X509_VERIFY_PARAM_clear_flags(X509_VERIFY_PARAM *param, + unsigned long flags); +unsigned long X509_VERIFY_PARAM_get_flags(X509_VERIFY_PARAM *param); +int X509_VERIFY_PARAM_set_purpose(X509_VERIFY_PARAM *param, int purpose); +int X509_VERIFY_PARAM_set_trust(X509_VERIFY_PARAM *param, int trust); +void X509_VERIFY_PARAM_set_depth(X509_VERIFY_PARAM *param, int depth); +void X509_VERIFY_PARAM_set_time(X509_VERIFY_PARAM *param, time_t t); +int X509_VERIFY_PARAM_add0_policy(X509_VERIFY_PARAM *param, + ASN1_OBJECT *policy); +int X509_VERIFY_PARAM_set1_policies(X509_VERIFY_PARAM *param, + STACK_OF(ASN1_OBJECT) *policies); + +int X509_VERIFY_PARAM_set1_host(X509_VERIFY_PARAM *param, + const char *name, size_t namelen); +int X509_VERIFY_PARAM_add1_host(X509_VERIFY_PARAM *param, + const char *name, size_t namelen); +void X509_VERIFY_PARAM_set_hostflags(X509_VERIFY_PARAM *param, + unsigned int flags); +char *X509_VERIFY_PARAM_get0_peername(X509_VERIFY_PARAM *); +int X509_VERIFY_PARAM_set1_email(X509_VERIFY_PARAM *param, + const char *email, size_t emaillen); +int X509_VERIFY_PARAM_set1_ip(X509_VERIFY_PARAM *param, + const unsigned char *ip, size_t iplen); +int X509_VERIFY_PARAM_set1_ip_asc(X509_VERIFY_PARAM *param, + const char *ipasc); + +int X509_VERIFY_PARAM_get_depth(const X509_VERIFY_PARAM *param); +const char *X509_VERIFY_PARAM_get0_name(const X509_VERIFY_PARAM *param); + +int X509_VERIFY_PARAM_add0_table(X509_VERIFY_PARAM *param); +int X509_VERIFY_PARAM_get_count(void); +const X509_VERIFY_PARAM *X509_VERIFY_PARAM_get0(int id); +const X509_VERIFY_PARAM *X509_VERIFY_PARAM_lookup(const char *name); +void X509_VERIFY_PARAM_table_cleanup(void); + +int X509_policy_check(X509_POLICY_TREE **ptree, int *pexplicit_policy, + STACK_OF(X509) *certs, + STACK_OF(ASN1_OBJECT) *policy_oids, unsigned int flags); + +void X509_policy_tree_free(X509_POLICY_TREE *tree); + +int X509_policy_tree_level_count(const X509_POLICY_TREE *tree); +X509_POLICY_LEVEL *X509_policy_tree_get0_level(const X509_POLICY_TREE *tree, + int i); + +STACK_OF(X509_POLICY_NODE) *X509_policy_tree_get0_policies(const + X509_POLICY_TREE + *tree); + +STACK_OF(X509_POLICY_NODE) *X509_policy_tree_get0_user_policies(const + X509_POLICY_TREE + *tree); + +int X509_policy_level_node_count(X509_POLICY_LEVEL *level); + +X509_POLICY_NODE *X509_policy_level_get0_node(X509_POLICY_LEVEL *level, + int i); + +const ASN1_OBJECT *X509_policy_node_get0_policy(const X509_POLICY_NODE *node); + +STACK_OF(POLICYQUALINFO) *X509_policy_node_get0_qualifiers(const + X509_POLICY_NODE + *node); +const X509_POLICY_NODE *X509_policy_node_get0_parent(const X509_POLICY_NODE + *node); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/win/openssl/include/openssl/x509v3.h b/hdssd/external/win/openssl/include/openssl/x509v3.h new file mode 100644 index 0000000..f5c6156 --- /dev/null +++ b/hdssd/external/win/openssl/include/openssl/x509v3.h @@ -0,0 +1,1055 @@ +/* x509v3.h */ +/* + * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project + * 1999. + */ +/* ==================================================================== + * Copyright (c) 1999-2004 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +#ifndef HEADER_X509V3_H +# define HEADER_X509V3_H + +# include +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# ifdef OPENSSL_SYS_WIN32 +/* Under Win32 these are defined in wincrypt.h */ +# undef X509_NAME +# undef X509_CERT_PAIR +# undef X509_EXTENSIONS +# endif + +/* Forward reference */ +struct v3_ext_method; +struct v3_ext_ctx; + +/* Useful typedefs */ + +typedef void *(*X509V3_EXT_NEW)(void); +typedef void (*X509V3_EXT_FREE) (void *); +typedef void *(*X509V3_EXT_D2I)(void *, const unsigned char **, long); +typedef int (*X509V3_EXT_I2D) (void *, unsigned char **); +typedef STACK_OF(CONF_VALUE) * + (*X509V3_EXT_I2V) (const struct v3_ext_method *method, void *ext, + STACK_OF(CONF_VALUE) *extlist); +typedef void *(*X509V3_EXT_V2I)(const struct v3_ext_method *method, + struct v3_ext_ctx *ctx, + STACK_OF(CONF_VALUE) *values); +typedef char *(*X509V3_EXT_I2S)(const struct v3_ext_method *method, + void *ext); +typedef void *(*X509V3_EXT_S2I)(const struct v3_ext_method *method, + struct v3_ext_ctx *ctx, const char *str); +typedef int (*X509V3_EXT_I2R) (const struct v3_ext_method *method, void *ext, + BIO *out, int indent); +typedef void *(*X509V3_EXT_R2I)(const struct v3_ext_method *method, + struct v3_ext_ctx *ctx, const char *str); + +/* V3 extension structure */ + +struct v3_ext_method { + int ext_nid; + int ext_flags; +/* If this is set the following four fields are ignored */ + ASN1_ITEM_EXP *it; +/* Old style ASN1 calls */ + X509V3_EXT_NEW ext_new; + X509V3_EXT_FREE ext_free; + X509V3_EXT_D2I d2i; + X509V3_EXT_I2D i2d; +/* The following pair is used for string extensions */ + X509V3_EXT_I2S i2s; + X509V3_EXT_S2I s2i; +/* The following pair is used for multi-valued extensions */ + X509V3_EXT_I2V i2v; + X509V3_EXT_V2I v2i; +/* The following are used for raw extensions */ + X509V3_EXT_I2R i2r; + X509V3_EXT_R2I r2i; + void *usr_data; /* Any extension specific data */ +}; + +typedef struct X509V3_CONF_METHOD_st { + char *(*get_string) (void *db, char *section, char *value); + STACK_OF(CONF_VALUE) *(*get_section) (void *db, char *section); + void (*free_string) (void *db, char *string); + void (*free_section) (void *db, STACK_OF(CONF_VALUE) *section); +} X509V3_CONF_METHOD; + +/* Context specific info */ +struct v3_ext_ctx { +# define CTX_TEST 0x1 + int flags; + X509 *issuer_cert; + X509 *subject_cert; + X509_REQ *subject_req; + X509_CRL *crl; + X509V3_CONF_METHOD *db_meth; + void *db; +/* Maybe more here */ +}; + +typedef struct v3_ext_method X509V3_EXT_METHOD; + +DECLARE_STACK_OF(X509V3_EXT_METHOD) + +/* ext_flags values */ +# define X509V3_EXT_DYNAMIC 0x1 +# define X509V3_EXT_CTX_DEP 0x2 +# define X509V3_EXT_MULTILINE 0x4 + +typedef BIT_STRING_BITNAME ENUMERATED_NAMES; + +typedef struct BASIC_CONSTRAINTS_st { + int ca; + ASN1_INTEGER *pathlen; +} BASIC_CONSTRAINTS; + +typedef struct PKEY_USAGE_PERIOD_st { + ASN1_GENERALIZEDTIME *notBefore; + ASN1_GENERALIZEDTIME *notAfter; +} PKEY_USAGE_PERIOD; + +typedef struct otherName_st { + ASN1_OBJECT *type_id; + ASN1_TYPE *value; +} OTHERNAME; + +typedef struct EDIPartyName_st { + ASN1_STRING *nameAssigner; + ASN1_STRING *partyName; +} EDIPARTYNAME; + +typedef struct GENERAL_NAME_st { +# define GEN_OTHERNAME 0 +# define GEN_EMAIL 1 +# define GEN_DNS 2 +# define GEN_X400 3 +# define GEN_DIRNAME 4 +# define GEN_EDIPARTY 5 +# define GEN_URI 6 +# define GEN_IPADD 7 +# define GEN_RID 8 + int type; + union { + char *ptr; + OTHERNAME *otherName; /* otherName */ + ASN1_IA5STRING *rfc822Name; + ASN1_IA5STRING *dNSName; + ASN1_TYPE *x400Address; + X509_NAME *directoryName; + EDIPARTYNAME *ediPartyName; + ASN1_IA5STRING *uniformResourceIdentifier; + ASN1_OCTET_STRING *iPAddress; + ASN1_OBJECT *registeredID; + /* Old names */ + ASN1_OCTET_STRING *ip; /* iPAddress */ + X509_NAME *dirn; /* dirn */ + ASN1_IA5STRING *ia5; /* rfc822Name, dNSName, + * uniformResourceIdentifier */ + ASN1_OBJECT *rid; /* registeredID */ + ASN1_TYPE *other; /* x400Address */ + } d; +} GENERAL_NAME; + +typedef STACK_OF(GENERAL_NAME) GENERAL_NAMES; + +typedef struct ACCESS_DESCRIPTION_st { + ASN1_OBJECT *method; + GENERAL_NAME *location; +} ACCESS_DESCRIPTION; + +typedef STACK_OF(ACCESS_DESCRIPTION) AUTHORITY_INFO_ACCESS; + +typedef STACK_OF(ASN1_OBJECT) EXTENDED_KEY_USAGE; + +DECLARE_STACK_OF(GENERAL_NAME) +DECLARE_ASN1_SET_OF(GENERAL_NAME) + +DECLARE_STACK_OF(ACCESS_DESCRIPTION) +DECLARE_ASN1_SET_OF(ACCESS_DESCRIPTION) + +typedef struct DIST_POINT_NAME_st { + int type; + union { + GENERAL_NAMES *fullname; + STACK_OF(X509_NAME_ENTRY) *relativename; + } name; +/* If relativename then this contains the full distribution point name */ + X509_NAME *dpname; +} DIST_POINT_NAME; +/* All existing reasons */ +# define CRLDP_ALL_REASONS 0x807f + +# define CRL_REASON_NONE -1 +# define CRL_REASON_UNSPECIFIED 0 +# define CRL_REASON_KEY_COMPROMISE 1 +# define CRL_REASON_CA_COMPROMISE 2 +# define CRL_REASON_AFFILIATION_CHANGED 3 +# define CRL_REASON_SUPERSEDED 4 +# define CRL_REASON_CESSATION_OF_OPERATION 5 +# define CRL_REASON_CERTIFICATE_HOLD 6 +# define CRL_REASON_REMOVE_FROM_CRL 8 +# define CRL_REASON_PRIVILEGE_WITHDRAWN 9 +# define CRL_REASON_AA_COMPROMISE 10 + +struct DIST_POINT_st { + DIST_POINT_NAME *distpoint; + ASN1_BIT_STRING *reasons; + GENERAL_NAMES *CRLissuer; + int dp_reasons; +}; + +typedef STACK_OF(DIST_POINT) CRL_DIST_POINTS; + +DECLARE_STACK_OF(DIST_POINT) +DECLARE_ASN1_SET_OF(DIST_POINT) + +struct AUTHORITY_KEYID_st { + ASN1_OCTET_STRING *keyid; + GENERAL_NAMES *issuer; + ASN1_INTEGER *serial; +}; + +/* Strong extranet structures */ + +typedef struct SXNET_ID_st { + ASN1_INTEGER *zone; + ASN1_OCTET_STRING *user; +} SXNETID; + +DECLARE_STACK_OF(SXNETID) +DECLARE_ASN1_SET_OF(SXNETID) + +typedef struct SXNET_st { + ASN1_INTEGER *version; + STACK_OF(SXNETID) *ids; +} SXNET; + +typedef struct NOTICEREF_st { + ASN1_STRING *organization; + STACK_OF(ASN1_INTEGER) *noticenos; +} NOTICEREF; + +typedef struct USERNOTICE_st { + NOTICEREF *noticeref; + ASN1_STRING *exptext; +} USERNOTICE; + +typedef struct POLICYQUALINFO_st { + ASN1_OBJECT *pqualid; + union { + ASN1_IA5STRING *cpsuri; + USERNOTICE *usernotice; + ASN1_TYPE *other; + } d; +} POLICYQUALINFO; + +DECLARE_STACK_OF(POLICYQUALINFO) +DECLARE_ASN1_SET_OF(POLICYQUALINFO) + +typedef struct POLICYINFO_st { + ASN1_OBJECT *policyid; + STACK_OF(POLICYQUALINFO) *qualifiers; +} POLICYINFO; + +typedef STACK_OF(POLICYINFO) CERTIFICATEPOLICIES; + +DECLARE_STACK_OF(POLICYINFO) +DECLARE_ASN1_SET_OF(POLICYINFO) + +typedef struct POLICY_MAPPING_st { + ASN1_OBJECT *issuerDomainPolicy; + ASN1_OBJECT *subjectDomainPolicy; +} POLICY_MAPPING; + +DECLARE_STACK_OF(POLICY_MAPPING) + +typedef STACK_OF(POLICY_MAPPING) POLICY_MAPPINGS; + +typedef struct GENERAL_SUBTREE_st { + GENERAL_NAME *base; + ASN1_INTEGER *minimum; + ASN1_INTEGER *maximum; +} GENERAL_SUBTREE; + +DECLARE_STACK_OF(GENERAL_SUBTREE) + +struct NAME_CONSTRAINTS_st { + STACK_OF(GENERAL_SUBTREE) *permittedSubtrees; + STACK_OF(GENERAL_SUBTREE) *excludedSubtrees; +}; + +typedef struct POLICY_CONSTRAINTS_st { + ASN1_INTEGER *requireExplicitPolicy; + ASN1_INTEGER *inhibitPolicyMapping; +} POLICY_CONSTRAINTS; + +/* Proxy certificate structures, see RFC 3820 */ +typedef struct PROXY_POLICY_st { + ASN1_OBJECT *policyLanguage; + ASN1_OCTET_STRING *policy; +} PROXY_POLICY; + +typedef struct PROXY_CERT_INFO_EXTENSION_st { + ASN1_INTEGER *pcPathLengthConstraint; + PROXY_POLICY *proxyPolicy; +} PROXY_CERT_INFO_EXTENSION; + +DECLARE_ASN1_FUNCTIONS(PROXY_POLICY) +DECLARE_ASN1_FUNCTIONS(PROXY_CERT_INFO_EXTENSION) + +struct ISSUING_DIST_POINT_st { + DIST_POINT_NAME *distpoint; + int onlyuser; + int onlyCA; + ASN1_BIT_STRING *onlysomereasons; + int indirectCRL; + int onlyattr; +}; + +/* Values in idp_flags field */ +/* IDP present */ +# define IDP_PRESENT 0x1 +/* IDP values inconsistent */ +# define IDP_INVALID 0x2 +/* onlyuser true */ +# define IDP_ONLYUSER 0x4 +/* onlyCA true */ +# define IDP_ONLYCA 0x8 +/* onlyattr true */ +# define IDP_ONLYATTR 0x10 +/* indirectCRL true */ +# define IDP_INDIRECT 0x20 +/* onlysomereasons present */ +# define IDP_REASONS 0x40 + +# define X509V3_conf_err(val) ERR_add_error_data(6, "section:", val->section, \ +",name:", val->name, ",value:", val->value); + +# define X509V3_set_ctx_test(ctx) \ + X509V3_set_ctx(ctx, NULL, NULL, NULL, NULL, CTX_TEST) +# define X509V3_set_ctx_nodb(ctx) (ctx)->db = NULL; + +# define EXT_BITSTRING(nid, table) { nid, 0, ASN1_ITEM_ref(ASN1_BIT_STRING), \ + 0,0,0,0, \ + 0,0, \ + (X509V3_EXT_I2V)i2v_ASN1_BIT_STRING, \ + (X509V3_EXT_V2I)v2i_ASN1_BIT_STRING, \ + NULL, NULL, \ + table} + +# define EXT_IA5STRING(nid) { nid, 0, ASN1_ITEM_ref(ASN1_IA5STRING), \ + 0,0,0,0, \ + (X509V3_EXT_I2S)i2s_ASN1_IA5STRING, \ + (X509V3_EXT_S2I)s2i_ASN1_IA5STRING, \ + 0,0,0,0, \ + NULL} + +# define EXT_END { -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} + +/* X509_PURPOSE stuff */ + +# define EXFLAG_BCONS 0x1 +# define EXFLAG_KUSAGE 0x2 +# define EXFLAG_XKUSAGE 0x4 +# define EXFLAG_NSCERT 0x8 + +# define EXFLAG_CA 0x10 +/* Really self issued not necessarily self signed */ +# define EXFLAG_SI 0x20 +# define EXFLAG_V1 0x40 +# define EXFLAG_INVALID 0x80 +# define EXFLAG_SET 0x100 +# define EXFLAG_CRITICAL 0x200 +# define EXFLAG_PROXY 0x400 + +# define EXFLAG_INVALID_POLICY 0x800 +# define EXFLAG_FRESHEST 0x1000 +/* Self signed */ +# define EXFLAG_SS 0x2000 + +# define KU_DIGITAL_SIGNATURE 0x0080 +# define KU_NON_REPUDIATION 0x0040 +# define KU_KEY_ENCIPHERMENT 0x0020 +# define KU_DATA_ENCIPHERMENT 0x0010 +# define KU_KEY_AGREEMENT 0x0008 +# define KU_KEY_CERT_SIGN 0x0004 +# define KU_CRL_SIGN 0x0002 +# define KU_ENCIPHER_ONLY 0x0001 +# define KU_DECIPHER_ONLY 0x8000 + +# define NS_SSL_CLIENT 0x80 +# define NS_SSL_SERVER 0x40 +# define NS_SMIME 0x20 +# define NS_OBJSIGN 0x10 +# define NS_SSL_CA 0x04 +# define NS_SMIME_CA 0x02 +# define NS_OBJSIGN_CA 0x01 +# define NS_ANY_CA (NS_SSL_CA|NS_SMIME_CA|NS_OBJSIGN_CA) + +# define XKU_SSL_SERVER 0x1 +# define XKU_SSL_CLIENT 0x2 +# define XKU_SMIME 0x4 +# define XKU_CODE_SIGN 0x8 +# define XKU_SGC 0x10 +# define XKU_OCSP_SIGN 0x20 +# define XKU_TIMESTAMP 0x40 +# define XKU_DVCS 0x80 +# define XKU_ANYEKU 0x100 + +# define X509_PURPOSE_DYNAMIC 0x1 +# define X509_PURPOSE_DYNAMIC_NAME 0x2 + +typedef struct x509_purpose_st { + int purpose; + int trust; /* Default trust ID */ + int flags; + int (*check_purpose) (const struct x509_purpose_st *, const X509 *, int); + char *name; + char *sname; + void *usr_data; +} X509_PURPOSE; + +# define X509_PURPOSE_SSL_CLIENT 1 +# define X509_PURPOSE_SSL_SERVER 2 +# define X509_PURPOSE_NS_SSL_SERVER 3 +# define X509_PURPOSE_SMIME_SIGN 4 +# define X509_PURPOSE_SMIME_ENCRYPT 5 +# define X509_PURPOSE_CRL_SIGN 6 +# define X509_PURPOSE_ANY 7 +# define X509_PURPOSE_OCSP_HELPER 8 +# define X509_PURPOSE_TIMESTAMP_SIGN 9 + +# define X509_PURPOSE_MIN 1 +# define X509_PURPOSE_MAX 9 + +/* Flags for X509V3_EXT_print() */ + +# define X509V3_EXT_UNKNOWN_MASK (0xfL << 16) +/* Return error for unknown extensions */ +# define X509V3_EXT_DEFAULT 0 +/* Print error for unknown extensions */ +# define X509V3_EXT_ERROR_UNKNOWN (1L << 16) +/* ASN1 parse unknown extensions */ +# define X509V3_EXT_PARSE_UNKNOWN (2L << 16) +/* BIO_dump unknown extensions */ +# define X509V3_EXT_DUMP_UNKNOWN (3L << 16) + +/* Flags for X509V3_add1_i2d */ + +# define X509V3_ADD_OP_MASK 0xfL +# define X509V3_ADD_DEFAULT 0L +# define X509V3_ADD_APPEND 1L +# define X509V3_ADD_REPLACE 2L +# define X509V3_ADD_REPLACE_EXISTING 3L +# define X509V3_ADD_KEEP_EXISTING 4L +# define X509V3_ADD_DELETE 5L +# define X509V3_ADD_SILENT 0x10 + +DECLARE_STACK_OF(X509_PURPOSE) + +DECLARE_ASN1_FUNCTIONS(BASIC_CONSTRAINTS) + +DECLARE_ASN1_FUNCTIONS(SXNET) +DECLARE_ASN1_FUNCTIONS(SXNETID) + +int SXNET_add_id_asc(SXNET **psx, char *zone, char *user, int userlen); +int SXNET_add_id_ulong(SXNET **psx, unsigned long lzone, char *user, + int userlen); +int SXNET_add_id_INTEGER(SXNET **psx, ASN1_INTEGER *izone, char *user, + int userlen); + +ASN1_OCTET_STRING *SXNET_get_id_asc(SXNET *sx, char *zone); +ASN1_OCTET_STRING *SXNET_get_id_ulong(SXNET *sx, unsigned long lzone); +ASN1_OCTET_STRING *SXNET_get_id_INTEGER(SXNET *sx, ASN1_INTEGER *zone); + +DECLARE_ASN1_FUNCTIONS(AUTHORITY_KEYID) + +DECLARE_ASN1_FUNCTIONS(PKEY_USAGE_PERIOD) + +DECLARE_ASN1_FUNCTIONS(GENERAL_NAME) +GENERAL_NAME *GENERAL_NAME_dup(GENERAL_NAME *a); +int GENERAL_NAME_cmp(GENERAL_NAME *a, GENERAL_NAME *b); + +ASN1_BIT_STRING *v2i_ASN1_BIT_STRING(X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, + STACK_OF(CONF_VALUE) *nval); +STACK_OF(CONF_VALUE) *i2v_ASN1_BIT_STRING(X509V3_EXT_METHOD *method, + ASN1_BIT_STRING *bits, + STACK_OF(CONF_VALUE) *extlist); + +STACK_OF(CONF_VALUE) *i2v_GENERAL_NAME(X509V3_EXT_METHOD *method, + GENERAL_NAME *gen, + STACK_OF(CONF_VALUE) *ret); +int GENERAL_NAME_print(BIO *out, GENERAL_NAME *gen); + +DECLARE_ASN1_FUNCTIONS(GENERAL_NAMES) + +STACK_OF(CONF_VALUE) *i2v_GENERAL_NAMES(X509V3_EXT_METHOD *method, + GENERAL_NAMES *gen, + STACK_OF(CONF_VALUE) *extlist); +GENERAL_NAMES *v2i_GENERAL_NAMES(const X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval); + +DECLARE_ASN1_FUNCTIONS(OTHERNAME) +DECLARE_ASN1_FUNCTIONS(EDIPARTYNAME) +int OTHERNAME_cmp(OTHERNAME *a, OTHERNAME *b); +void GENERAL_NAME_set0_value(GENERAL_NAME *a, int type, void *value); +void *GENERAL_NAME_get0_value(GENERAL_NAME *a, int *ptype); +int GENERAL_NAME_set0_othername(GENERAL_NAME *gen, + ASN1_OBJECT *oid, ASN1_TYPE *value); +int GENERAL_NAME_get0_otherName(GENERAL_NAME *gen, + ASN1_OBJECT **poid, ASN1_TYPE **pvalue); + +char *i2s_ASN1_OCTET_STRING(X509V3_EXT_METHOD *method, + ASN1_OCTET_STRING *ia5); +ASN1_OCTET_STRING *s2i_ASN1_OCTET_STRING(X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, char *str); + +DECLARE_ASN1_FUNCTIONS(EXTENDED_KEY_USAGE) +int i2a_ACCESS_DESCRIPTION(BIO *bp, ACCESS_DESCRIPTION *a); + +DECLARE_ASN1_FUNCTIONS(CERTIFICATEPOLICIES) +DECLARE_ASN1_FUNCTIONS(POLICYINFO) +DECLARE_ASN1_FUNCTIONS(POLICYQUALINFO) +DECLARE_ASN1_FUNCTIONS(USERNOTICE) +DECLARE_ASN1_FUNCTIONS(NOTICEREF) + +DECLARE_ASN1_FUNCTIONS(CRL_DIST_POINTS) +DECLARE_ASN1_FUNCTIONS(DIST_POINT) +DECLARE_ASN1_FUNCTIONS(DIST_POINT_NAME) +DECLARE_ASN1_FUNCTIONS(ISSUING_DIST_POINT) + +int DIST_POINT_set_dpname(DIST_POINT_NAME *dpn, X509_NAME *iname); + +int NAME_CONSTRAINTS_check(X509 *x, NAME_CONSTRAINTS *nc); + +DECLARE_ASN1_FUNCTIONS(ACCESS_DESCRIPTION) +DECLARE_ASN1_FUNCTIONS(AUTHORITY_INFO_ACCESS) + +DECLARE_ASN1_ITEM(POLICY_MAPPING) +DECLARE_ASN1_ALLOC_FUNCTIONS(POLICY_MAPPING) +DECLARE_ASN1_ITEM(POLICY_MAPPINGS) + +DECLARE_ASN1_ITEM(GENERAL_SUBTREE) +DECLARE_ASN1_ALLOC_FUNCTIONS(GENERAL_SUBTREE) + +DECLARE_ASN1_ITEM(NAME_CONSTRAINTS) +DECLARE_ASN1_ALLOC_FUNCTIONS(NAME_CONSTRAINTS) + +DECLARE_ASN1_ALLOC_FUNCTIONS(POLICY_CONSTRAINTS) +DECLARE_ASN1_ITEM(POLICY_CONSTRAINTS) + +GENERAL_NAME *a2i_GENERAL_NAME(GENERAL_NAME *out, + const X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, int gen_type, char *value, + int is_nc); + +# ifdef HEADER_CONF_H +GENERAL_NAME *v2i_GENERAL_NAME(const X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, CONF_VALUE *cnf); +GENERAL_NAME *v2i_GENERAL_NAME_ex(GENERAL_NAME *out, + const X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, CONF_VALUE *cnf, + int is_nc); +void X509V3_conf_free(CONF_VALUE *val); + +X509_EXTENSION *X509V3_EXT_nconf_nid(CONF *conf, X509V3_CTX *ctx, int ext_nid, + char *value); +X509_EXTENSION *X509V3_EXT_nconf(CONF *conf, X509V3_CTX *ctx, char *name, + char *value); +int X509V3_EXT_add_nconf_sk(CONF *conf, X509V3_CTX *ctx, char *section, + STACK_OF(X509_EXTENSION) **sk); +int X509V3_EXT_add_nconf(CONF *conf, X509V3_CTX *ctx, char *section, + X509 *cert); +int X509V3_EXT_REQ_add_nconf(CONF *conf, X509V3_CTX *ctx, char *section, + X509_REQ *req); +int X509V3_EXT_CRL_add_nconf(CONF *conf, X509V3_CTX *ctx, char *section, + X509_CRL *crl); + +X509_EXTENSION *X509V3_EXT_conf_nid(LHASH_OF(CONF_VALUE) *conf, + X509V3_CTX *ctx, int ext_nid, + char *value); +X509_EXTENSION *X509V3_EXT_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx, + char *name, char *value); +int X509V3_EXT_add_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx, + char *section, X509 *cert); +int X509V3_EXT_REQ_add_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx, + char *section, X509_REQ *req); +int X509V3_EXT_CRL_add_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx, + char *section, X509_CRL *crl); + +int X509V3_add_value_bool_nf(char *name, int asn1_bool, + STACK_OF(CONF_VALUE) **extlist); +int X509V3_get_value_bool(CONF_VALUE *value, int *asn1_bool); +int X509V3_get_value_int(CONF_VALUE *value, ASN1_INTEGER **aint); +void X509V3_set_nconf(X509V3_CTX *ctx, CONF *conf); +void X509V3_set_conf_lhash(X509V3_CTX *ctx, LHASH_OF(CONF_VALUE) *lhash); +# endif + +char *X509V3_get_string(X509V3_CTX *ctx, char *name, char *section); +STACK_OF(CONF_VALUE) *X509V3_get_section(X509V3_CTX *ctx, char *section); +void X509V3_string_free(X509V3_CTX *ctx, char *str); +void X509V3_section_free(X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *section); +void X509V3_set_ctx(X509V3_CTX *ctx, X509 *issuer, X509 *subject, + X509_REQ *req, X509_CRL *crl, int flags); + +int X509V3_add_value(const char *name, const char *value, + STACK_OF(CONF_VALUE) **extlist); +int X509V3_add_value_uchar(const char *name, const unsigned char *value, + STACK_OF(CONF_VALUE) **extlist); +int X509V3_add_value_bool(const char *name, int asn1_bool, + STACK_OF(CONF_VALUE) **extlist); +int X509V3_add_value_int(const char *name, ASN1_INTEGER *aint, + STACK_OF(CONF_VALUE) **extlist); +char *i2s_ASN1_INTEGER(X509V3_EXT_METHOD *meth, ASN1_INTEGER *aint); +ASN1_INTEGER *s2i_ASN1_INTEGER(X509V3_EXT_METHOD *meth, char *value); +char *i2s_ASN1_ENUMERATED(X509V3_EXT_METHOD *meth, ASN1_ENUMERATED *aint); +char *i2s_ASN1_ENUMERATED_TABLE(X509V3_EXT_METHOD *meth, + ASN1_ENUMERATED *aint); +int X509V3_EXT_add(X509V3_EXT_METHOD *ext); +int X509V3_EXT_add_list(X509V3_EXT_METHOD *extlist); +int X509V3_EXT_add_alias(int nid_to, int nid_from); +void X509V3_EXT_cleanup(void); + +const X509V3_EXT_METHOD *X509V3_EXT_get(X509_EXTENSION *ext); +const X509V3_EXT_METHOD *X509V3_EXT_get_nid(int nid); +int X509V3_add_standard_extensions(void); +STACK_OF(CONF_VALUE) *X509V3_parse_list(const char *line); +void *X509V3_EXT_d2i(X509_EXTENSION *ext); +void *X509V3_get_d2i(STACK_OF(X509_EXTENSION) *x, int nid, int *crit, + int *idx); +int X509V3_EXT_free(int nid, void *ext_data); + +X509_EXTENSION *X509V3_EXT_i2d(int ext_nid, int crit, void *ext_struc); +int X509V3_add1_i2d(STACK_OF(X509_EXTENSION) **x, int nid, void *value, + int crit, unsigned long flags); + +char *hex_to_string(const unsigned char *buffer, long len); +unsigned char *string_to_hex(const char *str, long *len); +int name_cmp(const char *name, const char *cmp); + +void X509V3_EXT_val_prn(BIO *out, STACK_OF(CONF_VALUE) *val, int indent, + int ml); +int X509V3_EXT_print(BIO *out, X509_EXTENSION *ext, unsigned long flag, + int indent); +int X509V3_EXT_print_fp(FILE *out, X509_EXTENSION *ext, int flag, int indent); + +int X509V3_extensions_print(BIO *out, char *title, + STACK_OF(X509_EXTENSION) *exts, + unsigned long flag, int indent); + +int X509_check_ca(X509 *x); +int X509_check_purpose(X509 *x, int id, int ca); +int X509_supported_extension(X509_EXTENSION *ex); +int X509_PURPOSE_set(int *p, int purpose); +int X509_check_issued(X509 *issuer, X509 *subject); +int X509_check_akid(X509 *issuer, AUTHORITY_KEYID *akid); +int X509_PURPOSE_get_count(void); +X509_PURPOSE *X509_PURPOSE_get0(int idx); +int X509_PURPOSE_get_by_sname(char *sname); +int X509_PURPOSE_get_by_id(int id); +int X509_PURPOSE_add(int id, int trust, int flags, + int (*ck) (const X509_PURPOSE *, const X509 *, int), + char *name, char *sname, void *arg); +char *X509_PURPOSE_get0_name(X509_PURPOSE *xp); +char *X509_PURPOSE_get0_sname(X509_PURPOSE *xp); +int X509_PURPOSE_get_trust(X509_PURPOSE *xp); +void X509_PURPOSE_cleanup(void); +int X509_PURPOSE_get_id(X509_PURPOSE *); + +STACK_OF(OPENSSL_STRING) *X509_get1_email(X509 *x); +STACK_OF(OPENSSL_STRING) *X509_REQ_get1_email(X509_REQ *x); +void X509_email_free(STACK_OF(OPENSSL_STRING) *sk); +STACK_OF(OPENSSL_STRING) *X509_get1_ocsp(X509 *x); +/* Flags for X509_check_* functions */ + +/* + * Always check subject name for host match even if subject alt names present + */ +# define X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT 0x1 +/* Disable wildcard matching for dnsName fields and common name. */ +# define X509_CHECK_FLAG_NO_WILDCARDS 0x2 +/* Wildcards must not match a partial label. */ +# define X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS 0x4 +/* Allow (non-partial) wildcards to match multiple labels. */ +# define X509_CHECK_FLAG_MULTI_LABEL_WILDCARDS 0x8 +/* Constraint verifier subdomain patterns to match a single labels. */ +# define X509_CHECK_FLAG_SINGLE_LABEL_SUBDOMAINS 0x10 +/* + * Match reference identifiers starting with "." to any sub-domain. + * This is a non-public flag, turned on implicitly when the subject + * reference identity is a DNS name. + */ +# define _X509_CHECK_FLAG_DOT_SUBDOMAINS 0x8000 + +int X509_check_host(X509 *x, const char *chk, size_t chklen, + unsigned int flags, char **peername); +int X509_check_email(X509 *x, const char *chk, size_t chklen, + unsigned int flags); +int X509_check_ip(X509 *x, const unsigned char *chk, size_t chklen, + unsigned int flags); +int X509_check_ip_asc(X509 *x, const char *ipasc, unsigned int flags); + +ASN1_OCTET_STRING *a2i_IPADDRESS(const char *ipasc); +ASN1_OCTET_STRING *a2i_IPADDRESS_NC(const char *ipasc); +int a2i_ipadd(unsigned char *ipout, const char *ipasc); +int X509V3_NAME_from_section(X509_NAME *nm, STACK_OF(CONF_VALUE) *dn_sk, + unsigned long chtype); + +void X509_POLICY_NODE_print(BIO *out, X509_POLICY_NODE *node, int indent); +DECLARE_STACK_OF(X509_POLICY_NODE) + +# ifndef OPENSSL_NO_RFC3779 + +typedef struct ASRange_st { + ASN1_INTEGER *min, *max; +} ASRange; + +# define ASIdOrRange_id 0 +# define ASIdOrRange_range 1 + +typedef struct ASIdOrRange_st { + int type; + union { + ASN1_INTEGER *id; + ASRange *range; + } u; +} ASIdOrRange; + +typedef STACK_OF(ASIdOrRange) ASIdOrRanges; +DECLARE_STACK_OF(ASIdOrRange) + +# define ASIdentifierChoice_inherit 0 +# define ASIdentifierChoice_asIdsOrRanges 1 + +typedef struct ASIdentifierChoice_st { + int type; + union { + ASN1_NULL *inherit; + ASIdOrRanges *asIdsOrRanges; + } u; +} ASIdentifierChoice; + +typedef struct ASIdentifiers_st { + ASIdentifierChoice *asnum, *rdi; +} ASIdentifiers; + +DECLARE_ASN1_FUNCTIONS(ASRange) +DECLARE_ASN1_FUNCTIONS(ASIdOrRange) +DECLARE_ASN1_FUNCTIONS(ASIdentifierChoice) +DECLARE_ASN1_FUNCTIONS(ASIdentifiers) + +typedef struct IPAddressRange_st { + ASN1_BIT_STRING *min, *max; +} IPAddressRange; + +# define IPAddressOrRange_addressPrefix 0 +# define IPAddressOrRange_addressRange 1 + +typedef struct IPAddressOrRange_st { + int type; + union { + ASN1_BIT_STRING *addressPrefix; + IPAddressRange *addressRange; + } u; +} IPAddressOrRange; + +typedef STACK_OF(IPAddressOrRange) IPAddressOrRanges; +DECLARE_STACK_OF(IPAddressOrRange) + +# define IPAddressChoice_inherit 0 +# define IPAddressChoice_addressesOrRanges 1 + +typedef struct IPAddressChoice_st { + int type; + union { + ASN1_NULL *inherit; + IPAddressOrRanges *addressesOrRanges; + } u; +} IPAddressChoice; + +typedef struct IPAddressFamily_st { + ASN1_OCTET_STRING *addressFamily; + IPAddressChoice *ipAddressChoice; +} IPAddressFamily; + +typedef STACK_OF(IPAddressFamily) IPAddrBlocks; +DECLARE_STACK_OF(IPAddressFamily) + +DECLARE_ASN1_FUNCTIONS(IPAddressRange) +DECLARE_ASN1_FUNCTIONS(IPAddressOrRange) +DECLARE_ASN1_FUNCTIONS(IPAddressChoice) +DECLARE_ASN1_FUNCTIONS(IPAddressFamily) + +/* + * API tag for elements of the ASIdentifer SEQUENCE. + */ +# define V3_ASID_ASNUM 0 +# define V3_ASID_RDI 1 + +/* + * AFI values, assigned by IANA. It'd be nice to make the AFI + * handling code totally generic, but there are too many little things + * that would need to be defined for other address families for it to + * be worth the trouble. + */ +# define IANA_AFI_IPV4 1 +# define IANA_AFI_IPV6 2 + +/* + * Utilities to construct and extract values from RFC3779 extensions, + * since some of the encodings (particularly for IP address prefixes + * and ranges) are a bit tedious to work with directly. + */ +int v3_asid_add_inherit(ASIdentifiers *asid, int which); +int v3_asid_add_id_or_range(ASIdentifiers *asid, int which, + ASN1_INTEGER *min, ASN1_INTEGER *max); +int v3_addr_add_inherit(IPAddrBlocks *addr, + const unsigned afi, const unsigned *safi); +int v3_addr_add_prefix(IPAddrBlocks *addr, + const unsigned afi, const unsigned *safi, + unsigned char *a, const int prefixlen); +int v3_addr_add_range(IPAddrBlocks *addr, + const unsigned afi, const unsigned *safi, + unsigned char *min, unsigned char *max); +unsigned v3_addr_get_afi(const IPAddressFamily *f); +int v3_addr_get_range(IPAddressOrRange *aor, const unsigned afi, + unsigned char *min, unsigned char *max, + const int length); + +/* + * Canonical forms. + */ +int v3_asid_is_canonical(ASIdentifiers *asid); +int v3_addr_is_canonical(IPAddrBlocks *addr); +int v3_asid_canonize(ASIdentifiers *asid); +int v3_addr_canonize(IPAddrBlocks *addr); + +/* + * Tests for inheritance and containment. + */ +int v3_asid_inherits(ASIdentifiers *asid); +int v3_addr_inherits(IPAddrBlocks *addr); +int v3_asid_subset(ASIdentifiers *a, ASIdentifiers *b); +int v3_addr_subset(IPAddrBlocks *a, IPAddrBlocks *b); + +/* + * Check whether RFC 3779 extensions nest properly in chains. + */ +int v3_asid_validate_path(X509_STORE_CTX *); +int v3_addr_validate_path(X509_STORE_CTX *); +int v3_asid_validate_resource_set(STACK_OF(X509) *chain, + ASIdentifiers *ext, int allow_inheritance); +int v3_addr_validate_resource_set(STACK_OF(X509) *chain, + IPAddrBlocks *ext, int allow_inheritance); + +# endif /* OPENSSL_NO_RFC3779 */ + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_X509V3_strings(void); + +/* Error codes for the X509V3 functions. */ + +/* Function codes. */ +# define X509V3_F_A2I_GENERAL_NAME 164 +# define X509V3_F_ASIDENTIFIERCHOICE_CANONIZE 161 +# define X509V3_F_ASIDENTIFIERCHOICE_IS_CANONICAL 162 +# define X509V3_F_COPY_EMAIL 122 +# define X509V3_F_COPY_ISSUER 123 +# define X509V3_F_DO_DIRNAME 144 +# define X509V3_F_DO_EXT_CONF 124 +# define X509V3_F_DO_EXT_I2D 135 +# define X509V3_F_DO_EXT_NCONF 151 +# define X509V3_F_DO_I2V_NAME_CONSTRAINTS 148 +# define X509V3_F_GNAMES_FROM_SECTNAME 156 +# define X509V3_F_HEX_TO_STRING 111 +# define X509V3_F_I2S_ASN1_ENUMERATED 121 +# define X509V3_F_I2S_ASN1_IA5STRING 149 +# define X509V3_F_I2S_ASN1_INTEGER 120 +# define X509V3_F_I2V_AUTHORITY_INFO_ACCESS 138 +# define X509V3_F_NOTICE_SECTION 132 +# define X509V3_F_NREF_NOS 133 +# define X509V3_F_POLICY_SECTION 131 +# define X509V3_F_PROCESS_PCI_VALUE 150 +# define X509V3_F_R2I_CERTPOL 130 +# define X509V3_F_R2I_PCI 155 +# define X509V3_F_S2I_ASN1_IA5STRING 100 +# define X509V3_F_S2I_ASN1_INTEGER 108 +# define X509V3_F_S2I_ASN1_OCTET_STRING 112 +# define X509V3_F_S2I_ASN1_SKEY_ID 114 +# define X509V3_F_S2I_SKEY_ID 115 +# define X509V3_F_SET_DIST_POINT_NAME 158 +# define X509V3_F_STRING_TO_HEX 113 +# define X509V3_F_SXNET_ADD_ID_ASC 125 +# define X509V3_F_SXNET_ADD_ID_INTEGER 126 +# define X509V3_F_SXNET_ADD_ID_ULONG 127 +# define X509V3_F_SXNET_GET_ID_ASC 128 +# define X509V3_F_SXNET_GET_ID_ULONG 129 +# define X509V3_F_V2I_ASIDENTIFIERS 163 +# define X509V3_F_V2I_ASN1_BIT_STRING 101 +# define X509V3_F_V2I_AUTHORITY_INFO_ACCESS 139 +# define X509V3_F_V2I_AUTHORITY_KEYID 119 +# define X509V3_F_V2I_BASIC_CONSTRAINTS 102 +# define X509V3_F_V2I_CRLD 134 +# define X509V3_F_V2I_EXTENDED_KEY_USAGE 103 +# define X509V3_F_V2I_GENERAL_NAMES 118 +# define X509V3_F_V2I_GENERAL_NAME_EX 117 +# define X509V3_F_V2I_IDP 157 +# define X509V3_F_V2I_IPADDRBLOCKS 159 +# define X509V3_F_V2I_ISSUER_ALT 153 +# define X509V3_F_V2I_NAME_CONSTRAINTS 147 +# define X509V3_F_V2I_POLICY_CONSTRAINTS 146 +# define X509V3_F_V2I_POLICY_MAPPINGS 145 +# define X509V3_F_V2I_SUBJECT_ALT 154 +# define X509V3_F_V3_ADDR_VALIDATE_PATH_INTERNAL 160 +# define X509V3_F_V3_GENERIC_EXTENSION 116 +# define X509V3_F_X509V3_ADD1_I2D 140 +# define X509V3_F_X509V3_ADD_VALUE 105 +# define X509V3_F_X509V3_EXT_ADD 104 +# define X509V3_F_X509V3_EXT_ADD_ALIAS 106 +# define X509V3_F_X509V3_EXT_CONF 107 +# define X509V3_F_X509V3_EXT_FREE 165 +# define X509V3_F_X509V3_EXT_I2D 136 +# define X509V3_F_X509V3_EXT_NCONF 152 +# define X509V3_F_X509V3_GET_SECTION 142 +# define X509V3_F_X509V3_GET_STRING 143 +# define X509V3_F_X509V3_GET_VALUE_BOOL 110 +# define X509V3_F_X509V3_PARSE_LIST 109 +# define X509V3_F_X509_PURPOSE_ADD 137 +# define X509V3_F_X509_PURPOSE_SET 141 + +/* Reason codes. */ +# define X509V3_R_BAD_IP_ADDRESS 118 +# define X509V3_R_BAD_OBJECT 119 +# define X509V3_R_BN_DEC2BN_ERROR 100 +# define X509V3_R_BN_TO_ASN1_INTEGER_ERROR 101 +# define X509V3_R_CANNOT_FIND_FREE_FUNCTION 168 +# define X509V3_R_DIRNAME_ERROR 149 +# define X509V3_R_DISTPOINT_ALREADY_SET 160 +# define X509V3_R_DUPLICATE_ZONE_ID 133 +# define X509V3_R_ERROR_CONVERTING_ZONE 131 +# define X509V3_R_ERROR_CREATING_EXTENSION 144 +# define X509V3_R_ERROR_IN_EXTENSION 128 +# define X509V3_R_EXPECTED_A_SECTION_NAME 137 +# define X509V3_R_EXTENSION_EXISTS 145 +# define X509V3_R_EXTENSION_NAME_ERROR 115 +# define X509V3_R_EXTENSION_NOT_FOUND 102 +# define X509V3_R_EXTENSION_SETTING_NOT_SUPPORTED 103 +# define X509V3_R_EXTENSION_VALUE_ERROR 116 +# define X509V3_R_ILLEGAL_EMPTY_EXTENSION 151 +# define X509V3_R_ILLEGAL_HEX_DIGIT 113 +# define X509V3_R_INCORRECT_POLICY_SYNTAX_TAG 152 +# define X509V3_R_INVALID_ASNUMBER 162 +# define X509V3_R_INVALID_ASRANGE 163 +# define X509V3_R_INVALID_BOOLEAN_STRING 104 +# define X509V3_R_INVALID_EXTENSION_STRING 105 +# define X509V3_R_INVALID_INHERITANCE 165 +# define X509V3_R_INVALID_IPADDRESS 166 +# define X509V3_R_INVALID_MULTIPLE_RDNS 161 +# define X509V3_R_INVALID_NAME 106 +# define X509V3_R_INVALID_NULL_ARGUMENT 107 +# define X509V3_R_INVALID_NULL_NAME 108 +# define X509V3_R_INVALID_NULL_VALUE 109 +# define X509V3_R_INVALID_NUMBER 140 +# define X509V3_R_INVALID_NUMBERS 141 +# define X509V3_R_INVALID_OBJECT_IDENTIFIER 110 +# define X509V3_R_INVALID_OPTION 138 +# define X509V3_R_INVALID_POLICY_IDENTIFIER 134 +# define X509V3_R_INVALID_PROXY_POLICY_SETTING 153 +# define X509V3_R_INVALID_PURPOSE 146 +# define X509V3_R_INVALID_SAFI 164 +# define X509V3_R_INVALID_SECTION 135 +# define X509V3_R_INVALID_SYNTAX 143 +# define X509V3_R_ISSUER_DECODE_ERROR 126 +# define X509V3_R_MISSING_VALUE 124 +# define X509V3_R_NEED_ORGANIZATION_AND_NUMBERS 142 +# define X509V3_R_NO_CONFIG_DATABASE 136 +# define X509V3_R_NO_ISSUER_CERTIFICATE 121 +# define X509V3_R_NO_ISSUER_DETAILS 127 +# define X509V3_R_NO_POLICY_IDENTIFIER 139 +# define X509V3_R_NO_PROXY_CERT_POLICY_LANGUAGE_DEFINED 154 +# define X509V3_R_NO_PUBLIC_KEY 114 +# define X509V3_R_NO_SUBJECT_DETAILS 125 +# define X509V3_R_ODD_NUMBER_OF_DIGITS 112 +# define X509V3_R_OPERATION_NOT_DEFINED 148 +# define X509V3_R_OTHERNAME_ERROR 147 +# define X509V3_R_POLICY_LANGUAGE_ALREADY_DEFINED 155 +# define X509V3_R_POLICY_PATH_LENGTH 156 +# define X509V3_R_POLICY_PATH_LENGTH_ALREADY_DEFINED 157 +# define X509V3_R_POLICY_SYNTAX_NOT_CURRENTLY_SUPPORTED 158 +# define X509V3_R_POLICY_WHEN_PROXY_LANGUAGE_REQUIRES_NO_POLICY 159 +# define X509V3_R_SECTION_NOT_FOUND 150 +# define X509V3_R_UNABLE_TO_GET_ISSUER_DETAILS 122 +# define X509V3_R_UNABLE_TO_GET_ISSUER_KEYID 123 +# define X509V3_R_UNKNOWN_BIT_STRING_ARGUMENT 111 +# define X509V3_R_UNKNOWN_EXTENSION 129 +# define X509V3_R_UNKNOWN_EXTENSION_NAME 130 +# define X509V3_R_UNKNOWN_OPTION 120 +# define X509V3_R_UNSUPPORTED_OPTION 117 +# define X509V3_R_UNSUPPORTED_TYPE 167 +# define X509V3_R_USER_TOO_LONG 132 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hdssd/external/win/openssl/lib/libeay32.lib b/hdssd/external/win/openssl/lib/libeay32.lib new file mode 100644 index 0000000000000000000000000000000000000000..1771415fffcbf286e0acbe5943f763d2cea1573d GIT binary patch literal 12788624 zcmeFa3!E)kS=hUN1PvMlGM5md1V@|;BM#87-Mt$LUA616tM;RI(cS0F45)kh^y8eK z=@(zvigdj1*nEbz0k6o*( zcAs;GGcV|w-#62H)mp1ot@W*Meed-h&sy1EJ@@Qye#X`2Ka(?!xtZzt>B)v!K9T;M zo|~GRnvx$keX~+ean;}QUV7>9x=8)45deeBY$>c1ix~fdSn^?+iTP# zuK;{Ye6t!0FZrzcmOA*KTk2aL;_#@0$EwSPM|VE1#=;wZNIm*KgvUHQR%79NTk0`I zc+cn5V@}{+&%xh**bCJOoXkNP2d+ANgsO!v|4Vh%Lk#|}54=l#Ex}`7|6%pj!ryu9 zlhi{U9`~dv^?<>@ze_#t3c%mJ`Qz%r0FQstjCw%e-~6?D{3XEO8-8A0G5CYGs=s#v z4~aSW)}Mc(dZ@s+`HxWd3hwaLw;c!n@2{zEyN}@sTUV(E3;g|Oy+b`{;cd66zyBbH zC(e9XX}IMo^~C!ce*1Iki6?NM%)z&R$79sDf6wdHw{JJA@T!~Cx8EE1{ohdEeggOV z99(_yDy88c{g%2~;Pqb~5C8RD>gumi_>Onptga~h-ks_@9)j?sZ+flD;mniNlOD?O z8>iKiE&;yt+pbcV4KJKg-+4LkdrE!h6@Y6RuTc*<_(V@#a{^ztbMSxP{W~g$KYyKi z^0&O`%E1rC>dBV_fB0qfX!;i@>#4->EJN=ia2QEyG)< z)V1T_^AA_oj)Cub#wXQSIJjMX*Eo3pP3pVG!T)@M`mQnX)MtN6J@uA9yE5?MhpDGt z0(|%1Jfn_mK%d>at+%P3pS)6aMhOsOwJP*g1IG?4in`Kck)| zugi?p>$j_?1JCH6 z8^I4hTs=eJLr*f{zi+5#)WAglQ04H_zg83D;G-{66AuxXoPNE!WcY`FswQ9e<|_RD z6V>Dxn0nZ4>Z0(%�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

      sGvI~mgog24XL_lrBHG;qS26{nL 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 z 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 aZN7F<2x~H#X!QB(&8Mai&MqSHy&&fn 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 z

      -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 z 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 zΜ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

      sUf-1>bDI1%StfCWJG8}f?Y?Lg`rI*BX* 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%0A3C} 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

      jowd1#ZtW^xXrz~u8m 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%0AQJdJxYgkuQP-GcD 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%0DC4IrGCWoeyL+YDX;P}4rWkfI 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

      #3

      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ℑi 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�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

      +-E*?L8p8=iZ5@>crg z@3&Ny2bqL9ViopaDC^{QTv6TJ-W0*EeteJo5Qn2}s+b2>9#lrXMF-8wn`u@WKBt(K z#+a%!#!|)9NAaGOG{u9Q7|6NqXOnds!6_{$ zyD%aQn_f;B$X26*;5CTs<(U*i~E1ipu+GtuIAi5DhA9&5svTfif%#`w<;)c^nI(qN!TKx*od8+^ znhjbBita1c;AH70(D30z`!n_fN_5Lyu5oUO;n;1~SekB|wfi3UCAvCBwS;?2 zN*O2XvqY?-KESogD$2Uwi@i;^;S#NBq5_s-5BHQhnEF74X_Mn_EUksd-`#v3lV>*99cU@2r;^59E+xUspuM(mN!{a>|5vX^3~ zJ(6!?CaiD*b_*WU@~Eh!c&9y*m}0@mX{S9>Ya^Zfn(seHV&II-+fm!W#JmJ^zt6nr zAl(szB+P?b@p~O}=6Bd6(O#u(4}jOyH^cfFb}rQm@RXI3whlbYs3p7mWnPX1X!gWIBp|{gQMPX}@u3sS>5$=v>o9CP>f7qV3)`Ej#abuE&WENa`$ICX zq&PnuGz}_xZ~VjU`+Qik40%|L9kkW4d2Q}5yBzANw5p@KF__sA$n3J}x~f)KjWDx& z;+VU!Oe3TR+_4reutW@qg-b&AH2=dEGpw=%+@HqvcB`g%7dm##LmWQ=0022P*IlEjW8&g37X3E(!Z&7c|UtB4m>h_8%V- zY^bZkWY!i5+xm|owmTc}WXwklw@bIlC>6eLvvRWVb=!+g!q;sq2=L=}={6PwBXY7$ zAq=J4rQ2A%Abj1%V%Px6>oy`@;p?_OtA(%IQYc%TCzowqant!L4mj_+zg)Z}{j6NP zbi_Lp*iu}W`_StbZn>=TsUx?%+3GnBHfh4wZ5OT-zP?vo+34stH(!dpZtGBpVd8e_ zwhosI|DFw<$DgtMjP_gJofceq-+5mH) z0s{f}dACd7!#-R1x~;=a!q;sbJ{7*cM}8XKnK;=%oF#nS2I5uW>$We0(MR1b-KHTd zeBFlTJmKqm-tQN_ZX@!p@O9gW9K1hr@&b9b@O2xA*MzUzj-=v!joYQ$nq&!Iw~bgW zeBEZ~CgJP0K3@r6x83pLncMBsZGFxYzHYnoqVRQFpW%3W>txe&yzq5fjSa%rZGAo# zzHYNJ0?*=Z*Uf_~Kc9X7&GS~xJ8i}VLr?h_<4gFuP0YE%*S&wfE_~hgA{*~KoNO;T zg|FL8+$Mb8hU^pJ>t1fBiOr2}1Ghx@x~+z?(a~*d{wngix6p%!GXJ`bOGx;-4b3IO z*KJ>vmr~s(a&N5HoNO8EgsJKhJ~-&EZ!!3-3H}T;p?`H0j%Yn zyk@rwU$>#TT==>T&Evw?ZNfegzHXB`0_$71OSe4@317FByhixCP3kkk*KJH`&Fkd- z*_%$jZcF+R?z8vtjec)FoyXa7wFA4#dv8e*-Tc#+jpA_%@ICJFj`N8pcAHh-onOl1 zUoUr+ST+0I9_ZvbyrF(U9}@!T08o;8sl>4f`?O`-Dt~l;bwX`svybSnp=8_Wn@|>Z zc&k_cn#%m(n~2qGAikc8c}JB{U73ajOVR5RlHU;vgzsmg*nf@BG;4fVo9FtgyJNF% zQv)r+`b}Z?uH=N;xWAob+FYC^lzuOaUF2m>qJ7wM57=Mz`#t(w>#r=LPpSRI2{nKi z0VE_Th6VkY$+o4{@mo>t|6uRz&%x0@Mo4|J_Hn#*N8PRVrgo!KQ)>kK{(Dh}2ib8^|68jI6I|ATwB)taZ5UCQd% zeX@(Slte8~6Y3c@Tj$<1gq7&R>ZS+>R6=R?$y&uq(QaIlP^!w8V_yo{whS=+O_7D; z5(XsbSG%P?0!uiJnZAKEIBDc!G1ALn;H0murM6lROsPy4J58bj|Yadkf8vW%+0Zhse6 zDZ?sCEq_d=SIx-pR(~>d)m2D%=v_&6E$Kt=n&s-;9IImJU6tEA|LwB;K{2%v;@)%G zM?+UN!cb!9UHKHSDQe#W=bl~vt~(n^9QMxIB3B(EhRRsiXR!BLy?yAaOk7$~7Ii>1 zyz7O-{uFw6V5a3}&b?;&K$KQIW}v{_m9A`E*fF?AHr>d@-+d%DHyUd|jMfh6bOvUg zy(}7I?W-%EiN@YVjNcfN#T*G=MsV$}XlZ3*LvNStblsLU*Wt(t+;hxk97T=8I zn0fI0p30Ll9A+23y zZq9Pq)P#L;98Vlgviri+!#r>_9f0F)Ca=jbI+#=|DEV!mBS0gd2ZOeQ{up#AD6ne5sY&|lTeoPKnH=I59$HE0F)k{E(T>?Gk!W=DTc(ot2I3$Cv?iOgS`z8J? z-d$!FIHa4nF}%5Q_QX%jV~pri#&m73G>2knU{^tkHQMP;ZrE&$W=nS32P>aHUdCj2 zvuP$*_X|CVtFwlY13uGch&`{4wt~MLzw91^ zifK~!)%bCXlo@QdBJP*cZbViR5Feo3h%8Tx2SZb~fWmC3;|fs7 zbg-P{vqMw&uI%O#8zl8h9vqfNd0&~aROQOB4u>lCCSx=KMj_+|nvCf}X-dZ6P_E6A zr7s+cqwZ-q14mXEW<^ZebMbH-_)~j0$Fr{C?chU>Iu&HU8{oXd-A$*pnk5U0R#WQ* znc~LV&QL#F23ww@HoDcQF^bfHGTmCU205Lng#%-1;lNm`aTWe5-gRay)nLxrYO5pl z%}vHYaGebH&O*v@9twUygFTu8#Rj`!8*ApfjObXtB-fwum!pfp*l)U912h6l}J zPm5P4xp>>*ZFS4PKfhTwqGP{b0?($aJ{6Yops8+FG1rpgS~G^PCq{P&r%@Zfb9| zaTvYPJXU$;!EZFq<1rk23o@t5T#$WY$tTa^zKhJoxRm33k>q+Bf2|fwjmBOFmmyVZ zjImGoM*{O~H%;WMmgM4Jh6Dd#bQ;n2N@1c1Jd3MrPMz4ZoZPb=iYsi>iSC<<6QpvoOY28rKLpnfNQlS5eDAm6BTA*)t-y zq;T7kuv*E5dzdH|%O2WAwUOv-qjuHSn-5n!V_xYrYbs$=7Bi~l=&i_GkT)w72$pzl z6Io7%&*v52W>b`}GG)XVwP75uj;+5@-)561PMs)B+A!{Gd;=TC2d2p_j&0;;&a5NL5)x0CJTu#2+ zIOR@D}+qO1Vj)xSvu)E0Q|*}Im472fMcipeE|NYkm<@q1R-AjcoY9U zWS%qS;^})0a&JNAF|KM6;^`ZLb6-Mcw=5Ae;^})3rw@S4-%YuA`u2p}p4o=+Bm5ZR z>3bUIj(|++BoT|7zYB1BI%J+P<=F3?>Tf&}`W!NcutOlk%U=!79c#*nApSV%<8tMG z$j!poWr*stO|Rtp@jKa+;V}cpC8hvobt`_G5IH;%8`YL6;T8Zsh>7ai|EngdwnFT* zP~B;vN-ue^LEY&wudR7u#N*(RGSpBNS=ju;TBurMbjJ)-IhWmt``mZfr)C&~(>nHr ztc1|4ys|0bP-(C-JS#9aOk2coRr_+|$B;mR*i8a>4{N1`;{ z2CRGAg#*PEMUXBJ_{CWp%PuMSD(2AEmX?LQD@Og<#iUdjEDPoq2Fy%QHpbkw_m-^( zLe-rpY}9^nPWJezVP82)n_E#Hh^-8?PjR`gJ0CQ_i&h3s1!e@4Q?v*QlCZ5TweSL| zja<0v4ETz%kh43xi>b)mV0qZAi2kyqWrf-sL`?riAWyxqp=G96D}1QoBQG|~v4ImZ ztz|<-YqTV4P$9aKST;uGgT8FDUi#5O*D8%_og(@kdwIym=>9rpkxkHl5`8Z!@b1q zgxMmT91`-c$F}|oOL!TJRSk=pTiJnVUCKTw9{OmzT51(XnZweK*Y1d~ZwA6Fn%3W# zjoom9FUBK{eYF&h>00HJCYUYtJsA+kOjZ@;dF8>PfOKQcgqYo!J%BrVvDR*_UmC`G zTcIeR0-P+2>De>d6V2NK9Etj)iLmR*gg^vFRwG--Zd}a%88e`yy<5=U;wh1d-sCon zf?#o3xvw}c5Dp7GL$sUt3TKp*$~En{rUJ9EG!Oe+J3L4>Et0t+3o2To?kUCd<2FcK zjQceoVV!KZ_{8kwp9^oF~wzK>Twaq{H0^UgZyo^P&rejUDY2w%5pJX81u&%FNr z1^-Sx?V{&5pXVz0=Ye=zgTj-L|<_ z__~esdBWFi+P4T_w;7&{7uin!0aprNw;BGU@O2yGJ@5h={yH}uztO$ur1d`;l2ktY zj*HL1S25x1HpZ6;U-u9AH{t6x!=vzy(8)jGQsL`1^N$E$x0xS?cXw`=Zu=b&zHaM& zk??g}?gxag+rSUqo%(fufAfW}+q&N&eBHMBGvVvD%|W~)bFzWIO!&G@^`pYqZQA!A zNv~R9%z4nq*@hwyMx~=k) z!q;u%KM}reTV9Yx{W`Y73gPQE($@)Jw_)BUeBDO+K&(BS`~VgUU&lB&Pxv~9!Y1MC zw&;7|Da^?hy;}IX4f8tT>o&~y2w%4?-!6RJrhP0P8Qd-%6X7G=ANRxRA>L=v*u954 zv=8)q->(_xOKxnI@wv#{UD=x*lTQ0)`?%NI+Jvc|-Fmr`(rS<{pP#;UuwSn5~?iD+To=OSM;&MV6N1651)Oqd5Tl--y=>$Um7!Nnbj91 zKMaC|Y1EofZ|a44bbniPFY6PqM4Vo<(-&aG^DRDl`oju$r!PQ!t8=Jhrylu(!+6B5 zvHKgO0JldIIU}J-reFO4HdZh1<*m=DVNjCq4IiT~cZ&ahlWja6RW$&}KhZ^=Y4YBi zN^xqq?-3^>p+4OwJ7}i@p(p-d@!FSI1+!=MTW^VCJS3F%4ud}R-ab7}R}eewgz_q8 z>Iq5O;F)?;uhyfM1yPh(nmhgb^{NwFmAymQ3{f15gqp^JIr@GqY`-VF<8Cuu%WxO3 zMz`Y|*8ZS_j3j(*Vl34-7_s5PJH(8oI)2lyieQVzg7!#l8$S5Lj~4&no4Wysfi_yI zd{;oyTEHhAE#R|6G<2CUyh4u#`TlAiSvv7bSOVon;+HHIIo#ZvEJnV3Eu3sj!Cy)y zizNqMnC3Tl5EUJjJZe_t22BqLaYUUSxd=c9mbkVHahT^B}g_pS7r~eQ`Q%Wr>+7z*|+dKxBkHXK{>}e{_ zFffA*$C%}0vA5!P34UXH7^+#bz0YO zq&@#5UL~O>vp(!lrQgw+2b-Pw&rnn)eKrN!MzYT~VOxpn!uYslM125?jh{!7RDYPC zp4B|t?0{o&PE|8ws+t)~HJ-*_#rv}vOO1L(HLLSYoDi!>&MvApIfAnAbFNL!Weh9= zL(kg8he@qAt!wtdxxaSTW_@N&A8IoP^;ad;$E=LPQFD8oPRjJ-)gFhmsy)V3?J<^W zY{Xy1d(e!THl=2r4YUp8WJu8B)w#}w;EX-=tg|Yd?AZgYYj(%Eqd7CH;L!WRO|{Fu zqX*iiL64;glxf7P7fz9?UKmsL!dR+t9sVlbjb==Gl{rAo%1PPGnMidg>>n_^_&Hb3 zo;bt6nUJAp<+OlzRFC0lUBf|B@$Hqfu(h`KJ8H)opQ=Z(u6oXLOfOzV<=~vED8^Jp zF_vm}NnPR= z9$GUeWoU_W*ofhdD)&sHOm@=t6<>=_0 z-VOBt#E1-7v+J?pi5rjKd~En`PTR+C-Wz{|_@&D%S|Bm*7Q-zNymtJ}ml&IfH>*|n zS>XaR!kLnR&4+u4G$*^j*<>Qv&s)G0l(Tf%&s($0!8l*XixI5zw?V%(mviay0)E*& zx(D+_-RI+X;lB8zf*L!r00Df|c&%4hHwZ`%0Az_dYqM8yOQA4QaPH{6F!9i2au0Lr zj(}+`KCLAPc`f3+nR=i?7A3N1A%ioL2i4h93uj2w!{W&`U_@^N?1p#aX9bpv-H_^T zF`4sl7hseSF`T)>pd1m)L0NwbKzR?S1@l()tP_B-d9`B@BoOGOT98yfdit3wQhEM`X!?UY@f0 z*~s2q!GT@Dlr^bcp}}1<2X>`F&tO~%xQf+}MRtLvHEGh1>~T@PiGT)eF^Y`*ihx2$Wh`B*U}7fMg9$>G91 zR?jXtqi_)@^4nw6ukY5=YFe<5Q0>C|=T{*2ijJ*SEc&5&7B47*88Og{ObD;$rBUO>1V6{PGo zhpcSPBo}LmB6|$jwoOlqo0NB;=GvT;$NmU{a0@v zsHeqo9g7LEXEd$1OwD^n(@LTu2_ERQ_qx5nO>$j;zZ~b@Z7W9WX>rAtPaEzVr&oA_H-58^s_8T_I$)Uo$qLNv@B9X+6+^*EL zwX=)oh4MnkN1@kTI-24RMH0hGrzd5=Wr!_hj`fbln=>IN$4Ntd#Os~vooa+jLILp~ zD{vrfwQx)BV91Hu3deiZ5td4-kJL6�bZGh_}f>#5o;4xZ338&?!Ii3}+Km$4at$ zId8VPG>fe7)fF@yLq(xTl5@L_o;*1#w$(r)Xwxi9xYWZZP8pwNL4tsO7g|W>#Ow)5 zo@gOI7POH1B0+dV2j@U(1+3E2S~h0UZvxJu%fW$OPel7Q!3F zG*d9B-cW3CQuLA4x!N1LRghZVaE8 z5O~Y-I-r!W$)1GFv!)y;K_}FSr@?;(GPg`b1cA5jc&H*DLS|@|h#8zGo%C%1e-vbP z%~o=(cPD+Egr`F0Xj3kpJ}xP0A#)_32od7x-%#n;F7xC}Dam~!9N9=AYdCD(Qc-_{AM$lwU8NcB(=rY z$Mz_L%tBKxo<6q6iIB@%QmH$NUd^OexSAWrGd!NfbD0FV2#lpGiQPUC0<_;*6)Ia4lP zze>l6S0VFJq0$$v7YB5igK5c)+$QFUCFsFY9!ps5q?tD6@cnP80KxW8S>MOFI zat?}xmdTyv&yN+*F=TXv7jhmMg%8P=b{)rsCNm(a)KTZ+TnLt6$FZB1d9W}JGY@G*kE0Ve=$8)0WM}mPQudJ z#4l)EP%Zcc1X5^66Jxi|iM3$`&oC2WGynj4V=HhQ@Lo$n%n)5hkQaCd-ihrJ1Hh5{ ze*oKsC>lM+qI8FZFkJ|_!d@Au42AQ8p#oqX5jQA=zQ%qgopC433unX#Mi+-4J}zNE zvX^l>=&rYLUilnhMWQbFSvb(fAzlGQw-xZNmoal8HxwJ-L*eU)GY8;t((Td_XO;+GN1VA$ z_&VauE5g?iXLiLiq1&Y+&de45zotCCal^C;|4O^!t9R$_`N3#B1`A(DoKeU!I^xV0 zk=GGt+<1<4yL7~vGU1QAbn5bZZa?7k*>8_sf9=sPVB^Sj!q*XJ-V(l!IFp9=HbA(z zF!!O?FWhoj-!cfAvpibZu%~ zKjQuQPdyi&xdoqb?h?L^IP-<@b;Oxz=(|pcGhyNDh%*XVMn{~vU*vVfnKZnYaJzKG znHu3gxoqo-o6cWxzD>rXXP5kO~Tg^XTB7^jyRKp_pDBcGo8ZM5oi7%d+!1m zMRom;&$1zeB*>x>qM|Mm6-6*4;iU)(Ns#bL2qB0@mb@Sdd6{f@_*@OBX~b7+ebrah zR;yN9X}`2;MWEuVY9F??*0$D1v1mmrNUN6r=X37N?CjoISVQD*f6Yy1&Yg45ecyZL z&g`7eeOCB7;!H{k)6o%UN`(LF^B2v1{IgphneIJ6+o-vHOg|8#dd@Ot&aYiA_ z=!i3Ic;D^w=!i30g|8#d{6qLU;>;BMRO*H}vtIZ*;>=%!uOrSJkN0vukB&IAQut#& ze&xu=U;m`@_fwymcFS*?9|V}Q@O8wQUBcH9XJ+DORyV|%n}n|;&O9xA9dTwDRzg0H zjyMw#zK%Hai12m9nSTjiN1Pcsgz4*uGabU$5of+5d>wJ-m%`T(XGR>#^mW9U*}`8x zW!j`M+ot_{^2h!A-G0}ua=dC5zK%Har0{jbnGb}oBhF066OkL@%(cST5oZ*#jE*?7 zUF3DdnNy&Hd>$QfhF>McLY(=|P~1FYd;k+^TKZpzIMY_y%*`I-s$L&DO>Mh>)apqS zPO50KUm(S4^xTI|)97yxcGT3j_$O7Ytgdh~_3J~YX&f_dZ06Xk2u>P2{jK6siQ8R@$%==$Jkdi1P-J8RG3=-m3D51wXOZCfv@h(36l z$oC#qeeg6fR(X-_)CW(qysfe+{--lHT~^=J6njw}+1z+MiC46-uCl$ZhZ@3KsP)0q zWYo5|`ZLNh{W<>8{xibxG&%k;{w4l1zC;)tmF*;z&%w-iwbXaqq|Ad<#c`9&#tc_7 zoH@)L@H^m0ysl0$2AIBN<2d+^7asSqpbzLj;cvWPg1yXu1rEMYSRSkc*h_7j(O%gY zbbQDK%jvc?tpXGS!DSt=tlpQyZ=JTo@4_~=4Sw4dhu`AFIm4_t_`PGl&XT1d)1b4` zq~GGnIe%F9+EzUI9OB9n}{MH2DO*Zd7`0zU%c=(0N%y%Pv3cZG9i4VQz3jAn6 zmw@9#98EZ~q73%&yRA6%d<1%p^^qR!ruG3Cgr6h#g;}HUfBY&7IWs?Qna(~iizj$L zZ2!?XlsPhe${d-#WaE0AS??6%o2E};JSe#h;3>KNqSmO!!xuKjI2`V<80=^|7Ktvp z8P|fB9o39h91fSQ93RSwDVNoh`)WrFeG3a?Gor_ZRr3+@@S7Qtunf^nTVyCpZw_14 zwDhT_r7zjoinHQ9WBT@uRHItZ2U%K?fsTNOf$YAX); zGjO=K6(_&bMYq)=1V*=&6$d|p8|R1H%Kox;f4DT5wXTp-OgC0rOhK4x3;I-B(3dQV zOYy#iYsJGvbVH?44Uz(}d>rl#LS0Fhpolj8mVuuWHT|qO)UMBlr(d{1_J>7-7P01^ z8a)cPCwhu8pI8lquRqKNqE9steaXgsI4d6Yx#ETO`3d0lOrN(PW^_w%u+eGyJp4uV z0crH;7GZwTEmC4CotX$zLxw)pBJ?H8U61unk-}Z4$r#^ovJfM_5x0^Cfjs6SKM^12&FN8i8-Mpn{^Ug)NRrAuPnwP$0;~AV4?*-Gh zZ=J4M@xXNYD&!R1icXz=MOaTMo&H5z@dar`SFIjBDBX0r)oP$-tI?-gjXtH*74LCe zD_$LZkvd(qRU+6u*XfH9JG!l$I{mV6TR9fu@oIJb9_OalQNIvZIK028QAD3=5Bd~T zpyJ($YsHJ9*Hxn&m|ka7PuPcE|4n!rIveE+Xm&M%Vxf%1nr0O!muevTR0Gkc^t$3v zuPfeyh2@K6&}6^A9ZaKpCl&+ib`M@V1}ol%1jT!myw?V=Jp#P$#O@0-hOgV(byh<6 zA=^B>>vipbBw7D=?utpFA6%1;`+_6_iWu#~>;*{;(U1yko+h@z=GhFD%8 znhn0{CzJ!C)4ENU^xw$USa*3si3Q_GiM2OU;zD4a?Y;QehJI!?3CLzfQt;wMj>Lkk z5c5N9?4^6}Mx@{gB23BDU|ECF(BCR#0fXNY{ott$g;x4qg=$VAc40zr zXy>Mck~*Yml$!#mXGeA&O*)0$kXQE_LK_B2utRd8Den&~IX8RLIa|8tCX{dUP>-1b z34tZuKR@>zLBvyIltW%kTt9rRIMR&yIP+ebD1*FFc&l(ePkfi*yh42U;M^d-pW&?H zzGU-uz*jG!pW)0>rWpfKh2`QK0-p-CKyT8FlfYXhp_AcL<(mdyt?)|VQ>9u0U$yY6 zZMk~*@`cv|UzPZ-gpZ>zysl!2Ek}!BI_s&63r&tT9t`?MRQR6|?v+qwEq#4dIPDbr znM-^x;$Q6&?lB*tmegY@QRD(F=b%up*>jzg}Z4eiZBZU%V5c-Qerb`}Pi3FPK zYXl*T^&wBaA_*_7N163SkimLTzZ?huaFhR{VT4$UUxRYF@e1fT&{sjTK{4b72JVlb zvvCb=5aI~>D=0_io1h`kw?MB0{Tt}bpcwk0+d=;h`Y7lJppSv>1bqSYBhWv9egX;^ zV-F}~jDLad2K^M&$1-}1&@fOB=uw~vpsZ68Xbxy9=qyl7(-6%84hL-l9SXVz6mdg@ zmrDn|2=oxp5Gc|PT?dL85n{hGoNZl+V*qO}z7)amB`?`H6jC+tr7&&rB^w;;3{8=7 zMPITpHr8iR8y`WqsD!)VF|xOIt<884p6<07kCR-Lu@!`>yZdqRF6si7W7nLFwCwk@ zcT2=>rL#K@X{h7WHX0h={S}I^KmvusC`uG6KZz>;UI+kW5=eRJ2u$lz%5dE#sP43` zyoAAP*FwNnn?ReKqAn&k0zfi2jPXj>ug%zq>}-9yBYpi<85_WvFL}v5VenPuNN9ao zhF|IS1_QAuQv$tgte=ySv&fPjPNmOYBuHiV^n?|r^BV2TH-8w{+3N^IVeHVUH z?IQUc>(-I}?%N3Hd_04_wYOsovZD{#A-Pcv1FQsrdwGef^fo1NH>ASl#9grS)8jh^ z*-g;BXNR}*rM=yWs=DYG41S~g8yUYLLHjP64<0W{ORPN7aT7@lo}pTv_n9p5s$0tm zb$3Bng)L0z+?-GHg3wYqC?mWObp84uV#4rFSFG~>58uMpo3oB=Ti9_BDX2jLq5-$mlf zf=}g}3tzSHIIk}hUmJWEi0@+f&KKX;?a;g6TO+(j;j0qgZ{e#H-&^phd)^1|sWL-9 znsrNsPu1;k_|!e`1o%{0a^O>CnPSULhc91JE`qO0d^8|ZzFPRE3-3bsI>ncO^DZ3s z;IJGKD%c(ACWH6Eli{cAi8xB5!k@%_%DNAZLU>73_(?;<_d(vG=DCDh_d(_}$0gi( z9~_Uini#bXW|eC9K;fAK1{sB2%9Apr3@k#v67iK!&)ac*DAGqN46eW>7ZEU+R(DT(il_O#ZoO!g099h!a@WAA-ViN?=!)f;QorBObFT#JSQAdL<|d9QqdMYS8;Z zF&9F=0EKLb>X0CwAAnv4dKmIr3rcXpb)W^HmxIm+y#kc_`f5<#7q0=m4D?#i^`O^- z-U9kf&^th}L=Sxr^d`^;L2-`{Jq&sq=>LJ<0s1=VU7&A*eh2g)p!b3P8x*=Bl%U33 z$PWr#7djpE3D6m!PlC<`-2_?=x*7CrP`1mtpc_CNLH`ew<8Lb{dwnGib-$)h-LL6O zHjYKETtBB6BTXOf&G4b+z@xsQFWJ}wpNjjL>66zKKHMKu2`}5Qx4|fZ+6Tt6b^lA> zas;9>Qh1S@fh)_6Fg@0|kA9na7s8`onOSlC2;&)DQZc*)d)4s|Qy4)B`Jh$y_QLinrbL#YS}{(qxQ}77ik+D`D3X zP}Z<>qOr0yydDllx=-@od`vy6@XCrsnMl-9hIl$Sy>&(oCk>PaO%vh9B>8y{L&VYz?URt|y zq7?@?ux2dEMAjlnVp+Ag`-$bF!?7^Y#Ze|Q)8%CLZ;F?iWtvGmLjqyfDnaJEz!0~z>!I`uAq$?6{1u-2J44ue`kGIcJ5uAnK zEREps;km%(IPo<(miC7QJ4j?+#+mI)mnuC^AF+_>QVl0gP;%$Y_XXo{F%)AbT-2Sj& z4-=VQ$Ezri_1pkqT4VH?EPWEVnG0zXK=RiO0#|cG*eEq^YU85SUAr9 z8Y<~`*P`bcuB|&dl5$6_|H9uV*{XRxQ$P-$=8}=~~K1 zN-U;N5qAvWqeSLaoUN3Pw0&H3(;ca$JRIEp^)hSZ^*oNVmGW@gS7@d@Tub>FiNz5@ z5qEswV@1ZrAKg_ zchBPx>h*A>(Y^TfkN>LrfLAA)u_&X`IX5DmKvQi~b?X|6!Z9!B+!+a;*Tcp4@$fx5 z=C2F%md_9w!T|ElK{wKF`F1m}k#@^p4h|QsOj)(+b>R3TIJcRx!o9OWaiLpN8`-WIOo_Lt5utA4pR;Us_Ry?2Umpia<(el((4(4vj@kIZvW97 zy;V;T8N8CS+wyqZ*Jb8)ytJwl`}stPRe*D(yBRS|@aDO>1toK5&76Ja%v{H>FA6!? z6v>`9ea4w3d1vP3;<+v&WOB*uS+nNMnpKc%e@C`&h~}K>v**k#D4IPxmk*jw*}O=M z=;GOPist6e%jMH%WR?Xpr|0L-&Yz9qnrLPb;Q*taK7GdAnX~8RhQD4jGg1iF(IC^a z3rl9qE-9GDI`9)WQ`k=40!xd6gtl_Whg2pIw4?oE#j$@Ib;hzl*=&qxD`_W^a~K)g zEmYw_TOke*W;An?x(wGR2KICK%Rqh`rqHUxJQJ4M$#B+J0ZoTP17Sevh!^@!L}?{b zSXvrr?Fa_MrqIaXi~Nk7ag(#MowaYRtX^SW3;48T=jcuaPF*~G7T?}y@x6jGqcA9T z1SWN9-n@c9YkO@+O-rC^4L3gw%RW<_u+nOTNXXTa@&MiDMe@=1kw47;K z%0_ou7L9bLWwn}Cy3=y3kt3kk3(881=A9Yfel=$MYwvV2R8=QU%(1IIY2pMU-~frj zkPMjLX9n0%#29Zgo60E%Fe%{6wKYaW7A7JzceFsN+LWg~$}U7_kQ_NzPE>Vw#mu%%^1eXWt}WYyJHuP_60a}Jw(`RwYc}|gJ?2}u1ROyM3n`O%K z)|qQ$<~naHOo05$A#;@}#~X|rYVQl+e-koQW8i_~qR9=lmrKF>AoFumj_u->-do`R z9x_jig$IuHcT0~;+7BQz;8aSfc6LjT52Hsx<^xkMR(gCG8<7b_cN}!F%C`|=`H=b4 zl#7)fm#<^+QZbh=7U5#0$0ckTWQJ#nSj_s)MhDD;%+1+Kjt@0%^{qihD{>6ur3p&T z?vE(+Wo8Eb<1}(%J&##vN4C~>~?WMTdp-_lqA|H z5^ecOtTD#MkG3pW%j^HUv6fkfKBVP7q~$)O<*zK#^4Kqgv-}}++jiVT_k*%LJQ`&= z0%VzJp!fRlwa#X-TM7 z-q9$?BNAEj|1ALK2v|=CuJZr82+9O){mDrDjy=859DhL>X_p-V*vAF)#s$g>=a$UL zD=UnIoh`~6ubx%#ZaZnnw}xPNumRC@Kr-y#ZaeyOp_+LO(W`o3qp!{D6m&`&thZcU8NgBc*2tmgx_{sk*K* zA6jv9)eR4w_xa??iXR)s|0Y`T8=I$;rL`aN^4j_L|KN{lbC1U-DwuITkB(OSBjM|4 z#eWsPj#hjKo&(*`isuVoM=Soe@O8A}zX@MQD;|tBmK$2}G~w%L#cPGHqZL0Zd>yTL zIG&%~(284xucH-j5WbF9yhr#tTJhv0rvLMqzy9sXKf5Wl^gC~cs;h5VhsSQ=>uAN- z3SUPnenR*uAOQ626XBduAN>gs-C&4@_Y?I$H5O;p=F{cL`rdEB;9MI$CjlD%01|id%)RqZMx! zzK&M>p73?F;?o8({f9ok`~6q0Tbg@Bzmu+7pK{i{_%%@YI$H6cgs-C&kHmW@H?-oQ z@O8A}ZNk^livKBm9j$oAU}@*S{NeS7-#q%KspnR|yL-ccI=sRYzK&MBRroqu@!_}y zyP*}ID|{WT`1``w(TYD2zK&Kr0;@?kwBmN*>uAOI2wz7leo6Q`TJf=1T)3eX7YScS zD_$df9j*8Y;p=F{?+af?E6&AJlp9*{)xy`&ihm+}9j*8s;p=F{C*y+%H?-ojgnxCy zDZ}sG{NbMq3)3?eym#g`cm<86*dGxV>%*=nc$Dgz_R4qxQdW=8oE)z#HoJ*e6mQC~ zU1xi|;(chvZjd<3JL+qC88EE1wi=*e_07xKHPxq8w6?VzICKwSv#=v?FD6)3i68vh zV9 zKCI#cf8o)GRZKwOvDH;`TB<7>+x?^IUr@QSwx+apIWK_`47A{}ZIuh~J#%&4f?#D^ zkj&b81?UUVU|cvsg^f?~+Z0}x;-}}mrjKa0>Qe`0wl1dXkcjCJ&vyJ07H_S^@vBZc z{Q4pezYa*4!i>c`etbvk$C>;@G1JBGDDY+C%pxV?+eZr@mS2`CJXgMtjSv5C9Yx_- zz7KIU;usf&6o6m0#NijTC_Gp7u?N1;jt0vyW02tYnti~zegp|W#Z1S%Xq3!0GK*$o zx#D9I(+HV9WrR#$vT>a$onqWz`jQ3bR>?gAo|1#%cPcEwlVAy+fZr_eO~8B$f5f+i zjjbAvpT^QY%-tTGA0pGSOX#ATuoJv!NL(upZQg#24`obeV!28)?yC(kN-QYJ4Tv2V zl&jc#`>mWnS%&DQEi#nhJuT*xeK&ooY3Wl~u8Q{zt`!f>n1p7uns7S;fKQsbg+o)d zAcyzya>aqQ3r7YH%kk4|I&08Jw_p%q(Jg4j8HTV`Co#4-6U+6BwBV!Cf^MLH(SwnB z#%eLvN3|Gzs>SF_Cb)srHpSqCR6H4MW;-bySJh4&?xS(Ik2L%Q7vZAYsT`rv?PSH_ zXg)98PL{fg8}Ki>Etqbswm2DKsx9bKZ9$*HaaBCRTqqt!k2!M821ybuHPs;a^%eRj zR)bLE(IqINO}$$1qk(O$IQTuycq}~i><0M)V1H`lIN%igW;sZhPpk%_wpI;9pK2ib z6yBfWJ&0??+sNuk+nBh2+n~0C7y2E-Oh_fb3+*UC3j@N)#ODKa zUV;U60W_wLGa4$~;|bS-%S+-M2Yl2(D{4X@d()D|TNGlSi6+>6$f5=(XjDf+L)DIN zcMnxM6&k`%P{L;;;RFX+DI)m`yVoNd9jI>rps*GJip5bRq~?R#9u6F=`3*ixYXcat zAY-_dB7m0$ugyoiz((FbP+ZQh0vu`h3e3_?v}jgyj^i;ON1`za=Ug0VMj6i2#8-v0 z3T=fiS9q)C%orELrv@s11U2FR9)WL)NNmCRbn*Qb=R)zlf%9qNP1}|L5YXa1ey%m3VJwbJ7_*A8Z*ScWd3a22{;A_lrnuO2FpZWvVee1 z72Y3krZ3s3KujgK)bzPS=ixUxrD3{vuG`&lY~AIEEt4Et>^byrW; zmOIz|YH^ z9SRK?qDK81C|kc96!S&+C7>ARAu{qqL`Q)Yg>;i#LhTwT!C1&J817Y-t-5Y09@`ohkMi{J&@>ltVU-udI= z?69=e$&^tkjI}j7AYzZv>VDK4nBYl;r4g$3fwE^Lk#unbLFvY}A2=6$2cp zm&4$YExbQO9E>i=yoEDsNH@^-J+2twFlD;uOpc-Dm4cA{A>we9dp*Cw*~%-$_VKPt zmtyDjH^sm?x?Wtp><=r2D|D}CBhFS{xU=GlZnq*>1zGjtyizVYufbsN4-tn-B@z*5 zu$>oy>gWdBc^wxsuOX20dU(I(GxxBw?;c3uR2qZ?x9 zH8UbFhAq}O%QVhPjYF-XoYi8tY8*o6MaujP9Ny(wFOF{@scAB=MR1(6n~xA)&oGGx z@V>6Ya3fKp5YW43EXuf{dh8oLB~4PMj^~JY{_69vq+o*1c4iNFJv76$Mok#y=oqsY zVU(jWR>2IbeWpfmoLC@3C1vW3NJm&p6X;`7{_HukX3Q&@PHYW%nm4g9#C*uYPQaTc zQ$9ADM{#~xVOhY$KyXCRVLbv?RQhvI~O4@C+bqM#<$8!NGB(Vr(vJ9zDS@KF2}F z1%R7n{8^ZiN1ccj9Pg%ZoSuSc5M_~n1o-!wGL)lpv&jD;_&YnEy z^BmW9aCW{?^_Ye*B21iqiik0qYkCE!M=@l+K1Rt=ox343yaYZG9PS&dFsNunN+hz37T;L9NoZ!28u7PPEtu4rkkZEkP3KZsOoUErz&ILigo z;JW`-Oao^v`cMt}P!0M}4Zeb?2KFTVLbwL%XU0E3pX~?PK*ui7(FQbB0WxmH!wJ8c z6l?HwFeZTkOs&es+WO{YEqw9UQ5_Vs;Nzf97Zjac7%0QjO45+$7&8d%Neg0H#s;Zw z`Jrn-$$KC$rzD?d=PV4L(*^oKY>{ch-imt7DPi~^Gd-+C^YUklRr&#2c_%FG2GSj3Q#Ge>aED$Zm#YFIjb?AWL9HohzK+B0st#OSkpaGH1p!``%k^<>KC$7zw!Kbyr?M?{?l*& z=hDtp z4`kr;)a+UM-Kx7EUH;6!=T5qC=M{LIxL)`-o;IOq$AbeG&T1~*{NrEl!YexBAp1N& zzV^LPO?Sfgo_nDGyBROMcRYSY#!}kn`Fzy_cmI9Y`%hLrdq>H@^DnN$uNA@%{M-1+ zYmbb1A^VzbgLm|si5F;h3xDFMC9nPJ&X4kj-t>)|JfE$^&l9_ZUv>LuEj14>dfYSn z$~#7$bSz%tjl>$+%^G}x@O7*2ON9UN=;Ds2Z~p$EtnbYD+O-!49>PWf!q=_42Vj8s zJi0abS;E(?zC*&-t-HC-_IY&c?qsapeIDJq`&{9_?YZZZoqJOsx?$WCHFsS1&U<*1 zE_~g(dzbKa>+Z=ID?X2I-F?3Bb?ffig|Az8|5Et6b@zXSuUmJQ;91Dcy8CY7>(<@d zg|Az8pO(aQbnEVmg|Az8Zx+68-JOJIJ)cLn?w%!l-Maf4;p^7je-*xN-JOlG>+|T= z-D`!fTXFwZ_`0=r2A(zDthGCYuUl(BBYfRjdr&IV`9Wsj8%3{wJg)JOV_seS-dkV8 zPuIfNt+jt3eBCNLVGz^Vq*-N`317F$zD)SKRraripEWi2(;GU6jb1+EkPYv6*W#u4 zQP5dHNjU86gl!ir{jl}Y|J>Df_s!5Jjl$QhvVSCe-75Rf!rv7f|Mv6VM+aV0SAFk> ztABv8ISwzKeIDH^yGr=F_4N;huUlFFRrtD<^$AeYK96o?%^SMUqgz??Cg5get*p&; zE9>KM$MSh}E9+w6>sHoZ7ygld9r41g|98R2XU3j+(IR7Hpr1o&?%^o6riz%*9+n)wO*#vQ9&G>qgeTroDpO zeDpG6Qv1rDTDjW=`>(Z;?X3Ze$Cu`~EwIg>@>lk7MPjvjHOB(di19Tn#Im!j&ju=5 z@a+KiP3d8tF*JH}ZE)3!UQDvjoVEAOSu@JAl!a@rTFD~Gs?}m!JIO!B4=Y;Z%gaYu z>W<4&86C`=RSm72zx*mrh_0fYH8-zMu&g7>8;k~QY1{?FFENN(KPO}Od~7m8Lay;!gIGY&`hnqihi(K>XMU-fhHF;hbe#BAVSwAPiG>l5g5pse3~P!=N@hq8d6Pgy|FmyEZ` zDm2C5&U=bCwj#zmudv17g6@h8-@@+33?EGMI4Bl07z?)}MWcI9=hpOfdpm|V1k^BS zZMZl*3PqbxDwnEAkx&tI~zE0{4##VyE~ z!VEVB`*lsinDmP;6T>ZVE;3@H@k3{RP;6k=2>LQ{R)g&lQUGsxg#q4A%yog&6k-D zf3|g|&v0c*qrUQFiS=-m+lL7IE{p^b^ zZ2-L!bOq>rppBs418o9*1eEbOt@ulc+DD!~wU0b~$wnO}lj1d+KG`2Wq1)FzGpW23 zgE+OM!RVTkk+!!Cy40KiM>ecMQK&lWt|S?>oma56rS?1l-a~LCiuP2)5zVFPOlnlR zBt;AkLe6W-lIECvXSfPg-%Qaua8i`cWSWdiE4;?2L8A1f`B6`tre!paY^ml4F>0Jx zYSKa<5QT`)$wN5V=qRB~%09x?OyQ{$%f^A>)Q|1xAcn$5BE)*5)5V%{4Jar5`Jk)| z27z?saQKyeq)+Kb`jU;m;;eY@n7(AO)l@uwc%kIV7r|sXZQb5rV)sO-va!;0VtshD z)B3RC!f>b3(s>JF^y`{vtJCxbW5M26V0^r8Q&(cgA$8O@bvTTM)*UC-U2k1kmdL3P zgJE*V>2(~wN-)ov2a@mKInC%e%r;+S5x3#zbwIbDBPHmXk%ZwmyhP;-CI=hFj6e#c z86)6R!|oLL)Ud0tc@4I&6+Y^bG@9?3F|LJA#rQUS$4Mx=V;7Ela9Hjo)5AGM$06Gf zl(J}H;}(8zFW0&sYAM}?nw7#S+H0{B>BIxGEaCEO=G>dkF9CPYmM zmYI3Kh@&}bN>FFUnh+{gM3U%HM#-EHtTaDg;ufFQ{D{`0$Ko4&&L7Sf7TOQ_R+%re znJ^qX(pI8+6CEocoW#&PHpPz+izN`}e_-HGd4LGK6s7U)Bu zuuBU481xR%pMc&8`cu$vf<6IyBk1#>H-WMr?gV9XaLg*bOrO%r^d%dIVmOTy-cZw* zYy{wAXo^v7`jU+no7ZmhuC#eq*}U@ZV1{qq?nRjPQ?ck7r>6ZLc>Q$`B29Bj);$e> z^vvIlnLoArOicCltCE6)tvQ{rjhc+hZXcH2sU_v}B~dPsHgyd^x@-ZJZmV0mol}jD z0d+rv(2h&Hw*}ni@~H?`GjlF{qj99sv|FGv(r7e}!9$gb9ya9?;N!ey|5@%H)5A8W zUa(j} zq>N!Y4D9G>HpsjU5qut|TnuKBtXXEyn~hc)pezUH4WbAJ5D3>-A=dkQplrV%f^yzG z0LppuASmYx#&+m5(9NKygFXz(`SJ*89_R+p*`PlHEd#|I2%QazIS^_G#Rv%TUcmU6 zLk8wT2y?(dr-v|Sj3+@cXN;#n*-n&Wg{Y>Ku|0jt*q***fhAD9R8&Cm8KtVU#W-8T5cBc1mW-XO=}NHaL<)VMkWJ~jS0RyeK- za9D1p>9Kl^(^!5bboU+B5dTEIk&oXGWyJ#MV} zAU|2UaNKZ`Q&-ZV%|fKlgAM?F0hE1!c9r$)i=Zs`OQ7t>OdM*tLZ4c$(3dRGEsFP^ zDW{$<+zi^O&tkm7JBSADv|@{NPWv@4g1nwtJmXljXA_zL#f~s2<*4v_XuZ}SK02@M zV;G&+@XOs=tx*(@9H&__=0423 z4deTNZhTrVGkY0u8A!@1bE565Ll_+)B~)Hm#+uIJTy8N$CJ?BuThSg|p_tL-;Vklc zs9%`ciNBnM;fBVFXhW71Cih^oWOPY(dA^|-;6$gKj1aE}T_QDI^6+DC>nU@Vdp%2$ zHGOo+cFOlD1~^u|pxI1kaWEI;xtDpdWewwZa^@+zJe(U|&pkLx`!@dIDZM;{L}rsG z-14b*dA1{rF4Zp29>u`fD$fAKR4zJqY8S6(CeJwD`)1lAJ@>&PLyJAD-w&~Ud;vpu zh@IC7k$E}n`FxO55D5~+K8;5VWhLu)l_mSChc}?NjAUo!V(Yf)1@oroyBNt@Upj@& zWch8sXv+nKWsW@Lb{n;;e1K*mQL>Sbi7M2&PB!J$p7LSC-|Va$ZWyl;Q-R^V?!)(c zB_P*g`)uxVuMBuK9q*9l%Q;%~j-TugyZu`9=1k5WFXG&jJyk4vZ_5ckTDw{Fer)%p z*;y_Yy=BK6#wSs7xh@vHvysH?6R{4)K}Rj;W@$>eoS#AFNZw4~IOg0eSLcI22Qs&r zavZ;I>9r!g#~?F$Gz8%6^js{2&oyO~B=gnxZa)_3t%TeSrzk1T4!3;Ig7z3a25&-6 zRdRN|4z0@&f(rZyGThIcE(M2MdNen<6*7mR&*-Qvq+J{{jQj!|i%l6`)3HC$^=$GF zaqvt2xGZL|b5MZa5dL>t%sOk)XEEDnG23S``xUg9wI^v0EN1ht#`-cWW+Qg@?%RhO zca9$0;`V~wZCr-6v}v}jQ=M=(c+cwyIhea^e-#XLBeq>%STASz;8; z?iY6P^jU@ZWnv_6CmPqz*%5nfFPv9YURb&yZ;n~@2(4-+=ddGpnk2K+ThS~r4Ui+o zb>X~)a|=uJ$_fi)w6HzDkYTb|CNIUk1S@iUWAMLbnS9k%mtK3_=IgFFa@k|mKfCEQ zyu(nI$!EW6H2pgD$>l}254&kx@xN{aECiml+$@$mg|AyIKP-IRV)-NC>lVus@qFTD zv3#ZQb&KUkgs)pH?-IUlv3wey#oR2G*9%{_SpJLfb&KWWF;;vY-D0_3_`1dN_k^!o zEWapx-D25;XFQ)rw^$x4eBEL>B>Z2_d2H+C6TANsn10`?ZLe%XfBjncy2Wxj-m>{T zy2WyX@O6vj?+ahISpG=(y2bLOflObwSUz9)y2bL7!q+X955;>lpGUV?t`@#-vAjX} zy2WxLo~?Zz-D0^+`1=0R_X=OPSl%Oi-D3F+yvuX5SiV~Ly2bJv!q+X9bMU^;&0=}2 z@O6vj9|~W$SoY%Wp4&dsvxTo)EPqS*y2bL_!q+X92jks`+dk5j!q+X9uNS^wD{i>OPC*__uA1@p1N-wG(o0b@Bg_#j@jF zK#bq|B0txcXO*T(8fL^L-;-UAd-&bHWq#0S;oN88+#Zh!q%~mrESyclpNiT*OM6xi zr=P2`@3V0JLL(8d0zC$=utsz3>grZneD&mRXr)oz7ObgV)>CsnD-~?@aDe4lS$P1( za2t^3>a91&IB*o(TY7V6O_=QAB~cGs&aKi&u+PG|DgI@vJ${2Vm2HG2>B&@z(GeKW zy_g_?Co3E4m-psi>9cU|vv6MK3ZdaPqFY;9`H>EWbbL<(wEiKoZ7 z5X0PhGU&H$Am&@fhJpuGg&~czMLHS|a9MJKgsF!@Hjx@#M zl6|a}#JS*`3L8aQe=R`gK3e?fHE3 zEmN6Pnin)Ilu9);)m?!^!lnnE&+OfDGC1it(qw=@T@rlh_HglUr2`Bs`G2y^ZH<-OVY+<=m$XXiInt`0;FfYsnyj^*M2pmd|j zL>WW$mVt5roCV5yF9u~x;mPpG7J>&GgB^lZ%4;4!kd!VHr8(U!ql<*WrXOfM^ktx6`? zqrk3M1nZUIv|dS{k6mtu`w<5;ll|6JmT}53t3#^G-8{d8`<0ZO*rQa9EC?0MEpQ&ty>9ay(I%seg#W8Qy{L z!z5Id@`I@GKOr2u8-T0o{jN*+AgPPW=QWpbt2E5}A2{-(lsU`HGI~H?Va1h;ROa=~ zxwErJ!w~ED?@SC+JF04%k(oSA(try&V+ePE6}B0DTD8(BYxSK`#M) z67*8g--2ES`Zg%i3he=12g>%RJe%Wa9LnUAK4tPrU$X2rs(2e9uXr0X5wsl#%`9^k zlrQRhX>ayx*}FR@`8wuKJ}V(OQ{8(oGjqEQD3Mg}Q#hYOyM6F{oTO=(ng#QrJ*GgD z_?xT*#df=626&V12Ct5lsl#F526Z`!ZPX9VG0@f&>s|{ETp%UFx`t+(=X7q(KPeU?u zH0r>#y-)3iHuO+ScBEwg3j12$zPWqzjzdc%1+zFw2*x(JgV$y<_JtV*Fd!n3#3eKT4jvRsLPE zGkZ0SroE=`3HVMG-VU6{itj}9=osEDzS%c_{1#+CF}Sz@0cO$9nSmC>(E@%xf`!x%fjr%X;EgQ1&DAOehQVPS8o9 zm`kAsP)w%~=DwJ^c7Z}ih$-wQ&~M`UDbPDWH-p{-x&`z;(0f6j1N|=OA3(ti{R#Ab z(9b|00Ofww4}zWs`Y`Bp&__V$g8mS+81zxlMW7o%x#QBcz3^q?NPz*D@+BKI#bk^WgQn&5#Wvf#0unJ^#vDYmO`0l2I^Aq@HUu!l zjCo~`zN{X9ocn+>#OtAnQhzg{eVJ_@Yszqyg7FPU4WOLG$+Z}^%=`$BvxLmk>tVPT zN5QLmYxNRRTX{V+da_E`-}Ws>7+rrmugeqzXE6+Pm_!W#FKk%)hmY1miKsd#eZh#7 z!G5bvwN2HnxHpQEbQ~s5N#J@tyc<(fExx@5OFUe-7;@5J$|`f%kaL@)O4ClJO!tn- z3AgGe8YhWah_hlHsc}x$I8!vvJe$Ls(pB0Vro3+>R_X|~YitU9n=jj0sMnn#kU`>X zO}enD>4j!qVN+9mpWTNd%ES0CXq-1S&Mt7MnOH)O7&uiucvvsz4z<(_Zf2W@B8Dh`*aTLxh<@aZX(L)RV@_dS!R*;CHlo(^SlC8% z-%DUs4H}}VkKrRL5;p6!K9$E_Wk%SPv}#Qd$Wq~JbF*GE5o_yS*}^q|HmL4ss}HUT zRJXLOsIN70ovgZAz_X};+#F}SyWMA1p{?X0VMZ`Nu$Q#38&iEVj86l#%{6MrUTKI3 zn~8vJKWi0SHnz>q8lQ=cZRN9@Gi!qjYR~JaZLY2ro79Pu{9$L?q&k@h9+#OpVZsE^ z$vK%hB2Jss4CAw>{#5>Wo?upSNMaba)m8^rLd_{hwYS025f;O9(ojLc1ALPcFR9flNME7jUe)n=LHs*8!OeOu1O;y$ZQ?kU5v@Pqfmn@y@8D&RxN3>nAN9O*^13vUAXri=*UB(}9tas$Di9fustT^5HN^IaT=9NVwb zP0n#6gNVEcS{^0m)-G>B_I$`K;c5^rRy(u4*P1dSh?84-e*yny$gRm%QnAt-gy08E z86_Dzy^WB&DQDm5@#W)lka@$D<2}Nyd>p5{AoDukqQS)~Uk$Rt$IVkw;koo)RO3qF%YWy96;Ner0jCFRi0Z&8V zc*qr*va#mdA0f8@GN+!QQnT}o8drRPtAxyMQ;y@&tsZGdf=NiUo zIOwRq+|uJXt;*%zj_|NmXMl-r}VWq54&Bd1FgeWn-YJ zvVDbd1VXB9@nBUW6k%mEzUHdIi#>A}-lBQf5_w*}+J~3P$QH_h5^S2x&0h}#hx;kZ zp2}qWH|^&<0_8m$^|$v;c0TTvYGpC{HT%;+FBI;M@fb@f9vpfQ+ zS^GgBEF1K`&7EtoS2lL=W{Uw@hYx^_P zG@fJIeVTkBGilmUb6$M`bLfvDz8dRLtTQi zZNk@gY5qX?`Yz39^kX{uF3p|7*LP|DzVP*3n)zzg=UH*#y8D;C@cUg==QO3({9t_m zuOfth>E5T$GgkB;_}iy)hWOjQg-42Wg&#QcU;nDOXY-mr4!-Y^;tzNI81S>g|J@Js zrVegg*YNUxh7bB^)dw~BEkO9Xjr4Zm>o(G(F=Kol-A0--$<0RkDdFojll`%__jz<1 z=~=?pcW=H;__{6hPT}h|&p8+?K99a@_Zs2rw$MKnzHY;uir1jnO?TCYYwrKXnxn73 z=MOi%m3Gy1yebjCZj*e2@O9hc*MzUz9v_WoPT1Cd{Lyb(3W`=W4f4D_?UVl1cnlK0 zZhQPA;p?`?i36FAZhO2)_`2=!{leF6k3SKo)LPgs5x#EIey8wto8*5AU*APJAMb{I9^IyWx$t#cr+bX{!eBB2A2)xs9vth0j zzHY;;Y@v0V`9F)iZX2I<2-DYXo-Yu-ZX5p#;p?{0p9o*KjXxbfd$`$1uNS^$cGU5Wa5ne2kCj>$d3C!q<1t-XMJ4MtZ;yrlZ?PFBHCRBOMaHZX^AW@O2w$WectE z>U`{>%-7vUx}EFY-m-HzKpSbd56ydjLuTu{@!qO*duwgAS{C=zZpy9RC}p3yG5XS>-pK*0tOM6TFMktsgYWwJ(Ol8a1%i6T= zK+-s%t)*kk{;%k+(7mytv(lD5GzGHyt;hDVuI+t5_R3a~nkpL`TMl^Z%3d%9?la?! zUy1aY@m78T6Is{EgRMpzdv)#8o)xTat>@ODG47t~gErZXuCczVhnmE#E>KMeVpwZw z0^AUKUM?$<1A?b;tK7ji@m2jqbcxt~iRwDncpb}@)wcCwk7ALqyrw?h>`g!ne8kgJ zb8V~lzSO;uV@!+4rtEc4kNW2Jmg*Hf#Za&t#<@3hPgY%SLmRzZ)3Pf5QPxw-d8-l! z0=D5+{sXY5j%zG9c6g3Y{=jx;wweig@GFj_fPvGuXY{zSnPan-M?Gz;y>G0tdFplA-FWJa~53fDJn_&9z656lq z@9;B?k&7d76i#rI!%r>|2VQB)?@J+2OAfCmH6C6m3NP0ohu4N0FVp0OK$#Bn8;65s zf!)X6p=Me5^;tA;qJw9Z1wRXjoDm9_uf~N}>%yxydAXogy}t!N%R$EmCjTKEEQ>Rb z@8eQQ?cHm|r3HmmW~**@fnmv6>A|ci;clk41zjRNmMEWp?ZQlG=&{isS~vB!@X3heJM+ zu(uy$Us{g&?!9QJ{i!&f*Pv!vaw^wn9v3N zjrIBcgGVM`)5DN=-vPPNfJo*rhk5?BQ3CT@9*~R zT_VF(Y=N=)wI#)pXa5RPhXyu&ib1ZV)=&31WZ3UkN`@bw+q$MC`5~pj>)MeHEbIf3 za%{s>airl-S?DAhN5VH+c+?9gi*EtWC*epGyK^;O*5LXC;a!ij;@t+{Na5jUV3W56 zKELp2zZE&w)`DZXzr(|Z=RwD@#^J+j#(LfKTj6&jT#Z_#@qXbF?zHrK-X+{=>31c< zXGG0t}rrb|KDYprf z`ECYn2YnSZ2+BTXdVd9_9NU?4Y_FqnD2qJ$l;)x@*%$?-rFf^9zGTBxCq_qb*`$`{ z#x+Lkiu%7^A^lLjkd!H-D-c#e%%8{Cv`t1xFgZG2dYQ9Bt>K((#sD0 z5CCydq%TMc)&e zz&kand8|0B(gIY;bn0`p{j^PTc*4v_)Jl{&aR_~f+AX8q8<<~o)4XIh&C8%H$1lyM znGC;b8v0bz&<9I&oE2|_=`%NlH()lM6r*_tL6nYJ&_y>-2)wCL&11#ku;1pxNjbZD z0@D{1=9T8p4CK!(3Cx(cpOHkw0Co;PBC8AtfB*}_%c_8_Ui>N#IWzyAI53;!MnLAT z&E~-;_h$3Zr<#YpWMdP~inrDDsphG}mC=w^GT#FENt5*$MH9smvH-rYwRZ-^O*hP> zEIwUy<6Q~f#Hhxz;tWMtd3bDL1CKyedu?S~b)A}n`)V~AV~InG5dAP?MeQ0inmxuU z+iS6cS4|p39<;!=bhIDWmSZ_$HDW%()EJ{rH6neD(^8L4tHp9cOC-nkWq{vD^@MOk!4#m{{+g_)1N`df&K;bG|)Fdr+~f#nhT1%o7{ol1TDt(TcGnn z-v(U@N;yvbA{=Uz(5FTTeQK&H-d0mC*;v56%!g;a*7?qVI?n(XW^fZ^c$gz2Vcn*? zh3l{T2vmX^^6D;yKa6R?<>{710EzG|3P6Rn{%dd0+ch%*{&drywDvVDn1^?jq+&bu$T1pN zqE^LQ*bzxM60wVwx<9EU>LOgF$$d|SX5zYB9Iy16%~e@k$}U416?c53QswVe1|UKaO`+Ic3S46>hgv~D0S$s;49i0HU!ZJf%HII` zDXwn?{S5Rr(9c2d0R0ar2j^bU2SL%1vcUC#a?R8a^eIp;D5qzC(3e0HLH`0e0F-^g zeAvt-=^KfopgySfN=s}oMBJ+{=?@IV#ap@)aY{tWr{YKxfG&>QG|XvMhT4v| z)*9jQtau^#s)fhG^LAT+!*U$Mp+)+UJqIYinK#lfPNDcag7^65r;dVhggQ2K-qS@X5|=1 z!RgVb;PmKAHZm~d6_1a%igy=6u&xWLHDJlM{=BB!&Jz}Q^7<|b{zRmp2798suu!}s z!E3BG5IN`Iv4~>{vn_PL5F~{EQf-!ed}>3wLqUz3-l?qpm_J0a&xI}XrN$G>Sl+Ot&G(coHoEe`k(e`mZ(j^*x z%xh=L9Nk_I(`U+g^T)ibr_3UHJ+Ixcg+9E&SQI?6=GqJ9jQ@Hdta&|L2GFIp&wW(y z9o+OF^A^rl{fF2-AG;E62>RU{F`}4exSe0Q;yqkP_dD-9Ue8}}wo*RK_8nuUe3+K< z;Sx($2k`AlUfrpuJXB=Yv*wy(xa`3OlFg2n|V zN97g3n^Iu%Fax;g+1o*Oqnp}fe4OsJRc4DFhJOlz`*aRK43aOHDghRGi8M!IWa`9*D>IEJsekz^!(5M z4wXiqQ`=ArdOd%{*{atu;=>$NOK^l7WB5haW1VB>uIJ^Kbg*8LdrH>V>ps`>8X+=7 z+OYES+rH1ul>LU)VuxE(*yfxR!EuhC<0NICd3Q;xK0Bo6K2l_yGxs<<_o-&e$Ju!; zj?Bw}+L0mY6yO}`mLW#KX_X#`Fhp0tQDIE3$X_TULbcy7BSKw&5t=qFke?gKoLDet zW`5E1f|f^&-I&MlfXXJ&COf82-&npl`W zdwOAhL0+!;lSf48_~}J+&di^kSCGpeLZ)S_K#ooO6*IIlmkj~x@US=f#dAP^s~W+I zLMYgG!CPi znQ6Kru33*Psyy;55k5!+${5i6qIlT-$7Y(tBXW%^3Ze zHD1Jt1C}Z{V86m6N0vEw-EhD@Hs_)}zFly@wqhE55+#>Q959DgXMAer$4&q^^C*=X z*C1|qIeRdBZiLJ=qm>+2Zi2_4xwP~|6s`Mm(aVz#eFL6l4^$6Xz-ACrb~1uCdR0y0Dh7k-p8r-b1{aYcxJS-(s#DhsHk0DhH98ZrUN zvn9J(NjI#Y>xHjl{k$c79qT6x%S|_|AEIdcJUZ6T-NM(ges&4}lZrJz{Gfj72NP$V z_3P_@bJvA<`HtnW&!c1alnP(R?zvd_I(E-f!q>5T5}{DtuzMB>U&nU2MEE*(&sO2D zd2_^dw=_R{$iv=Oo63wMA2N)Acyr4vxbB_zuy26y zbu5^Vg|B1%Ou|_4d2~!4h4rIj!Q3YDI=0Kp!q>4{J{P`@4OEQh3ZF;EaQU|IbnT+>$K97zibdm6N440>buVV}iz&mN5N5>c{626WxbhYqxjG;G#uVV~l;Z3|7 z#!#p5b&R1`gs)=^jZ9%WI>t~?_&UbWHsR}-GO2i;^m%klnRA7&V-Gzdd>u>3i#M3S zVEW4+UVr$_qko!uZuPsnHw>u5=O@C~F@r7@zK$96E8%BN&HeO-&S9gM&p2emJKnXA z8^)1%{sV^8VP_|7yI|>ut(X4iuC}{xz64(Z3tz|j*&uu!)8|jZ-xVDH_VeCH2VPTG zeeZ^=e}J)>iC+MG9v!=yOnc-(J&9v$mvq40I=p8JHaWB2S9 zzK-290#DaIkB;3lPxv}^&-KFBv3oWN-yOSWCzgp{73`j{#UGY1y}5UC?*jn!0rq_1 zjbp9eU4{2MwPW$sM692!A?P&b?p=_M`sONpBpcfzQCTcja9vzsy}F7Mucv)YQysP^ zj@y8kd7vOYF<-XYQkt?Cl3;K2q#SN$$Tp(RKEFyhK->kZ0S*W?$B{_SkrrY!!B-S| z=Ya4atoG^+{2rOr`y3%(1o0sfav?^tD856l^g6P^0m1*o7)8B-m2g0aLNUr^;w1D$ zWmtmMzYZ-ubbjaRg>uCl$Zho!U{ds%gJurb~Y|EIupvNHW+{7d|27+(%JkUyig zs@0!Smg&zj;dRJScsmCnYn9QstbM_hBDCAFPbh?A_UWw zCwyr}7JT?I1U&rICdOv>fLe~94YJF5(7liM;r#TEvhW(*d)paafba4LNT@1#QB?Rt z2=6B!m#aFS=@RadGOB#!_f+I#<IYk9FwDr*;rEUcm!l<8hU~<3c=vW?R67%OvmEQY6Bj4om}2q^4P{R`7nJ=p z5A-z9V$dScQcxT;hYl?QEdyN)S`Nx-0bZyH^eoU8&CgwD7lD2XdNC*rawQ)a z-U_-6jK7FW6yiSDC|l@w&}PsRK~csKO(@O-%>-=&Jp&YFmVM$^ftKKUHRw5@Yd|?Z zSP#w!{H%y^`>N?nG5%=!k_}j>qE|Rajxc>d41td^QVf1XPoHkUYkg6r*`#(T+fZuG z^v+Mc9fwi}*fyp~=fGri;iB%T3l=q)incLh6!q5ou>bW1=XQST>z->s%cchhc78e} zn2^0`M}IM*hhE7jU9hMGT6mPH@DAxNPeSsiz=&08z(a7A*}2v4Mf|S0M&Mj#7gji& zEq)wn#u+#tD?T(CEDy-*!Z}@hZmNRaPQEpVs4A#f$Rqux>34>!Py-vs8O9Y+;iIVA zOjR)+zJ{pq>m;0=XNaQYuyy9I!c}fm6&rBmM5zjvnPs~R$BeM5sL!fVABTsv1XH%0 zRRdf@OIR>Zv`r1Gg^{>|THyR<5raH1pPja@rV3zuODnY5sriv%E0RwXGwMgItU+1k zoj6$idvMTQW+*$?%R$LUTZV>$;uaBN+oI<}$ANwgG|S{q0KE#=lR(#l=7C-f3RNL? zuqB|^<9E^2vb(M_7KJ118-vB+|I32wqPL7!TN)S-e;A^ zT75{YPOduEBtHQiWW4($oG|k$CS&#mlb^VcJeK%Ae{jLN-MAH(@dl6SRY0q5Ou18# z(NbLdyUH>qbyZ|!f|t{g*wvUZWk;g-MTAVjYR5m{0@g^v%7ZHq|GO_TD_M#RUVA6} zlLuTlpnFvk7AwK-VtsW`_Y25GEm(GP;_vRrU0;{CZg22#q*j9D6DCgz4z%)1sCyUj z>Tnnf>(~e3rOc9Z0@<6a#`2+FX(gq~mK_OU(UKUkXc>w^W$)G&EnNe;RwZ=>XgtrA zN(lt|bxmeNEjb5^mTjsx!YYK_%OR-nV>k%Yj3;p(Exv!^%n6r9xCC>}0%Kou&2lPy z95!ikA3GGjM1w1cLBd-GpHe?xgHNTxX}JrBH4)%7Xd=Logc&G~iim#74#sg`RCp=^ z`%9>j`?gECrHFD6|Dvey4#|k+#+J!AE^rN3N`s0h8R5~2h-GFn{|A~ERz&uiC9H^8 zGs~$o#si?kK{0^x4Z;;G_L;!ItCPRLlZzTheHcMkw%E-nXJ#* z=JgWL-{86d^cB!H(BFb`9R3dU642j+vJL+LdIRX|pf`g43G^0Flr?l0=wCta2YnNi zhL3N7J_`CaD90Z2`1DaB1+GQO%&E6o%m&GaQ3FTkhdUN(JD<{X@C8bQ}g zUr0rru_$}*>3{A53=xhr9K&&>ccgBck(3X?chL$)_WSE`_W+#Bj8sqX?Cu%EM<<3C zN9#6q%}5B&vH&>})@>TR7F}s{=R@swjSdbBKSu6_ic0UAo#fDzc!*PILwt_wyg1#s z_{ZJz(z+A7%YE~^=M66%{S2R3hnJUj&G1Xf0hpA5y9ZS6^zH%PpYyRc-FgP4o*&;m ztozI)W>i|TKJ6q62rZRm??~#N;UAsonUU^2_1#l3K%GF9a)8I7Jd{BE8TfW;#3@I1_%3C@vX)=MSNG`%uY=+HsQ>UO5;EQ z2n>C@a8_#dWRylJ-5mH>*ffI=U@C4Yd@4OEQpUOmhvljf${tTL8C1Gd{*+~`vZ!!A zD5glLiZ>@JoDX`5W@<>vnB@}QUrMI(DR2q5)}ow{_u-fl1$x6Wvy1`IsnjCMnICpH zHdY2}1FdZ^sS4JwtQFJ~*3fbee{AKe7KPM$Y?zW!)Ovh!Ko^1z1g!ua0onwL zhbVclI|1|(T#o|%8Ymv71pX6aBJ?d><26C(PS8})?||ZAOi+-9fxeCFqd-3c9S+I| zHYmAJGAJzOLx^J>3knnu<1kQw`>-CO5aAD@ECyym=yXsh#n3d+v7j?Su_TZOw@lCq zT#o}~f3Z9qm!okgMMa-dRP+JP8&anT4`mWxvQY=0l4~@5vC%=+K_bRaB?l25g!Y}0 z&S}}{MG)-uQBtN>Hhsd7_Nds=hyXUJo@6T}j)`cN&mTuF|BGQM_-O9F-0)zN>K_ z*EqN>n~u5bXcM# zE<>1dVgv#Nl15(CILvGP1^2$M=anKdw1~Cx3L~RTMNGP6!!M&jp-pgxGi5b4DovSi zYjkLwDdlJaCj8`($ zg}JnxkFs>sCU@y@X#4mqr@jLtaZ*e*B5A;(t-8{?4kLvC9f za!l`UamcZJyW^1KoqO0soE*-r-`KyIamXDGx%@cfc;`7Q4!NO_tBgY~2Xd?8kYha_ zh(nI^=x1@raXtT19C93ge~v?r_5CCcIqH`|;UyKWpoe^!xzT!vFV@oIkmEQQAE(^B zIONii-tsu)j)L4JamaCA-V%o#^ZkAtavY~m$05gjUyDPI{q{i|a(oTde=<%E=hkoO z2tPIsIX-z$j6;s&v?xxw#c{}Se$>Yy$N6@CoO0{qkYj!Cj6;t7@xwUea631ii9?R* z{WcCc-nZV1LyqHbPaJY==Rv38qh$MI3URmtTuRj^pL_IOI6r9*IMa_upsYkYm67E)F@CZ+jea9H;+|L+%L3C7q6w z!@2bb?+YX1kfVN{8iyS7T^xrT$3a`1a_i!d<2vW2IOI4#eiDZq`}f5-#;lzIgYDUamX>f zYvYik-ncUkInK8YamaBVZH_~Z_4sofa?~4p;*euK2A+YF!?}$E${iht9LLMJIOK*y zZblq(M?$VD4msXeFN{NupM3NIqH{l;*eu{=fxq%_46fh$nk#kwK(M1ez(LS$MNz&9CH63d+z~WRgs2|pO6?L zH7F`7>Q&=fC{h&^<@Vkr0W82JB!NWJOra=3+<=M^#kF@_%UaOI)n)CXpjcRYFDtHP ztt%?BcK`4DojLd1xk>OYy1(c5f1ckwIrsa{H}5+$XZk6b;dQLd0mt_7bPhO%w z9K(y{fMa;ma=>x?I57tt$NhOZ;23X5j=0Nmz_EP)lmm|OuFe6+@_jG|9K(Au2OP`e z)f{k~Z~Q9<9NX`AIp7#xZx?mJ1jQ7SIaEy0N4mj4U^*P`e-YYraSnuD@5w|r59Iv-$*5?&n)hqT_ zyXAmm`iA6)n~(#J`4`Ip$9`yLj<|*#aJ-I1IpEli&dUME@UG1P$MNznIpA1dp2`8o zcwfr_$9(=c2OPuuF$Wy`@qRx1WVo*C6~~!9a=@{k9+)HU@EmZwjzA7LmIv0p*IZZE zLEOnX;8<>F=YV7WU77=q{ps~N;Mjie%>l>zfTwf7F@3M(hk5~#j~yV!rFihT0k~A0XXX|fPQ$r2^9xDZhv9f)D!!G$L05>QtDQzR z!9MC(e8GGi6u2F5$W9|&?BwB97y%Ne@8t1l0jfYwJ9+TqIxdKTPxOrQ|9`ucN5)nB zzr8&E-(DX7Z!eGk8~5_C8tH$xnTMZ#uzUK<1XG zYHP5U1NQ;35@PN-k@C9AT=)m>q5+&4r&3%%_OLOylpSH>|4p^j;a_`-2DHMLpJ2nM zKTeq@eAsO!i&s4c`J;9bLAqoYku9J!_Ao!R?`l=-k?=3hyZ>Y7)+b-qOPL*W)*2&8$=-*<^zvj$kEq_g|{4W>Q|G#Yc`Txy&a2OWe!}#+m z#?aozhf3>Z^uSp1n%D}J*2|dJ)POxFWsNJPVyPQbYiylWTT|gUscM1g-&)_?+Su68 z)KXR1*|05eRlQWknudBudF`Brrka-OIwLc*ikil1YACdH#L{nnp0dyO|!$yEwyr3Ykk%HM*LG7l3mqM0XX;Ub+k0#Vk#Ocs~n&@ z@Q>+p@ek_E*{%WfV39cL8(N4~|Hhs+$$#i^ZeCSsv@|q0YEgy;C$&N-Z?34Raj5jR zR3m3Fo;%b<*HmIdwVK&ARZUDf!#A%Va7RluOxPC``RkCqfRXM7M|I7dYC~Nu&zq}J z1u_j1I{;PXb=<#{VWukzrqgpAHT4LsrqWTz6iQW-FdVfgU8A|`tqTWT81n_3*R z8d~eocP}uqtd$EKv&(C0QG3OQ7r-2>sBWl1hDc6|WmhEXPTYwZg zvj;iRT;;&P+t6ehI~lUCjCXU2po-aK*UZf*SgUezKW=p?X;W5PRZZ0LmIkAmiDhf9 zLaNGJkVMO(Y67ZgLnUjAWjAYB`m_$dY*n@)UD+)Lx)%J0uyr=8u2JQ9RH zwb@ZyHJhxKsyUezn(f@;P%@{`CtC%hZ4!i18f2 zfy#pa_pNi_;3~pZSpbBmv1Xl!&Mu9S=AlPLlkIQTJ9IE}BrjD8)g`21HHf;V0{Ot6 z-bx^`SX^tLnIarpc;pC}$0ZPX&uwS@FN>5*BNTA+_9Uq}EV~?$nwC$YtA| zdu0`#hB&Yv1^R3ZMKZ)O2D6!}5l@}qQBb<$G^7KYkL*U*!v8O?!T8XO5X^~y18Yjd ztMib>Jwvf}yp$07dsHlyf$5OZTI%PtR2#GEF}ln$>_(P7PR}aGBnGvMvJuO9&TD9@ zbZ~oEv8YCG))BFoi)fX%&Q}*_cAZ(>niw;?HS9~u{4j$vjvYH=P?^E)dQ%=;3YSBeRO(74C%cgm>C?EcO!TD8IU|_=5STP4O4g~* zlS%X1p@c?x&7}*E#|KhvH?v zfNzp*;k>}yUf#Bq;!@L;ggfl>l*tuHm{tf(n;3#Vmlq+X&jY@=Z;~q-I^O5iBRAKY zNC)grB%(f7+$Lr$P~k~Lqlndf)LMZ|k(g9c(&tuE(uRx>-0@UPgGsYs875zRatw(q z^LY($@LV_LaYK_9kcxYKe#4DNx>F~G%6t-roKC`pnrD(4%-m~cFEBT;RT(W6UOX*B zdF6>FqP3noAE;;9rm5^Wl&Y-mfq9e~P_lf`Q>Pj_`Lgk`X-Q1XW3*KjO_?v2jN-ad z@r3W#WD13%P-#2*2$N@7&`+dc>It`03U(`kRK_xwJIa_UHETK@K#k%RnZCS}Qd-r? zDf8m(b7qBkW_A}zw=cy?C($Lb7qIk1a@Hx=5|hi4lU2`57epLIh!_Tu#}q%x=tp(}2#ww4nCH*bS$%*D`n#F?T4A zLb3`&0;_Dz42kW;3R=}*)@XNJg>5!uyB=ss$xMaWKJBny(S-5%+6T?w;Nh!;xnx2`jftTZzARLx=p${YcO?oFwz9k zPL*#)7SR_GCntqsp|a2vRSi`?V#0aCrjd;a`aF?TS=6U;7CnI^-R?}711MEAxMUJn ziFlGmxz#C|t;0UIdYd%BzF2_NdcvwFGn|F|$^@%lDLGTgMkS5jrhlW7#Y(m*{}oEE zRC2A7&nmfE$u`B?q|P@hY4kM1FIIAGAM<>Z6;EIDe1$r9SW@9fDCtx(spL#08+li5lXIA>1b5vNhMb*{%R#>D%@Ii{;a}1tIjtmxmig=mSV)m z8!BBZl`K|vhmuYulNMgd6)L{Xz07=?sqBqPwkf$%;Z|GMuk6Lj?oiTD(rKkf;Z`g8 ztg<`Qbvcz>Yxyg=Ny*Jh8at|TR??y52qm3LCY7A2WTTRsRXlC#e1(!Lm0Yc4o5HQI z(xvRrD!Ez75$ZbEs_QXS{uL{kRQ3_-+^M9)@>g=ElAEk^#cNdOD^)rgReYhdftCf6N$r>e3 zRPrPxYn6OW$vP$Lm26P*b|oKEvQf#~lw76c$x1dU*{md9&`bL93R~n{CFdzQU&#eZ zo}%QbO8!~N)k-c@@(v~cqU4=Q;(fHl^H(KLQ*w=xe^YXilD8xSMqTsZ&LDRCDCNX72x+JyxS<0MFyW2Z6IvVh&CA7M$t;3Jt5jqXpf0D z2HHB&CO}&&nitvwqD7(ID_R+}zlk;t+FhbmLc2q>T4=Y6)&lKT(H26xNwg)tq?Lg7qgvJFz3yt@n z?JL@+(DoK>3$#5&`vKY@(F*Xpi)elDyOU@G@!Mat!T6=UP(s~Nw4wYJZ47?%MdLLX zqIvQABSJ4UqR_q*jXCxo(WXITDhiECXkUm{3+>;cwLtqsw1v<<6m1E#_eDDg+CN3R z5Zc?KT?viXTxeVm?KRO>L3>%WyP&-w+WpYDPI#fQ9@^hU+X(GR(O!hML9{oaF^7?V z&>j};Q)my0wgnoOL@hLafW~#b3yp$&tmrOUA83COZ6LHii#8Y<%MIE)i`SvBTs53NqL7onXf+MCek zi1r?|O3^-rRxa8WXk1Soxd!b7(FzLi4-KOAfi_vRfzT$2HW*q$v=V4h(S||`i8cnB zU$hC(JfeA_IYo;?J4&=NXh(=P4cg(NRYDshS}nAZqP0L9E*igy8Y0>fXa|XQ4zvSA zyAaxbqFo7XAJMLdHdwS((70Pqp>Y?qT}8Ve8Wx|1Z9TMN(KbTsE82_DdWrTXH117- zS_iE_v`?YsiM9pWPiS7qKWN{JRhMY|B%Bcfdi4f6!}UJs39L!q$>8s=2c?t+Hd7_|GLVcrI9Jv7YlplyV9 zn`kdW!|V*UH=$wNh4vn_>qYw%+O?u>fril^zCS?2JOLW^A>jrx(E32bTm;%cXqc@) z8w?He9cU%c&Jk@WG|a7F8w2eO(I!A^7tIT;O|&R9%qf8@gLaB&)1b{0trA*`XtmHz z7Oe$Zy=V)eVg3#75@^+;odc~(vXL4HT^f+5piO zLhC2m5@@|eI|o{kXsiutS3Yixx3+Z;=CHDes&>EPRtNGa#s2is+?gNiW=Yk#vc z(Y?LlfrT>Dku!@$jK1PLee&~q2?~v?!ymC(2P!KuI*TQdpSP>>56x*h%Vq_Yl^C6c zq6LdhfUf$BUA#7HfoWv%XR**Oz#6RldtH1g`aTq(xa*W8Mvtoqmi)YZmH%B2l%q9T zEDjcQ#OSOYVad*92bju@TQ7Z!V8fx4?MJjiBo;z>u0&SDpp zpU2LNu5|ps`8JCaYdT_dR)1LRoPVWlPh_{1!ZAuAMrX0x$j_sl?jP^Z#TaX`YL!Ba z&SG7%bN-#b?(DHyyrH8bMrX0Vu;U60yEtaEo>nYkbQWuceO;5h56!e$Un>?dI*YlN zpT~Zf?$$s2!)db)%@?B#4?1fXc-Zyu+dFsPWV0$2ix{27_L!eXJKe)07Hzg!=PMR5 zI*Y?pejaNz-Jcd;zszQ>RV-q37W-qn2RQxdKceVVCK#I(ix{27e8|tU`tXH?Cso?4 z0qkbrh|yUbQtjM`etzm=n-x(kVszG?!m@gs_dohFgS9}hh|yW>XY%u`L2PB}$}{Y^ zIEkhsMrU#4vD?@4iN8*>Sx+k#F*=K5vYm&!oHJ~w&H72Ph|yX52+Qi{KkM=RB{u6& zcDiuH=qv{;`FTtO-2=b-{A8PTjAA+9qqFvf#jd^gzkTLUHtTG~B1UKJr?GB5W7u^z z>jA|gMrZ9WEY=yi#XqbWWwSOb7BM=j1eW|fmLpxk79VDcRz2LGg9#ilI_m&f?4E7V z+h1I5vyM|NVszH;gk`1h=Z!mI_G-m-mSPd3vp9;{t+MXCrB~XldlicqorMlMBZZG1 zx;q9CE3S_fix{1S!2m34TwZ_ZkCScI?i?iHh|yVxz>=TG7DTt;>y;s!6;v!@bk-19 z>^kosb5D)UI!&>N(OIbCV6k_lt3C3Y?`_s<#Ue&$aRz9&%K4}NJ8HAuR4ih2)^Lq= zXxr_N*sMYh{&2+TtV3b3XDRu6jm+ppM<^CCI%|ZmteHc3)14pMah;%8#OSP%8Y}R_ zv#V^@S&BuB&O*b;$iv0^#vZm=e^o4Ebk=BLS#_gv&0DCdR*iZ`v53)G?5p$hILgy` zX8urZvj*&FT8YtFV_~uD;p4lV@u1B*T(OAJS%(R$4}R&U3_1HOn>9zVh|yVx!(z9u z%DIy=Qh2sv5u>xl3CkKCUiwU!{MrR!%EUU-9 zV&x$jaqWV3O-GE*Iue%rJkHAKz8&O7^|9g_r&z@3tO>B#toI%3P<<@cbj2b@XB{Oh ztM=Y`#|HGb7OP#ch|yU`3yWh7-D~eVGv-l$RxDz4)qEsNMrS#N zW%V2Hmp%-n#oAS6EipRFB`mAQer+lDO}1Dr#Ue&$xrJrTMX&wSD|2mDvtkjWvpmAG zYSdTH-4d`_mn#-AI?F38>$)O?);wdg)+-hq)9Wgo!mx1y^l@&MiwHavcRvv~Fix{01gvB10N8?j$oArCeB1UJ0gk`00 zS;1|W+N^sNix{017M4|e51ThHBd*UBix{01(O74Gf9f(ju02$ZuOe! zm>OHT5l}2*bQT&0a>JUL&tLn}fi|m6v53)Gaba2YaM<^;GMn{h#Ue&$C4^<=#=NCx z0coZ1WyK;!XC;NDyp6f9Uz-tEzN%=%=&WOeg)9*F#^}WHc3cN37BM<&5-j#;{$<&2 zU)rqW6pI+0RVpki54RllYDP=>yr8~Rscywb{jk;a2h|yUmz+%rF z&U&RXV@!EVv53)GxN!o@>TO=Eeff4fu6&hnVszGYVOjl#qweb#n{}jO5u>wa2x|a- z>2`YJ=v6kWUa^SLSt(fT-1zaJyWX`~mnjx8I%}rJ8vWyty=~S8#Ue&$l?%(N^Oy9W zRAjThRxDz4)+}KS#xGq>?4Rhatnw;RmrIP!s({753mCn5{%o6df?^S)vnqwPD}L!- z+3WB(ZPp6KB1UIb!D8Rh7Y9Cm$7ZcnEMjyP5(JjjM@2tfcd*Ukp1O3z=&U)gwC6qa>e z8_wUb)Q;;?#Ue&$og^&Ptr!>VK7WGEdO)#=(OI>^vSvi<8t%H%X1%9a#OSO#VL9+i z7yI_WFKpJXs>35jXVt@E-$_06=N(Z^ta>;}v53)G4Z^ZgIPBzMnEqI-(-eysoz*C; zp7^DE;kF^?+N{-zMU2im85XnYkbXJqF&=kd0e3U}rSgd^2O%kKC znqjf;e7`?)>)keMKgA+OXQ3m@U>*BX#YZ+Pu2{tAtX5(5!Y|!L(>n@n)+vfbjLw=1 zi~TNO@>ypf!>sGNLa~U^S@VQt^-)!QkAKl--LF{0=&bp|QjOMlwEwD%R{5!75u>vf z2+OMTx8KxyxE4SgxyUm)VSj6b8 zg|OIl{?Y|YpRie{D;6<2>okqE_0-#ix{1?SXfpb z&R%nLM$h(xViBXW+Jt5G^Y7ld?r}S=eU+IQoprjfthh$~>uC&(Rtgh}MU2k+y|8-Y zmu~sVuGKcHMX`v{S?#dcv&yeFZ~fk8U94Ed=&U8evg%<)VyBGx;e(1rjLt#_jkr{1 z8Q)&w&bY3BDHbt0>kMI8xp7`}_m}My4%`i%aKz}WGhwm&jWIiwOtD$x6^j_1b(XNK zxR!qQWW;7wC>Aj~YniZ$@k{si1@p$(tg{r07@c)CEcP3O*A}hM$obWZMU2ks5SBH< zHtz7sqjp@+C>Aj~>l|VA!7trEHV+?Uv%Xd=VszGWSnRpz@he`NY_kR-1Uh1L*153Q zbAWp*zxl~#9i>>r=&bXEW#xQ9==RHPR)t~_qqA0MaedSKLR3|&rJSW$#OSQ^wYc8- zehNAyi*>tV5u>yIAgsRlr5iOR^oGrPL9vL@Sr@=!&wF3o^?g)TE3W@27BM>OLSb3C zvGa@3xXs#scX+}Pqq8o8#V)Ul?o7R6vx166jLy1PSXPfcqWXFisg=Sy#Ue&$U82SH zqW&PMrWY{Wz@sR z=f3WGxaF*@rCVeO1xy575f|0kQZ&mN|g7@dXbAmXz6!>MQ7oiTF=D;6<2>ndSc zaosiX4H&HJYE~>_bk@~cTwfi2b4Gbxtysk9tZRg|6MpF?Klss;c3c}2ix{1?5*EAm zmajRu%w~O|Sj6b8YlUUCl*p-HOto2i?FmmfVszFYVX;S|4?cYnt;5O5K&3a6+h|yVh3d`!TuMIr(w$1uPv53)GcL~cX<)i8%ciXIfd&3is z7@hT3SnOW(;Xl2K0mQnl!xf7dowY_-RxjH0-XC7KSu+)j7@hSuVW}?6c*A{x(`I!j z7BM;tmw^;2Z{sg5*ZtdOJ)q3Q=&XB$W#zng{SUYZ>$<*DEMj!ly&CK8ehrt~tU>$0 z6OI_2bssGD`{nyyE_};o9i>>r=&bvNWsMHk-2cgiHmgpth|yUO2x}Mo(%rZ3ce~oG zixrC)o%J9r_FcfyC+rfoS?d&w7@hTyun>W`J743iJL|=d|Ox(*aL7VszG{u-N_K>qFOPw69kk@Ps2qXFUds z9oKPJwV_C@>&oAk9Q?x)4xP0D7P~D!{qeKoZPr1GMU2jRTw^_V>N{w-R$NKNB1UID zAuMYo`p-X}JkDk@W0MrUo* zSerk0zF@PqDi$$13sael@+x}w_n0kMxv|fF@Ps2qXFUyzegC!Tfkk1P6;>=_bk;K( z%YWxU3te+sMrS=IEUUMfen|laYK!%dViBXWp4Z|U zarNr=Y}QALMU2iuMk6}UX(dKyy$Fk4=dYPo@v_bGC>Aj~>m^}X zxv}fIX&F60wPF#Yvk-JfDJS~n&9dVkW-{$C^jZ zvRP${MU2jRQ&?8c_qyZ#i)_|H#Ue&$VQ9>#8_5%{yu)VQpjgD{tbb^%Rp zY*s?Ch|yX9gvGvhD12(m0-JT3ViBXW-WAr4_@#?KpS;&*-K+>EJ*l^dTZ7BM>O17TUcO?mSZ|F&8Eeg{uDVszHOV6jtpdvL=r zn>9|ch|yUe3d_p*gE#KyvRNl67BM>OBVk$X>#BoyZnas<6pI+0^|7#a!!O;6zwHi# zl^eGy7BM>O6Ikq4`StkW37hq%ViBXWJ{49Ge(5fI^1ah+R>6U$l^C7%87%f(GAkbW$agji^p|w z#~OzCZA1Of5X$X-kf{hp)I(r-Hs3HzOXhwyTi~Cche|B}E7I_I*(!5$fZ^sIHKn9~ zEtpOC-2n&Pmb5lO#kIw7s8p9K3;(stypAf(qCzfXI9qY#=Xt4WZXp;GC#F2k)QG4v z5sLXk;aJQmYkf`}%eA8>mbhF_3o_mx^m^T~SR#!mpQ8cX0cRWw*?GeLfCVuZ+nqQT zO9gfjqTB5ZdR+cw(i3rJEc4qHGUiOglRkIC9n+E9j=s>O;Yj-A!j^~aoXuPYRB z$D^Riio3Y<>`aY0{Q+dV-<_~QT+B+=H_k}CmMVA18T3UWkxLhkqG$% zVW+gLu~_9&A~2V6*1>+K4^USm>dypctSqX*$Aw*fPuQ0XII(W&#Iam?S@TD`^oN4J zkSm;UazW3DX56xb@x-xR#9(1mRACe+RD;mKtaH09_GTuD*J1>IJQoSIwQ%L z%OCcIoSBURg(}NtGqYqpT%F}ZMDb`e8i+Wtp0*uJ!)#nWm((K^=|$^wxx=^wMxxgHW(IM=@2-;NadJd( zMdJyfsHMQu-LBT}xX@2WB3^Xsg5Ac&x}0%$BI5Oh{6Hc*%;m!oDi-P0lk9fJ0v@;9 z>vNmPZ4?l?y|@o9NoYN*%Y3uw&6Sz;aJ|k@*b|IJ;wT+i6WZ!|ROg^wn8)c4N5XD* zEbdfmlBY+7PGcyVxZ4#?h5|_&E7zDFTeO5EoW4Lbln4Z)PODn0j!a8Iz?lg9(I$}G zG%TwaL%xqYE< zI2>};%$_%z&*w90~+O-iS>! z2gEK0LAM8UM-S#+{-BLcuLQ5BDC9&14@6zAj1*a2n6*Z{#z;E-iDc9tjfU;8RTrFD zWjH~0V=|MBx^0}bsJs>+QtJ=;J)Tf9BgAe7umt*Yw-@s~6p6VBgLEA=EqaJyr#BFB zB@!4V(y;W>*_dX?n%X*rH6rOxc$5AN3c?+0jqY4x^KD>{#55I*_#67snM zu0%$DabU>|GU<$YW5J+1iMDP<-Bm01I^(`z+!OYq3RyUN=Kw88T#nc84f!J&s?%7t z*1Qf3J2BR{+`a&MGb_;aUISfDxe>MpsdZtJ<+P?$-OT2F&Zsx&a)py2r)*Ck(<-gG zWadKxBLwcT-BB0N*tnpZnOYq4_F&wP0m6xUCfU)z%y;u%0pkRkuV zT^T%UG{86~(;1zDd-4coxIvS`Z3j?o#^P>ET483|(P6v2;e;<1N;32eXqUO}b0!j; zM`2o$iAKZgs(JXGn3jgU=&iERUDi)fqImmG?Zzf$m72w#59T)VAji3_^ zM5AupEhrjCXt`p!7f_oq=%fJdVAybCA&aDTY2XcnY}26QG0F1b769Fvg;)DGbdjfV zXB?Awzu${Y;_fAwGjtxbJsxK?81l#B0cZMFo_7iMV;r+uSa($Et}N+Hy5mW208@C` z1_FVreIT?H<0(Ki9*Ma8K$$zJbd`#@GwAolJfUdBgmszJgcBV{ES!u)oib6)csig} zr4WXuPy~-2VosU#%*UuCLq*0;6IvQ^32t-@$f%^#Dq(CvK~}m#jm@|f)?&lF3^g(0 zPR5<)?i8wh%Kj8uG#G^4Axx!xNsrU2)fv~&)i8TlA{Gr{TLKVJx3Qyz9$>`ji^r09 z^5b)64ACi`Tr7_GB{b$31*R0qlK0vVm@YJQxq)4%6HzL;(ZI-;kUt)a z;6Z^Es9-e^Cf%__%!OHZz(!enpJ>Pg9!lbdGKw0YZHc0RWDelRY8~xN!-O z7Z2HSXJ&1nqIoCzs63kF18MFhVDGDQ(%;k%PeTg&*JCtY;6l63UcLxHP&my4o z?j{-tH)DagFC2;}Pjsfb6YYG!z<~ z-|Y#;3jGNaAh;6?{}oly)pt}q5E0`-k=bg0{jCy1Dz;~tpNOIfOIS#%(7 zfjurfBgPGngjpINnX)#@(UCsf?zngd?6r}ySBh+HqhWDpgbp(1@nR~(gfh@hHOb|S z;u(C%7qcDS>bSlAw7Y`Aw ztjXHkLn9=e(Ref-4q-e^UrgsqMmj@bx5pPicb|r-U4FFS(1Id~0H!XkgdM-V-G+um z$Cr!-VsSLK%uRtb4C-?-5Wr(;+>E970_r*=gYiT(fiD*E;x59e?`EW-(BggmDBc_(B3GZ;T**+(6VHZcPYV5b%HeXmqcK$u=`Eqmorv^M{m!Hh?a#b7($ScQg(HciKMS2*9TIrpf|rcGu&NE#K2lm><0HYS zHyOoCW63Mb)$28X^Z;(JHeR7Fdip7;Q*cv*f4JCq=C?+qaJ*+5V0~v z+oVc^qCR+W4~=&{W_Z@#RT_x>cg&UWg;d%ywzSH|gmS)PZ4VAQteuQHW*| zEnvomUmAh83z(Be@FLsJBJ6~vf!MRgeR!JeS6zi9lp}2R72*4nAl|-*;_8aDeZxA3 z8Av8EsH>FP`-y457-wb?yo<9ksdGlgotVa>E5qc?ya+%#WueO%3?_W2H7Xo?S28U+ zG~{p;&pcVGGCMLZ} zp}BXOj^-34o`@uas#4e!iB6X^F5<;Adb}wy!_BT=xTOmxJ$P86veMjuO^Xc>cgP!x zTI0WZx|jJt1I;NI@Wg%Ixa!C`v$XbW%L*(KPT;YlSGD7=YI4Bo4xnr~eU`jnV42&y zX#w)HiEt?F!VRE+)kIOlphX6PzCa*`Td_1q+YL^K@if6lqNO-N7)bQhKX74T1I%#M3m7*N;bA>HCVZ zN!TV;$Dw`T1v4Hm;rW(@>t?F!clmIOjqk+LK)WvKfx7Sl--~AFVxZbqb|x;p`gv-0 zYkfsavtb+X5T+R~1B_JHE2Z0J^Oc_hGMJP+XSR0EJaqK<(PJF88#!j|;bTURA2sT5 z+eU5Vh!KY!c9_F4YW$ePM~c_XUeUaX#`h2ZW6IeT=6?_xaKkH`@MwH)6?Hm%hG~3i zeHbkk{PZdYu4-26oD%uslICv?z;+J6{p(N@#BV8`MzK3{m2&zVjN^NS;W?et7~#zP z%9A#Jgjq6zn(Z9L$(h;lI`Xjj25_|_P23I;&SJzXyYbrGp-`_@7|YsKcm~3I61XQv znW$}r_k+T0E4(6vchG2Tj5B82;avgmSqihQ@P;B|e+2H}!?zvY9`HUvVYU_CH}K?2 zDs|(w9bN$5*C@=k!fV6zegNF;Beor$6W*69%(lXtiSS+pZrp@zhnIr)i3+o=@VF7m z6TrQH)V9N8x$kx~)_cZ52b$4Uec1^6?|}JI;kv6Yw3kdox#6JeF1#1vHyW6pPNK|j zn7gXakHBxd6Kx3x9X_q@GJOM4UtBKyue?WKMml{>8J}mvYj+%HDvXI_JL=pnQI(CA zz`dZb-CYMa#CZ#tgMDUb>3Fl+Wf0yc0CSzf72v$9d>(}Go&x4we0@*XU3iDUZx>Y7 ziL9`2xcn}|<3=~7z*H~+aNUK+%e)AfR~0TF=Ut_b;cW$`FwD@p5ASyPjZ+u_;-{e`xHK6iE7~tME3%cQ4@j9%I6~ z3$F;?6BWh^u&eN1g=YY`eJ1^Kc*iKrFNJp;a3j@-++F&(byNi~=a!kF6+(2CzSU?r zPXcqwR1?R1@2VgA2==uKVz{ij+GROW z-G|2^FbT}r3fEo#Qk#d(4uKh1A;H<{Gv{HdG|i2X{0d_tQEr%rVamrQ_63edp^Pxh zbzZQsjkjT5{j`S0s`}>U+F>Jyj~G5`&NOpl8@>om;l229ym~gyFW7Z};ov~i4`Cem znE4y4sc33wZkXNTIB3$rjzlBAJ*hbbpJg~a4Rwt*wN*_<#k@*xpVLJwMn$dRIbvF} zsbLO2_;C0EZ+09sf81dQPqTxaQq$a8Uh61rX|1ejaEzNa#WM|Cg-@%f9qv2UXH?Wx z8pHezU5DSrRXB!)y1~}eSBxIjy|-kDV_2-rF)T432cU^r`0?W1SiH0}nkozO-mVlD zZ)qYmH56xPQ%5_71)4|T$B$!yV_1DdZNr>~3|i@NrE$J{Rs^reRMh8+r(D=sI|c>l zC^r)iiJJ0ED#MEt&*Vwm(>~?(B`5hjxNpk{6VKgUrLh!Vkd~#UCMHRutYn5Wj;l*wkg^8+qv~KS4Z21$R8t)__AvWo?8s5-B<3Bfv`I1V$iqgc6PK@4 zX;YH6J~bGc6ip@)QRNp1x=Mpew^EA>oa7mskti5q-psVafZWfrL?*ejNa3U_l9@%I zP4&4VH{3qzF!%W*e>A7)a_NRvGfkQocxFwzJMT zz-vvhD5d0Cu<1~GBN9}&^hMLNH6{OsC8cpP!JeRN5;o8>Ykn%lT7dVVEfU&J07&iJ z5&p;pqoqzF-IsZ37R_MzEXlaaq<@kRBcv)wwmLQgHXwZFs%jhQ(WI0tFM%~$RcMwR z>j*w!Hmiv=E5>H#O}BZvGl=^j8CFY0OE^qwD|1eYNWRHUc~n6)5nI(Xmj%TZ(}*-k zPOwSc49|2wkxB`GiR9N2>4x5l>QX;P;ur(GYN@C~Qlvm{!7&r_?mWoiyaz(TMYlT+ zJ?GqwqxxL<6u0>+6Z>QD|8#nLMg6RcZaewM@#WLj;2+k-{>Nv>6#Aaua_7SRdTe?8 z`8zNbY%oh70Ww#$Yci=%AS1mqcWA7Iq8;jjFG3PDLJN{Lp?u9-N%?Vw- z+odBD-(G?qQ|zz&#dUQ5+NCEx`_tgQU(Wly61$m-ec8CTzkO}P!T;X3eo5ufYwFfx zH)FAH8Iovy?6TYYj=Ir*_KHQR+wf>c?1j&5`Q5YUt#wuQ8*#|x4?i&syX~U-6z2`U zV*LF3{<7B@Q$HSd`E|#g`#QydRXLdZ&bosuY&wS>kRQNqK^1qAyxbK&j#-87M z*Mdimjn8ZU{AJue;$ERRZ|Lls_g_41<@d|h-E--K%RfWqK0@rC*ronMCk}Y>)59Ng ztr^GL@8x2DKkxegZ2q~=Z5NGvpz@mYKll{4s$yU8?!M<=UjIbDKj*(%S7z*i^dEq_ zQk?hKGZwv6F@MiFk6yUq+urAXf&26tu^)Mr^O2vvd+f>S-cRm1sbL2^U%f@_j|N|O z`H%-M?KA1dciSo|E?Cn{UC`Z)Y;=K1BsoeX4Z_eKHjx$f~ebbw- zpfOg6eWz>p4vjye^xp9Dd(S`S##z&_^qbgszWmcKrgS_vrtsbyFS*2b4eE0to+%XP zoxbxK4gdbniVw~m6n;1Q!ezIjU5ov;AFuoDrSoSxckglVIm>$=i+sL8?B9(JEt@i$A^+kJQEf%#T-%ymIVUrPZlZmmS^X;|b4d!39I!DZAQ#`h!DP|8M}- zG8ogB;jG>C`dfc~cdvWs>vovA4b0XZ&gIgzw+|py$)O|D*4OyXW1FM@M3x zxcR1Qr~fqW%{epLjR7AQKaW=g=(CFRMjh?^{-XBXhRpHzyX%AeCHG@nOR;a<`S^kj zr_TJM@${drZMyC<^fOnA{rV$oAC3L-r>&1)Fmj~-)M5uPjBAD+J0 zdD~52q0RO0&+xx)8TT)3a)0j1X>a)jN>rT4;tKk?U z{vh^m&$#f8C(n54(Z_o%>a+jg))MT?F81XUCXO4nVd8h=x9rg4>TAEAf^tVMU7UAM zFxuzIA)f^wKXSLvukF2LIX0mZ`&~CaymbDm%Fq8%>s=5iT7!P<46#2nb>N9l#m8*k zf7RtT)je}G^7A#Zj~O&`uTz#@^<&*N3(h;D>WZgvuZ%Pm=lx;-x|0Xjyz$|ky_=t0 zXFT#OCPiZZ;Ife)kJ#h$*HfWAPd;{3J?iFSvET7h@m{sJlpnRWec_Z_%08QH80*Bo z$3OSoc*WmN-T(37fzzfM`};5l7W=scLkHjR$QN(>e1l3#KMkB`E}!w!E*Kmtj+oY{ zZn9@*++^3K@7?E`H`&eBP4?W1X_&9cO+a(yN!IjzT4QrHKQ9!Ie#-!R0J8@Bg?tEipXdJU9GQ`MYbd11A9uGsQxt7dbH>L$7=4)Ym~ zR1rR7*uH%1s)Irn$V>a*Fi6!GkK4{5tqOxI+5Stl0+DAKzcL}x4Q#Vqs#4N7b%W8H zo_d^(TRV;lIZ+t=sO`LnF3Y^Rv8KGS=C=&7rk;1P+nY$MwCc)haWnecrVCx|Z_qfm zdnm9j4gVzB*s`5hW`$AF)PlLhufCe{+FzNDx#hni8C_LK)njaL_30`|^CPD1ywI)! zL`R7>``ZTCipM#>VTg4V^MAw8aKZJp+gsVX%)#bSEftM5joX<D`Zr9YY9V8O!ysGcHng%w%4rBP|Hb(?j2*RWPUZFvLFuZnpm`eq zsp~hbr5MWQZtobBPS`vwp;g~9`@gu^_)Tj|LnH5ob1mHF^4VC6$t3)SQ|tPiYnPf6 z&E3xWW#xJW>q4#<-GFZjQXp(+oZWOJ^;IqNnD4(;HrCYD<$6Jw>gEcq#VQBY+nGu$ zvu9V-w{RknQ}S9URC`USVTF?ie;Ds(f$wPnJ-r}&hfvF zN4p+gpc(NZu*G zmAQC6zk^}m)d}8K_EcIgzWE$J(t$NQS{x0t@!eKcJwAnTm|uV4p9LJT@+QZq5hD*X zI=m$XOV=*it^J!G3kP-NwT&}c2ei%4Gg^DMukEoc?{2=tTsL~{Iy|SBm6!3HJ?#!s z8vW?@#*1R=JifrO2*=Sze>}dn9Xa$r5JzK4+MY5$RH&}1I0VFImW*k2cE;ri&)wN zc;`iC1d^O6Br`Myxd&t%av#V9B$GS|@&L$VAbA};$2%CjA?D|Ec+(+TZv*d;MC)a& zP21L|ZOHi|}OJ#igfmWi4!Ld%Q1fDKI*A4Mj7$uqm3%w)U>g5@Udwd zlg4wVljqD`25jaoH8XdqnYnA)n7gL!f1SHa5tC;dxtme9GrmHo_^r7eJg$6u8yl6@%b46z zTT;~FGp0=K_-^#p_RsU$zsozVFg0WJ+Ue`s#`iR%SJ8t z=gpYDZrRAQi~6s5uI-(+_J1x0V#yONhqixLFz?}xXAscRCtB`a`uyAj`>!c__=BR} zU%>cr9#E#&RZE|r_x>k6I=(#pr=NfRdGWmEjK>UohICoe(;e0lL~FS#l)`#S$0oz7 zSb&4c;};lomVYb!3&hv#Fgi?c&EG-L#~GOK;8kFg!~I6zF#-)ghbcC4cOXHIgP(U;`?o54dg7yyCF}6 zya#fDvg6|dIcL}R0PLqjJ_N~fSqr%glIgh+lIdZdGrhbXrnx6W6|J{%ztVacV^B5d z+uInYv|fhUUq6PARo3R2zZfff0FGM-MzFgGn;h&0-t4p^o-dcM0t8GuUowYjvOV@U6K4DSc_7C&U8d&u3cNjSrf0h6A z4Dgt#U*o96VYz^%D497nGT|e-^k+!;TnPuhB+%SjylU0#IkwKjk=>B3IQ{S&oz;+8 zVBIuiwoK*Fh4ec4ja$! zaP%}TRa$T3N~QIZZiT+R8K&T*@$_l`b|3WFMa$iJ3;Qj70)_r(g*oF$SCB2khs|}4uQnYhOsXs zroqO3kjEr`-Qlme|z|ak0kzQl^YjnKD{s3OjK# zQ>dAlLampv3csdpwbIOKeV?fv3rhwr{rR+gmVVZ{Ly9x{jz^a#^OjeZ7-zF9Uh+ii ze}+8L@lENJj+T;vgK|X24s`{@IGyvI^xU-wkab>Xc=xgT~=(pmBQIb{;gR*f4W7IJntOgRRJN zk0^!hj*d;E5Ry#=NjKKwptJmW53z%4NW}eBe06_oYB3ys=VbZ&_%9kNv_qkt-KBrA zSlRD&;24`#8<}Rt{V*sAgJfx=#(%{#Lb2f#Nuy~Q zq^h#Fq!_mr1KZaZpfxP(H)93brZ=* z*G&%mbeaBECvVlA>`4;CWEi7xtlSenrpu~3BRW+cwg=_9s672u<;e$Z+jVEA6$&KN z!n(5~jxro{=b%iOzU8WH&V|Hf8|Oi??yP|1)b@PH5@kO~*?CR0Ge06Yddf&nt+!02 zsr8aOVAIC9OO{d)q^9T?^_D9(aqMaz-} z%YsGAf_>JpRhs=2A0E1K3^W{R8~Xz%4!g8@1(pjc#medILAn9{M`ZN`7Kb+tFLvD% z$O4~OnYmMmTJb{SPK71NnAyHav0J-jivlw~<{Aj{IF#ngkmHod!nOgBS3&LpiHvLG zpnMG^Z$55>+Lo)sJXUQFd!yMbFnPVHZUVOG7zP)7|che?~Zt2#R zeawc}f2+SwaqEuO_*5|ELvS!q70g&S2uc*kK)G`@HD2-8IG7I09ikNa(Pg)~gG_VQ zWXeQ;0YBzfcB^BUs7JD#&MxS1mCI~(vzw|q-|7Y1^o9y$mb= z$C>%RljMJ&j(*2jMWA}bZ4?Z9p=meCEtU>fd(+!gXJ$o(My z3dwY>fn*V#fWs^zYGx5p>t#Hve0v)&Dy^4M+A*y}rhk1pdUiZMq<8s98UdJpOi>(%{`jNk!C)~^R4FNb^xawX(i$eSP^g}fPZJtWi5bLK`l4s)VJ z&73Gv>m`p;P1}S#6W7bQn^*lI4&z$>j9$OYTjIdv=b&UY&zE~k2A$YfO_ZV~6OJ*h zWwcHb8W0YJjh2iv{ZA|qFU+dS+SiX6y;08E*O$o9I}gDQM7qopDa1b~n*&;*yq`Q- zeA&k|;wZ%1G)zgw#^HxI5rs0moG2P^(C6S7Xw1g%T+yt$X&0y2m+-s@2OayOT_A~N z-C+KW$?9v^{}97okN@hVoZL?0zlqHy8%AZ;DQ8B6OfTzHW?%I<>I5GaKLt4i zawDV*^6!wmuBRbcXPA5Da8At}&Z+g15KY?_h3jRd{wM?QxtZppi~}l-18Q5%M^ars zj_(OJ9dn#6d*a0M9G6uB7N-z?XR?}@F0*xZ^MKcaLS{8k_4Y+>=tpG07#DL7g=Sdg z`5bZwr^fS;Ov4K*x7gE|xkb&)Eo$bCy=hyGbJNDRqI`9+EHB+{S`h#v4S_PVYVw>J z#j43}FMAkdt&T$ zuRtGv+T@|8v!KhIvT}$yLzi8Js$t8X(^(uAZ_v*6 z%$$;m^tRvXWX|c#3dA{GX7yn_**Ws2%8|Dq8UH_2j+_DA%n@p4j!-k-*qAmBmZr_j zk)r=ejx6iCQOV8W{~|};Q91HYl_T$}9O+2s2sJZDsF^up+L$Az?QUlFhd2z}*$rO$ zJaVW{M^WkIDO39|xdzt$Yw|i??f9mB(?0F*I!^!BT9`O1`evWjVEZFKw=9PL=&eiE zE;w-c^-?1q{-9_3rp3J{kh(id;+2QK}r<&drG9C+Gx6%tg9!#MHO z6PxTi)zpmXcelZM0!X}P9o*3a&nk+CJeKb*89Kh_qJ675BNSrw6=Y{{Pk)L`BxZ1G z*~l3kk52EsPJ$_f)f{jC1Z^;mfySfw_2DR#d8kutKc#Jb@(jbYv6*Gh@rJ;+NErBm zV-w_UB(Z#0RGj61EjpEa)#vlpj-hArdtrd>p}IbfQ(W0I+dt3X2&Llb!XL4UKRe5R z;K-iiG0jXP9`qaQvMRj2^0N%&jM{Q$pmK&@vahkj0Off9XW)l0iMJ0%K$#j`vzk@yI+1rz>a4N&N*kW-X^o_ zVLn@q*S8rbyiF`n_L+v+3D1Faz+MA+03=3P`FiRkNIuxXd`dnLz}%tDiSv^olaNi2 zrI5{#CqN=S@&N#5SZ$3sKLwHl6GphU(;=a^wL?O0W4G0Yzq8f(Igm?m{s+jVke5ON z)Akq0Wsna+qDi#94tX`?CP*~nw)Y^xY5N8eHNS0VTpPG;yF*?Mi5E2n+Cdx3m3U_M z3LNI#mzp{ErPhn@=#2BlhPQB{^)gmMGjZ1|O}$ksLh~EQJF)-dpyY=_-pGmd<*rT-=-AVC`$MV_` z;PhohxaGoh8}DQn_dja@)Z!Up?{$K_z1Lsf>+kLt_3!u@@!2o$$;J!(>B~SaKw`3+ z_eV@29P1<VKy#P-JV77jYgpSN&(i?7)TUoySZ{!7ukcUR4u;oR4Szx8C4)oo~( z{>5Tt^In4^yLmIs4EsYI=k1Fh)5!?WPXNr9%D-?6m-X2OUoW#gvl(W;UY0fuyK3fa zu}mPLRx4-r@O-}6%I%LLUxm?fO!sCSgK%tA#-~t?sp4EFoXJ#CBBL zHst8MBik1ZHahlf*=gw;r-?5!M==)l*|)V%hrgtwXh^^Orm zoUFiMKl#0${>ssZj`f0$ZKEF~!@wmO=i;EV{Mk18imz!q-SkfTvuzZrvmN2ba-g&L z^xr`ZeT=6`e0BfKq3=}qXU~3_W^&KNG3g-um`-kC163`hRVTM%qs`7wG>a{yc88Ee z2o>pDR*rS54M+w55}dnjp5)|aoU<{o&d?o>`5yBMk00882YD3aaLA(}S)V6D9swDL zJQC6c>4tPeMj$TSh97b!WB{@TG6-1<$#D3{APm_I8G&qrj6yDhj6pJQ zh-3Y|0*6_DshRbcS}&$pe0v*CrI}Av`z+nsS}=Mo-WmA|`0}>TvOqycKfE11X42FT z!Q|^#yr0ca5dqIW=F8F<>-L4;L>zWyt0Y`G)@nMdGO)5S2!bdj2-DIII=4X<76CcWsws6m@e~HsiL8AL8qS7iUV*=lrrB~R$|#So)f{xVSIyW zcZSs}0t&{>%EBARX*lSPL7^}`lOWkZN>w2p2iX_rWsvMVCquFl(S9i8RLH|1kA>v5 z(9XhLiNpL}ikkVo6t!ORm6T~?2AH-^FPqGQ{DoId8xWphY;YE^pzuYFdB)g{E?+zC z4G$lVLK*s;(CqqP7lC~34nNzmKF~25mM1?@$sQOd!A5rsjy>24O_y1ozwpKh#c39o zJOFT7AwV*0me&qA#^9j45cy1b5#(6Niy>JKJZBns&YZXbhk5%;&Ai#8)=R!%Gi@tz zZra$WikAM&MwVJ<4hkKc@hWMzsn!U=?;rYECk6NnI<>Cju^Fj#{Z$wP<-Ug@4wQ+) z6w#P-U*o96VL5g^bo8UkZgt~Kv*vH1+07o(rN7xeSW4`gvP+3^vX+m>(bRP*VK0>& z8=cjUeioSj6_B`B=7KMLGn(m0`fq} zO30CrRgkO+R)eC2+K{%P#BRdhF3#Qxk$0 zoVe#@{~vpA0v}a%_K)8oA%p}?(5R@W5rU#Dh9oRuF|#H!StdgkKt;zuq5%TIWCCar zM-!?TQCq8ZZLM0Xb*Z&()wY7*TI*JAwYJu}LeaWYT={>$&pCJI-rS*1DR1BZ=l6Q% zGxvG!bDrlp`*P1c_dMsV@^|$js=N4ZFL79`oMZaYhabR}^3vrK7quSw$WmkHPCkda zPibq3O)M^EdKJZLnS;~}R|c+jXSI%j76BgG8$;o znuiDvE2616D}kAkSoLoeN{;|3q?j58<3 z2pt7s#yKZ}wTc{TSK)x%U|q~`9i;vLG->4NPR(o|C}mtt&BGE{kCq(fh%;MDhO0{Z zpZW8hXdXzm&8iFgqzqRaWK;9r39MI3?(K+kzDT*X|JLRu%bl8s3(v_G&G`w<-_w%$ z&}=V3)|w1gRQq51!v{ZfYQ{VkJR>cd_ep5JQA_UQh%>vg3>Q-gLF4uxZyw{+%zh=q z^(3xlZWJW2yFjJm)(m@`QGLHwGkdBG*YmiVn)gp&8$qSp-=Ueai4506xUxN*J*cY8 z8E5u=87^7?F*T1!U<{9LglH!ACNJWc3c8Qw%8Nr20iTC=@wjeTZt+a-u**Mkq0f;BE``y zDOG&O5=;-x`kb#3^4O&~k|xLHn~pvJk4>gjsYb}7(0bELQeh39H7CQxT1of$tBd+f z8N)bHOPRF`Pe=(pCfE7|r4V67aSZg5?${EgjTCEHi~~8t#a@K&{EN0%JIjLOYKH62 zxSC}#E`i;o!y2bjVQI?~M2ce{-R~zib~`msginTxvnf;agar00t$Bh&GoPI>QsYYZ z;ie^@J2e->C&Tq3uBPT=64>)v^Dz$1oF67Ne|5ntbDf$|fd*)vl+gT^);!6fnSEM@ zi!0!qbmHK-13Jv|C{1YIp*5F^W-uB<(P|z9q~i}gbZuB)rF%Ye<3<04JLfd(q9W>ZM~l7Huz3t) zuQZifQC3l+jzg&^;R>R<(!fMT*+Q#r#$=$y3AM5x&lab|mRB3q$!FQm7d4HEkhZM5 zO&6LDj~lgAMkIIVNTL(BYR9}z+B9EnWolit(tvR{0FzLS5w&s-5;;F(;+nNEft$B8xdeh5R zY<+^~Jsba@IRUb|6t*=t7a7K12k^O5*w!S=^&A>4PHgyD<~8&p-)(8|<%93uH2C%g z-=k^ry^to~>uK;YejlX4$9aN_(*cXyRlW>OgD($y_DzG2`8+BOzI^bFPlJ#7JTnbG zj&jv$@NrHYPJ@r>n42bFOPYL3(%|FFu_p~a#!tSN1T)6mCR%cW`XG5@Yi zgKr=3U7rRY=X`gk!N>UhDh)oa4Q)(=kNNUc8hmU=FQv)%w>0=zPq(JQ*9X3L!FL)b z=WvJN?>5|S>r)KrN8|q!OwOOhpNQY?^NM3LWf}5eF!JWaI8PO3U{UE5k}#IE!F|?`@sQ076HxGQ@(!A(K zQr3IEkys0!^)+CCV|k~t#mW`42f_2E=G&D%u8+S5o?OgL=@R-Z&!43G@t>u6cu&W9 zC#JZpA|K%YFp%_ZiQ>Gu{|9V|>QwC7SSU{K{Kl5(H?~B@E-WmKeq&4Yf5Db08|iM? z5?zG8@M~;|(hy)brg*Si!=orWqYD=p|79bhw1)UZJ~t`hJZTzyq?yLk5ht$Z)CHP? z^?n=*l|4LRniBR2162WKFEfU2TP${Hql+#mO4Ir%jV?0WC@iJ=YVf{Oh02^*+7@f? zY-L>bl!;R6=|`IM;$L81)bDBXV3St%@WYXW|F)G8kT-1tfKmSV>Oj~rzMnz^E4#)gvHw~KR zK%CmpCKIau8^%r9Ke7DeB|*KnI^b)lKryg-t}Ja>Cx|w{MGhf_2UtEG@cFf zT~3>)$`(2z1e-DxAWESGwmHd4vf#?zEBmE1^4Wq~>8Q zBj4q;k-9+WP8+Gp7OK-m>Z`)P13#+DP3Xbf=Bfd<+HoE~kxDx6qw7Qu~DNw2^w3(496?hhXntzRPJNwOQy+8>w-j zJ8h)iCUmEbRAmd*X(RP848-}a)HYH-;5y)*vL*73jnu;b$i^&87JXwQl@@nPOa6aj zBUL?1?_w{zJ*xk%%~SP!LDN!csRw)X->|^SN0{BTz_Sa}L;txY(>-aTbr*TIN9>rI zCWsP7Q+KC_v?$qqGo!mG3anvt?n%Rbd&r{d9odDqbIm;e#-eKB*BLa&VDpVd z)mUK)^Y3OQ`o^MaXW_K@D;CaA)d_uLQFVD&=c!#SOaHSe-!~Rjr%gF({?bJYyE?l& zPf6JvQ`J6nUf)<$U1m;_Cn(!x182@Xr<}4!t^Xp^|F2k7-JSVfs(QNo-?NjtfHqop zF|oy{WO*$5#-i%{J<|W8PJd%jHD&klf6Aijq_Y2cTc^q%=YJs}WfXI=wxMdVifN`1 zOMc$Eh<<}Rlkdt3OUjQmn!}+vfrds;t@f!3gzY@n*#InZPS!V8jCdG{k$isSYE0n6gLK%jK;w1=0MmN zFjPz@O+MDd$`V*9V&7CbP3zQ*la4hk@8}u=o?0U?uPM+F2BO{#7WxB?zJ?IKuW8T} zBivjIU%uil)Y`nE1Zr+2@YdJY20URSQ13IwOqevS8#(&F>F`1XXBhKCIBqwL3Wh~! zIie*CTNTv7BUyMAs!k-&lA|^ng|86Th+svya>rYiSWv;9J7D8+trDylSHED~73>j= z`&;>mSC$+`!%xk!ut|;w#1bPncLit3sp=(y)#7@LU<{Mml@*es1e=HJ5rWOfb+lk7 z<60OfMqX3KJ%KXZb zQ*dVu!rRx_kXbnZJ%h*WgvrF-9fz*W?$2Bc9%Ivea^LxKhTz)DZ?E2HlwYayurpnWhFd}=U<=kX&&Xn%`H6ItiTvH zd_2{OGj;HUm=8f=9-EF~zmGrjgC#?^76*Y4UIEDHUkS(@z8a95i+=#flKCMZ(|!#g z1LOTLz$N&rV`GS^V`GTr7}w#-T+B6Y)L4#KIZ=EYKvR5UdzLL(*12-oQO13JAa23m z_z^ES^t!Jo4rF^@(Rl!cQaU|@1uV`=oJBUQcSly<1-FBvzpv;5fadl%uG+uTo` z?7wXQCI0D#^&Lf-b9;ug}-ie@8X--#iWnXHT7Y)&Zp(`Y$MA`1&O7vo|yS zn-awPP)SvGXrC$!qW!j-BDYLc^EIVzZ}!Ce<{S2^!mt zAAi#o!k6*O)&#bj5x~hC!v6;Rt^U`uVv4V7SMTC(pvgh%q>e1WqY|w_?d*|H{$vB2 zG%cz&9fQ;^gOxUUF8F|>MQM$22I6smu|OLYh1dvbfTnH20`p|Sbj;xKiFTPfhies1 z5U#VGz(s(=0K4&5CKre)lMBRhXqi;{?_6V}#&UQXoxz%wYs}DCju8Q- zWScaGv)^PUGp6-eqhj=~cP$Fvrn$a5iMCXRAnq47ckH%q4%%DIsM_c1@V;BS;} zID2)GI}Qv-?C0~Cef*2ojKFE1#YhNpQ`m6&Z|R2K&Eq%WG~cp*7mn!{@k$>EKS#a2dBm!Uk{pzr z*Z1jQa3NaTHx=gfZAG3SlzgZxSd91QIZ7*%;g@8{iEMcnK1>-zXa>@qchNs_hdB1k z$EjfR5Lg6W`A|6zX>96!l=%7mL4BlP2W7yg;Wi;%be2>d{bN?-2Xv2R}AGSGW> z6y)`_39^4)-+Vz1%Ij+sWS_jgYC(qO^?3w2Ag^zlAR~}AL9%+5LM4lDWX6_e)R&R0 zVa%6l<|u?n#KxtHm=78tT%1T`_SVPHdKTx}s)3|o1X#D;0?*zZuAT_92`L_#@%LtA z(#XhS1E*>iN#WxBZk(LB^UM*8hdH%8hkPGUKex^irHAJA;ZR3t&&*qknFdb?-(?6} z7{a^jI*Q8j`gj;k`H4o}g`cs~otceFHln}TD197eP!BynvwUV@_pq5cvFw?9#WH6O z?eWfBv+`IR!#m@N)vu+>kx8r=bqsyP>_oMa3^)KjTiNHK-ps?fcEMD+^dSluv01ac ze<$)4wpoS^u{ShP#bbO>qi39HtbS=*AXPMeN)DVRJp?@ckFLpp)o?}$Q<_Aiq;Z}D zz6X#4Mzd~MnQLEu)L+C2xzRHsm1Z7sfvDx9k{6)r7D=DhlPk42ukSnbMNK}cwkXJE zlXuPupYPlWjT}sjtp_k#I|k*g{T1%W2Tdb0wl<@(jch<2K-IR^fmm0n7(4}4XP=eH zd3Ne3-Ugr2m&*@ZGp4@^M$dsvCV&&gYREfZmHI2IYY1ujrcsY);&bzP_QC8J1ukT3U&KRxv7OD#q6U&;h zdTaZUP`f-dJ6uiWckS|HVjpupy%+dcTsX5iIk}h^>|G- z>jmO2^$Fn>uYDXx;hzxOOU;d;Hxs78;86to^bTT~oW7qg17=fEu)(f=+x4dMZ9gW4 zif3%QDmlI7q=gfUEMo$$PvKu62iN{ium^B`68|ijH1r7VZ@4}#w6}3pw0{D7L}*_o zXrocGoJbV#kXaf&hZdYns;A4h1N*M{<{(N6n+{Czxq76qn4I}_M762=dKsg(a1n9}k%FqLv{lvQE8lJNa9 zf$cLy&bLR}MgUW?vw&SD@oNC4;(QvgOC_|Gz*Gz}asLVaH{fqNehJJ;=txcALr@NI z@&@q#7$IBz_u7|?^i?KVKOEq{Lj1GEzZTbRDgB3uKOPW_w^I7&i$5ptJm(Bnj)n_C zUl?b`@l?Pgj!O8*=M&gD)!kMi4_J)0>6AjbLu0T$R4wDD56W;NAFS|L#akvon{S|H z2F4ej=8@J3V+|l_!%VcjT7cUa{;h4xW9@PjHXnmX(T`cQ`oN49rXHL~LkkY3MTf<5 z_dfdL+517QMB~r6qjiT)6)PHhpe3HpZtoeM4S)2F}%AY|GU^EAfZqkY0uc2* z{$s$a0a@d(1AGP$wD=2vKLPv)ApGKt(@z11p)R3S#!CQy23P@j2OtgxXU`Tt1@ISu zF+lW<@rwb`gU0U$#P}KiHQ+|TX8<kQ04dg$|4ChV8Ujsy5 z#Xkew8?XS)Js6Jp0YE&S$4>+-2js)pbig%$ zGXeVmX93;}=mxwU&;xikpdavFzyRRWfI+~&0OAzO_*;Nsz%2Ah^?*5m5x`M^4S?eS zdCs^Guo*A{hzE;!58#P_X8`h~)~$Fv&Wme#@rot-@J3yWry(Vt&U zN2FS3jhRr=TG-w(3t<*^%)+Omg@q34m@;@8V^(@5lyoMP{Vf4Px?BAJ0A-K6LpCIM(Mc1-*EHaXV9H6#OP0r3LjD zW-`Rd2$!JS5fs5LhBUDhq`G#?kS3!AW5>}#4^@`+zG91Z#tU7H9HdpG=^dy-M3(|G zzRLiq{SWx7HF;ucO`ceeR4YaMv*wd*=Ce50bB0B@@FF?Q<&lvQa~*u-Cah0NMN6I2 zN5Ge^KmkWi-vau;Bi2osG4Q+lNG)j1>1ZoQ>VN$*7o%`K@OanAX?xSPTxlc^xJ~4Hqx}s5+qM_$ad89hJk6mpI`7a)+zS*p5h^2DY zgLyDY;o!y`?elzp8xn&iAdcyxBai*ySo$QT?me5wrI=D?aOAN|VT6EGKCX26eWk}I zrLgWTjy!fL^zV?`TX`Gb?p}_fHp4=>i6f6)3cayK>WG3EqGd{5u7ps+1En}~O@_5- zZD3SV3X>Ue^@^#gWG@wHGMKu;!e*z@3!B5G;;7 zb}5!rGB>v7%?u@_`n42!>{5(dGUw+7s}4>|{X$ET$1cUXlstHN>dIqJOG>?{rO0EK z;`31Qu;feb551j~`cO-e$1b&xNSQ5V)*o-5os=4`Gm|`aseNryIlu0RB&DWlDe~B* z*qbGD{-Rq(Hz%c{T8cb&sr^KXrBC=`4l=?tRk;g7|ASlW5I{4PWg-NMl z?401pW0yJzlnfV3gl_WdS=*9Q{6(9kYdk3_tLwwUrS2O(Ng5GON|6Y9m!9r z{g%!@HYwGurO0EKIz*({g6NJp{5lGB>SjyUi|^OIy0<~v=n*lQiqEa`+vH!HS^H5m{P+v znLKu>QJ`eF`fz1Dw%>P+sQ`E5G%h^2$0G+QOpT&gkJcLvYKH4*Tp8x~R?L~NzSq~s z6*q!t6yXn318D1JNhgniZ`WbzW8f`^*l~uCY$<0L`(gND7<4PN6nT&?%h6e!cVxJ@ zJkPqAJALtQobfqQc&LnH3EdHL%oVY#wdNy?LK%ti7!C>^S@pgf^4zC+4Di@K*rkpVDUJwq!Oy;GN=p4hOOZ#V{t&Z4J3?nEWVlQ{TL#~Ciz$OL z)l#aYtaFlaB4xIV<^!wOC#81Z;e*2UeKP*6KDe|aP%+(ZCqbRfp6h1^VhB&_6 z(k>=}lHuYgM)&#jtglQhm{Dsz!2`I@q$?&d{*OF4#X({rk_;86=xxxW@NPyR!S{pCzTv)l%e9 zF}!n^p-&S%X1B7mGAJU&kWI{xD4a;S8g6-%3u*nOOZ!$EZe1?nKnJ=Z+Y)C zQwEDiT8cdO+?XX&oIBB-y>T`wlo=PEltD)xyVS9uWVlSJz5^?dNJ{-lOOeMeRUuMl zBdMEnq$QaWQ&#t({*^haJhtE1@2kA**>$GN%sv8!~K9NGEh~|6mKLiW7!ZB3Qe zo!Cik^N+Y|!=AdZH&Bb%S~r;6xXLT*yg{!g9C0VMo!k5o)ykS+sJ1rXcMsT(ZsSA# zReJn&^;I6XZI`-@sk9~%s;mr#18(eHxA{zq)YnETy>&kLs2%M#@A5!6j7{aW0ZU;| zn(Qd-@<5%p+E)|uTiMD|uvJ%9q0UrU*-9O3wQj%98>#Yyng8bg`2o>_J%svD740FI zb#T(86pCuXp+KFdrp}#QI<_e)i_}zl!nL&_H+SOOyrxwLYyE*>pvGV0b0qGd7JwCZ-3yUUFVy|Y_5tlPzvw=(Hq?*2A= zoGKJ{buhx(;|uA1)AvgDCR-j&2*78bY9K6vMJtUBUCOPWdFz`|DuM39U+|0R4VV%aX zI~cC>)_8m&H}`v{Vn>Lq7ZRFYWfy!U41Bbishi@f_5^*tsw%2kT2V?xmfAF>&Q~1? zRM*upQr$`KsMRjW*P9BlzAD!V@YcC&y@7z=6A8POrI3ori@GZ&>z6kbllk_BvGG-Q zv{p>fX^|SBnnzTuvlO*0YlV@JsgtIfDf0T=;o6ATQ&)w$%=bRf3q|IeA5)c%M#NoL z@0s&j{e_1>E5`WhvhsyUQIYODQ`%22(#xY(An zld9`Ib+y6zh`R!VofK3eDDy>>&0vW#M#K8a1$#6R*-5RFQC3}9SyNk8txUh*)s-zQ z)U8^K95tRA)M40}3Cu&^g11^yCDC8nL$@7$sr8oz>-{xeACiGOkTfo%eZy{_FH{+> z4Eo)8Lsl_azalfUI+=&&Cq-JW&g~8R(KFYe^7m z?+;c>Tn5BlorY*~1_E`}p2`rCtt*iB@K(8DM<^IVi*v(H4o&U&Dl5uM5cl>D^B&c1 zvfSWB9x9@}VL(IB3*Eu$+B7s!J>L5b&@s8H7A-i0xdZ+2Mv!?c>5*z~F@>YLrJh)~ zS@pb?Zj4wFU!^~y>R#eCB1a9pM>G?xGElw3v*79_6YbwjEh$X8ud{yxcAR@nNBcJo zV*lod)tE?fHVK!?{>>Zala*q@3Vpt9;z{y6O!MC!z~@e3|Ax;)6&_QOf~n4#=j6CD z4L&{_)TGJRm?qx|Y4R;hgOBs>C28oPLpqKntbch;A8yOr@^;3 z_%2I>kL7zq8hor*x2D0zaDR~|-^Mif_-f?oH27E^FQvgpeSb-Vk1u%MPJ@s6_s=x= zm@hli;A8yu;xnwprE0%S?*VD><$~|vH2Byb9FYbe<2No1KE`iy8hi}5JPkgU$FXVf zF@E7R_*kFkrNPH8H<|_?)4L=MKGv7cH29d_m1*!X+;h|5W4Qfk@G)O5NrR8!UYQ0T z>)#L3;A1_wISoFh zzrdHXOljK(AXWSdk&fSh=anwS$Nn%?J;m-(qX;$ayqMx+f1OGntt^l2!LHtw|5{%o zyuGXNg#i9^EXP#(%2@xv^TFxDCJWH1;unDT=ri!iE&g=7(pLz57lY@HZz(>Ox9GDh zVbjNt|7)6u_jG*zz=IA|e}MnPK+?B^bZXnO{|D?K=~R4U2gy@f5^Zb@;IJ9LY4z6| z#^ZEdw5~q>&B(M><+!r*!@=*g;|=-3>cPn=#k=8aqg|IW!DIw!hI6Z46b> zm<$#3RkM~_ZFE)N>4}YjY2)?Fy*nOEj{HM5u2=?w|4}S}IS9gmT4>HXd!G4ga z)MkumpTrW1sQ3lMa7L4;U~mhTMUl*f3#=+ywc1W)OXgNaB2iA zxJ=E0MW-(7SxU-5VEEe@e6*siK}C~_#jgem6MmxEQ(J}8o~W3m!K{KB8jP9+)>RC9 zAyzd>WQissGzW)9F@^)JUoq1vA-SOE6lAHyiB@7#q!EXMWDg&0CJ-+JL%!ppK94UL zzz1GRiMP2D8CoYHa}#=CP9z$s2^@z_Y}v#8j-*J=1;R}Y$4QC&7;}+eC=B~lJS{7= zZ6PMqXU1V!%hEO`l za8)$Y)F6fYSHwf|!dH*fH+WF18X0Sr%@-rIMpf=C(|w_U^8Dj#g6!d?sF0z?Mp*Bu zveX}HV0BFx{IR_dmooZ3a-4@K(=xpzcp3;DoeNt!+Qd2<4shvNsA@4|-G~FyqD>K309qN6DjC$(cAC5kWGoMb$6d&$0TsOoCc3=MO#!h=_MAP# z=ODumwkB@Ci|_PIs8NH!|Dt(U*lxdV|%~sU5VtI7=lD5;CRW=Jwc#Uh?F=J#c*45)$H-?9kDWS)Mgtqp_&bMbLV_V9_i4M?xhgZ%00UUWtq z4AwEXC&M#Q%$8SvQU_|So>EKrK0VA&s8sK2sjjFzl9W_!N20-!VWCLvNnwkQ4W|GN zClMP7upuy~z6KVtn7%ov^LRJPe$i?lFVWL1?^&Qrg;~cu6&1cfLsQh#JWtZk%#fVc z&H3eIF`L8577M99%nnp+01mX3#~3XxvgLTF#4mX;2+5G37j|_d8Wn2!U5gg_+fG@utgTzRl0>&-d+ErW3L;OW=rPTxmywp#KO!4e zl)}7O%pBU8;)IsO1{!HfS0e_szG%oVmFj^3>GJsfIF%9UVjgC}GvaHW%XY_R@j7}S zPcyQ(A=GqS6hlSG&$N>DTCgr!7M0%67I@OPvvsG9e0j681(j6ZlF`uHMPC3TL9MKqwM#;7e z^gxk0^~g3RSH|1AdVh0mKnA8`pd_lIhYG{O-`85PEHzk{6J}FVb)HPtU=D^2=$qM3 z&44~uOFc$ba#UrwQP3+r4Uq<%KFLrLWvmaZwDobxZ9NjlxtKCa-Dx^55|BEK$>XlJUznTM51{_HJbL$&a8E{Nk z(Gu-ggxux)>M^rzn0u_Ep73#!OYDtAm1TG;gsz_G!uFOfsVs@PLQBV~on5R#?2iuz zlZ40VM1z@sDncxdToeb!xJ0!ee^0c#y|XJO5k8IbzM!W;<{GJcD~3h&>~Nw{b~#hZ zP=^>i7p!Ea!kIc!V#Jn8Ehsa4SBSE&+O_dU)`t|WR-!{2R*5c+H7wEgIn_$kEIG}U z6pjj<@nByH;%95*iOqHLoRXgPM^@iNW8{Y|vsQEYjt*xBA`V#|zn zWpfy(&0>gS22M3gS(Oi`7>){_s#|6r<(aLO{gSRFRFKF8^H^IF4?_&hsUOCSDN@G< znx14&62`<@S{x^^nCwRE^R5AVBc(~Qk;+iQ_Q));&C~{L@sw)M&fn5i=*Zh9V@+LDiwEjJ^t5)UTPsC^P<**ru| zobdb`W;EGbco6B1_LgowsYETk#m7)}#}KujH{a#7cZeI z-*xwcCvACrWYxR)GC=4~JEk`a-D$^E+2eHDE6qgR&38HNHO>|K6>q|k;=a5Cqj4HH=T}mPO0oct{1w~9^_wy?zH zIqjaV6}r>z=_5kl@mfyjh8<7s^-lTs);{u9TLkYggzmIUIwhC-opxSN61vl#>-9o+ z+8^C2bf^8%al@$JX@7LN(4F=vHwfKnhca_7>Ur`q@58TM_Qut7o}Tr_maf9H@!D1B zPCJz63f*ak@&%zg?RsWl4@)Zhoi#%Lbtt&z_QGQ>xbVr6Vc+}h7SMhm^he(O>g?Wy z%NAUE+i72xx6Ho>2kHp@x@XF=0?&Q?i`AnBef-#SKaXO&2-aKkT~7O*QK1iQeCCQv zryRP|f6$E0OJ6(`Go%ZIe$gi*o3GB_{)f|EpSb^3{>+~~am(PXMNhsn#xTAVy3?NML`+ulT~2$YD}_FF>`5;_ckPFs z{V)IC<*qMQJb>4^LT||$`To=I4Bggy*^M9muH(@+a3Gk_o%Tn^VA7ZGa@rYf7P`}( z@r^=v+6mq!bf=xs{gJ2nE~lMQpU|E5i7ykn(?0Q5p*!u8PQa6KzRPKs^aP=&woCfS z0T^s|VF^VYchMH@Oy6|k^0sB&-5p$vn3$%46{;^uml>H%lz)jO>Fq|kR`1V+qU{81FN|yKTXf$K>pBQvYY2By0eR<2mC9Ed9 z6RlJ#vBJ^aNh?5mN+Ar~pxW=ILNnu5is8;h%R2UCw0gStsC6o3NiD7FyK?46%AVUU zf=5NP7{B6z@QTuOQ%3G|dGV?sUDp3$Yro8CL}gE9FxE<2I`Gys-PHX%LuJx1@$SUd z>|^$%ZQ$LBN2->nja-)P!Gegb=}7PNG?#kyPfV8TyJe_i80wE~-{k1N%O z{S)`_BOWs+{mLV&4r$fjPPLx1B3<2`Sp12iFW7^ngo@PF#;2>@sqbdKcPv`ED8}lY zR;n>2Ntab#hwWzMQZ+`T7NK`C{M|`!DwVn`owl1Q%`7}+;j$QK0BPmm{}G$E%F?W9 z?X{?>1U6v1mlsZ4xS*DM6T1t?5pQf+(bn3~b}DaY6&5uW7f$SIX>4ohTG-wgYw3!S z*tSR+lRZgppo45>N}z3lx}D@OH2dEQxum#oLLs7N{Ldv(8||I)-%3&$4jqs*S;HF$*r4$VAXs_OGmOsPi-lz`pgSxj17AMu1H?Tkf$bPGAVH0li#yw@+R(wZbTrDu%xDVK22vR-#ugVN zu~9aO={*&Cf3RWSC!E~-225EgR)KJ5mXX|+2TUw5JIpX63v>VqQ`U(!3HiVz$o`yx zTS>581>q@6%=(-VZe6o%xFBknN2&lS>&NC+T-p7J@{n)Hum?dL-WeMvj`#HP9U49G z?%%*Z0&(Oqaq{5(syIRuCqLfdiX${}%JSV09eGR~@Ak0MMLF`AIC&Tb9p1AhaO$HU z9o`=&aOxRJA{^yRoV?~SdE_^7^5DIzIL6(?$&dZJ;>d5}c!!ET>B=#lCeCp2eoP$s zO`Ll09!wnRCQdz8oZm~*FOMdVydwaa|`^5Z7-D z)`V-XU?<}m7pw!luRe;mVIMv*a7!m|$1qdYWK2;krz)yKr41*alqN1$z?L zHo;!Rb%9`S;EK1^(Dy#B^9B0?*W(1^!Gm)I<3YfUf)xUb2sR#AonX^|RSV_^RwWoL zo5**TS;l-|9-*}Z?pw= z19pU9&jTAR*sH(_1$zhBA%g7y#ySfNWoW`|eOX36FxEww4F|>=1QX%F@ID_{88Egy znEnRFx|C(yN3aEdV^05vYq!ts|1?&)I0qIa@=YVmwM8Rn*75P!uy{EPaIY^ocE%Gc zN3Gp(<`L~zBMK}Aqa82HjdtuDFc$A6%6c~!L`yfE1S6!I);kwy5HA zKRk3?&Vwn;NBl*Hs1(u$r!rZ%c#w`|p&3hr5Vt9WWx$j!)0Js)gNSFa+58;;0x6n1 z1oPthGyJopirp%-^KrdJXy3v0r-D6&tKwsn6yJxyZWP~7alIb@0%Ii7cazXqS+5hU z2-r^q8w>1a!B~NRBv>Y{pWxq$zv*~bK{jsaM|U1-3p*sgrxFly3R}4!GUh z7;O3$)rQMa+pYIg2HZ~`a9@UftXcB?%f7}6?3%=8;JrX#H?)tj0^4WduWX&gkW0%E zVG-a>fw6pHM+=TKAO{VN{k90b5vJurps6wLdWL1QF7(>0Bx2W{9gyjmH*Clpl-Nbl zeFx@*m|vFy?gMxkARG1f0S^a+6;?6-MSJh;WUd0735eDhKLPL>z>@$U0bBt1Bf#Z= z*8wtBKL%vSdn4dwfHwnP4Y(PQ^@?(=Rks1&rs==X^!osR4*G92eY2)N28b3Ie+Lj< zS=@y*{TeV6kotxKJ_MKt$Z%K}NFN6NYw;gquyY`mOY>xcykDhJ&Hnt}&vwSf!er|RSUzpvcaYg5G56ZpEhKx#(hZyD^xts< z)c1Z>&@-xiM1uMDRLm!BT3>t5;NC}E2x0xO^VW%E?C5pF`y-j_W@pj{?V|?j+s;Sb znFO>Qy3UimZuT(MiEg49CK?eHTh;JAAtTW{>1~j4eF%)M*Q=W-3Csj#BquEdd6vAh}_y?0!Z6^ zr0fk@e$TTH?%Aub3Gf>qHsk`(SOra*YRw0M%FZr9#j%m{ePCOwXeqGxEpKVXIGa11 zDI@=qIcT}5rF<=2;3E(k+Wq=0&Rsf== z#Bq#=aUkHyfb?$x#E2hn2OI^s0uUDU;;R6Q0M`JH2fPAsBH#}JDR(U(<_GZ`0FMIX zkTeeP=YZtruuguK0r{C%_u#Kg!V^;_;fduKJo!S=rfDq4n1dMwEa3JO^lw@parN&! zKf8B>tMBoie~x>of5&|gli|%M-M;>YBHqndmD#g@KR+4R!duQfHpCA8k>IHP8;13M zHHibF(e*;K_pzNPZR%%NY4m%tqbG@_tE+IACDWz{1)G5@v${a0aEjK9dxb4bU@U@x zqvcZ2tj=1kkwTe_4)o8EN~<2L7Fj)kQ+|+)pK7#ZPggRa+A~bXr33%!LR^$HKUgba zwH;_!i`7~?bR*_)R=^K4P;v1jWDaK>&Gx}qdT63O#g^fHBWm!l;Rjo2_>zGG7Uv-x zIZVg6vHEhR(5i_gs1}UxX@Elky8t;sjR77B*aOJwyaKRB-_Hj;1NSEbehaV#a3vtq z%zIWdRy{Q;5L2T9u^j2+S$errUc_>Y!HCsWLgPq7EJtQcN|rMwB|E1-R+PPVdn_b# z++oQ%Zh@NP=5dajLwjl&AI^BHhtu3q?Nc+%j+{!`@505}k)O0_v5RKzMp&wB&tdH| zOsU156e7A?W`n;2{{mw=uB!WGF5N1$D6S6+#!^teY|6^ltg(JjOn0$Hn1ghzaY($> zC_+xW>8$?Nj`(u;9W$UtQYU3E!hgqDT$EdY1@Tx{bm0O=b!5b}lj^AYVOKu--HtYX z6P4_USs~edGCurfPbrn@6Sdf;Pppk*`ly~bYhxZ@9|>?1Gic2b2V(&a0W1Mzttf3Va;<(-!0v__T`@J=!xjlPB;!zgILkX(#O|s z@87hhuzzQK+Vt44-i_$~Tr-|p{lT`q)~|B)ZyWbs#y`ew>VLogDN)tCV`ooU`>{xU zJAyRYIo7nZBiD7cQOLK|5}cmjb5ML{sSzt^4<*$78k)A| zp*$g1x&d(f%KVN24pBD5CA26fZ_T+m1 zy20x+&p|e>6E387gv^Mt*F`cPb<3>$QMWV<=#%z|R4#VGcqRY&+r~4068FPrZ!2W< zK%lp=IHO@(o<@zunaGGTvp*QIc0BtOdr&xT;?6G+?(1jSEA6#Xrkn&v(7h$fNlF0PN5BXVJ*7 zrm?fS7Iy{4K?!UcFeSkntu!xA(6$2O#HGL(g4|PloRB{cT9$DrFg1hl0#l1f!33=X z*t5cikx%no28_@3S;o}~+9qI1GY=e7F?a*m%fhz>*q;P@2iR`~dmk8|d$Np=fib07 z#tvXF3HAlB7X{;r=?j9fm^g>I0e{o+m^;#?VgqtS7!F7p$MHWxkJbOL@W+x8eAIH} zQv>{~_G5REE&kN=WD0*Xv{CTCKczp$0=N(GpNzbpFkr-CoT>XY$XZ4mnFHzZMn#ZH zlB=dbAuwQZAkVfKP{OBu>*_!W45ix$lco(MOc_WRsACf5aCRMdmcgLLIQ~1M9-mMs z6XPGx5#|$$Y3-ae^@L(sO(;f^O~-uWi0A_W(|&Pd@RZGR#_`tig8`2LJPhzcz)^sc z067wt0(t;3iI4jMQ7-XnKpKw@1I_?!2Al!g_cp~6v zz>@%v0*nGy0-|?{Lx;imKt}W*r~R)7ya4o@HT@RAR@~nW*amnn;3B|B0MR?d9|K$l z_(#A_z?T5K0sjd|{htFe{$B#F0;Gv3^z3mi!=3@i?><)p;?YWsPfrD8__F{hR{^*N zun~~Ps9UuEsoH-LAf_|%GXc*A?AQL^(f*eJo&)+%0DA%N*8UG@|6c<#KVAW3eA%8D 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≫&orlcd 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%0Ape4&r;Wbsik;(RB+XU*EG#zoiPxBTBzD(3_L z9)bVxg^Yx}-+lJrc}E}g+0(zfKWG@=2z+VH!3)p3?}|f~e%H8R_@{#!FnR~E{^~E! z{>h>rJ-FoQuZt(2_wgmi8pe+Ve&fj#3*NuC->kyM@~scQxaUH{*dy?3U&(KI^7{|m zowMhnDcNgtPQoh{d~OW*9=_^>_UexKd!GGSpTDQ?{NNbFXcYLrSN`lr|Jd{4+JKn1)!?T9KgI^oJe0}4{o#U^3YT)|^<>UFo zk7*e2O*(Gj>%Y6>ldQuwT(`mZ&5FnHicjFzJ@})xv4`HjBQ5i(?!P;XgzBf3otUYQuO`;Q24U{n7RR^sl+`_uH=V<-dph7Jn1?`pIv7^~a}< z|L5?=i>gn$ydD}cJZ8l zjJ)|rGyZU_{@M`#J$>3VGKrpo)dUZ@rJ3R&q#UpgGoEGl)n3L@N~fUSKpmqe7raL zzU#;Ss`~b;-}?Zz($hs+-qg zq6_@w?13ZNfBToGz8`${kPj2?yWB9Y7x=DqhyQu-@qb+PY(?7C)5awJ*f6#V{Pw%= z{lilQpFh9x?tdK=cyP!mpby#(_+Bh}Z2Oe&bo@D(efP?zUfFV^VJs2&&Xv1Y|Ma@m z!>+mWwGHp4UY2bb_X_;pzf72Q{w%w``+o%P)OXJYZv}kyTNiE#EIIe)?+%Eo82aFb zs|@2}fiFL*;-r>c9YZggc;ELYwR}AUdh-H5{gI2S4&Q#`8}pvuTyW3$LX7VK%;A7< z%V(dw+>~3evZ254uV;MGrwR`n0)O>4=NE7O=9Z0gGe zZ^-?ZoSSs_8-J+4r!IjX{DUJ4rkp(U(Zb6gy?Vx7i|~ypKbiISoB6^`*H1ihZ|>kz zwl})M2-r_&dON z3w+HX7dQR$i>uzd;)ud`ie9?uXZSkWpY`AO?;m~m%GGCQ4m#-g%Pvovi*dP1;9rl= zzi|1I>ziME{nUfj-|&xHA+H4f{J(D-d+UTxXVwPKU4QyPH@t-}^pH&f-~D5P*A=|^ z+1UC4N4`4mgLl6Nvy1{C`PnOjH^2GC+CQHD#2Gig+;}hODe%gKp&vj0LBIFc-f-6^ zzpa1jUBmcN;Gcf~+G|hzOU3u6uKD#z8^1Z`b9m_yJ@qYre(lX)yff_4-p!05^U2 zMFQV>$eHm^oqP7~<~9HMLCcSBg4}yh;CG%<|77tG|MU6N*Nz=K_1yV*mHmyt-^_Sw z;mJ9-tbJm^g_-x={V8P0u~^;*e0xF@{`#A^2m4)FTlM2jSKN;|x=P^3oV=hV)c#>f-C}fA->6o_zYC3zA0+ zZA-_7C){QOzO4IhTmS4SpYJ|$@)2AH%(GQX?x*YRP;G6DxV%@5Ht3UcveeUXMi4Q}rej@P4=cF$E zO-aVbBksNV?uO@22mSNFa{*t*5oZrOXWec8Zn%B*l_%HS@|0p*UlD)O&>wHz{Z?My5$Q8On06)1hvL3@ z;$b*>Y}tuaOs%QH`ZLxoudDu-^xf^R?c~`Dik$(yJlgV0{dB@n`KODta~K)wgpOa+zEu+R+|!R(++X3cI%yh+JUwYRK2MwneGf znUwC;kayJpH_6khA>XSZAL~<0H`n5Bw}@U1`R=X`t7~WlrKeW)cs{DE#|O$-?=*On z?XJ408yoa$$hU^tU@9f8S3^GP_U+0oy&Cep8uDtYxUolFLqp7BtcB*gJl5ZlYwQ2F zHRKPB;yrZv7p+Q5uNae-kv1}IVcKa2NWq`&H2-h3W4l1}3XQlvN~=G~=&MtHV>nWH z#f)#q$LN%{KcKfbV0%%0T@`oe#bAa2^|%In7q9}p$KrFh3izff0pDgM5Iz`3g6K8# zUxKJU;+qRnlW`_yf z`yO@Bd$h2*vvb|(R3j;c)rWB4iMpjSRM*sq-7HBdyq-dCnp{y?k5BtaDI^3Hw(Gcg zASs2Nj6>0yRh2DE4ACL}1fWbDW?6WAu5@*7=Ri%`Vl`B)t8OgaoX4CV}qCga7(n-E1tv&>NB4LXLU zC0N!X^vv&^j;6tg04j*hV1%p1h-mUcQAWtiZYlCIrO3;a-*_5l1>31pLdwLBqV)J$ zK#Z~(dX^_|ql{2gt7{y zfvJf;0{@!YJeZR0dQt5}e`xzV&T%TSJ|glT1;xYW$;oZ~zUBd~5SdW=P$q6bro9!&Yg0kwkNf&U8TVL3t( zB?)MgakvwOHy#EGZ-!{1kkk{SrlDDeccDYwiPDwv2*@*Y9x4tZjVSliaF~JZcoAq4 z@)UuXQUqd3S&mS!d+}ev=5(Bwp15vrTm1Mf!ELj{?9=fvZmH`&4>e&920F5m*KG-9 zbz~laX!MNPdtX?)J#pQZwxp#?q{Pw--XGb~7kT~4Ox{~RX`$SZgWHxaQ#j|n-*0J? zN;WNBwKPd%rV41b{+GCr{lGp4&9|5}ns2j^!k!oqV+PLbe5z4n!J4hqxk#NMxodG& z1HB%p$bqf~#0=N#M52y4(409Oc*fUixIN!w3vw#kVTjCE|8@g@6OQQF!!}v>bvTZ6 zXB2!Gb<7^K36#P*3w8xkkYW(q!4~6CfUmOF7>DC}xH}%QXiCZig>M`J6x;0EqQQ*V zH!|0uh&K^{a3*9p`wL~kc1qxdhpcxD_!LBwQ7>&qcff@mYvhA+AKsdKV#Hh8TxYkGKIbmJsdVMT}8yzZ&s*h)F}@ zvp=Wd=qopArjkS^Fy%L1#F;%wGG5Uszv06rDLk5dP65%}@4$;r z26D$VOo~ui?Imac7YaRQ|Jp5yOMPlmAb0Kd)ZoHxYcGs9242(;1$Ggs5?s{eB)A~EZkQ6eJlICr7OeJ9%T~Eau;~3aaLt{jViUtO8p8ca$TzNf(84d1$zrAww)@E0IKZ2tz19GNx=?BO7-e^ z3zmVDk~UdLsahyE_TaF~7;3gNFpq&U<{-rU&#dV#`96(JylF1^ro`Ee{O{q2mN9IT zWs49G!F1QbeurMN?=pr98upquCsU}9B^eI4gbHt1N9aB?hkc<;NkckW!`m@u*}t`j zDMPTXZKuq^^br|yDdG(L--LJq;ts^5^%aOY>XS#Y2G5a|JF&Mu66vX!9@UU}D%KC+p3Kl@Usx0o;$um3VrzdyBsoVLC%PZ24C|_!<&rMI; zg`yBRnDvl3aSPAdHb+gtTEb^{d@1>Bw?m?}B?NIRK5JV?C>^+1My0Ng3-#|9U@pYt z*Pq_;R1h_A{l`&D5KC{zB9$s@FZL!C3nVj_vRB=ME0KzvDI6s;@J`M^3Ndh|FddJh z500fc7|i^?AiuBVD%c{G9g%O&l+nmzKN#%g&3~LpEW5grz?*~ z0<(4$@UyI%GusD6KUg(4W7EHS@;?~3(6v|+sulc1{N;ws<@z@L3I1P-!wl>bXB1}+ z?t&8V9MI0h6NtZqcq`(Oh@V5uYu}ETGwDghd5Cu)rX+m|aS3ALl_Guy@dCt{4eex& z-ykO4e~XwjARe!<97kVyHNaGo!RHXB{08Nsf=$*bJg;yFg~RyrX5E&j;?n^zxb&R2 zt?csL^mudi$lK^Y$jGz7e(`hI1!IOQr>2q#=WR;>0+$h~^0wzRNu7+dV$3Y0P7>Hu z3&zV;?8sj2!BLIF3=}7XCu#th5aTGY48-Jt=zIlHw#JTf%~!RN$=2YAW-_+PHs;|t zF3e1l-ghJ-Mg1kdsXu?%~K*&gu1#)_JK^r ze$3af7ctoU|1x6mFPBg4oW8Fk9)|e$h{eho3NiTGriIXINq zV@ioVru+tls)8lz6kY>>3ublHL!9Lqvo$9`pbb?5EqxaXngT6!iYtpin1zOek5XsO z5$rh~uS(2EnAh9-pG7&hV4FIxZ!?IAwMqYu1d|)%*B{xj4QLB&&n0PSR>?YEvXXTf zNGXOp6)DABWV0ZSRD*Xak}Z{MRj!|r;$V{X?!;k+%XPw(AY{D(fDyM3j!UBQ3(#ag z$yLT*FL25CX+~x}=egvY@~;SaoIDI>`}gyb^xIvs?xi@QU*fUPtot$?tH>iNP(D(l z%ErEC7GnrEGuYU-3gyG>do-@zT}GOZ#aEeiAZ9*62(7Ywk^zM`e8j zheSO>KPQB5K=6P1b!Tj**eFu@eR}dw@bV2J3_V zh8axDN86+Dr9d|W+l{`-et`jIU%p1%5AnbBfa4Leo!9pb{&UX!8!_hs22gIgdl6G8 z5N`@%JbboiB0dN)Z^ChiNqI za+$!$Vta7hiNg$>^9&>v!?#Ud-ZfbD8)wQ(8V=Yed3h7chuL}mc^LjvUgD`)1qIj(0QXY@GT3?O>+p#;75EmiFi(rwLcmpKz@>ImtfS-n# z@-i1OW!MzNl$ZQZd3icwvLxOZiM-52d=dWRy`sp=9K^hS;*-r+;!yIEDJ3tNQu0#4 zC@&SvTV591Qce*a1o%K?5IdjupY0AD2z zTDXlIHWZKAV>(LWJF@r&C;Tz6V|F~sr>#FHv14lddY;yvo&0gfiuko9$%#SvPPlN} z5onJKgH+>WoYzSz9%nB2IDyQtSSN_jzy%*^NLs|gK$#8{wf`x>&66|D_bfXy7+2me}RroMAm1z8Mp~n(s(BK{&0}U z6wP!wBq)4Zj>9#|ZXs?T!etw21i-cqOui(g@Peca0C5S!Uq1@R^29)NA0G z;0q?tLY$6x31ZS}0pd}J7b2dFIEXk4@!5!T5mzEELtKTJd{&K^uR9haCaqWx+qnpb z;y0!gzcJ;PM_>g5?+Ttg!^E$9hVPt12_1osgV(2kdlJ_@6FQ`$EWV>W5&!e!I|xjc ztN^m&I|A!dgp;<#qhc~mIu0}NVV8kKV<6Ko5SN3#2}ksxn`KT%-Zk!nj_)U4gN{OG zz{4kB^0KWfQBQO8GMH1B9be=+S+Xy)UIT}K1`G}$_k?lSuVNv!m4w~qJ3KOu`39sG zFf*{v99%!*`5IV{L13~$4@M*6gYmx!F&-X_X2eG$UXFMq;#R~H5Qh*?LEMIzG+2R{ zgV}*YZ7^U;Z7^U;2@eJPQsd#J9#U?uDQ2UW9$RJqi>@hXk)1sZ2fIs&IDq4Pyk>@< zyz~%cG6qwES&BFc_8pyrX$gqE9^%INl63x@8|OBdWenpK4JD4Mhfi55MAy>?U@zAc z=2Rw5Wa|l1irheUduewWrMeE6>R50jeG|@1pp)sZZH^L(-2KVTU)#xcI6m@Tp#Cq0cZA%A?&{5 z?+O5jP}Np5$0g3kyFTgf?ihnS5a-*4vw0O^XBA%o$`E!|!EeSYM7Px+;I15F@J1i! zdlhH1t+2BSJUvV3FIT}N9*1;@Zi{b0yK;;ncNO1eV47`(omF6kDk1Ew0?QH|qT5OV zyer2TlsR#}r*SshO0iP&bj>LSYi3yH+14S*jq`!kFqZg6wJGCWC)ZI<#`)er9mHWc z#A@qYUGpJUTbBXCnZTOK_xM(Adw}U{COX+tm-ko5bILJiFCel7$9*z zuC>{-`Io-%2WOuT7o2odX7>3otIvPZH6Lb}^!W%7JX64IsoCdmG>+;sz(zl_V^*o5 z4#@Ei$fO8}eZEsJ#QB5si;-iP9RToRN1 zReS1Ran?LUaBw%X>KkmODs;_*rRE^a`z>n?EkgkWQq11gP{87Rm*Y&?PFTl)56q+4wbR5v7)F=yP+2#Ebk zkCmFuE4}z93;yK1Qmzi-d{|RiZ60f-#_5`mwc5(^Z0k6wXEDws#=5G%Z*aDCyx?rN zwRN1;)*M~)aaLPR5pAKUab5((ex)Z!&F0E@*zjFA`e-~k$d1_F$cL{%>Jya6x14+*MN95(HEJW(Qfc_LRaBiOl8v)C zw&r83Npe-cAgSp=oJgLxJ^cDjA0SX=q63i8mWQn|X%WHnur+r4_$d=5haR?4jDI}w zr`flR=8HKM+&pY;wxqvCa`CX022uPt@ZO@BL|~Cj7Y|!pVSTD`h{xdOVT*X*#DK>q z51Np)2egwrbC*ZdOXBh=E0-t-_JXmo(b3bsN z(|Dwdo97rTrH!|Nvx7n$fonLo`nVGO5;y^hZ3M6SUPfLzaK6-dUiI;r=Y)~iHG_k} ztG-8&R|K4RzLi4os*fxAiNGn)cwY5A4ZH=wIR?DPVAbd1DQAwxQJA1hq^F$C@%RQ6 zo2MK-ON@?hubUiw3Eoa{MBmvvyVplfuaBHwA2|ooM-FG`zBtI?Yw#~2!(#A`bFumQ zL%FMfy?fIaD2<*+`j&C`{X)E>(O}po3q4&>YFo}zy6+8zme@n63JcT5CfKg0k@`+O zk3>2dp?&v>crm8Usy8fBX4Pr1y%6syWK9I(npXVV&{9il-8nUANpMiq^xy&yICw3n zdP9#U_=*jC`6#fG{s(l|c-6EAh`)3`@dV17-Ve&A}Kb7vLh;X_$s%4nc-fnQlq z`Vk`t$keRzvhva#`EPeO(No?f$Wdt+Htk1(L(EZ~Q(B&j4>^e`UATfUxu7k0Ae}!9 zC*flC_F#EusVFE`l;sQx`+qoqjvkJ}fY~O@L>aaH^rXNM;l$hrw+WvCeFN6dTxth= z-_$;QecNU6S6}D9W#@v6ufjT!E6IQ_>HH5T4}0#NM@Rj1`U9udw{KE=QUksXhu!?z z>9-Bo^w8rAcRe$7+K1{3cEGo0?~dihvOfKO|3pSgTFb3d)Tc%_?+EWm{Z8))6Vai7 z&*>e3udxF@r+0+k3f$=(VFcE|Zr%|>0(W{x*dcJIcZA&ncX~%S121X@SS$^_&0yEaMbd7v#vPuotINfA&&*_^p0?;z@6R^9um0I zJHlTC?(~k3j%R{^&*>eZP2f)N2#*Tf=^f#1fjhk;9E@kZfY0e2VUEC^-VtsUxYIkr zM*??xN5}?G2YgQN2$u-l=^f!W0(W{xNKRxuPVWd~1n%^XP$h7ucZ911?(~lEw!od< z5hnCwyH4*2=Lp>C9bu=yo!$`we%9mkj!+?Rr+0*#1@82Y@P@#h-Vuf;v3{p_gpk0U z-VvS@xYIkrVacq==^Y_Q;7;!d*9+X~9pQ0-JG~?H@6Y<3-VqiG-02ua0fsZ>q^IzAmJ^aKa zQwMB%FYY3I@f?HO4*1I99bt{Yo!$}XJTBmKdPn$7;7;!dQ?c*~_?+GmRtntd9pQ%p zcX~(oMBq;E2t)BbHQ;l4M<^1w(>uad0(W{x*dlPJcZ5T*E_L&cP$_VycZACX?(~lE zOMyGRBhaU!n|Fj0QwewXj_?cQdF>jBG_dxq@Qx7K}Rj9gS1{>2Ts$v zq3Zg&MLo;F@>R75tJFr3CwH?-OoRHi>YDlWbq#f)?#fuR5_vJVpB?G-b&zJa^6Yj~ zgc#&|m2vw?>0Vz4y}k}kp5NTkv;@ixv5S8K!=)+U;T@2Le9SiDLqjOp%8_wmXf7~XSGUgR4zcboRNQ12@1`rdJAuY+D+2aQ$Z$IaL7&E~g;Dyx>^7Jguy62J>G zzANDsEA|2WOQ*Coetz+8Yzk#94%M_UkzKR6sig*(-T@U@LB3P!fA}OP0iRGL;MKnv zK}rxKOZ=B$q~VND4oIcrtYBl1V&4*sOq^Ld!Di_lFKF?fZSKLrQf9!XriehR^$f(_ zjiVmN*eD%ZvkX3iIV`<%2MM-3cWx}Y6Ep9hpw2WLW?)+zKp@gccg@H#l=>pKE-Lj! zrj+_3Q-0%WoO#VjVgi>bKaD(!I$V<2dsleSOiiXnD)gb_YmpE0D z)bgV+s1*wZ@IxrKK{L3~*ewsWT-2ZO<6 z`e+J{E{KLLk3o$!4vB1F@Pmg%DDWR}4xj z2C!%g5oQ_Aje#x%k^S$K&dMQSq7^_078$I*MRdn2y8$IA1@3Ln-)&#^+&dbJU0vsp!m{aH)btt$z-e z;sjzKj%qhs{_~U;RS)?n&WF$Z5`6PIUNOr+)N3elB3tJqjPvE<%+&FF2Y-!7hh`lM zj-=P%d>jr1v8z~N`vvMDoD=-ugFgGrsbZBVI6HABHbYpc`VRR|h+LOV(V6t@O3|5D z9p`%&XI>#gScUpN1ptIKGd!jtnufNvI0L&SuM$VWsLGZCL+|>cyA46%`6!U#F_@`T`B!16Wg8{ zR$ybrp4w~7RGLcRdgcGI6y7%F7(iYs>CEmao z@VMq01iZ^NF3Wl8H|++_7aEUqz)c_N1;A;Vfo8iHDDK?!kti+?$6|XJ7u*P))%P9X ze4+8Y>SJ@KK@Iy%s$wHh+`09SYmY|Y%uYiBfh^(HKdu2UO*4!;a4>k)MXQ#&Vs*eKi&%oJmG;8y&kIRl{f%B%u^Q!M@;Oz#^FZKP@>v~DQ_koj` zjs${NeWc$|;KUyzXr0n;B5+DHo>zUO-y-0gd~E0S@p|ilbD_rbs*l%uEpX2IPUrQl zLH6aq8E~A!<2-lcmp}WUmj;}}PUyV8Q;?mnaTKO|eK6={tOed5PVBtC3CQku5*CCw z7`S+H>mSw{#(dzEjU<*gznq4=?*iv>jps$bT=efH;2h31DMB9{GCyp$Il^;s6lfg& zXP}&fNG2)yPGKt&qhr&rgL$Q<7V4oISAKgn?5vCMR-(gO}T zWff|6-?k(rn>8BZr+O)O|>wX{`*MDvOpoaJRWRkx@NX4O)L(iK_ZdZ_GW zWg;tYT3)$m?Qr>LYTXfu|7B%P<+r@75>dr_6gS_zl4%7cc`#mNt0-)|L(tfr;LM7w zoaykY;Hr_w7QSX>reTPjin*c`_BwzyjVpo;)w~o_+sZ@dZZK+@j+c4nrK=Z#LTYK4 z7aFB<;9Uz$^qSAmWSh28b+s653!v7^PgR;@yrf~*O;Y@{|GRSDTGc{)-9A6YQF zxJ(!9j_#dPca9BO7o}^C7@t`cQzvUUOV2q}k8Q=gvOMY9JV1m}xbxOjg-qHvgV|S9 z2J7oE7NpNNSPaWm$?PGPi^?29pqLR1QZ;g729*1#yvGS4WUI(4E-T8a$Yb$-$ly!s zP(vhzDkhHA{pA3(p*F3iNj*dAJ%%cmDAmUZhMrZCBT8^22ro(6gQbzYoQlY4F)gno zuRN=$;LN;SDZpAt6`=t?KeKZY6KPgS!R$QP4=K|9ikPdqI-NxVaErX+nV`wq5jvKU z^Cz!lRx$chk*9PJEix-sCgoY5o)=Z2RqP#SRt6@T)^&wopnj%UfqfNgM6BMh7vHJd zlOb@YZdIkgow`{3vJ&t)bv7OsxKk(LBY``0$tIvfZn}Ak1n$%sxKiLw9lT!)JUH#E zujb#mb@dwq@7`Ftd(Xpg0wQpyZrC8KZv#H3ZrFT*J9WT*AaJMd+)jZzb>Y4cc-jYB zzD&FHiuEg!bDHjmdu%*DeqaosqjE#`lW*Vf?ya+*KkeOJEop0D$5-G^U5hmWck1fw z5cuG?hwr@Qf6g88^r&g)&oM^i!C8sGojPVyFlF6z#x4-JQE{<*igxROEIBy;P#VJLa6;C_P)`&wYD4`$^~4P<3U?l2}_*7q|aSc3;uKoJl>RLa@I( z{LIdPh}AU|Yx^S`s#-#*q`R99t**de%l`FaMWyaWOgwAuhK>nY_AbYSDH|4J!i0?6 z?>Vr~`zfnClK_#DR(coHm9$nauGuFcUbBMtqnPUMzG|GsSRrUE#oC;{*{_HdpOPy+Mqryr_C&ew%%8(MA8+OW3| zWrrH>%(L=Qhcn=TK?0hy0%3Tjl7NN11TMB1?05>I&hX8-*Z$v3^TQy%A!45ZYsB*# zQfWAIABx(^H&9YzaORb(oqYT}lpuQ*_`xv2sK9x+q|U~f)JQOzab~aVJO1##0sq;@ zJvh>Fm;npkh_F&$5OMi-z7a?Co*AAo;1{L2DVoV z;*uHkmffRL z6G}$=Htdp0eBrkrWQyK``6qT6r)2TN4K-dPIQdClSq>{qxa&M$! zF}x+wE_vOUO@HjQ_C`iC+d7nvCZkz~oxI0-Z7M$X!mrReBO_+2xjT{$H)7iz>10Co zBbo^dHF^1wPLY=>MP8=-vMW--cH+N+fs~2ZW@>IR-GvP7`%B)&Z9IyK6ba*SxNmdA zYc>gbrW(;yT!GwZDw<`uKk_Hx{R7tiNcAqMlR0an;ylbj_Z^Z>sm&%INWJPfoTuXw3>^|Xj++N`XlePFvo?tEyi7v z(G!&QdeLGM@)RwYQnX-7?U7WlTk&7PJoZQ`f+PX$bR6yk;hlzo(~}{ZAWHz75Vbwo zEW>-#uUrYT54$84_sA~EXacbvF9Pwyv?35wia<=MJ(3D`Fa9f7m(q&TBmsA!{gGA| zqjWT>h5^RF`s0p~Bu~~(ZoM{%ZKBZ~d5q#Jnw0EEG%2TRX_bRKMM|a=DVb8zO2H_t z6s$98rKq@n(rP7Iil!o^2E*Yv`h=+%DXnJ4DD=l+T6l=7XsWSYFRI~Is;S15q8d|5 zS}E9O{8uo}(6Um0I=E7OFIzkJ$3!KbE*d_&Qq^dsP< zZpIu_kt5l3OUI33b8w`BnAqnfshK#>l2i-M6_PU7G1d5IhBZ1t&S#(y^&uuM;|p;x z*z--1%ez3mkx}2_h`wYDn%LDt7ZDA6Cn&=W%M^k zjD7J@XWQVuh1Kf7{&DV5rf$-(a&(t{23^~^x&cMolMydPOgezp?VRJFemf-=#zQ=o z;jY}ywG#18LOdVwIK&GOa|hMgh$)>a5$7RZgcxfvqYCj1#271ai&%%4(}nf$##W2? z9K?jTYdHJEaaV5am{M-+nDQHG=)Qub>y+rXfa9Pf6o7X+KinQFCw517WCPsR_bDHr z`L=Z!>wUZpfj1L73gbIw#IFx*BZKV0k&eR*ydZ{1W>M@yX80kFXl5|WoQ%B3C{$Fi zEm3I1zl#Y^e}wFi_^uNVh4f}ec2K_R#1(_-wD6Z`rCEFw62iV}9%^c_$%_}s zWC*TDsx`b3gl7`ZOTq}iZ)aW05mWeL+O=cXrO}F*avy`$ek@`vY1>agyb>`PVHILt zJM%e!U=S^Pm{PKbDZlZq&P@_QtYEyQeJ?+`{V$21|8c1?LV#*OX z!-SME{{^;j%7MQiFW5nF98x23CU>|C@(IXcFsC4;1OsW#fko%Bo(rTPvVvKLGU-jP zS&sb=T?}pXJg3J&w!Y~QY<;e_4cKI>Wipu>F!qnLjscRao$+@yp)WzqzOC2)F#|Q> znNoyj%5QAOS;4mGl;04c-!XtLMFSmu%Vz9C4)2YaHpwE!+Y+Zt(=vZfd~o4 zJL%tvM>=65gV^xaWMw}8ge1yME-RRgYJn z|3wWXZq4Udhl5iCiPy~V`|>C9)h1^CGfTxG9jODvoUo(Ef=g}!|6|A`nEXPV$Wna( z377i&Z3%0_r3zGG**L3eTBad}krq`CS7Kqkr2)pFn4M+e`=mVt{qU5Yr7SCJ^C$n}04%d(a~j7W#4bu2iNejVrIaD*Y>;9qV8Bn5mj*Mit} zr1}Bcm5vm9;pGf+JZfg}at28%5yf5mid+#{b69UFTi2}gmh64*FQtazO!~XKndD+8 z(#>R8O9{T5C4{w(N$`)VM-U1?wOej4d!GOVSvT-W^nvG*l_QB_y}Z%7C+ zK{G%^RL}uOMOh4lB?wCP1ws;%5I~S2B!MJklT26?b!b4vh)Z3nwQhB(+G@30i**CR z-P%^G)w)#c@}beX1GQ@Yzu&pJ5+QFT50B4Lt1XVSeFIF+N7`wP2uTZ3jd2<#O~aIgV4S0XZ5QR@{*vyPE1x}I&mkZ0 zqFh{&tQ-!reM?Nv!z71J&fMBXxwsMH8gOXFLHFsLJwo#pel5;N+rDO#^U-$M&kHF9 zA{m#5V4SHB7tUPQNpf=aE=(;bK*%Tmx`))Kj54Tgd3_Yq=7PD&Hh=`MR zcZh2oqd2QT$1lxp*@pUN%__{#$dr~5zTb4x&nPO$PA{C16HMQvckISG zmv^+@U!|r_Nu6TaMN`E@8jx z$5yD$ehp3*;J`fgUHX)MqYo1I(bR+#e^5~C9*dxFlA z7)^4Dks{c#V3#~@{3JzB3wFuIhp=FG1D-bSG>1eaiBYQ14{;GBMl;7k(h_tflN2Q< z*VG6SqnL4wvrHO`XR48!>YONu=drZGQu~swH4HR zqf+e$&{_T(Od3UL)?ZkU@|cp7ru~jV?)}<9zo{7wO*b0v*%+unTk?5A9u`Bfo!kk?ylD&@tUFBGHAl8>Uj@ zYtW5d3=bURMQXQ^XpsEHlx-oE+Wtivzl#xe8)#ydkV?@-;`cM~O99PaDuQ&8_;Dj0 zQ;B&T7ai*<55DhO+0J|))TnvzTnIBygQ(QXMzQ!v$qli2*C49I;-@sF_zOG~Ku;x~d6b*R14 z5Fy>pg{Ub2%KWps@nv&$qXz(&uDje9XcJ9!h*#q@hD4!ngT^-Ww9NF(-^hjO%d90q1n^p`Fj@SWrp#SFP6+q2JK}MF( z7dqS=0{z{vXUja=okzNIRfB)U8fG8vD_lWqx4MKgUL8ZCSeI}v6TEJv_71`8)@c7N zc-Q~vPS!J!Ryv&zY@G|bv7N(g^{ezULbf~vid&3>(+hW7QAkCc08UF-LB;H zCnjxtxc;5xCl2}G58q6~9>^znUDLrOg1=?>sqrpnS>sE*#61*sZq?b0=6%n`h9U0GSX)veloBJ{dd+fx$AU)PYbT=2S8+lK|OYvPE; zf)dH9?Hs}D8ZNFEyslZ}Il=2zZHHlLi==TQNASAFjWYzVTftSzZXA7rbum_RvA(KVit?VP|f*?z{RM)?9LO)wM5R?H9am?e=29 z>l#=d61;BhwnOl`29_~+eC*8H?Jl0pck-cJn56PP3N?2}*gcX>9Mk$xcQr;tV!5oP zW{;DL{N2Mo9RJ}_**3ysCQ)S&Jldr*JurB3w@A_$+nnQTh zQD5F=@&48OB0t}CtpVzRySwclX&9k~S5$Rb-3ZeEFIGF#on9H#wt&+J*3ETHb zt#<$|%64rSiJG4Msg(n5H#T%p-J`A`^`SZyT69(UMK`o)S^6@%Q)dx}aC1{lc~ea{ z`({Lry(VTGm+sL#Y}M+DCTc?KP8(WN%72`Gq3#qWQui_UkKMIU9EqiEVzx_j5?5bS zZ&y#12{WxSN!x=AO)IlK#j)3R?Ecw~?WAj|H9_`*-Pe*9sZZnUkn*~kW!<#|YE2{1 zb=LiSSxojzdt0Q!^;)p~KW@R+(lggnv)4Wvu{{u)>-JsWTlZDnMH(|$V;Z`wUe%$| ztvgL%4g3nqd3SlUyMIboJ1cXQe-%x&cBdGTSk~0nceOxx^yn&SPw4hsTG8OAHpos^ z8nlVSf~~FEvrE*Lp27p9gzvzx^?0k6G?|CieUiqFPo6Mw(&UsWY3Ui6S=o$2y*8FJZ(Obp7q5=!jy}+r z5)DlrF`LPsnwMg!@55bYDppB;5lRlHKACXECkjW<5FaiI+(jUviz%4%Io zzfJNpt=rvfnyri4wr-<%H3i^m|?`3P^CI#fB(v=}N)(*Ve(SpmrMHUcu=yl0vD9kps2`c%`< zraQx*IpzYe?(vjyY|0UeC%wtxtEHj=|(keqQKWwwbyhEM#_ zPi7geTGyshZ+!8G_anU4RZTKs55-ss>phrGK#=K;S84WFd5(&Z=FY7#{%J^Qwy*%t zV5XzAOh-pxFl}MW=$(%z_>ZscUQ%Q5|vu<(0H zETL-3%|-aQuyIYE`bA$7zYGTdGg=z`Rn0>61QI^XkO>|I9tShR41dAyH=HiZyta$$ub!*@647-mj6&z+yGbzcphK{ z;C+D0074Dg?T*8_eBcmrS*%622*VSr5cNI<50BH%56Cjs6H zNVONY0kUpLw-AtY%K172W;Uu1?~Yu>XTlAiN4Hy~=Brcce&^u-yJm{&NC zF@@t8Q#j^9;ficrsf}A~<0#*&=$dRC^QUkD8@JxZU25a5uyMEBxL?`0g$s>^$0m)R z2d#Gt=Ny|fp$@*e$0nr!Zk~V=?7-z%PLi;kOe>kgWj}KxR)Rf1`n^N3 z-b{d+HE-Kn2pjnnRvyMqSkHoB{V8gFzu(3>@96e}+oLw+5i=U>CQN;+rT@-MZ>j6a zOz$91OJ4$`^}FbV^QR+ThxaaF@<7zqw}&8s#DoWCx>~onw!Y(z-^zRVlV7|r86f^~ z6&`N~w5KO;x$qbSsenO>0{87FBs>sh#%>>mxjAumQHhilb2Ao`i?$=ts8^A_#HkCt zBh3u@C2y(7Y*DO#Q4!XSX|*x7GSK8tpk*}En{-a?g{9s>ai!kU3jo{ux5sR{mPH^I z3_S@C(-XJxKKagnp)>gTKkvw5l{)~AyF}+9Tr#Wou?LMQE<2R1QH{3 zC^MI^;WyuRP>tyj-=fnOV0}rlSN93rIj0hhb>?Ynotd!hQsyVzMOu8g5>LgYrjbeT zB^oE7RVIqh>XwPdWoCy;G#-IZEh;bBzBk~TEL`4(FGYOs!8b*GJK$qii!nZi?_}{s zZ~9@DB-ehz4-;>@N^Q2z@9i1F+LnI4n9Eq*3Sg15P9g6kRJ z8$aMVa}8}=q0(fe9cH8!zvPst&wzRsbqo~CV`~LZMcrGD?cu?7ED)TK>9!k20MU$R z0J-Qr2e{b0uLgV`_h$h90gz8ge+1+rhlMJz3GhWgF5)i%-U;{@z~2GB49Lap6+kX- zuK{v#!-5ug1Mqb~E^4>}oO=Ea_z@r$xWK;v-vx9bkM9Ha14LLL5wIQbaKMiNS(Z-$ zlK?*hEHdv)0l`BSvu^+!asMqKHw)hbo&yNpfvW-g0R9Xx8t@iCmj7-*q#1YsFcy%# zAQ@Lb<5klaZ?Fu+#Ti3D#aSZW7;5_BjAP*ASdKT2H+^wZ;~ewxMhbBB#Ti-faYl$Y z@=PC8d&0;0BHlR7^u-xe5yI5sjZ)Kx2Oe}0wL)#^DB%;1yR7YVe>$haO+#a*e(9f_ z@IXx4(_24`zVI?o8nt~e)4N;WPPj0@+u3t5K@Y*x$Kf3>%e3zw*!rYv>X$9gki(+W zqqZ!VzirX!m^cB0v*Tz)JqTBflv(+hk*{&B$7Q)Xc!*asjM@YbG;s$5o*owdJ?5Lf z5<@9+nHLtmbTIiTZi5h393k9#RQ?=cFW?H_L^Ds!LoKd9c=4kg<|Axap`QtRR8C6F zw&mFLrbESZ24E<6qmj13+!T92FtD>ZWe{ev=phzIq*__COy-{57{1SeD^S)}InN|x zVnH3^O;%(;mWN{?95q_Vf86Ux$RX+Ky7&1KEo-%hMoRVc<}WU$yNx|BZV4+ z>ILzXwe1#2(vGv^7XjRIUTMml~|aU~kd@jFv|tMEGmSB$}F zG)HjP;8%tI9KKY+-HG39@u5R$+kxkRi#0C*dB#itByBvdhjBT>-xn8{rq zYQqdZv(~AVkfV_i^wBs-9!fbH2VwOc2!YlWva)`KQAYE_ez{{@j#l+#I?PNrbh!P= z#1b(79BwS?b|T1)jfy*dq zd+ow)-h`doQaQYbVzKGpmK9xwXB>~g=MOw2Ntg1^RQvn3r(3s2Z#u(u;eghyuJtdr z>>Bk#+vnKC4=pR2-SJnoN-f2+!BF$~tJp%$#+sFgicIE~wEaP{spgM^f$NWT@9_ml$Xxm8dlV6jo!i|0 zLttc~pWL-awZ0IGB;9SZjJ7$kwMJ3d?Bce+V)~e1GECgCW$nXwPU(Lk%DR4wzi%u2 zecBd!hi-V?Ukbzkvj`zvk?b$j^G%tA&P2Jn=SVav;ZrzHAmJ`MKS5D z@EXUx{Uos3M3Rv8!>MdE{Blqstjkoj!^JQwgR zz;%GwT?bkL&jI9=6#%>d@JE1`0=5GF1n@k-p95Y9cne?~;QfF&Vv^&rO@N%jE(Y8R zco!h2F6-lTDxP>W<)bi-?k`u%jw$& z!Mg-k(41c-?kqRa^hBGGgTF8QyeE@n6K{pzj=>#m4t`EkqauV`QwjGGSKvA+Y#+fi znZ^WMuX*vK90qqyLnS2mWoTPiLN%8Nrq7->@rkl+;L!Gi7(-vN_w%+?Q0Bmi4<-HxAxor=7 z?*W7*px3w}Z(Im_Ky}_!tjsBxhC0q3_|$qK0F7bN7Hx#l3E_>^8n3C3^vP3V+eMOs zdHl9+J9DtDtnGg9W=4JTSZ@AK;cJEmqkveo+CLw6F2g?(ppTKT;Rv9S>_`L>4n= zKrp&}aC_{gTO`3tF)}l;(J8_XA$7wu{(e}^M;EpC<$308^^nu{8E~1{s^ER5zj11I zY>O8s&mL@Aya-5~TU^uuFE%WE8~6h9=0YpAXLI)invr0f2>Kzji>)0;!g|bL(gD~& z!MrD|zZ7`z9Lmf@J%wG28_!y0$abnwS&u_=QHWAAUjKFfW;L|!NLc?jaN}L7;h%_C zm*Y0P-g3yCO=rbfDYQ>!sK;n=&w1={N6PI-Gap9#;9A#QJiINeEwT=m-FP@FP3~xW z8e2oN!t5O)@;HRM#4^5zA6nG$l34@KgVoesXOG^sUiu&I`uLA75$f-)oUo>DK?rM# zA*i1e)Yk;mSK{2+#Wt@1Xrgwx@C8PDH0d^c(vleD>+<(|kQD8Gl6iEJ%h>T3NvcJ~ zZT~hCgJqVrQ>7}=En0E-@500CRCE(mVp76I-+m`MI5!3nbF|3ELu-j@4kSDQxBr8) ziQ3p<29U)&M&@RY`b2r293#Gm@XM!!7~@U+o-e)+@w;ApebBt?#K*Tn=ZNoQ_|6hv z0eq{)w-CM-@o_m@0bioQj&+9k#-mfKbmzg>B)G-!@u?*dhfT`hZK81neD#9+6?}E# zdjP)W@WmKU!B;J~qcHpxzc%=|xFs4-!lz0Ujr*^0v2rX&J*`*chI1<&*B;KVr1jvs zIV{|b-gc0=_6$e(O=00@B0SbyEXe2T2;tTd(?*0(ju@_T!?o)})Kya0+QmGR_h!J) zz3?c9wM*%rQTtMs%5qleaF007*SMXZMh!Hdf7O0-=n-rS?moG?_;HyFn{}W)0;u5O z@>)#$Jk)NkYVuX8c&i<#`jz-FBYwa|K#>)xs?PB7?3yW5nrL&&%U$u$fa0!rWqF;D zT;O0`kelH50AB=r zAMh`LuK~Uf_&2~$0AB}W-+Kd)yM;Fa`Ea)bFa~)+p9~xVh?h-rjQ$DWk+^4i% z>40AX&HzNU1d0K_1}p>I2{;dM7vN&R-GJ4A{|4md_d7stdcOy}$HYGj*n#^kfLQ4R zPXM|Ap91Uy_!qz^K$O*p21MD6zJS0P{Qz+pv495w;tHGq*dLIFE)D@K1ca%KKr!Gz zz=eQ=09ogWfM)<63V1HyVSsIbXx_jjfJXsd2Y58#t$@P;sQ_sN;BNuFfDZ!>0ek`Q z2*4Ks4+s1U;PHST0*(aii}pSda4_H~z%hVh04D;T1UMTI<~jnW1G3#40H**p1D*`n z0yq_L6(IY=j{#2wyb3TC@P0rja|&?oU_bdY;B-Ka>Segpc@BN*JcqtGqa3+YxGK{Z zXRt;TuEoZ!vvC`2++{ZIN*l*nT*bY|#$jKFFP9C^C=U{x>cOslv@zPlJ%k(P{qXr> zOCtRJu`)&%&9+wc{@b`@yNhOnz|A$l+Jm^a4Z+Q&xDsWJOMov1kN7Ix;J0+a=~KN< z0YS)Gz9D+mWTK37nk5trbOveR^{l6 zGv3Cp!o6qu#2zCWtYxZfruv&_ayTK6#mQG+>_Ef{s2k1LAKRlc*`8RN!Pf2Wwx?)e z6s_H9yK*h#5kR7tj#Di>8TVHSj%)s*xMIYl75iAQtt)Y7xy7c(S{b?S(?#Pt2$$8a zq2UZw&zpnA7v5K51E9&=)V-V#98O&K7zImTSTVSw`hhXXDG9052Vkk9O=0iFuD z05IJQ&j36f_uQqCp6OhPOFgU7r=C^mi!;3Fxe7PZ^hy5`d+l>&&=29lW)1pS-!`^a z0xo4uTI~Q?QD5WA#AUgoOb^qiWBapgq$M=F12zuIss6!GH5ahoogCJ_LVIIgK~Ct&p+!KbI147iY!H4h$W0e>#@be!E^F*32@CbZ{BZ1JiZ`t6EJ2+! zv;vU%#QG*}zz2Hu{S|%c`z!k5_)?r-i2?VO>FY`x917Y4-3C8K8mH``4ZgJsZK@6q zYlBFmEVLQIMp@TdL5-=swL`Vp4mD;w;8{o7;U<(xwF7;s9q3c09~Evl?iDWhy)vfE zp&OpTGj8<8Xs^G#EiJlr_ff0nCp;PevBAgvS#1NV4G)jB-8gn?ON%Y$t4jB595DbZ z=N3auDD@^Yb1U9fZdrS%x$q9zC{hJLZo@=Q5PX(56+d(}va&W1s zQVl%DW6g8oybjltutr@69BIzR^?i_;b71)!eN>w($9C4(1+~*T#?>((!PA93Z}QQi zra=~Aeimb$zw>0BU!+oTaWkJ19Gmp39juu@4m4COKiCx4j0R<%R{|aexC)Sy=4!y9 zfNKDU1D*vq5^ycxD8RD;`MA0suo4g(DS4L;%VmLT+@BA)0uY)v<%7|UfM??VOhDET z?>RNxhD$Bl^r=OgKDB5o+2FN&S_;3Z3Y?|YhwQhI;Ytaa)@%>X9j+H z`=X^mIxCjY2%3vS09Oz*8h2ON7^h(;#*T8aHJI1qHlK?bhdyTx`w9(DHs=l&XuwUH<|(uBrhFOPCr+~*BE1bZ^;?hZzQBTZ1S+kG-yvLsj#(JDl;7Fr5y(jnl@r3a?1h^od_eZv2j<8by!i+^4h2sIc>4KI}-!k)anBifqI?BZrEtnrq_HVH8t1{p$+l)n;&@qU!L`SSOZ{2ZhFjkBi zoixgeV-?eR!pe1|@R^8TCiU=NH+-g-i)(F^s}clOn+9#8;$TJGky^QiNh~YjpL^F| zY2`+aT_hH1LhG3u?kE?J>|~{1->^W>4vIygJ)V@F>X-6TzdB>7?wA zn)d)7~q+zbnFt=%#EgI$x4fA;j#@SnjBi&$cc{F!N zt(8BlE^1I2qzUaUBP15rVmjYNTTVx^n0ND~^% zE3quP3wM0_O)yru8H+TbvCw^ymKkikH1_w81Y@0PqDd1P>$s4#YQAe)8I1K4GZtw= zV;vt7>+a>_rUYaC#*9Up&{*7I26K4awJ+TgjP;xui!_Mkn2k@6SV%x-yyufXI!5o$ zCkhQ8&(WpDonZSuFgc%Kc)*$N8xv!$r;fBnAvDUh7{BDRS>J@nx8q+8fB*y zZ#MNPJFO8WCb*)F4#7A}Iz~8i{4$^C-##Z^PkpS=cpRyZu~SbmIggRlot#hV0_P;5 z;bDhWhbP&-0+aJe8fUJ?$}%)7^{QchJQspR$S#iSbChefgY!6>^D>k3IN=OJV{K^t zI83o|RmVP@L?P}{#1P3rW&Cxz`Wjg*@nX%izKAx>@cPS_nI?;1m^MVr+ed3ZYR9UA zY%yaly|#3sX@hutZf1H;VP;Nx>h$sW^QNVxTIPu-&X`e@laV(wmqFf)Y{+GWgpZq< zmyuUgl$|Hxj);@9Gt-M^<`iZiV2;FuAeU*Wn3-#Cki)s9Rzj2W3bS+4@^UjlKUe4> z@MY5bP=<;Y?7!FeDjFM?*Hjs)PE>VO#d0$sb%G&}t-hufe}(B?RztOiU%1(M-YR0V08M&E-IjPepOdqd4tDHWbR$=f9YZNeiH+@2dnL`*Z4%+3l zc#O*{nlY1=>dnYB>5vQSOwy)GpD`nAW`0H*=`s|Z*)HQ|~fRFIyQix|@GwjtuW zhM-a6X4B8OFj8!qNDf+d@u7~z$VlW6M60T>>_kf}(u-LSX9Q*EqoT0|FC4A%6lBdR zoSB_ph}>lsgj7!QtXx={D#)KDMMa=lU^8ZNK~Z{kT1GBnA|N9_EO=a2)~p$6*?BWl zr%wuDJ3hZ4Eh{ZAQ&QAo&C1KpNl(i`gOH_jpp47QP0!8CnTdEwApzrOX5|#*7tG3M zfYm4wUS}wy&{8|nMVvKb^%U#ptbj||{-gBzmZcmfM zz(uexz4#cMsD;s`(!R7~$z#-ZT*qVO9mus7j>}IZd!CCCa2#mP<2nh)&1@w5pxjhG zZ_<#CE)u_wfqxBjPjF3zU@T}}G|#^5bi?=!#n^~WLETPM z{Kz&^J>LTc(@sU3WGFg5SV=z(D+eEJKgd)x)^8-c(WLvd3v?X1ySqTg$L4P%(S?3oPlf25L;XNJa7ffZ$`scVFhvy{2HGn}l z!_915)v(Z1QaEPZ*rc)Jmn~FhxaB^XME~3E;@XAi-0-a^^y@rWs>3s8R;g!9;c8q^ zr&hQGKbeI^Sp_8}`M%QJ;;gjH5@0e*3Vn0)3X%~zH`y~Lrx`lCa z=!jM_zeE;FGeV|7Uw&3vfiJBf6K4F<3P7C?gL|2I;>C`y)K`*~F{e1oS5WB7%ql9* z%1A5Ca_~$?+>%+oqBKy_5FayTWiu}=dAzTrB+Hp~lYUlV0ZM06n%JD|@%6x#;&UbF?PTp-1}=_RMQXjCb0vyBAK}*MR{pOdA_2YtWr)zc?H>pIB-@rS;cgyxr>I` z!efADJr`F&nQKK=b4KHe+{zUNE%j9^YAQ0TmcqnEGxiO!1AYdg{0v{7ve5fbSTbpu znfT-Z$uNsC2rSB&BStKFe5$<;BHZ^Y(ylx|Hr{Hy4oB7zfMY6Sdo#1s_o1Y3^x3!7SHo@n+RlmIX zqpv@Cto)f9iViySoN9c;A$Z-^=G}tVZEEsa)$Mxt!IeLHq|dqY)9;F!Tlm^P@5kq) zg4b$WZ11+Uw-JQaIlx9fe) zw&i7l*KJt7EO_0f<`L)bt0^;ju* z-PYsp1h3nA{8sR~t;e)@^4D!WULknh*5iAE*KLu;;+Z#+4aiA?*KI(aFL>Q{>F))v z+lK6eGnh!WAxi|W+d2&hUbkublHhe)l0y$6f8C~OgWz@BkXH*{w`ux@;C0)RV-v_< zwNXYb1s2c1LptT zT#9>2KmLD(c}L3@LQfUC*IZ=NipFIt%IiH#YwD_+JtJ4|)mV;YBBER7B73Uc&<~cB zH}AnhMW{v(>w&M6j|f98EbQF^WGFo!TwuMSJ4LhVlAGzCU{TXh*R6a+vX_A>Rwf|# zr(l*Hk^SKTOGcGdOS@S;os{eVnn&E9qV|N%L-h#V&FZo`WKCl?8APn_{jx-8Wl6ni z?q;?uCg@AuE}F%o*FaxnBZ!fj-Zs$Joly~qA!emsgL_?Gt0UH6^LT$nQ_UW17OVF$ zvVwNsgj}SgF*Ws?w(G=%Xr%h`uY`CAX1q?eEvlXN#Vjp8!CqQL+g3d|9G6wn#%w29 z#AtQct_rn^+nqdEb8z#T=7rQU)x$Qgn^#tJwJbeuuD555>o%{F?^u?O?cuFpW#g(Y z8$VvMzqTv)$Bb^IakP&{1ozqCpTp>0*T%vA8O*Z>fxi;=W_ors_xMh`q1TL``pO}6 zDpb#>U7c+H%gy*5c>8b4!rc#LH*C^@FOae`HyPhfctT9+*+~a=W>Xhl|FXGl|AOYT zFA~;2j59%4Wmxwe-vhS{gyw8&6NS!-)=ym@u1Day@A@!g7)&Z0hafXF;emnL71;%w^l)Z-j2@jN!cI!XfVtt`M{K?N;I972`F+tK{27VgdekA08`xnhs z$`wSH)!H$mc1Kb9SAVDuO@OfQklCW<3L2%(Ie0@y!iF4(xo*Y_DFd2_=WkQWiIvK3 zoN_~y_m}v^dAdWWmj$w1J3M$>V+-|uf}>Lk9TCS^Z<&6)fe@F8*OvVy6i2ndyo}2k zpW*#XZeT^l@LG6`e7mMTb$S}%6T`G5F;C3HhqxZ{;zv1bgjZIrXs+TX(fDjs1csTk zr-3c)*hZ`vax}9t@ZV2(3MV(*P3yeSmJjWq<hL5N(@{N z2$hzBn*av`-VAsc;BNqj06qW+RhOb}6Iy@*kK%q9;NyTt0sa9H>Qw`O24sF;13U)s z9YBaYh~^1$l5VcX&5ia4uFvdhwu_H$g#xWbiBTXC4h%|T}PkO3AGl?l+dy<-9K($F}`thOW*vM5USn?5D`O<$a-(4^r=czI98&@yYuGLNU5cvh#XLi$t{(x<9W;aG(VN6k*E8cW*#wzWO>g2OME?P@jp zNJm^?58_NjupGbsrgK&%*PCcugq$PktngnAMmz7iamMZVRk&Z7zBmX?oiJ+jn6W3Fe9CmA zL}oG?(MxPQdgr!2ez*1L6AevtQLXQON7D2@qTi^Y3=eB5n{JQTs$aw#6*mH=* z@IC}6;8w=0d$(g(M+a06_mk(K1=}_r?NjQ^7i?pJnU!D@ug9I`mYW{16UQdz294F| z!c`;K;B?6KNa;jZk~~Wyg!eTkPx4t9AzaDus4nD3c=&#cd1BmJT#hl!Gh99cY2An8 z$aGy^&^Vo5YQ+L%nxEm~rogHnXao&_p;#3;8ZaC89J@JyqXBaPPXf#XoCY`pklke_ zU?CtruMErqoCOHI3Pu5-4{$c%V!%ScNDj+h_ji(Bw5_cG+CXI2Mel z+tv>LJ$a4#ENb_L7yVH*i}+>BYwd%pF925YI*+{GM3c1bz($~Y>X+x_O#SEC8Pz|r zDXxaE_RQLYg>9L{!pTBztw(8fM50B?{%>s`A!*&7^x@TH==atscIRYNUvIM`<8XGR zWT&)wf_0IaV;$_EtJ1*6a52)Vq>|6Y#kd>!5ICt;l9~AI0oAuzsno9h@F2!Pjo;n} z^*)4$G5&s!aVywfc)J^3PFC%iw@1Uv;oLsu4jKOmk8$>56rR$wA9DwXtUuu~E;PjQ zSf>5p$JnQM%YzFj@*cV2^@R1ds4Pr7kMc*Z4Py%n0 zorIe9pxzUu-bH-1(7Ul9mb`%QB6+VQ|0HT3NH4XodnI+GOl6^BuXCDhuQPR9^^YyC z)i=UtcQ~l41M~cFQ=X~YE(KMW99xsEuWUBYmT1hi<5t;mm&2#x zVoPeqT?gMRiF*Nj1@I+u!IgP0hUP^u4-)qXd@A=e4md+_4e;fOkLqJoC{@Db3hp5r z_Y!>EK*Sh-hmUgR6ER0Q z&8h3A$j&|Du(39=l;q%{AF=@Zyx?qS0q=H5xDBho0sF5I9@Ei zV2fwe;}vtwnN@;gYYVP?wcrMU?lGJSHvvyQ2|g;Oq#FD!Kr#W`Gfnc_9z@BBGs#{B z?rc1tVlPKMZzOvfC>|%{fJhFasr~*>z_~&x84)E82>jCctJP+_~zzYCB1>6Yu72w5yI{~i(?1MfHo??9I zYQWLBzXmWB5c6_?>*{rY*d2<^bDW}x&GWMWZv_4lz?%T^aAVvG_&dPc0Jj1D0`O_T zUje=fh&%@V4tO`wYLU%cETzBI6U@g8lnirFG zCtlX_Org6ExD26VpQR6`QBmuvY_vb1%2u!Dol~qy=@jGGx=JJ55~KCqHg{#%Hi^FW zT0BEiExT+86N_!*>qEC4h1AGB_*Cr0o#l=*J&7jdI!G6d3vJACqv_SR;v9>x$Aip5 z*CBfu0#PJ~G9Q46-F{7zAAEFCa`s0b!|0+6kJPMElBsYW@Z7W7)V_@A zI#`h#F%LAB>#4^G4Q3!a&A#G;qAK+|N~x4|B(Az22>P6Pb_)$pcP!4>Kmtd{eLG!(#+j2+l#8=I z`)cvcp92xjd7#kXHLJ}psCqUJVRQq8Gmq9Ps#ho!Frn%g2LT`DV%^f!{~Z>JBvsyV zO`s!9Xiwn$8Rf#ROY*g(D&rMBhwLX&u3H>AOtkZQ3Bu?SC5O)T8VoF28N+Q7e5+r% zy+r4Hn9xuk&*AXV4YoO7qY%Kbq)-eziEYodoSb7sw^gBES4G z`H+plJ%Y_=0x{f8*cj<7+;`ZRNu=QpC5V{}44>+V0Xw)q$}fMc)Zf-HJ3}x|Ri;A_ z66NC9q{~c>MYE|g5U;SLQ8?}=lw(>>KCH_ipT6tf4OnsTY-YwHjpBnBt)>g-a|G}~ zb*Jsy?)j?~2m5w27HJfp4IzBcUU-C(eO0i=lE(w{Yg~36irVJOZH%)NM*-*{Rv2fmd844RSC{VO#{dLpc@0aco6Omrr_WDR{cZo{Elh ztZ005j7#D(arHyJIUUQ3s>M7n4;D|rlhid0X!s_uX6YJHfp%H+V6NfVoN02F=a^&buBM#^i?du z6G`lVHNbIYot0IZTbLI^8PZmvy&@2^;~;HCS?rW@eP6_=<}2%6v1k=KDm^7!zdXmNY=Y zb3?@vCa7zLV_7doZHQzCNPH_Bp(2`bF9u)HbX+ti9ZaSC%xtAufW}HG?yr!c^t_yc zIkV)p+^lUgu|FWRvf8XgDGUiv^`hsDS#Mfi(VW8XcUJnASFKU4gveCjbr~XO=8D!f z+MJSN&nd{GuDi5+rT$oQ#cBo0YRw^t+J;n=Xp66EwQROne5!c+9f(mS^^FaFUxk0Q zRV&PBX0FBJa1h!_qG_{=?F3ncBd`+Ap`I~cQE4$AO;xjq;~cRrS8Z;rST6eFSlSdI zf|}w`BvBPd&1KAKN#1E$zEVk9yJ;<6`mYA7i2jiexQnRd~ zrJnIw=x zhSjkk+koMZ@n%$`$_Q3}1HGI?}g(IXd`Z}DU$%Sn0Nvc?t6O^EtOuFAz$8OqY~ z=VVE4of;w83AiL+Ju%BN96kAeTR&t-e<__b&TJF*>)|pdiIz{^wjj5B#|>STta$1R zg)IoBGL+#XKwgwd?Zut9L&y|6rxcAdD@*1FO_wA`Kf8c*io*06SsA6Fv$wgdVR6W` zxv&>WpE19Ol;!n1dw9wc!A|5W;@)xq7>cqhT9f4585@K+-Eb%V}p{O7JqKe%|v zjCb>2y5^Va6Gyj8*YNj+(CZrhvXFq=rE7G?f(U6bFR z1;6MQE2sVY-4FV`aQIsXPusj|GrpY^ysojY2uBERm#&%bYQaB0=(Omk&RYC=)4K0( zT5GB2K(`BC z*8qAD`l8#VYw}wt_z6Q64?AG$Bu;!AJtFCt};vgM-a%dUvK_W9G#yYy*%C?j}X1MZiC*EMcV!x5m{wIu6}2M%rj`5*sP z`+oIZM|_F8SuS{8)9u58*EONOCwN`c?Fo2^>2~RwP#XlVYrx$qcwGZ-B32!@OV^w_ zU+|Z|oV((Q>wj~5#@Fkoq_<{_#)nmc*EQxoE%>R|r9S@sH%~r$dS?5B%NzTifTLI} z;BJ?$QFV;qcmE@4Mia^8Q@#x`x!R1g~pCO~Kq9NyBcN;B^hVZwOx3usa5u0%(4{D*cInT=m}1%KmuD zdplNm)+vplYx!=gJBoKAsa1h4u9oH=RVP$mvASo~nKab(sD_}R>a6b6;eU_b7Mx`4 zkD{(foyAlyJD~^LcQ5L(LKUtYIMrAC)fN8N^;mUVSyRMDZft5QuUOtywKhD1oZMC7 zDyrt%pSs?w!rD-svGxIZC!e>4b}y&SsP1GkQf*>>ZP+8*qrSmO7r$3ApE#e&=QQSQ)V-<`2;4@{><(N6k6$j%8hdR()Nrg~gQ8Lgy6_0JBRK^vkR7D_v!Aramo7zlVKwGB|} zI+SV`_1n7LEvh?WTgKGRuV&opoA|R4Kc-d~Xw}$M>g})MLN+wIb^FL|fJv>ZqoZ1q zcc%95=O0tMNJW05E0L+;BZZoElgj4S8YLYs*H*OcmiS7&4fUlYLSM=ewN-+xO>^ew zLuL>qOe`wd==Tooco}8$B)?uV8@U{9DI`gR@~(=xpz@Si1%)mZzoju(DJVh2QWPY= z&E1w7JG;0Dsz@d%ooub!hi=$%ZglOcb`P|PfU$c)G3yg=yOpvRs~&3WRSsjEIfSkt zFG^s?+<{nBS0got7pnMXfg)P`ES~~9i6Tyl&j#T;5x>MIiVCX3#Fvg=zFLSeO7M#p z69`?5U%cvo4==aP&`aS{q1V}=kJ+J5z=xMFi1D(Gdlx7z8N1-Fd51PQtP`nt|)MijX!7E(w19v*!s^I0H z2!q}U_)lEUaDKgKiHiOjKD@{d2_J?}JS>%4cu6VBh@J6OIP)zc`4nr95TE5&QU$Do zafX}KWjp4XdHgxxy=1POd?BKaGeuoSFho_TNrulDAp2-B#4ZaptMpOSA_l%@L#--R zvGY;Za@2490OofP?waw@T)DqxMHSj5egJdH4+AU9{pEsS-5iD=eh4UBsV>3~07-W%AnDj=mH_@9umbP}K=2B@2v`O9KY&XCKL)G?+zklc0Wb2r z0&o;yGvGMDm4FnyUIj>@oHc;+0hw+cAk%FEWV(L9dcci<4S*EnC*Adcq+?$p9b1xh zp;Qsjr&JNp7f032B6<@~CC%cCGwy{?(f!u+#Ti>|+!HpAB6EuFZ5tOZ=x-mkZ}uQP znT(*(e64p{>kAzlIxwxp0&TP$6I82In^Dc_BDetf;-6g9y4|x)X71LrFz=7unSptK zq(haMO#PwJ7Wi79?vRKwUrW-M2UA+NM`Nya&u)vw)S6jr&AHKzsT$e20a;*AFsh&8 zPbljTS-0Sox?u}flGK(3Z8@Cb$F-$a0-OjX&I_&YMbl|Q&5r!xhl&K0xmRVpNV9r=5}j&~D%Vfk~Z{3WWmZH4_&=&3IMG1U*- z(VmVF?OEWsD57G#wT5FkYl*Agim(qa#1Ga_YOI^U6)SP}996Hoff)+TaL|W1%&BNB zEMx7<=N5svsgX_5_pAOBxVDc62lrev!&En?7!PX8h?T{0wAD~Uus9xF{WrvsdaI2I zOCxz_d*4S@bje=|7u^<|ZE5=C1FD50-e3%hTT&;~;2cKFie+u8> zxDt(<@q3*3?#Hj%=& zA3m>yz6Reh;`_{|``)Ibkg8fqN5ZF8((&-Al{5ps5h@4psT@$Hi^}O5_|)ne4VtfU z-Ga+<6twf;hEqQs*H6wdq{T-o#+ebqT@tG3Rz?W7*3S&YKQ%1;YFS^If*}fquSFR> z@LTD-n0?tlsP!`u;giDFPv)5%HUQqo>QheE&l-PKz0a|TdaO`DwJHk&F~b(ogR#7^ z(DRU!8roCe`x?p>kvyXi4+oC=5=xCr){2N1+mPNs9^waZ)$}7?)A9xglZ3CUq+o53 zqP|j5Od0S!?&$7Dc`co+(3xsG)(O|mBw#Kw@fhE-UR(xvH1IzLq@3jCfTsdtEeo)X zt^zCp#F`jr2D};&YnFtc1$Zs)HvnD_csC$s)4=n9Hv;|{@aKSU0b&%%x_CQaU*rL_ zfkOcA0pxmgFCdlI-3mAX@HRlsiT43Qfv2cCf}&1Qam4izQ)=K0z=r@g0Ajie+zj{# z;O&5003QR~3b-9`8{i)Rp9Z9=B}{;#V(B@+zNjDMInWRAkAO!2{t1vOl(4po3Z<6; zN8|n#z)66w0Tuvab_&!0z7Dt?5X)1b9`IejX2ACWe+2jeAp0cimHpF$ORdxNsdbvZ zIGRo{h6|4ML0_ElFnkP+H@28QC?d9TR3XLCID?%ul8Tqvpy=cn;0ILkLc!ut=M=t= zLQs^8dpypa{ff%p)P?U^J}4&uDd!)$$SPh?(Qw=cUju&R976=Q&X%KqK3yQ6Aqu^WazSpC-ML(gTkTpI+6&GVGLKtGE6=Ub{ zL|`}`$XT_;#E|@uLB56wRZ~G4j(O#*vIjyirmBWg(!}D5q;vs#rcK2J=3?N*lahDB zxQXK?89oYhl!**?c1=ThU8t@CUtv*JK}kuzucEH1yrH>Dk!RK{t7`VoX~MHo2qv$g z208^++bq=KsERWylM(@nPfHVU5mgY(NX^ZkF{3CWKP{pP0+s!s4g%&KY9oA=lA$GQ z8p`XDAxJRzuvCo4DkOfqSsTx#LyBtVqXt%_TAS`{;KytAYs)e~G<`FJTjRedNb z)`7x`#F{(|N-mbxG(hyKW?4<84`MCN#z_+lO_RN2k9DGR3^HdpP9L3VKgbHsf-2o^ zYd=su@4sF9L9i5^t2dArJe>#kYCq`Je$cD^;6Q3WFb8Qjv>)7$Idd=C4=9;;tJ@)Z zhljIp;dM$P4#IqC%cFN+z&u>in=*}i6z1Ne+&1MZdqNibe@S@y7-auu?A?p2@anaq zsyU-^MQ-Jaf|h#h$|^FeuyLqr#uIvo@N=k?^L|M&|Ip&f;gZD%NRW76MTVKJ;ppA} z+d{%@=;0W!`9(c04Xg?NQj)soMRqB|-6Qh3U!geycPv_FPx|HBKLa$5h@|?!) z(xnG?3SO7y$qxzkJj?rPpV#dvx?Y z-yVz1ydrpAn)f(7d%9h^G;gWkb!pyP1+PoXx|CoP z_TFySNy9FjGI7)9-A5Gu0h zaLWX*OW|H4cwGwjEy3$je?N?Lt}YEY1`qa;q;}5`ye_qSgWz?k-RA|bOYOSxjOKRf zQoCh>*QIu^7Q8OCtE6*vDZYc_$p4YN+;i^soOIE}&yVka#dAAwaKBjax^(WXg4d;U zcL`pX&Ycxc{*}8I|6<9__bq$+n^`GqKRf?8oY4wim(Kl6@Va#FsW_-~yL_7TY>nV` zDcOevuS>(W3tpFoop3Pu>r%cx!Ru1-7YSaM{(VUBy7ccyg4d;Lr=qSSN&hYrye^G= zx!`rF{zn9_OX>fQ;B~3p1iYqkyL74DQo-v|yVnR_m)iYU@b9~B+4WgR|GTan_ekXp zmwoUtR1#yu8cAxmd(yeORR2V5$|6ba&KJBcoqLhsb?Mv(1+Poz#^Y5~B(Rx^(WFg4d;Uzr^~ul<%r~>T|-N6mBPn^r2sqst?F} zDsd&S+qHx#D%Ml!QZ%ktw0F`83+ru#pet*dTgvM^&Hk3knnq8`!j%;ZBYl0^E84sF zIzsPSR$0@{?rKW_97xgLo*G9@w!m(8I9f&Bt7L8H6tov9mJneQ^L517iq2j^hO++u zQVjP$P_(v7D?;~0K_X3TToS7Mt0;WloxU82WleoOxOJ&4cnR25(z@#M<}Qm(E76kf z6v!H!ODh`ul*Q^&F?t1d_ou2?mRD9S?Xo14Lu#TsiAL(My|TETrO<-j>>0T_r8}D= z%prI!-h(p;g**Mtl|9JujK(f^FeTR7Q+*3{voE5mKcMt!=oVlfq>A@R|46q*kbAHJ z_9z4!S`DV4a+hZPeG%FgeKB3)DhgXVq3jjd?auUMPVXt*oKCDAfi1Axot|kiInYwL zp}l#}nr8N0Vz*ZeS3fPVTDDgVx4YYi11E<2-zrx714-5D0;gue(83Qv6gS0h`dfmW z#SsNLkFG7L#;L3ULC(zt2k+pW5|K>avS3@dG$(|2Mne{5WUT?I%(<2|c@N}zUa)SW zAzitd?^_pa8;oBZT;uCienpHUe#j+^wsHJw7_S?EV;1nj1HKmg;?)X#crmC+SDXhN z9lz(N8w(HPk(Md0$3S%QVdj(bZwVzr4QV3{Z#!Bp#rfSYB& zz%t-$K(;w}1Wo`f0n7v}1PX8tz&D3jp~Y_(DL|8R?l0Ufgve zrAOHYhQ=FBrZ3J|YvY(HhQ^68JVi%I4}}Yt$g{tY+RPe~!GP`_i*E0xNLTc13L7&! zW>~%#(qsKMJkt`Lyk-72koAXX7=TCp*k*bmm*s!6E!u0z(M8J$nZGRtocQg2qDUMa zCcZrUG6^Mb6*?Ncz*~-=wKA7%TRM&gmWnv`#s_hQ%la@5X{vDjD#$GOMY5wyl1~JO zE*U1=qxDGkIF`VY8Sr(iI2w_|%@&LetYqij6mL%sYD>^N-#kt^&P-_XrCd z2Z)&@Fb=Q=Fd48Ba3bJxK=$f7K=!(Nz{P+KfUFDBF~^*-lzCwKlzCwK;*4+2P_zf~ zpm40ANU|eEpxEOhzz<>`n4e{bI$d_;JP@$5OCOBBSeI8|`Cuv)Esodq;`SyxqNpr6 z14=@KVotOWhD9?a1k<^MN7f(DxzRw^P>wSQU0+)h?mB56Y5~m=Vvw?* z(C~9_#-|I)Verczx}Y4!r3!&x<~f2Ch{HHuET|&MPe8`Yloc=sn9nrNqD(?k3L#S@ z5b)uDh**O~X9_}?HXPGuq~_;j6=oJ@W=E8AP>BSk9JKMR?BIyp0%Z^&Nsv6wAvCa8 zNrK5!CPSbAj*vDcu{9 z?$OxaJa&qrEM?lyxaC6!c)t~1Gm+EgL2e^`HL zD2`>W3Xj1vwrh47sop^35;pz!T4l7#(7D)wJaTs)+$)vPE0xeIm2e=X5@d+(lS~5V zv0i(O|9{wHoMpFiuOc_BQ$NP4Y(IPL zCl10>VXyr}pNz0x`-w6rdhI9XrWNCiScwJtd^B`0X##8(Qub;frVg>gO7px_y5p}G zAvVf370nUZrlAPox7wBo$)fDytgN)mOjyy(E))So&ObC?i<3{V{l9HLkwSd7J=1X8 z#UW;XL#+%S7$L3@1ELP2#7ymf+a6=D#8=NseCZM?H5jCkB*7jMye^UQk>GWSl*4f* z5=rtTOYpixS)1T>iL%Xt|JTW%UVPuB#|+#&YxIzYkB-GL;(LPECCU!PL1HAkbD4tI zCC#o7ye?^`>@@0@30Sl4e^3uS=S>3tqPac`A-5-7eh@kCC%;@ye?_>h2V8bvlP4rh-4q~Ou_4t zW{(M8mo)oS@VcZ~I?fK=E?v^>e8KCIX0Hiemoz&GuNfjqn(_66+oemIy(oBH(#&%( z>2*o7nS$3P&8`!?E@}1$!RwM{gYml7?b0QEn5_?Ew2{a)fl>Co0D zcwG`~1fEi07x(c+Tinae`st4ji7Fj>-_@5wdQ0%HK6m!4hrhk{o|Hcu7nh9oJ&m`F zg4ZR%;_xi(c14y1JCm=^y7L)Uq_2PRg{Enbv6EMBq2E;XN`gfckXqGiyXM&}4!yE& zoe0?X+MVpN2bx}4w}yqLq{^6x_I0~1jAeb-=ALP8_e~#D37E zl{LokKU5i$wKCdC<5TL%%vzY#XN=Cz(1eMZZGwt{HO_EPl5hUoTDZQ0R~_37K1(${~qE$t(m zV9qf+I$`~4e9QfmeCgdb*fiakW82q?1yM}G`tOjnDb@WG*3<4wa!2bnSL?s~BwW-2 zAsJ+$h&IA9%R2sAeK+W;S&pKOncmTo3IzYEOWJmbzxp0$_yo|T3chu_cf%*ROH5e* z6eu=qNm&0FAOxH|v&%Ntc}I5q6*5eVlRM@XqiQBt#enI?g!St|2=iS-Xu50U9Ls_f z4Sdy8=x~Tg41&|>602Td$I?F=+0Jjvj-C3H{~(K9bX#_R3Rbngy}R}4*o})~rQQc` z%yQBsD(hZA+<5>iPiU67|3W*sESgJ0Rmg95&803 z*^1uqi9ZqP4=Gk=y3{YExsX-ZxI`GNb`>e9MoYG_KkaZqzHve8_R%7{H4N+%jgk1J zgkz#ngkPFdNTfA8)3*XX3Mjy46@CvF-xc^(a$hgNNAZIgvEPK3CZKx{zj&y2^#vbo`lz@M+P-IP-y62?3;6Id?*FlO zC4f;C=l?AUAtcc(7!?&YKu{EckZ|KcNCF9jBqSjL4J;uEBq5i{hC>k-msla-RqN5J z^{QI$tCY632BYBBdR1$+TIKJ7q89IHRsO%-H=ztHH@Es1HN^gWumg}9ev@v+ii?t$qu++t}mpV2nqs&*6uVlmEgRFDlUmYK&+1>T$l zk8+};#h01F(PXBUV`ZBThXfhF3Z`t*a8)#7iv`KrB@IoZaoH3_&L>JiT`StAZdsDo z-N)`E+m21gXIYX0*0qli%IqyulhyULXe_b){%Z2;Xg8~&MK?c5Gg-8)cF=lK%&XJ8cS@-M&`;M2fEfzJSs0X_#j4){Efed4dcNx&C@Z0COi#-aRBcnHC) zjYTf(aj{0c>5DOFMUO|s8oiJPeKE$trZ3j$?~~E8o{C2sU@BfP+t&O{u$j%7H7V0E z=C&!RACzDk8h|YUTatvez0@|{nGXxTYMz6w$H}j@?TTMJ9m!ArEPm~2z_#4DwzR6r zk76Q9j$eBlQp5l+)+WivoidwtCkqQ^m%!p=CoN9ycC^fs7`-qXI@`X%@IFONPw)-E z)Q_nv!EbkQpfz{InR7>?Hh1{uhXEa}yU#tUiYBD0cxo`k$VTIzi;(&1jo#g`d3hb= zsUM(hNuQ_1MY<`r_--C{+p;6qVQOwG zj$1!9Iw|t=myT-pz8>Xm-`)C3Tc`U-PTMs`iFFc@`Gr!k-bb9MuQ9E!AO@yG#IR=d zz!9F z-d&Yq6~I@^wDfGAUBbIV8Hc81t58$CD^ORWOB@H|e1TwzQ}uWHx?V8M`&beI%_d;x zAB<=xVoLz;-!M)PAI2wh7QF$!Sdra<-+1xywnfPv@yXtRPtDZ-f{$Zif>`T4UVO9z zcAWTVB~!(tO)vJE1mkS@hKlc}KG`)s*#q!#I!h3Hc!!8@D`YAajw+m65{ysa>nA>r zC_}`@F+`P_T}&M@4?a~sTJBS_b9}Oke6s6&GE5fQ9Rg{TEIl{6;5&pHg2FGy3?F!h zaBWcd?w~t_t8Kyq?+|`&6CQYnK>qfGpgRPXnP+|{@CH_?a(-ql2QwEfIS(}YJFPQg zB&Qh_fMbJh6@sYr`*WwjX`ffqV%>9}<)DTR%f+;J1l$I|d?uspf~W=2c&EU-fKSbR zbr-;c-Z$?8c!n^7#`_J@^?mmn6ws74Q{hoac49x?_0rvhy0X@gxES?nIo2od1V%xy z)|BtWjKn(r1UL-%DR2VtbKnf%zk#K|uYoIpcuexF27U{?0EjN`Sr1GDUIv^BB=b5Q zcr!2qct3C&@V7u%XYf1>%mO|Mgw;&X^T3(FzX79wuK+QKdr$@=8i+E`F0=<>2CQ*< zoIu#0^w2gRhGY-&Fb)M~0|x-vmW~820v-#j0ww~_1LA(kvmQ7YcoXnAAQy%>9@q}V zxaxTscmi-IFd5hnb%wk=1A*g!LxHCP#{f?QrU5Y=dKLmxft5hk3oR3VfqJ?P*a>7i z=6UiCU@*^7o?4{QlT-1e_G#YEquZG zm-FpxtdhZTzs5A+j6oH1TK|o4{-?9lc8;`|Ku*Fz!!{-)aRwij55X`_MB26KITF3h!TF#^09}ADdl<$J23OiUD#E`v}`x*v14640Vt( zPBpe${fTuQ7_>nFku8S`JAk9W-aRe^TA~kFeq*jxMj+3V9X1-6W6EDcL*lu=4#X&9 zya7xBZU>$U{6F9n;M>3qAnMP2Rpx7Zi7Cx+y;FyV#Hp_PC_G7GF}C{kQlm*$X_AXH$+cZ1`qCbUo8d<-y}3x{ zM%lm9l=cRyvv|Xl_|No1O(K;kQmZ!j$fBGj!SEX(v02C?V0DHl#Efuok~#*y`#*KR zqhGH+66ZQpZeKH9|1u&Ns>MYaR_>e_l(QuBGzlk%u5ngs5mg#9x#1B~ zi?gMRB(P<&KSwy&yIJD{ww=69KU1Dxgu{b07>6#}=X=IXIohz!>-DaA1uT!kvBGY7 zluvPlT9QOww%FT@4YL1g8Cp#p8*0rI|Jo{rxN|XW)B2ZM*@N|2MiS$z&DCeY9IUxk zOVAoDSyOUn8NN^X`AOO6FBFT?VwV70&v%O)0XvF6N}35kB^TXSZ-Uq+wb zdTlaZ>eF$}nLfrlSaaqEjJf@#J=(81!?~l2vsrV-GYIobP`oKNYtFP|EVz4cm(*<6 zYDvO)&@dFQrG}}v>@jw0zuba6A2s7xsoJgm!hCB_#4As8e(|Lj(64wr=hp>h94kGZ z2P%vc3vXZcVeOX|_u>gZ_O)NEa|pe-3%=s=Ls2&F9x_6GDo-3St0-|q-U@7pnzsl) z8J11!qO1b2O$#B(D9m$}Wal!qlGMZz)0>m=GY#9y#1ZukwGB%e0uC#jSD2eNE7Lk4 zLk@K1WTxf1(sDCEuTRTG>>O8SZbr6vF#;923NzE^6lA(`^IRF3`30HjX+@atl zg|l4wX^2^pS0IJ5ikY33n&K)f%nU5L8Glw@F3!$(LZ)>3w3IqX3$wy&zl7I*Igo3= zNEhAbwOX*p+4Py|$(OrdQrz>h3%B$-aHz1tv3XLp0{qRoC&Qc_vFd^6ZyZBlNxz69k zyGY1&{%#sFu;cGuDsr8_`=-cs{%#6x>zodqzrI4`I zefi6W7o7duD!g07ZK%_s^L=NFeBFe9e);!pCww@ler?4`zpQ)2FwPOV&O7Jp2&Y5m zo%co;a5{9pZ?VXA{_bj#>-^mgk?Z{3Xx!&I9Xfya43X>n-Md7t^LIZHxz67mkGA4; z==|LkBG-AkSBqTd={_xTou~V?$aS7>F5Vj0@pP{jxz5vlTjV-VcLJWz0=XI{y{!hGG!+S?N z3(KV<*DWmHEppw$a<7A!j&5POK;*iGWsk^p3(L=nT(_`%1U`g-w|&Uzk=xE*_)+7U zZ?A8<@v3w2^-|wNuJMgEz4>|0Mp+~4=2s`6hwaN)gZo1^gl(CN_Ey;vx6 zeSM32M6R!I@w&+M^(~SxO53e(Q6zGGU5Z;ouCGg>c=r0b6p8p;>2&DpQp^(hy)QVA zuDz}7ly>i`;@gTom;-GQk?ZSEJS1{`{fSR7{-^WZLQioA!d9yON32wJr@>h2ZQ<%xAX{UtZ+ZipAq84X}%~SMhs*-^^#8{WKXQN$|UPcP?pn_(SS*l~gmo zS#{5*qt%w0-4!s*xBrQBza$~5Ak6ex>`t^XTx?yq>IPi25Zxrq-uWM3@1W;O8|cok zV>P1673GcY{p|eZO>Wb)=l+zW2U*wMDTdu3WZsK)m;7ayt4RPy$xTz_=J8~h>_tZeJ zk82|ZF8R|_Md0Yc`EIXH-dtW_SvN;7tJce@9t*x?|tLgEpJ45Uq3DOu{B?MaA5p-;~-{Q zuFdfH658eY>h+d+-p+{l4d<(blG;y3BGl_&U(yR{PI@N3l`5U_o2EPBH)D8$gfLQtQ1eMzKQ3o+P>-xMXeZ)E|zZ$xZ) zz5kXs2E;xl<+KVJqJ)Vk;XTM)l@OmCd?ozW^VQe!t@lX@qt1zPc^})2>l{!~7qQH~ z%dv)g)1{(XR#@e0sb4?6H|wsY(yF)ZD4}D^_5o6F$C#y(lB3vrS7sx!Ioh@PYbfq7 zpyfie9=sNoa=SKvBU0C9kYW(Z8vhJi1vbl3Es2h5ymas5Jt`gJQg**>I71bu><-&- zv^BVouz9fsvox(dAHuQMBr&GAIYrYZP#3LSw5%;DQ6(o59747O3-C2wHPg-@_Zh>D zjfOF~&!P`Tq-ABbhA2XR3_+qr+5(FJfQV)cdrW^G9$28Mz=n9 z?i(00I!<9@ZXV+Os@JMrh?CIv%$E0}Jll`;Jkg$XTAb&Ceix)UWcWu+44BQS-mfB7 zZAHu^#*Fi9kM}(B`UU;W!%p*Vad@8a_>YW0<~%adXwL9{6}f5yjvUL#{XN_Jc%Im$ zjzlu2;jjy4J8*ocq|kdLDU2`kykB8dJ_UmalAFc@26(ndc%JA~$sz5o$?aA8y_vrE ztEl)5Z(?{t!X-@j7|(W`(bpLU^^d}~RS7VFK;KhVZhc;#nUWuq)yTOapEg8IU2nMf~N;P~bGpg(?mSZ_MfSru( zeN%oH8Zg7}266zq2Z-;dLNz`N_yG3FTlfudAaE0K5by)wVBo#L6M>lKJR?l`NZ@Ad zj|Kh?I05*3;3OahA>oHS2+YR*AAuM&h2mTSWV&;KTYwn+jE8}XfE~aJ;3L2);G@76 z;8vg)h{4RW0r)uZ5+KvL6!;_%o!)o~$WHlZAnz6a0=xnEG!W-5)aiEMv)D(NP^kX~ z#Na5DZ>IMu_Fn|P2}GFZ9pFnqgc*Ma^7_9F{1*5MkUWHc026^Y)-w|L8gM-Dbsz^& zrh5u-J8%l{|A5ng$ip)O_!h7P_%@In0p#f+GhhdBJ@8%NmB9Ca*8|@NvYjzqHi~#` zif2Qg;@Qv_V?1Vt#Q2Z`8d&?UzKbaBUm7~krhpq97G)f_D0*z@elw-D*wj5txaW^}&t1+*f{Gq6oC<8Ysj*8`WH zNpoo02M$1GeM{YsodaN1Eh={N1B1!89O?~+?kaz*7Oz3 z${0N^+1yFXEHr(^`F?*%R(3&7eqLUV88$sDtuV{fI=6`1-$l0-`JkvwrkIhxVn^hx`uFkhTrnpTuEYg&3~c5ZskoQ%xD-A!hHkI%0y zb1!aasw>QxS!%v^>t0!yz_OH)$pNVpr6-P*ke(VT&R_miMBpYF2g?Y2}0Q+WUpZRecatw-5t?CuPV$lc=`p`j5pDd!aM_IC#*f1?I+AL z2=ffWJcF}`JT`LrIVHxBOgwjE0(3g;c?Rc@quHHr<912`VV*&lXVB2xuxAzH9}~~O zd_D~E=2>3f__UhBJOfKTdXIKW!aRfSs9F9mSriHL46KgyUu-2L%ri*rVzSg{-K~f3 z#lk#;{ktU#^9&|*XTE|;boU8>c8?Zeof`I8FUX4Yu8uZZj<1=cBBj+d`pti&wl9DJaCGWZ){!09h4$|`eZTlSvxCM@YCDu$ z<1fgGjP$lUwtN{4o<-9KsgJ{+$BKl)^`()~ZN^m+r*$H*qJBO zeiYk>N8m>}S^G8}MwoH_9X*Z!L3E$aU78?OerayxSmSeegVLKe#Bc^bgp;T#S0io$;vi=142#Kb3Sk$a6RyJ;07R$@%$8sYw2N~kwb75 zunc$|a1roUUS&uCx#laj^p+zY!mrWR531+q_AhQbGrINjmiPs!?Jg*K$GG2t0=%mu_3_r{ zR`)NA-!$;xEw4wT)yH;BeqzzsJAs;KDmc-KZR;?xjVeC$H*70|+fk*>a>UK-97u;M~CgwdK+Z9RpQ7*W-g3+Q8 zS^}CbzSDMXqCUC`FQes{7n>jlfSXKVEiNg&XilDkfoMJ+cK0SAi;w0d+TL#9vDjY$ zWHHYIvQAb3M*+_PrT}?-DzF7O0k{l!vME0WNV-P`a19X6SZE(;uEtvIvkrJXPiz3T zKGYc(Un~u1i7&>8L+fB@EIy%FGFlsqYkj4-q~+k6m>mc-V6Uld*UnyTpP=y^Ty-fV zRTS4u+BqMjJ7?SUxG!K4X(;-(;cbs8fi*_!FpTMOS9!PhiFkNRX9NaYZ+qm#sB?1K za-*xRwvzGLn}9vTmXTH0T5^~ZTF+d3Mg}K;;_hpiGm3Pf5uee4IRRsJL5Z1P^tvcl z+tvkVbg=fJLW|*bD1OzDn+e}wk>NU-GF%a3kjPMHri|yOhUQ4`RxLo+pTBe9`QsAVtC3O^K$CR#$(aQ=InaECcGGo4K~;emZ&1HvZ<4c#mg zkL8eaRT6%b!#c$72IvIlj)o$hHGqFdZwO&oXFbO6MfK1*QDiR}&Z}j_{up^ZW90~B zS=d(shwF7{o2;9SK-Tt!K!#rg0sb6V z3j77I9Ej%SLBA5}(P|)?l?>Cj0I$LRtw3yI6z+E5ZP>p9cs=lL;7!1XfWHE=4jCQ? zJQ|zoOZ2I}L|+Vzz!-@l`?u+fF}O~;ibuNzDjrFzimlof-&PWxZyNn-+r_(_&s&bJ zx)+C6VKZu~YtHmHf41z7HRsA5Ov^zv4y!9fw{3MT=s=S)4Q3q&pK9@=;ZrSn27D)A z^S9p$>{$*|pE#?1vi(Lu5{ZrDX}*MZz4dTNsEWsFl`imjYwsh-&%qYlKA9);;JEdR zB>X5B)H2yvr{-$y)5-|PV6?W3yqGP}YLI6847i0@Xl6oS{%n)%Be)e1cPFkfJ@)_; zfw&N281Vt%$=JszAO;fe15U&K{lM8khVwia&Nea(o0`(;Q*<@@Vq`c_G7{I6jJ0gX z3Ymo%A->IhkE{?f5xTlSEMfEJe6#zDPb>Fk`+FQ6{pQ7VVu3OWWxIZy3@YA6qg<+ zX)#a=DeZ$T!a){CijfoFl%juNt;u?2Ll zJmF{hS#WfUa4bX`R{g~Id?U=1V+<>=j4pZMP=jPxCC z3S1xoxnvc!(6&itWlzt_OwY5oO~Oy=e%mCbc@t%c#D!eSTbiofD_!Lc4NI#ljVXbm zs><@EX26s&dI@>YijmN6@}_uEeaa%}E2|SzYPHJ3iI^BkO&K#`obQaVpi(W?cb4R+ z$h@f9-Q4v^uD%gqFU5bOU=GL35zl;xvZTyi4R(_hp&DhVH^88ppsa}~7S(q%s3zd` z2c4fmH91AiR=l#^Wl&Wl?Hz;aDdcg+aWD+lm*9P8JPLG^nCCL`W^W?c4pyL>rRO&X4kH$8CdCw7b{jzhJG^Mo0Xqk>&}wP^p& zk$Bb^g$Qt=(knyQU5FE(EYW0?u}iNJ>CHi$M@Or8zVvJuR9~2JR7{*lR|eIi7$=eq zM?VJdkrPtpg3TS*;zr?6T@ra%KO>RDAaDAQ->QCRRhKs@Wu0LKCnV-IV#Ueov!G+2 znBGv=SY2D$WRx$j2$73XUTbuRY%(=Fx3s)=WaivVqa3z+Moeqi>$3<=lM1t_!j@FR zEUF2mAang^SXAavvrjxK^@?f`#=;*KlZu3qC!Ad8pbU2#pd0mrU}b-@RX_vGEXvAL zrZn6fft#A@8%$Ft4jcnh8@RC$78D-|=H%q%PUmKjghSd*PCmm)L17jyn4L(Ui3d)V z0Txtt)m6Hy8Y-A=Pnl(5I&CPvd83s%*Oif0l!l2wnF_J2wUBgFjr##!%7(?RWeqU4 z%X0FWIc&it9q-`cF~$rc=nb%OW~t2ixZPNo#@fLVhnGb;womThJ~$XqcvoT;I+`I7oRh+PAaFMEkv zW!zP{!c|e`E@M9=Q;QdQT6T`A#X$ZS`Hsa2W<_TgWzLf5jkqjf3p03K-cuH4I_^t) z{hH6OzqaGb+63qI&y2x~YrIvlvoKRAa^1qrxgyss%seb|-NH;C4AyoQX6A}qw=m-o zxo%;G_v=oFZeb<{^PZiBnfW5uEzH~_a^1qrXCl`v%uK}F2|EijXNg?5FmtWQbqh1k zid?ra^R38r3p4q6rn0jzbEC+03o|=Ju3MOygl9cF3p4np4Y_V%=3$ZR%&%xXtJ+zZ znIUrB!pub?*DcI!7rAa>CKYdR>@3Wz6}fI<=0%a~7G{$0mdDP*OpC~M3p0<2T(>ZD z5Z>w7S(sTMa^1qry&~5w%tRiYY8gKXQEX*ttxo%w)W-w+PI}0;;BG)a<{8Z$+g_$iPw`YFEV&V!jzv_H%L2Rrd*eaqnR+g*9 z2%5X8?PZrL^ktV-QrE1f)V~*%;q_y4MGvNUWu#K5L6F|c@W)hp-Eikj97(gMWgE04NkA{lEHfHwFe8M(n8k>56 zC=lj;g}Gn$Q<>eE?OxW3t-j zb$83LHKii0Nvm-O=wdIJ5Bh=kk?4+%8A%EGbJnd&8puSD^swTRIg$~MpS;z5%0}u` z8m;ZChey0Ld{^@LlBdk$-^~?U4P>=fejb;ho(CwA@qh zL}TOebRQx^d`uLjP9Fb9Y=PmK2<#)F>KH1c28Q2-@F%vQBFP?^W7Idbc;?o%Vjy0qU=HC&aw(ogQIbT>@)Uc zB#S#CluucONJN#bkkC&-Tch4Y6Erm$+KGLJHX?Llzhlg7m>&1b1NN1M`p1xvqGLIp z!!B%mk$s0LEHadW`8?oY$W8~21D*k#1Ox#>%stEp&cS{o5OIZ@wggy#{bj&Ppa%$< zXDx6k@O)q`@aMpK;B`Q>8_(@PrgJy23iw+f!+G5q&N^mz91tIXaP40*eX%spAhHv3&=MYf;`>NwE zf{zuOKyH`my9_>dyaa=nM)_C~pJBTRo8_osN;!|GW5m__X!ZHJJ90eO7d%rni_L<%)wk&lr(U5v1;+fZJlPzPi)%; zHWIFZF$f#fd+?hmKDKf-Sq*_tweLyrDTdt)_*k0>Be{VOY|w;5`D_dmXbvyLnTu!p=%2oSaY@%x~5On794mW8xaRi)rd}kPc>j{8WPJ9+>kK*NJBac$cA(_a0GA_Fd29ra5Qi=Fb#Mva5m6`e>TQ7z=c4@ zW1aHasD?zJYDn}!0}fT7WTYM|8Ef5+0GERpAwE!kj|4apNxHf~l2ZhNA{?NAwo4#!%vBN10ozp znBiwGJM2A9^U7i15XU%sM|a~y7>%uA#i%I#O#2`t!olR3BAuV^hPES4(cS31L<#UK zWp-Dt;B-jG93mVG@XHj}rrr2EJulW}goAVzD=$9*?mC3g`3Z1$Dgl0(7u|2=mp_!a zr~zGHxm*dYI9s~J3B2wx2#Ii%;g==!&bsGKy@b3qi*S%2W0lZPZu>LB=oGnaZ-{IE zL~OK-n;eNp&jT8_QMhZmLzXX4hh{Z>-1x!``Sd6Ou;@4@~{|cw^%Ngz%0| zP98T7ve9G5ruZ#y9c;Y4<+b9Uj`y!CVaFTGu-d&;J!{`-aR#NMQk;nHK0PSj6dTK1 z>k(%O#;=ctsl;%nY0I~|10%%mFke)1JcVO(3B?<`-HamRInxC&0(9IaK7+VI$_}e(n!*Q^(OYbtI_Z;FZPLXK-^9V|>0>O76 zj*~ZAa6DhT^w=$m5ohZdi6&jdj@MR>;7-IjW2}l7D!o-m?|Q^J8f}1%T~5-o;i2W3 zaU>$+b(@D)ky8C%z(ez&MVN<{mYM<^R+)kJufTSNX)afohZg3c{ReqyW+&|i53L1b zVVH;Z1K^>BIcK06r4{5CybGdwC8~b)Q}|7q8BL_}sRI=99A1@yG0})psS1+Hm1h zDRGxQx#M89^pMlB^{sE$c+2Y-{p`*&znNH8x=CIJgClXnGh?DMpZoOwRfBtd`q*># z;c1<%2#sq7K!9+h3=nqI2Obi*CGs$zxy5ny_luPw;qh zsmQOGG%kDR9ewA_s4sYU)3cx9_05|i-*oZ&o{F}}+n%_+_q$0?y+0IR((qW*bKJJu zix&Rw`47|1yZkRhU-KqiRry`qw$ooS>Yk5#Xi4_9hhI55@5?LjWR2$=r$gtw-7RvR z^Y*dGNB&~sia*?U^!X+4jrjSEv;THFD2tIyN9V#_Aab31_GgjnoVWg%OPvm#BR5Ip z>9ek!HtMu~PrN^VYucs>_u)P3Mv?2Bx7S6kbLWPltvDSz=dD`gldqZb@V8%WePVvb z&fhI<=#9t9+eEH&-u@zTo%80v^OMt|bKXXZT<5%bME-2fA0C-_eB0};skbiQ_Chc;8NId3&0f9An&O3R!N{$kfHM&Ui5t~m!wjEG$4ynQTko%1#UuYK$| zZ)b^I=e#{6a-H+mA1`p64xRH>F7p1@ACoy7fM1JQtH-7NKB@3q<(d&c_8)N7G3Lo7>u5;cxMXqz+PQmL`JI>pMBG)-@Z-`vy zyp1`C>FAudwIbI!Z}*8@=e$K=%yK$(&f83pKXu6Ik=xE*_)+7UZ?A8<@hXfnSBqTd zyuBrIo%0qS&-8W9Tbam*PMY5|X45TkN50yz^sY}v;_Jz!BG)-@irc1h-ugS4zRr15 z+_nd9-qO0_j*5T1R-3VMdi170;3J>J*Ew&07rD-PJ04|nI&{ukfym#!YV>=_NB-+& zSN2h7&P}OD+dNm~I_IrJ(PhZ6WIM2g;E{ zmDE-*>SmL%>Q$Bn+Rrq?9Jw$@uG>?AuOY4|ZzLmSe}=2_CN~C&{T^z{YWK4oVf$!3 zL4Uw4S4(q`@{YnBxiCjA%#qtqi&SBbT#xW|QH}L`&A@DEtgLTtu3fgD^HMqal1L-O zJv64`fTz0#Waz>H-OMw@y>xx0d->8HOft-o`|)w)#+uZ%14zbG1hR3a-7-Ie%$GG@ zt!<{N(hh7!VR7o`>)c6ksjtZH zVcH2{StSuK7FgkNt?lQ;w0;o3whnQ?QHhJ#%5<7}#4b5zWn|ln!=EnzS1p_T zi;_;}?y!h|=YuD6k`xStwYBXylcbeL%Kp&Zc)5BC=mtj1Y7rpgB&0WB_|p-8zt!PB z!iz#W;@6D<)2Zsuh*rh3syTaS1|lW2J`USJ$?j5c=;lsbl{BoS!27PF_3?EGioeK# zL%@}DuK71S=f6RJYrd~Oc~+CZTDD;Lw-NtdgOrfePaedv zW=-A;FLTMa2zRtGcUJ4}WkYsGfX>sF8Hs|TD!2Mf5TPnp*F@|Z-U&JnO3(Ay8ObCz zMjku4qp1!j^-}yr>EG_&{cakvtGa`w#b#7ph@W?}C}XbgN}b%o0BmRu?~Y*5{{;vJ zQt+N7P{&78Mn%teKSdT*pVRjqe5m*w*ScZz7qoRqJHp2uQ_r2++J|9FFpkGB_oBdt zQ$&>nBON}xFh*z-e(}m0zDx0o>k8jL@Qc^*@V$>;yzqzb8~myx2IFd|^eTNmHYt2m zMm!IE_+$Yeja#UcUxiPlJOE!2)v@DzJ}Olz*<7CwAK5h85)~`i(W0@@9fJ(p-xh-W4F9LvnS z&j+3_eOrP=Pk`?oVRFGwI%MLOQ_0F64h>;wiL@mccd+c*tVITmi;!Pzzh}^1_))xE z_8!At8r3I+@bnb++(@~yp&9zkQ9@~&fJ`jMGVj7p2DXz-`6Z_QK0feySS_R`B>>SM z#VFI&z(Lr@I469=Yk{X?AG-XWsle;8pAWndI1hLea3Sz!;2Pjvwh5`QqJQ4UTa0>8wU^?)xz&zj=z(Sw{=i>rmMDm;ki~+6(#sV({@_hMa{T0Oj zIq)CAYk{u;e*@eO+y;Cb_zdtJAiucp0PX;O1bh$pG4Mkm<9!Xpxp^XRExrOC1l$em z54;072zV#(IN-g&;lTTV$v_M=9`Xxr1*QQ}XP#NWH-QB}3^SfGAnMSw7>FUpvlRF` zun~xX#?u1i`JV-h!uffDeSmD!JYTkNd<2C;?@OjHkl%R-O3xUv1`WcfxNi7(M69vG z^y&5seQ)Lc1Z@tw#U+@WU>eKfL8pF>s>5IoYjZLmt~v^_65C25^AXRPKYLwK(g5xOI-+p+;n)(4LHK2{5{%jSjTK)ce%Y`puvu;)Jki*!KFWcJ ze#Yf6Hw#;ExHS+l9tV@)aBCn!12CS(7ED}T2pNwp#dcm2ev}iX7gm);ePp_p3-IGo z1&tx`7$sQXmB)bUNPdIGg>)lzq$r~bFPAyUa8zLdeur^HQ6tG~R-=kVl>8bI6sviv zSq3KNW3A0Kg@lFJc41=~bFk5sppmiu=L3fV7XXuii-0qM6~H`TC6I&2Vj$~d36Lcn zh)t1;=u_k(`eN9*?2TP6>qZXi!t(jvLc_XOZ#(vXZst3w#SA#n|EqS zXnqN}rAqMKk~#OG6=tEFs6Vtv)XW~*BkDowk##^9+#U-dV?76k2ewDnX>hobsEG}O ziN?oeo@@@dHpV&@QaL{vq+5+Lh{R@1YynM>=MWM3T}{x>)m>;7jKDIp&Gp4rgpIBi zZHH~H3CK3r3}l;I222Gm2XZu637i8w3+Mu#4dl760P`ej zr;3o@sRU)e7w7%GoK6GU6_Zobsc(vuD`e)uGVQ_^*sP|bIk23V4y9S;09li`fx|aLzd>~}Jq48ik6&u$)N5*5bO2MX@6@98%(HCPRAR8s)LO4nmi4Z$J?o7l8 z@h0$lbrM9BFTrYO7 z2nVNZwz`u1fw*f!qFrd2%pt;Y8N}B0@-uyRB8)EDm)E!0V_h?4b#?kOL2)ckU~6HY zi*QunmnjcBzw<&p_gINTx*}_n&d=gypHUL)O!;)FoF(B+fL~(IGd{IToWK&Y_eMC% z@yil^JM3?x^%5Q=aY%r)N*L$!%`j7rGvwR@$dCuiQ5pE{>Pm2gOMi3WGAS2b%u0?; z8EvwSD=U{;hBIYihP_Hx!=jqXa+<9K1DJ0>;8U~>*OI1&<*xGD$}*U&Bw3l>ChPdF z?B&x=bEQvlB~P6(W%{g~ytJt^rrXk$)#&Y~D_c47kw+1gtvglABIdZUfh^?U&Ioh5O&6<^$F$XsOXwz>L_FXUlURGNP)+p2t2cZMy&nck^(}AdxwWyMk!u;&C{A^eLw1Ujcw2X{`?A&R2QiW{S zG+|L&S&u5@sqygd!|EZmFn&hdYb$2vR5dt%n@Tdr*D*Lu!te~$e> z+zLmq9{zS;+Ntritu@blJMf^7m;b8*O-STAUv-tpb-wCDBG-ATk!VkLHX7%MT<4#j zBXXUu`mo4#o@pQ4FWcE@JYD2EU-eFr>paUg|9u(Q#4w#aq9>O&&e`KrC~^1_aZ2mp`KmE^VPVHt zJwxO=U-d4L>wHxQUTWC!RcDJ_=c}G8a-FaGjL3Dq>Hxg{u(Q!vEpnZ&dY{O3zUn_j zuJct##xs4Luj&%H&R4x#wMK?`!Ri; zubLxrov(Va$aTKzpG0oYSG~PICX?>aH|$hJ!+g~+U$vpR!CqV6;tc(mY&7ycO?jyA zEnPLQyF*s(rb@L{llwtF?UF=yxuSMM05s&o1{%W#8oy%<2$N64yG!@7?gFqVL0Qw1Zr+WAxC>AVKlId-1?-`h)mAU5@4+&f z4=ZDOFv+li#?lb2A#9*=NmJSWb9lq#)BUf;F!}VyM?UpgNi_WC#!5g$p>e?8sqHRh zEzDV5W0dTEz9z@p9#e(aT82`mrDdfASXLTXlPgm2LL2;AxeLya<3V8=m|p@uY0~cJ zNzWWGyT-s?A_y%f`So!JEI0!ix$}g`f|qL0Z#)6Nczp*gw^8`Ti%!T+^T}qwNA0l$ z@Hm2L1#2O(-1+d}BZ0)FY$p<@5)WlWsKjgGN&?+Lgz>xrkDto7dZK-&%s4Hw4QI)e z_RXJxBZF+^uuROG<@6-sM>$1}L1Pfk9pZRckBrB9!Uq88 z5^gqqvE zzzW-ea1x&b7}NxDArQB<-dJNkxb<`ge9d%}6xd1JLc*y6HbahM4YXDd^JF^AhrOVWl!Crkl5a#7BPCI?Pkl0; zyq&f>HDCYp+Uiud?CJuwd-3rX+PxedqOjdH=w&XX7Ue?Q#O*c!o~ShyUqC2bf-9=ma^K!LU&6=bwlERP}i6}bYFFi z|BhRdAC|6hJhUR8aN>^AT~@x7_E@MU$%mkBDj!p$lj*q%i_+3(ih}2oBs_x6o0^k1 z72Mb8e&Z0@=&mBIscunub^YQ7$&~z zyj2S>ON$?+##szO@QrvxDX7GY((=mY^oFLail*F_y2_^N@{G#G)%BIlxX+L7cQqpA zq`R^+B)dNZW#?0bWgSN$Fh5{r*jc)DmJ(fzJOQmU4e!Z9lf@6%h#-FOy` z?svFEAE)9oYd)mp7v~{sruM_oT<)ILAC^BBr=svZRYQ|oD*8<9m!xN< z6-ZlY#-$@!%)0dZXyT{m6qvDWfLw^K&4(?K&D(6a;nz=|$Ojxxt<35X3tc@dA3uIO$7`~GA+H*h{~XZNh@tlRAI;C9*0W)B(HPKT}o{V$R0HhZR^HQCwhX%)Gy z1AV8+bsgxBMXu{WkH_vVJJut^*y9mriyzdlrgZx7l;A$aNj)2s}61+3cAua@}Un4IG8^WJ|GuPfR_uIoU*CURW|dNf|?+vz~B5xK4deYePU9cav@ zNJrO!&Jww9v*#+2>pIZeMXu{W$KkcMoz0#FBG+}GFA}+~1FdwObsgwCdz7xT zZnMWL@pT>O7e%h?Kqp}uv$NTgCvsf}dX>m^9q4wE>pIXMiriiY`lv%O$@G+_LRben ztONaDr30;=PD8xK-+vwGu)&^E(c`8Pc8E&u5i>afx?bH^%?e1Q`&Mj1s0jT)4fgbi zA*8Uup4u|^;)bTW=8C00o!8~fjn!q1)jgy;H8(=?XQBMvn zjSY>B_!fkd2ytWEHSgxK#g+2eq?>0QVss1ZOow%*l_jQ9WsG*O+ao_@B63nu3T)9d zHztlOUzEcodzur6(_dJ&tg@n@atU`&NlYqAP8``(R)|Fu%c~0AWle4hE31`Jn+39i zG#G6R4>&-{`mN@eW^@iTtPN=KMq-ib=)$(Sk#pK=A}7Dv_T;KwZGZND8QIpqxGlM)DWNTD za<7*D-ghIt4@Y{pMk1v7{np3b^W!(28o#L*O!;KO@R0Xmhj%N?54orL#3KX6qkQ7S z1H}VG95eh&_ra~ZH}iwwxqV>FX=kt0_SSaSf|kg(j^U5aKcfR*m}IT=n}C+P#q{8- zh`6JmUWPaH2IEqL>>82!)rXr99x0(J-jzY&FH=1&K(XFq8;)-YaQxCtwOKkVe|0?G zfx~@-jViavL56HtW|r}0Y}-^+_>96z_te^kMd@`)_n0Ef`6C(7rgNI>WAn>*Wo>00 z7T`A3k1a_GqA4}wEGr2h^WB9FU%HHwvC+*i3=c6M_;cWF;I+U4;B`PK!FyQFA|THi zUwfc7{F3PlG)}_R_Zb>%oNW4HjLj_g4s0;y1-0{msjq;h5xpR_9R`-19dk;GB@CvY zlG{4Hk3@R^}}-gChC6U%+p~O9)u`4sAu16xKM@F*!+NL}?wSv=ZXiK94Nh z9IzEJW_C#-)YOw}90drOAaTJC@vcgmV8pMjMKmk%NN;Da_zkD?Kp2;(Syjbi7UQ6S za!^D&|4=AXN&Y3~_DV~in$_=K!HB85&9oz7&1$k`Y%C`!3ArZ~loYRv`?nc^XMrqE z8Xoy?B>(S7?>2P`NN{rJs;8Jc3O;O|V>qm=NGaMnYod!`F>IKXMSh|9sxC&(5<^*D zVWkah-Hn(7T836#Vg=TuRXqs5Uwt3Oyv!<>R8v2&(nZlnZ#+A)?eMngU!x331*VOz zw!YxBRePWSoI>V!2lF^AR;^SOJ+-uDvK&1!iJ%`k)d4SuC+AeVzX|{ z6j?FFU2Eete{I0$ONT9%D%J^NKjBF6O~fx1;}eWx{0fyRW)c)Q_K=^cSKp^i<3k8L{2Nb||KKsyJC1cMX}mGT+zsq~tBGV0~x zn-t<*1)oaq0r&=rY^zW9hEMhmeC#j@#s@xMB>KBLmgc@x`HuI=>_$ZD`7#yO2pva6 z_FTrrw^USh-{l%SNc{dSo~znahv6s?I7+zswR z=%mR(?;}PcD!ftd6D4t4_z_W2WnJT}$~s92Q4A5Hh!gvzVUNz@Ji#zjm;FSXCmq8B ztY?_97{Yqo1w0X3sVN8B!Na;O2eNNe0NJ8$044$}fn$J+fwO>1fTshifba_er4G0h z`whTa;5uLvkTb(sz}tYB2|Z5(&jCIUTn&5ycrNf|;CVon%?tb#xE9Do<6D7AzzcvQ zfk@kv0=x)Fb72<)Ic{Tk6Z2q~0ykox<-Y`o(bz-1d-Qk@_3Ez#@+RUc;In4<3qafn zc-{hHcJu56{t`%YU`&UzYBSIY#I^LK0G9!2?rS-a?eYd7>k;48%^8qBH3QNI%ScE~ z$(}QPF~(~?*><0d#>iB>kA1ReJn#B4|QDrQx1%#RVoX_3~*HYQBO0VgdRQuT;+K-C5GbuIq8e}c^0 zIjAKT=MM9kf5G_=E|qU*w-B z$05rTuq7DN@T+F2BKXvdguZ7ClTh9hs?gu~LZ9`?{^^s^Y^aKN2z)9Pjxfg~MuKrZ ze8-88Jx|5s45#9~2;Wc%?SyZL_+rt@2a7Kfzn@{d37h4}8DTT$TuH|{ECI;4OtVi= z_;>_HNT`~dBZ9)OLwGOq9-Y&b!zSE;5t)wp>_#~Q^XKtuR#kJD1L47Q7|YCPoTpbO zF}^q|n|7JQn6BkG37HN@1zDBjRKpWqj>P;^+F;~?DUDMY%ZrLJut4q-ca_X?OweNB zCLjt6G#Nq~P;f17sV|oUtvM}V?qf~6u|cHfKIZPXe97sF)>!C*D7Yl0T8?$F3p>NH zRhaT$W8CCD6z;=3%;kRIF+j98&tTvt;8@^Yz$risPhwtYC$J3r?*lPMNxWL%X6&~C ze+R_aZ~OsxJ@7#wHZfzl1^5v5p9Ho8-v&Y^<}EvbUt|9f;E@i)cocXn5OHN5dI~rS z`+o*<9(o#>1$++J415Xb1-=UW1@Lv?jleg6zXEOt-VXdf;9WqL|2`lF0nZaa%!M8r zaeWKO`#hA*^BM3RU@z1k&$~B}$Mpri3p~`6vu#lxhw=}?rk=#;Q}YmgF~-42jSVo? z=x_RBj9GbO7;Nd zEXi<7AaPu0HdBE;D9$8HAaMdorF{?*;o!(i_x|mdBLfsyT(*gfqhza03GdjIWTPg* z{gLSy$JM;lRo}wMHBX8&@iUDxte_g>@3qkViN;LU7D_dd$1; z>2=sw;*beQAD!O_(XW*N601C76-K1iS^UoRHa(&I}{SDQqs6HWU?V4+wx zg(O9Myl!@*X;gwE1YQ5?dJyVemG!VoB*B3ui`b+pm!nzL)*7S6Ou#!=zw=q{3B}G$ z89QOTM5pDRSYhXujZ|YCE8LEq`;_mBnU}QEQYXm9F6N0=vdFVq>+$) zgzX`CM(&-(Aot3~N|L%^lm4)NMj|K1gOS4VTh*_h5;&~jgv7i?=;KwNRb9U%F}V)V%5kts`z@>(N(Qfa=qeBCreZ%!PxV#2uZU>Z)% z&Mhsk9ho^d(X5a#iQdAwmB?|1aBd{f=9Fk_~rZa5enXYfAv zR3@-2Wn^+dDn;puBjy^-P31=L+B(uj_l3wSgx6}T0( zSb%s%9NljM1b*5mXuZN46`moIEzCYW(^VuCRbQg{NUSK$pDf9RzCZ+JPR}gB@Vk%P zV5Y)bMJYF#yP0XZcp?Y)5Ys?TK263P7MRi0>>?0{<-86QRd`=$!7KwSL2Npr5;41w zBE461U|t4a1?Hs}W%|yHt>8SX6`&F1=cE;73aQc;KRa!#Sq(kNDz?r>U5r_*eKsIo zqim}<(kO9?-!}u9jBnrBn+5CAGUgObn_$Y>UrKPRCg)K!FJIN&JV@j^S$DsR%3h3~ zPzB<2WxYEzv6g)(9}!8u7Ah-ion2B9a@p+JV3(D-YO7H>Y(j|$ZNVLJSreWNVZ;c# zLf$3yxWFo0aazutOzAay&u9KF?lRfITI*q}?27U)(aLUt-hM6RDm+xoi5DUzXnV@XCM0-+E8p zN1x%XoJ-_?%+6YUSK_D*7e18|ciEFWa6`>U3#Vi2Ti>qnme()(*_~&8GqJ1`@xKuH z4bO~;%6#tA`&SL__32~J-HSx{>d5J+sqDXC)twg}Qgfbh`JhjZz?+0$ioBw8;Vp}9 zyno4KU(K4ZYS&NjsI*JuS4Dum!I?ciqQnhh2Hum5#5M;VojJ$Xnk||J8=GVvqR!=!}0a|K`IZ@c~QZ zx)rLsMV|HS_J95C!&)z{MXp<|dPC$o zGrKRIEu9XXnVl%W=~eyLQLj`Loe~ ztoY?6Z@-TZ$7n-NhtAAiEppvD)x#p!nb{F|59M^|%(;3{M6NTl`}AcxIx~Bw$aQA+B_cm{^ZDh6KXS!C<~{vj_HC&% z@Ob>Z$aQA+0JKr3LuY0$6}fJm>Oqm~%(;666uHjK{#N8VGkbO% z)7P2Vmy29yX1^nHotZu9Af}@;vp0&o{q>h$z5D-;{(ap1@^?Rfpbz@>t0LE#*|8X# zoDQ9tT`F>&nSGPUb!PTwBG;MOr{epp)1fo7t3<9_r~19fb!PTXk?YKCey4FdbY}Ka zk?Yo}?iRVu%>Jjyb!K)7zMMH7Iy2iNa@{)B?IPEi*)NG)XJ!w?9fi}OGqY!i+@6{J z7leiSuFzF^T-~dYVin>ugcjW-o_0sS-cHjz%=-@WzW=Lu-{#wlz3NWgF@ELV+rG+s zZp7_QM@6TvZK$nDy=ZK(xokZ4F)EnTA>4VM|$I*7ttiUWP4YS>L7iIPBQn?wE6G*ix3P z9N`<7S2maO9=W^Adf3%;nDyNwYYLzm!>sQx>-&eu`W8B2q<2N6(Gu;Q(Ayo6+TPJ- z__(V{c;96?d~Onl_xa+M^JN$u_dmi`i7nW4jdct@H5+~KDb{qp51cM2*a=n23JF4d z6S4Hl$MAC(R2T7@UKvx$3W&>m67eC1fhU{tG-w{vI~9m`m_{ZL?*hp%@UZCVK$eU9 zc-Je;xjx2R(-$kIdho6q@>_kfJ4|1UkdRqz?s%{*B5MpqE(FH{9EfOdrvp@p$aTG1 z4#jR9I2w^(ymVCi(A_wEU0P%Z0^<-6xh_AlgGIqBP$=WGB0s~Hgw1lljwhq#-;?oWIhcX}PCL$4Pgs^mr)OMvS zYe#*)=500y*l$~RX5<1ki3HcWrbshCe8@AYp{elk%o5mOg{-0|q)K)+WL;ZN1tgZc z&-4Vgo@mH$*$kf7JvQNeBvh#&UuP3;kt^Bd*I^qIWUY#MGLL()Elk3Xa$Q>AXs!A2 z2-9hOK4kNw?t#Dg;qZ^KJ!Yi?WLek(sc8P7DTivPhvyD$dkQ&$(xykws%=gQ;!3 zCOcYA_U>@Flf644-NWE(ON(?n(NLq?W<-K=7WpocFoO3v4NQ$3jFkCg}N0NZDR0f)eL#?Xk{HU2Vsls+Dp033Ik^Pgn;I<0Ed^!*u?^HZ;_fX z*e)6w*>ud4?E;?)dA-CT+(Qq_DD7bxkb@^`UTp2H0A^u-HIUc)8sJPIdZ1^vxnBUp zAnD<`Fr3$KAT~8p(Wgc#`eKX+%+Oe|yr*Q5kl7JhNa+dj>ic^nw6vp2yE>iF!WKyv zefD}Za}?Vm8x&H?^NVoo!Y@ACiwkABEHGupjc{P@ko3;XO?+EVIZEPC;oM5uPiSF3 zr}Gn91}g!6g$@xw{J`gUEvfb+@a^i<`vGkGC&$eI<9vi~UC&bEm@y zW;!|d09AMP2RkYV+P+DMpjMjPv?+ds?DBR(?P7Vax@vdzGLZMc;0rtiaYmc_O6y3f zARrNzQtg`I6vTjMk*atTifi$mJd5NBV^V!Qi$21$cx{;C@bH}Ncorw2BD**no<$Pc z3t4u7Zi)@hq5}~MIcfwrJKh1g9fzSaZ6B&4@(M3n?9gjg)a}y%NML%95gYP85OolL%A zK{6RsAKfP^gS?VR!&tV@T!y`1Ep(rnu+Kz;uAG7&J9nT5mHxkPMSfnn?_1}ddG?%w zeb4F9A3%k9O*ejzTJ6EA>j%*KR~8;Hc>DFgXZ`Ch<=4D5{SOysyfyJpXTI=I)jL=U zC4%*!>zEgaT-POEEppw;*A|iMI^$6ox1A1M$Gk-3x-R*-BG+}v9}&5(ORjX!bzSmO z+&4QNx-R+MBG+}vKNY#IOFjW@#p%#>$ybV8*CoG3Ckn_y&~6j$zKq;u1h`y557)^u1oF~xvopT zP2{>Rc^qE&*jf3SFLGU%{2r0(y5tcdbjb@t=#nezU%D>&a}rRc`{y3I~}?%d6~#{UGjTHuIrM&A#z=pe5jM@>$>D~M6T$>EF`Z0Z7mpoVGx-R*pBG+}v+eL1#OMYj6OeWn?*tGjlAJ+EXPj#H?`el_(-Bi-F zyC93o@W!jTq6bqvv!T119hQd3^6xV2gouG_?{{0z&#pqC1Hn2$g@kyGtrkNsrFL~` znag_O3lX_%NxP%&-OVdw)umKr_cXY>BteDio*D#vYTzL%Ev&&E*5Ixzm0rEa7D5&4 z(EYS)*E7|!v5eB-{(=&tEVE0N}~2Dh#4v9R4P z%=*C#{c#1bfQPk)=H^-#bThj-7ls-!E8WX!a;m4EP^#%& zb5%D>Y4yFu<@IjfNbFUH|5J9mMw^zHs44>O!sz0X)ZM9{w?21ng!hTvRE5Qw^lPt0 z;Cjc}_V~4z!B^P!viCg)7KeAoZ)*2$ad*b|$)~c{`K2 zJ8|{N-p=FQ?UkOv%+ID+Rb{H*(dd}Kyw8VQR87(p1_DGl%o4jq+Ta&k)qg2K><9K6o z=juZ@W*cqA(d!eO7xZJaEsn`it3HHXfwrityxSup9^TT~D}P;7+q7s)yF7Z`v`9;P z`~vd~{ED?WQ=emv(M2jSTcBT&`$|(D7;eSJb*B{*ab3ezd;bU_%dlkxwLs>{UUe0= ztR(y>CoOPJ*VV;b?glQ!h?^j-F{(V|(16Bx2zqC;YJAfAc>OHLeA)Wgf$uPdRk%bf zODz!JUW_^*Tj3fY&#xYs2y6fj1~vkR0?z~vH}{i)P1r}v6e}tDz!li1UMkZm0-gn2 z2t<$cAg)-4X#rB{*8@Bk_){SK9@YzwV=KgW3R6j&KBc5hUyRXdhQ=CSo4y!>SHVun zce>+;pyW$k$F43=L6wa?!qH(y`1m&s?W&cSD~hu+<@_QX)N$->#@l-(U#rzEJ*+P> zK@wfmhdClfIH>JtrR-PoC5?nmDftGjaE`B>wrZ^tAy+!5K_jXXhHm84OC1}y)VEJB zb&S$ewSGq@CyyI9E-`U*^4Rezi0gm%HQwCvTJg8XDO*`Avz=b*DxQ3xv(Za^Y!KRH zP`oKNda10f=|e!b!A8eJ?DR-qg1i`UMw9r!xdNW?A^gcxzmm$sts5?4edNz8lzc=Hkn4H17tLNHK?yhwI*!5g}ClS_j4ePmv z^<00DdakOE?z^6AL1b9Zl}jAMga>ZE)XLmklv`FP9)t;CIoC6GsRfStRKw4=*rjga z7TiCU6y|5A)v_l>)0LBs-OPNiDA9hr(bZ*coWa%VZGOZ z_g{H2jP&8{hSL$&dkyQoK5*f^csCK&do3}BWE#ev^j_uVcTas#3hTXw^a_({yowP1EkEP(xR}XWM2=bB|Jo>dII2Z27`^uQY$V&rJod ze9LO9m-J*~39nonI0aerMOg2(JgoOxZke<#EvHi3-l}4T^{iyV8))>$ z*F#$upzM~9WLB8UZldirEZ_*{vkM#I%TkdHnqn9pVj9q|<2V-*rO#Mu`eH=k9s5e=tE9sr+H)l_ak}72YJ+S~m2@=D$8>rnea8~a0j-Csk}C{q z@$za>i?>3wcv&nrwk}${-&JWjW~I$CD~-C*s?z9Fl}2BTES{`n&tPB4*l+Cg7N?;b z?(yAAZS|s&jTMWGPd@%=N_j(F0&P-i`xAtHu{P#<}+j!uz*m1&ad;H4s z(UlhHIs52J&kiih@6Ea{l24X5-H0qlM7=U;vXB9ko+Wh#$7g_^CH1F8emZ+^%ddP9HmP0Z0FMx=NdLVL=am@Bh|h+KBZzwc4Np0_%<`&qn+nRTqDT@<9p zHxB)e74zefdKSa~$^(N+c$lrv{k$61K&|ZF{kdO$S zIfIm5d-+X=-eu5vOYejnTUPbkhJ-Jm^XSk6=XVA2YlY78VM>pE$SOZO+U_;zyq%`> z*so=OYf6e-MM}nhTB5|^zIDdZ9m(mz?VO8p$3XAG5lWY5Nvm=n!G3%SotybGFoL&S zzwu1@r&vCO&hulqrbz9r^7|0wo-h_}7bh#d_S$(alE>>hO4GW2oZnkW zz7RUa=}ND?b{>rVeF8e4OjLU9?QbEHhh}P80~Q9_MyvgugZiz9PM2&^^Yv3dyTKG% zjj_6p(!_BKd?WX9lriMsm}m9Tu6h1*d1v)q2)&IPdK)+NHtuioZCsAfpYtv*FDWZw z!+u+gv)%EIYoB;rOwOD(%$YN-AbWClzPuOfLUl`PYAUPrR~K!#w8+iN#M}zkNcOma zNS>8DecEI$xc;!mRb$_B^O%0PXlPl^eW=?!+-9v?1Q)XZvln(lujQ7&eQ$o19OwZ! z^jWi~=V!^`;9*}}`RNvoo@?^5rFN_Aqwz&|A7&KKgN0eR1WytJk0N!|0+p80@Ktm z=5J=F%@etqop!m%&Fr*Kirmaj8;;Ir#ZEg*Sm@nVt4|k(=3RzZ1Ecopvg&HLTca zZxy+jo%SP&dE|jdtA4~xp?7pc@8}jA zO@Pbos>8`Lt-nt+s)O%~87~1;@T+YdHCRR_ax38wD-zY56yl~uOZd&m=N;BJx~r_*Me|E*U222Fb#;y7iw9K)Spl7|fAOK7A4Bix9^3&BanmN2)>bDZ70=79DlV$1 zO&G-Z%%a7mCHbWbxO#FzVnK33Qccm!(xRH;vYD=;8W)A7<<*ihS5}Y*)zZ`krSq1` z>ZpVv2}sux3sSJbFHw#vHYHgVghGDhlD+J^zw|B|1^IT-*y&%qb%%}k#Sf$EF2BMa zse+8g`~{m%6_lp8oc0NB*J^m)_A}mwZ^i9j20Vq5x8ZRIUmNi=-iFuTCFszL@MIi5 z0gDmvq{{Rbe1`t6@GSd`iO_HVS8gmqN6TqYgS@!tZJ=idS=^WH+1rRQvZVuNxkdr z4b64osk>U!Jy2}eRoA6{|H>7qDQ~o%bg~;8tW2moj;~f~W4Ep7*K`9SntNO)4QkD{ zv745E)oOP?+a{#qHdkVA@SgW=c)2bLovQbl&bg>e!(LC6tMkQu!1C-F*|4`RR!;)m zv#k@;cX=k;>y9eSn<0CI3{HSXV*TbATPKx+dwFu3)|8dp)|5M}t**DHt^P;bia2av zztdL#iLL(MHuosa_30(O_rBt8v7w}Yi+HE4Veg7wO(lsMQv$>*cd-&i{&)zhDdz?@ zc5f`c&b$_DM&Jv-Y_TBj~KcEmVh1w@A0?xiO#d7U^nBO&f^x z&(2T0{iu$zJ&6WV)fd%@tPC;b5u>00=t|Z{00j>EQ*ky z@~{|)wd!hdvDn|%*5-nKW$6N0XI5OV!F%Uk;`D0N!3eC^Zme*Sl<4wW^eonO36L%W z7!K~Efp`JKod6`|bQWR^W*Vmel#vUu|$d?VN4kk#-g-Sp`~PeIa$dzvU~5uqRk=)d^`+&geM7h zq2IzzBKGX8-yDwhh`DFhZ??B=%??Ko;aQ~jOiyo`qr|coA!wRyYl<0L#*FeCa}yI} zTa4<4=Ef`-q%mb(QKTd<%qV*bS_`}CD)9}wTyZEid~}kl%Pd_O?mPp=O-h8N>!O$1 zI%jW~J9hP-usJ2j(LJ`UF1o(W=8C9qvDJTWb1xs;#;-9rnzF{WdGYF|K^(sULRpI4tqn zbo?KSB|6Kw%XbB>_0{=W8#cT0s8xE#;tpTz2jU2rY?9gM!Vemg=)5x)- z`KKp#=WL4OU2SucMY>@!$3f>CEdJX!VSA&r35b1dneL#H%)R~$3^sDCGwVAR*xzU5 zic`wXMvi40LFFoI=)zsK&T)DQp3oq}=s51yG04zo^9ICwZ5~Uc1*ThBER<;j>2y|I zT3I4n?|~ozSs3*FGNZU0bukRkL!aLBf`z2v=w+Humw067-z#^2R@DU zk-+Uhw%aqnOyG;avw$xF%YYbV?s^~$h#0q6AdQ&=cr%ds-41*W`gZ|e2R;CN14v^A zL*;%F_!balX>S9c1HJ=%0r(+sC-5U+EAU@H9^)^7KLEc3avt&(FdVoC7zz9i7!8EX zeFP8&&wUgS2G4yWunTYyFbX&V2wgXiFY7x2xEI?`0qz6N0PY9Q0-|hp8Ibue1bz=Z z2Z*}3&jbDlTmftYt^(SSACDx*mNJrzDI>{Pl*Zci7a5H&V^P{t#FQSn=apX4oWKvW zsz=`&nK>Isn}zumOk1HV(o?6w*m&*fZranm%AUrwY@KA-)4m=%t;_8ECfL?I*wDnL z+{E59nhFwoQ#9Bx6Y==0OXSA+D55pBetDv!lPhv#E!U3aM`y~$poW-yu`_7;9BV)A za9iE@jTw-YpB9qxbx^b&DEt)b^=x9Bon62zosziuAwNbuY0ss z*S&tf&DD(`v)O4wrTfC%$K=hJEt_M1dSg=?W{LQ^N1$=t)wseA`x?_2;RzRBSz?1vG!Z?ubvSO)8I*akP-dLWP{{siDr z)B*DN7XpU?j{}YZ;yfgiL)Z|R1R@`?heLpike&pr0uBQ%2BrYd1L9b@&j(`E$ahO% zbKEy!eH@T>5`)DJ8?DU*(jFE7{|rV{ zqG)-w!6JjLlvtETtEKeZdMrxwS*qKhr=@Pjz_rU1uzq}J-71}*5b%~p?1gEQ1^}Vd#LFwnjL!jqI>+pLl!80P3$-H01 z@^20o75qJ0oQ7jP%Qk{hN34gj?~IB29z(Z>X7dhPbqQ!V*>jLDmLbj|Uyuj~mAd(A zP|Iuwvk`A#oj9s{Vc|YAoQB@Z+09u%+VdhHNAo=32p~F_dj_x+cq(uKa4ry?Nk(ls za2eLopWPP&&jwx!tN`*Xun5TZsRUjR#7w|_E3gK*7U%-r3#>K(-~zVSA-uiR6W##MD=eD2tMLHe=CRZ**NHLnjR9x8Rx^w%2uXw%|tFs&Cn` z>-s#2f6WtD|84lnBMLp|*m-{hr&ni7{kNT5|Ek~C=4?sb-th8@BWA{K=-X}6yLNQ# z=$5h1EZ==bLz~=ybGC#d3--CySd73nVqh8r`&?%r*NJRP2LE(p?RdzCOR6DJ+Z%l@ z3u(wsg0cPU(kE3#SW5j0NIa$bAIxLLmF$ML^CCJitU?6Oiq(1~?Rm z*}I#^l-tv8TnroqYy{G7P<}G-_rNURRlr%mYk;Q#uLW}dsmJ{qjYU~)#+21&EQ<4B zNsZQG^jH+W7B~kV5qzU?c3n69S{&0c&+gVvp0Chxx|Q7tO}4zYa7^n0T!=gBSH@`g z2;jpBN%R7qYxv$BI9W5i_sSd-qNZdAV+@#aPRZ>xHr|97O%F?9pX6qSLZ%ZUyqh zc^i<%{B~d;;2prDfNOyqMCguk6Z|e9jruy^$-qAXvw-&iCjsvTP6gfvECj9x&IjHP z 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%0A?=)w&3lu45PGJW+JZ4!k97(W6CUwN3$rN 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 z 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

      u$SHh`4hf6T)to9v%+^Q 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 ckHsW6r_?cG^rQ0Z`8B(`XG_CBglJs&i> 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

      mT|lOfJ}Ip?K<;^xi|r`m$lZoSjO#o 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�lmxY(TUSOOMr$gMsdk3=w_Ru!>{ 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

      sGK?efE| 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%0A0nMJpj#aE)@G~4*O|PIs7j$R4)Ig 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�~{t|$!T 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%0APDhnsgCVc-VL38`tMF&)!n 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 vMi?T;K02(di z#_PVu@EJ9h42;uGeL$mSk7jh4`1fmQw2|pqqfTd2LZhWJ8tvU#c+5Z*jUyTwjn=H1 zBMKVrQVbK?I5uXOu%!NMCNx?j=A9_lpM&6I8Xa(wA))cuRX zQy*Ikn~ky^^|WXxv(3;lM#-j!|Y2Xt_1W_$#ovEQ8IMH!fOyPh-OR18%*x zj1qQ7DDg#<_ekh3J6+f)|D&Phz@Q=B1-mb@g%w>PqNQ7c{5>)ng<@lOWf1ki+l2zCp z2N5lQmFQEq*-&1WuBL55a&6^iai%LcTE#^)Gwly_ZH;u(sIzCVOc;2-SbAv-{H`& zlWoY3j%e|H1pTY9duS$EblmT$oBRtl$5gW!uA$N68;tfH2b;=S!Y5@lBrXxU8|V^N=k7MyjCJbp%Va2!qwvAw&n@}dOeb38YQBl9MWU09;9ax zgCOa4z~`gSaYtnW*!sVR^c*1f9T^{8l3QfA*w8uu%MhRoa9@NKEs#EXgc{vK84Y@b z+O@3LBh+@VUXM_-AOWL6k5KzF>-7jVdi@m*p*8}yBu0ZCp+;;+MuQ%q_8{x`Tlbqd|{Q%VNDAp+=9rjRrkJ?E%*75o%wvUXM`A z#=K!P=n-l`)_-QW-7lD`&h3>uI*yI9=SORPtA-5J#upa>(_j<=k2qd||zE@ZtPk$nN{k9zBi-tV8^_U80Q4!12msvUjyUe@c8*ZWzY zIdIybbC=%u^PHO(UN)xc`j@e)LSBsqJ@R@!>-EU%J6NwrUTT>aMR8djJfk8MA7uI`#2sv=2w|k^cYCrlh|yfFT0#C+?#=c-PpFjJ+nx6 zQdo5AcH;kczL8EDCJmk$N>N4}ULLHCN^_Sl)X{8ze1N}uAC5JF+c}!%= z^?L|Y67cbiOu28WMnx!bJbM2K?-KD^1~2G8m0byvy>V8B>8$$Zx|t_8nP|(G6EaNn z`NY8-cm;+}m63!1$T1La7V9YWLU!TxgmgB$=;PnH?4r-5@wyPdRQx}eT_*g$fL*Kc zUs{jX#aspvKY&yW3?VN%D75;p$}kqn%WnKA#ZeK^8zl^0cuHF-3*sQ?jb;m+&TNK9 zpX8@2F+ft>Z{vrT!J&MvkfZ=kXeSZo`LJQU%?B%)o@=h~Kk^@&**+*OU2_|n?_FAv<6n9D5V8xOt0Fqj%>CrNXXs}F3 zfC^u_W>HEtp*^@n)va)Cza9VfI>+_${}I(tT(rz-t_f`|&*<;v6jPa*A}fp!x&{^n z%TfqnU+hJeGK;)r?OTv%0N1KzRJu}uYxl(j-yHI43}sGu1z#SriSqaSVk5$)O{kHS zrcA^huqiuEs@|exu4dkj#A<*9s^f&>!J;a-MFGzX20 z5%{I>SkGV=jU4*LNn`OJ_yzdlt8{57yDITt_}0TEd|TiWVXq0f?uBazeklZRlul*W zdi+0yT`z@P03pg@l~Ef<+odxEDn%NBPIEHO;%M7X=|s3vq_g2Vfn5!79mlQ~xQ=Dl zb#NWSu1Db#dENk*$TNNCGKhWuh%Zt^o@wtfn(0y`4_qVJRSuV2%8=_^xa9J}bu`psGZGR(1I65MF_HKMB`P)P&kUhCUzTIh}#2(ic(vjby}g zcrpCPMS!s>&y=_OAYV~3E|~f0gVcuR>9w;efO+B@4n|N?4wOU0&1VRI7`|*(d?2wE zqjHKDM}R1VPSf0;j8Tz_tVl&>q+%o#;r(xC)B+){>~H=Pax$Z_ehv~9`m6L zby6k?CyqxR4C$s)`tfVP*NvcwMFsXt-X~+P8#%-`IAaVrfL7#7G0^!8_>N8{W&t|Z zpznnCr@k9?s~l9PG=b45y+PLBh-($qGv+IXbE4k_a&Uepqyut4WFF+*kW(RX83_9NSgN_hg=J}8ge7#6OdaV(T@V#Az{N? z?>-HAEb<830D<)}-UHZzl zknchgA;kxfFF}3?xfSx`|Hs~yz*SYW?{ftaf%GC*MJ2uFH7(KDR9s3(Kq$m32v{zt zfC8}z7qv3G1@=W(%F4=i+im^otFLTVakoudw9K+yQ_IRqZSns+Gv}Op?t+<`-}n9g z&5z6To_FTVnR#c<%zI|unE`GEeg@>`0$%~UKwjSf`vK7(IEMoF0ds+{esE3zBJIu@ zz|Fu?AX+Hr6~Lc>{{a3BTnIb}Tm(D>ydC%p@Il~jK-O`}8NII1ujIn#PPmc_pGk!% zQAkxE!LzDVh|&jCH^J+tQXvYZ#g-zJ$0G|Wga;X`%WcnBsSss6sMAEai7FMMl!CGf zUWH19h^-oAS`LFJ(_%r2B`;E?{4BzjbLeihMr?9q$u9{)G$nY5Qr5Ptb-bqBn1{@> z*QJ)UHFyT?WT=u51FNlI)vvPF&$BD9!b7POUASG-BZ3>#?5@dn>Lv~F#a1O@Qi+kh zo4pCUp=ev?pdYSlyEau=Q0~3}1YP~SaY|jr{KItvN=`RCSWOEBuBBa1i%5sK&nGS8 zT$9JmKkVpH5^uOMM9qY`V3MmD`~L(tm+&-cEnfL3=pnkdyK7}<5QATkD7te%S;R_h z$vYd@k~c~ZXV-b9pcul!-4f8?lDY=}hY9K?{2wZ)<@hh-TMtUc_qNXaQ0K9mk@0cW zoV=qWD0v4fq~vjRtmL8X6P**EuQ{$948{e2bnKkWK!#<*M9CQa=b>|HEqrAc6YJ&w z75oF$*urr?(_y@y{#xhs9Vj$t_<-=-350248j^r(*b_@fn|7YKh_0tnw9x#3(9+Ey ze1TPm*TSox(Y6KYEE;@n^1&=}ajLLS7Y#fk({|$Ex_>tK!o;IMJXgSas*z2}D_l^VOlhi$VVV5GPPz9ZbphCn^ z=0k85$_82NFchL>;!fTX%JbXRaNK__IM4On{GaOD=jV=AEkg2H&qD z{4_UCCFn=TH>EX@*GPtvjUS!nKMk5epnAm?Bvbf$`fKkU--N~Z4fT2x_)I<{2fy`^ z_$M9T1nn)r+I-rbIfN3X1t12yFYq={Ut!9gLaL^rI|~Y@=3;^FVpi!6N?oOh6k&tH z`5HuuEorFBe2+V)xZ@Lh|7^u|Tl|;(m@S)QLU7s6Zwg|iH>ACX=rQis&aAwn+) zHbG3J)+8CW4Pk}V9Mi_a2*A&#GRHueB%x(EndS>r;bwrA+k}vkVAiHh8tZ*NeIsids6T=L)9Q9^( z0HPP!dFE`bg_4603$;hf!H4g0`BU0(XWcaHL}$&{MgtHQVzAVOm)xR-FH70A8Z>f< z%^Q12v0(&A1dOZ;DY*-tyY9e0WW<8xL~3y%Nc)DH>5(>kskQz5RS;kOyeP#HRX@+F zI686PM~At7USGu#Qa>+RX+Qs7gm{<@Ro(f}%KA!?Xj|V!LobWQ4m~!x1zn8X0xv;s zfj1l;iN-DPRs~`gI%FkrcNli zY-|sSQIdRa02F1<8GCrM7-y-o?piCt1%q#P*)92b(oaP37`-3@jK^@e36H@Q2AxFx zk|ow~HNrrU_SSX1QK;Ce(41|T#pH6>qH;716>-c9cKxtB5L~llVwb$kdaX`!eCPFk z>jE~8RXuSbM|Z+7vZIxISYx>@YIkG_zj!49tt$R26#?1l+5`*In22-N-Zg2 z$VAkng2~W9qno)Kr6AneW-sKZAAVBDWZz{GI^r3EIv4*X#nv-c@GioC*_X`()mQNT zrSmp`$`!or_%8=p_JLvxZc*AGE7W2zfCP$fzD4N|O6?m#B?=w~2-RnRk||gOitVvQ z*$#^7u_(jvs+=mQdqK(OxEU1tNsICZsIh|j43tbgTd*j>vw(^hR3A|CX>p+Bpbc9Z z_AJ;j5L6dI<$z)bX;Cf!MLpf!_}`B!&2i@lnK#K{`)vsJxS z(@r7~oZIgSO-B0^pnAhN*p(KE+dMbkD-uIAMaVxLhiEut<5aIV;@Z%;_Ep&oO4)A( zo{L|U%Ac%urWp7T8V)|&#V&hgz|#<}9LTb+1SSHjfYdrM$SDSOW&)?-8hxL04zLzT zrDG28F(7&}v76p};LEta42S_0WghS?pcD8B@Cx8(z)OG_=urLvJPgFZixb}rN)xaT z5Z#j)#JL^_Elt7O>P!aS1caiXpdWGO1JNys!JNgw5?tR2#IqFiLQbSbxf^&b@E+iO zz@@;qfd2$;0X_-*1o$tY6|#C7$ldmy0iFST7I+qL8Sp&dOTY@?%fK4o!@wrsa^OwC z6~L!}tAHGAMOW!u3tR(yAGj8{4Y&@t9k>zr32+neE8u2eAjCMyxux*xXw$`d43hLFjXO=VrCINqEyHZ;kF|wWZ2r+k3x0` z3H76pp}U7VHW5*xkF{WOXe>x7AsImQV@bnS&kHZ%o{O?OEZ@cSqpwcM(YtA}=Wi_8 zJ{lAUPsNQ=gTmX`vIZ3i4XU#i9vT#i*S`i81r4e@0`7VQA&|yMp>hZb2_>t2!~OKg z8vfG?s8G+KoQ|wQ-GC53uTXeTT4dcY=uCa7{D{qa`%29zT5jGOBRB6&kel}=8aD40 zYEvNoTYp+Xl_|@dKej0kDwAPUtbGGVbX-|UkdrGd7z%`i+LA3l+hva&o0F%hOtxL0 zBSj363GL8JWm-=!+{t`HZHg2slT9C}6Kd5141;~4RpkiLjIUpD7|Kfh!GPJthiy&p zXBnpF+BH3R_dqCD>73gmPfK*v?w+|+$-t5t>h5-)w_)dLq12i$ODMTeFT0xET}$%x zE6$Dmij2z&lw4MPEc%q$N1tLIjP6A1R}^9lenDacL~2m4lzO6d-rA~bZN@`VXE~HjPJxpp<9Y95jSh%OL)T$Cd6@nL}B!Vgs)NoLf1eFA8 zs-V!j`%HzUz*ouzo^amUS8p$WZ|#eFs~Yd8zft?@>c`)xeSMES8t?bkzR;8SXkSb- zwXYc95wx$OV)tAaAE7z3Mo`6o_I0GWuy!7EVTsUDjB{gyy{-p&U2~@FFPaCV`sP4J zi`I*}e$h4r_bAAPcPT<@F#Kex1>4s+DWIxjh7z{*rCq`y5-Q%QA zaVjtth~7X+Q@s9e5=W%7C*0h<&J?w*p54 zZwK0e4+EhzI3EQf4(Ch23xKPDXy2Thf#?jJ9|7}$JAf!B=K&y|<@_CpJ(`6^HxHKIlVVkgu@u7X#GNzd{Ar~LzM|C6{5@l#a1#@xk#l##E$baEk($m zObgq1$)ju~kE33aw?OB)=k|;yOTl=Zv{^mfWT_T6$$qu8Y=*mEJ)+6d9Q~eRzxN!C z$VIvVP#P@Rq=Kf6$G~9e8bsn_u!MtIaLhydhUth; zRY@sns-!tUC?iqB)<7lYhlI>|`7R7WE5g91uQrY*R8p2CPLa^39ps?iUD}OOCB>wT z+oCAfk44dsC|TX2h~`Alh>|0-bD&`L%{ly*80Bi;@FqebxzVlbPIHC2!s|b6?>rRd z=ma~Y9Cfrx9cg@!(ebbpbqp)hmO#a9m&uV*zpItwEdJ|S^0Jo5vRTG5+Fb?p%a&)) z&r^p!yF+Ue*HUBK-7b&nT6BJ%CJ0SE8&tAFkFv%i%BT|7JWV+>R3fI*Se_j0It=3_ z;~*F^HF*M_7(7WBFS&IvYBh57hdPSXQ#d0kbrOyw$^M$}ru41Sed|HVdvDe$wzmE7 z^KY!Q5k7Lnimk7_cONJjGv}!K;%8CLL}5$b*`U}XSd?r~GA;P-SAFY2$uTZ`YpNq# zJ3&cZjlGYIB?6Sp(dnSdMSN&`RSgZTsB)3uO#mhDK#Qf`QK$2qI*(t;UBw+Yf|9!0 zJ)j~5?;%hvkAS@Z-(V3A|KO;Dg#xLs5!pU_`)jjSk1&jv{}W;ai+2b!684oI_jm3@ zAGW^I90`4@AAhs({|^5-Bk669#56N)&jS7FVA34PsDjD#h)Bg;vZNH;f3gO^IC<>W znP^F5)R~xHZ2*izQI8_mbkt_#P!#n5jFjk(GGMJu!0$1Ye-ZjM%B2Q)CJ@cM^IRbM z4WXaB4&)caY~W-dnshP4d@=A6T+@FZ@G{`_z?%6cHbxi$ci z7UeY{>nP>Q8efW^)Hg^;eS?&o%PbQ-%868n!eI&-?g^C&;ndc!RjX^^ENqgu#@_&uPP{VZtY+{ro2IFjti>djp>O z#3PV0<(P(D&IaLJA|8k|5kns14YNTQ1+ii}D7&d#o=PMhgSc#n8B=~%5tBNv)K|uY zK@!H4fS6(oF|m6S^GeaXLtJ@QS7j6eSTMB|=t#)VZAwe=GU08D77Ni>IDnGwHGr}g zO5YJDrCvh-RRpfbY)g>;{JOJUse!K1!LD3NCDD~?7KcJ%2#e!4pO}!E1XpgDI0Fha zMrW*)UN$nDXy4tM2QcO4cpd`9*#z||JZGw}7%G}5#X3a}6&1;$q7pe&RBjk5!Zh7P zJfNKCJoReuIzJe^1%ej_ z-a^4+&K7|(o;B7W?nGdE;KZ?J9?G>yBrSieJ=?QB)RgGrDO zi)(>+0_IP}`=;uQoCLsGeVir#oMf7~=Y5isQC)+ni>6~ButBsKV_oM(+H+Jp_x24h zAXsjWKEX*v`XSz#XU@;g@v7I?!lRyt(ske%vhgOzESy}2jXyQviqq9t0i$GXvC7(l z27#xW^_8_g+Ow)ep;kt-oG5x2D+xm+T`g!ub3QK~X1@)L@;O2ujXi-lbE&f|7b3A10|GI)!-=r4Au1 z$_&&?N&O5eTktq0aY+N04{isQY$mt!aT^ z`HZ!3&v=SJYF1LuYlmxwrOwdR%l`)GX#v7lYHN{R{=dS%mC)R%Lt$*fkH1OP^Y|Q# zAAc=1)bpN&)G%Zf4pMhaGwAS>4<9%cNxz5s;G_?$9;KDFxJG1xaMj~ zABM(wujiRyMHMq+k-X4whpG)$#ELOHo&d(=&8nGxv6#GEW(pq926HE^ zT4ZjH8kr2?d6%394S|s8w2`xIUe}{3E`xsnN<+JL>!y9xyXeDmqi%XGe$>0@-hvLq zvV0HN3%CWycWo;$7Wh7pUwWSb^MIcNrvSeMQXkm~ycf6&_z3W8;3vS{z|VktfqQ}b zfIk4g2Zo|f{Rrf&=OG~N7k&k%15vrfY-cMV+u;DU<7(3h-NC zJ0Qjd6^u7I`R!r`c19j8!0y1#z=^;vz{x+{DB!qCqL6q1HKBx7`AgI z&;~>v6^vIo@oc3(FakIL$T6!};3yzAP!+S1gMqi<8m)-)4j^VQop%9;0$%}QeABrR zh?z|1P9W}e9tLIrPeqAl0^@;MzzczSzzX1a;8nm2feV1JU~t|AoCLfdI0N`NuoUmZ;#4X`IY;N6tMjsSUbfC-Dad=L={yc*N#0zYhu$KvK7DwQ_{wTVRzw?W z18R=-myUjP{8pyp^>_G9$1l#S4b$#n8@biD4J)lIJ)(^uQpZM!PtY1A_dAyeuIBh0 zzHAI5H2tgzM(u5Pf#IB9_9~&VY!9r zLw)gFperrK^Lkb~Oq<$jHcf#-n3J2CIwyV>F?u4Y0XmOq{t>?v{4_UQCFn;-S))3L z{1Jze31{@zu2>c&_+f2OIKya;aq?caGk(fqItrtNPAag$Za#i+DU`JeE0gM7(3G5B52eSMcfCGW^flTjJK$h9%__g7QjDiZ~ zS&V`T;o=*W_nOXQ+Wnp4Ru6s)dv%<|Q`{Ex6(U7ijLt1@D+F#l^9jutPU?zO1K&Mj zRipcU%94&@aF^i(D8?6HO2mJbho{R_FGU!S^TyCr;V$ZnEVT};_V1UJdU6<5LWRBo zCQ6&3>00a56mdI2IB(fhah#vCldyoAg|sPVMXV`hs;*9I{& zx6oz8fBxgM=s4>noyJ+JG4wG1_Tj7m=L$r?6f$pO0hd5`%v;oJH|JX)&LIyD*YU-J zGs|R**^Ddcm_mk0z$M30-B0I?i)R?V5wH+9gh}xUGYDY@>0uCaJUJYX5t0`XPV=~n zERHitr%CKGACAj|!-Ll9^dtVXyKeCaW30WbeeToyqWg5jmzXRqoaCh5#W0cwD(h9i!GCU>c{&h4F;wb?htk=^=_% z$1t}k#$p+>tQ&z^;t@uYU3@q(KAa36&Lj_xF&Av_kV5r|eRIB?;+qThX91=;NS*c$ zhUrw98grPQ3ulYZVhYWb9Q&tNOoWl=Q+l5D z$l5EE4-vOkg495z(>T;c-5g`-Q29X}gTD>bg+pdQZ8w23wvcSS0!%z7O>3V!=(&he zWA32m0=lho04ZS1vW_KrJRR>c8vrpU;SK|hRdq}=!tixhIM3`3Q{x?mANWdxN0^1) zVc2DG>|Bk9Pmcj70pUd6J>EFJX8|URC<|$X*zZF(eDT{ zG}eK`(PqXhrSY~J#@+V*;K4DLPABm!eu;Gk)$5+VGknuSp8(Smln!e)T_-&~q2Nl6 zRqbV>z@bLZm}MRFJ@FKarR8nNg{*a+C#M=y2m#^geDCO-Kfj5l#am)s;1gilf&bcj z7O7Kx)D%Vvi5X+=D(<2dM)90^zp2tU=58Vkdl)U|t~xbPjk&9c837fZqAVTrWjsBU zx|_e#L-TQmc2Xz?DGDm8DjkY;1ZYN5R+|0%@&N@YN0{^&a2*U9hb=f=* z^eLzmhn0GBk%(Dw@xGyDp2j4n+FSB-TwGmT5T|JQs=&#pRfQr2M{(|HOJ}mCrKX;5 zAAMfB|1()3R*y4TE9)wdU7R2<4v6(whN{VJusem?fi?wflqsomGc&SMGO|V$$Rm*o zN+Ce6!*2=->uPF>QD=lWA?dnmeUYCYn8H`js8vnh_4R)qk5Lx|isNBDRtu_&)I0)9 zo(QXrwBc}Bk2M8q9uwkGH@wSLmY*o2SYO}qL*iAgsHtka+ElF?@4(n0o_7|O6c=9P zryfbZznUa{TB=J%U#&LjdG(w<){->DE2}yU)_fig7D=nYlwS@BU`sa4t) zutoECM(=BEhKBLS0uBG&u@!aVM zGm8&|Ybm~a;P(>3OyaZv9K-ob-*CitAHsahi3m77K0jxl_O^;3`ajAUWy(H@LmkZ^ zVic1Y>cB^RO4aPjiRxbO{ndRTXm5WK~5q&cmot3TGE_=)liYl)`dlmuTk;lBS^JM3XYD^`4t@waW*YvbX#JyXvva^n$r)3SpOMAb^5d=jN7Z7# zxlw8OU2N@NSyf&&qsnkw&ILJH$)i)X8&brL1(~VISp~^iDFvfJAarIyD%yWRqTL@? zkdrzxH#@Z;YfM2(sy#b(Wb(LFL!4*?l5<8E*pm@5e@u1?6Qw0HA$>5H%4;Bd}+ zO)H&2#SBMIwg)E!tv_C!QK?xY&&4!baQI3D0Ru`Rn!Mofo_O5s!jh>q1>T2Z{=tEj zeB4<`1$E!4<;A$2=WOzE$oCAayPU=(@DbH$nP*KcC@;k|Q@})?n=vXYceJ>yLken3 zFJTN!Fi+)lOr0SQ=44hA+*!q=L{|6Xmc@_}{%{V|+`}8Q9-Ht@;oJ*~rp>v3_W)@m z=P&kZ1O!&fv>VbAQN3VFPn zkZb$J>nG+M)l;=oWsWMas-EDxWctzOs;aiOya3AjQHQTCuEZ^~jyAmEf^a%bX`wP*H8*wk5O zD9&f6<&*Gebzg96f9quH*?;+N((3l(?!Bb7LZn4sAh*B@(~bSG1f?!8e)*(kTGP#I z;|l%BWU6alX41^_;P2RxFLu7mFH_WQMe=jYx@iHdh+sfjEA5iuH;ZBZ@8Q2tK3n|PWWh1|29=+V0dtb)0Xd3)K9B<#7XUf3oe3NWL}`eX zierFh-UtLw>^;GFZpU>lkn-R)%a^l%ayKqgayKqg(t=&` zsKQI$GU%_;03B62x_(Ze0{cuMt@hV){KJKP;7sisVnGVi^|`hr)o`<%o8$z}-&+?d z8Mtum?i8IvyHI&Si}t9Uc$ng*U=p1KixoSz7TON)7~w4zp0{tHX+12U6JY=g zTVT}(FGc%?h4g`;alY$^JazH9Y9q|)Yp#yhx0_S>*#1Mo?nK(FC2VZZ6FfXUO5Ni} z4I4*(Zl3mDiLl+lbKfrPnQ6Bs>}fkA6Ih6*#VtI)K`xPYGh&a)&vxHwVe&V@)6Ej$ zIlzU+B&E!RMfxJExU;Wu1Els1w;@bZhEitIQYK`<$_7~sMW7-@y3l~RE+V%KZAzS$UL>imKc(qu6MU9CDaK^fId^x&P67ckk+5NI(U=!$ zXpUdb|9oLMfM$X1sJ1eT^;_EHvW82lSf|()N#4aebuB2?Sc|ZGlGI9EbEwb4O=`uq zt`=@TtMY(4vnFy>(7_iV4j1DIx} zkv4o!Q;^c(E1o0kdYfERT7eCZ=7^SAMkvD>Xhh&;2~5*pW`U-*)$o*tz~V}pwQ3-|M-5#aTOB8R4fYu^ke}u#H@aTt(K=u$a5fM;1@DdXG9dbL=bgZLz~_Kh0NMVaKM|WpHv)gd^#UL* zIj;kr0lWb?9C#D(0w5Y6u}L)IayH`neju%A9soWGdFV5_!O`;>jRMXB@Y5= z6^b-CM*yD(a#-MH;Ar5h!12K4Kw9RO16iMV%_5G#PgdDge>!9ZVe4L4dFUp-SaJP4*c z?Kxnerg=3y#w7^jJzJjfGm%8OH@yS*R*E@h?^Or}J#mTtM67aD>2RQy-*u?t%)^^N z_8?n;2|)B|V&{r&z!Y3>2ik!j0jB{!0iu0SJ_X`ER=xz@0z}nw;=L3buj9QF8?rwO z{1$w?cY^-{@GV?ZZu@{N1si_y9U~>*F;XGi%~-6!2^BqQZ^5euPlj`-REWZN%!YR< zCw{M}|5#>jql$RAE>u%D0$m62R@ty?uz|IYn-i54Yf2;Erc}w&bRDwd@Ny*J?TLnF z)mQ8$nIraC%ELkU%%pRdTJKG(mh8bqC)fUL5)I#Nb*|$)MzG zG)||k0L2ExqTDF{lL`d&BYyYer@4Dnf+C^g%fqVAuuO^efuQ;G<+_Zej~hI9;TW1F2Qfv5ndix7Pz}^gw>r{ zr}zdLj)f4%i;GS(5J8Tn^VZ%Uh8>UPI=luc?j4UFl<%Xv_ZCqfb?41@k)5v-Kh0_7 z#gAWy%KRNcSXL&J;$+satX+Jl1prUSbs&&RRBPZ6U>jg2ur06vh))9N0w6Yv5=*nO zNWysst|Nd;faqYwixv%9zG$T6i$*F$>4wMm7rY)S6~Zm|gz6W{P4)y8B5IXClkqEY zZwupqC(&e_W(S_mXmEfR1IAcloB5O^6iRK1)4TKBODf-a`C|1?z zt+Qm{zm@e6j_fF zjRNU?zegBeJn6ylHEuRaj4}u?v2$aYK6FlxdS8jrC%{A#4NYQhb9vrL*G8AvJGf%! z#jupM==KCk8L|Xa4-z~X%`g-b0^*XkzG`5Y+_uT z2u-^vi?EBjqmNu0#NzR17nQ*F#pwLlMLAGrgT2Bf(JrdSup|X>SkaI@+Rhl6q9iFv zNye&1Uw(CL#8ATy{OC}p{Mr+-4(>;o{cKm@Sn>SXJF%l1iYl8;y#($^@l8jV>C|c9 zjuhWx2(wBJccl2XBFxqve;i+TD^_seM|Y(7&a+|!w5JGm#Plshn5AmCBgOX;!n}0a zAII0K7run>qdQW30}y6_O@=#?{2U0gKn-`K_?95dlHPwD-e%hiFymY6_@B2w({s_Xf!W{oXEa;Olf{_{a^weylksj^( zE`V8J#z@%xjmpTvofnqlS8DB_Rs@~ek1eHY>xfxtYyU#jveS;murhgE=IFGM6Em_# zX6B}(o_4I!9Pj=1@~MvLRW%hkDd$gAZA*?VEsS7R+<+KEEaOI6`;S*@YYLSC6FqEe z}1%IecaaGcxCdV|30OA*Tn%DWeYT0GGCjq$&ishTd!*c z-`Cdb6~Xtl_4-Eew-_8&?|S!)Hq|%ZTrneTVAgprEe`z7Q69XZS8X3H-5UN+ zr9ZOg+_;64(*_KBW7ubR&5n+2cU8dced_Ps)8^jm{=ItAzN*aZ^&j=y_|r|}J4X(= zDP!)}HdDCD49J{LkA58W zLeZXI<_C`7_HD>DU(d{+6cl#Z)3>yr|KKN|uYL5#Cl+jL8^5Ldf<-&d>pk_(H$K~Z zde_b0T=d;phl1X}Cb($ptX8$>tSc+Z?$Ix@^QG3X7eDEof63HI<+Iyfz5Ipu(>@LU zbj%XR7mvn{+&1CY9lx2cJ^#v0)`y2~-k`}{!@uQ!66N1B*wnRVc!!7n@#U7QXWnLh z`GpCm-`dc z1*5VqT0ZI4f89K0$-?G)dkwqis<9Kk+S_C58P#umy5*nCx^17;vpPNMt)T1sy!+&Z z58wFA*NdC3+rHwe!_R%V@WJKRjov?SeL_&|ty;Nj_;>mLKPvxL4L1yGKJ?7yxz(qy zc;~}^O*uX7qxE&&XPy1R;Fk{^UKI5BT{-Q(*p_%!a*XMTC(Cm7F6^^4w(~80p1kV9 z#>fxO*|z)5+bw%j-Y9?Jjdxz`w(WAus4rjZeSW-k?AU%={&{ZIvi+vP3pT%cLH!2P zn)7eivoG%Jj+<&u4cLF>mNzOLzyI{^hs@e^RIr%;~shKx{7(Prhl^4^4jFh?VW>nJakLPZ@$0% zv%W$1yz6>y^#`+lv_Eq8H9cP4x4X-0Pu&;s?!*uB*6$hc{mpTSm+#zCIXti=@SN+W zk4T^LO@~+ePY885-urUV!R{5WCE2ukui@YI|L^+$|EB)G5`KZ>z8k7K{Qkw~iL>WE z`*7UH3%0(p>aE)6V_z7yF7DZ;JKt6uJsx`XnqNol?LF(K8!x)wHht)$g?C)|`Hv+D zy`FLO`)>W5Ue|Tn_}QJs{XhF{*(<*`T=V{Erws_aKVWW~h~4>1yY||*Hlg;{qVlg} zE;@hXx~tBrpTGUko#$VE@A7}_ytpJjVDE(OLxcJa|MBU2=R8<(X2gLJDF^z09NTV( z${xt;IFMJN8L33^HF)TcRg}fjQ!JDd5bidby$__@B*C2rCSA)L3{ISU3Z~wiOs5qX z1|%)_ejZR&o*B(Mmj1mG}%*;*gH0pv>-_!#W$^r!3iBQ4Z%5!=y9 z{9aY!@2V1iPnGx?kcpHyDJgMMQsR`DlsG9VaT$&hm*Lbpj`!2IjE>aZ*y^q@=_tF)49UQsOckB`(9M5=W=uEAe&+ z^&ge^pxA_C=s6#2LE<8|qm?*Tu{e=^1*@cl#22X&j|WdmoRpL}DJgMEOiG-Tl(-B> ziOX=R!~^|FygfqwMX$i7$1!FtResxb%q#7rH} zo#xSRKl{3G%&ZiiX?E|5ykCu(yCQo^gYSzw=GO*pFZ7L>Rmn4E_fExO6e1jVD)x+- z?U_5~^;buu8ZjA0Y48p7jM=>}u}zJc`x1M`OeNhN^ED%{>Eau6xKGUPU5IJkOlS6q zxdXWFm{*L5#EJ&*G)IUq#=7C&8JK%g({X2Dq}gDRXaU!sL3BCp7~%Q7hEL?A5wRmi z`27-3N*aUQSXX)|Hq;Dq=gvGFbJz!@7mI5AeYG!GG$=9&Ez z)NSefS(@L^*Tv}kSeh?74a*@AZkSC5{bJ1IkL6{sh9HUNBVwM|QbH=b3 zzex!5qZ%#{*Zy{{WLtGAtc%a+!@J}%6MvTG=fH0Q!rZEcWBUBX$F;zZBh0S8jIHJP zM#8TfK3695lLfA&_=*r;4Z^&4rVPg(Po&S#j?gCszhIPu(NTUVDrTJne#=3eb(A}6 z78O_52*c*4|KW`_wM_hN*ZlXsnt$)B`QNy&rg%gDj9D|=F>dA20porFY}kY=s;j8D z7;BT;gx?1puaz=#Om;yYtkyHeV8`j?^LP~p%`Q0n0jP=T8Cf~wlCwsp3eIVWAUAUi zb}zS&%N83~QkNrxKf$;KH`QWqax5~dIf6Mgx5Q*@IT;tG7L3EX+~9BrF0rhuvZ_Gt zm}x>xnf8%6coI|7OMA9>R2VqiVl&fD{}wg}Wvq3$tw!BxlY4cZXGk9wtl>jeKKWcM z9}v$uzTHHbFUka)Cv$JlZn#{5C+6qaGm`BY1@=*?5^kMIIc!7)363P<3yys_wALeMmct;Dcm%KAP3Wo;M~VMZ_j*#ON_8xtX#) zcy5Kt=M^A=wB&4i_Lz|^ZjG9UFeO#B4sLPZ8TUMcYfV6DxmhE}p(cvDWQPY+F19~q zYFJ}ZxDT>OjrSI-R`}N8w4A9mqEvh0QV$!7s8E^ooY1qbptht6ixL_0Oa>mAo}8_O zuX9pQ(KsCjL1fvhQx3e4L1?CaW-@{;0@f^UN%YxcD4)KtB&SfyFx z`L2`~SE_ZMw`bZ#=`nIv-j;TW6>kuqCI!->AR`b@4#!O>RckIFWA_MIE-mt(+m=K0o`_VnHIpOu=XYv@%%5N8GmO zyFAyXgrFB5yyceEy9eUs7yK(CuB!Ux=Y?Nh8+qPmnQ!0vsG{5>_>cc~-`;nxpOVz2 z)fo$#LdQRVgB=C`P<;C3GiTgXy=mLf$D?{x#^ib>{A=@O6ct8t%%-?=l76|VzH`4B zY3-i*GN1vgz!wYtYY`U)uDx{1chy(?eoxJPw_XmlSnz*z4E$naz|(E7D=B>7nQNbd zJcps!&8FXGKYHKSKkj{X>iWCwZ7-RJ^jsnM4NYtBspxP==h9D>q&)R};%FR_F8IEy zIkpS_!K)TMwc)CFSFdX|FRWKooeir$pf~&5xp$J_KcAi%wxQqN^mW5Je|t}8LleqN z@O^gx-X!?@`;DnvbL$hQ#66gH&BA#Fk7Gg@c`%!THtj$Ct?QO27qyEy^R^Z1`(vv) z!GAU1QnoQGVPCJuZd+RM<~fl6V}hR$Ipx$#=HK~S#oZTQH?;WnH*m10;NQ@zVrEq7 zww+Ih)^2E4R=$NzMcOd_FK>jwN65~eMf)D$HQ_CNjdiL`Axp|L_ z+nb9mWCY)Lr{7hA@4H&$JHhu|wJ{LmSN>M1Tq^j!t5jYVeBV_nt&mo;smqqHTYq?2 z<9pNo)h=azm%|7W zCq9cq>IMJaw-SODjjiLBlv^+PTsb8$@j^f7B5YH4_|8{GA&7!c)=_^*gbwiKOzaESu5Cz|NRnfzOKj8Ku zb6)({saNHH-T$`x#%{R~^+)idr$5~5@`+1+X>5Le@heSx(I}sG3ZHwyFHJe4H+Sz8 zxN>~f?D}ut!-{{w_g(e#nBb2by*TZx5#by53|^D`Y~sJN&<+Ux7pD7v-gh|c@ta~_ zF1q{rFZZAxqRjlQa=JzE|9#cGcMIoqo3VP)!h@mLeupyLCiuhdOj`N-p*0&OrR;wG zqN>(sU>^yL{+Ugy)8BsY%vTnNWk2|tv#{{C`S|1&eBaeZwSw=vI%$dE-@Wv)Eo(D= zdh^MpzqB$x-EA1!TfyIy`QoY}eOx;V&Rsft?Yqk{*PDvY!EAbM_IDRQyy)UnZ@B-1 z#h+UioQv`m{Kq~Sn0r}n!VvR-b)$olA03PG75ws*lb4%kTzcD;?E=O{J-v7#h6JFD zm`z(ZUN-urUvGahag%awPISRK^h$#N`O2d1FCVz3+f)CzG<4~QTgG9bx!`xWr+dbb zp*b&{*Yv{mV;`J0QBi(Czwjx2^+rDIlAodfZ;FjMBaR%=?_^yw$Gu0rTDib{_$J9<^PxOO7X zS304!w6wBzR^c%w%wKJ&uBv9y9b=4IR%i1=K`e4>p}dR>7_o6B1`7+1u4s*mHBZzV zz_#P4>z2A%KX=kUmgj2{Dr8MS94*MlvpyRZoF30JMWGyDvh{L3mUQ^5ZDrq-4mXQ59otaOwg?F01%r$<#qPRMx!|8Gxg;09O6ShoIZ zpxXb%9%GbR8-bn~{mwB);xAn@>Pm}Fu<}q{Tqu)yf_t@DC$#^bHWg<^)}F{Bo>|2V zAJwZl?U;{1@mGduFqxa9efWtw$i=vDy@gzR^y%d|!|rJ1b0Sqwh^MBQ?@SAclqOXo zsq&DMW9i7;FX(Z+PKHR1JtZyF5V02=gm5gG^B1Mspd}t-lv-9#$X*j-LgY9TBHqX& z)(~!)&~hz8hT`M&!>Eqo{3dNjh7(mlvumqMr&b^97mB|k$BV@A@wnrZv^Ajc{#e;KVQo?2UVf}2L{1BFcgMf-95HPO0{1d1JG zm4^{wSnETK(_{D-lQ26}3WKStBR@!4hLKGDxRt)x&Dxfemydn2qvE&CKa9gP!Z72Z z;3yPxBX*OoJ7p(tcI})0lVi;8R<5669vzK)`ZkTTg>lnsu?=?LvDtQQpX^9%eQkM> zak!d)-r8+>L9aEFCvbTk_TWARv9#3!2738pfF2WSTmlw@{}=`YbpifkU=h@n_>ZAY z!ve7eTxpI*Nz9hItEJKrBYYik4H1aFv#;>-FNc3C;ma5?8tlj4B;+XLxzvxpe4?}f z`W*g)y%wM`O-#cg{O*gyKj~n}rf+B}_9zvrM3{KZ8E8xnaT{u8gWFQqV3XALxMo2* z@DuyKlfhfa;2?mwgW`J$cVJ3XT!R$XHN_PWh}_6J0I4g)Mz7N_tO3c(vnV);i<2oa zG>54>dEx|*tSpr04t91sn?;3dBsFb2xAu zkj7uRz#<^ZS{xuT3CO&_p4T}CI05JcV(?aMGEe_Ssz39MfpZusFH@;dbh(tjHEr`C!y;E2@1M`Pj`JZ-W_kYD+|;#6dE$jt&BwX7K(O zEHYnA8^un?`pEZ?1^FF*tMH5UsxQ2UVJM>qJnDOOgwh=I!1};sM61j~lo#_= z41^ez=|JXj29T-ggr8hMKuRtkAcZ}~5tHNvtCYX;L%9W_+-zz&Msi>NNED)(O&b~} z6e72Z(+bgQC`8O#s2lGy!9U_>!%uS~K`?<@S$G%XZuohh2Elun*%A0Xq}?dalhq2b zK-+QoKU|toD0e2%fnO2qXlhEQmKPM2&MK`ft*Z3*?u#jPV_`F|-i2ME7IqboMK=>j zS=6Y79R*qzHYr)yq(YQvl#%3NZI7T@-elg1JC3NN^1GqBXqxiF_unNI;z;rVrA2+# zRA5^yRA?n>dht}pfEYeTFcTGHcXLl|1tl5#tvO)X;xFtJ`SMz<@F zHdTTl!g#EgVE6#jV*Dr7JYi3guT4B=$`OY4wWR3WYcqHkU7%t`+GsXCy`~s%9vwM! zY__D+!c-Q|HgaGWb5X71B6k?04KTau025zy#+H8PdkcM2h&gYBp~bG2LidV}{_vxd zD>_KAF_4bwF+Pj!SAdE2jL&MjdG=`EXJO70VQ9^(Jdu zC}Ba~b_!Z`tcXdp zgGqk&DrXHE8K)>2_|c*0{91g!1%3{~^onPwmMy*+UoOH-P{SQ5zG8$Km>{AP^~Ik> zI^&yxFcoUJBgHoxVMY!7a}@VJ;eccR0qCkP zK3m4c4+4Mj{fcny(J+N3%W!Ok{H5<(gd2-6Nhva1L<{k8Bi7#$W@x$$$Ck!leC<*1 z7a`1jnKE3L7UJU};di11`ve*>T}$y5Bfeo{6=g}T4A%+ZFTeLAzPWkuyHJK}DL$S< zbP2)?o+!gnS@##;OOQ)5!dzY;!|C!fw376p*jB4yWJt*6*jGeU;@JED`4tgbCjMR# z@%M^|zgI;3H?D{fZ|I+05%CH7q)4oYxLf~}D_}eY)dg}PepvXe{(K5*XL3P9SokeI zzHwr+p|J2p{(SWNZuj*a$jvRn!t4F{==a^>;~SsIEgHhY@AT)R-*=Ob@4&cNao=Kp zKH@&^5W@u!(qVb#44%eg5YG_js+ z2QXncFF3p>%5^puNMO0a|LdhG6vlt|G8B(BC;wj;ns6mba%YT*ixo^fdu%#JvE(|S zKU#buR-a%*LV>0XD`Q`4bbk4oO}Ap|MJg+XWe_CH2xqyNd@0`waUwa@4Ncs8^QNoHPRjZv)SakDy35JeOI6S zOYnWq9{E)8eODE9K%Fp~d{>zi3%>6vlcxpWceTNG!S`Kl&<5XF{;c~m1%GCbanUt9 zT~Q5#9=~gF&7p2M6kG6pSBJbK_`a)EA~Ax7a@_y@J5?zevnx(9eKF$a)`eKWFZjNz zkz9iByXxp|!S`L=!f#l!$#<1Wj^O*Qmbg^#eOH;hF8IEyQaWH%&fn^j62bRfee%5E z`>s9-6{|*kSD#!U_`a)x8U){WRnSv{@4G4`0P_U?&V-2-eBU!+E)jg+)giA6zVGT2 z^C^tqca=%5;QOv7St|Ixt4V$leBV_gBQPdlHu4#D?bWfF)n z8?(uG6;!(5`>rOrP4InJlk63I-_;~>n87led{>ijO{Ll7yP9O3;QOv7`2p?rMvk|% zFuUMs-g08?*Zw-Qh7)DW0n3-am%3C~r#ER0wnyT8W=?*I<&g!O? zTWcM4INQaVIB`~?zC`Hnr7jbzYpQ0{O#KtG^Jn;@Ep<78_4(KrulP$KO~b^ZlNOo} z4?|FOK;lGY#=SnJg@=2#UB=}iM|Hz-F12VuTw;02v4}vkSNn6zMXHM{YirB7MCGXR ze4IAIE#>)SF6;29awo&~SSy$lV$%BGa(tS$KIM37>a3|)VQ|!@v&XekPb-63!@|0w ztMHCvU*hJkwj0)awD9~BVs`HD(Z{!>Lzm!*UTISM_qvd(*_E1wc>mY|F$3aeP*XCP zji02&XZ~spdhkE9h(xxo$7n9C*D>P~lH+M%^s^6-C6X4TA=iu?ON4s%9LKR1q=i)d zmoDS@t5;xny(UWlL)T*dL%EN1wN zmR`8mNF=CBB>tM@^EuU4+qf93wie@LK6#FKGHn0kDv-ZAi-U3Qy>+tnYTcdKVd!%Q!X&TKcrG2iUo6Em_7k7Ql&za0iZDDfnS_Tg(#VzFiioT zU8O>l>7X#R0A86&Vf76tOb38>wMvC3cY(qXK6v-4REY8tC=ADgw_K${l=nb|3*HAR z6{741)j{wMs8op35%X#^-wai{s8onD2o%jyLY1K^6{6&W>L_>3VUKLKeZYdtkpMkxi;s$}b)9%;881FOs@rEPa zr`=D~BL~6w$TP-ed@wD_YYAsIE#yEKG?X>uK4{2lmyu^Q_6iJOBQ|QwEw`NFVYS z$iUO`&-82QVm`EMqddv`v-veV>exs%0eI19W+5EY>76ds>*&E)(T*u)vQ#jAt{-%w z$q!TB>IzV|Oxf=7N2i5jJH;QJ#`71BZ6SYjS~#|Q{LyJV8r*3{cN(uJc>K|kHxbEZ z`ht}Gpx9~$DZ!{Pd~T2u1&U7!Qer?c{vag<6kGftWjrXh=|M_4D7M-`iW3yu=RYA4X+7FOt1?WF(V=P_twg%266vN&BubS?Z^S1hLP|=6l$40%Q6iG( zmI!;?|A<6{UF?aFNDoyaR#hTBRf(L5oJon0k`f^$B_es0h~&8?LVe>uArWcudm{=r?r>hb<3$&C7DJc>)?}B+=N7veZTU;OIx}sY(_N`wYSpSWw?uSXk z-oLDEzl}}9?~Y&o!=nY0Co~5lf*2jWMk`Paa|o$!?% zNxby-@Q2l;;IflA!;gQU+66|!PwUXM_&*RGfNY=G0o;IJoYG!!)u^yhf=uHe;Cx0R zov<7)tS*27XADfwJ&ViG;-Qh#_C%;dHj8SxD|=9Q9@^vxrM9L}_%b~X{;H~lFX;|S z#nd^Xft1^WCxNFqriq;ft2qmaZU73Gok;?a$s7ng9XJTcv?l`DiEyb~8)d6Xg(@Ga zRERPTG150w8Lv_y%KXh(pB^}`Q@?e2y91gs6jy?&F@}ZyH41&QUdSo9O>;d|f`v-Q zLT18v%|c>tL}&EZu2=|8{9?QcfpIbpF6JEXuMm8SK#LtWgtS})9YhhZKq&GEQ2<(> zln9RI__hx2aT!vP0*6uJe}haXax- z#QTSnbLS40to58S$=Lai9k|0hzWa z*V_@z!05(_HcP}x-q@HG7_h~)&h<;gFRsbK47w3PH$<#Out?W-#E=!t-4w)K+*x5` z#75WTFm4bdV`gyjw?|;J1yE5D&92F2CSN>Q#OBJgM67MhG7DDxVKsU)?`X_oJO_Ks zUp}u}lO?Gvs44K>olxiPd0P3HT?clzewC6h3o5~X1wu&78!IyZ^VXj~?zPsn?&nRt z)?izjq+T0B*SSoML9Vevn8`wzW5XKr!d%H_WOrg?n%R{h9@?sYm3i&Cfs~^VX8m%D zE2e&D;QXKJ+SKnd&0l}{K9o@7d4cXiM+DP239N#kUu7k^JnI5faWvdd2Ylda3GQ-P%93nkMZDZK%75nkW@fh%t@r?K5uYEl= zAj~SH*!cXHnP@dNY_-^o4)oe1g=uCQYk<=!T!o5q_Py) z2l!85Ch$q%7~r$O%YiQe5x24u_$Uyckc^c+KJ*iJ$DENy#pnREScD zSXq%ml^H4(qTB&WhFhXi`1VUepq=>1-o$R~O`gP)O6aAvR-!k#4P5`d$vC~YaQ7xj zvNy4}*qbCZvo{%s-XsgXNgK5{Y2&9iNjkdT#5E?eF)LE`DF>UdXHHI2ew6)r4uyz( zqEDG9`jm0#Qx1zhrQgPGtI>t_+t6*T)~BFp@5er+96>+s)(kqjajwnMtr<7RpkEQK zeZSYct?jpw{^(xf_Xe=@h*-@|Me81LpN;%h-juK0@l-u#CyCKR2Q*b=Rb zN5SBAOtB5mvmf4qo@-mLX4kr2YkuB@o-5^uJr{eev6jX>iz_)2olsF@TBJ+uzgT9X z;Odu0Hr;RIBaYmSp^9YMCL$L5SXptiMUf+^q8m#RdnCELF*dp0-IyE#IofXQ8^j>H zvF&)J*m(sh-+_WA3F@HAvnXBg(nua(Z##S~N~}r+DT6@Cdo%QKAApi+`2-XjMfa9m z_v1=)-1Q*|7g}H7-QDf*@=rvh#_sMTKmNwalr3^C_`skq-`Xy2N1Q; znFX{1D}d;Fob!N_f$ZK2fG+^20I9we0olz#b#lH7go@>)3U@gWU7d0zFc5OM3K#@j z2s{ILJ+L3}M&JnGB49G`CSV%yRv^1QbUDrmz&nAZz`KCg0`CSQEKd=4t^wW)d=1Ea zzXj|JWF6x*yGyF1vb!WDyGv3bN-a`}k_T_LN`+8a5O;)9O%POw@|ezhQs*tR<3`cW zh!3(U#xC@&0DoQR3*h?iLW}%#p?2AYPHC|VwTmva2wmtnbfLj&7aHuR3$_25F4UDD z)tDD0JJJJa+O6nFt@h`GwcMg3ooh?L$Js>NaM_K%iIz9fbpV}WrY$CyePcJR_p&vX zqX%R^*SD-y#9G{$qIR|Y-b5gL^|*f1Zg6eswvwNCvQvv;r-u8Y*|n+tZl*1z+e#68 zrY(tq`B})wMPQ^NL0ls>*hMeOwKn2Fem1&gQAp?^EUrVYO)C!d2w36D3X3=tzd2w< z#G!uZyj&Z)9Ryml1t6u}4kCDBKy$=zjcH-%-&aPgw#%-BD%fHq`ileiQ7MsC8GX3llJ9k9u@nz^^jZb_u%;EKaYhsWK~xHrqfND*Rq ze#DltRskyjV-b@L-^(H!$XKN7P;Oa3{BnNDr^t$fk6rM^jg|;4lOk_cB#n8qAxl}2 zGRpzY+30N}e$ygJS0iy}Ey^cr(L$>bxs1X8=5Fr>KwuG@8q=a&EAfdvfAhSqD?V*q z7Tk0V+taazPu;D%6EBOcUuhEF%TSG!ek(Oqc#rDjij8Ul| zWt-M)l-7KmJDb zWRjQvd?woPHU2BEywww?S#$=#mednPX-Rszs?`SP1MMy7IFZ2Ncc?1gU+a~;Hz7AqP%cD0Gzoh|7o@Rd>mfR_WKfllB6U_EdYumP9>yb8$r^bcSG@M>TY&;_gmE&yH(ybg#k z%0l2{!0Um}18)F+30wr+17v>p0im)uLs8dw%{Ma_KdGjWl4=Smsiv?+k!lL55aoVI zK!(HUg`i-2r1O^Ryk*r0F1ik=DbLuPxH4)gry>EOjrI80Zv(E6rgEy?)nH=*`cYP@ zo9CSdU&ao7-p;x)~$Lt~Xt4`n~Z2h2x4g z$;l+nD@f&JKe`1gM~-8jX9$r;C?^wK;zZuF#UnnW*7(K=p`%3hjmiXo9OQT$! z0=8hBHY(t4?yD<0HfRx>#L#UgXdv=49-2izJb+pWR1T^lHldKDMyijp)gBAZbilG2ABP>(OT0wik{^S@p z5P3tcq6`|0*`UEhQ-eW=9FrYEpsqy?#!dx?*ZAKYaR}N7v<447#`OWmvEPqhAFwjw zeW(dBW4pbN8xmayBZ$$6NMODIdoEyg#K)R4;@U`Ms5yeVPlD@B>MxP;+k_gD81Xjn zWBf-f;(uT9KRx1YcEl^8hV@(F+Q?g?kjl4_+Tlb5kI`>h4J}IO7w*7THBbTu?Kg?Q z{GUX93_6lkM9d&aQ4*tvXQBw0ApWN?VBf|xn=xRD8gRG>B7>(hV02?zUt_>@kAQe6 zgn<-BBMdblQIqDK+7y<(;*-F#u%_$ZLMyBdrC>0^wRQK9%i@|+vIAD^fdBKTv`W8q znyU0is!*7CO);)AJ}=v?3W<@HDZSQE6~ZI>y&?9)cUfW^JJqiVtlx>Z#kEMhbgmFg z4e&(~A?jB|H{H$zxMJ&f1&RrRou>KAdqvLbYY^&`L_xQpYr>Cv zWg7jWXYzM?hk$)oxt zdCO7|d?$Vitz6_hNg8L}(KC;0KcBiXD}(1;$#igi)Tb`&kk#H7DoFv$P?=o6Dy4Z| zcYIfJs${oOZ^Bt4KW`QOInZLp4g1J3vi{QGaOh0Un0F7)5s8wM`fVl@h=8tmRbxVP zq~uC_45QvOiHZ}xW5?I8+?S1^9dlEDlKpuG7Lmcnf(W5QWj2^y2UmREcEwknLk~61 zZ3x3mLHz-{I%?!8b=0BFo+IZSoihO8}d1E)x6AX*We-_OP%i=j;dtft=-NYIoyNR_x zb`$G>7XsG)N5Dwn4j>2hKLz#&egRAd?gVl^eix8~{JVje7gzQI zZwE3RcLP@eS;o9(jhTXC2P=g=bEngzx38ru&jG)+ru@!N1PQ%q4 z56)S*deVcFgsYt%oYA=AD2+QFDkAGVI2VDl46l?s%v^9Hap~qXf>Z6mxeXjz-Mhm) z0S>M2-JF%+1S4~9&U@fQd2pzx(<%nn)aA0d8 ztoLOY<1rcthO%JWjvz{hR{Qr$%6OznYY~R;4JkVJp&~!u?Ei%T;IR7Z-HX@8M zX7^zrp(qEs|6}h<;G(Mb`0vPw2q=S&ib**oy)-vA6~hu_5fTAeHJ1?q1w%j>T*_r^ zu%Z$3Rj+-qm+kw$z8-3Ym9Mm3|DW@jJKuAE z=Xdt~+;h$^Q1Nw{&DC$Y+*R;+y4)uEV}R;%kilh^$KP_9?N@-w)8$}2T@qE7gAFdT zi2s($-3%^=>MrN2E{7Ui=0q*PGz$Mz%NHdgfF|fXbC7KN6Vsx3cGr+_)Qghj&>lUjnTMRDu5VjV;oFSXPW>BfoW%j25ri0*N zDWU42yS!3$xd&X9+G|ycqEpryC=Yp2C|sqqrgpJ(TXW|*15ZQgyxKM%`w<1;aA7>a z#C1`IJ|Zj$fTZ!t3l19~00&i(Wt7UQ$BR=3NzuZy%_}^f^^3!c029}m`$D%Ut2)c* z7snP5T;t(aZ{4r2RF`{;6tmkQ?QLE|6@8a!=;;^60&s^DKl=Lhh5!EE=odo~U|Q$l zSA_1@kE&l0!Y@ykIe`c;ajd{{Tt0RhnpfWxV=owB;_9C-w4uXGFr%0DQ#8E_o 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

      sz8pMqND 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 z%0Dc%hcwA#qp8_UnY;YMB?sMWDW6beqp9L9$*aods} zCs^ucp~yy47vhYq%RinstevIa5sGXyg$fVK+~q~@AMI*4c9qIXHk!JaDe2xk?K%zr z#m05KP-LU2IZT;0s`khMXj;r&o*)$2XzCKCOdht@pO3D

      X~j8%@n+N-o>;`~%-) zEVWiBveDF~Oqsh}a{H@~SgO4^N@Sy{%a}5~UQMseW0pErD6-MiDlG<7x3SU>9Ki#NStsi%Y@8%SUqFMpHL2)f=yLYbeRk&UKqX3FGz-O3Ou zjmh~>g(4eG-NKZqUz5J+`-7!+DZz(0$VOBD#u?krcU(N}b4v{_!G}1=MpKJ%#;#<= zHh-VBR6_|q#6dQix)o>adgUKS9*$<%T-Q}4_z(x#XzDhcvFos-7uH&b2kN=L_E`mDFqN}#XzCuOaFh7hVNAzHOLaTQIZHO0x)*2cU4FQ4=ie>m6N+p!bstkEuJb<`b+Dx- z2}L%VTFTTuc%@^v&0UaTrbI0iiflA>Kh9V$W!HxzEtYysD6-KMx)4z2E?@BV?`$VO97;EcV?XP;Hl-cmgep>Lwqh0$AnsmPc-#3&e&C$^Ew`Kl%>8E ziflCX3{xhq!0K zKEy#bnnDprT*i;O#{cNcmhuZlHkx{oDN~mpdaLJEmYO6K*=Xt|raIx3juC5G>n%lV zVRVp`3op+u! z&r%NwMK+pxohfsdJGWk)wA8mkk&UL_V9MO(C&sQoVoeHr9DxsUkd3C^#2LHKVfA#s zi%JVcHkw+;lu6;zOQvOPT$c((Hk$emQ+wc*j?A;iUSp|8gd!VFy@fM256>U69L2<3 z*XKf!ji&y~RC~PA@!VHh-;yR{oUrQbF4}6G&Y&7*g&J-8nCh_sV4y#VG)Tu&|jix@p8S5=4 zdhSzZso6r2jixp*)f2CD)b{>!rlpn%wE>@K>O-8dDSUL?e3+O#+$0p)XzC-TOrP@L zEpyMd)E>R@Ar7+9)WJvrHZ5W1& zFxPdLP-LU2Pnk0J>&H_MnrW%^LXnN8K4WTEywZ_eQFf!H+QavtgKRYQInG#5Z&1;U zIhHz7D6-Mi7feaR=Q(r6>1cS&b)75}*=XuZrh4F&ju-o!jmE%GR|rKmn)(W7>@3!U zT^~l%VyKsdA{$L@Vroyk(h)t<-DdcRX;WrF=q>ji$b5%CrD;uAQ;fQqzPY8%@Co zarMG09WQL?Io(nZ3Pm=Wf>Q#@T-VN9uPL+CW}(PNQ$I3g+KsaYzx~Mb7sR$@BeJ6F+!1zreFlh#MNujfn6+htx#m6sb82f{qk>3-l(Ns5{hgz^(#}| z@k+{hYI8qp58;WBcX14j9yEsT!fk zMpM5tW$yAWmxY&G>I$LAMpJ(<)eWz7oVn>mRCklYmxUr5P5p^8wudbrdBqq@{U{XK zXo?=wvUT~MqJASSb?7lLrvo;cqQ_xv|8@7&`~8+0D-_viY6qtFcD~coCo{H(r7jkV zY&3-*r9)i%2{o*5i>uvOAr#qYiXPpy?Z(@Go;AnD^_@^;qp9{xnRfo7==_wW4(;zG zfowE|pT9#~rW|gLW?*RUSGiDRqbYjK*xs+Rf7)%RrREAnHk#UrDU%x?Og;{cfr;xe zp~yy4_#r;TwY%hD#RE^FkucO2p~yy4^hmVr9ainX`@byJV}SEzWTUBFm@+9G`O+9y zYm*j=Y&6x0DbsGmZn|K#jcc}0WTPp1eA}k*__t@cO4K7lk&UK0Gi6$v#TQoYY~%Vu zD6-MiZcKHSJe<7SLnm2k?^5S9*=UL$HMixk&zkcGTWY9KWTUCBOqu)Dc=gRUS*lqm zve8sGrgoDQc3!x_)v_%TiflARkHuTRci+IX$J@AG6pCy#)t#vwC9XH``Nw6J`c){h z(G)#vXmexO#YcW?slAVNzKm=%MUU{?X9H{BeD-ZirG+9JP3^^07fIo^7l)zYF=f74 zD6-Mi-b}&C;A7c-=SD2GP$;s|6#d*lagm`8DA_k@sV9UY8%^!Y)V>nes^Kr*YpM5z zA{$NZ$5dCLE~yN>WvTARIj6}+Q}ojab|29tJ@)w0QbUCz8%^!clqrXgeR0inOHCDu zY&3Box_b>PV*clH(q1MpN{&BX$%JJ3H~Cr9KjhY&6xIDRe)498>bl982ws7L^XN(NrI%%>Al6 zw@-tmh6zPBnxdabvE?w?J9(d_&K8PnG<7snrgyly{ibs)b%#)7qbYj0-_9*xIqkl8 zEVWiBve6X%oQvI8IeSv|VoUuj6xnF%7^X~atp4JP|5<9k6P!FG8%_0RY7ggQPvfxW z6D<`HiflARKRsjnlu4(5(`2d1LXnN8N}1{|agE#UQsbiViRjBjl9~!f9 zy&x3XXo`L&$F4gJDC)b>QeO*2Hkul!s6~Hl>1U~Z;d{_QHkum5lqnmT<)fEaDl8P) zXo`N)$BqJ4jNRb!0UCrN8%>?Sl(}DZR~`Mnjq5t0$VO9xnKE^G)A%2HTk2(@$VOB2 z^Fy}uo_+aY?^^12p~yy4Co*N)sCF4&*iwfMaq^ICG&PhdQ+hj}`m4)x7$y|iXv)hJ z8eBeBZM|omjcdA4WTPn`Q*c}P2tT#lLPeyh;$;S1TP-LU208^%S zIAzu+t`_?@p~yy4L8kVW6yAAK|LbjBeNaQ`ARA4Em@<9J3IFOc+fwC1k&ULpOdaKX zspr%ezHYJ99HGcYQxT?2iF)|@ua;YCwNPZEsVGyXUw(b<>s6NeK`64(RE#N;8?(#L zdBRfrV%$du*=Q=xl&L8luiX5HrQ$-7jiwSznX=LG{^Cn5HAN`0(NvPD5>5%`qqdw!hT{0fg2SSmJrplNyW#hzucX-oMU3|`$k&UKCGG)r)$_|}jY2q3p6xnF% zB&N*hrgZ%AM_OuOq6hk&B#@1!PGxFeN#Up$2BAorJj@71Hkum4l*#!n z{r7&xQs)UpHkvw3Q3t$n#>VLhy z)KZ-S&UcZGrp792;?zeTwbT%y$VO8YOc_7w@UFXcuvEQJWTUA{rc7O4{@tFg+_+9C zve8r(Q>Op=b-Q!;7w5ah;`p7m92&Rl}6&zkd0q|4WuSCg^+_ z*=TAUQ>I^j?c5%&`gN*MWTUC^Om&hJJ~HT}FKk@r3Pm=Wn!uFlzlz5!xyn+v2t_uU zs%6U5$_K)up10KVLXnN8PFK`^op#)2sb7U68%<4Q%6MNh-XG_7G#tKC?nrdOn^j{zTdgn|_Ef9)qG}X$KDI1e#zTekUPYXph znwqSr6F=PM>S4bSiflABg(-7gRgZsPW#j4!-<}S#(bQB$J>Rr+m8C*Lk&UL#WXiNr zj~wKgVW~5PA{$LjW6Ja?19q%-`G>a)MK+o`iz(yV%)e&h5jL*>3Pm=Wn$FY#eAOP0 zH!*9RrG6BOY&3PYqBhQ4`JAQtV2zIsveDEzOqmpJXguEK+f)lhHkvw@se_#_^?Y^K z+3(r7W(h?$nwr6sY3C0peZbYHJR%g?XzDzs4wbkLtT^dB8`ox`$VO8$nKCKtxKr=V zmO3crd>PqjY8F!_g^zFhcA}+52}L%Vn$46+;eY4tU^ellIwcm`?p*r z>S>|KMpG9sWy;~Gx4J{3N#x@Lp~yy47cym9fRBFs(BjOs;Bd%o@<+WUumgxg(4eGUB#5i z!=XO7&yMpM_RxSpEU9o5>z^{`N6qp9neGObN&@-j4X zhWbhP_RvebTQCpXAOQ#Yu%jy&`Tm%kAbiflA>BU7gI&Uo&$pKM&M zLXnN8Zeq&R<@$-Q4Y1S_p~yy4i&R`6oHgNmOT8@=*=Xu!rc560{bK3LtNts{z>1bE|8Y&doXzJfgnNjvz54Iq#Gkxo6mYOFN*=Xuk zrgoMTPP^9X|mDO z9ZZ!7Rk`z!!!6ZcD6-MiolJEU>g%#STzNQAD6-MiT}+u??}r|@)Y`Z%5sGXybvILH ztane{Z}Tj*LMXD))Dou5bp?}0x~Ol2A{$NJ!<1=lhCjC&#oyeo!-hGROE#Limnl=C z9zX7mt1UG~D6-MieN37A_1YjmDyWHTj!OrQ=U4H8EuP0mTpy5su$VOAkm@?OO z^@|m|S!#q(WTUBvn1U%EQ+_$%BTLN?iflCXFjEH#b#(jNS6J#cp~yy4%b7Ceu-jeZ zwpr>up~yy4k1*9s;+oJmzS2^iM>wa+MpKU}YIL;hdP@a_A{$LT#+2#xp1SzG_boL= zD6-Mi<4heWDSUPEk8>=wL@2V+)C#6dZaiFdh^y`0AQahX>ItSyZru2E_eLAn?qyCA z$VO97GG%(A6Swud#8OeA$VO97F}1r~*Gr35HCw7hD6-MiN=3bSdG9`!x=ARq(bUsS zb(Oe$YkDAKOig)FD6-MiGfbIYZ}pLzT3r;&Iwa;AA-*pZ*=XubruGo3 z>HRYRsQiflCX7E|3N zt_5SxgFj=atArvOP5qZClfsrK$KGeDr-dRLO})*OY1zKr>B#Yx`avkN(bPLknVc^_ zt@~z6^&IUaoNP4pE>pO*d~AL8{+}(C6pCy#^&V5ER@Pm!vc^)Ag(4eGt!K)laM#TI z&n!OzhL9q^%Uo7$wpHjD5|W}4gD>3 zyijDLsSQk-+_-J|PJJykUMRBB)Q3!&>-wYlY}fc}p-^O_sgIc2Tkh9S|9i#dAFdUO zY&7*TQ)W!G;PHRlWK-xl)%h~A(bPt!jK6WhIoG*-fCGdg8%=$psGGg9eQjLBg(4eG zeae*amJj~^w#zJazEEVNsn3`)t>~~fADVBeyM!VeO?}SPu9An(?l8)g!k2_18%=$| zl&LBI{OG;AY+PRpMK+rHk}1<}Oii@E&Qg1iagsnbn)-?0zJPRQZ{Wt3@cX(bQ(9_L1CpYmb+Xv(#Nek&ULlX3F#qJ8s^BcFDAd?+HaVn)-$* zQ!9I|*id4r4yQRuARA3>VaoK&?@#OD>MQ#TMK+rHmZ@Fjx*lHtL)^x7l2Bx$sqdIF zDIB%mMXnjMsX~#BroLw?mm8aE-?DMtDiqmhYAaKw^mcmspC?&rtx#m6sUH+|?xDLa zvD6l!$VO8?GPR%N#+*a9x_Y86@Js0+8%_Phl&O`yU*0sr#uX5XY&7*VQ>K3XR(sVC zmYN_G*=Xt)rp#Twp?>`SmbyeJveDG9in`~uCm*%cy+VI-uq}EBWG-dvKp~yy4zcaO$lf|AMH$1==&f7i8oseua^@pNrznRd-#uXHbY&7*J zQ|5kc?Xv&dmTDG?Y&3k@Tl*B!jAb{t=CNCZA{$NZ%9Kgre~bUY7Ea1;5sGXy)tM=i!kuj|Ui%#4yO~GX!l8Z=iflC1g{cGN+lPGlqtC{5WTkVOY&6xCDdPi_-8#tS zV^;`8HkzV88El{Boc;SuSIc&VP-LU2-I*$p6!tu5@JO4&=Y=90O?79=cn-e}_!yQr z#mAq}bdZgv=+7J5XNudux_O?Z`c^p<*=TA{rg}ObdrAg8-Of_ugd!VF?WN*+?dwCH zwbVkP$VOB2r~lYG0;|zfrPg&JY{d zq1Ddil8vV5&qmuPxw1nacliJ#gd!VF^{Xo~*CwS6w2{=uTtE%l{PWTUAAm@>I>bmRItmgcf;NQ6ryu^*@%X7K&^%bre%3H=ca$7MCx2nNVb-siT=PDI9X@ z{lD6{9uSIbG(~^v-uj1g_P*o-OT8-;*=VXCQ>J$qeOq@_HJsw3{RAf@8&LKSy?Tye z>LOHTO2;$j?LAcx1f@c;4WAC-%*i|A4;>TbIjW^*YKxfn=kMu*cOCGr;e|4^kVR1L zzdSpDZ8qR+d;FuL{|-i-BysiMp+r($Cuck!bLJd%M!va>zNeJGIY?3+SAiHhv^?M~ z?;G%YW7$L^;SYzsQ%m~}8d^HJrm1#ZZB<1}ZA1Og(&n0$*2bZwjZF=ebv2Wky@nf@ z422TOL@X*4{yOi_UOr#$bAQ+yi^XG^Kr-W<($r8tp1-)6zq7t|Qe{n(HV=4XiAW|M zjU|nFb90?#^1eEpPNZUqurFs@JHEc6rM0PMXlcutjWznK!`@`T7l?&?@dD<}wbSy< zqh5b18%ZWop#tW0HTC0LCg|^vdy|<=Ad`w`4Imd-+AwZt>BO2dhn7~>wlr%f=*`B{ znTS7_yWUAP&CM0#3td6Vn+azV=}a_ty;ZGElk<`t@rHb%P&{h$yQ;Qv0}y+KQd!$Dw6wmVg$s%P@|ZUn zOQ&P0fVZ_7md#BqC_`*oUo*a;rM99aKRGdPAP|cLQ>lcvwZ6Hvv9Y0vY)YG3a9^7X z-PV{l6-)bq5q}==SH&in3TCsBh$c|BTNhvWfk)Qrx5XD?u*VNV3Hn!AO4J|Ej z6JjXEzIeiiqNc8*x^{d`Gcu}8;S2=4p-46x_9e2Kpuce4gc89OrlM|q1M+-=tzAKH zD3FW?lm5Jj4y7W|c+6$C-FuMmW>dIr;Sk*e`O>DENextBt2CqsdlKTCNeP~n?~RwN#Y`V&c?%aUtg+iyiu!oFZQ5pyM+O>3rBO{l0Z zSQE3}L?D((q_R}#Bqefh-C2$lXOoFwD3wZDyQ)bj&h-_O+T>p<5s8P>0oTQun%g$f zF>fXrO86u0n_{dB*YmhHimUX+!c>kW$$wMRgWhy1oC+qAVT)AMp>-&5b28qP--jHJ z(haSxuSMOiLz9}<*aW^qnx?$oDea90 z5ot7`GuBD!UxT4kA{$I6sDjvQghSL+QHAp3PO$q{`cvLuGLcLtxf!uwHA+Y|wGEtH zDz|wlMJ-OGWASu6sv;@OhJwRK}M{#=R{~wNwF&dn$B$GLOr>nu9cfu_7qBMb2kJvJc67_q?1vHY^|HIDr1x0pf47Q zWKo$pxwUoF_`|hA-J(7gDX6QctkJz6YL-6{2uGrUsCPn5MN>;<4Sjo4%^9uSk5$w) z)l^iY18JR8`e9;#+cGsBa~e^gt#Q35POH zN~`K>YwBT7_mAT?8BfK)2uj}ST;HD29D6u+8!?n+hGz=H@Sf`K?< z&Qa7Pjj!hxth8-oo%Loy@pLo+r$Y$Ul(yD4RJK&qItAYyRUqPx`~AK^Fqi`?sf|*! zadl7(Y=)w_iTgwTh%aGcYzt1PXhw12a+d@BNpC8UP5S*=E~bYnY<3v^N!vr!vtn zYM^t+Bzd`xodzOp?^)XGhx3r~MFM$TJu0wvXWTac*%8mCB8f~YKbfdJHBI$gA=v+L zQ{=f#MYkXk0x_coX3N9P?5 zBvSrt{@oUcox*VywQY(?+#B>K(1C_>HAn8AX?F`mMlE#)!%SZ`FNM@DG^3HIuBoS{ zSX~yng+S1sP9cRn9&9!)F|~cQ1l5ikSA+YW*Xm`wkytbhzbaFJLw&*Mh3a2{;T)Q< zbR^?Xq|x`ajk2l%#bqjTv!#I@4UB75dSl)M#({}MCQ=w4hweHrsc2II!9XmFyetqO z7m%unR8-pDh9pL|;aEJF_B$vB;Y}4yXqNd3sYW;*m~Lp%NCw0HP{;?Df@6fYTMa*H zA{WTox>gLM-4}(@986~;nIOjIY+uzf)fGi`&A5uzI%Eld#+BAqgpfCeZrvAm@?&y; z+X}e{d8Qf6ai|FCbUG08VVr=kRoq|ugsAA@U^tb|hB;4MBxi?fi0i&Y)Pzhrl#E4C zICXrv?lR{psk{Lg&1U0a4B_&?zsuBsH}1o*DV)r|LaIWpu^-*{)}~y}pm=5@!ART} z;F9gSK9h;uuoze0eUa2TN3!sHvwR=7hc?wrZkU)?4+#y#QbG6;d6%hT#jUAr%0sE; zg~t={Ifc{}E7w5NOH8V$(ixlbCVZ)A(Cfqe)b)8=j=yp?bo zHzDd2Zp5}-&>bJ@L?)0;g?$-r3)^7Y6I5i%o65#w*+@7>Da8l{%~(CgVBEe_OS+xb zEbWbl-~yt!F^4Ft;cQ|mPi1OT4LQ#42vJ<(GtdnEpuI?> zqN$))rXU>uyJZ5*o119%lZHvU5rs#GF<>&`&!FPl*+=-{6eCTQ;3VgjQ$up;Mr>)3JOrW7xJnbn(O4$h~8d75K{`6H%w#7*eT=_;7Ovhfg?vHIWLY(%AfGX z(x{JB&6CN4sj8`+j7Fk#%7hxE+~u>?kGF9oz1egih+a7Eb;_4?WirHZ?&`FfrUn%q zro%9mo%UxEsT^kKEw%??h!hS+&>x00B;LVxus{q$)=)Yf;v}BY$}JyimeY3YiMvTd zOYNm$02xY0Fgu<_bU98YYbVuW&M&W}@kcQ^nh1xYu?Pq?V+V7L`>OJ0q;d1Zu|On- zI+16OacTnwY^cI0>iJoRxdM0-XkILY;`LYVj^7)JV4ffwN`m3J9H%KkqU!XB5>sNS zOd=G{q|@58uA&K3ZSFFI%k^jdSPsbga;D~16u#c5HGN`$j{SFGzQah;zlSFj61^O@~-WSXIBAC#2BKV8B@1Qr8$|mC}44vJx9Zo5t z$pUq)5pOsa@rMKHl(r_{)|nK@CorKGjD+L9U_uiz1yQj1@Ox1wvY0_dnwsHEk}u>` zUGxQc3pcpd7)nkIbJ#iC+)zBv76mgHO^1CLva@Y1eE62y7I>hX_HhlZn9fkw8}~F8L3wmSeSSA+qVdet$RXT2R^9wi(AupDyFvN(sjoC9neB)}Ts*6TT z5eWvOnHUubp7W7@Mom)WJSlq_VQ<t9Z!y$!1g8ASMe`Jb&r>M$!7k z{n1oBsi9nY@@D*#-asZ8jnIs*JCeNnhQ&OL4nrp4?ny3MjlwtpB`@cV=Po&e#kWif zlWWMS3Yr8f?3tu#oa{@66J*vzOH2j&9<(FLK*S%3!KpVbfoVqye=RZ)tBL{2LvKT4 z1tzmYI=wQ-=`Z?;K$JI9C)FhhAR2fBg zI24ZhFc0mZWyujkOZyES04Gg-!H8B~bMw1861X5qjQKO^Oj_XJ-_f~z##|&Oql2jo z`tSzwl5!4!>A(svJi)U=lmUM>i8wVUmCSRM6mtJUdxyb~$Z%abQTFjmD8lZm`g7a>^S@p*c+ABFrKo zIRzXMJCm+)WNovZX+?h;4Mj232|IDvE}L$gJ2h!9`o>HY^N*Yur%$2<1Gf?C3fi-5 z5RQpsC5Fq=|_( zDM6c`PQhmkrJOIO#uz?`Gl83Thp_kMQ6j)P{S&=<(cDh);1rB#=L#f5+`?n@>E-bt8= zt8JuFVe@#nJTzU5)tkIp6UDS|22~LkVul;JMzhd5D{dXuZWGaDB5Z+{Nf;RO+E-(n zDjf1g(TB${!%@h-jd|D`jnFD?IGJbetopUF$NDr166P~vdG@s0*Ty=9dFK#DD45&9 zq6gP@XB~6I@GO-Jnx&B;zAhoS6{s-S(BaA^zF;-9*9>M_!cqK(J0Sx(wLX}e5YSW% z9at(JPsaUun7at8TTZ)EaL+?nh{{D|)(GsKX_FTTG{G3@CegMQ#tPz;p+6<9k-!~&UYP(i$|*>?IZfl)yM16*tScV8d!hO%iiR#^MbC5lqdcZl*$ zWpUP<3Zf5$Kd7zSHF;}!8Mp#i^2o;Gh3wfOJd=ju&XTn%$1!9#=Iawkeu1b8 zjm5DV5sAdG2PTz|G*y?wbsAbav{xX8``S`biE3Tbn zP%bkkuc>86w<$$er6cAIVT%LO5w(TN|?Z@cb~ z2qKs*imC{>=cuh8hYX{g!>TaA(F%oQ(PSX%N>XEMQ)5GZO0XE0!bUV~&&nml860hA zzZkq|3>mTJ9<+e+M{|Rc`~+cJPBb0BKqD6sxJg+1(}rpbH<}%5I00iRY<-1a zQ7Hf8n12gpaMLI^F?-yMT`11h4cAJRx?^xbvgvRt0aqN`CE6~DW5qMi9&7&C`iA{4 zxfMA(BrdcC4@(g6V>4(zEzwv}&6A(*uf|kD1|x_tc4kayp>3*WlZ)HP503_$q_H<8 z$yO+bn2(x@B45ZF^F2{)qrlXd7n@x%mBdr1Jm2MPVd06!=9(I3B6e!7u3=>;n#f|R zH=Qj&R@PuZh&wO}&ZfN(M9`3lpS zsZ5A^vp($Wg|h~L*6cBlPlGPmx7>Csb;e6GIYFBIml-cglU)Ij0dav{OKD6pVYr12 z4Tc<#iSH(CN~gK&zw~h6M`VHt>@;-k$uj+2;RzgC;PzujR}eR>W>O%{1GC?yK#D zQOJvW7R6?8WGS`Y?2^z7C9ieSfEJ18J&)v?RoHeM7num4v&GPQ`()0&#RP}F$~g9e zW|Julo!z9&@WOXCPM|6*7;)RcT&d*SQCXYkHifXSB#}-fu&donyHri6+0H%-OnPN$ zt9dM&_L7TfruFl8`k_^D79Ld6{OCIZn0?8_80PEdM73Qc352lFE3X4R8w8qpG1{VlA~61wBsmufA}G+CCWCrDx6c`wO?U2p7Tz_6WvgrkRFE%`*#4Xm{G?6Bf1uS?mLhV%ozH zRA8OmiP#NXcpedrOCX7kI%p|p%df2A74kRWoBPpc2V=Mn>zVw;b}&2w6vg-&vwvQv z!8Ap_U~z?4^v&GthyX0lPK@2D&K5W>kqTU%rtZ)YggGkyR#MlzWS}gza3XjdCk}*7n5%5;x zOHue$yjTWF_=E9OES~aKV&4Q749yLN2ZhO~f(;#ZwP5g*No3>RzgQi`&TD@dONJ3I zH)QfC5$3|MZOwh{gTmN_iXBI3$IfYLwSf;Sd~jeKg91;cV8bCi2xLn}Oz5eU+&Tx< z-a=&y18O*f$ah=@T`VTxsClcaX|sroMmmy>N78Y+Vm38v32k<`u!mzC2251OBfc~| zJvTUMVy*1rRXKrCRv?O19zO=H5)Hfz+=4=>$5IHE!V@$)u(r9aYk5v1jfMkw!Y7hT z2ELfeLxG3fu!4;J1SxFBbbT>gvBI`-tV_hAQIqkshXz%sux%n7k0o)qz86KffNchC zH{2}@dYwzl?YeOn3v}q2Kq7?Un&g(-rODgaNMn2~(_pzz63VvlxmxS!k+T9xz`Z~{ z%fe@tV#fr!wL-Q&FLsn+v!2NY$JTjJK;L1^%wWbPh{tH0OJhsv#{pe6M?sL94Z;>9o7KSH<(vC?}%obq&E+k-Xu^x?^v$v)2Q=C~W zBx7PuGBj`5Roy7RHy#hC;O~g7_1N-vYh=A)jQ+BCn$$^*do|zvm02%Z?I4!rB^%j} zwo~SJ?grBu^47pB(q#gb_Ko~SsO`( z!`O%E#4h{x^nHe#pF-20#K4o2h*5%>Zgtik-PfJ=CQ&2;iEPXmn}LDb3N<5|N@EQO zyNLKZ|Kb~Ao4{iSc%TA31T}5ONiJ|bSV;~=F)+q3(lI3uxnM(vA$d9xO5!KLkZkZmuV~75O$y2_6GP$Ot#=z4oo-OROEmHQJ}D3`wwlUu>jh$0$&X;7V|TB zpihb)4FR^(@&&x2u^Q3s2{t=BO9=!I&F&E;bM4l0lonr3Xz-DGtpiD3u%6cnWT4)eX zz7FLFCgj|`Ho7O;@^Aan2>R<_IvvI?Jj^4x=P+zFbVo&-HR9ng9x?Qe8XhYPm1jd~ z%uqz~FE-;3`63A{NntqIuN=b<{G+9!a*TE{#g^BVVucKD8Xkw|2RGQhwXqz9wcK%_ z+$k7{1~MGZeRX5gI2AWWo0v7k({Omg5c@g$m1l>CvcBP=@)4ooCxwP%uRtw?{%{<$;k% zQ8I=_bNBUO7Autu;~M!vkACIOx)fywCU45I-hllXm~D0=1LN@Iuz!Z1Ljh5rSN2d@ zun#PYH9{xy05*^%{w_l>4ndn3$zr(YT$xkG%bg-#Uch5StCPkMCLZF4t@@RdS6}XU z^GJ7InqppmI_Sd_UCw15Q_dBwoc2UX8Bv!w2w@*{AiOc%ZiNc7sPIyC@Rf)w>aOoN;O>j8M&8EO|b~n^jVEG4g5!hFm%@Kcj z39yfbve?h!D`ej`{TT4lvpjKBc9SCe{W|g3ISkWC3_Y$fbq(qYWG4XZ$Hvon$$~)J z#9%rg5`a^IXSWN)pi`5=l3F~DIcI)~r5xKRv8xapYRV@!)K-_94Ud|M;@R*hCI+$T z4ucjKQ`np)zWrDZa~_m&nbQP*%XZ?xdM6yGj34egT?3ZT%L8R6m$zA>O2b!=M`@0N z?F#PhOrf^nPU5FI92+#TQ^x6e4os6KGqH36K0ifAt#H9bqd*`X$Rx9woRtjo%AIvO zG(mc;4)@F-j|K3nCr({(ns@%S1r*nEvjJX}Ri8JQ!Q3}~rXoKUbsI1YrbRIye0h`P zro5}dych=G@faR&$=MWI8%o1PNx)-+ykpZ3_FiCL3mzLlIisw0TFUyGyoF&r z!-Ir{&=ttnjTjNjr0F*H+io^vWeyJ|rm$M67|gBJqfj=gi$_Mni%$e2*q7y`*NLD_ zLSUCo#=_yaO)|F0m1A~Ue_smQPw^ZGHX}ISho_eQwwFOwrC$|E;Q1y_12KQo<-&JM zV`U$ExEVpiU7j83PsRe}p>$yQ=xknwHf&MCsCrtgcEtc*dHY{U;phnyq9_N%7+D(g57=CRfjUU%gm}?@j5H=7q z$Jkno$5JUV=p6OJ9_A?mc%C|qr#zi+t-x+xl@#hlXf>wX^)!4MbH9FUN5PCNUqKtF zK>D%sBNGYxeBlT`P*%?ShE+^<3uVr`M5_Gw2?acf#*dQ;$wMW=bTOV$w#jot zg_9SK_%hiLwqX~B3MB71JhXzJqQFD0l(}t6J!aM6CgHhFr^TY5#VB`@Q6BIW=+Uq+ zfMyG~%gI)1)XS$}F0Z^2&pKn1lxhxXdrt@s2z)k5FLoY~*Hd5Kb~hMic=0#{7B!r& zWlM3T@#_Hv0eUtL8?T)5PM)UY`yxmO%iFd{3GD8{Pb*{-&V{-FvMrCLgQ1gk>M

      qldLZ0B-nUv)!y;b91zP5LM<#rVmxIx&e@5@B6(b=g@Z5f?z+Vtdyhltr9Dj&xD@BBny2|R(0p5QOA zw(bokjYCoVP!Be1Z#OobK0KtIPDhhLEDyVhzwsF{y1>kE5Nm3RvVL8Gj01xy$#fJ& z&>fSDX?s0UEPExA@c@3UqcEc{2HUK&=?H$BM5aAOwV-n=$VFa}UrUkJZ>WlIH0FD4y^ zXTq^$XoOAxRwpy~MmSa`ei>6b!#Wy5D_~$46PZ|HblS8Uh-A{?a@vICzI(V{8#0u{!-4T_zoKJTLqnLNqkId_>uBJdscqEgzA|_d>BLH5|pWrI^6t zgg5~5H4qvxqI~#BWNz7T6$jED#rPgSy61F6PTn>*O>Qd3Rtl$BU@^NKvpb5T3Wv3( zYzn`Bz)}6bCLgf7#vjF&(}Z&~|N2H!AfKy`fs!wmT1F!XfELE;*@idbSZ| zzI0g(uAoXXe%J$B_Clx#xv#@7mgq4MhG^LJf|)R9xX5v~afq=K!bVXZjW+%nSg}>A68`@FNf$PGvSii?sy7j0_~1V`tj3USfQi} zf=MxU(#p#+<^GXjRWdP;h*|GYoPNPB7eV3T0n=DInZ#o&WZB=DGs6&qesL6US;E0g(L+oUg{7QDDrJtA zC5V-*2zEZSG2d?IkEu-3WM=@g!`8M z<>}BUjB=c5j55qnh4SVCuvIadMSGm#2D!f-U9_E`#$!Q2JV->HE?<#r;8mcYVBRGd zOJv|ywy~~m$oG`6h8d6ha2uq6xW0P3caDA<4ja5M5Tr(;e>siPhKB-~;Xz%PLipjA z1b$%8`N^REJhG%6w3w*C1LN8jE*Qql_*oimvW;zSXeQHtn!)dc`0*@X1dsmbvc;@D zy9*7x1oDRb!H`rPy2$O9X3UED!eOkMyYlbt z=$Ryw0x3f>37~-?4H8HrnFLV8Xh6j%iedq*YhzXHx~{q_O~BsP-dAK<(G?UGU6ud$ zd+vRcnPGzSi|l^>?=x@CdFP&Y%em*CTi?CGSH)qFEe-n%J4B&1 z=aW+XQjpBVAmn7sYT@hWLxSisfA|$v7Ct|~hp}F{kXg?}_zMwJ-uYSBhX`#de`dYx z-cOL&>ka$tVd1dWSqjo88bOOJn)&$-Cr0hCY*L3H>wl}D=U7~hDHiN&7VrfI3KJG{ zWZ*k{83&+>qJYjk8ZlS} zZ#I7pog~G!C1~u+C)w&1+4$F8QHJ&(KTqKv8U9m;FlhFIbeI5bFYtA<`;eCWm>g#w zc6ZL#vN*&YRvxQav53ZGP>U%2QVY$&C>wTFDUc>al4;O`sE;Ex3q#l##Fnmnl3Pu; zWnzDXqHIS%apiZw__hw8Zz&O+W=G5VCI20atms_-ok{@I3|!qJ)KbPDZeB5bBT14CLa zM~F}?y^`@fG(5-e8|Y}m|T3pf*yp(FfmBog|7;yWT)leD`e$^UUOe1W-sW( zEx$&Yg6U;60VPb7pLJHAxIlP(H%st*a|QoGv^rR z6K`~T(9ahx>_I8X)4n80LoI*C{D>+RaAQXQ6|y-JVbpz z1)Tmmy=rPm|Bc(xO4`%BT-;Cbu`-HSWSmLC`76A{XMdyMn&xl)k&>MtaP(y zp<71&eAuftH#4)qj_n_OMt*~&5rYhQPOR#M(0qoJU3Rpy+!@)dB>X+bzT;RQlg(W` zeO@?JE>M27$uls$fNv8!eGYCfG0mUu$i;@v7zYEd&e=SB5ejs$C}cP?a_v~L;>#U0 z3b_SXMxB?9MaiAs29H86wkE*VAL$t9=f@HWy8naaGj4tm;6Aj~3-!w9o?nx(Pl-R~Ye6a=d?kp5AUFk}APB!tlff^a&<4TI;*+ti9VS9n%*Zr> z2+6I~07g?Z(eFKuIbl8_4+C+&q3NnCSU-nDm$}%Qd`b}huA6Qs^Z0t+iB;c0Uh67R zka%WBenxJ7j@|FA-{|R}l26C7O6(_M=B@N~f~`cy>R(Jz-HQD?!dw(?7(hv@-r$^UT!QB_6r`SG6OR{1>CDg#TElZnXr7pdV)C8Bn=;D zaz{GFd$@rmRA89X&dfoZRb@udns5p}62`Jp^r8z`p(MFw4WM5Xv2A`fmcHhq+l&Uk z@+-)4Eo>8voq@Pberjc6&EaY%G!4-2MIsJw>#=SVCK+4$V0f^r>K+Ro3NW`^;6!6k zGX*#C_}DK4JK|yOlgY=K&|q~itRO0+%xp}j=~Z>bSQVM()+6wptNSF0*nL{93~DyK z&#)WKSTba|9fgH%nPg^F&3&rt=lW9pC|r}|mXC-urx7_~Orp*AN=P1cR&vsqq@*#v zRGTefHB4-Qc>QVnaG?-^Tk>52PW&BJG2sn(IHzUN4hb~^4Kz<2T( zJ{d*??o?ysM&EOyNN3adFM$sNbHy7sRKZcD-Qn&xBrgT>E^fPMr|ADkh`i|La1HL-OeB>Cg{ zU*j~7Nfr48q=T5B zd&2?ed|A&?d{moY@nd#Po@p4%ar2@+2a8`S(y<0S@9HyzyOQ5fydQ;==+45;3$F$B zFB%SZ@Z`-VmyaF<~8~i)1%rNfe3%I(9UoqU?1<&vbVUuzn z%)e~-mkXZNm5Q$`|3<=j8+g9ge0VKr{0`8YD(DPuUS0XO9ByaMF^mUr^NPY9EPksI z(1~*mJM;Geb7}!zY zi}nwuwkK%&a6buTgkhlu8&zXVGq4?TX#-|v(5D`jFnr|j#JQ#TMn5UBl&gn89Nthq z&$y)Lv9X4Y`OC8;Pur&c^J*%Z8k!sCcxFTjr6gl&ZdUB*r3^#3HD~&>5EcEpHbTBZAndYOIfY0$kS3;(_l*}ElDp;%gHaT zs2%Q@?l3UHZ4Aq72sIJ5VL4r}V&jXX#IBu19JXP3F59qzMYzFQP>w&e9~}9tFJ0N} z0~djkQB>fbmXlB4rX|^iWi^k)UncIwwqf-RwGDF{d|oS>QG}T4e_~^jpo`&&xM#_w4 zjy)+6HNV3*>Y5*;CP%Ec$<}NFUr=q8CxWMJ6=HqBwjCkV(n)l%{m5?nK8AX{WXCq59yn`hVJuCWcvtn5O6RC&RtxVB*x zP@_}2qt|v9W@OS!vEN2+afaiR?t1fk-*?uQ$$>;g8BkK>K#*u_Va!b`1NX{Nzy zG)^>n$KDPD*TcXR6^9XI=`z+O^C=O|5wSO;5uy4A{C>HtzPSzyCgrmd<2X34fwSrj zx*IVk*@AVf9-|)|ZiGX1of}=yN={^WjH5xEJODL54&Zd-3pCPVL5n^H))9CK@LIA2TE{UN~WMO0iRt>J?OpJy+zM4ez+%jf}S1 z$AeA0bYXp~h@g`)Isr?lAWvcRriQ5$%1d~)vf7Lv+bJzfVR>9vio#$cTr`JxL5UQFWxd zj6UF5g;-`}i&}a8Q1gPhIcGaE#4iRg4ev_M^E*c70Tt2vMsa=)O@KXDON1H3Qo*(O zI`%A`e+CJ9QioH5FwwM#-cZPt6b6_zBNb{K)iR)u9`~gGc6PS*k4vMAuM|2;R z4H5rXfF#qgjwn+or@(v_V;{gQx6@T9#iXB)AVmYbX>mX&WLh*s@|(H9)q6T4P4)9C zr7{VOwA+ld8my7Gmw={hpcp>BO?$+?5~IUgvgSdE0QLy;Z1T0GNH@XMT|G#P28TV* z4aM}6MoCUl4we;bX;95lV7YmmM=dtcnuGQwJ_)K&)-lEOvB*_`_6@Bc#YgEBA-CNw z33u!v=0)oZWBxomH*KO6I@S-E2QYJwJe5iiZYr_ky^**hiaSE@Llm<2s#sq#Qt7@4VWaI1t^5Q3uwQROVU6fdpFRPDj0 z;z>@^Prfc(X=t0F`6(7R6Q!%Fwb7h7*JXow^CVP-$6@3;a z4w|mYB=J>d6`nDcDH;<6jn646DrOCkfsaz%PRzr)#7ZWkz^EEW=9ychWU^iy?;kG& zNGh|OJr{rJe~g$`<1(MVFGr*xc8ze%fLt`cW%^qw4N9HIn57%Zu@_7^p*I|$YglKs(|?;;fvjou-=EyRrRgzI>}plI|v11Ar>w)>2j59zT{{A;3L~E zJxudm(Nv2Wbun`yE_f?-9z0=&v1~}SrAAkoE;df~1n8w&Eu(dkip!>LVO3*o8TRo@ zZ)nP{Y|6*>AvjtvLq0TZ7CrG6yn=KWCKYtiV+lE=%_VVTn~_ZxM1opJ5m2~!s-p4w zmSZ2Ky^03cjfhEZI?X6YMHRlz>P6QsY@&XHKv7x@#ySimAkGpT7a{>qQvP8j z2Unsn{S1Ybyp(bE{S?X6!VxrEDgb06?Yg(FW@dv+DmnimuT2NJy>is@Agx(jEYXyT za!Ge4)EFVdiix`WS<+%xW{Q5DQDWmqr0kmEbVxq1go|a+WrCiet%6!GPr44hm^MEX zA`9@P+|h=cg-T+Qo389Bt4Jh|C5DEVJgW07B-VKhQr9k&GAr&34natq8X@!6GB>|k z6{)X8qP=n8htZNVZ1AC33Lg5f06t7h&$bsz5G*`ynVcG(4B69&!VhVwNX%*C@kw&J z)UIqjB6|!^ooI8J7BM_N4K6+X1kgoQ&QdUln$oGztO+|4E&(wEsgX>)*+`(iF+{XH zB=iMTc|vbmi_iBf071$-i|UsRdFB4$%bsS>o?V!FKMx=8eo zc34ghZNNfgwJt!5eQTg8mKgowE$rTA7t4#za<=FmALWx>5~Oq`sO&*aq164ioq-Aw z3d|D)7P6v*au32AY(U9pp~I%Q%fW=9o=EyVW9F)HNxfY+y^i&jS*DCYI$g+dv(r-`x9!9I_aGmU+%mNmQ?7^OpBZMLVohz z!S}6QU-!zy?+xQlp(ppBed4*xZ~CR~mc>_&ty=dohG2!h?ekwRY_F&E|c>Z~8B=#PEFO)H)s_x--vbF9|Kvim0*MxxN0-gtMZv6DQA-8X% z-(7zDBXf8Bl$Ww(?e&koF5G1&qA-Ax4-wwwWloksv)fC?6>-X{+ZBkICkxO6K^`| z(Z`;dwfnh&Szj5(QP63t<-&v878vt;^?7Ska;&ZCM$98k5V||-#~(}Y*u40InDq}9 z?E4P-Su6AvDIfp%?)EeOJ*a+J<>d`}-!|m3i4!OWlb7`$7+Y zZT}x$y>g?y@~Dw#uHE$9FicNGFxN#(&EFd`au(M0wR}G5hh7z!I*FqH z2mTS+u<^jleZL&Ddil0pRZf&^q5tvKJloAAQ?NIb+5a zJvsS`Cs$3qtGv`OUJ?4+58Efk)GnX*>aPR)ezWlFO2arP^gG7YKAZQ)U%%gRO+rHE zd8N})cOy>F=YAJA{QHNicCG9``LoYFSmd7=BnAL$M-nn@++dILx27$ z^v^AK{IK_6^oDB_{#tpQj0nFP{GSVb*4?e+|MS_d-Y*~j zQQz@TEPTQ+`k|JwTE4n#`@gU9Sf0N;EN%IcT`6`0)3>D0_|FwZd9R;zY|qWp^B1;% z{T8Nfg`Rh2&mZpm`0WiZZJqb)(?eRIKMx7LPtmJut{r{S!Hfapw${CK5~{tAgud~U z_da~!vlE|;o>}p)?;q`5jVV#sM62b>?*e+yf9kS#1TfBK!>bNhL-_cdPl>upW9uYq3G3H`oLM-`u6oIJ)ld`Dim{obi4ze2Cw zJZqzM?s;o3Ix5UH@R1v?GK?^!!D_jBaNUA|HSh0!B&zxOEym_o5r3hl=iQJwVp8n$ zU!Jwi{&>p6`G#?!(08p#_+sRMuita$oUmYeBFpssLVxFl^YfnmdEJ94uNfK^BmSa(A zSBx!1D??@*+0-y+8|%E2n5}BIvDut$Y^^9oCrhS7nk(m<6B(roYq+D&@aiM!VLi5G zo__?rtf{N(rf+)Er&RSxyXi?Vu{AbVb4$tOBj_b^0v}H{!ADHY@m$@&iENqJHHoF@ z-iFLt9V#ap$wx3njSY^D?i42pF#qMa&HiJeMA4UfI&PgP>OH?RPbxU&(M>;sl~RZftEao^p{XbfIk7XmroJ|` zaw!|6cAZ=Pg;+0DX$_elneB#RMp=T51DcaHQj1tCRFY!cSCc?d8-Qt z)`cJ8_DNG!=ytz4uw{% z6jLkKtArkD%;|J9#=+{8xh*x7N4CYxk9SoAmHE(}k{c|Z>O7H*Tb5b`` z=2ak%Hh>|OYR-*>8oS2%70qXLGj_qU-P4M%@j?x}D&)3aIWw|5CC4kl#m%Mc>KsWG zhjnVk2|3-2Sup9*$JQfhk>Mf6HM*NUP%gYApB;wlj}Q5AAf{-HVYtJwD8(?^ z1?!LhJi!Ly9}`z_wc-C%!Q%11M6iG1Unavb4}i4=^!_{CWH7H@8lfAn85mmU#pivv zXX8H8h@l7G%Y2700#gI}Vha1-gIqRFmKjm8^tm7Y+%EF>K-9kh<#eAn=URZ7 zq6n@d46C0c%y$^$s!mC8IR{qEBj>vo2UgQd;wAMXeL|+6ZHOua;LWLWo%#wuhE)kj zDR8bsNr9M>0fB`mJDNF|J?*h&$Vxj9=EBb|GZj7w$E#wXA`IP zt#L^kw{*DTd#;FBk==7eHvXemWLsBc$E`@St(Y9WVshLQl;##j(uO;n$-&|*su@)FaKo8&uK={{|0k{BgGGG%ROKUSA z<4rzh9?PxDJYp*Ih$$6Tv^z9k0tQr0_KZOgxRd-{}^&XTjUw%`jEDV1?X zGO*Kd#~BpQ9|Y@(f7+5t+~!rL5xVhWhC-GGp9wM3Etjvmnf(;3J*azxP)%DjJU}5B zCjFj`J3t}k;LzGbG(!0XW-%|(J{nQxRS1?C^P>M$2-=&=HF2RL8Rr6G_R=^HkP^KV zkm-Q&ZKIjM3ItJC+p%q0ULkc07vCgS>j%*rS{ zc4S5@-`G0XGAnvaW_0Tb?U_9-)3lz6f9+d)ieByM37_MroG}-_!S^@DEPnw|>1{`T zTv)ypyyG^-T>L1=;?IiAI29)s-rU;LJ!?gA|Ct?IB<}P2==i$g`y(y>Zjpy^i&k!Y zXM09GKY})3@S^?v4&b4&>xu_{^oNNt;2&75e(~ry2#4RiX!ofNaRzl`tYBD~XJDNV zXj%AA5sVsf7VdEBje%7Ga9xjoYFwPL%}e_Suq2`V>cyCGiZ;=Um3y&ez(#{N+_)4N zOU%pi*lirWWH02cy)lpM!}VUl-bpQCjq_>$oyLk$b7gKkh*p~AhqvKzzo2< z0cQdJ32+YJy?}Lq_W?EnZUAfnd;oAU;DdlG03QN`-^QbWcLDwx5bqdh1GfDY@JYZ; zfKLHF5BM(N+ko!@;+FV*1PGqCUE2Ly?f$)X{|Rs_+5_$r=RHpq7#Ao-||M`P%UXe`n=3S6`tQ3m5lEYdh07^NO%oT#x#gRxB(+Hj3U8jLARf0Qv%W06vV zXa}MU#+z8A!5EJe8skh1?M`4LgjTPyNaGz~j49%$u}C9$O%=h~s#`Tx@0d%NVLmn0 zKk?X|nhH85H5GI+SWR^m$iH1v9j-PyTrCz*3qf4}rCKN)K99p4SOaAXEerphH4vYU zR1Gv6Ny-%eDuLMrs|H3Z5N>ck42NKiz|sZt0J96W$crrjmL@b9IBA>S0cc*dPPBe3 zA-n=>o4f$`z}hA`z&)_G84}c8g*Fu7{UNBkRpPP_|9#*-BA{){IQNAc%T%?0Z6iBf z{jTaJA)vZAQq_wEY5Kj@3)1`zZt8$}Q5L+<1ff*ZVWp*p`52IL+6l-S29``}7+7zq zVNmL&hWQsDZQZ{CsatyiS;HVKsbTg5*5Ua(z(znA52;}e04~P!kASRUegb3-^9$fz zfCj?5j{uN0Oc>xMz@C7tVNL*K4KolB)>`7n8U}eTH4NQZ!_b`ui}6Po1{$SO!_b{I z4BctD>CPGkG^t_w0n%oZk2MVWSi_KycAM_3Vd4O(=j3AzLq6&j`KYO>xK+(TOw}C3 zA{mmjK%?lFV3EcEU@Wy!#z`8BG*}8)R-=p&8jCc>0i(2|j7b`cG^PM!NsclKG!|)` z1B~T2%5ZBe(s&VAs?c85SfqjeLqt(AyT8_sdURRNHXkp!S)}Q#$57F7zFh=vkeu&6$H9dlNHfXU}IM!JFX={(e^}*%eJ<3c9b<|YdqMN zfA2XNEqfb+AJ~x_-@ni~)$B2&wLi1topZKyToAqdV9c@$5MltQ@~C~Q$?2Yz^geqq zTiTbz4>YEEVsci0X0(zM65Lcg%{V@$)S0+lQKtaqbnfqE(3WmO=DFdvZmJjz-5U zkp_go5Zwq*Gv}%}Of7VFWLeGe3{!GCOWt9O-j7+{kBKdab~@)pPSx@-Ip@Ww7y)q+@ zK6HPIS7O@P58wDJhUnT4^oqHJ_CPmq=6Q#3&<&QHo)>BQ@1;a*q2$MROqCAvijw}C zSvyIOIFr2}LuW`SG9=yBo?>{SI&|{~;@3Gb#kRuIQDW3SPP07b#t%fcMo)FBZ0&$* zn2L23MR!E6ewKdydW7}t72Z3dk0r9-f8&aRr_s3k9%cF-BZxKj=q}U4T5TcjaAN}g zTLq(iJso$PF%AD7!7B0JEEwy#Cc!Sp{{q1t_hN4WQ*V3@OuZ2ajffS#EMTV!CbfxR zY}wBfY&ozR!L9~o0~T)l5g64z&e#h~g+@D7F0=u_6m2N5u|mu6(sF^#7FrW9*4J^y z1;A{;Fg^iH`FuaHQgPkvb$!L_`Y&M0=kI}?Eqn)osTS=qFxfN2zY~EaiR%b2X7^&H zUhG0(rwQL>z={O>Coq+cAAmW9c0x~+HWV29tKr5-U~FH68_B>pDjII20Glb;cwln` zO9fUXSO%~P!Loss36=}YC72UfrC=^#Qw5t2>>R;LffWii8`yloDuK-vtQuH@V70)g z72z^MP%D@Rw0gl70V@#fXJFF>yHMaE{+57(1$}toz1v|4Za1810DX+f0Src0>bqjB}z^T zBqRn9lEwrQ&I%-q3M3>45E29ZNE{u=5$H$aA$|nLG%+wOi6a9%O-KnO1bUhf=tsiH zfPT%GfajEe=fGjMz+ttnhS6vqxho-u)!2BZ7GTE;d1iKpK{XmZO~`L3={F!)wVnYr zs6T8cU`D{`sp&Sf!s&K8;9$Tr0RI5^79cGRTKH{tz@dOyfEb%;W0^xsyN#A(Bw#sU z0w7B{dID{06wPOw`limfD=G}4)9ID7d8DQ zz*IcH4rmAb1d#5Z0n*={fa!o=YdX_U`nQ0nJ=!=Ro(+f|5=W8RjsxWT>{E~rJrs^9 zwXqk09)k30=ssGzBhE%4o)I^B4{?$A5Er8ubO&GwAp05U>9hgocyU`PAnvw#fHMIX z0%Dv>#?jF0XuAl{vjHy$MANqI9zcvqv^@aG@E-mm4Dd?8rvcHFZF>uF6(Bz}zZ&pUK>D*2kp6rQcpczZfNKDM23!Yte3)U}1b7-C z`OgF-{}8}i0mo?icuk)GcsuA0z&ik4+I^aKpAL98=#_x$0qeATqjp~a_#o)#13mj9M*&KHX*%l-(rGyIaI0Q7G1coPrp9a8DpBLL#3I>OmzG|XF-T*PvERv;KS{qT)|89|YQR1ZC5oP3REYg?(tUJ|#u*xmG)4ns zTPeyItFcHU3m98DQN|RFMHJ5t|9Di% z-yjOZ6FX}Ko;y;bIcWYbPz<mTuwwwy;QrvMeJb%7m&_`*QWdNENhk|)g zNqKR|G!~G&glFL9(O4aG@N{oembND#X$81xdflt zGOJ{+^I)Vr2w+a5)WEEOn4RXuc(g%cY$oPv;=3r2L_Y%T4G7~b)B7;aZO7wz4zmYwD3vC*uNyNx;Xc&vVRg*|Hic&x}FNVoHVZ6;Wp{Tdf{X4)D z08!xE7^ee((SYr^mCT7LnG=gN{;pl4WGYP2rd5Ne$5PaoR!a}}7DzjyL`l12FNPPe zsOBhh5Ub~`q>XNl(pilXPw(A)eNQg|U@VzunOA3WT4!}^cW;4iA{OitQF@o-j+0eU zYLJ`0ZsrM4(I?J z0hk4drczr0AokjkNq{6krjzecvsU0%i)@IgMK;7DjRV>>%J^AhGAP}%q?%QaR;1kc zIC-4fv3EDPFt%&O0N@!IK0Or+uG%LWo)bG#WlZgu4r@oax3ou~*?~6c7Ov`IG_Jv| zR7hdWg{y@|xqgQ`1Gjmx*5PI50+pl}p2-#_zs=ULM9QW0J5_+ z1~48F^|#FUOaL5@XY}1=30^9o6VG*(RFf`{VG({XneY{u2RMrx#|hRicweBOtf zvKSqZC+0hY;C61Oc{cN;xw^%}JrWMd46vIQ;_I6k<=%owIhhy3q3mhQGBgn*b8SS? zLK4}duhBLD&v}51PXXX5fH{Dt0!{{`jBmiLmOBzt%N>bD%IYOWyHE2)8b!N-nuSS? z_P6vnXG_VUCfqX_23*e*nD)EBX_b2_e_*UJ<$_ruHTvyixI0(2A>*RF+_3ty&Jk;V z3!;Io6!Cw#U`(pA@GJ|8mIzE)csnp<;U{}BHrze9g<8=^_ZH&IqgyR4$ zfI|S$*=!pFi2eIy;cg$mOgu*dvWkrcWSaOMHRul9sx3iGwIzr}%Hpg$h4u;liD76P zK`Xupjj7@8iN-Of|=582TKF#7Z&DLf;tH(LMI>SD0^DjC+`6 zEB?)}dV8^5`Q18SIs8pIS{(D2coLw%;chFPo#+Vr`PVA3e#w-C7cNGgc2 zMXWA{#f$o?E(zV|(61hZfAi2d_Z1!t zWP0Nq?ZqyH8?R_@oI4Z&|7M(TIE3;?KZP{=Y1AuueVpd6qP>Ptx`$QO(;cG4YHz4wnZtW{VOKt99o)=5uQ|pY}(*BFNX0yx#A3#CSGWJ z>C22W+U-6R-_ThDgjrbM(wo<-?w@jK=xpDGS)zSHKh_&M_haUDtT*)WU53>kd|{Sy z{Ih*9YgZkzgrWM{jpK!<%_pq>-muWEma9L)QmD%>EGh50em8{2&2GOR#W(HjuZCHQ z`H%aAt8b`2G(H?346|hW#AkpvKC^V_1HAEB=ocTnDvNLkReXFyXU`za!g37Hjj#Sv z8Kf3IQFspE-^}-cUTmEXYoLVg>oePcVV33ikHY=cr#Gb^nlARx!z`;2H1mSjNnW2f zXrE8=ri;slT7`%9nb%8xDfJEA2G=l)3;*Q&&zvtFKQ#0~!c*%Ly3HH<2ij+wH}nIb zu>9C?tI)%gq6-bRu+Q<2r+^k_$-uw=6^l0}O>(EFx<@8unvVtD7FC;Y{PKf+@UGCnZlxq_>Is+{j7E z6*>rx2+DVtrYGuwd*F9s-r*@}tICH{5*uvEPIKw`!?`R(F5=-{i#9Ds%Cf5Z4T0FALXoNpY9pS>`2WGfsY*=PY8UdvyJu; z_-JY`34xD>{OS<+*lD~z1U|~;_7M2kalSVMK2`^hhQLQTKNSKW)3GB2z8LWRJp?|+ z@3Rp3z6gPj;qD88kBtRcxJsz6VEV`W7~nKH6b#14X5T3x@G;!cA@EWEoFVX056%gJ zkIj?H5cpWcWdaG%yn>~ddax=4|5!e53W1OL_Qw$TI0W!e2z<=9XF}xL9s(a5DzAjd z_hyKE?}xxgd-Z7ud@M(whrq`M`IjN^v6IkiD*k+~V0yp~$G{Ny*yTwKfscBh6#^dz z1q(yqqn?(Az(;+l4uOyQ+!z8Mf1#i{a)NFO0cM48lO}bA=sJkAE1*k5j+ECC_c(F*ctL2pyz_;ZOzAaL@@sh zIP3w>o^uZG-(WbOh*^(R+`PK-kKJMycxKO3d@NVN;+F~fUEujr^L6DPC&~CJ$3VC8 zudDRZzkKkl)_h(0$6>Se;CXTOZ~ONvcrwZqUswKdSbaKps>=`W-&F9e1<#%e#m90L zEI*z=Koynfe$Nf?FQ8pVIpk>`#Ys7jO!b{kAzjLOFg~B@3Gz+AT?)Q6nzyU;I+2bI z;Q6JRZ>f%Wu>742w-Gg1gN&OO+rPom>w$mQgC}afuu1njn17StJQX}wX}+%fOM!p) zgJ)Om;r*Ke=b?32A&Z+=SLv;Ue;wfYx?b^hrGI&F9@Ky}u()|0&cBPmv#U|@b>-h! zIQL%w8;zS6q7hVnr^BHXJj1}Se_G>_t>Tn;U7Y)|e8fiD((uLa`^D3{Exe}J#J z4G1nID`+~H0q!>37m=&$a+v_PRp8mI`S4m$|HdPrx4?7sGWyoFf1}`*0iMO0uPgs( z$FBg-pO%YvUFs>@iSKJ3#Th()pTO}`@NK$Sado9v@o@eYJjY$4__~T;9O5?wJd-Xx zynlV+yg>6P&fxL;8IDWAckYVA`$xUJPxBnkKLhc53Vcspc6k4);QSSM3Of{ESLwYR z{>=f;H!OI#x{@FDMSTn}Z1NYZ9MKLHUx9M8Qt=(mzXvpr>0>behQhy3z!!a0fPX%N zn{>&*JyG*0PLxZGmtZKTC!Y7={wt7?h9#EHSOJj{g;gkfNSz)Z`d2Fm< z<9P5OaqWF4XCTXV?lFv6E%ZxfsT?rQ^^YoFCO>R4lCQA{3*d)<_>)>eRUbl5YBK*=a7a8Jw0r*G4eY{RmeN8&FN_hQ?y z`i9zuxeY$A70oD;Go$qj83NrrRordQ&%jBs_Iz;Xx*a%FUQmn<f#6Gx5id>ECGs2}n&Mro`tFC$^}Nc~`U6ltu)*@;if&MC}w;skZ=mX&QU%GS6U zTO_bBeUwk6K*-DRjXMaCegI`kVOqdTlb!Y{z9PbF(;W6GGW@Cz==Bv6Tr*}MTXNDN zcOKks8+LXr?i$;$%*rnG$Gc|8Hmm|_bV_#=+wRKE%Sf>>SWuEs`pRZS%FK;+37x|2hKTg$wMMn_{udR zr>?A#5#UM8h=s&SpIXf`%zdIMiJpL9<)9CqC(QR4-XjR35aIFoZAwK>u6Isx%)s`o z5wT;21jaPCpkPX|6Q3>nh^EAzi|zD+oW{;Tc&_pl6nAF^GCd8I^2)W|RrIyq~d>f+S{ zXK@;ZNG13gQ|6M(Wwmn~M6t{a<01807$g-UWpeyE1X}D6Rq60gRbyFGvm}e+9)-*i zf3=8Qg${@4%~HH1XG`Z~L9vQ3t&iis5nFq)E4!dD$2G%^sNu+Xrt5g*zdCX~Cr`<@ zlQKHN=WKRwa=oWzmz)`>960Y@L_;ObKnxNvspZPEJ0(_?qo7>{c~0|S^{y3z*?EzF z!j+VoB`Gm~(CJ2Srf2(sS}Ng>nikY;kTuewN$mDwJ~C z&qrP&KyS#7{Ng+$*yYHOlEob28d|NBOf1vm)n8?$Xzr+CI9|ZrTr(F+4XBKz+e{`} zJ805~r%OOnCK@KsBNC+X=!a-Bmb@jSTEHhJS^M=Mq=?o{T5b*+Rp6o66HJYV%yTkl zu<>Nib3>CUG;gX(a*A@&avfTp4D5OoULKEunxjb!QVIx|wl1r!k{M)twAWJM!K`CM zEX7v@1#qi#*i+09i(Cb0%cZ-fOGL&VVi&bKF|_9y8qZgxSg1lLqv~VpGrb@`Q@o&5 z7h_owXNa}I=8Kg|eBjG-%8NB1@Y5r=uVBcfs!-$9T~4>Nu)qbKXZ;E^Gbh&}_G!~Z<)JELW?ueT$)D{_i8FnA6f`qsy5e%V3Uktm zT@L?Z;VjI_ciB5L!LNA2$&rOZz~bqFxG^PO-{4jWu^HCvVN!5@PLlKLZkkM=*(1?0f3}(%(^^31E$MI}WpCXzVg#wpTR8$PLb!X%hx!leI zq*>~_WRzD`2eb82)*_*^k{ItFFT{ydDhb!1_-D<>h$)ZDGGjj&oV$>TQX=)2YMz>k z`CLwd_EJT;drrNiX^vUIb+TEMS!Si~(+wqrO!8N{L#5624PR`fW4a67K^6~b;jy@CY4%YD%)IzQU~58TAfiqF!?3nC{N7yX^RG zC?YlvTH;Ns#H-LzQZNO!m^n{H5u!B6?8Vb12wIZP=CjgWS`KEc)U7m7tk&;C)XH(@ zR7)LWN0vw^80;xz2+>jWo52DC-(cDKiRy2bJQ7(vnXx*%F{%&|>p&8_&@u!=vqlAx zc#FZ5xV#UatLj_bb(M?@y&VJy0pnbX6pzABn()q)>5FahvZ zs&?(kCgkI^B4>`>nd5e5Ib6&?REhssd7!kG%_XL!h=Bf%TcG4w=#p-s9 zzZ6#CG@y#A=JbZ9?8>J6mb$8@nu?67IW_fF&7!qlvrv%ka(E2`b1@t86P1V53#1xj z#M#DY(@&>^@}cDORE6pFEyq4e+ZdX$8xfP-bXImW_)i5S)}E08lZ(Vsyy0+krWa46 z&ExZ}c&@2uzp2S93}q(sXct+#GO`DCJ)lh^Vn?c1{A_JW5X@$lyXGdCQKf@a^DtfX z%x`7!{)r&pfOsoA(pll^`j-8VZxATzMp4n@B%Y&HM44vpG2|>MK$;noNh*Lu$W1pS zm^f*e=M`iWqc&qS*wixH@^e%_js;=_{N_qERQb>smV0lrhUm=nKT@9ainKxL84B~6D_#LC#{|R7NlhWyz50rKU-O*SqJ!Qk669 zOkoL9Sl!UQ~r7bbPhJt?3)FXUpp^7kAy)at zy5d3PSZUQ()g!vpdp2x3GeP3XoMx$HMwkskzWkCBjP7}|6f(|ej7mjtg05q@Qq}D# zua!hGa=A{iD2!_hgI85NtpP2E=&8~$RyQZ@F(xO{(8qPkl{T- z|1f#`tg-3q+BeO-Aa%p~Z=s`q7y5<$E^heu4_ED4*?;n9xo@nw7t8z*u+_5Rm)pO3 zbJgtB<9nQO`4v&q?}T)O{!>!+1qQ?u#1@W1G-l`Q@gB8%KRxRP8=* z#l#-heT*doJ?PIvBi*ZWKHQ&Bd(=tq%=mIAroK3(YqjhjQqZz(&Ha57@5;RFs-^A? zhH;C~U%W2u*?(NO^Tv`_ChXkZWV;Z{(u5xV+WtShdgVrYjQ$MU z|K@NL z59ZpemhruAx@hs(TbHcMw(S0PwtF*{5((YD;ieVOkNbY#>^WBJW7+)^v6@Ec-+4xT z{zBLzeXgvoxbxAK4~1jfGofEGep1S??UQ~Qv%go5n{WHB1k-Rr-}v~3h<>NlclW%pJ0Pk2WYySD}V_VN%lJe8CyKZ{#(*rqJrY7{aAGS}7sa-zr)n5np{bu3U zl_=aoKXCQQ=e#xhto5t!X?b8o_|=bMyEvg=`Q5qF9ar0itPu@HDzP0P?UYQ8J z;+9iZOLG6&C!V|freErAS$yT#s&y}8TREYZg%8~O%9nliv|o4EH!sz0--$0th2Fkm z)e|*uJazJjlI_=SSnYfW2M$nnmWST7o>+TN*@TVlOG@r>eN~K2dWAmg?$+`D`D|D3 zmyiFb@AxMcK7s8yg#PGVo0c!Suk!1UYBLsRMLhl#mOTjl)u(?cEwetoZtvYj(S!Rh z#L|lBDEhzPWY^H9-5mp$joxtcSxrBkfZl-6Cq8j;#c^A&|6s-|Pv_i|G#TY?wa_>2 z|K{%v8958<`dU7p^h2)-9AhH%s|VLD7+CZE?nk1UpWk9^eidInN7MgZYZAT~IpFK} z+&L#Kn4VaVv?d6B+vmSt*j`aze(i<@zl

      eH?8gq5m}}d+GhQ5tpxgF)@1e3%fDB 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

      84EaF^u}wx}Pal zM>CI>Gn=5{7$3_y0n|u)Gs=PCCxS8^Eqb}6ndL&CDi`_&aUU(;@q>4-?$bvY+`0}> zk8}gg$+j`R^qnWqZ&}bwl5MTZ$I@a+`tdWIkurwSbsbb#+jQ1&W zIvVt3P_|0!mCy$Z`qW@SpW1S#crWO3*dmEN#e69`FtIas<7CI8OH{3AiyYq*l; z(87MwwW=8>Z8IIQ<}180qMxL8w;*Yx1?sVSigo=4OPY|uxWayNCVqxv8d%M&Mq~Nv zEWMgHfO0;!5tR4&vq3p~zXX(dJ`eOr&|ib{2Du58P3Qv9GSG`bXM$3G7U)HwT;3s{ zc_yD@L_X?Ay$hsIy$hrd8>8@7@wn)$cpR=cY^A?6MSi_c?-5u17syZtZJ0zfP zR#hDnsXNBcs^ZW!SLa=hBBb{UQ0C=IP=@0R74kH4H7Kj<8c;sJ-vD|v=(V8ZK(7O3 ze#mE4l%N>ZoQ6KtgXvQ*{uFPkE*BjFRaFdGA9AxQu0yy~#hvi%c~!*fIo7Jk|LLmW z7hrl?9oJ&1gX(ct$IU24WLmogl+|%7D68W(&?L~?L0KJlfU-L70cCaE3CilY3zXGC zKC7eLtPc8Ab zb(ms`wq1*3Zi36W(H2~oF(s;%r)yEhuEj}Ng3CzDvOhe5K4_${LD!;;U2A}7aTKMy zbj!{7YiO+#9y?rDEtW%qi)o;nKdAV*sMbx2DMOb%E=~^UVrB6KftEko%#gx5V zb}hEgXvsfw;&GOG`asvBj9rU4N^mhox-;&b^Hel0j@opTv1>7H2`=WBZrS0VJQ~#+ zt!q)nuEqL|*78VS9d05<8G3Xr%GkAdM~jxmx|2_OIjU8oYf;9o#a0n*8-wnA|HG)( z8M+o_>{@QoGV*oM_1`RvYTd4DQO2${%%*k5<$g2{BVSMHT9mPC?IT)7>z#ai&QVb< zyb2UY8N1fLq9yN>;QQg>o34*)VX;>nW$aoUv!ZR|MDLOJMYX2sT9mPC?I&8~(+xTE z{g0wrSkn+k8M_u|7zr*Tg`3}f;O$u_OaR?k8M*9%EGKB{$=u0cEd+6~2hrU;OM}m{!VsEAU_Um_ZqFMv`DK2H~ zS{TTn#gTz-Vd6B)T`yDDqKsYZXmFwoji!ydC&g`OX{=;2YUli5arfX5gt~Fk?^k8k@j!Sk% zwcgX&l(B0aBU(nj{&DezZ$!0r=~|SrYjMt*;4-vEJ@W_47T!M(6uOI*W#;@sMfA+eUNn{u9I~w%Gk9sMC)7# zPK9sXzHe>>(cLAwmdFV2ad41v?8QY~!udBi+?y5UB%#~AV{*nv@G)by{AC$* zl%I?xC8M{*F2t-dgnKqkc!`!qB5i*(D=BzCK140aaF9Yb!!byv$C zk>M5xBVReD?|$8Kj>EE7v~Y|@<1G38=?%YgTFw=j2Q2mOH7!4;TlR`&2x_nB998e+ zyzAin;NT22Iz8;zdz=pzqBD@+{eFB<)h;cM)U_z1YG+cncKl+;7?Ga&Di6b|(!pAr zu0tTEvi6dB48VZns3H_jcz&LjQzLW#)V=1^t42w+PpLEMbW-i{gYDNmFrWHy1r*l}}%d(fsu&Wkoq7$2dQ_p=N_T&x#tR<+4k%di5W z39hT~my$0m=pUmOREo@dmNKj`^Yu^Na)soJ&@zqHfNB)S*sXER6gwO6mvKG+=KiNT z%W#&+JZXt*rWuzp<(VmQSuM{NEpC+>3SV92m=~Ou=ZFkH5^U7YY}4}o`p`8SmQ{(R z7=xK`tgBeZiXEdhxdv{>^hfF7otCae8T&|koM;)u0EIxUAqhTE?U%kxYhKORdr&tZ8!xCyRI{AHQ^?JpBh$xOXdN${7sxbY9)zv#4FD>B^NXIQQ=eZzIjHD)f3);Z2xEEGF?;V)hKUFD;kaiO^& zJ>TQ65!XV~H%Yg=(2B zevD246Si7jA~G8+mKU3r>vhYE#WDo74xQsHp9ZnRwn{hb==A-aaV=f(3cGd8HoxgtaX+tJGUmmKQ3`N95}0yDfNPkw4$>%?lNH6!x<%u+&pj zR^|^C<>z{==nFQP5)Y#G27I~s9t%>mO(f(g@s$(?N^*T3JDiD4YGNS2D417R7 z_OO!T(t_d=Z@x!iP1^!dKe_(ATpvo$hCpo-$}RGQ@`{T?A-~ttEgY3iW0Efv%FE9! zEAZ%e)wa;wfG4-OBve*XQ09pNLuQvP@)YG3l@$5BrJio_t!)~`p3>q%G|ZBGDKUk1 zZIj3f27Wbf1s=^*N>!F zV7YBVlZyOB`QFl!GLL|D=VYYWgM-0fab6h;T@OyR1!oo)V`wNV)I+VKLS{)>AlF+E zDD(*4w_UBY041C64N90j#`Mx)UMRm9T>;qOHm!+eNJ)M{pwy!f!)<{q$C9Fg{9vHO z1CZ{R;NW(J0#C3kKNt#n3#kwTVcagB@5vAP^NRD!@;q@E&+`;`OY;3bbk|sjyq*TF|+rmpc`FVx@U~xgA$AW5Z6PZ+6P+A%)kiy|B zU0YyANhlBq7Kd^@1VFb1WutTYy{Hftl7dCIhnJO zEey9drZv{rh>F}#!q`6=5tcqL$SClJ{KdI>c^<+lsk)OAkOI(!vi)8^`g*`8LV~@d zOG-|xpGlBhvdGkZRN>2*1>p#wzEO)>*vE4;*t6eStLrgXuRXn3ET3%hUQGOSINGmL?D5 z@>HLKqtz)HlQOfiwQwjx4q&wzhRO@ZZwz*#paM)68-R~a_ zFm{}WedWi7D$9V{-GFZj>vh4rQb6B6ZP${bH`LUHnF4*gp1v>Bu4mn`X%De(@C)b8 z%;SJkgTtB*DOOKxu557{bWCbmcCy8#W@JvvNY74B&$2M#O`R}d;>3xd6DOpnN)Yy! zxZK*}$KIaxJRXiq^rr&rE+4YErimSXb~ngvd#+;OU&hEzKbxFKbLU#0jv2TG&n-)^ zHZ*>M5-kErc8BI$pT-%&Ricr6wZjK@I6mum+^}caJ!J6HbQxaLdE65`vE(MjA;+iQ zsd3101tu7W93RNa=wm9Wh$064j_RfeUXL%Ndh{h+; z&aQH3FKC)H@hN_PglB@L_E6ySZvGhGs8<`=IJQ+aENUH(uR&_-`|dvsPrq24+Z#51 z^@RFcQeWND)Y`N#l6++OQOUetEUiBYUxi8Lv>f+?7Oi@D4Y$k1hy|bP(R`EV;vTdJ zBWyCi7u1@3yPhNeYL7PX3FD@wg30Ykwris9mbw>0c6^@mH~fpl>= zQ0fng7o%lmxFX=2SsnNWloGZ&oPk zpIs0vFAkNJ73*R71>TAR-EX8887%i@S`r0DiQk%bFi`qkI7Q{TU6cw#-Xd!eL2Y)x zTcqv^!B9bTan)!>hxMdkdn=1e z@_ciHrM}{s{=i{9HM6Jsp@yo+!lss`75<{R`qvD5mKGXVmNtHZ#Y&|wdE6YWwWZo} zmRE+DYOT3uK{o@1-jN&X7mTM69mlbK@SfmcZNRW=hjDSzS5_XLg?bE@m4-{ag}lNs zaxHP#^=_P52$ohr=fpRm5 zmJUOtGmFbg^TVOaa&3RBaG-Q%38X6ne!SsG9JVhcDafDQ>a1WzFt<3MM@ZR=kiJ%Y z9~Be97M$-*9F_$JCQwxkwK8|b45qC*f-`w40TsdH0^v%DPnm*eTCMK40uJ-_{l zOE$Jg5zXuhER=+T;ZS~{lEXdL#L6TStdpwN##ByIao42D(a>RwF0aLxS*vSXeN8O| zH7%uWOKb6+H$R|s8u6h!=FF_mGGArDR(?z)6JFvsBatc#dNcJ>X4PDdNQ!;opkI>t zhc3y)QzzOGlF2OgM_|Y|b2jUdWp75ETf(|!*P+k(l{{0FfW{Jw^6;b5J_EAYXl$Y!-@68VfW(NsL#Ba zrM^lGINC4-u$i*deR4mM4jO_iOG8>GbI1|I&wH|@pPge_m3rQ0yH7@F8+H#>wMb)R z!xC9qFE`RV%Ue7%AnJo*9evd-Fv_=uTkD$ejYURwBK3U*-f~GEn`IbZ?^{|sF$3kt z*1iu|(y<5P0wt(LmP$7r#d=V+JrW^nEIAJ4l?O1-(c1>w0{eb6+h#xEIKke9Pt71U zTcfF*n5tIi$ zoLIX2L}@jwcWDV&vLKwv~l#mD*Q$VqeXue#~BSGNUsK7Z#;-}Q0da}c(napSt% zb>F(xFITTPXwl=F&i!Wa*`MP1><8huzBcWX34htV|1)!ns{S+PD%9$jQ-3hn&NzASO>e$h37l`??{m!|!R*Nu4;F5G@Vpr} zEWl2M5qJ;pc76TpLyv!D{-m2W-O~2kWBUIZ`SlC`oG(YtyxhI>l@s3`zyD=pUdjZB zvG500yl}|{6A#(tKXA&{rLP@=rhb|5PuumxiQ1BW17CSGV_0&_<=7wjwD9-6^y5!w zb-tL<|G^tBx+riJ?2N>G&+Q85fAh`U>mFPA=Fpq&Ec^7!`+?D+_}^;3f8)+^&!(TV zZRkgR3h+F?O!$xFUX=R8)_q%7-F!^nf9AaREWYp{{OxOpzjNSGe_io(WpduM35nO^ z{JZcc=MEj+{-?ihyE6RrzB~Hgz7g#KeaY=QZQpfG|NiRS56&J@_-^r^FS!-=h5!5y zSEOE^`FTZM_~iA|`&{@pe5OVC-=-Iwdg7uBnqPclYM=ENet0~|-ResX;NDYLcF0o1$jSH3&yyh|IO+WWT&uPv?A z4!m8{UJ`y)|B;_O|M9?&Ixf87vp+R#dk=t!!oO=mcvJALFH#%!KIFAyKYs5leA5AC z;dcG)&u4T#)^h2n|IB~><#6G9Nmzaoe#iRr9;pBG9}Ycc*0u|7-xRt_(>4o#+!rq& z_|RKlb^LYuqdAxUrSUdkMq$mx?RxcY@ARP!YZt%pZS#K_y*P#vj(ESpY*7l;EAC}*G?T26Pc%c zE&TOafBWXI+m8D8sKzxlW3O7e73mlL7h}rWp197!4L!?=h29d6e*>o(o>^tzWHf3nZ&A)`mOr2q_A_`feG9`f{<9R*KL z8UCMZ2CvzuY0nA&_0?I=&3p9nzdtqRs<$?0TyY`}5D5Q~*-49^Db4s~^lg{kwDkGu zsIL;-Ox&)F5%Ui|Y3&t1EWK*wIg@KIdk+0n_!S}7xMgcD>-X++Z#_5c(c><`_#phd zUUnbca7)#+%^j;|-BP(@CJw3%qn+!fG(2ANn;&;Rd46hY-pO;ZyQ@<8^KM)=^}BaJ z81UQyZ|^nrf#uk!a=P%-rhC4-pkw%$MR|MQ`$58*hcFHZ|NFZ8FKFA)_q}{b`;PE`J$mVhBkSMTe$U|6r?+U2y@1Wsn8CPRt#3X2*rmBg{dj);XQ9ycgp4pBvzFPQAo{Pq|U6*sy?~@Z}4*ZR4CBEz;{D#F}3^@DJ z!&dERN~k#Qm3?97GvWW{g^d1zm%g}X)nR?Uc=DyYuy@LjvCQpy;{6{_>!@yAaKY^- z{*YZY7vs`;;eY*)K~0;#er~Uivp21M;)B`{kSc}0xOSg;t8PDg-^HhE7moV;fTcKw ziazOf?YLpvzt4@hp5BmfzZge?4vCQl50blbq0g^lHp-T&g3XwOID-sX0d9NqV;>;LxZ z?SI<3_{WFFwB3k$5&rov7qmQn<=r>=zFd=?+u<9F?cc)x;F8o2Cmi^n*TcbsPMnk0 zh%x3i;oo=LHLt(-tMl5bvVL>)gD=fF7|3tJUvu>N%a)`MYy380@<9h`iLgIlf5vwW6QHNQ=pLFEBH(t8>Gw=QvZ@Sp^{W8o$&JzAx8QbPf_FdNT z=n1EKZoldCzStgydC1`5_=6>wniz|gvV=Fcskych3zr66Hoh)Sd9HS1MhE%o$#e12 zQx+xpPRm%7Txza$E>nw=t;V9{vg)~bSd&GQ)|w^8a>v}|^^GmHi+X5KUwN6^8mXzN zT^MgJR%A}d4li4{vWJm&lM8u2)r%&ZTk+}m>Lpq6=BjRKRdo-eH;S>oDc;CrwV;Qw z#Vo(p=K8AU`W{*|(l3iNac7~mVGpBI@9?^hPc3)WhMQWum$COpw#*(TDrTwHH}Xj? zE#By{Jk`6gV+3N}doos-b-JRuInqNLvC2g6RzFcD92m{FI@R$Fi~?cMvy8?{Bo^#i zn;LsD*BE81#b8{w1?2uG%E#VhYdPq|Wwm)pb?c;fh1L2}Pa99HGDQ(!yG6@xBmghz z1ngD6bs+!#M#HVH?KE~u)a~vt9sH*j2txJb$2B0LgNO& zUd#cO(yJQk7jZ0&YmjPPxwHG*_)Y*ENg1( z>FwD_RclpGXJRqCJ>C)3?CDH$Io|<{uWxMV(Ew>=Y*|$=mp1NUt;>2k%a2u9%}vdG z$cVRh)U;N`Ey{5yt}e&d1bf&wq_%o?Gc)RHk19M?(W0&z_q1nJ^X*Bz<%n5ZdJoI7 zyY$yama}d2Wb}_^vVQ5(cr&vEx#?ldMvX44Zj9`yjn?JOcrh7SC__P9t$9J)!i6%+ z>`9>+NpD@*I+s-+_gxeB{rI~k9+Ts(hUQw)}ZWFh&Kx@Qh7azFIF+PHrH0Gy%KS^A3pK* z=HPLntav5loRYD7@um`%eCf@34ZHe$HBCgihS{L^%vZ1c3HSW7)jXp7s zD-q2nw$--9f8(fHSljChdi9Mg%Fa{A}Xtn2|bHJO0oo^09alpz|M)k*TXjC={jyB3{y7<_rcJJRIgO`&{!QGH-Y*~P5wV;2N?cvpzeD$w^b{$}FWU;7*Writ%8{5=N0B>9N33gxS(@e=yA8Ttc! zWAIDTaH?Lnmk8g{BDW8GzY^bY_>?{3AfyP7NEoBUH^vN2hwl*ZlC*62RQjgF$J$QP z{3b65-$>z=nY>E)@CF@n$C^D^_)^q{u)2L zOVx;qLFd)9c2YkmbAtUD?M!9?=qS)4P`ooG5==W=*(^}@B=jEn@C@?MJ_pywgJRDC zA*b6LK~Df(35vcYA7z^ldJe83BcBhf0lgmA^`Q5FqQA923<}-$r$Adk{{q?y%0VRp z`aS4!&;dyM3ebZ<5l4F(=qgZR@1Fw7Jh$V21?Xv@^FY^t)`Oy#wx0sJ4iw+N)y@FD z9`r2Gdq6J)<@j|8=pR8Z1!Y~J*S53H2jQonujx}*%k-(wc_`l1a!p=MYip|Juc+W3 z?>HVd7}wNLV_s<3qpi4UrkBXx>EkdZN!2K?E|=D1(vvoh9vnx|`XY*0AkH0qx_ymo z?&O!v=D#S2GY@y!o%L8(0)i4;Y>a4J+Be4>cZU= zfpW>Zom~dQQDOrT5(U%z{kVr-GvY>QW+4@I@!)#IX!vh;&3 z_AoaubGQ(ftjp|WM5-B_gB+Yx2Pfabsc~@dc@*6lmhshrE}Y*vI8Qn_e|2y^ba1|N zaE5SD5og3c(#Da}XsOPy%N%8sVHkmHl{4%F9h_rr9Q`0_CABzthy|Ln5E^nw!*&ao zlhh4OIFPLlw&N_eIwf2Z3NPYucN{eY07YwkQ)75(ZKSS=*aECoSvfLJKxY8FCFCtA z%J=YQV>?fsQI=PnTapWS2i}5gK|r)A4FWo)6euSZ-kfaSYI3r1Z?Z{c1aqy>SWte^(sf+s4GK^FgdjcgTfqZ{akq7rcBYp$QLE#H! z;bgbpU+gQjh*+^ivVo7`Eh-EGMur#>*}P}klAlo&DuH@FKv$T(Xv*d8s-H;D^5uF< zivz)2-3q#lE=jNhImC#g4o14O2+xvV;0sVXEhpQQ)~%)I`+!AKP*mu_UD^^OOoVId z7vY&*FOAw-RQm#)CTE3K16-k@p}s221Bgy;YFbv5TUFa?h=sX-2nQpo%tB_ME*(2i zkH8E}RSAftX9=R#qUxn~SsTNaaIu!1W>2#%6D`$g;fx7U0bZN=uCJ-BieA+qOSLt% z=}`{LQuP>>AWBdfXWKKfa30unKXufu3 zlB;wXB}qBw+4chvxGoMkjxLE-sN%1of3x}C(s?Sxcx-82n*0@`P z33YlNa7s8Z!}Y^2*0{@Q-&48_<>;in#K5rlYgaithQ)(@xo8z9hDBsWL?A5A_`eKc zp=Y9dhzfag*nRMS5iI_TVDVoBi`_(K6|eg?mSCyR$*`i95K za78emhm8k;bqns~V9CK_oCB8Nl0YS}2IXM5MZ*-q9t!>8SPs*hN9E;IGo$$cHt~oF z$QiN2)5X67YXP3An;P+utuP&UbpB6_y}%IUVdgu*0bWdQaS$*y00SV8%HR=IMovT@ z0^YsgnP3cacvQt(3HX5AnUxBd!-a4@=LzD1oXOTx!;{|@@Ce!;23cZGGz09G<-$YX z7h&>GL^_j6!9q-HB`yG^QINKH)Jj45;gw6`uwsbV(-oLg30xl@?Wg!X5XU|SYO`F< z#)MTYHn%O%V`sVC2B`(ukJ+}Af;_!G2z7%pz#(#9t{8d@B47|qA|}EF4onRzawNtJ z+{|*kJ4qZ?fG{Z+SS&M(npMZ-aq+{*A)5&6TrZhvP~-^=JPw3Cdy8rts~0dH7ALFRXdc?3VEAFnUT?Av5h$%JKUQ*O$9`dv`;3GU zsF8*lnOUKsnE=TBfto;ev|E}O32a$rqM1F(82cb1Rm)w{mP}Ox@PHZXifurk2d39w z&;yu*pM=g~>)d)om+G)X-`D|l*l@alCNQgPsM2tJKp&B;9)_Xv=TUcP&aAR%hjBtG zup#XWlmEl;JWSt8JV+8dQXkZqk{Wb7V=+^zu^x<8EM^L_rqMnrg>^Jp=_Joq6aNdb zer&)i-GloOz#{|otp+BJ+f{9X926V%hg=pRVL4U9H_C^=eOv`L?o#YZG4O$irZHY` zUosZ8p&b}tK`hfu1e)WC6%&LhJqm#`yZ|Z{_$6LIa#YCZ@smJ8OiCvbtz%;b=7jy; zO0SGC%(`mo9Cy7l=g1((y!gtnw9T6YVMLf>DIrumd&qwgh)@XTXxBXg5u3{{Y(9~W zBRIKiF079Py*sg=@udOS{~O?nIAFKx?VC_8Sge&v!vd`DgzKAdhm~83nf0GUG~!I6 zAM>f>gIS>Nq*eV7!5Xm=&PJZhWGrg}CNk$#$>@8rz>e7De=%gED!q77<4gmwhvEV{ zV!w+Z!BIpbRu=1QILofs+)2;Yg7G7vo=7WNWfxc~#nfr+wC_)bg| ze!Mgm#=}6Y1;)Zk$q>F1D`lSWotRZ;3x7fWU$yy9?)+Es!ccPfnSV~gYa!t~F=^fv zz7s1Y9c!s>mlG>xx$vEsM%N18iD~pF;X5&nz7>AhfkkvU)=u3nC-zB&@SRvJHwfQ} z(Zvr8qP;mVR}RFQb1dwZI^jF9jxG?s6C3HD!gpds?TfW^x66r*lqY;Ac2Pw5PHdG+ zh3~}f+9rG_*3l5WtBZwQG(-4K45U+p@5D5^S@=#Yq8-9_ViBd|9fRBD#2ji9z7s>} zLE$?wY2FvU6GLSmY^rg)oR~DV!gpfH+#-A@_RROfcVfwuV{OUpa$>_=D|{z5%$LG< zV$AsPuE6bbVzgW!d?&Whqr!J$1?>>N6I*UNw&lda3OYmhPRzMyh3~|K+Y9d&VqwnB z7rqm7?jGSgv4!3dz7rEpVH!Cx-X`I$84JsecT?P_9N1>(3EzofwpsX2jJm$KU%OpS z%()|l@5D@M7QPb$=`!IvvGH~Y--%J@!6UNU<-|a05WW)|?=ImxvFj4B*Z?~Y?7Dp6 zJF)976}}S#X`Aq!7uOrs{@J2CAx3*U)pv_tq#OrwMF4mTFYSe5Xd z*ma*{zR|+>s&Soh>D@C^3cnz(i1*;UYOJ$JJSQ4Irhpuj>9uoJdxnq@J?qxn$PK*# zJFo|5f@4*a1xTPL#c!0AdCWMjrY1`oy^B<}hiC+`ie^tR0Akrgk5DK0<0_*)z`g1w z^8cqt>{~5|@#4z=ZXEm-Y>>E&>L4*c0St!~BRQ$7UhBnW^cTR^;NbZ`eaJp;q@7;~ z8c9J7#Z}^abQryx-qEOo0>qVoCN3=Y95B!rHTUEwf2?fm1`vUPt<;l2KUUOevAYB9 zqyvk^SJ(>GQAc))OT~mJ>PFh=<-2npUzRa(oVO<>W>h%9ZWQX#o*3CZ;2|A4shfg8 z!Yq&jdjL{o$>INFI3F`5J%-;gESNYqaTVTfz)u(_mTG zp43RRhx7u5N{`3KZp!EXHA3%hf%Kp$#oLnjlo+q9f_ROqfkq)X;}zEdGxwz7{0xMz z4N`Yc;@NG4rQStCTE0hk$KAB=-NO3a1Jop=lbiU*J*kLp^6-BWF&G76nH-|$_9~W= z2?iWjH{5-!qF$`M-M|>`8Ja%JIJonzQNx3)oo8=HXy=6#THJR=xl#6RHpCCX?0EQ2{M8~SZ1krjg%$&ThW}=5 z^QVj@pW0d{E;_c3KrIaKJe%TO8p1~-Izx$_g?&5SGwd}iv8M)(d9-uWi)4)}NuyuWs@$$JLA5yE@X%sfd zd7Hg<}^)UJ}SE8ZcUy#5;%%tvQ8yv3L zzx+CX2@tO6#YoW3l0OlYtp=k-`vlMk=p@iKQ1+u`paD>f1?|P4D?lqiSAudJI0>{0 z^kh&DUPS1EZ9(XQuC^N2K%rJ#r5`ZCZw&?`abf?f?;4SEeI z?_bw}UIBUo=yjksf<6g)3+UURw}HM7dOPTMpuYtr1katI2`I?BKz{}LDCjiMEuht) zkAtoReG>F4&}TvK1APwk4bYcBxjph_(C`otv>g<;x%SgRcYyu|^fS=gKtBh41Qa7}`%|D_fxZd)E$F{Ne*o3`qTpOw`;nk1 zyY?}l7?0b>gC>BoJ@cB)bP#?6Wb#MfVC^BDH%NWhN_dDvK$-?=StubTM+7?h25E;k z)FdBycsM#PSg^Qn&FYWHii)#hz%e zLoH2_rs}2!!$Mo*l16;FO!HS3S1d~%x1b6bcj6tNrh7EGRDZ{(>NJfT#h0baU-6IA z(~4rBg?4PtZa(SQ+IQ{FwvmhH*O9w;K;6S6Ng~s+H7R}bye*inCC=tlZn0ABEKW(D zp}ey?zt$y3c5VyL+k#%Dwd03f{P>Fj2)+^ciy;YvC2xx-3vU|!Vi-ec0sgYFCdt$V zLmYhQ19B6p0X5uQ-9x){ya}P5>-|YhkjS@&t55|lnZiIgd$_v#6nv&@a+jM7<76Di zJ^FhafR)O+HvIsO4v>Mb4it>{iNG<4WTrUJ=UMR-_1~(QAFc`kYH(0w|_YKm% zH+d`o$_>)SbBlvzn*(bp7EGyj7~iG&KWJ10^iZ`Sz`a-EV;rfOQp9OK%2N-g8Ibp2~hgcbFmqfT4IHoug^V zkh0q8kB|h{0ebisdq0PHgJFlae>%$8wV3t|OuDnaJ#~9jD-rF8jxu&FmP~@{KnB8vpM79_RLi4l zQO2${7@TNaTb_CP)u`4wU5hd*)dU<>E?MWiXyaJRnLQ(#p3vJbzh+p$)Iiswj6FSj ziB_hHMDzIy(4mbIJ6QKn#;(QbcLEQwiyOD)>mQ?9$LU&>v1<(lC)yIyp9-89)!L|Q zQO2(27A>|IrfX5gu7v^1lETa0ACex`dRNz?j9qIV(PGP|yKhCn(&mTj zNuZ2fYhQ2@T;$U&IBE%+p&o^nrfX5guEo-eYQ1uE?eeJBB3+9zb}hEj1Q%{1;tB)z zU;s7Zx+hbd<4cjQ}Uw zHonNaw>heH2nQ!P%Gk9yJ|wtkjc(cd=iCt0nxkt`#;(QQ7uDMT{<1ftS{LYAlu@aE zN#{7nD2^D>G(RzIZ#*v;IelB#qKrNEk)p*hhc4vZcz0B5f4vb=#;$cRI8m(BZ+_G7 zf~Xcx3(--=u5}1FQM}NKQ~Ny_)taSiQO2%ysAw7YfxjL6=$BEgWx5t+>{`j9#W9)g zzT&lksMh(qRx(2DTBE>8a2cg>+3H#75Jnl^p=(jbu63AAYtFcnv!hyn(zPgK*BUKa zMhf>kc2#>+>tkJuGIp&Ln^tArqD!J$iMlb$s8pvI=C$N5b`BRi9N*}kzw%BDKSoZ+ z>spjS>=vM@Bfv>;&Bb5V$7ko?{*CkA{VS0n%#@x9%sma?EZy=Ek{$?Z4Ym}Lv&_M1 zw{fiZiz6YQ;Nr+hmk@ZPEt-pSbS=vC(ZW2--^lTaE?Lj(AMBPb&{ju5Di-SLHfYH4 zT>TuWzSNO|C5)7eNfRcRq%#_?*JCKA z1_C98-n?Lu$B0nJ^vo^xlmv?c!C3x47WvtcaR`(<+or z0i(qx1l2HV+JHyE&HjxMqvUdnJi%Z|eqpGv)M6VCd^wr=({xUzdYnd5^~%)C)}QCe z4dez(ii@q8i>aDvJaC&emKy+yt*@vcFJy_fqCAw7X*_j1Dw(aLpdim54EQZNcqq@w zG@iSWP+-5%2`P zg=IcpFyE9{YY~RFN&v?Kd(+7+@c4>Lz5cQiv^qVe*qU6i+)xaiynru zjEw5*VrJV9cybGUfxN=v=x}4Kj!3E`!_L%C@&)s}`MD+e9)0b^R*J=*+=9}wk}{w( z%eqNUHkMRu5?Mw5kiRhC^%)WwcJSnhg#~#&e`#Ks5pHd-nZ?DyTpt>%GHwl;6buH7 z^UA!XdRT@XQh8F5zbM~ZT2f{N+hffvDGTI!3j&26S=h0qIJ2}MugIV84N91~^(g1Ma^73$VTO=&E2_u4B zuO}ZvRVWu2%{du4X;>|gKVh7T$jQL4%|0dOTEh$L8)~&!ok=MRx}{|jLw-JgcI@At&ASB%^JcV5UBC^@D> z&@#K&TZQMam5}-JSS2?DB$mB*5;g766R^T16$^cnk97f*uhqpuYdsnQvtr3v zrZTkQ$FIGsoE@d}k9bCy5HCunoIS+GJZ=5|WtdJQ7u^GK%8sh;ga3=u`CpvQ|KfE1 zGB};mId>1JQ$9eIiUq=-LF$YN=SbKfJ6dK8)H^~XIbrHz!dZ5KuB0&w)+dpCehzig z2_W`Ukds!dQQ{B90-7Wo89^CK{3g~Y(MolMB7zB7l8E;XKLtCe8m7@5UDd?T_cKmvnv} z>(BvV$a1?Ai=tKx)&syZb3H3q5zH+P=$WAYMOfkBrfPg7q6O=YiNmtMz)`rWhFZZM z!(u^OwL-~aqAG&N1;Ulmyq>0}jw;qYWMNO>U(Mw92-1)Mem@By%SD~ykPn3*IC@+N zld>ifq+}!lj-dYKmX#F;yrp=tmpH5$bC}`~mDu}!284D`fe+&WE@Wk!*sMCHExQ@k zsp11O{5iy1iNMl4u!ObY1>k)sa5-H7uGk{wo0clTWp!HGEf=T`xkTK z0Lzuav7quAQA>jhdNXxhHaWt;75l<~ie=*e&?WI+zaK*p63>kHM_|Y|b2i&2Zy64p zUkY6fq58(Kbah*_QSd}2xi`TQ%?A3D;K3Y-hD+ims?;&}3FvU4S!KvQ(=J1QNtu5p zkm=YKj)8bsjZ>&xN`%45^OlFo%X|XIY1WBeq8zfjAQaoW=}*Ea?lG3}?%*)8IBXcl z-QxTGEch`^g-|f8bB^aSlyM;U&n_!hCCh^CzXi2zv+4KeU=K z;LO!9AMOJ<0EMog2)fMig}qyn&8qBzz|0n~M{toWV`jy=T*5x7 zF=oEJl-mR62i$uZSt|J(#Wt#X9oteYl;@G)uR#r%<4#_AAYk@gHf0W*KMg2p>#UVO z0SRq@S@s&*WVbDk)oJ!H18SN~2iznR&(JqLoW>ZiaY45TL%^QePk( zmPuY0ENSZS20Ig|ztRHOm)bB8;e`q_ngJ8dkvg1bs=?qSJq`k2;I|#iGhAA7yShWO zbfQ+y5qT$y)GfkyqE`Mz_^0i=uIb-jo%_MrBMRRw{_`cbVm}HZcDtPDm#xBgqFg>9 zd?(7~;6AkDMDybp5M!ZVa?emK^vlPE??kiwQut2v%gG6}<3!8k#_Cw8mA@Ch6BTm^ zx~tpeM8%vdd?zaA?ZS7WU;Zfk!zZ86l5ziyLk@gv%aS`jACH^$F<8Tkg>reE@SP}^ zYlQDa(R@YtPV~$ESTc0G&U$mx_y0P&=7aYrqjurlKuW3vFJmir@!7GPf zoLctHMc82`d?zaA2H`tVE*}uS6Xo(B!gr!v4#gUy+vP;LoGg4N>gHL(ccN}SCwwRB z--%Ay7iH&mIZ-H6h3`b;TqFF95%Ui|Y3&t1EWK*w zIg@KIdk$NWh3`b6{89K$6w0Hq@hKL1XQS|)=%AMi--!bHtni&^mTqj3a=V;pma~NK zM6_-v83qr(d!6z4tvbZ~Idt^LOAQ^#aB+x66r^*(!V|YUOW)??j>eQ20)i&M}xlxm`|lO74k?g*JJ* z@SUibPYBj<9X2Sa-!fC3g3x}dAabNsF?o|z7zd2BZ>B%=$Gq+??k_R zTKG5tpxM6)avz7s|B8sR(9ET0p;6V38_;XBbaOR)LP?Q)`JUMc(^ zmfw2qhhOe^r0S`wLIY1)T_;B-w1Ed;GSbb4Vf$fng>o5}DCd5Ff#}H*>7PE_99QhU z3QVccID0WC3SqO?4E8c^W;X?F>^;}Pw|Xu0y@;;aP0HAJ%z3rSAqZHSeU()t>&iY=Bnx?@q+NgkFF_WdUbra3VHU& zN4(=rg$0f?zS;n;NxZgyQRvIwshqg{?iD z{TfzU|NjYuX=YEhw)e1%Vs)fFMAM9A^1ncsy*9g5K$vm$WISjPwz9WIL)=$)2Q+gJ zfH2Lby{EX9vDzZCp%69WD#QOh;Ep}1MzbIzI&NoNd5$7P_9V`3%3L;B_hM_*N2x5B zj5kxgfMaRJm+VR57!@M7#<&18v4tzqrQ;DrS7bEs^H#8yEV96>hVxs)ubk)&QiB7I8o5{?EZ!#!9UT z4ce2|70V#*c?!d`CkBl%D+;vv%ivdPzl>SJVm1pbW_nguvI55ZAB!o9$(f!#@fVL= zp?~6#(Jvm8D$vvk87ih|HlvZ_Rmi{alMNtvr)mMiNg-Qzcm^yx`-DV;vQ3UziW`JS`3`E9A2yqk?k0IvLwR zurmYplv{@bKlGgeiZ{5}%*{jF+^j<1U;(zFZ;*Di$-7SX4bmQHhq>*zByt#F=C-b1 zld=k|&NV579GscHV^-(ADI4IO^5uGF9W|3_>IIb zrR@NqH=fYBK@6rpE3urml@V^qzT;lR)|Qxk#{-~|S1V?3tV}81xFLmDW{X{aNCfv0 z=CXYK+?2}ot5W8yFHV^&7CQHy0ol5ZYf{dIEW;ZR-i*XWBpjHSMs|Fj*ZHWrJ^`nGNPh$4;&KKGadGuTNnUyIcI$wD7+eBb!HekPs2F3wr`cn@4 zXegMl-#`g44#>XaP6S6%&RR!`lne)VIMi5b+WHMC?IfF2{CRGqWCIwTdH#*Fl5lak zT+~5e6MP$I6@Yh}@cM$sdf7Ou0lbIE69CRBk0XGkwQ*J=%%2M%$kmE44Y=A&vMFUN zNF*(^aZ}0*@S!w`A6dTs@|3?Y{GpWBNH(Or2_i)WlwBzo1?D;Bai#kXf}zWLqV9WC zdMJeo(ES*si|*B68M>dq58XOl_X}J?_iK_3Dc^(GbuVN(r@S1=?0jtF3fIP(6z#0U zj?Jz$PqlqDW}DPMih^p})}&~#DV4Y>r7yf2%ldS#W7-h)L7f*$@;0T6LTxU=H#Ik;tN>x&k|_63$_SDTqHLtE^Fme|l6I6N&5|tG9SeD+Xab0y zq6~ODFFaSN9HVk`8Lq7Pf#Ou9=!q)&MUlnUOO23J-lPP1Sbv zh!+o1f(2GVwpA$)Hb^7t{z^~{O~7(vdE80CLr^cPjCcntsVu9x4Mx0dO-8%}l%T3v z-5gt$#LL!W#G9xDGprWbiXgZlg>A-&dWaJALG>S!Qp(ZlYRpDAmc#HW)nX8k5kkb9kOEcz2%B22w;fZ( zKLf?Q6*5LUo7%CuueNM7!M|a`O%t0<6K4%?|3@;0sP?DZ&m7+IFx!O|8Q1Ag$*OCI z7fn%5q-0GcaE%OCM)8g8c=#q=t2pIIrPYVYM%K)Pr!ZCyR4U;eTcO2`6FP2Ohsl)dLn-oH%VS0-;C%zu?`GJMM36q6S;c~vH_$>g17 z@-8-c{GPnB_o&Hx)8u_<^1d;B#6#lDJW1oX4*Ed*9>@#BNw+?;!Y8`liCCS}dwk&_S;QH5{Q7I4Oh)aeN>e z4IgEb@jIYP_!I!7B}k}}l4mnUZ8&9AuF$OpX_JS2k8eBdr@3&-K%rN^FrBBj z#$KA(yuqm+3h5GIypeF<7c{%8LxMmx=0`zXs-+;aZ zdOhe{pf`ek4tf*lH=s9zeg}FB=#QYcf}-{XE}Nfdz=+l+U(lJLgw<{V?GJhi=m5|)peUR6vq3TGZoeLMFVH(d z_XhnP=suv2f$j_XJZKW=+o1b_ehj)ls0%fJ5NLl;lyUn3pa+AF0zCvY7xYljLQs@_ z`x4MmplzTyTho3HXbR{ZpofFr4|)XXtDyJja%tQMm z&;rmr&>-j>&_d9~phcjkg5oi+eJ$t=(3?QZLGJ>s0DT*@67-*-GeMJZmzV{5Fz9U1 zAn386EuhDNo(y_C=uMz#bM1G5hC$y3UGV?0_Z{F>R9oAVLJR>+0znZ014IES0trY{ z(oRSq<(LL&;1H6)38a~vP!#cSL&O-dV(*H*qFgLjuM`Chi?SK)u( zwPz-CN^nHI-}8OH^E@-}p0(HRYwx}Gp0a?S0n34L7{Drky@8NP?_}USU;(fS=mk~- zTY$B|b-;Sy)4&Gc7r+I;Z-H1?d;6h(o(1HX%l^j^oCE3+{29EsI`KE~;)>E%LHg+1 zNxNEiVN+@r2s?0U1w}LySMElka0NsTEr9SCilfVE>nn5R2iq6IC% zdb*v=lgON%FeG|iNc6hXaAt*e;g;ow43FWRu7tCf~P+sicx8` z@DIi;XR^_iBT@VbyP}KqXv1}mpfz)=Q8Rj7B(QckFeI={g?dE?tC|0>W}d);RMm`L zFyy0rWntt2$RV4thZ^t@RS!cT&6<%27V8n1H6yixO6kQ>%BanNnvt-lAS}}xjLKwJ zlA0NSx{6V0wXC>{HG{#*jE6Nt;n)?mMLeMtXss)_-!lH$m5&lVoebvimSG4BX+j$5 zN}9Z5Z;Nhz9$XY6w^2(XMA+!bPAF7O5LA*PF-GmY0MANPeW4{O@JOM2Wp?NR#Mc8k z?;(S;Q<-M443iQ#M-Ob)l|3nvu(1eBDPmbzs==>@ZA2}rzLJ0{8G=nZw5WIN>gZV1#8US+jay8RD6O@?toN zUn+eo8f9bOie+a1gVCjBlA8>u7#Ult+Qt?me=)2coCz2mYsnmBgt=YsN55V!`YSUmgoLu5xC+4UEc@a;eZhTaiyNwANW7Mx3j%iYFCzrSO>LpNhkqEdOd>Hj2 zVXsG6qh3taWdM4Tsk(f@O7T}+WMDaN?1MYt>4_a%o9^knWd%903v`gZOF|j7rH?pz zOc-(QiEe%$%uYkSv#-+7UdPVQa8Wge6b37OHn>XD%k1)ojx7<;^q^0T*;8pG>^y`; zeHbf*AyjKH;&g3Uv7I%=HRn~V7S@7Lq!th&o%0hVDth@(@b`|rH@cZyPE>h+rQFP6 zEqsWMX-{qfr*VnkW<7#mImSp>>>G&Ouw0N9QC3j)A>-em%Hru0y)Lw6#Y3zROxn82 z#T7i(*0L;Zs|)Nrp)T%=ZpIeX;Yb9Zne2Q6VGma#B!X3X1W8gDh*Y~0(G{vmwxRwr z?5;CVDt~bpNI}RqCZOGj9T6uP>Plyd0jq#QLQkrR#@ZkpqFRDPs?MgQ6(&?6WOlwA zT$*#<+<9FnTv{t0MG->4uxRi$JtaK59RIVYI|6thlHp^=csd%kW5ZoDXTX$d(=)SZ zYK$wuMJ*vZV`$458Wx)&zLXci>VXK8Fjd6qIrpCMXqlFf`pw3mkN73T*nLTZMam}WN0|bw-qjx`={YjzI`K&vJHky#k>G66=DNi zDlgx{r9upa60P!b3S270#c-(*|AI@UaU_-$Dnu4s36iVnaH$Zt!KFfc1(yoZ4^^Q; z%z#UUsD?|0coZ%bBDAv+Vl-ST#F=oZ5X<0FAzpz?h3JW01XYe)xKxPq;8Nwd5-t@Y z1p6Nt7OU2SH#^9R?m*Tq&F2%>6WvZP13oaGn zd${^b4aLP8GT8^NzCufaD_&eVa2+SEa9pVnt;T5_{5|+A+@RQU@EKV=T;xUNY1MxI z{qVT0yZEXw^ZooUgg<@*hmf>yhlff*{JZI?#lycSh`-uj)n8gfPw{_7#ym6ZBH&jX z+0;=!vNGTq*(}2oi25=PbW=YguYAPAGJk>i)FU32p7UIN?=ycD<(co}d% z5RV4D!$UOfDqu43Y9O9PY1aUAfY$U@Q=Ed3yjK1jYlgd+!|x zTmu{mTnpqv?MWaPCP>SB9`G69<-liw*8^eRT+9w**WLRR?q39M17hpk+ZkiqR$zDF zE5KgBZNNUjSAl(juK^Q*uLH*bvBfRsg?9k&#r;m;!@$phGzGp3$mf<{0BLUcOW^Ck zuYfcLj=f{=(`eJZz-NKq0N()a1AYYj7WgUfd*BY>ejwkI!S1N{ZRioGGw=JrpMhTk z4*-7x9t7%!CcWGXfN@E01TYjB14JEr>UJ*01gIXC(+CIQc(BaUBDxOdw_U$ z?EMi4Yp32&48>>@ZxpaAFd7&K>q%9PemoAA^CZz#+f_AY{Tji&_bA zHgE*c4a5eAcQPi@F+l!5Z7gsua2(JBgsE!p0^q5@B|ylOcP8eVG~hg7I`C|u19(0# z19%~D67UjWCh#&~7Vv5yWYK#TI%*z}9o7lF1b7%VCHmKJS%532z^j18JHVu{+(9=QFP z0q=ldJ9 z)l)IMac)8ZLt$(H53Sr7X>~ANXe&87XpEUhce(OnP)-P-3=g2B22iF4Q050v&M_&f zhA_FA6sGQSmAU6Pc=UjzSnC;M8p_2f_B6P5yTVTjEIY<2@X#U;xp^F6mi=Bu0L3Wj zlRBlX>{|mU{|=yh2}%@l!4z2680zK9ixG3D5QAh;dIV7V1yF_tP_hFkc)deEq<-ql zOFgBE0HHwHkuf zh}S8Y=KLs8MsUsG!4%`iGbn&E-iP9N|Ajx7 z{QsEdwbUo&ii0K^HRYwqE)Gq~PXhS-P+lSxGJZeonB>UUgX(wq1-A#n3n*)>uk^s^ zV{PsH$_g#nN^)0}&DTAWlQftAn#;NXb14I1^3x^!KwP&A=4U2MH%~b-3FQz@^^50> z%9_dsHw=RnW$=gkHRX-4hseZKiN!Rfir(^H=rYM1{+f)yo(fk*O}SpcxfN~ImRDC% zgP(M#qhN-?$<*XLhchE>atdrwT1}KOKcOdJdUyoQQoRgfUfV{IB*fz(`S`O}?+d3r^%_*NFZ!X{OC z3M$TQtf(nN!&`qpPMe}9jTkd3-g5ksHMOLZ6Gw~{ep*u-FV@tyt;XX`T|9$XQ=^*X za|E%bHslnjBz}C!L9D6aH7)Jz45+P>RE*sK!K{_lp^w~)$>Z25ijQ+dFl%Md7_=On zM{$yGc(QdwCcO^l4Dh|I^KwKCmM)etTE}cGPjVPa%}v3quHiL2?M3h$$W?q?+6RlT z3gvh>4@yYB;^Sx>EWR?(%fYin=VN(;#mD^p0G<{ZVcO4MJox?wo_C5=x*TtV#Rv6U zYc9r8aGK&X>)FrB+>7wu0-nqC2^5-R(D<+{(c-vnEID+1oI^%}$2CLob!{g;sEt~; znfR7;mf~x#{=lNW44%QIim$!;TaI*Rfak;6ZG6GngYwc1jnc%1!O@<)tU`QGgQuWE z@wHcfEN?S-9-gE4+AA;Re$HG?d$UsUwO3wdtJgd%+i~(}ue{9P8t^!(+W3N%mvh)c zokwv7Z(lBvcZ07-?V;oA3Gc}|&!OTgME=Ub_ZTZ2M|<_h{Cy6dvNMGZ8fftRy^Hvk zfoDd8;%hIy1@OKYJRLlTj_*Fi*B?BuG#)y>6TugPNC)%XZXE6P4=mTT`@!?Gt~9il zzfZt-(pl(Bx-!}iaR%$ZRj3H}QfwbAlVnBPllHY}T=a>-+4C=o$G8R?C*ANo5qy{F zyzR+-70SC6JmZ$D*xD<{WbjpiXI-=6ivt8J$MR5osC6Fnw-&|Mp4?-o(lWtwqt3^4 zgT=Q9>23p0W~+*?z5H=pI}1FH3l(2`?S}0bZ3}oFyy(#JabEZkJaLyOzV`Y#mb=<> z;7Pt*@wHc8j%(+EXS>eVUU|Jp_o!9Sg`pSoXs^6A@OutCqpuXUcE`0k#8(fVkFHXD z?ZxK=U)w-lS<-XQ0GycXhUCXrcZ?PS)y9uU{fHy zc41A4{%fD1BZdthHgax>+7zHw9RA#z#!OfIZ#HJC7ovS*rSiL)_PzhKW%{Qr(?4yQ z{xP;p**AZkDbqa|*Y582ijH zS#5o}s}2j;Mls1mJ5ATa!(Hui!wgbIJuT_cVwc7KCrPw577&4E*9Bo;eaqjk%*)P7o9-%vNiYd*8ov^YS2S)_e4>9w z)AF4|zE-!|Eu^%uB}?-I1};C+Mjmq(P^3tgnv4 zu009}+mT{m&`jLl*eT29YrdAoyT+q3uv?MHEuIW)Mfn&S)s1)QruS%;?1wQ}q>GS9 zN&7(v+bo>YOkFoiHYML?ejK?)Igb34LPt7UHZqoFEUT@q!{(gFU0cqYXMS8pe)1h@ zv~5S$C7>z!6`>`oB!$Fj&P`0Zu__wDS5{Fk4b8Y7f|_GBqDqk&VKf>H!DeMlcR5q? zQ*vmW(Wl_QmxWd4evFY~L1A9L!$qrU%*eO^+09Fx>_`h@m6g42F*MZFtUROPS^RQU zQ!WaMh*Bj8d<^0;>Ojn#ftcpVFH~|x4yZFy@2ExQV>W12?$QP~s@1x0g$FW`v8C`V z$S-udV2`m7naj${r86T7_8ZyrH=L>>^liicgVti%i8C-DRV=7;l~vZcF&>tA7Euy^ zKRdFNz)t8sSp@|!OgG7uo>frja^}%S9Y>0*&=%6Nb@MA^pyC)r6RV4``>fi$v{ACe zmYLw2S!9${iqY)KTE9N`KBf_xj4+BsgQ=gQW${;U(;lR!vTQ!KZz~qTYUFI!oEnj* zIYuAW>w@CW4lJXqKBXXKl1F1{tDDrTo~=ykF+&5<3nc#yp4xhucqp_q2+NUG5;2XB z9*%WfwoVj=0Y{o^ietK1d7Z%w8j}V$YNZ1)kN-fKG32=l90diG^t4pGBNQ2%CY``3 zJ(qoPtSX^VTmLl!yqpC}jM~LMv)+nQy+I7~(qv^E#K|nH%vJf0;yi4cOCZ~3dpX>& ztz}N)0LHn**N!h)XzUx~EvgVT$C}@$24IGu1pf#*qj7O3nnG%mwQDv08;^SjO4yFz zL6lhklo=_D45*S9nk}!WS>URcd4$pS#pJM1w;{}7F3AYwGwvfs_M%W@(kiR3f_>yU zwMNHAw709LcDbYZG*hAultDe0^nU%Sc_2vaYkh$9(BOU=YG`06#p4E&N6X2#f{&n41d z%4SQ~{DUkrbHtUA8UqQl$7J|OGRKi4wLlBB^3>9J`l?i$%Pp1Drs$*ahce^LS@?Y4 z`sNc(bXb{KkeQa{%!GDM5_K+C zhQ2mnf=*=MH`#{fco2`V?tjM0Gwp<5iUF&fI;b=-NAE^ggS)oggO_+CWBE8?s#y4C z)3y3GPhDw!gR~E8ha49UZQ>zi zVv-!-C?dKdBYngi-w$PZ+E^o^CG2Rauu~TA?GCYGr}+VouQc z1t~@^W`Uc1i^X>}FzC>S+MO~*gz?|Smvq=sC;(h)VK}O;tud{+vmnp->wS{u&yame zOHR5-3T2g(8drpf?hrN0G1qE^o2=_bS-OL$W4S3gYX9R92D(|ApsJX3i(3X^kx)_X zs>7T03%MVq54tu?dUIoktJMblklj^RU+bwT^HkQ>&^f2FN@iBp7dxY9mz8r%tL9>P zqt->N8C`$WXF)0iR7Iud>g$2Rth6bPLbjxgD~%Xee!T_pZFrpwPdi|V^MAVq@ioI; ztFqqPH=^puK5tF`V*3U1Rw~N1Z*X4Y=4&44GV+d$3ocpex?j_7!eg75kU&e}uLwQR zQg|F5mj<&GK3C{JdPnU!D>v-UbIyC^<6|;zyj0UJ7kZ$j@K1#vXeoR&2Cad1(#&n)!>rc(@(cP$()EmDL?$mF3%5 zXvIGbf6Kf5zvFQEr{V9}*|lY*RSofjg3GZR`r3DqG^=0k? zPieh}#EME~i+ZNqG^m>-6~Hk3ty`)70}YJpmbXX7|Izlv^@RR-TjHuBN9v};Ee5{- z_@q@C|67eV@{do*5K0k_|ADF;^~blFD&pt>arrMKt;A)_AKvv;5l85Kysa6Hl#5!c z5+a+<(Rvj(X0(3B$-P?mE!as0P!5txfmA(Rg$a4!l6440G-3 zQZ!Gw5V&=B^LOX;cW;EJ8>i;}o|g@{%!}JW0?hW%6#S-@;otIh@aCy2Cp5KAn$Wy{ z<-!Tk%P$7a_&0WV^LqS3Jf?A=`vp)Xx_K$qxXfgGxFk-!4EUpUo8b+W=s8+MV@zvN zobeO*@Vi192ed|53*C4$%*pFn40mn8doh|Ov9?Z1M)BLM7P-l!auc<(DAKSWjDoe) zCc9b^XKqPj-SCH(_#MWkUbr5OGfu;cdAchPEQ=iI9JY0B1 z1GEWnsSsIksWkXsP`n_5JC=kEwH&8$@K-`Sq?Eu%kPKdHl6!jb7X~~G|0pCGuHWIc z7Fwi}!|HEX|GXSNTa~v@c;i3Hd*IiMbEFo{N-z)RiFr5^xHHux^O*hs16BAOP$QFBH*)mjlXxr!CHnTKl5Nd_-mgN zKw-`Dcu<4oM&Mt8O!F}y+x&6h0N@kAA;2erS-_`&xxl{z3xH1pi-7Bavw<6cbATIx ztcy*+^MPLhTY#H^tAWn}?*~F+yhvL^FY>+&d=dCI@Fn28K!$q{_!@9K@E<_d^XtIx zfZ*|VMp@nm_5ywY90>dncoOg<;7B0j;cqxT1@iyzp8?Z==r3OWmTo7o6bKphmIJ>4 z&If)8WVxVLO1ZzoLomem8iqe=WeLK-wqfQ&f2V0hhTT@{|ymRxx#^c<~i|VIo zZq$Kg1WH`*+C*!DotJIC8XkrPCk!}^@$Qq&U@3mVFdVox6}0v-|D=D$OxGsWci1y~ zBP!K1N5RFrI4wi2^er@fE8t=&g7>aE`0$8SAiWDY(kOn!8l7(SH~QKj_&I|5EACSG zv4(jV;p;gd=v21)IXK7o+0JF2n077B_+(tv!57l;_Jzw?U%3F^x=i`SK1O@CEXM_? zAheqFGv>qWXO>=N)B}^Eo4tx-QaK4YAbDQq36kgS2t;dp6M#uT_A2x~FY9A8Fd2wu z^_Bp~09`=(vpyiHUY3jZteajqmGsf2q>nEA(-g@mT7vF^eM%N*2TrXx@jF_hjFcNS zg|+U7g$sycU-u*gaFc7^5pHxpizveU;mqkY#1QA47dEfT5UrTz_2&+8XPd!7{emez z1nZ0>Tq=ehP5VO%IKlU5jBjn;j$~Rh>sp;vr{&Mnrv8m}BzbFkCT3T+rv0IfnINy6 z)=4MI)ZN&{&7LY*E!dSLAWE3krQ#o;q`vQ z(8Dos4HViCxw6BIgG+U%e7M-89GZEh@0qwNU%XYTn_j>`s~cQ+1}+Li9L?wIAwGnQ z%@?Qb!c}!!4sRz2jeq1+F&_h$ikZ!I5@nJZgeP4gGb_?GzuyV%?9`z zMzG1p|9kp}H@fAe@aJjuf5*~MFN5F3e*Wn_KoE67{owy$+@0drk(p3&s&+I1t+RNB{UEWP6=E1fe80&Z?{|4^KS7mJs{(pYP)fN_|e<3-A4H z39(~K=V#k}q0^JmSy{&^z^*_Cupcl3$QDC?^QHnTfE*C#04D*b0A~QvvAm0bn1;Md zf#h2OBwq_K56GDTe@XK`2BeYQr+`y|oI*>0uL99oWD1=L{5S4r0Y3p^nvlzx}r2nXMdsf)?HDW2QJ0Ozi%l% zD8Vrt9*SuiGLClTXyP$uo~~WD?#3|C{2gXVYAn*<=XDW1yG>6|Tt9OYqUk)fSn0*Z zt^18ZfJS0A@%6yrIAJeEuI!c*;8L9@4=&Z+royGV8)b>zs2rzpuuJnWWQ*O1V-+c^a)IGR9fYZMlFipli8)w8Jy8(X-D%}8_=Aj~&+fWuwO=>=3 zO%`L8qsQ5+w>Lx4;#g-;1tiFa?$u2Mpr*Sa9od1~TLY)ZB$xA0RC+|QY+R@9R zGypSzi-8pR1wd+%3xP9%5E0QL>Car9g!2fE!cJEw?Rwo6r45HrKeaYbpeewGm@LeaDC_WS>Fu;-Klaa$u{&-GXZuaXpMH=Ylw{0Q3;A!ln5BY0^H2i!B_d zv65A4;V2CU&fvNyH5?vNBB1}uu8*I;b!8U;ezrajBRu_$DeYXiF5@i@Uw`INO<8q7 z|CJr{)B$uFJROk?hdPXv9si#Z&_Pvdy{~d08a*P0*(P*4on5E0w%%MO|l|ew&fvs7#$aV3@a^|q|k$<_yt4fKVy?xmT^Z3 z8Z^vP=)4hryfcMab@YOH5yoPU8g#VL{lgVg>v77rZ6=GHiK*<2!&t=4Mrj~V5Tkmz za`N-SMe&Fe-Ru-`abV@77^mHiD+ho$Z5^&^0r+>gRF`L$_!j4KoW}8@?%<%pgWVCe zFWrYoQQ%?tKiz|Os&fs3>t^2K@by=BrJz@cufKm=cWi?HL_ZCZd1Bfx;QS^P7j;mB z#7{wFIf##7fAxy+Hug==B2fvM!44R%@Up5>3E4%T(-R^v5A32G@SY?AM+caxV7@v6 zIZZ+&y$QfhK&~BVmV|ZE1(*zk?8$PF=1{mCq(AE<7FY$OIg}P)H{gZ3|4QIdxW62T zf7W|%1JW!CRScR%q3AQ7hk?C-*x1o}12+R{9))#Af7UQpH>#`ArMenjQCb3up=i_$ z70u={^F&mN8s;lpY>ja@u?T1ie2wnE8XU&KUssc^ zI;86U)Cx%Jgfl*fzjcAxD~P|**)K)-Ry{5we(M7BO87PV`TH+0ABTUs-|)aZGmnFT zkyJ<3(eCi@8`hb|kU{-B63P79b*Ajy?l*D>WZpTfaMkjKPVbNI%DPSfb_L=$+_KPw zfeKk@qQ}WhPpd%=_|s|-weDd+YIf*ave2Y;p{2Md9~YYB`9pY6^j zQVUJG)IyUkwcC|0G!95~MQKamQhXe16(3iKSXoBOLNf+iO$K}JNdK`NPC(?49 z#xYZO7?SS4#w-ltZ%m|Y&F(?{DRfG2T@Cc_2~4viPD(*%R+T#1?+G@Rn#LB3A^Oy8 znTxiSB}+&-HCC2}uUc8|h0iRU#=$)LuPbvP8T6+etNuW=o%d8A?O3G%&j6+ZrvY<; z(}7&0)1DQ}N`K~J3Qo1Iq)V+U=~5G%qH%&#w6s;5PFdWy9pL#gkcz1x4!zQsuGSEy9YMwod^ z{BrnTRjKYq5s$~IRH_7Vy((8jrDAg_l}fFY{x7Rk>rmDdziwfCaJAtnT$Z3kk3i| zX{?aylo$9ga2fDXU=wf)@OJ;OrI>q>@PB9-;r_gCc zouWV0Df&~LqCbbAVw_5yqD!e$bVX_0t)D8izPc-lTd@+NlPFe-&-T9kjb{Jt;-<#f zHZcA6eS6jAm|fN7!r}7Qsmeg(5u-phCpcb_m-t)v?b&?(U4dyb?%6nxOv6PT!Dlov z=@qawsFXGdhYDXZES8s|YiL-8@2}arzY5}lD6|`Z1A%Bu*}K09$o1vz zK#KjXKGROAJx%LFNgfcrE;4$ZJ7mL$kzp^x z1LW~9EQ}rRNr>^phHV)9YU4(ES88U{a|dT^Y6+X!68#v`#p_QXYzihmiyIM2Yz!|+#I$@GOi9h~{%^7mKVd*Js8&WV062{BE^un6amsko>E|BqNufzQXivzifh;2m7-7G|xvSx>pDTST>W-=~$7e&M?H(2nJvz(l66;l2?03tw9fiIcB)Sfbqa1ft+_^fF}XF z0=ck)$z<;Y;L*TL;4wg|`NslT=P;q{od!$*o(?=7NRb=}EC<5Wve&KOR|1d2eHAbs zSObLVWv@r~XDx)|p6$W#6zNi&N~GyhB28D6<_=N5owO?56{R&TNr=%rT_D+UTkzxn zZ-K1eB!ahzW&IXs0#4(g-0-*lb?Bz-tA7B~Xf4LAzOWRid^JMWpV zIXI8dC;@bJlA(pJD2b723wDt5}$8gAAQA! z)(yOg0R2RqadNE^R}QYF;zC^o%xCO0%&k>8qHs^%6rFDMAHZ4>U$rOL6?cLDq$uI~ z0XW`IxR@r>VCyb#SGe@wMpCp?bl}EeaoZCuiV7>8qYVDjfjtymwopXe+Yqi^2*DRN zm|sf|&_^SVhx_2`Hy&CBsaXhT94tG9lJj|?P8*(}yk`mL<5YtPU1|`aOYLAO8keAoR@}O``MasDKX~RgAM}*99&9=oT3-^q zE+TqeZpelYBEvQ`zvJmMPv5}Obcgw5xfeusSku>`O`Ag*u)hQ>mVg^U9=~N_%;5bi zJrSXece-R~nz;!NtY&T+i2Sg-L}(*$WlkdS-W^n8oNZ5M%W-EM3k-*joH99?Q$kS~ zd9OzI5}<#mE}`rXtSRe3e?yEo{N0Mvf68Q}k-#N7eJUh@`JM*k08<9+ z4s-+i0;_>(z%zkaKo5}9+yWq{wM9TKIL-o=0+#~ofQZz~7Mc!Zo$#I#cP36Hadat( zqf6~QC>r-36s<^JK84UlFaHrtcx5lH`OE0#U(vlJp-1z<=;a^5U6A-r>np8q?0{3l z1Jfw?1t`+a8*#U6^Fz2=cfexZ7r~RALYtSeb2*?jVr-AbBi)yoLKV1gKmr zuyVD+wMg#nGHHKQ2!k_TI! z2YV97G4j%jEzQI5r}7%9_e2P)JmT~BKSCeS84sV_`1>2N4TQ&A%G-?pl4D4qoU6I! zcA)=mAoI+)2LazsA*USHwNqQK4(P@zZV4ehO}+ADtdcnLN5a!@+Osw`L&A-vXqvivA$VYAcXMS_v!!qAPf30WSt}zPJ>~ z5f**HyAX)K%X%pf=m_2`fmZ=<1w!cMVeU0RcChP!PXn(9ZUWv4{1*^H?)?vNHShrN zPGBhVeFu=r5AQnyA>G~+fGdEkchXrQ%!Aq{pi6BN(4~}IMWd3dXpbeqORDG=IJCrP z@PuV}D<8XRt=%bdP?*MGtSBmO$xay3+J!CAQV5prOe^ub#4pFoI~dsrH>9N`AqHm; zoN+jNA;=goPk=iCXMFVXNYwQB|3ojxXsc2+zsDKB2{FVs#=4(2d+iZBKS4gH^3`R7 zjW1rrx;L3Dp*uH%1-f4k>V9#jVTWTN-bqZz2MKB&5}hE0!v{1_;Fk9TGxhnE&XAR> z6Hox{g2<-zA>&?b{C@Dp)@=wheC48$Hrkf)+oJ!%N2=oE3~4>s=C{#_n0g?wqp@vlZV?*gNHr%{x!XPs)u zmA5Cye-pj@DMnPNUaib`uIxNaA5aSu;=`&?L@5|j8sbDT2dca5gaj5kNfkOhAvpvY z9M0Mp!t5rak|yw_%`y25WYo!R}oK0pomc_jcpXeIC6#yB{|Q7@toAsckGrvGv#Okm-0; zy~u?A<&|DfXe`Vqu9-8&Z#u*B2^ILL<;Nwyq_=#MMPcuRIz10(guLX|EG`cG$~D|{ zjWb=G^atUL)Bb|%Kyh6qSH^NTTm$6p36u6QT;z@8o5I>Maj_oN;E&h4^eN;4xYWdf zSE@9x@V#KV-ZEVW;ZpJSM6Xe?426pwIF1i(b=qmB3lBSVTAk^_ZlzAU7%nya&_1e4 z_YTwbkm*`yx?Y6q1WD~ZxK@aZV}t+H^$C1AoS7&V z=jY!5f7m60k6LhD6U6^meWGGI=LGS$PF<5xlm6R&%rnEj20TB7DajFh>T25oXEBY# zGJip$qqK3cKVhZP9kX>8tpjVCM}_4rc4KNY9(0*+7jV_|I>OeW#*`gJv{|Rv=Rk@F z$=ubEmHE4%dJr?;Za)@W+i>5NDH&T##$?E3UeaT&DXmuT#=ix^c(BjLMgXVS9k@Su zG~tE8Q`b8(K&X!u*- zT;wQ}9MoTN?|~nsbFANUGNy^j)#l>tos5e*I7;v%HNGfZIj6FWHd6g}>5Ob31e(Hl z%fkBpJ~{Z-u)YSRbl0i)<;t|#ik!QQddSe!W9~`7j-Y1(`vS9o2|y>1Wt{>%1(*#i z24b5^UZ|k|>A24WvP`^ZJ6(uVEj8&w4ZceYt|Zox#8PyffIB?+h+jIW02aqqQB(6ch+~bMVA@XG($v ze(42yT&;h%hK)eJS!k3dJP7B!DpiOjzZ_`<@}jmBxj)MBGftjV3>25TXAe3V_o|Pe z<#f$shVamLzUj+(f$blsU5D!`as3_F%f+=-t_<-GTq?d#;Zh;?!^QTE)A(9pXL0cr zZRJZ9TJ`4PaH+84O<$wGu0|;1;H*nJW8y)r;7A~8l<8A~_*-8!92>;n=>4q-|9~Es z5x@0SLzd${KY#yM4IhF3seb*Pd1f9nfuU(|s3S;!Z&L|a9^;5H9Dm@)Y#b-pF2=z; zbDTI11n!sfC`7+z9Zv;z1)|T(Gx0NkY|j$lL?FgInVq5Sded<~3&`=I6j%>D3&@QR z@+||BuL)QVybL%8xEhGD#Ctaof-fHz%mZ%0eI4*c;F-YfK*skuknw#3WPH>np=!vp zaHQou5@jGCKMEipw@t{$j|!@QlneS#)cx63^rswLic`&&bg9{rt|+Z1xR~Qk8efp5 zOMT;}_!fbt_^^cNT+Bsf%xU_sAlhCzJP)B%*Y4tG>DtCLc|2aoR}R(k%>R``%G9+u zk;!25)(gIsn6Q5;2;~Vf9zO+=Tt*R}L=$ zkAII~nvA;$XXj*G)Df&l{EC+i{ii{0@~F?)n0Jn1d~#qscal2S6J~xW?NPuIo#sXB z)43c7RhFwd@3BC%mv=O91#m2IC2$<@0$>IZqlou3;DtbzkN!;m8k}l2q)W|)bg55P z6phlUXlnxl zB@%VR!>agk3cZ;`9KQbQt`zhN@%8toAgGFn$N5y9LzsdsKA7@At#A@t56?t^BqP`_Y@r+OCu zqUzbj%}HFc`YZm5z^@@y@s{}IGl(J@fkK^#^Y{NN!YzoEBWRqw-{26}Kjq4q?L)ZO zXzH&B8eWxYLeUz_xHDIlGI)O z{f+L9PV<}pitty&k?c1>FwdOz+xaVk&j9g1r%S4z4arD`yz*eaIlpq1zE3FFJ3+_o zr0zwV+>iTyxc>pjRzsf?EwV?5dczX!DzBOy0G+E8bS}{%j|P1y?#YKang1P-0VWj4 zX%X71e6WJ`hkURS0pvgu1$-HZM``kh1autvLqaU@-=JfsUjC4PIa%JYWI7xNm`)hV z!*pa#1Eeg_e;|9R;^QYQiVvI6zxd$_ zWnFdQE^d~pZG`&mAFilgmycLguM3BZy{R0ham>^m*51VFg1khm9pte3D_?x-1E20e z{Ue3C2iKc%`u7H=$+#&E;c2+2Bj|K#=N-%Two~F!h&Da4D^j5zY5kDGPSV_%ntkL1A2O>Ax`*JQo{JdT%f)-j(t|kF%7iW@OLRp^6(|};QQ@=wBdJ$Ri8;c3KO$=zkPfLby>12z^$XUn z%5=ytd>brZsrY~4JJh}1NUg{(u^@Vn{spj&tvdJnMzr{1#kcH1;*CJ%oQU&}(Wh2P z%zwv~%C+?)V9s%>Z|;Ok=}G^Ai|q|N&L{$91G$1r`Eqts{Tjb2)5E5iz8E9}bSx)) zNoPzv{CDfpg7{l?Ebhkmhd0In>R1opwEA0j>$q;d%g^6`x9(B+r~2tw%=3|;=K|aL zFxb-be}k4~j0OP@?nq#bd3d(_`>DO~Wh)s6^UV>X4+uZ$#4YII)UjRwa^89w*bj(j zR-$8}lge!K6_EP&*Fet3{{V8fL2nct>r3EL+>?(w7WrC${{&LUdK<`@=3hX{&wIcv zz>k410@2UBp8*-qmq5lt-JS73@6&bwLy`YoK2YpKTs2h>59}pc&cIX(7L-)_s z{aIscaVlMlE~RVH6(##~e-#?zp-bsnijTUM;=@i|r0mqi1@6@G37;DwHT;0;K7zRl z{Ovn+s@F|MtSm?Hd9WBhJjlW0_ui>ng*g3t1Jmq)vj}IDF_Gehzu@!WuhFs$@i%rR zJV?RNt5`y{duMmIZXYB9fwcWV?$-SPJQj#Hlij-i0LS7!1Rtb~10KMA2Jj&8G$6JG zWw(z0O#KO*YEGm}&53kH$!}#84Vu32S?9!pqQozEfY16uQtMk(qu#;4VID*OR1$QA z`&}@#Nl@#vGtRL5UD5a*3|~RNNFoaiWR z>BQsBsm9a@|{**i<AK2dTbp1f5d4Gul$*UdP?|JP=9R7I1U?Cz2}GBd7eBuR{ss5sJ5T3h-EYMGZNN=HuH(?F zWjpj)AZOg?fZRKK0Z2{nW#AXUH-X;)-vP!T&+h{H>^0{vO0V~#1==wvhu>c(jx4FFoIR|re75$@ z-aW}>wbgaQD$56KuGS77bICVRjKiQv5rk+^W*aPKs0JU(uzLB}PiV|(7+*M( ziHARD$j|%kT^yKJ z7vbTkYP4Wy({-C3b7!O#=F?srX~RM|?lJs^?NczVli6Ad>H%RPUw~}He5C1GqsM$C zVpg*Hl1^!p)i(nup9N69@u67D&OQW7$JyYYtf}VIlalfGJTiW)7j3 z$`PX(IqVAx-(q0QN}`77JZ*W-^r2Yu!(4=gaHe5x)SUPuCS?EoaI6XoSq`#MV_i)b zevKkWS2I87wwo69uC|^#ui*6UfoXLYo>i8#@Wzlzg8wX#BTmw?mV%m5Tdjtbe6S@j zX08U*xN7v%qs*B3&Loec%u;Ltg|*6yC7LtzA?PYWI+Jl0b5Fw^4u zmppm|lmcoOVn%0>W5=p;bVvV~sd|Nl3`878t@JcqU+XdVM9jYZqL+kX{5+=p>z*L3 z+#5b&A%#fLh`E>Pic*seUPJVcxsQZmp2@OdP-m#c{&_x5c;2mK;^(PP`=`}ccp|>x*l`9nO0-FY4wwMPDDH$NiJ)e zcxzx<{e{PAX^VblTC4P!`ynmWEcf}O<*KfzE~_)z+P|a;67wer*blBXr#+4#6It<* zvEzlO3b7jUoM5K@q@GrSnflwHT#5J?vl=DvF0pXSEN-nxDb&4GTdgB!w$3t$i~vKSP9vnzd2V!KUkBJ?6n?eqL%fElh++ z%a|FbKI()Mk@`p!^~A6c?7^8S3^iSE>M;+Mw5+8#NkSPqQsJaYQv+j$+Ju<#PaLyW zPcmcvQjhs0vlJasRO(2K*>~(6A@LZq)zI5J>mXM)$5LvB`s?!kCjkd z>2m(NFk<{)17jX1JpBI0=sRQ0m@m;|9xE|}QCka&2k|jx)pwpYvSISP9zgjhfU?(z zqU%wGOaT)!q%NIKpQ9s^a~Z$m7HdhawEXGL!aNs$Tu@b8HeYj18#R2aYfgPdh33NB z6s|c{rE?oJm!sI}a!zqfca_!FE#^No@Lh|iqTcGG!btGBwByt`o0gnhj{JPMJub1^ zt4*BfN=tSPPfball9HR6F{x}~LP|=q$|;{TsNZc!Ol4It z*Qm#(vRdY@D4Xx9Q+91!lBDtcyX{|FmbfZw8a$dSkVWmGB;doMgrt*4j7ij73nH9Y1xh` zlk<|>zG9j<3ZF4e9HnS*zp_G0wvwdJDUakNl{NnlcT9;7cvh(Q zvEif8$E^92{;ay4j3UzEjE-uJrA?T~*Oq(`(PFNA$UgNoA`w|IQt)L{X;`Juk^|qy zuz2{yK62E^_8AWuKQ=7PU0uDl633!xWh||znD448Z7@buQ@qreW3s66Hn4(SDMiz? zsFOwxPmH%5Ba%j)oRl~=F>$no2?c|Y3Nh-jssO*r>HTTAU7w>oiUrXwG zvUSgpQx3_i6MQBgY>~wH%*XUC!K8erA78Q-lWLuT$#)s%y095|33oQ{;YWPd)c4KKIB$NiUwZ18a< z`ga?AO!qAteAG$4wZX^ux-7!Qas(@HfB2thlP|{xUp(Tgv&naf4ZgmJ?;)FfuiD^a z{`T7B>uM}o5r#*w`eXZ!w8@ukgOBYt$0lEs4ZePe?`E5P8*T7$S7y6SzJoUSSbsgw z!o_m5SI-Zh{v_g#m2@nr-~9^7gTwqD>HY|UPLoVSczYG*LmdVx=FU(tDl z5tm^3CeI1O?ue@KOfZv1flk-&W2*Jv`0}=MU5U-eBq4=nh1uHN2 zF*jYKc#LbX@{;cbn|!a@SI-@7^2ONX zJK82+ADeu~+vFQ!lP}RG-#D9mDK_~sZSv*Wsp@-4Q>=e5bV z!Y1EEHu6559h-a~+2q@4lW(_8 zzVB`F9k9vQ;W~TccxRh@-E8vpw8_`kCf`7td?(rD8*P*C6q|hMHut7N8G{m zQ?3J!y+QF9*I;@R_2<69_=4nb5csC(yzS*L4*9DD&p9`$RNKp6D7+ukc@C97@~yGS z_ed~4zjE-c&A)*AW`mFEZneQjIepItALVa%Fh0NWkNe|4gKy~LaNxi& z7j*oizFP#I$|r7?Ua?aznzhw$nW zi?j#lQ*aE|LO3GuGs*PYg*7F$b@=sqL)Fj`!-fwVIk!Z8CMhq*dhju1?QEDv4?ika zi{}fy?5YDct7}eWS$%Co?Ho`1!2Ch+d3B!3>dLb!Yv#tM;j_xhs)~B8Y+-pjsc22AJU9JtysI^^+_@PY*Q2ChfZo3j!Op4#qmRHYO8AJ)>?uUOfSey$#EC~(j}lP+mVv% zO36)k<-h^%Y?mW9JxiQ;o3YSU;7BXVcerx%TA_SZ2NSUHu70hyGI`Y|amSoeXqgk@jQ16qnauM?MDx8(^Lo>?T zkstHJ;`pIu5TkyFBiJd0**O_$C0V&?*+uD&euo>)Zw>FPD)r2%t*%Q1PewE8*YiEFfD%QG_9e&OdD2$;e{u@H^LB8rtyR9U#eXBYMbL0$Fb`%2lUpC zh`kLXS*Vtlm+yl8fr6~OTvtxYWZsR$SEZ4$ouP`ROH4Jnq_Z zA$^KO@CvOFaSw1cBcd|%O=tPWplmkE5E*+Te9Apl4I}W5x~IOhrlGnLuU4aCD)4n^ zWb8wT3mq~wI}77L?j%^3iHyAlLGWFAZGE|`?##xD#tP=88$7OJD*Q@-A2b-m>p^r^ zyOh-r5*h8}p7;cipEoQhWi#Ldx5(H>kQ6>T;B9x@UIay1Sk&hWBu9fBh4LaplN`Be zsS<3X${}8*$Hy%}GKU{*M8-}*dMFe=PeA=itSQ-(^717wtS+X@8Z`34c4Dm}(W4Oj zVzZKFS9+>T>quvTPeHVcSd20l!X=Sy%yOXm@iDBbku(Q}Lw>QL9Sh1>d=BHAlkB{_ zDMd~xoLMc!DcMrhnMi=|Cu2BB%VPsD5jN;bR&`s0>aEY#xx&mVro;-EsALe^>i zek&n1d(rxgroYh+&b;ibwCS$2l(bBTRR46;b7@1(2p6Vc{DXjzF#DGy_CSe*=P~d+ z-#1fy@7;xjm^hnlc8zOpMNQdk#>J+jMONd33H;nWGB!P+m1K%?nm+HJ7N@QkM zZb4y6Zkj_{Ak8QM&AS*SHATl+l*)RiT>R8S7pKyyxwZA=WbesGwxoVh;YAJ+l~&(E zm_}+@x1-Q_B0YL_73Mn}Qk3^GB4p;Ir16J*B9-@{Y^hn3a*J}L_)8IKVRiwB0tjA# z2vuLUZ4vr@epcah7xI~vE`>Y>K_yRxSvjgL+9;z(6cobJ$s}Pk%g$O7%F75^?l#5( zHgNHY{^FLFpDi^_tkM&nnGAH7)UNCdr|{=sgoUPh4`^%WbCCVT6(6)pcw}S z0Y`pHcGl^Rbcu@zOhs6cTmG%gkXkcDQEnE8>XdA~8adEBikKmq)wMMqd@ZzyVc2z9 zm+6^C-YLW5QC!UViLTV5j0{JbnqRaE1nuZD(&9DdQcm{o4+7iH&RbZ{2ti#&F-RKEl@bL4C(;F;QSGZE;B~IFnfy{CRt4sVayXQeAk371XQDn%cvA+gHZV-(j}m&IYlNCva-K( z<-}a_lw+e5q4fRUv~NzAJ7lQr5ZB?DHx+Wv}?>^ zdi_w;`Ja|-XByg21h~H;z#LmO%b8%gnpD&P*B8~H$AHW z^LQT0EK_q5x~H1^sqvIH%D};yW`b|N(5|FXNI3iYHVx+ucXer*k^BDO{1lBS9S!1A zSzF`sRF=)h=Wh6e5Bj@nPK}glj?r)R5sN*PT~X#{T{%O_B#%as>O5|KD_K38ib}0y zXdq-<@{jM|>Sd(t1m5G&-ggVinBp!TvOv zJyRbCpyo(34MG^vBGU4pH{_?F`3msQCnaGNE*Tz6jH-ivVoaaRYb#n!|BBBs&6S=~ zm_oaKv2p&RzAN8RoHqqyDw~>;p$2Yhe*DObLjqe&rdAFz9JQ$;%*IEeFhGZvqR{_H zxivoTB^&F7Euyy*c0nRz9mr}s;(=&bb8J~jUj{Wv>m9^gQM15Rjqe^k5^Z0!?LvIq zR;*IRo={^tDXXti`XfBp=!jNkZatC>Xn?5&&a4z?mdiQGQOJs?T{dZV zb~%}uF&tx~h8dyKx64o5@wFpXBD$!vKX8?mUr|?83X9okwe^|h^|_7J74?;6=`iM3 zQ_&#eX7=a2v_gm3quCk(Dzs#r6~d~{Q8ShqJS%0CJ{oYqxgJSpr*Q`2tnfF#(xs%Q zi`6-)&j@%r(~72YbYipJjC=eJPNpPEl9@tk4o5KRaLnC7eZjKV!NG~1h(1q|BDfyV;(j>H5hk6CFQZmpzxH`taOc5xX^7$ako-q#ozlsn8+IkFb$z;gKvVzOl;VT+MDcWr|Qt8wWgYjJPL zenwHQOwQ6BIUi8e(o|Sxn)5W%wP*}Z1gEgb_{?^orjpKGG)aw9--1#X*Z90bmRFslj$s7mg%-DR!#+ zaD-iMsZD1FmRV+JV@rCFI0t(CqZQeq1X3Ajt7Mr(C~xc^tY|}tqVzL|P}d~4Of}mn zotBwsWV~v=V>7XHig>7&<0#G%!BaX{4GIj>kNH;Z#E~+n6mV=m4h6EzO{1k1e^$Le z5w)fFF3K;bIT^pr*{wi23MZqo`o(pgS||f9{`roz%#8kQj%HGF=8Jutx~1N}^-P{0 z#zR`EO|Kh;dqc7%F$_L8k@jjCUhOb1m+2$$k~}(}sEvRIU124|WYW zB*8fc8|=&o2NY&ipNaII&H;;)nyim?ouDu)Z3>2QRDcK@+XXsUp|lx0Mk9umnz_>Q zNyvw;-e9Pa?z0aZ+wi_o2rwpO|3^`^>-TT%^2OLy&6_{1aB3QVXcH6CGUojs-rh3k ztG+eM%ZJ=l{R}Ey=-saUVo!1Ft4R@0+;P=aj+;#Py@TDR8^aZaFpd%J=bW%239$X1Hrr z)_eO#R2|vpt?6HEzW|?V3w__2XJd13r_duGjviTP`0kCB=-Q|RA%Mt$;P*drY;c9-40_M$Zr z_*_}&)7I9{J0Wss_&+|pac9)0W#`}*ctT$}Vd9vfTPFTEc3+3k8*llx7{7!;n3#}% zKAduDbXD`bZ3lXF*}L%Ta+FKx`!750j5lYUeAlXb8Xr6<;5QRKb*H}%?szf@$7S+hf zT(lpLUxnWDqrNX)_vqREpBpymoT*xW2l|E3FA5*h>-LR%-gh{9Bourx>0B>9yzFf6sJ08;ty{YBW$14Bvx8qJK-g3qLtDI}_6JVjQc_XHG)jg%BtZ!OUd{5z* zMfg=K>NF-~=A8>B{O99OkJx(5zq?F$Y~f>AXA6Dp9UGb#-BqbC_ash6|8fg`{l2}g*QRGJtnL!>$;9tFlxf=iLcgqk^_jgY-`VjMSc3$=34m=*cLFl(`ONwy3w(pT8{X+LW_u3j4K3@|0yo#KI1~Ls z=qC@H`Oa%M?@c-C>Qz^V{Ime|yjJK1&XA!CmS5N5y+KYUtfRJi_@l*em(f6?sz>&=$+2_a!l{7A3rhd?kNvXsPdx! z9uWG~M_v1`Q*StO?O&gsx#Rg>lfFc{m||i=rvGPULC$M^jtbv6Eq7tl*Kguil|ui2 z?7atkR8{^qenTMO3w_TGE1YgtiO zU3C?EUtPtz*z2lmTXn7L`#j%s?%cU|COXUVzQ6bX{`Y=9Gw1o9^F7Z!<$LOFNBsQA zLB^7Po4k1c#qm(*2#_uc#}A6U75(6u+GzxW#U+adntdwYL4>!{(oE(&jU+xw-f z?!k-R#edI>ybt{A`$wMGKlt$S{@6qR-d0+(?~6m>UoHNBIQp;`8di*2^zfOde&;^<3)tJ);{R~u`4@M& z_uPTiSHIKK&~W~0oLBt!@DJLq=jpc|y}0g)p?@#C@g%&ES^Pg-J^am)JHN8xiCRy1 z#>4?v;q?LN;|7;pa_tQ-JsSPynVYZuq0iu3N9~DrC;op)-2Kq>9Zz_(&VTLlM_*Wb z4qiqq{!cCcV&!#buH5?cD_=eL-C-yCaZ3dHrokmQyj3~tx3eZsA3Wi)WSQ^!een84 z@o#zHH){tkI^_H#H!H0jee1cW;=6z1|M#mO{q)qXk|$0q^{+nk{b@eKcvSq8yY&6% zRd2j>R?v~iT@vNxa`$;cRa1Te%j@`-1Xett?8N6P>4xpa_Bbf zF(0!vxhH~CHuIi{rP*68mZ^IpI?a0`mNm@Bx?HZ=b~Y|CueQ!#-rS0}{d5$2_64mQ z@!U%rR%}Ezkjd9B6)|QQCyVxeFZ^5oyvH9Tc?FQzdP(8GFE^fzV>d70CvTGSG0&he< zw24KH%^R1na~TVRaEzFlrv z@2vJgpmXKY#YhCZu%h^prt)HSn~JWp_9YFSQ;Vg=?h#Zs;#ky5>+dD^W*uPbpk)Kk zYW98&yyE;Ha-d)5Cn7d1`({E~a4TfjMjf>9rcUg(^C$3z)6~$&{-zhpw3id_(AvOMnr5-Ep|y)PUex)prH+mKVzt}2 z(+Knb4^s&1-{7`y=CYxq3lo_QwSJSOv;IHr4VKmGWE550xNu%caHsYC4ILr{h)mUO`0_4mkt;jrb85Ju zg=6x_&{$Mu;2yzZvj|nr_cx^PGSekDef54m^?X88UGaU8UgI>hwQ@tEs2r1iL-SF{ zQkHkNH`ljs>_sl-&>Naav#^)SE66vn#tP=NxfNT9|EX;@t!QZfg;f?(kB{H!dgYq8 zoP$hJHOtG%Me8o+N`FIaxlqaI-hwq&R7&NJ*J72`eZCtpwYa^nvu$H;q+-lN3*5jI zn&!G(wgfp8kE<>BjBDy__e^M5kl-yrot|BZYwDLZHC8t*qBz4du6CklLPvcKJ}uF( zxTdSVql=zR&FvEM8xg=kwaJWN82CtX-xIu(XOw#IIPEF?bkv|#5&X}y9OQgVV^;(7vq{ZE&<}*db$5IN})Jtbvzq5V=%653_9g5C=Ob6 z6aL2!2Jei&P(EfH)CS#tEU@wOI9vxQ#F)$eKZR#(i%c9ou50vo-nPR67&K@#zu}sn zpc#e-d0Nd66y*la7(5oS5f4`ap`l#k&z$_Cwz>n<#Yv*_eT{eKD1 zFucl+X7Ki`u1#n3orrr;Jo#CiVPp_KbcS&NoU;7z6Mkkf{f{3dcsMub=u=9eZ$Hzk ztiOqrJ75#L>~h=Xft%Xp%?1q~lIyei&|Jym8McL8-g3BI9!a{Csqo5dhj%P!x!t)Gae`x!%}b&{06VQ>x53 z9%x%ZrvPmui2cYYK^Fk=!_;NQWk5p(;i9TBNYITyZb7#K@sm_##vg%71>Fb4rdDP= zjQ<}5J&Au@{DvQU@qY+<3ICr7dJX>{3wj6t9|-yz{wbA-&KrWh#{XXhk(Kewj1rvl zc|lCaGlDh+;u*^%<&O&53Vsg?VqVt@+8gLkf`ULCZ^{hz!gmPbr?+ntR1dU9(D6VV zk;;tIfLIP?#@RsE3%U@9rBr5I4s?Z}Yk@8ibQ2KEwamB;=o~?J0i7XeEf8y>OzuoO zK@eYOb&R0rfQ}OMGSK0IUI#iv(7Qm(1$_k6Dd=;cHbLJ2EfMr1&>}&7Fp4$^8UR!$ zXfvSw1Pue4BWNU0jUW$DTF?$aaY6jxXqBLHpn#xhKr;pH4Ya4AAkb7nF`x=T{Cwi> zf@TBlDv0;k?I>sg&~}12XYdGG4YakO6M#kvIt^&JpsRpzO99I7dY~bK)&SwQ7WmRi9p{9 znhf-nplLvEL4*6^-a0|UfH)5;Ge!Wd5;Pj9M-X2?v6G;2K;s1M1azpN-GEjInh4Y- zXfjZ{plLuYg7~?}#e%#*je>$e2MCG)%@>panky&+R4b?!C?aSsP*Bi(Ag`bUfc6s9 z2sBO5VxY-_T7V`B;!WVY3F-n;<+lRpT=6>;=uAO9K&t#!0jc^p7U)_DJrU?iL8k&; zD(Fn0jG%LY5`r!SQsoR_u)iCJpLy^zKs*@6<2Ky0!h`duoXG$kKQ##q1(#g)0PIjhrvNNR>&XiU-Q(ECnX@xVT70#4aI8%x*mD!81 z!kN+vXG$xaDJ^%VwA`7}a%W1*ohdDMrnKCd(sE}?%bh7Lcc!%5nbJwllumM{bdocr zlbk7?}qh)TZtaQke9dd<3F2`dm?jh`rZswB^Mjwm~UqbTeev3T{ z`=i0=OfCa9Kg&ALFnSnjgXUC#x0%_4;&ml zdVZt*Ij14t$#DMx_YCdN-ufHJ=V|$TxZgp(M9Y`L{Soq2TD}_Y&ycUzGJEzuNXHs2 z-vYNEHc&%(uAq~`@KzX%sI z@t(hGc|F{bkl)hs+i~RJR9ZAnExE?hcTVXOX{$yEA0u zQDn|wc7u#OiChMEcgURYGe4aFl*2`uMcy3lpCEI!z;Mo}*23im1?4etF$eD9hkYrJ zgUfoE0rw`ze(fKCdp+ccmZNajKu&2n4VUrugMf~%% z{{?XOgnX%%FM~T1^3__t1}@UjbAy&|gj)sq7A@ZjHxBtuE&mZN($sUWmhXdG1Nk8> zKMZ#+mS@359rx_3<^AA32>Adl*Ta1T@Cu@WwUHV~O145#*9}<4xkneu~H?Pe^eE>K2*EC9CkUsA;#XYl&R4p4nFX zo`MdMOIFMt@p}n=L@rs0aAo9{)d`VHW}qX)kNpLa%P7M?S4(cgrIAba3b;mc%l-k8 zOZFbvTe#Vu$hyg8Oa~euer*3lE?IGN1?4tU_$P81`{CaZKelrsm(ha%A0fDnc8y%L zP+6QN$Hv@elez$4lGVTXr59&79eu-Shb3pHk zAKNOC%V2AKQ~W;A$YrqQtrx#~xvEui>MlRzY zK&!;>pBlLgu5x?CkE>iFm$3!Vq2jldMlNFqpcUe`i$*SEDo~gB?WvK=hyb;VUqU07 zF%PIk{Px$#WgG~!So~Twav6sJHHzQi8o7)UfesMAQ#EoK7Xi%|zsodo88-p34ZDq7 zG;$gD0o97%gBrPvXMr-}w@xFM@fJ`*{NB^ZWqb(~5x;LVav6MJJScwsHF6olfV|>2 zLL-;4J}}DZD7ogNw(D>suE!sk~(g z3Mdp};0txkgxFJ{2y(;C_^KS#C%!$6ZLQX+^Fy3*ip^-YKzq#GbXbMX zN~_R?UP!~vQLwbsxotuASh>7r38_fAA@(@BY;tTan@n4fJ(f~8a~II|qRwRxv!}xz zW^(2mzsZ;%V)EsOm~0DMx;qzp_|$x^8RHEi&7F&z8nZPi1X*7*vZ7U1s@j`}cN5xU zX)DeRH{+`!$kLjrb$Hvg3((o)6;SXQZA*67eGmJIf}NA6aOY(2KWw$E&MQ5VHk`aJ zDW~hPMOAs~EvnfuN%<-(=%rukUBgjoIo*MyU(!j>S8y;C=y)6jUqGWEM{fHH+FFC| z({mL}u0p{?YTj6geRu5%( zO%rBrg0=_Zx~WXAl1&kWiBaCw0nX5PFpP)u>Od>}_HtYuFyrt_oa5?1$G>}dAb;-< zAD0I&=ho)I^Kti&^E=L)d0;1`hweJKBjCOPm)H5Q#_AaZ7ds+7+i7_m+*cs)tmR$c zVpZ0|^izKz+zOPCT16A7RWuP+d^*%E*L9Vjvn!$US2Cb$I+VW#;i;L2pt`Tz6Q`bi`3=h=?In@S_h4(2RNw!~? zY$Kk&uj_64{y%s_le%jOcO`kz0~BcY$oBu-Q8LDM^eLs-x1Z@**55?R9k7XAcDe2H zz)kHk??uY>*?efOG-k}OE$s4^!|n2jt?cs1QFeLs*8i8>d&C=zJl4_AaTC|Se-D?% zMP$FD%j5aqe@_?h+X(gHnBxQT3*r@+nS$DZxF=O6cb)7hh`Th?1sw@gDd<=r?(>!z zCj*Ta#9gGF1@X!YcZthnS87{9yxOw0pc{a=$6RLc3d?jV-Qo2Z@@v=aYM2|67A zj|p0he_lH%Gfu$&T0y7b{~kf-;QvlR7vZ1#m1PEZGP#FYW?YB=8wC9x|JMq_Ubb9{#OWM zX?F=KMGdqIV*POUw#*m=v{(>pv{BF~paTTa2IdRme&}35w3=E$6+rt4ssiF(ahZ_> ziVLa%iU^tuv(6_X%8W+*PY}dAi$0PV-1C25P&*K>SdR>z$NHR{tG%6|9u2q zi2r}dc`pUxm6|ex*A2cAbS==Af^Go%R1mKk{6)}hK&(4;Z`0#~?t$OKg4P1Dw$;5& ze-iW<{QfBDDInShS_)7|(7D)Kyh_l8K$i)+6o~eQQ~}KsbS=;9ISltJ$Z;+6dKBXw0=K)5(bJ>-kARD@vFB(l9|QLg$R}#~ zB)Eq`K3&Va1Lp|H=W6*pxEMWqF4i)yY##&pN-bXn7gyVRey3&LfpZdMuHu<)-hqSh zwdZy%^A4OdAm5{9-hqRw@jVY{`9ZknL4HijyaNX#aL=E$%sX)KHqV}QTIL-%mqUJ4 z%e({UD#&kY`7O8@qkG=h@&|Bn?{Uv3TK+rSn;?IwW!`}^0qOo$%elub~=C}#m zp;{gWcOYc0h8WIy=ODP-XxRgIbI4pvF`Tp3$#8eo@@{Z(eY}S&F@|#$W{<}Q+sVhYOjsRWt@#rt|;6F*Lg%P zgDsk+?>4T}$R#^*dx6m{J4!?@gDsV-O1JT-MlOS`l(Txb@tj63;|(Cr@7?mG2$4(f z@?Z|#a_0w;OP&##AbxC9L@r}K7&ACXJuzpQn)%!!F`wH%>bIkL@t9?%@u}QR_F81m&TX!25X@olqfYylK zO&Yn_tI0aW&HhY~OP=$%PV~4IB61n80bM12Z)xOW4#6av5HrdEyt;$Yo@JW{F>|Mrdz9s&C@68mez9uc!`0{6;34iq?9JS*iG( zl*bTHTpPt3_-EtB3_3moinHtd$`L6Z5-A=MDWJjvb&%%N1S!#>6sQ&nj)Y0PIW-b* zPL0H)BViF058uP&i6V6Y<;aP|b55k1o^*HyIMfVBQ&fQ?@d7mxAy7k36-I|rK*H!i z3MXdOL=1eBg?UG&@v%=h$gW>GC;}vcML6sQZz86<%Ll`%L7 zt5yX!j3i{c2OTQz{fc7y(0Z}v|=B(8LaQ6?*bpb($?LCuDJ}D^T`A7 zGY_7Z^ZiZW)@n~b#%DtGC_Vk*2K9Iyg3F}E;BF2#40j8-=x=&P!;Qja`WepgJqBJi zz7whOoyaAlwesV9Tlp=-jUFw=^7@Weyy>dQdif35RK4sci1jj85X=7Gt(Suk$N2=* zSorZMre1z!Go`mGDXLDAC{v~*1($V_)@7W5%Q~3_mvyoaT-Hf7T-FIj0I3s(vragA zsyZQ3bwZ@(Qp%5Zul!~iVLZ#pHnKez7)O2EIp~-N00!OOgMYj{U^N}pPX536|37>M zD0@N5x|D`%LE1NaA#DtvIN!wO9=K`l6|v2;afc2wp>;uQOVewNbx~}@RwGA^-kP?- zc}W?J)iB-^MB9E{(2hW_3K|deqM!<(=LAg$`m>;!Ku-wby8jVDT=733Xdj?^1JaaH#xK`WpXe49fG*Fzg5sMplbw;0J=iZXrN03d4MhuG!Ez-K|2ARA!s+CQv^)} zIzbTEEyoDry5%TAdjTCT$P09cAkK(5&n}azC!K;4@M{y40a_xc7N}8Bp?>)(gz{h* z59fHf8Zn*yvKi+U=ocI>8=E>C@Q^CU%U|i2fB8{V`zGXn9~88g$A =-_Z(8kjWE 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%0D08DlAYG6uVj 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∨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Ð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 literal 0 HcmV?d00001 diff --git a/hdssd/external/win/sqlite/sqlite.lib b/hdssd/external/win/sqlite/sqlite.lib new file mode 100644 index 0000000000000000000000000000000000000000..29ce32c3428961fd02d4aac9b90768803940a988 GIT binary patch literal 2699114 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

      gsyo* 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

    3. SQLITE_MUTEX_FAST +**
    4. SQLITE_MUTEX_RECURSIVE +**
    5. SQLITE_MUTEX_STATIC_MASTER +**
    6. SQLITE_MUTEX_STATIC_MEM +**
    7. SQLITE_MUTEX_STATIC_OPEN +**
    8. SQLITE_MUTEX_STATIC_PRNG +**
    9. SQLITE_MUTEX_STATIC_LRU +**
    10. SQLITE_MUTEX_STATIC_PMEM +**
    11. SQLITE_MUTEX_STATIC_APP1 +**
    12. SQLITE_MUTEX_STATIC_APP2 +**
    13. SQLITE_MUTEX_STATIC_APP3 +**
    14. SQLITE_MUTEX_STATIC_VFS1 +**
    15. SQLITE_MUTEX_STATIC_VFS2 +**
    16. SQLITE_MUTEX_STATIC_VFS3 +** +** +** 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. +** The mutex implementation does not need to make a distinction +** between SQLITE_MUTEX_RECURSIVE and SQLITE_MUTEX_FAST if it does +** not want to. But 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. +** +** The other allowed parameters to sqlite3_mutex_alloc() 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. +** +** 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. But for the static +** mutex types, the same mutex is returned on every call that has +** the same type number. +*/ +static sqlite3_mutex *winMutexAlloc(int iType){ + sqlite3_mutex *p; + + switch( iType ){ + case SQLITE_MUTEX_FAST: + case SQLITE_MUTEX_RECURSIVE: { + p = sqlite3MallocZero( sizeof(*p) ); + if( p ){ + p->id = iType; +#ifdef SQLITE_DEBUG +#ifdef SQLITE_WIN32_MUTEX_TRACE_DYNAMIC + p->trace = 1; +#endif +#endif +#if SQLITE_OS_WINRT + InitializeCriticalSectionEx(&p->mutex, 0, 0); +#else + InitializeCriticalSection(&p->mutex); +#endif + } + break; + } + default: { +#ifdef SQLITE_ENABLE_API_ARMOR + if( iType-2<0 || iType-2>=ArraySize(winMutex_staticMutexes) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + p = &winMutex_staticMutexes[iType-2]; + p->id = iType; +#ifdef SQLITE_DEBUG +#ifdef SQLITE_WIN32_MUTEX_TRACE_STATIC + p->trace = 1; +#endif +#endif + break; + } + } + return p; +} + + +/* +** This routine deallocates a previously +** allocated mutex. SQLite is careful to deallocate every +** mutex that it allocates. +*/ +static void winMutexFree(sqlite3_mutex *p){ + assert( p ); + assert( p->nRef==0 && p->owner==0 ); + if( p->id==SQLITE_MUTEX_FAST || p->id==SQLITE_MUTEX_RECURSIVE ){ + DeleteCriticalSection(&p->mutex); + sqlite3_free(p); + }else{ +#ifdef SQLITE_ENABLE_API_ARMOR + (void)SQLITE_MISUSE_BKPT; +#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 winMutexEnter(sqlite3_mutex *p){ +#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) + DWORD tid = GetCurrentThreadId(); +#endif +#ifdef SQLITE_DEBUG + assert( p ); + assert( p->id==SQLITE_MUTEX_RECURSIVE || winMutexNotheld2(p, tid) ); +#else + assert( p ); +#endif + assert( winMutex_isInit==1 ); + EnterCriticalSection(&p->mutex); +#ifdef SQLITE_DEBUG + assert( p->nRef>0 || p->owner==0 ); + p->owner = tid; + p->nRef++; + if( p->trace ){ + OSTRACE(("ENTER-MUTEX tid=%lu, mutex=%p (%d), nRef=%d\n", + tid, p, p->trace, p->nRef)); + } +#endif +} + +static int winMutexTry(sqlite3_mutex *p){ +#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) + DWORD tid = GetCurrentThreadId(); +#endif + int rc = SQLITE_BUSY; + assert( p ); + assert( p->id==SQLITE_MUTEX_RECURSIVE || winMutexNotheld2(p, tid) ); + /* + ** The sqlite3_mutex_try() routine is very rarely used, and when it + ** is used it is merely an optimization. So it is OK for it to always + ** fail. + ** + ** The TryEnterCriticalSection() interface is only available on WinNT. + ** And some windows compilers complain if you try to use it without + ** first doing some #defines that prevent SQLite from building on Win98. + ** For that reason, we will omit this optimization for now. See + ** ticket #2685. + */ +#if defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x0400 + assert( winMutex_isInit==1 ); + assert( winMutex_isNt>=-1 && winMutex_isNt<=1 ); + if( winMutex_isNt<0 ){ + winMutex_isNt = sqlite3_win32_is_nt(); + } + assert( winMutex_isNt==0 || winMutex_isNt==1 ); + if( winMutex_isNt && TryEnterCriticalSection(&p->mutex) ){ +#ifdef SQLITE_DEBUG + p->owner = tid; + p->nRef++; +#endif + rc = SQLITE_OK; + } +#else + UNUSED_PARAMETER(p); +#endif +#ifdef SQLITE_DEBUG + if( p->trace ){ + OSTRACE(("TRY-MUTEX tid=%lu, mutex=%p (%d), owner=%lu, nRef=%d, rc=%s\n", + tid, p, p->trace, p->owner, p->nRef, sqlite3ErrName(rc))); + } +#endif + 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 winMutexLeave(sqlite3_mutex *p){ +#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) + DWORD tid = GetCurrentThreadId(); +#endif + assert( p ); +#ifdef SQLITE_DEBUG + assert( p->nRef>0 ); + assert( p->owner==tid ); + p->nRef--; + if( p->nRef==0 ) p->owner = 0; + assert( p->nRef==0 || p->id==SQLITE_MUTEX_RECURSIVE ); +#endif + assert( winMutex_isInit==1 ); + LeaveCriticalSection(&p->mutex); +#ifdef SQLITE_DEBUG + if( p->trace ){ + OSTRACE(("LEAVE-MUTEX tid=%lu, mutex=%p (%d), nRef=%d\n", + tid, p, p->trace, p->nRef)); + } +#endif +} + +SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3DefaultMutex(void){ + static const sqlite3_mutex_methods sMutex = { + winMutexInit, + winMutexEnd, + winMutexAlloc, + winMutexFree, + winMutexEnter, + winMutexTry, + winMutexLeave, +#ifdef SQLITE_DEBUG + winMutexHeld, + winMutexNotheld +#else + 0, + 0 +#endif + }; + return &sMutex; +} + +#endif /* SQLITE_MUTEX_W32 */ + +/************** End of mutex_w32.c *******************************************/ +/************** Begin file malloc.c ******************************************/ +/* +** 2001 September 15 +** +** 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. +** +************************************************************************* +** +** Memory allocation functions used throughout sqlite. +*/ +/* #include "sqliteInt.h" */ +/* #include */ + +/* +** Attempt to release up to n bytes of non-essential memory currently +** held by SQLite. An example of non-essential memory is memory used to +** cache database pages that are not currently in use. +*/ +SQLITE_API int sqlite3_release_memory(int n){ +#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT + return sqlite3PcacheReleaseMemory(n); +#else + /* IMPLEMENTATION-OF: R-34391-24921 The sqlite3_release_memory() routine + ** is a no-op returning zero if SQLite is not compiled with + ** SQLITE_ENABLE_MEMORY_MANAGEMENT. */ + UNUSED_PARAMETER(n); + return 0; +#endif +} + +/* +** An instance of the following object records the location of +** each unused scratch buffer. +*/ +typedef struct ScratchFreeslot { + struct ScratchFreeslot *pNext; /* Next unused scratch buffer */ +} ScratchFreeslot; + +/* +** State information local to the memory allocation subsystem. +*/ +static SQLITE_WSD struct Mem0Global { + sqlite3_mutex *mutex; /* Mutex to serialize access */ + sqlite3_int64 alarmThreshold; /* The soft heap limit */ + + /* + ** Pointers to the end of sqlite3GlobalConfig.pScratch memory + ** (so that a range test can be used to determine if an allocation + ** being freed came from pScratch) and a pointer to the list of + ** unused scratch allocations. + */ + void *pScratchEnd; + ScratchFreeslot *pScratchFree; + u32 nScratchFree; + + /* + ** True if heap is nearly "full" where "full" is defined by the + ** sqlite3_soft_heap_limit() setting. + */ + int nearlyFull; +} mem0 = { 0, 0, 0, 0, 0, 0 }; + +#define mem0 GLOBAL(struct Mem0Global, mem0) + +/* +** Return the memory allocator mutex. sqlite3_status() needs it. +*/ +SQLITE_PRIVATE sqlite3_mutex *sqlite3MallocMutex(void){ + return mem0.mutex; +} + +#ifndef SQLITE_OMIT_DEPRECATED +/* +** Deprecated external interface. It used to set an alarm callback +** that was invoked when memory usage grew too large. Now it is a +** no-op. +*/ +SQLITE_API int sqlite3_memory_alarm( + void(*xCallback)(void *pArg, sqlite3_int64 used,int N), + void *pArg, + sqlite3_int64 iThreshold +){ + (void)xCallback; + (void)pArg; + (void)iThreshold; + return SQLITE_OK; +} +#endif + +/* +** Set the soft heap-size limit for the library. Passing a zero or +** negative value indicates no limit. +*/ +SQLITE_API sqlite3_int64 sqlite3_soft_heap_limit64(sqlite3_int64 n){ + sqlite3_int64 priorLimit; + sqlite3_int64 excess; + sqlite3_int64 nUsed; +#ifndef SQLITE_OMIT_AUTOINIT + int rc = sqlite3_initialize(); + if( rc ) return -1; +#endif + sqlite3_mutex_enter(mem0.mutex); + priorLimit = mem0.alarmThreshold; + if( n<0 ){ + sqlite3_mutex_leave(mem0.mutex); + return priorLimit; + } + mem0.alarmThreshold = n; + nUsed = sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED); + mem0.nearlyFull = (n>0 && n<=nUsed); + sqlite3_mutex_leave(mem0.mutex); + excess = sqlite3_memory_used() - n; + if( excess>0 ) sqlite3_release_memory((int)(excess & 0x7fffffff)); + return priorLimit; +} +SQLITE_API void sqlite3_soft_heap_limit(int n){ + if( n<0 ) n = 0; + sqlite3_soft_heap_limit64(n); +} + +/* +** Initialize the memory allocation subsystem. +*/ +SQLITE_PRIVATE int sqlite3MallocInit(void){ + int rc; + if( sqlite3GlobalConfig.m.xMalloc==0 ){ + sqlite3MemSetDefault(); + } + memset(&mem0, 0, sizeof(mem0)); + mem0.mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MEM); + if( sqlite3GlobalConfig.pScratch && sqlite3GlobalConfig.szScratch>=100 + && sqlite3GlobalConfig.nScratch>0 ){ + int i, n, sz; + ScratchFreeslot *pSlot; + sz = ROUNDDOWN8(sqlite3GlobalConfig.szScratch); + sqlite3GlobalConfig.szScratch = sz; + pSlot = (ScratchFreeslot*)sqlite3GlobalConfig.pScratch; + n = sqlite3GlobalConfig.nScratch; + mem0.pScratchFree = pSlot; + mem0.nScratchFree = n; + for(i=0; ipNext = (ScratchFreeslot*)(sz+(char*)pSlot); + pSlot = pSlot->pNext; + } + pSlot->pNext = 0; + mem0.pScratchEnd = (void*)&pSlot[1]; + }else{ + mem0.pScratchEnd = 0; + sqlite3GlobalConfig.pScratch = 0; + sqlite3GlobalConfig.szScratch = 0; + sqlite3GlobalConfig.nScratch = 0; + } + if( sqlite3GlobalConfig.pPage==0 || sqlite3GlobalConfig.szPage<512 + || sqlite3GlobalConfig.nPage<=0 ){ + sqlite3GlobalConfig.pPage = 0; + sqlite3GlobalConfig.szPage = 0; + } + rc = sqlite3GlobalConfig.m.xInit(sqlite3GlobalConfig.m.pAppData); + if( rc!=SQLITE_OK ) memset(&mem0, 0, sizeof(mem0)); + return rc; +} + +/* +** Return true if the heap is currently under memory pressure - in other +** words if the amount of heap used is close to the limit set by +** sqlite3_soft_heap_limit(). +*/ +SQLITE_PRIVATE int sqlite3HeapNearlyFull(void){ + return mem0.nearlyFull; +} + +/* +** Deinitialize the memory allocation subsystem. +*/ +SQLITE_PRIVATE void sqlite3MallocEnd(void){ + if( sqlite3GlobalConfig.m.xShutdown ){ + sqlite3GlobalConfig.m.xShutdown(sqlite3GlobalConfig.m.pAppData); + } + memset(&mem0, 0, sizeof(mem0)); +} + +/* +** Return the amount of memory currently checked out. +*/ +SQLITE_API sqlite3_int64 sqlite3_memory_used(void){ + sqlite3_int64 res, mx; + sqlite3_status64(SQLITE_STATUS_MEMORY_USED, &res, &mx, 0); + return res; +} + +/* +** Return the maximum amount of memory that has ever been +** checked out since either the beginning of this process +** or since the most recent reset. +*/ +SQLITE_API sqlite3_int64 sqlite3_memory_highwater(int resetFlag){ + sqlite3_int64 res, mx; + sqlite3_status64(SQLITE_STATUS_MEMORY_USED, &res, &mx, resetFlag); + return mx; +} + +/* +** Trigger the alarm +*/ +static void sqlite3MallocAlarm(int nByte){ + if( mem0.alarmThreshold<=0 ) return; + sqlite3_mutex_leave(mem0.mutex); + sqlite3_release_memory(nByte); + sqlite3_mutex_enter(mem0.mutex); +} + +/* +** Do a memory allocation with statistics and alarms. Assume the +** lock is already held. +*/ +static int mallocWithAlarm(int n, void **pp){ + int nFull; + void *p; + assert( sqlite3_mutex_held(mem0.mutex) ); + nFull = sqlite3GlobalConfig.m.xRoundup(n); + sqlite3StatusHighwater(SQLITE_STATUS_MALLOC_SIZE, n); + if( mem0.alarmThreshold>0 ){ + sqlite3_int64 nUsed = sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED); + if( nUsed >= mem0.alarmThreshold - nFull ){ + mem0.nearlyFull = 1; + sqlite3MallocAlarm(nFull); + }else{ + mem0.nearlyFull = 0; + } + } + p = sqlite3GlobalConfig.m.xMalloc(nFull); +#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT + if( p==0 && mem0.alarmThreshold>0 ){ + sqlite3MallocAlarm(nFull); + p = sqlite3GlobalConfig.m.xMalloc(nFull); + } +#endif + if( p ){ + nFull = sqlite3MallocSize(p); + sqlite3StatusUp(SQLITE_STATUS_MEMORY_USED, nFull); + sqlite3StatusUp(SQLITE_STATUS_MALLOC_COUNT, 1); + } + *pp = p; + return nFull; +} + +/* +** Allocate memory. This routine is like sqlite3_malloc() except that it +** assumes the memory subsystem has already been initialized. +*/ +SQLITE_PRIVATE void *sqlite3Malloc(u64 n){ + void *p; + if( n==0 || n>=0x7fffff00 ){ + /* A memory allocation of a number of bytes which is near the maximum + ** signed integer value might cause an integer overflow inside of the + ** xMalloc(). Hence we limit the maximum size to 0x7fffff00, giving + ** 255 bytes of overhead. SQLite itself will never use anything near + ** this amount. The only way to reach the limit is with sqlite3_malloc() */ + p = 0; + }else if( sqlite3GlobalConfig.bMemstat ){ + sqlite3_mutex_enter(mem0.mutex); + mallocWithAlarm((int)n, &p); + sqlite3_mutex_leave(mem0.mutex); + }else{ + p = sqlite3GlobalConfig.m.xMalloc((int)n); + } + assert( EIGHT_BYTE_ALIGNMENT(p) ); /* IMP: R-11148-40995 */ + return p; +} + +/* +** This version of the memory allocation is for use by the application. +** First make sure the memory subsystem is initialized, then do the +** allocation. +*/ +SQLITE_API void *sqlite3_malloc(int n){ +#ifndef SQLITE_OMIT_AUTOINIT + if( sqlite3_initialize() ) return 0; +#endif + return n<=0 ? 0 : sqlite3Malloc(n); +} +SQLITE_API void *sqlite3_malloc64(sqlite3_uint64 n){ +#ifndef SQLITE_OMIT_AUTOINIT + if( sqlite3_initialize() ) return 0; +#endif + return sqlite3Malloc(n); +} + +/* +** Each thread may only have a single outstanding allocation from +** xScratchMalloc(). We verify this constraint in the single-threaded +** case by setting scratchAllocOut to 1 when an allocation +** is outstanding clearing it when the allocation is freed. +*/ +#if SQLITE_THREADSAFE==0 && !defined(NDEBUG) +static int scratchAllocOut = 0; +#endif + + +/* +** Allocate memory that is to be used and released right away. +** This routine is similar to alloca() in that it is not intended +** for situations where the memory might be held long-term. This +** routine is intended to get memory to old large transient data +** structures that would not normally fit on the stack of an +** embedded processor. +*/ +SQLITE_PRIVATE void *sqlite3ScratchMalloc(int n){ + void *p; + assert( n>0 ); + + sqlite3_mutex_enter(mem0.mutex); + sqlite3StatusHighwater(SQLITE_STATUS_SCRATCH_SIZE, n); + if( mem0.nScratchFree && sqlite3GlobalConfig.szScratch>=n ){ + p = mem0.pScratchFree; + mem0.pScratchFree = mem0.pScratchFree->pNext; + mem0.nScratchFree--; + sqlite3StatusUp(SQLITE_STATUS_SCRATCH_USED, 1); + sqlite3_mutex_leave(mem0.mutex); + }else{ + sqlite3_mutex_leave(mem0.mutex); + p = sqlite3Malloc(n); + if( sqlite3GlobalConfig.bMemstat && p ){ + sqlite3_mutex_enter(mem0.mutex); + sqlite3StatusUp(SQLITE_STATUS_SCRATCH_OVERFLOW, sqlite3MallocSize(p)); + sqlite3_mutex_leave(mem0.mutex); + } + sqlite3MemdebugSetType(p, MEMTYPE_SCRATCH); + } + assert( sqlite3_mutex_notheld(mem0.mutex) ); + + +#if SQLITE_THREADSAFE==0 && !defined(NDEBUG) + /* EVIDENCE-OF: R-12970-05880 SQLite will not use more than one scratch + ** buffers per thread. + ** + ** This can only be checked in single-threaded mode. + */ + assert( scratchAllocOut==0 ); + if( p ) scratchAllocOut++; +#endif + + return p; +} +SQLITE_PRIVATE void sqlite3ScratchFree(void *p){ + if( p ){ + +#if SQLITE_THREADSAFE==0 && !defined(NDEBUG) + /* Verify that no more than two scratch allocation per thread + ** is outstanding at one time. (This is only checked in the + ** single-threaded case since checking in the multi-threaded case + ** would be much more complicated.) */ + assert( scratchAllocOut>=1 && scratchAllocOut<=2 ); + scratchAllocOut--; +#endif + + if( SQLITE_WITHIN(p, sqlite3GlobalConfig.pScratch, mem0.pScratchEnd) ){ + /* Release memory from the SQLITE_CONFIG_SCRATCH allocation */ + ScratchFreeslot *pSlot; + pSlot = (ScratchFreeslot*)p; + sqlite3_mutex_enter(mem0.mutex); + pSlot->pNext = mem0.pScratchFree; + mem0.pScratchFree = pSlot; + mem0.nScratchFree++; + assert( mem0.nScratchFree <= (u32)sqlite3GlobalConfig.nScratch ); + sqlite3StatusDown(SQLITE_STATUS_SCRATCH_USED, 1); + sqlite3_mutex_leave(mem0.mutex); + }else{ + /* Release memory back to the heap */ + assert( sqlite3MemdebugHasType(p, MEMTYPE_SCRATCH) ); + assert( sqlite3MemdebugNoType(p, (u8)~MEMTYPE_SCRATCH) ); + sqlite3MemdebugSetType(p, MEMTYPE_HEAP); + if( sqlite3GlobalConfig.bMemstat ){ + int iSize = sqlite3MallocSize(p); + sqlite3_mutex_enter(mem0.mutex); + sqlite3StatusDown(SQLITE_STATUS_SCRATCH_OVERFLOW, iSize); + sqlite3StatusDown(SQLITE_STATUS_MEMORY_USED, iSize); + sqlite3StatusDown(SQLITE_STATUS_MALLOC_COUNT, 1); + sqlite3GlobalConfig.m.xFree(p); + sqlite3_mutex_leave(mem0.mutex); + }else{ + sqlite3GlobalConfig.m.xFree(p); + } + } + } +} + +/* +** TRUE if p is a lookaside memory allocation from db +*/ +#ifndef SQLITE_OMIT_LOOKASIDE +static int isLookaside(sqlite3 *db, void *p){ + return SQLITE_WITHIN(p, db->lookaside.pStart, db->lookaside.pEnd); +} +#else +#define isLookaside(A,B) 0 +#endif + +/* +** Return the size of a memory allocation previously obtained from +** sqlite3Malloc() or sqlite3_malloc(). +*/ +SQLITE_PRIVATE int sqlite3MallocSize(void *p){ + assert( sqlite3MemdebugHasType(p, MEMTYPE_HEAP) ); + return sqlite3GlobalConfig.m.xSize(p); +} +SQLITE_PRIVATE int sqlite3DbMallocSize(sqlite3 *db, void *p){ + assert( p!=0 ); + if( db==0 || !isLookaside(db,p) ){ +#if SQLITE_DEBUG + if( db==0 ){ + assert( sqlite3MemdebugNoType(p, (u8)~MEMTYPE_HEAP) ); + assert( sqlite3MemdebugHasType(p, MEMTYPE_HEAP) ); + }else{ + assert( sqlite3MemdebugHasType(p, (MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) ); + assert( sqlite3MemdebugNoType(p, (u8)~(MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) ); + } +#endif + return sqlite3GlobalConfig.m.xSize(p); + }else{ + assert( sqlite3_mutex_held(db->mutex) ); + return db->lookaside.sz; + } +} +SQLITE_API sqlite3_uint64 sqlite3_msize(void *p){ + assert( sqlite3MemdebugNoType(p, (u8)~MEMTYPE_HEAP) ); + assert( sqlite3MemdebugHasType(p, MEMTYPE_HEAP) ); + return p ? sqlite3GlobalConfig.m.xSize(p) : 0; +} + +/* +** Free memory previously obtained from sqlite3Malloc(). +*/ +SQLITE_API void sqlite3_free(void *p){ + if( p==0 ) return; /* IMP: R-49053-54554 */ + assert( sqlite3MemdebugHasType(p, MEMTYPE_HEAP) ); + assert( sqlite3MemdebugNoType(p, (u8)~MEMTYPE_HEAP) ); + if( sqlite3GlobalConfig.bMemstat ){ + sqlite3_mutex_enter(mem0.mutex); + sqlite3StatusDown(SQLITE_STATUS_MEMORY_USED, sqlite3MallocSize(p)); + sqlite3StatusDown(SQLITE_STATUS_MALLOC_COUNT, 1); + sqlite3GlobalConfig.m.xFree(p); + sqlite3_mutex_leave(mem0.mutex); + }else{ + sqlite3GlobalConfig.m.xFree(p); + } +} + +/* +** Add the size of memory allocation "p" to the count in +** *db->pnBytesFreed. +*/ +static SQLITE_NOINLINE void measureAllocationSize(sqlite3 *db, void *p){ + *db->pnBytesFreed += sqlite3DbMallocSize(db,p); +} + +/* +** Free memory that might be associated with a particular database +** connection. +*/ +SQLITE_PRIVATE void sqlite3DbFree(sqlite3 *db, void *p){ + assert( db==0 || sqlite3_mutex_held(db->mutex) ); + if( p==0 ) return; + if( db ){ + if( db->pnBytesFreed ){ + measureAllocationSize(db, p); + return; + } + if( isLookaside(db, p) ){ + LookasideSlot *pBuf = (LookasideSlot*)p; +#if SQLITE_DEBUG + /* Trash all content in the buffer being freed */ + memset(p, 0xaa, db->lookaside.sz); +#endif + pBuf->pNext = db->lookaside.pFree; + db->lookaside.pFree = pBuf; + db->lookaside.nOut--; + return; + } + } + assert( sqlite3MemdebugHasType(p, (MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) ); + assert( sqlite3MemdebugNoType(p, (u8)~(MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) ); + assert( db!=0 || sqlite3MemdebugNoType(p, MEMTYPE_LOOKASIDE) ); + sqlite3MemdebugSetType(p, MEMTYPE_HEAP); + sqlite3_free(p); +} + +/* +** Change the size of an existing memory allocation +*/ +SQLITE_PRIVATE void *sqlite3Realloc(void *pOld, u64 nBytes){ + int nOld, nNew, nDiff; + void *pNew; + assert( sqlite3MemdebugHasType(pOld, MEMTYPE_HEAP) ); + assert( sqlite3MemdebugNoType(pOld, (u8)~MEMTYPE_HEAP) ); + if( pOld==0 ){ + return sqlite3Malloc(nBytes); /* IMP: R-04300-56712 */ + } + if( nBytes==0 ){ + sqlite3_free(pOld); /* IMP: R-26507-47431 */ + return 0; + } + if( nBytes>=0x7fffff00 ){ + /* The 0x7ffff00 limit term is explained in comments on sqlite3Malloc() */ + return 0; + } + nOld = sqlite3MallocSize(pOld); + /* IMPLEMENTATION-OF: R-46199-30249 SQLite guarantees that the second + ** argument to xRealloc is always a value returned by a prior call to + ** xRoundup. */ + nNew = sqlite3GlobalConfig.m.xRoundup((int)nBytes); + if( nOld==nNew ){ + pNew = pOld; + }else if( sqlite3GlobalConfig.bMemstat ){ + sqlite3_mutex_enter(mem0.mutex); + sqlite3StatusHighwater(SQLITE_STATUS_MALLOC_SIZE, (int)nBytes); + nDiff = nNew - nOld; + if( sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED) >= + mem0.alarmThreshold-nDiff ){ + sqlite3MallocAlarm(nDiff); + } + pNew = sqlite3GlobalConfig.m.xRealloc(pOld, nNew); + if( pNew==0 && mem0.alarmThreshold>0 ){ + sqlite3MallocAlarm((int)nBytes); + pNew = sqlite3GlobalConfig.m.xRealloc(pOld, nNew); + } + if( pNew ){ + nNew = sqlite3MallocSize(pNew); + sqlite3StatusUp(SQLITE_STATUS_MEMORY_USED, nNew-nOld); + } + sqlite3_mutex_leave(mem0.mutex); + }else{ + pNew = sqlite3GlobalConfig.m.xRealloc(pOld, nNew); + } + assert( EIGHT_BYTE_ALIGNMENT(pNew) ); /* IMP: R-11148-40995 */ + return pNew; +} + +/* +** The public interface to sqlite3Realloc. Make sure that the memory +** subsystem is initialized prior to invoking sqliteRealloc. +*/ +SQLITE_API void *sqlite3_realloc(void *pOld, int n){ +#ifndef SQLITE_OMIT_AUTOINIT + if( sqlite3_initialize() ) return 0; +#endif + if( n<0 ) n = 0; /* IMP: R-26507-47431 */ + return sqlite3Realloc(pOld, n); +} +SQLITE_API void *sqlite3_realloc64(void *pOld, sqlite3_uint64 n){ +#ifndef SQLITE_OMIT_AUTOINIT + if( sqlite3_initialize() ) return 0; +#endif + return sqlite3Realloc(pOld, n); +} + + +/* +** Allocate and zero memory. +*/ +SQLITE_PRIVATE void *sqlite3MallocZero(u64 n){ + void *p = sqlite3Malloc(n); + if( p ){ + memset(p, 0, (size_t)n); + } + return p; +} + +/* +** Allocate and zero memory. If the allocation fails, make +** the mallocFailed flag in the connection pointer. +*/ +SQLITE_PRIVATE void *sqlite3DbMallocZero(sqlite3 *db, u64 n){ + void *p; + testcase( db==0 ); + p = sqlite3DbMallocRaw(db, n); + if( p ) memset(p, 0, (size_t)n); + return p; +} + + +/* Finish the work of sqlite3DbMallocRawNN for the unusual and +** slower case when the allocation cannot be fulfilled using lookaside. +*/ +static SQLITE_NOINLINE void *dbMallocRawFinish(sqlite3 *db, u64 n){ + void *p; + assert( db!=0 ); + p = sqlite3Malloc(n); + if( !p ) sqlite3OomFault(db); + sqlite3MemdebugSetType(p, + (db->lookaside.bDisable==0) ? MEMTYPE_LOOKASIDE : MEMTYPE_HEAP); + return p; +} + +/* +** Allocate memory, either lookaside (if possible) or heap. +** If the allocation fails, set the mallocFailed flag in +** the connection pointer. +** +** If db!=0 and db->mallocFailed is true (indicating a prior malloc +** failure on the same database connection) then always return 0. +** Hence for a particular database connection, once malloc starts +** failing, it fails consistently until mallocFailed is reset. +** This is an important assumption. There are many places in the +** code that do things like this: +** +** int *a = (int*)sqlite3DbMallocRaw(db, 100); +** int *b = (int*)sqlite3DbMallocRaw(db, 200); +** if( b ) a[10] = 9; +** +** In other words, if a subsequent malloc (ex: "b") worked, it is assumed +** that all prior mallocs (ex: "a") worked too. +** +** The sqlite3MallocRawNN() variant guarantees that the "db" parameter is +** not a NULL pointer. +*/ +SQLITE_PRIVATE void *sqlite3DbMallocRaw(sqlite3 *db, u64 n){ + void *p; + if( db ) return sqlite3DbMallocRawNN(db, n); + p = sqlite3Malloc(n); + sqlite3MemdebugSetType(p, MEMTYPE_HEAP); + return p; +} +SQLITE_PRIVATE void *sqlite3DbMallocRawNN(sqlite3 *db, u64 n){ +#ifndef SQLITE_OMIT_LOOKASIDE + LookasideSlot *pBuf; + assert( db!=0 ); + assert( sqlite3_mutex_held(db->mutex) ); + assert( db->pnBytesFreed==0 ); + if( db->lookaside.bDisable==0 ){ + assert( db->mallocFailed==0 ); + if( n>db->lookaside.sz ){ + db->lookaside.anStat[1]++; + }else if( (pBuf = db->lookaside.pFree)==0 ){ + db->lookaside.anStat[2]++; + }else{ + db->lookaside.pFree = pBuf->pNext; + db->lookaside.nOut++; + db->lookaside.anStat[0]++; + if( db->lookaside.nOut>db->lookaside.mxOut ){ + db->lookaside.mxOut = db->lookaside.nOut; + } + return (void*)pBuf; + } + }else if( db->mallocFailed ){ + return 0; + } +#else + assert( db!=0 ); + assert( sqlite3_mutex_held(db->mutex) ); + assert( db->pnBytesFreed==0 ); + if( db->mallocFailed ){ + return 0; + } +#endif + return dbMallocRawFinish(db, n); +} + +/* Forward declaration */ +static SQLITE_NOINLINE void *dbReallocFinish(sqlite3 *db, void *p, u64 n); + +/* +** Resize the block of memory pointed to by p to n bytes. If the +** resize fails, set the mallocFailed flag in the connection object. +*/ +SQLITE_PRIVATE void *sqlite3DbRealloc(sqlite3 *db, void *p, u64 n){ + assert( db!=0 ); + if( p==0 ) return sqlite3DbMallocRawNN(db, n); + assert( sqlite3_mutex_held(db->mutex) ); + if( isLookaside(db,p) && n<=db->lookaside.sz ) return p; + return dbReallocFinish(db, p, n); +} +static SQLITE_NOINLINE void *dbReallocFinish(sqlite3 *db, void *p, u64 n){ + void *pNew = 0; + assert( db!=0 ); + assert( p!=0 ); + if( db->mallocFailed==0 ){ + if( isLookaside(db, p) ){ + pNew = sqlite3DbMallocRawNN(db, n); + if( pNew ){ + memcpy(pNew, p, db->lookaside.sz); + sqlite3DbFree(db, p); + } + }else{ + assert( sqlite3MemdebugHasType(p, (MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) ); + assert( sqlite3MemdebugNoType(p, (u8)~(MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) ); + sqlite3MemdebugSetType(p, MEMTYPE_HEAP); + pNew = sqlite3_realloc64(p, n); + if( !pNew ){ + sqlite3OomFault(db); + } + sqlite3MemdebugSetType(pNew, + (db->lookaside.bDisable==0 ? MEMTYPE_LOOKASIDE : MEMTYPE_HEAP)); + } + } + return pNew; +} + +/* +** Attempt to reallocate p. If the reallocation fails, then free p +** and set the mallocFailed flag in the database connection. +*/ +SQLITE_PRIVATE void *sqlite3DbReallocOrFree(sqlite3 *db, void *p, u64 n){ + void *pNew; + pNew = sqlite3DbRealloc(db, p, n); + if( !pNew ){ + sqlite3DbFree(db, p); + } + return pNew; +} + +/* +** Make a copy of a string in memory obtained from sqliteMalloc(). These +** functions call sqlite3MallocRaw() directly instead of sqliteMalloc(). This +** is because when memory debugging is turned on, these two functions are +** called via macros that record the current file and line number in the +** ThreadData structure. +*/ +SQLITE_PRIVATE char *sqlite3DbStrDup(sqlite3 *db, const char *z){ + char *zNew; + size_t n; + if( z==0 ){ + return 0; + } + n = sqlite3Strlen30(z) + 1; + assert( (n&0x7fffffff)==n ); + zNew = sqlite3DbMallocRaw(db, (int)n); + if( zNew ){ + memcpy(zNew, z, n); + } + return zNew; +} +SQLITE_PRIVATE char *sqlite3DbStrNDup(sqlite3 *db, const char *z, u64 n){ + char *zNew; + assert( db!=0 ); + if( z==0 ){ + return 0; + } + assert( (n&0x7fffffff)==n ); + zNew = sqlite3DbMallocRawNN(db, n+1); + if( zNew ){ + memcpy(zNew, z, (size_t)n); + zNew[n] = 0; + } + return zNew; +} + +/* +** Free any prior content in *pz and replace it with a copy of zNew. +*/ +SQLITE_PRIVATE void sqlite3SetString(char **pz, sqlite3 *db, const char *zNew){ + sqlite3DbFree(db, *pz); + *pz = sqlite3DbStrDup(db, zNew); +} + +/* +** Call this routine to record the fact that an OOM (out-of-memory) error +** has happened. This routine will set db->mallocFailed, and also +** temporarily disable the lookaside memory allocator and interrupt +** any running VDBEs. +*/ +SQLITE_PRIVATE void sqlite3OomFault(sqlite3 *db){ + if( db->mallocFailed==0 && db->bBenignMalloc==0 ){ + db->mallocFailed = 1; + if( db->nVdbeExec>0 ){ + db->u1.isInterrupted = 1; + } + db->lookaside.bDisable++; + } +} + +/* +** This routine reactivates the memory allocator and clears the +** db->mallocFailed flag as necessary. +** +** The memory allocator is not restarted if there are running +** VDBEs. +*/ +SQLITE_PRIVATE void sqlite3OomClear(sqlite3 *db){ + if( db->mallocFailed && db->nVdbeExec==0 ){ + db->mallocFailed = 0; + db->u1.isInterrupted = 0; + assert( db->lookaside.bDisable>0 ); + db->lookaside.bDisable--; + } +} + +/* +** Take actions at the end of an API call to indicate an OOM error +*/ +static SQLITE_NOINLINE int apiOomError(sqlite3 *db){ + sqlite3OomClear(db); + sqlite3Error(db, SQLITE_NOMEM); + return SQLITE_NOMEM_BKPT; +} + +/* +** This function must be called before exiting any API function (i.e. +** returning control to the user) that has called sqlite3_malloc or +** sqlite3_realloc. +** +** The returned value is normally a copy of the second argument to this +** function. However, if a malloc() failure has occurred since the previous +** invocation SQLITE_NOMEM is returned instead. +** +** If an OOM as occurred, then the connection error-code (the value +** returned by sqlite3_errcode()) is set to SQLITE_NOMEM. +*/ +SQLITE_PRIVATE int sqlite3ApiExit(sqlite3* db, int rc){ + /* If the db handle must hold the connection handle mutex here. + ** Otherwise the read (and possible write) of db->mallocFailed + ** is unsafe, as is the call to sqlite3Error(). + */ + assert( db!=0 ); + assert( sqlite3_mutex_held(db->mutex) ); + if( db->mallocFailed || rc==SQLITE_IOERR_NOMEM ){ + return apiOomError(db); + } + return rc & db->errMask; +} + +/************** End of malloc.c **********************************************/ +/************** Begin file printf.c ******************************************/ +/* +** The "printf" code that follows dates from the 1980's. It is in +** the public domain. +** +************************************************************************** +** +** This file contains code for a set of "printf"-like routines. These +** routines format strings much like the printf() from the standard C +** library, though the implementation here has enhancements to support +** SQLite. +*/ +/* #include "sqliteInt.h" */ + +/* +** Conversion types fall into various categories as defined by the +** following enumeration. +*/ +#define etRADIX 0 /* Integer types. %d, %x, %o, and so forth */ +#define etFLOAT 1 /* Floating point. %f */ +#define etEXP 2 /* Exponentional notation. %e and %E */ +#define etGENERIC 3 /* Floating or exponential, depending on exponent. %g */ +#define etSIZE 4 /* Return number of characters processed so far. %n */ +#define etSTRING 5 /* Strings. %s */ +#define etDYNSTRING 6 /* Dynamically allocated strings. %z */ +#define etPERCENT 7 /* Percent symbol. %% */ +#define etCHARX 8 /* Characters. %c */ +/* The rest are extensions, not normally found in printf() */ +#define etSQLESCAPE 9 /* Strings with '\'' doubled. %q */ +#define etSQLESCAPE2 10 /* Strings with '\'' doubled and enclosed in '', + NULL pointers replaced by SQL NULL. %Q */ +#define etTOKEN 11 /* a pointer to a Token structure */ +#define etSRCLIST 12 /* a pointer to a SrcList */ +#define etPOINTER 13 /* The %p conversion */ +#define etSQLESCAPE3 14 /* %w -> Strings with '\"' doubled */ +#define etORDINAL 15 /* %r -> 1st, 2nd, 3rd, 4th, etc. English only */ + +#define etINVALID 16 /* Any unrecognized conversion type */ + + +/* +** An "etByte" is an 8-bit unsigned value. +*/ +typedef unsigned char etByte; + +/* +** Each builtin conversion character (ex: the 'd' in "%d") is described +** by an instance of the following structure +*/ +typedef struct et_info { /* Information about each format field */ + char fmttype; /* The format field code letter */ + etByte base; /* The base for radix conversion */ + etByte flags; /* One or more of FLAG_ constants below */ + etByte type; /* Conversion paradigm */ + etByte charset; /* Offset into aDigits[] of the digits string */ + etByte prefix; /* Offset into aPrefix[] of the prefix string */ +} et_info; + +/* +** Allowed values for et_info.flags +*/ +#define FLAG_SIGNED 1 /* True if the value to convert is signed */ +#define FLAG_INTERN 2 /* True if for internal use only */ +#define FLAG_STRING 4 /* Allow infinity precision */ + + +/* +** The following table is searched linearly, so it is good to put the +** most frequently used conversion types first. +*/ +static const char aDigits[] = "0123456789ABCDEF0123456789abcdef"; +static const char aPrefix[] = "-x0\000X0"; +static const et_info fmtinfo[] = { + { 'd', 10, 1, etRADIX, 0, 0 }, + { 's', 0, 4, etSTRING, 0, 0 }, + { 'g', 0, 1, etGENERIC, 30, 0 }, + { 'z', 0, 4, etDYNSTRING, 0, 0 }, + { 'q', 0, 4, etSQLESCAPE, 0, 0 }, + { 'Q', 0, 4, etSQLESCAPE2, 0, 0 }, + { 'w', 0, 4, etSQLESCAPE3, 0, 0 }, + { 'c', 0, 0, etCHARX, 0, 0 }, + { 'o', 8, 0, etRADIX, 0, 2 }, + { 'u', 10, 0, etRADIX, 0, 0 }, + { 'x', 16, 0, etRADIX, 16, 1 }, + { 'X', 16, 0, etRADIX, 0, 4 }, +#ifndef SQLITE_OMIT_FLOATING_POINT + { 'f', 0, 1, etFLOAT, 0, 0 }, + { 'e', 0, 1, etEXP, 30, 0 }, + { 'E', 0, 1, etEXP, 14, 0 }, + { 'G', 0, 1, etGENERIC, 14, 0 }, +#endif + { 'i', 10, 1, etRADIX, 0, 0 }, + { 'n', 0, 0, etSIZE, 0, 0 }, + { '%', 0, 0, etPERCENT, 0, 0 }, + { 'p', 16, 0, etPOINTER, 0, 1 }, + +/* All the rest have the FLAG_INTERN bit set and are thus for internal +** use only */ + { 'T', 0, 2, etTOKEN, 0, 0 }, + { 'S', 0, 2, etSRCLIST, 0, 0 }, + { 'r', 10, 3, etORDINAL, 0, 0 }, +}; + +/* +** If SQLITE_OMIT_FLOATING_POINT is defined, then none of the floating point +** conversions will work. +*/ +#ifndef SQLITE_OMIT_FLOATING_POINT +/* +** "*val" is a double such that 0.1 <= *val < 10.0 +** Return the ascii code for the leading digit of *val, then +** multiply "*val" by 10.0 to renormalize. +** +** Example: +** input: *val = 3.14159 +** output: *val = 1.4159 function return = '3' +** +** The counter *cnt is incremented each time. After counter exceeds +** 16 (the number of significant digits in a 64-bit float) '0' is +** always returned. +*/ +static char et_getdigit(LONGDOUBLE_TYPE *val, int *cnt){ + int digit; + LONGDOUBLE_TYPE d; + if( (*cnt)<=0 ) return '0'; + (*cnt)--; + digit = (int)*val; + d = digit; + digit += '0'; + *val = (*val - d)*10.0; + return (char)digit; +} +#endif /* SQLITE_OMIT_FLOATING_POINT */ + +/* +** Set the StrAccum object to an error mode. +*/ +static void setStrAccumError(StrAccum *p, u8 eError){ + assert( eError==STRACCUM_NOMEM || eError==STRACCUM_TOOBIG ); + p->accError = eError; + p->nAlloc = 0; +} + +/* +** Extra argument values from a PrintfArguments object +*/ +static sqlite3_int64 getIntArg(PrintfArguments *p){ + if( p->nArg<=p->nUsed ) return 0; + return sqlite3_value_int64(p->apArg[p->nUsed++]); +} +static double getDoubleArg(PrintfArguments *p){ + if( p->nArg<=p->nUsed ) return 0.0; + return sqlite3_value_double(p->apArg[p->nUsed++]); +} +static char *getTextArg(PrintfArguments *p){ + if( p->nArg<=p->nUsed ) return 0; + return (char*)sqlite3_value_text(p->apArg[p->nUsed++]); +} + + +/* +** On machines with a small stack size, you can redefine the +** SQLITE_PRINT_BUF_SIZE to be something smaller, if desired. +*/ +#ifndef SQLITE_PRINT_BUF_SIZE +# define SQLITE_PRINT_BUF_SIZE 70 +#endif +#define etBUFSIZE SQLITE_PRINT_BUF_SIZE /* Size of the output buffer */ + +/* +** Render a string given by "fmt" into the StrAccum object. +*/ +SQLITE_PRIVATE void sqlite3VXPrintf( + StrAccum *pAccum, /* Accumulate results here */ + const char *fmt, /* Format string */ + va_list ap /* arguments */ +){ + int c; /* Next character in the format string */ + char *bufpt; /* Pointer to the conversion buffer */ + int precision; /* Precision of the current field */ + int length; /* Length of the field */ + int idx; /* A general purpose loop counter */ + int width; /* Width of the current field */ + etByte flag_leftjustify; /* True if "-" flag is present */ + etByte flag_plussign; /* True if "+" flag is present */ + etByte flag_blanksign; /* True if " " flag is present */ + etByte flag_alternateform; /* True if "#" flag is present */ + etByte flag_altform2; /* True if "!" flag is present */ + etByte flag_zeropad; /* True if field width constant starts with zero */ + etByte flag_long; /* True if "l" flag is present */ + etByte flag_longlong; /* True if the "ll" flag is present */ + etByte done; /* Loop termination flag */ + etByte xtype = etINVALID; /* Conversion paradigm */ + u8 bArgList; /* True for SQLITE_PRINTF_SQLFUNC */ + u8 useIntern; /* Ok to use internal conversions (ex: %T) */ + char prefix; /* Prefix character. "+" or "-" or " " or '\0'. */ + sqlite_uint64 longvalue; /* Value for integer types */ + LONGDOUBLE_TYPE realvalue; /* Value for real types */ + const et_info *infop; /* Pointer to the appropriate info structure */ + char *zOut; /* Rendering buffer */ + int nOut; /* Size of the rendering buffer */ + char *zExtra = 0; /* Malloced memory used by some conversion */ +#ifndef SQLITE_OMIT_FLOATING_POINT + int exp, e2; /* exponent of real numbers */ + int nsd; /* Number of significant digits returned */ + double rounder; /* Used for rounding floating point values */ + etByte flag_dp; /* True if decimal point should be shown */ + etByte flag_rtz; /* True if trailing zeros should be removed */ +#endif + PrintfArguments *pArgList = 0; /* Arguments for SQLITE_PRINTF_SQLFUNC */ + char buf[etBUFSIZE]; /* Conversion buffer */ + + bufpt = 0; + if( pAccum->printfFlags ){ + if( (bArgList = (pAccum->printfFlags & SQLITE_PRINTF_SQLFUNC))!=0 ){ + pArgList = va_arg(ap, PrintfArguments*); + } + useIntern = pAccum->printfFlags & SQLITE_PRINTF_INTERNAL; + }else{ + bArgList = useIntern = 0; + } + for(; (c=(*fmt))!=0; ++fmt){ + if( c!='%' ){ + bufpt = (char *)fmt; +#if HAVE_STRCHRNUL + fmt = strchrnul(fmt, '%'); +#else + do{ fmt++; }while( *fmt && *fmt != '%' ); +#endif + sqlite3StrAccumAppend(pAccum, bufpt, (int)(fmt - bufpt)); + if( *fmt==0 ) break; + } + if( (c=(*++fmt))==0 ){ + sqlite3StrAccumAppend(pAccum, "%", 1); + break; + } + /* Find out what flags are present */ + flag_leftjustify = flag_plussign = flag_blanksign = + flag_alternateform = flag_altform2 = flag_zeropad = 0; + done = 0; + do{ + switch( c ){ + case '-': flag_leftjustify = 1; break; + case '+': flag_plussign = 1; break; + case ' ': flag_blanksign = 1; break; + case '#': flag_alternateform = 1; break; + case '!': flag_altform2 = 1; break; + case '0': flag_zeropad = 1; break; + default: done = 1; break; + } + }while( !done && (c=(*++fmt))!=0 ); + /* Get the field width */ + if( c=='*' ){ + if( bArgList ){ + width = (int)getIntArg(pArgList); + }else{ + width = va_arg(ap,int); + } + if( width<0 ){ + flag_leftjustify = 1; + width = width >= -2147483647 ? -width : 0; + } + c = *++fmt; + }else{ + unsigned wx = 0; + while( c>='0' && c<='9' ){ + wx = wx*10 + c - '0'; + c = *++fmt; + } + testcase( wx>0x7fffffff ); + width = wx & 0x7fffffff; + } + assert( width>=0 ); +#ifdef SQLITE_PRINTF_PRECISION_LIMIT + if( width>SQLITE_PRINTF_PRECISION_LIMIT ){ + width = SQLITE_PRINTF_PRECISION_LIMIT; + } +#endif + + /* Get the precision */ + if( c=='.' ){ + c = *++fmt; + if( c=='*' ){ + if( bArgList ){ + precision = (int)getIntArg(pArgList); + }else{ + precision = va_arg(ap,int); + } + c = *++fmt; + if( precision<0 ){ + precision = precision >= -2147483647 ? -precision : -1; + } + }else{ + unsigned px = 0; + while( c>='0' && c<='9' ){ + px = px*10 + c - '0'; + c = *++fmt; + } + testcase( px>0x7fffffff ); + precision = px & 0x7fffffff; + } + }else{ + precision = -1; + } + assert( precision>=(-1) ); +#ifdef SQLITE_PRINTF_PRECISION_LIMIT + if( precision>SQLITE_PRINTF_PRECISION_LIMIT ){ + precision = SQLITE_PRINTF_PRECISION_LIMIT; + } +#endif + + + /* Get the conversion type modifier */ + if( c=='l' ){ + flag_long = 1; + c = *++fmt; + if( c=='l' ){ + flag_longlong = 1; + c = *++fmt; + }else{ + flag_longlong = 0; + } + }else{ + flag_long = flag_longlong = 0; + } + /* Fetch the info entry for the field */ + infop = &fmtinfo[0]; + xtype = etINVALID; + for(idx=0; idxflags & FLAG_INTERN)==0 ){ + xtype = infop->type; + }else{ + return; + } + break; + } + } + + /* + ** At this point, variables are initialized as follows: + ** + ** flag_alternateform TRUE if a '#' is present. + ** flag_altform2 TRUE if a '!' is present. + ** flag_plussign TRUE if a '+' is present. + ** flag_leftjustify TRUE if a '-' is present or if the + ** field width was negative. + ** flag_zeropad TRUE if the width began with 0. + ** flag_long TRUE if the letter 'l' (ell) prefixed + ** the conversion character. + ** flag_longlong TRUE if the letter 'll' (ell ell) prefixed + ** the conversion character. + ** flag_blanksign TRUE if a ' ' is present. + ** width The specified field width. This is + ** always non-negative. Zero is the default. + ** precision The specified precision. The default + ** is -1. + ** xtype The class of the conversion. + ** infop Pointer to the appropriate info struct. + */ + switch( xtype ){ + case etPOINTER: + flag_longlong = sizeof(char*)==sizeof(i64); + flag_long = sizeof(char*)==sizeof(long int); + /* Fall through into the next case */ + case etORDINAL: + case etRADIX: + if( infop->flags & FLAG_SIGNED ){ + i64 v; + if( bArgList ){ + v = getIntArg(pArgList); + }else if( flag_longlong ){ + v = va_arg(ap,i64); + }else if( flag_long ){ + v = va_arg(ap,long int); + }else{ + v = va_arg(ap,int); + } + if( v<0 ){ + if( v==SMALLEST_INT64 ){ + longvalue = ((u64)1)<<63; + }else{ + longvalue = -v; + } + prefix = '-'; + }else{ + longvalue = v; + if( flag_plussign ) prefix = '+'; + else if( flag_blanksign ) prefix = ' '; + else prefix = 0; + } + }else{ + if( bArgList ){ + longvalue = (u64)getIntArg(pArgList); + }else if( flag_longlong ){ + longvalue = va_arg(ap,u64); + }else if( flag_long ){ + longvalue = va_arg(ap,unsigned long int); + }else{ + longvalue = va_arg(ap,unsigned int); + } + prefix = 0; + } + if( longvalue==0 ) flag_alternateform = 0; + if( flag_zeropad && precision=4 || (longvalue/10)%10==1 ){ + x = 0; + } + *(--bufpt) = zOrd[x*2+1]; + *(--bufpt) = zOrd[x*2]; + } + { + const char *cset = &aDigits[infop->charset]; + u8 base = infop->base; + do{ /* Convert to ascii */ + *(--bufpt) = cset[longvalue%base]; + longvalue = longvalue/base; + }while( longvalue>0 ); + } + length = (int)(&zOut[nOut-1]-bufpt); + for(idx=precision-length; idx>0; idx--){ + *(--bufpt) = '0'; /* Zero pad */ + } + if( prefix ) *(--bufpt) = prefix; /* Add sign */ + if( flag_alternateform && infop->prefix ){ /* Add "0" or "0x" */ + const char *pre; + char x; + pre = &aPrefix[infop->prefix]; + for(; (x=(*pre))!=0; pre++) *(--bufpt) = x; + } + length = (int)(&zOut[nOut-1]-bufpt); + break; + case etFLOAT: + case etEXP: + case etGENERIC: + if( bArgList ){ + realvalue = getDoubleArg(pArgList); + }else{ + realvalue = va_arg(ap,double); + } +#ifdef SQLITE_OMIT_FLOATING_POINT + length = 0; +#else + if( precision<0 ) precision = 6; /* Set default precision */ + if( realvalue<0.0 ){ + realvalue = -realvalue; + prefix = '-'; + }else{ + if( flag_plussign ) prefix = '+'; + else if( flag_blanksign ) prefix = ' '; + else prefix = 0; + } + if( xtype==etGENERIC && precision>0 ) precision--; + testcase( precision>0xfff ); + for(idx=precision&0xfff, rounder=0.5; idx>0; idx--, rounder*=0.1){} + if( xtype==etFLOAT ) realvalue += rounder; + /* Normalize realvalue to within 10.0 > realvalue >= 1.0 */ + exp = 0; + if( sqlite3IsNaN((double)realvalue) ){ + bufpt = "NaN"; + length = 3; + break; + } + if( realvalue>0.0 ){ + LONGDOUBLE_TYPE scale = 1.0; + while( realvalue>=1e100*scale && exp<=350 ){ scale *= 1e100;exp+=100;} + while( realvalue>=1e10*scale && exp<=350 ){ scale *= 1e10; exp+=10; } + while( realvalue>=10.0*scale && exp<=350 ){ scale *= 10.0; exp++; } + realvalue /= scale; + while( realvalue<1e-8 ){ realvalue *= 1e8; exp-=8; } + while( realvalue<1.0 ){ realvalue *= 10.0; exp--; } + if( exp>350 ){ + bufpt = buf; + buf[0] = prefix; + memcpy(buf+(prefix!=0),"Inf",4); + length = 3+(prefix!=0); + break; + } + } + bufpt = buf; + /* + ** If the field type is etGENERIC, then convert to either etEXP + ** or etFLOAT, as appropriate. + */ + if( xtype!=etFLOAT ){ + realvalue += rounder; + if( realvalue>=10.0 ){ realvalue *= 0.1; exp++; } + } + if( xtype==etGENERIC ){ + flag_rtz = !flag_alternateform; + if( exp<-4 || exp>precision ){ + xtype = etEXP; + }else{ + precision = precision - exp; + xtype = etFLOAT; + } + }else{ + flag_rtz = flag_altform2; + } + if( xtype==etEXP ){ + e2 = 0; + }else{ + e2 = exp; + } + if( MAX(e2,0)+(i64)precision+(i64)width > etBUFSIZE - 15 ){ + bufpt = zExtra + = sqlite3Malloc( MAX(e2,0)+(i64)precision+(i64)width+15 ); + if( bufpt==0 ){ + setStrAccumError(pAccum, STRACCUM_NOMEM); + return; + } + } + zOut = bufpt; + nsd = 16 + flag_altform2*10; + flag_dp = (precision>0 ?1:0) | flag_alternateform | flag_altform2; + /* The sign in front of the number */ + if( prefix ){ + *(bufpt++) = prefix; + } + /* Digits prior to the decimal point */ + if( e2<0 ){ + *(bufpt++) = '0'; + }else{ + for(; e2>=0; e2--){ + *(bufpt++) = et_getdigit(&realvalue,&nsd); + } + } + /* The decimal point */ + if( flag_dp ){ + *(bufpt++) = '.'; + } + /* "0" digits after the decimal point but before the first + ** significant digit of the number */ + for(e2++; e2<0; precision--, e2++){ + assert( precision>0 ); + *(bufpt++) = '0'; + } + /* Significant digits after the decimal point */ + while( (precision--)>0 ){ + *(bufpt++) = et_getdigit(&realvalue,&nsd); + } + /* Remove trailing zeros and the "." if no digits follow the "." */ + if( flag_rtz && flag_dp ){ + while( bufpt[-1]=='0' ) *(--bufpt) = 0; + assert( bufpt>zOut ); + if( bufpt[-1]=='.' ){ + if( flag_altform2 ){ + *(bufpt++) = '0'; + }else{ + *(--bufpt) = 0; + } + } + } + /* Add the "eNNN" suffix */ + if( xtype==etEXP ){ + *(bufpt++) = aDigits[infop->charset]; + if( exp<0 ){ + *(bufpt++) = '-'; exp = -exp; + }else{ + *(bufpt++) = '+'; + } + if( exp>=100 ){ + *(bufpt++) = (char)((exp/100)+'0'); /* 100's digit */ + exp %= 100; + } + *(bufpt++) = (char)(exp/10+'0'); /* 10's digit */ + *(bufpt++) = (char)(exp%10+'0'); /* 1's digit */ + } + *bufpt = 0; + + /* The converted number is in buf[] and zero terminated. Output it. + ** Note that the number is in the usual order, not reversed as with + ** integer conversions. */ + length = (int)(bufpt-zOut); + bufpt = zOut; + + /* Special case: Add leading zeros if the flag_zeropad flag is + ** set and we are not left justified */ + if( flag_zeropad && !flag_leftjustify && length < width){ + int i; + int nPad = width - length; + for(i=width; i>=nPad; i--){ + bufpt[i] = bufpt[i-nPad]; + } + i = prefix!=0; + while( nPad-- ) bufpt[i++] = '0'; + length = width; + } +#endif /* !defined(SQLITE_OMIT_FLOATING_POINT) */ + break; + case etSIZE: + if( !bArgList ){ + *(va_arg(ap,int*)) = pAccum->nChar; + } + length = width = 0; + break; + case etPERCENT: + buf[0] = '%'; + bufpt = buf; + length = 1; + break; + case etCHARX: + if( bArgList ){ + bufpt = getTextArg(pArgList); + c = bufpt ? bufpt[0] : 0; + }else{ + c = va_arg(ap,int); + } + if( precision>1 ){ + width -= precision-1; + if( width>1 && !flag_leftjustify ){ + sqlite3AppendChar(pAccum, width-1, ' '); + width = 0; + } + sqlite3AppendChar(pAccum, precision-1, c); + } + length = 1; + buf[0] = c; + bufpt = buf; + break; + case etSTRING: + case etDYNSTRING: + if( bArgList ){ + bufpt = getTextArg(pArgList); + xtype = etSTRING; + }else{ + bufpt = va_arg(ap,char*); + } + if( bufpt==0 ){ + bufpt = ""; + }else if( xtype==etDYNSTRING ){ + zExtra = bufpt; + } + if( precision>=0 ){ + for(length=0; lengthetBUFSIZE ){ + bufpt = zExtra = sqlite3Malloc( n ); + if( bufpt==0 ){ + setStrAccumError(pAccum, STRACCUM_NOMEM); + return; + } + }else{ + bufpt = buf; + } + j = 0; + if( needQuote ) bufpt[j++] = q; + k = i; + for(i=0; i=0 && precisionn ){ + sqlite3StrAccumAppend(pAccum, (const char*)pToken->z, pToken->n); + } + length = width = 0; + break; + } + case etSRCLIST: { + SrcList *pSrc = va_arg(ap, SrcList*); + int k = va_arg(ap, int); + struct SrcList_item *pItem = &pSrc->a[k]; + assert( bArgList==0 ); + assert( k>=0 && knSrc ); + if( pItem->zDatabase ){ + sqlite3StrAccumAppendAll(pAccum, pItem->zDatabase); + sqlite3StrAccumAppend(pAccum, ".", 1); + } + sqlite3StrAccumAppendAll(pAccum, pItem->zName); + length = width = 0; + break; + } + default: { + assert( xtype==etINVALID ); + return; + } + }/* End switch over the format type */ + /* + ** The text of the conversion is pointed to by "bufpt" and is + ** "length" characters long. The field width is "width". Do + ** the output. + */ + width -= length; + if( width>0 && !flag_leftjustify ) sqlite3AppendChar(pAccum, width, ' '); + sqlite3StrAccumAppend(pAccum, bufpt, length); + if( width>0 && flag_leftjustify ) sqlite3AppendChar(pAccum, width, ' '); + + if( zExtra ){ + sqlite3DbFree(pAccum->db, zExtra); + zExtra = 0; + } + }/* End for loop over the format string */ +} /* End of function */ + +/* +** Enlarge the memory allocation on a StrAccum object so that it is +** able to accept at least N more bytes of text. +** +** Return the number of bytes of text that StrAccum is able to accept +** after the attempted enlargement. The value returned might be zero. +*/ +static int sqlite3StrAccumEnlarge(StrAccum *p, int N){ + char *zNew; + assert( p->nChar+(i64)N >= p->nAlloc ); /* Only called if really needed */ + if( p->accError ){ + testcase(p->accError==STRACCUM_TOOBIG); + testcase(p->accError==STRACCUM_NOMEM); + return 0; + } + if( p->mxAlloc==0 ){ + N = p->nAlloc - p->nChar - 1; + setStrAccumError(p, STRACCUM_TOOBIG); + return N; + }else{ + char *zOld = isMalloced(p) ? p->zText : 0; + i64 szNew = p->nChar; + assert( (p->zText==0 || p->zText==p->zBase)==!isMalloced(p) ); + szNew += N + 1; + if( szNew+p->nChar<=p->mxAlloc ){ + /* Force exponential buffer size growth as long as it does not overflow, + ** to avoid having to call this routine too often */ + szNew += p->nChar; + } + if( szNew > p->mxAlloc ){ + sqlite3StrAccumReset(p); + setStrAccumError(p, STRACCUM_TOOBIG); + return 0; + }else{ + p->nAlloc = (int)szNew; + } + if( p->db ){ + zNew = sqlite3DbRealloc(p->db, zOld, p->nAlloc); + }else{ + zNew = sqlite3_realloc64(zOld, p->nAlloc); + } + if( zNew ){ + assert( p->zText!=0 || p->nChar==0 ); + if( !isMalloced(p) && p->nChar>0 ) memcpy(zNew, p->zText, p->nChar); + p->zText = zNew; + p->nAlloc = sqlite3DbMallocSize(p->db, zNew); + p->printfFlags |= SQLITE_PRINTF_MALLOCED; + }else{ + sqlite3StrAccumReset(p); + setStrAccumError(p, STRACCUM_NOMEM); + return 0; + } + } + return N; +} + +/* +** Append N copies of character c to the given string buffer. +*/ +SQLITE_PRIVATE void sqlite3AppendChar(StrAccum *p, int N, char c){ + testcase( p->nChar + (i64)N > 0x7fffffff ); + if( p->nChar+(i64)N >= p->nAlloc && (N = sqlite3StrAccumEnlarge(p, N))<=0 ){ + return; + } + assert( (p->zText==p->zBase)==!isMalloced(p) ); + while( (N--)>0 ) p->zText[p->nChar++] = c; +} + +/* +** The StrAccum "p" is not large enough to accept N new bytes of z[]. +** So enlarge if first, then do the append. +** +** This is a helper routine to sqlite3StrAccumAppend() that does special-case +** work (enlarging the buffer) using tail recursion, so that the +** sqlite3StrAccumAppend() routine can use fast calling semantics. +*/ +static void SQLITE_NOINLINE enlargeAndAppend(StrAccum *p, const char *z, int N){ + N = sqlite3StrAccumEnlarge(p, N); + if( N>0 ){ + memcpy(&p->zText[p->nChar], z, N); + p->nChar += N; + } + assert( (p->zText==0 || p->zText==p->zBase)==!isMalloced(p) ); +} + +/* +** Append N bytes of text from z to the StrAccum object. Increase the +** size of the memory allocation for StrAccum if necessary. +*/ +SQLITE_PRIVATE void sqlite3StrAccumAppend(StrAccum *p, const char *z, int N){ + assert( z!=0 || N==0 ); + assert( p->zText!=0 || p->nChar==0 || p->accError ); + assert( N>=0 ); + assert( p->accError==0 || p->nAlloc==0 ); + if( p->nChar+N >= p->nAlloc ){ + enlargeAndAppend(p,z,N); + }else{ + assert( p->zText ); + p->nChar += N; + memcpy(&p->zText[p->nChar-N], z, N); + } +} + +/* +** Append the complete text of zero-terminated string z[] to the p string. +*/ +SQLITE_PRIVATE void sqlite3StrAccumAppendAll(StrAccum *p, const char *z){ + sqlite3StrAccumAppend(p, z, sqlite3Strlen30(z)); +} + + +/* +** Finish off a string by making sure it is zero-terminated. +** Return a pointer to the resulting string. Return a NULL +** pointer if any kind of error was encountered. +*/ +SQLITE_PRIVATE char *sqlite3StrAccumFinish(StrAccum *p){ + if( p->zText ){ + assert( (p->zText==p->zBase)==!isMalloced(p) ); + p->zText[p->nChar] = 0; + if( p->mxAlloc>0 && !isMalloced(p) ){ + p->zText = sqlite3DbMallocRaw(p->db, p->nChar+1 ); + if( p->zText ){ + memcpy(p->zText, p->zBase, p->nChar+1); + p->printfFlags |= SQLITE_PRINTF_MALLOCED; + }else{ + setStrAccumError(p, STRACCUM_NOMEM); + } + } + } + return p->zText; +} + +/* +** Reset an StrAccum string. Reclaim all malloced memory. +*/ +SQLITE_PRIVATE void sqlite3StrAccumReset(StrAccum *p){ + assert( (p->zText==0 || p->zText==p->zBase)==!isMalloced(p) ); + if( isMalloced(p) ){ + sqlite3DbFree(p->db, p->zText); + p->printfFlags &= ~SQLITE_PRINTF_MALLOCED; + } + p->zText = 0; +} + +/* +** Initialize a string accumulator. +** +** p: The accumulator to be initialized. +** db: Pointer to a database connection. May be NULL. Lookaside +** memory is used if not NULL. db->mallocFailed is set appropriately +** when not NULL. +** zBase: An initial buffer. May be NULL in which case the initial buffer +** is malloced. +** n: Size of zBase in bytes. If total space requirements never exceed +** n then no memory allocations ever occur. +** mx: Maximum number of bytes to accumulate. If mx==0 then no memory +** allocations will ever occur. +*/ +SQLITE_PRIVATE void sqlite3StrAccumInit(StrAccum *p, sqlite3 *db, char *zBase, int n, int mx){ + p->zText = p->zBase = zBase; + p->db = db; + p->nChar = 0; + p->nAlloc = n; + p->mxAlloc = mx; + p->accError = 0; + p->printfFlags = 0; +} + +/* +** Print into memory obtained from sqliteMalloc(). Use the internal +** %-conversion extensions. +*/ +SQLITE_PRIVATE char *sqlite3VMPrintf(sqlite3 *db, const char *zFormat, va_list ap){ + char *z; + char zBase[SQLITE_PRINT_BUF_SIZE]; + StrAccum acc; + assert( db!=0 ); + sqlite3StrAccumInit(&acc, db, zBase, sizeof(zBase), + db->aLimit[SQLITE_LIMIT_LENGTH]); + acc.printfFlags = SQLITE_PRINTF_INTERNAL; + sqlite3VXPrintf(&acc, zFormat, ap); + z = sqlite3StrAccumFinish(&acc); + if( acc.accError==STRACCUM_NOMEM ){ + sqlite3OomFault(db); + } + return z; +} + +/* +** Print into memory obtained from sqliteMalloc(). Use the internal +** %-conversion extensions. +*/ +SQLITE_PRIVATE char *sqlite3MPrintf(sqlite3 *db, const char *zFormat, ...){ + va_list ap; + char *z; + va_start(ap, zFormat); + z = sqlite3VMPrintf(db, zFormat, ap); + va_end(ap); + return z; +} + +/* +** Print into memory obtained from sqlite3_malloc(). Omit the internal +** %-conversion extensions. +*/ +SQLITE_API char *sqlite3_vmprintf(const char *zFormat, va_list ap){ + char *z; + char zBase[SQLITE_PRINT_BUF_SIZE]; + StrAccum acc; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( zFormat==0 ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif +#ifndef SQLITE_OMIT_AUTOINIT + if( sqlite3_initialize() ) return 0; +#endif + sqlite3StrAccumInit(&acc, 0, zBase, sizeof(zBase), SQLITE_MAX_LENGTH); + sqlite3VXPrintf(&acc, zFormat, ap); + z = sqlite3StrAccumFinish(&acc); + return z; +} + +/* +** Print into memory obtained from sqlite3_malloc()(). Omit the internal +** %-conversion extensions. +*/ +SQLITE_API char *sqlite3_mprintf(const char *zFormat, ...){ + va_list ap; + char *z; +#ifndef SQLITE_OMIT_AUTOINIT + if( sqlite3_initialize() ) return 0; +#endif + va_start(ap, zFormat); + z = sqlite3_vmprintf(zFormat, ap); + va_end(ap); + return z; +} + +/* +** sqlite3_snprintf() works like snprintf() except that it ignores the +** current locale settings. This is important for SQLite because we +** are not able to use a "," as the decimal point in place of "." as +** specified by some locales. +** +** Oops: The first two arguments of sqlite3_snprintf() are backwards +** from the snprintf() standard. Unfortunately, it is too late to change +** this without breaking compatibility, so we just have to live with the +** mistake. +** +** sqlite3_vsnprintf() is the varargs version. +*/ +SQLITE_API char *sqlite3_vsnprintf(int n, char *zBuf, const char *zFormat, va_list ap){ + StrAccum acc; + if( n<=0 ) return zBuf; +#ifdef SQLITE_ENABLE_API_ARMOR + if( zBuf==0 || zFormat==0 ) { + (void)SQLITE_MISUSE_BKPT; + if( zBuf ) zBuf[0] = 0; + return zBuf; + } +#endif + sqlite3StrAccumInit(&acc, 0, zBuf, n, 0); + sqlite3VXPrintf(&acc, zFormat, ap); + return sqlite3StrAccumFinish(&acc); +} +SQLITE_API char *sqlite3_snprintf(int n, char *zBuf, const char *zFormat, ...){ + char *z; + va_list ap; + va_start(ap,zFormat); + z = sqlite3_vsnprintf(n, zBuf, zFormat, ap); + va_end(ap); + return z; +} + +/* +** This is the routine that actually formats the sqlite3_log() message. +** We house it in a separate routine from sqlite3_log() to avoid using +** stack space on small-stack systems when logging is disabled. +** +** sqlite3_log() must render into a static buffer. It cannot dynamically +** allocate memory because it might be called while the memory allocator +** mutex is held. +** +** sqlite3VXPrintf() might ask for *temporary* memory allocations for +** certain format characters (%q) or for very large precisions or widths. +** Care must be taken that any sqlite3_log() calls that occur while the +** memory mutex is held do not use these mechanisms. +*/ +static void renderLogMsg(int iErrCode, const char *zFormat, va_list ap){ + StrAccum acc; /* String accumulator */ + char zMsg[SQLITE_PRINT_BUF_SIZE*3]; /* Complete log message */ + + sqlite3StrAccumInit(&acc, 0, zMsg, sizeof(zMsg), 0); + sqlite3VXPrintf(&acc, zFormat, ap); + sqlite3GlobalConfig.xLog(sqlite3GlobalConfig.pLogArg, iErrCode, + sqlite3StrAccumFinish(&acc)); +} + +/* +** Format and write a message to the log if logging is enabled. +*/ +SQLITE_API void sqlite3_log(int iErrCode, const char *zFormat, ...){ + va_list ap; /* Vararg list */ + if( sqlite3GlobalConfig.xLog ){ + va_start(ap, zFormat); + renderLogMsg(iErrCode, zFormat, ap); + va_end(ap); + } +} + +#if defined(SQLITE_DEBUG) || defined(SQLITE_HAVE_OS_TRACE) +/* +** A version of printf() that understands %lld. Used for debugging. +** The printf() built into some versions of windows does not understand %lld +** and segfaults if you give it a long long int. +*/ +SQLITE_PRIVATE void sqlite3DebugPrintf(const char *zFormat, ...){ + va_list ap; + StrAccum acc; + char zBuf[500]; + sqlite3StrAccumInit(&acc, 0, zBuf, sizeof(zBuf), 0); + va_start(ap,zFormat); + sqlite3VXPrintf(&acc, zFormat, ap); + va_end(ap); + sqlite3StrAccumFinish(&acc); + fprintf(stdout,"%s", zBuf); + fflush(stdout); +} +#endif + + +/* +** variable-argument wrapper around sqlite3VXPrintf(). The bFlags argument +** can contain the bit SQLITE_PRINTF_INTERNAL enable internal formats. +*/ +SQLITE_PRIVATE void sqlite3XPrintf(StrAccum *p, const char *zFormat, ...){ + va_list ap; + va_start(ap,zFormat); + sqlite3VXPrintf(p, zFormat, ap); + va_end(ap); +} + +/************** End of printf.c **********************************************/ +/************** Begin file treeview.c ****************************************/ +/* +** 2015-06-08 +** +** 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 C code to implement the TreeView debugging routines. +** These routines print a parse tree to standard output for debugging and +** analysis. +** +** The interfaces in this file is only available when compiling +** with SQLITE_DEBUG. +*/ +/* #include "sqliteInt.h" */ +#ifdef SQLITE_DEBUG + +/* +** Add a new subitem to the tree. The moreToFollow flag indicates that this +** is not the last item in the tree. +*/ +static TreeView *sqlite3TreeViewPush(TreeView *p, u8 moreToFollow){ + if( p==0 ){ + p = sqlite3_malloc64( sizeof(*p) ); + if( p==0 ) return 0; + memset(p, 0, sizeof(*p)); + }else{ + p->iLevel++; + } + assert( moreToFollow==0 || moreToFollow==1 ); + if( p->iLevelbLine) ) p->bLine[p->iLevel] = moreToFollow; + return p; +} + +/* +** Finished with one layer of the tree +*/ +static void sqlite3TreeViewPop(TreeView *p){ + if( p==0 ) return; + p->iLevel--; + if( p->iLevel<0 ) sqlite3_free(p); +} + +/* +** Generate a single line of output for the tree, with a prefix that contains +** all the appropriate tree lines +*/ +static void sqlite3TreeViewLine(TreeView *p, const char *zFormat, ...){ + va_list ap; + int i; + StrAccum acc; + char zBuf[500]; + sqlite3StrAccumInit(&acc, 0, zBuf, sizeof(zBuf), 0); + if( p ){ + for(i=0; iiLevel && ibLine)-1; i++){ + sqlite3StrAccumAppend(&acc, p->bLine[i] ? "| " : " ", 4); + } + sqlite3StrAccumAppend(&acc, p->bLine[i] ? "|-- " : "'-- ", 4); + } + va_start(ap, zFormat); + sqlite3VXPrintf(&acc, zFormat, ap); + va_end(ap); + if( zBuf[acc.nChar-1]!='\n' ) sqlite3StrAccumAppend(&acc, "\n", 1); + sqlite3StrAccumFinish(&acc); + fprintf(stdout,"%s", zBuf); + fflush(stdout); +} + +/* +** Shorthand for starting a new tree item that consists of a single label +*/ +static void sqlite3TreeViewItem(TreeView *p, const char *zLabel,u8 moreFollows){ + p = sqlite3TreeViewPush(p, moreFollows); + sqlite3TreeViewLine(p, "%s", zLabel); +} + +/* +** Generate a human-readable description of a WITH clause. +*/ +SQLITE_PRIVATE void sqlite3TreeViewWith(TreeView *pView, const With *pWith, u8 moreToFollow){ + int i; + if( pWith==0 ) return; + if( pWith->nCte==0 ) return; + if( pWith->pOuter ){ + sqlite3TreeViewLine(pView, "WITH (0x%p, pOuter=0x%p)",pWith,pWith->pOuter); + }else{ + sqlite3TreeViewLine(pView, "WITH (0x%p)", pWith); + } + if( pWith->nCte>0 ){ + pView = sqlite3TreeViewPush(pView, 1); + for(i=0; inCte; i++){ + StrAccum x; + char zLine[1000]; + const struct Cte *pCte = &pWith->a[i]; + sqlite3StrAccumInit(&x, 0, zLine, sizeof(zLine), 0); + sqlite3XPrintf(&x, "%s", pCte->zName); + if( pCte->pCols && pCte->pCols->nExpr>0 ){ + char cSep = '('; + int j; + for(j=0; jpCols->nExpr; j++){ + sqlite3XPrintf(&x, "%c%s", cSep, pCte->pCols->a[j].zName); + cSep = ','; + } + sqlite3XPrintf(&x, ")"); + } + sqlite3XPrintf(&x, " AS"); + sqlite3StrAccumFinish(&x); + sqlite3TreeViewItem(pView, zLine, inCte-1); + sqlite3TreeViewSelect(pView, pCte->pSelect, 0); + sqlite3TreeViewPop(pView); + } + sqlite3TreeViewPop(pView); + } +} + + +/* +** Generate a human-readable description of a Select object. +*/ +SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 moreToFollow){ + int n = 0; + int cnt = 0; + pView = sqlite3TreeViewPush(pView, moreToFollow); + if( p->pWith ){ + sqlite3TreeViewWith(pView, p->pWith, 1); + cnt = 1; + sqlite3TreeViewPush(pView, 1); + } + do{ + sqlite3TreeViewLine(pView, "SELECT%s%s (0x%p) selFlags=0x%x nSelectRow=%d", + ((p->selFlags & SF_Distinct) ? " DISTINCT" : ""), + ((p->selFlags & SF_Aggregate) ? " agg_flag" : ""), p, p->selFlags, + (int)p->nSelectRow + ); + if( cnt++ ) sqlite3TreeViewPop(pView); + if( p->pPrior ){ + n = 1000; + }else{ + n = 0; + if( p->pSrc && p->pSrc->nSrc ) n++; + if( p->pWhere ) n++; + if( p->pGroupBy ) n++; + if( p->pHaving ) n++; + if( p->pOrderBy ) n++; + if( p->pLimit ) n++; + if( p->pOffset ) n++; + } + sqlite3TreeViewExprList(pView, p->pEList, (n--)>0, "result-set"); + if( p->pSrc && p->pSrc->nSrc ){ + int i; + pView = sqlite3TreeViewPush(pView, (n--)>0); + sqlite3TreeViewLine(pView, "FROM"); + for(i=0; ipSrc->nSrc; i++){ + struct SrcList_item *pItem = &p->pSrc->a[i]; + StrAccum x; + char zLine[100]; + sqlite3StrAccumInit(&x, 0, zLine, sizeof(zLine), 0); + sqlite3XPrintf(&x, "{%d,*}", pItem->iCursor); + if( pItem->zDatabase ){ + sqlite3XPrintf(&x, " %s.%s", pItem->zDatabase, pItem->zName); + }else if( pItem->zName ){ + sqlite3XPrintf(&x, " %s", pItem->zName); + } + if( pItem->pTab ){ + sqlite3XPrintf(&x, " tabname=%Q", pItem->pTab->zName); + } + if( pItem->zAlias ){ + sqlite3XPrintf(&x, " (AS %s)", pItem->zAlias); + } + if( pItem->fg.jointype & JT_LEFT ){ + sqlite3XPrintf(&x, " LEFT-JOIN"); + } + sqlite3StrAccumFinish(&x); + sqlite3TreeViewItem(pView, zLine, ipSrc->nSrc-1); + if( pItem->pSelect ){ + sqlite3TreeViewSelect(pView, pItem->pSelect, 0); + } + if( pItem->fg.isTabFunc ){ + sqlite3TreeViewExprList(pView, pItem->u1.pFuncArg, 0, "func-args:"); + } + sqlite3TreeViewPop(pView); + } + sqlite3TreeViewPop(pView); + } + if( p->pWhere ){ + sqlite3TreeViewItem(pView, "WHERE", (n--)>0); + sqlite3TreeViewExpr(pView, p->pWhere, 0); + sqlite3TreeViewPop(pView); + } + if( p->pGroupBy ){ + sqlite3TreeViewExprList(pView, p->pGroupBy, (n--)>0, "GROUPBY"); + } + if( p->pHaving ){ + sqlite3TreeViewItem(pView, "HAVING", (n--)>0); + sqlite3TreeViewExpr(pView, p->pHaving, 0); + sqlite3TreeViewPop(pView); + } + if( p->pOrderBy ){ + sqlite3TreeViewExprList(pView, p->pOrderBy, (n--)>0, "ORDERBY"); + } + if( p->pLimit ){ + sqlite3TreeViewItem(pView, "LIMIT", (n--)>0); + sqlite3TreeViewExpr(pView, p->pLimit, 0); + sqlite3TreeViewPop(pView); + } + if( p->pOffset ){ + sqlite3TreeViewItem(pView, "OFFSET", (n--)>0); + sqlite3TreeViewExpr(pView, p->pOffset, 0); + sqlite3TreeViewPop(pView); + } + if( p->pPrior ){ + const char *zOp = "UNION"; + switch( p->op ){ + case TK_ALL: zOp = "UNION ALL"; break; + case TK_INTERSECT: zOp = "INTERSECT"; break; + case TK_EXCEPT: zOp = "EXCEPT"; break; + } + sqlite3TreeViewItem(pView, zOp, 1); + } + p = p->pPrior; + }while( p!=0 ); + sqlite3TreeViewPop(pView); +} + +/* +** Generate a human-readable explanation of an expression tree. +*/ +SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ + const char *zBinOp = 0; /* Binary operator */ + const char *zUniOp = 0; /* Unary operator */ + char zFlgs[30]; + pView = sqlite3TreeViewPush(pView, moreToFollow); + if( pExpr==0 ){ + sqlite3TreeViewLine(pView, "nil"); + sqlite3TreeViewPop(pView); + return; + } + if( pExpr->flags ){ + sqlite3_snprintf(sizeof(zFlgs),zFlgs," flags=0x%x",pExpr->flags); + }else{ + zFlgs[0] = 0; + } + switch( pExpr->op ){ + case TK_AGG_COLUMN: { + sqlite3TreeViewLine(pView, "AGG{%d:%d}%s", + pExpr->iTable, pExpr->iColumn, zFlgs); + break; + } + case TK_COLUMN: { + if( pExpr->iTable<0 ){ + /* This only happens when coding check constraints */ + sqlite3TreeViewLine(pView, "COLUMN(%d)%s", pExpr->iColumn, zFlgs); + }else{ + sqlite3TreeViewLine(pView, "{%d:%d}%s", + pExpr->iTable, pExpr->iColumn, zFlgs); + } + break; + } + case TK_INTEGER: { + if( pExpr->flags & EP_IntValue ){ + sqlite3TreeViewLine(pView, "%d", pExpr->u.iValue); + }else{ + sqlite3TreeViewLine(pView, "%s", pExpr->u.zToken); + } + break; + } +#ifndef SQLITE_OMIT_FLOATING_POINT + case TK_FLOAT: { + sqlite3TreeViewLine(pView,"%s", pExpr->u.zToken); + break; + } +#endif + case TK_STRING: { + sqlite3TreeViewLine(pView,"%Q", pExpr->u.zToken); + break; + } + case TK_NULL: { + sqlite3TreeViewLine(pView,"NULL"); + break; + } +#ifndef SQLITE_OMIT_BLOB_LITERAL + case TK_BLOB: { + sqlite3TreeViewLine(pView,"%s", pExpr->u.zToken); + break; + } +#endif + case TK_VARIABLE: { + sqlite3TreeViewLine(pView,"VARIABLE(%s,%d)", + pExpr->u.zToken, pExpr->iColumn); + break; + } + case TK_REGISTER: { + sqlite3TreeViewLine(pView,"REGISTER(%d)", pExpr->iTable); + break; + } + case TK_ID: { + sqlite3TreeViewLine(pView,"ID \"%w\"", pExpr->u.zToken); + break; + } +#ifndef SQLITE_OMIT_CAST + case TK_CAST: { + /* Expressions of the form: CAST(pLeft AS token) */ + sqlite3TreeViewLine(pView,"CAST %Q", pExpr->u.zToken); + sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); + break; + } +#endif /* SQLITE_OMIT_CAST */ + case TK_LT: zBinOp = "LT"; break; + case TK_LE: zBinOp = "LE"; break; + case TK_GT: zBinOp = "GT"; break; + case TK_GE: zBinOp = "GE"; break; + case TK_NE: zBinOp = "NE"; break; + case TK_EQ: zBinOp = "EQ"; break; + case TK_IS: zBinOp = "IS"; break; + case TK_ISNOT: zBinOp = "ISNOT"; break; + case TK_AND: zBinOp = "AND"; break; + case TK_OR: zBinOp = "OR"; break; + case TK_PLUS: zBinOp = "ADD"; break; + case TK_STAR: zBinOp = "MUL"; break; + case TK_MINUS: zBinOp = "SUB"; break; + case TK_REM: zBinOp = "REM"; break; + case TK_BITAND: zBinOp = "BITAND"; break; + case TK_BITOR: zBinOp = "BITOR"; break; + case TK_SLASH: zBinOp = "DIV"; break; + case TK_LSHIFT: zBinOp = "LSHIFT"; break; + case TK_RSHIFT: zBinOp = "RSHIFT"; break; + case TK_CONCAT: zBinOp = "CONCAT"; break; + case TK_DOT: zBinOp = "DOT"; break; + + case TK_UMINUS: zUniOp = "UMINUS"; break; + case TK_UPLUS: zUniOp = "UPLUS"; break; + case TK_BITNOT: zUniOp = "BITNOT"; break; + case TK_NOT: zUniOp = "NOT"; break; + case TK_ISNULL: zUniOp = "ISNULL"; break; + case TK_NOTNULL: zUniOp = "NOTNULL"; break; + + case TK_SPAN: { + sqlite3TreeViewLine(pView, "SPAN %Q", pExpr->u.zToken); + sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); + break; + } + + case TK_COLLATE: { + sqlite3TreeViewLine(pView, "COLLATE %Q", pExpr->u.zToken); + sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); + break; + } + + case TK_AGG_FUNCTION: + case TK_FUNCTION: { + ExprList *pFarg; /* List of function arguments */ + if( ExprHasProperty(pExpr, EP_TokenOnly) ){ + pFarg = 0; + }else{ + pFarg = pExpr->x.pList; + } + if( pExpr->op==TK_AGG_FUNCTION ){ + sqlite3TreeViewLine(pView, "AGG_FUNCTION%d %Q", + pExpr->op2, pExpr->u.zToken); + }else{ + sqlite3TreeViewLine(pView, "FUNCTION %Q", pExpr->u.zToken); + } + if( pFarg ){ + sqlite3TreeViewExprList(pView, pFarg, 0, 0); + } + break; + } +#ifndef SQLITE_OMIT_SUBQUERY + case TK_EXISTS: { + sqlite3TreeViewLine(pView, "EXISTS-expr"); + sqlite3TreeViewSelect(pView, pExpr->x.pSelect, 0); + break; + } + case TK_SELECT: { + sqlite3TreeViewLine(pView, "SELECT-expr"); + sqlite3TreeViewSelect(pView, pExpr->x.pSelect, 0); + break; + } + case TK_IN: { + sqlite3TreeViewLine(pView, "IN"); + sqlite3TreeViewExpr(pView, pExpr->pLeft, 1); + if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + sqlite3TreeViewSelect(pView, pExpr->x.pSelect, 0); + }else{ + sqlite3TreeViewExprList(pView, pExpr->x.pList, 0, 0); + } + break; + } +#endif /* SQLITE_OMIT_SUBQUERY */ + + /* + ** x BETWEEN y AND z + ** + ** This is equivalent to + ** + ** x>=y AND x<=z + ** + ** X is stored in pExpr->pLeft. + ** Y is stored in pExpr->pList->a[0].pExpr. + ** Z is stored in pExpr->pList->a[1].pExpr. + */ + case TK_BETWEEN: { + Expr *pX = pExpr->pLeft; + Expr *pY = pExpr->x.pList->a[0].pExpr; + Expr *pZ = pExpr->x.pList->a[1].pExpr; + sqlite3TreeViewLine(pView, "BETWEEN"); + sqlite3TreeViewExpr(pView, pX, 1); + sqlite3TreeViewExpr(pView, pY, 1); + sqlite3TreeViewExpr(pView, pZ, 0); + break; + } + case TK_TRIGGER: { + /* If the opcode is TK_TRIGGER, then the expression is a reference + ** to a column in the new.* or old.* pseudo-tables available to + ** trigger programs. In this case Expr.iTable is set to 1 for the + ** new.* pseudo-table, or 0 for the old.* pseudo-table. Expr.iColumn + ** is set to the column of the pseudo-table to read, or to -1 to + ** read the rowid field. + */ + sqlite3TreeViewLine(pView, "%s(%d)", + pExpr->iTable ? "NEW" : "OLD", pExpr->iColumn); + break; + } + case TK_CASE: { + sqlite3TreeViewLine(pView, "CASE"); + sqlite3TreeViewExpr(pView, pExpr->pLeft, 1); + sqlite3TreeViewExprList(pView, pExpr->x.pList, 0, 0); + break; + } +#ifndef SQLITE_OMIT_TRIGGER + case TK_RAISE: { + const char *zType = "unk"; + switch( pExpr->affinity ){ + case OE_Rollback: zType = "rollback"; break; + case OE_Abort: zType = "abort"; break; + case OE_Fail: zType = "fail"; break; + case OE_Ignore: zType = "ignore"; break; + } + sqlite3TreeViewLine(pView, "RAISE %s(%Q)", zType, pExpr->u.zToken); + break; + } +#endif + case TK_MATCH: { + sqlite3TreeViewLine(pView, "MATCH {%d:%d}%s", + pExpr->iTable, pExpr->iColumn, zFlgs); + sqlite3TreeViewExpr(pView, pExpr->pRight, 0); + break; + } + case TK_VECTOR: { + sqlite3TreeViewBareExprList(pView, pExpr->x.pList, "VECTOR"); + break; + } + case TK_SELECT_COLUMN: { + sqlite3TreeViewLine(pView, "SELECT-COLUMN %d", pExpr->iColumn); + sqlite3TreeViewSelect(pView, pExpr->pLeft->x.pSelect, 0); + break; + } + default: { + sqlite3TreeViewLine(pView, "op=%d", pExpr->op); + break; + } + } + if( zBinOp ){ + sqlite3TreeViewLine(pView, "%s%s", zBinOp, zFlgs); + sqlite3TreeViewExpr(pView, pExpr->pLeft, 1); + sqlite3TreeViewExpr(pView, pExpr->pRight, 0); + }else if( zUniOp ){ + sqlite3TreeViewLine(pView, "%s%s", zUniOp, zFlgs); + sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); + } + sqlite3TreeViewPop(pView); +} + + +/* +** Generate a human-readable explanation of an expression list. +*/ +SQLITE_PRIVATE void sqlite3TreeViewBareExprList( + TreeView *pView, + const ExprList *pList, + const char *zLabel +){ + if( zLabel==0 || zLabel[0]==0 ) zLabel = "LIST"; + if( pList==0 ){ + sqlite3TreeViewLine(pView, "%s (empty)", zLabel); + }else{ + int i; + sqlite3TreeViewLine(pView, "%s", zLabel); + for(i=0; inExpr; i++){ + int j = pList->a[i].u.x.iOrderByCol; + if( j ){ + sqlite3TreeViewPush(pView, 0); + sqlite3TreeViewLine(pView, "iOrderByCol=%d", j); + } + sqlite3TreeViewExpr(pView, pList->a[i].pExpr, inExpr-1); + if( j ) sqlite3TreeViewPop(pView); + } + } +} +SQLITE_PRIVATE void sqlite3TreeViewExprList( + TreeView *pView, + const ExprList *pList, + u8 moreToFollow, + const char *zLabel +){ + pView = sqlite3TreeViewPush(pView, moreToFollow); + sqlite3TreeViewBareExprList(pView, pList, zLabel); + sqlite3TreeViewPop(pView); +} + +#endif /* SQLITE_DEBUG */ + +/************** End of treeview.c ********************************************/ +/************** Begin file random.c ******************************************/ +/* +** 2001 September 15 +** +** 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 to implement a pseudo-random number +** generator (PRNG) for SQLite. +** +** Random numbers are used by some of the database backends in order +** to generate random integer keys for tables or random filenames. +*/ +/* #include "sqliteInt.h" */ + + +/* All threads share a single random number generator. +** This structure is the current state of the generator. +*/ +static SQLITE_WSD struct sqlite3PrngType { + unsigned char isInit; /* True if initialized */ + unsigned char i, j; /* State variables */ + unsigned char s[256]; /* State variables */ +} sqlite3Prng; + +/* +** Return N random bytes. +*/ +SQLITE_API void sqlite3_randomness(int N, void *pBuf){ + unsigned char t; + unsigned char *zBuf = pBuf; + + /* The "wsdPrng" macro will resolve to the pseudo-random number generator + ** state vector. If writable static data is unsupported on the target, + ** we have to locate the state vector at run-time. In the more common + ** case where writable static data is supported, wsdPrng can refer directly + ** to the "sqlite3Prng" state vector declared above. + */ +#ifdef SQLITE_OMIT_WSD + struct sqlite3PrngType *p = &GLOBAL(struct sqlite3PrngType, sqlite3Prng); +# define wsdPrng p[0] +#else +# define wsdPrng sqlite3Prng +#endif + +#if SQLITE_THREADSAFE + sqlite3_mutex *mutex; +#endif + +#ifndef SQLITE_OMIT_AUTOINIT + if( sqlite3_initialize() ) return; +#endif + +#if SQLITE_THREADSAFE + mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_PRNG); +#endif + + sqlite3_mutex_enter(mutex); + if( N<=0 || pBuf==0 ){ + wsdPrng.isInit = 0; + sqlite3_mutex_leave(mutex); + return; + } + + /* Initialize the state of the random number generator once, + ** the first time this routine is called. The seed value does + ** not need to contain a lot of randomness since we are not + ** trying to do secure encryption or anything like that... + ** + ** Nothing in this file or anywhere else in SQLite does any kind of + ** encryption. The RC4 algorithm is being used as a PRNG (pseudo-random + ** number generator) not as an encryption device. + */ + if( !wsdPrng.isInit ){ + int i; + char k[256]; + wsdPrng.j = 0; + wsdPrng.i = 0; + sqlite3OsRandomness(sqlite3_vfs_find(0), 256, k); + for(i=0; i<256; i++){ + wsdPrng.s[i] = (u8)i; + } + for(i=0; i<256; i++){ + wsdPrng.j += wsdPrng.s[i] + k[i]; + t = wsdPrng.s[wsdPrng.j]; + wsdPrng.s[wsdPrng.j] = wsdPrng.s[i]; + wsdPrng.s[i] = t; + } + wsdPrng.isInit = 1; + } + + assert( N>0 ); + do{ + wsdPrng.i++; + t = wsdPrng.s[wsdPrng.i]; + wsdPrng.j += t; + wsdPrng.s[wsdPrng.i] = wsdPrng.s[wsdPrng.j]; + wsdPrng.s[wsdPrng.j] = t; + t += wsdPrng.s[wsdPrng.i]; + *(zBuf++) = wsdPrng.s[t]; + }while( --N ); + sqlite3_mutex_leave(mutex); +} + +#ifndef SQLITE_OMIT_BUILTIN_TEST +/* +** For testing purposes, we sometimes want to preserve the state of +** PRNG and restore the PRNG to its saved state at a later time, or +** to reset the PRNG to its initial state. These routines accomplish +** those tasks. +** +** The sqlite3_test_control() interface calls these routines to +** control the PRNG. +*/ +static SQLITE_WSD struct sqlite3PrngType sqlite3SavedPrng; +SQLITE_PRIVATE void sqlite3PrngSaveState(void){ + memcpy( + &GLOBAL(struct sqlite3PrngType, sqlite3SavedPrng), + &GLOBAL(struct sqlite3PrngType, sqlite3Prng), + sizeof(sqlite3Prng) + ); +} +SQLITE_PRIVATE void sqlite3PrngRestoreState(void){ + memcpy( + &GLOBAL(struct sqlite3PrngType, sqlite3Prng), + &GLOBAL(struct sqlite3PrngType, sqlite3SavedPrng), + sizeof(sqlite3Prng) + ); +} +#endif /* SQLITE_OMIT_BUILTIN_TEST */ + +/************** End of random.c **********************************************/ +/************** Begin file threads.c *****************************************/ +/* +** 2012 July 21 +** +** 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 presents a simple cross-platform threading interface for +** use internally by SQLite. +** +** A "thread" can be created using sqlite3ThreadCreate(). This thread +** runs independently of its creator until it is joined using +** sqlite3ThreadJoin(), at which point it terminates. +** +** Threads do not have to be real. It could be that the work of the +** "thread" is done by the main thread at either the sqlite3ThreadCreate() +** or sqlite3ThreadJoin() call. This is, in fact, what happens in +** single threaded systems. Nothing in SQLite requires multiple threads. +** This interface exists so that applications that want to take advantage +** of multiple cores can do so, while also allowing applications to stay +** single-threaded if desired. +*/ +/* #include "sqliteInt.h" */ +#if SQLITE_OS_WIN +/* # include "os_win.h" */ +#endif + +#if SQLITE_MAX_WORKER_THREADS>0 + +/********************************* Unix Pthreads ****************************/ +#if SQLITE_OS_UNIX && defined(SQLITE_MUTEX_PTHREADS) && SQLITE_THREADSAFE>0 + +#define SQLITE_THREADS_IMPLEMENTED 1 /* Prevent the single-thread code below */ +/* #include */ + +/* A running thread */ +struct SQLiteThread { + pthread_t tid; /* Thread ID */ + int done; /* Set to true when thread finishes */ + void *pOut; /* Result returned by the thread */ + void *(*xTask)(void*); /* The thread routine */ + void *pIn; /* Argument to the thread */ +}; + +/* Create a new thread */ +SQLITE_PRIVATE int sqlite3ThreadCreate( + SQLiteThread **ppThread, /* OUT: Write the thread object here */ + void *(*xTask)(void*), /* Routine to run in a separate thread */ + void *pIn /* Argument passed into xTask() */ +){ + SQLiteThread *p; + int rc; + + assert( ppThread!=0 ); + assert( xTask!=0 ); + /* This routine is never used in single-threaded mode */ + assert( sqlite3GlobalConfig.bCoreMutex!=0 ); + + *ppThread = 0; + p = sqlite3Malloc(sizeof(*p)); + if( p==0 ) return SQLITE_NOMEM_BKPT; + memset(p, 0, sizeof(*p)); + p->xTask = xTask; + p->pIn = pIn; + /* If the SQLITE_TESTCTRL_FAULT_INSTALL callback is registered to a + ** function that returns SQLITE_ERROR when passed the argument 200, that + ** forces worker threads to run sequentially and deterministically + ** for testing purposes. */ + if( sqlite3FaultSim(200) ){ + rc = 1; + }else{ + rc = pthread_create(&p->tid, 0, xTask, pIn); + } + if( rc ){ + p->done = 1; + p->pOut = xTask(pIn); + } + *ppThread = p; + return SQLITE_OK; +} + +/* Get the results of the thread */ +SQLITE_PRIVATE int sqlite3ThreadJoin(SQLiteThread *p, void **ppOut){ + int rc; + + assert( ppOut!=0 ); + if( NEVER(p==0) ) return SQLITE_NOMEM_BKPT; + if( p->done ){ + *ppOut = p->pOut; + rc = SQLITE_OK; + }else{ + rc = pthread_join(p->tid, ppOut) ? SQLITE_ERROR : SQLITE_OK; + } + sqlite3_free(p); + return rc; +} + +#endif /* SQLITE_OS_UNIX && defined(SQLITE_MUTEX_PTHREADS) */ +/******************************** End Unix Pthreads *************************/ + + +/********************************* Win32 Threads ****************************/ +#if SQLITE_OS_WIN_THREADS + +#define SQLITE_THREADS_IMPLEMENTED 1 /* Prevent the single-thread code below */ +#include + +/* A running thread */ +struct SQLiteThread { + void *tid; /* The thread handle */ + unsigned id; /* The thread identifier */ + void *(*xTask)(void*); /* The routine to run as a thread */ + void *pIn; /* Argument to xTask */ + void *pResult; /* Result of xTask */ +}; + +/* Thread procedure Win32 compatibility shim */ +static unsigned __stdcall sqlite3ThreadProc( + void *pArg /* IN: Pointer to the SQLiteThread structure */ +){ + SQLiteThread *p = (SQLiteThread *)pArg; + + assert( p!=0 ); +#if 0 + /* + ** This assert appears to trigger spuriously on certain + ** versions of Windows, possibly due to _beginthreadex() + ** and/or CreateThread() not fully setting their thread + ** ID parameter before starting the thread. + */ + assert( p->id==GetCurrentThreadId() ); +#endif + assert( p->xTask!=0 ); + p->pResult = p->xTask(p->pIn); + + _endthreadex(0); + return 0; /* NOT REACHED */ +} + +/* Create a new thread */ +SQLITE_PRIVATE int sqlite3ThreadCreate( + SQLiteThread **ppThread, /* OUT: Write the thread object here */ + void *(*xTask)(void*), /* Routine to run in a separate thread */ + void *pIn /* Argument passed into xTask() */ +){ + SQLiteThread *p; + + assert( ppThread!=0 ); + assert( xTask!=0 ); + *ppThread = 0; + p = sqlite3Malloc(sizeof(*p)); + if( p==0 ) return SQLITE_NOMEM_BKPT; + /* If the SQLITE_TESTCTRL_FAULT_INSTALL callback is registered to a + ** function that returns SQLITE_ERROR when passed the argument 200, that + ** forces worker threads to run sequentially and deterministically + ** (via the sqlite3FaultSim() term of the conditional) for testing + ** purposes. */ + if( sqlite3GlobalConfig.bCoreMutex==0 || sqlite3FaultSim(200) ){ + memset(p, 0, sizeof(*p)); + }else{ + p->xTask = xTask; + p->pIn = pIn; + p->tid = (void*)_beginthreadex(0, 0, sqlite3ThreadProc, p, 0, &p->id); + if( p->tid==0 ){ + memset(p, 0, sizeof(*p)); + } + } + if( p->xTask==0 ){ + p->id = GetCurrentThreadId(); + p->pResult = xTask(pIn); + } + *ppThread = p; + return SQLITE_OK; +} + +SQLITE_PRIVATE DWORD sqlite3Win32Wait(HANDLE hObject); /* os_win.c */ + +/* Get the results of the thread */ +SQLITE_PRIVATE int sqlite3ThreadJoin(SQLiteThread *p, void **ppOut){ + DWORD rc; + BOOL bRc; + + assert( ppOut!=0 ); + if( NEVER(p==0) ) return SQLITE_NOMEM_BKPT; + if( p->xTask==0 ){ + /* assert( p->id==GetCurrentThreadId() ); */ + rc = WAIT_OBJECT_0; + assert( p->tid==0 ); + }else{ + assert( p->id!=0 && p->id!=GetCurrentThreadId() ); + rc = sqlite3Win32Wait((HANDLE)p->tid); + assert( rc!=WAIT_IO_COMPLETION ); + bRc = CloseHandle((HANDLE)p->tid); + assert( bRc ); + } + if( rc==WAIT_OBJECT_0 ) *ppOut = p->pResult; + sqlite3_free(p); + return (rc==WAIT_OBJECT_0) ? SQLITE_OK : SQLITE_ERROR; +} + +#endif /* SQLITE_OS_WIN_THREADS */ +/******************************** End Win32 Threads *************************/ + + +/********************************* Single-Threaded **************************/ +#ifndef SQLITE_THREADS_IMPLEMENTED +/* +** This implementation does not actually create a new thread. It does the +** work of the thread in the main thread, when either the thread is created +** or when it is joined +*/ + +/* A running thread */ +struct SQLiteThread { + void *(*xTask)(void*); /* The routine to run as a thread */ + void *pIn; /* Argument to xTask */ + void *pResult; /* Result of xTask */ +}; + +/* Create a new thread */ +SQLITE_PRIVATE int sqlite3ThreadCreate( + SQLiteThread **ppThread, /* OUT: Write the thread object here */ + void *(*xTask)(void*), /* Routine to run in a separate thread */ + void *pIn /* Argument passed into xTask() */ +){ + SQLiteThread *p; + + assert( ppThread!=0 ); + assert( xTask!=0 ); + *ppThread = 0; + p = sqlite3Malloc(sizeof(*p)); + if( p==0 ) return SQLITE_NOMEM_BKPT; + if( (SQLITE_PTR_TO_INT(p)/17)&1 ){ + p->xTask = xTask; + p->pIn = pIn; + }else{ + p->xTask = 0; + p->pResult = xTask(pIn); + } + *ppThread = p; + return SQLITE_OK; +} + +/* Get the results of the thread */ +SQLITE_PRIVATE int sqlite3ThreadJoin(SQLiteThread *p, void **ppOut){ + + assert( ppOut!=0 ); + if( NEVER(p==0) ) return SQLITE_NOMEM_BKPT; + if( p->xTask ){ + *ppOut = p->xTask(p->pIn); + }else{ + *ppOut = p->pResult; + } + sqlite3_free(p); + +#if defined(SQLITE_TEST) + { + void *pTstAlloc = sqlite3Malloc(10); + if (!pTstAlloc) return SQLITE_NOMEM_BKPT; + sqlite3_free(pTstAlloc); + } +#endif + + return SQLITE_OK; +} + +#endif /* !defined(SQLITE_THREADS_IMPLEMENTED) */ +/****************************** End Single-Threaded *************************/ +#endif /* SQLITE_MAX_WORKER_THREADS>0 */ + +/************** End of threads.c *********************************************/ +/************** Begin file utf.c *********************************************/ +/* +** 2004 April 13 +** +** 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 routines used to translate between UTF-8, +** UTF-16, UTF-16BE, and UTF-16LE. +** +** Notes on UTF-8: +** +** Byte-0 Byte-1 Byte-2 Byte-3 Value +** 0xxxxxxx 00000000 00000000 0xxxxxxx +** 110yyyyy 10xxxxxx 00000000 00000yyy yyxxxxxx +** 1110zzzz 10yyyyyy 10xxxxxx 00000000 zzzzyyyy yyxxxxxx +** 11110uuu 10uuzzzz 10yyyyyy 10xxxxxx 000uuuuu zzzzyyyy yyxxxxxx +** +** +** Notes on UTF-16: (with wwww+1==uuuuu) +** +** Word-0 Word-1 Value +** 110110ww wwzzzzyy 110111yy yyxxxxxx 000uuuuu zzzzyyyy yyxxxxxx +** zzzzyyyy yyxxxxxx 00000000 zzzzyyyy yyxxxxxx +** +** +** BOM or Byte Order Mark: +** 0xff 0xfe little-endian utf-16 follows +** 0xfe 0xff big-endian utf-16 follows +** +*/ +/* #include "sqliteInt.h" */ +/* #include */ +/* #include "vdbeInt.h" */ + +#if !defined(SQLITE_AMALGAMATION) && SQLITE_BYTEORDER==0 +/* +** The following constant value is used by the SQLITE_BIGENDIAN and +** SQLITE_LITTLEENDIAN macros. +*/ +SQLITE_PRIVATE const int sqlite3one = 1; +#endif /* SQLITE_AMALGAMATION && SQLITE_BYTEORDER==0 */ + +/* +** This lookup table is used to help decode the first byte of +** a multi-byte UTF8 character. +*/ +static const unsigned char sqlite3Utf8Trans1[] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x00, 0x01, 0x02, 0x03, 0x00, 0x01, 0x00, 0x00, +}; + + +#define WRITE_UTF8(zOut, c) { \ + if( c<0x00080 ){ \ + *zOut++ = (u8)(c&0xFF); \ + } \ + else if( c<0x00800 ){ \ + *zOut++ = 0xC0 + (u8)((c>>6)&0x1F); \ + *zOut++ = 0x80 + (u8)(c & 0x3F); \ + } \ + else if( c<0x10000 ){ \ + *zOut++ = 0xE0 + (u8)((c>>12)&0x0F); \ + *zOut++ = 0x80 + (u8)((c>>6) & 0x3F); \ + *zOut++ = 0x80 + (u8)(c & 0x3F); \ + }else{ \ + *zOut++ = 0xF0 + (u8)((c>>18) & 0x07); \ + *zOut++ = 0x80 + (u8)((c>>12) & 0x3F); \ + *zOut++ = 0x80 + (u8)((c>>6) & 0x3F); \ + *zOut++ = 0x80 + (u8)(c & 0x3F); \ + } \ +} + +#define WRITE_UTF16LE(zOut, c) { \ + if( c<=0xFFFF ){ \ + *zOut++ = (u8)(c&0x00FF); \ + *zOut++ = (u8)((c>>8)&0x00FF); \ + }else{ \ + *zOut++ = (u8)(((c>>10)&0x003F) + (((c-0x10000)>>10)&0x00C0)); \ + *zOut++ = (u8)(0x00D8 + (((c-0x10000)>>18)&0x03)); \ + *zOut++ = (u8)(c&0x00FF); \ + *zOut++ = (u8)(0x00DC + ((c>>8)&0x03)); \ + } \ +} + +#define WRITE_UTF16BE(zOut, c) { \ + if( c<=0xFFFF ){ \ + *zOut++ = (u8)((c>>8)&0x00FF); \ + *zOut++ = (u8)(c&0x00FF); \ + }else{ \ + *zOut++ = (u8)(0x00D8 + (((c-0x10000)>>18)&0x03)); \ + *zOut++ = (u8)(((c>>10)&0x003F) + (((c-0x10000)>>10)&0x00C0)); \ + *zOut++ = (u8)(0x00DC + ((c>>8)&0x03)); \ + *zOut++ = (u8)(c&0x00FF); \ + } \ +} + +#define READ_UTF16LE(zIn, TERM, c){ \ + c = (*zIn++); \ + c += ((*zIn++)<<8); \ + 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, TERM, c){ \ + c = ((*zIn++)<<8); \ + c += (*zIn++); \ + if( c>=0xD800 && c<0xE000 && TERM ){ \ + int c2 = ((*zIn++)<<8); \ + c2 += (*zIn++); \ + c = (c2&0x03FF) + ((c&0x003F)<<10) + (((c&0x03C0)+0x0040)<<10); \ + } \ +} + +/* +** Translate a single UTF-8 character. Return the unicode value. +** +** During translation, assume that the byte that zTerm points +** is a 0x00. +** +** Write a pointer to the next unread byte back into *pzNext. +** +** Notes On Invalid UTF-8: +** +** * This routine never allows a 7-bit character (0x00 through 0x7f) to +** be encoded as a multi-byte character. Any multi-byte character that +** attempts to encode a value between 0x00 and 0x7f is rendered as 0xfffd. +** +** * This routine never allows a UTF16 surrogate value to be encoded. +** If a multi-byte character attempts to encode a value between +** 0xd800 and 0xe000 then it is rendered as 0xfffd. +** +** * Bytes in the range of 0x80 through 0xbf which occur as the first +** byte of a character are interpreted as single-byte characters +** and rendered as themselves even though they are technically +** invalid characters. +** +** * This routine accepts over-length UTF8 encodings +** for unicode values 0x80 and greater. It does not change over-length +** encodings to 0xfffd as some systems recommend. +*/ +#define READ_UTF8(zIn, zTerm, c) \ + c = *(zIn++); \ + if( c>=0xc0 ){ \ + c = sqlite3Utf8Trans1[c-0xc0]; \ + while( zIn!=zTerm && (*zIn & 0xc0)==0x80 ){ \ + c = (c<<6) + (0x3f & *(zIn++)); \ + } \ + if( c<0x80 \ + || (c&0xFFFFF800)==0xD800 \ + || (c&0xFFFFFFFE)==0xFFFE ){ c = 0xFFFD; } \ + } +SQLITE_PRIVATE u32 sqlite3Utf8Read( + const unsigned char **pz /* Pointer to string from which to read char */ +){ + unsigned int c; + + /* Same as READ_UTF8() above but without the zTerm parameter. + ** For this routine, we assume the UTF8 string is always zero-terminated. + */ + c = *((*pz)++); + if( c>=0xc0 ){ + c = sqlite3Utf8Trans1[c-0xc0]; + while( (*(*pz) & 0xc0)==0x80 ){ + c = (c<<6) + (0x3f & *((*pz)++)); + } + if( c<0x80 + || (c&0xFFFFF800)==0xD800 + || (c&0xFFFFFFFE)==0xFFFE ){ c = 0xFFFD; } + } + return c; +} + + + + +/* +** If the TRANSLATE_TRACE macro is defined, the value of each Mem is +** printed on stderr on the way into and out of sqlite3VdbeMemTranslate(). +*/ +/* #define TRANSLATE_TRACE 1 */ + +#ifndef SQLITE_OMIT_UTF16 +/* +** This routine transforms the internal text encoding used by pMem to +** desiredEnc. It is an error if the string is already of the desired +** encoding, or if *pMem does not contain a string value. +*/ +SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3VdbeMemTranslate(Mem *pMem, u8 desiredEnc){ + int len; /* Maximum length of output string in bytes */ + unsigned char *zOut; /* Output buffer */ + unsigned char *zIn; /* Input iterator */ + unsigned char *zTerm; /* End of input */ + unsigned char *z; /* Output iterator */ + unsigned int c; + + assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); + assert( pMem->flags&MEM_Str ); + assert( pMem->enc!=desiredEnc ); + assert( pMem->enc!=0 ); + assert( pMem->n>=0 ); + +#if defined(TRANSLATE_TRACE) && defined(SQLITE_DEBUG) + { + char zBuf[100]; + sqlite3VdbeMemPrettyPrint(pMem, zBuf); + fprintf(stderr, "INPUT: %s\n", zBuf); + } +#endif + + /* If the translation is between UTF-16 little and big endian, then + ** all that is required is to swap the byte order. This case is handled + ** differently from the others. + */ + if( pMem->enc!=SQLITE_UTF8 && desiredEnc!=SQLITE_UTF8 ){ + u8 temp; + int rc; + rc = sqlite3VdbeMemMakeWriteable(pMem); + if( rc!=SQLITE_OK ){ + assert( rc==SQLITE_NOMEM ); + return SQLITE_NOMEM_BKPT; + } + zIn = (u8*)pMem->z; + zTerm = &zIn[pMem->n&~1]; + while( zInenc = desiredEnc; + goto translate_out; + } + + /* Set len to the maximum number of bytes required in the output buffer. */ + if( desiredEnc==SQLITE_UTF8 ){ + /* When converting from UTF-16, the maximum growth results from + ** translating a 2-byte character to a 4-byte UTF-8 character. + ** A single byte is required for the output string + ** nul-terminator. + */ + pMem->n &= ~1; + len = pMem->n * 2 + 1; + }else{ + /* When converting from UTF-8 to UTF-16 the maximum growth is caused + ** when a 1-byte UTF-8 character is translated into a 2-byte UTF-16 + ** character. Two bytes are required in the output buffer for the + ** nul-terminator. + */ + len = pMem->n * 2 + 2; + } + + /* Set zIn to point at the start of the input buffer and zTerm to point 1 + ** byte past the end. + ** + ** Variable zOut is set to point at the output buffer, space obtained + ** from sqlite3_malloc(). + */ + zIn = (u8*)pMem->z; + zTerm = &zIn[pMem->n]; + zOut = sqlite3DbMallocRaw(pMem->db, len); + if( !zOut ){ + return SQLITE_NOMEM_BKPT; + } + z = zOut; + + if( pMem->enc==SQLITE_UTF8 ){ + if( desiredEnc==SQLITE_UTF16LE ){ + /* UTF-8 -> UTF-16 Little-endian */ + while( zIn UTF-16 Big-endian */ + while( zInn = (int)(z - zOut); + *z++ = 0; + }else{ + assert( desiredEnc==SQLITE_UTF8 ); + if( pMem->enc==SQLITE_UTF16LE ){ + /* UTF-16 Little-endian -> UTF-8 */ + while( zIn UTF-8 */ + while( zInn = (int)(z - zOut); + } + *z = 0; + assert( (pMem->n+(desiredEnc==SQLITE_UTF8?1:2))<=len ); + + c = pMem->flags; + sqlite3VdbeMemRelease(pMem); + pMem->flags = MEM_Str|MEM_Term|(c&(MEM_AffMask|MEM_Subtype)); + pMem->enc = desiredEnc; + pMem->z = (char*)zOut; + pMem->zMalloc = pMem->z; + pMem->szMalloc = sqlite3DbMallocSize(pMem->db, pMem->z); + +translate_out: +#if defined(TRANSLATE_TRACE) && defined(SQLITE_DEBUG) + { + char zBuf[100]; + sqlite3VdbeMemPrettyPrint(pMem, zBuf); + fprintf(stderr, "OUTPUT: %s\n", zBuf); + } +#endif + return SQLITE_OK; +} + +/* +** This routine checks for a byte-order mark at the beginning of the +** UTF-16 string stored in *pMem. If one is present, it is removed and +** the encoding of the Mem adjusted. This routine does not do any +** byte-swapping, it just sets Mem.enc appropriately. +** +** The allocation (static, dynamic etc.) and encoding of the Mem may be +** changed by this function. +*/ +SQLITE_PRIVATE int sqlite3VdbeMemHandleBom(Mem *pMem){ + int rc = SQLITE_OK; + u8 bom = 0; + + assert( pMem->n>=0 ); + if( pMem->n>1 ){ + u8 b1 = *(u8 *)pMem->z; + u8 b2 = *(((u8 *)pMem->z) + 1); + if( b1==0xFE && b2==0xFF ){ + bom = SQLITE_UTF16BE; + } + if( b1==0xFF && b2==0xFE ){ + bom = SQLITE_UTF16LE; + } + } + + if( bom ){ + rc = sqlite3VdbeMemMakeWriteable(pMem); + if( rc==SQLITE_OK ){ + pMem->n -= 2; + memmove(pMem->z, &pMem->z[2], pMem->n); + pMem->z[pMem->n] = '\0'; + pMem->z[pMem->n+1] = '\0'; + pMem->flags |= MEM_Term; + pMem->enc = bom; + } + } + return rc; +} +#endif /* SQLITE_OMIT_UTF16 */ + +/* +** pZ is a UTF-8 encoded unicode string. If nByte is less than zero, +** return the number of unicode characters in pZ up to (but not including) +** the first 0x00 byte. If nByte is not less than zero, return the +** number of unicode characters in the first nByte of pZ (or up to +** the first 0x00, whichever comes first). +*/ +SQLITE_PRIVATE int sqlite3Utf8CharLen(const char *zIn, int nByte){ + int r = 0; + const u8 *z = (const u8*)zIn; + const u8 *zTerm; + if( nByte>=0 ){ + zTerm = &z[nByte]; + }else{ + zTerm = (const u8*)(-1); + } + assert( z<=zTerm ); + while( *z!=0 && zmallocFailed ){ + sqlite3VdbeMemRelease(&m); + m.z = 0; + } + assert( (m.flags & MEM_Term)!=0 || db->mallocFailed ); + assert( (m.flags & MEM_Str)!=0 || db->mallocFailed ); + assert( m.z || db->mallocFailed ); + return m.z; +} + +/* +** zIn is a UTF-16 encoded unicode string at least nChar characters long. +** Return the number of bytes in the first nChar unicode characters +** in pZ. nChar must be non-negative. +*/ +SQLITE_PRIVATE int sqlite3Utf16ByteLen(const void *zIn, int nChar){ + int c; + unsigned char const *z = zIn; + int n = 0; + + if( SQLITE_UTF16NATIVE==SQLITE_UTF16BE ){ + while( n0 && n<=4 ); + z[0] = 0; + z = zBuf; + c = sqlite3Utf8Read((const u8**)&z); + t = i; + if( i>=0xD800 && i<=0xDFFF ) t = 0xFFFD; + if( (i&0xFFFFFFFE)==0xFFFE ) t = 0xFFFD; + assert( c==t ); + assert( (z-zBuf)==n ); + } + for(i=0; i<0x00110000; i++){ + if( i>=0xD800 && i<0xE000 ) continue; + z = zBuf; + WRITE_UTF16LE(z, i); + n = (int)(z-zBuf); + assert( n>0 && n<=4 ); + z[0] = 0; + z = zBuf; + READ_UTF16LE(z, 1, c); + assert( c==i ); + assert( (z-zBuf)==n ); + } + for(i=0; i<0x00110000; i++){ + if( i>=0xD800 && i<0xE000 ) continue; + z = zBuf; + WRITE_UTF16BE(z, i); + n = (int)(z-zBuf); + assert( n>0 && n<=4 ); + z[0] = 0; + z = zBuf; + READ_UTF16BE(z, 1, c); + assert( c==i ); + assert( (z-zBuf)==n ); + } +} +#endif /* SQLITE_TEST */ +#endif /* SQLITE_OMIT_UTF16 */ + +/************** End of utf.c *************************************************/ +/************** Begin file util.c ********************************************/ +/* +** 2001 September 15 +** +** 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. +** +************************************************************************* +** Utility functions used throughout sqlite. +** +** This file contains functions for allocating memory, comparing +** strings, and stuff like that. +** +*/ +/* #include "sqliteInt.h" */ +/* #include */ +#if HAVE_ISNAN || SQLITE_HAVE_ISNAN +# include +#endif + +/* +** Routine needed to support the testcase() macro. +*/ +#ifdef SQLITE_COVERAGE_TEST +SQLITE_PRIVATE void sqlite3Coverage(int x){ + static unsigned dummy = 0; + dummy += (unsigned)x; +} +#endif + +/* +** Give a callback to the test harness that can be used to simulate faults +** in places where it is difficult or expensive to do so purely by means +** of inputs. +** +** The intent of the integer argument is to let the fault simulator know +** which of multiple sqlite3FaultSim() calls has been hit. +** +** Return whatever integer value the test callback returns, or return +** SQLITE_OK if no test callback is installed. +*/ +#ifndef SQLITE_OMIT_BUILTIN_TEST +SQLITE_PRIVATE int sqlite3FaultSim(int iTest){ + int (*xCallback)(int) = sqlite3GlobalConfig.xTestCallback; + return xCallback ? xCallback(iTest) : SQLITE_OK; +} +#endif + +#ifndef SQLITE_OMIT_FLOATING_POINT +/* +** Return true if the floating point value is Not a Number (NaN). +** +** Use the math library isnan() function if compiled with SQLITE_HAVE_ISNAN. +** Otherwise, we have our own implementation that works on most systems. +*/ +SQLITE_PRIVATE int sqlite3IsNaN(double x){ + int rc; /* The value return */ +#if !SQLITE_HAVE_ISNAN && !HAVE_ISNAN + /* + ** Systems that support the isnan() library function should probably + ** make use of it by compiling with -DSQLITE_HAVE_ISNAN. But we have + ** found that many systems do not have a working isnan() function so + ** this implementation is provided as an alternative. + ** + ** This NaN test sometimes fails if compiled on GCC with -ffast-math. + ** On the other hand, the use of -ffast-math comes with the following + ** warning: + ** + ** This option [-ffast-math] should never be turned on by any + ** -O option since it can result in incorrect output for programs + ** which depend on an exact implementation of IEEE or ISO + ** rules/specifications for math functions. + ** + ** Under MSVC, this NaN test may fail if compiled with a floating- + ** point precision mode other than /fp:precise. From the MSDN + ** documentation: + ** + ** The compiler [with /fp:precise] will properly handle comparisons + ** involving NaN. For example, x != x evaluates to true if x is NaN + ** ... + */ +#ifdef __FAST_MATH__ +# error SQLite will not work correctly with the -ffast-math option of GCC. +#endif + volatile double y = x; + volatile double z = y; + rc = (y!=z); +#else /* if HAVE_ISNAN */ + rc = isnan(x); +#endif /* HAVE_ISNAN */ + testcase( rc ); + return rc; +} +#endif /* SQLITE_OMIT_FLOATING_POINT */ + +/* +** Compute a string length that is limited to what can be stored in +** lower 30 bits of a 32-bit signed integer. +** +** The value returned will never be negative. Nor will it ever be greater +** than the actual length of the string. For very long strings (greater +** than 1GiB) the value returned might be less than the true string length. +*/ +SQLITE_PRIVATE int sqlite3Strlen30(const char *z){ + if( z==0 ) return 0; + return 0x3fffffff & (int)strlen(z); +} + +/* +** Return the declared type of a column. Or return zDflt if the column +** has no declared type. +** +** The column type is an extra string stored after the zero-terminator on +** the column name if and only if the COLFLAG_HASTYPE flag is set. +*/ +SQLITE_PRIVATE char *sqlite3ColumnType(Column *pCol, char *zDflt){ + if( (pCol->colFlags & COLFLAG_HASTYPE)==0 ) return zDflt; + return pCol->zName + strlen(pCol->zName) + 1; +} + +/* +** Helper function for sqlite3Error() - called rarely. Broken out into +** a separate routine to avoid unnecessary register saves on entry to +** sqlite3Error(). +*/ +static SQLITE_NOINLINE void sqlite3ErrorFinish(sqlite3 *db, int err_code){ + if( db->pErr ) sqlite3ValueSetNull(db->pErr); + sqlite3SystemError(db, err_code); +} + +/* +** Set the current error code to err_code and clear any prior error message. +** Also set iSysErrno (by calling sqlite3System) if the err_code indicates +** that would be appropriate. +*/ +SQLITE_PRIVATE void sqlite3Error(sqlite3 *db, int err_code){ + assert( db!=0 ); + db->errCode = err_code; + if( err_code || db->pErr ) sqlite3ErrorFinish(db, err_code); +} + +/* +** Load the sqlite3.iSysErrno field if that is an appropriate thing +** to do based on the SQLite error code in rc. +*/ +SQLITE_PRIVATE void sqlite3SystemError(sqlite3 *db, int rc){ + if( rc==SQLITE_IOERR_NOMEM ) return; + rc &= 0xff; + if( rc==SQLITE_CANTOPEN || rc==SQLITE_IOERR ){ + db->iSysErrno = sqlite3OsGetLastError(db->pVfs); + } +} + +/* +** Set the most recent error code and error string for the sqlite +** handle "db". The error code is set to "err_code". +** +** If it is not NULL, string zFormat specifies the format of the +** error string in the style of the printf functions: The following +** format characters are allowed: +** +** %s Insert a string +** %z A string that should be freed after use +** %d Insert an integer +** %T Insert a token +** %S Insert the first element of a SrcList +** +** zFormat and any string tokens that follow it are assumed to be +** encoded in UTF-8. +** +** To clear the most recent error for sqlite handle "db", sqlite3Error +** should be called with err_code set to SQLITE_OK and zFormat set +** to NULL. +*/ +SQLITE_PRIVATE void sqlite3ErrorWithMsg(sqlite3 *db, int err_code, const char *zFormat, ...){ + assert( db!=0 ); + db->errCode = err_code; + sqlite3SystemError(db, err_code); + if( zFormat==0 ){ + sqlite3Error(db, err_code); + }else if( db->pErr || (db->pErr = sqlite3ValueNew(db))!=0 ){ + char *z; + va_list ap; + va_start(ap, zFormat); + z = sqlite3VMPrintf(db, zFormat, ap); + va_end(ap); + sqlite3ValueSetStr(db->pErr, -1, z, SQLITE_UTF8, SQLITE_DYNAMIC); + } +} + +/* +** Add an error message to pParse->zErrMsg and increment pParse->nErr. +** The following formatting characters are allowed: +** +** %s Insert a string +** %z A string that should be freed after use +** %d Insert an integer +** %T Insert a token +** %S Insert the first element of a SrcList +** +** This function should be used to report any error that occurs while +** compiling an SQL statement (i.e. within sqlite3_prepare()). The +** last thing the sqlite3_prepare() function does is copy the error +** stored by this function into the database handle using sqlite3Error(). +** Functions sqlite3Error() or sqlite3ErrorWithMsg() should be used +** during statement execution (sqlite3_step() etc.). +*/ +SQLITE_PRIVATE void sqlite3ErrorMsg(Parse *pParse, const char *zFormat, ...){ + char *zMsg; + va_list ap; + sqlite3 *db = pParse->db; + va_start(ap, zFormat); + zMsg = sqlite3VMPrintf(db, zFormat, ap); + va_end(ap); + if( db->suppressErr ){ + sqlite3DbFree(db, zMsg); + }else{ + pParse->nErr++; + sqlite3DbFree(db, pParse->zErrMsg); + pParse->zErrMsg = zMsg; + pParse->rc = SQLITE_ERROR; + } +} + +/* +** 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. +** +** The input string must be zero-terminated. A new zero-terminator +** is added to the dequoted string. +** +** The return value is -1 if no dequoting occurs or the length of the +** dequoted string, exclusive of the zero terminator, if dequoting does +** occur. +** +** 2002-Feb-14: This routine is extended to remove MS-Access style +** brackets from around identifiers. For example: "[a-b-c]" becomes +** "a-b-c". +*/ +SQLITE_PRIVATE void sqlite3Dequote(char *z){ + char quote; + int i, j; + if( z==0 ) return; + quote = z[0]; + if( !sqlite3Isquote(quote) ) return; + if( quote=='[' ) quote = ']'; + for(i=1, j=0;; i++){ + assert( z[i] ); + if( z[i]==quote ){ + if( z[i+1]==quote ){ + z[j++] = quote; + i++; + }else{ + break; + } + }else{ + z[j++] = z[i]; + } + } + z[j] = 0; +} + +/* +** Generate a Token object from a string +*/ +SQLITE_PRIVATE void sqlite3TokenInit(Token *p, char *z){ + p->z = z; + p->n = sqlite3Strlen30(z); +} + +/* Convenient short-hand */ +#define UpperToLower sqlite3UpperToLower + +/* +** Some systems have stricmp(). Others have strcasecmp(). Because +** there is no consistency, we will define our own. +** +** IMPLEMENTATION-OF: R-30243-02494 The sqlite3_stricmp() and +** sqlite3_strnicmp() APIs allow applications and extensions to compare +** the contents of two buffers containing UTF-8 strings in a +** case-independent fashion, using the same definition of "case +** independence" that SQLite uses internally when comparing identifiers. +*/ +SQLITE_API int sqlite3_stricmp(const char *zLeft, const char *zRight){ + if( zLeft==0 ){ + return zRight ? -1 : 0; + }else if( zRight==0 ){ + return 1; + } + return sqlite3StrICmp(zLeft, zRight); +} +SQLITE_PRIVATE int sqlite3StrICmp(const char *zLeft, const char *zRight){ + unsigned char *a, *b; + int c; + a = (unsigned char *)zLeft; + b = (unsigned char *)zRight; + for(;;){ + c = (int)UpperToLower[*a] - (int)UpperToLower[*b]; + if( c || *a==0 ) break; + a++; + b++; + } + return c; +} +SQLITE_API int sqlite3_strnicmp(const char *zLeft, const char *zRight, int N){ + register unsigned char *a, *b; + if( zLeft==0 ){ + return zRight ? -1 : 0; + }else if( zRight==0 ){ + return 1; + } + a = (unsigned char *)zLeft; + b = (unsigned char *)zRight; + while( N-- > 0 && *a!=0 && UpperToLower[*a]==UpperToLower[*b]){ a++; b++; } + return N<0 ? 0 : UpperToLower[*a] - UpperToLower[*b]; +} + +/* +** The string z[] is an text representation of a real number. +** Convert this string to a double and write it into *pResult. +** +** The string z[] is length bytes in length (bytes, not characters) and +** uses the encoding enc. The string is not necessarily zero-terminated. +** +** Return TRUE if the result is a valid real number (or integer) and FALSE +** if the string is empty or contains extraneous text. Valid numbers +** are in one of these formats: +** +** [+-]digits[E[+-]digits] +** [+-]digits.[digits][E[+-]digits] +** [+-].digits[E[+-]digits] +** +** Leading and trailing whitespace is ignored for the purpose of determining +** validity. +** +** If some prefix of the input string is a valid number, this routine +** returns FALSE but it still converts the prefix and writes the result +** into *pResult. +*/ +SQLITE_PRIVATE int sqlite3AtoF(const char *z, double *pResult, int length, u8 enc){ +#ifndef SQLITE_OMIT_FLOATING_POINT + int incr; + const char *zEnd = z + length; + /* sign * significand * (10 ^ (esign * exponent)) */ + int sign = 1; /* sign of significand */ + i64 s = 0; /* significand */ + int d = 0; /* adjust exponent for shifting decimal point */ + int esign = 1; /* sign of exponent */ + int e = 0; /* exponent */ + int eValid = 1; /* True exponent is either not used or is well-formed */ + double result; + int nDigits = 0; + int nonNum = 0; /* True if input contains UTF16 with high byte non-zero */ + + assert( enc==SQLITE_UTF8 || enc==SQLITE_UTF16LE || enc==SQLITE_UTF16BE ); + *pResult = 0.0; /* Default return value, in case of an error */ + + if( enc==SQLITE_UTF8 ){ + incr = 1; + }else{ + int i; + incr = 2; + assert( SQLITE_UTF16LE==2 && SQLITE_UTF16BE==3 ); + for(i=3-enc; i=zEnd ) return 0; + + /* get sign of significand */ + if( *z=='-' ){ + sign = -1; + z+=incr; + }else if( *z=='+' ){ + z+=incr; + } + + /* copy max significant digits to significand */ + while( z=zEnd ) goto do_atof_calc; + + /* if decimal point is present */ + if( *z=='.' ){ + z+=incr; + /* copy digits from after decimal to significand + ** (decrease exponent by d to shift decimal right) */ + while( z=zEnd ) goto do_atof_calc; + + /* if exponent is present */ + if( *z=='e' || *z=='E' ){ + z+=incr; + eValid = 0; + + /* This branch is needed to avoid a (harmless) buffer overread. The + ** special comment alerts the mutation tester that the correct answer + ** is obtained even if the branch is omitted */ + if( z>=zEnd ) goto do_atof_calc; /*PREVENTS-HARMLESS-OVERREAD*/ + + /* get sign of exponent */ + if( *z=='-' ){ + esign = -1; + z+=incr; + }else if( *z=='+' ){ + z+=incr; + } + /* copy digits to exponent */ + while( z0 ){ /*OPTIMIZATION-IF-TRUE*/ + if( esign>0 ){ + if( s>=(LARGEST_INT64/10) ) break; /*OPTIMIZATION-IF-FALSE*/ + s *= 10; + }else{ + if( s%10!=0 ) break; /*OPTIMIZATION-IF-FALSE*/ + s /= 10; + } + e--; + } + + /* adjust the sign of significand */ + s = sign<0 ? -s : s; + + if( e==0 ){ /*OPTIMIZATION-IF-TRUE*/ + result = (double)s; + }else{ + LONGDOUBLE_TYPE scale = 1.0; + /* attempt to handle extremely small/large numbers better */ + if( e>307 ){ /*OPTIMIZATION-IF-TRUE*/ + if( e<342 ){ /*OPTIMIZATION-IF-TRUE*/ + while( e%308 ) { scale *= 1.0e+1; e -= 1; } + if( esign<0 ){ + result = s / scale; + result /= 1.0e+308; + }else{ + result = s * scale; + result *= 1.0e+308; + } + }else{ assert( e>=342 ); + if( esign<0 ){ + result = 0.0*s; + }else{ + result = 1e308*1e308*s; /* Infinity */ + } + } + }else{ + /* 1.0e+22 is the largest power of 10 than can be + ** represented exactly. */ + while( e%22 ) { scale *= 1.0e+1; e -= 1; } + while( e>0 ) { scale *= 1.0e+22; e -= 22; } + if( esign<0 ){ + result = s / scale; + }else{ + result = s * scale; + } + } + } + } + + /* store the result */ + *pResult = result; + + /* return true if number and no extra non-whitespace chracters after */ + return z==zEnd && nDigits>0 && eValid && nonNum==0; +#else + return !sqlite3Atoi64(z, pResult, length, enc); +#endif /* SQLITE_OMIT_FLOATING_POINT */ +} + +/* +** Compare the 19-character string zNum against the text representation +** value 2^63: 9223372036854775808. Return negative, zero, or positive +** if zNum is less than, equal to, or greater than the string. +** Note that zNum must contain exactly 19 characters. +** +** Unlike memcmp() this routine is guaranteed to return the difference +** in the values of the last digit if the only difference is in the +** last digit. So, for example, +** +** compare2pow63("9223372036854775800", 1) +** +** will return -8. +*/ +static int compare2pow63(const char *zNum, int incr){ + int c = 0; + int i; + /* 012345678901234567 */ + const char *pow63 = "922337203685477580"; + for(i=0; c==0 && i<18; i++){ + c = (zNum[i*incr]-pow63[i])*10; + } + if( c==0 ){ + c = zNum[18*incr] - '8'; + testcase( c==(-1) ); + testcase( c==0 ); + testcase( c==(+1) ); + } + return c; +} + +/* +** Convert zNum to a 64-bit signed integer. zNum must be decimal. This +** routine does *not* accept hexadecimal notation. +** +** If the zNum value is representable as a 64-bit twos-complement +** integer, then write that value into *pNum and return 0. +** +** If zNum is exactly 9223372036854775808, return 2. This special +** case is broken out because while 9223372036854775808 cannot be a +** signed 64-bit integer, its negative -9223372036854775808 can be. +** +** If zNum is too big for a 64-bit integer and is not +** 9223372036854775808 or if zNum contains any non-numeric text, +** then return 1. +** +** length is the number of bytes in the string (bytes, not characters). +** The string is not necessarily zero-terminated. The encoding is +** given by enc. +*/ +SQLITE_PRIVATE int sqlite3Atoi64(const char *zNum, i64 *pNum, int length, u8 enc){ + int incr; + u64 u = 0; + int neg = 0; /* assume positive */ + int i; + int c = 0; + int nonNum = 0; /* True if input contains UTF16 with high byte non-zero */ + const char *zStart; + const char *zEnd = zNum + length; + assert( enc==SQLITE_UTF8 || enc==SQLITE_UTF16LE || enc==SQLITE_UTF16BE ); + if( enc==SQLITE_UTF8 ){ + incr = 1; + }else{ + incr = 2; + assert( SQLITE_UTF16LE==2 && SQLITE_UTF16BE==3 ); + for(i=3-enc; i='0' && c<='9'; i+=incr){ + u = u*10 + c - '0'; + } + if( u>LARGEST_INT64 ){ + *pNum = neg ? SMALLEST_INT64 : LARGEST_INT64; + }else if( neg ){ + *pNum = -(i64)u; + }else{ + *pNum = (i64)u; + } + testcase( i==18 ); + testcase( i==19 ); + testcase( i==20 ); + if( &zNum[i]19*incr /* Too many digits */ + || nonNum /* UTF16 with high-order bytes non-zero */ + ){ + /* zNum is empty or contains non-numeric text or is longer + ** than 19 digits (thus guaranteeing that it is too large) */ + return 1; + }else if( i<19*incr ){ + /* Less than 19 digits, so we know that it fits in 64 bits */ + assert( u<=LARGEST_INT64 ); + return 0; + }else{ + /* zNum is a 19-digit numbers. Compare it against 9223372036854775808. */ + c = compare2pow63(zNum, incr); + if( c<0 ){ + /* zNum is less than 9223372036854775808 so it fits */ + assert( u<=LARGEST_INT64 ); + return 0; + }else if( c>0 ){ + /* zNum is greater than 9223372036854775808 so it overflows */ + return 1; + }else{ + /* zNum is exactly 9223372036854775808. Fits if negative. The + ** special case 2 overflow if positive */ + assert( u-1==LARGEST_INT64 ); + return neg ? 0 : 2; + } + } +} + +/* +** Transform a UTF-8 integer literal, in either decimal or hexadecimal, +** into a 64-bit signed integer. This routine accepts hexadecimal literals, +** whereas sqlite3Atoi64() does not. +** +** Returns: +** +** 0 Successful transformation. Fits in a 64-bit signed integer. +** 1 Integer too large for a 64-bit signed integer or is malformed +** 2 Special case of 9223372036854775808 +*/ +SQLITE_PRIVATE int sqlite3DecOrHexToI64(const char *z, i64 *pOut){ +#ifndef SQLITE_OMIT_HEX_INTEGER + if( z[0]=='0' + && (z[1]=='x' || z[1]=='X') + ){ + u64 u = 0; + int i, k; + for(i=2; z[i]=='0'; i++){} + for(k=i; sqlite3Isxdigit(z[k]); k++){ + u = u*16 + sqlite3HexToInt(z[k]); + } + memcpy(pOut, &u, 8); + return (z[k]==0 && k-i<=16) ? 0 : 1; + }else +#endif /* SQLITE_OMIT_HEX_INTEGER */ + { + return sqlite3Atoi64(z, pOut, sqlite3Strlen30(z), SQLITE_UTF8); + } +} + +/* +** If zNum represents an integer that will fit in 32-bits, then set +** *pValue to that integer and return true. Otherwise return false. +** +** This routine accepts both decimal and hexadecimal notation for integers. +** +** Any non-numeric characters that following zNum are ignored. +** This is different from sqlite3Atoi64() which requires the +** input number to be zero-terminated. +*/ +SQLITE_PRIVATE int sqlite3GetInt32(const char *zNum, int *pValue){ + sqlite_int64 v = 0; + int i, c; + int neg = 0; + if( zNum[0]=='-' ){ + neg = 1; + zNum++; + }else if( zNum[0]=='+' ){ + zNum++; + } +#ifndef SQLITE_OMIT_HEX_INTEGER + else if( zNum[0]=='0' + && (zNum[1]=='x' || zNum[1]=='X') + && sqlite3Isxdigit(zNum[2]) + ){ + u32 u = 0; + zNum += 2; + while( zNum[0]=='0' ) zNum++; + for(i=0; sqlite3Isxdigit(zNum[i]) && i<8; i++){ + u = u*16 + sqlite3HexToInt(zNum[i]); + } + if( (u&0x80000000)==0 && sqlite3Isxdigit(zNum[i])==0 ){ + memcpy(pValue, &u, 4); + return 1; + }else{ + return 0; + } + } +#endif + while( zNum[0]=='0' ) zNum++; + for(i=0; i<11 && (c = zNum[i] - '0')>=0 && c<=9; i++){ + v = v*10 + c; + } + + /* The longest decimal representation of a 32 bit integer is 10 digits: + ** + ** 1234567890 + ** 2^31 -> 2147483648 + */ + testcase( i==10 ); + if( i>10 ){ + return 0; + } + testcase( v-neg==2147483647 ); + if( v-neg>2147483647 ){ + return 0; + } + if( neg ){ + v = -v; + } + *pValue = (int)v; + return 1; +} + +/* +** Return a 32-bit integer value extracted from a string. If the +** string is not an integer, just return 0. +*/ +SQLITE_PRIVATE int sqlite3Atoi(const char *z){ + int x = 0; + if( z ) sqlite3GetInt32(z, &x); + return x; +} + +/* +** The variable-length integer encoding is as follows: +** +** KEY: +** A = 0xxxxxxx 7 bits of data and one flag bit +** B = 1xxxxxxx 7 bits of data and one flag bit +** C = xxxxxxxx 8 bits of data +** +** 7 bits - A +** 14 bits - BA +** 21 bits - BBA +** 28 bits - BBBA +** 35 bits - BBBBA +** 42 bits - BBBBBA +** 49 bits - BBBBBBA +** 56 bits - BBBBBBBA +** 64 bits - BBBBBBBBC +*/ + +/* +** Write a 64-bit variable-length integer to memory starting at p[0]. +** The length of data write will be between 1 and 9 bytes. The number +** of bytes written is returned. +** +** A variable-length integer consists of the lower 7 bits of each byte +** for all bytes that have the 8th bit set and one byte with the 8th +** bit clear. Except, if we get to the 9th byte, it stores the full +** 8 bits and is the last byte. +*/ +static int SQLITE_NOINLINE putVarint64(unsigned char *p, u64 v){ + int i, j, n; + u8 buf[10]; + if( v & (((u64)0xff000000)<<32) ){ + p[8] = (u8)v; + v >>= 8; + for(i=7; i>=0; i--){ + p[i] = (u8)((v & 0x7f) | 0x80); + v >>= 7; + } + return 9; + } + n = 0; + do{ + buf[n++] = (u8)((v & 0x7f) | 0x80); + v >>= 7; + }while( v!=0 ); + buf[0] &= 0x7f; + assert( n<=9 ); + for(i=0, j=n-1; j>=0; j--, i++){ + p[i] = buf[j]; + } + return n; +} +SQLITE_PRIVATE int sqlite3PutVarint(unsigned char *p, u64 v){ + if( v<=0x7f ){ + p[0] = v&0x7f; + return 1; + } + if( v<=0x3fff ){ + p[0] = ((v>>7)&0x7f)|0x80; + p[1] = v&0x7f; + return 2; + } + return putVarint64(p,v); +} + +/* +** Bitmasks used by sqlite3GetVarint(). These precomputed constants +** are defined here rather than simply putting the constant expressions +** inline in order to work around bugs in the RVT compiler. +** +** SLOT_2_0 A mask for (0x7f<<14) | 0x7f +** +** SLOT_4_2_0 A mask for (0x7f<<28) | SLOT_2_0 +*/ +#define SLOT_2_0 0x001fc07f +#define SLOT_4_2_0 0xf01fc07f + + +/* +** Read a 64-bit variable-length integer from memory starting at p[0]. +** Return the number of bytes read. The value is stored in *v. +*/ +SQLITE_PRIVATE u8 sqlite3GetVarint(const unsigned char *p, u64 *v){ + u32 a,b,s; + + a = *p; + /* a: p0 (unmasked) */ + if (!(a&0x80)) + { + *v = a; + return 1; + } + + p++; + b = *p; + /* b: p1 (unmasked) */ + if (!(b&0x80)) + { + a &= 0x7f; + a = a<<7; + a |= b; + *v = a; + return 2; + } + + /* Verify that constants are precomputed correctly */ + assert( SLOT_2_0 == ((0x7f<<14) | (0x7f)) ); + assert( SLOT_4_2_0 == ((0xfU<<28) | (0x7f<<14) | (0x7f)) ); + + p++; + a = a<<14; + a |= *p; + /* a: p0<<14 | p2 (unmasked) */ + if (!(a&0x80)) + { + a &= SLOT_2_0; + b &= 0x7f; + b = b<<7; + a |= b; + *v = a; + return 3; + } + + /* CSE1 from below */ + a &= SLOT_2_0; + p++; + b = b<<14; + b |= *p; + /* b: p1<<14 | p3 (unmasked) */ + if (!(b&0x80)) + { + b &= SLOT_2_0; + /* moved CSE1 up */ + /* a &= (0x7f<<14)|(0x7f); */ + a = a<<7; + a |= b; + *v = a; + return 4; + } + + /* a: p0<<14 | p2 (masked) */ + /* b: p1<<14 | p3 (unmasked) */ + /* 1:save off p0<<21 | p1<<14 | p2<<7 | p3 (masked) */ + /* moved CSE1 up */ + /* a &= (0x7f<<14)|(0x7f); */ + b &= SLOT_2_0; + s = a; + /* s: p0<<14 | p2 (masked) */ + + p++; + a = a<<14; + a |= *p; + /* a: p0<<28 | p2<<14 | p4 (unmasked) */ + if (!(a&0x80)) + { + /* we can skip these cause they were (effectively) done above + ** while calculating s */ + /* a &= (0x7f<<28)|(0x7f<<14)|(0x7f); */ + /* b &= (0x7f<<14)|(0x7f); */ + b = b<<7; + a |= b; + s = s>>18; + *v = ((u64)s)<<32 | a; + return 5; + } + + /* 2:save off p0<<21 | p1<<14 | p2<<7 | p3 (masked) */ + s = s<<7; + s |= b; + /* s: p0<<21 | p1<<14 | p2<<7 | p3 (masked) */ + + p++; + b = b<<14; + b |= *p; + /* b: p1<<28 | p3<<14 | p5 (unmasked) */ + if (!(b&0x80)) + { + /* we can skip this cause it was (effectively) done above in calc'ing s */ + /* b &= (0x7f<<28)|(0x7f<<14)|(0x7f); */ + a &= SLOT_2_0; + a = a<<7; + a |= b; + s = s>>18; + *v = ((u64)s)<<32 | a; + return 6; + } + + p++; + a = a<<14; + a |= *p; + /* a: p2<<28 | p4<<14 | p6 (unmasked) */ + if (!(a&0x80)) + { + a &= SLOT_4_2_0; + b &= SLOT_2_0; + b = b<<7; + a |= b; + s = s>>11; + *v = ((u64)s)<<32 | a; + return 7; + } + + /* CSE2 from below */ + a &= SLOT_2_0; + p++; + b = b<<14; + b |= *p; + /* b: p3<<28 | p5<<14 | p7 (unmasked) */ + if (!(b&0x80)) + { + b &= SLOT_4_2_0; + /* moved CSE2 up */ + /* a &= (0x7f<<14)|(0x7f); */ + a = a<<7; + a |= b; + s = s>>4; + *v = ((u64)s)<<32 | a; + return 8; + } + + p++; + a = a<<15; + a |= *p; + /* a: p4<<29 | p6<<15 | p8 (unmasked) */ + + /* moved CSE2 up */ + /* a &= (0x7f<<29)|(0x7f<<15)|(0xff); */ + b &= SLOT_2_0; + b = b<<8; + a |= b; + + s = s<<4; + b = p[-4]; + b &= 0x7f; + b = b>>3; + s |= b; + + *v = ((u64)s)<<32 | a; + + return 9; +} + +/* +** Read a 32-bit variable-length integer from memory starting at p[0]. +** Return the number of bytes read. The value is stored in *v. +** +** If the varint stored in p[0] is larger than can fit in a 32-bit unsigned +** integer, then set *v to 0xffffffff. +** +** A MACRO version, getVarint32, is provided which inlines the +** single-byte case. All code should use the MACRO version as +** this function assumes the single-byte case has already been handled. +*/ +SQLITE_PRIVATE u8 sqlite3GetVarint32(const unsigned char *p, u32 *v){ + u32 a,b; + + /* The 1-byte case. Overwhelmingly the most common. Handled inline + ** by the getVarin32() macro */ + a = *p; + /* a: p0 (unmasked) */ +#ifndef getVarint32 + if (!(a&0x80)) + { + /* Values between 0 and 127 */ + *v = a; + return 1; + } +#endif + + /* The 2-byte case */ + p++; + b = *p; + /* b: p1 (unmasked) */ + if (!(b&0x80)) + { + /* Values between 128 and 16383 */ + a &= 0x7f; + a = a<<7; + *v = a | b; + return 2; + } + + /* The 3-byte case */ + p++; + a = a<<14; + a |= *p; + /* a: p0<<14 | p2 (unmasked) */ + if (!(a&0x80)) + { + /* Values between 16384 and 2097151 */ + a &= (0x7f<<14)|(0x7f); + b &= 0x7f; + b = b<<7; + *v = a | b; + return 3; + } + + /* A 32-bit varint is used to store size information in btrees. + ** Objects are rarely larger than 2MiB limit of a 3-byte varint. + ** A 3-byte varint is sufficient, for example, to record the size + ** of a 1048569-byte BLOB or string. + ** + ** We only unroll the first 1-, 2-, and 3- byte cases. The very + ** rare larger cases can be handled by the slower 64-bit varint + ** routine. + */ +#if 1 + { + u64 v64; + u8 n; + + p -= 2; + n = sqlite3GetVarint(p, &v64); + assert( n>3 && n<=9 ); + if( (v64 & SQLITE_MAX_U32)!=v64 ){ + *v = 0xffffffff; + }else{ + *v = (u32)v64; + } + return n; + } + +#else + /* For following code (kept for historical record only) shows an + ** unrolling for the 3- and 4-byte varint cases. This code is + ** slightly faster, but it is also larger and much harder to test. + */ + p++; + b = b<<14; + b |= *p; + /* b: p1<<14 | p3 (unmasked) */ + if (!(b&0x80)) + { + /* Values between 2097152 and 268435455 */ + b &= (0x7f<<14)|(0x7f); + a &= (0x7f<<14)|(0x7f); + a = a<<7; + *v = a | b; + return 4; + } + + p++; + a = a<<14; + a |= *p; + /* a: p0<<28 | p2<<14 | p4 (unmasked) */ + if (!(a&0x80)) + { + /* Values between 268435456 and 34359738367 */ + a &= SLOT_4_2_0; + b &= SLOT_4_2_0; + b = b<<7; + *v = a | b; + return 5; + } + + /* We can only reach this point when reading a corrupt database + ** file. In that case we are not in any hurry. Use the (relatively + ** slow) general-purpose sqlite3GetVarint() routine to extract the + ** value. */ + { + u64 v64; + u8 n; + + p -= 4; + n = sqlite3GetVarint(p, &v64); + assert( n>5 && n<=9 ); + *v = (u32)v64; + return n; + } +#endif +} + +/* +** Return the number of bytes that will be needed to store the given +** 64-bit integer. +*/ +SQLITE_PRIVATE int sqlite3VarintLen(u64 v){ + int i; + for(i=1; (v >>= 7)!=0; i++){ assert( i<10 ); } + return i; +} + + +/* +** Read or write a four-byte big-endian integer value. +*/ +SQLITE_PRIVATE u32 sqlite3Get4byte(const u8 *p){ +#if SQLITE_BYTEORDER==4321 + u32 x; + memcpy(&x,p,4); + return x; +#elif SQLITE_BYTEORDER==1234 && !defined(SQLITE_DISABLE_INTRINSIC) \ + && defined(__GNUC__) && GCC_VERSION>=4003000 + u32 x; + memcpy(&x,p,4); + return __builtin_bswap32(x); +#elif SQLITE_BYTEORDER==1234 && !defined(SQLITE_DISABLE_INTRINSIC) \ + && defined(_MSC_VER) && _MSC_VER>=1300 + u32 x; + memcpy(&x,p,4); + return _byteswap_ulong(x); +#else + testcase( p[0]&0x80 ); + return ((unsigned)p[0]<<24) | (p[1]<<16) | (p[2]<<8) | p[3]; +#endif +} +SQLITE_PRIVATE void sqlite3Put4byte(unsigned char *p, u32 v){ +#if SQLITE_BYTEORDER==4321 + memcpy(p,&v,4); +#elif SQLITE_BYTEORDER==1234 && !defined(SQLITE_DISABLE_INTRINSIC) \ + && defined(__GNUC__) && GCC_VERSION>=4003000 + u32 x = __builtin_bswap32(v); + memcpy(p,&x,4); +#elif SQLITE_BYTEORDER==1234 && !defined(SQLITE_DISABLE_INTRINSIC) \ + && defined(_MSC_VER) && _MSC_VER>=1300 + u32 x = _byteswap_ulong(v); + memcpy(p,&x,4); +#else + p[0] = (u8)(v>>24); + p[1] = (u8)(v>>16); + p[2] = (u8)(v>>8); + p[3] = (u8)v; +#endif +} + + + +/* +** Translate a single byte of Hex into an integer. +** This routine only works if h really is a valid hexadecimal +** character: 0..9a..fA..F +*/ +SQLITE_PRIVATE u8 sqlite3HexToInt(int h){ + assert( (h>='0' && h<='9') || (h>='a' && h<='f') || (h>='A' && h<='F') ); +#ifdef SQLITE_ASCII + h += 9*(1&(h>>6)); +#endif +#ifdef SQLITE_EBCDIC + h += 9*(1&~(h>>4)); +#endif + return (u8)(h & 0xf); +} + +#if !defined(SQLITE_OMIT_BLOB_LITERAL) || defined(SQLITE_HAS_CODEC) +/* +** Convert a BLOB literal of the form "x'hhhhhh'" into its binary +** value. Return a pointer to its binary value. Space to hold the +** binary value has been obtained from malloc and must be freed by +** the calling routine. +*/ +SQLITE_PRIVATE void *sqlite3HexToBlob(sqlite3 *db, const char *z, int n){ + char *zBlob; + int i; + + zBlob = (char *)sqlite3DbMallocRawNN(db, n/2 + 1); + n--; + if( zBlob ){ + for(i=0; imagic; + if( magic!=SQLITE_MAGIC_OPEN ){ + if( sqlite3SafetyCheckSickOrOk(db) ){ + testcase( sqlite3GlobalConfig.xLog!=0 ); + logBadConnection("unopened"); + } + return 0; + }else{ + return 1; + } +} +SQLITE_PRIVATE int sqlite3SafetyCheckSickOrOk(sqlite3 *db){ + u32 magic; + magic = db->magic; + if( magic!=SQLITE_MAGIC_SICK && + magic!=SQLITE_MAGIC_OPEN && + magic!=SQLITE_MAGIC_BUSY ){ + testcase( sqlite3GlobalConfig.xLog!=0 ); + logBadConnection("invalid"); + return 0; + }else{ + return 1; + } +} + +/* +** Attempt to add, substract, or multiply the 64-bit signed value iB against +** the other 64-bit signed integer at *pA and store the result in *pA. +** Return 0 on success. Or if the operation would have resulted in an +** overflow, leave *pA unchanged and return 1. +*/ +SQLITE_PRIVATE int sqlite3AddInt64(i64 *pA, i64 iB){ + i64 iA = *pA; + testcase( iA==0 ); testcase( iA==1 ); + testcase( iB==-1 ); testcase( iB==0 ); + if( iB>=0 ){ + testcase( iA>0 && LARGEST_INT64 - iA == iB ); + testcase( iA>0 && LARGEST_INT64 - iA == iB - 1 ); + if( iA>0 && LARGEST_INT64 - iA < iB ) return 1; + }else{ + testcase( iA<0 && -(iA + LARGEST_INT64) == iB + 1 ); + testcase( iA<0 && -(iA + LARGEST_INT64) == iB + 2 ); + if( iA<0 && -(iA + LARGEST_INT64) > iB + 1 ) return 1; + } + *pA += iB; + return 0; +} +SQLITE_PRIVATE int sqlite3SubInt64(i64 *pA, i64 iB){ + testcase( iB==SMALLEST_INT64+1 ); + if( iB==SMALLEST_INT64 ){ + testcase( (*pA)==(-1) ); testcase( (*pA)==0 ); + if( (*pA)>=0 ) return 1; + *pA -= iB; + return 0; + }else{ + return sqlite3AddInt64(pA, -iB); + } +} +SQLITE_PRIVATE int sqlite3MulInt64(i64 *pA, i64 iB){ + i64 iA = *pA; + if( iB>0 ){ + if( iA>LARGEST_INT64/iB ) return 1; + if( iA0 ){ + if( iBLARGEST_INT64/-iB ) return 1; + } + } + *pA = iA*iB; + return 0; +} + +/* +** Compute the absolute value of a 32-bit signed integer, of possible. Or +** if the integer has a value of -2147483648, return +2147483647 +*/ +SQLITE_PRIVATE int sqlite3AbsInt32(int x){ + if( x>=0 ) return x; + if( x==(int)0x80000000 ) return 0x7fffffff; + return -x; +} + +#ifdef SQLITE_ENABLE_8_3_NAMES +/* +** If SQLITE_ENABLE_8_3_NAMES is set at compile-time and if the database +** filename in zBaseFilename is a URI with the "8_3_names=1" parameter and +** if filename in z[] has a suffix (a.k.a. "extension") that is longer than +** three characters, then shorten the suffix on z[] to be the last three +** characters of the original suffix. +** +** If SQLITE_ENABLE_8_3_NAMES is set to 2 at compile-time, then always +** do the suffix shortening regardless of URI parameter. +** +** Examples: +** +** test.db-journal => test.nal +** test.db-wal => test.wal +** test.db-shm => test.shm +** test.db-mj7f3319fa => test.9fa +*/ +SQLITE_PRIVATE void sqlite3FileSuffix3(const char *zBaseFilename, char *z){ +#if SQLITE_ENABLE_8_3_NAMES<2 + if( sqlite3_uri_boolean(zBaseFilename, "8_3_names", 0) ) +#endif + { + int i, sz; + sz = sqlite3Strlen30(z); + for(i=sz-1; i>0 && z[i]!='/' && z[i]!='.'; i--){} + if( z[i]=='.' && ALWAYS(sz>i+4) ) memmove(&z[i+1], &z[sz-3], 4); + } +} +#endif + +/* +** Find (an approximate) sum of two LogEst values. This computation is +** not a simple "+" operator because LogEst is stored as a logarithmic +** value. +** +*/ +SQLITE_PRIVATE LogEst sqlite3LogEstAdd(LogEst a, LogEst b){ + static const unsigned char x[] = { + 10, 10, /* 0,1 */ + 9, 9, /* 2,3 */ + 8, 8, /* 4,5 */ + 7, 7, 7, /* 6,7,8 */ + 6, 6, 6, /* 9,10,11 */ + 5, 5, 5, /* 12-14 */ + 4, 4, 4, 4, /* 15-18 */ + 3, 3, 3, 3, 3, 3, /* 19-24 */ + 2, 2, 2, 2, 2, 2, 2, /* 25-31 */ + }; + if( a>=b ){ + if( a>b+49 ) return a; + if( a>b+31 ) return a+1; + return a+x[a-b]; + }else{ + if( b>a+49 ) return b; + if( b>a+31 ) return b+1; + return b+x[b-a]; + } +} + +/* +** Convert an integer into a LogEst. In other words, compute an +** approximation for 10*log2(x). +*/ +SQLITE_PRIVATE LogEst sqlite3LogEst(u64 x){ + static LogEst a[] = { 0, 2, 3, 5, 6, 7, 8, 9 }; + LogEst y = 40; + if( x<8 ){ + if( x<2 ) return 0; + while( x<8 ){ y -= 10; x <<= 1; } + }else{ + while( x>255 ){ y += 40; x >>= 4; } /*OPTIMIZATION-IF-TRUE*/ + while( x>15 ){ y += 10; x >>= 1; } + } + return a[x&7] + y - 10; +} + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* +** Convert a double into a LogEst +** In other words, compute an approximation for 10*log2(x). +*/ +SQLITE_PRIVATE LogEst sqlite3LogEstFromDouble(double x){ + u64 a; + LogEst e; + assert( sizeof(x)==8 && sizeof(a)==8 ); + if( x<=1 ) return 0; + if( x<=2000000000 ) return sqlite3LogEst((u64)x); + memcpy(&a, &x, 8); + e = (a>>52) - 1022; + return e*10; +} +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + +#if defined(SQLITE_ENABLE_STMT_SCANSTATUS) || \ + defined(SQLITE_ENABLE_STAT3_OR_STAT4) || \ + defined(SQLITE_EXPLAIN_ESTIMATED_ROWS) +/* +** Convert a LogEst into an integer. +** +** Note that this routine is only used when one or more of various +** non-standard compile-time options is enabled. +*/ +SQLITE_PRIVATE u64 sqlite3LogEstToInt(LogEst x){ + u64 n; + n = x%10; + x /= 10; + if( n>=5 ) n -= 2; + else if( n>=1 ) n -= 1; +#if defined(SQLITE_ENABLE_STMT_SCANSTATUS) || \ + defined(SQLITE_EXPLAIN_ESTIMATED_ROWS) + if( x>60 ) return (u64)LARGEST_INT64; +#else + /* If only SQLITE_ENABLE_STAT3_OR_STAT4 is on, then the largest input + ** possible to this routine is 310, resulting in a maximum x of 31 */ + assert( x<=60 ); +#endif + return x>=3 ? (n+8)<<(x-3) : (n+8)>>(3-x); +} +#endif /* defined SCANSTAT or STAT4 or ESTIMATED_ROWS */ + +/************** End of util.c ************************************************/ +/************** Begin file 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. +*/ +/* #include "sqliteInt.h" */ +/* #include */ + +/* 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. +*/ +SQLITE_PRIVATE void sqlite3HashInit(Hash *pNew){ + assert( pNew!=0 ); + pNew->first = 0; + pNew->count = 0; + pNew->htsize = 0; + pNew->ht = 0; +} + +/* 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 sqlite3HashClear(Hash *pH){ + HashElem *elem; /* For looping over all elements of the table */ + + assert( pH!=0 ); + elem = pH->first; + pH->first = 0; + sqlite3_free(pH->ht); + pH->ht = 0; + pH->htsize = 0; + while( elem ){ + HashElem *next_elem = elem->next; + sqlite3_free(elem); + elem = next_elem; + } + pH->count = 0; +} + +/* +** The hashing function. +*/ +static unsigned int strHash(const char *z){ + unsigned int h = 0; + unsigned char c; + while( (c = (unsigned char)*z++)!=0 ){ /*OPTIMIZATION-IF-TRUE*/ + /* Knuth multiplicative hashing. (Sorting & Searching, p. 510). + ** 0x9e3779b1 is 2654435761 which is the closest prime number to + ** (2**32)*golden_ratio, where golden_ratio = (sqrt(5) - 1)/2. */ + h += sqlite3UpperToLower[c]; + h *= 0x9e3779b1; + } + return h; +} + + +/* Link pNew element into the hash table pH. If pEntry!=0 then also +** insert pNew into the pEntry hash bucket. +*/ +static void insertElement( + Hash *pH, /* The complete hash table */ + struct _ht *pEntry, /* The entry into which pNew is inserted */ + HashElem *pNew /* The element to be inserted */ +){ + HashElem *pHead; /* First element already in pEntry */ + if( pEntry ){ + pHead = pEntry->count ? pEntry->chain : 0; + pEntry->count++; + pEntry->chain = pNew; + }else{ + pHead = 0; + } + 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; + } +} + + +/* Resize the hash table so that it cantains "new_size" buckets. +** +** The hash table might fail to resize if sqlite3_malloc() fails or +** if the new size is the same as the prior size. +** Return TRUE if the resize occurs and false if not. +*/ +static int rehash(Hash *pH, unsigned int new_size){ + struct _ht *new_ht; /* The new hash table */ + HashElem *elem, *next_elem; /* For looping over existing elements */ + +#if SQLITE_MALLOC_SOFT_LIMIT>0 + if( new_size*sizeof(struct _ht)>SQLITE_MALLOC_SOFT_LIMIT ){ + new_size = SQLITE_MALLOC_SOFT_LIMIT/sizeof(struct _ht); + } + if( new_size==pH->htsize ) return 0; +#endif + + /* The inability to allocates space for a larger hash table is + ** a performance hit but it is not a fatal error. So mark the + ** allocation as a benign. Use sqlite3Malloc()/memset(0) instead of + ** sqlite3MallocZero() to make the allocation, as sqlite3MallocZero() + ** only zeroes the requested number of bytes whereas this module will + ** use the actual amount of space allocated for the hash table (which + ** may be larger than the requested amount). + */ + sqlite3BeginBenignMalloc(); + new_ht = (struct _ht *)sqlite3Malloc( new_size*sizeof(struct _ht) ); + sqlite3EndBenignMalloc(); + + if( new_ht==0 ) return 0; + sqlite3_free(pH->ht); + pH->ht = new_ht; + pH->htsize = new_size = sqlite3MallocSize(new_ht)/sizeof(struct _ht); + memset(new_ht, 0, new_size*sizeof(struct _ht)); + for(elem=pH->first, pH->first=0; elem; elem = next_elem){ + unsigned int h = strHash(elem->pKey) % new_size; + next_elem = elem->next; + insertElement(pH, &new_ht[h], elem); + } + return 1; +} + +/* This function (for internal use only) locates an element in an +** hash table that matches the given key. The hash for this key is +** also computed and returned in the *pH parameter. +*/ +static HashElem *findElementWithHash( + const Hash *pH, /* The pH to be searched */ + const char *pKey, /* The key we are searching for */ + unsigned int *pHash /* Write the hash value here */ +){ + HashElem *elem; /* Used to loop thru the element list */ + int count; /* Number of elements left to test */ + unsigned int h; /* The computed hash */ + + if( pH->ht ){ /*OPTIMIZATION-IF-TRUE*/ + struct _ht *pEntry; + h = strHash(pKey) % pH->htsize; + pEntry = &pH->ht[h]; + elem = pEntry->chain; + count = pEntry->count; + }else{ + h = 0; + elem = pH->first; + count = pH->count; + } + *pHash = h; + while( count-- ){ + assert( elem!=0 ); + if( sqlite3StrICmp(elem->pKey,pKey)==0 ){ + return elem; + } + elem = elem->next; + } + return 0; +} + +/* Remove a single entry from the hash table given a pointer to that +** element and a hash on the element's key. +*/ +static void removeElementGivenHash( + Hash *pH, /* The pH containing "elem" */ + HashElem* elem, /* The element to be removed from the pH */ + unsigned int h /* Hash value for the element */ +){ + struct _ht *pEntry; + if( elem->prev ){ + elem->prev->next = elem->next; + }else{ + pH->first = elem->next; + } + if( elem->next ){ + elem->next->prev = elem->prev; + } + if( pH->ht ){ + pEntry = &pH->ht[h]; + if( pEntry->chain==elem ){ + pEntry->chain = elem->next; + } + pEntry->count--; + assert( pEntry->count>=0 ); + } + sqlite3_free( elem ); + pH->count--; + if( pH->count==0 ){ + assert( pH->first==0 ); + assert( pH->count==0 ); + sqlite3HashClear(pH); + } +} + +/* Attempt to locate an element of the hash table pH with a key +** that matches pKey. Return the data for this element if it is +** found, or NULL if there is no match. +*/ +SQLITE_PRIVATE void *sqlite3HashFind(const Hash *pH, const char *pKey){ + HashElem *elem; /* The element that matches key */ + unsigned int h; /* A hash on key */ + + assert( pH!=0 ); + assert( pKey!=0 ); + elem = findElementWithHash(pH, pKey, &h); + return elem ? elem->data : 0; +} + +/* Insert an element into the hash table pH. The key is pKey +** and the data is "data". +** +** If no element exists with a matching key, then a new +** element is created and 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 *sqlite3HashInsert(Hash *pH, const char *pKey, void *data){ + unsigned int h; /* the hash of the key modulo hash table size */ + HashElem *elem; /* Used to loop thru the element list */ + HashElem *new_elem; /* New element added to the pH */ + + assert( pH!=0 ); + assert( pKey!=0 ); + elem = findElementWithHash(pH,pKey,&h); + if( elem ){ + void *old_data = elem->data; + if( data==0 ){ + removeElementGivenHash(pH,elem,h); + }else{ + elem->data = data; + elem->pKey = pKey; + } + return old_data; + } + if( data==0 ) return 0; + new_elem = (HashElem*)sqlite3Malloc( sizeof(HashElem) ); + if( new_elem==0 ) return data; + new_elem->pKey = pKey; + new_elem->data = data; + pH->count++; + if( pH->count>=10 && pH->count > 2*pH->htsize ){ + if( rehash(pH, pH->count*2) ){ + assert( pH->htsize>0 ); + h = strHash(pKey) % pH->htsize; + } + } + insertElement(pH, pH->ht ? &pH->ht[h] : 0, new_elem); + return 0; +} + +/************** End of hash.c ************************************************/ +/************** Begin file opcodes.c *****************************************/ +/* Automatically generated. Do not edit */ +/* See the tool/mkopcodec.tcl script for details. */ +#if !defined(SQLITE_OMIT_EXPLAIN) \ + || defined(VDBE_PROFILE) \ + || defined(SQLITE_DEBUG) +#if defined(SQLITE_ENABLE_EXPLAIN_COMMENTS) || defined(SQLITE_DEBUG) +# define OpHelp(X) "\0" X +#else +# define OpHelp(X) +#endif +SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){ + static const char *const azName[] = { + /* 0 */ "Savepoint" OpHelp(""), + /* 1 */ "AutoCommit" OpHelp(""), + /* 2 */ "Transaction" OpHelp(""), + /* 3 */ "SorterNext" OpHelp(""), + /* 4 */ "PrevIfOpen" OpHelp(""), + /* 5 */ "NextIfOpen" OpHelp(""), + /* 6 */ "Prev" OpHelp(""), + /* 7 */ "Next" OpHelp(""), + /* 8 */ "Checkpoint" OpHelp(""), + /* 9 */ "JournalMode" OpHelp(""), + /* 10 */ "Vacuum" OpHelp(""), + /* 11 */ "VFilter" OpHelp("iplan=r[P3] zplan='P4'"), + /* 12 */ "VUpdate" OpHelp("data=r[P3@P2]"), + /* 13 */ "Goto" OpHelp(""), + /* 14 */ "Gosub" OpHelp(""), + /* 15 */ "InitCoroutine" OpHelp(""), + /* 16 */ "Yield" OpHelp(""), + /* 17 */ "MustBeInt" OpHelp(""), + /* 18 */ "Jump" OpHelp(""), + /* 19 */ "Not" OpHelp("r[P2]= !r[P1]"), + /* 20 */ "Once" OpHelp(""), + /* 21 */ "If" OpHelp(""), + /* 22 */ "IfNot" OpHelp(""), + /* 23 */ "SeekLT" OpHelp("key=r[P3@P4]"), + /* 24 */ "SeekLE" OpHelp("key=r[P3@P4]"), + /* 25 */ "SeekGE" OpHelp("key=r[P3@P4]"), + /* 26 */ "SeekGT" OpHelp("key=r[P3@P4]"), + /* 27 */ "Or" OpHelp("r[P3]=(r[P1] || r[P2])"), + /* 28 */ "And" OpHelp("r[P3]=(r[P1] && r[P2])"), + /* 29 */ "NoConflict" OpHelp("key=r[P3@P4]"), + /* 30 */ "NotFound" OpHelp("key=r[P3@P4]"), + /* 31 */ "Found" OpHelp("key=r[P3@P4]"), + /* 32 */ "SeekRowid" OpHelp("intkey=r[P3]"), + /* 33 */ "NotExists" OpHelp("intkey=r[P3]"), + /* 34 */ "IsNull" OpHelp("if r[P1]==NULL goto P2"), + /* 35 */ "NotNull" OpHelp("if r[P1]!=NULL goto P2"), + /* 36 */ "Ne" OpHelp("IF r[P3]!=r[P1]"), + /* 37 */ "Eq" OpHelp("IF r[P3]==r[P1]"), + /* 38 */ "Gt" OpHelp("IF r[P3]>r[P1]"), + /* 39 */ "Le" OpHelp("IF r[P3]<=r[P1]"), + /* 40 */ "Lt" OpHelp("IF r[P3]=r[P1]"), + /* 42 */ "ElseNotEq" OpHelp(""), + /* 43 */ "BitAnd" OpHelp("r[P3]=r[P1]&r[P2]"), + /* 44 */ "BitOr" OpHelp("r[P3]=r[P1]|r[P2]"), + /* 45 */ "ShiftLeft" OpHelp("r[P3]=r[P2]<>r[P1]"), + /* 47 */ "Add" OpHelp("r[P3]=r[P1]+r[P2]"), + /* 48 */ "Subtract" OpHelp("r[P3]=r[P2]-r[P1]"), + /* 49 */ "Multiply" OpHelp("r[P3]=r[P1]*r[P2]"), + /* 50 */ "Divide" OpHelp("r[P3]=r[P2]/r[P1]"), + /* 51 */ "Remainder" OpHelp("r[P3]=r[P2]%r[P1]"), + /* 52 */ "Concat" OpHelp("r[P3]=r[P2]+r[P1]"), + /* 53 */ "Last" OpHelp(""), + /* 54 */ "BitNot" OpHelp("r[P1]= ~r[P1]"), + /* 55 */ "SorterSort" OpHelp(""), + /* 56 */ "Sort" OpHelp(""), + /* 57 */ "Rewind" OpHelp(""), + /* 58 */ "IdxLE" OpHelp("key=r[P3@P4]"), + /* 59 */ "IdxGT" OpHelp("key=r[P3@P4]"), + /* 60 */ "IdxLT" OpHelp("key=r[P3@P4]"), + /* 61 */ "IdxGE" OpHelp("key=r[P3@P4]"), + /* 62 */ "RowSetRead" OpHelp("r[P3]=rowset(P1)"), + /* 63 */ "RowSetTest" OpHelp("if r[P3] in rowset(P1) goto P2"), + /* 64 */ "Program" OpHelp(""), + /* 65 */ "FkIfZero" OpHelp("if fkctr[P1]==0 goto P2"), + /* 66 */ "IfPos" OpHelp("if r[P1]>0 then r[P1]-=P3, goto P2"), + /* 67 */ "IfNotZero" OpHelp("if r[P1]!=0 then r[P1]-=P3, goto P2"), + /* 68 */ "DecrJumpZero" OpHelp("if (--r[P1])==0 goto P2"), + /* 69 */ "IncrVacuum" OpHelp(""), + /* 70 */ "VNext" OpHelp(""), + /* 71 */ "Init" OpHelp("Start at P2"), + /* 72 */ "Return" OpHelp(""), + /* 73 */ "EndCoroutine" OpHelp(""), + /* 74 */ "HaltIfNull" OpHelp("if r[P3]=null halt"), + /* 75 */ "Halt" OpHelp(""), + /* 76 */ "Integer" OpHelp("r[P2]=P1"), + /* 77 */ "Int64" OpHelp("r[P2]=P4"), + /* 78 */ "String" OpHelp("r[P2]='P4' (len=P1)"), + /* 79 */ "Null" OpHelp("r[P2..P3]=NULL"), + /* 80 */ "SoftNull" OpHelp("r[P1]=NULL"), + /* 81 */ "Blob" OpHelp("r[P2]=P4 (len=P1)"), + /* 82 */ "Variable" OpHelp("r[P2]=parameter(P1,P4)"), + /* 83 */ "Move" OpHelp("r[P2@P3]=r[P1@P3]"), + /* 84 */ "Copy" OpHelp("r[P2@P3+1]=r[P1@P3+1]"), + /* 85 */ "SCopy" OpHelp("r[P2]=r[P1]"), + /* 86 */ "IntCopy" OpHelp("r[P2]=r[P1]"), + /* 87 */ "ResultRow" OpHelp("output=r[P1@P2]"), + /* 88 */ "CollSeq" OpHelp(""), + /* 89 */ "Function0" OpHelp("r[P3]=func(r[P2@P5])"), + /* 90 */ "Function" OpHelp("r[P3]=func(r[P2@P5])"), + /* 91 */ "AddImm" OpHelp("r[P1]=r[P1]+P2"), + /* 92 */ "RealAffinity" OpHelp(""), + /* 93 */ "Cast" OpHelp("affinity(r[P1])"), + /* 94 */ "Permutation" OpHelp(""), + /* 95 */ "Compare" OpHelp("r[P1@P3] <-> r[P2@P3]"), + /* 96 */ "Column" OpHelp("r[P3]=PX"), + /* 97 */ "String8" OpHelp("r[P2]='P4'"), + /* 98 */ "Affinity" OpHelp("affinity(r[P1@P2])"), + /* 99 */ "MakeRecord" OpHelp("r[P3]=mkrec(r[P1@P2])"), + /* 100 */ "Count" OpHelp("r[P2]=count()"), + /* 101 */ "ReadCookie" OpHelp(""), + /* 102 */ "SetCookie" OpHelp(""), + /* 103 */ "ReopenIdx" OpHelp("root=P2 iDb=P3"), + /* 104 */ "OpenRead" OpHelp("root=P2 iDb=P3"), + /* 105 */ "OpenWrite" OpHelp("root=P2 iDb=P3"), + /* 106 */ "OpenAutoindex" OpHelp("nColumn=P2"), + /* 107 */ "OpenEphemeral" OpHelp("nColumn=P2"), + /* 108 */ "SorterOpen" OpHelp(""), + /* 109 */ "SequenceTest" OpHelp("if( cursor[P1].ctr++ ) pc = P2"), + /* 110 */ "OpenPseudo" OpHelp("P3 columns in r[P2]"), + /* 111 */ "Close" OpHelp(""), + /* 112 */ "ColumnsUsed" OpHelp(""), + /* 113 */ "Sequence" OpHelp("r[P2]=cursor[P1].ctr++"), + /* 114 */ "NewRowid" OpHelp("r[P2]=rowid"), + /* 115 */ "Insert" OpHelp("intkey=r[P3] data=r[P2]"), + /* 116 */ "InsertInt" OpHelp("intkey=P3 data=r[P2]"), + /* 117 */ "Delete" OpHelp(""), + /* 118 */ "ResetCount" OpHelp(""), + /* 119 */ "SorterCompare" OpHelp("if key(P1)!=trim(r[P3],P4) goto P2"), + /* 120 */ "SorterData" OpHelp("r[P2]=data"), + /* 121 */ "RowKey" OpHelp("r[P2]=key"), + /* 122 */ "RowData" OpHelp("r[P2]=data"), + /* 123 */ "Rowid" OpHelp("r[P2]=rowid"), + /* 124 */ "NullRow" OpHelp(""), + /* 125 */ "SorterInsert" OpHelp(""), + /* 126 */ "IdxInsert" OpHelp("key=r[P2]"), + /* 127 */ "IdxDelete" OpHelp("key=r[P2@P3]"), + /* 128 */ "Seek" OpHelp("Move P3 to P1.rowid"), + /* 129 */ "IdxRowid" OpHelp("r[P2]=rowid"), + /* 130 */ "Destroy" OpHelp(""), + /* 131 */ "Clear" OpHelp(""), + /* 132 */ "Real" OpHelp("r[P2]=P4"), + /* 133 */ "ResetSorter" OpHelp(""), + /* 134 */ "CreateIndex" OpHelp("r[P2]=root iDb=P1"), + /* 135 */ "CreateTable" OpHelp("r[P2]=root iDb=P1"), + /* 136 */ "ParseSchema" OpHelp(""), + /* 137 */ "LoadAnalysis" OpHelp(""), + /* 138 */ "DropTable" OpHelp(""), + /* 139 */ "DropIndex" OpHelp(""), + /* 140 */ "DropTrigger" OpHelp(""), + /* 141 */ "IntegrityCk" OpHelp(""), + /* 142 */ "RowSetAdd" OpHelp("rowset(P1)=r[P2]"), + /* 143 */ "Param" OpHelp(""), + /* 144 */ "FkCounter" OpHelp("fkctr[P1]+=P2"), + /* 145 */ "MemMax" OpHelp("r[P1]=max(r[P1],r[P2])"), + /* 146 */ "OffsetLimit" OpHelp("if r[P1]>0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1)"), + /* 147 */ "AggStep0" OpHelp("accum=r[P3] step(r[P2@P5])"), + /* 148 */ "AggStep" OpHelp("accum=r[P3] step(r[P2@P5])"), + /* 149 */ "AggFinal" OpHelp("accum=r[P1] N=P2"), + /* 150 */ "Expire" OpHelp(""), + /* 151 */ "TableLock" OpHelp("iDb=P1 root=P2 write=P3"), + /* 152 */ "VBegin" OpHelp(""), + /* 153 */ "VCreate" OpHelp(""), + /* 154 */ "VDestroy" OpHelp(""), + /* 155 */ "VOpen" OpHelp(""), + /* 156 */ "VColumn" OpHelp("r[P3]=vcolumn(P2)"), + /* 157 */ "VRename" OpHelp(""), + /* 158 */ "Pagecount" OpHelp(""), + /* 159 */ "MaxPgcnt" OpHelp(""), + /* 160 */ "CursorHint" OpHelp(""), + /* 161 */ "Noop" OpHelp(""), + /* 162 */ "Explain" OpHelp(""), + }; + return azName[i]; +} +#endif + +/************** End of opcodes.c *********************************************/ +/************** Begin file os_unix.c *****************************************/ +/* +** 2004 May 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 file contains the VFS implementation for unix-like operating systems +** include Linux, MacOSX, *BSD, QNX, VxWorks, AIX, HPUX, and others. +** +** There are actually several different VFS implementations in this file. +** The differences are in the way that file locking is done. The default +** implementation uses Posix Advisory Locks. Alternative implementations +** use flock(), dot-files, various proprietary locking schemas, or simply +** skip locking all together. +** +** This source file is organized into divisions where the logic for various +** subfunctions is contained within the appropriate division. PLEASE +** KEEP THE STRUCTURE OF THIS FILE INTACT. New code should be placed +** in the correct division and should be clearly labeled. +** +** The layout of divisions is as follows: +** +** * General-purpose declarations and utility functions. +** * Unique file ID logic used by VxWorks. +** * Various locking primitive implementations (all except proxy locking): +** + for Posix Advisory Locks +** + for no-op locks +** + for dot-file locks +** + for flock() locking +** + for named semaphore locks (VxWorks only) +** + for AFP filesystem locks (MacOSX only) +** * sqlite3_file methods not associated with locking. +** * Definitions of sqlite3_io_methods objects for all locking +** methods plus "finder" functions for each locking method. +** * sqlite3_vfs method implementations. +** * Locking primitives for the proxy uber-locking-method. (MacOSX only) +** * Definitions of sqlite3_vfs objects for all locking methods +** plus implementations of sqlite3_os_init() and sqlite3_os_end(). +*/ +/* #include "sqliteInt.h" */ +#if SQLITE_OS_UNIX /* This file is used on unix only */ + +/* +** There are various methods for file locking used for concurrency +** control: +** +** 1. POSIX locking (the default), +** 2. No locking, +** 3. Dot-file locking, +** 4. flock() locking, +** 5. AFP locking (OSX only), +** 6. Named POSIX semaphores (VXWorks only), +** 7. proxy locking. (OSX only) +** +** Styles 4, 5, and 7 are only available of SQLITE_ENABLE_LOCKING_STYLE +** is defined to 1. The SQLITE_ENABLE_LOCKING_STYLE also enables automatic +** selection of the appropriate locking style based on the filesystem +** where the database is located. +*/ +#if !defined(SQLITE_ENABLE_LOCKING_STYLE) +# if defined(__APPLE__) +# define SQLITE_ENABLE_LOCKING_STYLE 1 +# else +# define SQLITE_ENABLE_LOCKING_STYLE 0 +# endif +#endif + +/* Use pread() and pwrite() if they are available */ +#if defined(__APPLE__) +# define HAVE_PREAD 1 +# define HAVE_PWRITE 1 +#endif +#if defined(HAVE_PREAD64) && defined(HAVE_PWRITE64) +# undef USE_PREAD +# define USE_PREAD64 1 +#elif defined(HAVE_PREAD) && defined(HAVE_PWRITE) +# undef USE_PREAD64 +# define USE_PREAD 1 +#endif + +/* +** standard include files. +*/ +#include +#include +#include +#include +/* #include */ +#include +#include +#if !defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0 +# include +#endif + +#if SQLITE_ENABLE_LOCKING_STYLE +# include +# include +# include +#endif /* SQLITE_ENABLE_LOCKING_STYLE */ + +#if defined(__APPLE__) && ((__MAC_OS_X_VERSION_MIN_REQUIRED > 1050) || \ + (__IPHONE_OS_VERSION_MIN_REQUIRED > 2000)) +# if (!defined(TARGET_OS_EMBEDDED) || (TARGET_OS_EMBEDDED==0)) \ + && (!defined(TARGET_IPHONE_SIMULATOR) || (TARGET_IPHONE_SIMULATOR==0)) +# define HAVE_GETHOSTUUID 1 +# else +# warning "gethostuuid() is disabled." +# endif +#endif + + +#if OS_VXWORKS +/* # include */ +# include +# include +#endif /* OS_VXWORKS */ + +#if defined(__APPLE__) || SQLITE_ENABLE_LOCKING_STYLE +# include +#endif + +#ifdef HAVE_UTIME +# include +#endif + +/* +** Allowed values of unixFile.fsFlags +*/ +#define SQLITE_FSFLAGS_IS_MSDOS 0x1 + +/* +** If we are to be thread-safe, include the pthreads header and define +** the SQLITE_UNIX_THREADS macro. +*/ +#if SQLITE_THREADSAFE +/* # include */ +# define SQLITE_UNIX_THREADS 1 +#endif + +/* +** Default permissions when creating a new file +*/ +#ifndef SQLITE_DEFAULT_FILE_PERMISSIONS +# define SQLITE_DEFAULT_FILE_PERMISSIONS 0644 +#endif + +/* +** Default permissions when creating auto proxy dir +*/ +#ifndef SQLITE_DEFAULT_PROXYDIR_PERMISSIONS +# define SQLITE_DEFAULT_PROXYDIR_PERMISSIONS 0755 +#endif + +/* +** Maximum supported path-length. +*/ +#define MAX_PATHNAME 512 + +/* +** Maximum supported symbolic links +*/ +#define SQLITE_MAX_SYMLINKS 100 + +/* Always cast the getpid() return type for compatibility with +** kernel modules in VxWorks. */ +#define osGetpid(X) (pid_t)getpid() + +/* +** Only set the lastErrno if the error code is a real error and not +** a normal expected return code of SQLITE_BUSY or SQLITE_OK +*/ +#define IS_LOCK_ERROR(x) ((x != SQLITE_OK) && (x != SQLITE_BUSY)) + +/* Forward references */ +typedef struct unixShm unixShm; /* Connection shared memory */ +typedef struct unixShmNode unixShmNode; /* Shared memory instance */ +typedef struct unixInodeInfo unixInodeInfo; /* An i-node */ +typedef struct UnixUnusedFd UnixUnusedFd; /* An unused file descriptor */ + +/* +** Sometimes, after a file handle is closed by SQLite, the file descriptor +** cannot be closed immediately. In these cases, instances of the following +** structure are used to store the file descriptor while waiting for an +** opportunity to either close or reuse it. +*/ +struct UnixUnusedFd { + int fd; /* File descriptor to close */ + int flags; /* Flags this file descriptor was opened with */ + UnixUnusedFd *pNext; /* Next unused file descriptor on same file */ +}; + +/* +** The unixFile structure is subclass of sqlite3_file specific to the unix +** VFS implementations. +*/ +typedef struct unixFile unixFile; +struct unixFile { + sqlite3_io_methods const *pMethod; /* Always the first entry */ + sqlite3_vfs *pVfs; /* The VFS that created this unixFile */ + unixInodeInfo *pInode; /* Info about locks on this inode */ + int h; /* The file descriptor */ + unsigned char eFileLock; /* The type of lock held on this fd */ + unsigned short int ctrlFlags; /* Behavioral bits. UNIXFILE_* flags */ + int lastErrno; /* The unix errno from last I/O error */ + void *lockingContext; /* Locking style specific state */ + UnixUnusedFd *pUnused; /* Pre-allocated UnixUnusedFd */ + const char *zPath; /* Name of the file */ + unixShm *pShm; /* Shared memory segment information */ + int szChunk; /* Configured by FCNTL_CHUNK_SIZE */ +#if SQLITE_MAX_MMAP_SIZE>0 + int nFetchOut; /* Number of outstanding xFetch refs */ + sqlite3_int64 mmapSize; /* Usable size of mapping at pMapRegion */ + sqlite3_int64 mmapSizeActual; /* Actual size of mapping at pMapRegion */ + sqlite3_int64 mmapSizeMax; /* Configured FCNTL_MMAP_SIZE value */ + void *pMapRegion; /* Memory mapped region */ +#endif +#ifdef __QNXNTO__ + int sectorSize; /* Device sector size */ + int deviceCharacteristics; /* Precomputed device characteristics */ +#endif +#if SQLITE_ENABLE_LOCKING_STYLE + int openFlags; /* The flags specified at open() */ +#endif +#if SQLITE_ENABLE_LOCKING_STYLE || defined(__APPLE__) + unsigned fsFlags; /* cached details from statfs() */ +#endif +#if OS_VXWORKS + struct vxworksFileId *pId; /* Unique file ID */ +#endif +#ifdef SQLITE_DEBUG + /* The next group of variables are used to track whether or not the + ** transaction counter in bytes 24-27 of database files are updated + ** whenever any part of the database changes. An assertion fault will + ** occur if a file is updated without also updating the transaction + ** counter. This test is made to avoid new problems similar to the + ** one described by ticket #3584. + */ + unsigned char transCntrChng; /* True if the transaction counter changed */ + unsigned char dbUpdate; /* True if any part of database file changed */ + unsigned char inNormalWrite; /* True if in a normal write operation */ + +#endif + +#ifdef SQLITE_TEST + /* In test mode, increase the size of this structure a bit so that + ** it is larger than the struct CrashFile defined in test6.c. + */ + char aPadding[32]; +#endif +}; + +/* This variable holds the process id (pid) from when the xRandomness() +** method was called. If xOpen() is called from a different process id, +** indicating that a fork() has occurred, the PRNG will be reset. +*/ +static pid_t randomnessPid = 0; + +/* +** Allowed values for the unixFile.ctrlFlags bitmask: +*/ +#define UNIXFILE_EXCL 0x01 /* Connections from one process only */ +#define UNIXFILE_RDONLY 0x02 /* Connection is read only */ +#define UNIXFILE_PERSIST_WAL 0x04 /* Persistent WAL mode */ +#ifndef SQLITE_DISABLE_DIRSYNC +# define UNIXFILE_DIRSYNC 0x08 /* Directory sync needed */ +#else +# define UNIXFILE_DIRSYNC 0x00 +#endif +#define UNIXFILE_PSOW 0x10 /* SQLITE_IOCAP_POWERSAFE_OVERWRITE */ +#define UNIXFILE_DELETE 0x20 /* Delete on close */ +#define UNIXFILE_URI 0x40 /* Filename might have query parameters */ +#define UNIXFILE_NOLOCK 0x80 /* Do no file locking */ + +/* +** Include code that is common to all os_*.c files +*/ +/************** Include os_common.h in the middle of os_unix.c ***************/ +/************** Begin file os_common.h ***************************************/ +/* +** 2004 May 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 file contains macros and a little bit of code that is common to +** all of the platform-specific files (os_*.c) and is #included into those +** files. +** +** This file should be #included by the os_*.c files only. It is not a +** general purpose header file. +*/ +#ifndef _OS_COMMON_H_ +#define _OS_COMMON_H_ + +/* +** At least two bugs have slipped in because we changed the MEMORY_DEBUG +** macro to SQLITE_DEBUG and some older makefiles have not yet made the +** switch. The following code should catch this problem at compile-time. +*/ +#ifdef MEMORY_DEBUG +# error "The MEMORY_DEBUG macro is obsolete. Use SQLITE_DEBUG instead." +#endif + +/* +** Macros for performance tracing. Normally turned off. Only works +** on i486 hardware. +*/ +#ifdef SQLITE_PERFORMANCE_TRACE + +/* +** hwtime.h contains inline assembler code for implementing +** high-performance timing routines. +*/ +/************** Include hwtime.h in the middle of os_common.h ****************/ +/************** Begin file hwtime.h ******************************************/ +/* +** 2008 May 27 +** +** 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 inline asm code for retrieving "high-performance" +** counters for x86 class CPUs. +*/ +#ifndef SQLITE_HWTIME_H +#define SQLITE_HWTIME_H + +/* +** The following routine only works on pentium-class (or newer) processors. +** It uses the RDTSC opcode to read the cycle count value out of the +** processor and returns that value. This can be used for high-res +** profiling. +*/ +#if (defined(__GNUC__) || defined(_MSC_VER)) && \ + (defined(i386) || defined(__i386__) || defined(_M_IX86)) + + #if defined(__GNUC__) + + __inline__ sqlite_uint64 sqlite3Hwtime(void){ + unsigned int lo, hi; + __asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi)); + return (sqlite_uint64)hi << 32 | lo; + } + + #elif defined(_MSC_VER) + + __declspec(naked) __inline sqlite_uint64 __cdecl sqlite3Hwtime(void){ + __asm { + rdtsc + ret ; return value at EDX:EAX + } + } + + #endif + +#elif (defined(__GNUC__) && defined(__x86_64__)) + + __inline__ sqlite_uint64 sqlite3Hwtime(void){ + unsigned long val; + __asm__ __volatile__ ("rdtsc" : "=A" (val)); + return val; + } + +#elif (defined(__GNUC__) && defined(__ppc__)) + + __inline__ sqlite_uint64 sqlite3Hwtime(void){ + unsigned long long retval; + unsigned long junk; + __asm__ __volatile__ ("\n\ + 1: mftbu %1\n\ + mftb %L0\n\ + mftbu %0\n\ + cmpw %0,%1\n\ + bne 1b" + : "=r" (retval), "=r" (junk)); + return retval; + } + +#else + + #error Need implementation of sqlite3Hwtime() for your platform. + + /* + ** To compile without implementing sqlite3Hwtime() for your platform, + ** you can remove the above #error and use the following + ** stub function. You will lose timing support for many + ** of the debugging and testing utilities, but it should at + ** least compile and run. + */ +SQLITE_PRIVATE sqlite_uint64 sqlite3Hwtime(void){ return ((sqlite_uint64)0); } + +#endif + +#endif /* !defined(SQLITE_HWTIME_H) */ + +/************** End of hwtime.h **********************************************/ +/************** Continuing where we left off in os_common.h ******************/ + +static sqlite_uint64 g_start; +static sqlite_uint64 g_elapsed; +#define TIMER_START g_start=sqlite3Hwtime() +#define TIMER_END g_elapsed=sqlite3Hwtime()-g_start +#define TIMER_ELAPSED g_elapsed +#else +#define TIMER_START +#define TIMER_END +#define TIMER_ELAPSED ((sqlite_uint64)0) +#endif + +/* +** If we compile with the SQLITE_TEST macro set, then the following block +** of code will give us the ability to simulate a disk I/O error. This +** is used for testing the I/O recovery logic. +*/ +#if defined(SQLITE_TEST) +SQLITE_API extern int sqlite3_io_error_hit; +SQLITE_API extern int sqlite3_io_error_hardhit; +SQLITE_API extern int sqlite3_io_error_pending; +SQLITE_API extern int sqlite3_io_error_persist; +SQLITE_API extern int sqlite3_io_error_benign; +SQLITE_API extern int sqlite3_diskfull_pending; +SQLITE_API extern int sqlite3_diskfull; +#define SimulateIOErrorBenign(X) sqlite3_io_error_benign=(X) +#define SimulateIOError(CODE) \ + if( (sqlite3_io_error_persist && sqlite3_io_error_hit) \ + || sqlite3_io_error_pending-- == 1 ) \ + { local_ioerr(); CODE; } +static void local_ioerr(){ + IOTRACE(("IOERR\n")); + sqlite3_io_error_hit++; + if( !sqlite3_io_error_benign ) sqlite3_io_error_hardhit++; +} +#define SimulateDiskfullError(CODE) \ + if( sqlite3_diskfull_pending ){ \ + if( sqlite3_diskfull_pending == 1 ){ \ + local_ioerr(); \ + sqlite3_diskfull = 1; \ + sqlite3_io_error_hit = 1; \ + CODE; \ + }else{ \ + sqlite3_diskfull_pending--; \ + } \ + } +#else +#define SimulateIOErrorBenign(X) +#define SimulateIOError(A) +#define SimulateDiskfullError(A) +#endif /* defined(SQLITE_TEST) */ + +/* +** When testing, keep a count of the number of open files. +*/ +#if defined(SQLITE_TEST) +SQLITE_API extern int sqlite3_open_file_count; +#define OpenCounter(X) sqlite3_open_file_count+=(X) +#else +#define OpenCounter(X) +#endif /* defined(SQLITE_TEST) */ + +#endif /* !defined(_OS_COMMON_H_) */ + +/************** End of os_common.h *******************************************/ +/************** Continuing where we left off in os_unix.c ********************/ + +/* +** Define various macros that are missing from some systems. +*/ +#ifndef O_LARGEFILE +# define O_LARGEFILE 0 +#endif +#ifdef SQLITE_DISABLE_LFS +# undef O_LARGEFILE +# define O_LARGEFILE 0 +#endif +#ifndef O_NOFOLLOW +# define O_NOFOLLOW 0 +#endif +#ifndef O_BINARY +# define O_BINARY 0 +#endif + +/* +** The threadid macro resolves to the thread-id or to 0. Used for +** testing and debugging only. +*/ +#if SQLITE_THREADSAFE +#define threadid pthread_self() +#else +#define threadid 0 +#endif + +/* +** HAVE_MREMAP defaults to true on Linux and false everywhere else. +*/ +#if !defined(HAVE_MREMAP) +# if defined(__linux__) && defined(_GNU_SOURCE) +# define HAVE_MREMAP 1 +# else +# define HAVE_MREMAP 0 +# endif +#endif + +/* +** Explicitly call the 64-bit version of lseek() on Android. Otherwise, lseek() +** is the 32-bit version, even if _FILE_OFFSET_BITS=64 is defined. +*/ +#ifdef __ANDROID__ +# define lseek lseek64 +#endif + +/* +** Different Unix systems declare open() in different ways. Same use +** open(const char*,int,mode_t). Others use open(const char*,int,...). +** The difference is important when using a pointer to the function. +** +** The safest way to deal with the problem is to always use this wrapper +** which always has the same well-defined interface. +*/ +static int posixOpen(const char *zFile, int flags, int mode){ + return open(zFile, flags, mode); +} + +/* Forward reference */ +static int openDirectory(const char*, int*); +static int unixGetpagesize(void); + +/* +** Many system calls are accessed through pointer-to-functions so that +** they may be overridden at runtime to facilitate fault injection during +** testing and sandboxing. The following array holds the names and pointers +** to all overrideable system calls. +*/ +static struct unix_syscall { + const char *zName; /* Name of the system call */ + sqlite3_syscall_ptr pCurrent; /* Current value of the system call */ + sqlite3_syscall_ptr pDefault; /* Default value */ +} aSyscall[] = { + { "open", (sqlite3_syscall_ptr)posixOpen, 0 }, +#define osOpen ((int(*)(const char*,int,int))aSyscall[0].pCurrent) + + { "close", (sqlite3_syscall_ptr)close, 0 }, +#define osClose ((int(*)(int))aSyscall[1].pCurrent) + + { "access", (sqlite3_syscall_ptr)access, 0 }, +#define osAccess ((int(*)(const char*,int))aSyscall[2].pCurrent) + + { "getcwd", (sqlite3_syscall_ptr)getcwd, 0 }, +#define osGetcwd ((char*(*)(char*,size_t))aSyscall[3].pCurrent) + + { "stat", (sqlite3_syscall_ptr)stat, 0 }, +#define osStat ((int(*)(const char*,struct stat*))aSyscall[4].pCurrent) + +/* +** The DJGPP compiler environment looks mostly like Unix, but it +** lacks the fcntl() system call. So redefine fcntl() to be something +** that always succeeds. This means that locking does not occur under +** DJGPP. But it is DOS - what did you expect? +*/ +#ifdef __DJGPP__ + { "fstat", 0, 0 }, +#define osFstat(a,b,c) 0 +#else + { "fstat", (sqlite3_syscall_ptr)fstat, 0 }, +#define osFstat ((int(*)(int,struct stat*))aSyscall[5].pCurrent) +#endif + + { "ftruncate", (sqlite3_syscall_ptr)ftruncate, 0 }, +#define osFtruncate ((int(*)(int,off_t))aSyscall[6].pCurrent) + + { "fcntl", (sqlite3_syscall_ptr)fcntl, 0 }, +#define osFcntl ((int(*)(int,int,...))aSyscall[7].pCurrent) + + { "read", (sqlite3_syscall_ptr)read, 0 }, +#define osRead ((ssize_t(*)(int,void*,size_t))aSyscall[8].pCurrent) + +#if defined(USE_PREAD) || SQLITE_ENABLE_LOCKING_STYLE + { "pread", (sqlite3_syscall_ptr)pread, 0 }, +#else + { "pread", (sqlite3_syscall_ptr)0, 0 }, +#endif +#define osPread ((ssize_t(*)(int,void*,size_t,off_t))aSyscall[9].pCurrent) + +#if defined(USE_PREAD64) + { "pread64", (sqlite3_syscall_ptr)pread64, 0 }, +#else + { "pread64", (sqlite3_syscall_ptr)0, 0 }, +#endif +#define osPread64 ((ssize_t(*)(int,void*,size_t,off64_t))aSyscall[10].pCurrent) + + { "write", (sqlite3_syscall_ptr)write, 0 }, +#define osWrite ((ssize_t(*)(int,const void*,size_t))aSyscall[11].pCurrent) + +#if defined(USE_PREAD) || SQLITE_ENABLE_LOCKING_STYLE + { "pwrite", (sqlite3_syscall_ptr)pwrite, 0 }, +#else + { "pwrite", (sqlite3_syscall_ptr)0, 0 }, +#endif +#define osPwrite ((ssize_t(*)(int,const void*,size_t,off_t))\ + aSyscall[12].pCurrent) + +#if defined(USE_PREAD64) + { "pwrite64", (sqlite3_syscall_ptr)pwrite64, 0 }, +#else + { "pwrite64", (sqlite3_syscall_ptr)0, 0 }, +#endif +#define osPwrite64 ((ssize_t(*)(int,const void*,size_t,off64_t))\ + aSyscall[13].pCurrent) + + { "fchmod", (sqlite3_syscall_ptr)fchmod, 0 }, +#define osFchmod ((int(*)(int,mode_t))aSyscall[14].pCurrent) + +#if defined(HAVE_POSIX_FALLOCATE) && HAVE_POSIX_FALLOCATE + { "fallocate", (sqlite3_syscall_ptr)posix_fallocate, 0 }, +#else + { "fallocate", (sqlite3_syscall_ptr)0, 0 }, +#endif +#define osFallocate ((int(*)(int,off_t,off_t))aSyscall[15].pCurrent) + + { "unlink", (sqlite3_syscall_ptr)unlink, 0 }, +#define osUnlink ((int(*)(const char*))aSyscall[16].pCurrent) + + { "openDirectory", (sqlite3_syscall_ptr)openDirectory, 0 }, +#define osOpenDirectory ((int(*)(const char*,int*))aSyscall[17].pCurrent) + + { "mkdir", (sqlite3_syscall_ptr)mkdir, 0 }, +#define osMkdir ((int(*)(const char*,mode_t))aSyscall[18].pCurrent) + + { "rmdir", (sqlite3_syscall_ptr)rmdir, 0 }, +#define osRmdir ((int(*)(const char*))aSyscall[19].pCurrent) + +#if defined(HAVE_FCHOWN) + { "fchown", (sqlite3_syscall_ptr)fchown, 0 }, +#else + { "fchown", (sqlite3_syscall_ptr)0, 0 }, +#endif +#define osFchown ((int(*)(int,uid_t,gid_t))aSyscall[20].pCurrent) + + { "geteuid", (sqlite3_syscall_ptr)geteuid, 0 }, +#define osGeteuid ((uid_t(*)(void))aSyscall[21].pCurrent) + +#if !defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0 + { "mmap", (sqlite3_syscall_ptr)mmap, 0 }, +#else + { "mmap", (sqlite3_syscall_ptr)0, 0 }, +#endif +#define osMmap ((void*(*)(void*,size_t,int,int,int,off_t))aSyscall[22].pCurrent) + +#if !defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0 + { "munmap", (sqlite3_syscall_ptr)munmap, 0 }, +#else + { "munmap", (sqlite3_syscall_ptr)0, 0 }, +#endif +#define osMunmap ((void*(*)(void*,size_t))aSyscall[23].pCurrent) + +#if HAVE_MREMAP && (!defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0) + { "mremap", (sqlite3_syscall_ptr)mremap, 0 }, +#else + { "mremap", (sqlite3_syscall_ptr)0, 0 }, +#endif +#define osMremap ((void*(*)(void*,size_t,size_t,int,...))aSyscall[24].pCurrent) + +#if !defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0 + { "getpagesize", (sqlite3_syscall_ptr)unixGetpagesize, 0 }, +#else + { "getpagesize", (sqlite3_syscall_ptr)0, 0 }, +#endif +#define osGetpagesize ((int(*)(void))aSyscall[25].pCurrent) + +#if defined(HAVE_READLINK) + { "readlink", (sqlite3_syscall_ptr)readlink, 0 }, +#else + { "readlink", (sqlite3_syscall_ptr)0, 0 }, +#endif +#define osReadlink ((ssize_t(*)(const char*,char*,size_t))aSyscall[26].pCurrent) + +#if defined(HAVE_LSTAT) + { "lstat", (sqlite3_syscall_ptr)lstat, 0 }, +#else + { "lstat", (sqlite3_syscall_ptr)0, 0 }, +#endif +#define osLstat ((int(*)(const char*,struct stat*))aSyscall[27].pCurrent) + +}; /* End of the overrideable system calls */ + + +/* +** On some systems, calls to fchown() will trigger a message in a security +** log if they come from non-root processes. So avoid calling fchown() if +** we are not running as root. +*/ +static int robustFchown(int fd, uid_t uid, gid_t gid){ +#if defined(HAVE_FCHOWN) + return osGeteuid() ? 0 : osFchown(fd,uid,gid); +#else + return 0; +#endif +} + +/* +** This is the xSetSystemCall() method of sqlite3_vfs for all of the +** "unix" VFSes. Return SQLITE_OK opon successfully updating the +** system call pointer, or SQLITE_NOTFOUND if there is no configurable +** system call named zName. +*/ +static int unixSetSystemCall( + sqlite3_vfs *pNotUsed, /* The VFS pointer. Not used */ + const char *zName, /* Name of system call to override */ + sqlite3_syscall_ptr pNewFunc /* Pointer to new system call value */ +){ + unsigned int i; + int rc = SQLITE_NOTFOUND; + + UNUSED_PARAMETER(pNotUsed); + if( zName==0 ){ + /* If no zName is given, restore all system calls to their default + ** settings and return NULL + */ + rc = SQLITE_OK; + for(i=0; i=SQLITE_MINIMUM_FILE_DESCRIPTOR ) break; + osClose(fd); + sqlite3_log(SQLITE_WARNING, + "attempt to open \"%s\" as file descriptor %d", z, fd); + fd = -1; + if( osOpen("/dev/null", f, m)<0 ) break; + } + if( fd>=0 ){ + if( m!=0 ){ + struct stat statbuf; + if( osFstat(fd, &statbuf)==0 + && statbuf.st_size==0 + && (statbuf.st_mode&0777)!=m + ){ + osFchmod(fd, m); + } + } +#if defined(FD_CLOEXEC) && (!defined(O_CLOEXEC) || O_CLOEXEC==0) + osFcntl(fd, F_SETFD, osFcntl(fd, F_GETFD, 0) | FD_CLOEXEC); +#endif + } + return fd; +} + +/* +** Helper functions to obtain and relinquish the global mutex. The +** global mutex is used to protect the unixInodeInfo and +** vxworksFileId objects used by this file, all of which may be +** shared by multiple threads. +** +** Function unixMutexHeld() is used to assert() that the global mutex +** is held when required. This function is only used as part of assert() +** statements. e.g. +** +** unixEnterMutex() +** assert( unixMutexHeld() ); +** unixEnterLeave() +*/ +static void unixEnterMutex(void){ + sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_VFS1)); +} +static void unixLeaveMutex(void){ + sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_VFS1)); +} +#ifdef SQLITE_DEBUG +static int unixMutexHeld(void) { + return sqlite3_mutex_held(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_VFS1)); +} +#endif + + +#ifdef SQLITE_HAVE_OS_TRACE +/* +** Helper function for printing out trace information from debugging +** binaries. This returns the string representation of the supplied +** integer lock-type. +*/ +static const char *azFileLock(int eFileLock){ + switch( eFileLock ){ + case NO_LOCK: return "NONE"; + case SHARED_LOCK: return "SHARED"; + case RESERVED_LOCK: return "RESERVED"; + case PENDING_LOCK: return "PENDING"; + case EXCLUSIVE_LOCK: return "EXCLUSIVE"; + } + return "ERROR"; +} +#endif + +#ifdef SQLITE_LOCK_TRACE +/* +** Print out information about all locking operations. +** +** This routine is used for troubleshooting locks on multithreaded +** platforms. Enable by compiling with the -DSQLITE_LOCK_TRACE +** command-line option on the compiler. This code is normally +** turned off. +*/ +static int lockTrace(int fd, int op, struct flock *p){ + char *zOpName, *zType; + int s; + int savedErrno; + if( op==F_GETLK ){ + zOpName = "GETLK"; + }else if( op==F_SETLK ){ + zOpName = "SETLK"; + }else{ + s = osFcntl(fd, op, p); + sqlite3DebugPrintf("fcntl unknown %d %d %d\n", fd, op, s); + return s; + } + if( p->l_type==F_RDLCK ){ + zType = "RDLCK"; + }else if( p->l_type==F_WRLCK ){ + zType = "WRLCK"; + }else if( p->l_type==F_UNLCK ){ + zType = "UNLCK"; + }else{ + assert( 0 ); + } + assert( p->l_whence==SEEK_SET ); + s = osFcntl(fd, op, p); + savedErrno = errno; + sqlite3DebugPrintf("fcntl %d %d %s %s %d %d %d %d\n", + threadid, fd, zOpName, zType, (int)p->l_start, (int)p->l_len, + (int)p->l_pid, s); + if( s==(-1) && op==F_SETLK && (p->l_type==F_RDLCK || p->l_type==F_WRLCK) ){ + struct flock l2; + l2 = *p; + osFcntl(fd, F_GETLK, &l2); + if( l2.l_type==F_RDLCK ){ + zType = "RDLCK"; + }else if( l2.l_type==F_WRLCK ){ + zType = "WRLCK"; + }else if( l2.l_type==F_UNLCK ){ + zType = "UNLCK"; + }else{ + assert( 0 ); + } + sqlite3DebugPrintf("fcntl-failure-reason: %s %d %d %d\n", + zType, (int)l2.l_start, (int)l2.l_len, (int)l2.l_pid); + } + errno = savedErrno; + return s; +} +#undef osFcntl +#define osFcntl lockTrace +#endif /* SQLITE_LOCK_TRACE */ + +/* +** Retry ftruncate() calls that fail due to EINTR +** +** All calls to ftruncate() within this file should be made through +** this wrapper. On the Android platform, bypassing the logic below +** could lead to a corrupt database. +*/ +static int robust_ftruncate(int h, sqlite3_int64 sz){ + int rc; +#ifdef __ANDROID__ + /* On Android, ftruncate() always uses 32-bit offsets, even if + ** _FILE_OFFSET_BITS=64 is defined. This means it is unsafe to attempt to + ** truncate a file to any size larger than 2GiB. Silently ignore any + ** such attempts. */ + if( sz>(sqlite3_int64)0x7FFFFFFF ){ + rc = SQLITE_OK; + }else +#endif + do{ rc = osFtruncate(h,sz); }while( rc<0 && errno==EINTR ); + return rc; +} + +/* +** This routine translates a standard POSIX errno code into something +** useful to the clients of the sqlite3 functions. Specifically, it is +** intended to translate a variety of "try again" errors into SQLITE_BUSY +** and a variety of "please close the file descriptor NOW" errors into +** SQLITE_IOERR +** +** Errors during initialization of locks, or file system support for locks, +** should handle ENOLCK, ENOTSUP, EOPNOTSUPP separately. +*/ +static int sqliteErrorFromPosixError(int posixError, int sqliteIOErr) { + assert( (sqliteIOErr == SQLITE_IOERR_LOCK) || + (sqliteIOErr == SQLITE_IOERR_UNLOCK) || + (sqliteIOErr == SQLITE_IOERR_RDLOCK) || + (sqliteIOErr == SQLITE_IOERR_CHECKRESERVEDLOCK) ); + switch (posixError) { + case EACCES: + case EAGAIN: + case ETIMEDOUT: + case EBUSY: + case EINTR: + case ENOLCK: + /* random NFS retry error, unless during file system support + * introspection, in which it actually means what it says */ + return SQLITE_BUSY; + + case EPERM: + return SQLITE_PERM; + + default: + return sqliteIOErr; + } +} + + +/****************************************************************************** +****************** Begin Unique File ID Utility Used By VxWorks *************** +** +** On most versions of unix, we can get a unique ID for a file by concatenating +** the device number and the inode number. But this does not work on VxWorks. +** On VxWorks, a unique file id must be based on the canonical filename. +** +** A pointer to an instance of the following structure can be used as a +** unique file ID in VxWorks. Each instance of this structure contains +** a copy of the canonical filename. There is also a reference count. +** The structure is reclaimed when the number of pointers to it drops to +** zero. +** +** There are never very many files open at one time and lookups are not +** a performance-critical path, so it is sufficient to put these +** structures on a linked list. +*/ +struct vxworksFileId { + struct vxworksFileId *pNext; /* Next in a list of them all */ + int nRef; /* Number of references to this one */ + int nName; /* Length of the zCanonicalName[] string */ + char *zCanonicalName; /* Canonical filename */ +}; + +#if OS_VXWORKS +/* +** All unique filenames are held on a linked list headed by this +** variable: +*/ +static struct vxworksFileId *vxworksFileList = 0; + +/* +** Simplify a filename into its canonical form +** by making the following changes: +** +** * removing any trailing and duplicate / +** * convert /./ into just / +** * convert /A/../ where A is any simple name into just / +** +** Changes are made in-place. Return the new name length. +** +** The original filename is in z[0..n-1]. Return the number of +** characters in the simplified name. +*/ +static int vxworksSimplifyName(char *z, int n){ + int i, j; + while( n>1 && z[n-1]=='/' ){ n--; } + for(i=j=0; i0 && z[j-1]!='/' ){ j--; } + if( j>0 ){ j--; } + i += 2; + continue; + } + } + z[j++] = z[i]; + } + z[j] = 0; + return j; +} + +/* +** Find a unique file ID for the given absolute pathname. Return +** a pointer to the vxworksFileId object. This pointer is the unique +** file ID. +** +** The nRef field of the vxworksFileId object is incremented before +** the object is returned. A new vxworksFileId object is created +** and added to the global list if necessary. +** +** If a memory allocation error occurs, return NULL. +*/ +static struct vxworksFileId *vxworksFindFileId(const char *zAbsoluteName){ + struct vxworksFileId *pNew; /* search key and new file ID */ + struct vxworksFileId *pCandidate; /* For looping over existing file IDs */ + int n; /* Length of zAbsoluteName string */ + + assert( zAbsoluteName[0]=='/' ); + n = (int)strlen(zAbsoluteName); + pNew = sqlite3_malloc64( sizeof(*pNew) + (n+1) ); + if( pNew==0 ) return 0; + pNew->zCanonicalName = (char*)&pNew[1]; + memcpy(pNew->zCanonicalName, zAbsoluteName, n+1); + n = vxworksSimplifyName(pNew->zCanonicalName, n); + + /* Search for an existing entry that matching the canonical name. + ** If found, increment the reference count and return a pointer to + ** the existing file ID. + */ + unixEnterMutex(); + for(pCandidate=vxworksFileList; pCandidate; pCandidate=pCandidate->pNext){ + if( pCandidate->nName==n + && memcmp(pCandidate->zCanonicalName, pNew->zCanonicalName, n)==0 + ){ + sqlite3_free(pNew); + pCandidate->nRef++; + unixLeaveMutex(); + return pCandidate; + } + } + + /* No match was found. We will make a new file ID */ + pNew->nRef = 1; + pNew->nName = n; + pNew->pNext = vxworksFileList; + vxworksFileList = pNew; + unixLeaveMutex(); + return pNew; +} + +/* +** Decrement the reference count on a vxworksFileId object. Free +** the object when the reference count reaches zero. +*/ +static void vxworksReleaseFileId(struct vxworksFileId *pId){ + unixEnterMutex(); + assert( pId->nRef>0 ); + pId->nRef--; + if( pId->nRef==0 ){ + struct vxworksFileId **pp; + for(pp=&vxworksFileList; *pp && *pp!=pId; pp = &((*pp)->pNext)){} + assert( *pp==pId ); + *pp = pId->pNext; + sqlite3_free(pId); + } + unixLeaveMutex(); +} +#endif /* OS_VXWORKS */ +/*************** End of Unique File ID Utility Used By VxWorks **************** +******************************************************************************/ + + +/****************************************************************************** +*************************** Posix Advisory Locking **************************** +** +** POSIX advisory locks are broken by design. ANSI STD 1003.1 (1996) +** section 6.5.2.2 lines 483 through 490 specify that when a process +** sets or clears a lock, that operation overrides any prior locks set +** by the same process. It does not explicitly say so, but this implies +** that it overrides locks set by the same process using a different +** file descriptor. Consider this test case: +** +** int fd1 = open("./file1", O_RDWR|O_CREAT, 0644); +** int fd2 = open("./file2", O_RDWR|O_CREAT, 0644); +** +** Suppose ./file1 and ./file2 are really the same file (because +** one is a hard or symbolic link to the other) then if you set +** an exclusive lock on fd1, then try to get an exclusive lock +** on fd2, it works. I would have expected the second lock to +** fail since there was already a lock on the file due to fd1. +** But not so. Since both locks came from the same process, the +** second overrides the first, even though they were on different +** file descriptors opened on different file names. +** +** This means that we cannot use POSIX locks to synchronize file access +** among competing threads of the same process. POSIX locks will work fine +** to synchronize access for threads in separate processes, but not +** threads within the same process. +** +** To work around the problem, SQLite has to manage file locks internally +** on its own. Whenever a new database is opened, we have to find the +** specific inode of the database file (the inode is determined by the +** st_dev and st_ino fields of the stat structure that fstat() fills in) +** and check for locks already existing on that inode. When locks are +** created or removed, we have to look at our own internal record of the +** locks to see if another thread has previously set a lock on that same +** inode. +** +** (Aside: The use of inode numbers as unique IDs does not work on VxWorks. +** For VxWorks, we have to use the alternative unique ID system based on +** canonical filename and implemented in the previous division.) +** +** The sqlite3_file structure for POSIX is no longer just an integer file +** descriptor. It is now a structure that holds the integer file +** descriptor and a pointer to a structure that describes the internal +** locks on the corresponding inode. There is one locking structure +** per inode, so if the same inode is opened twice, both unixFile structures +** point to the same locking structure. The locking structure keeps +** a reference count (so we will know when to delete it) and a "cnt" +** field that tells us its internal lock status. cnt==0 means the +** file is unlocked. cnt==-1 means the file has an exclusive lock. +** cnt>0 means there are cnt shared locks on the file. +** +** Any attempt to lock or unlock a file first checks the locking +** structure. The fcntl() system call is only invoked to set a +** POSIX lock if the internal lock structure transitions between +** a locked and an unlocked state. +** +** But wait: there are yet more problems with POSIX advisory locks. +** +** If you close a file descriptor that points to a file that has locks, +** all locks on that file that are owned by the current process are +** released. To work around this problem, each unixInodeInfo object +** maintains a count of the number of pending locks on tha inode. +** When an attempt is made to close an unixFile, if there are +** other unixFile open on the same inode that are holding locks, the call +** to close() the file descriptor is deferred until all of the locks clear. +** The unixInodeInfo structure keeps a list of file descriptors that need to +** be closed and that list is walked (and cleared) when the last lock +** clears. +** +** Yet another problem: LinuxThreads do not play well with posix locks. +** +** Many older versions of linux use the LinuxThreads library which is +** not posix compliant. Under LinuxThreads, a lock created by thread +** A cannot be modified or overridden by a different thread B. +** Only thread A can modify the lock. Locking behavior is correct +** if the appliation uses the newer Native Posix Thread Library (NPTL) +** on linux - with NPTL a lock created by thread A can override locks +** in thread B. But there is no way to know at compile-time which +** threading library is being used. So there is no way to know at +** compile-time whether or not thread A can override locks on thread B. +** One has to do a run-time check to discover the behavior of the +** current process. +** +** SQLite used to support LinuxThreads. But support for LinuxThreads +** was dropped beginning with version 3.7.0. SQLite will still work with +** LinuxThreads provided that (1) there is no more than one connection +** per database file in the same process and (2) database connections +** do not move across threads. +*/ + +/* +** An instance of the following structure serves as the key used +** to locate a particular unixInodeInfo object. +*/ +struct unixFileId { + dev_t dev; /* Device number */ +#if OS_VXWORKS + struct vxworksFileId *pId; /* Unique file ID for vxworks. */ +#else + ino_t ino; /* Inode number */ +#endif +}; + +/* +** An instance of the following structure is allocated for each open +** inode. Or, on LinuxThreads, there is one of these structures for +** each inode opened by each thread. +** +** A single inode can have multiple file descriptors, so each unixFile +** structure contains a pointer to an instance of this object and this +** object keeps a count of the number of unixFile pointing to it. +*/ +struct unixInodeInfo { + struct unixFileId fileId; /* The lookup key */ + int nShared; /* Number of SHARED locks held */ + unsigned char eFileLock; /* One of SHARED_LOCK, RESERVED_LOCK etc. */ + unsigned char bProcessLock; /* An exclusive process lock is held */ + int nRef; /* Number of pointers to this structure */ + unixShmNode *pShmNode; /* Shared memory associated with this inode */ + int nLock; /* Number of outstanding file locks */ + UnixUnusedFd *pUnused; /* Unused file descriptors to close */ + unixInodeInfo *pNext; /* List of all unixInodeInfo objects */ + unixInodeInfo *pPrev; /* .... doubly linked */ +#if SQLITE_ENABLE_LOCKING_STYLE + unsigned long long sharedByte; /* for AFP simulated shared lock */ +#endif +#if OS_VXWORKS + sem_t *pSem; /* Named POSIX semaphore */ + char aSemName[MAX_PATHNAME+2]; /* Name of that semaphore */ +#endif +}; + +/* +** A lists of all unixInodeInfo objects. +*/ +static unixInodeInfo *inodeList = 0; + +/* +** +** This function - unixLogErrorAtLine(), is only ever called via the macro +** unixLogError(). +** +** It is invoked after an error occurs in an OS function and errno has been +** set. It logs a message using sqlite3_log() containing the current value of +** errno and, if possible, the human-readable equivalent from strerror() or +** strerror_r(). +** +** The first argument passed to the macro should be the error code that +** will be returned to SQLite (e.g. SQLITE_IOERR_DELETE, SQLITE_CANTOPEN). +** The two subsequent arguments should be the name of the OS function that +** failed (e.g. "unlink", "open") and the associated file-system path, +** if any. +*/ +#define unixLogError(a,b,c) unixLogErrorAtLine(a,b,c,__LINE__) +static int unixLogErrorAtLine( + int errcode, /* SQLite error code */ + const char *zFunc, /* Name of OS function that failed */ + const char *zPath, /* File path associated with error */ + int iLine /* Source line number where error occurred */ +){ + char *zErr; /* Message from strerror() or equivalent */ + int iErrno = errno; /* Saved syscall error number */ + + /* If this is not a threadsafe build (SQLITE_THREADSAFE==0), then use + ** the strerror() function to obtain the human-readable error message + ** equivalent to errno. Otherwise, use strerror_r(). + */ +#if SQLITE_THREADSAFE && defined(HAVE_STRERROR_R) + char aErr[80]; + memset(aErr, 0, sizeof(aErr)); + zErr = aErr; + + /* If STRERROR_R_CHAR_P (set by autoconf scripts) or __USE_GNU is defined, + ** assume that the system provides the GNU version of strerror_r() that + ** returns a pointer to a buffer containing the error message. That pointer + ** may point to aErr[], or it may point to some static storage somewhere. + ** Otherwise, assume that the system provides the POSIX version of + ** strerror_r(), which always writes an error message into aErr[]. + ** + ** If the code incorrectly assumes that it is the POSIX version that is + ** available, the error message will often be an empty string. Not a + ** huge problem. Incorrectly concluding that the GNU version is available + ** could lead to a segfault though. + */ +#if defined(STRERROR_R_CHAR_P) || defined(__USE_GNU) + zErr = +# endif + strerror_r(iErrno, aErr, sizeof(aErr)-1); + +#elif SQLITE_THREADSAFE + /* This is a threadsafe build, but strerror_r() is not available. */ + zErr = ""; +#else + /* Non-threadsafe build, use strerror(). */ + zErr = strerror(iErrno); +#endif + + if( zPath==0 ) zPath = ""; + sqlite3_log(errcode, + "os_unix.c:%d: (%d) %s(%s) - %s", + iLine, iErrno, zFunc, zPath, zErr + ); + + return errcode; +} + +/* +** Close a file descriptor. +** +** We assume that close() almost always works, since it is only in a +** very sick application or on a very sick platform that it might fail. +** If it does fail, simply leak the file descriptor, but do log the +** error. +** +** Note that it is not safe to retry close() after EINTR since the +** file descriptor might have already been reused by another thread. +** So we don't even try to recover from an EINTR. Just log the error +** and move on. +*/ +static void robust_close(unixFile *pFile, int h, int lineno){ + if( osClose(h) ){ + unixLogErrorAtLine(SQLITE_IOERR_CLOSE, "close", + pFile ? pFile->zPath : 0, lineno); + } +} + +/* +** Set the pFile->lastErrno. Do this in a subroutine as that provides +** a convenient place to set a breakpoint. +*/ +static void storeLastErrno(unixFile *pFile, int error){ + pFile->lastErrno = error; +} + +/* +** Close all file descriptors accumuated in the unixInodeInfo->pUnused list. +*/ +static void closePendingFds(unixFile *pFile){ + unixInodeInfo *pInode = pFile->pInode; + UnixUnusedFd *p; + UnixUnusedFd *pNext; + for(p=pInode->pUnused; p; p=pNext){ + pNext = p->pNext; + robust_close(pFile, p->fd, __LINE__); + sqlite3_free(p); + } + pInode->pUnused = 0; +} + +/* +** Release a unixInodeInfo structure previously allocated by findInodeInfo(). +** +** The mutex entered using the unixEnterMutex() function must be held +** when this function is called. +*/ +static void releaseInodeInfo(unixFile *pFile){ + unixInodeInfo *pInode = pFile->pInode; + assert( unixMutexHeld() ); + if( ALWAYS(pInode) ){ + pInode->nRef--; + if( pInode->nRef==0 ){ + assert( pInode->pShmNode==0 ); + closePendingFds(pFile); + if( pInode->pPrev ){ + assert( pInode->pPrev->pNext==pInode ); + pInode->pPrev->pNext = pInode->pNext; + }else{ + assert( inodeList==pInode ); + inodeList = pInode->pNext; + } + if( pInode->pNext ){ + assert( pInode->pNext->pPrev==pInode ); + pInode->pNext->pPrev = pInode->pPrev; + } + sqlite3_free(pInode); + } + } +} + +/* +** Given a file descriptor, locate the unixInodeInfo object that +** describes that file descriptor. Create a new one if necessary. The +** return value might be uninitialized if an error occurs. +** +** The mutex entered using the unixEnterMutex() function must be held +** when this function is called. +** +** Return an appropriate error code. +*/ +static int findInodeInfo( + unixFile *pFile, /* Unix file with file desc used in the key */ + unixInodeInfo **ppInode /* Return the unixInodeInfo object here */ +){ + int rc; /* System call return code */ + int fd; /* The file descriptor for pFile */ + struct unixFileId fileId; /* Lookup key for the unixInodeInfo */ + struct stat statbuf; /* Low-level file information */ + unixInodeInfo *pInode = 0; /* Candidate unixInodeInfo object */ + + assert( unixMutexHeld() ); + + /* Get low-level information about the file that we can used to + ** create a unique name for the file. + */ + fd = pFile->h; + rc = osFstat(fd, &statbuf); + if( rc!=0 ){ + storeLastErrno(pFile, errno); +#if defined(EOVERFLOW) && defined(SQLITE_DISABLE_LFS) + if( pFile->lastErrno==EOVERFLOW ) return SQLITE_NOLFS; +#endif + return SQLITE_IOERR; + } + +#ifdef __APPLE__ + /* On OS X on an msdos filesystem, the inode number is reported + ** incorrectly for zero-size files. See ticket #3260. To work + ** around this problem (we consider it a bug in OS X, not SQLite) + ** we always increase the file size to 1 by writing a single byte + ** prior to accessing the inode number. The one byte written is + ** an ASCII 'S' character which also happens to be the first byte + ** in the header of every SQLite database. In this way, if there + ** is a race condition such that another thread has already populated + ** the first page of the database, no damage is done. + */ + if( statbuf.st_size==0 && (pFile->fsFlags & SQLITE_FSFLAGS_IS_MSDOS)!=0 ){ + do{ rc = osWrite(fd, "S", 1); }while( rc<0 && errno==EINTR ); + if( rc!=1 ){ + storeLastErrno(pFile, errno); + return SQLITE_IOERR; + } + rc = osFstat(fd, &statbuf); + if( rc!=0 ){ + storeLastErrno(pFile, errno); + return SQLITE_IOERR; + } + } +#endif + + memset(&fileId, 0, sizeof(fileId)); + fileId.dev = statbuf.st_dev; +#if OS_VXWORKS + fileId.pId = pFile->pId; +#else + fileId.ino = statbuf.st_ino; +#endif + pInode = inodeList; + while( pInode && memcmp(&fileId, &pInode->fileId, sizeof(fileId)) ){ + pInode = pInode->pNext; + } + if( pInode==0 ){ + pInode = sqlite3_malloc64( sizeof(*pInode) ); + if( pInode==0 ){ + return SQLITE_NOMEM_BKPT; + } + memset(pInode, 0, sizeof(*pInode)); + memcpy(&pInode->fileId, &fileId, sizeof(fileId)); + pInode->nRef = 1; + pInode->pNext = inodeList; + pInode->pPrev = 0; + if( inodeList ) inodeList->pPrev = pInode; + inodeList = pInode; + }else{ + pInode->nRef++; + } + *ppInode = pInode; + return SQLITE_OK; +} + +/* +** Return TRUE if pFile has been renamed or unlinked since it was first opened. +*/ +static int fileHasMoved(unixFile *pFile){ +#if OS_VXWORKS + return pFile->pInode!=0 && pFile->pId!=pFile->pInode->fileId.pId; +#else + struct stat buf; + return pFile->pInode!=0 && + (osStat(pFile->zPath, &buf)!=0 || buf.st_ino!=pFile->pInode->fileId.ino); +#endif +} + + +/* +** Check a unixFile that is a database. Verify the following: +** +** (1) There is exactly one hard link on the file +** (2) The file is not a symbolic link +** (3) The file has not been renamed or unlinked +** +** Issue sqlite3_log(SQLITE_WARNING,...) messages if anything is not right. +*/ +static void verifyDbFile(unixFile *pFile){ + struct stat buf; + int rc; + + /* These verifications occurs for the main database only */ + if( pFile->ctrlFlags & UNIXFILE_NOLOCK ) return; + + rc = osFstat(pFile->h, &buf); + if( rc!=0 ){ + sqlite3_log(SQLITE_WARNING, "cannot fstat db file %s", pFile->zPath); + return; + } + if( buf.st_nlink==0 ){ + sqlite3_log(SQLITE_WARNING, "file unlinked while open: %s", pFile->zPath); + return; + } + if( buf.st_nlink>1 ){ + sqlite3_log(SQLITE_WARNING, "multiple links to file: %s", pFile->zPath); + return; + } + if( fileHasMoved(pFile) ){ + sqlite3_log(SQLITE_WARNING, "file renamed while open: %s", pFile->zPath); + return; + } +} + + +/* +** This routine checks if there is a RESERVED lock held on the specified +** file by this or any other process. If such a lock is held, set *pResOut +** to a non-zero value otherwise *pResOut is set to zero. The return value +** is set to SQLITE_OK unless an I/O error occurs during lock checking. +*/ +static int unixCheckReservedLock(sqlite3_file *id, int *pResOut){ + int rc = SQLITE_OK; + int reserved = 0; + unixFile *pFile = (unixFile*)id; + + SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; ); + + assert( pFile ); + assert( pFile->eFileLock<=SHARED_LOCK ); + unixEnterMutex(); /* Because pFile->pInode is shared across threads */ + + /* Check if a thread in this process holds such a lock */ + if( pFile->pInode->eFileLock>SHARED_LOCK ){ + reserved = 1; + } + + /* Otherwise see if some other process holds it. + */ +#ifndef __DJGPP__ + if( !reserved && !pFile->pInode->bProcessLock ){ + struct flock lock; + lock.l_whence = SEEK_SET; + lock.l_start = RESERVED_BYTE; + lock.l_len = 1; + lock.l_type = F_WRLCK; + if( osFcntl(pFile->h, F_GETLK, &lock) ){ + rc = SQLITE_IOERR_CHECKRESERVEDLOCK; + storeLastErrno(pFile, errno); + } else if( lock.l_type!=F_UNLCK ){ + reserved = 1; + } + } +#endif + + unixLeaveMutex(); + OSTRACE(("TEST WR-LOCK %d %d %d (unix)\n", pFile->h, rc, reserved)); + + *pResOut = reserved; + return rc; +} + +/* +** Attempt to set a system-lock on the file pFile. The lock is +** described by pLock. +** +** If the pFile was opened read/write from unix-excl, then the only lock +** ever obtained is an exclusive lock, and it is obtained exactly once +** the first time any lock is attempted. All subsequent system locking +** operations become no-ops. Locking operations still happen internally, +** in order to coordinate access between separate database connections +** within this process, but all of that is handled in memory and the +** operating system does not participate. +** +** This function is a pass-through to fcntl(F_SETLK) if pFile is using +** any VFS other than "unix-excl" or if pFile is opened on "unix-excl" +** and is read-only. +** +** Zero is returned if the call completes successfully, or -1 if a call +** to fcntl() fails. In this case, errno is set appropriately (by fcntl()). +*/ +static int unixFileLock(unixFile *pFile, struct flock *pLock){ + int rc; + unixInodeInfo *pInode = pFile->pInode; + assert( unixMutexHeld() ); + assert( pInode!=0 ); + if( (pFile->ctrlFlags & (UNIXFILE_EXCL|UNIXFILE_RDONLY))==UNIXFILE_EXCL ){ + if( pInode->bProcessLock==0 ){ + struct flock lock; + assert( pInode->nLock==0 ); + lock.l_whence = SEEK_SET; + lock.l_start = SHARED_FIRST; + lock.l_len = SHARED_SIZE; + lock.l_type = F_WRLCK; + rc = osFcntl(pFile->h, F_SETLK, &lock); + if( rc<0 ) return rc; + pInode->bProcessLock = 1; + pInode->nLock++; + }else{ + rc = 0; + } + }else{ + rc = osFcntl(pFile->h, F_SETLK, pLock); + } + return rc; +} + +/* +** Lock the file with the lock specified by parameter eFileLock - one +** of the following: +** +** (1) SHARED_LOCK +** (2) RESERVED_LOCK +** (3) PENDING_LOCK +** (4) EXCLUSIVE_LOCK +** +** Sometimes when requesting one lock state, additional lock states +** are inserted in between. The locking might fail on one of the later +** transitions leaving the lock state different from what it started but +** still short of its goal. The following chart shows the allowed +** transitions and the inserted intermediate states: +** +** UNLOCKED -> SHARED +** SHARED -> RESERVED +** SHARED -> (PENDING) -> EXCLUSIVE +** RESERVED -> (PENDING) -> EXCLUSIVE +** PENDING -> EXCLUSIVE +** +** This routine will only increase a lock. Use the sqlite3OsUnlock() +** routine to lower a locking level. +*/ +static int unixLock(sqlite3_file *id, int eFileLock){ + /* The following describes the implementation of the various locks and + ** lock transitions in terms of the POSIX advisory shared and exclusive + ** lock primitives (called read-locks and write-locks below, to avoid + ** confusion with SQLite lock names). The algorithms are complicated + ** slightly in order to be compatible with Windows95 systems simultaneously + ** accessing the same database file, in case that is ever required. + ** + ** Symbols defined in os.h indentify the 'pending byte' and the 'reserved + ** byte', each single bytes at well known offsets, and the 'shared byte + ** range', a range of 510 bytes at a well known offset. + ** + ** To obtain a SHARED lock, a read-lock is obtained on the 'pending + ** byte'. If this is successful, 'shared byte range' is read-locked + ** and the lock on the 'pending byte' released. (Legacy note: When + ** SQLite was first developed, Windows95 systems were still very common, + ** and Widnows95 lacks a shared-lock capability. So on Windows95, a + ** single randomly selected by from the 'shared byte range' is locked. + ** Windows95 is now pretty much extinct, but this work-around for the + ** lack of shared-locks on Windows95 lives on, for backwards + ** compatibility.) + ** + ** A process may only obtain a RESERVED lock after it has a SHARED lock. + ** A RESERVED lock is implemented by grabbing a write-lock on the + ** 'reserved byte'. + ** + ** A process may only obtain a PENDING lock after it has obtained a + ** SHARED lock. A PENDING lock is implemented by obtaining a write-lock + ** on the 'pending byte'. This ensures that no new SHARED locks can be + ** obtained, but existing SHARED locks are allowed to persist. A process + ** does not have to obtain a RESERVED lock on the way to a PENDING lock. + ** This property is used by the algorithm for rolling back a journal file + ** after a crash. + ** + ** An EXCLUSIVE lock, obtained after a PENDING lock is held, is + ** implemented by obtaining a write-lock on the entire 'shared byte + ** range'. Since all other locks require a read-lock on one of the bytes + ** within this range, this ensures that no other locks are held on the + ** database. + */ + int rc = SQLITE_OK; + unixFile *pFile = (unixFile*)id; + unixInodeInfo *pInode; + struct flock lock; + int tErrno = 0; + + assert( pFile ); + OSTRACE(("LOCK %d %s was %s(%s,%d) pid=%d (unix)\n", pFile->h, + azFileLock(eFileLock), azFileLock(pFile->eFileLock), + azFileLock(pFile->pInode->eFileLock), pFile->pInode->nShared, + osGetpid(0))); + + /* If there is already a lock of this type or more restrictive on the + ** unixFile, do nothing. Don't use the end_lock: exit path, as + ** unixEnterMutex() hasn't been called yet. + */ + if( pFile->eFileLock>=eFileLock ){ + OSTRACE(("LOCK %d %s ok (already held) (unix)\n", pFile->h, + azFileLock(eFileLock))); + return SQLITE_OK; + } + + /* Make sure the locking sequence is correct. + ** (1) We never move from unlocked to anything higher than shared lock. + ** (2) SQLite never explicitly requests a pendig lock. + ** (3) A shared lock is always held when a reserve lock is requested. + */ + assert( pFile->eFileLock!=NO_LOCK || eFileLock==SHARED_LOCK ); + assert( eFileLock!=PENDING_LOCK ); + assert( eFileLock!=RESERVED_LOCK || pFile->eFileLock==SHARED_LOCK ); + + /* This mutex is needed because pFile->pInode is shared across threads + */ + unixEnterMutex(); + pInode = pFile->pInode; + + /* If some thread using this PID has a lock via a different unixFile* + ** handle that precludes the requested lock, return BUSY. + */ + if( (pFile->eFileLock!=pInode->eFileLock && + (pInode->eFileLock>=PENDING_LOCK || eFileLock>SHARED_LOCK)) + ){ + rc = SQLITE_BUSY; + goto end_lock; + } + + /* If a SHARED lock is requested, and some thread using this PID already + ** has a SHARED or RESERVED lock, then increment reference counts and + ** return SQLITE_OK. + */ + if( eFileLock==SHARED_LOCK && + (pInode->eFileLock==SHARED_LOCK || pInode->eFileLock==RESERVED_LOCK) ){ + assert( eFileLock==SHARED_LOCK ); + assert( pFile->eFileLock==0 ); + assert( pInode->nShared>0 ); + pFile->eFileLock = SHARED_LOCK; + pInode->nShared++; + pInode->nLock++; + goto end_lock; + } + + + /* A PENDING lock is needed before acquiring a SHARED lock and before + ** acquiring an EXCLUSIVE lock. For the SHARED lock, the PENDING will + ** be released. + */ + lock.l_len = 1L; + lock.l_whence = SEEK_SET; + if( eFileLock==SHARED_LOCK + || (eFileLock==EXCLUSIVE_LOCK && pFile->eFileLocknShared==0 ); + assert( pInode->eFileLock==0 ); + assert( rc==SQLITE_OK ); + + /* Now get the read-lock */ + lock.l_start = SHARED_FIRST; + lock.l_len = SHARED_SIZE; + if( unixFileLock(pFile, &lock) ){ + tErrno = errno; + rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_LOCK); + } + + /* Drop the temporary PENDING lock */ + lock.l_start = PENDING_BYTE; + lock.l_len = 1L; + lock.l_type = F_UNLCK; + if( unixFileLock(pFile, &lock) && rc==SQLITE_OK ){ + /* This could happen with a network mount */ + tErrno = errno; + rc = SQLITE_IOERR_UNLOCK; + } + + if( rc ){ + if( rc!=SQLITE_BUSY ){ + storeLastErrno(pFile, tErrno); + } + goto end_lock; + }else{ + pFile->eFileLock = SHARED_LOCK; + pInode->nLock++; + pInode->nShared = 1; + } + }else if( eFileLock==EXCLUSIVE_LOCK && pInode->nShared>1 ){ + /* We are trying for an exclusive lock but another thread in this + ** same process is still holding a shared lock. */ + rc = SQLITE_BUSY; + }else{ + /* The request was for a RESERVED or EXCLUSIVE lock. It is + ** assumed that there is a SHARED or greater lock on the file + ** already. + */ + assert( 0!=pFile->eFileLock ); + lock.l_type = F_WRLCK; + + assert( eFileLock==RESERVED_LOCK || eFileLock==EXCLUSIVE_LOCK ); + if( eFileLock==RESERVED_LOCK ){ + lock.l_start = RESERVED_BYTE; + lock.l_len = 1L; + }else{ + lock.l_start = SHARED_FIRST; + lock.l_len = SHARED_SIZE; + } + + if( unixFileLock(pFile, &lock) ){ + tErrno = errno; + rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_LOCK); + if( rc!=SQLITE_BUSY ){ + storeLastErrno(pFile, tErrno); + } + } + } + + +#ifdef SQLITE_DEBUG + /* Set up the transaction-counter change checking flags when + ** transitioning from a SHARED to a RESERVED lock. The change + ** from SHARED to RESERVED marks the beginning of a normal + ** write operation (not a hot journal rollback). + */ + if( rc==SQLITE_OK + && pFile->eFileLock<=SHARED_LOCK + && eFileLock==RESERVED_LOCK + ){ + pFile->transCntrChng = 0; + pFile->dbUpdate = 0; + pFile->inNormalWrite = 1; + } +#endif + + + if( rc==SQLITE_OK ){ + pFile->eFileLock = eFileLock; + pInode->eFileLock = eFileLock; + }else if( eFileLock==EXCLUSIVE_LOCK ){ + pFile->eFileLock = PENDING_LOCK; + pInode->eFileLock = PENDING_LOCK; + } + +end_lock: + unixLeaveMutex(); + OSTRACE(("LOCK %d %s %s (unix)\n", pFile->h, azFileLock(eFileLock), + rc==SQLITE_OK ? "ok" : "failed")); + return rc; +} + +/* +** Add the file descriptor used by file handle pFile to the corresponding +** pUnused list. +*/ +static void setPendingFd(unixFile *pFile){ + unixInodeInfo *pInode = pFile->pInode; + UnixUnusedFd *p = pFile->pUnused; + p->pNext = pInode->pUnused; + pInode->pUnused = p; + pFile->h = -1; + pFile->pUnused = 0; +} + +/* +** Lower the locking level on file descriptor pFile to eFileLock. eFileLock +** must be either NO_LOCK or SHARED_LOCK. +** +** If the locking level of the file descriptor is already at or below +** the requested locking level, this routine is a no-op. +** +** If handleNFSUnlock is true, then on downgrading an EXCLUSIVE_LOCK to SHARED +** the byte range is divided into 2 parts and the first part is unlocked then +** set to a read lock, then the other part is simply unlocked. This works +** around a bug in BSD NFS lockd (also seen on MacOSX 10.3+) that fails to +** remove the write lock on a region when a read lock is set. +*/ +static int posixUnlock(sqlite3_file *id, int eFileLock, int handleNFSUnlock){ + unixFile *pFile = (unixFile*)id; + unixInodeInfo *pInode; + struct flock lock; + int rc = SQLITE_OK; + + assert( pFile ); + OSTRACE(("UNLOCK %d %d was %d(%d,%d) pid=%d (unix)\n", pFile->h, eFileLock, + pFile->eFileLock, pFile->pInode->eFileLock, pFile->pInode->nShared, + osGetpid(0))); + + assert( eFileLock<=SHARED_LOCK ); + if( pFile->eFileLock<=eFileLock ){ + return SQLITE_OK; + } + unixEnterMutex(); + pInode = pFile->pInode; + assert( pInode->nShared!=0 ); + if( pFile->eFileLock>SHARED_LOCK ){ + assert( pInode->eFileLock==pFile->eFileLock ); + +#ifdef SQLITE_DEBUG + /* When reducing a lock such that other processes can start + ** reading the database file again, make sure that the + ** transaction counter was updated if any part of the database + ** file changed. If the transaction counter is not updated, + ** other connections to the same file might not realize that + ** the file has changed and hence might not know to flush their + ** cache. The use of a stale cache can lead to database corruption. + */ + pFile->inNormalWrite = 0; +#endif + + /* downgrading to a shared lock on NFS involves clearing the write lock + ** before establishing the readlock - to avoid a race condition we downgrade + ** the lock in 2 blocks, so that part of the range will be covered by a + ** write lock until the rest is covered by a read lock: + ** 1: [WWWWW] + ** 2: [....W] + ** 3: [RRRRW] + ** 4: [RRRR.] + */ + if( eFileLock==SHARED_LOCK ){ +#if !defined(__APPLE__) || !SQLITE_ENABLE_LOCKING_STYLE + (void)handleNFSUnlock; + assert( handleNFSUnlock==0 ); +#endif +#if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE + if( handleNFSUnlock ){ + int tErrno; /* Error code from system call errors */ + off_t divSize = SHARED_SIZE - 1; + + lock.l_type = F_UNLCK; + lock.l_whence = SEEK_SET; + lock.l_start = SHARED_FIRST; + lock.l_len = divSize; + if( unixFileLock(pFile, &lock)==(-1) ){ + tErrno = errno; + rc = SQLITE_IOERR_UNLOCK; + storeLastErrno(pFile, tErrno); + goto end_unlock; + } + lock.l_type = F_RDLCK; + lock.l_whence = SEEK_SET; + lock.l_start = SHARED_FIRST; + lock.l_len = divSize; + if( unixFileLock(pFile, &lock)==(-1) ){ + tErrno = errno; + rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_RDLOCK); + if( IS_LOCK_ERROR(rc) ){ + storeLastErrno(pFile, tErrno); + } + goto end_unlock; + } + lock.l_type = F_UNLCK; + lock.l_whence = SEEK_SET; + lock.l_start = SHARED_FIRST+divSize; + lock.l_len = SHARED_SIZE-divSize; + if( unixFileLock(pFile, &lock)==(-1) ){ + tErrno = errno; + rc = SQLITE_IOERR_UNLOCK; + storeLastErrno(pFile, tErrno); + goto end_unlock; + } + }else +#endif /* defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE */ + { + lock.l_type = F_RDLCK; + lock.l_whence = SEEK_SET; + lock.l_start = SHARED_FIRST; + lock.l_len = SHARED_SIZE; + if( unixFileLock(pFile, &lock) ){ + /* In theory, the call to unixFileLock() cannot fail because another + ** process is holding an incompatible lock. If it does, this + ** indicates that the other process is not following the locking + ** protocol. If this happens, return SQLITE_IOERR_RDLOCK. Returning + ** SQLITE_BUSY would confuse the upper layer (in practice it causes + ** an assert to fail). */ + rc = SQLITE_IOERR_RDLOCK; + storeLastErrno(pFile, errno); + goto end_unlock; + } + } + } + lock.l_type = F_UNLCK; + lock.l_whence = SEEK_SET; + lock.l_start = PENDING_BYTE; + lock.l_len = 2L; assert( PENDING_BYTE+1==RESERVED_BYTE ); + if( unixFileLock(pFile, &lock)==0 ){ + pInode->eFileLock = SHARED_LOCK; + }else{ + rc = SQLITE_IOERR_UNLOCK; + storeLastErrno(pFile, errno); + goto end_unlock; + } + } + if( eFileLock==NO_LOCK ){ + /* Decrement the shared lock counter. Release the lock using an + ** OS call only when all threads in this same process have released + ** the lock. + */ + pInode->nShared--; + if( pInode->nShared==0 ){ + lock.l_type = F_UNLCK; + lock.l_whence = SEEK_SET; + lock.l_start = lock.l_len = 0L; + if( unixFileLock(pFile, &lock)==0 ){ + pInode->eFileLock = NO_LOCK; + }else{ + rc = SQLITE_IOERR_UNLOCK; + storeLastErrno(pFile, errno); + pInode->eFileLock = NO_LOCK; + pFile->eFileLock = NO_LOCK; + } + } + + /* Decrement the count of locks against this same file. When the + ** count reaches zero, close any other file descriptors whose close + ** was deferred because of outstanding locks. + */ + pInode->nLock--; + assert( pInode->nLock>=0 ); + if( pInode->nLock==0 ){ + closePendingFds(pFile); + } + } + +end_unlock: + unixLeaveMutex(); + if( rc==SQLITE_OK ) pFile->eFileLock = eFileLock; + return rc; +} + +/* +** Lower the locking level on file descriptor pFile to eFileLock. eFileLock +** must be either NO_LOCK or SHARED_LOCK. +** +** If the locking level of the file descriptor is already at or below +** the requested locking level, this routine is a no-op. +*/ +static int unixUnlock(sqlite3_file *id, int eFileLock){ +#if SQLITE_MAX_MMAP_SIZE>0 + assert( eFileLock==SHARED_LOCK || ((unixFile *)id)->nFetchOut==0 ); +#endif + return posixUnlock(id, eFileLock, 0); +} + +#if SQLITE_MAX_MMAP_SIZE>0 +static int unixMapfile(unixFile *pFd, i64 nByte); +static void unixUnmapfile(unixFile *pFd); +#endif + +/* +** This function performs the parts of the "close file" operation +** common to all locking schemes. It closes the directory and file +** handles, if they are valid, and sets all fields of the unixFile +** structure to 0. +** +** It is *not* necessary to hold the mutex when this routine is called, +** even on VxWorks. A mutex will be acquired on VxWorks by the +** vxworksReleaseFileId() routine. +*/ +static int closeUnixFile(sqlite3_file *id){ + unixFile *pFile = (unixFile*)id; +#if SQLITE_MAX_MMAP_SIZE>0 + unixUnmapfile(pFile); +#endif + if( pFile->h>=0 ){ + robust_close(pFile, pFile->h, __LINE__); + pFile->h = -1; + } +#if OS_VXWORKS + if( pFile->pId ){ + if( pFile->ctrlFlags & UNIXFILE_DELETE ){ + osUnlink(pFile->pId->zCanonicalName); + } + vxworksReleaseFileId(pFile->pId); + pFile->pId = 0; + } +#endif +#ifdef SQLITE_UNLINK_AFTER_CLOSE + if( pFile->ctrlFlags & UNIXFILE_DELETE ){ + osUnlink(pFile->zPath); + sqlite3_free(*(char**)&pFile->zPath); + pFile->zPath = 0; + } +#endif + OSTRACE(("CLOSE %-3d\n", pFile->h)); + OpenCounter(-1); + sqlite3_free(pFile->pUnused); + memset(pFile, 0, sizeof(unixFile)); + return SQLITE_OK; +} + +/* +** Close a file. +*/ +static int unixClose(sqlite3_file *id){ + int rc = SQLITE_OK; + unixFile *pFile = (unixFile *)id; + verifyDbFile(pFile); + unixUnlock(id, NO_LOCK); + unixEnterMutex(); + + /* unixFile.pInode is always valid here. Otherwise, a different close + ** routine (e.g. nolockClose()) would be called instead. + */ + assert( pFile->pInode->nLock>0 || pFile->pInode->bProcessLock==0 ); + if( ALWAYS(pFile->pInode) && pFile->pInode->nLock ){ + /* If there are outstanding locks, do not actually close the file just + ** yet because that would clear those locks. Instead, add the file + ** descriptor to pInode->pUnused list. It will be automatically closed + ** when the last lock is cleared. + */ + setPendingFd(pFile); + } + releaseInodeInfo(pFile); + rc = closeUnixFile(id); + unixLeaveMutex(); + return rc; +} + +/************** End of the posix advisory lock implementation ***************** +******************************************************************************/ + +/****************************************************************************** +****************************** No-op Locking ********************************** +** +** Of the various locking implementations available, this is by far the +** simplest: locking is ignored. No attempt is made to lock the database +** file for reading or writing. +** +** This locking mode is appropriate for use on read-only databases +** (ex: databases that are burned into CD-ROM, for example.) It can +** also be used if the application employs some external mechanism to +** prevent simultaneous access of the same database by two or more +** database connections. But there is a serious risk of database +** corruption if this locking mode is used in situations where multiple +** database connections are accessing the same database file at the same +** time and one or more of those connections are writing. +*/ + +static int nolockCheckReservedLock(sqlite3_file *NotUsed, int *pResOut){ + UNUSED_PARAMETER(NotUsed); + *pResOut = 0; + return SQLITE_OK; +} +static int nolockLock(sqlite3_file *NotUsed, int NotUsed2){ + UNUSED_PARAMETER2(NotUsed, NotUsed2); + return SQLITE_OK; +} +static int nolockUnlock(sqlite3_file *NotUsed, int NotUsed2){ + UNUSED_PARAMETER2(NotUsed, NotUsed2); + return SQLITE_OK; +} + +/* +** Close the file. +*/ +static int nolockClose(sqlite3_file *id) { + return closeUnixFile(id); +} + +/******************* End of the no-op lock implementation ********************* +******************************************************************************/ + +/****************************************************************************** +************************* Begin dot-file Locking ****************************** +** +** The dotfile locking implementation uses the existence of separate lock +** files (really a directory) to control access to the database. This works +** on just about every filesystem imaginable. But there are serious downsides: +** +** (1) There is zero concurrency. A single reader blocks all other +** connections from reading or writing the database. +** +** (2) An application crash or power loss can leave stale lock files +** sitting around that need to be cleared manually. +** +** Nevertheless, a dotlock is an appropriate locking mode for use if no +** other locking strategy is available. +** +** Dotfile locking works by creating a subdirectory in the same directory as +** the database and with the same name but with a ".lock" extension added. +** The existence of a lock directory implies an EXCLUSIVE lock. All other +** lock types (SHARED, RESERVED, PENDING) are mapped into EXCLUSIVE. +*/ + +/* +** The file suffix added to the data base filename in order to create the +** lock directory. +*/ +#define DOTLOCK_SUFFIX ".lock" + +/* +** This routine checks if there is a RESERVED lock held on the specified +** file by this or any other process. If such a lock is held, set *pResOut +** to a non-zero value otherwise *pResOut is set to zero. The return value +** is set to SQLITE_OK unless an I/O error occurs during lock checking. +** +** In dotfile locking, either a lock exists or it does not. So in this +** variation of CheckReservedLock(), *pResOut is set to true if any lock +** is held on the file and false if the file is unlocked. +*/ +static int dotlockCheckReservedLock(sqlite3_file *id, int *pResOut) { + int rc = SQLITE_OK; + int reserved = 0; + unixFile *pFile = (unixFile*)id; + + SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; ); + + assert( pFile ); + reserved = osAccess((const char*)pFile->lockingContext, 0)==0; + OSTRACE(("TEST WR-LOCK %d %d %d (dotlock)\n", pFile->h, rc, reserved)); + *pResOut = reserved; + return rc; +} + +/* +** Lock the file with the lock specified by parameter eFileLock - one +** of the following: +** +** (1) SHARED_LOCK +** (2) RESERVED_LOCK +** (3) PENDING_LOCK +** (4) EXCLUSIVE_LOCK +** +** Sometimes when requesting one lock state, additional lock states +** are inserted in between. The locking might fail on one of the later +** transitions leaving the lock state different from what it started but +** still short of its goal. The following chart shows the allowed +** transitions and the inserted intermediate states: +** +** UNLOCKED -> SHARED +** SHARED -> RESERVED +** SHARED -> (PENDING) -> EXCLUSIVE +** RESERVED -> (PENDING) -> EXCLUSIVE +** PENDING -> EXCLUSIVE +** +** This routine will only increase a lock. Use the sqlite3OsUnlock() +** routine to lower a locking level. +** +** With dotfile locking, we really only support state (4): EXCLUSIVE. +** But we track the other locking levels internally. +*/ +static int dotlockLock(sqlite3_file *id, int eFileLock) { + unixFile *pFile = (unixFile*)id; + char *zLockFile = (char *)pFile->lockingContext; + int rc = SQLITE_OK; + + + /* If we have any lock, then the lock file already exists. All we have + ** to do is adjust our internal record of the lock level. + */ + if( pFile->eFileLock > NO_LOCK ){ + pFile->eFileLock = eFileLock; + /* Always update the timestamp on the old file */ +#ifdef HAVE_UTIME + utime(zLockFile, NULL); +#else + utimes(zLockFile, NULL); +#endif + return SQLITE_OK; + } + + /* grab an exclusive lock */ + rc = osMkdir(zLockFile, 0777); + if( rc<0 ){ + /* failed to open/create the lock directory */ + int tErrno = errno; + if( EEXIST == tErrno ){ + rc = SQLITE_BUSY; + } else { + rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_LOCK); + if( rc!=SQLITE_BUSY ){ + storeLastErrno(pFile, tErrno); + } + } + return rc; + } + + /* got it, set the type and return ok */ + pFile->eFileLock = eFileLock; + return rc; +} + +/* +** Lower the locking level on file descriptor pFile to eFileLock. eFileLock +** must be either NO_LOCK or SHARED_LOCK. +** +** If the locking level of the file descriptor is already at or below +** the requested locking level, this routine is a no-op. +** +** When the locking level reaches NO_LOCK, delete the lock file. +*/ +static int dotlockUnlock(sqlite3_file *id, int eFileLock) { + unixFile *pFile = (unixFile*)id; + char *zLockFile = (char *)pFile->lockingContext; + int rc; + + assert( pFile ); + OSTRACE(("UNLOCK %d %d was %d pid=%d (dotlock)\n", pFile->h, eFileLock, + pFile->eFileLock, osGetpid(0))); + assert( eFileLock<=SHARED_LOCK ); + + /* no-op if possible */ + if( pFile->eFileLock==eFileLock ){ + return SQLITE_OK; + } + + /* To downgrade to shared, simply update our internal notion of the + ** lock state. No need to mess with the file on disk. + */ + if( eFileLock==SHARED_LOCK ){ + pFile->eFileLock = SHARED_LOCK; + return SQLITE_OK; + } + + /* To fully unlock the database, delete the lock file */ + assert( eFileLock==NO_LOCK ); + rc = osRmdir(zLockFile); + if( rc<0 ){ + int tErrno = errno; + if( tErrno==ENOENT ){ + rc = SQLITE_OK; + }else{ + rc = SQLITE_IOERR_UNLOCK; + storeLastErrno(pFile, tErrno); + } + return rc; + } + pFile->eFileLock = NO_LOCK; + return SQLITE_OK; +} + +/* +** Close a file. Make sure the lock has been released before closing. +*/ +static int dotlockClose(sqlite3_file *id) { + unixFile *pFile = (unixFile*)id; + assert( id!=0 ); + dotlockUnlock(id, NO_LOCK); + sqlite3_free(pFile->lockingContext); + return closeUnixFile(id); +} +/****************** End of the dot-file lock implementation ******************* +******************************************************************************/ + +/****************************************************************************** +************************** Begin flock Locking ******************************** +** +** Use the flock() system call to do file locking. +** +** flock() locking is like dot-file locking in that the various +** fine-grain locking levels supported by SQLite are collapsed into +** a single exclusive lock. In other words, SHARED, RESERVED, and +** PENDING locks are the same thing as an EXCLUSIVE lock. SQLite +** still works when you do this, but concurrency is reduced since +** only a single process can be reading the database at a time. +** +** Omit this section if SQLITE_ENABLE_LOCKING_STYLE is turned off +*/ +#if SQLITE_ENABLE_LOCKING_STYLE + +/* +** Retry flock() calls that fail with EINTR +*/ +#ifdef EINTR +static int robust_flock(int fd, int op){ + int rc; + do{ rc = flock(fd,op); }while( rc<0 && errno==EINTR ); + return rc; +} +#else +# define robust_flock(a,b) flock(a,b) +#endif + + +/* +** This routine checks if there is a RESERVED lock held on the specified +** file by this or any other process. If such a lock is held, set *pResOut +** to a non-zero value otherwise *pResOut is set to zero. The return value +** is set to SQLITE_OK unless an I/O error occurs during lock checking. +*/ +static int flockCheckReservedLock(sqlite3_file *id, int *pResOut){ + int rc = SQLITE_OK; + int reserved = 0; + unixFile *pFile = (unixFile*)id; + + SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; ); + + assert( pFile ); + + /* Check if a thread in this process holds such a lock */ + if( pFile->eFileLock>SHARED_LOCK ){ + reserved = 1; + } + + /* Otherwise see if some other process holds it. */ + if( !reserved ){ + /* attempt to get the lock */ + int lrc = robust_flock(pFile->h, LOCK_EX | LOCK_NB); + if( !lrc ){ + /* got the lock, unlock it */ + lrc = robust_flock(pFile->h, LOCK_UN); + if ( lrc ) { + int tErrno = errno; + /* unlock failed with an error */ + lrc = SQLITE_IOERR_UNLOCK; + storeLastErrno(pFile, tErrno); + rc = lrc; + } + } else { + int tErrno = errno; + reserved = 1; + /* someone else might have it reserved */ + lrc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_LOCK); + if( IS_LOCK_ERROR(lrc) ){ + storeLastErrno(pFile, tErrno); + rc = lrc; + } + } + } + OSTRACE(("TEST WR-LOCK %d %d %d (flock)\n", pFile->h, rc, reserved)); + +#ifdef SQLITE_IGNORE_FLOCK_LOCK_ERRORS + if( (rc & SQLITE_IOERR) == SQLITE_IOERR ){ + rc = SQLITE_OK; + reserved=1; + } +#endif /* SQLITE_IGNORE_FLOCK_LOCK_ERRORS */ + *pResOut = reserved; + return rc; +} + +/* +** Lock the file with the lock specified by parameter eFileLock - one +** of the following: +** +** (1) SHARED_LOCK +** (2) RESERVED_LOCK +** (3) PENDING_LOCK +** (4) EXCLUSIVE_LOCK +** +** Sometimes when requesting one lock state, additional lock states +** are inserted in between. The locking might fail on one of the later +** transitions leaving the lock state different from what it started but +** still short of its goal. The following chart shows the allowed +** transitions and the inserted intermediate states: +** +** UNLOCKED -> SHARED +** SHARED -> RESERVED +** SHARED -> (PENDING) -> EXCLUSIVE +** RESERVED -> (PENDING) -> EXCLUSIVE +** PENDING -> EXCLUSIVE +** +** flock() only really support EXCLUSIVE locks. We track intermediate +** lock states in the sqlite3_file structure, but all locks SHARED or +** above are really EXCLUSIVE locks and exclude all other processes from +** access the file. +** +** This routine will only increase a lock. Use the sqlite3OsUnlock() +** routine to lower a locking level. +*/ +static int flockLock(sqlite3_file *id, int eFileLock) { + int rc = SQLITE_OK; + unixFile *pFile = (unixFile*)id; + + assert( pFile ); + + /* if we already have a lock, it is exclusive. + ** Just adjust level and punt on outta here. */ + if (pFile->eFileLock > NO_LOCK) { + pFile->eFileLock = eFileLock; + return SQLITE_OK; + } + + /* grab an exclusive lock */ + + if (robust_flock(pFile->h, LOCK_EX | LOCK_NB)) { + int tErrno = errno; + /* didn't get, must be busy */ + rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_LOCK); + if( IS_LOCK_ERROR(rc) ){ + storeLastErrno(pFile, tErrno); + } + } else { + /* got it, set the type and return ok */ + pFile->eFileLock = eFileLock; + } + OSTRACE(("LOCK %d %s %s (flock)\n", pFile->h, azFileLock(eFileLock), + rc==SQLITE_OK ? "ok" : "failed")); +#ifdef SQLITE_IGNORE_FLOCK_LOCK_ERRORS + if( (rc & SQLITE_IOERR) == SQLITE_IOERR ){ + rc = SQLITE_BUSY; + } +#endif /* SQLITE_IGNORE_FLOCK_LOCK_ERRORS */ + return rc; +} + + +/* +** Lower the locking level on file descriptor pFile to eFileLock. eFileLock +** must be either NO_LOCK or SHARED_LOCK. +** +** If the locking level of the file descriptor is already at or below +** the requested locking level, this routine is a no-op. +*/ +static int flockUnlock(sqlite3_file *id, int eFileLock) { + unixFile *pFile = (unixFile*)id; + + assert( pFile ); + OSTRACE(("UNLOCK %d %d was %d pid=%d (flock)\n", pFile->h, eFileLock, + pFile->eFileLock, osGetpid(0))); + assert( eFileLock<=SHARED_LOCK ); + + /* no-op if possible */ + if( pFile->eFileLock==eFileLock ){ + return SQLITE_OK; + } + + /* shared can just be set because we always have an exclusive */ + if (eFileLock==SHARED_LOCK) { + pFile->eFileLock = eFileLock; + return SQLITE_OK; + } + + /* no, really, unlock. */ + if( robust_flock(pFile->h, LOCK_UN) ){ +#ifdef SQLITE_IGNORE_FLOCK_LOCK_ERRORS + return SQLITE_OK; +#endif /* SQLITE_IGNORE_FLOCK_LOCK_ERRORS */ + return SQLITE_IOERR_UNLOCK; + }else{ + pFile->eFileLock = NO_LOCK; + return SQLITE_OK; + } +} + +/* +** Close a file. +*/ +static int flockClose(sqlite3_file *id) { + assert( id!=0 ); + flockUnlock(id, NO_LOCK); + return closeUnixFile(id); +} + +#endif /* SQLITE_ENABLE_LOCKING_STYLE && !OS_VXWORK */ + +/******************* End of the flock lock implementation ********************* +******************************************************************************/ + +/****************************************************************************** +************************ Begin Named Semaphore Locking ************************ +** +** Named semaphore locking is only supported on VxWorks. +** +** Semaphore locking is like dot-lock and flock in that it really only +** supports EXCLUSIVE locking. Only a single process can read or write +** the database file at a time. This reduces potential concurrency, but +** makes the lock implementation much easier. +*/ +#if OS_VXWORKS + +/* +** This routine checks if there is a RESERVED lock held on the specified +** file by this or any other process. If such a lock is held, set *pResOut +** to a non-zero value otherwise *pResOut is set to zero. The return value +** is set to SQLITE_OK unless an I/O error occurs during lock checking. +*/ +static int semXCheckReservedLock(sqlite3_file *id, int *pResOut) { + int rc = SQLITE_OK; + int reserved = 0; + unixFile *pFile = (unixFile*)id; + + SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; ); + + assert( pFile ); + + /* Check if a thread in this process holds such a lock */ + if( pFile->eFileLock>SHARED_LOCK ){ + reserved = 1; + } + + /* Otherwise see if some other process holds it. */ + if( !reserved ){ + sem_t *pSem = pFile->pInode->pSem; + + if( sem_trywait(pSem)==-1 ){ + int tErrno = errno; + if( EAGAIN != tErrno ){ + rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_CHECKRESERVEDLOCK); + storeLastErrno(pFile, tErrno); + } else { + /* someone else has the lock when we are in NO_LOCK */ + reserved = (pFile->eFileLock < SHARED_LOCK); + } + }else{ + /* we could have it if we want it */ + sem_post(pSem); + } + } + OSTRACE(("TEST WR-LOCK %d %d %d (sem)\n", pFile->h, rc, reserved)); + + *pResOut = reserved; + return rc; +} + +/* +** Lock the file with the lock specified by parameter eFileLock - one +** of the following: +** +** (1) SHARED_LOCK +** (2) RESERVED_LOCK +** (3) PENDING_LOCK +** (4) EXCLUSIVE_LOCK +** +** Sometimes when requesting one lock state, additional lock states +** are inserted in between. The locking might fail on one of the later +** transitions leaving the lock state different from what it started but +** still short of its goal. The following chart shows the allowed +** transitions and the inserted intermediate states: +** +** UNLOCKED -> SHARED +** SHARED -> RESERVED +** SHARED -> (PENDING) -> EXCLUSIVE +** RESERVED -> (PENDING) -> EXCLUSIVE +** PENDING -> EXCLUSIVE +** +** Semaphore locks only really support EXCLUSIVE locks. We track intermediate +** lock states in the sqlite3_file structure, but all locks SHARED or +** above are really EXCLUSIVE locks and exclude all other processes from +** access the file. +** +** This routine will only increase a lock. Use the sqlite3OsUnlock() +** routine to lower a locking level. +*/ +static int semXLock(sqlite3_file *id, int eFileLock) { + unixFile *pFile = (unixFile*)id; + sem_t *pSem = pFile->pInode->pSem; + int rc = SQLITE_OK; + + /* if we already have a lock, it is exclusive. + ** Just adjust level and punt on outta here. */ + if (pFile->eFileLock > NO_LOCK) { + pFile->eFileLock = eFileLock; + rc = SQLITE_OK; + goto sem_end_lock; + } + + /* lock semaphore now but bail out when already locked. */ + if( sem_trywait(pSem)==-1 ){ + rc = SQLITE_BUSY; + goto sem_end_lock; + } + + /* got it, set the type and return ok */ + pFile->eFileLock = eFileLock; + + sem_end_lock: + return rc; +} + +/* +** Lower the locking level on file descriptor pFile to eFileLock. eFileLock +** must be either NO_LOCK or SHARED_LOCK. +** +** If the locking level of the file descriptor is already at or below +** the requested locking level, this routine is a no-op. +*/ +static int semXUnlock(sqlite3_file *id, int eFileLock) { + unixFile *pFile = (unixFile*)id; + sem_t *pSem = pFile->pInode->pSem; + + assert( pFile ); + assert( pSem ); + OSTRACE(("UNLOCK %d %d was %d pid=%d (sem)\n", pFile->h, eFileLock, + pFile->eFileLock, osGetpid(0))); + assert( eFileLock<=SHARED_LOCK ); + + /* no-op if possible */ + if( pFile->eFileLock==eFileLock ){ + return SQLITE_OK; + } + + /* shared can just be set because we always have an exclusive */ + if (eFileLock==SHARED_LOCK) { + pFile->eFileLock = eFileLock; + return SQLITE_OK; + } + + /* no, really unlock. */ + if ( sem_post(pSem)==-1 ) { + int rc, tErrno = errno; + rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_UNLOCK); + if( IS_LOCK_ERROR(rc) ){ + storeLastErrno(pFile, tErrno); + } + return rc; + } + pFile->eFileLock = NO_LOCK; + return SQLITE_OK; +} + +/* + ** Close a file. + */ +static int semXClose(sqlite3_file *id) { + if( id ){ + unixFile *pFile = (unixFile*)id; + semXUnlock(id, NO_LOCK); + assert( pFile ); + unixEnterMutex(); + releaseInodeInfo(pFile); + unixLeaveMutex(); + closeUnixFile(id); + } + return SQLITE_OK; +} + +#endif /* OS_VXWORKS */ +/* +** Named semaphore locking is only available on VxWorks. +** +*************** End of the named semaphore lock implementation **************** +******************************************************************************/ + + +/****************************************************************************** +*************************** Begin AFP Locking ********************************* +** +** AFP is the Apple Filing Protocol. AFP is a network filesystem found +** on Apple Macintosh computers - both OS9 and OSX. +** +** Third-party implementations of AFP are available. But this code here +** only works on OSX. +*/ + +#if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE +/* +** The afpLockingContext structure contains all afp lock specific state +*/ +typedef struct afpLockingContext afpLockingContext; +struct afpLockingContext { + int reserved; + const char *dbPath; /* Name of the open file */ +}; + +struct ByteRangeLockPB2 +{ + unsigned long long offset; /* offset to first byte to lock */ + unsigned long long length; /* nbr of bytes to lock */ + unsigned long long retRangeStart; /* nbr of 1st byte locked if successful */ + unsigned char unLockFlag; /* 1 = unlock, 0 = lock */ + unsigned char startEndFlag; /* 1=rel to end of fork, 0=rel to start */ + int fd; /* file desc to assoc this lock with */ +}; + +#define afpfsByteRangeLock2FSCTL _IOWR('z', 23, struct ByteRangeLockPB2) + +/* +** This is a utility for setting or clearing a bit-range lock on an +** AFP filesystem. +** +** Return SQLITE_OK on success, SQLITE_BUSY on failure. +*/ +static int afpSetLock( + const char *path, /* Name of the file to be locked or unlocked */ + unixFile *pFile, /* Open file descriptor on path */ + unsigned long long offset, /* First byte to be locked */ + unsigned long long length, /* Number of bytes to lock */ + int setLockFlag /* True to set lock. False to clear lock */ +){ + struct ByteRangeLockPB2 pb; + int err; + + pb.unLockFlag = setLockFlag ? 0 : 1; + pb.startEndFlag = 0; + pb.offset = offset; + pb.length = length; + pb.fd = pFile->h; + + OSTRACE(("AFPSETLOCK [%s] for %d%s in range %llx:%llx\n", + (setLockFlag?"ON":"OFF"), pFile->h, (pb.fd==-1?"[testval-1]":""), + offset, length)); + err = fsctl(path, afpfsByteRangeLock2FSCTL, &pb, 0); + if ( err==-1 ) { + int rc; + int tErrno = errno; + OSTRACE(("AFPSETLOCK failed to fsctl() '%s' %d %s\n", + path, tErrno, strerror(tErrno))); +#ifdef SQLITE_IGNORE_AFP_LOCK_ERRORS + rc = SQLITE_BUSY; +#else + rc = sqliteErrorFromPosixError(tErrno, + setLockFlag ? SQLITE_IOERR_LOCK : SQLITE_IOERR_UNLOCK); +#endif /* SQLITE_IGNORE_AFP_LOCK_ERRORS */ + if( IS_LOCK_ERROR(rc) ){ + storeLastErrno(pFile, tErrno); + } + return rc; + } else { + return SQLITE_OK; + } +} + +/* +** This routine checks if there is a RESERVED lock held on the specified +** file by this or any other process. If such a lock is held, set *pResOut +** to a non-zero value otherwise *pResOut is set to zero. The return value +** is set to SQLITE_OK unless an I/O error occurs during lock checking. +*/ +static int afpCheckReservedLock(sqlite3_file *id, int *pResOut){ + int rc = SQLITE_OK; + int reserved = 0; + unixFile *pFile = (unixFile*)id; + afpLockingContext *context; + + SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; ); + + assert( pFile ); + context = (afpLockingContext *) pFile->lockingContext; + if( context->reserved ){ + *pResOut = 1; + return SQLITE_OK; + } + unixEnterMutex(); /* Because pFile->pInode is shared across threads */ + + /* Check if a thread in this process holds such a lock */ + if( pFile->pInode->eFileLock>SHARED_LOCK ){ + reserved = 1; + } + + /* Otherwise see if some other process holds it. + */ + if( !reserved ){ + /* lock the RESERVED byte */ + int lrc = afpSetLock(context->dbPath, pFile, RESERVED_BYTE, 1,1); + if( SQLITE_OK==lrc ){ + /* if we succeeded in taking the reserved lock, unlock it to restore + ** the original state */ + lrc = afpSetLock(context->dbPath, pFile, RESERVED_BYTE, 1, 0); + } else { + /* if we failed to get the lock then someone else must have it */ + reserved = 1; + } + if( IS_LOCK_ERROR(lrc) ){ + rc=lrc; + } + } + + unixLeaveMutex(); + OSTRACE(("TEST WR-LOCK %d %d %d (afp)\n", pFile->h, rc, reserved)); + + *pResOut = reserved; + return rc; +} + +/* +** Lock the file with the lock specified by parameter eFileLock - one +** of the following: +** +** (1) SHARED_LOCK +** (2) RESERVED_LOCK +** (3) PENDING_LOCK +** (4) EXCLUSIVE_LOCK +** +** Sometimes when requesting one lock state, additional lock states +** are inserted in between. The locking might fail on one of the later +** transitions leaving the lock state different from what it started but +** still short of its goal. The following chart shows the allowed +** transitions and the inserted intermediate states: +** +** UNLOCKED -> SHARED +** SHARED -> RESERVED +** SHARED -> (PENDING) -> EXCLUSIVE +** RESERVED -> (PENDING) -> EXCLUSIVE +** PENDING -> EXCLUSIVE +** +** This routine will only increase a lock. Use the sqlite3OsUnlock() +** routine to lower a locking level. +*/ +static int afpLock(sqlite3_file *id, int eFileLock){ + int rc = SQLITE_OK; + unixFile *pFile = (unixFile*)id; + unixInodeInfo *pInode = pFile->pInode; + afpLockingContext *context = (afpLockingContext *) pFile->lockingContext; + + assert( pFile ); + OSTRACE(("LOCK %d %s was %s(%s,%d) pid=%d (afp)\n", pFile->h, + azFileLock(eFileLock), azFileLock(pFile->eFileLock), + azFileLock(pInode->eFileLock), pInode->nShared , osGetpid(0))); + + /* If there is already a lock of this type or more restrictive on the + ** unixFile, do nothing. Don't use the afp_end_lock: exit path, as + ** unixEnterMutex() hasn't been called yet. + */ + if( pFile->eFileLock>=eFileLock ){ + OSTRACE(("LOCK %d %s ok (already held) (afp)\n", pFile->h, + azFileLock(eFileLock))); + return SQLITE_OK; + } + + /* Make sure the locking sequence is correct + ** (1) We never move from unlocked to anything higher than shared lock. + ** (2) SQLite never explicitly requests a pendig lock. + ** (3) A shared lock is always held when a reserve lock is requested. + */ + assert( pFile->eFileLock!=NO_LOCK || eFileLock==SHARED_LOCK ); + assert( eFileLock!=PENDING_LOCK ); + assert( eFileLock!=RESERVED_LOCK || pFile->eFileLock==SHARED_LOCK ); + + /* This mutex is needed because pFile->pInode is shared across threads + */ + unixEnterMutex(); + pInode = pFile->pInode; + + /* If some thread using this PID has a lock via a different unixFile* + ** handle that precludes the requested lock, return BUSY. + */ + if( (pFile->eFileLock!=pInode->eFileLock && + (pInode->eFileLock>=PENDING_LOCK || eFileLock>SHARED_LOCK)) + ){ + rc = SQLITE_BUSY; + goto afp_end_lock; + } + + /* If a SHARED lock is requested, and some thread using this PID already + ** has a SHARED or RESERVED lock, then increment reference counts and + ** return SQLITE_OK. + */ + if( eFileLock==SHARED_LOCK && + (pInode->eFileLock==SHARED_LOCK || pInode->eFileLock==RESERVED_LOCK) ){ + assert( eFileLock==SHARED_LOCK ); + assert( pFile->eFileLock==0 ); + assert( pInode->nShared>0 ); + pFile->eFileLock = SHARED_LOCK; + pInode->nShared++; + pInode->nLock++; + goto afp_end_lock; + } + + /* A PENDING lock is needed before acquiring a SHARED lock and before + ** acquiring an EXCLUSIVE lock. For the SHARED lock, the PENDING will + ** be released. + */ + if( eFileLock==SHARED_LOCK + || (eFileLock==EXCLUSIVE_LOCK && pFile->eFileLockdbPath, pFile, PENDING_BYTE, 1, 1); + if (failed) { + rc = failed; + goto afp_end_lock; + } + } + + /* If control gets to this point, then actually go ahead and make + ** operating system calls for the specified lock. + */ + if( eFileLock==SHARED_LOCK ){ + int lrc1, lrc2, lrc1Errno = 0; + long lk, mask; + + assert( pInode->nShared==0 ); + assert( pInode->eFileLock==0 ); + + mask = (sizeof(long)==8) ? LARGEST_INT64 : 0x7fffffff; + /* Now get the read-lock SHARED_LOCK */ + /* note that the quality of the randomness doesn't matter that much */ + lk = random(); + pInode->sharedByte = (lk & mask)%(SHARED_SIZE - 1); + lrc1 = afpSetLock(context->dbPath, pFile, + SHARED_FIRST+pInode->sharedByte, 1, 1); + if( IS_LOCK_ERROR(lrc1) ){ + lrc1Errno = pFile->lastErrno; + } + /* Drop the temporary PENDING lock */ + lrc2 = afpSetLock(context->dbPath, pFile, PENDING_BYTE, 1, 0); + + if( IS_LOCK_ERROR(lrc1) ) { + storeLastErrno(pFile, lrc1Errno); + rc = lrc1; + goto afp_end_lock; + } else if( IS_LOCK_ERROR(lrc2) ){ + rc = lrc2; + goto afp_end_lock; + } else if( lrc1 != SQLITE_OK ) { + rc = lrc1; + } else { + pFile->eFileLock = SHARED_LOCK; + pInode->nLock++; + pInode->nShared = 1; + } + }else if( eFileLock==EXCLUSIVE_LOCK && pInode->nShared>1 ){ + /* We are trying for an exclusive lock but another thread in this + ** same process is still holding a shared lock. */ + rc = SQLITE_BUSY; + }else{ + /* The request was for a RESERVED or EXCLUSIVE lock. It is + ** assumed that there is a SHARED or greater lock on the file + ** already. + */ + int failed = 0; + assert( 0!=pFile->eFileLock ); + if (eFileLock >= RESERVED_LOCK && pFile->eFileLock < RESERVED_LOCK) { + /* Acquire a RESERVED lock */ + failed = afpSetLock(context->dbPath, pFile, RESERVED_BYTE, 1,1); + if( !failed ){ + context->reserved = 1; + } + } + if (!failed && eFileLock == EXCLUSIVE_LOCK) { + /* Acquire an EXCLUSIVE lock */ + + /* Remove the shared lock before trying the range. we'll need to + ** reestablish the shared lock if we can't get the afpUnlock + */ + if( !(failed = afpSetLock(context->dbPath, pFile, SHARED_FIRST + + pInode->sharedByte, 1, 0)) ){ + int failed2 = SQLITE_OK; + /* now attemmpt to get the exclusive lock range */ + failed = afpSetLock(context->dbPath, pFile, SHARED_FIRST, + SHARED_SIZE, 1); + if( failed && (failed2 = afpSetLock(context->dbPath, pFile, + SHARED_FIRST + pInode->sharedByte, 1, 1)) ){ + /* Can't reestablish the shared lock. Sqlite can't deal, this is + ** a critical I/O error + */ + rc = ((failed & SQLITE_IOERR) == SQLITE_IOERR) ? failed2 : + SQLITE_IOERR_LOCK; + goto afp_end_lock; + } + }else{ + rc = failed; + } + } + if( failed ){ + rc = failed; + } + } + + if( rc==SQLITE_OK ){ + pFile->eFileLock = eFileLock; + pInode->eFileLock = eFileLock; + }else if( eFileLock==EXCLUSIVE_LOCK ){ + pFile->eFileLock = PENDING_LOCK; + pInode->eFileLock = PENDING_LOCK; + } + +afp_end_lock: + unixLeaveMutex(); + OSTRACE(("LOCK %d %s %s (afp)\n", pFile->h, azFileLock(eFileLock), + rc==SQLITE_OK ? "ok" : "failed")); + return rc; +} + +/* +** Lower the locking level on file descriptor pFile to eFileLock. eFileLock +** must be either NO_LOCK or SHARED_LOCK. +** +** If the locking level of the file descriptor is already at or below +** the requested locking level, this routine is a no-op. +*/ +static int afpUnlock(sqlite3_file *id, int eFileLock) { + int rc = SQLITE_OK; + unixFile *pFile = (unixFile*)id; + unixInodeInfo *pInode; + afpLockingContext *context = (afpLockingContext *) pFile->lockingContext; + int skipShared = 0; +#ifdef SQLITE_TEST + int h = pFile->h; +#endif + + assert( pFile ); + OSTRACE(("UNLOCK %d %d was %d(%d,%d) pid=%d (afp)\n", pFile->h, eFileLock, + pFile->eFileLock, pFile->pInode->eFileLock, pFile->pInode->nShared, + osGetpid(0))); + + assert( eFileLock<=SHARED_LOCK ); + if( pFile->eFileLock<=eFileLock ){ + return SQLITE_OK; + } + unixEnterMutex(); + pInode = pFile->pInode; + assert( pInode->nShared!=0 ); + if( pFile->eFileLock>SHARED_LOCK ){ + assert( pInode->eFileLock==pFile->eFileLock ); + SimulateIOErrorBenign(1); + SimulateIOError( h=(-1) ) + SimulateIOErrorBenign(0); + +#ifdef SQLITE_DEBUG + /* When reducing a lock such that other processes can start + ** reading the database file again, make sure that the + ** transaction counter was updated if any part of the database + ** file changed. If the transaction counter is not updated, + ** other connections to the same file might not realize that + ** the file has changed and hence might not know to flush their + ** cache. The use of a stale cache can lead to database corruption. + */ + assert( pFile->inNormalWrite==0 + || pFile->dbUpdate==0 + || pFile->transCntrChng==1 ); + pFile->inNormalWrite = 0; +#endif + + if( pFile->eFileLock==EXCLUSIVE_LOCK ){ + rc = afpSetLock(context->dbPath, pFile, SHARED_FIRST, SHARED_SIZE, 0); + if( rc==SQLITE_OK && (eFileLock==SHARED_LOCK || pInode->nShared>1) ){ + /* only re-establish the shared lock if necessary */ + int sharedLockByte = SHARED_FIRST+pInode->sharedByte; + rc = afpSetLock(context->dbPath, pFile, sharedLockByte, 1, 1); + } else { + skipShared = 1; + } + } + if( rc==SQLITE_OK && pFile->eFileLock>=PENDING_LOCK ){ + rc = afpSetLock(context->dbPath, pFile, PENDING_BYTE, 1, 0); + } + if( rc==SQLITE_OK && pFile->eFileLock>=RESERVED_LOCK && context->reserved ){ + rc = afpSetLock(context->dbPath, pFile, RESERVED_BYTE, 1, 0); + if( !rc ){ + context->reserved = 0; + } + } + if( rc==SQLITE_OK && (eFileLock==SHARED_LOCK || pInode->nShared>1)){ + pInode->eFileLock = SHARED_LOCK; + } + } + if( rc==SQLITE_OK && eFileLock==NO_LOCK ){ + + /* Decrement the shared lock counter. Release the lock using an + ** OS call only when all threads in this same process have released + ** the lock. + */ + unsigned long long sharedLockByte = SHARED_FIRST+pInode->sharedByte; + pInode->nShared--; + if( pInode->nShared==0 ){ + SimulateIOErrorBenign(1); + SimulateIOError( h=(-1) ) + SimulateIOErrorBenign(0); + if( !skipShared ){ + rc = afpSetLock(context->dbPath, pFile, sharedLockByte, 1, 0); + } + if( !rc ){ + pInode->eFileLock = NO_LOCK; + pFile->eFileLock = NO_LOCK; + } + } + if( rc==SQLITE_OK ){ + pInode->nLock--; + assert( pInode->nLock>=0 ); + if( pInode->nLock==0 ){ + closePendingFds(pFile); + } + } + } + + unixLeaveMutex(); + if( rc==SQLITE_OK ) pFile->eFileLock = eFileLock; + return rc; +} + +/* +** Close a file & cleanup AFP specific locking context +*/ +static int afpClose(sqlite3_file *id) { + int rc = SQLITE_OK; + unixFile *pFile = (unixFile*)id; + assert( id!=0 ); + afpUnlock(id, NO_LOCK); + unixEnterMutex(); + if( pFile->pInode && pFile->pInode->nLock ){ + /* If there are outstanding locks, do not actually close the file just + ** yet because that would clear those locks. Instead, add the file + ** descriptor to pInode->aPending. It will be automatically closed when + ** the last lock is cleared. + */ + setPendingFd(pFile); + } + releaseInodeInfo(pFile); + sqlite3_free(pFile->lockingContext); + rc = closeUnixFile(id); + unixLeaveMutex(); + return rc; +} + +#endif /* defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE */ +/* +** The code above is the AFP lock implementation. The code is specific +** to MacOSX and does not work on other unix platforms. No alternative +** is available. If you don't compile for a mac, then the "unix-afp" +** VFS is not available. +** +********************* End of the AFP lock implementation ********************** +******************************************************************************/ + +/****************************************************************************** +*************************** Begin NFS Locking ********************************/ + +#if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE +/* + ** Lower the locking level on file descriptor pFile to eFileLock. eFileLock + ** must be either NO_LOCK or SHARED_LOCK. + ** + ** If the locking level of the file descriptor is already at or below + ** the requested locking level, this routine is a no-op. + */ +static int nfsUnlock(sqlite3_file *id, int eFileLock){ + return posixUnlock(id, eFileLock, 1); +} + +#endif /* defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE */ +/* +** The code above is the NFS lock implementation. The code is specific +** to MacOSX and does not work on other unix platforms. No alternative +** is available. +** +********************* End of the NFS lock implementation ********************** +******************************************************************************/ + +/****************************************************************************** +**************** Non-locking sqlite3_file methods ***************************** +** +** The next division contains implementations for all methods of the +** sqlite3_file object other than the locking methods. The locking +** methods were defined in divisions above (one locking method per +** division). Those methods that are common to all locking modes +** are gather together into this division. +*/ + +/* +** Seek to the offset passed as the second argument, then read cnt +** bytes into pBuf. Return the number of bytes actually read. +** +** NB: If you define USE_PREAD or USE_PREAD64, then it might also +** be necessary to define _XOPEN_SOURCE to be 500. This varies from +** one system to another. Since SQLite does not define USE_PREAD +** in any form by default, we will not attempt to define _XOPEN_SOURCE. +** See tickets #2741 and #2681. +** +** To avoid stomping the errno value on a failed read the lastErrno value +** is set before returning. +*/ +static int seekAndRead(unixFile *id, sqlite3_int64 offset, void *pBuf, int cnt){ + int got; + int prior = 0; +#if (!defined(USE_PREAD) && !defined(USE_PREAD64)) + i64 newOffset; +#endif + TIMER_START; + assert( cnt==(cnt&0x1ffff) ); + assert( id->h>2 ); + do{ +#if defined(USE_PREAD) + got = osPread(id->h, pBuf, cnt, offset); + SimulateIOError( got = -1 ); +#elif defined(USE_PREAD64) + got = osPread64(id->h, pBuf, cnt, offset); + SimulateIOError( got = -1 ); +#else + newOffset = lseek(id->h, offset, SEEK_SET); + SimulateIOError( newOffset = -1 ); + if( newOffset<0 ){ + storeLastErrno((unixFile*)id, errno); + return -1; + } + got = osRead(id->h, pBuf, cnt); +#endif + if( got==cnt ) break; + if( got<0 ){ + if( errno==EINTR ){ got = 1; continue; } + prior = 0; + storeLastErrno((unixFile*)id, errno); + break; + }else if( got>0 ){ + cnt -= got; + offset += got; + prior += got; + pBuf = (void*)(got + (char*)pBuf); + } + }while( got>0 ); + TIMER_END; + OSTRACE(("READ %-3d %5d %7lld %llu\n", + id->h, got+prior, offset-prior, TIMER_ELAPSED)); + return got+prior; +} + +/* +** Read data from a file into a buffer. Return SQLITE_OK if all +** bytes were read successfully and SQLITE_IOERR if anything goes +** wrong. +*/ +static int unixRead( + sqlite3_file *id, + void *pBuf, + int amt, + sqlite3_int64 offset +){ + unixFile *pFile = (unixFile *)id; + int got; + assert( id ); + assert( offset>=0 ); + assert( amt>0 ); + + /* If this is a database file (not a journal, master-journal or temp + ** file), the bytes in the locking range should never be read or written. */ +#if 0 + assert( pFile->pUnused==0 + || offset>=PENDING_BYTE+512 + || offset+amt<=PENDING_BYTE + ); +#endif + +#if SQLITE_MAX_MMAP_SIZE>0 + /* Deal with as much of this read request as possible by transfering + ** data from the memory mapping using memcpy(). */ + if( offsetmmapSize ){ + if( offset+amt <= pFile->mmapSize ){ + memcpy(pBuf, &((u8 *)(pFile->pMapRegion))[offset], amt); + return SQLITE_OK; + }else{ + int nCopy = pFile->mmapSize - offset; + memcpy(pBuf, &((u8 *)(pFile->pMapRegion))[offset], nCopy); + pBuf = &((u8 *)pBuf)[nCopy]; + amt -= nCopy; + offset += nCopy; + } + } +#endif + + got = seekAndRead(pFile, offset, pBuf, amt); + if( got==amt ){ + return SQLITE_OK; + }else if( got<0 ){ + /* lastErrno set by seekAndRead */ + return SQLITE_IOERR_READ; + }else{ + storeLastErrno(pFile, 0); /* not a system error */ + /* Unread parts of the buffer must be zero-filled */ + memset(&((char*)pBuf)[got], 0, amt-got); + return SQLITE_IOERR_SHORT_READ; + } +} + +/* +** Attempt to seek the file-descriptor passed as the first argument to +** absolute offset iOff, then attempt to write nBuf bytes of data from +** pBuf to it. If an error occurs, return -1 and set *piErrno. Otherwise, +** return the actual number of bytes written (which may be less than +** nBuf). +*/ +static int seekAndWriteFd( + int fd, /* File descriptor to write to */ + i64 iOff, /* File offset to begin writing at */ + const void *pBuf, /* Copy data from this buffer to the file */ + int nBuf, /* Size of buffer pBuf in bytes */ + int *piErrno /* OUT: Error number if error occurs */ +){ + int rc = 0; /* Value returned by system call */ + + assert( nBuf==(nBuf&0x1ffff) ); + assert( fd>2 ); + assert( piErrno!=0 ); + nBuf &= 0x1ffff; + TIMER_START; + +#if defined(USE_PREAD) + do{ rc = (int)osPwrite(fd, pBuf, nBuf, iOff); }while( rc<0 && errno==EINTR ); +#elif defined(USE_PREAD64) + do{ rc = (int)osPwrite64(fd, pBuf, nBuf, iOff);}while( rc<0 && errno==EINTR); +#else + do{ + i64 iSeek = lseek(fd, iOff, SEEK_SET); + SimulateIOError( iSeek = -1 ); + if( iSeek<0 ){ + rc = -1; + break; + } + rc = osWrite(fd, pBuf, nBuf); + }while( rc<0 && errno==EINTR ); +#endif + + TIMER_END; + OSTRACE(("WRITE %-3d %5d %7lld %llu\n", fd, rc, iOff, TIMER_ELAPSED)); + + if( rc<0 ) *piErrno = errno; + return rc; +} + + +/* +** Seek to the offset in id->offset then read cnt bytes into pBuf. +** Return the number of bytes actually read. Update the offset. +** +** To avoid stomping the errno value on a failed write the lastErrno value +** is set before returning. +*/ +static int seekAndWrite(unixFile *id, i64 offset, const void *pBuf, int cnt){ + return seekAndWriteFd(id->h, offset, pBuf, cnt, &id->lastErrno); +} + + +/* +** Write data from a buffer into a file. Return SQLITE_OK on success +** or some other error code on failure. +*/ +static int unixWrite( + sqlite3_file *id, + const void *pBuf, + int amt, + sqlite3_int64 offset +){ + unixFile *pFile = (unixFile*)id; + int wrote = 0; + assert( id ); + assert( amt>0 ); + + /* If this is a database file (not a journal, master-journal or temp + ** file), the bytes in the locking range should never be read or written. */ +#if 0 + assert( pFile->pUnused==0 + || offset>=PENDING_BYTE+512 + || offset+amt<=PENDING_BYTE + ); +#endif + +#ifdef SQLITE_DEBUG + /* 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) then record the fact that the database + ** has changed. If the transaction counter is modified, record that + ** fact too. + */ + if( pFile->inNormalWrite ){ + pFile->dbUpdate = 1; /* The database has been modified */ + if( offset<=24 && offset+amt>=27 ){ + int rc; + char oldCntr[4]; + SimulateIOErrorBenign(1); + rc = seekAndRead(pFile, 24, oldCntr, 4); + SimulateIOErrorBenign(0); + if( rc!=4 || memcmp(oldCntr, &((char*)pBuf)[24-offset], 4)!=0 ){ + pFile->transCntrChng = 1; /* The transaction counter has changed */ + } + } + } +#endif + +#if defined(SQLITE_MMAP_READWRITE) && SQLITE_MAX_MMAP_SIZE>0 + /* Deal with as much of this write request as possible by transfering + ** data from the memory mapping using memcpy(). */ + if( offsetmmapSize ){ + if( offset+amt <= pFile->mmapSize ){ + memcpy(&((u8 *)(pFile->pMapRegion))[offset], pBuf, amt); + return SQLITE_OK; + }else{ + int nCopy = pFile->mmapSize - offset; + memcpy(&((u8 *)(pFile->pMapRegion))[offset], pBuf, nCopy); + pBuf = &((u8 *)pBuf)[nCopy]; + amt -= nCopy; + offset += nCopy; + } + } +#endif + + while( (wrote = seekAndWrite(pFile, offset, pBuf, amt))0 ){ + amt -= wrote; + offset += wrote; + pBuf = &((char*)pBuf)[wrote]; + } + SimulateIOError(( wrote=(-1), amt=1 )); + SimulateDiskfullError(( wrote=0, amt=1 )); + + if( amt>wrote ){ + if( wrote<0 && pFile->lastErrno!=ENOSPC ){ + /* lastErrno set by seekAndWrite */ + return SQLITE_IOERR_WRITE; + }else{ + storeLastErrno(pFile, 0); /* not a system error */ + return SQLITE_FULL; + } + } + + return SQLITE_OK; +} + +#ifdef SQLITE_TEST +/* +** Count the number of fullsyncs and normal syncs. This is used to test +** that syncs and fullsyncs are occurring at the right times. +*/ +SQLITE_API int sqlite3_sync_count = 0; +SQLITE_API int sqlite3_fullsync_count = 0; +#endif + +/* +** We do not trust systems to provide a working fdatasync(). Some do. +** Others do no. To be safe, we will stick with the (slightly slower) +** fsync(). If you know that your system does support fdatasync() correctly, +** then simply compile with -Dfdatasync=fdatasync or -DHAVE_FDATASYNC +*/ +#if !defined(fdatasync) && !HAVE_FDATASYNC +# define fdatasync fsync +#endif + +/* +** Define HAVE_FULLFSYNC to 0 or 1 depending on whether or not +** the F_FULLFSYNC macro is defined. F_FULLFSYNC is currently +** only available on Mac OS X. But that could change. +*/ +#ifdef F_FULLFSYNC +# define HAVE_FULLFSYNC 1 +#else +# define HAVE_FULLFSYNC 0 +#endif + + +/* +** The fsync() system call does not work as advertised on many +** unix systems. The following procedure is an attempt to make +** it work better. +** +** The SQLITE_NO_SYNC macro disables all fsync()s. This is useful +** for testing when we want to run through the test suite quickly. +** You are strongly advised *not* to deploy with SQLITE_NO_SYNC +** enabled, however, since with SQLITE_NO_SYNC enabled, an OS crash +** or power failure will likely corrupt the database file. +** +** SQLite sets the dataOnly flag if the size of the file is unchanged. +** The idea behind dataOnly is that it should only write the file content +** to disk, not the inode. We only set dataOnly if the file size is +** unchanged since the file size is part of the inode. However, +** Ted Ts'o tells us that fdatasync() will also write the inode if the +** file size has changed. The only real difference between fdatasync() +** and fsync(), Ted tells us, is that fdatasync() will not flush the +** inode if the mtime or owner or other inode attributes have changed. +** We only care about the file size, not the other file attributes, so +** as far as SQLite is concerned, an fdatasync() is always adequate. +** So, we always use fdatasync() if it is available, regardless of +** the value of the dataOnly flag. +*/ +static int full_fsync(int fd, int fullSync, int dataOnly){ + int rc; + + /* The following "ifdef/elif/else/" block has the same structure as + ** the one below. It is replicated here solely to avoid cluttering + ** up the real code with the UNUSED_PARAMETER() macros. + */ +#ifdef SQLITE_NO_SYNC + UNUSED_PARAMETER(fd); + UNUSED_PARAMETER(fullSync); + UNUSED_PARAMETER(dataOnly); +#elif HAVE_FULLFSYNC + UNUSED_PARAMETER(dataOnly); +#else + UNUSED_PARAMETER(fullSync); + UNUSED_PARAMETER(dataOnly); +#endif + + /* Record the number of times that we do a normal fsync() and + ** FULLSYNC. This is used during testing to verify that this procedure + ** gets called with the correct arguments. + */ +#ifdef SQLITE_TEST + if( fullSync ) sqlite3_fullsync_count++; + sqlite3_sync_count++; +#endif + + /* If we compiled with the SQLITE_NO_SYNC flag, then syncing is a + ** no-op. But go ahead and call fstat() to validate the file + ** descriptor as we need a method to provoke a failure during + ** coverate testing. + */ +#ifdef SQLITE_NO_SYNC + { + struct stat buf; + rc = osFstat(fd, &buf); + } +#elif HAVE_FULLFSYNC + if( fullSync ){ + rc = osFcntl(fd, F_FULLFSYNC, 0); + }else{ + rc = 1; + } + /* If the FULLFSYNC failed, fall back to attempting an fsync(). + ** It shouldn't be possible for fullfsync to fail on the local + ** file system (on OSX), so failure indicates that FULLFSYNC + ** isn't supported for this file system. So, attempt an fsync + ** and (for now) ignore the overhead of a superfluous fcntl call. + ** It'd be better to detect fullfsync support once and avoid + ** the fcntl call every time sync is called. + */ + if( rc ) rc = fsync(fd); + +#elif defined(__APPLE__) + /* fdatasync() on HFS+ doesn't yet flush the file size if it changed correctly + ** so currently we default to the macro that redefines fdatasync to fsync + */ + rc = fsync(fd); +#else + rc = fdatasync(fd); +#if OS_VXWORKS + if( rc==-1 && errno==ENOTSUP ){ + rc = fsync(fd); + } +#endif /* OS_VXWORKS */ +#endif /* ifdef SQLITE_NO_SYNC elif HAVE_FULLFSYNC */ + + if( OS_VXWORKS && rc!= -1 ){ + rc = 0; + } + return rc; +} + +/* +** Open a file descriptor to the directory containing file zFilename. +** If successful, *pFd is set to the opened file descriptor and +** SQLITE_OK is returned. If an error occurs, either SQLITE_NOMEM +** or SQLITE_CANTOPEN is returned and *pFd is set to an undefined +** value. +** +** The directory file descriptor is used for only one thing - to +** fsync() a directory to make sure file creation and deletion events +** are flushed to disk. Such fsyncs are not needed on newer +** journaling filesystems, but are required on older filesystems. +** +** This routine can be overridden using the xSetSysCall interface. +** The ability to override this routine was added in support of the +** chromium sandbox. Opening a directory is a security risk (we are +** told) so making it overrideable allows the chromium sandbox to +** replace this routine with a harmless no-op. To make this routine +** a no-op, replace it with a stub that returns SQLITE_OK but leaves +** *pFd set to a negative number. +** +** If SQLITE_OK is returned, the caller is responsible for closing +** the file descriptor *pFd using close(). +*/ +static int openDirectory(const char *zFilename, int *pFd){ + int ii; + int fd = -1; + char zDirname[MAX_PATHNAME+1]; + + sqlite3_snprintf(MAX_PATHNAME, zDirname, "%s", zFilename); + for(ii=(int)strlen(zDirname); ii>0 && zDirname[ii]!='/'; ii--); + if( ii>0 ){ + zDirname[ii] = '\0'; + }else{ + if( zDirname[0]!='/' ) zDirname[0] = '.'; + zDirname[1] = 0; + } + fd = robust_open(zDirname, O_RDONLY|O_BINARY, 0); + if( fd>=0 ){ + OSTRACE(("OPENDIR %-3d %s\n", fd, zDirname)); + } + *pFd = fd; + if( fd>=0 ) return SQLITE_OK; + return unixLogError(SQLITE_CANTOPEN_BKPT, "openDirectory", zDirname); +} + +/* +** Make sure all writes to a particular file are committed to disk. +** +** If dataOnly==0 then both the file itself and its metadata (file +** size, access time, etc) are synced. If dataOnly!=0 then only the +** file data is synced. +** +** Under Unix, also make sure that the directory entry for the file +** has been created by fsync-ing the directory that contains the file. +** If we do not do this and we encounter a power failure, the directory +** entry for the journal might not exist after we reboot. The next +** SQLite to access the file will not know that the journal exists (because +** the directory entry for the journal was never created) and the transaction +** will not roll back - possibly leading to database corruption. +*/ +static int unixSync(sqlite3_file *id, int flags){ + int rc; + unixFile *pFile = (unixFile*)id; + + int isDataOnly = (flags&SQLITE_SYNC_DATAONLY); + int isFullsync = (flags&0x0F)==SQLITE_SYNC_FULL; + + /* Check that one of SQLITE_SYNC_NORMAL or FULL was passed */ + assert((flags&0x0F)==SQLITE_SYNC_NORMAL + || (flags&0x0F)==SQLITE_SYNC_FULL + ); + + /* Unix cannot, but some systems may return SQLITE_FULL from here. This + ** line is to test that doing so does not cause any problems. + */ + SimulateDiskfullError( return SQLITE_FULL ); + + assert( pFile ); + OSTRACE(("SYNC %-3d\n", pFile->h)); + rc = full_fsync(pFile->h, isFullsync, isDataOnly); + SimulateIOError( rc=1 ); + if( rc ){ + storeLastErrno(pFile, errno); + return unixLogError(SQLITE_IOERR_FSYNC, "full_fsync", pFile->zPath); + } + + /* Also fsync the directory containing the file if the DIRSYNC flag + ** is set. This is a one-time occurrence. Many systems (examples: AIX) + ** are unable to fsync a directory, so ignore errors on the fsync. + */ + if( pFile->ctrlFlags & UNIXFILE_DIRSYNC ){ + int dirfd; + OSTRACE(("DIRSYNC %s (have_fullfsync=%d fullsync=%d)\n", pFile->zPath, + HAVE_FULLFSYNC, isFullsync)); + rc = osOpenDirectory(pFile->zPath, &dirfd); + if( rc==SQLITE_OK ){ + full_fsync(dirfd, 0, 0); + robust_close(pFile, dirfd, __LINE__); + }else{ + assert( rc==SQLITE_CANTOPEN ); + rc = SQLITE_OK; + } + pFile->ctrlFlags &= ~UNIXFILE_DIRSYNC; + } + return rc; +} + +/* +** Truncate an open file to a specified size +*/ +static int unixTruncate(sqlite3_file *id, i64 nByte){ + unixFile *pFile = (unixFile *)id; + int rc; + assert( pFile ); + SimulateIOError( return SQLITE_IOERR_TRUNCATE ); + + /* If the user has configured a chunk-size for this file, truncate the + ** file so that it consists of an integer number of chunks (i.e. the + ** actual file size after the operation may be larger than the requested + ** size). + */ + if( pFile->szChunk>0 ){ + nByte = ((nByte + pFile->szChunk - 1)/pFile->szChunk) * pFile->szChunk; + } + + rc = robust_ftruncate(pFile->h, nByte); + if( rc ){ + storeLastErrno(pFile, errno); + return unixLogError(SQLITE_IOERR_TRUNCATE, "ftruncate", pFile->zPath); + }else{ +#ifdef SQLITE_DEBUG + /* 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( pFile->inNormalWrite && nByte==0 ){ + pFile->transCntrChng = 1; + } +#endif + +#if SQLITE_MAX_MMAP_SIZE>0 + /* If the file was just truncated to a size smaller than the currently + ** mapped region, reduce the effective mapping size as well. SQLite will + ** use read() and write() to access data beyond this point from now on. + */ + if( nBytemmapSize ){ + pFile->mmapSize = nByte; + } +#endif + + return SQLITE_OK; + } +} + +/* +** Determine the current size of a file in bytes +*/ +static int unixFileSize(sqlite3_file *id, i64 *pSize){ + int rc; + struct stat buf; + assert( id ); + rc = osFstat(((unixFile*)id)->h, &buf); + SimulateIOError( rc=1 ); + if( rc!=0 ){ + storeLastErrno((unixFile*)id, errno); + return SQLITE_IOERR_FSTAT; + } + *pSize = buf.st_size; + + /* When opening a zero-size database, the findInodeInfo() procedure + ** writes a single byte into that file in order to work around a bug + ** in the OS-X msdos filesystem. In order to avoid problems with upper + ** layers, we need to report this file size as zero even though it is + ** really 1. Ticket #3260. + */ + if( *pSize==1 ) *pSize = 0; + + + return SQLITE_OK; +} + +#if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) +/* +** Handler for proxy-locking file-control verbs. Defined below in the +** proxying locking division. +*/ +static int proxyFileControl(sqlite3_file*,int,void*); +#endif + +/* +** This function is called to handle the SQLITE_FCNTL_SIZE_HINT +** file-control operation. Enlarge the database to nBytes in size +** (rounded up to the next chunk-size). If the database is already +** nBytes or larger, this routine is a no-op. +*/ +static int fcntlSizeHint(unixFile *pFile, i64 nByte){ + if( pFile->szChunk>0 ){ + i64 nSize; /* Required file size */ + struct stat buf; /* Used to hold return values of fstat() */ + + if( osFstat(pFile->h, &buf) ){ + return SQLITE_IOERR_FSTAT; + } + + nSize = ((nByte+pFile->szChunk-1) / pFile->szChunk) * pFile->szChunk; + if( nSize>(i64)buf.st_size ){ + +#if defined(HAVE_POSIX_FALLOCATE) && HAVE_POSIX_FALLOCATE + /* The code below is handling the return value of osFallocate() + ** correctly. posix_fallocate() is defined to "returns zero on success, + ** or an error number on failure". See the manpage for details. */ + int err; + do{ + err = osFallocate(pFile->h, buf.st_size, nSize-buf.st_size); + }while( err==EINTR ); + if( err ) return SQLITE_IOERR_WRITE; +#else + /* If the OS does not have posix_fallocate(), fake it. Write a + ** single byte to the last byte in each block that falls entirely + ** within the extended region. Then, if required, a single byte + ** at offset (nSize-1), to set the size of the file correctly. + ** This is a similar technique to that used by glibc on systems + ** that do not have a real fallocate() call. + */ + int nBlk = buf.st_blksize; /* File-system block size */ + int nWrite = 0; /* Number of bytes written by seekAndWrite */ + i64 iWrite; /* Next offset to write to */ + + iWrite = (buf.st_size/nBlk)*nBlk + nBlk - 1; + assert( iWrite>=buf.st_size ); + assert( ((iWrite+1)%nBlk)==0 ); + for(/*no-op*/; iWrite=nSize ) iWrite = nSize - 1; + nWrite = seekAndWrite(pFile, iWrite, "", 1); + if( nWrite!=1 ) return SQLITE_IOERR_WRITE; + } +#endif + } + } + +#if SQLITE_MAX_MMAP_SIZE>0 + if( pFile->mmapSizeMax>0 && nByte>pFile->mmapSize ){ + int rc; + if( pFile->szChunk<=0 ){ + if( robust_ftruncate(pFile->h, nByte) ){ + storeLastErrno(pFile, errno); + return unixLogError(SQLITE_IOERR_TRUNCATE, "ftruncate", pFile->zPath); + } + } + + rc = unixMapfile(pFile, nByte); + return rc; + } +#endif + + return SQLITE_OK; +} + +/* +** If *pArg is initially negative then this is a query. Set *pArg to +** 1 or 0 depending on whether or not bit mask of pFile->ctrlFlags is set. +** +** If *pArg is 0 or 1, then clear or set the mask bit of pFile->ctrlFlags. +*/ +static void unixModeBit(unixFile *pFile, unsigned char mask, int *pArg){ + if( *pArg<0 ){ + *pArg = (pFile->ctrlFlags & mask)!=0; + }else if( (*pArg)==0 ){ + pFile->ctrlFlags &= ~mask; + }else{ + pFile->ctrlFlags |= mask; + } +} + +/* Forward declaration */ +static int unixGetTempname(int nBuf, char *zBuf); + +/* +** Information and control of an open file handle. +*/ +static int unixFileControl(sqlite3_file *id, int op, void *pArg){ + unixFile *pFile = (unixFile*)id; + switch( op ){ + case SQLITE_FCNTL_LOCKSTATE: { + *(int*)pArg = pFile->eFileLock; + return SQLITE_OK; + } + case SQLITE_FCNTL_LAST_ERRNO: { + *(int*)pArg = pFile->lastErrno; + return SQLITE_OK; + } + case SQLITE_FCNTL_CHUNK_SIZE: { + pFile->szChunk = *(int *)pArg; + return SQLITE_OK; + } + case SQLITE_FCNTL_SIZE_HINT: { + int rc; + SimulateIOErrorBenign(1); + rc = fcntlSizeHint(pFile, *(i64 *)pArg); + SimulateIOErrorBenign(0); + return rc; + } + case SQLITE_FCNTL_PERSIST_WAL: { + unixModeBit(pFile, UNIXFILE_PERSIST_WAL, (int*)pArg); + return SQLITE_OK; + } + case SQLITE_FCNTL_POWERSAFE_OVERWRITE: { + unixModeBit(pFile, UNIXFILE_PSOW, (int*)pArg); + return SQLITE_OK; + } + case SQLITE_FCNTL_VFSNAME: { + *(char**)pArg = sqlite3_mprintf("%s", pFile->pVfs->zName); + return SQLITE_OK; + } + case SQLITE_FCNTL_TEMPFILENAME: { + char *zTFile = sqlite3_malloc64( pFile->pVfs->mxPathname ); + if( zTFile ){ + unixGetTempname(pFile->pVfs->mxPathname, zTFile); + *(char**)pArg = zTFile; + } + return SQLITE_OK; + } + case SQLITE_FCNTL_HAS_MOVED: { + *(int*)pArg = fileHasMoved(pFile); + return SQLITE_OK; + } +#if SQLITE_MAX_MMAP_SIZE>0 + case SQLITE_FCNTL_MMAP_SIZE: { + i64 newLimit = *(i64*)pArg; + int rc = SQLITE_OK; + if( newLimit>sqlite3GlobalConfig.mxMmap ){ + newLimit = sqlite3GlobalConfig.mxMmap; + } + *(i64*)pArg = pFile->mmapSizeMax; + if( newLimit>=0 && newLimit!=pFile->mmapSizeMax && pFile->nFetchOut==0 ){ + pFile->mmapSizeMax = newLimit; + if( pFile->mmapSize>0 ){ + unixUnmapfile(pFile); + rc = unixMapfile(pFile, -1); + } + } + return rc; + } +#endif +#ifdef SQLITE_DEBUG + /* The pager calls this method to signal that it has done + ** a rollback and that the database is therefore unchanged and + ** it hence it is OK for the transaction change counter to be + ** unchanged. + */ + case SQLITE_FCNTL_DB_UNCHANGED: { + ((unixFile*)id)->dbUpdate = 0; + return SQLITE_OK; + } +#endif +#if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) + case SQLITE_FCNTL_SET_LOCKPROXYFILE: + case SQLITE_FCNTL_GET_LOCKPROXYFILE: { + return proxyFileControl(id,op,pArg); + } +#endif /* SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) */ + } + return SQLITE_NOTFOUND; +} + +/* +** Return the sector size in bytes of the underlying block device for +** the specified file. This is almost always 512 bytes, but may be +** larger for some devices. +** +** SQLite code assumes this function cannot fail. It also assumes that +** if two files are created in the same file-system directory (i.e. +** a database and its journal file) that the sector size will be the +** same for both. +*/ +#ifndef __QNXNTO__ +static int unixSectorSize(sqlite3_file *NotUsed){ + UNUSED_PARAMETER(NotUsed); + return SQLITE_DEFAULT_SECTOR_SIZE; +} +#endif + +/* +** The following version of unixSectorSize() is optimized for QNX. +*/ +#ifdef __QNXNTO__ +#include +#include +static int unixSectorSize(sqlite3_file *id){ + unixFile *pFile = (unixFile*)id; + if( pFile->sectorSize == 0 ){ + struct statvfs fsInfo; + + /* Set defaults for non-supported filesystems */ + pFile->sectorSize = SQLITE_DEFAULT_SECTOR_SIZE; + pFile->deviceCharacteristics = 0; + if( fstatvfs(pFile->h, &fsInfo) == -1 ) { + return pFile->sectorSize; + } + + if( !strcmp(fsInfo.f_basetype, "tmp") ) { + pFile->sectorSize = fsInfo.f_bsize; + pFile->deviceCharacteristics = + SQLITE_IOCAP_ATOMIC4K | /* All ram filesystem writes are atomic */ + SQLITE_IOCAP_SAFE_APPEND | /* growing the file does not occur until + ** the write succeeds */ + SQLITE_IOCAP_SEQUENTIAL | /* The ram filesystem has no write behind + ** so it is ordered */ + 0; + }else if( strstr(fsInfo.f_basetype, "etfs") ){ + pFile->sectorSize = fsInfo.f_bsize; + pFile->deviceCharacteristics = + /* etfs cluster size writes are atomic */ + (pFile->sectorSize / 512 * SQLITE_IOCAP_ATOMIC512) | + SQLITE_IOCAP_SAFE_APPEND | /* growing the file does not occur until + ** the write succeeds */ + SQLITE_IOCAP_SEQUENTIAL | /* The ram filesystem has no write behind + ** so it is ordered */ + 0; + }else if( !strcmp(fsInfo.f_basetype, "qnx6") ){ + pFile->sectorSize = fsInfo.f_bsize; + pFile->deviceCharacteristics = + SQLITE_IOCAP_ATOMIC | /* All filesystem writes are atomic */ + SQLITE_IOCAP_SAFE_APPEND | /* growing the file does not occur until + ** the write succeeds */ + SQLITE_IOCAP_SEQUENTIAL | /* The ram filesystem has no write behind + ** so it is ordered */ + 0; + }else if( !strcmp(fsInfo.f_basetype, "qnx4") ){ + pFile->sectorSize = fsInfo.f_bsize; + pFile->deviceCharacteristics = + /* full bitset of atomics from max sector size and smaller */ + ((pFile->sectorSize / 512 * SQLITE_IOCAP_ATOMIC512) << 1) - 2 | + SQLITE_IOCAP_SEQUENTIAL | /* The ram filesystem has no write behind + ** so it is ordered */ + 0; + }else if( strstr(fsInfo.f_basetype, "dos") ){ + pFile->sectorSize = fsInfo.f_bsize; + pFile->deviceCharacteristics = + /* full bitset of atomics from max sector size and smaller */ + ((pFile->sectorSize / 512 * SQLITE_IOCAP_ATOMIC512) << 1) - 2 | + SQLITE_IOCAP_SEQUENTIAL | /* The ram filesystem has no write behind + ** so it is ordered */ + 0; + }else{ + pFile->deviceCharacteristics = + SQLITE_IOCAP_ATOMIC512 | /* blocks are atomic */ + SQLITE_IOCAP_SAFE_APPEND | /* growing the file does not occur until + ** the write succeeds */ + 0; + } + } + /* Last chance verification. If the sector size isn't a multiple of 512 + ** then it isn't valid.*/ + if( pFile->sectorSize % 512 != 0 ){ + pFile->deviceCharacteristics = 0; + pFile->sectorSize = SQLITE_DEFAULT_SECTOR_SIZE; + } + return pFile->sectorSize; +} +#endif /* __QNXNTO__ */ + +/* +** Return the device characteristics for the file. +** +** This VFS is set up to return SQLITE_IOCAP_POWERSAFE_OVERWRITE by default. +** However, that choice is controversial since technically the underlying +** file system does not always provide powersafe overwrites. (In other +** words, after a power-loss event, parts of the file that were never +** written might end up being altered.) However, non-PSOW behavior is very, +** very rare. And asserting PSOW makes a large reduction in the amount +** of required I/O for journaling, since a lot of padding is eliminated. +** Hence, while POWERSAFE_OVERWRITE is on by default, there is a file-control +** available to turn it off and URI query parameter available to turn it off. +*/ +static int unixDeviceCharacteristics(sqlite3_file *id){ + unixFile *p = (unixFile*)id; + int rc = 0; +#ifdef __QNXNTO__ + if( p->sectorSize==0 ) unixSectorSize(id); + rc = p->deviceCharacteristics; +#endif + if( p->ctrlFlags & UNIXFILE_PSOW ){ + rc |= SQLITE_IOCAP_POWERSAFE_OVERWRITE; + } + return rc; +} + +#if !defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0 + +/* +** Return the system page size. +** +** This function should not be called directly by other code in this file. +** Instead, it should be called via macro osGetpagesize(). +*/ +static int unixGetpagesize(void){ +#if OS_VXWORKS + return 1024; +#elif defined(_BSD_SOURCE) + return getpagesize(); +#else + return (int)sysconf(_SC_PAGESIZE); +#endif +} + +#endif /* !defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0 */ + +#ifndef SQLITE_OMIT_WAL + +/* +** Object used to represent an shared memory buffer. +** +** When multiple threads all reference the same wal-index, each thread +** has its own unixShm object, but they all point to a single instance +** of this unixShmNode object. In other words, each wal-index is opened +** only once per process. +** +** Each unixShmNode object is connected to a single unixInodeInfo object. +** We could coalesce this object into unixInodeInfo, but that would mean +** every open file that does not use shared memory (in other words, most +** open files) would have to carry around this extra information. So +** the unixInodeInfo object contains a pointer to this unixShmNode object +** and the unixShmNode object is created only when needed. +** +** unixMutexHeld() must be true when creating or destroying +** this object or while reading or writing the following fields: +** +** nRef +** +** The following fields are read-only after the object is created: +** +** fid +** zFilename +** +** Either unixShmNode.mutex must be held or unixShmNode.nRef==0 and +** unixMutexHeld() is true when reading or writing any other field +** in this structure. +*/ +struct unixShmNode { + unixInodeInfo *pInode; /* unixInodeInfo that owns this SHM node */ + sqlite3_mutex *mutex; /* Mutex to access this object */ + char *zFilename; /* Name of the mmapped file */ + int h; /* Open file descriptor */ + int szRegion; /* Size of shared-memory regions */ + u16 nRegion; /* Size of array apRegion */ + u8 isReadonly; /* True if read-only */ + char **apRegion; /* Array of mapped shared-memory regions */ + int nRef; /* Number of unixShm objects pointing to this */ + unixShm *pFirst; /* All unixShm objects pointing to this */ +#ifdef SQLITE_DEBUG + u8 exclMask; /* Mask of exclusive locks held */ + u8 sharedMask; /* Mask of shared locks held */ + u8 nextShmId; /* Next available unixShm.id value */ +#endif +}; + +/* +** Structure used internally by this VFS to record the state of an +** open shared memory connection. +** +** The following fields are initialized when this object is created and +** are read-only thereafter: +** +** unixShm.pFile +** unixShm.id +** +** All other fields are read/write. The unixShm.pFile->mutex must be held +** while accessing any read/write fields. +*/ +struct unixShm { + unixShmNode *pShmNode; /* The underlying unixShmNode object */ + unixShm *pNext; /* Next unixShm with the same unixShmNode */ + u8 hasMutex; /* True if holding the unixShmNode mutex */ + u8 id; /* Id of this connection within its unixShmNode */ + u16 sharedMask; /* Mask of shared locks held */ + u16 exclMask; /* Mask of exclusive locks held */ +}; + +/* +** Constants used for locking +*/ +#define UNIX_SHM_BASE ((22+SQLITE_SHM_NLOCK)*4) /* first lock byte */ +#define UNIX_SHM_DMS (UNIX_SHM_BASE+SQLITE_SHM_NLOCK) /* deadman switch */ + +/* +** Apply posix advisory locks for all bytes from ofst through ofst+n-1. +** +** Locks block if the mask is exactly UNIX_SHM_C and are non-blocking +** otherwise. +*/ +static int unixShmSystemLock( + unixFile *pFile, /* Open connection to the WAL file */ + int lockType, /* F_UNLCK, F_RDLCK, or F_WRLCK */ + int ofst, /* First byte of the locking range */ + int n /* Number of bytes to lock */ +){ + unixShmNode *pShmNode; /* Apply locks to this open shared-memory segment */ + struct flock f; /* The posix advisory locking structure */ + int rc = SQLITE_OK; /* Result code form fcntl() */ + + /* Access to the unixShmNode object is serialized by the caller */ + pShmNode = pFile->pInode->pShmNode; + assert( sqlite3_mutex_held(pShmNode->mutex) || pShmNode->nRef==0 ); + + /* Shared locks never span more than one byte */ + assert( n==1 || lockType!=F_RDLCK ); + + /* Locks are within range */ + assert( n>=1 && n<=SQLITE_SHM_NLOCK ); + + if( pShmNode->h>=0 ){ + /* Initialize the locking parameters */ + memset(&f, 0, sizeof(f)); + f.l_type = lockType; + f.l_whence = SEEK_SET; + f.l_start = ofst; + f.l_len = n; + + rc = osFcntl(pShmNode->h, F_SETLK, &f); + rc = (rc!=(-1)) ? SQLITE_OK : SQLITE_BUSY; + } + + /* Update the global lock state and do debug tracing */ +#ifdef SQLITE_DEBUG + { u16 mask; + OSTRACE(("SHM-LOCK ")); + mask = ofst>31 ? 0xffff : (1<<(ofst+n)) - (1<exclMask &= ~mask; + pShmNode->sharedMask &= ~mask; + }else if( lockType==F_RDLCK ){ + OSTRACE(("read-lock %d ok", ofst)); + pShmNode->exclMask &= ~mask; + pShmNode->sharedMask |= mask; + }else{ + assert( lockType==F_WRLCK ); + OSTRACE(("write-lock %d ok", ofst)); + pShmNode->exclMask |= mask; + pShmNode->sharedMask &= ~mask; + } + }else{ + if( lockType==F_UNLCK ){ + OSTRACE(("unlock %d failed", ofst)); + }else if( lockType==F_RDLCK ){ + OSTRACE(("read-lock failed")); + }else{ + assert( lockType==F_WRLCK ); + OSTRACE(("write-lock %d failed", ofst)); + } + } + OSTRACE((" - afterwards %03x,%03x\n", + pShmNode->sharedMask, pShmNode->exclMask)); + } +#endif + + return rc; +} + +/* +** Return the minimum number of 32KB shm regions that should be mapped at +** a time, assuming that each mapping must be an integer multiple of the +** current system page-size. +** +** Usually, this is 1. The exception seems to be systems that are configured +** to use 64KB pages - in this case each mapping must cover at least two +** shm regions. +*/ +static int unixShmRegionPerMap(void){ + int shmsz = 32*1024; /* SHM region size */ + int pgsz = osGetpagesize(); /* System page size */ + assert( ((pgsz-1)&pgsz)==0 ); /* Page size must be a power of 2 */ + if( pgszpInode->pShmNode; + assert( unixMutexHeld() ); + if( p && ALWAYS(p->nRef==0) ){ + int nShmPerMap = unixShmRegionPerMap(); + int i; + assert( p->pInode==pFd->pInode ); + sqlite3_mutex_free(p->mutex); + for(i=0; inRegion; i+=nShmPerMap){ + if( p->h>=0 ){ + osMunmap(p->apRegion[i], p->szRegion); + }else{ + sqlite3_free(p->apRegion[i]); + } + } + sqlite3_free(p->apRegion); + if( p->h>=0 ){ + robust_close(pFd, p->h, __LINE__); + p->h = -1; + } + p->pInode->pShmNode = 0; + sqlite3_free(p); + } +} + +/* +** Open a shared-memory area associated with open database file pDbFd. +** This particular implementation uses mmapped files. +** +** The file used to implement shared-memory is in the same directory +** as the open database file and has the same name as the open database +** file with the "-shm" suffix added. For example, if the database file +** is "/home/user1/config.db" then the file that is created and mmapped +** for shared memory will be called "/home/user1/config.db-shm". +** +** Another approach to is to use files in /dev/shm or /dev/tmp or an +** some other tmpfs mount. But if a file in a different directory +** from the database file is used, then differing access permissions +** or a chroot() might cause two different processes on the same +** database to end up using different files for shared memory - +** meaning that their memory would not really be shared - resulting +** in database corruption. Nevertheless, this tmpfs file usage +** can be enabled at compile-time using -DSQLITE_SHM_DIRECTORY="/dev/shm" +** or the equivalent. The use of the SQLITE_SHM_DIRECTORY compile-time +** option results in an incompatible build of SQLite; builds of SQLite +** that with differing SQLITE_SHM_DIRECTORY settings attempt to use the +** same database file at the same time, database corruption will likely +** result. The SQLITE_SHM_DIRECTORY compile-time option is considered +** "unsupported" and may go away in a future SQLite release. +** +** When opening a new shared-memory file, if no other instances of that +** file are currently open, in this process or in other processes, then +** the file must be truncated to zero length or have its header cleared. +** +** If the original database file (pDbFd) is using the "unix-excl" VFS +** that means that an exclusive lock is held on the database file and +** that no other processes are able to read or write the database. In +** that case, we do not really need shared memory. No shared memory +** file is created. The shared memory will be simulated with heap memory. +*/ +static int unixOpenSharedMemory(unixFile *pDbFd){ + struct unixShm *p = 0; /* The connection to be opened */ + struct unixShmNode *pShmNode; /* The underlying mmapped file */ + int rc; /* Result code */ + unixInodeInfo *pInode; /* The inode of fd */ + char *zShmFilename; /* Name of the file used for SHM */ + int nShmFilename; /* Size of the SHM filename in bytes */ + + /* Allocate space for the new unixShm object. */ + p = sqlite3_malloc64( sizeof(*p) ); + if( p==0 ) return SQLITE_NOMEM_BKPT; + memset(p, 0, sizeof(*p)); + assert( pDbFd->pShm==0 ); + + /* Check to see if a unixShmNode object already exists. Reuse an existing + ** one if present. Create a new one if necessary. + */ + unixEnterMutex(); + pInode = pDbFd->pInode; + pShmNode = pInode->pShmNode; + if( pShmNode==0 ){ + struct stat sStat; /* fstat() info for database file */ +#ifndef SQLITE_SHM_DIRECTORY + const char *zBasePath = pDbFd->zPath; +#endif + + /* Call fstat() to figure out the permissions on the database file. If + ** a new *-shm file is created, an attempt will be made to create it + ** with the same permissions. + */ + if( osFstat(pDbFd->h, &sStat) ){ + rc = SQLITE_IOERR_FSTAT; + goto shm_open_err; + } + +#ifdef SQLITE_SHM_DIRECTORY + nShmFilename = sizeof(SQLITE_SHM_DIRECTORY) + 31; +#else + nShmFilename = 6 + (int)strlen(zBasePath); +#endif + pShmNode = sqlite3_malloc64( sizeof(*pShmNode) + nShmFilename ); + if( pShmNode==0 ){ + rc = SQLITE_NOMEM_BKPT; + goto shm_open_err; + } + memset(pShmNode, 0, sizeof(*pShmNode)+nShmFilename); + zShmFilename = pShmNode->zFilename = (char*)&pShmNode[1]; +#ifdef SQLITE_SHM_DIRECTORY + sqlite3_snprintf(nShmFilename, zShmFilename, + SQLITE_SHM_DIRECTORY "/sqlite-shm-%x-%x", + (u32)sStat.st_ino, (u32)sStat.st_dev); +#else + sqlite3_snprintf(nShmFilename, zShmFilename, "%s-shm", zBasePath); + sqlite3FileSuffix3(pDbFd->zPath, zShmFilename); +#endif + pShmNode->h = -1; + pDbFd->pInode->pShmNode = pShmNode; + pShmNode->pInode = pDbFd->pInode; + if( sqlite3GlobalConfig.bCoreMutex ){ + pShmNode->mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_FAST); + if( pShmNode->mutex==0 ){ + rc = SQLITE_NOMEM_BKPT; + goto shm_open_err; + } + } + + if( pInode->bProcessLock==0 ){ + int openFlags = O_RDWR | O_CREAT; + if( sqlite3_uri_boolean(pDbFd->zPath, "readonly_shm", 0) ){ + openFlags = O_RDONLY; + pShmNode->isReadonly = 1; + } + pShmNode->h = robust_open(zShmFilename, openFlags, (sStat.st_mode&0777)); + if( pShmNode->h<0 ){ + rc = unixLogError(SQLITE_CANTOPEN_BKPT, "open", zShmFilename); + goto shm_open_err; + } + + /* If this process is running as root, make sure that the SHM file + ** is owned by the same user that owns the original database. Otherwise, + ** the original owner will not be able to connect. + */ + robustFchown(pShmNode->h, sStat.st_uid, sStat.st_gid); + + /* Check to see if another process is holding the dead-man switch. + ** If not, truncate the file to zero length. + */ + rc = SQLITE_OK; + if( unixShmSystemLock(pDbFd, F_WRLCK, UNIX_SHM_DMS, 1)==SQLITE_OK ){ + if( robust_ftruncate(pShmNode->h, 0) ){ + rc = unixLogError(SQLITE_IOERR_SHMOPEN, "ftruncate", zShmFilename); + } + } + if( rc==SQLITE_OK ){ + rc = unixShmSystemLock(pDbFd, F_RDLCK, UNIX_SHM_DMS, 1); + } + if( rc ) goto shm_open_err; + } + } + + /* Make the new connection a child of the unixShmNode */ + p->pShmNode = pShmNode; +#ifdef SQLITE_DEBUG + p->id = pShmNode->nextShmId++; +#endif + pShmNode->nRef++; + pDbFd->pShm = p; + unixLeaveMutex(); + + /* The reference count on pShmNode has already been incremented under + ** the cover of the unixEnterMutex() mutex and the pointer from the + ** new (struct unixShm) object to the pShmNode has been set. All that is + ** left to do is to link the new object into the linked list starting + ** at pShmNode->pFirst. This must be done while holding the pShmNode->mutex + ** mutex. + */ + sqlite3_mutex_enter(pShmNode->mutex); + p->pNext = pShmNode->pFirst; + pShmNode->pFirst = p; + sqlite3_mutex_leave(pShmNode->mutex); + return SQLITE_OK; + + /* Jump here on any error */ +shm_open_err: + unixShmPurge(pDbFd); /* This call frees pShmNode if required */ + sqlite3_free(p); + unixLeaveMutex(); + return rc; +} + +/* +** This function is called to obtain a pointer to region iRegion of the +** shared-memory associated with the database file fd. Shared-memory regions +** are numbered starting from zero. Each shared-memory region is szRegion +** bytes in size. +** +** If an error occurs, an error code is returned and *pp is set to NULL. +** +** Otherwise, if the bExtend parameter is 0 and the requested shared-memory +** region has not been allocated (by any client, including one running in a +** separate process), then *pp is set to NULL and SQLITE_OK returned. If +** bExtend is non-zero and the requested shared-memory region has not yet +** been allocated, it is allocated by this function. +** +** If the shared-memory region has already been allocated or is allocated by +** this call as described above, then it is mapped into this processes +** address space (if it is not already), *pp is set to point to the mapped +** memory and SQLITE_OK returned. +*/ +static int unixShmMap( + sqlite3_file *fd, /* Handle open on database file */ + int iRegion, /* Region to retrieve */ + int szRegion, /* Size of regions */ + int bExtend, /* True to extend file if necessary */ + void volatile **pp /* OUT: Mapped memory */ +){ + unixFile *pDbFd = (unixFile*)fd; + unixShm *p; + unixShmNode *pShmNode; + int rc = SQLITE_OK; + int nShmPerMap = unixShmRegionPerMap(); + int nReqRegion; + + /* If the shared-memory file has not yet been opened, open it now. */ + if( pDbFd->pShm==0 ){ + rc = unixOpenSharedMemory(pDbFd); + if( rc!=SQLITE_OK ) return rc; + } + + p = pDbFd->pShm; + pShmNode = p->pShmNode; + sqlite3_mutex_enter(pShmNode->mutex); + assert( szRegion==pShmNode->szRegion || pShmNode->nRegion==0 ); + assert( pShmNode->pInode==pDbFd->pInode ); + assert( pShmNode->h>=0 || pDbFd->pInode->bProcessLock==1 ); + assert( pShmNode->h<0 || pDbFd->pInode->bProcessLock==0 ); + + /* Minimum number of regions required to be mapped. */ + nReqRegion = ((iRegion+nShmPerMap) / nShmPerMap) * nShmPerMap; + + if( pShmNode->nRegionszRegion = szRegion; + + if( pShmNode->h>=0 ){ + /* The requested region is not mapped into this processes address space. + ** Check to see if it has been allocated (i.e. if the wal-index file is + ** large enough to contain the requested region). + */ + if( osFstat(pShmNode->h, &sStat) ){ + rc = SQLITE_IOERR_SHMSIZE; + goto shmpage_out; + } + + if( sStat.st_sizeh, iPg*pgsz + pgsz-1, "", 1, &x)!=1 ){ + const char *zFile = pShmNode->zFilename; + rc = unixLogError(SQLITE_IOERR_SHMSIZE, "write", zFile); + goto shmpage_out; + } + } + } + } + } + + /* Map the requested memory region into this processes address space. */ + apNew = (char **)sqlite3_realloc( + pShmNode->apRegion, nReqRegion*sizeof(char *) + ); + if( !apNew ){ + rc = SQLITE_IOERR_NOMEM_BKPT; + goto shmpage_out; + } + pShmNode->apRegion = apNew; + while( pShmNode->nRegionh>=0 ){ + pMem = osMmap(0, nMap, + pShmNode->isReadonly ? PROT_READ : PROT_READ|PROT_WRITE, + MAP_SHARED, pShmNode->h, szRegion*(i64)pShmNode->nRegion + ); + if( pMem==MAP_FAILED ){ + rc = unixLogError(SQLITE_IOERR_SHMMAP, "mmap", pShmNode->zFilename); + goto shmpage_out; + } + }else{ + pMem = sqlite3_malloc64(szRegion); + if( pMem==0 ){ + rc = SQLITE_NOMEM_BKPT; + goto shmpage_out; + } + memset(pMem, 0, szRegion); + } + + for(i=0; iapRegion[pShmNode->nRegion+i] = &((char*)pMem)[szRegion*i]; + } + pShmNode->nRegion += nShmPerMap; + } + } + +shmpage_out: + if( pShmNode->nRegion>iRegion ){ + *pp = pShmNode->apRegion[iRegion]; + }else{ + *pp = 0; + } + if( pShmNode->isReadonly && rc==SQLITE_OK ) rc = SQLITE_READONLY; + sqlite3_mutex_leave(pShmNode->mutex); + return rc; +} + +/* +** Change the lock state for a shared-memory segment. +** +** Note that the relationship between SHAREd and EXCLUSIVE locks is a little +** different here than in posix. In xShmLock(), one can go from unlocked +** to shared and back or from unlocked to exclusive and back. But one may +** not go from shared to exclusive or from exclusive to shared. +*/ +static int unixShmLock( + sqlite3_file *fd, /* Database file holding the shared memory */ + int ofst, /* First lock to acquire or release */ + int n, /* Number of locks to acquire or release */ + int flags /* What to do with the lock */ +){ + unixFile *pDbFd = (unixFile*)fd; /* Connection holding shared memory */ + unixShm *p = pDbFd->pShm; /* The shared memory being locked */ + unixShm *pX; /* For looping over all siblings */ + unixShmNode *pShmNode = p->pShmNode; /* The underlying file iNode */ + int rc = SQLITE_OK; /* Result code */ + u16 mask; /* Mask of locks to take or release */ + + assert( pShmNode==pDbFd->pInode->pShmNode ); + assert( pShmNode->pInode==pDbFd->pInode ); + assert( ofst>=0 && ofst+n<=SQLITE_SHM_NLOCK ); + assert( n>=1 ); + assert( flags==(SQLITE_SHM_LOCK | SQLITE_SHM_SHARED) + || flags==(SQLITE_SHM_LOCK | SQLITE_SHM_EXCLUSIVE) + || flags==(SQLITE_SHM_UNLOCK | SQLITE_SHM_SHARED) + || flags==(SQLITE_SHM_UNLOCK | SQLITE_SHM_EXCLUSIVE) ); + assert( n==1 || (flags & SQLITE_SHM_EXCLUSIVE)!=0 ); + assert( pShmNode->h>=0 || pDbFd->pInode->bProcessLock==1 ); + assert( pShmNode->h<0 || pDbFd->pInode->bProcessLock==0 ); + + mask = (1<<(ofst+n)) - (1<1 || mask==(1<mutex); + if( flags & SQLITE_SHM_UNLOCK ){ + u16 allMask = 0; /* Mask of locks held by siblings */ + + /* See if any siblings hold this same lock */ + for(pX=pShmNode->pFirst; pX; pX=pX->pNext){ + if( pX==p ) continue; + assert( (pX->exclMask & (p->exclMask|p->sharedMask))==0 ); + allMask |= pX->sharedMask; + } + + /* Unlock the system-level locks */ + if( (mask & allMask)==0 ){ + rc = unixShmSystemLock(pDbFd, F_UNLCK, ofst+UNIX_SHM_BASE, n); + }else{ + rc = SQLITE_OK; + } + + /* Undo the local locks */ + if( rc==SQLITE_OK ){ + p->exclMask &= ~mask; + p->sharedMask &= ~mask; + } + }else if( flags & SQLITE_SHM_SHARED ){ + u16 allShared = 0; /* Union of locks held by connections other than "p" */ + + /* Find out which shared locks are already held by sibling connections. + ** If any sibling already holds an exclusive lock, go ahead and return + ** SQLITE_BUSY. + */ + for(pX=pShmNode->pFirst; pX; pX=pX->pNext){ + if( (pX->exclMask & mask)!=0 ){ + rc = SQLITE_BUSY; + break; + } + allShared |= pX->sharedMask; + } + + /* Get shared locks at the system level, if necessary */ + if( rc==SQLITE_OK ){ + if( (allShared & mask)==0 ){ + rc = unixShmSystemLock(pDbFd, F_RDLCK, ofst+UNIX_SHM_BASE, n); + }else{ + rc = SQLITE_OK; + } + } + + /* Get the local shared locks */ + if( rc==SQLITE_OK ){ + p->sharedMask |= mask; + } + }else{ + /* Make sure no sibling connections hold locks that will block this + ** lock. If any do, return SQLITE_BUSY right away. + */ + for(pX=pShmNode->pFirst; pX; pX=pX->pNext){ + if( (pX->exclMask & mask)!=0 || (pX->sharedMask & mask)!=0 ){ + rc = SQLITE_BUSY; + break; + } + } + + /* Get the exclusive locks at the system level. Then if successful + ** also mark the local connection as being locked. + */ + if( rc==SQLITE_OK ){ + rc = unixShmSystemLock(pDbFd, F_WRLCK, ofst+UNIX_SHM_BASE, n); + if( rc==SQLITE_OK ){ + assert( (p->sharedMask & mask)==0 ); + p->exclMask |= mask; + } + } + } + sqlite3_mutex_leave(pShmNode->mutex); + OSTRACE(("SHM-LOCK shmid-%d, pid-%d got %03x,%03x\n", + p->id, osGetpid(0), p->sharedMask, p->exclMask)); + return rc; +} + +/* +** Implement a memory barrier or memory fence on shared memory. +** +** All loads and stores begun before the barrier must complete before +** any load or store begun after the barrier. +*/ +static void unixShmBarrier( + sqlite3_file *fd /* Database file holding the shared memory */ +){ + UNUSED_PARAMETER(fd); + sqlite3MemoryBarrier(); /* compiler-defined memory barrier */ + unixEnterMutex(); /* Also mutex, for redundancy */ + unixLeaveMutex(); +} + +/* +** Close a connection to shared-memory. Delete the underlying +** storage if deleteFlag is true. +** +** If there is no shared memory associated with the connection then this +** routine is a harmless no-op. +*/ +static int unixShmUnmap( + sqlite3_file *fd, /* The underlying database file */ + int deleteFlag /* Delete shared-memory if true */ +){ + unixShm *p; /* The connection to be closed */ + unixShmNode *pShmNode; /* The underlying shared-memory file */ + unixShm **pp; /* For looping over sibling connections */ + unixFile *pDbFd; /* The underlying database file */ + + pDbFd = (unixFile*)fd; + p = pDbFd->pShm; + if( p==0 ) return SQLITE_OK; + pShmNode = p->pShmNode; + + assert( pShmNode==pDbFd->pInode->pShmNode ); + assert( pShmNode->pInode==pDbFd->pInode ); + + /* Remove connection p from the set of connections associated + ** with pShmNode */ + sqlite3_mutex_enter(pShmNode->mutex); + for(pp=&pShmNode->pFirst; (*pp)!=p; pp = &(*pp)->pNext){} + *pp = p->pNext; + + /* Free the connection p */ + sqlite3_free(p); + pDbFd->pShm = 0; + sqlite3_mutex_leave(pShmNode->mutex); + + /* If pShmNode->nRef has reached 0, then close the underlying + ** shared-memory file, too */ + unixEnterMutex(); + assert( pShmNode->nRef>0 ); + pShmNode->nRef--; + if( pShmNode->nRef==0 ){ + if( deleteFlag && pShmNode->h>=0 ){ + osUnlink(pShmNode->zFilename); + } + unixShmPurge(pDbFd); + } + unixLeaveMutex(); + + return SQLITE_OK; +} + + +#else +# define unixShmMap 0 +# define unixShmLock 0 +# define unixShmBarrier 0 +# define unixShmUnmap 0 +#endif /* #ifndef SQLITE_OMIT_WAL */ + +#if SQLITE_MAX_MMAP_SIZE>0 +/* +** If it is currently memory mapped, unmap file pFd. +*/ +static void unixUnmapfile(unixFile *pFd){ + assert( pFd->nFetchOut==0 ); + if( pFd->pMapRegion ){ + osMunmap(pFd->pMapRegion, pFd->mmapSizeActual); + pFd->pMapRegion = 0; + pFd->mmapSize = 0; + pFd->mmapSizeActual = 0; + } +} + +/* +** Attempt to set the size of the memory mapping maintained by file +** descriptor pFd to nNew bytes. Any existing mapping is discarded. +** +** If successful, this function sets the following variables: +** +** unixFile.pMapRegion +** unixFile.mmapSize +** unixFile.mmapSizeActual +** +** If unsuccessful, an error message is logged via sqlite3_log() and +** the three variables above are zeroed. In this case SQLite should +** continue accessing the database using the xRead() and xWrite() +** methods. +*/ +static void unixRemapfile( + unixFile *pFd, /* File descriptor object */ + i64 nNew /* Required mapping size */ +){ + const char *zErr = "mmap"; + int h = pFd->h; /* File descriptor open on db file */ + u8 *pOrig = (u8 *)pFd->pMapRegion; /* Pointer to current file mapping */ + i64 nOrig = pFd->mmapSizeActual; /* Size of pOrig region in bytes */ + u8 *pNew = 0; /* Location of new mapping */ + int flags = PROT_READ; /* Flags to pass to mmap() */ + + assert( pFd->nFetchOut==0 ); + assert( nNew>pFd->mmapSize ); + assert( nNew<=pFd->mmapSizeMax ); + assert( nNew>0 ); + assert( pFd->mmapSizeActual>=pFd->mmapSize ); + assert( MAP_FAILED!=0 ); + +#ifdef SQLITE_MMAP_READWRITE + if( (pFd->ctrlFlags & UNIXFILE_RDONLY)==0 ) flags |= PROT_WRITE; +#endif + + if( pOrig ){ +#if HAVE_MREMAP + i64 nReuse = pFd->mmapSize; +#else + const int szSyspage = osGetpagesize(); + i64 nReuse = (pFd->mmapSize & ~(szSyspage-1)); +#endif + u8 *pReq = &pOrig[nReuse]; + + /* Unmap any pages of the existing mapping that cannot be reused. */ + if( nReuse!=nOrig ){ + osMunmap(pReq, nOrig-nReuse); + } + +#if HAVE_MREMAP + pNew = osMremap(pOrig, nReuse, nNew, MREMAP_MAYMOVE); + zErr = "mremap"; +#else + pNew = osMmap(pReq, nNew-nReuse, flags, MAP_SHARED, h, nReuse); + if( pNew!=MAP_FAILED ){ + if( pNew!=pReq ){ + osMunmap(pNew, nNew - nReuse); + pNew = 0; + }else{ + pNew = pOrig; + } + } +#endif + + /* The attempt to extend the existing mapping failed. Free it. */ + if( pNew==MAP_FAILED || pNew==0 ){ + osMunmap(pOrig, nReuse); + } + } + + /* If pNew is still NULL, try to create an entirely new mapping. */ + if( pNew==0 ){ + pNew = osMmap(0, nNew, flags, MAP_SHARED, h, 0); + } + + if( pNew==MAP_FAILED ){ + pNew = 0; + nNew = 0; + unixLogError(SQLITE_OK, zErr, pFd->zPath); + + /* If the mmap() above failed, assume that all subsequent mmap() calls + ** will probably fail too. Fall back to using xRead/xWrite exclusively + ** in this case. */ + pFd->mmapSizeMax = 0; + } + pFd->pMapRegion = (void *)pNew; + pFd->mmapSize = pFd->mmapSizeActual = nNew; +} + +/* +** Memory map or remap the file opened by file-descriptor pFd (if the file +** is already mapped, the existing mapping is replaced by the new). Or, if +** there already exists a mapping for this file, and there are still +** outstanding xFetch() references to it, this function is a no-op. +** +** If parameter nByte is non-negative, then it is the requested size of +** the mapping to create. Otherwise, if nByte is less than zero, then the +** requested size is the size of the file on disk. The actual size of the +** created mapping is either the requested size or the value configured +** using SQLITE_FCNTL_MMAP_LIMIT, whichever is smaller. +** +** SQLITE_OK is returned if no error occurs (even if the mapping is not +** recreated as a result of outstanding references) or an SQLite error +** code otherwise. +*/ +static int unixMapfile(unixFile *pFd, i64 nMap){ + assert( nMap>=0 || pFd->nFetchOut==0 ); + assert( nMap>0 || (pFd->mmapSize==0 && pFd->pMapRegion==0) ); + if( pFd->nFetchOut>0 ) return SQLITE_OK; + + if( nMap<0 ){ + struct stat statbuf; /* Low-level file information */ + if( osFstat(pFd->h, &statbuf) ){ + return SQLITE_IOERR_FSTAT; + } + nMap = statbuf.st_size; + } + if( nMap>pFd->mmapSizeMax ){ + nMap = pFd->mmapSizeMax; + } + + assert( nMap>0 || (pFd->mmapSize==0 && pFd->pMapRegion==0) ); + if( nMap!=pFd->mmapSize ){ + unixRemapfile(pFd, nMap); + } + + return SQLITE_OK; +} +#endif /* SQLITE_MAX_MMAP_SIZE>0 */ + +/* +** If possible, return a pointer to a mapping of file fd starting at offset +** iOff. The mapping must be valid for at least nAmt bytes. +** +** If such a pointer can be obtained, store it in *pp and return SQLITE_OK. +** Or, if one cannot but no error occurs, set *pp to 0 and return SQLITE_OK. +** Finally, if an error does occur, return an SQLite error code. The final +** value of *pp is undefined in this case. +** +** If this function does return a pointer, the caller must eventually +** release the reference by calling unixUnfetch(). +*/ +static int unixFetch(sqlite3_file *fd, i64 iOff, int nAmt, void **pp){ +#if SQLITE_MAX_MMAP_SIZE>0 + unixFile *pFd = (unixFile *)fd; /* The underlying database file */ +#endif + *pp = 0; + +#if SQLITE_MAX_MMAP_SIZE>0 + if( pFd->mmapSizeMax>0 ){ + if( pFd->pMapRegion==0 ){ + int rc = unixMapfile(pFd, -1); + if( rc!=SQLITE_OK ) return rc; + } + if( pFd->mmapSize >= iOff+nAmt ){ + *pp = &((u8 *)pFd->pMapRegion)[iOff]; + pFd->nFetchOut++; + } + } +#endif + return SQLITE_OK; +} + +/* +** If the third argument is non-NULL, then this function releases a +** reference obtained by an earlier call to unixFetch(). The second +** argument passed to this function must be the same as the corresponding +** argument that was passed to the unixFetch() invocation. +** +** Or, if the third argument is NULL, then this function is being called +** to inform the VFS layer that, according to POSIX, any existing mapping +** may now be invalid and should be unmapped. +*/ +static int unixUnfetch(sqlite3_file *fd, i64 iOff, void *p){ +#if SQLITE_MAX_MMAP_SIZE>0 + unixFile *pFd = (unixFile *)fd; /* The underlying database file */ + UNUSED_PARAMETER(iOff); + + /* If p==0 (unmap the entire file) then there must be no outstanding + ** xFetch references. Or, if p!=0 (meaning it is an xFetch reference), + ** then there must be at least one outstanding. */ + assert( (p==0)==(pFd->nFetchOut==0) ); + + /* If p!=0, it must match the iOff value. */ + assert( p==0 || p==&((u8 *)pFd->pMapRegion)[iOff] ); + + if( p ){ + pFd->nFetchOut--; + }else{ + unixUnmapfile(pFd); + } + + assert( pFd->nFetchOut>=0 ); +#else + UNUSED_PARAMETER(fd); + UNUSED_PARAMETER(p); + UNUSED_PARAMETER(iOff); +#endif + return SQLITE_OK; +} + +/* +** Here ends the implementation of all sqlite3_file methods. +** +********************** End sqlite3_file Methods ******************************* +******************************************************************************/ + +/* +** This division contains definitions of sqlite3_io_methods objects that +** implement various file locking strategies. It also contains definitions +** of "finder" functions. A finder-function is used to locate the appropriate +** sqlite3_io_methods object for a particular database file. The pAppData +** field of the sqlite3_vfs VFS objects are initialized to be pointers to +** the correct finder-function for that VFS. +** +** Most finder functions return a pointer to a fixed sqlite3_io_methods +** object. The only interesting finder-function is autolockIoFinder, which +** looks at the filesystem type and tries to guess the best locking +** strategy from that. +** +** For finder-function F, two objects are created: +** +** (1) The real finder-function named "FImpt()". +** +** (2) A constant pointer to this function named just "F". +** +** +** A pointer to the F pointer is used as the pAppData value for VFS +** objects. We have to do this instead of letting pAppData point +** directly at the finder-function since C90 rules prevent a void* +** from be cast into a function pointer. +** +** +** Each instance of this macro generates two objects: +** +** * A constant sqlite3_io_methods object call METHOD that has locking +** methods CLOSE, LOCK, UNLOCK, CKRESLOCK. +** +** * An I/O method finder function called FINDER that returns a pointer +** to the METHOD object in the previous bullet. +*/ +#define IOMETHODS(FINDER,METHOD,VERSION,CLOSE,LOCK,UNLOCK,CKLOCK,SHMMAP) \ +static const sqlite3_io_methods METHOD = { \ + VERSION, /* iVersion */ \ + CLOSE, /* xClose */ \ + unixRead, /* xRead */ \ + unixWrite, /* xWrite */ \ + unixTruncate, /* xTruncate */ \ + unixSync, /* xSync */ \ + unixFileSize, /* xFileSize */ \ + LOCK, /* xLock */ \ + UNLOCK, /* xUnlock */ \ + CKLOCK, /* xCheckReservedLock */ \ + unixFileControl, /* xFileControl */ \ + unixSectorSize, /* xSectorSize */ \ + unixDeviceCharacteristics, /* xDeviceCapabilities */ \ + SHMMAP, /* xShmMap */ \ + unixShmLock, /* xShmLock */ \ + unixShmBarrier, /* xShmBarrier */ \ + unixShmUnmap, /* xShmUnmap */ \ + unixFetch, /* xFetch */ \ + unixUnfetch, /* xUnfetch */ \ +}; \ +static const sqlite3_io_methods *FINDER##Impl(const char *z, unixFile *p){ \ + UNUSED_PARAMETER(z); UNUSED_PARAMETER(p); \ + return &METHOD; \ +} \ +static const sqlite3_io_methods *(*const FINDER)(const char*,unixFile *p) \ + = FINDER##Impl; + +/* +** Here are all of the sqlite3_io_methods objects for each of the +** locking strategies. Functions that return pointers to these methods +** are also created. +*/ +IOMETHODS( + posixIoFinder, /* Finder function name */ + posixIoMethods, /* sqlite3_io_methods object name */ + 3, /* shared memory and mmap are enabled */ + unixClose, /* xClose method */ + unixLock, /* xLock method */ + unixUnlock, /* xUnlock method */ + unixCheckReservedLock, /* xCheckReservedLock method */ + unixShmMap /* xShmMap method */ +) +IOMETHODS( + nolockIoFinder, /* Finder function name */ + nolockIoMethods, /* sqlite3_io_methods object name */ + 3, /* shared memory is disabled */ + nolockClose, /* xClose method */ + nolockLock, /* xLock method */ + nolockUnlock, /* xUnlock method */ + nolockCheckReservedLock, /* xCheckReservedLock method */ + 0 /* xShmMap method */ +) +IOMETHODS( + dotlockIoFinder, /* Finder function name */ + dotlockIoMethods, /* sqlite3_io_methods object name */ + 1, /* shared memory is disabled */ + dotlockClose, /* xClose method */ + dotlockLock, /* xLock method */ + dotlockUnlock, /* xUnlock method */ + dotlockCheckReservedLock, /* xCheckReservedLock method */ + 0 /* xShmMap method */ +) + +#if SQLITE_ENABLE_LOCKING_STYLE +IOMETHODS( + flockIoFinder, /* Finder function name */ + flockIoMethods, /* sqlite3_io_methods object name */ + 1, /* shared memory is disabled */ + flockClose, /* xClose method */ + flockLock, /* xLock method */ + flockUnlock, /* xUnlock method */ + flockCheckReservedLock, /* xCheckReservedLock method */ + 0 /* xShmMap method */ +) +#endif + +#if OS_VXWORKS +IOMETHODS( + semIoFinder, /* Finder function name */ + semIoMethods, /* sqlite3_io_methods object name */ + 1, /* shared memory is disabled */ + semXClose, /* xClose method */ + semXLock, /* xLock method */ + semXUnlock, /* xUnlock method */ + semXCheckReservedLock, /* xCheckReservedLock method */ + 0 /* xShmMap method */ +) +#endif + +#if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE +IOMETHODS( + afpIoFinder, /* Finder function name */ + afpIoMethods, /* sqlite3_io_methods object name */ + 1, /* shared memory is disabled */ + afpClose, /* xClose method */ + afpLock, /* xLock method */ + afpUnlock, /* xUnlock method */ + afpCheckReservedLock, /* xCheckReservedLock method */ + 0 /* xShmMap method */ +) +#endif + +/* +** The proxy locking method is a "super-method" in the sense that it +** opens secondary file descriptors for the conch and lock files and +** it uses proxy, dot-file, AFP, and flock() locking methods on those +** secondary files. For this reason, the division that implements +** proxy locking is located much further down in the file. But we need +** to go ahead and define the sqlite3_io_methods and finder function +** for proxy locking here. So we forward declare the I/O methods. +*/ +#if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE +static int proxyClose(sqlite3_file*); +static int proxyLock(sqlite3_file*, int); +static int proxyUnlock(sqlite3_file*, int); +static int proxyCheckReservedLock(sqlite3_file*, int*); +IOMETHODS( + proxyIoFinder, /* Finder function name */ + proxyIoMethods, /* sqlite3_io_methods object name */ + 1, /* shared memory is disabled */ + proxyClose, /* xClose method */ + proxyLock, /* xLock method */ + proxyUnlock, /* xUnlock method */ + proxyCheckReservedLock, /* xCheckReservedLock method */ + 0 /* xShmMap method */ +) +#endif + +/* nfs lockd on OSX 10.3+ doesn't clear write locks when a read lock is set */ +#if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE +IOMETHODS( + nfsIoFinder, /* Finder function name */ + nfsIoMethods, /* sqlite3_io_methods object name */ + 1, /* shared memory is disabled */ + unixClose, /* xClose method */ + unixLock, /* xLock method */ + nfsUnlock, /* xUnlock method */ + unixCheckReservedLock, /* xCheckReservedLock method */ + 0 /* xShmMap method */ +) +#endif + +#if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE +/* +** This "finder" function attempts to determine the best locking strategy +** for the database file "filePath". It then returns the sqlite3_io_methods +** object that implements that strategy. +** +** This is for MacOSX only. +*/ +static const sqlite3_io_methods *autolockIoFinderImpl( + const char *filePath, /* name of the database file */ + unixFile *pNew /* open file object for the database file */ +){ + static const struct Mapping { + const char *zFilesystem; /* Filesystem type name */ + const sqlite3_io_methods *pMethods; /* Appropriate locking method */ + } aMap[] = { + { "hfs", &posixIoMethods }, + { "ufs", &posixIoMethods }, + { "afpfs", &afpIoMethods }, + { "smbfs", &afpIoMethods }, + { "webdav", &nolockIoMethods }, + { 0, 0 } + }; + int i; + struct statfs fsInfo; + struct flock lockInfo; + + if( !filePath ){ + /* If filePath==NULL that means we are dealing with a transient file + ** that does not need to be locked. */ + return &nolockIoMethods; + } + if( statfs(filePath, &fsInfo) != -1 ){ + if( fsInfo.f_flags & MNT_RDONLY ){ + return &nolockIoMethods; + } + for(i=0; aMap[i].zFilesystem; i++){ + if( strcmp(fsInfo.f_fstypename, aMap[i].zFilesystem)==0 ){ + return aMap[i].pMethods; + } + } + } + + /* Default case. Handles, amongst others, "nfs". + ** Test byte-range lock using fcntl(). If the call succeeds, + ** assume that the file-system supports POSIX style locks. + */ + lockInfo.l_len = 1; + lockInfo.l_start = 0; + lockInfo.l_whence = SEEK_SET; + lockInfo.l_type = F_RDLCK; + if( osFcntl(pNew->h, F_GETLK, &lockInfo)!=-1 ) { + if( strcmp(fsInfo.f_fstypename, "nfs")==0 ){ + return &nfsIoMethods; + } else { + return &posixIoMethods; + } + }else{ + return &dotlockIoMethods; + } +} +static const sqlite3_io_methods + *(*const autolockIoFinder)(const char*,unixFile*) = autolockIoFinderImpl; + +#endif /* defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE */ + +#if OS_VXWORKS +/* +** This "finder" function for VxWorks checks to see if posix advisory +** locking works. If it does, then that is what is used. If it does not +** work, then fallback to named semaphore locking. +*/ +static const sqlite3_io_methods *vxworksIoFinderImpl( + const char *filePath, /* name of the database file */ + unixFile *pNew /* the open file object */ +){ + struct flock lockInfo; + + if( !filePath ){ + /* If filePath==NULL that means we are dealing with a transient file + ** that does not need to be locked. */ + return &nolockIoMethods; + } + + /* Test if fcntl() is supported and use POSIX style locks. + ** Otherwise fall back to the named semaphore method. + */ + lockInfo.l_len = 1; + lockInfo.l_start = 0; + lockInfo.l_whence = SEEK_SET; + lockInfo.l_type = F_RDLCK; + if( osFcntl(pNew->h, F_GETLK, &lockInfo)!=-1 ) { + return &posixIoMethods; + }else{ + return &semIoMethods; + } +} +static const sqlite3_io_methods + *(*const vxworksIoFinder)(const char*,unixFile*) = vxworksIoFinderImpl; + +#endif /* OS_VXWORKS */ + +/* +** An abstract type for a pointer to an IO method finder function: +*/ +typedef const sqlite3_io_methods *(*finder_type)(const char*,unixFile*); + + +/**************************************************************************** +**************************** sqlite3_vfs methods **************************** +** +** This division contains the implementation of methods on the +** sqlite3_vfs object. +*/ + +/* +** Initialize the contents of the unixFile structure pointed to by pId. +*/ +static int fillInUnixFile( + sqlite3_vfs *pVfs, /* Pointer to vfs object */ + int h, /* Open file descriptor of file being opened */ + sqlite3_file *pId, /* Write to the unixFile structure here */ + const char *zFilename, /* Name of the file being opened */ + int ctrlFlags /* Zero or more UNIXFILE_* values */ +){ + const sqlite3_io_methods *pLockingStyle; + unixFile *pNew = (unixFile *)pId; + int rc = SQLITE_OK; + + assert( pNew->pInode==NULL ); + + /* Usually the path zFilename should not be a relative pathname. The + ** exception is when opening the proxy "conch" file in builds that + ** include the special Apple locking styles. + */ +#if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE + assert( zFilename==0 || zFilename[0]=='/' + || pVfs->pAppData==(void*)&autolockIoFinder ); +#else + assert( zFilename==0 || zFilename[0]=='/' ); +#endif + + /* No locking occurs in temporary files */ + assert( zFilename!=0 || (ctrlFlags & UNIXFILE_NOLOCK)!=0 ); + + OSTRACE(("OPEN %-3d %s\n", h, zFilename)); + pNew->h = h; + pNew->pVfs = pVfs; + pNew->zPath = zFilename; + pNew->ctrlFlags = (u8)ctrlFlags; +#if SQLITE_MAX_MMAP_SIZE>0 + pNew->mmapSizeMax = sqlite3GlobalConfig.szMmap; +#endif + if( sqlite3_uri_boolean(((ctrlFlags & UNIXFILE_URI) ? zFilename : 0), + "psow", SQLITE_POWERSAFE_OVERWRITE) ){ + pNew->ctrlFlags |= UNIXFILE_PSOW; + } + if( strcmp(pVfs->zName,"unix-excl")==0 ){ + pNew->ctrlFlags |= UNIXFILE_EXCL; + } + +#if OS_VXWORKS + pNew->pId = vxworksFindFileId(zFilename); + if( pNew->pId==0 ){ + ctrlFlags |= UNIXFILE_NOLOCK; + rc = SQLITE_NOMEM_BKPT; + } +#endif + + if( ctrlFlags & UNIXFILE_NOLOCK ){ + pLockingStyle = &nolockIoMethods; + }else{ + pLockingStyle = (**(finder_type*)pVfs->pAppData)(zFilename, pNew); +#if SQLITE_ENABLE_LOCKING_STYLE + /* Cache zFilename in the locking context (AFP and dotlock override) for + ** proxyLock activation is possible (remote proxy is based on db name) + ** zFilename remains valid until file is closed, to support */ + pNew->lockingContext = (void*)zFilename; +#endif + } + + if( pLockingStyle == &posixIoMethods +#if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE + || pLockingStyle == &nfsIoMethods +#endif + ){ + unixEnterMutex(); + rc = findInodeInfo(pNew, &pNew->pInode); + if( rc!=SQLITE_OK ){ + /* If an error occurred in findInodeInfo(), close the file descriptor + ** immediately, before releasing the mutex. findInodeInfo() may fail + ** in two scenarios: + ** + ** (a) A call to fstat() failed. + ** (b) A malloc failed. + ** + ** Scenario (b) may only occur if the process is holding no other + ** file descriptors open on the same file. If there were other file + ** descriptors on this file, then no malloc would be required by + ** findInodeInfo(). If this is the case, it is quite safe to close + ** handle h - as it is guaranteed that no posix locks will be released + ** by doing so. + ** + ** If scenario (a) caused the error then things are not so safe. The + ** implicit assumption here is that if fstat() fails, things are in + ** such bad shape that dropping a lock or two doesn't matter much. + */ + robust_close(pNew, h, __LINE__); + h = -1; + } + unixLeaveMutex(); + } + +#if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) + else if( pLockingStyle == &afpIoMethods ){ + /* AFP locking uses the file path so it needs to be included in + ** the afpLockingContext. + */ + afpLockingContext *pCtx; + pNew->lockingContext = pCtx = sqlite3_malloc64( sizeof(*pCtx) ); + if( pCtx==0 ){ + rc = SQLITE_NOMEM_BKPT; + }else{ + /* NB: zFilename exists and remains valid until the file is closed + ** according to requirement F11141. So we do not need to make a + ** copy of the filename. */ + pCtx->dbPath = zFilename; + pCtx->reserved = 0; + srandomdev(); + unixEnterMutex(); + rc = findInodeInfo(pNew, &pNew->pInode); + if( rc!=SQLITE_OK ){ + sqlite3_free(pNew->lockingContext); + robust_close(pNew, h, __LINE__); + h = -1; + } + unixLeaveMutex(); + } + } +#endif + + else if( pLockingStyle == &dotlockIoMethods ){ + /* Dotfile locking uses the file path so it needs to be included in + ** the dotlockLockingContext + */ + char *zLockFile; + int nFilename; + assert( zFilename!=0 ); + nFilename = (int)strlen(zFilename) + 6; + zLockFile = (char *)sqlite3_malloc64(nFilename); + if( zLockFile==0 ){ + rc = SQLITE_NOMEM_BKPT; + }else{ + sqlite3_snprintf(nFilename, zLockFile, "%s" DOTLOCK_SUFFIX, zFilename); + } + pNew->lockingContext = zLockFile; + } + +#if OS_VXWORKS + else if( pLockingStyle == &semIoMethods ){ + /* Named semaphore locking uses the file path so it needs to be + ** included in the semLockingContext + */ + unixEnterMutex(); + rc = findInodeInfo(pNew, &pNew->pInode); + if( (rc==SQLITE_OK) && (pNew->pInode->pSem==NULL) ){ + char *zSemName = pNew->pInode->aSemName; + int n; + sqlite3_snprintf(MAX_PATHNAME, zSemName, "/%s.sem", + pNew->pId->zCanonicalName); + for( n=1; zSemName[n]; n++ ) + if( zSemName[n]=='/' ) zSemName[n] = '_'; + pNew->pInode->pSem = sem_open(zSemName, O_CREAT, 0666, 1); + if( pNew->pInode->pSem == SEM_FAILED ){ + rc = SQLITE_NOMEM_BKPT; + pNew->pInode->aSemName[0] = '\0'; + } + } + unixLeaveMutex(); + } +#endif + + storeLastErrno(pNew, 0); +#if OS_VXWORKS + if( rc!=SQLITE_OK ){ + if( h>=0 ) robust_close(pNew, h, __LINE__); + h = -1; + osUnlink(zFilename); + pNew->ctrlFlags |= UNIXFILE_DELETE; + } +#endif + if( rc!=SQLITE_OK ){ + if( h>=0 ) robust_close(pNew, h, __LINE__); + }else{ + pNew->pMethod = pLockingStyle; + OpenCounter(+1); + verifyDbFile(pNew); + } + return rc; +} + +/* +** Return the name of a directory in which to put temporary files. +** If no suitable temporary file directory can be found, return NULL. +*/ +static const char *unixTempFileDir(void){ + static const char *azDirs[] = { + 0, + 0, + "/var/tmp", + "/usr/tmp", + "/tmp", + "." + }; + unsigned int i = 0; + struct stat buf; + const char *zDir = sqlite3_temp_directory; + + if( !azDirs[0] ) azDirs[0] = getenv("SQLITE_TMPDIR"); + if( !azDirs[1] ) azDirs[1] = getenv("TMPDIR"); + while(1){ + if( zDir!=0 + && osStat(zDir, &buf)==0 + && S_ISDIR(buf.st_mode) + && osAccess(zDir, 03)==0 + ){ + return zDir; + } + if( i>=sizeof(azDirs)/sizeof(azDirs[0]) ) break; + zDir = azDirs[i++]; + } + return 0; +} + +/* +** Create a temporary file name in zBuf. zBuf must be allocated +** by the calling process and must be big enough to hold at least +** pVfs->mxPathname bytes. +*/ +static int unixGetTempname(int nBuf, char *zBuf){ + const char *zDir; + int iLimit = 0; + + /* It's odd to simulate an io-error here, but really this is just + ** using the io-error infrastructure to test that SQLite handles this + ** function failing. + */ + zBuf[0] = 0; + SimulateIOError( return SQLITE_IOERR ); + + zDir = unixTempFileDir(); + if( zDir==0 ) return SQLITE_IOERR_GETTEMPPATH; + do{ + u64 r; + sqlite3_randomness(sizeof(r), &r); + assert( nBuf>2 ); + zBuf[nBuf-2] = 0; + sqlite3_snprintf(nBuf, zBuf, "%s/"SQLITE_TEMP_FILE_PREFIX"%llx%c", + zDir, r, 0); + if( zBuf[nBuf-2]!=0 || (iLimit++)>10 ) return SQLITE_ERROR; + }while( osAccess(zBuf,0)==0 ); + return SQLITE_OK; +} + +#if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) +/* +** Routine to transform a unixFile into a proxy-locking unixFile. +** Implementation in the proxy-lock division, but used by unixOpen() +** if SQLITE_PREFER_PROXY_LOCKING is defined. +*/ +static int proxyTransformUnixFile(unixFile*, const char*); +#endif + +/* +** Search for an unused file descriptor that was opened on the database +** file (not a journal or master-journal file) identified by pathname +** zPath with SQLITE_OPEN_XXX flags matching those passed as the second +** argument to this function. +** +** Such a file descriptor may exist if a database connection was closed +** but the associated file descriptor could not be closed because some +** other file descriptor open on the same file is holding a file-lock. +** Refer to comments in the unixClose() function and the lengthy comment +** describing "Posix Advisory Locking" at the start of this file for +** further details. Also, ticket #4018. +** +** If a suitable file descriptor is found, then it is returned. If no +** such file descriptor is located, -1 is returned. +*/ +static UnixUnusedFd *findReusableFd(const char *zPath, int flags){ + UnixUnusedFd *pUnused = 0; + + /* Do not search for an unused file descriptor on vxworks. Not because + ** vxworks would not benefit from the change (it might, we're not sure), + ** but because no way to test it is currently available. It is better + ** not to risk breaking vxworks support for the sake of such an obscure + ** feature. */ +#if !OS_VXWORKS + struct stat sStat; /* Results of stat() call */ + + /* A stat() call may fail for various reasons. If this happens, it is + ** almost certain that an open() call on the same path will also fail. + ** For this reason, if an error occurs in the stat() call here, it is + ** ignored and -1 is returned. The caller will try to open a new file + ** descriptor on the same path, fail, and return an error to SQLite. + ** + ** Even if a subsequent open() call does succeed, the consequences of + ** not searching for a reusable file descriptor are not dire. */ + if( 0==osStat(zPath, &sStat) ){ + unixInodeInfo *pInode; + + unixEnterMutex(); + pInode = inodeList; + while( pInode && (pInode->fileId.dev!=sStat.st_dev + || pInode->fileId.ino!=sStat.st_ino) ){ + pInode = pInode->pNext; + } + if( pInode ){ + UnixUnusedFd **pp; + for(pp=&pInode->pUnused; *pp && (*pp)->flags!=flags; pp=&((*pp)->pNext)); + pUnused = *pp; + if( pUnused ){ + *pp = pUnused->pNext; + } + } + unixLeaveMutex(); + } +#endif /* if !OS_VXWORKS */ + return pUnused; +} + +/* +** Find the mode, uid and gid of file zFile. +*/ +static int getFileMode( + const char *zFile, /* File name */ + mode_t *pMode, /* OUT: Permissions of zFile */ + uid_t *pUid, /* OUT: uid of zFile. */ + gid_t *pGid /* OUT: gid of zFile. */ +){ + struct stat sStat; /* Output of stat() on database file */ + int rc = SQLITE_OK; + if( 0==osStat(zFile, &sStat) ){ + *pMode = sStat.st_mode & 0777; + *pUid = sStat.st_uid; + *pGid = sStat.st_gid; + }else{ + rc = SQLITE_IOERR_FSTAT; + } + return rc; +} + +/* +** This function is called by unixOpen() to determine the unix permissions +** to create new files with. If no error occurs, then SQLITE_OK is returned +** and a value suitable for passing as the third argument to open(2) is +** written to *pMode. If an IO error occurs, an SQLite error code is +** returned and the value of *pMode is not modified. +** +** In most cases, this routine sets *pMode to 0, which will become +** an indication to robust_open() to create the file using +** SQLITE_DEFAULT_FILE_PERMISSIONS adjusted by the umask. +** But if the file being opened is a WAL or regular journal file, then +** this function queries the file-system for the permissions on the +** corresponding database file and sets *pMode to this value. Whenever +** possible, WAL and journal files are created using the same permissions +** as the associated database file. +** +** If the SQLITE_ENABLE_8_3_NAMES option is enabled, then the +** original filename is unavailable. But 8_3_NAMES is only used for +** FAT filesystems and permissions do not matter there, so just use +** the default permissions. +*/ +static int findCreateFileMode( + const char *zPath, /* Path of file (possibly) being created */ + int flags, /* Flags passed as 4th argument to xOpen() */ + mode_t *pMode, /* OUT: Permissions to open file with */ + uid_t *pUid, /* OUT: uid to set on the file */ + gid_t *pGid /* OUT: gid to set on the file */ +){ + int rc = SQLITE_OK; /* Return Code */ + *pMode = 0; + *pUid = 0; + *pGid = 0; + if( flags & (SQLITE_OPEN_WAL|SQLITE_OPEN_MAIN_JOURNAL) ){ + char zDb[MAX_PATHNAME+1]; /* Database file path */ + int nDb; /* Number of valid bytes in zDb */ + + /* zPath is a path to a WAL or journal file. The following block derives + ** the path to the associated database file from zPath. This block handles + ** the following naming conventions: + ** + ** "-journal" + ** "-wal" + ** "-journalNN" + ** "-walNN" + ** + ** where NN is a decimal number. The NN naming schemes are + ** used by the test_multiplex.c module. + */ + nDb = sqlite3Strlen30(zPath) - 1; + while( zPath[nDb]!='-' ){ +#ifndef SQLITE_ENABLE_8_3_NAMES + /* In the normal case (8+3 filenames disabled) the journal filename + ** is guaranteed to contain a '-' character. */ + assert( nDb>0 ); + assert( sqlite3Isalnum(zPath[nDb]) ); +#else + /* If 8+3 names are possible, then the journal file might not contain + ** a '-' character. So check for that case and return early. */ + if( nDb==0 || zPath[nDb]=='.' ) return SQLITE_OK; +#endif + nDb--; + } + memcpy(zDb, zPath, nDb); + zDb[nDb] = '\0'; + + rc = getFileMode(zDb, pMode, pUid, pGid); + }else if( flags & SQLITE_OPEN_DELETEONCLOSE ){ + *pMode = 0600; + }else if( flags & SQLITE_OPEN_URI ){ + /* If this is a main database file and the file was opened using a URI + ** filename, check for the "modeof" parameter. If present, interpret + ** its value as a filename and try to copy the mode, uid and gid from + ** that file. */ + const char *z = sqlite3_uri_parameter(zPath, "modeof"); + if( z ){ + rc = getFileMode(z, pMode, pUid, pGid); + } + } + return rc; +} + +/* +** Open the file zPath. +** +** Previously, the SQLite OS layer used three functions in place of this +** one: +** +** sqlite3OsOpenReadWrite(); +** sqlite3OsOpenReadOnly(); +** sqlite3OsOpenExclusive(); +** +** These calls correspond to the following combinations of flags: +** +** ReadWrite() -> (READWRITE | CREATE) +** ReadOnly() -> (READONLY) +** OpenExclusive() -> (READWRITE | CREATE | EXCLUSIVE) +** +** The old OpenExclusive() accepted a boolean argument - "delFlag". If +** true, the file was configured to be automatically deleted when the +** file handle closed. To achieve the same effect using this new +** interface, add the DELETEONCLOSE flag to those specified above for +** OpenExclusive(). +*/ +static int unixOpen( + sqlite3_vfs *pVfs, /* The VFS for which this is the xOpen method */ + const char *zPath, /* Pathname of file to be opened */ + sqlite3_file *pFile, /* The file descriptor to be filled in */ + int flags, /* Input flags to control the opening */ + int *pOutFlags /* Output flags returned to SQLite core */ +){ + unixFile *p = (unixFile *)pFile; + int fd = -1; /* File descriptor returned by open() */ + int openFlags = 0; /* Flags to pass to open() */ + int eType = flags&0xFFFFFF00; /* Type of file to open */ + int noLock; /* True to omit locking primitives */ + int rc = SQLITE_OK; /* Function Return Code */ + int ctrlFlags = 0; /* UNIXFILE_* flags */ + + int isExclusive = (flags & SQLITE_OPEN_EXCLUSIVE); + int isDelete = (flags & SQLITE_OPEN_DELETEONCLOSE); + int isCreate = (flags & SQLITE_OPEN_CREATE); + int isReadonly = (flags & SQLITE_OPEN_READONLY); + int isReadWrite = (flags & SQLITE_OPEN_READWRITE); +#if SQLITE_ENABLE_LOCKING_STYLE + int isAutoProxy = (flags & SQLITE_OPEN_AUTOPROXY); +#endif +#if defined(__APPLE__) || SQLITE_ENABLE_LOCKING_STYLE + struct statfs fsInfo; +#endif + + /* If creating a master or main-file journal, this function will open + ** a file-descriptor on the directory too. The first time unixSync() + ** is called the directory file descriptor will be fsync()ed and close()d. + */ + int syncDir = (isCreate && ( + eType==SQLITE_OPEN_MASTER_JOURNAL + || eType==SQLITE_OPEN_MAIN_JOURNAL + || eType==SQLITE_OPEN_WAL + )); + + /* If argument zPath is a NULL pointer, this function is required to open + ** a temporary file. Use this buffer to store the file name in. + */ + char zTmpname[MAX_PATHNAME+2]; + const char *zName = zPath; + + /* Check the following statements are true: + ** + ** (a) Exactly one of the READWRITE and READONLY flags must be set, and + ** (b) if CREATE is set, then READWRITE must also be set, and + ** (c) if EXCLUSIVE is set, then CREATE must also be set. + ** (d) if DELETEONCLOSE is set, then CREATE must also be set. + */ + assert((isReadonly==0 || isReadWrite==0) && (isReadWrite || isReadonly)); + assert(isCreate==0 || isReadWrite); + assert(isExclusive==0 || isCreate); + assert(isDelete==0 || isCreate); + + /* The main DB, main journal, WAL file and master journal are never + ** automatically deleted. Nor are they ever temporary files. */ + assert( (!isDelete && zName) || eType!=SQLITE_OPEN_MAIN_DB ); + assert( (!isDelete && zName) || eType!=SQLITE_OPEN_MAIN_JOURNAL ); + assert( (!isDelete && zName) || eType!=SQLITE_OPEN_MASTER_JOURNAL ); + assert( (!isDelete && zName) || eType!=SQLITE_OPEN_WAL ); + + /* Assert that the upper layer has set one of the "file-type" flags. */ + assert( eType==SQLITE_OPEN_MAIN_DB || eType==SQLITE_OPEN_TEMP_DB + || eType==SQLITE_OPEN_MAIN_JOURNAL || eType==SQLITE_OPEN_TEMP_JOURNAL + || eType==SQLITE_OPEN_SUBJOURNAL || eType==SQLITE_OPEN_MASTER_JOURNAL + || eType==SQLITE_OPEN_TRANSIENT_DB || eType==SQLITE_OPEN_WAL + ); + + /* Detect a pid change and reset the PRNG. There is a race condition + ** here such that two or more threads all trying to open databases at + ** the same instant might all reset the PRNG. But multiple resets + ** are harmless. + */ + if( randomnessPid!=osGetpid(0) ){ + randomnessPid = osGetpid(0); + sqlite3_randomness(0,0); + } + + memset(p, 0, sizeof(unixFile)); + + if( eType==SQLITE_OPEN_MAIN_DB ){ + UnixUnusedFd *pUnused; + pUnused = findReusableFd(zName, flags); + if( pUnused ){ + fd = pUnused->fd; + }else{ + pUnused = sqlite3_malloc64(sizeof(*pUnused)); + if( !pUnused ){ + return SQLITE_NOMEM_BKPT; + } + } + p->pUnused = pUnused; + + /* Database filenames are double-zero terminated if they are not + ** URIs with parameters. Hence, they can always be passed into + ** sqlite3_uri_parameter(). */ + assert( (flags & SQLITE_OPEN_URI) || zName[strlen(zName)+1]==0 ); + + }else if( !zName ){ + /* If zName is NULL, the upper layer is requesting a temp file. */ + assert(isDelete && !syncDir); + rc = unixGetTempname(pVfs->mxPathname, zTmpname); + if( rc!=SQLITE_OK ){ + return rc; + } + zName = zTmpname; + + /* Generated temporary filenames are always double-zero terminated + ** for use by sqlite3_uri_parameter(). */ + assert( zName[strlen(zName)+1]==0 ); + } + + /* Determine the value of the flags parameter passed to POSIX function + ** open(). These must be calculated even if open() is not called, as + ** they may be stored as part of the file handle and used by the + ** 'conch file' locking functions later on. */ + if( isReadonly ) openFlags |= O_RDONLY; + if( isReadWrite ) openFlags |= O_RDWR; + if( isCreate ) openFlags |= O_CREAT; + if( isExclusive ) openFlags |= (O_EXCL|O_NOFOLLOW); + openFlags |= (O_LARGEFILE|O_BINARY); + + if( fd<0 ){ + mode_t openMode; /* Permissions to create file with */ + uid_t uid; /* Userid for the file */ + gid_t gid; /* Groupid for the file */ + rc = findCreateFileMode(zName, flags, &openMode, &uid, &gid); + if( rc!=SQLITE_OK ){ + assert( !p->pUnused ); + assert( eType==SQLITE_OPEN_WAL || eType==SQLITE_OPEN_MAIN_JOURNAL ); + return rc; + } + fd = robust_open(zName, openFlags, openMode); + OSTRACE(("OPENX %-3d %s 0%o\n", fd, zName, openFlags)); + assert( !isExclusive || (openFlags & O_CREAT)!=0 ); + if( fd<0 && errno!=EISDIR && isReadWrite ){ + /* Failed to open the file for read/write access. Try read-only. */ + flags &= ~(SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE); + openFlags &= ~(O_RDWR|O_CREAT); + flags |= SQLITE_OPEN_READONLY; + openFlags |= O_RDONLY; + isReadonly = 1; + fd = robust_open(zName, openFlags, openMode); + } + if( fd<0 ){ + rc = unixLogError(SQLITE_CANTOPEN_BKPT, "open", zName); + goto open_finished; + } + + /* If this process is running as root and if creating a new rollback + ** journal or WAL file, set the ownership of the journal or WAL to be + ** the same as the original database. + */ + if( flags & (SQLITE_OPEN_WAL|SQLITE_OPEN_MAIN_JOURNAL) ){ + robustFchown(fd, uid, gid); + } + } + assert( fd>=0 ); + if( pOutFlags ){ + *pOutFlags = flags; + } + + if( p->pUnused ){ + p->pUnused->fd = fd; + p->pUnused->flags = flags; + } + + if( isDelete ){ +#if OS_VXWORKS + zPath = zName; +#elif defined(SQLITE_UNLINK_AFTER_CLOSE) + zPath = sqlite3_mprintf("%s", zName); + if( zPath==0 ){ + robust_close(p, fd, __LINE__); + return SQLITE_NOMEM_BKPT; + } +#else + osUnlink(zName); +#endif + } +#if SQLITE_ENABLE_LOCKING_STYLE + else{ + p->openFlags = openFlags; + } +#endif + +#if defined(__APPLE__) || SQLITE_ENABLE_LOCKING_STYLE + if( fstatfs(fd, &fsInfo) == -1 ){ + storeLastErrno(p, errno); + robust_close(p, fd, __LINE__); + return SQLITE_IOERR_ACCESS; + } + if (0 == strncmp("msdos", fsInfo.f_fstypename, 5)) { + ((unixFile*)pFile)->fsFlags |= SQLITE_FSFLAGS_IS_MSDOS; + } + if (0 == strncmp("exfat", fsInfo.f_fstypename, 5)) { + ((unixFile*)pFile)->fsFlags |= SQLITE_FSFLAGS_IS_MSDOS; + } +#endif + + /* Set up appropriate ctrlFlags */ + if( isDelete ) ctrlFlags |= UNIXFILE_DELETE; + if( isReadonly ) ctrlFlags |= UNIXFILE_RDONLY; + noLock = eType!=SQLITE_OPEN_MAIN_DB; + if( noLock ) ctrlFlags |= UNIXFILE_NOLOCK; + if( syncDir ) ctrlFlags |= UNIXFILE_DIRSYNC; + if( flags & SQLITE_OPEN_URI ) ctrlFlags |= UNIXFILE_URI; + +#if SQLITE_ENABLE_LOCKING_STYLE +#if SQLITE_PREFER_PROXY_LOCKING + isAutoProxy = 1; +#endif + if( isAutoProxy && (zPath!=NULL) && (!noLock) && pVfs->xOpen ){ + char *envforce = getenv("SQLITE_FORCE_PROXY_LOCKING"); + int useProxy = 0; + + /* SQLITE_FORCE_PROXY_LOCKING==1 means force always use proxy, 0 means + ** never use proxy, NULL means use proxy for non-local files only. */ + if( envforce!=NULL ){ + useProxy = atoi(envforce)>0; + }else{ + useProxy = !(fsInfo.f_flags&MNT_LOCAL); + } + if( useProxy ){ + rc = fillInUnixFile(pVfs, fd, pFile, zPath, ctrlFlags); + if( rc==SQLITE_OK ){ + rc = proxyTransformUnixFile((unixFile*)pFile, ":auto:"); + if( rc!=SQLITE_OK ){ + /* Use unixClose to clean up the resources added in fillInUnixFile + ** and clear all the structure's references. Specifically, + ** pFile->pMethods will be NULL so sqlite3OsClose will be a no-op + */ + unixClose(pFile); + return rc; + } + } + goto open_finished; + } + } +#endif + + rc = fillInUnixFile(pVfs, fd, pFile, zPath, ctrlFlags); + +open_finished: + if( rc!=SQLITE_OK ){ + sqlite3_free(p->pUnused); + } + return rc; +} + + +/* +** Delete the file at zPath. If the dirSync argument is true, fsync() +** the directory after deleting the file. +*/ +static int unixDelete( + sqlite3_vfs *NotUsed, /* VFS containing this as the xDelete method */ + const char *zPath, /* Name of file to be deleted */ + int dirSync /* If true, fsync() directory after deleting file */ +){ + int rc = SQLITE_OK; + UNUSED_PARAMETER(NotUsed); + SimulateIOError(return SQLITE_IOERR_DELETE); + if( osUnlink(zPath)==(-1) ){ + if( errno==ENOENT +#if OS_VXWORKS + || osAccess(zPath,0)!=0 +#endif + ){ + rc = SQLITE_IOERR_DELETE_NOENT; + }else{ + rc = unixLogError(SQLITE_IOERR_DELETE, "unlink", zPath); + } + return rc; + } +#ifndef SQLITE_DISABLE_DIRSYNC + if( (dirSync & 1)!=0 ){ + int fd; + rc = osOpenDirectory(zPath, &fd); + if( rc==SQLITE_OK ){ + if( full_fsync(fd,0,0) ){ + rc = unixLogError(SQLITE_IOERR_DIR_FSYNC, "fsync", zPath); + } + robust_close(0, fd, __LINE__); + }else{ + assert( rc==SQLITE_CANTOPEN ); + rc = SQLITE_OK; + } + } +#endif + return rc; +} + +/* +** Test the existence of or access permissions of file zPath. The +** test performed depends on the value of flags: +** +** SQLITE_ACCESS_EXISTS: Return 1 if the file exists +** SQLITE_ACCESS_READWRITE: Return 1 if the file is read and writable. +** SQLITE_ACCESS_READONLY: Return 1 if the file is readable. +** +** Otherwise return 0. +*/ +static int unixAccess( + sqlite3_vfs *NotUsed, /* The VFS containing this xAccess method */ + const char *zPath, /* Path of the file to examine */ + int flags, /* What do we want to learn about the zPath file? */ + int *pResOut /* Write result boolean here */ +){ + UNUSED_PARAMETER(NotUsed); + SimulateIOError( return SQLITE_IOERR_ACCESS; ); + assert( pResOut!=0 ); + + /* The spec says there are three possible values for flags. But only + ** two of them are actually used */ + assert( flags==SQLITE_ACCESS_EXISTS || flags==SQLITE_ACCESS_READWRITE ); + + if( flags==SQLITE_ACCESS_EXISTS ){ + struct stat buf; + *pResOut = (0==osStat(zPath, &buf) && buf.st_size>0); + }else{ + *pResOut = osAccess(zPath, W_OK|R_OK)==0; + } + return SQLITE_OK; +} + +/* +** +*/ +static int mkFullPathname( + const char *zPath, /* Input path */ + char *zOut, /* Output buffer */ + int nOut /* Allocated size of buffer zOut */ +){ + int nPath = sqlite3Strlen30(zPath); + int iOff = 0; + if( zPath[0]!='/' ){ + if( osGetcwd(zOut, nOut-2)==0 ){ + return unixLogError(SQLITE_CANTOPEN_BKPT, "getcwd", zPath); + } + iOff = sqlite3Strlen30(zOut); + zOut[iOff++] = '/'; + } + if( (iOff+nPath+1)>nOut ){ + /* SQLite assumes that xFullPathname() nul-terminates the output buffer + ** even if it returns an error. */ + zOut[iOff] = '\0'; + return SQLITE_CANTOPEN_BKPT; + } + sqlite3_snprintf(nOut-iOff, &zOut[iOff], "%s", zPath); + return SQLITE_OK; +} + +/* +** Turn a relative pathname into a full pathname. The relative path +** is stored as a nul-terminated string in the buffer pointed to by +** zPath. +** +** zOut points to a buffer of at least sqlite3_vfs.mxPathname bytes +** (in this case, MAX_PATHNAME bytes). The full-path is written to +** this buffer before returning. +*/ +static int unixFullPathname( + sqlite3_vfs *pVfs, /* Pointer to vfs object */ + const char *zPath, /* Possibly relative input path */ + int nOut, /* Size of output buffer in bytes */ + char *zOut /* Output buffer */ +){ +#if !defined(HAVE_READLINK) || !defined(HAVE_LSTAT) + return mkFullPathname(zPath, zOut, nOut); +#else + int rc = SQLITE_OK; + int nByte; + int nLink = 1; /* Number of symbolic links followed so far */ + const char *zIn = zPath; /* Input path for each iteration of loop */ + char *zDel = 0; + + assert( pVfs->mxPathname==MAX_PATHNAME ); + UNUSED_PARAMETER(pVfs); + + /* It's odd to simulate an io-error here, but really this is just + ** using the io-error infrastructure to test that SQLite handles this + ** function failing. This function could fail if, for example, the + ** current working directory has been unlinked. + */ + SimulateIOError( return SQLITE_ERROR ); + + do { + + /* Call stat() on path zIn. Set bLink to true if the path is a symbolic + ** link, or false otherwise. */ + int bLink = 0; + struct stat buf; + if( osLstat(zIn, &buf)!=0 ){ + if( errno!=ENOENT ){ + rc = unixLogError(SQLITE_CANTOPEN_BKPT, "lstat", zIn); + } + }else{ + bLink = S_ISLNK(buf.st_mode); + } + + if( bLink ){ + if( zDel==0 ){ + zDel = sqlite3_malloc(nOut); + if( zDel==0 ) rc = SQLITE_NOMEM_BKPT; + }else if( ++nLink>SQLITE_MAX_SYMLINKS ){ + rc = SQLITE_CANTOPEN_BKPT; + } + + if( rc==SQLITE_OK ){ + nByte = osReadlink(zIn, zDel, nOut-1); + if( nByte<0 ){ + rc = unixLogError(SQLITE_CANTOPEN_BKPT, "readlink", zIn); + }else{ + if( zDel[0]!='/' ){ + int n; + for(n = sqlite3Strlen30(zIn); n>0 && zIn[n-1]!='/'; n--); + if( nByte+n+1>nOut ){ + rc = SQLITE_CANTOPEN_BKPT; + }else{ + memmove(&zDel[n], zDel, nByte+1); + memcpy(zDel, zIn, n); + nByte += n; + } + } + zDel[nByte] = '\0'; + } + } + + zIn = zDel; + } + + assert( rc!=SQLITE_OK || zIn!=zOut || zIn[0]=='/' ); + if( rc==SQLITE_OK && zIn!=zOut ){ + rc = mkFullPathname(zIn, zOut, nOut); + } + if( bLink==0 ) break; + zIn = zOut; + }while( rc==SQLITE_OK ); + + sqlite3_free(zDel); + return rc; +#endif /* HAVE_READLINK && HAVE_LSTAT */ +} + + +#ifndef SQLITE_OMIT_LOAD_EXTENSION +/* +** Interfaces for opening a shared library, finding entry points +** within the shared library, and closing the shared library. +*/ +#include +static void *unixDlOpen(sqlite3_vfs *NotUsed, const char *zFilename){ + UNUSED_PARAMETER(NotUsed); + return dlopen(zFilename, RTLD_NOW | RTLD_GLOBAL); +} + +/* +** SQLite calls this function immediately after a call to unixDlSym() or +** unixDlOpen() fails (returns a null pointer). If a more detailed error +** message is available, it is written to zBufOut. If no error message +** is available, zBufOut is left unmodified and SQLite uses a default +** error message. +*/ +static void unixDlError(sqlite3_vfs *NotUsed, int nBuf, char *zBufOut){ + const char *zErr; + UNUSED_PARAMETER(NotUsed); + unixEnterMutex(); + zErr = dlerror(); + if( zErr ){ + sqlite3_snprintf(nBuf, zBufOut, "%s", zErr); + } + unixLeaveMutex(); +} +static void (*unixDlSym(sqlite3_vfs *NotUsed, void *p, const char*zSym))(void){ + /* + ** GCC with -pedantic-errors says that C90 does not allow a void* to be + ** cast into a pointer to a function. And yet the library dlsym() routine + ** returns a void* which is really a pointer to a function. So how do we + ** use dlsym() with -pedantic-errors? + ** + ** Variable x below is defined to be a pointer to a function taking + ** parameters void* and const char* and returning a pointer to a function. + ** We initialize x by assigning it a pointer to the dlsym() function. + ** (That assignment requires a cast.) Then we call the function that + ** x points to. + ** + ** This work-around is unlikely to work correctly on any system where + ** you really cannot cast a function pointer into void*. But then, on the + ** other hand, dlsym() will not work on such a system either, so we have + ** not really lost anything. + */ + void (*(*x)(void*,const char*))(void); + UNUSED_PARAMETER(NotUsed); + x = (void(*(*)(void*,const char*))(void))dlsym; + return (*x)(p, zSym); +} +static void unixDlClose(sqlite3_vfs *NotUsed, void *pHandle){ + UNUSED_PARAMETER(NotUsed); + dlclose(pHandle); +} +#else /* if SQLITE_OMIT_LOAD_EXTENSION is defined: */ + #define unixDlOpen 0 + #define unixDlError 0 + #define unixDlSym 0 + #define unixDlClose 0 +#endif + +/* +** Write nBuf bytes of random data to the supplied buffer zBuf. +*/ +static int unixRandomness(sqlite3_vfs *NotUsed, int nBuf, char *zBuf){ + UNUSED_PARAMETER(NotUsed); + assert((size_t)nBuf>=(sizeof(time_t)+sizeof(int))); + + /* We have to initialize zBuf to prevent valgrind from reporting + ** errors. The reports issued by valgrind are incorrect - we would + ** prefer that the randomness be increased by making use of the + ** uninitialized space in zBuf - but valgrind errors tend to worry + ** some users. Rather than argue, it seems easier just to initialize + ** the whole array and silence valgrind, even if that means less randomness + ** in the random seed. + ** + ** When testing, initializing zBuf[] to zero is all we do. That means + ** that we always use the same random number sequence. This makes the + ** tests repeatable. + */ + memset(zBuf, 0, nBuf); + randomnessPid = osGetpid(0); +#if !defined(SQLITE_TEST) && !defined(SQLITE_OMIT_RANDOMNESS) + { + int fd, got; + fd = robust_open("/dev/urandom", O_RDONLY, 0); + if( fd<0 ){ + time_t t; + time(&t); + memcpy(zBuf, &t, sizeof(t)); + memcpy(&zBuf[sizeof(t)], &randomnessPid, sizeof(randomnessPid)); + assert( sizeof(t)+sizeof(randomnessPid)<=(size_t)nBuf ); + nBuf = sizeof(t) + sizeof(randomnessPid); + }else{ + do{ got = osRead(fd, zBuf, nBuf); }while( got<0 && errno==EINTR ); + robust_close(0, fd, __LINE__); + } + } +#endif + return nBuf; +} + + +/* +** Sleep for a little while. Return the amount of time slept. +** The argument is the number of microseconds we want to sleep. +** The return value is the number of microseconds of sleep actually +** requested from the underlying operating system, a number which +** might be greater than or equal to the argument, but not less +** than the argument. +*/ +static int unixSleep(sqlite3_vfs *NotUsed, int microseconds){ +#if OS_VXWORKS + struct timespec sp; + + sp.tv_sec = microseconds / 1000000; + sp.tv_nsec = (microseconds % 1000000) * 1000; + nanosleep(&sp, NULL); + UNUSED_PARAMETER(NotUsed); + return microseconds; +#elif defined(HAVE_USLEEP) && HAVE_USLEEP + usleep(microseconds); + UNUSED_PARAMETER(NotUsed); + return microseconds; +#else + int seconds = (microseconds+999999)/1000000; + sleep(seconds); + UNUSED_PARAMETER(NotUsed); + return seconds*1000000; +#endif +} + +/* +** The following variable, if set to a non-zero value, is interpreted as +** the number of seconds since 1970 and is used to set the result of +** sqlite3OsCurrentTime() during testing. +*/ +#ifdef SQLITE_TEST +SQLITE_API int sqlite3_current_time = 0; /* Fake system time in seconds since 1970. */ +#endif + +/* +** Find the current time (in Universal Coordinated Time). Write into *piNow +** the current time and date as a Julian Day number times 86_400_000. In +** other words, write into *piNow the number of milliseconds since the Julian +** epoch of noon in Greenwich on November 24, 4714 B.C according to the +** proleptic Gregorian calendar. +** +** On success, return SQLITE_OK. Return SQLITE_ERROR if the time and date +** cannot be found. +*/ +static int unixCurrentTimeInt64(sqlite3_vfs *NotUsed, sqlite3_int64 *piNow){ + static const sqlite3_int64 unixEpoch = 24405875*(sqlite3_int64)8640000; + int rc = SQLITE_OK; +#if defined(NO_GETTOD) + time_t t; + time(&t); + *piNow = ((sqlite3_int64)t)*1000 + unixEpoch; +#elif OS_VXWORKS + struct timespec sNow; + clock_gettime(CLOCK_REALTIME, &sNow); + *piNow = unixEpoch + 1000*(sqlite3_int64)sNow.tv_sec + sNow.tv_nsec/1000000; +#else + struct timeval sNow; + (void)gettimeofday(&sNow, 0); /* Cannot fail given valid arguments */ + *piNow = unixEpoch + 1000*(sqlite3_int64)sNow.tv_sec + sNow.tv_usec/1000; +#endif + +#ifdef SQLITE_TEST + if( sqlite3_current_time ){ + *piNow = 1000*(sqlite3_int64)sqlite3_current_time + unixEpoch; + } +#endif + UNUSED_PARAMETER(NotUsed); + return rc; +} + +#ifndef SQLITE_OMIT_DEPRECATED +/* +** Find the current time (in Universal Coordinated Time). Write the +** current time and date as a Julian Day number into *prNow and +** return 0. Return 1 if the time and date cannot be found. +*/ +static int unixCurrentTime(sqlite3_vfs *NotUsed, double *prNow){ + sqlite3_int64 i = 0; + int rc; + UNUSED_PARAMETER(NotUsed); + rc = unixCurrentTimeInt64(0, &i); + *prNow = i/86400000.0; + return rc; +} +#else +# define unixCurrentTime 0 +#endif + +/* +** The xGetLastError() method is designed to return a better +** low-level error message when operating-system problems come up +** during SQLite operation. Only the integer return code is currently +** used. +*/ +static int unixGetLastError(sqlite3_vfs *NotUsed, int NotUsed2, char *NotUsed3){ + UNUSED_PARAMETER(NotUsed); + UNUSED_PARAMETER(NotUsed2); + UNUSED_PARAMETER(NotUsed3); + return errno; +} + + +/* +************************ End of sqlite3_vfs methods *************************** +******************************************************************************/ + +/****************************************************************************** +************************** Begin Proxy Locking ******************************** +** +** Proxy locking is a "uber-locking-method" in this sense: It uses the +** other locking methods on secondary lock files. Proxy locking is a +** meta-layer over top of the primitive locking implemented above. For +** this reason, the division that implements of proxy locking is deferred +** until late in the file (here) after all of the other I/O methods have +** been defined - so that the primitive locking methods are available +** as services to help with the implementation of proxy locking. +** +**** +** +** The default locking schemes in SQLite use byte-range locks on the +** database file to coordinate safe, concurrent access by multiple readers +** and writers [http://sqlite.org/lockingv3.html]. The five file locking +** states (UNLOCKED, PENDING, SHARED, RESERVED, EXCLUSIVE) are implemented +** as POSIX read & write locks over fixed set of locations (via fsctl), +** on AFP and SMB only exclusive byte-range locks are available via fsctl +** with _IOWR('z', 23, struct ByteRangeLockPB2) to track the same 5 states. +** To simulate a F_RDLCK on the shared range, on AFP a randomly selected +** address in the shared range is taken for a SHARED lock, the entire +** shared range is taken for an EXCLUSIVE lock): +** +** PENDING_BYTE 0x40000000 +** RESERVED_BYTE 0x40000001 +** SHARED_RANGE 0x40000002 -> 0x40000200 +** +** This works well on the local file system, but shows a nearly 100x +** slowdown in read performance on AFP because the AFP client disables +** the read cache when byte-range locks are present. Enabling the read +** cache exposes a cache coherency problem that is present on all OS X +** supported network file systems. NFS and AFP both observe the +** close-to-open semantics for ensuring cache coherency +** [http://nfs.sourceforge.net/#faq_a8], which does not effectively +** address the requirements for concurrent database access by multiple +** readers and writers +** [http://www.nabble.com/SQLite-on-NFS-cache-coherency-td15655701.html]. +** +** To address the performance and cache coherency issues, proxy file locking +** changes the way database access is controlled by limiting access to a +** single host at a time and moving file locks off of the database file +** and onto a proxy file on the local file system. +** +** +** Using proxy locks +** ----------------- +** +** C APIs +** +** sqlite3_file_control(db, dbname, SQLITE_FCNTL_SET_LOCKPROXYFILE, +** | ":auto:"); +** sqlite3_file_control(db, dbname, SQLITE_FCNTL_GET_LOCKPROXYFILE, +** &); +** +** +** SQL pragmas +** +** PRAGMA [database.]lock_proxy_file= | :auto: +** PRAGMA [database.]lock_proxy_file +** +** Specifying ":auto:" means that if there is a conch file with a matching +** host ID in it, the proxy path in the conch file will be used, otherwise +** a proxy path based on the user's temp dir +** (via confstr(_CS_DARWIN_USER_TEMP_DIR,...)) will be used and the +** actual proxy file name is generated from the name and path of the +** database file. For example: +** +** For database path "/Users/me/foo.db" +** The lock path will be "/sqliteplocks/_Users_me_foo.db:auto:") +** +** Once a lock proxy is configured for a database connection, it can not +** be removed, however it may be switched to a different proxy path via +** the above APIs (assuming the conch file is not being held by another +** connection or process). +** +** +** How proxy locking works +** ----------------------- +** +** Proxy file locking relies primarily on two new supporting files: +** +** * conch file to limit access to the database file to a single host +** at a time +** +** * proxy file to act as a proxy for the advisory locks normally +** taken on the database +** +** The conch file - to use a proxy file, sqlite must first "hold the conch" +** by taking an sqlite-style shared lock on the conch file, reading the +** contents and comparing the host's unique host ID (see below) and lock +** proxy path against the values stored in the conch. The conch file is +** stored in the same directory as the database file and the file name +** is patterned after the database file name as ".-conch". +** If the conch file does not exist, or its contents do not match the +** host ID and/or proxy path, then the lock is escalated to an exclusive +** lock and the conch file contents is updated with the host ID and proxy +** path and the lock is downgraded to a shared lock again. If the conch +** is held by another process (with a shared lock), the exclusive lock +** will fail and SQLITE_BUSY is returned. +** +** The proxy file - a single-byte file used for all advisory file locks +** normally taken on the database file. This allows for safe sharing +** of the database file for multiple readers and writers on the same +** host (the conch ensures that they all use the same local lock file). +** +** Requesting the lock proxy does not immediately take the conch, it is +** only taken when the first request to lock database file is made. +** This matches the semantics of the traditional locking behavior, where +** opening a connection to a database file does not take a lock on it. +** The shared lock and an open file descriptor are maintained until +** the connection to the database is closed. +** +** The proxy file and the lock file are never deleted so they only need +** to be created the first time they are used. +** +** Configuration options +** --------------------- +** +** SQLITE_PREFER_PROXY_LOCKING +** +** Database files accessed on non-local file systems are +** automatically configured for proxy locking, lock files are +** named automatically using the same logic as +** PRAGMA lock_proxy_file=":auto:" +** +** SQLITE_PROXY_DEBUG +** +** Enables the logging of error messages during host id file +** retrieval and creation +** +** LOCKPROXYDIR +** +** Overrides the default directory used for lock proxy files that +** are named automatically via the ":auto:" setting +** +** SQLITE_DEFAULT_PROXYDIR_PERMISSIONS +** +** Permissions to use when creating a directory for storing the +** lock proxy files, only used when LOCKPROXYDIR is not set. +** +** +** As mentioned above, when compiled with SQLITE_PREFER_PROXY_LOCKING, +** setting the environment variable SQLITE_FORCE_PROXY_LOCKING to 1 will +** force proxy locking to be used for every database file opened, and 0 +** will force automatic proxy locking to be disabled for all database +** files (explicitly calling the SQLITE_FCNTL_SET_LOCKPROXYFILE pragma or +** sqlite_file_control API is not affected by SQLITE_FORCE_PROXY_LOCKING). +*/ + +/* +** Proxy locking is only available on MacOSX +*/ +#if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE + +/* +** The proxyLockingContext has the path and file structures for the remote +** and local proxy files in it +*/ +typedef struct proxyLockingContext proxyLockingContext; +struct proxyLockingContext { + unixFile *conchFile; /* Open conch file */ + char *conchFilePath; /* Name of the conch file */ + unixFile *lockProxy; /* Open proxy lock file */ + char *lockProxyPath; /* Name of the proxy lock file */ + char *dbPath; /* Name of the open file */ + int conchHeld; /* 1 if the conch is held, -1 if lockless */ + int nFails; /* Number of conch taking failures */ + void *oldLockingContext; /* Original lockingcontext to restore on close */ + sqlite3_io_methods const *pOldMethod; /* Original I/O methods for close */ +}; + +/* +** The proxy lock file path for the database at dbPath is written into lPath, +** which must point to valid, writable memory large enough for a maxLen length +** file path. +*/ +static int proxyGetLockPath(const char *dbPath, char *lPath, size_t maxLen){ + int len; + int dbLen; + int i; + +#ifdef LOCKPROXYDIR + len = strlcpy(lPath, LOCKPROXYDIR, maxLen); +#else +# ifdef _CS_DARWIN_USER_TEMP_DIR + { + if( !confstr(_CS_DARWIN_USER_TEMP_DIR, lPath, maxLen) ){ + OSTRACE(("GETLOCKPATH failed %s errno=%d pid=%d\n", + lPath, errno, osGetpid(0))); + return SQLITE_IOERR_LOCK; + } + len = strlcat(lPath, "sqliteplocks", maxLen); + } +# else + len = strlcpy(lPath, "/tmp/", maxLen); +# endif +#endif + + if( lPath[len-1]!='/' ){ + len = strlcat(lPath, "/", maxLen); + } + + /* transform the db path to a unique cache name */ + dbLen = (int)strlen(dbPath); + for( i=0; i 0) ){ + /* only mkdir if leaf dir != "." or "/" or ".." */ + if( i-start>2 || (i-start==1 && buf[start] != '.' && buf[start] != '/') + || (i-start==2 && buf[start] != '.' && buf[start+1] != '.') ){ + buf[i]='\0'; + if( osMkdir(buf, SQLITE_DEFAULT_PROXYDIR_PERMISSIONS) ){ + int err=errno; + if( err!=EEXIST ) { + OSTRACE(("CREATELOCKPATH FAILED creating %s, " + "'%s' proxy lock path=%s pid=%d\n", + buf, strerror(err), lockPath, osGetpid(0))); + return err; + } + } + } + start=i+1; + } + buf[i] = lockPath[i]; + } + OSTRACE(("CREATELOCKPATH proxy lock path=%s pid=%d\n",lockPath,osGetpid(0))); + return 0; +} + +/* +** Create a new VFS file descriptor (stored in memory obtained from +** sqlite3_malloc) and open the file named "path" in the file descriptor. +** +** The caller is responsible not only for closing the file descriptor +** but also for freeing the memory associated with the file descriptor. +*/ +static int proxyCreateUnixFile( + const char *path, /* path for the new unixFile */ + unixFile **ppFile, /* unixFile created and returned by ref */ + int islockfile /* if non zero missing dirs will be created */ +) { + int fd = -1; + unixFile *pNew; + int rc = SQLITE_OK; + int openFlags = O_RDWR | O_CREAT; + sqlite3_vfs dummyVfs; + int terrno = 0; + UnixUnusedFd *pUnused = NULL; + + /* 1. first try to open/create the file + ** 2. if that fails, and this is a lock file (not-conch), try creating + ** the parent directories and then try again. + ** 3. if that fails, try to open the file read-only + ** otherwise return BUSY (if lock file) or CANTOPEN for the conch file + */ + pUnused = findReusableFd(path, openFlags); + if( pUnused ){ + fd = pUnused->fd; + }else{ + pUnused = sqlite3_malloc64(sizeof(*pUnused)); + if( !pUnused ){ + return SQLITE_NOMEM_BKPT; + } + } + if( fd<0 ){ + fd = robust_open(path, openFlags, 0); + terrno = errno; + if( fd<0 && errno==ENOENT && islockfile ){ + if( proxyCreateLockPath(path) == SQLITE_OK ){ + fd = robust_open(path, openFlags, 0); + } + } + } + if( fd<0 ){ + openFlags = O_RDONLY; + fd = robust_open(path, openFlags, 0); + terrno = errno; + } + if( fd<0 ){ + if( islockfile ){ + return SQLITE_BUSY; + } + switch (terrno) { + case EACCES: + return SQLITE_PERM; + case EIO: + return SQLITE_IOERR_LOCK; /* even though it is the conch */ + default: + return SQLITE_CANTOPEN_BKPT; + } + } + + pNew = (unixFile *)sqlite3_malloc64(sizeof(*pNew)); + if( pNew==NULL ){ + rc = SQLITE_NOMEM_BKPT; + goto end_create_proxy; + } + memset(pNew, 0, sizeof(unixFile)); + pNew->openFlags = openFlags; + memset(&dummyVfs, 0, sizeof(dummyVfs)); + dummyVfs.pAppData = (void*)&autolockIoFinder; + dummyVfs.zName = "dummy"; + pUnused->fd = fd; + pUnused->flags = openFlags; + pNew->pUnused = pUnused; + + rc = fillInUnixFile(&dummyVfs, fd, (sqlite3_file*)pNew, path, 0); + if( rc==SQLITE_OK ){ + *ppFile = pNew; + return SQLITE_OK; + } +end_create_proxy: + robust_close(pNew, fd, __LINE__); + sqlite3_free(pNew); + sqlite3_free(pUnused); + return rc; +} + +#ifdef SQLITE_TEST +/* simulate multiple hosts by creating unique hostid file paths */ +SQLITE_API int sqlite3_hostid_num = 0; +#endif + +#define PROXY_HOSTIDLEN 16 /* conch file host id length */ + +#ifdef HAVE_GETHOSTUUID +/* Not always defined in the headers as it ought to be */ +extern int gethostuuid(uuid_t id, const struct timespec *wait); +#endif + +/* get the host ID via gethostuuid(), pHostID must point to PROXY_HOSTIDLEN +** bytes of writable memory. +*/ +static int proxyGetHostID(unsigned char *pHostID, int *pError){ + assert(PROXY_HOSTIDLEN == sizeof(uuid_t)); + memset(pHostID, 0, PROXY_HOSTIDLEN); +#ifdef HAVE_GETHOSTUUID + { + struct timespec timeout = {1, 0}; /* 1 sec timeout */ + if( gethostuuid(pHostID, &timeout) ){ + int err = errno; + if( pError ){ + *pError = err; + } + return SQLITE_IOERR; + } + } +#else + UNUSED_PARAMETER(pError); +#endif +#ifdef SQLITE_TEST + /* simulate multiple hosts by creating unique hostid file paths */ + if( sqlite3_hostid_num != 0){ + pHostID[0] = (char)(pHostID[0] + (char)(sqlite3_hostid_num & 0xFF)); + } +#endif + + return SQLITE_OK; +} + +/* The conch file contains the header, host id and lock file path + */ +#define PROXY_CONCHVERSION 2 /* 1-byte header, 16-byte host id, path */ +#define PROXY_HEADERLEN 1 /* conch file header length */ +#define PROXY_PATHINDEX (PROXY_HEADERLEN+PROXY_HOSTIDLEN) +#define PROXY_MAXCONCHLEN (PROXY_HEADERLEN+PROXY_HOSTIDLEN+MAXPATHLEN) + +/* +** Takes an open conch file, copies the contents to a new path and then moves +** it back. The newly created file's file descriptor is assigned to the +** conch file structure and finally the original conch file descriptor is +** closed. Returns zero if successful. +*/ +static int proxyBreakConchLock(unixFile *pFile, uuid_t myHostID){ + proxyLockingContext *pCtx = (proxyLockingContext *)pFile->lockingContext; + unixFile *conchFile = pCtx->conchFile; + char tPath[MAXPATHLEN]; + char buf[PROXY_MAXCONCHLEN]; + char *cPath = pCtx->conchFilePath; + size_t readLen = 0; + size_t pathLen = 0; + char errmsg[64] = ""; + int fd = -1; + int rc = -1; + UNUSED_PARAMETER(myHostID); + + /* create a new path by replace the trailing '-conch' with '-break' */ + pathLen = strlcpy(tPath, cPath, MAXPATHLEN); + if( pathLen>MAXPATHLEN || pathLen<6 || + (strlcpy(&tPath[pathLen-5], "break", 6) != 5) ){ + sqlite3_snprintf(sizeof(errmsg),errmsg,"path error (len %d)",(int)pathLen); + goto end_breaklock; + } + /* read the conch content */ + readLen = osPread(conchFile->h, buf, PROXY_MAXCONCHLEN, 0); + if( readLenh, __LINE__); + conchFile->h = fd; + conchFile->openFlags = O_RDWR | O_CREAT; + +end_breaklock: + if( rc ){ + if( fd>=0 ){ + osUnlink(tPath); + robust_close(pFile, fd, __LINE__); + } + fprintf(stderr, "failed to break stale lock on %s, %s\n", cPath, errmsg); + } + return rc; +} + +/* Take the requested lock on the conch file and break a stale lock if the +** host id matches. +*/ +static int proxyConchLock(unixFile *pFile, uuid_t myHostID, int lockType){ + proxyLockingContext *pCtx = (proxyLockingContext *)pFile->lockingContext; + unixFile *conchFile = pCtx->conchFile; + int rc = SQLITE_OK; + int nTries = 0; + struct timespec conchModTime; + + memset(&conchModTime, 0, sizeof(conchModTime)); + do { + rc = conchFile->pMethod->xLock((sqlite3_file*)conchFile, lockType); + nTries ++; + if( rc==SQLITE_BUSY ){ + /* If the lock failed (busy): + * 1st try: get the mod time of the conch, wait 0.5s and try again. + * 2nd try: fail if the mod time changed or host id is different, wait + * 10 sec and try again + * 3rd try: break the lock unless the mod time has changed. + */ + struct stat buf; + if( osFstat(conchFile->h, &buf) ){ + storeLastErrno(pFile, errno); + return SQLITE_IOERR_LOCK; + } + + if( nTries==1 ){ + conchModTime = buf.st_mtimespec; + usleep(500000); /* wait 0.5 sec and try the lock again*/ + continue; + } + + assert( nTries>1 ); + if( conchModTime.tv_sec != buf.st_mtimespec.tv_sec || + conchModTime.tv_nsec != buf.st_mtimespec.tv_nsec ){ + return SQLITE_BUSY; + } + + if( nTries==2 ){ + char tBuf[PROXY_MAXCONCHLEN]; + int len = osPread(conchFile->h, tBuf, PROXY_MAXCONCHLEN, 0); + if( len<0 ){ + storeLastErrno(pFile, errno); + return SQLITE_IOERR_LOCK; + } + if( len>PROXY_PATHINDEX && tBuf[0]==(char)PROXY_CONCHVERSION){ + /* don't break the lock if the host id doesn't match */ + if( 0!=memcmp(&tBuf[PROXY_HEADERLEN], myHostID, PROXY_HOSTIDLEN) ){ + return SQLITE_BUSY; + } + }else{ + /* don't break the lock on short read or a version mismatch */ + return SQLITE_BUSY; + } + usleep(10000000); /* wait 10 sec and try the lock again */ + continue; + } + + assert( nTries==3 ); + if( 0==proxyBreakConchLock(pFile, myHostID) ){ + rc = SQLITE_OK; + if( lockType==EXCLUSIVE_LOCK ){ + rc = conchFile->pMethod->xLock((sqlite3_file*)conchFile, SHARED_LOCK); + } + if( !rc ){ + rc = conchFile->pMethod->xLock((sqlite3_file*)conchFile, lockType); + } + } + } + } while( rc==SQLITE_BUSY && nTries<3 ); + + return rc; +} + +/* Takes the conch by taking a shared lock and read the contents conch, if +** lockPath is non-NULL, the host ID and lock file path must match. A NULL +** lockPath means that the lockPath in the conch file will be used if the +** host IDs match, or a new lock path will be generated automatically +** and written to the conch file. +*/ +static int proxyTakeConch(unixFile *pFile){ + proxyLockingContext *pCtx = (proxyLockingContext *)pFile->lockingContext; + + if( pCtx->conchHeld!=0 ){ + return SQLITE_OK; + }else{ + unixFile *conchFile = pCtx->conchFile; + uuid_t myHostID; + int pError = 0; + char readBuf[PROXY_MAXCONCHLEN]; + char lockPath[MAXPATHLEN]; + char *tempLockPath = NULL; + int rc = SQLITE_OK; + int createConch = 0; + int hostIdMatch = 0; + int readLen = 0; + int tryOldLockPath = 0; + int forceNewLockPath = 0; + + OSTRACE(("TAKECONCH %d for %s pid=%d\n", conchFile->h, + (pCtx->lockProxyPath ? pCtx->lockProxyPath : ":auto:"), + osGetpid(0))); + + rc = proxyGetHostID(myHostID, &pError); + if( (rc&0xff)==SQLITE_IOERR ){ + storeLastErrno(pFile, pError); + goto end_takeconch; + } + rc = proxyConchLock(pFile, myHostID, SHARED_LOCK); + if( rc!=SQLITE_OK ){ + goto end_takeconch; + } + /* read the existing conch file */ + readLen = seekAndRead((unixFile*)conchFile, 0, readBuf, PROXY_MAXCONCHLEN); + if( readLen<0 ){ + /* I/O error: lastErrno set by seekAndRead */ + storeLastErrno(pFile, conchFile->lastErrno); + rc = SQLITE_IOERR_READ; + goto end_takeconch; + }else if( readLen<=(PROXY_HEADERLEN+PROXY_HOSTIDLEN) || + readBuf[0]!=(char)PROXY_CONCHVERSION ){ + /* a short read or version format mismatch means we need to create a new + ** conch file. + */ + createConch = 1; + } + /* if the host id matches and the lock path already exists in the conch + ** we'll try to use the path there, if we can't open that path, we'll + ** retry with a new auto-generated path + */ + do { /* in case we need to try again for an :auto: named lock file */ + + if( !createConch && !forceNewLockPath ){ + hostIdMatch = !memcmp(&readBuf[PROXY_HEADERLEN], myHostID, + PROXY_HOSTIDLEN); + /* if the conch has data compare the contents */ + if( !pCtx->lockProxyPath ){ + /* for auto-named local lock file, just check the host ID and we'll + ** use the local lock file path that's already in there + */ + if( hostIdMatch ){ + size_t pathLen = (readLen - PROXY_PATHINDEX); + + if( pathLen>=MAXPATHLEN ){ + pathLen=MAXPATHLEN-1; + } + memcpy(lockPath, &readBuf[PROXY_PATHINDEX], pathLen); + lockPath[pathLen] = 0; + tempLockPath = lockPath; + tryOldLockPath = 1; + /* create a copy of the lock path if the conch is taken */ + goto end_takeconch; + } + }else if( hostIdMatch + && !strncmp(pCtx->lockProxyPath, &readBuf[PROXY_PATHINDEX], + readLen-PROXY_PATHINDEX) + ){ + /* conch host and lock path match */ + goto end_takeconch; + } + } + + /* if the conch isn't writable and doesn't match, we can't take it */ + if( (conchFile->openFlags&O_RDWR) == 0 ){ + rc = SQLITE_BUSY; + goto end_takeconch; + } + + /* either the conch didn't match or we need to create a new one */ + if( !pCtx->lockProxyPath ){ + proxyGetLockPath(pCtx->dbPath, lockPath, MAXPATHLEN); + tempLockPath = lockPath; + /* create a copy of the lock path _only_ if the conch is taken */ + } + + /* update conch with host and path (this will fail if other process + ** has a shared lock already), if the host id matches, use the big + ** stick. + */ + futimes(conchFile->h, NULL); + if( hostIdMatch && !createConch ){ + if( conchFile->pInode && conchFile->pInode->nShared>1 ){ + /* We are trying for an exclusive lock but another thread in this + ** same process is still holding a shared lock. */ + rc = SQLITE_BUSY; + } else { + rc = proxyConchLock(pFile, myHostID, EXCLUSIVE_LOCK); + } + }else{ + rc = proxyConchLock(pFile, myHostID, EXCLUSIVE_LOCK); + } + if( rc==SQLITE_OK ){ + char writeBuffer[PROXY_MAXCONCHLEN]; + int writeSize = 0; + + writeBuffer[0] = (char)PROXY_CONCHVERSION; + memcpy(&writeBuffer[PROXY_HEADERLEN], myHostID, PROXY_HOSTIDLEN); + if( pCtx->lockProxyPath!=NULL ){ + strlcpy(&writeBuffer[PROXY_PATHINDEX], pCtx->lockProxyPath, + MAXPATHLEN); + }else{ + strlcpy(&writeBuffer[PROXY_PATHINDEX], tempLockPath, MAXPATHLEN); + } + writeSize = PROXY_PATHINDEX + strlen(&writeBuffer[PROXY_PATHINDEX]); + robust_ftruncate(conchFile->h, writeSize); + rc = unixWrite((sqlite3_file *)conchFile, writeBuffer, writeSize, 0); + full_fsync(conchFile->h,0,0); + /* If we created a new conch file (not just updated the contents of a + ** valid conch file), try to match the permissions of the database + */ + if( rc==SQLITE_OK && createConch ){ + struct stat buf; + int err = osFstat(pFile->h, &buf); + if( err==0 ){ + mode_t cmode = buf.st_mode&(S_IRUSR|S_IWUSR | S_IRGRP|S_IWGRP | + S_IROTH|S_IWOTH); + /* try to match the database file R/W permissions, ignore failure */ +#ifndef SQLITE_PROXY_DEBUG + osFchmod(conchFile->h, cmode); +#else + do{ + rc = osFchmod(conchFile->h, cmode); + }while( rc==(-1) && errno==EINTR ); + if( rc!=0 ){ + int code = errno; + fprintf(stderr, "fchmod %o FAILED with %d %s\n", + cmode, code, strerror(code)); + } else { + fprintf(stderr, "fchmod %o SUCCEDED\n",cmode); + } + }else{ + int code = errno; + fprintf(stderr, "STAT FAILED[%d] with %d %s\n", + err, code, strerror(code)); +#endif + } + } + } + conchFile->pMethod->xUnlock((sqlite3_file*)conchFile, SHARED_LOCK); + + end_takeconch: + OSTRACE(("TRANSPROXY: CLOSE %d\n", pFile->h)); + if( rc==SQLITE_OK && pFile->openFlags ){ + int fd; + if( pFile->h>=0 ){ + robust_close(pFile, pFile->h, __LINE__); + } + pFile->h = -1; + fd = robust_open(pCtx->dbPath, pFile->openFlags, 0); + OSTRACE(("TRANSPROXY: OPEN %d\n", fd)); + if( fd>=0 ){ + pFile->h = fd; + }else{ + rc=SQLITE_CANTOPEN_BKPT; /* SQLITE_BUSY? proxyTakeConch called + during locking */ + } + } + if( rc==SQLITE_OK && !pCtx->lockProxy ){ + char *path = tempLockPath ? tempLockPath : pCtx->lockProxyPath; + rc = proxyCreateUnixFile(path, &pCtx->lockProxy, 1); + if( rc!=SQLITE_OK && rc!=SQLITE_NOMEM && tryOldLockPath ){ + /* we couldn't create the proxy lock file with the old lock file path + ** so try again via auto-naming + */ + forceNewLockPath = 1; + tryOldLockPath = 0; + continue; /* go back to the do {} while start point, try again */ + } + } + if( rc==SQLITE_OK ){ + /* Need to make a copy of path if we extracted the value + ** from the conch file or the path was allocated on the stack + */ + if( tempLockPath ){ + pCtx->lockProxyPath = sqlite3DbStrDup(0, tempLockPath); + if( !pCtx->lockProxyPath ){ + rc = SQLITE_NOMEM_BKPT; + } + } + } + if( rc==SQLITE_OK ){ + pCtx->conchHeld = 1; + + if( pCtx->lockProxy->pMethod == &afpIoMethods ){ + afpLockingContext *afpCtx; + afpCtx = (afpLockingContext *)pCtx->lockProxy->lockingContext; + afpCtx->dbPath = pCtx->lockProxyPath; + } + } else { + conchFile->pMethod->xUnlock((sqlite3_file*)conchFile, NO_LOCK); + } + OSTRACE(("TAKECONCH %d %s\n", conchFile->h, + rc==SQLITE_OK?"ok":"failed")); + return rc; + } while (1); /* in case we need to retry the :auto: lock file - + ** we should never get here except via the 'continue' call. */ + } +} + +/* +** If pFile holds a lock on a conch file, then release that lock. +*/ +static int proxyReleaseConch(unixFile *pFile){ + int rc = SQLITE_OK; /* Subroutine return code */ + proxyLockingContext *pCtx; /* The locking context for the proxy lock */ + unixFile *conchFile; /* Name of the conch file */ + + pCtx = (proxyLockingContext *)pFile->lockingContext; + conchFile = pCtx->conchFile; + OSTRACE(("RELEASECONCH %d for %s pid=%d\n", conchFile->h, + (pCtx->lockProxyPath ? pCtx->lockProxyPath : ":auto:"), + osGetpid(0))); + if( pCtx->conchHeld>0 ){ + rc = conchFile->pMethod->xUnlock((sqlite3_file*)conchFile, NO_LOCK); + } + pCtx->conchHeld = 0; + OSTRACE(("RELEASECONCH %d %s\n", conchFile->h, + (rc==SQLITE_OK ? "ok" : "failed"))); + return rc; +} + +/* +** Given the name of a database file, compute the name of its conch file. +** Store the conch filename in memory obtained from sqlite3_malloc64(). +** Make *pConchPath point to the new name. Return SQLITE_OK on success +** or SQLITE_NOMEM if unable to obtain memory. +** +** The caller is responsible for ensuring that the allocated memory +** space is eventually freed. +** +** *pConchPath is set to NULL if a memory allocation error occurs. +*/ +static int proxyCreateConchPathname(char *dbPath, char **pConchPath){ + int i; /* Loop counter */ + int len = (int)strlen(dbPath); /* Length of database filename - dbPath */ + char *conchPath; /* buffer in which to construct conch name */ + + /* Allocate space for the conch filename and initialize the name to + ** the name of the original database file. */ + *pConchPath = conchPath = (char *)sqlite3_malloc64(len + 8); + if( conchPath==0 ){ + return SQLITE_NOMEM_BKPT; + } + memcpy(conchPath, dbPath, len+1); + + /* now insert a "." before the last / character */ + for( i=(len-1); i>=0; i-- ){ + if( conchPath[i]=='/' ){ + i++; + break; + } + } + conchPath[i]='.'; + while ( ilockingContext; + char *oldPath = pCtx->lockProxyPath; + int rc = SQLITE_OK; + + if( pFile->eFileLock!=NO_LOCK ){ + return SQLITE_BUSY; + } + + /* nothing to do if the path is NULL, :auto: or matches the existing path */ + if( !path || path[0]=='\0' || !strcmp(path, ":auto:") || + (oldPath && !strncmp(oldPath, path, MAXPATHLEN)) ){ + return SQLITE_OK; + }else{ + unixFile *lockProxy = pCtx->lockProxy; + pCtx->lockProxy=NULL; + pCtx->conchHeld = 0; + if( lockProxy!=NULL ){ + rc=lockProxy->pMethod->xClose((sqlite3_file *)lockProxy); + if( rc ) return rc; + sqlite3_free(lockProxy); + } + sqlite3_free(oldPath); + pCtx->lockProxyPath = sqlite3DbStrDup(0, path); + } + + return rc; +} + +/* +** pFile is a file that has been opened by a prior xOpen call. dbPath +** is a string buffer at least MAXPATHLEN+1 characters in size. +** +** This routine find the filename associated with pFile and writes it +** int dbPath. +*/ +static int proxyGetDbPathForUnixFile(unixFile *pFile, char *dbPath){ +#if defined(__APPLE__) + if( pFile->pMethod == &afpIoMethods ){ + /* afp style keeps a reference to the db path in the filePath field + ** of the struct */ + assert( (int)strlen((char*)pFile->lockingContext)<=MAXPATHLEN ); + strlcpy(dbPath, ((afpLockingContext *)pFile->lockingContext)->dbPath, + MAXPATHLEN); + } else +#endif + if( pFile->pMethod == &dotlockIoMethods ){ + /* dot lock style uses the locking context to store the dot lock + ** file path */ + int len = strlen((char *)pFile->lockingContext) - strlen(DOTLOCK_SUFFIX); + memcpy(dbPath, (char *)pFile->lockingContext, len + 1); + }else{ + /* all other styles use the locking context to store the db file path */ + assert( strlen((char*)pFile->lockingContext)<=MAXPATHLEN ); + strlcpy(dbPath, (char *)pFile->lockingContext, MAXPATHLEN); + } + return SQLITE_OK; +} + +/* +** Takes an already filled in unix file and alters it so all file locking +** will be performed on the local proxy lock file. The following fields +** are preserved in the locking context so that they can be restored and +** the unix structure properly cleaned up at close time: +** ->lockingContext +** ->pMethod +*/ +static int proxyTransformUnixFile(unixFile *pFile, const char *path) { + proxyLockingContext *pCtx; + char dbPath[MAXPATHLEN+1]; /* Name of the database file */ + char *lockPath=NULL; + int rc = SQLITE_OK; + + if( pFile->eFileLock!=NO_LOCK ){ + return SQLITE_BUSY; + } + proxyGetDbPathForUnixFile(pFile, dbPath); + if( !path || path[0]=='\0' || !strcmp(path, ":auto:") ){ + lockPath=NULL; + }else{ + lockPath=(char *)path; + } + + OSTRACE(("TRANSPROXY %d for %s pid=%d\n", pFile->h, + (lockPath ? lockPath : ":auto:"), osGetpid(0))); + + pCtx = sqlite3_malloc64( sizeof(*pCtx) ); + if( pCtx==0 ){ + return SQLITE_NOMEM_BKPT; + } + memset(pCtx, 0, sizeof(*pCtx)); + + rc = proxyCreateConchPathname(dbPath, &pCtx->conchFilePath); + if( rc==SQLITE_OK ){ + rc = proxyCreateUnixFile(pCtx->conchFilePath, &pCtx->conchFile, 0); + if( rc==SQLITE_CANTOPEN && ((pFile->openFlags&O_RDWR) == 0) ){ + /* if (a) the open flags are not O_RDWR, (b) the conch isn't there, and + ** (c) the file system is read-only, then enable no-locking access. + ** Ugh, since O_RDONLY==0x0000 we test for !O_RDWR since unixOpen asserts + ** that openFlags will have only one of O_RDONLY or O_RDWR. + */ + struct statfs fsInfo; + struct stat conchInfo; + int goLockless = 0; + + if( osStat(pCtx->conchFilePath, &conchInfo) == -1 ) { + int err = errno; + if( (err==ENOENT) && (statfs(dbPath, &fsInfo) != -1) ){ + goLockless = (fsInfo.f_flags&MNT_RDONLY) == MNT_RDONLY; + } + } + if( goLockless ){ + pCtx->conchHeld = -1; /* read only FS/ lockless */ + rc = SQLITE_OK; + } + } + } + if( rc==SQLITE_OK && lockPath ){ + pCtx->lockProxyPath = sqlite3DbStrDup(0, lockPath); + } + + if( rc==SQLITE_OK ){ + pCtx->dbPath = sqlite3DbStrDup(0, dbPath); + if( pCtx->dbPath==NULL ){ + rc = SQLITE_NOMEM_BKPT; + } + } + if( rc==SQLITE_OK ){ + /* all memory is allocated, proxys are created and assigned, + ** switch the locking context and pMethod then return. + */ + pCtx->oldLockingContext = pFile->lockingContext; + pFile->lockingContext = pCtx; + pCtx->pOldMethod = pFile->pMethod; + pFile->pMethod = &proxyIoMethods; + }else{ + if( pCtx->conchFile ){ + pCtx->conchFile->pMethod->xClose((sqlite3_file *)pCtx->conchFile); + sqlite3_free(pCtx->conchFile); + } + sqlite3DbFree(0, pCtx->lockProxyPath); + sqlite3_free(pCtx->conchFilePath); + sqlite3_free(pCtx); + } + OSTRACE(("TRANSPROXY %d %s\n", pFile->h, + (rc==SQLITE_OK ? "ok" : "failed"))); + return rc; +} + + +/* +** This routine handles sqlite3_file_control() calls that are specific +** to proxy locking. +*/ +static int proxyFileControl(sqlite3_file *id, int op, void *pArg){ + switch( op ){ + case SQLITE_FCNTL_GET_LOCKPROXYFILE: { + unixFile *pFile = (unixFile*)id; + if( pFile->pMethod == &proxyIoMethods ){ + proxyLockingContext *pCtx = (proxyLockingContext*)pFile->lockingContext; + proxyTakeConch(pFile); + if( pCtx->lockProxyPath ){ + *(const char **)pArg = pCtx->lockProxyPath; + }else{ + *(const char **)pArg = ":auto: (not held)"; + } + } else { + *(const char **)pArg = NULL; + } + return SQLITE_OK; + } + case SQLITE_FCNTL_SET_LOCKPROXYFILE: { + unixFile *pFile = (unixFile*)id; + int rc = SQLITE_OK; + int isProxyStyle = (pFile->pMethod == &proxyIoMethods); + if( pArg==NULL || (const char *)pArg==0 ){ + if( isProxyStyle ){ + /* turn off proxy locking - not supported. If support is added for + ** switching proxy locking mode off then it will need to fail if + ** the journal mode is WAL mode. + */ + rc = SQLITE_ERROR /*SQLITE_PROTOCOL? SQLITE_MISUSE?*/; + }else{ + /* turn off proxy locking - already off - NOOP */ + rc = SQLITE_OK; + } + }else{ + const char *proxyPath = (const char *)pArg; + if( isProxyStyle ){ + proxyLockingContext *pCtx = + (proxyLockingContext*)pFile->lockingContext; + if( !strcmp(pArg, ":auto:") + || (pCtx->lockProxyPath && + !strncmp(pCtx->lockProxyPath, proxyPath, MAXPATHLEN)) + ){ + rc = SQLITE_OK; + }else{ + rc = switchLockProxyPath(pFile, proxyPath); + } + }else{ + /* turn on proxy file locking */ + rc = proxyTransformUnixFile(pFile, proxyPath); + } + } + return rc; + } + default: { + assert( 0 ); /* The call assures that only valid opcodes are sent */ + } + } + /*NOTREACHED*/ + return SQLITE_ERROR; +} + +/* +** Within this division (the proxying locking implementation) the procedures +** above this point are all utilities. The lock-related methods of the +** proxy-locking sqlite3_io_method object follow. +*/ + + +/* +** This routine checks if there is a RESERVED lock held on the specified +** file by this or any other process. If such a lock is held, set *pResOut +** to a non-zero value otherwise *pResOut is set to zero. The return value +** is set to SQLITE_OK unless an I/O error occurs during lock checking. +*/ +static int proxyCheckReservedLock(sqlite3_file *id, int *pResOut) { + unixFile *pFile = (unixFile*)id; + int rc = proxyTakeConch(pFile); + if( rc==SQLITE_OK ){ + proxyLockingContext *pCtx = (proxyLockingContext *)pFile->lockingContext; + if( pCtx->conchHeld>0 ){ + unixFile *proxy = pCtx->lockProxy; + return proxy->pMethod->xCheckReservedLock((sqlite3_file*)proxy, pResOut); + }else{ /* conchHeld < 0 is lockless */ + pResOut=0; + } + } + return rc; +} + +/* +** Lock the file with the lock specified by parameter eFileLock - one +** of the following: +** +** (1) SHARED_LOCK +** (2) RESERVED_LOCK +** (3) PENDING_LOCK +** (4) EXCLUSIVE_LOCK +** +** Sometimes when requesting one lock state, additional lock states +** are inserted in between. The locking might fail on one of the later +** transitions leaving the lock state different from what it started but +** still short of its goal. The following chart shows the allowed +** transitions and the inserted intermediate states: +** +** UNLOCKED -> SHARED +** SHARED -> RESERVED +** SHARED -> (PENDING) -> EXCLUSIVE +** RESERVED -> (PENDING) -> EXCLUSIVE +** PENDING -> EXCLUSIVE +** +** This routine will only increase a lock. Use the sqlite3OsUnlock() +** routine to lower a locking level. +*/ +static int proxyLock(sqlite3_file *id, int eFileLock) { + unixFile *pFile = (unixFile*)id; + int rc = proxyTakeConch(pFile); + if( rc==SQLITE_OK ){ + proxyLockingContext *pCtx = (proxyLockingContext *)pFile->lockingContext; + if( pCtx->conchHeld>0 ){ + unixFile *proxy = pCtx->lockProxy; + rc = proxy->pMethod->xLock((sqlite3_file*)proxy, eFileLock); + pFile->eFileLock = proxy->eFileLock; + }else{ + /* conchHeld < 0 is lockless */ + } + } + return rc; +} + + +/* +** Lower the locking level on file descriptor pFile to eFileLock. eFileLock +** must be either NO_LOCK or SHARED_LOCK. +** +** If the locking level of the file descriptor is already at or below +** the requested locking level, this routine is a no-op. +*/ +static int proxyUnlock(sqlite3_file *id, int eFileLock) { + unixFile *pFile = (unixFile*)id; + int rc = proxyTakeConch(pFile); + if( rc==SQLITE_OK ){ + proxyLockingContext *pCtx = (proxyLockingContext *)pFile->lockingContext; + if( pCtx->conchHeld>0 ){ + unixFile *proxy = pCtx->lockProxy; + rc = proxy->pMethod->xUnlock((sqlite3_file*)proxy, eFileLock); + pFile->eFileLock = proxy->eFileLock; + }else{ + /* conchHeld < 0 is lockless */ + } + } + return rc; +} + +/* +** Close a file that uses proxy locks. +*/ +static int proxyClose(sqlite3_file *id) { + if( ALWAYS(id) ){ + unixFile *pFile = (unixFile*)id; + proxyLockingContext *pCtx = (proxyLockingContext *)pFile->lockingContext; + unixFile *lockProxy = pCtx->lockProxy; + unixFile *conchFile = pCtx->conchFile; + int rc = SQLITE_OK; + + if( lockProxy ){ + rc = lockProxy->pMethod->xUnlock((sqlite3_file*)lockProxy, NO_LOCK); + if( rc ) return rc; + rc = lockProxy->pMethod->xClose((sqlite3_file*)lockProxy); + if( rc ) return rc; + sqlite3_free(lockProxy); + pCtx->lockProxy = 0; + } + if( conchFile ){ + if( pCtx->conchHeld ){ + rc = proxyReleaseConch(pFile); + if( rc ) return rc; + } + rc = conchFile->pMethod->xClose((sqlite3_file*)conchFile); + if( rc ) return rc; + sqlite3_free(conchFile); + } + sqlite3DbFree(0, pCtx->lockProxyPath); + sqlite3_free(pCtx->conchFilePath); + sqlite3DbFree(0, pCtx->dbPath); + /* restore the original locking context and pMethod then close it */ + pFile->lockingContext = pCtx->oldLockingContext; + pFile->pMethod = pCtx->pOldMethod; + sqlite3_free(pCtx); + return pFile->pMethod->xClose(id); + } + return SQLITE_OK; +} + + + +#endif /* defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE */ +/* +** The proxy locking style is intended for use with AFP filesystems. +** And since AFP is only supported on MacOSX, the proxy locking is also +** restricted to MacOSX. +** +** +******************* End of the proxy lock implementation ********************** +******************************************************************************/ + +/* +** Initialize the operating system interface. +** +** This routine registers all VFS implementations for unix-like operating +** systems. This routine, and the sqlite3_os_end() routine that follows, +** should be the only routines in this file that are visible from other +** files. +** +** This routine is called once during SQLite initialization and by a +** single thread. The memory allocation and mutex subsystems have not +** necessarily been initialized when this routine is called, and so they +** should not be used. +*/ +SQLITE_API int sqlite3_os_init(void){ + /* + ** The following macro defines an initializer for an sqlite3_vfs object. + ** The name of the VFS is NAME. The pAppData is a pointer to a pointer + ** to the "finder" function. (pAppData is a pointer to a pointer because + ** silly C90 rules prohibit a void* from being cast to a function pointer + ** and so we have to go through the intermediate pointer to avoid problems + ** when compiling with -pedantic-errors on GCC.) + ** + ** The FINDER parameter to this macro is the name of the pointer to the + ** finder-function. The finder-function returns a pointer to the + ** sqlite_io_methods object that implements the desired locking + ** behaviors. See the division above that contains the IOMETHODS + ** macro for addition information on finder-functions. + ** + ** Most finders simply return a pointer to a fixed sqlite3_io_methods + ** object. But the "autolockIoFinder" available on MacOSX does a little + ** more than that; it looks at the filesystem type that hosts the + ** database file and tries to choose an locking method appropriate for + ** that filesystem time. + */ + #define UNIXVFS(VFSNAME, FINDER) { \ + 3, /* iVersion */ \ + sizeof(unixFile), /* szOsFile */ \ + MAX_PATHNAME, /* mxPathname */ \ + 0, /* pNext */ \ + VFSNAME, /* zName */ \ + (void*)&FINDER, /* pAppData */ \ + unixOpen, /* xOpen */ \ + unixDelete, /* xDelete */ \ + unixAccess, /* xAccess */ \ + unixFullPathname, /* xFullPathname */ \ + unixDlOpen, /* xDlOpen */ \ + unixDlError, /* xDlError */ \ + unixDlSym, /* xDlSym */ \ + unixDlClose, /* xDlClose */ \ + unixRandomness, /* xRandomness */ \ + unixSleep, /* xSleep */ \ + unixCurrentTime, /* xCurrentTime */ \ + unixGetLastError, /* xGetLastError */ \ + unixCurrentTimeInt64, /* xCurrentTimeInt64 */ \ + unixSetSystemCall, /* xSetSystemCall */ \ + unixGetSystemCall, /* xGetSystemCall */ \ + unixNextSystemCall, /* xNextSystemCall */ \ + } + + /* + ** All default VFSes for unix are contained in the following array. + ** + ** Note that the sqlite3_vfs.pNext field of the VFS object is modified + ** by the SQLite core when the VFS is registered. So the following + ** array cannot be const. + */ + static sqlite3_vfs aVfs[] = { +#if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) + UNIXVFS("unix", autolockIoFinder ), +#elif OS_VXWORKS + UNIXVFS("unix", vxworksIoFinder ), +#else + UNIXVFS("unix", posixIoFinder ), +#endif + UNIXVFS("unix-none", nolockIoFinder ), + UNIXVFS("unix-dotfile", dotlockIoFinder ), + UNIXVFS("unix-excl", posixIoFinder ), +#if OS_VXWORKS + UNIXVFS("unix-namedsem", semIoFinder ), +#endif +#if SQLITE_ENABLE_LOCKING_STYLE || OS_VXWORKS + UNIXVFS("unix-posix", posixIoFinder ), +#endif +#if SQLITE_ENABLE_LOCKING_STYLE + UNIXVFS("unix-flock", flockIoFinder ), +#endif +#if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) + UNIXVFS("unix-afp", afpIoFinder ), + UNIXVFS("unix-nfs", nfsIoFinder ), + UNIXVFS("unix-proxy", proxyIoFinder ), +#endif + }; + unsigned int i; /* Loop counter */ + + /* Double-check that the aSyscall[] array has been constructed + ** correctly. See ticket [bb3a86e890c8e96ab] */ + assert( ArraySize(aSyscall)==28 ); + + /* Register all VFSes defined in the aVfs[] array */ + for(i=0; i<(sizeof(aVfs)/sizeof(sqlite3_vfs)); i++){ + sqlite3_vfs_register(&aVfs[i], i==0); + } + return SQLITE_OK; +} + +/* +** Shutdown the operating system interface. +** +** Some operating systems might need to do some cleanup in this routine, +** to release dynamically allocated objects. But not on unix. +** This routine is a no-op for unix. +*/ +SQLITE_API int sqlite3_os_end(void){ + return SQLITE_OK; +} + +#endif /* SQLITE_OS_UNIX */ + +/************** End of os_unix.c *********************************************/ +/************** Begin file os_win.c ******************************************/ +/* +** 2004 May 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 file contains code that is specific to Windows. +*/ +/* #include "sqliteInt.h" */ +#if SQLITE_OS_WIN /* This file is used for Windows only */ + +/* +** Include code that is common to all os_*.c files +*/ +/************** Include os_common.h in the middle of os_win.c ****************/ +/************** Begin file os_common.h ***************************************/ +/* +** 2004 May 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 file contains macros and a little bit of code that is common to +** all of the platform-specific files (os_*.c) and is #included into those +** files. +** +** This file should be #included by the os_*.c files only. It is not a +** general purpose header file. +*/ +#ifndef _OS_COMMON_H_ +#define _OS_COMMON_H_ + +/* +** At least two bugs have slipped in because we changed the MEMORY_DEBUG +** macro to SQLITE_DEBUG and some older makefiles have not yet made the +** switch. The following code should catch this problem at compile-time. +*/ +#ifdef MEMORY_DEBUG +# error "The MEMORY_DEBUG macro is obsolete. Use SQLITE_DEBUG instead." +#endif + +/* +** Macros for performance tracing. Normally turned off. Only works +** on i486 hardware. +*/ +#ifdef SQLITE_PERFORMANCE_TRACE + +/* +** hwtime.h contains inline assembler code for implementing +** high-performance timing routines. +*/ +/************** Include hwtime.h in the middle of os_common.h ****************/ +/************** Begin file hwtime.h ******************************************/ +/* +** 2008 May 27 +** +** 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 inline asm code for retrieving "high-performance" +** counters for x86 class CPUs. +*/ +#ifndef SQLITE_HWTIME_H +#define SQLITE_HWTIME_H + +/* +** The following routine only works on pentium-class (or newer) processors. +** It uses the RDTSC opcode to read the cycle count value out of the +** processor and returns that value. This can be used for high-res +** profiling. +*/ +#if (defined(__GNUC__) || defined(_MSC_VER)) && \ + (defined(i386) || defined(__i386__) || defined(_M_IX86)) + + #if defined(__GNUC__) + + __inline__ sqlite_uint64 sqlite3Hwtime(void){ + unsigned int lo, hi; + __asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi)); + return (sqlite_uint64)hi << 32 | lo; + } + + #elif defined(_MSC_VER) + + __declspec(naked) __inline sqlite_uint64 __cdecl sqlite3Hwtime(void){ + __asm { + rdtsc + ret ; return value at EDX:EAX + } + } + + #endif + +#elif (defined(__GNUC__) && defined(__x86_64__)) + + __inline__ sqlite_uint64 sqlite3Hwtime(void){ + unsigned long val; + __asm__ __volatile__ ("rdtsc" : "=A" (val)); + return val; + } + +#elif (defined(__GNUC__) && defined(__ppc__)) + + __inline__ sqlite_uint64 sqlite3Hwtime(void){ + unsigned long long retval; + unsigned long junk; + __asm__ __volatile__ ("\n\ + 1: mftbu %1\n\ + mftb %L0\n\ + mftbu %0\n\ + cmpw %0,%1\n\ + bne 1b" + : "=r" (retval), "=r" (junk)); + return retval; + } + +#else + + #error Need implementation of sqlite3Hwtime() for your platform. + + /* + ** To compile without implementing sqlite3Hwtime() for your platform, + ** you can remove the above #error and use the following + ** stub function. You will lose timing support for many + ** of the debugging and testing utilities, but it should at + ** least compile and run. + */ +SQLITE_PRIVATE sqlite_uint64 sqlite3Hwtime(void){ return ((sqlite_uint64)0); } + +#endif + +#endif /* !defined(SQLITE_HWTIME_H) */ + +/************** End of hwtime.h **********************************************/ +/************** Continuing where we left off in os_common.h ******************/ + +static sqlite_uint64 g_start; +static sqlite_uint64 g_elapsed; +#define TIMER_START g_start=sqlite3Hwtime() +#define TIMER_END g_elapsed=sqlite3Hwtime()-g_start +#define TIMER_ELAPSED g_elapsed +#else +#define TIMER_START +#define TIMER_END +#define TIMER_ELAPSED ((sqlite_uint64)0) +#endif + +/* +** If we compile with the SQLITE_TEST macro set, then the following block +** of code will give us the ability to simulate a disk I/O error. This +** is used for testing the I/O recovery logic. +*/ +#if defined(SQLITE_TEST) +SQLITE_API extern int sqlite3_io_error_hit; +SQLITE_API extern int sqlite3_io_error_hardhit; +SQLITE_API extern int sqlite3_io_error_pending; +SQLITE_API extern int sqlite3_io_error_persist; +SQLITE_API extern int sqlite3_io_error_benign; +SQLITE_API extern int sqlite3_diskfull_pending; +SQLITE_API extern int sqlite3_diskfull; +#define SimulateIOErrorBenign(X) sqlite3_io_error_benign=(X) +#define SimulateIOError(CODE) \ + if( (sqlite3_io_error_persist && sqlite3_io_error_hit) \ + || sqlite3_io_error_pending-- == 1 ) \ + { local_ioerr(); CODE; } +static void local_ioerr(){ + IOTRACE(("IOERR\n")); + sqlite3_io_error_hit++; + if( !sqlite3_io_error_benign ) sqlite3_io_error_hardhit++; +} +#define SimulateDiskfullError(CODE) \ + if( sqlite3_diskfull_pending ){ \ + if( sqlite3_diskfull_pending == 1 ){ \ + local_ioerr(); \ + sqlite3_diskfull = 1; \ + sqlite3_io_error_hit = 1; \ + CODE; \ + }else{ \ + sqlite3_diskfull_pending--; \ + } \ + } +#else +#define SimulateIOErrorBenign(X) +#define SimulateIOError(A) +#define SimulateDiskfullError(A) +#endif /* defined(SQLITE_TEST) */ + +/* +** When testing, keep a count of the number of open files. +*/ +#if defined(SQLITE_TEST) +SQLITE_API extern int sqlite3_open_file_count; +#define OpenCounter(X) sqlite3_open_file_count+=(X) +#else +#define OpenCounter(X) +#endif /* defined(SQLITE_TEST) */ + +#endif /* !defined(_OS_COMMON_H_) */ + +/************** End of os_common.h *******************************************/ +/************** Continuing where we left off in os_win.c *********************/ + +/* +** Include the header file for the Windows VFS. +*/ +/* #include "os_win.h" */ + +/* +** Compiling and using WAL mode requires several APIs that are only +** available in Windows platforms based on the NT kernel. +*/ +#if !SQLITE_OS_WINNT && !defined(SQLITE_OMIT_WAL) +# error "WAL mode requires support from the Windows NT kernel, compile\ + with SQLITE_OMIT_WAL." +#endif + +#if !SQLITE_OS_WINNT && SQLITE_MAX_MMAP_SIZE>0 +# error "Memory mapped files require support from the Windows NT kernel,\ + compile with SQLITE_MAX_MMAP_SIZE=0." +#endif + +/* +** Are most of the Win32 ANSI APIs available (i.e. with certain exceptions +** based on the sub-platform)? +*/ +#if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && !defined(SQLITE_WIN32_NO_ANSI) +# define SQLITE_WIN32_HAS_ANSI +#endif + +/* +** Are most of the Win32 Unicode APIs available (i.e. with certain exceptions +** based on the sub-platform)? +*/ +#if (SQLITE_OS_WINCE || SQLITE_OS_WINNT || SQLITE_OS_WINRT) && \ + !defined(SQLITE_WIN32_NO_WIDE) +# define SQLITE_WIN32_HAS_WIDE +#endif + +/* +** Make sure at least one set of Win32 APIs is available. +*/ +#if !defined(SQLITE_WIN32_HAS_ANSI) && !defined(SQLITE_WIN32_HAS_WIDE) +# error "At least one of SQLITE_WIN32_HAS_ANSI and SQLITE_WIN32_HAS_WIDE\ + must be defined." +#endif + +/* +** Define the required Windows SDK version constants if they are not +** already available. +*/ +#ifndef NTDDI_WIN8 +# define NTDDI_WIN8 0x06020000 +#endif + +#ifndef NTDDI_WINBLUE +# define NTDDI_WINBLUE 0x06030000 +#endif + +#ifndef NTDDI_WINTHRESHOLD +# define NTDDI_WINTHRESHOLD 0x06040000 +#endif + +/* +** Check to see if the GetVersionEx[AW] functions are deprecated on the +** target system. GetVersionEx was first deprecated in Win8.1. +*/ +#ifndef SQLITE_WIN32_GETVERSIONEX +# if defined(NTDDI_VERSION) && NTDDI_VERSION >= NTDDI_WINBLUE +# define SQLITE_WIN32_GETVERSIONEX 0 /* GetVersionEx() is deprecated */ +# else +# define SQLITE_WIN32_GETVERSIONEX 1 /* GetVersionEx() is current */ +# endif +#endif + +/* +** Check to see if the CreateFileMappingA function is supported on the +** target system. It is unavailable when using "mincore.lib" on Win10. +** When compiling for Windows 10, always assume "mincore.lib" is in use. +*/ +#ifndef SQLITE_WIN32_CREATEFILEMAPPINGA +# if defined(NTDDI_VERSION) && NTDDI_VERSION >= NTDDI_WINTHRESHOLD +# define SQLITE_WIN32_CREATEFILEMAPPINGA 0 +# else +# define SQLITE_WIN32_CREATEFILEMAPPINGA 1 +# endif +#endif + +/* +** This constant should already be defined (in the "WinDef.h" SDK file). +*/ +#ifndef MAX_PATH +# define MAX_PATH (260) +#endif + +/* +** Maximum pathname length (in chars) for Win32. This should normally be +** MAX_PATH. +*/ +#ifndef SQLITE_WIN32_MAX_PATH_CHARS +# define SQLITE_WIN32_MAX_PATH_CHARS (MAX_PATH) +#endif + +/* +** This constant should already be defined (in the "WinNT.h" SDK file). +*/ +#ifndef UNICODE_STRING_MAX_CHARS +# define UNICODE_STRING_MAX_CHARS (32767) +#endif + +/* +** Maximum pathname length (in chars) for WinNT. This should normally be +** UNICODE_STRING_MAX_CHARS. +*/ +#ifndef SQLITE_WINNT_MAX_PATH_CHARS +# define SQLITE_WINNT_MAX_PATH_CHARS (UNICODE_STRING_MAX_CHARS) +#endif + +/* +** Maximum pathname length (in bytes) for Win32. The MAX_PATH macro is in +** characters, so we allocate 4 bytes per character assuming worst-case of +** 4-bytes-per-character for UTF8. +*/ +#ifndef SQLITE_WIN32_MAX_PATH_BYTES +# define SQLITE_WIN32_MAX_PATH_BYTES (SQLITE_WIN32_MAX_PATH_CHARS*4) +#endif + +/* +** Maximum pathname length (in bytes) for WinNT. This should normally be +** UNICODE_STRING_MAX_CHARS * sizeof(WCHAR). +*/ +#ifndef SQLITE_WINNT_MAX_PATH_BYTES +# define SQLITE_WINNT_MAX_PATH_BYTES \ + (sizeof(WCHAR) * SQLITE_WINNT_MAX_PATH_CHARS) +#endif + +/* +** Maximum error message length (in chars) for WinRT. +*/ +#ifndef SQLITE_WIN32_MAX_ERRMSG_CHARS +# define SQLITE_WIN32_MAX_ERRMSG_CHARS (1024) +#endif + +/* +** Returns non-zero if the character should be treated as a directory +** separator. +*/ +#ifndef winIsDirSep +# define winIsDirSep(a) (((a) == '/') || ((a) == '\\')) +#endif + +/* +** This macro is used when a local variable is set to a value that is +** [sometimes] not used by the code (e.g. via conditional compilation). +*/ +#ifndef UNUSED_VARIABLE_VALUE +# define UNUSED_VARIABLE_VALUE(x) (void)(x) +#endif + +/* +** Returns the character that should be used as the directory separator. +*/ +#ifndef winGetDirSep +# define winGetDirSep() '\\' +#endif + +/* +** Do we need to manually define the Win32 file mapping APIs for use with WAL +** mode or memory mapped files (e.g. these APIs are available in the Windows +** CE SDK; however, they are not present in the header file)? +*/ +#if SQLITE_WIN32_FILEMAPPING_API && \ + (!defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0) +/* +** Two of the file mapping APIs are different under WinRT. Figure out which +** set we need. +*/ +#if SQLITE_OS_WINRT +WINBASEAPI HANDLE WINAPI CreateFileMappingFromApp(HANDLE, \ + LPSECURITY_ATTRIBUTES, ULONG, ULONG64, LPCWSTR); + +WINBASEAPI LPVOID WINAPI MapViewOfFileFromApp(HANDLE, ULONG, ULONG64, SIZE_T); +#else +#if defined(SQLITE_WIN32_HAS_ANSI) +WINBASEAPI HANDLE WINAPI CreateFileMappingA(HANDLE, LPSECURITY_ATTRIBUTES, \ + DWORD, DWORD, DWORD, LPCSTR); +#endif /* defined(SQLITE_WIN32_HAS_ANSI) */ + +#if defined(SQLITE_WIN32_HAS_WIDE) +WINBASEAPI HANDLE WINAPI CreateFileMappingW(HANDLE, LPSECURITY_ATTRIBUTES, \ + DWORD, DWORD, DWORD, LPCWSTR); +#endif /* defined(SQLITE_WIN32_HAS_WIDE) */ + +WINBASEAPI LPVOID WINAPI MapViewOfFile(HANDLE, DWORD, DWORD, DWORD, SIZE_T); +#endif /* SQLITE_OS_WINRT */ + +/* +** These file mapping APIs are common to both Win32 and WinRT. +*/ + +WINBASEAPI BOOL WINAPI FlushViewOfFile(LPCVOID, SIZE_T); +WINBASEAPI BOOL WINAPI UnmapViewOfFile(LPCVOID); +#endif /* SQLITE_WIN32_FILEMAPPING_API */ + +/* +** Some Microsoft compilers lack this definition. +*/ +#ifndef INVALID_FILE_ATTRIBUTES +# define INVALID_FILE_ATTRIBUTES ((DWORD)-1) +#endif + +#ifndef FILE_FLAG_MASK +# define FILE_FLAG_MASK (0xFF3C0000) +#endif + +#ifndef FILE_ATTRIBUTE_MASK +# define FILE_ATTRIBUTE_MASK (0x0003FFF7) +#endif + +#ifndef SQLITE_OMIT_WAL +/* Forward references to structures used for WAL */ +typedef struct winShm winShm; /* A connection to shared-memory */ +typedef struct winShmNode winShmNode; /* A region of shared-memory */ +#endif + +/* +** WinCE lacks native support for file locking so we have to fake it +** with some code of our own. +*/ +#if SQLITE_OS_WINCE +typedef struct winceLock { + int nReaders; /* Number of reader locks obtained */ + BOOL bPending; /* Indicates a pending lock has been obtained */ + BOOL bReserved; /* Indicates a reserved lock has been obtained */ + BOOL bExclusive; /* Indicates an exclusive lock has been obtained */ +} winceLock; +#endif + +/* +** The winFile structure is a subclass of sqlite3_file* specific to the win32 +** portability layer. +*/ +typedef struct winFile winFile; +struct winFile { + const sqlite3_io_methods *pMethod; /*** Must be first ***/ + sqlite3_vfs *pVfs; /* The VFS used to open this file */ + HANDLE h; /* Handle for accessing the file */ + u8 locktype; /* Type of lock currently held on this file */ + short sharedLockByte; /* Randomly chosen byte used as a shared lock */ + u8 ctrlFlags; /* Flags. See WINFILE_* below */ + DWORD lastErrno; /* The Windows errno from the last I/O error */ +#ifndef SQLITE_OMIT_WAL + winShm *pShm; /* Instance of shared memory on this file */ +#endif + const char *zPath; /* Full pathname of this file */ + int szChunk; /* Chunk size configured by FCNTL_CHUNK_SIZE */ +#if SQLITE_OS_WINCE + LPWSTR zDeleteOnClose; /* Name of file to delete when closing */ + HANDLE hMutex; /* Mutex used to control access to shared lock */ + HANDLE hShared; /* Shared memory segment used for locking */ + winceLock local; /* Locks obtained by this instance of winFile */ + winceLock *shared; /* Global shared lock memory for the file */ +#endif +#if SQLITE_MAX_MMAP_SIZE>0 + int nFetchOut; /* Number of outstanding xFetch references */ + HANDLE hMap; /* Handle for accessing memory mapping */ + void *pMapRegion; /* Area memory mapped */ + sqlite3_int64 mmapSize; /* Usable size of mapped region */ + sqlite3_int64 mmapSizeActual; /* Actual size of mapped region */ + sqlite3_int64 mmapSizeMax; /* Configured FCNTL_MMAP_SIZE value */ +#endif +}; + +/* +** The winVfsAppData structure is used for the pAppData member for all of the +** Win32 VFS variants. +*/ +typedef struct winVfsAppData winVfsAppData; +struct winVfsAppData { + const sqlite3_io_methods *pMethod; /* The file I/O methods to use. */ + void *pAppData; /* The extra pAppData, if any. */ + BOOL bNoLock; /* Non-zero if locking is disabled. */ +}; + +/* +** Allowed values for winFile.ctrlFlags +*/ +#define WINFILE_RDONLY 0x02 /* Connection is read only */ +#define WINFILE_PERSIST_WAL 0x04 /* Persistent WAL mode */ +#define WINFILE_PSOW 0x10 /* SQLITE_IOCAP_POWERSAFE_OVERWRITE */ + +/* + * The size of the buffer used by sqlite3_win32_write_debug(). + */ +#ifndef SQLITE_WIN32_DBG_BUF_SIZE +# define SQLITE_WIN32_DBG_BUF_SIZE ((int)(4096-sizeof(DWORD))) +#endif + +/* + * The value used with sqlite3_win32_set_directory() to specify that + * the data directory should be changed. + */ +#ifndef SQLITE_WIN32_DATA_DIRECTORY_TYPE +# define SQLITE_WIN32_DATA_DIRECTORY_TYPE (1) +#endif + +/* + * The value used with sqlite3_win32_set_directory() to specify that + * the temporary directory should be changed. + */ +#ifndef SQLITE_WIN32_TEMP_DIRECTORY_TYPE +# define SQLITE_WIN32_TEMP_DIRECTORY_TYPE (2) +#endif + +/* + * If compiled with SQLITE_WIN32_MALLOC on Windows, we will use the + * various Win32 API heap functions instead of our own. + */ +#ifdef SQLITE_WIN32_MALLOC + +/* + * If this is non-zero, an isolated heap will be created by the native Win32 + * allocator subsystem; otherwise, the default process heap will be used. This + * setting has no effect when compiling for WinRT. By default, this is enabled + * and an isolated heap will be created to store all allocated data. + * + ****************************************************************************** + * WARNING: It is important to note that when this setting is non-zero and the + * winMemShutdown function is called (e.g. by the sqlite3_shutdown + * function), all data that was allocated using the isolated heap will + * be freed immediately and any attempt to access any of that freed + * data will almost certainly result in an immediate access violation. + ****************************************************************************** + */ +#ifndef SQLITE_WIN32_HEAP_CREATE +# define SQLITE_WIN32_HEAP_CREATE (TRUE) +#endif + +/* + * This is cache size used in the calculation of the initial size of the + * Win32-specific heap. It cannot be negative. + */ +#ifndef SQLITE_WIN32_CACHE_SIZE +# if SQLITE_DEFAULT_CACHE_SIZE>=0 +# define SQLITE_WIN32_CACHE_SIZE (SQLITE_DEFAULT_CACHE_SIZE) +# else +# define SQLITE_WIN32_CACHE_SIZE (-(SQLITE_DEFAULT_CACHE_SIZE)) +# endif +#endif + +/* + * The initial size of the Win32-specific heap. This value may be zero. + */ +#ifndef SQLITE_WIN32_HEAP_INIT_SIZE +# define SQLITE_WIN32_HEAP_INIT_SIZE ((SQLITE_WIN32_CACHE_SIZE) * \ + (SQLITE_DEFAULT_PAGE_SIZE) + 4194304) +#endif + +/* + * The maximum size of the Win32-specific heap. This value may be zero. + */ +#ifndef SQLITE_WIN32_HEAP_MAX_SIZE +# define SQLITE_WIN32_HEAP_MAX_SIZE (0) +#endif + +/* + * The extra flags to use in calls to the Win32 heap APIs. This value may be + * zero for the default behavior. + */ +#ifndef SQLITE_WIN32_HEAP_FLAGS +# define SQLITE_WIN32_HEAP_FLAGS (0) +#endif + + +/* +** The winMemData structure stores information required by the Win32-specific +** sqlite3_mem_methods implementation. +*/ +typedef struct winMemData winMemData; +struct winMemData { +#ifndef NDEBUG + u32 magic1; /* Magic number to detect structure corruption. */ +#endif + HANDLE hHeap; /* The handle to our heap. */ + BOOL bOwned; /* Do we own the heap (i.e. destroy it on shutdown)? */ +#ifndef NDEBUG + u32 magic2; /* Magic number to detect structure corruption. */ +#endif +}; + +#ifndef NDEBUG +#define WINMEM_MAGIC1 0x42b2830b +#define WINMEM_MAGIC2 0xbd4d7cf4 +#endif + +static struct winMemData win_mem_data = { +#ifndef NDEBUG + WINMEM_MAGIC1, +#endif + NULL, FALSE +#ifndef NDEBUG + ,WINMEM_MAGIC2 +#endif +}; + +#ifndef NDEBUG +#define winMemAssertMagic1() assert( win_mem_data.magic1==WINMEM_MAGIC1 ) +#define winMemAssertMagic2() assert( win_mem_data.magic2==WINMEM_MAGIC2 ) +#define winMemAssertMagic() winMemAssertMagic1(); winMemAssertMagic2(); +#else +#define winMemAssertMagic() +#endif + +#define winMemGetDataPtr() &win_mem_data +#define winMemGetHeap() win_mem_data.hHeap +#define winMemGetOwned() win_mem_data.bOwned + +static void *winMemMalloc(int nBytes); +static void winMemFree(void *pPrior); +static void *winMemRealloc(void *pPrior, int nBytes); +static int winMemSize(void *p); +static int winMemRoundup(int n); +static int winMemInit(void *pAppData); +static void winMemShutdown(void *pAppData); + +SQLITE_PRIVATE const sqlite3_mem_methods *sqlite3MemGetWin32(void); +#endif /* SQLITE_WIN32_MALLOC */ + +/* +** The following variable is (normally) set once and never changes +** thereafter. It records whether the operating system is Win9x +** or WinNT. +** +** 0: Operating system unknown. +** 1: Operating system is Win9x. +** 2: Operating system is WinNT. +** +** In order to facilitate testing on a WinNT system, the test fixture +** can manually set this value to 1 to emulate Win98 behavior. +*/ +#ifdef SQLITE_TEST +SQLITE_API LONG SQLITE_WIN32_VOLATILE sqlite3_os_type = 0; +#else +static LONG SQLITE_WIN32_VOLATILE sqlite3_os_type = 0; +#endif + +#ifndef SYSCALL +# define SYSCALL sqlite3_syscall_ptr +#endif + +/* +** This function is not available on Windows CE or WinRT. + */ + +#if SQLITE_OS_WINCE || SQLITE_OS_WINRT +# define osAreFileApisANSI() 1 +#endif + +/* +** Many system calls are accessed through pointer-to-functions so that +** they may be overridden at runtime to facilitate fault injection during +** testing and sandboxing. The following array holds the names and pointers +** to all overrideable system calls. +*/ +static struct win_syscall { + const char *zName; /* Name of the system call */ + sqlite3_syscall_ptr pCurrent; /* Current value of the system call */ + sqlite3_syscall_ptr pDefault; /* Default value */ +} aSyscall[] = { +#if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT + { "AreFileApisANSI", (SYSCALL)AreFileApisANSI, 0 }, +#else + { "AreFileApisANSI", (SYSCALL)0, 0 }, +#endif + +#ifndef osAreFileApisANSI +#define osAreFileApisANSI ((BOOL(WINAPI*)(VOID))aSyscall[0].pCurrent) +#endif + +#if SQLITE_OS_WINCE && defined(SQLITE_WIN32_HAS_WIDE) + { "CharLowerW", (SYSCALL)CharLowerW, 0 }, +#else + { "CharLowerW", (SYSCALL)0, 0 }, +#endif + +#define osCharLowerW ((LPWSTR(WINAPI*)(LPWSTR))aSyscall[1].pCurrent) + +#if SQLITE_OS_WINCE && defined(SQLITE_WIN32_HAS_WIDE) + { "CharUpperW", (SYSCALL)CharUpperW, 0 }, +#else + { "CharUpperW", (SYSCALL)0, 0 }, +#endif + +#define osCharUpperW ((LPWSTR(WINAPI*)(LPWSTR))aSyscall[2].pCurrent) + + { "CloseHandle", (SYSCALL)CloseHandle, 0 }, + +#define osCloseHandle ((BOOL(WINAPI*)(HANDLE))aSyscall[3].pCurrent) + +#if defined(SQLITE_WIN32_HAS_ANSI) + { "CreateFileA", (SYSCALL)CreateFileA, 0 }, +#else + { "CreateFileA", (SYSCALL)0, 0 }, +#endif + +#define osCreateFileA ((HANDLE(WINAPI*)(LPCSTR,DWORD,DWORD, \ + LPSECURITY_ATTRIBUTES,DWORD,DWORD,HANDLE))aSyscall[4].pCurrent) + +#if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE) + { "CreateFileW", (SYSCALL)CreateFileW, 0 }, +#else + { "CreateFileW", (SYSCALL)0, 0 }, +#endif + +#define osCreateFileW ((HANDLE(WINAPI*)(LPCWSTR,DWORD,DWORD, \ + LPSECURITY_ATTRIBUTES,DWORD,DWORD,HANDLE))aSyscall[5].pCurrent) + +#if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_ANSI) && \ + (!defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0) && \ + SQLITE_WIN32_CREATEFILEMAPPINGA + { "CreateFileMappingA", (SYSCALL)CreateFileMappingA, 0 }, +#else + { "CreateFileMappingA", (SYSCALL)0, 0 }, +#endif + +#define osCreateFileMappingA ((HANDLE(WINAPI*)(HANDLE,LPSECURITY_ATTRIBUTES, \ + DWORD,DWORD,DWORD,LPCSTR))aSyscall[6].pCurrent) + +#if SQLITE_OS_WINCE || (!SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE) && \ + (!defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0)) + { "CreateFileMappingW", (SYSCALL)CreateFileMappingW, 0 }, +#else + { "CreateFileMappingW", (SYSCALL)0, 0 }, +#endif + +#define osCreateFileMappingW ((HANDLE(WINAPI*)(HANDLE,LPSECURITY_ATTRIBUTES, \ + DWORD,DWORD,DWORD,LPCWSTR))aSyscall[7].pCurrent) + +#if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE) + { "CreateMutexW", (SYSCALL)CreateMutexW, 0 }, +#else + { "CreateMutexW", (SYSCALL)0, 0 }, +#endif + +#define osCreateMutexW ((HANDLE(WINAPI*)(LPSECURITY_ATTRIBUTES,BOOL, \ + LPCWSTR))aSyscall[8].pCurrent) + +#if defined(SQLITE_WIN32_HAS_ANSI) + { "DeleteFileA", (SYSCALL)DeleteFileA, 0 }, +#else + { "DeleteFileA", (SYSCALL)0, 0 }, +#endif + +#define osDeleteFileA ((BOOL(WINAPI*)(LPCSTR))aSyscall[9].pCurrent) + +#if defined(SQLITE_WIN32_HAS_WIDE) + { "DeleteFileW", (SYSCALL)DeleteFileW, 0 }, +#else + { "DeleteFileW", (SYSCALL)0, 0 }, +#endif + +#define osDeleteFileW ((BOOL(WINAPI*)(LPCWSTR))aSyscall[10].pCurrent) + +#if SQLITE_OS_WINCE + { "FileTimeToLocalFileTime", (SYSCALL)FileTimeToLocalFileTime, 0 }, +#else + { "FileTimeToLocalFileTime", (SYSCALL)0, 0 }, +#endif + +#define osFileTimeToLocalFileTime ((BOOL(WINAPI*)(CONST FILETIME*, \ + LPFILETIME))aSyscall[11].pCurrent) + +#if SQLITE_OS_WINCE + { "FileTimeToSystemTime", (SYSCALL)FileTimeToSystemTime, 0 }, +#else + { "FileTimeToSystemTime", (SYSCALL)0, 0 }, +#endif + +#define osFileTimeToSystemTime ((BOOL(WINAPI*)(CONST FILETIME*, \ + LPSYSTEMTIME))aSyscall[12].pCurrent) + + { "FlushFileBuffers", (SYSCALL)FlushFileBuffers, 0 }, + +#define osFlushFileBuffers ((BOOL(WINAPI*)(HANDLE))aSyscall[13].pCurrent) + +#if defined(SQLITE_WIN32_HAS_ANSI) + { "FormatMessageA", (SYSCALL)FormatMessageA, 0 }, +#else + { "FormatMessageA", (SYSCALL)0, 0 }, +#endif + +#define osFormatMessageA ((DWORD(WINAPI*)(DWORD,LPCVOID,DWORD,DWORD,LPSTR, \ + DWORD,va_list*))aSyscall[14].pCurrent) + +#if defined(SQLITE_WIN32_HAS_WIDE) + { "FormatMessageW", (SYSCALL)FormatMessageW, 0 }, +#else + { "FormatMessageW", (SYSCALL)0, 0 }, +#endif + +#define osFormatMessageW ((DWORD(WINAPI*)(DWORD,LPCVOID,DWORD,DWORD,LPWSTR, \ + DWORD,va_list*))aSyscall[15].pCurrent) + +#if !defined(SQLITE_OMIT_LOAD_EXTENSION) + { "FreeLibrary", (SYSCALL)FreeLibrary, 0 }, +#else + { "FreeLibrary", (SYSCALL)0, 0 }, +#endif + +#define osFreeLibrary ((BOOL(WINAPI*)(HMODULE))aSyscall[16].pCurrent) + + { "GetCurrentProcessId", (SYSCALL)GetCurrentProcessId, 0 }, + +#define osGetCurrentProcessId ((DWORD(WINAPI*)(VOID))aSyscall[17].pCurrent) + +#if !SQLITE_OS_WINCE && defined(SQLITE_WIN32_HAS_ANSI) + { "GetDiskFreeSpaceA", (SYSCALL)GetDiskFreeSpaceA, 0 }, +#else + { "GetDiskFreeSpaceA", (SYSCALL)0, 0 }, +#endif + +#define osGetDiskFreeSpaceA ((BOOL(WINAPI*)(LPCSTR,LPDWORD,LPDWORD,LPDWORD, \ + LPDWORD))aSyscall[18].pCurrent) + +#if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE) + { "GetDiskFreeSpaceW", (SYSCALL)GetDiskFreeSpaceW, 0 }, +#else + { "GetDiskFreeSpaceW", (SYSCALL)0, 0 }, +#endif + +#define osGetDiskFreeSpaceW ((BOOL(WINAPI*)(LPCWSTR,LPDWORD,LPDWORD,LPDWORD, \ + LPDWORD))aSyscall[19].pCurrent) + +#if defined(SQLITE_WIN32_HAS_ANSI) + { "GetFileAttributesA", (SYSCALL)GetFileAttributesA, 0 }, +#else + { "GetFileAttributesA", (SYSCALL)0, 0 }, +#endif + +#define osGetFileAttributesA ((DWORD(WINAPI*)(LPCSTR))aSyscall[20].pCurrent) + +#if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE) + { "GetFileAttributesW", (SYSCALL)GetFileAttributesW, 0 }, +#else + { "GetFileAttributesW", (SYSCALL)0, 0 }, +#endif + +#define osGetFileAttributesW ((DWORD(WINAPI*)(LPCWSTR))aSyscall[21].pCurrent) + +#if defined(SQLITE_WIN32_HAS_WIDE) + { "GetFileAttributesExW", (SYSCALL)GetFileAttributesExW, 0 }, +#else + { "GetFileAttributesExW", (SYSCALL)0, 0 }, +#endif + +#define osGetFileAttributesExW ((BOOL(WINAPI*)(LPCWSTR,GET_FILEEX_INFO_LEVELS, \ + LPVOID))aSyscall[22].pCurrent) + +#if !SQLITE_OS_WINRT + { "GetFileSize", (SYSCALL)GetFileSize, 0 }, +#else + { "GetFileSize", (SYSCALL)0, 0 }, +#endif + +#define osGetFileSize ((DWORD(WINAPI*)(HANDLE,LPDWORD))aSyscall[23].pCurrent) + +#if !SQLITE_OS_WINCE && defined(SQLITE_WIN32_HAS_ANSI) + { "GetFullPathNameA", (SYSCALL)GetFullPathNameA, 0 }, +#else + { "GetFullPathNameA", (SYSCALL)0, 0 }, +#endif + +#define osGetFullPathNameA ((DWORD(WINAPI*)(LPCSTR,DWORD,LPSTR, \ + LPSTR*))aSyscall[24].pCurrent) + +#if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE) + { "GetFullPathNameW", (SYSCALL)GetFullPathNameW, 0 }, +#else + { "GetFullPathNameW", (SYSCALL)0, 0 }, +#endif + +#define osGetFullPathNameW ((DWORD(WINAPI*)(LPCWSTR,DWORD,LPWSTR, \ + LPWSTR*))aSyscall[25].pCurrent) + + { "GetLastError", (SYSCALL)GetLastError, 0 }, + +#define osGetLastError ((DWORD(WINAPI*)(VOID))aSyscall[26].pCurrent) + +#if !defined(SQLITE_OMIT_LOAD_EXTENSION) +#if SQLITE_OS_WINCE + /* The GetProcAddressA() routine is only available on Windows CE. */ + { "GetProcAddressA", (SYSCALL)GetProcAddressA, 0 }, +#else + /* All other Windows platforms expect GetProcAddress() to take + ** an ANSI string regardless of the _UNICODE setting */ + { "GetProcAddressA", (SYSCALL)GetProcAddress, 0 }, +#endif +#else + { "GetProcAddressA", (SYSCALL)0, 0 }, +#endif + +#define osGetProcAddressA ((FARPROC(WINAPI*)(HMODULE, \ + LPCSTR))aSyscall[27].pCurrent) + +#if !SQLITE_OS_WINRT + { "GetSystemInfo", (SYSCALL)GetSystemInfo, 0 }, +#else + { "GetSystemInfo", (SYSCALL)0, 0 }, +#endif + +#define osGetSystemInfo ((VOID(WINAPI*)(LPSYSTEM_INFO))aSyscall[28].pCurrent) + + { "GetSystemTime", (SYSCALL)GetSystemTime, 0 }, + +#define osGetSystemTime ((VOID(WINAPI*)(LPSYSTEMTIME))aSyscall[29].pCurrent) + +#if !SQLITE_OS_WINCE + { "GetSystemTimeAsFileTime", (SYSCALL)GetSystemTimeAsFileTime, 0 }, +#else + { "GetSystemTimeAsFileTime", (SYSCALL)0, 0 }, +#endif + +#define osGetSystemTimeAsFileTime ((VOID(WINAPI*)( \ + LPFILETIME))aSyscall[30].pCurrent) + +#if defined(SQLITE_WIN32_HAS_ANSI) + { "GetTempPathA", (SYSCALL)GetTempPathA, 0 }, +#else + { "GetTempPathA", (SYSCALL)0, 0 }, +#endif + +#define osGetTempPathA ((DWORD(WINAPI*)(DWORD,LPSTR))aSyscall[31].pCurrent) + +#if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE) + { "GetTempPathW", (SYSCALL)GetTempPathW, 0 }, +#else + { "GetTempPathW", (SYSCALL)0, 0 }, +#endif + +#define osGetTempPathW ((DWORD(WINAPI*)(DWORD,LPWSTR))aSyscall[32].pCurrent) + +#if !SQLITE_OS_WINRT + { "GetTickCount", (SYSCALL)GetTickCount, 0 }, +#else + { "GetTickCount", (SYSCALL)0, 0 }, +#endif + +#define osGetTickCount ((DWORD(WINAPI*)(VOID))aSyscall[33].pCurrent) + +#if defined(SQLITE_WIN32_HAS_ANSI) && SQLITE_WIN32_GETVERSIONEX + { "GetVersionExA", (SYSCALL)GetVersionExA, 0 }, +#else + { "GetVersionExA", (SYSCALL)0, 0 }, +#endif + +#define osGetVersionExA ((BOOL(WINAPI*)( \ + LPOSVERSIONINFOA))aSyscall[34].pCurrent) + +#if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE) && \ + SQLITE_WIN32_GETVERSIONEX + { "GetVersionExW", (SYSCALL)GetVersionExW, 0 }, +#else + { "GetVersionExW", (SYSCALL)0, 0 }, +#endif + +#define osGetVersionExW ((BOOL(WINAPI*)( \ + LPOSVERSIONINFOW))aSyscall[35].pCurrent) + + { "HeapAlloc", (SYSCALL)HeapAlloc, 0 }, + +#define osHeapAlloc ((LPVOID(WINAPI*)(HANDLE,DWORD, \ + SIZE_T))aSyscall[36].pCurrent) + +#if !SQLITE_OS_WINRT + { "HeapCreate", (SYSCALL)HeapCreate, 0 }, +#else + { "HeapCreate", (SYSCALL)0, 0 }, +#endif + +#define osHeapCreate ((HANDLE(WINAPI*)(DWORD,SIZE_T, \ + SIZE_T))aSyscall[37].pCurrent) + +#if !SQLITE_OS_WINRT + { "HeapDestroy", (SYSCALL)HeapDestroy, 0 }, +#else + { "HeapDestroy", (SYSCALL)0, 0 }, +#endif + +#define osHeapDestroy ((BOOL(WINAPI*)(HANDLE))aSyscall[38].pCurrent) + + { "HeapFree", (SYSCALL)HeapFree, 0 }, + +#define osHeapFree ((BOOL(WINAPI*)(HANDLE,DWORD,LPVOID))aSyscall[39].pCurrent) + + { "HeapReAlloc", (SYSCALL)HeapReAlloc, 0 }, + +#define osHeapReAlloc ((LPVOID(WINAPI*)(HANDLE,DWORD,LPVOID, \ + SIZE_T))aSyscall[40].pCurrent) + + { "HeapSize", (SYSCALL)HeapSize, 0 }, + +#define osHeapSize ((SIZE_T(WINAPI*)(HANDLE,DWORD, \ + LPCVOID))aSyscall[41].pCurrent) + +#if !SQLITE_OS_WINRT + { "HeapValidate", (SYSCALL)HeapValidate, 0 }, +#else + { "HeapValidate", (SYSCALL)0, 0 }, +#endif + +#define osHeapValidate ((BOOL(WINAPI*)(HANDLE,DWORD, \ + LPCVOID))aSyscall[42].pCurrent) + +#if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT + { "HeapCompact", (SYSCALL)HeapCompact, 0 }, +#else + { "HeapCompact", (SYSCALL)0, 0 }, +#endif + +#define osHeapCompact ((UINT(WINAPI*)(HANDLE,DWORD))aSyscall[43].pCurrent) + +#if defined(SQLITE_WIN32_HAS_ANSI) && !defined(SQLITE_OMIT_LOAD_EXTENSION) + { "LoadLibraryA", (SYSCALL)LoadLibraryA, 0 }, +#else + { "LoadLibraryA", (SYSCALL)0, 0 }, +#endif + +#define osLoadLibraryA ((HMODULE(WINAPI*)(LPCSTR))aSyscall[44].pCurrent) + +#if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE) && \ + !defined(SQLITE_OMIT_LOAD_EXTENSION) + { "LoadLibraryW", (SYSCALL)LoadLibraryW, 0 }, +#else + { "LoadLibraryW", (SYSCALL)0, 0 }, +#endif + +#define osLoadLibraryW ((HMODULE(WINAPI*)(LPCWSTR))aSyscall[45].pCurrent) + +#if !SQLITE_OS_WINRT + { "LocalFree", (SYSCALL)LocalFree, 0 }, +#else + { "LocalFree", (SYSCALL)0, 0 }, +#endif + +#define osLocalFree ((HLOCAL(WINAPI*)(HLOCAL))aSyscall[46].pCurrent) + +#if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT + { "LockFile", (SYSCALL)LockFile, 0 }, +#else + { "LockFile", (SYSCALL)0, 0 }, +#endif + +#ifndef osLockFile +#define osLockFile ((BOOL(WINAPI*)(HANDLE,DWORD,DWORD,DWORD, \ + DWORD))aSyscall[47].pCurrent) +#endif + +#if !SQLITE_OS_WINCE + { "LockFileEx", (SYSCALL)LockFileEx, 0 }, +#else + { "LockFileEx", (SYSCALL)0, 0 }, +#endif + +#ifndef osLockFileEx +#define osLockFileEx ((BOOL(WINAPI*)(HANDLE,DWORD,DWORD,DWORD,DWORD, \ + LPOVERLAPPED))aSyscall[48].pCurrent) +#endif + +#if SQLITE_OS_WINCE || (!SQLITE_OS_WINRT && \ + (!defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0)) + { "MapViewOfFile", (SYSCALL)MapViewOfFile, 0 }, +#else + { "MapViewOfFile", (SYSCALL)0, 0 }, +#endif + +#define osMapViewOfFile ((LPVOID(WINAPI*)(HANDLE,DWORD,DWORD,DWORD, \ + SIZE_T))aSyscall[49].pCurrent) + + { "MultiByteToWideChar", (SYSCALL)MultiByteToWideChar, 0 }, + +#define osMultiByteToWideChar ((int(WINAPI*)(UINT,DWORD,LPCSTR,int,LPWSTR, \ + int))aSyscall[50].pCurrent) + + { "QueryPerformanceCounter", (SYSCALL)QueryPerformanceCounter, 0 }, + +#define osQueryPerformanceCounter ((BOOL(WINAPI*)( \ + LARGE_INTEGER*))aSyscall[51].pCurrent) + + { "ReadFile", (SYSCALL)ReadFile, 0 }, + +#define osReadFile ((BOOL(WINAPI*)(HANDLE,LPVOID,DWORD,LPDWORD, \ + LPOVERLAPPED))aSyscall[52].pCurrent) + + { "SetEndOfFile", (SYSCALL)SetEndOfFile, 0 }, + +#define osSetEndOfFile ((BOOL(WINAPI*)(HANDLE))aSyscall[53].pCurrent) + +#if !SQLITE_OS_WINRT + { "SetFilePointer", (SYSCALL)SetFilePointer, 0 }, +#else + { "SetFilePointer", (SYSCALL)0, 0 }, +#endif + +#define osSetFilePointer ((DWORD(WINAPI*)(HANDLE,LONG,PLONG, \ + DWORD))aSyscall[54].pCurrent) + +#if !SQLITE_OS_WINRT + { "Sleep", (SYSCALL)Sleep, 0 }, +#else + { "Sleep", (SYSCALL)0, 0 }, +#endif + +#define osSleep ((VOID(WINAPI*)(DWORD))aSyscall[55].pCurrent) + + { "SystemTimeToFileTime", (SYSCALL)SystemTimeToFileTime, 0 }, + +#define osSystemTimeToFileTime ((BOOL(WINAPI*)(CONST SYSTEMTIME*, \ + LPFILETIME))aSyscall[56].pCurrent) + +#if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT + { "UnlockFile", (SYSCALL)UnlockFile, 0 }, +#else + { "UnlockFile", (SYSCALL)0, 0 }, +#endif + +#ifndef osUnlockFile +#define osUnlockFile ((BOOL(WINAPI*)(HANDLE,DWORD,DWORD,DWORD, \ + DWORD))aSyscall[57].pCurrent) +#endif + +#if !SQLITE_OS_WINCE + { "UnlockFileEx", (SYSCALL)UnlockFileEx, 0 }, +#else + { "UnlockFileEx", (SYSCALL)0, 0 }, +#endif + +#define osUnlockFileEx ((BOOL(WINAPI*)(HANDLE,DWORD,DWORD,DWORD, \ + LPOVERLAPPED))aSyscall[58].pCurrent) + +#if SQLITE_OS_WINCE || !defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0 + { "UnmapViewOfFile", (SYSCALL)UnmapViewOfFile, 0 }, +#else + { "UnmapViewOfFile", (SYSCALL)0, 0 }, +#endif + +#define osUnmapViewOfFile ((BOOL(WINAPI*)(LPCVOID))aSyscall[59].pCurrent) + + { "WideCharToMultiByte", (SYSCALL)WideCharToMultiByte, 0 }, + +#define osWideCharToMultiByte ((int(WINAPI*)(UINT,DWORD,LPCWSTR,int,LPSTR,int, \ + LPCSTR,LPBOOL))aSyscall[60].pCurrent) + + { "WriteFile", (SYSCALL)WriteFile, 0 }, + +#define osWriteFile ((BOOL(WINAPI*)(HANDLE,LPCVOID,DWORD,LPDWORD, \ + LPOVERLAPPED))aSyscall[61].pCurrent) + +#if SQLITE_OS_WINRT + { "CreateEventExW", (SYSCALL)CreateEventExW, 0 }, +#else + { "CreateEventExW", (SYSCALL)0, 0 }, +#endif + +#define osCreateEventExW ((HANDLE(WINAPI*)(LPSECURITY_ATTRIBUTES,LPCWSTR, \ + DWORD,DWORD))aSyscall[62].pCurrent) + +#if !SQLITE_OS_WINRT + { "WaitForSingleObject", (SYSCALL)WaitForSingleObject, 0 }, +#else + { "WaitForSingleObject", (SYSCALL)0, 0 }, +#endif + +#define osWaitForSingleObject ((DWORD(WINAPI*)(HANDLE, \ + DWORD))aSyscall[63].pCurrent) + +#if !SQLITE_OS_WINCE + { "WaitForSingleObjectEx", (SYSCALL)WaitForSingleObjectEx, 0 }, +#else + { "WaitForSingleObjectEx", (SYSCALL)0, 0 }, +#endif + +#define osWaitForSingleObjectEx ((DWORD(WINAPI*)(HANDLE,DWORD, \ + BOOL))aSyscall[64].pCurrent) + +#if SQLITE_OS_WINRT + { "SetFilePointerEx", (SYSCALL)SetFilePointerEx, 0 }, +#else + { "SetFilePointerEx", (SYSCALL)0, 0 }, +#endif + +#define osSetFilePointerEx ((BOOL(WINAPI*)(HANDLE,LARGE_INTEGER, \ + PLARGE_INTEGER,DWORD))aSyscall[65].pCurrent) + +#if SQLITE_OS_WINRT + { "GetFileInformationByHandleEx", (SYSCALL)GetFileInformationByHandleEx, 0 }, +#else + { "GetFileInformationByHandleEx", (SYSCALL)0, 0 }, +#endif + +#define osGetFileInformationByHandleEx ((BOOL(WINAPI*)(HANDLE, \ + FILE_INFO_BY_HANDLE_CLASS,LPVOID,DWORD))aSyscall[66].pCurrent) + +#if SQLITE_OS_WINRT && (!defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0) + { "MapViewOfFileFromApp", (SYSCALL)MapViewOfFileFromApp, 0 }, +#else + { "MapViewOfFileFromApp", (SYSCALL)0, 0 }, +#endif + +#define osMapViewOfFileFromApp ((LPVOID(WINAPI*)(HANDLE,ULONG,ULONG64, \ + SIZE_T))aSyscall[67].pCurrent) + +#if SQLITE_OS_WINRT + { "CreateFile2", (SYSCALL)CreateFile2, 0 }, +#else + { "CreateFile2", (SYSCALL)0, 0 }, +#endif + +#define osCreateFile2 ((HANDLE(WINAPI*)(LPCWSTR,DWORD,DWORD,DWORD, \ + LPCREATEFILE2_EXTENDED_PARAMETERS))aSyscall[68].pCurrent) + +#if SQLITE_OS_WINRT && !defined(SQLITE_OMIT_LOAD_EXTENSION) + { "LoadPackagedLibrary", (SYSCALL)LoadPackagedLibrary, 0 }, +#else + { "LoadPackagedLibrary", (SYSCALL)0, 0 }, +#endif + +#define osLoadPackagedLibrary ((HMODULE(WINAPI*)(LPCWSTR, \ + DWORD))aSyscall[69].pCurrent) + +#if SQLITE_OS_WINRT + { "GetTickCount64", (SYSCALL)GetTickCount64, 0 }, +#else + { "GetTickCount64", (SYSCALL)0, 0 }, +#endif + +#define osGetTickCount64 ((ULONGLONG(WINAPI*)(VOID))aSyscall[70].pCurrent) + +#if SQLITE_OS_WINRT + { "GetNativeSystemInfo", (SYSCALL)GetNativeSystemInfo, 0 }, +#else + { "GetNativeSystemInfo", (SYSCALL)0, 0 }, +#endif + +#define osGetNativeSystemInfo ((VOID(WINAPI*)( \ + LPSYSTEM_INFO))aSyscall[71].pCurrent) + +#if defined(SQLITE_WIN32_HAS_ANSI) + { "OutputDebugStringA", (SYSCALL)OutputDebugStringA, 0 }, +#else + { "OutputDebugStringA", (SYSCALL)0, 0 }, +#endif + +#define osOutputDebugStringA ((VOID(WINAPI*)(LPCSTR))aSyscall[72].pCurrent) + +#if defined(SQLITE_WIN32_HAS_WIDE) + { "OutputDebugStringW", (SYSCALL)OutputDebugStringW, 0 }, +#else + { "OutputDebugStringW", (SYSCALL)0, 0 }, +#endif + +#define osOutputDebugStringW ((VOID(WINAPI*)(LPCWSTR))aSyscall[73].pCurrent) + + { "GetProcessHeap", (SYSCALL)GetProcessHeap, 0 }, + +#define osGetProcessHeap ((HANDLE(WINAPI*)(VOID))aSyscall[74].pCurrent) + +#if SQLITE_OS_WINRT && (!defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0) + { "CreateFileMappingFromApp", (SYSCALL)CreateFileMappingFromApp, 0 }, +#else + { "CreateFileMappingFromApp", (SYSCALL)0, 0 }, +#endif + +#define osCreateFileMappingFromApp ((HANDLE(WINAPI*)(HANDLE, \ + LPSECURITY_ATTRIBUTES,ULONG,ULONG64,LPCWSTR))aSyscall[75].pCurrent) + +/* +** NOTE: On some sub-platforms, the InterlockedCompareExchange "function" +** is really just a macro that uses a compiler intrinsic (e.g. x64). +** So do not try to make this is into a redefinable interface. +*/ +#if defined(InterlockedCompareExchange) + { "InterlockedCompareExchange", (SYSCALL)0, 0 }, + +#define osInterlockedCompareExchange InterlockedCompareExchange +#else + { "InterlockedCompareExchange", (SYSCALL)InterlockedCompareExchange, 0 }, + +#define osInterlockedCompareExchange ((LONG(WINAPI*)(LONG \ + SQLITE_WIN32_VOLATILE*, LONG,LONG))aSyscall[76].pCurrent) +#endif /* defined(InterlockedCompareExchange) */ + +#if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && SQLITE_WIN32_USE_UUID + { "UuidCreate", (SYSCALL)UuidCreate, 0 }, +#else + { "UuidCreate", (SYSCALL)0, 0 }, +#endif + +#define osUuidCreate ((RPC_STATUS(RPC_ENTRY*)(UUID*))aSyscall[77].pCurrent) + +#if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && SQLITE_WIN32_USE_UUID + { "UuidCreateSequential", (SYSCALL)UuidCreateSequential, 0 }, +#else + { "UuidCreateSequential", (SYSCALL)0, 0 }, +#endif + +#define osUuidCreateSequential \ + ((RPC_STATUS(RPC_ENTRY*)(UUID*))aSyscall[78].pCurrent) + +#if !defined(SQLITE_NO_SYNC) && SQLITE_MAX_MMAP_SIZE>0 + { "FlushViewOfFile", (SYSCALL)FlushViewOfFile, 0 }, +#else + { "FlushViewOfFile", (SYSCALL)0, 0 }, +#endif + +#define osFlushViewOfFile \ + ((BOOL(WINAPI*)(LPCVOID,SIZE_T))aSyscall[79].pCurrent) + +}; /* End of the overrideable system calls */ + +/* +** This is the xSetSystemCall() method of sqlite3_vfs for all of the +** "win32" VFSes. Return SQLITE_OK opon successfully updating the +** system call pointer, or SQLITE_NOTFOUND if there is no configurable +** system call named zName. +*/ +static int winSetSystemCall( + sqlite3_vfs *pNotUsed, /* The VFS pointer. Not used */ + const char *zName, /* Name of system call to override */ + sqlite3_syscall_ptr pNewFunc /* Pointer to new system call value */ +){ + unsigned int i; + int rc = SQLITE_NOTFOUND; + + UNUSED_PARAMETER(pNotUsed); + if( zName==0 ){ + /* If no zName is given, restore all system calls to their default + ** settings and return NULL + */ + rc = SQLITE_OK; + for(i=0; i0 ){ + memset(zDbgBuf, 0, SQLITE_WIN32_DBG_BUF_SIZE); + memcpy(zDbgBuf, zBuf, nMin); + osOutputDebugStringA(zDbgBuf); + }else{ + osOutputDebugStringA(zBuf); + } +#elif defined(SQLITE_WIN32_HAS_WIDE) + memset(zDbgBuf, 0, SQLITE_WIN32_DBG_BUF_SIZE); + if ( osMultiByteToWideChar( + osAreFileApisANSI() ? CP_ACP : CP_OEMCP, 0, zBuf, + nMin, (LPWSTR)zDbgBuf, SQLITE_WIN32_DBG_BUF_SIZE/sizeof(WCHAR))<=0 ){ + return; + } + osOutputDebugStringW((LPCWSTR)zDbgBuf); +#else + if( nMin>0 ){ + memset(zDbgBuf, 0, SQLITE_WIN32_DBG_BUF_SIZE); + memcpy(zDbgBuf, zBuf, nMin); + fprintf(stderr, "%s", zDbgBuf); + }else{ + fprintf(stderr, "%s", zBuf); + } +#endif +} + +/* +** The following routine suspends the current thread for at least ms +** milliseconds. This is equivalent to the Win32 Sleep() interface. +*/ +#if SQLITE_OS_WINRT +static HANDLE sleepObj = NULL; +#endif + +SQLITE_API void sqlite3_win32_sleep(DWORD milliseconds){ +#if SQLITE_OS_WINRT + if ( sleepObj==NULL ){ + sleepObj = osCreateEventExW(NULL, NULL, CREATE_EVENT_MANUAL_RESET, + SYNCHRONIZE); + } + assert( sleepObj!=NULL ); + osWaitForSingleObjectEx(sleepObj, milliseconds, FALSE); +#else + osSleep(milliseconds); +#endif +} + +#if SQLITE_MAX_WORKER_THREADS>0 && !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && \ + SQLITE_THREADSAFE>0 +SQLITE_PRIVATE DWORD sqlite3Win32Wait(HANDLE hObject){ + DWORD rc; + while( (rc = osWaitForSingleObjectEx(hObject, INFINITE, + TRUE))==WAIT_IO_COMPLETION ){} + return rc; +} +#endif + +/* +** Return true (non-zero) if we are running under WinNT, Win2K, WinXP, +** or WinCE. Return false (zero) for Win95, Win98, or WinME. +** +** Here is an interesting observation: Win95, Win98, and WinME lack +** the LockFileEx() API. But we can still statically link against that +** API as long as we don't call it when running Win95/98/ME. A call to +** this routine is used to determine if the host is Win95/98/ME or +** WinNT/2K/XP so that we will know whether or not we can safely call +** the LockFileEx() API. +*/ + +#if !SQLITE_WIN32_GETVERSIONEX +# define osIsNT() (1) +#elif SQLITE_OS_WINCE || SQLITE_OS_WINRT || !defined(SQLITE_WIN32_HAS_ANSI) +# define osIsNT() (1) +#elif !defined(SQLITE_WIN32_HAS_WIDE) +# define osIsNT() (0) +#else +# define osIsNT() ((sqlite3_os_type==2) || sqlite3_win32_is_nt()) +#endif + +/* +** This function determines if the machine is running a version of Windows +** based on the NT kernel. +*/ +SQLITE_API int sqlite3_win32_is_nt(void){ +#if SQLITE_OS_WINRT + /* + ** NOTE: The WinRT sub-platform is always assumed to be based on the NT + ** kernel. + */ + return 1; +#elif SQLITE_WIN32_GETVERSIONEX + if( osInterlockedCompareExchange(&sqlite3_os_type, 0, 0)==0 ){ +#if defined(SQLITE_WIN32_HAS_ANSI) + OSVERSIONINFOA sInfo; + sInfo.dwOSVersionInfoSize = sizeof(sInfo); + osGetVersionExA(&sInfo); + osInterlockedCompareExchange(&sqlite3_os_type, + (sInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) ? 2 : 1, 0); +#elif defined(SQLITE_WIN32_HAS_WIDE) + OSVERSIONINFOW sInfo; + sInfo.dwOSVersionInfoSize = sizeof(sInfo); + osGetVersionExW(&sInfo); + osInterlockedCompareExchange(&sqlite3_os_type, + (sInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) ? 2 : 1, 0); +#endif + } + return osInterlockedCompareExchange(&sqlite3_os_type, 2, 2)==2; +#elif SQLITE_TEST + return osInterlockedCompareExchange(&sqlite3_os_type, 2, 2)==2; +#else + /* + ** NOTE: All sub-platforms where the GetVersionEx[AW] functions are + ** deprecated are always assumed to be based on the NT kernel. + */ + return 1; +#endif +} + +#ifdef SQLITE_WIN32_MALLOC +/* +** Allocate nBytes of memory. +*/ +static void *winMemMalloc(int nBytes){ + HANDLE hHeap; + void *p; + + winMemAssertMagic(); + hHeap = winMemGetHeap(); + assert( hHeap!=0 ); + assert( hHeap!=INVALID_HANDLE_VALUE ); +#if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_MALLOC_VALIDATE) + assert( osHeapValidate(hHeap, SQLITE_WIN32_HEAP_FLAGS, NULL) ); +#endif + assert( nBytes>=0 ); + p = osHeapAlloc(hHeap, SQLITE_WIN32_HEAP_FLAGS, (SIZE_T)nBytes); + if( !p ){ + sqlite3_log(SQLITE_NOMEM, "failed to HeapAlloc %u bytes (%lu), heap=%p", + nBytes, osGetLastError(), (void*)hHeap); + } + return p; +} + +/* +** Free memory. +*/ +static void winMemFree(void *pPrior){ + HANDLE hHeap; + + winMemAssertMagic(); + hHeap = winMemGetHeap(); + assert( hHeap!=0 ); + assert( hHeap!=INVALID_HANDLE_VALUE ); +#if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_MALLOC_VALIDATE) + assert( osHeapValidate(hHeap, SQLITE_WIN32_HEAP_FLAGS, pPrior) ); +#endif + if( !pPrior ) return; /* Passing NULL to HeapFree is undefined. */ + if( !osHeapFree(hHeap, SQLITE_WIN32_HEAP_FLAGS, pPrior) ){ + sqlite3_log(SQLITE_NOMEM, "failed to HeapFree block %p (%lu), heap=%p", + pPrior, osGetLastError(), (void*)hHeap); + } +} + +/* +** Change the size of an existing memory allocation +*/ +static void *winMemRealloc(void *pPrior, int nBytes){ + HANDLE hHeap; + void *p; + + winMemAssertMagic(); + hHeap = winMemGetHeap(); + assert( hHeap!=0 ); + assert( hHeap!=INVALID_HANDLE_VALUE ); +#if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_MALLOC_VALIDATE) + assert( osHeapValidate(hHeap, SQLITE_WIN32_HEAP_FLAGS, pPrior) ); +#endif + assert( nBytes>=0 ); + if( !pPrior ){ + p = osHeapAlloc(hHeap, SQLITE_WIN32_HEAP_FLAGS, (SIZE_T)nBytes); + }else{ + p = osHeapReAlloc(hHeap, SQLITE_WIN32_HEAP_FLAGS, pPrior, (SIZE_T)nBytes); + } + if( !p ){ + sqlite3_log(SQLITE_NOMEM, "failed to %s %u bytes (%lu), heap=%p", + pPrior ? "HeapReAlloc" : "HeapAlloc", nBytes, osGetLastError(), + (void*)hHeap); + } + return p; +} + +/* +** Return the size of an outstanding allocation, in bytes. +*/ +static int winMemSize(void *p){ + HANDLE hHeap; + SIZE_T n; + + winMemAssertMagic(); + hHeap = winMemGetHeap(); + assert( hHeap!=0 ); + assert( hHeap!=INVALID_HANDLE_VALUE ); +#if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_MALLOC_VALIDATE) + assert( osHeapValidate(hHeap, SQLITE_WIN32_HEAP_FLAGS, p) ); +#endif + if( !p ) return 0; + n = osHeapSize(hHeap, SQLITE_WIN32_HEAP_FLAGS, p); + if( n==(SIZE_T)-1 ){ + sqlite3_log(SQLITE_NOMEM, "failed to HeapSize block %p (%lu), heap=%p", + p, osGetLastError(), (void*)hHeap); + return 0; + } + return (int)n; +} + +/* +** Round up a request size to the next valid allocation size. +*/ +static int winMemRoundup(int n){ + return n; +} + +/* +** Initialize this module. +*/ +static int winMemInit(void *pAppData){ + winMemData *pWinMemData = (winMemData *)pAppData; + + if( !pWinMemData ) return SQLITE_ERROR; + assert( pWinMemData->magic1==WINMEM_MAGIC1 ); + assert( pWinMemData->magic2==WINMEM_MAGIC2 ); + +#if !SQLITE_OS_WINRT && SQLITE_WIN32_HEAP_CREATE + if( !pWinMemData->hHeap ){ + DWORD dwInitialSize = SQLITE_WIN32_HEAP_INIT_SIZE; + DWORD dwMaximumSize = (DWORD)sqlite3GlobalConfig.nHeap; + if( dwMaximumSize==0 ){ + dwMaximumSize = SQLITE_WIN32_HEAP_MAX_SIZE; + }else if( dwInitialSize>dwMaximumSize ){ + dwInitialSize = dwMaximumSize; + } + pWinMemData->hHeap = osHeapCreate(SQLITE_WIN32_HEAP_FLAGS, + dwInitialSize, dwMaximumSize); + if( !pWinMemData->hHeap ){ + sqlite3_log(SQLITE_NOMEM, + "failed to HeapCreate (%lu), flags=%u, initSize=%lu, maxSize=%lu", + osGetLastError(), SQLITE_WIN32_HEAP_FLAGS, dwInitialSize, + dwMaximumSize); + return SQLITE_NOMEM_BKPT; + } + pWinMemData->bOwned = TRUE; + assert( pWinMemData->bOwned ); + } +#else + pWinMemData->hHeap = osGetProcessHeap(); + if( !pWinMemData->hHeap ){ + sqlite3_log(SQLITE_NOMEM, + "failed to GetProcessHeap (%lu)", osGetLastError()); + return SQLITE_NOMEM_BKPT; + } + pWinMemData->bOwned = FALSE; + assert( !pWinMemData->bOwned ); +#endif + assert( pWinMemData->hHeap!=0 ); + assert( pWinMemData->hHeap!=INVALID_HANDLE_VALUE ); +#if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_MALLOC_VALIDATE) + assert( osHeapValidate(pWinMemData->hHeap, SQLITE_WIN32_HEAP_FLAGS, NULL) ); +#endif + return SQLITE_OK; +} + +/* +** Deinitialize this module. +*/ +static void winMemShutdown(void *pAppData){ + winMemData *pWinMemData = (winMemData *)pAppData; + + if( !pWinMemData ) return; + assert( pWinMemData->magic1==WINMEM_MAGIC1 ); + assert( pWinMemData->magic2==WINMEM_MAGIC2 ); + + if( pWinMemData->hHeap ){ + assert( pWinMemData->hHeap!=INVALID_HANDLE_VALUE ); +#if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_MALLOC_VALIDATE) + assert( osHeapValidate(pWinMemData->hHeap, SQLITE_WIN32_HEAP_FLAGS, NULL) ); +#endif + if( pWinMemData->bOwned ){ + if( !osHeapDestroy(pWinMemData->hHeap) ){ + sqlite3_log(SQLITE_NOMEM, "failed to HeapDestroy (%lu), heap=%p", + osGetLastError(), (void*)pWinMemData->hHeap); + } + pWinMemData->bOwned = FALSE; + } + pWinMemData->hHeap = NULL; + } +} + +/* +** Populate the low-level memory allocation function pointers in +** sqlite3GlobalConfig.m with pointers to the routines in this file. The +** arguments specify the block of memory to manage. +** +** This routine is only called by sqlite3_config(), and therefore +** is not required to be threadsafe (it is not). +*/ +SQLITE_PRIVATE const sqlite3_mem_methods *sqlite3MemGetWin32(void){ + static const sqlite3_mem_methods winMemMethods = { + winMemMalloc, + winMemFree, + winMemRealloc, + winMemSize, + winMemRoundup, + winMemInit, + winMemShutdown, + &win_mem_data + }; + return &winMemMethods; +} + +SQLITE_PRIVATE void sqlite3MemSetDefault(void){ + sqlite3_config(SQLITE_CONFIG_MALLOC, sqlite3MemGetWin32()); +} +#endif /* SQLITE_WIN32_MALLOC */ + +/* +** Convert a UTF-8 string to Microsoft Unicode. +** +** Space to hold the returned string is obtained from sqlite3_malloc(). +*/ +static LPWSTR winUtf8ToUnicode(const char *zText){ + int nChar; + LPWSTR zWideText; + + nChar = osMultiByteToWideChar(CP_UTF8, 0, zText, -1, NULL, 0); + if( nChar==0 ){ + return 0; + } + zWideText = sqlite3MallocZero( nChar*sizeof(WCHAR) ); + if( zWideText==0 ){ + return 0; + } + nChar = osMultiByteToWideChar(CP_UTF8, 0, zText, -1, zWideText, + nChar); + if( nChar==0 ){ + sqlite3_free(zWideText); + zWideText = 0; + } + return zWideText; +} + +/* +** Convert a Microsoft Unicode string to UTF-8. +** +** Space to hold the returned string is obtained from sqlite3_malloc(). +*/ +static char *winUnicodeToUtf8(LPCWSTR zWideText){ + int nByte; + char *zText; + + nByte = osWideCharToMultiByte(CP_UTF8, 0, zWideText, -1, 0, 0, 0, 0); + if( nByte == 0 ){ + return 0; + } + zText = sqlite3MallocZero( nByte ); + if( zText==0 ){ + return 0; + } + nByte = osWideCharToMultiByte(CP_UTF8, 0, zWideText, -1, zText, nByte, + 0, 0); + if( nByte == 0 ){ + sqlite3_free(zText); + zText = 0; + } + return zText; +} + +/* +** Convert an ANSI string to Microsoft Unicode, using the ANSI or OEM +** code page. +** +** Space to hold the returned string is obtained from sqlite3_malloc(). +*/ +static LPWSTR winMbcsToUnicode(const char *zText, int useAnsi){ + int nByte; + LPWSTR zMbcsText; + int codepage = useAnsi ? CP_ACP : CP_OEMCP; + + nByte = osMultiByteToWideChar(codepage, 0, zText, -1, NULL, + 0)*sizeof(WCHAR); + if( nByte==0 ){ + return 0; + } + zMbcsText = sqlite3MallocZero( nByte*sizeof(WCHAR) ); + if( zMbcsText==0 ){ + return 0; + } + nByte = osMultiByteToWideChar(codepage, 0, zText, -1, zMbcsText, + nByte); + if( nByte==0 ){ + sqlite3_free(zMbcsText); + zMbcsText = 0; + } + return zMbcsText; +} + +/* +** Convert a Microsoft Unicode string to a multi-byte character string, +** using the ANSI or OEM code page. +** +** Space to hold the returned string is obtained from sqlite3_malloc(). +*/ +static char *winUnicodeToMbcs(LPCWSTR zWideText, int useAnsi){ + int nByte; + char *zText; + int codepage = useAnsi ? CP_ACP : CP_OEMCP; + + nByte = osWideCharToMultiByte(codepage, 0, zWideText, -1, 0, 0, 0, 0); + if( nByte == 0 ){ + return 0; + } + zText = sqlite3MallocZero( nByte ); + if( zText==0 ){ + return 0; + } + nByte = osWideCharToMultiByte(codepage, 0, zWideText, -1, zText, + nByte, 0, 0); + if( nByte == 0 ){ + sqlite3_free(zText); + zText = 0; + } + return zText; +} + +/* +** Convert a multi-byte character string to UTF-8. +** +** Space to hold the returned string is obtained from sqlite3_malloc(). +*/ +static char *winMbcsToUtf8(const char *zText, int useAnsi){ + char *zTextUtf8; + LPWSTR zTmpWide; + + zTmpWide = winMbcsToUnicode(zText, useAnsi); + if( zTmpWide==0 ){ + return 0; + } + zTextUtf8 = winUnicodeToUtf8(zTmpWide); + sqlite3_free(zTmpWide); + return zTextUtf8; +} + +/* +** Convert a UTF-8 string to a multi-byte character string. +** +** Space to hold the returned string is obtained from sqlite3_malloc(). +*/ +static char *winUtf8ToMbcs(const char *zText, int useAnsi){ + char *zTextMbcs; + LPWSTR zTmpWide; + + zTmpWide = winUtf8ToUnicode(zText); + if( zTmpWide==0 ){ + return 0; + } + zTextMbcs = winUnicodeToMbcs(zTmpWide, useAnsi); + sqlite3_free(zTmpWide); + return zTextMbcs; +} + +/* +** This is a public wrapper for the winUtf8ToUnicode() function. +*/ +SQLITE_API LPWSTR sqlite3_win32_utf8_to_unicode(const char *zText){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !zText ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif +#ifndef SQLITE_OMIT_AUTOINIT + if( sqlite3_initialize() ) return 0; +#endif + return winUtf8ToUnicode(zText); +} + +/* +** This is a public wrapper for the winUnicodeToUtf8() function. +*/ +SQLITE_API char *sqlite3_win32_unicode_to_utf8(LPCWSTR zWideText){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !zWideText ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif +#ifndef SQLITE_OMIT_AUTOINIT + if( sqlite3_initialize() ) return 0; +#endif + return winUnicodeToUtf8(zWideText); +} + +/* +** This is a public wrapper for the winMbcsToUtf8() function. +*/ +SQLITE_API char *sqlite3_win32_mbcs_to_utf8(const char *zText){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !zText ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif +#ifndef SQLITE_OMIT_AUTOINIT + if( sqlite3_initialize() ) return 0; +#endif + return winMbcsToUtf8(zText, osAreFileApisANSI()); +} + +/* +** This is a public wrapper for the winMbcsToUtf8() function. +*/ +SQLITE_API char *sqlite3_win32_mbcs_to_utf8_v2(const char *zText, int useAnsi){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !zText ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif +#ifndef SQLITE_OMIT_AUTOINIT + if( sqlite3_initialize() ) return 0; +#endif + return winMbcsToUtf8(zText, useAnsi); +} + +/* +** This is a public wrapper for the winUtf8ToMbcs() function. +*/ +SQLITE_API char *sqlite3_win32_utf8_to_mbcs(const char *zText){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !zText ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif +#ifndef SQLITE_OMIT_AUTOINIT + if( sqlite3_initialize() ) return 0; +#endif + return winUtf8ToMbcs(zText, osAreFileApisANSI()); +} + +/* +** This is a public wrapper for the winUtf8ToMbcs() function. +*/ +SQLITE_API char *sqlite3_win32_utf8_to_mbcs_v2(const char *zText, int useAnsi){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !zText ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif +#ifndef SQLITE_OMIT_AUTOINIT + if( sqlite3_initialize() ) return 0; +#endif + return winUtf8ToMbcs(zText, useAnsi); +} + +/* +** This function sets the data directory or the temporary directory based on +** the provided arguments. The type argument must be 1 in order to set the +** data directory or 2 in order to set the temporary directory. The zValue +** argument is the name of the directory to use. The return value will be +** SQLITE_OK if successful. +*/ +SQLITE_API int sqlite3_win32_set_directory(DWORD type, LPCWSTR zValue){ + char **ppDirectory = 0; +#ifndef SQLITE_OMIT_AUTOINIT + int rc = sqlite3_initialize(); + if( rc ) return rc; +#endif + if( type==SQLITE_WIN32_DATA_DIRECTORY_TYPE ){ + ppDirectory = &sqlite3_data_directory; + }else if( type==SQLITE_WIN32_TEMP_DIRECTORY_TYPE ){ + ppDirectory = &sqlite3_temp_directory; + } + assert( !ppDirectory || type==SQLITE_WIN32_DATA_DIRECTORY_TYPE + || type==SQLITE_WIN32_TEMP_DIRECTORY_TYPE + ); + assert( !ppDirectory || sqlite3MemdebugHasType(*ppDirectory, MEMTYPE_HEAP) ); + if( ppDirectory ){ + char *zValueUtf8 = 0; + if( zValue && zValue[0] ){ + zValueUtf8 = winUnicodeToUtf8(zValue); + if ( zValueUtf8==0 ){ + return SQLITE_NOMEM_BKPT; + } + } + sqlite3_free(*ppDirectory); + *ppDirectory = zValueUtf8; + return SQLITE_OK; + } + return SQLITE_ERROR; +} + +/* +** The return value of winGetLastErrorMsg +** is zero if the error message fits in the buffer, or non-zero +** otherwise (if the message was truncated). +*/ +static int winGetLastErrorMsg(DWORD lastErrno, int nBuf, char *zBuf){ + /* FormatMessage returns 0 on failure. Otherwise it + ** returns the number of TCHARs written to the output + ** buffer, excluding the terminating null char. + */ + DWORD dwLen = 0; + char *zOut = 0; + + if( osIsNT() ){ +#if SQLITE_OS_WINRT + WCHAR zTempWide[SQLITE_WIN32_MAX_ERRMSG_CHARS+1]; + dwLen = osFormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + lastErrno, + 0, + zTempWide, + SQLITE_WIN32_MAX_ERRMSG_CHARS, + 0); +#else + LPWSTR zTempWide = NULL; + dwLen = osFormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + lastErrno, + 0, + (LPWSTR) &zTempWide, + 0, + 0); +#endif + if( dwLen > 0 ){ + /* allocate a buffer and convert to UTF8 */ + sqlite3BeginBenignMalloc(); + zOut = winUnicodeToUtf8(zTempWide); + sqlite3EndBenignMalloc(); +#if !SQLITE_OS_WINRT + /* free the system buffer allocated by FormatMessage */ + osLocalFree(zTempWide); +#endif + } + } +#ifdef SQLITE_WIN32_HAS_ANSI + else{ + char *zTemp = NULL; + dwLen = osFormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + lastErrno, + 0, + (LPSTR) &zTemp, + 0, + 0); + if( dwLen > 0 ){ + /* allocate a buffer and convert to UTF8 */ + sqlite3BeginBenignMalloc(); + zOut = winMbcsToUtf8(zTemp, osAreFileApisANSI()); + sqlite3EndBenignMalloc(); + /* free the system buffer allocated by FormatMessage */ + osLocalFree(zTemp); + } + } +#endif + if( 0 == dwLen ){ + sqlite3_snprintf(nBuf, zBuf, "OsError 0x%lx (%lu)", lastErrno, lastErrno); + }else{ + /* copy a maximum of nBuf chars to output buffer */ + sqlite3_snprintf(nBuf, zBuf, "%s", zOut); + /* free the UTF8 buffer */ + sqlite3_free(zOut); + } + return 0; +} + +/* +** +** This function - winLogErrorAtLine() - is only ever called via the macro +** winLogError(). +** +** This routine is invoked after an error occurs in an OS function. +** It logs a message using sqlite3_log() containing the current value of +** error code and, if possible, the human-readable equivalent from +** FormatMessage. +** +** The first argument passed to the macro should be the error code that +** will be returned to SQLite (e.g. SQLITE_IOERR_DELETE, SQLITE_CANTOPEN). +** The two subsequent arguments should be the name of the OS function that +** failed and the associated file-system path, if any. +*/ +#define winLogError(a,b,c,d) winLogErrorAtLine(a,b,c,d,__LINE__) +static int winLogErrorAtLine( + int errcode, /* SQLite error code */ + DWORD lastErrno, /* Win32 last error */ + const char *zFunc, /* Name of OS function that failed */ + const char *zPath, /* File path associated with error */ + int iLine /* Source line number where error occurred */ +){ + char zMsg[500]; /* Human readable error text */ + int i; /* Loop counter */ + + zMsg[0] = 0; + winGetLastErrorMsg(lastErrno, sizeof(zMsg), zMsg); + assert( errcode!=SQLITE_OK ); + if( zPath==0 ) zPath = ""; + for(i=0; zMsg[i] && zMsg[i]!='\r' && zMsg[i]!='\n'; i++){} + zMsg[i] = 0; + sqlite3_log(errcode, + "os_win.c:%d: (%lu) %s(%s) - %s", + iLine, lastErrno, zFunc, zPath, zMsg + ); + + return errcode; +} + +/* +** The number of times that a ReadFile(), WriteFile(), and DeleteFile() +** will be retried following a locking error - probably caused by +** antivirus software. Also the initial delay before the first retry. +** The delay increases linearly with each retry. +*/ +#ifndef SQLITE_WIN32_IOERR_RETRY +# define SQLITE_WIN32_IOERR_RETRY 10 +#endif +#ifndef SQLITE_WIN32_IOERR_RETRY_DELAY +# define SQLITE_WIN32_IOERR_RETRY_DELAY 25 +#endif +static int winIoerrRetry = SQLITE_WIN32_IOERR_RETRY; +static int winIoerrRetryDelay = SQLITE_WIN32_IOERR_RETRY_DELAY; + +/* +** The "winIoerrCanRetry1" macro is used to determine if a particular I/O +** error code obtained via GetLastError() is eligible to be retried. It +** must accept the error code DWORD as its only argument and should return +** non-zero if the error code is transient in nature and the operation +** responsible for generating the original error might succeed upon being +** retried. The argument to this macro should be a variable. +** +** Additionally, a macro named "winIoerrCanRetry2" may be defined. If it +** is defined, it will be consulted only when the macro "winIoerrCanRetry1" +** returns zero. The "winIoerrCanRetry2" macro is completely optional and +** may be used to include additional error codes in the set that should +** result in the failing I/O operation being retried by the caller. If +** defined, the "winIoerrCanRetry2" macro must exhibit external semantics +** identical to those of the "winIoerrCanRetry1" macro. +*/ +#if !defined(winIoerrCanRetry1) +#define winIoerrCanRetry1(a) (((a)==ERROR_ACCESS_DENIED) || \ + ((a)==ERROR_SHARING_VIOLATION) || \ + ((a)==ERROR_LOCK_VIOLATION) || \ + ((a)==ERROR_DEV_NOT_EXIST) || \ + ((a)==ERROR_NETNAME_DELETED) || \ + ((a)==ERROR_SEM_TIMEOUT) || \ + ((a)==ERROR_NETWORK_UNREACHABLE)) +#endif + +/* +** If a ReadFile() or WriteFile() error occurs, invoke this routine +** to see if it should be retried. Return TRUE to retry. Return FALSE +** to give up with an error. +*/ +static int winRetryIoerr(int *pnRetry, DWORD *pError){ + DWORD e = osGetLastError(); + if( *pnRetry>=winIoerrRetry ){ + if( pError ){ + *pError = e; + } + return 0; + } + if( winIoerrCanRetry1(e) ){ + sqlite3_win32_sleep(winIoerrRetryDelay*(1+*pnRetry)); + ++*pnRetry; + return 1; + } +#if defined(winIoerrCanRetry2) + else if( winIoerrCanRetry2(e) ){ + sqlite3_win32_sleep(winIoerrRetryDelay*(1+*pnRetry)); + ++*pnRetry; + return 1; + } +#endif + if( pError ){ + *pError = e; + } + return 0; +} + +/* +** Log a I/O error retry episode. +*/ +static void winLogIoerr(int nRetry, int lineno){ + if( nRetry ){ + sqlite3_log(SQLITE_NOTICE, + "delayed %dms for lock/sharing conflict at line %d", + winIoerrRetryDelay*nRetry*(nRetry+1)/2, lineno + ); + } +} + +/* +** This #if does not rely on the SQLITE_OS_WINCE define because the +** corresponding section in "date.c" cannot use it. +*/ +#if !defined(SQLITE_OMIT_LOCALTIME) && defined(_WIN32_WCE) && \ + (!defined(SQLITE_MSVC_LOCALTIME_API) || !SQLITE_MSVC_LOCALTIME_API) +/* +** The MSVC CRT on Windows CE may not have a localtime() function. +** So define a substitute. +*/ +/* # include */ +struct tm *__cdecl localtime(const time_t *t) +{ + static struct tm y; + FILETIME uTm, lTm; + SYSTEMTIME pTm; + sqlite3_int64 t64; + t64 = *t; + t64 = (t64 + 11644473600)*10000000; + uTm.dwLowDateTime = (DWORD)(t64 & 0xFFFFFFFF); + uTm.dwHighDateTime= (DWORD)(t64 >> 32); + osFileTimeToLocalFileTime(&uTm,&lTm); + osFileTimeToSystemTime(&lTm,&pTm); + y.tm_year = pTm.wYear - 1900; + y.tm_mon = pTm.wMonth - 1; + y.tm_wday = pTm.wDayOfWeek; + y.tm_mday = pTm.wDay; + y.tm_hour = pTm.wHour; + y.tm_min = pTm.wMinute; + y.tm_sec = pTm.wSecond; + return &y; +} +#endif + +#if SQLITE_OS_WINCE +/************************************************************************* +** This section contains code for WinCE only. +*/ +#define HANDLE_TO_WINFILE(a) (winFile*)&((char*)a)[-(int)offsetof(winFile,h)] + +/* +** Acquire a lock on the handle h +*/ +static void winceMutexAcquire(HANDLE h){ + DWORD dwErr; + do { + dwErr = osWaitForSingleObject(h, INFINITE); + } while (dwErr != WAIT_OBJECT_0 && dwErr != WAIT_ABANDONED); +} +/* +** Release a lock acquired by winceMutexAcquire() +*/ +#define winceMutexRelease(h) ReleaseMutex(h) + +/* +** Create the mutex and shared memory used for locking in the file +** descriptor pFile +*/ +static int winceCreateLock(const char *zFilename, winFile *pFile){ + LPWSTR zTok; + LPWSTR zName; + DWORD lastErrno; + BOOL bLogged = FALSE; + BOOL bInit = TRUE; + + zName = winUtf8ToUnicode(zFilename); + if( zName==0 ){ + /* out of memory */ + return SQLITE_IOERR_NOMEM_BKPT; + } + + /* Initialize the local lockdata */ + memset(&pFile->local, 0, sizeof(pFile->local)); + + /* Replace the backslashes from the filename and lowercase it + ** to derive a mutex name. */ + zTok = osCharLowerW(zName); + for (;*zTok;zTok++){ + if (*zTok == '\\') *zTok = '_'; + } + + /* Create/open the named mutex */ + pFile->hMutex = osCreateMutexW(NULL, FALSE, zName); + if (!pFile->hMutex){ + pFile->lastErrno = osGetLastError(); + sqlite3_free(zName); + return winLogError(SQLITE_IOERR, pFile->lastErrno, + "winceCreateLock1", zFilename); + } + + /* Acquire the mutex before continuing */ + winceMutexAcquire(pFile->hMutex); + + /* Since the names of named mutexes, semaphores, file mappings etc are + ** case-sensitive, take advantage of that by uppercasing the mutex name + ** and using that as the shared filemapping name. + */ + osCharUpperW(zName); + pFile->hShared = osCreateFileMappingW(INVALID_HANDLE_VALUE, NULL, + PAGE_READWRITE, 0, sizeof(winceLock), + zName); + + /* Set a flag that indicates we're the first to create the memory so it + ** must be zero-initialized */ + lastErrno = osGetLastError(); + if (lastErrno == ERROR_ALREADY_EXISTS){ + bInit = FALSE; + } + + sqlite3_free(zName); + + /* If we succeeded in making the shared memory handle, map it. */ + if( pFile->hShared ){ + pFile->shared = (winceLock*)osMapViewOfFile(pFile->hShared, + FILE_MAP_READ|FILE_MAP_WRITE, 0, 0, sizeof(winceLock)); + /* If mapping failed, close the shared memory handle and erase it */ + if( !pFile->shared ){ + pFile->lastErrno = osGetLastError(); + winLogError(SQLITE_IOERR, pFile->lastErrno, + "winceCreateLock2", zFilename); + bLogged = TRUE; + osCloseHandle(pFile->hShared); + pFile->hShared = NULL; + } + } + + /* If shared memory could not be created, then close the mutex and fail */ + if( pFile->hShared==NULL ){ + if( !bLogged ){ + pFile->lastErrno = lastErrno; + winLogError(SQLITE_IOERR, pFile->lastErrno, + "winceCreateLock3", zFilename); + bLogged = TRUE; + } + winceMutexRelease(pFile->hMutex); + osCloseHandle(pFile->hMutex); + pFile->hMutex = NULL; + return SQLITE_IOERR; + } + + /* Initialize the shared memory if we're supposed to */ + if( bInit ){ + memset(pFile->shared, 0, sizeof(winceLock)); + } + + winceMutexRelease(pFile->hMutex); + return SQLITE_OK; +} + +/* +** Destroy the part of winFile that deals with wince locks +*/ +static void winceDestroyLock(winFile *pFile){ + if (pFile->hMutex){ + /* Acquire the mutex */ + winceMutexAcquire(pFile->hMutex); + + /* The following blocks should probably assert in debug mode, but they + are to cleanup in case any locks remained open */ + if (pFile->local.nReaders){ + pFile->shared->nReaders --; + } + if (pFile->local.bReserved){ + pFile->shared->bReserved = FALSE; + } + if (pFile->local.bPending){ + pFile->shared->bPending = FALSE; + } + if (pFile->local.bExclusive){ + pFile->shared->bExclusive = FALSE; + } + + /* De-reference and close our copy of the shared memory handle */ + osUnmapViewOfFile(pFile->shared); + osCloseHandle(pFile->hShared); + + /* Done with the mutex */ + winceMutexRelease(pFile->hMutex); + osCloseHandle(pFile->hMutex); + pFile->hMutex = NULL; + } +} + +/* +** An implementation of the LockFile() API of Windows for CE +*/ +static BOOL winceLockFile( + LPHANDLE phFile, + DWORD dwFileOffsetLow, + DWORD dwFileOffsetHigh, + DWORD nNumberOfBytesToLockLow, + DWORD nNumberOfBytesToLockHigh +){ + winFile *pFile = HANDLE_TO_WINFILE(phFile); + BOOL bReturn = FALSE; + + UNUSED_PARAMETER(dwFileOffsetHigh); + UNUSED_PARAMETER(nNumberOfBytesToLockHigh); + + if (!pFile->hMutex) return TRUE; + winceMutexAcquire(pFile->hMutex); + + /* Wanting an exclusive lock? */ + if (dwFileOffsetLow == (DWORD)SHARED_FIRST + && nNumberOfBytesToLockLow == (DWORD)SHARED_SIZE){ + if (pFile->shared->nReaders == 0 && pFile->shared->bExclusive == 0){ + pFile->shared->bExclusive = TRUE; + pFile->local.bExclusive = TRUE; + bReturn = TRUE; + } + } + + /* Want a read-only lock? */ + else if (dwFileOffsetLow == (DWORD)SHARED_FIRST && + nNumberOfBytesToLockLow == 1){ + if (pFile->shared->bExclusive == 0){ + pFile->local.nReaders ++; + if (pFile->local.nReaders == 1){ + pFile->shared->nReaders ++; + } + bReturn = TRUE; + } + } + + /* Want a pending lock? */ + else if (dwFileOffsetLow == (DWORD)PENDING_BYTE + && nNumberOfBytesToLockLow == 1){ + /* If no pending lock has been acquired, then acquire it */ + if (pFile->shared->bPending == 0) { + pFile->shared->bPending = TRUE; + pFile->local.bPending = TRUE; + bReturn = TRUE; + } + } + + /* Want a reserved lock? */ + else if (dwFileOffsetLow == (DWORD)RESERVED_BYTE + && nNumberOfBytesToLockLow == 1){ + if (pFile->shared->bReserved == 0) { + pFile->shared->bReserved = TRUE; + pFile->local.bReserved = TRUE; + bReturn = TRUE; + } + } + + winceMutexRelease(pFile->hMutex); + return bReturn; +} + +/* +** An implementation of the UnlockFile API of Windows for CE +*/ +static BOOL winceUnlockFile( + LPHANDLE phFile, + DWORD dwFileOffsetLow, + DWORD dwFileOffsetHigh, + DWORD nNumberOfBytesToUnlockLow, + DWORD nNumberOfBytesToUnlockHigh +){ + winFile *pFile = HANDLE_TO_WINFILE(phFile); + BOOL bReturn = FALSE; + + UNUSED_PARAMETER(dwFileOffsetHigh); + UNUSED_PARAMETER(nNumberOfBytesToUnlockHigh); + + if (!pFile->hMutex) return TRUE; + winceMutexAcquire(pFile->hMutex); + + /* Releasing a reader lock or an exclusive lock */ + if (dwFileOffsetLow == (DWORD)SHARED_FIRST){ + /* Did we have an exclusive lock? */ + if (pFile->local.bExclusive){ + assert(nNumberOfBytesToUnlockLow == (DWORD)SHARED_SIZE); + pFile->local.bExclusive = FALSE; + pFile->shared->bExclusive = FALSE; + bReturn = TRUE; + } + + /* Did we just have a reader lock? */ + else if (pFile->local.nReaders){ + assert(nNumberOfBytesToUnlockLow == (DWORD)SHARED_SIZE + || nNumberOfBytesToUnlockLow == 1); + pFile->local.nReaders --; + if (pFile->local.nReaders == 0) + { + pFile->shared->nReaders --; + } + bReturn = TRUE; + } + } + + /* Releasing a pending lock */ + else if (dwFileOffsetLow == (DWORD)PENDING_BYTE + && nNumberOfBytesToUnlockLow == 1){ + if (pFile->local.bPending){ + pFile->local.bPending = FALSE; + pFile->shared->bPending = FALSE; + bReturn = TRUE; + } + } + /* Releasing a reserved lock */ + else if (dwFileOffsetLow == (DWORD)RESERVED_BYTE + && nNumberOfBytesToUnlockLow == 1){ + if (pFile->local.bReserved) { + pFile->local.bReserved = FALSE; + pFile->shared->bReserved = FALSE; + bReturn = TRUE; + } + } + + winceMutexRelease(pFile->hMutex); + return bReturn; +} +/* +** End of the special code for wince +*****************************************************************************/ +#endif /* SQLITE_OS_WINCE */ + +/* +** Lock a file region. +*/ +static BOOL winLockFile( + LPHANDLE phFile, + DWORD flags, + DWORD offsetLow, + DWORD offsetHigh, + DWORD numBytesLow, + DWORD numBytesHigh +){ +#if SQLITE_OS_WINCE + /* + ** NOTE: Windows CE is handled differently here due its lack of the Win32 + ** API LockFile. + */ + return winceLockFile(phFile, offsetLow, offsetHigh, + numBytesLow, numBytesHigh); +#else + if( osIsNT() ){ + OVERLAPPED ovlp; + memset(&ovlp, 0, sizeof(OVERLAPPED)); + ovlp.Offset = offsetLow; + ovlp.OffsetHigh = offsetHigh; + return osLockFileEx(*phFile, flags, 0, numBytesLow, numBytesHigh, &ovlp); + }else{ + return osLockFile(*phFile, offsetLow, offsetHigh, numBytesLow, + numBytesHigh); + } +#endif +} + +/* +** Unlock a file region. + */ +static BOOL winUnlockFile( + LPHANDLE phFile, + DWORD offsetLow, + DWORD offsetHigh, + DWORD numBytesLow, + DWORD numBytesHigh +){ +#if SQLITE_OS_WINCE + /* + ** NOTE: Windows CE is handled differently here due its lack of the Win32 + ** API UnlockFile. + */ + return winceUnlockFile(phFile, offsetLow, offsetHigh, + numBytesLow, numBytesHigh); +#else + if( osIsNT() ){ + OVERLAPPED ovlp; + memset(&ovlp, 0, sizeof(OVERLAPPED)); + ovlp.Offset = offsetLow; + ovlp.OffsetHigh = offsetHigh; + return osUnlockFileEx(*phFile, 0, numBytesLow, numBytesHigh, &ovlp); + }else{ + return osUnlockFile(*phFile, offsetLow, offsetHigh, numBytesLow, + numBytesHigh); + } +#endif +} + +/***************************************************************************** +** The next group of routines implement the I/O methods specified +** by the sqlite3_io_methods object. +******************************************************************************/ + +/* +** Some Microsoft compilers lack this definition. +*/ +#ifndef INVALID_SET_FILE_POINTER +# define INVALID_SET_FILE_POINTER ((DWORD)-1) +#endif + +/* +** Move the current position of the file handle passed as the first +** argument to offset iOffset within the file. If successful, return 0. +** Otherwise, set pFile->lastErrno and return non-zero. +*/ +static int winSeekFile(winFile *pFile, sqlite3_int64 iOffset){ +#if !SQLITE_OS_WINRT + LONG upperBits; /* Most sig. 32 bits of new offset */ + LONG lowerBits; /* Least sig. 32 bits of new offset */ + DWORD dwRet; /* Value returned by SetFilePointer() */ + DWORD lastErrno; /* Value returned by GetLastError() */ + + OSTRACE(("SEEK file=%p, offset=%lld\n", pFile->h, iOffset)); + + upperBits = (LONG)((iOffset>>32) & 0x7fffffff); + lowerBits = (LONG)(iOffset & 0xffffffff); + + /* API oddity: If successful, SetFilePointer() returns a dword + ** containing the lower 32-bits of the new file-offset. Or, if it fails, + ** it returns INVALID_SET_FILE_POINTER. However according to MSDN, + ** INVALID_SET_FILE_POINTER may also be a valid new offset. So to determine + ** whether an error has actually occurred, it is also necessary to call + ** GetLastError(). + */ + dwRet = osSetFilePointer(pFile->h, lowerBits, &upperBits, FILE_BEGIN); + + if( (dwRet==INVALID_SET_FILE_POINTER + && ((lastErrno = osGetLastError())!=NO_ERROR)) ){ + pFile->lastErrno = lastErrno; + winLogError(SQLITE_IOERR_SEEK, pFile->lastErrno, + "winSeekFile", pFile->zPath); + OSTRACE(("SEEK file=%p, rc=SQLITE_IOERR_SEEK\n", pFile->h)); + return 1; + } + + OSTRACE(("SEEK file=%p, rc=SQLITE_OK\n", pFile->h)); + return 0; +#else + /* + ** Same as above, except that this implementation works for WinRT. + */ + + LARGE_INTEGER x; /* The new offset */ + BOOL bRet; /* Value returned by SetFilePointerEx() */ + + x.QuadPart = iOffset; + bRet = osSetFilePointerEx(pFile->h, x, 0, FILE_BEGIN); + + if(!bRet){ + pFile->lastErrno = osGetLastError(); + winLogError(SQLITE_IOERR_SEEK, pFile->lastErrno, + "winSeekFile", pFile->zPath); + OSTRACE(("SEEK file=%p, rc=SQLITE_IOERR_SEEK\n", pFile->h)); + return 1; + } + + OSTRACE(("SEEK file=%p, rc=SQLITE_OK\n", pFile->h)); + return 0; +#endif +} + +#if SQLITE_MAX_MMAP_SIZE>0 +/* Forward references to VFS helper methods used for memory mapped files */ +static int winMapfile(winFile*, sqlite3_int64); +static int winUnmapfile(winFile*); +#endif + +/* +** Close a file. +** +** It is reported that an attempt to close a handle might sometimes +** fail. This is a very unreasonable result, but Windows is notorious +** for being unreasonable so I do not doubt that it might happen. If +** the close fails, we pause for 100 milliseconds and try again. As +** many as MX_CLOSE_ATTEMPT attempts to close the handle are made before +** giving up and returning an error. +*/ +#define MX_CLOSE_ATTEMPT 3 +static int winClose(sqlite3_file *id){ + int rc, cnt = 0; + winFile *pFile = (winFile*)id; + + assert( id!=0 ); +#ifndef SQLITE_OMIT_WAL + assert( pFile->pShm==0 ); +#endif + assert( pFile->h!=NULL && pFile->h!=INVALID_HANDLE_VALUE ); + OSTRACE(("CLOSE pid=%lu, pFile=%p, file=%p\n", + osGetCurrentProcessId(), pFile, pFile->h)); + +#if SQLITE_MAX_MMAP_SIZE>0 + winUnmapfile(pFile); +#endif + + do{ + rc = osCloseHandle(pFile->h); + /* SimulateIOError( rc=0; cnt=MX_CLOSE_ATTEMPT; ); */ + }while( rc==0 && ++cnt < MX_CLOSE_ATTEMPT && (sqlite3_win32_sleep(100), 1) ); +#if SQLITE_OS_WINCE +#define WINCE_DELETION_ATTEMPTS 3 + { + winVfsAppData *pAppData = (winVfsAppData*)pFile->pVfs->pAppData; + if( pAppData==NULL || !pAppData->bNoLock ){ + winceDestroyLock(pFile); + } + } + if( pFile->zDeleteOnClose ){ + int cnt = 0; + while( + osDeleteFileW(pFile->zDeleteOnClose)==0 + && osGetFileAttributesW(pFile->zDeleteOnClose)!=0xffffffff + && cnt++ < WINCE_DELETION_ATTEMPTS + ){ + sqlite3_win32_sleep(100); /* Wait a little before trying again */ + } + sqlite3_free(pFile->zDeleteOnClose); + } +#endif + if( rc ){ + pFile->h = NULL; + } + OpenCounter(-1); + OSTRACE(("CLOSE pid=%lu, pFile=%p, file=%p, rc=%s\n", + osGetCurrentProcessId(), pFile, pFile->h, rc ? "ok" : "failed")); + return rc ? SQLITE_OK + : winLogError(SQLITE_IOERR_CLOSE, osGetLastError(), + "winClose", pFile->zPath); +} + +/* +** Read data from a file into a buffer. Return SQLITE_OK if all +** bytes were read successfully and SQLITE_IOERR if anything goes +** wrong. +*/ +static int winRead( + sqlite3_file *id, /* File to read from */ + void *pBuf, /* Write content into this buffer */ + int amt, /* Number of bytes to read */ + sqlite3_int64 offset /* Begin reading at this offset */ +){ +#if !SQLITE_OS_WINCE && !defined(SQLITE_WIN32_NO_OVERLAPPED) + OVERLAPPED overlapped; /* The offset for ReadFile. */ +#endif + winFile *pFile = (winFile*)id; /* file handle */ + DWORD nRead; /* Number of bytes actually read from file */ + int nRetry = 0; /* Number of retrys */ + + assert( id!=0 ); + assert( amt>0 ); + assert( offset>=0 ); + SimulateIOError(return SQLITE_IOERR_READ); + OSTRACE(("READ pid=%lu, pFile=%p, file=%p, buffer=%p, amount=%d, " + "offset=%lld, lock=%d\n", osGetCurrentProcessId(), pFile, + pFile->h, pBuf, amt, offset, pFile->locktype)); + +#if SQLITE_MAX_MMAP_SIZE>0 + /* Deal with as much of this read request as possible by transfering + ** data from the memory mapping using memcpy(). */ + if( offsetmmapSize ){ + if( offset+amt <= pFile->mmapSize ){ + memcpy(pBuf, &((u8 *)(pFile->pMapRegion))[offset], amt); + OSTRACE(("READ-MMAP pid=%lu, pFile=%p, file=%p, rc=SQLITE_OK\n", + osGetCurrentProcessId(), pFile, pFile->h)); + return SQLITE_OK; + }else{ + int nCopy = (int)(pFile->mmapSize - offset); + memcpy(pBuf, &((u8 *)(pFile->pMapRegion))[offset], nCopy); + pBuf = &((u8 *)pBuf)[nCopy]; + amt -= nCopy; + offset += nCopy; + } + } +#endif + +#if SQLITE_OS_WINCE || defined(SQLITE_WIN32_NO_OVERLAPPED) + if( winSeekFile(pFile, offset) ){ + OSTRACE(("READ pid=%lu, pFile=%p, file=%p, rc=SQLITE_FULL\n", + osGetCurrentProcessId(), pFile, pFile->h)); + return SQLITE_FULL; + } + while( !osReadFile(pFile->h, pBuf, amt, &nRead, 0) ){ +#else + memset(&overlapped, 0, sizeof(OVERLAPPED)); + overlapped.Offset = (LONG)(offset & 0xffffffff); + overlapped.OffsetHigh = (LONG)((offset>>32) & 0x7fffffff); + while( !osReadFile(pFile->h, pBuf, amt, &nRead, &overlapped) && + osGetLastError()!=ERROR_HANDLE_EOF ){ +#endif + DWORD lastErrno; + if( winRetryIoerr(&nRetry, &lastErrno) ) continue; + pFile->lastErrno = lastErrno; + OSTRACE(("READ pid=%lu, pFile=%p, file=%p, rc=SQLITE_IOERR_READ\n", + osGetCurrentProcessId(), pFile, pFile->h)); + return winLogError(SQLITE_IOERR_READ, pFile->lastErrno, + "winRead", pFile->zPath); + } + winLogIoerr(nRetry, __LINE__); + if( nRead<(DWORD)amt ){ + /* Unread parts of the buffer must be zero-filled */ + memset(&((char*)pBuf)[nRead], 0, amt-nRead); + OSTRACE(("READ pid=%lu, pFile=%p, file=%p, rc=SQLITE_IOERR_SHORT_READ\n", + osGetCurrentProcessId(), pFile, pFile->h)); + return SQLITE_IOERR_SHORT_READ; + } + + OSTRACE(("READ pid=%lu, pFile=%p, file=%p, rc=SQLITE_OK\n", + osGetCurrentProcessId(), pFile, pFile->h)); + return SQLITE_OK; +} + +/* +** Write data from a buffer into a file. Return SQLITE_OK on success +** or some other error code on failure. +*/ +static int winWrite( + sqlite3_file *id, /* File to write into */ + const void *pBuf, /* The bytes to be written */ + int amt, /* Number of bytes to write */ + sqlite3_int64 offset /* Offset into the file to begin writing at */ +){ + int rc = 0; /* True if error has occurred, else false */ + winFile *pFile = (winFile*)id; /* File handle */ + int nRetry = 0; /* Number of retries */ + + assert( amt>0 ); + assert( pFile ); + SimulateIOError(return SQLITE_IOERR_WRITE); + SimulateDiskfullError(return SQLITE_FULL); + + OSTRACE(("WRITE pid=%lu, pFile=%p, file=%p, buffer=%p, amount=%d, " + "offset=%lld, lock=%d\n", osGetCurrentProcessId(), pFile, + pFile->h, pBuf, amt, offset, pFile->locktype)); + +#if defined(SQLITE_MMAP_READWRITE) && SQLITE_MAX_MMAP_SIZE>0 + /* Deal with as much of this write request as possible by transfering + ** data from the memory mapping using memcpy(). */ + if( offsetmmapSize ){ + if( offset+amt <= pFile->mmapSize ){ + memcpy(&((u8 *)(pFile->pMapRegion))[offset], pBuf, amt); + OSTRACE(("WRITE-MMAP pid=%lu, pFile=%p, file=%p, rc=SQLITE_OK\n", + osGetCurrentProcessId(), pFile, pFile->h)); + return SQLITE_OK; + }else{ + int nCopy = (int)(pFile->mmapSize - offset); + memcpy(&((u8 *)(pFile->pMapRegion))[offset], pBuf, nCopy); + pBuf = &((u8 *)pBuf)[nCopy]; + amt -= nCopy; + offset += nCopy; + } + } +#endif + +#if SQLITE_OS_WINCE || defined(SQLITE_WIN32_NO_OVERLAPPED) + rc = winSeekFile(pFile, offset); + if( rc==0 ){ +#else + { +#endif +#if !SQLITE_OS_WINCE && !defined(SQLITE_WIN32_NO_OVERLAPPED) + OVERLAPPED overlapped; /* The offset for WriteFile. */ +#endif + u8 *aRem = (u8 *)pBuf; /* Data yet to be written */ + int nRem = amt; /* Number of bytes yet to be written */ + DWORD nWrite; /* Bytes written by each WriteFile() call */ + DWORD lastErrno = NO_ERROR; /* Value returned by GetLastError() */ + +#if !SQLITE_OS_WINCE && !defined(SQLITE_WIN32_NO_OVERLAPPED) + memset(&overlapped, 0, sizeof(OVERLAPPED)); + overlapped.Offset = (LONG)(offset & 0xffffffff); + overlapped.OffsetHigh = (LONG)((offset>>32) & 0x7fffffff); +#endif + + while( nRem>0 ){ +#if SQLITE_OS_WINCE || defined(SQLITE_WIN32_NO_OVERLAPPED) + if( !osWriteFile(pFile->h, aRem, nRem, &nWrite, 0) ){ +#else + if( !osWriteFile(pFile->h, aRem, nRem, &nWrite, &overlapped) ){ +#endif + if( winRetryIoerr(&nRetry, &lastErrno) ) continue; + break; + } + assert( nWrite==0 || nWrite<=(DWORD)nRem ); + if( nWrite==0 || nWrite>(DWORD)nRem ){ + lastErrno = osGetLastError(); + break; + } +#if !SQLITE_OS_WINCE && !defined(SQLITE_WIN32_NO_OVERLAPPED) + offset += nWrite; + overlapped.Offset = (LONG)(offset & 0xffffffff); + overlapped.OffsetHigh = (LONG)((offset>>32) & 0x7fffffff); +#endif + aRem += nWrite; + nRem -= nWrite; + } + if( nRem>0 ){ + pFile->lastErrno = lastErrno; + rc = 1; + } + } + + if( rc ){ + if( ( pFile->lastErrno==ERROR_HANDLE_DISK_FULL ) + || ( pFile->lastErrno==ERROR_DISK_FULL )){ + OSTRACE(("WRITE pid=%lu, pFile=%p, file=%p, rc=SQLITE_FULL\n", + osGetCurrentProcessId(), pFile, pFile->h)); + return winLogError(SQLITE_FULL, pFile->lastErrno, + "winWrite1", pFile->zPath); + } + OSTRACE(("WRITE pid=%lu, pFile=%p, file=%p, rc=SQLITE_IOERR_WRITE\n", + osGetCurrentProcessId(), pFile, pFile->h)); + return winLogError(SQLITE_IOERR_WRITE, pFile->lastErrno, + "winWrite2", pFile->zPath); + }else{ + winLogIoerr(nRetry, __LINE__); + } + OSTRACE(("WRITE pid=%lu, pFile=%p, file=%p, rc=SQLITE_OK\n", + osGetCurrentProcessId(), pFile, pFile->h)); + return SQLITE_OK; +} + +/* +** Truncate an open file to a specified size +*/ +static int winTruncate(sqlite3_file *id, sqlite3_int64 nByte){ + winFile *pFile = (winFile*)id; /* File handle object */ + int rc = SQLITE_OK; /* Return code for this function */ + DWORD lastErrno; + + assert( pFile ); + SimulateIOError(return SQLITE_IOERR_TRUNCATE); + OSTRACE(("TRUNCATE pid=%lu, pFile=%p, file=%p, size=%lld, lock=%d\n", + osGetCurrentProcessId(), pFile, pFile->h, nByte, pFile->locktype)); + + /* If the user has configured a chunk-size for this file, truncate the + ** file so that it consists of an integer number of chunks (i.e. the + ** actual file size after the operation may be larger than the requested + ** size). + */ + if( pFile->szChunk>0 ){ + nByte = ((nByte + pFile->szChunk - 1)/pFile->szChunk) * pFile->szChunk; + } + + /* SetEndOfFile() returns non-zero when successful, or zero when it fails. */ + if( winSeekFile(pFile, nByte) ){ + rc = winLogError(SQLITE_IOERR_TRUNCATE, pFile->lastErrno, + "winTruncate1", pFile->zPath); + }else if( 0==osSetEndOfFile(pFile->h) && + ((lastErrno = osGetLastError())!=ERROR_USER_MAPPED_FILE) ){ + pFile->lastErrno = lastErrno; + rc = winLogError(SQLITE_IOERR_TRUNCATE, pFile->lastErrno, + "winTruncate2", pFile->zPath); + } + +#if SQLITE_MAX_MMAP_SIZE>0 + /* If the file was truncated to a size smaller than the currently + ** mapped region, reduce the effective mapping size as well. SQLite will + ** use read() and write() to access data beyond this point from now on. + */ + if( pFile->pMapRegion && nBytemmapSize ){ + pFile->mmapSize = nByte; + } +#endif + + OSTRACE(("TRUNCATE pid=%lu, pFile=%p, file=%p, rc=%s\n", + osGetCurrentProcessId(), pFile, pFile->h, sqlite3ErrName(rc))); + return rc; +} + +#ifdef SQLITE_TEST +/* +** Count the number of fullsyncs and normal syncs. This is used to test +** that syncs and fullsyncs are occuring at the right times. +*/ +SQLITE_API int sqlite3_sync_count = 0; +SQLITE_API int sqlite3_fullsync_count = 0; +#endif + +/* +** Make sure all writes to a particular file are committed to disk. +*/ +static int winSync(sqlite3_file *id, int flags){ +#ifndef SQLITE_NO_SYNC + /* + ** Used only when SQLITE_NO_SYNC is not defined. + */ + BOOL rc; +#endif +#if !defined(NDEBUG) || !defined(SQLITE_NO_SYNC) || \ + defined(SQLITE_HAVE_OS_TRACE) + /* + ** Used when SQLITE_NO_SYNC is not defined and by the assert() and/or + ** OSTRACE() macros. + */ + winFile *pFile = (winFile*)id; +#else + UNUSED_PARAMETER(id); +#endif + + assert( pFile ); + /* Check that one of SQLITE_SYNC_NORMAL or FULL was passed */ + assert((flags&0x0F)==SQLITE_SYNC_NORMAL + || (flags&0x0F)==SQLITE_SYNC_FULL + ); + + /* Unix cannot, but some systems may return SQLITE_FULL from here. This + ** line is to test that doing so does not cause any problems. + */ + SimulateDiskfullError( return SQLITE_FULL ); + + OSTRACE(("SYNC pid=%lu, pFile=%p, file=%p, flags=%x, lock=%d\n", + osGetCurrentProcessId(), pFile, pFile->h, flags, + pFile->locktype)); + +#ifndef SQLITE_TEST + UNUSED_PARAMETER(flags); +#else + if( (flags&0x0F)==SQLITE_SYNC_FULL ){ + sqlite3_fullsync_count++; + } + sqlite3_sync_count++; +#endif + + /* If we compiled with the SQLITE_NO_SYNC flag, then syncing is a + ** no-op + */ +#ifdef SQLITE_NO_SYNC + OSTRACE(("SYNC-NOP pid=%lu, pFile=%p, file=%p, rc=SQLITE_OK\n", + osGetCurrentProcessId(), pFile, pFile->h)); + return SQLITE_OK; +#else +#if SQLITE_MAX_MMAP_SIZE>0 + if( pFile->pMapRegion ){ + if( osFlushViewOfFile(pFile->pMapRegion, 0) ){ + OSTRACE(("SYNC-MMAP pid=%lu, pFile=%p, pMapRegion=%p, " + "rc=SQLITE_OK\n", osGetCurrentProcessId(), + pFile, pFile->pMapRegion)); + }else{ + pFile->lastErrno = osGetLastError(); + OSTRACE(("SYNC-MMAP pid=%lu, pFile=%p, pMapRegion=%p, " + "rc=SQLITE_IOERR_MMAP\n", osGetCurrentProcessId(), + pFile, pFile->pMapRegion)); + return winLogError(SQLITE_IOERR_MMAP, pFile->lastErrno, + "winSync1", pFile->zPath); + } + } +#endif + rc = osFlushFileBuffers(pFile->h); + SimulateIOError( rc=FALSE ); + if( rc ){ + OSTRACE(("SYNC pid=%lu, pFile=%p, file=%p, rc=SQLITE_OK\n", + osGetCurrentProcessId(), pFile, pFile->h)); + return SQLITE_OK; + }else{ + pFile->lastErrno = osGetLastError(); + OSTRACE(("SYNC pid=%lu, pFile=%p, file=%p, rc=SQLITE_IOERR_FSYNC\n", + osGetCurrentProcessId(), pFile, pFile->h)); + return winLogError(SQLITE_IOERR_FSYNC, pFile->lastErrno, + "winSync2", pFile->zPath); + } +#endif +} + +/* +** Determine the current size of a file in bytes +*/ +static int winFileSize(sqlite3_file *id, sqlite3_int64 *pSize){ + winFile *pFile = (winFile*)id; + int rc = SQLITE_OK; + + assert( id!=0 ); + assert( pSize!=0 ); + SimulateIOError(return SQLITE_IOERR_FSTAT); + OSTRACE(("SIZE file=%p, pSize=%p\n", pFile->h, pSize)); + +#if SQLITE_OS_WINRT + { + FILE_STANDARD_INFO info; + if( osGetFileInformationByHandleEx(pFile->h, FileStandardInfo, + &info, sizeof(info)) ){ + *pSize = info.EndOfFile.QuadPart; + }else{ + pFile->lastErrno = osGetLastError(); + rc = winLogError(SQLITE_IOERR_FSTAT, pFile->lastErrno, + "winFileSize", pFile->zPath); + } + } +#else + { + DWORD upperBits; + DWORD lowerBits; + DWORD lastErrno; + + lowerBits = osGetFileSize(pFile->h, &upperBits); + *pSize = (((sqlite3_int64)upperBits)<<32) + lowerBits; + if( (lowerBits == INVALID_FILE_SIZE) + && ((lastErrno = osGetLastError())!=NO_ERROR) ){ + pFile->lastErrno = lastErrno; + rc = winLogError(SQLITE_IOERR_FSTAT, pFile->lastErrno, + "winFileSize", pFile->zPath); + } + } +#endif + OSTRACE(("SIZE file=%p, pSize=%p, *pSize=%lld, rc=%s\n", + pFile->h, pSize, *pSize, sqlite3ErrName(rc))); + return rc; +} + +/* +** LOCKFILE_FAIL_IMMEDIATELY is undefined on some Windows systems. +*/ +#ifndef LOCKFILE_FAIL_IMMEDIATELY +# define LOCKFILE_FAIL_IMMEDIATELY 1 +#endif + +#ifndef LOCKFILE_EXCLUSIVE_LOCK +# define LOCKFILE_EXCLUSIVE_LOCK 2 +#endif + +/* +** Historically, SQLite has used both the LockFile and LockFileEx functions. +** When the LockFile function was used, it was always expected to fail +** immediately if the lock could not be obtained. Also, it always expected to +** obtain an exclusive lock. These flags are used with the LockFileEx function +** and reflect those expectations; therefore, they should not be changed. +*/ +#ifndef SQLITE_LOCKFILE_FLAGS +# define SQLITE_LOCKFILE_FLAGS (LOCKFILE_FAIL_IMMEDIATELY | \ + LOCKFILE_EXCLUSIVE_LOCK) +#endif + +/* +** Currently, SQLite never calls the LockFileEx function without wanting the +** call to fail immediately if the lock cannot be obtained. +*/ +#ifndef SQLITE_LOCKFILEEX_FLAGS +# define SQLITE_LOCKFILEEX_FLAGS (LOCKFILE_FAIL_IMMEDIATELY) +#endif + +/* +** Acquire a reader lock. +** Different API routines are called depending on whether or not this +** is Win9x or WinNT. +*/ +static int winGetReadLock(winFile *pFile){ + int res; + OSTRACE(("READ-LOCK file=%p, lock=%d\n", pFile->h, pFile->locktype)); + if( osIsNT() ){ +#if SQLITE_OS_WINCE + /* + ** NOTE: Windows CE is handled differently here due its lack of the Win32 + ** API LockFileEx. + */ + res = winceLockFile(&pFile->h, SHARED_FIRST, 0, 1, 0); +#else + res = winLockFile(&pFile->h, SQLITE_LOCKFILEEX_FLAGS, SHARED_FIRST, 0, + SHARED_SIZE, 0); +#endif + } +#ifdef SQLITE_WIN32_HAS_ANSI + else{ + int lk; + sqlite3_randomness(sizeof(lk), &lk); + pFile->sharedLockByte = (short)((lk & 0x7fffffff)%(SHARED_SIZE - 1)); + res = winLockFile(&pFile->h, SQLITE_LOCKFILE_FLAGS, + SHARED_FIRST+pFile->sharedLockByte, 0, 1, 0); + } +#endif + if( res == 0 ){ + pFile->lastErrno = osGetLastError(); + /* No need to log a failure to lock */ + } + OSTRACE(("READ-LOCK file=%p, result=%d\n", pFile->h, res)); + return res; +} + +/* +** Undo a readlock +*/ +static int winUnlockReadLock(winFile *pFile){ + int res; + DWORD lastErrno; + OSTRACE(("READ-UNLOCK file=%p, lock=%d\n", pFile->h, pFile->locktype)); + if( osIsNT() ){ + res = winUnlockFile(&pFile->h, SHARED_FIRST, 0, SHARED_SIZE, 0); + } +#ifdef SQLITE_WIN32_HAS_ANSI + else{ + res = winUnlockFile(&pFile->h, SHARED_FIRST+pFile->sharedLockByte, 0, 1, 0); + } +#endif + if( res==0 && ((lastErrno = osGetLastError())!=ERROR_NOT_LOCKED) ){ + pFile->lastErrno = lastErrno; + winLogError(SQLITE_IOERR_UNLOCK, pFile->lastErrno, + "winUnlockReadLock", pFile->zPath); + } + OSTRACE(("READ-UNLOCK file=%p, result=%d\n", pFile->h, res)); + return res; +} + +/* +** Lock the file with the lock specified by parameter locktype - one +** of the following: +** +** (1) SHARED_LOCK +** (2) RESERVED_LOCK +** (3) PENDING_LOCK +** (4) EXCLUSIVE_LOCK +** +** Sometimes when requesting one lock state, additional lock states +** are inserted in between. The locking might fail on one of the later +** transitions leaving the lock state different from what it started but +** still short of its goal. The following chart shows the allowed +** transitions and the inserted intermediate states: +** +** UNLOCKED -> SHARED +** SHARED -> RESERVED +** SHARED -> (PENDING) -> EXCLUSIVE +** RESERVED -> (PENDING) -> EXCLUSIVE +** PENDING -> EXCLUSIVE +** +** This routine will only increase a lock. The winUnlock() routine +** erases all locks at once and returns us immediately to locking level 0. +** It is not possible to lower the locking level one step at a time. You +** must go straight to locking level 0. +*/ +static int winLock(sqlite3_file *id, int locktype){ + int rc = SQLITE_OK; /* Return code from subroutines */ + int res = 1; /* Result of a Windows lock call */ + int newLocktype; /* Set pFile->locktype to this value before exiting */ + int gotPendingLock = 0;/* True if we acquired a PENDING lock this time */ + winFile *pFile = (winFile*)id; + DWORD lastErrno = NO_ERROR; + + assert( id!=0 ); + OSTRACE(("LOCK file=%p, oldLock=%d(%d), newLock=%d\n", + pFile->h, pFile->locktype, pFile->sharedLockByte, locktype)); + + /* If there is already a lock of this type or more restrictive on the + ** OsFile, do nothing. Don't use the end_lock: exit path, as + ** sqlite3OsEnterMutex() hasn't been called yet. + */ + if( pFile->locktype>=locktype ){ + OSTRACE(("LOCK-HELD file=%p, rc=SQLITE_OK\n", pFile->h)); + return SQLITE_OK; + } + + /* Do not allow any kind of write-lock on a read-only database + */ + if( (pFile->ctrlFlags & WINFILE_RDONLY)!=0 && locktype>=RESERVED_LOCK ){ + return SQLITE_IOERR_LOCK; + } + + /* Make sure the locking sequence is correct + */ + assert( pFile->locktype!=NO_LOCK || locktype==SHARED_LOCK ); + assert( locktype!=PENDING_LOCK ); + assert( locktype!=RESERVED_LOCK || pFile->locktype==SHARED_LOCK ); + + /* Lock the PENDING_LOCK byte if we need to acquire a PENDING lock or + ** a SHARED lock. If we are acquiring a SHARED lock, the acquisition of + ** the PENDING_LOCK byte is temporary. + */ + newLocktype = pFile->locktype; + if( pFile->locktype==NO_LOCK + || (locktype==EXCLUSIVE_LOCK && pFile->locktype<=RESERVED_LOCK) + ){ + int cnt = 3; + while( cnt-->0 && (res = winLockFile(&pFile->h, SQLITE_LOCKFILE_FLAGS, + PENDING_BYTE, 0, 1, 0))==0 ){ + /* Try 3 times to get the pending lock. This is needed to work + ** around problems caused by indexing and/or anti-virus software on + ** Windows systems. + ** If you are using this code as a model for alternative VFSes, do not + ** copy this retry logic. It is a hack intended for Windows only. + */ + lastErrno = osGetLastError(); + OSTRACE(("LOCK-PENDING-FAIL file=%p, count=%d, result=%d\n", + pFile->h, cnt, res)); + if( lastErrno==ERROR_INVALID_HANDLE ){ + pFile->lastErrno = lastErrno; + rc = SQLITE_IOERR_LOCK; + OSTRACE(("LOCK-FAIL file=%p, count=%d, rc=%s\n", + pFile->h, cnt, sqlite3ErrName(rc))); + return rc; + } + if( cnt ) sqlite3_win32_sleep(1); + } + gotPendingLock = res; + if( !res ){ + lastErrno = osGetLastError(); + } + } + + /* Acquire a shared lock + */ + if( locktype==SHARED_LOCK && res ){ + assert( pFile->locktype==NO_LOCK ); + res = winGetReadLock(pFile); + if( res ){ + newLocktype = SHARED_LOCK; + }else{ + lastErrno = osGetLastError(); + } + } + + /* Acquire a RESERVED lock + */ + if( locktype==RESERVED_LOCK && res ){ + assert( pFile->locktype==SHARED_LOCK ); + res = winLockFile(&pFile->h, SQLITE_LOCKFILE_FLAGS, RESERVED_BYTE, 0, 1, 0); + if( res ){ + newLocktype = RESERVED_LOCK; + }else{ + lastErrno = osGetLastError(); + } + } + + /* Acquire a PENDING lock + */ + if( locktype==EXCLUSIVE_LOCK && res ){ + newLocktype = PENDING_LOCK; + gotPendingLock = 0; + } + + /* Acquire an EXCLUSIVE lock + */ + if( locktype==EXCLUSIVE_LOCK && res ){ + assert( pFile->locktype>=SHARED_LOCK ); + res = winUnlockReadLock(pFile); + res = winLockFile(&pFile->h, SQLITE_LOCKFILE_FLAGS, SHARED_FIRST, 0, + SHARED_SIZE, 0); + if( res ){ + newLocktype = EXCLUSIVE_LOCK; + }else{ + lastErrno = osGetLastError(); + winGetReadLock(pFile); + } + } + + /* If we are holding a PENDING lock that ought to be released, then + ** release it now. + */ + if( gotPendingLock && locktype==SHARED_LOCK ){ + winUnlockFile(&pFile->h, PENDING_BYTE, 0, 1, 0); + } + + /* Update the state of the lock has held in the file descriptor then + ** return the appropriate result code. + */ + if( res ){ + rc = SQLITE_OK; + }else{ + pFile->lastErrno = lastErrno; + rc = SQLITE_BUSY; + OSTRACE(("LOCK-FAIL file=%p, wanted=%d, got=%d\n", + pFile->h, locktype, newLocktype)); + } + pFile->locktype = (u8)newLocktype; + OSTRACE(("LOCK file=%p, lock=%d, rc=%s\n", + pFile->h, pFile->locktype, sqlite3ErrName(rc))); + return rc; +} + +/* +** This routine checks if there is a RESERVED lock held on the specified +** file by this or any other process. If such a lock is held, return +** non-zero, otherwise zero. +*/ +static int winCheckReservedLock(sqlite3_file *id, int *pResOut){ + int res; + winFile *pFile = (winFile*)id; + + SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; ); + OSTRACE(("TEST-WR-LOCK file=%p, pResOut=%p\n", pFile->h, pResOut)); + + assert( id!=0 ); + if( pFile->locktype>=RESERVED_LOCK ){ + res = 1; + OSTRACE(("TEST-WR-LOCK file=%p, result=%d (local)\n", pFile->h, res)); + }else{ + res = winLockFile(&pFile->h, SQLITE_LOCKFILEEX_FLAGS,RESERVED_BYTE,0,1,0); + if( res ){ + winUnlockFile(&pFile->h, RESERVED_BYTE, 0, 1, 0); + } + res = !res; + OSTRACE(("TEST-WR-LOCK file=%p, result=%d (remote)\n", pFile->h, res)); + } + *pResOut = res; + OSTRACE(("TEST-WR-LOCK file=%p, pResOut=%p, *pResOut=%d, rc=SQLITE_OK\n", + pFile->h, pResOut, *pResOut)); + return SQLITE_OK; +} + +/* +** Lower the locking level on file descriptor id to locktype. locktype +** must be either NO_LOCK or SHARED_LOCK. +** +** If the locking level of the file descriptor is already at or below +** the requested locking level, this routine is a no-op. +** +** It is not possible for this routine to fail if the second argument +** is NO_LOCK. If the second argument is SHARED_LOCK then this routine +** might return SQLITE_IOERR; +*/ +static int winUnlock(sqlite3_file *id, int locktype){ + int type; + winFile *pFile = (winFile*)id; + int rc = SQLITE_OK; + assert( pFile!=0 ); + assert( locktype<=SHARED_LOCK ); + OSTRACE(("UNLOCK file=%p, oldLock=%d(%d), newLock=%d\n", + pFile->h, pFile->locktype, pFile->sharedLockByte, locktype)); + type = pFile->locktype; + if( type>=EXCLUSIVE_LOCK ){ + winUnlockFile(&pFile->h, SHARED_FIRST, 0, SHARED_SIZE, 0); + if( locktype==SHARED_LOCK && !winGetReadLock(pFile) ){ + /* This should never happen. We should always be able to + ** reacquire the read lock */ + rc = winLogError(SQLITE_IOERR_UNLOCK, osGetLastError(), + "winUnlock", pFile->zPath); + } + } + if( type>=RESERVED_LOCK ){ + winUnlockFile(&pFile->h, RESERVED_BYTE, 0, 1, 0); + } + if( locktype==NO_LOCK && type>=SHARED_LOCK ){ + winUnlockReadLock(pFile); + } + if( type>=PENDING_LOCK ){ + winUnlockFile(&pFile->h, PENDING_BYTE, 0, 1, 0); + } + pFile->locktype = (u8)locktype; + OSTRACE(("UNLOCK file=%p, lock=%d, rc=%s\n", + pFile->h, pFile->locktype, sqlite3ErrName(rc))); + return rc; +} + +/****************************************************************************** +****************************** No-op Locking ********************************** +** +** Of the various locking implementations available, this is by far the +** simplest: locking is ignored. No attempt is made to lock the database +** file for reading or writing. +** +** This locking mode is appropriate for use on read-only databases +** (ex: databases that are burned into CD-ROM, for example.) It can +** also be used if the application employs some external mechanism to +** prevent simultaneous access of the same database by two or more +** database connections. But there is a serious risk of database +** corruption if this locking mode is used in situations where multiple +** database connections are accessing the same database file at the same +** time and one or more of those connections are writing. +*/ + +static int winNolockLock(sqlite3_file *id, int locktype){ + UNUSED_PARAMETER(id); + UNUSED_PARAMETER(locktype); + return SQLITE_OK; +} + +static int winNolockCheckReservedLock(sqlite3_file *id, int *pResOut){ + UNUSED_PARAMETER(id); + UNUSED_PARAMETER(pResOut); + return SQLITE_OK; +} + +static int winNolockUnlock(sqlite3_file *id, int locktype){ + UNUSED_PARAMETER(id); + UNUSED_PARAMETER(locktype); + return SQLITE_OK; +} + +/******************* End of the no-op lock implementation ********************* +******************************************************************************/ + +/* +** If *pArg is initially negative then this is a query. Set *pArg to +** 1 or 0 depending on whether or not bit mask of pFile->ctrlFlags is set. +** +** If *pArg is 0 or 1, then clear or set the mask bit of pFile->ctrlFlags. +*/ +static void winModeBit(winFile *pFile, unsigned char mask, int *pArg){ + if( *pArg<0 ){ + *pArg = (pFile->ctrlFlags & mask)!=0; + }else if( (*pArg)==0 ){ + pFile->ctrlFlags &= ~mask; + }else{ + pFile->ctrlFlags |= mask; + } +} + +/* Forward references to VFS helper methods used for temporary files */ +static int winGetTempname(sqlite3_vfs *, char **); +static int winIsDir(const void *); +static BOOL winIsDriveLetterAndColon(const char *); + +/* +** Control and query of the open file handle. +*/ +static int winFileControl(sqlite3_file *id, int op, void *pArg){ + winFile *pFile = (winFile*)id; + OSTRACE(("FCNTL file=%p, op=%d, pArg=%p\n", pFile->h, op, pArg)); + switch( op ){ + case SQLITE_FCNTL_LOCKSTATE: { + *(int*)pArg = pFile->locktype; + OSTRACE(("FCNTL file=%p, rc=SQLITE_OK\n", pFile->h)); + return SQLITE_OK; + } + case SQLITE_FCNTL_LAST_ERRNO: { + *(int*)pArg = (int)pFile->lastErrno; + OSTRACE(("FCNTL file=%p, rc=SQLITE_OK\n", pFile->h)); + return SQLITE_OK; + } + case SQLITE_FCNTL_CHUNK_SIZE: { + pFile->szChunk = *(int *)pArg; + OSTRACE(("FCNTL file=%p, rc=SQLITE_OK\n", pFile->h)); + return SQLITE_OK; + } + case SQLITE_FCNTL_SIZE_HINT: { + if( pFile->szChunk>0 ){ + sqlite3_int64 oldSz; + int rc = winFileSize(id, &oldSz); + if( rc==SQLITE_OK ){ + sqlite3_int64 newSz = *(sqlite3_int64*)pArg; + if( newSz>oldSz ){ + SimulateIOErrorBenign(1); + rc = winTruncate(id, newSz); + SimulateIOErrorBenign(0); + } + } + OSTRACE(("FCNTL file=%p, rc=%s\n", pFile->h, sqlite3ErrName(rc))); + return rc; + } + OSTRACE(("FCNTL file=%p, rc=SQLITE_OK\n", pFile->h)); + return SQLITE_OK; + } + case SQLITE_FCNTL_PERSIST_WAL: { + winModeBit(pFile, WINFILE_PERSIST_WAL, (int*)pArg); + OSTRACE(("FCNTL file=%p, rc=SQLITE_OK\n", pFile->h)); + return SQLITE_OK; + } + case SQLITE_FCNTL_POWERSAFE_OVERWRITE: { + winModeBit(pFile, WINFILE_PSOW, (int*)pArg); + OSTRACE(("FCNTL file=%p, rc=SQLITE_OK\n", pFile->h)); + return SQLITE_OK; + } + case SQLITE_FCNTL_VFSNAME: { + *(char**)pArg = sqlite3_mprintf("%s", pFile->pVfs->zName); + OSTRACE(("FCNTL file=%p, rc=SQLITE_OK\n", pFile->h)); + return SQLITE_OK; + } + case SQLITE_FCNTL_WIN32_AV_RETRY: { + int *a = (int*)pArg; + if( a[0]>0 ){ + winIoerrRetry = a[0]; + }else{ + a[0] = winIoerrRetry; + } + if( a[1]>0 ){ + winIoerrRetryDelay = a[1]; + }else{ + a[1] = winIoerrRetryDelay; + } + OSTRACE(("FCNTL file=%p, rc=SQLITE_OK\n", pFile->h)); + return SQLITE_OK; + } + case SQLITE_FCNTL_WIN32_GET_HANDLE: { + LPHANDLE phFile = (LPHANDLE)pArg; + *phFile = pFile->h; + OSTRACE(("FCNTL file=%p, rc=SQLITE_OK\n", pFile->h)); + return SQLITE_OK; + } +#ifdef SQLITE_TEST + case SQLITE_FCNTL_WIN32_SET_HANDLE: { + LPHANDLE phFile = (LPHANDLE)pArg; + HANDLE hOldFile = pFile->h; + pFile->h = *phFile; + *phFile = hOldFile; + OSTRACE(("FCNTL oldFile=%p, newFile=%p, rc=SQLITE_OK\n", + hOldFile, pFile->h)); + return SQLITE_OK; + } +#endif + case SQLITE_FCNTL_TEMPFILENAME: { + char *zTFile = 0; + int rc = winGetTempname(pFile->pVfs, &zTFile); + if( rc==SQLITE_OK ){ + *(char**)pArg = zTFile; + } + OSTRACE(("FCNTL file=%p, rc=%s\n", pFile->h, sqlite3ErrName(rc))); + return rc; + } +#if SQLITE_MAX_MMAP_SIZE>0 + case SQLITE_FCNTL_MMAP_SIZE: { + i64 newLimit = *(i64*)pArg; + int rc = SQLITE_OK; + if( newLimit>sqlite3GlobalConfig.mxMmap ){ + newLimit = sqlite3GlobalConfig.mxMmap; + } + *(i64*)pArg = pFile->mmapSizeMax; + if( newLimit>=0 && newLimit!=pFile->mmapSizeMax && pFile->nFetchOut==0 ){ + pFile->mmapSizeMax = newLimit; + if( pFile->mmapSize>0 ){ + winUnmapfile(pFile); + rc = winMapfile(pFile, -1); + } + } + OSTRACE(("FCNTL file=%p, rc=%s\n", pFile->h, sqlite3ErrName(rc))); + return rc; + } +#endif + } + OSTRACE(("FCNTL file=%p, rc=SQLITE_NOTFOUND\n", pFile->h)); + return SQLITE_NOTFOUND; +} + +/* +** Return the sector size in bytes of the underlying block device for +** the specified file. This is almost always 512 bytes, but may be +** larger for some devices. +** +** SQLite code assumes this function cannot fail. It also assumes that +** if two files are created in the same file-system directory (i.e. +** a database and its journal file) that the sector size will be the +** same for both. +*/ +static int winSectorSize(sqlite3_file *id){ + (void)id; + return SQLITE_DEFAULT_SECTOR_SIZE; +} + +/* +** Return a vector of device characteristics. +*/ +static int winDeviceCharacteristics(sqlite3_file *id){ + winFile *p = (winFile*)id; + return SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN | + ((p->ctrlFlags & WINFILE_PSOW)?SQLITE_IOCAP_POWERSAFE_OVERWRITE:0); +} + +/* +** Windows will only let you create file view mappings +** on allocation size granularity boundaries. +** During sqlite3_os_init() we do a GetSystemInfo() +** to get the granularity size. +*/ +static SYSTEM_INFO winSysInfo; + +#ifndef SQLITE_OMIT_WAL + +/* +** Helper functions to obtain and relinquish the global mutex. The +** global mutex is used to protect the winLockInfo objects used by +** this file, all of which may be shared by multiple threads. +** +** Function winShmMutexHeld() is used to assert() that the global mutex +** is held when required. This function is only used as part of assert() +** statements. e.g. +** +** winShmEnterMutex() +** assert( winShmMutexHeld() ); +** winShmLeaveMutex() +*/ +static void winShmEnterMutex(void){ + sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_VFS1)); +} +static void winShmLeaveMutex(void){ + sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_VFS1)); +} +#ifndef NDEBUG +static int winShmMutexHeld(void) { + return sqlite3_mutex_held(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_VFS1)); +} +#endif + +/* +** Object used to represent a single file opened and mmapped to provide +** shared memory. When multiple threads all reference the same +** log-summary, each thread has its own winFile object, but they all +** point to a single instance of this object. In other words, each +** log-summary is opened only once per process. +** +** winShmMutexHeld() must be true when creating or destroying +** this object or while reading or writing the following fields: +** +** nRef +** pNext +** +** The following fields are read-only after the object is created: +** +** fid +** zFilename +** +** Either winShmNode.mutex must be held or winShmNode.nRef==0 and +** winShmMutexHeld() is true when reading or writing any other field +** in this structure. +** +*/ +struct winShmNode { + sqlite3_mutex *mutex; /* Mutex to access this object */ + char *zFilename; /* Name of the file */ + winFile hFile; /* File handle from winOpen */ + + int szRegion; /* Size of shared-memory regions */ + int nRegion; /* Size of array apRegion */ + struct ShmRegion { + HANDLE hMap; /* File handle from CreateFileMapping */ + void *pMap; + } *aRegion; + DWORD lastErrno; /* The Windows errno from the last I/O error */ + + int nRef; /* Number of winShm objects pointing to this */ + winShm *pFirst; /* All winShm objects pointing to this */ + winShmNode *pNext; /* Next in list of all winShmNode objects */ +#if defined(SQLITE_DEBUG) || defined(SQLITE_HAVE_OS_TRACE) + u8 nextShmId; /* Next available winShm.id value */ +#endif +}; + +/* +** A global array of all winShmNode objects. +** +** The winShmMutexHeld() must be true while reading or writing this list. +*/ +static winShmNode *winShmNodeList = 0; + +/* +** Structure used internally by this VFS to record the state of an +** open shared memory connection. +** +** The following fields are initialized when this object is created and +** are read-only thereafter: +** +** winShm.pShmNode +** winShm.id +** +** All other fields are read/write. The winShm.pShmNode->mutex must be held +** while accessing any read/write fields. +*/ +struct winShm { + winShmNode *pShmNode; /* The underlying winShmNode object */ + winShm *pNext; /* Next winShm with the same winShmNode */ + u8 hasMutex; /* True if holding the winShmNode mutex */ + u16 sharedMask; /* Mask of shared locks held */ + u16 exclMask; /* Mask of exclusive locks held */ +#if defined(SQLITE_DEBUG) || defined(SQLITE_HAVE_OS_TRACE) + u8 id; /* Id of this connection with its winShmNode */ +#endif +}; + +/* +** Constants used for locking +*/ +#define WIN_SHM_BASE ((22+SQLITE_SHM_NLOCK)*4) /* first lock byte */ +#define WIN_SHM_DMS (WIN_SHM_BASE+SQLITE_SHM_NLOCK) /* deadman switch */ + +/* +** Apply advisory locks for all n bytes beginning at ofst. +*/ +#define WINSHM_UNLCK 1 +#define WINSHM_RDLCK 2 +#define WINSHM_WRLCK 3 +static int winShmSystemLock( + winShmNode *pFile, /* Apply locks to this open shared-memory segment */ + int lockType, /* WINSHM_UNLCK, WINSHM_RDLCK, or WINSHM_WRLCK */ + int ofst, /* Offset to first byte to be locked/unlocked */ + int nByte /* Number of bytes to lock or unlock */ +){ + int rc = 0; /* Result code form Lock/UnlockFileEx() */ + + /* Access to the winShmNode object is serialized by the caller */ + assert( sqlite3_mutex_held(pFile->mutex) || pFile->nRef==0 ); + + OSTRACE(("SHM-LOCK file=%p, lock=%d, offset=%d, size=%d\n", + pFile->hFile.h, lockType, ofst, nByte)); + + /* Release/Acquire the system-level lock */ + if( lockType==WINSHM_UNLCK ){ + rc = winUnlockFile(&pFile->hFile.h, ofst, 0, nByte, 0); + }else{ + /* Initialize the locking parameters */ + DWORD dwFlags = LOCKFILE_FAIL_IMMEDIATELY; + if( lockType == WINSHM_WRLCK ) dwFlags |= LOCKFILE_EXCLUSIVE_LOCK; + rc = winLockFile(&pFile->hFile.h, dwFlags, ofst, 0, nByte, 0); + } + + if( rc!= 0 ){ + rc = SQLITE_OK; + }else{ + pFile->lastErrno = osGetLastError(); + rc = SQLITE_BUSY; + } + + OSTRACE(("SHM-LOCK file=%p, func=%s, errno=%lu, rc=%s\n", + pFile->hFile.h, (lockType == WINSHM_UNLCK) ? "winUnlockFile" : + "winLockFile", pFile->lastErrno, sqlite3ErrName(rc))); + + return rc; +} + +/* Forward references to VFS methods */ +static int winOpen(sqlite3_vfs*,const char*,sqlite3_file*,int,int*); +static int winDelete(sqlite3_vfs *,const char*,int); + +/* +** Purge the winShmNodeList list of all entries with winShmNode.nRef==0. +** +** This is not a VFS shared-memory method; it is a utility function called +** by VFS shared-memory methods. +*/ +static void winShmPurge(sqlite3_vfs *pVfs, int deleteFlag){ + winShmNode **pp; + winShmNode *p; + assert( winShmMutexHeld() ); + OSTRACE(("SHM-PURGE pid=%lu, deleteFlag=%d\n", + osGetCurrentProcessId(), deleteFlag)); + pp = &winShmNodeList; + while( (p = *pp)!=0 ){ + if( p->nRef==0 ){ + int i; + if( p->mutex ){ sqlite3_mutex_free(p->mutex); } + for(i=0; inRegion; i++){ + BOOL bRc = osUnmapViewOfFile(p->aRegion[i].pMap); + OSTRACE(("SHM-PURGE-UNMAP pid=%lu, region=%d, rc=%s\n", + osGetCurrentProcessId(), i, bRc ? "ok" : "failed")); + UNUSED_VARIABLE_VALUE(bRc); + bRc = osCloseHandle(p->aRegion[i].hMap); + OSTRACE(("SHM-PURGE-CLOSE pid=%lu, region=%d, rc=%s\n", + osGetCurrentProcessId(), i, bRc ? "ok" : "failed")); + UNUSED_VARIABLE_VALUE(bRc); + } + if( p->hFile.h!=NULL && p->hFile.h!=INVALID_HANDLE_VALUE ){ + SimulateIOErrorBenign(1); + winClose((sqlite3_file *)&p->hFile); + SimulateIOErrorBenign(0); + } + if( deleteFlag ){ + SimulateIOErrorBenign(1); + sqlite3BeginBenignMalloc(); + winDelete(pVfs, p->zFilename, 0); + sqlite3EndBenignMalloc(); + SimulateIOErrorBenign(0); + } + *pp = p->pNext; + sqlite3_free(p->aRegion); + sqlite3_free(p); + }else{ + pp = &p->pNext; + } + } +} + +/* +** Open the shared-memory area associated with database file pDbFd. +** +** When opening a new shared-memory file, if no other instances of that +** file are currently open, in this process or in other processes, then +** the file must be truncated to zero length or have its header cleared. +*/ +static int winOpenSharedMemory(winFile *pDbFd){ + struct winShm *p; /* The connection to be opened */ + struct winShmNode *pShmNode = 0; /* The underlying mmapped file */ + int rc; /* Result code */ + struct winShmNode *pNew; /* Newly allocated winShmNode */ + int nName; /* Size of zName in bytes */ + + assert( pDbFd->pShm==0 ); /* Not previously opened */ + + /* Allocate space for the new sqlite3_shm object. Also speculatively + ** allocate space for a new winShmNode and filename. + */ + p = sqlite3MallocZero( sizeof(*p) ); + if( p==0 ) return SQLITE_IOERR_NOMEM_BKPT; + nName = sqlite3Strlen30(pDbFd->zPath); + pNew = sqlite3MallocZero( sizeof(*pShmNode) + nName + 17 ); + if( pNew==0 ){ + sqlite3_free(p); + return SQLITE_IOERR_NOMEM_BKPT; + } + pNew->zFilename = (char*)&pNew[1]; + sqlite3_snprintf(nName+15, pNew->zFilename, "%s-shm", pDbFd->zPath); + sqlite3FileSuffix3(pDbFd->zPath, pNew->zFilename); + + /* Look to see if there is an existing winShmNode that can be used. + ** If no matching winShmNode currently exists, create a new one. + */ + winShmEnterMutex(); + for(pShmNode = winShmNodeList; pShmNode; pShmNode=pShmNode->pNext){ + /* TBD need to come up with better match here. Perhaps + ** use FILE_ID_BOTH_DIR_INFO Structure. + */ + if( sqlite3StrICmp(pShmNode->zFilename, pNew->zFilename)==0 ) break; + } + if( pShmNode ){ + sqlite3_free(pNew); + }else{ + pShmNode = pNew; + pNew = 0; + ((winFile*)(&pShmNode->hFile))->h = INVALID_HANDLE_VALUE; + pShmNode->pNext = winShmNodeList; + winShmNodeList = pShmNode; + + if( sqlite3GlobalConfig.bCoreMutex ){ + pShmNode->mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_FAST); + if( pShmNode->mutex==0 ){ + rc = SQLITE_IOERR_NOMEM_BKPT; + goto shm_open_err; + } + } + + rc = winOpen(pDbFd->pVfs, + pShmNode->zFilename, /* Name of the file (UTF-8) */ + (sqlite3_file*)&pShmNode->hFile, /* File handle here */ + SQLITE_OPEN_WAL | SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, + 0); + if( SQLITE_OK!=rc ){ + goto shm_open_err; + } + + /* Check to see if another process is holding the dead-man switch. + ** If not, truncate the file to zero length. + */ + if( winShmSystemLock(pShmNode, WINSHM_WRLCK, WIN_SHM_DMS, 1)==SQLITE_OK ){ + rc = winTruncate((sqlite3_file *)&pShmNode->hFile, 0); + if( rc!=SQLITE_OK ){ + rc = winLogError(SQLITE_IOERR_SHMOPEN, osGetLastError(), + "winOpenShm", pDbFd->zPath); + } + } + if( rc==SQLITE_OK ){ + winShmSystemLock(pShmNode, WINSHM_UNLCK, WIN_SHM_DMS, 1); + rc = winShmSystemLock(pShmNode, WINSHM_RDLCK, WIN_SHM_DMS, 1); + } + if( rc ) goto shm_open_err; + } + + /* Make the new connection a child of the winShmNode */ + p->pShmNode = pShmNode; +#if defined(SQLITE_DEBUG) || defined(SQLITE_HAVE_OS_TRACE) + p->id = pShmNode->nextShmId++; +#endif + pShmNode->nRef++; + pDbFd->pShm = p; + winShmLeaveMutex(); + + /* The reference count on pShmNode has already been incremented under + ** the cover of the winShmEnterMutex() mutex and the pointer from the + ** new (struct winShm) object to the pShmNode has been set. All that is + ** left to do is to link the new object into the linked list starting + ** at pShmNode->pFirst. This must be done while holding the pShmNode->mutex + ** mutex. + */ + sqlite3_mutex_enter(pShmNode->mutex); + p->pNext = pShmNode->pFirst; + pShmNode->pFirst = p; + sqlite3_mutex_leave(pShmNode->mutex); + return SQLITE_OK; + + /* Jump here on any error */ +shm_open_err: + winShmSystemLock(pShmNode, WINSHM_UNLCK, WIN_SHM_DMS, 1); + winShmPurge(pDbFd->pVfs, 0); /* This call frees pShmNode if required */ + sqlite3_free(p); + sqlite3_free(pNew); + winShmLeaveMutex(); + return rc; +} + +/* +** Close a connection to shared-memory. Delete the underlying +** storage if deleteFlag is true. +*/ +static int winShmUnmap( + sqlite3_file *fd, /* Database holding shared memory */ + int deleteFlag /* Delete after closing if true */ +){ + winFile *pDbFd; /* Database holding shared-memory */ + winShm *p; /* The connection to be closed */ + winShmNode *pShmNode; /* The underlying shared-memory file */ + winShm **pp; /* For looping over sibling connections */ + + pDbFd = (winFile*)fd; + p = pDbFd->pShm; + if( p==0 ) return SQLITE_OK; + pShmNode = p->pShmNode; + + /* Remove connection p from the set of connections associated + ** with pShmNode */ + sqlite3_mutex_enter(pShmNode->mutex); + for(pp=&pShmNode->pFirst; (*pp)!=p; pp = &(*pp)->pNext){} + *pp = p->pNext; + + /* Free the connection p */ + sqlite3_free(p); + pDbFd->pShm = 0; + sqlite3_mutex_leave(pShmNode->mutex); + + /* If pShmNode->nRef has reached 0, then close the underlying + ** shared-memory file, too */ + winShmEnterMutex(); + assert( pShmNode->nRef>0 ); + pShmNode->nRef--; + if( pShmNode->nRef==0 ){ + winShmPurge(pDbFd->pVfs, deleteFlag); + } + winShmLeaveMutex(); + + return SQLITE_OK; +} + +/* +** Change the lock state for a shared-memory segment. +*/ +static int winShmLock( + sqlite3_file *fd, /* Database file holding the shared memory */ + int ofst, /* First lock to acquire or release */ + int n, /* Number of locks to acquire or release */ + int flags /* What to do with the lock */ +){ + winFile *pDbFd = (winFile*)fd; /* Connection holding shared memory */ + winShm *p = pDbFd->pShm; /* The shared memory being locked */ + winShm *pX; /* For looping over all siblings */ + winShmNode *pShmNode = p->pShmNode; + int rc = SQLITE_OK; /* Result code */ + u16 mask; /* Mask of locks to take or release */ + + assert( ofst>=0 && ofst+n<=SQLITE_SHM_NLOCK ); + assert( n>=1 ); + assert( flags==(SQLITE_SHM_LOCK | SQLITE_SHM_SHARED) + || flags==(SQLITE_SHM_LOCK | SQLITE_SHM_EXCLUSIVE) + || flags==(SQLITE_SHM_UNLOCK | SQLITE_SHM_SHARED) + || flags==(SQLITE_SHM_UNLOCK | SQLITE_SHM_EXCLUSIVE) ); + assert( n==1 || (flags & SQLITE_SHM_EXCLUSIVE)!=0 ); + + mask = (u16)((1U<<(ofst+n)) - (1U<1 || mask==(1<mutex); + if( flags & SQLITE_SHM_UNLOCK ){ + u16 allMask = 0; /* Mask of locks held by siblings */ + + /* See if any siblings hold this same lock */ + for(pX=pShmNode->pFirst; pX; pX=pX->pNext){ + if( pX==p ) continue; + assert( (pX->exclMask & (p->exclMask|p->sharedMask))==0 ); + allMask |= pX->sharedMask; + } + + /* Unlock the system-level locks */ + if( (mask & allMask)==0 ){ + rc = winShmSystemLock(pShmNode, WINSHM_UNLCK, ofst+WIN_SHM_BASE, n); + }else{ + rc = SQLITE_OK; + } + + /* Undo the local locks */ + if( rc==SQLITE_OK ){ + p->exclMask &= ~mask; + p->sharedMask &= ~mask; + } + }else if( flags & SQLITE_SHM_SHARED ){ + u16 allShared = 0; /* Union of locks held by connections other than "p" */ + + /* Find out which shared locks are already held by sibling connections. + ** If any sibling already holds an exclusive lock, go ahead and return + ** SQLITE_BUSY. + */ + for(pX=pShmNode->pFirst; pX; pX=pX->pNext){ + if( (pX->exclMask & mask)!=0 ){ + rc = SQLITE_BUSY; + break; + } + allShared |= pX->sharedMask; + } + + /* Get shared locks at the system level, if necessary */ + if( rc==SQLITE_OK ){ + if( (allShared & mask)==0 ){ + rc = winShmSystemLock(pShmNode, WINSHM_RDLCK, ofst+WIN_SHM_BASE, n); + }else{ + rc = SQLITE_OK; + } + } + + /* Get the local shared locks */ + if( rc==SQLITE_OK ){ + p->sharedMask |= mask; + } + }else{ + /* Make sure no sibling connections hold locks that will block this + ** lock. If any do, return SQLITE_BUSY right away. + */ + for(pX=pShmNode->pFirst; pX; pX=pX->pNext){ + if( (pX->exclMask & mask)!=0 || (pX->sharedMask & mask)!=0 ){ + rc = SQLITE_BUSY; + break; + } + } + + /* Get the exclusive locks at the system level. Then if successful + ** also mark the local connection as being locked. + */ + if( rc==SQLITE_OK ){ + rc = winShmSystemLock(pShmNode, WINSHM_WRLCK, ofst+WIN_SHM_BASE, n); + if( rc==SQLITE_OK ){ + assert( (p->sharedMask & mask)==0 ); + p->exclMask |= mask; + } + } + } + sqlite3_mutex_leave(pShmNode->mutex); + OSTRACE(("SHM-LOCK pid=%lu, id=%d, sharedMask=%03x, exclMask=%03x, rc=%s\n", + osGetCurrentProcessId(), p->id, p->sharedMask, p->exclMask, + sqlite3ErrName(rc))); + return rc; +} + +/* +** Implement a memory barrier or memory fence on shared memory. +** +** All loads and stores begun before the barrier must complete before +** any load or store begun after the barrier. +*/ +static void winShmBarrier( + sqlite3_file *fd /* Database holding the shared memory */ +){ + UNUSED_PARAMETER(fd); + sqlite3MemoryBarrier(); /* compiler-defined memory barrier */ + winShmEnterMutex(); /* Also mutex, for redundancy */ + winShmLeaveMutex(); +} + +/* +** This function is called to obtain a pointer to region iRegion of the +** shared-memory associated with the database file fd. Shared-memory regions +** are numbered starting from zero. Each shared-memory region is szRegion +** bytes in size. +** +** If an error occurs, an error code is returned and *pp is set to NULL. +** +** Otherwise, if the isWrite parameter is 0 and the requested shared-memory +** region has not been allocated (by any client, including one running in a +** separate process), then *pp is set to NULL and SQLITE_OK returned. If +** isWrite is non-zero and the requested shared-memory region has not yet +** been allocated, it is allocated by this function. +** +** If the shared-memory region has already been allocated or is allocated by +** this call as described above, then it is mapped into this processes +** address space (if it is not already), *pp is set to point to the mapped +** memory and SQLITE_OK returned. +*/ +static int winShmMap( + sqlite3_file *fd, /* Handle open on database file */ + int iRegion, /* Region to retrieve */ + int szRegion, /* Size of regions */ + int isWrite, /* True to extend file if necessary */ + void volatile **pp /* OUT: Mapped memory */ +){ + winFile *pDbFd = (winFile*)fd; + winShm *pShm = pDbFd->pShm; + winShmNode *pShmNode; + int rc = SQLITE_OK; + + if( !pShm ){ + rc = winOpenSharedMemory(pDbFd); + if( rc!=SQLITE_OK ) return rc; + pShm = pDbFd->pShm; + } + pShmNode = pShm->pShmNode; + + sqlite3_mutex_enter(pShmNode->mutex); + assert( szRegion==pShmNode->szRegion || pShmNode->nRegion==0 ); + + if( pShmNode->nRegion<=iRegion ){ + struct ShmRegion *apNew; /* New aRegion[] array */ + int nByte = (iRegion+1)*szRegion; /* Minimum required file size */ + sqlite3_int64 sz; /* Current size of wal-index file */ + + pShmNode->szRegion = szRegion; + + /* The requested region is not mapped into this processes address space. + ** Check to see if it has been allocated (i.e. if the wal-index file is + ** large enough to contain the requested region). + */ + rc = winFileSize((sqlite3_file *)&pShmNode->hFile, &sz); + if( rc!=SQLITE_OK ){ + rc = winLogError(SQLITE_IOERR_SHMSIZE, osGetLastError(), + "winShmMap1", pDbFd->zPath); + goto shmpage_out; + } + + if( szhFile, nByte); + if( rc!=SQLITE_OK ){ + rc = winLogError(SQLITE_IOERR_SHMSIZE, osGetLastError(), + "winShmMap2", pDbFd->zPath); + goto shmpage_out; + } + } + + /* Map the requested memory region into this processes address space. */ + apNew = (struct ShmRegion *)sqlite3_realloc64( + pShmNode->aRegion, (iRegion+1)*sizeof(apNew[0]) + ); + if( !apNew ){ + rc = SQLITE_IOERR_NOMEM_BKPT; + goto shmpage_out; + } + pShmNode->aRegion = apNew; + + while( pShmNode->nRegion<=iRegion ){ + HANDLE hMap = NULL; /* file-mapping handle */ + void *pMap = 0; /* Mapped memory region */ + +#if SQLITE_OS_WINRT + hMap = osCreateFileMappingFromApp(pShmNode->hFile.h, + NULL, PAGE_READWRITE, nByte, NULL + ); +#elif defined(SQLITE_WIN32_HAS_WIDE) + hMap = osCreateFileMappingW(pShmNode->hFile.h, + NULL, PAGE_READWRITE, 0, nByte, NULL + ); +#elif defined(SQLITE_WIN32_HAS_ANSI) && SQLITE_WIN32_CREATEFILEMAPPINGA + hMap = osCreateFileMappingA(pShmNode->hFile.h, + NULL, PAGE_READWRITE, 0, nByte, NULL + ); +#endif + OSTRACE(("SHM-MAP-CREATE pid=%lu, region=%d, size=%d, rc=%s\n", + osGetCurrentProcessId(), pShmNode->nRegion, nByte, + hMap ? "ok" : "failed")); + if( hMap ){ + int iOffset = pShmNode->nRegion*szRegion; + int iOffsetShift = iOffset % winSysInfo.dwAllocationGranularity; +#if SQLITE_OS_WINRT + pMap = osMapViewOfFileFromApp(hMap, FILE_MAP_WRITE | FILE_MAP_READ, + iOffset - iOffsetShift, szRegion + iOffsetShift + ); +#else + pMap = osMapViewOfFile(hMap, FILE_MAP_WRITE | FILE_MAP_READ, + 0, iOffset - iOffsetShift, szRegion + iOffsetShift + ); +#endif + OSTRACE(("SHM-MAP-MAP pid=%lu, region=%d, offset=%d, size=%d, rc=%s\n", + osGetCurrentProcessId(), pShmNode->nRegion, iOffset, + szRegion, pMap ? "ok" : "failed")); + } + if( !pMap ){ + pShmNode->lastErrno = osGetLastError(); + rc = winLogError(SQLITE_IOERR_SHMMAP, pShmNode->lastErrno, + "winShmMap3", pDbFd->zPath); + if( hMap ) osCloseHandle(hMap); + goto shmpage_out; + } + + pShmNode->aRegion[pShmNode->nRegion].pMap = pMap; + pShmNode->aRegion[pShmNode->nRegion].hMap = hMap; + pShmNode->nRegion++; + } + } + +shmpage_out: + if( pShmNode->nRegion>iRegion ){ + int iOffset = iRegion*szRegion; + int iOffsetShift = iOffset % winSysInfo.dwAllocationGranularity; + char *p = (char *)pShmNode->aRegion[iRegion].pMap; + *pp = (void *)&p[iOffsetShift]; + }else{ + *pp = 0; + } + sqlite3_mutex_leave(pShmNode->mutex); + return rc; +} + +#else +# define winShmMap 0 +# define winShmLock 0 +# define winShmBarrier 0 +# define winShmUnmap 0 +#endif /* #ifndef SQLITE_OMIT_WAL */ + +/* +** Cleans up the mapped region of the specified file, if any. +*/ +#if SQLITE_MAX_MMAP_SIZE>0 +static int winUnmapfile(winFile *pFile){ + assert( pFile!=0 ); + OSTRACE(("UNMAP-FILE pid=%lu, pFile=%p, hMap=%p, pMapRegion=%p, " + "mmapSize=%lld, mmapSizeActual=%lld, mmapSizeMax=%lld\n", + osGetCurrentProcessId(), pFile, pFile->hMap, pFile->pMapRegion, + pFile->mmapSize, pFile->mmapSizeActual, pFile->mmapSizeMax)); + if( pFile->pMapRegion ){ + if( !osUnmapViewOfFile(pFile->pMapRegion) ){ + pFile->lastErrno = osGetLastError(); + OSTRACE(("UNMAP-FILE pid=%lu, pFile=%p, pMapRegion=%p, " + "rc=SQLITE_IOERR_MMAP\n", osGetCurrentProcessId(), pFile, + pFile->pMapRegion)); + return winLogError(SQLITE_IOERR_MMAP, pFile->lastErrno, + "winUnmapfile1", pFile->zPath); + } + pFile->pMapRegion = 0; + pFile->mmapSize = 0; + pFile->mmapSizeActual = 0; + } + if( pFile->hMap!=NULL ){ + if( !osCloseHandle(pFile->hMap) ){ + pFile->lastErrno = osGetLastError(); + OSTRACE(("UNMAP-FILE pid=%lu, pFile=%p, hMap=%p, rc=SQLITE_IOERR_MMAP\n", + osGetCurrentProcessId(), pFile, pFile->hMap)); + return winLogError(SQLITE_IOERR_MMAP, pFile->lastErrno, + "winUnmapfile2", pFile->zPath); + } + pFile->hMap = NULL; + } + OSTRACE(("UNMAP-FILE pid=%lu, pFile=%p, rc=SQLITE_OK\n", + osGetCurrentProcessId(), pFile)); + return SQLITE_OK; +} + +/* +** Memory map or remap the file opened by file-descriptor pFd (if the file +** is already mapped, the existing mapping is replaced by the new). Or, if +** there already exists a mapping for this file, and there are still +** outstanding xFetch() references to it, this function is a no-op. +** +** If parameter nByte is non-negative, then it is the requested size of +** the mapping to create. Otherwise, if nByte is less than zero, then the +** requested size is the size of the file on disk. The actual size of the +** created mapping is either the requested size or the value configured +** using SQLITE_FCNTL_MMAP_SIZE, whichever is smaller. +** +** SQLITE_OK is returned if no error occurs (even if the mapping is not +** recreated as a result of outstanding references) or an SQLite error +** code otherwise. +*/ +static int winMapfile(winFile *pFd, sqlite3_int64 nByte){ + sqlite3_int64 nMap = nByte; + int rc; + + assert( nMap>=0 || pFd->nFetchOut==0 ); + OSTRACE(("MAP-FILE pid=%lu, pFile=%p, size=%lld\n", + osGetCurrentProcessId(), pFd, nByte)); + + if( pFd->nFetchOut>0 ) return SQLITE_OK; + + if( nMap<0 ){ + rc = winFileSize((sqlite3_file*)pFd, &nMap); + if( rc ){ + OSTRACE(("MAP-FILE pid=%lu, pFile=%p, rc=SQLITE_IOERR_FSTAT\n", + osGetCurrentProcessId(), pFd)); + return SQLITE_IOERR_FSTAT; + } + } + if( nMap>pFd->mmapSizeMax ){ + nMap = pFd->mmapSizeMax; + } + nMap &= ~(sqlite3_int64)(winSysInfo.dwPageSize - 1); + + if( nMap==0 && pFd->mmapSize>0 ){ + winUnmapfile(pFd); + } + if( nMap!=pFd->mmapSize ){ + void *pNew = 0; + DWORD protect = PAGE_READONLY; + DWORD flags = FILE_MAP_READ; + + winUnmapfile(pFd); +#ifdef SQLITE_MMAP_READWRITE + if( (pFd->ctrlFlags & WINFILE_RDONLY)==0 ){ + protect = PAGE_READWRITE; + flags |= FILE_MAP_WRITE; + } +#endif +#if SQLITE_OS_WINRT + pFd->hMap = osCreateFileMappingFromApp(pFd->h, NULL, protect, nMap, NULL); +#elif defined(SQLITE_WIN32_HAS_WIDE) + pFd->hMap = osCreateFileMappingW(pFd->h, NULL, protect, + (DWORD)((nMap>>32) & 0xffffffff), + (DWORD)(nMap & 0xffffffff), NULL); +#elif defined(SQLITE_WIN32_HAS_ANSI) && SQLITE_WIN32_CREATEFILEMAPPINGA + pFd->hMap = osCreateFileMappingA(pFd->h, NULL, protect, + (DWORD)((nMap>>32) & 0xffffffff), + (DWORD)(nMap & 0xffffffff), NULL); +#endif + if( pFd->hMap==NULL ){ + pFd->lastErrno = osGetLastError(); + rc = winLogError(SQLITE_IOERR_MMAP, pFd->lastErrno, + "winMapfile1", pFd->zPath); + /* Log the error, but continue normal operation using xRead/xWrite */ + OSTRACE(("MAP-FILE-CREATE pid=%lu, pFile=%p, rc=%s\n", + osGetCurrentProcessId(), pFd, sqlite3ErrName(rc))); + return SQLITE_OK; + } + assert( (nMap % winSysInfo.dwPageSize)==0 ); + assert( sizeof(SIZE_T)==sizeof(sqlite3_int64) || nMap<=0xffffffff ); +#if SQLITE_OS_WINRT + pNew = osMapViewOfFileFromApp(pFd->hMap, flags, 0, (SIZE_T)nMap); +#else + pNew = osMapViewOfFile(pFd->hMap, flags, 0, 0, (SIZE_T)nMap); +#endif + if( pNew==NULL ){ + osCloseHandle(pFd->hMap); + pFd->hMap = NULL; + pFd->lastErrno = osGetLastError(); + rc = winLogError(SQLITE_IOERR_MMAP, pFd->lastErrno, + "winMapfile2", pFd->zPath); + /* Log the error, but continue normal operation using xRead/xWrite */ + OSTRACE(("MAP-FILE-MAP pid=%lu, pFile=%p, rc=%s\n", + osGetCurrentProcessId(), pFd, sqlite3ErrName(rc))); + return SQLITE_OK; + } + pFd->pMapRegion = pNew; + pFd->mmapSize = nMap; + pFd->mmapSizeActual = nMap; + } + + OSTRACE(("MAP-FILE pid=%lu, pFile=%p, rc=SQLITE_OK\n", + osGetCurrentProcessId(), pFd)); + return SQLITE_OK; +} +#endif /* SQLITE_MAX_MMAP_SIZE>0 */ + +/* +** If possible, return a pointer to a mapping of file fd starting at offset +** iOff. The mapping must be valid for at least nAmt bytes. +** +** If such a pointer can be obtained, store it in *pp and return SQLITE_OK. +** Or, if one cannot but no error occurs, set *pp to 0 and return SQLITE_OK. +** Finally, if an error does occur, return an SQLite error code. The final +** value of *pp is undefined in this case. +** +** If this function does return a pointer, the caller must eventually +** release the reference by calling winUnfetch(). +*/ +static int winFetch(sqlite3_file *fd, i64 iOff, int nAmt, void **pp){ +#if SQLITE_MAX_MMAP_SIZE>0 + winFile *pFd = (winFile*)fd; /* The underlying database file */ +#endif + *pp = 0; + + OSTRACE(("FETCH pid=%lu, pFile=%p, offset=%lld, amount=%d, pp=%p\n", + osGetCurrentProcessId(), fd, iOff, nAmt, pp)); + +#if SQLITE_MAX_MMAP_SIZE>0 + if( pFd->mmapSizeMax>0 ){ + if( pFd->pMapRegion==0 ){ + int rc = winMapfile(pFd, -1); + if( rc!=SQLITE_OK ){ + OSTRACE(("FETCH pid=%lu, pFile=%p, rc=%s\n", + osGetCurrentProcessId(), pFd, sqlite3ErrName(rc))); + return rc; + } + } + if( pFd->mmapSize >= iOff+nAmt ){ + *pp = &((u8 *)pFd->pMapRegion)[iOff]; + pFd->nFetchOut++; + } + } +#endif + + OSTRACE(("FETCH pid=%lu, pFile=%p, pp=%p, *pp=%p, rc=SQLITE_OK\n", + osGetCurrentProcessId(), fd, pp, *pp)); + return SQLITE_OK; +} + +/* +** If the third argument is non-NULL, then this function releases a +** reference obtained by an earlier call to winFetch(). The second +** argument passed to this function must be the same as the corresponding +** argument that was passed to the winFetch() invocation. +** +** Or, if the third argument is NULL, then this function is being called +** to inform the VFS layer that, according to POSIX, any existing mapping +** may now be invalid and should be unmapped. +*/ +static int winUnfetch(sqlite3_file *fd, i64 iOff, void *p){ +#if SQLITE_MAX_MMAP_SIZE>0 + winFile *pFd = (winFile*)fd; /* The underlying database file */ + + /* If p==0 (unmap the entire file) then there must be no outstanding + ** xFetch references. Or, if p!=0 (meaning it is an xFetch reference), + ** then there must be at least one outstanding. */ + assert( (p==0)==(pFd->nFetchOut==0) ); + + /* If p!=0, it must match the iOff value. */ + assert( p==0 || p==&((u8 *)pFd->pMapRegion)[iOff] ); + + OSTRACE(("UNFETCH pid=%lu, pFile=%p, offset=%lld, p=%p\n", + osGetCurrentProcessId(), pFd, iOff, p)); + + if( p ){ + pFd->nFetchOut--; + }else{ + /* FIXME: If Windows truly always prevents truncating or deleting a + ** file while a mapping is held, then the following winUnmapfile() call + ** is unnecessary can be omitted - potentially improving + ** performance. */ + winUnmapfile(pFd); + } + + assert( pFd->nFetchOut>=0 ); +#endif + + OSTRACE(("UNFETCH pid=%lu, pFile=%p, rc=SQLITE_OK\n", + osGetCurrentProcessId(), fd)); + return SQLITE_OK; +} + +/* +** Here ends the implementation of all sqlite3_file methods. +** +********************** End sqlite3_file Methods ******************************* +******************************************************************************/ + +/* +** This vector defines all the methods that can operate on an +** sqlite3_file for win32. +*/ +static const sqlite3_io_methods winIoMethod = { + 3, /* iVersion */ + winClose, /* xClose */ + winRead, /* xRead */ + winWrite, /* xWrite */ + winTruncate, /* xTruncate */ + winSync, /* xSync */ + winFileSize, /* xFileSize */ + winLock, /* xLock */ + winUnlock, /* xUnlock */ + winCheckReservedLock, /* xCheckReservedLock */ + winFileControl, /* xFileControl */ + winSectorSize, /* xSectorSize */ + winDeviceCharacteristics, /* xDeviceCharacteristics */ + winShmMap, /* xShmMap */ + winShmLock, /* xShmLock */ + winShmBarrier, /* xShmBarrier */ + winShmUnmap, /* xShmUnmap */ + winFetch, /* xFetch */ + winUnfetch /* xUnfetch */ +}; + +/* +** This vector defines all the methods that can operate on an +** sqlite3_file for win32 without performing any locking. +*/ +static const sqlite3_io_methods winIoNolockMethod = { + 3, /* iVersion */ + winClose, /* xClose */ + winRead, /* xRead */ + winWrite, /* xWrite */ + winTruncate, /* xTruncate */ + winSync, /* xSync */ + winFileSize, /* xFileSize */ + winNolockLock, /* xLock */ + winNolockUnlock, /* xUnlock */ + winNolockCheckReservedLock, /* xCheckReservedLock */ + winFileControl, /* xFileControl */ + winSectorSize, /* xSectorSize */ + winDeviceCharacteristics, /* xDeviceCharacteristics */ + winShmMap, /* xShmMap */ + winShmLock, /* xShmLock */ + winShmBarrier, /* xShmBarrier */ + winShmUnmap, /* xShmUnmap */ + winFetch, /* xFetch */ + winUnfetch /* xUnfetch */ +}; + +static winVfsAppData winAppData = { + &winIoMethod, /* pMethod */ + 0, /* pAppData */ + 0 /* bNoLock */ +}; + +static winVfsAppData winNolockAppData = { + &winIoNolockMethod, /* pMethod */ + 0, /* pAppData */ + 1 /* bNoLock */ +}; + +/**************************************************************************** +**************************** sqlite3_vfs methods **************************** +** +** This division contains the implementation of methods on the +** sqlite3_vfs object. +*/ + +#if defined(__CYGWIN__) +/* +** Convert a filename from whatever the underlying operating system +** supports for filenames into UTF-8. Space to hold the result is +** obtained from malloc and must be freed by the calling function. +*/ +static char *winConvertToUtf8Filename(const void *zFilename){ + char *zConverted = 0; + if( osIsNT() ){ + zConverted = winUnicodeToUtf8(zFilename); + } +#ifdef SQLITE_WIN32_HAS_ANSI + else{ + zConverted = winMbcsToUtf8(zFilename, osAreFileApisANSI()); + } +#endif + /* caller will handle out of memory */ + return zConverted; +} +#endif + +/* +** Convert a UTF-8 filename into whatever form the underlying +** operating system wants filenames in. Space to hold the result +** is obtained from malloc and must be freed by the calling +** function. +*/ +static void *winConvertFromUtf8Filename(const char *zFilename){ + void *zConverted = 0; + if( osIsNT() ){ + zConverted = winUtf8ToUnicode(zFilename); + } +#ifdef SQLITE_WIN32_HAS_ANSI + else{ + zConverted = winUtf8ToMbcs(zFilename, osAreFileApisANSI()); + } +#endif + /* caller will handle out of memory */ + return zConverted; +} + +/* +** This function returns non-zero if the specified UTF-8 string buffer +** ends with a directory separator character or one was successfully +** added to it. +*/ +static int winMakeEndInDirSep(int nBuf, char *zBuf){ + if( zBuf ){ + int nLen = sqlite3Strlen30(zBuf); + if( nLen>0 ){ + if( winIsDirSep(zBuf[nLen-1]) ){ + return 1; + }else if( nLen+1mxPathname; nBuf = nMax + 2; + zBuf = sqlite3MallocZero( nBuf ); + if( !zBuf ){ + OSTRACE(("TEMP-FILENAME rc=SQLITE_IOERR_NOMEM\n")); + return SQLITE_IOERR_NOMEM_BKPT; + } + + /* Figure out the effective temporary directory. First, check if one + ** has been explicitly set by the application; otherwise, use the one + ** configured by the operating system. + */ + nDir = nMax - (nPre + 15); + assert( nDir>0 ); + if( sqlite3_temp_directory ){ + int nDirLen = sqlite3Strlen30(sqlite3_temp_directory); + if( nDirLen>0 ){ + if( !winIsDirSep(sqlite3_temp_directory[nDirLen-1]) ){ + nDirLen++; + } + if( nDirLen>nDir ){ + sqlite3_free(zBuf); + OSTRACE(("TEMP-FILENAME rc=SQLITE_ERROR\n")); + return winLogError(SQLITE_ERROR, 0, "winGetTempname1", 0); + } + sqlite3_snprintf(nMax, zBuf, "%s", sqlite3_temp_directory); + } + } +#if defined(__CYGWIN__) + else{ + static const char *azDirs[] = { + 0, /* getenv("SQLITE_TMPDIR") */ + 0, /* getenv("TMPDIR") */ + 0, /* getenv("TMP") */ + 0, /* getenv("TEMP") */ + 0, /* getenv("USERPROFILE") */ + "/var/tmp", + "/usr/tmp", + "/tmp", + ".", + 0 /* List terminator */ + }; + unsigned int i; + const char *zDir = 0; + + if( !azDirs[0] ) azDirs[0] = getenv("SQLITE_TMPDIR"); + if( !azDirs[1] ) azDirs[1] = getenv("TMPDIR"); + if( !azDirs[2] ) azDirs[2] = getenv("TMP"); + if( !azDirs[3] ) azDirs[3] = getenv("TEMP"); + if( !azDirs[4] ) azDirs[4] = getenv("USERPROFILE"); + for(i=0; i/etilqs_XXXXXXXXXXXXXXX\0\0" + ** + ** If not, return SQLITE_ERROR. The number 17 is used here in order to + ** account for the space used by the 15 character random suffix and the + ** two trailing NUL characters. The final directory separator character + ** has already added if it was not already present. + */ + nLen = sqlite3Strlen30(zBuf); + if( (nLen + nPre + 17) > nBuf ){ + sqlite3_free(zBuf); + OSTRACE(("TEMP-FILENAME rc=SQLITE_ERROR\n")); + return winLogError(SQLITE_ERROR, 0, "winGetTempname5", 0); + } + + sqlite3_snprintf(nBuf-16-nLen, zBuf+nLen, SQLITE_TEMP_FILE_PREFIX); + + j = sqlite3Strlen30(zBuf); + sqlite3_randomness(15, &zBuf[j]); + for(i=0; i<15; i++, j++){ + zBuf[j] = (char)zChars[ ((unsigned char)zBuf[j])%(sizeof(zChars)-1) ]; + } + zBuf[j] = 0; + zBuf[j+1] = 0; + *pzBuf = zBuf; + + OSTRACE(("TEMP-FILENAME name=%s, rc=SQLITE_OK\n", zBuf)); + return SQLITE_OK; +} + +/* +** Return TRUE if the named file is really a directory. Return false if +** it is something other than a directory, or if there is any kind of memory +** allocation failure. +*/ +static int winIsDir(const void *zConverted){ + DWORD attr; + int rc = 0; + DWORD lastErrno; + + if( osIsNT() ){ + int cnt = 0; + WIN32_FILE_ATTRIBUTE_DATA sAttrData; + memset(&sAttrData, 0, sizeof(sAttrData)); + while( !(rc = osGetFileAttributesExW((LPCWSTR)zConverted, + GetFileExInfoStandard, + &sAttrData)) && winRetryIoerr(&cnt, &lastErrno) ){} + if( !rc ){ + return 0; /* Invalid name? */ + } + attr = sAttrData.dwFileAttributes; +#if SQLITE_OS_WINCE==0 + }else{ + attr = osGetFileAttributesA((char*)zConverted); +#endif + } + return (attr!=INVALID_FILE_ATTRIBUTES) && (attr&FILE_ATTRIBUTE_DIRECTORY); +} + +/* +** Open a file. +*/ +static int winOpen( + sqlite3_vfs *pVfs, /* Used to get maximum path length and AppData */ + const char *zName, /* Name of the file (UTF-8) */ + sqlite3_file *id, /* Write the SQLite file handle here */ + int flags, /* Open mode flags */ + int *pOutFlags /* Status return flags */ +){ + HANDLE h; + DWORD lastErrno = 0; + DWORD dwDesiredAccess; + DWORD dwShareMode; + DWORD dwCreationDisposition; + DWORD dwFlagsAndAttributes = 0; +#if SQLITE_OS_WINCE + int isTemp = 0; +#endif + winVfsAppData *pAppData; + winFile *pFile = (winFile*)id; + void *zConverted; /* Filename in OS encoding */ + const char *zUtf8Name = zName; /* Filename in UTF-8 encoding */ + int cnt = 0; + + /* If argument zPath is a NULL pointer, this function is required to open + ** a temporary file. Use this buffer to store the file name in. + */ + char *zTmpname = 0; /* For temporary filename, if necessary. */ + + int rc = SQLITE_OK; /* Function Return Code */ +#if !defined(NDEBUG) || SQLITE_OS_WINCE + int eType = flags&0xFFFFFF00; /* Type of file to open */ +#endif + + int isExclusive = (flags & SQLITE_OPEN_EXCLUSIVE); + int isDelete = (flags & SQLITE_OPEN_DELETEONCLOSE); + int isCreate = (flags & SQLITE_OPEN_CREATE); + int isReadonly = (flags & SQLITE_OPEN_READONLY); + int isReadWrite = (flags & SQLITE_OPEN_READWRITE); + +#ifndef NDEBUG + int isOpenJournal = (isCreate && ( + eType==SQLITE_OPEN_MASTER_JOURNAL + || eType==SQLITE_OPEN_MAIN_JOURNAL + || eType==SQLITE_OPEN_WAL + )); +#endif + + OSTRACE(("OPEN name=%s, pFile=%p, flags=%x, pOutFlags=%p\n", + zUtf8Name, id, flags, pOutFlags)); + + /* Check the following statements are true: + ** + ** (a) Exactly one of the READWRITE and READONLY flags must be set, and + ** (b) if CREATE is set, then READWRITE must also be set, and + ** (c) if EXCLUSIVE is set, then CREATE must also be set. + ** (d) if DELETEONCLOSE is set, then CREATE must also be set. + */ + assert((isReadonly==0 || isReadWrite==0) && (isReadWrite || isReadonly)); + assert(isCreate==0 || isReadWrite); + assert(isExclusive==0 || isCreate); + assert(isDelete==0 || isCreate); + + /* The main DB, main journal, WAL file and master journal are never + ** automatically deleted. Nor are they ever temporary files. */ + assert( (!isDelete && zName) || eType!=SQLITE_OPEN_MAIN_DB ); + assert( (!isDelete && zName) || eType!=SQLITE_OPEN_MAIN_JOURNAL ); + assert( (!isDelete && zName) || eType!=SQLITE_OPEN_MASTER_JOURNAL ); + assert( (!isDelete && zName) || eType!=SQLITE_OPEN_WAL ); + + /* Assert that the upper layer has set one of the "file-type" flags. */ + assert( eType==SQLITE_OPEN_MAIN_DB || eType==SQLITE_OPEN_TEMP_DB + || eType==SQLITE_OPEN_MAIN_JOURNAL || eType==SQLITE_OPEN_TEMP_JOURNAL + || eType==SQLITE_OPEN_SUBJOURNAL || eType==SQLITE_OPEN_MASTER_JOURNAL + || eType==SQLITE_OPEN_TRANSIENT_DB || eType==SQLITE_OPEN_WAL + ); + + assert( pFile!=0 ); + memset(pFile, 0, sizeof(winFile)); + pFile->h = INVALID_HANDLE_VALUE; + +#if SQLITE_OS_WINRT + if( !zUtf8Name && !sqlite3_temp_directory ){ + sqlite3_log(SQLITE_ERROR, + "sqlite3_temp_directory variable should be set for WinRT"); + } +#endif + + /* If the second argument to this function is NULL, generate a + ** temporary file name to use + */ + if( !zUtf8Name ){ + assert( isDelete && !isOpenJournal ); + rc = winGetTempname(pVfs, &zTmpname); + if( rc!=SQLITE_OK ){ + OSTRACE(("OPEN name=%s, rc=%s", zUtf8Name, sqlite3ErrName(rc))); + return rc; + } + zUtf8Name = zTmpname; + } + + /* Database filenames are double-zero terminated if they are not + ** URIs with parameters. Hence, they can always be passed into + ** sqlite3_uri_parameter(). + */ + assert( (eType!=SQLITE_OPEN_MAIN_DB) || (flags & SQLITE_OPEN_URI) || + zUtf8Name[sqlite3Strlen30(zUtf8Name)+1]==0 ); + + /* Convert the filename to the system encoding. */ + zConverted = winConvertFromUtf8Filename(zUtf8Name); + if( zConverted==0 ){ + sqlite3_free(zTmpname); + OSTRACE(("OPEN name=%s, rc=SQLITE_IOERR_NOMEM", zUtf8Name)); + return SQLITE_IOERR_NOMEM_BKPT; + } + + if( winIsDir(zConverted) ){ + sqlite3_free(zConverted); + sqlite3_free(zTmpname); + OSTRACE(("OPEN name=%s, rc=SQLITE_CANTOPEN_ISDIR", zUtf8Name)); + return SQLITE_CANTOPEN_ISDIR; + } + + if( isReadWrite ){ + dwDesiredAccess = GENERIC_READ | GENERIC_WRITE; + }else{ + dwDesiredAccess = GENERIC_READ; + } + + /* SQLITE_OPEN_EXCLUSIVE is used to make sure that a new file is + ** created. SQLite doesn't use it to indicate "exclusive access" + ** as it is usually understood. + */ + if( isExclusive ){ + /* Creates a new file, only if it does not already exist. */ + /* If the file exists, it fails. */ + dwCreationDisposition = CREATE_NEW; + }else if( isCreate ){ + /* Open existing file, or create if it doesn't exist */ + dwCreationDisposition = OPEN_ALWAYS; + }else{ + /* Opens a file, only if it exists. */ + dwCreationDisposition = OPEN_EXISTING; + } + + dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE; + + if( isDelete ){ +#if SQLITE_OS_WINCE + dwFlagsAndAttributes = FILE_ATTRIBUTE_HIDDEN; + isTemp = 1; +#else + dwFlagsAndAttributes = FILE_ATTRIBUTE_TEMPORARY + | FILE_ATTRIBUTE_HIDDEN + | FILE_FLAG_DELETE_ON_CLOSE; +#endif + }else{ + dwFlagsAndAttributes = FILE_ATTRIBUTE_NORMAL; + } + /* Reports from the internet are that performance is always + ** better if FILE_FLAG_RANDOM_ACCESS is used. Ticket #2699. */ +#if SQLITE_OS_WINCE + dwFlagsAndAttributes |= FILE_FLAG_RANDOM_ACCESS; +#endif + + if( osIsNT() ){ +#if SQLITE_OS_WINRT + CREATEFILE2_EXTENDED_PARAMETERS extendedParameters; + extendedParameters.dwSize = sizeof(CREATEFILE2_EXTENDED_PARAMETERS); + extendedParameters.dwFileAttributes = + dwFlagsAndAttributes & FILE_ATTRIBUTE_MASK; + extendedParameters.dwFileFlags = dwFlagsAndAttributes & FILE_FLAG_MASK; + extendedParameters.dwSecurityQosFlags = SECURITY_ANONYMOUS; + extendedParameters.lpSecurityAttributes = NULL; + extendedParameters.hTemplateFile = NULL; + while( (h = osCreateFile2((LPCWSTR)zConverted, + dwDesiredAccess, + dwShareMode, + dwCreationDisposition, + &extendedParameters))==INVALID_HANDLE_VALUE && + winRetryIoerr(&cnt, &lastErrno) ){ + /* Noop */ + } +#else + while( (h = osCreateFileW((LPCWSTR)zConverted, + dwDesiredAccess, + dwShareMode, NULL, + dwCreationDisposition, + dwFlagsAndAttributes, + NULL))==INVALID_HANDLE_VALUE && + winRetryIoerr(&cnt, &lastErrno) ){ + /* Noop */ + } +#endif + } +#ifdef SQLITE_WIN32_HAS_ANSI + else{ + while( (h = osCreateFileA((LPCSTR)zConverted, + dwDesiredAccess, + dwShareMode, NULL, + dwCreationDisposition, + dwFlagsAndAttributes, + NULL))==INVALID_HANDLE_VALUE && + winRetryIoerr(&cnt, &lastErrno) ){ + /* Noop */ + } + } +#endif + winLogIoerr(cnt, __LINE__); + + OSTRACE(("OPEN file=%p, name=%s, access=%lx, rc=%s\n", h, zUtf8Name, + dwDesiredAccess, (h==INVALID_HANDLE_VALUE) ? "failed" : "ok")); + + if( h==INVALID_HANDLE_VALUE ){ + pFile->lastErrno = lastErrno; + winLogError(SQLITE_CANTOPEN, pFile->lastErrno, "winOpen", zUtf8Name); + sqlite3_free(zConverted); + sqlite3_free(zTmpname); + if( isReadWrite && !isExclusive ){ + return winOpen(pVfs, zName, id, + ((flags|SQLITE_OPEN_READONLY) & + ~(SQLITE_OPEN_CREATE|SQLITE_OPEN_READWRITE)), + pOutFlags); + }else{ + return SQLITE_CANTOPEN_BKPT; + } + } + + if( pOutFlags ){ + if( isReadWrite ){ + *pOutFlags = SQLITE_OPEN_READWRITE; + }else{ + *pOutFlags = SQLITE_OPEN_READONLY; + } + } + + OSTRACE(("OPEN file=%p, name=%s, access=%lx, pOutFlags=%p, *pOutFlags=%d, " + "rc=%s\n", h, zUtf8Name, dwDesiredAccess, pOutFlags, pOutFlags ? + *pOutFlags : 0, (h==INVALID_HANDLE_VALUE) ? "failed" : "ok")); + + pAppData = (winVfsAppData*)pVfs->pAppData; + +#if SQLITE_OS_WINCE + { + if( isReadWrite && eType==SQLITE_OPEN_MAIN_DB + && ((pAppData==NULL) || !pAppData->bNoLock) + && (rc = winceCreateLock(zName, pFile))!=SQLITE_OK + ){ + osCloseHandle(h); + sqlite3_free(zConverted); + sqlite3_free(zTmpname); + OSTRACE(("OPEN-CE-LOCK name=%s, rc=%s\n", zName, sqlite3ErrName(rc))); + return rc; + } + } + if( isTemp ){ + pFile->zDeleteOnClose = zConverted; + }else +#endif + { + sqlite3_free(zConverted); + } + + sqlite3_free(zTmpname); + pFile->pMethod = pAppData ? pAppData->pMethod : &winIoMethod; + pFile->pVfs = pVfs; + pFile->h = h; + if( isReadonly ){ + pFile->ctrlFlags |= WINFILE_RDONLY; + } + if( sqlite3_uri_boolean(zName, "psow", SQLITE_POWERSAFE_OVERWRITE) ){ + pFile->ctrlFlags |= WINFILE_PSOW; + } + pFile->lastErrno = NO_ERROR; + pFile->zPath = zName; +#if SQLITE_MAX_MMAP_SIZE>0 + pFile->hMap = NULL; + pFile->pMapRegion = 0; + pFile->mmapSize = 0; + pFile->mmapSizeActual = 0; + pFile->mmapSizeMax = sqlite3GlobalConfig.szMmap; +#endif + + OpenCounter(+1); + return rc; +} + +/* +** Delete the named file. +** +** Note that Windows does not allow a file to be deleted if some other +** process has it open. Sometimes a virus scanner or indexing program +** will open a journal file shortly after it is created in order to do +** whatever it does. While this other process is holding the +** file open, we will be unable to delete it. To work around this +** problem, we delay 100 milliseconds and try to delete again. Up +** to MX_DELETION_ATTEMPTs deletion attempts are run before giving +** up and returning an error. +*/ +static int winDelete( + sqlite3_vfs *pVfs, /* Not used on win32 */ + const char *zFilename, /* Name of file to delete */ + int syncDir /* Not used on win32 */ +){ + int cnt = 0; + int rc; + DWORD attr; + DWORD lastErrno = 0; + void *zConverted; + UNUSED_PARAMETER(pVfs); + UNUSED_PARAMETER(syncDir); + + SimulateIOError(return SQLITE_IOERR_DELETE); + OSTRACE(("DELETE name=%s, syncDir=%d\n", zFilename, syncDir)); + + zConverted = winConvertFromUtf8Filename(zFilename); + if( zConverted==0 ){ + OSTRACE(("DELETE name=%s, rc=SQLITE_IOERR_NOMEM\n", zFilename)); + return SQLITE_IOERR_NOMEM_BKPT; + } + if( osIsNT() ){ + do { +#if SQLITE_OS_WINRT + WIN32_FILE_ATTRIBUTE_DATA sAttrData; + memset(&sAttrData, 0, sizeof(sAttrData)); + if ( osGetFileAttributesExW(zConverted, GetFileExInfoStandard, + &sAttrData) ){ + attr = sAttrData.dwFileAttributes; + }else{ + lastErrno = osGetLastError(); + if( lastErrno==ERROR_FILE_NOT_FOUND + || lastErrno==ERROR_PATH_NOT_FOUND ){ + rc = SQLITE_IOERR_DELETE_NOENT; /* Already gone? */ + }else{ + rc = SQLITE_ERROR; + } + break; + } +#else + attr = osGetFileAttributesW(zConverted); +#endif + if ( attr==INVALID_FILE_ATTRIBUTES ){ + lastErrno = osGetLastError(); + if( lastErrno==ERROR_FILE_NOT_FOUND + || lastErrno==ERROR_PATH_NOT_FOUND ){ + rc = SQLITE_IOERR_DELETE_NOENT; /* Already gone? */ + }else{ + rc = SQLITE_ERROR; + } + break; + } + if ( attr&FILE_ATTRIBUTE_DIRECTORY ){ + rc = SQLITE_ERROR; /* Files only. */ + break; + } + if ( osDeleteFileW(zConverted) ){ + rc = SQLITE_OK; /* Deleted OK. */ + break; + } + if ( !winRetryIoerr(&cnt, &lastErrno) ){ + rc = SQLITE_ERROR; /* No more retries. */ + break; + } + } while(1); + } +#ifdef SQLITE_WIN32_HAS_ANSI + else{ + do { + attr = osGetFileAttributesA(zConverted); + if ( attr==INVALID_FILE_ATTRIBUTES ){ + lastErrno = osGetLastError(); + if( lastErrno==ERROR_FILE_NOT_FOUND + || lastErrno==ERROR_PATH_NOT_FOUND ){ + rc = SQLITE_IOERR_DELETE_NOENT; /* Already gone? */ + }else{ + rc = SQLITE_ERROR; + } + break; + } + if ( attr&FILE_ATTRIBUTE_DIRECTORY ){ + rc = SQLITE_ERROR; /* Files only. */ + break; + } + if ( osDeleteFileA(zConverted) ){ + rc = SQLITE_OK; /* Deleted OK. */ + break; + } + if ( !winRetryIoerr(&cnt, &lastErrno) ){ + rc = SQLITE_ERROR; /* No more retries. */ + break; + } + } while(1); + } +#endif + if( rc && rc!=SQLITE_IOERR_DELETE_NOENT ){ + rc = winLogError(SQLITE_IOERR_DELETE, lastErrno, "winDelete", zFilename); + }else{ + winLogIoerr(cnt, __LINE__); + } + sqlite3_free(zConverted); + OSTRACE(("DELETE name=%s, rc=%s\n", zFilename, sqlite3ErrName(rc))); + return rc; +} + +/* +** Check the existence and status of a file. +*/ +static int winAccess( + sqlite3_vfs *pVfs, /* Not used on win32 */ + const char *zFilename, /* Name of file to check */ + int flags, /* Type of test to make on this file */ + int *pResOut /* OUT: Result */ +){ + DWORD attr; + int rc = 0; + DWORD lastErrno = 0; + void *zConverted; + UNUSED_PARAMETER(pVfs); + + SimulateIOError( return SQLITE_IOERR_ACCESS; ); + OSTRACE(("ACCESS name=%s, flags=%x, pResOut=%p\n", + zFilename, flags, pResOut)); + + zConverted = winConvertFromUtf8Filename(zFilename); + if( zConverted==0 ){ + OSTRACE(("ACCESS name=%s, rc=SQLITE_IOERR_NOMEM\n", zFilename)); + return SQLITE_IOERR_NOMEM_BKPT; + } + if( osIsNT() ){ + int cnt = 0; + WIN32_FILE_ATTRIBUTE_DATA sAttrData; + memset(&sAttrData, 0, sizeof(sAttrData)); + while( !(rc = osGetFileAttributesExW((LPCWSTR)zConverted, + GetFileExInfoStandard, + &sAttrData)) && winRetryIoerr(&cnt, &lastErrno) ){} + if( rc ){ + /* For an SQLITE_ACCESS_EXISTS query, treat a zero-length file + ** as if it does not exist. + */ + if( flags==SQLITE_ACCESS_EXISTS + && sAttrData.nFileSizeHigh==0 + && sAttrData.nFileSizeLow==0 ){ + attr = INVALID_FILE_ATTRIBUTES; + }else{ + attr = sAttrData.dwFileAttributes; + } + }else{ + winLogIoerr(cnt, __LINE__); + if( lastErrno!=ERROR_FILE_NOT_FOUND && lastErrno!=ERROR_PATH_NOT_FOUND ){ + sqlite3_free(zConverted); + return winLogError(SQLITE_IOERR_ACCESS, lastErrno, "winAccess", + zFilename); + }else{ + attr = INVALID_FILE_ATTRIBUTES; + } + } + } +#ifdef SQLITE_WIN32_HAS_ANSI + else{ + attr = osGetFileAttributesA((char*)zConverted); + } +#endif + sqlite3_free(zConverted); + switch( flags ){ + case SQLITE_ACCESS_READ: + case SQLITE_ACCESS_EXISTS: + rc = attr!=INVALID_FILE_ATTRIBUTES; + break; + case SQLITE_ACCESS_READWRITE: + rc = attr!=INVALID_FILE_ATTRIBUTES && + (attr & FILE_ATTRIBUTE_READONLY)==0; + break; + default: + assert(!"Invalid flags argument"); + } + *pResOut = rc; + OSTRACE(("ACCESS name=%s, pResOut=%p, *pResOut=%d, rc=SQLITE_OK\n", + zFilename, pResOut, *pResOut)); + return SQLITE_OK; +} + +/* +** Returns non-zero if the specified path name starts with a drive letter +** followed by a colon character. +*/ +static BOOL winIsDriveLetterAndColon( + const char *zPathname +){ + return ( sqlite3Isalpha(zPathname[0]) && zPathname[1]==':' ); +} + +/* +** Returns non-zero if the specified path name should be used verbatim. If +** non-zero is returned from this function, the calling function must simply +** use the provided path name verbatim -OR- resolve it into a full path name +** using the GetFullPathName Win32 API function (if available). +*/ +static BOOL winIsVerbatimPathname( + const char *zPathname +){ + /* + ** If the path name starts with a forward slash or a backslash, it is either + ** a legal UNC name, a volume relative path, or an absolute path name in the + ** "Unix" format on Windows. There is no easy way to differentiate between + ** the final two cases; therefore, we return the safer return value of TRUE + ** so that callers of this function will simply use it verbatim. + */ + if ( winIsDirSep(zPathname[0]) ){ + return TRUE; + } + + /* + ** If the path name starts with a letter and a colon it is either a volume + ** relative path or an absolute path. Callers of this function must not + ** attempt to treat it as a relative path name (i.e. they should simply use + ** it verbatim). + */ + if ( winIsDriveLetterAndColon(zPathname) ){ + return TRUE; + } + + /* + ** If we get to this point, the path name should almost certainly be a purely + ** relative one (i.e. not a UNC name, not absolute, and not volume relative). + */ + return FALSE; +} + +/* +** Turn a relative pathname into a full pathname. Write the full +** pathname into zOut[]. zOut[] will be at least pVfs->mxPathname +** bytes in size. +*/ +static int winFullPathname( + sqlite3_vfs *pVfs, /* Pointer to vfs object */ + const char *zRelative, /* Possibly relative input path */ + int nFull, /* Size of output buffer in bytes */ + char *zFull /* Output buffer */ +){ +#if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && !defined(__CYGWIN__) + DWORD nByte; + void *zConverted; + char *zOut; +#endif + + /* If this path name begins with "/X:", where "X" is any alphabetic + ** character, discard the initial "/" from the pathname. + */ + if( zRelative[0]=='/' && winIsDriveLetterAndColon(zRelative+1) ){ + zRelative++; + } + +#if defined(__CYGWIN__) + SimulateIOError( return SQLITE_ERROR ); + UNUSED_PARAMETER(nFull); + assert( nFull>=pVfs->mxPathname ); + if ( sqlite3_data_directory && !winIsVerbatimPathname(zRelative) ){ + /* + ** NOTE: We are dealing with a relative path name and the data + ** directory has been set. Therefore, use it as the basis + ** for converting the relative path name to an absolute + ** one by prepending the data directory and a slash. + */ + char *zOut = sqlite3MallocZero( pVfs->mxPathname+1 ); + if( !zOut ){ + return SQLITE_IOERR_NOMEM_BKPT; + } + if( cygwin_conv_path( + (osIsNT() ? CCP_POSIX_TO_WIN_W : CCP_POSIX_TO_WIN_A) | + CCP_RELATIVE, zRelative, zOut, pVfs->mxPathname+1)<0 ){ + sqlite3_free(zOut); + return winLogError(SQLITE_CANTOPEN_CONVPATH, (DWORD)errno, + "winFullPathname1", zRelative); + }else{ + char *zUtf8 = winConvertToUtf8Filename(zOut); + if( !zUtf8 ){ + sqlite3_free(zOut); + return SQLITE_IOERR_NOMEM_BKPT; + } + sqlite3_snprintf(MIN(nFull, pVfs->mxPathname), zFull, "%s%c%s", + sqlite3_data_directory, winGetDirSep(), zUtf8); + sqlite3_free(zUtf8); + sqlite3_free(zOut); + } + }else{ + char *zOut = sqlite3MallocZero( pVfs->mxPathname+1 ); + if( !zOut ){ + return SQLITE_IOERR_NOMEM_BKPT; + } + if( cygwin_conv_path( + (osIsNT() ? CCP_POSIX_TO_WIN_W : CCP_POSIX_TO_WIN_A), + zRelative, zOut, pVfs->mxPathname+1)<0 ){ + sqlite3_free(zOut); + return winLogError(SQLITE_CANTOPEN_CONVPATH, (DWORD)errno, + "winFullPathname2", zRelative); + }else{ + char *zUtf8 = winConvertToUtf8Filename(zOut); + if( !zUtf8 ){ + sqlite3_free(zOut); + return SQLITE_IOERR_NOMEM_BKPT; + } + sqlite3_snprintf(MIN(nFull, pVfs->mxPathname), zFull, "%s", zUtf8); + sqlite3_free(zUtf8); + sqlite3_free(zOut); + } + } + return SQLITE_OK; +#endif + +#if (SQLITE_OS_WINCE || SQLITE_OS_WINRT) && !defined(__CYGWIN__) + SimulateIOError( return SQLITE_ERROR ); + /* WinCE has no concept of a relative pathname, or so I am told. */ + /* WinRT has no way to convert a relative path to an absolute one. */ + if ( sqlite3_data_directory && !winIsVerbatimPathname(zRelative) ){ + /* + ** NOTE: We are dealing with a relative path name and the data + ** directory has been set. Therefore, use it as the basis + ** for converting the relative path name to an absolute + ** one by prepending the data directory and a backslash. + */ + sqlite3_snprintf(MIN(nFull, pVfs->mxPathname), zFull, "%s%c%s", + sqlite3_data_directory, winGetDirSep(), zRelative); + }else{ + sqlite3_snprintf(MIN(nFull, pVfs->mxPathname), zFull, "%s", zRelative); + } + return SQLITE_OK; +#endif + +#if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && !defined(__CYGWIN__) + /* It's odd to simulate an io-error here, but really this is just + ** using the io-error infrastructure to test that SQLite handles this + ** function failing. This function could fail if, for example, the + ** current working directory has been unlinked. + */ + SimulateIOError( return SQLITE_ERROR ); + if ( sqlite3_data_directory && !winIsVerbatimPathname(zRelative) ){ + /* + ** NOTE: We are dealing with a relative path name and the data + ** directory has been set. Therefore, use it as the basis + ** for converting the relative path name to an absolute + ** one by prepending the data directory and a backslash. + */ + sqlite3_snprintf(MIN(nFull, pVfs->mxPathname), zFull, "%s%c%s", + sqlite3_data_directory, winGetDirSep(), zRelative); + return SQLITE_OK; + } + zConverted = winConvertFromUtf8Filename(zRelative); + if( zConverted==0 ){ + return SQLITE_IOERR_NOMEM_BKPT; + } + if( osIsNT() ){ + LPWSTR zTemp; + nByte = osGetFullPathNameW((LPCWSTR)zConverted, 0, 0, 0); + if( nByte==0 ){ + sqlite3_free(zConverted); + return winLogError(SQLITE_CANTOPEN_FULLPATH, osGetLastError(), + "winFullPathname1", zRelative); + } + nByte += 3; + zTemp = sqlite3MallocZero( nByte*sizeof(zTemp[0]) ); + if( zTemp==0 ){ + sqlite3_free(zConverted); + return SQLITE_IOERR_NOMEM_BKPT; + } + nByte = osGetFullPathNameW((LPCWSTR)zConverted, nByte, zTemp, 0); + if( nByte==0 ){ + sqlite3_free(zConverted); + sqlite3_free(zTemp); + return winLogError(SQLITE_CANTOPEN_FULLPATH, osGetLastError(), + "winFullPathname2", zRelative); + } + sqlite3_free(zConverted); + zOut = winUnicodeToUtf8(zTemp); + sqlite3_free(zTemp); + } +#ifdef SQLITE_WIN32_HAS_ANSI + else{ + char *zTemp; + nByte = osGetFullPathNameA((char*)zConverted, 0, 0, 0); + if( nByte==0 ){ + sqlite3_free(zConverted); + return winLogError(SQLITE_CANTOPEN_FULLPATH, osGetLastError(), + "winFullPathname3", zRelative); + } + nByte += 3; + zTemp = sqlite3MallocZero( nByte*sizeof(zTemp[0]) ); + if( zTemp==0 ){ + sqlite3_free(zConverted); + return SQLITE_IOERR_NOMEM_BKPT; + } + nByte = osGetFullPathNameA((char*)zConverted, nByte, zTemp, 0); + if( nByte==0 ){ + sqlite3_free(zConverted); + sqlite3_free(zTemp); + return winLogError(SQLITE_CANTOPEN_FULLPATH, osGetLastError(), + "winFullPathname4", zRelative); + } + sqlite3_free(zConverted); + zOut = winMbcsToUtf8(zTemp, osAreFileApisANSI()); + sqlite3_free(zTemp); + } +#endif + if( zOut ){ + sqlite3_snprintf(MIN(nFull, pVfs->mxPathname), zFull, "%s", zOut); + sqlite3_free(zOut); + return SQLITE_OK; + }else{ + return SQLITE_IOERR_NOMEM_BKPT; + } +#endif +} + +#ifndef SQLITE_OMIT_LOAD_EXTENSION +/* +** Interfaces for opening a shared library, finding entry points +** within the shared library, and closing the shared library. +*/ +static void *winDlOpen(sqlite3_vfs *pVfs, const char *zFilename){ + HANDLE h; +#if defined(__CYGWIN__) + int nFull = pVfs->mxPathname+1; + char *zFull = sqlite3MallocZero( nFull ); + void *zConverted = 0; + if( zFull==0 ){ + OSTRACE(("DLOPEN name=%s, handle=%p\n", zFilename, (void*)0)); + return 0; + } + if( winFullPathname(pVfs, zFilename, nFull, zFull)!=SQLITE_OK ){ + sqlite3_free(zFull); + OSTRACE(("DLOPEN name=%s, handle=%p\n", zFilename, (void*)0)); + return 0; + } + zConverted = winConvertFromUtf8Filename(zFull); + sqlite3_free(zFull); +#else + void *zConverted = winConvertFromUtf8Filename(zFilename); + UNUSED_PARAMETER(pVfs); +#endif + if( zConverted==0 ){ + OSTRACE(("DLOPEN name=%s, handle=%p\n", zFilename, (void*)0)); + return 0; + } + if( osIsNT() ){ +#if SQLITE_OS_WINRT + h = osLoadPackagedLibrary((LPCWSTR)zConverted, 0); +#else + h = osLoadLibraryW((LPCWSTR)zConverted); +#endif + } +#ifdef SQLITE_WIN32_HAS_ANSI + else{ + h = osLoadLibraryA((char*)zConverted); + } +#endif + OSTRACE(("DLOPEN name=%s, handle=%p\n", zFilename, (void*)h)); + sqlite3_free(zConverted); + return (void*)h; +} +static void winDlError(sqlite3_vfs *pVfs, int nBuf, char *zBufOut){ + UNUSED_PARAMETER(pVfs); + winGetLastErrorMsg(osGetLastError(), nBuf, zBufOut); +} +static void (*winDlSym(sqlite3_vfs *pVfs,void *pH,const char *zSym))(void){ + FARPROC proc; + UNUSED_PARAMETER(pVfs); + proc = osGetProcAddressA((HANDLE)pH, zSym); + OSTRACE(("DLSYM handle=%p, symbol=%s, address=%p\n", + (void*)pH, zSym, (void*)proc)); + return (void(*)(void))proc; +} +static void winDlClose(sqlite3_vfs *pVfs, void *pHandle){ + UNUSED_PARAMETER(pVfs); + osFreeLibrary((HANDLE)pHandle); + OSTRACE(("DLCLOSE handle=%p\n", (void*)pHandle)); +} +#else /* if SQLITE_OMIT_LOAD_EXTENSION is defined: */ + #define winDlOpen 0 + #define winDlError 0 + #define winDlSym 0 + #define winDlClose 0 +#endif + +/* State information for the randomness gatherer. */ +typedef struct EntropyGatherer EntropyGatherer; +struct EntropyGatherer { + unsigned char *a; /* Gather entropy into this buffer */ + int na; /* Size of a[] in bytes */ + int i; /* XOR next input into a[i] */ + int nXor; /* Number of XOR operations done */ +}; + +#if !defined(SQLITE_TEST) && !defined(SQLITE_OMIT_RANDOMNESS) +/* Mix sz bytes of entropy into p. */ +static void xorMemory(EntropyGatherer *p, unsigned char *x, int sz){ + int j, k; + for(j=0, k=p->i; ja[k++] ^= x[j]; + if( k>=p->na ) k = 0; + } + p->i = k; + p->nXor += sz; +} +#endif /* !defined(SQLITE_TEST) && !defined(SQLITE_OMIT_RANDOMNESS) */ + +/* +** Write up to nBuf bytes of randomness into zBuf. +*/ +static int winRandomness(sqlite3_vfs *pVfs, int nBuf, char *zBuf){ +#if defined(SQLITE_TEST) || defined(SQLITE_OMIT_RANDOMNESS) + UNUSED_PARAMETER(pVfs); + memset(zBuf, 0, nBuf); + return nBuf; +#else + EntropyGatherer e; + UNUSED_PARAMETER(pVfs); + memset(zBuf, 0, nBuf); +#if defined(_MSC_VER) && _MSC_VER>=1400 && !SQLITE_OS_WINCE + rand_s((unsigned int*)zBuf); /* rand_s() is not available with MinGW */ +#endif /* defined(_MSC_VER) && _MSC_VER>=1400 */ + e.a = (unsigned char*)zBuf; + e.na = nBuf; + e.nXor = 0; + e.i = 0; + { + SYSTEMTIME x; + osGetSystemTime(&x); + xorMemory(&e, (unsigned char*)&x, sizeof(SYSTEMTIME)); + } + { + DWORD pid = osGetCurrentProcessId(); + xorMemory(&e, (unsigned char*)&pid, sizeof(DWORD)); + } +#if SQLITE_OS_WINRT + { + ULONGLONG cnt = osGetTickCount64(); + xorMemory(&e, (unsigned char*)&cnt, sizeof(ULONGLONG)); + } +#else + { + DWORD cnt = osGetTickCount(); + xorMemory(&e, (unsigned char*)&cnt, sizeof(DWORD)); + } +#endif /* SQLITE_OS_WINRT */ + { + LARGE_INTEGER i; + osQueryPerformanceCounter(&i); + xorMemory(&e, (unsigned char*)&i, sizeof(LARGE_INTEGER)); + } +#if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && SQLITE_WIN32_USE_UUID + { + UUID id; + memset(&id, 0, sizeof(UUID)); + osUuidCreate(&id); + xorMemory(&e, (unsigned char*)&id, sizeof(UUID)); + memset(&id, 0, sizeof(UUID)); + osUuidCreateSequential(&id); + xorMemory(&e, (unsigned char*)&id, sizeof(UUID)); + } +#endif /* !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && SQLITE_WIN32_USE_UUID */ + return e.nXor>nBuf ? nBuf : e.nXor; +#endif /* defined(SQLITE_TEST) || defined(SQLITE_OMIT_RANDOMNESS) */ +} + + +/* +** Sleep for a little while. Return the amount of time slept. +*/ +static int winSleep(sqlite3_vfs *pVfs, int microsec){ + sqlite3_win32_sleep((microsec+999)/1000); + UNUSED_PARAMETER(pVfs); + return ((microsec+999)/1000)*1000; +} + +/* +** The following variable, if set to a non-zero value, is interpreted as +** the number of seconds since 1970 and is used to set the result of +** sqlite3OsCurrentTime() during testing. +*/ +#ifdef SQLITE_TEST +SQLITE_API int sqlite3_current_time = 0; /* Fake system time in seconds since 1970. */ +#endif + +/* +** Find the current time (in Universal Coordinated Time). Write into *piNow +** the current time and date as a Julian Day number times 86_400_000. In +** other words, write into *piNow the number of milliseconds since the Julian +** epoch of noon in Greenwich on November 24, 4714 B.C according to the +** proleptic Gregorian calendar. +** +** On success, return SQLITE_OK. Return SQLITE_ERROR if the time and date +** cannot be found. +*/ +static int winCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *piNow){ + /* FILETIME structure is a 64-bit value representing the number of + 100-nanosecond intervals since January 1, 1601 (= JD 2305813.5). + */ + FILETIME ft; + static const sqlite3_int64 winFiletimeEpoch = 23058135*(sqlite3_int64)8640000; +#ifdef SQLITE_TEST + static const sqlite3_int64 unixEpoch = 24405875*(sqlite3_int64)8640000; +#endif + /* 2^32 - to avoid use of LL and warnings in gcc */ + static const sqlite3_int64 max32BitValue = + (sqlite3_int64)2000000000 + (sqlite3_int64)2000000000 + + (sqlite3_int64)294967296; + +#if SQLITE_OS_WINCE + SYSTEMTIME time; + osGetSystemTime(&time); + /* if SystemTimeToFileTime() fails, it returns zero. */ + if (!osSystemTimeToFileTime(&time,&ft)){ + return SQLITE_ERROR; + } +#else + osGetSystemTimeAsFileTime( &ft ); +#endif + + *piNow = winFiletimeEpoch + + ((((sqlite3_int64)ft.dwHighDateTime)*max32BitValue) + + (sqlite3_int64)ft.dwLowDateTime)/(sqlite3_int64)10000; + +#ifdef SQLITE_TEST + if( sqlite3_current_time ){ + *piNow = 1000*(sqlite3_int64)sqlite3_current_time + unixEpoch; + } +#endif + UNUSED_PARAMETER(pVfs); + return SQLITE_OK; +} + +/* +** Find the current time (in Universal Coordinated Time). Write the +** current time and date as a Julian Day number into *prNow and +** return 0. Return 1 if the time and date cannot be found. +*/ +static int winCurrentTime(sqlite3_vfs *pVfs, double *prNow){ + int rc; + sqlite3_int64 i; + rc = winCurrentTimeInt64(pVfs, &i); + if( !rc ){ + *prNow = i/86400000.0; + } + return rc; +} + +/* +** The idea is that this function works like a combination of +** GetLastError() and FormatMessage() on Windows (or errno and +** strerror_r() on Unix). After an error is returned by an OS +** function, SQLite calls this function with zBuf pointing to +** a buffer of nBuf bytes. The OS layer should populate the +** buffer with a nul-terminated UTF-8 encoded error message +** describing the last IO error to have occurred within the calling +** thread. +** +** If the error message is too large for the supplied buffer, +** it should be truncated. The return value of xGetLastError +** is zero if the error message fits in the buffer, or non-zero +** otherwise (if the message was truncated). If non-zero is returned, +** then it is not necessary to include the nul-terminator character +** in the output buffer. +** +** Not supplying an error message will have no adverse effect +** on SQLite. It is fine to have an implementation that never +** returns an error message: +** +** int xGetLastError(sqlite3_vfs *pVfs, int nBuf, char *zBuf){ +** assert(zBuf[0]=='\0'); +** return 0; +** } +** +** However if an error message is supplied, it will be incorporated +** by sqlite into the error message available to the user using +** sqlite3_errmsg(), possibly making IO errors easier to debug. +*/ +static int winGetLastError(sqlite3_vfs *pVfs, int nBuf, char *zBuf){ + DWORD e = osGetLastError(); + UNUSED_PARAMETER(pVfs); + if( nBuf>0 ) winGetLastErrorMsg(e, nBuf, zBuf); + return e; +} + +/* +** Initialize and deinitialize the operating system interface. +*/ +SQLITE_API int sqlite3_os_init(void){ + static sqlite3_vfs winVfs = { + 3, /* iVersion */ + sizeof(winFile), /* szOsFile */ + SQLITE_WIN32_MAX_PATH_BYTES, /* mxPathname */ + 0, /* pNext */ + "win32", /* zName */ + &winAppData, /* pAppData */ + winOpen, /* xOpen */ + winDelete, /* xDelete */ + winAccess, /* xAccess */ + winFullPathname, /* xFullPathname */ + winDlOpen, /* xDlOpen */ + winDlError, /* xDlError */ + winDlSym, /* xDlSym */ + winDlClose, /* xDlClose */ + winRandomness, /* xRandomness */ + winSleep, /* xSleep */ + winCurrentTime, /* xCurrentTime */ + winGetLastError, /* xGetLastError */ + winCurrentTimeInt64, /* xCurrentTimeInt64 */ + winSetSystemCall, /* xSetSystemCall */ + winGetSystemCall, /* xGetSystemCall */ + winNextSystemCall, /* xNextSystemCall */ + }; +#if defined(SQLITE_WIN32_HAS_WIDE) + static sqlite3_vfs winLongPathVfs = { + 3, /* iVersion */ + sizeof(winFile), /* szOsFile */ + SQLITE_WINNT_MAX_PATH_BYTES, /* mxPathname */ + 0, /* pNext */ + "win32-longpath", /* zName */ + &winAppData, /* pAppData */ + winOpen, /* xOpen */ + winDelete, /* xDelete */ + winAccess, /* xAccess */ + winFullPathname, /* xFullPathname */ + winDlOpen, /* xDlOpen */ + winDlError, /* xDlError */ + winDlSym, /* xDlSym */ + winDlClose, /* xDlClose */ + winRandomness, /* xRandomness */ + winSleep, /* xSleep */ + winCurrentTime, /* xCurrentTime */ + winGetLastError, /* xGetLastError */ + winCurrentTimeInt64, /* xCurrentTimeInt64 */ + winSetSystemCall, /* xSetSystemCall */ + winGetSystemCall, /* xGetSystemCall */ + winNextSystemCall, /* xNextSystemCall */ + }; +#endif + static sqlite3_vfs winNolockVfs = { + 3, /* iVersion */ + sizeof(winFile), /* szOsFile */ + SQLITE_WIN32_MAX_PATH_BYTES, /* mxPathname */ + 0, /* pNext */ + "win32-none", /* zName */ + &winNolockAppData, /* pAppData */ + winOpen, /* xOpen */ + winDelete, /* xDelete */ + winAccess, /* xAccess */ + winFullPathname, /* xFullPathname */ + winDlOpen, /* xDlOpen */ + winDlError, /* xDlError */ + winDlSym, /* xDlSym */ + winDlClose, /* xDlClose */ + winRandomness, /* xRandomness */ + winSleep, /* xSleep */ + winCurrentTime, /* xCurrentTime */ + winGetLastError, /* xGetLastError */ + winCurrentTimeInt64, /* xCurrentTimeInt64 */ + winSetSystemCall, /* xSetSystemCall */ + winGetSystemCall, /* xGetSystemCall */ + winNextSystemCall, /* xNextSystemCall */ + }; +#if defined(SQLITE_WIN32_HAS_WIDE) + static sqlite3_vfs winLongPathNolockVfs = { + 3, /* iVersion */ + sizeof(winFile), /* szOsFile */ + SQLITE_WINNT_MAX_PATH_BYTES, /* mxPathname */ + 0, /* pNext */ + "win32-longpath-none", /* zName */ + &winNolockAppData, /* pAppData */ + winOpen, /* xOpen */ + winDelete, /* xDelete */ + winAccess, /* xAccess */ + winFullPathname, /* xFullPathname */ + winDlOpen, /* xDlOpen */ + winDlError, /* xDlError */ + winDlSym, /* xDlSym */ + winDlClose, /* xDlClose */ + winRandomness, /* xRandomness */ + winSleep, /* xSleep */ + winCurrentTime, /* xCurrentTime */ + winGetLastError, /* xGetLastError */ + winCurrentTimeInt64, /* xCurrentTimeInt64 */ + winSetSystemCall, /* xSetSystemCall */ + winGetSystemCall, /* xGetSystemCall */ + winNextSystemCall, /* xNextSystemCall */ + }; +#endif + + /* Double-check that the aSyscall[] array has been constructed + ** correctly. See ticket [bb3a86e890c8e96ab] */ + assert( ArraySize(aSyscall)==80 ); + + /* get memory map allocation granularity */ + memset(&winSysInfo, 0, sizeof(SYSTEM_INFO)); +#if SQLITE_OS_WINRT + osGetNativeSystemInfo(&winSysInfo); +#else + osGetSystemInfo(&winSysInfo); +#endif + assert( winSysInfo.dwAllocationGranularity>0 ); + assert( winSysInfo.dwPageSize>0 ); + + sqlite3_vfs_register(&winVfs, 1); + +#if defined(SQLITE_WIN32_HAS_WIDE) + sqlite3_vfs_register(&winLongPathVfs, 0); +#endif + + sqlite3_vfs_register(&winNolockVfs, 0); + +#if defined(SQLITE_WIN32_HAS_WIDE) + sqlite3_vfs_register(&winLongPathNolockVfs, 0); +#endif + + return SQLITE_OK; +} + +SQLITE_API int sqlite3_os_end(void){ +#if SQLITE_OS_WINRT + if( sleepObj!=NULL ){ + osCloseHandle(sleepObj); + sleepObj = NULL; + } +#endif + return SQLITE_OK; +} + +#endif /* SQLITE_OS_WIN */ + +/************** End of os_win.c **********************************************/ +/************** Begin file bitvec.c ******************************************/ +/* +** 2008 February 16 +** +** 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 implements an object that represents a fixed-length +** bitmap. Bits are numbered starting with 1. +** +** A bitmap is used to record which pages of a database file have been +** journalled during a transaction, or which pages have the "dont-write" +** property. Usually only a few pages are meet either condition. +** So the bitmap is usually sparse and has low cardinality. +** But sometimes (for example when during a DROP of a large table) most +** or all of the pages in a database can get journalled. In those cases, +** the bitmap becomes dense with high cardinality. The algorithm needs +** to handle both cases well. +** +** The size of the bitmap is fixed when the object is created. +** +** All bits are clear when the bitmap is created. Individual bits +** may be set or cleared one at a time. +** +** Test operations are about 100 times more common that set operations. +** Clear operations are exceedingly rare. There are usually between +** 5 and 500 set operations per Bitvec object, though the number of sets can +** sometimes grow into tens of thousands or larger. The size of the +** 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. +*/ +/* #include "sqliteInt.h" */ + +/* Size of the Bitvec structure in bytes. */ +#define BITVEC_SZ 512 + +/* Round the union size down to the nearest pointer boundary, since that's how +** it will be aligned within the Bitvec struct. */ +#define BITVEC_USIZE \ + (((BITVEC_SZ-(3*sizeof(u32)))/sizeof(Bitvec*))*sizeof(Bitvec*)) + +/* Type of the array "element" for the bitmap representation. +** Should be a power of 2, and ideally, evenly divide into BITVEC_USIZE. +** Setting this to the "natural word" size of your CPU may improve +** performance. */ +#define BITVEC_TELEM u8 +/* Size, in bits, of the bitmap element. */ +#define BITVEC_SZELEM 8 +/* Number of elements in a bitmap array. */ +#define BITVEC_NELEM (BITVEC_USIZE/sizeof(BITVEC_TELEM)) +/* Number of bits in the bitmap array. */ +#define BITVEC_NBIT (BITVEC_NELEM*BITVEC_SZELEM) + +/* Number of u32 values in hash table. */ +#define BITVEC_NINT (BITVEC_USIZE/sizeof(u32)) +/* Maximum number of entries in hash table before +** sub-dividing and re-hashing. */ +#define BITVEC_MXHASH (BITVEC_NINT/2) +/* Hashing function for the aHash representation. +** Empirical testing showed that the *37 multiplier +** (an arbitrary prime)in the hash function provided +** no fewer collisions than the no-op *1. */ +#define BITVEC_HASH(X) (((X)*1)%BITVEC_NINT) + +#define BITVEC_NPTR (BITVEC_USIZE/sizeof(Bitvec *)) + + +/* +** A bitmap is an instance of the following structure. +** +** This bitmap records the existence of zero or more bits +** with values between 1 and iSize, inclusive. +** +** There are three possible representations of the bitmap. +** If iSize<=BITVEC_NBIT, then Bitvec.u.aBitmap[] is a straight +** bitmap. The least significant bit is bit 1. +** +** If iSize>BITVEC_NBIT and iDivisor==0 then Bitvec.u.aHash[] is +** a hash table that will hold up to BITVEC_MXHASH distinct values. +** +** Otherwise, the value i is redirected into one of BITVEC_NPTR +** sub-bitmaps pointed to by Bitvec.u.apSub[]. Each subbitmap +** handles up to iDivisor separate values of i. apSub[0] holds +** values between 1 and iDivisor. apSub[1] holds values between +** iDivisor+1 and 2*iDivisor. apSub[N] holds values between +** N*iDivisor+1 and (N+1)*iDivisor. Each subbitmap is normalized +** to hold deal with values between 1 and iDivisor. +*/ +struct Bitvec { + u32 iSize; /* Maximum bit index. Max iSize is 4,294,967,296. */ + u32 nSet; /* Number of bits that are set - only valid for aHash + ** element. Max is BITVEC_NINT. For BITVEC_SZ of 512, + ** this would be 125. */ + u32 iDivisor; /* Number of bits handled by each apSub[] entry. */ + /* Should >=0 for apSub element. */ + /* Max iDivisor is max(u32) / BITVEC_NPTR + 1. */ + /* For a BITVEC_SZ of 512, this would be 34,359,739. */ + union { + BITVEC_TELEM aBitmap[BITVEC_NELEM]; /* Bitmap representation */ + u32 aHash[BITVEC_NINT]; /* Hash table representation */ + Bitvec *apSub[BITVEC_NPTR]; /* Recursive representation */ + } u; +}; + +/* +** Create a new bitmap object able to handle bits between 0 and iSize, +** inclusive. Return a pointer to the new object. Return NULL if +** malloc fails. +*/ +SQLITE_PRIVATE Bitvec *sqlite3BitvecCreate(u32 iSize){ + Bitvec *p; + assert( sizeof(*p)==BITVEC_SZ ); + p = sqlite3MallocZero( sizeof(*p) ); + if( p ){ + p->iSize = iSize; + } + return p; +} + +/* +** Check to see if the i-th bit is set. Return true or false. +** If p is NULL (if the bitmap has not been created) or if +** i is out of range, then return false. +*/ +SQLITE_PRIVATE int sqlite3BitvecTestNotNull(Bitvec *p, u32 i){ + assert( p!=0 ); + i--; + if( i>=p->iSize ) return 0; + while( p->iDivisor ){ + u32 bin = i/p->iDivisor; + i = i%p->iDivisor; + p = p->u.apSub[bin]; + if (!p) { + return 0; + } + } + if( p->iSize<=BITVEC_NBIT ){ + return (p->u.aBitmap[i/BITVEC_SZELEM] & (1<<(i&(BITVEC_SZELEM-1))))!=0; + } else{ + u32 h = BITVEC_HASH(i++); + while( p->u.aHash[h] ){ + if( p->u.aHash[h]==i ) return 1; + h = (h+1) % BITVEC_NINT; + } + return 0; + } +} +SQLITE_PRIVATE int sqlite3BitvecTest(Bitvec *p, u32 i){ + return p!=0 && sqlite3BitvecTestNotNull(p,i); +} + +/* +** Set the i-th bit. Return 0 on success and an error code if +** anything goes wrong. +** +** This routine might cause sub-bitmaps to be allocated. Failing +** to get the memory needed to hold the sub-bitmap is the only +** that can go wrong with an insert, assuming p and i are valid. +** +** The calling function must ensure that p is a valid Bitvec object +** and that the value for "i" is within range of the Bitvec object. +** Otherwise the behavior is undefined. +*/ +SQLITE_PRIVATE int sqlite3BitvecSet(Bitvec *p, u32 i){ + u32 h; + if( p==0 ) return SQLITE_OK; + assert( i>0 ); + assert( i<=p->iSize ); + i--; + while((p->iSize > BITVEC_NBIT) && p->iDivisor) { + u32 bin = i/p->iDivisor; + i = i%p->iDivisor; + if( p->u.apSub[bin]==0 ){ + p->u.apSub[bin] = sqlite3BitvecCreate( p->iDivisor ); + if( p->u.apSub[bin]==0 ) return SQLITE_NOMEM_BKPT; + } + p = p->u.apSub[bin]; + } + if( p->iSize<=BITVEC_NBIT ){ + p->u.aBitmap[i/BITVEC_SZELEM] |= 1 << (i&(BITVEC_SZELEM-1)); + return SQLITE_OK; + } + h = BITVEC_HASH(i++); + /* if there wasn't a hash collision, and this doesn't */ + /* completely fill the hash, then just add it without */ + /* worring about sub-dividing and re-hashing. */ + if( !p->u.aHash[h] ){ + if (p->nSet<(BITVEC_NINT-1)) { + goto bitvec_set_end; + } else { + goto bitvec_set_rehash; + } + } + /* there was a collision, check to see if it's already */ + /* in hash, if not, try to find a spot for it */ + do { + if( p->u.aHash[h]==i ) return SQLITE_OK; + h++; + if( h>=BITVEC_NINT ) h = 0; + } while( p->u.aHash[h] ); + /* we didn't find it in the hash. h points to the first */ + /* available free spot. check to see if this is going to */ + /* make our hash too "full". */ +bitvec_set_rehash: + if( p->nSet>=BITVEC_MXHASH ){ + unsigned int j; + int rc; + u32 *aiValues = sqlite3StackAllocRaw(0, sizeof(p->u.aHash)); + if( aiValues==0 ){ + return SQLITE_NOMEM_BKPT; + }else{ + memcpy(aiValues, p->u.aHash, sizeof(p->u.aHash)); + memset(p->u.apSub, 0, sizeof(p->u.apSub)); + p->iDivisor = (p->iSize + BITVEC_NPTR - 1)/BITVEC_NPTR; + rc = sqlite3BitvecSet(p, i); + for(j=0; jnSet++; + p->u.aHash[h] = i; + return SQLITE_OK; +} + +/* +** Clear the i-th bit. +** +** pBuf must be a pointer to at least BITVEC_SZ bytes of temporary storage +** that BitvecClear can use to rebuilt its hash table. +*/ +SQLITE_PRIVATE void sqlite3BitvecClear(Bitvec *p, u32 i, void *pBuf){ + if( p==0 ) return; + assert( i>0 ); + i--; + while( p->iDivisor ){ + u32 bin = i/p->iDivisor; + i = i%p->iDivisor; + p = p->u.apSub[bin]; + if (!p) { + return; + } + } + if( p->iSize<=BITVEC_NBIT ){ + p->u.aBitmap[i/BITVEC_SZELEM] &= ~(1 << (i&(BITVEC_SZELEM-1))); + }else{ + unsigned int j; + u32 *aiValues = pBuf; + memcpy(aiValues, p->u.aHash, sizeof(p->u.aHash)); + memset(p->u.aHash, 0, sizeof(p->u.aHash)); + p->nSet = 0; + for(j=0; jnSet++; + while( p->u.aHash[h] ){ + h++; + if( h>=BITVEC_NINT ) h = 0; + } + p->u.aHash[h] = aiValues[j]; + } + } + } +} + +/* +** Destroy a bitmap object. Reclaim all memory used. +*/ +SQLITE_PRIVATE void sqlite3BitvecDestroy(Bitvec *p){ + if( p==0 ) return; + if( p->iDivisor ){ + unsigned int i; + for(i=0; iu.apSub[i]); + } + } + sqlite3_free(p); +} + +/* +** Return the value of the iSize parameter specified when Bitvec *p +** was created. +*/ +SQLITE_PRIVATE u32 sqlite3BitvecSize(Bitvec *p){ + return p->iSize; +} + +#ifndef SQLITE_OMIT_BUILTIN_TEST +/* +** Let V[] be an array of unsigned characters sufficient to hold +** up to N bits. Let I be an integer between 0 and N. 0<=I>3] |= (1<<(I&7)) +#define CLEARBIT(V,I) V[I>>3] &= ~(1<<(I&7)) +#define TESTBIT(V,I) (V[I>>3]&(1<<(I&7)))!=0 + +/* +** This routine runs an extensive test of the Bitvec code. +** +** The input is an array of integers that acts as a program +** to test the Bitvec. The integers are opcodes followed +** by 0, 1, or 3 operands, depending on the opcode. Another +** opcode follows immediately after the last operand. +** +** There are 6 opcodes numbered from 0 through 5. 0 is the +** "halt" opcode and causes the test to end. +** +** 0 Halt and return the number of errors +** 1 N S X Set N bits beginning with S and incrementing by X +** 2 N S X Clear N bits beginning with S and incrementing by X +** 3 N Set N randomly chosen bits +** 4 N Clear N randomly chosen bits +** 5 N S X Set N bits from S increment X in array only, not in bitvec +** +** The opcodes 1 through 4 perform set and clear operations are performed +** on both a Bitvec object and on a linear array of bits obtained from malloc. +** Opcode 5 works on the linear array only, not on the Bitvec. +** Opcode 5 is used to deliberately induce a fault in order to +** confirm that error detection works. +** +** At the conclusion of the test the linear array is compared +** against the Bitvec object. If there are any differences, +** an error is returned. If they are the same, zero is returned. +** +** If a memory allocation error occurs, return -1. +*/ +SQLITE_PRIVATE int sqlite3BitvecBuiltinTest(int sz, int *aOp){ + Bitvec *pBitvec = 0; + unsigned char *pV = 0; + int rc = -1; + int i, nx, pc, op; + void *pTmpSpace; + + /* Allocate the Bitvec to be tested and a linear array of + ** bits to act as the reference */ + pBitvec = sqlite3BitvecCreate( sz ); + pV = sqlite3MallocZero( (sz+7)/8 + 1 ); + pTmpSpace = sqlite3_malloc64(BITVEC_SZ); + if( pBitvec==0 || pV==0 || pTmpSpace==0 ) goto bitvec_end; + + /* NULL pBitvec tests */ + sqlite3BitvecSet(0, 1); + sqlite3BitvecClear(0, 1, pTmpSpace); + + /* Run the program */ + pc = 0; + while( (op = aOp[pc])!=0 ){ + switch( op ){ + case 1: + case 2: + case 5: { + nx = 4; + i = aOp[pc+2] - 1; + aOp[pc+2] += aOp[pc+3]; + break; + } + case 3: + case 4: + default: { + nx = 2; + sqlite3_randomness(sizeof(i), &i); + break; + } + } + if( (--aOp[pc+1]) > 0 ) nx = 0; + pc += nx; + i = (i & 0x7fffffff)%sz; + if( (op & 1)!=0 ){ + SETBIT(pV, (i+1)); + if( op!=5 ){ + if( sqlite3BitvecSet(pBitvec, i+1) ) goto bitvec_end; + } + }else{ + CLEARBIT(pV, (i+1)); + sqlite3BitvecClear(pBitvec, i+1, pTmpSpace); + } + } + + /* Test to make sure the linear array exactly matches the + ** Bitvec object. Start with the assumption that they do + ** match (rc==0). Change rc to non-zero if a discrepancy + ** is found. + */ + rc = sqlite3BitvecTest(0,0) + sqlite3BitvecTest(pBitvec, sz+1) + + sqlite3BitvecTest(pBitvec, 0) + + (sqlite3BitvecSize(pBitvec) - sz); + for(i=1; i<=sz; i++){ + if( (TESTBIT(pV,i))!=sqlite3BitvecTest(pBitvec,i) ){ + rc = i; + break; + } + } + + /* Free allocated structure */ +bitvec_end: + sqlite3_free(pTmpSpace); + sqlite3_free(pV); + sqlite3BitvecDestroy(pBitvec); + return rc; +} +#endif /* SQLITE_OMIT_BUILTIN_TEST */ + +/************** End of bitvec.c **********************************************/ +/************** Begin file pcache.c ******************************************/ +/* +** 2008 August 05 +** +** 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 implements that page cache. +*/ +/* #include "sqliteInt.h" */ + +/* +** A complete page cache is an instance of this structure. Every +** entry in the cache holds a single page of the database file. The +** btree layer only operates on the cached copy of the database pages. +** +** A page cache entry is "clean" if it exactly matches what is currently +** on disk. A page is "dirty" if it has been modified and needs to be +** persisted to disk. +** +** pDirty, pDirtyTail, pSynced: +** All dirty pages are linked into the doubly linked list using +** PgHdr.pDirtyNext and pDirtyPrev. The list is maintained in LRU order +** such that p was added to the list more recently than p->pDirtyNext. +** PCache.pDirty points to the first (newest) element in the list and +** pDirtyTail to the last (oldest). +** +** The PCache.pSynced variable is used to optimize searching for a dirty +** page to eject from the cache mid-transaction. It is better to eject +** a page that does not require a journal sync than one that does. +** Therefore, pSynced is maintained to that it *almost* always points +** to either the oldest page in the pDirty/pDirtyTail list that has a +** clear PGHDR_NEED_SYNC flag or to a page that is older than this one +** (so that the right page to eject can be found by following pDirtyPrev +** pointers). +*/ +struct PCache { + PgHdr *pDirty, *pDirtyTail; /* List of dirty pages in LRU order */ + PgHdr *pSynced; /* Last synced page in dirty page list */ + int nRefSum; /* Sum of ref counts over all pages */ + int szCache; /* Configured cache size */ + int szSpill; /* Size before spilling occurs */ + int szPage; /* Size of every page in this cache */ + int szExtra; /* Size of extra space for each page */ + u8 bPurgeable; /* True if pages are on backing store */ + u8 eCreate; /* eCreate value for for xFetch() */ + int (*xStress)(void*,PgHdr*); /* Call to try make a page clean */ + void *pStress; /* Argument to xStress */ + sqlite3_pcache *pCache; /* Pluggable cache module */ +}; + +/********************************** Test and Debug Logic **********************/ +/* +** Debug tracing macros. Enable by by changing the "0" to "1" and +** recompiling. +** +** When sqlite3PcacheTrace is 1, single line trace messages are issued. +** When sqlite3PcacheTrace is 2, a dump of the pcache showing all cache entries +** is displayed for many operations, resulting in a lot of output. +*/ +#if defined(SQLITE_DEBUG) && 0 + int sqlite3PcacheTrace = 2; /* 0: off 1: simple 2: cache dumps */ + int sqlite3PcacheMxDump = 9999; /* Max cache entries for pcacheDump() */ +# define pcacheTrace(X) if(sqlite3PcacheTrace){sqlite3DebugPrintf X;} + void pcacheDump(PCache *pCache){ + int N; + int i, j; + sqlite3_pcache_page *pLower; + PgHdr *pPg; + unsigned char *a; + + if( sqlite3PcacheTrace<2 ) return; + if( pCache->pCache==0 ) return; + N = sqlite3PcachePagecount(pCache); + if( N>sqlite3PcacheMxDump ) N = sqlite3PcacheMxDump; + for(i=1; i<=N; i++){ + pLower = sqlite3GlobalConfig.pcache2.xFetch(pCache->pCache, i, 0); + if( pLower==0 ) continue; + pPg = (PgHdr*)pLower->pExtra; + printf("%3d: nRef %2d flgs %02x data ", i, pPg->nRef, pPg->flags); + a = (unsigned char *)pLower->pBuf; + for(j=0; j<12; j++) printf("%02x", a[j]); + printf("\n"); + if( pPg->pPage==0 ){ + sqlite3GlobalConfig.pcache2.xUnpin(pCache->pCache, pLower, 0); + } + } + } + #else +# define pcacheTrace(X) +# define pcacheDump(X) +#endif + +/* +** Check invariants on a PgHdr entry. Return true if everything is OK. +** Return false if any invariant is violated. +** +** This routine is for use inside of assert() statements only. For +** example: +** +** assert( sqlite3PcachePageSanity(pPg) ); +*/ +#if SQLITE_DEBUG +SQLITE_PRIVATE int sqlite3PcachePageSanity(PgHdr *pPg){ + PCache *pCache; + assert( pPg!=0 ); + assert( pPg->pgno>0 ); /* Page number is 1 or more */ + pCache = pPg->pCache; + assert( pCache!=0 ); /* Every page has an associated PCache */ + if( pPg->flags & PGHDR_CLEAN ){ + assert( (pPg->flags & PGHDR_DIRTY)==0 );/* Cannot be both CLEAN and DIRTY */ + assert( pCache->pDirty!=pPg ); /* CLEAN pages not on dirty list */ + assert( pCache->pDirtyTail!=pPg ); + } + /* WRITEABLE pages must also be DIRTY */ + if( pPg->flags & PGHDR_WRITEABLE ){ + assert( pPg->flags & PGHDR_DIRTY ); /* WRITEABLE implies DIRTY */ + } + /* NEED_SYNC can be set independently of WRITEABLE. This can happen, + ** for example, when using the sqlite3PagerDontWrite() optimization: + ** (1) Page X is journalled, and gets WRITEABLE and NEED_SEEK. + ** (2) Page X moved to freelist, WRITEABLE is cleared + ** (3) Page X reused, WRITEABLE is set again + ** If NEED_SYNC had been cleared in step 2, then it would not be reset + ** in step 3, and page might be written into the database without first + ** syncing the rollback journal, which might cause corruption on a power + ** loss. + ** + ** Another example is when the database page size is smaller than the + ** disk sector size. When any page of a sector is journalled, all pages + ** in that sector are marked NEED_SYNC even if they are still CLEAN, just + ** in case they are later modified, since all pages in the same sector + ** must be journalled and synced before any of those pages can be safely + ** written. + */ + return 1; +} +#endif /* SQLITE_DEBUG */ + + +/********************************** Linked List Management ********************/ + +/* Allowed values for second argument to pcacheManageDirtyList() */ +#define PCACHE_DIRTYLIST_REMOVE 1 /* Remove pPage from dirty list */ +#define PCACHE_DIRTYLIST_ADD 2 /* Add pPage to the dirty list */ +#define PCACHE_DIRTYLIST_FRONT 3 /* Move pPage to the front of the list */ + +/* +** Manage pPage's participation on the dirty list. Bits of the addRemove +** argument determines what operation to do. The 0x01 bit means first +** remove pPage from the dirty list. The 0x02 means add pPage back to +** the dirty list. Doing both moves pPage to the front of the dirty list. +*/ +static void pcacheManageDirtyList(PgHdr *pPage, u8 addRemove){ + PCache *p = pPage->pCache; + + pcacheTrace(("%p.DIRTYLIST.%s %d\n", p, + addRemove==1 ? "REMOVE" : addRemove==2 ? "ADD" : "FRONT", + pPage->pgno)); + if( addRemove & PCACHE_DIRTYLIST_REMOVE ){ + assert( pPage->pDirtyNext || pPage==p->pDirtyTail ); + assert( pPage->pDirtyPrev || pPage==p->pDirty ); + + /* Update the PCache1.pSynced variable if necessary. */ + if( p->pSynced==pPage ){ + p->pSynced = pPage->pDirtyPrev; + } + + if( pPage->pDirtyNext ){ + pPage->pDirtyNext->pDirtyPrev = pPage->pDirtyPrev; + }else{ + assert( pPage==p->pDirtyTail ); + p->pDirtyTail = pPage->pDirtyPrev; + } + if( pPage->pDirtyPrev ){ + pPage->pDirtyPrev->pDirtyNext = pPage->pDirtyNext; + }else{ + /* If there are now no dirty pages in the cache, set eCreate to 2. + ** This is an optimization that allows sqlite3PcacheFetch() to skip + ** searching for a dirty page to eject from the cache when it might + ** otherwise have to. */ + assert( pPage==p->pDirty ); + p->pDirty = pPage->pDirtyNext; + assert( p->bPurgeable || p->eCreate==2 ); + if( p->pDirty==0 ){ /*OPTIMIZATION-IF-TRUE*/ + assert( p->bPurgeable==0 || p->eCreate==1 ); + p->eCreate = 2; + } + } + pPage->pDirtyNext = 0; + pPage->pDirtyPrev = 0; + } + if( addRemove & PCACHE_DIRTYLIST_ADD ){ + assert( pPage->pDirtyNext==0 && pPage->pDirtyPrev==0 && p->pDirty!=pPage ); + + pPage->pDirtyNext = p->pDirty; + if( pPage->pDirtyNext ){ + assert( pPage->pDirtyNext->pDirtyPrev==0 ); + pPage->pDirtyNext->pDirtyPrev = pPage; + }else{ + p->pDirtyTail = pPage; + if( p->bPurgeable ){ + assert( p->eCreate==2 ); + p->eCreate = 1; + } + } + p->pDirty = pPage; + + /* If pSynced is NULL and this page has a clear NEED_SYNC flag, set + ** pSynced to point to it. Checking the NEED_SYNC flag is an + ** optimization, as if pSynced points to a page with the NEED_SYNC + ** flag set sqlite3PcacheFetchStress() searches through all newer + ** entries of the dirty-list for a page with NEED_SYNC clear anyway. */ + if( !p->pSynced + && 0==(pPage->flags&PGHDR_NEED_SYNC) /*OPTIMIZATION-IF-FALSE*/ + ){ + p->pSynced = pPage; + } + } + pcacheDump(p); +} + +/* +** Wrapper around the pluggable caches xUnpin method. If the cache is +** being used for an in-memory database, this function is a no-op. +*/ +static void pcacheUnpin(PgHdr *p){ + if( p->pCache->bPurgeable ){ + pcacheTrace(("%p.UNPIN %d\n", p->pCache, p->pgno)); + sqlite3GlobalConfig.pcache2.xUnpin(p->pCache->pCache, p->pPage, 0); + pcacheDump(p->pCache); + } +} + +/* +** Compute the number of pages of cache requested. p->szCache is the +** cache size requested by the "PRAGMA cache_size" statement. +*/ +static int numberOfCachePages(PCache *p){ + if( p->szCache>=0 ){ + /* IMPLEMENTATION-OF: R-42059-47211 If the argument N is positive then the + ** suggested cache size is set to N. */ + return p->szCache; + }else{ + /* IMPLEMENTATION-OF: R-61436-13639 If the argument N is negative, then + ** the number of cache pages is adjusted to use approximately abs(N*1024) + ** bytes of memory. */ + return (int)((-1024*(i64)p->szCache)/(p->szPage+p->szExtra)); + } +} + +/*************************************************** General Interfaces ****** +** +** Initialize and shutdown the page cache subsystem. Neither of these +** functions are threadsafe. +*/ +SQLITE_PRIVATE int sqlite3PcacheInitialize(void){ + if( sqlite3GlobalConfig.pcache2.xInit==0 ){ + /* IMPLEMENTATION-OF: R-26801-64137 If the xInit() method is NULL, then the + ** built-in default page cache is used instead of the application defined + ** page cache. */ + sqlite3PCacheSetDefault(); + } + return sqlite3GlobalConfig.pcache2.xInit(sqlite3GlobalConfig.pcache2.pArg); +} +SQLITE_PRIVATE void sqlite3PcacheShutdown(void){ + if( sqlite3GlobalConfig.pcache2.xShutdown ){ + /* IMPLEMENTATION-OF: R-26000-56589 The xShutdown() method may be NULL. */ + sqlite3GlobalConfig.pcache2.xShutdown(sqlite3GlobalConfig.pcache2.pArg); + } +} + +/* +** Return the size in bytes of a PCache object. +*/ +SQLITE_PRIVATE int sqlite3PcacheSize(void){ return sizeof(PCache); } + +/* +** Create a new PCache object. Storage space to hold the object +** has already been allocated and is passed in as the p pointer. +** The caller discovers how much space needs to be allocated by +** calling sqlite3PcacheSize(). +*/ +SQLITE_PRIVATE int sqlite3PcacheOpen( + int szPage, /* Size of every page */ + int szExtra, /* Extra space associated with each page */ + int bPurgeable, /* True if pages are on backing store */ + int (*xStress)(void*,PgHdr*),/* Call to try to make pages clean */ + void *pStress, /* Argument to xStress */ + PCache *p /* Preallocated space for the PCache */ +){ + memset(p, 0, sizeof(PCache)); + p->szPage = 1; + p->szExtra = szExtra; + p->bPurgeable = bPurgeable; + p->eCreate = 2; + p->xStress = xStress; + p->pStress = pStress; + p->szCache = 100; + p->szSpill = 1; + pcacheTrace(("%p.OPEN szPage %d bPurgeable %d\n",p,szPage,bPurgeable)); + return sqlite3PcacheSetPageSize(p, szPage); +} + +/* +** Change the page size for PCache object. The caller must ensure that there +** are no outstanding page references when this function is called. +*/ +SQLITE_PRIVATE int sqlite3PcacheSetPageSize(PCache *pCache, int szPage){ + assert( pCache->nRefSum==0 && pCache->pDirty==0 ); + if( pCache->szPage ){ + sqlite3_pcache *pNew; + pNew = sqlite3GlobalConfig.pcache2.xCreate( + szPage, pCache->szExtra + ROUND8(sizeof(PgHdr)), + pCache->bPurgeable + ); + if( pNew==0 ) return SQLITE_NOMEM_BKPT; + sqlite3GlobalConfig.pcache2.xCachesize(pNew, numberOfCachePages(pCache)); + if( pCache->pCache ){ + sqlite3GlobalConfig.pcache2.xDestroy(pCache->pCache); + } + pCache->pCache = pNew; + pCache->szPage = szPage; + pcacheTrace(("%p.PAGESIZE %d\n",pCache,szPage)); + } + return SQLITE_OK; +} + +/* +** Try to obtain a page from the cache. +** +** This routine returns a pointer to an sqlite3_pcache_page object if +** such an object is already in cache, or if a new one is created. +** This routine returns a NULL pointer if the object was not in cache +** and could not be created. +** +** The createFlags should be 0 to check for existing pages and should +** be 3 (not 1, but 3) to try to create a new page. +** +** If the createFlag is 0, then NULL is always returned if the page +** is not already in the cache. If createFlag is 1, then a new page +** is created only if that can be done without spilling dirty pages +** and without exceeding the cache size limit. +** +** The caller needs to invoke sqlite3PcacheFetchFinish() to properly +** initialize the sqlite3_pcache_page object and convert it into a +** PgHdr object. The sqlite3PcacheFetch() and sqlite3PcacheFetchFinish() +** routines are split this way for performance reasons. When separated +** they can both (usually) operate without having to push values to +** the stack on entry and pop them back off on exit, which saves a +** lot of pushing and popping. +*/ +SQLITE_PRIVATE sqlite3_pcache_page *sqlite3PcacheFetch( + PCache *pCache, /* Obtain the page from this cache */ + Pgno pgno, /* Page number to obtain */ + int createFlag /* If true, create page if it does not exist already */ +){ + int eCreate; + sqlite3_pcache_page *pRes; + + assert( pCache!=0 ); + assert( pCache->pCache!=0 ); + assert( createFlag==3 || createFlag==0 ); + assert( pgno>0 ); + assert( pCache->eCreate==((pCache->bPurgeable && pCache->pDirty) ? 1 : 2) ); + + /* eCreate defines what to do if the page does not exist. + ** 0 Do not allocate a new page. (createFlag==0) + ** 1 Allocate a new page if doing so is inexpensive. + ** (createFlag==1 AND bPurgeable AND pDirty) + ** 2 Allocate a new page even it doing so is difficult. + ** (createFlag==1 AND !(bPurgeable AND pDirty) + */ + eCreate = createFlag & pCache->eCreate; + assert( eCreate==0 || eCreate==1 || eCreate==2 ); + assert( createFlag==0 || pCache->eCreate==eCreate ); + assert( createFlag==0 || eCreate==1+(!pCache->bPurgeable||!pCache->pDirty) ); + pRes = sqlite3GlobalConfig.pcache2.xFetch(pCache->pCache, pgno, eCreate); + pcacheTrace(("%p.FETCH %d%s (result: %p)\n",pCache,pgno, + createFlag?" create":"",pRes)); + return pRes; +} + +/* +** If the sqlite3PcacheFetch() routine is unable to allocate a new +** page because no clean pages are available for reuse and the cache +** size limit has been reached, then this routine can be invoked to +** try harder to allocate a page. This routine might invoke the stress +** callback to spill dirty pages to the journal. It will then try to +** allocate the new page and will only fail to allocate a new page on +** an OOM error. +** +** This routine should be invoked only after sqlite3PcacheFetch() fails. +*/ +SQLITE_PRIVATE int sqlite3PcacheFetchStress( + PCache *pCache, /* Obtain the page from this cache */ + Pgno pgno, /* Page number to obtain */ + sqlite3_pcache_page **ppPage /* Write result here */ +){ + PgHdr *pPg; + if( pCache->eCreate==2 ) return 0; + + if( sqlite3PcachePagecount(pCache)>pCache->szSpill ){ + /* Find a dirty page to write-out and recycle. First try to find a + ** page that does not require a journal-sync (one with PGHDR_NEED_SYNC + ** cleared), but if that is not possible settle for any other + ** unreferenced dirty page. + ** + ** If the LRU page in the dirty list that has a clear PGHDR_NEED_SYNC + ** flag is currently referenced, then the following may leave pSynced + ** set incorrectly (pointing to other than the LRU page with NEED_SYNC + ** cleared). This is Ok, as pSynced is just an optimization. */ + for(pPg=pCache->pSynced; + pPg && (pPg->nRef || (pPg->flags&PGHDR_NEED_SYNC)); + pPg=pPg->pDirtyPrev + ); + pCache->pSynced = pPg; + if( !pPg ){ + for(pPg=pCache->pDirtyTail; pPg && pPg->nRef; pPg=pPg->pDirtyPrev); + } + if( pPg ){ + int rc; +#ifdef SQLITE_LOG_CACHE_SPILL + sqlite3_log(SQLITE_FULL, + "spill page %d making room for %d - cache used: %d/%d", + pPg->pgno, pgno, + sqlite3GlobalConfig.pcache.xPagecount(pCache->pCache), + numberOfCachePages(pCache)); +#endif + pcacheTrace(("%p.SPILL %d\n",pCache,pPg->pgno)); + rc = pCache->xStress(pCache->pStress, pPg); + pcacheDump(pCache); + if( rc!=SQLITE_OK && rc!=SQLITE_BUSY ){ + return rc; + } + } + } + *ppPage = sqlite3GlobalConfig.pcache2.xFetch(pCache->pCache, pgno, 2); + return *ppPage==0 ? SQLITE_NOMEM_BKPT : SQLITE_OK; +} + +/* +** This is a helper routine for sqlite3PcacheFetchFinish() +** +** In the uncommon case where the page being fetched has not been +** initialized, this routine is invoked to do the initialization. +** This routine is broken out into a separate function since it +** requires extra stack manipulation that can be avoided in the common +** case. +*/ +static SQLITE_NOINLINE PgHdr *pcacheFetchFinishWithInit( + PCache *pCache, /* Obtain the page from this cache */ + Pgno pgno, /* Page number obtained */ + sqlite3_pcache_page *pPage /* Page obtained by prior PcacheFetch() call */ +){ + PgHdr *pPgHdr; + assert( pPage!=0 ); + pPgHdr = (PgHdr*)pPage->pExtra; + assert( pPgHdr->pPage==0 ); + memset(&pPgHdr->pDirty, 0, sizeof(PgHdr) - offsetof(PgHdr,pDirty)); + pPgHdr->pPage = pPage; + pPgHdr->pData = pPage->pBuf; + pPgHdr->pExtra = (void *)&pPgHdr[1]; + memset(pPgHdr->pExtra, 0, pCache->szExtra); + pPgHdr->pCache = pCache; + pPgHdr->pgno = pgno; + pPgHdr->flags = PGHDR_CLEAN; + return sqlite3PcacheFetchFinish(pCache,pgno,pPage); +} + +/* +** This routine converts the sqlite3_pcache_page object returned by +** sqlite3PcacheFetch() into an initialized PgHdr object. This routine +** must be called after sqlite3PcacheFetch() in order to get a usable +** result. +*/ +SQLITE_PRIVATE PgHdr *sqlite3PcacheFetchFinish( + PCache *pCache, /* Obtain the page from this cache */ + Pgno pgno, /* Page number obtained */ + sqlite3_pcache_page *pPage /* Page obtained by prior PcacheFetch() call */ +){ + PgHdr *pPgHdr; + + assert( pPage!=0 ); + pPgHdr = (PgHdr *)pPage->pExtra; + + if( !pPgHdr->pPage ){ + return pcacheFetchFinishWithInit(pCache, pgno, pPage); + } + pCache->nRefSum++; + pPgHdr->nRef++; + assert( sqlite3PcachePageSanity(pPgHdr) ); + return pPgHdr; +} + +/* +** Decrement the reference count on a page. If the page is clean and the +** reference count drops to 0, then it is made eligible for recycling. +*/ +SQLITE_PRIVATE void SQLITE_NOINLINE sqlite3PcacheRelease(PgHdr *p){ + assert( p->nRef>0 ); + p->pCache->nRefSum--; + if( (--p->nRef)==0 ){ + if( p->flags&PGHDR_CLEAN ){ + pcacheUnpin(p); + }else if( p->pDirtyPrev!=0 ){ /*OPTIMIZATION-IF-FALSE*/ + /* Move the page to the head of the dirty list. If p->pDirtyPrev==0, + ** then page p is already at the head of the dirty list and the + ** following call would be a no-op. Hence the OPTIMIZATION-IF-FALSE + ** tag above. */ + pcacheManageDirtyList(p, PCACHE_DIRTYLIST_FRONT); + } + } +} + +/* +** Increase the reference count of a supplied page by 1. +*/ +SQLITE_PRIVATE void sqlite3PcacheRef(PgHdr *p){ + assert(p->nRef>0); + assert( sqlite3PcachePageSanity(p) ); + p->nRef++; + p->pCache->nRefSum++; +} + +/* +** Drop a page from the cache. There must be exactly one reference to the +** page. This function deletes that reference, so after it returns the +** page pointed to by p is invalid. +*/ +SQLITE_PRIVATE void sqlite3PcacheDrop(PgHdr *p){ + assert( p->nRef==1 ); + assert( sqlite3PcachePageSanity(p) ); + if( p->flags&PGHDR_DIRTY ){ + pcacheManageDirtyList(p, PCACHE_DIRTYLIST_REMOVE); + } + p->pCache->nRefSum--; + sqlite3GlobalConfig.pcache2.xUnpin(p->pCache->pCache, p->pPage, 1); +} + +/* +** Make sure the page is marked as dirty. If it isn't dirty already, +** make it so. +*/ +SQLITE_PRIVATE void sqlite3PcacheMakeDirty(PgHdr *p){ + assert( p->nRef>0 ); + assert( sqlite3PcachePageSanity(p) ); + if( p->flags & (PGHDR_CLEAN|PGHDR_DONT_WRITE) ){ /*OPTIMIZATION-IF-FALSE*/ + p->flags &= ~PGHDR_DONT_WRITE; + if( p->flags & PGHDR_CLEAN ){ + p->flags ^= (PGHDR_DIRTY|PGHDR_CLEAN); + pcacheTrace(("%p.DIRTY %d\n",p->pCache,p->pgno)); + assert( (p->flags & (PGHDR_DIRTY|PGHDR_CLEAN))==PGHDR_DIRTY ); + pcacheManageDirtyList(p, PCACHE_DIRTYLIST_ADD); + } + assert( sqlite3PcachePageSanity(p) ); + } +} + +/* +** Make sure the page is marked as clean. If it isn't clean already, +** make it so. +*/ +SQLITE_PRIVATE void sqlite3PcacheMakeClean(PgHdr *p){ + assert( sqlite3PcachePageSanity(p) ); + if( ALWAYS((p->flags & PGHDR_DIRTY)!=0) ){ + assert( (p->flags & PGHDR_CLEAN)==0 ); + pcacheManageDirtyList(p, PCACHE_DIRTYLIST_REMOVE); + p->flags &= ~(PGHDR_DIRTY|PGHDR_NEED_SYNC|PGHDR_WRITEABLE); + p->flags |= PGHDR_CLEAN; + pcacheTrace(("%p.CLEAN %d\n",p->pCache,p->pgno)); + assert( sqlite3PcachePageSanity(p) ); + if( p->nRef==0 ){ + pcacheUnpin(p); + } + } +} + +/* +** Make every page in the cache clean. +*/ +SQLITE_PRIVATE void sqlite3PcacheCleanAll(PCache *pCache){ + PgHdr *p; + pcacheTrace(("%p.CLEAN-ALL\n",pCache)); + while( (p = pCache->pDirty)!=0 ){ + sqlite3PcacheMakeClean(p); + } +} + +/* +** Clear the PGHDR_NEED_SYNC and PGHDR_WRITEABLE flag from all dirty pages. +*/ +SQLITE_PRIVATE void sqlite3PcacheClearWritable(PCache *pCache){ + PgHdr *p; + pcacheTrace(("%p.CLEAR-WRITEABLE\n",pCache)); + for(p=pCache->pDirty; p; p=p->pDirtyNext){ + p->flags &= ~(PGHDR_NEED_SYNC|PGHDR_WRITEABLE); + } + pCache->pSynced = pCache->pDirtyTail; +} + +/* +** Clear the PGHDR_NEED_SYNC flag from all dirty pages. +*/ +SQLITE_PRIVATE void sqlite3PcacheClearSyncFlags(PCache *pCache){ + PgHdr *p; + for(p=pCache->pDirty; p; p=p->pDirtyNext){ + p->flags &= ~PGHDR_NEED_SYNC; + } + pCache->pSynced = pCache->pDirtyTail; +} + +/* +** Change the page number of page p to newPgno. +*/ +SQLITE_PRIVATE void sqlite3PcacheMove(PgHdr *p, Pgno newPgno){ + PCache *pCache = p->pCache; + assert( p->nRef>0 ); + assert( newPgno>0 ); + assert( sqlite3PcachePageSanity(p) ); + pcacheTrace(("%p.MOVE %d -> %d\n",pCache,p->pgno,newPgno)); + sqlite3GlobalConfig.pcache2.xRekey(pCache->pCache, p->pPage, p->pgno,newPgno); + p->pgno = newPgno; + if( (p->flags&PGHDR_DIRTY) && (p->flags&PGHDR_NEED_SYNC) ){ + pcacheManageDirtyList(p, PCACHE_DIRTYLIST_FRONT); + } +} + +/* +** Drop every cache entry whose page number is greater than "pgno". The +** caller must ensure that there are no outstanding references to any pages +** other than page 1 with a page number greater than pgno. +** +** If there is a reference to page 1 and the pgno parameter passed to this +** function is 0, then the data area associated with page 1 is zeroed, but +** the page object is not dropped. +*/ +SQLITE_PRIVATE void sqlite3PcacheTruncate(PCache *pCache, Pgno pgno){ + if( pCache->pCache ){ + PgHdr *p; + PgHdr *pNext; + pcacheTrace(("%p.TRUNCATE %d\n",pCache,pgno)); + for(p=pCache->pDirty; p; p=pNext){ + pNext = p->pDirtyNext; + /* This routine never gets call with a positive pgno except right + ** after sqlite3PcacheCleanAll(). So if there are dirty pages, + ** it must be that pgno==0. + */ + assert( p->pgno>0 ); + if( p->pgno>pgno ){ + assert( p->flags&PGHDR_DIRTY ); + sqlite3PcacheMakeClean(p); + } + } + if( pgno==0 && pCache->nRefSum ){ + sqlite3_pcache_page *pPage1; + pPage1 = sqlite3GlobalConfig.pcache2.xFetch(pCache->pCache,1,0); + if( ALWAYS(pPage1) ){ /* Page 1 is always available in cache, because + ** pCache->nRefSum>0 */ + memset(pPage1->pBuf, 0, pCache->szPage); + pgno = 1; + } + } + sqlite3GlobalConfig.pcache2.xTruncate(pCache->pCache, pgno+1); + } +} + +/* +** Close a cache. +*/ +SQLITE_PRIVATE void sqlite3PcacheClose(PCache *pCache){ + assert( pCache->pCache!=0 ); + pcacheTrace(("%p.CLOSE\n",pCache)); + sqlite3GlobalConfig.pcache2.xDestroy(pCache->pCache); +} + +/* +** Discard the contents of the cache. +*/ +SQLITE_PRIVATE void sqlite3PcacheClear(PCache *pCache){ + sqlite3PcacheTruncate(pCache, 0); +} + +/* +** Merge two lists of pages connected by pDirty and in pgno order. +** Do not bother fixing the pDirtyPrev pointers. +*/ +static PgHdr *pcacheMergeDirtyList(PgHdr *pA, PgHdr *pB){ + PgHdr result, *pTail; + pTail = &result; + assert( pA!=0 && pB!=0 ); + for(;;){ + if( pA->pgnopgno ){ + pTail->pDirty = pA; + pTail = pA; + pA = pA->pDirty; + if( pA==0 ){ + pTail->pDirty = pB; + break; + } + }else{ + pTail->pDirty = pB; + pTail = pB; + pB = pB->pDirty; + if( pB==0 ){ + pTail->pDirty = pA; + break; + } + } + } + return result.pDirty; +} + +/* +** Sort the list of pages in accending order by pgno. Pages are +** connected by pDirty pointers. The pDirtyPrev pointers are +** corrupted by this sort. +** +** Since there cannot be more than 2^31 distinct pages in a database, +** there cannot be more than 31 buckets required by the merge sorter. +** One extra bucket is added to catch overflow in case something +** ever changes to make the previous sentence incorrect. +*/ +#define N_SORT_BUCKET 32 +static PgHdr *pcacheSortDirtyList(PgHdr *pIn){ + PgHdr *a[N_SORT_BUCKET], *p; + int i; + memset(a, 0, sizeof(a)); + while( pIn ){ + p = pIn; + pIn = p->pDirty; + p->pDirty = 0; + for(i=0; ALWAYS(ipDirty; p; p=p->pDirtyNext){ + p->pDirty = p->pDirtyNext; + } + return pcacheSortDirtyList(pCache->pDirty); +} + +/* +** Return the total number of references to all pages held by the cache. +** +** This is not the total number of pages referenced, but the sum of the +** reference count for all pages. +*/ +SQLITE_PRIVATE int sqlite3PcacheRefCount(PCache *pCache){ + return pCache->nRefSum; +} + +/* +** Return the number of references to the page supplied as an argument. +*/ +SQLITE_PRIVATE int sqlite3PcachePageRefcount(PgHdr *p){ + return p->nRef; +} + +/* +** Return the total number of pages in the cache. +*/ +SQLITE_PRIVATE int sqlite3PcachePagecount(PCache *pCache){ + assert( pCache->pCache!=0 ); + return sqlite3GlobalConfig.pcache2.xPagecount(pCache->pCache); +} + +#ifdef SQLITE_TEST +/* +** Get the suggested cache-size value. +*/ +SQLITE_PRIVATE int sqlite3PcacheGetCachesize(PCache *pCache){ + return numberOfCachePages(pCache); +} +#endif + +/* +** Set the suggested cache-size value. +*/ +SQLITE_PRIVATE void sqlite3PcacheSetCachesize(PCache *pCache, int mxPage){ + assert( pCache->pCache!=0 ); + pCache->szCache = mxPage; + sqlite3GlobalConfig.pcache2.xCachesize(pCache->pCache, + numberOfCachePages(pCache)); +} + +/* +** Set the suggested cache-spill value. Make no changes if if the +** argument is zero. Return the effective cache-spill size, which will +** be the larger of the szSpill and szCache. +*/ +SQLITE_PRIVATE int sqlite3PcacheSetSpillsize(PCache *p, int mxPage){ + int res; + assert( p->pCache!=0 ); + if( mxPage ){ + if( mxPage<0 ){ + mxPage = (int)((-1024*(i64)mxPage)/(p->szPage+p->szExtra)); + } + p->szSpill = mxPage; + } + res = numberOfCachePages(p); + if( resszSpill ) res = p->szSpill; + return res; +} + +/* +** Free up as much memory as possible from the page cache. +*/ +SQLITE_PRIVATE void sqlite3PcacheShrink(PCache *pCache){ + assert( pCache->pCache!=0 ); + sqlite3GlobalConfig.pcache2.xShrink(pCache->pCache); +} + +/* +** Return the size of the header added by this middleware layer +** in the page-cache hierarchy. +*/ +SQLITE_PRIVATE int sqlite3HeaderSizePcache(void){ return ROUND8(sizeof(PgHdr)); } + +/* +** Return the number of dirty pages currently in the cache, as a percentage +** of the configured cache size. +*/ +SQLITE_PRIVATE int sqlite3PCachePercentDirty(PCache *pCache){ + PgHdr *pDirty; + int nDirty = 0; + int nCache = numberOfCachePages(pCache); + for(pDirty=pCache->pDirty; pDirty; pDirty=pDirty->pDirtyNext) nDirty++; + return nCache ? (int)(((i64)nDirty * 100) / nCache) : 0; +} + +#if defined(SQLITE_CHECK_PAGES) || defined(SQLITE_DEBUG) +/* +** For all dirty pages currently in the cache, invoke the specified +** callback. This is only used if the SQLITE_CHECK_PAGES macro is +** defined. +*/ +SQLITE_PRIVATE void sqlite3PcacheIterateDirty(PCache *pCache, void (*xIter)(PgHdr *)){ + PgHdr *pDirty; + for(pDirty=pCache->pDirty; pDirty; pDirty=pDirty->pDirtyNext){ + xIter(pDirty); + } +} +#endif + +/************** End of pcache.c **********************************************/ +/************** Begin file pcache1.c *****************************************/ +/* +** 2008 November 05 +** +** 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 implements the default page cache implementation (the +** sqlite3_pcache interface). It also contains part of the implementation +** of the SQLITE_CONFIG_PAGECACHE and sqlite3_release_memory() features. +** If the default page cache implementation is overridden, then neither of +** these two features are available. +** +** A Page cache line looks like this: +** +** ------------------------------------------------------------- +** | database page content | PgHdr1 | MemPage | PgHdr | +** ------------------------------------------------------------- +** +** The database page content is up front (so that buffer overreads tend to +** flow harmlessly into the PgHdr1, MemPage, and PgHdr extensions). MemPage +** is the extension added by the btree.c module containing information such +** as the database page number and how that database page is used. PgHdr +** is added by the pcache.c layer and contains information used to keep track +** of which pages are "dirty". PgHdr1 is an extension added by this +** module (pcache1.c). The PgHdr1 header is a subclass of sqlite3_pcache_page. +** PgHdr1 contains information needed to look up a page by its page number. +** The superclass sqlite3_pcache_page.pBuf points to the start of the +** database page content and sqlite3_pcache_page.pExtra points to PgHdr. +** +** The size of the extension (MemPage+PgHdr+PgHdr1) can be determined at +** runtime using sqlite3_config(SQLITE_CONFIG_PCACHE_HDRSZ, &size). The +** sizes of the extensions sum to 272 bytes on x64 for 3.8.10, but this +** size can vary according to architecture, compile-time options, and +** SQLite library version number. +** +** If SQLITE_PCACHE_SEPARATE_HEADER is defined, then the extension is obtained +** using a separate memory allocation from the database page content. This +** seeks to overcome the "clownshoe" problem (also called "internal +** fragmentation" in academic literature) of allocating a few bytes more +** than a power of two with the memory allocator rounding up to the next +** power of two, and leaving the rounded-up space unused. +** +** This module tracks pointers to PgHdr1 objects. Only pcache.c communicates +** with this module. Information is passed back and forth as PgHdr1 pointers. +** +** The pcache.c and pager.c modules deal pointers to PgHdr objects. +** The btree.c module deals with pointers to MemPage objects. +** +** SOURCE OF PAGE CACHE MEMORY: +** +** Memory for a page might come from any of three sources: +** +** (1) The general-purpose memory allocator - sqlite3Malloc() +** (2) Global page-cache memory provided using sqlite3_config() with +** SQLITE_CONFIG_PAGECACHE. +** (3) PCache-local bulk allocation. +** +** The third case is a chunk of heap memory (defaulting to 100 pages worth) +** that is allocated when the page cache is created. The size of the local +** bulk allocation can be adjusted using +** +** sqlite3_config(SQLITE_CONFIG_PAGECACHE, (void*)0, 0, N). +** +** If N is positive, then N pages worth of memory are allocated using a single +** sqlite3Malloc() call and that memory is used for the first N pages allocated. +** Or if N is negative, then -1024*N bytes of memory are allocated and used +** for as many pages as can be accomodated. +** +** Only one of (2) or (3) can be used. Once the memory available to (2) or +** (3) is exhausted, subsequent allocations fail over to the general-purpose +** memory allocator (1). +** +** Earlier versions of SQLite used only methods (1) and (2). But experiments +** show that method (3) with N==100 provides about a 5% performance boost for +** common workloads. +*/ +/* #include "sqliteInt.h" */ + +typedef struct PCache1 PCache1; +typedef struct PgHdr1 PgHdr1; +typedef struct PgFreeslot PgFreeslot; +typedef struct PGroup PGroup; + +/* +** Each cache entry is represented by an instance of the following +** structure. Unless SQLITE_PCACHE_SEPARATE_HEADER is defined, a buffer of +** PgHdr1.pCache->szPage bytes is allocated directly before this structure +** in memory. +*/ +struct PgHdr1 { + sqlite3_pcache_page page; /* Base class. Must be first. pBuf & pExtra */ + unsigned int iKey; /* Key value (page number) */ + u8 isPinned; /* Page in use, not on the LRU list */ + u8 isBulkLocal; /* This page from bulk local storage */ + u8 isAnchor; /* This is the PGroup.lru element */ + PgHdr1 *pNext; /* Next in hash table chain */ + PCache1 *pCache; /* Cache that currently owns this page */ + PgHdr1 *pLruNext; /* Next in LRU list of unpinned pages */ + PgHdr1 *pLruPrev; /* Previous in LRU list of unpinned pages */ +}; + +/* Each page cache (or PCache) belongs to a PGroup. A PGroup is a set +** of one or more PCaches that are able to recycle each other's unpinned +** pages when they are under memory pressure. A PGroup is an instance of +** the following object. +** +** This page cache implementation works in one of two modes: +** +** (1) Every PCache is the sole member of its own PGroup. There is +** one PGroup per PCache. +** +** (2) There is a single global PGroup that all PCaches are a member +** of. +** +** Mode 1 uses more memory (since PCache instances are not able to rob +** unused pages from other PCaches) but it also operates without a mutex, +** and is therefore often faster. Mode 2 requires a mutex in order to be +** threadsafe, but recycles pages more efficiently. +** +** For mode (1), PGroup.mutex is NULL. For mode (2) there is only a single +** PGroup which is the pcache1.grp global variable and its mutex is +** SQLITE_MUTEX_STATIC_LRU. +*/ +struct PGroup { + sqlite3_mutex *mutex; /* MUTEX_STATIC_LRU or NULL */ + unsigned int nMaxPage; /* Sum of nMax for purgeable caches */ + unsigned int nMinPage; /* Sum of nMin for purgeable caches */ + unsigned int mxPinned; /* nMaxpage + 10 - nMinPage */ + unsigned int nCurrentPage; /* Number of purgeable pages allocated */ + PgHdr1 lru; /* The beginning and end of the LRU list */ +}; + +/* Each page cache is an instance of the following object. Every +** open database file (including each in-memory database and each +** temporary or transient database) has a single page cache which +** is an instance of this object. +** +** Pointers to structures of this type are cast and returned as +** opaque sqlite3_pcache* handles. +*/ +struct PCache1 { + /* Cache configuration parameters. Page size (szPage) and the purgeable + ** flag (bPurgeable) are set when the cache is created. nMax may be + ** modified at any time by a call to the pcache1Cachesize() method. + ** The PGroup mutex must be held when accessing nMax. + */ + PGroup *pGroup; /* PGroup this cache belongs to */ + int szPage; /* Size of database content section */ + int szExtra; /* sizeof(MemPage)+sizeof(PgHdr) */ + int szAlloc; /* Total size of one pcache line */ + int bPurgeable; /* True if cache is purgeable */ + unsigned int nMin; /* Minimum number of pages reserved */ + unsigned int nMax; /* Configured "cache_size" value */ + unsigned int n90pct; /* nMax*9/10 */ + unsigned int iMaxKey; /* Largest key seen since xTruncate() */ + + /* Hash table of all pages. The following variables may only be accessed + ** when the accessor is holding the PGroup mutex. + */ + unsigned int nRecyclable; /* Number of pages in the LRU list */ + unsigned int nPage; /* Total number of pages in apHash */ + unsigned int nHash; /* Number of slots in apHash[] */ + PgHdr1 **apHash; /* Hash table for fast lookup by key */ + PgHdr1 *pFree; /* List of unused pcache-local pages */ + void *pBulk; /* Bulk memory used by pcache-local */ +}; + +/* +** Free slots in the allocator used to divide up the global page cache +** buffer provided using the SQLITE_CONFIG_PAGECACHE mechanism. +*/ +struct PgFreeslot { + PgFreeslot *pNext; /* Next free slot */ +}; + +/* +** Global data used by this cache. +*/ +static SQLITE_WSD struct PCacheGlobal { + PGroup grp; /* The global PGroup for mode (2) */ + + /* Variables related to SQLITE_CONFIG_PAGECACHE settings. The + ** szSlot, nSlot, pStart, pEnd, nReserve, and isInit values are all + ** fixed at sqlite3_initialize() time and do not require mutex protection. + ** The nFreeSlot and pFree values do require mutex protection. + */ + int isInit; /* True if initialized */ + int separateCache; /* Use a new PGroup for each PCache */ + int nInitPage; /* Initial bulk allocation size */ + int szSlot; /* Size of each free slot */ + int nSlot; /* The number of pcache slots */ + int nReserve; /* Try to keep nFreeSlot above this */ + void *pStart, *pEnd; /* Bounds of global page cache memory */ + /* Above requires no mutex. Use mutex below for variable that follow. */ + sqlite3_mutex *mutex; /* Mutex for accessing the following: */ + PgFreeslot *pFree; /* Free page blocks */ + int nFreeSlot; /* Number of unused pcache slots */ + /* The following value requires a mutex to change. We skip the mutex on + ** reading because (1) most platforms read a 32-bit integer atomically and + ** (2) even if an incorrect value is read, no great harm is done since this + ** is really just an optimization. */ + int bUnderPressure; /* True if low on PAGECACHE memory */ +} pcache1_g; + +/* +** All code in this file should access the global structure above via the +** alias "pcache1". This ensures that the WSD emulation is used when +** compiling for systems that do not support real WSD. +*/ +#define pcache1 (GLOBAL(struct PCacheGlobal, pcache1_g)) + +/* +** Macros to enter and leave the PCache LRU mutex. +*/ +#if !defined(SQLITE_ENABLE_MEMORY_MANAGEMENT) || SQLITE_THREADSAFE==0 +# define pcache1EnterMutex(X) assert((X)->mutex==0) +# define pcache1LeaveMutex(X) assert((X)->mutex==0) +# define PCACHE1_MIGHT_USE_GROUP_MUTEX 0 +#else +# define pcache1EnterMutex(X) sqlite3_mutex_enter((X)->mutex) +# define pcache1LeaveMutex(X) sqlite3_mutex_leave((X)->mutex) +# define PCACHE1_MIGHT_USE_GROUP_MUTEX 1 +#endif + +/******************************************************************************/ +/******** Page Allocation/SQLITE_CONFIG_PCACHE Related Functions **************/ + + +/* +** This function is called during initialization if a static buffer is +** supplied to use for the page-cache by passing the SQLITE_CONFIG_PAGECACHE +** verb to sqlite3_config(). Parameter pBuf points to an allocation large +** enough to contain 'n' buffers of 'sz' bytes each. +** +** This routine is called from sqlite3_initialize() and so it is guaranteed +** to be serialized already. There is no need for further mutexing. +*/ +SQLITE_PRIVATE void sqlite3PCacheBufferSetup(void *pBuf, int sz, int n){ + if( pcache1.isInit ){ + PgFreeslot *p; + if( pBuf==0 ) sz = n = 0; + sz = ROUNDDOWN8(sz); + pcache1.szSlot = sz; + pcache1.nSlot = pcache1.nFreeSlot = n; + pcache1.nReserve = n>90 ? 10 : (n/10 + 1); + pcache1.pStart = pBuf; + pcache1.pFree = 0; + pcache1.bUnderPressure = 0; + while( n-- ){ + p = (PgFreeslot*)pBuf; + p->pNext = pcache1.pFree; + pcache1.pFree = p; + pBuf = (void*)&((char*)pBuf)[sz]; + } + pcache1.pEnd = pBuf; + } +} + +/* +** Try to initialize the pCache->pFree and pCache->pBulk fields. Return +** true if pCache->pFree ends up containing one or more free pages. +*/ +static int pcache1InitBulk(PCache1 *pCache){ + i64 szBulk; + char *zBulk; + if( pcache1.nInitPage==0 ) return 0; + /* Do not bother with a bulk allocation if the cache size very small */ + if( pCache->nMax<3 ) return 0; + sqlite3BeginBenignMalloc(); + if( pcache1.nInitPage>0 ){ + szBulk = pCache->szAlloc * (i64)pcache1.nInitPage; + }else{ + szBulk = -1024 * (i64)pcache1.nInitPage; + } + if( szBulk > pCache->szAlloc*(i64)pCache->nMax ){ + szBulk = pCache->szAlloc*(i64)pCache->nMax; + } + zBulk = pCache->pBulk = sqlite3Malloc( szBulk ); + sqlite3EndBenignMalloc(); + if( zBulk ){ + int nBulk = sqlite3MallocSize(zBulk)/pCache->szAlloc; + int i; + for(i=0; iszPage]; + pX->page.pBuf = zBulk; + pX->page.pExtra = &pX[1]; + pX->isBulkLocal = 1; + pX->isAnchor = 0; + pX->pNext = pCache->pFree; + pCache->pFree = pX; + zBulk += pCache->szAlloc; + } + } + return pCache->pFree!=0; +} + +/* +** Malloc function used within this file to allocate space from the buffer +** configured using sqlite3_config(SQLITE_CONFIG_PAGECACHE) option. If no +** such buffer exists or there is no space left in it, this function falls +** back to sqlite3Malloc(). +** +** Multiple threads can run this routine at the same time. Global variables +** in pcache1 need to be protected via mutex. +*/ +static void *pcache1Alloc(int nByte){ + void *p = 0; + assert( sqlite3_mutex_notheld(pcache1.grp.mutex) ); + if( nByte<=pcache1.szSlot ){ + sqlite3_mutex_enter(pcache1.mutex); + p = (PgHdr1 *)pcache1.pFree; + if( p ){ + pcache1.pFree = pcache1.pFree->pNext; + pcache1.nFreeSlot--; + pcache1.bUnderPressure = pcache1.nFreeSlot=0 ); + sqlite3StatusHighwater(SQLITE_STATUS_PAGECACHE_SIZE, nByte); + sqlite3StatusUp(SQLITE_STATUS_PAGECACHE_USED, 1); + } + sqlite3_mutex_leave(pcache1.mutex); + } + if( p==0 ){ + /* Memory is not available in the SQLITE_CONFIG_PAGECACHE pool. Get + ** it from sqlite3Malloc instead. + */ + p = sqlite3Malloc(nByte); +#ifndef SQLITE_DISABLE_PAGECACHE_OVERFLOW_STATS + if( p ){ + int sz = sqlite3MallocSize(p); + sqlite3_mutex_enter(pcache1.mutex); + sqlite3StatusHighwater(SQLITE_STATUS_PAGECACHE_SIZE, nByte); + sqlite3StatusUp(SQLITE_STATUS_PAGECACHE_OVERFLOW, sz); + sqlite3_mutex_leave(pcache1.mutex); + } +#endif + sqlite3MemdebugSetType(p, MEMTYPE_PCACHE); + } + return p; +} + +/* +** Free an allocated buffer obtained from pcache1Alloc(). +*/ +static void pcache1Free(void *p){ + if( p==0 ) return; + if( SQLITE_WITHIN(p, pcache1.pStart, pcache1.pEnd) ){ + PgFreeslot *pSlot; + sqlite3_mutex_enter(pcache1.mutex); + sqlite3StatusDown(SQLITE_STATUS_PAGECACHE_USED, 1); + pSlot = (PgFreeslot*)p; + pSlot->pNext = pcache1.pFree; + pcache1.pFree = pSlot; + pcache1.nFreeSlot++; + pcache1.bUnderPressure = pcache1.nFreeSlot=pcache1.pStart && ppGroup->mutex) ); + if( pCache->pFree || (pCache->nPage==0 && pcache1InitBulk(pCache)) ){ + p = pCache->pFree; + pCache->pFree = p->pNext; + p->pNext = 0; + }else{ +#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT + /* The group mutex must be released before pcache1Alloc() is called. This + ** is because it might call sqlite3_release_memory(), which assumes that + ** this mutex is not held. */ + assert( pcache1.separateCache==0 ); + assert( pCache->pGroup==&pcache1.grp ); + pcache1LeaveMutex(pCache->pGroup); +#endif + if( benignMalloc ){ sqlite3BeginBenignMalloc(); } +#ifdef SQLITE_PCACHE_SEPARATE_HEADER + pPg = pcache1Alloc(pCache->szPage); + p = sqlite3Malloc(sizeof(PgHdr1) + pCache->szExtra); + if( !pPg || !p ){ + pcache1Free(pPg); + sqlite3_free(p); + pPg = 0; + } +#else + pPg = pcache1Alloc(pCache->szAlloc); + p = (PgHdr1 *)&((u8 *)pPg)[pCache->szPage]; +#endif + if( benignMalloc ){ sqlite3EndBenignMalloc(); } +#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT + pcache1EnterMutex(pCache->pGroup); +#endif + if( pPg==0 ) return 0; + p->page.pBuf = pPg; + p->page.pExtra = &p[1]; + p->isBulkLocal = 0; + p->isAnchor = 0; + } + if( pCache->bPurgeable ){ + pCache->pGroup->nCurrentPage++; + } + return p; +} + +/* +** Free a page object allocated by pcache1AllocPage(). +*/ +static void pcache1FreePage(PgHdr1 *p){ + PCache1 *pCache; + assert( p!=0 ); + pCache = p->pCache; + assert( sqlite3_mutex_held(p->pCache->pGroup->mutex) ); + if( p->isBulkLocal ){ + p->pNext = pCache->pFree; + pCache->pFree = p; + }else{ + pcache1Free(p->page.pBuf); +#ifdef SQLITE_PCACHE_SEPARATE_HEADER + sqlite3_free(p); +#endif + } + if( pCache->bPurgeable ){ + pCache->pGroup->nCurrentPage--; + } +} + +/* +** Malloc function used by SQLite to obtain space from the buffer configured +** using sqlite3_config(SQLITE_CONFIG_PAGECACHE) option. If no such buffer +** exists, this function falls back to sqlite3Malloc(). +*/ +SQLITE_PRIVATE void *sqlite3PageMalloc(int sz){ + return pcache1Alloc(sz); +} + +/* +** Free an allocated buffer obtained from sqlite3PageMalloc(). +*/ +SQLITE_PRIVATE void sqlite3PageFree(void *p){ + pcache1Free(p); +} + + +/* +** Return true if it desirable to avoid allocating a new page cache +** entry. +** +** If memory was allocated specifically to the page cache using +** SQLITE_CONFIG_PAGECACHE but that memory has all been used, then +** it is desirable to avoid allocating a new page cache entry because +** presumably SQLITE_CONFIG_PAGECACHE was suppose to be sufficient +** for all page cache needs and we should not need to spill the +** allocation onto the heap. +** +** Or, the heap is used for all page cache memory but the heap is +** under memory pressure, then again it is desirable to avoid +** allocating a new page cache entry in order to avoid stressing +** the heap even further. +*/ +static int pcache1UnderMemoryPressure(PCache1 *pCache){ + if( pcache1.nSlot && (pCache->szPage+pCache->szExtra)<=pcache1.szSlot ){ + return pcache1.bUnderPressure; + }else{ + return sqlite3HeapNearlyFull(); + } +} + +/******************************************************************************/ +/******** General Implementation Functions ************************************/ + +/* +** This function is used to resize the hash table used by the cache passed +** as the first argument. +** +** The PCache mutex must be held when this function is called. +*/ +static void pcache1ResizeHash(PCache1 *p){ + PgHdr1 **apNew; + unsigned int nNew; + unsigned int i; + + assert( sqlite3_mutex_held(p->pGroup->mutex) ); + + nNew = p->nHash*2; + if( nNew<256 ){ + nNew = 256; + } + + pcache1LeaveMutex(p->pGroup); + if( p->nHash ){ sqlite3BeginBenignMalloc(); } + apNew = (PgHdr1 **)sqlite3MallocZero(sizeof(PgHdr1 *)*nNew); + if( p->nHash ){ sqlite3EndBenignMalloc(); } + pcache1EnterMutex(p->pGroup); + if( apNew ){ + for(i=0; inHash; i++){ + PgHdr1 *pPage; + PgHdr1 *pNext = p->apHash[i]; + while( (pPage = pNext)!=0 ){ + unsigned int h = pPage->iKey % nNew; + pNext = pPage->pNext; + pPage->pNext = apNew[h]; + apNew[h] = pPage; + } + } + sqlite3_free(p->apHash); + p->apHash = apNew; + p->nHash = nNew; + } +} + +/* +** This function is used internally to remove the page pPage from the +** PGroup LRU list, if is part of it. If pPage is not part of the PGroup +** LRU list, then this function is a no-op. +** +** The PGroup mutex must be held when this function is called. +*/ +static PgHdr1 *pcache1PinPage(PgHdr1 *pPage){ + PCache1 *pCache; + + assert( pPage!=0 ); + assert( pPage->isPinned==0 ); + pCache = pPage->pCache; + assert( pPage->pLruNext ); + assert( pPage->pLruPrev ); + assert( sqlite3_mutex_held(pCache->pGroup->mutex) ); + pPage->pLruPrev->pLruNext = pPage->pLruNext; + pPage->pLruNext->pLruPrev = pPage->pLruPrev; + pPage->pLruNext = 0; + pPage->pLruPrev = 0; + pPage->isPinned = 1; + assert( pPage->isAnchor==0 ); + assert( pCache->pGroup->lru.isAnchor==1 ); + pCache->nRecyclable--; + return pPage; +} + + +/* +** Remove the page supplied as an argument from the hash table +** (PCache1.apHash structure) that it is currently stored in. +** Also free the page if freePage is true. +** +** The PGroup mutex must be held when this function is called. +*/ +static void pcache1RemoveFromHash(PgHdr1 *pPage, int freeFlag){ + unsigned int h; + PCache1 *pCache = pPage->pCache; + PgHdr1 **pp; + + assert( sqlite3_mutex_held(pCache->pGroup->mutex) ); + h = pPage->iKey % pCache->nHash; + for(pp=&pCache->apHash[h]; (*pp)!=pPage; pp=&(*pp)->pNext); + *pp = (*pp)->pNext; + + pCache->nPage--; + if( freeFlag ) pcache1FreePage(pPage); +} + +/* +** If there are currently more than nMaxPage pages allocated, try +** to recycle pages to reduce the number allocated to nMaxPage. +*/ +static void pcache1EnforceMaxPage(PCache1 *pCache){ + PGroup *pGroup = pCache->pGroup; + PgHdr1 *p; + assert( sqlite3_mutex_held(pGroup->mutex) ); + while( pGroup->nCurrentPage>pGroup->nMaxPage + && (p=pGroup->lru.pLruPrev)->isAnchor==0 + ){ + assert( p->pCache->pGroup==pGroup ); + assert( p->isPinned==0 ); + pcache1PinPage(p); + pcache1RemoveFromHash(p, 1); + } + if( pCache->nPage==0 && pCache->pBulk ){ + sqlite3_free(pCache->pBulk); + pCache->pBulk = pCache->pFree = 0; + } +} + +/* +** Discard all pages from cache pCache with a page number (key value) +** greater than or equal to iLimit. Any pinned pages that meet this +** criteria are unpinned before they are discarded. +** +** The PCache mutex must be held when this function is called. +*/ +static void pcache1TruncateUnsafe( + PCache1 *pCache, /* The cache to truncate */ + unsigned int iLimit /* Drop pages with this pgno or larger */ +){ + TESTONLY( int nPage = 0; ) /* To assert pCache->nPage is correct */ + unsigned int h, iStop; + assert( sqlite3_mutex_held(pCache->pGroup->mutex) ); + assert( pCache->iMaxKey >= iLimit ); + assert( pCache->nHash > 0 ); + if( pCache->iMaxKey - iLimit < pCache->nHash ){ + /* If we are just shaving the last few pages off the end of the + ** cache, then there is no point in scanning the entire hash table. + ** Only scan those hash slots that might contain pages that need to + ** be removed. */ + h = iLimit % pCache->nHash; + iStop = pCache->iMaxKey % pCache->nHash; + TESTONLY( nPage = -10; ) /* Disable the pCache->nPage validity check */ + }else{ + /* This is the general case where many pages are being removed. + ** It is necessary to scan the entire hash table */ + h = pCache->nHash/2; + iStop = h - 1; + } + for(;;){ + PgHdr1 **pp; + PgHdr1 *pPage; + assert( hnHash ); + pp = &pCache->apHash[h]; + while( (pPage = *pp)!=0 ){ + if( pPage->iKey>=iLimit ){ + pCache->nPage--; + *pp = pPage->pNext; + if( !pPage->isPinned ) pcache1PinPage(pPage); + pcache1FreePage(pPage); + }else{ + pp = &pPage->pNext; + TESTONLY( if( nPage>=0 ) nPage++; ) + } + } + if( h==iStop ) break; + h = (h+1) % pCache->nHash; + } + assert( nPage<0 || pCache->nPage==(unsigned)nPage ); +} + +/******************************************************************************/ +/******** sqlite3_pcache Methods **********************************************/ + +/* +** Implementation of the sqlite3_pcache.xInit method. +*/ +static int pcache1Init(void *NotUsed){ + UNUSED_PARAMETER(NotUsed); + assert( pcache1.isInit==0 ); + memset(&pcache1, 0, sizeof(pcache1)); + + + /* + ** The pcache1.separateCache variable is true if each PCache has its own + ** private PGroup (mode-1). pcache1.separateCache is false if the single + ** PGroup in pcache1.grp is used for all page caches (mode-2). + ** + ** * Always use a unified cache (mode-2) if ENABLE_MEMORY_MANAGEMENT + ** + ** * Use a unified cache in single-threaded applications that have + ** configured a start-time buffer for use as page-cache memory using + ** sqlite3_config(SQLITE_CONFIG_PAGECACHE, pBuf, sz, N) with non-NULL + ** pBuf argument. + ** + ** * Otherwise use separate caches (mode-1) + */ +#if defined(SQLITE_ENABLE_MEMORY_MANAGEMENT) + pcache1.separateCache = 0; +#elif SQLITE_THREADSAFE + pcache1.separateCache = sqlite3GlobalConfig.pPage==0 + || sqlite3GlobalConfig.bCoreMutex>0; +#else + pcache1.separateCache = sqlite3GlobalConfig.pPage==0; +#endif + +#if SQLITE_THREADSAFE + if( sqlite3GlobalConfig.bCoreMutex ){ + pcache1.grp.mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_LRU); + pcache1.mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_PMEM); + } +#endif + if( pcache1.separateCache + && sqlite3GlobalConfig.nPage!=0 + && sqlite3GlobalConfig.pPage==0 + ){ + pcache1.nInitPage = sqlite3GlobalConfig.nPage; + }else{ + pcache1.nInitPage = 0; + } + pcache1.grp.mxPinned = 10; + pcache1.isInit = 1; + return SQLITE_OK; +} + +/* +** Implementation of the sqlite3_pcache.xShutdown method. +** Note that the static mutex allocated in xInit does +** not need to be freed. +*/ +static void pcache1Shutdown(void *NotUsed){ + UNUSED_PARAMETER(NotUsed); + assert( pcache1.isInit!=0 ); + memset(&pcache1, 0, sizeof(pcache1)); +} + +/* forward declaration */ +static void pcache1Destroy(sqlite3_pcache *p); + +/* +** Implementation of the sqlite3_pcache.xCreate method. +** +** Allocate a new cache. +*/ +static sqlite3_pcache *pcache1Create(int szPage, int szExtra, int bPurgeable){ + PCache1 *pCache; /* The newly created page cache */ + PGroup *pGroup; /* The group the new page cache will belong to */ + int sz; /* Bytes of memory required to allocate the new cache */ + + assert( (szPage & (szPage-1))==0 && szPage>=512 && szPage<=65536 ); + assert( szExtra < 300 ); + + sz = sizeof(PCache1) + sizeof(PGroup)*pcache1.separateCache; + pCache = (PCache1 *)sqlite3MallocZero(sz); + if( pCache ){ + if( pcache1.separateCache ){ + pGroup = (PGroup*)&pCache[1]; + pGroup->mxPinned = 10; + }else{ + pGroup = &pcache1.grp; + } + if( pGroup->lru.isAnchor==0 ){ + pGroup->lru.isAnchor = 1; + pGroup->lru.pLruPrev = pGroup->lru.pLruNext = &pGroup->lru; + } + pCache->pGroup = pGroup; + pCache->szPage = szPage; + pCache->szExtra = szExtra; + pCache->szAlloc = szPage + szExtra + ROUND8(sizeof(PgHdr1)); + pCache->bPurgeable = (bPurgeable ? 1 : 0); + pcache1EnterMutex(pGroup); + pcache1ResizeHash(pCache); + if( bPurgeable ){ + pCache->nMin = 10; + pGroup->nMinPage += pCache->nMin; + pGroup->mxPinned = pGroup->nMaxPage + 10 - pGroup->nMinPage; + } + pcache1LeaveMutex(pGroup); + if( pCache->nHash==0 ){ + pcache1Destroy((sqlite3_pcache*)pCache); + pCache = 0; + } + } + return (sqlite3_pcache *)pCache; +} + +/* +** Implementation of the sqlite3_pcache.xCachesize method. +** +** Configure the cache_size limit for a cache. +*/ +static void pcache1Cachesize(sqlite3_pcache *p, int nMax){ + PCache1 *pCache = (PCache1 *)p; + if( pCache->bPurgeable ){ + PGroup *pGroup = pCache->pGroup; + pcache1EnterMutex(pGroup); + pGroup->nMaxPage += (nMax - pCache->nMax); + pGroup->mxPinned = pGroup->nMaxPage + 10 - pGroup->nMinPage; + pCache->nMax = nMax; + pCache->n90pct = pCache->nMax*9/10; + pcache1EnforceMaxPage(pCache); + pcache1LeaveMutex(pGroup); + } +} + +/* +** Implementation of the sqlite3_pcache.xShrink method. +** +** Free up as much memory as possible. +*/ +static void pcache1Shrink(sqlite3_pcache *p){ + PCache1 *pCache = (PCache1*)p; + if( pCache->bPurgeable ){ + PGroup *pGroup = pCache->pGroup; + int savedMaxPage; + pcache1EnterMutex(pGroup); + savedMaxPage = pGroup->nMaxPage; + pGroup->nMaxPage = 0; + pcache1EnforceMaxPage(pCache); + pGroup->nMaxPage = savedMaxPage; + pcache1LeaveMutex(pGroup); + } +} + +/* +** Implementation of the sqlite3_pcache.xPagecount method. +*/ +static int pcache1Pagecount(sqlite3_pcache *p){ + int n; + PCache1 *pCache = (PCache1*)p; + pcache1EnterMutex(pCache->pGroup); + n = pCache->nPage; + pcache1LeaveMutex(pCache->pGroup); + return n; +} + + +/* +** Implement steps 3, 4, and 5 of the pcache1Fetch() algorithm described +** in the header of the pcache1Fetch() procedure. +** +** This steps are broken out into a separate procedure because they are +** usually not needed, and by avoiding the stack initialization required +** for these steps, the main pcache1Fetch() procedure can run faster. +*/ +static SQLITE_NOINLINE PgHdr1 *pcache1FetchStage2( + PCache1 *pCache, + unsigned int iKey, + int createFlag +){ + unsigned int nPinned; + PGroup *pGroup = pCache->pGroup; + PgHdr1 *pPage = 0; + + /* Step 3: Abort if createFlag is 1 but the cache is nearly full */ + assert( pCache->nPage >= pCache->nRecyclable ); + nPinned = pCache->nPage - pCache->nRecyclable; + assert( pGroup->mxPinned == pGroup->nMaxPage + 10 - pGroup->nMinPage ); + assert( pCache->n90pct == pCache->nMax*9/10 ); + if( createFlag==1 && ( + nPinned>=pGroup->mxPinned + || nPinned>=pCache->n90pct + || (pcache1UnderMemoryPressure(pCache) && pCache->nRecyclablenPage>=pCache->nHash ) pcache1ResizeHash(pCache); + assert( pCache->nHash>0 && pCache->apHash ); + + /* Step 4. Try to recycle a page. */ + if( pCache->bPurgeable + && !pGroup->lru.pLruPrev->isAnchor + && ((pCache->nPage+1>=pCache->nMax) || pcache1UnderMemoryPressure(pCache)) + ){ + PCache1 *pOther; + pPage = pGroup->lru.pLruPrev; + assert( pPage->isPinned==0 ); + pcache1RemoveFromHash(pPage, 0); + pcache1PinPage(pPage); + pOther = pPage->pCache; + if( pOther->szAlloc != pCache->szAlloc ){ + pcache1FreePage(pPage); + pPage = 0; + }else{ + pGroup->nCurrentPage -= (pOther->bPurgeable - pCache->bPurgeable); + } + } + + /* Step 5. If a usable page buffer has still not been found, + ** attempt to allocate a new one. + */ + if( !pPage ){ + pPage = pcache1AllocPage(pCache, createFlag==1); + } + + if( pPage ){ + unsigned int h = iKey % pCache->nHash; + pCache->nPage++; + pPage->iKey = iKey; + pPage->pNext = pCache->apHash[h]; + pPage->pCache = pCache; + pPage->pLruPrev = 0; + pPage->pLruNext = 0; + pPage->isPinned = 1; + *(void **)pPage->page.pExtra = 0; + pCache->apHash[h] = pPage; + if( iKey>pCache->iMaxKey ){ + pCache->iMaxKey = iKey; + } + } + return pPage; +} + +/* +** Implementation of the sqlite3_pcache.xFetch method. +** +** Fetch a page by key value. +** +** Whether or not a new page may be allocated by this function depends on +** the value of the createFlag argument. 0 means do not allocate a new +** page. 1 means allocate a new page if space is easily available. 2 +** means to try really hard to allocate a new page. +** +** For a non-purgeable cache (a cache used as the storage for an in-memory +** database) there is really no difference between createFlag 1 and 2. So +** the calling function (pcache.c) will never have a createFlag of 1 on +** a non-purgeable cache. +** +** There are three different approaches to obtaining space for a page, +** depending on the value of parameter createFlag (which may be 0, 1 or 2). +** +** 1. Regardless of the value of createFlag, the cache is searched for a +** copy of the requested page. If one is found, it is returned. +** +** 2. If createFlag==0 and the page is not already in the cache, NULL is +** returned. +** +** 3. If createFlag is 1, and the page is not already in the cache, then +** return NULL (do not allocate a new page) if any of the following +** conditions are true: +** +** (a) the number of pages pinned by the cache is greater than +** PCache1.nMax, or +** +** (b) the number of pages pinned by the cache is greater than +** the sum of nMax for all purgeable caches, less the sum of +** nMin for all other purgeable caches, or +** +** 4. If none of the first three conditions apply and the cache is marked +** as purgeable, and if one of the following is true: +** +** (a) The number of pages allocated for the cache is already +** PCache1.nMax, or +** +** (b) The number of pages allocated for all purgeable caches is +** already equal to or greater than the sum of nMax for all +** purgeable caches, +** +** (c) The system is under memory pressure and wants to avoid +** unnecessary pages cache entry allocations +** +** then attempt to recycle a page from the LRU list. If it is the right +** size, return the recycled buffer. Otherwise, free the buffer and +** proceed to step 5. +** +** 5. Otherwise, allocate and return a new page buffer. +** +** There are two versions of this routine. pcache1FetchWithMutex() is +** the general case. pcache1FetchNoMutex() is a faster implementation for +** the common case where pGroup->mutex is NULL. The pcache1Fetch() wrapper +** invokes the appropriate routine. +*/ +static PgHdr1 *pcache1FetchNoMutex( + sqlite3_pcache *p, + unsigned int iKey, + int createFlag +){ + PCache1 *pCache = (PCache1 *)p; + PgHdr1 *pPage = 0; + + /* Step 1: Search the hash table for an existing entry. */ + pPage = pCache->apHash[iKey % pCache->nHash]; + while( pPage && pPage->iKey!=iKey ){ pPage = pPage->pNext; } + + /* Step 2: If the page was found in the hash table, then return it. + ** If the page was not in the hash table and createFlag is 0, abort. + ** Otherwise (page not in hash and createFlag!=0) continue with + ** subsequent steps to try to create the page. */ + if( pPage ){ + if( !pPage->isPinned ){ + return pcache1PinPage(pPage); + }else{ + return pPage; + } + }else if( createFlag ){ + /* Steps 3, 4, and 5 implemented by this subroutine */ + return pcache1FetchStage2(pCache, iKey, createFlag); + }else{ + return 0; + } +} +#if PCACHE1_MIGHT_USE_GROUP_MUTEX +static PgHdr1 *pcache1FetchWithMutex( + sqlite3_pcache *p, + unsigned int iKey, + int createFlag +){ + PCache1 *pCache = (PCache1 *)p; + PgHdr1 *pPage; + + pcache1EnterMutex(pCache->pGroup); + pPage = pcache1FetchNoMutex(p, iKey, createFlag); + assert( pPage==0 || pCache->iMaxKey>=iKey ); + pcache1LeaveMutex(pCache->pGroup); + return pPage; +} +#endif +static sqlite3_pcache_page *pcache1Fetch( + sqlite3_pcache *p, + unsigned int iKey, + int createFlag +){ +#if PCACHE1_MIGHT_USE_GROUP_MUTEX || defined(SQLITE_DEBUG) + PCache1 *pCache = (PCache1 *)p; +#endif + + assert( offsetof(PgHdr1,page)==0 ); + assert( pCache->bPurgeable || createFlag!=1 ); + assert( pCache->bPurgeable || pCache->nMin==0 ); + assert( pCache->bPurgeable==0 || pCache->nMin==10 ); + assert( pCache->nMin==0 || pCache->bPurgeable ); + assert( pCache->nHash>0 ); +#if PCACHE1_MIGHT_USE_GROUP_MUTEX + if( pCache->pGroup->mutex ){ + return (sqlite3_pcache_page*)pcache1FetchWithMutex(p, iKey, createFlag); + }else +#endif + { + return (sqlite3_pcache_page*)pcache1FetchNoMutex(p, iKey, createFlag); + } +} + + +/* +** Implementation of the sqlite3_pcache.xUnpin method. +** +** Mark a page as unpinned (eligible for asynchronous recycling). +*/ +static void pcache1Unpin( + sqlite3_pcache *p, + sqlite3_pcache_page *pPg, + int reuseUnlikely +){ + PCache1 *pCache = (PCache1 *)p; + PgHdr1 *pPage = (PgHdr1 *)pPg; + PGroup *pGroup = pCache->pGroup; + + assert( pPage->pCache==pCache ); + pcache1EnterMutex(pGroup); + + /* It is an error to call this function if the page is already + ** part of the PGroup LRU list. + */ + assert( pPage->pLruPrev==0 && pPage->pLruNext==0 ); + assert( pPage->isPinned==1 ); + + if( reuseUnlikely || pGroup->nCurrentPage>pGroup->nMaxPage ){ + pcache1RemoveFromHash(pPage, 1); + }else{ + /* Add the page to the PGroup LRU list. */ + PgHdr1 **ppFirst = &pGroup->lru.pLruNext; + pPage->pLruPrev = &pGroup->lru; + (pPage->pLruNext = *ppFirst)->pLruPrev = pPage; + *ppFirst = pPage; + pCache->nRecyclable++; + pPage->isPinned = 0; + } + + pcache1LeaveMutex(pCache->pGroup); +} + +/* +** Implementation of the sqlite3_pcache.xRekey method. +*/ +static void pcache1Rekey( + sqlite3_pcache *p, + sqlite3_pcache_page *pPg, + unsigned int iOld, + unsigned int iNew +){ + PCache1 *pCache = (PCache1 *)p; + PgHdr1 *pPage = (PgHdr1 *)pPg; + PgHdr1 **pp; + unsigned int h; + assert( pPage->iKey==iOld ); + assert( pPage->pCache==pCache ); + + pcache1EnterMutex(pCache->pGroup); + + h = iOld%pCache->nHash; + pp = &pCache->apHash[h]; + while( (*pp)!=pPage ){ + pp = &(*pp)->pNext; + } + *pp = pPage->pNext; + + h = iNew%pCache->nHash; + pPage->iKey = iNew; + pPage->pNext = pCache->apHash[h]; + pCache->apHash[h] = pPage; + if( iNew>pCache->iMaxKey ){ + pCache->iMaxKey = iNew; + } + + pcache1LeaveMutex(pCache->pGroup); +} + +/* +** Implementation of the sqlite3_pcache.xTruncate method. +** +** Discard all unpinned pages in the cache with a page number equal to +** or greater than parameter iLimit. Any pinned pages with a page number +** equal to or greater than iLimit are implicitly unpinned. +*/ +static void pcache1Truncate(sqlite3_pcache *p, unsigned int iLimit){ + PCache1 *pCache = (PCache1 *)p; + pcache1EnterMutex(pCache->pGroup); + if( iLimit<=pCache->iMaxKey ){ + pcache1TruncateUnsafe(pCache, iLimit); + pCache->iMaxKey = iLimit-1; + } + pcache1LeaveMutex(pCache->pGroup); +} + +/* +** Implementation of the sqlite3_pcache.xDestroy method. +** +** Destroy a cache allocated using pcache1Create(). +*/ +static void pcache1Destroy(sqlite3_pcache *p){ + PCache1 *pCache = (PCache1 *)p; + PGroup *pGroup = pCache->pGroup; + assert( pCache->bPurgeable || (pCache->nMax==0 && pCache->nMin==0) ); + pcache1EnterMutex(pGroup); + if( pCache->nPage ) pcache1TruncateUnsafe(pCache, 0); + assert( pGroup->nMaxPage >= pCache->nMax ); + pGroup->nMaxPage -= pCache->nMax; + assert( pGroup->nMinPage >= pCache->nMin ); + pGroup->nMinPage -= pCache->nMin; + pGroup->mxPinned = pGroup->nMaxPage + 10 - pGroup->nMinPage; + pcache1EnforceMaxPage(pCache); + pcache1LeaveMutex(pGroup); + sqlite3_free(pCache->pBulk); + sqlite3_free(pCache->apHash); + sqlite3_free(pCache); +} + +/* +** This function is called during initialization (sqlite3_initialize()) to +** install the default pluggable cache module, assuming the user has not +** already provided an alternative. +*/ +SQLITE_PRIVATE void sqlite3PCacheSetDefault(void){ + static const sqlite3_pcache_methods2 defaultMethods = { + 1, /* iVersion */ + 0, /* pArg */ + pcache1Init, /* xInit */ + pcache1Shutdown, /* xShutdown */ + pcache1Create, /* xCreate */ + pcache1Cachesize, /* xCachesize */ + pcache1Pagecount, /* xPagecount */ + pcache1Fetch, /* xFetch */ + pcache1Unpin, /* xUnpin */ + pcache1Rekey, /* xRekey */ + pcache1Truncate, /* xTruncate */ + pcache1Destroy, /* xDestroy */ + pcache1Shrink /* xShrink */ + }; + sqlite3_config(SQLITE_CONFIG_PCACHE2, &defaultMethods); +} + +/* +** Return the size of the header on each page of this PCACHE implementation. +*/ +SQLITE_PRIVATE int sqlite3HeaderSizePcache1(void){ return ROUND8(sizeof(PgHdr1)); } + +/* +** Return the global mutex used by this PCACHE implementation. The +** sqlite3_status() routine needs access to this mutex. +*/ +SQLITE_PRIVATE sqlite3_mutex *sqlite3Pcache1Mutex(void){ + return pcache1.mutex; +} + +#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT +/* +** This function is called to free superfluous dynamically allocated memory +** held by the pager system. Memory in use by any SQLite pager allocated +** by the current thread may be sqlite3_free()ed. +** +** nReq is the number of bytes of memory required. Once this much has +** been released, the function returns. The return value is the total number +** of bytes of memory released. +*/ +SQLITE_PRIVATE int sqlite3PcacheReleaseMemory(int nReq){ + int nFree = 0; + assert( sqlite3_mutex_notheld(pcache1.grp.mutex) ); + assert( sqlite3_mutex_notheld(pcache1.mutex) ); + if( sqlite3GlobalConfig.nPage==0 ){ + PgHdr1 *p; + pcache1EnterMutex(&pcache1.grp); + while( (nReq<0 || nFreeisAnchor==0 + ){ + nFree += pcache1MemSize(p->page.pBuf); +#ifdef SQLITE_PCACHE_SEPARATE_HEADER + nFree += sqlite3MemSize(p); +#endif + assert( p->isPinned==0 ); + pcache1PinPage(p); + pcache1RemoveFromHash(p, 1); + } + pcache1LeaveMutex(&pcache1.grp); + } + return nFree; +} +#endif /* SQLITE_ENABLE_MEMORY_MANAGEMENT */ + +#ifdef SQLITE_TEST +/* +** This function is used by test procedures to inspect the internal state +** of the global cache. +*/ +SQLITE_PRIVATE void sqlite3PcacheStats( + int *pnCurrent, /* OUT: Total number of pages cached */ + int *pnMax, /* OUT: Global maximum cache size */ + int *pnMin, /* OUT: Sum of PCache1.nMin for purgeable caches */ + int *pnRecyclable /* OUT: Total number of pages available for recycling */ +){ + PgHdr1 *p; + int nRecyclable = 0; + for(p=pcache1.grp.lru.pLruNext; p && !p->isAnchor; p=p->pLruNext){ + assert( p->isPinned==0 ); + nRecyclable++; + } + *pnCurrent = pcache1.grp.nCurrentPage; + *pnMax = (int)pcache1.grp.nMaxPage; + *pnMin = (int)pcache1.grp.nMinPage; + *pnRecyclable = nRecyclable; +} +#endif + +/************** End of pcache1.c *********************************************/ +/************** Begin file rowset.c ******************************************/ +/* +** 2008 December 3 +** +** 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 implements an object we call a "RowSet". +** +** The RowSet object is a collection of rowids. Rowids +** are inserted into the RowSet in an arbitrary order. Inserts +** can be intermixed with tests to see if a given rowid has been +** previously inserted into the RowSet. +** +** After all inserts are finished, it is possible to extract the +** elements of the RowSet in sorted order. Once this extraction +** process has started, no new elements may be inserted. +** +** Hence, the primitive operations for a RowSet are: +** +** CREATE +** INSERT +** TEST +** SMALLEST +** DESTROY +** +** The CREATE and DESTROY primitives are the constructor and destructor, +** obviously. The INSERT primitive adds a new element to the RowSet. +** TEST checks to see if an element is already in the RowSet. SMALLEST +** extracts the least value from the RowSet. +** +** The INSERT primitive might allocate additional memory. Memory is +** allocated in chunks so most INSERTs do no allocation. There is an +** upper bound on the size of allocated memory. No memory is freed +** until DESTROY. +** +** The TEST primitive includes a "batch" number. The TEST primitive +** will only see elements that were inserted before the last change +** in the batch number. In other words, if an INSERT occurs between +** two TESTs where the TESTs have the same batch nubmer, then the +** value added by the INSERT will not be visible to the second TEST. +** The initial batch number is zero, so if the very first TEST contains +** a non-zero batch number, it will see all prior INSERTs. +** +** No INSERTs may occurs after a SMALLEST. An assertion will fail if +** that is attempted. +** +** The cost of an INSERT is roughly constant. (Sometimes new memory +** has to be allocated on an INSERT.) The cost of a TEST with a new +** batch number is O(NlogN) where N is the number of elements in the RowSet. +** The cost of a TEST using the same batch number is O(logN). The cost +** of the first SMALLEST is O(NlogN). Second and subsequent SMALLEST +** primitives are constant time. The cost of DESTROY is O(N). +** +** TEST and SMALLEST may not be used by the same RowSet. This used to +** be possible, but the feature was not used, so it was removed in order +** to simplify the code. +*/ +/* #include "sqliteInt.h" */ + + +/* +** Target size for allocation chunks. +*/ +#define ROWSET_ALLOCATION_SIZE 1024 + +/* +** The number of rowset entries per allocation chunk. +*/ +#define ROWSET_ENTRY_PER_CHUNK \ + ((ROWSET_ALLOCATION_SIZE-8)/sizeof(struct RowSetEntry)) + +/* +** Each entry in a RowSet is an instance of the following object. +** +** This same object is reused to store a linked list of trees of RowSetEntry +** objects. In that alternative use, pRight points to the next entry +** in the list, pLeft points to the tree, and v is unused. The +** RowSet.pForest value points to the head of this forest list. +*/ +struct RowSetEntry { + i64 v; /* ROWID value for this entry */ + struct RowSetEntry *pRight; /* Right subtree (larger entries) or list */ + struct RowSetEntry *pLeft; /* Left subtree (smaller entries) */ +}; + +/* +** RowSetEntry objects are allocated in large chunks (instances of the +** following structure) to reduce memory allocation overhead. The +** chunks are kept on a linked list so that they can be deallocated +** when the RowSet is destroyed. +*/ +struct RowSetChunk { + struct RowSetChunk *pNextChunk; /* Next chunk on list of them all */ + struct RowSetEntry aEntry[ROWSET_ENTRY_PER_CHUNK]; /* Allocated entries */ +}; + +/* +** A RowSet in an instance of the following structure. +** +** A typedef of this structure if found in sqliteInt.h. +*/ +struct RowSet { + struct RowSetChunk *pChunk; /* List of all chunk allocations */ + sqlite3 *db; /* The database connection */ + struct RowSetEntry *pEntry; /* List of entries using pRight */ + struct RowSetEntry *pLast; /* Last entry on the pEntry list */ + struct RowSetEntry *pFresh; /* Source of new entry objects */ + struct RowSetEntry *pForest; /* List of binary trees of entries */ + u16 nFresh; /* Number of objects on pFresh */ + u16 rsFlags; /* Various flags */ + int iBatch; /* Current insert batch */ +}; + +/* +** Allowed values for RowSet.rsFlags +*/ +#define ROWSET_SORTED 0x01 /* True if RowSet.pEntry is sorted */ +#define ROWSET_NEXT 0x02 /* True if sqlite3RowSetNext() has been called */ + +/* +** Turn bulk memory into a RowSet object. N bytes of memory +** are available at pSpace. The db pointer is used as a memory context +** for any subsequent allocations that need to occur. +** Return a pointer to the new RowSet object. +** +** It must be the case that N is sufficient to make a Rowset. If not +** an assertion fault occurs. +** +** If N is larger than the minimum, use the surplus as an initial +** allocation of entries available to be filled. +*/ +SQLITE_PRIVATE RowSet *sqlite3RowSetInit(sqlite3 *db, void *pSpace, unsigned int N){ + RowSet *p; + assert( N >= ROUND8(sizeof(*p)) ); + p = pSpace; + p->pChunk = 0; + p->db = db; + p->pEntry = 0; + p->pLast = 0; + p->pForest = 0; + p->pFresh = (struct RowSetEntry*)(ROUND8(sizeof(*p)) + (char*)p); + p->nFresh = (u16)((N - ROUND8(sizeof(*p)))/sizeof(struct RowSetEntry)); + p->rsFlags = ROWSET_SORTED; + p->iBatch = 0; + return p; +} + +/* +** Deallocate all chunks from a RowSet. This frees all memory that +** the RowSet has allocated over its lifetime. This routine is +** the destructor for the RowSet. +*/ +SQLITE_PRIVATE void sqlite3RowSetClear(RowSet *p){ + struct RowSetChunk *pChunk, *pNextChunk; + for(pChunk=p->pChunk; pChunk; pChunk = pNextChunk){ + pNextChunk = pChunk->pNextChunk; + sqlite3DbFree(p->db, pChunk); + } + p->pChunk = 0; + p->nFresh = 0; + p->pEntry = 0; + p->pLast = 0; + p->pForest = 0; + p->rsFlags = ROWSET_SORTED; +} + +/* +** Allocate a new RowSetEntry object that is associated with the +** given RowSet. Return a pointer to the new and completely uninitialized +** objected. +** +** In an OOM situation, the RowSet.db->mallocFailed flag is set and this +** routine returns NULL. +*/ +static struct RowSetEntry *rowSetEntryAlloc(RowSet *p){ + assert( p!=0 ); + if( p->nFresh==0 ){ /*OPTIMIZATION-IF-FALSE*/ + /* We could allocate a fresh RowSetEntry each time one is needed, but it + ** is more efficient to pull a preallocated entry from the pool */ + struct RowSetChunk *pNew; + pNew = sqlite3DbMallocRawNN(p->db, sizeof(*pNew)); + if( pNew==0 ){ + return 0; + } + pNew->pNextChunk = p->pChunk; + p->pChunk = pNew; + p->pFresh = pNew->aEntry; + p->nFresh = ROWSET_ENTRY_PER_CHUNK; + } + p->nFresh--; + return p->pFresh++; +} + +/* +** Insert a new value into a RowSet. +** +** The mallocFailed flag of the database connection is set if a +** memory allocation fails. +*/ +SQLITE_PRIVATE void sqlite3RowSetInsert(RowSet *p, i64 rowid){ + struct RowSetEntry *pEntry; /* The new entry */ + struct RowSetEntry *pLast; /* The last prior entry */ + + /* This routine is never called after sqlite3RowSetNext() */ + assert( p!=0 && (p->rsFlags & ROWSET_NEXT)==0 ); + + pEntry = rowSetEntryAlloc(p); + if( pEntry==0 ) return; + pEntry->v = rowid; + pEntry->pRight = 0; + pLast = p->pLast; + if( pLast ){ + if( rowid<=pLast->v ){ /*OPTIMIZATION-IF-FALSE*/ + /* Avoid unnecessary sorts by preserving the ROWSET_SORTED flags + ** where possible */ + p->rsFlags &= ~ROWSET_SORTED; + } + pLast->pRight = pEntry; + }else{ + p->pEntry = pEntry; + } + p->pLast = pEntry; +} + +/* +** Merge two lists of RowSetEntry objects. Remove duplicates. +** +** The input lists are connected via pRight pointers and are +** assumed to each already be in sorted order. +*/ +static struct RowSetEntry *rowSetEntryMerge( + struct RowSetEntry *pA, /* First sorted list to be merged */ + struct RowSetEntry *pB /* Second sorted list to be merged */ +){ + struct RowSetEntry head; + struct RowSetEntry *pTail; + + pTail = &head; + assert( pA!=0 && pB!=0 ); + for(;;){ + assert( pA->pRight==0 || pA->v<=pA->pRight->v ); + assert( pB->pRight==0 || pB->v<=pB->pRight->v ); + if( pA->v<=pB->v ){ + if( pA->vv ) pTail = pTail->pRight = pA; + pA = pA->pRight; + if( pA==0 ){ + pTail->pRight = pB; + break; + } + }else{ + pTail = pTail->pRight = pB; + pB = pB->pRight; + if( pB==0 ){ + pTail->pRight = pA; + break; + } + } + } + return head.pRight; +} + +/* +** Sort all elements on the list of RowSetEntry objects into order of +** increasing v. +*/ +static struct RowSetEntry *rowSetEntrySort(struct RowSetEntry *pIn){ + unsigned int i; + struct RowSetEntry *pNext, *aBucket[40]; + + memset(aBucket, 0, sizeof(aBucket)); + while( pIn ){ + pNext = pIn->pRight; + pIn->pRight = 0; + for(i=0; aBucket[i]; i++){ + pIn = rowSetEntryMerge(aBucket[i], pIn); + aBucket[i] = 0; + } + aBucket[i] = pIn; + pIn = pNext; + } + pIn = aBucket[0]; + for(i=1; ipLeft ){ + struct RowSetEntry *p; + rowSetTreeToList(pIn->pLeft, ppFirst, &p); + p->pRight = pIn; + }else{ + *ppFirst = pIn; + } + if( pIn->pRight ){ + rowSetTreeToList(pIn->pRight, &pIn->pRight, ppLast); + }else{ + *ppLast = pIn; + } + assert( (*ppLast)->pRight==0 ); +} + + +/* +** Convert a sorted list of elements (connected by pRight) into a binary +** tree with depth of iDepth. A depth of 1 means the tree contains a single +** node taken from the head of *ppList. A depth of 2 means a tree with +** three nodes. And so forth. +** +** Use as many entries from the input list as required and update the +** *ppList to point to the unused elements of the list. If the input +** list contains too few elements, then construct an incomplete tree +** and leave *ppList set to NULL. +** +** Return a pointer to the root of the constructed binary tree. +*/ +static struct RowSetEntry *rowSetNDeepTree( + struct RowSetEntry **ppList, + int iDepth +){ + struct RowSetEntry *p; /* Root of the new tree */ + struct RowSetEntry *pLeft; /* Left subtree */ + if( *ppList==0 ){ /*OPTIMIZATION-IF-TRUE*/ + /* Prevent unnecessary deep recursion when we run out of entries */ + return 0; + } + if( iDepth>1 ){ /*OPTIMIZATION-IF-TRUE*/ + /* This branch causes a *balanced* tree to be generated. A valid tree + ** is still generated without this branch, but the tree is wildly + ** unbalanced and inefficient. */ + pLeft = rowSetNDeepTree(ppList, iDepth-1); + p = *ppList; + if( p==0 ){ /*OPTIMIZATION-IF-FALSE*/ + /* It is safe to always return here, but the resulting tree + ** would be unbalanced */ + return pLeft; + } + p->pLeft = pLeft; + *ppList = p->pRight; + p->pRight = rowSetNDeepTree(ppList, iDepth-1); + }else{ + p = *ppList; + *ppList = p->pRight; + p->pLeft = p->pRight = 0; + } + return p; +} + +/* +** Convert a sorted list of elements into a binary tree. Make the tree +** as deep as it needs to be in order to contain the entire list. +*/ +static struct RowSetEntry *rowSetListToTree(struct RowSetEntry *pList){ + int iDepth; /* Depth of the tree so far */ + struct RowSetEntry *p; /* Current tree root */ + struct RowSetEntry *pLeft; /* Left subtree */ + + assert( pList!=0 ); + p = pList; + pList = p->pRight; + p->pLeft = p->pRight = 0; + for(iDepth=1; pList; iDepth++){ + pLeft = p; + p = pList; + pList = p->pRight; + p->pLeft = pLeft; + p->pRight = rowSetNDeepTree(&pList, iDepth); + } + return p; +} + +/* +** Extract the smallest element from the RowSet. +** Write the element into *pRowid. Return 1 on success. Return +** 0 if the RowSet is already empty. +** +** After this routine has been called, the sqlite3RowSetInsert() +** routine may not be called again. +** +** This routine may not be called after sqlite3RowSetTest() has +** been used. Older versions of RowSet allowed that, but as the +** capability was not used by the code generator, it was removed +** for code economy. +*/ +SQLITE_PRIVATE int sqlite3RowSetNext(RowSet *p, i64 *pRowid){ + assert( p!=0 ); + assert( p->pForest==0 ); /* Cannot be used with sqlite3RowSetText() */ + + /* Merge the forest into a single sorted list on first call */ + if( (p->rsFlags & ROWSET_NEXT)==0 ){ /*OPTIMIZATION-IF-FALSE*/ + if( (p->rsFlags & ROWSET_SORTED)==0 ){ /*OPTIMIZATION-IF-FALSE*/ + p->pEntry = rowSetEntrySort(p->pEntry); + } + p->rsFlags |= ROWSET_SORTED|ROWSET_NEXT; + } + + /* Return the next entry on the list */ + if( p->pEntry ){ + *pRowid = p->pEntry->v; + p->pEntry = p->pEntry->pRight; + if( p->pEntry==0 ){ /*OPTIMIZATION-IF-TRUE*/ + /* Free memory immediately, rather than waiting on sqlite3_finalize() */ + sqlite3RowSetClear(p); + } + return 1; + }else{ + return 0; + } +} + +/* +** Check to see if element iRowid was inserted into the rowset as +** part of any insert batch prior to iBatch. Return 1 or 0. +** +** If this is the first test of a new batch and if there exist entries +** on pRowSet->pEntry, then sort those entries into the forest at +** pRowSet->pForest so that they can be tested. +*/ +SQLITE_PRIVATE int sqlite3RowSetTest(RowSet *pRowSet, int iBatch, sqlite3_int64 iRowid){ + struct RowSetEntry *p, *pTree; + + /* This routine is never called after sqlite3RowSetNext() */ + assert( pRowSet!=0 && (pRowSet->rsFlags & ROWSET_NEXT)==0 ); + + /* Sort entries into the forest on the first test of a new batch. + ** To save unnecessary work, only do this when the batch number changes. + */ + if( iBatch!=pRowSet->iBatch ){ /*OPTIMIZATION-IF-FALSE*/ + p = pRowSet->pEntry; + if( p ){ + struct RowSetEntry **ppPrevTree = &pRowSet->pForest; + if( (pRowSet->rsFlags & ROWSET_SORTED)==0 ){ /*OPTIMIZATION-IF-FALSE*/ + /* Only sort the current set of entiries if they need it */ + p = rowSetEntrySort(p); + } + for(pTree = pRowSet->pForest; pTree; pTree=pTree->pRight){ + ppPrevTree = &pTree->pRight; + if( pTree->pLeft==0 ){ + pTree->pLeft = rowSetListToTree(p); + break; + }else{ + struct RowSetEntry *pAux, *pTail; + rowSetTreeToList(pTree->pLeft, &pAux, &pTail); + pTree->pLeft = 0; + p = rowSetEntryMerge(pAux, p); + } + } + if( pTree==0 ){ + *ppPrevTree = pTree = rowSetEntryAlloc(pRowSet); + if( pTree ){ + pTree->v = 0; + pTree->pRight = 0; + pTree->pLeft = rowSetListToTree(p); + } + } + pRowSet->pEntry = 0; + pRowSet->pLast = 0; + pRowSet->rsFlags |= ROWSET_SORTED; + } + pRowSet->iBatch = iBatch; + } + + /* Test to see if the iRowid value appears anywhere in the forest. + ** Return 1 if it does and 0 if not. + */ + for(pTree = pRowSet->pForest; pTree; pTree=pTree->pRight){ + p = pTree->pLeft; + while( p ){ + if( p->vpRight; + }else if( p->v>iRowid ){ + p = p->pLeft; + }else{ + return 1; + } + } + } + return 0; +} + +/************** End of rowset.c **********************************************/ +/************** Begin file pager.c *******************************************/ +/* +** 2001 September 15 +** +** 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 the page cache subsystem or "pager". +** +** The pager is used to access a database disk file. It implements +** atomic commit and rollback through the use of a journal file that +** is separate from the database file. The pager also implements file +** locking to prevent two processes from writing the same database +** file simultaneously, or one process from reading the database while +** another is writing. +*/ +#ifndef SQLITE_OMIT_DISKIO +/* #include "sqliteInt.h" */ +/************** Include wal.h in the middle of pager.c ***********************/ +/************** Begin file wal.h *********************************************/ +/* +** 2010 February 1 +** +** 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 header file defines the interface to the write-ahead logging +** system. Refer to the comments below and the header comment attached to +** the implementation of each function in log.c for further details. +*/ + +#ifndef SQLITE_WAL_H +#define SQLITE_WAL_H + +/* #include "sqliteInt.h" */ + +/* Additional values that can be added to the sync_flags argument of +** sqlite3WalFrames(): +*/ +#define WAL_SYNC_TRANSACTIONS 0x20 /* Sync at the end of each transaction */ +#define SQLITE_SYNC_MASK 0x13 /* Mask off the SQLITE_SYNC_* values */ + +#ifdef SQLITE_OMIT_WAL +# define sqlite3WalOpen(x,y,z) 0 +# define sqlite3WalLimit(x,y) +# define sqlite3WalClose(w,x,y,z) 0 +# define sqlite3WalBeginReadTransaction(y,z) 0 +# define sqlite3WalEndReadTransaction(z) +# define sqlite3WalDbsize(y) 0 +# define sqlite3WalBeginWriteTransaction(y) 0 +# define sqlite3WalEndWriteTransaction(x) 0 +# define sqlite3WalUndo(x,y,z) 0 +# define sqlite3WalSavepoint(y,z) +# define sqlite3WalSavepointUndo(y,z) 0 +# define sqlite3WalFrames(u,v,w,x,y,z) 0 +# define sqlite3WalCheckpoint(r,s,t,u,v,w,x,y,z) 0 +# define sqlite3WalCallback(z) 0 +# define sqlite3WalExclusiveMode(y,z) 0 +# define sqlite3WalHeapMemory(z) 0 +# define sqlite3WalFramesize(z) 0 +# define sqlite3WalFindFrame(x,y,z) 0 +# define sqlite3WalFile(x) 0 +#else + +#define WAL_SAVEPOINT_NDATA 4 + +/* Connection to a write-ahead log (WAL) file. +** There is one object of this type for each pager. +*/ +typedef struct Wal Wal; + +/* Open and close a connection to a write-ahead log. */ +SQLITE_PRIVATE int sqlite3WalOpen(sqlite3_vfs*, sqlite3_file*, const char *, int, i64, Wal**); +SQLITE_PRIVATE int sqlite3WalClose(Wal *pWal, int sync_flags, int, u8 *); + +/* Set the limiting size of a WAL file. */ +SQLITE_PRIVATE void sqlite3WalLimit(Wal*, i64); + +/* Used by readers to open (lock) and close (unlock) a snapshot. A +** snapshot is like a read-transaction. It is the state of the database +** at an instant in time. sqlite3WalOpenSnapshot gets a read lock and +** preserves the current state even if the other threads or processes +** write to or checkpoint the WAL. sqlite3WalCloseSnapshot() closes the +** transaction and releases the lock. +*/ +SQLITE_PRIVATE int sqlite3WalBeginReadTransaction(Wal *pWal, int *); +SQLITE_PRIVATE void sqlite3WalEndReadTransaction(Wal *pWal); + +/* Read a page from the write-ahead log, if it is present. */ +SQLITE_PRIVATE int sqlite3WalFindFrame(Wal *, Pgno, u32 *); +SQLITE_PRIVATE int sqlite3WalReadFrame(Wal *, u32, int, u8 *); + +/* If the WAL is not empty, return the size of the database. */ +SQLITE_PRIVATE Pgno sqlite3WalDbsize(Wal *pWal); + +/* Obtain or release the WRITER lock. */ +SQLITE_PRIVATE int sqlite3WalBeginWriteTransaction(Wal *pWal); +SQLITE_PRIVATE int sqlite3WalEndWriteTransaction(Wal *pWal); + +/* Undo any frames written (but not committed) to the log */ +SQLITE_PRIVATE int sqlite3WalUndo(Wal *pWal, int (*xUndo)(void *, Pgno), void *pUndoCtx); + +/* Return an integer that records the current (uncommitted) write +** position in the WAL */ +SQLITE_PRIVATE void sqlite3WalSavepoint(Wal *pWal, u32 *aWalData); + +/* Move the write position of the WAL back to iFrame. Called in +** response to a ROLLBACK TO command. */ +SQLITE_PRIVATE int sqlite3WalSavepointUndo(Wal *pWal, u32 *aWalData); + +/* Write a frame or frames to the log. */ +SQLITE_PRIVATE int sqlite3WalFrames(Wal *pWal, int, PgHdr *, Pgno, int, int); + +/* Copy pages from the log to the database file */ +SQLITE_PRIVATE int sqlite3WalCheckpoint( + Wal *pWal, /* Write-ahead log connection */ + int eMode, /* One of PASSIVE, FULL and RESTART */ + int (*xBusy)(void*), /* Function to call when busy */ + void *pBusyArg, /* Context argument for xBusyHandler */ + int sync_flags, /* Flags to sync db file with (or 0) */ + int nBuf, /* Size of buffer nBuf */ + u8 *zBuf, /* Temporary buffer to use */ + int *pnLog, /* OUT: Number of frames in WAL */ + int *pnCkpt /* OUT: Number of backfilled frames in WAL */ +); + +/* Return the value to pass to a sqlite3_wal_hook callback, the +** number of frames in the WAL at the point of the last commit since +** sqlite3WalCallback() was called. If no commits have occurred since +** the last call, then return 0. +*/ +SQLITE_PRIVATE int sqlite3WalCallback(Wal *pWal); + +/* Tell the wal layer that an EXCLUSIVE lock has been obtained (or released) +** by the pager layer on the database file. +*/ +SQLITE_PRIVATE int sqlite3WalExclusiveMode(Wal *pWal, int op); + +/* Return true if the argument is non-NULL and the WAL module is using +** heap-memory for the wal-index. Otherwise, if the argument is NULL or the +** WAL module is using shared-memory, return false. +*/ +SQLITE_PRIVATE int sqlite3WalHeapMemory(Wal *pWal); + +#ifdef SQLITE_ENABLE_SNAPSHOT +SQLITE_PRIVATE int sqlite3WalSnapshotGet(Wal *pWal, sqlite3_snapshot **ppSnapshot); +SQLITE_PRIVATE void sqlite3WalSnapshotOpen(Wal *pWal, sqlite3_snapshot *pSnapshot); +#endif + +#ifdef SQLITE_ENABLE_ZIPVFS +/* If the WAL file is not empty, return the number of bytes of content +** stored in each frame (i.e. the db page-size when the WAL was created). +*/ +SQLITE_PRIVATE int sqlite3WalFramesize(Wal *pWal); +#endif + +/* Return the sqlite3_file object for the WAL file */ +SQLITE_PRIVATE sqlite3_file *sqlite3WalFile(Wal *pWal); + +#endif /* ifndef SQLITE_OMIT_WAL */ +#endif /* SQLITE_WAL_H */ + +/************** End of wal.h *************************************************/ +/************** Continuing where we left off in pager.c **********************/ + + +/******************* NOTES ON THE DESIGN OF THE PAGER ************************ +** +** This comment block describes invariants that hold when using a rollback +** journal. These invariants do not apply for journal_mode=WAL, +** journal_mode=MEMORY, or journal_mode=OFF. +** +** Within this comment block, a page is deemed to have been synced +** automatically as soon as it is written when PRAGMA synchronous=OFF. +** Otherwise, the page is not synced until the xSync method of the VFS +** is called successfully on the file containing the page. +** +** Definition: A page of the database file is said to be "overwriteable" if +** one or more of the following are true about the page: +** +** (a) The original content of the page as it was at the beginning of +** the transaction has been written into the rollback journal and +** synced. +** +** (b) The page was a freelist leaf page at the start of the transaction. +** +** (c) The page number is greater than the largest page that existed in +** the database file at the start of the transaction. +** +** (1) A page of the database file is never overwritten unless one of the +** following are true: +** +** (a) The page and all other pages on the same sector are overwriteable. +** +** (b) The atomic page write optimization is enabled, and the entire +** transaction other than the update of the transaction sequence +** number consists of a single page change. +** +** (2) The content of a page written into the rollback journal exactly matches +** both the content in the database when the rollback journal was written +** and the content in the database at the beginning of the current +** transaction. +** +** (3) Writes to the database file are an integer multiple of the page size +** in length and are aligned on a page boundary. +** +** (4) Reads from the database file are either aligned on a page boundary and +** an integer multiple of the page size in length or are taken from the +** first 100 bytes of the database file. +** +** (5) All writes to the database file are synced prior to the rollback journal +** being deleted, truncated, or zeroed. +** +** (6) If a master journal file is used, then all writes to the database file +** are synced prior to the master journal being deleted. +** +** Definition: Two databases (or the same database at two points it time) +** are said to be "logically equivalent" if they give the same answer to +** all queries. Note in particular the content of freelist leaf +** pages can be changed arbitrarily without affecting the logical equivalence +** of the database. +** +** (7) At any time, if any subset, including the empty set and the total set, +** of the unsynced changes to a rollback journal are removed and the +** journal is rolled back, the resulting database file will be logically +** equivalent to the database file at the beginning of the transaction. +** +** (8) When a transaction is rolled back, the xTruncate method of the VFS +** is called to restore the database file to the same size it was at +** the beginning of the transaction. (In some VFSes, the xTruncate +** method is a no-op, but that does not change the fact the SQLite will +** invoke it.) +** +** (9) Whenever the database file is modified, at least one bit in the range +** of bytes from 24 through 39 inclusive will be changed prior to releasing +** the EXCLUSIVE lock, thus signaling other connections on the same +** database to flush their caches. +** +** (10) The pattern of bits in bytes 24 through 39 shall not repeat in less +** than one billion transactions. +** +** (11) A database file is well-formed at the beginning and at the conclusion +** of every transaction. +** +** (12) An EXCLUSIVE lock is held on the database file when writing to +** the database file. +** +** (13) A SHARED lock is held on the database file while reading any +** content out of the database file. +** +******************************************************************************/ + +/* +** Macros for troubleshooting. Normally turned off +*/ +#if 0 +int sqlite3PagerTrace=1; /* True to enable tracing */ +#define sqlite3DebugPrintf printf +#define PAGERTRACE(X) if( sqlite3PagerTrace ){ sqlite3DebugPrintf X; } +#else +#define PAGERTRACE(X) +#endif + +/* +** The following two macros are used within the PAGERTRACE() macros above +** to print out file-descriptors. +** +** PAGERID() takes a pointer to a Pager struct as its argument. The +** associated file-descriptor is returned. FILEHANDLEID() takes an sqlite3_file +** struct as its argument. +*/ +#define PAGERID(p) ((int)(p->fd)) +#define FILEHANDLEID(fd) ((int)fd) + +/* +** The Pager.eState variable stores the current 'state' of a pager. A +** pager may be in any one of the seven states shown in the following +** state diagram. +** +** OPEN <------+------+ +** | | | +** V | | +** +---------> READER-------+ | +** | | | +** | V | +** |<-------WRITER_LOCKED------> ERROR +** | | ^ +** | V | +** |<------WRITER_CACHEMOD-------->| +** | | | +** | V | +** |<-------WRITER_DBMOD---------->| +** | | | +** | V | +** +<------WRITER_FINISHED-------->+ +** +** +** List of state transitions and the C [function] that performs each: +** +** OPEN -> READER [sqlite3PagerSharedLock] +** READER -> OPEN [pager_unlock] +** +** READER -> WRITER_LOCKED [sqlite3PagerBegin] +** WRITER_LOCKED -> WRITER_CACHEMOD [pager_open_journal] +** WRITER_CACHEMOD -> WRITER_DBMOD [syncJournal] +** WRITER_DBMOD -> WRITER_FINISHED [sqlite3PagerCommitPhaseOne] +** WRITER_*** -> READER [pager_end_transaction] +** +** WRITER_*** -> ERROR [pager_error] +** ERROR -> OPEN [pager_unlock] +** +** +** OPEN: +** +** The pager starts up in this state. Nothing is guaranteed in this +** state - the file may or may not be locked and the database size is +** unknown. The database may not be read or written. +** +** * No read or write transaction is active. +** * Any lock, or no lock at all, may be held on the database file. +** * The dbSize, dbOrigSize and dbFileSize variables may not be trusted. +** +** READER: +** +** In this state all the requirements for reading the database in +** rollback (non-WAL) mode are met. Unless the pager is (or recently +** was) in exclusive-locking mode, a user-level read transaction is +** open. The database size is known in this state. +** +** A connection running with locking_mode=normal enters this state when +** it opens a read-transaction on the database and returns to state +** OPEN after the read-transaction is completed. However a connection +** running in locking_mode=exclusive (including temp databases) remains in +** this state even after the read-transaction is closed. The only way +** a locking_mode=exclusive connection can transition from READER to OPEN +** is via the ERROR state (see below). +** +** * A read transaction may be active (but a write-transaction cannot). +** * A SHARED or greater lock is held on the database file. +** * The dbSize variable may be trusted (even if a user-level read +** transaction is not active). The dbOrigSize and dbFileSize variables +** may not be trusted at this point. +** * If the database is a WAL database, then the WAL connection is open. +** * Even if a read-transaction is not open, it is guaranteed that +** there is no hot-journal in the file-system. +** +** WRITER_LOCKED: +** +** The pager moves to this state from READER when a write-transaction +** is first opened on the database. In WRITER_LOCKED state, all locks +** required to start a write-transaction are held, but no actual +** modifications to the cache or database have taken place. +** +** In rollback mode, a RESERVED or (if the transaction was opened with +** BEGIN EXCLUSIVE) EXCLUSIVE lock is obtained on the database file when +** moving to this state, but the journal file is not written to or opened +** to in this state. If the transaction is committed or rolled back while +** in WRITER_LOCKED state, all that is required is to unlock the database +** file. +** +** IN WAL mode, WalBeginWriteTransaction() is called to lock the log file. +** If the connection is running with locking_mode=exclusive, an attempt +** is made to obtain an EXCLUSIVE lock on the database file. +** +** * A write transaction is active. +** * If the connection is open in rollback-mode, a RESERVED or greater +** lock is held on the database file. +** * If the connection is open in WAL-mode, a WAL write transaction +** is open (i.e. sqlite3WalBeginWriteTransaction() has been successfully +** called). +** * The dbSize, dbOrigSize and dbFileSize variables are all valid. +** * The contents of the pager cache have not been modified. +** * The journal file may or may not be open. +** * Nothing (not even the first header) has been written to the journal. +** +** WRITER_CACHEMOD: +** +** A pager moves from WRITER_LOCKED state to this state when a page is +** first modified by the upper layer. In rollback mode the journal file +** is opened (if it is not already open) and a header written to the +** start of it. The database file on disk has not been modified. +** +** * A write transaction is active. +** * A RESERVED or greater lock is held on the database file. +** * The journal file is open and the first header has been written +** to it, but the header has not been synced to disk. +** * The contents of the page cache have been modified. +** +** WRITER_DBMOD: +** +** The pager transitions from WRITER_CACHEMOD into WRITER_DBMOD state +** when it modifies the contents of the database file. WAL connections +** never enter this state (since they do not modify the database file, +** just the log file). +** +** * A write transaction is active. +** * An EXCLUSIVE or greater lock is held on the database file. +** * The journal file is open and the first header has been written +** and synced to disk. +** * The contents of the page cache have been modified (and possibly +** written to disk). +** +** WRITER_FINISHED: +** +** It is not possible for a WAL connection to enter this state. +** +** A rollback-mode pager changes to WRITER_FINISHED state from WRITER_DBMOD +** state after the entire transaction has been successfully written into the +** database file. In this state the transaction may be committed simply +** by finalizing the journal file. Once in WRITER_FINISHED state, it is +** not possible to modify the database further. At this point, the upper +** layer must either commit or rollback the transaction. +** +** * A write transaction is active. +** * An EXCLUSIVE or greater lock is held on the database file. +** * All writing and syncing of journal and database data has finished. +** If no error occurred, all that remains is to finalize the journal to +** commit the transaction. If an error did occur, the caller will need +** to rollback the transaction. +** +** ERROR: +** +** The ERROR state is entered when an IO or disk-full error (including +** SQLITE_IOERR_NOMEM) occurs at a point in the code that makes it +** difficult to be sure that the in-memory pager state (cache contents, +** db size etc.) are consistent with the contents of the file-system. +** +** Temporary pager files may enter the ERROR state, but in-memory pagers +** cannot. +** +** For example, if an IO error occurs while performing a rollback, +** the contents of the page-cache may be left in an inconsistent state. +** At this point it would be dangerous to change back to READER state +** (as usually happens after a rollback). Any subsequent readers might +** report database corruption (due to the inconsistent cache), and if +** they upgrade to writers, they may inadvertently corrupt the database +** file. To avoid this hazard, the pager switches into the ERROR state +** instead of READER following such an error. +** +** Once it has entered the ERROR state, any attempt to use the pager +** to read or write data returns an error. Eventually, once all +** outstanding transactions have been abandoned, the pager is able to +** transition back to OPEN state, discarding the contents of the +** page-cache and any other in-memory state at the same time. Everything +** is reloaded from disk (and, if necessary, hot-journal rollback peformed) +** when a read-transaction is next opened on the pager (transitioning +** the pager into READER state). At that point the system has recovered +** from the error. +** +** Specifically, the pager jumps into the ERROR state if: +** +** 1. An error occurs while attempting a rollback. This happens in +** function sqlite3PagerRollback(). +** +** 2. An error occurs while attempting to finalize a journal file +** following a commit in function sqlite3PagerCommitPhaseTwo(). +** +** 3. An error occurs while attempting to write to the journal or +** database file in function pagerStress() in order to free up +** memory. +** +** In other cases, the error is returned to the b-tree layer. The b-tree +** layer then attempts a rollback operation. If the error condition +** persists, the pager enters the ERROR state via condition (1) above. +** +** Condition (3) is necessary because it can be triggered by a read-only +** statement executed within a transaction. In this case, if the error +** code were simply returned to the user, the b-tree layer would not +** automatically attempt a rollback, as it assumes that an error in a +** read-only statement cannot leave the pager in an internally inconsistent +** state. +** +** * The Pager.errCode variable is set to something other than SQLITE_OK. +** * There are one or more outstanding references to pages (after the +** last reference is dropped the pager should move back to OPEN state). +** * The pager is not an in-memory pager. +** +** +** Notes: +** +** * A pager is never in WRITER_DBMOD or WRITER_FINISHED state if the +** connection is open in WAL mode. A WAL connection is always in one +** of the first four states. +** +** * Normally, a connection open in exclusive mode is never in PAGER_OPEN +** state. There are two exceptions: immediately after exclusive-mode has +** been turned on (and before any read or write transactions are +** executed), and when the pager is leaving the "error state". +** +** * See also: assert_pager_state(). +*/ +#define PAGER_OPEN 0 +#define PAGER_READER 1 +#define PAGER_WRITER_LOCKED 2 +#define PAGER_WRITER_CACHEMOD 3 +#define PAGER_WRITER_DBMOD 4 +#define PAGER_WRITER_FINISHED 5 +#define PAGER_ERROR 6 + +/* +** The Pager.eLock variable is almost always set to one of the +** following locking-states, according to the lock currently held on +** the database file: NO_LOCK, SHARED_LOCK, RESERVED_LOCK or EXCLUSIVE_LOCK. +** This variable is kept up to date as locks are taken and released by +** the pagerLockDb() and pagerUnlockDb() wrappers. +** +** If the VFS xLock() or xUnlock() returns an error other than SQLITE_BUSY +** (i.e. one of the SQLITE_IOERR subtypes), it is not clear whether or not +** the operation was successful. In these circumstances pagerLockDb() and +** pagerUnlockDb() take a conservative approach - eLock is always updated +** when unlocking the file, and only updated when locking the file if the +** VFS call is successful. This way, the Pager.eLock variable may be set +** to a less exclusive (lower) value than the lock that is actually held +** at the system level, but it is never set to a more exclusive value. +** +** This is usually safe. If an xUnlock fails or appears to fail, there may +** be a few redundant xLock() calls or a lock may be held for longer than +** required, but nothing really goes wrong. +** +** The exception is when the database file is unlocked as the pager moves +** from ERROR to OPEN state. At this point there may be a hot-journal file +** in the file-system that needs to be rolled back (as part of an OPEN->SHARED +** transition, by the same pager or any other). If the call to xUnlock() +** fails at this point and the pager is left holding an EXCLUSIVE lock, this +** can confuse the call to xCheckReservedLock() call made later as part +** of hot-journal detection. +** +** xCheckReservedLock() is defined as returning true "if there is a RESERVED +** lock held by this process or any others". So xCheckReservedLock may +** return true because the caller itself is holding an EXCLUSIVE lock (but +** doesn't know it because of a previous error in xUnlock). If this happens +** a hot-journal may be mistaken for a journal being created by an active +** transaction in another process, causing SQLite to read from the database +** without rolling it back. +** +** To work around this, if a call to xUnlock() fails when unlocking the +** database in the ERROR state, Pager.eLock is set to UNKNOWN_LOCK. It +** is only changed back to a real locking state after a successful call +** to xLock(EXCLUSIVE). Also, the code to do the OPEN->SHARED state transition +** omits the check for a hot-journal if Pager.eLock is set to UNKNOWN_LOCK +** lock. Instead, it assumes a hot-journal exists and obtains an EXCLUSIVE +** lock on the database file before attempting to roll it back. See function +** PagerSharedLock() for more detail. +** +** Pager.eLock may only be set to UNKNOWN_LOCK when the pager is in +** PAGER_OPEN state. +*/ +#define UNKNOWN_LOCK (EXCLUSIVE_LOCK+1) + +/* +** A macro used for invoking the codec if there is one +*/ +#ifdef SQLITE_HAS_CODEC +# define CODEC1(P,D,N,X,E) \ + if( P->xCodec && P->xCodec(P->pCodec,D,N,X)==0 ){ E; } +# define CODEC2(P,D,N,X,E,O) \ + if( P->xCodec==0 ){ O=(char*)D; }else \ + if( (O=(char*)(P->xCodec(P->pCodec,D,N,X)))==0 ){ E; } +#else +# define CODEC1(P,D,N,X,E) /* NO-OP */ +# define CODEC2(P,D,N,X,E,O) O=(char*)D +#endif + +/* +** The maximum allowed sector size. 64KiB. If the xSectorsize() method +** returns a value larger than this, then MAX_SECTOR_SIZE is used instead. +** This could conceivably cause corruption following a power failure on +** such a system. This is currently an undocumented limit. +*/ +#define MAX_SECTOR_SIZE 0x10000 + + +/* +** An instance of the following structure is allocated for each active +** savepoint and statement transaction in the system. All such structures +** are stored in the Pager.aSavepoint[] array, which is allocated and +** resized using sqlite3Realloc(). +** +** When a savepoint is created, the PagerSavepoint.iHdrOffset field is +** set to 0. If a journal-header is written into the main journal while +** the savepoint is active, then iHdrOffset is set to the byte offset +** immediately following the last journal record written into the main +** journal before the journal-header. This is required during savepoint +** rollback (see pagerPlaybackSavepoint()). +*/ +typedef struct PagerSavepoint PagerSavepoint; +struct PagerSavepoint { + i64 iOffset; /* Starting offset in main journal */ + i64 iHdrOffset; /* See above */ + Bitvec *pInSavepoint; /* Set of pages in this savepoint */ + Pgno nOrig; /* Original number of pages in file */ + Pgno iSubRec; /* Index of first record in sub-journal */ +#ifndef SQLITE_OMIT_WAL + u32 aWalData[WAL_SAVEPOINT_NDATA]; /* WAL savepoint context */ +#endif +}; + +/* +** Bits of the Pager.doNotSpill flag. See further description below. +*/ +#define SPILLFLAG_OFF 0x01 /* Never spill cache. Set via pragma */ +#define SPILLFLAG_ROLLBACK 0x02 /* Current rolling back, so do not spill */ +#define SPILLFLAG_NOSYNC 0x04 /* Spill is ok, but do not sync */ + +/* +** An open page cache is an instance of struct Pager. A description of +** some of the more important member variables follows: +** +** eState +** +** The current 'state' of the pager object. See the comment and state +** diagram above for a description of the pager state. +** +** eLock +** +** For a real on-disk database, the current lock held on the database file - +** NO_LOCK, SHARED_LOCK, RESERVED_LOCK or EXCLUSIVE_LOCK. +** +** For a temporary or in-memory database (neither of which require any +** locks), this variable is always set to EXCLUSIVE_LOCK. Since such +** databases always have Pager.exclusiveMode==1, this tricks the pager +** logic into thinking that it already has all the locks it will ever +** need (and no reason to release them). +** +** In some (obscure) circumstances, this variable may also be set to +** UNKNOWN_LOCK. See the comment above the #define of UNKNOWN_LOCK for +** details. +** +** changeCountDone +** +** This boolean variable is used to make sure that the change-counter +** (the 4-byte header field at byte offset 24 of the database file) is +** not updated more often than necessary. +** +** It is set to true when the change-counter field is updated, which +** can only happen if an exclusive lock is held on the database file. +** It is cleared (set to false) whenever an exclusive lock is +** relinquished on the database file. Each time a transaction is committed, +** The changeCountDone flag is inspected. If it is true, the work of +** updating the change-counter is omitted for the current transaction. +** +** This mechanism means that when running in exclusive mode, a connection +** need only update the change-counter once, for the first transaction +** committed. +** +** setMaster +** +** When PagerCommitPhaseOne() is called to commit a transaction, it may +** (or may not) specify a master-journal name to be written into the +** journal file before it is synced to disk. +** +** Whether or not a journal file contains a master-journal pointer affects +** the way in which the journal file is finalized after the transaction is +** committed or rolled back when running in "journal_mode=PERSIST" mode. +** If a journal file does not contain a master-journal pointer, it is +** finalized by overwriting the first journal header with zeroes. If +** it does contain a master-journal pointer the journal file is finalized +** by truncating it to zero bytes, just as if the connection were +** running in "journal_mode=truncate" mode. +** +** Journal files that contain master journal pointers cannot be finalized +** simply by overwriting the first journal-header with zeroes, as the +** master journal pointer could interfere with hot-journal rollback of any +** subsequently interrupted transaction that reuses the journal file. +** +** The flag is cleared as soon as the journal file is finalized (either +** by PagerCommitPhaseTwo or PagerRollback). If an IO error prevents the +** journal file from being successfully finalized, the setMaster flag +** is cleared anyway (and the pager will move to ERROR state). +** +** doNotSpill +** +** This variables control the behavior of cache-spills (calls made by +** the pcache module to the pagerStress() routine to write cached data +** to the file-system in order to free up memory). +** +** When bits SPILLFLAG_OFF or SPILLFLAG_ROLLBACK of doNotSpill are set, +** writing to the database from pagerStress() is disabled altogether. +** The SPILLFLAG_ROLLBACK case is done in a very obscure case that +** comes up during savepoint rollback that requires the pcache module +** to allocate a new page to prevent the journal file from being written +** while it is being traversed by code in pager_playback(). The SPILLFLAG_OFF +** case is a user preference. +** +** If the SPILLFLAG_NOSYNC bit is set, writing to the database from +** pagerStress() is permitted, but syncing the journal file is not. +** This flag is set by sqlite3PagerWrite() when the file-system sector-size +** is larger than the database page-size in order to prevent a journal sync +** from happening in between the journalling of two pages on the same sector. +** +** subjInMemory +** +** This is a boolean variable. If true, then any required sub-journal +** is opened as an in-memory journal file. If false, then in-memory +** sub-journals are only used for in-memory pager files. +** +** This variable is updated by the upper layer each time a new +** write-transaction is opened. +** +** dbSize, dbOrigSize, dbFileSize +** +** Variable dbSize is set to the number of pages in the database file. +** It is valid in PAGER_READER and higher states (all states except for +** OPEN and ERROR). +** +** dbSize is set based on the size of the database file, which may be +** larger than the size of the database (the value stored at offset +** 28 of the database header by the btree). If the size of the file +** is not an integer multiple of the page-size, the value stored in +** dbSize is rounded down (i.e. a 5KB file with 2K page-size has dbSize==2). +** Except, any file that is greater than 0 bytes in size is considered +** to have at least one page. (i.e. a 1KB file with 2K page-size leads +** to dbSize==1). +** +** During a write-transaction, if pages with page-numbers greater than +** dbSize are modified in the cache, dbSize is updated accordingly. +** Similarly, if the database is truncated using PagerTruncateImage(), +** dbSize is updated. +** +** Variables dbOrigSize and dbFileSize are valid in states +** PAGER_WRITER_LOCKED and higher. dbOrigSize is a copy of the dbSize +** variable at the start of the transaction. It is used during rollback, +** and to determine whether or not pages need to be journalled before +** being modified. +** +** Throughout a write-transaction, dbFileSize contains the size of +** the file on disk in pages. It is set to a copy of dbSize when the +** write-transaction is first opened, and updated when VFS calls are made +** to write or truncate the database file on disk. +** +** The only reason the dbFileSize variable is required is to suppress +** unnecessary calls to xTruncate() after committing a transaction. If, +** when a transaction is committed, the dbFileSize variable indicates +** that the database file is larger than the database image (Pager.dbSize), +** pager_truncate() is called. The pager_truncate() call uses xFilesize() +** to measure the database file on disk, and then truncates it if required. +** dbFileSize is not used when rolling back a transaction. In this case +** pager_truncate() is called unconditionally (which means there may be +** a call to xFilesize() that is not strictly required). In either case, +** pager_truncate() may cause the file to become smaller or larger. +** +** dbHintSize +** +** The dbHintSize variable is used to limit the number of calls made to +** the VFS xFileControl(FCNTL_SIZE_HINT) method. +** +** dbHintSize is set to a copy of the dbSize variable when a +** write-transaction is opened (at the same time as dbFileSize and +** dbOrigSize). If the xFileControl(FCNTL_SIZE_HINT) method is called, +** dbHintSize is increased to the number of pages that correspond to the +** size-hint passed to the method call. See pager_write_pagelist() for +** details. +** +** errCode +** +** The Pager.errCode variable is only ever used in PAGER_ERROR state. It +** is set to zero in all other states. In PAGER_ERROR state, Pager.errCode +** is always set to SQLITE_FULL, SQLITE_IOERR or one of the SQLITE_IOERR_XXX +** sub-codes. +*/ +struct Pager { + sqlite3_vfs *pVfs; /* OS functions to use for IO */ + u8 exclusiveMode; /* Boolean. True if locking_mode==EXCLUSIVE */ + u8 journalMode; /* One of the PAGER_JOURNALMODE_* values */ + u8 useJournal; /* Use a rollback journal on this file */ + u8 noSync; /* Do not sync the journal if true */ + u8 fullSync; /* Do extra syncs of the journal for robustness */ + u8 extraSync; /* sync directory after journal delete */ + u8 ckptSyncFlags; /* SYNC_NORMAL or SYNC_FULL for checkpoint */ + u8 walSyncFlags; /* SYNC_NORMAL or SYNC_FULL for wal writes */ + u8 syncFlags; /* SYNC_NORMAL or SYNC_FULL otherwise */ + u8 tempFile; /* zFilename is a temporary or immutable file */ + u8 noLock; /* Do not lock (except in WAL mode) */ + u8 readOnly; /* True for a read-only database */ + u8 memDb; /* True to inhibit all file I/O */ + + /************************************************************************** + ** The following block contains those class members that change during + ** routine operation. Class members not in this block are either fixed + ** when the pager is first created or else only change when there is a + ** significant mode change (such as changing the page_size, locking_mode, + ** or the journal_mode). From another view, these class members describe + ** the "state" of the pager, while other class members describe the + ** "configuration" of the pager. + */ + u8 eState; /* Pager state (OPEN, READER, WRITER_LOCKED..) */ + u8 eLock; /* Current lock held on database file */ + u8 changeCountDone; /* Set after incrementing the change-counter */ + u8 setMaster; /* True if a m-j name has been written to jrnl */ + u8 doNotSpill; /* Do not spill the cache when non-zero */ + u8 subjInMemory; /* True to use in-memory sub-journals */ + u8 bUseFetch; /* True to use xFetch() */ + u8 hasHeldSharedLock; /* True if a shared lock has ever been held */ + Pgno dbSize; /* Number of pages in the database */ + Pgno dbOrigSize; /* dbSize before the current transaction */ + Pgno dbFileSize; /* Number of pages in the database file */ + Pgno dbHintSize; /* Value passed to FCNTL_SIZE_HINT call */ + int errCode; /* One of several kinds of errors */ + int nRec; /* Pages journalled since last j-header written */ + u32 cksumInit; /* Quasi-random value added to every checksum */ + u32 nSubRec; /* Number of records written to sub-journal */ + Bitvec *pInJournal; /* One bit for each page in the database file */ + sqlite3_file *fd; /* File descriptor for database */ + sqlite3_file *jfd; /* File descriptor for main journal */ + sqlite3_file *sjfd; /* File descriptor for sub-journal */ + i64 journalOff; /* Current write offset in the journal file */ + i64 journalHdr; /* Byte offset to previous journal header */ + sqlite3_backup *pBackup; /* Pointer to list of ongoing backup processes */ + PagerSavepoint *aSavepoint; /* Array of active savepoints */ + int nSavepoint; /* Number of elements in aSavepoint[] */ + u32 iDataVersion; /* Changes whenever database content changes */ + char dbFileVers[16]; /* Changes whenever database file changes */ + + int nMmapOut; /* Number of mmap pages currently outstanding */ + sqlite3_int64 szMmap; /* Desired maximum mmap size */ + PgHdr *pMmapFreelist; /* List of free mmap page headers (pDirty) */ + /* + ** End of the routinely-changing class members + ***************************************************************************/ + + u16 nExtra; /* Add this many bytes to each in-memory page */ + i16 nReserve; /* Number of unused bytes at end of each page */ + u32 vfsFlags; /* Flags for sqlite3_vfs.xOpen() */ + u32 sectorSize; /* Assumed sector size during rollback */ + int pageSize; /* Number of bytes in a page */ + Pgno mxPgno; /* Maximum allowed size of the database */ + i64 journalSizeLimit; /* Size limit for persistent journal files */ + char *zFilename; /* Name of the database file */ + char *zJournal; /* Name of the journal file */ + int (*xBusyHandler)(void*); /* Function to call when busy */ + void *pBusyHandlerArg; /* Context argument for xBusyHandler */ + int aStat[3]; /* Total cache hits, misses and writes */ +#ifdef SQLITE_TEST + int nRead; /* Database pages read */ +#endif + void (*xReiniter)(DbPage*); /* Call this routine when reloading pages */ +#ifdef SQLITE_HAS_CODEC + void *(*xCodec)(void*,void*,Pgno,int); /* Routine for en/decoding data */ + void (*xCodecSizeChng)(void*,int,int); /* Notify of page size changes */ + void (*xCodecFree)(void*); /* Destructor for the codec */ + void *pCodec; /* First argument to xCodec... methods */ +#endif + char *pTmpSpace; /* Pager.pageSize bytes of space for tmp use */ + PCache *pPCache; /* Pointer to page cache object */ +#ifndef SQLITE_OMIT_WAL + Wal *pWal; /* Write-ahead log used by "journal_mode=wal" */ + char *zWal; /* File name for write-ahead log */ +#endif +}; + +/* +** Indexes for use with Pager.aStat[]. The Pager.aStat[] array contains +** the values accessed by passing SQLITE_DBSTATUS_CACHE_HIT, CACHE_MISS +** or CACHE_WRITE to sqlite3_db_status(). +*/ +#define PAGER_STAT_HIT 0 +#define PAGER_STAT_MISS 1 +#define PAGER_STAT_WRITE 2 + +/* +** The following global variables hold counters used for +** testing purposes only. These variables do not exist in +** a non-testing build. These variables are not thread-safe. +*/ +#ifdef SQLITE_TEST +SQLITE_API int sqlite3_pager_readdb_count = 0; /* Number of full pages read from DB */ +SQLITE_API int sqlite3_pager_writedb_count = 0; /* Number of full pages written to DB */ +SQLITE_API int sqlite3_pager_writej_count = 0; /* Number of pages written to journal */ +# define PAGER_INCR(v) v++ +#else +# define PAGER_INCR(v) +#endif + + + +/* +** Journal files begin with the following magic string. The data +** was obtained from /dev/random. It is used only as a sanity check. +** +** Since version 2.8.0, the journal format contains additional sanity +** checking information. If the power fails while the journal is being +** written, semi-random garbage data might appear in the journal +** file after power is restored. If an attempt is then made +** to roll the journal back, the database could be corrupted. The additional +** sanity checking data is an attempt to discover the garbage in the +** journal and ignore it. +** +** The sanity checking information for the new journal format consists +** of a 32-bit checksum on each page of data. The checksum covers both +** the page number and the pPager->pageSize bytes of data for the page. +** This cksum is initialized to a 32-bit random value that appears in the +** journal file right after the header. The random initializer is important, +** because garbage data that appears at the end of a journal is likely +** data that was once in other files that have now been deleted. If the +** garbage data came from an obsolete journal file, the checksums might +** be correct. But by initializing the checksum to random value which +** is different for every journal, we minimize that risk. +*/ +static const unsigned char aJournalMagic[] = { + 0xd9, 0xd5, 0x05, 0xf9, 0x20, 0xa1, 0x63, 0xd7, +}; + +/* +** The size of the of each page record in the journal is given by +** the following macro. +*/ +#define JOURNAL_PG_SZ(pPager) ((pPager->pageSize) + 8) + +/* +** The journal header size for this pager. This is usually the same +** size as a single disk sector. See also setSectorSize(). +*/ +#define JOURNAL_HDR_SZ(pPager) (pPager->sectorSize) + +/* +** The macro MEMDB is true if we are dealing with an in-memory database. +** We do this as a macro so that if the SQLITE_OMIT_MEMORYDB macro is set, +** the value of MEMDB will be a constant and the compiler will optimize +** out code that would never execute. +*/ +#ifdef SQLITE_OMIT_MEMORYDB +# define MEMDB 0 +#else +# define MEMDB pPager->memDb +#endif + +/* +** The macro USEFETCH is true if we are allowed to use the xFetch and xUnfetch +** interfaces to access the database using memory-mapped I/O. +*/ +#if SQLITE_MAX_MMAP_SIZE>0 +# define USEFETCH(x) ((x)->bUseFetch) +#else +# define USEFETCH(x) 0 +#endif + +/* +** The maximum legal page number is (2^31 - 1). +*/ +#define PAGER_MAX_PGNO 2147483647 + +/* +** The argument to this macro is a file descriptor (type sqlite3_file*). +** Return 0 if it is not open, or non-zero (but not 1) if it is. +** +** This is so that expressions can be written as: +** +** if( isOpen(pPager->jfd) ){ ... +** +** instead of +** +** if( pPager->jfd->pMethods ){ ... +*/ +#define isOpen(pFd) ((pFd)->pMethods!=0) + +/* +** Return true if this pager uses a write-ahead log instead of the usual +** rollback journal. Otherwise false. +*/ +#ifndef SQLITE_OMIT_WAL +SQLITE_PRIVATE int sqlite3PagerUseWal(Pager *pPager){ + return (pPager->pWal!=0); +} +# define pagerUseWal(x) sqlite3PagerUseWal(x) +#else +# define pagerUseWal(x) 0 +# define pagerRollbackWal(x) 0 +# define pagerWalFrames(v,w,x,y) 0 +# define pagerOpenWalIfPresent(z) SQLITE_OK +# define pagerBeginReadTransaction(z) SQLITE_OK +#endif + +#ifndef NDEBUG +/* +** Usage: +** +** assert( assert_pager_state(pPager) ); +** +** This function runs many asserts to try to find inconsistencies in +** the internal state of the Pager object. +*/ +static int assert_pager_state(Pager *p){ + Pager *pPager = p; + + /* State must be valid. */ + assert( p->eState==PAGER_OPEN + || p->eState==PAGER_READER + || p->eState==PAGER_WRITER_LOCKED + || p->eState==PAGER_WRITER_CACHEMOD + || p->eState==PAGER_WRITER_DBMOD + || p->eState==PAGER_WRITER_FINISHED + || p->eState==PAGER_ERROR + ); + + /* Regardless of the current state, a temp-file connection always behaves + ** as if it has an exclusive lock on the database file. It never updates + ** the change-counter field, so the changeCountDone flag is always set. + */ + assert( p->tempFile==0 || p->eLock==EXCLUSIVE_LOCK ); + assert( p->tempFile==0 || pPager->changeCountDone ); + + /* If the useJournal flag is clear, the journal-mode must be "OFF". + ** And if the journal-mode is "OFF", the journal file must not be open. + */ + assert( p->journalMode==PAGER_JOURNALMODE_OFF || p->useJournal ); + assert( p->journalMode!=PAGER_JOURNALMODE_OFF || !isOpen(p->jfd) ); + + /* Check that MEMDB implies noSync. And an in-memory journal. Since + ** this means an in-memory pager performs no IO at all, it cannot encounter + ** either SQLITE_IOERR or SQLITE_FULL during rollback or while finalizing + ** a journal file. (although the in-memory journal implementation may + ** return SQLITE_IOERR_NOMEM while the journal file is being written). It + ** is therefore not possible for an in-memory pager to enter the ERROR + ** state. + */ + if( MEMDB ){ + assert( !isOpen(p->fd) ); + assert( p->noSync ); + assert( p->journalMode==PAGER_JOURNALMODE_OFF + || p->journalMode==PAGER_JOURNALMODE_MEMORY + ); + assert( p->eState!=PAGER_ERROR && p->eState!=PAGER_OPEN ); + assert( pagerUseWal(p)==0 ); + } + + /* If changeCountDone is set, a RESERVED lock or greater must be held + ** on the file. + */ + assert( pPager->changeCountDone==0 || pPager->eLock>=RESERVED_LOCK ); + assert( p->eLock!=PENDING_LOCK ); + + switch( p->eState ){ + case PAGER_OPEN: + assert( !MEMDB ); + assert( pPager->errCode==SQLITE_OK ); + assert( sqlite3PcacheRefCount(pPager->pPCache)==0 || pPager->tempFile ); + break; + + case PAGER_READER: + assert( pPager->errCode==SQLITE_OK ); + assert( p->eLock!=UNKNOWN_LOCK ); + assert( p->eLock>=SHARED_LOCK ); + break; + + case PAGER_WRITER_LOCKED: + assert( p->eLock!=UNKNOWN_LOCK ); + assert( pPager->errCode==SQLITE_OK ); + if( !pagerUseWal(pPager) ){ + assert( p->eLock>=RESERVED_LOCK ); + } + assert( pPager->dbSize==pPager->dbOrigSize ); + assert( pPager->dbOrigSize==pPager->dbFileSize ); + assert( pPager->dbOrigSize==pPager->dbHintSize ); + assert( pPager->setMaster==0 ); + break; + + case PAGER_WRITER_CACHEMOD: + assert( p->eLock!=UNKNOWN_LOCK ); + assert( pPager->errCode==SQLITE_OK ); + if( !pagerUseWal(pPager) ){ + /* It is possible that if journal_mode=wal here that neither the + ** journal file nor the WAL file are open. This happens during + ** a rollback transaction that switches from journal_mode=off + ** to journal_mode=wal. + */ + assert( p->eLock>=RESERVED_LOCK ); + assert( isOpen(p->jfd) + || p->journalMode==PAGER_JOURNALMODE_OFF + || p->journalMode==PAGER_JOURNALMODE_WAL + ); + } + assert( pPager->dbOrigSize==pPager->dbFileSize ); + assert( pPager->dbOrigSize==pPager->dbHintSize ); + break; + + case PAGER_WRITER_DBMOD: + assert( p->eLock==EXCLUSIVE_LOCK ); + assert( pPager->errCode==SQLITE_OK ); + assert( !pagerUseWal(pPager) ); + assert( p->eLock>=EXCLUSIVE_LOCK ); + assert( isOpen(p->jfd) + || p->journalMode==PAGER_JOURNALMODE_OFF + || p->journalMode==PAGER_JOURNALMODE_WAL + ); + assert( pPager->dbOrigSize<=pPager->dbHintSize ); + break; + + case PAGER_WRITER_FINISHED: + assert( p->eLock==EXCLUSIVE_LOCK ); + assert( pPager->errCode==SQLITE_OK ); + assert( !pagerUseWal(pPager) ); + assert( isOpen(p->jfd) + || p->journalMode==PAGER_JOURNALMODE_OFF + || p->journalMode==PAGER_JOURNALMODE_WAL + ); + break; + + case PAGER_ERROR: + /* There must be at least one outstanding reference to the pager if + ** in ERROR state. Otherwise the pager should have already dropped + ** back to OPEN state. + */ + assert( pPager->errCode!=SQLITE_OK ); + assert( sqlite3PcacheRefCount(pPager->pPCache)>0 || pPager->tempFile ); + break; + } + + return 1; +} +#endif /* ifndef NDEBUG */ + +#ifdef SQLITE_DEBUG +/* +** Return a pointer to a human readable string in a static buffer +** containing the state of the Pager object passed as an argument. This +** is intended to be used within debuggers. For example, as an alternative +** to "print *pPager" in gdb: +** +** (gdb) printf "%s", print_pager_state(pPager) +*/ +static char *print_pager_state(Pager *p){ + static char zRet[1024]; + + sqlite3_snprintf(1024, zRet, + "Filename: %s\n" + "State: %s errCode=%d\n" + "Lock: %s\n" + "Locking mode: locking_mode=%s\n" + "Journal mode: journal_mode=%s\n" + "Backing store: tempFile=%d memDb=%d useJournal=%d\n" + "Journal: journalOff=%lld journalHdr=%lld\n" + "Size: dbsize=%d dbOrigSize=%d dbFileSize=%d\n" + , p->zFilename + , p->eState==PAGER_OPEN ? "OPEN" : + p->eState==PAGER_READER ? "READER" : + p->eState==PAGER_WRITER_LOCKED ? "WRITER_LOCKED" : + p->eState==PAGER_WRITER_CACHEMOD ? "WRITER_CACHEMOD" : + p->eState==PAGER_WRITER_DBMOD ? "WRITER_DBMOD" : + p->eState==PAGER_WRITER_FINISHED ? "WRITER_FINISHED" : + p->eState==PAGER_ERROR ? "ERROR" : "?error?" + , (int)p->errCode + , p->eLock==NO_LOCK ? "NO_LOCK" : + p->eLock==RESERVED_LOCK ? "RESERVED" : + p->eLock==EXCLUSIVE_LOCK ? "EXCLUSIVE" : + p->eLock==SHARED_LOCK ? "SHARED" : + p->eLock==UNKNOWN_LOCK ? "UNKNOWN" : "?error?" + , p->exclusiveMode ? "exclusive" : "normal" + , p->journalMode==PAGER_JOURNALMODE_MEMORY ? "memory" : + p->journalMode==PAGER_JOURNALMODE_OFF ? "off" : + p->journalMode==PAGER_JOURNALMODE_DELETE ? "delete" : + p->journalMode==PAGER_JOURNALMODE_PERSIST ? "persist" : + p->journalMode==PAGER_JOURNALMODE_TRUNCATE ? "truncate" : + p->journalMode==PAGER_JOURNALMODE_WAL ? "wal" : "?error?" + , (int)p->tempFile, (int)p->memDb, (int)p->useJournal + , p->journalOff, p->journalHdr + , (int)p->dbSize, (int)p->dbOrigSize, (int)p->dbFileSize + ); + + return zRet; +} +#endif + +/* +** Return true if it is necessary to write page *pPg into the sub-journal. +** A page needs to be written into the sub-journal if there exists one +** or more open savepoints for which: +** +** * The page-number is less than or equal to PagerSavepoint.nOrig, and +** * The bit corresponding to the page-number is not set in +** PagerSavepoint.pInSavepoint. +*/ +static int subjRequiresPage(PgHdr *pPg){ + Pager *pPager = pPg->pPager; + PagerSavepoint *p; + Pgno pgno = pPg->pgno; + int i; + for(i=0; inSavepoint; i++){ + p = &pPager->aSavepoint[i]; + if( p->nOrig>=pgno && 0==sqlite3BitvecTestNotNull(p->pInSavepoint, pgno) ){ + return 1; + } + } + return 0; +} + +#ifdef SQLITE_DEBUG +/* +** Return true if the page is already in the journal file. +*/ +static int pageInJournal(Pager *pPager, PgHdr *pPg){ + return sqlite3BitvecTest(pPager->pInJournal, pPg->pgno); +} +#endif + +/* +** Read a 32-bit integer from the given file descriptor. Store the integer +** that is read in *pRes. Return SQLITE_OK if everything worked, or an +** error code is something goes wrong. +** +** All values are stored on disk as big-endian. +*/ +static int read32bits(sqlite3_file *fd, i64 offset, u32 *pRes){ + unsigned char ac[4]; + int rc = sqlite3OsRead(fd, ac, sizeof(ac), offset); + if( rc==SQLITE_OK ){ + *pRes = sqlite3Get4byte(ac); + } + return rc; +} + +/* +** Write a 32-bit integer into a string buffer in big-endian byte order. +*/ +#define put32bits(A,B) sqlite3Put4byte((u8*)A,B) + + +/* +** Write a 32-bit integer into the given file descriptor. Return SQLITE_OK +** on success or an error code is something goes wrong. +*/ +static int write32bits(sqlite3_file *fd, i64 offset, u32 val){ + char ac[4]; + put32bits(ac, val); + return sqlite3OsWrite(fd, ac, 4, offset); +} + +/* +** Unlock the database file to level eLock, which must be either NO_LOCK +** or SHARED_LOCK. Regardless of whether or not the call to xUnlock() +** succeeds, set the Pager.eLock variable to match the (attempted) new lock. +** +** Except, if Pager.eLock is set to UNKNOWN_LOCK when this function is +** called, do not modify it. See the comment above the #define of +** UNKNOWN_LOCK for an explanation of this. +*/ +static int pagerUnlockDb(Pager *pPager, int eLock){ + int rc = SQLITE_OK; + + assert( !pPager->exclusiveMode || pPager->eLock==eLock ); + assert( eLock==NO_LOCK || eLock==SHARED_LOCK ); + assert( eLock!=NO_LOCK || pagerUseWal(pPager)==0 ); + if( isOpen(pPager->fd) ){ + assert( pPager->eLock>=eLock ); + rc = pPager->noLock ? SQLITE_OK : sqlite3OsUnlock(pPager->fd, eLock); + if( pPager->eLock!=UNKNOWN_LOCK ){ + pPager->eLock = (u8)eLock; + } + IOTRACE(("UNLOCK %p %d\n", pPager, eLock)) + } + return rc; +} + +/* +** Lock the database file to level eLock, which must be either SHARED_LOCK, +** RESERVED_LOCK or EXCLUSIVE_LOCK. If the caller is successful, set the +** Pager.eLock variable to the new locking state. +** +** Except, if Pager.eLock is set to UNKNOWN_LOCK when this function is +** called, do not modify it unless the new locking state is EXCLUSIVE_LOCK. +** See the comment above the #define of UNKNOWN_LOCK for an explanation +** of this. +*/ +static int pagerLockDb(Pager *pPager, int eLock){ + int rc = SQLITE_OK; + + assert( eLock==SHARED_LOCK || eLock==RESERVED_LOCK || eLock==EXCLUSIVE_LOCK ); + if( pPager->eLockeLock==UNKNOWN_LOCK ){ + rc = pPager->noLock ? SQLITE_OK : sqlite3OsLock(pPager->fd, eLock); + if( rc==SQLITE_OK && (pPager->eLock!=UNKNOWN_LOCK||eLock==EXCLUSIVE_LOCK) ){ + pPager->eLock = (u8)eLock; + IOTRACE(("LOCK %p %d\n", pPager, eLock)) + } + } + return rc; +} + +/* +** This function determines whether or not the atomic-write optimization +** can be used with this pager. The optimization can be used if: +** +** (a) the value returned by OsDeviceCharacteristics() indicates that +** a database page may be written atomically, and +** (b) the value returned by OsSectorSize() is less than or equal +** to the page size. +** +** The optimization is also always enabled for temporary files. It is +** an error to call this function if pPager is opened on an in-memory +** database. +** +** If the optimization cannot be used, 0 is returned. If it can be used, +** then the value returned is the size of the journal file when it +** contains rollback data for exactly one page. +*/ +#ifdef SQLITE_ENABLE_ATOMIC_WRITE +static int jrnlBufferSize(Pager *pPager){ + assert( !MEMDB ); + if( !pPager->tempFile ){ + int dc; /* Device characteristics */ + int nSector; /* Sector size */ + int szPage; /* Page size */ + + assert( isOpen(pPager->fd) ); + dc = sqlite3OsDeviceCharacteristics(pPager->fd); + nSector = pPager->sectorSize; + szPage = pPager->pageSize; + + assert(SQLITE_IOCAP_ATOMIC512==(512>>8)); + assert(SQLITE_IOCAP_ATOMIC64K==(65536>>8)); + if( 0==(dc&(SQLITE_IOCAP_ATOMIC|(szPage>>8)) || nSector>szPage) ){ + return 0; + } + } + + return JOURNAL_HDR_SZ(pPager) + JOURNAL_PG_SZ(pPager); +} +#else +# define jrnlBufferSize(x) 0 +#endif + +/* +** If SQLITE_CHECK_PAGES is defined then we do some sanity checking +** on the cache using a hash function. This is used for testing +** and debugging only. +*/ +#ifdef SQLITE_CHECK_PAGES +/* +** Return a 32-bit hash of the page data for pPage. +*/ +static u32 pager_datahash(int nByte, unsigned char *pData){ + u32 hash = 0; + int i; + for(i=0; ipPager->pageSize, (unsigned char *)pPage->pData); +} +static void pager_set_pagehash(PgHdr *pPage){ + pPage->pageHash = pager_pagehash(pPage); +} + +/* +** The CHECK_PAGE macro takes a PgHdr* as an argument. If SQLITE_CHECK_PAGES +** is defined, and NDEBUG is not defined, an assert() statement checks +** that the page is either dirty or still matches the calculated page-hash. +*/ +#define CHECK_PAGE(x) checkPage(x) +static void checkPage(PgHdr *pPg){ + Pager *pPager = pPg->pPager; + assert( pPager->eState!=PAGER_ERROR ); + assert( (pPg->flags&PGHDR_DIRTY) || pPg->pageHash==pager_pagehash(pPg) ); +} + +#else +#define pager_datahash(X,Y) 0 +#define pager_pagehash(X) 0 +#define pager_set_pagehash(X) +#define CHECK_PAGE(x) +#endif /* SQLITE_CHECK_PAGES */ + +/* +** When this is called the journal file for pager pPager must be open. +** This function attempts to read a master journal file name from the +** end of the file and, if successful, copies it into memory supplied +** by the caller. See comments above writeMasterJournal() for the format +** used to store a master journal file name at the end of a journal file. +** +** zMaster must point to a buffer of at least nMaster bytes allocated by +** the caller. This should be sqlite3_vfs.mxPathname+1 (to ensure there is +** enough space to write the master journal name). If the master journal +** name in the journal is longer than nMaster bytes (including a +** nul-terminator), then this is handled as if no master journal name +** were present in the journal. +** +** If a master journal file name is present at the end of the journal +** file, then it is copied into the buffer pointed to by zMaster. A +** nul-terminator byte is appended to the buffer following the master +** journal file name. +** +** If it is determined that no master journal file name is present +** zMaster[0] is set to 0 and SQLITE_OK returned. +** +** If an error occurs while reading from the journal file, an SQLite +** error code is returned. +*/ +static int readMasterJournal(sqlite3_file *pJrnl, char *zMaster, u32 nMaster){ + int rc; /* Return code */ + u32 len; /* Length in bytes of master journal name */ + i64 szJ; /* Total size in bytes of journal file pJrnl */ + u32 cksum; /* MJ checksum value read from journal */ + u32 u; /* Unsigned loop counter */ + unsigned char aMagic[8]; /* A buffer to hold the magic header */ + zMaster[0] = '\0'; + + if( SQLITE_OK!=(rc = sqlite3OsFileSize(pJrnl, &szJ)) + || szJ<16 + || SQLITE_OK!=(rc = read32bits(pJrnl, szJ-16, &len)) + || len>=nMaster + || len==0 + || SQLITE_OK!=(rc = read32bits(pJrnl, szJ-12, &cksum)) + || SQLITE_OK!=(rc = sqlite3OsRead(pJrnl, aMagic, 8, szJ-8)) + || memcmp(aMagic, aJournalMagic, 8) + || SQLITE_OK!=(rc = sqlite3OsRead(pJrnl, zMaster, len, szJ-16-len)) + ){ + return rc; + } + + /* See if the checksum matches the master journal name */ + for(u=0; ujournalOff, assuming a sector +** size of pPager->sectorSize bytes. +** +** i.e for a sector size of 512: +** +** Pager.journalOff Return value +** --------------------------------------- +** 0 0 +** 512 512 +** 100 512 +** 2000 2048 +** +*/ +static i64 journalHdrOffset(Pager *pPager){ + i64 offset = 0; + i64 c = pPager->journalOff; + if( c ){ + offset = ((c-1)/JOURNAL_HDR_SZ(pPager) + 1) * JOURNAL_HDR_SZ(pPager); + } + assert( offset%JOURNAL_HDR_SZ(pPager)==0 ); + assert( offset>=c ); + assert( (offset-c)jfd) ); + assert( !sqlite3JournalIsInMemory(pPager->jfd) ); + if( pPager->journalOff ){ + const i64 iLimit = pPager->journalSizeLimit; /* Local cache of jsl */ + + IOTRACE(("JZEROHDR %p\n", pPager)) + if( doTruncate || iLimit==0 ){ + rc = sqlite3OsTruncate(pPager->jfd, 0); + }else{ + static const char zeroHdr[28] = {0}; + rc = sqlite3OsWrite(pPager->jfd, zeroHdr, sizeof(zeroHdr), 0); + } + if( rc==SQLITE_OK && !pPager->noSync ){ + rc = sqlite3OsSync(pPager->jfd, SQLITE_SYNC_DATAONLY|pPager->syncFlags); + } + + /* At this point the transaction is committed but the write lock + ** is still held on the file. If there is a size limit configured for + ** the persistent journal and the journal file currently consumes more + ** space than that limit allows for, truncate it now. There is no need + ** to sync the file following this operation. + */ + if( rc==SQLITE_OK && iLimit>0 ){ + i64 sz; + rc = sqlite3OsFileSize(pPager->jfd, &sz); + if( rc==SQLITE_OK && sz>iLimit ){ + rc = sqlite3OsTruncate(pPager->jfd, iLimit); + } + } + } + return rc; +} + +/* +** The journal file must be open when this routine is called. A journal +** header (JOURNAL_HDR_SZ bytes) is written into the journal file at the +** current location. +** +** The format for the journal header is as follows: +** - 8 bytes: Magic identifying journal format. +** - 4 bytes: Number of records in journal, or -1 no-sync mode is on. +** - 4 bytes: Random number used for page hash. +** - 4 bytes: Initial database page count. +** - 4 bytes: Sector size used by the process that wrote this journal. +** - 4 bytes: Database page size. +** +** Followed by (JOURNAL_HDR_SZ - 28) bytes of unused space. +*/ +static int writeJournalHdr(Pager *pPager){ + int rc = SQLITE_OK; /* Return code */ + char *zHeader = pPager->pTmpSpace; /* Temporary space used to build header */ + u32 nHeader = (u32)pPager->pageSize;/* Size of buffer pointed to by zHeader */ + u32 nWrite; /* Bytes of header sector written */ + int ii; /* Loop counter */ + + assert( isOpen(pPager->jfd) ); /* Journal file must be open. */ + + if( nHeader>JOURNAL_HDR_SZ(pPager) ){ + nHeader = JOURNAL_HDR_SZ(pPager); + } + + /* If there are active savepoints and any of them were created + ** since the most recent journal header was written, update the + ** PagerSavepoint.iHdrOffset fields now. + */ + for(ii=0; iinSavepoint; ii++){ + if( pPager->aSavepoint[ii].iHdrOffset==0 ){ + pPager->aSavepoint[ii].iHdrOffset = pPager->journalOff; + } + } + + pPager->journalHdr = pPager->journalOff = journalHdrOffset(pPager); + + /* + ** Write the nRec Field - the number of page records that follow this + ** journal header. Normally, zero is written to this value at this time. + ** After the records are added to the journal (and the journal synced, + ** if in full-sync mode), the zero is overwritten with the true number + ** of records (see syncJournal()). + ** + ** A faster alternative is to write 0xFFFFFFFF to the nRec field. When + ** reading the journal this value tells SQLite to assume that the + ** rest of the journal file contains valid page records. This assumption + ** is dangerous, as if a failure occurred whilst writing to the journal + ** file it may contain some garbage data. There are two scenarios + ** where this risk can be ignored: + ** + ** * When the pager is in no-sync mode. Corruption can follow a + ** power failure in this case anyway. + ** + ** * When the SQLITE_IOCAP_SAFE_APPEND flag is set. This guarantees + ** that garbage data is never appended to the journal file. + */ + assert( isOpen(pPager->fd) || pPager->noSync ); + if( pPager->noSync || (pPager->journalMode==PAGER_JOURNALMODE_MEMORY) + || (sqlite3OsDeviceCharacteristics(pPager->fd)&SQLITE_IOCAP_SAFE_APPEND) + ){ + memcpy(zHeader, aJournalMagic, sizeof(aJournalMagic)); + put32bits(&zHeader[sizeof(aJournalMagic)], 0xffffffff); + }else{ + memset(zHeader, 0, sizeof(aJournalMagic)+4); + } + + /* The random check-hash initializer */ + sqlite3_randomness(sizeof(pPager->cksumInit), &pPager->cksumInit); + put32bits(&zHeader[sizeof(aJournalMagic)+4], pPager->cksumInit); + /* The initial database size */ + put32bits(&zHeader[sizeof(aJournalMagic)+8], pPager->dbOrigSize); + /* The assumed sector size for this process */ + put32bits(&zHeader[sizeof(aJournalMagic)+12], pPager->sectorSize); + + /* The page size */ + put32bits(&zHeader[sizeof(aJournalMagic)+16], pPager->pageSize); + + /* Initializing the tail of the buffer is not necessary. Everything + ** works find if the following memset() is omitted. But initializing + ** the memory prevents valgrind from complaining, so we are willing to + ** take the performance hit. + */ + memset(&zHeader[sizeof(aJournalMagic)+20], 0, + nHeader-(sizeof(aJournalMagic)+20)); + + /* In theory, it is only necessary to write the 28 bytes that the + ** journal header consumes to the journal file here. Then increment the + ** Pager.journalOff variable by JOURNAL_HDR_SZ so that the next + ** record is written to the following sector (leaving a gap in the file + ** that will be implicitly filled in by the OS). + ** + ** However it has been discovered that on some systems this pattern can + ** be significantly slower than contiguously writing data to the file, + ** even if that means explicitly writing data to the block of + ** (JOURNAL_HDR_SZ - 28) bytes that will not be used. So that is what + ** is done. + ** + ** The loop is required here in case the sector-size is larger than the + ** database page size. Since the zHeader buffer is only Pager.pageSize + ** bytes in size, more than one call to sqlite3OsWrite() may be required + ** to populate the entire journal header sector. + */ + for(nWrite=0; rc==SQLITE_OK&&nWritejournalHdr, nHeader)) + rc = sqlite3OsWrite(pPager->jfd, zHeader, nHeader, pPager->journalOff); + assert( pPager->journalHdr <= pPager->journalOff ); + pPager->journalOff += nHeader; + } + + return rc; +} + +/* +** The journal file must be open when this is called. A journal header file +** (JOURNAL_HDR_SZ bytes) is read from the current location in the journal +** file. The current location in the journal file is given by +** pPager->journalOff. See comments above function writeJournalHdr() for +** a description of the journal header format. +** +** If the header is read successfully, *pNRec is set to the number of +** page records following this header and *pDbSize is set to the size of the +** database before the transaction began, in pages. Also, pPager->cksumInit +** is set to the value read from the journal header. SQLITE_OK is returned +** in this case. +** +** If the journal header file appears to be corrupted, SQLITE_DONE is +** returned and *pNRec and *PDbSize are undefined. If JOURNAL_HDR_SZ bytes +** cannot be read from the journal file an error code is returned. +*/ +static int readJournalHdr( + Pager *pPager, /* Pager object */ + int isHot, + i64 journalSize, /* Size of the open journal file in bytes */ + u32 *pNRec, /* OUT: Value read from the nRec field */ + u32 *pDbSize /* OUT: Value of original database size field */ +){ + int rc; /* Return code */ + unsigned char aMagic[8]; /* A buffer to hold the magic header */ + i64 iHdrOff; /* Offset of journal header being read */ + + assert( isOpen(pPager->jfd) ); /* Journal file must be open. */ + + /* Advance Pager.journalOff to the start of the next sector. If the + ** journal file is too small for there to be a header stored at this + ** point, return SQLITE_DONE. + */ + pPager->journalOff = journalHdrOffset(pPager); + if( pPager->journalOff+JOURNAL_HDR_SZ(pPager) > journalSize ){ + return SQLITE_DONE; + } + iHdrOff = pPager->journalOff; + + /* Read in the first 8 bytes of the journal header. If they do not match + ** the magic string found at the start of each journal header, return + ** SQLITE_DONE. If an IO error occurs, return an error code. Otherwise, + ** proceed. + */ + if( isHot || iHdrOff!=pPager->journalHdr ){ + rc = sqlite3OsRead(pPager->jfd, aMagic, sizeof(aMagic), iHdrOff); + if( rc ){ + return rc; + } + if( memcmp(aMagic, aJournalMagic, sizeof(aMagic))!=0 ){ + return SQLITE_DONE; + } + } + + /* Read the first three 32-bit fields of the journal header: The nRec + ** field, the checksum-initializer and the database size at the start + ** of the transaction. Return an error code if anything goes wrong. + */ + if( SQLITE_OK!=(rc = read32bits(pPager->jfd, iHdrOff+8, pNRec)) + || SQLITE_OK!=(rc = read32bits(pPager->jfd, iHdrOff+12, &pPager->cksumInit)) + || SQLITE_OK!=(rc = read32bits(pPager->jfd, iHdrOff+16, pDbSize)) + ){ + return rc; + } + + if( pPager->journalOff==0 ){ + u32 iPageSize; /* Page-size field of journal header */ + u32 iSectorSize; /* Sector-size field of journal header */ + + /* Read the page-size and sector-size journal header fields. */ + if( SQLITE_OK!=(rc = read32bits(pPager->jfd, iHdrOff+20, &iSectorSize)) + || SQLITE_OK!=(rc = read32bits(pPager->jfd, iHdrOff+24, &iPageSize)) + ){ + return rc; + } + + /* Versions of SQLite prior to 3.5.8 set the page-size field of the + ** journal header to zero. In this case, assume that the Pager.pageSize + ** variable is already set to the correct page size. + */ + if( iPageSize==0 ){ + iPageSize = pPager->pageSize; + } + + /* 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 or 32, and not greater than their + ** respective compile time maximum limits. + */ + if( iPageSize<512 || iSectorSize<32 + || iPageSize>SQLITE_MAX_PAGE_SIZE || iSectorSize>MAX_SECTOR_SIZE + || ((iPageSize-1)&iPageSize)!=0 || ((iSectorSize-1)&iSectorSize)!=0 + ){ + /* If the either the page-size or sector-size in the journal-header is + ** invalid, then the process that wrote the journal-header must have + ** crashed before the header was synced. In this case stop reading + ** the journal file here. + */ + return SQLITE_DONE; + } + + /* Update the page-size to match the value read from the journal. + ** Use a testcase() macro to make sure that malloc failure within + ** PagerSetPagesize() is tested. + */ + rc = sqlite3PagerSetPagesize(pPager, &iPageSize, -1); + testcase( rc!=SQLITE_OK ); + + /* Update the assumed sector-size to match the value used by + ** the process that created this journal. If this journal was + ** created by a process other than this one, then this routine + ** is being called from within pager_playback(). The local value + ** of Pager.sectorSize is restored at the end of that routine. + */ + pPager->sectorSize = iSectorSize; + } + + pPager->journalOff += JOURNAL_HDR_SZ(pPager); + return rc; +} + + +/* +** Write the supplied master journal name into the journal file for pager +** pPager at the current location. The master journal name must be the last +** thing written to a journal file. If the pager is in full-sync mode, the +** journal file descriptor is advanced to the next sector boundary before +** anything is written. The format is: +** +** + 4 bytes: PAGER_MJ_PGNO. +** + N bytes: Master journal filename in utf-8. +** + 4 bytes: N (length of master journal name in bytes, no nul-terminator). +** + 4 bytes: Master journal name checksum. +** + 8 bytes: aJournalMagic[]. +** +** The master journal page checksum is the sum of the bytes in the master +** journal name, where each byte is interpreted as a signed 8-bit integer. +** +** If zMaster is a NULL pointer (occurs for a single database transaction), +** this call is a no-op. +*/ +static int writeMasterJournal(Pager *pPager, const char *zMaster){ + int rc; /* Return code */ + int nMaster; /* Length of string zMaster */ + i64 iHdrOff; /* Offset of header in journal file */ + i64 jrnlSize; /* Size of journal file on disk */ + u32 cksum = 0; /* Checksum of string zMaster */ + + assert( pPager->setMaster==0 ); + assert( !pagerUseWal(pPager) ); + + if( !zMaster + || pPager->journalMode==PAGER_JOURNALMODE_MEMORY + || !isOpen(pPager->jfd) + ){ + return SQLITE_OK; + } + pPager->setMaster = 1; + assert( pPager->journalHdr <= pPager->journalOff ); + + /* Calculate the length in bytes and the checksum of zMaster */ + for(nMaster=0; zMaster[nMaster]; nMaster++){ + cksum += zMaster[nMaster]; + } + + /* If in full-sync mode, advance to the next disk sector before writing + ** the master journal name. This is in case the previous page written to + ** the journal has already been synced. + */ + if( pPager->fullSync ){ + pPager->journalOff = journalHdrOffset(pPager); + } + iHdrOff = pPager->journalOff; + + /* Write the master journal data to the end of the journal file. If + ** an error occurs, return the error code to the caller. + */ + if( (0 != (rc = write32bits(pPager->jfd, iHdrOff, PAGER_MJ_PGNO(pPager)))) + || (0 != (rc = sqlite3OsWrite(pPager->jfd, zMaster, nMaster, iHdrOff+4))) + || (0 != (rc = write32bits(pPager->jfd, iHdrOff+4+nMaster, nMaster))) + || (0 != (rc = write32bits(pPager->jfd, iHdrOff+4+nMaster+4, cksum))) + || (0 != (rc = sqlite3OsWrite(pPager->jfd, aJournalMagic, 8, + iHdrOff+4+nMaster+8))) + ){ + return rc; + } + pPager->journalOff += (nMaster+20); + + /* If the pager is in peristent-journal mode, then the physical + ** journal-file may extend past the end of the master-journal name + ** and 8 bytes of magic data just written to the file. This is + ** dangerous because the code to rollback a hot-journal file + ** will not be able to find the master-journal name to determine + ** whether or not the journal is hot. + ** + ** Easiest thing to do in this scenario is to truncate the journal + ** file to the required size. + */ + if( SQLITE_OK==(rc = sqlite3OsFileSize(pPager->jfd, &jrnlSize)) + && jrnlSize>pPager->journalOff + ){ + rc = sqlite3OsTruncate(pPager->jfd, pPager->journalOff); + } + return rc; +} + +/* +** Discard the entire contents of the in-memory page-cache. +*/ +static void pager_reset(Pager *pPager){ + pPager->iDataVersion++; + sqlite3BackupRestart(pPager->pBackup); + sqlite3PcacheClear(pPager->pPCache); +} + +/* +** Return the pPager->iDataVersion value +*/ +SQLITE_PRIVATE u32 sqlite3PagerDataVersion(Pager *pPager){ + assert( pPager->eState>PAGER_OPEN ); + return pPager->iDataVersion; +} + +/* +** Free all structures in the Pager.aSavepoint[] array and set both +** Pager.aSavepoint and Pager.nSavepoint to zero. Close the sub-journal +** if it is open and the pager is not in exclusive mode. +*/ +static void releaseAllSavepoints(Pager *pPager){ + int ii; /* Iterator for looping through Pager.aSavepoint */ + for(ii=0; iinSavepoint; ii++){ + sqlite3BitvecDestroy(pPager->aSavepoint[ii].pInSavepoint); + } + if( !pPager->exclusiveMode || sqlite3JournalIsInMemory(pPager->sjfd) ){ + sqlite3OsClose(pPager->sjfd); + } + sqlite3_free(pPager->aSavepoint); + pPager->aSavepoint = 0; + pPager->nSavepoint = 0; + pPager->nSubRec = 0; +} + +/* +** Set the bit number pgno in the PagerSavepoint.pInSavepoint +** bitvecs of all open savepoints. Return SQLITE_OK if successful +** or SQLITE_NOMEM if a malloc failure occurs. +*/ +static int addToSavepointBitvecs(Pager *pPager, Pgno pgno){ + int ii; /* Loop counter */ + int rc = SQLITE_OK; /* Result code */ + + for(ii=0; iinSavepoint; ii++){ + PagerSavepoint *p = &pPager->aSavepoint[ii]; + if( pgno<=p->nOrig ){ + rc |= sqlite3BitvecSet(p->pInSavepoint, pgno); + testcase( rc==SQLITE_NOMEM ); + assert( rc==SQLITE_OK || rc==SQLITE_NOMEM ); + } + } + return rc; +} + +/* +** This function is a no-op if the pager is in exclusive mode and not +** in the ERROR state. Otherwise, it switches the pager to PAGER_OPEN +** state. +** +** If the pager is not in exclusive-access mode, the database file is +** completely unlocked. If the file is unlocked and the file-system does +** not exhibit the UNDELETABLE_WHEN_OPEN property, the journal file is +** closed (if it is open). +** +** If the pager is in ERROR state when this function is called, the +** contents of the pager cache are discarded before switching back to +** the OPEN state. Regardless of whether the pager is in exclusive-mode +** or not, any journal file left in the file-system will be treated +** as a hot-journal and rolled back the next time a read-transaction +** is opened (by this or by any other connection). +*/ +static void pager_unlock(Pager *pPager){ + + assert( pPager->eState==PAGER_READER + || pPager->eState==PAGER_OPEN + || pPager->eState==PAGER_ERROR + ); + + sqlite3BitvecDestroy(pPager->pInJournal); + pPager->pInJournal = 0; + releaseAllSavepoints(pPager); + + if( pagerUseWal(pPager) ){ + assert( !isOpen(pPager->jfd) ); + sqlite3WalEndReadTransaction(pPager->pWal); + pPager->eState = PAGER_OPEN; + }else if( !pPager->exclusiveMode ){ + int rc; /* Error code returned by pagerUnlockDb() */ + int iDc = isOpen(pPager->fd)?sqlite3OsDeviceCharacteristics(pPager->fd):0; + + /* If the operating system support deletion of open files, then + ** close the journal file when dropping the database lock. Otherwise + ** another connection with journal_mode=delete might delete the file + ** out from under us. + */ + assert( (PAGER_JOURNALMODE_MEMORY & 5)!=1 ); + assert( (PAGER_JOURNALMODE_OFF & 5)!=1 ); + assert( (PAGER_JOURNALMODE_WAL & 5)!=1 ); + assert( (PAGER_JOURNALMODE_DELETE & 5)!=1 ); + assert( (PAGER_JOURNALMODE_TRUNCATE & 5)==1 ); + assert( (PAGER_JOURNALMODE_PERSIST & 5)==1 ); + if( 0==(iDc & SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN) + || 1!=(pPager->journalMode & 5) + ){ + sqlite3OsClose(pPager->jfd); + } + + /* If the pager is in the ERROR state and the call to unlock the database + ** file fails, set the current lock to UNKNOWN_LOCK. See the comment + ** above the #define for UNKNOWN_LOCK for an explanation of why this + ** is necessary. + */ + rc = pagerUnlockDb(pPager, NO_LOCK); + if( rc!=SQLITE_OK && pPager->eState==PAGER_ERROR ){ + pPager->eLock = UNKNOWN_LOCK; + } + + /* The pager state may be changed from PAGER_ERROR to PAGER_OPEN here + ** without clearing the error code. This is intentional - the error + ** code is cleared and the cache reset in the block below. + */ + assert( pPager->errCode || pPager->eState!=PAGER_ERROR ); + pPager->changeCountDone = 0; + pPager->eState = PAGER_OPEN; + } + + /* If Pager.errCode is set, the contents of the pager cache cannot be + ** trusted. Now that there are no outstanding references to the pager, + ** it can safely move back to PAGER_OPEN state. This happens in both + ** normal and exclusive-locking mode. + */ + assert( pPager->errCode==SQLITE_OK || !MEMDB ); + if( pPager->errCode ){ + if( pPager->tempFile==0 ){ + pager_reset(pPager); + pPager->changeCountDone = 0; + pPager->eState = PAGER_OPEN; + }else{ + pPager->eState = (isOpen(pPager->jfd) ? PAGER_OPEN : PAGER_READER); + } + if( USEFETCH(pPager) ) sqlite3OsUnfetch(pPager->fd, 0, 0); + pPager->errCode = SQLITE_OK; + } + + pPager->journalOff = 0; + pPager->journalHdr = 0; + pPager->setMaster = 0; +} + +/* +** This function is called whenever an IOERR or FULL error that requires +** the pager to transition into the ERROR state may ahve occurred. +** The first argument is a pointer to the pager structure, the second +** the error-code about to be returned by a pager API function. The +** value returned is a copy of the second argument to this function. +** +** If the second argument is SQLITE_FULL, SQLITE_IOERR or one of the +** IOERR sub-codes, the pager enters the ERROR state and the error code +** is stored in Pager.errCode. While the pager remains in the ERROR state, +** all major API calls on the Pager will immediately return Pager.errCode. +** +** The ERROR state indicates that the contents of the pager-cache +** cannot be trusted. This state can be cleared by completely discarding +** the contents of the pager-cache. If a transaction was active when +** the persistent error occurred, then the rollback journal may need +** to be replayed to restore the contents of the database file (as if +** it were a hot-journal). +*/ +static int pager_error(Pager *pPager, int rc){ + int rc2 = rc & 0xff; + assert( rc==SQLITE_OK || !MEMDB ); + assert( + pPager->errCode==SQLITE_FULL || + pPager->errCode==SQLITE_OK || + (pPager->errCode & 0xff)==SQLITE_IOERR + ); + if( rc2==SQLITE_FULL || rc2==SQLITE_IOERR ){ + pPager->errCode = rc; + pPager->eState = PAGER_ERROR; + } + return rc; +} + +static int pager_truncate(Pager *pPager, Pgno nPage); + +/* +** The write transaction open on pPager is being committed (bCommit==1) +** or rolled back (bCommit==0). +** +** Return TRUE if and only if all dirty pages should be flushed to disk. +** +** Rules: +** +** * For non-TEMP databases, always sync to disk. This is necessary +** for transactions to be durable. +** +** * Sync TEMP database only on a COMMIT (not a ROLLBACK) when the backing +** file has been created already (via a spill on pagerStress()) and +** when the number of dirty pages in memory exceeds 25% of the total +** cache size. +*/ +static int pagerFlushOnCommit(Pager *pPager, int bCommit){ + if( pPager->tempFile==0 ) return 1; + if( !bCommit ) return 0; + if( !isOpen(pPager->fd) ) return 0; + return (sqlite3PCachePercentDirty(pPager->pPCache)>=25); +} + +/* +** This routine ends a transaction. A transaction is usually ended by +** either a COMMIT or a ROLLBACK operation. This routine may be called +** after rollback of a hot-journal, or if an error occurs while opening +** the journal file or writing the very first journal-header of a +** database transaction. +** +** This routine is never called in PAGER_ERROR state. If it is called +** in PAGER_NONE or PAGER_SHARED state and the lock held is less +** exclusive than a RESERVED lock, it is a no-op. +** +** Otherwise, any active savepoints are released. +** +** If the journal file is open, then it is "finalized". Once a journal +** file has been finalized it is not possible to use it to roll back a +** transaction. Nor will it be considered to be a hot-journal by this +** or any other database connection. Exactly how a journal is finalized +** depends on whether or not the pager is running in exclusive mode and +** the current journal-mode (Pager.journalMode value), as follows: +** +** journalMode==MEMORY +** Journal file descriptor is simply closed. This destroys an +** in-memory journal. +** +** journalMode==TRUNCATE +** Journal file is truncated to zero bytes in size. +** +** journalMode==PERSIST +** The first 28 bytes of the journal file are zeroed. This invalidates +** the first journal header in the file, and hence the entire journal +** file. An invalid journal file cannot be rolled back. +** +** journalMode==DELETE +** The journal file is closed and deleted using sqlite3OsDelete(). +** +** If the pager is running in exclusive mode, this method of finalizing +** the journal file is never used. Instead, if the journalMode is +** DELETE and the pager is in exclusive mode, the method described under +** journalMode==PERSIST is used instead. +** +** After the journal is finalized, the pager moves to PAGER_READER state. +** If running in non-exclusive rollback mode, the lock on the file is +** downgraded to a SHARED_LOCK. +** +** SQLITE_OK is returned if no error occurs. If an error occurs during +** any of the IO operations to finalize the journal file or unlock the +** database then the IO error code is returned to the user. If the +** operation to finalize the journal file fails, then the code still +** tries to unlock the database file if not in exclusive mode. If the +** unlock operation fails as well, then the first error code related +** to the first error encountered (the journal finalization one) is +** returned. +*/ +static int pager_end_transaction(Pager *pPager, int hasMaster, int bCommit){ + int rc = SQLITE_OK; /* Error code from journal finalization operation */ + int rc2 = SQLITE_OK; /* Error code from db file unlock operation */ + + /* Do nothing if the pager does not have an open write transaction + ** or at least a RESERVED lock. This function may be called when there + ** is no write-transaction active but a RESERVED or greater lock is + ** held under two circumstances: + ** + ** 1. After a successful hot-journal rollback, it is called with + ** eState==PAGER_NONE and eLock==EXCLUSIVE_LOCK. + ** + ** 2. If a connection with locking_mode=exclusive holding an EXCLUSIVE + ** lock switches back to locking_mode=normal and then executes a + ** read-transaction, this function is called with eState==PAGER_READER + ** and eLock==EXCLUSIVE_LOCK when the read-transaction is closed. + */ + assert( assert_pager_state(pPager) ); + assert( pPager->eState!=PAGER_ERROR ); + if( pPager->eStateeLockjfd) || pPager->pInJournal==0 ); + if( isOpen(pPager->jfd) ){ + assert( !pagerUseWal(pPager) ); + + /* Finalize the journal file. */ + if( sqlite3JournalIsInMemory(pPager->jfd) ){ + /* assert( pPager->journalMode==PAGER_JOURNALMODE_MEMORY ); */ + sqlite3OsClose(pPager->jfd); + }else if( pPager->journalMode==PAGER_JOURNALMODE_TRUNCATE ){ + if( pPager->journalOff==0 ){ + rc = SQLITE_OK; + }else{ + rc = sqlite3OsTruncate(pPager->jfd, 0); + if( rc==SQLITE_OK && pPager->fullSync ){ + /* Make sure the new file size is written into the inode right away. + ** Otherwise the journal might resurrect following a power loss and + ** cause the last transaction to roll back. See + ** https://bugzilla.mozilla.org/show_bug.cgi?id=1072773 + */ + rc = sqlite3OsSync(pPager->jfd, pPager->syncFlags); + } + } + pPager->journalOff = 0; + }else if( pPager->journalMode==PAGER_JOURNALMODE_PERSIST + || (pPager->exclusiveMode && pPager->journalMode!=PAGER_JOURNALMODE_WAL) + ){ + rc = zeroJournalHdr(pPager, hasMaster||pPager->tempFile); + pPager->journalOff = 0; + }else{ + /* This branch may be executed with Pager.journalMode==MEMORY if + ** a hot-journal was just rolled back. In this case the journal + ** file should be closed and deleted. If this connection writes to + ** the database file, it will do so using an in-memory journal. + */ + int bDelete = !pPager->tempFile; + assert( sqlite3JournalIsInMemory(pPager->jfd)==0 ); + assert( pPager->journalMode==PAGER_JOURNALMODE_DELETE + || pPager->journalMode==PAGER_JOURNALMODE_MEMORY + || pPager->journalMode==PAGER_JOURNALMODE_WAL + ); + sqlite3OsClose(pPager->jfd); + if( bDelete ){ + rc = sqlite3OsDelete(pPager->pVfs, pPager->zJournal, pPager->extraSync); + } + } + } + +#ifdef SQLITE_CHECK_PAGES + sqlite3PcacheIterateDirty(pPager->pPCache, pager_set_pagehash); + if( pPager->dbSize==0 && sqlite3PcacheRefCount(pPager->pPCache)>0 ){ + PgHdr *p = sqlite3PagerLookup(pPager, 1); + if( p ){ + p->pageHash = 0; + sqlite3PagerUnrefNotNull(p); + } + } +#endif + + sqlite3BitvecDestroy(pPager->pInJournal); + pPager->pInJournal = 0; + pPager->nRec = 0; + if( rc==SQLITE_OK ){ + if( pagerFlushOnCommit(pPager, bCommit) ){ + sqlite3PcacheCleanAll(pPager->pPCache); + }else{ + sqlite3PcacheClearWritable(pPager->pPCache); + } + sqlite3PcacheTruncate(pPager->pPCache, pPager->dbSize); + } + + if( pagerUseWal(pPager) ){ + /* Drop the WAL write-lock, if any. Also, if the connection was in + ** locking_mode=exclusive mode but is no longer, drop the EXCLUSIVE + ** lock held on the database file. + */ + rc2 = sqlite3WalEndWriteTransaction(pPager->pWal); + assert( rc2==SQLITE_OK ); + }else if( rc==SQLITE_OK && bCommit && pPager->dbFileSize>pPager->dbSize ){ + /* This branch is taken when committing a transaction in rollback-journal + ** mode if the database file on disk is larger than the database image. + ** At this point the journal has been finalized and the transaction + ** successfully committed, but the EXCLUSIVE lock is still held on the + ** file. So it is safe to truncate the database file to its minimum + ** required size. */ + assert( pPager->eLock==EXCLUSIVE_LOCK ); + rc = pager_truncate(pPager, pPager->dbSize); + } + + if( rc==SQLITE_OK && bCommit && isOpen(pPager->fd) ){ + rc = sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_COMMIT_PHASETWO, 0); + if( rc==SQLITE_NOTFOUND ) rc = SQLITE_OK; + } + + if( !pPager->exclusiveMode + && (!pagerUseWal(pPager) || sqlite3WalExclusiveMode(pPager->pWal, 0)) + ){ + rc2 = pagerUnlockDb(pPager, SHARED_LOCK); + pPager->changeCountDone = 0; + } + pPager->eState = PAGER_READER; + pPager->setMaster = 0; + + return (rc==SQLITE_OK?rc2:rc); +} + +/* +** Execute a rollback if a transaction is active and unlock the +** database file. +** +** If the pager has already entered the ERROR state, do not attempt +** the rollback at this time. Instead, pager_unlock() is called. The +** call to pager_unlock() will discard all in-memory pages, unlock +** the database file and move the pager back to OPEN state. If this +** means that there is a hot-journal left in the file-system, the next +** connection to obtain a shared lock on the pager (which may be this one) +** will roll it back. +** +** If the pager has not already entered the ERROR state, but an IO or +** malloc error occurs during a rollback, then this will itself cause +** the pager to enter the ERROR state. Which will be cleared by the +** call to pager_unlock(), as described above. +*/ +static void pagerUnlockAndRollback(Pager *pPager){ + if( pPager->eState!=PAGER_ERROR && pPager->eState!=PAGER_OPEN ){ + assert( assert_pager_state(pPager) ); + if( pPager->eState>=PAGER_WRITER_LOCKED ){ + sqlite3BeginBenignMalloc(); + sqlite3PagerRollback(pPager); + sqlite3EndBenignMalloc(); + }else if( !pPager->exclusiveMode ){ + assert( pPager->eState==PAGER_READER ); + pager_end_transaction(pPager, 0, 0); + } + } + pager_unlock(pPager); +} + +/* +** Parameter aData must point to a buffer of pPager->pageSize bytes +** of data. Compute and return a checksum based ont the contents of the +** page of data and the current value of pPager->cksumInit. +** +** This is not a real checksum. It is really just the sum of the +** random initial value (pPager->cksumInit) and every 200th byte +** of the page data, starting with byte offset (pPager->pageSize%200). +** Each byte is interpreted as an 8-bit unsigned integer. +** +** Changing the formula used to compute this checksum results in an +** incompatible journal file format. +** +** If journal corruption occurs due to a power failure, the most likely +** scenario is that one end or the other of the record will be changed. +** It is much less likely that the two ends of the journal record will be +** correct and the middle be corrupt. Thus, this "checksum" scheme, +** though fast and simple, catches the mostly likely kind of corruption. +*/ +static u32 pager_cksum(Pager *pPager, const u8 *aData){ + u32 cksum = pPager->cksumInit; /* Checksum value to return */ + int i = pPager->pageSize-200; /* Loop counter */ + while( i>0 ){ + cksum += aData[i]; + i -= 200; + } + return cksum; +} + +/* +** Report the current page size and number of reserved bytes back +** to the codec. +*/ +#ifdef SQLITE_HAS_CODEC +static void pagerReportSize(Pager *pPager){ + if( pPager->xCodecSizeChng ){ + pPager->xCodecSizeChng(pPager->pCodec, pPager->pageSize, + (int)pPager->nReserve); + } +} +#else +# define pagerReportSize(X) /* No-op if we do not support a codec */ +#endif + +#ifdef SQLITE_HAS_CODEC +/* +** Make sure the number of reserved bits is the same in the destination +** pager as it is in the source. This comes up when a VACUUM changes the +** number of reserved bits to the "optimal" amount. +*/ +SQLITE_PRIVATE void sqlite3PagerAlignReserve(Pager *pDest, Pager *pSrc){ + if( pDest->nReserve!=pSrc->nReserve ){ + pDest->nReserve = pSrc->nReserve; + pagerReportSize(pDest); + } +} +#endif + +/* +** Read a single page from either the journal file (if isMainJrnl==1) or +** from the sub-journal (if isMainJrnl==0) and playback that page. +** The page begins at offset *pOffset into the file. The *pOffset +** value is increased to the start of the next page in the journal. +** +** The main rollback journal uses checksums - the statement journal does +** not. +** +** If the page number of the page record read from the (sub-)journal file +** is greater than the current value of Pager.dbSize, then playback is +** skipped and SQLITE_OK is returned. +** +** If pDone is not NULL, then it is a record of pages that have already +** been played back. If the page at *pOffset has already been played back +** (if the corresponding pDone bit is set) then skip the playback. +** Make sure the pDone bit corresponding to the *pOffset page is set +** prior to returning. +** +** If the page record is successfully read from the (sub-)journal file +** and played back, then SQLITE_OK is returned. If an IO error occurs +** while reading the record from the (sub-)journal file or while writing +** to the database file, then the IO error code is returned. If data +** is successfully read from the (sub-)journal file but appears to be +** corrupted, SQLITE_DONE is returned. Data is considered corrupted in +** two circumstances: +** +** * If the record page-number is illegal (0 or PAGER_MJ_PGNO), or +** * If the record is being rolled back from the main journal file +** and the checksum field does not match the record content. +** +** Neither of these two scenarios are possible during a savepoint rollback. +** +** If this is a savepoint rollback, then memory may have to be dynamically +** allocated by this function. If this is the case and an allocation fails, +** SQLITE_NOMEM is returned. +*/ +static int pager_playback_one_page( + Pager *pPager, /* The pager being played back */ + i64 *pOffset, /* Offset of record to playback */ + Bitvec *pDone, /* Bitvec of pages already played back */ + int isMainJrnl, /* 1 -> main journal. 0 -> sub-journal. */ + int isSavepnt /* True for a savepoint rollback */ +){ + int rc; + 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 */ + char *aData; /* Temporary storage for the page */ + sqlite3_file *jfd; /* The file descriptor for the journal file */ + int isSynced; /* True if journal page is synced */ + + assert( (isMainJrnl&~1)==0 ); /* isMainJrnl is 0 or 1 */ + assert( (isSavepnt&~1)==0 ); /* isSavepnt is 0 or 1 */ + assert( isMainJrnl || pDone ); /* pDone always used on sub-journals */ + assert( isSavepnt || pDone==0 ); /* pDone never used on non-savepoint */ + + aData = pPager->pTmpSpace; + assert( aData ); /* Temp storage must have already been allocated */ + assert( pagerUseWal(pPager)==0 || (!isMainJrnl && isSavepnt) ); + + /* Either the state is greater than PAGER_WRITER_CACHEMOD (a transaction + ** or savepoint rollback done at the request of the caller) or this is + ** a hot-journal rollback. If it is a hot-journal rollback, the pager + ** is in state OPEN and holds an EXCLUSIVE lock. Hot-journal rollback + ** only reads from the main journal, not the sub-journal. + */ + assert( pPager->eState>=PAGER_WRITER_CACHEMOD + || (pPager->eState==PAGER_OPEN && pPager->eLock==EXCLUSIVE_LOCK) + ); + assert( pPager->eState>=PAGER_WRITER_CACHEMOD || isMainJrnl ); + + /* Read the page number and page data from the journal or sub-journal + ** file. Return an error code to the caller if an IO error occurs. + */ + jfd = isMainJrnl ? pPager->jfd : pPager->sjfd; + rc = read32bits(jfd, *pOffset, &pgno); + if( rc!=SQLITE_OK ) return rc; + rc = sqlite3OsRead(jfd, (u8*)aData, pPager->pageSize, (*pOffset)+4); + if( rc!=SQLITE_OK ) return rc; + *pOffset += pPager->pageSize + 4 + isMainJrnl*4; + + /* Sanity checking on the page. This is more important that I originally + ** thought. If a power failure occurs while the journal is being written, + ** it could cause invalid data to be written into the journal. We need to + ** detect this invalid data (with high probability) and ignore it. + */ + if( pgno==0 || pgno==PAGER_MJ_PGNO(pPager) ){ + assert( !isSavepnt ); + return SQLITE_DONE; + } + if( pgno>(Pgno)pPager->dbSize || sqlite3BitvecTest(pDone, pgno) ){ + return SQLITE_OK; + } + if( isMainJrnl ){ + rc = read32bits(jfd, (*pOffset)-4, &cksum); + if( rc ) return rc; + if( !isSavepnt && pager_cksum(pPager, (u8*)aData)!=cksum ){ + return SQLITE_DONE; + } + } + + /* If this page has already been played back before during the current + ** rollback, then don't bother to play it back again. + */ + if( pDone && (rc = sqlite3BitvecSet(pDone, pgno))!=SQLITE_OK ){ + return rc; + } + + /* When playing back page 1, restore the nReserve setting + */ + if( pgno==1 && pPager->nReserve!=((u8*)aData)[20] ){ + pPager->nReserve = ((u8*)aData)[20]; + pagerReportSize(pPager); + } + + /* If the pager is in CACHEMOD state, then there must be a copy of this + ** page in the pager cache. In this case just update the pager cache, + ** not the database file. The page is left marked dirty in this case. + ** + ** An exception to the above rule: If the database is in no-sync mode + ** and a page is moved during an incremental vacuum then the page may + ** not be in the pager cache. Later: if a malloc() or IO error occurs + ** during a Movepage() call, then the page may not be in the cache + ** either. So the condition described in the above paragraph is not + ** assert()able. + ** + ** If in WRITER_DBMOD, WRITER_FINISHED or OPEN state, then we update the + ** pager cache if it exists and the main file. The page is then marked + ** not dirty. Since this code is only executed in PAGER_OPEN state for + ** a hot-journal rollback, it is guaranteed that the page-cache is empty + ** if the pager is in OPEN state. + ** + ** Ticket #1171: The statement journal might contain page content that is + ** different from the page content at the start of the transaction. + ** This occurs when a page is changed prior to the start of a statement + ** then changed again within the statement. When rolling back such a + ** statement we must not write to the original database unless we know + ** for certain that original page contents are synced into the main rollback + ** journal. Otherwise, a power loss might leave modified data in the + ** database file without an entry in the rollback journal that can + ** restore the database to its original form. Two conditions must be + ** met before writing to the database files. (1) the database must be + ** locked. (2) we know that the original page content is fully synced + ** in the main journal either because the page is not in cache or else + ** the page is marked as needSync==0. + ** + ** 2008-04-14: When attempting to vacuum a corrupt database file, it + ** is possible to fail a statement on a database that does not yet exist. + ** Do not attempt to write if database file has never been opened. + */ + if( pagerUseWal(pPager) ){ + pPg = 0; + }else{ + pPg = sqlite3PagerLookup(pPager, pgno); + } + assert( pPg || !MEMDB ); + assert( pPager->eState!=PAGER_OPEN || pPg==0 || pPager->tempFile ); + PAGERTRACE(("PLAYBACK %d page %d hash(%08x) %s\n", + PAGERID(pPager), pgno, pager_datahash(pPager->pageSize, (u8*)aData), + (isMainJrnl?"main-journal":"sub-journal") + )); + if( isMainJrnl ){ + isSynced = pPager->noSync || (*pOffset <= pPager->journalHdr); + }else{ + isSynced = (pPg==0 || 0==(pPg->flags & PGHDR_NEED_SYNC)); + } + if( isOpen(pPager->fd) + && (pPager->eState>=PAGER_WRITER_DBMOD || pPager->eState==PAGER_OPEN) + && isSynced + ){ + i64 ofst = (pgno-1)*(i64)pPager->pageSize; + testcase( !isSavepnt && pPg!=0 && (pPg->flags&PGHDR_NEED_SYNC)!=0 ); + assert( !pagerUseWal(pPager) ); + 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_BKPT); + sqlite3BackupUpdate(pPager->pBackup, pgno, (u8*)aData); + CODEC2(pPager, aData, pgno, 7, rc=SQLITE_NOMEM_BKPT, aData); + } + }else if( !isMainJrnl && pPg==0 ){ + /* If this is a rollback of a savepoint and data was not written to + ** the database and the page is not in-memory, there is a potential + ** problem. When the page is next fetched by the b-tree layer, it + ** will be read from the database file, which may or may not be + ** current. + ** + ** There are a couple of different ways this can happen. All are quite + ** obscure. When running in synchronous mode, this can only happen + ** if the page is on the free-list at the start of the transaction, then + ** populated, then moved using sqlite3PagerMovepage(). + ** + ** The solution is to add an in-memory page to the cache containing + ** the data just read from the sub-journal. Mark the page as dirty + ** and if the pager requires a journal-sync, then mark the page as + ** requiring a journal-sync before it is written. + */ + assert( isSavepnt ); + assert( (pPager->doNotSpill & SPILLFLAG_ROLLBACK)==0 ); + pPager->doNotSpill |= SPILLFLAG_ROLLBACK; + rc = sqlite3PagerGet(pPager, pgno, &pPg, 1); + assert( (pPager->doNotSpill & SPILLFLAG_ROLLBACK)!=0 ); + pPager->doNotSpill &= ~SPILLFLAG_ROLLBACK; + if( rc!=SQLITE_OK ) return rc; + sqlite3PcacheMakeDirty(pPg); + } + if( pPg ){ + /* No page should ever be explicitly rolled back that is in use, except + ** for page 1 which is held in use in order to keep the lock on the + ** database active. However such a page may be rolled back as a result + ** of an internal error resulting in an automatic call to + ** sqlite3PagerRollback(). + */ + void *pData; + pData = pPg->pData; + memcpy(pData, (u8*)aData, pPager->pageSize); + pPager->xReiniter(pPg); + /* It used to be that sqlite3PcacheMakeClean(pPg) was called here. But + ** that call was dangerous and had no detectable benefit since the cache + ** is normally cleaned by sqlite3PcacheCleanAll() after rollback and so + ** has been removed. */ + pager_set_pagehash(pPg); + + /* If this was page 1, then restore the value of Pager.dbFileVers. + ** Do this before any decoding. */ + if( pgno==1 ){ + memcpy(&pPager->dbFileVers, &((u8*)pData)[24],sizeof(pPager->dbFileVers)); + } + + /* Decode the page just read from disk */ + CODEC1(pPager, pData, pPg->pgno, 3, rc=SQLITE_NOMEM_BKPT); + sqlite3PcacheRelease(pPg); + } + return rc; +} + +/* +** Parameter zMaster is the name of a master journal file. A single journal +** file that referred to the master journal file has just been rolled back. +** This routine checks if it is possible to delete the master journal file, +** and does so if it is. +** +** Argument zMaster may point to Pager.pTmpSpace. So that buffer is not +** available for use within this function. +** +** When a master journal file is created, it is populated with the names +** of all of its child journals, one after another, formatted as utf-8 +** encoded text. The end of each child journal file is marked with a +** nul-terminator byte (0x00). i.e. the entire contents of a master journal +** file for a transaction involving two databases might be: +** +** "/home/bill/a.db-journal\x00/home/bill/b.db-journal\x00" +** +** A master journal file may only be deleted once all of its child +** journals have been rolled back. +** +** This function reads the contents of the master-journal file into +** memory and loops through each of the child journal names. For +** each child journal, it checks if: +** +** * if the child journal exists, and if so +** * if the child journal contains a reference to master journal +** file zMaster +** +** If a child journal can be found that matches both of the criteria +** above, this function returns without doing anything. Otherwise, if +** no such child journal can be found, file zMaster is deleted from +** the file-system using sqlite3OsDelete(). +** +** If an IO error within this function, an error code is returned. This +** function allocates memory by calling sqlite3Malloc(). If an allocation +** fails, SQLITE_NOMEM is returned. Otherwise, if no IO or malloc errors +** occur, SQLITE_OK is returned. +** +** TODO: This function allocates a single block of memory to load +** the entire contents of the master journal file. This could be +** a couple of kilobytes or so - potentially larger than the page +** size. +*/ +static int pager_delmaster(Pager *pPager, const char *zMaster){ + sqlite3_vfs *pVfs = pPager->pVfs; + int rc; /* Return code */ + sqlite3_file *pMaster; /* Malloc'd master-journal file descriptor */ + sqlite3_file *pJournal; /* Malloc'd child-journal file descriptor */ + char *zMasterJournal = 0; /* Contents of master journal file */ + i64 nMasterJournal; /* Size of master journal file */ + char *zJournal; /* Pointer to one journal within MJ file */ + char *zMasterPtr; /* Space to hold MJ filename from a journal file */ + int nMasterPtr; /* Amount of space allocated to zMasterPtr[] */ + + /* Allocate space for both the pJournal and pMaster file descriptors. + ** If successful, open the master journal file for reading. + */ + pMaster = (sqlite3_file *)sqlite3MallocZero(pVfs->szOsFile * 2); + pJournal = (sqlite3_file *)(((u8 *)pMaster) + pVfs->szOsFile); + if( !pMaster ){ + rc = SQLITE_NOMEM_BKPT; + }else{ + const int flags = (SQLITE_OPEN_READONLY|SQLITE_OPEN_MASTER_JOURNAL); + rc = sqlite3OsOpen(pVfs, zMaster, pMaster, flags, 0); + } + if( rc!=SQLITE_OK ) goto delmaster_out; + + /* Load the entire master journal file into space obtained from + ** sqlite3_malloc() and pointed to by zMasterJournal. Also obtain + ** sufficient space (in zMasterPtr) to hold the names of master + ** journal files extracted from regular rollback-journals. + */ + rc = sqlite3OsFileSize(pMaster, &nMasterJournal); + if( rc!=SQLITE_OK ) goto delmaster_out; + nMasterPtr = pVfs->mxPathname+1; + zMasterJournal = sqlite3Malloc(nMasterJournal + nMasterPtr + 1); + if( !zMasterJournal ){ + rc = SQLITE_NOMEM_BKPT; + goto delmaster_out; + } + zMasterPtr = &zMasterJournal[nMasterJournal+1]; + rc = sqlite3OsRead(pMaster, zMasterJournal, (int)nMasterJournal, 0); + if( rc!=SQLITE_OK ) goto delmaster_out; + zMasterJournal[nMasterJournal] = 0; + + zJournal = zMasterJournal; + while( (zJournal-zMasterJournal)pageSize bytes). +** If the file on disk is currently larger than nPage pages, then use the VFS +** xTruncate() method to truncate it. +** +** Or, it might be the case that the file on disk is smaller than +** nPage pages. Some operating system implementations can get confused if +** you try to truncate a file to some size that is larger than it +** currently is, so detect this case and write a single zero byte to +** the end of the new file instead. +** +** If successful, return SQLITE_OK. If an IO error occurs while modifying +** the database file, return the error code to the caller. +*/ +static int pager_truncate(Pager *pPager, Pgno nPage){ + int rc = SQLITE_OK; + assert( pPager->eState!=PAGER_ERROR ); + assert( pPager->eState!=PAGER_READER ); + + if( isOpen(pPager->fd) + && (pPager->eState>=PAGER_WRITER_DBMOD || pPager->eState==PAGER_OPEN) + ){ + i64 currentSize, newSize; + int szPage = pPager->pageSize; + assert( pPager->eLock==EXCLUSIVE_LOCK ); + /* TODO: Is it safe to use Pager.dbFileSize here? */ + rc = sqlite3OsFileSize(pPager->fd, ¤tSize); + newSize = szPage*(i64)nPage; + if( rc==SQLITE_OK && currentSize!=newSize ){ + if( currentSize>newSize ){ + rc = sqlite3OsTruncate(pPager->fd, newSize); + }else if( (currentSize+szPage)<=newSize ){ + char *pTmp = pPager->pTmpSpace; + memset(pTmp, 0, szPage); + testcase( (newSize-szPage) == currentSize ); + testcase( (newSize-szPage) > currentSize ); + rc = sqlite3OsWrite(pPager->fd, pTmp, szPage, newSize-szPage); + } + if( rc==SQLITE_OK ){ + pPager->dbFileSize = nPage; + } + } + } + return rc; +} + +/* +** Return a sanitized version of the sector-size of OS file pFile. The +** return value is guaranteed to lie between 32 and MAX_SECTOR_SIZE. +*/ +SQLITE_PRIVATE int sqlite3SectorSize(sqlite3_file *pFile){ + int iRet = sqlite3OsSectorSize(pFile); + if( iRet<32 ){ + iRet = 512; + }else if( iRet>MAX_SECTOR_SIZE ){ + assert( MAX_SECTOR_SIZE>=512 ); + iRet = MAX_SECTOR_SIZE; + } + return iRet; +} + +/* +** Set the value of the Pager.sectorSize variable for the given +** pager based on the value returned by the xSectorSize method +** of the open database file. The sector size will be used +** to determine the size and alignment of journal header and +** master journal pointers within created journal files. +** +** 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 32 if +** it is less than 32, or rounded down to MAX_SECTOR_SIZE if it +** is greater than MAX_SECTOR_SIZE. +** +** If the file has the SQLITE_IOCAP_POWERSAFE_OVERWRITE property, then set +** the effective sector size to its minimum value (512). The purpose of +** pPager->sectorSize is to define the "blast radius" of bytes that +** might change if a crash occurs while writing to a single byte in +** that range. But with POWERSAFE_OVERWRITE, the blast radius is zero +** (that is what POWERSAFE_OVERWRITE means), so we minimize the sector +** size. For backwards compatibility of the rollback journal file format, +** we cannot reduce the effective sector size below 512. +*/ +static void setSectorSize(Pager *pPager){ + assert( isOpen(pPager->fd) || pPager->tempFile ); + + if( pPager->tempFile + || (sqlite3OsDeviceCharacteristics(pPager->fd) & + SQLITE_IOCAP_POWERSAFE_OVERWRITE)!=0 + ){ + /* Sector size doesn't matter for temporary files. Also, the file + ** may not have been opened yet, in which case the OsSectorSize() + ** call will segfault. */ + pPager->sectorSize = 512; + }else{ + pPager->sectorSize = sqlite3SectorSize(pPager->fd); + } +} + +/* +** Playback the journal and thus restore the database file to +** the state it was in before we started making changes. +** +** The journal file format is as follows: +** +** (1) 8 byte prefix. A copy of aJournalMagic[]. +** (2) 4 byte big-endian integer which is the number of valid page records +** in the journal. If this value is 0xffffffff, then compute the +** number of page records from the journal size. +** (3) 4 byte big-endian integer which is the initial value for the +** sanity checksum. +** (4) 4 byte integer which is the number of pages to truncate the +** 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 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 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 +** value of nRec from the size of the journal file. But if a power +** failure occurred while the journal was being written, it could be the +** case that the size of the journal file had already been increased but +** the extra entries had not yet made it safely to disk. In such a case, +** the value of nRec computed from the file size would be too large. For +** that reason, we always use the nRec value in the header. +** +** If the nRec value is 0xffffffff it means that nRec should be computed +** from the file size. This value is used when the user selects the +** no-sync option for the journal. A power failure could lead to corruption +** in this case. But for things like temporary table (which will be +** deleted when the power is restored) we don't care. +** +** If the file opened as the journal file is not a well-formed +** journal file then all pages up to the first corrupted page are rolled +** back (or no pages if the journal header is corrupted). The journal file +** is then deleted and SQLITE_OK returned, just as if no corruption had +** been encountered. +** +** If an I/O or malloc() error occurs, the journal-file is not deleted +** and an error code is returned. +** +** The isHot parameter indicates that we are trying to rollback a journal +** that might be a hot journal. Or, it could be that the journal is +** preserved because of JOURNALMODE_PERSIST or JOURNALMODE_TRUNCATE. +** If the journal really is hot, reset the pager cache prior rolling +** back any content. If the journal is merely persistent, no reset is +** needed. +*/ +static int pager_playback(Pager *pPager, int isHot){ + sqlite3_vfs *pVfs = pPager->pVfs; + i64 szJ; /* Size of the journal file in bytes */ + u32 nRec; /* Number of Records in the journal */ + u32 u; /* Unsigned loop counter */ + Pgno mxPg = 0; /* Size of the original file in pages */ + int rc; /* Result code of a subroutine */ + int res = 1; /* Value returned by sqlite3OsAccess() */ + char *zMaster = 0; /* Name of master journal file if any */ + int needPagerReset; /* True to reset page prior to first page rollback */ + int nPlayback = 0; /* Total number of pages restored from journal */ + + /* Figure out how many records are in the journal. Abort early if + ** the journal is empty. + */ + assert( isOpen(pPager->jfd) ); + rc = sqlite3OsFileSize(pPager->jfd, &szJ); + if( rc!=SQLITE_OK ){ + goto end_playback; + } + + /* Read the master journal name from the journal, if it is present. + ** If a master journal file name is specified, but the file is not + ** present on disk, then the journal is not hot and does not need to be + ** played back. + ** + ** TODO: Technically the following is an error because it assumes that + ** buffer Pager.pTmpSpace is (mxPathname+1) bytes or larger. i.e. that + ** (pPager->pageSize >= pPager->pVfs->mxPathname+1). Using os_unix.c, + ** mxPathname is 512, which is the same as the minimum allowable value + ** for pageSize. + */ + zMaster = pPager->pTmpSpace; + rc = readMasterJournal(pPager->jfd, zMaster, pPager->pVfs->mxPathname+1); + if( rc==SQLITE_OK && zMaster[0] ){ + rc = sqlite3OsAccess(pVfs, zMaster, SQLITE_ACCESS_EXISTS, &res); + } + zMaster = 0; + if( rc!=SQLITE_OK || !res ){ + goto end_playback; + } + pPager->journalOff = 0; + needPagerReset = isHot; + + /* This loop terminates either when a readJournalHdr() or + ** pager_playback_one_page() call returns SQLITE_DONE or an IO error + ** occurs. + */ + while( 1 ){ + /* Read the next journal header from the journal file. If there are + ** not enough bytes left in the journal file for a complete header, or + ** it is corrupted, then a process must have failed while writing it. + ** This indicates nothing more needs to be rolled back. + */ + rc = readJournalHdr(pPager, isHot, szJ, &nRec, &mxPg); + if( rc!=SQLITE_OK ){ + if( rc==SQLITE_DONE ){ + rc = SQLITE_OK; + } + goto end_playback; + } + + /* If nRec is 0xffffffff, then this journal was created by a process + ** working in no-sync mode. This means that the rest of the journal + ** file consists of pages, there are no more journal headers. Compute + ** the value of nRec based on this assumption. + */ + if( nRec==0xffffffff ){ + assert( pPager->journalOff==JOURNAL_HDR_SZ(pPager) ); + nRec = (int)((szJ - JOURNAL_HDR_SZ(pPager))/JOURNAL_PG_SZ(pPager)); + } + + /* If nRec is 0 and this rollback is of a transaction created by this + ** process and if this is the final header in the journal, then it means + ** that this part of the journal was being filled but has not yet been + ** synced to disk. Compute the number of pages based on the remaining + ** size of the file. + ** + ** The third term of the test was added to fix ticket #2565. + ** When rolling back a hot journal, nRec==0 always means that the next + ** chunk of the journal contains zero pages to be rolled back. But + ** when doing a ROLLBACK and the nRec==0 chunk is the last chunk in + ** the journal, it means that the journal might contain additional + ** pages that need to be rolled back and that the number of pages + ** should be computed based on the journal file size. + */ + if( nRec==0 && !isHot && + pPager->journalHdr+JOURNAL_HDR_SZ(pPager)==pPager->journalOff ){ + nRec = (int)((szJ - pPager->journalOff) / JOURNAL_PG_SZ(pPager)); + } + + /* If this is the first header read from the journal, truncate the + ** database file back to its original size. + */ + if( pPager->journalOff==JOURNAL_HDR_SZ(pPager) ){ + rc = pager_truncate(pPager, mxPg); + if( rc!=SQLITE_OK ){ + goto end_playback; + } + pPager->dbSize = mxPg; + } + + /* Copy original pages out of the journal and back into the + ** database file and/or page cache. + */ + for(u=0; ujournalOff,0,1,0); + if( rc==SQLITE_OK ){ + nPlayback++; + }else{ + if( rc==SQLITE_DONE ){ + pPager->journalOff = szJ; + break; + }else if( rc==SQLITE_IOERR_SHORT_READ ){ + /* If the journal has been truncated, simply stop reading and + ** processing the journal. This might happen if the journal was + ** not completely written and synced prior to a crash. In that + ** case, the database should have never been written in the + ** first place so it is OK to simply abandon the rollback. */ + rc = SQLITE_OK; + goto end_playback; + }else{ + /* If we are unable to rollback, quit and return the error + ** code. This will cause the pager to enter the error state + ** so that no further harm will be done. Perhaps the next + ** process to come along will be able to rollback the database. + */ + goto end_playback; + } + } + } + } + /*NOTREACHED*/ + assert( 0 ); + +end_playback: + /* Following a rollback, the database file should be back in its original + ** state prior to the start of the transaction, so invoke the + ** SQLITE_FCNTL_DB_UNCHANGED file-control method to disable the + ** assertion that the transaction counter was modified. + */ +#ifdef SQLITE_DEBUG + if( pPager->fd->pMethods ){ + sqlite3OsFileControlHint(pPager->fd,SQLITE_FCNTL_DB_UNCHANGED,0); + } +#endif + + /* If this playback is happening automatically as a result of an IO or + ** malloc error that occurred after the change-counter was updated but + ** before the transaction was committed, then the change-counter + ** modification may just have been reverted. If this happens in exclusive + ** mode, then subsequent transactions performed by the connection will not + ** update the change-counter at all. This may lead to cache inconsistency + ** problems for other processes at some point in the future. So, just + ** in case this has happened, clear the changeCountDone flag now. + */ + pPager->changeCountDone = pPager->tempFile; + + if( rc==SQLITE_OK ){ + zMaster = pPager->pTmpSpace; + rc = readMasterJournal(pPager->jfd, zMaster, pPager->pVfs->mxPathname+1); + testcase( rc!=SQLITE_OK ); + } + if( rc==SQLITE_OK + && (pPager->eState>=PAGER_WRITER_DBMOD || pPager->eState==PAGER_OPEN) + ){ + rc = sqlite3PagerSync(pPager, 0); + } + if( rc==SQLITE_OK ){ + rc = pager_end_transaction(pPager, zMaster[0]!='\0', 0); + testcase( rc!=SQLITE_OK ); + } + if( rc==SQLITE_OK && zMaster[0] && res ){ + /* If there was a master journal and this routine will return success, + ** see if it is possible to delete the master journal. + */ + rc = pager_delmaster(pPager, zMaster); + testcase( rc!=SQLITE_OK ); + } + if( isHot && nPlayback ){ + sqlite3_log(SQLITE_NOTICE_RECOVER_ROLLBACK, "recovered %d pages from %s", + nPlayback, pPager->zJournal); + } + + /* The Pager.sectorSize variable may have been updated while rolling + ** back a journal created by a process with a different sector size + ** value. Reset it to the correct value for this process. + */ + setSectorSize(pPager); + return rc; +} + + +/* +** Read the content for page pPg out of the database file and into +** pPg->pData. A shared lock or greater must be held on the database +** file before this function is called. +** +** If page 1 is read, then the value of Pager.dbFileVers[] is set to +** the value read from the database file. +** +** If an IO error occurs, then the IO error is returned to the caller. +** Otherwise, SQLITE_OK is returned. +*/ +static int readDbPage(PgHdr *pPg, u32 iFrame){ + Pager *pPager = pPg->pPager; /* Pager object associated with page pPg */ + Pgno pgno = pPg->pgno; /* Page number to read */ + int rc = SQLITE_OK; /* Return code */ + int pgsz = pPager->pageSize; /* Number of bytes to read */ + + assert( pPager->eState>=PAGER_READER && !MEMDB ); + assert( isOpen(pPager->fd) ); + +#ifndef SQLITE_OMIT_WAL + if( iFrame ){ + /* Try to pull the page from the write-ahead log. */ + rc = sqlite3WalReadFrame(pPager->pWal, iFrame, pgsz, pPg->pData); + }else +#endif + { + i64 iOffset = (pgno-1)*(i64)pPager->pageSize; + rc = sqlite3OsRead(pPager->fd, pPg->pData, pgsz, iOffset); + if( rc==SQLITE_IOERR_SHORT_READ ){ + rc = SQLITE_OK; + } + } + + if( pgno==1 ){ + if( rc ){ + /* If the read is unsuccessful, set the dbFileVers[] to something + ** that will never be a valid file version. dbFileVers[] is a copy + ** of bytes 24..39 of the database. Bytes 28..31 should always be + ** zero or the size of the database in page. Bytes 32..35 and 35..39 + ** should be page numbers which are never 0xffffffff. So filling + ** pPager->dbFileVers[] with all 0xff bytes should suffice. + ** + ** For an encrypted database, the situation is more complex: bytes + ** 24..39 of the database are white noise. But the probability of + ** white noise equaling 16 bytes of 0xff is vanishingly small so + ** we should still be ok. + */ + memset(pPager->dbFileVers, 0xff, sizeof(pPager->dbFileVers)); + }else{ + u8 *dbFileVers = &((u8*)pPg->pData)[24]; + memcpy(&pPager->dbFileVers, dbFileVers, sizeof(pPager->dbFileVers)); + } + } + CODEC1(pPager, pPg->pData, pgno, 3, rc = SQLITE_NOMEM_BKPT); + + PAGER_INCR(sqlite3_pager_readdb_count); + PAGER_INCR(pPager->nRead); + IOTRACE(("PGIN %p %d\n", pPager, pgno)); + PAGERTRACE(("FETCH %d page %d hash(%08x)\n", + PAGERID(pPager), pgno, pager_pagehash(pPg))); + + return rc; +} + +/* +** Update the value of the change-counter at offsets 24 and 92 in +** the header and the sqlite version number at offset 96. +** +** This is an unconditional update. See also the pager_incr_changecounter() +** routine which only updates the change-counter if the update is actually +** needed, as determined by the pPager->changeCountDone state variable. +*/ +static void pager_write_changecounter(PgHdr *pPg){ + u32 change_counter; + + /* Increment the value just read and write it back to byte 24. */ + change_counter = sqlite3Get4byte((u8*)pPg->pPager->dbFileVers)+1; + put32bits(((char*)pPg->pData)+24, change_counter); + + /* Also store the SQLite version number in bytes 96..99 and in + ** bytes 92..95 store the change counter for which the version number + ** is valid. */ + put32bits(((char*)pPg->pData)+92, change_counter); + put32bits(((char*)pPg->pData)+96, SQLITE_VERSION_NUMBER); +} + +#ifndef SQLITE_OMIT_WAL +/* +** This function is invoked once for each page that has already been +** written into the log file when a WAL transaction is rolled back. +** Parameter iPg is the page number of said page. The pCtx argument +** is actually a pointer to the Pager structure. +** +** If page iPg is present in the cache, and has no outstanding references, +** it is discarded. Otherwise, if there are one or more outstanding +** references, the page content is reloaded from the database. If the +** attempt to reload content from the database is required and fails, +** return an SQLite error code. Otherwise, SQLITE_OK. +*/ +static int pagerUndoCallback(void *pCtx, Pgno iPg){ + int rc = SQLITE_OK; + Pager *pPager = (Pager *)pCtx; + PgHdr *pPg; + + assert( pagerUseWal(pPager) ); + pPg = sqlite3PagerLookup(pPager, iPg); + if( pPg ){ + if( sqlite3PcachePageRefcount(pPg)==1 ){ + sqlite3PcacheDrop(pPg); + }else{ + u32 iFrame = 0; + rc = sqlite3WalFindFrame(pPager->pWal, pPg->pgno, &iFrame); + if( rc==SQLITE_OK ){ + rc = readDbPage(pPg, iFrame); + } + if( rc==SQLITE_OK ){ + pPager->xReiniter(pPg); + } + sqlite3PagerUnrefNotNull(pPg); + } + } + + /* Normally, if a transaction is rolled back, any backup processes are + ** updated as data is copied out of the rollback journal and into the + ** database. This is not generally possible with a WAL database, as + ** rollback involves simply truncating the log file. Therefore, if one + ** or more frames have already been written to the log (and therefore + ** also copied into the backup databases) as part of this transaction, + ** the backups must be restarted. + */ + sqlite3BackupRestart(pPager->pBackup); + + return rc; +} + +/* +** This function is called to rollback a transaction on a WAL database. +*/ +static int pagerRollbackWal(Pager *pPager){ + int rc; /* Return Code */ + PgHdr *pList; /* List of dirty pages to revert */ + + /* For all pages in the cache that are currently dirty or have already + ** been written (but not committed) to the log file, do one of the + ** following: + ** + ** + Discard the cached page (if refcount==0), or + ** + Reload page content from the database (if refcount>0). + */ + pPager->dbSize = pPager->dbOrigSize; + rc = sqlite3WalUndo(pPager->pWal, pagerUndoCallback, (void *)pPager); + pList = sqlite3PcacheDirtyList(pPager->pPCache); + while( pList && rc==SQLITE_OK ){ + PgHdr *pNext = pList->pDirty; + rc = pagerUndoCallback((void *)pPager, pList->pgno); + pList = pNext; + } + + return rc; +} + +/* +** This function is a wrapper around sqlite3WalFrames(). As well as logging +** the contents of the list of pages headed by pList (connected by pDirty), +** this function notifies any active backup processes that the pages have +** changed. +** +** The list of pages passed into this routine is always sorted by page number. +** Hence, if page 1 appears anywhere on the list, it will be the first page. +*/ +static int pagerWalFrames( + Pager *pPager, /* Pager object */ + PgHdr *pList, /* List of frames to log */ + Pgno nTruncate, /* Database size after this commit */ + int isCommit /* True if this is a commit */ +){ + int rc; /* Return code */ + int nList; /* Number of pages in pList */ + PgHdr *p; /* For looping over pages */ + + assert( pPager->pWal ); + assert( pList ); +#ifdef SQLITE_DEBUG + /* Verify that the page list is in accending order */ + for(p=pList; p && p->pDirty; p=p->pDirty){ + assert( p->pgno < p->pDirty->pgno ); + } +#endif + + assert( pList->pDirty==0 || isCommit ); + if( isCommit ){ + /* If a WAL transaction is being committed, there is no point in writing + ** any pages with page numbers greater than nTruncate into the WAL file. + ** They will never be read by any client. So remove them from the pDirty + ** list here. */ + PgHdr **ppNext = &pList; + nList = 0; + for(p=pList; (*ppNext = p)!=0; p=p->pDirty){ + if( p->pgno<=nTruncate ){ + ppNext = &p->pDirty; + nList++; + } + } + assert( pList ); + }else{ + nList = 1; + } + pPager->aStat[PAGER_STAT_WRITE] += nList; + + if( pList->pgno==1 ) pager_write_changecounter(pList); + rc = sqlite3WalFrames(pPager->pWal, + pPager->pageSize, pList, nTruncate, isCommit, pPager->walSyncFlags + ); + if( rc==SQLITE_OK && pPager->pBackup ){ + for(p=pList; p; p=p->pDirty){ + sqlite3BackupUpdate(pPager->pBackup, p->pgno, (u8 *)p->pData); + } + } + +#ifdef SQLITE_CHECK_PAGES + pList = sqlite3PcacheDirtyList(pPager->pPCache); + for(p=pList; p; p=p->pDirty){ + pager_set_pagehash(p); + } +#endif + + return rc; +} + +/* +** Begin a read transaction on the WAL. +** +** This routine used to be called "pagerOpenSnapshot()" because it essentially +** makes a snapshot of the database at the current point in time and preserves +** that snapshot for use by the reader in spite of concurrently changes by +** other writers or checkpointers. +*/ +static int pagerBeginReadTransaction(Pager *pPager){ + int rc; /* Return code */ + int changed = 0; /* True if cache must be reset */ + + assert( pagerUseWal(pPager) ); + assert( pPager->eState==PAGER_OPEN || pPager->eState==PAGER_READER ); + + /* sqlite3WalEndReadTransaction() was not called for the previous + ** transaction in locking_mode=EXCLUSIVE. So call it now. If we + ** are in locking_mode=NORMAL and EndRead() was previously called, + ** the duplicate call is harmless. + */ + sqlite3WalEndReadTransaction(pPager->pWal); + + rc = sqlite3WalBeginReadTransaction(pPager->pWal, &changed); + if( rc!=SQLITE_OK || changed ){ + pager_reset(pPager); + if( USEFETCH(pPager) ) sqlite3OsUnfetch(pPager->fd, 0, 0); + } + + return rc; +} +#endif + +/* +** This function is called as part of the transition from PAGER_OPEN +** to PAGER_READER state to determine the size of the database file +** in pages (assuming the page size currently stored in Pager.pageSize). +** +** If no error occurs, SQLITE_OK is returned and the size of the database +** in pages is stored in *pnPage. Otherwise, an error code (perhaps +** SQLITE_IOERR_FSTAT) is returned and *pnPage is left unmodified. +*/ +static int pagerPagecount(Pager *pPager, Pgno *pnPage){ + Pgno nPage; /* Value to return via *pnPage */ + + /* Query the WAL sub-system for the database size. The WalDbsize() + ** function returns zero if the WAL is not open (i.e. Pager.pWal==0), or + ** if the database size is not available. The database size is not + ** available from the WAL sub-system if the log file is empty or + ** contains no valid committed transactions. + */ + assert( pPager->eState==PAGER_OPEN ); + assert( pPager->eLock>=SHARED_LOCK ); + assert( isOpen(pPager->fd) ); + assert( pPager->tempFile==0 ); + nPage = sqlite3WalDbsize(pPager->pWal); + + /* If the number of pages in the database is not available from the + ** WAL sub-system, determine the page counte based on the size of + ** the database file. If the size of the database file is not an + ** integer multiple of the page-size, round up the result. + */ + if( nPage==0 && ALWAYS(isOpen(pPager->fd)) ){ + i64 n = 0; /* Size of db file in bytes */ + int rc = sqlite3OsFileSize(pPager->fd, &n); + if( rc!=SQLITE_OK ){ + return rc; + } + nPage = (Pgno)((n+pPager->pageSize-1) / pPager->pageSize); + } + + /* If the current number of pages in the file is greater than the + ** configured maximum pager number, increase the allowed limit so + ** that the file can be read. + */ + if( nPage>pPager->mxPgno ){ + pPager->mxPgno = (Pgno)nPage; + } + + *pnPage = nPage; + return SQLITE_OK; +} + +#ifndef SQLITE_OMIT_WAL +/* +** Check if the *-wal file that corresponds to the database opened by pPager +** exists if the database is not empy, or verify that the *-wal file does +** not exist (by deleting it) if the database file is empty. +** +** If the database is not empty and the *-wal file exists, open the pager +** in WAL mode. If the database is empty or if no *-wal file exists and +** if no error occurs, make sure Pager.journalMode is not set to +** PAGER_JOURNALMODE_WAL. +** +** Return SQLITE_OK or an error code. +** +** The caller must hold a SHARED lock on the database file to call this +** function. Because an EXCLUSIVE lock on the db file is required to delete +** a WAL on a none-empty database, this ensures there is no race condition +** between the xAccess() below and an xDelete() being executed by some +** other connection. +*/ +static int pagerOpenWalIfPresent(Pager *pPager){ + int rc = SQLITE_OK; + assert( pPager->eState==PAGER_OPEN ); + assert( pPager->eLock>=SHARED_LOCK ); + + if( !pPager->tempFile ){ + int isWal; /* True if WAL file exists */ + Pgno nPage; /* Size of the database file */ + + rc = pagerPagecount(pPager, &nPage); + if( rc ) return rc; + if( nPage==0 ){ + rc = sqlite3OsDelete(pPager->pVfs, pPager->zWal, 0); + if( rc==SQLITE_IOERR_DELETE_NOENT ) rc = SQLITE_OK; + isWal = 0; + }else{ + rc = sqlite3OsAccess( + pPager->pVfs, pPager->zWal, SQLITE_ACCESS_EXISTS, &isWal + ); + } + if( rc==SQLITE_OK ){ + if( isWal ){ + testcase( sqlite3PcachePagecount(pPager->pPCache)==0 ); + rc = sqlite3PagerOpenWal(pPager, 0); + }else if( pPager->journalMode==PAGER_JOURNALMODE_WAL ){ + pPager->journalMode = PAGER_JOURNALMODE_DELETE; + } + } + } + return rc; +} +#endif + +/* +** Playback savepoint pSavepoint. Or, if pSavepoint==NULL, then playback +** the entire master journal file. The case pSavepoint==NULL occurs when +** a ROLLBACK TO command is invoked on a SAVEPOINT that is a transaction +** savepoint. +** +** When pSavepoint is not NULL (meaning a non-transaction savepoint is +** being rolled back), then the rollback consists of up to three stages, +** performed in the order specified: +** +** * Pages are played back from the main journal starting at byte +** offset PagerSavepoint.iOffset and continuing to +** PagerSavepoint.iHdrOffset, or to the end of the main journal +** file if PagerSavepoint.iHdrOffset is zero. +** +** * If PagerSavepoint.iHdrOffset is not zero, then pages are played +** back starting from the journal header immediately following +** PagerSavepoint.iHdrOffset to the end of the main journal file. +** +** * Pages are then played back from the sub-journal file, starting +** with the PagerSavepoint.iSubRec and continuing to the end of +** the journal file. +** +** Throughout the rollback process, each time a page is rolled back, the +** corresponding bit is set in a bitvec structure (variable pDone in the +** implementation below). This is used to ensure that a page is only +** rolled back the first time it is encountered in either journal. +** +** If pSavepoint is NULL, then pages are only played back from the main +** journal file. There is no need for a bitvec in this case. +** +** In either case, before playback commences the Pager.dbSize variable +** is reset to the value that it held at the start of the savepoint +** (or transaction). No page with a page-number greater than this value +** is played back. If one is encountered it is simply skipped. +*/ +static int pagerPlaybackSavepoint(Pager *pPager, PagerSavepoint *pSavepoint){ + i64 szJ; /* Effective size of the main journal */ + i64 iHdrOff; /* End of first segment of main-journal records */ + int rc = SQLITE_OK; /* Return code */ + Bitvec *pDone = 0; /* Bitvec to ensure pages played back only once */ + + assert( pPager->eState!=PAGER_ERROR ); + assert( pPager->eState>=PAGER_WRITER_LOCKED ); + + /* Allocate a bitvec to use to store the set of pages rolled back */ + if( pSavepoint ){ + pDone = sqlite3BitvecCreate(pSavepoint->nOrig); + if( !pDone ){ + return SQLITE_NOMEM_BKPT; + } + } + + /* Set the database size back to the value it was before the savepoint + ** being reverted was opened. + */ + pPager->dbSize = pSavepoint ? pSavepoint->nOrig : pPager->dbOrigSize; + pPager->changeCountDone = pPager->tempFile; + + if( !pSavepoint && pagerUseWal(pPager) ){ + return pagerRollbackWal(pPager); + } + + /* Use pPager->journalOff as the effective size of the main rollback + ** journal. The actual file might be larger than this in + ** PAGER_JOURNALMODE_TRUNCATE or PAGER_JOURNALMODE_PERSIST. But anything + ** past pPager->journalOff is off-limits to us. + */ + szJ = pPager->journalOff; + assert( pagerUseWal(pPager)==0 || szJ==0 ); + + /* Begin by rolling back records from the main journal starting at + ** PagerSavepoint.iOffset and continuing to the next journal header. + ** There might be records in the main journal that have a page number + ** greater than the current database size (pPager->dbSize) but those + ** will be skipped automatically. Pages are added to pDone as they + ** are played back. + */ + if( pSavepoint && !pagerUseWal(pPager) ){ + iHdrOff = pSavepoint->iHdrOffset ? pSavepoint->iHdrOffset : szJ; + pPager->journalOff = pSavepoint->iOffset; + while( rc==SQLITE_OK && pPager->journalOffjournalOff, pDone, 1, 1); + } + assert( rc!=SQLITE_DONE ); + }else{ + pPager->journalOff = 0; + } + + /* Continue rolling back records out of the main journal starting at + ** the first journal header seen and continuing until the effective end + ** of the main journal file. Continue to skip out-of-range pages and + ** continue adding pages rolled back to pDone. + */ + while( rc==SQLITE_OK && pPager->journalOffjournalHdr+JOURNAL_HDR_SZ(pPager)==pPager->journalOff" + ** test is related to ticket #2565. See the discussion in the + ** pager_playback() function for additional information. + */ + if( nJRec==0 + && pPager->journalHdr+JOURNAL_HDR_SZ(pPager)==pPager->journalOff + ){ + nJRec = (u32)((szJ - pPager->journalOff)/JOURNAL_PG_SZ(pPager)); + } + for(ii=0; rc==SQLITE_OK && iijournalOffjournalOff, pDone, 1, 1); + } + assert( rc!=SQLITE_DONE ); + } + assert( rc!=SQLITE_OK || pPager->journalOff>=szJ ); + + /* Finally, rollback pages from the sub-journal. Page that were + ** previously rolled back out of the main journal (and are hence in pDone) + ** will be skipped. Out-of-range pages are also skipped. + */ + if( pSavepoint ){ + u32 ii; /* Loop counter */ + i64 offset = (i64)pSavepoint->iSubRec*(4+pPager->pageSize); + + if( pagerUseWal(pPager) ){ + rc = sqlite3WalSavepointUndo(pPager->pWal, pSavepoint->aWalData); + } + for(ii=pSavepoint->iSubRec; rc==SQLITE_OK && iinSubRec; ii++){ + assert( offset==(i64)ii*(4+pPager->pageSize) ); + rc = pager_playback_one_page(pPager, &offset, pDone, 0, 1); + } + assert( rc!=SQLITE_DONE ); + } + + sqlite3BitvecDestroy(pDone); + if( rc==SQLITE_OK ){ + pPager->journalOff = szJ; + } + + return rc; +} + +/* +** Change the maximum number of in-memory pages that are allowed +** before attempting to recycle clean and unused pages. +*/ +SQLITE_PRIVATE void sqlite3PagerSetCachesize(Pager *pPager, int mxPage){ + sqlite3PcacheSetCachesize(pPager->pPCache, mxPage); +} + +/* +** Change the maximum number of in-memory pages that are allowed +** before attempting to spill pages to journal. +*/ +SQLITE_PRIVATE int sqlite3PagerSetSpillsize(Pager *pPager, int mxPage){ + return sqlite3PcacheSetSpillsize(pPager->pPCache, mxPage); +} + +/* +** Invoke SQLITE_FCNTL_MMAP_SIZE based on the current value of szMmap. +*/ +static void pagerFixMaplimit(Pager *pPager){ +#if SQLITE_MAX_MMAP_SIZE>0 + sqlite3_file *fd = pPager->fd; + if( isOpen(fd) && fd->pMethods->iVersion>=3 ){ + sqlite3_int64 sz; + sz = pPager->szMmap; + pPager->bUseFetch = (sz>0); + sqlite3OsFileControlHint(pPager->fd, SQLITE_FCNTL_MMAP_SIZE, &sz); + } +#endif +} + +/* +** Change the maximum size of any memory mapping made of the database file. +*/ +SQLITE_PRIVATE void sqlite3PagerSetMmapLimit(Pager *pPager, sqlite3_int64 szMmap){ + pPager->szMmap = szMmap; + pagerFixMaplimit(pPager); +} + +/* +** Free as much memory as possible from the pager. +*/ +SQLITE_PRIVATE void sqlite3PagerShrink(Pager *pPager){ + sqlite3PcacheShrink(pPager->pPCache); +} + +/* +** Adjust settings of the pager to those specified in the pgFlags parameter. +** +** The "level" in pgFlags & PAGER_SYNCHRONOUS_MASK sets the robustness +** of the database to damage due to OS crashes or power failures by +** changing the number of syncs()s when writing the journals. +** There are four levels: +** +** OFF sqlite3OsSync() is never called. This is the default +** for temporary and transient files. +** +** NORMAL The journal is synced once before writes begin on the +** database. This is normally adequate protection, but +** it is theoretically possible, though very unlikely, +** that an inopertune power failure could leave the journal +** in a state which would cause damage to the database +** when it is rolled back. +** +** FULL The journal is synced twice before writes begin on the +** database (with some additional information - the nRec field +** of the journal header - being written in between the two +** syncs). If we assume that writing a +** single disk sector is atomic, then this mode provides +** assurance that the journal will not be corrupted to the +** point of causing damage to the database during rollback. +** +** EXTRA This is like FULL except that is also syncs the directory +** that contains the rollback journal after the rollback +** journal is unlinked. +** +** The above is for a rollback-journal mode. For WAL mode, OFF continues +** to mean that no syncs ever occur. NORMAL means that the WAL is synced +** prior to the start of checkpoint and that the database file is synced +** at the conclusion of the checkpoint if the entire content of the WAL +** was written back into the database. But no sync operations occur for +** an ordinary commit in NORMAL mode with WAL. FULL means that the WAL +** file is synced following each commit operation, in addition to the +** syncs associated with NORMAL. There is no difference between FULL +** and EXTRA for WAL mode. +** +** Do not confuse synchronous=FULL with SQLITE_SYNC_FULL. The +** SQLITE_SYNC_FULL macro means to use the MacOSX-style full-fsync +** using fcntl(F_FULLFSYNC). SQLITE_SYNC_NORMAL means to do an +** ordinary fsync() call. There is no difference between SQLITE_SYNC_FULL +** and SQLITE_SYNC_NORMAL on platforms other than MacOSX. But the +** synchronous=FULL versus synchronous=NORMAL setting determines when +** the xSync primitive is called and is relevant to all platforms. +** +** Numeric values associated with these states are OFF==1, NORMAL=2, +** and FULL=3. +*/ +#ifndef SQLITE_OMIT_PAGER_PRAGMAS +SQLITE_PRIVATE void sqlite3PagerSetFlags( + Pager *pPager, /* The pager to set safety level for */ + unsigned pgFlags /* Various flags */ +){ + unsigned level = pgFlags & PAGER_SYNCHRONOUS_MASK; + if( pPager->tempFile ){ + pPager->noSync = 1; + pPager->fullSync = 0; + pPager->extraSync = 0; + }else{ + pPager->noSync = level==PAGER_SYNCHRONOUS_OFF ?1:0; + pPager->fullSync = level>=PAGER_SYNCHRONOUS_FULL ?1:0; + pPager->extraSync = level==PAGER_SYNCHRONOUS_EXTRA ?1:0; + } + if( pPager->noSync ){ + pPager->syncFlags = 0; + pPager->ckptSyncFlags = 0; + }else if( pgFlags & PAGER_FULLFSYNC ){ + pPager->syncFlags = SQLITE_SYNC_FULL; + pPager->ckptSyncFlags = SQLITE_SYNC_FULL; + }else if( pgFlags & PAGER_CKPT_FULLFSYNC ){ + pPager->syncFlags = SQLITE_SYNC_NORMAL; + pPager->ckptSyncFlags = SQLITE_SYNC_FULL; + }else{ + pPager->syncFlags = SQLITE_SYNC_NORMAL; + pPager->ckptSyncFlags = SQLITE_SYNC_NORMAL; + } + pPager->walSyncFlags = pPager->syncFlags; + if( pPager->fullSync ){ + pPager->walSyncFlags |= WAL_SYNC_TRANSACTIONS; + } + if( pgFlags & PAGER_CACHESPILL ){ + pPager->doNotSpill &= ~SPILLFLAG_OFF; + }else{ + pPager->doNotSpill |= SPILLFLAG_OFF; + } +} +#endif + +/* +** The following global variable is incremented whenever the library +** attempts to open a temporary file. This information is used for +** testing and analysis only. +*/ +#ifdef SQLITE_TEST +SQLITE_API int sqlite3_opentemp_count = 0; +#endif + +/* +** Open a temporary file. +** +** Write the file descriptor into *pFile. Return SQLITE_OK on success +** or some other error code if we fail. The OS will automatically +** delete the temporary file when it is closed. +** +** The flags passed to the VFS layer xOpen() call are those specified +** by parameter vfsFlags ORed with the following: +** +** SQLITE_OPEN_READWRITE +** SQLITE_OPEN_CREATE +** SQLITE_OPEN_EXCLUSIVE +** SQLITE_OPEN_DELETEONCLOSE +*/ +static int pagerOpentemp( + Pager *pPager, /* The pager object */ + sqlite3_file *pFile, /* Write the file descriptor here */ + int vfsFlags /* Flags passed through to the VFS */ +){ + int rc; /* Return code */ + +#ifdef SQLITE_TEST + sqlite3_opentemp_count++; /* Used for testing and analysis only */ +#endif + + vfsFlags |= SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | + SQLITE_OPEN_EXCLUSIVE | SQLITE_OPEN_DELETEONCLOSE; + rc = sqlite3OsOpen(pPager->pVfs, 0, pFile, vfsFlags, 0); + assert( rc!=SQLITE_OK || isOpen(pFile) ); + return rc; +} + +/* +** Set the busy handler function. +** +** The pager invokes the busy-handler if sqlite3OsLock() returns +** SQLITE_BUSY when trying to upgrade from no-lock to a SHARED lock, +** or when trying to upgrade from a RESERVED lock to an EXCLUSIVE +** lock. It does *not* invoke the busy handler when upgrading from +** SHARED to RESERVED, or when upgrading from SHARED to EXCLUSIVE +** (which occurs during hot-journal rollback). Summary: +** +** Transition | Invokes xBusyHandler +** -------------------------------------------------------- +** NO_LOCK -> SHARED_LOCK | Yes +** SHARED_LOCK -> RESERVED_LOCK | No +** SHARED_LOCK -> EXCLUSIVE_LOCK | No +** RESERVED_LOCK -> EXCLUSIVE_LOCK | Yes +** +** If the busy-handler callback returns non-zero, the lock is +** retried. If it returns zero, then the SQLITE_BUSY error is +** returned to the caller of the pager API function. +*/ +SQLITE_PRIVATE void sqlite3PagerSetBusyhandler( + Pager *pPager, /* Pager object */ + int (*xBusyHandler)(void *), /* Pointer to busy-handler function */ + void *pBusyHandlerArg /* Argument to pass to xBusyHandler */ +){ + pPager->xBusyHandler = xBusyHandler; + pPager->pBusyHandlerArg = pBusyHandlerArg; + + if( isOpen(pPager->fd) ){ + void **ap = (void **)&pPager->xBusyHandler; + assert( ((int(*)(void *))(ap[0]))==xBusyHandler ); + assert( ap[1]==pBusyHandlerArg ); + sqlite3OsFileControlHint(pPager->fd, SQLITE_FCNTL_BUSYHANDLER, (void *)ap); + } +} + +/* +** Change the page size used by the Pager object. The new page size +** is passed in *pPageSize. +** +** If the pager is in the error state when this function is called, it +** is a no-op. The value returned is the error state error code (i.e. +** one of SQLITE_IOERR, an SQLITE_IOERR_xxx sub-code or SQLITE_FULL). +** +** Otherwise, if all of the following are true: +** +** * the new page size (value of *pPageSize) is valid (a power +** of two between 512 and SQLITE_MAX_PAGE_SIZE, inclusive), and +** +** * there are no outstanding page references, and +** +** * the database is either not an in-memory database or it is +** an in-memory database that currently consists of zero pages. +** +** then the pager object page size is set to *pPageSize. +** +** If the page size is changed, then this function uses sqlite3PagerMalloc() +** to obtain a new Pager.pTmpSpace buffer. If this allocation attempt +** fails, SQLITE_NOMEM is returned and the page size remains unchanged. +** In all other cases, SQLITE_OK is returned. +** +** If the page size is not changed, either because one of the enumerated +** conditions above is not true, the pager was in error state when this +** function was called, or because the memory allocation attempt failed, +** then *pPageSize is set to the old, retained page size before returning. +*/ +SQLITE_PRIVATE int sqlite3PagerSetPagesize(Pager *pPager, u32 *pPageSize, int nReserve){ + int rc = SQLITE_OK; + + /* It is not possible to do a full assert_pager_state() here, as this + ** function may be called from within PagerOpen(), before the state + ** of the Pager object is internally consistent. + ** + ** At one point this function returned an error if the pager was in + ** PAGER_ERROR state. But since PAGER_ERROR state guarantees that + ** there is at least one outstanding page reference, this function + ** is a no-op for that case anyhow. + */ + + u32 pageSize = *pPageSize; + assert( pageSize==0 || (pageSize>=512 && pageSize<=SQLITE_MAX_PAGE_SIZE) ); + if( (pPager->memDb==0 || pPager->dbSize==0) + && sqlite3PcacheRefCount(pPager->pPCache)==0 + && pageSize && pageSize!=(u32)pPager->pageSize + ){ + char *pNew = NULL; /* New temp space */ + i64 nByte = 0; + + if( pPager->eState>PAGER_OPEN && isOpen(pPager->fd) ){ + rc = sqlite3OsFileSize(pPager->fd, &nByte); + } + if( rc==SQLITE_OK ){ + pNew = (char *)sqlite3PageMalloc(pageSize); + if( !pNew ) rc = SQLITE_NOMEM_BKPT; + } + + if( rc==SQLITE_OK ){ + pager_reset(pPager); + rc = sqlite3PcacheSetPageSize(pPager->pPCache, pageSize); + } + if( rc==SQLITE_OK ){ + sqlite3PageFree(pPager->pTmpSpace); + pPager->pTmpSpace = pNew; + pPager->dbSize = (Pgno)((nByte+pageSize-1)/pageSize); + pPager->pageSize = pageSize; + }else{ + sqlite3PageFree(pNew); + } + } + + *pPageSize = pPager->pageSize; + if( rc==SQLITE_OK ){ + if( nReserve<0 ) nReserve = pPager->nReserve; + assert( nReserve>=0 && nReserve<1000 ); + pPager->nReserve = (i16)nReserve; + pagerReportSize(pPager); + pagerFixMaplimit(pPager); + } + return rc; +} + +/* +** Return a pointer to the "temporary page" buffer held internally +** by the pager. This is a buffer that is big enough to hold the +** entire content of a database page. This buffer is used internally +** during rollback and will be overwritten whenever a rollback +** occurs. But other modules are free to use it too, as long as +** no rollbacks are happening. +*/ +SQLITE_PRIVATE void *sqlite3PagerTempSpace(Pager *pPager){ + return pPager->pTmpSpace; +} + +/* +** Attempt to set the maximum database page count if mxPage is positive. +** Make no changes if mxPage is zero or negative. And never reduce the +** maximum page count below the current size of the database. +** +** Regardless of mxPage, return the current maximum page count. +*/ +SQLITE_PRIVATE int sqlite3PagerMaxPageCount(Pager *pPager, int mxPage){ + if( mxPage>0 ){ + pPager->mxPgno = mxPage; + } + assert( pPager->eState!=PAGER_OPEN ); /* Called only by OP_MaxPgcnt */ + assert( pPager->mxPgno>=pPager->dbSize ); /* OP_MaxPgcnt enforces this */ + return pPager->mxPgno; +} + +/* +** The following set of routines are used to disable the simulated +** I/O error mechanism. These routines are used to avoid simulated +** errors in places where we do not care about errors. +** +** Unless -DSQLITE_TEST=1 is used, these routines are all no-ops +** and generate no code. +*/ +#ifdef SQLITE_TEST +SQLITE_API extern int sqlite3_io_error_pending; +SQLITE_API extern int sqlite3_io_error_hit; +static int saved_cnt; +void disable_simulated_io_errors(void){ + saved_cnt = sqlite3_io_error_pending; + sqlite3_io_error_pending = -1; +} +void enable_simulated_io_errors(void){ + sqlite3_io_error_pending = saved_cnt; +} +#else +# define disable_simulated_io_errors() +# define enable_simulated_io_errors() +#endif + +/* +** Read the first N bytes from the beginning of the file into memory +** that pDest points to. +** +** If the pager was opened on a transient file (zFilename==""), or +** opened on a file less than N bytes in size, the output buffer is +** zeroed and SQLITE_OK returned. The rationale for this is that this +** function is used to read database headers, and a new transient or +** zero sized database has a header than consists entirely of zeroes. +** +** If any IO error apart from SQLITE_IOERR_SHORT_READ is encountered, +** the error code is returned to the caller and the contents of the +** output buffer undefined. +*/ +SQLITE_PRIVATE int sqlite3PagerReadFileheader(Pager *pPager, int N, unsigned char *pDest){ + int rc = SQLITE_OK; + memset(pDest, 0, N); + assert( isOpen(pPager->fd) || pPager->tempFile ); + + /* This routine is only called by btree immediately after creating + ** the Pager object. There has not been an opportunity to transition + ** to WAL mode yet. + */ + assert( !pagerUseWal(pPager) ); + + if( isOpen(pPager->fd) ){ + IOTRACE(("DBHDR %p 0 %d\n", pPager, N)) + rc = sqlite3OsRead(pPager->fd, pDest, N, 0); + if( rc==SQLITE_IOERR_SHORT_READ ){ + rc = SQLITE_OK; + } + } + return rc; +} + +/* +** This function may only be called when a read-transaction is open on +** the pager. It returns the total number of pages in the database. +** +** However, if the file is between 1 and bytes in size, then +** this is considered a 1 page file. +*/ +SQLITE_PRIVATE void sqlite3PagerPagecount(Pager *pPager, int *pnPage){ + assert( pPager->eState>=PAGER_READER ); + assert( pPager->eState!=PAGER_WRITER_FINISHED ); + *pnPage = (int)pPager->dbSize; +} + + +/* +** Try to obtain a lock of type locktype on the database file. If +** a similar or greater lock is already held, this function is a no-op +** (returning SQLITE_OK immediately). +** +** Otherwise, attempt to obtain the lock using sqlite3OsLock(). Invoke +** the busy callback if the lock is currently not available. Repeat +** until the busy callback returns false or until the attempt to +** obtain the lock succeeds. +** +** Return SQLITE_OK on success and an error code if we cannot obtain +** the lock. If the lock is obtained successfully, set the Pager.state +** variable to locktype before returning. +*/ +static int pager_wait_on_lock(Pager *pPager, int locktype){ + int rc; /* Return code */ + + /* Check that this is either a no-op (because the requested lock is + ** already held), or one of the transitions that the busy-handler + ** may be invoked during, according to the comment above + ** sqlite3PagerSetBusyhandler(). + */ + assert( (pPager->eLock>=locktype) + || (pPager->eLock==NO_LOCK && locktype==SHARED_LOCK) + || (pPager->eLock==RESERVED_LOCK && locktype==EXCLUSIVE_LOCK) + ); + + do { + rc = pagerLockDb(pPager, locktype); + }while( rc==SQLITE_BUSY && pPager->xBusyHandler(pPager->pBusyHandlerArg) ); + return rc; +} + +/* +** Function assertTruncateConstraint(pPager) checks that one of the +** following is true for all dirty pages currently in the page-cache: +** +** a) The page number is less than or equal to the size of the +** current database image, in pages, OR +** +** b) if the page content were written at this time, it would not +** be necessary to write the current content out to the sub-journal +** (as determined by function subjRequiresPage()). +** +** If the condition asserted by this function were not true, and the +** dirty page were to be discarded from the cache via the pagerStress() +** routine, pagerStress() would not write the current page content to +** the database file. If a savepoint transaction were rolled back after +** this happened, the correct behavior would be to restore the current +** content of the page. However, since this content is not present in either +** the database file or the portion of the rollback journal and +** sub-journal rolled back the content could not be restored and the +** database image would become corrupt. It is therefore fortunate that +** this circumstance cannot arise. +*/ +#if defined(SQLITE_DEBUG) +static void assertTruncateConstraintCb(PgHdr *pPg){ + assert( pPg->flags&PGHDR_DIRTY ); + assert( !subjRequiresPage(pPg) || pPg->pgno<=pPg->pPager->dbSize ); +} +static void assertTruncateConstraint(Pager *pPager){ + sqlite3PcacheIterateDirty(pPager->pPCache, assertTruncateConstraintCb); +} +#else +# define assertTruncateConstraint(pPager) +#endif + +/* +** Truncate the in-memory database file image to nPage pages. This +** function does not actually modify the database file on disk. It +** just sets the internal state of the pager object so that the +** truncation will be done when the current transaction is committed. +** +** This function is only called right before committing a transaction. +** Once this function has been called, the transaction must either be +** rolled back or committed. It is not safe to call this function and +** then continue writing to the database. +*/ +SQLITE_PRIVATE void sqlite3PagerTruncateImage(Pager *pPager, Pgno nPage){ + assert( pPager->dbSize>=nPage ); + assert( pPager->eState>=PAGER_WRITER_CACHEMOD ); + pPager->dbSize = nPage; + + /* At one point the code here called assertTruncateConstraint() to + ** ensure that all pages being truncated away by this operation are, + ** if one or more savepoints are open, present in the savepoint + ** journal so that they can be restored if the savepoint is rolled + ** back. This is no longer necessary as this function is now only + ** called right before committing a transaction. So although the + ** Pager object may still have open savepoints (Pager.nSavepoint!=0), + ** they cannot be rolled back. So the assertTruncateConstraint() call + ** is no longer correct. */ +} + + +/* +** This function is called before attempting a hot-journal rollback. It +** syncs the journal file to disk, then sets pPager->journalHdr to the +** size of the journal file so that the pager_playback() routine knows +** that the entire journal file has been synced. +** +** Syncing a hot-journal to disk before attempting to roll it back ensures +** that if a power-failure occurs during the rollback, the process that +** attempts rollback following system recovery sees the same journal +** content as this process. +** +** If everything goes as planned, SQLITE_OK is returned. Otherwise, +** an SQLite error code. +*/ +static int pagerSyncHotJournal(Pager *pPager){ + int rc = SQLITE_OK; + if( !pPager->noSync ){ + rc = sqlite3OsSync(pPager->jfd, SQLITE_SYNC_NORMAL); + } + if( rc==SQLITE_OK ){ + rc = sqlite3OsFileSize(pPager->jfd, &pPager->journalHdr); + } + return rc; +} + +/* +** Obtain a reference to a memory mapped page object for page number pgno. +** The new object will use the pointer pData, obtained from xFetch(). +** If successful, set *ppPage to point to the new page reference +** and return SQLITE_OK. Otherwise, return an SQLite error code and set +** *ppPage to zero. +** +** Page references obtained by calling this function should be released +** by calling pagerReleaseMapPage(). +*/ +static int pagerAcquireMapPage( + Pager *pPager, /* Pager object */ + Pgno pgno, /* Page number */ + void *pData, /* xFetch()'d data for this page */ + PgHdr **ppPage /* OUT: Acquired page object */ +){ + PgHdr *p; /* Memory mapped page to return */ + + if( pPager->pMmapFreelist ){ + *ppPage = p = pPager->pMmapFreelist; + pPager->pMmapFreelist = p->pDirty; + p->pDirty = 0; + memset(p->pExtra, 0, pPager->nExtra); + }else{ + *ppPage = p = (PgHdr *)sqlite3MallocZero(sizeof(PgHdr) + pPager->nExtra); + if( p==0 ){ + sqlite3OsUnfetch(pPager->fd, (i64)(pgno-1) * pPager->pageSize, pData); + return SQLITE_NOMEM_BKPT; + } + p->pExtra = (void *)&p[1]; + p->flags = PGHDR_MMAP; + p->nRef = 1; + p->pPager = pPager; + } + + assert( p->pExtra==(void *)&p[1] ); + assert( p->pPage==0 ); + assert( p->flags==PGHDR_MMAP ); + assert( p->pPager==pPager ); + assert( p->nRef==1 ); + + p->pgno = pgno; + p->pData = pData; + pPager->nMmapOut++; + + return SQLITE_OK; +} + +/* +** Release a reference to page pPg. pPg must have been returned by an +** earlier call to pagerAcquireMapPage(). +*/ +static void pagerReleaseMapPage(PgHdr *pPg){ + Pager *pPager = pPg->pPager; + pPager->nMmapOut--; + pPg->pDirty = pPager->pMmapFreelist; + pPager->pMmapFreelist = pPg; + + assert( pPager->fd->pMethods->iVersion>=3 ); + sqlite3OsUnfetch(pPager->fd, (i64)(pPg->pgno-1)*pPager->pageSize, pPg->pData); +} + +/* +** Free all PgHdr objects stored in the Pager.pMmapFreelist list. +*/ +static void pagerFreeMapHdrs(Pager *pPager){ + PgHdr *p; + PgHdr *pNext; + for(p=pPager->pMmapFreelist; p; p=pNext){ + pNext = p->pDirty; + sqlite3_free(p); + } +} + + +/* +** Shutdown the page cache. Free all memory and close all files. +** +** If a transaction was in progress when this routine is called, that +** transaction is rolled back. All outstanding pages are invalidated +** and their memory is freed. Any attempt to use a page associated +** with this page cache after this function returns will likely +** result in a coredump. +** +** This function always succeeds. If a transaction is active an attempt +** is made to roll it back. If an error occurs during the rollback +** a hot journal may be left in the filesystem but no error is returned +** to the caller. +*/ +SQLITE_PRIVATE int sqlite3PagerClose(Pager *pPager){ + u8 *pTmp = (u8 *)pPager->pTmpSpace; + + assert( assert_pager_state(pPager) ); + disable_simulated_io_errors(); + sqlite3BeginBenignMalloc(); + pagerFreeMapHdrs(pPager); + /* pPager->errCode = 0; */ + pPager->exclusiveMode = 0; +#ifndef SQLITE_OMIT_WAL + sqlite3WalClose(pPager->pWal, pPager->ckptSyncFlags, pPager->pageSize, pTmp); + pPager->pWal = 0; +#endif + pager_reset(pPager); + if( MEMDB ){ + pager_unlock(pPager); + }else{ + /* If it is open, sync the journal file before calling UnlockAndRollback. + ** If this is not done, then an unsynced portion of the open journal + ** file may be played back into the database. If a power failure occurs + ** while this is happening, the database could become corrupt. + ** + ** If an error occurs while trying to sync the journal, shift the pager + ** into the ERROR state. This causes UnlockAndRollback to unlock the + ** database and close the journal file without attempting to roll it + ** back or finalize it. The next database user will have to do hot-journal + ** rollback before accessing the database file. + */ + if( isOpen(pPager->jfd) ){ + pager_error(pPager, pagerSyncHotJournal(pPager)); + } + pagerUnlockAndRollback(pPager); + } + sqlite3EndBenignMalloc(); + enable_simulated_io_errors(); + PAGERTRACE(("CLOSE %d\n", PAGERID(pPager))); + IOTRACE(("CLOSE %p\n", pPager)) + sqlite3OsClose(pPager->jfd); + sqlite3OsClose(pPager->fd); + sqlite3PageFree(pTmp); + sqlite3PcacheClose(pPager->pPCache); + +#ifdef SQLITE_HAS_CODEC + if( pPager->xCodecFree ) pPager->xCodecFree(pPager->pCodec); +#endif + + assert( !pPager->aSavepoint && !pPager->pInJournal ); + assert( !isOpen(pPager->jfd) && !isOpen(pPager->sjfd) ); + + sqlite3_free(pPager); + return SQLITE_OK; +} + +#if !defined(NDEBUG) || defined(SQLITE_TEST) +/* +** Return the page number for page pPg. +*/ +SQLITE_PRIVATE Pgno sqlite3PagerPagenumber(DbPage *pPg){ + return pPg->pgno; +} +#endif + +/* +** Increment the reference count for page pPg. +*/ +SQLITE_PRIVATE void sqlite3PagerRef(DbPage *pPg){ + sqlite3PcacheRef(pPg); +} + +/* +** Sync the journal. In other words, make sure all the pages that have +** been written to the journal have actually reached the surface of the +** disk and can be restored in the event of a hot-journal rollback. +** +** If the Pager.noSync flag is set, then this function is a no-op. +** Otherwise, the actions required depend on the journal-mode and the +** device characteristics of the file-system, as follows: +** +** * If the journal file is an in-memory journal file, no action need +** be taken. +** +** * Otherwise, if the device does not support the SAFE_APPEND property, +** then the nRec field of the most recently written journal header +** is updated to contain the number of journal records that have +** been written following it. If the pager is operating in full-sync +** mode, then the journal file is synced before this field is updated. +** +** * If the device does not support the SEQUENTIAL property, then +** journal file is synced. +** +** Or, in pseudo-code: +** +** if( NOT ){ +** if( NOT SAFE_APPEND ){ +** if( ) xSync(); +** +** } +** if( NOT SEQUENTIAL ) xSync(); +** } +** +** If successful, this routine clears the PGHDR_NEED_SYNC flag of every +** page currently held in memory before returning SQLITE_OK. If an IO +** error is encountered, then the IO error code is returned to the caller. +*/ +static int syncJournal(Pager *pPager, int newHdr){ + int rc; /* Return code */ + + assert( pPager->eState==PAGER_WRITER_CACHEMOD + || pPager->eState==PAGER_WRITER_DBMOD + ); + assert( assert_pager_state(pPager) ); + assert( !pagerUseWal(pPager) ); + + rc = sqlite3PagerExclusiveLock(pPager); + if( rc!=SQLITE_OK ) return rc; + + if( !pPager->noSync ){ + assert( !pPager->tempFile ); + if( isOpen(pPager->jfd) && pPager->journalMode!=PAGER_JOURNALMODE_MEMORY ){ + const int iDc = sqlite3OsDeviceCharacteristics(pPager->fd); + assert( isOpen(pPager->jfd) ); + + if( 0==(iDc&SQLITE_IOCAP_SAFE_APPEND) ){ + /* This block deals with an obscure problem. If the last connection + ** that wrote to this database was operating in persistent-journal + ** mode, then the journal file may at this point actually be larger + ** than Pager.journalOff bytes. If the next thing in the journal + ** file happens to be a journal-header (written as part of the + ** previous connection's transaction), and a crash or power-failure + ** occurs after nRec is updated but before this connection writes + ** anything else to the journal file (or commits/rolls back its + ** transaction), then SQLite may become confused when doing the + ** hot-journal rollback following recovery. It may roll back all + ** of this connections data, then proceed to rolling back the old, + ** out-of-date data that follows it. Database corruption. + ** + ** To work around this, if the journal file does appear to contain + ** a valid header following Pager.journalOff, then write a 0x00 + ** byte to the start of it to prevent it from being recognized. + ** + ** Variable iNextHdrOffset is set to the offset at which this + ** problematic header will occur, if it exists. aMagic is used + ** as a temporary buffer to inspect the first couple of bytes of + ** the potential journal header. + */ + i64 iNextHdrOffset; + u8 aMagic[8]; + u8 zHeader[sizeof(aJournalMagic)+4]; + + memcpy(zHeader, aJournalMagic, sizeof(aJournalMagic)); + put32bits(&zHeader[sizeof(aJournalMagic)], pPager->nRec); + + iNextHdrOffset = journalHdrOffset(pPager); + rc = sqlite3OsRead(pPager->jfd, aMagic, 8, iNextHdrOffset); + if( rc==SQLITE_OK && 0==memcmp(aMagic, aJournalMagic, 8) ){ + static const u8 zerobyte = 0; + rc = sqlite3OsWrite(pPager->jfd, &zerobyte, 1, iNextHdrOffset); + } + if( rc!=SQLITE_OK && rc!=SQLITE_IOERR_SHORT_READ ){ + return rc; + } + + /* Write the nRec value into the journal file header. If in + ** full-synchronous mode, sync the journal first. This ensures that + ** all data has really hit the disk before nRec is updated to mark + ** it as a candidate for rollback. + ** + ** This is not required if the persistent media supports the + ** SAFE_APPEND property. Because in this case it is not possible + ** for garbage data to be appended to the file, the nRec field + ** is populated with 0xFFFFFFFF when the journal header is written + ** and never needs to be updated. + */ + if( pPager->fullSync && 0==(iDc&SQLITE_IOCAP_SEQUENTIAL) ){ + PAGERTRACE(("SYNC journal of %d\n", PAGERID(pPager))); + IOTRACE(("JSYNC %p\n", pPager)) + rc = sqlite3OsSync(pPager->jfd, pPager->syncFlags); + if( rc!=SQLITE_OK ) return rc; + } + IOTRACE(("JHDR %p %lld\n", pPager, pPager->journalHdr)); + rc = sqlite3OsWrite( + pPager->jfd, zHeader, sizeof(zHeader), pPager->journalHdr + ); + if( rc!=SQLITE_OK ) return rc; + } + if( 0==(iDc&SQLITE_IOCAP_SEQUENTIAL) ){ + PAGERTRACE(("SYNC journal of %d\n", PAGERID(pPager))); + IOTRACE(("JSYNC %p\n", pPager)) + rc = sqlite3OsSync(pPager->jfd, pPager->syncFlags| + (pPager->syncFlags==SQLITE_SYNC_FULL?SQLITE_SYNC_DATAONLY:0) + ); + if( rc!=SQLITE_OK ) return rc; + } + + pPager->journalHdr = pPager->journalOff; + if( newHdr && 0==(iDc&SQLITE_IOCAP_SAFE_APPEND) ){ + pPager->nRec = 0; + rc = writeJournalHdr(pPager); + if( rc!=SQLITE_OK ) return rc; + } + }else{ + pPager->journalHdr = pPager->journalOff; + } + } + + /* Unless the pager is in noSync mode, the journal file was just + ** successfully synced. Either way, clear the PGHDR_NEED_SYNC flag on + ** all pages. + */ + sqlite3PcacheClearSyncFlags(pPager->pPCache); + pPager->eState = PAGER_WRITER_DBMOD; + assert( assert_pager_state(pPager) ); + return SQLITE_OK; +} + +/* +** The argument is the first in a linked list of dirty pages connected +** by the PgHdr.pDirty pointer. This function writes each one of the +** in-memory pages in the list to the database file. The argument may +** be NULL, representing an empty list. In this case this function is +** a no-op. +** +** The pager must hold at least a RESERVED lock when this function +** is called. Before writing anything to the database file, this lock +** is upgraded to an EXCLUSIVE lock. If the lock cannot be obtained, +** SQLITE_BUSY is returned and no data is written to the database file. +** +** If the pager is a temp-file pager and the actual file-system file +** is not yet open, it is created and opened before any data is +** written out. +** +** Once the lock has been upgraded and, if necessary, the file opened, +** the pages are written out to the database file in list order. Writing +** a page is skipped if it meets either of the following criteria: +** +** * The page number is greater than Pager.dbSize, or +** * The PGHDR_DONT_WRITE flag is set on the page. +** +** If writing out a page causes the database file to grow, Pager.dbFileSize +** is updated accordingly. If page 1 is written out, then the value cached +** in Pager.dbFileVers[] is updated to match the new value stored in +** the database file. +** +** If everything is successful, SQLITE_OK is returned. If an IO error +** occurs, an IO error code is returned. Or, if the EXCLUSIVE lock cannot +** be obtained, SQLITE_BUSY is returned. +*/ +static int pager_write_pagelist(Pager *pPager, PgHdr *pList){ + int rc = SQLITE_OK; /* Return code */ + + /* This function is only called for rollback pagers in WRITER_DBMOD state. */ + assert( !pagerUseWal(pPager) ); + assert( pPager->tempFile || pPager->eState==PAGER_WRITER_DBMOD ); + assert( pPager->eLock==EXCLUSIVE_LOCK ); + assert( isOpen(pPager->fd) || pList->pDirty==0 ); + + /* If the file is a temp-file has not yet been opened, open it now. It + ** is not possible for rc to be other than SQLITE_OK if this branch + ** is taken, as pager_wait_on_lock() is a no-op for temp-files. + */ + if( !isOpen(pPager->fd) ){ + assert( pPager->tempFile && rc==SQLITE_OK ); + rc = pagerOpentemp(pPager, pPager->fd, pPager->vfsFlags); + } + + /* Before the first write, give the VFS a hint of what the final + ** file size will be. + */ + assert( rc!=SQLITE_OK || isOpen(pPager->fd) ); + if( rc==SQLITE_OK + && pPager->dbHintSizedbSize + && (pList->pDirty || pList->pgno>pPager->dbHintSize) + ){ + sqlite3_int64 szFile = pPager->pageSize * (sqlite3_int64)pPager->dbSize; + sqlite3OsFileControlHint(pPager->fd, SQLITE_FCNTL_SIZE_HINT, &szFile); + pPager->dbHintSize = pPager->dbSize; + } + + while( rc==SQLITE_OK && pList ){ + Pgno pgno = pList->pgno; + + /* If there are dirty pages in the page cache with page numbers greater + ** than Pager.dbSize, this means sqlite3PagerTruncateImage() was called to + ** make the file smaller (presumably by auto-vacuum code). Do not write + ** any such pages to the file. + ** + ** Also, do not write out any page that has the PGHDR_DONT_WRITE flag + ** set (set by sqlite3PagerDontWrite()). + */ + if( pgno<=pPager->dbSize && 0==(pList->flags&PGHDR_DONT_WRITE) ){ + i64 offset = (pgno-1)*(i64)pPager->pageSize; /* Offset to write */ + char *pData; /* Data to write */ + + assert( (pList->flags&PGHDR_NEED_SYNC)==0 ); + if( pList->pgno==1 ) pager_write_changecounter(pList); + + /* Encode the database */ + CODEC2(pPager, pList->pData, pgno, 6, return SQLITE_NOMEM_BKPT, pData); + + /* Write out the page data. */ + rc = sqlite3OsWrite(pPager->fd, pData, pPager->pageSize, offset); + + /* If page 1 was just written, update Pager.dbFileVers to match + ** the value now stored in the database file. If writing this + ** page caused the database file to grow, update dbFileSize. + */ + if( pgno==1 ){ + memcpy(&pPager->dbFileVers, &pData[24], sizeof(pPager->dbFileVers)); + } + if( pgno>pPager->dbFileSize ){ + pPager->dbFileSize = pgno; + } + pPager->aStat[PAGER_STAT_WRITE]++; + + /* Update any backup objects copying the contents of this pager. */ + sqlite3BackupUpdate(pPager->pBackup, pgno, (u8*)pList->pData); + + PAGERTRACE(("STORE %d page %d hash(%08x)\n", + PAGERID(pPager), pgno, pager_pagehash(pList))); + IOTRACE(("PGOUT %p %d\n", pPager, pgno)); + PAGER_INCR(sqlite3_pager_writedb_count); + }else{ + PAGERTRACE(("NOSTORE %d page %d\n", PAGERID(pPager), pgno)); + } + pager_set_pagehash(pList); + pList = pList->pDirty; + } + + return rc; +} + +/* +** Ensure that the sub-journal file is open. If it is already open, this +** function is a no-op. +** +** SQLITE_OK is returned if everything goes according to plan. An +** SQLITE_IOERR_XXX error code is returned if a call to sqlite3OsOpen() +** fails. +*/ +static int openSubJournal(Pager *pPager){ + int rc = SQLITE_OK; + if( !isOpen(pPager->sjfd) ){ + const int flags = SQLITE_OPEN_SUBJOURNAL | SQLITE_OPEN_READWRITE + | SQLITE_OPEN_CREATE | SQLITE_OPEN_EXCLUSIVE + | SQLITE_OPEN_DELETEONCLOSE; + int nStmtSpill = sqlite3Config.nStmtSpill; + if( pPager->journalMode==PAGER_JOURNALMODE_MEMORY || pPager->subjInMemory ){ + nStmtSpill = -1; + } + rc = sqlite3JournalOpen(pPager->pVfs, 0, pPager->sjfd, flags, nStmtSpill); + } + return rc; +} + +/* +** Append a record of the current state of page pPg to the sub-journal. +** +** If successful, set the bit corresponding to pPg->pgno in the bitvecs +** for all open savepoints before returning. +** +** This function returns SQLITE_OK if everything is successful, an IO +** error code if the attempt to write to the sub-journal fails, or +** SQLITE_NOMEM if a malloc fails while setting a bit in a savepoint +** bitvec. +*/ +static int subjournalPage(PgHdr *pPg){ + int rc = SQLITE_OK; + Pager *pPager = pPg->pPager; + if( pPager->journalMode!=PAGER_JOURNALMODE_OFF ){ + + /* Open the sub-journal, if it has not already been opened */ + assert( pPager->useJournal ); + assert( isOpen(pPager->jfd) || pagerUseWal(pPager) ); + assert( isOpen(pPager->sjfd) || pPager->nSubRec==0 ); + assert( pagerUseWal(pPager) + || pageInJournal(pPager, pPg) + || pPg->pgno>pPager->dbOrigSize + ); + rc = openSubJournal(pPager); + + /* If the sub-journal was opened successfully (or was already open), + ** write the journal record into the file. */ + if( rc==SQLITE_OK ){ + void *pData = pPg->pData; + i64 offset = (i64)pPager->nSubRec*(4+pPager->pageSize); + char *pData2; + + CODEC2(pPager, pData, pPg->pgno, 7, return SQLITE_NOMEM_BKPT, pData2); + PAGERTRACE(("STMT-JOURNAL %d page %d\n", PAGERID(pPager), pPg->pgno)); + rc = write32bits(pPager->sjfd, offset, pPg->pgno); + if( rc==SQLITE_OK ){ + rc = sqlite3OsWrite(pPager->sjfd, pData2, pPager->pageSize, offset+4); + } + } + } + if( rc==SQLITE_OK ){ + pPager->nSubRec++; + assert( pPager->nSavepoint>0 ); + rc = addToSavepointBitvecs(pPager, pPg->pgno); + } + return rc; +} +static int subjournalPageIfRequired(PgHdr *pPg){ + if( subjRequiresPage(pPg) ){ + return subjournalPage(pPg); + }else{ + return SQLITE_OK; + } +} + +/* +** This function is called by the pcache layer when it has reached some +** soft memory limit. The first argument is a pointer to a Pager object +** (cast as a void*). The pager is always 'purgeable' (not an in-memory +** database). The second argument is a reference to a page that is +** currently dirty but has no outstanding references. The page +** is always associated with the Pager object passed as the first +** argument. +** +** The job of this function is to make pPg clean by writing its contents +** out to the database file, if possible. This may involve syncing the +** journal file. +** +** If successful, sqlite3PcacheMakeClean() is called on the page and +** SQLITE_OK returned. If an IO error occurs while trying to make the +** page clean, the IO error code is returned. If the page cannot be +** made clean for some other reason, but no error occurs, then SQLITE_OK +** is returned by sqlite3PcacheMakeClean() is not called. +*/ +static int pagerStress(void *p, PgHdr *pPg){ + Pager *pPager = (Pager *)p; + int rc = SQLITE_OK; + + assert( pPg->pPager==pPager ); + assert( pPg->flags&PGHDR_DIRTY ); + + /* The doNotSpill NOSYNC bit is set during times when doing a sync of + ** journal (and adding a new header) is not allowed. This occurs + ** during calls to sqlite3PagerWrite() while trying to journal multiple + ** pages belonging to the same sector. + ** + ** The doNotSpill ROLLBACK and OFF bits inhibits all cache spilling + ** regardless of whether or not a sync is required. This is set during + ** a rollback or by user request, respectively. + ** + ** Spilling is also prohibited when in an error state since that could + ** lead to database corruption. In the current implementation it + ** is impossible for sqlite3PcacheFetch() to be called with createFlag==3 + ** while in the error state, hence it is impossible for this routine to + ** be called in the error state. Nevertheless, we include a NEVER() + ** test for the error state as a safeguard against future changes. + */ + if( NEVER(pPager->errCode) ) return SQLITE_OK; + testcase( pPager->doNotSpill & SPILLFLAG_ROLLBACK ); + testcase( pPager->doNotSpill & SPILLFLAG_OFF ); + testcase( pPager->doNotSpill & SPILLFLAG_NOSYNC ); + if( pPager->doNotSpill + && ((pPager->doNotSpill & (SPILLFLAG_ROLLBACK|SPILLFLAG_OFF))!=0 + || (pPg->flags & PGHDR_NEED_SYNC)!=0) + ){ + return SQLITE_OK; + } + + pPg->pDirty = 0; + if( pagerUseWal(pPager) ){ + /* Write a single frame for this page to the log. */ + rc = subjournalPageIfRequired(pPg); + if( rc==SQLITE_OK ){ + rc = pagerWalFrames(pPager, pPg, 0, 0); + } + }else{ + + /* Sync the journal file if required. */ + if( pPg->flags&PGHDR_NEED_SYNC + || pPager->eState==PAGER_WRITER_CACHEMOD + ){ + rc = syncJournal(pPager, 1); + } + + /* Write the contents of the page out to the database file. */ + if( rc==SQLITE_OK ){ + assert( (pPg->flags&PGHDR_NEED_SYNC)==0 ); + rc = pager_write_pagelist(pPager, pPg); + } + } + + /* Mark the page as clean. */ + if( rc==SQLITE_OK ){ + PAGERTRACE(("STRESS %d page %d\n", PAGERID(pPager), pPg->pgno)); + sqlite3PcacheMakeClean(pPg); + } + + return pager_error(pPager, rc); +} + +/* +** Flush all unreferenced dirty pages to disk. +*/ +SQLITE_PRIVATE int sqlite3PagerFlush(Pager *pPager){ + int rc = pPager->errCode; + if( !MEMDB ){ + PgHdr *pList = sqlite3PcacheDirtyList(pPager->pPCache); + assert( assert_pager_state(pPager) ); + while( rc==SQLITE_OK && pList ){ + PgHdr *pNext = pList->pDirty; + if( pList->nRef==0 ){ + rc = pagerStress((void*)pPager, pList); + } + pList = pNext; + } + } + + return rc; +} + +/* +** Allocate and initialize a new Pager object and put a pointer to it +** in *ppPager. The pager should eventually be freed by passing it +** to sqlite3PagerClose(). +** +** The zFilename argument is the path to the database file to open. +** If zFilename is NULL then a randomly-named temporary file is created +** and used as the file to be cached. Temporary files are be deleted +** automatically when they are closed. If zFilename is ":memory:" then +** all information is held in cache. It is never written to disk. +** This can be used to implement an in-memory database. +** +** The nExtra parameter specifies the number of bytes of space allocated +** along with each page reference. This space is available to the user +** via the sqlite3PagerGetExtra() API. +** +** The flags argument is used to specify properties that affect the +** operation of the pager. It should be passed some bitwise combination +** of the PAGER_* flags. +** +** The vfsFlags parameter is a bitmask to pass to the flags parameter +** of the xOpen() method of the supplied VFS when opening files. +** +** If the pager object is allocated and the specified file opened +** successfully, SQLITE_OK is returned and *ppPager set to point to +** the new pager object. If an error occurs, *ppPager is set to NULL +** and error code returned. This function may return SQLITE_NOMEM +** (sqlite3Malloc() is used to allocate memory), SQLITE_CANTOPEN or +** various SQLITE_IO_XXX errors. +*/ +SQLITE_PRIVATE int sqlite3PagerOpen( + sqlite3_vfs *pVfs, /* The virtual file system to use */ + Pager **ppPager, /* OUT: Return the Pager structure here */ + const char *zFilename, /* Name of the database file to open */ + int nExtra, /* Extra bytes append to each in-memory page */ + int flags, /* flags controlling this file */ + int vfsFlags, /* flags passed through to sqlite3_vfs.xOpen() */ + void (*xReinit)(DbPage*) /* Function to reinitialize pages */ +){ + u8 *pPtr; + Pager *pPager = 0; /* Pager object to allocate and return */ + int rc = SQLITE_OK; /* Return code */ + int tempFile = 0; /* True for temp files (incl. in-memory files) */ + int memDb = 0; /* True if this is an in-memory file */ + int readOnly = 0; /* True if this is a read-only file */ + int journalFileSize; /* Bytes to allocate for each journal fd */ + char *zPathname = 0; /* Full path to database file */ + int nPathname = 0; /* Number of bytes in zPathname */ + int useJournal = (flags & PAGER_OMIT_JOURNAL)==0; /* False to omit journal */ + int pcacheSize = sqlite3PcacheSize(); /* Bytes to allocate for PCache */ + u32 szPageDflt = SQLITE_DEFAULT_PAGE_SIZE; /* Default page size */ + const char *zUri = 0; /* URI args to copy */ + int nUri = 0; /* Number of bytes of URI args at *zUri */ + + /* Figure out how much space is required for each journal file-handle + ** (there are two of them, the main journal and the sub-journal). */ + journalFileSize = ROUND8(sqlite3JournalSize(pVfs)); + + /* Set the output variable to NULL in case an error occurs. */ + *ppPager = 0; + +#ifndef SQLITE_OMIT_MEMORYDB + if( flags & PAGER_MEMORY ){ + memDb = 1; + if( zFilename && zFilename[0] ){ + zPathname = sqlite3DbStrDup(0, zFilename); + if( zPathname==0 ) return SQLITE_NOMEM_BKPT; + nPathname = sqlite3Strlen30(zPathname); + zFilename = 0; + } + } +#endif + + /* Compute and store the full pathname in an allocated buffer pointed + ** to by zPathname, length nPathname. Or, if this is a temporary file, + ** leave both nPathname and zPathname set to 0. + */ + if( zFilename && zFilename[0] ){ + const char *z; + nPathname = pVfs->mxPathname+1; + zPathname = sqlite3DbMallocRaw(0, nPathname*2); + if( zPathname==0 ){ + return SQLITE_NOMEM_BKPT; + } + zPathname[0] = 0; /* Make sure initialized even if FullPathname() fails */ + rc = sqlite3OsFullPathname(pVfs, zFilename, nPathname, zPathname); + nPathname = sqlite3Strlen30(zPathname); + z = zUri = &zFilename[sqlite3Strlen30(zFilename)+1]; + while( *z ){ + z += sqlite3Strlen30(z)+1; + z += sqlite3Strlen30(z)+1; + } + nUri = (int)(&z[1] - zUri); + assert( nUri>=0 ); + if( rc==SQLITE_OK && nPathname+8>pVfs->mxPathname ){ + /* This branch is taken when the journal path required by + ** the database being opened will be more than pVfs->mxPathname + ** bytes in length. This means the database cannot be opened, + ** as it will not be possible to open the journal file or even + ** check for a hot-journal before reading. + */ + rc = SQLITE_CANTOPEN_BKPT; + } + if( rc!=SQLITE_OK ){ + sqlite3DbFree(0, zPathname); + return rc; + } + } + + /* Allocate memory for the Pager structure, PCache object, the + ** three file descriptors, the database file name and the journal + ** file name. The layout in memory is as follows: + ** + ** Pager object (sizeof(Pager) bytes) + ** PCache object (sqlite3PcacheSize() bytes) + ** Database file handle (pVfs->szOsFile bytes) + ** Sub-journal file handle (journalFileSize bytes) + ** Main journal file handle (journalFileSize bytes) + ** Database file name (nPathname+1 bytes) + ** Journal file name (nPathname+8+1 bytes) + */ + pPtr = (u8 *)sqlite3MallocZero( + ROUND8(sizeof(*pPager)) + /* Pager structure */ + ROUND8(pcacheSize) + /* PCache object */ + ROUND8(pVfs->szOsFile) + /* The main db file */ + journalFileSize * 2 + /* The two journal files */ + nPathname + 1 + nUri + /* zFilename */ + nPathname + 8 + 2 /* zJournal */ +#ifndef SQLITE_OMIT_WAL + + nPathname + 4 + 2 /* zWal */ +#endif + ); + assert( EIGHT_BYTE_ALIGNMENT(SQLITE_INT_TO_PTR(journalFileSize)) ); + if( !pPtr ){ + sqlite3DbFree(0, zPathname); + return SQLITE_NOMEM_BKPT; + } + pPager = (Pager*)(pPtr); + pPager->pPCache = (PCache*)(pPtr += ROUND8(sizeof(*pPager))); + pPager->fd = (sqlite3_file*)(pPtr += ROUND8(pcacheSize)); + pPager->sjfd = (sqlite3_file*)(pPtr += ROUND8(pVfs->szOsFile)); + pPager->jfd = (sqlite3_file*)(pPtr += journalFileSize); + pPager->zFilename = (char*)(pPtr += journalFileSize); + assert( EIGHT_BYTE_ALIGNMENT(pPager->jfd) ); + + /* Fill in the Pager.zFilename and Pager.zJournal buffers, if required. */ + if( zPathname ){ + assert( nPathname>0 ); + pPager->zJournal = (char*)(pPtr += nPathname + 1 + nUri); + memcpy(pPager->zFilename, zPathname, nPathname); + if( nUri ) memcpy(&pPager->zFilename[nPathname+1], zUri, nUri); + memcpy(pPager->zJournal, zPathname, nPathname); + memcpy(&pPager->zJournal[nPathname], "-journal\000", 8+2); + sqlite3FileSuffix3(pPager->zFilename, pPager->zJournal); +#ifndef SQLITE_OMIT_WAL + pPager->zWal = &pPager->zJournal[nPathname+8+1]; + memcpy(pPager->zWal, zPathname, nPathname); + memcpy(&pPager->zWal[nPathname], "-wal\000", 4+1); + sqlite3FileSuffix3(pPager->zFilename, pPager->zWal); +#endif + sqlite3DbFree(0, zPathname); + } + pPager->pVfs = pVfs; + pPager->vfsFlags = vfsFlags; + + /* Open the pager file. + */ + if( zFilename && zFilename[0] ){ + int fout = 0; /* VFS flags returned by xOpen() */ + rc = sqlite3OsOpen(pVfs, pPager->zFilename, pPager->fd, vfsFlags, &fout); + assert( !memDb ); + readOnly = (fout&SQLITE_OPEN_READONLY); + + /* If the file was successfully opened for read/write access, + ** choose a default page size in case we have to create the + ** database file. The default page size is the maximum of: + ** + ** + SQLITE_DEFAULT_PAGE_SIZE, + ** + The value returned by sqlite3OsSectorSize() + ** + The largest page size that can be written atomically. + */ + if( rc==SQLITE_OK ){ + int iDc = sqlite3OsDeviceCharacteristics(pPager->fd); + if( !readOnly ){ + setSectorSize(pPager); + assert(SQLITE_DEFAULT_PAGE_SIZE<=SQLITE_MAX_DEFAULT_PAGE_SIZE); + if( szPageDfltsectorSize ){ + if( pPager->sectorSize>SQLITE_MAX_DEFAULT_PAGE_SIZE ){ + szPageDflt = SQLITE_MAX_DEFAULT_PAGE_SIZE; + }else{ + szPageDflt = (u32)pPager->sectorSize; + } + } +#ifdef SQLITE_ENABLE_ATOMIC_WRITE + { + int ii; + assert(SQLITE_IOCAP_ATOMIC512==(512>>8)); + assert(SQLITE_IOCAP_ATOMIC64K==(65536>>8)); + assert(SQLITE_MAX_DEFAULT_PAGE_SIZE<=65536); + for(ii=szPageDflt; ii<=SQLITE_MAX_DEFAULT_PAGE_SIZE; ii=ii*2){ + if( iDc&(SQLITE_IOCAP_ATOMIC|(ii>>8)) ){ + szPageDflt = ii; + } + } + } +#endif + } + pPager->noLock = sqlite3_uri_boolean(zFilename, "nolock", 0); + if( (iDc & SQLITE_IOCAP_IMMUTABLE)!=0 + || sqlite3_uri_boolean(zFilename, "immutable", 0) ){ + vfsFlags |= SQLITE_OPEN_READONLY; + goto act_like_temp_file; + } + } + }else{ + /* If a temporary file is requested, it is not opened immediately. + ** In this case we accept the default page size and delay actually + ** opening the file until the first call to OsWrite(). + ** + ** This branch is also run for an in-memory database. An in-memory + ** database is the same as a temp-file that is never written out to + ** disk and uses an in-memory rollback journal. + ** + ** This branch also runs for files marked as immutable. + */ +act_like_temp_file: + tempFile = 1; + pPager->eState = PAGER_READER; /* Pretend we already have a lock */ + pPager->eLock = EXCLUSIVE_LOCK; /* Pretend we are in EXCLUSIVE mode */ + pPager->noLock = 1; /* Do no locking */ + readOnly = (vfsFlags&SQLITE_OPEN_READONLY); + } + + /* The following call to PagerSetPagesize() serves to set the value of + ** Pager.pageSize and to allocate the Pager.pTmpSpace buffer. + */ + if( rc==SQLITE_OK ){ + assert( pPager->memDb==0 ); + rc = sqlite3PagerSetPagesize(pPager, &szPageDflt, -1); + testcase( rc!=SQLITE_OK ); + } + + /* Initialize the PCache object. */ + if( rc==SQLITE_OK ){ + assert( nExtra<1000 ); + nExtra = ROUND8(nExtra); + rc = sqlite3PcacheOpen(szPageDflt, nExtra, !memDb, + !memDb?pagerStress:0, (void *)pPager, pPager->pPCache); + } + + /* If an error occurred above, free the Pager structure and close the file. + */ + if( rc!=SQLITE_OK ){ + sqlite3OsClose(pPager->fd); + sqlite3PageFree(pPager->pTmpSpace); + sqlite3_free(pPager); + return rc; + } + + PAGERTRACE(("OPEN %d %s\n", FILEHANDLEID(pPager->fd), pPager->zFilename)); + IOTRACE(("OPEN %p %s\n", pPager, pPager->zFilename)) + + pPager->useJournal = (u8)useJournal; + /* pPager->stmtOpen = 0; */ + /* pPager->stmtInUse = 0; */ + /* pPager->nRef = 0; */ + /* pPager->stmtSize = 0; */ + /* pPager->stmtJSize = 0; */ + /* pPager->nPage = 0; */ + pPager->mxPgno = SQLITE_MAX_PAGE_COUNT; + /* pPager->state = PAGER_UNLOCK; */ + /* pPager->errMask = 0; */ + pPager->tempFile = (u8)tempFile; + assert( tempFile==PAGER_LOCKINGMODE_NORMAL + || tempFile==PAGER_LOCKINGMODE_EXCLUSIVE ); + assert( PAGER_LOCKINGMODE_EXCLUSIVE==1 ); + pPager->exclusiveMode = (u8)tempFile; + pPager->changeCountDone = pPager->tempFile; + pPager->memDb = (u8)memDb; + pPager->readOnly = (u8)readOnly; + assert( useJournal || pPager->tempFile ); + pPager->noSync = pPager->tempFile; + if( pPager->noSync ){ + assert( pPager->fullSync==0 ); + assert( pPager->extraSync==0 ); + assert( pPager->syncFlags==0 ); + assert( pPager->walSyncFlags==0 ); + assert( pPager->ckptSyncFlags==0 ); + }else{ + pPager->fullSync = 1; + pPager->extraSync = 0; + pPager->syncFlags = SQLITE_SYNC_NORMAL; + pPager->walSyncFlags = SQLITE_SYNC_NORMAL | WAL_SYNC_TRANSACTIONS; + pPager->ckptSyncFlags = SQLITE_SYNC_NORMAL; + } + /* pPager->pFirst = 0; */ + /* pPager->pFirstSynced = 0; */ + /* pPager->pLast = 0; */ + pPager->nExtra = (u16)nExtra; + pPager->journalSizeLimit = SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT; + assert( isOpen(pPager->fd) || tempFile ); + setSectorSize(pPager); + if( !useJournal ){ + pPager->journalMode = PAGER_JOURNALMODE_OFF; + }else if( memDb ){ + pPager->journalMode = PAGER_JOURNALMODE_MEMORY; + } + /* pPager->xBusyHandler = 0; */ + /* pPager->pBusyHandlerArg = 0; */ + pPager->xReiniter = xReinit; + /* memset(pPager->aHash, 0, sizeof(pPager->aHash)); */ + /* pPager->szMmap = SQLITE_DEFAULT_MMAP_SIZE // will be set by btree.c */ + + *ppPager = pPager; + return SQLITE_OK; +} + + +/* Verify that the database file has not be deleted or renamed out from +** under the pager. Return SQLITE_OK if the database is still were it ought +** to be on disk. Return non-zero (SQLITE_READONLY_DBMOVED or some other error +** code from sqlite3OsAccess()) if the database has gone missing. +*/ +static int databaseIsUnmoved(Pager *pPager){ + int bHasMoved = 0; + int rc; + + if( pPager->tempFile ) return SQLITE_OK; + if( pPager->dbSize==0 ) return SQLITE_OK; + assert( pPager->zFilename && pPager->zFilename[0] ); + rc = sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_HAS_MOVED, &bHasMoved); + if( rc==SQLITE_NOTFOUND ){ + /* If the HAS_MOVED file-control is unimplemented, assume that the file + ** has not been moved. That is the historical behavior of SQLite: prior to + ** version 3.8.3, it never checked */ + rc = SQLITE_OK; + }else if( rc==SQLITE_OK && bHasMoved ){ + rc = SQLITE_READONLY_DBMOVED; + } + return rc; +} + + +/* +** This function is called after transitioning from PAGER_UNLOCK to +** PAGER_SHARED state. It tests if there is a hot journal present in +** the file-system for the given pager. A hot journal is one that +** needs to be played back. According to this function, a hot-journal +** file exists if the following criteria are met: +** +** * The journal file exists in the file system, and +** * No process holds a RESERVED or greater lock on the database file, and +** * The database file itself is greater than 0 bytes in size, and +** * The first byte of the journal file exists and is not 0x00. +** +** If the current size of the database file is 0 but a journal file +** exists, that is probably an old journal left over from a prior +** database with the same name. In this case the journal file is +** just deleted using OsDelete, *pExists is set to 0 and SQLITE_OK +** is returned. +** +** This routine does not check if there is a master journal filename +** at the end of the file. If there is, and that master journal file +** does not exist, then the journal file is not really hot. In this +** case this routine will return a false-positive. The pager_playback() +** routine will discover that the journal file is not really hot and +** will not roll it back. +** +** If a hot-journal file is found to exist, *pExists is set to 1 and +** SQLITE_OK returned. If no hot-journal file is present, *pExists is +** set to 0 and SQLITE_OK returned. If an IO error occurs while trying +** to determine whether or not a hot-journal file exists, the IO error +** code is returned and the value of *pExists is undefined. +*/ +static int hasHotJournal(Pager *pPager, int *pExists){ + sqlite3_vfs * const pVfs = pPager->pVfs; + int rc = SQLITE_OK; /* Return code */ + int exists = 1; /* True if a journal file is present */ + int jrnlOpen = !!isOpen(pPager->jfd); + + assert( pPager->useJournal ); + assert( isOpen(pPager->fd) ); + assert( pPager->eState==PAGER_OPEN ); + + assert( jrnlOpen==0 || ( sqlite3OsDeviceCharacteristics(pPager->jfd) & + SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN + )); + + *pExists = 0; + if( !jrnlOpen ){ + rc = sqlite3OsAccess(pVfs, pPager->zJournal, SQLITE_ACCESS_EXISTS, &exists); + } + if( rc==SQLITE_OK && exists ){ + int locked = 0; /* True if some process holds a RESERVED lock */ + + /* Race condition here: Another process might have been holding the + ** the RESERVED lock and have a journal open at the sqlite3OsAccess() + ** call above, but then delete the journal and drop the lock before + ** we get to the following sqlite3OsCheckReservedLock() call. If that + ** is the case, this routine might think there is a hot journal when + ** in fact there is none. This results in a false-positive which will + ** be dealt with by the playback routine. Ticket #3883. + */ + rc = sqlite3OsCheckReservedLock(pPager->fd, &locked); + if( rc==SQLITE_OK && !locked ){ + Pgno nPage; /* Number of pages in database file */ + + assert( pPager->tempFile==0 ); + rc = pagerPagecount(pPager, &nPage); + if( rc==SQLITE_OK ){ + /* If the database is zero pages in size, that means that either (1) the + ** journal is a remnant from a prior database with the same name where + ** the database file but not the journal was deleted, or (2) the initial + ** transaction that populates a new database is being rolled back. + ** In either case, the journal file can be deleted. However, take care + ** not to delete the journal file if it is already open due to + ** journal_mode=PERSIST. + */ + if( nPage==0 && !jrnlOpen ){ + sqlite3BeginBenignMalloc(); + if( pagerLockDb(pPager, RESERVED_LOCK)==SQLITE_OK ){ + sqlite3OsDelete(pVfs, pPager->zJournal, 0); + if( !pPager->exclusiveMode ) pagerUnlockDb(pPager, SHARED_LOCK); + } + sqlite3EndBenignMalloc(); + }else{ + /* The journal file exists and no other connection has a reserved + ** or greater lock on the database file. Now check that there is + ** at least one non-zero bytes at the start of the journal file. + ** If there is, then we consider this journal to be hot. If not, + ** it can be ignored. + */ + if( !jrnlOpen ){ + int f = SQLITE_OPEN_READONLY|SQLITE_OPEN_MAIN_JOURNAL; + rc = sqlite3OsOpen(pVfs, pPager->zJournal, pPager->jfd, f, &f); + } + if( rc==SQLITE_OK ){ + u8 first = 0; + rc = sqlite3OsRead(pPager->jfd, (void *)&first, 1, 0); + if( rc==SQLITE_IOERR_SHORT_READ ){ + rc = SQLITE_OK; + } + if( !jrnlOpen ){ + sqlite3OsClose(pPager->jfd); + } + *pExists = (first!=0); + }else if( rc==SQLITE_CANTOPEN ){ + /* If we cannot open the rollback journal file in order to see if + ** it has a zero header, that might be due to an I/O error, or + ** it might be due to the race condition described above and in + ** ticket #3883. Either way, assume that the journal is hot. + ** This might be a false positive. But if it is, then the + ** automatic journal playback and recovery mechanism will deal + ** with it under an EXCLUSIVE lock where we do not need to + ** worry so much with race conditions. + */ + *pExists = 1; + rc = SQLITE_OK; + } + } + } + } + } + + return rc; +} + +/* +** This function is called to obtain a shared lock on the database file. +** It is illegal to call sqlite3PagerGet() until after this function +** has been successfully called. If a shared-lock is already held when +** this function is called, it is a no-op. +** +** The following operations are also performed by this function. +** +** 1) If the pager is currently in PAGER_OPEN state (no lock held +** on the database file), then an attempt is made to obtain a +** SHARED lock on the database file. Immediately after obtaining +** the SHARED lock, the file-system is checked for a hot-journal, +** which is played back if present. Following any hot-journal +** rollback, the contents of the cache are validated by checking +** the 'change-counter' field of the database file header and +** discarded if they are found to be invalid. +** +** 2) If the pager is running in exclusive-mode, and there are currently +** no outstanding references to any pages, and is in the error state, +** then an attempt is made to clear the error state by discarding +** the contents of the page cache and rolling back any open journal +** file. +** +** If everything is successful, SQLITE_OK is returned. If an IO error +** occurs while locking the database, checking for a hot-journal file or +** rolling back a journal file, the IO error code is returned. +*/ +SQLITE_PRIVATE int sqlite3PagerSharedLock(Pager *pPager){ + int rc = SQLITE_OK; /* Return code */ + + /* This routine is only called from b-tree and only when there are no + ** outstanding pages. This implies that the pager state should either + ** be OPEN or READER. READER is only possible if the pager is or was in + ** exclusive access mode. */ + assert( sqlite3PcacheRefCount(pPager->pPCache)==0 ); + assert( assert_pager_state(pPager) ); + assert( pPager->eState==PAGER_OPEN || pPager->eState==PAGER_READER ); + assert( pPager->errCode==SQLITE_OK ); + + if( !pagerUseWal(pPager) && pPager->eState==PAGER_OPEN ){ + int bHotJournal = 1; /* True if there exists a hot journal-file */ + + assert( !MEMDB ); + assert( pPager->tempFile==0 || pPager->eLock==EXCLUSIVE_LOCK ); + + rc = pager_wait_on_lock(pPager, SHARED_LOCK); + if( rc!=SQLITE_OK ){ + assert( pPager->eLock==NO_LOCK || pPager->eLock==UNKNOWN_LOCK ); + goto failed; + } + + /* If a journal file exists, and there is no RESERVED lock on the + ** database file, then it either needs to be played back or deleted. + */ + if( pPager->eLock<=SHARED_LOCK ){ + rc = hasHotJournal(pPager, &bHotJournal); + } + if( rc!=SQLITE_OK ){ + goto failed; + } + if( bHotJournal ){ + if( pPager->readOnly ){ + rc = SQLITE_READONLY_ROLLBACK; + goto failed; + } + + /* Get an EXCLUSIVE lock on the database file. At this point it is + ** important that a RESERVED lock is not obtained on the way to the + ** EXCLUSIVE lock. If it were, another process might open the + ** database file, detect the RESERVED lock, and conclude that the + ** database is safe to read while this process is still rolling the + ** hot-journal back. + ** + ** Because the intermediate RESERVED lock is not requested, any + ** other process attempting to access the database file will get to + ** this point in the code and fail to obtain its own EXCLUSIVE lock + ** on the database file. + ** + ** Unless the pager is in locking_mode=exclusive mode, the lock is + ** downgraded to SHARED_LOCK before this function returns. + */ + rc = pagerLockDb(pPager, EXCLUSIVE_LOCK); + if( rc!=SQLITE_OK ){ + goto failed; + } + + /* If it is not already open and the file exists on disk, open the + ** journal for read/write access. Write access is required because + ** in exclusive-access mode the file descriptor will be kept open + ** and possibly used for a transaction later on. Also, write-access + ** is usually required to finalize the journal in journal_mode=persist + ** mode (and also for journal_mode=truncate on some systems). + ** + ** If the journal does not exist, it usually means that some + ** other connection managed to get in and roll it back before + ** this connection obtained the exclusive lock above. Or, it + ** may mean that the pager was in the error-state when this + ** function was called and the journal file does not exist. + */ + if( !isOpen(pPager->jfd) ){ + sqlite3_vfs * const pVfs = pPager->pVfs; + int bExists; /* True if journal file exists */ + rc = sqlite3OsAccess( + pVfs, pPager->zJournal, SQLITE_ACCESS_EXISTS, &bExists); + if( rc==SQLITE_OK && bExists ){ + int fout = 0; + int f = SQLITE_OPEN_READWRITE|SQLITE_OPEN_MAIN_JOURNAL; + assert( !pPager->tempFile ); + rc = sqlite3OsOpen(pVfs, pPager->zJournal, pPager->jfd, f, &fout); + assert( rc!=SQLITE_OK || isOpen(pPager->jfd) ); + if( rc==SQLITE_OK && fout&SQLITE_OPEN_READONLY ){ + rc = SQLITE_CANTOPEN_BKPT; + sqlite3OsClose(pPager->jfd); + } + } + } + + /* Playback and delete the journal. Drop the database write + ** lock and reacquire the read lock. Purge the cache before + ** playing back the hot-journal so that we don't end up with + ** an inconsistent cache. Sync the hot journal before playing + ** it back since the process that crashed and left the hot journal + ** probably did not sync it and we are required to always sync + ** the journal before playing it back. + */ + if( isOpen(pPager->jfd) ){ + assert( rc==SQLITE_OK ); + rc = pagerSyncHotJournal(pPager); + if( rc==SQLITE_OK ){ + rc = pager_playback(pPager, !pPager->tempFile); + pPager->eState = PAGER_OPEN; + } + }else if( !pPager->exclusiveMode ){ + pagerUnlockDb(pPager, SHARED_LOCK); + } + + if( rc!=SQLITE_OK ){ + /* This branch is taken if an error occurs while trying to open + ** or roll back a hot-journal while holding an EXCLUSIVE lock. The + ** pager_unlock() routine will be called before returning to unlock + ** the file. If the unlock attempt fails, then Pager.eLock must be + ** set to UNKNOWN_LOCK (see the comment above the #define for + ** UNKNOWN_LOCK above for an explanation). + ** + ** In order to get pager_unlock() to do this, set Pager.eState to + ** PAGER_ERROR now. This is not actually counted as a transition + ** to ERROR state in the state diagram at the top of this file, + ** since we know that the same call to pager_unlock() will very + ** shortly transition the pager object to the OPEN state. Calling + ** assert_pager_state() would fail now, as it should not be possible + ** to be in ERROR state when there are zero outstanding page + ** references. + */ + pager_error(pPager, rc); + goto failed; + } + + assert( pPager->eState==PAGER_OPEN ); + assert( (pPager->eLock==SHARED_LOCK) + || (pPager->exclusiveMode && pPager->eLock>SHARED_LOCK) + ); + } + + if( !pPager->tempFile && pPager->hasHeldSharedLock ){ + /* The shared-lock has just been acquired then check to + ** see if the database has been modified. If the database has changed, + ** flush the cache. The hasHeldSharedLock flag prevents this from + ** occurring on the very first access to a file, in order to save a + ** single unnecessary sqlite3OsRead() call at the start-up. + ** + ** Database changes are detected by looking at 15 bytes beginning + ** at offset 24 into the file. The first 4 of these 16 bytes are + ** a 32-bit counter that is incremented with each change. The + ** other bytes change randomly with each file change when + ** a codec is in use. + ** + ** There is a vanishingly small chance that a change will not be + ** detected. The chance of an undetected change is so small that + ** it can be neglected. + */ + Pgno nPage = 0; + char dbFileVers[sizeof(pPager->dbFileVers)]; + + rc = pagerPagecount(pPager, &nPage); + if( rc ) goto failed; + + if( nPage>0 ){ + IOTRACE(("CKVERS %p %d\n", pPager, sizeof(dbFileVers))); + rc = sqlite3OsRead(pPager->fd, &dbFileVers, sizeof(dbFileVers), 24); + if( rc!=SQLITE_OK && rc!=SQLITE_IOERR_SHORT_READ ){ + goto failed; + } + }else{ + memset(dbFileVers, 0, sizeof(dbFileVers)); + } + + if( memcmp(pPager->dbFileVers, dbFileVers, sizeof(dbFileVers))!=0 ){ + pager_reset(pPager); + + /* Unmap the database file. It is possible that external processes + ** may have truncated the database file and then extended it back + ** to its original size while this process was not holding a lock. + ** In this case there may exist a Pager.pMap mapping that appears + ** to be the right size but is not actually valid. Avoid this + ** possibility by unmapping the db here. */ + if( USEFETCH(pPager) ){ + sqlite3OsUnfetch(pPager->fd, 0, 0); + } + } + } + + /* If there is a WAL file in the file-system, open this database in WAL + ** mode. Otherwise, the following function call is a no-op. + */ + rc = pagerOpenWalIfPresent(pPager); +#ifndef SQLITE_OMIT_WAL + assert( pPager->pWal==0 || rc==SQLITE_OK ); +#endif + } + + if( pagerUseWal(pPager) ){ + assert( rc==SQLITE_OK ); + rc = pagerBeginReadTransaction(pPager); + } + + if( pPager->tempFile==0 && pPager->eState==PAGER_OPEN && rc==SQLITE_OK ){ + rc = pagerPagecount(pPager, &pPager->dbSize); + } + + failed: + if( rc!=SQLITE_OK ){ + assert( !MEMDB ); + pager_unlock(pPager); + assert( pPager->eState==PAGER_OPEN ); + }else{ + pPager->eState = PAGER_READER; + pPager->hasHeldSharedLock = 1; + } + return rc; +} + +/* +** If the reference count has reached zero, rollback any active +** transaction and unlock the pager. +** +** Except, in locking_mode=EXCLUSIVE when there is nothing to in +** the rollback journal, the unlock is not performed and there is +** nothing to rollback, so this routine is a no-op. +*/ +static void pagerUnlockIfUnused(Pager *pPager){ + if( pPager->nMmapOut==0 && (sqlite3PcacheRefCount(pPager->pPCache)==0) ){ + pagerUnlockAndRollback(pPager); + } +} + +/* +** Acquire a reference to page number pgno in pager pPager (a page +** reference has type DbPage*). If the requested reference is +** successfully obtained, it is copied to *ppPage and SQLITE_OK returned. +** +** If the requested page is already in the cache, it is returned. +** Otherwise, a new page object is allocated and populated with data +** read from the database file. In some cases, the pcache module may +** choose not to allocate a new page object and may reuse an existing +** object with no outstanding references. +** +** The extra data appended to a page is always initialized to zeros the +** first time a page is loaded into memory. If the page requested is +** already in the cache when this function is called, then the extra +** data is left as it was when the page object was last used. +** +** If the database image is smaller than the requested page or if a +** non-zero value is passed as the noContent parameter and the +** requested page is not already stored in the cache, then no +** actual disk read occurs. In this case the memory image of the +** page is initialized to all zeros. +** +** If noContent is true, it means that we do not care about the contents +** of the page. This occurs in two scenarios: +** +** a) When reading a free-list leaf page from the database, and +** +** b) When a savepoint is being rolled back and we need to load +** a new page into the cache to be filled with the data read +** from the savepoint journal. +** +** If noContent is true, then the data returned is zeroed instead of +** being read from the database. Additionally, the bits corresponding +** to pgno in Pager.pInJournal (bitvec of pages already written to the +** journal file) and the PagerSavepoint.pInSavepoint bitvecs of any open +** savepoints are set. This means if the page is made writable at any +** point in the future, using a call to sqlite3PagerWrite(), its contents +** will not be journaled. This saves IO. +** +** The acquisition might fail for several reasons. In all cases, +** an appropriate error code is returned and *ppPage is set to NULL. +** +** See also sqlite3PagerLookup(). Both this routine and Lookup() attempt +** to find a page in the in-memory cache first. If the page is not already +** in memory, this routine goes to disk to read it in whereas Lookup() +** just returns 0. This routine acquires a read-lock the first time it +** has to go to disk, and could also playback an old journal if necessary. +** Since Lookup() never goes to disk, it never has to deal with locks +** or journal files. +*/ +SQLITE_PRIVATE int sqlite3PagerGet( + Pager *pPager, /* The pager open on the database file */ + Pgno pgno, /* Page number to fetch */ + DbPage **ppPage, /* Write a pointer to the page here */ + int flags /* PAGER_GET_XXX flags */ +){ + int rc = SQLITE_OK; + PgHdr *pPg = 0; + u32 iFrame = 0; /* Frame to read from WAL file */ + const int noContent = (flags & PAGER_GET_NOCONTENT); + + /* It is acceptable to use a read-only (mmap) page for any page except + ** page 1 if there is no write-transaction open or the ACQUIRE_READONLY + ** flag was specified by the caller. And so long as the db is not a + ** temporary or in-memory database. */ + const int bMmapOk = (pgno>1 && USEFETCH(pPager) + && (pPager->eState==PAGER_READER || (flags & PAGER_GET_READONLY)) +#ifdef SQLITE_HAS_CODEC + && pPager->xCodec==0 +#endif + ); + + /* Optimization note: Adding the "pgno<=1" term before "pgno==0" here + ** allows the compiler optimizer to reuse the results of the "pgno>1" + ** test in the previous statement, and avoid testing pgno==0 in the + ** common case where pgno is large. */ + if( pgno<=1 && pgno==0 ){ + return SQLITE_CORRUPT_BKPT; + } + assert( pPager->eState>=PAGER_READER ); + assert( assert_pager_state(pPager) ); + assert( noContent==0 || bMmapOk==0 ); + + assert( pPager->hasHeldSharedLock==1 ); + + /* If the pager is in the error state, return an error immediately. + ** Otherwise, request the page from the PCache layer. */ + if( pPager->errCode!=SQLITE_OK ){ + rc = pPager->errCode; + }else{ + if( bMmapOk && pagerUseWal(pPager) ){ + rc = sqlite3WalFindFrame(pPager->pWal, pgno, &iFrame); + if( rc!=SQLITE_OK ) goto pager_acquire_err; + } + + if( bMmapOk && iFrame==0 ){ + void *pData = 0; + + rc = sqlite3OsFetch(pPager->fd, + (i64)(pgno-1) * pPager->pageSize, pPager->pageSize, &pData + ); + + if( rc==SQLITE_OK && pData ){ + if( pPager->eState>PAGER_READER || pPager->tempFile ){ + pPg = sqlite3PagerLookup(pPager, pgno); + } + if( pPg==0 ){ + rc = pagerAcquireMapPage(pPager, pgno, pData, &pPg); + }else{ + sqlite3OsUnfetch(pPager->fd, (i64)(pgno-1)*pPager->pageSize, pData); + } + if( pPg ){ + assert( rc==SQLITE_OK ); + *ppPage = pPg; + return SQLITE_OK; + } + } + if( rc!=SQLITE_OK ){ + goto pager_acquire_err; + } + } + + { + sqlite3_pcache_page *pBase; + pBase = sqlite3PcacheFetch(pPager->pPCache, pgno, 3); + if( pBase==0 ){ + rc = sqlite3PcacheFetchStress(pPager->pPCache, pgno, &pBase); + if( rc!=SQLITE_OK ) goto pager_acquire_err; + if( pBase==0 ){ + pPg = *ppPage = 0; + rc = SQLITE_NOMEM_BKPT; + goto pager_acquire_err; + } + } + pPg = *ppPage = sqlite3PcacheFetchFinish(pPager->pPCache, pgno, pBase); + assert( pPg!=0 ); + } + } + + if( rc!=SQLITE_OK ){ + /* Either the call to sqlite3PcacheFetch() returned an error or the + ** pager was already in the error-state when this function was called. + ** Set pPg to 0 and jump to the exception handler. */ + pPg = 0; + goto pager_acquire_err; + } + assert( pPg==(*ppPage) ); + assert( pPg->pgno==pgno ); + assert( pPg->pPager==pPager || pPg->pPager==0 ); + + if( pPg->pPager && !noContent ){ + /* In this case the pcache already contains an initialized copy of + ** the page. Return without further ado. */ + assert( pgno<=PAGER_MAX_PGNO && pgno!=PAGER_MJ_PGNO(pPager) ); + pPager->aStat[PAGER_STAT_HIT]++; + return SQLITE_OK; + + }else{ + /* The pager cache has created a new page. Its content needs to + ** be initialized. */ + + pPg->pPager = pPager; + + /* The maximum page number is 2^31. Return SQLITE_CORRUPT if a page + ** number greater than this, or the unused locking-page, is requested. */ + if( pgno>PAGER_MAX_PGNO || pgno==PAGER_MJ_PGNO(pPager) ){ + rc = SQLITE_CORRUPT_BKPT; + goto pager_acquire_err; + } + + assert( !isOpen(pPager->fd) || !MEMDB ); + if( !isOpen(pPager->fd) || pPager->dbSizepPager->mxPgno ){ + rc = SQLITE_FULL; + goto pager_acquire_err; + } + if( noContent ){ + /* Failure to set the bits in the InJournal bit-vectors is benign. + ** It merely means that we might do some extra work to journal a + ** page that does not need to be journaled. Nevertheless, be sure + ** to test the case where a malloc error occurs while trying to set + ** a bit in a bit vector. + */ + sqlite3BeginBenignMalloc(); + if( pgno<=pPager->dbOrigSize ){ + TESTONLY( rc = ) sqlite3BitvecSet(pPager->pInJournal, pgno); + testcase( rc==SQLITE_NOMEM ); + } + TESTONLY( rc = ) addToSavepointBitvecs(pPager, pgno); + testcase( rc==SQLITE_NOMEM ); + sqlite3EndBenignMalloc(); + } + memset(pPg->pData, 0, pPager->pageSize); + IOTRACE(("ZERO %p %d\n", pPager, pgno)); + }else{ + if( pagerUseWal(pPager) && bMmapOk==0 ){ + rc = sqlite3WalFindFrame(pPager->pWal, pgno, &iFrame); + if( rc!=SQLITE_OK ) goto pager_acquire_err; + } + assert( pPg->pPager==pPager ); + pPager->aStat[PAGER_STAT_MISS]++; + rc = readDbPage(pPg, iFrame); + if( rc!=SQLITE_OK ){ + goto pager_acquire_err; + } + } + pager_set_pagehash(pPg); + } + + return SQLITE_OK; + +pager_acquire_err: + assert( rc!=SQLITE_OK ); + if( pPg ){ + sqlite3PcacheDrop(pPg); + } + pagerUnlockIfUnused(pPager); + + *ppPage = 0; + return rc; +} + +/* +** Acquire a page if it is already in the in-memory cache. Do +** not read the page from disk. Return a pointer to the page, +** or 0 if the page is not in cache. +** +** See also sqlite3PagerGet(). The difference between this routine +** and sqlite3PagerGet() is that _get() will go to the disk and read +** in the page if the page is not already in cache. This routine +** returns NULL if the page is not in cache or if a disk I/O error +** has ever happened. +*/ +SQLITE_PRIVATE DbPage *sqlite3PagerLookup(Pager *pPager, Pgno pgno){ + sqlite3_pcache_page *pPage; + assert( pPager!=0 ); + assert( pgno!=0 ); + assert( pPager->pPCache!=0 ); + pPage = sqlite3PcacheFetch(pPager->pPCache, pgno, 0); + assert( pPage==0 || pPager->hasHeldSharedLock ); + if( pPage==0 ) return 0; + return sqlite3PcacheFetchFinish(pPager->pPCache, pgno, pPage); +} + +/* +** Release a page reference. +** +** If the number of references to the page drop to zero, then the +** page is added to the LRU list. When all references to all pages +** are released, a rollback occurs and the lock on the database is +** removed. +*/ +SQLITE_PRIVATE void sqlite3PagerUnrefNotNull(DbPage *pPg){ + Pager *pPager; + assert( pPg!=0 ); + pPager = pPg->pPager; + if( pPg->flags & PGHDR_MMAP ){ + pagerReleaseMapPage(pPg); + }else{ + sqlite3PcacheRelease(pPg); + } + pagerUnlockIfUnused(pPager); +} +SQLITE_PRIVATE void sqlite3PagerUnref(DbPage *pPg){ + if( pPg ) sqlite3PagerUnrefNotNull(pPg); +} + +/* +** This function is called at the start of every write transaction. +** There must already be a RESERVED or EXCLUSIVE lock on the database +** file when this routine is called. +** +** Open the journal file for pager pPager and write a journal header +** to the start of it. If there are active savepoints, open the sub-journal +** as well. This function is only used when the journal file is being +** opened to write a rollback log for a transaction. It is not used +** when opening a hot journal file to roll it back. +** +** If the journal file is already open (as it may be in exclusive mode), +** then this function just writes a journal header to the start of the +** already open file. +** +** Whether or not the journal file is opened by this function, the +** Pager.pInJournal bitvec structure is allocated. +** +** Return SQLITE_OK if everything is successful. Otherwise, return +** SQLITE_NOMEM if the attempt to allocate Pager.pInJournal fails, or +** an IO error code if opening or writing the journal file fails. +*/ +static int pager_open_journal(Pager *pPager){ + int rc = SQLITE_OK; /* Return code */ + sqlite3_vfs * const pVfs = pPager->pVfs; /* Local cache of vfs pointer */ + + assert( pPager->eState==PAGER_WRITER_LOCKED ); + assert( assert_pager_state(pPager) ); + assert( pPager->pInJournal==0 ); + + /* If already in the error state, this function is a no-op. But on + ** the other hand, this routine is never called if we are already in + ** an error state. */ + if( NEVER(pPager->errCode) ) return pPager->errCode; + + if( !pagerUseWal(pPager) && pPager->journalMode!=PAGER_JOURNALMODE_OFF ){ + pPager->pInJournal = sqlite3BitvecCreate(pPager->dbSize); + if( pPager->pInJournal==0 ){ + return SQLITE_NOMEM_BKPT; + } + + /* Open the journal file if it is not already open. */ + if( !isOpen(pPager->jfd) ){ + if( pPager->journalMode==PAGER_JOURNALMODE_MEMORY ){ + sqlite3MemJournalOpen(pPager->jfd); + }else{ + int flags = SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE; + int nSpill; + + if( pPager->tempFile ){ + flags |= (SQLITE_OPEN_DELETEONCLOSE|SQLITE_OPEN_TEMP_JOURNAL); + nSpill = sqlite3Config.nStmtSpill; + }else{ + flags |= SQLITE_OPEN_MAIN_JOURNAL; + nSpill = jrnlBufferSize(pPager); + } + + /* Verify that the database still has the same name as it did when + ** it was originally opened. */ + rc = databaseIsUnmoved(pPager); + if( rc==SQLITE_OK ){ + rc = sqlite3JournalOpen ( + pVfs, pPager->zJournal, pPager->jfd, flags, nSpill + ); + } + } + assert( rc!=SQLITE_OK || isOpen(pPager->jfd) ); + } + + + /* Write the first journal header to the journal file and open + ** the sub-journal if necessary. + */ + if( rc==SQLITE_OK ){ + /* TODO: Check if all of these are really required. */ + pPager->nRec = 0; + pPager->journalOff = 0; + pPager->setMaster = 0; + pPager->journalHdr = 0; + rc = writeJournalHdr(pPager); + } + } + + if( rc!=SQLITE_OK ){ + sqlite3BitvecDestroy(pPager->pInJournal); + pPager->pInJournal = 0; + }else{ + assert( pPager->eState==PAGER_WRITER_LOCKED ); + pPager->eState = PAGER_WRITER_CACHEMOD; + } + + return rc; +} + +/* +** Begin a write-transaction on the specified pager object. If a +** write-transaction has already been opened, this function is a no-op. +** +** If the exFlag argument is false, then acquire at least a RESERVED +** lock on the database file. If exFlag is true, then acquire at least +** an EXCLUSIVE lock. If such a lock is already held, no locking +** functions need be called. +** +** If the subjInMemory argument is non-zero, then any sub-journal opened +** within this transaction will be opened as an in-memory file. This +** has no effect if the sub-journal is already opened (as it may be when +** running in exclusive mode) or if the transaction does not require a +** sub-journal. If the subjInMemory argument is zero, then any required +** sub-journal is implemented in-memory if pPager is an in-memory database, +** or using a temporary file otherwise. +*/ +SQLITE_PRIVATE int sqlite3PagerBegin(Pager *pPager, int exFlag, int subjInMemory){ + int rc = SQLITE_OK; + + if( pPager->errCode ) return pPager->errCode; + assert( pPager->eState>=PAGER_READER && pPager->eStatesubjInMemory = (u8)subjInMemory; + + if( ALWAYS(pPager->eState==PAGER_READER) ){ + assert( pPager->pInJournal==0 ); + + if( pagerUseWal(pPager) ){ + /* If the pager is configured to use locking_mode=exclusive, and an + ** exclusive lock on the database is not already held, obtain it now. + */ + if( pPager->exclusiveMode && sqlite3WalExclusiveMode(pPager->pWal, -1) ){ + rc = pagerLockDb(pPager, EXCLUSIVE_LOCK); + if( rc!=SQLITE_OK ){ + return rc; + } + (void)sqlite3WalExclusiveMode(pPager->pWal, 1); + } + + /* Grab the write lock on the log file. If successful, upgrade to + ** PAGER_RESERVED state. Otherwise, return an error code to the caller. + ** The busy-handler is not invoked if another connection already + ** holds the write-lock. If possible, the upper layer will call it. + */ + rc = sqlite3WalBeginWriteTransaction(pPager->pWal); + }else{ + /* Obtain a RESERVED lock on the database file. If the exFlag parameter + ** is true, then immediately upgrade this to an EXCLUSIVE lock. The + ** busy-handler callback can be used when upgrading to the EXCLUSIVE + ** lock, but not when obtaining the RESERVED lock. + */ + rc = pagerLockDb(pPager, RESERVED_LOCK); + if( rc==SQLITE_OK && exFlag ){ + rc = pager_wait_on_lock(pPager, EXCLUSIVE_LOCK); + } + } + + if( rc==SQLITE_OK ){ + /* Change to WRITER_LOCKED state. + ** + ** WAL mode sets Pager.eState to PAGER_WRITER_LOCKED or CACHEMOD + ** when it has an open transaction, but never to DBMOD or FINISHED. + ** This is because in those states the code to roll back savepoint + ** transactions may copy data from the sub-journal into the database + ** file as well as into the page cache. Which would be incorrect in + ** WAL mode. + */ + pPager->eState = PAGER_WRITER_LOCKED; + pPager->dbHintSize = pPager->dbSize; + pPager->dbFileSize = pPager->dbSize; + pPager->dbOrigSize = pPager->dbSize; + pPager->journalOff = 0; + } + + assert( rc==SQLITE_OK || pPager->eState==PAGER_READER ); + assert( rc!=SQLITE_OK || pPager->eState==PAGER_WRITER_LOCKED ); + assert( assert_pager_state(pPager) ); + } + + PAGERTRACE(("TRANSACTION %d\n", PAGERID(pPager))); + return rc; +} + +/* +** Write page pPg onto the end of the rollback journal. +*/ +static SQLITE_NOINLINE int pagerAddPageToRollbackJournal(PgHdr *pPg){ + Pager *pPager = pPg->pPager; + int rc; + u32 cksum; + char *pData2; + i64 iOff = pPager->journalOff; + + /* We should never write to the journal file the page that + ** contains the database locks. The following assert verifies + ** that we do not. */ + assert( pPg->pgno!=PAGER_MJ_PGNO(pPager) ); + + assert( pPager->journalHdr<=pPager->journalOff ); + CODEC2(pPager, pPg->pData, pPg->pgno, 7, return SQLITE_NOMEM_BKPT, pData2); + cksum = pager_cksum(pPager, (u8*)pData2); + + /* Even if an IO or diskfull error occurs while journalling the + ** page in the block above, set the need-sync flag for the page. + ** Otherwise, when the transaction is rolled back, the logic in + ** playback_one_page() will think that the page needs to be restored + ** in the database file. And if an IO error occurs while doing so, + ** then corruption may follow. + */ + pPg->flags |= PGHDR_NEED_SYNC; + + rc = write32bits(pPager->jfd, iOff, pPg->pgno); + if( rc!=SQLITE_OK ) return rc; + rc = sqlite3OsWrite(pPager->jfd, pData2, pPager->pageSize, iOff+4); + if( rc!=SQLITE_OK ) return rc; + rc = write32bits(pPager->jfd, iOff+pPager->pageSize+4, cksum); + if( rc!=SQLITE_OK ) return rc; + + IOTRACE(("JOUT %p %d %lld %d\n", pPager, pPg->pgno, + pPager->journalOff, pPager->pageSize)); + PAGER_INCR(sqlite3_pager_writej_count); + PAGERTRACE(("JOURNAL %d page %d needSync=%d hash(%08x)\n", + PAGERID(pPager), pPg->pgno, + ((pPg->flags&PGHDR_NEED_SYNC)?1:0), pager_pagehash(pPg))); + + pPager->journalOff += 8 + pPager->pageSize; + pPager->nRec++; + assert( pPager->pInJournal!=0 ); + rc = sqlite3BitvecSet(pPager->pInJournal, pPg->pgno); + testcase( rc==SQLITE_NOMEM ); + assert( rc==SQLITE_OK || rc==SQLITE_NOMEM ); + rc |= addToSavepointBitvecs(pPager, pPg->pgno); + assert( rc==SQLITE_OK || rc==SQLITE_NOMEM ); + return rc; +} + +/* +** Mark a single data page as writeable. The page is written into the +** main journal or sub-journal as required. If the page is written into +** one of the journals, the corresponding bit is set in the +** Pager.pInJournal bitvec and the PagerSavepoint.pInSavepoint bitvecs +** of any open savepoints as appropriate. +*/ +static int pager_write(PgHdr *pPg){ + Pager *pPager = pPg->pPager; + int rc = SQLITE_OK; + + /* This routine is not called unless a write-transaction has already + ** been started. The journal file may or may not be open at this point. + ** It is never called in the ERROR state. + */ + assert( pPager->eState==PAGER_WRITER_LOCKED + || pPager->eState==PAGER_WRITER_CACHEMOD + || pPager->eState==PAGER_WRITER_DBMOD + ); + assert( assert_pager_state(pPager) ); + assert( pPager->errCode==0 ); + assert( pPager->readOnly==0 ); + CHECK_PAGE(pPg); + + /* The journal file needs to be opened. Higher level routines have already + ** obtained the necessary locks to begin the write-transaction, but the + ** rollback journal might not yet be open. Open it now if this is the case. + ** + ** This is done before calling sqlite3PcacheMakeDirty() on the page. + ** Otherwise, if it were done after calling sqlite3PcacheMakeDirty(), then + ** an error might occur and the pager would end up in WRITER_LOCKED state + ** with pages marked as dirty in the cache. + */ + if( pPager->eState==PAGER_WRITER_LOCKED ){ + rc = pager_open_journal(pPager); + if( rc!=SQLITE_OK ) return rc; + } + assert( pPager->eState>=PAGER_WRITER_CACHEMOD ); + assert( assert_pager_state(pPager) ); + + /* Mark the page that is about to be modified as dirty. */ + sqlite3PcacheMakeDirty(pPg); + + /* If a rollback journal is in use, them make sure the page that is about + ** to change is in the rollback journal, or if the page is a new page off + ** then end of the file, make sure it is marked as PGHDR_NEED_SYNC. + */ + assert( (pPager->pInJournal!=0) == isOpen(pPager->jfd) ); + if( pPager->pInJournal!=0 + && sqlite3BitvecTestNotNull(pPager->pInJournal, pPg->pgno)==0 + ){ + assert( pagerUseWal(pPager)==0 ); + if( pPg->pgno<=pPager->dbOrigSize ){ + rc = pagerAddPageToRollbackJournal(pPg); + if( rc!=SQLITE_OK ){ + return rc; + } + }else{ + if( pPager->eState!=PAGER_WRITER_DBMOD ){ + pPg->flags |= PGHDR_NEED_SYNC; + } + PAGERTRACE(("APPEND %d page %d needSync=%d\n", + PAGERID(pPager), pPg->pgno, + ((pPg->flags&PGHDR_NEED_SYNC)?1:0))); + } + } + + /* The PGHDR_DIRTY bit is set above when the page was added to the dirty-list + ** and before writing the page into the rollback journal. Wait until now, + ** after the page has been successfully journalled, before setting the + ** PGHDR_WRITEABLE bit that indicates that the page can be safely modified. + */ + pPg->flags |= PGHDR_WRITEABLE; + + /* If the statement journal is open and the page is not in it, + ** then write the page into the statement journal. + */ + if( pPager->nSavepoint>0 ){ + rc = subjournalPageIfRequired(pPg); + } + + /* Update the database size and return. */ + if( pPager->dbSizepgno ){ + pPager->dbSize = pPg->pgno; + } + return rc; +} + +/* +** This is a variant of sqlite3PagerWrite() that runs when the sector size +** is larger than the page size. SQLite makes the (reasonable) assumption that +** all bytes of a sector are written together by hardware. Hence, all bytes of +** a sector need to be journalled in case of a power loss in the middle of +** a write. +** +** Usually, the sector size is less than or equal to the page size, in which +** case pages can be individually written. This routine only runs in the +** exceptional case where the page size is smaller than the sector size. +*/ +static SQLITE_NOINLINE int pagerWriteLargeSector(PgHdr *pPg){ + int rc = SQLITE_OK; /* Return code */ + Pgno nPageCount; /* Total number of pages in database file */ + Pgno pg1; /* First page of the sector pPg is located on. */ + int nPage = 0; /* Number of pages starting at pg1 to journal */ + int ii; /* Loop counter */ + int needSync = 0; /* True if any page has PGHDR_NEED_SYNC */ + Pager *pPager = pPg->pPager; /* The pager that owns pPg */ + Pgno nPagePerSector = (pPager->sectorSize/pPager->pageSize); + + /* Set the doNotSpill NOSYNC bit to 1. This is because we cannot allow + ** a journal header to be written between the pages journaled by + ** this function. + */ + assert( !MEMDB ); + assert( (pPager->doNotSpill & SPILLFLAG_NOSYNC)==0 ); + pPager->doNotSpill |= SPILLFLAG_NOSYNC; + + /* This trick assumes that both the page-size and sector-size are + ** an integer power of 2. It sets variable pg1 to the identifier + ** of the first page of the sector pPg is located on. + */ + pg1 = ((pPg->pgno-1) & ~(nPagePerSector-1)) + 1; + + nPageCount = pPager->dbSize; + if( pPg->pgno>nPageCount ){ + nPage = (pPg->pgno - pg1)+1; + }else if( (pg1+nPagePerSector-1)>nPageCount ){ + nPage = nPageCount+1-pg1; + }else{ + nPage = nPagePerSector; + } + assert(nPage>0); + assert(pg1<=pPg->pgno); + assert((pg1+nPage)>pPg->pgno); + + for(ii=0; iipgno || !sqlite3BitvecTest(pPager->pInJournal, pg) ){ + if( pg!=PAGER_MJ_PGNO(pPager) ){ + rc = sqlite3PagerGet(pPager, pg, &pPage, 0); + if( rc==SQLITE_OK ){ + rc = pager_write(pPage); + if( pPage->flags&PGHDR_NEED_SYNC ){ + needSync = 1; + } + sqlite3PagerUnrefNotNull(pPage); + } + } + }else if( (pPage = sqlite3PagerLookup(pPager, pg))!=0 ){ + if( pPage->flags&PGHDR_NEED_SYNC ){ + needSync = 1; + } + sqlite3PagerUnrefNotNull(pPage); + } + } + + /* If the PGHDR_NEED_SYNC flag is set for any of the nPage pages + ** starting at pg1, then it needs to be set for all of them. Because + ** writing to any of these nPage pages may damage the others, the + ** journal file must contain sync()ed copies of all of them + ** before any of them can be written out to the database file. + */ + if( rc==SQLITE_OK && needSync ){ + assert( !MEMDB ); + for(ii=0; iiflags |= PGHDR_NEED_SYNC; + sqlite3PagerUnrefNotNull(pPage); + } + } + } + + assert( (pPager->doNotSpill & SPILLFLAG_NOSYNC)!=0 ); + pPager->doNotSpill &= ~SPILLFLAG_NOSYNC; + return rc; +} + +/* +** Mark a data page as writeable. This routine must be called before +** making changes to a page. The caller must check the return value +** of this function and be careful not to change any page data unless +** this routine returns SQLITE_OK. +** +** The difference between this function and pager_write() is that this +** function also deals with the special case where 2 or more pages +** fit on a single disk sector. In this case all co-resident pages +** must have been written to the journal file before returning. +** +** If an error occurs, SQLITE_NOMEM or an IO error code is returned +** as appropriate. Otherwise, SQLITE_OK. +*/ +SQLITE_PRIVATE int sqlite3PagerWrite(PgHdr *pPg){ + Pager *pPager = pPg->pPager; + assert( (pPg->flags & PGHDR_MMAP)==0 ); + assert( pPager->eState>=PAGER_WRITER_LOCKED ); + assert( assert_pager_state(pPager) ); + if( pPager->errCode ){ + return pPager->errCode; + }else if( (pPg->flags & PGHDR_WRITEABLE)!=0 && pPager->dbSize>=pPg->pgno ){ + if( pPager->nSavepoint ) return subjournalPageIfRequired(pPg); + return SQLITE_OK; + }else if( pPager->sectorSize > (u32)pPager->pageSize ){ + assert( pPager->tempFile==0 ); + return pagerWriteLargeSector(pPg); + }else{ + return pager_write(pPg); + } +} + +/* +** Return TRUE if the page given in the argument was previously passed +** to sqlite3PagerWrite(). In other words, return TRUE if it is ok +** to change the content of the page. +*/ +#ifndef NDEBUG +SQLITE_PRIVATE int sqlite3PagerIswriteable(DbPage *pPg){ + return pPg->flags & PGHDR_WRITEABLE; +} +#endif + +/* +** 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 +** that page might be marked as dirty. This happens, for example, when +** the page has been added as a leaf of the freelist and so its +** content no longer matters. +** +** The overlying software layer calls this routine when all of the data +** on the given page is unused. The pager marks the page as clean so +** that it does not get written to disk. +** +** Tests show that this optimization can quadruple the speed of large +** DELETE operations. +** +** This optimization cannot be used with a temp-file, as the page may +** have been dirty at the start of the transaction. In that case, if +** memory pressure forces page pPg out of the cache, the data does need +** to be written out to disk so that it may be read back in if the +** current transaction is rolled back. +*/ +SQLITE_PRIVATE void sqlite3PagerDontWrite(PgHdr *pPg){ + Pager *pPager = pPg->pPager; + if( !pPager->tempFile && (pPg->flags&PGHDR_DIRTY) && pPager->nSavepoint==0 ){ + PAGERTRACE(("DONT_WRITE page %d of %d\n", pPg->pgno, PAGERID(pPager))); + IOTRACE(("CLEAN %p %d\n", pPager, pPg->pgno)) + pPg->flags |= PGHDR_DONT_WRITE; + pPg->flags &= ~PGHDR_WRITEABLE; + testcase( pPg->flags & PGHDR_NEED_SYNC ); + pager_set_pagehash(pPg); + } +} + +/* +** This routine is called to increment the value of the database file +** change-counter, stored as a 4-byte big-endian integer starting at +** byte offset 24 of the pager file. The secondary change counter at +** 92 is also updated, as is the SQLite version number at offset 96. +** +** But this only happens if the pPager->changeCountDone flag is false. +** To avoid excess churning of page 1, the update only happens once. +** See also the pager_write_changecounter() routine that does an +** unconditional update of the change counters. +** +** If the isDirectMode flag is zero, then this is done by calling +** sqlite3PagerWrite() on page 1, then modifying the contents of the +** page data. In this case the file will be updated when the current +** transaction is committed. +** +** The isDirectMode flag may only be non-zero if the library was compiled +** with the SQLITE_ENABLE_ATOMIC_WRITE macro defined. In this case, +** if isDirect is non-zero, then the database file is updated directly +** by writing an updated version of page 1 using a call to the +** sqlite3OsWrite() function. +*/ +static int pager_incr_changecounter(Pager *pPager, int isDirectMode){ + int rc = SQLITE_OK; + + assert( pPager->eState==PAGER_WRITER_CACHEMOD + || pPager->eState==PAGER_WRITER_DBMOD + ); + assert( assert_pager_state(pPager) ); + + /* Declare and initialize constant integer 'isDirect'. If the + ** atomic-write optimization is enabled in this build, then isDirect + ** is initialized to the value passed as the isDirectMode parameter + ** to this function. Otherwise, it is always set to zero. + ** + ** The idea is that if the atomic-write optimization is not + ** enabled at compile time, the compiler can omit the tests of + ** 'isDirect' below, as well as the block enclosed in the + ** "if( isDirect )" condition. + */ +#ifndef SQLITE_ENABLE_ATOMIC_WRITE +# define DIRECT_MODE 0 + assert( isDirectMode==0 ); + UNUSED_PARAMETER(isDirectMode); +#else +# define DIRECT_MODE isDirectMode +#endif + + if( !pPager->changeCountDone && ALWAYS(pPager->dbSize>0) ){ + PgHdr *pPgHdr; /* Reference to page 1 */ + + assert( !pPager->tempFile && isOpen(pPager->fd) ); + + /* Open page 1 of the file for writing. */ + rc = sqlite3PagerGet(pPager, 1, &pPgHdr, 0); + assert( pPgHdr==0 || rc==SQLITE_OK ); + + /* If page one was fetched successfully, and this function is not + ** operating in direct-mode, make page 1 writable. When not in + ** direct mode, page 1 is always held in cache and hence the PagerGet() + ** above is always successful - hence the ALWAYS on rc==SQLITE_OK. + */ + if( !DIRECT_MODE && ALWAYS(rc==SQLITE_OK) ){ + rc = sqlite3PagerWrite(pPgHdr); + } + + if( rc==SQLITE_OK ){ + /* Actually do the update of the change counter */ + pager_write_changecounter(pPgHdr); + + /* If running in direct mode, write the contents of page 1 to the file. */ + if( DIRECT_MODE ){ + const void *zBuf; + assert( pPager->dbFileSize>0 ); + CODEC2(pPager, pPgHdr->pData, 1, 6, rc=SQLITE_NOMEM_BKPT, zBuf); + if( rc==SQLITE_OK ){ + rc = sqlite3OsWrite(pPager->fd, zBuf, pPager->pageSize, 0); + pPager->aStat[PAGER_STAT_WRITE]++; + } + if( rc==SQLITE_OK ){ + /* Update the pager's copy of the change-counter. Otherwise, the + ** next time a read transaction is opened the cache will be + ** flushed (as the change-counter values will not match). */ + const void *pCopy = (const void *)&((const char *)zBuf)[24]; + memcpy(&pPager->dbFileVers, pCopy, sizeof(pPager->dbFileVers)); + pPager->changeCountDone = 1; + } + }else{ + pPager->changeCountDone = 1; + } + } + + /* Release the page reference. */ + sqlite3PagerUnref(pPgHdr); + } + return rc; +} + +/* +** Sync the database file to disk. This is a no-op for in-memory databases +** or pages with the Pager.noSync flag set. +** +** If successful, or if called on a pager for which it is a no-op, this +** function returns SQLITE_OK. Otherwise, an IO error code is returned. +*/ +SQLITE_PRIVATE int sqlite3PagerSync(Pager *pPager, const char *zMaster){ + int rc = SQLITE_OK; + + if( isOpen(pPager->fd) ){ + void *pArg = (void*)zMaster; + rc = sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_SYNC, pArg); + if( rc==SQLITE_NOTFOUND ) rc = SQLITE_OK; + } + if( rc==SQLITE_OK && !pPager->noSync ){ + assert( !MEMDB ); + rc = sqlite3OsSync(pPager->fd, pPager->syncFlags); + } + return rc; +} + +/* +** This function may only be called while a write-transaction is active in +** rollback. If the connection is in WAL mode, this call is a no-op. +** Otherwise, if the connection does not already have an EXCLUSIVE lock on +** the database file, an attempt is made to obtain one. +** +** If the EXCLUSIVE lock is already held or the attempt to obtain it is +** successful, or the connection is in WAL mode, SQLITE_OK is returned. +** Otherwise, either SQLITE_BUSY or an SQLITE_IOERR_XXX error code is +** returned. +*/ +SQLITE_PRIVATE int sqlite3PagerExclusiveLock(Pager *pPager){ + int rc = pPager->errCode; + assert( assert_pager_state(pPager) ); + if( rc==SQLITE_OK ){ + assert( pPager->eState==PAGER_WRITER_CACHEMOD + || pPager->eState==PAGER_WRITER_DBMOD + || pPager->eState==PAGER_WRITER_LOCKED + ); + assert( assert_pager_state(pPager) ); + if( 0==pagerUseWal(pPager) ){ + rc = pager_wait_on_lock(pPager, EXCLUSIVE_LOCK); + } + } + return rc; +} + +/* +** Sync the database file for the pager pPager. zMaster points to the name +** of a master journal file that should be written into the individual +** journal file. zMaster may be NULL, which is interpreted as no master +** journal (a single database transaction). +** +** This routine ensures that: +** +** * The database file change-counter is updated, +** * the journal is synced (unless the atomic-write optimization is used), +** * all dirty pages are written to the database file, +** * the database file is truncated (if required), and +** * the database file synced. +** +** The only thing that remains to commit the transaction is to finalize +** (delete, truncate or zero the first part of) the journal file (or +** delete the master journal file if specified). +** +** Note that if zMaster==NULL, this does not overwrite a previous value +** passed to an sqlite3PagerCommitPhaseOne() call. +** +** If the final parameter - noSync - is true, then the database file itself +** is not synced. The caller must call sqlite3PagerSync() directly to +** sync the database file before calling CommitPhaseTwo() to delete the +** journal file in this case. +*/ +SQLITE_PRIVATE int sqlite3PagerCommitPhaseOne( + Pager *pPager, /* Pager object */ + const char *zMaster, /* If not NULL, the master journal name */ + int noSync /* True to omit the xSync on the db file */ +){ + int rc = SQLITE_OK; /* Return code */ + + assert( pPager->eState==PAGER_WRITER_LOCKED + || pPager->eState==PAGER_WRITER_CACHEMOD + || pPager->eState==PAGER_WRITER_DBMOD + || pPager->eState==PAGER_ERROR + ); + assert( assert_pager_state(pPager) ); + + /* If a prior error occurred, report that error again. */ + if( NEVER(pPager->errCode) ) return pPager->errCode; + + /* Provide the ability to easily simulate an I/O error during testing */ + if( sqlite3FaultSim(400) ) return SQLITE_IOERR; + + PAGERTRACE(("DATABASE SYNC: File=%s zMaster=%s nSize=%d\n", + pPager->zFilename, zMaster, pPager->dbSize)); + + /* If no database changes have been made, return early. */ + if( pPager->eStatetempFile ); + assert( isOpen(pPager->fd) || pPager->tempFile ); + if( 0==pagerFlushOnCommit(pPager, 1) ){ + /* If this is an in-memory db, or no pages have been written to, or this + ** function has already been called, it is mostly a no-op. However, any + ** backup in progress needs to be restarted. */ + sqlite3BackupRestart(pPager->pBackup); + }else{ + if( pagerUseWal(pPager) ){ + PgHdr *pList = sqlite3PcacheDirtyList(pPager->pPCache); + PgHdr *pPageOne = 0; + if( pList==0 ){ + /* Must have at least one page for the WAL commit flag. + ** Ticket [2d1a5c67dfc2363e44f29d9bbd57f] 2011-05-18 */ + rc = sqlite3PagerGet(pPager, 1, &pPageOne, 0); + pList = pPageOne; + pList->pDirty = 0; + } + assert( rc==SQLITE_OK ); + if( ALWAYS(pList) ){ + rc = pagerWalFrames(pPager, pList, pPager->dbSize, 1); + } + sqlite3PagerUnref(pPageOne); + if( rc==SQLITE_OK ){ + sqlite3PcacheCleanAll(pPager->pPCache); + } + }else{ + /* The following block updates the change-counter. Exactly how it + ** does this depends on whether or not the atomic-update optimization + ** was enabled at compile time, and if this transaction meets the + ** runtime criteria to use the operation: + ** + ** * The file-system supports the atomic-write property for + ** blocks of size page-size, and + ** * This commit is not part of a multi-file transaction, and + ** * Exactly one page has been modified and store in the journal file. + ** + ** If the optimization was not enabled at compile time, then the + ** pager_incr_changecounter() function is called to update the change + ** counter in 'indirect-mode'. If the optimization is compiled in but + ** is not applicable to this transaction, call sqlite3JournalCreate() + ** to make sure the journal file has actually been created, then call + ** pager_incr_changecounter() to update the change-counter in indirect + ** mode. + ** + ** Otherwise, if the optimization is both enabled and applicable, + ** then call pager_incr_changecounter() to update the change-counter + ** in 'direct' mode. In this case the journal file will never be + ** created for this transaction. + */ + #ifdef SQLITE_ENABLE_ATOMIC_WRITE + PgHdr *pPg; + assert( isOpen(pPager->jfd) + || pPager->journalMode==PAGER_JOURNALMODE_OFF + || pPager->journalMode==PAGER_JOURNALMODE_WAL + ); + if( !zMaster && isOpen(pPager->jfd) + && pPager->journalOff==jrnlBufferSize(pPager) + && pPager->dbSize>=pPager->dbOrigSize + && (0==(pPg = sqlite3PcacheDirtyList(pPager->pPCache)) || 0==pPg->pDirty) + ){ + /* Update the db file change counter via the direct-write method. The + ** following call will modify the in-memory representation of page 1 + ** to include the updated change counter and then write page 1 + ** directly to the database file. Because of the atomic-write + ** property of the host file-system, this is safe. + */ + rc = pager_incr_changecounter(pPager, 1); + }else{ + rc = sqlite3JournalCreate(pPager->jfd); + if( rc==SQLITE_OK ){ + rc = pager_incr_changecounter(pPager, 0); + } + } + #else + rc = pager_incr_changecounter(pPager, 0); + #endif + if( rc!=SQLITE_OK ) goto commit_phase_one_exit; + + /* Write the master journal name into the journal file. If a master + ** journal file name has already been written to the journal file, + ** or if zMaster is NULL (no master journal), then this call is a no-op. + */ + rc = writeMasterJournal(pPager, zMaster); + if( rc!=SQLITE_OK ) goto commit_phase_one_exit; + + /* Sync the journal file and write all dirty pages to the database. + ** If the atomic-update optimization is being used, this sync will not + ** create the journal file or perform any real IO. + ** + ** Because the change-counter page was just modified, unless the + ** atomic-update optimization is used it is almost certain that the + ** journal requires a sync here. However, in locking_mode=exclusive + ** on a system under memory pressure it is just possible that this is + ** not the case. In this case it is likely enough that the redundant + ** xSync() call will be changed to a no-op by the OS anyhow. + */ + rc = syncJournal(pPager, 0); + if( rc!=SQLITE_OK ) goto commit_phase_one_exit; + + rc = pager_write_pagelist(pPager,sqlite3PcacheDirtyList(pPager->pPCache)); + if( rc!=SQLITE_OK ){ + assert( rc!=SQLITE_IOERR_BLOCKED ); + goto commit_phase_one_exit; + } + sqlite3PcacheCleanAll(pPager->pPCache); + + /* If the file on disk is smaller than the database image, use + ** pager_truncate to grow the file here. This can happen if the database + ** image was extended as part of the current transaction and then the + ** last page in the db image moved to the free-list. In this case the + ** last page is never written out to disk, leaving the database file + ** undersized. Fix this now if it is the case. */ + if( pPager->dbSize>pPager->dbFileSize ){ + Pgno nNew = pPager->dbSize - (pPager->dbSize==PAGER_MJ_PGNO(pPager)); + assert( pPager->eState==PAGER_WRITER_DBMOD ); + rc = pager_truncate(pPager, nNew); + if( rc!=SQLITE_OK ) goto commit_phase_one_exit; + } + + /* Finally, sync the database file. */ + if( !noSync ){ + rc = sqlite3PagerSync(pPager, zMaster); + } + IOTRACE(("DBSYNC %p\n", pPager)) + } + } + +commit_phase_one_exit: + if( rc==SQLITE_OK && !pagerUseWal(pPager) ){ + pPager->eState = PAGER_WRITER_FINISHED; + } + return rc; +} + + +/* +** When this function is called, the database file has been completely +** updated to reflect the changes made by the current transaction and +** synced to disk. The journal file still exists in the file-system +** though, and if a failure occurs at this point it will eventually +** be used as a hot-journal and the current transaction rolled back. +** +** This function finalizes the journal file, either by deleting, +** truncating or partially zeroing it, so that it cannot be used +** for hot-journal rollback. Once this is done the transaction is +** irrevocably committed. +** +** If an error occurs, an IO error code is returned and the pager +** moves into the error state. Otherwise, SQLITE_OK is returned. +*/ +SQLITE_PRIVATE int sqlite3PagerCommitPhaseTwo(Pager *pPager){ + int rc = SQLITE_OK; /* Return code */ + + /* This routine should not be called if a prior error has occurred. + ** But if (due to a coding error elsewhere in the system) it does get + ** called, just return the same error code without doing anything. */ + if( NEVER(pPager->errCode) ) return pPager->errCode; + + assert( pPager->eState==PAGER_WRITER_LOCKED + || pPager->eState==PAGER_WRITER_FINISHED + || (pagerUseWal(pPager) && pPager->eState==PAGER_WRITER_CACHEMOD) + ); + assert( assert_pager_state(pPager) ); + + /* An optimization. If the database was not actually modified during + ** this transaction, the pager is running in exclusive-mode and is + ** using persistent journals, then this function is a no-op. + ** + ** The start of the journal file currently contains a single journal + ** header with the nRec field set to 0. If such a journal is used as + ** a hot-journal during hot-journal rollback, 0 changes will be made + ** to the database file. So there is no need to zero the journal + ** header. Since the pager is in exclusive mode, there is no need + ** to drop any locks either. + */ + if( pPager->eState==PAGER_WRITER_LOCKED + && pPager->exclusiveMode + && pPager->journalMode==PAGER_JOURNALMODE_PERSIST + ){ + assert( pPager->journalOff==JOURNAL_HDR_SZ(pPager) || !pPager->journalOff ); + pPager->eState = PAGER_READER; + return SQLITE_OK; + } + + PAGERTRACE(("COMMIT %d\n", PAGERID(pPager))); + pPager->iDataVersion++; + rc = pager_end_transaction(pPager, pPager->setMaster, 1); + return pager_error(pPager, rc); +} + +/* +** If a write transaction is open, then all changes made within the +** transaction are reverted and the current write-transaction is closed. +** The pager falls back to PAGER_READER state if successful, or PAGER_ERROR +** state if an error occurs. +** +** If the pager is already in PAGER_ERROR state when this function is called, +** it returns Pager.errCode immediately. No work is performed in this case. +** +** Otherwise, in rollback mode, this function performs two functions: +** +** 1) It rolls back the journal file, restoring all database file and +** in-memory cache pages to the state they were in when the transaction +** was opened, and +** +** 2) It finalizes the journal file, so that it is not used for hot +** rollback at any point in the future. +** +** Finalization of the journal file (task 2) is only performed if the +** rollback is successful. +** +** In WAL mode, all cache-entries containing data modified within the +** current transaction are either expelled from the cache or reverted to +** their pre-transaction state by re-reading data from the database or +** WAL files. The WAL transaction is then closed. +*/ +SQLITE_PRIVATE int sqlite3PagerRollback(Pager *pPager){ + int rc = SQLITE_OK; /* Return code */ + PAGERTRACE(("ROLLBACK %d\n", PAGERID(pPager))); + + /* PagerRollback() is a no-op if called in READER or OPEN state. If + ** the pager is already in the ERROR state, the rollback is not + ** attempted here. Instead, the error code is returned to the caller. + */ + assert( assert_pager_state(pPager) ); + if( pPager->eState==PAGER_ERROR ) return pPager->errCode; + if( pPager->eState<=PAGER_READER ) return SQLITE_OK; + + if( pagerUseWal(pPager) ){ + int rc2; + rc = sqlite3PagerSavepoint(pPager, SAVEPOINT_ROLLBACK, -1); + rc2 = pager_end_transaction(pPager, pPager->setMaster, 0); + if( rc==SQLITE_OK ) rc = rc2; + }else if( !isOpen(pPager->jfd) || pPager->eState==PAGER_WRITER_LOCKED ){ + int eState = pPager->eState; + rc = pager_end_transaction(pPager, 0, 0); + if( !MEMDB && eState>PAGER_WRITER_LOCKED ){ + /* This can happen using journal_mode=off. Move the pager to the error + ** state to indicate that the contents of the cache may not be trusted. + ** Any active readers will get SQLITE_ABORT. + */ + pPager->errCode = SQLITE_ABORT; + pPager->eState = PAGER_ERROR; + return rc; + } + }else{ + rc = pager_playback(pPager, 0); + } + + assert( pPager->eState==PAGER_READER || rc!=SQLITE_OK ); + assert( rc==SQLITE_OK || rc==SQLITE_FULL || rc==SQLITE_CORRUPT + || rc==SQLITE_NOMEM || (rc&0xFF)==SQLITE_IOERR + || rc==SQLITE_CANTOPEN + ); + + /* If an error occurs during a ROLLBACK, we can no longer trust the pager + ** cache. So call pager_error() on the way out to make any error persistent. + */ + return pager_error(pPager, rc); +} + +/* +** Return TRUE if the database file is opened read-only. Return FALSE +** if the database is (in theory) writable. +*/ +SQLITE_PRIVATE u8 sqlite3PagerIsreadonly(Pager *pPager){ + return pPager->readOnly; +} + +#ifdef SQLITE_DEBUG +/* +** Return the sum of the reference counts for all pages held by pPager. +*/ +SQLITE_PRIVATE int sqlite3PagerRefcount(Pager *pPager){ + return sqlite3PcacheRefCount(pPager->pPCache); +} +#endif + +/* +** Return the approximate number of bytes of memory currently +** used by the pager and its associated cache. +*/ +SQLITE_PRIVATE int sqlite3PagerMemUsed(Pager *pPager){ + int perPageSize = pPager->pageSize + pPager->nExtra + sizeof(PgHdr) + + 5*sizeof(void*); + return perPageSize*sqlite3PcachePagecount(pPager->pPCache) + + sqlite3MallocSize(pPager) + + pPager->pageSize; +} + +/* +** Return the number of references to the specified page. +*/ +SQLITE_PRIVATE int sqlite3PagerPageRefcount(DbPage *pPage){ + return sqlite3PcachePageRefcount(pPage); +} + +#ifdef SQLITE_TEST +/* +** This routine is used for testing and analysis only. +*/ +SQLITE_PRIVATE int *sqlite3PagerStats(Pager *pPager){ + static int a[11]; + a[0] = sqlite3PcacheRefCount(pPager->pPCache); + a[1] = sqlite3PcachePagecount(pPager->pPCache); + a[2] = sqlite3PcacheGetCachesize(pPager->pPCache); + a[3] = pPager->eState==PAGER_OPEN ? -1 : (int) pPager->dbSize; + a[4] = pPager->eState; + a[5] = pPager->errCode; + a[6] = pPager->aStat[PAGER_STAT_HIT]; + a[7] = pPager->aStat[PAGER_STAT_MISS]; + a[8] = 0; /* Used to be pPager->nOvfl */ + a[9] = pPager->nRead; + a[10] = pPager->aStat[PAGER_STAT_WRITE]; + return a; +} +#endif + +/* +** Parameter eStat must be either SQLITE_DBSTATUS_CACHE_HIT or +** SQLITE_DBSTATUS_CACHE_MISS. Before returning, *pnVal is incremented by the +** current cache hit or miss count, according to the value of eStat. If the +** reset parameter is non-zero, the cache hit or miss count is zeroed before +** returning. +*/ +SQLITE_PRIVATE void sqlite3PagerCacheStat(Pager *pPager, int eStat, int reset, int *pnVal){ + + assert( eStat==SQLITE_DBSTATUS_CACHE_HIT + || eStat==SQLITE_DBSTATUS_CACHE_MISS + || eStat==SQLITE_DBSTATUS_CACHE_WRITE + ); + + assert( SQLITE_DBSTATUS_CACHE_HIT+1==SQLITE_DBSTATUS_CACHE_MISS ); + assert( SQLITE_DBSTATUS_CACHE_HIT+2==SQLITE_DBSTATUS_CACHE_WRITE ); + assert( PAGER_STAT_HIT==0 && PAGER_STAT_MISS==1 && PAGER_STAT_WRITE==2 ); + + *pnVal += pPager->aStat[eStat - SQLITE_DBSTATUS_CACHE_HIT]; + if( reset ){ + pPager->aStat[eStat - SQLITE_DBSTATUS_CACHE_HIT] = 0; + } +} + +/* +** Return true if this is an in-memory or temp-file backed pager. +*/ +SQLITE_PRIVATE int sqlite3PagerIsMemdb(Pager *pPager){ + return pPager->tempFile; +} + +/* +** Check that there are at least nSavepoint savepoints open. If there are +** currently less than nSavepoints open, then open one or more savepoints +** to make up the difference. If the number of savepoints is already +** equal to nSavepoint, then this function is a no-op. +** +** If a memory allocation fails, SQLITE_NOMEM is returned. If an error +** occurs while opening the sub-journal file, then an IO error code is +** returned. Otherwise, SQLITE_OK. +*/ +static SQLITE_NOINLINE int pagerOpenSavepoint(Pager *pPager, int nSavepoint){ + int rc = SQLITE_OK; /* Return code */ + int nCurrent = pPager->nSavepoint; /* Current number of savepoints */ + int ii; /* Iterator variable */ + PagerSavepoint *aNew; /* New Pager.aSavepoint array */ + + assert( pPager->eState>=PAGER_WRITER_LOCKED ); + assert( assert_pager_state(pPager) ); + assert( nSavepoint>nCurrent && pPager->useJournal ); + + /* Grow the Pager.aSavepoint array using realloc(). Return SQLITE_NOMEM + ** if the allocation fails. Otherwise, zero the new portion in case a + ** malloc failure occurs while populating it in the for(...) loop below. + */ + aNew = (PagerSavepoint *)sqlite3Realloc( + pPager->aSavepoint, sizeof(PagerSavepoint)*nSavepoint + ); + if( !aNew ){ + return SQLITE_NOMEM_BKPT; + } + memset(&aNew[nCurrent], 0, (nSavepoint-nCurrent) * sizeof(PagerSavepoint)); + pPager->aSavepoint = aNew; + + /* Populate the PagerSavepoint structures just allocated. */ + for(ii=nCurrent; iidbSize; + if( isOpen(pPager->jfd) && pPager->journalOff>0 ){ + aNew[ii].iOffset = pPager->journalOff; + }else{ + aNew[ii].iOffset = JOURNAL_HDR_SZ(pPager); + } + aNew[ii].iSubRec = pPager->nSubRec; + aNew[ii].pInSavepoint = sqlite3BitvecCreate(pPager->dbSize); + if( !aNew[ii].pInSavepoint ){ + return SQLITE_NOMEM_BKPT; + } + if( pagerUseWal(pPager) ){ + sqlite3WalSavepoint(pPager->pWal, aNew[ii].aWalData); + } + pPager->nSavepoint = ii+1; + } + assert( pPager->nSavepoint==nSavepoint ); + assertTruncateConstraint(pPager); + return rc; +} +SQLITE_PRIVATE int sqlite3PagerOpenSavepoint(Pager *pPager, int nSavepoint){ + assert( pPager->eState>=PAGER_WRITER_LOCKED ); + assert( assert_pager_state(pPager) ); + + if( nSavepoint>pPager->nSavepoint && pPager->useJournal ){ + return pagerOpenSavepoint(pPager, nSavepoint); + }else{ + return SQLITE_OK; + } +} + + +/* +** This function is called to rollback or release (commit) a savepoint. +** The savepoint to release or rollback need not be the most recently +** created savepoint. +** +** Parameter op is always either SAVEPOINT_ROLLBACK or SAVEPOINT_RELEASE. +** If it is SAVEPOINT_RELEASE, then release and destroy the savepoint with +** index iSavepoint. If it is SAVEPOINT_ROLLBACK, then rollback all changes +** that have occurred since the specified savepoint was created. +** +** The savepoint to rollback or release is identified by parameter +** iSavepoint. A value of 0 means to operate on the outermost savepoint +** (the first created). A value of (Pager.nSavepoint-1) means operate +** on the most recently created savepoint. If iSavepoint is greater than +** (Pager.nSavepoint-1), then this function is a no-op. +** +** If a negative value is passed to this function, then the current +** transaction is rolled back. This is different to calling +** sqlite3PagerRollback() because this function does not terminate +** the transaction or unlock the database, it just restores the +** contents of the database to its original state. +** +** In any case, all savepoints with an index greater than iSavepoint +** are destroyed. If this is a release operation (op==SAVEPOINT_RELEASE), +** then savepoint iSavepoint is also destroyed. +** +** This function may return SQLITE_NOMEM if a memory allocation fails, +** or an IO error code if an IO error occurs while rolling back a +** savepoint. If no errors occur, SQLITE_OK is returned. +*/ +SQLITE_PRIVATE int sqlite3PagerSavepoint(Pager *pPager, int op, int iSavepoint){ + int rc = pPager->errCode; + +#ifdef SQLITE_ENABLE_ZIPVFS + if( op==SAVEPOINT_RELEASE ) rc = SQLITE_OK; +#endif + + assert( op==SAVEPOINT_RELEASE || op==SAVEPOINT_ROLLBACK ); + assert( iSavepoint>=0 || op==SAVEPOINT_ROLLBACK ); + + if( rc==SQLITE_OK && iSavepointnSavepoint ){ + int ii; /* Iterator variable */ + int nNew; /* Number of remaining savepoints after this op. */ + + /* Figure out how many savepoints will still be active after this + ** operation. Store this value in nNew. Then free resources associated + ** with any savepoints that are destroyed by this operation. + */ + nNew = iSavepoint + (( op==SAVEPOINT_RELEASE ) ? 0 : 1); + for(ii=nNew; iinSavepoint; ii++){ + sqlite3BitvecDestroy(pPager->aSavepoint[ii].pInSavepoint); + } + pPager->nSavepoint = nNew; + + /* If this is a release of the outermost savepoint, truncate + ** the sub-journal to zero bytes in size. */ + if( op==SAVEPOINT_RELEASE ){ + if( nNew==0 && isOpen(pPager->sjfd) ){ + /* Only truncate if it is an in-memory sub-journal. */ + if( sqlite3JournalIsInMemory(pPager->sjfd) ){ + rc = sqlite3OsTruncate(pPager->sjfd, 0); + assert( rc==SQLITE_OK ); + } + pPager->nSubRec = 0; + } + } + /* Else this is a rollback operation, playback the specified savepoint. + ** If this is a temp-file, it is possible that the journal file has + ** not yet been opened. In this case there have been no changes to + ** the database file, so the playback operation can be skipped. + */ + else if( pagerUseWal(pPager) || isOpen(pPager->jfd) ){ + PagerSavepoint *pSavepoint = (nNew==0)?0:&pPager->aSavepoint[nNew-1]; + rc = pagerPlaybackSavepoint(pPager, pSavepoint); + assert(rc!=SQLITE_DONE); + } + +#ifdef SQLITE_ENABLE_ZIPVFS + /* If the cache has been modified but the savepoint cannot be rolled + ** back journal_mode=off, put the pager in the error state. This way, + ** if the VFS used by this pager includes ZipVFS, the entire transaction + ** can be rolled back at the ZipVFS level. */ + else if( + pPager->journalMode==PAGER_JOURNALMODE_OFF + && pPager->eState>=PAGER_WRITER_CACHEMOD + ){ + pPager->errCode = SQLITE_ABORT; + pPager->eState = PAGER_ERROR; + } +#endif + } + + return rc; +} + +/* +** Return the full pathname of the database file. +** +** Except, if the pager is in-memory only, then return an empty string if +** nullIfMemDb is true. This routine is called with nullIfMemDb==1 when +** used to report the filename to the user, for compatibility with legacy +** behavior. But when the Btree needs to know the filename for matching to +** shared cache, it uses nullIfMemDb==0 so that in-memory databases can +** participate in shared-cache. +*/ +SQLITE_PRIVATE const char *sqlite3PagerFilename(Pager *pPager, int nullIfMemDb){ + return (nullIfMemDb && pPager->memDb) ? "" : pPager->zFilename; +} + +/* +** Return the VFS structure for the pager. +*/ +SQLITE_PRIVATE sqlite3_vfs *sqlite3PagerVfs(Pager *pPager){ + return pPager->pVfs; +} + +/* +** Return the file handle for the database file associated +** with the pager. This might return NULL if the file has +** not yet been opened. +*/ +SQLITE_PRIVATE sqlite3_file *sqlite3PagerFile(Pager *pPager){ + return pPager->fd; +} + +/* +** Return the file handle for the journal file (if it exists). +** This will be either the rollback journal or the WAL file. +*/ +SQLITE_PRIVATE sqlite3_file *sqlite3PagerJrnlFile(Pager *pPager){ +#if SQLITE_OMIT_WAL + return pPager->jfd; +#else + return pPager->pWal ? sqlite3WalFile(pPager->pWal) : pPager->jfd; +#endif +} + +/* +** Return the full pathname of the journal file. +*/ +SQLITE_PRIVATE const char *sqlite3PagerJournalname(Pager *pPager){ + return pPager->zJournal; +} + +#ifdef SQLITE_HAS_CODEC +/* +** Set or retrieve the codec for this pager +*/ +SQLITE_PRIVATE void sqlite3PagerSetCodec( + Pager *pPager, + void *(*xCodec)(void*,void*,Pgno,int), + void (*xCodecSizeChng)(void*,int,int), + void (*xCodecFree)(void*), + void *pCodec +){ + if( pPager->xCodecFree ) pPager->xCodecFree(pPager->pCodec); + pPager->xCodec = pPager->memDb ? 0 : xCodec; + pPager->xCodecSizeChng = xCodecSizeChng; + pPager->xCodecFree = xCodecFree; + pPager->pCodec = pCodec; + pagerReportSize(pPager); +} +SQLITE_PRIVATE void *sqlite3PagerGetCodec(Pager *pPager){ + return pPager->pCodec; +} + +/* +** This function is called by the wal module when writing page content +** into the log file. +** +** This function returns a pointer to a buffer containing the encrypted +** page content. If a malloc fails, this function may return NULL. +*/ +SQLITE_PRIVATE void *sqlite3PagerCodec(PgHdr *pPg){ + void *aData = 0; + CODEC2(pPg->pPager, pPg->pData, pPg->pgno, 6, return 0, aData); + return aData; +} + +/* +** Return the current pager state +*/ +SQLITE_PRIVATE int sqlite3PagerState(Pager *pPager){ + return pPager->eState; +} +#endif /* SQLITE_HAS_CODEC */ + +#ifndef SQLITE_OMIT_AUTOVACUUM +/* +** Move the page pPg to location pgno in the file. +** +** There must be no references to the page previously located at +** pgno (which we call pPgOld) though that page is allowed to be +** in cache. If the page previously located at pgno is not already +** in the rollback journal, it is not put there by by this routine. +** +** References to the page pPg remain valid. Updating any +** meta-data associated with pPg (i.e. data stored in the nExtra bytes +** allocated along with the page) is the responsibility of the caller. +** +** A transaction must be active when this routine is called. It used to be +** required that a statement transaction was not active, but this restriction +** has been removed (CREATE INDEX needs to move a page when a statement +** transaction is active). +** +** If the fourth argument, isCommit, is non-zero, then this page is being +** moved as part of a database reorganization just before the transaction +** is being committed. In this case, it is guaranteed that the database page +** pPg refers to will not be written to again within this transaction. +** +** This function may return SQLITE_NOMEM or an IO error code if an error +** occurs. Otherwise, it returns SQLITE_OK. +*/ +SQLITE_PRIVATE int sqlite3PagerMovepage(Pager *pPager, DbPage *pPg, Pgno pgno, int isCommit){ + PgHdr *pPgOld; /* The page being overwritten. */ + Pgno needSyncPgno = 0; /* Old value of pPg->pgno, if sync is required */ + int rc; /* Return code */ + Pgno origPgno; /* The original page number */ + + assert( pPg->nRef>0 ); + assert( pPager->eState==PAGER_WRITER_CACHEMOD + || pPager->eState==PAGER_WRITER_DBMOD + ); + assert( assert_pager_state(pPager) ); + + /* In order to be able to rollback, an in-memory database must journal + ** the page we are moving from. + */ + assert( pPager->tempFile || !MEMDB ); + if( pPager->tempFile ){ + 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: + ** + ** BEGIN; + ** + ** SAVEPOINT one; + ** + ** ROLLBACK TO one; + ** + ** If page X were not written to the sub-journal here, it would not + ** be possible to restore its contents when the "ROLLBACK TO one" + ** statement were is processed. + ** + ** subjournalPage() may need to allocate space to store pPg->pgno into + ** one or more savepoint bitvecs. This is the reason this function + ** may return SQLITE_NOMEM. + */ + if( (pPg->flags & PGHDR_DIRTY)!=0 + && SQLITE_OK!=(rc = subjournalPageIfRequired(pPg)) + ){ + return rc; + } + + PAGERTRACE(("MOVE %d page %d (needSync=%d) moves to %d\n", + PAGERID(pPager), pPg->pgno, (pPg->flags&PGHDR_NEED_SYNC)?1:0, pgno)); + IOTRACE(("MOVE %p %d %d\n", pPager, pPg->pgno, pgno)) + + /* If the journal needs to be sync()ed before page pPg->pgno can + ** be written to, store pPg->pgno in local variable needSyncPgno. + ** + ** If the isCommit flag is set, there is no need to remember that + ** the journal needs to be sync()ed before database page pPg->pgno + ** can be written to. The caller has already promised not to write to it. + */ + if( (pPg->flags&PGHDR_NEED_SYNC) && !isCommit ){ + needSyncPgno = pPg->pgno; + assert( pPager->journalMode==PAGER_JOURNALMODE_OFF || + pageInJournal(pPager, pPg) || pPg->pgno>pPager->dbOrigSize ); + assert( pPg->flags&PGHDR_DIRTY ); + } + + /* If the cache contains a page with page-number pgno, remove it + ** from its hash chain. Also, if the PGHDR_NEED_SYNC flag was set for + ** page pgno before the 'move' operation, it needs to be retained + ** for the page moved there. + */ + pPg->flags &= ~PGHDR_NEED_SYNC; + pPgOld = sqlite3PagerLookup(pPager, pgno); + assert( !pPgOld || pPgOld->nRef==1 ); + if( pPgOld ){ + pPg->flags |= (pPgOld->flags&PGHDR_NEED_SYNC); + if( pPager->tempFile ){ + /* Do not discard pages from an in-memory database since we might + ** need to rollback later. Just move the page out of the way. */ + sqlite3PcacheMove(pPgOld, pPager->dbSize+1); + }else{ + sqlite3PcacheDrop(pPgOld); + } + } + + origPgno = pPg->pgno; + sqlite3PcacheMove(pPg, pgno); + sqlite3PcacheMakeDirty(pPg); + + /* For an in-memory database, make sure the original page continues + ** to exist, in case the transaction needs to roll back. Use pPgOld + ** as the original page since it has already been allocated. + */ + if( pPager->tempFile && pPgOld ){ + sqlite3PcacheMove(pPgOld, origPgno); + sqlite3PagerUnrefNotNull(pPgOld); + } + + if( needSyncPgno ){ + /* If needSyncPgno is non-zero, then the journal file needs to be + ** sync()ed before any data is written to database file page needSyncPgno. + ** Currently, no such page exists in the page-cache and the + ** "is journaled" bitvec flag has been set. This needs to be remedied by + ** loading the page into the pager-cache and setting the PGHDR_NEED_SYNC + ** flag. + ** + ** If the attempt to load the page into the page-cache fails, (due + ** to a malloc() or IO failure), clear the bit in the pInJournal[] + ** array. Otherwise, if the page is loaded and written again in + ** this transaction, it may be written to the database file before + ** it is synced into the journal file. This way, it may end up in + ** the journal file twice, but that is not a problem. + */ + PgHdr *pPgHdr; + rc = sqlite3PagerGet(pPager, needSyncPgno, &pPgHdr, 0); + if( rc!=SQLITE_OK ){ + if( needSyncPgno<=pPager->dbOrigSize ){ + assert( pPager->pTmpSpace!=0 ); + sqlite3BitvecClear(pPager->pInJournal, needSyncPgno, pPager->pTmpSpace); + } + return rc; + } + pPgHdr->flags |= PGHDR_NEED_SYNC; + sqlite3PcacheMakeDirty(pPgHdr); + sqlite3PagerUnrefNotNull(pPgHdr); + } + + return SQLITE_OK; +} +#endif + +/* +** The page handle passed as the first argument refers to a dirty page +** with a page number other than iNew. This function changes the page's +** page number to iNew and sets the value of the PgHdr.flags field to +** the value passed as the third parameter. +*/ +SQLITE_PRIVATE void sqlite3PagerRekey(DbPage *pPg, Pgno iNew, u16 flags){ + assert( pPg->pgno!=iNew ); + pPg->flags = flags; + sqlite3PcacheMove(pPg, iNew); +} + +/* +** Return a pointer to the data for the specified page. +*/ +SQLITE_PRIVATE void *sqlite3PagerGetData(DbPage *pPg){ + assert( pPg->nRef>0 || pPg->pPager->memDb ); + return pPg->pData; +} + +/* +** Return a pointer to the Pager.nExtra bytes of "extra" space +** allocated along with the specified page. +*/ +SQLITE_PRIVATE void *sqlite3PagerGetExtra(DbPage *pPg){ + return pPg->pExtra; +} + +/* +** Get/set the locking-mode for this pager. Parameter eMode must be one +** of PAGER_LOCKINGMODE_QUERY, PAGER_LOCKINGMODE_NORMAL or +** PAGER_LOCKINGMODE_EXCLUSIVE. If the parameter is not _QUERY, then +** the locking-mode is set to the value specified. +** +** The returned value is either PAGER_LOCKINGMODE_NORMAL or +** PAGER_LOCKINGMODE_EXCLUSIVE, indicating the current (possibly updated) +** locking-mode. +*/ +SQLITE_PRIVATE int sqlite3PagerLockingMode(Pager *pPager, int eMode){ + assert( eMode==PAGER_LOCKINGMODE_QUERY + || eMode==PAGER_LOCKINGMODE_NORMAL + || eMode==PAGER_LOCKINGMODE_EXCLUSIVE ); + assert( PAGER_LOCKINGMODE_QUERY<0 ); + assert( PAGER_LOCKINGMODE_NORMAL>=0 && PAGER_LOCKINGMODE_EXCLUSIVE>=0 ); + assert( pPager->exclusiveMode || 0==sqlite3WalHeapMemory(pPager->pWal) ); + if( eMode>=0 && !pPager->tempFile && !sqlite3WalHeapMemory(pPager->pWal) ){ + pPager->exclusiveMode = (u8)eMode; + } + return (int)pPager->exclusiveMode; +} + +/* +** Set the journal-mode for this pager. Parameter eMode must be one of: +** +** PAGER_JOURNALMODE_DELETE +** PAGER_JOURNALMODE_TRUNCATE +** PAGER_JOURNALMODE_PERSIST +** PAGER_JOURNALMODE_OFF +** PAGER_JOURNALMODE_MEMORY +** PAGER_JOURNALMODE_WAL +** +** The journalmode is set to the value specified if the change is allowed. +** The change may be disallowed for the following reasons: +** +** * An in-memory database can only have its journal_mode set to _OFF +** or _MEMORY. +** +** * Temporary databases cannot have _WAL journalmode. +** +** The returned indicate the current (possibly updated) journal-mode. +*/ +SQLITE_PRIVATE int sqlite3PagerSetJournalMode(Pager *pPager, int eMode){ + u8 eOld = pPager->journalMode; /* Prior journalmode */ + +#ifdef SQLITE_DEBUG + /* The print_pager_state() routine is intended to be used by the debugger + ** only. We invoke it once here to suppress a compiler warning. */ + print_pager_state(pPager); +#endif + + + /* The eMode parameter is always valid */ + assert( eMode==PAGER_JOURNALMODE_DELETE + || eMode==PAGER_JOURNALMODE_TRUNCATE + || eMode==PAGER_JOURNALMODE_PERSIST + || eMode==PAGER_JOURNALMODE_OFF + || eMode==PAGER_JOURNALMODE_WAL + || eMode==PAGER_JOURNALMODE_MEMORY ); + + /* This routine is only called from the OP_JournalMode opcode, and + ** the logic there will never allow a temporary file to be changed + ** to WAL mode. + */ + assert( pPager->tempFile==0 || eMode!=PAGER_JOURNALMODE_WAL ); + + /* Do allow the journalmode of an in-memory database to be set to + ** anything other than MEMORY or OFF + */ + if( MEMDB ){ + assert( eOld==PAGER_JOURNALMODE_MEMORY || eOld==PAGER_JOURNALMODE_OFF ); + if( eMode!=PAGER_JOURNALMODE_MEMORY && eMode!=PAGER_JOURNALMODE_OFF ){ + eMode = eOld; + } + } + + if( eMode!=eOld ){ + + /* Change the journal mode. */ + assert( pPager->eState!=PAGER_ERROR ); + pPager->journalMode = (u8)eMode; + + /* When transistioning from TRUNCATE or PERSIST to any other journal + ** mode except WAL, unless the pager is in locking_mode=exclusive mode, + ** delete the journal file. + */ + assert( (PAGER_JOURNALMODE_TRUNCATE & 5)==1 ); + assert( (PAGER_JOURNALMODE_PERSIST & 5)==1 ); + assert( (PAGER_JOURNALMODE_DELETE & 5)==0 ); + assert( (PAGER_JOURNALMODE_MEMORY & 5)==4 ); + assert( (PAGER_JOURNALMODE_OFF & 5)==0 ); + assert( (PAGER_JOURNALMODE_WAL & 5)==5 ); + + assert( isOpen(pPager->fd) || pPager->exclusiveMode ); + if( !pPager->exclusiveMode && (eOld & 5)==1 && (eMode & 1)==0 ){ + + /* In this case we would like to delete the journal file. If it is + ** not possible, then that is not a problem. Deleting the journal file + ** here is an optimization only. + ** + ** Before deleting the journal file, obtain a RESERVED lock on the + ** database file. This ensures that the journal file is not deleted + ** while it is in use by some other client. + */ + sqlite3OsClose(pPager->jfd); + if( pPager->eLock>=RESERVED_LOCK ){ + sqlite3OsDelete(pPager->pVfs, pPager->zJournal, 0); + }else{ + int rc = SQLITE_OK; + int state = pPager->eState; + assert( state==PAGER_OPEN || state==PAGER_READER ); + if( state==PAGER_OPEN ){ + rc = sqlite3PagerSharedLock(pPager); + } + if( pPager->eState==PAGER_READER ){ + assert( rc==SQLITE_OK ); + rc = pagerLockDb(pPager, RESERVED_LOCK); + } + if( rc==SQLITE_OK ){ + sqlite3OsDelete(pPager->pVfs, pPager->zJournal, 0); + } + if( rc==SQLITE_OK && state==PAGER_READER ){ + pagerUnlockDb(pPager, SHARED_LOCK); + }else if( state==PAGER_OPEN ){ + pager_unlock(pPager); + } + assert( state==pPager->eState ); + } + }else if( eMode==PAGER_JOURNALMODE_OFF ){ + sqlite3OsClose(pPager->jfd); + } + } + + /* Return the new journal mode */ + return (int)pPager->journalMode; +} + +/* +** Return the current journal mode. +*/ +SQLITE_PRIVATE int sqlite3PagerGetJournalMode(Pager *pPager){ + return (int)pPager->journalMode; +} + +/* +** Return TRUE if the pager is in a state where it is OK to change the +** journalmode. Journalmode changes can only happen when the database +** is unmodified. +*/ +SQLITE_PRIVATE int sqlite3PagerOkToChangeJournalMode(Pager *pPager){ + assert( assert_pager_state(pPager) ); + if( pPager->eState>=PAGER_WRITER_CACHEMOD ) return 0; + if( NEVER(isOpen(pPager->jfd) && pPager->journalOff>0) ) return 0; + return 1; +} + +/* +** Get/set the size-limit used for persistent journal files. +** +** Setting the size limit to -1 means no limit is enforced. +** An attempt to set a limit smaller than -1 is a no-op. +*/ +SQLITE_PRIVATE i64 sqlite3PagerJournalSizeLimit(Pager *pPager, i64 iLimit){ + if( iLimit>=-1 ){ + pPager->journalSizeLimit = iLimit; + sqlite3WalLimit(pPager->pWal, iLimit); + } + return pPager->journalSizeLimit; +} + +/* +** Return a pointer to the pPager->pBackup variable. The backup module +** in backup.c maintains the content of this variable. This module +** uses it opaquely as an argument to sqlite3BackupRestart() and +** sqlite3BackupUpdate() only. +*/ +SQLITE_PRIVATE sqlite3_backup **sqlite3PagerBackupPtr(Pager *pPager){ + return &pPager->pBackup; +} + +#ifndef SQLITE_OMIT_VACUUM +/* +** Unless this is an in-memory or temporary database, clear the pager cache. +*/ +SQLITE_PRIVATE void sqlite3PagerClearCache(Pager *pPager){ + assert( MEMDB==0 || pPager->tempFile ); + if( pPager->tempFile==0 ) pager_reset(pPager); +} +#endif + + +#ifndef SQLITE_OMIT_WAL +/* +** This function is called when the user invokes "PRAGMA wal_checkpoint", +** "PRAGMA wal_blocking_checkpoint" or calls the sqlite3_wal_checkpoint() +** or wal_blocking_checkpoint() API functions. +** +** Parameter eMode is one of SQLITE_CHECKPOINT_PASSIVE, FULL or RESTART. +*/ +SQLITE_PRIVATE int sqlite3PagerCheckpoint(Pager *pPager, int eMode, int *pnLog, int *pnCkpt){ + int rc = SQLITE_OK; + if( pPager->pWal ){ + rc = sqlite3WalCheckpoint(pPager->pWal, eMode, + (eMode==SQLITE_CHECKPOINT_PASSIVE ? 0 : pPager->xBusyHandler), + pPager->pBusyHandlerArg, + pPager->ckptSyncFlags, pPager->pageSize, (u8 *)pPager->pTmpSpace, + pnLog, pnCkpt + ); + } + return rc; +} + +SQLITE_PRIVATE int sqlite3PagerWalCallback(Pager *pPager){ + return sqlite3WalCallback(pPager->pWal); +} + +/* +** Return true if the underlying VFS for the given pager supports the +** primitives necessary for write-ahead logging. +*/ +SQLITE_PRIVATE int sqlite3PagerWalSupported(Pager *pPager){ + const sqlite3_io_methods *pMethods = pPager->fd->pMethods; + if( pPager->noLock ) return 0; + return pPager->exclusiveMode || (pMethods->iVersion>=2 && pMethods->xShmMap); +} + +/* +** Attempt to take an exclusive lock on the database file. If a PENDING lock +** is obtained instead, immediately release it. +*/ +static int pagerExclusiveLock(Pager *pPager){ + int rc; /* Return code */ + + assert( pPager->eLock==SHARED_LOCK || pPager->eLock==EXCLUSIVE_LOCK ); + rc = pagerLockDb(pPager, EXCLUSIVE_LOCK); + if( rc!=SQLITE_OK ){ + /* If the attempt to grab the exclusive lock failed, release the + ** pending lock that may have been obtained instead. */ + pagerUnlockDb(pPager, SHARED_LOCK); + } + + return rc; +} + +/* +** Call sqlite3WalOpen() to open the WAL handle. If the pager is in +** exclusive-locking mode when this function is called, take an EXCLUSIVE +** lock on the database file and use heap-memory to store the wal-index +** in. Otherwise, use the normal shared-memory. +*/ +static int pagerOpenWal(Pager *pPager){ + int rc = SQLITE_OK; + + assert( pPager->pWal==0 && pPager->tempFile==0 ); + assert( pPager->eLock==SHARED_LOCK || pPager->eLock==EXCLUSIVE_LOCK ); + + /* If the pager is already in exclusive-mode, the WAL module will use + ** heap-memory for the wal-index instead of the VFS shared-memory + ** implementation. Take the exclusive lock now, before opening the WAL + ** file, to make sure this is safe. + */ + if( pPager->exclusiveMode ){ + rc = pagerExclusiveLock(pPager); + } + + /* Open the connection to the log file. If this operation fails, + ** (e.g. due to malloc() failure), return an error code. + */ + if( rc==SQLITE_OK ){ + rc = sqlite3WalOpen(pPager->pVfs, + pPager->fd, pPager->zWal, pPager->exclusiveMode, + pPager->journalSizeLimit, &pPager->pWal + ); + } + pagerFixMaplimit(pPager); + + return rc; +} + + +/* +** The caller must be holding a SHARED lock on the database file to call +** this function. +** +** If the pager passed as the first argument is open on a real database +** file (not a temp file or an in-memory database), and the WAL file +** is not already open, make an attempt to open it now. If successful, +** return SQLITE_OK. If an error occurs or the VFS used by the pager does +** not support the xShmXXX() methods, return an error code. *pbOpen is +** not modified in either case. +** +** If the pager is open on a temp-file (or in-memory database), or if +** the WAL file is already open, set *pbOpen to 1 and return SQLITE_OK +** without doing anything. +*/ +SQLITE_PRIVATE int sqlite3PagerOpenWal( + Pager *pPager, /* Pager object */ + int *pbOpen /* OUT: Set to true if call is a no-op */ +){ + int rc = SQLITE_OK; /* Return code */ + + assert( assert_pager_state(pPager) ); + assert( pPager->eState==PAGER_OPEN || pbOpen ); + assert( pPager->eState==PAGER_READER || !pbOpen ); + assert( pbOpen==0 || *pbOpen==0 ); + assert( pbOpen!=0 || (!pPager->tempFile && !pPager->pWal) ); + + if( !pPager->tempFile && !pPager->pWal ){ + if( !sqlite3PagerWalSupported(pPager) ) return SQLITE_CANTOPEN; + + /* Close any rollback journal previously open */ + sqlite3OsClose(pPager->jfd); + + rc = pagerOpenWal(pPager); + if( rc==SQLITE_OK ){ + pPager->journalMode = PAGER_JOURNALMODE_WAL; + pPager->eState = PAGER_OPEN; + } + }else{ + *pbOpen = 1; + } + + return rc; +} + +/* +** This function is called to close the connection to the log file prior +** to switching from WAL to rollback mode. +** +** Before closing the log file, this function attempts to take an +** EXCLUSIVE lock on the database file. If this cannot be obtained, an +** error (SQLITE_BUSY) is returned and the log connection is not closed. +** If successful, the EXCLUSIVE lock is not released before returning. +*/ +SQLITE_PRIVATE int sqlite3PagerCloseWal(Pager *pPager){ + int rc = SQLITE_OK; + + assert( pPager->journalMode==PAGER_JOURNALMODE_WAL ); + + /* If the log file is not already open, but does exist in the file-system, + ** it may need to be checkpointed before the connection can switch to + ** rollback mode. Open it now so this can happen. + */ + if( !pPager->pWal ){ + int logexists = 0; + rc = pagerLockDb(pPager, SHARED_LOCK); + if( rc==SQLITE_OK ){ + rc = sqlite3OsAccess( + pPager->pVfs, pPager->zWal, SQLITE_ACCESS_EXISTS, &logexists + ); + } + if( rc==SQLITE_OK && logexists ){ + rc = pagerOpenWal(pPager); + } + } + + /* Checkpoint and close the log. Because an EXCLUSIVE lock is held on + ** the database file, the log and log-summary files will be deleted. + */ + if( rc==SQLITE_OK && pPager->pWal ){ + rc = pagerExclusiveLock(pPager); + if( rc==SQLITE_OK ){ + rc = sqlite3WalClose(pPager->pWal, pPager->ckptSyncFlags, + pPager->pageSize, (u8*)pPager->pTmpSpace); + pPager->pWal = 0; + pagerFixMaplimit(pPager); + if( rc && !pPager->exclusiveMode ) pagerUnlockDb(pPager, SHARED_LOCK); + } + } + return rc; +} + +#ifdef SQLITE_ENABLE_SNAPSHOT +/* +** If this is a WAL database, obtain a snapshot handle for the snapshot +** currently open. Otherwise, return an error. +*/ +SQLITE_PRIVATE int sqlite3PagerSnapshotGet(Pager *pPager, sqlite3_snapshot **ppSnapshot){ + int rc = SQLITE_ERROR; + if( pPager->pWal ){ + rc = sqlite3WalSnapshotGet(pPager->pWal, ppSnapshot); + } + return rc; +} + +/* +** If this is a WAL database, store a pointer to pSnapshot. Next time a +** read transaction is opened, attempt to read from the snapshot it +** identifies. If this is not a WAL database, return an error. +*/ +SQLITE_PRIVATE int sqlite3PagerSnapshotOpen(Pager *pPager, sqlite3_snapshot *pSnapshot){ + int rc = SQLITE_OK; + if( pPager->pWal ){ + sqlite3WalSnapshotOpen(pPager->pWal, pSnapshot); + }else{ + rc = SQLITE_ERROR; + } + return rc; +} +#endif /* SQLITE_ENABLE_SNAPSHOT */ +#endif /* !SQLITE_OMIT_WAL */ + +#ifdef SQLITE_ENABLE_ZIPVFS +/* +** A read-lock must be held on the pager when this function is called. If +** the pager is in WAL mode and the WAL file currently contains one or more +** frames, return the size in bytes of the page images stored within the +** WAL frames. Otherwise, if this is not a WAL database or the WAL file +** is empty, return 0. +*/ +SQLITE_PRIVATE int sqlite3PagerWalFramesize(Pager *pPager){ + assert( pPager->eState>=PAGER_READER ); + return sqlite3WalFramesize(pPager->pWal); +} +#endif + +#endif /* SQLITE_OMIT_DISKIO */ + +/************** End of pager.c ***********************************************/ +/************** Begin file wal.c *********************************************/ +/* +** 2010 February 1 +** +** 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 the implementation of a write-ahead log (WAL) used in +** "journal_mode=WAL" mode. +** +** WRITE-AHEAD LOG (WAL) FILE FORMAT +** +** A WAL file consists of a header followed by zero or more "frames". +** Each frame records the revised content of a single page from the +** database file. All changes to the database are recorded by writing +** frames into the WAL. Transactions commit when a frame is written that +** contains a commit marker. A single WAL can and usually does record +** multiple transactions. Periodically, the content of the WAL is +** transferred back into the database file in an operation called a +** "checkpoint". +** +** A single WAL file can be used multiple times. In other words, the +** WAL can fill up with frames and then be checkpointed and then new +** frames can overwrite the old ones. A WAL always grows from beginning +** toward the end. Checksums and counters attached to each frame are +** used to determine which frames within the WAL are valid and which +** are leftovers from prior checkpoints. +** +** The WAL header is 32 bytes in size and consists of the following eight +** big-endian 32-bit unsigned integer values: +** +** 0: Magic number. 0x377f0682 or 0x377f0683 +** 4: File format version. Currently 3007000 +** 8: Database page size. Example: 1024 +** 12: Checkpoint sequence number +** 16: Salt-1, random integer incremented with each checkpoint +** 20: Salt-2, a different random integer changing with each ckpt +** 24: Checksum-1 (first part of checksum for first 24 bytes of header). +** 28: Checksum-2 (second part of checksum for first 24 bytes of header). +** +** Immediately following the wal-header are zero or more frames. Each +** frame consists of a 24-byte frame-header followed by a bytes +** of page data. The frame-header is six big-endian 32-bit unsigned +** integer values, as follows: +** +** 0: Page number. +** 4: For commit records, the size of the database image in pages +** after the commit. For all other records, zero. +** 8: Salt-1 (copied from the header) +** 12: Salt-2 (copied from the header) +** 16: Checksum-1. +** 20: Checksum-2. +** +** A frame is considered valid if and only if the following conditions are +** true: +** +** (1) The salt-1 and salt-2 values in the frame-header match +** salt values in the wal-header +** +** (2) The checksum values in the final 8 bytes of the frame-header +** exactly match the checksum computed consecutively on the +** WAL header and the first 8 bytes and the content of all frames +** up to and including the current frame. +** +** The checksum is computed using 32-bit big-endian integers if the +** magic number in the first 4 bytes of the WAL is 0x377f0683 and it +** is computed using little-endian if the magic number is 0x377f0682. +** The checksum values are always stored in the frame header in a +** big-endian format regardless of which byte order is used to compute +** the checksum. The checksum is computed by interpreting the input as +** an even number of unsigned 32-bit integers: x[0] through x[N]. The +** algorithm used for the checksum is as follows: +** +** for i from 0 to n-1 step 2: +** s0 += x[i] + s1; +** s1 += x[i+1] + s0; +** endfor +** +** Note that s0 and s1 are both weighted checksums using fibonacci weights +** in reverse order (the largest fibonacci weight occurs on the first element +** of the sequence being summed.) The s1 value spans all 32-bit +** terms of the sequence whereas s0 omits the final term. +** +** On a checkpoint, the WAL is first VFS.xSync-ed, then valid content of the +** WAL is transferred into the database, then the database is VFS.xSync-ed. +** The VFS.xSync operations serve as write barriers - all writes launched +** before the xSync must complete before any write that launches after the +** xSync begins. +** +** After each checkpoint, the salt-1 value is incremented and the salt-2 +** value is randomized. This prevents old and new frames in the WAL from +** being considered valid at the same time and being checkpointing together +** following a crash. +** +** READER ALGORITHM +** +** To read a page from the database (call it page number P), a reader +** first checks the WAL to see if it contains page P. If so, then the +** last valid instance of page P that is a followed by a commit frame +** or is a commit frame itself becomes the value read. If the WAL +** contains no copies of page P that are valid and which are a commit +** frame or are followed by a commit frame, then page P is read from +** the database file. +** +** To start a read transaction, the reader records the index of the last +** valid frame in the WAL. The reader uses this recorded "mxFrame" value +** for all subsequent read operations. New transactions can be appended +** to the WAL, but as long as the reader uses its original mxFrame value +** and ignores the newly appended content, it will see a consistent snapshot +** of the database from a single point in time. This technique allows +** multiple concurrent readers to view different versions of the database +** content simultaneously. +** +** The reader algorithm in the previous paragraphs works correctly, but +** because frames for page P can appear anywhere within the WAL, the +** reader has to scan the entire WAL looking for page P frames. If the +** WAL is large (multiple megabytes is typical) that scan can be slow, +** and read performance suffers. To overcome this problem, a separate +** data structure called the wal-index is maintained to expedite the +** search for frames of a particular page. +** +** WAL-INDEX FORMAT +** +** Conceptually, the wal-index is shared memory, though VFS implementations +** might choose to implement the wal-index using a mmapped file. Because +** the wal-index is shared memory, SQLite does not support journal_mode=WAL +** on a network filesystem. All users of the database must be able to +** share memory. +** +** The wal-index is transient. After a crash, the wal-index can (and should +** be) reconstructed from the original WAL file. In fact, the VFS is required +** to either truncate or zero the header of the wal-index when the last +** connection to it closes. Because the wal-index is transient, it can +** use an architecture-specific format; it does not have to be cross-platform. +** Hence, unlike the database and WAL file formats which store all values +** as big endian, the wal-index can store multi-byte values in the native +** byte order of the host computer. +** +** The purpose of the wal-index is to answer this question quickly: Given +** a page number P and a maximum frame index M, return the index of the +** last frame in the wal before frame M for page P in the WAL, or return +** NULL if there are no frames for page P in the WAL prior to M. +** +** The wal-index consists of a header region, followed by an one or +** more index blocks. +** +** The wal-index header contains the total number of frames within the WAL +** in the mxFrame field. +** +** Each index block except for the first contains information on +** HASHTABLE_NPAGE frames. The first index block contains information on +** HASHTABLE_NPAGE_ONE frames. The values of HASHTABLE_NPAGE_ONE and +** HASHTABLE_NPAGE are selected so that together the wal-index header and +** first index block are the same size as all other index blocks in the +** wal-index. +** +** Each index block contains two sections, a page-mapping that contains the +** database page number associated with each wal frame, and a hash-table +** that allows readers to query an index block for a specific page number. +** The page-mapping is an array of HASHTABLE_NPAGE (or HASHTABLE_NPAGE_ONE +** for the first index block) 32-bit page numbers. The first entry in the +** first index-block contains the database page number corresponding to the +** first frame in the WAL file. The first entry in the second index block +** in the WAL file corresponds to the (HASHTABLE_NPAGE_ONE+1)th frame in +** the log, and so on. +** +** The last index block in a wal-index usually contains less than the full +** complement of HASHTABLE_NPAGE (or HASHTABLE_NPAGE_ONE) page-numbers, +** depending on the contents of the WAL file. This does not change the +** allocated size of the page-mapping array - the page-mapping array merely +** contains unused entries. +** +** Even without using the hash table, the last frame for page P +** can be found by scanning the page-mapping sections of each index block +** starting with the last index block and moving toward the first, and +** within each index block, starting at the end and moving toward the +** beginning. The first entry that equals P corresponds to the frame +** holding the content for that page. +** +** The hash table consists of HASHTABLE_NSLOT 16-bit unsigned integers. +** HASHTABLE_NSLOT = 2*HASHTABLE_NPAGE, and there is one entry in the +** hash table for each page number in the mapping section, so the hash +** table is never more than half full. The expected number of collisions +** prior to finding a match is 1. Each entry of the hash table is an +** 1-based index of an entry in the mapping section of the same +** index block. Let K be the 1-based index of the largest entry in +** the mapping section. (For index blocks other than the last, K will +** always be exactly HASHTABLE_NPAGE (4096) and for the last index block +** K will be (mxFrame%HASHTABLE_NPAGE).) Unused slots of the hash table +** contain a value of 0. +** +** To look for page P in the hash table, first compute a hash iKey on +** P as follows: +** +** iKey = (P * 383) % HASHTABLE_NSLOT +** +** Then start scanning entries of the hash table, starting with iKey +** (wrapping around to the beginning when the end of the hash table is +** reached) until an unused hash slot is found. Let the first unused slot +** be at index iUnused. (iUnused might be less than iKey if there was +** wrap-around.) Because the hash table is never more than half full, +** the search is guaranteed to eventually hit an unused entry. Let +** iMax be the value between iKey and iUnused, closest to iUnused, +** where aHash[iMax]==P. If there is no iMax entry (if there exists +** no hash slot such that aHash[i]==p) then page P is not in the +** current index block. Otherwise the iMax-th mapping entry of the +** current index block corresponds to the last entry that references +** page P. +** +** A hash search begins with the last index block and moves toward the +** first index block, looking for entries corresponding to page P. On +** average, only two or three slots in each index block need to be +** examined in order to either find the last entry for page P, or to +** establish that no such entry exists in the block. Each index block +** holds over 4000 entries. So two or three index blocks are sufficient +** to cover a typical 10 megabyte WAL file, assuming 1K pages. 8 or 10 +** comparisons (on average) suffice to either locate a frame in the +** WAL or to establish that the frame does not exist in the WAL. This +** is much faster than scanning the entire 10MB WAL. +** +** Note that entries are added in order of increasing K. Hence, one +** reader might be using some value K0 and a second reader that started +** at a later time (after additional transactions were added to the WAL +** and to the wal-index) might be using a different value K1, where K1>K0. +** Both readers can use the same hash table and mapping section to get +** the correct result. There may be entries in the hash table with +** K>K0 but to the first reader, those entries will appear to be unused +** slots in the hash table and so the first reader will get an answer as +** if no values greater than K0 had ever been inserted into the hash table +** in the first place - which is what reader one wants. Meanwhile, the +** second reader using K1 will see additional values that were inserted +** later, which is exactly what reader two wants. +** +** When a rollback occurs, the value of K is decreased. Hash table entries +** that correspond to frames greater than the new K value are removed +** from the hash table at this point. +*/ +#ifndef SQLITE_OMIT_WAL + +/* #include "wal.h" */ + +/* +** Trace output macros +*/ +#if defined(SQLITE_TEST) && defined(SQLITE_DEBUG) +SQLITE_PRIVATE int sqlite3WalTrace = 0; +# define WALTRACE(X) if(sqlite3WalTrace) sqlite3DebugPrintf X +#else +# define WALTRACE(X) +#endif + +/* +** The maximum (and only) versions of the wal and wal-index formats +** that may be interpreted by this version of SQLite. +** +** If a client begins recovering a WAL file and finds that (a) the checksum +** values in the wal-header are correct and (b) the version field is not +** WAL_MAX_VERSION, recovery fails and SQLite returns SQLITE_CANTOPEN. +** +** Similarly, if a client successfully reads a wal-index header (i.e. the +** checksum test is successful) and finds that the version field is not +** WALINDEX_MAX_VERSION, then no read-transaction is opened and SQLite +** returns SQLITE_CANTOPEN. +*/ +#define WAL_MAX_VERSION 3007000 +#define WALINDEX_MAX_VERSION 3007000 + +/* +** Indices of various locking bytes. WAL_NREADER is the number +** of available reader locks and should be at least 3. The default +** is SQLITE_SHM_NLOCK==8 and WAL_NREADER==5. +*/ +#define WAL_WRITE_LOCK 0 +#define WAL_ALL_BUT_WRITE 1 +#define WAL_CKPT_LOCK 1 +#define WAL_RECOVER_LOCK 2 +#define WAL_READ_LOCK(I) (3+(I)) +#define WAL_NREADER (SQLITE_SHM_NLOCK-3) + + +/* Object declarations */ +typedef struct WalIndexHdr WalIndexHdr; +typedef struct WalIterator WalIterator; +typedef struct WalCkptInfo WalCkptInfo; + + +/* +** The following object holds a copy of the wal-index header content. +** +** The actual header in the wal-index consists of two copies of this +** object followed by one instance of the WalCkptInfo object. +** For all versions of SQLite through 3.10.0 and probably beyond, +** the locking bytes (WalCkptInfo.aLock) start at offset 120 and +** the total header size is 136 bytes. +** +** The szPage value can be any power of 2 between 512 and 32768, inclusive. +** Or it can be 1 to represent a 65536-byte page. The latter case was +** added in 3.7.1 when support for 64K pages was added. +*/ +struct WalIndexHdr { + u32 iVersion; /* Wal-index version */ + u32 unused; /* Unused (padding) field */ + u32 iChange; /* Counter incremented each transaction */ + u8 isInit; /* 1 when initialized */ + u8 bigEndCksum; /* True if checksums in WAL are big-endian */ + u16 szPage; /* Database page size in bytes. 1==64K */ + u32 mxFrame; /* Index of last valid frame in the WAL */ + u32 nPage; /* Size of database in pages */ + u32 aFrameCksum[2]; /* Checksum of last frame in log */ + u32 aSalt[2]; /* Two salt values copied from WAL header */ + u32 aCksum[2]; /* Checksum over all prior fields */ +}; + +/* +** A copy of the following object occurs in the wal-index immediately +** following the second copy of the WalIndexHdr. This object stores +** information used by checkpoint. +** +** nBackfill is the number of frames in the WAL that have been written +** back into the database. (We call the act of moving content from WAL to +** database "backfilling".) The nBackfill number is never greater than +** WalIndexHdr.mxFrame. nBackfill can only be increased by threads +** holding the WAL_CKPT_LOCK lock (which includes a recovery thread). +** However, a WAL_WRITE_LOCK thread can move the value of nBackfill from +** mxFrame back to zero when the WAL is reset. +** +** nBackfillAttempted is the largest value of nBackfill that a checkpoint +** has attempted to achieve. Normally nBackfill==nBackfillAtempted, however +** the nBackfillAttempted is set before any backfilling is done and the +** nBackfill is only set after all backfilling completes. So if a checkpoint +** crashes, nBackfillAttempted might be larger than nBackfill. The +** WalIndexHdr.mxFrame must never be less than nBackfillAttempted. +** +** The aLock[] field is a set of bytes used for locking. These bytes should +** never be read or written. +** +** There is one entry in aReadMark[] for each reader lock. If a reader +** holds read-lock K, then the value in aReadMark[K] is no greater than +** the mxFrame for that reader. The value READMARK_NOT_USED (0xffffffff) +** for any aReadMark[] means that entry is unused. aReadMark[0] is +** a special case; its value is never used and it exists as a place-holder +** to avoid having to offset aReadMark[] indexs by one. Readers holding +** WAL_READ_LOCK(0) always ignore the entire WAL and read all content +** directly from the database. +** +** The value of aReadMark[K] may only be changed by a thread that +** is holding an exclusive lock on WAL_READ_LOCK(K). Thus, the value of +** aReadMark[K] cannot changed while there is a reader is using that mark +** since the reader will be holding a shared lock on WAL_READ_LOCK(K). +** +** The checkpointer may only transfer frames from WAL to database where +** the frame numbers are less than or equal to every aReadMark[] that is +** in use (that is, every aReadMark[j] for which there is a corresponding +** WAL_READ_LOCK(j)). New readers (usually) pick the aReadMark[] with the +** largest value and will increase an unused aReadMark[] to mxFrame if there +** is not already an aReadMark[] equal to mxFrame. The exception to the +** previous sentence is when nBackfill equals mxFrame (meaning that everything +** in the WAL has been backfilled into the database) then new readers +** will choose aReadMark[0] which has value 0 and hence such reader will +** get all their all content directly from the database file and ignore +** the WAL. +** +** Writers normally append new frames to the end of the WAL. However, +** if nBackfill equals mxFrame (meaning that all WAL content has been +** written back into the database) and if no readers are using the WAL +** (in other words, if there are no WAL_READ_LOCK(i) where i>0) then +** the writer will first "reset" the WAL back to the beginning and start +** writing new content beginning at frame 1. +** +** We assume that 32-bit loads are atomic and so no locks are needed in +** order to read from any aReadMark[] entries. +*/ +struct WalCkptInfo { + u32 nBackfill; /* Number of WAL frames backfilled into DB */ + u32 aReadMark[WAL_NREADER]; /* Reader marks */ + u8 aLock[SQLITE_SHM_NLOCK]; /* Reserved space for locks */ + u32 nBackfillAttempted; /* WAL frames perhaps written, or maybe not */ + u32 notUsed0; /* Available for future enhancements */ +}; +#define READMARK_NOT_USED 0xffffffff + + +/* A block of WALINDEX_LOCK_RESERVED bytes beginning at +** WALINDEX_LOCK_OFFSET is reserved for locks. Since some systems +** only support mandatory file-locks, we do not read or write data +** from the region of the file on which locks are applied. +*/ +#define WALINDEX_LOCK_OFFSET (sizeof(WalIndexHdr)*2+offsetof(WalCkptInfo,aLock)) +#define WALINDEX_HDR_SIZE (sizeof(WalIndexHdr)*2+sizeof(WalCkptInfo)) + +/* Size of header before each frame in wal */ +#define WAL_FRAME_HDRSIZE 24 + +/* Size of write ahead log header, including checksum. */ +/* #define WAL_HDRSIZE 24 */ +#define WAL_HDRSIZE 32 + +/* WAL magic value. Either this value, or the same value with the least +** significant bit also set (WAL_MAGIC | 0x00000001) is stored in 32-bit +** big-endian format in the first 4 bytes of a WAL file. +** +** If the LSB is set, then the checksums for each frame within the WAL +** file are calculated by treating all data as an array of 32-bit +** big-endian words. Otherwise, they are calculated by interpreting +** all data as 32-bit little-endian words. +*/ +#define WAL_MAGIC 0x377f0682 + +/* +** Return the offset of frame iFrame in the write-ahead log file, +** assuming a database page size of szPage bytes. The offset returned +** is to the start of the write-ahead log frame-header. +*/ +#define walFrameOffset(iFrame, szPage) ( \ + WAL_HDRSIZE + ((iFrame)-1)*(i64)((szPage)+WAL_FRAME_HDRSIZE) \ +) + +/* +** An open write-ahead log file is represented by an instance of the +** following object. +*/ +struct Wal { + sqlite3_vfs *pVfs; /* The VFS used to create pDbFd */ + sqlite3_file *pDbFd; /* File handle for the database file */ + sqlite3_file *pWalFd; /* File handle for WAL file */ + u32 iCallback; /* Value to pass to log callback (or 0) */ + i64 mxWalSize; /* Truncate WAL to this size upon reset */ + int nWiData; /* Size of array apWiData */ + int szFirstBlock; /* Size of first block written to WAL file */ + volatile u32 **apWiData; /* Pointer to wal-index content in memory */ + u32 szPage; /* Database page size */ + i16 readLock; /* Which read lock is being held. -1 for none */ + u8 syncFlags; /* Flags to use to sync header writes */ + u8 exclusiveMode; /* Non-zero if connection is in exclusive mode */ + u8 writeLock; /* True if in a write transaction */ + u8 ckptLock; /* True if holding a checkpoint lock */ + u8 readOnly; /* WAL_RDWR, WAL_RDONLY, or WAL_SHM_RDONLY */ + u8 truncateOnCommit; /* True to truncate WAL file on commit */ + u8 syncHeader; /* Fsync the WAL header if true */ + u8 padToSectorBoundary; /* Pad transactions out to the next sector */ + WalIndexHdr hdr; /* Wal-index header for current transaction */ + u32 minFrame; /* Ignore wal frames before this one */ + u32 iReCksum; /* On commit, recalculate checksums from here */ + const char *zWalName; /* Name of WAL file */ + u32 nCkpt; /* Checkpoint sequence counter in the wal-header */ +#ifdef SQLITE_DEBUG + u8 lockError; /* True if a locking error has occurred */ +#endif +#ifdef SQLITE_ENABLE_SNAPSHOT + WalIndexHdr *pSnapshot; /* Start transaction here if not NULL */ +#endif +}; + +/* +** Candidate values for Wal.exclusiveMode. +*/ +#define WAL_NORMAL_MODE 0 +#define WAL_EXCLUSIVE_MODE 1 +#define WAL_HEAPMEMORY_MODE 2 + +/* +** Possible values for WAL.readOnly +*/ +#define WAL_RDWR 0 /* Normal read/write connection */ +#define WAL_RDONLY 1 /* The WAL file is readonly */ +#define WAL_SHM_RDONLY 2 /* The SHM file is readonly */ + +/* +** Each page of the wal-index mapping contains a hash-table made up of +** an array of HASHTABLE_NSLOT elements of the following type. +*/ +typedef u16 ht_slot; + +/* +** This structure is used to implement an iterator that loops through +** all frames in the WAL in database page order. Where two or more frames +** correspond to the same database page, the iterator visits only the +** frame most recently written to the WAL (in other words, the frame with +** the largest index). +** +** The internals of this structure are only accessed by: +** +** walIteratorInit() - Create a new iterator, +** walIteratorNext() - Step an iterator, +** walIteratorFree() - Free an iterator. +** +** This functionality is used by the checkpoint code (see walCheckpoint()). +*/ +struct WalIterator { + int iPrior; /* Last result returned from the iterator */ + int nSegment; /* Number of entries in aSegment[] */ + struct WalSegment { + int iNext; /* Next slot in aIndex[] not yet returned */ + ht_slot *aIndex; /* i0, i1, i2... such that aPgno[iN] ascend */ + u32 *aPgno; /* Array of page numbers. */ + int nEntry; /* Nr. of entries in aPgno[] and aIndex[] */ + int iZero; /* Frame number associated with aPgno[0] */ + } aSegment[1]; /* One for every 32KB page in the wal-index */ +}; + +/* +** Define the parameters of the hash tables in the wal-index file. There +** is a hash-table following every HASHTABLE_NPAGE page numbers in the +** wal-index. +** +** Changing any of these constants will alter the wal-index format and +** create incompatibilities. +*/ +#define HASHTABLE_NPAGE 4096 /* Must be power of 2 */ +#define HASHTABLE_HASH_1 383 /* Should be prime */ +#define HASHTABLE_NSLOT (HASHTABLE_NPAGE*2) /* Must be a power of 2 */ + +/* +** The block of page numbers associated with the first hash-table in a +** wal-index is smaller than usual. This is so that there is a complete +** hash-table on each aligned 32KB page of the wal-index. +*/ +#define HASHTABLE_NPAGE_ONE (HASHTABLE_NPAGE - (WALINDEX_HDR_SIZE/sizeof(u32))) + +/* The wal-index is divided into pages of WALINDEX_PGSZ bytes each. */ +#define WALINDEX_PGSZ ( \ + sizeof(ht_slot)*HASHTABLE_NSLOT + HASHTABLE_NPAGE*sizeof(u32) \ +) + +/* +** Obtain a pointer to the iPage'th page of the wal-index. The wal-index +** is broken into pages of WALINDEX_PGSZ bytes. Wal-index pages are +** numbered from zero. +** +** If this call is successful, *ppPage is set to point to the wal-index +** page and SQLITE_OK is returned. If an error (an OOM or VFS error) occurs, +** then an SQLite error code is returned and *ppPage is set to 0. +*/ +static int walIndexPage(Wal *pWal, int iPage, volatile u32 **ppPage){ + int rc = SQLITE_OK; + + /* Enlarge the pWal->apWiData[] array if required */ + if( pWal->nWiData<=iPage ){ + int nByte = sizeof(u32*)*(iPage+1); + volatile u32 **apNew; + apNew = (volatile u32 **)sqlite3_realloc64((void *)pWal->apWiData, nByte); + if( !apNew ){ + *ppPage = 0; + return SQLITE_NOMEM_BKPT; + } + memset((void*)&apNew[pWal->nWiData], 0, + sizeof(u32*)*(iPage+1-pWal->nWiData)); + pWal->apWiData = apNew; + pWal->nWiData = iPage+1; + } + + /* Request a pointer to the required page from the VFS */ + if( pWal->apWiData[iPage]==0 ){ + if( pWal->exclusiveMode==WAL_HEAPMEMORY_MODE ){ + pWal->apWiData[iPage] = (u32 volatile *)sqlite3MallocZero(WALINDEX_PGSZ); + if( !pWal->apWiData[iPage] ) rc = SQLITE_NOMEM_BKPT; + }else{ + rc = sqlite3OsShmMap(pWal->pDbFd, iPage, WALINDEX_PGSZ, + pWal->writeLock, (void volatile **)&pWal->apWiData[iPage] + ); + if( rc==SQLITE_READONLY ){ + pWal->readOnly |= WAL_SHM_RDONLY; + rc = SQLITE_OK; + } + } + } + + *ppPage = pWal->apWiData[iPage]; + assert( iPage==0 || *ppPage || rc!=SQLITE_OK ); + return rc; +} + +/* +** Return a pointer to the WalCkptInfo structure in the wal-index. +*/ +static volatile WalCkptInfo *walCkptInfo(Wal *pWal){ + assert( pWal->nWiData>0 && pWal->apWiData[0] ); + return (volatile WalCkptInfo*)&(pWal->apWiData[0][sizeof(WalIndexHdr)/2]); +} + +/* +** Return a pointer to the WalIndexHdr structure in the wal-index. +*/ +static volatile WalIndexHdr *walIndexHdr(Wal *pWal){ + assert( pWal->nWiData>0 && pWal->apWiData[0] ); + return (volatile WalIndexHdr*)pWal->apWiData[0]; +} + +/* +** The argument to this macro must be of type u32. On a little-endian +** architecture, it returns the u32 value that results from interpreting +** the 4 bytes as a big-endian value. On a big-endian architecture, it +** returns the value that would be produced by interpreting the 4 bytes +** of the input value as a little-endian integer. +*/ +#define BYTESWAP32(x) ( \ + (((x)&0x000000FF)<<24) + (((x)&0x0000FF00)<<8) \ + + (((x)&0x00FF0000)>>8) + (((x)&0xFF000000)>>24) \ +) + +/* +** Generate or extend an 8 byte checksum based on the data in +** array aByte[] and the initial values of aIn[0] and aIn[1] (or +** initial values of 0 and 0 if aIn==NULL). +** +** The checksum is written back into aOut[] before returning. +** +** nByte must be a positive multiple of 8. +*/ +static void walChecksumBytes( + int nativeCksum, /* True for native byte-order, false for non-native */ + u8 *a, /* Content to be checksummed */ + int nByte, /* Bytes of content in a[]. Must be a multiple of 8. */ + const u32 *aIn, /* Initial checksum value input */ + u32 *aOut /* OUT: Final checksum value output */ +){ + u32 s1, s2; + u32 *aData = (u32 *)a; + u32 *aEnd = (u32 *)&a[nByte]; + + if( aIn ){ + s1 = aIn[0]; + s2 = aIn[1]; + }else{ + s1 = s2 = 0; + } + + assert( nByte>=8 ); + assert( (nByte&0x00000007)==0 ); + + if( nativeCksum ){ + do { + s1 += *aData++ + s2; + s2 += *aData++ + s1; + }while( aDataexclusiveMode!=WAL_HEAPMEMORY_MODE ){ + sqlite3OsShmBarrier(pWal->pDbFd); + } +} + +/* +** Write the header information in pWal->hdr into the wal-index. +** +** The checksum on pWal->hdr is updated before it is written. +*/ +static void walIndexWriteHdr(Wal *pWal){ + volatile WalIndexHdr *aHdr = walIndexHdr(pWal); + const int nCksum = offsetof(WalIndexHdr, aCksum); + + assert( pWal->writeLock ); + pWal->hdr.isInit = 1; + pWal->hdr.iVersion = WALINDEX_MAX_VERSION; + walChecksumBytes(1, (u8*)&pWal->hdr, nCksum, 0, pWal->hdr.aCksum); + memcpy((void*)&aHdr[1], (const void*)&pWal->hdr, sizeof(WalIndexHdr)); + walShmBarrier(pWal); + memcpy((void*)&aHdr[0], (const void*)&pWal->hdr, sizeof(WalIndexHdr)); +} + +/* +** This function encodes a single frame header and writes it to a buffer +** supplied by the caller. A frame-header is made up of a series of +** 4-byte big-endian integers, as follows: +** +** 0: Page number. +** 4: For commit records, the size of the database image in pages +** after the commit. For all other records, zero. +** 8: Salt-1 (copied from the wal-header) +** 12: Salt-2 (copied from the wal-header) +** 16: Checksum-1. +** 20: Checksum-2. +*/ +static void walEncodeFrame( + Wal *pWal, /* The write-ahead log */ + u32 iPage, /* Database page number for frame */ + u32 nTruncate, /* New db size (or 0 for non-commit frames) */ + u8 *aData, /* Pointer to page data */ + u8 *aFrame /* OUT: Write encoded frame here */ +){ + int nativeCksum; /* True for native byte-order checksums */ + u32 *aCksum = pWal->hdr.aFrameCksum; + assert( WAL_FRAME_HDRSIZE==24 ); + sqlite3Put4byte(&aFrame[0], iPage); + sqlite3Put4byte(&aFrame[4], nTruncate); + if( pWal->iReCksum==0 ){ + memcpy(&aFrame[8], pWal->hdr.aSalt, 8); + + nativeCksum = (pWal->hdr.bigEndCksum==SQLITE_BIGENDIAN); + walChecksumBytes(nativeCksum, aFrame, 8, aCksum, aCksum); + walChecksumBytes(nativeCksum, aData, pWal->szPage, aCksum, aCksum); + + sqlite3Put4byte(&aFrame[16], aCksum[0]); + sqlite3Put4byte(&aFrame[20], aCksum[1]); + }else{ + memset(&aFrame[8], 0, 16); + } +} + +/* +** Check to see if the frame with header in aFrame[] and content +** in aData[] is valid. If it is a valid frame, fill *piPage and +** *pnTruncate and return true. Return if the frame is not valid. +*/ +static int walDecodeFrame( + Wal *pWal, /* The write-ahead log */ + u32 *piPage, /* OUT: Database page number for frame */ + u32 *pnTruncate, /* OUT: New db size (or 0 if not commit) */ + u8 *aData, /* Pointer to page data (for checksum) */ + u8 *aFrame /* Frame data */ +){ + int nativeCksum; /* True for native byte-order checksums */ + u32 *aCksum = pWal->hdr.aFrameCksum; + u32 pgno; /* Page number of the frame */ + assert( WAL_FRAME_HDRSIZE==24 ); + + /* A frame is only valid if the salt values in the frame-header + ** match the salt values in the wal-header. + */ + if( memcmp(&pWal->hdr.aSalt, &aFrame[8], 8)!=0 ){ + return 0; + } + + /* A frame is only valid if the page number is creater than zero. + */ + pgno = sqlite3Get4byte(&aFrame[0]); + if( pgno==0 ){ + return 0; + } + + /* A frame is only valid if a checksum of the WAL header, + ** all prior frams, the first 16 bytes of this frame-header, + ** and the frame-data matches the checksum in the last 8 + ** bytes of this frame-header. + */ + nativeCksum = (pWal->hdr.bigEndCksum==SQLITE_BIGENDIAN); + walChecksumBytes(nativeCksum, aFrame, 8, aCksum, aCksum); + walChecksumBytes(nativeCksum, aData, pWal->szPage, aCksum, aCksum); + if( aCksum[0]!=sqlite3Get4byte(&aFrame[16]) + || aCksum[1]!=sqlite3Get4byte(&aFrame[20]) + ){ + /* Checksum failed. */ + return 0; + } + + /* If we reach this point, the frame is valid. Return the page number + ** and the new database size. + */ + *piPage = pgno; + *pnTruncate = sqlite3Get4byte(&aFrame[4]); + return 1; +} + + +#if defined(SQLITE_TEST) && defined(SQLITE_DEBUG) +/* +** Names of locks. This routine is used to provide debugging output and is not +** a part of an ordinary build. +*/ +static const char *walLockName(int lockIdx){ + if( lockIdx==WAL_WRITE_LOCK ){ + return "WRITE-LOCK"; + }else if( lockIdx==WAL_CKPT_LOCK ){ + return "CKPT-LOCK"; + }else if( lockIdx==WAL_RECOVER_LOCK ){ + return "RECOVER-LOCK"; + }else{ + static char zName[15]; + sqlite3_snprintf(sizeof(zName), zName, "READ-LOCK[%d]", + lockIdx-WAL_READ_LOCK(0)); + return zName; + } +} +#endif /*defined(SQLITE_TEST) || defined(SQLITE_DEBUG) */ + + +/* +** Set or release locks on the WAL. Locks are either shared or exclusive. +** A lock cannot be moved directly between shared and exclusive - it must go +** through the unlocked state first. +** +** In locking_mode=EXCLUSIVE, all of these routines become no-ops. +*/ +static int walLockShared(Wal *pWal, int lockIdx){ + int rc; + if( pWal->exclusiveMode ) return SQLITE_OK; + rc = sqlite3OsShmLock(pWal->pDbFd, lockIdx, 1, + SQLITE_SHM_LOCK | SQLITE_SHM_SHARED); + WALTRACE(("WAL%p: acquire SHARED-%s %s\n", pWal, + walLockName(lockIdx), rc ? "failed" : "ok")); + VVA_ONLY( pWal->lockError = (u8)(rc!=SQLITE_OK && rc!=SQLITE_BUSY); ) + return rc; +} +static void walUnlockShared(Wal *pWal, int lockIdx){ + if( pWal->exclusiveMode ) return; + (void)sqlite3OsShmLock(pWal->pDbFd, lockIdx, 1, + SQLITE_SHM_UNLOCK | SQLITE_SHM_SHARED); + WALTRACE(("WAL%p: release SHARED-%s\n", pWal, walLockName(lockIdx))); +} +static int walLockExclusive(Wal *pWal, int lockIdx, int n){ + int rc; + if( pWal->exclusiveMode ) return SQLITE_OK; + rc = sqlite3OsShmLock(pWal->pDbFd, lockIdx, n, + SQLITE_SHM_LOCK | SQLITE_SHM_EXCLUSIVE); + WALTRACE(("WAL%p: acquire EXCLUSIVE-%s cnt=%d %s\n", pWal, + walLockName(lockIdx), n, rc ? "failed" : "ok")); + VVA_ONLY( pWal->lockError = (u8)(rc!=SQLITE_OK && rc!=SQLITE_BUSY); ) + return rc; +} +static void walUnlockExclusive(Wal *pWal, int lockIdx, int n){ + if( pWal->exclusiveMode ) return; + (void)sqlite3OsShmLock(pWal->pDbFd, lockIdx, n, + SQLITE_SHM_UNLOCK | SQLITE_SHM_EXCLUSIVE); + WALTRACE(("WAL%p: release EXCLUSIVE-%s cnt=%d\n", pWal, + walLockName(lockIdx), n)); +} + +/* +** Compute a hash on a page number. The resulting hash value must land +** between 0 and (HASHTABLE_NSLOT-1). The walHashNext() function advances +** the hash to the next value in the event of a collision. +*/ +static int walHash(u32 iPage){ + assert( iPage>0 ); + assert( (HASHTABLE_NSLOT & (HASHTABLE_NSLOT-1))==0 ); + return (iPage*HASHTABLE_HASH_1) & (HASHTABLE_NSLOT-1); +} +static int walNextHash(int iPriorHash){ + return (iPriorHash+1)&(HASHTABLE_NSLOT-1); +} + +/* +** Return pointers to the hash table and page number array stored on +** page iHash of the wal-index. The wal-index is broken into 32KB pages +** numbered starting from 0. +** +** Set output variable *paHash to point to the start of the hash table +** in the wal-index file. Set *piZero to one less than the frame +** number of the first frame indexed by this hash table. If a +** slot in the hash table is set to N, it refers to frame number +** (*piZero+N) in the log. +** +** Finally, set *paPgno so that *paPgno[1] is the page number of the +** first frame indexed by the hash table, frame (*piZero+1). +*/ +static int walHashGet( + Wal *pWal, /* WAL handle */ + int iHash, /* Find the iHash'th table */ + volatile ht_slot **paHash, /* OUT: Pointer to hash index */ + volatile u32 **paPgno, /* OUT: Pointer to page number array */ + u32 *piZero /* OUT: Frame associated with *paPgno[0] */ +){ + int rc; /* Return code */ + volatile u32 *aPgno; + + rc = walIndexPage(pWal, iHash, &aPgno); + assert( rc==SQLITE_OK || iHash>0 ); + + if( rc==SQLITE_OK ){ + u32 iZero; + volatile ht_slot *aHash; + + aHash = (volatile ht_slot *)&aPgno[HASHTABLE_NPAGE]; + if( iHash==0 ){ + aPgno = &aPgno[WALINDEX_HDR_SIZE/sizeof(u32)]; + iZero = 0; + }else{ + iZero = HASHTABLE_NPAGE_ONE + (iHash-1)*HASHTABLE_NPAGE; + } + + *paPgno = &aPgno[-1]; + *paHash = aHash; + *piZero = iZero; + } + return rc; +} + +/* +** Return the number of the wal-index page that contains the hash-table +** and page-number array that contain entries corresponding to WAL frame +** iFrame. The wal-index is broken up into 32KB pages. Wal-index pages +** are numbered starting from 0. +*/ +static int walFramePage(u32 iFrame){ + int iHash = (iFrame+HASHTABLE_NPAGE-HASHTABLE_NPAGE_ONE-1) / HASHTABLE_NPAGE; + assert( (iHash==0 || iFrame>HASHTABLE_NPAGE_ONE) + && (iHash>=1 || iFrame<=HASHTABLE_NPAGE_ONE) + && (iHash<=1 || iFrame>(HASHTABLE_NPAGE_ONE+HASHTABLE_NPAGE)) + && (iHash>=2 || iFrame<=HASHTABLE_NPAGE_ONE+HASHTABLE_NPAGE) + && (iHash<=2 || iFrame>(HASHTABLE_NPAGE_ONE+2*HASHTABLE_NPAGE)) + ); + return iHash; +} + +/* +** Return the page number associated with frame iFrame in this WAL. +*/ +static u32 walFramePgno(Wal *pWal, u32 iFrame){ + int iHash = walFramePage(iFrame); + if( iHash==0 ){ + return pWal->apWiData[0][WALINDEX_HDR_SIZE/sizeof(u32) + iFrame - 1]; + } + return pWal->apWiData[iHash][(iFrame-1-HASHTABLE_NPAGE_ONE)%HASHTABLE_NPAGE]; +} + +/* +** Remove entries from the hash table that point to WAL slots greater +** than pWal->hdr.mxFrame. +** +** This function is called whenever pWal->hdr.mxFrame is decreased due +** to a rollback or savepoint. +** +** At most only the hash table containing pWal->hdr.mxFrame needs to be +** updated. Any later hash tables will be automatically cleared when +** pWal->hdr.mxFrame advances to the point where those hash tables are +** actually needed. +*/ +static void walCleanupHash(Wal *pWal){ + volatile ht_slot *aHash = 0; /* Pointer to hash table to clear */ + volatile u32 *aPgno = 0; /* Page number array for hash table */ + u32 iZero = 0; /* frame == (aHash[x]+iZero) */ + int iLimit = 0; /* Zero values greater than this */ + int nByte; /* Number of bytes to zero in aPgno[] */ + int i; /* Used to iterate through aHash[] */ + + assert( pWal->writeLock ); + testcase( pWal->hdr.mxFrame==HASHTABLE_NPAGE_ONE-1 ); + testcase( pWal->hdr.mxFrame==HASHTABLE_NPAGE_ONE ); + testcase( pWal->hdr.mxFrame==HASHTABLE_NPAGE_ONE+1 ); + + if( pWal->hdr.mxFrame==0 ) return; + + /* Obtain pointers to the hash-table and page-number array containing + ** the entry that corresponds to frame pWal->hdr.mxFrame. It is guaranteed + ** that the page said hash-table and array reside on is already mapped. + */ + assert( pWal->nWiData>walFramePage(pWal->hdr.mxFrame) ); + assert( pWal->apWiData[walFramePage(pWal->hdr.mxFrame)] ); + walHashGet(pWal, walFramePage(pWal->hdr.mxFrame), &aHash, &aPgno, &iZero); + + /* Zero all hash-table entries that correspond to frame numbers greater + ** than pWal->hdr.mxFrame. + */ + iLimit = pWal->hdr.mxFrame - iZero; + assert( iLimit>0 ); + for(i=0; iiLimit ){ + aHash[i] = 0; + } + } + + /* Zero the entries in the aPgno array that correspond to frames with + ** frame numbers greater than pWal->hdr.mxFrame. + */ + nByte = (int)((char *)aHash - (char *)&aPgno[iLimit+1]); + memset((void *)&aPgno[iLimit+1], 0, nByte); + +#ifdef SQLITE_ENABLE_EXPENSIVE_ASSERT + /* Verify that the every entry in the mapping region is still reachable + ** via the hash table even after the cleanup. + */ + if( iLimit ){ + int j; /* Loop counter */ + int iKey; /* Hash key */ + for(j=1; j<=iLimit; j++){ + for(iKey=walHash(aPgno[j]); aHash[iKey]; iKey=walNextHash(iKey)){ + if( aHash[iKey]==j ) break; + } + assert( aHash[iKey]==j ); + } + } +#endif /* SQLITE_ENABLE_EXPENSIVE_ASSERT */ +} + + +/* +** Set an entry in the wal-index that will map database page number +** pPage into WAL frame iFrame. +*/ +static int walIndexAppend(Wal *pWal, u32 iFrame, u32 iPage){ + int rc; /* Return code */ + u32 iZero = 0; /* One less than frame number of aPgno[1] */ + volatile u32 *aPgno = 0; /* Page number array */ + volatile ht_slot *aHash = 0; /* Hash table */ + + rc = walHashGet(pWal, walFramePage(iFrame), &aHash, &aPgno, &iZero); + + /* Assuming the wal-index file was successfully mapped, populate the + ** page number array and hash table entry. + */ + if( rc==SQLITE_OK ){ + int iKey; /* Hash table key */ + int idx; /* Value to write to hash-table slot */ + int nCollide; /* Number of hash collisions */ + + idx = iFrame - iZero; + assert( idx <= HASHTABLE_NSLOT/2 + 1 ); + + /* If this is the first entry to be added to this hash-table, zero the + ** entire hash table and aPgno[] array before proceeding. + */ + if( idx==1 ){ + int nByte = (int)((u8 *)&aHash[HASHTABLE_NSLOT] - (u8 *)&aPgno[1]); + memset((void*)&aPgno[1], 0, nByte); + } + + /* If the entry in aPgno[] is already set, then the previous writer + ** must have exited unexpectedly in the middle of a transaction (after + ** writing one or more dirty pages to the WAL to free up memory). + ** Remove the remnants of that writers uncommitted transaction from + ** the hash-table before writing any new entries. + */ + if( aPgno[idx] ){ + walCleanupHash(pWal); + assert( !aPgno[idx] ); + } + + /* Write the aPgno[] array entry and the hash-table slot. */ + nCollide = idx; + for(iKey=walHash(iPage); aHash[iKey]; iKey=walNextHash(iKey)){ + if( (nCollide--)==0 ) return SQLITE_CORRUPT_BKPT; + } + aPgno[idx] = iPage; + aHash[iKey] = (ht_slot)idx; + +#ifdef SQLITE_ENABLE_EXPENSIVE_ASSERT + /* Verify that the number of entries in the hash table exactly equals + ** the number of entries in the mapping region. + */ + { + int i; /* Loop counter */ + int nEntry = 0; /* Number of entries in the hash table */ + for(i=0; ickptLock==1 || pWal->ckptLock==0 ); + assert( WAL_ALL_BUT_WRITE==WAL_WRITE_LOCK+1 ); + assert( WAL_CKPT_LOCK==WAL_ALL_BUT_WRITE ); + assert( pWal->writeLock ); + iLock = WAL_ALL_BUT_WRITE + pWal->ckptLock; + nLock = SQLITE_SHM_NLOCK - iLock; + rc = walLockExclusive(pWal, iLock, nLock); + if( rc ){ + return rc; + } + WALTRACE(("WAL%p: recovery begin...\n", pWal)); + + memset(&pWal->hdr, 0, sizeof(WalIndexHdr)); + + rc = sqlite3OsFileSize(pWal->pWalFd, &nSize); + if( rc!=SQLITE_OK ){ + goto recovery_error; + } + + if( nSize>WAL_HDRSIZE ){ + u8 aBuf[WAL_HDRSIZE]; /* Buffer to load WAL header into */ + u8 *aFrame = 0; /* Malloc'd buffer to load entire frame */ + int szFrame; /* Number of bytes in buffer aFrame[] */ + u8 *aData; /* Pointer to data part of aFrame buffer */ + int iFrame; /* Index of last frame read */ + i64 iOffset; /* Next offset to read from log file */ + int szPage; /* Page size according to the log */ + u32 magic; /* Magic value read from WAL header */ + u32 version; /* Magic value read from WAL header */ + int isValid; /* True if this frame is valid */ + + /* Read in the WAL header. */ + rc = sqlite3OsRead(pWal->pWalFd, aBuf, WAL_HDRSIZE, 0); + if( rc!=SQLITE_OK ){ + goto recovery_error; + } + + /* If the database page size is not a power of two, or is greater than + ** SQLITE_MAX_PAGE_SIZE, conclude that the WAL file contains no valid + ** data. Similarly, if the 'magic' value is invalid, ignore the whole + ** WAL file. + */ + magic = sqlite3Get4byte(&aBuf[0]); + szPage = sqlite3Get4byte(&aBuf[8]); + if( (magic&0xFFFFFFFE)!=WAL_MAGIC + || szPage&(szPage-1) + || szPage>SQLITE_MAX_PAGE_SIZE + || szPage<512 + ){ + goto finished; + } + pWal->hdr.bigEndCksum = (u8)(magic&0x00000001); + pWal->szPage = szPage; + pWal->nCkpt = sqlite3Get4byte(&aBuf[12]); + memcpy(&pWal->hdr.aSalt, &aBuf[16], 8); + + /* Verify that the WAL header checksum is correct */ + walChecksumBytes(pWal->hdr.bigEndCksum==SQLITE_BIGENDIAN, + aBuf, WAL_HDRSIZE-2*4, 0, pWal->hdr.aFrameCksum + ); + if( pWal->hdr.aFrameCksum[0]!=sqlite3Get4byte(&aBuf[24]) + || pWal->hdr.aFrameCksum[1]!=sqlite3Get4byte(&aBuf[28]) + ){ + goto finished; + } + + /* Verify that the version number on the WAL format is one that + ** are able to understand */ + version = sqlite3Get4byte(&aBuf[4]); + if( version!=WAL_MAX_VERSION ){ + rc = SQLITE_CANTOPEN_BKPT; + goto finished; + } + + /* Malloc a buffer to read frames into. */ + szFrame = szPage + WAL_FRAME_HDRSIZE; + aFrame = (u8 *)sqlite3_malloc64(szFrame); + if( !aFrame ){ + rc = SQLITE_NOMEM_BKPT; + goto recovery_error; + } + aData = &aFrame[WAL_FRAME_HDRSIZE]; + + /* Read all frames from the log file. */ + iFrame = 0; + for(iOffset=WAL_HDRSIZE; (iOffset+szFrame)<=nSize; iOffset+=szFrame){ + u32 pgno; /* Database page number for frame */ + u32 nTruncate; /* dbsize field from frame header */ + + /* Read and decode the next log frame. */ + iFrame++; + rc = sqlite3OsRead(pWal->pWalFd, aFrame, szFrame, iOffset); + if( rc!=SQLITE_OK ) break; + isValid = walDecodeFrame(pWal, &pgno, &nTruncate, aData, aFrame); + if( !isValid ) break; + rc = walIndexAppend(pWal, iFrame, pgno); + if( rc!=SQLITE_OK ) break; + + /* If nTruncate is non-zero, this is a commit record. */ + if( nTruncate ){ + pWal->hdr.mxFrame = iFrame; + pWal->hdr.nPage = nTruncate; + pWal->hdr.szPage = (u16)((szPage&0xff00) | (szPage>>16)); + testcase( szPage<=32768 ); + testcase( szPage>=65536 ); + aFrameCksum[0] = pWal->hdr.aFrameCksum[0]; + aFrameCksum[1] = pWal->hdr.aFrameCksum[1]; + } + } + + sqlite3_free(aFrame); + } + +finished: + if( rc==SQLITE_OK ){ + volatile WalCkptInfo *pInfo; + int i; + pWal->hdr.aFrameCksum[0] = aFrameCksum[0]; + pWal->hdr.aFrameCksum[1] = aFrameCksum[1]; + walIndexWriteHdr(pWal); + + /* Reset the checkpoint-header. This is safe because this thread is + ** currently holding locks that exclude all other readers, writers and + ** checkpointers. + */ + pInfo = walCkptInfo(pWal); + pInfo->nBackfill = 0; + pInfo->nBackfillAttempted = pWal->hdr.mxFrame; + pInfo->aReadMark[0] = 0; + for(i=1; iaReadMark[i] = READMARK_NOT_USED; + if( pWal->hdr.mxFrame ) pInfo->aReadMark[1] = pWal->hdr.mxFrame; + + /* If more than one frame was recovered from the log file, report an + ** event via sqlite3_log(). This is to help with identifying performance + ** problems caused by applications routinely shutting down without + ** checkpointing the log file. + */ + if( pWal->hdr.nPage ){ + sqlite3_log(SQLITE_NOTICE_RECOVER_WAL, + "recovered %d frames from WAL file %s", + pWal->hdr.mxFrame, pWal->zWalName + ); + } + } + +recovery_error: + WALTRACE(("WAL%p: recovery %s\n", pWal, rc ? "failed" : "ok")); + walUnlockExclusive(pWal, iLock, nLock); + return rc; +} + +/* +** Close an open wal-index. +*/ +static void walIndexClose(Wal *pWal, int isDelete){ + if( pWal->exclusiveMode==WAL_HEAPMEMORY_MODE ){ + int i; + for(i=0; inWiData; i++){ + sqlite3_free((void *)pWal->apWiData[i]); + pWal->apWiData[i] = 0; + } + }else{ + sqlite3OsShmUnmap(pWal->pDbFd, isDelete); + } +} + +/* +** Open a connection to the WAL file zWalName. The database file must +** already be opened on connection pDbFd. The buffer that zWalName points +** to must remain valid for the lifetime of the returned Wal* handle. +** +** A SHARED lock should be held on the database file when this function +** is called. The purpose of this SHARED lock is to prevent any other +** client from unlinking the WAL or wal-index file. If another process +** were to do this just after this client opened one of these files, the +** system would be badly broken. +** +** If the log file is successfully opened, SQLITE_OK is returned and +** *ppWal is set to point to a new WAL handle. If an error occurs, +** an SQLite error code is returned and *ppWal is left unmodified. +*/ +SQLITE_PRIVATE int sqlite3WalOpen( + sqlite3_vfs *pVfs, /* vfs module to open wal and wal-index */ + sqlite3_file *pDbFd, /* The open database file */ + const char *zWalName, /* Name of the WAL file */ + int bNoShm, /* True to run in heap-memory mode */ + i64 mxWalSize, /* Truncate WAL to this size on reset */ + Wal **ppWal /* OUT: Allocated Wal handle */ +){ + int rc; /* Return Code */ + Wal *pRet; /* Object to allocate and return */ + int flags; /* Flags passed to OsOpen() */ + + assert( zWalName && zWalName[0] ); + assert( pDbFd ); + + /* In the amalgamation, the os_unix.c and os_win.c source files come before + ** this source file. Verify that the #defines of the locking byte offsets + ** in os_unix.c and os_win.c agree with the WALINDEX_LOCK_OFFSET value. + ** For that matter, if the lock offset ever changes from its initial design + ** value of 120, we need to know that so there is an assert() to check it. + */ + assert( 120==WALINDEX_LOCK_OFFSET ); + assert( 136==WALINDEX_HDR_SIZE ); +#ifdef WIN_SHM_BASE + assert( WIN_SHM_BASE==WALINDEX_LOCK_OFFSET ); +#endif +#ifdef UNIX_SHM_BASE + assert( UNIX_SHM_BASE==WALINDEX_LOCK_OFFSET ); +#endif + + + /* Allocate an instance of struct Wal to return. */ + *ppWal = 0; + pRet = (Wal*)sqlite3MallocZero(sizeof(Wal) + pVfs->szOsFile); + if( !pRet ){ + return SQLITE_NOMEM_BKPT; + } + + pRet->pVfs = pVfs; + pRet->pWalFd = (sqlite3_file *)&pRet[1]; + pRet->pDbFd = pDbFd; + pRet->readLock = -1; + pRet->mxWalSize = mxWalSize; + pRet->zWalName = zWalName; + pRet->syncHeader = 1; + pRet->padToSectorBoundary = 1; + pRet->exclusiveMode = (bNoShm ? WAL_HEAPMEMORY_MODE: WAL_NORMAL_MODE); + + /* Open file handle on the write-ahead log file. */ + flags = (SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|SQLITE_OPEN_WAL); + rc = sqlite3OsOpen(pVfs, zWalName, pRet->pWalFd, flags, &flags); + if( rc==SQLITE_OK && flags&SQLITE_OPEN_READONLY ){ + pRet->readOnly = WAL_RDONLY; + } + + if( rc!=SQLITE_OK ){ + walIndexClose(pRet, 0); + sqlite3OsClose(pRet->pWalFd); + sqlite3_free(pRet); + }else{ + int iDC = sqlite3OsDeviceCharacteristics(pDbFd); + if( iDC & SQLITE_IOCAP_SEQUENTIAL ){ pRet->syncHeader = 0; } + if( iDC & SQLITE_IOCAP_POWERSAFE_OVERWRITE ){ + pRet->padToSectorBoundary = 0; + } + *ppWal = pRet; + WALTRACE(("WAL%d: opened\n", pRet)); + } + return rc; +} + +/* +** Change the size to which the WAL file is trucated on each reset. +*/ +SQLITE_PRIVATE void sqlite3WalLimit(Wal *pWal, i64 iLimit){ + if( pWal ) pWal->mxWalSize = iLimit; +} + +/* +** Find the smallest page number out of all pages held in the WAL that +** has not been returned by any prior invocation of this method on the +** same WalIterator object. Write into *piFrame the frame index where +** that page was last written into the WAL. Write into *piPage the page +** number. +** +** Return 0 on success. If there are no pages in the WAL with a page +** number larger than *piPage, then return 1. +*/ +static int walIteratorNext( + WalIterator *p, /* Iterator */ + u32 *piPage, /* OUT: The page number of the next page */ + u32 *piFrame /* OUT: Wal frame index of next page */ +){ + u32 iMin; /* Result pgno must be greater than iMin */ + u32 iRet = 0xFFFFFFFF; /* 0xffffffff is never a valid page number */ + int i; /* For looping through segments */ + + iMin = p->iPrior; + assert( iMin<0xffffffff ); + for(i=p->nSegment-1; i>=0; i--){ + struct WalSegment *pSegment = &p->aSegment[i]; + while( pSegment->iNextnEntry ){ + u32 iPg = pSegment->aPgno[pSegment->aIndex[pSegment->iNext]]; + if( iPg>iMin ){ + if( iPgiZero + pSegment->aIndex[pSegment->iNext]; + } + break; + } + pSegment->iNext++; + } + } + + *piPage = p->iPrior = iRet; + return (iRet==0xFFFFFFFF); +} + +/* +** This function merges two sorted lists into a single sorted list. +** +** aLeft[] and aRight[] are arrays of indices. The sort key is +** aContent[aLeft[]] and aContent[aRight[]]. Upon entry, the following +** is guaranteed for all J0 && nRight>0 ); + while( iRight=nRight || aContent[aLeft[iLeft]]=nLeft || aContent[aLeft[iLeft]]>dbpage ); + assert( iRight>=nRight || aContent[aRight[iRight]]>dbpage ); + } + + *paRight = aLeft; + *pnRight = iOut; + memcpy(aLeft, aTmp, sizeof(aTmp[0])*iOut); +} + +/* +** Sort the elements in list aList using aContent[] as the sort key. +** Remove elements with duplicate keys, preferring to keep the +** larger aList[] values. +** +** The aList[] entries are indices into aContent[]. The values in +** aList[] are to be sorted so that for all J0 ); + assert( HASHTABLE_NPAGE==(1<<(ArraySize(aSub)-1)) ); + + for(iList=0; iListaList && p->nList<=(1<aList==&aList[iList&~((2<aList, p->nList, &aMerge, &nMerge, aBuffer); + } + aSub[iSub].aList = aMerge; + aSub[iSub].nList = nMerge; + } + + for(iSub++; iSubnList<=(1<aList==&aList[nList&~((2<aList, p->nList, &aMerge, &nMerge, aBuffer); + } + } + assert( aMerge==aList ); + *pnList = nMerge; + +#ifdef SQLITE_DEBUG + { + int i; + for(i=1; i<*pnList; i++){ + assert( aContent[aList[i]] > aContent[aList[i-1]] ); + } + } +#endif +} + +/* +** Free an iterator allocated by walIteratorInit(). +*/ +static void walIteratorFree(WalIterator *p){ + sqlite3_free(p); +} + +/* +** Construct a WalInterator object that can be used to loop over all +** pages in the WAL in ascending order. The caller must hold the checkpoint +** lock. +** +** On success, make *pp point to the newly allocated WalInterator object +** return SQLITE_OK. Otherwise, return an error code. If this routine +** returns an error, the value of *pp is undefined. +** +** The calling routine should invoke walIteratorFree() to destroy the +** WalIterator object when it has finished with it. +*/ +static int walIteratorInit(Wal *pWal, WalIterator **pp){ + WalIterator *p; /* Return value */ + int nSegment; /* Number of segments to merge */ + u32 iLast; /* Last frame in log */ + int nByte; /* Number of bytes to allocate */ + int i; /* Iterator variable */ + ht_slot *aTmp; /* Temp space used by merge-sort */ + int rc = SQLITE_OK; /* Return Code */ + + /* This routine only runs while holding the checkpoint lock. And + ** it only runs if there is actually content in the log (mxFrame>0). + */ + assert( pWal->ckptLock && pWal->hdr.mxFrame>0 ); + iLast = pWal->hdr.mxFrame; + + /* Allocate space for the WalIterator object. */ + nSegment = walFramePage(iLast) + 1; + nByte = sizeof(WalIterator) + + (nSegment-1)*sizeof(struct WalSegment) + + iLast*sizeof(ht_slot); + p = (WalIterator *)sqlite3_malloc64(nByte); + if( !p ){ + return SQLITE_NOMEM_BKPT; + } + memset(p, 0, nByte); + p->nSegment = nSegment; + + /* Allocate temporary space used by the merge-sort routine. This block + ** of memory will be freed before this function returns. + */ + aTmp = (ht_slot *)sqlite3_malloc64( + sizeof(ht_slot) * (iLast>HASHTABLE_NPAGE?HASHTABLE_NPAGE:iLast) + ); + if( !aTmp ){ + rc = SQLITE_NOMEM_BKPT; + } + + for(i=0; rc==SQLITE_OK && iaSegment[p->nSegment])[iZero]; + iZero++; + + for(j=0; jaSegment[i].iZero = iZero; + p->aSegment[i].nEntry = nEntry; + p->aSegment[i].aIndex = aIndex; + p->aSegment[i].aPgno = (u32 *)aPgno; + } + } + sqlite3_free(aTmp); + + if( rc!=SQLITE_OK ){ + walIteratorFree(p); + } + *pp = p; + return rc; +} + +/* +** Attempt to obtain the exclusive WAL lock defined by parameters lockIdx and +** n. If the attempt fails and parameter xBusy is not NULL, then it is a +** busy-handler function. Invoke it and retry the lock until either the +** lock is successfully obtained or the busy-handler returns 0. +*/ +static int walBusyLock( + Wal *pWal, /* WAL connection */ + int (*xBusy)(void*), /* Function to call when busy */ + void *pBusyArg, /* Context argument for xBusyHandler */ + int lockIdx, /* Offset of first byte to lock */ + int n /* Number of bytes to lock */ +){ + int rc; + do { + rc = walLockExclusive(pWal, lockIdx, n); + }while( xBusy && rc==SQLITE_BUSY && xBusy(pBusyArg) ); + return rc; +} + +/* +** The cache of the wal-index header must be valid to call this function. +** Return the page-size in bytes used by the database. +*/ +static int walPagesize(Wal *pWal){ + return (pWal->hdr.szPage&0xfe00) + ((pWal->hdr.szPage&0x0001)<<16); +} + +/* +** The following is guaranteed when this function is called: +** +** a) the WRITER lock is held, +** b) the entire log file has been checkpointed, and +** c) any existing readers are reading exclusively from the database +** file - there are no readers that may attempt to read a frame from +** the log file. +** +** This function updates the shared-memory structures so that the next +** client to write to the database (which may be this one) does so by +** writing frames into the start of the log file. +** +** The value of parameter salt1 is used as the aSalt[1] value in the +** new wal-index header. It should be passed a pseudo-random value (i.e. +** one obtained from sqlite3_randomness()). +*/ +static void walRestartHdr(Wal *pWal, u32 salt1){ + volatile WalCkptInfo *pInfo = walCkptInfo(pWal); + int i; /* Loop counter */ + u32 *aSalt = pWal->hdr.aSalt; /* Big-endian salt values */ + pWal->nCkpt++; + pWal->hdr.mxFrame = 0; + sqlite3Put4byte((u8*)&aSalt[0], 1 + sqlite3Get4byte((u8*)&aSalt[0])); + memcpy(&pWal->hdr.aSalt[1], &salt1, 4); + walIndexWriteHdr(pWal); + pInfo->nBackfill = 0; + pInfo->nBackfillAttempted = 0; + pInfo->aReadMark[1] = 0; + for(i=2; iaReadMark[i] = READMARK_NOT_USED; + assert( pInfo->aReadMark[0]==0 ); +} + +/* +** Copy as much content as we can from the WAL back into the database file +** in response to an sqlite3_wal_checkpoint() request or the equivalent. +** +** The amount of information copies from WAL to database might be limited +** by active readers. This routine will never overwrite a database page +** that a concurrent reader might be using. +** +** All I/O barrier operations (a.k.a fsyncs) occur in this routine when +** SQLite is in WAL-mode in synchronous=NORMAL. That means that if +** checkpoints are always run by a background thread or background +** process, foreground threads will never block on a lengthy fsync call. +** +** Fsync is called on the WAL before writing content out of the WAL and +** into the database. This ensures that if the new content is persistent +** in the WAL and can be recovered following a power-loss or hard reset. +** +** Fsync is also called on the database file if (and only if) the entire +** WAL content is copied into the database file. This second fsync makes +** it safe to delete the WAL since the new content will persist in the +** database file. +** +** This routine uses and updates the nBackfill field of the wal-index header. +** This is the only routine that will increase the value of nBackfill. +** (A WAL reset or recovery will revert nBackfill to zero, but not increase +** its value.) +** +** The caller must be holding sufficient locks to ensure that no other +** checkpoint is running (in any other thread or process) at the same +** time. +*/ +static int walCheckpoint( + Wal *pWal, /* Wal connection */ + int eMode, /* One of PASSIVE, FULL or RESTART */ + int (*xBusy)(void*), /* Function to call when busy */ + void *pBusyArg, /* Context argument for xBusyHandler */ + int sync_flags, /* Flags for OsSync() (or 0) */ + u8 *zBuf /* Temporary buffer to use */ +){ + int rc = SQLITE_OK; /* Return code */ + int szPage; /* Database page-size */ + WalIterator *pIter = 0; /* Wal iterator context */ + u32 iDbpage = 0; /* Next database page to write */ + u32 iFrame = 0; /* Wal frame containing data for iDbpage */ + u32 mxSafeFrame; /* Max frame that can be backfilled */ + u32 mxPage; /* Max database page to write */ + int i; /* Loop counter */ + volatile WalCkptInfo *pInfo; /* The checkpoint status information */ + + szPage = walPagesize(pWal); + testcase( szPage<=32768 ); + testcase( szPage>=65536 ); + pInfo = walCkptInfo(pWal); + if( pInfo->nBackfillhdr.mxFrame ){ + + /* Allocate the iterator */ + rc = walIteratorInit(pWal, &pIter); + if( rc!=SQLITE_OK ){ + return rc; + } + assert( pIter ); + + /* EVIDENCE-OF: R-62920-47450 The busy-handler callback is never invoked + ** in the SQLITE_CHECKPOINT_PASSIVE mode. */ + assert( eMode!=SQLITE_CHECKPOINT_PASSIVE || xBusy==0 ); + + /* Compute in mxSafeFrame the index of the last frame of the WAL that is + ** safe to write into the database. Frames beyond mxSafeFrame might + ** overwrite database pages that are in use by active readers and thus + ** cannot be backfilled from the WAL. + */ + mxSafeFrame = pWal->hdr.mxFrame; + mxPage = pWal->hdr.nPage; + for(i=1; iaReadMark[i]; + if( mxSafeFrame>y ){ + assert( y<=pWal->hdr.mxFrame ); + rc = walBusyLock(pWal, xBusy, pBusyArg, WAL_READ_LOCK(i), 1); + if( rc==SQLITE_OK ){ + pInfo->aReadMark[i] = (i==1 ? mxSafeFrame : READMARK_NOT_USED); + walUnlockExclusive(pWal, WAL_READ_LOCK(i), 1); + }else if( rc==SQLITE_BUSY ){ + mxSafeFrame = y; + xBusy = 0; + }else{ + goto walcheckpoint_out; + } + } + } + + if( pInfo->nBackfillnBackfill; + + pInfo->nBackfillAttempted = mxSafeFrame; + + /* Sync the WAL to disk */ + if( sync_flags ){ + rc = sqlite3OsSync(pWal->pWalFd, sync_flags); + } + + /* If the database may grow as a result of this checkpoint, hint + ** about the eventual size of the db file to the VFS layer. + */ + if( rc==SQLITE_OK ){ + i64 nReq = ((i64)mxPage * szPage); + rc = sqlite3OsFileSize(pWal->pDbFd, &nSize); + if( rc==SQLITE_OK && nSizepDbFd, SQLITE_FCNTL_SIZE_HINT, &nReq); + } + } + + + /* Iterate through the contents of the WAL, copying data to the db file */ + while( rc==SQLITE_OK && 0==walIteratorNext(pIter, &iDbpage, &iFrame) ){ + i64 iOffset; + assert( walFramePgno(pWal, iFrame)==iDbpage ); + if( iFrame<=nBackfill || iFrame>mxSafeFrame || iDbpage>mxPage ){ + continue; + } + iOffset = walFrameOffset(iFrame, szPage) + WAL_FRAME_HDRSIZE; + /* testcase( IS_BIG_INT(iOffset) ); // requires a 4GiB WAL file */ + rc = sqlite3OsRead(pWal->pWalFd, zBuf, szPage, iOffset); + if( rc!=SQLITE_OK ) break; + iOffset = (iDbpage-1)*(i64)szPage; + testcase( IS_BIG_INT(iOffset) ); + rc = sqlite3OsWrite(pWal->pDbFd, zBuf, szPage, iOffset); + if( rc!=SQLITE_OK ) break; + } + + /* If work was actually accomplished... */ + if( rc==SQLITE_OK ){ + if( mxSafeFrame==walIndexHdr(pWal)->mxFrame ){ + i64 szDb = pWal->hdr.nPage*(i64)szPage; + testcase( IS_BIG_INT(szDb) ); + rc = sqlite3OsTruncate(pWal->pDbFd, szDb); + if( rc==SQLITE_OK && sync_flags ){ + rc = sqlite3OsSync(pWal->pDbFd, sync_flags); + } + } + if( rc==SQLITE_OK ){ + pInfo->nBackfill = mxSafeFrame; + } + } + + /* Release the reader lock held while backfilling */ + walUnlockExclusive(pWal, WAL_READ_LOCK(0), 1); + } + + if( rc==SQLITE_BUSY ){ + /* Reset the return code so as not to report a checkpoint failure + ** just because there are active readers. */ + rc = SQLITE_OK; + } + } + + /* If this is an SQLITE_CHECKPOINT_RESTART or TRUNCATE operation, and the + ** entire wal file has been copied into the database file, then block + ** until all readers have finished using the wal file. This ensures that + ** the next process to write to the database restarts the wal file. + */ + if( rc==SQLITE_OK && eMode!=SQLITE_CHECKPOINT_PASSIVE ){ + assert( pWal->writeLock ); + if( pInfo->nBackfillhdr.mxFrame ){ + rc = SQLITE_BUSY; + }else if( eMode>=SQLITE_CHECKPOINT_RESTART ){ + u32 salt1; + sqlite3_randomness(4, &salt1); + assert( pInfo->nBackfill==pWal->hdr.mxFrame ); + rc = walBusyLock(pWal, xBusy, pBusyArg, WAL_READ_LOCK(1), WAL_NREADER-1); + if( rc==SQLITE_OK ){ + if( eMode==SQLITE_CHECKPOINT_TRUNCATE ){ + /* IMPLEMENTATION-OF: R-44699-57140 This mode works the same way as + ** SQLITE_CHECKPOINT_RESTART with the addition that it also + ** truncates the log file to zero bytes just prior to a + ** successful return. + ** + ** In theory, it might be safe to do this without updating the + ** wal-index header in shared memory, as all subsequent reader or + ** writer clients should see that the entire log file has been + ** checkpointed and behave accordingly. This seems unsafe though, + ** as it would leave the system in a state where the contents of + ** the wal-index header do not match the contents of the + ** file-system. To avoid this, update the wal-index header to + ** indicate that the log file contains zero valid frames. */ + walRestartHdr(pWal, salt1); + rc = sqlite3OsTruncate(pWal->pWalFd, 0); + } + walUnlockExclusive(pWal, WAL_READ_LOCK(1), WAL_NREADER-1); + } + } + } + + walcheckpoint_out: + walIteratorFree(pIter); + return rc; +} + +/* +** If the WAL file is currently larger than nMax bytes in size, truncate +** it to exactly nMax bytes. If an error occurs while doing so, ignore it. +*/ +static void walLimitSize(Wal *pWal, i64 nMax){ + i64 sz; + int rx; + sqlite3BeginBenignMalloc(); + rx = sqlite3OsFileSize(pWal->pWalFd, &sz); + if( rx==SQLITE_OK && (sz > nMax ) ){ + rx = sqlite3OsTruncate(pWal->pWalFd, nMax); + } + sqlite3EndBenignMalloc(); + if( rx ){ + sqlite3_log(rx, "cannot limit WAL size: %s", pWal->zWalName); + } +} + +/* +** Close a connection to a log file. +*/ +SQLITE_PRIVATE int sqlite3WalClose( + Wal *pWal, /* Wal to close */ + int sync_flags, /* Flags to pass to OsSync() (or 0) */ + int nBuf, + u8 *zBuf /* Buffer of at least nBuf bytes */ +){ + int rc = SQLITE_OK; + if( pWal ){ + int isDelete = 0; /* True to unlink wal and wal-index files */ + + /* If an EXCLUSIVE lock can be obtained on the database file (using the + ** ordinary, rollback-mode locking methods, this guarantees that the + ** connection associated with this log file is the only connection to + ** the database. In this case checkpoint the database and unlink both + ** the wal and wal-index files. + ** + ** The EXCLUSIVE lock is not released before returning. + */ + rc = sqlite3OsLock(pWal->pDbFd, SQLITE_LOCK_EXCLUSIVE); + if( rc==SQLITE_OK ){ + if( pWal->exclusiveMode==WAL_NORMAL_MODE ){ + pWal->exclusiveMode = WAL_EXCLUSIVE_MODE; + } + rc = sqlite3WalCheckpoint( + pWal, SQLITE_CHECKPOINT_PASSIVE, 0, 0, sync_flags, nBuf, zBuf, 0, 0 + ); + if( rc==SQLITE_OK ){ + int bPersist = -1; + sqlite3OsFileControlHint( + pWal->pDbFd, SQLITE_FCNTL_PERSIST_WAL, &bPersist + ); + if( bPersist!=1 ){ + /* Try to delete the WAL file if the checkpoint completed and + ** fsyned (rc==SQLITE_OK) and if we are not in persistent-wal + ** mode (!bPersist) */ + isDelete = 1; + }else if( pWal->mxWalSize>=0 ){ + /* Try to truncate the WAL file to zero bytes if the checkpoint + ** completed and fsynced (rc==SQLITE_OK) and we are in persistent + ** WAL mode (bPersist) and if the PRAGMA journal_size_limit is a + ** non-negative value (pWal->mxWalSize>=0). Note that we truncate + ** to zero bytes as truncating to the journal_size_limit might + ** leave a corrupt WAL file on disk. */ + walLimitSize(pWal, 0); + } + } + } + + walIndexClose(pWal, isDelete); + sqlite3OsClose(pWal->pWalFd); + if( isDelete ){ + sqlite3BeginBenignMalloc(); + sqlite3OsDelete(pWal->pVfs, pWal->zWalName, 0); + sqlite3EndBenignMalloc(); + } + WALTRACE(("WAL%p: closed\n", pWal)); + sqlite3_free((void *)pWal->apWiData); + sqlite3_free(pWal); + } + return rc; +} + +/* +** Try to read the wal-index header. Return 0 on success and 1 if +** there is a problem. +** +** The wal-index is in shared memory. Another thread or process might +** be writing the header at the same time this procedure is trying to +** read it, which might result in inconsistency. A dirty read is detected +** by verifying that both copies of the header are the same and also by +** a checksum on the header. +** +** If and only if the read is consistent and the header is different from +** pWal->hdr, then pWal->hdr is updated to the content of the new header +** and *pChanged is set to 1. +** +** If the checksum cannot be verified return non-zero. If the header +** is read successfully and the checksum verified, return zero. +*/ +static int walIndexTryHdr(Wal *pWal, int *pChanged){ + u32 aCksum[2]; /* Checksum on the header content */ + WalIndexHdr h1, h2; /* Two copies of the header content */ + WalIndexHdr volatile *aHdr; /* Header in shared memory */ + + /* The first page of the wal-index must be mapped at this point. */ + assert( pWal->nWiData>0 && pWal->apWiData[0] ); + + /* Read the header. This might happen concurrently with a write to the + ** same area of shared memory on a different CPU in a SMP, + ** meaning it is possible that an inconsistent snapshot is read + ** from the file. If this happens, return non-zero. + ** + ** There are two copies of the header at the beginning of the wal-index. + ** When reading, read [0] first then [1]. Writes are in the reverse order. + ** Memory barriers are used to prevent the compiler or the hardware from + ** reordering the reads and writes. + */ + aHdr = walIndexHdr(pWal); + memcpy(&h1, (void *)&aHdr[0], sizeof(h1)); + walShmBarrier(pWal); + memcpy(&h2, (void *)&aHdr[1], sizeof(h2)); + + if( memcmp(&h1, &h2, sizeof(h1))!=0 ){ + return 1; /* Dirty read */ + } + if( h1.isInit==0 ){ + return 1; /* Malformed header - probably all zeros */ + } + walChecksumBytes(1, (u8*)&h1, sizeof(h1)-sizeof(h1.aCksum), 0, aCksum); + if( aCksum[0]!=h1.aCksum[0] || aCksum[1]!=h1.aCksum[1] ){ + return 1; /* Checksum does not match */ + } + + if( memcmp(&pWal->hdr, &h1, sizeof(WalIndexHdr)) ){ + *pChanged = 1; + memcpy(&pWal->hdr, &h1, sizeof(WalIndexHdr)); + pWal->szPage = (pWal->hdr.szPage&0xfe00) + ((pWal->hdr.szPage&0x0001)<<16); + testcase( pWal->szPage<=32768 ); + testcase( pWal->szPage>=65536 ); + } + + /* The header was successfully read. Return zero. */ + return 0; +} + +/* +** Read the wal-index header from the wal-index and into pWal->hdr. +** If the wal-header appears to be corrupt, try to reconstruct the +** wal-index from the WAL before returning. +** +** Set *pChanged to 1 if the wal-index header value in pWal->hdr is +** changed by this operation. If pWal->hdr is unchanged, set *pChanged +** to 0. +** +** If the wal-index header is successfully read, return SQLITE_OK. +** Otherwise an SQLite error code. +*/ +static int walIndexReadHdr(Wal *pWal, int *pChanged){ + int rc; /* Return code */ + int badHdr; /* True if a header read failed */ + volatile u32 *page0; /* Chunk of wal-index containing header */ + + /* Ensure that page 0 of the wal-index (the page that contains the + ** wal-index header) is mapped. Return early if an error occurs here. + */ + assert( pChanged ); + rc = walIndexPage(pWal, 0, &page0); + if( rc!=SQLITE_OK ){ + return rc; + }; + assert( page0 || pWal->writeLock==0 ); + + /* If the first page of the wal-index has been mapped, try to read the + ** wal-index header immediately, without holding any lock. This usually + ** works, but may fail if the wal-index header is corrupt or currently + ** being modified by another thread or process. + */ + badHdr = (page0 ? walIndexTryHdr(pWal, pChanged) : 1); + + /* If the first attempt failed, it might have been due to a race + ** with a writer. So get a WRITE lock and try again. + */ + assert( badHdr==0 || pWal->writeLock==0 ); + if( badHdr ){ + if( pWal->readOnly & WAL_SHM_RDONLY ){ + if( SQLITE_OK==(rc = walLockShared(pWal, WAL_WRITE_LOCK)) ){ + walUnlockShared(pWal, WAL_WRITE_LOCK); + rc = SQLITE_READONLY_RECOVERY; + } + }else if( SQLITE_OK==(rc = walLockExclusive(pWal, WAL_WRITE_LOCK, 1)) ){ + pWal->writeLock = 1; + if( SQLITE_OK==(rc = walIndexPage(pWal, 0, &page0)) ){ + badHdr = walIndexTryHdr(pWal, pChanged); + if( badHdr ){ + /* If the wal-index header is still malformed even while holding + ** a WRITE lock, it can only mean that the header is corrupted and + ** needs to be reconstructed. So run recovery to do exactly that. + */ + rc = walIndexRecover(pWal); + *pChanged = 1; + } + } + pWal->writeLock = 0; + walUnlockExclusive(pWal, WAL_WRITE_LOCK, 1); + } + } + + /* If the header is read successfully, check the version number to make + ** sure the wal-index was not constructed with some future format that + ** this version of SQLite cannot understand. + */ + if( badHdr==0 && pWal->hdr.iVersion!=WALINDEX_MAX_VERSION ){ + rc = SQLITE_CANTOPEN_BKPT; + } + + return rc; +} + +/* +** This is the value that walTryBeginRead returns when it needs to +** be retried. +*/ +#define WAL_RETRY (-1) + +/* +** Attempt to start a read transaction. This might fail due to a race or +** other transient condition. When that happens, it returns WAL_RETRY to +** indicate to the caller that it is safe to retry immediately. +** +** On success return SQLITE_OK. On a permanent failure (such an +** I/O error or an SQLITE_BUSY because another process is running +** recovery) return a positive error code. +** +** The useWal parameter is true to force the use of the WAL and disable +** the case where the WAL is bypassed because it has been completely +** checkpointed. If useWal==0 then this routine calls walIndexReadHdr() +** to make a copy of the wal-index header into pWal->hdr. If the +** wal-index header has changed, *pChanged is set to 1 (as an indication +** to the caller that the local paget cache is obsolete and needs to be +** flushed.) When useWal==1, the wal-index header is assumed to already +** be loaded and the pChanged parameter is unused. +** +** The caller must set the cnt parameter to the number of prior calls to +** this routine during the current read attempt that returned WAL_RETRY. +** This routine will start taking more aggressive measures to clear the +** race conditions after multiple WAL_RETRY returns, and after an excessive +** number of errors will ultimately return SQLITE_PROTOCOL. The +** SQLITE_PROTOCOL return indicates that some other process has gone rogue +** and is not honoring the locking protocol. There is a vanishingly small +** chance that SQLITE_PROTOCOL could be returned because of a run of really +** bad luck when there is lots of contention for the wal-index, but that +** possibility is so small that it can be safely neglected, we believe. +** +** On success, this routine obtains a read lock on +** WAL_READ_LOCK(pWal->readLock). The pWal->readLock integer is +** in the range 0 <= pWal->readLock < WAL_NREADER. If pWal->readLock==(-1) +** that means the Wal does not hold any read lock. The reader must not +** access any database page that is modified by a WAL frame up to and +** including frame number aReadMark[pWal->readLock]. The reader will +** use WAL frames up to and including pWal->hdr.mxFrame if pWal->readLock>0 +** Or if pWal->readLock==0, then the reader will ignore the WAL +** completely and get all content directly from the database file. +** If the useWal parameter is 1 then the WAL will never be ignored and +** this routine will always set pWal->readLock>0 on success. +** When the read transaction is completed, the caller must release the +** lock on WAL_READ_LOCK(pWal->readLock) and set pWal->readLock to -1. +** +** This routine uses the nBackfill and aReadMark[] fields of the header +** to select a particular WAL_READ_LOCK() that strives to let the +** checkpoint process do as much work as possible. This routine might +** update values of the aReadMark[] array in the header, but if it does +** so it takes care to hold an exclusive lock on the corresponding +** WAL_READ_LOCK() while changing values. +*/ +static int walTryBeginRead(Wal *pWal, int *pChanged, int useWal, int cnt){ + volatile WalCkptInfo *pInfo; /* Checkpoint information in wal-index */ + u32 mxReadMark; /* Largest aReadMark[] value */ + int mxI; /* Index of largest aReadMark[] value */ + int i; /* Loop counter */ + int rc = SQLITE_OK; /* Return code */ + u32 mxFrame; /* Wal frame to lock to */ + + assert( pWal->readLock<0 ); /* Not currently locked */ + + /* Take steps to avoid spinning forever if there is a protocol error. + ** + ** Circumstances that cause a RETRY should only last for the briefest + ** instances of time. No I/O or other system calls are done while the + ** locks are held, so the locks should not be held for very long. But + ** if we are unlucky, another process that is holding a lock might get + ** paged out or take a page-fault that is time-consuming to resolve, + ** during the few nanoseconds that it is holding the lock. In that case, + ** it might take longer than normal for the lock to free. + ** + ** After 5 RETRYs, we begin calling sqlite3OsSleep(). The first few + ** calls to sqlite3OsSleep() have a delay of 1 microsecond. Really this + ** is more of a scheduler yield than an actual delay. But on the 10th + ** an subsequent retries, the delays start becoming longer and longer, + ** so that on the 100th (and last) RETRY we delay for 323 milliseconds. + ** The total delay time before giving up is less than 10 seconds. + */ + if( cnt>5 ){ + int nDelay = 1; /* Pause time in microseconds */ + if( cnt>100 ){ + VVA_ONLY( pWal->lockError = 1; ) + return SQLITE_PROTOCOL; + } + if( cnt>=10 ) nDelay = (cnt-9)*(cnt-9)*39; + sqlite3OsSleep(pWal->pVfs, nDelay); + } + + if( !useWal ){ + rc = walIndexReadHdr(pWal, pChanged); + if( rc==SQLITE_BUSY ){ + /* If there is not a recovery running in another thread or process + ** then convert BUSY errors to WAL_RETRY. If recovery is known to + ** be running, convert BUSY to BUSY_RECOVERY. There is a race here + ** which might cause WAL_RETRY to be returned even if BUSY_RECOVERY + ** would be technically correct. But the race is benign since with + ** WAL_RETRY this routine will be called again and will probably be + ** right on the second iteration. + */ + if( pWal->apWiData[0]==0 ){ + /* This branch is taken when the xShmMap() method returns SQLITE_BUSY. + ** We assume this is a transient condition, so return WAL_RETRY. The + ** xShmMap() implementation used by the default unix and win32 VFS + ** modules may return SQLITE_BUSY due to a race condition in the + ** code that determines whether or not the shared-memory region + ** must be zeroed before the requested page is returned. + */ + rc = WAL_RETRY; + }else if( SQLITE_OK==(rc = walLockShared(pWal, WAL_RECOVER_LOCK)) ){ + walUnlockShared(pWal, WAL_RECOVER_LOCK); + rc = WAL_RETRY; + }else if( rc==SQLITE_BUSY ){ + rc = SQLITE_BUSY_RECOVERY; + } + } + if( rc!=SQLITE_OK ){ + return rc; + } + } + + pInfo = walCkptInfo(pWal); + if( !useWal && pInfo->nBackfill==pWal->hdr.mxFrame +#ifdef SQLITE_ENABLE_SNAPSHOT + && (pWal->pSnapshot==0 || pWal->hdr.mxFrame==0 + || 0==memcmp(&pWal->hdr, pWal->pSnapshot, sizeof(WalIndexHdr))) +#endif + ){ + /* The WAL has been completely backfilled (or it is empty). + ** and can be safely ignored. + */ + rc = walLockShared(pWal, WAL_READ_LOCK(0)); + walShmBarrier(pWal); + if( rc==SQLITE_OK ){ + if( memcmp((void *)walIndexHdr(pWal), &pWal->hdr, sizeof(WalIndexHdr)) ){ + /* It is not safe to allow the reader to continue here if frames + ** may have been appended to the log before READ_LOCK(0) was obtained. + ** When holding READ_LOCK(0), the reader ignores the entire log file, + ** which implies that the database file contains a trustworthy + ** snapshot. Since holding READ_LOCK(0) prevents a checkpoint from + ** happening, this is usually correct. + ** + ** However, if frames have been appended to the log (or if the log + ** is wrapped and written for that matter) before the READ_LOCK(0) + ** is obtained, that is not necessarily true. A checkpointer may + ** have started to backfill the appended frames but crashed before + ** it finished. Leaving a corrupt image in the database file. + */ + walUnlockShared(pWal, WAL_READ_LOCK(0)); + return WAL_RETRY; + } + pWal->readLock = 0; + return SQLITE_OK; + }else if( rc!=SQLITE_BUSY ){ + return rc; + } + } + + /* If we get this far, it means that the reader will want to use + ** the WAL to get at content from recent commits. The job now is + ** to select one of the aReadMark[] entries that is closest to + ** but not exceeding pWal->hdr.mxFrame and lock that entry. + */ + mxReadMark = 0; + mxI = 0; + mxFrame = pWal->hdr.mxFrame; +#ifdef SQLITE_ENABLE_SNAPSHOT + if( pWal->pSnapshot && pWal->pSnapshot->mxFramepSnapshot->mxFrame; + } +#endif + for(i=1; iaReadMark[i]; + if( mxReadMark<=thisMark && thisMark<=mxFrame ){ + assert( thisMark!=READMARK_NOT_USED ); + mxReadMark = thisMark; + mxI = i; + } + } + if( (pWal->readOnly & WAL_SHM_RDONLY)==0 + && (mxReadMarkaReadMark[i] = mxFrame; + mxI = i; + walUnlockExclusive(pWal, WAL_READ_LOCK(i), 1); + break; + }else if( rc!=SQLITE_BUSY ){ + return rc; + } + } + } + if( mxI==0 ){ + assert( rc==SQLITE_BUSY || (pWal->readOnly & WAL_SHM_RDONLY)!=0 ); + return rc==SQLITE_BUSY ? WAL_RETRY : SQLITE_READONLY_CANTLOCK; + } + + rc = walLockShared(pWal, WAL_READ_LOCK(mxI)); + if( rc ){ + return rc==SQLITE_BUSY ? WAL_RETRY : rc; + } + /* Now that the read-lock has been obtained, check that neither the + ** value in the aReadMark[] array or the contents of the wal-index + ** header have changed. + ** + ** It is necessary to check that the wal-index header did not change + ** between the time it was read and when the shared-lock was obtained + ** on WAL_READ_LOCK(mxI) was obtained to account for the possibility + ** that the log file may have been wrapped by a writer, or that frames + ** that occur later in the log than pWal->hdr.mxFrame may have been + ** copied into the database by a checkpointer. If either of these things + ** happened, then reading the database with the current value of + ** pWal->hdr.mxFrame risks reading a corrupted snapshot. So, retry + ** instead. + ** + ** Before checking that the live wal-index header has not changed + ** since it was read, set Wal.minFrame to the first frame in the wal + ** file that has not yet been checkpointed. This client will not need + ** to read any frames earlier than minFrame from the wal file - they + ** can be safely read directly from the database file. + ** + ** Because a ShmBarrier() call is made between taking the copy of + ** nBackfill and checking that the wal-header in shared-memory still + ** matches the one cached in pWal->hdr, it is guaranteed that the + ** checkpointer that set nBackfill was not working with a wal-index + ** header newer than that cached in pWal->hdr. If it were, that could + ** cause a problem. The checkpointer could omit to checkpoint + ** a version of page X that lies before pWal->minFrame (call that version + ** A) on the basis that there is a newer version (version B) of the same + ** page later in the wal file. But if version B happens to like past + ** frame pWal->hdr.mxFrame - then the client would incorrectly assume + ** that it can read version A from the database file. However, since + ** we can guarantee that the checkpointer that set nBackfill could not + ** see any pages past pWal->hdr.mxFrame, this problem does not come up. + */ + pWal->minFrame = pInfo->nBackfill+1; + walShmBarrier(pWal); + if( pInfo->aReadMark[mxI]!=mxReadMark + || memcmp((void *)walIndexHdr(pWal), &pWal->hdr, sizeof(WalIndexHdr)) + ){ + walUnlockShared(pWal, WAL_READ_LOCK(mxI)); + return WAL_RETRY; + }else{ + assert( mxReadMark<=pWal->hdr.mxFrame ); + pWal->readLock = (i16)mxI; + } + return rc; +} + +/* +** Begin a read transaction on the database. +** +** This routine used to be called sqlite3OpenSnapshot() and with good reason: +** it takes a snapshot of the state of the WAL and wal-index for the current +** instant in time. The current thread will continue to use this snapshot. +** Other threads might append new content to the WAL and wal-index but +** that extra content is ignored by the current thread. +** +** If the database contents have changes since the previous read +** transaction, then *pChanged is set to 1 before returning. The +** Pager layer will use this to know that is cache is stale and +** needs to be flushed. +*/ +SQLITE_PRIVATE int sqlite3WalBeginReadTransaction(Wal *pWal, int *pChanged){ + int rc; /* Return code */ + int cnt = 0; /* Number of TryBeginRead attempts */ + +#ifdef SQLITE_ENABLE_SNAPSHOT + int bChanged = 0; + WalIndexHdr *pSnapshot = pWal->pSnapshot; + if( pSnapshot && memcmp(pSnapshot, &pWal->hdr, sizeof(WalIndexHdr))!=0 ){ + bChanged = 1; + } +#endif + + do{ + rc = walTryBeginRead(pWal, pChanged, 0, ++cnt); + }while( rc==WAL_RETRY ); + testcase( (rc&0xff)==SQLITE_BUSY ); + testcase( (rc&0xff)==SQLITE_IOERR ); + testcase( rc==SQLITE_PROTOCOL ); + testcase( rc==SQLITE_OK ); + +#ifdef SQLITE_ENABLE_SNAPSHOT + if( rc==SQLITE_OK ){ + if( pSnapshot && memcmp(pSnapshot, &pWal->hdr, sizeof(WalIndexHdr))!=0 ){ + /* At this point the client has a lock on an aReadMark[] slot holding + ** a value equal to or smaller than pSnapshot->mxFrame, but pWal->hdr + ** is populated with the wal-index header corresponding to the head + ** of the wal file. Verify that pSnapshot is still valid before + ** continuing. Reasons why pSnapshot might no longer be valid: + ** + ** (1) The WAL file has been reset since the snapshot was taken. + ** In this case, the salt will have changed. + ** + ** (2) A checkpoint as been attempted that wrote frames past + ** pSnapshot->mxFrame into the database file. Note that the + ** checkpoint need not have completed for this to cause problems. + */ + volatile WalCkptInfo *pInfo = walCkptInfo(pWal); + + assert( pWal->readLock>0 || pWal->hdr.mxFrame==0 ); + assert( pInfo->aReadMark[pWal->readLock]<=pSnapshot->mxFrame ); + + /* It is possible that there is a checkpointer thread running + ** concurrent with this code. If this is the case, it may be that the + ** checkpointer has already determined that it will checkpoint + ** snapshot X, where X is later in the wal file than pSnapshot, but + ** has not yet set the pInfo->nBackfillAttempted variable to indicate + ** its intent. To avoid the race condition this leads to, ensure that + ** there is no checkpointer process by taking a shared CKPT lock + ** before checking pInfo->nBackfillAttempted. */ + rc = walLockShared(pWal, WAL_CKPT_LOCK); + + if( rc==SQLITE_OK ){ + /* Check that the wal file has not been wrapped. Assuming that it has + ** not, also check that no checkpointer has attempted to checkpoint any + ** frames beyond pSnapshot->mxFrame. If either of these conditions are + ** true, return SQLITE_BUSY_SNAPSHOT. Otherwise, overwrite pWal->hdr + ** with *pSnapshot and set *pChanged as appropriate for opening the + ** snapshot. */ + if( !memcmp(pSnapshot->aSalt, pWal->hdr.aSalt, sizeof(pWal->hdr.aSalt)) + && pSnapshot->mxFrame>=pInfo->nBackfillAttempted + ){ + assert( pWal->readLock>0 ); + memcpy(&pWal->hdr, pSnapshot, sizeof(WalIndexHdr)); + *pChanged = bChanged; + }else{ + rc = SQLITE_BUSY_SNAPSHOT; + } + + /* Release the shared CKPT lock obtained above. */ + walUnlockShared(pWal, WAL_CKPT_LOCK); + } + + + if( rc!=SQLITE_OK ){ + sqlite3WalEndReadTransaction(pWal); + } + } + } +#endif + return rc; +} + +/* +** Finish with a read transaction. All this does is release the +** read-lock. +*/ +SQLITE_PRIVATE void sqlite3WalEndReadTransaction(Wal *pWal){ + sqlite3WalEndWriteTransaction(pWal); + if( pWal->readLock>=0 ){ + walUnlockShared(pWal, WAL_READ_LOCK(pWal->readLock)); + pWal->readLock = -1; + } +} + +/* +** Search the wal file for page pgno. If found, set *piRead to the frame that +** contains the page. Otherwise, if pgno is not in the wal file, set *piRead +** to zero. +** +** Return SQLITE_OK if successful, or an error code if an error occurs. If an +** error does occur, the final value of *piRead is undefined. +*/ +SQLITE_PRIVATE int sqlite3WalFindFrame( + Wal *pWal, /* WAL handle */ + Pgno pgno, /* Database page number to read data for */ + u32 *piRead /* OUT: Frame number (or zero) */ +){ + u32 iRead = 0; /* If !=0, WAL frame to return data from */ + u32 iLast = pWal->hdr.mxFrame; /* Last page in WAL for this reader */ + int iHash; /* Used to loop through N hash tables */ + int iMinHash; + + /* This routine is only be called from within a read transaction. */ + assert( pWal->readLock>=0 || pWal->lockError ); + + /* If the "last page" field of the wal-index header snapshot is 0, then + ** no data will be read from the wal under any circumstances. Return early + ** in this case as an optimization. Likewise, if pWal->readLock==0, + ** then the WAL is ignored by the reader so return early, as if the + ** WAL were empty. + */ + if( iLast==0 || pWal->readLock==0 ){ + *piRead = 0; + return SQLITE_OK; + } + + /* Search the hash table or tables for an entry matching page number + ** pgno. Each iteration of the following for() loop searches one + ** hash table (each hash table indexes up to HASHTABLE_NPAGE frames). + ** + ** This code might run concurrently to the code in walIndexAppend() + ** that adds entries to the wal-index (and possibly to this hash + ** table). This means the value just read from the hash + ** slot (aHash[iKey]) may have been added before or after the + ** current read transaction was opened. Values added after the + ** read transaction was opened may have been written incorrectly - + ** i.e. these slots may contain garbage data. However, we assume + ** that any slots written before the current read transaction was + ** opened remain unmodified. + ** + ** For the reasons above, the if(...) condition featured in the inner + ** loop of the following block is more stringent that would be required + ** if we had exclusive access to the hash-table: + ** + ** (aPgno[iFrame]==pgno): + ** This condition filters out normal hash-table collisions. + ** + ** (iFrame<=iLast): + ** This condition filters out entries that were added to the hash + ** table after the current read-transaction had started. + */ + iMinHash = walFramePage(pWal->minFrame); + for(iHash=walFramePage(iLast); iHash>=iMinHash && iRead==0; iHash--){ + volatile ht_slot *aHash; /* Pointer to hash table */ + volatile u32 *aPgno; /* Pointer to array of page numbers */ + u32 iZero; /* Frame number corresponding to aPgno[0] */ + int iKey; /* Hash slot index */ + int nCollide; /* Number of hash collisions remaining */ + int rc; /* Error code */ + + rc = walHashGet(pWal, iHash, &aHash, &aPgno, &iZero); + if( rc!=SQLITE_OK ){ + return rc; + } + nCollide = HASHTABLE_NSLOT; + for(iKey=walHash(pgno); aHash[iKey]; iKey=walNextHash(iKey)){ + u32 iFrame = aHash[iKey] + iZero; + if( iFrame<=iLast && iFrame>=pWal->minFrame && aPgno[aHash[iKey]]==pgno ){ + assert( iFrame>iRead || CORRUPT_DB ); + iRead = iFrame; + } + if( (nCollide--)==0 ){ + return SQLITE_CORRUPT_BKPT; + } + } + } + +#ifdef SQLITE_ENABLE_EXPENSIVE_ASSERT + /* If expensive assert() statements are available, do a linear search + ** of the wal-index file content. Make sure the results agree with the + ** result obtained using the hash indexes above. */ + { + u32 iRead2 = 0; + u32 iTest; + assert( pWal->minFrame>0 ); + for(iTest=iLast; iTest>=pWal->minFrame; iTest--){ + if( walFramePgno(pWal, iTest)==pgno ){ + iRead2 = iTest; + break; + } + } + assert( iRead==iRead2 ); + } +#endif + + *piRead = iRead; + return SQLITE_OK; +} + +/* +** Read the contents of frame iRead from the wal file into buffer pOut +** (which is nOut bytes in size). Return SQLITE_OK if successful, or an +** error code otherwise. +*/ +SQLITE_PRIVATE int sqlite3WalReadFrame( + Wal *pWal, /* WAL handle */ + u32 iRead, /* Frame to read */ + int nOut, /* Size of buffer pOut in bytes */ + u8 *pOut /* Buffer to write page data to */ +){ + int sz; + i64 iOffset; + sz = pWal->hdr.szPage; + sz = (sz&0xfe00) + ((sz&0x0001)<<16); + testcase( sz<=32768 ); + testcase( sz>=65536 ); + iOffset = walFrameOffset(iRead, sz) + WAL_FRAME_HDRSIZE; + /* testcase( IS_BIG_INT(iOffset) ); // requires a 4GiB WAL */ + return sqlite3OsRead(pWal->pWalFd, pOut, (nOut>sz ? sz : nOut), iOffset); +} + +/* +** Return the size of the database in pages (or zero, if unknown). +*/ +SQLITE_PRIVATE Pgno sqlite3WalDbsize(Wal *pWal){ + if( pWal && ALWAYS(pWal->readLock>=0) ){ + return pWal->hdr.nPage; + } + return 0; +} + + +/* +** This function starts a write transaction on the WAL. +** +** A read transaction must have already been started by a prior call +** to sqlite3WalBeginReadTransaction(). +** +** If another thread or process has written into the database since +** the read transaction was started, then it is not possible for this +** thread to write as doing so would cause a fork. So this routine +** returns SQLITE_BUSY in that case and no write transaction is started. +** +** There can only be a single writer active at a time. +*/ +SQLITE_PRIVATE int sqlite3WalBeginWriteTransaction(Wal *pWal){ + int rc; + + /* Cannot start a write transaction without first holding a read + ** transaction. */ + assert( pWal->readLock>=0 ); + assert( pWal->writeLock==0 && pWal->iReCksum==0 ); + + if( pWal->readOnly ){ + return SQLITE_READONLY; + } + + /* Only one writer allowed at a time. Get the write lock. Return + ** SQLITE_BUSY if unable. + */ + rc = walLockExclusive(pWal, WAL_WRITE_LOCK, 1); + if( rc ){ + return rc; + } + pWal->writeLock = 1; + + /* If another connection has written to the database file since the + ** time the read transaction on this connection was started, then + ** the write is disallowed. + */ + if( memcmp(&pWal->hdr, (void *)walIndexHdr(pWal), sizeof(WalIndexHdr))!=0 ){ + walUnlockExclusive(pWal, WAL_WRITE_LOCK, 1); + pWal->writeLock = 0; + rc = SQLITE_BUSY_SNAPSHOT; + } + + return rc; +} + +/* +** End a write transaction. The commit has already been done. This +** routine merely releases the lock. +*/ +SQLITE_PRIVATE int sqlite3WalEndWriteTransaction(Wal *pWal){ + if( pWal->writeLock ){ + walUnlockExclusive(pWal, WAL_WRITE_LOCK, 1); + pWal->writeLock = 0; + pWal->iReCksum = 0; + pWal->truncateOnCommit = 0; + } + return SQLITE_OK; +} + +/* +** If any data has been written (but not committed) to the log file, this +** function moves the write-pointer back to the start of the transaction. +** +** Additionally, the callback function is invoked for each frame written +** to the WAL since the start of the transaction. If the callback returns +** other than SQLITE_OK, it is not invoked again and the error code is +** returned to the caller. +** +** Otherwise, if the callback function does not return an error, this +** function returns SQLITE_OK. +*/ +SQLITE_PRIVATE int sqlite3WalUndo(Wal *pWal, int (*xUndo)(void *, Pgno), void *pUndoCtx){ + int rc = SQLITE_OK; + if( ALWAYS(pWal->writeLock) ){ + Pgno iMax = pWal->hdr.mxFrame; + Pgno iFrame; + + /* Restore the clients cache of the wal-index header to the state it + ** was in before the client began writing to the database. + */ + memcpy(&pWal->hdr, (void *)walIndexHdr(pWal), sizeof(WalIndexHdr)); + + for(iFrame=pWal->hdr.mxFrame+1; + ALWAYS(rc==SQLITE_OK) && iFrame<=iMax; + iFrame++ + ){ + /* This call cannot fail. Unless the page for which the page number + ** is passed as the second argument is (a) in the cache and + ** (b) has an outstanding reference, then xUndo is either a no-op + ** (if (a) is false) or simply expels the page from the cache (if (b) + ** is false). + ** + ** If the upper layer is doing a rollback, it is guaranteed that there + ** are no outstanding references to any page other than page 1. And + ** page 1 is never written to the log until the transaction is + ** committed. As a result, the call to xUndo may not fail. + */ + assert( walFramePgno(pWal, iFrame)!=1 ); + rc = xUndo(pUndoCtx, walFramePgno(pWal, iFrame)); + } + if( iMax!=pWal->hdr.mxFrame ) walCleanupHash(pWal); + } + return rc; +} + +/* +** Argument aWalData must point to an array of WAL_SAVEPOINT_NDATA u32 +** values. This function populates the array with values required to +** "rollback" the write position of the WAL handle back to the current +** point in the event of a savepoint rollback (via WalSavepointUndo()). +*/ +SQLITE_PRIVATE void sqlite3WalSavepoint(Wal *pWal, u32 *aWalData){ + assert( pWal->writeLock ); + aWalData[0] = pWal->hdr.mxFrame; + aWalData[1] = pWal->hdr.aFrameCksum[0]; + aWalData[2] = pWal->hdr.aFrameCksum[1]; + aWalData[3] = pWal->nCkpt; +} + +/* +** Move the write position of the WAL back to the point identified by +** the values in the aWalData[] array. aWalData must point to an array +** of WAL_SAVEPOINT_NDATA u32 values that has been previously populated +** by a call to WalSavepoint(). +*/ +SQLITE_PRIVATE int sqlite3WalSavepointUndo(Wal *pWal, u32 *aWalData){ + int rc = SQLITE_OK; + + assert( pWal->writeLock ); + assert( aWalData[3]!=pWal->nCkpt || aWalData[0]<=pWal->hdr.mxFrame ); + + if( aWalData[3]!=pWal->nCkpt ){ + /* This savepoint was opened immediately after the write-transaction + ** was started. Right after that, the writer decided to wrap around + ** to the start of the log. Update the savepoint values to match. + */ + aWalData[0] = 0; + aWalData[3] = pWal->nCkpt; + } + + if( aWalData[0]hdr.mxFrame ){ + pWal->hdr.mxFrame = aWalData[0]; + pWal->hdr.aFrameCksum[0] = aWalData[1]; + pWal->hdr.aFrameCksum[1] = aWalData[2]; + walCleanupHash(pWal); + } + + return rc; +} + +/* +** This function is called just before writing a set of frames to the log +** file (see sqlite3WalFrames()). It checks to see if, instead of appending +** to the current log file, it is possible to overwrite the start of the +** existing log file with the new frames (i.e. "reset" the log). If so, +** it sets pWal->hdr.mxFrame to 0. Otherwise, pWal->hdr.mxFrame is left +** unchanged. +** +** SQLITE_OK is returned if no error is encountered (regardless of whether +** or not pWal->hdr.mxFrame is modified). An SQLite error code is returned +** if an error occurs. +*/ +static int walRestartLog(Wal *pWal){ + int rc = SQLITE_OK; + int cnt; + + if( pWal->readLock==0 ){ + volatile WalCkptInfo *pInfo = walCkptInfo(pWal); + assert( pInfo->nBackfill==pWal->hdr.mxFrame ); + if( pInfo->nBackfill>0 ){ + u32 salt1; + sqlite3_randomness(4, &salt1); + rc = walLockExclusive(pWal, WAL_READ_LOCK(1), WAL_NREADER-1); + if( rc==SQLITE_OK ){ + /* If all readers are using WAL_READ_LOCK(0) (in other words if no + ** readers are currently using the WAL), then the transactions + ** frames will overwrite the start of the existing log. Update the + ** wal-index header to reflect this. + ** + ** In theory it would be Ok to update the cache of the header only + ** at this point. But updating the actual wal-index header is also + ** safe and means there is no special case for sqlite3WalUndo() + ** to handle if this transaction is rolled back. */ + walRestartHdr(pWal, salt1); + walUnlockExclusive(pWal, WAL_READ_LOCK(1), WAL_NREADER-1); + }else if( rc!=SQLITE_BUSY ){ + return rc; + } + } + walUnlockShared(pWal, WAL_READ_LOCK(0)); + pWal->readLock = -1; + cnt = 0; + do{ + int notUsed; + rc = walTryBeginRead(pWal, ¬Used, 1, ++cnt); + }while( rc==WAL_RETRY ); + assert( (rc&0xff)!=SQLITE_BUSY ); /* BUSY not possible when useWal==1 */ + testcase( (rc&0xff)==SQLITE_IOERR ); + testcase( rc==SQLITE_PROTOCOL ); + testcase( rc==SQLITE_OK ); + } + return rc; +} + +/* +** Information about the current state of the WAL file and where +** the next fsync should occur - passed from sqlite3WalFrames() into +** walWriteToLog(). +*/ +typedef struct WalWriter { + Wal *pWal; /* The complete WAL information */ + sqlite3_file *pFd; /* The WAL file to which we write */ + sqlite3_int64 iSyncPoint; /* Fsync at this offset */ + int syncFlags; /* Flags for the fsync */ + int szPage; /* Size of one page */ +} WalWriter; + +/* +** Write iAmt bytes of content into the WAL file beginning at iOffset. +** Do a sync when crossing the p->iSyncPoint boundary. +** +** In other words, if iSyncPoint is in between iOffset and iOffset+iAmt, +** first write the part before iSyncPoint, then sync, then write the +** rest. +*/ +static int walWriteToLog( + WalWriter *p, /* WAL to write to */ + void *pContent, /* Content to be written */ + int iAmt, /* Number of bytes to write */ + sqlite3_int64 iOffset /* Start writing at this offset */ +){ + int rc; + if( iOffsetiSyncPoint && iOffset+iAmt>=p->iSyncPoint ){ + int iFirstAmt = (int)(p->iSyncPoint - iOffset); + rc = sqlite3OsWrite(p->pFd, pContent, iFirstAmt, iOffset); + if( rc ) return rc; + iOffset += iFirstAmt; + iAmt -= iFirstAmt; + pContent = (void*)(iFirstAmt + (char*)pContent); + assert( p->syncFlags & (SQLITE_SYNC_NORMAL|SQLITE_SYNC_FULL) ); + rc = sqlite3OsSync(p->pFd, p->syncFlags & SQLITE_SYNC_MASK); + if( iAmt==0 || rc ) return rc; + } + rc = sqlite3OsWrite(p->pFd, pContent, iAmt, iOffset); + return rc; +} + +/* +** Write out a single frame of the WAL +*/ +static int walWriteOneFrame( + WalWriter *p, /* Where to write the frame */ + PgHdr *pPage, /* The page of the frame to be written */ + int nTruncate, /* The commit flag. Usually 0. >0 for commit */ + sqlite3_int64 iOffset /* Byte offset at which to write */ +){ + int rc; /* Result code from subfunctions */ + void *pData; /* Data actually written */ + u8 aFrame[WAL_FRAME_HDRSIZE]; /* Buffer to assemble frame-header in */ +#if defined(SQLITE_HAS_CODEC) + if( (pData = sqlite3PagerCodec(pPage))==0 ) return SQLITE_NOMEM_BKPT; +#else + pData = pPage->pData; +#endif + walEncodeFrame(p->pWal, pPage->pgno, nTruncate, pData, aFrame); + rc = walWriteToLog(p, aFrame, sizeof(aFrame), iOffset); + if( rc ) return rc; + /* Write the page data */ + rc = walWriteToLog(p, pData, p->szPage, iOffset+sizeof(aFrame)); + return rc; +} + +/* +** This function is called as part of committing a transaction within which +** one or more frames have been overwritten. It updates the checksums for +** all frames written to the wal file by the current transaction starting +** with the earliest to have been overwritten. +** +** SQLITE_OK is returned if successful, or an SQLite error code otherwise. +*/ +static int walRewriteChecksums(Wal *pWal, u32 iLast){ + const int szPage = pWal->szPage;/* Database page size */ + int rc = SQLITE_OK; /* Return code */ + u8 *aBuf; /* Buffer to load data from wal file into */ + u8 aFrame[WAL_FRAME_HDRSIZE]; /* Buffer to assemble frame-headers in */ + u32 iRead; /* Next frame to read from wal file */ + i64 iCksumOff; + + aBuf = sqlite3_malloc(szPage + WAL_FRAME_HDRSIZE); + if( aBuf==0 ) return SQLITE_NOMEM_BKPT; + + /* Find the checksum values to use as input for the recalculating the + ** first checksum. If the first frame is frame 1 (implying that the current + ** transaction restarted the wal file), these values must be read from the + ** wal-file header. Otherwise, read them from the frame header of the + ** previous frame. */ + assert( pWal->iReCksum>0 ); + if( pWal->iReCksum==1 ){ + iCksumOff = 24; + }else{ + iCksumOff = walFrameOffset(pWal->iReCksum-1, szPage) + 16; + } + rc = sqlite3OsRead(pWal->pWalFd, aBuf, sizeof(u32)*2, iCksumOff); + pWal->hdr.aFrameCksum[0] = sqlite3Get4byte(aBuf); + pWal->hdr.aFrameCksum[1] = sqlite3Get4byte(&aBuf[sizeof(u32)]); + + iRead = pWal->iReCksum; + pWal->iReCksum = 0; + for(; rc==SQLITE_OK && iRead<=iLast; iRead++){ + i64 iOff = walFrameOffset(iRead, szPage); + rc = sqlite3OsRead(pWal->pWalFd, aBuf, szPage+WAL_FRAME_HDRSIZE, iOff); + if( rc==SQLITE_OK ){ + u32 iPgno, nDbSize; + iPgno = sqlite3Get4byte(aBuf); + nDbSize = sqlite3Get4byte(&aBuf[4]); + + walEncodeFrame(pWal, iPgno, nDbSize, &aBuf[WAL_FRAME_HDRSIZE], aFrame); + rc = sqlite3OsWrite(pWal->pWalFd, aFrame, sizeof(aFrame), iOff); + } + } + + sqlite3_free(aBuf); + return rc; +} + +/* +** Write a set of frames to the log. The caller must hold the write-lock +** on the log file (obtained using sqlite3WalBeginWriteTransaction()). +*/ +SQLITE_PRIVATE int sqlite3WalFrames( + Wal *pWal, /* Wal handle to write to */ + int szPage, /* Database page-size in bytes */ + PgHdr *pList, /* List of dirty pages to write */ + Pgno nTruncate, /* Database size after this commit */ + int isCommit, /* True if this is a commit */ + int sync_flags /* Flags to pass to OsSync() (or 0) */ +){ + int rc; /* Used to catch return codes */ + u32 iFrame; /* Next frame address */ + PgHdr *p; /* Iterator to run through pList with. */ + PgHdr *pLast = 0; /* Last frame in list */ + int nExtra = 0; /* Number of extra copies of last page */ + int szFrame; /* The size of a single frame */ + i64 iOffset; /* Next byte to write in WAL file */ + WalWriter w; /* The writer */ + u32 iFirst = 0; /* First frame that may be overwritten */ + WalIndexHdr *pLive; /* Pointer to shared header */ + + assert( pList ); + assert( pWal->writeLock ); + + /* If this frame set completes a transaction, then nTruncate>0. If + ** nTruncate==0 then this frame set does not complete the transaction. */ + assert( (isCommit!=0)==(nTruncate!=0) ); + +#if defined(SQLITE_TEST) && defined(SQLITE_DEBUG) + { int cnt; for(cnt=0, p=pList; p; p=p->pDirty, cnt++){} + WALTRACE(("WAL%p: frame write begin. %d frames. mxFrame=%d. %s\n", + pWal, cnt, pWal->hdr.mxFrame, isCommit ? "Commit" : "Spill")); + } +#endif + + pLive = (WalIndexHdr*)walIndexHdr(pWal); + if( memcmp(&pWal->hdr, (void *)pLive, sizeof(WalIndexHdr))!=0 ){ + iFirst = pLive->mxFrame+1; + } + + /* See if it is possible to write these frames into the start of the + ** log file, instead of appending to it at pWal->hdr.mxFrame. + */ + if( SQLITE_OK!=(rc = walRestartLog(pWal)) ){ + return rc; + } + + /* If this is the first frame written into the log, write the WAL + ** header to the start of the WAL file. See comments at the top of + ** this source file for a description of the WAL header format. + */ + iFrame = pWal->hdr.mxFrame; + if( iFrame==0 ){ + u8 aWalHdr[WAL_HDRSIZE]; /* Buffer to assemble wal-header in */ + u32 aCksum[2]; /* Checksum for wal-header */ + + sqlite3Put4byte(&aWalHdr[0], (WAL_MAGIC | SQLITE_BIGENDIAN)); + sqlite3Put4byte(&aWalHdr[4], WAL_MAX_VERSION); + sqlite3Put4byte(&aWalHdr[8], szPage); + sqlite3Put4byte(&aWalHdr[12], pWal->nCkpt); + if( pWal->nCkpt==0 ) sqlite3_randomness(8, pWal->hdr.aSalt); + memcpy(&aWalHdr[16], pWal->hdr.aSalt, 8); + walChecksumBytes(1, aWalHdr, WAL_HDRSIZE-2*4, 0, aCksum); + sqlite3Put4byte(&aWalHdr[24], aCksum[0]); + sqlite3Put4byte(&aWalHdr[28], aCksum[1]); + + pWal->szPage = szPage; + pWal->hdr.bigEndCksum = SQLITE_BIGENDIAN; + pWal->hdr.aFrameCksum[0] = aCksum[0]; + pWal->hdr.aFrameCksum[1] = aCksum[1]; + pWal->truncateOnCommit = 1; + + rc = sqlite3OsWrite(pWal->pWalFd, aWalHdr, sizeof(aWalHdr), 0); + WALTRACE(("WAL%p: wal-header write %s\n", pWal, rc ? "failed" : "ok")); + if( rc!=SQLITE_OK ){ + return rc; + } + + /* Sync the header (unless SQLITE_IOCAP_SEQUENTIAL is true or unless + ** all syncing is turned off by PRAGMA synchronous=OFF). Otherwise + ** an out-of-order write following a WAL restart could result in + ** database corruption. See the ticket: + ** + ** http://localhost:591/sqlite/info/ff5be73dee + */ + if( pWal->syncHeader && sync_flags ){ + rc = sqlite3OsSync(pWal->pWalFd, sync_flags & SQLITE_SYNC_MASK); + if( rc ) return rc; + } + } + assert( (int)pWal->szPage==szPage ); + + /* Setup information needed to write frames into the WAL */ + w.pWal = pWal; + w.pFd = pWal->pWalFd; + w.iSyncPoint = 0; + w.syncFlags = sync_flags; + w.szPage = szPage; + iOffset = walFrameOffset(iFrame+1, szPage); + szFrame = szPage + WAL_FRAME_HDRSIZE; + + /* Write all frames into the log file exactly once */ + for(p=pList; p; p=p->pDirty){ + int nDbSize; /* 0 normally. Positive == commit flag */ + + /* Check if this page has already been written into the wal file by + ** the current transaction. If so, overwrite the existing frame and + ** set Wal.writeLock to WAL_WRITELOCK_RECKSUM - indicating that + ** checksums must be recomputed when the transaction is committed. */ + if( iFirst && (p->pDirty || isCommit==0) ){ + u32 iWrite = 0; + VVA_ONLY(rc =) sqlite3WalFindFrame(pWal, p->pgno, &iWrite); + assert( rc==SQLITE_OK || iWrite==0 ); + if( iWrite>=iFirst ){ + i64 iOff = walFrameOffset(iWrite, szPage) + WAL_FRAME_HDRSIZE; + void *pData; + if( pWal->iReCksum==0 || iWriteiReCksum ){ + pWal->iReCksum = iWrite; + } +#if defined(SQLITE_HAS_CODEC) + if( (pData = sqlite3PagerCodec(p))==0 ) return SQLITE_NOMEM; +#else + pData = p->pData; +#endif + rc = sqlite3OsWrite(pWal->pWalFd, pData, szPage, iOff); + if( rc ) return rc; + p->flags &= ~PGHDR_WAL_APPEND; + continue; + } + } + + iFrame++; + assert( iOffset==walFrameOffset(iFrame, szPage) ); + nDbSize = (isCommit && p->pDirty==0) ? nTruncate : 0; + rc = walWriteOneFrame(&w, p, nDbSize, iOffset); + if( rc ) return rc; + pLast = p; + iOffset += szFrame; + p->flags |= PGHDR_WAL_APPEND; + } + + /* Recalculate checksums within the wal file if required. */ + if( isCommit && pWal->iReCksum ){ + rc = walRewriteChecksums(pWal, iFrame); + if( rc ) return rc; + } + + /* If this is the end of a transaction, then we might need to pad + ** the transaction and/or sync the WAL file. + ** + ** Padding and syncing only occur if this set of frames complete a + ** transaction and if PRAGMA synchronous=FULL. If synchronous==NORMAL + ** or synchronous==OFF, then no padding or syncing are needed. + ** + ** If SQLITE_IOCAP_POWERSAFE_OVERWRITE is defined, then padding is not + ** needed and only the sync is done. If padding is needed, then the + ** final frame is repeated (with its commit mark) until the next sector + ** boundary is crossed. Only the part of the WAL prior to the last + ** sector boundary is synced; the part of the last frame that extends + ** past the sector boundary is written after the sync. + */ + if( isCommit && (sync_flags & WAL_SYNC_TRANSACTIONS)!=0 ){ + int bSync = 1; + if( pWal->padToSectorBoundary ){ + int sectorSize = sqlite3SectorSize(pWal->pWalFd); + w.iSyncPoint = ((iOffset+sectorSize-1)/sectorSize)*sectorSize; + bSync = (w.iSyncPoint==iOffset); + testcase( bSync ); + while( iOffsettruncateOnCommit && pWal->mxWalSize>=0 ){ + i64 sz = pWal->mxWalSize; + if( walFrameOffset(iFrame+nExtra+1, szPage)>pWal->mxWalSize ){ + sz = walFrameOffset(iFrame+nExtra+1, szPage); + } + walLimitSize(pWal, sz); + pWal->truncateOnCommit = 0; + } + + /* Append data to the wal-index. It is not necessary to lock the + ** wal-index to do this as the SQLITE_SHM_WRITE lock held on the wal-index + ** guarantees that there are no other writers, and no data that may + ** be in use by existing readers is being overwritten. + */ + iFrame = pWal->hdr.mxFrame; + for(p=pList; p && rc==SQLITE_OK; p=p->pDirty){ + if( (p->flags & PGHDR_WAL_APPEND)==0 ) continue; + iFrame++; + rc = walIndexAppend(pWal, iFrame, p->pgno); + } + while( rc==SQLITE_OK && nExtra>0 ){ + iFrame++; + nExtra--; + rc = walIndexAppend(pWal, iFrame, pLast->pgno); + } + + if( rc==SQLITE_OK ){ + /* Update the private copy of the header. */ + pWal->hdr.szPage = (u16)((szPage&0xff00) | (szPage>>16)); + testcase( szPage<=32768 ); + testcase( szPage>=65536 ); + pWal->hdr.mxFrame = iFrame; + if( isCommit ){ + pWal->hdr.iChange++; + pWal->hdr.nPage = nTruncate; + } + /* If this is a commit, update the wal-index header too. */ + if( isCommit ){ + walIndexWriteHdr(pWal); + pWal->iCallback = iFrame; + } + } + + WALTRACE(("WAL%p: frame write %s\n", pWal, rc ? "failed" : "ok")); + return rc; +} + +/* +** This routine is called to implement sqlite3_wal_checkpoint() and +** related interfaces. +** +** Obtain a CHECKPOINT lock and then backfill as much information as +** we can from WAL into the database. +** +** If parameter xBusy is not NULL, it is a pointer to a busy-handler +** callback. In this case this function runs a blocking checkpoint. +*/ +SQLITE_PRIVATE int sqlite3WalCheckpoint( + Wal *pWal, /* Wal connection */ + int eMode, /* PASSIVE, FULL, RESTART, or TRUNCATE */ + int (*xBusy)(void*), /* Function to call when busy */ + void *pBusyArg, /* Context argument for xBusyHandler */ + int sync_flags, /* Flags to sync db file with (or 0) */ + int nBuf, /* Size of temporary buffer */ + u8 *zBuf, /* Temporary buffer to use */ + int *pnLog, /* OUT: Number of frames in WAL */ + int *pnCkpt /* OUT: Number of backfilled frames in WAL */ +){ + int rc; /* Return code */ + int isChanged = 0; /* True if a new wal-index header is loaded */ + int eMode2 = eMode; /* Mode to pass to walCheckpoint() */ + int (*xBusy2)(void*) = xBusy; /* Busy handler for eMode2 */ + + assert( pWal->ckptLock==0 ); + assert( pWal->writeLock==0 ); + + /* EVIDENCE-OF: R-62920-47450 The busy-handler callback is never invoked + ** in the SQLITE_CHECKPOINT_PASSIVE mode. */ + assert( eMode!=SQLITE_CHECKPOINT_PASSIVE || xBusy==0 ); + + if( pWal->readOnly ) return SQLITE_READONLY; + WALTRACE(("WAL%p: checkpoint begins\n", pWal)); + + /* IMPLEMENTATION-OF: R-62028-47212 All calls obtain an exclusive + ** "checkpoint" lock on the database file. */ + rc = walLockExclusive(pWal, WAL_CKPT_LOCK, 1); + if( rc ){ + /* EVIDENCE-OF: R-10421-19736 If any other process is running a + ** checkpoint operation at the same time, the lock cannot be obtained and + ** SQLITE_BUSY is returned. + ** EVIDENCE-OF: R-53820-33897 Even if there is a busy-handler configured, + ** it will not be invoked in this case. + */ + testcase( rc==SQLITE_BUSY ); + testcase( xBusy!=0 ); + return rc; + } + pWal->ckptLock = 1; + + /* IMPLEMENTATION-OF: R-59782-36818 The SQLITE_CHECKPOINT_FULL, RESTART and + ** TRUNCATE modes also obtain the exclusive "writer" lock on the database + ** file. + ** + ** EVIDENCE-OF: R-60642-04082 If the writer lock cannot be obtained + ** immediately, and a busy-handler is configured, it is invoked and the + ** writer lock retried until either the busy-handler returns 0 or the + ** lock is successfully obtained. + */ + if( eMode!=SQLITE_CHECKPOINT_PASSIVE ){ + rc = walBusyLock(pWal, xBusy, pBusyArg, WAL_WRITE_LOCK, 1); + if( rc==SQLITE_OK ){ + pWal->writeLock = 1; + }else if( rc==SQLITE_BUSY ){ + eMode2 = SQLITE_CHECKPOINT_PASSIVE; + xBusy2 = 0; + rc = SQLITE_OK; + } + } + + /* Read the wal-index header. */ + if( rc==SQLITE_OK ){ + rc = walIndexReadHdr(pWal, &isChanged); + if( isChanged && pWal->pDbFd->pMethods->iVersion>=3 ){ + sqlite3OsUnfetch(pWal->pDbFd, 0, 0); + } + } + + /* Copy data from the log to the database file. */ + if( rc==SQLITE_OK ){ + + if( pWal->hdr.mxFrame && walPagesize(pWal)!=nBuf ){ + rc = SQLITE_CORRUPT_BKPT; + }else{ + rc = walCheckpoint(pWal, eMode2, xBusy2, pBusyArg, sync_flags, zBuf); + } + + /* If no error occurred, set the output variables. */ + if( rc==SQLITE_OK || rc==SQLITE_BUSY ){ + if( pnLog ) *pnLog = (int)pWal->hdr.mxFrame; + if( pnCkpt ) *pnCkpt = (int)(walCkptInfo(pWal)->nBackfill); + } + } + + if( isChanged ){ + /* If a new wal-index header was loaded before the checkpoint was + ** performed, then the pager-cache associated with pWal is now + ** out of date. So zero the cached wal-index header to ensure that + ** next time the pager opens a snapshot on this database it knows that + ** the cache needs to be reset. + */ + memset(&pWal->hdr, 0, sizeof(WalIndexHdr)); + } + + /* Release the locks. */ + sqlite3WalEndWriteTransaction(pWal); + walUnlockExclusive(pWal, WAL_CKPT_LOCK, 1); + pWal->ckptLock = 0; + WALTRACE(("WAL%p: checkpoint %s\n", pWal, rc ? "failed" : "ok")); + return (rc==SQLITE_OK && eMode!=eMode2 ? SQLITE_BUSY : rc); +} + +/* Return the value to pass to a sqlite3_wal_hook callback, the +** number of frames in the WAL at the point of the last commit since +** sqlite3WalCallback() was called. If no commits have occurred since +** the last call, then return 0. +*/ +SQLITE_PRIVATE int sqlite3WalCallback(Wal *pWal){ + u32 ret = 0; + if( pWal ){ + ret = pWal->iCallback; + pWal->iCallback = 0; + } + return (int)ret; +} + +/* +** This function is called to change the WAL subsystem into or out +** of locking_mode=EXCLUSIVE. +** +** If op is zero, then attempt to change from locking_mode=EXCLUSIVE +** into locking_mode=NORMAL. This means that we must acquire a lock +** on the pWal->readLock byte. If the WAL is already in locking_mode=NORMAL +** or if the acquisition of the lock fails, then return 0. If the +** transition out of exclusive-mode is successful, return 1. This +** operation must occur while the pager is still holding the exclusive +** lock on the main database file. +** +** If op is one, then change from locking_mode=NORMAL into +** locking_mode=EXCLUSIVE. This means that the pWal->readLock must +** be released. Return 1 if the transition is made and 0 if the +** WAL is already in exclusive-locking mode - meaning that this +** routine is a no-op. The pager must already hold the exclusive lock +** on the main database file before invoking this operation. +** +** If op is negative, then do a dry-run of the op==1 case but do +** not actually change anything. The pager uses this to see if it +** should acquire the database exclusive lock prior to invoking +** the op==1 case. +*/ +SQLITE_PRIVATE int sqlite3WalExclusiveMode(Wal *pWal, int op){ + int rc; + assert( pWal->writeLock==0 ); + assert( pWal->exclusiveMode!=WAL_HEAPMEMORY_MODE || op==-1 ); + + /* pWal->readLock is usually set, but might be -1 if there was a + ** prior error while attempting to acquire are read-lock. This cannot + ** happen if the connection is actually in exclusive mode (as no xShmLock + ** locks are taken in this case). Nor should the pager attempt to + ** upgrade to exclusive-mode following such an error. + */ + assert( pWal->readLock>=0 || pWal->lockError ); + assert( pWal->readLock>=0 || (op<=0 && pWal->exclusiveMode==0) ); + + if( op==0 ){ + if( pWal->exclusiveMode ){ + pWal->exclusiveMode = 0; + if( walLockShared(pWal, WAL_READ_LOCK(pWal->readLock))!=SQLITE_OK ){ + pWal->exclusiveMode = 1; + } + rc = pWal->exclusiveMode==0; + }else{ + /* Already in locking_mode=NORMAL */ + rc = 0; + } + }else if( op>0 ){ + assert( pWal->exclusiveMode==0 ); + assert( pWal->readLock>=0 ); + walUnlockShared(pWal, WAL_READ_LOCK(pWal->readLock)); + pWal->exclusiveMode = 1; + rc = 1; + }else{ + rc = pWal->exclusiveMode==0; + } + return rc; +} + +/* +** Return true if the argument is non-NULL and the WAL module is using +** heap-memory for the wal-index. Otherwise, if the argument is NULL or the +** WAL module is using shared-memory, return false. +*/ +SQLITE_PRIVATE int sqlite3WalHeapMemory(Wal *pWal){ + return (pWal && pWal->exclusiveMode==WAL_HEAPMEMORY_MODE ); +} + +#ifdef SQLITE_ENABLE_SNAPSHOT +/* Create a snapshot object. The content of a snapshot is opaque to +** every other subsystem, so the WAL module can put whatever it needs +** in the object. +*/ +SQLITE_PRIVATE int sqlite3WalSnapshotGet(Wal *pWal, sqlite3_snapshot **ppSnapshot){ + int rc = SQLITE_OK; + WalIndexHdr *pRet; + + assert( pWal->readLock>=0 && pWal->writeLock==0 ); + + pRet = (WalIndexHdr*)sqlite3_malloc(sizeof(WalIndexHdr)); + if( pRet==0 ){ + rc = SQLITE_NOMEM_BKPT; + }else{ + memcpy(pRet, &pWal->hdr, sizeof(WalIndexHdr)); + *ppSnapshot = (sqlite3_snapshot*)pRet; + } + + return rc; +} + +/* Try to open on pSnapshot when the next read-transaction starts +*/ +SQLITE_PRIVATE void sqlite3WalSnapshotOpen(Wal *pWal, sqlite3_snapshot *pSnapshot){ + pWal->pSnapshot = (WalIndexHdr*)pSnapshot; +} + +/* +** Return a +ve value if snapshot p1 is newer than p2. A -ve value if +** p1 is older than p2 and zero if p1 and p2 are the same snapshot. +*/ +SQLITE_API int sqlite3_snapshot_cmp(sqlite3_snapshot *p1, sqlite3_snapshot *p2){ + WalIndexHdr *pHdr1 = (WalIndexHdr*)p1; + WalIndexHdr *pHdr2 = (WalIndexHdr*)p2; + + /* aSalt[0] is a copy of the value stored in the wal file header. It + ** is incremented each time the wal file is restarted. */ + if( pHdr1->aSalt[0]aSalt[0] ) return -1; + if( pHdr1->aSalt[0]>pHdr2->aSalt[0] ) return +1; + if( pHdr1->mxFramemxFrame ) return -1; + if( pHdr1->mxFrame>pHdr2->mxFrame ) return +1; + return 0; +} +#endif /* SQLITE_ENABLE_SNAPSHOT */ + +#ifdef SQLITE_ENABLE_ZIPVFS +/* +** If the argument is not NULL, it points to a Wal object that holds a +** read-lock. This function returns the database page-size if it is known, +** or zero if it is not (or if pWal is NULL). +*/ +SQLITE_PRIVATE int sqlite3WalFramesize(Wal *pWal){ + assert( pWal==0 || pWal->readLock>=0 ); + return (pWal ? pWal->szPage : 0); +} +#endif + +/* Return the sqlite3_file object for the WAL file +*/ +SQLITE_PRIVATE sqlite3_file *sqlite3WalFile(Wal *pWal){ + return pWal->pWalFd; +} + +#endif /* #ifndef SQLITE_OMIT_WAL */ + +/************** End of wal.c *************************************************/ +/************** Begin file btmutex.c *****************************************/ +/* +** 2007 August 27 +** +** 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 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 +** a good breakout. +*/ +/************** Include btreeInt.h in the middle of btmutex.c ****************/ +/************** Begin file btreeInt.h ****************************************/ +/* +** 2004 April 6 +** +** 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 implements an external (disk-based) database using BTrees. +** For a detailed discussion of BTrees, refer to +** +** Donald E. Knuth, THE ART OF COMPUTER PROGRAMMING, Volume 3: +** "Sorting And Searching", pages 473-480. Addison-Wesley +** Publishing Company, Reading, Massachusetts. +** +** The basic idea is that each page of the file contains N database +** entries and N+1 pointers to subpages. +** +** ---------------------------------------------------------------- +** | Ptr(0) | Key(0) | Ptr(1) | Key(1) | ... | Key(N-1) | Ptr(N) | +** ---------------------------------------------------------------- +** +** All of the keys on the page that Ptr(0) points to have values less +** than Key(0). All of the keys on page Ptr(1) and its subpages have +** values greater than Key(0) and less than Key(1). All of the keys +** on Ptr(N) and its subpages have values greater than Key(N-1). And +** so forth. +** +** Finding a particular key requires reading O(log(M)) pages from the +** disk where M is the number of entries in the tree. +** +** In this implementation, a single file can hold one or more separate +** BTrees. Each BTree is identified by the index of its root page. The +** key and data for any entry are combined to form the "payload". A +** fixed amount of payload can be carried directly on the database +** page. If the payload is larger than the preset amount then surplus +** bytes are stored on overflow pages. The payload for an entry +** and the preceding pointer are combined to form a "Cell". Each +** page has a small header which contains the Ptr(N) pointer and other +** information such as the size of key and data. +** +** FORMAT DETAILS +** +** 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 any power of 2 between 512 and 65536. +** 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. +** The format of the file header is as follows: +** +** OFFSET SIZE DESCRIPTION +** 0 16 Header string: "SQLite format 3\000" +** 16 2 Page size in bytes. (1 means 65536) +** 18 1 File format write version +** 19 1 File format read version +** 20 1 Bytes of unused space at the end of each page +** 21 1 Max embedded payload fraction (must be 64) +** 22 1 Min embedded payload fraction (must be 32) +** 23 1 Min leaf payload fraction (must be 32) +** 24 4 File change counter +** 28 4 Reserved for future use +** 32 4 First freelist page +** 36 4 Number of freelist pages in the file +** 40 60 15 4-byte meta values passed to higher layers +** +** 40 4 Schema cookie +** 44 4 File format of schema layer +** 48 4 Size of page cache +** 52 4 Largest root-page (auto/incr_vacuum) +** 56 4 1=UTF-8 2=UTF16le 3=UTF16be +** 60 4 User version +** 64 4 Incremental vacuum mode +** 68 4 Application-ID +** 72 20 unused +** 92 4 The version-valid-for number +** 96 4 SQLITE_VERSION_NUMBER +** +** All of the integer values are big-endian (most significant byte first). +** +** The file change counter is incremented when the database is changed +** This counter allows other processes to know when the file has changed +** and thus when they need to flush their cache. +** +** The max embedded payload fraction is the amount of the total usable +** space in a page that can be consumed by a single cell for standard +** B-tree (non-LEAFDATA) tables. A value of 255 means 100%. The default +** is to limit the maximum cell size so that at least 4 cells will fit +** on one page. Thus the default max embedded payload fraction is 64. +** +** If the payload for a cell is larger than the max payload, then extra +** payload is spilled to overflow pages. Once an overflow page is allocated, +** as many bytes as possible are moved into the overflow pages without letting +** the cell size drop below the min embedded payload fraction. +** +** The min leaf payload fraction is like the min embedded payload fraction +** except that it applies to leaf nodes in a LEAFDATA tree. The maximum +** payload fraction for a LEAFDATA tree is always 100% (or 255) and it +** not specified in the header. +** +** Each btree pages is divided into three sections: The header, the +** cell pointer array, and the cell content area. Page 1 also has a 100-byte +** file header that occurs before the page header. +** +** |----------------| +** | file header | 100 bytes. Page 1 only. +** |----------------| +** | page header | 8 bytes for leaves. 12 bytes for interior nodes +** |----------------| +** | cell pointer | | 2 bytes per cell. Sorted order. +** | array | | Grows downward +** | | v +** |----------------| +** | unallocated | +** | space | +** |----------------| ^ Grows upwards +** | cell content | | Arbitrary order interspersed with freeblocks. +** | area | | and free space fragments. +** |----------------| +** +** The page headers looks like this: +** +** OFFSET SIZE DESCRIPTION +** 0 1 Flags. 1: intkey, 2: zerodata, 4: leafdata, 8: leaf +** 1 2 byte offset to the first freeblock +** 3 2 number of cells on this page +** 5 2 first byte of the cell content area +** 7 1 number of fragmented free bytes +** 8 4 Right child (the Ptr(N) value). Omitted on leaves. +** +** The flags define the format of this btree page. The leaf flag means that +** this page has no children. The zerodata flag means that this page carries +** only keys and no data. The intkey flag means that the key is an integer +** which is stored in the key size entry of the cell header rather than in +** the payload area. +** +** The cell pointer array begins on the first byte after the page header. +** The cell pointer array contains zero or more 2-byte numbers which are +** offsets from the beginning of the page to the cell content in the cell +** content area. The cell pointers occur in sorted order. The system strives +** to keep free space after the last cell pointer so that new cells can +** be easily added without having to defragment the page. +** +** Cell content is stored at the very end of the page and grows toward the +** beginning of the page. +** +** Unused space within the cell content area is collected into a linked list of +** freeblocks. Each freeblock is at least 4 bytes in size. The byte offset +** to the first freeblock is given in the header. Freeblocks occur in +** increasing order. Because a freeblock must be at least 4 bytes in size, +** any group of 3 or fewer unused bytes in the cell content area cannot +** exist on the freeblock chain. A group of 3 or fewer free bytes is called +** a fragment. The total number of bytes in all fragments is recorded. +** in the page header at offset 7. +** +** SIZE DESCRIPTION +** 2 Byte offset of the next freeblock +** 2 Bytes in this freeblock +** +** Cells are of variable length. Cells are stored in the cell content area at +** the end of the page. Pointers to the cells are in the cell pointer array +** that immediately follows the page header. Cells is not necessarily +** contiguous or in order, but cell pointers are contiguous and in order. +** +** Cell content makes use of variable length integers. A variable +** length integer is 1 to 9 bytes where the lower 7 bits of each +** byte are used. The integer consists of all bytes that have bit 8 set and +** the first byte with bit 8 clear. The most significant byte of the integer +** appears first. A variable-length integer may not be more than 9 bytes long. +** As a special case, all 8 bytes of the 9th byte are used as data. This +** allows a 64-bit integer to be encoded in 9 bytes. +** +** 0x00 becomes 0x00000000 +** 0x7f becomes 0x0000007f +** 0x81 0x00 becomes 0x00000080 +** 0x82 0x00 becomes 0x00000100 +** 0x80 0x7f becomes 0x0000007f +** 0x8a 0x91 0xd1 0xac 0x78 becomes 0x12345678 +** 0x81 0x81 0x81 0x81 0x01 becomes 0x10204081 +** +** Variable length integers are used for rowids and to hold the number of +** bytes of key and data in a btree cell. +** +** The content of a cell looks like this: +** +** SIZE DESCRIPTION +** 4 Page number of the left child. Omitted if leaf flag is set. +** var Number of bytes of data. Omitted if the zerodata flag is set. +** var Number of bytes of key. Or the key itself if intkey flag is set. +** * Payload +** 4 First page of the overflow chain. Omitted if no overflow +** +** Overflow pages form a linked list. Each page except the last is completely +** filled with data (pagesize - 4 bytes). The last page can have as little +** as 1 byte of data. +** +** SIZE DESCRIPTION +** 4 Page number of next overflow page +** * Data +** +** Freelist pages come in two subtypes: trunk pages and leaf pages. The +** file header points to the first in a linked list of trunk page. Each trunk +** page points to multiple leaf pages. The content of a leaf page is +** unspecified. A trunk page looks like this: +** +** SIZE DESCRIPTION +** 4 Page number of next trunk page +** 4 Number of leaf pointers on this page +** * zero or more pages numbers of leaves +*/ +/* #include "sqliteInt.h" */ + + +/* The following value is the maximum cell size assuming a maximum page +** size give above. +*/ +#define MX_CELL_SIZE(pBt) ((int)(pBt->pageSize-8)) + +/* The maximum number of cells on a single page of the database. This +** assumes a minimum cell size of 6 bytes (4 bytes for the cell itself +** plus 2 bytes for the index to the cell in the page header). Such +** small cells will be rare, but they are possible. +*/ +#define MX_CELL(pBt) ((pBt->pageSize-8)/6) + +/* Forward declarations */ +typedef struct MemPage MemPage; +typedef struct BtLock BtLock; +typedef struct CellInfo CellInfo; + +/* +** This is a magic string that appears at the beginning of every +** SQLite database in order to identify the file as a real database. +** +** You can change this value at compile-time by specifying a +** -DSQLITE_FILE_HEADER="..." on the compiler command-line. The +** header must be exactly 16 bytes including the zero-terminator so +** the string itself should be 15 characters long. If you change +** the header, then your custom library will not be able to read +** databases generated by the standard tools and the standard tools +** will not be able to read databases created by your custom library. +*/ +#ifndef SQLITE_FILE_HEADER /* 123456789 123456 */ +# define SQLITE_FILE_HEADER "SQLite format 3" +#endif + +/* +** Page type flags. An ORed combination of these flags appear as the +** first byte of on-disk image of every BTree page. +*/ +#define PTF_INTKEY 0x01 +#define PTF_ZERODATA 0x02 +#define PTF_LEAFDATA 0x04 +#define PTF_LEAF 0x08 + +/* +** As each page of the file is loaded into memory, an instance of the following +** structure is appended and initialized to zero. This structure stores +** information about the page that is decoded from the raw file page. +** +** The pParent field points back to the parent page. This allows us to +** walk up the BTree from any leaf to the root. Care must be taken to +** unref() the parent page pointer when this page is no longer referenced. +** The pageDestructor() routine handles that chore. +** +** Access to all fields of this structure is controlled by the mutex +** stored in MemPage.pBt->mutex. +*/ +struct MemPage { + u8 isInit; /* True if previously initialized. MUST BE FIRST! */ + u8 nOverflow; /* Number of overflow cell bodies in aCell[] */ + u8 intKey; /* True if table b-trees. False for index b-trees */ + u8 intKeyLeaf; /* True if the leaf of an intKey table */ + u8 leaf; /* True if a leaf page */ + u8 hdrOffset; /* 100 for page 1. 0 otherwise */ + u8 childPtrSize; /* 0 if leaf==1. 4 if leaf==0 */ + u8 max1bytePayload; /* min(maxLocal,127) */ + u8 bBusy; /* Prevent endless loops on corrupt database files */ + u16 maxLocal; /* Copy of BtShared.maxLocal or BtShared.maxLeaf */ + u16 minLocal; /* Copy of BtShared.minLocal or BtShared.minLeaf */ + u16 cellOffset; /* Index in aData of first cell pointer */ + u16 nFree; /* Number of free bytes on the page */ + u16 nCell; /* Number of cells on this page, local and ovfl */ + u16 maskPage; /* Mask for page offset */ + u16 aiOvfl[5]; /* Insert the i-th overflow cell before the aiOvfl-th + ** non-overflow cell */ + u8 *apOvfl[5]; /* Pointers to the body of overflow cells */ + BtShared *pBt; /* Pointer to BtShared that this page is part of */ + u8 *aData; /* Pointer to disk image of the page data */ + u8 *aDataEnd; /* One byte past the end of usable data */ + u8 *aCellIdx; /* The cell index area */ + u8 *aDataOfst; /* Same as aData for leaves. aData+4 for interior */ + DbPage *pDbPage; /* Pager page handle */ + u16 (*xCellSize)(MemPage*,u8*); /* cellSizePtr method */ + void (*xParseCell)(MemPage*,u8*,CellInfo*); /* btreeParseCell method */ + Pgno pgno; /* Page number for this page */ +}; + +/* +** The in-memory image of a disk page has the auxiliary information appended +** to the end. EXTRA_SIZE is the number of bytes of space needed to hold +** that extra information. +*/ +#define EXTRA_SIZE sizeof(MemPage) + +/* +** A linked list of the following structures is stored at BtShared.pLock. +** Locks are added (or upgraded from READ_LOCK to WRITE_LOCK) when a cursor +** is opened on the table with root page BtShared.iTable. Locks are removed +** from this list when a transaction is committed or rolled back, or when +** a btree handle is closed. +*/ +struct BtLock { + Btree *pBtree; /* Btree handle holding this lock */ + Pgno iTable; /* Root page of table */ + u8 eLock; /* READ_LOCK or WRITE_LOCK */ + BtLock *pNext; /* Next in BtShared.pLock list */ +}; + +/* Candidate values for BtLock.eLock */ +#define READ_LOCK 1 +#define WRITE_LOCK 2 + +/* A Btree handle +** +** A database connection contains a pointer to an instance of +** this object for every database file that it has open. This structure +** is opaque to the database connection. The database connection cannot +** see the internals of this structure and only deals with pointers to +** this structure. +** +** For some database files, the same underlying database cache might be +** 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. +** +** All fields in this structure are accessed under sqlite3.mutex. +** The pBt pointer itself may not be changed while there exists cursors +** in the referenced BtShared that point back to this Btree since those +** cursors have to go through this Btree to find their BtShared and +** they often do so without holding sqlite3.mutex. +*/ +struct Btree { + sqlite3 *db; /* The database connection holding this btree */ + BtShared *pBt; /* Sharable content of this btree */ + u8 inTrans; /* TRANS_NONE, TRANS_READ or TRANS_WRITE */ + u8 sharable; /* True if we can share pBt with another db */ + u8 locked; /* True if db currently has pBt locked */ + u8 hasIncrblobCur; /* True if there are one or more Incrblob cursors */ + int wantToLock; /* Number of nested calls to sqlite3BtreeEnter() */ + int nBackup; /* Number of backup operations reading this btree */ + u32 iDataVersion; /* Combines with pBt->pPager->iDataVersion */ + Btree *pNext; /* List of other sharable Btrees from the same db */ + Btree *pPrev; /* Back pointer of the same list */ +#ifndef SQLITE_OMIT_SHARED_CACHE + BtLock lock; /* Object used to lock page 1 */ +#endif +}; + +/* +** Btree.inTrans may take one of the following values. +** +** If the shared-data extension is enabled, there may be multiple users +** of the Btree structure. At most one of these may open a write transaction, +** but any number may have active read transactions. +*/ +#define TRANS_NONE 0 +#define TRANS_READ 1 +#define TRANS_WRITE 2 + +/* +** An instance of this object represents a single database file. +** +** A single database file can be in use at the same time by two +** or more database connections. When two or more connections are +** sharing the same database file, each connection has it own +** private Btree object for the file and each of those Btrees points +** to this one BtShared object. BtShared.nRef is the number of +** connections currently sharing this database file. +** +** Fields in this structure are accessed under the BtShared.mutex +** mutex, except for nRef and pNext which are accessed under the +** global SQLITE_MUTEX_STATIC_MASTER mutex. The pPager field +** may not be modified once it is initially set as long as nRef>0. +** The pSchema field may be set once under BtShared.mutex and +** thereafter is unchanged as long as nRef>0. +** +** isPending: +** +** If a BtShared client fails to obtain a write-lock on a database +** table (because there exists one or more read-locks on the table), +** the shared-cache enters 'pending-lock' state and isPending is +** set to true. +** +** The shared-cache leaves the 'pending lock' state when either of +** the following occur: +** +** 1) The current writer (BtShared.pWriter) concludes its transaction, OR +** 2) The number of locks held by other connections drops to zero. +** +** while in the 'pending-lock' state, no connection may start a new +** transaction. +** +** This feature is included to help prevent writer-starvation. +*/ +struct BtShared { + Pager *pPager; /* The page cache */ + sqlite3 *db; /* Database connection currently using this Btree */ + BtCursor *pCursor; /* A list of all open cursors */ + MemPage *pPage1; /* First page of the database */ + u8 openFlags; /* Flags to sqlite3BtreeOpen() */ +#ifndef SQLITE_OMIT_AUTOVACUUM + u8 autoVacuum; /* True if auto-vacuum is enabled */ + u8 incrVacuum; /* True if incr-vacuum is enabled */ + u8 bDoTruncate; /* True to truncate db on commit */ +#endif + u8 inTransaction; /* Transaction state */ + u8 max1bytePayload; /* Maximum first byte of cell for a 1-byte payload */ +#ifdef SQLITE_HAS_CODEC + u8 optimalReserve; /* Desired amount of reserved space per page */ +#endif + u16 btsFlags; /* Boolean parameters. See BTS_* macros below */ + u16 maxLocal; /* Maximum local payload in non-LEAFDATA tables */ + u16 minLocal; /* Minimum local payload in non-LEAFDATA tables */ + u16 maxLeaf; /* Maximum local payload in a LEAFDATA table */ + u16 minLeaf; /* Minimum local payload in a LEAFDATA table */ + u32 pageSize; /* Total number of bytes on a page */ + u32 usableSize; /* Number of usable bytes on each page */ + int nTransaction; /* Number of open transactions (read + write) */ + u32 nPage; /* Number of pages in the database */ + void *pSchema; /* Pointer to space allocated by sqlite3BtreeSchema() */ + void (*xFreeSchema)(void*); /* Destructor for BtShared.pSchema */ + sqlite3_mutex *mutex; /* Non-recursive mutex required to access this object */ + Bitvec *pHasContent; /* Set of pages moved to free-list this transaction */ +#ifndef SQLITE_OMIT_SHARED_CACHE + int nRef; /* Number of references to this structure */ + BtShared *pNext; /* Next on a list of sharable BtShared structs */ + BtLock *pLock; /* List of locks held on this shared-btree struct */ + Btree *pWriter; /* Btree with currently open write transaction */ +#endif + u8 *pTmpSpace; /* Temp space sufficient to hold a single cell */ +}; + +/* +** Allowed values for BtShared.btsFlags +*/ +#define BTS_READ_ONLY 0x0001 /* Underlying file is readonly */ +#define BTS_PAGESIZE_FIXED 0x0002 /* Page size can no longer be changed */ +#define BTS_SECURE_DELETE 0x0004 /* PRAGMA secure_delete is enabled */ +#define BTS_INITIALLY_EMPTY 0x0008 /* Database was empty at trans start */ +#define BTS_NO_WAL 0x0010 /* Do not open write-ahead-log files */ +#define BTS_EXCLUSIVE 0x0020 /* pWriter has an exclusive lock */ +#define BTS_PENDING 0x0040 /* Waiting for read-locks to clear */ + +/* +** An instance of the following structure is used to hold information +** about a cell. The parseCellPtr() function fills in this structure +** based on information extract from the raw disk page. +*/ +struct CellInfo { + i64 nKey; /* The key for INTKEY tables, or nPayload otherwise */ + u8 *pPayload; /* Pointer to the start of payload */ + u32 nPayload; /* Bytes of payload */ + u16 nLocal; /* Amount of payload held locally, not on overflow */ + u16 nSize; /* Size of the cell content on the main b-tree page */ +}; + +/* +** Maximum depth of an SQLite B-Tree structure. Any B-Tree deeper than +** this will be declared corrupt. This value is calculated based on a +** maximum database size of 2^31 pages a minimum fanout of 2 for a +** root-node and 3 for all other internal nodes. +** +** If a tree that appears to be taller than this is encountered, it is +** assumed that the database is corrupt. +*/ +#define BTCURSOR_MAX_DEPTH 20 + +/* +** A cursor is a pointer to a particular entry within a particular +** b-tree within a database file. +** +** The entry is identified by its MemPage and the index in +** MemPage.aCell[] of the entry. +** +** A single database file can be shared by two more database connections, +** but cursors cannot be shared. Each cursor is associated with a +** particular database connection identified BtCursor.pBtree.db. +** +** Fields in this structure are accessed under the BtShared.mutex +** found at self->pBt->mutex. +** +** skipNext meaning: +** eState==SKIPNEXT && skipNext>0: Next sqlite3BtreeNext() is no-op. +** eState==SKIPNEXT && skipNext<0: Next sqlite3BtreePrevious() is no-op. +** eState==FAULT: Cursor fault with skipNext as error code. +*/ +struct BtCursor { + Btree *pBtree; /* The Btree to which this cursor belongs */ + BtShared *pBt; /* The BtShared this cursor points to */ + BtCursor *pNext; /* Forms a linked list of all cursors */ + Pgno *aOverflow; /* Cache of overflow page locations */ + CellInfo info; /* A parse of the cell we are pointing at */ + i64 nKey; /* Size of pKey, or last integer key */ + void *pKey; /* Saved key that was cursor last known position */ + Pgno pgnoRoot; /* The root page of this tree */ + int nOvflAlloc; /* Allocated size of aOverflow[] array */ + int skipNext; /* Prev() is noop if negative. Next() is noop if positive. + ** Error code if eState==CURSOR_FAULT */ + u8 curFlags; /* zero or more BTCF_* flags defined below */ + u8 curPagerFlags; /* Flags to send to sqlite3PagerGet() */ + u8 eState; /* One of the CURSOR_XXX constants (see below) */ + u8 hints; /* As configured by CursorSetHints() */ + /* All fields above are zeroed when the cursor is allocated. See + ** sqlite3BtreeCursorZero(). Fields that follow must be manually + ** initialized. */ + i8 iPage; /* Index of current page in apPage */ + u8 curIntKey; /* Value of apPage[0]->intKey */ + struct KeyInfo *pKeyInfo; /* Argument passed to comparison function */ + void *padding1; /* Make object size a multiple of 16 */ + u16 aiIdx[BTCURSOR_MAX_DEPTH]; /* Current index in apPage[i] */ + MemPage *apPage[BTCURSOR_MAX_DEPTH]; /* Pages from root to current page */ +}; + +/* +** Legal values for BtCursor.curFlags +*/ +#define BTCF_WriteFlag 0x01 /* True if a write cursor */ +#define BTCF_ValidNKey 0x02 /* True if info.nKey is valid */ +#define BTCF_ValidOvfl 0x04 /* True if aOverflow is valid */ +#define BTCF_AtLast 0x08 /* Cursor is pointing ot the last entry */ +#define BTCF_Incrblob 0x10 /* True if an incremental I/O handle */ +#define BTCF_Multiple 0x20 /* Maybe another cursor on the same btree */ + +/* +** Potential values for BtCursor.eState. +** +** CURSOR_INVALID: +** Cursor does not point to a valid entry. This can happen (for example) +** because the table is empty or because BtreeCursorFirst() has not been +** called. +** +** CURSOR_VALID: +** Cursor points to a valid entry. getPayload() etc. may be called. +** +** CURSOR_SKIPNEXT: +** Cursor is valid except that the Cursor.skipNext field is non-zero +** indicating that the next sqlite3BtreeNext() or sqlite3BtreePrevious() +** operation should be a no-op. +** +** CURSOR_REQUIRESEEK: +** The table that this cursor was opened on still exists, but has been +** modified since the cursor was last used. The cursor position is saved +** in variables BtCursor.pKey and BtCursor.nKey. When a cursor is in +** this state, restoreCursorPosition() can be called to attempt to +** seek the cursor to the saved position. +** +** CURSOR_FAULT: +** An unrecoverable error (an I/O error or a malloc failure) has occurred +** on a different connection that shares the BtShared cache with this +** cursor. The error has left the cache in an inconsistent state. +** Do nothing else with this cursor. Any attempt to use the cursor +** should return the error code stored in BtCursor.skipNext +*/ +#define CURSOR_INVALID 0 +#define CURSOR_VALID 1 +#define CURSOR_SKIPNEXT 2 +#define CURSOR_REQUIRESEEK 3 +#define CURSOR_FAULT 4 + +/* +** The database page the PENDING_BYTE occupies. This page is never used. +*/ +# define PENDING_BYTE_PAGE(pBt) PAGER_MJ_PGNO(pBt) + +/* +** These macros define the location of the pointer-map entry for a +** database page. The first argument to each is the number of usable +** bytes on each page of the database (often 1024). The second is the +** page number to look up in the pointer map. +** +** PTRMAP_PAGENO returns the database page number of the pointer-map +** page that stores the required pointer. PTRMAP_PTROFFSET returns +** the offset of the requested map entry. +** +** If the pgno argument passed to PTRMAP_PAGENO is a pointer-map page, +** then pgno is returned. So (pgno==PTRMAP_PAGENO(pgsz, pgno)) can be +** used to test if pgno is a pointer-map page. PTRMAP_ISPAGE implements +** this test. +*/ +#define PTRMAP_PAGENO(pBt, pgno) ptrmapPageno(pBt, pgno) +#define PTRMAP_PTROFFSET(pgptrmap, pgno) (5*(pgno-pgptrmap-1)) +#define PTRMAP_ISPAGE(pBt, pgno) (PTRMAP_PAGENO((pBt),(pgno))==(pgno)) + +/* +** The pointer map is a lookup table that identifies the parent page for +** each child page in the database file. The parent page is the page that +** contains a pointer to the child. Every page in the database contains +** 0 or 1 parent pages. (In this context 'database page' refers +** to any page that is not part of the pointer map itself.) Each pointer map +** entry consists of a single byte 'type' and a 4 byte parent page number. +** The PTRMAP_XXX identifiers below are the valid types. +** +** The purpose of the pointer map is to facility moving pages from one +** position in the file to another as part of autovacuum. When a page +** is moved, the pointer in its parent must be updated to point to the +** new location. The pointer map is used to locate the parent page quickly. +** +** PTRMAP_ROOTPAGE: The database page is a root-page. The page-number is not +** used in this case. +** +** PTRMAP_FREEPAGE: The database page is an unused (free) page. The page-number +** is not used in this case. +** +** PTRMAP_OVERFLOW1: The database page is the first page in a list of +** overflow pages. The page number identifies the page that +** contains the cell with a pointer to this overflow page. +** +** PTRMAP_OVERFLOW2: The database page is the second or later page in a list of +** overflow pages. The page-number identifies the previous +** page in the overflow page list. +** +** PTRMAP_BTREE: The database page is a non-root btree page. The page number +** identifies the parent page in the btree. +*/ +#define PTRMAP_ROOTPAGE 1 +#define PTRMAP_FREEPAGE 2 +#define PTRMAP_OVERFLOW1 3 +#define PTRMAP_OVERFLOW2 4 +#define PTRMAP_BTREE 5 + +/* A bunch of assert() statements to check the transaction state variables +** of handle p (type Btree*) are internally consistent. +*/ +#define btreeIntegrity(p) \ + assert( p->pBt->inTransaction!=TRANS_NONE || p->pBt->nTransaction==0 ); \ + assert( p->pBt->inTransaction>=p->inTrans ); + + +/* +** The ISAUTOVACUUM macro is used within balance_nonroot() to determine +** if the database supports auto-vacuum or not. Because it is used +** within an expression that is an argument to another macro +** (sqliteMallocRaw), it is not possible to use conditional compilation. +** So, this macro is defined instead. +*/ +#ifndef SQLITE_OMIT_AUTOVACUUM +#define ISAUTOVACUUM (pBt->autoVacuum) +#else +#define ISAUTOVACUUM 0 +#endif + + +/* +** This structure is passed around through all the sanity checking routines +** in order to keep track of some global state information. +** +** The aRef[] array is allocated so that there is 1 bit for each page in +** the database. As the integrity-check proceeds, for each page used in +** the database the corresponding bit is set. This allows integrity-check to +** detect pages that are used twice and orphaned pages (both of which +** indicate corruption). +*/ +typedef struct IntegrityCk IntegrityCk; +struct IntegrityCk { + BtShared *pBt; /* The tree being checked out */ + Pager *pPager; /* The associated pager. Also accessible by pBt->pPager */ + u8 *aPgRef; /* 1 bit per page in the db (see above) */ + Pgno nPage; /* Number of pages in the database */ + int mxErr; /* Stop accumulating errors when this reaches zero */ + int nErr; /* Number of messages written to zErrMsg so far */ + int mallocFailed; /* A memory allocation error has occurred */ + const char *zPfx; /* Error message prefix */ + int v1, v2; /* Values for up to two %d fields in zPfx */ + StrAccum errMsg; /* Accumulate the error message text here */ + u32 *heap; /* Min-heap used for analyzing cell coverage */ +}; + +/* +** Routines to read or write a two- and four-byte big-endian integer values. +*/ +#define get2byte(x) ((x)[0]<<8 | (x)[1]) +#define put2byte(p,v) ((p)[0] = (u8)((v)>>8), (p)[1] = (u8)(v)) +#define get4byte sqlite3Get4byte +#define put4byte sqlite3Put4byte + +/* +** get2byteAligned(), unlike get2byte(), requires that its argument point to a +** two-byte aligned address. get2bytea() is only used for accessing the +** cell addresses in a btree header. +*/ +#if SQLITE_BYTEORDER==4321 +# define get2byteAligned(x) (*(u16*)(x)) +#elif SQLITE_BYTEORDER==1234 && !defined(SQLITE_DISABLE_INTRINSIC) \ + && GCC_VERSION>=4008000 +# define get2byteAligned(x) __builtin_bswap16(*(u16*)(x)) +#elif SQLITE_BYTEORDER==1234 && !defined(SQLITE_DISABLE_INTRINSIC) \ + && defined(_MSC_VER) && _MSC_VER>=1300 +# define get2byteAligned(x) _byteswap_ushort(*(u16*)(x)) +#else +# define get2byteAligned(x) ((x)[0]<<8 | (x)[1]) +#endif + +/************** End of btreeInt.h ********************************************/ +/************** Continuing where we left off in btmutex.c ********************/ +#ifndef SQLITE_OMIT_SHARED_CACHE +#if SQLITE_THREADSAFE + +/* +** Obtain the BtShared mutex associated with B-Tree handle p. Also, +** set BtShared.db to the database handle associated with p and the +** p->locked boolean to true. +*/ +static void lockBtreeMutex(Btree *p){ + assert( p->locked==0 ); + assert( sqlite3_mutex_notheld(p->pBt->mutex) ); + assert( sqlite3_mutex_held(p->db->mutex) ); + + sqlite3_mutex_enter(p->pBt->mutex); + p->pBt->db = p->db; + p->locked = 1; +} + +/* +** Release the BtShared mutex associated with B-Tree handle p and +** clear the p->locked boolean. +*/ +static void SQLITE_NOINLINE unlockBtreeMutex(Btree *p){ + BtShared *pBt = p->pBt; + assert( p->locked==1 ); + assert( sqlite3_mutex_held(pBt->mutex) ); + assert( sqlite3_mutex_held(p->db->mutex) ); + assert( p->db==pBt->db ); + + sqlite3_mutex_leave(pBt->mutex); + p->locked = 0; +} + +/* Forward reference */ +static void SQLITE_NOINLINE btreeLockCarefully(Btree *p); + +/* +** Enter a mutex on the given BTree object. +** +** If the object is not sharable, then no mutex is ever required +** and this routine is a no-op. The underlying mutex is non-recursive. +** But we keep a reference count in Btree.wantToLock so the behavior +** of this interface is recursive. +** +** To avoid deadlocks, multiple Btrees are locked in the same order +** by all database connections. The p->pNext is a list of other +** Btrees belonging to the same database connection as the p Btree +** which need to be locked after p. If we cannot get a lock on +** p, then first unlock all of the others on p->pNext, then wait +** for the lock to become available on p, then relock all of the +** subsequent Btrees that desire a lock. +*/ +SQLITE_PRIVATE void sqlite3BtreeEnter(Btree *p){ + /* Some basic sanity checking on the Btree. The list of Btrees + ** connected by pNext and pPrev should be in sorted order by + ** Btree.pBt value. All elements of the list should belong to + ** the same connection. Only shared Btrees are on the list. */ + assert( p->pNext==0 || p->pNext->pBt>p->pBt ); + assert( p->pPrev==0 || p->pPrev->pBtpBt ); + assert( p->pNext==0 || p->pNext->db==p->db ); + assert( p->pPrev==0 || p->pPrev->db==p->db ); + assert( p->sharable || (p->pNext==0 && p->pPrev==0) ); + + /* Check for locking consistency */ + assert( !p->locked || p->wantToLock>0 ); + assert( p->sharable || p->wantToLock==0 ); + + /* We should already hold a lock on the database connection */ + assert( sqlite3_mutex_held(p->db->mutex) ); + + /* Unless the database is sharable and unlocked, then BtShared.db + ** should already be set correctly. */ + assert( (p->locked==0 && p->sharable) || p->pBt->db==p->db ); + + if( !p->sharable ) return; + p->wantToLock++; + if( p->locked ) return; + btreeLockCarefully(p); +} + +/* This is a helper function for sqlite3BtreeLock(). By moving +** complex, but seldom used logic, out of sqlite3BtreeLock() and +** into this routine, we avoid unnecessary stack pointer changes +** and thus help the sqlite3BtreeLock() routine to run much faster +** in the common case. +*/ +static void SQLITE_NOINLINE btreeLockCarefully(Btree *p){ + Btree *pLater; + + /* In most cases, we should be able to acquire the lock we + ** want without having to go through the ascending lock + ** procedure that follows. Just be sure not to block. + */ + if( sqlite3_mutex_try(p->pBt->mutex)==SQLITE_OK ){ + p->pBt->db = p->db; + p->locked = 1; + return; + } + + /* To avoid deadlock, first release all locks with a larger + ** BtShared address. Then acquire our lock. Then reacquire + ** the other BtShared locks that we used to hold in ascending + ** order. + */ + for(pLater=p->pNext; pLater; pLater=pLater->pNext){ + assert( pLater->sharable ); + assert( pLater->pNext==0 || pLater->pNext->pBt>pLater->pBt ); + assert( !pLater->locked || pLater->wantToLock>0 ); + if( pLater->locked ){ + unlockBtreeMutex(pLater); + } + } + lockBtreeMutex(p); + for(pLater=p->pNext; pLater; pLater=pLater->pNext){ + if( pLater->wantToLock ){ + lockBtreeMutex(pLater); + } + } +} + + +/* +** Exit the recursive mutex on a Btree. +*/ +SQLITE_PRIVATE void sqlite3BtreeLeave(Btree *p){ + assert( sqlite3_mutex_held(p->db->mutex) ); + if( p->sharable ){ + assert( p->wantToLock>0 ); + p->wantToLock--; + if( p->wantToLock==0 ){ + unlockBtreeMutex(p); + } + } +} + +#ifndef NDEBUG +/* +** Return true if the BtShared mutex is held on the btree, or if the +** B-Tree is not marked as sharable. +** +** This routine is used only from within assert() statements. +*/ +SQLITE_PRIVATE int sqlite3BtreeHoldsMutex(Btree *p){ + assert( p->sharable==0 || p->locked==0 || p->wantToLock>0 ); + assert( p->sharable==0 || p->locked==0 || p->db==p->pBt->db ); + assert( p->sharable==0 || p->locked==0 || sqlite3_mutex_held(p->pBt->mutex) ); + assert( p->sharable==0 || p->locked==0 || sqlite3_mutex_held(p->db->mutex) ); + + return (p->sharable==0 || p->locked); +} +#endif + + +/* +** Enter the mutex on every Btree associated with a database +** connection. This is needed (for example) prior to parsing +** a statement since we will be comparing table and column names +** against all schemas and we do not want those schemas being +** reset out from under us. +** +** There is a corresponding leave-all procedures. +** +** Enter the mutexes in accending order by BtShared pointer address +** to avoid the possibility of deadlock when two threads with +** two or more btrees in common both try to lock all their btrees +** at the same instant. +*/ +SQLITE_PRIVATE void sqlite3BtreeEnterAll(sqlite3 *db){ + int i; + Btree *p; + assert( sqlite3_mutex_held(db->mutex) ); + for(i=0; inDb; i++){ + p = db->aDb[i].pBt; + if( p ) sqlite3BtreeEnter(p); + } +} +SQLITE_PRIVATE void sqlite3BtreeLeaveAll(sqlite3 *db){ + int i; + Btree *p; + assert( sqlite3_mutex_held(db->mutex) ); + for(i=0; inDb; i++){ + p = db->aDb[i].pBt; + if( p ) sqlite3BtreeLeave(p); + } +} + +#ifndef NDEBUG +/* +** Return true if the current thread holds the database connection +** mutex and all required BtShared mutexes. +** +** This routine is used inside assert() statements only. +*/ +SQLITE_PRIVATE int sqlite3BtreeHoldsAllMutexes(sqlite3 *db){ + int i; + if( !sqlite3_mutex_held(db->mutex) ){ + return 0; + } + for(i=0; inDb; i++){ + Btree *p; + p = db->aDb[i].pBt; + if( p && p->sharable && + (p->wantToLock==0 || !sqlite3_mutex_held(p->pBt->mutex)) ){ + return 0; + } + } + return 1; +} +#endif /* NDEBUG */ + +#ifndef NDEBUG +/* +** Return true if the correct mutexes are held for accessing the +** db->aDb[iDb].pSchema structure. The mutexes required for schema +** access are: +** +** (1) The mutex on db +** (2) if iDb!=1, then the mutex on db->aDb[iDb].pBt. +** +** If pSchema is not NULL, then iDb is computed from pSchema and +** db using sqlite3SchemaToIndex(). +*/ +SQLITE_PRIVATE int sqlite3SchemaMutexHeld(sqlite3 *db, int iDb, Schema *pSchema){ + Btree *p; + assert( db!=0 ); + if( pSchema ) iDb = sqlite3SchemaToIndex(db, pSchema); + assert( iDb>=0 && iDbnDb ); + if( !sqlite3_mutex_held(db->mutex) ) return 0; + if( iDb==1 ) return 1; + p = db->aDb[iDb].pBt; + assert( p!=0 ); + return p->sharable==0 || p->locked==1; +} +#endif /* NDEBUG */ + +#else /* SQLITE_THREADSAFE>0 above. SQLITE_THREADSAFE==0 below */ +/* +** The following are special cases for mutex enter routines for use +** in single threaded applications that use shared cache. Except for +** these two routines, all mutex operations are no-ops in that case and +** are null #defines in btree.h. +** +** If shared cache is disabled, then all btree mutex routines, including +** the ones below, are no-ops and are null #defines in btree.h. +*/ + +SQLITE_PRIVATE void sqlite3BtreeEnter(Btree *p){ + p->pBt->db = p->db; +} +SQLITE_PRIVATE void sqlite3BtreeEnterAll(sqlite3 *db){ + int i; + for(i=0; inDb; i++){ + Btree *p = db->aDb[i].pBt; + if( p ){ + p->pBt->db = p->db; + } + } +} +#endif /* if SQLITE_THREADSAFE */ + +#ifndef SQLITE_OMIT_INCRBLOB +/* +** Enter a mutex on a Btree given a cursor owned by that Btree. +** +** These entry points are used by incremental I/O only. Enter() is required +** any time OMIT_SHARED_CACHE is not defined, regardless of whether or not +** the build is threadsafe. Leave() is only required by threadsafe builds. +*/ +SQLITE_PRIVATE void sqlite3BtreeEnterCursor(BtCursor *pCur){ + sqlite3BtreeEnter(pCur->pBtree); +} +# if SQLITE_THREADSAFE +SQLITE_PRIVATE void sqlite3BtreeLeaveCursor(BtCursor *pCur){ + sqlite3BtreeLeave(pCur->pBtree); +} +# endif +#endif /* ifndef SQLITE_OMIT_INCRBLOB */ + +#endif /* ifndef SQLITE_OMIT_SHARED_CACHE */ + +/************** End of btmutex.c *********************************************/ +/************** Begin file btree.c *******************************************/ +/* +** 2004 April 6 +** +** 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 implements an 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. +*/ +/* #include "btreeInt.h" */ + +/* +** The header string that appears at the beginning of every +** SQLite database. +*/ +static const char zMagicHeader[] = SQLITE_FILE_HEADER; + +/* +** Set this global variable to 1 to enable tracing using the TRACE +** macro. +*/ +#if 0 +int sqlite3BtreeTrace=1; /* True to enable tracing */ +# define TRACE(X) if(sqlite3BtreeTrace){printf X;fflush(stdout);} +#else +# define TRACE(X) +#endif + +/* +** Extract a 2-byte big-endian integer from an array of unsigned bytes. +** But if the value is zero, make it 65536. +** +** This routine is used to extract the "offset to cell content area" value +** from the header of a btree page. If the page size is 65536 and the page +** is empty, the offset should be 65536, but the 2-byte value stores zero. +** This routine makes the necessary adjustment to 65536. +*/ +#define get2byteNotZero(X) (((((int)get2byte(X))-1)&0xffff)+1) + +/* +** Values passed as the 5th argument to allocateBtreePage() +*/ +#define BTALLOC_ANY 0 /* Allocate any page */ +#define BTALLOC_EXACT 1 /* Allocate exact page if possible */ +#define BTALLOC_LE 2 /* Allocate any page <= the parameter */ + +/* +** Macro IfNotOmitAV(x) returns (x) if SQLITE_OMIT_AUTOVACUUM is not +** defined, or 0 if it is. For example: +** +** bIncrVacuum = IfNotOmitAV(pBtShared->incrVacuum); +*/ +#ifndef SQLITE_OMIT_AUTOVACUUM +#define IfNotOmitAV(expr) (expr) +#else +#define IfNotOmitAV(expr) 0 +#endif + +#ifndef SQLITE_OMIT_SHARED_CACHE +/* +** A list of BtShared objects that are eligible for participation +** in shared cache. This variable has file scope during normal builds, +** but the test harness needs to access it so we make it global for +** test builds. +** +** Access to this variable is protected by SQLITE_MUTEX_STATIC_MASTER. +*/ +#ifdef SQLITE_TEST +SQLITE_PRIVATE BtShared *SQLITE_WSD sqlite3SharedCacheList = 0; +#else +static BtShared *SQLITE_WSD sqlite3SharedCacheList = 0; +#endif +#endif /* SQLITE_OMIT_SHARED_CACHE */ + +#ifndef SQLITE_OMIT_SHARED_CACHE +/* +** Enable or disable the shared pager and schema features. +** +** This routine has no effect on existing database connections. +** The shared cache setting effects only future calls to +** sqlite3_open(), sqlite3_open16(), or sqlite3_open_v2(). +*/ +SQLITE_API int sqlite3_enable_shared_cache(int enable){ + sqlite3GlobalConfig.sharedCacheEnabled = enable; + return SQLITE_OK; +} +#endif + + + +#ifdef SQLITE_OMIT_SHARED_CACHE + /* + ** The functions querySharedCacheTableLock(), setSharedCacheTableLock(), + ** and clearAllSharedCacheTableLocks() + ** manipulate entries in the BtShared.pLock linked list used to store + ** shared-cache table level locks. If the library is compiled with the + ** shared-cache feature disabled, then there is only ever one user + ** of each BtShared structure and so this locking is not necessary. + ** So define the lock related functions as no-ops. + */ + #define querySharedCacheTableLock(a,b,c) SQLITE_OK + #define setSharedCacheTableLock(a,b,c) SQLITE_OK + #define clearAllSharedCacheTableLocks(a) + #define downgradeAllSharedCacheTableLocks(a) + #define hasSharedCacheTableLock(a,b,c,d) 1 + #define hasReadConflicts(a, b) 0 +#endif + +#ifndef SQLITE_OMIT_SHARED_CACHE + +#ifdef SQLITE_DEBUG +/* +**** 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 that resides in a sharable database, the +** caller should have first obtained a lock specifying the root page of +** 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 table/index rooted at page iRoot, the caller may +** hold a write-lock on the schema table (root page 1). This is also +** acceptable. +*/ +static int hasSharedCacheTableLock( + Btree *pBtree, /* Handle that must hold lock */ + Pgno iRoot, /* Root page of b-tree */ + int isIndex, /* True if iRoot is the root of an index b-tree */ + int eLockType /* Required lock type (READ_LOCK or WRITE_LOCK) */ +){ + Schema *pSchema = (Schema *)pBtree->pBt->pSchema; + Pgno iTab = 0; + BtLock *pLock; + + /* If this database is not shareable, or if the client is reading + ** and has the read-uncommitted flag set, then no lock is required. + ** Return true immediately. + */ + if( (pBtree->sharable==0) + || (eLockType==READ_LOCK && (pBtree->db->flags & SQLITE_ReadUncommitted)) + ){ + 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->schemaFlags&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 + ** table. */ + if( isIndex ){ + HashElem *p; + for(p=sqliteHashFirst(&pSchema->idxHash); p; p=sqliteHashNext(p)){ + Index *pIdx = (Index *)sqliteHashData(p); + if( pIdx->tnum==(int)iRoot ){ + if( iTab ){ + /* Two or more indexes share the same root page. There must + ** be imposter tables. So just return true. The assert is not + ** useful in that case. */ + return 1; + } + iTab = pIdx->pTable->tnum; + } + } + }else{ + iTab = iRoot; + } + + /* Search for the required lock. Either a write-lock on root-page iTab, a + ** write-lock on the schema table, or (if the client is reading) a + ** read-lock on iTab will suffice. Return 1 if any of these are found. */ + for(pLock=pBtree->pBt->pLock; pLock; pLock=pLock->pNext){ + if( pLock->pBtree==pBtree + && (pLock->iTable==iTab || (pLock->eLock==WRITE_LOCK && pLock->iTable==1)) + && pLock->eLock>=eLockType + ){ + return 1; + } + } + + /* Failed to find the required lock. */ + return 0; +} +#endif /* SQLITE_DEBUG */ + +#ifdef SQLITE_DEBUG +/* +**** 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. +** +** 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) ); +*/ +static int hasReadConflicts(Btree *pBtree, Pgno iRoot){ + BtCursor *p; + for(p=pBtree->pBt->pCursor; p; p=p->pNext){ + if( p->pgnoRoot==iRoot + && p->pBtree!=pBtree + && 0==(p->pBtree->db->flags & SQLITE_ReadUncommitted) + ){ + return 1; + } + } + return 0; +} +#endif /* #ifdef SQLITE_DEBUG */ + +/* +** 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. +*/ +static int querySharedCacheTableLock(Btree *p, Pgno iTab, u8 eLock){ + BtShared *pBt = p->pBt; + BtLock *pIter; + + assert( sqlite3BtreeHoldsMutex(p) ); + assert( eLock==READ_LOCK || eLock==WRITE_LOCK ); + assert( p->db!=0 ); + assert( !(p->db->flags&SQLITE_ReadUncommitted)||eLock==WRITE_LOCK||iTab==1 ); + + /* If requesting a write-lock, then the Btree must have an open write + ** transaction on this file. And, obviously, for this to be so there + ** must be an open write transaction on the file itself. + */ + assert( eLock==READ_LOCK || (p==pBt->pWriter && p->inTrans==TRANS_WRITE) ); + assert( eLock==READ_LOCK || pBt->inTransaction==TRANS_WRITE ); + + /* This routine is a no-op if the shared-cache is not enabled */ + if( !p->sharable ){ + return SQLITE_OK; + } + + /* If some other connection is holding an exclusive lock, the + ** requested lock may not be obtained. + */ + if( pBt->pWriter!=p && (pBt->btsFlags & BTS_EXCLUSIVE)!=0 ){ + sqlite3ConnectionBlocked(p->db, pBt->pWriter->db); + return SQLITE_LOCKED_SHAREDCACHE; + } + + for(pIter=pBt->pLock; pIter; pIter=pIter->pNext){ + /* The condition (pIter->eLock!=eLock) in the following if(...) + ** statement is a simplification of: + ** + ** (eLock==WRITE_LOCK || pIter->eLock==WRITE_LOCK) + ** + ** since we know that if eLock==WRITE_LOCK, then no other connection + ** may hold a WRITE_LOCK on any table in this file (since there can + ** only be a single writer). + */ + assert( pIter->eLock==READ_LOCK || pIter->eLock==WRITE_LOCK ); + assert( eLock==READ_LOCK || pIter->pBtree==p || pIter->eLock==READ_LOCK); + if( pIter->pBtree!=p && pIter->iTable==iTab && pIter->eLock!=eLock ){ + sqlite3ConnectionBlocked(p->db, pIter->pBtree->db); + if( eLock==WRITE_LOCK ){ + assert( p==pBt->pWriter ); + pBt->btsFlags |= BTS_PENDING; + } + return SQLITE_LOCKED_SHAREDCACHE; + } + } + return SQLITE_OK; +} +#endif /* !SQLITE_OMIT_SHARED_CACHE */ + +#ifndef SQLITE_OMIT_SHARED_CACHE +/* +** Add a lock on the table with root-page iTable to the shared-btree used +** by Btree handle p. Parameter eLock must be either READ_LOCK or +** WRITE_LOCK. +** +** This function assumes the following: +** +** (a) The specified Btree object p is connected to a sharable +** database (one with the BtShared.sharable flag set), and +** +** (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). +** +** SQLITE_OK is returned if the lock is added successfully. SQLITE_NOMEM +** is returned if a malloc attempt fails. +*/ +static int setSharedCacheTableLock(Btree *p, Pgno iTable, u8 eLock){ + BtShared *pBt = p->pBt; + BtLock *pLock = 0; + BtLock *pIter; + + assert( sqlite3BtreeHoldsMutex(p) ); + assert( eLock==READ_LOCK || eLock==WRITE_LOCK ); + assert( p->db!=0 ); + + /* A connection with the read-uncommitted flag set will never try to + ** obtain a read-lock using this function. The only read-lock obtained + ** by a connection in read-uncommitted mode is on the sqlite_master + ** table, and that lock is obtained in BtreeBeginTrans(). */ + assert( 0==(p->db->flags&SQLITE_ReadUncommitted) || eLock==WRITE_LOCK ); + + /* This function should only be called on a sharable b-tree after it + ** has been determined that no other b-tree holds a conflicting lock. */ + assert( p->sharable ); + assert( SQLITE_OK==querySharedCacheTableLock(p, iTable, eLock) ); + + /* First search the list for an existing lock on this table. */ + for(pIter=pBt->pLock; pIter; pIter=pIter->pNext){ + if( pIter->iTable==iTable && pIter->pBtree==p ){ + pLock = pIter; + break; + } + } + + /* If the above search did not find a BtLock struct associating Btree p + ** with table iTable, allocate one and link it into the list. + */ + if( !pLock ){ + pLock = (BtLock *)sqlite3MallocZero(sizeof(BtLock)); + if( !pLock ){ + return SQLITE_NOMEM_BKPT; + } + pLock->iTable = iTable; + pLock->pBtree = p; + pLock->pNext = pBt->pLock; + pBt->pLock = pLock; + } + + /* Set the BtLock.eLock variable to the maximum of the current lock + ** and the requested lock. This means if a write-lock was already held + ** and a read-lock requested, we don't incorrectly downgrade the lock. + */ + assert( WRITE_LOCK>READ_LOCK ); + if( eLock>pLock->eLock ){ + pLock->eLock = eLock; + } + + return SQLITE_OK; +} +#endif /* !SQLITE_OMIT_SHARED_CACHE */ + +#ifndef SQLITE_OMIT_SHARED_CACHE +/* +** Release all the table locks (locks obtained via calls to +** the setSharedCacheTableLock() procedure) held by Btree object p. +** +** This function assumes that Btree p has an open read or write +** transaction. If it does not, then the BTS_PENDING flag +** may be incorrectly cleared. +*/ +static void clearAllSharedCacheTableLocks(Btree *p){ + BtShared *pBt = p->pBt; + BtLock **ppIter = &pBt->pLock; + + assert( sqlite3BtreeHoldsMutex(p) ); + assert( p->sharable || 0==*ppIter ); + assert( p->inTrans>0 ); + + while( *ppIter ){ + BtLock *pLock = *ppIter; + assert( (pBt->btsFlags & BTS_EXCLUSIVE)==0 || pBt->pWriter==pLock->pBtree ); + assert( pLock->pBtree->inTrans>=pLock->eLock ); + if( pLock->pBtree==p ){ + *ppIter = pLock->pNext; + assert( pLock->iTable!=1 || pLock==&p->lock ); + if( pLock->iTable!=1 ){ + sqlite3_free(pLock); + } + }else{ + ppIter = &pLock->pNext; + } + } + + assert( (pBt->btsFlags & BTS_PENDING)==0 || pBt->pWriter ); + if( pBt->pWriter==p ){ + pBt->pWriter = 0; + pBt->btsFlags &= ~(BTS_EXCLUSIVE|BTS_PENDING); + }else if( pBt->nTransaction==2 ){ + /* 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 + ** set the BTS_PENDING flag to 0. + ** + ** If there is not currently a writer, then BTS_PENDING must + ** be zero already. So this next line is harmless in that case. + */ + pBt->btsFlags &= ~BTS_PENDING; + } +} + +/* +** This function changes all write-locks held by Btree p into read-locks. +*/ +static void downgradeAllSharedCacheTableLocks(Btree *p){ + BtShared *pBt = p->pBt; + if( pBt->pWriter==p ){ + BtLock *pLock; + pBt->pWriter = 0; + pBt->btsFlags &= ~(BTS_EXCLUSIVE|BTS_PENDING); + for(pLock=pBt->pLock; pLock; pLock=pLock->pNext){ + assert( pLock->eLock==READ_LOCK || pLock->pBtree==p ); + pLock->eLock = READ_LOCK; + } + } +} + +#endif /* SQLITE_OMIT_SHARED_CACHE */ + +static void releasePage(MemPage *pPage); /* Forward reference */ + +/* +***** This routine is used inside of assert() only **** +** +** Verify that the cursor holds the mutex on its BtShared +*/ +#ifdef SQLITE_DEBUG +static int cursorHoldsMutex(BtCursor *p){ + return sqlite3_mutex_held(p->pBt->mutex); +} + +/* Verify that the cursor and the BtShared agree about what is the current +** database connetion. This is important in shared-cache mode. If the database +** connection pointers get out-of-sync, it is possible for routines like +** btreeInitPage() to reference an stale connection pointer that references a +** a connection that has already closed. This routine is used inside assert() +** statements only and for the purpose of double-checking that the btree code +** does keep the database connection pointers up-to-date. +*/ +static int cursorOwnsBtShared(BtCursor *p){ + assert( cursorHoldsMutex(p) ); + return (p->pBtree->db==p->pBt->db); +} +#endif + +/* +** Invalidate the overflow cache of the cursor passed as the first argument. +** on the shared btree structure pBt. +*/ +#define invalidateOverflowCache(pCur) (pCur->curFlags &= ~BTCF_ValidOvfl) + +/* +** Invalidate the overflow page-list cache for all cursors opened +** on the shared btree structure pBt. +*/ +static void invalidateAllOverflowCache(BtShared *pBt){ + BtCursor *p; + assert( sqlite3_mutex_held(pBt->mutex) ); + for(p=pBt->pCursor; p; p=p->pNext){ + invalidateOverflowCache(p); + } +} + +#ifndef SQLITE_OMIT_INCRBLOB +/* +** This function is called before modifying the contents of a table +** 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 +** table is about to be deleted. In this case invalidate all incrblob +** cursors open on any row within the table with root-page pgnoRoot. +** +** 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 that specific row. +*/ +static void invalidateIncrblobCursors( + Btree *pBtree, /* The database file to check */ + i64 iRow, /* The rowid that might be changing */ + int isClearTable /* True if all rows are being deleted */ +){ + BtCursor *p; + if( pBtree->hasIncrblobCur==0 ) return; + assert( sqlite3BtreeHoldsMutex(pBtree) ); + pBtree->hasIncrblobCur = 0; + for(p=pBtree->pBt->pCursor; p; p=p->pNext){ + if( (p->curFlags & BTCF_Incrblob)!=0 ){ + pBtree->hasIncrblobCur = 1; + if( isClearTable || p->info.nKey==iRow ){ + p->eState = CURSOR_INVALID; + } + } + } +} + +#else + /* Stub function when INCRBLOB is omitted */ + #define invalidateIncrblobCursors(x,y,z) +#endif /* SQLITE_OMIT_INCRBLOB */ + +/* +** Set bit pgno of the BtShared.pHasContent bitvec. This is called +** when a page that previously contained data becomes a free-list leaf +** page. +** +** The BtShared.pHasContent bitvec exists to work around an obscure +** bug caused by the interaction of two useful IO optimizations surrounding +** free-list leaf pages: +** +** 1) When all data is deleted from a page and the page becomes +** a free-list leaf page, the page is not written to the database +** (as free-list leaf pages contain no meaningful data). Sometimes +** such a page is not even journalled (as it will not be modified, +** why bother journalling it?). +** +** 2) When a free-list leaf page is reused, its content is not read +** from the database or written to the journal file (why should it +** be, if it is not at all meaningful?). +** +** By themselves, these optimizations work fine and provide a handy +** performance boost to bulk delete or insert operations. However, if +** a page is moved to the free-list and then reused within the same +** transaction, a problem comes up. If the page is not journalled when +** it is moved to the free-list and it is also not journalled when it +** is extracted from the free-list and reused, then the original data +** may be lost. In the event of a rollback, it may not be possible +** to restore the database to its original configuration. +** +** 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 omitted if the corresponding bit is already +** set in BtShared.pHasContent. The contents of the bitvec are cleared +** at the end of every transaction. +*/ +static int btreeSetHasContent(BtShared *pBt, Pgno pgno){ + int rc = SQLITE_OK; + if( !pBt->pHasContent ){ + assert( pgno<=pBt->nPage ); + pBt->pHasContent = sqlite3BitvecCreate(pBt->nPage); + if( !pBt->pHasContent ){ + rc = SQLITE_NOMEM_BKPT; + } + } + if( rc==SQLITE_OK && pgno<=sqlite3BitvecSize(pBt->pHasContent) ){ + rc = sqlite3BitvecSet(pBt->pHasContent, pgno); + } + return rc; +} + +/* +** Query the BtShared.pHasContent vector. +** +** This function is called when a free-list leaf page is removed from the +** free-list for reuse. It returns false if it is safe to retrieve the +** page from the pager layer with the 'no-content' flag set. True otherwise. +*/ +static int btreeGetHasContent(BtShared *pBt, Pgno pgno){ + Bitvec *p = pBt->pHasContent; + return (p && (pgno>sqlite3BitvecSize(p) || sqlite3BitvecTest(p, pgno))); +} + +/* +** Clear (destroy) the BtShared.pHasContent bitvec. This should be +** invoked at the conclusion of each write-transaction. +*/ +static void btreeClearHasContent(BtShared *pBt){ + sqlite3BitvecDestroy(pBt->pHasContent); + pBt->pHasContent = 0; +} + +/* +** Release all of the apPage[] pages for a cursor. +*/ +static void btreeReleaseAllCursorPages(BtCursor *pCur){ + int i; + for(i=0; i<=pCur->iPage; i++){ + releasePage(pCur->apPage[i]); + pCur->apPage[i] = 0; + } + pCur->iPage = -1; +} + +/* +** The cursor passed as the only argument must point to a valid entry +** when this function is called (i.e. have eState==CURSOR_VALID). This +** function saves the current cursor key in variables pCur->nKey and +** pCur->pKey. SQLITE_OK is returned if successful or an SQLite error +** code otherwise. +** +** If the cursor is open on an intkey table, then the integer key +** (the rowid) is stored in pCur->nKey and pCur->pKey is left set to +** NULL. If the cursor is open on a non-intkey table, then pCur->pKey is +** set to point to a malloced buffer pCur->nKey bytes in size containing +** the key. +*/ +static int saveCursorKey(BtCursor *pCur){ + int rc = SQLITE_OK; + assert( CURSOR_VALID==pCur->eState ); + assert( 0==pCur->pKey ); + assert( cursorHoldsMutex(pCur) ); + + if( pCur->curIntKey ){ + /* Only the rowid is required for a table btree */ + pCur->nKey = sqlite3BtreeIntegerKey(pCur); + }else{ + /* For an index btree, save the complete key content */ + void *pKey; + pCur->nKey = sqlite3BtreePayloadSize(pCur); + pKey = sqlite3Malloc( pCur->nKey ); + if( pKey ){ + rc = sqlite3BtreeKey(pCur, 0, (int)pCur->nKey, pKey); + if( rc==SQLITE_OK ){ + pCur->pKey = pKey; + }else{ + sqlite3_free(pKey); + } + }else{ + rc = SQLITE_NOMEM_BKPT; + } + } + assert( !pCur->curIntKey || !pCur->pKey ); + return rc; +} + +/* +** Save the current cursor position in the variables BtCursor.nKey +** and BtCursor.pKey. The cursor's state is set to CURSOR_REQUIRESEEK. +** +** The caller must ensure that the cursor is valid (has eState==CURSOR_VALID) +** prior to calling this routine. +*/ +static int saveCursorPosition(BtCursor *pCur){ + int rc; + + assert( CURSOR_VALID==pCur->eState || CURSOR_SKIPNEXT==pCur->eState ); + assert( 0==pCur->pKey ); + assert( cursorHoldsMutex(pCur) ); + + if( pCur->eState==CURSOR_SKIPNEXT ){ + pCur->eState = CURSOR_VALID; + }else{ + pCur->skipNext = 0; + } + + rc = saveCursorKey(pCur); + if( rc==SQLITE_OK ){ + btreeReleaseAllCursorPages(pCur); + pCur->eState = CURSOR_REQUIRESEEK; + } + + pCur->curFlags &= ~(BTCF_ValidNKey|BTCF_ValidOvfl|BTCF_AtLast); + return rc; +} + +/* Forward reference */ +static int SQLITE_NOINLINE saveCursorsOnList(BtCursor*,Pgno,BtCursor*); + +/* +** Save the positions of all cursors (except pExcept) that are open on +** the table with root-page iRoot. "Saving the cursor position" means that +** the location in the btree is remembered in such a way that it can be +** moved back to the same spot after the btree has been modified. This +** routine is called just before cursor pExcept is used to modify the +** table, for example in BtreeDelete() or BtreeInsert(). +** +** If there are two or more cursors on the same btree, then all such +** cursors should have their BTCF_Multiple flag set. The btreeCursor() +** routine enforces that rule. This routine only needs to be called in +** the uncommon case when pExpect has the BTCF_Multiple flag set. +** +** If pExpect!=NULL and if no other cursors are found on the same root-page, +** then the BTCF_Multiple flag on pExpect is cleared, to avoid another +** pointless call to this routine. +** +** Implementation note: This routine merely checks to see if any cursors +** need to be saved. It calls out to saveCursorsOnList() in the (unusual) +** event that cursors are in need to being saved. +*/ +static int saveAllCursors(BtShared *pBt, Pgno iRoot, BtCursor *pExcept){ + BtCursor *p; + assert( sqlite3_mutex_held(pBt->mutex) ); + assert( pExcept==0 || pExcept->pBt==pBt ); + for(p=pBt->pCursor; p; p=p->pNext){ + if( p!=pExcept && (0==iRoot || p->pgnoRoot==iRoot) ) break; + } + if( p ) return saveCursorsOnList(p, iRoot, pExcept); + if( pExcept ) pExcept->curFlags &= ~BTCF_Multiple; + return SQLITE_OK; +} + +/* This helper routine to saveAllCursors does the actual work of saving +** the cursors if and when a cursor is found that actually requires saving. +** The common case is that no cursors need to be saved, so this routine is +** broken out from its caller to avoid unnecessary stack pointer movement. +*/ +static int SQLITE_NOINLINE saveCursorsOnList( + BtCursor *p, /* The first cursor that needs saving */ + Pgno iRoot, /* Only save cursor with this iRoot. Save all if zero */ + BtCursor *pExcept /* Do not save this cursor */ +){ + do{ + if( p!=pExcept && (0==iRoot || p->pgnoRoot==iRoot) ){ + if( p->eState==CURSOR_VALID || p->eState==CURSOR_SKIPNEXT ){ + int rc = saveCursorPosition(p); + if( SQLITE_OK!=rc ){ + return rc; + } + }else{ + testcase( p->iPage>0 ); + btreeReleaseAllCursorPages(p); + } + } + p = p->pNext; + }while( p ); + return SQLITE_OK; +} + +/* +** Clear the current cursor position. +*/ +SQLITE_PRIVATE void sqlite3BtreeClearCursor(BtCursor *pCur){ + assert( cursorHoldsMutex(pCur) ); + sqlite3_free(pCur->pKey); + pCur->pKey = 0; + pCur->eState = CURSOR_INVALID; +} + +/* +** In this version of BtreeMoveto, pKey is a packed index record +** such as is generated by the OP_MakeRecord opcode. Unpack the +** record and then call BtreeMovetoUnpacked() to do the work. +*/ +static int btreeMoveto( + BtCursor *pCur, /* Cursor open on the btree to be searched */ + const void *pKey, /* Packed key if the btree is an index */ + i64 nKey, /* Integer key for tables. Size of pKey for indices */ + int bias, /* Bias search to the high end */ + int *pRes /* Write search results here */ +){ + int rc; /* Status code */ + UnpackedRecord *pIdxKey; /* Unpacked index key */ + char aSpace[384]; /* Temp space for pIdxKey - to avoid a malloc */ + char *pFree = 0; + + if( pKey ){ + assert( nKey==(i64)(int)nKey ); + pIdxKey = sqlite3VdbeAllocUnpackedRecord( + pCur->pKeyInfo, aSpace, sizeof(aSpace), &pFree + ); + if( pIdxKey==0 ) return SQLITE_NOMEM_BKPT; + sqlite3VdbeRecordUnpack(pCur->pKeyInfo, (int)nKey, pKey, pIdxKey); + if( pIdxKey->nField==0 ){ + sqlite3DbFree(pCur->pKeyInfo->db, pFree); + return SQLITE_CORRUPT_BKPT; + } + }else{ + pIdxKey = 0; + } + rc = sqlite3BtreeMovetoUnpacked(pCur, pIdxKey, nKey, bias, pRes); + if( pFree ){ + sqlite3DbFree(pCur->pKeyInfo->db, pFree); + } + return rc; +} + +/* +** Restore the cursor to the position it was in (or as close to as possible) +** when saveCursorPosition() was called. Note that this call deletes the +** saved position info stored by saveCursorPosition(), so there can be +** at most one effective restoreCursorPosition() call after each +** saveCursorPosition(). +*/ +static int btreeRestoreCursorPosition(BtCursor *pCur){ + int rc; + int skipNext; + assert( cursorOwnsBtShared(pCur) ); + assert( pCur->eState>=CURSOR_REQUIRESEEK ); + if( pCur->eState==CURSOR_FAULT ){ + return pCur->skipNext; + } + pCur->eState = CURSOR_INVALID; + rc = btreeMoveto(pCur, pCur->pKey, pCur->nKey, 0, &skipNext); + if( rc==SQLITE_OK ){ + sqlite3_free(pCur->pKey); + pCur->pKey = 0; + assert( pCur->eState==CURSOR_VALID || pCur->eState==CURSOR_INVALID ); + pCur->skipNext |= skipNext; + if( pCur->skipNext && pCur->eState==CURSOR_VALID ){ + pCur->eState = CURSOR_SKIPNEXT; + } + } + return rc; +} + +#define restoreCursorPosition(p) \ + (p->eState>=CURSOR_REQUIRESEEK ? \ + btreeRestoreCursorPosition(p) : \ + SQLITE_OK) + +/* +** Determine whether or not a cursor has moved from the position where +** it was last placed, or has been invalidated for any other reason. +** Cursors can move when the row they are pointing at is deleted out +** from under them, for example. Cursor might also move if a btree +** is rebalanced. +** +** Calling this routine with a NULL cursor pointer returns false. +** +** Use the separate sqlite3BtreeCursorRestore() routine to restore a cursor +** back to where it ought to be if this routine returns true. +*/ +SQLITE_PRIVATE int sqlite3BtreeCursorHasMoved(BtCursor *pCur){ + return pCur->eState!=CURSOR_VALID; +} + +/* +** This routine restores a cursor back to its original position after it +** has been moved by some outside activity (such as a btree rebalance or +** a row having been deleted out from under the cursor). +** +** On success, the *pDifferentRow parameter is false if the cursor is left +** pointing at exactly the same row. *pDifferntRow is the row the cursor +** was pointing to has been deleted, forcing the cursor to point to some +** nearby row. +** +** This routine should only be called for a cursor that just returned +** TRUE from sqlite3BtreeCursorHasMoved(). +*/ +SQLITE_PRIVATE int sqlite3BtreeCursorRestore(BtCursor *pCur, int *pDifferentRow){ + int rc; + + assert( pCur!=0 ); + assert( pCur->eState!=CURSOR_VALID ); + rc = restoreCursorPosition(pCur); + if( rc ){ + *pDifferentRow = 1; + return rc; + } + if( pCur->eState!=CURSOR_VALID ){ + *pDifferentRow = 1; + }else{ + assert( pCur->skipNext==0 ); + *pDifferentRow = 0; + } + return SQLITE_OK; +} + +#ifdef SQLITE_ENABLE_CURSOR_HINTS +/* +** Provide hints to the cursor. The particular hint given (and the type +** and number of the varargs parameters) is determined by the eHintType +** parameter. See the definitions of the BTREE_HINT_* macros for details. +*/ +SQLITE_PRIVATE void sqlite3BtreeCursorHint(BtCursor *pCur, int eHintType, ...){ + /* Used only by system that substitute their own storage engine */ +} +#endif + +/* +** Provide flag hints to the cursor. +*/ +SQLITE_PRIVATE void sqlite3BtreeCursorHintFlags(BtCursor *pCur, unsigned x){ + assert( x==BTREE_SEEK_EQ || x==BTREE_BULKLOAD || x==0 ); + pCur->hints = x; +} + + +#ifndef SQLITE_OMIT_AUTOVACUUM +/* +** Given a page number of a regular database page, return the page +** number for the pointer-map page that contains the entry for the +** input page number. +** +** Return 0 (not a valid page) for pgno==1 since there is +** no pointer map associated with page 1. The integrity_check logic +** requires that ptrmapPageno(*,1)!=1. +*/ +static Pgno ptrmapPageno(BtShared *pBt, Pgno pgno){ + int nPagesPerMapPage; + Pgno iPtrMap, ret; + assert( sqlite3_mutex_held(pBt->mutex) ); + if( pgno<2 ) return 0; + nPagesPerMapPage = (pBt->usableSize/5)+1; + iPtrMap = (pgno-2)/nPagesPerMapPage; + ret = (iPtrMap*nPagesPerMapPage) + 2; + if( ret==PENDING_BYTE_PAGE(pBt) ){ + ret++; + } + return ret; +} + +/* +** Write an entry into the pointer map. +** +** This routine updates the pointer map entry for page number 'key' +** so that it maps to type 'eType' and parent page number 'pgno'. +** +** If *pRC is initially non-zero (non-SQLITE_OK) then this routine is +** a no-op. If an error occurs, the appropriate error code is written +** into *pRC. +*/ +static void ptrmapPut(BtShared *pBt, Pgno key, u8 eType, Pgno parent, int *pRC){ + DbPage *pDbPage; /* The pointer map page */ + u8 *pPtrmap; /* The pointer map data */ + Pgno iPtrmap; /* The pointer map page number */ + int offset; /* Offset in pointer map page */ + int rc; /* Return code from subfunctions */ + + if( *pRC ) return; + + assert( sqlite3_mutex_held(pBt->mutex) ); + /* The master-journal page number must never be used as a pointer map page */ + assert( 0==PTRMAP_ISPAGE(pBt, PENDING_BYTE_PAGE(pBt)) ); + + assert( pBt->autoVacuum ); + if( key==0 ){ + *pRC = SQLITE_CORRUPT_BKPT; + return; + } + iPtrmap = PTRMAP_PAGENO(pBt, key); + rc = sqlite3PagerGet(pBt->pPager, iPtrmap, &pDbPage, 0); + if( rc!=SQLITE_OK ){ + *pRC = rc; + return; + } + offset = PTRMAP_PTROFFSET(iPtrmap, key); + if( offset<0 ){ + *pRC = SQLITE_CORRUPT_BKPT; + goto ptrmap_exit; + } + assert( offset <= (int)pBt->usableSize-5 ); + pPtrmap = (u8 *)sqlite3PagerGetData(pDbPage); + + if( eType!=pPtrmap[offset] || get4byte(&pPtrmap[offset+1])!=parent ){ + TRACE(("PTRMAP_UPDATE: %d->(%d,%d)\n", key, eType, parent)); + *pRC= rc = sqlite3PagerWrite(pDbPage); + if( rc==SQLITE_OK ){ + pPtrmap[offset] = eType; + put4byte(&pPtrmap[offset+1], parent); + } + } + +ptrmap_exit: + sqlite3PagerUnref(pDbPage); +} + +/* +** Read an entry from the pointer map. +** +** This routine retrieves the pointer map entry for page 'key', writing +** the type and parent page number to *pEType and *pPgno respectively. +** An error code is returned if something goes wrong, otherwise SQLITE_OK. +*/ +static int ptrmapGet(BtShared *pBt, Pgno key, u8 *pEType, Pgno *pPgno){ + DbPage *pDbPage; /* The pointer map page */ + int iPtrmap; /* Pointer map page index */ + u8 *pPtrmap; /* Pointer map page data */ + int offset; /* Offset of entry in pointer map */ + int rc; + + assert( sqlite3_mutex_held(pBt->mutex) ); + + iPtrmap = PTRMAP_PAGENO(pBt, key); + rc = sqlite3PagerGet(pBt->pPager, iPtrmap, &pDbPage, 0); + if( rc!=0 ){ + return rc; + } + pPtrmap = (u8 *)sqlite3PagerGetData(pDbPage); + + offset = PTRMAP_PTROFFSET(iPtrmap, key); + if( offset<0 ){ + sqlite3PagerUnref(pDbPage); + return SQLITE_CORRUPT_BKPT; + } + assert( offset <= (int)pBt->usableSize-5 ); + assert( pEType!=0 ); + *pEType = pPtrmap[offset]; + if( pPgno ) *pPgno = get4byte(&pPtrmap[offset+1]); + + sqlite3PagerUnref(pDbPage); + if( *pEType<1 || *pEType>5 ) return SQLITE_CORRUPT_BKPT; + return SQLITE_OK; +} + +#else /* if defined SQLITE_OMIT_AUTOVACUUM */ + #define ptrmapPut(w,x,y,z,rc) + #define ptrmapGet(w,x,y,z) SQLITE_OK + #define ptrmapPutOvflPtr(x, y, rc) +#endif + +/* +** Given a btree page and a cell index (0 means the first cell on +** the page, 1 means the second cell, and so forth) return a pointer +** to the cell content. +** +** findCellPastPtr() does the same except it skips past the initial +** 4-byte child pointer found on interior pages, if there is one. +** +** This routine works only for pages that do not contain overflow cells. +*/ +#define findCell(P,I) \ + ((P)->aData + ((P)->maskPage & get2byteAligned(&(P)->aCellIdx[2*(I)]))) +#define findCellPastPtr(P,I) \ + ((P)->aDataOfst + ((P)->maskPage & get2byteAligned(&(P)->aCellIdx[2*(I)]))) + + +/* +** This is common tail processing for btreeParseCellPtr() and +** btreeParseCellPtrIndex() for the case when the cell does not fit entirely +** on a single B-tree page. Make necessary adjustments to the CellInfo +** structure. +*/ +static SQLITE_NOINLINE void btreeParseCellAdjustSizeForOverflow( + MemPage *pPage, /* Page containing the cell */ + u8 *pCell, /* Pointer to the cell text. */ + CellInfo *pInfo /* Fill in this structure */ +){ + /* If the payload will not fit completely on the local page, we have + ** to decide how much to store locally and how much to spill onto + ** overflow pages. The strategy is to minimize the amount of unused + ** space on overflow pages while keeping the amount of local storage + ** in between minLocal and maxLocal. + ** + ** Warning: changing the way overflow payload is distributed in any + ** way will result in an incompatible file format. + */ + int minLocal; /* Minimum amount of payload held locally */ + int maxLocal; /* Maximum amount of payload held locally */ + int surplus; /* Overflow payload available for local storage */ + + minLocal = pPage->minLocal; + maxLocal = pPage->maxLocal; + surplus = minLocal + (pInfo->nPayload - minLocal)%(pPage->pBt->usableSize-4); + testcase( surplus==maxLocal ); + testcase( surplus==maxLocal+1 ); + if( surplus <= maxLocal ){ + pInfo->nLocal = (u16)surplus; + }else{ + pInfo->nLocal = (u16)minLocal; + } + pInfo->nSize = (u16)(&pInfo->pPayload[pInfo->nLocal] - pCell) + 4; +} + +/* +** The following routines are implementations of the MemPage.xParseCell() +** method. +** +** Parse a cell content block and fill in the CellInfo structure. +** +** btreeParseCellPtr() => table btree leaf nodes +** btreeParseCellNoPayload() => table btree internal nodes +** btreeParseCellPtrIndex() => index btree nodes +** +** There is also a wrapper function btreeParseCell() that works for +** all MemPage types and that references the cell by index rather than +** by pointer. +*/ +static void btreeParseCellPtrNoPayload( + MemPage *pPage, /* Page containing the cell */ + u8 *pCell, /* Pointer to the cell text. */ + CellInfo *pInfo /* Fill in this structure */ +){ + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + assert( pPage->leaf==0 ); + assert( pPage->childPtrSize==4 ); +#ifndef SQLITE_DEBUG + UNUSED_PARAMETER(pPage); +#endif + pInfo->nSize = 4 + getVarint(&pCell[4], (u64*)&pInfo->nKey); + pInfo->nPayload = 0; + pInfo->nLocal = 0; + pInfo->pPayload = 0; + return; +} +static void btreeParseCellPtr( + MemPage *pPage, /* Page containing the cell */ + u8 *pCell, /* Pointer to the cell text. */ + CellInfo *pInfo /* Fill in this structure */ +){ + u8 *pIter; /* For scanning through pCell */ + u32 nPayload; /* Number of bytes of cell payload */ + u64 iKey; /* Extracted Key value */ + + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + assert( pPage->leaf==0 || pPage->leaf==1 ); + assert( pPage->intKeyLeaf ); + assert( pPage->childPtrSize==0 ); + pIter = pCell; + + /* The next block of code is equivalent to: + ** + ** pIter += getVarint32(pIter, nPayload); + ** + ** The code is inlined to avoid a function call. + */ + nPayload = *pIter; + if( nPayload>=0x80 ){ + u8 *pEnd = &pIter[8]; + nPayload &= 0x7f; + do{ + nPayload = (nPayload<<7) | (*++pIter & 0x7f); + }while( (*pIter)>=0x80 && pIternKey); + ** + ** The code is inlined to avoid a function call. + */ + iKey = *pIter; + if( iKey>=0x80 ){ + u8 *pEnd = &pIter[7]; + iKey &= 0x7f; + while(1){ + iKey = (iKey<<7) | (*++pIter & 0x7f); + if( (*pIter)<0x80 ) break; + if( pIter>=pEnd ){ + iKey = (iKey<<8) | *++pIter; + break; + } + } + } + pIter++; + + pInfo->nKey = *(i64*)&iKey; + pInfo->nPayload = nPayload; + pInfo->pPayload = pIter; + testcase( nPayload==pPage->maxLocal ); + testcase( nPayload==pPage->maxLocal+1 ); + if( nPayload<=pPage->maxLocal ){ + /* This is the (easy) common case where the entire payload fits + ** on the local page. No overflow is required. + */ + pInfo->nSize = nPayload + (u16)(pIter - pCell); + if( pInfo->nSize<4 ) pInfo->nSize = 4; + pInfo->nLocal = (u16)nPayload; + }else{ + btreeParseCellAdjustSizeForOverflow(pPage, pCell, pInfo); + } +} +static void btreeParseCellPtrIndex( + MemPage *pPage, /* Page containing the cell */ + u8 *pCell, /* Pointer to the cell text. */ + CellInfo *pInfo /* Fill in this structure */ +){ + u8 *pIter; /* For scanning through pCell */ + u32 nPayload; /* Number of bytes of cell payload */ + + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + assert( pPage->leaf==0 || pPage->leaf==1 ); + assert( pPage->intKeyLeaf==0 ); + pIter = pCell + pPage->childPtrSize; + nPayload = *pIter; + if( nPayload>=0x80 ){ + u8 *pEnd = &pIter[8]; + nPayload &= 0x7f; + do{ + nPayload = (nPayload<<7) | (*++pIter & 0x7f); + }while( *(pIter)>=0x80 && pIternKey = nPayload; + pInfo->nPayload = nPayload; + pInfo->pPayload = pIter; + testcase( nPayload==pPage->maxLocal ); + testcase( nPayload==pPage->maxLocal+1 ); + if( nPayload<=pPage->maxLocal ){ + /* This is the (easy) common case where the entire payload fits + ** on the local page. No overflow is required. + */ + pInfo->nSize = nPayload + (u16)(pIter - pCell); + if( pInfo->nSize<4 ) pInfo->nSize = 4; + pInfo->nLocal = (u16)nPayload; + }else{ + btreeParseCellAdjustSizeForOverflow(pPage, pCell, pInfo); + } +} +static void btreeParseCell( + MemPage *pPage, /* Page containing the cell */ + int iCell, /* The cell index. First cell is 0 */ + CellInfo *pInfo /* Fill in this structure */ +){ + pPage->xParseCell(pPage, findCell(pPage, iCell), pInfo); +} + +/* +** The following routines are implementations of the MemPage.xCellSize +** method. +** +** Compute the total number of bytes that a Cell needs in the cell +** data area of the btree-page. The return number includes the cell +** data header and the local payload, but not any overflow page or +** the space used by the cell pointer. +** +** cellSizePtrNoPayload() => table internal nodes +** cellSizePtr() => all index nodes & table leaf nodes +*/ +static u16 cellSizePtr(MemPage *pPage, u8 *pCell){ + u8 *pIter = pCell + pPage->childPtrSize; /* For looping over bytes of pCell */ + u8 *pEnd; /* End mark for a varint */ + u32 nSize; /* Size value to return */ + +#ifdef SQLITE_DEBUG + /* The value returned by this function should always be the same as + ** the (CellInfo.nSize) value found by doing a full parse of the + ** cell. If SQLITE_DEBUG is defined, an assert() at the bottom of + ** this function verifies that this invariant is not violated. */ + CellInfo debuginfo; + pPage->xParseCell(pPage, pCell, &debuginfo); +#endif + + nSize = *pIter; + if( nSize>=0x80 ){ + pEnd = &pIter[8]; + nSize &= 0x7f; + do{ + nSize = (nSize<<7) | (*++pIter & 0x7f); + }while( *(pIter)>=0x80 && pIterintKey ){ + /* pIter now points at the 64-bit integer key value, a variable length + ** integer. The following block moves pIter to point at the first byte + ** past the end of the key value. */ + pEnd = &pIter[9]; + while( (*pIter++)&0x80 && pItermaxLocal ); + testcase( nSize==pPage->maxLocal+1 ); + if( nSize<=pPage->maxLocal ){ + nSize += (u32)(pIter - pCell); + if( nSize<4 ) nSize = 4; + }else{ + int minLocal = pPage->minLocal; + nSize = minLocal + (nSize - minLocal) % (pPage->pBt->usableSize - 4); + testcase( nSize==pPage->maxLocal ); + testcase( nSize==pPage->maxLocal+1 ); + if( nSize>pPage->maxLocal ){ + nSize = minLocal; + } + nSize += 4 + (u16)(pIter - pCell); + } + assert( nSize==debuginfo.nSize || CORRUPT_DB ); + return (u16)nSize; +} +static u16 cellSizePtrNoPayload(MemPage *pPage, u8 *pCell){ + u8 *pIter = pCell + 4; /* For looping over bytes of pCell */ + u8 *pEnd; /* End mark for a varint */ + +#ifdef SQLITE_DEBUG + /* The value returned by this function should always be the same as + ** the (CellInfo.nSize) value found by doing a full parse of the + ** cell. If SQLITE_DEBUG is defined, an assert() at the bottom of + ** this function verifies that this invariant is not violated. */ + CellInfo debuginfo; + pPage->xParseCell(pPage, pCell, &debuginfo); +#else + UNUSED_PARAMETER(pPage); +#endif + + assert( pPage->childPtrSize==4 ); + pEnd = pIter + 9; + while( (*pIter++)&0x80 && pIterxCellSize(pPage, findCell(pPage, iCell)); +} +#endif + +#ifndef SQLITE_OMIT_AUTOVACUUM +/* +** If the cell pCell, part of page pPage contains a pointer +** to an overflow page, insert an entry into the pointer-map +** for the overflow page. +*/ +static void ptrmapPutOvflPtr(MemPage *pPage, u8 *pCell, int *pRC){ + CellInfo info; + if( *pRC ) return; + assert( pCell!=0 ); + pPage->xParseCell(pPage, pCell, &info); + if( info.nLocalpBt, ovfl, PTRMAP_OVERFLOW1, pPage->pgno, pRC); + } +} +#endif + + +/* +** Defragment the page given. All Cells are moved to the +** end of the page and all free space is collected into one +** big FreeBlk that occurs in between the header and cell +** pointer array and the cell content area. +** +** EVIDENCE-OF: R-44582-60138 SQLite may from time to time reorganize a +** b-tree page so that there are no freeblocks or fragment bytes, all +** unused bytes are contained in the unallocated space region, and all +** cells are packed tightly at the end of the page. +*/ +static int defragmentPage(MemPage *pPage){ + int i; /* Loop counter */ + int pc; /* Address of the i-th cell */ + int hdr; /* Offset to the page header */ + int size; /* Size of a cell */ + int usableSize; /* Number of usable bytes on a page */ + int cellOffset; /* Offset to the cell pointer array */ + int cbrk; /* Offset to the cell content area */ + int nCell; /* Number of cells on the page */ + unsigned char *data; /* The page data */ + unsigned char *temp; /* Temp area for cell content */ + unsigned char *src; /* Source of content */ + int iCellFirst; /* First allowable cell index */ + int iCellLast; /* Last possible cell index */ + + + assert( sqlite3PagerIswriteable(pPage->pDbPage) ); + assert( pPage->pBt!=0 ); + assert( pPage->pBt->usableSize <= SQLITE_MAX_PAGE_SIZE ); + assert( pPage->nOverflow==0 ); + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + temp = 0; + src = data = pPage->aData; + hdr = pPage->hdrOffset; + cellOffset = pPage->cellOffset; + nCell = pPage->nCell; + assert( nCell==get2byte(&data[hdr+3]) ); + usableSize = pPage->pBt->usableSize; + cbrk = usableSize; + iCellFirst = cellOffset + 2*nCell; + iCellLast = usableSize - 4; + for(i=0; iiCellLast ){ + return SQLITE_CORRUPT_BKPT; + } + assert( pc>=iCellFirst && pc<=iCellLast ); + size = pPage->xCellSize(pPage, &src[pc]); + cbrk -= size; + if( cbrkusableSize ){ + return SQLITE_CORRUPT_BKPT; + } + assert( cbrk+size<=usableSize && cbrk>=iCellFirst ); + testcase( cbrk+size==usableSize ); + testcase( pc+size==usableSize ); + put2byte(pAddr, cbrk); + if( temp==0 ){ + int x; + if( cbrk==pc ) continue; + temp = sqlite3PagerTempSpace(pPage->pBt->pPager); + x = get2byte(&data[hdr+5]); + memcpy(&temp[x], &data[x], (cbrk+size) - x); + src = temp; + } + memcpy(&data[cbrk], &src[pc], size); + } + assert( cbrk>=iCellFirst ); + put2byte(&data[hdr+5], cbrk); + data[hdr+1] = 0; + data[hdr+2] = 0; + data[hdr+7] = 0; + memset(&data[iCellFirst], 0, cbrk-iCellFirst); + assert( sqlite3PagerIswriteable(pPage->pDbPage) ); + if( cbrk-iCellFirst!=pPage->nFree ){ + return SQLITE_CORRUPT_BKPT; + } + return SQLITE_OK; +} + +/* +** Search the free-list on page pPg for space to store a cell nByte bytes in +** size. If one can be found, return a pointer to the space and remove it +** from the free-list. +** +** If no suitable space can be found on the free-list, return NULL. +** +** This function may detect corruption within pPg. If corruption is +** detected then *pRc is set to SQLITE_CORRUPT and NULL is returned. +** +** Slots on the free list that are between 1 and 3 bytes larger than nByte +** will be ignored if adding the extra space to the fragmentation count +** causes the fragmentation count to exceed 60. +*/ +static u8 *pageFindSlot(MemPage *pPg, int nByte, int *pRc){ + const int hdr = pPg->hdrOffset; + u8 * const aData = pPg->aData; + int iAddr = hdr + 1; + int pc = get2byte(&aData[iAddr]); + int x; + int usableSize = pPg->pBt->usableSize; + + assert( pc>0 ); + do{ + int size; /* Size of the free slot */ + /* EVIDENCE-OF: R-06866-39125 Freeblocks are always connected in order of + ** increasing offset. */ + if( pc>usableSize-4 || pc=0 ){ + testcase( x==4 ); + testcase( x==3 ); + if( pc < pPg->cellOffset+2*pPg->nCell || size+pc > usableSize ){ + *pRc = SQLITE_CORRUPT_BKPT; + return 0; + }else if( x<4 ){ + /* EVIDENCE-OF: R-11498-58022 In a well-formed b-tree page, the total + ** number of bytes in fragments may not exceed 60. */ + if( aData[hdr+7]>57 ) return 0; + + /* Remove the slot from the free-list. Update the number of + ** fragmented bytes within the page. */ + memcpy(&aData[iAddr], &aData[pc], 2); + aData[hdr+7] += (u8)x; + }else{ + /* The slot remains on the free-list. Reduce its size to account + ** for the portion used by the new allocation. */ + put2byte(&aData[pc+2], x); + } + return &aData[pc + x]; + } + iAddr = pc; + pc = get2byte(&aData[pc]); + }while( pc ); + + return 0; +} + +/* +** Allocate nByte bytes of space from within the B-Tree page passed +** as the first argument. Write into *pIdx the index into pPage->aData[] +** of the first byte of allocated space. Return either SQLITE_OK or +** an error code (usually SQLITE_CORRUPT). +** +** The caller guarantees that there is sufficient space to make the +** allocation. This routine might need to defragment in order to bring +** all the space together, however. This routine will avoid using +** the first two bytes past the cell pointer area since presumably this +** allocation is being made in order to insert a new cell, so we will +** also end up needing a new cell pointer. +*/ +static int allocateSpace(MemPage *pPage, int nByte, int *pIdx){ + const int hdr = pPage->hdrOffset; /* Local cache of pPage->hdrOffset */ + u8 * const data = pPage->aData; /* Local cache of pPage->aData */ + int top; /* First byte of cell content area */ + int rc = SQLITE_OK; /* Integer return code */ + int gap; /* First byte of gap between cell pointers and cell content */ + + assert( sqlite3PagerIswriteable(pPage->pDbPage) ); + assert( pPage->pBt ); + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + assert( nByte>=0 ); /* Minimum cell size is 4 */ + assert( pPage->nFree>=nByte ); + assert( pPage->nOverflow==0 ); + assert( nByte < (int)(pPage->pBt->usableSize-8) ); + + assert( pPage->cellOffset == hdr + 12 - 4*pPage->leaf ); + gap = pPage->cellOffset + 2*pPage->nCell; + assert( gap<=65536 ); + /* EVIDENCE-OF: R-29356-02391 If the database uses a 65536-byte page size + ** and the reserved space is zero (the usual value for reserved space) + ** then the cell content offset of an empty page wants to be 65536. + ** However, that integer is too large to be stored in a 2-byte unsigned + ** integer, so a value of 0 is used in its place. */ + top = get2byte(&data[hdr+5]); + assert( top<=(int)pPage->pBt->usableSize ); /* Prevent by getAndInitPage() */ + if( gap>top ){ + if( top==0 && pPage->pBt->usableSize==65536 ){ + top = 65536; + }else{ + return SQLITE_CORRUPT_BKPT; + } + } + + /* If there is enough space between gap and top for one more cell pointer + ** array entry offset, and if the freelist is not empty, then search the + ** freelist looking for a free slot big enough to satisfy the request. + */ + testcase( gap+2==top ); + testcase( gap+1==top ); + testcase( gap==top ); + if( (data[hdr+2] || data[hdr+1]) && gap+2<=top ){ + u8 *pSpace = pageFindSlot(pPage, nByte, &rc); + if( pSpace ){ + assert( pSpace>=data && (pSpace - data)<65536 ); + *pIdx = (int)(pSpace - data); + return SQLITE_OK; + }else if( rc ){ + return rc; + } + } + + /* The request could not be fulfilled using a freelist slot. Check + ** to see if defragmentation is necessary. + */ + testcase( gap+2+nByte==top ); + if( gap+2+nByte>top ){ + assert( pPage->nCell>0 || CORRUPT_DB ); + rc = defragmentPage(pPage); + if( rc ) return rc; + top = get2byteNotZero(&data[hdr+5]); + assert( gap+nByte<=top ); + } + + + /* Allocate memory from the gap in between the cell pointer array + ** and the cell content area. The btreeInitPage() call has already + ** validated the freelist. Given that the freelist is valid, there + ** is no way that the allocation can extend off the end of the page. + ** The assert() below verifies the previous sentence. + */ + top -= nByte; + put2byte(&data[hdr+5], top); + assert( top+nByte <= (int)pPage->pBt->usableSize ); + *pIdx = top; + return SQLITE_OK; +} + +/* +** Return a section of the pPage->aData to the freelist. +** The first byte of the new free block is pPage->aData[iStart] +** and the size of the block is iSize bytes. +** +** Adjacent freeblocks are coalesced. +** +** Note that even though the freeblock list was checked by btreeInitPage(), +** that routine will not detect overlap between cells or freeblocks. Nor +** does it detect cells or freeblocks that encrouch into the reserved bytes +** at the end of the page. So do additional corruption checks inside this +** routine and return SQLITE_CORRUPT if any problems are found. +*/ +static int freeSpace(MemPage *pPage, u16 iStart, u16 iSize){ + u16 iPtr; /* Address of ptr to next freeblock */ + u16 iFreeBlk; /* Address of the next freeblock */ + u8 hdr; /* Page header size. 0 or 100 */ + u8 nFrag = 0; /* Reduction in fragmentation */ + u16 iOrigSize = iSize; /* Original value of iSize */ + u32 iLast = pPage->pBt->usableSize-4; /* Largest possible freeblock offset */ + u32 iEnd = iStart + iSize; /* First byte past the iStart buffer */ + unsigned char *data = pPage->aData; /* Page content */ + + assert( pPage->pBt!=0 ); + assert( sqlite3PagerIswriteable(pPage->pDbPage) ); + assert( CORRUPT_DB || iStart>=pPage->hdrOffset+6+pPage->childPtrSize ); + assert( CORRUPT_DB || iEnd <= pPage->pBt->usableSize ); + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + assert( iSize>=4 ); /* Minimum cell size is 4 */ + assert( iStart<=iLast ); + + /* Overwrite deleted information with zeros when the secure_delete + ** option is enabled */ + if( pPage->pBt->btsFlags & BTS_SECURE_DELETE ){ + memset(&data[iStart], 0, iSize); + } + + /* The list of freeblocks must be in ascending order. Find the + ** spot on the list where iStart should be inserted. + */ + hdr = pPage->hdrOffset; + iPtr = hdr + 1; + if( data[iPtr+1]==0 && data[iPtr]==0 ){ + iFreeBlk = 0; /* Shortcut for the case when the freelist is empty */ + }else{ + while( (iFreeBlk = get2byte(&data[iPtr]))iLast ) return SQLITE_CORRUPT_BKPT; + assert( iFreeBlk>iPtr || iFreeBlk==0 ); + + /* At this point: + ** iFreeBlk: First freeblock after iStart, or zero if none + ** iPtr: The address of a pointer to iFreeBlk + ** + ** Check to see if iFreeBlk should be coalesced onto the end of iStart. + */ + if( iFreeBlk && iEnd+3>=iFreeBlk ){ + nFrag = iFreeBlk - iEnd; + if( iEnd>iFreeBlk ) return SQLITE_CORRUPT_BKPT; + iEnd = iFreeBlk + get2byte(&data[iFreeBlk+2]); + if( iEnd > pPage->pBt->usableSize ) return SQLITE_CORRUPT_BKPT; + iSize = iEnd - iStart; + iFreeBlk = get2byte(&data[iFreeBlk]); + } + + /* If iPtr is another freeblock (that is, if iPtr is not the freelist + ** pointer in the page header) then check to see if iStart should be + ** coalesced onto the end of iPtr. + */ + if( iPtr>hdr+1 ){ + int iPtrEnd = iPtr + get2byte(&data[iPtr+2]); + if( iPtrEnd+3>=iStart ){ + if( iPtrEnd>iStart ) return SQLITE_CORRUPT_BKPT; + nFrag += iStart - iPtrEnd; + iSize = iEnd - iPtr; + iStart = iPtr; + } + } + if( nFrag>data[hdr+7] ) return SQLITE_CORRUPT_BKPT; + data[hdr+7] -= nFrag; + } + if( iStart==get2byte(&data[hdr+5]) ){ + /* The new freeblock is at the beginning of the cell content area, + ** so just extend the cell content area rather than create another + ** freelist entry */ + if( iPtr!=hdr+1 ) return SQLITE_CORRUPT_BKPT; + put2byte(&data[hdr+1], iFreeBlk); + put2byte(&data[hdr+5], iEnd); + }else{ + /* Insert the new freeblock into the freelist */ + put2byte(&data[iPtr], iStart); + put2byte(&data[iStart], iFreeBlk); + put2byte(&data[iStart+2], iSize); + } + pPage->nFree += iOrigSize; + return SQLITE_OK; +} + +/* +** Decode the flags byte (the first byte of the header) for a page +** and initialize fields of the MemPage structure accordingly. +** +** Only the following combinations are supported. Anything different +** indicates a corrupt database files: +** +** PTF_ZERODATA +** PTF_ZERODATA | PTF_LEAF +** PTF_LEAFDATA | PTF_INTKEY +** PTF_LEAFDATA | PTF_INTKEY | PTF_LEAF +*/ +static int decodeFlags(MemPage *pPage, int flagByte){ + BtShared *pBt; /* A copy of pPage->pBt */ + + assert( pPage->hdrOffset==(pPage->pgno==1 ? 100 : 0) ); + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + pPage->leaf = (u8)(flagByte>>3); assert( PTF_LEAF == 1<<3 ); + flagByte &= ~PTF_LEAF; + pPage->childPtrSize = 4-4*pPage->leaf; + pPage->xCellSize = cellSizePtr; + pBt = pPage->pBt; + if( flagByte==(PTF_LEAFDATA | PTF_INTKEY) ){ + /* EVIDENCE-OF: R-07291-35328 A value of 5 (0x05) means the page is an + ** interior table b-tree page. */ + assert( (PTF_LEAFDATA|PTF_INTKEY)==5 ); + /* EVIDENCE-OF: R-26900-09176 A value of 13 (0x0d) means the page is a + ** leaf table b-tree page. */ + assert( (PTF_LEAFDATA|PTF_INTKEY|PTF_LEAF)==13 ); + pPage->intKey = 1; + if( pPage->leaf ){ + pPage->intKeyLeaf = 1; + pPage->xParseCell = btreeParseCellPtr; + }else{ + pPage->intKeyLeaf = 0; + pPage->xCellSize = cellSizePtrNoPayload; + pPage->xParseCell = btreeParseCellPtrNoPayload; + } + pPage->maxLocal = pBt->maxLeaf; + pPage->minLocal = pBt->minLeaf; + }else if( flagByte==PTF_ZERODATA ){ + /* EVIDENCE-OF: R-43316-37308 A value of 2 (0x02) means the page is an + ** interior index b-tree page. */ + assert( (PTF_ZERODATA)==2 ); + /* EVIDENCE-OF: R-59615-42828 A value of 10 (0x0a) means the page is a + ** leaf index b-tree page. */ + assert( (PTF_ZERODATA|PTF_LEAF)==10 ); + pPage->intKey = 0; + pPage->intKeyLeaf = 0; + pPage->xParseCell = btreeParseCellPtrIndex; + pPage->maxLocal = pBt->maxLocal; + pPage->minLocal = pBt->minLocal; + }else{ + /* EVIDENCE-OF: R-47608-56469 Any other value for the b-tree page type is + ** an error. */ + return SQLITE_CORRUPT_BKPT; + } + pPage->max1bytePayload = pBt->max1bytePayload; + return SQLITE_OK; +} + +/* +** Initialize the auxiliary information for a disk block. +** +** Return SQLITE_OK on success. If we see that the page does +** not contain a well-formed database page, then return +** SQLITE_CORRUPT. Note that a return of SQLITE_OK does not +** guarantee that the page is well-formed. It only shows that +** we failed to detect any corruption. +*/ +static int btreeInitPage(MemPage *pPage){ + + assert( pPage->pBt!=0 ); + assert( pPage->pBt->db!=0 ); + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + assert( pPage->pgno==sqlite3PagerPagenumber(pPage->pDbPage) ); + assert( pPage == sqlite3PagerGetExtra(pPage->pDbPage) ); + assert( pPage->aData == sqlite3PagerGetData(pPage->pDbPage) ); + + if( !pPage->isInit ){ + u16 pc; /* Address of a freeblock within pPage->aData[] */ + u8 hdr; /* Offset to beginning of page header */ + u8 *data; /* Equal to pPage->aData */ + BtShared *pBt; /* The main btree structure */ + int usableSize; /* Amount of usable space on each page */ + u16 cellOffset; /* Offset from start of page to first cell pointer */ + int nFree; /* Number of unused bytes on the page */ + int top; /* First byte of the cell content area */ + int iCellFirst; /* First allowable cell or freeblock offset */ + int iCellLast; /* Last possible cell or freeblock offset */ + + pBt = pPage->pBt; + + hdr = pPage->hdrOffset; + data = pPage->aData; + /* EVIDENCE-OF: R-28594-02890 The one-byte flag at offset 0 indicating + ** the b-tree page type. */ + if( decodeFlags(pPage, data[hdr]) ) return SQLITE_CORRUPT_BKPT; + assert( pBt->pageSize>=512 && pBt->pageSize<=65536 ); + pPage->maskPage = (u16)(pBt->pageSize - 1); + pPage->nOverflow = 0; + usableSize = pBt->usableSize; + pPage->cellOffset = cellOffset = hdr + 8 + pPage->childPtrSize; + pPage->aDataEnd = &data[usableSize]; + pPage->aCellIdx = &data[cellOffset]; + pPage->aDataOfst = &data[pPage->childPtrSize]; + /* EVIDENCE-OF: R-58015-48175 The two-byte integer at offset 5 designates + ** the start of the cell content area. A zero value for this integer is + ** interpreted as 65536. */ + top = get2byteNotZero(&data[hdr+5]); + /* EVIDENCE-OF: R-37002-32774 The two-byte integer at offset 3 gives the + ** number of cells on the page. */ + pPage->nCell = get2byte(&data[hdr+3]); + if( pPage->nCell>MX_CELL(pBt) ){ + /* To many cells for a single page. The page must be corrupt */ + return SQLITE_CORRUPT_BKPT; + } + testcase( pPage->nCell==MX_CELL(pBt) ); + /* EVIDENCE-OF: R-24089-57979 If a page contains no cells (which is only + ** possible for a root page of a table that contains no rows) then the + ** offset to the cell content area will equal the page size minus the + ** bytes of reserved space. */ + assert( pPage->nCell>0 || top==usableSize || CORRUPT_DB ); + + /* A malformed database page might cause us to read past the end + ** of page when parsing a cell. + ** + ** The following block of code checks early to see if a cell extends + ** past the end of a page boundary and causes SQLITE_CORRUPT to be + ** returned if it does. + */ + iCellFirst = cellOffset + 2*pPage->nCell; + iCellLast = usableSize - 4; + if( pBt->db->flags & SQLITE_CellSizeCk ){ + int i; /* Index into the cell pointer array */ + int sz; /* Size of a cell */ + + if( !pPage->leaf ) iCellLast--; + for(i=0; inCell; i++){ + pc = get2byteAligned(&data[cellOffset+i*2]); + testcase( pc==iCellFirst ); + testcase( pc==iCellLast ); + if( pciCellLast ){ + return SQLITE_CORRUPT_BKPT; + } + sz = pPage->xCellSize(pPage, &data[pc]); + testcase( pc+sz==usableSize ); + if( pc+sz>usableSize ){ + return SQLITE_CORRUPT_BKPT; + } + } + if( !pPage->leaf ) iCellLast++; + } + + /* Compute the total free space on the page + ** EVIDENCE-OF: R-23588-34450 The two-byte integer at offset 1 gives the + ** start of the first freeblock on the page, or is zero if there are no + ** freeblocks. */ + pc = get2byte(&data[hdr+1]); + nFree = data[hdr+7] + top; /* Init nFree to non-freeblock free space */ + while( pc>0 ){ + u16 next, size; + if( pciCellLast ){ + /* EVIDENCE-OF: R-55530-52930 In a well-formed b-tree page, there will + ** always be at least one cell before the first freeblock. + ** + ** Or, the freeblock is off the end of the page + */ + return SQLITE_CORRUPT_BKPT; + } + next = get2byte(&data[pc]); + size = get2byte(&data[pc+2]); + if( (next>0 && next<=pc+size+3) || pc+size>usableSize ){ + /* Free blocks must be in ascending order. And the last byte of + ** the free-block must lie on the database page. */ + return SQLITE_CORRUPT_BKPT; + } + nFree = nFree + size; + pc = next; + } + + /* At this point, nFree contains the sum of the offset to the start + ** of the cell-content area plus the number of free bytes within + ** the cell-content area. If this is greater than the usable-size + ** of the page, then the page must be corrupted. This check also + ** serves to verify that the offset to the start of the cell-content + ** area, according to the page header, lies within the page. + */ + if( nFree>usableSize ){ + return SQLITE_CORRUPT_BKPT; + } + pPage->nFree = (u16)(nFree - iCellFirst); + pPage->isInit = 1; + } + return SQLITE_OK; +} + +/* +** Set up a raw page so that it looks like a database page holding +** no entries. +*/ +static void zeroPage(MemPage *pPage, int flags){ + unsigned char *data = pPage->aData; + BtShared *pBt = pPage->pBt; + u8 hdr = pPage->hdrOffset; + u16 first; + + assert( sqlite3PagerPagenumber(pPage->pDbPage)==pPage->pgno ); + assert( sqlite3PagerGetExtra(pPage->pDbPage) == (void*)pPage ); + assert( sqlite3PagerGetData(pPage->pDbPage) == data ); + assert( sqlite3PagerIswriteable(pPage->pDbPage) ); + assert( sqlite3_mutex_held(pBt->mutex) ); + if( pBt->btsFlags & BTS_SECURE_DELETE ){ + memset(&data[hdr], 0, pBt->usableSize - hdr); + } + data[hdr] = (char)flags; + first = hdr + ((flags&PTF_LEAF)==0 ? 12 : 8); + memset(&data[hdr+1], 0, 4); + data[hdr+7] = 0; + put2byte(&data[hdr+5], pBt->usableSize); + pPage->nFree = (u16)(pBt->usableSize - first); + decodeFlags(pPage, flags); + pPage->cellOffset = first; + pPage->aDataEnd = &data[pBt->usableSize]; + pPage->aCellIdx = &data[first]; + pPage->aDataOfst = &data[pPage->childPtrSize]; + pPage->nOverflow = 0; + assert( pBt->pageSize>=512 && pBt->pageSize<=65536 ); + pPage->maskPage = (u16)(pBt->pageSize - 1); + pPage->nCell = 0; + pPage->isInit = 1; +} + + +/* +** Convert a DbPage obtained from the pager into a MemPage used by +** the btree layer. +*/ +static MemPage *btreePageFromDbPage(DbPage *pDbPage, Pgno pgno, BtShared *pBt){ + MemPage *pPage = (MemPage*)sqlite3PagerGetExtra(pDbPage); + if( pgno!=pPage->pgno ){ + pPage->aData = sqlite3PagerGetData(pDbPage); + pPage->pDbPage = pDbPage; + pPage->pBt = pBt; + pPage->pgno = pgno; + pPage->hdrOffset = pgno==1 ? 100 : 0; + } + assert( pPage->aData==sqlite3PagerGetData(pDbPage) ); + return pPage; +} + +/* +** Get a page from the pager. Initialize the MemPage.pBt and +** MemPage.aData elements if needed. See also: btreeGetUnusedPage(). +** +** If the PAGER_GET_NOCONTENT flag is set, it means that we do not care +** about the content of the page at this time. So do not go to the disk +** to fetch the content. Just fill in the content with zeros for now. +** If in the future we call sqlite3PagerWrite() on this page, that +** means we have started to be concerned about content and the disk +** read should occur at that point. +*/ +static int btreeGetPage( + BtShared *pBt, /* The btree */ + Pgno pgno, /* Number of the page to fetch */ + MemPage **ppPage, /* Return the page in this parameter */ + int flags /* PAGER_GET_NOCONTENT or PAGER_GET_READONLY */ +){ + int rc; + DbPage *pDbPage; + + assert( flags==0 || flags==PAGER_GET_NOCONTENT || flags==PAGER_GET_READONLY ); + assert( sqlite3_mutex_held(pBt->mutex) ); + rc = sqlite3PagerGet(pBt->pPager, pgno, (DbPage**)&pDbPage, flags); + if( rc ) return rc; + *ppPage = btreePageFromDbPage(pDbPage, pgno, pBt); + return SQLITE_OK; +} + +/* +** Retrieve a page from the pager cache. If the requested page is not +** already in the pager cache return NULL. Initialize the MemPage.pBt and +** MemPage.aData elements if needed. +*/ +static MemPage *btreePageLookup(BtShared *pBt, Pgno pgno){ + DbPage *pDbPage; + assert( sqlite3_mutex_held(pBt->mutex) ); + pDbPage = sqlite3PagerLookup(pBt->pPager, pgno); + if( pDbPage ){ + return btreePageFromDbPage(pDbPage, pgno, pBt); + } + return 0; +} + +/* +** Return the size of the database file in pages. If there is any kind of +** error, return ((unsigned int)-1). +*/ +static Pgno btreePagecount(BtShared *pBt){ + return pBt->nPage; +} +SQLITE_PRIVATE u32 sqlite3BtreeLastPage(Btree *p){ + assert( sqlite3BtreeHoldsMutex(p) ); + assert( ((p->pBt->nPage)&0x8000000)==0 ); + return btreePagecount(p->pBt); +} + +/* +** Get a page from the pager and initialize it. +** +** If pCur!=0 then the page is being fetched as part of a moveToChild() +** call. Do additional sanity checking on the page in this case. +** And if the fetch fails, this routine must decrement pCur->iPage. +** +** The page is fetched as read-write unless pCur is not NULL and is +** a read-only cursor. +** +** If an error occurs, then *ppPage is undefined. It +** may remain unchanged, or it may be set to an invalid value. +*/ +static int getAndInitPage( + BtShared *pBt, /* The database file */ + Pgno pgno, /* Number of the page to get */ + MemPage **ppPage, /* Write the page pointer here */ + BtCursor *pCur, /* Cursor to receive the page, or NULL */ + int bReadOnly /* True for a read-only page */ +){ + int rc; + DbPage *pDbPage; + assert( sqlite3_mutex_held(pBt->mutex) ); + assert( pCur==0 || ppPage==&pCur->apPage[pCur->iPage] ); + assert( pCur==0 || bReadOnly==pCur->curPagerFlags ); + assert( pCur==0 || pCur->iPage>0 ); + + if( pgno>btreePagecount(pBt) ){ + rc = SQLITE_CORRUPT_BKPT; + goto getAndInitPage_error; + } + rc = sqlite3PagerGet(pBt->pPager, pgno, (DbPage**)&pDbPage, bReadOnly); + if( rc ){ + goto getAndInitPage_error; + } + *ppPage = (MemPage*)sqlite3PagerGetExtra(pDbPage); + if( (*ppPage)->isInit==0 ){ + btreePageFromDbPage(pDbPage, pgno, pBt); + rc = btreeInitPage(*ppPage); + if( rc!=SQLITE_OK ){ + releasePage(*ppPage); + goto getAndInitPage_error; + } + } + assert( (*ppPage)->pgno==pgno ); + assert( (*ppPage)->aData==sqlite3PagerGetData(pDbPage) ); + + /* If obtaining a child page for a cursor, we must verify that the page is + ** compatible with the root page. */ + if( pCur && ((*ppPage)->nCell<1 || (*ppPage)->intKey!=pCur->curIntKey) ){ + rc = SQLITE_CORRUPT_BKPT; + releasePage(*ppPage); + goto getAndInitPage_error; + } + return SQLITE_OK; + +getAndInitPage_error: + if( pCur ) pCur->iPage--; + testcase( pgno==0 ); + assert( pgno!=0 || rc==SQLITE_CORRUPT ); + return rc; +} + +/* +** Release a MemPage. This should be called once for each prior +** call to btreeGetPage. +*/ +static void releasePageNotNull(MemPage *pPage){ + assert( pPage->aData ); + assert( pPage->pBt ); + assert( pPage->pDbPage!=0 ); + assert( sqlite3PagerGetExtra(pPage->pDbPage) == (void*)pPage ); + assert( sqlite3PagerGetData(pPage->pDbPage)==pPage->aData ); + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + sqlite3PagerUnrefNotNull(pPage->pDbPage); +} +static void releasePage(MemPage *pPage){ + if( pPage ) releasePageNotNull(pPage); +} + +/* +** Get an unused page. +** +** This works just like btreeGetPage() with the addition: +** +** * If the page is already in use for some other purpose, immediately +** release it and return an SQLITE_CURRUPT error. +** * Make sure the isInit flag is clear +*/ +static int btreeGetUnusedPage( + BtShared *pBt, /* The btree */ + Pgno pgno, /* Number of the page to fetch */ + MemPage **ppPage, /* Return the page in this parameter */ + int flags /* PAGER_GET_NOCONTENT or PAGER_GET_READONLY */ +){ + int rc = btreeGetPage(pBt, pgno, ppPage, flags); + if( rc==SQLITE_OK ){ + if( sqlite3PagerPageRefcount((*ppPage)->pDbPage)>1 ){ + releasePage(*ppPage); + *ppPage = 0; + return SQLITE_CORRUPT_BKPT; + } + (*ppPage)->isInit = 0; + }else{ + *ppPage = 0; + } + return rc; +} + + +/* +** During a rollback, when the pager reloads information into the cache +** so that the cache is restored to its original state at the start of +** the transaction, for each page restored this routine is called. +** +** This routine needs to reset the extra data section at the end of the +** page to agree with the restored data. +*/ +static void pageReinit(DbPage *pData){ + MemPage *pPage; + pPage = (MemPage *)sqlite3PagerGetExtra(pData); + assert( sqlite3PagerPageRefcount(pData)>0 ); + if( pPage->isInit ){ + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + pPage->isInit = 0; + if( sqlite3PagerPageRefcount(pData)>1 ){ + /* pPage might not be a btree page; it might be an overflow page + ** or ptrmap page or a free page. In those cases, the following + ** call to btreeInitPage() will likely return SQLITE_CORRUPT. + ** But no harm is done by this. And it is very important that + ** btreeInitPage() be called on every btree page so we make + ** the call for every page that comes in for re-initing. */ + btreeInitPage(pPage); + } + } +} + +/* +** Invoke the busy handler for a btree. +*/ +static int btreeInvokeBusyHandler(void *pArg){ + BtShared *pBt = (BtShared*)pArg; + assert( pBt->db ); + assert( sqlite3_mutex_held(pBt->db->mutex) ); + return sqlite3InvokeBusyHandler(&pBt->db->busyHandler); +} + +/* +** Open a database file. +** +** zFilename is the name of the database file. If zFilename is NULL +** then an ephemeral database is created. The ephemeral database might +** be exclusively in memory, or it might use a disk-based memory cache. +** Either way, the ephemeral database will be automatically deleted +** when sqlite3BtreeClose() is called. +** +** If zFilename is ":memory:" then an in-memory database is created +** that is automatically destroyed when it is closed. +** +** The "flags" parameter is a bitmask that might contain bits like +** BTREE_OMIT_JOURNAL and/or BTREE_MEMORY. +** +** If the database is already opened in the same database connection +** and we are in shared cache mode, then the open will fail with an +** SQLITE_CONSTRAINT error. We cannot allow two or more BtShared +** objects in the same database connection since doing so will lead +** to problems with locking. +*/ +SQLITE_PRIVATE int sqlite3BtreeOpen( + sqlite3_vfs *pVfs, /* VFS to use for this b-tree */ + const char *zFilename, /* Name of the file containing the BTree database */ + sqlite3 *db, /* Associated database handle */ + Btree **ppBtree, /* Pointer to new Btree object written here */ + int flags, /* Options */ + int vfsFlags /* Flags passed through to sqlite3_vfs.xOpen() */ +){ + BtShared *pBt = 0; /* Shared part of btree structure */ + Btree *p; /* Handle to return */ + sqlite3_mutex *mutexOpen = 0; /* Prevents a race condition. Ticket #3537 */ + int rc = SQLITE_OK; /* Result code from this function */ + u8 nReserve; /* Byte of unused space on each page */ + unsigned char zDbHeader[100]; /* Database header content */ + + /* True if opening an ephemeral, temporary database */ + const int isTempDb = zFilename==0 || zFilename[0]==0; + + /* Set the variable isMemdb to true for an in-memory database, or + ** false for a file-based database. + */ +#ifdef SQLITE_OMIT_MEMORYDB + const int isMemdb = 0; +#else + const int isMemdb = (zFilename && strcmp(zFilename, ":memory:")==0) + || (isTempDb && sqlite3TempInMemory(db)) + || (vfsFlags & SQLITE_OPEN_MEMORY)!=0; +#endif + + assert( db!=0 ); + assert( pVfs!=0 ); + assert( sqlite3_mutex_held(db->mutex) ); + assert( (flags&0xff)==flags ); /* flags fit in 8 bits */ + + /* Only a BTREE_SINGLE database can be BTREE_UNORDERED */ + assert( (flags & BTREE_UNORDERED)==0 || (flags & BTREE_SINGLE)!=0 ); + + /* A BTREE_SINGLE database is always a temporary and/or ephemeral */ + assert( (flags & BTREE_SINGLE)==0 || isTempDb ); + + if( isMemdb ){ + flags |= BTREE_MEMORY; + } + if( (vfsFlags & SQLITE_OPEN_MAIN_DB)!=0 && (isMemdb || isTempDb) ){ + vfsFlags = (vfsFlags & ~SQLITE_OPEN_MAIN_DB) | SQLITE_OPEN_TEMP_DB; + } + p = sqlite3MallocZero(sizeof(Btree)); + if( !p ){ + return SQLITE_NOMEM_BKPT; + } + p->inTrans = TRANS_NONE; + p->db = db; +#ifndef SQLITE_OMIT_SHARED_CACHE + p->lock.pBtree = p; + p->lock.iTable = 1; +#endif + +#if !defined(SQLITE_OMIT_SHARED_CACHE) && !defined(SQLITE_OMIT_DISKIO) + /* + ** If this Btree is a candidate for shared cache, try to find an + ** existing BtShared object that we can share with + */ + if( isTempDb==0 && (isMemdb==0 || (vfsFlags&SQLITE_OPEN_URI)!=0) ){ + if( vfsFlags & SQLITE_OPEN_SHAREDCACHE ){ + int nFilename = sqlite3Strlen30(zFilename)+1; + int nFullPathname = pVfs->mxPathname+1; + char *zFullPathname = sqlite3Malloc(MAX(nFullPathname,nFilename)); + MUTEX_LOGIC( sqlite3_mutex *mutexShared; ) + + p->sharable = 1; + if( !zFullPathname ){ + sqlite3_free(p); + return SQLITE_NOMEM_BKPT; + } + if( isMemdb ){ + memcpy(zFullPathname, zFilename, nFilename); + }else{ + rc = sqlite3OsFullPathname(pVfs, zFilename, + nFullPathname, zFullPathname); + if( rc ){ + sqlite3_free(zFullPathname); + sqlite3_free(p); + return rc; + } + } +#if SQLITE_THREADSAFE + mutexOpen = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_OPEN); + sqlite3_mutex_enter(mutexOpen); + mutexShared = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); + sqlite3_mutex_enter(mutexShared); +#endif + for(pBt=GLOBAL(BtShared*,sqlite3SharedCacheList); pBt; pBt=pBt->pNext){ + assert( pBt->nRef>0 ); + if( 0==strcmp(zFullPathname, sqlite3PagerFilename(pBt->pPager, 0)) + && sqlite3PagerVfs(pBt->pPager)==pVfs ){ + int iDb; + for(iDb=db->nDb-1; iDb>=0; iDb--){ + Btree *pExisting = db->aDb[iDb].pBt; + if( pExisting && pExisting->pBt==pBt ){ + sqlite3_mutex_leave(mutexShared); + sqlite3_mutex_leave(mutexOpen); + sqlite3_free(zFullPathname); + sqlite3_free(p); + return SQLITE_CONSTRAINT; + } + } + p->pBt = pBt; + pBt->nRef++; + break; + } + } + sqlite3_mutex_leave(mutexShared); + sqlite3_free(zFullPathname); + } +#ifdef SQLITE_DEBUG + else{ + /* In debug mode, we mark all persistent databases as sharable + ** even when they are not. This exercises the locking code and + ** gives more opportunity for asserts(sqlite3_mutex_held()) + ** statements to find locking problems. + */ + p->sharable = 1; + } +#endif + } +#endif + if( pBt==0 ){ + /* + ** The following asserts make sure that structures used by the btree are + ** the right size. This is to guard against size changes that result + ** when compiling on a different architecture. + */ + assert( sizeof(i64)==8 ); + assert( sizeof(u64)==8 ); + assert( sizeof(u32)==4 ); + assert( sizeof(u16)==2 ); + assert( sizeof(Pgno)==4 ); + + pBt = sqlite3MallocZero( sizeof(*pBt) ); + if( pBt==0 ){ + rc = SQLITE_NOMEM_BKPT; + goto btree_open_out; + } + rc = sqlite3PagerOpen(pVfs, &pBt->pPager, zFilename, + EXTRA_SIZE, flags, vfsFlags, pageReinit); + if( rc==SQLITE_OK ){ + sqlite3PagerSetMmapLimit(pBt->pPager, db->szMmap); + rc = sqlite3PagerReadFileheader(pBt->pPager,sizeof(zDbHeader),zDbHeader); + } + if( rc!=SQLITE_OK ){ + goto btree_open_out; + } + pBt->openFlags = (u8)flags; + pBt->db = db; + sqlite3PagerSetBusyhandler(pBt->pPager, btreeInvokeBusyHandler, pBt); + p->pBt = pBt; + + pBt->pCursor = 0; + pBt->pPage1 = 0; + if( sqlite3PagerIsreadonly(pBt->pPager) ) pBt->btsFlags |= BTS_READ_ONLY; +#ifdef SQLITE_SECURE_DELETE + pBt->btsFlags |= BTS_SECURE_DELETE; +#endif + /* EVIDENCE-OF: R-51873-39618 The page size for a database file is + ** determined by the 2-byte integer located at an offset of 16 bytes from + ** the beginning of the database file. */ + pBt->pageSize = (zDbHeader[16]<<8) | (zDbHeader[17]<<16); + if( pBt->pageSize<512 || pBt->pageSize>SQLITE_MAX_PAGE_SIZE + || ((pBt->pageSize-1)&pBt->pageSize)!=0 ){ + pBt->pageSize = 0; +#ifndef SQLITE_OMIT_AUTOVACUUM + /* If the magic name ":memory:" will create an in-memory database, then + ** leave the autoVacuum mode at 0 (do not auto-vacuum), even if + ** SQLITE_DEFAULT_AUTOVACUUM is true. On the other hand, if + ** SQLITE_OMIT_MEMORYDB has been defined, then ":memory:" is just a + ** regular file-name. In this case the auto-vacuum applies as per normal. + */ + if( zFilename && !isMemdb ){ + pBt->autoVacuum = (SQLITE_DEFAULT_AUTOVACUUM ? 1 : 0); + pBt->incrVacuum = (SQLITE_DEFAULT_AUTOVACUUM==2 ? 1 : 0); + } +#endif + nReserve = 0; + }else{ + /* EVIDENCE-OF: R-37497-42412 The size of the reserved region is + ** determined by the one-byte unsigned integer found at an offset of 20 + ** into the database file header. */ + nReserve = zDbHeader[20]; + pBt->btsFlags |= BTS_PAGESIZE_FIXED; +#ifndef SQLITE_OMIT_AUTOVACUUM + pBt->autoVacuum = (get4byte(&zDbHeader[36 + 4*4])?1:0); + pBt->incrVacuum = (get4byte(&zDbHeader[36 + 7*4])?1:0); +#endif + } + rc = sqlite3PagerSetPagesize(pBt->pPager, &pBt->pageSize, nReserve); + if( rc ) goto btree_open_out; + pBt->usableSize = pBt->pageSize - nReserve; + assert( (pBt->pageSize & 7)==0 ); /* 8-byte alignment of pageSize */ + +#if !defined(SQLITE_OMIT_SHARED_CACHE) && !defined(SQLITE_OMIT_DISKIO) + /* Add the new BtShared object to the linked list sharable BtShareds. + */ + pBt->nRef = 1; + if( p->sharable ){ + MUTEX_LOGIC( sqlite3_mutex *mutexShared; ) + MUTEX_LOGIC( mutexShared = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);) + if( SQLITE_THREADSAFE && sqlite3GlobalConfig.bCoreMutex ){ + pBt->mutex = sqlite3MutexAlloc(SQLITE_MUTEX_FAST); + if( pBt->mutex==0 ){ + rc = SQLITE_NOMEM_BKPT; + goto btree_open_out; + } + } + sqlite3_mutex_enter(mutexShared); + pBt->pNext = GLOBAL(BtShared*,sqlite3SharedCacheList); + GLOBAL(BtShared*,sqlite3SharedCacheList) = pBt; + sqlite3_mutex_leave(mutexShared); + } +#endif + } + +#if !defined(SQLITE_OMIT_SHARED_CACHE) && !defined(SQLITE_OMIT_DISKIO) + /* If the new Btree uses a sharable pBtShared, then link the new + ** Btree into the list of all sharable Btrees for the same connection. + ** The list is kept in ascending order by pBt address. + */ + if( p->sharable ){ + int i; + Btree *pSib; + for(i=0; inDb; i++){ + if( (pSib = db->aDb[i].pBt)!=0 && pSib->sharable ){ + while( pSib->pPrev ){ pSib = pSib->pPrev; } + if( (uptr)p->pBt<(uptr)pSib->pBt ){ + p->pNext = pSib; + p->pPrev = 0; + pSib->pPrev = p; + }else{ + while( pSib->pNext && (uptr)pSib->pNext->pBt<(uptr)p->pBt ){ + pSib = pSib->pNext; + } + p->pNext = pSib->pNext; + p->pPrev = pSib; + if( p->pNext ){ + p->pNext->pPrev = p; + } + pSib->pNext = p; + } + break; + } + } + } +#endif + *ppBtree = p; + +btree_open_out: + if( rc!=SQLITE_OK ){ + if( pBt && pBt->pPager ){ + sqlite3PagerClose(pBt->pPager); + } + sqlite3_free(pBt); + sqlite3_free(p); + *ppBtree = 0; + }else{ + /* If the B-Tree was successfully opened, set the pager-cache size to the + ** default value. Except, when opening on an existing shared pager-cache, + ** do not change the pager-cache size. + */ + if( sqlite3BtreeSchema(p, 0, 0)==0 ){ + sqlite3PagerSetCachesize(p->pBt->pPager, SQLITE_DEFAULT_CACHE_SIZE); + } + } + if( mutexOpen ){ + assert( sqlite3_mutex_held(mutexOpen) ); + sqlite3_mutex_leave(mutexOpen); + } + assert( rc!=SQLITE_OK || sqlite3BtreeConnectionCount(*ppBtree)>0 ); + return rc; +} + +/* +** Decrement the BtShared.nRef counter. When it reaches zero, +** remove the BtShared structure from the sharing list. Return +** true if the BtShared.nRef counter reaches zero and return +** false if it is still positive. +*/ +static int removeFromSharingList(BtShared *pBt){ +#ifndef SQLITE_OMIT_SHARED_CACHE + MUTEX_LOGIC( sqlite3_mutex *pMaster; ) + BtShared *pList; + int removed = 0; + + assert( sqlite3_mutex_notheld(pBt->mutex) ); + MUTEX_LOGIC( pMaster = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); ) + sqlite3_mutex_enter(pMaster); + pBt->nRef--; + if( pBt->nRef<=0 ){ + if( GLOBAL(BtShared*,sqlite3SharedCacheList)==pBt ){ + GLOBAL(BtShared*,sqlite3SharedCacheList) = pBt->pNext; + }else{ + pList = GLOBAL(BtShared*,sqlite3SharedCacheList); + while( ALWAYS(pList) && pList->pNext!=pBt ){ + pList=pList->pNext; + } + if( ALWAYS(pList) ){ + pList->pNext = pBt->pNext; + } + } + if( SQLITE_THREADSAFE ){ + sqlite3_mutex_free(pBt->mutex); + } + removed = 1; + } + sqlite3_mutex_leave(pMaster); + return removed; +#else + return 1; +#endif +} + +/* +** Make sure pBt->pTmpSpace points to an allocation of +** MX_CELL_SIZE(pBt) bytes with a 4-byte prefix for a left-child +** pointer. +*/ +static void allocateTempSpace(BtShared *pBt){ + if( !pBt->pTmpSpace ){ + pBt->pTmpSpace = sqlite3PageMalloc( pBt->pageSize ); + + /* One of the uses of pBt->pTmpSpace is to format cells before + ** inserting them into a leaf page (function fillInCell()). If + ** a cell is less than 4 bytes in size, it is rounded up to 4 bytes + ** by the various routines that manipulate binary cells. Which + ** can mean that fillInCell() only initializes the first 2 or 3 + ** bytes of pTmpSpace, but that the first 4 bytes are copied from + ** it into a database page. This is not actually a problem, but it + ** does cause a valgrind error when the 1 or 2 bytes of unitialized + ** data is passed to system call write(). So to avoid this error, + ** zero the first 4 bytes of temp space here. + ** + ** Also: Provide four bytes of initialized space before the + ** beginning of pTmpSpace as an area available to prepend the + ** left-child pointer to the beginning of a cell. + */ + if( pBt->pTmpSpace ){ + memset(pBt->pTmpSpace, 0, 8); + pBt->pTmpSpace += 4; + } + } +} + +/* +** Free the pBt->pTmpSpace allocation +*/ +static void freeTempSpace(BtShared *pBt){ + if( pBt->pTmpSpace ){ + pBt->pTmpSpace -= 4; + sqlite3PageFree(pBt->pTmpSpace); + pBt->pTmpSpace = 0; + } +} + +/* +** Close an open database and invalidate all cursors. +*/ +SQLITE_PRIVATE int sqlite3BtreeClose(Btree *p){ + BtShared *pBt = p->pBt; + BtCursor *pCur; + + /* Close all cursors opened via this handle. */ + assert( sqlite3_mutex_held(p->db->mutex) ); + sqlite3BtreeEnter(p); + pCur = pBt->pCursor; + while( pCur ){ + BtCursor *pTmp = pCur; + pCur = pCur->pNext; + if( pTmp->pBtree==p ){ + sqlite3BtreeCloseCursor(pTmp); + } + } + + /* Rollback any active transaction and free the handle structure. + ** The call to sqlite3BtreeRollback() drops any table-locks held by + ** this handle. + */ + sqlite3BtreeRollback(p, SQLITE_OK, 0); + sqlite3BtreeLeave(p); + + /* If there are still other outstanding references to the shared-btree + ** structure, return now. The remainder of this procedure cleans + ** up the shared-btree. + */ + assert( p->wantToLock==0 && p->locked==0 ); + if( !p->sharable || removeFromSharingList(pBt) ){ + /* The pBt is no longer on the sharing list, so we can access + ** it without having to hold the mutex. + ** + ** Clean out and delete the BtShared object. + */ + assert( !pBt->pCursor ); + sqlite3PagerClose(pBt->pPager); + if( pBt->xFreeSchema && pBt->pSchema ){ + pBt->xFreeSchema(pBt->pSchema); + } + sqlite3DbFree(0, pBt->pSchema); + freeTempSpace(pBt); + sqlite3_free(pBt); + } + +#ifndef SQLITE_OMIT_SHARED_CACHE + assert( p->wantToLock==0 ); + assert( p->locked==0 ); + if( p->pPrev ) p->pPrev->pNext = p->pNext; + if( p->pNext ) p->pNext->pPrev = p->pPrev; +#endif + + sqlite3_free(p); + return SQLITE_OK; +} + +/* +** Change the "soft" limit on the number of pages in the cache. +** Unused and unmodified pages will be recycled when the number of +** pages in the cache exceeds this soft limit. But the size of the +** cache is allowed to grow larger than this limit if it contains +** dirty pages or pages still in active use. +*/ +SQLITE_PRIVATE int sqlite3BtreeSetCacheSize(Btree *p, int mxPage){ + BtShared *pBt = p->pBt; + assert( sqlite3_mutex_held(p->db->mutex) ); + sqlite3BtreeEnter(p); + sqlite3PagerSetCachesize(pBt->pPager, mxPage); + sqlite3BtreeLeave(p); + return SQLITE_OK; +} + +/* +** Change the "spill" limit on the number of pages in the cache. +** If the number of pages exceeds this limit during a write transaction, +** the pager might attempt to "spill" pages to the journal early in +** order to free up memory. +** +** The value returned is the current spill size. If zero is passed +** as an argument, no changes are made to the spill size setting, so +** using mxPage of 0 is a way to query the current spill size. +*/ +SQLITE_PRIVATE int sqlite3BtreeSetSpillSize(Btree *p, int mxPage){ + BtShared *pBt = p->pBt; + int res; + assert( sqlite3_mutex_held(p->db->mutex) ); + sqlite3BtreeEnter(p); + res = sqlite3PagerSetSpillsize(pBt->pPager, mxPage); + sqlite3BtreeLeave(p); + return res; +} + +#if SQLITE_MAX_MMAP_SIZE>0 +/* +** Change the limit on the amount of the database file that may be +** memory mapped. +*/ +SQLITE_PRIVATE int sqlite3BtreeSetMmapLimit(Btree *p, sqlite3_int64 szMmap){ + BtShared *pBt = p->pBt; + assert( sqlite3_mutex_held(p->db->mutex) ); + sqlite3BtreeEnter(p); + sqlite3PagerSetMmapLimit(pBt->pPager, szMmap); + sqlite3BtreeLeave(p); + return SQLITE_OK; +} +#endif /* SQLITE_MAX_MMAP_SIZE>0 */ + +/* +** Change the way data is synced to disk in order to increase or decrease +** how well the database resists damage due to OS crashes and power +** failures. Level 1 is the same as asynchronous (no syncs() occur and +** there is a high probability of damage) Level 2 is the default. There +** is a very low but non-zero probability of damage. Level 3 reduces the +** probability of damage to near zero but with a write performance reduction. +*/ +#ifndef SQLITE_OMIT_PAGER_PRAGMAS +SQLITE_PRIVATE int sqlite3BtreeSetPagerFlags( + Btree *p, /* The btree to set the safety level on */ + unsigned pgFlags /* Various PAGER_* flags */ +){ + BtShared *pBt = p->pBt; + assert( sqlite3_mutex_held(p->db->mutex) ); + sqlite3BtreeEnter(p); + sqlite3PagerSetFlags(pBt->pPager, pgFlags); + sqlite3BtreeLeave(p); + return SQLITE_OK; +} +#endif + +/* +** Change the default pages size and the number of reserved bytes per page. +** Or, if the page size has already been fixed, return SQLITE_READONLY +** without changing anything. +** +** The page size must be a power of 2 between 512 and 65536. If the page +** size supplied does not meet this constraint then the page size is not +** changed. +** +** Page sizes are constrained to be a power of two so that the region +** of the database file used for locking (beginning at PENDING_BYTE, +** the first byte past the 1GB boundary, 0x40000000) needs to occur +** at the beginning of a page. +** +** If parameter nReserve is less than zero, then the number of reserved +** bytes per page is left unchanged. +** +** If the iFix!=0 then the BTS_PAGESIZE_FIXED flag is set so that the page size +** and autovacuum mode can no longer be changed. +*/ +SQLITE_PRIVATE int sqlite3BtreeSetPageSize(Btree *p, int pageSize, int nReserve, int iFix){ + int rc = SQLITE_OK; + BtShared *pBt = p->pBt; + assert( nReserve>=-1 && nReserve<=255 ); + sqlite3BtreeEnter(p); +#if SQLITE_HAS_CODEC + if( nReserve>pBt->optimalReserve ) pBt->optimalReserve = (u8)nReserve; +#endif + if( pBt->btsFlags & BTS_PAGESIZE_FIXED ){ + sqlite3BtreeLeave(p); + return SQLITE_READONLY; + } + if( nReserve<0 ){ + nReserve = pBt->pageSize - pBt->usableSize; + } + assert( nReserve>=0 && nReserve<=255 ); + if( pageSize>=512 && pageSize<=SQLITE_MAX_PAGE_SIZE && + ((pageSize-1)&pageSize)==0 ){ + assert( (pageSize & 7)==0 ); + assert( !pBt->pCursor ); + pBt->pageSize = (u32)pageSize; + freeTempSpace(pBt); + } + rc = sqlite3PagerSetPagesize(pBt->pPager, &pBt->pageSize, nReserve); + pBt->usableSize = pBt->pageSize - (u16)nReserve; + if( iFix ) pBt->btsFlags |= BTS_PAGESIZE_FIXED; + sqlite3BtreeLeave(p); + return rc; +} + +/* +** Return the currently defined page size +*/ +SQLITE_PRIVATE int sqlite3BtreeGetPageSize(Btree *p){ + return p->pBt->pageSize; +} + +/* +** This function is similar to sqlite3BtreeGetReserve(), except that it +** may only be called if it is guaranteed that the b-tree mutex is already +** held. +** +** This is useful in one special case in the backup API code where it is +** known that the shared b-tree mutex is held, but the mutex on the +** database handle that owns *p is not. In this case if sqlite3BtreeEnter() +** were to be called, it might collide with some other operation on the +** database handle that owns *p, causing undefined behavior. +*/ +SQLITE_PRIVATE int sqlite3BtreeGetReserveNoMutex(Btree *p){ + int n; + assert( sqlite3_mutex_held(p->pBt->mutex) ); + n = p->pBt->pageSize - p->pBt->usableSize; + return n; +} + +/* +** Return the number of bytes of space at the end of every page that +** are intentually left unused. This is the "reserved" space that is +** sometimes used by extensions. +** +** If SQLITE_HAS_MUTEX is defined then the number returned is the +** greater of the current reserved space and the maximum requested +** reserve space. +*/ +SQLITE_PRIVATE int sqlite3BtreeGetOptimalReserve(Btree *p){ + int n; + sqlite3BtreeEnter(p); + n = sqlite3BtreeGetReserveNoMutex(p); +#ifdef SQLITE_HAS_CODEC + if( npBt->optimalReserve ) n = p->pBt->optimalReserve; +#endif + sqlite3BtreeLeave(p); + return n; +} + + +/* +** Set the maximum page count for a database if mxPage is positive. +** No changes are made if mxPage is 0 or negative. +** Regardless of the value of mxPage, return the maximum page count. +*/ +SQLITE_PRIVATE int sqlite3BtreeMaxPageCount(Btree *p, int mxPage){ + int n; + sqlite3BtreeEnter(p); + n = sqlite3PagerMaxPageCount(p->pBt->pPager, mxPage); + sqlite3BtreeLeave(p); + return n; +} + +/* +** Set the BTS_SECURE_DELETE flag if newFlag is 0 or 1. If newFlag is -1, +** then make no changes. Always return the value of the BTS_SECURE_DELETE +** setting after the change. +*/ +SQLITE_PRIVATE int sqlite3BtreeSecureDelete(Btree *p, int newFlag){ + int b; + if( p==0 ) return 0; + sqlite3BtreeEnter(p); + if( newFlag>=0 ){ + p->pBt->btsFlags &= ~BTS_SECURE_DELETE; + if( newFlag ) p->pBt->btsFlags |= BTS_SECURE_DELETE; + } + b = (p->pBt->btsFlags & BTS_SECURE_DELETE)!=0; + sqlite3BtreeLeave(p); + return b; +} + +/* +** Change the 'auto-vacuum' property of the database. If the 'autoVacuum' +** parameter is non-zero, then auto-vacuum mode is enabled. If zero, it +** is disabled. The default value for the auto-vacuum property is +** determined by the SQLITE_DEFAULT_AUTOVACUUM macro. +*/ +SQLITE_PRIVATE int sqlite3BtreeSetAutoVacuum(Btree *p, int autoVacuum){ +#ifdef SQLITE_OMIT_AUTOVACUUM + return SQLITE_READONLY; +#else + BtShared *pBt = p->pBt; + int rc = SQLITE_OK; + u8 av = (u8)autoVacuum; + + sqlite3BtreeEnter(p); + if( (pBt->btsFlags & BTS_PAGESIZE_FIXED)!=0 && (av ?1:0)!=pBt->autoVacuum ){ + rc = SQLITE_READONLY; + }else{ + pBt->autoVacuum = av ?1:0; + pBt->incrVacuum = av==2 ?1:0; + } + sqlite3BtreeLeave(p); + return rc; +#endif +} + +/* +** Return the value of the 'auto-vacuum' property. If auto-vacuum is +** enabled 1 is returned. Otherwise 0. +*/ +SQLITE_PRIVATE int sqlite3BtreeGetAutoVacuum(Btree *p){ +#ifdef SQLITE_OMIT_AUTOVACUUM + return BTREE_AUTOVACUUM_NONE; +#else + int rc; + sqlite3BtreeEnter(p); + rc = ( + (!p->pBt->autoVacuum)?BTREE_AUTOVACUUM_NONE: + (!p->pBt->incrVacuum)?BTREE_AUTOVACUUM_FULL: + BTREE_AUTOVACUUM_INCR + ); + sqlite3BtreeLeave(p); + return rc; +#endif +} + + +/* +** Get a reference to pPage1 of the database file. This will +** also acquire a readlock on that file. +** +** SQLITE_OK is returned on success. If the file is not a +** well-formed database file, then SQLITE_CORRUPT is returned. +** SQLITE_BUSY is returned if the database is locked. SQLITE_NOMEM +** is returned if we run out of memory. +*/ +static int lockBtree(BtShared *pBt){ + int rc; /* Result code from subfunctions */ + MemPage *pPage1; /* Page 1 of the database file */ + int nPage; /* Number of pages in the database */ + int nPageFile = 0; /* Number of pages in the database file */ + int nPageHeader; /* Number of pages in the database according to hdr */ + + assert( sqlite3_mutex_held(pBt->mutex) ); + assert( pBt->pPage1==0 ); + rc = sqlite3PagerSharedLock(pBt->pPager); + if( rc!=SQLITE_OK ) return rc; + rc = btreeGetPage(pBt, 1, &pPage1, 0); + if( rc!=SQLITE_OK ) return rc; + + /* Do some checking to help insure the file we opened really is + ** a valid database file. + */ + nPage = nPageHeader = get4byte(28+(u8*)pPage1->aData); + sqlite3PagerPagecount(pBt->pPager, &nPageFile); + if( nPage==0 || memcmp(24+(u8*)pPage1->aData, 92+(u8*)pPage1->aData,4)!=0 ){ + nPage = nPageFile; + } + if( nPage>0 ){ + u32 pageSize; + u32 usableSize; + u8 *page1 = pPage1->aData; + rc = SQLITE_NOTADB; + /* EVIDENCE-OF: R-43737-39999 Every valid SQLite database file begins + ** with the following 16 bytes (in hex): 53 51 4c 69 74 65 20 66 6f 72 6d + ** 61 74 20 33 00. */ + if( memcmp(page1, zMagicHeader, 16)!=0 ){ + goto page1_init_failed; + } + +#ifdef SQLITE_OMIT_WAL + if( page1[18]>1 ){ + pBt->btsFlags |= BTS_READ_ONLY; + } + if( page1[19]>1 ){ + goto page1_init_failed; + } +#else + if( page1[18]>2 ){ + pBt->btsFlags |= BTS_READ_ONLY; + } + if( page1[19]>2 ){ + goto page1_init_failed; + } + + /* If the write version is set to 2, this database should be accessed + ** in WAL mode. If the log is not already open, open it now. Then + ** return SQLITE_OK and return without populating BtShared.pPage1. + ** The caller detects this and calls this function again. This is + ** required as the version of page 1 currently in the page1 buffer + ** may not be the latest version - there may be a newer one in the log + ** file. + */ + if( page1[19]==2 && (pBt->btsFlags & BTS_NO_WAL)==0 ){ + int isOpen = 0; + rc = sqlite3PagerOpenWal(pBt->pPager, &isOpen); + if( rc!=SQLITE_OK ){ + goto page1_init_failed; + }else{ +#if SQLITE_DEFAULT_SYNCHRONOUS!=SQLITE_DEFAULT_WAL_SYNCHRONOUS + sqlite3 *db; + Db *pDb; + if( (db=pBt->db)!=0 && (pDb=db->aDb)!=0 ){ + while( pDb->pBt==0 || pDb->pBt->pBt!=pBt ){ pDb++; } + if( pDb->bSyncSet==0 + && pDb->safety_level==SQLITE_DEFAULT_SYNCHRONOUS+1 + ){ + pDb->safety_level = SQLITE_DEFAULT_WAL_SYNCHRONOUS+1; + sqlite3PagerSetFlags(pBt->pPager, + pDb->safety_level | (db->flags & PAGER_FLAGS_MASK)); + } + } +#endif + if( isOpen==0 ){ + releasePage(pPage1); + return SQLITE_OK; + } + } + rc = SQLITE_NOTADB; + } +#endif + + /* EVIDENCE-OF: R-15465-20813 The maximum and minimum embedded payload + ** fractions and the leaf payload fraction values must be 64, 32, and 32. + ** + ** The original design allowed these amounts to vary, but as of + ** version 3.6.0, we require them to be fixed. + */ + if( memcmp(&page1[21], "\100\040\040",3)!=0 ){ + goto page1_init_failed; + } + /* EVIDENCE-OF: R-51873-39618 The page size for a database file is + ** determined by the 2-byte integer located at an offset of 16 bytes from + ** the beginning of the database file. */ + pageSize = (page1[16]<<8) | (page1[17]<<16); + /* EVIDENCE-OF: R-25008-21688 The size of a page is a power of two + ** between 512 and 65536 inclusive. */ + if( ((pageSize-1)&pageSize)!=0 + || pageSize>SQLITE_MAX_PAGE_SIZE + || pageSize<=256 + ){ + goto page1_init_failed; + } + assert( (pageSize & 7)==0 ); + /* EVIDENCE-OF: R-59310-51205 The "reserved space" size in the 1-byte + ** integer at offset 20 is the number of bytes of space at the end of + ** each page to reserve for extensions. + ** + ** EVIDENCE-OF: R-37497-42412 The size of the reserved region is + ** determined by the one-byte unsigned integer found at an offset of 20 + ** into the database file header. */ + usableSize = pageSize - page1[20]; + if( (u32)pageSize!=pBt->pageSize ){ + /* After reading the first page of the database assuming a page size + ** of BtShared.pageSize, we have discovered that the page-size is + ** actually pageSize. Unlock the database, leave pBt->pPage1 at + ** zero and return SQLITE_OK. The caller will call this function + ** again with the correct page-size. + */ + releasePage(pPage1); + pBt->usableSize = usableSize; + pBt->pageSize = pageSize; + freeTempSpace(pBt); + rc = sqlite3PagerSetPagesize(pBt->pPager, &pBt->pageSize, + pageSize-usableSize); + return rc; + } + if( (pBt->db->flags & SQLITE_RecoveryMode)==0 && nPage>nPageFile ){ + rc = SQLITE_CORRUPT_BKPT; + goto page1_init_failed; + } + /* EVIDENCE-OF: R-28312-64704 However, the usable size is not allowed to + ** be less than 480. In other words, if the page size is 512, then the + ** reserved space size cannot exceed 32. */ + if( usableSize<480 ){ + goto page1_init_failed; + } + pBt->pageSize = pageSize; + pBt->usableSize = usableSize; +#ifndef SQLITE_OMIT_AUTOVACUUM + pBt->autoVacuum = (get4byte(&page1[36 + 4*4])?1:0); + pBt->incrVacuum = (get4byte(&page1[36 + 7*4])?1:0); +#endif + } + + /* maxLocal is the maximum amount of payload to store locally for + ** a cell. Make sure it is small enough so that at least minFanout + ** cells can will fit on one page. We assume a 10-byte page header. + ** Besides the payload, the cell must store: + ** 2-byte pointer to the cell + ** 4-byte child pointer + ** 9-byte nKey value + ** 4-byte nData value + ** 4-byte overflow page pointer + ** So a cell consists of a 2-byte pointer, a header which is as much as + ** 17 bytes long, 0 to N bytes of payload, and an optional 4 byte overflow + ** page pointer. + */ + pBt->maxLocal = (u16)((pBt->usableSize-12)*64/255 - 23); + pBt->minLocal = (u16)((pBt->usableSize-12)*32/255 - 23); + pBt->maxLeaf = (u16)(pBt->usableSize - 35); + pBt->minLeaf = (u16)((pBt->usableSize-12)*32/255 - 23); + if( pBt->maxLocal>127 ){ + pBt->max1bytePayload = 127; + }else{ + pBt->max1bytePayload = (u8)pBt->maxLocal; + } + assert( pBt->maxLeaf + 23 <= MX_CELL_SIZE(pBt) ); + pBt->pPage1 = pPage1; + pBt->nPage = nPage; + return SQLITE_OK; + +page1_init_failed: + releasePage(pPage1); + pBt->pPage1 = 0; + return rc; +} + +#ifndef NDEBUG +/* +** Return the number of cursors open on pBt. This is for use +** in assert() expressions, so it is only compiled if NDEBUG is not +** defined. +** +** Only write cursors are counted if wrOnly is true. If wrOnly is +** false then all cursors are counted. +** +** For the purposes of this routine, a cursor is any cursor that +** is capable of reading or writing to the database. Cursors that +** have been tripped into the CURSOR_FAULT state are not counted. +*/ +static int countValidCursors(BtShared *pBt, int wrOnly){ + BtCursor *pCur; + int r = 0; + for(pCur=pBt->pCursor; pCur; pCur=pCur->pNext){ + if( (wrOnly==0 || (pCur->curFlags & BTCF_WriteFlag)!=0) + && pCur->eState!=CURSOR_FAULT ) r++; + } + return r; +} +#endif + +/* +** If there are no outstanding cursors and we are not in the middle +** of a transaction but there is a read lock on the database, then +** this routine unrefs the first page of the database file which +** has the effect of releasing the read lock. +** +** If there is a transaction in progress, this routine is a no-op. +*/ +static void unlockBtreeIfUnused(BtShared *pBt){ + assert( sqlite3_mutex_held(pBt->mutex) ); + assert( countValidCursors(pBt,0)==0 || pBt->inTransaction>TRANS_NONE ); + if( pBt->inTransaction==TRANS_NONE && pBt->pPage1!=0 ){ + MemPage *pPage1 = pBt->pPage1; + assert( pPage1->aData ); + assert( sqlite3PagerRefcount(pBt->pPager)==1 ); + pBt->pPage1 = 0; + releasePageNotNull(pPage1); + } +} + +/* +** If pBt points to an empty file then convert that empty file +** into a new empty database by initializing the first page of +** the database. +*/ +static int newDatabase(BtShared *pBt){ + MemPage *pP1; + unsigned char *data; + int rc; + + assert( sqlite3_mutex_held(pBt->mutex) ); + if( pBt->nPage>0 ){ + return SQLITE_OK; + } + pP1 = pBt->pPage1; + assert( pP1!=0 ); + data = pP1->aData; + rc = sqlite3PagerWrite(pP1->pDbPage); + if( rc ) return rc; + memcpy(data, zMagicHeader, sizeof(zMagicHeader)); + assert( sizeof(zMagicHeader)==16 ); + data[16] = (u8)((pBt->pageSize>>8)&0xff); + data[17] = (u8)((pBt->pageSize>>16)&0xff); + data[18] = 1; + data[19] = 1; + assert( pBt->usableSize<=pBt->pageSize && pBt->usableSize+255>=pBt->pageSize); + data[20] = (u8)(pBt->pageSize - pBt->usableSize); + data[21] = 64; + data[22] = 32; + data[23] = 32; + memset(&data[24], 0, 100-24); + zeroPage(pP1, PTF_INTKEY|PTF_LEAF|PTF_LEAFDATA ); + pBt->btsFlags |= BTS_PAGESIZE_FIXED; +#ifndef SQLITE_OMIT_AUTOVACUUM + assert( pBt->autoVacuum==1 || pBt->autoVacuum==0 ); + assert( pBt->incrVacuum==1 || pBt->incrVacuum==0 ); + put4byte(&data[36 + 4*4], pBt->autoVacuum); + put4byte(&data[36 + 7*4], pBt->incrVacuum); +#endif + pBt->nPage = 1; + data[31] = 1; + return SQLITE_OK; +} + +/* +** Initialize the first page of the database file (creating a database +** consisting of a single page and no schema objects). Return SQLITE_OK +** if successful, or an SQLite error code otherwise. +*/ +SQLITE_PRIVATE int sqlite3BtreeNewDb(Btree *p){ + int rc; + sqlite3BtreeEnter(p); + p->pBt->nPage = 0; + rc = newDatabase(p->pBt); + sqlite3BtreeLeave(p); + return rc; +} + +/* +** Attempt to start a new transaction. A write-transaction +** is started if the second argument is nonzero, otherwise a read- +** transaction. If the second argument is 2 or more and exclusive +** transaction is started, meaning that no other process is allowed +** to access the database. A preexisting transaction may not be +** upgraded to exclusive by calling this routine a second time - the +** exclusivity flag only works for a new transaction. +** +** A write-transaction must be started before attempting any +** changes to the database. None of the following routines +** will work unless a transaction is started first: +** +** sqlite3BtreeCreateTable() +** sqlite3BtreeCreateIndex() +** sqlite3BtreeClearTable() +** sqlite3BtreeDropTable() +** sqlite3BtreeInsert() +** sqlite3BtreeDelete() +** sqlite3BtreeUpdateMeta() +** +** If an initial attempt to acquire the lock fails because of lock contention +** and the database was previously unlocked, then invoke the busy handler +** if there is one. But if there was previously a read-lock, do not +** invoke the busy handler - just return SQLITE_BUSY. SQLITE_BUSY is +** returned when there is already a read-lock in order to avoid a deadlock. +** +** Suppose there are two processes A and B. A has a read lock and B has +** a reserved lock. B tries to promote to exclusive but is blocked because +** of A's read lock. A tries to promote to reserved but is blocked by B. +** One or the other of the two processes must give way or there can be +** no progress. By returning SQLITE_BUSY and not invoking the busy callback +** when A already has a read lock, we encourage A to give up and let B +** proceed. +*/ +SQLITE_PRIVATE int sqlite3BtreeBeginTrans(Btree *p, int wrflag){ + BtShared *pBt = p->pBt; + int rc = SQLITE_OK; + + sqlite3BtreeEnter(p); + btreeIntegrity(p); + + /* If the btree is already in a write-transaction, or it + ** is already in a read-transaction and a read-transaction + ** is requested, this is a no-op. + */ + if( p->inTrans==TRANS_WRITE || (p->inTrans==TRANS_READ && !wrflag) ){ + goto trans_begun; + } + assert( pBt->inTransaction==TRANS_WRITE || IfNotOmitAV(pBt->bDoTruncate)==0 ); + + /* Write transactions are not possible on a read-only database */ + if( (pBt->btsFlags & BTS_READ_ONLY)!=0 && wrflag ){ + rc = SQLITE_READONLY; + goto trans_begun; + } + +#ifndef SQLITE_OMIT_SHARED_CACHE + { + sqlite3 *pBlock = 0; + /* If another database handle has already opened a write transaction + ** on this shared-btree structure and a second write transaction is + ** requested, return SQLITE_LOCKED. + */ + if( (wrflag && pBt->inTransaction==TRANS_WRITE) + || (pBt->btsFlags & BTS_PENDING)!=0 + ){ + pBlock = pBt->pWriter->db; + }else if( wrflag>1 ){ + BtLock *pIter; + for(pIter=pBt->pLock; pIter; pIter=pIter->pNext){ + if( pIter->pBtree!=p ){ + pBlock = pIter->pBtree->db; + break; + } + } + } + if( pBlock ){ + sqlite3ConnectionBlocked(p->db, pBlock); + rc = SQLITE_LOCKED_SHAREDCACHE; + goto trans_begun; + } + } +#endif + + /* Any read-only or read-write transaction implies a read-lock on + ** page 1. So if some other shared-cache client already has a write-lock + ** on page 1, the transaction cannot be opened. */ + rc = querySharedCacheTableLock(p, MASTER_ROOT, READ_LOCK); + if( SQLITE_OK!=rc ) goto trans_begun; + + pBt->btsFlags &= ~BTS_INITIALLY_EMPTY; + if( pBt->nPage==0 ) pBt->btsFlags |= BTS_INITIALLY_EMPTY; + do { + /* Call lockBtree() until either pBt->pPage1 is populated or + ** lockBtree() returns something other than SQLITE_OK. lockBtree() + ** may return SQLITE_OK but leave pBt->pPage1 set to 0 if after + ** reading page 1 it discovers that the page-size of the database + ** file is not pBt->pageSize. In this case lockBtree() will update + ** pBt->pageSize to the page-size of the file on disk. + */ + while( pBt->pPage1==0 && SQLITE_OK==(rc = lockBtree(pBt)) ); + + if( rc==SQLITE_OK && wrflag ){ + if( (pBt->btsFlags & BTS_READ_ONLY)!=0 ){ + rc = SQLITE_READONLY; + }else{ + rc = sqlite3PagerBegin(pBt->pPager,wrflag>1,sqlite3TempInMemory(p->db)); + if( rc==SQLITE_OK ){ + rc = newDatabase(pBt); + } + } + } + + if( rc!=SQLITE_OK ){ + unlockBtreeIfUnused(pBt); + } + }while( (rc&0xFF)==SQLITE_BUSY && pBt->inTransaction==TRANS_NONE && + btreeInvokeBusyHandler(pBt) ); + + if( rc==SQLITE_OK ){ + if( p->inTrans==TRANS_NONE ){ + pBt->nTransaction++; +#ifndef SQLITE_OMIT_SHARED_CACHE + if( p->sharable ){ + assert( p->lock.pBtree==p && p->lock.iTable==1 ); + p->lock.eLock = READ_LOCK; + p->lock.pNext = pBt->pLock; + pBt->pLock = &p->lock; + } +#endif + } + p->inTrans = (wrflag?TRANS_WRITE:TRANS_READ); + if( p->inTrans>pBt->inTransaction ){ + pBt->inTransaction = p->inTrans; + } + if( wrflag ){ + MemPage *pPage1 = pBt->pPage1; +#ifndef SQLITE_OMIT_SHARED_CACHE + assert( !pBt->pWriter ); + pBt->pWriter = p; + pBt->btsFlags &= ~BTS_EXCLUSIVE; + if( wrflag>1 ) pBt->btsFlags |= BTS_EXCLUSIVE; +#endif + + /* If the db-size header field is incorrect (as it may be if an old + ** client has been writing the database file), update it now. Doing + ** this sooner rather than later means the database size can safely + ** re-read the database size from page 1 if a savepoint or transaction + ** rollback occurs within the transaction. + */ + if( pBt->nPage!=get4byte(&pPage1->aData[28]) ){ + rc = sqlite3PagerWrite(pPage1->pDbPage); + if( rc==SQLITE_OK ){ + put4byte(&pPage1->aData[28], pBt->nPage); + } + } + } + } + + +trans_begun: + if( rc==SQLITE_OK && wrflag ){ + /* This call makes sure that the pager has the correct number of + ** open savepoints. If the second parameter is greater than 0 and + ** the sub-journal is not already open, then it will be opened here. + */ + rc = sqlite3PagerOpenSavepoint(pBt->pPager, p->db->nSavepoint); + } + + btreeIntegrity(p); + sqlite3BtreeLeave(p); + return rc; +} + +#ifndef SQLITE_OMIT_AUTOVACUUM + +/* +** Set the pointer-map entries for all children of page pPage. Also, if +** pPage contains cells that point to overflow pages, set the pointer +** map entries for the overflow pages as well. +*/ +static int setChildPtrmaps(MemPage *pPage){ + int i; /* Counter variable */ + int nCell; /* Number of cells in page pPage */ + int rc; /* Return code */ + BtShared *pBt = pPage->pBt; + u8 isInitOrig = pPage->isInit; + Pgno pgno = pPage->pgno; + + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + rc = btreeInitPage(pPage); + if( rc!=SQLITE_OK ){ + goto set_child_ptrmaps_out; + } + nCell = pPage->nCell; + + for(i=0; ileaf ){ + Pgno childPgno = get4byte(pCell); + ptrmapPut(pBt, childPgno, PTRMAP_BTREE, pgno, &rc); + } + } + + if( !pPage->leaf ){ + Pgno childPgno = get4byte(&pPage->aData[pPage->hdrOffset+8]); + ptrmapPut(pBt, childPgno, PTRMAP_BTREE, pgno, &rc); + } + +set_child_ptrmaps_out: + pPage->isInit = isInitOrig; + return rc; +} + +/* +** Somewhere on pPage is a pointer to page iFrom. Modify this pointer so +** that it points to iTo. Parameter eType describes the type of pointer to +** be modified, as follows: +** +** PTRMAP_BTREE: pPage is a btree-page. The pointer points at a child +** page of pPage. +** +** PTRMAP_OVERFLOW1: pPage is a btree-page. The pointer points at an overflow +** page pointed to by one of the cells on pPage. +** +** PTRMAP_OVERFLOW2: pPage is an overflow-page. The pointer points at the next +** overflow page in the list. +*/ +static int modifyPagePointer(MemPage *pPage, Pgno iFrom, Pgno iTo, u8 eType){ + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + assert( sqlite3PagerIswriteable(pPage->pDbPage) ); + if( eType==PTRMAP_OVERFLOW2 ){ + /* The pointer is always the first 4 bytes of the page in this case. */ + if( get4byte(pPage->aData)!=iFrom ){ + return SQLITE_CORRUPT_BKPT; + } + put4byte(pPage->aData, iTo); + }else{ + u8 isInitOrig = pPage->isInit; + int i; + int nCell; + int rc; + + rc = btreeInitPage(pPage); + if( rc ) return rc; + nCell = pPage->nCell; + + for(i=0; ixParseCell(pPage, pCell, &info); + if( info.nLocalaData+pPage->maskPage + && iFrom==get4byte(pCell+info.nSize-4) + ){ + put4byte(pCell+info.nSize-4, iTo); + break; + } + }else{ + if( get4byte(pCell)==iFrom ){ + put4byte(pCell, iTo); + break; + } + } + } + + if( i==nCell ){ + if( eType!=PTRMAP_BTREE || + get4byte(&pPage->aData[pPage->hdrOffset+8])!=iFrom ){ + return SQLITE_CORRUPT_BKPT; + } + put4byte(&pPage->aData[pPage->hdrOffset+8], iTo); + } + + pPage->isInit = isInitOrig; + } + return SQLITE_OK; +} + + +/* +** Move the open database page pDbPage to location iFreePage in the +** database. The pDbPage reference remains valid. +** +** The isCommit flag indicates that there is no need to remember that +** the journal needs to be sync()ed before database page pDbPage->pgno +** can be written to. The caller has already promised not to write to that +** page. +*/ +static int relocatePage( + BtShared *pBt, /* Btree */ + MemPage *pDbPage, /* Open page to move */ + u8 eType, /* Pointer map 'type' entry for pDbPage */ + Pgno iPtrPage, /* Pointer map 'page-no' entry for pDbPage */ + Pgno iFreePage, /* The location to move pDbPage to */ + int isCommit /* isCommit flag passed to sqlite3PagerMovepage */ +){ + MemPage *pPtrPage; /* The page that contains a pointer to pDbPage */ + Pgno iDbPage = pDbPage->pgno; + Pager *pPager = pBt->pPager; + int rc; + + assert( eType==PTRMAP_OVERFLOW2 || eType==PTRMAP_OVERFLOW1 || + eType==PTRMAP_BTREE || eType==PTRMAP_ROOTPAGE ); + assert( sqlite3_mutex_held(pBt->mutex) ); + assert( pDbPage->pBt==pBt ); + + /* Move page iDbPage from its current location to page number iFreePage */ + TRACE(("AUTOVACUUM: Moving %d to free page %d (ptr page %d type %d)\n", + iDbPage, iFreePage, iPtrPage, eType)); + rc = sqlite3PagerMovepage(pPager, pDbPage->pDbPage, iFreePage, isCommit); + if( rc!=SQLITE_OK ){ + return rc; + } + pDbPage->pgno = iFreePage; + + /* If pDbPage was a btree-page, then it may have child pages and/or cells + ** that point to overflow pages. The pointer map entries for all these + ** pages need to be changed. + ** + ** If pDbPage is an overflow page, then the first 4 bytes may store a + ** pointer to a subsequent overflow page. If this is the case, then + ** the pointer map needs to be updated for the subsequent overflow page. + */ + if( eType==PTRMAP_BTREE || eType==PTRMAP_ROOTPAGE ){ + rc = setChildPtrmaps(pDbPage); + if( rc!=SQLITE_OK ){ + return rc; + } + }else{ + Pgno nextOvfl = get4byte(pDbPage->aData); + if( nextOvfl!=0 ){ + ptrmapPut(pBt, nextOvfl, PTRMAP_OVERFLOW2, iFreePage, &rc); + if( rc!=SQLITE_OK ){ + return rc; + } + } + } + + /* Fix the database pointer on page iPtrPage that pointed at iDbPage so + ** that it points at iFreePage. Also fix the pointer map entry for + ** iPtrPage. + */ + if( eType!=PTRMAP_ROOTPAGE ){ + rc = btreeGetPage(pBt, iPtrPage, &pPtrPage, 0); + if( rc!=SQLITE_OK ){ + return rc; + } + rc = sqlite3PagerWrite(pPtrPage->pDbPage); + if( rc!=SQLITE_OK ){ + releasePage(pPtrPage); + return rc; + } + rc = modifyPagePointer(pPtrPage, iDbPage, iFreePage, eType); + releasePage(pPtrPage); + if( rc==SQLITE_OK ){ + ptrmapPut(pBt, iFreePage, eType, iPtrPage, &rc); + } + } + return rc; +} + +/* Forward declaration required by incrVacuumStep(). */ +static int allocateBtreePage(BtShared *, MemPage **, Pgno *, Pgno, u8); + +/* +** Perform a single step of an incremental-vacuum. If successful, return +** SQLITE_OK. If there is no work to do (and therefore no point in +** calling this function again), return SQLITE_DONE. Or, if an error +** occurs, return some other error code. +** +** More specifically, this function attempts to re-organize the database so +** that the last page of the file currently in use is no longer in use. +** +** Parameter nFin is the number of pages that this database would contain +** were this function called until it returns SQLITE_DONE. +** +** If the bCommit parameter is non-zero, this function assumes that the +** caller will keep calling incrVacuumStep() until it returns SQLITE_DONE +** or an error. bCommit is passed true for an auto-vacuum-on-commit +** operation, or false for an incremental vacuum. +*/ +static int incrVacuumStep(BtShared *pBt, Pgno nFin, Pgno iLastPg, int bCommit){ + Pgno nFreeList; /* Number of pages still on the free-list */ + int rc; + + assert( sqlite3_mutex_held(pBt->mutex) ); + assert( iLastPg>nFin ); + + if( !PTRMAP_ISPAGE(pBt, iLastPg) && iLastPg!=PENDING_BYTE_PAGE(pBt) ){ + u8 eType; + Pgno iPtrPage; + + nFreeList = get4byte(&pBt->pPage1->aData[36]); + if( nFreeList==0 ){ + return SQLITE_DONE; + } + + rc = ptrmapGet(pBt, iLastPg, &eType, &iPtrPage); + if( rc!=SQLITE_OK ){ + return rc; + } + if( eType==PTRMAP_ROOTPAGE ){ + return SQLITE_CORRUPT_BKPT; + } + + if( eType==PTRMAP_FREEPAGE ){ + if( bCommit==0 ){ + /* Remove the page from the files free-list. This is not required + ** if bCommit is non-zero. In that case, the free-list will be + ** truncated to zero after this function returns, so it doesn't + ** matter if it still contains some garbage entries. + */ + Pgno iFreePg; + MemPage *pFreePg; + rc = allocateBtreePage(pBt, &pFreePg, &iFreePg, iLastPg, BTALLOC_EXACT); + if( rc!=SQLITE_OK ){ + return rc; + } + assert( iFreePg==iLastPg ); + releasePage(pFreePg); + } + } else { + Pgno iFreePg; /* Index of free page to move pLastPg to */ + MemPage *pLastPg; + u8 eMode = BTALLOC_ANY; /* Mode parameter for allocateBtreePage() */ + Pgno iNear = 0; /* nearby parameter for allocateBtreePage() */ + + rc = btreeGetPage(pBt, iLastPg, &pLastPg, 0); + if( rc!=SQLITE_OK ){ + return rc; + } + + /* If bCommit is zero, this loop runs exactly once and page pLastPg + ** is swapped with the first free page pulled off the free list. + ** + ** On the other hand, if bCommit is greater than zero, then keep + ** looping until a free-page located within the first nFin pages + ** of the file is found. + */ + if( bCommit==0 ){ + eMode = BTALLOC_LE; + iNear = nFin; + } + do { + MemPage *pFreePg; + rc = allocateBtreePage(pBt, &pFreePg, &iFreePg, iNear, eMode); + if( rc!=SQLITE_OK ){ + releasePage(pLastPg); + return rc; + } + releasePage(pFreePg); + }while( bCommit && iFreePg>nFin ); + assert( iFreePgbDoTruncate = 1; + pBt->nPage = iLastPg; + } + return SQLITE_OK; +} + +/* +** The database opened by the first argument is an auto-vacuum database +** nOrig pages in size containing nFree free pages. Return the expected +** size of the database in pages following an auto-vacuum operation. +*/ +static Pgno finalDbSize(BtShared *pBt, Pgno nOrig, Pgno nFree){ + int nEntry; /* Number of entries on one ptrmap page */ + Pgno nPtrmap; /* Number of PtrMap pages to be freed */ + Pgno nFin; /* Return value */ + + nEntry = pBt->usableSize/5; + nPtrmap = (nFree-nOrig+PTRMAP_PAGENO(pBt, nOrig)+nEntry)/nEntry; + nFin = nOrig - nFree - nPtrmap; + if( nOrig>PENDING_BYTE_PAGE(pBt) && nFinpBt; + + sqlite3BtreeEnter(p); + assert( pBt->inTransaction==TRANS_WRITE && p->inTrans==TRANS_WRITE ); + if( !pBt->autoVacuum ){ + rc = SQLITE_DONE; + }else{ + Pgno nOrig = btreePagecount(pBt); + Pgno nFree = get4byte(&pBt->pPage1->aData[36]); + Pgno nFin = finalDbSize(pBt, nOrig, nFree); + + if( nOrig0 ){ + rc = saveAllCursors(pBt, 0, 0); + if( rc==SQLITE_OK ){ + invalidateAllOverflowCache(pBt); + rc = incrVacuumStep(pBt, nFin, nOrig, 0); + } + if( rc==SQLITE_OK ){ + rc = sqlite3PagerWrite(pBt->pPage1->pDbPage); + put4byte(&pBt->pPage1->aData[28], pBt->nPage); + } + }else{ + rc = SQLITE_DONE; + } + } + sqlite3BtreeLeave(p); + return rc; +} + +/* +** This routine is called prior to sqlite3PagerCommit when a transaction +** is committed for an auto-vacuum database. +** +** If SQLITE_OK is returned, then *pnTrunc is set to the number of pages +** the database file should be truncated to during the commit process. +** i.e. the database has been reorganized so that only the first *pnTrunc +** pages are in use. +*/ +static int autoVacuumCommit(BtShared *pBt){ + int rc = SQLITE_OK; + Pager *pPager = pBt->pPager; + VVA_ONLY( int nRef = sqlite3PagerRefcount(pPager); ) + + assert( sqlite3_mutex_held(pBt->mutex) ); + invalidateAllOverflowCache(pBt); + assert(pBt->autoVacuum); + if( !pBt->incrVacuum ){ + Pgno nFin; /* Number of pages in database after autovacuuming */ + Pgno nFree; /* Number of pages on the freelist initially */ + Pgno iFree; /* The next page to be freed */ + Pgno nOrig; /* Database size before freeing */ + + nOrig = btreePagecount(pBt); + if( PTRMAP_ISPAGE(pBt, nOrig) || nOrig==PENDING_BYTE_PAGE(pBt) ){ + /* It is not possible to create a database for which the final page + ** is either a pointer-map page or the pending-byte page. If one + ** is encountered, this indicates corruption. + */ + return SQLITE_CORRUPT_BKPT; + } + + nFree = get4byte(&pBt->pPage1->aData[36]); + nFin = finalDbSize(pBt, nOrig, nFree); + if( nFin>nOrig ) return SQLITE_CORRUPT_BKPT; + if( nFinnFin && rc==SQLITE_OK; iFree--){ + rc = incrVacuumStep(pBt, nFin, iFree, 1); + } + if( (rc==SQLITE_DONE || rc==SQLITE_OK) && nFree>0 ){ + rc = sqlite3PagerWrite(pBt->pPage1->pDbPage); + put4byte(&pBt->pPage1->aData[32], 0); + put4byte(&pBt->pPage1->aData[36], 0); + put4byte(&pBt->pPage1->aData[28], nFin); + pBt->bDoTruncate = 1; + pBt->nPage = nFin; + } + if( rc!=SQLITE_OK ){ + sqlite3PagerRollback(pPager); + } + } + + assert( nRef>=sqlite3PagerRefcount(pPager) ); + return rc; +} + +#else /* ifndef SQLITE_OMIT_AUTOVACUUM */ +# define setChildPtrmaps(x) SQLITE_OK +#endif + +/* +** This routine does the first phase of a two-phase commit. This routine +** causes a rollback journal to be created (if it does not already exist) +** and populated with enough information so that if a power loss occurs +** the database can be restored to its original state by playing back +** the journal. Then the contents of the journal are flushed out to +** the disk. After the journal is safely on oxide, the changes to the +** database are written into the database file and flushed to oxide. +** At the end of this call, the rollback journal still exists on the +** disk and we are still holding all locks, so the transaction has not +** committed. See sqlite3BtreeCommitPhaseTwo() for the second phase of the +** commit process. +** +** This call is a no-op if no write-transaction is currently active on pBt. +** +** Otherwise, sync the database file for the btree pBt. zMaster points to +** the name of a master journal file that should be written into the +** individual journal file, or is NULL, indicating no master journal file +** (single database transaction). +** +** When this is called, the master journal should already have been +** created, populated with this journal pointer and synced to disk. +** +** Once this is routine has returned, the only thing required to commit +** the write-transaction for this database file is to delete the journal. +*/ +SQLITE_PRIVATE int sqlite3BtreeCommitPhaseOne(Btree *p, const char *zMaster){ + int rc = SQLITE_OK; + if( p->inTrans==TRANS_WRITE ){ + BtShared *pBt = p->pBt; + sqlite3BtreeEnter(p); +#ifndef SQLITE_OMIT_AUTOVACUUM + if( pBt->autoVacuum ){ + rc = autoVacuumCommit(pBt); + if( rc!=SQLITE_OK ){ + sqlite3BtreeLeave(p); + return rc; + } + } + if( pBt->bDoTruncate ){ + sqlite3PagerTruncateImage(pBt->pPager, pBt->nPage); + } +#endif + rc = sqlite3PagerCommitPhaseOne(pBt->pPager, zMaster, 0); + sqlite3BtreeLeave(p); + } + return rc; +} + +/* +** This function is called from both BtreeCommitPhaseTwo() and BtreeRollback() +** at the conclusion of a transaction. +*/ +static void btreeEndTransaction(Btree *p){ + BtShared *pBt = p->pBt; + sqlite3 *db = p->db; + assert( sqlite3BtreeHoldsMutex(p) ); + +#ifndef SQLITE_OMIT_AUTOVACUUM + pBt->bDoTruncate = 0; +#endif + if( p->inTrans>TRANS_NONE && db->nVdbeRead>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{ + /* If the handle had any kind of transaction open, decrement the + ** transaction count of the shared btree. If the transaction count + ** reaches 0, set the shared state to TRANS_NONE. The unlockBtreeIfUnused() + ** call below will unlock the pager. */ + if( p->inTrans!=TRANS_NONE ){ + clearAllSharedCacheTableLocks(p); + pBt->nTransaction--; + if( 0==pBt->nTransaction ){ + pBt->inTransaction = TRANS_NONE; + } + } + + /* Set the current transaction state to TRANS_NONE and unlock the + ** pager if this call closed the only read or write transaction. */ + p->inTrans = TRANS_NONE; + unlockBtreeIfUnused(pBt); + } + + btreeIntegrity(p); +} + +/* +** Commit the transaction currently in progress. +** +** This routine implements the second phase of a 2-phase commit. The +** sqlite3BtreeCommitPhaseOne() routine does the first phase and should +** be invoked prior to calling this routine. The sqlite3BtreeCommitPhaseOne() +** routine did all the work of writing information out to disk and flushing the +** contents so that they are written onto the disk platter. All this +** routine has to do is delete or truncate or zero the header in the +** the rollback journal (which causes the transaction to commit) and +** drop locks. +** +** Normally, if an error occurs while the pager layer is attempting to +** finalize the underlying journal file, this function returns an error and +** the upper layer will attempt a rollback. However, if the second argument +** is non-zero then this b-tree transaction is part of a multi-file +** transaction. In this case, the transaction has already been committed +** (by deleting a master journal file) and the caller will ignore this +** functions return code. So, even if an error occurs in the pager layer, +** reset the b-tree objects internal state to indicate that the write +** transaction has been closed. This is quite safe, as the pager will have +** transitioned to the error state. +** +** This will release the write lock on the database file. If there +** are no active cursors, it also releases the read lock. +*/ +SQLITE_PRIVATE int sqlite3BtreeCommitPhaseTwo(Btree *p, int bCleanup){ + + if( p->inTrans==TRANS_NONE ) return SQLITE_OK; + sqlite3BtreeEnter(p); + btreeIntegrity(p); + + /* If the handle has a write-transaction open, commit the shared-btrees + ** transaction and set the shared state to TRANS_READ. + */ + if( p->inTrans==TRANS_WRITE ){ + int rc; + BtShared *pBt = p->pBt; + assert( pBt->inTransaction==TRANS_WRITE ); + assert( pBt->nTransaction>0 ); + rc = sqlite3PagerCommitPhaseTwo(pBt->pPager); + if( rc!=SQLITE_OK && bCleanup==0 ){ + sqlite3BtreeLeave(p); + return rc; + } + p->iDataVersion--; /* Compensate for pPager->iDataVersion++; */ + pBt->inTransaction = TRANS_READ; + btreeClearHasContent(pBt); + } + + btreeEndTransaction(p); + sqlite3BtreeLeave(p); + return SQLITE_OK; +} + +/* +** Do both phases of a commit. +*/ +SQLITE_PRIVATE int sqlite3BtreeCommit(Btree *p){ + int rc; + sqlite3BtreeEnter(p); + rc = sqlite3BtreeCommitPhaseOne(p, 0); + if( rc==SQLITE_OK ){ + rc = sqlite3BtreeCommitPhaseTwo(p, 0); + } + sqlite3BtreeLeave(p); + return rc; +} + +/* +** This routine sets the state to CURSOR_FAULT and the error +** code to errCode for every cursor on any BtShared that pBtree +** references. Or if the writeOnly flag is set to 1, then only +** trip write cursors and leave read cursors unchanged. +** +** Every cursor is a candidate to be tripped, including cursors +** that belong to other database connections that happen to be +** sharing the cache with pBtree. +** +** This routine gets called when a rollback occurs. If the writeOnly +** flag is true, then only write-cursors need be tripped - read-only +** cursors save their current positions so that they may continue +** following the rollback. Or, if writeOnly is false, all cursors are +** tripped. In general, writeOnly is false if the transaction being +** rolled back modified the database schema. In this case b-tree root +** pages may be moved or deleted from the database altogether, making +** it unsafe for read cursors to continue. +** +** If the writeOnly flag is true and an error is encountered while +** saving the current position of a read-only cursor, all cursors, +** including all read-cursors are tripped. +** +** SQLITE_OK is returned if successful, or if an error occurs while +** saving a cursor position, an SQLite error code. +*/ +SQLITE_PRIVATE int sqlite3BtreeTripAllCursors(Btree *pBtree, int errCode, int writeOnly){ + BtCursor *p; + int rc = SQLITE_OK; + + assert( (writeOnly==0 || writeOnly==1) && BTCF_WriteFlag==1 ); + if( pBtree ){ + sqlite3BtreeEnter(pBtree); + for(p=pBtree->pBt->pCursor; p; p=p->pNext){ + int i; + if( writeOnly && (p->curFlags & BTCF_WriteFlag)==0 ){ + if( p->eState==CURSOR_VALID || p->eState==CURSOR_SKIPNEXT ){ + rc = saveCursorPosition(p); + if( rc!=SQLITE_OK ){ + (void)sqlite3BtreeTripAllCursors(pBtree, rc, 0); + break; + } + } + }else{ + sqlite3BtreeClearCursor(p); + p->eState = CURSOR_FAULT; + p->skipNext = errCode; + } + for(i=0; i<=p->iPage; i++){ + releasePage(p->apPage[i]); + p->apPage[i] = 0; + } + } + sqlite3BtreeLeave(pBtree); + } + return rc; +} + +/* +** Rollback the transaction in progress. +** +** If tripCode is not SQLITE_OK then cursors will be invalidated (tripped). +** Only write cursors are tripped if writeOnly is true but all cursors are +** tripped if writeOnly is false. Any attempt to use +** a tripped cursor will result in an error. +** +** This will release the write lock on the database file. If there +** are no active cursors, it also releases the read lock. +*/ +SQLITE_PRIVATE int sqlite3BtreeRollback(Btree *p, int tripCode, int writeOnly){ + int rc; + BtShared *pBt = p->pBt; + MemPage *pPage1; + + assert( writeOnly==1 || writeOnly==0 ); + assert( tripCode==SQLITE_ABORT_ROLLBACK || tripCode==SQLITE_OK ); + sqlite3BtreeEnter(p); + if( tripCode==SQLITE_OK ){ + rc = tripCode = saveAllCursors(pBt, 0, 0); + if( rc ) writeOnly = 0; + }else{ + rc = SQLITE_OK; + } + if( tripCode ){ + int rc2 = sqlite3BtreeTripAllCursors(p, tripCode, writeOnly); + assert( rc==SQLITE_OK || (writeOnly==0 && rc2==SQLITE_OK) ); + if( rc2!=SQLITE_OK ) rc = rc2; + } + btreeIntegrity(p); + + if( p->inTrans==TRANS_WRITE ){ + int rc2; + + assert( TRANS_WRITE==pBt->inTransaction ); + rc2 = sqlite3PagerRollback(pBt->pPager); + if( rc2!=SQLITE_OK ){ + rc = rc2; + } + + /* The rollback may have destroyed the pPage1->aData value. So + ** call btreeGetPage() on page 1 again to make + ** sure pPage1->aData is set correctly. */ + if( btreeGetPage(pBt, 1, &pPage1, 0)==SQLITE_OK ){ + int nPage = get4byte(28+(u8*)pPage1->aData); + testcase( nPage==0 ); + if( nPage==0 ) sqlite3PagerPagecount(pBt->pPager, &nPage); + testcase( pBt->nPage!=nPage ); + pBt->nPage = nPage; + releasePage(pPage1); + } + assert( countValidCursors(pBt, 1)==0 ); + pBt->inTransaction = TRANS_READ; + btreeClearHasContent(pBt); + } + + btreeEndTransaction(p); + sqlite3BtreeLeave(p); + return rc; +} + +/* +** Start a statement subtransaction. The subtransaction can be rolled +** back independently of the main transaction. You must start a transaction +** before starting a subtransaction. The subtransaction is ended automatically +** if the main transaction commits or rolls back. +** +** Statement subtransactions are used around individual SQL statements +** that are contained within a BEGIN...COMMIT block. If a constraint +** error occurs within the statement, the effect of that one statement +** can be rolled back without having to rollback the entire transaction. +** +** A statement sub-transaction is implemented as an anonymous savepoint. The +** value passed as the second parameter is the total number of savepoints, +** including the new anonymous savepoint, open on the B-Tree. i.e. if there +** are no active savepoints and no other statement-transactions open, +** iStatement is 1. This anonymous savepoint can be released or rolled back +** using the sqlite3BtreeSavepoint() function. +*/ +SQLITE_PRIVATE int sqlite3BtreeBeginStmt(Btree *p, int iStatement){ + int rc; + BtShared *pBt = p->pBt; + sqlite3BtreeEnter(p); + assert( p->inTrans==TRANS_WRITE ); + assert( (pBt->btsFlags & BTS_READ_ONLY)==0 ); + assert( iStatement>0 ); + assert( iStatement>p->db->nSavepoint ); + assert( pBt->inTransaction==TRANS_WRITE ); + /* At the pager level, a statement transaction is a savepoint with + ** an index greater than all savepoints created explicitly using + ** SQL statements. It is illegal to open, release or rollback any + ** such savepoints while the statement transaction savepoint is active. + */ + rc = sqlite3PagerOpenSavepoint(pBt->pPager, iStatement); + sqlite3BtreeLeave(p); + return rc; +} + +/* +** The second argument to this function, op, is always SAVEPOINT_ROLLBACK +** or SAVEPOINT_RELEASE. This function either releases or rolls back the +** savepoint identified by parameter iSavepoint, depending on the value +** of op. +** +** Normally, iSavepoint is greater than or equal to zero. However, if op is +** SAVEPOINT_ROLLBACK, then iSavepoint may also be -1. In this case the +** contents of the entire transaction are rolled back. This is different +** from a normal transaction rollback, as no locks are released and the +** transaction remains open. +*/ +SQLITE_PRIVATE int sqlite3BtreeSavepoint(Btree *p, int op, int iSavepoint){ + int rc = SQLITE_OK; + if( p && p->inTrans==TRANS_WRITE ){ + BtShared *pBt = p->pBt; + assert( op==SAVEPOINT_RELEASE || op==SAVEPOINT_ROLLBACK ); + assert( iSavepoint>=0 || (iSavepoint==-1 && op==SAVEPOINT_ROLLBACK) ); + sqlite3BtreeEnter(p); + rc = sqlite3PagerSavepoint(pBt->pPager, op, iSavepoint); + if( rc==SQLITE_OK ){ + if( iSavepoint<0 && (pBt->btsFlags & BTS_INITIALLY_EMPTY)!=0 ){ + pBt->nPage = 0; + } + rc = newDatabase(pBt); + pBt->nPage = get4byte(28 + pBt->pPage1->aData); + + /* The database size was written into the offset 28 of the header + ** when the transaction started, so we know that the value at offset + ** 28 is nonzero. */ + assert( pBt->nPage>0 ); + } + sqlite3BtreeLeave(p); + } + return rc; +} + +/* +** Create a new cursor for the BTree whose root is on the page +** iTable. If a read-only cursor is requested, it is assumed that +** the caller already has at least a read-only transaction open +** on the database already. If a write-cursor is requested, then +** the caller is assumed to have an open write transaction. +** +** If the BTREE_WRCSR bit of wrFlag is clear, then the cursor can only +** be used for reading. If the BTREE_WRCSR bit is set, then the cursor +** can be used for reading or for writing if other conditions for writing +** are also met. These are the conditions that must be met in order +** for writing to be allowed: +** +** 1: The cursor must have been opened with wrFlag containing BTREE_WRCSR +** +** 2: Other database connections that share the same pager cache +** but which are not in the READ_UNCOMMITTED state may not have +** cursors open with wrFlag==0 on the same table. Otherwise +** the changes made by this write cursor would be visible to +** the read cursors in the other database connection. +** +** 3: The database must be writable (not on read-only media) +** +** 4: There must be an active transaction. +** +** The BTREE_FORDELETE bit of wrFlag may optionally be set if BTREE_WRCSR +** is set. If FORDELETE is set, that is a hint to the implementation that +** this cursor will only be used to seek to and delete entries of an index +** as part of a larger DELETE statement. The FORDELETE hint is not used by +** this implementation. But in a hypothetical alternative storage engine +** in which index entries are automatically deleted when corresponding table +** rows are deleted, the FORDELETE flag is a hint that all SEEK and DELETE +** operations on this cursor can be no-ops and all READ operations can +** return a null row (2-bytes: 0x01 0x00). +** +** No checking is done to make sure that page iTable really is the +** root page of a b-tree. If it is not, then the cursor acquired +** will not work correctly. +** +** 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 */ + int iTable, /* Root page of table to open */ + int wrFlag, /* 1 to write. 0 read-only */ + struct KeyInfo *pKeyInfo, /* First arg to comparison function */ + BtCursor *pCur /* Space for new cursor */ +){ + BtShared *pBt = p->pBt; /* Shared b-tree handle */ + BtCursor *pX; /* Looping over other all cursors */ + + assert( sqlite3BtreeHoldsMutex(p) ); + assert( wrFlag==0 + || wrFlag==BTREE_WRCSR + || wrFlag==(BTREE_WRCSR|BTREE_FORDELETE) + ); + + /* The following assert statements verify that if this is a sharable + ** b-tree database, the connection is holding the required table locks, + ** and that no other connection has any open cursor that conflicts with + ** this lock. */ + assert( hasSharedCacheTableLock(p, iTable, pKeyInfo!=0, (wrFlag?2:1)) ); + assert( wrFlag==0 || !hasReadConflicts(p, iTable) ); + + /* Assert that the caller has opened the required transaction. */ + assert( p->inTrans>TRANS_NONE ); + assert( wrFlag==0 || p->inTrans==TRANS_WRITE ); + assert( pBt->pPage1 && pBt->pPage1->aData ); + assert( wrFlag==0 || (pBt->btsFlags & BTS_READ_ONLY)==0 ); + + if( wrFlag ){ + allocateTempSpace(pBt); + if( pBt->pTmpSpace==0 ) return SQLITE_NOMEM_BKPT; + } + if( iTable==1 && btreePagecount(pBt)==0 ){ + assert( wrFlag==0 ); + iTable = 0; + } + + /* Now that no other errors can occur, finish filling in the BtCursor + ** variables and link the cursor into the BtShared list. */ + pCur->pgnoRoot = (Pgno)iTable; + pCur->iPage = -1; + pCur->pKeyInfo = pKeyInfo; + pCur->pBtree = p; + pCur->pBt = pBt; + pCur->curFlags = wrFlag ? BTCF_WriteFlag : 0; + pCur->curPagerFlags = wrFlag ? 0 : PAGER_GET_READONLY; + /* If there are two or more cursors on the same btree, then all such + ** cursors *must* have the BTCF_Multiple flag set. */ + for(pX=pBt->pCursor; pX; pX=pX->pNext){ + if( pX->pgnoRoot==(Pgno)iTable ){ + pX->curFlags |= BTCF_Multiple; + pCur->curFlags |= BTCF_Multiple; + } + } + pCur->pNext = pBt->pCursor; + pBt->pCursor = pCur; + pCur->eState = CURSOR_INVALID; + return SQLITE_OK; +} +SQLITE_PRIVATE int sqlite3BtreeCursor( + Btree *p, /* The btree */ + int iTable, /* Root page of table to open */ + int wrFlag, /* 1 to write. 0 read-only */ + struct KeyInfo *pKeyInfo, /* First arg to xCompare() */ + BtCursor *pCur /* Write new cursor here */ +){ + int rc; + if( iTable<1 ){ + rc = SQLITE_CORRUPT_BKPT; + }else{ + sqlite3BtreeEnter(p); + rc = btreeCursor(p, iTable, wrFlag, pKeyInfo, pCur); + sqlite3BtreeLeave(p); + } + return rc; +} + +/* +** Return the size of a BtCursor object in bytes. +** +** This interfaces is needed so that users of cursors can preallocate +** sufficient storage to hold a cursor. The BtCursor object is opaque +** to users so they cannot do the sizeof() themselves - they must call +** this routine. +*/ +SQLITE_PRIVATE int sqlite3BtreeCursorSize(void){ + 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)); +} + +/* +** Close a cursor. The read lock on the database file is released +** when the last cursor is closed. +*/ +SQLITE_PRIVATE int sqlite3BtreeCloseCursor(BtCursor *pCur){ + Btree *pBtree = pCur->pBtree; + if( pBtree ){ + int i; + BtShared *pBt = pCur->pBt; + sqlite3BtreeEnter(pBtree); + sqlite3BtreeClearCursor(pCur); + assert( pBt->pCursor!=0 ); + if( pBt->pCursor==pCur ){ + pBt->pCursor = pCur->pNext; + }else{ + BtCursor *pPrev = pBt->pCursor; + do{ + if( pPrev->pNext==pCur ){ + pPrev->pNext = pCur->pNext; + break; + } + pPrev = pPrev->pNext; + }while( ALWAYS(pPrev) ); + } + for(i=0; i<=pCur->iPage; i++){ + releasePage(pCur->apPage[i]); + } + unlockBtreeIfUnused(pBt); + sqlite3_free(pCur->aOverflow); + /* sqlite3_free(pCur); */ + sqlite3BtreeLeave(pBtree); + } + return SQLITE_OK; +} + +/* +** Make sure the BtCursor* given in the argument has a valid +** BtCursor.info structure. If it is not already valid, call +** btreeParseCell() to fill it in. +** +** BtCursor.info is a cache of the information in the current cell. +** Using this cache reduces the number of calls to btreeParseCell(). +*/ +#ifndef NDEBUG + static void assertCellInfo(BtCursor *pCur){ + CellInfo info; + int iPage = pCur->iPage; + memset(&info, 0, sizeof(info)); + btreeParseCell(pCur->apPage[iPage], pCur->aiIdx[iPage], &info); + assert( CORRUPT_DB || memcmp(&info, &pCur->info, sizeof(info))==0 ); + } +#else + #define assertCellInfo(x) +#endif +static SQLITE_NOINLINE void getCellInfo(BtCursor *pCur){ + if( pCur->info.nSize==0 ){ + int iPage = pCur->iPage; + pCur->curFlags |= BTCF_ValidNKey; + btreeParseCell(pCur->apPage[iPage],pCur->aiIdx[iPage],&pCur->info); + }else{ + assertCellInfo(pCur); + } +} + +#ifndef NDEBUG /* The next routine used only within assert() statements */ +/* +** Return true if the given BtCursor is valid. A valid cursor is one +** that is currently pointing to a row in a (non-empty) table. +** This is a verification routine is used only within assert() statements. +*/ +SQLITE_PRIVATE int sqlite3BtreeCursorIsValid(BtCursor *pCur){ + return pCur && pCur->eState==CURSOR_VALID; +} +#endif /* NDEBUG */ + +/* +** Return the value of the integer key or "rowid" for a table btree. +** This routine is only valid for a cursor that is pointing into a +** ordinary table btree. If the cursor points to an index btree or +** is invalid, the result of this routine is undefined. +*/ +SQLITE_PRIVATE i64 sqlite3BtreeIntegerKey(BtCursor *pCur){ + assert( cursorHoldsMutex(pCur) ); + assert( pCur->eState==CURSOR_VALID ); + assert( pCur->curIntKey ); + getCellInfo(pCur); + return pCur->info.nKey; +} + +/* +** Return the number of bytes of payload for the entry that pCur is +** currently pointing to. For table btrees, this will be the amount +** of data. For index btrees, this will be the size of the key. +** +** The caller must guarantee that the cursor is pointing to a non-NULL +** valid entry. In other words, the calling procedure must guarantee +** that the cursor has Cursor.eState==CURSOR_VALID. +*/ +SQLITE_PRIVATE u32 sqlite3BtreePayloadSize(BtCursor *pCur){ + assert( cursorHoldsMutex(pCur) ); + assert( pCur->eState==CURSOR_VALID ); + getCellInfo(pCur); + return pCur->info.nPayload; +} + +/* +** Given the page number of an overflow page in the database (parameter +** ovfl), this function finds the page number of the next page in the +** linked list of overflow pages. If possible, it uses the auto-vacuum +** pointer-map data instead of reading the content of page ovfl to do so. +** +** If an error occurs an SQLite error code is returned. Otherwise: +** +** The page number of the next overflow page in the linked list is +** written to *pPgnoNext. If page ovfl is the last page in its linked +** list, *pPgnoNext is set to zero. +** +** If ppPage is not NULL, and a reference to the MemPage object corresponding +** to page number pOvfl was obtained, then *ppPage is set to point to that +** reference. It is the responsibility of the caller to call releasePage() +** on *ppPage to free the reference. In no reference was obtained (because +** the pointer-map was used to obtain the value for *pPgnoNext), then +** *ppPage is set to zero. +*/ +static int getOverflowPage( + BtShared *pBt, /* The database file */ + Pgno ovfl, /* Current overflow page number */ + MemPage **ppPage, /* OUT: MemPage handle (may be NULL) */ + Pgno *pPgnoNext /* OUT: Next overflow page number */ +){ + Pgno next = 0; + MemPage *pPage = 0; + int rc = SQLITE_OK; + + assert( sqlite3_mutex_held(pBt->mutex) ); + assert(pPgnoNext); + +#ifndef SQLITE_OMIT_AUTOVACUUM + /* Try to find the next page in the overflow list using the + ** autovacuum pointer-map pages. Guess that the next page in + ** the overflow list is page number (ovfl+1). If that guess turns + ** out to be wrong, fall back to loading the data of page + ** number ovfl to determine the next page number. + */ + if( pBt->autoVacuum ){ + Pgno pgno; + Pgno iGuess = ovfl+1; + u8 eType; + + while( PTRMAP_ISPAGE(pBt, iGuess) || iGuess==PENDING_BYTE_PAGE(pBt) ){ + iGuess++; + } + + if( iGuess<=btreePagecount(pBt) ){ + rc = ptrmapGet(pBt, iGuess, &eType, &pgno); + if( rc==SQLITE_OK && eType==PTRMAP_OVERFLOW2 && pgno==ovfl ){ + next = iGuess; + rc = SQLITE_DONE; + } + } + } +#endif + + assert( next==0 || rc==SQLITE_DONE ); + if( rc==SQLITE_OK ){ + rc = btreeGetPage(pBt, ovfl, &pPage, (ppPage==0) ? PAGER_GET_READONLY : 0); + assert( rc==SQLITE_OK || pPage==0 ); + if( rc==SQLITE_OK ){ + next = get4byte(pPage->aData); + } + } + + *pPgnoNext = next; + if( ppPage ){ + *ppPage = pPage; + }else{ + releasePage(pPage); + } + return (rc==SQLITE_DONE ? SQLITE_OK : rc); +} + +/* +** Copy data from a buffer to a page, or from a page to a buffer. +** +** pPayload is a pointer to data stored on database page pDbPage. +** If argument eOp is false, then nByte bytes of data are copied +** from pPayload to the buffer pointed at by pBuf. If eOp is true, +** then sqlite3PagerWrite() is called on pDbPage and nByte bytes +** of data are copied from the buffer pBuf to pPayload. +** +** SQLITE_OK is returned on success, otherwise an error code. +*/ +static int copyPayload( + void *pPayload, /* Pointer to page data */ + void *pBuf, /* Pointer to buffer */ + int nByte, /* Number of bytes to copy */ + int eOp, /* 0 -> copy from page, 1 -> copy to page */ + DbPage *pDbPage /* Page containing pPayload */ +){ + if( eOp ){ + /* Copy data from buffer to page (a write operation) */ + int rc = sqlite3PagerWrite(pDbPage); + if( rc!=SQLITE_OK ){ + return rc; + } + memcpy(pPayload, pBuf, nByte); + }else{ + /* Copy data from page to buffer (a read operation) */ + memcpy(pBuf, pPayload, nByte); + } + return SQLITE_OK; +} + +/* +** This function is used to read or overwrite payload information +** for the entry that the pCur cursor is pointing to. The eOp +** argument is interpreted as follows: +** +** 0: The operation is a read. Populate the overflow cache. +** 1: The operation is a write. Populate the overflow cache. +** 2: The operation is a read. Do not populate the overflow cache. +** +** A total of "amt" bytes are read or written beginning at "offset". +** Data is read to or from the buffer pBuf. +** +** The content being read or written might appear on the main page +** or be scattered out on multiple overflow pages. +** +** If the current cursor entry uses one or more overflow pages and the +** eOp argument is not 2, this function may allocate space for and lazily +** populates the overflow page-list cache array (BtCursor.aOverflow). +** Subsequent calls use this cache to make seeking to the supplied offset +** more efficient. +** +** Once an overflow page-list cache has been allocated, it may be +** invalidated if some other cursor writes to the same table, or if +** the cursor is moved to a different row. Additionally, in auto-vacuum +** mode, the following events may invalidate an overflow page-list cache. +** +** * An incremental vacuum, +** * A commit in auto_vacuum="full" mode, +** * Creating a table (may require moving an overflow page). +*/ +static int accessPayload( + BtCursor *pCur, /* Cursor pointing to entry to read from */ + u32 offset, /* Begin reading this far into payload */ + u32 amt, /* Read this many bytes */ + unsigned char *pBuf, /* Write the bytes into this buffer */ + int eOp /* zero to read. non-zero to write. */ +){ + unsigned char *aPayload; + int rc = SQLITE_OK; + int iIdx = 0; + MemPage *pPage = pCur->apPage[pCur->iPage]; /* Btree page of current entry */ + BtShared *pBt = pCur->pBt; /* Btree this cursor belongs to */ +#ifdef SQLITE_DIRECT_OVERFLOW_READ + unsigned char * const pBufStart = pBuf; + int bEnd; /* True if reading to end of data */ +#endif + + assert( pPage ); + assert( pCur->eState==CURSOR_VALID ); + assert( pCur->aiIdx[pCur->iPage]nCell ); + assert( cursorHoldsMutex(pCur) ); + assert( eOp!=2 || offset==0 ); /* Always start from beginning for eOp==2 */ + + getCellInfo(pCur); + aPayload = pCur->info.pPayload; +#ifdef SQLITE_DIRECT_OVERFLOW_READ + bEnd = offset+amt==pCur->info.nPayload; +#endif + assert( offset+amt <= pCur->info.nPayload ); + + assert( aPayload > pPage->aData ); + if( (uptr)(aPayload - pPage->aData) > (pBt->usableSize - pCur->info.nLocal) ){ + /* Trying to read or write past the end of the data is an error. The + ** conditional above is really: + ** &aPayload[pCur->info.nLocal] > &pPage->aData[pBt->usableSize] + ** but is recast into its current form to avoid integer overflow problems + */ + return SQLITE_CORRUPT_BKPT; + } + + /* Check if data must be read/written to/from the btree page itself. */ + if( offsetinfo.nLocal ){ + int a = amt; + if( a+offset>pCur->info.nLocal ){ + a = pCur->info.nLocal - offset; + } + rc = copyPayload(&aPayload[offset], pBuf, a, (eOp & 0x01), pPage->pDbPage); + offset = 0; + pBuf += a; + amt -= a; + }else{ + offset -= pCur->info.nLocal; + } + + + if( rc==SQLITE_OK && amt>0 ){ + const u32 ovflSize = pBt->usableSize - 4; /* Bytes content per ovfl page */ + Pgno nextPage; + + nextPage = get4byte(&aPayload[pCur->info.nLocal]); + + /* If the BtCursor.aOverflow[] has not been allocated, allocate it now. + ** Except, do not allocate aOverflow[] for eOp==2. + ** + ** The aOverflow[] array is sized at one entry for each overflow page + ** in the overflow chain. The page number of the first overflow page is + ** stored in aOverflow[0], etc. A value of 0 in the aOverflow[] array + ** means "not yet known" (the cache is lazily populated). + */ + if( eOp!=2 && (pCur->curFlags & BTCF_ValidOvfl)==0 ){ + int nOvfl = (pCur->info.nPayload-pCur->info.nLocal+ovflSize-1)/ovflSize; + if( nOvfl>pCur->nOvflAlloc ){ + Pgno *aNew = (Pgno*)sqlite3Realloc( + pCur->aOverflow, nOvfl*2*sizeof(Pgno) + ); + if( aNew==0 ){ + rc = SQLITE_NOMEM_BKPT; + }else{ + pCur->nOvflAlloc = nOvfl*2; + pCur->aOverflow = aNew; + } + } + if( rc==SQLITE_OK ){ + memset(pCur->aOverflow, 0, nOvfl*sizeof(Pgno)); + pCur->curFlags |= BTCF_ValidOvfl; + } + } + + /* If the overflow page-list cache has been allocated and the + ** entry for the first required overflow page is valid, skip + ** directly to it. + */ + if( (pCur->curFlags & BTCF_ValidOvfl)!=0 + && pCur->aOverflow[offset/ovflSize] + ){ + iIdx = (offset/ovflSize); + nextPage = pCur->aOverflow[iIdx]; + offset = (offset%ovflSize); + } + + for( ; rc==SQLITE_OK && amt>0 && nextPage; iIdx++){ + + /* If required, populate the overflow page-list cache. */ + if( (pCur->curFlags & BTCF_ValidOvfl)!=0 ){ + assert( pCur->aOverflow[iIdx]==0 + || pCur->aOverflow[iIdx]==nextPage + || CORRUPT_DB ); + pCur->aOverflow[iIdx] = nextPage; + } + + if( offset>=ovflSize ){ + /* The only reason to read this page is to obtain the page + ** number for the next page in the overflow chain. The page + ** data is not required. So first try to lookup the overflow + ** page-list cache, if any, then fall back to the getOverflowPage() + ** function. + ** + ** Note that the aOverflow[] array must be allocated because eOp!=2 + ** here. If eOp==2, then offset==0 and this branch is never taken. + */ + assert( eOp!=2 ); + assert( pCur->curFlags & BTCF_ValidOvfl ); + assert( pCur->pBtree->db==pBt->db ); + if( pCur->aOverflow[iIdx+1] ){ + nextPage = pCur->aOverflow[iIdx+1]; + }else{ + rc = getOverflowPage(pBt, nextPage, 0, &nextPage); + } + offset -= ovflSize; + }else{ + /* Need to read this page properly. It contains some of the + ** range of data that is being read (eOp==0) or written (eOp!=0). + */ +#ifdef SQLITE_DIRECT_OVERFLOW_READ + sqlite3_file *fd; +#endif + int a = amt; + if( a + offset > ovflSize ){ + a = ovflSize - offset; + } + +#ifdef SQLITE_DIRECT_OVERFLOW_READ + /* If all the following are true: + ** + ** 1) this is a read operation, and + ** 2) data is required from the start of this overflow page, and + ** 3) the database is file-backed, and + ** 4) there is no open write-transaction, and + ** 5) the database is not a WAL database, + ** 6) all data from the page is being read. + ** 7) at least 4 bytes have already been read into the output buffer + ** + ** then data can be read directly from the database file into the + ** output buffer, bypassing the page-cache altogether. This speeds + ** up loading large records that span many overflow pages. + */ + if( (eOp&0x01)==0 /* (1) */ + && offset==0 /* (2) */ + && (bEnd || a==ovflSize) /* (6) */ + && pBt->inTransaction==TRANS_READ /* (4) */ + && (fd = sqlite3PagerFile(pBt->pPager))->pMethods /* (3) */ + && 0==sqlite3PagerUseWal(pBt->pPager) /* (5) */ + && &pBuf[-4]>=pBufStart /* (7) */ + ){ + u8 aSave[4]; + u8 *aWrite = &pBuf[-4]; + assert( aWrite>=pBufStart ); /* hence (7) */ + memcpy(aSave, aWrite, 4); + rc = sqlite3OsRead(fd, aWrite, a+4, (i64)pBt->pageSize*(nextPage-1)); + nextPage = get4byte(aWrite); + memcpy(aWrite, aSave, 4); + }else +#endif + + { + DbPage *pDbPage; + rc = sqlite3PagerGet(pBt->pPager, nextPage, &pDbPage, + ((eOp&0x01)==0 ? PAGER_GET_READONLY : 0) + ); + if( rc==SQLITE_OK ){ + aPayload = sqlite3PagerGetData(pDbPage); + nextPage = get4byte(aPayload); + rc = copyPayload(&aPayload[offset+4], pBuf, a, (eOp&0x01), pDbPage); + sqlite3PagerUnref(pDbPage); + offset = 0; + } + } + amt -= a; + pBuf += a; + } + } + } + + if( rc==SQLITE_OK && amt>0 ){ + return SQLITE_CORRUPT_BKPT; + } + return rc; +} + +/* +** Read part of the key associated with cursor pCur. Exactly +** "amt" bytes will be transferred into pBuf[]. The transfer +** begins at "offset". +** +** The caller must ensure that pCur is pointing to a valid row +** in the table. +** +** Return SQLITE_OK on success or an error code if anything goes +** wrong. An error is returned if "offset+amt" is larger than +** the available payload. +*/ +SQLITE_PRIVATE int sqlite3BtreeKey(BtCursor *pCur, u32 offset, u32 amt, void *pBuf){ + assert( cursorHoldsMutex(pCur) ); + assert( pCur->eState==CURSOR_VALID ); + assert( pCur->iPage>=0 && pCur->apPage[pCur->iPage] ); + assert( pCur->aiIdx[pCur->iPage]apPage[pCur->iPage]->nCell ); + return accessPayload(pCur, offset, amt, (unsigned char*)pBuf, 0); +} + +/* +** Read part of the data associated with cursor pCur. Exactly +** "amt" bytes will be transfered into pBuf[]. The transfer +** begins at "offset". +** +** Return SQLITE_OK on success or an error code if anything goes +** wrong. An error is returned if "offset+amt" is larger than +** the available payload. +*/ +SQLITE_PRIVATE int sqlite3BtreeData(BtCursor *pCur, u32 offset, u32 amt, void *pBuf){ + int rc; + +#ifndef SQLITE_OMIT_INCRBLOB + if ( pCur->eState==CURSOR_INVALID ){ + return SQLITE_ABORT; + } +#endif + + assert( cursorOwnsBtShared(pCur) ); + rc = restoreCursorPosition(pCur); + if( rc==SQLITE_OK ){ + assert( pCur->eState==CURSOR_VALID ); + assert( pCur->iPage>=0 && pCur->apPage[pCur->iPage] ); + assert( pCur->aiIdx[pCur->iPage]apPage[pCur->iPage]->nCell ); + rc = accessPayload(pCur, offset, amt, pBuf, 0); + } + return rc; +} + +/* +** Return a pointer to payload information from the entry that the +** pCur cursor is pointing to. The pointer is to the beginning of +** the key if index btrees (pPage->intKey==0) and is the data for +** table btrees (pPage->intKey==1). The number of bytes of available +** key/data is written into *pAmt. If *pAmt==0, then the value +** returned will not be a valid pointer. +** +** This routine is an optimization. It is common for the entire key +** and data to fit on the local page and for there to be no overflow +** pages. When that is so, this routine can be used to access the +** key and data without making a copy. If the key and/or data spills +** onto overflow pages, then accessPayload() must be used to reassemble +** the key/data and copy it into a preallocated buffer. +** +** The pointer returned by this routine looks directly into the cached +** page of the database. The data might change or move the next time +** any btree routine is called. +*/ +static const void *fetchPayload( + BtCursor *pCur, /* Cursor pointing to entry to read from */ + u32 *pAmt /* Write the number of available bytes here */ +){ + u32 amt; + assert( pCur!=0 && pCur->iPage>=0 && pCur->apPage[pCur->iPage]); + assert( pCur->eState==CURSOR_VALID ); + assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) ); + assert( cursorOwnsBtShared(pCur) ); + assert( pCur->aiIdx[pCur->iPage]apPage[pCur->iPage]->nCell ); + assert( pCur->info.nSize>0 ); + assert( pCur->info.pPayload>pCur->apPage[pCur->iPage]->aData || CORRUPT_DB ); + assert( pCur->info.pPayloadapPage[pCur->iPage]->aDataEnd ||CORRUPT_DB); + amt = (int)(pCur->apPage[pCur->iPage]->aDataEnd - pCur->info.pPayload); + if( pCur->info.nLocalinfo.nLocal; + *pAmt = amt; + return (void*)pCur->info.pPayload; +} + + +/* +** For the entry that cursor pCur is point to, return as +** many bytes of the key or data as are available on the local +** b-tree page. Write the number of available bytes into *pAmt. +** +** The pointer returned is ephemeral. The key/data may move +** or be destroyed on the next call to any Btree routine, +** including calls from other threads against the same cache. +** Hence, a mutex on the BtShared should be held prior to calling +** this routine. +** +** These routines is used to get quick access to key and data +** in the common case where no overflow pages are used. +*/ +SQLITE_PRIVATE const void *sqlite3BtreePayloadFetch(BtCursor *pCur, u32 *pAmt){ + return fetchPayload(pCur, pAmt); +} + + +/* +** Move the cursor down to a new child page. The newPgno argument is the +** page number of the child page to move to. +** +** This function returns SQLITE_CORRUPT if the page-header flags field of +** the new child page does not match the flags field of the parent (i.e. +** if an intkey page appears to be the parent of a non-intkey page, or +** vice-versa). +*/ +static int moveToChild(BtCursor *pCur, u32 newPgno){ + BtShared *pBt = pCur->pBt; + + assert( cursorOwnsBtShared(pCur) ); + assert( pCur->eState==CURSOR_VALID ); + assert( pCur->iPageiPage>=0 ); + if( pCur->iPage>=(BTCURSOR_MAX_DEPTH-1) ){ + return SQLITE_CORRUPT_BKPT; + } + pCur->info.nSize = 0; + pCur->curFlags &= ~(BTCF_ValidNKey|BTCF_ValidOvfl); + pCur->iPage++; + pCur->aiIdx[pCur->iPage] = 0; + return getAndInitPage(pBt, newPgno, &pCur->apPage[pCur->iPage], + pCur, pCur->curPagerFlags); +} + +#if SQLITE_DEBUG +/* +** Page pParent is an internal (non-leaf) tree page. This function +** asserts that page number iChild is the left-child if the iIdx'th +** cell in page pParent. Or, if iIdx is equal to the total number of +** cells in pParent, that page number iChild is the right-child of +** the page. +*/ +static void assertParentIndex(MemPage *pParent, int iIdx, Pgno iChild){ + if( CORRUPT_DB ) return; /* The conditions tested below might not be true + ** in a corrupt database */ + assert( iIdx<=pParent->nCell ); + if( iIdx==pParent->nCell ){ + assert( get4byte(&pParent->aData[pParent->hdrOffset+8])==iChild ); + }else{ + assert( get4byte(findCell(pParent, iIdx))==iChild ); + } +} +#else +# define assertParentIndex(x,y,z) +#endif + +/* +** Move the cursor up to the parent page. +** +** pCur->idx is set to the cell index that contains the pointer +** to the page we are coming from. If we are coming from the +** right-most child page then pCur->idx is set to one more than +** the largest cell index. +*/ +static void moveToParent(BtCursor *pCur){ + assert( cursorOwnsBtShared(pCur) ); + assert( pCur->eState==CURSOR_VALID ); + assert( pCur->iPage>0 ); + assert( pCur->apPage[pCur->iPage] ); + assertParentIndex( + pCur->apPage[pCur->iPage-1], + pCur->aiIdx[pCur->iPage-1], + pCur->apPage[pCur->iPage]->pgno + ); + testcase( pCur->aiIdx[pCur->iPage-1] > pCur->apPage[pCur->iPage-1]->nCell ); + pCur->info.nSize = 0; + pCur->curFlags &= ~(BTCF_ValidNKey|BTCF_ValidOvfl); + releasePageNotNull(pCur->apPage[pCur->iPage--]); +} + +/* +** Move the cursor to point to the root page of its b-tree structure. +** +** If the table has a virtual root page, then the cursor is moved to point +** to the virtual root page instead of the actual root page. A table has a +** virtual root page when the actual root page contains no cells and a +** single child page. This can only happen with the table rooted at page 1. +** +** If the b-tree structure is empty, the cursor state is set to +** CURSOR_INVALID. Otherwise, the cursor is set to point to the first +** cell located on the root (or virtual root) page and the cursor state +** is set to CURSOR_VALID. +** +** If this function returns successfully, it may be assumed that the +** page-header flags indicate that the [virtual] root-page is the expected +** kind of b-tree page (i.e. if when opening the cursor the caller did not +** specify a KeyInfo structure the flags byte is set to 0x05 or 0x0D, +** indicating a table b-tree, or if the caller did specify a KeyInfo +** structure the flags byte is set to 0x02 or 0x0A, indicating an index +** b-tree). +*/ +static int moveToRoot(BtCursor *pCur){ + MemPage *pRoot; + int rc = SQLITE_OK; + + assert( cursorOwnsBtShared(pCur) ); + assert( CURSOR_INVALID < CURSOR_REQUIRESEEK ); + assert( CURSOR_VALID < CURSOR_REQUIRESEEK ); + assert( CURSOR_FAULT > CURSOR_REQUIRESEEK ); + if( pCur->eState>=CURSOR_REQUIRESEEK ){ + if( pCur->eState==CURSOR_FAULT ){ + assert( pCur->skipNext!=SQLITE_OK ); + return pCur->skipNext; + } + sqlite3BtreeClearCursor(pCur); + } + + if( pCur->iPage>=0 ){ + while( pCur->iPage ){ + assert( pCur->apPage[pCur->iPage]!=0 ); + releasePageNotNull(pCur->apPage[pCur->iPage--]); + } + }else if( pCur->pgnoRoot==0 ){ + pCur->eState = CURSOR_INVALID; + return SQLITE_OK; + }else{ + assert( pCur->iPage==(-1) ); + rc = getAndInitPage(pCur->pBtree->pBt, pCur->pgnoRoot, &pCur->apPage[0], + 0, pCur->curPagerFlags); + if( rc!=SQLITE_OK ){ + pCur->eState = CURSOR_INVALID; + return rc; + } + pCur->iPage = 0; + pCur->curIntKey = pCur->apPage[0]->intKey; + } + pRoot = pCur->apPage[0]; + assert( pRoot->pgno==pCur->pgnoRoot ); + + /* If pCur->pKeyInfo is not NULL, then the caller that opened this cursor + ** expected to open it on an index b-tree. Otherwise, if pKeyInfo is + ** NULL, the caller expects a table b-tree. If this is not the case, + ** return an SQLITE_CORRUPT error. + ** + ** Earlier versions of SQLite assumed that this test could not fail + ** if the root page was already loaded when this function was called (i.e. + ** if pCur->iPage>=0). But this is not so if the database is corrupted + ** in such a way that page pRoot is linked into a second b-tree table + ** (or the freelist). */ + assert( pRoot->intKey==1 || pRoot->intKey==0 ); + if( pRoot->isInit==0 || (pCur->pKeyInfo==0)!=pRoot->intKey ){ + return SQLITE_CORRUPT_BKPT; + } + + pCur->aiIdx[0] = 0; + pCur->info.nSize = 0; + pCur->curFlags &= ~(BTCF_AtLast|BTCF_ValidNKey|BTCF_ValidOvfl); + + if( pRoot->nCell>0 ){ + pCur->eState = CURSOR_VALID; + }else if( !pRoot->leaf ){ + Pgno subpage; + if( pRoot->pgno!=1 ) return SQLITE_CORRUPT_BKPT; + subpage = get4byte(&pRoot->aData[pRoot->hdrOffset+8]); + pCur->eState = CURSOR_VALID; + rc = moveToChild(pCur, subpage); + }else{ + pCur->eState = CURSOR_INVALID; + } + return rc; +} + +/* +** Move the cursor down to the left-most leaf entry beneath the +** entry to which it is currently pointing. +** +** The left-most leaf is the one with the smallest key - the first +** in ascending order. +*/ +static int moveToLeftmost(BtCursor *pCur){ + Pgno pgno; + int rc = SQLITE_OK; + MemPage *pPage; + + assert( cursorOwnsBtShared(pCur) ); + assert( pCur->eState==CURSOR_VALID ); + while( rc==SQLITE_OK && !(pPage = pCur->apPage[pCur->iPage])->leaf ){ + assert( pCur->aiIdx[pCur->iPage]nCell ); + pgno = get4byte(findCell(pPage, pCur->aiIdx[pCur->iPage])); + rc = moveToChild(pCur, pgno); + } + return rc; +} + +/* +** Move the cursor down to the right-most leaf entry beneath the +** page to which it is currently pointing. Notice the difference +** between moveToLeftmost() and moveToRightmost(). moveToLeftmost() +** finds the left-most entry beneath the *entry* whereas moveToRightmost() +** finds the right-most entry beneath the *page*. +** +** The right-most entry is the one with the largest key - the last +** key in ascending order. +*/ +static int moveToRightmost(BtCursor *pCur){ + Pgno pgno; + int rc = SQLITE_OK; + MemPage *pPage = 0; + + assert( cursorOwnsBtShared(pCur) ); + assert( pCur->eState==CURSOR_VALID ); + while( !(pPage = pCur->apPage[pCur->iPage])->leaf ){ + pgno = get4byte(&pPage->aData[pPage->hdrOffset+8]); + pCur->aiIdx[pCur->iPage] = pPage->nCell; + rc = moveToChild(pCur, pgno); + if( rc ) return rc; + } + pCur->aiIdx[pCur->iPage] = pPage->nCell-1; + assert( pCur->info.nSize==0 ); + assert( (pCur->curFlags & BTCF_ValidNKey)==0 ); + return SQLITE_OK; +} + +/* Move the cursor to the first entry in the table. Return SQLITE_OK +** on success. Set *pRes to 0 if the cursor actually points to something +** or set *pRes to 1 if the table is empty. +*/ +SQLITE_PRIVATE int sqlite3BtreeFirst(BtCursor *pCur, int *pRes){ + int rc; + + assert( cursorOwnsBtShared(pCur) ); + assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) ); + rc = moveToRoot(pCur); + if( rc==SQLITE_OK ){ + if( pCur->eState==CURSOR_INVALID ){ + assert( pCur->pgnoRoot==0 || pCur->apPage[pCur->iPage]->nCell==0 ); + *pRes = 1; + }else{ + assert( pCur->apPage[pCur->iPage]->nCell>0 ); + *pRes = 0; + rc = moveToLeftmost(pCur); + } + } + return rc; +} + +/* Move the cursor to the last entry in the table. Return SQLITE_OK +** on success. Set *pRes to 0 if the cursor actually points to something +** or set *pRes to 1 if the table is empty. +*/ +SQLITE_PRIVATE int sqlite3BtreeLast(BtCursor *pCur, int *pRes){ + int rc; + + assert( cursorOwnsBtShared(pCur) ); + assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) ); + + /* If the cursor already points to the last entry, this is a no-op. */ + if( CURSOR_VALID==pCur->eState && (pCur->curFlags & BTCF_AtLast)!=0 ){ +#ifdef SQLITE_DEBUG + /* This block serves to assert() that the cursor really does point + ** to the last entry in the b-tree. */ + int ii; + for(ii=0; iiiPage; ii++){ + assert( pCur->aiIdx[ii]==pCur->apPage[ii]->nCell ); + } + assert( pCur->aiIdx[pCur->iPage]==pCur->apPage[pCur->iPage]->nCell-1 ); + assert( pCur->apPage[pCur->iPage]->leaf ); +#endif + return SQLITE_OK; + } + + rc = moveToRoot(pCur); + if( rc==SQLITE_OK ){ + if( CURSOR_INVALID==pCur->eState ){ + assert( pCur->pgnoRoot==0 || pCur->apPage[pCur->iPage]->nCell==0 ); + *pRes = 1; + }else{ + assert( pCur->eState==CURSOR_VALID ); + *pRes = 0; + rc = moveToRightmost(pCur); + if( rc==SQLITE_OK ){ + pCur->curFlags |= BTCF_AtLast; + }else{ + pCur->curFlags &= ~BTCF_AtLast; + } + + } + } + return rc; +} + +/* Move the cursor so that it points to an entry near the key +** specified by pIdxKey or intKey. Return a success code. +** +** For INTKEY tables, the intKey parameter is used. pIdxKey +** must be NULL. For index tables, pIdxKey is used and intKey +** is ignored. +** +** If an exact match is not found, then the cursor is always +** left pointing at a leaf page which would hold the entry if it +** were present. The cursor might point to an entry that comes +** before or after the key. +** +** An integer is written into *pRes which is the result of +** comparing the key with the entry to which the cursor is +** pointing. The meaning of the integer written into +** *pRes is as follows: +** +** *pRes<0 The cursor is left pointing at an entry that +** is smaller than intKey/pIdxKey or if the table is empty +** and the cursor is therefore left point to nothing. +** +** *pRes==0 The cursor is left pointing at an entry that +** exactly matches intKey/pIdxKey. +** +** *pRes>0 The cursor is left pointing at an entry that +** is larger than intKey/pIdxKey. +** +** For index tables, the pIdxKey->eqSeen field is set to 1 if there +** exists an entry in the table that exactly matches pIdxKey. +*/ +SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked( + BtCursor *pCur, /* The cursor to be moved */ + UnpackedRecord *pIdxKey, /* Unpacked index key */ + i64 intKey, /* The table key */ + int biasRight, /* If true, bias the search to the high end */ + int *pRes /* Write search results here */ +){ + int rc; + RecordCompare xRecordCompare; + + assert( cursorOwnsBtShared(pCur) ); + assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) ); + assert( pRes ); + assert( (pIdxKey==0)==(pCur->pKeyInfo==0) ); + assert( pCur->eState!=CURSOR_VALID || (pIdxKey==0)==(pCur->curIntKey!=0) ); + + /* If the cursor is already positioned at the point we are trying + ** to move to, then just return without doing any work */ + if( pIdxKey==0 + && pCur->eState==CURSOR_VALID && (pCur->curFlags & BTCF_ValidNKey)!=0 + ){ + if( pCur->info.nKey==intKey ){ + *pRes = 0; + return SQLITE_OK; + } + if( (pCur->curFlags & BTCF_AtLast)!=0 && pCur->info.nKeyerrCode = 0; + assert( pIdxKey->default_rc==1 + || pIdxKey->default_rc==0 + || pIdxKey->default_rc==-1 + ); + }else{ + xRecordCompare = 0; /* All keys are integers */ + } + + rc = moveToRoot(pCur); + if( rc ){ + return rc; + } + assert( pCur->pgnoRoot==0 || pCur->apPage[pCur->iPage] ); + assert( pCur->pgnoRoot==0 || pCur->apPage[pCur->iPage]->isInit ); + assert( pCur->eState==CURSOR_INVALID || pCur->apPage[pCur->iPage]->nCell>0 ); + if( pCur->eState==CURSOR_INVALID ){ + *pRes = -1; + assert( pCur->pgnoRoot==0 || pCur->apPage[pCur->iPage]->nCell==0 ); + return SQLITE_OK; + } + assert( pCur->apPage[0]->intKey==pCur->curIntKey ); + assert( pCur->curIntKey || pIdxKey ); + for(;;){ + int lwr, upr, idx, c; + Pgno chldPg; + MemPage *pPage = pCur->apPage[pCur->iPage]; + u8 *pCell; /* Pointer to current cell in pPage */ + + /* pPage->nCell must be greater than zero. If this is the root-page + ** the cursor would have been INVALID above and this for(;;) loop + ** not run. If this is not the root-page, then the moveToChild() routine + ** would have already detected db corruption. Similarly, pPage must + ** be the right kind (index or table) of b-tree page. Otherwise + ** a moveToChild() or moveToRoot() call would have detected corruption. */ + assert( pPage->nCell>0 ); + assert( pPage->intKey==(pIdxKey==0) ); + lwr = 0; + upr = pPage->nCell-1; + assert( biasRight==0 || biasRight==1 ); + idx = upr>>(1-biasRight); /* idx = biasRight ? upr : (lwr+upr)/2; */ + pCur->aiIdx[pCur->iPage] = (u16)idx; + if( xRecordCompare==0 ){ + for(;;){ + i64 nCellKey; + pCell = findCellPastPtr(pPage, idx); + if( pPage->intKeyLeaf ){ + while( 0x80 <= *(pCell++) ){ + if( pCell>=pPage->aDataEnd ) return SQLITE_CORRUPT_BKPT; + } + } + getVarint(pCell, (u64*)&nCellKey); + if( nCellKeyupr ){ c = -1; break; } + }else if( nCellKey>intKey ){ + upr = idx-1; + if( lwr>upr ){ c = +1; break; } + }else{ + assert( nCellKey==intKey ); + pCur->curFlags |= BTCF_ValidNKey; + pCur->info.nKey = nCellKey; + pCur->aiIdx[pCur->iPage] = (u16)idx; + if( !pPage->leaf ){ + lwr = idx; + goto moveto_next_layer; + }else{ + *pRes = 0; + rc = SQLITE_OK; + goto moveto_finish; + } + } + assert( lwr+upr>=0 ); + idx = (lwr+upr)>>1; /* idx = (lwr+upr)/2; */ + } + }else{ + for(;;){ + int nCell; /* Size of the pCell cell in bytes */ + pCell = findCellPastPtr(pPage, idx); + + /* The maximum supported page-size is 65536 bytes. This means that + ** the maximum number of record bytes stored on an index B-Tree + ** page is less than 16384 bytes and may be stored as a 2-byte + ** varint. This information is used to attempt to avoid parsing + ** the entire cell by checking for the cases where the record is + ** stored entirely within the b-tree page by inspecting the first + ** 2 bytes of the cell. + */ + nCell = pCell[0]; + if( nCell<=pPage->max1bytePayload ){ + /* This branch runs if the record-size field of the cell is a + ** single byte varint and the record fits entirely on the main + ** b-tree page. */ + testcase( pCell+nCell+1==pPage->aDataEnd ); + c = xRecordCompare(nCell, (void*)&pCell[1], pIdxKey); + }else if( !(pCell[1] & 0x80) + && (nCell = ((nCell&0x7f)<<7) + pCell[1])<=pPage->maxLocal + ){ + /* The record-size field is a 2 byte varint and the record + ** fits entirely on the main b-tree page. */ + testcase( pCell+nCell+2==pPage->aDataEnd ); + c = xRecordCompare(nCell, (void*)&pCell[2], pIdxKey); + }else{ + /* The record flows over onto one or more overflow pages. In + ** this case the whole cell needs to be parsed, a buffer allocated + ** and accessPayload() used to retrieve the record into the + ** buffer before VdbeRecordCompare() can be called. + ** + ** If the record is corrupt, the xRecordCompare routine may read + ** up to two varints past the end of the buffer. An extra 18 + ** bytes of padding is allocated at the end of the buffer in + ** case this happens. */ + void *pCellKey; + u8 * const pCellBody = pCell - pPage->childPtrSize; + pPage->xParseCell(pPage, pCellBody, &pCur->info); + nCell = (int)pCur->info.nKey; + testcase( nCell<0 ); /* True if key size is 2^32 or more */ + testcase( nCell==0 ); /* Invalid key size: 0x80 0x80 0x00 */ + testcase( nCell==1 ); /* Invalid key size: 0x80 0x80 0x01 */ + testcase( nCell==2 ); /* Minimum legal index key size */ + if( nCell<2 ){ + rc = SQLITE_CORRUPT_BKPT; + goto moveto_finish; + } + pCellKey = sqlite3Malloc( nCell+18 ); + if( pCellKey==0 ){ + rc = SQLITE_NOMEM_BKPT; + goto moveto_finish; + } + pCur->aiIdx[pCur->iPage] = (u16)idx; + rc = accessPayload(pCur, 0, nCell, (unsigned char*)pCellKey, 2); + if( rc ){ + sqlite3_free(pCellKey); + goto moveto_finish; + } + c = xRecordCompare(nCell, pCellKey, pIdxKey); + sqlite3_free(pCellKey); + } + assert( + (pIdxKey->errCode!=SQLITE_CORRUPT || c==0) + && (pIdxKey->errCode!=SQLITE_NOMEM || pCur->pBtree->db->mallocFailed) + ); + if( c<0 ){ + lwr = idx+1; + }else if( c>0 ){ + upr = idx-1; + }else{ + assert( c==0 ); + *pRes = 0; + rc = SQLITE_OK; + pCur->aiIdx[pCur->iPage] = (u16)idx; + if( pIdxKey->errCode ) rc = SQLITE_CORRUPT; + goto moveto_finish; + } + if( lwr>upr ) break; + assert( lwr+upr>=0 ); + idx = (lwr+upr)>>1; /* idx = (lwr+upr)/2 */ + } + } + assert( lwr==upr+1 || (pPage->intKey && !pPage->leaf) ); + assert( pPage->isInit ); + if( pPage->leaf ){ + assert( pCur->aiIdx[pCur->iPage]apPage[pCur->iPage]->nCell ); + pCur->aiIdx[pCur->iPage] = (u16)idx; + *pRes = c; + rc = SQLITE_OK; + goto moveto_finish; + } +moveto_next_layer: + if( lwr>=pPage->nCell ){ + chldPg = get4byte(&pPage->aData[pPage->hdrOffset+8]); + }else{ + chldPg = get4byte(findCell(pPage, lwr)); + } + pCur->aiIdx[pCur->iPage] = (u16)lwr; + rc = moveToChild(pCur, chldPg); + if( rc ) break; + } +moveto_finish: + pCur->info.nSize = 0; + pCur->curFlags &= ~(BTCF_ValidNKey|BTCF_ValidOvfl); + return rc; +} + + +/* +** Return TRUE if the cursor is not pointing at an entry of the table. +** +** TRUE will be returned after a call to sqlite3BtreeNext() moves +** past the last entry in the table or sqlite3BtreePrev() moves past +** the first entry. TRUE is also returned if the table is empty. +*/ +SQLITE_PRIVATE int sqlite3BtreeEof(BtCursor *pCur){ + /* TODO: What if the cursor is in CURSOR_REQUIRESEEK but all table entries + ** have been deleted? This API will need to change to return an error code + ** as well as the boolean result value. + */ + return (CURSOR_VALID!=pCur->eState); +} + +/* +** Advance the cursor to the next entry in the database. If +** successful then set *pRes=0. If the cursor +** was already pointing to the last entry in the database before +** this routine was called, then set *pRes=1. +** +** The main entry point is sqlite3BtreeNext(). That routine is optimized +** for the common case of merely incrementing the cell counter BtCursor.aiIdx +** to the next cell on the current page. The (slower) btreeNext() helper +** routine is called when it is necessary to move to a different page or +** to restore the cursor. +** +** The calling function will set *pRes to 0 or 1. The initial *pRes value +** will be 1 if the cursor being stepped corresponds to an SQL index and +** if this routine could have been skipped if that SQL index had been +** a unique index. Otherwise the caller will have set *pRes to zero. +** Zero is the common case. The btree implementation is free to use the +** initial *pRes value as a hint to improve performance, but the current +** SQLite btree implementation does not. (Note that the comdb2 btree +** implementation does use this hint, however.) +*/ +static SQLITE_NOINLINE int btreeNext(BtCursor *pCur, int *pRes){ + int rc; + int idx; + MemPage *pPage; + + assert( cursorOwnsBtShared(pCur) ); + assert( pCur->skipNext==0 || pCur->eState!=CURSOR_VALID ); + assert( *pRes==0 ); + if( pCur->eState!=CURSOR_VALID ){ + assert( (pCur->curFlags & BTCF_ValidOvfl)==0 ); + rc = restoreCursorPosition(pCur); + if( rc!=SQLITE_OK ){ + return rc; + } + if( CURSOR_INVALID==pCur->eState ){ + *pRes = 1; + return SQLITE_OK; + } + if( pCur->skipNext ){ + assert( pCur->eState==CURSOR_VALID || pCur->eState==CURSOR_SKIPNEXT ); + pCur->eState = CURSOR_VALID; + if( pCur->skipNext>0 ){ + pCur->skipNext = 0; + return SQLITE_OK; + } + pCur->skipNext = 0; + } + } + + pPage = pCur->apPage[pCur->iPage]; + idx = ++pCur->aiIdx[pCur->iPage]; + assert( pPage->isInit ); + + /* If the database file is corrupt, it is possible for the value of idx + ** to be invalid here. This can only occur if a second cursor modifies + ** the page while cursor pCur is holding a reference to it. Which can + ** only happen if the database is corrupt in such a way as to link the + ** page into more than one b-tree structure. */ + testcase( idx>pPage->nCell ); + + if( idx>=pPage->nCell ){ + if( !pPage->leaf ){ + rc = moveToChild(pCur, get4byte(&pPage->aData[pPage->hdrOffset+8])); + if( rc ) return rc; + return moveToLeftmost(pCur); + } + do{ + if( pCur->iPage==0 ){ + *pRes = 1; + pCur->eState = CURSOR_INVALID; + return SQLITE_OK; + } + moveToParent(pCur); + pPage = pCur->apPage[pCur->iPage]; + }while( pCur->aiIdx[pCur->iPage]>=pPage->nCell ); + if( pPage->intKey ){ + return sqlite3BtreeNext(pCur, pRes); + }else{ + return SQLITE_OK; + } + } + if( pPage->leaf ){ + return SQLITE_OK; + }else{ + return moveToLeftmost(pCur); + } +} +SQLITE_PRIVATE int sqlite3BtreeNext(BtCursor *pCur, int *pRes){ + MemPage *pPage; + assert( cursorOwnsBtShared(pCur) ); + assert( pRes!=0 ); + assert( *pRes==0 || *pRes==1 ); + assert( pCur->skipNext==0 || pCur->eState!=CURSOR_VALID ); + pCur->info.nSize = 0; + pCur->curFlags &= ~(BTCF_ValidNKey|BTCF_ValidOvfl); + *pRes = 0; + if( pCur->eState!=CURSOR_VALID ) return btreeNext(pCur, pRes); + pPage = pCur->apPage[pCur->iPage]; + if( (++pCur->aiIdx[pCur->iPage])>=pPage->nCell ){ + pCur->aiIdx[pCur->iPage]--; + return btreeNext(pCur, pRes); + } + if( pPage->leaf ){ + return SQLITE_OK; + }else{ + return moveToLeftmost(pCur); + } +} + +/* +** Step the cursor to the back to the previous entry in the database. If +** successful then set *pRes=0. If the cursor +** was already pointing to the first entry in the database before +** this routine was called, then set *pRes=1. +** +** The main entry point is sqlite3BtreePrevious(). That routine is optimized +** for the common case of merely decrementing the cell counter BtCursor.aiIdx +** to the previous cell on the current page. The (slower) btreePrevious() +** helper routine is called when it is necessary to move to a different page +** or to restore the cursor. +** +** The calling function will set *pRes to 0 or 1. The initial *pRes value +** will be 1 if the cursor being stepped corresponds to an SQL index and +** if this routine could have been skipped if that SQL index had been +** a unique index. Otherwise the caller will have set *pRes to zero. +** Zero is the common case. The btree implementation is free to use the +** initial *pRes value as a hint to improve performance, but the current +** SQLite btree implementation does not. (Note that the comdb2 btree +** implementation does use this hint, however.) +*/ +static SQLITE_NOINLINE int btreePrevious(BtCursor *pCur, int *pRes){ + int rc; + MemPage *pPage; + + assert( cursorOwnsBtShared(pCur) ); + assert( pRes!=0 ); + assert( *pRes==0 ); + assert( pCur->skipNext==0 || pCur->eState!=CURSOR_VALID ); + assert( (pCur->curFlags & (BTCF_AtLast|BTCF_ValidOvfl|BTCF_ValidNKey))==0 ); + assert( pCur->info.nSize==0 ); + if( pCur->eState!=CURSOR_VALID ){ + rc = restoreCursorPosition(pCur); + if( rc!=SQLITE_OK ){ + return rc; + } + if( CURSOR_INVALID==pCur->eState ){ + *pRes = 1; + return SQLITE_OK; + } + if( pCur->skipNext ){ + assert( pCur->eState==CURSOR_VALID || pCur->eState==CURSOR_SKIPNEXT ); + pCur->eState = CURSOR_VALID; + if( pCur->skipNext<0 ){ + pCur->skipNext = 0; + return SQLITE_OK; + } + pCur->skipNext = 0; + } + } + + pPage = pCur->apPage[pCur->iPage]; + assert( pPage->isInit ); + if( !pPage->leaf ){ + int idx = pCur->aiIdx[pCur->iPage]; + rc = moveToChild(pCur, get4byte(findCell(pPage, idx))); + if( rc ) return rc; + rc = moveToRightmost(pCur); + }else{ + while( pCur->aiIdx[pCur->iPage]==0 ){ + if( pCur->iPage==0 ){ + pCur->eState = CURSOR_INVALID; + *pRes = 1; + return SQLITE_OK; + } + moveToParent(pCur); + } + assert( pCur->info.nSize==0 ); + assert( (pCur->curFlags & (BTCF_ValidNKey|BTCF_ValidOvfl))==0 ); + + pCur->aiIdx[pCur->iPage]--; + pPage = pCur->apPage[pCur->iPage]; + if( pPage->intKey && !pPage->leaf ){ + rc = sqlite3BtreePrevious(pCur, pRes); + }else{ + rc = SQLITE_OK; + } + } + return rc; +} +SQLITE_PRIVATE int sqlite3BtreePrevious(BtCursor *pCur, int *pRes){ + assert( cursorOwnsBtShared(pCur) ); + assert( pRes!=0 ); + assert( *pRes==0 || *pRes==1 ); + assert( pCur->skipNext==0 || pCur->eState!=CURSOR_VALID ); + *pRes = 0; + pCur->curFlags &= ~(BTCF_AtLast|BTCF_ValidOvfl|BTCF_ValidNKey); + pCur->info.nSize = 0; + if( pCur->eState!=CURSOR_VALID + || pCur->aiIdx[pCur->iPage]==0 + || pCur->apPage[pCur->iPage]->leaf==0 + ){ + return btreePrevious(pCur, pRes); + } + pCur->aiIdx[pCur->iPage]--; + return SQLITE_OK; +} + +/* +** Allocate a new page from the database file. +** +** The new page is marked as dirty. (In other words, sqlite3PagerWrite() +** has already been called on the new page.) The new page has also +** been referenced and the calling routine is responsible for calling +** sqlite3PagerUnref() on the new page when it is done. +** +** SQLITE_OK is returned on success. Any other return value indicates +** an error. *ppPage is set to NULL in the event of an error. +** +** If the "nearby" parameter is not 0, then an effort is made to +** locate a page close to the page number "nearby". This can be used in an +** attempt to keep related pages close to each other in the database file, +** which in turn can make database access faster. +** +** If the eMode parameter is BTALLOC_EXACT and the nearby page exists +** anywhere on the free-list, then it is guaranteed to be returned. If +** eMode is BTALLOC_LT then the page returned will be less than or equal +** to nearby if any such page exists. If eMode is BTALLOC_ANY then there +** are no restrictions on which page is returned. +*/ +static int allocateBtreePage( + BtShared *pBt, /* The btree */ + MemPage **ppPage, /* Store pointer to the allocated page here */ + Pgno *pPgno, /* Store the page number here */ + Pgno nearby, /* Search for a page near this one */ + u8 eMode /* BTALLOC_EXACT, BTALLOC_LT, or BTALLOC_ANY */ +){ + MemPage *pPage1; + int rc; + u32 n; /* Number of pages on the freelist */ + u32 k; /* Number of leaves on the trunk of the freelist */ + MemPage *pTrunk = 0; + MemPage *pPrevTrunk = 0; + Pgno mxPage; /* Total size of the database file */ + + assert( sqlite3_mutex_held(pBt->mutex) ); + assert( eMode==BTALLOC_ANY || (nearby>0 && IfNotOmitAV(pBt->autoVacuum)) ); + pPage1 = pBt->pPage1; + mxPage = btreePagecount(pBt); + /* EVIDENCE-OF: R-05119-02637 The 4-byte big-endian integer at offset 36 + ** stores stores the total number of pages on the freelist. */ + n = get4byte(&pPage1->aData[36]); + testcase( n==mxPage-1 ); + if( n>=mxPage ){ + return SQLITE_CORRUPT_BKPT; + } + if( n>0 ){ + /* There are pages on the freelist. Reuse one of those pages. */ + Pgno iTrunk; + u8 searchList = 0; /* If the free-list must be searched for 'nearby' */ + u32 nSearch = 0; /* Count of the number of search attempts */ + + /* If eMode==BTALLOC_EXACT and a query of the pointer-map + ** shows that the page 'nearby' is somewhere on the free-list, then + ** the entire-list will be searched for that page. + */ +#ifndef SQLITE_OMIT_AUTOVACUUM + if( eMode==BTALLOC_EXACT ){ + if( nearby<=mxPage ){ + u8 eType; + assert( nearby>0 ); + assert( pBt->autoVacuum ); + rc = ptrmapGet(pBt, nearby, &eType, 0); + if( rc ) return rc; + if( eType==PTRMAP_FREEPAGE ){ + searchList = 1; + } + } + }else if( eMode==BTALLOC_LE ){ + searchList = 1; + } +#endif + + /* Decrement the free-list count by 1. Set iTrunk to the index of the + ** first free-list trunk page. iPrevTrunk is initially 1. + */ + rc = sqlite3PagerWrite(pPage1->pDbPage); + if( rc ) return rc; + put4byte(&pPage1->aData[36], n-1); + + /* The code within this loop is run only once if the 'searchList' variable + ** is not true. Otherwise, it runs once for each trunk-page on the + ** free-list until the page 'nearby' is located (eMode==BTALLOC_EXACT) + ** or until a page less than 'nearby' is located (eMode==BTALLOC_LT) + */ + do { + pPrevTrunk = pTrunk; + if( pPrevTrunk ){ + /* EVIDENCE-OF: R-01506-11053 The first integer on a freelist trunk page + ** is the page number of the next freelist trunk page in the list or + ** zero if this is the last freelist trunk page. */ + iTrunk = get4byte(&pPrevTrunk->aData[0]); + }else{ + /* EVIDENCE-OF: R-59841-13798 The 4-byte big-endian integer at offset 32 + ** stores the page number of the first page of the freelist, or zero if + ** the freelist is empty. */ + iTrunk = get4byte(&pPage1->aData[32]); + } + testcase( iTrunk==mxPage ); + if( iTrunk>mxPage || nSearch++ > n ){ + rc = SQLITE_CORRUPT_BKPT; + }else{ + rc = btreeGetUnusedPage(pBt, iTrunk, &pTrunk, 0); + } + if( rc ){ + pTrunk = 0; + goto end_allocate_page; + } + assert( pTrunk!=0 ); + assert( pTrunk->aData!=0 ); + /* EVIDENCE-OF: R-13523-04394 The second integer on a freelist trunk page + ** is the number of leaf page pointers to follow. */ + k = get4byte(&pTrunk->aData[4]); + if( k==0 && !searchList ){ + /* The trunk has no leaves and the list is not being searched. + ** So extract the trunk page itself and use it as the newly + ** allocated page */ + assert( pPrevTrunk==0 ); + rc = sqlite3PagerWrite(pTrunk->pDbPage); + if( rc ){ + goto end_allocate_page; + } + *pPgno = iTrunk; + memcpy(&pPage1->aData[32], &pTrunk->aData[0], 4); + *ppPage = pTrunk; + pTrunk = 0; + TRACE(("ALLOCATE: %d trunk - %d free pages left\n", *pPgno, n-1)); + }else if( k>(u32)(pBt->usableSize/4 - 2) ){ + /* Value of k is out of range. Database corruption */ + rc = SQLITE_CORRUPT_BKPT; + goto end_allocate_page; +#ifndef SQLITE_OMIT_AUTOVACUUM + }else if( searchList + && (nearby==iTrunk || (iTrunkpDbPage); + if( rc ){ + goto end_allocate_page; + } + if( k==0 ){ + if( !pPrevTrunk ){ + memcpy(&pPage1->aData[32], &pTrunk->aData[0], 4); + }else{ + rc = sqlite3PagerWrite(pPrevTrunk->pDbPage); + if( rc!=SQLITE_OK ){ + goto end_allocate_page; + } + memcpy(&pPrevTrunk->aData[0], &pTrunk->aData[0], 4); + } + }else{ + /* The trunk page is required by the caller but it contains + ** pointers to free-list leaves. The first leaf becomes a trunk + ** page in this case. + */ + MemPage *pNewTrunk; + Pgno iNewTrunk = get4byte(&pTrunk->aData[8]); + if( iNewTrunk>mxPage ){ + rc = SQLITE_CORRUPT_BKPT; + goto end_allocate_page; + } + testcase( iNewTrunk==mxPage ); + rc = btreeGetUnusedPage(pBt, iNewTrunk, &pNewTrunk, 0); + if( rc!=SQLITE_OK ){ + goto end_allocate_page; + } + rc = sqlite3PagerWrite(pNewTrunk->pDbPage); + if( rc!=SQLITE_OK ){ + releasePage(pNewTrunk); + goto end_allocate_page; + } + memcpy(&pNewTrunk->aData[0], &pTrunk->aData[0], 4); + put4byte(&pNewTrunk->aData[4], k-1); + memcpy(&pNewTrunk->aData[8], &pTrunk->aData[12], (k-1)*4); + releasePage(pNewTrunk); + if( !pPrevTrunk ){ + assert( sqlite3PagerIswriteable(pPage1->pDbPage) ); + put4byte(&pPage1->aData[32], iNewTrunk); + }else{ + rc = sqlite3PagerWrite(pPrevTrunk->pDbPage); + if( rc ){ + goto end_allocate_page; + } + put4byte(&pPrevTrunk->aData[0], iNewTrunk); + } + } + pTrunk = 0; + TRACE(("ALLOCATE: %d trunk - %d free pages left\n", *pPgno, n-1)); +#endif + }else if( k>0 ){ + /* Extract a leaf from the trunk */ + u32 closest; + Pgno iPage; + unsigned char *aData = pTrunk->aData; + if( nearby>0 ){ + u32 i; + closest = 0; + if( eMode==BTALLOC_LE ){ + for(i=0; imxPage ){ + rc = SQLITE_CORRUPT_BKPT; + goto end_allocate_page; + } + testcase( iPage==mxPage ); + if( !searchList + || (iPage==nearby || (iPagepgno, n-1)); + rc = sqlite3PagerWrite(pTrunk->pDbPage); + if( rc ) goto end_allocate_page; + if( closestpDbPage); + if( rc!=SQLITE_OK ){ + releasePage(*ppPage); + *ppPage = 0; + } + } + searchList = 0; + } + } + releasePage(pPrevTrunk); + pPrevTrunk = 0; + }while( searchList ); + }else{ + /* There are no pages on the freelist, so append a new page to the + ** database image. + ** + ** Normally, new pages allocated by this block can be requested from the + ** pager layer with the 'no-content' flag set. This prevents the pager + ** from trying to read the pages content from disk. However, if the + ** current transaction has already run one or more incremental-vacuum + ** steps, then the page we are about to allocate may contain content + ** that is required in the event of a rollback. In this case, do + ** not set the no-content flag. This causes the pager to load and journal + ** the current page content before overwriting it. + ** + ** Note that the pager will not actually attempt to load or journal + ** content for any page that really does lie past the end of the database + ** file on disk. So the effects of disabling the no-content optimization + ** here are confined to those pages that lie between the end of the + ** database image and the end of the database file. + */ + int bNoContent = (0==IfNotOmitAV(pBt->bDoTruncate))? PAGER_GET_NOCONTENT:0; + + rc = sqlite3PagerWrite(pBt->pPage1->pDbPage); + if( rc ) return rc; + pBt->nPage++; + if( pBt->nPage==PENDING_BYTE_PAGE(pBt) ) pBt->nPage++; + +#ifndef SQLITE_OMIT_AUTOVACUUM + if( pBt->autoVacuum && PTRMAP_ISPAGE(pBt, pBt->nPage) ){ + /* If *pPgno refers to a pointer-map page, allocate two new pages + ** at the end of the file instead of one. The first allocated page + ** becomes a new pointer-map page, the second is used by the caller. + */ + MemPage *pPg = 0; + TRACE(("ALLOCATE: %d from end of file (pointer-map page)\n", pBt->nPage)); + assert( pBt->nPage!=PENDING_BYTE_PAGE(pBt) ); + rc = btreeGetUnusedPage(pBt, pBt->nPage, &pPg, bNoContent); + if( rc==SQLITE_OK ){ + rc = sqlite3PagerWrite(pPg->pDbPage); + releasePage(pPg); + } + if( rc ) return rc; + pBt->nPage++; + if( pBt->nPage==PENDING_BYTE_PAGE(pBt) ){ pBt->nPage++; } + } +#endif + put4byte(28 + (u8*)pBt->pPage1->aData, pBt->nPage); + *pPgno = pBt->nPage; + + assert( *pPgno!=PENDING_BYTE_PAGE(pBt) ); + rc = btreeGetUnusedPage(pBt, *pPgno, ppPage, bNoContent); + if( rc ) return rc; + rc = sqlite3PagerWrite((*ppPage)->pDbPage); + if( rc!=SQLITE_OK ){ + releasePage(*ppPage); + *ppPage = 0; + } + TRACE(("ALLOCATE: %d from end of file\n", *pPgno)); + } + + assert( *pPgno!=PENDING_BYTE_PAGE(pBt) ); + +end_allocate_page: + releasePage(pTrunk); + releasePage(pPrevTrunk); + assert( rc!=SQLITE_OK || sqlite3PagerPageRefcount((*ppPage)->pDbPage)<=1 ); + assert( rc!=SQLITE_OK || (*ppPage)->isInit==0 ); + return rc; +} + +/* +** This function is used to add page iPage to the database file free-list. +** It is assumed that the page is not already a part of the free-list. +** +** The value passed as the second argument to this function is optional. +** If the caller happens to have a pointer to the MemPage object +** corresponding to page iPage handy, it may pass it as the second value. +** Otherwise, it may pass NULL. +** +** If a pointer to a MemPage object is passed as the second argument, +** its reference count is not altered by this function. +*/ +static int freePage2(BtShared *pBt, MemPage *pMemPage, Pgno iPage){ + MemPage *pTrunk = 0; /* Free-list trunk page */ + Pgno iTrunk = 0; /* Page number of free-list trunk page */ + MemPage *pPage1 = pBt->pPage1; /* Local reference to page 1 */ + MemPage *pPage; /* Page being freed. May be NULL. */ + int rc; /* Return Code */ + int nFree; /* Initial number of pages on free-list */ + + assert( sqlite3_mutex_held(pBt->mutex) ); + assert( CORRUPT_DB || iPage>1 ); + assert( !pMemPage || pMemPage->pgno==iPage ); + + if( iPage<2 ) return SQLITE_CORRUPT_BKPT; + if( pMemPage ){ + pPage = pMemPage; + sqlite3PagerRef(pPage->pDbPage); + }else{ + pPage = btreePageLookup(pBt, iPage); + } + + /* Increment the free page count on pPage1 */ + rc = sqlite3PagerWrite(pPage1->pDbPage); + if( rc ) goto freepage_out; + nFree = get4byte(&pPage1->aData[36]); + put4byte(&pPage1->aData[36], nFree+1); + + if( pBt->btsFlags & BTS_SECURE_DELETE ){ + /* If the secure_delete option is enabled, then + ** always fully overwrite deleted information with zeros. + */ + if( (!pPage && ((rc = btreeGetPage(pBt, iPage, &pPage, 0))!=0) ) + || ((rc = sqlite3PagerWrite(pPage->pDbPage))!=0) + ){ + goto freepage_out; + } + memset(pPage->aData, 0, pPage->pBt->pageSize); + } + + /* If the database supports auto-vacuum, write an entry in the pointer-map + ** to indicate that the page is free. + */ + if( ISAUTOVACUUM ){ + ptrmapPut(pBt, iPage, PTRMAP_FREEPAGE, 0, &rc); + if( rc ) goto freepage_out; + } + + /* Now manipulate the actual database free-list structure. There are two + ** possibilities. If the free-list is currently empty, or if the first + ** trunk page in the free-list is full, then this page will become a + ** new free-list trunk page. Otherwise, it will become a leaf of the + ** first trunk page in the current free-list. This block tests if it + ** is possible to add the page as a new free-list leaf. + */ + if( nFree!=0 ){ + u32 nLeaf; /* Initial number of leaf cells on trunk page */ + + iTrunk = get4byte(&pPage1->aData[32]); + rc = btreeGetPage(pBt, iTrunk, &pTrunk, 0); + if( rc!=SQLITE_OK ){ + goto freepage_out; + } + + nLeaf = get4byte(&pTrunk->aData[4]); + assert( pBt->usableSize>32 ); + if( nLeaf > (u32)pBt->usableSize/4 - 2 ){ + rc = SQLITE_CORRUPT_BKPT; + goto freepage_out; + } + if( nLeaf < (u32)pBt->usableSize/4 - 8 ){ + /* In this case there is room on the trunk page to insert the page + ** being freed as a new leaf. + ** + ** Note that the trunk page is not really full until it contains + ** usableSize/4 - 2 entries, not usableSize/4 - 8 entries as we have + ** coded. But due to a coding error in versions of SQLite prior to + ** 3.6.0, databases with freelist trunk pages holding more than + ** usableSize/4 - 8 entries will be reported as corrupt. In order + ** to maintain backwards compatibility with older versions of SQLite, + ** we will continue to restrict the number of entries to usableSize/4 - 8 + ** for now. At some point in the future (once everyone has upgraded + ** to 3.6.0 or later) we should consider fixing the conditional above + ** to read "usableSize/4-2" instead of "usableSize/4-8". + ** + ** EVIDENCE-OF: R-19920-11576 However, newer versions of SQLite still + ** avoid using the last six entries in the freelist trunk page array in + ** order that database files created by newer versions of SQLite can be + ** read by older versions of SQLite. + */ + rc = sqlite3PagerWrite(pTrunk->pDbPage); + if( rc==SQLITE_OK ){ + put4byte(&pTrunk->aData[4], nLeaf+1); + put4byte(&pTrunk->aData[8+nLeaf*4], iPage); + if( pPage && (pBt->btsFlags & BTS_SECURE_DELETE)==0 ){ + sqlite3PagerDontWrite(pPage->pDbPage); + } + rc = btreeSetHasContent(pBt, iPage); + } + TRACE(("FREE-PAGE: %d leaf on trunk page %d\n",pPage->pgno,pTrunk->pgno)); + goto freepage_out; + } + } + + /* If control flows to this point, then it was not possible to add the + ** the page being freed as a leaf page of the first trunk in the free-list. + ** Possibly because the free-list is empty, or possibly because the + ** first trunk in the free-list is full. Either way, the page being freed + ** will become the new first trunk page in the free-list. + */ + if( pPage==0 && SQLITE_OK!=(rc = btreeGetPage(pBt, iPage, &pPage, 0)) ){ + goto freepage_out; + } + rc = sqlite3PagerWrite(pPage->pDbPage); + if( rc!=SQLITE_OK ){ + goto freepage_out; + } + put4byte(pPage->aData, iTrunk); + put4byte(&pPage->aData[4], 0); + put4byte(&pPage1->aData[32], iPage); + TRACE(("FREE-PAGE: %d new trunk page replacing %d\n", pPage->pgno, iTrunk)); + +freepage_out: + if( pPage ){ + pPage->isInit = 0; + } + releasePage(pPage); + releasePage(pTrunk); + return rc; +} +static void freePage(MemPage *pPage, int *pRC){ + if( (*pRC)==SQLITE_OK ){ + *pRC = freePage2(pPage->pBt, pPage, pPage->pgno); + } +} + +/* +** Free any overflow pages associated with the given Cell. Write the +** local Cell size (the number of bytes on the original page, omitting +** overflow) into *pnSize. +*/ +static int clearCell( + MemPage *pPage, /* The page that contains the Cell */ + unsigned char *pCell, /* First byte of the Cell */ + u16 *pnSize /* Write the size of the Cell here */ +){ + BtShared *pBt = pPage->pBt; + CellInfo info; + Pgno ovflPgno; + int rc; + int nOvfl; + u32 ovflPageSize; + + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + pPage->xParseCell(pPage, pCell, &info); + *pnSize = info.nSize; + if( info.nLocal==info.nPayload ){ + return SQLITE_OK; /* No overflow pages. Return without doing anything */ + } + if( pCell+info.nSize-1 > pPage->aData+pPage->maskPage ){ + return SQLITE_CORRUPT_BKPT; /* Cell extends past end of page */ + } + ovflPgno = get4byte(pCell + info.nSize - 4); + assert( pBt->usableSize > 4 ); + ovflPageSize = pBt->usableSize - 4; + nOvfl = (info.nPayload - info.nLocal + ovflPageSize - 1)/ovflPageSize; + assert( nOvfl>0 || + (CORRUPT_DB && (info.nPayload + ovflPageSize)btreePagecount(pBt) ){ + /* 0 is not a legal page number and page 1 cannot be an + ** overflow page. Therefore if ovflPgno<2 or past the end of the + ** file the database must be corrupt. */ + return SQLITE_CORRUPT_BKPT; + } + if( nOvfl ){ + rc = getOverflowPage(pBt, ovflPgno, &pOvfl, &iNext); + if( rc ) return rc; + } + + if( ( pOvfl || ((pOvfl = btreePageLookup(pBt, ovflPgno))!=0) ) + && sqlite3PagerPageRefcount(pOvfl->pDbPage)!=1 + ){ + /* There is no reason any cursor should have an outstanding reference + ** to an overflow page belonging to a cell that is being deleted/updated. + ** So if there exists more than one reference to this page, then it + ** must not really be an overflow page and the database must be corrupt. + ** It is helpful to detect this before calling freePage2(), as + ** freePage2() may zero the page contents if secure-delete mode is + ** enabled. If this 'overflow' page happens to be a page that the + ** caller is iterating through or using in some other way, this + ** can be problematic. + */ + rc = SQLITE_CORRUPT_BKPT; + }else{ + rc = freePage2(pBt, pOvfl, ovflPgno); + } + + if( pOvfl ){ + sqlite3PagerUnref(pOvfl->pDbPage); + } + if( rc ) return rc; + ovflPgno = iNext; + } + return SQLITE_OK; +} + +/* +** Create the byte sequence used to represent a cell on page pPage +** and write that byte sequence into pCell[]. Overflow pages are +** allocated and filled in as necessary. The calling procedure +** is responsible for making sure sufficient space has been allocated +** for pCell[]. +** +** Note that pCell does not necessary need to point to the pPage->aData +** area. pCell might point to some temporary storage. The cell will +** be constructed in this temporary area then copied into pPage->aData +** later. +*/ +static int fillInCell( + MemPage *pPage, /* The page that contains the cell */ + unsigned char *pCell, /* Complete text of the cell */ + const BtreePayload *pX, /* Payload with which to construct the cell */ + int *pnSize /* Write cell size here */ +){ + int nPayload; + const u8 *pSrc; + int nSrc, n, rc; + int spaceLeft; + MemPage *pOvfl = 0; + MemPage *pToRelease = 0; + unsigned char *pPrior; + unsigned char *pPayload; + BtShared *pBt = pPage->pBt; + Pgno pgnoOvfl = 0; + int nHeader; + + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + + /* pPage is not necessarily writeable since pCell might be auxiliary + ** buffer space that is separate from the pPage buffer area */ + assert( pCellaData || pCell>=&pPage->aData[pBt->pageSize] + || sqlite3PagerIswriteable(pPage->pDbPage) ); + + /* Fill in the header. */ + nHeader = pPage->childPtrSize; + if( pPage->intKey ){ + nPayload = pX->nData + pX->nZero; + pSrc = pX->pData; + nSrc = pX->nData; + assert( pPage->intKeyLeaf ); /* fillInCell() only called for leaves */ + nHeader += putVarint32(&pCell[nHeader], nPayload); + nHeader += putVarint(&pCell[nHeader], *(u64*)&pX->nKey); + }else{ + assert( pX->nKey<=0x7fffffff && pX->pKey!=0 ); + nSrc = nPayload = (int)pX->nKey; + pSrc = pX->pKey; + nHeader += putVarint32(&pCell[nHeader], nPayload); + } + + /* Fill in the payload */ + if( nPayload<=pPage->maxLocal ){ + n = nHeader + nPayload; + testcase( n==3 ); + testcase( n==4 ); + if( n<4 ) n = 4; + *pnSize = n; + spaceLeft = nPayload; + pPrior = pCell; + }else{ + int mn = pPage->minLocal; + n = mn + (nPayload - mn) % (pPage->pBt->usableSize - 4); + testcase( n==pPage->maxLocal ); + testcase( n==pPage->maxLocal+1 ); + if( n > pPage->maxLocal ) n = mn; + spaceLeft = n; + *pnSize = n + nHeader + 4; + pPrior = &pCell[nHeader+n]; + } + pPayload = &pCell[nHeader]; + + /* At this point variables should be set as follows: + ** + ** nPayload Total payload size in bytes + ** pPayload Begin writing payload here + ** spaceLeft Space available at pPayload. If nPayload>spaceLeft, + ** that means content must spill into overflow pages. + ** *pnSize Size of the local cell (not counting overflow pages) + ** pPrior Where to write the pgno of the first overflow page + ** + ** Use a call to btreeParseCellPtr() to verify that the values above + ** were computed correctly. + */ +#if SQLITE_DEBUG + { + CellInfo info; + pPage->xParseCell(pPage, pCell, &info); + assert( nHeader==(int)(info.pPayload - pCell) ); + assert( info.nKey==pX->nKey ); + assert( *pnSize == info.nSize ); + assert( spaceLeft == info.nLocal ); + } +#endif + + /* Write the payload into the local Cell and any extra into overflow pages */ + while( nPayload>0 ){ + if( spaceLeft==0 ){ +#ifndef SQLITE_OMIT_AUTOVACUUM + Pgno pgnoPtrmap = pgnoOvfl; /* Overflow page pointer-map entry page */ + if( pBt->autoVacuum ){ + do{ + pgnoOvfl++; + } while( + PTRMAP_ISPAGE(pBt, pgnoOvfl) || pgnoOvfl==PENDING_BYTE_PAGE(pBt) + ); + } +#endif + rc = allocateBtreePage(pBt, &pOvfl, &pgnoOvfl, pgnoOvfl, 0); +#ifndef SQLITE_OMIT_AUTOVACUUM + /* If the database supports auto-vacuum, and the second or subsequent + ** overflow page is being allocated, add an entry to the pointer-map + ** for that page now. + ** + ** If this is the first overflow page, then write a partial entry + ** to the pointer-map. If we write nothing to this pointer-map slot, + ** then the optimistic overflow chain processing in clearCell() + ** may misinterpret the uninitialized values and delete the + ** wrong pages from the database. + */ + if( pBt->autoVacuum && rc==SQLITE_OK ){ + u8 eType = (pgnoPtrmap?PTRMAP_OVERFLOW2:PTRMAP_OVERFLOW1); + ptrmapPut(pBt, pgnoOvfl, eType, pgnoPtrmap, &rc); + if( rc ){ + releasePage(pOvfl); + } + } +#endif + if( rc ){ + releasePage(pToRelease); + return rc; + } + + /* If pToRelease is not zero than pPrior points into the data area + ** of pToRelease. Make sure pToRelease is still writeable. */ + assert( pToRelease==0 || sqlite3PagerIswriteable(pToRelease->pDbPage) ); + + /* If pPrior is part of the data area of pPage, then make sure pPage + ** is still writeable */ + assert( pPrioraData || pPrior>=&pPage->aData[pBt->pageSize] + || sqlite3PagerIswriteable(pPage->pDbPage) ); + + put4byte(pPrior, pgnoOvfl); + releasePage(pToRelease); + pToRelease = pOvfl; + pPrior = pOvfl->aData; + put4byte(pPrior, 0); + pPayload = &pOvfl->aData[4]; + spaceLeft = pBt->usableSize - 4; + } + n = nPayload; + if( n>spaceLeft ) n = spaceLeft; + + /* If pToRelease is not zero than pPayload points into the data area + ** of pToRelease. Make sure pToRelease is still writeable. */ + assert( pToRelease==0 || sqlite3PagerIswriteable(pToRelease->pDbPage) ); + + /* If pPayload is part of the data area of pPage, then make sure pPage + ** is still writeable */ + assert( pPayloadaData || pPayload>=&pPage->aData[pBt->pageSize] + || sqlite3PagerIswriteable(pPage->pDbPage) ); + + if( nSrc>0 ){ + if( n>nSrc ) n = nSrc; + assert( pSrc ); + memcpy(pPayload, pSrc, n); + }else{ + memset(pPayload, 0, n); + } + nPayload -= n; + pPayload += n; + pSrc += n; + nSrc -= n; + spaceLeft -= n; + } + releasePage(pToRelease); + return SQLITE_OK; +} + +/* +** Remove the i-th cell from pPage. This routine effects pPage only. +** The cell content is not freed or deallocated. It is assumed that +** the cell content has been copied someplace else. This routine just +** removes the reference to the cell from pPage. +** +** "sz" must be the number of bytes in the cell. +*/ +static void dropCell(MemPage *pPage, int idx, int sz, int *pRC){ + u32 pc; /* Offset to cell content of cell being deleted */ + u8 *data; /* pPage->aData */ + u8 *ptr; /* Used to move bytes around within data[] */ + int rc; /* The return code */ + int hdr; /* Beginning of the header. 0 most pages. 100 page 1 */ + + if( *pRC ) return; + + assert( idx>=0 && idxnCell ); + assert( CORRUPT_DB || sz==cellSize(pPage, idx) ); + assert( sqlite3PagerIswriteable(pPage->pDbPage) ); + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + data = pPage->aData; + ptr = &pPage->aCellIdx[2*idx]; + pc = get2byte(ptr); + hdr = pPage->hdrOffset; + testcase( pc==get2byte(&data[hdr+5]) ); + testcase( pc+sz==pPage->pBt->usableSize ); + if( pc < (u32)get2byte(&data[hdr+5]) || pc+sz > pPage->pBt->usableSize ){ + *pRC = SQLITE_CORRUPT_BKPT; + return; + } + rc = freeSpace(pPage, pc, sz); + if( rc ){ + *pRC = rc; + return; + } + pPage->nCell--; + if( pPage->nCell==0 ){ + memset(&data[hdr+1], 0, 4); + data[hdr+7] = 0; + put2byte(&data[hdr+5], pPage->pBt->usableSize); + pPage->nFree = pPage->pBt->usableSize - pPage->hdrOffset + - pPage->childPtrSize - 8; + }else{ + memmove(ptr, ptr+2, 2*(pPage->nCell - idx)); + put2byte(&data[hdr+3], pPage->nCell); + pPage->nFree += 2; + } +} + +/* +** Insert a new cell on pPage at cell index "i". pCell points to the +** content of the cell. +** +** If the cell content will fit on the page, then put it there. If it +** will not fit, then make a copy of the cell content into pTemp if +** pTemp is not null. Regardless of pTemp, allocate a new entry +** in pPage->apOvfl[] and make it point to the cell content (either +** in pTemp or the original pCell) and also record its index. +** Allocating a new entry in pPage->aCell[] implies that +** pPage->nOverflow is incremented. +** +** *pRC must be SQLITE_OK when this routine is called. +*/ +static void insertCell( + MemPage *pPage, /* Page into which we are copying */ + int i, /* New cell becomes the i-th cell of the page */ + u8 *pCell, /* Content of the new cell */ + int sz, /* Bytes of content in pCell */ + u8 *pTemp, /* Temp storage space for pCell, if needed */ + Pgno iChild, /* If non-zero, replace first 4 bytes with this value */ + int *pRC /* Read and write return code from here */ +){ + int idx = 0; /* Where to write new cell content in data[] */ + int j; /* Loop counter */ + u8 *data; /* The content of the whole page */ + u8 *pIns; /* The point in pPage->aCellIdx[] where no cell inserted */ + + assert( *pRC==SQLITE_OK ); + assert( i>=0 && i<=pPage->nCell+pPage->nOverflow ); + assert( MX_CELL(pPage->pBt)<=10921 ); + assert( pPage->nCell<=MX_CELL(pPage->pBt) || CORRUPT_DB ); + assert( pPage->nOverflow<=ArraySize(pPage->apOvfl) ); + assert( ArraySize(pPage->apOvfl)==ArraySize(pPage->aiOvfl) ); + 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==pPage->xCellSize(pPage, pCell) || (sz==8 && iChild>0) ); + if( pPage->nOverflow || sz+2>pPage->nFree ){ + if( pTemp ){ + memcpy(pTemp, pCell, sz); + pCell = pTemp; + } + if( iChild ){ + put4byte(pCell, iChild); + } + j = pPage->nOverflow++; + assert( j<(int)(sizeof(pPage->apOvfl)/sizeof(pPage->apOvfl[0])) ); + pPage->apOvfl[j] = pCell; + pPage->aiOvfl[j] = (u16)i; + + /* When multiple overflows occur, they are always sequential and in + ** sorted order. This invariants arise because multiple overflows can + ** only occur when inserting divider cells into the parent page during + ** balancing, and the dividers are adjacent and sorted. + */ + assert( j==0 || pPage->aiOvfl[j-1]<(u16)i ); /* Overflows in sorted order */ + assert( j==0 || i==pPage->aiOvfl[j-1]+1 ); /* Overflows are sequential */ + }else{ + int rc = sqlite3PagerWrite(pPage->pDbPage); + if( rc!=SQLITE_OK ){ + *pRC = rc; + return; + } + assert( sqlite3PagerIswriteable(pPage->pDbPage) ); + data = pPage->aData; + assert( &data[pPage->cellOffset]==pPage->aCellIdx ); + rc = allocateSpace(pPage, sz, &idx); + if( rc ){ *pRC = rc; return; } + /* The allocateSpace() routine guarantees the following properties + ** if it returns successfully */ + assert( idx >= 0 ); + assert( idx >= pPage->cellOffset+2*pPage->nCell+2 || CORRUPT_DB ); + assert( idx+sz <= (int)pPage->pBt->usableSize ); + pPage->nFree -= (u16)(2 + sz); + memcpy(&data[idx], pCell, sz); + if( iChild ){ + put4byte(&data[idx], iChild); + } + pIns = pPage->aCellIdx + i*2; + memmove(pIns+2, pIns, 2*(pPage->nCell - i)); + put2byte(pIns, idx); + pPage->nCell++; + /* increment the cell count */ + if( (++data[pPage->hdrOffset+4])==0 ) data[pPage->hdrOffset+3]++; + assert( get2byte(&data[pPage->hdrOffset+3])==pPage->nCell ); +#ifndef SQLITE_OMIT_AUTOVACUUM + if( pPage->pBt->autoVacuum ){ + /* The cell may contain a pointer to an overflow page. If so, write + ** the entry for the overflow page into the pointer map. + */ + ptrmapPutOvflPtr(pPage, pCell, pRC); + } +#endif + } +} + +/* +** A CellArray object contains a cache of pointers and sizes for a +** consecutive sequence of cells that might be held on multiple pages. +*/ +typedef struct CellArray CellArray; +struct CellArray { + int nCell; /* Number of cells in apCell[] */ + MemPage *pRef; /* Reference page */ + u8 **apCell; /* All cells begin balanced */ + u16 *szCell; /* Local size of all cells in apCell[] */ +}; + +/* +** Make sure the cell sizes at idx, idx+1, ..., idx+N-1 have been +** computed. +*/ +static void populateCellCache(CellArray *p, int idx, int N){ + assert( idx>=0 && idx+N<=p->nCell ); + while( N>0 ){ + assert( p->apCell[idx]!=0 ); + if( p->szCell[idx]==0 ){ + p->szCell[idx] = p->pRef->xCellSize(p->pRef, p->apCell[idx]); + }else{ + assert( CORRUPT_DB || + p->szCell[idx]==p->pRef->xCellSize(p->pRef, p->apCell[idx]) ); + } + idx++; + N--; + } +} + +/* +** Return the size of the Nth element of the cell array +*/ +static SQLITE_NOINLINE u16 computeCellSize(CellArray *p, int N){ + assert( N>=0 && NnCell ); + assert( p->szCell[N]==0 ); + p->szCell[N] = p->pRef->xCellSize(p->pRef, p->apCell[N]); + return p->szCell[N]; +} +static u16 cachedCellSize(CellArray *p, int N){ + assert( N>=0 && NnCell ); + if( p->szCell[N] ) return p->szCell[N]; + return computeCellSize(p, N); +} + +/* +** Array apCell[] contains pointers to nCell b-tree page cells. The +** szCell[] array contains the size in bytes of each cell. This function +** replaces the current contents of page pPg with the contents of the cell +** array. +** +** Some of the cells in apCell[] may currently be stored in pPg. This +** function works around problems caused by this by making a copy of any +** such cells before overwriting the page data. +** +** The MemPage.nFree field is invalidated by this function. It is the +** responsibility of the caller to set it correctly. +*/ +static int rebuildPage( + MemPage *pPg, /* Edit this page */ + int nCell, /* Final number of cells on page */ + u8 **apCell, /* Array of cells */ + u16 *szCell /* Array of cell sizes */ +){ + const int hdr = pPg->hdrOffset; /* Offset of header on pPg */ + u8 * const aData = pPg->aData; /* Pointer to data for pPg */ + const int usableSize = pPg->pBt->usableSize; + u8 * const pEnd = &aData[usableSize]; + int i; + u8 *pCellptr = pPg->aCellIdx; + u8 *pTmp = sqlite3PagerTempSpace(pPg->pBt->pPager); + u8 *pData; + + i = get2byte(&aData[hdr+5]); + memcpy(&pTmp[i], &aData[i], usableSize - i); + + pData = pEnd; + for(i=0; ixCellSize(pPg, pCell) || CORRUPT_DB ); + testcase( szCell[i]!=pPg->xCellSize(pPg,pCell) ); + } + + /* The pPg->nFree field is now set incorrectly. The caller will fix it. */ + pPg->nCell = nCell; + pPg->nOverflow = 0; + + put2byte(&aData[hdr+1], 0); + put2byte(&aData[hdr+3], pPg->nCell); + put2byte(&aData[hdr+5], pData - aData); + aData[hdr+7] = 0x00; + return SQLITE_OK; +} + +/* +** Array apCell[] contains nCell pointers to b-tree cells. Array szCell +** contains the size in bytes of each such cell. This function attempts to +** add the cells stored in the array to page pPg. If it cannot (because +** the page needs to be defragmented before the cells will fit), non-zero +** is returned. Otherwise, if the cells are added successfully, zero is +** returned. +** +** Argument pCellptr points to the first entry in the cell-pointer array +** (part of page pPg) to populate. After cell apCell[0] is written to the +** page body, a 16-bit offset is written to pCellptr. And so on, for each +** cell in the array. It is the responsibility of the caller to ensure +** that it is safe to overwrite this part of the cell-pointer array. +** +** When this function is called, *ppData points to the start of the +** content area on page pPg. If the size of the content area is extended, +** *ppData is updated to point to the new start of the content area +** before returning. +** +** Finally, argument pBegin points to the byte immediately following the +** end of the space required by this page for the cell-pointer area (for +** all cells - not just those inserted by the current call). If the content +** area must be extended to before this point in order to accomodate all +** cells in apCell[], then the cells do not fit and non-zero is returned. +*/ +static int pageInsertArray( + MemPage *pPg, /* Page to add cells to */ + u8 *pBegin, /* End of cell-pointer array */ + u8 **ppData, /* IN/OUT: Page content -area pointer */ + u8 *pCellptr, /* Pointer to cell-pointer area */ + int iFirst, /* Index of first cell to add */ + int nCell, /* Number of cells to add to pPg */ + CellArray *pCArray /* Array of cells */ +){ + int i; + u8 *aData = pPg->aData; + u8 *pData = *ppData; + int iEnd = iFirst + nCell; + assert( CORRUPT_DB || pPg->hdrOffset==0 ); /* Never called on page 1 */ + for(i=iFirst; iapCell[i] will never overlap on a well-formed + ** database. But they might for a corrupt database. Hence use memmove() + ** since memcpy() sends SIGABORT with overlapping buffers on OpenBSD */ + assert( (pSlot+sz)<=pCArray->apCell[i] + || pSlot>=(pCArray->apCell[i]+sz) + || CORRUPT_DB ); + memmove(pSlot, pCArray->apCell[i], sz); + put2byte(pCellptr, (pSlot - aData)); + pCellptr += 2; + } + *ppData = pData; + return 0; +} + +/* +** Array apCell[] contains nCell pointers to b-tree cells. Array szCell +** contains the size in bytes of each such cell. This function adds the +** space associated with each cell in the array that is currently stored +** within the body of pPg to the pPg free-list. The cell-pointers and other +** fields of the page are not updated. +** +** This function returns the total number of cells added to the free-list. +*/ +static int pageFreeArray( + MemPage *pPg, /* Page to edit */ + int iFirst, /* First cell to delete */ + int nCell, /* Cells to delete */ + CellArray *pCArray /* Array of cells */ +){ + u8 * const aData = pPg->aData; + u8 * const pEnd = &aData[pPg->pBt->usableSize]; + u8 * const pStart = &aData[pPg->hdrOffset + 8 + pPg->childPtrSize]; + int nRet = 0; + int i; + int iEnd = iFirst + nCell; + u8 *pFree = 0; + int szFree = 0; + + for(i=iFirst; iapCell[i]; + if( SQLITE_WITHIN(pCell, pStart, pEnd) ){ + int sz; + /* No need to use cachedCellSize() here. The sizes of all cells that + ** are to be freed have already been computing while deciding which + ** cells need freeing */ + sz = pCArray->szCell[i]; assert( sz>0 ); + if( pFree!=(pCell + sz) ){ + if( pFree ){ + assert( pFree>aData && (pFree - aData)<65536 ); + freeSpace(pPg, (u16)(pFree - aData), szFree); + } + pFree = pCell; + szFree = sz; + if( pFree+sz>pEnd ) return 0; + }else{ + pFree = pCell; + szFree += sz; + } + nRet++; + } + } + if( pFree ){ + assert( pFree>aData && (pFree - aData)<65536 ); + freeSpace(pPg, (u16)(pFree - aData), szFree); + } + return nRet; +} + +/* +** apCell[] and szCell[] contains pointers to and sizes of all cells in the +** pages being balanced. The current page, pPg, has pPg->nCell cells starting +** with apCell[iOld]. After balancing, this page should hold nNew cells +** starting at apCell[iNew]. +** +** This routine makes the necessary adjustments to pPg so that it contains +** the correct cells after being balanced. +** +** The pPg->nFree field is invalid when this function returns. It is the +** responsibility of the caller to set it correctly. +*/ +static int editPage( + MemPage *pPg, /* Edit this page */ + int iOld, /* Index of first cell currently on page */ + int iNew, /* Index of new first cell on page */ + int nNew, /* Final number of cells on page */ + CellArray *pCArray /* Array of cells and sizes */ +){ + u8 * const aData = pPg->aData; + const int hdr = pPg->hdrOffset; + u8 *pBegin = &pPg->aCellIdx[nNew * 2]; + int nCell = pPg->nCell; /* Cells stored on pPg */ + u8 *pData; + u8 *pCellptr; + int i; + int iOldEnd = iOld + pPg->nCell + pPg->nOverflow; + int iNewEnd = iNew + nNew; + +#ifdef SQLITE_DEBUG + u8 *pTmp = sqlite3PagerTempSpace(pPg->pBt->pPager); + memcpy(pTmp, aData, pPg->pBt->usableSize); +#endif + + /* Remove cells from the start and end of the page */ + if( iOldaCellIdx, &pPg->aCellIdx[nShift*2], nCell*2); + nCell -= nShift; + } + if( iNewEnd < iOldEnd ){ + nCell -= pageFreeArray(pPg, iNewEnd, iOldEnd - iNewEnd, pCArray); + } + + pData = &aData[get2byteNotZero(&aData[hdr+5])]; + if( pDataaCellIdx; + memmove(&pCellptr[nAdd*2], pCellptr, nCell*2); + if( pageInsertArray( + pPg, pBegin, &pData, pCellptr, + iNew, nAdd, pCArray + ) ) goto editpage_fail; + nCell += nAdd; + } + + /* Add any overflow cells */ + for(i=0; inOverflow; i++){ + int iCell = (iOld + pPg->aiOvfl[i]) - iNew; + if( iCell>=0 && iCellaCellIdx[iCell * 2]; + memmove(&pCellptr[2], pCellptr, (nCell - iCell) * 2); + nCell++; + if( pageInsertArray( + pPg, pBegin, &pData, pCellptr, + iCell+iNew, 1, pCArray + ) ) goto editpage_fail; + } + } + + /* Append cells to the end of the page */ + pCellptr = &pPg->aCellIdx[nCell*2]; + if( pageInsertArray( + pPg, pBegin, &pData, pCellptr, + iNew+nCell, nNew-nCell, pCArray + ) ) goto editpage_fail; + + pPg->nCell = nNew; + pPg->nOverflow = 0; + + put2byte(&aData[hdr+3], pPg->nCell); + put2byte(&aData[hdr+5], pData - aData); + +#ifdef SQLITE_DEBUG + for(i=0; iapCell[i+iNew]; + int iOff = get2byteAligned(&pPg->aCellIdx[i*2]); + if( SQLITE_WITHIN(pCell, aData, &aData[pPg->pBt->usableSize]) ){ + pCell = &pTmp[pCell - aData]; + } + assert( 0==memcmp(pCell, &aData[iOff], + pCArray->pRef->xCellSize(pCArray->pRef, pCArray->apCell[i+iNew])) ); + } +#endif + + return SQLITE_OK; + editpage_fail: + /* Unable to edit this page. Rebuild it from scratch instead. */ + populateCellCache(pCArray, iNew, nNew); + return rebuildPage(pPg, nNew, &pCArray->apCell[iNew], &pCArray->szCell[iNew]); +} + +/* +** The following parameters determine how many adjacent pages get involved +** in a balancing operation. NN is the number of neighbors on either side +** of the page that participate in the balancing operation. NB is the +** total number of pages that participate, including the target page and +** NN neighbors on either side. +** +** The minimum value of NN is 1 (of course). Increasing NN above 1 +** (to 2 or 3) gives a modest improvement in SELECT and DELETE performance +** in exchange for a larger degradation in INSERT and UPDATE performance. +** The value of NN appears to give the best results overall. +*/ +#define NN 1 /* Number of neighbors on either side of pPage */ +#define NB (NN*2+1) /* Total pages involved in the balance */ + + +#ifndef SQLITE_OMIT_QUICKBALANCE +/* +** This version of balance() handles the common special case where +** a new entry is being inserted on the extreme right-end of the +** tree, in other words, when the new entry will become the largest +** entry in the tree. +** +** Instead of trying to balance the 3 right-most leaf pages, just add +** a new page to the right-hand side and put the one new entry in +** that page. This leaves the right side of the tree somewhat +** unbalanced. But odds are that we will be inserting new entries +** at the end soon afterwards so the nearly empty page will quickly +** fill up. On average. +** +** pPage is the leaf page which is the right-most page in the tree. +** pParent is its parent. pPage must have a single overflow entry +** which is also the right-most entry on the page. +** +** The pSpace buffer is used to store a temporary copy of the divider +** cell that will be inserted into pParent. Such a cell consists of a 4 +** byte page number followed by a variable length integer. In other +** words, at most 13 bytes. Hence the pSpace buffer must be at +** least 13 bytes in size. +*/ +static int balance_quick(MemPage *pParent, MemPage *pPage, u8 *pSpace){ + BtShared *const pBt = pPage->pBt; /* B-Tree Database */ + MemPage *pNew; /* Newly allocated page */ + int rc; /* Return Code */ + Pgno pgnoNew; /* Page number of pNew */ + + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + assert( sqlite3PagerIswriteable(pParent->pDbPage) ); + assert( pPage->nOverflow==1 ); + + /* This error condition is now caught prior to reaching this function */ + if( NEVER(pPage->nCell==0) ) return SQLITE_CORRUPT_BKPT; + + /* Allocate a new page. This page will become the right-sibling of + ** pPage. Make the parent page writable, so that the new divider cell + ** may be inserted. If both these operations are successful, proceed. + */ + rc = allocateBtreePage(pBt, &pNew, &pgnoNew, 0, 0); + + if( rc==SQLITE_OK ){ + + u8 *pOut = &pSpace[4]; + u8 *pCell = pPage->apOvfl[0]; + u16 szCell = pPage->xCellSize(pPage, pCell); + u8 *pStop; + + assert( sqlite3PagerIswriteable(pNew->pDbPage) ); + assert( pPage->aData[0]==(PTF_INTKEY|PTF_LEAFDATA|PTF_LEAF) ); + zeroPage(pNew, PTF_INTKEY|PTF_LEAFDATA|PTF_LEAF); + rc = rebuildPage(pNew, 1, &pCell, &szCell); + if( NEVER(rc) ) return rc; + pNew->nFree = pBt->usableSize - pNew->cellOffset - 2 - szCell; + + /* If this is an auto-vacuum database, update the pointer map + ** with entries for the new page, and any pointer from the + ** cell on the page to an overflow page. If either of these + ** operations fails, the return code is set, but the contents + ** of the parent page are still manipulated by thh code below. + ** That is Ok, at this point the parent page is guaranteed to + ** be marked as dirty. Returning an error code will cause a + ** rollback, undoing any changes made to the parent page. + */ + if( ISAUTOVACUUM ){ + ptrmapPut(pBt, pgnoNew, PTRMAP_BTREE, pParent->pgno, &rc); + if( szCell>pNew->minLocal ){ + ptrmapPutOvflPtr(pNew, pCell, &rc); + } + } + + /* Create a divider cell to insert into pParent. The divider cell + ** consists of a 4-byte page number (the page number of pPage) and + ** a variable length key value (which must be the same value as the + ** largest key on pPage). + ** + ** To find the largest key value on pPage, first find the right-most + ** cell on pPage. The first two fields of this cell are the + ** record-length (a variable length integer at most 32-bits in size) + ** and the key value (a variable length integer, may have any value). + ** The first of the while(...) loops below skips over the record-length + ** field. The second while(...) loop copies the key value from the + ** cell on pPage into the pSpace buffer. + */ + pCell = findCell(pPage, pPage->nCell-1); + pStop = &pCell[9]; + while( (*(pCell++)&0x80) && pCellnCell, pSpace, (int)(pOut-pSpace), + 0, pPage->pgno, &rc); + } + + /* Set the right-child pointer of pParent to point to the new page. */ + put4byte(&pParent->aData[pParent->hdrOffset+8], pgnoNew); + + /* Release the reference to the new page. */ + releasePage(pNew); + } + + return rc; +} +#endif /* SQLITE_OMIT_QUICKBALANCE */ + +#if 0 +/* +** This function does not contribute anything to the operation of SQLite. +** it is sometimes activated temporarily while debugging code responsible +** for setting pointer-map entries. +*/ +static int ptrmapCheckPages(MemPage **apPage, int nPage){ + int i, j; + for(i=0; ipBt; + assert( pPage->isInit ); + + for(j=0; jnCell; j++){ + CellInfo info; + u8 *z; + + z = findCell(pPage, j); + pPage->xParseCell(pPage, z, &info); + if( info.nLocalpgno && e==PTRMAP_OVERFLOW1 ); + } + if( !pPage->leaf ){ + Pgno child = get4byte(z); + ptrmapGet(pBt, child, &e, &n); + assert( n==pPage->pgno && e==PTRMAP_BTREE ); + } + } + if( !pPage->leaf ){ + Pgno child = get4byte(&pPage->aData[pPage->hdrOffset+8]); + ptrmapGet(pBt, child, &e, &n); + assert( n==pPage->pgno && e==PTRMAP_BTREE ); + } + } + return 1; +} +#endif + +/* +** This function is used to copy the contents of the b-tree node stored +** on page pFrom to page pTo. If page pFrom was not a leaf page, then +** the pointer-map entries for each child page are updated so that the +** parent page stored in the pointer map is page pTo. If pFrom contained +** any cells with overflow page pointers, then the corresponding pointer +** map entries are also updated so that the parent page is page pTo. +** +** If pFrom is currently carrying any overflow cells (entries in the +** MemPage.apOvfl[] array), they are not copied to pTo. +** +** Before returning, page pTo is reinitialized using btreeInitPage(). +** +** The performance of this function is not critical. It is only used by +** the balance_shallower() and balance_deeper() procedures, neither of +** which are called often under normal circumstances. +*/ +static void copyNodeContent(MemPage *pFrom, MemPage *pTo, int *pRC){ + if( (*pRC)==SQLITE_OK ){ + BtShared * const pBt = pFrom->pBt; + u8 * const aFrom = pFrom->aData; + u8 * const aTo = pTo->aData; + int const iFromHdr = pFrom->hdrOffset; + int const iToHdr = ((pTo->pgno==1) ? 100 : 0); + int rc; + int iData; + + + assert( pFrom->isInit ); + assert( pFrom->nFree>=iToHdr ); + assert( get2byte(&aFrom[iFromHdr+5]) <= (int)pBt->usableSize ); + + /* Copy the b-tree node content from page pFrom to page pTo. */ + iData = get2byte(&aFrom[iFromHdr+5]); + memcpy(&aTo[iData], &aFrom[iData], pBt->usableSize-iData); + 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 can actually fail under + ** fairly obscure circumstances, even though it is a copy of initialized + ** page pFrom. + */ + pTo->isInit = 0; + 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. + */ + if( ISAUTOVACUUM ){ + *pRC = setChildPtrmaps(pTo); + } + } +} + +/* +** This routine redistributes cells on the iParentIdx'th child of pParent +** (hereafter "the page") and up to 2 siblings so that all pages have about the +** same amount of free space. Usually a single sibling on either side of the +** page are used in the balancing, though both siblings might come from one +** side if the page is the first or last child of its parent. If the page +** has fewer than 2 siblings (something which can only happen if the page +** is a root page or a child of a root page) then all available siblings +** participate in the balancing. +** +** The number of siblings of the page might be increased or decreased by +** one or two in an effort to keep pages nearly full but not over full. +** +** Note that when this routine is called, some of the cells on the page +** might not actually be stored in MemPage.aData[]. This can happen +** if the page is overfull. This routine ensures that all cells allocated +** to the page and its siblings fit into MemPage.aData[] before returning. +** +** In the course of balancing the page and its siblings, cells may be +** inserted into or removed from the parent page (pParent). Doing so +** may cause the parent page to become overfull or underfull. If this +** happens, it is the responsibility of the caller to invoke the correct +** balancing routine to fix this problem (see the balance() routine). +** +** If this routine fails for any reason, it might leave the database +** in a corrupted state. So if this routine fails, the database should +** be rolled back. +** +** The third argument to this function, aOvflSpace, is a pointer to a +** buffer big enough to hold one page. If while inserting cells into the parent +** page (pParent) the parent page becomes overfull, this buffer is +** used to store the parent's overflow cells. Because this function inserts +** a maximum of four divider cells into the parent page, and the maximum +** size of a cell stored within an internal node is always less than 1/4 +** of the page-size, the aOvflSpace[] buffer is guaranteed to be large +** enough for all overflow cells. +** +** If aOvflSpace is set to a null pointer, this function returns +** SQLITE_NOMEM. +*/ +static int balance_nonroot( + MemPage *pParent, /* Parent page of siblings being balanced */ + int iParentIdx, /* Index of "the page" in pParent */ + u8 *aOvflSpace, /* page-size bytes of space for parent ovfl */ + int isRoot, /* True if pParent is a root-page */ + int bBulk /* True if this call is part of a bulk load */ +){ + BtShared *pBt; /* The whole database */ + int nMaxCells = 0; /* Allocated size of apCell, szCell, aFrom. */ + int nNew = 0; /* Number of pages in apNew[] */ + int nOld; /* Number of pages in apOld[] */ + int i, j, k; /* Loop counters */ + int nxDiv; /* Next divider slot in pParent->aCell[] */ + int rc = SQLITE_OK; /* The return code */ + u16 leafCorrection; /* 4 if pPage is a leaf. 0 if not */ + int leafData; /* True if pPage is a leaf of a LEAFDATA tree */ + int usableSpace; /* Bytes in pPage beyond the header */ + int pageFlags; /* Value of pPage->aData[0] */ + int iSpace1 = 0; /* First unused byte of aSpace1[] */ + int iOvflSpace = 0; /* First unused byte of aOvflSpace[] */ + int szScratch; /* Size of scratch memory requested */ + MemPage *apOld[NB]; /* pPage and up to two siblings */ + MemPage *apNew[NB+2]; /* pPage and up to NB siblings after balancing */ + u8 *pRight; /* Location in parent of right-sibling pointer */ + u8 *apDiv[NB-1]; /* Divider cells in pParent */ + int cntNew[NB+2]; /* Index in b.paCell[] of cell after i-th page */ + int cntOld[NB+2]; /* Old index in b.apCell[] */ + int szNew[NB+2]; /* Combined size of cells placed on i-th page */ + u8 *aSpace1; /* Space for copies of dividers cells */ + Pgno pgno; /* Temp var to store a page number in */ + u8 abDone[NB+2]; /* True after i'th new page is populated */ + Pgno aPgno[NB+2]; /* Page numbers of new pages before shuffling */ + Pgno aPgOrder[NB+2]; /* Copy of aPgno[] used for sorting pages */ + u16 aPgFlags[NB+2]; /* flags field of new pages before shuffling */ + CellArray b; /* Parsed information on cells being balanced */ + + memset(abDone, 0, sizeof(abDone)); + b.nCell = 0; + b.apCell = 0; + pBt = pParent->pBt; + assert( sqlite3_mutex_held(pBt->mutex) ); + assert( sqlite3PagerIswriteable(pParent->pDbPage) ); + +#if 0 + TRACE(("BALANCE: begin page %d child of %d\n", pPage->pgno, pParent->pgno)); +#endif + + /* At this point pParent may have at most one overflow cell. And if + ** this overflow cell is present, it must be the cell with + ** index iParentIdx. This scenario comes about when this function + ** is called (indirectly) from sqlite3BtreeDelete(). + */ + assert( pParent->nOverflow==0 || pParent->nOverflow==1 ); + assert( pParent->nOverflow==0 || pParent->aiOvfl[0]==iParentIdx ); + + if( !aOvflSpace ){ + return SQLITE_NOMEM_BKPT; + } + + /* Find the sibling pages to balance. Also locate the cells in pParent + ** that divide the siblings. An attempt is made to find NN siblings on + ** either side of pPage. More siblings are taken from one side, however, + ** if there are fewer than NN siblings on the other side. If pParent + ** has NB or fewer children then all children of pParent are taken. + ** + ** This loop also drops the divider cells from the parent page. This + ** way, the remainder of the function does not have to deal with any + ** overflow cells in the parent page, since if any existed they will + ** have already been removed. + */ + i = pParent->nOverflow + pParent->nCell; + if( i<2 ){ + nxDiv = 0; + }else{ + assert( bBulk==0 || bBulk==1 ); + if( iParentIdx==0 ){ + nxDiv = 0; + }else if( iParentIdx==i ){ + nxDiv = i-2+bBulk; + }else{ + nxDiv = iParentIdx-1; + } + i = 2-bBulk; + } + nOld = i+1; + if( (i+nxDiv-pParent->nOverflow)==pParent->nCell ){ + pRight = &pParent->aData[pParent->hdrOffset+8]; + }else{ + pRight = findCell(pParent, i+nxDiv-pParent->nOverflow); + } + pgno = get4byte(pRight); + while( 1 ){ + rc = getAndInitPage(pBt, pgno, &apOld[i], 0, 0); + if( rc ){ + memset(apOld, 0, (i+1)*sizeof(MemPage*)); + goto balance_cleanup; + } + nMaxCells += 1+apOld[i]->nCell+apOld[i]->nOverflow; + if( (i--)==0 ) break; + + if( i+nxDiv==pParent->aiOvfl[0] && pParent->nOverflow ){ + apDiv[i] = pParent->apOvfl[0]; + pgno = get4byte(apDiv[i]); + szNew[i] = pParent->xCellSize(pParent, apDiv[i]); + pParent->nOverflow = 0; + }else{ + apDiv[i] = findCell(pParent, i+nxDiv-pParent->nOverflow); + pgno = get4byte(apDiv[i]); + szNew[i] = pParent->xCellSize(pParent, apDiv[i]); + + /* Drop the cell from the parent page. apDiv[i] still points to + ** the cell within the parent, even though it has been dropped. + ** This is safe because dropping a cell only overwrites the first + ** four bytes of it, and this function does not need the first + ** four bytes of the divider cell. So the pointer is safe to use + ** later on. + ** + ** But not if we are in secure-delete mode. In secure-delete mode, + ** the dropCell() routine will overwrite the entire cell with zeroes. + ** In this case, temporarily copy the cell into the aOvflSpace[] + ** buffer. It will be copied out again as soon as the aSpace[] buffer + ** is allocated. */ + if( pBt->btsFlags & BTS_SECURE_DELETE ){ + int iOff; + + iOff = SQLITE_PTR_TO_INT(apDiv[i]) - SQLITE_PTR_TO_INT(pParent->aData); + if( (iOff+szNew[i])>(int)pBt->usableSize ){ + rc = SQLITE_CORRUPT_BKPT; + memset(apOld, 0, (i+1)*sizeof(MemPage*)); + goto balance_cleanup; + }else{ + memcpy(&aOvflSpace[iOff], apDiv[i], szNew[i]); + apDiv[i] = &aOvflSpace[apDiv[i]-pParent->aData]; + } + } + dropCell(pParent, i+nxDiv-pParent->nOverflow, szNew[i], &rc); + } + } + + /* Make nMaxCells a multiple of 4 in order to preserve 8-byte + ** alignment */ + nMaxCells = (nMaxCells + 3)&~3; + + /* + ** Allocate space for memory structures + */ + szScratch = + nMaxCells*sizeof(u8*) /* b.apCell */ + + nMaxCells*sizeof(u16) /* b.szCell */ + + pBt->pageSize; /* aSpace1 */ + + /* EVIDENCE-OF: R-28375-38319 SQLite will never request a scratch buffer + ** that is more than 6 times the database page size. */ + assert( szScratch<=6*(int)pBt->pageSize ); + b.apCell = sqlite3ScratchMalloc( szScratch ); + if( b.apCell==0 ){ + rc = SQLITE_NOMEM_BKPT; + goto balance_cleanup; + } + b.szCell = (u16*)&b.apCell[nMaxCells]; + aSpace1 = (u8*)&b.szCell[nMaxCells]; + assert( EIGHT_BYTE_ALIGNMENT(aSpace1) ); + + /* + ** Load pointers to all cells on sibling pages and the divider cells + ** into the local b.apCell[] array. Make copies of the divider cells + ** into space obtained from aSpace1[]. The divider cells have already + ** been removed from pParent. + ** + ** If the siblings are on leaf pages, then the child pointers of the + ** divider cells are stripped from the cells before they are copied + ** into aSpace1[]. In this way, all cells in b.apCell[] are without + ** child pointers. If siblings are not leaves, then all cell in + ** b.apCell[] include child pointers. Either way, all cells in b.apCell[] + ** are alike. + ** + ** leafCorrection: 4 if pPage is a leaf. 0 if pPage is not a leaf. + ** leafData: 1 if pPage holds key+data and pParent holds only keys. + */ + b.pRef = apOld[0]; + leafCorrection = b.pRef->leaf*4; + leafData = b.pRef->intKeyLeaf; + for(i=0; inCell; + u8 *aData = pOld->aData; + u16 maskPage = pOld->maskPage; + u8 *piCell = aData + pOld->cellOffset; + u8 *piEnd; + + /* Verify that all sibling pages are of the same "type" (table-leaf, + ** table-interior, index-leaf, or index-interior). + */ + if( pOld->aData[0]!=apOld[0]->aData[0] ){ + rc = SQLITE_CORRUPT_BKPT; + goto balance_cleanup; + } + + /* Load b.apCell[] with pointers to all cells in pOld. If pOld + ** constains overflow cells, include them in the b.apCell[] array + ** in the correct spot. + ** + ** Note that when there are multiple overflow cells, it is always the + ** case that they are sequential and adjacent. This invariant arises + ** because multiple overflows can only occurs when inserting divider + ** cells into a parent on a prior balance, and divider cells are always + ** adjacent and are inserted in order. There is an assert() tagged + ** with "NOTE 1" in the overflow cell insertion loop to prove this + ** invariant. + ** + ** This must be done in advance. Once the balance starts, the cell + ** offset section of the btree page will be overwritten and we will no + ** long be able to find the cells if a pointer to each cell is not saved + ** first. + */ + memset(&b.szCell[b.nCell], 0, sizeof(b.szCell[0])*(limit+pOld->nOverflow)); + if( pOld->nOverflow>0 ){ + limit = pOld->aiOvfl[0]; + for(j=0; jnOverflow; k++){ + assert( k==0 || pOld->aiOvfl[k-1]+1==pOld->aiOvfl[k] );/* NOTE 1 */ + b.apCell[b.nCell] = pOld->apOvfl[k]; + b.nCell++; + } + } + piEnd = aData + pOld->cellOffset + 2*pOld->nCell; + while( piCellmaxLocal+23 ); + assert( iSpace1 <= (int)pBt->pageSize ); + memcpy(pTemp, apDiv[i], sz); + b.apCell[b.nCell] = pTemp+leafCorrection; + assert( leafCorrection==0 || leafCorrection==4 ); + b.szCell[b.nCell] = b.szCell[b.nCell] - leafCorrection; + if( !pOld->leaf ){ + assert( leafCorrection==0 ); + assert( pOld->hdrOffset==0 ); + /* The right pointer of the child page pOld becomes the left + ** pointer of the divider cell */ + memcpy(b.apCell[b.nCell], &pOld->aData[8], 4); + }else{ + assert( leafCorrection==4 ); + while( b.szCell[b.nCell]<4 ){ + /* Do not allow any cells smaller than 4 bytes. If a smaller cell + ** does exist, pad it with 0x00 bytes. */ + assert( b.szCell[b.nCell]==3 || CORRUPT_DB ); + assert( b.apCell[b.nCell]==&aSpace1[iSpace1-3] || CORRUPT_DB ); + aSpace1[iSpace1++] = 0x00; + b.szCell[b.nCell]++; + } + } + b.nCell++; + } + } + + /* + ** Figure out the number of pages needed to hold all b.nCell cells. + ** Store this number in "k". Also compute szNew[] which is the total + ** size of all cells on the i-th page and cntNew[] which is the index + ** in b.apCell[] of the cell that divides page i from page i+1. + ** cntNew[k] should equal b.nCell. + ** + ** Values computed by this block: + ** + ** k: The total number of sibling pages + ** szNew[i]: Spaced used on the i-th sibling page. + ** cntNew[i]: Index in b.apCell[] and b.szCell[] for the first cell to + ** the right of the i-th sibling page. + ** usableSpace: Number of bytes of space available on each sibling. + ** + */ + usableSpace = pBt->usableSize - 12 + leafCorrection; + for(i=0; inFree; + if( szNew[i]<0 ){ rc = SQLITE_CORRUPT_BKPT; goto balance_cleanup; } + for(j=0; jnOverflow; j++){ + szNew[i] += 2 + p->xCellSize(p, p->apOvfl[j]); + } + cntNew[i] = cntOld[i]; + } + k = nOld; + for(i=0; iusableSpace ){ + if( i+1>=k ){ + k = i+2; + if( k>NB+2 ){ rc = SQLITE_CORRUPT_BKPT; goto balance_cleanup; } + szNew[k-1] = 0; + cntNew[k-1] = b.nCell; + } + sz = 2 + cachedCellSize(&b, cntNew[i]-1); + szNew[i] -= sz; + if( !leafData ){ + if( cntNew[i]usableSpace ) break; + szNew[i] += sz; + cntNew[i]++; + if( !leafData ){ + if( cntNew[i]=b.nCell ){ + k = i+1; + }else if( cntNew[i] <= (i>0 ? cntNew[i-1] : 0) ){ + rc = SQLITE_CORRUPT_BKPT; + goto balance_cleanup; + } + } + + /* + ** The packing computed by the previous block is biased toward the siblings + ** on the left side (siblings with smaller keys). The left siblings are + ** always nearly full, while the right-most sibling might be nearly empty. + ** The next block of code attempts to adjust the packing of siblings to + ** get a better balance. + ** + ** This adjustment is more than an optimization. The packing above might + ** be so out of balance as to be illegal. For example, the right-most + ** sibling might be completely empty. This adjustment is not optional. + */ + for(i=k-1; i>0; i--){ + int szRight = szNew[i]; /* Size of sibling on the right */ + int szLeft = szNew[i-1]; /* Size of sibling on the left */ + int r; /* Index of right-most cell in left sibling */ + int d; /* Index of first cell to the left of right sibling */ + + r = cntNew[i-1] - 1; + d = r + 1 - leafData; + (void)cachedCellSize(&b, d); + do{ + assert( d szLeft-(b.szCell[r]+(i==k-1?0:2)))){ + break; + } + szRight += b.szCell[d] + 2; + szLeft -= b.szCell[r] + 2; + cntNew[i-1] = r; + r--; + d--; + }while( r>=0 ); + szNew[i] = szRight; + szNew[i-1] = szLeft; + if( cntNew[i-1] <= (i>1 ? cntNew[i-2] : 0) ){ + rc = SQLITE_CORRUPT_BKPT; + goto balance_cleanup; + } + } + + /* Sanity check: For a non-corrupt database file one of the follwing + ** must be true: + ** (1) We found one or more cells (cntNew[0])>0), or + ** (2) pPage is a virtual root page. A virtual root page is when + ** the real root page is page 1 and we are the only child of + ** that page. + */ + assert( cntNew[0]>0 || (pParent->pgno==1 && pParent->nCell==0) || CORRUPT_DB); + TRACE(("BALANCE: old: %d(nc=%d) %d(nc=%d) %d(nc=%d)\n", + apOld[0]->pgno, apOld[0]->nCell, + nOld>=2 ? apOld[1]->pgno : 0, nOld>=2 ? apOld[1]->nCell : 0, + nOld>=3 ? apOld[2]->pgno : 0, nOld>=3 ? apOld[2]->nCell : 0 + )); + + /* + ** Allocate k new pages. Reuse old pages where possible. + */ + pageFlags = apOld[0]->aData[0]; + for(i=0; ipDbPage); + nNew++; + if( rc ) goto balance_cleanup; + }else{ + assert( i>0 ); + rc = allocateBtreePage(pBt, &pNew, &pgno, (bBulk ? 1 : pgno), 0); + if( rc ) goto balance_cleanup; + zeroPage(pNew, pageFlags); + apNew[i] = pNew; + nNew++; + cntOld[i] = b.nCell; + + /* Set the pointer-map entry for the new sibling page. */ + if( ISAUTOVACUUM ){ + ptrmapPut(pBt, pNew->pgno, PTRMAP_BTREE, pParent->pgno, &rc); + if( rc!=SQLITE_OK ){ + goto balance_cleanup; + } + } + } + } + + /* + ** Reassign page numbers so that the new pages are in ascending order. + ** This helps to keep entries in the disk file in order so that a scan + ** of the table is closer to a linear scan through the file. That in turn + ** helps the operating system to deliver pages from the disk more rapidly. + ** + ** An O(n^2) insertion sort algorithm is used, but since n is never more + ** than (NB+2) (a small constant), that should not be a problem. + ** + ** When NB==3, this one optimization makes the database about 25% faster + ** for large insertions and deletions. + */ + for(i=0; ipgno; + aPgFlags[i] = apNew[i]->pDbPage->flags; + for(j=0; ji ){ + sqlite3PagerRekey(apNew[iBest]->pDbPage, pBt->nPage+iBest+1, 0); + } + sqlite3PagerRekey(apNew[i]->pDbPage, pgno, aPgFlags[iBest]); + apNew[i]->pgno = pgno; + } + } + + TRACE(("BALANCE: new: %d(%d nc=%d) %d(%d nc=%d) %d(%d nc=%d) " + "%d(%d nc=%d) %d(%d nc=%d)\n", + apNew[0]->pgno, szNew[0], cntNew[0], + nNew>=2 ? apNew[1]->pgno : 0, nNew>=2 ? szNew[1] : 0, + nNew>=2 ? cntNew[1] - cntNew[0] - !leafData : 0, + nNew>=3 ? apNew[2]->pgno : 0, nNew>=3 ? szNew[2] : 0, + nNew>=3 ? cntNew[2] - cntNew[1] - !leafData : 0, + nNew>=4 ? apNew[3]->pgno : 0, nNew>=4 ? szNew[3] : 0, + nNew>=4 ? cntNew[3] - cntNew[2] - !leafData : 0, + nNew>=5 ? apNew[4]->pgno : 0, nNew>=5 ? szNew[4] : 0, + nNew>=5 ? cntNew[4] - cntNew[3] - !leafData : 0 + )); + + assert( sqlite3PagerIswriteable(pParent->pDbPage) ); + put4byte(pRight, apNew[nNew-1]->pgno); + + /* If the sibling pages are not leaves, ensure that the right-child pointer + ** of the right-most new sibling page is set to the value that was + ** originally in the same field of the right-most old sibling page. */ + if( (pageFlags & PTF_LEAF)==0 && nOld!=nNew ){ + MemPage *pOld = (nNew>nOld ? apNew : apOld)[nOld-1]; + memcpy(&apNew[nNew-1]->aData[8], &pOld->aData[8], 4); + } + + /* Make any required updates to pointer map entries associated with + ** cells stored on sibling pages following the balance operation. Pointer + ** map entries associated with divider cells are set by the insertCell() + ** routine. The associated pointer map entries are: + ** + ** a) if the cell contains a reference to an overflow chain, the + ** entry associated with the first page in the overflow chain, and + ** + ** b) if the sibling pages are not leaves, the child page associated + ** with the cell. + ** + ** If the sibling pages are not leaves, then the pointer map entry + ** associated with the right-child of each sibling may also need to be + ** updated. This happens below, after the sibling pages have been + ** populated, not here. + */ + if( ISAUTOVACUUM ){ + MemPage *pNew = apNew[0]; + u8 *aOld = pNew->aData; + int cntOldNext = pNew->nCell + pNew->nOverflow; + int usableSize = pBt->usableSize; + int iNew = 0; + int iOld = 0; + + for(i=0; inCell + pOld->nOverflow + !leafData; + aOld = pOld->aData; + } + if( i==cntNew[iNew] ){ + pNew = apNew[++iNew]; + if( !leafData ) continue; + } + + /* Cell pCell is destined for new sibling page pNew. Originally, it + ** was either part of sibling page iOld (possibly an overflow cell), + ** or else the divider cell to the left of sibling page iOld. So, + ** if sibling page iOld had the same page number as pNew, and if + ** pCell really was a part of sibling page iOld (not a divider or + ** overflow cell), we can skip updating the pointer map entries. */ + if( iOld>=nNew + || pNew->pgno!=aPgno[iOld] + || !SQLITE_WITHIN(pCell,aOld,&aOld[usableSize]) + ){ + if( !leafCorrection ){ + ptrmapPut(pBt, get4byte(pCell), PTRMAP_BTREE, pNew->pgno, &rc); + } + if( cachedCellSize(&b,i)>pNew->minLocal ){ + ptrmapPutOvflPtr(pNew, pCell, &rc); + } + if( rc ) goto balance_cleanup; + } + } + } + + /* Insert new divider cells into pParent. */ + for(i=0; ileaf ){ + memcpy(&pNew->aData[8], pCell, 4); + }else if( leafData ){ + /* If the tree is a leaf-data tree, and the siblings are leaves, + ** then there is no divider cell in b.apCell[]. Instead, the divider + ** cell consists of the integer key for the right-most cell of + ** the sibling-page assembled above only. + */ + CellInfo info; + j--; + pNew->xParseCell(pNew, b.apCell[j], &info); + pCell = pTemp; + sz = 4 + putVarint(&pCell[4], info.nKey); + pTemp = 0; + }else{ + pCell -= 4; + /* Obscure case for non-leaf-data trees: If the cell at pCell was + ** previously stored on a leaf node, and its reported size was 4 + ** bytes, then it may actually be smaller than this + ** (see btreeParseCellPtr(), 4 bytes is the minimum size of + ** any cell). But it is important to pass the correct size to + ** insertCell(), so reparse the cell now. + ** + ** This can only happen for b-trees used to evaluate "IN (SELECT ...)" + ** and WITHOUT ROWID tables with exactly one column which is the + ** primary key. + */ + if( b.szCell[j]==4 ){ + assert(leafCorrection==4); + sz = pParent->xCellSize(pParent, pCell); + } + } + iOvflSpace += sz; + assert( sz<=pBt->maxLocal+23 ); + assert( iOvflSpace <= (int)pBt->pageSize ); + insertCell(pParent, nxDiv+i, pCell, sz, pTemp, pNew->pgno, &rc); + if( rc!=SQLITE_OK ) goto balance_cleanup; + assert( sqlite3PagerIswriteable(pParent->pDbPage) ); + } + + /* Now update the actual sibling pages. The order in which they are updated + ** is important, as this code needs to avoid disrupting any page from which + ** cells may still to be read. In practice, this means: + ** + ** (1) If cells are moving left (from apNew[iPg] to apNew[iPg-1]) + ** then it is not safe to update page apNew[iPg] until after + ** the left-hand sibling apNew[iPg-1] has been updated. + ** + ** (2) If cells are moving right (from apNew[iPg] to apNew[iPg+1]) + ** then it is not safe to update page apNew[iPg] until after + ** the right-hand sibling apNew[iPg+1] has been updated. + ** + ** If neither of the above apply, the page is safe to update. + ** + ** The iPg value in the following loop starts at nNew-1 goes down + ** to 0, then back up to nNew-1 again, thus making two passes over + ** the pages. On the initial downward pass, only condition (1) above + ** needs to be tested because (2) will always be true from the previous + ** step. On the upward pass, both conditions are always true, so the + ** upwards pass simply processes pages that were missed on the downward + ** pass. + */ + for(i=1-nNew; i=0 && iPg=0 /* On the upwards pass, or... */ + || cntOld[iPg-1]>=cntNew[iPg-1] /* Condition (1) is true */ + ){ + int iNew; + int iOld; + int nNewCell; + + /* Verify condition (1): If cells are moving left, update iPg + ** only after iPg-1 has already been updated. */ + assert( iPg==0 || cntOld[iPg-1]>=cntNew[iPg-1] || abDone[iPg-1] ); + + /* Verify condition (2): If cells are moving right, update iPg + ** only after iPg+1 has already been updated. */ + assert( cntNew[iPg]>=cntOld[iPg] || abDone[iPg+1] ); + + if( iPg==0 ){ + iNew = iOld = 0; + nNewCell = cntNew[0]; + }else{ + iOld = iPgnFree = usableSpace-szNew[iPg]; + assert( apNew[iPg]->nOverflow==0 ); + assert( apNew[iPg]->nCell==nNewCell ); + } + } + + /* All pages have been processed exactly once */ + assert( memcmp(abDone, "\01\01\01\01\01", nNew)==0 ); + + assert( nOld>0 ); + assert( nNew>0 ); + + if( isRoot && pParent->nCell==0 && pParent->hdrOffset<=apNew[0]->nFree ){ + /* The root page of the b-tree now contains no cells. The only sibling + ** page is the right-child of the parent. Copy the contents of the + ** child page into the parent, decreasing the overall height of the + ** b-tree structure by one. This is described as the "balance-shallower" + ** sub-algorithm in some documentation. + ** + ** If this is an auto-vacuum database, the call to copyNodeContent() + ** sets all pointer-map entries corresponding to database image pages + ** for which the pointer is stored within the content being copied. + ** + ** It is critical that the child page be defragmented before being + ** copied into the parent, because if the parent is page 1 then it will + ** by smaller than the child due to the database header, and so all the + ** free space needs to be up front. + */ + assert( nNew==1 || CORRUPT_DB ); + rc = defragmentPage(apNew[0]); + testcase( rc!=SQLITE_OK ); + assert( apNew[0]->nFree == + (get2byte(&apNew[0]->aData[5])-apNew[0]->cellOffset-apNew[0]->nCell*2) + || rc!=SQLITE_OK + ); + copyNodeContent(apNew[0], pParent, &rc); + freePage(apNew[0], &rc); + }else if( ISAUTOVACUUM && !leafCorrection ){ + /* Fix the pointer map entries associated with the right-child of each + ** sibling page. All other pointer map entries have already been taken + ** care of. */ + for(i=0; iaData[8]); + ptrmapPut(pBt, key, PTRMAP_BTREE, apNew[i]->pgno, &rc); + } + } + + assert( pParent->isInit ); + TRACE(("BALANCE: finished: old=%d new=%d cells=%d\n", + nOld, nNew, b.nCell)); + + /* Free any old pages that were not reused as new pages. + */ + for(i=nNew; iisInit ){ + /* The ptrmapCheckPages() contains assert() statements that verify that + ** all pointer map pages are set correctly. This is helpful while + ** debugging. This is usually disabled because a corrupt database may + ** cause an assert() statement to fail. */ + ptrmapCheckPages(apNew, nNew); + ptrmapCheckPages(&pParent, 1); + } +#endif + + /* + ** Cleanup before returning. + */ +balance_cleanup: + sqlite3ScratchFree(b.apCell); + for(i=0; ipBt; /* The BTree */ + + assert( pRoot->nOverflow>0 ); + assert( sqlite3_mutex_held(pBt->mutex) ); + + /* Make pRoot, the root page of the b-tree, writable. Allocate a new + ** page that will become the new right-child of pPage. Copy the contents + ** of the node stored on pRoot into the new child page. + */ + rc = sqlite3PagerWrite(pRoot->pDbPage); + if( rc==SQLITE_OK ){ + rc = allocateBtreePage(pBt,&pChild,&pgnoChild,pRoot->pgno,0); + copyNodeContent(pRoot, pChild, &rc); + if( ISAUTOVACUUM ){ + ptrmapPut(pBt, pgnoChild, PTRMAP_BTREE, pRoot->pgno, &rc); + } + } + if( rc ){ + *ppChild = 0; + releasePage(pChild); + return rc; + } + assert( sqlite3PagerIswriteable(pChild->pDbPage) ); + assert( sqlite3PagerIswriteable(pRoot->pDbPage) ); + assert( pChild->nCell==pRoot->nCell ); + + TRACE(("BALANCE: copy root %d into %d\n", pRoot->pgno, pChild->pgno)); + + /* Copy the overflow cells from pRoot to pChild */ + memcpy(pChild->aiOvfl, pRoot->aiOvfl, + pRoot->nOverflow*sizeof(pRoot->aiOvfl[0])); + memcpy(pChild->apOvfl, pRoot->apOvfl, + pRoot->nOverflow*sizeof(pRoot->apOvfl[0])); + pChild->nOverflow = pRoot->nOverflow; + + /* Zero the contents of pRoot. Then install pChild as the right-child. */ + zeroPage(pRoot, pChild->aData[0] & ~PTF_LEAF); + put4byte(&pRoot->aData[pRoot->hdrOffset+8], pgnoChild); + + *ppChild = pChild; + return SQLITE_OK; +} + +/* +** The page that pCur currently points to has just been modified in +** some way. This function figures out if this modification means the +** tree needs to be balanced, and if so calls the appropriate balancing +** routine. Balancing routines are: +** +** balance_quick() +** balance_deeper() +** balance_nonroot() +*/ +static int balance(BtCursor *pCur){ + int rc = SQLITE_OK; + const int nMin = pCur->pBt->usableSize * 2 / 3; + u8 aBalanceQuickSpace[13]; + u8 *pFree = 0; + + VVA_ONLY( int balance_quick_called = 0 ); + VVA_ONLY( int balance_deeper_called = 0 ); + + do { + int iPage = pCur->iPage; + MemPage *pPage = pCur->apPage[iPage]; + + if( iPage==0 ){ + if( pPage->nOverflow ){ + /* The root page of the b-tree is overfull. In this case call the + ** balance_deeper() function to create a new child for the root-page + ** and copy the current contents of the root-page to it. The + ** next iteration of the do-loop will balance the child page. + */ + assert( balance_deeper_called==0 ); + VVA_ONLY( balance_deeper_called++ ); + rc = balance_deeper(pPage, &pCur->apPage[1]); + if( rc==SQLITE_OK ){ + pCur->iPage = 1; + pCur->aiIdx[0] = 0; + pCur->aiIdx[1] = 0; + assert( pCur->apPage[1]->nOverflow ); + } + }else{ + break; + } + }else if( pPage->nOverflow==0 && pPage->nFree<=nMin ){ + break; + }else{ + MemPage * const pParent = pCur->apPage[iPage-1]; + int const iIdx = pCur->aiIdx[iPage-1]; + + rc = sqlite3PagerWrite(pParent->pDbPage); + if( rc==SQLITE_OK ){ +#ifndef SQLITE_OMIT_QUICKBALANCE + if( pPage->intKeyLeaf + && pPage->nOverflow==1 + && pPage->aiOvfl[0]==pPage->nCell + && pParent->pgno!=1 + && pParent->nCell==iIdx + ){ + /* Call balance_quick() to create a new sibling of pPage on which + ** to store the overflow cell. balance_quick() inserts a new cell + ** into pParent, which may cause pParent overflow. If this + ** happens, the next iteration of the do-loop will balance pParent + ** use either balance_nonroot() or balance_deeper(). Until this + ** happens, the overflow cell is stored in the aBalanceQuickSpace[] + ** buffer. + ** + ** The purpose of the following assert() is to check that only a + ** single call to balance_quick() is made for each call to this + ** function. If this were not verified, a subtle bug involving reuse + ** of the aBalanceQuickSpace[] might sneak in. + */ + assert( balance_quick_called==0 ); + VVA_ONLY( balance_quick_called++ ); + rc = balance_quick(pParent, pPage, aBalanceQuickSpace); + }else +#endif + { + /* In this case, call balance_nonroot() to redistribute cells + ** between pPage and up to 2 of its sibling pages. This involves + ** modifying the contents of pParent, which may cause pParent to + ** become overfull or underfull. The next iteration of the do-loop + ** will balance the parent page to correct this. + ** + ** If the parent page becomes overfull, the overflow cell or cells + ** are stored in the pSpace buffer allocated immediately below. + ** A subsequent iteration of the do-loop will deal with this by + ** calling balance_nonroot() (balance_deeper() may be called first, + ** but it doesn't deal with overflow cells - just moves them to a + ** different page). Once this subsequent call to balance_nonroot() + ** has completed, it is safe to release the pSpace buffer used by + ** the previous call, as the overflow cell data will have been + ** copied either into the body of a database page or into the new + ** pSpace buffer passed to the latter call to balance_nonroot(). + */ + u8 *pSpace = sqlite3PageMalloc(pCur->pBt->pageSize); + rc = balance_nonroot(pParent, iIdx, pSpace, iPage==1, + pCur->hints&BTREE_BULKLOAD); + if( pFree ){ + /* If pFree is not NULL, it points to the pSpace buffer used + ** by a previous call to balance_nonroot(). Its contents are + ** now stored either on real database pages or within the + ** new pSpace buffer, so it may be safely freed here. */ + sqlite3PageFree(pFree); + } + + /* The pSpace buffer will be freed after the next call to + ** balance_nonroot(), or just before this function returns, whichever + ** comes first. */ + pFree = pSpace; + } + } + + pPage->nOverflow = 0; + + /* The next iteration of the do-loop balances the parent page. */ + releasePage(pPage); + pCur->iPage--; + assert( pCur->iPage>=0 ); + } + }while( rc==SQLITE_OK ); + + if( pFree ){ + sqlite3PageFree(pFree); + } + return rc; +} + + +/* +** Insert a new record into the BTree. The content of the new record +** is described by the pX object. The pCur cursor is used only to +** define what table the record should be inserted into, and is left +** pointing at a random location. +** +** For a table btree (used for rowid tables), only the pX.nKey value of +** the key is used. The pX.pKey value must be NULL. The pX.nKey is the +** rowid or INTEGER PRIMARY KEY of the row. The pX.nData,pData,nZero fields +** hold the content of the row. +** +** For an index btree (used for indexes and WITHOUT ROWID tables), the +** key is an arbitrary byte sequence stored in pX.pKey,nKey. The +** pX.pData,nData,nZero fields must be zero. +** +** If the seekResult parameter is non-zero, then a successful call to +** MovetoUnpacked() to seek cursor pCur to (pKey, nKey) has already +** been performed. seekResult is the search result returned (a negative +** number if pCur points at an entry that is smaller than (pKey, nKey), or +** a positive value if pCur points at an entry that is larger than +** (pKey, nKey)). +** +** If the seekResult parameter is non-zero, then the caller guarantees that +** cursor pCur is pointing at the existing copy of a row that is to be +** overwritten. If the seekResult parameter is 0, then cursor pCur may +** point to any entry or to no entry at all and so this function has to seek +** the cursor before the new key can be inserted. +*/ +SQLITE_PRIVATE int sqlite3BtreeInsert( + BtCursor *pCur, /* Insert data into the table of this cursor */ + const BtreePayload *pX, /* Content of the row to be inserted */ + int appendBias, /* True if this is likely an append */ + int seekResult /* Result of prior MovetoUnpacked() call */ +){ + int rc; + int loc = seekResult; /* -1: before desired location +1: after */ + int szNew = 0; + int idx; + MemPage *pPage; + Btree *p = pCur->pBtree; + BtShared *pBt = p->pBt; + unsigned char *oldCell; + unsigned char *newCell = 0; + + if( pCur->eState==CURSOR_FAULT ){ + assert( pCur->skipNext!=SQLITE_OK ); + return pCur->skipNext; + } + + assert( cursorOwnsBtShared(pCur) ); + assert( (pCur->curFlags & BTCF_WriteFlag)!=0 + && pBt->inTransaction==TRANS_WRITE + && (pBt->btsFlags & BTS_READ_ONLY)==0 ); + assert( hasSharedCacheTableLock(p, pCur->pgnoRoot, pCur->pKeyInfo!=0, 2) ); + + /* Assert that the caller has been consistent. If this cursor was opened + ** expecting an index b-tree, then the caller should be inserting blob + ** keys with no associated data. If the cursor was opened expecting an + ** intkey table, the caller should be inserting integer keys with a + ** blob of associated data. */ + assert( (pX->pKey==0)==(pCur->pKeyInfo==0) ); + + /* Save the positions of any other cursors open on this table. + ** + ** In some cases, the call to btreeMoveto() below is a no-op. For + ** example, when inserting data into a table with auto-generated integer + ** keys, the VDBE layer invokes sqlite3BtreeLast() to figure out the + ** integer key to use. It then calls this function to actually insert the + ** data into the intkey B-Tree. In this case btreeMoveto() recognizes + ** that the cursor is already where it needs to be and returns without + ** doing any work. To avoid thwarting these optimizations, it is important + ** not to clear the cursor here. + */ + if( pCur->curFlags & BTCF_Multiple ){ + rc = saveAllCursors(pBt, pCur->pgnoRoot, pCur); + if( rc ) return rc; + } + + if( pCur->pKeyInfo==0 ){ + assert( pX->pKey==0 ); + /* If this is an insert into a table b-tree, invalidate any incrblob + ** cursors open on the row being replaced */ + invalidateIncrblobCursors(p, pX->nKey, 0); + + /* If the cursor is currently on the last row and we are appending a + ** new row onto the end, set the "loc" to avoid an unnecessary + ** btreeMoveto() call */ + if( (pCur->curFlags&BTCF_ValidNKey)!=0 && pX->nKey>0 + && pCur->info.nKey==pX->nKey-1 ){ + loc = -1; + }else if( loc==0 ){ + rc = sqlite3BtreeMovetoUnpacked(pCur, 0, pX->nKey, appendBias, &loc); + if( rc ) return rc; + } + }else if( loc==0 ){ + rc = btreeMoveto(pCur, pX->pKey, pX->nKey, appendBias, &loc); + if( rc ) return rc; + } + assert( pCur->eState==CURSOR_VALID || (pCur->eState==CURSOR_INVALID && loc) ); + + pPage = pCur->apPage[pCur->iPage]; + assert( pPage->intKey || pX->nKey>=0 ); + assert( pPage->leaf || !pPage->intKey ); + + TRACE(("INSERT: table=%d nkey=%lld ndata=%d page=%d %s\n", + pCur->pgnoRoot, pX->nKey, pX->nData, pPage->pgno, + loc==0 ? "overwrite" : "new entry")); + assert( pPage->isInit ); + newCell = pBt->pTmpSpace; + assert( newCell!=0 ); + rc = fillInCell(pPage, newCell, pX, &szNew); + if( rc ) goto end_insert; + assert( szNew==pPage->xCellSize(pPage, newCell) ); + assert( szNew <= MX_CELL_SIZE(pBt) ); + idx = pCur->aiIdx[pCur->iPage]; + if( loc==0 ){ + u16 szOld; + assert( idxnCell ); + rc = sqlite3PagerWrite(pPage->pDbPage); + if( rc ){ + goto end_insert; + } + oldCell = findCell(pPage, idx); + if( !pPage->leaf ){ + memcpy(newCell, oldCell, 4); + } + rc = clearCell(pPage, oldCell, &szOld); + dropCell(pPage, idx, szOld, &rc); + if( rc ) goto end_insert; + }else if( loc<0 && pPage->nCell>0 ){ + assert( pPage->leaf ); + idx = ++pCur->aiIdx[pCur->iPage]; + }else{ + assert( pPage->leaf ); + } + insertCell(pPage, idx, newCell, szNew, 0, 0, &rc); + assert( pPage->nOverflow==0 || rc==SQLITE_OK ); + assert( rc!=SQLITE_OK || pPage->nCell>0 || pPage->nOverflow>0 ); + + /* If no error has occurred and pPage has an overflow cell, call balance() + ** to redistribute the cells within the tree. Since balance() may move + ** the cursor, zero the BtCursor.info.nSize and BTCF_ValidNKey + ** variables. + ** + ** Previous versions of SQLite called moveToRoot() to move the cursor + ** back to the root page as balance() used to invalidate the contents + ** of BtCursor.apPage[] and BtCursor.aiIdx[]. Instead of doing that, + ** set the cursor state to "invalid". This makes common insert operations + ** slightly faster. + ** + ** There is a subtle but important optimization here too. When inserting + ** multiple records into an intkey b-tree using a single cursor (as can + ** happen while processing an "INSERT INTO ... SELECT" statement), it + ** is advantageous to leave the cursor pointing to the last entry in + ** the b-tree if possible. If the cursor is left pointing to the last + ** entry in the table, and the next row inserted has an integer key + ** larger than the largest existing key, it is possible to insert the + ** row without seeking the cursor. This can be a big performance boost. + */ + pCur->info.nSize = 0; + if( pPage->nOverflow ){ + assert( rc==SQLITE_OK ); + pCur->curFlags &= ~(BTCF_ValidNKey); + rc = balance(pCur); + + /* Must make sure nOverflow is reset to zero even if the balance() + ** fails. Internal data structure corruption will result otherwise. + ** Also, set the cursor state to invalid. This stops saveCursorPosition() + ** from trying to save the current position of the cursor. */ + pCur->apPage[pCur->iPage]->nOverflow = 0; + pCur->eState = CURSOR_INVALID; + } + assert( pCur->apPage[pCur->iPage]->nOverflow==0 ); + +end_insert: + return rc; +} + +/* +** Delete the entry that the cursor is pointing to. +** +** If the BTREE_SAVEPOSITION bit of the flags parameter is zero, then +** the cursor is left pointing at an arbitrary location after the delete. +** But if that bit is set, then the cursor is left in a state such that +** the next call to BtreeNext() or BtreePrev() moves it to the same row +** as it would have been on if the call to BtreeDelete() had been omitted. +** +** The BTREE_AUXDELETE bit of flags indicates that is one of several deletes +** associated with a single table entry and its indexes. Only one of those +** deletes is considered the "primary" delete. The primary delete occurs +** on a cursor that is not a BTREE_FORDELETE cursor. All but one delete +** operation on non-FORDELETE cursors is tagged with the AUXDELETE flag. +** The BTREE_AUXDELETE bit is a hint that is not used by this implementation, +** but which might be used by alternative storage engines. +*/ +SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){ + Btree *p = pCur->pBtree; + BtShared *pBt = p->pBt; + int rc; /* Return code */ + MemPage *pPage; /* Page to delete cell from */ + unsigned char *pCell; /* Pointer to cell to delete */ + int iCellIdx; /* Index of cell to delete */ + int iCellDepth; /* Depth of node containing pCell */ + u16 szCell; /* Size of the cell being deleted */ + int bSkipnext = 0; /* Leaf cursor in SKIPNEXT state */ + u8 bPreserve = flags & BTREE_SAVEPOSITION; /* Keep cursor valid */ + + assert( cursorOwnsBtShared(pCur) ); + assert( pBt->inTransaction==TRANS_WRITE ); + assert( (pBt->btsFlags & BTS_READ_ONLY)==0 ); + assert( pCur->curFlags & BTCF_WriteFlag ); + assert( hasSharedCacheTableLock(p, pCur->pgnoRoot, pCur->pKeyInfo!=0, 2) ); + assert( !hasReadConflicts(p, pCur->pgnoRoot) ); + assert( pCur->aiIdx[pCur->iPage]apPage[pCur->iPage]->nCell ); + assert( pCur->eState==CURSOR_VALID ); + assert( (flags & ~(BTREE_SAVEPOSITION | BTREE_AUXDELETE))==0 ); + + iCellDepth = pCur->iPage; + iCellIdx = pCur->aiIdx[iCellDepth]; + pPage = pCur->apPage[iCellDepth]; + pCell = findCell(pPage, iCellIdx); + + /* If the bPreserve flag is set to true, then the cursor position must + ** be preserved following this delete operation. If the current delete + ** will cause a b-tree rebalance, then this is done by saving the cursor + ** key and leaving the cursor in CURSOR_REQUIRESEEK state before + ** returning. + ** + ** Or, if the current delete will not cause a rebalance, then the cursor + ** will be left in CURSOR_SKIPNEXT state pointing to the entry immediately + ** before or after the deleted entry. In this case set bSkipnext to true. */ + if( bPreserve ){ + if( !pPage->leaf + || (pPage->nFree+cellSizePtr(pPage,pCell)+2)>(int)(pBt->usableSize*2/3) + ){ + /* A b-tree rebalance will be required after deleting this entry. + ** Save the cursor key. */ + rc = saveCursorKey(pCur); + if( rc ) return rc; + }else{ + bSkipnext = 1; + } + } + + /* If the page containing the entry to delete is not a leaf page, move + ** the cursor to the largest entry in the tree that is smaller than + ** the entry being deleted. This cell will replace the cell being deleted + ** from the internal node. The 'previous' entry is used for this instead + ** of the 'next' entry, as the previous entry is always a part of the + ** sub-tree headed by the child page of the cell being deleted. This makes + ** balancing the tree following the delete operation easier. */ + if( !pPage->leaf ){ + int notUsed = 0; + rc = sqlite3BtreePrevious(pCur, ¬Used); + if( rc ) return rc; + } + + /* Save the positions of any other cursors open on this table before + ** making any modifications. */ + if( pCur->curFlags & BTCF_Multiple ){ + rc = saveAllCursors(pBt, pCur->pgnoRoot, pCur); + if( rc ) return rc; + } + + /* If this is a delete operation to remove a row from a table b-tree, + ** invalidate any incrblob cursors open on the row being deleted. */ + if( pCur->pKeyInfo==0 ){ + invalidateIncrblobCursors(p, pCur->info.nKey, 0); + } + + /* Make the page containing the entry to be deleted writable. Then free any + ** overflow pages associated with the entry and finally remove the cell + ** itself from within the page. */ + rc = sqlite3PagerWrite(pPage->pDbPage); + if( rc ) return rc; + rc = clearCell(pPage, pCell, &szCell); + dropCell(pPage, iCellIdx, szCell, &rc); + if( rc ) return rc; + + /* If the cell deleted was not located on a leaf page, then the cursor + ** is currently pointing to the largest entry in the sub-tree headed + ** by the child-page of the cell that was just deleted from an internal + ** node. The cell from the leaf node needs to be moved to the internal + ** node to replace the deleted cell. */ + if( !pPage->leaf ){ + MemPage *pLeaf = pCur->apPage[pCur->iPage]; + int nCell; + Pgno n = pCur->apPage[iCellDepth+1]->pgno; + unsigned char *pTmp; + + pCell = findCell(pLeaf, pLeaf->nCell-1); + if( pCell<&pLeaf->aData[4] ) return SQLITE_CORRUPT_BKPT; + nCell = pLeaf->xCellSize(pLeaf, pCell); + assert( MX_CELL_SIZE(pBt) >= nCell ); + pTmp = pBt->pTmpSpace; + assert( pTmp!=0 ); + rc = sqlite3PagerWrite(pLeaf->pDbPage); + if( rc==SQLITE_OK ){ + insertCell(pPage, iCellIdx, pCell-4, nCell+4, pTmp, n, &rc); + } + dropCell(pLeaf, pLeaf->nCell-1, nCell, &rc); + if( rc ) return rc; + } + + /* Balance the tree. If the entry deleted was located on a leaf page, + ** then the cursor still points to that page. In this case the first + ** call to balance() repairs the tree, and the if(...) condition is + ** never true. + ** + ** Otherwise, if the entry deleted was on an internal node page, then + ** pCur is pointing to the leaf page from which a cell was removed to + ** replace the cell deleted from the internal node. This is slightly + ** tricky as the leaf node may be underfull, and the internal node may + ** be either under or overfull. In this case run the balancing algorithm + ** on the leaf node first. If the balance proceeds far enough up the + ** tree that we can be sure that any problem in the internal node has + ** been corrected, so be it. Otherwise, after balancing the leaf node, + ** walk the cursor up the tree to the internal node and balance it as + ** well. */ + rc = balance(pCur); + if( rc==SQLITE_OK && pCur->iPage>iCellDepth ){ + while( pCur->iPage>iCellDepth ){ + releasePage(pCur->apPage[pCur->iPage--]); + } + rc = balance(pCur); + } + + if( rc==SQLITE_OK ){ + if( bSkipnext ){ + assert( bPreserve && (pCur->iPage==iCellDepth || CORRUPT_DB) ); + assert( pPage==pCur->apPage[pCur->iPage] || CORRUPT_DB ); + assert( (pPage->nCell>0 || CORRUPT_DB) && iCellIdx<=pPage->nCell ); + pCur->eState = CURSOR_SKIPNEXT; + if( iCellIdx>=pPage->nCell ){ + pCur->skipNext = -1; + pCur->aiIdx[iCellDepth] = pPage->nCell-1; + }else{ + pCur->skipNext = 1; + } + }else{ + rc = moveToRoot(pCur); + if( bPreserve ){ + pCur->eState = CURSOR_REQUIRESEEK; + } + } + } + return rc; +} + +/* +** Create a new BTree table. Write into *piTable the page +** number for the root page of the new table. +** +** The type of type is determined by the flags parameter. Only the +** following values of flags are currently in use. Other values for +** flags might not work: +** +** BTREE_INTKEY|BTREE_LEAFDATA Used for SQL tables with rowid keys +** BTREE_ZERODATA Used for SQL indices +*/ +static int btreeCreateTable(Btree *p, int *piTable, int createTabFlags){ + BtShared *pBt = p->pBt; + MemPage *pRoot; + Pgno pgnoRoot; + int rc; + int ptfFlags; /* Page-type flage for the root page of new table */ + + assert( sqlite3BtreeHoldsMutex(p) ); + assert( pBt->inTransaction==TRANS_WRITE ); + assert( (pBt->btsFlags & BTS_READ_ONLY)==0 ); + +#ifdef SQLITE_OMIT_AUTOVACUUM + rc = allocateBtreePage(pBt, &pRoot, &pgnoRoot, 1, 0); + if( rc ){ + return rc; + } +#else + if( pBt->autoVacuum ){ + Pgno pgnoMove; /* Move a page here to make room for the root-page */ + MemPage *pPageMove; /* The page to move to. */ + + /* Creating a new table may probably require moving an existing database + ** to make room for the new tables root page. In case this page turns + ** out to be an overflow page, delete all overflow page-map caches + ** held by open cursors. + */ + invalidateAllOverflowCache(pBt); + + /* Read the value of meta[3] from the database to determine where the + ** root page of the new table should go. meta[3] is the largest root-page + ** created so far, so the new root-page is (meta[3]+1). + */ + sqlite3BtreeGetMeta(p, BTREE_LARGEST_ROOT_PAGE, &pgnoRoot); + pgnoRoot++; + + /* The new root-page may not be allocated on a pointer-map page, or the + ** PENDING_BYTE page. + */ + while( pgnoRoot==PTRMAP_PAGENO(pBt, pgnoRoot) || + pgnoRoot==PENDING_BYTE_PAGE(pBt) ){ + pgnoRoot++; + } + assert( pgnoRoot>=3 || CORRUPT_DB ); + testcase( pgnoRoot<3 ); + + /* Allocate a page. The page that currently resides at pgnoRoot will + ** be moved to the allocated page (unless the allocated page happens + ** to reside at pgnoRoot). + */ + rc = allocateBtreePage(pBt, &pPageMove, &pgnoMove, pgnoRoot, BTALLOC_EXACT); + if( rc!=SQLITE_OK ){ + return rc; + } + + if( pgnoMove!=pgnoRoot ){ + /* pgnoRoot is the page that will be used for the root-page of + ** the new table (assuming an error did not occur). But we were + ** allocated pgnoMove. If required (i.e. if it was not allocated + ** by extending the file), the current page at position pgnoMove + ** is already journaled. + */ + u8 eType = 0; + Pgno iPtrPage = 0; + + /* Save the positions of any open cursors. This is required in + ** case they are holding a reference to an xFetch reference + ** corresponding to page pgnoRoot. */ + rc = saveAllCursors(pBt, 0, 0); + releasePage(pPageMove); + if( rc!=SQLITE_OK ){ + return rc; + } + + /* Move the page currently at pgnoRoot to pgnoMove. */ + rc = btreeGetPage(pBt, pgnoRoot, &pRoot, 0); + if( rc!=SQLITE_OK ){ + return rc; + } + rc = ptrmapGet(pBt, pgnoRoot, &eType, &iPtrPage); + if( eType==PTRMAP_ROOTPAGE || eType==PTRMAP_FREEPAGE ){ + rc = SQLITE_CORRUPT_BKPT; + } + if( rc!=SQLITE_OK ){ + releasePage(pRoot); + return rc; + } + assert( eType!=PTRMAP_ROOTPAGE ); + assert( eType!=PTRMAP_FREEPAGE ); + rc = relocatePage(pBt, pRoot, eType, iPtrPage, pgnoMove, 0); + releasePage(pRoot); + + /* Obtain the page at pgnoRoot */ + if( rc!=SQLITE_OK ){ + return rc; + } + rc = btreeGetPage(pBt, pgnoRoot, &pRoot, 0); + if( rc!=SQLITE_OK ){ + return rc; + } + rc = sqlite3PagerWrite(pRoot->pDbPage); + if( rc!=SQLITE_OK ){ + releasePage(pRoot); + return rc; + } + }else{ + pRoot = pPageMove; + } + + /* Update the pointer-map and meta-data with the new root-page number. */ + ptrmapPut(pBt, pgnoRoot, PTRMAP_ROOTPAGE, 0, &rc); + if( rc ){ + releasePage(pRoot); + return rc; + } + + /* When the new root page was allocated, page 1 was made writable in + ** order either to increase the database filesize, or to decrement the + ** freelist count. Hence, the sqlite3BtreeUpdateMeta() call cannot fail. + */ + assert( sqlite3PagerIswriteable(pBt->pPage1->pDbPage) ); + rc = sqlite3BtreeUpdateMeta(p, 4, pgnoRoot); + if( NEVER(rc) ){ + releasePage(pRoot); + return rc; + } + + }else{ + rc = allocateBtreePage(pBt, &pRoot, &pgnoRoot, 1, 0); + if( rc ) return rc; + } +#endif + assert( sqlite3PagerIswriteable(pRoot->pDbPage) ); + if( createTabFlags & BTREE_INTKEY ){ + ptfFlags = PTF_INTKEY | PTF_LEAFDATA | PTF_LEAF; + }else{ + ptfFlags = PTF_ZERODATA | PTF_LEAF; + } + zeroPage(pRoot, ptfFlags); + sqlite3PagerUnref(pRoot->pDbPage); + assert( (pBt->openFlags & BTREE_SINGLE)==0 || pgnoRoot==2 ); + *piTable = (int)pgnoRoot; + return SQLITE_OK; +} +SQLITE_PRIVATE int sqlite3BtreeCreateTable(Btree *p, int *piTable, int flags){ + int rc; + sqlite3BtreeEnter(p); + rc = btreeCreateTable(p, piTable, flags); + sqlite3BtreeLeave(p); + return rc; +} + +/* +** Erase the given database page and all its children. Return +** the page to the freelist. +*/ +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 /* Add number of Cells freed to this counter */ +){ + MemPage *pPage; + int rc; + unsigned char *pCell; + int i; + int hdr; + u16 szCell; + + assert( sqlite3_mutex_held(pBt->mutex) ); + if( pgno>btreePagecount(pBt) ){ + return SQLITE_CORRUPT_BKPT; + } + rc = getAndInitPage(pBt, pgno, &pPage, 0, 0); + if( rc ) return rc; + if( pPage->bBusy ){ + rc = SQLITE_CORRUPT_BKPT; + goto cleardatabasepage_out; + } + pPage->bBusy = 1; + hdr = pPage->hdrOffset; + for(i=0; inCell; i++){ + pCell = findCell(pPage, i); + if( !pPage->leaf ){ + rc = clearDatabasePage(pBt, get4byte(pCell), 1, pnChange); + if( rc ) goto cleardatabasepage_out; + } + rc = clearCell(pPage, pCell, &szCell); + if( rc ) goto cleardatabasepage_out; + } + if( !pPage->leaf ){ + rc = clearDatabasePage(pBt, get4byte(&pPage->aData[hdr+8]), 1, pnChange); + if( rc ) goto cleardatabasepage_out; + }else if( pnChange ){ + assert( pPage->intKey || CORRUPT_DB ); + testcase( !pPage->intKey ); + *pnChange += pPage->nCell; + } + if( freePageFlag ){ + freePage(pPage, &rc); + }else if( (rc = sqlite3PagerWrite(pPage->pDbPage))==0 ){ + zeroPage(pPage, pPage->aData[hdr] | PTF_LEAF); + } + +cleardatabasepage_out: + pPage->bBusy = 0; + releasePage(pPage); + return rc; +} + +/* +** Delete all information from a single table in the database. iTable is +** the page number of the root of the table. After this routine returns, +** the root page is empty, but still exists. +** +** This routine will fail with SQLITE_LOCKED if there are any open +** read cursors on the table. Open write cursors are moved to the +** root of the table. +** +** If pnChange is not NULL, then table iTable must be an intkey table. The +** integer value pointed to by pnChange is incremented by the number of +** entries in the table. +*/ +SQLITE_PRIVATE int sqlite3BtreeClearTable(Btree *p, int iTable, int *pnChange){ + int rc; + BtShared *pBt = p->pBt; + sqlite3BtreeEnter(p); + assert( p->inTrans==TRANS_WRITE ); + + rc = saveAllCursors(pBt, (Pgno)iTable, 0); + + if( SQLITE_OK==rc ){ + /* Invalidate all incrblob cursors open on table iTable (assuming iTable + ** is the root of a table b-tree - if it is not, the following call is + ** a no-op). */ + invalidateIncrblobCursors(p, 0, 1); + rc = clearDatabasePage(pBt, (Pgno)iTable, 0, pnChange); + } + sqlite3BtreeLeave(p); + return rc; +} + +/* +** Delete all information from the single table that pCur is open on. +** +** This routine only work for pCur on an ephemeral table. +*/ +SQLITE_PRIVATE int sqlite3BtreeClearTableOfCursor(BtCursor *pCur){ + return sqlite3BtreeClearTable(pCur->pBtree, pCur->pgnoRoot, 0); +} + +/* +** Erase all information in a table and add the root of the table to +** the freelist. Except, the root of the principle table (the one on +** page 1) is never added to the freelist. +** +** This routine will fail with SQLITE_LOCKED if there are any open +** cursors on the table. +** +** If AUTOVACUUM is enabled and the page at iTable is not the last +** root page in the database file, then the last root page +** in the database file is moved into the slot formerly occupied by +** iTable and that last slot formerly occupied by the last root page +** is added to the freelist instead of iTable. In this say, all +** root pages are kept at the beginning of the database file, which +** is necessary for AUTOVACUUM to work right. *piMoved is set to the +** page number that used to be the last root page in the file before +** the move. If no page gets moved, *piMoved is set to 0. +** The last root page is recorded in meta[3] and the value of +** meta[3] is updated by this procedure. +*/ +static int btreeDropTable(Btree *p, Pgno iTable, int *piMoved){ + int rc; + MemPage *pPage = 0; + BtShared *pBt = p->pBt; + + assert( sqlite3BtreeHoldsMutex(p) ); + assert( p->inTrans==TRANS_WRITE ); + + /* It is illegal to drop a table if any cursors are open on the + ** database. This is because in auto-vacuum mode the backend may + ** need to move another root-page to fill a gap left by the deleted + ** root page. If an open cursor was using this page a problem would + ** occur. + ** + ** This error is caught long before control reaches this point. + */ + if( NEVER(pBt->pCursor) ){ + sqlite3ConnectionBlocked(p->db, pBt->pCursor->pBtree->db); + return SQLITE_LOCKED_SHAREDCACHE; + } + + /* + ** It is illegal to drop the sqlite_master table on page 1. But again, + ** this error is caught long before reaching this point. + */ + if( NEVER(iTable<2) ){ + return SQLITE_CORRUPT_BKPT; + } + + rc = btreeGetPage(pBt, (Pgno)iTable, &pPage, 0); + if( rc ) return rc; + rc = sqlite3BtreeClearTable(p, iTable, 0); + if( rc ){ + releasePage(pPage); + return rc; + } + + *piMoved = 0; + +#ifdef SQLITE_OMIT_AUTOVACUUM + freePage(pPage, &rc); + releasePage(pPage); +#else + if( pBt->autoVacuum ){ + Pgno maxRootPgno; + sqlite3BtreeGetMeta(p, BTREE_LARGEST_ROOT_PAGE, &maxRootPgno); + + if( iTable==maxRootPgno ){ + /* If the table being dropped is the table with the largest root-page + ** number in the database, put the root page on the free list. + */ + freePage(pPage, &rc); + releasePage(pPage); + if( rc!=SQLITE_OK ){ + return rc; + } + }else{ + /* The table being dropped does not have the largest root-page + ** number in the database. So move the page that does into the + ** gap left by the deleted root-page. + */ + MemPage *pMove; + releasePage(pPage); + rc = btreeGetPage(pBt, maxRootPgno, &pMove, 0); + if( rc!=SQLITE_OK ){ + return rc; + } + rc = relocatePage(pBt, pMove, PTRMAP_ROOTPAGE, 0, iTable, 0); + releasePage(pMove); + if( rc!=SQLITE_OK ){ + return rc; + } + pMove = 0; + rc = btreeGetPage(pBt, maxRootPgno, &pMove, 0); + freePage(pMove, &rc); + releasePage(pMove); + if( rc!=SQLITE_OK ){ + return rc; + } + *piMoved = maxRootPgno; + } + + /* Set the new 'max-root-page' value in the database header. This + ** is the old value less one, less one more if that happens to + ** be a root-page number, less one again if that is the + ** PENDING_BYTE_PAGE. + */ + maxRootPgno--; + while( maxRootPgno==PENDING_BYTE_PAGE(pBt) + || PTRMAP_ISPAGE(pBt, maxRootPgno) ){ + maxRootPgno--; + } + assert( maxRootPgno!=PENDING_BYTE_PAGE(pBt) ); + + rc = sqlite3BtreeUpdateMeta(p, 4, maxRootPgno); + }else{ + freePage(pPage, &rc); + releasePage(pPage); + } +#endif + return rc; +} +SQLITE_PRIVATE int sqlite3BtreeDropTable(Btree *p, int iTable, int *piMoved){ + int rc; + sqlite3BtreeEnter(p); + rc = btreeDropTable(p, iTable, piMoved); + sqlite3BtreeLeave(p); + return rc; +} + + +/* +** This function may only be called if the b-tree connection already +** has a read or write transaction open on the database. +** +** Read the meta-information out of a database file. Meta[0] +** is the number of free pages currently in the database. Meta[1] +** through meta[15] are available for use by higher layers. Meta[0] +** is read-only, the others are read/write. +** +** The schema layer numbers meta values differently. At the schema +** layer (and the SetCookie and ReadCookie opcodes) the number of +** free pages is not visible. So Cookie[0] is the same as Meta[1]. +** +** This routine treats Meta[BTREE_DATA_VERSION] as a special case. Instead +** of reading the value out of the header, it instead loads the "DataVersion" +** from the pager. The BTREE_DATA_VERSION value is not actually stored in the +** database file. It is a number computed by the pager. But its access +** pattern is the same as header meta values, and so it is convenient to +** read it from this routine. +*/ +SQLITE_PRIVATE void sqlite3BtreeGetMeta(Btree *p, int idx, u32 *pMeta){ + BtShared *pBt = p->pBt; + + sqlite3BtreeEnter(p); + assert( p->inTrans>TRANS_NONE ); + assert( SQLITE_OK==querySharedCacheTableLock(p, MASTER_ROOT, READ_LOCK) ); + assert( pBt->pPage1 ); + assert( idx>=0 && idx<=15 ); + + if( idx==BTREE_DATA_VERSION ){ + *pMeta = sqlite3PagerDataVersion(pBt->pPager) + p->iDataVersion; + }else{ + *pMeta = get4byte(&pBt->pPage1->aData[36 + idx*4]); + } + + /* If auto-vacuum is disabled in this build and this is an auto-vacuum + ** database, mark the database as read-only. */ +#ifdef SQLITE_OMIT_AUTOVACUUM + if( idx==BTREE_LARGEST_ROOT_PAGE && *pMeta>0 ){ + pBt->btsFlags |= BTS_READ_ONLY; + } +#endif + + sqlite3BtreeLeave(p); +} + +/* +** Write meta-information back into the database. Meta[0] is +** read-only and may not be written. +*/ +SQLITE_PRIVATE int sqlite3BtreeUpdateMeta(Btree *p, int idx, u32 iMeta){ + BtShared *pBt = p->pBt; + unsigned char *pP1; + int rc; + assert( idx>=1 && idx<=15 ); + sqlite3BtreeEnter(p); + assert( p->inTrans==TRANS_WRITE ); + assert( pBt->pPage1!=0 ); + pP1 = pBt->pPage1->aData; + rc = sqlite3PagerWrite(pBt->pPage1->pDbPage); + if( rc==SQLITE_OK ){ + put4byte(&pP1[36 + idx*4], iMeta); +#ifndef SQLITE_OMIT_AUTOVACUUM + if( idx==BTREE_INCR_VACUUM ){ + assert( pBt->autoVacuum || iMeta==0 ); + assert( iMeta==0 || iMeta==1 ); + pBt->incrVacuum = (u8)iMeta; + } +#endif + } + sqlite3BtreeLeave(p); + return rc; +} + +#ifndef SQLITE_OMIT_BTREECOUNT +/* +** The first argument, pCur, is a cursor opened on some b-tree. Count the +** number of entries in the b-tree and write the result to *pnEntry. +** +** SQLITE_OK is returned if the operation is successfully executed. +** Otherwise, if an error is encountered (i.e. an IO error or database +** corruption) an SQLite error code is returned. +*/ +SQLITE_PRIVATE int sqlite3BtreeCount(BtCursor *pCur, i64 *pnEntry){ + i64 nEntry = 0; /* Value to return in *pnEntry */ + int rc; /* Return code */ + + if( pCur->pgnoRoot==0 ){ + *pnEntry = 0; + return SQLITE_OK; + } + rc = moveToRoot(pCur); + + /* Unless an error occurs, the following loop runs one iteration for each + ** page in the B-Tree structure (not including overflow pages). + */ + while( rc==SQLITE_OK ){ + int iIdx; /* Index of child node in parent */ + MemPage *pPage; /* Current page of the b-tree */ + + /* If this is a leaf page or the tree is not an int-key tree, then + ** this page contains countable entries. Increment the entry counter + ** accordingly. + */ + pPage = pCur->apPage[pCur->iPage]; + if( pPage->leaf || !pPage->intKey ){ + nEntry += pPage->nCell; + } + + /* pPage is a leaf node. This loop navigates the cursor so that it + ** points to the first interior cell that it points to the parent of + ** the next page in the tree that has not yet been visited. The + ** pCur->aiIdx[pCur->iPage] value is set to the index of the parent cell + ** of the page, or to the number of cells in the page if the next page + ** to visit is the right-child of its parent. + ** + ** If all pages in the tree have been visited, return SQLITE_OK to the + ** caller. + */ + if( pPage->leaf ){ + do { + if( pCur->iPage==0 ){ + /* All pages of the b-tree have been visited. Return successfully. */ + *pnEntry = nEntry; + return moveToRoot(pCur); + } + moveToParent(pCur); + }while ( pCur->aiIdx[pCur->iPage]>=pCur->apPage[pCur->iPage]->nCell ); + + pCur->aiIdx[pCur->iPage]++; + pPage = pCur->apPage[pCur->iPage]; + } + + /* Descend to the child node of the cell that the cursor currently + ** points at. This is the right-child if (iIdx==pPage->nCell). + */ + iIdx = pCur->aiIdx[pCur->iPage]; + if( iIdx==pPage->nCell ){ + rc = moveToChild(pCur, get4byte(&pPage->aData[pPage->hdrOffset+8])); + }else{ + rc = moveToChild(pCur, get4byte(findCell(pPage, iIdx))); + } + } + + /* An error has occurred. Return an error code. */ + return rc; +} +#endif + +/* +** Return the pager associated with a BTree. This routine is used for +** testing and debugging only. +*/ +SQLITE_PRIVATE Pager *sqlite3BtreePager(Btree *p){ + return p->pBt->pPager; +} + +#ifndef SQLITE_OMIT_INTEGRITY_CHECK +/* +** Append a message to the error message string. +*/ +static void checkAppendMsg( + IntegrityCk *pCheck, + const char *zFormat, + ... +){ + va_list ap; + if( !pCheck->mxErr ) return; + pCheck->mxErr--; + pCheck->nErr++; + va_start(ap, zFormat); + if( pCheck->errMsg.nChar ){ + sqlite3StrAccumAppend(&pCheck->errMsg, "\n", 1); + } + if( pCheck->zPfx ){ + sqlite3XPrintf(&pCheck->errMsg, pCheck->zPfx, pCheck->v1, pCheck->v2); + } + sqlite3VXPrintf(&pCheck->errMsg, zFormat, ap); + va_end(ap); + if( pCheck->errMsg.accError==STRACCUM_NOMEM ){ + pCheck->mallocFailed = 1; + } +} +#endif /* SQLITE_OMIT_INTEGRITY_CHECK */ + +#ifndef SQLITE_OMIT_INTEGRITY_CHECK + +/* +** Return non-zero if the bit in the IntegrityCk.aPgRef[] array that +** corresponds to page iPg is already set. +*/ +static int getPageReferenced(IntegrityCk *pCheck, Pgno iPg){ + assert( iPg<=pCheck->nPage && sizeof(pCheck->aPgRef[0])==1 ); + return (pCheck->aPgRef[iPg/8] & (1 << (iPg & 0x07))); +} + +/* +** Set the bit in the IntegrityCk.aPgRef[] array that corresponds to page iPg. +*/ +static void setPageReferenced(IntegrityCk *pCheck, Pgno iPg){ + assert( iPg<=pCheck->nPage && sizeof(pCheck->aPgRef[0])==1 ); + pCheck->aPgRef[iPg/8] |= (1 << (iPg & 0x07)); +} + + +/* +** Add 1 to the reference count for page iPage. If this is the second +** reference to the page, add an error message to pCheck->zErrMsg. +** Return 1 if there are 2 or more references to the page and 0 if +** if this is the first reference to the page. +** +** Also check that the page number is in bounds. +*/ +static int checkRef(IntegrityCk *pCheck, Pgno iPage){ + if( iPage==0 ) return 1; + if( iPage>pCheck->nPage ){ + checkAppendMsg(pCheck, "invalid page number %d", iPage); + return 1; + } + if( getPageReferenced(pCheck, iPage) ){ + checkAppendMsg(pCheck, "2nd reference to page %d", iPage); + return 1; + } + setPageReferenced(pCheck, iPage); + return 0; +} + +#ifndef SQLITE_OMIT_AUTOVACUUM +/* +** Check that the entry in the pointer-map for page iChild maps to +** page iParent, pointer type ptrType. If not, append an error message +** to pCheck. +*/ +static void checkPtrmap( + IntegrityCk *pCheck, /* Integrity check context */ + Pgno iChild, /* Child page number */ + u8 eType, /* Expected pointer map type */ + Pgno iParent /* Expected pointer map parent page number */ +){ + int rc; + u8 ePtrmapType; + Pgno iPtrmapParent; + + rc = ptrmapGet(pCheck->pBt, iChild, &ePtrmapType, &iPtrmapParent); + if( rc!=SQLITE_OK ){ + if( rc==SQLITE_NOMEM || rc==SQLITE_IOERR_NOMEM ) pCheck->mallocFailed = 1; + checkAppendMsg(pCheck, "Failed to read ptrmap key=%d", iChild); + return; + } + + if( ePtrmapType!=eType || iPtrmapParent!=iParent ){ + checkAppendMsg(pCheck, + "Bad ptr map entry key=%d expected=(%d,%d) got=(%d,%d)", + iChild, eType, iParent, ePtrmapType, iPtrmapParent); + } +} +#endif + +/* +** Check the integrity of the freelist or of an overflow page list. +** Verify that the number of pages on the list is N. +*/ +static void checkList( + IntegrityCk *pCheck, /* Integrity checking context */ + int isFreeList, /* True for a freelist. False for overflow page list */ + int iPage, /* Page number for first page in the list */ + int N /* Expected number of pages in the list */ +){ + int i; + int expected = N; + int iFirst = iPage; + while( N-- > 0 && pCheck->mxErr ){ + DbPage *pOvflPage; + unsigned char *pOvflData; + if( iPage<1 ){ + checkAppendMsg(pCheck, + "%d of %d pages missing from overflow list starting at %d", + N+1, expected, iFirst); + break; + } + if( checkRef(pCheck, iPage) ) break; + if( sqlite3PagerGet(pCheck->pPager, (Pgno)iPage, &pOvflPage, 0) ){ + checkAppendMsg(pCheck, "failed to get page %d", iPage); + break; + } + pOvflData = (unsigned char *)sqlite3PagerGetData(pOvflPage); + if( isFreeList ){ + int n = get4byte(&pOvflData[4]); +#ifndef SQLITE_OMIT_AUTOVACUUM + if( pCheck->pBt->autoVacuum ){ + checkPtrmap(pCheck, iPage, PTRMAP_FREEPAGE, 0); + } +#endif + if( n>(int)pCheck->pBt->usableSize/4-2 ){ + checkAppendMsg(pCheck, + "freelist leaf count too big on page %d", iPage); + N--; + }else{ + for(i=0; ipBt->autoVacuum ){ + checkPtrmap(pCheck, iFreePage, PTRMAP_FREEPAGE, 0); + } +#endif + checkRef(pCheck, iFreePage); + } + N -= n; + } + } +#ifndef SQLITE_OMIT_AUTOVACUUM + else{ + /* If this database supports auto-vacuum and iPage is not the last + ** page in this overflow list, check that the pointer-map entry for + ** the following page matches iPage. + */ + if( pCheck->pBt->autoVacuum && N>0 ){ + i = get4byte(pOvflData); + checkPtrmap(pCheck, i, PTRMAP_OVERFLOW2, iPage); + } + } +#endif + iPage = get4byte(pOvflData); + sqlite3PagerUnref(pOvflPage); + + if( isFreeList && N<(iPage!=0) ){ + checkAppendMsg(pCheck, "free-page count in header is too small"); + } + } +} +#endif /* SQLITE_OMIT_INTEGRITY_CHECK */ + +/* +** An implementation of a min-heap. +** +** aHeap[0] is the number of elements on the heap. aHeap[1] is the +** root element. The daughter nodes of aHeap[N] are aHeap[N*2] +** and aHeap[N*2+1]. +** +** The heap property is this: Every node is less than or equal to both +** of its daughter nodes. A consequence of the heap property is that the +** root node aHeap[1] is always the minimum value currently in the heap. +** +** The btreeHeapInsert() routine inserts an unsigned 32-bit number onto +** the heap, preserving the heap property. The btreeHeapPull() routine +** removes the root element from the heap (the minimum value in the heap) +** and then moves other nodes around as necessary to preserve the heap +** property. +** +** This heap is used for cell overlap and coverage testing. Each u32 +** entry represents the span of a cell or freeblock on a btree page. +** The upper 16 bits are the index of the first byte of a range and the +** lower 16 bits are the index of the last byte of that range. +*/ +static void btreeHeapInsert(u32 *aHeap, u32 x){ + u32 j, i = ++aHeap[0]; + aHeap[i] = x; + while( (j = i/2)>0 && aHeap[j]>aHeap[i] ){ + x = aHeap[j]; + aHeap[j] = aHeap[i]; + aHeap[i] = x; + i = j; + } +} +static int btreeHeapPull(u32 *aHeap, u32 *pOut){ + u32 j, i, x; + if( (x = aHeap[0])==0 ) return 0; + *pOut = aHeap[1]; + aHeap[1] = aHeap[x]; + aHeap[x] = 0xffffffff; + aHeap[0]--; + i = 1; + while( (j = i*2)<=aHeap[0] ){ + if( aHeap[j]>aHeap[j+1] ) j++; + if( aHeap[i]zPfx; + int saved_v1 = pCheck->v1; + int saved_v2 = pCheck->v2; + u8 savedIsInit = 0; + + /* Check that the page exists + */ + pBt = pCheck->pBt; + usableSize = pBt->usableSize; + if( iPage==0 ) return 0; + if( checkRef(pCheck, iPage) ) return 0; + pCheck->zPfx = "Page %d: "; + pCheck->v1 = iPage; + if( (rc = btreeGetPage(pBt, (Pgno)iPage, &pPage, 0))!=0 ){ + checkAppendMsg(pCheck, + "unable to get the page. error code=%d", rc); + goto end_of_check; + } + + /* Clear MemPage.isInit to make sure the corruption detection code in + ** btreeInitPage() is executed. */ + savedIsInit = pPage->isInit; + pPage->isInit = 0; + if( (rc = btreeInitPage(pPage))!=0 ){ + assert( rc==SQLITE_CORRUPT ); /* The only possible error from InitPage */ + checkAppendMsg(pCheck, + "btreeInitPage() returns error code %d", rc); + goto end_of_check; + } + data = pPage->aData; + hdr = pPage->hdrOffset; + + /* Set up for cell analysis */ + pCheck->zPfx = "On tree page %d cell %d: "; + contentOffset = get2byteNotZero(&data[hdr+5]); + assert( contentOffset<=usableSize ); /* Enforced by btreeInitPage() */ + + /* EVIDENCE-OF: R-37002-32774 The two-byte integer at offset 3 gives the + ** number of cells on the page. */ + nCell = get2byte(&data[hdr+3]); + assert( pPage->nCell==nCell ); + + /* EVIDENCE-OF: R-23882-45353 The cell pointer array of a b-tree page + ** immediately follows the b-tree page header. */ + cellStart = hdr + 12 - 4*pPage->leaf; + assert( pPage->aCellIdx==&data[cellStart] ); + pCellIdx = &data[cellStart + 2*(nCell-1)]; + + if( !pPage->leaf ){ + /* Analyze the right-child page of internal pages */ + pgno = get4byte(&data[hdr+8]); +#ifndef SQLITE_OMIT_AUTOVACUUM + if( pBt->autoVacuum ){ + pCheck->zPfx = "On page %d at right child: "; + checkPtrmap(pCheck, pgno, PTRMAP_BTREE, iPage); + } +#endif + depth = checkTreePage(pCheck, pgno, &maxKey, maxKey); + keyCanBeEqual = 0; + }else{ + /* For leaf pages, the coverage check will occur in the same loop + ** as the other cell checks, so initialize the heap. */ + heap = pCheck->heap; + heap[0] = 0; + } + + /* EVIDENCE-OF: R-02776-14802 The cell pointer array consists of K 2-byte + ** integer offsets to the cell contents. */ + for(i=nCell-1; i>=0 && pCheck->mxErr; i--){ + CellInfo info; + + /* Check cell size */ + pCheck->v2 = i; + assert( pCellIdx==&data[cellStart + i*2] ); + pc = get2byteAligned(pCellIdx); + pCellIdx -= 2; + if( pcusableSize-4 ){ + checkAppendMsg(pCheck, "Offset %d out of range %d..%d", + pc, contentOffset, usableSize-4); + doCoverageCheck = 0; + continue; + } + pCell = &data[pc]; + pPage->xParseCell(pPage, pCell, &info); + if( pc+info.nSize>usableSize ){ + checkAppendMsg(pCheck, "Extends off end of page"); + doCoverageCheck = 0; + continue; + } + + /* Check for integer primary key out of range */ + if( pPage->intKey ){ + if( keyCanBeEqual ? (info.nKey > maxKey) : (info.nKey >= maxKey) ){ + checkAppendMsg(pCheck, "Rowid %lld out of order", info.nKey); + } + maxKey = info.nKey; + } + + /* Check the content overflow list */ + if( info.nPayload>info.nLocal ){ + int nPage; /* Number of pages on the overflow chain */ + Pgno pgnoOvfl; /* First page of the overflow chain */ + assert( pc + info.nSize - 4 <= usableSize ); + nPage = (info.nPayload - info.nLocal + usableSize - 5)/(usableSize - 4); + pgnoOvfl = get4byte(&pCell[info.nSize - 4]); +#ifndef SQLITE_OMIT_AUTOVACUUM + if( pBt->autoVacuum ){ + checkPtrmap(pCheck, pgnoOvfl, PTRMAP_OVERFLOW1, iPage); + } +#endif + checkList(pCheck, 0, pgnoOvfl, nPage); + } + + if( !pPage->leaf ){ + /* Check sanity of left child page for internal pages */ + pgno = get4byte(pCell); +#ifndef SQLITE_OMIT_AUTOVACUUM + if( pBt->autoVacuum ){ + checkPtrmap(pCheck, pgno, PTRMAP_BTREE, iPage); + } +#endif + d2 = checkTreePage(pCheck, pgno, &maxKey, maxKey); + keyCanBeEqual = 0; + if( d2!=depth ){ + checkAppendMsg(pCheck, "Child page depth differs"); + depth = d2; + } + }else{ + /* Populate the coverage-checking heap for leaf pages */ + btreeHeapInsert(heap, (pc<<16)|(pc+info.nSize-1)); + } + } + *piMinKey = maxKey; + + /* Check for complete coverage of the page + */ + pCheck->zPfx = 0; + if( doCoverageCheck && pCheck->mxErr>0 ){ + /* For leaf pages, the min-heap has already been initialized and the + ** cells have already been inserted. But for internal pages, that has + ** not yet been done, so do it now */ + if( !pPage->leaf ){ + heap = pCheck->heap; + heap[0] = 0; + for(i=nCell-1; i>=0; i--){ + u32 size; + pc = get2byteAligned(&data[cellStart+i*2]); + size = pPage->xCellSize(pPage, &data[pc]); + btreeHeapInsert(heap, (pc<<16)|(pc+size-1)); + } + } + /* Add the freeblocks to the min-heap + ** + ** EVIDENCE-OF: R-20690-50594 The second field of the b-tree page header + ** is the offset of the first freeblock, or zero if there are no + ** freeblocks on the page. + */ + i = get2byte(&data[hdr+1]); + while( i>0 ){ + int size, j; + assert( (u32)i<=usableSize-4 ); /* Enforced by btreeInitPage() */ + size = get2byte(&data[i+2]); + assert( (u32)(i+size)<=usableSize ); /* Enforced by btreeInitPage() */ + btreeHeapInsert(heap, (((u32)i)<<16)|(i+size-1)); + /* EVIDENCE-OF: R-58208-19414 The first 2 bytes of a freeblock are a + ** big-endian integer which is the offset in the b-tree page of the next + ** freeblock in the chain, or zero if the freeblock is the last on the + ** chain. */ + j = get2byte(&data[i]); + /* EVIDENCE-OF: R-06866-39125 Freeblocks are always connected in order of + ** increasing offset. */ + assert( j==0 || j>i+size ); /* Enforced by btreeInitPage() */ + assert( (u32)j<=usableSize-4 ); /* Enforced by btreeInitPage() */ + i = j; + } + /* Analyze the min-heap looking for overlap between cells and/or + ** freeblocks, and counting the number of untracked bytes in nFrag. + ** + ** Each min-heap entry is of the form: (start_address<<16)|end_address. + ** There is an implied first entry the covers the page header, the cell + ** pointer index, and the gap between the cell pointer index and the start + ** of cell content. + ** + ** The loop below pulls entries from the min-heap in order and compares + ** the start_address against the previous end_address. If there is an + ** overlap, that means bytes are used multiple times. If there is a gap, + ** that gap is added to the fragmentation count. + */ + nFrag = 0; + prev = contentOffset - 1; /* Implied first min-heap entry */ + while( btreeHeapPull(heap,&x) ){ + if( (prev&0xffff)>=(x>>16) ){ + checkAppendMsg(pCheck, + "Multiple uses for byte %u of page %d", x>>16, iPage); + break; + }else{ + nFrag += (x>>16) - (prev&0xffff) - 1; + prev = x; + } + } + nFrag += usableSize - (prev&0xffff) - 1; + /* EVIDENCE-OF: R-43263-13491 The total number of bytes in all fragments + ** is stored in the fifth field of the b-tree page header. + ** EVIDENCE-OF: R-07161-27322 The one-byte integer at offset 7 gives the + ** number of fragmented free bytes within the cell content area. + */ + if( heap[0]==0 && nFrag!=data[hdr+7] ){ + checkAppendMsg(pCheck, + "Fragmentation of %d bytes reported as %d on page %d", + nFrag, data[hdr+7], iPage); + } + } + +end_of_check: + if( !doCoverageCheck ) pPage->isInit = savedIsInit; + releasePage(pPage); + pCheck->zPfx = saved_zPfx; + pCheck->v1 = saved_v1; + pCheck->v2 = saved_v2; + return depth+1; +} +#endif /* SQLITE_OMIT_INTEGRITY_CHECK */ + +#ifndef SQLITE_OMIT_INTEGRITY_CHECK +/* +** This routine does a complete check of the given BTree file. aRoot[] is +** an array of pages numbers were each page number is the root page of +** a table. nRoot is the number of entries in aRoot. +** +** A read-only or read-write transaction must be opened before calling +** this function. +** +** Write the number of error seen in *pnErr. Except for some memory +** allocation errors, an error message held in memory obtained from +** malloc is returned if *pnErr is non-zero. If *pnErr==0 then NULL is +** returned. If a memory allocation error occurs, NULL is returned. +*/ +SQLITE_PRIVATE char *sqlite3BtreeIntegrityCheck( + Btree *p, /* The btree to be checked */ + int *aRoot, /* An array of root pages numbers for individual trees */ + int nRoot, /* Number of entries in aRoot[] */ + int mxErr, /* Stop reporting errors after this many */ + int *pnErr /* Write number of errors seen to this variable */ +){ + Pgno i; + IntegrityCk sCheck; + BtShared *pBt = p->pBt; + int savedDbFlags = pBt->db->flags; + char zErr[100]; + VVA_ONLY( int nRef ); + + sqlite3BtreeEnter(p); + assert( p->inTrans>TRANS_NONE && pBt->inTransaction>TRANS_NONE ); + VVA_ONLY( nRef = sqlite3PagerRefcount(pBt->pPager) ); + assert( nRef>=0 ); + sCheck.pBt = pBt; + sCheck.pPager = pBt->pPager; + sCheck.nPage = btreePagecount(sCheck.pBt); + sCheck.mxErr = mxErr; + sCheck.nErr = 0; + sCheck.mallocFailed = 0; + sCheck.zPfx = 0; + sCheck.v1 = 0; + sCheck.v2 = 0; + sCheck.aPgRef = 0; + sCheck.heap = 0; + sqlite3StrAccumInit(&sCheck.errMsg, 0, zErr, sizeof(zErr), SQLITE_MAX_LENGTH); + sCheck.errMsg.printfFlags = SQLITE_PRINTF_INTERNAL; + if( sCheck.nPage==0 ){ + goto integrity_ck_cleanup; + } + + sCheck.aPgRef = sqlite3MallocZero((sCheck.nPage / 8)+ 1); + if( !sCheck.aPgRef ){ + sCheck.mallocFailed = 1; + goto integrity_ck_cleanup; + } + sCheck.heap = (u32*)sqlite3PageMalloc( pBt->pageSize ); + if( sCheck.heap==0 ){ + sCheck.mallocFailed = 1; + goto integrity_ck_cleanup; + } + + i = PENDING_BYTE_PAGE(pBt); + if( i<=sCheck.nPage ) setPageReferenced(&sCheck, i); + + /* Check the integrity of the freelist + */ + sCheck.zPfx = "Main freelist: "; + checkList(&sCheck, 1, get4byte(&pBt->pPage1->aData[32]), + get4byte(&pBt->pPage1->aData[36])); + sCheck.zPfx = 0; + + /* Check all the tables. + */ + testcase( pBt->db->flags & SQLITE_CellSizeCk ); + pBt->db->flags &= ~SQLITE_CellSizeCk; + for(i=0; (int)iautoVacuum && aRoot[i]>1 ){ + checkPtrmap(&sCheck, aRoot[i], PTRMAP_ROOTPAGE, 0); + } +#endif + checkTreePage(&sCheck, aRoot[i], ¬Used, LARGEST_INT64); + } + pBt->db->flags = savedDbFlags; + + /* Make sure every page in the file is referenced + */ + for(i=1; i<=sCheck.nPage && sCheck.mxErr; i++){ +#ifdef SQLITE_OMIT_AUTOVACUUM + if( getPageReferenced(&sCheck, i)==0 ){ + checkAppendMsg(&sCheck, "Page %d is never used", i); + } +#else + /* If the database supports auto-vacuum, make sure no tables contain + ** references to pointer-map pages. + */ + if( getPageReferenced(&sCheck, i)==0 && + (PTRMAP_PAGENO(pBt, i)!=i || !pBt->autoVacuum) ){ + checkAppendMsg(&sCheck, "Page %d is never used", i); + } + if( getPageReferenced(&sCheck, i)!=0 && + (PTRMAP_PAGENO(pBt, i)==i && pBt->autoVacuum) ){ + checkAppendMsg(&sCheck, "Pointer map page %d is referenced", i); + } +#endif + } + + /* Clean up and report errors. + */ +integrity_ck_cleanup: + sqlite3PageFree(sCheck.heap); + sqlite3_free(sCheck.aPgRef); + if( sCheck.mallocFailed ){ + sqlite3StrAccumReset(&sCheck.errMsg); + sCheck.nErr++; + } + *pnErr = sCheck.nErr; + if( sCheck.nErr==0 ) sqlite3StrAccumReset(&sCheck.errMsg); + /* Make sure this analysis did not leave any unref() pages. */ + assert( nRef==sqlite3PagerRefcount(pBt->pPager) ); + sqlite3BtreeLeave(p); + return sqlite3StrAccumFinish(&sCheck.errMsg); +} +#endif /* SQLITE_OMIT_INTEGRITY_CHECK */ + +/* +** Return the full pathname of the underlying database file. Return +** an empty string if the database is in-memory or a TEMP database. +** +** The pager filename is invariant as long as the pager is +** open so it is safe to access without the BtShared mutex. +*/ +SQLITE_PRIVATE const char *sqlite3BtreeGetFilename(Btree *p){ + assert( p->pBt->pPager!=0 ); + return sqlite3PagerFilename(p->pBt->pPager, 1); +} + +/* +** Return the pathname of the journal file for this database. The return +** value of this routine is the same regardless of whether the journal file +** has been created or not. +** +** The pager journal filename is invariant as long as the pager is +** open so it is safe to access without the BtShared mutex. +*/ +SQLITE_PRIVATE const char *sqlite3BtreeGetJournalname(Btree *p){ + assert( p->pBt->pPager!=0 ); + return sqlite3PagerJournalname(p->pBt->pPager); +} + +/* +** Return non-zero if a transaction is active. +*/ +SQLITE_PRIVATE int sqlite3BtreeIsInTrans(Btree *p){ + assert( p==0 || sqlite3_mutex_held(p->db->mutex) ); + return (p && (p->inTrans==TRANS_WRITE)); +} + +#ifndef SQLITE_OMIT_WAL +/* +** Run a checkpoint on the Btree passed as the first argument. +** +** Return SQLITE_LOCKED if this or any other connection has an open +** transaction on the shared-cache the argument Btree is connected to. +** +** Parameter eMode is one of SQLITE_CHECKPOINT_PASSIVE, FULL or RESTART. +*/ +SQLITE_PRIVATE int sqlite3BtreeCheckpoint(Btree *p, int eMode, int *pnLog, int *pnCkpt){ + int rc = SQLITE_OK; + if( p ){ + BtShared *pBt = p->pBt; + sqlite3BtreeEnter(p); + if( pBt->inTransaction!=TRANS_NONE ){ + rc = SQLITE_LOCKED; + }else{ + rc = sqlite3PagerCheckpoint(pBt->pPager, eMode, pnLog, pnCkpt); + } + sqlite3BtreeLeave(p); + } + return rc; +} +#endif + +/* +** Return non-zero if a read (or write) transaction is active. +*/ +SQLITE_PRIVATE int sqlite3BtreeIsInReadTrans(Btree *p){ + assert( p ); + assert( sqlite3_mutex_held(p->db->mutex) ); + return p->inTrans!=TRANS_NONE; +} + +SQLITE_PRIVATE int sqlite3BtreeIsInBackup(Btree *p){ + assert( p ); + assert( sqlite3_mutex_held(p->db->mutex) ); + return p->nBackup!=0; +} + +/* +** This function returns a pointer to a blob of memory associated with +** a single shared-btree. The memory is used by client code for its own +** purposes (for example, to store a high-level schema associated with +** the shared-btree). The btree layer manages reference counting issues. +** +** The first time this is called on a shared-btree, nBytes bytes of memory +** are allocated, zeroed, and returned to the caller. For each subsequent +** call the nBytes parameter is ignored and a pointer to the same blob +** of memory returned. +** +** If the nBytes parameter is 0 and the blob of memory has not yet been +** allocated, a null pointer is returned. If the blob has already been +** allocated, it is returned as normal. +** +** Just before the shared-btree is closed, the function passed as the +** xFree argument when the memory allocation was made is invoked on the +** blob of allocated memory. The xFree function should not call sqlite3_free() +** on the memory, the btree layer does that. +*/ +SQLITE_PRIVATE void *sqlite3BtreeSchema(Btree *p, int nBytes, void(*xFree)(void *)){ + BtShared *pBt = p->pBt; + sqlite3BtreeEnter(p); + if( !pBt->pSchema && nBytes ){ + pBt->pSchema = sqlite3DbMallocZero(0, nBytes); + pBt->xFreeSchema = xFree; + } + sqlite3BtreeLeave(p); + return pBt->pSchema; +} + +/* +** Return SQLITE_LOCKED_SHAREDCACHE if another user of the same shared +** btree as the argument handle holds an exclusive lock on the +** sqlite_master table. Otherwise SQLITE_OK. +*/ +SQLITE_PRIVATE int sqlite3BtreeSchemaLocked(Btree *p){ + int rc; + assert( sqlite3_mutex_held(p->db->mutex) ); + sqlite3BtreeEnter(p); + rc = querySharedCacheTableLock(p, MASTER_ROOT, READ_LOCK); + assert( rc==SQLITE_OK || rc==SQLITE_LOCKED_SHAREDCACHE ); + sqlite3BtreeLeave(p); + return rc; +} + + +#ifndef SQLITE_OMIT_SHARED_CACHE +/* +** Obtain a lock on the table whose root page is iTab. The +** lock is a write lock if isWritelock is true or a read lock +** if it is false. +*/ +SQLITE_PRIVATE int sqlite3BtreeLockTable(Btree *p, int iTab, u8 isWriteLock){ + int rc = SQLITE_OK; + assert( p->inTrans!=TRANS_NONE ); + if( p->sharable ){ + u8 lockType = READ_LOCK + isWriteLock; + assert( READ_LOCK+1==WRITE_LOCK ); + assert( isWriteLock==0 || isWriteLock==1 ); + + sqlite3BtreeEnter(p); + rc = querySharedCacheTableLock(p, iTab, lockType); + if( rc==SQLITE_OK ){ + rc = setSharedCacheTableLock(p, iTab, lockType); + } + sqlite3BtreeLeave(p); + } + return rc; +} +#endif + +#ifndef SQLITE_OMIT_INCRBLOB +/* +** Argument pCsr must be a cursor opened for writing on an +** INTKEY table currently pointing at a valid table entry. +** This function modifies the data stored as part of that entry. +** +** Only the data content may only be modified, it is not possible to +** change the length of the data stored. If this function is called with +** parameters that attempt to write past the end of the existing data, +** no modifications are made and SQLITE_CORRUPT is returned. +*/ +SQLITE_PRIVATE int sqlite3BtreePutData(BtCursor *pCsr, u32 offset, u32 amt, void *z){ + int rc; + assert( cursorOwnsBtShared(pCsr) ); + assert( sqlite3_mutex_held(pCsr->pBtree->db->mutex) ); + assert( pCsr->curFlags & BTCF_Incrblob ); + + rc = restoreCursorPosition(pCsr); + if( rc!=SQLITE_OK ){ + return rc; + } + assert( pCsr->eState!=CURSOR_REQUIRESEEK ); + if( pCsr->eState!=CURSOR_VALID ){ + return SQLITE_ABORT; + } + + /* Save the positions of all other cursors open on this table. This is + ** required in case any of them are holding references to an xFetch + ** version of the b-tree page modified by the accessPayload call below. + ** + ** Note that pCsr must be open on a INTKEY table and saveCursorPosition() + ** and hence saveAllCursors() cannot fail on a BTREE_INTKEY table, hence + ** saveAllCursors can only return SQLITE_OK. + */ + VVA_ONLY(rc =) saveAllCursors(pCsr->pBt, pCsr->pgnoRoot, pCsr); + assert( rc==SQLITE_OK ); + + /* Check some assumptions: + ** (a) the cursor is open for writing, + ** (b) there is a read/write transaction open, + ** (c) the connection holds a write-lock on the table (if required), + ** (d) there are no conflicting read-locks, and + ** (e) the cursor points at a valid row of an intKey table. + */ + if( (pCsr->curFlags & BTCF_WriteFlag)==0 ){ + return SQLITE_READONLY; + } + assert( (pCsr->pBt->btsFlags & BTS_READ_ONLY)==0 + && pCsr->pBt->inTransaction==TRANS_WRITE ); + assert( hasSharedCacheTableLock(pCsr->pBtree, pCsr->pgnoRoot, 0, 2) ); + assert( !hasReadConflicts(pCsr->pBtree, pCsr->pgnoRoot) ); + assert( pCsr->apPage[pCsr->iPage]->intKey ); + + return accessPayload(pCsr, offset, amt, (unsigned char *)z, 1); +} + +/* +** Mark this cursor as an incremental blob cursor. +*/ +SQLITE_PRIVATE void sqlite3BtreeIncrblobCursor(BtCursor *pCur){ + pCur->curFlags |= BTCF_Incrblob; + pCur->pBtree->hasIncrblobCur = 1; +} +#endif + +/* +** Set both the "read version" (single byte at byte offset 18) and +** "write version" (single byte at byte offset 19) fields in the database +** header to iVersion. +*/ +SQLITE_PRIVATE int sqlite3BtreeSetVersion(Btree *pBtree, int iVersion){ + BtShared *pBt = pBtree->pBt; + int rc; /* Return code */ + + assert( iVersion==1 || iVersion==2 ); + + /* If setting the version fields to 1, do not automatically open the + ** WAL connection, even if the version fields are currently set to 2. + */ + pBt->btsFlags &= ~BTS_NO_WAL; + if( iVersion==1 ) pBt->btsFlags |= BTS_NO_WAL; + + rc = sqlite3BtreeBeginTrans(pBtree, 0); + if( rc==SQLITE_OK ){ + u8 *aData = pBt->pPage1->aData; + if( aData[18]!=(u8)iVersion || aData[19]!=(u8)iVersion ){ + rc = sqlite3BtreeBeginTrans(pBtree, 2); + if( rc==SQLITE_OK ){ + rc = sqlite3PagerWrite(pBt->pPage1->pDbPage); + if( rc==SQLITE_OK ){ + aData[18] = (u8)iVersion; + aData[19] = (u8)iVersion; + } + } + } + } + + pBt->btsFlags &= ~BTS_NO_WAL; + return rc; +} + +/* +** Return true if the cursor has a hint specified. This routine is +** only used from within assert() statements +*/ +SQLITE_PRIVATE int sqlite3BtreeCursorHasHint(BtCursor *pCsr, unsigned int mask){ + return (pCsr->hints & mask)!=0; +} + +/* +** Return true if the given Btree is read-only. +*/ +SQLITE_PRIVATE int sqlite3BtreeIsReadonly(Btree *p){ + return (p->pBt->btsFlags & BTS_READ_ONLY)!=0; +} + +/* +** Return the size of the header added to each page by this module. +*/ +SQLITE_PRIVATE int sqlite3HeaderSizeBtree(void){ return ROUND8(sizeof(MemPage)); } + +#if !defined(SQLITE_OMIT_SHARED_CACHE) +/* +** Return true if the Btree passed as the only argument is sharable. +*/ +SQLITE_PRIVATE int sqlite3BtreeSharable(Btree *p){ + return p->sharable; +} + +/* +** Return the number of connections to the BtShared object accessed by +** the Btree handle passed as the only argument. For private caches +** this is always 1. For shared caches it may be 1 or greater. +*/ +SQLITE_PRIVATE int sqlite3BtreeConnectionCount(Btree *p){ + testcase( p->sharable ); + return p->pBt->nRef; +} +#endif + +/************** End of btree.c ***********************************************/ +/************** Begin file backup.c ******************************************/ +/* +** 2009 January 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 file contains the implementation of the sqlite3_backup_XXX() +** API functions and the related features. +*/ +/* #include "sqliteInt.h" */ +/* #include "btreeInt.h" */ + +/* +** Structure allocated for each backup operation. +*/ +struct sqlite3_backup { + sqlite3* pDestDb; /* Destination database handle */ + Btree *pDest; /* Destination b-tree file */ + u32 iDestSchema; /* Original schema cookie in destination */ + int bDestLocked; /* True once a write-transaction is open on pDest */ + + Pgno iNext; /* Page number of the next source page to copy */ + sqlite3* pSrcDb; /* Source database handle */ + Btree *pSrc; /* Source b-tree file */ + + int rc; /* Backup process error code */ + + /* These two variables are set by every call to backup_step(). They are + ** read by calls to backup_remaining() and backup_pagecount(). + */ + Pgno nRemaining; /* Number of pages left to copy */ + Pgno nPagecount; /* Total number of pages to copy */ + + int isAttached; /* True once backup has been registered with pager */ + sqlite3_backup *pNext; /* Next backup associated with source pager */ +}; + +/* +** THREAD SAFETY NOTES: +** +** Once it has been created using backup_init(), a single sqlite3_backup +** structure may be accessed via two groups of thread-safe entry points: +** +** * Via the sqlite3_backup_XXX() API function backup_step() and +** backup_finish(). Both these functions obtain the source database +** handle mutex and the mutex associated with the source BtShared +** structure, in that order. +** +** * Via the BackupUpdate() and BackupRestart() functions, which are +** invoked by the pager layer to report various state changes in +** the page cache associated with the source database. The mutex +** associated with the source database BtShared structure will always +** be held when either of these functions are invoked. +** +** The other sqlite3_backup_XXX() API functions, backup_remaining() and +** backup_pagecount() are not thread-safe functions. If they are called +** while some other thread is calling backup_step() or backup_finish(), +** the values returned may be invalid. There is no way for a call to +** BackupUpdate() or BackupRestart() to interfere with backup_remaining() +** or backup_pagecount(). +** +** Depending on the SQLite configuration, the database handles and/or +** the Btree objects may have their own mutexes that require locking. +** Non-sharable Btrees (in-memory databases for example), do not have +** associated mutexes. +*/ + +/* +** Return a pointer corresponding to database zDb (i.e. "main", "temp") +** in connection handle pDb. If such a database cannot be found, return +** a NULL pointer and write an error message to pErrorDb. +** +** If the "temp" database is requested, it may need to be opened by this +** function. If an error occurs while doing so, return 0 and write an +** error message to pErrorDb. +*/ +static Btree *findBtree(sqlite3 *pErrorDb, sqlite3 *pDb, const char *zDb){ + int i = sqlite3FindDbName(pDb, zDb); + + if( i==1 ){ + Parse sParse; + int rc = 0; + memset(&sParse, 0, sizeof(sParse)); + sParse.db = pDb; + if( sqlite3OpenTempDatabase(&sParse) ){ + sqlite3ErrorWithMsg(pErrorDb, sParse.rc, "%s", sParse.zErrMsg); + rc = SQLITE_ERROR; + } + sqlite3DbFree(pErrorDb, sParse.zErrMsg); + sqlite3ParserReset(&sParse); + if( rc ){ + return 0; + } + } + + if( i<0 ){ + sqlite3ErrorWithMsg(pErrorDb, SQLITE_ERROR, "unknown database %s", zDb); + return 0; + } + + return pDb->aDb[i].pBt; +} + +/* +** Attempt to set the page size of the destination to match the page size +** of the source. +*/ +static int setDestPgsz(sqlite3_backup *p){ + int rc; + rc = sqlite3BtreeSetPageSize(p->pDest,sqlite3BtreeGetPageSize(p->pSrc),-1,0); + return rc; +} + +/* +** Check that there is no open read-transaction on the b-tree passed as the +** second argument. If there is not, return SQLITE_OK. Otherwise, if there +** is an open read-transaction, return SQLITE_ERROR and leave an error +** message in database handle db. +*/ +static int checkReadTransaction(sqlite3 *db, Btree *p){ + if( sqlite3BtreeIsInReadTrans(p) ){ + sqlite3ErrorWithMsg(db, SQLITE_ERROR, "destination database is in use"); + return SQLITE_ERROR; + } + return SQLITE_OK; +} + +/* +** Create an sqlite3_backup process to copy the contents of zSrcDb from +** connection handle pSrcDb to zDestDb in pDestDb. If successful, return +** a pointer to the new sqlite3_backup object. +** +** If an error occurs, NULL is returned and an error code and error message +** stored in database handle pDestDb. +*/ +SQLITE_API sqlite3_backup *sqlite3_backup_init( + sqlite3* pDestDb, /* Database to write to */ + const char *zDestDb, /* Name of database within pDestDb */ + sqlite3* pSrcDb, /* Database connection to read from */ + const char *zSrcDb /* Name of database within pSrcDb */ +){ + sqlite3_backup *p; /* Value to return */ + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(pSrcDb)||!sqlite3SafetyCheckOk(pDestDb) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + + /* Lock the source database handle. The destination database + ** handle is not locked in this routine, but it is locked in + ** sqlite3_backup_step(). The user is required to ensure that no + ** other thread accesses the destination handle for the duration + ** of the backup operation. Any attempt to use the destination + ** database connection while a backup is in progress may cause + ** a malfunction or a deadlock. + */ + sqlite3_mutex_enter(pSrcDb->mutex); + sqlite3_mutex_enter(pDestDb->mutex); + + if( pSrcDb==pDestDb ){ + sqlite3ErrorWithMsg( + pDestDb, SQLITE_ERROR, "source and destination must be distinct" + ); + p = 0; + }else { + /* Allocate space for a new sqlite3_backup object... + ** EVIDENCE-OF: R-64852-21591 The sqlite3_backup object is created by a + ** call to sqlite3_backup_init() and is destroyed by a call to + ** sqlite3_backup_finish(). */ + p = (sqlite3_backup *)sqlite3MallocZero(sizeof(sqlite3_backup)); + if( !p ){ + sqlite3Error(pDestDb, SQLITE_NOMEM_BKPT); + } + } + + /* If the allocation succeeded, populate the new object. */ + if( p ){ + p->pSrc = findBtree(pDestDb, pSrcDb, zSrcDb); + p->pDest = findBtree(pDestDb, pDestDb, zDestDb); + p->pDestDb = pDestDb; + p->pSrcDb = pSrcDb; + p->iNext = 1; + p->isAttached = 0; + + if( 0==p->pSrc || 0==p->pDest + || checkReadTransaction(pDestDb, p->pDest)!=SQLITE_OK + ){ + /* One (or both) of the named databases did not exist or an OOM + ** error was hit. Or there is a transaction open on the destination + ** database. The error has already been written into the pDestDb + ** handle. All that is left to do here is free the sqlite3_backup + ** structure. */ + sqlite3_free(p); + p = 0; + } + } + if( p ){ + p->pSrc->nBackup++; + } + + sqlite3_mutex_leave(pDestDb->mutex); + sqlite3_mutex_leave(pSrcDb->mutex); + return p; +} + +/* +** Argument rc is an SQLite error code. Return true if this error is +** considered fatal if encountered during a backup operation. All errors +** are considered fatal except for SQLITE_BUSY and SQLITE_LOCKED. +*/ +static int isFatalError(int rc){ + return (rc!=SQLITE_OK && rc!=SQLITE_BUSY && ALWAYS(rc!=SQLITE_LOCKED)); +} + +/* +** Parameter zSrcData points to a buffer containing the data for +** page iSrcPg from the source database. Copy this data into the +** destination database. +*/ +static int backupOnePage( + sqlite3_backup *p, /* Backup handle */ + Pgno iSrcPg, /* Source database page to backup */ + const u8 *zSrcData, /* Source database page data */ + int bUpdate /* True for an update, false otherwise */ +){ + Pager * const pDestPager = sqlite3BtreePager(p->pDest); + const int nSrcPgsz = sqlite3BtreeGetPageSize(p->pSrc); + int nDestPgsz = sqlite3BtreeGetPageSize(p->pDest); + const int nCopy = MIN(nSrcPgsz, nDestPgsz); + const i64 iEnd = (i64)iSrcPg*(i64)nSrcPgsz; +#ifdef SQLITE_HAS_CODEC + /* Use BtreeGetReserveNoMutex() for the source b-tree, as although it is + ** guaranteed that the shared-mutex is held by this thread, handle + ** p->pSrc may not actually be the owner. */ + int nSrcReserve = sqlite3BtreeGetReserveNoMutex(p->pSrc); + int nDestReserve = sqlite3BtreeGetOptimalReserve(p->pDest); +#endif + int rc = SQLITE_OK; + i64 iOff; + + assert( sqlite3BtreeGetReserveNoMutex(p->pSrc)>=0 ); + assert( p->bDestLocked ); + assert( !isFatalError(p->rc) ); + assert( iSrcPg!=PENDING_BYTE_PAGE(p->pSrc->pBt) ); + assert( zSrcData ); + + /* Catch the case where the destination is an in-memory database and the + ** page sizes of the source and destination differ. + */ + if( nSrcPgsz!=nDestPgsz && sqlite3PagerIsMemdb(pDestPager) ){ + rc = SQLITE_READONLY; + } + +#ifdef SQLITE_HAS_CODEC + /* Backup is not possible if the page size of the destination is changing + ** and a codec is in use. + */ + if( nSrcPgsz!=nDestPgsz && sqlite3PagerGetCodec(pDestPager)!=0 ){ + rc = SQLITE_READONLY; + } + + /* Backup is not possible if the number of bytes of reserve space differ + ** between source and destination. If there is a difference, try to + ** fix the destination to agree with the source. If that is not possible, + ** then the backup cannot proceed. + */ + if( nSrcReserve!=nDestReserve ){ + u32 newPgsz = nSrcPgsz; + rc = sqlite3PagerSetPagesize(pDestPager, &newPgsz, nSrcReserve); + if( rc==SQLITE_OK && newPgsz!=nSrcPgsz ) rc = SQLITE_READONLY; + } +#endif + + /* This loop runs once for each destination page spanned by the source + ** page. For each iteration, variable iOff is set to the byte offset + ** of the destination page. + */ + for(iOff=iEnd-(i64)nSrcPgsz; rc==SQLITE_OK && iOffpDest->pBt) ) continue; + if( SQLITE_OK==(rc = sqlite3PagerGet(pDestPager, iDest, &pDestPg, 0)) + && SQLITE_OK==(rc = sqlite3PagerWrite(pDestPg)) + ){ + const u8 *zIn = &zSrcData[iOff%nSrcPgsz]; + u8 *zDestData = sqlite3PagerGetData(pDestPg); + u8 *zOut = &zDestData[iOff%nDestPgsz]; + + /* Copy the data from the source page into the destination page. + ** Then clear the Btree layer MemPage.isInit flag. Both this module + ** and the pager code use this trick (clearing the first byte + ** of the page 'extra' space to invalidate the Btree layers + ** cached parse of the page). MemPage.isInit is marked + ** "MUST BE FIRST" for this purpose. + */ + memcpy(zOut, zIn, nCopy); + ((u8 *)sqlite3PagerGetExtra(pDestPg))[0] = 0; + if( iOff==0 && bUpdate==0 ){ + sqlite3Put4byte(&zOut[28], sqlite3BtreeLastPage(p->pSrc)); + } + } + sqlite3PagerUnref(pDestPg); + } + + return rc; +} + +/* +** If pFile is currently larger than iSize bytes, then truncate it to +** exactly iSize bytes. If pFile is not larger than iSize bytes, then +** this function is a no-op. +** +** Return SQLITE_OK if everything is successful, or an SQLite error +** code if an error occurs. +*/ +static int backupTruncateFile(sqlite3_file *pFile, i64 iSize){ + i64 iCurrent; + int rc = sqlite3OsFileSize(pFile, &iCurrent); + if( rc==SQLITE_OK && iCurrent>iSize ){ + rc = sqlite3OsTruncate(pFile, iSize); + } + return rc; +} + +/* +** Register this backup object with the associated source pager for +** callbacks when pages are changed or the cache invalidated. +*/ +static void attachBackupObject(sqlite3_backup *p){ + sqlite3_backup **pp; + assert( sqlite3BtreeHoldsMutex(p->pSrc) ); + pp = sqlite3PagerBackupPtr(sqlite3BtreePager(p->pSrc)); + p->pNext = *pp; + *pp = p; + p->isAttached = 1; +} + +/* +** Copy nPage pages from the source b-tree to the destination. +*/ +SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage){ + int rc; + int destMode; /* Destination journal mode */ + int pgszSrc = 0; /* Source page size */ + int pgszDest = 0; /* Destination page size */ + +#ifdef SQLITE_ENABLE_API_ARMOR + if( p==0 ) return SQLITE_MISUSE_BKPT; +#endif + sqlite3_mutex_enter(p->pSrcDb->mutex); + sqlite3BtreeEnter(p->pSrc); + if( p->pDestDb ){ + sqlite3_mutex_enter(p->pDestDb->mutex); + } + + rc = p->rc; + if( !isFatalError(rc) ){ + Pager * const pSrcPager = sqlite3BtreePager(p->pSrc); /* Source pager */ + Pager * const pDestPager = sqlite3BtreePager(p->pDest); /* Dest pager */ + int ii; /* Iterator variable */ + int nSrcPage = -1; /* Size of source db in pages */ + int bCloseTrans = 0; /* True if src db requires unlocking */ + + /* If the source pager is currently in a write-transaction, return + ** SQLITE_BUSY immediately. + */ + if( p->pDestDb && p->pSrc->pBt->inTransaction==TRANS_WRITE ){ + rc = SQLITE_BUSY; + }else{ + rc = SQLITE_OK; + } + + /* If there is no open read-transaction on the source database, open + ** one now. If a transaction is opened here, then it will be closed + ** before this function exits. + */ + if( rc==SQLITE_OK && 0==sqlite3BtreeIsInReadTrans(p->pSrc) ){ + rc = sqlite3BtreeBeginTrans(p->pSrc, 0); + bCloseTrans = 1; + } + + /* If the destination database has not yet been locked (i.e. if this + ** is the first call to backup_step() for the current backup operation), + ** try to set its page size to the same as the source database. This + ** is especially important on ZipVFS systems, as in that case it is + ** not possible to create a database file that uses one page size by + ** writing to it with another. */ + if( p->bDestLocked==0 && rc==SQLITE_OK && setDestPgsz(p)==SQLITE_NOMEM ){ + rc = SQLITE_NOMEM; + } + + /* Lock the destination database, if it is not locked already. */ + if( SQLITE_OK==rc && p->bDestLocked==0 + && SQLITE_OK==(rc = sqlite3BtreeBeginTrans(p->pDest, 2)) + ){ + p->bDestLocked = 1; + sqlite3BtreeGetMeta(p->pDest, BTREE_SCHEMA_VERSION, &p->iDestSchema); + } + + /* Do not allow backup if the destination database is in WAL mode + ** and the page sizes are different between source and destination */ + pgszSrc = sqlite3BtreeGetPageSize(p->pSrc); + pgszDest = sqlite3BtreeGetPageSize(p->pDest); + destMode = sqlite3PagerGetJournalMode(sqlite3BtreePager(p->pDest)); + if( SQLITE_OK==rc && destMode==PAGER_JOURNALMODE_WAL && pgszSrc!=pgszDest ){ + rc = SQLITE_READONLY; + } + + /* Now that there is a read-lock on the source database, query the + ** source pager for the number of pages in the database. + */ + nSrcPage = (int)sqlite3BtreeLastPage(p->pSrc); + assert( nSrcPage>=0 ); + for(ii=0; (nPage<0 || iiiNext<=(Pgno)nSrcPage && !rc; ii++){ + const Pgno iSrcPg = p->iNext; /* Source page number */ + if( iSrcPg!=PENDING_BYTE_PAGE(p->pSrc->pBt) ){ + DbPage *pSrcPg; /* Source page object */ + rc = sqlite3PagerGet(pSrcPager, iSrcPg, &pSrcPg,PAGER_GET_READONLY); + if( rc==SQLITE_OK ){ + rc = backupOnePage(p, iSrcPg, sqlite3PagerGetData(pSrcPg), 0); + sqlite3PagerUnref(pSrcPg); + } + } + p->iNext++; + } + if( rc==SQLITE_OK ){ + p->nPagecount = nSrcPage; + p->nRemaining = nSrcPage+1-p->iNext; + if( p->iNext>(Pgno)nSrcPage ){ + rc = SQLITE_DONE; + }else if( !p->isAttached ){ + attachBackupObject(p); + } + } + + /* Update the schema version field in the destination database. This + ** is to make sure that the schema-version really does change in + ** the case where the source and destination databases have the + ** same schema version. + */ + if( rc==SQLITE_DONE ){ + if( nSrcPage==0 ){ + rc = sqlite3BtreeNewDb(p->pDest); + nSrcPage = 1; + } + if( rc==SQLITE_OK || rc==SQLITE_DONE ){ + rc = sqlite3BtreeUpdateMeta(p->pDest,1,p->iDestSchema+1); + } + if( rc==SQLITE_OK ){ + if( p->pDestDb ){ + sqlite3ResetAllSchemasOfConnection(p->pDestDb); + } + if( destMode==PAGER_JOURNALMODE_WAL ){ + rc = sqlite3BtreeSetVersion(p->pDest, 2); + } + } + if( rc==SQLITE_OK ){ + int nDestTruncate; + /* Set nDestTruncate to the final number of pages in the destination + ** database. The complication here is that the destination page + ** size may be different to the source page size. + ** + ** If the source page size is smaller than the destination page size, + ** round up. In this case the call to sqlite3OsTruncate() below will + ** fix the size of the file. However it is important to call + ** sqlite3PagerTruncateImage() here so that any pages in the + ** destination file that lie beyond the nDestTruncate page mark are + ** journalled by PagerCommitPhaseOne() before they are destroyed + ** by the file truncation. + */ + assert( pgszSrc==sqlite3BtreeGetPageSize(p->pSrc) ); + assert( pgszDest==sqlite3BtreeGetPageSize(p->pDest) ); + if( pgszSrcpDest->pBt) ){ + nDestTruncate--; + } + }else{ + nDestTruncate = nSrcPage * (pgszSrc/pgszDest); + } + assert( nDestTruncate>0 ); + + if( pgszSrc= iSize || ( + nDestTruncate==(int)(PENDING_BYTE_PAGE(p->pDest->pBt)-1) + && iSize>=PENDING_BYTE && iSize<=PENDING_BYTE+pgszDest + )); + + /* This block ensures that all data required to recreate the original + ** database has been stored in the journal for pDestPager and the + ** journal synced to disk. So at this point we may safely modify + ** the database file in any way, knowing that if a power failure + ** occurs, the original database will be reconstructed from the + ** journal file. */ + sqlite3PagerPagecount(pDestPager, &nDstPage); + for(iPg=nDestTruncate; rc==SQLITE_OK && iPg<=(Pgno)nDstPage; iPg++){ + if( iPg!=PENDING_BYTE_PAGE(p->pDest->pBt) ){ + DbPage *pPg; + rc = sqlite3PagerGet(pDestPager, iPg, &pPg, 0); + if( rc==SQLITE_OK ){ + rc = sqlite3PagerWrite(pPg); + sqlite3PagerUnref(pPg); + } + } + } + if( rc==SQLITE_OK ){ + rc = sqlite3PagerCommitPhaseOne(pDestPager, 0, 1); + } + + /* Write the extra pages and truncate the database file as required */ + iEnd = MIN(PENDING_BYTE + pgszDest, iSize); + for( + iOff=PENDING_BYTE+pgszSrc; + rc==SQLITE_OK && iOffpDest, 0)) + ){ + rc = SQLITE_DONE; + } + } + } + + /* If bCloseTrans is true, then this function opened a read transaction + ** on the source database. Close the read transaction here. There is + ** no need to check the return values of the btree methods here, as + ** "committing" a read-only transaction cannot fail. + */ + if( bCloseTrans ){ + TESTONLY( int rc2 ); + TESTONLY( rc2 = ) sqlite3BtreeCommitPhaseOne(p->pSrc, 0); + TESTONLY( rc2 |= ) sqlite3BtreeCommitPhaseTwo(p->pSrc, 0); + assert( rc2==SQLITE_OK ); + } + + if( rc==SQLITE_IOERR_NOMEM ){ + rc = SQLITE_NOMEM_BKPT; + } + p->rc = rc; + } + if( p->pDestDb ){ + sqlite3_mutex_leave(p->pDestDb->mutex); + } + sqlite3BtreeLeave(p->pSrc); + sqlite3_mutex_leave(p->pSrcDb->mutex); + return rc; +} + +/* +** Release all resources associated with an sqlite3_backup* handle. +*/ +SQLITE_API int sqlite3_backup_finish(sqlite3_backup *p){ + sqlite3_backup **pp; /* Ptr to head of pagers backup list */ + sqlite3 *pSrcDb; /* Source database connection */ + int rc; /* Value to return */ + + /* Enter the mutexes */ + if( p==0 ) return SQLITE_OK; + pSrcDb = p->pSrcDb; + sqlite3_mutex_enter(pSrcDb->mutex); + sqlite3BtreeEnter(p->pSrc); + if( p->pDestDb ){ + sqlite3_mutex_enter(p->pDestDb->mutex); + } + + /* Detach this backup from the source pager. */ + if( p->pDestDb ){ + p->pSrc->nBackup--; + } + if( p->isAttached ){ + pp = sqlite3PagerBackupPtr(sqlite3BtreePager(p->pSrc)); + while( *pp!=p ){ + pp = &(*pp)->pNext; + } + *pp = p->pNext; + } + + /* If a transaction is still open on the Btree, roll it back. */ + sqlite3BtreeRollback(p->pDest, SQLITE_OK, 0); + + /* Set the error code of the destination database handle. */ + rc = (p->rc==SQLITE_DONE) ? SQLITE_OK : p->rc; + if( p->pDestDb ){ + sqlite3Error(p->pDestDb, rc); + + /* Exit the mutexes and free the backup context structure. */ + sqlite3LeaveMutexAndCloseZombie(p->pDestDb); + } + sqlite3BtreeLeave(p->pSrc); + if( p->pDestDb ){ + /* EVIDENCE-OF: R-64852-21591 The sqlite3_backup object is created by a + ** call to sqlite3_backup_init() and is destroyed by a call to + ** sqlite3_backup_finish(). */ + sqlite3_free(p); + } + sqlite3LeaveMutexAndCloseZombie(pSrcDb); + return rc; +} + +/* +** Return the number of pages still to be backed up as of the most recent +** call to sqlite3_backup_step(). +*/ +SQLITE_API int sqlite3_backup_remaining(sqlite3_backup *p){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( p==0 ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + return p->nRemaining; +} + +/* +** Return the total number of pages in the source database as of the most +** recent call to sqlite3_backup_step(). +*/ +SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( p==0 ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + return p->nPagecount; +} + +/* +** This function is called after the contents of page iPage of the +** source database have been modified. If page iPage has already been +** copied into the destination database, then the data written to the +** destination is now invalidated. The destination copy of iPage needs +** to be updated with the new data before the backup operation is +** complete. +** +** It is assumed that the mutex associated with the BtShared object +** corresponding to the source database is held when this function is +** called. +*/ +static SQLITE_NOINLINE void backupUpdate( + sqlite3_backup *p, + Pgno iPage, + const u8 *aData +){ + assert( p!=0 ); + do{ + assert( sqlite3_mutex_held(p->pSrc->pBt->mutex) ); + if( !isFatalError(p->rc) && iPageiNext ){ + /* The backup process p has already copied page iPage. But now it + ** has been modified by a transaction on the source pager. Copy + ** the new data into the backup. + */ + int rc; + assert( p->pDestDb ); + sqlite3_mutex_enter(p->pDestDb->mutex); + rc = backupOnePage(p, iPage, aData, 1); + sqlite3_mutex_leave(p->pDestDb->mutex); + assert( rc!=SQLITE_BUSY && rc!=SQLITE_LOCKED ); + if( rc!=SQLITE_OK ){ + p->rc = rc; + } + } + }while( (p = p->pNext)!=0 ); +} +SQLITE_PRIVATE void sqlite3BackupUpdate(sqlite3_backup *pBackup, Pgno iPage, const u8 *aData){ + if( pBackup ) backupUpdate(pBackup, iPage, aData); +} + +/* +** Restart the backup process. This is called when the pager layer +** detects that the database has been modified by an external database +** connection. In this case there is no way of knowing which of the +** pages that have been copied into the destination database are still +** valid and which are not, so the entire process needs to be restarted. +** +** It is assumed that the mutex associated with the BtShared object +** corresponding to the source database is held when this function is +** called. +*/ +SQLITE_PRIVATE void sqlite3BackupRestart(sqlite3_backup *pBackup){ + sqlite3_backup *p; /* Iterator variable */ + for(p=pBackup; p; p=p->pNext){ + assert( sqlite3_mutex_held(p->pSrc->pBt->mutex) ); + p->iNext = 1; + } +} + +#ifndef SQLITE_OMIT_VACUUM +/* +** Copy the complete content of pBtFrom into pBtTo. A transaction +** must be active for both files. +** +** The size of file pTo may be reduced by this operation. If anything +** goes wrong, the transaction on pTo is rolled back. If successful, the +** transaction is committed before returning. +*/ +SQLITE_PRIVATE int sqlite3BtreeCopyFile(Btree *pTo, Btree *pFrom){ + int rc; + sqlite3_file *pFd; /* File descriptor for database pTo */ + sqlite3_backup b; + sqlite3BtreeEnter(pTo); + sqlite3BtreeEnter(pFrom); + + assert( sqlite3BtreeIsInTrans(pTo) ); + pFd = sqlite3PagerFile(sqlite3BtreePager(pTo)); + if( pFd->pMethods ){ + i64 nByte = sqlite3BtreeGetPageSize(pFrom)*(i64)sqlite3BtreeLastPage(pFrom); + rc = sqlite3OsFileControl(pFd, SQLITE_FCNTL_OVERWRITE, &nByte); + if( rc==SQLITE_NOTFOUND ) rc = SQLITE_OK; + if( rc ) goto copy_finished; + } + + /* Set up an sqlite3_backup object. sqlite3_backup.pDestDb must be set + ** to 0. This is used by the implementations of sqlite3_backup_step() + ** and sqlite3_backup_finish() to detect that they are being called + ** from this function, not directly by the user. + */ + memset(&b, 0, sizeof(b)); + b.pSrcDb = pFrom->db; + b.pSrc = pFrom; + b.pDest = pTo; + b.iNext = 1; + +#ifdef SQLITE_HAS_CODEC + sqlite3PagerAlignReserve(sqlite3BtreePager(pTo), sqlite3BtreePager(pFrom)); +#endif + + /* 0x7FFFFFFF is the hard limit for the number of pages in a database + ** file. By passing this as the number of pages to copy to + ** sqlite3_backup_step(), we can guarantee that the copy finishes + ** within a single call (unless an error occurs). The assert() statement + ** checks this assumption - (p->rc) should be set to either SQLITE_DONE + ** or an error code. */ + sqlite3_backup_step(&b, 0x7FFFFFFF); + assert( b.rc!=SQLITE_OK ); + + rc = sqlite3_backup_finish(&b); + if( rc==SQLITE_OK ){ + pTo->pBt->btsFlags &= ~BTS_PAGESIZE_FIXED; + }else{ + sqlite3PagerClearCache(sqlite3BtreePager(b.pDest)); + } + + assert( sqlite3BtreeIsInTrans(pTo)==0 ); +copy_finished: + sqlite3BtreeLeave(pFrom); + sqlite3BtreeLeave(pTo); + return rc; +} +#endif /* SQLITE_OMIT_VACUUM */ + +/************** End of backup.c **********************************************/ +/************** Begin file vdbemem.c *****************************************/ +/* +** 2004 May 26 +** +** 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 use to manipulate "Mem" structure. A "Mem" +** 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 +*/ +/* #include "sqliteInt.h" */ +/* #include "vdbeInt.h" */ + +#ifdef SQLITE_DEBUG +/* +** Check invariants on a Mem object. +** +** This routine is intended for use inside of assert() statements, like +** this: assert( sqlite3VdbeCheckMemInvariants(pMem) ); +*/ +SQLITE_PRIVATE int sqlite3VdbeCheckMemInvariants(Mem *p){ + /* If MEM_Dyn is set then Mem.xDel!=0. + ** Mem.xDel is might not be initialized if MEM_Dyn is clear. + */ + assert( (p->flags & MEM_Dyn)==0 || p->xDel!=0 ); + + /* MEM_Dyn may only be set if Mem.szMalloc==0. In this way we + ** ensure that if Mem.szMalloc>0 then it is safe to do + ** Mem.z = Mem.zMalloc without having to check Mem.flags&MEM_Dyn. + ** That saves a few cycles in inner loops. */ + assert( (p->flags & MEM_Dyn)==0 || p->szMalloc==0 ); + + /* Cannot be both MEM_Int and MEM_Real at the same time */ + assert( (p->flags & (MEM_Int|MEM_Real))!=(MEM_Int|MEM_Real) ); + + /* The szMalloc field holds the correct memory allocation size */ + assert( p->szMalloc==0 + || p->szMalloc==sqlite3DbMallocSize(p->db,p->zMalloc) ); + + /* If p holds a string or blob, the Mem.z must point to exactly + ** one of the following: + ** + ** (1) Memory in Mem.zMalloc and managed by the Mem object + ** (2) Memory to be freed using Mem.xDel + ** (3) An ephemeral string or blob + ** (4) A static string or blob + */ + if( (p->flags & (MEM_Str|MEM_Blob)) && p->n>0 ){ + assert( + ((p->szMalloc>0 && p->z==p->zMalloc)? 1 : 0) + + ((p->flags&MEM_Dyn)!=0 ? 1 : 0) + + ((p->flags&MEM_Ephem)!=0 ? 1 : 0) + + ((p->flags&MEM_Static)!=0 ? 1 : 0) == 1 + ); + } + return 1; +} +#endif + + +/* +** If pMem is an object with a valid string representation, this routine +** ensures the internal encoding for the string representation is +** 'desiredEnc', one of SQLITE_UTF8, SQLITE_UTF16LE or SQLITE_UTF16BE. +** +** If pMem is not a string object, or the encoding of the string +** representation is already stored using the requested encoding, then this +** routine is a no-op. +** +** SQLITE_OK is returned if the conversion is successful (or not required). +** SQLITE_NOMEM may be returned if a malloc() fails during conversion +** between formats. +*/ +SQLITE_PRIVATE int sqlite3VdbeChangeEncoding(Mem *pMem, int desiredEnc){ +#ifndef SQLITE_OMIT_UTF16 + int rc; +#endif + assert( (pMem->flags&MEM_RowSet)==0 ); + assert( desiredEnc==SQLITE_UTF8 || desiredEnc==SQLITE_UTF16LE + || desiredEnc==SQLITE_UTF16BE ); + if( !(pMem->flags&MEM_Str) || pMem->enc==desiredEnc ){ + return SQLITE_OK; + } + assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); +#ifdef SQLITE_OMIT_UTF16 + return SQLITE_ERROR; +#else + + /* MemTranslate() may return SQLITE_OK or SQLITE_NOMEM. If NOMEM is returned, + ** then the encoding of the value may not have changed. + */ + rc = sqlite3VdbeMemTranslate(pMem, (u8)desiredEnc); + assert(rc==SQLITE_OK || rc==SQLITE_NOMEM); + assert(rc==SQLITE_OK || pMem->enc!=desiredEnc); + assert(rc==SQLITE_NOMEM || pMem->enc==desiredEnc); + return rc; +#endif +} + +/* +** Make sure pMem->z points to a writable allocation of at least +** min(n,32) bytes. +** +** If the bPreserve argument is true, then copy of the content of +** pMem->z into the new allocation. pMem must be either a string or +** blob if bPreserve is true. If bPreserve is false, any prior content +** in pMem->z is discarded. +*/ +SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3VdbeMemGrow(Mem *pMem, int n, int bPreserve){ + assert( sqlite3VdbeCheckMemInvariants(pMem) ); + assert( (pMem->flags&MEM_RowSet)==0 ); + testcase( pMem->db==0 ); + + /* If the bPreserve flag is set to true, then the memory cell must already + ** contain a valid string or blob value. */ + assert( bPreserve==0 || pMem->flags&(MEM_Blob|MEM_Str) ); + testcase( bPreserve && pMem->z==0 ); + + assert( pMem->szMalloc==0 + || pMem->szMalloc==sqlite3DbMallocSize(pMem->db, pMem->zMalloc) ); + if( pMem->szMallocszMalloc>0 && pMem->z==pMem->zMalloc ){ + pMem->z = pMem->zMalloc = sqlite3DbReallocOrFree(pMem->db, pMem->z, n); + bPreserve = 0; + }else{ + if( pMem->szMalloc>0 ) sqlite3DbFree(pMem->db, pMem->zMalloc); + pMem->zMalloc = sqlite3DbMallocRaw(pMem->db, n); + } + if( pMem->zMalloc==0 ){ + sqlite3VdbeMemSetNull(pMem); + pMem->z = 0; + pMem->szMalloc = 0; + return SQLITE_NOMEM_BKPT; + }else{ + pMem->szMalloc = sqlite3DbMallocSize(pMem->db, pMem->zMalloc); + } + } + + if( bPreserve && pMem->z && pMem->z!=pMem->zMalloc ){ + memcpy(pMem->zMalloc, pMem->z, pMem->n); + } + if( (pMem->flags&MEM_Dyn)!=0 ){ + assert( pMem->xDel!=0 && pMem->xDel!=SQLITE_DYNAMIC ); + pMem->xDel((void *)(pMem->z)); + } + + pMem->z = pMem->zMalloc; + pMem->flags &= ~(MEM_Dyn|MEM_Ephem|MEM_Static); + return SQLITE_OK; +} + +/* +** Change the pMem->zMalloc allocation to be at least szNew bytes. +** If pMem->zMalloc already meets or exceeds the requested size, this +** routine is a no-op. +** +** Any prior string or blob content in the pMem object may be discarded. +** The pMem->xDel destructor is called, if it exists. Though MEM_Str +** and MEM_Blob values may be discarded, MEM_Int, MEM_Real, and MEM_Null +** values are preserved. +** +** Return SQLITE_OK on success or an error code (probably SQLITE_NOMEM) +** if unable to complete the resizing. +*/ +SQLITE_PRIVATE int sqlite3VdbeMemClearAndResize(Mem *pMem, int szNew){ + assert( szNew>0 ); + assert( (pMem->flags & MEM_Dyn)==0 || pMem->szMalloc==0 ); + if( pMem->szMallocflags & MEM_Dyn)==0 ); + pMem->z = pMem->zMalloc; + pMem->flags &= (MEM_Null|MEM_Int|MEM_Real); + return SQLITE_OK; +} + +/* +** Change pMem so that its MEM_Str or MEM_Blob value is stored in +** MEM.zMalloc, where it can be safely written. +** +** Return SQLITE_OK on success or SQLITE_NOMEM if malloc fails. +*/ +SQLITE_PRIVATE int sqlite3VdbeMemMakeWriteable(Mem *pMem){ + assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); + assert( (pMem->flags&MEM_RowSet)==0 ); + if( (pMem->flags & (MEM_Str|MEM_Blob))!=0 ){ + if( ExpandBlob(pMem) ) return SQLITE_NOMEM; + if( pMem->szMalloc==0 || pMem->z!=pMem->zMalloc ){ + if( sqlite3VdbeMemGrow(pMem, pMem->n + 2, 1) ){ + return SQLITE_NOMEM_BKPT; + } + pMem->z[pMem->n] = 0; + pMem->z[pMem->n+1] = 0; + pMem->flags |= MEM_Term; + } + } + pMem->flags &= ~MEM_Ephem; +#ifdef SQLITE_DEBUG + pMem->pScopyFrom = 0; +#endif + + return SQLITE_OK; +} + +/* +** If the given Mem* has a zero-filled tail, turn it into an ordinary +** blob stored in dynamically allocated space. +*/ +#ifndef SQLITE_OMIT_INCRBLOB +SQLITE_PRIVATE int sqlite3VdbeMemExpandBlob(Mem *pMem){ + int nByte; + assert( pMem->flags & MEM_Zero ); + assert( pMem->flags&MEM_Blob ); + assert( (pMem->flags&MEM_RowSet)==0 ); + assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); + + /* Set nByte to the number of bytes required to store the expanded blob. */ + nByte = pMem->n + pMem->u.nZero; + if( nByte<=0 ){ + nByte = 1; + } + if( sqlite3VdbeMemGrow(pMem, nByte, 1) ){ + return SQLITE_NOMEM_BKPT; + } + + memset(&pMem->z[pMem->n], 0, pMem->u.nZero); + pMem->n += pMem->u.nZero; + pMem->flags &= ~(MEM_Zero|MEM_Term); + return SQLITE_OK; +} +#endif + +/* +** It is already known that pMem contains an unterminated string. +** Add the zero terminator. +*/ +static SQLITE_NOINLINE int vdbeMemAddTerminator(Mem *pMem){ + if( sqlite3VdbeMemGrow(pMem, pMem->n+2, 1) ){ + return SQLITE_NOMEM_BKPT; + } + pMem->z[pMem->n] = 0; + pMem->z[pMem->n+1] = 0; + pMem->flags |= MEM_Term; + return SQLITE_OK; +} + +/* +** Make sure the given Mem is \u0000 terminated. +*/ +SQLITE_PRIVATE int sqlite3VdbeMemNulTerminate(Mem *pMem){ + assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); + testcase( (pMem->flags & (MEM_Term|MEM_Str))==(MEM_Term|MEM_Str) ); + testcase( (pMem->flags & (MEM_Term|MEM_Str))==0 ); + if( (pMem->flags & (MEM_Term|MEM_Str))!=MEM_Str ){ + return SQLITE_OK; /* Nothing to do */ + }else{ + return vdbeMemAddTerminator(pMem); + } +} + +/* +** Add MEM_Str to the set of representations for the given Mem. Numbers +** are converted using sqlite3_snprintf(). Converting a BLOB to a string +** is a no-op. +** +** Existing representations MEM_Int and MEM_Real are invalidated if +** bForce is true but are retained if bForce is false. +** +** A MEM_Null value will never be passed to this function. This function is +** used for converting values to text for returning to the user (i.e. via +** sqlite3_value_text()), or for ensuring that values to be used as btree +** keys are strings. In the former case a NULL pointer is returned the +** user and the latter is an internal programming error. +*/ +SQLITE_PRIVATE int sqlite3VdbeMemStringify(Mem *pMem, u8 enc, u8 bForce){ + int fg = pMem->flags; + const int nByte = 32; + + assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); + assert( !(fg&MEM_Zero) ); + assert( !(fg&(MEM_Str|MEM_Blob)) ); + assert( fg&(MEM_Int|MEM_Real) ); + assert( (pMem->flags&MEM_RowSet)==0 ); + assert( EIGHT_BYTE_ALIGNMENT(pMem) ); + + + if( sqlite3VdbeMemClearAndResize(pMem, nByte) ){ + pMem->enc = 0; + return SQLITE_NOMEM_BKPT; + } + + /* For a Real or Integer, use sqlite3_snprintf() to produce the UTF-8 + ** string representation of the value. Then, if the required encoding + ** is UTF-16le or UTF-16be do a translation. + ** + ** FIX ME: It would be better if sqlite3_snprintf() could do UTF-16. + */ + if( fg & MEM_Int ){ + sqlite3_snprintf(nByte, pMem->z, "%lld", pMem->u.i); + }else{ + assert( fg & MEM_Real ); + sqlite3_snprintf(nByte, pMem->z, "%!.15g", pMem->u.r); + } + pMem->n = sqlite3Strlen30(pMem->z); + pMem->enc = SQLITE_UTF8; + pMem->flags |= MEM_Str|MEM_Term; + if( bForce ) pMem->flags &= ~(MEM_Int|MEM_Real); + sqlite3VdbeChangeEncoding(pMem, enc); + return SQLITE_OK; +} + +/* +** Memory cell pMem contains the context of an aggregate function. +** This routine calls the finalize method for that function. The +** result of the aggregate is stored back into pMem. +** +** Return SQLITE_ERROR if the finalizer reports an error. SQLITE_OK +** otherwise. +*/ +SQLITE_PRIVATE int sqlite3VdbeMemFinalize(Mem *pMem, FuncDef *pFunc){ + int rc = SQLITE_OK; + if( ALWAYS(pFunc && pFunc->xFinalize) ){ + sqlite3_context ctx; + Mem t; + assert( (pMem->flags & MEM_Null)!=0 || pFunc==pMem->u.pDef ); + assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); + memset(&ctx, 0, sizeof(ctx)); + memset(&t, 0, sizeof(t)); + t.flags = MEM_Null; + t.db = pMem->db; + ctx.pOut = &t; + ctx.pMem = pMem; + ctx.pFunc = pFunc; + pFunc->xFinalize(&ctx); /* IMP: R-24505-23230 */ + assert( (pMem->flags & MEM_Dyn)==0 ); + if( pMem->szMalloc>0 ) sqlite3DbFree(pMem->db, pMem->zMalloc); + memcpy(pMem, &t, sizeof(t)); + rc = ctx.isError; + } + return rc; +} + +/* +** If the memory cell contains a value that must be freed by +** invoking the external callback in Mem.xDel, then this routine +** will free that value. It also sets Mem.flags to MEM_Null. +** +** This is a helper routine for sqlite3VdbeMemSetNull() and +** for sqlite3VdbeMemRelease(). Use those other routines as the +** entry point for releasing Mem resources. +*/ +static SQLITE_NOINLINE void vdbeMemClearExternAndSetNull(Mem *p){ + assert( p->db==0 || sqlite3_mutex_held(p->db->mutex) ); + assert( VdbeMemDynamic(p) ); + if( p->flags&MEM_Agg ){ + sqlite3VdbeMemFinalize(p, p->u.pDef); + assert( (p->flags & MEM_Agg)==0 ); + testcase( p->flags & MEM_Dyn ); + } + if( p->flags&MEM_Dyn ){ + assert( (p->flags&MEM_RowSet)==0 ); + assert( p->xDel!=SQLITE_DYNAMIC && p->xDel!=0 ); + p->xDel((void *)p->z); + }else if( p->flags&MEM_RowSet ){ + sqlite3RowSetClear(p->u.pRowSet); + }else if( p->flags&MEM_Frame ){ + VdbeFrame *pFrame = p->u.pFrame; + pFrame->pParent = pFrame->v->pDelFrame; + pFrame->v->pDelFrame = pFrame; + } + p->flags = MEM_Null; +} + +/* +** Release memory held by the Mem p, both external memory cleared +** by p->xDel and memory in p->zMalloc. +** +** This is a helper routine invoked by sqlite3VdbeMemRelease() in +** the unusual case where there really is memory in p that needs +** to be freed. +*/ +static SQLITE_NOINLINE void vdbeMemClear(Mem *p){ + if( VdbeMemDynamic(p) ){ + vdbeMemClearExternAndSetNull(p); + } + if( p->szMalloc ){ + sqlite3DbFree(p->db, p->zMalloc); + p->szMalloc = 0; + } + p->z = 0; +} + +/* +** Release any memory resources held by the Mem. Both the memory that is +** free by Mem.xDel and the Mem.zMalloc allocation are freed. +** +** Use this routine prior to clean up prior to abandoning a Mem, or to +** reset a Mem back to its minimum memory utilization. +** +** Use sqlite3VdbeMemSetNull() to release just the Mem.xDel space +** prior to inserting new content into the Mem. +*/ +SQLITE_PRIVATE void sqlite3VdbeMemRelease(Mem *p){ + assert( sqlite3VdbeCheckMemInvariants(p) ); + if( VdbeMemDynamic(p) || p->szMalloc ){ + vdbeMemClear(p); + } +} + +/* +** Convert a 64-bit IEEE double into a 64-bit signed integer. +** If the double is out of range of a 64-bit signed integer then +** return the closest available 64-bit signed integer. +*/ +static i64 doubleToInt64(double r){ +#ifdef SQLITE_OMIT_FLOATING_POINT + /* When floating-point is omitted, double and int64 are the same thing */ + return r; +#else + /* + ** Many compilers we encounter do not define constants for the + ** minimum and maximum 64-bit integers, or they define them + ** inconsistently. And many do not understand the "LL" notation. + ** So we define our own static constants here using nothing + ** larger than a 32-bit integer constant. + */ + static const i64 maxInt = LARGEST_INT64; + static const i64 minInt = SMALLEST_INT64; + + if( r<=(double)minInt ){ + return minInt; + }else if( r>=(double)maxInt ){ + return maxInt; + }else{ + return (i64)r; + } +#endif +} + +/* +** Return some kind of integer value which is the best we can do +** at representing the value that *pMem describes as an integer. +** If pMem is an integer, then the value is exact. If pMem is +** a floating-point then the value returned is the integer part. +** If pMem is a string or blob, then we make an attempt to convert +** it into an integer and return that. If pMem represents an +** an SQL-NULL value, return 0. +** +** If pMem represents a string value, its encoding might be changed. +*/ +SQLITE_PRIVATE i64 sqlite3VdbeIntValue(Mem *pMem){ + int flags; + assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); + assert( EIGHT_BYTE_ALIGNMENT(pMem) ); + flags = pMem->flags; + if( flags & MEM_Int ){ + return pMem->u.i; + }else if( flags & MEM_Real ){ + return doubleToInt64(pMem->u.r); + }else if( flags & (MEM_Str|MEM_Blob) ){ + i64 value = 0; + assert( pMem->z || pMem->n==0 ); + sqlite3Atoi64(pMem->z, &value, pMem->n, pMem->enc); + return value; + }else{ + return 0; + } +} + +/* +** Return the best representation of pMem that we can get into a +** double. If pMem is already a double or an integer, return its +** value. If it is a string or blob, try to convert it to a double. +** If it is a NULL, return 0.0. +*/ +SQLITE_PRIVATE double sqlite3VdbeRealValue(Mem *pMem){ + assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); + assert( EIGHT_BYTE_ALIGNMENT(pMem) ); + if( pMem->flags & MEM_Real ){ + return pMem->u.r; + }else if( pMem->flags & MEM_Int ){ + return (double)pMem->u.i; + }else if( pMem->flags & (MEM_Str|MEM_Blob) ){ + /* (double)0 In case of SQLITE_OMIT_FLOATING_POINT... */ + double val = (double)0; + sqlite3AtoF(pMem->z, &val, pMem->n, pMem->enc); + return val; + }else{ + /* (double)0 In case of SQLITE_OMIT_FLOATING_POINT... */ + return (double)0; + } +} + +/* +** The MEM structure is already a MEM_Real. Try to also make it a +** MEM_Int if we can. +*/ +SQLITE_PRIVATE void sqlite3VdbeIntegerAffinity(Mem *pMem){ + i64 ix; + assert( pMem->flags & MEM_Real ); + assert( (pMem->flags & MEM_RowSet)==0 ); + assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); + assert( EIGHT_BYTE_ALIGNMENT(pMem) ); + + ix = doubleToInt64(pMem->u.r); + + /* Only mark the value as an integer if + ** + ** (1) the round-trip conversion real->int->real is a no-op, and + ** (2) The integer is neither the largest nor the smallest + ** possible integer (ticket #3922) + ** + ** The second and third terms in the following conditional enforces + ** the second condition under the assumption that addition overflow causes + ** values to wrap around. + */ + if( pMem->u.r==ix && ix>SMALLEST_INT64 && ixu.i = ix; + MemSetTypeFlag(pMem, MEM_Int); + } +} + +/* +** Convert pMem to type integer. Invalidate any prior representations. +*/ +SQLITE_PRIVATE int sqlite3VdbeMemIntegerify(Mem *pMem){ + assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); + assert( (pMem->flags & MEM_RowSet)==0 ); + assert( EIGHT_BYTE_ALIGNMENT(pMem) ); + + pMem->u.i = sqlite3VdbeIntValue(pMem); + MemSetTypeFlag(pMem, MEM_Int); + return SQLITE_OK; +} + +/* +** Convert pMem so that it is of type MEM_Real. +** Invalidate any prior representations. +*/ +SQLITE_PRIVATE int sqlite3VdbeMemRealify(Mem *pMem){ + assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); + assert( EIGHT_BYTE_ALIGNMENT(pMem) ); + + pMem->u.r = sqlite3VdbeRealValue(pMem); + MemSetTypeFlag(pMem, MEM_Real); + return SQLITE_OK; +} + +/* +** Convert pMem so that it has types MEM_Real or MEM_Int or both. +** Invalidate any prior representations. +** +** Every effort is made to force the conversion, even if the input +** is a string that does not look completely like a number. Convert +** as much of the string as we can and ignore the rest. +*/ +SQLITE_PRIVATE int sqlite3VdbeMemNumerify(Mem *pMem){ + if( (pMem->flags & (MEM_Int|MEM_Real|MEM_Null))==0 ){ + assert( (pMem->flags & (MEM_Blob|MEM_Str))!=0 ); + assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); + if( 0==sqlite3Atoi64(pMem->z, &pMem->u.i, pMem->n, pMem->enc) ){ + MemSetTypeFlag(pMem, MEM_Int); + }else{ + pMem->u.r = sqlite3VdbeRealValue(pMem); + MemSetTypeFlag(pMem, MEM_Real); + sqlite3VdbeIntegerAffinity(pMem); + } + } + assert( (pMem->flags & (MEM_Int|MEM_Real|MEM_Null))!=0 ); + pMem->flags &= ~(MEM_Str|MEM_Blob|MEM_Zero); + return SQLITE_OK; +} + +/* +** Cast the datatype of the value in pMem according to the affinity +** "aff". Casting is different from applying affinity in that a cast +** is forced. In other words, the value is converted into the desired +** affinity even if that results in loss of data. This routine is +** used (for example) to implement the SQL "cast()" operator. +*/ +SQLITE_PRIVATE void sqlite3VdbeMemCast(Mem *pMem, u8 aff, u8 encoding){ + if( pMem->flags & MEM_Null ) return; + switch( aff ){ + case SQLITE_AFF_BLOB: { /* Really a cast to BLOB */ + if( (pMem->flags & MEM_Blob)==0 ){ + sqlite3ValueApplyAffinity(pMem, SQLITE_AFF_TEXT, encoding); + assert( pMem->flags & MEM_Str || pMem->db->mallocFailed ); + if( pMem->flags & MEM_Str ) MemSetTypeFlag(pMem, MEM_Blob); + }else{ + pMem->flags &= ~(MEM_TypeMask&~MEM_Blob); + } + break; + } + case SQLITE_AFF_NUMERIC: { + sqlite3VdbeMemNumerify(pMem); + break; + } + case SQLITE_AFF_INTEGER: { + sqlite3VdbeMemIntegerify(pMem); + break; + } + case SQLITE_AFF_REAL: { + sqlite3VdbeMemRealify(pMem); + break; + } + default: { + assert( aff==SQLITE_AFF_TEXT ); + assert( MEM_Str==(MEM_Blob>>3) ); + pMem->flags |= (pMem->flags&MEM_Blob)>>3; + sqlite3ValueApplyAffinity(pMem, SQLITE_AFF_TEXT, encoding); + assert( pMem->flags & MEM_Str || pMem->db->mallocFailed ); + pMem->flags &= ~(MEM_Int|MEM_Real|MEM_Blob|MEM_Zero); + break; + } + } +} + +/* +** Initialize bulk memory to be a consistent Mem object. +** +** The minimum amount of initialization feasible is performed. +*/ +SQLITE_PRIVATE void sqlite3VdbeMemInit(Mem *pMem, sqlite3 *db, u16 flags){ + assert( (flags & ~MEM_TypeMask)==0 ); + pMem->flags = flags; + pMem->db = db; + pMem->szMalloc = 0; +} + + +/* +** Delete any previous value and set the value stored in *pMem to NULL. +** +** This routine calls the Mem.xDel destructor to dispose of values that +** require the destructor. But it preserves the Mem.zMalloc memory allocation. +** To free all resources, use sqlite3VdbeMemRelease(), which both calls this +** routine to invoke the destructor and deallocates Mem.zMalloc. +** +** Use this routine to reset the Mem prior to insert a new value. +** +** Use sqlite3VdbeMemRelease() to complete erase the Mem prior to abandoning it. +*/ +SQLITE_PRIVATE void sqlite3VdbeMemSetNull(Mem *pMem){ + if( VdbeMemDynamic(pMem) ){ + vdbeMemClearExternAndSetNull(pMem); + }else{ + pMem->flags = MEM_Null; + } +} +SQLITE_PRIVATE void sqlite3ValueSetNull(sqlite3_value *p){ + sqlite3VdbeMemSetNull((Mem*)p); +} + +/* +** Delete any previous value and set the value to be a BLOB of length +** n containing all zeros. +*/ +SQLITE_PRIVATE void sqlite3VdbeMemSetZeroBlob(Mem *pMem, int n){ + sqlite3VdbeMemRelease(pMem); + pMem->flags = MEM_Blob|MEM_Zero; + pMem->n = 0; + if( n<0 ) n = 0; + pMem->u.nZero = n; + pMem->enc = SQLITE_UTF8; + pMem->z = 0; +} + +/* +** The pMem is known to contain content that needs to be destroyed prior +** to a value change. So invoke the destructor, then set the value to +** a 64-bit integer. +*/ +static SQLITE_NOINLINE void vdbeReleaseAndSetInt64(Mem *pMem, i64 val){ + sqlite3VdbeMemSetNull(pMem); + pMem->u.i = val; + pMem->flags = MEM_Int; +} + +/* +** Delete any previous value and set the value stored in *pMem to val, +** manifest type INTEGER. +*/ +SQLITE_PRIVATE void sqlite3VdbeMemSetInt64(Mem *pMem, i64 val){ + if( VdbeMemDynamic(pMem) ){ + vdbeReleaseAndSetInt64(pMem, val); + }else{ + pMem->u.i = val; + pMem->flags = MEM_Int; + } +} + +#ifndef SQLITE_OMIT_FLOATING_POINT +/* +** Delete any previous value and set the value stored in *pMem to val, +** manifest type REAL. +*/ +SQLITE_PRIVATE void sqlite3VdbeMemSetDouble(Mem *pMem, double val){ + sqlite3VdbeMemSetNull(pMem); + if( !sqlite3IsNaN(val) ){ + pMem->u.r = val; + pMem->flags = MEM_Real; + } +} +#endif + +/* +** Delete any previous value and set the value of pMem to be an +** empty boolean index. +*/ +SQLITE_PRIVATE void sqlite3VdbeMemSetRowSet(Mem *pMem){ + sqlite3 *db = pMem->db; + assert( db!=0 ); + assert( (pMem->flags & MEM_RowSet)==0 ); + sqlite3VdbeMemRelease(pMem); + pMem->zMalloc = sqlite3DbMallocRawNN(db, 64); + if( db->mallocFailed ){ + pMem->flags = MEM_Null; + pMem->szMalloc = 0; + }else{ + assert( pMem->zMalloc ); + pMem->szMalloc = sqlite3DbMallocSize(db, pMem->zMalloc); + pMem->u.pRowSet = sqlite3RowSetInit(db, pMem->zMalloc, pMem->szMalloc); + assert( pMem->u.pRowSet!=0 ); + pMem->flags = MEM_RowSet; + } +} + +/* +** Return true if the Mem object contains a TEXT or BLOB that is +** too large - whose size exceeds SQLITE_MAX_LENGTH. +*/ +SQLITE_PRIVATE int sqlite3VdbeMemTooBig(Mem *p){ + assert( p->db!=0 ); + if( p->flags & (MEM_Str|MEM_Blob) ){ + int n = p->n; + if( p->flags & MEM_Zero ){ + n += p->u.nZero; + } + return n>p->db->aLimit[SQLITE_LIMIT_LENGTH]; + } + return 0; +} + +#ifdef SQLITE_DEBUG +/* +** This routine prepares a memory cell for modification by breaking +** its link to a shallow copy and by marking any current shallow +** copies of this cell as invalid. +** +** This is used for testing and debugging only - to make sure shallow +** copies are not misused. +*/ +SQLITE_PRIVATE void sqlite3VdbeMemAboutToChange(Vdbe *pVdbe, Mem *pMem){ + int i; + Mem *pX; + for(i=0, pX=pVdbe->aMem; inMem; i++, pX++){ + if( pX->pScopyFrom==pMem ){ + pX->flags |= MEM_Undefined; + pX->pScopyFrom = 0; + } + } + pMem->pScopyFrom = 0; +} +#endif /* SQLITE_DEBUG */ + + +/* +** Make an shallow copy of pFrom into pTo. Prior contents of +** pTo are freed. The pFrom->z field is not duplicated. If +** pFrom->z is used, then pTo->z points to the same thing as pFrom->z +** and flags gets srcType (either MEM_Ephem or MEM_Static). +*/ +static SQLITE_NOINLINE void vdbeClrCopy(Mem *pTo, const Mem *pFrom, int eType){ + vdbeMemClearExternAndSetNull(pTo); + assert( !VdbeMemDynamic(pTo) ); + sqlite3VdbeMemShallowCopy(pTo, pFrom, eType); +} +SQLITE_PRIVATE void sqlite3VdbeMemShallowCopy(Mem *pTo, const Mem *pFrom, int srcType){ + assert( (pFrom->flags & MEM_RowSet)==0 ); + assert( pTo->db==pFrom->db ); + if( VdbeMemDynamic(pTo) ){ vdbeClrCopy(pTo,pFrom,srcType); return; } + memcpy(pTo, pFrom, MEMCELLSIZE); + if( (pFrom->flags&MEM_Static)==0 ){ + pTo->flags &= ~(MEM_Dyn|MEM_Static|MEM_Ephem); + assert( srcType==MEM_Ephem || srcType==MEM_Static ); + pTo->flags |= srcType; + } +} + +/* +** Make a full copy of pFrom into pTo. Prior contents of pTo are +** freed before the copy is made. +*/ +SQLITE_PRIVATE int sqlite3VdbeMemCopy(Mem *pTo, const Mem *pFrom){ + int rc = SQLITE_OK; + + assert( (pFrom->flags & MEM_RowSet)==0 ); + if( VdbeMemDynamic(pTo) ) vdbeMemClearExternAndSetNull(pTo); + memcpy(pTo, pFrom, MEMCELLSIZE); + pTo->flags &= ~MEM_Dyn; + if( pTo->flags&(MEM_Str|MEM_Blob) ){ + if( 0==(pFrom->flags&MEM_Static) ){ + pTo->flags |= MEM_Ephem; + rc = sqlite3VdbeMemMakeWriteable(pTo); + } + } + + return rc; +} + +/* +** Transfer the contents of pFrom to pTo. Any existing value in pTo is +** freed. If pFrom contains ephemeral data, a copy is made. +** +** pFrom contains an SQL NULL when this routine returns. +*/ +SQLITE_PRIVATE void sqlite3VdbeMemMove(Mem *pTo, Mem *pFrom){ + assert( pFrom->db==0 || sqlite3_mutex_held(pFrom->db->mutex) ); + assert( pTo->db==0 || sqlite3_mutex_held(pTo->db->mutex) ); + assert( pFrom->db==0 || pTo->db==0 || pFrom->db==pTo->db ); + + sqlite3VdbeMemRelease(pTo); + memcpy(pTo, pFrom, sizeof(Mem)); + pFrom->flags = MEM_Null; + pFrom->szMalloc = 0; +} + +/* +** Change the value of a Mem to be a string or a BLOB. +** +** The memory management strategy depends on the value of the xDel +** parameter. If the value passed is SQLITE_TRANSIENT, then the +** string is copied into a (possibly existing) buffer managed by the +** Mem structure. Otherwise, any existing buffer is freed and the +** pointer copied. +** +** If the string is too large (if it exceeds the SQLITE_LIMIT_LENGTH +** size limit) then no memory allocation occurs. If the string can be +** stored without allocating memory, then it is. If a memory allocation +** is required to store the string, then value of pMem is unchanged. In +** either case, SQLITE_TOOBIG is returned. +*/ +SQLITE_PRIVATE int sqlite3VdbeMemSetStr( + Mem *pMem, /* Memory cell to set to string value */ + const char *z, /* String pointer */ + int n, /* Bytes in string, or negative */ + u8 enc, /* Encoding of z. 0 for BLOBs */ + void (*xDel)(void*) /* Destructor function */ +){ + int nByte = n; /* New value for pMem->n */ + int iLimit; /* Maximum allowed string or blob size */ + u16 flags = 0; /* New value for pMem->flags */ + + assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); + assert( (pMem->flags & MEM_RowSet)==0 ); + + /* If z is a NULL pointer, set pMem to contain an SQL NULL. */ + if( !z ){ + sqlite3VdbeMemSetNull(pMem); + return SQLITE_OK; + } + + if( pMem->db ){ + iLimit = pMem->db->aLimit[SQLITE_LIMIT_LENGTH]; + }else{ + iLimit = SQLITE_MAX_LENGTH; + } + flags = (enc==0?MEM_Blob:MEM_Str); + if( nByte<0 ){ + assert( enc!=0 ); + if( enc==SQLITE_UTF8 ){ + nByte = sqlite3Strlen30(z); + if( nByte>iLimit ) nByte = iLimit+1; + }else{ + for(nByte=0; nByte<=iLimit && (z[nByte] | z[nByte+1]); nByte+=2){} + } + flags |= MEM_Term; + } + + /* The following block sets the new values of Mem.z and Mem.xDel. It + ** also sets a flag in local variable "flags" to indicate the memory + ** management (one of MEM_Dyn or MEM_Static). + */ + if( xDel==SQLITE_TRANSIENT ){ + int nAlloc = nByte; + if( flags&MEM_Term ){ + nAlloc += (enc==SQLITE_UTF8?1:2); + } + if( nByte>iLimit ){ + return SQLITE_TOOBIG; + } + testcase( nAlloc==0 ); + testcase( nAlloc==31 ); + testcase( nAlloc==32 ); + if( sqlite3VdbeMemClearAndResize(pMem, MAX(nAlloc,32)) ){ + return SQLITE_NOMEM_BKPT; + } + memcpy(pMem->z, z, nAlloc); + }else if( xDel==SQLITE_DYNAMIC ){ + sqlite3VdbeMemRelease(pMem); + pMem->zMalloc = pMem->z = (char *)z; + pMem->szMalloc = sqlite3DbMallocSize(pMem->db, pMem->zMalloc); + }else{ + sqlite3VdbeMemRelease(pMem); + pMem->z = (char *)z; + pMem->xDel = xDel; + flags |= ((xDel==SQLITE_STATIC)?MEM_Static:MEM_Dyn); + } + + pMem->n = nByte; + pMem->flags = flags; + pMem->enc = (enc==0 ? SQLITE_UTF8 : enc); + +#ifndef SQLITE_OMIT_UTF16 + if( pMem->enc!=SQLITE_UTF8 && sqlite3VdbeMemHandleBom(pMem) ){ + return SQLITE_NOMEM_BKPT; + } +#endif + + if( nByte>iLimit ){ + return SQLITE_TOOBIG; + } + + return SQLITE_OK; +} + +/* +** Move data out of a btree key or data field and into a Mem structure. +** The data or key is taken from the entry that pCur is currently pointing +** to. offset and amt determine what portion of the data or key to retrieve. +** key is true to get the key or false to get data. The result is written +** into the pMem element. +** +** The pMem object must have been initialized. This routine will use +** pMem->zMalloc to hold the content from the btree, if possible. New +** pMem->zMalloc space will be allocated if necessary. The calling routine +** is responsible for making sure that the pMem object is eventually +** destroyed. +** +** If this routine fails for any reason (malloc returns NULL or unable +** to read from the disk) then the pMem is left in an inconsistent state. +*/ +static SQLITE_NOINLINE int vdbeMemFromBtreeResize( + BtCursor *pCur, /* Cursor pointing at record to retrieve. */ + u32 offset, /* Offset from the start of data to return bytes from. */ + u32 amt, /* Number of bytes to return. */ + int key, /* If true, retrieve from the btree key, not data. */ + Mem *pMem /* OUT: Return data in this Mem structure. */ +){ + int rc; + pMem->flags = MEM_Null; + if( SQLITE_OK==(rc = sqlite3VdbeMemClearAndResize(pMem, amt+2)) ){ + if( key ){ + rc = sqlite3BtreeKey(pCur, offset, amt, pMem->z); + }else{ + rc = sqlite3BtreeData(pCur, offset, amt, pMem->z); + } + if( rc==SQLITE_OK ){ + pMem->z[amt] = 0; + pMem->z[amt+1] = 0; + pMem->flags = MEM_Blob|MEM_Term; + pMem->n = (int)amt; + }else{ + sqlite3VdbeMemRelease(pMem); + } + } + return rc; +} +SQLITE_PRIVATE int sqlite3VdbeMemFromBtree( + BtCursor *pCur, /* Cursor pointing at record to retrieve. */ + u32 offset, /* Offset from the start of data to return bytes from. */ + u32 amt, /* Number of bytes to return. */ + int key, /* If true, retrieve from the btree key, not data. */ + Mem *pMem /* OUT: Return data in this Mem structure. */ +){ + char *zData; /* Data from the btree layer */ + u32 available = 0; /* Number of bytes available on the local btree page */ + int rc = SQLITE_OK; /* Return code */ + + assert( sqlite3BtreeCursorIsValid(pCur) ); + assert( !VdbeMemDynamic(pMem) ); + + /* Note: the calls to BtreeKeyFetch() and DataFetch() below assert() + ** that both the BtShared and database handle mutexes are held. */ + assert( (pMem->flags & MEM_RowSet)==0 ); + zData = (char *)sqlite3BtreePayloadFetch(pCur, &available); + assert( zData!=0 ); + + if( offset+amt<=available ){ + pMem->z = &zData[offset]; + pMem->flags = MEM_Blob|MEM_Ephem; + pMem->n = (int)amt; + }else{ + rc = vdbeMemFromBtreeResize(pCur, offset, amt, key, pMem); + } + + return rc; +} + +/* +** The pVal argument is known to be a value other than NULL. +** Convert it into a string with encoding enc and return a pointer +** to a zero-terminated version of that string. +*/ +static SQLITE_NOINLINE const void *valueToText(sqlite3_value* pVal, u8 enc){ + assert( pVal!=0 ); + assert( pVal->db==0 || sqlite3_mutex_held(pVal->db->mutex) ); + assert( (enc&3)==(enc&~SQLITE_UTF16_ALIGNED) ); + assert( (pVal->flags & MEM_RowSet)==0 ); + assert( (pVal->flags & (MEM_Null))==0 ); + if( pVal->flags & (MEM_Blob|MEM_Str) ){ + pVal->flags |= MEM_Str; + if( pVal->enc != (enc & ~SQLITE_UTF16_ALIGNED) ){ + sqlite3VdbeChangeEncoding(pVal, enc & ~SQLITE_UTF16_ALIGNED); + } + if( (enc & SQLITE_UTF16_ALIGNED)!=0 && 1==(1&SQLITE_PTR_TO_INT(pVal->z)) ){ + assert( (pVal->flags & (MEM_Ephem|MEM_Static))!=0 ); + if( sqlite3VdbeMemMakeWriteable(pVal)!=SQLITE_OK ){ + return 0; + } + } + sqlite3VdbeMemNulTerminate(pVal); /* IMP: R-31275-44060 */ + }else{ + sqlite3VdbeMemStringify(pVal, enc, 0); + assert( 0==(1&SQLITE_PTR_TO_INT(pVal->z)) ); + } + assert(pVal->enc==(enc & ~SQLITE_UTF16_ALIGNED) || pVal->db==0 + || pVal->db->mallocFailed ); + if( pVal->enc==(enc & ~SQLITE_UTF16_ALIGNED) ){ + return pVal->z; + }else{ + return 0; + } +} + +/* This function is only available internally, it is not part of the +** external API. It works in a similar way to sqlite3_value_text(), +** except the data returned is in the encoding specified by the second +** parameter, which must be one of SQLITE_UTF16BE, SQLITE_UTF16LE or +** SQLITE_UTF8. +** +** (2006-02-16:) The enc value can be or-ed with SQLITE_UTF16_ALIGNED. +** If that is the case, then the result must be aligned on an even byte +** boundary. +*/ +SQLITE_PRIVATE const void *sqlite3ValueText(sqlite3_value* pVal, u8 enc){ + if( !pVal ) return 0; + assert( pVal->db==0 || sqlite3_mutex_held(pVal->db->mutex) ); + assert( (enc&3)==(enc&~SQLITE_UTF16_ALIGNED) ); + assert( (pVal->flags & MEM_RowSet)==0 ); + if( (pVal->flags&(MEM_Str|MEM_Term))==(MEM_Str|MEM_Term) && pVal->enc==enc ){ + return pVal->z; + } + if( pVal->flags&MEM_Null ){ + return 0; + } + return valueToText(pVal, enc); +} + +/* +** Create a new sqlite3_value object. +*/ +SQLITE_PRIVATE sqlite3_value *sqlite3ValueNew(sqlite3 *db){ + Mem *p = sqlite3DbMallocZero(db, sizeof(*p)); + if( p ){ + p->flags = MEM_Null; + p->db = db; + } + return p; +} + +/* +** Context object passed by sqlite3Stat4ProbeSetValue() through to +** valueNew(). See comments above valueNew() for details. +*/ +struct ValueNewStat4Ctx { + Parse *pParse; + Index *pIdx; + UnpackedRecord **ppRec; + int iVal; +}; + +/* +** Allocate and return a pointer to a new sqlite3_value object. If +** the second argument to this function is NULL, the object is allocated +** by calling sqlite3ValueNew(). +** +** Otherwise, if the second argument is non-zero, then this function is +** being called indirectly by sqlite3Stat4ProbeSetValue(). If it has not +** already been allocated, allocate the UnpackedRecord structure that +** that function will return to its caller here. Then return a pointer to +** an sqlite3_value within the UnpackedRecord.a[] array. +*/ +static sqlite3_value *valueNew(sqlite3 *db, struct ValueNewStat4Ctx *p){ +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 + if( p ){ + UnpackedRecord *pRec = p->ppRec[0]; + + if( pRec==0 ){ + Index *pIdx = p->pIdx; /* Index being probed */ + int nByte; /* Bytes of space to allocate */ + int i; /* Counter variable */ + int nCol = pIdx->nColumn; /* Number of index columns including rowid */ + + nByte = sizeof(Mem) * nCol + ROUND8(sizeof(UnpackedRecord)); + pRec = (UnpackedRecord*)sqlite3DbMallocZero(db, nByte); + if( pRec ){ + pRec->pKeyInfo = sqlite3KeyInfoOfIndex(p->pParse, pIdx); + if( pRec->pKeyInfo ){ + assert( pRec->pKeyInfo->nField+pRec->pKeyInfo->nXField==nCol ); + assert( pRec->pKeyInfo->enc==ENC(db) ); + pRec->aMem = (Mem *)((u8*)pRec + ROUND8(sizeof(UnpackedRecord))); + for(i=0; iaMem[i].flags = MEM_Null; + pRec->aMem[i].db = db; + } + }else{ + sqlite3DbFree(db, pRec); + pRec = 0; + } + } + if( pRec==0 ) return 0; + p->ppRec[0] = pRec; + } + + pRec->nField = p->iVal+1; + return &pRec->aMem[p->iVal]; + } +#else + UNUSED_PARAMETER(p); +#endif /* defined(SQLITE_ENABLE_STAT3_OR_STAT4) */ + return sqlite3ValueNew(db); +} + +/* +** The expression object indicated by the second argument is guaranteed +** to be a scalar SQL function. If +** +** * all function arguments are SQL literals, +** * one of the SQLITE_FUNC_CONSTANT or _SLOCHNG function flags is set, and +** * the SQLITE_FUNC_NEEDCOLL function flag is not set, +** +** then this routine attempts to invoke the SQL function. Assuming no +** error occurs, output parameter (*ppVal) is set to point to a value +** object containing the result before returning SQLITE_OK. +** +** Affinity aff is applied to the result of the function before returning. +** If the result is a text value, the sqlite3_value object uses encoding +** enc. +** +** If the conditions above are not met, this function returns SQLITE_OK +** and sets (*ppVal) to NULL. Or, if an error occurs, (*ppVal) is set to +** NULL and an SQLite error code returned. +*/ +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +static int valueFromFunction( + sqlite3 *db, /* The database connection */ + Expr *p, /* The expression to evaluate */ + u8 enc, /* Encoding to use */ + u8 aff, /* Affinity to use */ + sqlite3_value **ppVal, /* Write the new value here */ + struct ValueNewStat4Ctx *pCtx /* Second argument for valueNew() */ +){ + sqlite3_context ctx; /* Context object for function invocation */ + sqlite3_value **apVal = 0; /* Function arguments */ + int nVal = 0; /* Size of apVal[] array */ + FuncDef *pFunc = 0; /* Function definition */ + sqlite3_value *pVal = 0; /* New value */ + int rc = SQLITE_OK; /* Return code */ + ExprList *pList = 0; /* Function arguments */ + int i; /* Iterator variable */ + + assert( pCtx!=0 ); + assert( (p->flags & EP_TokenOnly)==0 ); + pList = p->x.pList; + if( pList ) nVal = pList->nExpr; + pFunc = sqlite3FindFunction(db, p->u.zToken, nVal, enc, 0); + assert( pFunc ); + if( (pFunc->funcFlags & (SQLITE_FUNC_CONSTANT|SQLITE_FUNC_SLOCHNG))==0 + || (pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL) + ){ + return SQLITE_OK; + } + + if( pList ){ + apVal = (sqlite3_value**)sqlite3DbMallocZero(db, sizeof(apVal[0]) * nVal); + if( apVal==0 ){ + rc = SQLITE_NOMEM_BKPT; + goto value_from_function_out; + } + for(i=0; ia[i].pExpr, enc, aff, &apVal[i]); + if( apVal[i]==0 || rc!=SQLITE_OK ) goto value_from_function_out; + } + } + + pVal = valueNew(db, pCtx); + if( pVal==0 ){ + rc = SQLITE_NOMEM_BKPT; + goto value_from_function_out; + } + + assert( pCtx->pParse->rc==SQLITE_OK ); + memset(&ctx, 0, sizeof(ctx)); + ctx.pOut = pVal; + ctx.pFunc = pFunc; + pFunc->xSFunc(&ctx, nVal, apVal); + if( ctx.isError ){ + rc = ctx.isError; + sqlite3ErrorMsg(pCtx->pParse, "%s", sqlite3_value_text(pVal)); + }else{ + sqlite3ValueApplyAffinity(pVal, aff, SQLITE_UTF8); + assert( rc==SQLITE_OK ); + rc = sqlite3VdbeChangeEncoding(pVal, enc); + if( rc==SQLITE_OK && sqlite3VdbeMemTooBig(pVal) ){ + rc = SQLITE_TOOBIG; + pCtx->pParse->nErr++; + } + } + pCtx->pParse->rc = rc; + + value_from_function_out: + if( rc!=SQLITE_OK ){ + pVal = 0; + } + if( apVal ){ + for(i=0; iop)==TK_UPLUS || op==TK_SPAN ) pExpr = pExpr->pLeft; + if( NEVER(op==TK_REGISTER) ) op = pExpr->op2; + + /* Compressed expressions only appear when parsing the DEFAULT clause + ** on a table column definition, and hence only when pCtx==0. This + ** check ensures that an EP_TokenOnly expression is never passed down + ** into valueFromFunction(). */ + assert( (pExpr->flags & EP_TokenOnly)==0 || pCtx==0 ); + + if( op==TK_CAST ){ + u8 aff = sqlite3AffinityType(pExpr->u.zToken,0); + rc = valueFromExpr(db, pExpr->pLeft, enc, aff, ppVal, pCtx); + testcase( rc!=SQLITE_OK ); + if( *ppVal ){ + sqlite3VdbeMemCast(*ppVal, aff, SQLITE_UTF8); + sqlite3ValueApplyAffinity(*ppVal, affinity, SQLITE_UTF8); + } + return rc; + } + + /* Handle negative integers in a single step. This is needed in the + ** case when the value is -9223372036854775808. + */ + if( op==TK_UMINUS + && (pExpr->pLeft->op==TK_INTEGER || pExpr->pLeft->op==TK_FLOAT) ){ + pExpr = pExpr->pLeft; + op = pExpr->op; + negInt = -1; + zNeg = "-"; + } + + if( op==TK_STRING || op==TK_FLOAT || op==TK_INTEGER ){ + pVal = valueNew(db, pCtx); + if( pVal==0 ) goto no_mem; + if( ExprHasProperty(pExpr, EP_IntValue) ){ + sqlite3VdbeMemSetInt64(pVal, (i64)pExpr->u.iValue*negInt); + }else{ + zVal = sqlite3MPrintf(db, "%s%s", zNeg, pExpr->u.zToken); + if( zVal==0 ) goto no_mem; + sqlite3ValueSetStr(pVal, -1, zVal, SQLITE_UTF8, SQLITE_DYNAMIC); + } + if( (op==TK_INTEGER || op==TK_FLOAT ) && affinity==SQLITE_AFF_BLOB ){ + sqlite3ValueApplyAffinity(pVal, SQLITE_AFF_NUMERIC, SQLITE_UTF8); + }else{ + sqlite3ValueApplyAffinity(pVal, affinity, SQLITE_UTF8); + } + if( pVal->flags & (MEM_Int|MEM_Real) ) pVal->flags &= ~MEM_Str; + if( enc!=SQLITE_UTF8 ){ + rc = sqlite3VdbeChangeEncoding(pVal, enc); + } + }else if( op==TK_UMINUS ) { + /* This branch happens for multiple negative signs. Ex: -(-5) */ + if( SQLITE_OK==sqlite3ValueFromExpr(db,pExpr->pLeft,enc,affinity,&pVal) + && pVal!=0 + ){ + sqlite3VdbeMemNumerify(pVal); + if( pVal->flags & MEM_Real ){ + pVal->u.r = -pVal->u.r; + }else if( pVal->u.i==SMALLEST_INT64 ){ + pVal->u.r = -(double)SMALLEST_INT64; + MemSetTypeFlag(pVal, MEM_Real); + }else{ + pVal->u.i = -pVal->u.i; + } + sqlite3ValueApplyAffinity(pVal, affinity, enc); + } + }else if( op==TK_NULL ){ + pVal = valueNew(db, pCtx); + if( pVal==0 ) goto no_mem; + } +#ifndef SQLITE_OMIT_BLOB_LITERAL + else if( op==TK_BLOB ){ + int nVal; + assert( pExpr->u.zToken[0]=='x' || pExpr->u.zToken[0]=='X' ); + assert( pExpr->u.zToken[1]=='\'' ); + pVal = valueNew(db, pCtx); + if( !pVal ) goto no_mem; + zVal = &pExpr->u.zToken[2]; + nVal = sqlite3Strlen30(zVal)-1; + assert( zVal[nVal]=='\'' ); + sqlite3VdbeMemSetStr(pVal, sqlite3HexToBlob(db, zVal, nVal), nVal/2, + 0, SQLITE_DYNAMIC); + } +#endif + +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 + else if( op==TK_FUNCTION && pCtx!=0 ){ + rc = valueFromFunction(db, pExpr, enc, affinity, &pVal, pCtx); + } +#endif + + *ppVal = pVal; + return rc; + +no_mem: + sqlite3OomFault(db); + sqlite3DbFree(db, zVal); + assert( *ppVal==0 ); +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 + if( pCtx==0 ) sqlite3ValueFree(pVal); +#else + assert( pCtx==0 ); sqlite3ValueFree(pVal); +#endif + return SQLITE_NOMEM_BKPT; +} + +/* +** Create a new sqlite3_value object, containing the value of pExpr. +** +** This only works for very simple expressions that consist of one constant +** token (i.e. "5", "5.1", "'a string'"). If the expression can +** be converted directly into a value, then the value is allocated and +** a pointer written to *ppVal. The caller is responsible for deallocating +** the value by passing it to sqlite3ValueFree() later on. If the expression +** cannot be converted to a value, then *ppVal is set to NULL. +*/ +SQLITE_PRIVATE int sqlite3ValueFromExpr( + sqlite3 *db, /* The database connection */ + Expr *pExpr, /* The expression to evaluate */ + u8 enc, /* Encoding to use */ + u8 affinity, /* Affinity to use */ + sqlite3_value **ppVal /* Write the new value here */ +){ + return pExpr ? valueFromExpr(db, pExpr, enc, affinity, ppVal, 0) : 0; +} + +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +/* +** The implementation of the sqlite_record() function. This function accepts +** a single argument of any type. The return value is a formatted database +** record (a blob) containing the argument value. +** +** This is used to convert the value stored in the 'sample' column of the +** sqlite_stat3 table to the record format SQLite uses internally. +*/ +static void recordFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const int file_format = 1; + u32 iSerial; /* Serial type */ + int nSerial; /* Bytes of space for iSerial as varint */ + u32 nVal; /* Bytes of space required for argv[0] */ + int nRet; + sqlite3 *db; + u8 *aRet; + + UNUSED_PARAMETER( argc ); + iSerial = sqlite3VdbeSerialType(argv[0], file_format, &nVal); + nSerial = sqlite3VarintLen(iSerial); + db = sqlite3_context_db_handle(context); + + nRet = 1 + nSerial + nVal; + aRet = sqlite3DbMallocRawNN(db, nRet); + if( aRet==0 ){ + sqlite3_result_error_nomem(context); + }else{ + aRet[0] = nSerial+1; + putVarint32(&aRet[1], iSerial); + sqlite3VdbeSerialPut(&aRet[1+nSerial], argv[0], iSerial); + sqlite3_result_blob(context, aRet, nRet, SQLITE_TRANSIENT); + sqlite3DbFree(db, aRet); + } +} + +/* +** Register built-in functions used to help read ANALYZE data. +*/ +SQLITE_PRIVATE void sqlite3AnalyzeFunctions(void){ + static FuncDef aAnalyzeTableFuncs[] = { + FUNCTION(sqlite_record, 1, 0, 0, recordFunc), + }; + sqlite3InsertBuiltinFuncs(aAnalyzeTableFuncs, ArraySize(aAnalyzeTableFuncs)); +} + +/* +** Attempt to extract a value from pExpr and use it to construct *ppVal. +** +** If pAlloc is not NULL, then an UnpackedRecord object is created for +** pAlloc if one does not exist and the new value is added to the +** UnpackedRecord object. +** +** A value is extracted in the following cases: +** +** * (pExpr==0). In this case the value is assumed to be an SQL NULL, +** +** * The expression is a bound variable, and this is a reprepare, or +** +** * The expression is a literal value. +** +** On success, *ppVal is made to point to the extracted value. The caller +** is responsible for ensuring that the value is eventually freed. +*/ +static int stat4ValueFromExpr( + Parse *pParse, /* Parse context */ + Expr *pExpr, /* The expression to extract a value from */ + u8 affinity, /* Affinity to use */ + struct ValueNewStat4Ctx *pAlloc,/* How to allocate space. Or NULL */ + sqlite3_value **ppVal /* OUT: New value object (or NULL) */ +){ + int rc = SQLITE_OK; + sqlite3_value *pVal = 0; + sqlite3 *db = pParse->db; + + /* Skip over any TK_COLLATE nodes */ + pExpr = sqlite3ExprSkipCollate(pExpr); + + if( !pExpr ){ + pVal = valueNew(db, pAlloc); + if( pVal ){ + sqlite3VdbeMemSetNull((Mem*)pVal); + } + }else if( pExpr->op==TK_VARIABLE + || NEVER(pExpr->op==TK_REGISTER && pExpr->op2==TK_VARIABLE) + ){ + Vdbe *v; + int iBindVar = pExpr->iColumn; + sqlite3VdbeSetVarmask(pParse->pVdbe, iBindVar); + if( (v = pParse->pReprepare)!=0 ){ + pVal = valueNew(db, pAlloc); + if( pVal ){ + rc = sqlite3VdbeMemCopy((Mem*)pVal, &v->aVar[iBindVar-1]); + if( rc==SQLITE_OK ){ + sqlite3ValueApplyAffinity(pVal, affinity, ENC(db)); + } + pVal->db = pParse->db; + } + } + }else{ + rc = valueFromExpr(db, pExpr, ENC(db), affinity, &pVal, pAlloc); + } + + assert( pVal==0 || pVal->db==db ); + *ppVal = pVal; + return rc; +} + +/* +** This function is used to allocate and populate UnpackedRecord +** structures intended to be compared against sample index keys stored +** in the sqlite_stat4 table. +** +** A single call to this function populates zero or more fields of the +** record starting with field iVal (fields are numbered from left to +** right starting with 0). A single field is populated if: +** +** * (pExpr==0). In this case the value is assumed to be an SQL NULL, +** +** * The expression is a bound variable, and this is a reprepare, or +** +** * The sqlite3ValueFromExpr() function is able to extract a value +** from the expression (i.e. the expression is a literal value). +** +** Or, if pExpr is a TK_VECTOR, one field is populated for each of the +** vector components that match either of the two latter criteria listed +** above. +** +** Before any value is appended to the record, the affinity of the +** corresponding column within index pIdx is applied to it. Before +** this function returns, output parameter *pnExtract is set to the +** number of values appended to the record. +** +** When this function is called, *ppRec must either point to an object +** allocated by an earlier call to this function, or must be NULL. If it +** is NULL and a value can be successfully extracted, a new UnpackedRecord +** is allocated (and *ppRec set to point to it) before returning. +** +** Unless an error is encountered, SQLITE_OK is returned. It is not an +** error if a value cannot be extracted from pExpr. If an error does +** occur, an SQLite error code is returned. +*/ +SQLITE_PRIVATE int sqlite3Stat4ProbeSetValue( + Parse *pParse, /* Parse context */ + Index *pIdx, /* Index being probed */ + UnpackedRecord **ppRec, /* IN/OUT: Probe record */ + Expr *pExpr, /* The expression to extract a value from */ + int nElem, /* Maximum number of values to append */ + int iVal, /* Array element to populate */ + int *pnExtract /* OUT: Values appended to the record */ +){ + int rc = SQLITE_OK; + int nExtract = 0; + + if( pExpr==0 || pExpr->op!=TK_SELECT ){ + int i; + struct ValueNewStat4Ctx alloc; + + alloc.pParse = pParse; + alloc.pIdx = pIdx; + alloc.ppRec = ppRec; + + for(i=0; idb, pIdx, iVal+i); + alloc.iVal = iVal+i; + rc = stat4ValueFromExpr(pParse, pElem, aff, &alloc, &pVal); + if( !pVal ) break; + nExtract++; + } + } + + *pnExtract = nExtract; + return rc; +} + +/* +** Attempt to extract a value from expression pExpr using the methods +** as described for sqlite3Stat4ProbeSetValue() above. +** +** If successful, set *ppVal to point to a new value object and return +** SQLITE_OK. If no value can be extracted, but no other error occurs +** (e.g. OOM), return SQLITE_OK and set *ppVal to NULL. Or, if an error +** does occur, return an SQLite error code. The final value of *ppVal +** is undefined in this case. +*/ +SQLITE_PRIVATE int sqlite3Stat4ValueFromExpr( + Parse *pParse, /* Parse context */ + Expr *pExpr, /* The expression to extract a value from */ + u8 affinity, /* Affinity to use */ + sqlite3_value **ppVal /* OUT: New value object (or NULL) */ +){ + return stat4ValueFromExpr(pParse, pExpr, affinity, 0, ppVal); +} + +/* +** Extract the iCol-th column from the nRec-byte record in pRec. Write +** the column value into *ppVal. If *ppVal is initially NULL then a new +** sqlite3_value object is allocated. +** +** If *ppVal is initially NULL then the caller is responsible for +** ensuring that the value written into *ppVal is eventually freed. +*/ +SQLITE_PRIVATE int sqlite3Stat4Column( + sqlite3 *db, /* Database handle */ + const void *pRec, /* Pointer to buffer containing record */ + int nRec, /* Size of buffer pRec in bytes */ + int iCol, /* Column to extract */ + sqlite3_value **ppVal /* OUT: Extracted value */ +){ + u32 t; /* a column type code */ + int nHdr; /* Size of the header in the record */ + int iHdr; /* Next unread header byte */ + int iField; /* Next unread data byte */ + int szField; /* Size of the current data field */ + int i; /* Column index */ + u8 *a = (u8*)pRec; /* Typecast byte array */ + Mem *pMem = *ppVal; /* Write result into this Mem object */ + + assert( iCol>0 ); + iHdr = getVarint32(a, nHdr); + if( nHdr>nRec || iHdr>=nHdr ) return SQLITE_CORRUPT_BKPT; + iField = nHdr; + for(i=0; i<=iCol; i++){ + iHdr += getVarint32(&a[iHdr], t); + testcase( iHdr==nHdr ); + testcase( iHdr==nHdr+1 ); + if( iHdr>nHdr ) return SQLITE_CORRUPT_BKPT; + szField = sqlite3VdbeSerialTypeLen(t); + iField += szField; + } + testcase( iField==nRec ); + testcase( iField==nRec+1 ); + if( iField>nRec ) return SQLITE_CORRUPT_BKPT; + if( pMem==0 ){ + pMem = *ppVal = sqlite3ValueNew(db); + if( pMem==0 ) return SQLITE_NOMEM_BKPT; + } + sqlite3VdbeSerialGet(&a[iField-szField], t, pMem); + pMem->enc = ENC(db); + return SQLITE_OK; +} + +/* +** Unless it is NULL, the argument must be an UnpackedRecord object returned +** by an earlier call to sqlite3Stat4ProbeSetValue(). This call deletes +** the object. +*/ +SQLITE_PRIVATE void sqlite3Stat4ProbeFree(UnpackedRecord *pRec){ + if( pRec ){ + int i; + int nCol = pRec->pKeyInfo->nField+pRec->pKeyInfo->nXField; + Mem *aMem = pRec->aMem; + sqlite3 *db = aMem[0].db; + for(i=0; ipKeyInfo); + sqlite3DbFree(db, pRec); + } +} +#endif /* ifdef SQLITE_ENABLE_STAT4 */ + +/* +** Change the string value of an sqlite3_value object +*/ +SQLITE_PRIVATE void sqlite3ValueSetStr( + sqlite3_value *v, /* Value to be set */ + int n, /* Length of string z */ + const void *z, /* Text of the new string */ + u8 enc, /* Encoding to use */ + void (*xDel)(void*) /* Destructor for the string */ +){ + if( v ) sqlite3VdbeMemSetStr((Mem *)v, z, n, enc, xDel); +} + +/* +** Free an sqlite3_value object +*/ +SQLITE_PRIVATE void sqlite3ValueFree(sqlite3_value *v){ + if( !v ) return; + sqlite3VdbeMemRelease((Mem *)v); + sqlite3DbFree(((Mem*)v)->db, v); +} + +/* +** The sqlite3ValueBytes() routine returns the number of bytes in the +** sqlite3_value object assuming that it uses the encoding "enc". +** The valueBytes() routine is a helper function. +*/ +static SQLITE_NOINLINE int valueBytes(sqlite3_value *pVal, u8 enc){ + return valueToText(pVal, enc)!=0 ? pVal->n : 0; +} +SQLITE_PRIVATE int sqlite3ValueBytes(sqlite3_value *pVal, u8 enc){ + Mem *p = (Mem*)pVal; + assert( (p->flags & MEM_Null)==0 || (p->flags & (MEM_Str|MEM_Blob))==0 ); + if( (p->flags & MEM_Str)!=0 && pVal->enc==enc ){ + return p->n; + } + if( (p->flags & MEM_Blob)!=0 ){ + if( p->flags & MEM_Zero ){ + return p->n + p->u.nZero; + }else{ + return p->n; + } + } + if( p->flags & MEM_Null ) return 0; + return valueBytes(pVal, enc); +} + +/************** End of vdbemem.c *********************************************/ +/************** Begin file vdbeaux.c *****************************************/ +/* +** 2003 September 6 +** +** 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 for creating, destroying, and populating +** a VDBE (or an "sqlite3_stmt" as it is known to the outside world.) +*/ +/* #include "sqliteInt.h" */ +/* #include "vdbeInt.h" */ + +/* +** Create a new virtual database engine. +*/ +SQLITE_PRIVATE Vdbe *sqlite3VdbeCreate(Parse *pParse){ + sqlite3 *db = pParse->db; + Vdbe *p; + p = sqlite3DbMallocRawNN(db, sizeof(Vdbe) ); + if( p==0 ) return 0; + memset(&p->aOp, 0, sizeof(Vdbe)-offsetof(Vdbe,aOp)); + p->db = db; + if( db->pVdbe ){ + db->pVdbe->pPrev = p; + } + p->pNext = db->pVdbe; + p->pPrev = 0; + db->pVdbe = p; + p->magic = VDBE_MAGIC_INIT; + p->pParse = pParse; + assert( pParse->aLabel==0 ); + assert( pParse->nLabel==0 ); + assert( pParse->nOpAlloc==0 ); + assert( pParse->szOpAlloc==0 ); + return p; +} + +/* +** Change the error string stored in Vdbe.zErrMsg +*/ +SQLITE_PRIVATE void sqlite3VdbeError(Vdbe *p, const char *zFormat, ...){ + va_list ap; + sqlite3DbFree(p->db, p->zErrMsg); + va_start(ap, zFormat); + p->zErrMsg = sqlite3VMPrintf(p->db, zFormat, ap); + va_end(ap); +} + +/* +** 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; +#if defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_ENABLE_SQLLOG) + if( !isPrepareV2 ) return; +#endif + assert( p->zSql==0 ); + p->zSql = sqlite3DbStrNDup(p->db, z, n); + p->isPrepareV2 = (u8)isPrepareV2; +} + +/* +** Swap all content between two VDBE structures. +*/ +SQLITE_PRIVATE void sqlite3VdbeSwap(Vdbe *pA, Vdbe *pB){ + Vdbe tmp, *pTmp; + char *zTmp; + assert( pA->db==pB->db ); + tmp = *pA; + *pA = *pB; + *pB = tmp; + pTmp = pA->pNext; + pA->pNext = pB->pNext; + pB->pNext = pTmp; + pTmp = pA->pPrev; + pA->pPrev = pB->pPrev; + pB->pPrev = pTmp; + zTmp = pA->zSql; + pA->zSql = pB->zSql; + pB->zSql = zTmp; + pB->isPrepareV2 = pA->isPrepareV2; +} + +/* +** Resize the Vdbe.aOp array so that it is at least nOp elements larger +** than its current size. nOp is guaranteed to be less than or equal +** to 1024/sizeof(Op). +** +** If an out-of-memory error occurs while resizing the array, return +** SQLITE_NOMEM. In this case Vdbe.aOp and Parse.nOpAlloc remain +** unchanged (this is so that any opcodes already allocated can be +** correctly deallocated along with the rest of the Vdbe). +*/ +static int growOpArray(Vdbe *v, int nOp){ + VdbeOp *pNew; + Parse *p = v->pParse; + + /* The SQLITE_TEST_REALLOC_STRESS compile-time option is designed to force + ** more frequent reallocs and hence provide more opportunities for + ** simulated OOM faults. SQLITE_TEST_REALLOC_STRESS is generally used + ** during testing only. With SQLITE_TEST_REALLOC_STRESS grow the op array + ** by the minimum* amount required until the size reaches 512. Normal + ** operation (without SQLITE_TEST_REALLOC_STRESS) is to double the current + ** size of the op array or add 1KB of space, whichever is smaller. */ +#ifdef SQLITE_TEST_REALLOC_STRESS + int nNew = (p->nOpAlloc>=512 ? p->nOpAlloc*2 : p->nOpAlloc+nOp); +#else + int nNew = (p->nOpAlloc ? p->nOpAlloc*2 : (int)(1024/sizeof(Op))); + UNUSED_PARAMETER(nOp); +#endif + + assert( nOp<=(1024/sizeof(Op)) ); + assert( nNew>=(p->nOpAlloc+nOp) ); + pNew = sqlite3DbRealloc(p->db, v->aOp, nNew*sizeof(Op)); + if( pNew ){ + p->szOpAlloc = sqlite3DbMallocSize(p->db, pNew); + p->nOpAlloc = p->szOpAlloc/sizeof(Op); + v->aOp = pNew; + } + return (pNew ? SQLITE_OK : SQLITE_NOMEM_BKPT); +} + +#ifdef SQLITE_DEBUG +/* This routine is just a convenient place to set a breakpoint that will +** fire after each opcode is inserted and displayed using +** "PRAGMA vdbe_addoptrace=on". +*/ +static void test_addop_breakpoint(void){ + static int n = 0; + n++; +} +#endif + +/* +** Add a new instruction to the list of instructions current in the +** VDBE. Return the address of the new instruction. +** +** Parameters: +** +** p Pointer to the VDBE +** +** op The opcode for this instruction +** +** p1, p2, p3 Operands +** +** Use the sqlite3VdbeResolveLabel() function to fix an address and +** the sqlite3VdbeChangeP4() function to change the value of the P4 +** operand. +*/ +static SQLITE_NOINLINE int growOp3(Vdbe *p, int op, int p1, int p2, int p3){ + assert( p->pParse->nOpAlloc<=p->nOp ); + if( growOpArray(p, 1) ) return 1; + assert( p->pParse->nOpAlloc>p->nOp ); + return sqlite3VdbeAddOp3(p, op, p1, p2, p3); +} +SQLITE_PRIVATE int sqlite3VdbeAddOp3(Vdbe *p, int op, int p1, int p2, int p3){ + int i; + VdbeOp *pOp; + + i = p->nOp; + assert( p->magic==VDBE_MAGIC_INIT ); + assert( op>=0 && op<0xff ); + if( p->pParse->nOpAlloc<=i ){ + return growOp3(p, op, p1, p2, p3); + } + p->nOp++; + pOp = &p->aOp[i]; + pOp->opcode = (u8)op; + pOp->p5 = 0; + pOp->p1 = p1; + pOp->p2 = p2; + pOp->p3 = p3; + pOp->p4.p = 0; + pOp->p4type = P4_NOTUSED; +#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS + pOp->zComment = 0; +#endif +#ifdef SQLITE_DEBUG + if( p->db->flags & SQLITE_VdbeAddopTrace ){ + int jj, kk; + Parse *pParse = p->pParse; + for(jj=kk=0; jjnColCache; jj++){ + struct yColCache *x = pParse->aColCache + jj; + printf(" r[%d]={%d:%d}", x->iReg, x->iTable, x->iColumn); + kk++; + } + if( kk ) printf("\n"); + sqlite3VdbePrintOp(0, i, &p->aOp[i]); + test_addop_breakpoint(); + } +#endif +#ifdef VDBE_PROFILE + pOp->cycles = 0; + pOp->cnt = 0; +#endif +#ifdef SQLITE_VDBE_COVERAGE + pOp->iSrcLine = 0; +#endif + return i; +} +SQLITE_PRIVATE int sqlite3VdbeAddOp0(Vdbe *p, int op){ + return sqlite3VdbeAddOp3(p, op, 0, 0, 0); +} +SQLITE_PRIVATE int sqlite3VdbeAddOp1(Vdbe *p, int op, int p1){ + return sqlite3VdbeAddOp3(p, op, p1, 0, 0); +} +SQLITE_PRIVATE int sqlite3VdbeAddOp2(Vdbe *p, int op, int p1, int p2){ + return sqlite3VdbeAddOp3(p, op, p1, p2, 0); +} + +/* Generate code for an unconditional jump to instruction iDest +*/ +SQLITE_PRIVATE int sqlite3VdbeGoto(Vdbe *p, int iDest){ + return sqlite3VdbeAddOp3(p, OP_Goto, 0, iDest, 0); +} + +/* Generate code to cause the string zStr to be loaded into +** register iDest +*/ +SQLITE_PRIVATE int sqlite3VdbeLoadString(Vdbe *p, int iDest, const char *zStr){ + return sqlite3VdbeAddOp4(p, OP_String8, 0, iDest, 0, zStr, 0); +} + +/* +** Generate code that initializes multiple registers to string or integer +** constants. The registers begin with iDest and increase consecutively. +** One register is initialized for each characgter in zTypes[]. For each +** "s" character in zTypes[], the register is a string if the argument is +** not NULL, or OP_Null if the value is a null pointer. For each "i" character +** in zTypes[], the register is initialized to an integer. +*/ +SQLITE_PRIVATE void sqlite3VdbeMultiLoad(Vdbe *p, int iDest, const char *zTypes, ...){ + va_list ap; + int i; + char c; + va_start(ap, zTypes); + for(i=0; (c = zTypes[i])!=0; i++){ + if( c=='s' ){ + const char *z = va_arg(ap, const char*); + sqlite3VdbeAddOp4(p, z==0 ? OP_Null : OP_String8, 0, iDest++, 0, z, 0); + }else{ + assert( c=='i' ); + sqlite3VdbeAddOp2(p, OP_Integer, va_arg(ap, int), iDest++); + } + } + va_end(ap); +} + +/* +** Add an opcode that includes the p4 value as a pointer. +*/ +SQLITE_PRIVATE int sqlite3VdbeAddOp4( + 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 */ + const char *zP4, /* The P4 operand */ + int p4type /* P4 operand type */ +){ + int addr = sqlite3VdbeAddOp3(p, op, p1, p2, p3); + sqlite3VdbeChangeP4(p, addr, zP4, p4type); + return addr; +} + +/* +** Add an opcode that includes the p4 value with a P4_INT64 or +** P4_REAL type. +*/ +SQLITE_PRIVATE int sqlite3VdbeAddOp4Dup8( + 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 */ + const u8 *zP4, /* The P4 operand */ + int p4type /* P4 operand type */ +){ + char *p4copy = sqlite3DbMallocRawNN(sqlite3VdbeDb(p), 8); + if( p4copy ) memcpy(p4copy, zP4, 8); + return sqlite3VdbeAddOp4(p, op, p1, p2, p3, p4copy, p4type); +} + +/* +** Add an OP_ParseSchema opcode. This routine is broken out from +** sqlite3VdbeAddOp4() since it needs to also needs to mark all btrees +** as having been used. +** +** The zWhere string must have been obtained from sqlite3_malloc(). +** This routine will take ownership of the allocated memory. +*/ +SQLITE_PRIVATE void sqlite3VdbeAddParseSchemaOp(Vdbe *p, int iDb, char *zWhere){ + int j; + sqlite3VdbeAddOp4(p, OP_ParseSchema, iDb, 0, 0, zWhere, P4_DYNAMIC); + for(j=0; jdb->nDb; j++) sqlite3VdbeUsesBtree(p, j); +} + +/* +** 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; +} + +/* Insert the end of a co-routine +*/ +SQLITE_PRIVATE void sqlite3VdbeEndCoroutine(Vdbe *v, int regYield){ + sqlite3VdbeAddOp1(v, OP_EndCoroutine, regYield); + + /* Clear the temporary register cache, thereby ensuring that each + ** co-routine has its own independent set of registers, because co-routines + ** might expect their registers to be preserved across an OP_Yield, and + ** that could cause problems if two or more co-routines are using the same + ** temporary register. + */ + v->pParse->nTempReg = 0; + v->pParse->nRangeReg = 0; +} + +/* +** Create a new symbolic label for an instruction that has yet to be +** coded. The symbolic label is really just a negative number. The +** label can be used as the P2 value of an operation. Later, when +** the label is resolved to a specific address, the VDBE will scan +** through its operation list and change all values of P2 which match +** the label into the resolved address. +** +** The VDBE knows that a P2 value is a label because labels are +** always negative and P2 values are suppose to be non-negative. +** Hence, a negative P2 value is a label that has yet to be resolved. +** +** Zero is returned if a malloc() fails. +*/ +SQLITE_PRIVATE int sqlite3VdbeMakeLabel(Vdbe *v){ + Parse *p = v->pParse; + int i = p->nLabel++; + assert( v->magic==VDBE_MAGIC_INIT ); + if( (i & (i-1))==0 ){ + p->aLabel = sqlite3DbReallocOrFree(p->db, p->aLabel, + (i*2+1)*sizeof(p->aLabel[0])); + } + if( p->aLabel ){ + p->aLabel[i] = -1; + } + return ADDR(i); +} + +/* +** Resolve label "x" to be the address of the next instruction to +** be inserted. The parameter "x" must have been obtained from +** a prior call to sqlite3VdbeMakeLabel(). +*/ +SQLITE_PRIVATE void sqlite3VdbeResolveLabel(Vdbe *v, int x){ + Parse *p = v->pParse; + int j = ADDR(x); + assert( v->magic==VDBE_MAGIC_INIT ); + assert( jnLabel ); + assert( j>=0 ); + if( p->aLabel ){ + p->aLabel[j] = v->nOp; + } +} + +/* +** Mark the VDBE as one that can only be run one time. +*/ +SQLITE_PRIVATE void sqlite3VdbeRunOnlyOnce(Vdbe *p){ + p->runOnlyOnce = 1; +} + +/* +** Mark the VDBE as one that can only be run multiple times. +*/ +SQLITE_PRIVATE void sqlite3VdbeReusable(Vdbe *p){ + p->runOnlyOnce = 0; +} + +#ifdef SQLITE_DEBUG /* sqlite3AssertMayAbort() logic */ + +/* +** The following type and function are used to iterate through all opcodes +** in a Vdbe main program and each of the sub-programs (triggers) it may +** invoke directly or indirectly. It should be used as follows: +** +** Op *pOp; +** VdbeOpIter sIter; +** +** memset(&sIter, 0, sizeof(sIter)); +** sIter.v = v; // v is of type Vdbe* +** while( (pOp = opIterNext(&sIter)) ){ +** // Do something with pOp +** } +** sqlite3DbFree(v->db, sIter.apSub); +** +*/ +typedef struct VdbeOpIter VdbeOpIter; +struct VdbeOpIter { + Vdbe *v; /* Vdbe to iterate through the opcodes of */ + SubProgram **apSub; /* Array of subprograms */ + int nSub; /* Number of entries in apSub */ + int iAddr; /* Address of next instruction to return */ + int iSub; /* 0 = main program, 1 = first sub-program etc. */ +}; +static Op *opIterNext(VdbeOpIter *p){ + Vdbe *v = p->v; + Op *pRet = 0; + Op *aOp; + int nOp; + + if( p->iSub<=p->nSub ){ + + if( p->iSub==0 ){ + aOp = v->aOp; + nOp = v->nOp; + }else{ + aOp = p->apSub[p->iSub-1]->aOp; + nOp = p->apSub[p->iSub-1]->nOp; + } + assert( p->iAddriAddr]; + p->iAddr++; + if( p->iAddr==nOp ){ + p->iSub++; + p->iAddr = 0; + } + + if( pRet->p4type==P4_SUBPROGRAM ){ + int nByte = (p->nSub+1)*sizeof(SubProgram*); + int j; + for(j=0; jnSub; j++){ + if( p->apSub[j]==pRet->p4.pProgram ) break; + } + if( j==p->nSub ){ + p->apSub = sqlite3DbReallocOrFree(v->db, p->apSub, nByte); + if( !p->apSub ){ + pRet = 0; + }else{ + p->apSub[p->nSub++] = pRet->p4.pProgram; + } + } + } + } + + return pRet; +} + +/* +** Check if the program stored in the VM associated with pParse may +** throw an ABORT exception (causing the statement, but not entire transaction +** to be rolled back). This condition is true if the main program or any +** sub-programs contains any of the following: +** +** * OP_Halt with P1=SQLITE_CONSTRAINT and P2=OE_Abort. +** * OP_HaltIfNull with P1=SQLITE_CONSTRAINT and P2=OE_Abort. +** * OP_Destroy +** * OP_VUpdate +** * OP_VRename +** * OP_FkCounter with P2==0 (immediate foreign key constraint) +** * OP_CreateTable and OP_InitCoroutine (for CREATE TABLE AS SELECT ...) +** +** Then check that the value of Parse.mayAbort is true if an +** ABORT may be thrown, or false otherwise. Return true if it does +** match, or false otherwise. This function is intended to be used as +** part of an assert statement in the compiler. Similar to: +** +** assert( sqlite3VdbeAssertMayAbort(pParse->pVdbe, pParse->mayAbort) ); +*/ +SQLITE_PRIVATE int sqlite3VdbeAssertMayAbort(Vdbe *v, int mayAbort){ + int hasAbort = 0; + int hasFkCounter = 0; + int hasCreateTable = 0; + int hasInitCoroutine = 0; + Op *pOp; + VdbeOpIter sIter; + memset(&sIter, 0, sizeof(sIter)); + sIter.v = v; + + while( (pOp = opIterNext(&sIter))!=0 ){ + int opcode = pOp->opcode; + if( opcode==OP_Destroy || opcode==OP_VUpdate || opcode==OP_VRename + || ((opcode==OP_Halt || opcode==OP_HaltIfNull) + && ((pOp->p1&0xff)==SQLITE_CONSTRAINT && pOp->p2==OE_Abort)) + ){ + hasAbort = 1; + break; + } + if( opcode==OP_CreateTable ) hasCreateTable = 1; + if( opcode==OP_InitCoroutine ) hasInitCoroutine = 1; +#ifndef SQLITE_OMIT_FOREIGN_KEY + if( opcode==OP_FkCounter && pOp->p1==0 && pOp->p2==1 ){ + hasFkCounter = 1; + } +#endif + } + sqlite3DbFree(v->db, sIter.apSub); + + /* Return true if hasAbort==mayAbort. Or if a malloc failure occurred. + ** If malloc failed, then the while() loop above may not have iterated + ** through all opcodes and hasAbort may be set incorrectly. Return + ** true for this case to prevent the assert() in the callers frame + ** from failing. */ + return ( v->db->mallocFailed || hasAbort==mayAbort || hasFkCounter + || (hasCreateTable && hasInitCoroutine) ); +} +#endif /* SQLITE_DEBUG - the sqlite3AssertMayAbort() function */ + +/* +** This routine is called after all opcodes have been inserted. It loops +** through all the opcodes and fixes up some details. +** +** (1) For each jump instruction with a negative P2 value (a label) +** resolve the P2 value to an actual address. +** +** (2) Compute the maximum number of arguments used by any SQL function +** and store that value in *pMaxFuncArgs. +** +** (3) Update the Vdbe.readOnly and Vdbe.bIsReader flags to accurately +** indicate what the prepared statement actually does. +** +** (4) Initialize the p4.xAdvance pointer on opcodes that use it. +** +** (5) Reclaim the memory allocated for storing labels. +** +** This routine will only function correctly if the mkopcodeh.tcl generator +** script numbers the opcodes correctly. Changes to this routine must be +** coordinated with changes to mkopcodeh.tcl. +*/ +static void resolveP2Values(Vdbe *p, int *pMaxFuncArgs){ + int nMaxArgs = *pMaxFuncArgs; + Op *pOp; + Parse *pParse = p->pParse; + int *aLabel = pParse->aLabel; + p->readOnly = 1; + p->bIsReader = 0; + pOp = &p->aOp[p->nOp-1]; + while(1){ + + /* Only JUMP opcodes and the short list of special opcodes in the switch + ** below need to be considered. The mkopcodeh.tcl generator script groups + ** all these opcodes together near the front of the opcode list. Skip + ** any opcode that does not need processing by virtual of the fact that + ** it is larger than SQLITE_MX_JUMP_OPCODE, as a performance optimization. + */ + if( pOp->opcode<=SQLITE_MX_JUMP_OPCODE ){ + /* NOTE: Be sure to update mkopcodeh.tcl when adding or removing + ** cases from this switch! */ + switch( pOp->opcode ){ + case OP_Transaction: { + if( pOp->p2!=0 ) p->readOnly = 0; + /* fall thru */ + } + case OP_AutoCommit: + case OP_Savepoint: { + p->bIsReader = 1; + break; + } +#ifndef SQLITE_OMIT_WAL + case OP_Checkpoint: +#endif + case OP_Vacuum: + case OP_JournalMode: { + p->readOnly = 0; + p->bIsReader = 1; + break; + } +#ifndef SQLITE_OMIT_VIRTUALTABLE + case OP_VUpdate: { + if( pOp->p2>nMaxArgs ) nMaxArgs = pOp->p2; + break; + } + case OP_VFilter: { + int n; + assert( (pOp - p->aOp) >= 3 ); + assert( pOp[-1].opcode==OP_Integer ); + n = pOp[-1].p1; + if( n>nMaxArgs ) nMaxArgs = n; + break; + } +#endif + case OP_Next: + case OP_NextIfOpen: + case OP_SorterNext: { + pOp->p4.xAdvance = sqlite3BtreeNext; + pOp->p4type = P4_ADVANCE; + break; + } + case OP_Prev: + case OP_PrevIfOpen: { + pOp->p4.xAdvance = sqlite3BtreePrevious; + pOp->p4type = P4_ADVANCE; + break; + } + } + if( (sqlite3OpcodeProperty[pOp->opcode] & OPFLG_JUMP)!=0 && pOp->p2<0 ){ + assert( ADDR(pOp->p2)nLabel ); + pOp->p2 = aLabel[ADDR(pOp->p2)]; + } + } + if( pOp==p->aOp ) break; + pOp--; + } + sqlite3DbFree(p->db, pParse->aLabel); + pParse->aLabel = 0; + pParse->nLabel = 0; + *pMaxFuncArgs = nMaxArgs; + assert( p->bIsReader!=0 || DbMaskAllZero(p->btreeMask) ); +} + +/* +** Return the address of the next instruction to be inserted. +*/ +SQLITE_PRIVATE int sqlite3VdbeCurrentAddr(Vdbe *p){ + assert( p->magic==VDBE_MAGIC_INIT ); + return p->nOp; +} + +/* +** Verify that at least N opcode slots are available in p without +** having to malloc for more space (except when compiled using +** SQLITE_TEST_REALLOC_STRESS). This interface is used during testing +** to verify that certain calls to sqlite3VdbeAddOpList() can never +** fail due to a OOM fault and hence that the return value from +** sqlite3VdbeAddOpList() will always be non-NULL. +*/ +#if defined(SQLITE_DEBUG) && !defined(SQLITE_TEST_REALLOC_STRESS) +SQLITE_PRIVATE void sqlite3VdbeVerifyNoMallocRequired(Vdbe *p, int N){ + assert( p->nOp + N <= p->pParse->nOpAlloc ); +} +#endif + +/* +** This function returns a pointer to the array of opcodes associated with +** the Vdbe passed as the first argument. It is the callers responsibility +** to arrange for the returned array to be eventually freed using the +** vdbeFreeOpArray() function. +** +** Before returning, *pnOp is set to the number of entries in the returned +** array. Also, *pnMaxArg is set to the larger of its current value and +** the number of entries in the Vdbe.apArg[] array required to execute the +** returned program. +*/ +SQLITE_PRIVATE VdbeOp *sqlite3VdbeTakeOpArray(Vdbe *p, int *pnOp, int *pnMaxArg){ + VdbeOp *aOp = p->aOp; + assert( aOp && !p->db->mallocFailed ); + + /* Check that sqlite3VdbeUsesBtree() was not called on this VM */ + assert( DbMaskAllZero(p->btreeMask) ); + + resolveP2Values(p, pnMaxArg); + *pnOp = p->nOp; + p->aOp = 0; + return aOp; +} + +/* +** Add a whole list of operations to the operation stack. Return a +** pointer to the first operation inserted. +** +** Non-zero P2 arguments to jump instructions are automatically adjusted +** so that the jump target is relative to the first operation inserted. +*/ +SQLITE_PRIVATE VdbeOp *sqlite3VdbeAddOpList( + Vdbe *p, /* Add opcodes to the prepared statement */ + int nOp, /* Number of opcodes to add */ + VdbeOpList const *aOp, /* The opcodes to be added */ + int iLineno /* Source-file line number of first opcode */ +){ + int i; + VdbeOp *pOut, *pFirst; + assert( nOp>0 ); + assert( p->magic==VDBE_MAGIC_INIT ); + if( p->nOp + nOp > p->pParse->nOpAlloc && growOpArray(p, nOp) ){ + return 0; + } + pFirst = pOut = &p->aOp[p->nOp]; + for(i=0; iopcode = aOp->opcode; + pOut->p1 = aOp->p1; + pOut->p2 = aOp->p2; + assert( aOp->p2>=0 ); + if( (sqlite3OpcodeProperty[aOp->opcode] & OPFLG_JUMP)!=0 && aOp->p2>0 ){ + pOut->p2 += p->nOp; + } + pOut->p3 = aOp->p3; + pOut->p4type = P4_NOTUSED; + pOut->p4.p = 0; + pOut->p5 = 0; +#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS + pOut->zComment = 0; +#endif +#ifdef SQLITE_VDBE_COVERAGE + pOut->iSrcLine = iLineno+i; +#else + (void)iLineno; +#endif +#ifdef SQLITE_DEBUG + if( p->db->flags & SQLITE_VdbeAddopTrace ){ + sqlite3VdbePrintOp(0, i+p->nOp, &p->aOp[i+p->nOp]); + } +#endif + } + p->nOp += nOp; + return pFirst; +} + +#if defined(SQLITE_ENABLE_STMT_SCANSTATUS) +/* +** Add an entry to the array of counters managed by sqlite3_stmt_scanstatus(). +*/ +SQLITE_PRIVATE void sqlite3VdbeScanStatus( + Vdbe *p, /* VM to add scanstatus() to */ + int addrExplain, /* Address of OP_Explain (or 0) */ + int addrLoop, /* Address of loop counter */ + int addrVisit, /* Address of rows visited counter */ + LogEst nEst, /* Estimated number of output rows */ + const char *zName /* Name of table or index being scanned */ +){ + int nByte = (p->nScan+1) * sizeof(ScanStatus); + ScanStatus *aNew; + aNew = (ScanStatus*)sqlite3DbRealloc(p->db, p->aScan, nByte); + if( aNew ){ + ScanStatus *pNew = &aNew[p->nScan++]; + pNew->addrExplain = addrExplain; + pNew->addrLoop = addrLoop; + pNew->addrVisit = addrVisit; + pNew->nEst = nEst; + pNew->zName = sqlite3DbStrDup(p->db, zName); + p->aScan = aNew; + } +} +#endif + + +/* +** Change the value of the opcode, or P1, P2, P3, or P5 operands +** for a specific instruction. +*/ +SQLITE_PRIVATE void sqlite3VdbeChangeOpcode(Vdbe *p, u32 addr, u8 iNewOpcode){ + sqlite3VdbeGetOp(p,addr)->opcode = iNewOpcode; +} +SQLITE_PRIVATE void sqlite3VdbeChangeP1(Vdbe *p, u32 addr, int val){ + sqlite3VdbeGetOp(p,addr)->p1 = val; +} +SQLITE_PRIVATE void sqlite3VdbeChangeP2(Vdbe *p, u32 addr, int val){ + sqlite3VdbeGetOp(p,addr)->p2 = val; +} +SQLITE_PRIVATE void sqlite3VdbeChangeP3(Vdbe *p, u32 addr, int val){ + sqlite3VdbeGetOp(p,addr)->p3 = val; +} +SQLITE_PRIVATE void sqlite3VdbeChangeP5(Vdbe *p, u8 p5){ + assert( p->nOp>0 || p->db->mallocFailed ); + if( p->nOp>0 ) p->aOp[p->nOp-1].p5 = p5; +} + +/* +** Change the P2 operand of instruction addr so that it points to +** the address of the next instruction to be coded. +*/ +SQLITE_PRIVATE void sqlite3VdbeJumpHere(Vdbe *p, int addr){ + sqlite3VdbeChangeP2(p, addr, p->nOp); +} + + +/* +** If the input FuncDef structure is ephemeral, then free it. If +** the FuncDef is not ephermal, then do nothing. +*/ +static void freeEphemeralFunction(sqlite3 *db, FuncDef *pDef){ + if( (pDef->funcFlags & SQLITE_FUNC_EPHEM)!=0 ){ + sqlite3DbFree(db, pDef); + } +} + +static void vdbeFreeOpArray(sqlite3 *, Op *, int); + +/* +** Delete a P4 value if necessary. +*/ +static SQLITE_NOINLINE void freeP4Mem(sqlite3 *db, Mem *p){ + if( p->szMalloc ) sqlite3DbFree(db, p->zMalloc); + sqlite3DbFree(db, p); +} +static SQLITE_NOINLINE void freeP4FuncCtx(sqlite3 *db, sqlite3_context *p){ + freeEphemeralFunction(db, p->pFunc); + sqlite3DbFree(db, p); +} +static void freeP4(sqlite3 *db, int p4type, void *p4){ + assert( db ); + switch( p4type ){ + case P4_FUNCCTX: { + freeP4FuncCtx(db, (sqlite3_context*)p4); + break; + } + case P4_REAL: + case P4_INT64: + case P4_DYNAMIC: + case P4_INTARRAY: { + sqlite3DbFree(db, p4); + break; + } + case P4_KEYINFO: { + if( db->pnBytesFreed==0 ) sqlite3KeyInfoUnref((KeyInfo*)p4); + break; + } +#ifdef SQLITE_ENABLE_CURSOR_HINTS + case P4_EXPR: { + sqlite3ExprDelete(db, (Expr*)p4); + break; + } +#endif + case P4_MPRINTF: { + if( db->pnBytesFreed==0 ) sqlite3_free(p4); + break; + } + case P4_FUNCDEF: { + freeEphemeralFunction(db, (FuncDef*)p4); + break; + } + case P4_MEM: { + if( db->pnBytesFreed==0 ){ + sqlite3ValueFree((sqlite3_value*)p4); + }else{ + freeP4Mem(db, (Mem*)p4); + } + break; + } + case P4_VTAB : { + if( db->pnBytesFreed==0 ) sqlite3VtabUnlock((VTable *)p4); + break; + } + } +} + +/* +** Free the space allocated for aOp and any p4 values allocated for the +** opcodes contained within. If aOp is not NULL it is assumed to contain +** nOp entries. +*/ +static void vdbeFreeOpArray(sqlite3 *db, Op *aOp, int nOp){ + if( aOp ){ + Op *pOp; + for(pOp=aOp; pOp<&aOp[nOp]; pOp++){ + if( pOp->p4type ) freeP4(db, pOp->p4type, pOp->p4.p); +#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS + sqlite3DbFree(db, pOp->zComment); +#endif + } + } + sqlite3DbFree(db, aOp); +} + +/* +** Link the SubProgram object passed as the second argument into the linked +** list at Vdbe.pSubProgram. This list is used to delete all sub-program +** objects when the VM is no longer required. +*/ +SQLITE_PRIVATE void sqlite3VdbeLinkSubProgram(Vdbe *pVdbe, SubProgram *p){ + p->pNext = pVdbe->pProgram; + pVdbe->pProgram = p; +} + +/* +** Change the opcode at addr into OP_Noop +*/ +SQLITE_PRIVATE int sqlite3VdbeChangeToNoop(Vdbe *p, int addr){ + VdbeOp *pOp; + if( p->db->mallocFailed ) return 0; + assert( addr>=0 && addrnOp ); + pOp = &p->aOp[addr]; + freeP4(p->db, pOp->p4type, pOp->p4.p); + pOp->p4type = P4_NOTUSED; + pOp->p4.z = 0; + pOp->opcode = OP_Noop; + return 1; +} + +/* +** If the last opcode is "op" and it is not a jump destination, +** then remove it. Return true if and only if an opcode was removed. +*/ +SQLITE_PRIVATE int sqlite3VdbeDeletePriorOpcode(Vdbe *p, u8 op){ + if( p->nOp>0 && p->aOp[p->nOp-1].opcode==op ){ + return sqlite3VdbeChangeToNoop(p, p->nOp-1); + }else{ + return 0; + } +} + +/* +** Change the value of the P4 operand for a specific instruction. +** This routine is useful when a large program is loaded from a +** static array using sqlite3VdbeAddOpList but we want to make a +** few minor changes to the program. +** +** If n>=0 then the P4 operand is dynamic, meaning that a copy of +** the string is made into memory obtained from sqlite3_malloc(). +** A value of n==0 means copy bytes of zP4 up to and including the +** first null byte. If n>0 then copy n+1 bytes of zP4. +** +** Other values of n (P4_STATIC, P4_COLLSEQ etc.) indicate that zP4 points +** to a string or structure that is guaranteed to exist for the lifetime of +** the Vdbe. In these cases we can just copy the pointer. +** +** If addr<0 then change P4 on the most recently inserted instruction. +*/ +static void SQLITE_NOINLINE vdbeChangeP4Full( + Vdbe *p, + Op *pOp, + const char *zP4, + int n +){ + if( pOp->p4type ){ + freeP4(p->db, pOp->p4type, pOp->p4.p); + pOp->p4type = 0; + pOp->p4.p = 0; + } + if( n<0 ){ + sqlite3VdbeChangeP4(p, (int)(pOp - p->aOp), zP4, n); + }else{ + if( n==0 ) n = sqlite3Strlen30(zP4); + pOp->p4.z = sqlite3DbStrNDup(p->db, zP4, n); + pOp->p4type = P4_DYNAMIC; + } +} +SQLITE_PRIVATE void sqlite3VdbeChangeP4(Vdbe *p, int addr, const char *zP4, int n){ + Op *pOp; + sqlite3 *db; + assert( p!=0 ); + db = p->db; + assert( p->magic==VDBE_MAGIC_INIT ); + assert( p->aOp!=0 || db->mallocFailed ); + if( db->mallocFailed ){ + if( n!=P4_VTAB ) freeP4(db, n, (void*)*(char**)&zP4); + return; + } + assert( p->nOp>0 ); + assert( addrnOp ); + if( addr<0 ){ + addr = p->nOp - 1; + } + pOp = &p->aOp[addr]; + if( n>=0 || pOp->p4type ){ + vdbeChangeP4Full(p, pOp, zP4, n); + return; + } + if( n==P4_INT32 ){ + /* Note: this cast is safe, because the origin data point was an int + ** that was cast to a (const char *). */ + pOp->p4.i = SQLITE_PTR_TO_INT(zP4); + pOp->p4type = P4_INT32; + }else if( zP4!=0 ){ + assert( n<0 ); + pOp->p4.p = (void*)zP4; + pOp->p4type = (signed char)n; + if( n==P4_VTAB ) sqlite3VtabLock((VTable*)zP4); + } +} + +/* +** Set the P4 on the most recently added opcode to the KeyInfo for the +** index given. +*/ +SQLITE_PRIVATE void sqlite3VdbeSetP4KeyInfo(Parse *pParse, Index *pIdx){ + Vdbe *v = pParse->pVdbe; + assert( v!=0 ); + assert( pIdx!=0 ); + sqlite3VdbeChangeP4(v, -1, (char*)sqlite3KeyInfoOfIndex(pParse, pIdx), + P4_KEYINFO); +} + +#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS +/* +** Change the comment on the most recently coded instruction. Or +** insert a No-op and add the comment to that new instruction. This +** makes the code easier to read during debugging. None of this happens +** in a production build. +*/ +static void vdbeVComment(Vdbe *p, const char *zFormat, va_list ap){ + assert( p->nOp>0 || p->aOp==0 ); + assert( p->aOp==0 || p->aOp[p->nOp-1].zComment==0 || p->db->mallocFailed ); + if( p->nOp ){ + assert( p->aOp ); + sqlite3DbFree(p->db, p->aOp[p->nOp-1].zComment); + p->aOp[p->nOp-1].zComment = sqlite3VMPrintf(p->db, zFormat, ap); + } +} +SQLITE_PRIVATE void sqlite3VdbeComment(Vdbe *p, const char *zFormat, ...){ + va_list ap; + if( p ){ + va_start(ap, zFormat); + vdbeVComment(p, zFormat, ap); + va_end(ap); + } +} +SQLITE_PRIVATE void sqlite3VdbeNoopComment(Vdbe *p, const char *zFormat, ...){ + va_list ap; + if( p ){ + sqlite3VdbeAddOp0(p, OP_Noop); + va_start(ap, zFormat); + vdbeVComment(p, zFormat, ap); + va_end(ap); + } +} +#endif /* NDEBUG */ + +#ifdef SQLITE_VDBE_COVERAGE +/* +** Set the value if the iSrcLine field for the previously coded instruction. +*/ +SQLITE_PRIVATE void sqlite3VdbeSetLineNumber(Vdbe *v, int iLine){ + sqlite3VdbeGetOp(v,-1)->iSrcLine = iLine; +} +#endif /* SQLITE_VDBE_COVERAGE */ + +/* +** Return the opcode for a given address. If the address is -1, then +** return the most recently inserted opcode. +** +** If a memory allocation error has occurred prior to the calling of this +** routine, then a pointer to a dummy VdbeOp will be returned. That opcode +** is readable but not writable, though it is cast to a writable value. +** The return of a dummy opcode allows the call to continue functioning +** after an OOM fault without having to check to see if the return from +** this routine is a valid pointer. But because the dummy.opcode is 0, +** dummy will never be written to. This is verified by code inspection and +** by running with Valgrind. +*/ +SQLITE_PRIVATE VdbeOp *sqlite3VdbeGetOp(Vdbe *p, int addr){ + /* C89 specifies that the constant "dummy" will be initialized to all + ** zeros, which is correct. MSVC generates a warning, nevertheless. */ + static VdbeOp dummy; /* Ignore the MSVC warning about no initializer */ + assert( p->magic==VDBE_MAGIC_INIT ); + if( addr<0 ){ + addr = p->nOp - 1; + } + assert( (addr>=0 && addrnOp) || p->db->mallocFailed ); + if( p->db->mallocFailed ){ + return (VdbeOp*)&dummy; + }else{ + return &p->aOp[addr]; + } +} + +#if defined(SQLITE_ENABLE_EXPLAIN_COMMENTS) +/* +** Return an integer value for one of the parameters to the opcode pOp +** determined by character c. +*/ +static int translateP(char c, const Op *pOp){ + if( c=='1' ) return pOp->p1; + if( c=='2' ) return pOp->p2; + if( c=='3' ) return pOp->p3; + if( c=='4' ) return pOp->p4.i; + return pOp->p5; +} + +/* +** Compute a string for the "comment" field of a VDBE opcode listing. +** +** The Synopsis: field in comments in the vdbe.c source file gets converted +** to an extra string that is appended to the sqlite3OpcodeName(). In the +** absence of other comments, this synopsis becomes the comment on the opcode. +** Some translation occurs: +** +** "PX" -> "r[X]" +** "PX@PY" -> "r[X..X+Y-1]" or "r[x]" if y is 0 or 1 +** "PX@PY+1" -> "r[X..X+Y]" or "r[x]" if y is 0 +** "PY..PY" -> "r[X..Y]" or "r[x]" if y<=x +*/ +static int displayComment( + const Op *pOp, /* The opcode to be commented */ + const char *zP4, /* Previously obtained value for P4 */ + char *zTemp, /* Write result here */ + int nTemp /* Space available in zTemp[] */ +){ + const char *zOpName; + const char *zSynopsis; + int nOpName; + int ii, jj; + char zAlt[50]; + zOpName = sqlite3OpcodeName(pOp->opcode); + nOpName = sqlite3Strlen30(zOpName); + if( zOpName[nOpName+1] ){ + int seenCom = 0; + char c; + zSynopsis = zOpName += nOpName + 1; + if( strncmp(zSynopsis,"IF ",3)==0 ){ + if( pOp->p5 & SQLITE_STOREP2 ){ + sqlite3_snprintf(sizeof(zAlt), zAlt, "r[P2] = (%s)", zSynopsis+3); + }else{ + sqlite3_snprintf(sizeof(zAlt), zAlt, "if %s goto P2", zSynopsis+3); + } + zSynopsis = zAlt; + } + for(ii=jj=0; jjzComment); + seenCom = 1; + }else{ + int v1 = translateP(c, pOp); + int v2; + sqlite3_snprintf(nTemp-jj, zTemp+jj, "%d", v1); + if( strncmp(zSynopsis+ii+1, "@P", 2)==0 ){ + ii += 3; + jj += sqlite3Strlen30(zTemp+jj); + v2 = translateP(zSynopsis[ii], pOp); + if( strncmp(zSynopsis+ii+1,"+1",2)==0 ){ + ii += 2; + v2++; + } + if( v2>1 ){ + sqlite3_snprintf(nTemp-jj, zTemp+jj, "..%d", v1+v2-1); + } + }else if( strncmp(zSynopsis+ii+1, "..P3", 4)==0 && pOp->p3==0 ){ + ii += 4; + } + } + jj += sqlite3Strlen30(zTemp+jj); + }else{ + zTemp[jj++] = c; + } + } + if( !seenCom && jjzComment ){ + sqlite3_snprintf(nTemp-jj, zTemp+jj, "; %s", pOp->zComment); + jj += sqlite3Strlen30(zTemp+jj); + } + if( jjzComment ){ + sqlite3_snprintf(nTemp, zTemp, "%s", pOp->zComment); + jj = sqlite3Strlen30(zTemp); + }else{ + zTemp[0] = 0; + jj = 0; + } + return jj; +} +#endif /* SQLITE_DEBUG */ + +#if VDBE_DISPLAY_P4 && defined(SQLITE_ENABLE_CURSOR_HINTS) +/* +** Translate the P4.pExpr value for an OP_CursorHint opcode into text +** that can be displayed in the P4 column of EXPLAIN output. +*/ +static void displayP4Expr(StrAccum *p, Expr *pExpr){ + const char *zOp = 0; + switch( pExpr->op ){ + case TK_STRING: + sqlite3XPrintf(p, "%Q", pExpr->u.zToken); + break; + case TK_INTEGER: + sqlite3XPrintf(p, "%d", pExpr->u.iValue); + break; + case TK_NULL: + sqlite3XPrintf(p, "NULL"); + break; + case TK_REGISTER: { + sqlite3XPrintf(p, "r[%d]", pExpr->iTable); + break; + } + case TK_COLUMN: { + if( pExpr->iColumn<0 ){ + sqlite3XPrintf(p, "rowid"); + }else{ + sqlite3XPrintf(p, "c%d", (int)pExpr->iColumn); + } + break; + } + case TK_LT: zOp = "LT"; break; + case TK_LE: zOp = "LE"; break; + case TK_GT: zOp = "GT"; break; + case TK_GE: zOp = "GE"; break; + case TK_NE: zOp = "NE"; break; + case TK_EQ: zOp = "EQ"; break; + case TK_IS: zOp = "IS"; break; + case TK_ISNOT: zOp = "ISNOT"; break; + case TK_AND: zOp = "AND"; break; + case TK_OR: zOp = "OR"; break; + case TK_PLUS: zOp = "ADD"; break; + case TK_STAR: zOp = "MUL"; break; + case TK_MINUS: zOp = "SUB"; break; + case TK_REM: zOp = "REM"; break; + case TK_BITAND: zOp = "BITAND"; break; + case TK_BITOR: zOp = "BITOR"; break; + case TK_SLASH: zOp = "DIV"; break; + case TK_LSHIFT: zOp = "LSHIFT"; break; + case TK_RSHIFT: zOp = "RSHIFT"; break; + case TK_CONCAT: zOp = "CONCAT"; break; + case TK_UMINUS: zOp = "MINUS"; break; + case TK_UPLUS: zOp = "PLUS"; break; + case TK_BITNOT: zOp = "BITNOT"; break; + case TK_NOT: zOp = "NOT"; break; + case TK_ISNULL: zOp = "ISNULL"; break; + case TK_NOTNULL: zOp = "NOTNULL"; break; + + default: + sqlite3XPrintf(p, "%s", "expr"); + break; + } + + if( zOp ){ + sqlite3XPrintf(p, "%s(", zOp); + displayP4Expr(p, pExpr->pLeft); + if( pExpr->pRight ){ + sqlite3StrAccumAppend(p, ",", 1); + displayP4Expr(p, pExpr->pRight); + } + sqlite3StrAccumAppend(p, ")", 1); + } +} +#endif /* VDBE_DISPLAY_P4 && defined(SQLITE_ENABLE_CURSOR_HINTS) */ + + +#if VDBE_DISPLAY_P4 +/* +** Compute a string that describes the P4 parameter for an opcode. +** Use zTemp for any required temporary buffer space. +*/ +static char *displayP4(Op *pOp, char *zTemp, int nTemp){ + char *zP4 = zTemp; + StrAccum x; + assert( nTemp>=20 ); + sqlite3StrAccumInit(&x, 0, zTemp, nTemp, 0); + switch( pOp->p4type ){ + case P4_KEYINFO: { + int j; + KeyInfo *pKeyInfo = pOp->p4.pKeyInfo; + assert( pKeyInfo->aSortOrder!=0 ); + sqlite3XPrintf(&x, "k(%d", pKeyInfo->nField); + for(j=0; jnField; j++){ + CollSeq *pColl = pKeyInfo->aColl[j]; + const char *zColl = pColl ? pColl->zName : ""; + if( strcmp(zColl, "BINARY")==0 ) zColl = "B"; + sqlite3XPrintf(&x, ",%s%s", pKeyInfo->aSortOrder[j] ? "-" : "", zColl); + } + sqlite3StrAccumAppend(&x, ")", 1); + break; + } +#ifdef SQLITE_ENABLE_CURSOR_HINTS + case P4_EXPR: { + displayP4Expr(&x, pOp->p4.pExpr); + break; + } +#endif + case P4_COLLSEQ: { + CollSeq *pColl = pOp->p4.pColl; + sqlite3XPrintf(&x, "(%.20s)", pColl->zName); + break; + } + case P4_FUNCDEF: { + FuncDef *pDef = pOp->p4.pFunc; + sqlite3XPrintf(&x, "%s(%d)", pDef->zName, pDef->nArg); + break; + } +#ifdef SQLITE_DEBUG + case P4_FUNCCTX: { + FuncDef *pDef = pOp->p4.pCtx->pFunc; + sqlite3XPrintf(&x, "%s(%d)", pDef->zName, pDef->nArg); + break; + } +#endif + case P4_INT64: { + sqlite3XPrintf(&x, "%lld", *pOp->p4.pI64); + break; + } + case P4_INT32: { + sqlite3XPrintf(&x, "%d", pOp->p4.i); + break; + } + case P4_REAL: { + sqlite3XPrintf(&x, "%.16g", *pOp->p4.pReal); + break; + } + case P4_MEM: { + Mem *pMem = pOp->p4.pMem; + if( pMem->flags & MEM_Str ){ + zP4 = pMem->z; + }else if( pMem->flags & MEM_Int ){ + sqlite3XPrintf(&x, "%lld", pMem->u.i); + }else if( pMem->flags & MEM_Real ){ + sqlite3XPrintf(&x, "%.16g", pMem->u.r); + }else if( pMem->flags & MEM_Null ){ + zP4 = "NULL"; + }else{ + assert( pMem->flags & MEM_Blob ); + zP4 = "(blob)"; + } + break; + } +#ifndef SQLITE_OMIT_VIRTUALTABLE + case P4_VTAB: { + sqlite3_vtab *pVtab = pOp->p4.pVtab->pVtab; + sqlite3XPrintf(&x, "vtab:%p", pVtab); + break; + } +#endif + case P4_INTARRAY: { + int i; + int *ai = pOp->p4.ai; + int n = ai[0]; /* The first element of an INTARRAY is always the + ** count of the number of elements to follow */ + for(i=1; ip4.pTab->zName); + break; + } + default: { + zP4 = pOp->p4.z; + if( zP4==0 ){ + zP4 = zTemp; + zTemp[0] = 0; + } + } + } + sqlite3StrAccumFinish(&x); + assert( zP4!=0 ); + return zP4; +} +#endif /* VDBE_DISPLAY_P4 */ + +/* +** Declare to the Vdbe that the BTree object at db->aDb[i] is used. +** +** The prepared statements need to know in advance the complete set of +** attached databases that will be use. A mask of these databases +** is maintained in p->btreeMask. The p->lockMask value is the subset of +** p->btreeMask of databases that will require a lock. +*/ +SQLITE_PRIVATE void sqlite3VdbeUsesBtree(Vdbe *p, int i){ + assert( i>=0 && idb->nDb && i<(int)sizeof(yDbMask)*8 ); + assert( i<(int)sizeof(p->btreeMask)*8 ); + DbMaskSet(p->btreeMask, i); + if( i!=1 && sqlite3BtreeSharable(p->db->aDb[i].pBt) ){ + DbMaskSet(p->lockMask, i); + } +} + +#if !defined(SQLITE_OMIT_SHARED_CACHE) +/* +** If SQLite is compiled to support shared-cache mode and to be threadsafe, +** this routine obtains the mutex associated with each BtShared structure +** that may be accessed by the VM passed as an argument. In doing so it also +** sets the BtShared.db member of each of the BtShared structures, ensuring +** that the correct busy-handler callback is invoked if required. +** +** If SQLite is not threadsafe but does support shared-cache mode, then +** sqlite3BtreeEnter() is invoked to set the BtShared.db variables +** of all of BtShared structures accessible via the database handle +** associated with the VM. +** +** If SQLite is not threadsafe and does not support shared-cache mode, this +** function is a no-op. +** +** The p->btreeMask field is a bitmask of all btrees that the prepared +** statement p will ever use. Let N be the number of bits in p->btreeMask +** corresponding to btrees that use shared cache. Then the runtime of +** this routine is N*N. But as N is rarely more than 1, this should not +** be a problem. +*/ +SQLITE_PRIVATE void sqlite3VdbeEnter(Vdbe *p){ + int i; + sqlite3 *db; + Db *aDb; + int nDb; + if( DbMaskAllZero(p->lockMask) ) return; /* The common case */ + db = p->db; + aDb = db->aDb; + nDb = db->nDb; + for(i=0; ilockMask,i) && ALWAYS(aDb[i].pBt!=0) ){ + sqlite3BtreeEnter(aDb[i].pBt); + } + } +} +#endif + +#if !defined(SQLITE_OMIT_SHARED_CACHE) && SQLITE_THREADSAFE>0 +/* +** Unlock all of the btrees previously locked by a call to sqlite3VdbeEnter(). +*/ +static SQLITE_NOINLINE void vdbeLeave(Vdbe *p){ + int i; + sqlite3 *db; + Db *aDb; + int nDb; + db = p->db; + aDb = db->aDb; + nDb = db->nDb; + for(i=0; ilockMask,i) && ALWAYS(aDb[i].pBt!=0) ){ + sqlite3BtreeLeave(aDb[i].pBt); + } + } +} +SQLITE_PRIVATE void sqlite3VdbeLeave(Vdbe *p){ + if( DbMaskAllZero(p->lockMask) ) return; /* The common case */ + vdbeLeave(p); +} +#endif + +#if defined(VDBE_PROFILE) || defined(SQLITE_DEBUG) +/* +** Print a single opcode. This routine is used for debugging only. +*/ +SQLITE_PRIVATE void sqlite3VdbePrintOp(FILE *pOut, int pc, Op *pOp){ + char *zP4; + char zPtr[50]; + char zCom[100]; + static const char *zFormat1 = "%4d %-13s %4d %4d %4d %-13s %.2X %s\n"; + if( pOut==0 ) pOut = stdout; + zP4 = displayP4(pOp, zPtr, sizeof(zPtr)); +#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS + displayComment(pOp, zP4, zCom, sizeof(zCom)); +#else + zCom[0] = 0; +#endif + /* NB: The sqlite3OpcodeName() function is implemented by code created + ** by the mkopcodeh.awk and mkopcodec.awk scripts which extract the + ** information from the vdbe.c source text */ + fprintf(pOut, zFormat1, pc, + sqlite3OpcodeName(pOp->opcode), pOp->p1, pOp->p2, pOp->p3, zP4, pOp->p5, + zCom + ); + fflush(pOut); +} +#endif + +/* +** Initialize an array of N Mem element. +*/ +static void initMemArray(Mem *p, int N, sqlite3 *db, u16 flags){ + while( (N--)>0 ){ + p->db = db; + p->flags = flags; + p->szMalloc = 0; +#ifdef SQLITE_DEBUG + p->pScopyFrom = 0; +#endif + p++; + } +} + +/* +** Release an array of N Mem elements +*/ +static void releaseMemArray(Mem *p, int N){ + if( p && N ){ + Mem *pEnd = &p[N]; + sqlite3 *db = p->db; + if( db->pnBytesFreed ){ + do{ + if( p->szMalloc ) sqlite3DbFree(db, p->zMalloc); + }while( (++p)flags & MEM_Agg ); + testcase( p->flags & MEM_Dyn ); + testcase( p->flags & MEM_Frame ); + testcase( p->flags & MEM_RowSet ); + if( p->flags&(MEM_Agg|MEM_Dyn|MEM_Frame|MEM_RowSet) ){ + sqlite3VdbeMemRelease(p); + }else if( p->szMalloc ){ + sqlite3DbFree(db, p->zMalloc); + p->szMalloc = 0; + } + + p->flags = MEM_Undefined; + }while( (++p)nChildMem]; + for(i=0; inChildCsr; i++){ + sqlite3VdbeFreeCursor(p->v, apCsr[i]); + } + releaseMemArray(aMem, p->nChildMem); + sqlite3VdbeDeleteAuxData(p->v->db, &p->pAuxData, -1, 0); + sqlite3DbFree(p->v->db, p); +} + +#ifndef SQLITE_OMIT_EXPLAIN +/* +** Give a listing of the program in the virtual machine. +** +** The interface is the same as sqlite3VdbeExec(). But instead of +** running the code, it invokes the callback once for each instruction. +** This feature is used to implement "EXPLAIN". +** +** When p->explain==1, each instruction is listed. When +** 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; /* 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; /* 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->aMem[1]; /* First Mem of result set */ + + assert( p->explain ); + assert( p->magic==VDBE_MAGIC_RUN ); + assert( p->rc==SQLITE_OK || p->rc==SQLITE_BUSY || p->rc==SQLITE_NOMEM ); + + /* Even though this opcode does not use dynamic strings for + ** the result, result columns may become dynamic if the user calls + ** sqlite3_column_text16(), causing a translation to UTF-16 encoding. + */ + releaseMemArray(pMem, 8); + p->pResultSet = 0; + + if( p->rc==SQLITE_NOMEM_BKPT ){ + /* This happens if a malloc() inside a call to sqlite3_column_text() or + ** sqlite3_column_text16() failed. */ + sqlite3OomFault(db); + return SQLITE_ERROR; + } + + /* 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; + } + for(i=0; inOp; + } + } + + do{ + i = p->pc++; + }while( iexplain==2 && p->aOp[i].opcode!=OP_Explain ); + if( i>=nRow ){ + p->rc = SQLITE_OK; + rc = SQLITE_DONE; + }else if( db->u1.isInterrupted ){ + p->rc = SQLITE_INTERRUPT; + rc = SQLITE_ERROR; + sqlite3VdbeError(p, sqlite3ErrStr(p->rc)); + }else{ + char *zP4; + 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++){ + i -= apSub[j]->nOp; + } + pOp = &apSub[j]->aOp[i]; + } + if( p->explain==1 ){ + pMem->flags = MEM_Int; + pMem->u.i = i; /* Program counter */ + pMem++; + + pMem->flags = MEM_Static|MEM_Str|MEM_Term; + pMem->z = (char*)sqlite3OpcodeName(pOp->opcode); /* Opcode */ + assert( pMem->z!=0 ); + pMem->n = sqlite3Strlen30(pMem->z); + 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; + for(j=0; jp4.pProgram ) break; + } + if( j==nSub && SQLITE_OK==sqlite3VdbeMemGrow(pSub, nByte, nSub!=0) ){ + apSub = (SubProgram **)pSub->z; + apSub[nSub++] = pOp->p4.pProgram; + pSub->flags |= MEM_Blob; + pSub->n = nSub*sizeof(SubProgram*); + } + } + } + + pMem->flags = MEM_Int; + pMem->u.i = pOp->p1; /* P1 */ + pMem++; + + pMem->flags = MEM_Int; + pMem->u.i = pOp->p2; /* P2 */ + pMem++; + + pMem->flags = MEM_Int; + pMem->u.i = pOp->p3; /* P3 */ + pMem++; + + if( sqlite3VdbeMemClearAndResize(pMem, 100) ){ /* P4 */ + assert( p->db->mallocFailed ); + return SQLITE_ERROR; + } + pMem->flags = MEM_Str|MEM_Term; + zP4 = displayP4(pOp, pMem->z, pMem->szMalloc); + if( zP4!=pMem->z ){ + pMem->n = 0; + sqlite3VdbeMemSetStr(pMem, zP4, -1, SQLITE_UTF8, 0); + }else{ + assert( pMem->z!=0 ); + pMem->n = sqlite3Strlen30(pMem->z); + pMem->enc = SQLITE_UTF8; + } + pMem++; + + if( p->explain==1 ){ + if( sqlite3VdbeMemClearAndResize(pMem, 4) ){ + assert( p->db->mallocFailed ); + return SQLITE_ERROR; + } + pMem->flags = MEM_Str|MEM_Term; + pMem->n = 2; + sqlite3_snprintf(3, pMem->z, "%.2x", pOp->p5); /* P5 */ + pMem->enc = SQLITE_UTF8; + pMem++; + +#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS + if( sqlite3VdbeMemClearAndResize(pMem, 500) ){ + assert( p->db->mallocFailed ); + return SQLITE_ERROR; + } + pMem->flags = MEM_Str|MEM_Term; + pMem->n = displayComment(pOp, zP4, pMem->z, 500); + pMem->enc = SQLITE_UTF8; +#else + pMem->flags = MEM_Null; /* Comment */ +#endif + } + + p->nResColumn = 8 - 4*(p->explain-1); + p->pResultSet = &p->aMem[1]; + p->rc = SQLITE_OK; + rc = SQLITE_ROW; + } + return rc; +} +#endif /* SQLITE_OMIT_EXPLAIN */ + +#ifdef SQLITE_DEBUG +/* +** Print the SQL that was used to generate a VDBE program. +*/ +SQLITE_PRIVATE void sqlite3VdbePrintSql(Vdbe *p){ + const char *z = 0; + if( p->zSql ){ + z = p->zSql; + }else if( p->nOp>=1 ){ + const VdbeOp *pOp = &p->aOp[0]; + if( pOp->opcode==OP_Init && pOp->p4.z!=0 ){ + z = pOp->p4.z; + while( sqlite3Isspace(*z) ) z++; + } + } + if( z ) printf("SQL: [%s]\n", z); +} +#endif + +#if !defined(SQLITE_OMIT_TRACE) && defined(SQLITE_ENABLE_IOTRACE) +/* +** Print an IOTRACE message showing SQL content. +*/ +SQLITE_PRIVATE void sqlite3VdbeIOTraceSql(Vdbe *p){ + int nOp = p->nOp; + VdbeOp *pOp; + if( sqlite3IoTrace==0 ) return; + if( nOp<1 ) return; + pOp = &p->aOp[0]; + if( pOp->opcode==OP_Init && pOp->p4.z!=0 ){ + int i, j; + char z[1000]; + sqlite3_snprintf(sizeof(z), z, "%s", pOp->p4.z); + for(i=0; sqlite3Isspace(z[i]); i++){} + for(j=0; z[i]; i++){ + if( sqlite3Isspace(z[i]) ){ + if( z[i-1]!=' ' ){ + z[j++] = ' '; + } + }else{ + z[j++] = z[i]; + } + } + z[j] = 0; + sqlite3IoTrace("SQL %s\n", z); + } +} +#endif /* !SQLITE_OMIT_TRACE && SQLITE_ENABLE_IOTRACE */ + +/* An instance of this object describes bulk memory available for use +** by subcomponents of a prepared statement. Space is allocated out +** of a ReusableSpace object by the allocSpace() routine below. +*/ +struct ReusableSpace { + u8 *pSpace; /* Available memory */ + int nFree; /* Bytes of available memory */ + int nNeeded; /* Total bytes that could not be allocated */ +}; + +/* Try to allocate nByte bytes of 8-byte aligned bulk memory for pBuf +** from the ReusableSpace object. Return a pointer to the allocated +** memory on success. If insufficient memory is available in the +** ReusableSpace object, increase the ReusableSpace.nNeeded +** value by the amount needed and return NULL. +** +** If pBuf is not initially NULL, that means that the memory has already +** been allocated by a prior call to this routine, so just return a copy +** of pBuf and leave ReusableSpace unchanged. +** +** This allocator is employed to repurpose unused slots at the end of the +** opcode array of prepared state for other memory needs of the prepared +** statement. +*/ +static void *allocSpace( + struct ReusableSpace *p, /* Bulk memory available for allocation */ + void *pBuf, /* Pointer to a prior allocation */ + int nByte /* Bytes of memory needed */ +){ + assert( EIGHT_BYTE_ALIGNMENT(p->pSpace) ); + if( pBuf==0 ){ + nByte = ROUND8(nByte); + if( nByte <= p->nFree ){ + p->nFree -= nByte; + pBuf = &p->pSpace[p->nFree]; + }else{ + p->nNeeded += nByte; + } + } + assert( EIGHT_BYTE_ALIGNMENT(pBuf) ); + return pBuf; +} + +/* +** Rewind the VDBE back to the beginning in preparation for +** running it. +*/ +SQLITE_PRIVATE void sqlite3VdbeRewind(Vdbe *p){ +#if defined(SQLITE_DEBUG) || defined(VDBE_PROFILE) + int i; +#endif + assert( p!=0 ); + assert( p->magic==VDBE_MAGIC_INIT || p->magic==VDBE_MAGIC_RESET ); + + /* There should be at least one opcode. + */ + assert( p->nOp>0 ); + + /* Set the magic to VDBE_MAGIC_RUN sooner rather than later. */ + p->magic = VDBE_MAGIC_RUN; + +#ifdef SQLITE_DEBUG + for(i=0; inMem; i++){ + assert( p->aMem[i].db==p->db ); + } +#endif + p->pc = -1; + p->rc = SQLITE_OK; + p->errorAction = OE_Abort; + p->nChange = 0; + p->cacheCtr = 1; + p->minWriteFileFormat = 255; + p->iStatement = 0; + p->nFkConstraint = 0; +#ifdef VDBE_PROFILE + for(i=0; inOp; i++){ + p->aOp[i].cnt = 0; + p->aOp[i].cycles = 0; + } +#endif +} + +/* +** Prepare a virtual machine for execution for the first time after +** creating the virtual machine. This involves things such +** as allocating registers and initializing the program counter. +** After the VDBE has be prepped, it can be executed by one or more +** calls to sqlite3VdbeExec(). +** +** This function may be called exactly once on each virtual machine. +** After this routine is called the VM has been "packaged" and is ready +** to run. After this routine is called, further calls to +** sqlite3VdbeAddOp() functions are prohibited. This routine disconnects +** the Vdbe from the Parse object that helped generate it so that the +** the Vdbe becomes an independent entity and the Parse object can be +** destroyed. +** +** Use the sqlite3VdbeRewind() procedure to restore a virtual machine back +** to its initial state after it has been run. +*/ +SQLITE_PRIVATE void sqlite3VdbeMakeReady( + Vdbe *p, /* The VDBE */ + Parse *pParse /* Parsing context */ +){ + sqlite3 *db; /* The database connection */ + int nVar; /* Number of parameters */ + int nMem; /* Number of VM memory registers */ + int nCursor; /* Number of cursors required */ + int nArg; /* Number of arguments in subprograms */ + int n; /* Loop counter */ + struct ReusableSpace x; /* Reusable bulk memory */ + + assert( p!=0 ); + assert( p->nOp>0 ); + assert( pParse!=0 ); + assert( p->magic==VDBE_MAGIC_INIT ); + assert( pParse==p->pParse ); + db = p->db; + assert( db->mallocFailed==0 ); + nVar = pParse->nVar; + nMem = pParse->nMem; + nCursor = pParse->nTab; + nArg = pParse->nMaxArg; + + /* Each cursor uses a memory cell. The first cursor (cursor 0) can + ** use aMem[0] which is not otherwise used by the VDBE program. Allocate + ** space at the end of aMem[] for cursors 1 and greater. + ** See also: allocateCursor(). + */ + nMem += nCursor; + if( nCursor==0 && nMem>0 ) nMem++; /* Space for aMem[0] even if not used */ + + /* Figure out how much reusable memory is available at the end of the + ** opcode array. This extra memory will be reallocated for other elements + ** of the prepared statement. + */ + n = ROUND8(sizeof(Op)*p->nOp); /* Bytes of opcode memory used */ + x.pSpace = &((u8*)p->aOp)[n]; /* Unused opcode memory */ + assert( EIGHT_BYTE_ALIGNMENT(x.pSpace) ); + x.nFree = ROUNDDOWN8(pParse->szOpAlloc - n); /* Bytes of unused memory */ + assert( x.nFree>=0 ); + assert( EIGHT_BYTE_ALIGNMENT(&x.pSpace[x.nFree]) ); + + resolveP2Values(p, &nArg); + p->usesStmtJournal = (u8)(pParse->isMultiWrite && pParse->mayAbort); + if( pParse->explain && nMem<10 ){ + nMem = 10; + } + p->expired = 0; + + /* Memory for registers, parameters, cursor, etc, is allocated in one or two + ** passes. On the first pass, we try to reuse unused memory 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 remainder using a fresh memory allocation. + ** + ** This two-pass approach that reuses as much memory as possible from + ** the leftover memory at the end of the opcode array. This can significantly + ** reduce the amount of memory held by a prepared statement. + */ + do { + x.nNeeded = 0; + p->aMem = allocSpace(&x, p->aMem, nMem*sizeof(Mem)); + p->aVar = allocSpace(&x, p->aVar, nVar*sizeof(Mem)); + p->apArg = allocSpace(&x, p->apArg, nArg*sizeof(Mem*)); + p->apCsr = allocSpace(&x, p->apCsr, nCursor*sizeof(VdbeCursor*)); +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS + p->anExec = allocSpace(&x, p->anExec, p->nOp*sizeof(i64)); +#endif + if( x.nNeeded==0 ) break; + x.pSpace = p->pFree = sqlite3DbMallocRawNN(db, x.nNeeded); + x.nFree = x.nNeeded; + }while( !db->mallocFailed ); + + p->nzVar = pParse->nzVar; + p->azVar = pParse->azVar; + pParse->nzVar = 0; + pParse->azVar = 0; + p->explain = pParse->explain; + if( db->mallocFailed ){ + p->nVar = 0; + p->nCursor = 0; + p->nMem = 0; + }else{ + p->nCursor = nCursor; + p->nVar = (ynVar)nVar; + initMemArray(p->aVar, nVar, db, MEM_Null); + p->nMem = nMem; + initMemArray(p->aMem, nMem, db, MEM_Undefined); + memset(p->apCsr, 0, nCursor*sizeof(VdbeCursor*)); +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS + memset(p->anExec, 0, p->nOp*sizeof(i64)); +#endif + } + sqlite3VdbeRewind(p); +} + +/* +** Close a VDBE cursor and release all the resources that cursor +** happens to hold. +*/ +SQLITE_PRIVATE void sqlite3VdbeFreeCursor(Vdbe *p, VdbeCursor *pCx){ + if( pCx==0 ){ + return; + } + assert( pCx->pBt==0 || pCx->eCurType==CURTYPE_BTREE ); + switch( pCx->eCurType ){ + case CURTYPE_SORTER: { + sqlite3VdbeSorterClose(p->db, pCx); + break; + } + case CURTYPE_BTREE: { + if( pCx->pBt ){ + sqlite3BtreeClose(pCx->pBt); + /* The pCx->pCursor will be close automatically, if it exists, by + ** the call above. */ + }else{ + assert( pCx->uc.pCursor!=0 ); + sqlite3BtreeCloseCursor(pCx->uc.pCursor); + } + break; + } +#ifndef SQLITE_OMIT_VIRTUALTABLE + case CURTYPE_VTAB: { + sqlite3_vtab_cursor *pVCur = pCx->uc.pVCur; + const sqlite3_module *pModule = pVCur->pVtab->pModule; + assert( pVCur->pVtab->nRef>0 ); + pVCur->pVtab->nRef--; + pModule->xClose(pVCur); + break; + } +#endif + } +} + +/* +** Close all cursors in the current frame. +*/ +static void closeCursorsInFrame(Vdbe *p){ + if( p->apCsr ){ + int i; + for(i=0; inCursor; i++){ + VdbeCursor *pC = p->apCsr[i]; + if( pC ){ + sqlite3VdbeFreeCursor(p, pC); + p->apCsr[i] = 0; + } + } + } +} + +/* +** Copy the values stored in the VdbeFrame structure to its Vdbe. This +** is used, for example, when a trigger sub-program is halted to restore +** control to the main program. +*/ +SQLITE_PRIVATE int sqlite3VdbeFrameRestore(VdbeFrame *pFrame){ + Vdbe *v = pFrame->v; + closeCursorsInFrame(v); +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS + v->anExec = pFrame->anExec; +#endif + v->aOp = pFrame->aOp; + v->nOp = pFrame->nOp; + v->aMem = pFrame->aMem; + v->nMem = pFrame->nMem; + v->apCsr = pFrame->apCsr; + v->nCursor = pFrame->nCursor; + v->db->lastRowid = pFrame->lastRowid; + v->nChange = pFrame->nChange; + v->db->nChange = pFrame->nDbChange; + sqlite3VdbeDeleteAuxData(v->db, &v->pAuxData, -1, 0); + v->pAuxData = pFrame->pAuxData; + pFrame->pAuxData = 0; + return pFrame->pc; +} + +/* +** Close all cursors. +** +** Also release any dynamic memory held by the VM in the Vdbe.aMem memory +** cell array. This is necessary as the memory cell array may contain +** pointers to VdbeFrame objects, which may in turn contain pointers to +** open cursors. +*/ +static void closeAllCursors(Vdbe *p){ + if( p->pFrame ){ + VdbeFrame *pFrame; + for(pFrame=p->pFrame; pFrame->pParent; pFrame=pFrame->pParent); + sqlite3VdbeFrameRestore(pFrame); + p->pFrame = 0; + p->nFrame = 0; + } + assert( p->nFrame==0 ); + closeCursorsInFrame(p); + if( p->aMem ){ + releaseMemArray(p->aMem, p->nMem); + } + while( p->pDelFrame ){ + VdbeFrame *pDel = p->pDelFrame; + p->pDelFrame = pDel->pParent; + sqlite3VdbeFrameDelete(pDel); + } + + /* Delete any auxdata allocations made by the VM */ + if( p->pAuxData ) sqlite3VdbeDeleteAuxData(p->db, &p->pAuxData, -1, 0); + assert( p->pAuxData==0 ); +} + +/* +** Clean up the VM after a single run. +*/ +static void Cleanup(Vdbe *p){ + sqlite3 *db = p->db; + +#ifdef SQLITE_DEBUG + /* Execute assert() statements to ensure that the Vdbe.apCsr[] and + ** Vdbe.aMem[] arrays have already been cleaned up. */ + int i; + if( p->apCsr ) for(i=0; inCursor; i++) assert( p->apCsr[i]==0 ); + if( p->aMem ){ + for(i=0; inMem; i++) assert( p->aMem[i].flags==MEM_Undefined ); + } +#endif + + sqlite3DbFree(db, p->zErrMsg); + p->zErrMsg = 0; + p->pResultSet = 0; +} + +/* +** Set the number of result columns that will be returned by this SQL +** statement. This is now set at compile time, rather than during +** execution of the vdbe program so that sqlite3_column_count() can +** be called on an SQL statement before sqlite3_step(). +*/ +SQLITE_PRIVATE void sqlite3VdbeSetNumCols(Vdbe *p, int nResColumn){ + Mem *pColName; + int n; + sqlite3 *db = p->db; + + releaseMemArray(p->aColName, p->nResColumn*COLNAME_N); + sqlite3DbFree(db, p->aColName); + n = nResColumn*COLNAME_N; + p->nResColumn = (u16)nResColumn; + p->aColName = pColName = (Mem*)sqlite3DbMallocRawNN(db, sizeof(Mem)*n ); + if( p->aColName==0 ) return; + initMemArray(p->aColName, n, p->db, MEM_Null); +} + +/* +** Set the name of the idx'th column to be returned by the SQL statement. +** zName must be a pointer to a nul terminated string. +** +** This call must be made after a call to sqlite3VdbeSetNumCols(). +** +** The final parameter, xDel, must be one of SQLITE_DYNAMIC, SQLITE_STATIC +** or SQLITE_TRANSIENT. If it is SQLITE_DYNAMIC, then the buffer pointed +** to by zName will be freed by sqlite3DbFree() when the vdbe is destroyed. +*/ +SQLITE_PRIVATE int sqlite3VdbeSetColName( + Vdbe *p, /* Vdbe being configured */ + int idx, /* Index of column zName applies to */ + int var, /* One of the COLNAME_* constants */ + const char *zName, /* Pointer to buffer containing name */ + void (*xDel)(void*) /* Memory management strategy for zName */ +){ + int rc; + Mem *pColName; + assert( idxnResColumn ); + assert( vardb->mallocFailed ){ + assert( !zName || xDel!=SQLITE_DYNAMIC ); + return SQLITE_NOMEM_BKPT; + } + assert( p->aColName!=0 ); + pColName = &(p->aColName[idx+var*p->nResColumn]); + rc = sqlite3VdbeMemSetStr(pColName, zName, -1, SQLITE_UTF8, xDel); + assert( rc!=0 || !zName || (pColName->flags&MEM_Term)!=0 ); + return rc; +} + +/* +** A read or write transaction may or may not be active on database handle +** db. If a transaction is active, commit it. If there is a +** write-transaction spanning more than one database file, this routine +** takes care of the master journal trickery. +*/ +static int vdbeCommit(sqlite3 *db, Vdbe *p){ + int i; + int nTrans = 0; /* Number of databases with an active write-transaction + ** that are candidates for a two-phase commit using a + ** master-journal */ + int rc = SQLITE_OK; + int needXcommit = 0; + +#ifdef SQLITE_OMIT_VIRTUALTABLE + /* With this option, sqlite3VtabSync() is defined to be simply + ** SQLITE_OK so p is not used. + */ + UNUSED_PARAMETER(p); +#endif + + /* Before doing anything else, call the xSync() callback for any + ** virtual module tables written in this transaction. This has to + ** be done before determining whether a master journal file is + ** required, as an xSync() callback may add an attached database + ** to the transaction. + */ + rc = sqlite3VtabSync(db, p); + + /* This loop determines (a) if the commit hook should be invoked and + ** (b) how many database files have open write transactions, not + ** including the temp database. (b) is important because if more than + ** one database file has an open write transaction, a master journal + ** file is required for an atomic commit. + */ + for(i=0; rc==SQLITE_OK && inDb; i++){ + Btree *pBt = db->aDb[i].pBt; + if( sqlite3BtreeIsInTrans(pBt) ){ + /* Whether or not a database might need a master journal depends upon + ** its journal mode (among other things). This matrix determines which + ** journal modes use a master journal and which do not */ + static const u8 aMJNeeded[] = { + /* DELETE */ 1, + /* PERSIST */ 1, + /* OFF */ 0, + /* TRUNCATE */ 1, + /* MEMORY */ 0, + /* WAL */ 0 + }; + Pager *pPager; /* Pager associated with pBt */ + needXcommit = 1; + sqlite3BtreeEnter(pBt); + pPager = sqlite3BtreePager(pBt); + if( db->aDb[i].safety_level!=PAGER_SYNCHRONOUS_OFF + && aMJNeeded[sqlite3PagerGetJournalMode(pPager)] + ){ + assert( i!=1 ); + nTrans++; + } + rc = sqlite3PagerExclusiveLock(pPager); + sqlite3BtreeLeave(pBt); + } + } + if( rc!=SQLITE_OK ){ + return rc; + } + + /* If there are any write-transactions at all, invoke the commit hook */ + if( needXcommit && db->xCommitCallback ){ + rc = db->xCommitCallback(db->pCommitArg); + if( rc ){ + return SQLITE_CONSTRAINT_COMMITHOOK; + } + } + + /* The simple case - no more than one database file (not counting the + ** TEMP database) has a transaction active. There is no need for the + ** master-journal. + ** + ** If the return value of sqlite3BtreeGetFilename() is a zero length + ** string, it means the main database is :memory: or a temp file. In + ** that case we do not support atomic multi-file commits, so use the + ** simple case then too. + */ + if( 0==sqlite3Strlen30(sqlite3BtreeGetFilename(db->aDb[0].pBt)) + || nTrans<=1 + ){ + for(i=0; rc==SQLITE_OK && inDb; i++){ + Btree *pBt = db->aDb[i].pBt; + if( pBt ){ + rc = sqlite3BtreeCommitPhaseOne(pBt, 0); + } + } + + /* Do the commit only if all databases successfully complete phase 1. + ** If one of the BtreeCommitPhaseOne() calls fails, this indicates an + ** IO error while deleting or truncating a journal file. It is unlikely, + ** but could happen. In this case abandon processing and return the error. + */ + for(i=0; rc==SQLITE_OK && inDb; i++){ + Btree *pBt = db->aDb[i].pBt; + if( pBt ){ + rc = sqlite3BtreeCommitPhaseTwo(pBt, 0); + } + } + if( rc==SQLITE_OK ){ + sqlite3VtabCommit(db); + } + } + + /* The complex case - There is a multi-file write-transaction active. + ** This requires a master journal file to ensure the transaction is + ** committed atomically. + */ +#ifndef SQLITE_OMIT_DISKIO + else{ + sqlite3_vfs *pVfs = db->pVfs; + char *zMaster = 0; /* File-name for the master journal */ + char const *zMainFile = sqlite3BtreeGetFilename(db->aDb[0].pBt); + sqlite3_file *pMaster = 0; + i64 offset = 0; + int res; + int retryCount = 0; + int nMainFile; + + /* Select a master journal file name */ + nMainFile = sqlite3Strlen30(zMainFile); + zMaster = sqlite3MPrintf(db, "%s-mjXXXXXX9XXz", zMainFile); + if( zMaster==0 ) return SQLITE_NOMEM_BKPT; + do { + u32 iRandom; + if( retryCount ){ + if( retryCount>100 ){ + sqlite3_log(SQLITE_FULL, "MJ delete: %s", zMaster); + sqlite3OsDelete(pVfs, zMaster, 0); + break; + }else if( retryCount==1 ){ + sqlite3_log(SQLITE_FULL, "MJ collide: %s", zMaster); + } + } + retryCount++; + sqlite3_randomness(sizeof(iRandom), &iRandom); + sqlite3_snprintf(13, &zMaster[nMainFile], "-mj%06X9%02X", + (iRandom>>8)&0xffffff, iRandom&0xff); + /* The antipenultimate character of the master journal name must + ** be "9" to avoid name collisions when using 8+3 filenames. */ + assert( zMaster[sqlite3Strlen30(zMaster)-3]=='9' ); + sqlite3FileSuffix3(zMainFile, zMaster); + rc = sqlite3OsAccess(pVfs, zMaster, SQLITE_ACCESS_EXISTS, &res); + }while( rc==SQLITE_OK && res ); + if( rc==SQLITE_OK ){ + /* Open the master journal. */ + rc = sqlite3OsOpenMalloc(pVfs, zMaster, &pMaster, + SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE| + SQLITE_OPEN_EXCLUSIVE|SQLITE_OPEN_MASTER_JOURNAL, 0 + ); + } + if( rc!=SQLITE_OK ){ + sqlite3DbFree(db, zMaster); + return rc; + } + + /* Write the name of each database file in the transaction into the new + ** master journal file. If an error occurs at this point close + ** and delete the master journal file. All the individual journal files + ** still have 'null' as the master journal pointer, so they will roll + ** back independently if a failure occurs. + */ + for(i=0; inDb; i++){ + Btree *pBt = db->aDb[i].pBt; + if( sqlite3BtreeIsInTrans(pBt) ){ + char const *zFile = sqlite3BtreeGetJournalname(pBt); + if( zFile==0 ){ + continue; /* Ignore TEMP and :memory: databases */ + } + assert( zFile[0]!=0 ); + rc = sqlite3OsWrite(pMaster, zFile, sqlite3Strlen30(zFile)+1, offset); + offset += sqlite3Strlen30(zFile)+1; + if( rc!=SQLITE_OK ){ + sqlite3OsCloseFree(pMaster); + sqlite3OsDelete(pVfs, zMaster, 0); + sqlite3DbFree(db, zMaster); + return rc; + } + } + } + + /* Sync the master journal file. If the IOCAP_SEQUENTIAL device + ** flag is set this is not required. + */ + if( 0==(sqlite3OsDeviceCharacteristics(pMaster)&SQLITE_IOCAP_SEQUENTIAL) + && SQLITE_OK!=(rc = sqlite3OsSync(pMaster, SQLITE_SYNC_NORMAL)) + ){ + sqlite3OsCloseFree(pMaster); + sqlite3OsDelete(pVfs, zMaster, 0); + sqlite3DbFree(db, zMaster); + return rc; + } + + /* Sync all the db files involved in the transaction. The same call + ** sets the master journal pointer in each individual journal. If + ** an error occurs here, do not delete the master journal file. + ** + ** If the error occurs during the first call to + ** sqlite3BtreeCommitPhaseOne(), then there is a chance that the + ** master journal file will be orphaned. But we cannot delete it, + ** in case the master journal file name was written into the journal + ** file before the failure occurred. + */ + for(i=0; rc==SQLITE_OK && inDb; i++){ + Btree *pBt = db->aDb[i].pBt; + if( pBt ){ + rc = sqlite3BtreeCommitPhaseOne(pBt, zMaster); + } + } + sqlite3OsCloseFree(pMaster); + assert( rc!=SQLITE_BUSY ); + if( rc!=SQLITE_OK ){ + sqlite3DbFree(db, zMaster); + return rc; + } + + /* Delete the master journal file. This commits the transaction. After + ** doing this the directory is synced again before any individual + ** transaction files are deleted. + */ + rc = sqlite3OsDelete(pVfs, zMaster, 1); + sqlite3DbFree(db, zMaster); + zMaster = 0; + if( rc ){ + return rc; + } + + /* All files and directories have already been synced, so the following + ** calls to sqlite3BtreeCommitPhaseTwo() are only closing files and + ** deleting or truncating journals. If something goes wrong while + ** this is happening we don't really care. The integrity of the + ** transaction is already guaranteed, but some stray 'cold' journals + ** may be lying around. Returning an error code won't help matters. + */ + disable_simulated_io_errors(); + sqlite3BeginBenignMalloc(); + for(i=0; inDb; i++){ + Btree *pBt = db->aDb[i].pBt; + if( pBt ){ + sqlite3BtreeCommitPhaseTwo(pBt, 1); + } + } + sqlite3EndBenignMalloc(); + enable_simulated_io_errors(); + + sqlite3VtabCommit(db); + } +#endif + + return rc; +} + +/* +** This routine checks that the sqlite3.nVdbeActive count variable +** matches the number of vdbe's in the list sqlite3.pVdbe that are +** currently active. An assertion fails if the two counts do not match. +** This is an internal self-check only - it is not an essential processing +** step. +** +** This is a no-op if NDEBUG is defined. +*/ +#ifndef NDEBUG +static void checkActiveVdbeCnt(sqlite3 *db){ + Vdbe *p; + int cnt = 0; + int nWrite = 0; + int nRead = 0; + p = db->pVdbe; + while( p ){ + if( sqlite3_stmt_busy((sqlite3_stmt*)p) ){ + cnt++; + if( p->readOnly==0 ) nWrite++; + if( p->bIsReader ) nRead++; + } + p = p->pNext; + } + assert( cnt==db->nVdbeActive ); + assert( nWrite==db->nVdbeWrite ); + assert( nRead==db->nVdbeRead ); +} +#else +#define checkActiveVdbeCnt(x) +#endif + +/* +** If the Vdbe passed as the first argument opened a statement-transaction, +** close it now. Argument eOp must be either SAVEPOINT_ROLLBACK or +** SAVEPOINT_RELEASE. If it is SAVEPOINT_ROLLBACK, then the statement +** transaction is rolled back. If eOp is SAVEPOINT_RELEASE, then the +** statement transaction is committed. +** +** If an IO error occurs, an SQLITE_IOERR_XXX error code is returned. +** Otherwise SQLITE_OK. +*/ +SQLITE_PRIVATE int sqlite3VdbeCloseStatement(Vdbe *p, int eOp){ + sqlite3 *const db = p->db; + int rc = SQLITE_OK; + + /* If p->iStatement is greater than zero, then this Vdbe opened a + ** statement transaction that should be closed here. The only exception + ** is that an IO error may have occurred, causing an emergency rollback. + ** In this case (db->nStatement==0), and there is nothing to do. + */ + if( db->nStatement && p->iStatement ){ + int i; + const int iSavepoint = p->iStatement-1; + + assert( eOp==SAVEPOINT_ROLLBACK || eOp==SAVEPOINT_RELEASE); + assert( db->nStatement>0 ); + assert( p->iStatement==(db->nStatement+db->nSavepoint) ); + + for(i=0; inDb; i++){ + int rc2 = SQLITE_OK; + Btree *pBt = db->aDb[i].pBt; + if( pBt ){ + if( eOp==SAVEPOINT_ROLLBACK ){ + rc2 = sqlite3BtreeSavepoint(pBt, SAVEPOINT_ROLLBACK, iSavepoint); + } + if( rc2==SQLITE_OK ){ + rc2 = sqlite3BtreeSavepoint(pBt, SAVEPOINT_RELEASE, iSavepoint); + } + if( rc==SQLITE_OK ){ + rc = rc2; + } + } + } + db->nStatement--; + p->iStatement = 0; + + if( rc==SQLITE_OK ){ + if( eOp==SAVEPOINT_ROLLBACK ){ + rc = sqlite3VtabSavepoint(db, SAVEPOINT_ROLLBACK, iSavepoint); + } + if( rc==SQLITE_OK ){ + rc = sqlite3VtabSavepoint(db, SAVEPOINT_RELEASE, iSavepoint); + } + } + + /* If the statement transaction is being rolled back, also restore the + ** database handles deferred constraint counter to the value it had when + ** the statement transaction was opened. */ + if( eOp==SAVEPOINT_ROLLBACK ){ + db->nDeferredCons = p->nStmtDefCons; + db->nDeferredImmCons = p->nStmtDefImmCons; + } + } + return rc; +} + +/* +** This function is called when a transaction opened by the database +** handle associated with the VM passed as an argument is about to be +** committed. If there are outstanding deferred foreign key constraint +** violations, return SQLITE_ERROR. Otherwise, SQLITE_OK. +** +** If there are outstanding FK violations and this function returns +** SQLITE_ERROR, set the result of the VM to SQLITE_CONSTRAINT_FOREIGNKEY +** and write an error message to it. Then return SQLITE_ERROR. +*/ +#ifndef SQLITE_OMIT_FOREIGN_KEY +SQLITE_PRIVATE int sqlite3VdbeCheckFk(Vdbe *p, int deferred){ + sqlite3 *db = p->db; + if( (deferred && (db->nDeferredCons+db->nDeferredImmCons)>0) + || (!deferred && p->nFkConstraint>0) + ){ + p->rc = SQLITE_CONSTRAINT_FOREIGNKEY; + p->errorAction = OE_Abort; + sqlite3VdbeError(p, "FOREIGN KEY constraint failed"); + return SQLITE_ERROR; + } + return SQLITE_OK; +} +#endif + +/* +** This routine is called the when a VDBE tries to halt. If the VDBE +** has made changes and is in autocommit mode, then commit those +** changes. If a rollback is needed, then do the rollback. +** +** This routine is the only way to move the state of a VM from +** SQLITE_MAGIC_RUN to SQLITE_MAGIC_HALT. It is harmless to +** call this on a VM that is in the SQLITE_MAGIC_HALT state. +** +** Return an error code. If the commit could not complete because of +** lock contention, return SQLITE_BUSY. If SQLITE_BUSY is returned, it +** means the close did not happen and needs to be repeated. +*/ +SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe *p){ + int rc; /* Used to store transient return codes */ + sqlite3 *db = p->db; + + /* This function contains the logic that determines if a statement or + ** transaction will be committed or rolled back as a result of the + ** execution of this virtual machine. + ** + ** If any of the following errors occur: + ** + ** SQLITE_NOMEM + ** SQLITE_IOERR + ** SQLITE_FULL + ** SQLITE_INTERRUPT + ** + ** Then the internal cache might have been left in an inconsistent + ** state. We need to rollback the statement transaction, if there is + ** one, or the complete transaction if there is no statement transaction. + */ + + if( db->mallocFailed ){ + p->rc = SQLITE_NOMEM_BKPT; + } + closeAllCursors(p); + if( p->magic!=VDBE_MAGIC_RUN ){ + return SQLITE_OK; + } + checkActiveVdbeCnt(db); + + /* No commit or rollback needed if the program never started or if the + ** SQL statement does not read or write a database file. */ + if( p->pc>=0 && p->bIsReader ){ + int mrc; /* Primary error code from p->rc */ + int eStatementOp = 0; + int isSpecialError; /* Set to true if a 'special' error */ + + /* Lock all btrees used by the statement */ + sqlite3VdbeEnter(p); + + /* Check for one of the special errors */ + mrc = p->rc & 0xff; + isSpecialError = mrc==SQLITE_NOMEM || mrc==SQLITE_IOERR + || mrc==SQLITE_INTERRUPT || mrc==SQLITE_FULL; + if( isSpecialError ){ + /* If the query was read-only and the error code is SQLITE_INTERRUPT, + ** no rollback is necessary. Otherwise, at least a savepoint + ** transaction must be rolled back to restore the database to a + ** consistent state. + ** + ** Even if the statement is read-only, it is important to perform + ** a statement or transaction rollback operation. If the error + ** occurred while writing to the journal, sub-journal or database + ** file as part of an effort to free up cache space (see function + ** pagerStress() in pager.c), the rollback is required to restore + ** the pager to a consistent state. + */ + if( !p->readOnly || mrc!=SQLITE_INTERRUPT ){ + if( (mrc==SQLITE_NOMEM || mrc==SQLITE_FULL) && p->usesStmtJournal ){ + eStatementOp = SAVEPOINT_ROLLBACK; + }else{ + /* We are forced to roll back the active transaction. Before doing + ** so, abort any other statements this handle currently has active. + */ + sqlite3RollbackAll(db, SQLITE_ABORT_ROLLBACK); + sqlite3CloseSavepoints(db); + db->autoCommit = 1; + p->nChange = 0; + } + } + } + + /* Check for immediate foreign key violations. */ + if( p->rc==SQLITE_OK ){ + sqlite3VdbeCheckFk(p, 0); + } + + /* If the auto-commit flag is set and this is the only active writer + ** VM, then we do either a commit or rollback of the current transaction. + ** + ** Note: This block also runs if one of the special errors handled + ** above has occurred. + */ + if( !sqlite3VtabInSync(db) + && db->autoCommit + && db->nVdbeWrite==(p->readOnly==0) + ){ + if( p->rc==SQLITE_OK || (p->errorAction==OE_Fail && !isSpecialError) ){ + rc = sqlite3VdbeCheckFk(p, 1); + if( rc!=SQLITE_OK ){ + if( NEVER(p->readOnly) ){ + sqlite3VdbeLeave(p); + return SQLITE_ERROR; + } + rc = SQLITE_CONSTRAINT_FOREIGNKEY; + }else{ + /* The auto-commit flag is true, the vdbe program was successful + ** or hit an 'OR FAIL' constraint and there are no deferred foreign + ** key constraints to hold up the transaction. This means a commit + ** is required. */ + rc = vdbeCommit(db, p); + } + if( rc==SQLITE_BUSY && p->readOnly ){ + sqlite3VdbeLeave(p); + return SQLITE_BUSY; + }else if( rc!=SQLITE_OK ){ + p->rc = rc; + sqlite3RollbackAll(db, SQLITE_OK); + p->nChange = 0; + }else{ + db->nDeferredCons = 0; + db->nDeferredImmCons = 0; + db->flags &= ~SQLITE_DeferFKs; + sqlite3CommitInternalChanges(db); + } + }else{ + sqlite3RollbackAll(db, SQLITE_OK); + p->nChange = 0; + } + db->nStatement = 0; + }else if( eStatementOp==0 ){ + if( p->rc==SQLITE_OK || p->errorAction==OE_Fail ){ + eStatementOp = SAVEPOINT_RELEASE; + }else if( p->errorAction==OE_Abort ){ + eStatementOp = SAVEPOINT_ROLLBACK; + }else{ + sqlite3RollbackAll(db, SQLITE_ABORT_ROLLBACK); + sqlite3CloseSavepoints(db); + db->autoCommit = 1; + p->nChange = 0; + } + } + + /* If eStatementOp is non-zero, then a statement transaction needs to + ** be committed or rolled back. Call sqlite3VdbeCloseStatement() to + ** do so. If this operation returns an error, and the current statement + ** error code is SQLITE_OK or SQLITE_CONSTRAINT, then promote the + ** current statement error code. + */ + if( eStatementOp ){ + rc = sqlite3VdbeCloseStatement(p, eStatementOp); + if( rc ){ + if( p->rc==SQLITE_OK || (p->rc&0xff)==SQLITE_CONSTRAINT ){ + p->rc = rc; + sqlite3DbFree(db, p->zErrMsg); + p->zErrMsg = 0; + } + sqlite3RollbackAll(db, SQLITE_ABORT_ROLLBACK); + sqlite3CloseSavepoints(db); + db->autoCommit = 1; + p->nChange = 0; + } + } + + /* If this was an INSERT, UPDATE or DELETE and no statement transaction + ** has been rolled back, update the database connection change-counter. + */ + if( p->changeCntOn ){ + if( eStatementOp!=SAVEPOINT_ROLLBACK ){ + sqlite3VdbeSetChanges(db, p->nChange); + }else{ + sqlite3VdbeSetChanges(db, 0); + } + p->nChange = 0; + } + + /* Release the locks */ + sqlite3VdbeLeave(p); + } + + /* We have successfully halted and closed the VM. Record this fact. */ + if( p->pc>=0 ){ + db->nVdbeActive--; + if( !p->readOnly ) db->nVdbeWrite--; + if( p->bIsReader ) db->nVdbeRead--; + assert( db->nVdbeActive>=db->nVdbeRead ); + assert( db->nVdbeRead>=db->nVdbeWrite ); + assert( db->nVdbeWrite>=0 ); + } + p->magic = VDBE_MAGIC_HALT; + checkActiveVdbeCnt(db); + if( db->mallocFailed ){ + p->rc = SQLITE_NOMEM_BKPT; + } + + /* If the auto-commit flag is set to true, then any locks that were held + ** by connection db have now been released. Call sqlite3ConnectionUnlocked() + ** to invoke any required unlock-notify callbacks. + */ + if( db->autoCommit ){ + sqlite3ConnectionUnlocked(db); + } + + assert( db->nVdbeActive>0 || db->autoCommit==0 || db->nStatement==0 ); + return (p->rc==SQLITE_BUSY ? SQLITE_BUSY : SQLITE_OK); +} + + +/* +** Each VDBE holds the result of the most recent sqlite3_step() call +** in p->rc. This routine sets that result back to SQLITE_OK. +*/ +SQLITE_PRIVATE void sqlite3VdbeResetStepResult(Vdbe *p){ + p->rc = SQLITE_OK; +} + +/* +** Copy the error code and error message belonging to the VDBE passed +** as the first argument to its database handle (so that they will be +** returned by calls to sqlite3_errcode() and sqlite3_errmsg()). +** +** This function does not clear the VDBE error code or message, just +** copies them to the database handle. +*/ +SQLITE_PRIVATE int sqlite3VdbeTransferError(Vdbe *p){ + sqlite3 *db = p->db; + int rc = p->rc; + if( p->zErrMsg ){ + db->bBenignMalloc++; + sqlite3BeginBenignMalloc(); + if( db->pErr==0 ) db->pErr = sqlite3ValueNew(db); + sqlite3ValueSetStr(db->pErr, -1, p->zErrMsg, SQLITE_UTF8, SQLITE_TRANSIENT); + sqlite3EndBenignMalloc(); + db->bBenignMalloc--; + db->errCode = rc; + }else{ + sqlite3Error(db, rc); + } + return rc; +} + +#ifdef SQLITE_ENABLE_SQLLOG +/* +** If an SQLITE_CONFIG_SQLLOG hook is registered and the VM has been run, +** invoke it. +*/ +static void vdbeInvokeSqllog(Vdbe *v){ + if( sqlite3GlobalConfig.xSqllog && v->rc==SQLITE_OK && v->zSql && v->pc>=0 ){ + char *zExpanded = sqlite3VdbeExpandSql(v, v->zSql); + assert( v->db->init.busy==0 ); + if( zExpanded ){ + sqlite3GlobalConfig.xSqllog( + sqlite3GlobalConfig.pSqllogArg, v->db, zExpanded, 1 + ); + sqlite3DbFree(v->db, zExpanded); + } + } +} +#else +# define vdbeInvokeSqllog(x) +#endif + +/* +** Clean up a VDBE after execution but do not delete the VDBE just yet. +** Write any error messages into *pzErrMsg. Return the result code. +** +** After this routine is run, the VDBE should be ready to be executed +** again. +** +** To look at it another way, this routine resets the state of the +** virtual machine from VDBE_MAGIC_RUN or VDBE_MAGIC_HALT back to +** VDBE_MAGIC_INIT. +*/ +SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe *p){ + sqlite3 *db; + db = p->db; + + /* If the VM did not run to completion or if it encountered an + ** error, then it might not have been halted properly. So halt + ** it now. + */ + sqlite3VdbeHalt(p); + + /* If the VDBE has be run even partially, then transfer the error code + ** and error message from the VDBE into the main database structure. But + ** if the VDBE has just been set to run but has not actually executed any + ** instructions yet, leave the main database error information unchanged. + */ + if( p->pc>=0 ){ + vdbeInvokeSqllog(p); + sqlite3VdbeTransferError(p); + sqlite3DbFree(db, p->zErrMsg); + p->zErrMsg = 0; + if( p->runOnlyOnce ) p->expired = 1; + }else if( p->rc && p->expired ){ + /* The expired flag was set on the VDBE before the first call + ** to sqlite3_step(). For consistency (since sqlite3_step() was + ** called), set the database error in this case as well. + */ + sqlite3ErrorWithMsg(db, p->rc, p->zErrMsg ? "%s" : 0, p->zErrMsg); + sqlite3DbFree(db, p->zErrMsg); + p->zErrMsg = 0; + } + + /* Reclaim all memory used by the VDBE + */ + Cleanup(p); + + /* Save profiling information from this VDBE run. + */ +#ifdef VDBE_PROFILE + { + FILE *out = fopen("vdbe_profile.out", "a"); + if( out ){ + int i; + fprintf(out, "---- "); + for(i=0; inOp; i++){ + fprintf(out, "%02x", p->aOp[i].opcode); + } + fprintf(out, "\n"); + if( p->zSql ){ + char c, pc = 0; + fprintf(out, "-- "); + for(i=0; (c = p->zSql[i])!=0; i++){ + if( pc=='\n' ) fprintf(out, "-- "); + putc(c, out); + pc = c; + } + if( pc!='\n' ) fprintf(out, "\n"); + } + for(i=0; inOp; i++){ + char zHdr[100]; + sqlite3_snprintf(sizeof(zHdr), zHdr, "%6u %12llu %8llu ", + p->aOp[i].cnt, + p->aOp[i].cycles, + p->aOp[i].cnt>0 ? p->aOp[i].cycles/p->aOp[i].cnt : 0 + ); + fprintf(out, "%s", zHdr); + sqlite3VdbePrintOp(out, i, &p->aOp[i]); + } + fclose(out); + } + } +#endif + p->iCurrentTime = 0; + p->magic = VDBE_MAGIC_RESET; + return p->rc & db->errMask; +} + +/* +** Clean up and delete a VDBE after execution. Return an integer which is +** the result code. Write any error message text into *pzErrMsg. +*/ +SQLITE_PRIVATE int sqlite3VdbeFinalize(Vdbe *p){ + int rc = SQLITE_OK; + if( p->magic==VDBE_MAGIC_RUN || p->magic==VDBE_MAGIC_HALT ){ + rc = sqlite3VdbeReset(p); + assert( (rc & p->db->errMask)==rc ); + } + sqlite3VdbeDelete(p); + return rc; +} + +/* +** If parameter iOp is less than zero, then invoke the destructor for +** all auxiliary data pointers currently cached by the VM passed as +** the first argument. +** +** Or, if iOp is greater than or equal to zero, then the destructor is +** only invoked for those auxiliary data pointers created by the user +** function invoked by the OP_Function opcode at instruction iOp of +** VM pVdbe, and only then if: +** +** * the associated function parameter is the 32nd or later (counting +** from left to right), or +** +** * the corresponding bit in argument mask is clear (where the first +** function parameter corresponds to bit 0 etc.). +*/ +SQLITE_PRIVATE void sqlite3VdbeDeleteAuxData(sqlite3 *db, AuxData **pp, int iOp, int mask){ + while( *pp ){ + AuxData *pAux = *pp; + if( (iOp<0) + || (pAux->iOp==iOp && (pAux->iArg>31 || !(mask & MASKBIT32(pAux->iArg)))) + ){ + testcase( pAux->iArg==31 ); + if( pAux->xDelete ){ + pAux->xDelete(pAux->pAux); + } + *pp = pAux->pNext; + sqlite3DbFree(db, pAux); + }else{ + pp= &pAux->pNext; + } + } +} + +/* +** Free all memory associated with the Vdbe passed as the second argument, +** except for object itself, which is preserved. +** +** The difference between this function and sqlite3VdbeDelete() is that +** VdbeDelete() also unlinks the Vdbe from the list of VMs associated with +** the database connection and frees the object itself. +*/ +SQLITE_PRIVATE void sqlite3VdbeClearObject(sqlite3 *db, Vdbe *p){ + SubProgram *pSub, *pNext; + int i; + assert( p->db==0 || p->db==db ); + releaseMemArray(p->aColName, p->nResColumn*COLNAME_N); + for(pSub=p->pProgram; pSub; pSub=pNext){ + pNext = pSub->pNext; + vdbeFreeOpArray(db, pSub->aOp, pSub->nOp); + sqlite3DbFree(db, pSub); + } + if( p->magic!=VDBE_MAGIC_INIT ){ + releaseMemArray(p->aVar, p->nVar); + for(i=p->nzVar-1; i>=0; i--) sqlite3DbFree(db, p->azVar[i]); + sqlite3DbFree(db, p->azVar); + sqlite3DbFree(db, p->pFree); + } + vdbeFreeOpArray(db, p->aOp, p->nOp); + sqlite3DbFree(db, p->aColName); + sqlite3DbFree(db, p->zSql); +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS + for(i=0; inScan; i++){ + sqlite3DbFree(db, p->aScan[i].zName); + } + sqlite3DbFree(db, p->aScan); +#endif +} + +/* +** Delete an entire VDBE. +*/ +SQLITE_PRIVATE void sqlite3VdbeDelete(Vdbe *p){ + sqlite3 *db; + + if( NEVER(p==0) ) return; + db = p->db; + assert( sqlite3_mutex_held(db->mutex) ); + sqlite3VdbeClearObject(db, p); + if( p->pPrev ){ + p->pPrev->pNext = p->pNext; + }else{ + assert( db->pVdbe==p ); + db->pVdbe = p->pNext; + } + if( p->pNext ){ + p->pNext->pPrev = p->pPrev; + } + p->magic = VDBE_MAGIC_DEAD; + p->db = 0; + sqlite3DbFree(db, p); +} + +/* +** The cursor "p" has a pending seek operation that has not yet been +** carried out. Seek the cursor now. If an error occurs, return +** the appropriate error code. +*/ +static int SQLITE_NOINLINE handleDeferredMoveto(VdbeCursor *p){ + int res, rc; +#ifdef SQLITE_TEST + extern int sqlite3_search_count; +#endif + assert( p->deferredMoveto ); + assert( p->isTable ); + assert( p->eCurType==CURTYPE_BTREE ); + rc = sqlite3BtreeMovetoUnpacked(p->uc.pCursor, 0, p->movetoTarget, 0, &res); + if( rc ) return rc; + if( res!=0 ) return SQLITE_CORRUPT_BKPT; +#ifdef SQLITE_TEST + sqlite3_search_count++; +#endif + p->deferredMoveto = 0; + p->cacheStatus = CACHE_STALE; + return SQLITE_OK; +} + +/* +** Something has moved cursor "p" out of place. Maybe the row it was +** pointed to was deleted out from under it. Or maybe the btree was +** rebalanced. Whatever the cause, try to restore "p" to the place it +** is supposed to be pointing. If the row was deleted out from under the +** cursor, set the cursor to point to a NULL row. +*/ +static int SQLITE_NOINLINE handleMovedCursor(VdbeCursor *p){ + int isDifferentRow, rc; + assert( p->eCurType==CURTYPE_BTREE ); + assert( p->uc.pCursor!=0 ); + assert( sqlite3BtreeCursorHasMoved(p->uc.pCursor) ); + rc = sqlite3BtreeCursorRestore(p->uc.pCursor, &isDifferentRow); + p->cacheStatus = CACHE_STALE; + if( isDifferentRow ) p->nullRow = 1; + return rc; +} + +/* +** Check to ensure that the cursor is valid. Restore the cursor +** if need be. Return any I/O error from the restore operation. +*/ +SQLITE_PRIVATE int sqlite3VdbeCursorRestore(VdbeCursor *p){ + assert( p->eCurType==CURTYPE_BTREE ); + if( sqlite3BtreeCursorHasMoved(p->uc.pCursor) ){ + return handleMovedCursor(p); + } + return SQLITE_OK; +} + +/* +** Make sure the cursor p is ready to read or write the row to which it +** was last positioned. Return an error code if an OOM fault or I/O error +** prevents us from positioning the cursor to its correct position. +** +** If a MoveTo operation is pending on the given cursor, then do that +** MoveTo now. If no move is pending, check to see if the row has been +** deleted out from under the cursor and if it has, mark the row as +** a NULL row. +** +** If the cursor is already pointing to the correct row and that row has +** not been deleted out from under the cursor, then this routine is a no-op. +*/ +SQLITE_PRIVATE int sqlite3VdbeCursorMoveto(VdbeCursor **pp, int *piCol){ + VdbeCursor *p = *pp; + if( p->eCurType==CURTYPE_BTREE ){ + if( p->deferredMoveto ){ + int iMap; + if( p->aAltMap && (iMap = p->aAltMap[1+*piCol])>0 ){ + *pp = p->pAltCursor; + *piCol = iMap - 1; + return SQLITE_OK; + } + return handleDeferredMoveto(p); + } + if( sqlite3BtreeCursorHasMoved(p->uc.pCursor) ){ + return handleMovedCursor(p); + } + } + return SQLITE_OK; +} + +/* +** The following functions: +** +** sqlite3VdbeSerialType() +** sqlite3VdbeSerialTypeLen() +** sqlite3VdbeSerialLen() +** sqlite3VdbeSerialPut() +** sqlite3VdbeSerialGet() +** +** encapsulate the code that serializes values for storage in SQLite +** data and index records. Each serialized value consists of a +** 'serial-type' and a blob of data. The serial type is an 8-byte unsigned +** integer, stored as a varint. +** +** In an SQLite index record, the serial type is stored directly before +** the blob of data that it corresponds to. In a table record, all serial +** types are stored at the start of the record, and the blobs of data at +** the end. Hence these functions allow the caller to handle the +** serial-type and data blob separately. +** +** The following table describes the various storage classes for data: +** +** serial type bytes of data type +** -------------- --------------- --------------- +** 0 0 NULL +** 1 1 signed integer +** 2 2 signed integer +** 3 3 signed integer +** 4 4 signed integer +** 5 6 signed integer +** 6 8 signed integer +** 7 8 IEEE float +** 8 0 Integer constant 0 +** 9 0 Integer constant 1 +** 10,11 reserved for expansion +** N>=12 and even (N-12)/2 BLOB +** N>=13 and odd (N-13)/2 text +** +** The 8 and 9 types were added in 3.3.0, file format 4. Prior versions +** of SQLite will not understand those serial types. +*/ + +/* +** Return the serial-type for the value stored in pMem. +*/ +SQLITE_PRIVATE u32 sqlite3VdbeSerialType(Mem *pMem, int file_format, u32 *pLen){ + int flags = pMem->flags; + u32 n; + + assert( pLen!=0 ); + if( flags&MEM_Null ){ + *pLen = 0; + return 0; + } + if( flags&MEM_Int ){ + /* Figure out whether to use 1, 2, 4, 6 or 8 bytes. */ +# define MAX_6BYTE ((((i64)0x00008000)<<32)-1) + i64 i = pMem->u.i; + u64 u; + if( i<0 ){ + u = ~i; + }else{ + u = i; + } + if( u<=127 ){ + if( (i&1)==i && file_format>=4 ){ + *pLen = 0; + return 8+(u32)u; + }else{ + *pLen = 1; + return 1; + } + } + if( u<=32767 ){ *pLen = 2; return 2; } + if( u<=8388607 ){ *pLen = 3; return 3; } + if( u<=2147483647 ){ *pLen = 4; return 4; } + if( u<=MAX_6BYTE ){ *pLen = 6; return 5; } + *pLen = 8; + return 6; + } + if( flags&MEM_Real ){ + *pLen = 8; + return 7; + } + assert( pMem->db->mallocFailed || flags&(MEM_Str|MEM_Blob) ); + assert( pMem->n>=0 ); + n = (u32)pMem->n; + if( flags & MEM_Zero ){ + n += pMem->u.nZero; + } + *pLen = n; + return ((n*2) + 12 + ((flags&MEM_Str)!=0)); +} + +/* +** The sizes for serial types less than 128 +*/ +static const u8 sqlite3SmallTypeSizes[] = { + /* 0 1 2 3 4 5 6 7 8 9 */ +/* 0 */ 0, 1, 2, 3, 4, 6, 8, 8, 0, 0, +/* 10 */ 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, +/* 20 */ 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, +/* 30 */ 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, +/* 40 */ 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, +/* 50 */ 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, +/* 60 */ 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, +/* 70 */ 29, 29, 30, 30, 31, 31, 32, 32, 33, 33, +/* 80 */ 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, +/* 90 */ 39, 39, 40, 40, 41, 41, 42, 42, 43, 43, +/* 100 */ 44, 44, 45, 45, 46, 46, 47, 47, 48, 48, +/* 110 */ 49, 49, 50, 50, 51, 51, 52, 52, 53, 53, +/* 120 */ 54, 54, 55, 55, 56, 56, 57, 57 +}; + +/* +** Return the length of the data corresponding to the supplied serial-type. +*/ +SQLITE_PRIVATE u32 sqlite3VdbeSerialTypeLen(u32 serial_type){ + if( serial_type>=128 ){ + return (serial_type-12)/2; + }else{ + assert( serial_type<12 + || sqlite3SmallTypeSizes[serial_type]==(serial_type - 12)/2 ); + return sqlite3SmallTypeSizes[serial_type]; + } +} +SQLITE_PRIVATE u8 sqlite3VdbeOneByteSerialTypeLen(u8 serial_type){ + assert( serial_type<128 ); + return sqlite3SmallTypeSizes[serial_type]; +} + +/* +** If we are on an architecture with mixed-endian floating +** points (ex: ARM7) then swap the lower 4 bytes with the +** upper 4 bytes. Return the result. +** +** For most architectures, this is a no-op. +** +** (later): It is reported to me that the mixed-endian problem +** on ARM7 is an issue with GCC, not with the ARM7 chip. It seems +** that early versions of GCC stored the two words of a 64-bit +** float in the wrong order. And that error has been propagated +** ever since. The blame is not necessarily with GCC, though. +** GCC might have just copying the problem from a prior compiler. +** I am also told that newer versions of GCC that follow a different +** ABI get the byte order right. +** +** Developers using SQLite on an ARM7 should compile and run their +** application using -DSQLITE_DEBUG=1 at least once. With DEBUG +** enabled, some asserts below will ensure that the byte order of +** floating point values is correct. +** +** (2007-08-30) Frank van Vugt has studied this problem closely +** and has send his findings to the SQLite developers. Frank +** writes that some Linux kernels offer floating point hardware +** emulation that uses only 32-bit mantissas instead of a full +** 48-bits as required by the IEEE standard. (This is the +** CONFIG_FPE_FASTFPE option.) On such systems, floating point +** byte swapping becomes very complicated. To avoid problems, +** the necessary byte swapping is carried out using a 64-bit integer +** rather than a 64-bit float. Frank assures us that the code here +** works for him. We, the developers, have no way to independently +** verify this, but Frank seems to know what he is talking about +** so we trust him. +*/ +#ifdef SQLITE_MIXED_ENDIAN_64BIT_FLOAT +static u64 floatSwap(u64 in){ + union { + u64 r; + u32 i[2]; + } u; + u32 t; + + u.r = in; + t = u.i[0]; + u.i[0] = u.i[1]; + u.i[1] = t; + return u.r; +} +# define swapMixedEndianFloat(X) X = floatSwap(X) +#else +# define swapMixedEndianFloat(X) +#endif + +/* +** Write the serialized data blob for the value stored in pMem into +** buf. It is assumed that the caller has allocated sufficient space. +** Return the number of bytes written. +** +** nBuf is the amount of space left in buf[]. The caller is responsible +** for allocating enough space to buf[] to hold the entire field, exclusive +** of the pMem->u.nZero bytes for a MEM_Zero value. +** +** Return the number of bytes actually written into buf[]. The number +** of bytes in the zero-filled tail is included in the return value only +** if those bytes were zeroed in buf[]. +*/ +SQLITE_PRIVATE u32 sqlite3VdbeSerialPut(u8 *buf, Mem *pMem, u32 serial_type){ + u32 len; + + /* Integer and Real */ + if( serial_type<=7 && serial_type>0 ){ + u64 v; + u32 i; + if( serial_type==7 ){ + assert( sizeof(v)==sizeof(pMem->u.r) ); + memcpy(&v, &pMem->u.r, sizeof(v)); + swapMixedEndianFloat(v); + }else{ + v = pMem->u.i; + } + len = i = sqlite3SmallTypeSizes[serial_type]; + assert( i>0 ); + do{ + buf[--i] = (u8)(v&0xFF); + v >>= 8; + }while( i ); + return len; + } + + /* String or blob */ + if( serial_type>=12 ){ + assert( pMem->n + ((pMem->flags & MEM_Zero)?pMem->u.nZero:0) + == (int)sqlite3VdbeSerialTypeLen(serial_type) ); + len = pMem->n; + if( len>0 ) memcpy(buf, pMem->z, len); + return len; + } + + /* NULL or constants 0 or 1 */ + return 0; +} + +/* Input "x" is a sequence of unsigned characters that represent a +** big-endian integer. Return the equivalent native integer +*/ +#define ONE_BYTE_INT(x) ((i8)(x)[0]) +#define TWO_BYTE_INT(x) (256*(i8)((x)[0])|(x)[1]) +#define THREE_BYTE_INT(x) (65536*(i8)((x)[0])|((x)[1]<<8)|(x)[2]) +#define FOUR_BYTE_UINT(x) (((u32)(x)[0]<<24)|((x)[1]<<16)|((x)[2]<<8)|(x)[3]) +#define FOUR_BYTE_INT(x) (16777216*(i8)((x)[0])|((x)[1]<<16)|((x)[2]<<8)|(x)[3]) + +/* +** Deserialize the data blob pointed to by buf as serial type serial_type +** and store the result in pMem. Return the number of bytes read. +** +** This function is implemented as two separate routines for performance. +** The few cases that require local variables are broken out into a separate +** routine so that in most cases the overhead of moving the stack pointer +** is avoided. +*/ +static u32 SQLITE_NOINLINE serialGet( + const unsigned char *buf, /* Buffer to deserialize from */ + u32 serial_type, /* Serial type to deserialize */ + Mem *pMem /* Memory cell to write value into */ +){ + u64 x = FOUR_BYTE_UINT(buf); + u32 y = FOUR_BYTE_UINT(buf+4); + x = (x<<32) + y; + if( serial_type==6 ){ + /* EVIDENCE-OF: R-29851-52272 Value is a big-endian 64-bit + ** twos-complement integer. */ + pMem->u.i = *(i64*)&x; + pMem->flags = MEM_Int; + testcase( pMem->u.i<0 ); + }else{ + /* EVIDENCE-OF: R-57343-49114 Value is a big-endian IEEE 754-2008 64-bit + ** floating point number. */ +#if !defined(NDEBUG) && !defined(SQLITE_OMIT_FLOATING_POINT) + /* Verify that integers and floating point values use the same + ** byte order. Or, that if SQLITE_MIXED_ENDIAN_64BIT_FLOAT is + ** defined that 64-bit floating point values really are mixed + ** endian. + */ + static const u64 t1 = ((u64)0x3ff00000)<<32; + static const double r1 = 1.0; + u64 t2 = t1; + swapMixedEndianFloat(t2); + assert( sizeof(r1)==sizeof(t2) && memcmp(&r1, &t2, sizeof(r1))==0 ); +#endif + assert( sizeof(x)==8 && sizeof(pMem->u.r)==8 ); + swapMixedEndianFloat(x); + memcpy(&pMem->u.r, &x, sizeof(x)); + pMem->flags = sqlite3IsNaN(pMem->u.r) ? MEM_Null : MEM_Real; + } + return 8; +} +SQLITE_PRIVATE u32 sqlite3VdbeSerialGet( + const unsigned char *buf, /* Buffer to deserialize from */ + u32 serial_type, /* Serial type to deserialize */ + Mem *pMem /* Memory cell to write value into */ +){ + switch( serial_type ){ + case 10: /* Reserved for future use */ + case 11: /* Reserved for future use */ + case 0: { /* Null */ + /* EVIDENCE-OF: R-24078-09375 Value is a NULL. */ + pMem->flags = MEM_Null; + break; + } + case 1: { + /* EVIDENCE-OF: R-44885-25196 Value is an 8-bit twos-complement + ** integer. */ + pMem->u.i = ONE_BYTE_INT(buf); + pMem->flags = MEM_Int; + testcase( pMem->u.i<0 ); + return 1; + } + case 2: { /* 2-byte signed integer */ + /* EVIDENCE-OF: R-49794-35026 Value is a big-endian 16-bit + ** twos-complement integer. */ + pMem->u.i = TWO_BYTE_INT(buf); + pMem->flags = MEM_Int; + testcase( pMem->u.i<0 ); + return 2; + } + case 3: { /* 3-byte signed integer */ + /* EVIDENCE-OF: R-37839-54301 Value is a big-endian 24-bit + ** twos-complement integer. */ + pMem->u.i = THREE_BYTE_INT(buf); + pMem->flags = MEM_Int; + testcase( pMem->u.i<0 ); + return 3; + } + case 4: { /* 4-byte signed integer */ + /* EVIDENCE-OF: R-01849-26079 Value is a big-endian 32-bit + ** twos-complement integer. */ + pMem->u.i = FOUR_BYTE_INT(buf); +#ifdef __HP_cc + /* Work around a sign-extension bug in the HP compiler for HP/UX */ + if( buf[0]&0x80 ) pMem->u.i |= 0xffffffff80000000LL; +#endif + pMem->flags = MEM_Int; + testcase( pMem->u.i<0 ); + return 4; + } + case 5: { /* 6-byte signed integer */ + /* EVIDENCE-OF: R-50385-09674 Value is a big-endian 48-bit + ** twos-complement integer. */ + pMem->u.i = FOUR_BYTE_UINT(buf+2) + (((i64)1)<<32)*TWO_BYTE_INT(buf); + pMem->flags = MEM_Int; + testcase( pMem->u.i<0 ); + return 6; + } + case 6: /* 8-byte signed integer */ + case 7: { /* IEEE floating point */ + /* These use local variables, so do them in a separate routine + ** to avoid having to move the frame pointer in the common case */ + return serialGet(buf,serial_type,pMem); + } + case 8: /* Integer 0 */ + case 9: { /* Integer 1 */ + /* EVIDENCE-OF: R-12976-22893 Value is the integer 0. */ + /* EVIDENCE-OF: R-18143-12121 Value is the integer 1. */ + pMem->u.i = serial_type-8; + pMem->flags = MEM_Int; + return 0; + } + default: { + /* EVIDENCE-OF: R-14606-31564 Value is a BLOB that is (N-12)/2 bytes in + ** length. + ** EVIDENCE-OF: R-28401-00140 Value is a string in the text encoding and + ** (N-13)/2 bytes in length. */ + static const u16 aFlag[] = { MEM_Blob|MEM_Ephem, MEM_Str|MEM_Ephem }; + pMem->z = (char *)buf; + pMem->n = (serial_type-12)/2; + pMem->flags = aFlag[serial_type&1]; + return pMem->n; + } + } + return 0; +} +/* +** This routine is used to allocate sufficient space for an UnpackedRecord +** structure large enough to be used with sqlite3VdbeRecordUnpack() if +** the first argument is a pointer to KeyInfo structure pKeyInfo. +** +** The space is either allocated using sqlite3DbMallocRaw() or from within +** the unaligned buffer passed via the second and third arguments (presumably +** stack space). If the former, then *ppFree is set to a pointer that should +** be eventually freed by the caller using sqlite3DbFree(). Or, if the +** allocation comes from the pSpace/szSpace buffer, *ppFree is set to NULL +** before returning. +** +** If an OOM error occurs, NULL is returned. +*/ +SQLITE_PRIVATE UnpackedRecord *sqlite3VdbeAllocUnpackedRecord( + KeyInfo *pKeyInfo, /* Description of the record */ + char *pSpace, /* Unaligned space available */ + int szSpace, /* Size of pSpace[] in bytes */ + char **ppFree /* OUT: Caller should free this pointer */ +){ + UnpackedRecord *p; /* Unpacked record to return */ + int nOff; /* Increment pSpace by nOff to align it */ + int nByte; /* Number of bytes required for *p */ + + /* We want to shift the pointer pSpace up such that it is 8-byte aligned. + ** Thus, we need to calculate a value, nOff, between 0 and 7, to shift + ** it by. If pSpace is already 8-byte aligned, nOff should be zero. + */ + nOff = (8 - (SQLITE_PTR_TO_INT(pSpace) & 7)) & 7; + nByte = ROUND8(sizeof(UnpackedRecord)) + sizeof(Mem)*(pKeyInfo->nField+1); + if( nByte>szSpace+nOff ){ + p = (UnpackedRecord *)sqlite3DbMallocRaw(pKeyInfo->db, nByte); + *ppFree = (char *)p; + if( !p ) return 0; + }else{ + p = (UnpackedRecord*)&pSpace[nOff]; + *ppFree = 0; + } + + p->aMem = (Mem*)&((char*)p)[ROUND8(sizeof(UnpackedRecord))]; + assert( pKeyInfo->aSortOrder!=0 ); + p->pKeyInfo = pKeyInfo; + p->nField = pKeyInfo->nField + 1; + return p; +} + +/* +** Given the nKey-byte encoding of a record in pKey[], populate the +** UnpackedRecord structure indicated by the fourth argument with the +** contents of the decoded record. +*/ +SQLITE_PRIVATE void sqlite3VdbeRecordUnpack( + KeyInfo *pKeyInfo, /* Information about the record format */ + int nKey, /* Size of the binary record */ + const void *pKey, /* The binary record */ + UnpackedRecord *p /* Populate this structure before returning. */ +){ + const unsigned char *aKey = (const unsigned char *)pKey; + int d; + u32 idx; /* Offset in aKey[] to read from */ + u16 u; /* Unsigned loop counter */ + u32 szHdr; + Mem *pMem = p->aMem; + + p->default_rc = 0; + assert( EIGHT_BYTE_ALIGNMENT(pMem) ); + idx = getVarint32(aKey, szHdr); + d = szHdr; + u = 0; + while( idxenc = pKeyInfo->enc; + pMem->db = pKeyInfo->db; + /* pMem->flags = 0; // sqlite3VdbeSerialGet() will set this for us */ + pMem->szMalloc = 0; + pMem->z = 0; + d += sqlite3VdbeSerialGet(&aKey[d], serial_type, pMem); + pMem++; + if( (++u)>=p->nField ) break; + } + assert( u<=pKeyInfo->nField + 1 ); + p->nField = u; +} + +#if SQLITE_DEBUG +/* +** This function compares two index or table record keys in the same way +** as the sqlite3VdbeRecordCompare() routine. Unlike VdbeRecordCompare(), +** this function deserializes and compares values using the +** sqlite3VdbeSerialGet() and sqlite3MemCompare() functions. It is used +** in assert() statements to ensure that the optimized code in +** sqlite3VdbeRecordCompare() returns results with these two primitives. +** +** Return true if the result of comparison is equivalent to desiredResult. +** Return false if there is a disagreement. +*/ +static int vdbeRecordCompareDebug( + int nKey1, const void *pKey1, /* Left key */ + const UnpackedRecord *pPKey2, /* Right key */ + int desiredResult /* Correct answer */ +){ + u32 d1; /* Offset into aKey[] of next data element */ + u32 idx1; /* Offset into aKey[] of next header element */ + u32 szHdr1; /* Number of bytes in header */ + int i = 0; + int rc = 0; + const unsigned char *aKey1 = (const unsigned char *)pKey1; + KeyInfo *pKeyInfo; + Mem mem1; + + pKeyInfo = pPKey2->pKeyInfo; + if( pKeyInfo->db==0 ) return 1; + mem1.enc = pKeyInfo->enc; + mem1.db = pKeyInfo->db; + /* mem1.flags = 0; // Will be initialized by sqlite3VdbeSerialGet() */ + VVA_ONLY( mem1.szMalloc = 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 uninitialized, 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); + if( szHdr1>98307 ) return SQLITE_CORRUPT; + d1 = szHdr1; + assert( pKeyInfo->nField+pKeyInfo->nXField>=pPKey2->nField || CORRUPT_DB ); + assert( pKeyInfo->aSortOrder!=0 ); + assert( pKeyInfo->nField>0 ); + assert( idx1<=szHdr1 || CORRUPT_DB ); + do{ + u32 serial_type1; + + /* Read the serial types for the next element in each key. */ + idx1 += getVarint32( aKey1+idx1, serial_type1 ); + + /* Verify that there is enough key space remaining to avoid + ** a buffer overread. The "d1+serial_type1+2" subexpression will + ** always be greater than or equal to the amount of required key space. + ** Use that approximation to avoid the more expensive call to + ** sqlite3VdbeSerialTypeLen() in the common case. + */ + if( d1+serial_type1+2>(u32)nKey1 + && d1+sqlite3VdbeSerialTypeLen(serial_type1)>(u32)nKey1 + ){ + break; + } + + /* Extract the values to be compared. + */ + d1 += sqlite3VdbeSerialGet(&aKey1[d1], serial_type1, &mem1); + + /* Do the comparison + */ + rc = sqlite3MemCompare(&mem1, &pPKey2->aMem[i], pKeyInfo->aColl[i]); + if( rc!=0 ){ + assert( mem1.szMalloc==0 ); /* See comment below */ + if( pKeyInfo->aSortOrder[i] ){ + rc = -rc; /* Invert the result for DESC sort order. */ + } + goto debugCompareEnd; + } + i++; + }while( idx1nField ); + + /* 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). + */ + assert( mem1.szMalloc==0 ); + + /* rc==0 here means that one of the keys ran out of fields and + ** all the fields up to that point were equal. Return the default_rc + ** value. */ + rc = pPKey2->default_rc; + +debugCompareEnd: + if( desiredResult==0 && rc==0 ) return 1; + if( desiredResult<0 && rc<0 ) return 1; + if( desiredResult>0 && rc>0 ) return 1; + if( CORRUPT_DB ) return 1; + if( pKeyInfo->db->mallocFailed ) return 1; + return 0; +} +#endif + +#if SQLITE_DEBUG +/* +** Count the number of fields (a.k.a. columns) in the record given by +** pKey,nKey. The verify that this count is less than or equal to the +** limit given by pKeyInfo->nField + pKeyInfo->nXField. +** +** If this constraint is not satisfied, it means that the high-speed +** vdbeRecordCompareInt() and vdbeRecordCompareString() routines will +** not work correctly. If this assert() ever fires, it probably means +** that the KeyInfo.nField or KeyInfo.nXField values were computed +** incorrectly. +*/ +static void vdbeAssertFieldCountWithinLimits( + int nKey, const void *pKey, /* The record to verify */ + const KeyInfo *pKeyInfo /* Compare size with this KeyInfo */ +){ + int nField = 0; + u32 szHdr; + u32 idx; + u32 notUsed; + const unsigned char *aKey = (const unsigned char*)pKey; + + if( CORRUPT_DB ) return; + idx = getVarint32(aKey, szHdr); + assert( nKey>=0 ); + assert( szHdr<=(u32)nKey ); + while( idxnField+pKeyInfo->nXField ); +} +#else +# define vdbeAssertFieldCountWithinLimits(A,B,C) +#endif + +/* +** Both *pMem1 and *pMem2 contain string values. Compare the two values +** using the collation sequence pColl. As usual, return a negative , zero +** or positive value if *pMem1 is less than, equal to or greater than +** *pMem2, respectively. Similar in spirit to "rc = (*pMem1) - (*pMem2);". +*/ +static int vdbeCompareMemString( + const Mem *pMem1, + const Mem *pMem2, + const CollSeq *pColl, + u8 *prcErr /* If an OOM occurs, set to SQLITE_NOMEM */ +){ + if( pMem1->enc==pColl->enc ){ + /* The strings are already in the correct encoding. Call the + ** comparison function directly */ + return pColl->xCmp(pColl->pUser,pMem1->n,pMem1->z,pMem2->n,pMem2->z); + }else{ + int rc; + const void *v1, *v2; + int n1, n2; + Mem c1; + Mem c2; + sqlite3VdbeMemInit(&c1, pMem1->db, MEM_Null); + sqlite3VdbeMemInit(&c2, pMem1->db, MEM_Null); + sqlite3VdbeMemShallowCopy(&c1, pMem1, MEM_Ephem); + sqlite3VdbeMemShallowCopy(&c2, pMem2, MEM_Ephem); + v1 = sqlite3ValueText((sqlite3_value*)&c1, pColl->enc); + n1 = v1==0 ? 0 : c1.n; + v2 = sqlite3ValueText((sqlite3_value*)&c2, pColl->enc); + n2 = v2==0 ? 0 : c2.n; + rc = pColl->xCmp(pColl->pUser, n1, v1, n2, v2); + if( (v1==0 || v2==0) && prcErr ) *prcErr = SQLITE_NOMEM_BKPT; + sqlite3VdbeMemRelease(&c1); + sqlite3VdbeMemRelease(&c2); + return rc; + } +} + +/* +** The input pBlob is guaranteed to be a Blob that is not marked +** with MEM_Zero. Return true if it could be a zero-blob. +*/ +static int isAllZero(const char *z, int n){ + int i; + for(i=0; in; + int n2 = pB2->n; + + /* It is possible to have a Blob value that has some non-zero content + ** followed by zero content. But that only comes up for Blobs formed + ** by the OP_MakeRecord opcode, and such Blobs never get passed into + ** sqlite3MemCompare(). */ + assert( (pB1->flags & MEM_Zero)==0 || n1==0 ); + assert( (pB2->flags & MEM_Zero)==0 || n2==0 ); + + if( (pB1->flags|pB2->flags) & MEM_Zero ){ + if( pB1->flags & pB2->flags & MEM_Zero ){ + return pB1->u.nZero - pB2->u.nZero; + }else if( pB1->flags & MEM_Zero ){ + if( !isAllZero(pB2->z, pB2->n) ) return -1; + return pB1->u.nZero - n2; + }else{ + if( !isAllZero(pB1->z, pB1->n) ) return +1; + return n1 - pB2->u.nZero; + } + } + c = memcmp(pB1->z, pB2->z, n1>n2 ? n2 : n1); + if( c ) return c; + return n1 - n2; +} + +/* +** Do a comparison between a 64-bit signed integer and a 64-bit floating-point +** number. Return negative, zero, or positive if the first (i64) is less than, +** equal to, or greater than the second (double). +*/ +static int sqlite3IntFloatCompare(i64 i, double r){ + if( sizeof(LONGDOUBLE_TYPE)>8 ){ + LONGDOUBLE_TYPE x = (LONGDOUBLE_TYPE)i; + if( xr ) return +1; + return 0; + }else{ + i64 y; + double s; + if( r<-9223372036854775808.0 ) return +1; + if( r>9223372036854775807.0 ) return -1; + y = (i64)r; + if( iy ){ + if( y==SMALLEST_INT64 && r>0.0 ) return -1; + return +1; + } + s = (double)i; + if( sr ) return +1; + return 0; + } +} + +/* +** Compare the values contained by the two memory cells, returning +** negative, zero or positive if pMem1 is less than, equal to, or greater +** than pMem2. Sorting order is NULL's first, followed by numbers (integers +** and reals) sorted numerically, followed by text ordered by the collating +** sequence pColl and finally blob's ordered by memcmp(). +** +** Two NULL values are considered equal by this function. +*/ +SQLITE_PRIVATE int sqlite3MemCompare(const Mem *pMem1, const Mem *pMem2, const CollSeq *pColl){ + int f1, f2; + int combined_flags; + + f1 = pMem1->flags; + f2 = pMem2->flags; + combined_flags = f1|f2; + assert( (combined_flags & MEM_RowSet)==0 ); + + /* If one value is NULL, it is less than the other. If both values + ** are NULL, return 0. + */ + if( combined_flags&MEM_Null ){ + return (f2&MEM_Null) - (f1&MEM_Null); + } + + /* At least one of the two values is a number + */ + if( combined_flags&(MEM_Int|MEM_Real) ){ + if( (f1 & f2 & MEM_Int)!=0 ){ + if( pMem1->u.i < pMem2->u.i ) return -1; + if( pMem1->u.i > pMem2->u.i ) return +1; + return 0; + } + if( (f1 & f2 & MEM_Real)!=0 ){ + if( pMem1->u.r < pMem2->u.r ) return -1; + if( pMem1->u.r > pMem2->u.r ) return +1; + return 0; + } + if( (f1&MEM_Int)!=0 ){ + if( (f2&MEM_Real)!=0 ){ + return sqlite3IntFloatCompare(pMem1->u.i, pMem2->u.r); + }else{ + return -1; + } + } + if( (f1&MEM_Real)!=0 ){ + if( (f2&MEM_Int)!=0 ){ + return -sqlite3IntFloatCompare(pMem2->u.i, pMem1->u.r); + }else{ + return -1; + } + } + return +1; + } + + /* If one value is a string and the other is a blob, the string is less. + ** If both are strings, compare using the collating functions. + */ + if( combined_flags&MEM_Str ){ + if( (f1 & MEM_Str)==0 ){ + return 1; + } + if( (f2 & MEM_Str)==0 ){ + return -1; + } + + assert( pMem1->enc==pMem2->enc || pMem1->db->mallocFailed ); + assert( pMem1->enc==SQLITE_UTF8 || + pMem1->enc==SQLITE_UTF16LE || pMem1->enc==SQLITE_UTF16BE ); + + /* The collation sequence must be defined at this point, even if + ** the user deletes the collation sequence after the vdbe program is + ** compiled (this was not always the case). + */ + assert( !pColl || pColl->xCmp ); + + if( pColl ){ + return vdbeCompareMemString(pMem1, pMem2, pColl, 0); + } + /* If a NULL pointer was passed as the collate function, fall through + ** to the blob case and use memcmp(). */ + } + + /* Both values must be blobs. Compare using memcmp(). */ + return sqlite3BlobCompare(pMem1, pMem2); +} + + +/* +** The first argument passed to this function is a serial-type that +** corresponds to an integer - all values between 1 and 9 inclusive +** except 7. The second points to a buffer containing an integer value +** serialized according to serial_type. This function deserializes +** and returns the value. +*/ +static i64 vdbeRecordDecodeInt(u32 serial_type, const u8 *aKey){ + u32 y; + assert( CORRUPT_DB || (serial_type>=1 && serial_type<=9 && serial_type!=7) ); + switch( serial_type ){ + case 0: + case 1: + testcase( aKey[0]&0x80 ); + return ONE_BYTE_INT(aKey); + case 2: + testcase( aKey[0]&0x80 ); + return TWO_BYTE_INT(aKey); + case 3: + testcase( aKey[0]&0x80 ); + return THREE_BYTE_INT(aKey); + case 4: { + testcase( aKey[0]&0x80 ); + y = FOUR_BYTE_UINT(aKey); + return (i64)*(int*)&y; + } + case 5: { + testcase( aKey[0]&0x80 ); + return FOUR_BYTE_UINT(aKey+2) + (((i64)1)<<32)*TWO_BYTE_INT(aKey); + } + case 6: { + u64 x = FOUR_BYTE_UINT(aKey); + testcase( aKey[0]&0x80 ); + x = (x<<32) | FOUR_BYTE_UINT(aKey+4); + return (i64)*(i64*)&x; + } + } + + return (serial_type - 8); +} + +/* +** This function compares the two table rows or index records +** specified by {nKey1, pKey1} and pPKey2. It returns a negative, zero +** or positive integer if key1 is less than, equal to or +** greater than key2. The {nKey1, pKey1} key must be a blob +** created by the OP_MakeRecord opcode of the VDBE. The pPKey2 +** key must be a parsed key such as obtained from +** sqlite3VdbeParseRecord. +** +** If argument bSkip is non-zero, it is assumed that the caller has already +** determined that the first fields of the keys are equal. +** +** Key1 and Key2 do not have to contain the same number of fields. If all +** fields that appear in both keys are equal, then pPKey2->default_rc is +** returned. +** +** If database corruption is discovered, set pPKey2->errCode to +** SQLITE_CORRUPT and return 0. If an OOM error is encountered, +** pPKey2->errCode is set to SQLITE_NOMEM and, if it is not NULL, the +** malloc-failed flag set on database handle (pPKey2->pKeyInfo->db). +*/ +SQLITE_PRIVATE int sqlite3VdbeRecordCompareWithSkip( + int nKey1, const void *pKey1, /* Left key */ + UnpackedRecord *pPKey2, /* Right key */ + int bSkip /* If true, skip the first field */ +){ + u32 d1; /* Offset into aKey[] of next data element */ + int i; /* Index of next field to compare */ + u32 szHdr1; /* Size of record header in bytes */ + u32 idx1; /* Offset of first type in header */ + int rc = 0; /* Return value */ + Mem *pRhs = pPKey2->aMem; /* Next field of pPKey2 to compare */ + KeyInfo *pKeyInfo = pPKey2->pKeyInfo; + const unsigned char *aKey1 = (const unsigned char *)pKey1; + Mem mem1; + + /* If bSkip is true, then the caller has already determined that the first + ** two elements in the keys are equal. Fix the various stack variables so + ** that this routine begins comparing at the second field. */ + if( bSkip ){ + u32 s1; + idx1 = 1 + getVarint32(&aKey1[1], s1); + szHdr1 = aKey1[0]; + d1 = szHdr1 + sqlite3VdbeSerialTypeLen(s1); + i = 1; + pRhs++; + }else{ + idx1 = getVarint32(aKey1, szHdr1); + d1 = szHdr1; + if( d1>(unsigned)nKey1 ){ + pPKey2->errCode = (u8)SQLITE_CORRUPT_BKPT; + return 0; /* Corruption */ + } + i = 0; + } + + VVA_ONLY( mem1.szMalloc = 0; ) /* Only needed by assert() statements */ + assert( pPKey2->pKeyInfo->nField+pPKey2->pKeyInfo->nXField>=pPKey2->nField + || CORRUPT_DB ); + assert( pPKey2->pKeyInfo->aSortOrder!=0 ); + assert( pPKey2->pKeyInfo->nField>0 ); + assert( idx1<=szHdr1 || CORRUPT_DB ); + do{ + u32 serial_type; + + /* RHS is an integer */ + if( pRhs->flags & MEM_Int ){ + serial_type = aKey1[idx1]; + testcase( serial_type==12 ); + if( serial_type>=10 ){ + rc = +1; + }else if( serial_type==0 ){ + rc = -1; + }else if( serial_type==7 ){ + sqlite3VdbeSerialGet(&aKey1[d1], serial_type, &mem1); + rc = -sqlite3IntFloatCompare(pRhs->u.i, mem1.u.r); + }else{ + i64 lhs = vdbeRecordDecodeInt(serial_type, &aKey1[d1]); + i64 rhs = pRhs->u.i; + if( lhsrhs ){ + rc = +1; + } + } + } + + /* RHS is real */ + else if( pRhs->flags & MEM_Real ){ + serial_type = aKey1[idx1]; + if( serial_type>=10 ){ + /* Serial types 12 or greater are strings and blobs (greater than + ** numbers). Types 10 and 11 are currently "reserved for future + ** use", so it doesn't really matter what the results of comparing + ** them to numberic values are. */ + rc = +1; + }else if( serial_type==0 ){ + rc = -1; + }else{ + sqlite3VdbeSerialGet(&aKey1[d1], serial_type, &mem1); + if( serial_type==7 ){ + if( mem1.u.ru.r ){ + rc = -1; + }else if( mem1.u.r>pRhs->u.r ){ + rc = +1; + } + }else{ + rc = sqlite3IntFloatCompare(mem1.u.i, pRhs->u.r); + } + } + } + + /* RHS is a string */ + else if( pRhs->flags & MEM_Str ){ + getVarint32(&aKey1[idx1], serial_type); + testcase( serial_type==12 ); + if( serial_type<12 ){ + rc = -1; + }else if( !(serial_type & 0x01) ){ + rc = +1; + }else{ + mem1.n = (serial_type - 12) / 2; + testcase( (d1+mem1.n)==(unsigned)nKey1 ); + testcase( (d1+mem1.n+1)==(unsigned)nKey1 ); + if( (d1+mem1.n) > (unsigned)nKey1 ){ + pPKey2->errCode = (u8)SQLITE_CORRUPT_BKPT; + return 0; /* Corruption */ + }else if( pKeyInfo->aColl[i] ){ + mem1.enc = pKeyInfo->enc; + mem1.db = pKeyInfo->db; + mem1.flags = MEM_Str; + mem1.z = (char*)&aKey1[d1]; + rc = vdbeCompareMemString( + &mem1, pRhs, pKeyInfo->aColl[i], &pPKey2->errCode + ); + }else{ + int nCmp = MIN(mem1.n, pRhs->n); + rc = memcmp(&aKey1[d1], pRhs->z, nCmp); + if( rc==0 ) rc = mem1.n - pRhs->n; + } + } + } + + /* RHS is a blob */ + else if( pRhs->flags & MEM_Blob ){ + assert( (pRhs->flags & MEM_Zero)==0 || pRhs->n==0 ); + getVarint32(&aKey1[idx1], serial_type); + testcase( serial_type==12 ); + if( serial_type<12 || (serial_type & 0x01) ){ + rc = -1; + }else{ + int nStr = (serial_type - 12) / 2; + testcase( (d1+nStr)==(unsigned)nKey1 ); + testcase( (d1+nStr+1)==(unsigned)nKey1 ); + if( (d1+nStr) > (unsigned)nKey1 ){ + pPKey2->errCode = (u8)SQLITE_CORRUPT_BKPT; + return 0; /* Corruption */ + }else if( pRhs->flags & MEM_Zero ){ + if( !isAllZero((const char*)&aKey1[d1],nStr) ){ + rc = 1; + }else{ + rc = nStr - pRhs->u.nZero; + } + }else{ + int nCmp = MIN(nStr, pRhs->n); + rc = memcmp(&aKey1[d1], pRhs->z, nCmp); + if( rc==0 ) rc = nStr - pRhs->n; + } + } + } + + /* RHS is null */ + else{ + serial_type = aKey1[idx1]; + rc = (serial_type!=0); + } + + if( rc!=0 ){ + if( pKeyInfo->aSortOrder[i] ){ + rc = -rc; + } + assert( vdbeRecordCompareDebug(nKey1, pKey1, pPKey2, rc) ); + assert( mem1.szMalloc==0 ); /* See comment below */ + return rc; + } + + i++; + pRhs++; + d1 += sqlite3VdbeSerialTypeLen(serial_type); + idx1 += sqlite3VarintLen(serial_type); + }while( idx1<(unsigned)szHdr1 && inField && d1<=(unsigned)nKey1 ); + + /* 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). */ + assert( mem1.szMalloc==0 ); + + /* rc==0 here means that one or both of the keys ran out of fields and + ** all the fields up to that point were equal. Return the default_rc + ** value. */ + assert( CORRUPT_DB + || vdbeRecordCompareDebug(nKey1, pKey1, pPKey2, pPKey2->default_rc) + || pKeyInfo->db->mallocFailed + ); + pPKey2->eqSeen = 1; + return pPKey2->default_rc; +} +SQLITE_PRIVATE int sqlite3VdbeRecordCompare( + int nKey1, const void *pKey1, /* Left key */ + UnpackedRecord *pPKey2 /* Right key */ +){ + return sqlite3VdbeRecordCompareWithSkip(nKey1, pKey1, pPKey2, 0); +} + + +/* +** This function is an optimized version of sqlite3VdbeRecordCompare() +** that (a) the first field of pPKey2 is an integer, and (b) the +** size-of-header varint at the start of (pKey1/nKey1) fits in a single +** byte (i.e. is less than 128). +** +** To avoid concerns about buffer overreads, this routine is only used +** on schemas where the maximum valid header size is 63 bytes or less. +*/ +static int vdbeRecordCompareInt( + int nKey1, const void *pKey1, /* Left key */ + UnpackedRecord *pPKey2 /* Right key */ +){ + const u8 *aKey = &((const u8*)pKey1)[*(const u8*)pKey1 & 0x3F]; + int serial_type = ((const u8*)pKey1)[1]; + int res; + u32 y; + u64 x; + i64 v; + i64 lhs; + + vdbeAssertFieldCountWithinLimits(nKey1, pKey1, pPKey2->pKeyInfo); + assert( (*(u8*)pKey1)<=0x3F || CORRUPT_DB ); + switch( serial_type ){ + case 1: { /* 1-byte signed integer */ + lhs = ONE_BYTE_INT(aKey); + testcase( lhs<0 ); + break; + } + case 2: { /* 2-byte signed integer */ + lhs = TWO_BYTE_INT(aKey); + testcase( lhs<0 ); + break; + } + case 3: { /* 3-byte signed integer */ + lhs = THREE_BYTE_INT(aKey); + testcase( lhs<0 ); + break; + } + case 4: { /* 4-byte signed integer */ + y = FOUR_BYTE_UINT(aKey); + lhs = (i64)*(int*)&y; + testcase( lhs<0 ); + break; + } + case 5: { /* 6-byte signed integer */ + lhs = FOUR_BYTE_UINT(aKey+2) + (((i64)1)<<32)*TWO_BYTE_INT(aKey); + testcase( lhs<0 ); + break; + } + case 6: { /* 8-byte signed integer */ + x = FOUR_BYTE_UINT(aKey); + x = (x<<32) | FOUR_BYTE_UINT(aKey+4); + lhs = *(i64*)&x; + testcase( lhs<0 ); + break; + } + case 8: + lhs = 0; + break; + case 9: + lhs = 1; + break; + + /* This case could be removed without changing the results of running + ** this code. Including it causes gcc to generate a faster switch + ** statement (since the range of switch targets now starts at zero and + ** is contiguous) but does not cause any duplicate code to be generated + ** (as gcc is clever enough to combine the two like cases). Other + ** compilers might be similar. */ + case 0: case 7: + return sqlite3VdbeRecordCompare(nKey1, pKey1, pPKey2); + + default: + return sqlite3VdbeRecordCompare(nKey1, pKey1, pPKey2); + } + + v = pPKey2->aMem[0].u.i; + if( v>lhs ){ + res = pPKey2->r1; + }else if( vr2; + }else if( pPKey2->nField>1 ){ + /* The first fields of the two keys are equal. Compare the trailing + ** fields. */ + res = sqlite3VdbeRecordCompareWithSkip(nKey1, pKey1, pPKey2, 1); + }else{ + /* The first fields of the two keys are equal and there are no trailing + ** fields. Return pPKey2->default_rc in this case. */ + res = pPKey2->default_rc; + pPKey2->eqSeen = 1; + } + + assert( vdbeRecordCompareDebug(nKey1, pKey1, pPKey2, res) ); + return res; +} + +/* +** This function is an optimized version of sqlite3VdbeRecordCompare() +** that (a) the first field of pPKey2 is a string, that (b) the first field +** uses the collation sequence BINARY and (c) that the size-of-header varint +** at the start of (pKey1/nKey1) fits in a single byte. +*/ +static int vdbeRecordCompareString( + int nKey1, const void *pKey1, /* Left key */ + UnpackedRecord *pPKey2 /* Right key */ +){ + const u8 *aKey1 = (const u8*)pKey1; + int serial_type; + int res; + + assert( pPKey2->aMem[0].flags & MEM_Str ); + vdbeAssertFieldCountWithinLimits(nKey1, pKey1, pPKey2->pKeyInfo); + getVarint32(&aKey1[1], serial_type); + if( serial_type<12 ){ + res = pPKey2->r1; /* (pKey1/nKey1) is a number or a null */ + }else if( !(serial_type & 0x01) ){ + res = pPKey2->r2; /* (pKey1/nKey1) is a blob */ + }else{ + int nCmp; + int nStr; + int szHdr = aKey1[0]; + + nStr = (serial_type-12) / 2; + if( (szHdr + nStr) > nKey1 ){ + pPKey2->errCode = (u8)SQLITE_CORRUPT_BKPT; + return 0; /* Corruption */ + } + nCmp = MIN( pPKey2->aMem[0].n, nStr ); + res = memcmp(&aKey1[szHdr], pPKey2->aMem[0].z, nCmp); + + if( res==0 ){ + res = nStr - pPKey2->aMem[0].n; + if( res==0 ){ + if( pPKey2->nField>1 ){ + res = sqlite3VdbeRecordCompareWithSkip(nKey1, pKey1, pPKey2, 1); + }else{ + res = pPKey2->default_rc; + pPKey2->eqSeen = 1; + } + }else if( res>0 ){ + res = pPKey2->r2; + }else{ + res = pPKey2->r1; + } + }else if( res>0 ){ + res = pPKey2->r2; + }else{ + res = pPKey2->r1; + } + } + + assert( vdbeRecordCompareDebug(nKey1, pKey1, pPKey2, res) + || CORRUPT_DB + || pPKey2->pKeyInfo->db->mallocFailed + ); + return res; +} + +/* +** Return a pointer to an sqlite3VdbeRecordCompare() compatible function +** suitable for comparing serialized records to the unpacked record passed +** as the only argument. +*/ +SQLITE_PRIVATE RecordCompare sqlite3VdbeFindCompare(UnpackedRecord *p){ + /* varintRecordCompareInt() and varintRecordCompareString() both assume + ** that the size-of-header varint that occurs at the start of each record + ** fits in a single byte (i.e. is 127 or less). varintRecordCompareInt() + ** also assumes that it is safe to overread a buffer by at least the + ** maximum possible legal header size plus 8 bytes. Because there is + ** guaranteed to be at least 74 (but not 136) bytes of padding following each + ** buffer passed to varintRecordCompareInt() this makes it convenient to + ** limit the size of the header to 64 bytes in cases where the first field + ** is an integer. + ** + ** The easiest way to enforce this limit is to consider only records with + ** 13 fields or less. If the first field is an integer, the maximum legal + ** header size is (12*5 + 1 + 1) bytes. */ + if( (p->pKeyInfo->nField + p->pKeyInfo->nXField)<=13 ){ + int flags = p->aMem[0].flags; + if( p->pKeyInfo->aSortOrder[0] ){ + p->r1 = 1; + p->r2 = -1; + }else{ + p->r1 = -1; + p->r2 = 1; + } + if( (flags & MEM_Int) ){ + return vdbeRecordCompareInt; + } + testcase( flags & MEM_Real ); + testcase( flags & MEM_Null ); + testcase( flags & MEM_Blob ); + if( (flags & (MEM_Real|MEM_Null|MEM_Blob))==0 && p->pKeyInfo->aColl[0]==0 ){ + assert( flags & MEM_Str ); + return vdbeRecordCompareString; + } + } + + return sqlite3VdbeRecordCompare; +} + +/* +** pCur points at an index entry created using the OP_MakeRecord opcode. +** Read the rowid (the last field in the record) and store it in *rowid. +** Return SQLITE_OK if everything works, or an error code otherwise. +** +** pCur might be pointing to text obtained from a corrupt database file. +** So the content cannot be trusted. Do appropriate checks on the content. +*/ +SQLITE_PRIVATE int sqlite3VdbeIdxRowid(sqlite3 *db, BtCursor *pCur, i64 *rowid){ + i64 nCellKey = 0; + int rc; + u32 szHdr; /* Size of the header */ + u32 typeRowid; /* Serial type of the rowid */ + u32 lenRowid; /* Size of the rowid */ + Mem m, v; + + /* Get the size of the index entry. Only indices entries of less + ** than 2GiB are support - anything large must be database corruption. + ** Any corruption is detected in sqlite3BtreeParseCellPtr(), though, so + ** this code can safely assume that nCellKey is 32-bits + */ + assert( sqlite3BtreeCursorIsValid(pCur) ); + nCellKey = sqlite3BtreePayloadSize(pCur); + assert( (nCellKey & SQLITE_MAX_U32)==(u64)nCellKey ); + + /* Read in the complete content of the index entry */ + sqlite3VdbeMemInit(&m, db, 0); + rc = sqlite3VdbeMemFromBtree(pCur, 0, (u32)nCellKey, 1, &m); + if( rc ){ + return rc; + } + + /* The index entry must begin with a header size */ + (void)getVarint32((u8*)m.z, szHdr); + testcase( szHdr==3 ); + testcase( szHdr==m.n ); + if( unlikely(szHdr<3 || (int)szHdr>m.n) ){ + goto idx_rowid_corruption; + } + + /* The last field of the index should be an integer - the ROWID. + ** Verify that the last entry really is an integer. */ + (void)getVarint32((u8*)&m.z[szHdr-1], typeRowid); + testcase( typeRowid==1 ); + testcase( typeRowid==2 ); + testcase( typeRowid==3 ); + testcase( typeRowid==4 ); + testcase( typeRowid==5 ); + testcase( typeRowid==6 ); + testcase( typeRowid==8 ); + testcase( typeRowid==9 ); + if( unlikely(typeRowid<1 || typeRowid>9 || typeRowid==7) ){ + goto idx_rowid_corruption; + } + lenRowid = sqlite3SmallTypeSizes[typeRowid]; + testcase( (u32)m.n==szHdr+lenRowid ); + if( unlikely((u32)m.neCurType==CURTYPE_BTREE ); + pCur = pC->uc.pCursor; + assert( sqlite3BtreeCursorIsValid(pCur) ); + nCellKey = sqlite3BtreePayloadSize(pCur); + /* nCellKey will always be between 0 and 0xffffffff because of the way + ** that btreeParseCellPtr() and sqlite3GetVarint32() are implemented */ + if( nCellKey<=0 || nCellKey>0x7fffffff ){ + *res = 0; + return SQLITE_CORRUPT_BKPT; + } + sqlite3VdbeMemInit(&m, db, 0); + rc = sqlite3VdbeMemFromBtree(pCur, 0, (u32)nCellKey, 1, &m); + if( rc ){ + return rc; + } + *res = sqlite3VdbeRecordCompare(m.n, m.z, pUnpacked); + sqlite3VdbeMemRelease(&m); + return SQLITE_OK; +} + +/* +** This routine sets the value to be returned by subsequent calls to +** sqlite3_changes() on the database handle 'db'. +*/ +SQLITE_PRIVATE void sqlite3VdbeSetChanges(sqlite3 *db, int nChange){ + assert( sqlite3_mutex_held(db->mutex) ); + db->nChange = nChange; + db->nTotalChange += nChange; +} + +/* +** Set a flag in the vdbe to update the change counter when it is finalised +** or reset. +*/ +SQLITE_PRIVATE void sqlite3VdbeCountChanges(Vdbe *v){ + v->changeCntOn = 1; +} + +/* +** Mark every prepared statement associated with a database connection +** as expired. +** +** An expired statement means that recompilation of the statement is +** recommend. Statements expire when things happen that make their +** programs obsolete. Removing user-defined functions or collating +** sequences, or changing an authorization function are the types of +** things that make prepared statements obsolete. +*/ +SQLITE_PRIVATE void sqlite3ExpirePreparedStatements(sqlite3 *db){ + Vdbe *p; + for(p = db->pVdbe; p; p=p->pNext){ + p->expired = 1; + } +} + +/* +** Return the database associated with the Vdbe. +*/ +SQLITE_PRIVATE sqlite3 *sqlite3VdbeDb(Vdbe *v){ + return v->db; +} + +/* +** 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 *sqlite3VdbeGetBoundValue(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); + } + 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)); + } +} + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* +** Transfer error message text from an sqlite3_vtab.zErrMsg (text stored +** in memory obtained from sqlite3_malloc) into a Vdbe.zErrMsg (text stored +** in memory obtained from sqlite3DbMalloc). +*/ +SQLITE_PRIVATE void sqlite3VtabImportErrmsg(Vdbe *p, sqlite3_vtab *pVtab){ + if( pVtab->zErrMsg ){ + sqlite3 *db = p->db; + sqlite3DbFree(db, p->zErrMsg); + p->zErrMsg = sqlite3DbStrDup(db, pVtab->zErrMsg); + sqlite3_free(pVtab->zErrMsg); + pVtab->zErrMsg = 0; + } +} +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + +/* +** If the second argument is not NULL, release any allocations associated +** with the memory cells in the p->aMem[] array. Also free the UnpackedRecord +** structure itself, using sqlite3DbFree(). +** +** This function is used to free UnpackedRecord structures allocated by +** the vdbeUnpackRecord() function found in vdbeapi.c. +*/ +static void vdbeFreeUnpacked(sqlite3 *db, UnpackedRecord *p){ + if( p ){ + int i; + for(i=0; inField; i++){ + Mem *pMem = &p->aMem[i]; + if( pMem->zMalloc ) sqlite3VdbeMemRelease(pMem); + } + sqlite3DbFree(db, p); + } +} +#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */ + +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK +/* +** Invoke the pre-update hook. If this is an UPDATE or DELETE pre-update call, +** then cursor passed as the second argument should point to the row about +** to be update or deleted. If the application calls sqlite3_preupdate_old(), +** the required value will be read from the row the cursor points to. +*/ +SQLITE_PRIVATE void sqlite3VdbePreUpdateHook( + Vdbe *v, /* Vdbe pre-update hook is invoked by */ + VdbeCursor *pCsr, /* Cursor to grab old.* values from */ + int op, /* SQLITE_INSERT, UPDATE or DELETE */ + const char *zDb, /* Database name */ + Table *pTab, /* Modified table */ + i64 iKey1, /* Initial key value */ + int iReg /* Register for new.* record */ +){ + sqlite3 *db = v->db; + i64 iKey2; + PreUpdate preupdate; + const char *zTbl = pTab->zName; + static const u8 fakeSortOrder = 0; + + assert( db->pPreUpdate==0 ); + memset(&preupdate, 0, sizeof(PreUpdate)); + if( op==SQLITE_UPDATE ){ + iKey2 = v->aMem[iReg].u.i; + }else{ + iKey2 = iKey1; + } + + assert( pCsr->nField==pTab->nCol + || (pCsr->nField==pTab->nCol+1 && op==SQLITE_DELETE && iReg==-1) + ); + + preupdate.v = v; + preupdate.pCsr = pCsr; + preupdate.op = op; + preupdate.iNewReg = iReg; + preupdate.keyinfo.db = db; + preupdate.keyinfo.enc = ENC(db); + preupdate.keyinfo.nField = pTab->nCol; + preupdate.keyinfo.aSortOrder = (u8*)&fakeSortOrder; + preupdate.iKey1 = iKey1; + preupdate.iKey2 = iKey2; + preupdate.pTab = pTab; + + db->pPreUpdate = &preupdate; + db->xPreUpdateCallback(db->pPreUpdateArg, db, op, zDb, zTbl, iKey1, iKey2); + db->pPreUpdate = 0; + sqlite3DbFree(db, preupdate.aRecord); + vdbeFreeUnpacked(db, preupdate.pUnpacked); + vdbeFreeUnpacked(db, preupdate.pNewUnpacked); + if( preupdate.aNew ){ + int i; + for(i=0; inField; i++){ + sqlite3VdbeMemRelease(&preupdate.aNew[i]); + } + sqlite3DbFree(db, preupdate.aNew); + } +} +#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */ + +/************** End of vdbeaux.c *********************************************/ +/************** Begin file vdbeapi.c *****************************************/ +/* +** 2004 May 26 +** +** 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 use to implement APIs that are part of the +** VDBE. +*/ +/* #include "sqliteInt.h" */ +/* #include "vdbeInt.h" */ + +#ifndef SQLITE_OMIT_DEPRECATED +/* +** Return TRUE (non-zero) of the statement supplied as an argument needs +** to be recompiled. A statement needs to be recompiled whenever the +** execution environment changes in a way that would alter the program +** that sqlite3_prepare() generates. For example, if new functions or +** collating sequences are registered or if an authorizer function is +** added or changed. +*/ +SQLITE_API int sqlite3_expired(sqlite3_stmt *pStmt){ + Vdbe *p = (Vdbe*)pStmt; + return p==0 || p->expired; +} +#endif + +/* +** Check on a Vdbe to make sure it has not been finalized. Log +** an error and return true if it has been finalized (or is otherwise +** invalid). Return false if it is ok. +*/ +static int vdbeSafety(Vdbe *p){ + if( p->db==0 ){ + sqlite3_log(SQLITE_MISUSE, "API called with finalized prepared statement"); + return 1; + }else{ + return 0; + } +} +static int vdbeSafetyNotNull(Vdbe *p){ + if( p==0 ){ + sqlite3_log(SQLITE_MISUSE, "API called with NULL prepared statement"); + return 1; + }else{ + return vdbeSafety(p); + } +} + +#ifndef SQLITE_OMIT_TRACE +/* +** Invoke the profile callback. This routine is only called if we already +** know that the profile callback is defined and needs to be invoked. +*/ +static SQLITE_NOINLINE void invokeProfileCallback(sqlite3 *db, Vdbe *p){ + sqlite3_int64 iNow; + sqlite3_int64 iElapse; + assert( p->startTime>0 ); + assert( db->xProfile!=0 || (db->mTrace & SQLITE_TRACE_PROFILE)!=0 ); + assert( db->init.busy==0 ); + assert( p->zSql!=0 ); + sqlite3OsCurrentTimeInt64(db->pVfs, &iNow); + iElapse = (iNow - p->startTime)*1000000; + if( db->xProfile ){ + db->xProfile(db->pProfileArg, p->zSql, iElapse); + } + if( db->mTrace & SQLITE_TRACE_PROFILE ){ + db->xTrace(SQLITE_TRACE_PROFILE, db->pTraceArg, p, (void*)&iElapse); + } + p->startTime = 0; +} +/* +** The checkProfileCallback(DB,P) macro checks to see if a profile callback +** is needed, and it invokes the callback if it is needed. +*/ +# define checkProfileCallback(DB,P) \ + if( ((P)->startTime)>0 ){ invokeProfileCallback(DB,P); } +#else +# define checkProfileCallback(DB,P) /*no-op*/ +#endif + +/* +** The following routine destroys a virtual machine that is created by +** the sqlite3_compile() routine. The integer returned is an SQLITE_ +** success/failure code that describes the result of executing the virtual +** machine. +** +** This routine sets the error code and string returned by +** sqlite3_errcode(), sqlite3_errmsg() and sqlite3_errmsg16(). +*/ +SQLITE_API int sqlite3_finalize(sqlite3_stmt *pStmt){ + int rc; + if( pStmt==0 ){ + /* IMPLEMENTATION-OF: R-57228-12904 Invoking sqlite3_finalize() on a NULL + ** pointer is a harmless no-op. */ + rc = SQLITE_OK; + }else{ + Vdbe *v = (Vdbe*)pStmt; + sqlite3 *db = v->db; + if( vdbeSafety(v) ) return SQLITE_MISUSE_BKPT; + sqlite3_mutex_enter(db->mutex); + checkProfileCallback(db, v); + rc = sqlite3VdbeFinalize(v); + rc = sqlite3ApiExit(db, rc); + sqlite3LeaveMutexAndCloseZombie(db); + } + return rc; +} + +/* +** Terminate the current execution of an SQL statement and reset it +** back to its starting state so that it can be reused. A success code from +** the prior execution is returned. +** +** This routine sets the error code and string returned by +** sqlite3_errcode(), sqlite3_errmsg() and sqlite3_errmsg16(). +*/ +SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt){ + int rc; + if( pStmt==0 ){ + rc = SQLITE_OK; + }else{ + Vdbe *v = (Vdbe*)pStmt; + sqlite3 *db = v->db; + sqlite3_mutex_enter(db->mutex); + checkProfileCallback(db, v); + rc = sqlite3VdbeReset(v); + sqlite3VdbeRewind(v); + assert( (rc & (db->errMask))==rc ); + rc = sqlite3ApiExit(db, rc); + sqlite3_mutex_leave(db->mutex); + } + return rc; +} + +/* +** Set all the parameters in the compiled SQL statement to NULL. +*/ +SQLITE_API int sqlite3_clear_bindings(sqlite3_stmt *pStmt){ + int i; + int rc = SQLITE_OK; + Vdbe *p = (Vdbe*)pStmt; +#if SQLITE_THREADSAFE + sqlite3_mutex *mutex = ((Vdbe*)pStmt)->db->mutex; +#endif + sqlite3_mutex_enter(mutex); + for(i=0; inVar; i++){ + sqlite3VdbeMemRelease(&p->aVar[i]); + p->aVar[i].flags = MEM_Null; + } + if( p->isPrepareV2 && p->expmask ){ + p->expired = 1; + } + sqlite3_mutex_leave(mutex); + return rc; +} + + +/**************************** sqlite3_value_ ******************************* +** The following routines extract information from a Mem or sqlite3_value +** structure. +*/ +SQLITE_API const void *sqlite3_value_blob(sqlite3_value *pVal){ + Mem *p = (Mem*)pVal; + if( p->flags & (MEM_Blob|MEM_Str) ){ + if( ExpandBlob(p)!=SQLITE_OK ){ + assert( p->flags==MEM_Null && p->z==0 ); + return 0; + } + p->flags |= MEM_Blob; + return p->n ? p->z : 0; + }else{ + return sqlite3_value_text(pVal); + } +} +SQLITE_API int sqlite3_value_bytes(sqlite3_value *pVal){ + return sqlite3ValueBytes(pVal, SQLITE_UTF8); +} +SQLITE_API int sqlite3_value_bytes16(sqlite3_value *pVal){ + return sqlite3ValueBytes(pVal, SQLITE_UTF16NATIVE); +} +SQLITE_API double sqlite3_value_double(sqlite3_value *pVal){ + return sqlite3VdbeRealValue((Mem*)pVal); +} +SQLITE_API int sqlite3_value_int(sqlite3_value *pVal){ + return (int)sqlite3VdbeIntValue((Mem*)pVal); +} +SQLITE_API sqlite_int64 sqlite3_value_int64(sqlite3_value *pVal){ + return sqlite3VdbeIntValue((Mem*)pVal); +} +SQLITE_API unsigned int sqlite3_value_subtype(sqlite3_value *pVal){ + Mem *pMem = (Mem*)pVal; + return ((pMem->flags & MEM_Subtype) ? pMem->eSubtype : 0); +} +SQLITE_API const unsigned char *sqlite3_value_text(sqlite3_value *pVal){ + return (const unsigned char *)sqlite3ValueText(pVal, SQLITE_UTF8); +} +#ifndef SQLITE_OMIT_UTF16 +SQLITE_API const void *sqlite3_value_text16(sqlite3_value* pVal){ + return sqlite3ValueText(pVal, SQLITE_UTF16NATIVE); +} +SQLITE_API const void *sqlite3_value_text16be(sqlite3_value *pVal){ + return sqlite3ValueText(pVal, SQLITE_UTF16BE); +} +SQLITE_API const void *sqlite3_value_text16le(sqlite3_value *pVal){ + return sqlite3ValueText(pVal, SQLITE_UTF16LE); +} +#endif /* SQLITE_OMIT_UTF16 */ +/* EVIDENCE-OF: R-12793-43283 Every value in SQLite has one of five +** fundamental datatypes: 64-bit signed integer 64-bit IEEE floating +** point number string BLOB NULL +*/ +SQLITE_API int sqlite3_value_type(sqlite3_value* pVal){ + static const u8 aType[] = { + SQLITE_BLOB, /* 0x00 */ + SQLITE_NULL, /* 0x01 */ + SQLITE_TEXT, /* 0x02 */ + SQLITE_NULL, /* 0x03 */ + SQLITE_INTEGER, /* 0x04 */ + SQLITE_NULL, /* 0x05 */ + SQLITE_INTEGER, /* 0x06 */ + SQLITE_NULL, /* 0x07 */ + SQLITE_FLOAT, /* 0x08 */ + SQLITE_NULL, /* 0x09 */ + SQLITE_FLOAT, /* 0x0a */ + SQLITE_NULL, /* 0x0b */ + SQLITE_INTEGER, /* 0x0c */ + SQLITE_NULL, /* 0x0d */ + SQLITE_INTEGER, /* 0x0e */ + SQLITE_NULL, /* 0x0f */ + SQLITE_BLOB, /* 0x10 */ + SQLITE_NULL, /* 0x11 */ + SQLITE_TEXT, /* 0x12 */ + SQLITE_NULL, /* 0x13 */ + SQLITE_INTEGER, /* 0x14 */ + SQLITE_NULL, /* 0x15 */ + SQLITE_INTEGER, /* 0x16 */ + SQLITE_NULL, /* 0x17 */ + SQLITE_FLOAT, /* 0x18 */ + SQLITE_NULL, /* 0x19 */ + SQLITE_FLOAT, /* 0x1a */ + SQLITE_NULL, /* 0x1b */ + SQLITE_INTEGER, /* 0x1c */ + SQLITE_NULL, /* 0x1d */ + SQLITE_INTEGER, /* 0x1e */ + SQLITE_NULL, /* 0x1f */ + }; + return aType[pVal->flags&MEM_AffMask]; +} + +/* Make a copy of an sqlite3_value object +*/ +SQLITE_API sqlite3_value *sqlite3_value_dup(const sqlite3_value *pOrig){ + sqlite3_value *pNew; + if( pOrig==0 ) return 0; + pNew = sqlite3_malloc( sizeof(*pNew) ); + if( pNew==0 ) return 0; + memset(pNew, 0, sizeof(*pNew)); + memcpy(pNew, pOrig, MEMCELLSIZE); + pNew->flags &= ~MEM_Dyn; + pNew->db = 0; + if( pNew->flags&(MEM_Str|MEM_Blob) ){ + pNew->flags &= ~(MEM_Static|MEM_Dyn); + pNew->flags |= MEM_Ephem; + if( sqlite3VdbeMemMakeWriteable(pNew)!=SQLITE_OK ){ + sqlite3ValueFree(pNew); + pNew = 0; + } + } + return pNew; +} + +/* Destroy an sqlite3_value object previously obtained from +** sqlite3_value_dup(). +*/ +SQLITE_API void sqlite3_value_free(sqlite3_value *pOld){ + sqlite3ValueFree(pOld); +} + + +/**************************** sqlite3_result_ ******************************* +** The following routines are used by user-defined functions to specify +** the function result. +** +** The setStrOrError() function calls sqlite3VdbeMemSetStr() to store the +** result as a string or blob but if the string or blob is too large, it +** then sets the error code to SQLITE_TOOBIG +** +** The invokeValueDestructor(P,X) routine invokes destructor function X() +** on value P is not going to be used and need to be destroyed. +*/ +static void setResultStrOrError( + sqlite3_context *pCtx, /* Function context */ + const char *z, /* String pointer */ + int n, /* Bytes in string, or negative */ + u8 enc, /* Encoding of z. 0 for BLOBs */ + void (*xDel)(void*) /* Destructor function */ +){ + if( sqlite3VdbeMemSetStr(pCtx->pOut, z, n, enc, xDel)==SQLITE_TOOBIG ){ + sqlite3_result_error_toobig(pCtx); + } +} +static int invokeValueDestructor( + const void *p, /* Value to destroy */ + void (*xDel)(void*), /* The destructor */ + sqlite3_context *pCtx /* Set a SQLITE_TOOBIG error if no NULL */ +){ + assert( xDel!=SQLITE_DYNAMIC ); + if( xDel==0 ){ + /* noop */ + }else if( xDel==SQLITE_TRANSIENT ){ + /* noop */ + }else{ + xDel((void*)p); + } + if( pCtx ) sqlite3_result_error_toobig(pCtx); + return SQLITE_TOOBIG; +} +SQLITE_API void sqlite3_result_blob( + sqlite3_context *pCtx, + const void *z, + int n, + void (*xDel)(void *) +){ + assert( n>=0 ); + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + setResultStrOrError(pCtx, z, n, 0, xDel); +} +SQLITE_API void sqlite3_result_blob64( + sqlite3_context *pCtx, + const void *z, + sqlite3_uint64 n, + void (*xDel)(void *) +){ + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + assert( xDel!=SQLITE_DYNAMIC ); + if( n>0x7fffffff ){ + (void)invokeValueDestructor(z, xDel, pCtx); + }else{ + setResultStrOrError(pCtx, z, (int)n, 0, xDel); + } +} +SQLITE_API void sqlite3_result_double(sqlite3_context *pCtx, double rVal){ + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + sqlite3VdbeMemSetDouble(pCtx->pOut, rVal); +} +SQLITE_API void sqlite3_result_error(sqlite3_context *pCtx, const char *z, int n){ + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + pCtx->isError = SQLITE_ERROR; + pCtx->fErrorOrAux = 1; + sqlite3VdbeMemSetStr(pCtx->pOut, z, n, SQLITE_UTF8, SQLITE_TRANSIENT); +} +#ifndef SQLITE_OMIT_UTF16 +SQLITE_API void sqlite3_result_error16(sqlite3_context *pCtx, const void *z, int n){ + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + pCtx->isError = SQLITE_ERROR; + pCtx->fErrorOrAux = 1; + sqlite3VdbeMemSetStr(pCtx->pOut, z, n, SQLITE_UTF16NATIVE, SQLITE_TRANSIENT); +} +#endif +SQLITE_API void sqlite3_result_int(sqlite3_context *pCtx, int iVal){ + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + sqlite3VdbeMemSetInt64(pCtx->pOut, (i64)iVal); +} +SQLITE_API void sqlite3_result_int64(sqlite3_context *pCtx, i64 iVal){ + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + sqlite3VdbeMemSetInt64(pCtx->pOut, iVal); +} +SQLITE_API void sqlite3_result_null(sqlite3_context *pCtx){ + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + sqlite3VdbeMemSetNull(pCtx->pOut); +} +SQLITE_API void sqlite3_result_subtype(sqlite3_context *pCtx, unsigned int eSubtype){ + Mem *pOut = pCtx->pOut; + assert( sqlite3_mutex_held(pOut->db->mutex) ); + pOut->eSubtype = eSubtype & 0xff; + pOut->flags |= MEM_Subtype; +} +SQLITE_API void sqlite3_result_text( + sqlite3_context *pCtx, + const char *z, + int n, + void (*xDel)(void *) +){ + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + setResultStrOrError(pCtx, z, n, SQLITE_UTF8, xDel); +} +SQLITE_API void sqlite3_result_text64( + sqlite3_context *pCtx, + const char *z, + sqlite3_uint64 n, + void (*xDel)(void *), + unsigned char enc +){ + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + assert( xDel!=SQLITE_DYNAMIC ); + if( enc==SQLITE_UTF16 ) enc = SQLITE_UTF16NATIVE; + if( n>0x7fffffff ){ + (void)invokeValueDestructor(z, xDel, pCtx); + }else{ + setResultStrOrError(pCtx, z, (int)n, enc, xDel); + } +} +#ifndef SQLITE_OMIT_UTF16 +SQLITE_API void sqlite3_result_text16( + sqlite3_context *pCtx, + const void *z, + int n, + void (*xDel)(void *) +){ + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + setResultStrOrError(pCtx, z, n, SQLITE_UTF16NATIVE, xDel); +} +SQLITE_API void sqlite3_result_text16be( + sqlite3_context *pCtx, + const void *z, + int n, + void (*xDel)(void *) +){ + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + setResultStrOrError(pCtx, z, n, SQLITE_UTF16BE, xDel); +} +SQLITE_API void sqlite3_result_text16le( + sqlite3_context *pCtx, + const void *z, + int n, + void (*xDel)(void *) +){ + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + setResultStrOrError(pCtx, z, n, SQLITE_UTF16LE, xDel); +} +#endif /* SQLITE_OMIT_UTF16 */ +SQLITE_API void sqlite3_result_value(sqlite3_context *pCtx, sqlite3_value *pValue){ + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + sqlite3VdbeMemCopy(pCtx->pOut, pValue); +} +SQLITE_API void sqlite3_result_zeroblob(sqlite3_context *pCtx, int n){ + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + sqlite3VdbeMemSetZeroBlob(pCtx->pOut, n); +} +SQLITE_API int sqlite3_result_zeroblob64(sqlite3_context *pCtx, u64 n){ + Mem *pOut = pCtx->pOut; + assert( sqlite3_mutex_held(pOut->db->mutex) ); + if( n>(u64)pOut->db->aLimit[SQLITE_LIMIT_LENGTH] ){ + return SQLITE_TOOBIG; + } + sqlite3VdbeMemSetZeroBlob(pCtx->pOut, (int)n); + return SQLITE_OK; +} +SQLITE_API void sqlite3_result_error_code(sqlite3_context *pCtx, int errCode){ + pCtx->isError = errCode; + pCtx->fErrorOrAux = 1; +#ifdef SQLITE_DEBUG + if( pCtx->pVdbe ) pCtx->pVdbe->rcApp = errCode; +#endif + if( pCtx->pOut->flags & MEM_Null ){ + sqlite3VdbeMemSetStr(pCtx->pOut, sqlite3ErrStr(errCode), -1, + SQLITE_UTF8, SQLITE_STATIC); + } +} + +/* Force an SQLITE_TOOBIG error. */ +SQLITE_API void sqlite3_result_error_toobig(sqlite3_context *pCtx){ + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + pCtx->isError = SQLITE_TOOBIG; + pCtx->fErrorOrAux = 1; + sqlite3VdbeMemSetStr(pCtx->pOut, "string or blob too big", -1, + SQLITE_UTF8, SQLITE_STATIC); +} + +/* An SQLITE_NOMEM error. */ +SQLITE_API void sqlite3_result_error_nomem(sqlite3_context *pCtx){ + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + sqlite3VdbeMemSetNull(pCtx->pOut); + pCtx->isError = SQLITE_NOMEM_BKPT; + pCtx->fErrorOrAux = 1; + sqlite3OomFault(pCtx->pOut->db); +} + +/* +** This function is called after a transaction has been committed. It +** invokes callbacks registered with sqlite3_wal_hook() as required. +*/ +static int doWalCallbacks(sqlite3 *db){ + int rc = SQLITE_OK; +#ifndef SQLITE_OMIT_WAL + int i; + for(i=0; inDb; i++){ + Btree *pBt = db->aDb[i].pBt; + if( pBt ){ + int nEntry; + sqlite3BtreeEnter(pBt); + nEntry = sqlite3PagerWalCallback(sqlite3BtreePager(pBt)); + sqlite3BtreeLeave(pBt); + if( db->xWalCallback && nEntry>0 && rc==SQLITE_OK ){ + rc = db->xWalCallback(db->pWalArg, db, db->aDb[i].zDbSName, nEntry); + } + } + } +#endif + return rc; +} + + +/* +** Execute the statement pStmt, either until a row of data is ready, the +** statement is completely executed or an error occurs. +** +** This routine implements the bulk of the logic behind the sqlite_step() +** API. The only thing omitted is the automatic recompile if a +** schema change has occurred. That detail is handled by the +** outer sqlite3_step() wrapper procedure. +*/ +static int sqlite3Step(Vdbe *p){ + sqlite3 *db; + int rc; + + assert(p); + if( p->magic!=VDBE_MAGIC_RUN ){ + /* We used to require that sqlite3_reset() be called before retrying + ** sqlite3_step() after any error or after SQLITE_DONE. But beginning + ** with version 3.7.0, we changed this so that sqlite3_reset() would + ** be called automatically instead of throwing the SQLITE_MISUSE error. + ** This "automatic-reset" change is not technically an incompatibility, + ** since any application that receives an SQLITE_MISUSE is broken by + ** definition. + ** + ** Nevertheless, some published applications that were originally written + ** for version 3.6.23 or earlier do in fact depend on SQLITE_MISUSE + ** returns, and those were broken by the automatic-reset change. As a + ** a work-around, the SQLITE_OMIT_AUTORESET compile-time restores the + ** legacy behavior of returning SQLITE_MISUSE for cases where the + ** previous sqlite3_step() returned something other than a SQLITE_LOCKED + ** or SQLITE_BUSY error. + */ +#ifdef SQLITE_OMIT_AUTORESET + if( (rc = p->rc&0xff)==SQLITE_BUSY || rc==SQLITE_LOCKED ){ + sqlite3_reset((sqlite3_stmt*)p); + }else{ + return SQLITE_MISUSE_BKPT; + } +#else + sqlite3_reset((sqlite3_stmt*)p); +#endif + } + + /* Check that malloc() has not failed. If it has, return early. */ + db = p->db; + if( db->mallocFailed ){ + p->rc = SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; + } + + if( p->pc<=0 && p->expired ){ + p->rc = SQLITE_SCHEMA; + rc = SQLITE_ERROR; + goto end_of_step; + } + if( p->pc<0 ){ + /* If there are no other statements currently running, then + ** reset the interrupt flag. This prevents a call to sqlite3_interrupt + ** from interrupting a statement that has not yet started. + */ + if( db->nVdbeActive==0 ){ + db->u1.isInterrupted = 0; + } + + assert( db->nVdbeWrite>0 || db->autoCommit==0 + || (db->nDeferredCons==0 && db->nDeferredImmCons==0) + ); + +#ifndef SQLITE_OMIT_TRACE + if( (db->xProfile || (db->mTrace & SQLITE_TRACE_PROFILE)!=0) + && !db->init.busy && p->zSql ){ + sqlite3OsCurrentTimeInt64(db->pVfs, &p->startTime); + }else{ + assert( p->startTime==0 ); + } +#endif + + db->nVdbeActive++; + if( p->readOnly==0 ) db->nVdbeWrite++; + if( p->bIsReader ) db->nVdbeRead++; + p->pc = 0; + } +#ifdef SQLITE_DEBUG + p->rcApp = SQLITE_OK; +#endif +#ifndef SQLITE_OMIT_EXPLAIN + if( p->explain ){ + rc = sqlite3VdbeList(p); + }else +#endif /* SQLITE_OMIT_EXPLAIN */ + { + db->nVdbeExec++; + rc = sqlite3VdbeExec(p); + db->nVdbeExec--; + } + +#ifndef SQLITE_OMIT_TRACE + /* If the statement completed successfully, invoke the profile callback */ + if( rc!=SQLITE_ROW ) checkProfileCallback(db, p); +#endif + + if( rc==SQLITE_DONE ){ + assert( p->rc==SQLITE_OK ); + p->rc = doWalCallbacks(db); + if( p->rc!=SQLITE_OK ){ + rc = SQLITE_ERROR; + } + } + + db->errCode = rc; + if( SQLITE_NOMEM==sqlite3ApiExit(p->db, p->rc) ){ + p->rc = SQLITE_NOMEM_BKPT; + } +end_of_step: + /* At this point local variable rc holds the value that should be + ** returned if this statement was compiled using the legacy + ** sqlite3_prepare() interface. According to the docs, this can only + ** be one of the values in the first assert() below. Variable p->rc + ** contains the value that would be returned if sqlite3_finalize() + ** were called on statement p. + */ + assert( rc==SQLITE_ROW || rc==SQLITE_DONE || rc==SQLITE_ERROR + || (rc&0xff)==SQLITE_BUSY || rc==SQLITE_MISUSE + ); + assert( (p->rc!=SQLITE_ROW && p->rc!=SQLITE_DONE) || p->rc==p->rcApp ); + if( p->isPrepareV2 && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){ + /* If this statement was prepared using sqlite3_prepare_v2(), and an + ** error has occurred, then return the error code in p->rc to the + ** caller. Set the error code in the database handle to the same value. + */ + rc = sqlite3VdbeTransferError(p); + } + return (rc&db->errMask); +} + +/* +** This is the top-level implementation of sqlite3_step(). Call +** sqlite3Step() to do most of the work. If a schema error occurs, +** call sqlite3Reprepare() and try again. +*/ +SQLITE_API int sqlite3_step(sqlite3_stmt *pStmt){ + int rc = SQLITE_OK; /* Result from sqlite3Step() */ + int rc2 = SQLITE_OK; /* Result from sqlite3Reprepare() */ + Vdbe *v = (Vdbe*)pStmt; /* the prepared statement */ + int cnt = 0; /* Counter to prevent infinite loop of reprepares */ + sqlite3 *db; /* The database connection */ + + if( vdbeSafetyNotNull(v) ){ + return SQLITE_MISUSE_BKPT; + } + db = v->db; + sqlite3_mutex_enter(db->mutex); + v->doingRerun = 0; + while( (rc = sqlite3Step(v))==SQLITE_SCHEMA + && cnt++ < SQLITE_MAX_SCHEMA_RETRY ){ + int savedPc = v->pc; + rc2 = rc = sqlite3Reprepare(v); + if( rc!=SQLITE_OK) break; + sqlite3_reset(pStmt); + if( savedPc>=0 ) v->doingRerun = 1; + assert( v->expired==0 ); + } + if( rc2!=SQLITE_OK ){ + /* This case occurs after failing to recompile an sql statement. + ** The error message from the SQL compiler has already been loaded + ** into the database handle. This block copies the error message + ** from the database handle into the statement and sets the statement + ** program counter to 0 to ensure that when the statement is + ** finalized or reset the parser error message is available via + ** sqlite3_errmsg() and sqlite3_errcode(). + */ + const char *zErr = (const char *)sqlite3_value_text(db->pErr); + sqlite3DbFree(db, v->zErrMsg); + if( !db->mallocFailed ){ + v->zErrMsg = sqlite3DbStrDup(db, zErr); + v->rc = rc2; + } else { + v->zErrMsg = 0; + v->rc = rc = SQLITE_NOMEM_BKPT; + } + } + rc = sqlite3ApiExit(db, rc); + sqlite3_mutex_leave(db->mutex); + return rc; +} + + +/* +** Extract the user data from a sqlite3_context structure and return a +** pointer to it. +*/ +SQLITE_API void *sqlite3_user_data(sqlite3_context *p){ + assert( p && p->pFunc ); + return p->pFunc->pUserData; +} + +/* +** Extract the user data from a sqlite3_context structure and return a +** pointer to it. +** +** IMPLEMENTATION-OF: R-46798-50301 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. +*/ +SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context *p){ + assert( p && p->pOut ); + return p->pOut->db; +} + +/* +** Return the current time for a statement. If the current time +** is requested more than once within the same run of a single prepared +** statement, the exact same time is returned for each invocation regardless +** of the amount of time that elapses between invocations. In other words, +** the time returned is always the time of the first call. +*/ +SQLITE_PRIVATE sqlite3_int64 sqlite3StmtCurrentTime(sqlite3_context *p){ + int rc; +#ifndef SQLITE_ENABLE_STAT3_OR_STAT4 + sqlite3_int64 *piTime = &p->pVdbe->iCurrentTime; + assert( p->pVdbe!=0 ); +#else + sqlite3_int64 iTime = 0; + sqlite3_int64 *piTime = p->pVdbe!=0 ? &p->pVdbe->iCurrentTime : &iTime; +#endif + if( *piTime==0 ){ + rc = sqlite3OsCurrentTimeInt64(p->pOut->db->pVfs, piTime); + if( rc ) *piTime = 0; + } + return *piTime; +} + +/* +** The following is the implementation of an SQL function that always +** fails with an error message stating that the function is used in the +** wrong context. The sqlite3_overload_function() API might construct +** SQL function that use this routine so that the functions will exist +** for name resolution but are actually overloaded by the xFindFunction +** method of virtual tables. +*/ +SQLITE_PRIVATE void sqlite3InvalidFunction( + sqlite3_context *context, /* The function calling context */ + int NotUsed, /* Number of arguments to the function */ + sqlite3_value **NotUsed2 /* Value of each argument */ +){ + const char *zName = context->pFunc->zName; + char *zErr; + UNUSED_PARAMETER2(NotUsed, NotUsed2); + zErr = sqlite3_mprintf( + "unable to use function %s in the requested context", zName); + sqlite3_result_error(context, zErr, -1); + sqlite3_free(zErr); +} + +/* +** Create a new aggregate context for p and return a pointer to +** its pMem->z element. +*/ +static SQLITE_NOINLINE void *createAggContext(sqlite3_context *p, int nByte){ + Mem *pMem = p->pMem; + assert( (pMem->flags & MEM_Agg)==0 ); + if( nByte<=0 ){ + sqlite3VdbeMemSetNull(pMem); + pMem->z = 0; + }else{ + sqlite3VdbeMemClearAndResize(pMem, nByte); + pMem->flags = MEM_Agg; + pMem->u.pDef = p->pFunc; + if( pMem->z ){ + memset(pMem->z, 0, nByte); + } + } + return (void*)pMem->z; +} + +/* +** Allocate or return the aggregate context for a user function. A new +** context is allocated on the first call. Subsequent calls return the +** same context that was returned on prior calls. +*/ +SQLITE_API void *sqlite3_aggregate_context(sqlite3_context *p, int nByte){ + assert( p && p->pFunc && p->pFunc->xFinalize ); + assert( sqlite3_mutex_held(p->pOut->db->mutex) ); + testcase( nByte<0 ); + if( (p->pMem->flags & MEM_Agg)==0 ){ + return createAggContext(p, nByte); + }else{ + return (void*)p->pMem->z; + } +} + +/* +** Return the auxiliary data pointer, if any, for the iArg'th argument to +** the user-function defined by pCtx. +*/ +SQLITE_API void *sqlite3_get_auxdata(sqlite3_context *pCtx, int iArg){ + AuxData *pAuxData; + + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); +#if SQLITE_ENABLE_STAT3_OR_STAT4 + if( pCtx->pVdbe==0 ) return 0; +#else + assert( pCtx->pVdbe!=0 ); +#endif + for(pAuxData=pCtx->pVdbe->pAuxData; pAuxData; pAuxData=pAuxData->pNext){ + if( pAuxData->iOp==pCtx->iOp && pAuxData->iArg==iArg ) break; + } + + return (pAuxData ? pAuxData->pAux : 0); +} + +/* +** Set the auxiliary data pointer and delete function, for the iArg'th +** argument to the user-function defined by pCtx. Any previous value is +** deleted by calling the delete function specified when it was set. +*/ +SQLITE_API void sqlite3_set_auxdata( + sqlite3_context *pCtx, + int iArg, + void *pAux, + void (*xDelete)(void*) +){ + AuxData *pAuxData; + Vdbe *pVdbe = pCtx->pVdbe; + + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + if( iArg<0 ) goto failed; +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 + if( pVdbe==0 ) goto failed; +#else + assert( pVdbe!=0 ); +#endif + + for(pAuxData=pVdbe->pAuxData; pAuxData; pAuxData=pAuxData->pNext){ + if( pAuxData->iOp==pCtx->iOp && pAuxData->iArg==iArg ) break; + } + if( pAuxData==0 ){ + pAuxData = sqlite3DbMallocZero(pVdbe->db, sizeof(AuxData)); + if( !pAuxData ) goto failed; + pAuxData->iOp = pCtx->iOp; + pAuxData->iArg = iArg; + pAuxData->pNext = pVdbe->pAuxData; + pVdbe->pAuxData = pAuxData; + if( pCtx->fErrorOrAux==0 ){ + pCtx->isError = 0; + pCtx->fErrorOrAux = 1; + } + }else if( pAuxData->xDelete ){ + pAuxData->xDelete(pAuxData->pAux); + } + + pAuxData->pAux = pAux; + pAuxData->xDelete = xDelete; + return; + +failed: + if( xDelete ){ + xDelete(pAux); + } +} + +#ifndef SQLITE_OMIT_DEPRECATED +/* +** Return the number of times the Step function of an aggregate has been +** called. +** +** This function is deprecated. Do not use it for new code. It is +** provide only to avoid breaking legacy code. New aggregate function +** implementations should keep their own counts within their aggregate +** context. +*/ +SQLITE_API int sqlite3_aggregate_count(sqlite3_context *p){ + assert( p && p->pMem && p->pFunc && p->pFunc->xFinalize ); + return p->pMem->n; +} +#endif + +/* +** Return the number of columns in the result set for the statement pStmt. +*/ +SQLITE_API int sqlite3_column_count(sqlite3_stmt *pStmt){ + Vdbe *pVm = (Vdbe *)pStmt; + return pVm ? pVm->nResColumn : 0; +} + +/* +** Return the number of values available from the current row of the +** currently executing statement pStmt. +*/ +SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt){ + Vdbe *pVm = (Vdbe *)pStmt; + if( pVm==0 || pVm->pResultSet==0 ) return 0; + return pVm->nResColumn; +} + +/* +** Return a pointer to static memory containing an SQL NULL value. +*/ +static const Mem *columnNullValue(void){ + /* Even though the Mem structure contains an element + ** of type i64, on certain architectures (x86) with certain compiler + ** switches (-Os), gcc may align this Mem object on a 4-byte boundary + ** instead of an 8-byte one. This all works fine, except that when + ** running with SQLITE_DEBUG defined the SQLite code sometimes assert()s + ** that a Mem structure is located on an 8-byte boundary. To prevent + ** these assert()s from failing, when building with SQLITE_DEBUG defined + ** using gcc, we force nullMem to be 8-byte aligned using the magical + ** __attribute__((aligned(8))) macro. */ + static const Mem nullMem +#if defined(SQLITE_DEBUG) && defined(__GNUC__) + __attribute__((aligned(8))) +#endif + = { + /* .u = */ {0}, + /* .flags = */ (u16)MEM_Null, + /* .enc = */ (u8)0, + /* .eSubtype = */ (u8)0, + /* .n = */ (int)0, + /* .z = */ (char*)0, + /* .zMalloc = */ (char*)0, + /* .szMalloc = */ (int)0, + /* .uTemp = */ (u32)0, + /* .db = */ (sqlite3*)0, + /* .xDel = */ (void(*)(void*))0, +#ifdef SQLITE_DEBUG + /* .pScopyFrom = */ (Mem*)0, + /* .pFiller = */ (void*)0, +#endif + }; + return &nullMem; +} + +/* +** Check to see if column iCol of the given statement is valid. If +** it is, return a pointer to the Mem for the value of that column. +** If iCol is not valid, return a pointer to a Mem which has a value +** of NULL. +*/ +static Mem *columnMem(sqlite3_stmt *pStmt, int i){ + Vdbe *pVm; + Mem *pOut; + + pVm = (Vdbe *)pStmt; + if( pVm==0 ) return (Mem*)columnNullValue(); + assert( pVm->db ); + sqlite3_mutex_enter(pVm->db->mutex); + if( pVm->pResultSet!=0 && inResColumn && i>=0 ){ + pOut = &pVm->pResultSet[i]; + }else{ + sqlite3Error(pVm->db, SQLITE_RANGE); + pOut = (Mem*)columnNullValue(); + } + return pOut; +} + +/* +** This function is called after invoking an sqlite3_value_XXX function on a +** column value (i.e. a value returned by evaluating an SQL expression in the +** select list of a SELECT statement) that may cause a malloc() failure. If +** malloc() has failed, the threads mallocFailed flag is cleared and the result +** code of statement pStmt set to SQLITE_NOMEM. +** +** Specifically, this is called from within: +** +** sqlite3_column_int() +** sqlite3_column_int64() +** sqlite3_column_text() +** sqlite3_column_text16() +** sqlite3_column_real() +** sqlite3_column_bytes() +** sqlite3_column_bytes16() +** sqiite3_column_blob() +*/ +static void columnMallocFailure(sqlite3_stmt *pStmt) +{ + /* If malloc() failed during an encoding conversion within an + ** sqlite3_column_XXX API, then set the return code of the statement to + ** SQLITE_NOMEM. The next call to _step() (if any) will return SQLITE_ERROR + ** and _finalize() will return NOMEM. + */ + Vdbe *p = (Vdbe *)pStmt; + if( p ){ + assert( p->db!=0 ); + assert( sqlite3_mutex_held(p->db->mutex) ); + p->rc = sqlite3ApiExit(p->db, p->rc); + sqlite3_mutex_leave(p->db->mutex); + } +} + +/**************************** sqlite3_column_ ******************************* +** The following routines are used to access elements of the current row +** in the result set. +*/ +SQLITE_API const void *sqlite3_column_blob(sqlite3_stmt *pStmt, int i){ + const void *val; + val = sqlite3_value_blob( columnMem(pStmt,i) ); + /* Even though there is no encoding conversion, value_blob() might + ** need to call malloc() to expand the result of a zeroblob() + ** expression. + */ + columnMallocFailure(pStmt); + return val; +} +SQLITE_API int sqlite3_column_bytes(sqlite3_stmt *pStmt, int i){ + int val = sqlite3_value_bytes( columnMem(pStmt,i) ); + columnMallocFailure(pStmt); + return val; +} +SQLITE_API int sqlite3_column_bytes16(sqlite3_stmt *pStmt, int i){ + int val = sqlite3_value_bytes16( columnMem(pStmt,i) ); + columnMallocFailure(pStmt); + return val; +} +SQLITE_API double sqlite3_column_double(sqlite3_stmt *pStmt, int i){ + double val = sqlite3_value_double( columnMem(pStmt,i) ); + columnMallocFailure(pStmt); + return val; +} +SQLITE_API int sqlite3_column_int(sqlite3_stmt *pStmt, int i){ + int val = sqlite3_value_int( columnMem(pStmt,i) ); + columnMallocFailure(pStmt); + return val; +} +SQLITE_API sqlite_int64 sqlite3_column_int64(sqlite3_stmt *pStmt, int i){ + sqlite_int64 val = sqlite3_value_int64( columnMem(pStmt,i) ); + columnMallocFailure(pStmt); + return val; +} +SQLITE_API const unsigned char *sqlite3_column_text(sqlite3_stmt *pStmt, int i){ + const unsigned char *val = sqlite3_value_text( columnMem(pStmt,i) ); + columnMallocFailure(pStmt); + return val; +} +SQLITE_API sqlite3_value *sqlite3_column_value(sqlite3_stmt *pStmt, int i){ + Mem *pOut = columnMem(pStmt, i); + if( pOut->flags&MEM_Static ){ + pOut->flags &= ~MEM_Static; + pOut->flags |= MEM_Ephem; + } + columnMallocFailure(pStmt); + return (sqlite3_value *)pOut; +} +#ifndef SQLITE_OMIT_UTF16 +SQLITE_API const void *sqlite3_column_text16(sqlite3_stmt *pStmt, int i){ + const void *val = sqlite3_value_text16( columnMem(pStmt,i) ); + columnMallocFailure(pStmt); + return val; +} +#endif /* SQLITE_OMIT_UTF16 */ +SQLITE_API int sqlite3_column_type(sqlite3_stmt *pStmt, int i){ + int iType = sqlite3_value_type( columnMem(pStmt,i) ); + columnMallocFailure(pStmt); + return iType; +} + +/* +** Convert the N-th element of pStmt->pColName[] into a string using +** xFunc() then return that string. If N is out of range, return 0. +** +** There are up to 5 names for each column. useType determines which +** name is returned. Here are the names: +** +** 0 The column name as it should be displayed for output +** 1 The datatype name for the column +** 2 The name of the database that the column derives from +** 3 The name of the table that the column derives from +** 4 The name of the table column that the result column derives from +** +** If the result is not a simple column reference (if it is an expression +** or a constant) then useTypes 2, 3, and 4 return NULL. +*/ +static const void *columnName( + sqlite3_stmt *pStmt, + int N, + const void *(*xFunc)(Mem*), + int useType +){ + const void *ret; + Vdbe *p; + int n; + sqlite3 *db; +#ifdef SQLITE_ENABLE_API_ARMOR + if( pStmt==0 ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + ret = 0; + p = (Vdbe *)pStmt; + db = p->db; + assert( db!=0 ); + n = sqlite3_column_count(pStmt); + if( N=0 ){ + N += useType*n; + sqlite3_mutex_enter(db->mutex); + assert( db->mallocFailed==0 ); + ret = xFunc(&p->aColName[N]); + /* A malloc may have failed inside of the xFunc() call. If this + ** is the case, clear the mallocFailed flag and return NULL. + */ + if( db->mallocFailed ){ + sqlite3OomClear(db); + ret = 0; + } + sqlite3_mutex_leave(db->mutex); + } + return ret; +} + +/* +** Return the name of the Nth column of the result set returned by SQL +** statement pStmt. +*/ +SQLITE_API const char *sqlite3_column_name(sqlite3_stmt *pStmt, int N){ + return columnName( + pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_NAME); +} +#ifndef SQLITE_OMIT_UTF16 +SQLITE_API const void *sqlite3_column_name16(sqlite3_stmt *pStmt, int N){ + return columnName( + pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_NAME); +} +#endif + +/* +** Constraint: If you have ENABLE_COLUMN_METADATA then you must +** not define OMIT_DECLTYPE. +*/ +#if defined(SQLITE_OMIT_DECLTYPE) && defined(SQLITE_ENABLE_COLUMN_METADATA) +# error "Must not define both SQLITE_OMIT_DECLTYPE \ + and SQLITE_ENABLE_COLUMN_METADATA" +#endif + +#ifndef SQLITE_OMIT_DECLTYPE +/* +** Return the column declaration type (if applicable) of the 'i'th column +** of the result set of SQL statement pStmt. +*/ +SQLITE_API const char *sqlite3_column_decltype(sqlite3_stmt *pStmt, int N){ + return columnName( + pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_DECLTYPE); +} +#ifndef SQLITE_OMIT_UTF16 +SQLITE_API const void *sqlite3_column_decltype16(sqlite3_stmt *pStmt, int N){ + return columnName( + pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_DECLTYPE); +} +#endif /* SQLITE_OMIT_UTF16 */ +#endif /* SQLITE_OMIT_DECLTYPE */ + +#ifdef SQLITE_ENABLE_COLUMN_METADATA +/* +** Return the name of the database from which a result column derives. +** NULL is returned if the result column is an expression or constant or +** anything else which is not an unambiguous reference to a database column. +*/ +SQLITE_API const char *sqlite3_column_database_name(sqlite3_stmt *pStmt, int N){ + return columnName( + pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_DATABASE); +} +#ifndef SQLITE_OMIT_UTF16 +SQLITE_API const void *sqlite3_column_database_name16(sqlite3_stmt *pStmt, int N){ + return columnName( + pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_DATABASE); +} +#endif /* SQLITE_OMIT_UTF16 */ + +/* +** Return the name of the table from which a result column derives. +** NULL is returned if the result column is an expression or constant or +** anything else which is not an unambiguous reference to a database column. +*/ +SQLITE_API const char *sqlite3_column_table_name(sqlite3_stmt *pStmt, int N){ + return columnName( + pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_TABLE); +} +#ifndef SQLITE_OMIT_UTF16 +SQLITE_API const void *sqlite3_column_table_name16(sqlite3_stmt *pStmt, int N){ + return columnName( + pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_TABLE); +} +#endif /* SQLITE_OMIT_UTF16 */ + +/* +** Return the name of the table column from which a result column derives. +** NULL is returned if the result column is an expression or constant or +** anything else which is not an unambiguous reference to a database column. +*/ +SQLITE_API const char *sqlite3_column_origin_name(sqlite3_stmt *pStmt, int N){ + return columnName( + pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_COLUMN); +} +#ifndef SQLITE_OMIT_UTF16 +SQLITE_API const void *sqlite3_column_origin_name16(sqlite3_stmt *pStmt, int N){ + return columnName( + pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_COLUMN); +} +#endif /* SQLITE_OMIT_UTF16 */ +#endif /* SQLITE_ENABLE_COLUMN_METADATA */ + + +/******************************* sqlite3_bind_ *************************** +** +** Routines used to attach values to wildcards in a compiled SQL statement. +*/ +/* +** Unbind the value bound to variable i in virtual machine p. This is the +** the same as binding a NULL value to the column. If the "i" parameter is +** out of range, then SQLITE_RANGE is returned. Othewise SQLITE_OK. +** +** A successful evaluation of this routine acquires the mutex on p. +** the mutex is released if any kind of error occurs. +** +** The error code stored in database p->db is overwritten with the return +** value in any case. +*/ +static int vdbeUnbind(Vdbe *p, int i){ + Mem *pVar; + if( vdbeSafetyNotNull(p) ){ + return SQLITE_MISUSE_BKPT; + } + sqlite3_mutex_enter(p->db->mutex); + if( p->magic!=VDBE_MAGIC_RUN || p->pc>=0 ){ + sqlite3Error(p->db, SQLITE_MISUSE); + sqlite3_mutex_leave(p->db->mutex); + sqlite3_log(SQLITE_MISUSE, + "bind on a busy prepared statement: [%s]", p->zSql); + return SQLITE_MISUSE_BKPT; + } + if( i<1 || i>p->nVar ){ + sqlite3Error(p->db, SQLITE_RANGE); + sqlite3_mutex_leave(p->db->mutex); + return SQLITE_RANGE; + } + i--; + pVar = &p->aVar[i]; + sqlite3VdbeMemRelease(pVar); + pVar->flags = MEM_Null; + sqlite3Error(p->db, SQLITE_OK); + + /* 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. + ** + ** IMPLEMENTATION-OF: R-48440-37595 If the specific value bound to host + ** parameter in the WHERE clause might influence the choice of query plan + ** for a statement, then the statement will be automatically recompiled, + ** as if there had been a schema change, on the first sqlite3_step() call + ** following any change to the bindings of that parameter. + */ + if( p->isPrepareV2 && + ((i<32 && p->expmask & ((u32)1 << i)) || p->expmask==0xffffffff) + ){ + p->expired = 1; + } + return SQLITE_OK; +} + +/* +** Bind a text or BLOB value. +*/ +static int bindText( + sqlite3_stmt *pStmt, /* The statement to bind against */ + int i, /* Index of the parameter to bind */ + const void *zData, /* Pointer to the data to be bound */ + int nData, /* Number of bytes of data to be bound */ + void (*xDel)(void*), /* Destructor for the data */ + u8 encoding /* Encoding for the data */ +){ + Vdbe *p = (Vdbe *)pStmt; + Mem *pVar; + int rc; + + rc = vdbeUnbind(p, i); + if( rc==SQLITE_OK ){ + if( zData!=0 ){ + pVar = &p->aVar[i-1]; + rc = sqlite3VdbeMemSetStr(pVar, zData, nData, encoding, xDel); + if( rc==SQLITE_OK && encoding!=0 ){ + rc = sqlite3VdbeChangeEncoding(pVar, ENC(p->db)); + } + sqlite3Error(p->db, rc); + rc = sqlite3ApiExit(p->db, rc); + } + sqlite3_mutex_leave(p->db->mutex); + }else if( xDel!=SQLITE_STATIC && xDel!=SQLITE_TRANSIENT ){ + xDel((void*)zData); + } + return rc; +} + + +/* +** Bind a blob value to an SQL statement variable. +*/ +SQLITE_API int sqlite3_bind_blob( + sqlite3_stmt *pStmt, + int i, + const void *zData, + int nData, + void (*xDel)(void*) +){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( nData<0 ) return SQLITE_MISUSE_BKPT; +#endif + return bindText(pStmt, i, zData, nData, xDel, 0); +} +SQLITE_API int sqlite3_bind_blob64( + sqlite3_stmt *pStmt, + int i, + const void *zData, + sqlite3_uint64 nData, + void (*xDel)(void*) +){ + assert( xDel!=SQLITE_DYNAMIC ); + if( nData>0x7fffffff ){ + return invokeValueDestructor(zData, xDel, 0); + }else{ + return bindText(pStmt, i, zData, (int)nData, xDel, 0); + } +} +SQLITE_API int sqlite3_bind_double(sqlite3_stmt *pStmt, int i, double rValue){ + int rc; + Vdbe *p = (Vdbe *)pStmt; + rc = vdbeUnbind(p, i); + if( rc==SQLITE_OK ){ + sqlite3VdbeMemSetDouble(&p->aVar[i-1], rValue); + sqlite3_mutex_leave(p->db->mutex); + } + return rc; +} +SQLITE_API int sqlite3_bind_int(sqlite3_stmt *p, int i, int iValue){ + return sqlite3_bind_int64(p, i, (i64)iValue); +} +SQLITE_API int sqlite3_bind_int64(sqlite3_stmt *pStmt, int i, sqlite_int64 iValue){ + int rc; + Vdbe *p = (Vdbe *)pStmt; + rc = vdbeUnbind(p, i); + if( rc==SQLITE_OK ){ + sqlite3VdbeMemSetInt64(&p->aVar[i-1], iValue); + sqlite3_mutex_leave(p->db->mutex); + } + return rc; +} +SQLITE_API int sqlite3_bind_null(sqlite3_stmt *pStmt, int i){ + int rc; + Vdbe *p = (Vdbe*)pStmt; + rc = vdbeUnbind(p, i); + if( rc==SQLITE_OK ){ + sqlite3_mutex_leave(p->db->mutex); + } + return rc; +} +SQLITE_API int sqlite3_bind_text( + sqlite3_stmt *pStmt, + int i, + const char *zData, + int nData, + void (*xDel)(void*) +){ + return bindText(pStmt, i, zData, nData, xDel, SQLITE_UTF8); +} +SQLITE_API int sqlite3_bind_text64( + sqlite3_stmt *pStmt, + int i, + const char *zData, + sqlite3_uint64 nData, + void (*xDel)(void*), + unsigned char enc +){ + assert( xDel!=SQLITE_DYNAMIC ); + if( nData>0x7fffffff ){ + return invokeValueDestructor(zData, xDel, 0); + }else{ + if( enc==SQLITE_UTF16 ) enc = SQLITE_UTF16NATIVE; + return bindText(pStmt, i, zData, (int)nData, xDel, enc); + } +} +#ifndef SQLITE_OMIT_UTF16 +SQLITE_API int sqlite3_bind_text16( + sqlite3_stmt *pStmt, + int i, + const void *zData, + int nData, + void (*xDel)(void*) +){ + return bindText(pStmt, i, zData, nData, xDel, SQLITE_UTF16NATIVE); +} +#endif /* SQLITE_OMIT_UTF16 */ +SQLITE_API int sqlite3_bind_value(sqlite3_stmt *pStmt, int i, const sqlite3_value *pValue){ + int rc; + switch( sqlite3_value_type((sqlite3_value*)pValue) ){ + case SQLITE_INTEGER: { + rc = sqlite3_bind_int64(pStmt, i, pValue->u.i); + break; + } + case SQLITE_FLOAT: { + rc = sqlite3_bind_double(pStmt, i, pValue->u.r); + break; + } + case SQLITE_BLOB: { + if( pValue->flags & MEM_Zero ){ + rc = sqlite3_bind_zeroblob(pStmt, i, pValue->u.nZero); + }else{ + rc = sqlite3_bind_blob(pStmt, i, pValue->z, pValue->n,SQLITE_TRANSIENT); + } + break; + } + case SQLITE_TEXT: { + rc = bindText(pStmt,i, pValue->z, pValue->n, SQLITE_TRANSIENT, + pValue->enc); + break; + } + default: { + rc = sqlite3_bind_null(pStmt, i); + break; + } + } + return rc; +} +SQLITE_API int sqlite3_bind_zeroblob(sqlite3_stmt *pStmt, int i, int n){ + int rc; + Vdbe *p = (Vdbe *)pStmt; + rc = vdbeUnbind(p, i); + if( rc==SQLITE_OK ){ + sqlite3VdbeMemSetZeroBlob(&p->aVar[i-1], n); + sqlite3_mutex_leave(p->db->mutex); + } + return rc; +} +SQLITE_API int sqlite3_bind_zeroblob64(sqlite3_stmt *pStmt, int i, sqlite3_uint64 n){ + int rc; + Vdbe *p = (Vdbe *)pStmt; + sqlite3_mutex_enter(p->db->mutex); + if( n>(u64)p->db->aLimit[SQLITE_LIMIT_LENGTH] ){ + rc = SQLITE_TOOBIG; + }else{ + assert( (n & 0x7FFFFFFF)==n ); + rc = sqlite3_bind_zeroblob(pStmt, i, n); + } + rc = sqlite3ApiExit(p->db, rc); + sqlite3_mutex_leave(p->db->mutex); + return rc; +} + +/* +** Return the number of wildcards that can be potentially bound to. +** This routine is added to support DBD::SQLite. +*/ +SQLITE_API int sqlite3_bind_parameter_count(sqlite3_stmt *pStmt){ + Vdbe *p = (Vdbe*)pStmt; + return p ? p->nVar : 0; +} + +/* +** Return the name of a wildcard parameter. Return NULL if the index +** is out of range or if the wildcard is unnamed. +** +** The result is always UTF-8. +*/ +SQLITE_API const char *sqlite3_bind_parameter_name(sqlite3_stmt *pStmt, int i){ + Vdbe *p = (Vdbe*)pStmt; + if( p==0 || i<1 || i>p->nzVar ){ + return 0; + } + return p->azVar[i-1]; +} + +/* +** Given a wildcard parameter name, return the index of the variable +** with that name. If there is no variable with the given name, +** return 0. +*/ +SQLITE_PRIVATE int sqlite3VdbeParameterIndex(Vdbe *p, const char *zName, int nName){ + int i; + if( p==0 ){ + return 0; + } + if( zName ){ + for(i=0; inzVar; i++){ + const char *z = p->azVar[i]; + if( z && strncmp(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. +*/ +SQLITE_PRIVATE int sqlite3TransferBindings(sqlite3_stmt *pFromStmt, sqlite3_stmt *pToStmt){ + Vdbe *pFrom = (Vdbe*)pFromStmt; + Vdbe *pTo = (Vdbe*)pToStmt; + int i; + assert( pTo->db==pFrom->db ); + assert( pTo->nVar==pFrom->nVar ); + sqlite3_mutex_enter(pTo->db->mutex); + for(i=0; inVar; i++){ + sqlite3VdbeMemMove(&pTo->aVar[i], &pFrom->aVar[i]); + } + sqlite3_mutex_leave(pTo->db->mutex); + return SQLITE_OK; +} + +#ifndef SQLITE_OMIT_DEPRECATED +/* +** Deprecated external interface. Internal/core SQLite code +** should call sqlite3TransferBindings. +** +** It is misuse to call this routine with statements from different +** database connections. But as this is a deprecated interface, we +** will not bother to check for that condition. +** +** If the two statements contain a different number of bindings, then +** an SQLITE_ERROR is returned. Nothing else can go wrong, so otherwise +** SQLITE_OK is returned. +*/ +SQLITE_API int sqlite3_transfer_bindings(sqlite3_stmt *pFromStmt, sqlite3_stmt *pToStmt){ + Vdbe *pFrom = (Vdbe*)pFromStmt; + Vdbe *pTo = (Vdbe*)pToStmt; + 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 + +/* +** Return the sqlite3* database handle to which the prepared statement given +** in the argument belongs. This is the same database handle that was +** the first argument to the sqlite3_prepare() that was used to create +** the statement in the first place. +*/ +SQLITE_API sqlite3 *sqlite3_db_handle(sqlite3_stmt *pStmt){ + return pStmt ? ((Vdbe*)pStmt)->db : 0; +} + +/* +** Return true if the prepared statement is guaranteed to not modify the +** database. +*/ +SQLITE_API int sqlite3_stmt_readonly(sqlite3_stmt *pStmt){ + return pStmt ? ((Vdbe*)pStmt)->readOnly : 1; +} + +/* +** Return true if the prepared statement is in need of being reset. +*/ +SQLITE_API int sqlite3_stmt_busy(sqlite3_stmt *pStmt){ + Vdbe *v = (Vdbe*)pStmt; + return v!=0 && v->magic==VDBE_MAGIC_RUN && v->pc>=0; +} + +/* +** Return a pointer to the next prepared statement after pStmt associated +** with database connection pDb. If pStmt is NULL, return the first +** prepared statement for the database connection. Return NULL if there +** are no more. +*/ +SQLITE_API sqlite3_stmt *sqlite3_next_stmt(sqlite3 *pDb, sqlite3_stmt *pStmt){ + sqlite3_stmt *pNext; +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(pDb) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + sqlite3_mutex_enter(pDb->mutex); + if( pStmt==0 ){ + pNext = (sqlite3_stmt*)pDb->pVdbe; + }else{ + pNext = (sqlite3_stmt*)((Vdbe*)pStmt)->pNext; + } + sqlite3_mutex_leave(pDb->mutex); + return pNext; +} + +/* +** Return the value of a status counter for a prepared statement +*/ +SQLITE_API int sqlite3_stmt_status(sqlite3_stmt *pStmt, int op, int resetFlag){ + Vdbe *pVdbe = (Vdbe*)pStmt; + u32 v; +#ifdef SQLITE_ENABLE_API_ARMOR + if( !pStmt ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + v = pVdbe->aCounter[op]; + if( resetFlag ) pVdbe->aCounter[op] = 0; + return (int)v; +} + +/* +** Return the SQL associated with a prepared statement +*/ +SQLITE_API const char *sqlite3_sql(sqlite3_stmt *pStmt){ + Vdbe *p = (Vdbe *)pStmt; + return p ? p->zSql : 0; +} + +/* +** Return the SQL associated with a prepared statement with +** bound parameters expanded. Space to hold the returned string is +** obtained from sqlite3_malloc(). The caller is responsible for +** freeing the returned string by passing it to sqlite3_free(). +** +** The SQLITE_TRACE_SIZE_LIMIT puts an upper bound on the size of +** expanded bound parameters. +*/ +SQLITE_API char *sqlite3_expanded_sql(sqlite3_stmt *pStmt){ +#ifdef SQLITE_OMIT_TRACE + return 0; +#else + char *z = 0; + const char *zSql = sqlite3_sql(pStmt); + if( zSql ){ + Vdbe *p = (Vdbe *)pStmt; + sqlite3_mutex_enter(p->db->mutex); + z = sqlite3VdbeExpandSql(p, zSql); + sqlite3_mutex_leave(p->db->mutex); + } + return z; +#endif +} + +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK +/* +** Allocate and populate an UnpackedRecord structure based on the serialized +** record in nKey/pKey. Return a pointer to the new UnpackedRecord structure +** if successful, or a NULL pointer if an OOM error is encountered. +*/ +static UnpackedRecord *vdbeUnpackRecord( + KeyInfo *pKeyInfo, + int nKey, + const void *pKey +){ + char *dummy; /* Dummy argument for AllocUnpackedRecord() */ + UnpackedRecord *pRet; /* Return value */ + + pRet = sqlite3VdbeAllocUnpackedRecord(pKeyInfo, 0, 0, &dummy); + if( pRet ){ + memset(pRet->aMem, 0, sizeof(Mem)*(pKeyInfo->nField+1)); + sqlite3VdbeRecordUnpack(pKeyInfo, nKey, pKey, pRet); + } + return pRet; +} + +/* +** This function is called from within a pre-update callback to retrieve +** a field of the row currently being updated or deleted. +*/ +SQLITE_API int sqlite3_preupdate_old(sqlite3 *db, int iIdx, sqlite3_value **ppValue){ + PreUpdate *p = db->pPreUpdate; + int rc = SQLITE_OK; + + /* Test that this call is being made from within an SQLITE_DELETE or + ** SQLITE_UPDATE pre-update callback, and that iIdx is within range. */ + if( !p || p->op==SQLITE_INSERT ){ + rc = SQLITE_MISUSE_BKPT; + goto preupdate_old_out; + } + if( iIdx>=p->pCsr->nField || iIdx<0 ){ + rc = SQLITE_RANGE; + goto preupdate_old_out; + } + + /* If the old.* record has not yet been loaded into memory, do so now. */ + if( p->pUnpacked==0 ){ + u32 nRec; + u8 *aRec; + + nRec = sqlite3BtreePayloadSize(p->pCsr->uc.pCursor); + aRec = sqlite3DbMallocRaw(db, nRec); + if( !aRec ) goto preupdate_old_out; + rc = sqlite3BtreeData(p->pCsr->uc.pCursor, 0, nRec, aRec); + if( rc==SQLITE_OK ){ + p->pUnpacked = vdbeUnpackRecord(&p->keyinfo, nRec, aRec); + if( !p->pUnpacked ) rc = SQLITE_NOMEM; + } + if( rc!=SQLITE_OK ){ + sqlite3DbFree(db, aRec); + goto preupdate_old_out; + } + p->aRecord = aRec; + } + + if( iIdx>=p->pUnpacked->nField ){ + *ppValue = (sqlite3_value *)columnNullValue(); + }else{ + Mem *pMem = *ppValue = &p->pUnpacked->aMem[iIdx]; + *ppValue = &p->pUnpacked->aMem[iIdx]; + if( iIdx==p->pTab->iPKey ){ + sqlite3VdbeMemSetInt64(pMem, p->iKey1); + }else if( p->pTab->aCol[iIdx].affinity==SQLITE_AFF_REAL ){ + if( pMem->flags & MEM_Int ){ + sqlite3VdbeMemRealify(pMem); + } + } + } + + preupdate_old_out: + sqlite3Error(db, rc); + return sqlite3ApiExit(db, rc); +} +#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */ + +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK +/* +** This function is called from within a pre-update callback to retrieve +** the number of columns in the row being updated, deleted or inserted. +*/ +SQLITE_API int sqlite3_preupdate_count(sqlite3 *db){ + PreUpdate *p = db->pPreUpdate; + return (p ? p->keyinfo.nField : 0); +} +#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */ + +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK +/* +** This function is designed to be called from within a pre-update callback +** only. It returns zero if the change that caused the callback was made +** immediately by a user SQL statement. Or, if the change was made by a +** trigger program, it returns the number of trigger programs currently +** on the stack (1 for a top-level trigger, 2 for a trigger fired by a +** top-level trigger etc.). +** +** For the purposes of the previous paragraph, a foreign key CASCADE, SET NULL +** or SET DEFAULT action is considered a trigger. +*/ +SQLITE_API int sqlite3_preupdate_depth(sqlite3 *db){ + PreUpdate *p = db->pPreUpdate; + return (p ? p->v->nFrame : 0); +} +#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */ + +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK +/* +** This function is called from within a pre-update callback to retrieve +** a field of the row currently being updated or inserted. +*/ +SQLITE_API int sqlite3_preupdate_new(sqlite3 *db, int iIdx, sqlite3_value **ppValue){ + PreUpdate *p = db->pPreUpdate; + int rc = SQLITE_OK; + Mem *pMem; + + if( !p || p->op==SQLITE_DELETE ){ + rc = SQLITE_MISUSE_BKPT; + goto preupdate_new_out; + } + if( iIdx>=p->pCsr->nField || iIdx<0 ){ + rc = SQLITE_RANGE; + goto preupdate_new_out; + } + + if( p->op==SQLITE_INSERT ){ + /* For an INSERT, memory cell p->iNewReg contains the serialized record + ** that is being inserted. Deserialize it. */ + UnpackedRecord *pUnpack = p->pNewUnpacked; + if( !pUnpack ){ + Mem *pData = &p->v->aMem[p->iNewReg]; + rc = ExpandBlob(pData); + if( rc!=SQLITE_OK ) goto preupdate_new_out; + pUnpack = vdbeUnpackRecord(&p->keyinfo, pData->n, pData->z); + if( !pUnpack ){ + rc = SQLITE_NOMEM; + goto preupdate_new_out; + } + p->pNewUnpacked = pUnpack; + } + if( iIdx>=pUnpack->nField ){ + pMem = (sqlite3_value *)columnNullValue(); + }else{ + pMem = &pUnpack->aMem[iIdx]; + if( iIdx==p->pTab->iPKey ){ + sqlite3VdbeMemSetInt64(pMem, p->iKey2); + } + } + }else{ + /* For an UPDATE, memory cell (p->iNewReg+1+iIdx) contains the required + ** value. Make a copy of the cell contents and return a pointer to it. + ** It is not safe to return a pointer to the memory cell itself as the + ** caller may modify the value text encoding. + */ + assert( p->op==SQLITE_UPDATE ); + if( !p->aNew ){ + p->aNew = (Mem *)sqlite3DbMallocZero(db, sizeof(Mem) * p->pCsr->nField); + if( !p->aNew ){ + rc = SQLITE_NOMEM; + goto preupdate_new_out; + } + } + assert( iIdx>=0 && iIdxpCsr->nField ); + pMem = &p->aNew[iIdx]; + if( pMem->flags==0 ){ + if( iIdx==p->pTab->iPKey ){ + sqlite3VdbeMemSetInt64(pMem, p->iKey2); + }else{ + rc = sqlite3VdbeMemCopy(pMem, &p->v->aMem[p->iNewReg+1+iIdx]); + if( rc!=SQLITE_OK ) goto preupdate_new_out; + } + } + } + *ppValue = pMem; + + preupdate_new_out: + sqlite3Error(db, rc); + return sqlite3ApiExit(db, rc); +} +#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */ + +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS +/* +** Return status data for a single loop within query pStmt. +*/ +SQLITE_API int sqlite3_stmt_scanstatus( + sqlite3_stmt *pStmt, /* Prepared statement being queried */ + int idx, /* Index of loop to report on */ + int iScanStatusOp, /* Which metric to return */ + void *pOut /* OUT: Write the answer here */ +){ + Vdbe *p = (Vdbe*)pStmt; + ScanStatus *pScan; + if( idx<0 || idx>=p->nScan ) return 1; + pScan = &p->aScan[idx]; + switch( iScanStatusOp ){ + case SQLITE_SCANSTAT_NLOOP: { + *(sqlite3_int64*)pOut = p->anExec[pScan->addrLoop]; + break; + } + case SQLITE_SCANSTAT_NVISIT: { + *(sqlite3_int64*)pOut = p->anExec[pScan->addrVisit]; + break; + } + case SQLITE_SCANSTAT_EST: { + double r = 1.0; + LogEst x = pScan->nEst; + while( x<100 ){ + x += 10; + r *= 0.5; + } + *(double*)pOut = r*sqlite3LogEstToInt(x); + break; + } + case SQLITE_SCANSTAT_NAME: { + *(const char**)pOut = pScan->zName; + break; + } + case SQLITE_SCANSTAT_EXPLAIN: { + if( pScan->addrExplain ){ + *(const char**)pOut = p->aOp[ pScan->addrExplain ].p4.z; + }else{ + *(const char**)pOut = 0; + } + break; + } + case SQLITE_SCANSTAT_SELECTID: { + if( pScan->addrExplain ){ + *(int*)pOut = p->aOp[ pScan->addrExplain ].p1; + }else{ + *(int*)pOut = -1; + } + break; + } + default: { + return 1; + } + } + return 0; +} + +/* +** Zero all counters associated with the sqlite3_stmt_scanstatus() data. +*/ +SQLITE_API void sqlite3_stmt_scanstatus_reset(sqlite3_stmt *pStmt){ + Vdbe *p = (Vdbe*)pStmt; + memset(p->anExec, 0, p->nOp * sizeof(i64)); +} +#endif /* SQLITE_ENABLE_STMT_SCANSTATUS */ + +/************** 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(). +** +** The Vdbe parse-tree explainer is also found here. +*/ +/* #include "sqliteInt.h" */ +/* #include "vdbeInt.h" */ + +#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; +} + +/* +** This function returns a pointer to a nul-terminated string in memory +** obtained from sqlite3DbMalloc(). If sqlite3.nVdbeExec is 1, then the +** string contains a copy of zRawSql but with host parameters expanded to +** their current bindings. Or, if sqlite3.nVdbeExec is greater than 1, +** then the returned string holds a copy of zRawSql with "-- " prepended +** to each line of text. +** +** If the SQLITE_TRACE_SIZE_LIMIT macro is defined to an integer, then +** then long strings and blobs are truncated to that many bytes. This +** can be used to prevent unreasonably large trace strings when dealing +** with large (multi-megabyte) strings and blobs. +** +** 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 prepared +** 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 */ +#ifndef SQLITE_OMIT_UTF16 + Mem utf8; /* Used to convert UTF16 parameters into UTF8 for display */ +#endif + char zBase[100]; /* Initial working space */ + + db = p->db; + sqlite3StrAccumInit(&out, 0, zBase, sizeof(zBase), + db->aLimit[SQLITE_LIMIT_LENGTH]); + if( db->nVdbeExec>1 ){ + while( *zRawSql ){ + const char *zStart = zRawSql; + while( *(zRawSql++)!='\n' && *zRawSql ); + sqlite3StrAccumAppend(&out, "-- ", 3); + assert( (zRawSql - zStart) > 0 ); + sqlite3StrAccumAppend(&out, zStart, (int)(zRawSql-zStart)); + } + }else if( p->nVar==0 ){ + sqlite3StrAccumAppend(&out, zRawSql, sqlite3Strlen30(zRawSql)); + }else{ + 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]=='@' || zRawSql[0]=='#' ); + testcase( 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->u.r); + }else if( pVar->flags & MEM_Str ){ + int nOut; /* Number of bytes of the string text to include in output */ +#ifndef SQLITE_OMIT_UTF16 + u8 enc = ENC(db); + if( enc!=SQLITE_UTF8 ){ + memset(&utf8, 0, sizeof(utf8)); + utf8.db = db; + sqlite3VdbeMemSetStr(&utf8, pVar->z, pVar->n, enc, SQLITE_STATIC); + if( SQLITE_NOMEM==sqlite3VdbeChangeEncoding(&utf8, SQLITE_UTF8) ){ + out.accError = STRACCUM_NOMEM; + out.nAlloc = 0; + } + pVar = &utf8; + } +#endif + nOut = pVar->n; +#ifdef SQLITE_TRACE_SIZE_LIMIT + if( nOut>SQLITE_TRACE_SIZE_LIMIT ){ + nOut = SQLITE_TRACE_SIZE_LIMIT; + while( nOutn && (pVar->z[nOut]&0xc0)==0x80 ){ nOut++; } + } +#endif + sqlite3XPrintf(&out, "'%.*q'", nOut, pVar->z); +#ifdef SQLITE_TRACE_SIZE_LIMIT + if( nOutn ){ + sqlite3XPrintf(&out, "/*+%d bytes*/", pVar->n-nOut); + } +#endif +#ifndef SQLITE_OMIT_UTF16 + if( enc!=SQLITE_UTF8 ) sqlite3VdbeMemRelease(&utf8); +#endif + }else if( pVar->flags & MEM_Zero ){ + sqlite3XPrintf(&out, "zeroblob(%d)", pVar->u.nZero); + }else{ + int nOut; /* Number of bytes of the blob to include in output */ + assert( pVar->flags & MEM_Blob ); + sqlite3StrAccumAppend(&out, "x'", 2); + nOut = pVar->n; +#ifdef SQLITE_TRACE_SIZE_LIMIT + if( nOut>SQLITE_TRACE_SIZE_LIMIT ) nOut = SQLITE_TRACE_SIZE_LIMIT; +#endif + for(i=0; iz[i]&0xff); + } + sqlite3StrAccumAppend(&out, "'", 1); +#ifdef SQLITE_TRACE_SIZE_LIMIT + if( nOutn ){ + sqlite3XPrintf(&out, "/*+%d bytes*/", pVar->n-nOut); + } +#endif + } + } + } + if( out.accError ) sqlite3StrAccumReset(&out); + return sqlite3StrAccumFinish(&out); +} + +#endif /* #ifndef SQLITE_OMIT_TRACE */ + +/************** End of vdbetrace.c *******************************************/ +/************** Begin file vdbe.c ********************************************/ +/* +** 2001 September 15 +** +** 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. +** +************************************************************************* +** The code in this file implements the function that runs the +** bytecode of a prepared statement. +** +** Various scripts scan this source file in order to generate HTML +** documentation, headers files, or other derived files. The formatting +** 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. +*/ +/* #include "sqliteInt.h" */ +/* #include "vdbeInt.h" */ + +/* +** Invoke this macro on memory cells just prior to changing the +** value of the cell. This macro verifies that shallow copies are +** not misused. A shallow copy of a string or blob just copies a +** pointer to the string or blob, not the content. If the original +** is changed while the copy is still in use, the string or blob might +** be changed out from under the copy. This macro verifies that nothing +** like that ever happens. +*/ +#ifdef SQLITE_DEBUG +# define memAboutToChange(P,M) sqlite3VdbeMemAboutToChange(P,M) +#else +# define memAboutToChange(P,M) +#endif + +/* +** The following global variable is incremented every time a cursor +** moves, either by the OP_SeekXX, OP_Next, or OP_Prev opcodes. The test +** procedures use this information to make sure that indices are +** working correctly. This variable has no function other than to +** help verify the correct operation of the library. +*/ +#ifdef SQLITE_TEST +SQLITE_API int sqlite3_search_count = 0; +#endif + +/* +** When this global variable is positive, it gets decremented once before +** each instruction in the VDBE. When it reaches zero, the u1.isInterrupted +** field of the sqlite3 structure is set in order to simulate an interrupt. +** +** This facility is used for testing purposes only. It does not function +** in an ordinary build. +*/ +#ifdef SQLITE_TEST +SQLITE_API int sqlite3_interrupt_count = 0; +#endif + +/* +** The next global variable is incremented each type the OP_Sort opcode +** is executed. The test procedures use this information to make sure that +** sorting is occurring or not occurring at appropriate times. This variable +** has no function other than to help verify the correct operation of the +** library. +*/ +#ifdef SQLITE_TEST +SQLITE_API int sqlite3_sort_count = 0; +#endif + +/* +** The next global variable records the size of the largest MEM_Blob +** or MEM_Str that has been used by a VDBE opcode. The test procedures +** use this information to make sure that the zero-blob functionality +** is working correctly. This variable has no function other than to +** help verify the correct operation of the library. +*/ +#ifdef SQLITE_TEST +SQLITE_API int sqlite3_max_blobsize = 0; +static void updateMaxBlobsize(Mem *p){ + if( (p->flags & (MEM_Str|MEM_Blob))!=0 && p->n>sqlite3_max_blobsize ){ + sqlite3_max_blobsize = p->n; + } +} +#endif + +/* +** This macro evaluates to true if either the update hook or the preupdate +** hook are enabled for database connect DB. +*/ +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK +# define HAS_UPDATE_HOOK(DB) ((DB)->xPreUpdateCallback||(DB)->xUpdateCallback) +#else +# define HAS_UPDATE_HOOK(DB) ((DB)->xUpdateCallback) +#endif + +/* +** The next global variable is incremented each time the OP_Found opcode +** is executed. This is used to test whether or not the foreign key +** operation implemented using OP_FkIsZero is working. This variable +** has no function other than to help verify the correct operation of the +** library. +*/ +#ifdef SQLITE_TEST +SQLITE_API int sqlite3_found_count = 0; +#endif + +/* +** Test a register to see if it exceeds the current maximum blob size. +** If it does, record the new maximum blob size. +*/ +#if defined(SQLITE_TEST) && !defined(SQLITE_OMIT_BUILTIN_TEST) +# define UPDATE_MAX_BLOBSIZE(P) updateMaxBlobsize(P) +#else +# define UPDATE_MAX_BLOBSIZE(P) +#endif + +/* +** Invoke the VDBE coverage callback, if that callback is defined. This +** feature is used for test suite validation only and does not appear an +** production builds. +** +** M is an integer, 2 or 3, that indices how many different ways the +** branch can go. It is usually 2. "I" is the direction the branch +** goes. 0 means falls through. 1 means branch is taken. 2 means the +** second alternative branch is taken. +** +** iSrcLine is the source code line (from the __LINE__ macro) that +** generated the VDBE instruction. This instrumentation assumes that all +** source code is in a single file (the amalgamation). Special values 1 +** and 2 for the iSrcLine parameter mean that this particular branch is +** always taken or never taken, respectively. +*/ +#if !defined(SQLITE_VDBE_COVERAGE) +# define VdbeBranchTaken(I,M) +#else +# define VdbeBranchTaken(I,M) vdbeTakeBranch(pOp->iSrcLine,I,M) + static void vdbeTakeBranch(int iSrcLine, u8 I, u8 M){ + if( iSrcLine<=2 && ALWAYS(iSrcLine>0) ){ + M = iSrcLine; + /* Assert the truth of VdbeCoverageAlwaysTaken() and + ** VdbeCoverageNeverTaken() */ + assert( (M & I)==I ); + }else{ + if( sqlite3GlobalConfig.xVdbeBranch==0 ) return; /*NO_TEST*/ + sqlite3GlobalConfig.xVdbeBranch(sqlite3GlobalConfig.pVdbeBranchArg, + iSrcLine,I,M); + } + } +#endif + +/* +** Convert the given register into a string if it isn't one +** already. Return non-zero if a malloc() fails. +*/ +#define Stringify(P, enc) \ + if(((P)->flags&(MEM_Str|MEM_Blob))==0 && sqlite3VdbeMemStringify(P,enc,0)) \ + { goto no_mem; } + +/* +** An ephemeral string value (signified by the MEM_Ephem flag) contains +** a pointer to a dynamically allocated string where some other entity +** is responsible for deallocating that string. Because the register +** does not control the string, it might be deleted without the register +** knowing it. +** +** This routine converts an ephemeral string into a dynamically allocated +** string that the register itself controls. In other words, it +** converts an MEM_Ephem string into a string with P.z==P.zMalloc. +*/ +#define Deephemeralize(P) \ + if( ((P)->flags&MEM_Ephem)!=0 \ + && sqlite3VdbeMemMakeWriteable(P) ){ goto no_mem;} + +/* Return true if the cursor was opened using the OP_OpenSorter opcode. */ +#define isSorter(x) ((x)->eCurType==CURTYPE_SORTER) + +/* +** Allocate VdbeCursor number iCur. Return a pointer to it. Return NULL +** if we run out of memory. +*/ +static VdbeCursor *allocateCursor( + Vdbe *p, /* The virtual machine */ + int iCur, /* Index of the new VdbeCursor */ + int nField, /* Number of fields in the table or index */ + int iDb, /* Database the cursor belongs to, or -1 */ + u8 eCurType /* Type of the new cursor */ +){ + /* Find the memory cell that will be used to store the blob of memory + ** required for this VdbeCursor structure. It is convenient to use a + ** vdbe memory cell to manage the memory allocation required for a + ** VdbeCursor structure for the following reasons: + ** + ** * Sometimes cursor numbers are used for a couple of different + ** purposes in a vdbe program. The different uses might require + ** different sized allocations. Memory cells provide growable + ** allocations. + ** + ** * When using ENABLE_MEMORY_MANAGEMENT, memory cell buffers can + ** be freed lazily via the sqlite3_release_memory() API. This + ** minimizes the number of malloc calls made by the system. + ** + ** The memory cell for cursor 0 is aMem[0]. The rest are allocated from + ** the top of the register space. Cursor 1 is at Mem[p->nMem-1]. + ** Cursor 2 is at Mem[p->nMem-2]. And so forth. + */ + Mem *pMem = iCur>0 ? &p->aMem[p->nMem-iCur] : p->aMem; + + int nByte; + VdbeCursor *pCx = 0; + nByte = + ROUND8(sizeof(VdbeCursor)) + 2*sizeof(u32)*nField + + (eCurType==CURTYPE_BTREE?sqlite3BtreeCursorSize():0); + + assert( iCur>=0 && iCurnCursor ); + if( p->apCsr[iCur] ){ /*OPTIMIZATION-IF-FALSE*/ + sqlite3VdbeFreeCursor(p, p->apCsr[iCur]); + p->apCsr[iCur] = 0; + } + if( SQLITE_OK==sqlite3VdbeMemClearAndResize(pMem, nByte) ){ + p->apCsr[iCur] = pCx = (VdbeCursor*)pMem->z; + memset(pCx, 0, sizeof(VdbeCursor)); + pCx->eCurType = eCurType; + pCx->iDb = iDb; + pCx->nField = nField; + pCx->aOffset = &pCx->aType[nField]; + if( eCurType==CURTYPE_BTREE ){ + pCx->uc.pCursor = (BtCursor*) + &pMem->z[ROUND8(sizeof(VdbeCursor))+2*sizeof(u32)*nField]; + sqlite3BtreeCursorZero(pCx->uc.pCursor); + } + } + return pCx; +} + +/* +** Try to convert a value into a numeric representation if we can +** do so without loss of information. In other words, if the string +** looks like a number, convert it into a number. If it does not +** look like a number, leave it alone. +** +** If the bTryForInt flag is true, then extra effort is made to give +** an integer representation. Strings that look like floating point +** values but which have no fractional component (example: '48.00') +** will have a MEM_Int representation when bTryForInt is true. +** +** If bTryForInt is false, then if the input string contains a decimal +** point or exponential notation, the result is only MEM_Real, even +** if there is an exact integer representation of the quantity. +*/ +static void applyNumericAffinity(Mem *pRec, int bTryForInt){ + double rValue; + i64 iValue; + u8 enc = pRec->enc; + assert( (pRec->flags & (MEM_Str|MEM_Int|MEM_Real))==MEM_Str ); + if( sqlite3AtoF(pRec->z, &rValue, pRec->n, enc)==0 ) return; + if( 0==sqlite3Atoi64(pRec->z, &iValue, pRec->n, enc) ){ + pRec->u.i = iValue; + pRec->flags |= MEM_Int; + }else{ + pRec->u.r = rValue; + pRec->flags |= MEM_Real; + if( bTryForInt ) sqlite3VdbeIntegerAffinity(pRec); + } +} + +/* +** Processing is determine by the affinity parameter: +** +** SQLITE_AFF_INTEGER: +** SQLITE_AFF_REAL: +** SQLITE_AFF_NUMERIC: +** Try to convert pRec to an integer representation or a +** floating-point representation if an integer representation +** is not possible. Note that the integer representation is +** always preferred, even if the affinity is REAL, because +** an integer representation is more space efficient on disk. +** +** SQLITE_AFF_TEXT: +** Convert pRec to a text representation. +** +** SQLITE_AFF_BLOB: +** No-op. pRec is unchanged. +*/ +static void applyAffinity( + Mem *pRec, /* The value to apply affinity to */ + char affinity, /* The affinity to be applied */ + u8 enc /* Use this text encoding */ +){ + if( affinity>=SQLITE_AFF_NUMERIC ){ + assert( affinity==SQLITE_AFF_INTEGER || affinity==SQLITE_AFF_REAL + || affinity==SQLITE_AFF_NUMERIC ); + if( (pRec->flags & MEM_Int)==0 ){ /*OPTIMIZATION-IF-FALSE*/ + if( (pRec->flags & MEM_Real)==0 ){ + if( pRec->flags & MEM_Str ) applyNumericAffinity(pRec,1); + }else{ + sqlite3VdbeIntegerAffinity(pRec); + } + } + }else if( affinity==SQLITE_AFF_TEXT ){ + /* Only attempt the conversion to TEXT if there is an integer or real + ** representation (blob and NULL do not get converted) but no string + ** representation. It would be harmless to repeat the conversion if + ** there is already a string rep, but it is pointless to waste those + ** CPU cycles. */ + if( 0==(pRec->flags&MEM_Str) ){ /*OPTIMIZATION-IF-FALSE*/ + if( (pRec->flags&(MEM_Real|MEM_Int)) ){ + sqlite3VdbeMemStringify(pRec, enc, 1); + } + } + pRec->flags &= ~(MEM_Real|MEM_Int); + } +} + +/* +** Try to convert the type of a function argument or a result column +** into a numeric representation. Use either INTEGER or REAL whichever +** is appropriate. But only do the conversion if it is possible without +** loss of information and return the revised type of the argument. +*/ +SQLITE_API int sqlite3_value_numeric_type(sqlite3_value *pVal){ + int eType = sqlite3_value_type(pVal); + if( eType==SQLITE_TEXT ){ + Mem *pMem = (Mem*)pVal; + applyNumericAffinity(pMem, 0); + eType = sqlite3_value_type(pVal); + } + return eType; +} + +/* +** Exported version of applyAffinity(). This one works on sqlite3_value*, +** not the internal Mem* type. +*/ +SQLITE_PRIVATE void sqlite3ValueApplyAffinity( + sqlite3_value *pVal, + u8 affinity, + u8 enc +){ + applyAffinity((Mem *)pVal, affinity, enc); +} + +/* +** pMem currently only holds a string type (or maybe a BLOB that we can +** interpret as a string if we want to). Compute its corresponding +** numeric type, if has one. Set the pMem->u.r and pMem->u.i fields +** accordingly. +*/ +static u16 SQLITE_NOINLINE computeNumericType(Mem *pMem){ + assert( (pMem->flags & (MEM_Int|MEM_Real))==0 ); + assert( (pMem->flags & (MEM_Str|MEM_Blob))!=0 ); + if( sqlite3AtoF(pMem->z, &pMem->u.r, pMem->n, pMem->enc)==0 ){ + return 0; + } + if( sqlite3Atoi64(pMem->z, &pMem->u.i, pMem->n, pMem->enc)==SQLITE_OK ){ + return MEM_Int; + } + return MEM_Real; +} + +/* +** Return the numeric type for pMem, either MEM_Int or MEM_Real or both or +** none. +** +** Unlike applyNumericAffinity(), this routine does not modify pMem->flags. +** But it does set pMem->u.r and pMem->u.i appropriately. +*/ +static u16 numericType(Mem *pMem){ + if( pMem->flags & (MEM_Int|MEM_Real) ){ + return pMem->flags & (MEM_Int|MEM_Real); + } + if( pMem->flags & (MEM_Str|MEM_Blob) ){ + return computeNumericType(pMem); + } + return 0; +} + +#ifdef SQLITE_DEBUG +/* +** Write a nice string representation of the contents of cell pMem +** into buffer zBuf, length nBuf. +*/ +SQLITE_PRIVATE void sqlite3VdbeMemPrettyPrint(Mem *pMem, char *zBuf){ + char *zCsr = zBuf; + int f = pMem->flags; + + static const char *const encnames[] = {"(X)", "(8)", "(16LE)", "(16BE)"}; + + if( f&MEM_Blob ){ + int i; + char c; + if( f & MEM_Dyn ){ + c = 'z'; + assert( (f & (MEM_Static|MEM_Ephem))==0 ); + }else if( f & MEM_Static ){ + c = 't'; + assert( (f & (MEM_Dyn|MEM_Ephem))==0 ); + }else if( f & MEM_Ephem ){ + c = 'e'; + assert( (f & (MEM_Static|MEM_Dyn))==0 ); + }else{ + c = 's'; + } + + sqlite3_snprintf(100, zCsr, "%c", c); + zCsr += sqlite3Strlen30(zCsr); + sqlite3_snprintf(100, zCsr, "%d[", pMem->n); + zCsr += sqlite3Strlen30(zCsr); + for(i=0; i<16 && in; i++){ + sqlite3_snprintf(100, zCsr, "%02X", ((int)pMem->z[i] & 0xFF)); + zCsr += sqlite3Strlen30(zCsr); + } + for(i=0; i<16 && in; i++){ + char z = pMem->z[i]; + if( z<32 || z>126 ) *zCsr++ = '.'; + else *zCsr++ = z; + } + + sqlite3_snprintf(100, zCsr, "]%s", encnames[pMem->enc]); + zCsr += sqlite3Strlen30(zCsr); + if( f & MEM_Zero ){ + sqlite3_snprintf(100, zCsr,"+%dz",pMem->u.nZero); + zCsr += sqlite3Strlen30(zCsr); + } + *zCsr = '\0'; + }else if( f & MEM_Str ){ + int j, k; + zBuf[0] = ' '; + if( f & MEM_Dyn ){ + zBuf[1] = 'z'; + assert( (f & (MEM_Static|MEM_Ephem))==0 ); + }else if( f & MEM_Static ){ + zBuf[1] = 't'; + assert( (f & (MEM_Dyn|MEM_Ephem))==0 ); + }else if( f & MEM_Ephem ){ + zBuf[1] = 'e'; + assert( (f & (MEM_Static|MEM_Dyn))==0 ); + }else{ + zBuf[1] = 's'; + } + k = 2; + sqlite3_snprintf(100, &zBuf[k], "%d", pMem->n); + k += sqlite3Strlen30(&zBuf[k]); + zBuf[k++] = '['; + for(j=0; j<15 && jn; j++){ + u8 c = pMem->z[j]; + if( c>=0x20 && c<0x7f ){ + zBuf[k++] = c; + }else{ + zBuf[k++] = '.'; + } + } + zBuf[k++] = ']'; + sqlite3_snprintf(100,&zBuf[k], encnames[pMem->enc]); + k += sqlite3Strlen30(&zBuf[k]); + zBuf[k++] = 0; + } +} +#endif + +#ifdef SQLITE_DEBUG +/* +** Print the value of a register for tracing purposes: +*/ +static void memTracePrint(Mem *p){ + if( p->flags & MEM_Undefined ){ + printf(" undefined"); + }else if( p->flags & MEM_Null ){ + printf(" NULL"); + }else if( (p->flags & (MEM_Int|MEM_Str))==(MEM_Int|MEM_Str) ){ + printf(" si:%lld", p->u.i); + }else if( p->flags & MEM_Int ){ + printf(" i:%lld", p->u.i); +#ifndef SQLITE_OMIT_FLOATING_POINT + }else if( p->flags & MEM_Real ){ + printf(" r:%g", p->u.r); +#endif + }else if( p->flags & MEM_RowSet ){ + printf(" (rowset)"); + }else{ + char zBuf[200]; + sqlite3VdbeMemPrettyPrint(p, zBuf); + printf(" %s", zBuf); + } + if( p->flags & MEM_Subtype ) printf(" subtype=0x%02x", p->eSubtype); +} +static void registerTrace(int iReg, Mem *p){ + printf("REG[%d] = ", iReg); + memTracePrint(p); + printf("\n"); +} +#endif + +#ifdef SQLITE_DEBUG +# define REGISTER_TRACE(R,M) if(db->flags&SQLITE_VdbeTrace)registerTrace(R,M) +#else +# define REGISTER_TRACE(R,M) +#endif + + +#ifdef VDBE_PROFILE + +/* +** hwtime.h contains inline assembler code for implementing +** high-performance timing routines. +*/ +/************** Include hwtime.h in the middle of vdbe.c *********************/ +/************** Begin file hwtime.h ******************************************/ +/* +** 2008 May 27 +** +** 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 inline asm code for retrieving "high-performance" +** counters for x86 class CPUs. +*/ +#ifndef SQLITE_HWTIME_H +#define SQLITE_HWTIME_H + +/* +** The following routine only works on pentium-class (or newer) processors. +** It uses the RDTSC opcode to read the cycle count value out of the +** processor and returns that value. This can be used for high-res +** profiling. +*/ +#if (defined(__GNUC__) || defined(_MSC_VER)) && \ + (defined(i386) || defined(__i386__) || defined(_M_IX86)) + + #if defined(__GNUC__) + + __inline__ sqlite_uint64 sqlite3Hwtime(void){ + unsigned int lo, hi; + __asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi)); + return (sqlite_uint64)hi << 32 | lo; + } + + #elif defined(_MSC_VER) + + __declspec(naked) __inline sqlite_uint64 __cdecl sqlite3Hwtime(void){ + __asm { + rdtsc + ret ; return value at EDX:EAX + } + } + + #endif + +#elif (defined(__GNUC__) && defined(__x86_64__)) + + __inline__ sqlite_uint64 sqlite3Hwtime(void){ + unsigned long val; + __asm__ __volatile__ ("rdtsc" : "=A" (val)); + return val; + } + +#elif (defined(__GNUC__) && defined(__ppc__)) + + __inline__ sqlite_uint64 sqlite3Hwtime(void){ + unsigned long long retval; + unsigned long junk; + __asm__ __volatile__ ("\n\ + 1: mftbu %1\n\ + mftb %L0\n\ + mftbu %0\n\ + cmpw %0,%1\n\ + bne 1b" + : "=r" (retval), "=r" (junk)); + return retval; + } + +#else + + #error Need implementation of sqlite3Hwtime() for your platform. + + /* + ** To compile without implementing sqlite3Hwtime() for your platform, + ** you can remove the above #error and use the following + ** stub function. You will lose timing support for many + ** of the debugging and testing utilities, but it should at + ** least compile and run. + */ +SQLITE_PRIVATE sqlite_uint64 sqlite3Hwtime(void){ return ((sqlite_uint64)0); } + +#endif + +#endif /* !defined(SQLITE_HWTIME_H) */ + +/************** End of hwtime.h **********************************************/ +/************** Continuing where we left off in vdbe.c ***********************/ + +#endif + +#ifndef NDEBUG +/* +** This function is only called from within an assert() expression. It +** checks that the sqlite3.nTransaction variable is correctly set to +** the number of non-transaction savepoints currently in the +** linked list starting at sqlite3.pSavepoint. +** +** Usage: +** +** assert( checkSavepointCount(db) ); +*/ +static int checkSavepointCount(sqlite3 *db){ + int n = 0; + Savepoint *p; + for(p=db->pSavepoint; p; p=p->pNext) n++; + assert( n==(db->nSavepoint + db->isTransactionSavepoint) ); + return 1; +} +#endif + +/* +** Return the register of pOp->p2 after first preparing it to be +** overwritten with an integer value. +*/ +static SQLITE_NOINLINE Mem *out2PrereleaseWithClear(Mem *pOut){ + sqlite3VdbeMemSetNull(pOut); + pOut->flags = MEM_Int; + return pOut; +} +static Mem *out2Prerelease(Vdbe *p, VdbeOp *pOp){ + Mem *pOut; + assert( pOp->p2>0 ); + assert( pOp->p2<=(p->nMem+1 - p->nCursor) ); + pOut = &p->aMem[pOp->p2]; + memAboutToChange(p, pOut); + if( VdbeMemDynamic(pOut) ){ /*OPTIMIZATION-IF-FALSE*/ + return out2PrereleaseWithClear(pOut); + }else{ + pOut->flags = MEM_Int; + return pOut; + } +} + + +/* +** Execute as much of a VDBE program as we can. +** This is the core of sqlite3_step(). +*/ +SQLITE_PRIVATE int sqlite3VdbeExec( + Vdbe *p /* The VDBE */ +){ + Op *aOp = p->aOp; /* Copy of p->aOp */ + Op *pOp = aOp; /* Current operation */ +#if defined(SQLITE_DEBUG) || defined(VDBE_PROFILE) + Op *pOrigOp; /* Value of pOp at the top of the loop */ +#endif +#ifdef SQLITE_DEBUG + int nExtraDelete = 0; /* Verifies FORDELETE and AUXDELETE flags */ +#endif + int rc = SQLITE_OK; /* Value to return */ + sqlite3 *db = p->db; /* The database */ + u8 resetSchemaOnFault = 0; /* Reset schema after an error if positive */ + u8 encoding = ENC(db); /* The database encoding */ + int iCompare = 0; /* Result of last comparison */ + unsigned nVmStep = 0; /* Number of virtual machine steps */ +#ifndef SQLITE_OMIT_PROGRESS_CALLBACK + unsigned nProgressLimit = 0;/* Invoke xProgress() when nVmStep reaches this */ +#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 */ + int *aPermute = 0; /* Permutation of columns for OP_Compare */ + i64 lastRowid = db->lastRowid; /* Saved value of the last insert ROWID */ +#ifdef VDBE_PROFILE + u64 start; /* CPU clock count at start of opcode */ +#endif + /*** INSERT STACK UNION HERE ***/ + + assert( p->magic==VDBE_MAGIC_RUN ); /* sqlite3_step() verifies this */ + sqlite3VdbeEnter(p); + if( p->rc==SQLITE_NOMEM ){ + /* This happens if a malloc() inside a call to sqlite3_column_text() or + ** sqlite3_column_text16() failed. */ + goto no_mem; + } + assert( p->rc==SQLITE_OK || (p->rc&0xff)==SQLITE_BUSY ); + assert( p->bIsReader || p->readOnly!=0 ); + p->rc = SQLITE_OK; + p->iCurrentTime = 0; + assert( p->explain==0 ); + p->pResultSet = 0; + db->busyHandler.nBusy = 0; + if( db->u1.isInterrupted ) goto abort_due_to_interrupt; + sqlite3VdbeIOTraceSql(p); +#ifndef SQLITE_OMIT_PROGRESS_CALLBACK + if( db->xProgress ){ + u32 iPrior = p->aCounter[SQLITE_STMTSTATUS_VM_STEP]; + assert( 0 < db->nProgressOps ); + nProgressLimit = db->nProgressOps - (iPrior % db->nProgressOps); + } +#endif +#ifdef SQLITE_DEBUG + sqlite3BeginBenignMalloc(); + if( p->pc==0 + && (p->db->flags & (SQLITE_VdbeListing|SQLITE_VdbeEQP|SQLITE_VdbeTrace))!=0 + ){ + int i; + int once = 1; + sqlite3VdbePrintSql(p); + if( p->db->flags & SQLITE_VdbeListing ){ + printf("VDBE Program Listing:\n"); + for(i=0; inOp; i++){ + sqlite3VdbePrintOp(stdout, i, &aOp[i]); + } + } + if( p->db->flags & SQLITE_VdbeEQP ){ + for(i=0; inOp; i++){ + if( aOp[i].opcode==OP_Explain ){ + if( once ) printf("VDBE Query Plan:\n"); + printf("%s\n", aOp[i].p4.z); + once = 0; + } + } + } + if( p->db->flags & SQLITE_VdbeTrace ) printf("VDBE Trace:\n"); + } + sqlite3EndBenignMalloc(); +#endif + for(pOp=&aOp[p->pc]; 1; pOp++){ + /* Errors are detected by individual opcodes, with an immediate + ** jumps to abort_due_to_error. */ + assert( rc==SQLITE_OK ); + + assert( pOp>=aOp && pOp<&aOp[p->nOp]); +#ifdef VDBE_PROFILE + start = sqlite3Hwtime(); +#endif + nVmStep++; +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS + if( p->anExec ) p->anExec[(int)(pOp-aOp)]++; +#endif + + /* Only allow tracing if SQLITE_DEBUG is defined. + */ +#ifdef SQLITE_DEBUG + if( db->flags & SQLITE_VdbeTrace ){ + sqlite3VdbePrintOp(stdout, (int)(pOp - aOp), pOp); + } +#endif + + + /* Check to see if we need to simulate an interrupt. This only happens + ** if we have a special test build. + */ +#ifdef SQLITE_TEST + if( sqlite3_interrupt_count>0 ){ + sqlite3_interrupt_count--; + if( sqlite3_interrupt_count==0 ){ + sqlite3_interrupt(db); + } + } +#endif + + /* Sanity checking on other operands */ +#ifdef SQLITE_DEBUG + { + u8 opProperty = sqlite3OpcodeProperty[pOp->opcode]; + if( (opProperty & OPFLG_IN1)!=0 ){ + assert( pOp->p1>0 ); + assert( pOp->p1<=(p->nMem+1 - p->nCursor) ); + assert( memIsValid(&aMem[pOp->p1]) ); + assert( sqlite3VdbeCheckMemInvariants(&aMem[pOp->p1]) ); + REGISTER_TRACE(pOp->p1, &aMem[pOp->p1]); + } + if( (opProperty & OPFLG_IN2)!=0 ){ + assert( pOp->p2>0 ); + assert( pOp->p2<=(p->nMem+1 - p->nCursor) ); + assert( memIsValid(&aMem[pOp->p2]) ); + assert( sqlite3VdbeCheckMemInvariants(&aMem[pOp->p2]) ); + REGISTER_TRACE(pOp->p2, &aMem[pOp->p2]); + } + if( (opProperty & OPFLG_IN3)!=0 ){ + assert( pOp->p3>0 ); + assert( pOp->p3<=(p->nMem+1 - p->nCursor) ); + assert( memIsValid(&aMem[pOp->p3]) ); + assert( sqlite3VdbeCheckMemInvariants(&aMem[pOp->p3]) ); + REGISTER_TRACE(pOp->p3, &aMem[pOp->p3]); + } + if( (opProperty & OPFLG_OUT2)!=0 ){ + assert( pOp->p2>0 ); + assert( pOp->p2<=(p->nMem+1 - p->nCursor) ); + memAboutToChange(p, &aMem[pOp->p2]); + } + if( (opProperty & OPFLG_OUT3)!=0 ){ + assert( pOp->p3>0 ); + assert( pOp->p3<=(p->nMem+1 - p->nCursor) ); + memAboutToChange(p, &aMem[pOp->p3]); + } + } +#endif +#if defined(SQLITE_DEBUG) || defined(VDBE_PROFILE) + pOrigOp = pOp; +#endif + + switch( pOp->opcode ){ + +/***************************************************************************** +** What follows is a massive switch statement where each case implements a +** separate instruction in the virtual machine. If we follow the usual +** indentation conventions, each case should be indented by 6 spaces. But +** that is a lot of wasted space on the left margin. So the code within +** the switch statement will break with convention and be flush-left. Another +** big comment (similar to this one) will mark the point in the code where +** we transition back to normal indentation. +** +** The formatting of each case is important. The makefile for SQLite +** generates two C files "opcodes.h" and "opcodes.c" by scanning this +** file looking for lines that begin with "case OP_". The opcodes.h files +** will be filled with #defines that give unique integer values to each +** opcode and the opcodes.c file is filled with an array of strings where +** each string is the symbolic name for the corresponding opcode. If the +** case statement is followed by a comment of the form "/# same as ... #/" +** that comment is used to determine the particular value of the opcode. +** +** Other keywords in the comment that follows each case are used to +** construct the OPFLG_INITIALIZER value that initializes opcodeProperty[]. +** Keywords include: in1, in2, in3, out2, out3. See +** the mkopcodeh.awk script for additional information. +** +** Documentation about VDBE opcodes is generated by scanning this file +** for lines of that contain "Opcode:". That line and all subsequent +** comment lines are used in the generation of the opcode.html documentation +** file. +** +** SUMMARY: +** +** Formatting is important to scripts that scan this file. +** Do not deviate from the formatting style currently in use. +** +*****************************************************************************/ + +/* Opcode: Goto * P2 * * * +** +** An unconditional jump to address P2. +** The next instruction executed will be +** the one at index P2 from the beginning of +** the program. +** +** The P1 parameter is not actually used by this opcode. However, it +** is sometimes set to 1 instead of 0 as a hint to the command-line shell +** that this Goto is the bottom of a loop and that the lines from P2 down +** to the current line should be indented for EXPLAIN output. +*/ +case OP_Goto: { /* jump */ +jump_to_p2_and_check_for_interrupt: + pOp = &aOp[pOp->p2 - 1]; + + /* Opcodes that are used as the bottom of a loop (OP_Next, OP_Prev, + ** OP_VNext, OP_RowSetNext, or OP_SorterNext) all jump here upon + ** completion. Check to see if sqlite3_interrupt() has been called + ** or if the progress callback needs to be invoked. + ** + ** This code uses unstructured "goto" statements and does not look clean. + ** But that is not due to sloppy coding habits. The code is written this + ** way for performance, to avoid having to run the interrupt and progress + ** checks on every opcode. This helps sqlite3_step() to run about 1.5% + ** faster according to "valgrind --tool=cachegrind" */ +check_for_interrupt: + if( db->u1.isInterrupted ) goto abort_due_to_interrupt; +#ifndef SQLITE_OMIT_PROGRESS_CALLBACK + /* Call the progress callback if it is configured and the required number + ** of VDBE ops have been executed (either since this invocation of + ** sqlite3VdbeExec() or since last time the progress callback was called). + ** If the progress callback returns non-zero, exit the virtual machine with + ** a return code SQLITE_ABORT. + */ + if( db->xProgress!=0 && nVmStep>=nProgressLimit ){ + assert( db->nProgressOps!=0 ); + nProgressLimit = nVmStep + db->nProgressOps - (nVmStep%db->nProgressOps); + if( db->xProgress(db->pProgressArg) ){ + rc = SQLITE_INTERRUPT; + goto abort_due_to_error; + } + } +#endif + + break; +} + +/* Opcode: Gosub P1 P2 * * * +** +** Write the current address onto register P1 +** and then jump to address P2. +*/ +case OP_Gosub: { /* jump */ + assert( pOp->p1>0 && pOp->p1<=(p->nMem+1 - p->nCursor) ); + pIn1 = &aMem[pOp->p1]; + assert( VdbeMemDynamic(pIn1)==0 ); + memAboutToChange(p, pIn1); + pIn1->flags = MEM_Int; + pIn1->u.i = (int)(pOp-aOp); + REGISTER_TRACE(pOp->p1, pIn1); + + /* Most jump operations do a goto to this spot in order to update + ** the pOp pointer. */ +jump_to_p2: + pOp = &aOp[pOp->p2 - 1]; + break; +} + +/* Opcode: Return P1 * * * * +** +** Jump to the next instruction after the address in register P1. After +** the jump, register P1 becomes undefined. +*/ +case OP_Return: { /* in1 */ + pIn1 = &aMem[pOp->p1]; + assert( pIn1->flags==MEM_Int ); + pOp = &aOp[pIn1->u.i]; + pIn1->flags = MEM_Undefined; + break; +} + +/* Opcode: InitCoroutine P1 P2 P3 * * +** +** Set up register P1 so that it will Yield to the coroutine +** located at address P3. +** +** If P2!=0 then the coroutine implementation immediately follows +** this opcode. So jump over the coroutine implementation to +** address P2. +** +** See also: EndCoroutine +*/ +case OP_InitCoroutine: { /* jump */ + assert( pOp->p1>0 && pOp->p1<=(p->nMem+1 - p->nCursor) ); + assert( pOp->p2>=0 && pOp->p2nOp ); + assert( pOp->p3>=0 && pOp->p3nOp ); + pOut = &aMem[pOp->p1]; + assert( !VdbeMemDynamic(pOut) ); + pOut->u.i = pOp->p3 - 1; + pOut->flags = MEM_Int; + if( pOp->p2 ) goto jump_to_p2; + break; +} + +/* Opcode: EndCoroutine P1 * * * * +** +** The instruction at the address in register P1 is a Yield. +** Jump to the P2 parameter of that Yield. +** After the jump, register P1 becomes undefined. +** +** See also: InitCoroutine +*/ +case OP_EndCoroutine: { /* in1 */ + VdbeOp *pCaller; + pIn1 = &aMem[pOp->p1]; + assert( pIn1->flags==MEM_Int ); + assert( pIn1->u.i>=0 && pIn1->u.inOp ); + pCaller = &aOp[pIn1->u.i]; + assert( pCaller->opcode==OP_Yield ); + assert( pCaller->p2>=0 && pCaller->p2nOp ); + pOp = &aOp[pCaller->p2 - 1]; + pIn1->flags = MEM_Undefined; + break; +} + +/* Opcode: Yield P1 P2 * * * +** +** Swap the program counter with the value in register P1. This +** has the effect of yielding to a coroutine. +** +** If the coroutine that is launched by this instruction ends with +** Yield or Return then continue to the next instruction. But if +** the coroutine launched by this instruction ends with +** EndCoroutine, then jump to P2 rather than continuing with the +** next instruction. +** +** See also: InitCoroutine +*/ +case OP_Yield: { /* in1, jump */ + int pcDest; + pIn1 = &aMem[pOp->p1]; + assert( VdbeMemDynamic(pIn1)==0 ); + pIn1->flags = MEM_Int; + pcDest = (int)pIn1->u.i; + pIn1->u.i = (int)(pOp - aOp); + REGISTER_TRACE(pOp->p1, pIn1); + pOp = &aOp[pcDest]; + break; +} + +/* Opcode: HaltIfNull P1 P2 P3 P4 P5 +** Synopsis: if r[P3]=null halt +** +** Check the value in register P3. If it is NULL then Halt using +** parameter P1, P2, and P4 as if this were a Halt instruction. If the +** value in register P3 is not NULL, then this routine is a no-op. +** The P5 parameter should be 1. +*/ +case OP_HaltIfNull: { /* in3 */ + pIn3 = &aMem[pOp->p3]; + if( (pIn3->flags & MEM_Null)==0 ) break; + /* Fall through into OP_Halt */ +} + +/* Opcode: Halt P1 P2 * P4 P5 +** +** Exit immediately. All open cursors, etc are closed +** automatically. +** +** P1 is the result code returned by sqlite3_exec(), sqlite3_reset(), +** or sqlite3_finalize(). For a normal halt, this should be SQLITE_OK (0). +** For errors, it can be some other value. If P1!=0 then P2 will determine +** whether or not to rollback the current transaction. Do not rollback +** if P2==OE_Fail. Do the rollback if P2==OE_Rollback. If P2==OE_Abort, +** then back out all changes that have occurred during this execution of the +** VDBE, but do not rollback the transaction. +** +** If P4 is not null then it is an error message string. +** +** P5 is a value between 0 and 4, inclusive, that modifies the P4 string. +** +** 0: (no change) +** 1: NOT NULL contraint failed: P4 +** 2: UNIQUE constraint failed: P4 +** 3: CHECK constraint failed: P4 +** 4: FOREIGN KEY constraint failed: P4 +** +** If P5 is not zero and P4 is NULL, then everything after the ":" is +** omitted. +** +** There is an implied "Halt 0 0 0" instruction inserted at the very end of +** every program. So a jump past the last instruction of the program +** is the same as executing Halt. +*/ +case OP_Halt: { + VdbeFrame *pFrame; + int pcx; + + pcx = (int)(pOp - aOp); + if( pOp->p1==SQLITE_OK && p->pFrame ){ + /* Halt the sub-program. Return control to the parent frame. */ + pFrame = p->pFrame; + p->pFrame = pFrame->pParent; + p->nFrame--; + sqlite3VdbeSetChanges(db, p->nChange); + pcx = sqlite3VdbeFrameRestore(pFrame); + lastRowid = db->lastRowid; + if( pOp->p2==OE_Ignore ){ + /* Instruction pcx is the OP_Program that invoked the sub-program + ** currently being halted. If the p2 instruction of this OP_Halt + ** instruction is set to OE_Ignore, then the sub-program is throwing + ** an IGNORE exception. In this case jump to the address specified + ** as the p2 of the calling OP_Program. */ + pcx = p->aOp[pcx].p2-1; + } + aOp = p->aOp; + aMem = p->aMem; + pOp = &aOp[pcx]; + break; + } + p->rc = pOp->p1; + p->errorAction = (u8)pOp->p2; + p->pc = pcx; + assert( pOp->p5>=0 && pOp->p5<=4 ); + if( p->rc ){ + if( pOp->p5 ){ + static const char * const azType[] = { "NOT NULL", "UNIQUE", "CHECK", + "FOREIGN KEY" }; + testcase( pOp->p5==1 ); + testcase( pOp->p5==2 ); + testcase( pOp->p5==3 ); + testcase( pOp->p5==4 ); + sqlite3VdbeError(p, "%s constraint failed", azType[pOp->p5-1]); + if( pOp->p4.z ){ + p->zErrMsg = sqlite3MPrintf(db, "%z: %s", p->zErrMsg, pOp->p4.z); + } + }else{ + sqlite3VdbeError(p, "%s", pOp->p4.z); + } + sqlite3_log(pOp->p1, "abort at %d in [%s]: %s", pcx, p->zSql, p->zErrMsg); + } + rc = sqlite3VdbeHalt(p); + assert( rc==SQLITE_BUSY || rc==SQLITE_OK || rc==SQLITE_ERROR ); + if( rc==SQLITE_BUSY ){ + p->rc = SQLITE_BUSY; + }else{ + assert( rc==SQLITE_OK || (p->rc&0xff)==SQLITE_CONSTRAINT ); + assert( rc==SQLITE_OK || db->nDeferredCons>0 || db->nDeferredImmCons>0 ); + rc = p->rc ? SQLITE_ERROR : SQLITE_DONE; + } + goto vdbe_return; +} + +/* Opcode: Integer P1 P2 * * * +** Synopsis: r[P2]=P1 +** +** The 32-bit integer value P1 is written into register P2. +*/ +case OP_Integer: { /* out2 */ + pOut = out2Prerelease(p, pOp); + pOut->u.i = pOp->p1; + break; +} + +/* Opcode: Int64 * P2 * P4 * +** Synopsis: r[P2]=P4 +** +** P4 is a pointer to a 64-bit integer value. +** Write that value into register P2. +*/ +case OP_Int64: { /* out2 */ + pOut = out2Prerelease(p, pOp); + assert( pOp->p4.pI64!=0 ); + pOut->u.i = *pOp->p4.pI64; + break; +} + +#ifndef SQLITE_OMIT_FLOATING_POINT +/* Opcode: Real * P2 * P4 * +** Synopsis: r[P2]=P4 +** +** P4 is a pointer to a 64-bit floating point value. +** Write that value into register P2. +*/ +case OP_Real: { /* same as TK_FLOAT, out2 */ + pOut = out2Prerelease(p, pOp); + pOut->flags = MEM_Real; + assert( !sqlite3IsNaN(*pOp->p4.pReal) ); + pOut->u.r = *pOp->p4.pReal; + break; +} +#endif + +/* Opcode: String8 * P2 * P4 * +** Synopsis: r[P2]='P4' +** +** P4 points to a nul terminated UTF-8 string. This opcode is transformed +** into a String opcode before it is executed for the first time. During +** this transformation, the length of string P4 is computed and stored +** as the P1 parameter. +*/ +case OP_String8: { /* same as TK_STRING, out2 */ + assert( pOp->p4.z!=0 ); + pOut = out2Prerelease(p, pOp); + pOp->opcode = OP_String; + pOp->p1 = sqlite3Strlen30(pOp->p4.z); + +#ifndef SQLITE_OMIT_UTF16 + if( encoding!=SQLITE_UTF8 ){ + rc = sqlite3VdbeMemSetStr(pOut, pOp->p4.z, -1, SQLITE_UTF8, SQLITE_STATIC); + assert( rc==SQLITE_OK || rc==SQLITE_TOOBIG ); + if( SQLITE_OK!=sqlite3VdbeChangeEncoding(pOut, encoding) ) goto no_mem; + assert( pOut->szMalloc>0 && pOut->zMalloc==pOut->z ); + assert( VdbeMemDynamic(pOut)==0 ); + pOut->szMalloc = 0; + pOut->flags |= MEM_Static; + if( pOp->p4type==P4_DYNAMIC ){ + sqlite3DbFree(db, pOp->p4.z); + } + pOp->p4type = P4_DYNAMIC; + pOp->p4.z = pOut->z; + pOp->p1 = pOut->n; + } + testcase( rc==SQLITE_TOOBIG ); +#endif + if( pOp->p1>db->aLimit[SQLITE_LIMIT_LENGTH] ){ + goto too_big; + } + assert( rc==SQLITE_OK ); + /* Fall through to the next case, OP_String */ +} + +/* Opcode: String P1 P2 P3 P4 P5 +** Synopsis: r[P2]='P4' (len=P1) +** +** The string value P4 of length P1 (bytes) is stored in register P2. +** +** If P3 is not zero and the content of register P3 is equal to P5, then +** the datatype of the register P2 is converted to BLOB. The content is +** the same sequence of bytes, it is merely interpreted as a BLOB instead +** of a string, as if it had been CAST. In other words: +** +** if( P3!=0 and reg[P3]==P5 ) reg[P2] := CAST(reg[P2] as BLOB) +*/ +case OP_String: { /* out2 */ + assert( pOp->p4.z!=0 ); + pOut = out2Prerelease(p, pOp); + pOut->flags = MEM_Str|MEM_Static|MEM_Term; + pOut->z = pOp->p4.z; + pOut->n = pOp->p1; + pOut->enc = encoding; + UPDATE_MAX_BLOBSIZE(pOut); +#ifndef SQLITE_LIKE_DOESNT_MATCH_BLOBS + if( pOp->p3>0 ){ + assert( pOp->p3<=(p->nMem+1 - p->nCursor) ); + pIn3 = &aMem[pOp->p3]; + assert( pIn3->flags & MEM_Int ); + if( pIn3->u.i==pOp->p5 ) pOut->flags = MEM_Blob|MEM_Static|MEM_Term; + } +#endif + break; +} + +/* Opcode: Null P1 P2 P3 * * +** Synopsis: r[P2..P3]=NULL +** +** Write a NULL into registers P2. If P3 greater than P2, then also write +** NULL into register P3 and every register in between P2 and P3. If P3 +** is less than P2 (typically P3 is zero) then only register P2 is +** set to NULL. +** +** If the P1 value is non-zero, then also set the MEM_Cleared flag so that +** NULL values will not compare equal even if SQLITE_NULLEQ is set on +** OP_Ne or OP_Eq. +*/ +case OP_Null: { /* out2 */ + int cnt; + u16 nullFlag; + pOut = out2Prerelease(p, pOp); + cnt = pOp->p3-pOp->p2; + assert( pOp->p3<=(p->nMem+1 - p->nCursor) ); + pOut->flags = nullFlag = pOp->p1 ? (MEM_Null|MEM_Cleared) : MEM_Null; + pOut->n = 0; + while( cnt>0 ){ + pOut++; + memAboutToChange(p, pOut); + sqlite3VdbeMemSetNull(pOut); + pOut->flags = nullFlag; + pOut->n = 0; + cnt--; + } + break; +} + +/* Opcode: SoftNull P1 * * * * +** Synopsis: r[P1]=NULL +** +** Set register P1 to have the value NULL as seen by the OP_MakeRecord +** instruction, but do not free any string or blob memory associated with +** the register, so that if the value was a string or blob that was +** previously copied using OP_SCopy, the copies will continue to be valid. +*/ +case OP_SoftNull: { + assert( pOp->p1>0 && pOp->p1<=(p->nMem+1 - p->nCursor) ); + pOut = &aMem[pOp->p1]; + pOut->flags = (pOut->flags|MEM_Null)&~MEM_Undefined; + break; +} + +/* Opcode: Blob P1 P2 * P4 * +** Synopsis: r[P2]=P4 (len=P1) +** +** P4 points to a blob of data P1 bytes long. Store this +** blob in register P2. +*/ +case OP_Blob: { /* out2 */ + assert( pOp->p1 <= SQLITE_MAX_LENGTH ); + pOut = out2Prerelease(p, pOp); + sqlite3VdbeMemSetStr(pOut, pOp->p4.z, pOp->p1, 0, 0); + pOut->enc = encoding; + UPDATE_MAX_BLOBSIZE(pOut); + break; +} + +/* Opcode: Variable P1 P2 * P4 * +** Synopsis: r[P2]=parameter(P1,P4) +** +** Transfer the values of bound parameter P1 into register P2 +** +** If the parameter is named, then its name appears in P4. +** The P4 value is used by sqlite3_bind_parameter_name(). +*/ +case OP_Variable: { /* out2 */ + Mem *pVar; /* Value being transferred */ + + assert( pOp->p1>0 && pOp->p1<=p->nVar ); + assert( pOp->p4.z==0 || pOp->p4.z==p->azVar[pOp->p1-1] ); + pVar = &p->aVar[pOp->p1 - 1]; + if( sqlite3VdbeMemTooBig(pVar) ){ + goto too_big; + } + pOut = out2Prerelease(p, pOp); + sqlite3VdbeMemShallowCopy(pOut, pVar, MEM_Static); + UPDATE_MAX_BLOBSIZE(pOut); + break; +} + +/* Opcode: Move P1 P2 P3 * * +** Synopsis: r[P2@P3]=r[P1@P3] +** +** Move the P3 values in register P1..P1+P3-1 over into +** registers P2..P2+P3-1. Registers P1..P1+P3-1 are +** left holding a NULL. It is an error for register ranges +** P1..P1+P3-1 and P2..P2+P3-1 to overlap. It is an error +** for P3 to be less than 1. +*/ +case OP_Move: { + int n; /* Number of registers left to copy */ + int p1; /* Register to copy from */ + int p2; /* Register to copy to */ + + n = pOp->p3; + p1 = pOp->p1; + p2 = pOp->p2; + assert( n>0 && p1>0 && p2>0 ); + assert( p1+n<=p2 || p2+n<=p1 ); + + pIn1 = &aMem[p1]; + pOut = &aMem[p2]; + do{ + assert( pOut<=&aMem[(p->nMem+1 - p->nCursor)] ); + assert( pIn1<=&aMem[(p->nMem+1 - p->nCursor)] ); + assert( memIsValid(pIn1) ); + memAboutToChange(p, pOut); + sqlite3VdbeMemMove(pOut, pIn1); +#ifdef SQLITE_DEBUG + if( pOut->pScopyFrom>=&aMem[p1] && pOut->pScopyFrompScopyFrom += pOp->p2 - p1; + } +#endif + Deephemeralize(pOut); + REGISTER_TRACE(p2++, pOut); + pIn1++; + pOut++; + }while( --n ); + break; +} + +/* Opcode: Copy P1 P2 P3 * * +** Synopsis: r[P2@P3+1]=r[P1@P3+1] +** +** Make a copy of registers P1..P1+P3 into registers P2..P2+P3. +** +** 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: { + int n; + + n = pOp->p3; + pIn1 = &aMem[pOp->p1]; + pOut = &aMem[pOp->p2]; + assert( pOut!=pIn1 ); + while( 1 ){ + sqlite3VdbeMemShallowCopy(pOut, pIn1, MEM_Ephem); + Deephemeralize(pOut); +#ifdef SQLITE_DEBUG + pOut->pScopyFrom = 0; +#endif + REGISTER_TRACE(pOp->p2+pOp->p3-n, pOut); + if( (n--)==0 ) break; + pOut++; + pIn1++; + } + break; +} + +/* Opcode: SCopy P1 P2 * * * +** Synopsis: r[P2]=r[P1] +** +** Make a shallow copy of register P1 into register P2. +** +** This instruction makes a shallow copy of the value. If the value +** is a string or blob, then the copy is only a pointer to the +** original and hence if the original changes so will the copy. +** Worse, if the original is deallocated, the copy becomes invalid. +** Thus the program must guarantee that the original will not change +** during the lifetime of the copy. Use OP_Copy to make a complete +** copy. +*/ +case OP_SCopy: { /* out2 */ + pIn1 = &aMem[pOp->p1]; + pOut = &aMem[pOp->p2]; + assert( pOut!=pIn1 ); + sqlite3VdbeMemShallowCopy(pOut, pIn1, MEM_Ephem); +#ifdef SQLITE_DEBUG + if( pOut->pScopyFrom==0 ) pOut->pScopyFrom = pIn1; +#endif + break; +} + +/* Opcode: IntCopy P1 P2 * * * +** Synopsis: r[P2]=r[P1] +** +** Transfer the integer value held in register P1 into register P2. +** +** This is an optimized version of SCopy that works only for integer +** values. +*/ +case OP_IntCopy: { /* out2 */ + pIn1 = &aMem[pOp->p1]; + assert( (pIn1->flags & MEM_Int)!=0 ); + pOut = &aMem[pOp->p2]; + sqlite3VdbeMemSetInt64(pOut, pIn1->u.i); + break; +} + +/* Opcode: ResultRow P1 P2 * * * +** Synopsis: output=r[P1@P2] +** +** The registers P1 through P1+P2-1 contain a single row of +** results. This opcode causes the sqlite3_step() call to terminate +** with an SQLITE_ROW return code and it sets up the sqlite3_stmt +** structure to provide access to the r(P1)..r(P1+P2-1) values as +** the result row. +*/ +case OP_ResultRow: { + Mem *pMem; + int i; + assert( p->nResColumn==pOp->p2 ); + assert( pOp->p1>0 ); + assert( pOp->p1+pOp->p2<=(p->nMem+1 - p->nCursor)+1 ); + +#ifndef SQLITE_OMIT_PROGRESS_CALLBACK + /* Run the progress counter just before returning. + */ + if( db->xProgress!=0 + && nVmStep>=nProgressLimit + && db->xProgress(db->pProgressArg)!=0 + ){ + rc = SQLITE_INTERRUPT; + goto abort_due_to_error; + } +#endif + + /* If this statement has violated immediate foreign key constraints, do + ** not return the number of rows modified. And do not RELEASE the statement + ** transaction. It needs to be rolled back. */ + if( SQLITE_OK!=(rc = sqlite3VdbeCheckFk(p, 0)) ){ + assert( db->flags&SQLITE_CountRows ); + assert( p->usesStmtJournal ); + goto abort_due_to_error; + } + + /* If the SQLITE_CountRows flag is set in sqlite3.flags mask, then + ** DML statements invoke this opcode to return the number of rows + ** modified to the user. This is the only way that a VM that + ** opens a statement transaction may invoke this opcode. + ** + ** In case this is such a statement, close any statement transaction + ** opened by this VM before returning control to the user. This is to + ** ensure that statement-transactions are always nested, not overlapping. + ** If the open statement-transaction is not closed here, then the user + ** may step another VM that opens its own statement transaction. This + ** may lead to overlapping statement transactions. + ** + ** The statement transaction is never a top-level transaction. Hence + ** the RELEASE call below can never fail. + */ + assert( p->iStatement==0 || db->flags&SQLITE_CountRows ); + rc = sqlite3VdbeCloseStatement(p, SAVEPOINT_RELEASE); + assert( rc==SQLITE_OK ); + + /* Invalidate all ephemeral cursor row caches */ + p->cacheCtr = (p->cacheCtr + 2)|1; + + /* Make sure the results of the current row are \000 terminated + ** and have an assigned type. The results are de-ephemeralized as + ** a side effect. + */ + pMem = p->pResultSet = &aMem[pOp->p1]; + for(i=0; ip2; i++){ + assert( memIsValid(&pMem[i]) ); + Deephemeralize(&pMem[i]); + assert( (pMem[i].flags & MEM_Ephem)==0 + || (pMem[i].flags & (MEM_Str|MEM_Blob))==0 ); + sqlite3VdbeMemNulTerminate(&pMem[i]); + REGISTER_TRACE(pOp->p1+i, &pMem[i]); + } + if( db->mallocFailed ) goto no_mem; + + if( db->mTrace & SQLITE_TRACE_ROW ){ + db->xTrace(SQLITE_TRACE_ROW, db->pTraceArg, p, 0); + } + + /* Return SQLITE_ROW + */ + p->pc = (int)(pOp - aOp) + 1; + rc = SQLITE_ROW; + goto vdbe_return; +} + +/* Opcode: Concat P1 P2 P3 * * +** Synopsis: r[P3]=r[P2]+r[P1] +** +** Add the text in register P1 onto the end of the text in +** register P2 and store the result in register P3. +** If either the P1 or P2 text are NULL then store NULL in P3. +** +** P3 = P2 || P1 +** +** It is illegal for P1 and P3 to be the same register. Sometimes, +** if P3 is the same register as P2, the implementation is able +** to avoid a memcpy(). +*/ +case OP_Concat: { /* same as TK_CONCAT, in1, in2, out3 */ + i64 nByte; + + pIn1 = &aMem[pOp->p1]; + pIn2 = &aMem[pOp->p2]; + pOut = &aMem[pOp->p3]; + assert( pIn1!=pOut ); + if( (pIn1->flags | pIn2->flags) & MEM_Null ){ + sqlite3VdbeMemSetNull(pOut); + break; + } + if( ExpandBlob(pIn1) || ExpandBlob(pIn2) ) goto no_mem; + Stringify(pIn1, encoding); + Stringify(pIn2, encoding); + nByte = pIn1->n + pIn2->n; + if( nByte>db->aLimit[SQLITE_LIMIT_LENGTH] ){ + goto too_big; + } + if( sqlite3VdbeMemGrow(pOut, (int)nByte+2, pOut==pIn2) ){ + goto no_mem; + } + MemSetTypeFlag(pOut, MEM_Str); + if( pOut!=pIn2 ){ + memcpy(pOut->z, pIn2->z, pIn2->n); + } + memcpy(&pOut->z[pIn2->n], pIn1->z, pIn1->n); + pOut->z[nByte]=0; + pOut->z[nByte+1] = 0; + pOut->flags |= MEM_Term; + pOut->n = (int)nByte; + pOut->enc = encoding; + UPDATE_MAX_BLOBSIZE(pOut); + break; +} + +/* Opcode: Add P1 P2 P3 * * +** Synopsis: r[P3]=r[P1]+r[P2] +** +** Add the value in register P1 to the value in register P2 +** and store the result in register P3. +** If either input is NULL, the result is NULL. +*/ +/* Opcode: Multiply P1 P2 P3 * * +** Synopsis: r[P3]=r[P1]*r[P2] +** +** +** Multiply the value in register P1 by the value in register P2 +** and store the result in register P3. +** If either input is NULL, the result is NULL. +*/ +/* Opcode: Subtract P1 P2 P3 * * +** Synopsis: r[P3]=r[P2]-r[P1] +** +** Subtract the value in register P1 from the value in register P2 +** and store the result in register P3. +** If either input is NULL, the result is NULL. +*/ +/* Opcode: Divide P1 P2 P3 * * +** Synopsis: r[P3]=r[P2]/r[P1] +** +** Divide the value in register P1 by the value in register P2 +** and store the result in register P3 (P3=P2/P1). If the value in +** register P1 is zero, then the result is NULL. If either input is +** NULL, the result is NULL. +*/ +/* Opcode: Remainder P1 P2 P3 * * +** Synopsis: r[P3]=r[P2]%r[P1] +** +** Compute the remainder after integer register P2 is divided by +** register P1 and store the result in register P3. +** If the value in register P1 is zero the result is NULL. +** If either operand is NULL, the result is NULL. +*/ +case OP_Add: /* same as TK_PLUS, in1, in2, out3 */ +case OP_Subtract: /* same as TK_MINUS, in1, in2, out3 */ +case OP_Multiply: /* same as TK_STAR, in1, in2, out3 */ +case OP_Divide: /* same as TK_SLASH, in1, in2, out3 */ +case OP_Remainder: { /* same as TK_REM, in1, in2, out3 */ + char bIntint; /* Started out as two integer operands */ + u16 flags; /* Combined MEM_* flags from both inputs */ + u16 type1; /* Numeric type of left operand */ + u16 type2; /* Numeric type of right operand */ + i64 iA; /* Integer value of left operand */ + i64 iB; /* Integer value of right operand */ + double rA; /* Real value of left operand */ + double rB; /* Real value of right operand */ + + pIn1 = &aMem[pOp->p1]; + type1 = numericType(pIn1); + pIn2 = &aMem[pOp->p2]; + type2 = numericType(pIn2); + pOut = &aMem[pOp->p3]; + flags = pIn1->flags | pIn2->flags; + if( (flags & MEM_Null)!=0 ) goto arithmetic_result_is_null; + if( (type1 & type2 & MEM_Int)!=0 ){ + iA = pIn1->u.i; + iB = pIn2->u.i; + bIntint = 1; + switch( pOp->opcode ){ + case OP_Add: if( sqlite3AddInt64(&iB,iA) ) goto fp_math; break; + case OP_Subtract: if( sqlite3SubInt64(&iB,iA) ) goto fp_math; break; + case OP_Multiply: if( sqlite3MulInt64(&iB,iA) ) goto fp_math; break; + case OP_Divide: { + if( iA==0 ) goto arithmetic_result_is_null; + if( iA==-1 && iB==SMALLEST_INT64 ) goto fp_math; + iB /= iA; + break; + } + default: { + if( iA==0 ) goto arithmetic_result_is_null; + if( iA==-1 ) iA = 1; + iB %= iA; + break; + } + } + pOut->u.i = iB; + MemSetTypeFlag(pOut, MEM_Int); + }else{ + bIntint = 0; +fp_math: + rA = sqlite3VdbeRealValue(pIn1); + rB = sqlite3VdbeRealValue(pIn2); + switch( pOp->opcode ){ + case OP_Add: rB += rA; break; + case OP_Subtract: rB -= rA; break; + case OP_Multiply: rB *= rA; break; + case OP_Divide: { + /* (double)0 In case of SQLITE_OMIT_FLOATING_POINT... */ + if( rA==(double)0 ) goto arithmetic_result_is_null; + rB /= rA; + break; + } + default: { + iA = (i64)rA; + iB = (i64)rB; + if( iA==0 ) goto arithmetic_result_is_null; + if( iA==-1 ) iA = 1; + rB = (double)(iB % iA); + break; + } + } +#ifdef SQLITE_OMIT_FLOATING_POINT + pOut->u.i = rB; + MemSetTypeFlag(pOut, MEM_Int); +#else + if( sqlite3IsNaN(rB) ){ + goto arithmetic_result_is_null; + } + pOut->u.r = rB; + MemSetTypeFlag(pOut, MEM_Real); + if( ((type1|type2)&MEM_Real)==0 && !bIntint ){ + sqlite3VdbeIntegerAffinity(pOut); + } +#endif + } + break; + +arithmetic_result_is_null: + sqlite3VdbeMemSetNull(pOut); + break; +} + +/* Opcode: CollSeq P1 * * P4 +** +** P4 is a pointer to a CollSeq struct. If the next call to a user function +** or aggregate calls sqlite3GetFuncCollSeq(), this collation sequence will +** be returned. This is used by the built-in min(), max() and nullif() +** functions. +** +** If P1 is not zero, then it is a register that a subsequent min() or +** max() aggregate will set to 1 if the current row is not the minimum or +** maximum. The P1 register is initialized to 0 by this instruction. +** +** The interface used by the implementation of the aforementioned functions +** to retrieve the collation sequence set by this opcode is not available +** publicly. Only built-in functions have access to this feature. +*/ +case OP_CollSeq: { + assert( pOp->p4type==P4_COLLSEQ ); + if( pOp->p1 ){ + sqlite3VdbeMemSetInt64(&aMem[pOp->p1], 0); + } + break; +} + +/* Opcode: Function0 P1 P2 P3 P4 P5 +** Synopsis: r[P3]=func(r[P2@P5]) +** +** Invoke a user function (P4 is a pointer to a FuncDef object that +** defines the function) with P5 arguments taken from register P2 and +** successors. The result of the function is stored in register P3. +** Register P3 must not be one of the function inputs. +** +** P1 is a 32-bit bitmask indicating whether or not each argument to the +** function was determined to be constant at compile time. If the first +** argument was constant then bit 0 of P1 is set. This is used to determine +** whether meta data associated with a user function argument using the +** sqlite3_set_auxdata() API may be safely retained until the next +** invocation of this opcode. +** +** See also: Function, AggStep, AggFinal +*/ +/* Opcode: Function P1 P2 P3 P4 P5 +** Synopsis: r[P3]=func(r[P2@P5]) +** +** Invoke a user function (P4 is a pointer to an sqlite3_context object that +** contains a pointer to the function to be run) with P5 arguments taken +** from register P2 and successors. The result of the function is stored +** in register P3. Register P3 must not be one of the function inputs. +** +** P1 is a 32-bit bitmask indicating whether or not each argument to the +** function was determined to be constant at compile time. If the first +** argument was constant then bit 0 of P1 is set. This is used to determine +** whether meta data associated with a user function argument using the +** sqlite3_set_auxdata() API may be safely retained until the next +** invocation of this opcode. +** +** SQL functions are initially coded as OP_Function0 with P4 pointing +** to a FuncDef object. But on first evaluation, the P4 operand is +** automatically converted into an sqlite3_context object and the operation +** changed to this OP_Function opcode. In this way, the initialization of +** the sqlite3_context object occurs only once, rather than once for each +** evaluation of the function. +** +** See also: Function0, AggStep, AggFinal +*/ +case OP_Function0: { + int n; + sqlite3_context *pCtx; + + assert( pOp->p4type==P4_FUNCDEF ); + n = pOp->p5; + assert( pOp->p3>0 && pOp->p3<=(p->nMem+1 - p->nCursor) ); + assert( n==0 || (pOp->p2>0 && pOp->p2+n<=(p->nMem+1 - p->nCursor)+1) ); + assert( pOp->p3p2 || pOp->p3>=pOp->p2+n ); + pCtx = sqlite3DbMallocRawNN(db, sizeof(*pCtx) + (n-1)*sizeof(sqlite3_value*)); + if( pCtx==0 ) goto no_mem; + pCtx->pOut = 0; + pCtx->pFunc = pOp->p4.pFunc; + pCtx->iOp = (int)(pOp - aOp); + pCtx->pVdbe = p; + pCtx->argc = n; + pOp->p4type = P4_FUNCCTX; + pOp->p4.pCtx = pCtx; + pOp->opcode = OP_Function; + /* Fall through into OP_Function */ +} +case OP_Function: { + int i; + sqlite3_context *pCtx; + + assert( pOp->p4type==P4_FUNCCTX ); + pCtx = pOp->p4.pCtx; + + /* If this function is inside of a trigger, the register array in aMem[] + ** might change from one evaluation to the next. The next block of code + ** checks to see if the register array has changed, and if so it + ** reinitializes the relavant parts of the sqlite3_context object */ + pOut = &aMem[pOp->p3]; + if( pCtx->pOut != pOut ){ + pCtx->pOut = pOut; + for(i=pCtx->argc-1; i>=0; i--) pCtx->argv[i] = &aMem[pOp->p2+i]; + } + + memAboutToChange(p, pCtx->pOut); +#ifdef SQLITE_DEBUG + for(i=0; iargc; i++){ + assert( memIsValid(pCtx->argv[i]) ); + REGISTER_TRACE(pOp->p2+i, pCtx->argv[i]); + } +#endif + MemSetTypeFlag(pCtx->pOut, MEM_Null); + pCtx->fErrorOrAux = 0; + db->lastRowid = lastRowid; + (*pCtx->pFunc->xSFunc)(pCtx, pCtx->argc, pCtx->argv);/* IMP: R-24505-23230 */ + lastRowid = db->lastRowid; /* Remember rowid changes made by xSFunc */ + + /* If the function returned an error, throw an exception */ + if( pCtx->fErrorOrAux ){ + if( pCtx->isError ){ + sqlite3VdbeError(p, "%s", sqlite3_value_text(pCtx->pOut)); + rc = pCtx->isError; + } + sqlite3VdbeDeleteAuxData(db, &p->pAuxData, pCtx->iOp, pOp->p1); + if( rc ) goto abort_due_to_error; + } + + /* Copy the result of the function into register P3 */ + if( pOut->flags & (MEM_Str|MEM_Blob) ){ + sqlite3VdbeChangeEncoding(pCtx->pOut, encoding); + if( sqlite3VdbeMemTooBig(pCtx->pOut) ) goto too_big; + } + + REGISTER_TRACE(pOp->p3, pCtx->pOut); + UPDATE_MAX_BLOBSIZE(pCtx->pOut); + break; +} + +/* Opcode: BitAnd P1 P2 P3 * * +** Synopsis: r[P3]=r[P1]&r[P2] +** +** Take the bit-wise AND of the values in register P1 and P2 and +** store the result in register P3. +** If either input is NULL, the result is NULL. +*/ +/* Opcode: BitOr P1 P2 P3 * * +** Synopsis: r[P3]=r[P1]|r[P2] +** +** Take the bit-wise OR of the values in register P1 and P2 and +** store the result in register P3. +** If either input is NULL, the result is NULL. +*/ +/* Opcode: ShiftLeft P1 P2 P3 * * +** Synopsis: r[P3]=r[P2]<>r[P1] +** +** Shift the integer value in register P2 to the right by the +** number of bits specified by the integer in register P1. +** Store the result in register P3. +** If either input is NULL, the result is NULL. +*/ +case OP_BitAnd: /* same as TK_BITAND, in1, in2, out3 */ +case OP_BitOr: /* same as TK_BITOR, in1, in2, out3 */ +case OP_ShiftLeft: /* same as TK_LSHIFT, in1, in2, out3 */ +case OP_ShiftRight: { /* same as TK_RSHIFT, in1, in2, out3 */ + i64 iA; + u64 uA; + i64 iB; + u8 op; + + pIn1 = &aMem[pOp->p1]; + pIn2 = &aMem[pOp->p2]; + pOut = &aMem[pOp->p3]; + if( (pIn1->flags | pIn2->flags) & MEM_Null ){ + sqlite3VdbeMemSetNull(pOut); + break; + } + iA = sqlite3VdbeIntValue(pIn2); + iB = sqlite3VdbeIntValue(pIn1); + op = pOp->opcode; + if( op==OP_BitAnd ){ + iA &= iB; + }else if( op==OP_BitOr ){ + iA |= iB; + }else if( iB!=0 ){ + assert( op==OP_ShiftRight || op==OP_ShiftLeft ); + + /* If shifting by a negative amount, shift in the other direction */ + if( iB<0 ){ + assert( OP_ShiftRight==OP_ShiftLeft+1 ); + op = 2*OP_ShiftLeft + 1 - op; + iB = iB>(-64) ? -iB : 64; + } + + if( iB>=64 ){ + iA = (iA>=0 || op==OP_ShiftLeft) ? 0 : -1; + }else{ + memcpy(&uA, &iA, sizeof(uA)); + if( op==OP_ShiftLeft ){ + uA <<= iB; + }else{ + uA >>= iB; + /* Sign-extend on a right shift of a negative number */ + if( iA<0 ) uA |= ((((u64)0xffffffff)<<32)|0xffffffff) << (64-iB); + } + memcpy(&iA, &uA, sizeof(iA)); + } + } + pOut->u.i = iA; + MemSetTypeFlag(pOut, MEM_Int); + break; +} + +/* Opcode: AddImm P1 P2 * * * +** Synopsis: r[P1]=r[P1]+P2 +** +** Add the constant P2 to the value in register P1. +** The result is always an integer. +** +** To force any register to be an integer, just add 0. +*/ +case OP_AddImm: { /* in1 */ + pIn1 = &aMem[pOp->p1]; + memAboutToChange(p, pIn1); + sqlite3VdbeMemIntegerify(pIn1); + pIn1->u.i += pOp->p2; + break; +} + +/* Opcode: MustBeInt P1 P2 * * * +** +** Force the value in register P1 to be an integer. If the value +** in P1 is not an integer and cannot be converted into an integer +** without data loss, then jump immediately to P2, or if P2==0 +** raise an SQLITE_MISMATCH exception. +*/ +case OP_MustBeInt: { /* jump, in1 */ + pIn1 = &aMem[pOp->p1]; + if( (pIn1->flags & MEM_Int)==0 ){ + applyAffinity(pIn1, SQLITE_AFF_NUMERIC, encoding); + VdbeBranchTaken((pIn1->flags&MEM_Int)==0, 2); + if( (pIn1->flags & MEM_Int)==0 ){ + if( pOp->p2==0 ){ + rc = SQLITE_MISMATCH; + goto abort_due_to_error; + }else{ + goto jump_to_p2; + } + } + } + MemSetTypeFlag(pIn1, MEM_Int); + break; +} + +#ifndef SQLITE_OMIT_FLOATING_POINT +/* Opcode: RealAffinity P1 * * * * +** +** If register P1 holds an integer convert it to a real value. +** +** This opcode is used when extracting information from a column that +** has REAL affinity. Such column values may still be stored as +** integers, for space efficiency, but after extraction we want them +** to have only a real value. +*/ +case OP_RealAffinity: { /* in1 */ + pIn1 = &aMem[pOp->p1]; + if( pIn1->flags & MEM_Int ){ + sqlite3VdbeMemRealify(pIn1); + } + break; +} +#endif + +#ifndef SQLITE_OMIT_CAST +/* Opcode: Cast P1 P2 * * * +** Synopsis: affinity(r[P1]) +** +** Force the value in register P1 to be the type defined by P2. +** +**
        +**
      • TEXT +**
      • BLOB +**
      • NUMERIC +**
      • INTEGER +**
      • REAL +**
      +** +** A NULL value is not changed by this routine. It remains NULL. +*/ +case OP_Cast: { /* in1 */ + assert( pOp->p2>=SQLITE_AFF_BLOB && pOp->p2<=SQLITE_AFF_REAL ); + testcase( pOp->p2==SQLITE_AFF_TEXT ); + testcase( pOp->p2==SQLITE_AFF_BLOB ); + testcase( pOp->p2==SQLITE_AFF_NUMERIC ); + testcase( pOp->p2==SQLITE_AFF_INTEGER ); + testcase( pOp->p2==SQLITE_AFF_REAL ); + pIn1 = &aMem[pOp->p1]; + memAboutToChange(p, pIn1); + rc = ExpandBlob(pIn1); + sqlite3VdbeMemCast(pIn1, pOp->p2, encoding); + UPDATE_MAX_BLOBSIZE(pIn1); + if( rc ) goto abort_due_to_error; + break; +} +#endif /* SQLITE_OMIT_CAST */ + +/* Opcode: Eq P1 P2 P3 P4 P5 +** Synopsis: IF r[P3]==r[P1] +** +** Compare the values in register P1 and P3. If reg(P3)==reg(P1) then +** jump to address P2. Or if the SQLITE_STOREP2 flag is set in P5, then +** store the result of comparison in register P2. +** +** The SQLITE_AFF_MASK portion of P5 must be an affinity character - +** SQLITE_AFF_TEXT, SQLITE_AFF_INTEGER, and so forth. An attempt is made +** to coerce both inputs according to this affinity before the +** comparison is made. If the SQLITE_AFF_MASK is 0x00, then numeric +** affinity is used. Note that the affinity conversions are stored +** back into the input registers P1 and P3. So this opcode can cause +** persistent changes to registers P1 and P3. +** +** Once any conversions have taken place, and neither value is NULL, +** the values are compared. If both values are blobs then memcmp() is +** used to determine the results of the comparison. If both values +** are text, then the appropriate collating function specified in +** P4 is used to do the comparison. If P4 is not specified then +** memcmp() is used to compare text string. If both values are +** numeric, then a numeric comparison is used. If the two values +** are of different types, then numbers are considered less than +** strings and strings are considered less than blobs. +** +** If SQLITE_NULLEQ is set in P5 then the result of comparison is always either +** true or false and is never NULL. If both operands are NULL then the result +** of comparison is true. If either operand is NULL then the result is false. +** If neither operand is NULL the result is the same as it would be if +** the SQLITE_NULLEQ flag were omitted from P5. +** +** If both SQLITE_STOREP2 and SQLITE_KEEPNULL flags are set then the +** content of r[P2] is only changed if the new value is NULL or 0 (false). +** In other words, a prior r[P2] value will not be overwritten by 1 (true). +*/ +/* Opcode: Ne P1 P2 P3 P4 P5 +** Synopsis: IF r[P3]!=r[P1] +** +** This works just like the Eq opcode except that the jump is taken if +** the operands in registers P1 and P3 are not equal. See the Eq opcode for +** additional information. +** +** If both SQLITE_STOREP2 and SQLITE_KEEPNULL flags are set then the +** content of r[P2] is only changed if the new value is NULL or 1 (true). +** In other words, a prior r[P2] value will not be overwritten by 0 (false). +*/ +/* Opcode: Lt P1 P2 P3 P4 P5 +** Synopsis: IF r[P3]r[P1] +** +** This works just like the Lt opcode except that the jump is taken if +** the content of register P3 is greater than the content of +** register P1. See the Lt opcode for additional information. +*/ +/* Opcode: Ge P1 P2 P3 P4 P5 +** Synopsis: IF r[P3]>=r[P1] +** +** This works just like the Lt opcode except that the jump is taken if +** the content of register P3 is greater than or equal to the content of +** register P1. See the Lt opcode for additional information. +*/ +case OP_Eq: /* same as TK_EQ, jump, in1, in3 */ +case OP_Ne: /* same as TK_NE, jump, in1, in3 */ +case OP_Lt: /* same as TK_LT, jump, in1, in3 */ +case OP_Le: /* same as TK_LE, jump, in1, in3 */ +case OP_Gt: /* same as TK_GT, jump, in1, in3 */ +case OP_Ge: { /* same as TK_GE, jump, in1, in3 */ + int res, res2; /* Result of the comparison of pIn1 against pIn3 */ + char affinity; /* Affinity to use for comparison */ + u16 flags1; /* Copy of initial value of pIn1->flags */ + u16 flags3; /* Copy of initial value of pIn3->flags */ + + pIn1 = &aMem[pOp->p1]; + pIn3 = &aMem[pOp->p3]; + flags1 = pIn1->flags; + flags3 = pIn3->flags; + if( (flags1 | flags3)&MEM_Null ){ + /* One or both operands are NULL */ + if( pOp->p5 & SQLITE_NULLEQ ){ + /* If SQLITE_NULLEQ is set (which will only happen if the operator is + ** OP_Eq or OP_Ne) then take the jump or not depending on whether + ** or not both operands are null. + */ + assert( pOp->opcode==OP_Eq || pOp->opcode==OP_Ne ); + assert( (flags1 & MEM_Cleared)==0 ); + assert( (pOp->p5 & SQLITE_JUMPIFNULL)==0 ); + if( (flags1&MEM_Null)!=0 + && (flags3&MEM_Null)!=0 + && (flags3&MEM_Cleared)==0 + ){ + res = 0; /* Operands are equal */ + }else{ + res = 1; /* Operands are not equal */ + } + }else{ + /* SQLITE_NULLEQ is clear and at least one operand is NULL, + ** then the result is always NULL. + ** The jump is taken if the SQLITE_JUMPIFNULL bit is set. + */ + if( pOp->p5 & SQLITE_STOREP2 ){ + pOut = &aMem[pOp->p2]; + iCompare = 1; /* Operands are not equal */ + memAboutToChange(p, pOut); + MemSetTypeFlag(pOut, MEM_Null); + REGISTER_TRACE(pOp->p2, pOut); + }else{ + VdbeBranchTaken(2,3); + if( pOp->p5 & SQLITE_JUMPIFNULL ){ + goto jump_to_p2; + } + } + break; + } + }else{ + /* Neither operand is NULL. Do a comparison. */ + affinity = pOp->p5 & SQLITE_AFF_MASK; + if( affinity>=SQLITE_AFF_NUMERIC ){ + if( (flags1 | flags3)&MEM_Str ){ + if( (flags1 & (MEM_Int|MEM_Real|MEM_Str))==MEM_Str ){ + applyNumericAffinity(pIn1,0); + testcase( flags3!=pIn3->flags ); /* Possible if pIn1==pIn3 */ + flags3 = pIn3->flags; + } + if( (flags3 & (MEM_Int|MEM_Real|MEM_Str))==MEM_Str ){ + applyNumericAffinity(pIn3,0); + } + } + /* Handle the common case of integer comparison here, as an + ** optimization, to avoid a call to sqlite3MemCompare() */ + if( (pIn1->flags & pIn3->flags & MEM_Int)!=0 ){ + if( pIn3->u.i > pIn1->u.i ){ res = +1; goto compare_op; } + if( pIn3->u.i < pIn1->u.i ){ res = -1; goto compare_op; } + res = 0; + goto compare_op; + } + }else if( affinity==SQLITE_AFF_TEXT ){ + if( (flags1 & MEM_Str)==0 && (flags1 & (MEM_Int|MEM_Real))!=0 ){ + testcase( pIn1->flags & MEM_Int ); + testcase( pIn1->flags & MEM_Real ); + sqlite3VdbeMemStringify(pIn1, encoding, 1); + testcase( (flags1&MEM_Dyn) != (pIn1->flags&MEM_Dyn) ); + flags1 = (pIn1->flags & ~MEM_TypeMask) | (flags1 & MEM_TypeMask); + assert( pIn1!=pIn3 ); + } + if( (flags3 & MEM_Str)==0 && (flags3 & (MEM_Int|MEM_Real))!=0 ){ + testcase( pIn3->flags & MEM_Int ); + testcase( pIn3->flags & MEM_Real ); + sqlite3VdbeMemStringify(pIn3, encoding, 1); + testcase( (flags3&MEM_Dyn) != (pIn3->flags&MEM_Dyn) ); + flags3 = (pIn3->flags & ~MEM_TypeMask) | (flags3 & MEM_TypeMask); + } + } + assert( pOp->p4type==P4_COLLSEQ || pOp->p4.pColl==0 ); + res = sqlite3MemCompare(pIn3, pIn1, pOp->p4.pColl); + } +compare_op: + switch( pOp->opcode ){ + case OP_Eq: res2 = res==0; break; + case OP_Ne: res2 = res; break; + case OP_Lt: res2 = res<0; break; + case OP_Le: res2 = res<=0; break; + case OP_Gt: res2 = res>0; break; + default: res2 = res>=0; break; + } + + /* Undo any changes made by applyAffinity() to the input registers. */ + assert( (pIn1->flags & MEM_Dyn) == (flags1 & MEM_Dyn) ); + pIn1->flags = flags1; + assert( (pIn3->flags & MEM_Dyn) == (flags3 & MEM_Dyn) ); + pIn3->flags = flags3; + + if( pOp->p5 & SQLITE_STOREP2 ){ + pOut = &aMem[pOp->p2]; + iCompare = res; + res2 = res2!=0; /* For this path res2 must be exactly 0 or 1 */ + if( (pOp->p5 & SQLITE_KEEPNULL)!=0 ){ + /* The KEEPNULL flag prevents OP_Eq from overwriting a NULL with 1 + ** and prevents OP_Ne from overwriting NULL with 0. This flag + ** is only used in contexts where either: + ** (1) op==OP_Eq && (r[P2]==NULL || r[P2]==0) + ** (2) op==OP_Ne && (r[P2]==NULL || r[P2]==1) + ** Therefore it is not necessary to check the content of r[P2] for + ** NULL. */ + assert( pOp->opcode==OP_Ne || pOp->opcode==OP_Eq ); + assert( res2==0 || res2==1 ); + testcase( res2==0 && pOp->opcode==OP_Eq ); + testcase( res2==1 && pOp->opcode==OP_Eq ); + testcase( res2==0 && pOp->opcode==OP_Ne ); + testcase( res2==1 && pOp->opcode==OP_Ne ); + if( (pOp->opcode==OP_Eq)==res2 ) break; + } + memAboutToChange(p, pOut); + MemSetTypeFlag(pOut, MEM_Int); + pOut->u.i = res2; + REGISTER_TRACE(pOp->p2, pOut); + }else{ + VdbeBranchTaken(res!=0, (pOp->p5 & SQLITE_NULLEQ)?2:3); + if( res2 ){ + goto jump_to_p2; + } + } + break; +} + +/* Opcode: ElseNotEq * P2 * * * +** +** This opcode must immediately follow an OP_Lt or OP_Gt comparison operator. +** If result of an OP_Eq comparison on the same two operands +** would have be NULL or false (0), then then jump to P2. +** If the result of an OP_Eq comparison on the two previous operands +** would have been true (1), then fall through. +*/ +case OP_ElseNotEq: { /* same as TK_ESCAPE, jump */ + assert( pOp>aOp ); + assert( pOp[-1].opcode==OP_Lt || pOp[-1].opcode==OP_Gt ); + assert( pOp[-1].p5 & SQLITE_STOREP2 ); + VdbeBranchTaken(iCompare!=0, 2); + if( iCompare!=0 ) goto jump_to_p2; + break; +} + + +/* Opcode: Permutation * * * P4 * +** +** Set the permutation used by the OP_Compare operator to be the array +** of integers in P4. +** +** The permutation is only valid until the next OP_Compare that has +** the OPFLAG_PERMUTE bit set in P5. Typically the OP_Permutation should +** occur immediately prior to the OP_Compare. +** +** The first integer in the P4 integer array is the length of the array +** and does not become part of the permutation. +*/ +case OP_Permutation: { + assert( pOp->p4type==P4_INTARRAY ); + assert( pOp->p4.ai ); + aPermute = pOp->p4.ai + 1; + break; +} + +/* Opcode: Compare P1 P2 P3 P4 P5 +** Synopsis: r[P1@P3] <-> r[P2@P3] +** +** Compare two vectors of registers in reg(P1)..reg(P1+P3-1) (call this +** vector "A") and in reg(P2)..reg(P2+P3-1) ("B"). Save the result of +** the comparison for use by the next OP_Jump instruct. +** +** If P5 has the OPFLAG_PERMUTE bit set, then the order of comparison is +** determined by the most recent OP_Permutation operator. If the +** OPFLAG_PERMUTE bit is clear, then register are compared in sequential +** order. +** +** P4 is a KeyInfo structure that defines collating sequences and sort +** orders for the comparison. The permutation applies to registers +** only. The KeyInfo elements are used sequentially. +** +** The comparison is a sort comparison, so NULLs compare equal, +** NULLs are less than numbers, numbers are less than strings, +** and strings are less than blobs. +*/ +case OP_Compare: { + int n; + int i; + int p1; + int p2; + const KeyInfo *pKeyInfo; + int idx; + CollSeq *pColl; /* Collating sequence to use on this term */ + int bRev; /* True for DESCENDING sort order */ + + if( (pOp->p5 & OPFLAG_PERMUTE)==0 ) aPermute = 0; + n = pOp->p3; + pKeyInfo = pOp->p4.pKeyInfo; + assert( n>0 ); + assert( pKeyInfo!=0 ); + p1 = pOp->p1; + p2 = pOp->p2; +#if SQLITE_DEBUG + if( aPermute ){ + int k, mx = 0; + for(k=0; kmx ) mx = aPermute[k]; + assert( p1>0 && p1+mx<=(p->nMem+1 - p->nCursor)+1 ); + assert( p2>0 && p2+mx<=(p->nMem+1 - p->nCursor)+1 ); + }else{ + assert( p1>0 && p1+n<=(p->nMem+1 - p->nCursor)+1 ); + assert( p2>0 && p2+n<=(p->nMem+1 - p->nCursor)+1 ); + } +#endif /* SQLITE_DEBUG */ + for(i=0; inField ); + pColl = pKeyInfo->aColl[i]; + bRev = pKeyInfo->aSortOrder[i]; + iCompare = sqlite3MemCompare(&aMem[p1+idx], &aMem[p2+idx], pColl); + if( iCompare ){ + if( bRev ) iCompare = -iCompare; + break; + } + } + aPermute = 0; + break; +} + +/* Opcode: Jump P1 P2 P3 * * +** +** Jump to the instruction at address P1, P2, or P3 depending on whether +** in the most recent OP_Compare instruction the P1 vector was less than +** equal to, or greater than the P2 vector, respectively. +*/ +case OP_Jump: { /* jump */ + if( iCompare<0 ){ + VdbeBranchTaken(0,3); pOp = &aOp[pOp->p1 - 1]; + }else if( iCompare==0 ){ + VdbeBranchTaken(1,3); pOp = &aOp[pOp->p2 - 1]; + }else{ + VdbeBranchTaken(2,3); pOp = &aOp[pOp->p3 - 1]; + } + break; +} + +/* Opcode: And P1 P2 P3 * * +** Synopsis: r[P3]=(r[P1] && r[P2]) +** +** Take the logical AND of the values in registers P1 and P2 and +** write the result into register P3. +** +** If either P1 or P2 is 0 (false) then the result is 0 even if +** the other input is NULL. A NULL and true or two NULLs give +** a NULL output. +*/ +/* Opcode: Or P1 P2 P3 * * +** Synopsis: r[P3]=(r[P1] || r[P2]) +** +** Take the logical OR of the values in register P1 and P2 and +** store the answer in register P3. +** +** If either P1 or P2 is nonzero (true) then the result is 1 (true) +** even if the other input is NULL. A NULL and false or two NULLs +** give a NULL output. +*/ +case OP_And: /* same as TK_AND, in1, in2, out3 */ +case OP_Or: { /* same as TK_OR, in1, in2, out3 */ + int v1; /* Left operand: 0==FALSE, 1==TRUE, 2==UNKNOWN or NULL */ + int v2; /* Right operand: 0==FALSE, 1==TRUE, 2==UNKNOWN or NULL */ + + pIn1 = &aMem[pOp->p1]; + if( pIn1->flags & MEM_Null ){ + v1 = 2; + }else{ + v1 = sqlite3VdbeIntValue(pIn1)!=0; + } + pIn2 = &aMem[pOp->p2]; + if( pIn2->flags & MEM_Null ){ + v2 = 2; + }else{ + v2 = sqlite3VdbeIntValue(pIn2)!=0; + } + if( pOp->opcode==OP_And ){ + static const unsigned char and_logic[] = { 0, 0, 0, 0, 1, 2, 0, 2, 2 }; + v1 = and_logic[v1*3+v2]; + }else{ + static const unsigned char or_logic[] = { 0, 1, 2, 1, 1, 1, 2, 1, 2 }; + v1 = or_logic[v1*3+v2]; + } + pOut = &aMem[pOp->p3]; + if( v1==2 ){ + MemSetTypeFlag(pOut, MEM_Null); + }else{ + pOut->u.i = v1; + MemSetTypeFlag(pOut, MEM_Int); + } + break; +} + +/* Opcode: Not P1 P2 * * * +** Synopsis: r[P2]= !r[P1] +** +** Interpret the value in register P1 as a boolean value. Store the +** 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, out2 */ + pIn1 = &aMem[pOp->p1]; + pOut = &aMem[pOp->p2]; + sqlite3VdbeMemSetNull(pOut); + if( (pIn1->flags & MEM_Null)==0 ){ + pOut->flags = MEM_Int; + pOut->u.i = !sqlite3VdbeIntValue(pIn1); + } + break; +} + +/* Opcode: BitNot P1 P2 * * * +** Synopsis: r[P1]= ~r[P1] +** +** Interpret the content of register P1 as an integer. Store the +** 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, out2 */ + pIn1 = &aMem[pOp->p1]; + pOut = &aMem[pOp->p2]; + sqlite3VdbeMemSetNull(pOut); + if( (pIn1->flags & MEM_Null)==0 ){ + pOut->flags = MEM_Int; + pOut->u.i = ~sqlite3VdbeIntValue(pIn1); + } + break; +} + +/* Opcode: Once P1 P2 * * * +** +** If the P1 value is equal to the P1 value on the OP_Init opcode at +** instruction 0, then jump to P2. If the two P1 values differ, then +** set the P1 value on this opcode to equal the P1 value on the OP_Init +** and fall through. +*/ +case OP_Once: { /* jump */ + assert( p->aOp[0].opcode==OP_Init ); + VdbeBranchTaken(p->aOp[0].p1==pOp->p1, 2); + if( p->aOp[0].p1==pOp->p1 ){ + goto jump_to_p2; + }else{ + pOp->p1 = p->aOp[0].p1; + } + break; +} + +/* Opcode: If P1 P2 P3 * * +** +** Jump to P2 if the value in register P1 is true. The value +** is considered true if it is numeric and non-zero. If the value +** in P1 is NULL then take the jump if and only if P3 is non-zero. +*/ +/* Opcode: IfNot P1 P2 P3 * * +** +** Jump to P2 if the value in register P1 is False. The value +** is considered false if it has a numeric value of zero. If the value +** in P1 is NULL then take the jump if and only if P3 is non-zero. +*/ +case OP_If: /* jump, in1 */ +case OP_IfNot: { /* jump, in1 */ + int c; + pIn1 = &aMem[pOp->p1]; + if( pIn1->flags & MEM_Null ){ + c = pOp->p3; + }else{ +#ifdef SQLITE_OMIT_FLOATING_POINT + c = sqlite3VdbeIntValue(pIn1)!=0; +#else + c = sqlite3VdbeRealValue(pIn1)!=0.0; +#endif + if( pOp->opcode==OP_IfNot ) c = !c; + } + VdbeBranchTaken(c!=0, 2); + if( c ){ + goto jump_to_p2; + } + break; +} + +/* Opcode: IsNull P1 P2 * * * +** Synopsis: if r[P1]==NULL goto P2 +** +** Jump to P2 if the value in register P1 is NULL. +*/ +case OP_IsNull: { /* same as TK_ISNULL, jump, in1 */ + pIn1 = &aMem[pOp->p1]; + VdbeBranchTaken( (pIn1->flags & MEM_Null)!=0, 2); + if( (pIn1->flags & MEM_Null)!=0 ){ + goto jump_to_p2; + } + break; +} + +/* Opcode: NotNull P1 P2 * * * +** Synopsis: if r[P1]!=NULL goto P2 +** +** 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]; + VdbeBranchTaken( (pIn1->flags & MEM_Null)==0, 2); + if( (pIn1->flags & MEM_Null)==0 ){ + goto jump_to_p2; + } + break; +} + +/* Opcode: Column P1 P2 P3 P4 P5 +** Synopsis: r[P3]=PX +** +** Interpret the data that cursor P1 points to as a structure built using +** the MakeRecord instruction. (See the MakeRecord opcode for additional +** information about the format of the data.) Extract the P2-th column +** from this record. If there are less that (P2+1) +** values in the record, extract a NULL. +** +** The value extracted is stored in register P3. +** +** If the column contains fewer than P2 fields, then extract a NULL. Or, +** if the P4 argument is a P4_MEM use the value of the P4 argument as +** the result. +** +** If the OPFLAG_CLEARCACHE bit is set on P5 and P1 is a pseudo-table cursor, +** then the cache of the cursor is reset prior to extracting the column. +** The first OP_Column against a pseudo-table after the value of the content +** register has changed should have this bit set. +** +** If the OPFLAG_LENGTHARG and OPFLAG_TYPEOFARG bits are set on P5 when +** the result is guaranteed to only be used as the argument of a length() +** or typeof() function, respectively. The loading of large blobs can be +** skipped for length() and all content loading can be skipped for typeof(). +*/ +case OP_Column: { + int p2; /* column number to retrieve */ + VdbeCursor *pC; /* The VDBE cursor */ + BtCursor *pCrsr; /* The BTree cursor */ + u32 *aOffset; /* aOffset[i] is offset to start of data for i-th column */ + int len; /* The length of the serialized data for the column */ + int i; /* Loop counter */ + Mem *pDest; /* Where to write the extracted value */ + Mem sMem; /* For storing the record being decoded */ + const u8 *zData; /* Part of the record being decoded */ + const u8 *zHdr; /* Next unparsed byte of the header */ + const u8 *zEndHdr; /* Pointer to first byte after the header */ + u32 offset; /* Offset into the data */ + u64 offset64; /* 64-bit offset */ + u32 avail; /* Number of bytes of available data */ + u32 t; /* A type code from the record header */ + Mem *pReg; /* PseudoTable input register */ + + pC = p->apCsr[pOp->p1]; + p2 = pOp->p2; + + /* If the cursor cache is stale, bring it up-to-date */ + rc = sqlite3VdbeCursorMoveto(&pC, &p2); + if( rc ) goto abort_due_to_error; + + assert( pOp->p3>0 && pOp->p3<=(p->nMem+1 - p->nCursor) ); + pDest = &aMem[pOp->p3]; + memAboutToChange(p, pDest); + assert( pOp->p1>=0 && pOp->p1nCursor ); + assert( pC!=0 ); + assert( p2nField ); + aOffset = pC->aOffset; + assert( pC->eCurType!=CURTYPE_VTAB ); + assert( pC->eCurType!=CURTYPE_PSEUDO || pC->nullRow ); + assert( pC->eCurType!=CURTYPE_SORTER ); + pCrsr = pC->uc.pCursor; + + if( pC->cacheStatus!=p->cacheCtr ){ /*OPTIMIZATION-IF-FALSE*/ + if( pC->nullRow ){ + if( pC->eCurType==CURTYPE_PSEUDO ){ + assert( pC->uc.pseudoTableReg>0 ); + pReg = &aMem[pC->uc.pseudoTableReg]; + assert( pReg->flags & MEM_Blob ); + assert( memIsValid(pReg) ); + pC->payloadSize = pC->szRow = avail = pReg->n; + pC->aRow = (u8*)pReg->z; + }else{ + sqlite3VdbeMemSetNull(pDest); + goto op_column_out; + } + }else{ + assert( pC->eCurType==CURTYPE_BTREE ); + assert( pCrsr ); + assert( sqlite3BtreeCursorIsValid(pCrsr) ); + pC->payloadSize = sqlite3BtreePayloadSize(pCrsr); + pC->aRow = sqlite3BtreePayloadFetch(pCrsr, &avail); + assert( avail<=65536 ); /* Maximum page size is 64KiB */ + if( pC->payloadSize <= (u32)avail ){ + pC->szRow = pC->payloadSize; + }else if( pC->payloadSize > (u32)db->aLimit[SQLITE_LIMIT_LENGTH] ){ + goto too_big; + }else{ + pC->szRow = avail; + } + } + pC->cacheStatus = p->cacheCtr; + pC->iHdrOffset = getVarint32(pC->aRow, offset); + pC->nHdrParsed = 0; + aOffset[0] = offset; + + + if( availaRow does not have to hold the entire row, but it does at least + ** need to cover the header of the record. If pC->aRow does not contain + ** the complete header, then set it to zero, forcing the header to be + ** dynamically allocated. */ + pC->aRow = 0; + pC->szRow = 0; + + /* Make sure a corrupt database has not given us an oversize header. + ** Do this now to avoid an oversize memory allocation. + ** + ** Type entries can be between 1 and 5 bytes each. But 4 and 5 byte + ** types use so much data space that there can only be 4096 and 32 of + ** them, respectively. So the maximum header length results from a + ** 3-byte type for each of the maximum of 32768 columns plus three + ** extra bytes for the header length itself. 32768*3 + 3 = 98307. + */ + if( offset > 98307 || offset > pC->payloadSize ){ + rc = SQLITE_CORRUPT_BKPT; + goto abort_due_to_error; + } + }else if( offset>0 ){ /*OPTIMIZATION-IF-TRUE*/ + /* The following goto is an optimization. It can be omitted and + ** everything will still work. But OP_Column is measurably faster + ** by skipping the subsequent conditional, which is always true. + */ + zData = pC->aRow; + assert( pC->nHdrParsed<=p2 ); /* Conditional skipped */ + goto op_column_read_header; + } + } + + /* Make sure at least the first p2+1 entries of the header have been + ** parsed and valid information is in aOffset[] and pC->aType[]. + */ + if( pC->nHdrParsed<=p2 ){ + /* If there is more header available for parsing in the record, try + ** to extract additional fields up through the p2+1-th field + */ + if( pC->iHdrOffsetaRow==0 ){ + memset(&sMem, 0, sizeof(sMem)); + rc = sqlite3VdbeMemFromBtree(pCrsr, 0, aOffset[0], !pC->isTable, &sMem); + if( rc!=SQLITE_OK ) goto abort_due_to_error; + zData = (u8*)sMem.z; + }else{ + zData = pC->aRow; + } + + /* Fill in pC->aType[i] and aOffset[i] values through the p2-th field. */ + op_column_read_header: + i = pC->nHdrParsed; + offset64 = aOffset[i]; + zHdr = zData + pC->iHdrOffset; + zEndHdr = zData + aOffset[0]; + do{ + if( (t = zHdr[0])<0x80 ){ + zHdr++; + offset64 += sqlite3VdbeOneByteSerialTypeLen(t); + }else{ + zHdr += sqlite3GetVarint32(zHdr, &t); + offset64 += sqlite3VdbeSerialTypeLen(t); + } + pC->aType[i++] = t; + aOffset[i] = (u32)(offset64 & 0xffffffff); + }while( i<=p2 && zHdr=zEndHdr && (zHdr>zEndHdr || offset64!=pC->payloadSize)) + || (offset64 > pC->payloadSize) + ){ + if( pC->aRow==0 ) sqlite3VdbeMemRelease(&sMem); + rc = SQLITE_CORRUPT_BKPT; + goto abort_due_to_error; + } + + pC->nHdrParsed = i; + pC->iHdrOffset = (u32)(zHdr - zData); + if( pC->aRow==0 ) sqlite3VdbeMemRelease(&sMem); + }else{ + t = 0; + } + + /* If after trying to extract new entries from the header, nHdrParsed is + ** still not up to p2, that means that the record has fewer than p2 + ** columns. So the result will be either the default value or a NULL. + */ + if( pC->nHdrParsed<=p2 ){ + if( pOp->p4type==P4_MEM ){ + sqlite3VdbeMemShallowCopy(pDest, pOp->p4.pMem, MEM_Static); + }else{ + sqlite3VdbeMemSetNull(pDest); + } + goto op_column_out; + } + }else{ + t = pC->aType[p2]; + } + + /* Extract the content for the p2+1-th column. Control can only + ** reach this point if aOffset[p2], aOffset[p2+1], and pC->aType[p2] are + ** all valid. + */ + assert( p2nHdrParsed ); + assert( rc==SQLITE_OK ); + assert( sqlite3VdbeCheckMemInvariants(pDest) ); + if( VdbeMemDynamic(pDest) ){ + sqlite3VdbeMemSetNull(pDest); + } + assert( t==pC->aType[p2] ); + if( pC->szRow>=aOffset[p2+1] ){ + /* This is the common case where the desired content fits on the original + ** page - where the content is not on an overflow page */ + zData = pC->aRow + aOffset[p2]; + if( t<12 ){ + sqlite3VdbeSerialGet(zData, t, pDest); + }else{ + /* If the column value is a string, we need a persistent value, not + ** a MEM_Ephem value. This branch is a fast short-cut that is equivalent + ** to calling sqlite3VdbeSerialGet() and sqlite3VdbeDeephemeralize(). + */ + static const u16 aFlag[] = { MEM_Blob, MEM_Str|MEM_Term }; + pDest->n = len = (t-12)/2; + pDest->enc = encoding; + if( pDest->szMalloc < len+2 ){ + pDest->flags = MEM_Null; + if( sqlite3VdbeMemGrow(pDest, len+2, 0) ) goto no_mem; + }else{ + pDest->z = pDest->zMalloc; + } + memcpy(pDest->z, zData, len); + pDest->z[len] = 0; + pDest->z[len+1] = 0; + pDest->flags = aFlag[t&1]; + } + }else{ + pDest->enc = encoding; + /* This branch happens only when content is on overflow pages */ + if( ((pOp->p5 & (OPFLAG_LENGTHARG|OPFLAG_TYPEOFARG))!=0 + && ((t>=12 && (t&1)==0) || (pOp->p5 & OPFLAG_TYPEOFARG)!=0)) + || (len = sqlite3VdbeSerialTypeLen(t))==0 + ){ + /* Content is irrelevant for + ** 1. the typeof() function, + ** 2. the length(X) function if X is a blob, and + ** 3. if the content length is zero. + ** So we might as well use bogus content rather than reading + ** content from disk. */ + static u8 aZero[8]; /* This is the bogus content */ + sqlite3VdbeSerialGet(aZero, t, pDest); + }else{ + rc = sqlite3VdbeMemFromBtree(pCrsr, aOffset[p2], len, !pC->isTable, + pDest); + if( rc!=SQLITE_OK ) goto abort_due_to_error; + sqlite3VdbeSerialGet((const u8*)pDest->z, t, pDest); + pDest->flags &= ~MEM_Ephem; + } + } + +op_column_out: + UPDATE_MAX_BLOBSIZE(pDest); + REGISTER_TRACE(pOp->p3, pDest); + break; +} + +/* Opcode: Affinity P1 P2 * P4 * +** Synopsis: affinity(r[P1@P2]) +** +** Apply affinities to a range of P2 registers starting with P1. +** +** P4 is a string that is P2 characters long. The nth character of the +** string indicates the column affinity that should be used for the nth +** memory cell in the range. +*/ +case OP_Affinity: { + const char *zAffinity; /* The affinity to be applied */ + char cAff; /* A single character of affinity */ + + zAffinity = pOp->p4.z; + assert( zAffinity!=0 ); + assert( zAffinity[pOp->p2]==0 ); + pIn1 = &aMem[pOp->p1]; + while( (cAff = *(zAffinity++))!=0 ){ + assert( pIn1 <= &p->aMem[(p->nMem+1 - p->nCursor)] ); + assert( memIsValid(pIn1) ); + applyAffinity(pIn1, cAff, encoding); + pIn1++; + } + break; +} + +/* Opcode: MakeRecord P1 P2 P3 P4 * +** Synopsis: r[P3]=mkrec(r[P1@P2]) +** +** Convert P2 registers beginning with P1 into the [record format] +** use as a data record in a database table or as a key +** in an index. The OP_Column opcode can decode the record later. +** +** P4 may be a string that is P2 characters long. The nth character of the +** string indicates the column affinity that should be used for the nth +** field of the index key. +** +** The mapping from character to affinity is given by the SQLITE_AFF_ +** macros defined in sqliteInt.h. +** +** If P4 is NULL then all index fields have the affinity BLOB. +*/ +case OP_MakeRecord: { + u8 *zNewRecord; /* A buffer to hold the data for the new record */ + Mem *pRec; /* The new record */ + u64 nData; /* Number of bytes of data space */ + int nHdr; /* Number of bytes of header space */ + i64 nByte; /* Data space required for this record */ + i64 nZero; /* Number of zero bytes at the end of the record */ + int nVarint; /* Number of bytes in a varint */ + u32 serial_type; /* Type field */ + Mem *pData0; /* First field to be combined into the record */ + Mem *pLast; /* Last field of the record */ + int nField; /* Number of fields in the record */ + char *zAffinity; /* The affinity string for the record */ + int file_format; /* File format to use for encoding */ + int i; /* Space used in zNewRecord[] header */ + int j; /* Space used in zNewRecord[] content */ + u32 len; /* Length of a field */ + + /* Assuming the record contains N fields, the record format looks + ** like this: + ** + ** ------------------------------------------------------------------------ + ** | hdr-size | type 0 | type 1 | ... | type N-1 | data0 | ... | data N-1 | + ** ------------------------------------------------------------------------ + ** + ** Data(0) is taken from register P1. Data(1) comes from register P1+1 + ** and so forth. + ** + ** Each type field is a varint representing the serial type of the + ** corresponding data element (see sqlite3VdbeSerialType()). The + ** hdr-size field is also a varint which is the offset from the beginning + ** of the record to data0. + */ + nData = 0; /* Number of bytes of data space */ + nHdr = 0; /* Number of bytes of header space */ + nZero = 0; /* Number of zero bytes at the end of the record */ + nField = pOp->p1; + zAffinity = pOp->p4.z; + assert( nField>0 && pOp->p2>0 && pOp->p2+nField<=(p->nMem+1 - p->nCursor)+1 ); + pData0 = &aMem[nField]; + nField = pOp->p2; + pLast = &pData0[nField-1]; + file_format = p->minWriteFileFormat; + + /* Identify the output register */ + assert( pOp->p3p1 || pOp->p3>=pOp->p1+pOp->p2 ); + pOut = &aMem[pOp->p3]; + memAboutToChange(p, pOut); + + /* Apply the requested affinity to all inputs + */ + assert( pData0<=pLast ); + if( zAffinity ){ + pRec = pData0; + do{ + applyAffinity(pRec++, *(zAffinity++), encoding); + assert( zAffinity[0]==0 || pRec<=pLast ); + }while( zAffinity[0] ); + } + + /* Loop through the elements that will make up the record to figure + ** out how much space is required for the new record. + */ + pRec = pLast; + do{ + assert( memIsValid(pRec) ); + pRec->uTemp = serial_type = sqlite3VdbeSerialType(pRec, file_format, &len); + if( pRec->flags & MEM_Zero ){ + if( nData ){ + if( sqlite3VdbeMemExpandBlob(pRec) ) goto no_mem; + }else{ + nZero += pRec->u.nZero; + len -= pRec->u.nZero; + } + } + nData += len; + testcase( serial_type==127 ); + testcase( serial_type==128 ); + nHdr += serial_type<=127 ? 1 : sqlite3VarintLen(serial_type); + if( pRec==pData0 ) break; + pRec--; + }while(1); + + /* EVIDENCE-OF: R-22564-11647 The header begins with a single varint + ** which determines the total number of bytes in the header. The varint + ** value is the size of the header in bytes including the size varint + ** itself. */ + testcase( nHdr==126 ); + testcase( nHdr==127 ); + if( nHdr<=126 ){ + /* The common case */ + nHdr += 1; + }else{ + /* Rare case of a really large header */ + nVarint = sqlite3VarintLen(nHdr); + nHdr += nVarint; + if( nVarintdb->aLimit[SQLITE_LIMIT_LENGTH] ){ + goto too_big; + } + + /* Make sure the output register has a buffer large enough to store + ** the new record. The output register (pOp->p3) is not allowed to + ** be one of the input registers (because the following call to + ** sqlite3VdbeMemClearAndResize() could clobber the value before it is used). + */ + if( sqlite3VdbeMemClearAndResize(pOut, (int)nByte) ){ + goto no_mem; + } + zNewRecord = (u8 *)pOut->z; + + /* Write the record */ + i = putVarint32(zNewRecord, nHdr); + j = nHdr; + assert( pData0<=pLast ); + pRec = pData0; + do{ + serial_type = pRec->uTemp; + /* EVIDENCE-OF: R-06529-47362 Following the size varint are one or more + ** additional varints, one per column. */ + i += putVarint32(&zNewRecord[i], serial_type); /* serial type */ + /* EVIDENCE-OF: R-64536-51728 The values for each column in the record + ** immediately follow the header. */ + j += sqlite3VdbeSerialPut(&zNewRecord[j], pRec, serial_type); /* content */ + }while( (++pRec)<=pLast ); + assert( i==nHdr ); + assert( j==nByte ); + + assert( pOp->p3>0 && pOp->p3<=(p->nMem+1 - p->nCursor) ); + pOut->n = (int)nByte; + pOut->flags = MEM_Blob; + if( nZero ){ + pOut->u.nZero = nZero; + pOut->flags |= MEM_Zero; + } + pOut->enc = SQLITE_UTF8; /* In case the blob is ever converted to text */ + REGISTER_TRACE(pOp->p3, pOut); + UPDATE_MAX_BLOBSIZE(pOut); + break; +} + +/* Opcode: Count P1 P2 * * * +** Synopsis: r[P2]=count() +** +** Store the number of entries (an integer value) in the table or index +** opened by cursor P1 in register P2 +*/ +#ifndef SQLITE_OMIT_BTREECOUNT +case OP_Count: { /* out2 */ + i64 nEntry; + BtCursor *pCrsr; + + assert( p->apCsr[pOp->p1]->eCurType==CURTYPE_BTREE ); + pCrsr = p->apCsr[pOp->p1]->uc.pCursor; + assert( pCrsr ); + nEntry = 0; /* Not needed. Only used to silence a warning. */ + rc = sqlite3BtreeCount(pCrsr, &nEntry); + if( rc ) goto abort_due_to_error; + pOut = out2Prerelease(p, pOp); + pOut->u.i = nEntry; + break; +} +#endif + +/* Opcode: Savepoint P1 * * P4 * +** +** Open, release or rollback the savepoint named by parameter P4, depending +** on the value of P1. To open a new savepoint, P1==0. To release (commit) an +** existing savepoint, P1==1, or to rollback an existing savepoint P1==2. +*/ +case OP_Savepoint: { + int p1; /* Value of P1 operand */ + char *zName; /* Name of savepoint */ + int nName; + Savepoint *pNew; + Savepoint *pSavepoint; + Savepoint *pTmp; + int iSavepoint; + int ii; + + p1 = pOp->p1; + zName = pOp->p4.z; + + /* Assert that the p1 parameter is valid. Also that if there is no open + ** transaction, then there cannot be any savepoints. + */ + assert( db->pSavepoint==0 || db->autoCommit==0 ); + assert( p1==SAVEPOINT_BEGIN||p1==SAVEPOINT_RELEASE||p1==SAVEPOINT_ROLLBACK ); + assert( db->pSavepoint || db->isTransactionSavepoint==0 ); + assert( checkSavepointCount(db) ); + assert( p->bIsReader ); + + if( p1==SAVEPOINT_BEGIN ){ + if( db->nVdbeWrite>0 ){ + /* A new savepoint cannot be created if there are active write + ** statements (i.e. open read/write incremental blob handles). + */ + sqlite3VdbeError(p, "cannot open savepoint - SQL statements in progress"); + rc = SQLITE_BUSY; + }else{ + nName = sqlite3Strlen30(zName); + +#ifndef SQLITE_OMIT_VIRTUALTABLE + /* This call is Ok even if this savepoint is actually a transaction + ** savepoint (and therefore should not prompt xSavepoint()) callbacks. + ** If this is a transaction savepoint being opened, it is guaranteed + ** that the db->aVTrans[] array is empty. */ + assert( db->autoCommit==0 || db->nVTrans==0 ); + rc = sqlite3VtabSavepoint(db, SAVEPOINT_BEGIN, + db->nStatement+db->nSavepoint); + if( rc!=SQLITE_OK ) goto abort_due_to_error; +#endif + + /* Create a new savepoint structure. */ + pNew = sqlite3DbMallocRawNN(db, sizeof(Savepoint)+nName+1); + if( pNew ){ + pNew->zName = (char *)&pNew[1]; + memcpy(pNew->zName, zName, nName+1); + + /* If there is no open transaction, then mark this as a special + ** "transaction savepoint". */ + if( db->autoCommit ){ + db->autoCommit = 0; + db->isTransactionSavepoint = 1; + }else{ + db->nSavepoint++; + } + + /* Link the new savepoint into the database handle's list. */ + pNew->pNext = db->pSavepoint; + db->pSavepoint = pNew; + pNew->nDeferredCons = db->nDeferredCons; + pNew->nDeferredImmCons = db->nDeferredImmCons; + } + } + }else{ + iSavepoint = 0; + + /* Find the named savepoint. If there is no such savepoint, then an + ** an error is returned to the user. */ + for( + pSavepoint = db->pSavepoint; + pSavepoint && sqlite3StrICmp(pSavepoint->zName, zName); + pSavepoint = pSavepoint->pNext + ){ + iSavepoint++; + } + if( !pSavepoint ){ + sqlite3VdbeError(p, "no such savepoint: %s", zName); + rc = SQLITE_ERROR; + }else if( db->nVdbeWrite>0 && p1==SAVEPOINT_RELEASE ){ + /* It is not possible to release (commit) a savepoint if there are + ** active write statements. + */ + sqlite3VdbeError(p, "cannot release savepoint - " + "SQL statements in progress"); + rc = SQLITE_BUSY; + }else{ + + /* Determine whether or not this is a transaction savepoint. If so, + ** and this is a RELEASE command, then the current transaction + ** is committed. + */ + int isTransaction = pSavepoint->pNext==0 && db->isTransactionSavepoint; + if( isTransaction && p1==SAVEPOINT_RELEASE ){ + if( (rc = sqlite3VdbeCheckFk(p, 1))!=SQLITE_OK ){ + goto vdbe_return; + } + db->autoCommit = 1; + if( sqlite3VdbeHalt(p)==SQLITE_BUSY ){ + p->pc = (int)(pOp - aOp); + db->autoCommit = 0; + p->rc = rc = SQLITE_BUSY; + goto vdbe_return; + } + db->isTransactionSavepoint = 0; + rc = p->rc; + }else{ + int isSchemaChange; + iSavepoint = db->nSavepoint - iSavepoint - 1; + if( p1==SAVEPOINT_ROLLBACK ){ + isSchemaChange = (db->flags & SQLITE_InternChanges)!=0; + for(ii=0; iinDb; ii++){ + rc = sqlite3BtreeTripAllCursors(db->aDb[ii].pBt, + SQLITE_ABORT_ROLLBACK, + isSchemaChange==0); + if( rc!=SQLITE_OK ) goto abort_due_to_error; + } + }else{ + isSchemaChange = 0; + } + for(ii=0; iinDb; ii++){ + rc = sqlite3BtreeSavepoint(db->aDb[ii].pBt, p1, iSavepoint); + if( rc!=SQLITE_OK ){ + goto abort_due_to_error; + } + } + if( isSchemaChange ){ + sqlite3ExpirePreparedStatements(db); + sqlite3ResetAllSchemasOfConnection(db); + db->flags = (db->flags | SQLITE_InternChanges); + } + } + + /* Regardless of whether this is a RELEASE or ROLLBACK, destroy all + ** savepoints nested inside of the savepoint being operated on. */ + while( db->pSavepoint!=pSavepoint ){ + pTmp = db->pSavepoint; + db->pSavepoint = pTmp->pNext; + sqlite3DbFree(db, pTmp); + db->nSavepoint--; + } + + /* If it is a RELEASE, then destroy the savepoint being operated on + ** too. If it is a ROLLBACK TO, then set the number of deferred + ** constraint violations present in the database to the value stored + ** when the savepoint was created. */ + if( p1==SAVEPOINT_RELEASE ){ + assert( pSavepoint==db->pSavepoint ); + db->pSavepoint = pSavepoint->pNext; + sqlite3DbFree(db, pSavepoint); + if( !isTransaction ){ + db->nSavepoint--; + } + }else{ + db->nDeferredCons = pSavepoint->nDeferredCons; + db->nDeferredImmCons = pSavepoint->nDeferredImmCons; + } + + if( !isTransaction || p1==SAVEPOINT_ROLLBACK ){ + rc = sqlite3VtabSavepoint(db, p1, iSavepoint); + if( rc!=SQLITE_OK ) goto abort_due_to_error; + } + } + } + if( rc ) goto abort_due_to_error; + + break; +} + +/* Opcode: AutoCommit P1 P2 * * * +** +** Set the database auto-commit flag to P1 (1 or 0). If P2 is true, roll +** back any currently active btree transactions. If there are any active +** VMs (apart from this one), then a ROLLBACK fails. A COMMIT fails if +** there are active writing VMs or active VMs that use shared cache. +** +** This instruction causes the VM to halt. +*/ +case OP_AutoCommit: { + int desiredAutoCommit; + int iRollback; + + desiredAutoCommit = pOp->p1; + iRollback = pOp->p2; + assert( desiredAutoCommit==1 || desiredAutoCommit==0 ); + assert( desiredAutoCommit==1 || iRollback==0 ); + assert( db->nVdbeActive>0 ); /* At least this one VM is active */ + assert( p->bIsReader ); + + if( desiredAutoCommit!=db->autoCommit ){ + if( iRollback ){ + assert( desiredAutoCommit==1 ); + sqlite3RollbackAll(db, SQLITE_ABORT_ROLLBACK); + db->autoCommit = 1; + }else if( desiredAutoCommit && db->nVdbeWrite>0 ){ + /* If this instruction implements a COMMIT and other VMs are writing + ** return an error indicating that the other VMs must complete first. + */ + sqlite3VdbeError(p, "cannot commit transaction - " + "SQL statements in progress"); + rc = SQLITE_BUSY; + goto abort_due_to_error; + }else if( (rc = sqlite3VdbeCheckFk(p, 1))!=SQLITE_OK ){ + goto vdbe_return; + }else{ + db->autoCommit = (u8)desiredAutoCommit; + } + if( sqlite3VdbeHalt(p)==SQLITE_BUSY ){ + p->pc = (int)(pOp - aOp); + db->autoCommit = (u8)(1-desiredAutoCommit); + p->rc = rc = SQLITE_BUSY; + goto vdbe_return; + } + assert( db->nStatement==0 ); + sqlite3CloseSavepoints(db); + if( p->rc==SQLITE_OK ){ + rc = SQLITE_DONE; + }else{ + rc = SQLITE_ERROR; + } + goto vdbe_return; + }else{ + sqlite3VdbeError(p, + (!desiredAutoCommit)?"cannot start a transaction within a transaction":( + (iRollback)?"cannot rollback - no transaction is active": + "cannot commit - no transaction is active")); + + rc = SQLITE_ERROR; + goto abort_due_to_error; + } + break; +} + +/* Opcode: Transaction P1 P2 P3 P4 P5 +** +** Begin a transaction on database P1 if a transaction is not already +** active. +** If P2 is non-zero, then a write-transaction is started, or if a +** read-transaction is already active, it is upgraded to a write-transaction. +** If P2 is zero, then a read-transaction is started. +** +** P1 is the index of the database file on which the transaction is +** started. Index 0 is the main database file and index 1 is the +** file used for temporary tables. Indices of 2 or more are used for +** attached databases. +** +** If a write-transaction is started and the Vdbe.usesStmtJournal flag is +** true (this flag is set if the Vdbe may modify more than one row and may +** throw an ABORT exception), a statement transaction may also be opened. +** More specifically, a statement transaction is opened iff the database +** connection is currently not in autocommit mode, or if there are other +** active statements. A statement transaction allows the changes made by this +** VDBE to be rolled back after an error without having to roll back the +** entire transaction. If no error is encountered, the statement transaction +** will automatically commit when the VDBE halts. +** +** If P5!=0 then this opcode also checks the schema cookie against P3 +** and the schema generation counter against P4. +** The cookie changes its value whenever the database schema changes. +** This operation is used to detect when that the cookie has changed +** and that the current process needs to reread the schema. If the schema +** cookie in P3 differs from the schema cookie in the database header or +** if the schema generation counter in P4 differs from the current +** generation counter, then an SQLITE_SCHEMA error is raised and execution +** halts. The sqlite3_step() wrapper function might then reprepare the +** statement and rerun it from the beginning. +*/ +case OP_Transaction: { + Btree *pBt; + int iMeta; + int iGen; + + assert( p->bIsReader ); + assert( p->readOnly==0 || pOp->p2==0 ); + assert( pOp->p1>=0 && pOp->p1nDb ); + assert( DbMaskTest(p->btreeMask, pOp->p1) ); + if( pOp->p2 && (db->flags & SQLITE_QueryOnly)!=0 ){ + rc = SQLITE_READONLY; + goto abort_due_to_error; + } + pBt = db->aDb[pOp->p1].pBt; + + if( pBt ){ + rc = sqlite3BtreeBeginTrans(pBt, pOp->p2); + testcase( rc==SQLITE_BUSY_SNAPSHOT ); + testcase( rc==SQLITE_BUSY_RECOVERY ); + if( rc!=SQLITE_OK ){ + if( (rc&0xff)==SQLITE_BUSY ){ + p->pc = (int)(pOp - aOp); + p->rc = rc; + goto vdbe_return; + } + goto abort_due_to_error; + } + + if( pOp->p2 && p->usesStmtJournal + && (db->autoCommit==0 || db->nVdbeRead>1) + ){ + assert( sqlite3BtreeIsInTrans(pBt) ); + if( p->iStatement==0 ){ + assert( db->nStatement>=0 && db->nSavepoint>=0 ); + db->nStatement++; + p->iStatement = db->nSavepoint + db->nStatement; + } + + rc = sqlite3VtabSavepoint(db, SAVEPOINT_BEGIN, p->iStatement-1); + if( rc==SQLITE_OK ){ + rc = sqlite3BtreeBeginStmt(pBt, p->iStatement); + } + + /* Store the current value of the database handles deferred constraint + ** counter. If the statement transaction needs to be rolled back, + ** the value of this counter needs to be restored too. */ + p->nStmtDefCons = db->nDeferredCons; + p->nStmtDefImmCons = db->nDeferredImmCons; + } + + /* Gather the schema version number for checking: + ** IMPLEMENTATION-OF: R-03189-51135 As each SQL statement runs, the schema + ** version is checked to ensure that the schema has not changed since the + ** SQL statement was prepared. + */ + sqlite3BtreeGetMeta(pBt, BTREE_SCHEMA_VERSION, (u32 *)&iMeta); + iGen = db->aDb[pOp->p1].pSchema->iGeneration; + }else{ + iGen = iMeta = 0; + } + assert( pOp->p5==0 || pOp->p4type==P4_INT32 ); + if( pOp->p5 && (iMeta!=pOp->p3 || iGen!=pOp->p4.i) ){ + sqlite3DbFree(db, p->zErrMsg); + p->zErrMsg = sqlite3DbStrDup(db, "database schema has changed"); + /* If the schema-cookie from the database file matches the cookie + ** stored with the in-memory representation of the schema, do + ** not reload the schema from the database file. + ** + ** If virtual-tables are in use, this is not just an optimization. + ** Often, v-tables store their data in other SQLite tables, which + ** are queried from within xNext() and other v-table methods using + ** prepared queries. If such a query is out-of-date, we do not want to + ** discard the database schema, as the user code implementing the + ** v-table would have to be ready for the sqlite3_vtab structure itself + ** to be invalidated whenever sqlite3_step() is called from within + ** a v-table method. + */ + if( db->aDb[pOp->p1].pSchema->schema_cookie!=iMeta ){ + sqlite3ResetOneSchema(db, pOp->p1); + } + p->expired = 1; + rc = SQLITE_SCHEMA; + } + if( rc ) goto abort_due_to_error; + break; +} + +/* Opcode: ReadCookie P1 P2 P3 * * +** +** Read cookie number P3 from database P1 and write it into register P2. +** P3==1 is the schema version. P3==2 is the database format. +** P3==3 is the recommended pager cache size, and so forth. P1==0 is +** the main database file and P1==1 is the database file used to store +** temporary tables. +** +** There must be a read-lock on the database (either a transaction +** must be started or there must be an open cursor) before +** executing this instruction. +*/ +case OP_ReadCookie: { /* out2 */ + int iMeta; + int iDb; + int iCookie; + + assert( p->bIsReader ); + iDb = pOp->p1; + iCookie = pOp->p3; + assert( pOp->p3=0 && iDbnDb ); + assert( db->aDb[iDb].pBt!=0 ); + assert( DbMaskTest(p->btreeMask, iDb) ); + + sqlite3BtreeGetMeta(db->aDb[iDb].pBt, iCookie, (u32 *)&iMeta); + pOut = out2Prerelease(p, pOp); + pOut->u.i = iMeta; + break; +} + +/* Opcode: SetCookie P1 P2 P3 * * +** +** Write the integer value P3 into cookie number P2 of database P1. +** P2==1 is the schema version. P2==2 is the database format. +** P2==3 is the recommended pager cache +** size, and so forth. P1==0 is the main database file and P1==1 is the +** database file used to store temporary tables. +** +** A transaction must be started before executing this opcode. +*/ +case OP_SetCookie: { + Db *pDb; + assert( pOp->p2p1>=0 && pOp->p1nDb ); + assert( DbMaskTest(p->btreeMask, pOp->p1) ); + assert( p->readOnly==0 ); + pDb = &db->aDb[pOp->p1]; + assert( pDb->pBt!=0 ); + assert( sqlite3SchemaMutexHeld(db, pOp->p1, 0) ); + /* See note about index shifting on OP_ReadCookie */ + rc = sqlite3BtreeUpdateMeta(pDb->pBt, pOp->p2, pOp->p3); + if( pOp->p2==BTREE_SCHEMA_VERSION ){ + /* When the schema cookie changes, record the new cookie internally */ + pDb->pSchema->schema_cookie = pOp->p3; + db->flags |= SQLITE_InternChanges; + }else if( pOp->p2==BTREE_FILE_FORMAT ){ + /* Record changes in the file format */ + pDb->pSchema->file_format = pOp->p3; + } + if( pOp->p1==1 ){ + /* Invalidate all prepared statements whenever the TEMP database + ** schema is changed. Ticket #1644 */ + sqlite3ExpirePreparedStatements(db); + p->expired = 0; + } + if( rc ) goto abort_due_to_error; + break; +} + +/* Opcode: OpenRead P1 P2 P3 P4 P5 +** Synopsis: root=P2 iDb=P3 +** +** Open a read-only cursor for the database table whose root page is +** P2 in a database file. The database file is determined by P3. +** P3==0 means the main database, P3==1 means the database used for +** temporary tables, and P3>1 means used the corresponding attached +** database. Give the new cursor an identifier of P1. The P1 +** values need not be contiguous but all P1 values should be small integers. +** It is an error for P1 to be negative. +** +** If P5!=0 then use the content of register P2 as the root page, not +** the value of P2 itself. +** +** There will be a read lock on the database whenever there is an +** open cursor. If the database was unlocked prior to this instruction +** then a read lock is acquired as part of this instruction. A read +** lock allows other processes to read the database but prohibits +** any other process from modifying the database. The read lock is +** released when all cursors are closed. If this instruction attempts +** to get a read lock but fails, the script terminates with an +** SQLITE_BUSY error code. +** +** The P4 value may be either an integer (P4_INT32) or a pointer to +** a KeyInfo structure (P4_KEYINFO). If it is a pointer to a KeyInfo +** structure, then said structure defines the content and collating +** sequence of the index being opened. Otherwise, if P4 is an integer +** value, it is set to the number of columns in the table. +** +** See also: OpenWrite, ReopenIdx +*/ +/* Opcode: ReopenIdx P1 P2 P3 P4 P5 +** Synopsis: root=P2 iDb=P3 +** +** The ReopenIdx opcode works exactly like ReadOpen except that it first +** checks to see if the cursor on P1 is already open with a root page +** number of P2 and if it is this opcode becomes a no-op. In other words, +** if the cursor is already open, do not reopen it. +** +** The ReopenIdx opcode may only be used with P5==0 and with P4 being +** a P4_KEYINFO object. Furthermore, the P3 value must be the same as +** every other ReopenIdx or OpenRead for the same cursor number. +** +** See the OpenRead opcode documentation for additional information. +*/ +/* Opcode: OpenWrite P1 P2 P3 P4 P5 +** Synopsis: root=P2 iDb=P3 +** +** Open a read/write cursor named P1 on the table or index whose root +** page is P2. Or if P5!=0 use the content of register P2 to find the +** root page. +** +** The P4 value may be either an integer (P4_INT32) or a pointer to +** a KeyInfo structure (P4_KEYINFO). If it is a pointer to a KeyInfo +** structure, then said structure defines the content and collating +** sequence of the index being opened. Otherwise, if P4 is an integer +** value, it is set to the number of columns in the table, or to the +** largest index of any column of the table that is actually used. +** +** This instruction works just like OpenRead except that it opens the cursor +** in read/write mode. For a given table, there can be one or more read-only +** cursors or a single read/write cursor but not both. +** +** See also OpenRead. +*/ +case OP_ReopenIdx: { + int nField; + KeyInfo *pKeyInfo; + int p2; + int iDb; + int wrFlag; + Btree *pX; + VdbeCursor *pCur; + Db *pDb; + + assert( pOp->p5==0 || pOp->p5==OPFLAG_SEEKEQ ); + assert( pOp->p4type==P4_KEYINFO ); + pCur = p->apCsr[pOp->p1]; + if( pCur && pCur->pgnoRoot==(u32)pOp->p2 ){ + assert( pCur->iDb==pOp->p3 ); /* Guaranteed by the code generator */ + goto open_cursor_set_hints; + } + /* If the cursor is not currently open or is open on a different + ** index, then fall through into OP_OpenRead to force a reopen */ +case OP_OpenRead: +case OP_OpenWrite: + + assert( pOp->opcode==OP_OpenWrite || pOp->p5==0 || pOp->p5==OPFLAG_SEEKEQ ); + assert( p->bIsReader ); + assert( pOp->opcode==OP_OpenRead || pOp->opcode==OP_ReopenIdx + || p->readOnly==0 ); + + if( p->expired ){ + rc = SQLITE_ABORT_ROLLBACK; + goto abort_due_to_error; + } + + nField = 0; + pKeyInfo = 0; + p2 = pOp->p2; + iDb = pOp->p3; + assert( iDb>=0 && iDbnDb ); + assert( DbMaskTest(p->btreeMask, iDb) ); + pDb = &db->aDb[iDb]; + pX = pDb->pBt; + assert( pX!=0 ); + if( pOp->opcode==OP_OpenWrite ){ + assert( OPFLAG_FORDELETE==BTREE_FORDELETE ); + wrFlag = BTREE_WRCSR | (pOp->p5 & OPFLAG_FORDELETE); + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + if( pDb->pSchema->file_format < p->minWriteFileFormat ){ + p->minWriteFileFormat = pDb->pSchema->file_format; + } + }else{ + wrFlag = 0; + } + if( pOp->p5 & OPFLAG_P2ISREG ){ + assert( p2>0 ); + assert( p2<=(p->nMem+1 - p->nCursor) ); + pIn2 = &aMem[p2]; + assert( memIsValid(pIn2) ); + assert( (pIn2->flags & MEM_Int)!=0 ); + sqlite3VdbeMemIntegerify(pIn2); + p2 = (int)pIn2->u.i; + /* The p2 value always comes from a prior OP_CreateTable opcode and + ** that opcode will always set the p2 value to 2 or more or else fail. + ** If there were a failure, the prepared statement would have halted + ** before reaching this instruction. */ + assert( p2>=2 ); + } + if( pOp->p4type==P4_KEYINFO ){ + pKeyInfo = pOp->p4.pKeyInfo; + assert( pKeyInfo->enc==ENC(db) ); + assert( pKeyInfo->db==db ); + nField = pKeyInfo->nField+pKeyInfo->nXField; + }else if( pOp->p4type==P4_INT32 ){ + nField = pOp->p4.i; + } + assert( pOp->p1>=0 ); + assert( nField>=0 ); + testcase( nField==0 ); /* Table with INTEGER PRIMARY KEY and nothing else */ + pCur = allocateCursor(p, pOp->p1, nField, iDb, CURTYPE_BTREE); + if( pCur==0 ) goto no_mem; + pCur->nullRow = 1; + pCur->isOrdered = 1; + pCur->pgnoRoot = p2; +#ifdef SQLITE_DEBUG + pCur->wrFlag = wrFlag; +#endif + rc = sqlite3BtreeCursor(pX, p2, wrFlag, pKeyInfo, pCur->uc.pCursor); + pCur->pKeyInfo = pKeyInfo; + /* Set the VdbeCursor.isTable variable. Previous versions of + ** SQLite used to check if the root-page flags were sane at this point + ** and report database corruption if they were not, but this check has + ** since moved into the btree layer. */ + pCur->isTable = pOp->p4type!=P4_KEYINFO; + +open_cursor_set_hints: + assert( OPFLAG_BULKCSR==BTREE_BULKLOAD ); + assert( OPFLAG_SEEKEQ==BTREE_SEEK_EQ ); + testcase( pOp->p5 & OPFLAG_BULKCSR ); +#ifdef SQLITE_ENABLE_CURSOR_HINTS + testcase( pOp->p2 & OPFLAG_SEEKEQ ); +#endif + sqlite3BtreeCursorHintFlags(pCur->uc.pCursor, + (pOp->p5 & (OPFLAG_BULKCSR|OPFLAG_SEEKEQ))); + if( rc ) goto abort_due_to_error; + break; +} + +/* Opcode: OpenEphemeral P1 P2 * P4 P5 +** Synopsis: nColumn=P2 +** +** Open a new cursor P1 to a transient table. +** The cursor is always opened read/write even if +** the main database is read-only. The ephemeral +** table is deleted automatically when the cursor is closed. +** +** P2 is the number of columns in the ephemeral table. +** The cursor points to a BTree table if P4==0 and to a BTree index +** if P4 is not 0. If P4 is not NULL, it points to a KeyInfo structure +** that defines the format of keys in the index. +** +** The P5 parameter can be a mask of the BTREE_* flags defined +** in btree.h. These flags control aspects of the operation of +** the btree. The BTREE_OMIT_JOURNAL and BTREE_SINGLE flags are +** added automatically. +*/ +/* Opcode: OpenAutoindex P1 P2 * P4 * +** Synopsis: nColumn=P2 +** +** This opcode works the same as OP_OpenEphemeral. It has a +** different name to distinguish its use. Tables created using +** by this opcode will be used for automatically created transient +** indices in joins. +*/ +case OP_OpenAutoindex: +case OP_OpenEphemeral: { + VdbeCursor *pCx; + KeyInfo *pKeyInfo; + + static const int vfsFlags = + SQLITE_OPEN_READWRITE | + SQLITE_OPEN_CREATE | + SQLITE_OPEN_EXCLUSIVE | + SQLITE_OPEN_DELETEONCLOSE | + SQLITE_OPEN_TRANSIENT_DB; + assert( pOp->p1>=0 ); + assert( pOp->p2>=0 ); + pCx = allocateCursor(p, pOp->p1, pOp->p2, -1, CURTYPE_BTREE); + if( pCx==0 ) goto no_mem; + pCx->nullRow = 1; + pCx->isEphemeral = 1; + rc = sqlite3BtreeOpen(db->pVfs, 0, db, &pCx->pBt, + BTREE_OMIT_JOURNAL | BTREE_SINGLE | pOp->p5, vfsFlags); + if( rc==SQLITE_OK ){ + rc = sqlite3BtreeBeginTrans(pCx->pBt, 1); + } + if( rc==SQLITE_OK ){ + /* If a transient index is required, create it by calling + ** sqlite3BtreeCreateTable() with the BTREE_BLOBKEY flag before + ** opening it. If a transient table is required, just use the + ** automatically created table with root-page 1 (an BLOB_INTKEY table). + */ + if( (pKeyInfo = pOp->p4.pKeyInfo)!=0 ){ + int pgno; + assert( pOp->p4type==P4_KEYINFO ); + rc = sqlite3BtreeCreateTable(pCx->pBt, &pgno, BTREE_BLOBKEY | pOp->p5); + if( rc==SQLITE_OK ){ + assert( pgno==MASTER_ROOT+1 ); + assert( pKeyInfo->db==db ); + assert( pKeyInfo->enc==ENC(db) ); + pCx->pKeyInfo = pKeyInfo; + rc = sqlite3BtreeCursor(pCx->pBt, pgno, BTREE_WRCSR, + pKeyInfo, pCx->uc.pCursor); + } + pCx->isTable = 0; + }else{ + rc = sqlite3BtreeCursor(pCx->pBt, MASTER_ROOT, BTREE_WRCSR, + 0, pCx->uc.pCursor); + pCx->isTable = 1; + } + } + if( rc ) goto abort_due_to_error; + pCx->isOrdered = (pOp->p5!=BTREE_UNORDERED); + break; +} + +/* Opcode: SorterOpen P1 P2 P3 P4 * +** +** This opcode works like OP_OpenEphemeral except that it opens +** a transient index that is specifically designed to sort large +** tables using an external merge-sort algorithm. +** +** If argument P3 is non-zero, then it indicates that the sorter may +** assume that a stable sort considering the first P3 fields of each +** key is sufficient to produce the required results. +*/ +case OP_SorterOpen: { + VdbeCursor *pCx; + + assert( pOp->p1>=0 ); + assert( pOp->p2>=0 ); + pCx = allocateCursor(p, pOp->p1, pOp->p2, -1, CURTYPE_SORTER); + if( pCx==0 ) goto no_mem; + pCx->pKeyInfo = pOp->p4.pKeyInfo; + assert( pCx->pKeyInfo->db==db ); + assert( pCx->pKeyInfo->enc==ENC(db) ); + rc = sqlite3VdbeSorterInit(db, pOp->p3, pCx); + if( rc ) goto abort_due_to_error; + break; +} + +/* Opcode: SequenceTest P1 P2 * * * +** Synopsis: if( cursor[P1].ctr++ ) pc = P2 +** +** P1 is a sorter cursor. If the sequence counter is currently zero, jump +** to P2. Regardless of whether or not the jump is taken, increment the +** the sequence value. +*/ +case OP_SequenceTest: { + VdbeCursor *pC; + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + assert( isSorter(pC) ); + if( (pC->seqCount++)==0 ){ + goto jump_to_p2; + } + break; +} + +/* Opcode: OpenPseudo P1 P2 P3 * * +** Synopsis: P3 columns in r[P2] +** +** Open a new cursor that points to a fake table that contains a single +** row of data. The content of that one row is the content of memory +** register P2. In other words, cursor P1 becomes an alias for the +** MEM_Blob content contained in register P2. +** +** A pseudo-table created by this opcode is used to hold a single +** row output from the sorter so that the row can be decomposed into +** individual columns using the OP_Column opcode. The OP_Column opcode +** is the only cursor opcode that works with a pseudo-table. +** +** P3 is the number of fields in the records that will be stored by +** the pseudo-table. +*/ +case OP_OpenPseudo: { + VdbeCursor *pCx; + + assert( pOp->p1>=0 ); + assert( pOp->p3>=0 ); + pCx = allocateCursor(p, pOp->p1, pOp->p3, -1, CURTYPE_PSEUDO); + if( pCx==0 ) goto no_mem; + pCx->nullRow = 1; + pCx->uc.pseudoTableReg = pOp->p2; + pCx->isTable = 1; + assert( pOp->p5==0 ); + break; +} + +/* Opcode: Close P1 * * * * +** +** Close a cursor previously opened as P1. If P1 is not +** currently open, this instruction is a no-op. +*/ +case OP_Close: { + assert( pOp->p1>=0 && pOp->p1nCursor ); + sqlite3VdbeFreeCursor(p, p->apCsr[pOp->p1]); + p->apCsr[pOp->p1] = 0; + break; +} + +#ifdef SQLITE_ENABLE_COLUMN_USED_MASK +/* Opcode: ColumnsUsed P1 * * P4 * +** +** This opcode (which only exists if SQLite was compiled with +** SQLITE_ENABLE_COLUMN_USED_MASK) identifies which columns of the +** table or index for cursor P1 are used. P4 is a 64-bit integer +** (P4_INT64) in which the first 63 bits are one for each of the +** first 63 columns of the table or index that are actually used +** by the cursor. The high-order bit is set if any column after +** the 64th is used. +*/ +case OP_ColumnsUsed: { + VdbeCursor *pC; + pC = p->apCsr[pOp->p1]; + assert( pC->eCurType==CURTYPE_BTREE ); + pC->maskUsed = *(u64*)pOp->p4.pI64; + break; +} +#endif + +/* Opcode: SeekGE P1 P2 P3 P4 * +** Synopsis: key=r[P3@P4] +** +** If cursor P1 refers to an SQL table (B-Tree that uses integer keys), +** use the value in register P3 as the key. If cursor P1 refers +** to an SQL index, then P3 is the first in an array of P4 registers +** that are used as an unpacked index key. +** +** Reposition cursor P1 so that it points to the smallest entry that +** is greater than or equal to the key value. If there are no records +** greater than or equal to the key and P2 is not zero, then jump to P2. +** +** If the cursor P1 was opened using the OPFLAG_SEEKEQ flag, then this +** opcode will always land on a record that equally equals the key, or +** else jump immediately to P2. When the cursor is OPFLAG_SEEKEQ, this +** opcode must be followed by an IdxLE opcode with the same arguments. +** The IdxLE opcode will be skipped if this opcode succeeds, but the +** IdxLE opcode will be used on subsequent loop iterations. +** +** This opcode leaves the cursor configured to move in forward order, +** from the beginning toward the end. In other words, the cursor is +** configured to use Next, not Prev. +** +** See also: Found, NotFound, SeekLt, SeekGt, SeekLe +*/ +/* Opcode: SeekGT P1 P2 P3 P4 * +** Synopsis: key=r[P3@P4] +** +** If cursor P1 refers to an SQL table (B-Tree that uses integer keys), +** use the value in register P3 as a key. If cursor P1 refers +** to an SQL index, then P3 is the first in an array of P4 registers +** that are used as an unpacked index key. +** +** Reposition cursor P1 so that it points to the smallest entry that +** is greater than the key value. If there are no records greater than +** the key and P2 is not zero, then jump to P2. +** +** This opcode leaves the cursor configured to move in forward order, +** from the beginning toward the end. In other words, the cursor is +** configured to use Next, not Prev. +** +** See also: Found, NotFound, SeekLt, SeekGe, SeekLe +*/ +/* Opcode: SeekLT P1 P2 P3 P4 * +** Synopsis: key=r[P3@P4] +** +** If cursor P1 refers to an SQL table (B-Tree that uses integer keys), +** use the value in register P3 as a key. If cursor P1 refers +** to an SQL index, then P3 is the first in an array of P4 registers +** that are used as an unpacked index key. +** +** Reposition cursor P1 so that it points to the largest entry that +** is less than the key value. If there are no records less than +** the key and P2 is not zero, then jump to P2. +** +** This opcode leaves the cursor configured to move in reverse order, +** from the end toward the beginning. In other words, the cursor is +** configured to use Prev, not Next. +** +** See also: Found, NotFound, SeekGt, SeekGe, SeekLe +*/ +/* Opcode: SeekLE P1 P2 P3 P4 * +** Synopsis: key=r[P3@P4] +** +** If cursor P1 refers to an SQL table (B-Tree that uses integer keys), +** use the value in register P3 as a key. If cursor P1 refers +** to an SQL index, then P3 is the first in an array of P4 registers +** that are used as an unpacked index key. +** +** Reposition cursor P1 so that it points to the largest entry that +** is less than or equal to the key value. If there are no records +** less than or equal to the key and P2 is not zero, then jump to P2. +** +** This opcode leaves the cursor configured to move in reverse order, +** from the end toward the beginning. In other words, the cursor is +** configured to use Prev, not Next. +** +** If the cursor P1 was opened using the OPFLAG_SEEKEQ flag, then this +** opcode will always land on a record that equally equals the key, or +** else jump immediately to P2. When the cursor is OPFLAG_SEEKEQ, this +** opcode must be followed by an IdxGE opcode with the same arguments. +** The IdxGE opcode will be skipped if this opcode succeeds, but the +** IdxGE opcode will be used on subsequent loop iterations. +** +** See also: Found, NotFound, SeekGt, SeekGe, SeekLt +*/ +case OP_SeekLT: /* jump, in3 */ +case OP_SeekLE: /* jump, in3 */ +case OP_SeekGE: /* jump, in3 */ +case OP_SeekGT: { /* jump, in3 */ + int res; /* Comparison result */ + int oc; /* Opcode */ + VdbeCursor *pC; /* The cursor to seek */ + UnpackedRecord r; /* The key to seek for */ + int nField; /* Number of columns or fields in the key */ + i64 iKey; /* The rowid we are to seek to */ + int eqOnly; /* Only interested in == results */ + + assert( pOp->p1>=0 && pOp->p1nCursor ); + assert( pOp->p2!=0 ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + assert( pC->eCurType==CURTYPE_BTREE ); + assert( OP_SeekLE == OP_SeekLT+1 ); + assert( OP_SeekGE == OP_SeekLT+2 ); + assert( OP_SeekGT == OP_SeekLT+3 ); + assert( pC->isOrdered ); + assert( pC->uc.pCursor!=0 ); + oc = pOp->opcode; + eqOnly = 0; + pC->nullRow = 0; +#ifdef SQLITE_DEBUG + pC->seekOp = pOp->opcode; +#endif + + if( pC->isTable ){ + /* The BTREE_SEEK_EQ flag is only set on index cursors */ + assert( sqlite3BtreeCursorHasHint(pC->uc.pCursor, BTREE_SEEK_EQ)==0 ); + + /* 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 convert it. */ + pIn3 = &aMem[pOp->p3]; + if( (pIn3->flags & (MEM_Int|MEM_Real|MEM_Str))==MEM_Str ){ + applyNumericAffinity(pIn3, 0); + } + iKey = sqlite3VdbeIntValue(pIn3); + + /* If the P3 value could not be converted into an integer without + ** loss of information, then special processing is required... */ + if( (pIn3->flags & MEM_Int)==0 ){ + if( (pIn3->flags & MEM_Real)==0 ){ + /* If the P3 value cannot be converted into any kind of a number, + ** then the seek is not possible, so jump to P2 */ + VdbeBranchTaken(1,2); goto jump_to_p2; + break; + } + + /* If the approximation iKey is larger than the actual real search + ** term, substitute >= for > and < for <=. e.g. if the search term + ** is 4.9 and the integer approximation 5: + ** + ** (x > 4.9) -> (x >= 5) + ** (x <= 4.9) -> (x < 5) + */ + if( pIn3->u.r<(double)iKey ){ + assert( OP_SeekGE==(OP_SeekGT-1) ); + assert( OP_SeekLT==(OP_SeekLE-1) ); + assert( (OP_SeekLE & 0x0001)==(OP_SeekGT & 0x0001) ); + if( (oc & 0x0001)==(OP_SeekGT & 0x0001) ) oc--; + } + + /* If the approximation iKey is smaller than the actual real search + ** term, substitute <= for < and > for >=. */ + else if( pIn3->u.r>(double)iKey ){ + assert( OP_SeekLE==(OP_SeekLT+1) ); + assert( OP_SeekGT==(OP_SeekGE+1) ); + assert( (OP_SeekLT & 0x0001)==(OP_SeekGE & 0x0001) ); + if( (oc & 0x0001)==(OP_SeekLT & 0x0001) ) oc++; + } + } + rc = sqlite3BtreeMovetoUnpacked(pC->uc.pCursor, 0, (u64)iKey, 0, &res); + pC->movetoTarget = iKey; /* Used by OP_Delete */ + if( rc!=SQLITE_OK ){ + goto abort_due_to_error; + } + }else{ + /* For a cursor with the BTREE_SEEK_EQ hint, only the OP_SeekGE and + ** OP_SeekLE opcodes are allowed, and these must be immediately followed + ** by an OP_IdxGT or OP_IdxLT opcode, respectively, with the same key. + */ + if( sqlite3BtreeCursorHasHint(pC->uc.pCursor, BTREE_SEEK_EQ) ){ + eqOnly = 1; + assert( pOp->opcode==OP_SeekGE || pOp->opcode==OP_SeekLE ); + assert( pOp[1].opcode==OP_IdxLT || pOp[1].opcode==OP_IdxGT ); + assert( pOp[1].p1==pOp[0].p1 ); + assert( pOp[1].p2==pOp[0].p2 ); + assert( pOp[1].p3==pOp[0].p3 ); + assert( pOp[1].p4.i==pOp[0].p4.i ); + } + + nField = pOp->p4.i; + assert( pOp->p4type==P4_INT32 ); + assert( nField>0 ); + r.pKeyInfo = pC->pKeyInfo; + r.nField = (u16)nField; + + /* The next line of code computes as follows, only faster: + ** if( oc==OP_SeekGT || oc==OP_SeekLE ){ + ** r.default_rc = -1; + ** }else{ + ** r.default_rc = +1; + ** } + */ + r.default_rc = ((1 & (oc - OP_SeekLT)) ? -1 : +1); + assert( oc!=OP_SeekGT || r.default_rc==-1 ); + assert( oc!=OP_SeekLE || r.default_rc==-1 ); + assert( oc!=OP_SeekGE || r.default_rc==+1 ); + assert( oc!=OP_SeekLT || r.default_rc==+1 ); + + r.aMem = &aMem[pOp->p3]; +#ifdef SQLITE_DEBUG + { int i; for(i=0; iuc.pCursor, &r, 0, 0, &res); + if( rc!=SQLITE_OK ){ + goto abort_due_to_error; + } + if( eqOnly && r.eqSeen==0 ){ + assert( res!=0 ); + goto seek_not_found; + } + } + pC->deferredMoveto = 0; + pC->cacheStatus = CACHE_STALE; +#ifdef SQLITE_TEST + sqlite3_search_count++; +#endif + if( oc>=OP_SeekGE ){ assert( oc==OP_SeekGE || oc==OP_SeekGT ); + if( res<0 || (res==0 && oc==OP_SeekGT) ){ + res = 0; + rc = sqlite3BtreeNext(pC->uc.pCursor, &res); + if( rc!=SQLITE_OK ) goto abort_due_to_error; + }else{ + res = 0; + } + }else{ + assert( oc==OP_SeekLT || oc==OP_SeekLE ); + if( res>0 || (res==0 && oc==OP_SeekLT) ){ + res = 0; + rc = sqlite3BtreePrevious(pC->uc.pCursor, &res); + if( rc!=SQLITE_OK ) goto abort_due_to_error; + }else{ + /* res might be negative because the table is empty. Check to + ** see if this is the case. + */ + res = sqlite3BtreeEof(pC->uc.pCursor); + } + } +seek_not_found: + assert( pOp->p2>0 ); + VdbeBranchTaken(res!=0,2); + if( res ){ + goto jump_to_p2; + }else if( eqOnly ){ + assert( pOp[1].opcode==OP_IdxLT || pOp[1].opcode==OP_IdxGT ); + pOp++; /* Skip the OP_IdxLt or OP_IdxGT that follows */ + } + break; +} + +/* Opcode: Found P1 P2 P3 P4 * +** Synopsis: key=r[P3@P4] +** +** 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 a prefix of any entry in P1 then a jump is made to P2 and +** P1 is left pointing at the matching entry. +** +** This operation leaves the cursor in a state where it can be +** advanced in the forward direction. The Next instruction will work, +** but not the Prev instruction. +** +** See also: NotFound, NoConflict, NotExists. SeekGe +*/ +/* Opcode: NotFound P1 P2 P3 P4 * +** Synopsis: key=r[P3@P4] +** +** 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. +** +** This operation leaves the cursor in a state where it cannot be +** advanced in either direction. In other words, the Next and Prev +** opcodes do not work after this operation. +** +** See also: Found, NotExists, NoConflict +*/ +/* Opcode: NoConflict P1 P2 P3 P4 * +** Synopsis: key=r[P3@P4] +** +** 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 +** contains any NULL value, jump immediately to P2. If all terms of the +** record are not-NULL then a check is done to determine if any row in the +** P1 index btree has a matching key prefix. If there are no matches, jump +** immediately to P2. If there is a match, fall through and leave the P1 +** cursor pointing to the matching row. +** +** This opcode is similar to OP_NotFound with the exceptions that the +** branch is always taken if any part of the search key input is NULL. +** +** This operation leaves the cursor in a state where it cannot be +** advanced in either direction. In other words, the Next and Prev +** opcodes do not work after this operation. +** +** See also: NotFound, Found, NotExists +*/ +case OP_NoConflict: /* jump, in3 */ +case OP_NotFound: /* jump, in3 */ +case OP_Found: { /* jump, in3 */ + int alreadyExists; + int takeJump; + int ii; + VdbeCursor *pC; + int res; + char *pFree; + UnpackedRecord *pIdxKey; + UnpackedRecord r; + char aTempRec[ROUND8(sizeof(UnpackedRecord)) + sizeof(Mem)*4 + 7]; + +#ifdef SQLITE_TEST + if( pOp->opcode!=OP_NoConflict ) sqlite3_found_count++; +#endif + + assert( pOp->p1>=0 && pOp->p1nCursor ); + assert( pOp->p4type==P4_INT32 ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); +#ifdef SQLITE_DEBUG + pC->seekOp = pOp->opcode; +#endif + pIn3 = &aMem[pOp->p3]; + assert( pC->eCurType==CURTYPE_BTREE ); + assert( pC->uc.pCursor!=0 ); + assert( pC->isTable==0 ); + pFree = 0; + if( pOp->p4.i>0 ){ + r.pKeyInfo = pC->pKeyInfo; + r.nField = (u16)pOp->p4.i; + r.aMem = pIn3; +#ifdef SQLITE_DEBUG + for(ii=0; iip3+ii, &r.aMem[ii]); + } +#endif + pIdxKey = &r; + }else{ + pIdxKey = sqlite3VdbeAllocUnpackedRecord( + pC->pKeyInfo, aTempRec, sizeof(aTempRec), &pFree + ); + if( pIdxKey==0 ) goto no_mem; + assert( pIn3->flags & MEM_Blob ); + (void)ExpandBlob(pIn3); + sqlite3VdbeRecordUnpack(pC->pKeyInfo, pIn3->n, pIn3->z, pIdxKey); + } + pIdxKey->default_rc = 0; + takeJump = 0; + if( pOp->opcode==OP_NoConflict ){ + /* For the OP_NoConflict opcode, take the jump if any of the + ** input fields are NULL, since any key with a NULL will not + ** conflict */ + for(ii=0; iinField; ii++){ + if( pIdxKey->aMem[ii].flags & MEM_Null ){ + takeJump = 1; + break; + } + } + } + rc = sqlite3BtreeMovetoUnpacked(pC->uc.pCursor, pIdxKey, 0, 0, &res); + sqlite3DbFree(db, pFree); + if( rc!=SQLITE_OK ){ + goto abort_due_to_error; + } + pC->seekResult = res; + alreadyExists = (res==0); + pC->nullRow = 1-alreadyExists; + pC->deferredMoveto = 0; + pC->cacheStatus = CACHE_STALE; + if( pOp->opcode==OP_Found ){ + VdbeBranchTaken(alreadyExists!=0,2); + if( alreadyExists ) goto jump_to_p2; + }else{ + VdbeBranchTaken(takeJump||alreadyExists==0,2); + if( takeJump || !alreadyExists ) goto jump_to_p2; + } + break; +} + +/* Opcode: SeekRowid P1 P2 P3 * * +** Synopsis: intkey=r[P3] +** +** P1 is the index of a cursor open on an SQL table btree (with integer +** keys). If register P3 does not contain an integer or if P1 does not +** contain a record with rowid P3 then jump immediately to P2. +** Or, if P2 is 0, raise an SQLITE_CORRUPT error. If P1 does contain +** a record with rowid P3 then +** leave the cursor pointing at that record and fall through to the next +** instruction. +** +** The OP_NotExists opcode performs the same operation, but with OP_NotExists +** the P3 register must be guaranteed to contain an integer value. With this +** opcode, register P3 might not contain an integer. +** +** The OP_NotFound opcode performs the same operation on index btrees +** (with arbitrary multi-value keys). +** +** This opcode leaves the cursor in a state where it cannot be advanced +** in either direction. In other words, the Next and Prev opcodes will +** not work following this opcode. +** +** See also: Found, NotFound, NoConflict, SeekRowid +*/ +/* Opcode: NotExists P1 P2 P3 * * +** Synopsis: intkey=r[P3] +** +** P1 is the index of a cursor open on an SQL table btree (with integer +** keys). P3 is an integer rowid. If P1 does not contain a record with +** rowid P3 then jump immediately to P2. Or, if P2 is 0, raise an +** SQLITE_CORRUPT error. If P1 does contain a record with rowid P3 then +** leave the cursor pointing at that record and fall through to the next +** instruction. +** +** The OP_SeekRowid opcode performs the same operation but also allows the +** P3 register to contain a non-integer value, in which case the jump is +** always taken. This opcode requires that P3 always contain an integer. +** +** The OP_NotFound opcode performs the same operation on index btrees +** (with arbitrary multi-value keys). +** +** This opcode leaves the cursor in a state where it cannot be advanced +** in either direction. In other words, the Next and Prev opcodes will +** not work following this opcode. +** +** See also: Found, NotFound, NoConflict, SeekRowid +*/ +case OP_SeekRowid: { /* jump, in3 */ + VdbeCursor *pC; + BtCursor *pCrsr; + int res; + u64 iKey; + + pIn3 = &aMem[pOp->p3]; + if( (pIn3->flags & MEM_Int)==0 ){ + applyAffinity(pIn3, SQLITE_AFF_NUMERIC, encoding); + if( (pIn3->flags & MEM_Int)==0 ) goto jump_to_p2; + } + /* Fall through into OP_NotExists */ +case OP_NotExists: /* jump, in3 */ + pIn3 = &aMem[pOp->p3]; + assert( pIn3->flags & MEM_Int ); + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); +#ifdef SQLITE_DEBUG + pC->seekOp = 0; +#endif + assert( pC->isTable ); + assert( pC->eCurType==CURTYPE_BTREE ); + pCrsr = pC->uc.pCursor; + assert( pCrsr!=0 ); + res = 0; + iKey = pIn3->u.i; + rc = sqlite3BtreeMovetoUnpacked(pCrsr, 0, iKey, 0, &res); + assert( rc==SQLITE_OK || res==0 ); + pC->movetoTarget = iKey; /* Used by OP_Delete */ + pC->nullRow = 0; + pC->cacheStatus = CACHE_STALE; + pC->deferredMoveto = 0; + VdbeBranchTaken(res!=0,2); + pC->seekResult = res; + if( res!=0 ){ + assert( rc==SQLITE_OK ); + if( pOp->p2==0 ){ + rc = SQLITE_CORRUPT_BKPT; + }else{ + goto jump_to_p2; + } + } + if( rc ) goto abort_due_to_error; + break; +} + +/* Opcode: Sequence P1 P2 * * * +** Synopsis: r[P2]=cursor[P1].ctr++ +** +** Find the next available sequence number for cursor P1. +** Write the sequence number into register P2. +** The sequence number on the cursor is incremented after this +** instruction. +*/ +case OP_Sequence: { /* out2 */ + assert( pOp->p1>=0 && pOp->p1nCursor ); + assert( p->apCsr[pOp->p1]!=0 ); + assert( p->apCsr[pOp->p1]->eCurType!=CURTYPE_VTAB ); + pOut = out2Prerelease(p, pOp); + pOut->u.i = p->apCsr[pOp->p1]->seqCount++; + break; +} + + +/* Opcode: NewRowid P1 P2 P3 * * +** Synopsis: r[P2]=rowid +** +** Get a new integer record number (a.k.a "rowid") used as the key to a table. +** The record number is not previously used as a key in the database +** table that cursor P1 points to. The new record number is written +** written to register P2. +** +** If P3>0 then P3 is a register in the root frame of this VDBE that holds +** the largest previously generated record number. No new record numbers are +** allowed to be less than this value. When this value reaches its maximum, +** an SQLITE_FULL error is generated. The P3 register is updated with the ' +** generated record number. This P3 mechanism is used to help implement the +** AUTOINCREMENT feature. +*/ +case OP_NewRowid: { /* out2 */ + i64 v; /* The new rowid */ + VdbeCursor *pC; /* Cursor of table to get the new rowid */ + int res; /* Result of an sqlite3BtreeLast() */ + int cnt; /* Counter to limit the number of searches */ + Mem *pMem; /* Register holding largest rowid for AUTOINCREMENT */ + VdbeFrame *pFrame; /* Root frame of VDBE */ + + v = 0; + res = 0; + pOut = out2Prerelease(p, pOp); + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + assert( pC->eCurType==CURTYPE_BTREE ); + assert( pC->uc.pCursor!=0 ); + { + /* The next rowid or record number (different terms for the same + ** thing) is obtained in a two-step algorithm. + ** + ** First we attempt to find the largest existing rowid and add one + ** to that. But if the largest existing rowid is already the maximum + ** positive integer, we have to fall through to the second + ** probabilistic algorithm + ** + ** The second algorithm is to select a rowid at random and see if + ** it already exists in the table. If it does not exist, we have + ** succeeded. If the random rowid does exist, we select a new one + ** and try again, up to 100 times. + */ + assert( pC->isTable ); + +#ifdef SQLITE_32BIT_ROWID +# define MAX_ROWID 0x7fffffff +#else + /* Some compilers complain about constants of the form 0x7fffffffffffffff. + ** Others complain about 0x7ffffffffffffffffLL. The following macro seems + ** to provide the constant while making all compilers happy. + */ +# define MAX_ROWID (i64)( (((u64)0x7fffffff)<<32) | (u64)0xffffffff ) +#endif + + if( !pC->useRandomRowid ){ + rc = sqlite3BtreeLast(pC->uc.pCursor, &res); + if( rc!=SQLITE_OK ){ + goto abort_due_to_error; + } + if( res ){ + v = 1; /* IMP: R-61914-48074 */ + }else{ + assert( sqlite3BtreeCursorIsValid(pC->uc.pCursor) ); + v = sqlite3BtreeIntegerKey(pC->uc.pCursor); + if( v>=MAX_ROWID ){ + pC->useRandomRowid = 1; + }else{ + v++; /* IMP: R-29538-34987 */ + } + } + } + +#ifndef SQLITE_OMIT_AUTOINCREMENT + if( pOp->p3 ){ + /* Assert that P3 is a valid memory cell. */ + assert( pOp->p3>0 ); + if( p->pFrame ){ + for(pFrame=p->pFrame; pFrame->pParent; pFrame=pFrame->pParent); + /* Assert that P3 is a valid memory cell. */ + assert( pOp->p3<=pFrame->nMem ); + pMem = &pFrame->aMem[pOp->p3]; + }else{ + /* Assert that P3 is a valid memory cell. */ + assert( pOp->p3<=(p->nMem+1 - p->nCursor) ); + pMem = &aMem[pOp->p3]; + memAboutToChange(p, pMem); + } + assert( memIsValid(pMem) ); + + REGISTER_TRACE(pOp->p3, pMem); + sqlite3VdbeMemIntegerify(pMem); + assert( (pMem->flags & MEM_Int)!=0 ); /* mem(P3) holds an integer */ + if( pMem->u.i==MAX_ROWID || pC->useRandomRowid ){ + rc = SQLITE_FULL; /* IMP: R-12275-61338 */ + goto abort_due_to_error; + } + if( vu.i+1 ){ + v = pMem->u.i + 1; + } + pMem->u.i = v; + } +#endif + if( pC->useRandomRowid ){ + /* IMPLEMENTATION-OF: R-07677-41881 If the largest ROWID is equal to the + ** largest possible integer (9223372036854775807) then the database + ** engine starts picking positive 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. */ + cnt = 0; + do{ + sqlite3_randomness(sizeof(v), &v); + v &= (MAX_ROWID>>1); v++; /* Ensure that v is greater than zero */ + }while( ((rc = sqlite3BtreeMovetoUnpacked(pC->uc.pCursor, 0, (u64)v, + 0, &res))==SQLITE_OK) + && (res==0) + && (++cnt<100)); + if( rc ) goto abort_due_to_error; + if( res==0 ){ + rc = SQLITE_FULL; /* IMP: R-38219-53002 */ + goto abort_due_to_error; + } + assert( v>0 ); /* EV: R-40812-03570 */ + } + pC->deferredMoveto = 0; + pC->cacheStatus = CACHE_STALE; + } + pOut->u.i = v; + break; +} + +/* Opcode: Insert P1 P2 P3 P4 P5 +** Synopsis: intkey=r[P3] data=r[P2] +** +** Write an entry into the table of cursor P1. A new entry is +** created if it doesn't already exist or the data for an existing +** entry is overwritten. The data is the value MEM_Blob stored in register +** number P2. The key is stored in register P3. The key must +** be a MEM_Int. +** +** If the OPFLAG_NCHANGE flag of P5 is set, then the row change count is +** incremented (otherwise not). If the OPFLAG_LASTROWID flag of P5 is set, +** then rowid is stored for subsequent return by the +** sqlite3_last_insert_rowid() function (otherwise it is unmodified). +** +** If the OPFLAG_USESEEKRESULT flag of P5 is set and if the result of +** the last seek operation (OP_NotExists or OP_SeekRowid) was a success, +** then this +** operation will not attempt to find the appropriate row before doing +** the insert but will instead overwrite the row that the cursor is +** currently pointing to. Presumably, the prior OP_NotExists or +** OP_SeekRowid opcode +** has already positioned the cursor correctly. This is an optimization +** that boosts performance by avoiding redundant seeks. +** +** If the OPFLAG_ISUPDATE flag is set, then this opcode is part of an +** UPDATE operation. Otherwise (if the flag is clear) then this opcode +** is part of an INSERT operation. The difference is only important to +** the update hook. +** +** Parameter P4 may point to a Table structure, or may be NULL. If it is +** not NULL, then the update-hook (sqlite3.xUpdateCallback) is invoked +** following a successful insert. +** +** (WARNING/TODO: If P1 is a pseudo-cursor and P2 is dynamically +** allocated, then ownership of P2 is transferred to the pseudo-cursor +** and register P2 becomes ephemeral. If the cursor is changed, the +** value of register P2 will then change. Make sure this does not +** cause any problems.) +** +** This instruction only works on tables. The equivalent instruction +** for indices is OP_IdxInsert. +*/ +/* Opcode: InsertInt P1 P2 P3 P4 P5 +** Synopsis: intkey=P3 data=r[P2] +** +** 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: { + Mem *pData; /* MEM cell holding data for the record to be inserted */ + Mem *pKey; /* MEM cell holding key for the record */ + VdbeCursor *pC; /* Cursor to table into which insert is written */ + int seekResult; /* Result of prior seek or 0 if no USESEEKRESULT flag */ + const char *zDb; /* database name - used by the update hook */ + Table *pTab; /* Table structure - used by update and pre-update hooks */ + int op; /* Opcode for update hook: SQLITE_UPDATE or SQLITE_INSERT */ + BtreePayload x; /* Payload to be inserted */ + + op = 0; + pData = &aMem[pOp->p2]; + assert( pOp->p1>=0 && pOp->p1nCursor ); + assert( memIsValid(pData) ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + assert( pC->eCurType==CURTYPE_BTREE ); + assert( pC->uc.pCursor!=0 ); + assert( pC->isTable ); + assert( pOp->p4type==P4_TABLE || pOp->p4type>=P4_STATIC ); + REGISTER_TRACE(pOp->p2, pData); + + if( pOp->opcode==OP_Insert ){ + pKey = &aMem[pOp->p3]; + assert( pKey->flags & MEM_Int ); + assert( memIsValid(pKey) ); + REGISTER_TRACE(pOp->p3, pKey); + x.nKey = pKey->u.i; + }else{ + assert( pOp->opcode==OP_InsertInt ); + x.nKey = pOp->p3; + } + + if( pOp->p4type==P4_TABLE && HAS_UPDATE_HOOK(db) ){ + assert( pC->isTable ); + assert( pC->iDb>=0 ); + zDb = db->aDb[pC->iDb].zDbSName; + pTab = pOp->p4.pTab; + assert( HasRowid(pTab) ); + op = ((pOp->p5 & OPFLAG_ISUPDATE) ? SQLITE_UPDATE : SQLITE_INSERT); + }else{ + pTab = 0; /* Not needed. Silence a comiler warning. */ + zDb = 0; /* Not needed. Silence a compiler warning. */ + } + +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + /* Invoke the pre-update hook, if any */ + if( db->xPreUpdateCallback + && pOp->p4type==P4_TABLE + && !(pOp->p5 & OPFLAG_ISUPDATE) + ){ + sqlite3VdbePreUpdateHook(p, pC, SQLITE_INSERT, zDb, pTab, x.nKey, pOp->p2); + } +#endif + + if( pOp->p5 & OPFLAG_NCHANGE ) p->nChange++; + if( pOp->p5 & OPFLAG_LASTROWID ) db->lastRowid = lastRowid = x.nKey; + if( pData->flags & MEM_Null ){ + x.pData = 0; + x.nData = 0; + }else{ + assert( pData->flags & (MEM_Blob|MEM_Str) ); + x.pData = pData->z; + x.nData = pData->n; + } + seekResult = ((pOp->p5 & OPFLAG_USESEEKRESULT) ? pC->seekResult : 0); + if( pData->flags & MEM_Zero ){ + x.nZero = pData->u.nZero; + }else{ + x.nZero = 0; + } + x.pKey = 0; + rc = sqlite3BtreeInsert(pC->uc.pCursor, &x, + (pOp->p5 & OPFLAG_APPEND)!=0, seekResult + ); + pC->deferredMoveto = 0; + pC->cacheStatus = CACHE_STALE; + + /* Invoke the update-hook if required. */ + if( rc ) goto abort_due_to_error; + if( db->xUpdateCallback && op ){ + db->xUpdateCallback(db->pUpdateArg, op, zDb, pTab->zName, x.nKey); + } + break; +} + +/* Opcode: Delete P1 P2 P3 P4 P5 +** +** Delete the record at which the P1 cursor is currently pointing. +** +** If the OPFLAG_SAVEPOSITION bit of the P5 parameter is set, then +** the cursor will be left pointing at either the next or the previous +** record in the table. If it is left pointing at the next record, then +** the next Next instruction will be a no-op. As a result, in this case +** it is ok to delete a record from within a Next loop. If +** OPFLAG_SAVEPOSITION bit of P5 is clear, then the cursor will be +** left in an undefined state. +** +** If the OPFLAG_AUXDELETE bit is set on P5, that indicates that this +** delete one of several associated with deleting a table row and all its +** associated index entries. Exactly one of those deletes is the "primary" +** delete. The others are all on OPFLAG_FORDELETE cursors or else are +** marked with the AUXDELETE flag. +** +** If the OPFLAG_NCHANGE flag of P2 (NB: P2 not P5) is set, then the row +** change count is incremented (otherwise not). +** +** P1 must not be pseudo-table. It has to be a real table with +** multiple rows. +** +** If P4 is not NULL then it points to a Table object. In this case either +** the update or pre-update hook, or both, may be invoked. The P1 cursor must +** have been positioned using OP_NotFound prior to invoking this opcode in +** this case. Specifically, if one is configured, the pre-update hook is +** invoked if P4 is not NULL. The update-hook is invoked if one is configured, +** P4 is not NULL, and the OPFLAG_NCHANGE flag is set in P2. +** +** If the OPFLAG_ISUPDATE flag is set in P2, then P3 contains the address +** of the memory cell that contains the value that the rowid of the row will +** be set to by the update. +*/ +case OP_Delete: { + VdbeCursor *pC; + const char *zDb; + Table *pTab; + int opflags; + + opflags = pOp->p2; + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + assert( pC->eCurType==CURTYPE_BTREE ); + assert( pC->uc.pCursor!=0 ); + assert( pC->deferredMoveto==0 ); + +#ifdef SQLITE_DEBUG + if( pOp->p4type==P4_TABLE && HasRowid(pOp->p4.pTab) && pOp->p5==0 ){ + /* If p5 is zero, the seek operation that positioned the cursor prior to + ** OP_Delete will have also set the pC->movetoTarget field to the rowid of + ** the row that is being deleted */ + i64 iKey = sqlite3BtreeIntegerKey(pC->uc.pCursor); + assert( pC->movetoTarget==iKey ); + } +#endif + + /* If the update-hook or pre-update-hook will be invoked, set zDb to + ** the name of the db to pass as to it. Also set local pTab to a copy + ** of p4.pTab. Finally, if p5 is true, indicating that this cursor was + ** last moved with OP_Next or OP_Prev, not Seek or NotFound, set + ** VdbeCursor.movetoTarget to the current rowid. */ + if( pOp->p4type==P4_TABLE && HAS_UPDATE_HOOK(db) ){ + assert( pC->iDb>=0 ); + assert( pOp->p4.pTab!=0 ); + zDb = db->aDb[pC->iDb].zDbSName; + pTab = pOp->p4.pTab; + if( (pOp->p5 & OPFLAG_SAVEPOSITION)!=0 && pC->isTable ){ + pC->movetoTarget = sqlite3BtreeIntegerKey(pC->uc.pCursor); + } + }else{ + zDb = 0; /* Not needed. Silence a compiler warning. */ + pTab = 0; /* Not needed. Silence a compiler warning. */ + } + +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + /* Invoke the pre-update-hook if required. */ + if( db->xPreUpdateCallback && pOp->p4.pTab && HasRowid(pTab) ){ + assert( !(opflags & OPFLAG_ISUPDATE) || (aMem[pOp->p3].flags & MEM_Int) ); + sqlite3VdbePreUpdateHook(p, pC, + (opflags & OPFLAG_ISUPDATE) ? SQLITE_UPDATE : SQLITE_DELETE, + zDb, pTab, pC->movetoTarget, + pOp->p3 + ); + } + if( opflags & OPFLAG_ISNOOP ) break; +#endif + + /* Only flags that can be set are SAVEPOISTION and AUXDELETE */ + assert( (pOp->p5 & ~(OPFLAG_SAVEPOSITION|OPFLAG_AUXDELETE))==0 ); + assert( OPFLAG_SAVEPOSITION==BTREE_SAVEPOSITION ); + assert( OPFLAG_AUXDELETE==BTREE_AUXDELETE ); + +#ifdef SQLITE_DEBUG + if( p->pFrame==0 ){ + if( pC->isEphemeral==0 + && (pOp->p5 & OPFLAG_AUXDELETE)==0 + && (pC->wrFlag & OPFLAG_FORDELETE)==0 + ){ + nExtraDelete++; + } + if( pOp->p2 & OPFLAG_NCHANGE ){ + nExtraDelete--; + } + } +#endif + + rc = sqlite3BtreeDelete(pC->uc.pCursor, pOp->p5); + pC->cacheStatus = CACHE_STALE; + if( rc ) goto abort_due_to_error; + + /* Invoke the update-hook if required. */ + if( opflags & OPFLAG_NCHANGE ){ + p->nChange++; + if( db->xUpdateCallback && HasRowid(pTab) ){ + db->xUpdateCallback(db->pUpdateArg, SQLITE_DELETE, zDb, pTab->zName, + pC->movetoTarget); + assert( pC->iDb>=0 ); + } + } + + break; +} +/* Opcode: ResetCount * * * * * +** +** The value of the change counter is copied to the database handle +** change counter (returned by subsequent calls to sqlite3_changes()). +** Then the VMs internal change counter resets to 0. +** This is used by trigger programs. +*/ +case OP_ResetCount: { + sqlite3VdbeSetChanges(db, p->nChange); + p->nChange = 0; + break; +} + +/* Opcode: SorterCompare P1 P2 P3 P4 +** Synopsis: if key(P1)!=trim(r[P3],P4) goto P2 +** +** P1 is a sorter cursor. This instruction compares a prefix of the +** record blob in register P3 against a prefix of the entry that +** the sorter cursor currently points to. Only the first P4 fields +** of r[P3] and the sorter record are compared. +** +** If either P3 or the sorter contains a NULL in one of their significant +** fields (not counting the P4 fields at the end which are ignored) then +** the comparison is assumed to be equal. +** +** Fall through to next instruction if the two records compare equal to +** each other. Jump to P2 if they are different. +*/ +case OP_SorterCompare: { + VdbeCursor *pC; + int res; + int nKeyCol; + + pC = p->apCsr[pOp->p1]; + assert( isSorter(pC) ); + assert( pOp->p4type==P4_INT32 ); + pIn3 = &aMem[pOp->p3]; + nKeyCol = pOp->p4.i; + res = 0; + rc = sqlite3VdbeSorterCompare(pC, pIn3, nKeyCol, &res); + VdbeBranchTaken(res!=0,2); + if( rc ) goto abort_due_to_error; + if( res ) goto jump_to_p2; + break; +}; + +/* Opcode: SorterData P1 P2 P3 * * +** Synopsis: r[P2]=data +** +** Write into register P2 the current sorter data for sorter cursor P1. +** Then clear the column header cache on cursor P3. +** +** This opcode is normally use to move a record out of the sorter and into +** a register that is the source for a pseudo-table cursor created using +** OpenPseudo. That pseudo-table cursor is the one that is identified by +** parameter P3. Clearing the P3 column cache as part of this opcode saves +** us from having to issue a separate NullRow instruction to clear that cache. +*/ +case OP_SorterData: { + VdbeCursor *pC; + + pOut = &aMem[pOp->p2]; + pC = p->apCsr[pOp->p1]; + assert( isSorter(pC) ); + rc = sqlite3VdbeSorterRowkey(pC, pOut); + assert( rc!=SQLITE_OK || (pOut->flags & MEM_Blob) ); + assert( pOp->p1>=0 && pOp->p1nCursor ); + if( rc ) goto abort_due_to_error; + p->apCsr[pOp->p3]->cacheStatus = CACHE_STALE; + break; +} + +/* Opcode: RowData P1 P2 * * * +** Synopsis: r[P2]=data +** +** Write into register P2 the complete row data for cursor P1. +** There is no interpretation of the data. +** It is just copied onto the P2 register exactly as +** it is found in the database file. +** +** If the P1 cursor must be pointing to a valid row (not a NULL row) +** of a real table, not a pseudo-table. +*/ +/* Opcode: RowKey P1 P2 * * * +** Synopsis: r[P2]=key +** +** Write into register P2 the complete row key for cursor P1. +** There is no interpretation of the data. +** The key is copied onto the P2 register exactly as +** it is found in the database file. +** +** If the P1 cursor must be pointing to a valid row (not a NULL row) +** of a real table, not a pseudo-table. +*/ +case OP_RowKey: +case OP_RowData: { + VdbeCursor *pC; + BtCursor *pCrsr; + u32 n; + + pOut = &aMem[pOp->p2]; + memAboutToChange(p, pOut); + + /* Note that RowKey and RowData are really exactly the same instruction */ + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + assert( pC->eCurType==CURTYPE_BTREE ); + assert( isSorter(pC)==0 ); + assert( pC->isTable || pOp->opcode!=OP_RowData ); + assert( pC->isTable==0 || pOp->opcode==OP_RowData ); + assert( pC->nullRow==0 ); + assert( pC->uc.pCursor!=0 ); + pCrsr = pC->uc.pCursor; + + /* The OP_RowKey and OP_RowData opcodes always follow OP_NotExists or + ** OP_SeekRowid or OP_Rewind/Op_Next with no intervening instructions + ** that might invalidate the cursor. + ** If this where not the case, on of the following assert()s + ** would fail. Should this ever change (because of changes in the code + ** generator) then the fix would be to insert a call to + ** sqlite3VdbeCursorMoveto(). + */ + assert( pC->deferredMoveto==0 ); + assert( sqlite3BtreeCursorIsValid(pCrsr) ); +#if 0 /* Not required due to the previous to assert() statements */ + rc = sqlite3VdbeCursorMoveto(pC); + if( rc!=SQLITE_OK ) goto abort_due_to_error; +#endif + + n = sqlite3BtreePayloadSize(pCrsr); + if( n>(u32)db->aLimit[SQLITE_LIMIT_LENGTH] ){ + goto too_big; + } + testcase( n==0 ); + if( sqlite3VdbeMemClearAndResize(pOut, MAX(n,32)) ){ + goto no_mem; + } + pOut->n = n; + MemSetTypeFlag(pOut, MEM_Blob); + if( pC->isTable==0 ){ + rc = sqlite3BtreeKey(pCrsr, 0, n, pOut->z); + }else{ + rc = sqlite3BtreeData(pCrsr, 0, n, pOut->z); + } + if( rc ) goto abort_due_to_error; + pOut->enc = SQLITE_UTF8; /* In case the blob is ever cast to text */ + UPDATE_MAX_BLOBSIZE(pOut); + REGISTER_TRACE(pOp->p2, pOut); + break; +} + +/* Opcode: Rowid P1 P2 * * * +** Synopsis: r[P2]=rowid +** +** Store in register P2 an integer which is the key of the table entry that +** P1 is currently point to. +** +** P1 can be either an ordinary table or a virtual table. There used to +** be a separate OP_VRowid opcode for use with virtual tables, but this +** one opcode now works for both table types. +*/ +case OP_Rowid: { /* out2 */ + VdbeCursor *pC; + i64 v; + sqlite3_vtab *pVtab; + const sqlite3_module *pModule; + + pOut = out2Prerelease(p, pOp); + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + assert( pC->eCurType!=CURTYPE_PSEUDO || pC->nullRow ); + if( pC->nullRow ){ + pOut->flags = MEM_Null; + break; + }else if( pC->deferredMoveto ){ + v = pC->movetoTarget; +#ifndef SQLITE_OMIT_VIRTUALTABLE + }else if( pC->eCurType==CURTYPE_VTAB ){ + assert( pC->uc.pVCur!=0 ); + pVtab = pC->uc.pVCur->pVtab; + pModule = pVtab->pModule; + assert( pModule->xRowid ); + rc = pModule->xRowid(pC->uc.pVCur, &v); + sqlite3VtabImportErrmsg(p, pVtab); + if( rc ) goto abort_due_to_error; +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + }else{ + assert( pC->eCurType==CURTYPE_BTREE ); + assert( pC->uc.pCursor!=0 ); + rc = sqlite3VdbeCursorRestore(pC); + if( rc ) goto abort_due_to_error; + if( pC->nullRow ){ + pOut->flags = MEM_Null; + break; + } + v = sqlite3BtreeIntegerKey(pC->uc.pCursor); + } + pOut->u.i = v; + break; +} + +/* Opcode: NullRow P1 * * * * +** +** Move the cursor P1 to a null row. Any OP_Column operations +** that occur while the cursor is on the null row will always +** write a NULL. +*/ +case OP_NullRow: { + VdbeCursor *pC; + + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + pC->nullRow = 1; + pC->cacheStatus = CACHE_STALE; + if( pC->eCurType==CURTYPE_BTREE ){ + assert( pC->uc.pCursor!=0 ); + sqlite3BtreeClearCursor(pC->uc.pCursor); + } + break; +} + +/* Opcode: Last P1 P2 P3 * * +** +** The next use of the Rowid or Column or Prev instruction for P1 +** will refer to the last entry in the database table or index. +** If the table or index is empty and P2>0, then jump immediately to P2. +** If P2 is 0 or if the table or index is not empty, fall through +** to the following instruction. +** +** This opcode leaves the cursor configured to move in reverse order, +** from the end toward the beginning. In other words, the cursor is +** configured to use Prev, not Next. +*/ +case OP_Last: { /* jump */ + VdbeCursor *pC; + BtCursor *pCrsr; + int res; + + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + assert( pC->eCurType==CURTYPE_BTREE ); + pCrsr = pC->uc.pCursor; + res = 0; + assert( pCrsr!=0 ); + rc = sqlite3BtreeLast(pCrsr, &res); + pC->nullRow = (u8)res; + pC->deferredMoveto = 0; + pC->cacheStatus = CACHE_STALE; + pC->seekResult = pOp->p3; +#ifdef SQLITE_DEBUG + pC->seekOp = OP_Last; +#endif + if( rc ) goto abort_due_to_error; + if( pOp->p2>0 ){ + VdbeBranchTaken(res!=0,2); + if( res ) goto jump_to_p2; + } + break; +} + + +/* Opcode: Sort P1 P2 * * * +** +** This opcode does exactly the same thing as OP_Rewind except that +** it increments an undocumented global variable used for testing. +** +** Sorting is accomplished by writing records into a sorting index, +** then rewinding that index and playing it back from beginning to +** end. We use the OP_Sort opcode instead of OP_Rewind to do the +** rewinding so that the global variable will be incremented and +** regression tests can determine whether or not the optimizer is +** correctly optimizing out sorts. +*/ +case OP_SorterSort: /* jump */ +case OP_Sort: { /* jump */ +#ifdef SQLITE_TEST + sqlite3_sort_count++; + sqlite3_search_count--; +#endif + p->aCounter[SQLITE_STMTSTATUS_SORT]++; + /* Fall through into OP_Rewind */ +} +/* Opcode: Rewind P1 P2 * * * +** +** The next use of the Rowid or Column or Next instruction for P1 +** will refer to the first entry in the database table or index. +** If the table or index is empty, jump immediately to P2. +** If the table or index is not empty, fall through to the following +** instruction. +** +** This opcode leaves the cursor configured to move in forward order, +** from the beginning toward the end. In other words, the cursor is +** configured to use Next, not Prev. +*/ +case OP_Rewind: { /* jump */ + VdbeCursor *pC; + BtCursor *pCrsr; + int res; + + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + assert( isSorter(pC)==(pOp->opcode==OP_SorterSort) ); + res = 1; +#ifdef SQLITE_DEBUG + pC->seekOp = OP_Rewind; +#endif + if( isSorter(pC) ){ + rc = sqlite3VdbeSorterRewind(pC, &res); + }else{ + assert( pC->eCurType==CURTYPE_BTREE ); + pCrsr = pC->uc.pCursor; + assert( pCrsr ); + rc = sqlite3BtreeFirst(pCrsr, &res); + pC->deferredMoveto = 0; + pC->cacheStatus = CACHE_STALE; + } + if( rc ) goto abort_due_to_error; + pC->nullRow = (u8)res; + assert( pOp->p2>0 && pOp->p2nOp ); + VdbeBranchTaken(res!=0,2); + if( res ) goto jump_to_p2; + break; +} + +/* Opcode: Next P1 P2 P3 P4 P5 +** +** Advance cursor P1 so that it points to the next key/data pair in its +** table or index. If there are no more key/value pairs then fall through +** to the following instruction. But if the cursor advance was successful, +** jump immediately to P2. +** +** The Next opcode is only valid following an SeekGT, SeekGE, or +** OP_Rewind opcode used to position the cursor. Next is not allowed +** to follow SeekLT, SeekLE, or OP_Last. +** +** The P1 cursor must be for a real table, not a pseudo-table. P1 must have +** been opened prior to this opcode or the program will segfault. +** +** The P3 value is a hint to the btree implementation. If P3==1, that +** means P1 is an SQL index and that this instruction could have been +** omitted if that index had been unique. P3 is usually 0. P3 is +** always either 0 or 1. +** +** P4 is always of type P4_ADVANCE. The function pointer points to +** sqlite3BtreeNext(). +** +** If P5 is positive and the jump is taken, then event counter +** number P5-1 in the prepared statement is incremented. +** +** See also: Prev, NextIfOpen +*/ +/* Opcode: NextIfOpen P1 P2 P3 P4 P5 +** +** This opcode works just like Next except that if cursor P1 is not +** open it behaves a no-op. +*/ +/* Opcode: Prev P1 P2 P3 P4 P5 +** +** Back up cursor P1 so that it points to the previous key/data pair in its +** table or index. If there is no previous key/value pairs then fall through +** to the following instruction. But if the cursor backup was successful, +** jump immediately to P2. +** +** +** The Prev opcode is only valid following an SeekLT, SeekLE, or +** OP_Last opcode used to position the cursor. Prev is not allowed +** to follow SeekGT, SeekGE, or OP_Rewind. +** +** The P1 cursor must be for a real table, not a pseudo-table. If P1 is +** not open then the behavior is undefined. +** +** The P3 value is a hint to the btree implementation. If P3==1, that +** means P1 is an SQL index and that this instruction could have been +** omitted if that index had been unique. P3 is usually 0. P3 is +** always either 0 or 1. +** +** P4 is always of type P4_ADVANCE. The function pointer points to +** sqlite3BtreePrevious(). +** +** If P5 is positive and the jump is taken, then event counter +** number P5-1 in the prepared statement is incremented. +*/ +/* Opcode: PrevIfOpen P1 P2 P3 P4 P5 +** +** This opcode works just like Prev except that if cursor P1 is not +** open it behaves a no-op. +*/ +case OP_SorterNext: { /* jump */ + VdbeCursor *pC; + int res; + + pC = p->apCsr[pOp->p1]; + assert( isSorter(pC) ); + res = 0; + rc = sqlite3VdbeSorterNext(db, pC, &res); + goto next_tail; +case OP_PrevIfOpen: /* jump */ +case OP_NextIfOpen: /* jump */ + if( p->apCsr[pOp->p1]==0 ) break; + /* Fall through */ +case OP_Prev: /* jump */ +case OP_Next: /* jump */ + assert( pOp->p1>=0 && pOp->p1nCursor ); + assert( pOp->p5aCounter) ); + pC = p->apCsr[pOp->p1]; + res = pOp->p3; + assert( pC!=0 ); + assert( pC->deferredMoveto==0 ); + assert( pC->eCurType==CURTYPE_BTREE ); + assert( res==0 || (res==1 && pC->isTable==0) ); + testcase( res==1 ); + assert( pOp->opcode!=OP_Next || pOp->p4.xAdvance==sqlite3BtreeNext ); + assert( pOp->opcode!=OP_Prev || pOp->p4.xAdvance==sqlite3BtreePrevious ); + assert( pOp->opcode!=OP_NextIfOpen || pOp->p4.xAdvance==sqlite3BtreeNext ); + assert( pOp->opcode!=OP_PrevIfOpen || pOp->p4.xAdvance==sqlite3BtreePrevious); + + /* The Next opcode is only used after SeekGT, SeekGE, and Rewind. + ** The Prev opcode is only used after SeekLT, SeekLE, and Last. */ + assert( pOp->opcode!=OP_Next || pOp->opcode!=OP_NextIfOpen + || pC->seekOp==OP_SeekGT || pC->seekOp==OP_SeekGE + || pC->seekOp==OP_Rewind || pC->seekOp==OP_Found); + assert( pOp->opcode!=OP_Prev || pOp->opcode!=OP_PrevIfOpen + || pC->seekOp==OP_SeekLT || pC->seekOp==OP_SeekLE + || pC->seekOp==OP_Last ); + + rc = pOp->p4.xAdvance(pC->uc.pCursor, &res); +next_tail: + pC->cacheStatus = CACHE_STALE; + VdbeBranchTaken(res==0,2); + if( rc ) goto abort_due_to_error; + if( res==0 ){ + pC->nullRow = 0; + p->aCounter[pOp->p5]++; +#ifdef SQLITE_TEST + sqlite3_search_count++; +#endif + goto jump_to_p2_and_check_for_interrupt; + }else{ + pC->nullRow = 1; + } + goto check_for_interrupt; +} + +/* Opcode: IdxInsert P1 P2 P3 * P5 +** Synopsis: key=r[P2] +** +** Register P2 holds an SQL index key made using the +** MakeRecord instructions. This opcode writes that key +** into the index P1. Data for the entry is nil. +** +** P3 is a flag that provides a hint to the b-tree layer that this +** insert is likely to be an append. +** +** If P5 has the OPFLAG_NCHANGE bit set, then the change counter is +** incremented by this instruction. If the OPFLAG_NCHANGE bit is clear, +** then the change counter is unchanged. +** +** If P5 has the OPFLAG_USESEEKRESULT bit set, then the cursor must have +** just done a seek to the spot where the new entry is to be inserted. +** This flag avoids doing an extra seek. +** +** This instruction only works for indices. The equivalent instruction +** for tables is OP_Insert. +*/ +case OP_SorterInsert: /* in2 */ +case OP_IdxInsert: { /* in2 */ + VdbeCursor *pC; + BtreePayload x; + + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + assert( isSorter(pC)==(pOp->opcode==OP_SorterInsert) ); + pIn2 = &aMem[pOp->p2]; + assert( pIn2->flags & MEM_Blob ); + if( pOp->p5 & OPFLAG_NCHANGE ) p->nChange++; + assert( pC->eCurType==CURTYPE_BTREE || pOp->opcode==OP_SorterInsert ); + assert( pC->isTable==0 ); + rc = ExpandBlob(pIn2); + if( rc ) goto abort_due_to_error; + if( pOp->opcode==OP_SorterInsert ){ + rc = sqlite3VdbeSorterWrite(pC, pIn2); + }else{ + x.nKey = pIn2->n; + x.pKey = pIn2->z; + rc = sqlite3BtreeInsert(pC->uc.pCursor, &x, pOp->p3, + ((pOp->p5 & OPFLAG_USESEEKRESULT) ? pC->seekResult : 0) + ); + assert( pC->deferredMoveto==0 ); + pC->cacheStatus = CACHE_STALE; + } + if( rc) goto abort_due_to_error; + break; +} + +/* Opcode: IdxDelete P1 P2 P3 * * +** Synopsis: key=r[P2@P3] +** +** The content of P3 registers starting at register P2 form +** an unpacked index key. This opcode removes that entry from the +** index opened by cursor P1. +*/ +case OP_IdxDelete: { + VdbeCursor *pC; + BtCursor *pCrsr; + int res; + UnpackedRecord r; + + assert( pOp->p3>0 ); + assert( pOp->p2>0 && pOp->p2+pOp->p3<=(p->nMem+1 - p->nCursor)+1 ); + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + assert( pC->eCurType==CURTYPE_BTREE ); + pCrsr = pC->uc.pCursor; + assert( pCrsr!=0 ); + assert( pOp->p5==0 ); + r.pKeyInfo = pC->pKeyInfo; + r.nField = (u16)pOp->p3; + r.default_rc = 0; + r.aMem = &aMem[pOp->p2]; + rc = sqlite3BtreeMovetoUnpacked(pCrsr, &r, 0, 0, &res); + if( rc ) goto abort_due_to_error; + if( res==0 ){ + rc = sqlite3BtreeDelete(pCrsr, BTREE_AUXDELETE); + if( rc ) goto abort_due_to_error; + } + assert( pC->deferredMoveto==0 ); + pC->cacheStatus = CACHE_STALE; + break; +} + +/* Opcode: Seek P1 * P3 P4 * +** Synopsis: Move P3 to P1.rowid +** +** P1 is an open index cursor and P3 is a cursor on the corresponding +** table. This opcode does a deferred seek of the P3 table cursor +** to the row that corresponds to the current row of P1. +** +** This is a deferred seek. Nothing actually happens until +** the cursor is used to read a record. That way, if no reads +** occur, no unnecessary I/O happens. +** +** P4 may be an array of integers (type P4_INTARRAY) containing +** one entry for each column in the P3 table. If array entry a(i) +** is non-zero, then reading column a(i)-1 from cursor P3 is +** equivalent to performing the deferred seek and then reading column i +** from P1. This information is stored in P3 and used to redirect +** reads against P3 over to P1, thus possibly avoiding the need to +** seek and read cursor P3. +*/ +/* Opcode: IdxRowid P1 P2 * * * +** Synopsis: r[P2]=rowid +** +** Write into register P2 an integer which is the last entry in the record at +** the end of the index key pointed to by cursor P1. This integer should be +** the rowid of the table entry to which this index entry points. +** +** See also: Rowid, MakeRecord. +*/ +case OP_Seek: +case OP_IdxRowid: { /* out2 */ + VdbeCursor *pC; /* The P1 index cursor */ + VdbeCursor *pTabCur; /* The P2 table cursor (OP_Seek only) */ + i64 rowid; /* Rowid that P1 current points to */ + + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + assert( pC->eCurType==CURTYPE_BTREE ); + assert( pC->uc.pCursor!=0 ); + assert( pC->isTable==0 ); + assert( pC->deferredMoveto==0 ); + assert( !pC->nullRow || pOp->opcode==OP_IdxRowid ); + + /* The IdxRowid and Seek opcodes are combined because of the commonality + ** of sqlite3VdbeCursorRestore() and sqlite3VdbeIdxRowid(). */ + rc = sqlite3VdbeCursorRestore(pC); + + /* sqlite3VbeCursorRestore() can only fail if the record has been deleted + ** out from under the cursor. That will never happens for an IdxRowid + ** or Seek opcode */ + if( NEVER(rc!=SQLITE_OK) ) goto abort_due_to_error; + + if( !pC->nullRow ){ + rowid = 0; /* Not needed. Only used to silence a warning. */ + rc = sqlite3VdbeIdxRowid(db, pC->uc.pCursor, &rowid); + if( rc!=SQLITE_OK ){ + goto abort_due_to_error; + } + if( pOp->opcode==OP_Seek ){ + assert( pOp->p3>=0 && pOp->p3nCursor ); + pTabCur = p->apCsr[pOp->p3]; + assert( pTabCur!=0 ); + assert( pTabCur->eCurType==CURTYPE_BTREE ); + assert( pTabCur->uc.pCursor!=0 ); + assert( pTabCur->isTable ); + pTabCur->nullRow = 0; + pTabCur->movetoTarget = rowid; + pTabCur->deferredMoveto = 1; + assert( pOp->p4type==P4_INTARRAY || pOp->p4.ai==0 ); + pTabCur->aAltMap = pOp->p4.ai; + pTabCur->pAltCursor = pC; + }else{ + pOut = out2Prerelease(p, pOp); + pOut->u.i = rowid; + pOut->flags = MEM_Int; + } + }else{ + assert( pOp->opcode==OP_IdxRowid ); + sqlite3VdbeMemSetNull(&aMem[pOp->p2]); + } + break; +} + +/* Opcode: IdxGE P1 P2 P3 P4 P5 +** Synopsis: key=r[P3@P4] +** +** The P4 register values beginning with P3 form an unpacked index +** key that omits the PRIMARY KEY. Compare this key value against the index +** that P1 is currently pointing to, ignoring the PRIMARY KEY or ROWID +** fields at the end. +** +** If the P1 index entry is greater than or equal to the key value +** then jump to P2. Otherwise fall through to the next instruction. +*/ +/* Opcode: IdxGT P1 P2 P3 P4 P5 +** Synopsis: key=r[P3@P4] +** +** The P4 register values beginning with P3 form an unpacked index +** key that omits the PRIMARY KEY. Compare this key value against the index +** that P1 is currently pointing to, ignoring the PRIMARY KEY or ROWID +** fields at the end. +** +** If the P1 index entry is greater than the key value +** then jump to P2. Otherwise fall through to the next instruction. +*/ +/* Opcode: IdxLT P1 P2 P3 P4 P5 +** Synopsis: key=r[P3@P4] +** +** The P4 register values beginning with P3 form an unpacked index +** key that omits the PRIMARY KEY or ROWID. Compare this key value against +** the index that P1 is currently pointing to, ignoring the PRIMARY KEY or +** ROWID on the P1 index. +** +** If the P1 index entry is less than the key value then jump to P2. +** Otherwise fall through to the next instruction. +*/ +/* Opcode: IdxLE P1 P2 P3 P4 P5 +** Synopsis: key=r[P3@P4] +** +** The P4 register values beginning with P3 form an unpacked index +** key that omits the PRIMARY KEY or ROWID. Compare this key value against +** the index that P1 is currently pointing to, ignoring the PRIMARY KEY or +** ROWID on the P1 index. +** +** If the P1 index entry is less than or equal to the key value then jump +** to P2. Otherwise fall through to the next instruction. +*/ +case OP_IdxLE: /* jump */ +case OP_IdxGT: /* jump */ +case OP_IdxLT: /* jump */ +case OP_IdxGE: { /* jump */ + VdbeCursor *pC; + int res; + UnpackedRecord r; + + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + assert( pC->isOrdered ); + assert( pC->eCurType==CURTYPE_BTREE ); + assert( pC->uc.pCursor!=0); + assert( pC->deferredMoveto==0 ); + assert( pOp->p5==0 || pOp->p5==1 ); + assert( pOp->p4type==P4_INT32 ); + r.pKeyInfo = pC->pKeyInfo; + r.nField = (u16)pOp->p4.i; + if( pOp->opcodeopcode==OP_IdxLE || pOp->opcode==OP_IdxGT ); + r.default_rc = -1; + }else{ + assert( pOp->opcode==OP_IdxGE || pOp->opcode==OP_IdxLT ); + r.default_rc = 0; + } + r.aMem = &aMem[pOp->p3]; +#ifdef SQLITE_DEBUG + { int i; for(i=0; iopcode&1)==(OP_IdxLT&1) ){ + assert( pOp->opcode==OP_IdxLE || pOp->opcode==OP_IdxLT ); + res = -res; + }else{ + assert( pOp->opcode==OP_IdxGE || pOp->opcode==OP_IdxGT ); + res++; + } + VdbeBranchTaken(res>0,2); + if( rc ) goto abort_due_to_error; + if( res>0 ) goto jump_to_p2; + break; +} + +/* Opcode: Destroy P1 P2 P3 * * +** +** Delete an entire database table or index whose root page in the database +** file is given by P1. +** +** The table being destroyed is in the main database file if P3==0. If +** P3==1 then the table to be clear is in the auxiliary database file +** that is used to store tables create using CREATE TEMPORARY TABLE. +** +** If AUTOVACUUM is enabled then it is possible that another root page +** might be moved into the newly deleted root page in order to keep all +** root pages contiguous at the beginning of the database. The former +** value of the root page that moved - its value before the move occurred - +** is stored in register P2. If no page +** movement was required (because the table being dropped was already +** the last one in the database) then a zero is stored in register P2. +** If AUTOVACUUM is disabled then a zero is stored in register P2. +** +** See also: Clear +*/ +case OP_Destroy: { /* out2 */ + int iMoved; + int iDb; + + assert( p->readOnly==0 ); + assert( pOp->p1>1 ); + pOut = out2Prerelease(p, pOp); + pOut->flags = MEM_Null; + if( db->nVdbeRead > db->nVDestroy+1 ){ + rc = SQLITE_LOCKED; + p->errorAction = OE_Abort; + goto abort_due_to_error; + }else{ + iDb = pOp->p3; + assert( DbMaskTest(p->btreeMask, iDb) ); + iMoved = 0; /* Not needed. Only to silence a warning. */ + rc = sqlite3BtreeDropTable(db->aDb[iDb].pBt, pOp->p1, &iMoved); + pOut->flags = MEM_Int; + pOut->u.i = iMoved; + if( rc ) goto abort_due_to_error; +#ifndef SQLITE_OMIT_AUTOVACUUM + if( iMoved!=0 ){ + sqlite3RootPageMoved(db, iDb, iMoved, pOp->p1); + /* All OP_Destroy operations occur on the same btree */ + assert( resetSchemaOnFault==0 || resetSchemaOnFault==iDb+1 ); + resetSchemaOnFault = iDb+1; + } +#endif + } + break; +} + +/* Opcode: Clear P1 P2 P3 +** +** Delete all contents of the database table or index whose root page +** in the database file is given by P1. But, unlike Destroy, do not +** remove the table or index from the database file. +** +** The table being clear is in the main database file if P2==0. If +** P2==1 then the table to be clear is in the auxiliary database file +** that is used to store tables create using CREATE TEMPORARY TABLE. +** +** If the P3 value is non-zero, then the table referred to must be an +** intkey table (an SQL table, not an index). In this case the row change +** count is incremented by the number of rows in the table being cleared. +** If P3 is greater than zero, then the value stored in register P3 is +** also incremented by the number of rows in the table being cleared. +** +** See also: Destroy +*/ +case OP_Clear: { + int nChange; + + nChange = 0; + assert( p->readOnly==0 ); + assert( DbMaskTest(p->btreeMask, pOp->p2) ); + rc = sqlite3BtreeClearTable( + db->aDb[pOp->p2].pBt, pOp->p1, (pOp->p3 ? &nChange : 0) + ); + if( pOp->p3 ){ + p->nChange += nChange; + if( pOp->p3>0 ){ + assert( memIsValid(&aMem[pOp->p3]) ); + memAboutToChange(p, &aMem[pOp->p3]); + aMem[pOp->p3].u.i += nChange; + } + } + if( rc ) goto abort_due_to_error; + break; +} + +/* Opcode: ResetSorter P1 * * * * +** +** Delete all contents from the ephemeral table or sorter +** that is open on cursor P1. +** +** This opcode only works for cursors used for sorting and +** opened with OP_OpenEphemeral or OP_SorterOpen. +*/ +case OP_ResetSorter: { + VdbeCursor *pC; + + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + if( isSorter(pC) ){ + sqlite3VdbeSorterReset(db, pC->uc.pSorter); + }else{ + assert( pC->eCurType==CURTYPE_BTREE ); + assert( pC->isEphemeral ); + rc = sqlite3BtreeClearTableOfCursor(pC->uc.pCursor); + if( rc ) goto abort_due_to_error; + } + break; +} + +/* Opcode: CreateTable P1 P2 * * * +** Synopsis: r[P2]=root iDb=P1 +** +** Allocate a new table in the main database file if P1==0 or in the +** auxiliary database file if P1==1 or in an attached database if +** P1>1. Write the root page number of the new table into +** register P2 +** +** The difference between a table and an index is this: A table must +** have a 4-byte integer key and can have arbitrary data. An index +** has an arbitrary key but no data. +** +** See also: CreateIndex +*/ +/* Opcode: CreateIndex P1 P2 * * * +** Synopsis: r[P2]=root iDb=P1 +** +** Allocate a new index in the main database file if P1==0 or in the +** auxiliary database file if P1==1 or in an attached database if +** P1>1. Write the root page number of the new table into +** register P2. +** +** See documentation on OP_CreateTable for additional information. +*/ +case OP_CreateIndex: /* out2 */ +case OP_CreateTable: { /* out2 */ + int pgno; + int flags; + Db *pDb; + + pOut = out2Prerelease(p, pOp); + pgno = 0; + assert( pOp->p1>=0 && pOp->p1nDb ); + assert( DbMaskTest(p->btreeMask, pOp->p1) ); + assert( p->readOnly==0 ); + pDb = &db->aDb[pOp->p1]; + assert( pDb->pBt!=0 ); + if( pOp->opcode==OP_CreateTable ){ + /* flags = BTREE_INTKEY; */ + flags = BTREE_INTKEY; + }else{ + flags = BTREE_BLOBKEY; + } + rc = sqlite3BtreeCreateTable(pDb->pBt, &pgno, flags); + if( rc ) goto abort_due_to_error; + pOut->u.i = pgno; + break; +} + +/* Opcode: ParseSchema P1 * * P4 * +** +** Read and parse all entries from the SQLITE_MASTER table of database P1 +** that match the WHERE clause P4. +** +** This opcode invokes the parser to create a new virtual machine, +** then runs the new virtual machine. It is thus a re-entrant opcode. +*/ +case OP_ParseSchema: { + int iDb; + const char *zMaster; + char *zSql; + InitData initData; + + /* Any prepared statement that invokes this opcode will hold mutexes + ** on every btree. This is a prerequisite for invoking + ** sqlite3InitCallback(). + */ +#ifdef SQLITE_DEBUG + for(iDb=0; iDbnDb; iDb++){ + assert( iDb==1 || sqlite3BtreeHoldsMutex(db->aDb[iDb].pBt) ); + } +#endif + + iDb = pOp->p1; + assert( iDb>=0 && iDbnDb ); + assert( DbHasProperty(db, iDb, DB_SchemaLoaded) ); + /* Used to be a conditional */ { + zMaster = SCHEMA_TABLE(iDb); + initData.db = db; + initData.iDb = pOp->p1; + initData.pzErrMsg = &p->zErrMsg; + zSql = sqlite3MPrintf(db, + "SELECT name, rootpage, sql FROM '%q'.%s WHERE %s ORDER BY rowid", + db->aDb[iDb].zDbSName, zMaster, pOp->p4.z); + if( zSql==0 ){ + rc = SQLITE_NOMEM_BKPT; + }else{ + assert( db->init.busy==0 ); + db->init.busy = 1; + initData.rc = SQLITE_OK; + assert( !db->mallocFailed ); + rc = sqlite3_exec(db, zSql, sqlite3InitCallback, &initData, 0); + if( rc==SQLITE_OK ) rc = initData.rc; + sqlite3DbFree(db, zSql); + db->init.busy = 0; + } + } + if( rc ){ + sqlite3ResetAllSchemasOfConnection(db); + if( rc==SQLITE_NOMEM ){ + goto no_mem; + } + goto abort_due_to_error; + } + break; +} + +#if !defined(SQLITE_OMIT_ANALYZE) +/* Opcode: LoadAnalysis P1 * * * * +** +** Read the sqlite_stat1 table for database P1 and load the content +** of that table into the internal index hash table. This will cause +** the analysis to be used when preparing all subsequent queries. +*/ +case OP_LoadAnalysis: { + assert( pOp->p1>=0 && pOp->p1nDb ); + rc = sqlite3AnalysisLoad(db, pOp->p1); + if( rc ) goto abort_due_to_error; + break; +} +#endif /* !defined(SQLITE_OMIT_ANALYZE) */ + +/* Opcode: DropTable P1 * * P4 * +** +** Remove the internal (in-memory) data structures that describe +** the table named P4 in database P1. This is called after a table +** is dropped from disk (using the Destroy opcode) in order to keep +** the internal representation of the +** schema consistent with what is on disk. +*/ +case OP_DropTable: { + sqlite3UnlinkAndDeleteTable(db, pOp->p1, pOp->p4.z); + break; +} + +/* Opcode: DropIndex P1 * * P4 * +** +** Remove the internal (in-memory) data structures that describe +** the index named P4 in database P1. This is called after an index +** is dropped from disk (using the Destroy opcode) +** in order to keep the internal representation of the +** schema consistent with what is on disk. +*/ +case OP_DropIndex: { + sqlite3UnlinkAndDeleteIndex(db, pOp->p1, pOp->p4.z); + break; +} + +/* Opcode: DropTrigger P1 * * P4 * +** +** Remove the internal (in-memory) data structures that describe +** the trigger named P4 in database P1. This is called after a trigger +** is dropped from disk (using the Destroy opcode) in order to keep +** the internal representation of the +** schema consistent with what is on disk. +*/ +case OP_DropTrigger: { + sqlite3UnlinkAndDeleteTrigger(db, pOp->p1, pOp->p4.z); + break; +} + + +#ifndef SQLITE_OMIT_INTEGRITY_CHECK +/* Opcode: IntegrityCk P1 P2 P3 P4 P5 +** +** Do an analysis of the currently open database. Store in +** register P1 the text of an error message describing any problems. +** If no problems are found, store a NULL in register P1. +** +** The register P3 contains the maximum number of allowed errors. +** At most reg(P3) errors will be reported. +** In other words, the analysis stops as soon as reg(P1) errors are +** seen. Reg(P1) is updated with the number of errors remaining. +** +** The root page numbers of all tables in the database are integers +** stored in P4_INTARRAY argument. +** +** If P5 is not zero, the check is done on the auxiliary database +** file, not the main database file. +** +** This opcode is used to implement the integrity_check pragma. +*/ +case OP_IntegrityCk: { + int nRoot; /* Number of tables to check. (Number of root pages.) */ + int *aRoot; /* Array of rootpage numbers for tables to be checked */ + int nErr; /* Number of errors reported */ + char *z; /* Text of the error report */ + Mem *pnErr; /* Register keeping track of errors remaining */ + + assert( p->bIsReader ); + nRoot = pOp->p2; + aRoot = pOp->p4.ai; + assert( nRoot>0 ); + assert( aRoot[nRoot]==0 ); + assert( pOp->p3>0 && pOp->p3<=(p->nMem+1 - p->nCursor) ); + pnErr = &aMem[pOp->p3]; + assert( (pnErr->flags & MEM_Int)!=0 ); + assert( (pnErr->flags & (MEM_Str|MEM_Blob))==0 ); + pIn1 = &aMem[pOp->p1]; + assert( pOp->p5nDb ); + assert( DbMaskTest(p->btreeMask, pOp->p5) ); + z = sqlite3BtreeIntegrityCheck(db->aDb[pOp->p5].pBt, aRoot, nRoot, + (int)pnErr->u.i, &nErr); + pnErr->u.i -= nErr; + sqlite3VdbeMemSetNull(pIn1); + if( nErr==0 ){ + assert( z==0 ); + }else if( z==0 ){ + goto no_mem; + }else{ + sqlite3VdbeMemSetStr(pIn1, z, -1, SQLITE_UTF8, sqlite3_free); + } + UPDATE_MAX_BLOBSIZE(pIn1); + sqlite3VdbeChangeEncoding(pIn1, encoding); + break; +} +#endif /* SQLITE_OMIT_INTEGRITY_CHECK */ + +/* Opcode: RowSetAdd P1 P2 * * * +** Synopsis: rowset(P1)=r[P2] +** +** Insert the integer value held by register P2 into a boolean index +** held in register P1. +** +** An assertion fails if P2 is not an integer. +*/ +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; +} + +/* Opcode: RowSetRead P1 P2 P3 * * +** Synopsis: r[P3]=rowset(P1) +** +** Extract the smallest value from boolean index P1 and put that value into +** register P3. Or, if boolean index P1 is initially empty, leave P3 +** unchanged and jump to instruction P2. +*/ +case OP_RowSetRead: { /* jump, in1, out3 */ + i64 val; + + pIn1 = &aMem[pOp->p1]; + if( (pIn1->flags & MEM_RowSet)==0 + || sqlite3RowSetNext(pIn1->u.pRowSet, &val)==0 + ){ + /* The boolean index is empty */ + sqlite3VdbeMemSetNull(pIn1); + VdbeBranchTaken(1,2); + goto jump_to_p2_and_check_for_interrupt; + }else{ + /* A value was pulled from the index */ + VdbeBranchTaken(0,2); + sqlite3VdbeMemSetInt64(&aMem[pOp->p3], val); + } + goto check_for_interrupt; +} + +/* Opcode: RowSetTest P1 P2 P3 P4 +** Synopsis: if r[P3] in rowset(P1) goto P2 +** +** Register P3 is assumed to hold a 64-bit integer value. If register P1 +** contains a RowSet object and that RowSet object contains +** the value held in P3, jump to register P2. Otherwise, insert the +** integer in P3 into the RowSet and continue on to the +** next opcode. +** +** The RowSet object is optimized for the case where successive sets +** of integers, where each set contains no duplicates. Each set +** of values is identified by a unique P4 value. The first set +** must have P4==0, the final set P4=-1. P4 must be either -1 or +** non-negative. For non-negative values of P4 only the lower 4 +** bits are significant. +** +** This allows optimizations: (a) when P4==0 there is no need to test +** the rowset object for P3, as it is guaranteed not to contain it, +** (b) when P4==-1 there is no need to insert the value, as it will +** never be tested for, and (c) when a value that is part of set X is +** inserted, there is no need to search to see if the same value was +** previously inserted as part of set X (only if it was previously +** inserted as part of some other set). +*/ +case OP_RowSetTest: { /* jump, in1, in3 */ + int iSet; + int exists; + + pIn1 = &aMem[pOp->p1]; + pIn3 = &aMem[pOp->p3]; + iSet = pOp->p4.i; + assert( pIn3->flags&MEM_Int ); + + /* If there is anything other than a rowset object in memory cell P1, + ** delete it now and initialize P1 with an empty rowset + */ + if( (pIn1->flags & MEM_RowSet)==0 ){ + sqlite3VdbeMemSetRowSet(pIn1); + if( (pIn1->flags & MEM_RowSet)==0 ) goto no_mem; + } + + assert( pOp->p4type==P4_INT32 ); + assert( iSet==-1 || iSet>=0 ); + if( iSet ){ + exists = sqlite3RowSetTest(pIn1->u.pRowSet, iSet, pIn3->u.i); + VdbeBranchTaken(exists!=0,2); + if( exists ) goto jump_to_p2; + } + if( iSet>=0 ){ + sqlite3RowSetInsert(pIn1->u.pRowSet, pIn3->u.i); + } + break; +} + + +#ifndef SQLITE_OMIT_TRIGGER + +/* Opcode: Program P1 P2 P3 P4 P5 +** +** Execute the trigger program passed as P4 (type P4_SUBPROGRAM). +** +** P1 contains the address of the memory cell that contains the first memory +** cell in an array of values used as arguments to the sub-program. P2 +** contains the address to jump to if the sub-program throws an IGNORE +** exception using the RAISE() function. Register P3 contains the address +** of a memory cell in this (the parent) VM that is used to allocate the +** memory required by the sub-vdbe at runtime. +** +** P4 is a pointer to the VM containing the trigger program. +** +** If P5 is non-zero, then recursive program invocation is enabled. +*/ +case OP_Program: { /* jump */ + 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 */ + Mem *pMem; /* Used to iterate through memory cells */ + Mem *pEnd; /* Last memory cell in new array */ + VdbeFrame *pFrame; /* New vdbe frame to execute in */ + SubProgram *pProgram; /* Sub-program to execute */ + void *t; /* Token identifying trigger */ + + pProgram = pOp->p4.pProgram; + pRt = &aMem[pOp->p3]; + assert( 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 + ** is really a trigger, not a foreign key action, and the flag set + ** and cleared by the "PRAGMA recursive_triggers" command is clear). + ** + ** It is recursive invocation of triggers, at the SQL level, that is + ** disabled. In some cases a single trigger may generate more than one + ** SubProgram (if the trigger may be executed with more than one different + ** ON CONFLICT algorithm). SubProgram structures associated with a + ** single trigger all have the same value for the SubProgram.token + ** variable. */ + if( pOp->p5 ){ + t = pProgram->token; + for(pFrame=p->pFrame; pFrame && pFrame->token!=t; pFrame=pFrame->pParent); + if( pFrame ) break; + } + + if( p->nFrame>=db->aLimit[SQLITE_LIMIT_TRIGGER_DEPTH] ){ + rc = SQLITE_ERROR; + sqlite3VdbeError(p, "too many levels of trigger recursion"); + goto abort_due_to_error; + } + + /* Register 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 pRt + ** is already allocated. Otherwise, it must be initialized. */ + if( (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 nMem (and later, VdbeFrame.nChildMem) to this value. + */ + nMem = pProgram->nMem + pProgram->nCsr; + assert( nMem>0 ); + if( pProgram->nCsr==0 ) nMem++; + nByte = ROUND8(sizeof(VdbeFrame)) + + nMem * sizeof(Mem) + + pProgram->nCsr * sizeof(VdbeCursor *); + pFrame = sqlite3DbMallocZero(db, nByte); + if( !pFrame ){ + goto no_mem; + } + sqlite3VdbeMemRelease(pRt); + pRt->flags = MEM_Frame; + pRt->u.pFrame = pFrame; + + pFrame->v = p; + pFrame->nChildMem = nMem; + pFrame->nChildCsr = pProgram->nCsr; + pFrame->pc = (int)(pOp - aOp); + pFrame->aMem = p->aMem; + pFrame->nMem = p->nMem; + pFrame->apCsr = p->apCsr; + pFrame->nCursor = p->nCursor; + pFrame->aOp = p->aOp; + pFrame->nOp = p->nOp; + pFrame->token = pProgram->token; +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS + pFrame->anExec = p->anExec; +#endif + + pEnd = &VdbeFrameMem(pFrame)[pFrame->nChildMem]; + for(pMem=VdbeFrameMem(pFrame); pMem!=pEnd; pMem++){ + pMem->flags = MEM_Undefined; + pMem->db = db; + } + }else{ + pFrame = pRt->u.pFrame; + assert( pProgram->nMem+pProgram->nCsr==pFrame->nChildMem + || (pProgram->nCsr==0 && pProgram->nMem+1==pFrame->nChildMem) ); + assert( pProgram->nCsr==pFrame->nChildCsr ); + assert( (int)(pOp - aOp)==pFrame->pc ); + } + + p->nFrame++; + pFrame->pParent = p->pFrame; + pFrame->lastRowid = lastRowid; + pFrame->nChange = p->nChange; + pFrame->nDbChange = p->db->nChange; + assert( pFrame->pAuxData==0 ); + pFrame->pAuxData = p->pAuxData; + p->pAuxData = 0; + p->nChange = 0; + p->pFrame = pFrame; + p->aMem = aMem = VdbeFrameMem(pFrame); + p->nMem = pFrame->nChildMem; + p->nCursor = (u16)pFrame->nChildCsr; + p->apCsr = (VdbeCursor **)&aMem[p->nMem]; + p->aOp = aOp = pProgram->aOp; + p->nOp = pProgram->nOp; +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS + p->anExec = 0; +#endif + pOp = &aOp[-1]; + + break; +} + +/* Opcode: Param P1 P2 * * * +** +** This opcode is only ever present in sub-programs called via the +** OP_Program instruction. Copy a value currently stored in a memory +** cell of the calling (parent) frame to cell P2 in the current frames +** address space. This is used by trigger programs to access the new.* +** and old.* values. +** +** The address of the cell in the parent frame is determined by adding +** the value of the P1 argument to the value of the P1 argument to the +** calling OP_Program instruction. +*/ +case OP_Param: { /* out2 */ + VdbeFrame *pFrame; + Mem *pIn; + pOut = out2Prerelease(p, pOp); + pFrame = p->pFrame; + pIn = &pFrame->aMem[pOp->p1 + pFrame->aOp[pFrame->pc].p1]; + sqlite3VdbeMemShallowCopy(pOut, pIn, MEM_Ephem); + break; +} + +#endif /* #ifndef SQLITE_OMIT_TRIGGER */ + +#ifndef SQLITE_OMIT_FOREIGN_KEY +/* Opcode: FkCounter P1 P2 * * * +** Synopsis: fkctr[P1]+=P2 +** +** Increment a "constraint counter" by P2 (P2 may be negative or positive). +** If P1 is non-zero, the database constraint counter is incremented +** (deferred foreign key constraints). Otherwise, if P1 is zero, the +** statement counter is incremented (immediate foreign key constraints). +*/ +case OP_FkCounter: { + if( db->flags & SQLITE_DeferFKs ){ + db->nDeferredImmCons += pOp->p2; + }else if( pOp->p1 ){ + db->nDeferredCons += pOp->p2; + }else{ + p->nFkConstraint += pOp->p2; + } + break; +} + +/* Opcode: FkIfZero P1 P2 * * * +** Synopsis: if fkctr[P1]==0 goto P2 +** +** This opcode tests if a foreign key constraint-counter is currently zero. +** If so, jump to instruction P2. Otherwise, fall through to the next +** instruction. +** +** If P1 is non-zero, then the jump is taken if the database constraint-counter +** is zero (the one that counts deferred constraint violations). If P1 is +** zero, the jump is taken if the statement constraint-counter is zero +** (immediate foreign key constraint violations). +*/ +case OP_FkIfZero: { /* jump */ + if( pOp->p1 ){ + VdbeBranchTaken(db->nDeferredCons==0 && db->nDeferredImmCons==0, 2); + if( db->nDeferredCons==0 && db->nDeferredImmCons==0 ) goto jump_to_p2; + }else{ + VdbeBranchTaken(p->nFkConstraint==0 && db->nDeferredImmCons==0, 2); + if( p->nFkConstraint==0 && db->nDeferredImmCons==0 ) goto jump_to_p2; + } + break; +} +#endif /* #ifndef SQLITE_OMIT_FOREIGN_KEY */ + +#ifndef SQLITE_OMIT_AUTOINCREMENT +/* Opcode: MemMax P1 P2 * * * +** Synopsis: r[P1]=max(r[P1],r[P2]) +** +** P1 is a register in the root frame of this VM (the root frame is +** different from the current frame if this instruction is being executed +** within a sub-program). Set the value of register P1 to the maximum of +** its current value and the value in register P2. +** +** This instruction throws an error if the memory cell is not initially +** an integer. +*/ +case OP_MemMax: { /* in2 */ + VdbeFrame *pFrame; + if( p->pFrame ){ + for(pFrame=p->pFrame; pFrame->pParent; pFrame=pFrame->pParent); + pIn1 = &pFrame->aMem[pOp->p1]; + }else{ + pIn1 = &aMem[pOp->p1]; + } + assert( memIsValid(pIn1) ); + sqlite3VdbeMemIntegerify(pIn1); + pIn2 = &aMem[pOp->p2]; + sqlite3VdbeMemIntegerify(pIn2); + if( pIn1->u.iu.i){ + pIn1->u.i = pIn2->u.i; + } + break; +} +#endif /* SQLITE_OMIT_AUTOINCREMENT */ + +/* Opcode: IfPos P1 P2 P3 * * +** Synopsis: if r[P1]>0 then r[P1]-=P3, goto P2 +** +** Register P1 must contain an integer. +** If the value of register P1 is 1 or greater, subtract P3 from the +** value in P1 and jump to P2. +** +** If the initial value of register P1 is less than 1, then the +** value is unchanged and control passes through to the next instruction. +*/ +case OP_IfPos: { /* jump, in1 */ + pIn1 = &aMem[pOp->p1]; + assert( pIn1->flags&MEM_Int ); + VdbeBranchTaken( pIn1->u.i>0, 2); + if( pIn1->u.i>0 ){ + pIn1->u.i -= pOp->p3; + goto jump_to_p2; + } + break; +} + +/* Opcode: OffsetLimit P1 P2 P3 * * +** Synopsis: if r[P1]>0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1) +** +** This opcode performs a commonly used computation associated with +** LIMIT and OFFSET process. r[P1] holds the limit counter. r[P3] +** holds the offset counter. The opcode computes the combined value +** of the LIMIT and OFFSET and stores that value in r[P2]. The r[P2] +** value computed is the total number of rows that will need to be +** visited in order to complete the query. +** +** If r[P3] is zero or negative, that means there is no OFFSET +** and r[P2] is set to be the value of the LIMIT, r[P1]. +** +** if r[P1] is zero or negative, that means there is no LIMIT +** and r[P2] is set to -1. +** +** Otherwise, r[P2] is set to the sum of r[P1] and r[P3]. +*/ +case OP_OffsetLimit: { /* in1, out2, in3 */ + pIn1 = &aMem[pOp->p1]; + pIn3 = &aMem[pOp->p3]; + pOut = out2Prerelease(p, pOp); + assert( pIn1->flags & MEM_Int ); + assert( pIn3->flags & MEM_Int ); + pOut->u.i = pIn1->u.i<=0 ? -1 : pIn1->u.i+(pIn3->u.i>0?pIn3->u.i:0); + break; +} + +/* Opcode: IfNotZero P1 P2 P3 * * +** Synopsis: if r[P1]!=0 then r[P1]-=P3, goto P2 +** +** Register P1 must contain an integer. If the content of register P1 is +** initially nonzero, then subtract P3 from the value in register P1 and +** jump to P2. If register P1 is initially zero, leave it unchanged +** and fall through. +*/ +case OP_IfNotZero: { /* jump, in1 */ + pIn1 = &aMem[pOp->p1]; + assert( pIn1->flags&MEM_Int ); + VdbeBranchTaken(pIn1->u.i<0, 2); + if( pIn1->u.i ){ + pIn1->u.i -= pOp->p3; + goto jump_to_p2; + } + break; +} + +/* Opcode: DecrJumpZero P1 P2 * * * +** Synopsis: if (--r[P1])==0 goto P2 +** +** Register P1 must hold an integer. Decrement the value in register P1 +** then jump to P2 if the new value is exactly zero. +*/ +case OP_DecrJumpZero: { /* jump, in1 */ + pIn1 = &aMem[pOp->p1]; + assert( pIn1->flags&MEM_Int ); + pIn1->u.i--; + VdbeBranchTaken(pIn1->u.i==0, 2); + if( pIn1->u.i==0 ) goto jump_to_p2; + break; +} + + +/* Opcode: AggStep0 * P2 P3 P4 P5 +** Synopsis: accum=r[P3] step(r[P2@P5]) +** +** Execute the step function for an aggregate. The +** function has P5 arguments. P4 is a pointer to the FuncDef +** structure that specifies the function. Register P3 is the +** accumulator. +** +** The P5 arguments are taken from register P2 and its +** successors. +*/ +/* Opcode: AggStep * P2 P3 P4 P5 +** Synopsis: accum=r[P3] step(r[P2@P5]) +** +** Execute the step function for an aggregate. The +** function has P5 arguments. P4 is a pointer to an sqlite3_context +** object that is used to run the function. Register P3 is +** as the accumulator. +** +** The P5 arguments are taken from register P2 and its +** successors. +** +** This opcode is initially coded as OP_AggStep0. On first evaluation, +** the FuncDef stored in P4 is converted into an sqlite3_context and +** the opcode is changed. In this way, the initialization of the +** sqlite3_context only happens once, instead of on each call to the +** step function. +*/ +case OP_AggStep0: { + int n; + sqlite3_context *pCtx; + + assert( pOp->p4type==P4_FUNCDEF ); + n = pOp->p5; + assert( pOp->p3>0 && pOp->p3<=(p->nMem+1 - p->nCursor) ); + assert( n==0 || (pOp->p2>0 && pOp->p2+n<=(p->nMem+1 - p->nCursor)+1) ); + assert( pOp->p3p2 || pOp->p3>=pOp->p2+n ); + pCtx = sqlite3DbMallocRawNN(db, sizeof(*pCtx) + (n-1)*sizeof(sqlite3_value*)); + if( pCtx==0 ) goto no_mem; + pCtx->pMem = 0; + pCtx->pFunc = pOp->p4.pFunc; + pCtx->iOp = (int)(pOp - aOp); + pCtx->pVdbe = p; + pCtx->argc = n; + pOp->p4type = P4_FUNCCTX; + pOp->p4.pCtx = pCtx; + pOp->opcode = OP_AggStep; + /* Fall through into OP_AggStep */ +} +case OP_AggStep: { + int i; + sqlite3_context *pCtx; + Mem *pMem; + Mem t; + + assert( pOp->p4type==P4_FUNCCTX ); + pCtx = pOp->p4.pCtx; + pMem = &aMem[pOp->p3]; + + /* If this function is inside of a trigger, the register array in aMem[] + ** might change from one evaluation to the next. The next block of code + ** checks to see if the register array has changed, and if so it + ** reinitializes the relavant parts of the sqlite3_context object */ + if( pCtx->pMem != pMem ){ + pCtx->pMem = pMem; + for(i=pCtx->argc-1; i>=0; i--) pCtx->argv[i] = &aMem[pOp->p2+i]; + } + +#ifdef SQLITE_DEBUG + for(i=0; iargc; i++){ + assert( memIsValid(pCtx->argv[i]) ); + REGISTER_TRACE(pOp->p2+i, pCtx->argv[i]); + } +#endif + + pMem->n++; + sqlite3VdbeMemInit(&t, db, MEM_Null); + pCtx->pOut = &t; + pCtx->fErrorOrAux = 0; + pCtx->skipFlag = 0; + (pCtx->pFunc->xSFunc)(pCtx,pCtx->argc,pCtx->argv); /* IMP: R-24505-23230 */ + if( pCtx->fErrorOrAux ){ + if( pCtx->isError ){ + sqlite3VdbeError(p, "%s", sqlite3_value_text(&t)); + rc = pCtx->isError; + } + sqlite3VdbeMemRelease(&t); + if( rc ) goto abort_due_to_error; + }else{ + assert( t.flags==MEM_Null ); + } + if( pCtx->skipFlag ){ + assert( pOp[-1].opcode==OP_CollSeq ); + i = pOp[-1].p1; + if( i ) sqlite3VdbeMemSetInt64(&aMem[i], 1); + } + break; +} + +/* Opcode: AggFinal P1 P2 * P4 * +** Synopsis: accum=r[P1] N=P2 +** +** Execute the finalizer function for an aggregate. P1 is +** the memory location that is the accumulator for the aggregate. +** +** P2 is the number of arguments that the step function takes and +** P4 is a pointer to the FuncDef for this function. The P2 +** argument is not used by this opcode. It is only there to disambiguate +** functions that can take varying numbers of arguments. The +** P4 argument is only needed for the degenerate case where +** the step function was not previously called. +*/ +case OP_AggFinal: { + Mem *pMem; + assert( pOp->p1>0 && pOp->p1<=(p->nMem+1 - p->nCursor) ); + pMem = &aMem[pOp->p1]; + assert( (pMem->flags & ~(MEM_Null|MEM_Agg))==0 ); + rc = sqlite3VdbeMemFinalize(pMem, pOp->p4.pFunc); + if( rc ){ + sqlite3VdbeError(p, "%s", sqlite3_value_text(pMem)); + goto abort_due_to_error; + } + sqlite3VdbeChangeEncoding(pMem, encoding); + UPDATE_MAX_BLOBSIZE(pMem); + if( sqlite3VdbeMemTooBig(pMem) ){ + goto too_big; + } + break; +} + +#ifndef SQLITE_OMIT_WAL +/* Opcode: Checkpoint P1 P2 P3 * * +** +** Checkpoint database P1. This is a no-op if P1 is not currently in +** WAL mode. Parameter P2 is one of SQLITE_CHECKPOINT_PASSIVE, FULL, +** RESTART, or TRUNCATE. Write 1 or 0 into mem[P3] if the checkpoint returns +** SQLITE_BUSY or not, respectively. Write the number of pages in the +** WAL after the checkpoint into mem[P3+1] and the number of pages +** in the WAL that have been checkpointed after the checkpoint +** completes into mem[P3+2]. However on an error, mem[P3+1] and +** mem[P3+2] are initialized to -1. +*/ +case OP_Checkpoint: { + int i; /* Loop counter */ + int aRes[3]; /* Results */ + Mem *pMem; /* Write results here */ + + assert( p->readOnly==0 ); + aRes[0] = 0; + aRes[1] = aRes[2] = -1; + assert( pOp->p2==SQLITE_CHECKPOINT_PASSIVE + || pOp->p2==SQLITE_CHECKPOINT_FULL + || pOp->p2==SQLITE_CHECKPOINT_RESTART + || pOp->p2==SQLITE_CHECKPOINT_TRUNCATE + ); + rc = sqlite3Checkpoint(db, pOp->p1, pOp->p2, &aRes[1], &aRes[2]); + if( rc ){ + if( rc!=SQLITE_BUSY ) goto abort_due_to_error; + rc = SQLITE_OK; + aRes[0] = 1; + } + for(i=0, pMem = &aMem[pOp->p3]; i<3; i++, pMem++){ + sqlite3VdbeMemSetInt64(pMem, (i64)aRes[i]); + } + break; +}; +#endif + +#ifndef SQLITE_OMIT_PRAGMA +/* Opcode: JournalMode P1 P2 P3 * * +** +** Change the journal mode of database P1 to P3. P3 must be one of the +** PAGER_JOURNALMODE_XXX values. If changing between the various rollback +** modes (delete, truncate, persist, off and memory), this is a simple +** operation. No IO is required. +** +** If changing into or out of WAL mode the procedure is more complicated. +** +** Write a string containing the final journal-mode to register P2. +*/ +case OP_JournalMode: { /* out2 */ + Btree *pBt; /* Btree to change journal mode of */ + Pager *pPager; /* Pager associated with pBt */ + int eNew; /* New journal mode */ + int eOld; /* The old journal mode */ +#ifndef SQLITE_OMIT_WAL + const char *zFilename; /* Name of database file for pPager */ +#endif + + pOut = out2Prerelease(p, pOp); + eNew = pOp->p3; + assert( eNew==PAGER_JOURNALMODE_DELETE + || eNew==PAGER_JOURNALMODE_TRUNCATE + || eNew==PAGER_JOURNALMODE_PERSIST + || eNew==PAGER_JOURNALMODE_OFF + || eNew==PAGER_JOURNALMODE_MEMORY + || eNew==PAGER_JOURNALMODE_WAL + || eNew==PAGER_JOURNALMODE_QUERY + ); + assert( pOp->p1>=0 && pOp->p1nDb ); + assert( p->readOnly==0 ); + + pBt = db->aDb[pOp->p1].pBt; + pPager = sqlite3BtreePager(pBt); + eOld = sqlite3PagerGetJournalMode(pPager); + if( eNew==PAGER_JOURNALMODE_QUERY ) eNew = eOld; + if( !sqlite3PagerOkToChangeJournalMode(pPager) ) eNew = eOld; + +#ifndef SQLITE_OMIT_WAL + zFilename = sqlite3PagerFilename(pPager, 1); + + /* Do not allow a transition to journal_mode=WAL for a database + ** in temporary storage or if the VFS does not support shared memory + */ + if( eNew==PAGER_JOURNALMODE_WAL + && (sqlite3Strlen30(zFilename)==0 /* Temp file */ + || !sqlite3PagerWalSupported(pPager)) /* No shared-memory support */ + ){ + eNew = eOld; + } + + if( (eNew!=eOld) + && (eOld==PAGER_JOURNALMODE_WAL || eNew==PAGER_JOURNALMODE_WAL) + ){ + if( !db->autoCommit || db->nVdbeRead>1 ){ + rc = SQLITE_ERROR; + sqlite3VdbeError(p, + "cannot change %s wal mode from within a transaction", + (eNew==PAGER_JOURNALMODE_WAL ? "into" : "out of") + ); + goto abort_due_to_error; + }else{ + + if( eOld==PAGER_JOURNALMODE_WAL ){ + /* If leaving WAL mode, close the log file. If successful, the call + ** to PagerCloseWal() checkpoints and deletes the write-ahead-log + ** file. An EXCLUSIVE lock may still be held on the database file + ** after a successful return. + */ + rc = sqlite3PagerCloseWal(pPager); + if( rc==SQLITE_OK ){ + sqlite3PagerSetJournalMode(pPager, eNew); + } + }else if( eOld==PAGER_JOURNALMODE_MEMORY ){ + /* Cannot transition directly from MEMORY to WAL. Use mode OFF + ** as an intermediate */ + sqlite3PagerSetJournalMode(pPager, PAGER_JOURNALMODE_OFF); + } + + /* Open a transaction on the database file. Regardless of the journal + ** mode, this transaction always uses a rollback journal. + */ + assert( sqlite3BtreeIsInTrans(pBt)==0 ); + if( rc==SQLITE_OK ){ + rc = sqlite3BtreeSetVersion(pBt, (eNew==PAGER_JOURNALMODE_WAL ? 2 : 1)); + } + } + } +#endif /* ifndef SQLITE_OMIT_WAL */ + + if( rc ) eNew = eOld; + eNew = sqlite3PagerSetJournalMode(pPager, eNew); + + pOut->flags = MEM_Str|MEM_Static|MEM_Term; + pOut->z = (char *)sqlite3JournalModename(eNew); + pOut->n = sqlite3Strlen30(pOut->z); + pOut->enc = SQLITE_UTF8; + sqlite3VdbeChangeEncoding(pOut, encoding); + if( rc ) goto abort_due_to_error; + break; +}; +#endif /* SQLITE_OMIT_PRAGMA */ + +#if !defined(SQLITE_OMIT_VACUUM) && !defined(SQLITE_OMIT_ATTACH) +/* Opcode: Vacuum P1 * * * * +** +** Vacuum the entire database P1. P1 is 0 for "main", and 2 or more +** for an attached database. The "temp" database may not be vacuumed. +*/ +case OP_Vacuum: { + assert( p->readOnly==0 ); + rc = sqlite3RunVacuum(&p->zErrMsg, db, pOp->p1); + if( rc ) goto abort_due_to_error; + break; +} +#endif + +#if !defined(SQLITE_OMIT_AUTOVACUUM) +/* Opcode: IncrVacuum P1 P2 * * * +** +** Perform a single step of the incremental vacuum procedure on +** the P1 database. If the vacuum has finished, jump to instruction +** P2. Otherwise, fall through to the next instruction. +*/ +case OP_IncrVacuum: { /* jump */ + Btree *pBt; + + assert( pOp->p1>=0 && pOp->p1nDb ); + assert( DbMaskTest(p->btreeMask, pOp->p1) ); + assert( p->readOnly==0 ); + pBt = db->aDb[pOp->p1].pBt; + rc = sqlite3BtreeIncrVacuum(pBt); + VdbeBranchTaken(rc==SQLITE_DONE,2); + if( rc ){ + if( rc!=SQLITE_DONE ) goto abort_due_to_error; + rc = SQLITE_OK; + goto jump_to_p2; + } + break; +} +#endif + +/* Opcode: Expire P1 * * * * +** +** Cause precompiled statements to expire. When an expired statement +** is executed using sqlite3_step() it will either automatically +** reprepare itself (if it was originally created using sqlite3_prepare_v2()) +** or it will fail with SQLITE_SCHEMA. +** +** If P1 is 0, then all SQL statements become expired. If P1 is non-zero, +** then only the currently executing statement is expired. +*/ +case OP_Expire: { + if( !pOp->p1 ){ + sqlite3ExpirePreparedStatements(db); + }else{ + p->expired = 1; + } + break; +} + +#ifndef SQLITE_OMIT_SHARED_CACHE +/* Opcode: TableLock P1 P2 P3 P4 * +** Synopsis: iDb=P1 root=P2 write=P3 +** +** Obtain a lock on a particular table. This instruction is only used when +** the shared-cache feature is enabled. +** +** P1 is the index of the database in sqlite3.aDb[] of the database +** on which the lock is acquired. A readlock is obtained if P3==0 or +** a write lock if P3==1. +** +** P2 contains the root-page of the table to lock. +** +** P4 contains a pointer to the name of the table being locked. This is only +** used to generate an error message if the lock cannot be obtained. +*/ +case OP_TableLock: { + u8 isWriteLock = (u8)pOp->p3; + if( isWriteLock || 0==(db->flags&SQLITE_ReadUncommitted) ){ + int p1 = pOp->p1; + assert( p1>=0 && p1nDb ); + assert( DbMaskTest(p->btreeMask, p1) ); + assert( isWriteLock==0 || isWriteLock==1 ); + rc = sqlite3BtreeLockTable(db->aDb[p1].pBt, pOp->p2, isWriteLock); + if( rc ){ + if( (rc&0xFF)==SQLITE_LOCKED ){ + const char *z = pOp->p4.z; + sqlite3VdbeError(p, "database table is locked: %s", z); + } + goto abort_due_to_error; + } + } + break; +} +#endif /* SQLITE_OMIT_SHARED_CACHE */ + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* Opcode: VBegin * * * P4 * +** +** P4 may be a pointer to an sqlite3_vtab structure. If so, call the +** xBegin method for that table. +** +** Also, whether or not P4 is set, check that this is not being called from +** within a callback to a virtual table xSync() method. If it is, the error +** code will be set to SQLITE_LOCKED. +*/ +case OP_VBegin: { + VTable *pVTab; + pVTab = pOp->p4.pVtab; + rc = sqlite3VtabBegin(db, pVTab); + if( pVTab ) sqlite3VtabImportErrmsg(p, pVTab->pVtab); + if( rc ) goto abort_due_to_error; + break; +} +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* Opcode: VCreate P1 P2 * * * +** +** P2 is a register that holds the name of a virtual table in database +** P1. Call the xCreate method for that table. +*/ +case OP_VCreate: { + Mem sMem; /* For storing the record being decoded */ + const char *zTab; /* Name of the virtual table */ + + memset(&sMem, 0, sizeof(sMem)); + sMem.db = db; + /* Because P2 is always a static string, it is impossible for the + ** sqlite3VdbeMemCopy() to fail */ + assert( (aMem[pOp->p2].flags & MEM_Str)!=0 ); + assert( (aMem[pOp->p2].flags & MEM_Static)!=0 ); + rc = sqlite3VdbeMemCopy(&sMem, &aMem[pOp->p2]); + assert( rc==SQLITE_OK ); + zTab = (const char*)sqlite3_value_text(&sMem); + assert( zTab || db->mallocFailed ); + if( zTab ){ + rc = sqlite3VtabCallCreate(db, pOp->p1, zTab, &p->zErrMsg); + } + sqlite3VdbeMemRelease(&sMem); + if( rc ) goto abort_due_to_error; + break; +} +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* Opcode: VDestroy P1 * * P4 * +** +** P4 is the name of a virtual table in database P1. Call the xDestroy method +** of that table. +*/ +case OP_VDestroy: { + db->nVDestroy++; + rc = sqlite3VtabCallDestroy(db, pOp->p1, pOp->p4.z); + db->nVDestroy--; + if( rc ) goto abort_due_to_error; + break; +} +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* Opcode: VOpen P1 * * P4 * +** +** P4 is a pointer to a virtual table object, an sqlite3_vtab structure. +** P1 is a cursor number. This opcode opens a cursor to the virtual +** table and stores that cursor in P1. +*/ +case OP_VOpen: { + VdbeCursor *pCur; + sqlite3_vtab_cursor *pVCur; + sqlite3_vtab *pVtab; + const sqlite3_module *pModule; + + assert( p->bIsReader ); + pCur = 0; + pVCur = 0; + pVtab = pOp->p4.pVtab->pVtab; + if( pVtab==0 || NEVER(pVtab->pModule==0) ){ + rc = SQLITE_LOCKED; + goto abort_due_to_error; + } + pModule = pVtab->pModule; + rc = pModule->xOpen(pVtab, &pVCur); + sqlite3VtabImportErrmsg(p, pVtab); + if( rc ) goto abort_due_to_error; + + /* Initialize sqlite3_vtab_cursor base class */ + pVCur->pVtab = pVtab; + + /* Initialize vdbe cursor object */ + pCur = allocateCursor(p, pOp->p1, 0, -1, CURTYPE_VTAB); + if( pCur ){ + pCur->uc.pVCur = pVCur; + pVtab->nRef++; + }else{ + assert( db->mallocFailed ); + pModule->xClose(pVCur); + goto no_mem; + } + break; +} +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* Opcode: VFilter P1 P2 P3 P4 * +** Synopsis: iplan=r[P3] zplan='P4' +** +** P1 is a cursor opened using VOpen. P2 is an address to jump to if +** the filtered result set is empty. +** +** P4 is either NULL or a string that was generated by the xBestIndex +** method of the module. The interpretation of the P4 string is left +** to the module implementation. +** +** This opcode invokes the xFilter method on the virtual table specified +** by P1. The integer query plan parameter to xFilter is stored in register +** P3. Register P3+1 stores the argc parameter to be passed to the +** xFilter method. Registers P3+2..P3+1+argc are the argc +** additional parameters which are passed to +** xFilter as argv. Register P3+2 becomes argv[0] when passed to xFilter. +** +** A jump is made to P2 if the result set after filtering would be empty. +*/ +case OP_VFilter: { /* jump */ + int nArg; + int iQuery; + const sqlite3_module *pModule; + Mem *pQuery; + Mem *pArgc; + sqlite3_vtab_cursor *pVCur; + sqlite3_vtab *pVtab; + VdbeCursor *pCur; + int res; + int i; + Mem **apArg; + + pQuery = &aMem[pOp->p3]; + pArgc = &pQuery[1]; + pCur = p->apCsr[pOp->p1]; + assert( memIsValid(pQuery) ); + REGISTER_TRACE(pOp->p3, pQuery); + assert( pCur->eCurType==CURTYPE_VTAB ); + pVCur = pCur->uc.pVCur; + pVtab = pVCur->pVtab; + pModule = pVtab->pModule; + + /* Grab the index number and argc parameters */ + assert( (pQuery->flags&MEM_Int)!=0 && pArgc->flags==MEM_Int ); + nArg = (int)pArgc->u.i; + iQuery = (int)pQuery->u.i; + + /* Invoke the xFilter method */ + res = 0; + apArg = p->apArg; + for(i = 0; ixFilter(pVCur, iQuery, pOp->p4.z, nArg, apArg); + sqlite3VtabImportErrmsg(p, pVtab); + if( rc ) goto abort_due_to_error; + res = pModule->xEof(pVCur); + pCur->nullRow = 0; + VdbeBranchTaken(res!=0,2); + if( res ) goto jump_to_p2; + break; +} +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* Opcode: VColumn P1 P2 P3 * * +** Synopsis: r[P3]=vcolumn(P2) +** +** Store the value of the P2-th column of +** the row of the virtual-table that the +** P1 cursor is pointing to into register P3. +*/ +case OP_VColumn: { + sqlite3_vtab *pVtab; + const sqlite3_module *pModule; + Mem *pDest; + sqlite3_context sContext; + + VdbeCursor *pCur = p->apCsr[pOp->p1]; + assert( pCur->eCurType==CURTYPE_VTAB ); + assert( pOp->p3>0 && pOp->p3<=(p->nMem+1 - p->nCursor) ); + pDest = &aMem[pOp->p3]; + memAboutToChange(p, pDest); + if( pCur->nullRow ){ + sqlite3VdbeMemSetNull(pDest); + break; + } + pVtab = pCur->uc.pVCur->pVtab; + pModule = pVtab->pModule; + assert( pModule->xColumn ); + memset(&sContext, 0, sizeof(sContext)); + sContext.pOut = pDest; + MemSetTypeFlag(pDest, MEM_Null); + rc = pModule->xColumn(pCur->uc.pVCur, &sContext, pOp->p2); + sqlite3VtabImportErrmsg(p, pVtab); + if( sContext.isError ){ + rc = sContext.isError; + } + sqlite3VdbeChangeEncoding(pDest, encoding); + REGISTER_TRACE(pOp->p3, pDest); + UPDATE_MAX_BLOBSIZE(pDest); + + if( sqlite3VdbeMemTooBig(pDest) ){ + goto too_big; + } + if( rc ) goto abort_due_to_error; + break; +} +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* Opcode: VNext P1 P2 * * * +** +** Advance virtual table P1 to the next row in its result set and +** jump to instruction P2. Or, if the virtual table has reached +** the end of its result set, then fall through to the next instruction. +*/ +case OP_VNext: { /* jump */ + sqlite3_vtab *pVtab; + const sqlite3_module *pModule; + int res; + VdbeCursor *pCur; + + res = 0; + pCur = p->apCsr[pOp->p1]; + assert( pCur->eCurType==CURTYPE_VTAB ); + if( pCur->nullRow ){ + break; + } + pVtab = pCur->uc.pVCur->pVtab; + pModule = pVtab->pModule; + assert( 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 + ** xNext(). Instead, if an error occurs, true is returned (indicating that + ** data is available) and the error code returned when xColumn or + ** some other method is next invoked on the save virtual table cursor. + */ + rc = pModule->xNext(pCur->uc.pVCur); + sqlite3VtabImportErrmsg(p, pVtab); + if( rc ) goto abort_due_to_error; + res = pModule->xEof(pCur->uc.pVCur); + VdbeBranchTaken(!res,2); + if( !res ){ + /* If there is data, jump to P2 */ + goto jump_to_p2_and_check_for_interrupt; + } + goto check_for_interrupt; +} +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* Opcode: VRename P1 * * P4 * +** +** P4 is a pointer to a virtual table object, an sqlite3_vtab structure. +** This opcode invokes the corresponding xRename method. The value +** in register P1 is passed as the zName argument to the xRename method. +*/ +case OP_VRename: { + sqlite3_vtab *pVtab; + Mem *pName; + + pVtab = pOp->p4.pVtab->pVtab; + pName = &aMem[pOp->p1]; + assert( pVtab->pModule->xRename ); + assert( memIsValid(pName) ); + assert( p->readOnly==0 ); + REGISTER_TRACE(pOp->p1, pName); + assert( pName->flags & MEM_Str ); + testcase( pName->enc==SQLITE_UTF8 ); + testcase( pName->enc==SQLITE_UTF16BE ); + testcase( pName->enc==SQLITE_UTF16LE ); + rc = sqlite3VdbeChangeEncoding(pName, SQLITE_UTF8); + if( rc ) goto abort_due_to_error; + rc = pVtab->pModule->xRename(pVtab, pName->z); + sqlite3VtabImportErrmsg(p, pVtab); + p->expired = 0; + if( rc ) goto abort_due_to_error; + break; +} +#endif + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* Opcode: VUpdate P1 P2 P3 P4 P5 +** Synopsis: data=r[P3@P2] +** +** P4 is a pointer to a virtual table object, an sqlite3_vtab structure. +** This opcode invokes the corresponding xUpdate method. P2 values +** are contiguous memory cells starting at P3 to pass to the xUpdate +** invocation. The value in register (P3+P2-1) corresponds to the +** p2th element of the argv array passed to xUpdate. +** +** The xUpdate method will do a DELETE or an INSERT or both. +** The argv[0] element (which corresponds to memory cell P3) +** is the rowid of a row to delete. If argv[0] is NULL then no +** deletion occurs. The argv[1] element is the rowid of the new +** row. This can be NULL to have the virtual table select the new +** rowid for itself. The subsequent elements in the array are +** the values of columns in the new row. +** +** If P2==1 then no insert is performed. argv[0] is the rowid of +** a row to delete. +** +** P1 is a boolean flag. If it is set to true and the xUpdate call +** is successful, then the value returned by sqlite3_last_insert_rowid() +** is set to the value of the rowid for the row just inserted. +** +** P5 is the error actions (OE_Replace, OE_Fail, OE_Ignore, etc) to +** apply in the case of a constraint failure on an insert or update. +*/ +case OP_VUpdate: { + sqlite3_vtab *pVtab; + const sqlite3_module *pModule; + int nArg; + int i; + sqlite_int64 rowid; + Mem **apArg; + Mem *pX; + + assert( pOp->p2==1 || pOp->p5==OE_Fail || pOp->p5==OE_Rollback + || pOp->p5==OE_Abort || pOp->p5==OE_Ignore || pOp->p5==OE_Replace + ); + assert( p->readOnly==0 ); + pVtab = pOp->p4.pVtab->pVtab; + if( pVtab==0 || NEVER(pVtab->pModule==0) ){ + rc = SQLITE_LOCKED; + goto abort_due_to_error; + } + pModule = pVtab->pModule; + nArg = pOp->p2; + assert( pOp->p4type==P4_VTAB ); + if( ALWAYS(pModule->xUpdate) ){ + u8 vtabOnConflict = db->vtabOnConflict; + apArg = p->apArg; + pX = &aMem[pOp->p3]; + for(i=0; ivtabOnConflict = pOp->p5; + rc = pModule->xUpdate(pVtab, nArg, apArg, &rowid); + db->vtabOnConflict = vtabOnConflict; + sqlite3VtabImportErrmsg(p, pVtab); + if( rc==SQLITE_OK && pOp->p1 ){ + assert( nArg>1 && apArg[0] && (apArg[0]->flags&MEM_Null) ); + db->lastRowid = lastRowid = rowid; + } + if( (rc&0xff)==SQLITE_CONSTRAINT && pOp->p4.pVtab->bConstraint ){ + if( pOp->p5==OE_Ignore ){ + rc = SQLITE_OK; + }else{ + p->errorAction = ((pOp->p5==OE_Replace) ? OE_Abort : pOp->p5); + } + }else{ + p->nChange++; + } + if( rc ) goto abort_due_to_error; + } + break; +} +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + +#ifndef SQLITE_OMIT_PAGER_PRAGMAS +/* Opcode: Pagecount P1 P2 * * * +** +** Write the current number of pages in database P1 to memory cell P2. +*/ +case OP_Pagecount: { /* out2 */ + pOut = out2Prerelease(p, pOp); + pOut->u.i = sqlite3BtreeLastPage(db->aDb[pOp->p1].pBt); + break; +} +#endif + + +#ifndef SQLITE_OMIT_PAGER_PRAGMAS +/* Opcode: MaxPgcnt P1 P2 P3 * * +** +** Try to set the maximum page count for database P1 to the value in P3. +** Do not let the maximum page count fall below the current page count and +** do not change the maximum page count value if P3==0. +** +** Store the maximum page count after the change in register P2. +*/ +case OP_MaxPgcnt: { /* out2 */ + unsigned int newMax; + Btree *pBt; + + pOut = out2Prerelease(p, pOp); + pBt = db->aDb[pOp->p1].pBt; + newMax = 0; + if( pOp->p3 ){ + newMax = sqlite3BtreeLastPage(pBt); + if( newMax < (unsigned)pOp->p3 ) newMax = (unsigned)pOp->p3; + } + pOut->u.i = sqlite3BtreeMaxPageCount(pBt, newMax); + break; +} +#endif + + +/* Opcode: Init P1 P2 * P4 * +** Synopsis: Start at P2 +** +** Programs contain a single instance of this opcode as the very first +** opcode. +** +** If tracing is enabled (by the sqlite3_trace()) interface, then +** the UTF-8 string contained in P4 is emitted on the trace callback. +** Or if P4 is blank, use the string returned by sqlite3_sql(). +** +** If P2 is not zero, jump to instruction P2. +** +** Increment the value of P1 so that OP_Once opcodes will jump the +** first time they are evaluated for this run. +*/ +case OP_Init: { /* jump */ + char *zTrace; + int i; + + /* If the P4 argument is not NULL, then it must be an SQL comment string. + ** The "--" string is broken up to prevent false-positives with srcck1.c. + ** + ** This assert() provides evidence for: + ** EVIDENCE-OF: R-50676-09860 The callback can compute the same text that + ** would have been returned by the legacy sqlite3_trace() interface by + ** using the X argument when X begins with "--" and invoking + ** sqlite3_expanded_sql(P) otherwise. + */ + assert( pOp->p4.z==0 || strncmp(pOp->p4.z, "-" "- ", 3)==0 ); + assert( pOp==p->aOp ); /* Always instruction 0 */ + +#ifndef SQLITE_OMIT_TRACE + if( (db->mTrace & (SQLITE_TRACE_STMT|SQLITE_TRACE_LEGACY))!=0 + && !p->doingRerun + && (zTrace = (pOp->p4.z ? pOp->p4.z : p->zSql))!=0 + ){ +#ifndef SQLITE_OMIT_DEPRECATED + if( db->mTrace & SQLITE_TRACE_LEGACY ){ + void (*x)(void*,const char*) = (void(*)(void*,const char*))db->xTrace; + char *z = sqlite3VdbeExpandSql(p, zTrace); + x(db->pTraceArg, z); + sqlite3_free(z); + }else +#endif + { + (void)db->xTrace(SQLITE_TRACE_STMT, db->pTraceArg, p, zTrace); + } + } +#ifdef SQLITE_USE_FCNTL_TRACE + zTrace = (pOp->p4.z ? pOp->p4.z : p->zSql); + if( zTrace ){ + int j; + for(j=0; jnDb; j++){ + if( DbMaskTest(p->btreeMask, j)==0 ) continue; + sqlite3_file_control(db, db->aDb[j].zDbSName, SQLITE_FCNTL_TRACE, zTrace); + } + } +#endif /* SQLITE_USE_FCNTL_TRACE */ +#ifdef SQLITE_DEBUG + if( (db->flags & SQLITE_SqlTrace)!=0 + && (zTrace = (pOp->p4.z ? pOp->p4.z : p->zSql))!=0 + ){ + sqlite3DebugPrintf("SQL-trace: %s\n", zTrace); + } +#endif /* SQLITE_DEBUG */ +#endif /* SQLITE_OMIT_TRACE */ + assert( pOp->p2>0 ); + if( pOp->p1>=sqlite3GlobalConfig.iOnceResetThreshold ){ + for(i=1; inOp; i++){ + if( p->aOp[i].opcode==OP_Once ) p->aOp[i].p1 = 0; + } + pOp->p1 = 0; + } + pOp->p1++; + goto jump_to_p2; +} + +#ifdef SQLITE_ENABLE_CURSOR_HINTS +/* Opcode: CursorHint P1 * * P4 * +** +** Provide a hint to cursor P1 that it only needs to return rows that +** satisfy the Expr in P4. TK_REGISTER terms in the P4 expression refer +** to values currently held in registers. TK_COLUMN terms in the P4 +** expression refer to columns in the b-tree to which cursor P1 is pointing. +*/ +case OP_CursorHint: { + VdbeCursor *pC; + + assert( pOp->p1>=0 && pOp->p1nCursor ); + assert( pOp->p4type==P4_EXPR ); + pC = p->apCsr[pOp->p1]; + if( pC ){ + assert( pC->eCurType==CURTYPE_BTREE ); + sqlite3BtreeCursorHint(pC->uc.pCursor, BTREE_HINT_RANGE, + pOp->p4.pExpr, aMem); + } + break; +} +#endif /* SQLITE_ENABLE_CURSOR_HINTS */ + +/* Opcode: Noop * * * * * +** +** Do nothing. This instruction is often useful as a jump +** destination. +*/ +/* +** The magic Explain opcode are only inserted when explain==2 (which +** is to say when the EXPLAIN QUERY PLAN syntax is used.) +** This opcode records information from the optimizer. It is the +** the same as a no-op. This opcodesnever appears in a real VM program. +*/ +default: { /* This is really OP_Noop and OP_Explain */ + assert( pOp->opcode==OP_Noop || pOp->opcode==OP_Explain ); + break; +} + +/***************************************************************************** +** The cases of the switch statement above this line should all be indented +** by 6 spaces. But the left-most 6 spaces have been removed to improve the +** readability. From this point on down, the normal indentation rules are +** restored. +*****************************************************************************/ + } + +#ifdef VDBE_PROFILE + { + u64 endTime = sqlite3Hwtime(); + if( endTime>start ) pOrigOp->cycles += endTime - start; + pOrigOp->cnt++; + } +#endif + + /* The following code adds nothing to the actual functionality + ** of the program. It is only here for testing and debugging. + ** On the other hand, it does burn CPU cycles every time through + ** the evaluator loop. So we can leave it out when NDEBUG is defined. + */ +#ifndef NDEBUG + assert( pOp>=&aOp[-1] && pOp<&aOp[p->nOp-1] ); + +#ifdef SQLITE_DEBUG + if( db->flags & SQLITE_VdbeTrace ){ + u8 opProperty = sqlite3OpcodeProperty[pOrigOp->opcode]; + if( rc!=0 ) printf("rc=%d\n",rc); + if( opProperty & (OPFLG_OUT2) ){ + registerTrace(pOrigOp->p2, &aMem[pOrigOp->p2]); + } + if( opProperty & OPFLG_OUT3 ){ + registerTrace(pOrigOp->p3, &aMem[pOrigOp->p3]); + } + } +#endif /* SQLITE_DEBUG */ +#endif /* NDEBUG */ + } /* The end of the for(;;) loop the loops through opcodes */ + + /* If we reach this point, it means that execution is finished with + ** an error of some kind. + */ +abort_due_to_error: + if( db->mallocFailed ) rc = SQLITE_NOMEM_BKPT; + assert( rc ); + if( p->zErrMsg==0 && rc!=SQLITE_IOERR_NOMEM ){ + sqlite3VdbeError(p, "%s", sqlite3ErrStr(rc)); + } + p->rc = rc; + sqlite3SystemError(db, rc); + testcase( sqlite3GlobalConfig.xLog!=0 ); + sqlite3_log(rc, "statement aborts at %d: [%s] %s", + (int)(pOp - aOp), p->zSql, p->zErrMsg); + sqlite3VdbeHalt(p); + if( rc==SQLITE_IOERR_NOMEM ) sqlite3OomFault(db); + rc = SQLITE_ERROR; + if( resetSchemaOnFault>0 ){ + sqlite3ResetOneSchema(db, resetSchemaOnFault-1); + } + + /* This is the only way out of this procedure. We have to + ** release the mutexes on btrees that were acquired at the + ** top. */ +vdbe_return: + db->lastRowid = lastRowid; + testcase( nVmStep>0 ); + p->aCounter[SQLITE_STMTSTATUS_VM_STEP] += (int)nVmStep; + sqlite3VdbeLeave(p); + assert( rc!=SQLITE_OK || nExtraDelete==0 + || sqlite3_strlike("DELETE%",p->zSql,0)!=0 + ); + return rc; + + /* Jump to here if a string or blob larger than SQLITE_MAX_LENGTH + ** is encountered. + */ +too_big: + sqlite3VdbeError(p, "string or blob too big"); + rc = SQLITE_TOOBIG; + goto abort_due_to_error; + + /* Jump to here if a malloc() fails. + */ +no_mem: + sqlite3OomFault(db); + sqlite3VdbeError(p, "out of memory"); + rc = SQLITE_NOMEM_BKPT; + goto abort_due_to_error; + + /* Jump to here if the sqlite3_interrupt() API sets the interrupt + ** flag. + */ +abort_due_to_interrupt: + assert( db->u1.isInterrupted ); + rc = db->mallocFailed ? SQLITE_NOMEM_BKPT : SQLITE_INTERRUPT; + p->rc = rc; + sqlite3VdbeError(p, "%s", sqlite3ErrStr(rc)); + goto abort_due_to_error; +} + + +/************** End of vdbe.c ************************************************/ +/************** Begin file vdbeblob.c ****************************************/ +/* +** 2007 May 1 +** +** 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 implement incremental BLOB I/O. +*/ + +/* #include "sqliteInt.h" */ +/* #include "vdbeInt.h" */ + +#ifndef SQLITE_OMIT_INCRBLOB + +/* +** Valid sqlite3_blob* handles point to Incrblob structures. +*/ +typedef struct Incrblob Incrblob; +struct Incrblob { + int flags; /* Copy of "flags" passed to sqlite3_blob_open() */ + int nByte; /* Size of open blob, in bytes */ + int iOffset; /* Byte offset of blob in cursor data */ + int iCol; /* Table column this handle is open on */ + BtCursor *pCsr; /* Cursor pointing at blob row */ + sqlite3_stmt *pStmt; /* Statement holding cursor open */ + sqlite3 *db; /* The associated database */ + char *zDb; /* Database name */ + Table *pTab; /* Table object */ +}; + + +/* +** This function is used by both blob_open() and blob_reopen(). It seeks +** the b-tree cursor associated with blob handle p to point to row iRow. +** If successful, SQLITE_OK is returned and subsequent calls to +** sqlite3_blob_read() or sqlite3_blob_write() access the specified row. +** +** If an error occurs, or if the specified row does not exist or does not +** contain a value of type TEXT or BLOB in the column nominated when the +** blob handle was opened, then an error code is returned and *pzErr may +** be set to point to a buffer containing an error message. It is the +** responsibility of the caller to free the error message buffer using +** sqlite3DbFree(). +** +** If an error does occur, then the b-tree cursor is closed. All subsequent +** calls to sqlite3_blob_read(), blob_write() or blob_reopen() will +** immediately return SQLITE_ABORT. +*/ +static int blobSeekToRow(Incrblob *p, sqlite3_int64 iRow, char **pzErr){ + int rc; /* Error code */ + char *zErr = 0; /* Error message */ + Vdbe *v = (Vdbe *)p->pStmt; + + /* Set the value of the SQL statements only variable to integer iRow. + ** This is done directly instead of using sqlite3_bind_int64() to avoid + ** triggering asserts related to mutexes. + */ + assert( v->aVar[0].flags&MEM_Int ); + v->aVar[0].u.i = iRow; + + rc = sqlite3_step(p->pStmt); + if( rc==SQLITE_ROW ){ + VdbeCursor *pC = v->apCsr[0]; + u32 type = pC->aType[p->iCol]; + if( type<12 ){ + zErr = sqlite3MPrintf(p->db, "cannot open value of type %s", + type==0?"null": type==7?"real": "integer" + ); + rc = SQLITE_ERROR; + sqlite3_finalize(p->pStmt); + p->pStmt = 0; + }else{ + p->iOffset = pC->aType[p->iCol + pC->nField]; + p->nByte = sqlite3VdbeSerialTypeLen(type); + p->pCsr = pC->uc.pCursor; + sqlite3BtreeIncrblobCursor(p->pCsr); + } + } + + if( rc==SQLITE_ROW ){ + rc = SQLITE_OK; + }else if( p->pStmt ){ + rc = sqlite3_finalize(p->pStmt); + p->pStmt = 0; + if( rc==SQLITE_OK ){ + zErr = sqlite3MPrintf(p->db, "no such rowid: %lld", iRow); + rc = SQLITE_ERROR; + }else{ + zErr = sqlite3MPrintf(p->db, "%s", sqlite3_errmsg(p->db)); + } + } + + assert( rc!=SQLITE_OK || zErr==0 ); + assert( rc!=SQLITE_ROW && rc!=SQLITE_DONE ); + + *pzErr = zErr; + return rc; +} + +/* +** Open a blob handle. +*/ +SQLITE_API int sqlite3_blob_open( + sqlite3* db, /* The database connection */ + const char *zDb, /* The attached database containing the blob */ + const char *zTable, /* The table containing the blob */ + const char *zColumn, /* The column containing the blob */ + sqlite_int64 iRow, /* The row containing the glob */ + int flags, /* True -> read/write access, false -> read-only */ + sqlite3_blob **ppBlob /* Handle for accessing the blob returned here */ +){ + int nAttempt = 0; + int iCol; /* Index of zColumn in row-record */ + int rc = SQLITE_OK; + char *zErr = 0; + Table *pTab; + Parse *pParse = 0; + Incrblob *pBlob = 0; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( ppBlob==0 ){ + return SQLITE_MISUSE_BKPT; + } +#endif + *ppBlob = 0; +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) || zTable==0 ){ + return SQLITE_MISUSE_BKPT; + } +#endif + flags = !!flags; /* flags = (flags ? 1 : 0); */ + + sqlite3_mutex_enter(db->mutex); + + pBlob = (Incrblob *)sqlite3DbMallocZero(db, sizeof(Incrblob)); + if( !pBlob ) goto blob_open_out; + pParse = sqlite3StackAllocRaw(db, sizeof(*pParse)); + if( !pParse ) goto blob_open_out; + + do { + memset(pParse, 0, sizeof(Parse)); + pParse->db = db; + sqlite3DbFree(db, zErr); + zErr = 0; + + sqlite3BtreeEnterAll(db); + pTab = sqlite3LocateTable(pParse, 0, zTable, zDb); + if( pTab && IsVirtual(pTab) ){ + pTab = 0; + sqlite3ErrorMsg(pParse, "cannot open virtual table: %s", zTable); + } + if( pTab && !HasRowid(pTab) ){ + pTab = 0; + sqlite3ErrorMsg(pParse, "cannot open table without rowid: %s", zTable); + } +#ifndef SQLITE_OMIT_VIEW + if( pTab && pTab->pSelect ){ + pTab = 0; + sqlite3ErrorMsg(pParse, "cannot open view: %s", zTable); + } +#endif + if( !pTab ){ + if( pParse->zErrMsg ){ + sqlite3DbFree(db, zErr); + zErr = pParse->zErrMsg; + pParse->zErrMsg = 0; + } + rc = SQLITE_ERROR; + sqlite3BtreeLeaveAll(db); + goto blob_open_out; + } + pBlob->pTab = pTab; + pBlob->zDb = db->aDb[sqlite3SchemaToIndex(db, pTab->pSchema)].zDbSName; + + /* Now search pTab for the exact column. */ + for(iCol=0; iColnCol; iCol++) { + if( sqlite3StrICmp(pTab->aCol[iCol].zName, zColumn)==0 ){ + break; + } + } + if( iCol==pTab->nCol ){ + sqlite3DbFree(db, zErr); + zErr = sqlite3MPrintf(db, "no such column: \"%s\"", zColumn); + rc = SQLITE_ERROR; + sqlite3BtreeLeaveAll(db); + goto blob_open_out; + } + + /* If the value is being opened for writing, check that the + ** column is not indexed, and that it is not part of a foreign key. + ** It is against the rules to open a column to which either of these + ** descriptions applies for writing. */ + if( flags ){ + const char *zFault = 0; + Index *pIdx; +#ifndef SQLITE_OMIT_FOREIGN_KEY + if( db->flags&SQLITE_ForeignKeys ){ + /* Check that the column is not part of an FK child key definition. It + ** is not necessary to check if it is part of a parent key, as parent + ** key columns must be indexed. The check below will pick up this + ** case. */ + FKey *pFKey; + for(pFKey=pTab->pFKey; pFKey; pFKey=pFKey->pNextFrom){ + int j; + for(j=0; jnCol; j++){ + if( pFKey->aCol[j].iFrom==iCol ){ + zFault = "foreign key"; + } + } + } + } +#endif + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + int j; + for(j=0; jnKeyCol; j++){ + /* FIXME: Be smarter about indexes that use expressions */ + if( pIdx->aiColumn[j]==iCol || pIdx->aiColumn[j]==XN_EXPR ){ + zFault = "indexed"; + } + } + } + if( zFault ){ + sqlite3DbFree(db, zErr); + zErr = sqlite3MPrintf(db, "cannot open %s column for writing", zFault); + rc = SQLITE_ERROR; + sqlite3BtreeLeaveAll(db); + goto blob_open_out; + } + } + + pBlob->pStmt = (sqlite3_stmt *)sqlite3VdbeCreate(pParse); + assert( pBlob->pStmt || db->mallocFailed ); + if( pBlob->pStmt ){ + + /* This VDBE program seeks a btree cursor to the identified + ** db/table/row entry. The reason for using a vdbe program instead + ** of writing code to use the b-tree layer directly is that the + ** vdbe program will take advantage of the various transaction, + ** locking and error handling infrastructure built into the vdbe. + ** + ** After seeking the cursor, the vdbe executes an OP_ResultRow. + ** Code external to the Vdbe then "borrows" the b-tree cursor and + ** uses it to implement the blob_read(), blob_write() and + ** blob_bytes() functions. + ** + ** The sqlite3_blob_close() function finalizes the vdbe program, + ** which closes the b-tree cursor and (possibly) commits the + ** transaction. + */ + static const int iLn = VDBE_OFFSET_LINENO(2); + static const VdbeOpList openBlob[] = { + {OP_TableLock, 0, 0, 0}, /* 0: Acquire a read or write lock */ + {OP_OpenRead, 0, 0, 0}, /* 1: Open a cursor */ + {OP_Variable, 1, 1, 0}, /* 2: Move ?1 into reg[1] */ + {OP_NotExists, 0, 7, 1}, /* 3: Seek the cursor */ + {OP_Column, 0, 0, 1}, /* 4 */ + {OP_ResultRow, 1, 0, 0}, /* 5 */ + {OP_Goto, 0, 2, 0}, /* 6 */ + {OP_Close, 0, 0, 0}, /* 7 */ + {OP_Halt, 0, 0, 0}, /* 8 */ + }; + Vdbe *v = (Vdbe *)pBlob->pStmt; + int iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + VdbeOp *aOp; + + sqlite3VdbeAddOp4Int(v, OP_Transaction, iDb, flags, + pTab->pSchema->schema_cookie, + pTab->pSchema->iGeneration); + sqlite3VdbeChangeP5(v, 1); + aOp = sqlite3VdbeAddOpList(v, ArraySize(openBlob), openBlob, iLn); + + /* Make sure a mutex is held on the table to be accessed */ + sqlite3VdbeUsesBtree(v, iDb); + + if( db->mallocFailed==0 ){ + assert( aOp!=0 ); + /* Configure the OP_TableLock instruction */ +#ifdef SQLITE_OMIT_SHARED_CACHE + aOp[0].opcode = OP_Noop; +#else + aOp[0].p1 = iDb; + aOp[0].p2 = pTab->tnum; + aOp[0].p3 = flags; + sqlite3VdbeChangeP4(v, 1, pTab->zName, P4_TRANSIENT); + } + if( db->mallocFailed==0 ){ +#endif + + /* Remove either the OP_OpenWrite or OpenRead. Set the P2 + ** parameter of the other to pTab->tnum. */ + if( flags ) aOp[1].opcode = OP_OpenWrite; + aOp[1].p2 = pTab->tnum; + aOp[1].p3 = iDb; + + /* Configure the number of columns. Configure the cursor to + ** think that the table has one more column than it really + ** does. An OP_Column to retrieve this imaginary column will + ** always return an SQL NULL. This is useful because it means + ** we can invoke OP_Column to fill in the vdbe cursors type + ** and offset cache without causing any IO. + */ + aOp[1].p4type = P4_INT32; + aOp[1].p4.i = pTab->nCol+1; + aOp[4].p2 = pTab->nCol; + + pParse->nVar = 1; + pParse->nMem = 1; + pParse->nTab = 1; + sqlite3VdbeMakeReady(v, pParse); + } + } + + pBlob->flags = flags; + pBlob->iCol = iCol; + pBlob->db = db; + sqlite3BtreeLeaveAll(db); + if( db->mallocFailed ){ + goto blob_open_out; + } + sqlite3_bind_int64(pBlob->pStmt, 1, iRow); + rc = blobSeekToRow(pBlob, iRow, &zErr); + } while( (++nAttempt)mallocFailed==0 ){ + *ppBlob = (sqlite3_blob *)pBlob; + }else{ + if( pBlob && pBlob->pStmt ) sqlite3VdbeFinalize((Vdbe *)pBlob->pStmt); + sqlite3DbFree(db, pBlob); + } + sqlite3ErrorWithMsg(db, rc, (zErr ? "%s" : 0), zErr); + sqlite3DbFree(db, zErr); + sqlite3ParserReset(pParse); + sqlite3StackFree(db, pParse); + rc = sqlite3ApiExit(db, rc); + sqlite3_mutex_leave(db->mutex); + return rc; +} + +/* +** Close a blob handle that was previously created using +** sqlite3_blob_open(). +*/ +SQLITE_API int sqlite3_blob_close(sqlite3_blob *pBlob){ + Incrblob *p = (Incrblob *)pBlob; + int rc; + sqlite3 *db; + + if( p ){ + db = p->db; + sqlite3_mutex_enter(db->mutex); + rc = sqlite3_finalize(p->pStmt); + sqlite3DbFree(db, p); + sqlite3_mutex_leave(db->mutex); + }else{ + rc = SQLITE_OK; + } + return rc; +} + +/* +** Perform a read or write operation on a blob +*/ +static int blobReadWrite( + sqlite3_blob *pBlob, + void *z, + int n, + int iOffset, + int (*xCall)(BtCursor*, u32, u32, void*) +){ + int rc; + Incrblob *p = (Incrblob *)pBlob; + Vdbe *v; + sqlite3 *db; + + if( p==0 ) return SQLITE_MISUSE_BKPT; + db = p->db; + sqlite3_mutex_enter(db->mutex); + v = (Vdbe*)p->pStmt; + + if( n<0 || iOffset<0 || ((sqlite3_int64)iOffset+n)>p->nByte ){ + /* Request is out of range. Return a transient error. */ + rc = SQLITE_ERROR; + }else if( v==0 ){ + /* If there is no statement handle, then the blob-handle has + ** already been invalidated. Return SQLITE_ABORT in this case. + */ + rc = SQLITE_ABORT; + }else{ + /* Call either BtreeData() or BtreePutData(). If SQLITE_ABORT is + ** returned, clean-up the statement handle. + */ + assert( db == v->db ); + sqlite3BtreeEnterCursor(p->pCsr); + +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + if( xCall==sqlite3BtreePutData && db->xPreUpdateCallback ){ + /* If a pre-update hook is registered and this is a write cursor, + ** invoke it here. + ** + ** TODO: The preupdate-hook is passed SQLITE_DELETE, even though this + ** operation should really be an SQLITE_UPDATE. This is probably + ** incorrect, but is convenient because at this point the new.* values + ** are not easily obtainable. And for the sessions module, an + ** SQLITE_UPDATE where the PK columns do not change is handled in the + ** same way as an SQLITE_DELETE (the SQLITE_DELETE code is actually + ** slightly more efficient). Since you cannot write to a PK column + ** using the incremental-blob API, this works. For the sessions module + ** anyhow. + */ + sqlite3_int64 iKey; + iKey = sqlite3BtreeIntegerKey(p->pCsr); + sqlite3VdbePreUpdateHook( + v, v->apCsr[0], SQLITE_DELETE, p->zDb, p->pTab, iKey, -1 + ); + } +#endif + + rc = xCall(p->pCsr, iOffset+p->iOffset, n, z); + sqlite3BtreeLeaveCursor(p->pCsr); + if( rc==SQLITE_ABORT ){ + sqlite3VdbeFinalize(v); + p->pStmt = 0; + }else{ + v->rc = rc; + } + } + sqlite3Error(db, rc); + rc = sqlite3ApiExit(db, rc); + sqlite3_mutex_leave(db->mutex); + return rc; +} + +/* +** Read data from a blob handle. +*/ +SQLITE_API int sqlite3_blob_read(sqlite3_blob *pBlob, void *z, int n, int iOffset){ + return blobReadWrite(pBlob, z, n, iOffset, sqlite3BtreeData); +} + +/* +** Write data to a blob handle. +*/ +SQLITE_API int sqlite3_blob_write(sqlite3_blob *pBlob, const void *z, int n, int iOffset){ + return blobReadWrite(pBlob, (void *)z, n, iOffset, sqlite3BtreePutData); +} + +/* +** Query a blob handle for the size of the data. +** +** The Incrblob.nByte field is fixed for the lifetime of the Incrblob +** so no mutex is required for access. +*/ +SQLITE_API int sqlite3_blob_bytes(sqlite3_blob *pBlob){ + Incrblob *p = (Incrblob *)pBlob; + return (p && p->pStmt) ? p->nByte : 0; +} + +/* +** Move an existing blob handle to point to a different row of the same +** database table. +** +** If an error occurs, or if the specified row does not exist or does not +** contain a blob or text value, then an error code is returned and the +** database handle error code and message set. If this happens, then all +** subsequent calls to sqlite3_blob_xxx() functions (except blob_close()) +** immediately return SQLITE_ABORT. +*/ +SQLITE_API int sqlite3_blob_reopen(sqlite3_blob *pBlob, sqlite3_int64 iRow){ + int rc; + Incrblob *p = (Incrblob *)pBlob; + sqlite3 *db; + + if( p==0 ) return SQLITE_MISUSE_BKPT; + db = p->db; + sqlite3_mutex_enter(db->mutex); + + if( p->pStmt==0 ){ + /* If there is no statement handle, then the blob-handle has + ** already been invalidated. Return SQLITE_ABORT in this case. + */ + rc = SQLITE_ABORT; + }else{ + char *zErr; + rc = blobSeekToRow(p, iRow, &zErr); + if( rc!=SQLITE_OK ){ + sqlite3ErrorWithMsg(db, rc, (zErr ? "%s" : 0), zErr); + sqlite3DbFree(db, zErr); + } + assert( rc!=SQLITE_SCHEMA ); + } + + rc = sqlite3ApiExit(db, rc); + assert( rc==SQLITE_OK || p->pStmt==0 ); + sqlite3_mutex_leave(db->mutex); + return rc; +} + +#endif /* #ifndef SQLITE_OMIT_INCRBLOB */ + +/************** End of vdbeblob.c ********************************************/ +/************** Begin file vdbesort.c ****************************************/ +/* +** 2011-07-09 +** +** 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 for the VdbeSorter object, used in concert with +** a VdbeCursor to sort large numbers of keys for CREATE INDEX statements +** or by SELECT statements with ORDER BY clauses that cannot be satisfied +** using indexes and without LIMIT clauses. +** +** The VdbeSorter object implements a multi-threaded external merge sort +** algorithm that is efficient even if the number of elements being sorted +** exceeds the available memory. +** +** Here is the (internal, non-API) interface between this module and the +** rest of the SQLite system: +** +** sqlite3VdbeSorterInit() Create a new VdbeSorter object. +** +** sqlite3VdbeSorterWrite() Add a single new row to the VdbeSorter +** object. The row is a binary blob in the +** OP_MakeRecord format that contains both +** the ORDER BY key columns and result columns +** in the case of a SELECT w/ ORDER BY, or +** the complete record for an index entry +** in the case of a CREATE INDEX. +** +** sqlite3VdbeSorterRewind() Sort all content previously added. +** Position the read cursor on the +** first sorted element. +** +** sqlite3VdbeSorterNext() Advance the read cursor to the next sorted +** element. +** +** sqlite3VdbeSorterRowkey() Return the complete binary blob for the +** row currently under the read cursor. +** +** sqlite3VdbeSorterCompare() Compare the binary blob for the row +** currently under the read cursor against +** another binary blob X and report if +** X is strictly less than the read cursor. +** Used to enforce uniqueness in a +** CREATE UNIQUE INDEX statement. +** +** sqlite3VdbeSorterClose() Close the VdbeSorter object and reclaim +** all resources. +** +** sqlite3VdbeSorterReset() Refurbish the VdbeSorter for reuse. This +** is like Close() followed by Init() only +** much faster. +** +** The interfaces above must be called in a particular order. Write() can +** only occur in between Init()/Reset() and Rewind(). Next(), Rowkey(), and +** Compare() can only occur in between Rewind() and Close()/Reset(). i.e. +** +** Init() +** for each record: Write() +** Rewind() +** Rowkey()/Compare() +** Next() +** Close() +** +** Algorithm: +** +** Records passed to the sorter via calls to Write() are initially held +** unsorted in main memory. Assuming the amount of memory used never exceeds +** a threshold, when Rewind() is called the set of records is sorted using +** an in-memory merge sort. In this case, no temporary files are required +** and subsequent calls to Rowkey(), Next() and Compare() read records +** directly from main memory. +** +** If the amount of space used to store records in main memory exceeds the +** threshold, then the set of records currently in memory are sorted and +** written to a temporary file in "Packed Memory Array" (PMA) format. +** A PMA created at this point is known as a "level-0 PMA". Higher levels +** of PMAs may be created by merging existing PMAs together - for example +** merging two or more level-0 PMAs together creates a level-1 PMA. +** +** The threshold for the amount of main memory to use before flushing +** records to a PMA is roughly the same as the limit configured for the +** page-cache of the main database. Specifically, the threshold is set to +** the value returned by "PRAGMA main.page_size" multipled by +** that returned by "PRAGMA main.cache_size", in bytes. +** +** If the sorter is running in single-threaded mode, then all PMAs generated +** are appended to a single temporary file. Or, if the sorter is running in +** multi-threaded mode then up to (N+1) temporary files may be opened, where +** N is the configured number of worker threads. In this case, instead of +** sorting the records and writing the PMA to a temporary file itself, the +** calling thread usually launches a worker thread to do so. Except, if +** there are already N worker threads running, the main thread does the work +** itself. +** +** The sorter is running in multi-threaded mode if (a) the library was built +** with pre-processor symbol SQLITE_MAX_WORKER_THREADS set to a value greater +** than zero, and (b) worker threads have been enabled at runtime by calling +** "PRAGMA threads=N" with some value of N greater than 0. +** +** When Rewind() is called, any data remaining in memory is flushed to a +** final PMA. So at this point the data is stored in some number of sorted +** PMAs within temporary files on disk. +** +** If there are fewer than SORTER_MAX_MERGE_COUNT PMAs in total and the +** sorter is running in single-threaded mode, then these PMAs are merged +** incrementally as keys are retreived from the sorter by the VDBE. The +** MergeEngine object, described in further detail below, performs this +** merge. +** +** Or, if running in multi-threaded mode, then a background thread is +** launched to merge the existing PMAs. Once the background thread has +** merged T bytes of data into a single sorted PMA, the main thread +** begins reading keys from that PMA while the background thread proceeds +** with merging the next T bytes of data. And so on. +** +** Parameter T is set to half the value of the memory threshold used +** by Write() above to determine when to create a new PMA. +** +** If there are more than SORTER_MAX_MERGE_COUNT PMAs in total when +** Rewind() is called, then a hierarchy of incremental-merges is used. +** First, T bytes of data from the first SORTER_MAX_MERGE_COUNT PMAs on +** disk are merged together. Then T bytes of data from the second set, and +** so on, such that no operation ever merges more than SORTER_MAX_MERGE_COUNT +** PMAs at a time. This done is to improve locality. +** +** If running in multi-threaded mode and there are more than +** SORTER_MAX_MERGE_COUNT PMAs on disk when Rewind() is called, then more +** than one background thread may be created. Specifically, there may be +** one background thread for each temporary file on disk, and one background +** thread to merge the output of each of the others to a single PMA for +** the main thread to read from. +*/ +/* #include "sqliteInt.h" */ +/* #include "vdbeInt.h" */ + +/* +** If SQLITE_DEBUG_SORTER_THREADS is defined, this module outputs various +** messages to stderr that may be helpful in understanding the performance +** characteristics of the sorter in multi-threaded mode. +*/ +#if 0 +# define SQLITE_DEBUG_SORTER_THREADS 1 +#endif + +/* +** Hard-coded maximum amount of data to accumulate in memory before flushing +** to a level 0 PMA. The purpose of this limit is to prevent various integer +** overflows. 512MiB. +*/ +#define SQLITE_MAX_PMASZ (1<<29) + +/* +** Private objects used by the sorter +*/ +typedef struct MergeEngine MergeEngine; /* Merge PMAs together */ +typedef struct PmaReader PmaReader; /* Incrementally read one PMA */ +typedef struct PmaWriter PmaWriter; /* Incrementally write one PMA */ +typedef struct SorterRecord SorterRecord; /* A record being sorted */ +typedef struct SortSubtask SortSubtask; /* A sub-task in the sort process */ +typedef struct SorterFile SorterFile; /* Temporary file object wrapper */ +typedef struct SorterList SorterList; /* In-memory list of records */ +typedef struct IncrMerger IncrMerger; /* Read & merge multiple PMAs */ + +/* +** A container for a temp file handle and the current amount of data +** stored in the file. +*/ +struct SorterFile { + sqlite3_file *pFd; /* File handle */ + i64 iEof; /* Bytes of data stored in pFd */ +}; + +/* +** An in-memory list of objects to be sorted. +** +** If aMemory==0 then each object is allocated separately and the objects +** are connected using SorterRecord.u.pNext. If aMemory!=0 then all objects +** are stored in the aMemory[] bulk memory, one right after the other, and +** are connected using SorterRecord.u.iNext. +*/ +struct SorterList { + SorterRecord *pList; /* Linked list of records */ + u8 *aMemory; /* If non-NULL, bulk memory to hold pList */ + int szPMA; /* Size of pList as PMA in bytes */ +}; + +/* +** The MergeEngine object is used to combine two or more smaller PMAs into +** one big PMA using a merge operation. Separate PMAs all need to be +** combined into one big PMA in order to be able to step through the sorted +** records in order. +** +** The aReadr[] array contains a PmaReader object for each of the PMAs being +** merged. An aReadr[] object either points to a valid key or else is at EOF. +** ("EOF" means "End Of File". When aReadr[] is at EOF there is no more data.) +** For the purposes of the paragraphs below, we assume that the array is +** actually N elements in size, where N is the smallest power of 2 greater +** to or equal to the number of PMAs being merged. The extra aReadr[] elements +** are treated as if they are empty (always at EOF). +** +** The aTree[] array is also N elements in size. The value of N is stored in +** the MergeEngine.nTree variable. +** +** The final (N/2) elements of aTree[] contain the results of comparing +** pairs of PMA keys together. Element i contains the result of +** comparing aReadr[2*i-N] and aReadr[2*i-N+1]. Whichever key is smaller, the +** aTree element is set to the index of it. +** +** For the purposes of this comparison, EOF is considered greater than any +** other key value. If the keys are equal (only possible with two EOF +** values), it doesn't matter which index is stored. +** +** The (N/4) elements of aTree[] that precede the final (N/2) described +** above contains the index of the smallest of each block of 4 PmaReaders +** And so on. So that aTree[1] contains the index of the PmaReader that +** currently points to the smallest key value. aTree[0] is unused. +** +** Example: +** +** aReadr[0] -> Banana +** aReadr[1] -> Feijoa +** aReadr[2] -> Elderberry +** aReadr[3] -> Currant +** aReadr[4] -> Grapefruit +** aReadr[5] -> Apple +** aReadr[6] -> Durian +** aReadr[7] -> EOF +** +** aTree[] = { X, 5 0, 5 0, 3, 5, 6 } +** +** The current element is "Apple" (the value of the key indicated by +** PmaReader 5). When the Next() operation is invoked, PmaReader 5 will +** be advanced to the next key in its segment. Say the next key is +** "Eggplant": +** +** aReadr[5] -> Eggplant +** +** The contents of aTree[] are updated first by comparing the new PmaReader +** 5 key to the current key of PmaReader 4 (still "Grapefruit"). The PmaReader +** 5 value is still smaller, so aTree[6] is set to 5. And so on up the tree. +** The value of PmaReader 6 - "Durian" - is now smaller than that of PmaReader +** 5, so aTree[3] is set to 6. Key 0 is smaller than key 6 (Bananafile2. And instead of using a +** background thread to prepare data for the PmaReader, with a single +** threaded IncrMerger the allocate part of pTask->file2 is "refilled" with +** keys from pMerger by the calling thread whenever the PmaReader runs out +** of data. +*/ +struct IncrMerger { + SortSubtask *pTask; /* Task that owns this merger */ + MergeEngine *pMerger; /* Merge engine thread reads data from */ + i64 iStartOff; /* Offset to start writing file at */ + int mxSz; /* Maximum bytes of data to store */ + int bEof; /* Set to true when merge is finished */ + int bUseThread; /* True to use a bg thread for this object */ + SorterFile aFile[2]; /* aFile[0] for reading, [1] for writing */ +}; + +/* +** An instance of this object is used for writing a PMA. +** +** The PMA is written one record at a time. Each record is of an arbitrary +** size. But I/O is more efficient if it occurs in page-sized blocks where +** each block is aligned on a page boundary. This object caches writes to +** the PMA so that aligned, page-size blocks are written. +*/ +struct PmaWriter { + int eFWErr; /* Non-zero if in an error state */ + u8 *aBuffer; /* Pointer to write buffer */ + int nBuffer; /* Size of write buffer in bytes */ + int iBufStart; /* First byte of buffer to write */ + int iBufEnd; /* Last byte of buffer to write */ + i64 iWriteOff; /* Offset of start of buffer in file */ + sqlite3_file *pFd; /* File handle to write to */ +}; + +/* +** This object is the header on a single record while that record is being +** held in memory and prior to being written out as part of a PMA. +** +** How the linked list is connected depends on how memory is being managed +** by this module. If using a separate allocation for each in-memory record +** (VdbeSorter.list.aMemory==0), then the list is always connected using the +** SorterRecord.u.pNext pointers. +** +** Or, if using the single large allocation method (VdbeSorter.list.aMemory!=0), +** then while records are being accumulated the list is linked using the +** SorterRecord.u.iNext offset. This is because the aMemory[] array may +** be sqlite3Realloc()ed while records are being accumulated. Once the VM +** has finished passing records to the sorter, or when the in-memory buffer +** is full, the list is sorted. As part of the sorting process, it is +** converted to use the SorterRecord.u.pNext pointers. See function +** vdbeSorterSort() for details. +*/ +struct SorterRecord { + int nVal; /* Size of the record in bytes */ + union { + SorterRecord *pNext; /* Pointer to next record in list */ + int iNext; /* Offset within aMemory of next record */ + } u; + /* The data for the record immediately follows this header */ +}; + +/* Return a pointer to the buffer containing the record data for SorterRecord +** object p. Should be used as if: +** +** void *SRVAL(SorterRecord *p) { return (void*)&p[1]; } +*/ +#define SRVAL(p) ((void*)((SorterRecord*)(p) + 1)) + + +/* Maximum number of PMAs that a single MergeEngine can merge */ +#define SORTER_MAX_MERGE_COUNT 16 + +static int vdbeIncrSwap(IncrMerger*); +static void vdbeIncrFree(IncrMerger *); + +/* +** Free all memory belonging to the PmaReader object passed as the +** argument. All structure fields are set to zero before returning. +*/ +static void vdbePmaReaderClear(PmaReader *pReadr){ + sqlite3_free(pReadr->aAlloc); + sqlite3_free(pReadr->aBuffer); + if( pReadr->aMap ) sqlite3OsUnfetch(pReadr->pFd, 0, pReadr->aMap); + vdbeIncrFree(pReadr->pIncr); + memset(pReadr, 0, sizeof(PmaReader)); +} + +/* +** Read the next nByte bytes of data from the PMA p. +** If successful, set *ppOut to point to a buffer containing the data +** and return SQLITE_OK. Otherwise, if an error occurs, return an SQLite +** error code. +** +** The buffer returned in *ppOut is only valid until the +** next call to this function. +*/ +static int vdbePmaReadBlob( + PmaReader *p, /* PmaReader from which to take the blob */ + int nByte, /* Bytes of data to read */ + u8 **ppOut /* OUT: Pointer to buffer containing data */ +){ + int iBuf; /* Offset within buffer to read from */ + int nAvail; /* Bytes of data available in buffer */ + + if( p->aMap ){ + *ppOut = &p->aMap[p->iReadOff]; + p->iReadOff += nByte; + return SQLITE_OK; + } + + assert( p->aBuffer ); + + /* If there is no more data to be read from the buffer, read the next + ** p->nBuffer bytes of data from the file into it. Or, if there are less + ** than p->nBuffer bytes remaining in the PMA, read all remaining data. */ + iBuf = p->iReadOff % p->nBuffer; + if( iBuf==0 ){ + int nRead; /* Bytes to read from disk */ + int rc; /* sqlite3OsRead() return code */ + + /* Determine how many bytes of data to read. */ + if( (p->iEof - p->iReadOff) > (i64)p->nBuffer ){ + nRead = p->nBuffer; + }else{ + nRead = (int)(p->iEof - p->iReadOff); + } + assert( nRead>0 ); + + /* Readr data from the file. Return early if an error occurs. */ + rc = sqlite3OsRead(p->pFd, p->aBuffer, nRead, p->iReadOff); + assert( rc!=SQLITE_IOERR_SHORT_READ ); + if( rc!=SQLITE_OK ) return rc; + } + nAvail = p->nBuffer - iBuf; + + if( nByte<=nAvail ){ + /* The requested data is available in the in-memory buffer. In this + ** case there is no need to make a copy of the data, just return a + ** pointer into the buffer to the caller. */ + *ppOut = &p->aBuffer[iBuf]; + p->iReadOff += nByte; + }else{ + /* The requested data is not all available in the in-memory buffer. + ** In this case, allocate space at p->aAlloc[] to copy the requested + ** range into. Then return a copy of pointer p->aAlloc to the caller. */ + int nRem; /* Bytes remaining to copy */ + + /* Extend the p->aAlloc[] allocation if required. */ + if( p->nAllocnAlloc*2); + while( nByte>nNew ) nNew = nNew*2; + aNew = sqlite3Realloc(p->aAlloc, nNew); + if( !aNew ) return SQLITE_NOMEM_BKPT; + p->nAlloc = nNew; + p->aAlloc = aNew; + } + + /* Copy as much data as is available in the buffer into the start of + ** p->aAlloc[]. */ + memcpy(p->aAlloc, &p->aBuffer[iBuf], nAvail); + p->iReadOff += nAvail; + nRem = nByte - nAvail; + + /* The following loop copies up to p->nBuffer bytes per iteration into + ** the p->aAlloc[] buffer. */ + while( nRem>0 ){ + int rc; /* vdbePmaReadBlob() return code */ + int nCopy; /* Number of bytes to copy */ + u8 *aNext; /* Pointer to buffer to copy data from */ + + nCopy = nRem; + if( nRem>p->nBuffer ) nCopy = p->nBuffer; + rc = vdbePmaReadBlob(p, nCopy, &aNext); + if( rc!=SQLITE_OK ) return rc; + assert( aNext!=p->aAlloc ); + memcpy(&p->aAlloc[nByte - nRem], aNext, nCopy); + nRem -= nCopy; + } + + *ppOut = p->aAlloc; + } + + return SQLITE_OK; +} + +/* +** Read a varint from the stream of data accessed by p. Set *pnOut to +** the value read. +*/ +static int vdbePmaReadVarint(PmaReader *p, u64 *pnOut){ + int iBuf; + + if( p->aMap ){ + p->iReadOff += sqlite3GetVarint(&p->aMap[p->iReadOff], pnOut); + }else{ + iBuf = p->iReadOff % p->nBuffer; + if( iBuf && (p->nBuffer-iBuf)>=9 ){ + p->iReadOff += sqlite3GetVarint(&p->aBuffer[iBuf], pnOut); + }else{ + u8 aVarint[16], *a; + int i = 0, rc; + do{ + rc = vdbePmaReadBlob(p, 1, &a); + if( rc ) return rc; + aVarint[(i++)&0xf] = a[0]; + }while( (a[0]&0x80)!=0 ); + sqlite3GetVarint(aVarint, pnOut); + } + } + + return SQLITE_OK; +} + +/* +** Attempt to memory map file pFile. If successful, set *pp to point to the +** new mapping and return SQLITE_OK. If the mapping is not attempted +** (because the file is too large or the VFS layer is configured not to use +** mmap), return SQLITE_OK and set *pp to NULL. +** +** Or, if an error occurs, return an SQLite error code. The final value of +** *pp is undefined in this case. +*/ +static int vdbeSorterMapFile(SortSubtask *pTask, SorterFile *pFile, u8 **pp){ + int rc = SQLITE_OK; + if( pFile->iEof<=(i64)(pTask->pSorter->db->nMaxSorterMmap) ){ + sqlite3_file *pFd = pFile->pFd; + if( pFd->pMethods->iVersion>=3 ){ + rc = sqlite3OsFetch(pFd, 0, (int)pFile->iEof, (void**)pp); + testcase( rc!=SQLITE_OK ); + } + } + return rc; +} + +/* +** Attach PmaReader pReadr to file pFile (if it is not already attached to +** that file) and seek it to offset iOff within the file. Return SQLITE_OK +** if successful, or an SQLite error code if an error occurs. +*/ +static int vdbePmaReaderSeek( + SortSubtask *pTask, /* Task context */ + PmaReader *pReadr, /* Reader whose cursor is to be moved */ + SorterFile *pFile, /* Sorter file to read from */ + i64 iOff /* Offset in pFile */ +){ + int rc = SQLITE_OK; + + assert( pReadr->pIncr==0 || pReadr->pIncr->bEof==0 ); + + if( sqlite3FaultSim(201) ) return SQLITE_IOERR_READ; + if( pReadr->aMap ){ + sqlite3OsUnfetch(pReadr->pFd, 0, pReadr->aMap); + pReadr->aMap = 0; + } + pReadr->iReadOff = iOff; + pReadr->iEof = pFile->iEof; + pReadr->pFd = pFile->pFd; + + rc = vdbeSorterMapFile(pTask, pFile, &pReadr->aMap); + if( rc==SQLITE_OK && pReadr->aMap==0 ){ + int pgsz = pTask->pSorter->pgsz; + int iBuf = pReadr->iReadOff % pgsz; + if( pReadr->aBuffer==0 ){ + pReadr->aBuffer = (u8*)sqlite3Malloc(pgsz); + if( pReadr->aBuffer==0 ) rc = SQLITE_NOMEM_BKPT; + pReadr->nBuffer = pgsz; + } + if( rc==SQLITE_OK && iBuf ){ + int nRead = pgsz - iBuf; + if( (pReadr->iReadOff + nRead) > pReadr->iEof ){ + nRead = (int)(pReadr->iEof - pReadr->iReadOff); + } + rc = sqlite3OsRead( + pReadr->pFd, &pReadr->aBuffer[iBuf], nRead, pReadr->iReadOff + ); + testcase( rc!=SQLITE_OK ); + } + } + + return rc; +} + +/* +** Advance PmaReader pReadr to the next key in its PMA. Return SQLITE_OK if +** no error occurs, or an SQLite error code if one does. +*/ +static int vdbePmaReaderNext(PmaReader *pReadr){ + int rc = SQLITE_OK; /* Return Code */ + u64 nRec = 0; /* Size of record in bytes */ + + + if( pReadr->iReadOff>=pReadr->iEof ){ + IncrMerger *pIncr = pReadr->pIncr; + int bEof = 1; + if( pIncr ){ + rc = vdbeIncrSwap(pIncr); + if( rc==SQLITE_OK && pIncr->bEof==0 ){ + rc = vdbePmaReaderSeek( + pIncr->pTask, pReadr, &pIncr->aFile[0], pIncr->iStartOff + ); + bEof = 0; + } + } + + if( bEof ){ + /* This is an EOF condition */ + vdbePmaReaderClear(pReadr); + testcase( rc!=SQLITE_OK ); + return rc; + } + } + + if( rc==SQLITE_OK ){ + rc = vdbePmaReadVarint(pReadr, &nRec); + } + if( rc==SQLITE_OK ){ + pReadr->nKey = (int)nRec; + rc = vdbePmaReadBlob(pReadr, (int)nRec, &pReadr->aKey); + testcase( rc!=SQLITE_OK ); + } + + return rc; +} + +/* +** Initialize PmaReader pReadr to scan through the PMA stored in file pFile +** starting at offset iStart and ending at offset iEof-1. This function +** leaves the PmaReader pointing to the first key in the PMA (or EOF if the +** PMA is empty). +** +** If the pnByte parameter is NULL, then it is assumed that the file +** contains a single PMA, and that that PMA omits the initial length varint. +*/ +static int vdbePmaReaderInit( + SortSubtask *pTask, /* Task context */ + SorterFile *pFile, /* Sorter file to read from */ + i64 iStart, /* Start offset in pFile */ + PmaReader *pReadr, /* PmaReader to populate */ + i64 *pnByte /* IN/OUT: Increment this value by PMA size */ +){ + int rc; + + assert( pFile->iEof>iStart ); + assert( pReadr->aAlloc==0 && pReadr->nAlloc==0 ); + assert( pReadr->aBuffer==0 ); + assert( pReadr->aMap==0 ); + + rc = vdbePmaReaderSeek(pTask, pReadr, pFile, iStart); + if( rc==SQLITE_OK ){ + u64 nByte = 0; /* Size of PMA in bytes */ + rc = vdbePmaReadVarint(pReadr, &nByte); + pReadr->iEof = pReadr->iReadOff + nByte; + *pnByte += nByte; + } + + if( rc==SQLITE_OK ){ + rc = vdbePmaReaderNext(pReadr); + } + return rc; +} + +/* +** A version of vdbeSorterCompare() that assumes that it has already been +** determined that the first field of key1 is equal to the first field of +** key2. +*/ +static int vdbeSorterCompareTail( + SortSubtask *pTask, /* Subtask context (for pKeyInfo) */ + int *pbKey2Cached, /* True if pTask->pUnpacked is pKey2 */ + const void *pKey1, int nKey1, /* Left side of comparison */ + const void *pKey2, int nKey2 /* Right side of comparison */ +){ + UnpackedRecord *r2 = pTask->pUnpacked; + if( *pbKey2Cached==0 ){ + sqlite3VdbeRecordUnpack(pTask->pSorter->pKeyInfo, nKey2, pKey2, r2); + *pbKey2Cached = 1; + } + return sqlite3VdbeRecordCompareWithSkip(nKey1, pKey1, r2, 1); +} + +/* +** Compare key1 (buffer pKey1, size nKey1 bytes) with key2 (buffer pKey2, +** size nKey2 bytes). Use (pTask->pKeyInfo) for the collation sequences +** used by the comparison. Return the result of the comparison. +** +** If IN/OUT parameter *pbKey2Cached is true when this function is called, +** it is assumed that (pTask->pUnpacked) contains the unpacked version +** of key2. If it is false, (pTask->pUnpacked) is populated with the unpacked +** version of key2 and *pbKey2Cached set to true before returning. +** +** If an OOM error is encountered, (pTask->pUnpacked->error_rc) is set +** to SQLITE_NOMEM. +*/ +static int vdbeSorterCompare( + SortSubtask *pTask, /* Subtask context (for pKeyInfo) */ + int *pbKey2Cached, /* True if pTask->pUnpacked is pKey2 */ + const void *pKey1, int nKey1, /* Left side of comparison */ + const void *pKey2, int nKey2 /* Right side of comparison */ +){ + UnpackedRecord *r2 = pTask->pUnpacked; + if( !*pbKey2Cached ){ + sqlite3VdbeRecordUnpack(pTask->pSorter->pKeyInfo, nKey2, pKey2, r2); + *pbKey2Cached = 1; + } + return sqlite3VdbeRecordCompare(nKey1, pKey1, r2); +} + +/* +** A specially optimized version of vdbeSorterCompare() that assumes that +** the first field of each key is a TEXT value and that the collation +** sequence to compare them with is BINARY. +*/ +static int vdbeSorterCompareText( + SortSubtask *pTask, /* Subtask context (for pKeyInfo) */ + int *pbKey2Cached, /* True if pTask->pUnpacked is pKey2 */ + const void *pKey1, int nKey1, /* Left side of comparison */ + const void *pKey2, int nKey2 /* Right side of comparison */ +){ + const u8 * const p1 = (const u8 * const)pKey1; + const u8 * const p2 = (const u8 * const)pKey2; + const u8 * const v1 = &p1[ p1[0] ]; /* Pointer to value 1 */ + const u8 * const v2 = &p2[ p2[0] ]; /* Pointer to value 2 */ + + int n1; + int n2; + int res; + + getVarint32(&p1[1], n1); n1 = (n1 - 13) / 2; + getVarint32(&p2[1], n2); n2 = (n2 - 13) / 2; + res = memcmp(v1, v2, MIN(n1, n2)); + if( res==0 ){ + res = n1 - n2; + } + + if( res==0 ){ + if( pTask->pSorter->pKeyInfo->nField>1 ){ + res = vdbeSorterCompareTail( + pTask, pbKey2Cached, pKey1, nKey1, pKey2, nKey2 + ); + } + }else{ + if( pTask->pSorter->pKeyInfo->aSortOrder[0] ){ + res = res * -1; + } + } + + return res; +} + +/* +** A specially optimized version of vdbeSorterCompare() that assumes that +** the first field of each key is an INTEGER value. +*/ +static int vdbeSorterCompareInt( + SortSubtask *pTask, /* Subtask context (for pKeyInfo) */ + int *pbKey2Cached, /* True if pTask->pUnpacked is pKey2 */ + const void *pKey1, int nKey1, /* Left side of comparison */ + const void *pKey2, int nKey2 /* Right side of comparison */ +){ + const u8 * const p1 = (const u8 * const)pKey1; + const u8 * const p2 = (const u8 * const)pKey2; + const int s1 = p1[1]; /* Left hand serial type */ + const int s2 = p2[1]; /* Right hand serial type */ + const u8 * const v1 = &p1[ p1[0] ]; /* Pointer to value 1 */ + const u8 * const v2 = &p2[ p2[0] ]; /* Pointer to value 2 */ + int res; /* Return value */ + + assert( (s1>0 && s1<7) || s1==8 || s1==9 ); + assert( (s2>0 && s2<7) || s2==8 || s2==9 ); + + if( s1>7 && s2>7 ){ + res = s1 - s2; + }else{ + if( s1==s2 ){ + if( (*v1 ^ *v2) & 0x80 ){ + /* The two values have different signs */ + res = (*v1 & 0x80) ? -1 : +1; + }else{ + /* The two values have the same sign. Compare using memcmp(). */ + static const u8 aLen[] = {0, 1, 2, 3, 4, 6, 8 }; + int i; + res = 0; + for(i=0; i7 ){ + res = +1; + }else if( s1>7 ){ + res = -1; + }else{ + res = s1 - s2; + } + assert( res!=0 ); + + if( res>0 ){ + if( *v1 & 0x80 ) res = -1; + }else{ + if( *v2 & 0x80 ) res = +1; + } + } + } + + if( res==0 ){ + if( pTask->pSorter->pKeyInfo->nField>1 ){ + res = vdbeSorterCompareTail( + pTask, pbKey2Cached, pKey1, nKey1, pKey2, nKey2 + ); + } + }else if( pTask->pSorter->pKeyInfo->aSortOrder[0] ){ + res = res * -1; + } + + return res; +} + +/* +** Initialize the temporary index cursor just opened as a sorter cursor. +** +** Usually, the sorter module uses the value of (pCsr->pKeyInfo->nField) +** to determine the number of fields that should be compared from the +** records being sorted. However, if the value passed as argument nField +** is non-zero and the sorter is able to guarantee a stable sort, nField +** is used instead. This is used when sorting records for a CREATE INDEX +** statement. In this case, keys are always delivered to the sorter in +** order of the primary key, which happens to be make up the final part +** of the records being sorted. So if the sort is stable, there is never +** any reason to compare PK fields and they can be ignored for a small +** performance boost. +** +** The sorter can guarantee a stable sort when running in single-threaded +** mode, but not in multi-threaded mode. +** +** SQLITE_OK is returned if successful, or an SQLite error code otherwise. +*/ +SQLITE_PRIVATE int sqlite3VdbeSorterInit( + sqlite3 *db, /* Database connection (for malloc()) */ + int nField, /* Number of key fields in each record */ + VdbeCursor *pCsr /* Cursor that holds the new sorter */ +){ + int pgsz; /* Page size of main database */ + int i; /* Used to iterate through aTask[] */ + VdbeSorter *pSorter; /* The new sorter */ + KeyInfo *pKeyInfo; /* Copy of pCsr->pKeyInfo with db==0 */ + int szKeyInfo; /* Size of pCsr->pKeyInfo in bytes */ + int sz; /* Size of pSorter in bytes */ + int rc = SQLITE_OK; +#if SQLITE_MAX_WORKER_THREADS==0 +# define nWorker 0 +#else + int nWorker; +#endif + + /* Initialize the upper limit on the number of worker threads */ +#if SQLITE_MAX_WORKER_THREADS>0 + if( sqlite3TempInMemory(db) || sqlite3GlobalConfig.bCoreMutex==0 ){ + nWorker = 0; + }else{ + nWorker = db->aLimit[SQLITE_LIMIT_WORKER_THREADS]; + } +#endif + + /* Do not allow the total number of threads (main thread + all workers) + ** to exceed the maximum merge count */ +#if SQLITE_MAX_WORKER_THREADS>=SORTER_MAX_MERGE_COUNT + if( nWorker>=SORTER_MAX_MERGE_COUNT ){ + nWorker = SORTER_MAX_MERGE_COUNT-1; + } +#endif + + assert( pCsr->pKeyInfo && pCsr->pBt==0 ); + assert( pCsr->eCurType==CURTYPE_SORTER ); + szKeyInfo = sizeof(KeyInfo) + (pCsr->pKeyInfo->nField-1)*sizeof(CollSeq*); + sz = sizeof(VdbeSorter) + nWorker * sizeof(SortSubtask); + + pSorter = (VdbeSorter*)sqlite3DbMallocZero(db, sz + szKeyInfo); + pCsr->uc.pSorter = pSorter; + if( pSorter==0 ){ + rc = SQLITE_NOMEM_BKPT; + }else{ + pSorter->pKeyInfo = pKeyInfo = (KeyInfo*)((u8*)pSorter + sz); + memcpy(pKeyInfo, pCsr->pKeyInfo, szKeyInfo); + pKeyInfo->db = 0; + if( nField && nWorker==0 ){ + pKeyInfo->nXField += (pKeyInfo->nField - nField); + pKeyInfo->nField = nField; + } + pSorter->pgsz = pgsz = sqlite3BtreeGetPageSize(db->aDb[0].pBt); + pSorter->nTask = nWorker + 1; + pSorter->iPrev = (u8)(nWorker - 1); + pSorter->bUseThreads = (pSorter->nTask>1); + pSorter->db = db; + for(i=0; inTask; i++){ + SortSubtask *pTask = &pSorter->aTask[i]; + pTask->pSorter = pSorter; + } + + if( !sqlite3TempInMemory(db) ){ + i64 mxCache; /* Cache size in bytes*/ + u32 szPma = sqlite3GlobalConfig.szPma; + pSorter->mnPmaSize = szPma * pgsz; + + mxCache = db->aDb[0].pSchema->cache_size; + if( mxCache<0 ){ + /* A negative cache-size value C indicates that the cache is abs(C) + ** KiB in size. */ + mxCache = mxCache * -1024; + }else{ + mxCache = mxCache * pgsz; + } + mxCache = MIN(mxCache, SQLITE_MAX_PMASZ); + pSorter->mxPmaSize = MAX(pSorter->mnPmaSize, (int)mxCache); + + /* EVIDENCE-OF: R-26747-61719 When the application provides any amount of + ** scratch memory using SQLITE_CONFIG_SCRATCH, SQLite avoids unnecessary + ** large heap allocations. + */ + if( sqlite3GlobalConfig.pScratch==0 ){ + assert( pSorter->iMemory==0 ); + pSorter->nMemory = pgsz; + pSorter->list.aMemory = (u8*)sqlite3Malloc(pgsz); + if( !pSorter->list.aMemory ) rc = SQLITE_NOMEM_BKPT; + } + } + + if( (pKeyInfo->nField+pKeyInfo->nXField)<13 + && (pKeyInfo->aColl[0]==0 || pKeyInfo->aColl[0]==db->pDfltColl) + ){ + pSorter->typeMask = SORTER_TYPE_INTEGER | SORTER_TYPE_TEXT; + } + } + + return rc; +} +#undef nWorker /* Defined at the top of this function */ + +/* +** Free the list of sorted records starting at pRecord. +*/ +static void vdbeSorterRecordFree(sqlite3 *db, SorterRecord *pRecord){ + SorterRecord *p; + SorterRecord *pNext; + for(p=pRecord; p; p=pNext){ + pNext = p->u.pNext; + sqlite3DbFree(db, p); + } +} + +/* +** Free all resources owned by the object indicated by argument pTask. All +** fields of *pTask are zeroed before returning. +*/ +static void vdbeSortSubtaskCleanup(sqlite3 *db, SortSubtask *pTask){ + sqlite3DbFree(db, pTask->pUnpacked); +#if SQLITE_MAX_WORKER_THREADS>0 + /* pTask->list.aMemory can only be non-zero if it was handed memory + ** from the main thread. That only occurs SQLITE_MAX_WORKER_THREADS>0 */ + if( pTask->list.aMemory ){ + sqlite3_free(pTask->list.aMemory); + }else +#endif + { + assert( pTask->list.aMemory==0 ); + vdbeSorterRecordFree(0, pTask->list.pList); + } + if( pTask->file.pFd ){ + sqlite3OsCloseFree(pTask->file.pFd); + } + if( pTask->file2.pFd ){ + sqlite3OsCloseFree(pTask->file2.pFd); + } + memset(pTask, 0, sizeof(SortSubtask)); +} + +#ifdef SQLITE_DEBUG_SORTER_THREADS +static void vdbeSorterWorkDebug(SortSubtask *pTask, const char *zEvent){ + i64 t; + int iTask = (pTask - pTask->pSorter->aTask); + sqlite3OsCurrentTimeInt64(pTask->pSorter->db->pVfs, &t); + fprintf(stderr, "%lld:%d %s\n", t, iTask, zEvent); +} +static void vdbeSorterRewindDebug(const char *zEvent){ + i64 t; + sqlite3OsCurrentTimeInt64(sqlite3_vfs_find(0), &t); + fprintf(stderr, "%lld:X %s\n", t, zEvent); +} +static void vdbeSorterPopulateDebug( + SortSubtask *pTask, + const char *zEvent +){ + i64 t; + int iTask = (pTask - pTask->pSorter->aTask); + sqlite3OsCurrentTimeInt64(pTask->pSorter->db->pVfs, &t); + fprintf(stderr, "%lld:bg%d %s\n", t, iTask, zEvent); +} +static void vdbeSorterBlockDebug( + SortSubtask *pTask, + int bBlocked, + const char *zEvent +){ + if( bBlocked ){ + i64 t; + sqlite3OsCurrentTimeInt64(pTask->pSorter->db->pVfs, &t); + fprintf(stderr, "%lld:main %s\n", t, zEvent); + } +} +#else +# define vdbeSorterWorkDebug(x,y) +# define vdbeSorterRewindDebug(y) +# define vdbeSorterPopulateDebug(x,y) +# define vdbeSorterBlockDebug(x,y,z) +#endif + +#if SQLITE_MAX_WORKER_THREADS>0 +/* +** Join thread pTask->thread. +*/ +static int vdbeSorterJoinThread(SortSubtask *pTask){ + int rc = SQLITE_OK; + if( pTask->pThread ){ +#ifdef SQLITE_DEBUG_SORTER_THREADS + int bDone = pTask->bDone; +#endif + void *pRet = SQLITE_INT_TO_PTR(SQLITE_ERROR); + vdbeSorterBlockDebug(pTask, !bDone, "enter"); + (void)sqlite3ThreadJoin(pTask->pThread, &pRet); + vdbeSorterBlockDebug(pTask, !bDone, "exit"); + rc = SQLITE_PTR_TO_INT(pRet); + assert( pTask->bDone==1 ); + pTask->bDone = 0; + pTask->pThread = 0; + } + return rc; +} + +/* +** Launch a background thread to run xTask(pIn). +*/ +static int vdbeSorterCreateThread( + SortSubtask *pTask, /* Thread will use this task object */ + void *(*xTask)(void*), /* Routine to run in a separate thread */ + void *pIn /* Argument passed into xTask() */ +){ + assert( pTask->pThread==0 && pTask->bDone==0 ); + return sqlite3ThreadCreate(&pTask->pThread, xTask, pIn); +} + +/* +** Join all outstanding threads launched by SorterWrite() to create +** level-0 PMAs. +*/ +static int vdbeSorterJoinAll(VdbeSorter *pSorter, int rcin){ + int rc = rcin; + int i; + + /* This function is always called by the main user thread. + ** + ** If this function is being called after SorterRewind() has been called, + ** it is possible that thread pSorter->aTask[pSorter->nTask-1].pThread + ** is currently attempt to join one of the other threads. To avoid a race + ** condition where this thread also attempts to join the same object, join + ** thread pSorter->aTask[pSorter->nTask-1].pThread first. */ + for(i=pSorter->nTask-1; i>=0; i--){ + SortSubtask *pTask = &pSorter->aTask[i]; + int rc2 = vdbeSorterJoinThread(pTask); + if( rc==SQLITE_OK ) rc = rc2; + } + return rc; +} +#else +# define vdbeSorterJoinAll(x,rcin) (rcin) +# define vdbeSorterJoinThread(pTask) SQLITE_OK +#endif + +/* +** Allocate a new MergeEngine object capable of handling up to +** nReader PmaReader inputs. +** +** nReader is automatically rounded up to the next power of two. +** nReader may not exceed SORTER_MAX_MERGE_COUNT even after rounding up. +*/ +static MergeEngine *vdbeMergeEngineNew(int nReader){ + int N = 2; /* Smallest power of two >= nReader */ + int nByte; /* Total bytes of space to allocate */ + MergeEngine *pNew; /* Pointer to allocated object to return */ + + assert( nReader<=SORTER_MAX_MERGE_COUNT ); + + while( NnTree = N; + pNew->pTask = 0; + pNew->aReadr = (PmaReader*)&pNew[1]; + pNew->aTree = (int*)&pNew->aReadr[N]; + } + return pNew; +} + +/* +** Free the MergeEngine object passed as the only argument. +*/ +static void vdbeMergeEngineFree(MergeEngine *pMerger){ + int i; + if( pMerger ){ + for(i=0; inTree; i++){ + vdbePmaReaderClear(&pMerger->aReadr[i]); + } + } + sqlite3_free(pMerger); +} + +/* +** Free all resources associated with the IncrMerger object indicated by +** the first argument. +*/ +static void vdbeIncrFree(IncrMerger *pIncr){ + if( pIncr ){ +#if SQLITE_MAX_WORKER_THREADS>0 + if( pIncr->bUseThread ){ + vdbeSorterJoinThread(pIncr->pTask); + if( pIncr->aFile[0].pFd ) sqlite3OsCloseFree(pIncr->aFile[0].pFd); + if( pIncr->aFile[1].pFd ) sqlite3OsCloseFree(pIncr->aFile[1].pFd); + } +#endif + vdbeMergeEngineFree(pIncr->pMerger); + sqlite3_free(pIncr); + } +} + +/* +** Reset a sorting cursor back to its original empty state. +*/ +SQLITE_PRIVATE void sqlite3VdbeSorterReset(sqlite3 *db, VdbeSorter *pSorter){ + int i; + (void)vdbeSorterJoinAll(pSorter, SQLITE_OK); + assert( pSorter->bUseThreads || pSorter->pReader==0 ); +#if SQLITE_MAX_WORKER_THREADS>0 + if( pSorter->pReader ){ + vdbePmaReaderClear(pSorter->pReader); + sqlite3DbFree(db, pSorter->pReader); + pSorter->pReader = 0; + } +#endif + vdbeMergeEngineFree(pSorter->pMerger); + pSorter->pMerger = 0; + for(i=0; inTask; i++){ + SortSubtask *pTask = &pSorter->aTask[i]; + vdbeSortSubtaskCleanup(db, pTask); + pTask->pSorter = pSorter; + } + if( pSorter->list.aMemory==0 ){ + vdbeSorterRecordFree(0, pSorter->list.pList); + } + pSorter->list.pList = 0; + pSorter->list.szPMA = 0; + pSorter->bUsePMA = 0; + pSorter->iMemory = 0; + pSorter->mxKeysize = 0; + sqlite3DbFree(db, pSorter->pUnpacked); + pSorter->pUnpacked = 0; +} + +/* +** Free any cursor components allocated by sqlite3VdbeSorterXXX routines. +*/ +SQLITE_PRIVATE void sqlite3VdbeSorterClose(sqlite3 *db, VdbeCursor *pCsr){ + VdbeSorter *pSorter; + assert( pCsr->eCurType==CURTYPE_SORTER ); + pSorter = pCsr->uc.pSorter; + if( pSorter ){ + sqlite3VdbeSorterReset(db, pSorter); + sqlite3_free(pSorter->list.aMemory); + sqlite3DbFree(db, pSorter); + pCsr->uc.pSorter = 0; + } +} + +#if SQLITE_MAX_MMAP_SIZE>0 +/* +** The first argument is a file-handle open on a temporary file. The file +** is guaranteed to be nByte bytes or smaller in size. This function +** attempts to extend the file to nByte bytes in size and to ensure that +** the VFS has memory mapped it. +** +** Whether or not the file does end up memory mapped of course depends on +** the specific VFS implementation. +*/ +static void vdbeSorterExtendFile(sqlite3 *db, sqlite3_file *pFd, i64 nByte){ + if( nByte<=(i64)(db->nMaxSorterMmap) && pFd->pMethods->iVersion>=3 ){ + void *p = 0; + int chunksize = 4*1024; + sqlite3OsFileControlHint(pFd, SQLITE_FCNTL_CHUNK_SIZE, &chunksize); + sqlite3OsFileControlHint(pFd, SQLITE_FCNTL_SIZE_HINT, &nByte); + sqlite3OsFetch(pFd, 0, (int)nByte, &p); + sqlite3OsUnfetch(pFd, 0, p); + } +} +#else +# define vdbeSorterExtendFile(x,y,z) +#endif + +/* +** Allocate space for a file-handle and open a temporary file. If successful, +** set *ppFd to point to the malloc'd file-handle and return SQLITE_OK. +** Otherwise, set *ppFd to 0 and return an SQLite error code. +*/ +static int vdbeSorterOpenTempFile( + sqlite3 *db, /* Database handle doing sort */ + i64 nExtend, /* Attempt to extend file to this size */ + sqlite3_file **ppFd +){ + int rc; + if( sqlite3FaultSim(202) ) return SQLITE_IOERR_ACCESS; + rc = sqlite3OsOpenMalloc(db->pVfs, 0, ppFd, + SQLITE_OPEN_TEMP_JOURNAL | + SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | + SQLITE_OPEN_EXCLUSIVE | SQLITE_OPEN_DELETEONCLOSE, &rc + ); + if( rc==SQLITE_OK ){ + i64 max = SQLITE_MAX_MMAP_SIZE; + sqlite3OsFileControlHint(*ppFd, SQLITE_FCNTL_MMAP_SIZE, (void*)&max); + if( nExtend>0 ){ + vdbeSorterExtendFile(db, *ppFd, nExtend); + } + } + return rc; +} + +/* +** If it has not already been allocated, allocate the UnpackedRecord +** structure at pTask->pUnpacked. Return SQLITE_OK if successful (or +** if no allocation was required), or SQLITE_NOMEM otherwise. +*/ +static int vdbeSortAllocUnpacked(SortSubtask *pTask){ + if( pTask->pUnpacked==0 ){ + char *pFree; + pTask->pUnpacked = sqlite3VdbeAllocUnpackedRecord( + pTask->pSorter->pKeyInfo, 0, 0, &pFree + ); + assert( pTask->pUnpacked==(UnpackedRecord*)pFree ); + if( pFree==0 ) return SQLITE_NOMEM_BKPT; + pTask->pUnpacked->nField = pTask->pSorter->pKeyInfo->nField; + pTask->pUnpacked->errCode = 0; + } + return SQLITE_OK; +} + + +/* +** Merge the two sorted lists p1 and p2 into a single list. +*/ +static SorterRecord *vdbeSorterMerge( + SortSubtask *pTask, /* Calling thread context */ + SorterRecord *p1, /* First list to merge */ + SorterRecord *p2 /* Second list to merge */ +){ + SorterRecord *pFinal = 0; + SorterRecord **pp = &pFinal; + int bCached = 0; + + assert( p1!=0 && p2!=0 ); + for(;;){ + int res; + res = pTask->xCompare( + pTask, &bCached, SRVAL(p1), p1->nVal, SRVAL(p2), p2->nVal + ); + + if( res<=0 ){ + *pp = p1; + pp = &p1->u.pNext; + p1 = p1->u.pNext; + if( p1==0 ){ + *pp = p2; + break; + } + }else{ + *pp = p2; + pp = &p2->u.pNext; + p2 = p2->u.pNext; + bCached = 0; + if( p2==0 ){ + *pp = p1; + break; + } + } + } + return pFinal; +} + +/* +** Return the SorterCompare function to compare values collected by the +** sorter object passed as the only argument. +*/ +static SorterCompare vdbeSorterGetCompare(VdbeSorter *p){ + if( p->typeMask==SORTER_TYPE_INTEGER ){ + return vdbeSorterCompareInt; + }else if( p->typeMask==SORTER_TYPE_TEXT ){ + return vdbeSorterCompareText; + } + return vdbeSorterCompare; +} + +/* +** Sort the linked list of records headed at pTask->pList. Return +** SQLITE_OK if successful, or an SQLite error code (i.e. SQLITE_NOMEM) if +** an error occurs. +*/ +static int vdbeSorterSort(SortSubtask *pTask, SorterList *pList){ + int i; + SorterRecord **aSlot; + SorterRecord *p; + int rc; + + rc = vdbeSortAllocUnpacked(pTask); + if( rc!=SQLITE_OK ) return rc; + + p = pList->pList; + pTask->xCompare = vdbeSorterGetCompare(pTask->pSorter); + + aSlot = (SorterRecord **)sqlite3MallocZero(64 * sizeof(SorterRecord *)); + if( !aSlot ){ + return SQLITE_NOMEM_BKPT; + } + + while( p ){ + SorterRecord *pNext; + if( pList->aMemory ){ + if( (u8*)p==pList->aMemory ){ + pNext = 0; + }else{ + assert( p->u.iNextaMemory) ); + pNext = (SorterRecord*)&pList->aMemory[p->u.iNext]; + } + }else{ + pNext = p->u.pNext; + } + + p->u.pNext = 0; + for(i=0; aSlot[i]; i++){ + p = vdbeSorterMerge(pTask, p, aSlot[i]); + aSlot[i] = 0; + } + aSlot[i] = p; + p = pNext; + } + + p = 0; + for(i=0; i<64; i++){ + if( aSlot[i]==0 ) continue; + p = p ? vdbeSorterMerge(pTask, p, aSlot[i]) : aSlot[i]; + } + pList->pList = p; + + sqlite3_free(aSlot); + assert( pTask->pUnpacked->errCode==SQLITE_OK + || pTask->pUnpacked->errCode==SQLITE_NOMEM + ); + return pTask->pUnpacked->errCode; +} + +/* +** Initialize a PMA-writer object. +*/ +static void vdbePmaWriterInit( + sqlite3_file *pFd, /* File handle to write to */ + PmaWriter *p, /* Object to populate */ + int nBuf, /* Buffer size */ + i64 iStart /* Offset of pFd to begin writing at */ +){ + memset(p, 0, sizeof(PmaWriter)); + p->aBuffer = (u8*)sqlite3Malloc(nBuf); + if( !p->aBuffer ){ + p->eFWErr = SQLITE_NOMEM_BKPT; + }else{ + p->iBufEnd = p->iBufStart = (iStart % nBuf); + p->iWriteOff = iStart - p->iBufStart; + p->nBuffer = nBuf; + p->pFd = pFd; + } +} + +/* +** Write nData bytes of data to the PMA. Return SQLITE_OK +** if successful, or an SQLite error code if an error occurs. +*/ +static void vdbePmaWriteBlob(PmaWriter *p, u8 *pData, int nData){ + int nRem = nData; + while( nRem>0 && p->eFWErr==0 ){ + int nCopy = nRem; + if( nCopy>(p->nBuffer - p->iBufEnd) ){ + nCopy = p->nBuffer - p->iBufEnd; + } + + memcpy(&p->aBuffer[p->iBufEnd], &pData[nData-nRem], nCopy); + p->iBufEnd += nCopy; + if( p->iBufEnd==p->nBuffer ){ + p->eFWErr = sqlite3OsWrite(p->pFd, + &p->aBuffer[p->iBufStart], p->iBufEnd - p->iBufStart, + p->iWriteOff + p->iBufStart + ); + p->iBufStart = p->iBufEnd = 0; + p->iWriteOff += p->nBuffer; + } + assert( p->iBufEndnBuffer ); + + nRem -= nCopy; + } +} + +/* +** Flush any buffered data to disk and clean up the PMA-writer object. +** The results of using the PMA-writer after this call are undefined. +** Return SQLITE_OK if flushing the buffered data succeeds or is not +** required. Otherwise, return an SQLite error code. +** +** Before returning, set *piEof to the offset immediately following the +** last byte written to the file. +*/ +static int vdbePmaWriterFinish(PmaWriter *p, i64 *piEof){ + int rc; + if( p->eFWErr==0 && ALWAYS(p->aBuffer) && p->iBufEnd>p->iBufStart ){ + p->eFWErr = sqlite3OsWrite(p->pFd, + &p->aBuffer[p->iBufStart], p->iBufEnd - p->iBufStart, + p->iWriteOff + p->iBufStart + ); + } + *piEof = (p->iWriteOff + p->iBufEnd); + sqlite3_free(p->aBuffer); + rc = p->eFWErr; + memset(p, 0, sizeof(PmaWriter)); + return rc; +} + +/* +** Write value iVal encoded as a varint to the PMA. Return +** SQLITE_OK if successful, or an SQLite error code if an error occurs. +*/ +static void vdbePmaWriteVarint(PmaWriter *p, u64 iVal){ + int nByte; + u8 aByte[10]; + nByte = sqlite3PutVarint(aByte, iVal); + vdbePmaWriteBlob(p, aByte, nByte); +} + +/* +** Write the current contents of in-memory linked-list pList to a level-0 +** PMA in the temp file belonging to sub-task pTask. Return SQLITE_OK if +** successful, or an SQLite error code otherwise. +** +** The format of a PMA is: +** +** * A varint. This varint contains the total number of bytes of content +** in the PMA (not including the varint itself). +** +** * One or more records packed end-to-end in order of ascending keys. +** Each record consists of a varint followed by a blob of data (the +** key). The varint is the number of bytes in the blob of data. +*/ +static int vdbeSorterListToPMA(SortSubtask *pTask, SorterList *pList){ + sqlite3 *db = pTask->pSorter->db; + int rc = SQLITE_OK; /* Return code */ + PmaWriter writer; /* Object used to write to the file */ + +#ifdef SQLITE_DEBUG + /* Set iSz to the expected size of file pTask->file after writing the PMA. + ** This is used by an assert() statement at the end of this function. */ + i64 iSz = pList->szPMA + sqlite3VarintLen(pList->szPMA) + pTask->file.iEof; +#endif + + vdbeSorterWorkDebug(pTask, "enter"); + memset(&writer, 0, sizeof(PmaWriter)); + assert( pList->szPMA>0 ); + + /* If the first temporary PMA file has not been opened, open it now. */ + if( pTask->file.pFd==0 ){ + rc = vdbeSorterOpenTempFile(db, 0, &pTask->file.pFd); + assert( rc!=SQLITE_OK || pTask->file.pFd ); + assert( pTask->file.iEof==0 ); + assert( pTask->nPMA==0 ); + } + + /* Try to get the file to memory map */ + if( rc==SQLITE_OK ){ + vdbeSorterExtendFile(db, pTask->file.pFd, pTask->file.iEof+pList->szPMA+9); + } + + /* Sort the list */ + if( rc==SQLITE_OK ){ + rc = vdbeSorterSort(pTask, pList); + } + + if( rc==SQLITE_OK ){ + SorterRecord *p; + SorterRecord *pNext = 0; + + vdbePmaWriterInit(pTask->file.pFd, &writer, pTask->pSorter->pgsz, + pTask->file.iEof); + pTask->nPMA++; + vdbePmaWriteVarint(&writer, pList->szPMA); + for(p=pList->pList; p; p=pNext){ + pNext = p->u.pNext; + vdbePmaWriteVarint(&writer, p->nVal); + vdbePmaWriteBlob(&writer, SRVAL(p), p->nVal); + if( pList->aMemory==0 ) sqlite3_free(p); + } + pList->pList = p; + rc = vdbePmaWriterFinish(&writer, &pTask->file.iEof); + } + + vdbeSorterWorkDebug(pTask, "exit"); + assert( rc!=SQLITE_OK || pList->pList==0 ); + assert( rc!=SQLITE_OK || pTask->file.iEof==iSz ); + return rc; +} + +/* +** Advance the MergeEngine to its next entry. +** Set *pbEof to true there is no next entry because +** the MergeEngine has reached the end of all its inputs. +** +** Return SQLITE_OK if successful or an error code if an error occurs. +*/ +static int vdbeMergeEngineStep( + MergeEngine *pMerger, /* The merge engine to advance to the next row */ + int *pbEof /* Set TRUE at EOF. Set false for more content */ +){ + int rc; + int iPrev = pMerger->aTree[1];/* Index of PmaReader to advance */ + SortSubtask *pTask = pMerger->pTask; + + /* Advance the current PmaReader */ + rc = vdbePmaReaderNext(&pMerger->aReadr[iPrev]); + + /* Update contents of aTree[] */ + if( rc==SQLITE_OK ){ + int i; /* Index of aTree[] to recalculate */ + PmaReader *pReadr1; /* First PmaReader to compare */ + PmaReader *pReadr2; /* Second PmaReader to compare */ + int bCached = 0; + + /* Find the first two PmaReaders to compare. The one that was just + ** advanced (iPrev) and the one next to it in the array. */ + pReadr1 = &pMerger->aReadr[(iPrev & 0xFFFE)]; + pReadr2 = &pMerger->aReadr[(iPrev | 0x0001)]; + + for(i=(pMerger->nTree+iPrev)/2; i>0; i=i/2){ + /* Compare pReadr1 and pReadr2. Store the result in variable iRes. */ + int iRes; + if( pReadr1->pFd==0 ){ + iRes = +1; + }else if( pReadr2->pFd==0 ){ + iRes = -1; + }else{ + iRes = pTask->xCompare(pTask, &bCached, + pReadr1->aKey, pReadr1->nKey, pReadr2->aKey, pReadr2->nKey + ); + } + + /* If pReadr1 contained the smaller value, set aTree[i] to its index. + ** Then set pReadr2 to the next PmaReader to compare to pReadr1. In this + ** case there is no cache of pReadr2 in pTask->pUnpacked, so set + ** pKey2 to point to the record belonging to pReadr2. + ** + ** Alternatively, if pReadr2 contains the smaller of the two values, + ** set aTree[i] to its index and update pReadr1. If vdbeSorterCompare() + ** was actually called above, then pTask->pUnpacked now contains + ** a value equivalent to pReadr2. So set pKey2 to NULL to prevent + ** vdbeSorterCompare() from decoding pReadr2 again. + ** + ** If the two values were equal, then the value from the oldest + ** PMA should be considered smaller. The VdbeSorter.aReadr[] array + ** is sorted from oldest to newest, so pReadr1 contains older values + ** than pReadr2 iff (pReadr1aTree[i] = (int)(pReadr1 - pMerger->aReadr); + pReadr2 = &pMerger->aReadr[ pMerger->aTree[i ^ 0x0001] ]; + bCached = 0; + }else{ + if( pReadr1->pFd ) bCached = 0; + pMerger->aTree[i] = (int)(pReadr2 - pMerger->aReadr); + pReadr1 = &pMerger->aReadr[ pMerger->aTree[i ^ 0x0001] ]; + } + } + *pbEof = (pMerger->aReadr[pMerger->aTree[1]].pFd==0); + } + + return (rc==SQLITE_OK ? pTask->pUnpacked->errCode : rc); +} + +#if SQLITE_MAX_WORKER_THREADS>0 +/* +** The main routine for background threads that write level-0 PMAs. +*/ +static void *vdbeSorterFlushThread(void *pCtx){ + SortSubtask *pTask = (SortSubtask*)pCtx; + int rc; /* Return code */ + assert( pTask->bDone==0 ); + rc = vdbeSorterListToPMA(pTask, &pTask->list); + pTask->bDone = 1; + return SQLITE_INT_TO_PTR(rc); +} +#endif /* SQLITE_MAX_WORKER_THREADS>0 */ + +/* +** Flush the current contents of VdbeSorter.list to a new PMA, possibly +** using a background thread. +*/ +static int vdbeSorterFlushPMA(VdbeSorter *pSorter){ +#if SQLITE_MAX_WORKER_THREADS==0 + pSorter->bUsePMA = 1; + return vdbeSorterListToPMA(&pSorter->aTask[0], &pSorter->list); +#else + int rc = SQLITE_OK; + int i; + SortSubtask *pTask = 0; /* Thread context used to create new PMA */ + int nWorker = (pSorter->nTask-1); + + /* Set the flag to indicate that at least one PMA has been written. + ** Or will be, anyhow. */ + pSorter->bUsePMA = 1; + + /* Select a sub-task to sort and flush the current list of in-memory + ** records to disk. If the sorter is running in multi-threaded mode, + ** round-robin between the first (pSorter->nTask-1) tasks. Except, if + ** the background thread from a sub-tasks previous turn is still running, + ** skip it. If the first (pSorter->nTask-1) sub-tasks are all still busy, + ** fall back to using the final sub-task. The first (pSorter->nTask-1) + ** sub-tasks are prefered as they use background threads - the final + ** sub-task uses the main thread. */ + for(i=0; iiPrev + i + 1) % nWorker; + pTask = &pSorter->aTask[iTest]; + if( pTask->bDone ){ + rc = vdbeSorterJoinThread(pTask); + } + if( rc!=SQLITE_OK || pTask->pThread==0 ) break; + } + + if( rc==SQLITE_OK ){ + if( i==nWorker ){ + /* Use the foreground thread for this operation */ + rc = vdbeSorterListToPMA(&pSorter->aTask[nWorker], &pSorter->list); + }else{ + /* Launch a background thread for this operation */ + u8 *aMem = pTask->list.aMemory; + void *pCtx = (void*)pTask; + + assert( pTask->pThread==0 && pTask->bDone==0 ); + assert( pTask->list.pList==0 ); + assert( pTask->list.aMemory==0 || pSorter->list.aMemory!=0 ); + + pSorter->iPrev = (u8)(pTask - pSorter->aTask); + pTask->list = pSorter->list; + pSorter->list.pList = 0; + pSorter->list.szPMA = 0; + if( aMem ){ + pSorter->list.aMemory = aMem; + pSorter->nMemory = sqlite3MallocSize(aMem); + }else if( pSorter->list.aMemory ){ + pSorter->list.aMemory = sqlite3Malloc(pSorter->nMemory); + if( !pSorter->list.aMemory ) return SQLITE_NOMEM_BKPT; + } + + rc = vdbeSorterCreateThread(pTask, vdbeSorterFlushThread, pCtx); + } + } + + return rc; +#endif /* SQLITE_MAX_WORKER_THREADS!=0 */ +} + +/* +** Add a record to the sorter. +*/ +SQLITE_PRIVATE int sqlite3VdbeSorterWrite( + const VdbeCursor *pCsr, /* Sorter cursor */ + Mem *pVal /* Memory cell containing record */ +){ + VdbeSorter *pSorter; + int rc = SQLITE_OK; /* Return Code */ + SorterRecord *pNew; /* New list element */ + int bFlush; /* True to flush contents of memory to PMA */ + int nReq; /* Bytes of memory required */ + int nPMA; /* Bytes of PMA space required */ + int t; /* serial type of first record field */ + + assert( pCsr->eCurType==CURTYPE_SORTER ); + pSorter = pCsr->uc.pSorter; + getVarint32((const u8*)&pVal->z[1], t); + if( t>0 && t<10 && t!=7 ){ + pSorter->typeMask &= SORTER_TYPE_INTEGER; + }else if( t>10 && (t & 0x01) ){ + pSorter->typeMask &= SORTER_TYPE_TEXT; + }else{ + pSorter->typeMask = 0; + } + + assert( pSorter ); + + /* Figure out whether or not the current contents of memory should be + ** flushed to a PMA before continuing. If so, do so. + ** + ** If using the single large allocation mode (pSorter->aMemory!=0), then + ** flush the contents of memory to a new PMA if (a) at least one value is + ** already in memory and (b) the new value will not fit in memory. + ** + ** Or, if using separate allocations for each record, flush the contents + ** of memory to a PMA if either of the following are true: + ** + ** * The total memory allocated for the in-memory list is greater + ** than (page-size * cache-size), or + ** + ** * The total memory allocated for the in-memory list is greater + ** than (page-size * 10) and sqlite3HeapNearlyFull() returns true. + */ + nReq = pVal->n + sizeof(SorterRecord); + nPMA = pVal->n + sqlite3VarintLen(pVal->n); + if( pSorter->mxPmaSize ){ + if( pSorter->list.aMemory ){ + bFlush = pSorter->iMemory && (pSorter->iMemory+nReq) > pSorter->mxPmaSize; + }else{ + bFlush = ( + (pSorter->list.szPMA > pSorter->mxPmaSize) + || (pSorter->list.szPMA > pSorter->mnPmaSize && sqlite3HeapNearlyFull()) + ); + } + if( bFlush ){ + rc = vdbeSorterFlushPMA(pSorter); + pSorter->list.szPMA = 0; + pSorter->iMemory = 0; + assert( rc!=SQLITE_OK || pSorter->list.pList==0 ); + } + } + + pSorter->list.szPMA += nPMA; + if( nPMA>pSorter->mxKeysize ){ + pSorter->mxKeysize = nPMA; + } + + if( pSorter->list.aMemory ){ + int nMin = pSorter->iMemory + nReq; + + if( nMin>pSorter->nMemory ){ + u8 *aNew; + int iListOff = (u8*)pSorter->list.pList - pSorter->list.aMemory; + int nNew = pSorter->nMemory * 2; + while( nNew < nMin ) nNew = nNew*2; + if( nNew > pSorter->mxPmaSize ) nNew = pSorter->mxPmaSize; + if( nNew < nMin ) nNew = nMin; + + aNew = sqlite3Realloc(pSorter->list.aMemory, nNew); + if( !aNew ) return SQLITE_NOMEM_BKPT; + pSorter->list.pList = (SorterRecord*)&aNew[iListOff]; + pSorter->list.aMemory = aNew; + pSorter->nMemory = nNew; + } + + pNew = (SorterRecord*)&pSorter->list.aMemory[pSorter->iMemory]; + pSorter->iMemory += ROUND8(nReq); + if( pSorter->list.pList ){ + pNew->u.iNext = (int)((u8*)(pSorter->list.pList) - pSorter->list.aMemory); + } + }else{ + pNew = (SorterRecord *)sqlite3Malloc(nReq); + if( pNew==0 ){ + return SQLITE_NOMEM_BKPT; + } + pNew->u.pNext = pSorter->list.pList; + } + + memcpy(SRVAL(pNew), pVal->z, pVal->n); + pNew->nVal = pVal->n; + pSorter->list.pList = pNew; + + return rc; +} + +/* +** Read keys from pIncr->pMerger and populate pIncr->aFile[1]. The format +** of the data stored in aFile[1] is the same as that used by regular PMAs, +** except that the number-of-bytes varint is omitted from the start. +*/ +static int vdbeIncrPopulate(IncrMerger *pIncr){ + int rc = SQLITE_OK; + int rc2; + i64 iStart = pIncr->iStartOff; + SorterFile *pOut = &pIncr->aFile[1]; + SortSubtask *pTask = pIncr->pTask; + MergeEngine *pMerger = pIncr->pMerger; + PmaWriter writer; + assert( pIncr->bEof==0 ); + + vdbeSorterPopulateDebug(pTask, "enter"); + + vdbePmaWriterInit(pOut->pFd, &writer, pTask->pSorter->pgsz, iStart); + while( rc==SQLITE_OK ){ + int dummy; + PmaReader *pReader = &pMerger->aReadr[ pMerger->aTree[1] ]; + int nKey = pReader->nKey; + i64 iEof = writer.iWriteOff + writer.iBufEnd; + + /* Check if the output file is full or if the input has been exhausted. + ** In either case exit the loop. */ + if( pReader->pFd==0 ) break; + if( (iEof + nKey + sqlite3VarintLen(nKey))>(iStart + pIncr->mxSz) ) break; + + /* Write the next key to the output. */ + vdbePmaWriteVarint(&writer, nKey); + vdbePmaWriteBlob(&writer, pReader->aKey, nKey); + assert( pIncr->pMerger->pTask==pTask ); + rc = vdbeMergeEngineStep(pIncr->pMerger, &dummy); + } + + rc2 = vdbePmaWriterFinish(&writer, &pOut->iEof); + if( rc==SQLITE_OK ) rc = rc2; + vdbeSorterPopulateDebug(pTask, "exit"); + return rc; +} + +#if SQLITE_MAX_WORKER_THREADS>0 +/* +** The main routine for background threads that populate aFile[1] of +** multi-threaded IncrMerger objects. +*/ +static void *vdbeIncrPopulateThread(void *pCtx){ + IncrMerger *pIncr = (IncrMerger*)pCtx; + void *pRet = SQLITE_INT_TO_PTR( vdbeIncrPopulate(pIncr) ); + pIncr->pTask->bDone = 1; + return pRet; +} + +/* +** Launch a background thread to populate aFile[1] of pIncr. +*/ +static int vdbeIncrBgPopulate(IncrMerger *pIncr){ + void *p = (void*)pIncr; + assert( pIncr->bUseThread ); + return vdbeSorterCreateThread(pIncr->pTask, vdbeIncrPopulateThread, p); +} +#endif + +/* +** This function is called when the PmaReader corresponding to pIncr has +** finished reading the contents of aFile[0]. Its purpose is to "refill" +** aFile[0] such that the PmaReader should start rereading it from the +** beginning. +** +** For single-threaded objects, this is accomplished by literally reading +** keys from pIncr->pMerger and repopulating aFile[0]. +** +** For multi-threaded objects, all that is required is to wait until the +** background thread is finished (if it is not already) and then swap +** aFile[0] and aFile[1] in place. If the contents of pMerger have not +** been exhausted, this function also launches a new background thread +** to populate the new aFile[1]. +** +** SQLITE_OK is returned on success, or an SQLite error code otherwise. +*/ +static int vdbeIncrSwap(IncrMerger *pIncr){ + int rc = SQLITE_OK; + +#if SQLITE_MAX_WORKER_THREADS>0 + if( pIncr->bUseThread ){ + rc = vdbeSorterJoinThread(pIncr->pTask); + + if( rc==SQLITE_OK ){ + SorterFile f0 = pIncr->aFile[0]; + pIncr->aFile[0] = pIncr->aFile[1]; + pIncr->aFile[1] = f0; + } + + if( rc==SQLITE_OK ){ + if( pIncr->aFile[0].iEof==pIncr->iStartOff ){ + pIncr->bEof = 1; + }else{ + rc = vdbeIncrBgPopulate(pIncr); + } + } + }else +#endif + { + rc = vdbeIncrPopulate(pIncr); + pIncr->aFile[0] = pIncr->aFile[1]; + if( pIncr->aFile[0].iEof==pIncr->iStartOff ){ + pIncr->bEof = 1; + } + } + + return rc; +} + +/* +** Allocate and return a new IncrMerger object to read data from pMerger. +** +** If an OOM condition is encountered, return NULL. In this case free the +** pMerger argument before returning. +*/ +static int vdbeIncrMergerNew( + SortSubtask *pTask, /* The thread that will be using the new IncrMerger */ + MergeEngine *pMerger, /* The MergeEngine that the IncrMerger will control */ + IncrMerger **ppOut /* Write the new IncrMerger here */ +){ + int rc = SQLITE_OK; + IncrMerger *pIncr = *ppOut = (IncrMerger*) + (sqlite3FaultSim(100) ? 0 : sqlite3MallocZero(sizeof(*pIncr))); + if( pIncr ){ + pIncr->pMerger = pMerger; + pIncr->pTask = pTask; + pIncr->mxSz = MAX(pTask->pSorter->mxKeysize+9,pTask->pSorter->mxPmaSize/2); + pTask->file2.iEof += pIncr->mxSz; + }else{ + vdbeMergeEngineFree(pMerger); + rc = SQLITE_NOMEM_BKPT; + } + return rc; +} + +#if SQLITE_MAX_WORKER_THREADS>0 +/* +** Set the "use-threads" flag on object pIncr. +*/ +static void vdbeIncrMergerSetThreads(IncrMerger *pIncr){ + pIncr->bUseThread = 1; + pIncr->pTask->file2.iEof -= pIncr->mxSz; +} +#endif /* SQLITE_MAX_WORKER_THREADS>0 */ + + + +/* +** Recompute pMerger->aTree[iOut] by comparing the next keys on the +** two PmaReaders that feed that entry. Neither of the PmaReaders +** are advanced. This routine merely does the comparison. +*/ +static void vdbeMergeEngineCompare( + MergeEngine *pMerger, /* Merge engine containing PmaReaders to compare */ + int iOut /* Store the result in pMerger->aTree[iOut] */ +){ + int i1; + int i2; + int iRes; + PmaReader *p1; + PmaReader *p2; + + assert( iOutnTree && iOut>0 ); + + if( iOut>=(pMerger->nTree/2) ){ + i1 = (iOut - pMerger->nTree/2) * 2; + i2 = i1 + 1; + }else{ + i1 = pMerger->aTree[iOut*2]; + i2 = pMerger->aTree[iOut*2+1]; + } + + p1 = &pMerger->aReadr[i1]; + p2 = &pMerger->aReadr[i2]; + + if( p1->pFd==0 ){ + iRes = i2; + }else if( p2->pFd==0 ){ + iRes = i1; + }else{ + SortSubtask *pTask = pMerger->pTask; + int bCached = 0; + int res; + assert( pTask->pUnpacked!=0 ); /* from vdbeSortSubtaskMain() */ + res = pTask->xCompare( + pTask, &bCached, p1->aKey, p1->nKey, p2->aKey, p2->nKey + ); + if( res<=0 ){ + iRes = i1; + }else{ + iRes = i2; + } + } + + pMerger->aTree[iOut] = iRes; +} + +/* +** Allowed values for the eMode parameter to vdbeMergeEngineInit() +** and vdbePmaReaderIncrMergeInit(). +** +** Only INCRINIT_NORMAL is valid in single-threaded builds (when +** SQLITE_MAX_WORKER_THREADS==0). The other values are only used +** when there exists one or more separate worker threads. +*/ +#define INCRINIT_NORMAL 0 +#define INCRINIT_TASK 1 +#define INCRINIT_ROOT 2 + +/* +** Forward reference required as the vdbeIncrMergeInit() and +** vdbePmaReaderIncrInit() routines are called mutually recursively when +** building a merge tree. +*/ +static int vdbePmaReaderIncrInit(PmaReader *pReadr, int eMode); + +/* +** Initialize the MergeEngine object passed as the second argument. Once this +** function returns, the first key of merged data may be read from the +** MergeEngine object in the usual fashion. +** +** If argument eMode is INCRINIT_ROOT, then it is assumed that any IncrMerge +** objects attached to the PmaReader objects that the merger reads from have +** already been populated, but that they have not yet populated aFile[0] and +** set the PmaReader objects up to read from it. In this case all that is +** required is to call vdbePmaReaderNext() on each PmaReader to point it at +** its first key. +** +** Otherwise, if eMode is any value other than INCRINIT_ROOT, then use +** vdbePmaReaderIncrMergeInit() to initialize each PmaReader that feeds data +** to pMerger. +** +** SQLITE_OK is returned if successful, or an SQLite error code otherwise. +*/ +static int vdbeMergeEngineInit( + SortSubtask *pTask, /* Thread that will run pMerger */ + MergeEngine *pMerger, /* MergeEngine to initialize */ + int eMode /* One of the INCRINIT_XXX constants */ +){ + int rc = SQLITE_OK; /* Return code */ + int i; /* For looping over PmaReader objects */ + int nTree = pMerger->nTree; + + /* eMode is always INCRINIT_NORMAL in single-threaded mode */ + assert( SQLITE_MAX_WORKER_THREADS>0 || eMode==INCRINIT_NORMAL ); + + /* Verify that the MergeEngine is assigned to a single thread */ + assert( pMerger->pTask==0 ); + pMerger->pTask = pTask; + + for(i=0; i0 && eMode==INCRINIT_ROOT ){ + /* PmaReaders should be normally initialized in order, as if they are + ** reading from the same temp file this makes for more linear file IO. + ** However, in the INCRINIT_ROOT case, if PmaReader aReadr[nTask-1] is + ** in use it will block the vdbePmaReaderNext() call while it uses + ** the main thread to fill its buffer. So calling PmaReaderNext() + ** on this PmaReader before any of the multi-threaded PmaReaders takes + ** better advantage of multi-processor hardware. */ + rc = vdbePmaReaderNext(&pMerger->aReadr[nTree-i-1]); + }else{ + rc = vdbePmaReaderIncrInit(&pMerger->aReadr[i], INCRINIT_NORMAL); + } + if( rc!=SQLITE_OK ) return rc; + } + + for(i=pMerger->nTree-1; i>0; i--){ + vdbeMergeEngineCompare(pMerger, i); + } + return pTask->pUnpacked->errCode; +} + +/* +** The PmaReader passed as the first argument is guaranteed to be an +** incremental-reader (pReadr->pIncr!=0). This function serves to open +** and/or initialize the temp file related fields of the IncrMerge +** object at (pReadr->pIncr). +** +** If argument eMode is set to INCRINIT_NORMAL, then all PmaReaders +** in the sub-tree headed by pReadr are also initialized. Data is then +** loaded into the buffers belonging to pReadr and it is set to point to +** the first key in its range. +** +** If argument eMode is set to INCRINIT_TASK, then pReadr is guaranteed +** to be a multi-threaded PmaReader and this function is being called in a +** background thread. In this case all PmaReaders in the sub-tree are +** initialized as for INCRINIT_NORMAL and the aFile[1] buffer belonging to +** pReadr is populated. However, pReadr itself is not set up to point +** to its first key. A call to vdbePmaReaderNext() is still required to do +** that. +** +** The reason this function does not call vdbePmaReaderNext() immediately +** in the INCRINIT_TASK case is that vdbePmaReaderNext() assumes that it has +** to block on thread (pTask->thread) before accessing aFile[1]. But, since +** this entire function is being run by thread (pTask->thread), that will +** lead to the current background thread attempting to join itself. +** +** Finally, if argument eMode is set to INCRINIT_ROOT, it may be assumed +** that pReadr->pIncr is a multi-threaded IncrMerge objects, and that all +** child-trees have already been initialized using IncrInit(INCRINIT_TASK). +** In this case vdbePmaReaderNext() is called on all child PmaReaders and +** the current PmaReader set to point to the first key in its range. +** +** SQLITE_OK is returned if successful, or an SQLite error code otherwise. +*/ +static int vdbePmaReaderIncrMergeInit(PmaReader *pReadr, int eMode){ + int rc = SQLITE_OK; + IncrMerger *pIncr = pReadr->pIncr; + SortSubtask *pTask = pIncr->pTask; + sqlite3 *db = pTask->pSorter->db; + + /* eMode is always INCRINIT_NORMAL in single-threaded mode */ + assert( SQLITE_MAX_WORKER_THREADS>0 || eMode==INCRINIT_NORMAL ); + + rc = vdbeMergeEngineInit(pTask, pIncr->pMerger, eMode); + + /* Set up the required files for pIncr. A multi-theaded IncrMerge object + ** requires two temp files to itself, whereas a single-threaded object + ** only requires a region of pTask->file2. */ + if( rc==SQLITE_OK ){ + int mxSz = pIncr->mxSz; +#if SQLITE_MAX_WORKER_THREADS>0 + if( pIncr->bUseThread ){ + rc = vdbeSorterOpenTempFile(db, mxSz, &pIncr->aFile[0].pFd); + if( rc==SQLITE_OK ){ + rc = vdbeSorterOpenTempFile(db, mxSz, &pIncr->aFile[1].pFd); + } + }else +#endif + /*if( !pIncr->bUseThread )*/{ + if( pTask->file2.pFd==0 ){ + assert( pTask->file2.iEof>0 ); + rc = vdbeSorterOpenTempFile(db, pTask->file2.iEof, &pTask->file2.pFd); + pTask->file2.iEof = 0; + } + if( rc==SQLITE_OK ){ + pIncr->aFile[1].pFd = pTask->file2.pFd; + pIncr->iStartOff = pTask->file2.iEof; + pTask->file2.iEof += mxSz; + } + } + } + +#if SQLITE_MAX_WORKER_THREADS>0 + if( rc==SQLITE_OK && pIncr->bUseThread ){ + /* Use the current thread to populate aFile[1], even though this + ** PmaReader is multi-threaded. If this is an INCRINIT_TASK object, + ** then this function is already running in background thread + ** pIncr->pTask->thread. + ** + ** If this is the INCRINIT_ROOT object, then it is running in the + ** main VDBE thread. But that is Ok, as that thread cannot return + ** control to the VDBE or proceed with anything useful until the + ** first results are ready from this merger object anyway. + */ + assert( eMode==INCRINIT_ROOT || eMode==INCRINIT_TASK ); + rc = vdbeIncrPopulate(pIncr); + } +#endif + + if( rc==SQLITE_OK && (SQLITE_MAX_WORKER_THREADS==0 || eMode!=INCRINIT_TASK) ){ + rc = vdbePmaReaderNext(pReadr); + } + + return rc; +} + +#if SQLITE_MAX_WORKER_THREADS>0 +/* +** The main routine for vdbePmaReaderIncrMergeInit() operations run in +** background threads. +*/ +static void *vdbePmaReaderBgIncrInit(void *pCtx){ + PmaReader *pReader = (PmaReader*)pCtx; + void *pRet = SQLITE_INT_TO_PTR( + vdbePmaReaderIncrMergeInit(pReader,INCRINIT_TASK) + ); + pReader->pIncr->pTask->bDone = 1; + return pRet; +} +#endif + +/* +** If the PmaReader passed as the first argument is not an incremental-reader +** (if pReadr->pIncr==0), then this function is a no-op. Otherwise, it invokes +** the vdbePmaReaderIncrMergeInit() function with the parameters passed to +** this routine to initialize the incremental merge. +** +** If the IncrMerger object is multi-threaded (IncrMerger.bUseThread==1), +** then a background thread is launched to call vdbePmaReaderIncrMergeInit(). +** Or, if the IncrMerger is single threaded, the same function is called +** using the current thread. +*/ +static int vdbePmaReaderIncrInit(PmaReader *pReadr, int eMode){ + IncrMerger *pIncr = pReadr->pIncr; /* Incremental merger */ + int rc = SQLITE_OK; /* Return code */ + if( pIncr ){ +#if SQLITE_MAX_WORKER_THREADS>0 + assert( pIncr->bUseThread==0 || eMode==INCRINIT_TASK ); + if( pIncr->bUseThread ){ + void *pCtx = (void*)pReadr; + rc = vdbeSorterCreateThread(pIncr->pTask, vdbePmaReaderBgIncrInit, pCtx); + }else +#endif + { + rc = vdbePmaReaderIncrMergeInit(pReadr, eMode); + } + } + return rc; +} + +/* +** Allocate a new MergeEngine object to merge the contents of nPMA level-0 +** PMAs from pTask->file. If no error occurs, set *ppOut to point to +** the new object and return SQLITE_OK. Or, if an error does occur, set *ppOut +** to NULL and return an SQLite error code. +** +** When this function is called, *piOffset is set to the offset of the +** first PMA to read from pTask->file. Assuming no error occurs, it is +** set to the offset immediately following the last byte of the last +** PMA before returning. If an error does occur, then the final value of +** *piOffset is undefined. +*/ +static int vdbeMergeEngineLevel0( + SortSubtask *pTask, /* Sorter task to read from */ + int nPMA, /* Number of PMAs to read */ + i64 *piOffset, /* IN/OUT: Readr offset in pTask->file */ + MergeEngine **ppOut /* OUT: New merge-engine */ +){ + MergeEngine *pNew; /* Merge engine to return */ + i64 iOff = *piOffset; + int i; + int rc = SQLITE_OK; + + *ppOut = pNew = vdbeMergeEngineNew(nPMA); + if( pNew==0 ) rc = SQLITE_NOMEM_BKPT; + + for(i=0; iaReadr[i]; + rc = vdbePmaReaderInit(pTask, &pTask->file, iOff, pReadr, &nDummy); + iOff = pReadr->iEof; + } + + if( rc!=SQLITE_OK ){ + vdbeMergeEngineFree(pNew); + *ppOut = 0; + } + *piOffset = iOff; + return rc; +} + +/* +** Return the depth of a tree comprising nPMA PMAs, assuming a fanout of +** SORTER_MAX_MERGE_COUNT. The returned value does not include leaf nodes. +** +** i.e. +** +** nPMA<=16 -> TreeDepth() == 0 +** nPMA<=256 -> TreeDepth() == 1 +** nPMA<=65536 -> TreeDepth() == 2 +*/ +static int vdbeSorterTreeDepth(int nPMA){ + int nDepth = 0; + i64 nDiv = SORTER_MAX_MERGE_COUNT; + while( nDiv < (i64)nPMA ){ + nDiv = nDiv * SORTER_MAX_MERGE_COUNT; + nDepth++; + } + return nDepth; +} + +/* +** pRoot is the root of an incremental merge-tree with depth nDepth (according +** to vdbeSorterTreeDepth()). pLeaf is the iSeq'th leaf to be added to the +** tree, counting from zero. This function adds pLeaf to the tree. +** +** If successful, SQLITE_OK is returned. If an error occurs, an SQLite error +** code is returned and pLeaf is freed. +*/ +static int vdbeSorterAddToTree( + SortSubtask *pTask, /* Task context */ + int nDepth, /* Depth of tree according to TreeDepth() */ + int iSeq, /* Sequence number of leaf within tree */ + MergeEngine *pRoot, /* Root of tree */ + MergeEngine *pLeaf /* Leaf to add to tree */ +){ + int rc = SQLITE_OK; + int nDiv = 1; + int i; + MergeEngine *p = pRoot; + IncrMerger *pIncr; + + rc = vdbeIncrMergerNew(pTask, pLeaf, &pIncr); + + for(i=1; iaReadr[iIter]; + + if( pReadr->pIncr==0 ){ + MergeEngine *pNew = vdbeMergeEngineNew(SORTER_MAX_MERGE_COUNT); + if( pNew==0 ){ + rc = SQLITE_NOMEM_BKPT; + }else{ + rc = vdbeIncrMergerNew(pTask, pNew, &pReadr->pIncr); + } + } + if( rc==SQLITE_OK ){ + p = pReadr->pIncr->pMerger; + nDiv = nDiv / SORTER_MAX_MERGE_COUNT; + } + } + + if( rc==SQLITE_OK ){ + p->aReadr[iSeq % SORTER_MAX_MERGE_COUNT].pIncr = pIncr; + }else{ + vdbeIncrFree(pIncr); + } + return rc; +} + +/* +** This function is called as part of a SorterRewind() operation on a sorter +** that has already written two or more level-0 PMAs to one or more temp +** files. It builds a tree of MergeEngine/IncrMerger/PmaReader objects that +** can be used to incrementally merge all PMAs on disk. +** +** If successful, SQLITE_OK is returned and *ppOut set to point to the +** MergeEngine object at the root of the tree before returning. Or, if an +** error occurs, an SQLite error code is returned and the final value +** of *ppOut is undefined. +*/ +static int vdbeSorterMergeTreeBuild( + VdbeSorter *pSorter, /* The VDBE cursor that implements the sort */ + MergeEngine **ppOut /* Write the MergeEngine here */ +){ + MergeEngine *pMain = 0; + int rc = SQLITE_OK; + int iTask; + +#if SQLITE_MAX_WORKER_THREADS>0 + /* If the sorter uses more than one task, then create the top-level + ** MergeEngine here. This MergeEngine will read data from exactly + ** one PmaReader per sub-task. */ + assert( pSorter->bUseThreads || pSorter->nTask==1 ); + if( pSorter->nTask>1 ){ + pMain = vdbeMergeEngineNew(pSorter->nTask); + if( pMain==0 ) rc = SQLITE_NOMEM_BKPT; + } +#endif + + for(iTask=0; rc==SQLITE_OK && iTasknTask; iTask++){ + SortSubtask *pTask = &pSorter->aTask[iTask]; + assert( pTask->nPMA>0 || SQLITE_MAX_WORKER_THREADS>0 ); + if( SQLITE_MAX_WORKER_THREADS==0 || pTask->nPMA ){ + MergeEngine *pRoot = 0; /* Root node of tree for this task */ + int nDepth = vdbeSorterTreeDepth(pTask->nPMA); + i64 iReadOff = 0; + + if( pTask->nPMA<=SORTER_MAX_MERGE_COUNT ){ + rc = vdbeMergeEngineLevel0(pTask, pTask->nPMA, &iReadOff, &pRoot); + }else{ + int i; + int iSeq = 0; + pRoot = vdbeMergeEngineNew(SORTER_MAX_MERGE_COUNT); + if( pRoot==0 ) rc = SQLITE_NOMEM_BKPT; + for(i=0; inPMA && rc==SQLITE_OK; i += SORTER_MAX_MERGE_COUNT){ + MergeEngine *pMerger = 0; /* New level-0 PMA merger */ + int nReader; /* Number of level-0 PMAs to merge */ + + nReader = MIN(pTask->nPMA - i, SORTER_MAX_MERGE_COUNT); + rc = vdbeMergeEngineLevel0(pTask, nReader, &iReadOff, &pMerger); + if( rc==SQLITE_OK ){ + rc = vdbeSorterAddToTree(pTask, nDepth, iSeq++, pRoot, pMerger); + } + } + } + + if( rc==SQLITE_OK ){ +#if SQLITE_MAX_WORKER_THREADS>0 + if( pMain!=0 ){ + rc = vdbeIncrMergerNew(pTask, pRoot, &pMain->aReadr[iTask].pIncr); + }else +#endif + { + assert( pMain==0 ); + pMain = pRoot; + } + }else{ + vdbeMergeEngineFree(pRoot); + } + } + } + + if( rc!=SQLITE_OK ){ + vdbeMergeEngineFree(pMain); + pMain = 0; + } + *ppOut = pMain; + return rc; +} + +/* +** This function is called as part of an sqlite3VdbeSorterRewind() operation +** on a sorter that has written two or more PMAs to temporary files. It sets +** up either VdbeSorter.pMerger (for single threaded sorters) or pReader +** (for multi-threaded sorters) so that it can be used to iterate through +** all records stored in the sorter. +** +** SQLITE_OK is returned if successful, or an SQLite error code otherwise. +*/ +static int vdbeSorterSetupMerge(VdbeSorter *pSorter){ + int rc; /* Return code */ + SortSubtask *pTask0 = &pSorter->aTask[0]; + MergeEngine *pMain = 0; +#if SQLITE_MAX_WORKER_THREADS + sqlite3 *db = pTask0->pSorter->db; + int i; + SorterCompare xCompare = vdbeSorterGetCompare(pSorter); + for(i=0; inTask; i++){ + pSorter->aTask[i].xCompare = xCompare; + } +#endif + + rc = vdbeSorterMergeTreeBuild(pSorter, &pMain); + if( rc==SQLITE_OK ){ +#if SQLITE_MAX_WORKER_THREADS + assert( pSorter->bUseThreads==0 || pSorter->nTask>1 ); + if( pSorter->bUseThreads ){ + int iTask; + PmaReader *pReadr = 0; + SortSubtask *pLast = &pSorter->aTask[pSorter->nTask-1]; + rc = vdbeSortAllocUnpacked(pLast); + if( rc==SQLITE_OK ){ + pReadr = (PmaReader*)sqlite3DbMallocZero(db, sizeof(PmaReader)); + pSorter->pReader = pReadr; + if( pReadr==0 ) rc = SQLITE_NOMEM_BKPT; + } + if( rc==SQLITE_OK ){ + rc = vdbeIncrMergerNew(pLast, pMain, &pReadr->pIncr); + if( rc==SQLITE_OK ){ + vdbeIncrMergerSetThreads(pReadr->pIncr); + for(iTask=0; iTask<(pSorter->nTask-1); iTask++){ + IncrMerger *pIncr; + if( (pIncr = pMain->aReadr[iTask].pIncr) ){ + vdbeIncrMergerSetThreads(pIncr); + assert( pIncr->pTask!=pLast ); + } + } + for(iTask=0; rc==SQLITE_OK && iTasknTask; iTask++){ + /* Check that: + ** + ** a) The incremental merge object is configured to use the + ** right task, and + ** b) If it is using task (nTask-1), it is configured to run + ** in single-threaded mode. This is important, as the + ** root merge (INCRINIT_ROOT) will be using the same task + ** object. + */ + PmaReader *p = &pMain->aReadr[iTask]; + assert( p->pIncr==0 || ( + (p->pIncr->pTask==&pSorter->aTask[iTask]) /* a */ + && (iTask!=pSorter->nTask-1 || p->pIncr->bUseThread==0) /* b */ + )); + rc = vdbePmaReaderIncrInit(p, INCRINIT_TASK); + } + } + pMain = 0; + } + if( rc==SQLITE_OK ){ + rc = vdbePmaReaderIncrMergeInit(pReadr, INCRINIT_ROOT); + } + }else +#endif + { + rc = vdbeMergeEngineInit(pTask0, pMain, INCRINIT_NORMAL); + pSorter->pMerger = pMain; + pMain = 0; + } + } + + if( rc!=SQLITE_OK ){ + vdbeMergeEngineFree(pMain); + } + return rc; +} + + +/* +** Once the sorter has been populated by calls to sqlite3VdbeSorterWrite, +** this function is called to prepare for iterating through the records +** in sorted order. +*/ +SQLITE_PRIVATE int sqlite3VdbeSorterRewind(const VdbeCursor *pCsr, int *pbEof){ + VdbeSorter *pSorter; + int rc = SQLITE_OK; /* Return code */ + + assert( pCsr->eCurType==CURTYPE_SORTER ); + pSorter = pCsr->uc.pSorter; + assert( pSorter ); + + /* If no data has been written to disk, then do not do so now. Instead, + ** sort the VdbeSorter.pRecord list. The vdbe layer will read data directly + ** from the in-memory list. */ + if( pSorter->bUsePMA==0 ){ + if( pSorter->list.pList ){ + *pbEof = 0; + rc = vdbeSorterSort(&pSorter->aTask[0], &pSorter->list); + }else{ + *pbEof = 1; + } + return rc; + } + + /* Write the current in-memory list to a PMA. When the VdbeSorterWrite() + ** function flushes the contents of memory to disk, it immediately always + ** creates a new list consisting of a single key immediately afterwards. + ** So the list is never empty at this point. */ + assert( pSorter->list.pList ); + rc = vdbeSorterFlushPMA(pSorter); + + /* Join all threads */ + rc = vdbeSorterJoinAll(pSorter, rc); + + vdbeSorterRewindDebug("rewind"); + + /* Assuming no errors have occurred, set up a merger structure to + ** incrementally read and merge all remaining PMAs. */ + assert( pSorter->pReader==0 ); + if( rc==SQLITE_OK ){ + rc = vdbeSorterSetupMerge(pSorter); + *pbEof = 0; + } + + vdbeSorterRewindDebug("rewinddone"); + return rc; +} + +/* +** Advance to the next element in the sorter. +*/ +SQLITE_PRIVATE int sqlite3VdbeSorterNext(sqlite3 *db, const VdbeCursor *pCsr, int *pbEof){ + VdbeSorter *pSorter; + int rc; /* Return code */ + + assert( pCsr->eCurType==CURTYPE_SORTER ); + pSorter = pCsr->uc.pSorter; + assert( pSorter->bUsePMA || (pSorter->pReader==0 && pSorter->pMerger==0) ); + if( pSorter->bUsePMA ){ + assert( pSorter->pReader==0 || pSorter->pMerger==0 ); + assert( pSorter->bUseThreads==0 || pSorter->pReader ); + assert( pSorter->bUseThreads==1 || pSorter->pMerger ); +#if SQLITE_MAX_WORKER_THREADS>0 + if( pSorter->bUseThreads ){ + rc = vdbePmaReaderNext(pSorter->pReader); + *pbEof = (pSorter->pReader->pFd==0); + }else +#endif + /*if( !pSorter->bUseThreads )*/ { + assert( pSorter->pMerger!=0 ); + assert( pSorter->pMerger->pTask==(&pSorter->aTask[0]) ); + rc = vdbeMergeEngineStep(pSorter->pMerger, pbEof); + } + }else{ + SorterRecord *pFree = pSorter->list.pList; + pSorter->list.pList = pFree->u.pNext; + pFree->u.pNext = 0; + if( pSorter->list.aMemory==0 ) vdbeSorterRecordFree(db, pFree); + *pbEof = !pSorter->list.pList; + rc = SQLITE_OK; + } + return rc; +} + +/* +** Return a pointer to a buffer owned by the sorter that contains the +** current key. +*/ +static void *vdbeSorterRowkey( + const VdbeSorter *pSorter, /* Sorter object */ + int *pnKey /* OUT: Size of current key in bytes */ +){ + void *pKey; + if( pSorter->bUsePMA ){ + PmaReader *pReader; +#if SQLITE_MAX_WORKER_THREADS>0 + if( pSorter->bUseThreads ){ + pReader = pSorter->pReader; + }else +#endif + /*if( !pSorter->bUseThreads )*/{ + pReader = &pSorter->pMerger->aReadr[pSorter->pMerger->aTree[1]]; + } + *pnKey = pReader->nKey; + pKey = pReader->aKey; + }else{ + *pnKey = pSorter->list.pList->nVal; + pKey = SRVAL(pSorter->list.pList); + } + return pKey; +} + +/* +** Copy the current sorter key into the memory cell pOut. +*/ +SQLITE_PRIVATE int sqlite3VdbeSorterRowkey(const VdbeCursor *pCsr, Mem *pOut){ + VdbeSorter *pSorter; + void *pKey; int nKey; /* Sorter key to copy into pOut */ + + assert( pCsr->eCurType==CURTYPE_SORTER ); + pSorter = pCsr->uc.pSorter; + pKey = vdbeSorterRowkey(pSorter, &nKey); + if( sqlite3VdbeMemClearAndResize(pOut, nKey) ){ + return SQLITE_NOMEM_BKPT; + } + pOut->n = nKey; + MemSetTypeFlag(pOut, MEM_Blob); + memcpy(pOut->z, pKey, nKey); + + return SQLITE_OK; +} + +/* +** Compare the key in memory cell pVal with the key that the sorter cursor +** passed as the first argument currently points to. For the purposes of +** the comparison, ignore the rowid field at the end of each record. +** +** If the sorter cursor key contains any NULL values, consider it to be +** less than pVal. Even if pVal also contains NULL values. +** +** If an error occurs, return an SQLite error code (i.e. SQLITE_NOMEM). +** Otherwise, set *pRes to a negative, zero or positive value if the +** key in pVal is smaller than, equal to or larger than the current sorter +** key. +** +** This routine forms the core of the OP_SorterCompare opcode, which in +** turn is used to verify uniqueness when constructing a UNIQUE INDEX. +*/ +SQLITE_PRIVATE int sqlite3VdbeSorterCompare( + const VdbeCursor *pCsr, /* Sorter cursor */ + Mem *pVal, /* Value to compare to current sorter key */ + int nKeyCol, /* Compare this many columns */ + int *pRes /* OUT: Result of comparison */ +){ + VdbeSorter *pSorter; + UnpackedRecord *r2; + KeyInfo *pKeyInfo; + int i; + void *pKey; int nKey; /* Sorter key to compare pVal with */ + + assert( pCsr->eCurType==CURTYPE_SORTER ); + pSorter = pCsr->uc.pSorter; + r2 = pSorter->pUnpacked; + pKeyInfo = pCsr->pKeyInfo; + if( r2==0 ){ + char *p; + r2 = pSorter->pUnpacked = sqlite3VdbeAllocUnpackedRecord(pKeyInfo,0,0,&p); + assert( pSorter->pUnpacked==(UnpackedRecord*)p ); + if( r2==0 ) return SQLITE_NOMEM_BKPT; + r2->nField = nKeyCol; + } + assert( r2->nField==nKeyCol ); + + pKey = vdbeSorterRowkey(pSorter, &nKey); + sqlite3VdbeRecordUnpack(pKeyInfo, nKey, pKey, r2); + for(i=0; iaMem[i].flags & MEM_Null ){ + *pRes = -1; + return SQLITE_OK; + } + } + + *pRes = sqlite3VdbeRecordCompare(pVal->n, pVal->z, r2); + return SQLITE_OK; +} + +/************** End of vdbesort.c ********************************************/ +/************** Begin file memjournal.c **************************************/ +/* +** 2008 October 7 +** +** 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 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. +** +** Update: The in-memory journal is also used to temporarily cache +** smaller journals that are not critical for power-loss recovery. +** For example, statement journals that are not too big will be held +** entirely in memory, thus reducing the number of file I/O calls, and +** more importantly, reducing temporary file creation events. If these +** journals become too large for memory, they are spilled to disk. But +** in the common case, they are usually small and no file I/O needs to +** occur. +*/ +/* #include "sqliteInt.h" */ + +/* Forward references to internal structures */ +typedef struct MemJournal MemJournal; +typedef struct FilePoint FilePoint; +typedef struct FileChunk FileChunk; + +/* +** The rollback journal is composed of a linked list of these structures. +** +** The zChunk array is always at least 8 bytes in size - usually much more. +** Its actual size is stored in the MemJournal.nChunkSize variable. +*/ +struct FileChunk { + FileChunk *pNext; /* Next chunk in the journal */ + u8 zChunk[8]; /* Content of this chunk */ +}; + +/* +** By default, allocate this many bytes of memory for each FileChunk object. +*/ +#define MEMJOURNAL_DFLT_FILECHUNKSIZE 1024 + +/* +** For chunk size nChunkSize, return the number of bytes that should +** be allocated for each FileChunk structure. +*/ +#define fileChunkSize(nChunkSize) (sizeof(FileChunk) + ((nChunkSize)-8)) + +/* +** An instance of this object serves as a cursor into the rollback journal. +** The cursor can be either for reading or writing. +*/ +struct FilePoint { + sqlite3_int64 iOffset; /* Offset from the beginning of the file */ + FileChunk *pChunk; /* Specific chunk into which cursor points */ +}; + +/* +** This structure is a subclass of sqlite3_file. Each open memory-journal +** is an instance of this class. +*/ +struct MemJournal { + const sqlite3_io_methods *pMethod; /* Parent class. MUST BE FIRST */ + int nChunkSize; /* In-memory chunk-size */ + + int nSpill; /* Bytes of data before flushing */ + int nSize; /* Bytes of data currently in memory */ + FileChunk *pFirst; /* Head of in-memory chunk-list */ + FilePoint endpoint; /* Pointer to the end of the file */ + FilePoint readpoint; /* Pointer to the end of the last xRead() */ + + int flags; /* xOpen flags */ + sqlite3_vfs *pVfs; /* The "real" underlying VFS */ + const char *zJournal; /* Name of the journal file */ +}; + +/* +** Read data from the in-memory journal file. This is the implementation +** of the sqlite3_vfs.xRead method. +*/ +static int memjrnlRead( + sqlite3_file *pJfd, /* The journal file from which to read */ + void *zBuf, /* Put the results here */ + int iAmt, /* Number of bytes to read */ + sqlite_int64 iOfst /* Begin reading at this offset */ +){ + MemJournal *p = (MemJournal *)pJfd; + u8 *zOut = zBuf; + int nRead = iAmt; + int iChunkOffset; + FileChunk *pChunk; + +#ifdef SQLITE_ENABLE_ATOMIC_WRITE + if( (iAmt+iOfst)>p->endpoint.iOffset ){ + return SQLITE_IOERR_SHORT_READ; + } +#endif + + assert( (iAmt+iOfst)<=p->endpoint.iOffset ); + assert( p->readpoint.iOffset==0 || p->readpoint.pChunk!=0 ); + if( p->readpoint.iOffset!=iOfst || iOfst==0 ){ + sqlite3_int64 iOff = 0; + for(pChunk=p->pFirst; + ALWAYS(pChunk) && (iOff+p->nChunkSize)<=iOfst; + pChunk=pChunk->pNext + ){ + iOff += p->nChunkSize; + } + }else{ + pChunk = p->readpoint.pChunk; + assert( pChunk!=0 ); + } + + iChunkOffset = (int)(iOfst%p->nChunkSize); + do { + int iSpace = p->nChunkSize - iChunkOffset; + int nCopy = MIN(nRead, (p->nChunkSize - iChunkOffset)); + memcpy(zOut, (u8*)pChunk->zChunk + iChunkOffset, nCopy); + zOut += nCopy; + nRead -= iSpace; + iChunkOffset = 0; + } while( nRead>=0 && (pChunk=pChunk->pNext)!=0 && nRead>0 ); + p->readpoint.iOffset = pChunk ? iOfst+iAmt : 0; + p->readpoint.pChunk = pChunk; + + return SQLITE_OK; +} + +/* +** Free the list of FileChunk structures headed at MemJournal.pFirst. +*/ +static void memjrnlFreeChunks(MemJournal *p){ + FileChunk *pIter; + FileChunk *pNext; + for(pIter=p->pFirst; pIter; pIter=pNext){ + pNext = pIter->pNext; + sqlite3_free(pIter); + } + p->pFirst = 0; +} + +/* +** Flush the contents of memory to a real file on disk. +*/ +static int memjrnlCreateFile(MemJournal *p){ + int rc; + sqlite3_file *pReal = (sqlite3_file*)p; + MemJournal copy = *p; + + memset(p, 0, sizeof(MemJournal)); + rc = sqlite3OsOpen(copy.pVfs, copy.zJournal, pReal, copy.flags, 0); + if( rc==SQLITE_OK ){ + int nChunk = copy.nChunkSize; + i64 iOff = 0; + FileChunk *pIter; + for(pIter=copy.pFirst; pIter; pIter=pIter->pNext){ + if( iOff + nChunk > copy.endpoint.iOffset ){ + nChunk = copy.endpoint.iOffset - iOff; + } + rc = sqlite3OsWrite(pReal, (u8*)pIter->zChunk, nChunk, iOff); + if( rc ) break; + iOff += nChunk; + } + if( rc==SQLITE_OK ){ + /* No error has occurred. Free the in-memory buffers. */ + memjrnlFreeChunks(©); + } + } + if( rc!=SQLITE_OK ){ + /* If an error occurred while creating or writing to the file, restore + ** the original before returning. This way, SQLite uses the in-memory + ** journal data to roll back changes made to the internal page-cache + ** before this function was called. */ + sqlite3OsClose(pReal); + *p = copy; + } + return rc; +} + + +/* +** Write data to the file. +*/ +static int memjrnlWrite( + sqlite3_file *pJfd, /* The journal file into which to write */ + const void *zBuf, /* Take data to be written from here */ + int iAmt, /* Number of bytes to write */ + sqlite_int64 iOfst /* Begin writing at this offset into the file */ +){ + MemJournal *p = (MemJournal *)pJfd; + int nWrite = iAmt; + u8 *zWrite = (u8 *)zBuf; + + /* If the file should be created now, create it and write the new data + ** into the file on disk. */ + if( p->nSpill>0 && (iAmt+iOfst)>p->nSpill ){ + int rc = memjrnlCreateFile(p); + if( rc==SQLITE_OK ){ + rc = sqlite3OsWrite(pJfd, zBuf, iAmt, iOfst); + } + return rc; + } + + /* If the contents of this write should be stored in memory */ + else{ + /* An in-memory journal file should only ever be appended to. Random + ** access writes are not required. The only exception to this is when + ** the in-memory journal is being used by a connection using the + ** atomic-write optimization. In this case the first 28 bytes of the + ** journal file may be written as part of committing the transaction. */ + assert( iOfst==p->endpoint.iOffset || iOfst==0 ); +#ifdef SQLITE_ENABLE_ATOMIC_WRITE + if( iOfst==0 && p->pFirst ){ + assert( p->nChunkSize>iAmt ); + memcpy((u8*)p->pFirst->zChunk, zBuf, iAmt); + }else +#else + assert( iOfst>0 || p->pFirst==0 ); +#endif + { + while( nWrite>0 ){ + FileChunk *pChunk = p->endpoint.pChunk; + int iChunkOffset = (int)(p->endpoint.iOffset%p->nChunkSize); + int iSpace = MIN(nWrite, p->nChunkSize - iChunkOffset); + + if( iChunkOffset==0 ){ + /* New chunk is required to extend the file. */ + FileChunk *pNew = sqlite3_malloc(fileChunkSize(p->nChunkSize)); + if( !pNew ){ + return SQLITE_IOERR_NOMEM_BKPT; + } + pNew->pNext = 0; + if( pChunk ){ + assert( p->pFirst ); + pChunk->pNext = pNew; + }else{ + assert( !p->pFirst ); + p->pFirst = pNew; + } + p->endpoint.pChunk = pNew; + } + + memcpy((u8*)p->endpoint.pChunk->zChunk + iChunkOffset, zWrite, iSpace); + zWrite += iSpace; + nWrite -= iSpace; + p->endpoint.iOffset += iSpace; + } + p->nSize = iAmt + iOfst; + } + } + + return SQLITE_OK; +} + +/* +** Truncate the file. +** +** If the journal file is already on disk, truncate it there. Or, if it +** is still in main memory but is being truncated to zero bytes in size, +** ignore +*/ +static int memjrnlTruncate(sqlite3_file *pJfd, sqlite_int64 size){ + MemJournal *p = (MemJournal *)pJfd; + if( ALWAYS(size==0) ){ + memjrnlFreeChunks(p); + p->nSize = 0; + p->endpoint.pChunk = 0; + p->endpoint.iOffset = 0; + p->readpoint.pChunk = 0; + p->readpoint.iOffset = 0; + } + return SQLITE_OK; +} + +/* +** Close the file. +*/ +static int memjrnlClose(sqlite3_file *pJfd){ + MemJournal *p = (MemJournal *)pJfd; + memjrnlFreeChunks(p); + return SQLITE_OK; +} + +/* +** Sync the file. +** +** If the real file has been created, call its xSync method. Otherwise, +** syncing an in-memory journal is a no-op. +*/ +static int memjrnlSync(sqlite3_file *pJfd, int flags){ + UNUSED_PARAMETER2(pJfd, flags); + return SQLITE_OK; +} + +/* +** Query the size of the file in bytes. +*/ +static int memjrnlFileSize(sqlite3_file *pJfd, sqlite_int64 *pSize){ + MemJournal *p = (MemJournal *)pJfd; + *pSize = (sqlite_int64) p->endpoint.iOffset; + return SQLITE_OK; +} + +/* +** Table of methods for MemJournal sqlite3_file object. +*/ +static const struct sqlite3_io_methods MemJournalMethods = { + 1, /* iVersion */ + memjrnlClose, /* xClose */ + memjrnlRead, /* xRead */ + memjrnlWrite, /* xWrite */ + memjrnlTruncate, /* xTruncate */ + memjrnlSync, /* xSync */ + memjrnlFileSize, /* xFileSize */ + 0, /* xLock */ + 0, /* xUnlock */ + 0, /* xCheckReservedLock */ + 0, /* xFileControl */ + 0, /* xSectorSize */ + 0, /* xDeviceCharacteristics */ + 0, /* xShmMap */ + 0, /* xShmLock */ + 0, /* xShmBarrier */ + 0, /* xShmUnmap */ + 0, /* xFetch */ + 0 /* xUnfetch */ +}; + +/* +** Open a journal file. +** +** The behaviour of the journal file depends on the value of parameter +** nSpill. If nSpill is 0, then the journal file is always create and +** accessed using the underlying VFS. If nSpill is less than zero, then +** all content is always stored in main-memory. Finally, if nSpill is a +** positive value, then the journal file is initially created in-memory +** but may be flushed to disk later on. In this case the journal file is +** flushed to disk either when it grows larger than nSpill bytes in size, +** or when sqlite3JournalCreate() is called. +*/ +SQLITE_PRIVATE int sqlite3JournalOpen( + sqlite3_vfs *pVfs, /* The VFS to use for actual file I/O */ + const char *zName, /* Name of the journal file */ + sqlite3_file *pJfd, /* Preallocated, blank file handle */ + int flags, /* Opening flags */ + int nSpill /* Bytes buffered before opening the file */ +){ + MemJournal *p = (MemJournal*)pJfd; + + /* Zero the file-handle object. If nSpill was passed zero, initialize + ** it using the sqlite3OsOpen() function of the underlying VFS. In this + ** case none of the code in this module is executed as a result of calls + ** made on the journal file-handle. */ + memset(p, 0, sizeof(MemJournal)); + if( nSpill==0 ){ + return sqlite3OsOpen(pVfs, zName, pJfd, flags, 0); + } + + if( nSpill>0 ){ + p->nChunkSize = nSpill; + }else{ + p->nChunkSize = 8 + MEMJOURNAL_DFLT_FILECHUNKSIZE - sizeof(FileChunk); + assert( MEMJOURNAL_DFLT_FILECHUNKSIZE==fileChunkSize(p->nChunkSize) ); + } + + p->pMethod = (const sqlite3_io_methods*)&MemJournalMethods; + p->nSpill = nSpill; + p->flags = flags; + p->zJournal = zName; + p->pVfs = pVfs; + return SQLITE_OK; +} + +/* +** Open an in-memory journal file. +*/ +SQLITE_PRIVATE void sqlite3MemJournalOpen(sqlite3_file *pJfd){ + sqlite3JournalOpen(0, 0, pJfd, 0, -1); +} + +#ifdef SQLITE_ENABLE_ATOMIC_WRITE +/* +** If the argument p points to a MemJournal structure that is not an +** in-memory-only journal file (i.e. is one that was opened with a +ve +** nSpill parameter), and the underlying file has not yet been created, +** create it now. +*/ +SQLITE_PRIVATE int sqlite3JournalCreate(sqlite3_file *p){ + int rc = SQLITE_OK; + if( p->pMethods==&MemJournalMethods && ((MemJournal*)p)->nSpill>0 ){ + rc = memjrnlCreateFile((MemJournal*)p); + } + return rc; +} +#endif + +/* +** The file-handle passed as the only argument is open on a journal file. +** Return true if this "journal file" is currently stored in heap memory, +** or false otherwise. +*/ +SQLITE_PRIVATE int sqlite3JournalIsInMemory(sqlite3_file *p){ + return p->pMethods==&MemJournalMethods; +} + +/* +** Return the number of bytes required to store a JournalFile that uses vfs +** pVfs to create the underlying on-disk files. +*/ +SQLITE_PRIVATE int sqlite3JournalSize(sqlite3_vfs *pVfs){ + return MAX(pVfs->szOsFile, (int)sizeof(MemJournal)); +} + +/************** End of memjournal.c ******************************************/ +/************** Begin file walker.c ******************************************/ +/* +** 2008 August 16 +** +** 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 routines used for walking the parser tree for +** an SQL statement. +*/ +/* #include "sqliteInt.h" */ +/* #include */ +/* #include */ + + +/* +** Walk an expression tree. Invoke the callback once for each node +** of the expression, while descending. (In other words, the callback +** is invoked before visiting children.) +** +** The return value from the callback should be one of the WRC_* +** constants to specify how to proceed with the walk. +** +** WRC_Continue Continue descending down the tree. +** +** WRC_Prune Do not descend into child nodes. But allow +** the walk to continue with sibling nodes. +** +** WRC_Abort Do no more callbacks. Unwind the stack and +** return the top-level walk call. +** +** The return value from this routine is WRC_Abort to abandon the tree walk +** and WRC_Continue to continue. +*/ +static SQLITE_NOINLINE int walkExpr(Walker *pWalker, Expr *pExpr){ + int rc; + testcase( ExprHasProperty(pExpr, EP_TokenOnly) ); + testcase( ExprHasProperty(pExpr, EP_Reduced) ); + rc = pWalker->xExprCallback(pWalker, pExpr); + if( rc || ExprHasProperty(pExpr,(EP_TokenOnly|EP_Leaf)) ){ + return rc & WRC_Abort; + } + if( pExpr->pLeft && walkExpr(pWalker, pExpr->pLeft) ) return WRC_Abort; + if( pExpr->pRight && walkExpr(pWalker, pExpr->pRight) ) return WRC_Abort; + if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + if( sqlite3WalkSelect(pWalker, pExpr->x.pSelect) ) return WRC_Abort; + }else if( pExpr->x.pList ){ + if( sqlite3WalkExprList(pWalker, pExpr->x.pList) ) return WRC_Abort; + } + return WRC_Continue; +} +SQLITE_PRIVATE int sqlite3WalkExpr(Walker *pWalker, Expr *pExpr){ + return pExpr ? walkExpr(pWalker,pExpr) : WRC_Continue; +} + +/* +** Call sqlite3WalkExpr() for every expression in list p or until +** an abort request is seen. +*/ +SQLITE_PRIVATE int sqlite3WalkExprList(Walker *pWalker, ExprList *p){ + int i; + struct ExprList_item *pItem; + if( p ){ + for(i=p->nExpr, pItem=p->a; i>0; i--, pItem++){ + if( sqlite3WalkExpr(pWalker, pItem->pExpr) ) return WRC_Abort; + } + } + return WRC_Continue; +} + +/* +** Walk all expressions associated with SELECT statement p. Do +** not invoke the SELECT callback on p, but do (of course) invoke +** any expr callbacks and SELECT callbacks that come from subqueries. +** Return WRC_Abort or WRC_Continue. +*/ +SQLITE_PRIVATE int sqlite3WalkSelectExpr(Walker *pWalker, Select *p){ + if( sqlite3WalkExprList(pWalker, p->pEList) ) return WRC_Abort; + if( sqlite3WalkExpr(pWalker, p->pWhere) ) return WRC_Abort; + if( sqlite3WalkExprList(pWalker, p->pGroupBy) ) return WRC_Abort; + if( sqlite3WalkExpr(pWalker, p->pHaving) ) return WRC_Abort; + if( sqlite3WalkExprList(pWalker, p->pOrderBy) ) return WRC_Abort; + if( sqlite3WalkExpr(pWalker, p->pLimit) ) return WRC_Abort; + if( sqlite3WalkExpr(pWalker, p->pOffset) ) return WRC_Abort; + return WRC_Continue; +} + +/* +** Walk the parse trees associated with all subqueries in the +** FROM clause of SELECT statement p. Do not invoke the select +** callback on p, but do invoke it on each FROM clause subquery +** and on any subqueries further down in the tree. Return +** WRC_Abort or WRC_Continue; +*/ +SQLITE_PRIVATE int sqlite3WalkSelectFrom(Walker *pWalker, Select *p){ + SrcList *pSrc; + int i; + struct SrcList_item *pItem; + + pSrc = p->pSrc; + if( ALWAYS(pSrc) ){ + for(i=pSrc->nSrc, pItem=pSrc->a; i>0; i--, pItem++){ + if( sqlite3WalkSelect(pWalker, pItem->pSelect) ){ + return WRC_Abort; + } + if( pItem->fg.isTabFunc + && sqlite3WalkExprList(pWalker, pItem->u1.pFuncArg) + ){ + return WRC_Abort; + } + } + } + return WRC_Continue; +} + +/* +** Call sqlite3WalkExpr() for every expression in Select statement p. +** Invoke sqlite3WalkSelect() for subqueries in the FROM clause and +** on the compound select chain, p->pPrior. +** +** If it is not NULL, the xSelectCallback() callback is invoked before +** the walk of the expressions and FROM clause. The xSelectCallback2() +** method, if it is not NULL, is invoked following the walk of the +** expressions and FROM clause. +** +** Return WRC_Continue under normal conditions. Return WRC_Abort if +** there is an abort request. +** +** If the Walker does not have an xSelectCallback() then this routine +** is a no-op returning WRC_Continue. +*/ +SQLITE_PRIVATE int sqlite3WalkSelect(Walker *pWalker, Select *p){ + int rc; + if( p==0 || (pWalker->xSelectCallback==0 && pWalker->xSelectCallback2==0) ){ + return WRC_Continue; + } + rc = WRC_Continue; + pWalker->walkerDepth++; + while( p ){ + if( pWalker->xSelectCallback ){ + rc = pWalker->xSelectCallback(pWalker, p); + if( rc ) break; + } + if( sqlite3WalkSelectExpr(pWalker, p) + || sqlite3WalkSelectFrom(pWalker, p) + ){ + pWalker->walkerDepth--; + return WRC_Abort; + } + if( pWalker->xSelectCallback2 ){ + pWalker->xSelectCallback2(pWalker, p); + } + p = p->pPrior; + } + pWalker->walkerDepth--; + return rc & WRC_Abort; +} + +/************** End of walker.c **********************************************/ +/************** Begin file resolve.c *****************************************/ +/* +** 2008 August 18 +** +** 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 routines used for walking the parser tree and +** resolve all identifiers by associating them with a particular +** table and column. +*/ +/* #include "sqliteInt.h" */ +/* #include */ +/* #include */ + +/* +** Walk the expression tree pExpr and increase the aggregate function +** depth (the Expr.op2 field) by N on every TK_AGG_FUNCTION node. +** This needs to occur when copying a TK_AGG_FUNCTION node from an +** outer query into an inner subquery. +** +** incrAggFunctionDepth(pExpr,n) is the main routine. incrAggDepth(..) +** is a helper function - a callback for the tree walker. +*/ +static int incrAggDepth(Walker *pWalker, Expr *pExpr){ + if( pExpr->op==TK_AGG_FUNCTION ) pExpr->op2 += pWalker->u.n; + return WRC_Continue; +} +static void incrAggFunctionDepth(Expr *pExpr, int N){ + if( N>0 ){ + Walker w; + memset(&w, 0, sizeof(w)); + w.xExprCallback = incrAggDepth; + w.u.n = N; + sqlite3WalkExpr(&w, pExpr); + } +} + +/* +** Turn the pExpr expression into an alias for the iCol-th column of the +** result set in pEList. +** +** If the reference is followed by a COLLATE operator, then make sure +** the COLLATE operator is preserved. For example: +** +** SELECT a+b, c+d FROM t1 ORDER BY 1 COLLATE nocase; +** +** Should be transformed into: +** +** SELECT a+b, c+d FROM t1 ORDER BY (a+b) COLLATE nocase; +** +** The nSubquery parameter specifies how many levels of subquery the +** alias is removed from the original expression. The usual value is +** zero but it might be more if the alias is contained within a subquery +** of the original expression. The Expr.op2 field of TK_AGG_FUNCTION +** structures must be increased by the nSubquery amount. +*/ +static void resolveAlias( + Parse *pParse, /* Parsing context */ + ExprList *pEList, /* A result set */ + int iCol, /* A column in the result set. 0..pEList->nExpr-1 */ + Expr *pExpr, /* Transform this into an alias to the result set */ + const char *zType, /* "GROUP" or "ORDER" or "" */ + int nSubquery /* Number of subqueries that the label is moving */ +){ + Expr *pOrig; /* The iCol-th column of the result set */ + Expr *pDup; /* Copy of pOrig */ + sqlite3 *db; /* The database connection */ + + assert( iCol>=0 && iColnExpr ); + pOrig = pEList->a[iCol].pExpr; + assert( pOrig!=0 ); + db = pParse->db; + pDup = sqlite3ExprDup(db, pOrig, 0); + if( pDup==0 ) return; + if( zType[0]!='G' ) incrAggFunctionDepth(pDup, nSubquery); + if( pExpr->op==TK_COLLATE ){ + pDup = sqlite3ExprAddCollateString(pParse, pDup, pExpr->u.zToken); + } + ExprSetProperty(pDup, EP_Alias); + + /* 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. + ** The pExpr->u.zToken might point into memory that will be freed by the + ** sqlite3DbFree(db, pDup) on the last line of this block, so be sure to + ** make a copy of the token before doing the sqlite3DbFree(). + */ + ExprSetProperty(pExpr, EP_Static); + sqlite3ExprDelete(db, pExpr); + memcpy(pExpr, pDup, sizeof(*pExpr)); + if( !ExprHasProperty(pExpr, EP_IntValue) && pExpr->u.zToken!=0 ){ + assert( (pExpr->flags & (EP_Reduced|EP_TokenOnly))==0 ); + pExpr->u.zToken = sqlite3DbStrDup(db, pExpr->u.zToken); + pExpr->flags |= EP_MemToken; + } + sqlite3DbFree(db, pDup); +} + + +/* +** Return TRUE if the name zCol occurs anywhere in the USING clause. +** +** Return FALSE if the USING clause is NULL or if it does not contain +** zCol. +*/ +static int nameInUsingClause(IdList *pUsing, const char *zCol){ + if( pUsing ){ + int k; + for(k=0; knId; k++){ + if( sqlite3StrICmp(pUsing->a[k].zName, zCol)==0 ) return 1; + } + } + return 0; +} + +/* +** Subqueries stores the original database, table and column names for their +** result sets in ExprList.a[].zSpan, in the form "DATABASE.TABLE.COLUMN". +** Check to see if the zSpan given to this routine matches the zDb, zTab, +** and zCol. If any of zDb, zTab, and zCol are NULL then those fields will +** match anything. +*/ +SQLITE_PRIVATE int sqlite3MatchSpanName( + const char *zSpan, + const char *zCol, + const char *zTab, + const char *zDb +){ + int n; + for(n=0; ALWAYS(zSpan[n]) && zSpan[n]!='.'; n++){} + if( zDb && (sqlite3StrNICmp(zSpan, zDb, n)!=0 || zDb[n]!=0) ){ + return 0; + } + zSpan += n+1; + for(n=0; ALWAYS(zSpan[n]) && zSpan[n]!='.'; n++){} + if( zTab && (sqlite3StrNICmp(zSpan, zTab, n)!=0 || zTab[n]!=0) ){ + return 0; + } + zSpan += n+1; + if( zCol && sqlite3StrICmp(zSpan, zCol)!=0 ){ + return 0; + } + return 1; +} + +/* +** Given the name of a column of the form X.Y.Z or Y.Z or just Z, look up +** that name in the set of source tables in pSrcList and make the pExpr +** expression node refer back to that source column. The following changes +** are made to pExpr: +** +** pExpr->iDb Set the index in db->aDb[] of the database X +** (even if X is implied). +** pExpr->iTable Set to the cursor number for the table obtained +** from pSrcList. +** pExpr->pTab Points to the Table structure of X.Y (even if +** X and/or Y are implied.) +** pExpr->iColumn Set to the column number within the table. +** pExpr->op Set to TK_COLUMN. +** pExpr->pLeft Any expression this points to is deleted +** pExpr->pRight Any expression this points to is deleted. +** +** The zDb variable is the name of the database (the "X"). This value may be +** NULL meaning that name is of the form Y.Z or Z. Any available database +** can be used. The zTable variable is the name of the table (the "Y"). This +** value can be NULL if zDb is also NULL. If zTable is NULL it +** means that the form of the name is Z and that columns from any table +** can be used. +** +** If the name cannot be resolved unambiguously, leave an error message +** in pParse and return WRC_Abort. Return WRC_Prune on success. +*/ +static int lookupName( + Parse *pParse, /* The parsing context */ + const char *zDb, /* Name of the database containing table, or NULL */ + const char *zTab, /* Name of table containing column, or NULL */ + const char *zCol, /* Name of the column. */ + NameContext *pNC, /* The name context used to resolve the name */ + Expr *pExpr /* Make this EXPR node point to the selected column */ +){ + int i, j; /* Loop counters */ + int cnt = 0; /* Number of matching column names */ + int cntTab = 0; /* Number of matching table names */ + int nSubquery = 0; /* How many levels of subquery */ + sqlite3 *db = pParse->db; /* The database connection */ + struct SrcList_item *pItem; /* Use for looping over pSrcList items */ + struct SrcList_item *pMatch = 0; /* The matching pSrcList item */ + NameContext *pTopNC = pNC; /* First namecontext in the list */ + Schema *pSchema = 0; /* Schema of the expression */ + int isTrigger = 0; /* True if resolved to a trigger column */ + Table *pTab = 0; /* Table hold the row */ + Column *pCol; /* A column of pTab */ + + assert( pNC ); /* the name context cannot be NULL. */ + assert( zCol ); /* The Z in X.Y.Z cannot be NULL */ + assert( !ExprHasProperty(pExpr, EP_TokenOnly|EP_Reduced) ); + + /* Initialize the node to no-match */ + pExpr->iTable = -1; + pExpr->pTab = 0; + ExprSetVVAProperty(pExpr, EP_NoReduce); + + /* Translate the schema name in zDb into a pointer to the corresponding + ** schema. If not found, pSchema will remain NULL and nothing will match + ** resulting in an appropriate error message toward the end of this routine + */ + if( zDb ){ + testcase( pNC->ncFlags & NC_PartIdx ); + testcase( pNC->ncFlags & NC_IsCheck ); + if( (pNC->ncFlags & (NC_PartIdx|NC_IsCheck))!=0 ){ + /* Silently ignore database qualifiers inside CHECK constraints and + ** partial indices. Do not raise errors because that might break + ** legacy and because it does not hurt anything to just ignore the + ** database name. */ + zDb = 0; + }else{ + for(i=0; inDb; i++){ + assert( db->aDb[i].zDbSName ); + if( sqlite3StrICmp(db->aDb[i].zDbSName,zDb)==0 ){ + pSchema = db->aDb[i].pSchema; + break; + } + } + } + } + + /* Start at the inner-most context and move outward until a match is found */ + while( pNC && cnt==0 ){ + ExprList *pEList; + SrcList *pSrcList = pNC->pSrcList; + + if( pSrcList ){ + for(i=0, pItem=pSrcList->a; inSrc; i++, pItem++){ + pTab = pItem->pTab; + assert( pTab!=0 && pTab->zName!=0 ); + assert( pTab->nCol>0 ); + if( pItem->pSelect && (pItem->pSelect->selFlags & SF_NestedFrom)!=0 ){ + int hit = 0; + pEList = pItem->pSelect->pEList; + for(j=0; jnExpr; j++){ + if( sqlite3MatchSpanName(pEList->a[j].zSpan, zCol, zTab, zDb) ){ + cnt++; + cntTab = 2; + pMatch = pItem; + pExpr->iColumn = j; + hit = 1; + } + } + if( hit || zTab==0 ) continue; + } + if( zDb && pTab->pSchema!=pSchema ){ + continue; + } + if( zTab ){ + const char *zTabName = pItem->zAlias ? pItem->zAlias : pTab->zName; + assert( zTabName!=0 ); + if( sqlite3StrICmp(zTabName, zTab)!=0 ){ + continue; + } + } + if( 0==(cntTab++) ){ + pMatch = pItem; + } + for(j=0, pCol=pTab->aCol; jnCol; j++, pCol++){ + if( sqlite3StrICmp(pCol->zName, zCol)==0 ){ + /* If there has been exactly one prior match and this match + ** is for the right-hand table of a NATURAL JOIN or is in a + ** USING clause, then skip this match. + */ + if( cnt==1 ){ + if( pItem->fg.jointype & JT_NATURAL ) continue; + if( nameInUsingClause(pItem->pUsing, zCol) ) continue; + } + cnt++; + pMatch = pItem; + /* Substitute the rowid (column -1) for the INTEGER PRIMARY KEY */ + pExpr->iColumn = j==pTab->iPKey ? -1 : (i16)j; + break; + } + } + } + if( pMatch ){ + pExpr->iTable = pMatch->iCursor; + pExpr->pTab = pMatch->pTab; + /* RIGHT JOIN not (yet) supported */ + assert( (pMatch->fg.jointype & JT_RIGHT)==0 ); + if( (pMatch->fg.jointype & JT_LEFT)!=0 ){ + ExprSetProperty(pExpr, EP_CanBeNull); + } + pSchema = pExpr->pTab->pSchema; + } + } /* if( pSrcList ) */ + +#ifndef SQLITE_OMIT_TRIGGER + /* If we have not already resolved the name, then maybe + ** it is a new.* or old.* trigger argument reference + */ + if( zDb==0 && zTab!=0 && cntTab==0 && pParse->pTriggerTab!=0 ){ + int op = pParse->eTriggerOp; + assert( op==TK_DELETE || op==TK_UPDATE || op==TK_INSERT ); + if( op!=TK_DELETE && sqlite3StrICmp("new",zTab) == 0 ){ + pExpr->iTable = 1; + pTab = pParse->pTriggerTab; + }else if( op!=TK_INSERT && sqlite3StrICmp("old",zTab)==0 ){ + pExpr->iTable = 0; + pTab = pParse->pTriggerTab; + }else{ + pTab = 0; + } + + if( pTab ){ + int iCol; + pSchema = pTab->pSchema; + cntTab++; + for(iCol=0, pCol=pTab->aCol; iColnCol; iCol++, pCol++){ + if( sqlite3StrICmp(pCol->zName, zCol)==0 ){ + if( iCol==pTab->iPKey ){ + iCol = -1; + } + break; + } + } + if( iCol>=pTab->nCol && sqlite3IsRowid(zCol) && VisibleRowid(pTab) ){ + /* IMP: R-51414-32910 */ + iCol = -1; + } + if( iColnCol ){ + cnt++; + if( iCol<0 ){ + pExpr->affinity = SQLITE_AFF_INTEGER; + }else if( pExpr->iTable==0 ){ + 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; + isTrigger = 1; + } + } + } +#endif /* !defined(SQLITE_OMIT_TRIGGER) */ + + /* + ** Perhaps the name is a reference to the ROWID + */ + if( cnt==0 + && cntTab==1 + && pMatch + && (pNC->ncFlags & NC_IdxExpr)==0 + && sqlite3IsRowid(zCol) + && VisibleRowid(pMatch->pTab) + ){ + cnt = 1; + pExpr->iColumn = -1; + pExpr->affinity = SQLITE_AFF_INTEGER; + } + + /* + ** If the input is of the form Z (not Y.Z or X.Y.Z) then the name Z + ** might refer to an result-set alias. This happens, for example, when + ** we are resolving names in the WHERE clause of the following command: + ** + ** SELECT a+b AS x FROM table WHERE x<10; + ** + ** In cases like this, replace pExpr with a copy of the expression that + ** forms the result set entry ("a+b" in the example) and return immediately. + ** Note that the expression in the result set should have already been + ** resolved by the time the WHERE clause is resolved. + ** + ** The ability to use an output result-set column in the WHERE, GROUP BY, + ** or HAVING clauses, or as part of a larger expression in the ORDER BY + ** clause is not standard SQL. This is a (goofy) SQLite extension, that + ** is supported for backwards compatibility only. Hence, we issue a warning + ** on sqlite3_log() whenever the capability is used. + */ + if( (pEList = pNC->pEList)!=0 + && zTab==0 + && cnt==0 + ){ + for(j=0; jnExpr; j++){ + char *zAs = pEList->a[j].zName; + if( zAs!=0 && sqlite3StrICmp(zAs, zCol)==0 ){ + Expr *pOrig; + assert( pExpr->pLeft==0 && pExpr->pRight==0 ); + assert( pExpr->x.pList==0 ); + assert( pExpr->x.pSelect==0 ); + pOrig = pEList->a[j].pExpr; + if( (pNC->ncFlags&NC_AllowAgg)==0 && ExprHasProperty(pOrig, EP_Agg) ){ + sqlite3ErrorMsg(pParse, "misuse of aliased aggregate %s", zAs); + return WRC_Abort; + } + if( sqlite3ExprVectorSize(pOrig)!=1 ){ + sqlite3ErrorMsg(pParse, "row value misused"); + return WRC_Abort; + } + resolveAlias(pParse, pEList, j, pExpr, "", nSubquery); + cnt = 1; + pMatch = 0; + assert( zTab==0 && zDb==0 ); + goto lookupname_end; + } + } + } + + /* Advance to the next name context. The loop will exit when either + ** we have a match (cnt>0) or when we run out of name contexts. + */ + if( cnt==0 ){ + pNC = pNC->pNext; + nSubquery++; + } + } + + /* + ** If X and Y are NULL (in other words if only the column name Z is + ** supplied) and the value of Z is enclosed in double-quotes, then + ** Z is a string literal if it doesn't match any column names. In that + ** case, we need to return right away and not make any changes to + ** pExpr. + ** + ** Because no reference was made to outer contexts, the pNC->nRef + ** fields are not changed in any context. + */ + if( cnt==0 && zTab==0 && ExprHasProperty(pExpr,EP_DblQuoted) ){ + pExpr->op = TK_STRING; + pExpr->pTab = 0; + return WRC_Prune; + } + + /* + ** cnt==0 means there was not match. cnt>1 means there were two or + ** more matches. Either way, we have an error. + */ + if( cnt!=1 ){ + const char *zErr; + zErr = cnt==0 ? "no such column" : "ambiguous column name"; + if( zDb ){ + sqlite3ErrorMsg(pParse, "%s: %s.%s.%s", zErr, zDb, zTab, zCol); + }else if( zTab ){ + sqlite3ErrorMsg(pParse, "%s: %s.%s", zErr, zTab, zCol); + }else{ + sqlite3ErrorMsg(pParse, "%s: %s", zErr, zCol); + } + pParse->checkSchema = 1; + pTopNC->nErr++; + } + + /* If a column from a table in pSrcList is referenced, then record + ** this fact in the pSrcList.a[].colUsed bitmask. Column 0 causes + ** bit 0 to be set. Column 1 sets bit 1. And so forth. If the + ** column number is greater than the number of bits in the bitmask + ** then set the high-order bit of the bitmask. + */ + if( pExpr->iColumn>=0 && pMatch!=0 ){ + int n = pExpr->iColumn; + testcase( n==BMS-1 ); + if( n>=BMS ){ + n = BMS-1; + } + assert( pMatch->iCursor==pExpr->iTable ); + pMatch->colUsed |= ((Bitmask)1)<pLeft); + pExpr->pLeft = 0; + sqlite3ExprDelete(db, pExpr->pRight); + pExpr->pRight = 0; + pExpr->op = (isTrigger ? TK_TRIGGER : TK_COLUMN); +lookupname_end: + if( cnt==1 ){ + assert( pNC!=0 ); + if( !ExprHasProperty(pExpr, EP_Alias) ){ + sqlite3AuthRead(pParse, pExpr, pSchema, pNC->pSrcList); + } + /* Increment the nRef value on all name contexts from TopNC up to + ** the point where the name matched. */ + for(;;){ + assert( pTopNC!=0 ); + pTopNC->nRef++; + if( pTopNC==pNC ) break; + pTopNC = pTopNC->pNext; + } + return WRC_Prune; + } else { + return WRC_Abort; + } +} + +/* +** Allocate and return a pointer to an expression to load the column iCol +** from datasource iSrc 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; + testcase( iCol==BMS ); + testcase( iCol==BMS-1 ); + pItem->colUsed |= ((Bitmask)1)<<(iCol>=BMS ? BMS-1 : iCol); + } + ExprSetProperty(p, EP_Resolved); + } + return p; +} + +/* +** Report an error that an expression is not valid for some set of +** pNC->ncFlags values determined by validMask. +*/ +static void notValid( + Parse *pParse, /* Leave error message here */ + NameContext *pNC, /* The name context */ + const char *zMsg, /* Type of error */ + int validMask /* Set of contexts for which prohibited */ +){ + assert( (validMask&~(NC_IsCheck|NC_PartIdx|NC_IdxExpr))==0 ); + if( (pNC->ncFlags & validMask)!=0 ){ + const char *zIn = "partial index WHERE clauses"; + if( pNC->ncFlags & NC_IdxExpr ) zIn = "index expressions"; +#ifndef SQLITE_OMIT_CHECK + else if( pNC->ncFlags & NC_IsCheck ) zIn = "CHECK constraints"; +#endif + sqlite3ErrorMsg(pParse, "%s prohibited in %s", zMsg, zIn); + } +} + +/* +** Expression p should encode a floating point value between 1.0 and 0.0. +** Return 1024 times this value. Or return -1 if p is not a floating point +** value between 1.0 and 0.0. +*/ +static int exprProbability(Expr *p){ + double r = -1.0; + if( p->op!=TK_FLOAT ) return -1; + sqlite3AtoF(p->u.zToken, &r, sqlite3Strlen30(p->u.zToken), SQLITE_UTF8); + assert( r>=0.0 ); + if( r>1.0 ) return -1; + return (int)(r*134217728.0); +} + +/* +** This routine is callback for sqlite3WalkExpr(). +** +** Resolve symbolic names into TK_COLUMN operators for the current +** node in the expression tree. Return 0 to continue the search down +** the tree or 2 to abort the tree walk. +** +** This routine also does error checking and name resolution for +** function names. The operator for aggregate functions is changed +** to TK_AGG_FUNCTION. +*/ +static int resolveExprStep(Walker *pWalker, Expr *pExpr){ + NameContext *pNC; + Parse *pParse; + + pNC = pWalker->u.pNC; + assert( pNC!=0 ); + pParse = pNC->pParse; + assert( pParse==pWalker->pParse ); + + if( ExprHasProperty(pExpr, EP_Resolved) ) return WRC_Prune; + ExprSetProperty(pExpr, EP_Resolved); +#ifndef NDEBUG + if( pNC->pSrcList && pNC->pSrcList->nAlloc>0 ){ + SrcList *pSrcList = pNC->pSrcList; + int i; + for(i=0; ipSrcList->nSrc; i++){ + assert( pSrcList->a[i].iCursor>=0 && pSrcList->a[i].iCursornTab); + } + } +#endif + switch( pExpr->op ){ + +#if defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) && !defined(SQLITE_OMIT_SUBQUERY) + /* The special operator TK_ROW means use the rowid for the first + ** column in the FROM clause. This is used by the LIMIT and ORDER BY + ** clause processing on UPDATE and DELETE statements. + */ + case TK_ROW: { + SrcList *pSrcList = pNC->pSrcList; + struct SrcList_item *pItem; + assert( pSrcList && pSrcList->nSrc==1 ); + pItem = pSrcList->a; + pExpr->op = TK_COLUMN; + pExpr->pTab = pItem->pTab; + pExpr->iTable = pItem->iCursor; + pExpr->iColumn = -1; + pExpr->affinity = SQLITE_AFF_INTEGER; + break; + } +#endif /* defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) + && !defined(SQLITE_OMIT_SUBQUERY) */ + + /* A lone identifier is the name of a column. + */ + case TK_ID: { + return lookupName(pParse, 0, 0, pExpr->u.zToken, pNC, pExpr); + } + + /* A table name and column name: ID.ID + ** Or a database, table and column: ID.ID.ID + */ + case TK_DOT: { + const char *zColumn; + const char *zTable; + const char *zDb; + Expr *pRight; + + /* if( pSrcList==0 ) break; */ + notValid(pParse, pNC, "the \".\" operator", NC_IdxExpr); + pRight = pExpr->pRight; + if( pRight->op==TK_ID ){ + zDb = 0; + zTable = pExpr->pLeft->u.zToken; + zColumn = pRight->u.zToken; + }else{ + assert( pRight->op==TK_DOT ); + zDb = pExpr->pLeft->u.zToken; + zTable = pRight->pLeft->u.zToken; + zColumn = pRight->pRight->u.zToken; + } + return lookupName(pParse, zDb, zTable, zColumn, pNC, pExpr); + } + + /* Resolve function names + */ + case TK_FUNCTION: { + ExprList *pList = pExpr->x.pList; /* The argument list */ + int n = pList ? pList->nExpr : 0; /* Number of arguments */ + int no_such_func = 0; /* True if no such function exists */ + int wrong_num_args = 0; /* True if wrong number of arguments */ + int is_agg = 0; /* True if is an aggregate function */ + int nId; /* Number of characters in function name */ + const char *zId; /* The function name. */ + FuncDef *pDef; /* Information about the function */ + u8 enc = ENC(pParse->db); /* The database encoding */ + + assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); + zId = pExpr->u.zToken; + nId = sqlite3Strlen30(zId); + pDef = sqlite3FindFunction(pParse->db, zId, n, enc, 0); + if( pDef==0 ){ + pDef = sqlite3FindFunction(pParse->db, zId, -2, enc, 0); + if( pDef==0 ){ + no_such_func = 1; + }else{ + wrong_num_args = 1; + } + }else{ + is_agg = pDef->xFinalize!=0; + if( pDef->funcFlags & SQLITE_FUNC_UNLIKELY ){ + ExprSetProperty(pExpr, EP_Unlikely|EP_Skip); + if( n==2 ){ + pExpr->iTable = exprProbability(pList->a[1].pExpr); + if( pExpr->iTable<0 ){ + sqlite3ErrorMsg(pParse, + "second argument to likelihood() must be a " + "constant between 0.0 and 1.0"); + pNC->nErr++; + } + }else{ + /* EVIDENCE-OF: R-61304-29449 The unlikely(X) function is + ** equivalent to likelihood(X, 0.0625). + ** EVIDENCE-OF: R-01283-11636 The unlikely(X) function is + ** short-hand for likelihood(X,0.0625). + ** EVIDENCE-OF: R-36850-34127 The likely(X) function is short-hand + ** for likelihood(X,0.9375). + ** EVIDENCE-OF: R-53436-40973 The likely(X) function is equivalent + ** to likelihood(X,0.9375). */ + /* TUNING: unlikely() probability is 0.0625. likely() is 0.9375 */ + pExpr->iTable = pDef->zName[0]=='u' ? 8388608 : 125829120; + } + } +#ifndef SQLITE_OMIT_AUTHORIZATION + { + int auth = sqlite3AuthCheck(pParse, SQLITE_FUNCTION, 0,pDef->zName,0); + if( auth!=SQLITE_OK ){ + if( auth==SQLITE_DENY ){ + sqlite3ErrorMsg(pParse, "not authorized to use function: %s", + pDef->zName); + pNC->nErr++; + } + pExpr->op = TK_NULL; + return WRC_Prune; + } + } +#endif + if( pDef->funcFlags & (SQLITE_FUNC_CONSTANT|SQLITE_FUNC_SLOCHNG) ){ + /* For the purposes of the EP_ConstFunc flag, date and time + ** functions and other functions that change slowly are considered + ** constant because they are constant for the duration of one query */ + ExprSetProperty(pExpr,EP_ConstFunc); + } + if( (pDef->funcFlags & SQLITE_FUNC_CONSTANT)==0 ){ + /* Date/time functions that use 'now', and other functions like + ** sqlite_version() that might change over time cannot be used + ** in an index. */ + notValid(pParse, pNC, "non-deterministic functions", + NC_IdxExpr|NC_PartIdx); + } + } + if( is_agg && (pNC->ncFlags & NC_AllowAgg)==0 ){ + sqlite3ErrorMsg(pParse, "misuse of aggregate function %.*s()", nId,zId); + pNC->nErr++; + is_agg = 0; + }else if( no_such_func && pParse->db->init.busy==0 +#ifdef SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION + && pParse->explain==0 +#endif + ){ + sqlite3ErrorMsg(pParse, "no such function: %.*s", nId, zId); + pNC->nErr++; + }else if( wrong_num_args ){ + sqlite3ErrorMsg(pParse,"wrong number of arguments to function %.*s()", + nId, zId); + pNC->nErr++; + } + if( is_agg ) pNC->ncFlags &= ~NC_AllowAgg; + sqlite3WalkExprList(pWalker, pList); + if( is_agg ){ + NameContext *pNC2 = pNC; + pExpr->op = TK_AGG_FUNCTION; + pExpr->op2 = 0; + while( pNC2 && !sqlite3FunctionUsesThisSrc(pExpr, pNC2->pSrcList) ){ + pExpr->op2++; + pNC2 = pNC2->pNext; + } + assert( pDef!=0 ); + if( pNC2 ){ + assert( SQLITE_FUNC_MINMAX==NC_MinMaxAgg ); + testcase( (pDef->funcFlags & SQLITE_FUNC_MINMAX)!=0 ); + pNC2->ncFlags |= NC_HasAgg | (pDef->funcFlags & SQLITE_FUNC_MINMAX); + + } + pNC->ncFlags |= NC_AllowAgg; + } + /* FIX ME: Compute pExpr->affinity based on the expected return + ** type of the function + */ + return WRC_Prune; + } +#ifndef SQLITE_OMIT_SUBQUERY + case TK_SELECT: + case TK_EXISTS: testcase( pExpr->op==TK_EXISTS ); +#endif + case TK_IN: { + testcase( pExpr->op==TK_IN ); + if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + int nRef = pNC->nRef; + notValid(pParse, pNC, "subqueries", NC_IsCheck|NC_PartIdx|NC_IdxExpr); + sqlite3WalkSelect(pWalker, pExpr->x.pSelect); + assert( pNC->nRef>=nRef ); + if( nRef!=pNC->nRef ){ + ExprSetProperty(pExpr, EP_VarSelect); + pNC->ncFlags |= NC_VarSelect; + } + } + break; + } + case TK_VARIABLE: { + notValid(pParse, pNC, "parameters", NC_IsCheck|NC_PartIdx|NC_IdxExpr); + break; + } + case TK_BETWEEN: + case TK_EQ: + case TK_NE: + case TK_LT: + case TK_LE: + case TK_GT: + case TK_GE: + case TK_IS: + case TK_ISNOT: { + int nLeft, nRight; + if( pParse->db->mallocFailed ) break; + assert( pExpr->pLeft!=0 ); + nLeft = sqlite3ExprVectorSize(pExpr->pLeft); + if( pExpr->op==TK_BETWEEN ){ + nRight = sqlite3ExprVectorSize(pExpr->x.pList->a[0].pExpr); + if( nRight==nLeft ){ + nRight = sqlite3ExprVectorSize(pExpr->x.pList->a[1].pExpr); + } + }else{ + assert( pExpr->pRight!=0 ); + nRight = sqlite3ExprVectorSize(pExpr->pRight); + } + if( nLeft!=nRight ){ + testcase( pExpr->op==TK_EQ ); + testcase( pExpr->op==TK_NE ); + testcase( pExpr->op==TK_LT ); + testcase( pExpr->op==TK_LE ); + testcase( pExpr->op==TK_GT ); + testcase( pExpr->op==TK_GE ); + testcase( pExpr->op==TK_IS ); + testcase( pExpr->op==TK_ISNOT ); + testcase( pExpr->op==TK_BETWEEN ); + sqlite3ErrorMsg(pParse, "row value misused"); + } + break; + } + } + return (pParse->nErr || pParse->db->mallocFailed) ? WRC_Abort : WRC_Continue; +} + +/* +** pEList is a list of expressions which are really the result set of the +** a SELECT statement. pE is a term in an ORDER BY or GROUP BY clause. +** This routine checks to see if pE is a simple identifier which corresponds +** to the AS-name of one of the terms of the expression list. If it is, +** this routine return an integer between 1 and N where N is the number of +** elements in pEList, corresponding to the matching entry. If there is +** no match, or if pE is not a simple identifier, then this routine +** return 0. +** +** pEList has been resolved. pE has not. +*/ +static int resolveAsName( + Parse *pParse, /* Parsing context for error messages */ + ExprList *pEList, /* List of expressions to scan */ + Expr *pE /* Expression we are trying to match */ +){ + int i; /* Loop counter */ + + UNUSED_PARAMETER(pParse); + + if( pE->op==TK_ID ){ + char *zCol = pE->u.zToken; + for(i=0; inExpr; i++){ + char *zAs = pEList->a[i].zName; + if( zAs!=0 && sqlite3StrICmp(zAs, zCol)==0 ){ + return i+1; + } + } + } + return 0; +} + +/* +** pE is a pointer to an expression which is a single term in the +** ORDER BY of a compound SELECT. The expression has not been +** name resolved. +** +** At the point this routine is called, we already know that the +** ORDER BY term is not an integer index into the result set. That +** case is handled by the calling routine. +** +** Attempt to match pE against result set columns in the left-most +** SELECT statement. Return the index i of the matching column, +** as an indication to the caller that it should sort by the i-th column. +** The left-most column is 1. In other words, the value returned is the +** same integer value that would be used in the SQL statement to indicate +** the column. +** +** If there is no match, return 0. Return -1 if an error occurs. +*/ +static int resolveOrderByTermToExprList( + Parse *pParse, /* Parsing context for error messages */ + Select *pSelect, /* The SELECT statement with the ORDER BY clause */ + Expr *pE /* The specific ORDER BY term */ +){ + int i; /* Loop counter */ + ExprList *pEList; /* The columns of the result set */ + NameContext nc; /* Name context for resolving pE */ + sqlite3 *db; /* Database connection */ + int rc; /* Return code from subprocedures */ + u8 savedSuppErr; /* Saved value of db->suppressErr */ + + assert( sqlite3ExprIsInteger(pE, &i)==0 ); + pEList = pSelect->pEList; + + /* Resolve all names in the ORDER BY term expression + */ + memset(&nc, 0, sizeof(nc)); + nc.pParse = pParse; + nc.pSrcList = pSelect->pSrc; + nc.pEList = pEList; + nc.ncFlags = NC_AllowAgg; + nc.nErr = 0; + db = pParse->db; + savedSuppErr = db->suppressErr; + db->suppressErr = 1; + rc = sqlite3ResolveExprNames(&nc, pE); + db->suppressErr = savedSuppErr; + if( rc ) return 0; + + /* Try to match the ORDER BY expression against an expression + ** in the result set. Return an 1-based index of the matching + ** result-set entry. + */ + for(i=0; inExpr; i++){ + if( sqlite3ExprCompare(pEList->a[i].pExpr, pE, -1)<2 ){ + return i+1; + } + } + + /* If no match, return 0. */ + return 0; +} + +/* +** Generate an ORDER BY or GROUP BY term out-of-range error. +*/ +static void resolveOutOfRangeError( + Parse *pParse, /* The error context into which to write the error */ + const char *zType, /* "ORDER" or "GROUP" */ + int i, /* The index (1-based) of the term out of range */ + int mx /* Largest permissible value of i */ +){ + sqlite3ErrorMsg(pParse, + "%r %s BY term out of range - should be " + "between 1 and %d", i, zType, mx); +} + +/* +** Analyze the ORDER BY clause in a compound SELECT statement. Modify +** each term of the ORDER BY clause is a constant integer between 1 +** and N where N is the number of columns in the compound SELECT. +** +** ORDER BY terms that are already an integer between 1 and N are +** unmodified. ORDER BY terms that are integers outside the range of +** 1 through N generate an error. ORDER BY terms that are expressions +** are matched against result set expressions of compound SELECT +** beginning with the left-most SELECT and working toward the right. +** At the first match, the ORDER BY expression is transformed into +** the integer column number. +** +** Return the number of errors seen. +*/ +static int resolveCompoundOrderBy( + Parse *pParse, /* Parsing context. Leave error messages here */ + Select *pSelect /* The SELECT statement containing the ORDER BY */ +){ + int i; + ExprList *pOrderBy; + ExprList *pEList; + sqlite3 *db; + int moreToDo = 1; + + pOrderBy = pSelect->pOrderBy; + if( pOrderBy==0 ) return 0; + db = pParse->db; +#if SQLITE_MAX_COLUMN + if( pOrderBy->nExpr>db->aLimit[SQLITE_LIMIT_COLUMN] ){ + sqlite3ErrorMsg(pParse, "too many terms in ORDER BY clause"); + return 1; + } +#endif + for(i=0; inExpr; i++){ + pOrderBy->a[i].done = 0; + } + pSelect->pNext = 0; + while( pSelect->pPrior ){ + pSelect->pPrior->pNext = pSelect; + pSelect = pSelect->pPrior; + } + while( pSelect && moreToDo ){ + struct ExprList_item *pItem; + moreToDo = 0; + pEList = pSelect->pEList; + assert( pEList!=0 ); + for(i=0, pItem=pOrderBy->a; inExpr; i++, pItem++){ + int iCol = -1; + Expr *pE, *pDup; + if( pItem->done ) continue; + pE = sqlite3ExprSkipCollate(pItem->pExpr); + if( sqlite3ExprIsInteger(pE, &iCol) ){ + if( iCol<=0 || iCol>pEList->nExpr ){ + resolveOutOfRangeError(pParse, "ORDER", i+1, pEList->nExpr); + return 1; + } + }else{ + iCol = resolveAsName(pParse, pEList, pE); + if( iCol==0 ){ + pDup = sqlite3ExprDup(db, pE, 0); + if( !db->mallocFailed ){ + assert(pDup); + iCol = resolveOrderByTermToExprList(pParse, pSelect, pDup); + } + sqlite3ExprDelete(db, pDup); + } + } + if( iCol>0 ){ + /* Convert the ORDER BY term into an integer column number iCol, + ** taking care to preserve the COLLATE clause if it exists */ + Expr *pNew = sqlite3Expr(db, TK_INTEGER, 0); + if( pNew==0 ) return 1; + pNew->flags |= EP_IntValue; + pNew->u.iValue = iCol; + if( pItem->pExpr==pE ){ + pItem->pExpr = pNew; + }else{ + Expr *pParent = pItem->pExpr; + assert( pParent->op==TK_COLLATE ); + while( pParent->pLeft->op==TK_COLLATE ) pParent = pParent->pLeft; + assert( pParent->pLeft==pE ); + pParent->pLeft = pNew; + } + sqlite3ExprDelete(db, pE); + pItem->u.x.iOrderByCol = (u16)iCol; + pItem->done = 1; + }else{ + moreToDo = 1; + } + } + pSelect = pSelect->pNext; + } + for(i=0; inExpr; i++){ + if( pOrderBy->a[i].done==0 ){ + sqlite3ErrorMsg(pParse, "%r ORDER BY term does not match any " + "column in the result set", i+1); + return 1; + } + } + return 0; +} + +/* +** Check every term in the ORDER BY or GROUP BY clause pOrderBy of +** the SELECT statement pSelect. If any term is reference to a +** result set expression (as determined by the ExprList.a.u.x.iOrderByCol +** field) then convert that term into a copy of the corresponding result set +** column. +** +** If any errors are detected, add an error message to pParse and +** return non-zero. Return zero if no errors are seen. +*/ +SQLITE_PRIVATE int sqlite3ResolveOrderGroupBy( + Parse *pParse, /* Parsing context. Leave error messages here */ + Select *pSelect, /* The SELECT statement containing the clause */ + ExprList *pOrderBy, /* The ORDER BY or GROUP BY clause to be processed */ + const char *zType /* "ORDER" or "GROUP" */ +){ + int i; + sqlite3 *db = pParse->db; + ExprList *pEList; + struct ExprList_item *pItem; + + if( pOrderBy==0 || pParse->db->mallocFailed ) return 0; +#if SQLITE_MAX_COLUMN + if( pOrderBy->nExpr>db->aLimit[SQLITE_LIMIT_COLUMN] ){ + sqlite3ErrorMsg(pParse, "too many terms in %s BY clause", zType); + return 1; + } +#endif + pEList = pSelect->pEList; + assert( pEList!=0 ); /* sqlite3SelectNew() guarantees this */ + for(i=0, pItem=pOrderBy->a; inExpr; i++, pItem++){ + if( pItem->u.x.iOrderByCol ){ + if( pItem->u.x.iOrderByCol>pEList->nExpr ){ + resolveOutOfRangeError(pParse, zType, i+1, pEList->nExpr); + return 1; + } + resolveAlias(pParse, pEList, pItem->u.x.iOrderByCol-1, pItem->pExpr, + zType,0); + } + } + return 0; +} + +/* +** pOrderBy is an ORDER BY or GROUP BY clause in SELECT statement pSelect. +** The Name context of the SELECT statement is pNC. zType is either +** "ORDER" or "GROUP" depending on which type of clause pOrderBy is. +** +** This routine resolves each term of the clause into an expression. +** If the order-by term is an integer I between 1 and N (where N is the +** number of columns in the result set of the SELECT) then the expression +** in the resolution is a copy of the I-th result-set expression. If +** the order-by term is an identifier that corresponds to the AS-name of +** a result-set expression, then the term resolves to a copy of the +** result-set expression. Otherwise, the expression is resolved in +** the usual way - using sqlite3ResolveExprNames(). +** +** This routine returns the number of errors. If errors occur, then +** an appropriate error message might be left in pParse. (OOM errors +** excepted.) +*/ +static int resolveOrderGroupBy( + NameContext *pNC, /* The name context of the SELECT statement */ + Select *pSelect, /* The SELECT statement holding pOrderBy */ + ExprList *pOrderBy, /* An ORDER BY or GROUP BY clause to resolve */ + const char *zType /* Either "ORDER" or "GROUP", as appropriate */ +){ + int i, j; /* Loop counters */ + int iCol; /* Column number */ + struct ExprList_item *pItem; /* A term of the ORDER BY clause */ + Parse *pParse; /* Parsing context */ + int nResult; /* Number of terms in the result set */ + + if( pOrderBy==0 ) return 0; + nResult = pSelect->pEList->nExpr; + pParse = pNC->pParse; + for(i=0, pItem=pOrderBy->a; inExpr; i++, pItem++){ + Expr *pE = pItem->pExpr; + Expr *pE2 = sqlite3ExprSkipCollate(pE); + if( zType[0]!='G' ){ + iCol = resolveAsName(pParse, pSelect->pEList, pE2); + if( iCol>0 ){ + /* If an AS-name match is found, mark this ORDER BY column as being + ** a copy of the iCol-th result-set column. The subsequent call to + ** sqlite3ResolveOrderGroupBy() will convert the expression to a + ** copy of the iCol-th result-set expression. */ + pItem->u.x.iOrderByCol = (u16)iCol; + continue; + } + } + if( sqlite3ExprIsInteger(pE2, &iCol) ){ + /* The ORDER BY term is an integer constant. Again, set the column + ** number so that sqlite3ResolveOrderGroupBy() will convert the + ** order-by term to a copy of the result-set expression */ + if( iCol<1 || iCol>0xffff ){ + resolveOutOfRangeError(pParse, zType, i+1, nResult); + return 1; + } + pItem->u.x.iOrderByCol = (u16)iCol; + continue; + } + + /* Otherwise, treat the ORDER BY term as an ordinary expression */ + pItem->u.x.iOrderByCol = 0; + if( sqlite3ResolveExprNames(pNC, pE) ){ + return 1; + } + for(j=0; jpEList->nExpr; j++){ + if( sqlite3ExprCompare(pE, pSelect->pEList->a[j].pExpr, -1)==0 ){ + pItem->u.x.iOrderByCol = j+1; + } + } + } + return sqlite3ResolveOrderGroupBy(pParse, pSelect, pOrderBy, zType); +} + +/* +** Resolve names in the SELECT statement p and all of its descendants. +*/ +static int resolveSelectStep(Walker *pWalker, Select *p){ + NameContext *pOuterNC; /* Context that contains this SELECT */ + NameContext sNC; /* Name context of this SELECT */ + int isCompound; /* True if p is a compound select */ + int nCompound; /* Number of compound terms processed so far */ + Parse *pParse; /* Parsing context */ + int i; /* Loop counter */ + ExprList *pGroupBy; /* The GROUP BY clause */ + Select *pLeftmost; /* Left-most of SELECT of a compound */ + sqlite3 *db; /* Database connection */ + + + assert( p!=0 ); + if( p->selFlags & SF_Resolved ){ + return WRC_Prune; + } + pOuterNC = pWalker->u.pNC; + pParse = pWalker->pParse; + db = pParse->db; + + /* Normally sqlite3SelectExpand() will be called first and will have + ** already expanded this SELECT. However, if this is a subquery within + ** an expression, sqlite3ResolveExprNames() will be called without a + ** prior call to sqlite3SelectExpand(). When that happens, let + ** sqlite3SelectPrep() do all of the processing for this SELECT. + ** sqlite3SelectPrep() will invoke both sqlite3SelectExpand() and + ** this routine in the correct order. + */ + if( (p->selFlags & SF_Expanded)==0 ){ + sqlite3SelectPrep(pParse, p, pOuterNC); + return (pParse->nErr || db->mallocFailed) ? WRC_Abort : WRC_Prune; + } + + isCompound = p->pPrior!=0; + nCompound = 0; + pLeftmost = p; + while( p ){ + assert( (p->selFlags & SF_Expanded)!=0 ); + assert( (p->selFlags & SF_Resolved)==0 ); + p->selFlags |= SF_Resolved; + + /* Resolve the expressions in the LIMIT and OFFSET clauses. These + ** are not allowed to refer to any names, so pass an empty NameContext. + */ + memset(&sNC, 0, sizeof(sNC)); + sNC.pParse = pParse; + if( sqlite3ResolveExprNames(&sNC, p->pLimit) || + sqlite3ResolveExprNames(&sNC, p->pOffset) ){ + return WRC_Abort; + } + + /* If the SF_Converted flags is set, then this Select object was + ** was created by the convertCompoundSelectToSubquery() function. + ** In this case the ORDER BY clause (p->pOrderBy) should be resolved + ** as if it were part of the sub-query, not the parent. This block + ** moves the pOrderBy down to the sub-query. It will be moved back + ** after the names have been resolved. */ + if( p->selFlags & SF_Converted ){ + Select *pSub = p->pSrc->a[0].pSelect; + assert( p->pSrc->nSrc==1 && p->pOrderBy ); + assert( pSub->pPrior && pSub->pOrderBy==0 ); + pSub->pOrderBy = p->pOrderBy; + p->pOrderBy = 0; + } + + /* Recursively resolve names in all subqueries + */ + for(i=0; ipSrc->nSrc; i++){ + struct SrcList_item *pItem = &p->pSrc->a[i]; + if( pItem->pSelect ){ + NameContext *pNC; /* Used to iterate name contexts */ + int nRef = 0; /* Refcount for pOuterNC and outer contexts */ + const char *zSavedContext = pParse->zAuthContext; + + /* Count the total number of references to pOuterNC and all of its + ** parent contexts. After resolving references to expressions in + ** pItem->pSelect, check if this value has changed. If so, then + ** SELECT statement pItem->pSelect must be correlated. Set the + ** pItem->fg.isCorrelated flag if this is the case. */ + for(pNC=pOuterNC; pNC; pNC=pNC->pNext) nRef += pNC->nRef; + + if( pItem->zName ) pParse->zAuthContext = pItem->zName; + sqlite3ResolveSelectNames(pParse, pItem->pSelect, pOuterNC); + pParse->zAuthContext = zSavedContext; + if( pParse->nErr || db->mallocFailed ) return WRC_Abort; + + for(pNC=pOuterNC; pNC; pNC=pNC->pNext) nRef -= pNC->nRef; + assert( pItem->fg.isCorrelated==0 && nRef<=0 ); + pItem->fg.isCorrelated = (nRef!=0); + } + } + + /* Set up the local name-context to pass to sqlite3ResolveExprNames() to + ** resolve the result-set expression list. + */ + sNC.ncFlags = NC_AllowAgg; + sNC.pSrcList = p->pSrc; + sNC.pNext = pOuterNC; + + /* Resolve names in the result set. */ + if( sqlite3ResolveExprListNames(&sNC, p->pEList) ) return WRC_Abort; + + /* If there are no aggregate functions in the result-set, and no GROUP BY + ** expression, do not allow aggregates in any of the other expressions. + */ + assert( (p->selFlags & SF_Aggregate)==0 ); + pGroupBy = p->pGroupBy; + if( pGroupBy || (sNC.ncFlags & NC_HasAgg)!=0 ){ + assert( NC_MinMaxAgg==SF_MinMaxAgg ); + p->selFlags |= SF_Aggregate | (sNC.ncFlags&NC_MinMaxAgg); + }else{ + sNC.ncFlags &= ~NC_AllowAgg; + } + + /* If a HAVING clause is present, then there must be a GROUP BY clause. + */ + if( p->pHaving && !pGroupBy ){ + sqlite3ErrorMsg(pParse, "a GROUP BY clause is required before HAVING"); + return WRC_Abort; + } + + /* Add the output column list to the name-context before parsing the + ** other expressions in the SELECT statement. This is so that + ** expressions in the WHERE clause (etc.) can refer to expressions by + ** aliases in the result set. + ** + ** Minor point: If this is the case, then the expression will be + ** re-evaluated for each reference to it. + */ + sNC.pEList = p->pEList; + if( sqlite3ResolveExprNames(&sNC, p->pHaving) ) return WRC_Abort; + if( sqlite3ResolveExprNames(&sNC, p->pWhere) ) return WRC_Abort; + + /* Resolve names in table-valued-function arguments */ + for(i=0; ipSrc->nSrc; i++){ + struct SrcList_item *pItem = &p->pSrc->a[i]; + if( pItem->fg.isTabFunc + && sqlite3ResolveExprListNames(&sNC, pItem->u1.pFuncArg) + ){ + return WRC_Abort; + } + } + + /* The ORDER BY and GROUP BY clauses may not refer to terms in + ** outer queries + */ + sNC.pNext = 0; + sNC.ncFlags |= NC_AllowAgg; + + /* If this is a converted compound query, move the ORDER BY clause from + ** the sub-query back to the parent query. At this point each term + ** within the ORDER BY clause has been transformed to an integer value. + ** These integers will be replaced by copies of the corresponding result + ** set expressions by the call to resolveOrderGroupBy() below. */ + if( p->selFlags & SF_Converted ){ + Select *pSub = p->pSrc->a[0].pSelect; + p->pOrderBy = pSub->pOrderBy; + pSub->pOrderBy = 0; + } + + /* Process the ORDER BY clause for singleton SELECT statements. + ** The ORDER BY clause for compounds SELECT statements is handled + ** below, after all of the result-sets for all of the elements of + ** the compound have been resolved. + ** + ** If there is an ORDER BY clause on a term of a compound-select other + ** than the right-most term, then that is a syntax error. But the error + ** is not detected until much later, and so we need to go ahead and + ** resolve those symbols on the incorrect ORDER BY for consistency. + */ + if( isCompound<=nCompound /* Defer right-most ORDER BY of a compound */ + && resolveOrderGroupBy(&sNC, p, p->pOrderBy, "ORDER") + ){ + return WRC_Abort; + } + if( db->mallocFailed ){ + return WRC_Abort; + } + + /* Resolve the GROUP BY clause. At the same time, make sure + ** the GROUP BY clause does not contain aggregate functions. + */ + if( pGroupBy ){ + struct ExprList_item *pItem; + + if( resolveOrderGroupBy(&sNC, p, pGroupBy, "GROUP") || db->mallocFailed ){ + return WRC_Abort; + } + for(i=0, pItem=pGroupBy->a; inExpr; i++, pItem++){ + if( ExprHasProperty(pItem->pExpr, EP_Agg) ){ + sqlite3ErrorMsg(pParse, "aggregate functions are not allowed in " + "the GROUP BY clause"); + return WRC_Abort; + } + } + } + + /* If this is part of a compound SELECT, check that it has the right + ** number of expressions in the select list. */ + if( p->pNext && p->pEList->nExpr!=p->pNext->pEList->nExpr ){ + sqlite3SelectWrongNumTermsError(pParse, p->pNext); + return WRC_Abort; + } + + /* Advance to the next term of the compound + */ + p = p->pPrior; + nCompound++; + } + + /* Resolve the ORDER BY on a compound SELECT after all terms of + ** the compound have been resolved. + */ + if( isCompound && resolveCompoundOrderBy(pParse, pLeftmost) ){ + return WRC_Abort; + } + + return WRC_Prune; +} + +/* +** This routine walks an expression tree and resolves references to +** table columns and result-set columns. At the same time, do error +** checking on function usage and set a flag if any aggregate functions +** are seen. +** +** To resolve table columns references we look for nodes (or subtrees) of the +** form X.Y.Z or Y.Z or just Z where +** +** X: The name of a database. Ex: "main" or "temp" or +** the symbolic name assigned to an ATTACH-ed database. +** +** Y: The name of a table in a FROM clause. Or in a trigger +** one of the special names "old" or "new". +** +** Z: The name of a column in table Y. +** +** The node at the root of the subtree is modified as follows: +** +** Expr.op Changed to TK_COLUMN +** Expr.pTab Points to the Table object for X.Y +** Expr.iColumn The column index in X.Y. -1 for the rowid. +** Expr.iTable The VDBE cursor number for X.Y +** +** +** To resolve result-set references, look for expression nodes of the +** form Z (with no X and Y prefix) where the Z matches the right-hand +** size of an AS clause in the result-set of a SELECT. The Z expression +** is replaced by a copy of the left-hand side of the result-set expression. +** Table-name and function resolution occurs on the substituted expression +** tree. For example, in: +** +** SELECT a+b AS x, c+d AS y FROM t1 ORDER BY x; +** +** The "x" term of the order by is replaced by "a+b" to render: +** +** SELECT a+b AS x, c+d AS y FROM t1 ORDER BY a+b; +** +** Function calls are checked to make sure that the function is +** defined and that the correct number of arguments are specified. +** If the function is an aggregate function, then the NC_HasAgg flag is +** set and the opcode is changed from TK_FUNCTION to TK_AGG_FUNCTION. +** If an expression contains aggregate functions then the EP_Agg +** property on the expression is set. +** +** An error message is left in pParse if anything is amiss. The number +** if errors is returned. +*/ +SQLITE_PRIVATE int sqlite3ResolveExprNames( + NameContext *pNC, /* Namespace to resolve expressions in. */ + Expr *pExpr /* The expression to be analyzed. */ +){ + u16 savedHasAgg; + Walker w; + + if( pExpr==0 ) return 0; +#if SQLITE_MAX_EXPR_DEPTH>0 + { + Parse *pParse = pNC->pParse; + if( sqlite3ExprCheckHeight(pParse, pExpr->nHeight+pNC->pParse->nHeight) ){ + return 1; + } + pParse->nHeight += pExpr->nHeight; + } +#endif + savedHasAgg = pNC->ncFlags & (NC_HasAgg|NC_MinMaxAgg); + pNC->ncFlags &= ~(NC_HasAgg|NC_MinMaxAgg); + w.pParse = pNC->pParse; + w.xExprCallback = resolveExprStep; + w.xSelectCallback = resolveSelectStep; + w.xSelectCallback2 = 0; + w.walkerDepth = 0; + w.eCode = 0; + w.u.pNC = pNC; + sqlite3WalkExpr(&w, pExpr); +#if SQLITE_MAX_EXPR_DEPTH>0 + pNC->pParse->nHeight -= pExpr->nHeight; +#endif + if( pNC->nErr>0 || w.pParse->nErr>0 ){ + ExprSetProperty(pExpr, EP_Error); + } + if( pNC->ncFlags & NC_HasAgg ){ + ExprSetProperty(pExpr, EP_Agg); + } + pNC->ncFlags |= savedHasAgg; + return ExprHasProperty(pExpr, EP_Error); +} + +/* +** Resolve all names for all expression in an expression list. This is +** just like sqlite3ResolveExprNames() except that it works for an expression +** list rather than a single expression. +*/ +SQLITE_PRIVATE int sqlite3ResolveExprListNames( + NameContext *pNC, /* Namespace to resolve expressions in. */ + ExprList *pList /* The expression list to be analyzed. */ +){ + int i; + if( pList ){ + for(i=0; inExpr; i++){ + if( sqlite3ResolveExprNames(pNC, pList->a[i].pExpr) ) return WRC_Abort; + } + } + return WRC_Continue; +} + +/* +** Resolve all names in all expressions of a SELECT and in all +** decendents of the SELECT, including compounds off of p->pPrior, +** subqueries in expressions, and subqueries used as FROM clause +** terms. +** +** See sqlite3ResolveExprNames() for a description of the kinds of +** transformations that occur. +** +** All SELECT statements should have been expanded using +** sqlite3SelectExpand() prior to invoking this routine. +*/ +SQLITE_PRIVATE void sqlite3ResolveSelectNames( + Parse *pParse, /* The parser context */ + Select *p, /* The SELECT statement being coded. */ + NameContext *pOuterNC /* Name context for parent SELECT statement */ +){ + Walker w; + + assert( p!=0 ); + memset(&w, 0, sizeof(w)); + w.xExprCallback = resolveExprStep; + w.xSelectCallback = resolveSelectStep; + w.pParse = pParse; + w.u.pNC = pOuterNC; + sqlite3WalkSelect(&w, p); +} + +/* +** Resolve names in expressions that can only reference a single table: +** +** * CHECK constraints +** * WHERE clauses on partial indices +** +** The Expr.iTable value for Expr.op==TK_COLUMN nodes of the expression +** is set to -1 and the Expr.iColumn value is set to the column number. +** +** Any errors cause an error message to be set in pParse. +*/ +SQLITE_PRIVATE void sqlite3ResolveSelfReference( + Parse *pParse, /* Parsing context */ + Table *pTab, /* The table being referenced */ + int type, /* NC_IsCheck or NC_PartIdx or NC_IdxExpr */ + Expr *pExpr, /* Expression to resolve. May be NULL. */ + ExprList *pList /* Expression list to resolve. May be NUL. */ +){ + SrcList sSrc; /* Fake SrcList for pParse->pNewTable */ + NameContext sNC; /* Name context for pParse->pNewTable */ + + assert( type==NC_IsCheck || type==NC_PartIdx || type==NC_IdxExpr ); + memset(&sNC, 0, sizeof(sNC)); + memset(&sSrc, 0, sizeof(sSrc)); + sSrc.nSrc = 1; + sSrc.a[0].zName = pTab->zName; + sSrc.a[0].pTab = pTab; + sSrc.a[0].iCursor = -1; + sNC.pParse = pParse; + sNC.pSrcList = &sSrc; + sNC.ncFlags = type; + if( sqlite3ResolveExprNames(&sNC, pExpr) ) return; + if( pList ) sqlite3ResolveExprListNames(&sNC, pList); +} + +/************** End of resolve.c *********************************************/ +/************** Begin file expr.c ********************************************/ +/* +** 2001 September 15 +** +** 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 routines used for analyzing expressions and +** for generating VDBE code that evaluates expressions in SQLite. +*/ +/* #include "sqliteInt.h" */ + +/* Forward declarations */ +static void exprCodeBetween(Parse*,Expr*,int,void(*)(Parse*,Expr*,int,int),int); +static int exprCodeVector(Parse *pParse, Expr *p, int *piToFree); + +/* +** Return the affinity character for a single column of a table. +*/ +SQLITE_PRIVATE char sqlite3TableColumnAffinity(Table *pTab, int iCol){ + assert( iColnCol ); + return iCol>=0 ? pTab->aCol[iCol].affinity : SQLITE_AFF_INTEGER; +} + +/* +** Return the 'affinity' of the expression pExpr if any. +** +** If pExpr is a column, a reference to a column via an 'AS' alias, +** or a sub-select with a column as the return value, then the +** affinity of that column is returned. Otherwise, 0x00 is returned, +** indicating no affinity for the expression. +** +** i.e. the WHERE clause expressions in the following statements all +** have an affinity: +** +** CREATE TABLE t1(a); +** SELECT * FROM t1 WHERE a; +** SELECT a AS b FROM t1 WHERE b; +** SELECT * FROM t1 WHERE (select a from t1); +*/ +SQLITE_PRIVATE char sqlite3ExprAffinity(Expr *pExpr){ + int op; + pExpr = sqlite3ExprSkipCollate(pExpr); + if( pExpr->flags & EP_Generic ) return 0; + op = pExpr->op; + if( op==TK_SELECT ){ + assert( pExpr->flags&EP_xIsSelect ); + return sqlite3ExprAffinity(pExpr->x.pSelect->pEList->a[0].pExpr); + } + if( op==TK_REGISTER ) op = pExpr->op2; +#ifndef SQLITE_OMIT_CAST + if( op==TK_CAST ){ + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + return sqlite3AffinityType(pExpr->u.zToken, 0); + } +#endif + if( op==TK_AGG_COLUMN || op==TK_COLUMN ){ + return sqlite3TableColumnAffinity(pExpr->pTab, pExpr->iColumn); + } + if( op==TK_SELECT_COLUMN ){ + assert( pExpr->pLeft->flags&EP_xIsSelect ); + return sqlite3ExprAffinity( + pExpr->pLeft->x.pSelect->pEList->a[pExpr->iColumn].pExpr + ); + } + return pExpr->affinity; +} + +/* +** Set the collating sequence for expression pExpr to be the collating +** sequence named by pToken. Return a pointer to a new Expr node that +** implements the COLLATE operator. +** +** If a memory allocation error occurs, that fact is recorded in pParse->db +** and the pExpr parameter is returned unchanged. +*/ +SQLITE_PRIVATE Expr *sqlite3ExprAddCollateToken( + Parse *pParse, /* Parsing context */ + Expr *pExpr, /* Add the "COLLATE" clause to this expression */ + const Token *pCollName, /* Name of collating sequence */ + int dequote /* True to dequote pCollName */ +){ + if( pCollName->n>0 ){ + Expr *pNew = sqlite3ExprAlloc(pParse->db, TK_COLLATE, pCollName, dequote); + if( pNew ){ + pNew->pLeft = pExpr; + pNew->flags |= EP_Collate|EP_Skip; + pExpr = pNew; + } + } + return pExpr; +} +SQLITE_PRIVATE Expr *sqlite3ExprAddCollateString(Parse *pParse, Expr *pExpr, const char *zC){ + Token s; + assert( zC!=0 ); + sqlite3TokenInit(&s, (char*)zC); + return sqlite3ExprAddCollateToken(pParse, pExpr, &s, 0); +} + +/* +** Skip over any TK_COLLATE operators and any unlikely() +** or likelihood() function at the root of an expression. +*/ +SQLITE_PRIVATE Expr *sqlite3ExprSkipCollate(Expr *pExpr){ + while( pExpr && ExprHasProperty(pExpr, EP_Skip) ){ + if( ExprHasProperty(pExpr, EP_Unlikely) ){ + assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); + assert( pExpr->x.pList->nExpr>0 ); + assert( pExpr->op==TK_FUNCTION ); + pExpr = pExpr->x.pList->a[0].pExpr; + }else{ + assert( pExpr->op==TK_COLLATE ); + pExpr = pExpr->pLeft; + } + } + return pExpr; +} + +/* +** Return the collation sequence for the expression pExpr. If +** there is no defined collating sequence, return NULL. +** +** The collating sequence might be determined by a COLLATE operator +** or by the presence of a column with a defined collating sequence. +** COLLATE operators take first precedence. Left operands take +** precedence over right operands. +*/ +SQLITE_PRIVATE CollSeq *sqlite3ExprCollSeq(Parse *pParse, Expr *pExpr){ + sqlite3 *db = pParse->db; + CollSeq *pColl = 0; + Expr *p = pExpr; + while( p ){ + int op = p->op; + if( p->flags & EP_Generic ) break; + if( op==TK_CAST || op==TK_UPLUS ){ + p = p->pLeft; + continue; + } + if( op==TK_COLLATE || (op==TK_REGISTER && p->op2==TK_COLLATE) ){ + pColl = sqlite3GetCollSeq(pParse, ENC(db), 0, p->u.zToken); + break; + } + if( (op==TK_AGG_COLUMN || op==TK_COLUMN + || op==TK_REGISTER || op==TK_TRIGGER) + && p->pTab!=0 + ){ + /* op==TK_REGISTER && p->pTab!=0 happens when pExpr was originally + ** a TK_COLUMN but was previously evaluated and cached in a register */ + int j = p->iColumn; + if( j>=0 ){ + const char *zColl = p->pTab->aCol[j].zColl; + pColl = sqlite3FindCollSeq(db, ENC(db), zColl, 0); + } + break; + } + if( p->flags & EP_Collate ){ + if( p->pLeft && (p->pLeft->flags & EP_Collate)!=0 ){ + p = p->pLeft; + }else{ + Expr *pNext = p->pRight; + /* The Expr.x union is never used at the same time as Expr.pRight */ + assert( p->x.pList==0 || p->pRight==0 ); + /* p->flags holds EP_Collate and p->pLeft->flags does not. And + ** p->x.pSelect cannot. So if p->x.pLeft exists, it must hold at + ** least one EP_Collate. Thus the following two ALWAYS. */ + if( p->x.pList!=0 && ALWAYS(!ExprHasProperty(p, EP_xIsSelect)) ){ + int i; + for(i=0; ALWAYS(ix.pList->nExpr); i++){ + if( ExprHasProperty(p->x.pList->a[i].pExpr, EP_Collate) ){ + pNext = p->x.pList->a[i].pExpr; + break; + } + } + } + p = pNext; + } + }else{ + break; + } + } + if( sqlite3CheckCollSeq(pParse, pColl) ){ + pColl = 0; + } + return pColl; +} + +/* +** pExpr is an operand of a comparison operator. aff2 is the +** type affinity of the other operand. This routine returns the +** type affinity that should be used for the comparison operator. +*/ +SQLITE_PRIVATE char sqlite3CompareAffinity(Expr *pExpr, char aff2){ + char aff1 = sqlite3ExprAffinity(pExpr); + if( aff1 && aff2 ){ + /* Both sides of the comparison are columns. If one has numeric + ** affinity, use that. Otherwise use no affinity. + */ + if( sqlite3IsNumericAffinity(aff1) || sqlite3IsNumericAffinity(aff2) ){ + return SQLITE_AFF_NUMERIC; + }else{ + return SQLITE_AFF_BLOB; + } + }else if( !aff1 && !aff2 ){ + /* Neither side of the comparison is a column. Compare the + ** results directly. + */ + return SQLITE_AFF_BLOB; + }else{ + /* One side is a column, the other is not. Use the columns affinity. */ + assert( aff1==0 || aff2==0 ); + return (aff1 + aff2); + } +} + +/* +** pExpr is a comparison operator. Return the type affinity that should +** be applied to both operands prior to doing the comparison. +*/ +static char comparisonAffinity(Expr *pExpr){ + char aff; + assert( pExpr->op==TK_EQ || pExpr->op==TK_IN || pExpr->op==TK_LT || + pExpr->op==TK_GT || pExpr->op==TK_GE || pExpr->op==TK_LE || + pExpr->op==TK_NE || pExpr->op==TK_IS || pExpr->op==TK_ISNOT ); + assert( pExpr->pLeft ); + aff = sqlite3ExprAffinity(pExpr->pLeft); + if( pExpr->pRight ){ + aff = sqlite3CompareAffinity(pExpr->pRight, aff); + }else if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + aff = sqlite3CompareAffinity(pExpr->x.pSelect->pEList->a[0].pExpr, aff); + }else if( NEVER(aff==0) ){ + aff = SQLITE_AFF_BLOB; + } + return aff; +} + +/* +** pExpr is a comparison expression, eg. '=', '<', IN(...) etc. +** idx_affinity is the affinity of an indexed column. Return true +** if the index with affinity idx_affinity may be used to implement +** the comparison in pExpr. +*/ +SQLITE_PRIVATE int sqlite3IndexAffinityOk(Expr *pExpr, char idx_affinity){ + char aff = comparisonAffinity(pExpr); + switch( aff ){ + case SQLITE_AFF_BLOB: + return 1; + case SQLITE_AFF_TEXT: + return idx_affinity==SQLITE_AFF_TEXT; + default: + return sqlite3IsNumericAffinity(idx_affinity); + } +} + +/* +** Return the P5 value that should be used for a binary comparison +** opcode (OP_Eq, OP_Ge etc.) used to compare pExpr1 and pExpr2. +*/ +static u8 binaryCompareP5(Expr *pExpr1, Expr *pExpr2, int jumpIfNull){ + u8 aff = (char)sqlite3ExprAffinity(pExpr2); + aff = (u8)sqlite3CompareAffinity(pExpr1, aff) | (u8)jumpIfNull; + return aff; +} + +/* +** Return a pointer to the collation sequence that should be used by +** a binary comparison operator comparing pLeft and pRight. +** +** If the left hand expression has a collating sequence type, then it is +** used. Otherwise the collation sequence for the right hand expression +** is used, or the default (BINARY) if neither expression has a collating +** type. +** +** Argument pRight (but not pLeft) may be a null pointer. In this case, +** it is not considered. +*/ +SQLITE_PRIVATE CollSeq *sqlite3BinaryCompareCollSeq( + Parse *pParse, + Expr *pLeft, + Expr *pRight +){ + CollSeq *pColl; + assert( pLeft ); + if( pLeft->flags & EP_Collate ){ + pColl = sqlite3ExprCollSeq(pParse, pLeft); + }else if( pRight && (pRight->flags & EP_Collate)!=0 ){ + pColl = sqlite3ExprCollSeq(pParse, pRight); + }else{ + pColl = sqlite3ExprCollSeq(pParse, pLeft); + if( !pColl ){ + pColl = sqlite3ExprCollSeq(pParse, pRight); + } + } + return pColl; +} + +/* +** Generate code for a comparison operator. +*/ +static int codeCompare( + Parse *pParse, /* The parsing (and code generating) context */ + Expr *pLeft, /* The left operand */ + Expr *pRight, /* The right operand */ + int opcode, /* The comparison opcode */ + int in1, int in2, /* Register holding operands */ + int dest, /* Jump here if true. */ + int jumpIfNull /* If true, jump if either operand is NULL */ +){ + int p5; + int addr; + CollSeq *p4; + + p4 = sqlite3BinaryCompareCollSeq(pParse, pLeft, pRight); + p5 = binaryCompareP5(pLeft, pRight, jumpIfNull); + addr = sqlite3VdbeAddOp4(pParse->pVdbe, opcode, in2, dest, in1, + (void*)p4, P4_COLLSEQ); + sqlite3VdbeChangeP5(pParse->pVdbe, (u8)p5); + return addr; +} + +/* +** Return true if expression pExpr is a vector, or false otherwise. +** +** A vector is defined as any expression that results in two or more +** columns of result. Every TK_VECTOR node is an vector because the +** parser will not generate a TK_VECTOR with fewer than two entries. +** But a TK_SELECT might be either a vector or a scalar. It is only +** considered a vector if it has two or more result columns. +*/ +SQLITE_PRIVATE int sqlite3ExprIsVector(Expr *pExpr){ + return sqlite3ExprVectorSize(pExpr)>1; +} + +/* +** If the expression passed as the only argument is of type TK_VECTOR +** return the number of expressions in the vector. Or, if the expression +** is a sub-select, return the number of columns in the sub-select. For +** any other type of expression, return 1. +*/ +SQLITE_PRIVATE int sqlite3ExprVectorSize(Expr *pExpr){ + u8 op = pExpr->op; + if( op==TK_REGISTER ) op = pExpr->op2; + if( op==TK_VECTOR ){ + return pExpr->x.pList->nExpr; + }else if( op==TK_SELECT ){ + return pExpr->x.pSelect->pEList->nExpr; + }else{ + return 1; + } +} + +#ifndef SQLITE_OMIT_SUBQUERY +/* +** Return a pointer to a subexpression of pVector that is the i-th +** column of the vector (numbered starting with 0). The caller must +** ensure that i is within range. +** +** If pVector is really a scalar (and "scalar" here includes subqueries +** that return a single column!) then return pVector unmodified. +** +** pVector retains ownership of the returned subexpression. +** +** If the vector is a (SELECT ...) then the expression returned is +** just the expression for the i-th term of the result set, and may +** not be ready for evaluation because the table cursor has not yet +** been positioned. +*/ +SQLITE_PRIVATE Expr *sqlite3VectorFieldSubexpr(Expr *pVector, int i){ + assert( iop2==0 || pVector->op==TK_REGISTER ); + if( pVector->op==TK_SELECT || pVector->op2==TK_SELECT ){ + return pVector->x.pSelect->pEList->a[i].pExpr; + }else{ + return pVector->x.pList->a[i].pExpr; + } + } + return pVector; +} +#endif /* !defined(SQLITE_OMIT_SUBQUERY) */ + +#ifndef SQLITE_OMIT_SUBQUERY +/* +** Compute and return a new Expr object which when passed to +** sqlite3ExprCode() will generate all necessary code to compute +** the iField-th column of the vector expression pVector. +** +** It is ok for pVector to be a scalar (as long as iField==0). +** In that case, this routine works like sqlite3ExprDup(). +** +** The caller owns the returned Expr object and is responsible for +** ensuring that the returned value eventually gets freed. +** +** The caller retains ownership of pVector. If pVector is a TK_SELECT, +** then the returned object will reference pVector and so pVector must remain +** valid for the life of the returned object. If pVector is a TK_VECTOR +** or a scalar expression, then it can be deleted as soon as this routine +** returns. +** +** A trick to cause a TK_SELECT pVector to be deleted together with +** the returned Expr object is to attach the pVector to the pRight field +** of the returned TK_SELECT_COLUMN Expr object. +*/ +SQLITE_PRIVATE Expr *sqlite3ExprForVectorField( + Parse *pParse, /* Parsing context */ + Expr *pVector, /* The vector. List of expressions or a sub-SELECT */ + int iField /* Which column of the vector to return */ +){ + Expr *pRet; + if( pVector->op==TK_SELECT ){ + assert( pVector->flags & EP_xIsSelect ); + /* The TK_SELECT_COLUMN Expr node: + ** + ** pLeft: pVector containing TK_SELECT + ** pRight: not used. But recursively deleted. + ** iColumn: Index of a column in pVector + ** pLeft->iTable: First in an array of register holding result, or 0 + ** if the result is not yet computed. + ** + ** sqlite3ExprDelete() specifically skips the recursive delete of + ** pLeft on TK_SELECT_COLUMN nodes. But pRight is followed, so pVector + ** can be attached to pRight to cause this node to take ownership of + ** pVector. Typically there will be multiple TK_SELECT_COLUMN nodes + ** with the same pLeft pointer to the pVector, but only one of them + ** will own the pVector. + */ + pRet = sqlite3PExpr(pParse, TK_SELECT_COLUMN, 0, 0, 0); + if( pRet ){ + pRet->iColumn = iField; + pRet->pLeft = pVector; + } + assert( pRet==0 || pRet->iTable==0 ); + }else{ + if( pVector->op==TK_VECTOR ) pVector = pVector->x.pList->a[iField].pExpr; + pRet = sqlite3ExprDup(pParse->db, pVector, 0); + } + return pRet; +} +#endif /* !define(SQLITE_OMIT_SUBQUERY) */ + +/* +** If expression pExpr is of type TK_SELECT, generate code to evaluate +** it. Return the register in which the result is stored (or, if the +** sub-select returns more than one column, the first in an array +** of registers in which the result is stored). +** +** If pExpr is not a TK_SELECT expression, return 0. +*/ +static int exprCodeSubselect(Parse *pParse, Expr *pExpr){ + int reg = 0; +#ifndef SQLITE_OMIT_SUBQUERY + if( pExpr->op==TK_SELECT ){ + reg = sqlite3CodeSubselect(pParse, pExpr, 0, 0); + } +#endif + return reg; +} + +/* +** Argument pVector points to a vector expression - either a TK_VECTOR +** or TK_SELECT that returns more than one column. This function returns +** the register number of a register that contains the value of +** element iField of the vector. +** +** If pVector is a TK_SELECT expression, then code for it must have +** already been generated using the exprCodeSubselect() routine. In this +** case parameter regSelect should be the first in an array of registers +** containing the results of the sub-select. +** +** If pVector is of type TK_VECTOR, then code for the requested field +** is generated. In this case (*pRegFree) may be set to the number of +** a temporary register to be freed by the caller before returning. +** +** Before returning, output parameter (*ppExpr) is set to point to the +** Expr object corresponding to element iElem of the vector. +*/ +static int exprVectorRegister( + Parse *pParse, /* Parse context */ + Expr *pVector, /* Vector to extract element from */ + int iField, /* Field to extract from pVector */ + int regSelect, /* First in array of registers */ + Expr **ppExpr, /* OUT: Expression element */ + int *pRegFree /* OUT: Temp register to free */ +){ + u8 op = pVector->op; + assert( op==TK_VECTOR || op==TK_REGISTER || op==TK_SELECT ); + if( op==TK_REGISTER ){ + *ppExpr = sqlite3VectorFieldSubexpr(pVector, iField); + return pVector->iTable+iField; + } + if( op==TK_SELECT ){ + *ppExpr = pVector->x.pSelect->pEList->a[iField].pExpr; + return regSelect+iField; + } + *ppExpr = pVector->x.pList->a[iField].pExpr; + return sqlite3ExprCodeTemp(pParse, *ppExpr, pRegFree); +} + +/* +** Expression pExpr is a comparison between two vector values. Compute +** the result of the comparison (1, 0, or NULL) and write that +** result into register dest. +** +** The caller must satisfy the following preconditions: +** +** if pExpr->op==TK_IS: op==TK_EQ and p5==SQLITE_NULLEQ +** if pExpr->op==TK_ISNOT: op==TK_NE and p5==SQLITE_NULLEQ +** otherwise: op==pExpr->op and p5==0 +*/ +static void codeVectorCompare( + Parse *pParse, /* Code generator context */ + Expr *pExpr, /* The comparison operation */ + int dest, /* Write results into this register */ + u8 op, /* Comparison operator */ + u8 p5 /* SQLITE_NULLEQ or zero */ +){ + Vdbe *v = pParse->pVdbe; + Expr *pLeft = pExpr->pLeft; + Expr *pRight = pExpr->pRight; + int nLeft = sqlite3ExprVectorSize(pLeft); + int i; + int regLeft = 0; + int regRight = 0; + u8 opx = op; + int addrDone = sqlite3VdbeMakeLabel(v); + + assert( nLeft==sqlite3ExprVectorSize(pRight) ); + assert( pExpr->op==TK_EQ || pExpr->op==TK_NE + || pExpr->op==TK_IS || pExpr->op==TK_ISNOT + || pExpr->op==TK_LT || pExpr->op==TK_GT + || pExpr->op==TK_LE || pExpr->op==TK_GE + ); + assert( pExpr->op==op || (pExpr->op==TK_IS && op==TK_EQ) + || (pExpr->op==TK_ISNOT && op==TK_NE) ); + assert( p5==0 || pExpr->op!=op ); + assert( p5==SQLITE_NULLEQ || pExpr->op==op ); + + p5 |= SQLITE_STOREP2; + if( opx==TK_LE ) opx = TK_LT; + if( opx==TK_GE ) opx = TK_GT; + + regLeft = exprCodeSubselect(pParse, pLeft); + regRight = exprCodeSubselect(pParse, pRight); + + for(i=0; 1 /*Loop exits by "break"*/; i++){ + int regFree1 = 0, regFree2 = 0; + Expr *pL, *pR; + int r1, r2; + assert( i>=0 && i0 ) sqlite3ExprCachePush(pParse); + r1 = exprVectorRegister(pParse, pLeft, i, regLeft, &pL, ®Free1); + r2 = exprVectorRegister(pParse, pRight, i, regRight, &pR, ®Free2); + codeCompare(pParse, pL, pR, opx, r1, r2, dest, p5); + testcase(op==OP_Lt); VdbeCoverageIf(v,op==OP_Lt); + testcase(op==OP_Le); VdbeCoverageIf(v,op==OP_Le); + testcase(op==OP_Gt); VdbeCoverageIf(v,op==OP_Gt); + testcase(op==OP_Ge); VdbeCoverageIf(v,op==OP_Ge); + testcase(op==OP_Eq); VdbeCoverageIf(v,op==OP_Eq); + testcase(op==OP_Ne); VdbeCoverageIf(v,op==OP_Ne); + sqlite3ReleaseTempReg(pParse, regFree1); + sqlite3ReleaseTempReg(pParse, regFree2); + if( i>0 ) sqlite3ExprCachePop(pParse); + if( i==nLeft-1 ){ + break; + } + if( opx==TK_EQ ){ + sqlite3VdbeAddOp2(v, OP_IfNot, dest, addrDone); VdbeCoverage(v); + p5 |= SQLITE_KEEPNULL; + }else if( opx==TK_NE ){ + sqlite3VdbeAddOp2(v, OP_If, dest, addrDone); VdbeCoverage(v); + p5 |= SQLITE_KEEPNULL; + }else{ + assert( op==TK_LT || op==TK_GT || op==TK_LE || op==TK_GE ); + sqlite3VdbeAddOp2(v, OP_ElseNotEq, 0, addrDone); + VdbeCoverageIf(v, op==TK_LT); + VdbeCoverageIf(v, op==TK_GT); + VdbeCoverageIf(v, op==TK_LE); + VdbeCoverageIf(v, op==TK_GE); + if( i==nLeft-2 ) opx = op; + } + } + sqlite3VdbeResolveLabel(v, addrDone); +} + +#if SQLITE_MAX_EXPR_DEPTH>0 +/* +** Check that argument nHeight is less than or equal to the maximum +** expression depth allowed. If it is not, leave an error message in +** pParse. +*/ +SQLITE_PRIVATE int sqlite3ExprCheckHeight(Parse *pParse, int nHeight){ + int rc = SQLITE_OK; + int mxHeight = pParse->db->aLimit[SQLITE_LIMIT_EXPR_DEPTH]; + if( nHeight>mxHeight ){ + sqlite3ErrorMsg(pParse, + "Expression tree is too large (maximum depth %d)", mxHeight + ); + rc = SQLITE_ERROR; + } + return rc; +} + +/* The following three functions, heightOfExpr(), heightOfExprList() +** and heightOfSelect(), are used to determine the maximum height +** of any expression tree referenced by the structure passed as the +** first argument. +** +** If this maximum height is greater than the current value pointed +** to by pnHeight, the second parameter, then set *pnHeight to that +** value. +*/ +static void heightOfExpr(Expr *p, int *pnHeight){ + if( p ){ + if( p->nHeight>*pnHeight ){ + *pnHeight = p->nHeight; + } + } +} +static void heightOfExprList(ExprList *p, int *pnHeight){ + if( p ){ + int i; + for(i=0; inExpr; i++){ + heightOfExpr(p->a[i].pExpr, pnHeight); + } + } +} +static void heightOfSelect(Select *p, int *pnHeight){ + if( p ){ + heightOfExpr(p->pWhere, pnHeight); + heightOfExpr(p->pHaving, pnHeight); + heightOfExpr(p->pLimit, pnHeight); + heightOfExpr(p->pOffset, pnHeight); + heightOfExprList(p->pEList, pnHeight); + heightOfExprList(p->pGroupBy, pnHeight); + heightOfExprList(p->pOrderBy, pnHeight); + heightOfSelect(p->pPrior, pnHeight); + } +} + +/* +** Set the Expr.nHeight variable in the structure passed as an +** argument. An expression with no children, Expr.pList or +** Expr.pSelect member has a height of 1. Any other expression +** has a height equal to the maximum height of any other +** referenced Expr plus one. +** +** Also propagate EP_Propagate flags up from Expr.x.pList to Expr.flags, +** if appropriate. +*/ +static void exprSetHeight(Expr *p){ + int nHeight = 0; + heightOfExpr(p->pLeft, &nHeight); + heightOfExpr(p->pRight, &nHeight); + if( ExprHasProperty(p, EP_xIsSelect) ){ + heightOfSelect(p->x.pSelect, &nHeight); + }else if( p->x.pList ){ + heightOfExprList(p->x.pList, &nHeight); + p->flags |= EP_Propagate & sqlite3ExprListFlags(p->x.pList); + } + p->nHeight = nHeight + 1; +} + +/* +** Set the Expr.nHeight variable using the exprSetHeight() function. If +** the height is greater than the maximum allowed expression depth, +** leave an error in pParse. +** +** Also propagate all EP_Propagate flags from the Expr.x.pList into +** Expr.flags. +*/ +SQLITE_PRIVATE void sqlite3ExprSetHeightAndFlags(Parse *pParse, Expr *p){ + if( pParse->nErr ) return; + exprSetHeight(p); + sqlite3ExprCheckHeight(pParse, p->nHeight); +} + +/* +** Return the maximum height of any expression tree referenced +** by the select statement passed as an argument. +*/ +SQLITE_PRIVATE int sqlite3SelectExprHeight(Select *p){ + int nHeight = 0; + heightOfSelect(p, &nHeight); + return nHeight; +} +#else /* ABOVE: Height enforcement enabled. BELOW: Height enforcement off */ +/* +** Propagate all EP_Propagate flags from the Expr.x.pList into +** Expr.flags. +*/ +SQLITE_PRIVATE void sqlite3ExprSetHeightAndFlags(Parse *pParse, Expr *p){ + if( p && p->x.pList && !ExprHasProperty(p, EP_xIsSelect) ){ + p->flags |= EP_Propagate & sqlite3ExprListFlags(p->x.pList); + } +} +#define exprSetHeight(y) +#endif /* SQLITE_MAX_EXPR_DEPTH>0 */ + +/* +** This routine is the core allocator for Expr nodes. +** +** Construct a new expression node and return a pointer to it. Memory +** for this node and for the pToken argument is a single allocation +** obtained from sqlite3DbMalloc(). The calling function +** is responsible for making sure the node eventually gets freed. +** +** If dequote is true, then the token (if it exists) is dequoted. +** If dequote is false, no dequoting is performed. The deQuote +** parameter is ignored if pToken is NULL or if the token does not +** appear to be quoted. If the quotes were of the form "..." (double-quotes) +** then the EP_DblQuoted flag is set on the expression node. +** +** Special case: If op==TK_INTEGER and pToken points to a string that +** can be translated into a 32-bit integer, then the token is not +** stored in u.zToken. Instead, the integer values is written +** into u.iValue and the EP_IntValue flag is set. No extra storage +** is allocated to hold the integer text and the dequote flag is ignored. +*/ +SQLITE_PRIVATE Expr *sqlite3ExprAlloc( + sqlite3 *db, /* Handle for sqlite3DbMallocRawNN() */ + int op, /* Expression opcode */ + const Token *pToken, /* Token argument. Might be NULL */ + int dequote /* True to dequote */ +){ + Expr *pNew; + int nExtra = 0; + int iValue = 0; + + assert( db!=0 ); + if( pToken ){ + if( op!=TK_INTEGER || pToken->z==0 + || sqlite3GetInt32(pToken->z, &iValue)==0 ){ + nExtra = pToken->n+1; + assert( iValue>=0 ); + } + } + pNew = sqlite3DbMallocRawNN(db, sizeof(Expr)+nExtra); + if( pNew ){ + memset(pNew, 0, sizeof(Expr)); + pNew->op = (u8)op; + pNew->iAgg = -1; + if( pToken ){ + if( nExtra==0 ){ + pNew->flags |= EP_IntValue; + pNew->u.iValue = iValue; + }else{ + pNew->u.zToken = (char*)&pNew[1]; + assert( pToken->z!=0 || pToken->n==0 ); + if( pToken->n ) memcpy(pNew->u.zToken, pToken->z, pToken->n); + pNew->u.zToken[pToken->n] = 0; + if( dequote && sqlite3Isquote(pNew->u.zToken[0]) ){ + if( pNew->u.zToken[0]=='"' ) pNew->flags |= EP_DblQuoted; + sqlite3Dequote(pNew->u.zToken); + } + } + } +#if SQLITE_MAX_EXPR_DEPTH>0 + pNew->nHeight = 1; +#endif + } + return pNew; +} + +/* +** Allocate a new expression node from a zero-terminated token that has +** already been dequoted. +*/ +SQLITE_PRIVATE Expr *sqlite3Expr( + sqlite3 *db, /* Handle for sqlite3DbMallocZero() (may be null) */ + int op, /* Expression opcode */ + const char *zToken /* Token argument. Might be NULL */ +){ + Token x; + x.z = zToken; + x.n = zToken ? sqlite3Strlen30(zToken) : 0; + return sqlite3ExprAlloc(db, op, &x, 0); +} + +/* +** Attach subtrees pLeft and pRight to the Expr node pRoot. +** +** If pRoot==NULL that means that a memory allocation error has occurred. +** In that case, delete the subtrees pLeft and pRight. +*/ +SQLITE_PRIVATE void sqlite3ExprAttachSubtrees( + sqlite3 *db, + Expr *pRoot, + Expr *pLeft, + Expr *pRight +){ + if( pRoot==0 ){ + assert( db->mallocFailed ); + sqlite3ExprDelete(db, pLeft); + sqlite3ExprDelete(db, pRight); + }else{ + if( pRight ){ + pRoot->pRight = pRight; + pRoot->flags |= EP_Propagate & pRight->flags; + } + if( pLeft ){ + pRoot->pLeft = pLeft; + pRoot->flags |= EP_Propagate & pLeft->flags; + } + exprSetHeight(pRoot); + } +} + +/* +** Allocate an Expr node which joins as many as two subtrees. +** +** One or both of the subtrees can be NULL. Return a pointer to the new +** Expr node. Or, if an OOM error occurs, set pParse->db->mallocFailed, +** free the subtrees and return NULL. +*/ +SQLITE_PRIVATE Expr *sqlite3PExpr( + Parse *pParse, /* Parsing context */ + int op, /* Expression opcode */ + Expr *pLeft, /* Left operand */ + Expr *pRight, /* Right operand */ + const Token *pToken /* Argument token */ +){ + Expr *p; + if( op==TK_AND && pParse->nErr==0 ){ + /* Take advantage of short-circuit false optimization for AND */ + p = sqlite3ExprAnd(pParse->db, pLeft, pRight); + }else{ + p = sqlite3ExprAlloc(pParse->db, op & TKFLG_MASK, pToken, 1); + sqlite3ExprAttachSubtrees(pParse->db, p, pLeft, pRight); + } + if( p ) { + sqlite3ExprCheckHeight(pParse, p->nHeight); + } + return p; +} + +/* +** Add pSelect to the Expr.x.pSelect field. Or, if pExpr is NULL (due +** do a memory allocation failure) then delete the pSelect object. +*/ +SQLITE_PRIVATE void sqlite3PExprAddSelect(Parse *pParse, Expr *pExpr, Select *pSelect){ + if( pExpr ){ + pExpr->x.pSelect = pSelect; + ExprSetProperty(pExpr, EP_xIsSelect|EP_Subquery); + sqlite3ExprSetHeightAndFlags(pParse, pExpr); + }else{ + assert( pParse->db->mallocFailed ); + sqlite3SelectDelete(pParse->db, pSelect); + } +} + + +/* +** If the expression is always either TRUE or FALSE (respectively), +** then return 1. If one cannot determine the truth value of the +** expression at compile-time return 0. +** +** This is an optimization. If is OK to return 0 here even if +** the expression really is always false or false (a false negative). +** But it is a bug to return 1 if the expression might have different +** boolean values in different circumstances (a false positive.) +** +** Note that if the expression is part of conditional for a +** LEFT JOIN, then we cannot determine at compile-time whether or not +** is it true or false, so always return 0. +*/ +static int exprAlwaysTrue(Expr *p){ + int v = 0; + if( ExprHasProperty(p, EP_FromJoin) ) return 0; + if( !sqlite3ExprIsInteger(p, &v) ) return 0; + return v!=0; +} +static int exprAlwaysFalse(Expr *p){ + int v = 0; + if( ExprHasProperty(p, EP_FromJoin) ) return 0; + if( !sqlite3ExprIsInteger(p, &v) ) return 0; + return v==0; +} + +/* +** Join two expressions using an AND operator. If either expression is +** NULL, then just return the other expression. +** +** If one side or the other of the AND is known to be false, then instead +** of returning an AND expression, just return a constant expression with +** a value of false. +*/ +SQLITE_PRIVATE Expr *sqlite3ExprAnd(sqlite3 *db, Expr *pLeft, Expr *pRight){ + if( pLeft==0 ){ + return pRight; + }else if( pRight==0 ){ + return pLeft; + }else if( exprAlwaysFalse(pLeft) || exprAlwaysFalse(pRight) ){ + sqlite3ExprDelete(db, pLeft); + sqlite3ExprDelete(db, pRight); + return sqlite3ExprAlloc(db, TK_INTEGER, &sqlite3IntTokens[0], 0); + }else{ + Expr *pNew = sqlite3ExprAlloc(db, TK_AND, 0, 0); + sqlite3ExprAttachSubtrees(db, pNew, pLeft, pRight); + return pNew; + } +} + +/* +** Construct a new expression node for a function with multiple +** arguments. +*/ +SQLITE_PRIVATE Expr *sqlite3ExprFunction(Parse *pParse, ExprList *pList, Token *pToken){ + Expr *pNew; + sqlite3 *db = pParse->db; + assert( pToken ); + pNew = sqlite3ExprAlloc(db, TK_FUNCTION, pToken, 1); + if( pNew==0 ){ + sqlite3ExprListDelete(db, pList); /* Avoid memory leak when malloc fails */ + return 0; + } + pNew->x.pList = pList; + assert( !ExprHasProperty(pNew, EP_xIsSelect) ); + sqlite3ExprSetHeightAndFlags(pParse, pNew); + return pNew; +} + +/* +** Assign a variable number to an expression that encodes a wildcard +** in the original SQL statement. +** +** Wildcards consisting of a single "?" are assigned the next sequential +** variable number. +** +** Wildcards of the form "?nnn" are assigned the number "nnn". We make +** sure "nnn" is not too be to avoid a denial of service attack when +** the SQL statement comes from an external source. +** +** Wildcards of the form ":aaa", "@aaa", or "$aaa" are assigned the same number +** as the previous instance of the same wildcard. Or if this is the first +** instance of the wildcard, the next sequential variable number is +** assigned. +*/ +SQLITE_PRIVATE void sqlite3ExprAssignVarNumber(Parse *pParse, Expr *pExpr, u32 n){ + sqlite3 *db = pParse->db; + const char *z; + + if( pExpr==0 ) return; + assert( !ExprHasProperty(pExpr, EP_IntValue|EP_Reduced|EP_TokenOnly) ); + z = pExpr->u.zToken; + assert( z!=0 ); + assert( z[0]!=0 ); + assert( n==sqlite3Strlen30(z) ); + if( z[1]==0 ){ + /* Wildcard of the form "?". Assign the next variable number */ + assert( z[0]=='?' ); + pExpr->iColumn = (ynVar)(++pParse->nVar); + }else{ + ynVar x; + if( z[0]=='?' ){ + /* Wildcard of the form "?nnn". Convert "nnn" to an integer and + ** use it as the variable number */ + i64 i; + int bOk = 0==sqlite3Atoi64(&z[1], &i, n-1, SQLITE_UTF8); + x = (ynVar)i; + testcase( i==0 ); + testcase( i==1 ); + testcase( i==db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER]-1 ); + testcase( i==db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER] ); + if( bOk==0 || i<1 || i>db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER] ){ + sqlite3ErrorMsg(pParse, "variable number must be between ?1 and ?%d", + db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER]); + return; + } + if( i>pParse->nVar ){ + pParse->nVar = (int)i; + } + }else{ + /* Wildcards like ":aaa", "$aaa" or "@aaa". Reuse the same variable + ** number as the prior appearance of the same name, or if the name + ** has never appeared before, reuse the same variable number + */ + ynVar i; + for(i=x=0; inzVar; i++){ + if( pParse->azVar[i] && strcmp(pParse->azVar[i],z)==0 ){ + x = (ynVar)i+1; + break; + } + } + if( x==0 ) x = (ynVar)(++pParse->nVar); + } + pExpr->iColumn = x; + if( x>pParse->nzVar ){ + char **a; + a = sqlite3DbRealloc(db, pParse->azVar, x*sizeof(a[0])); + if( a==0 ){ + assert( db->mallocFailed ); /* Error reported through mallocFailed */ + return; + } + pParse->azVar = a; + memset(&a[pParse->nzVar], 0, (x-pParse->nzVar)*sizeof(a[0])); + pParse->nzVar = x; + } + if( pParse->azVar[x-1]==0 ){ + pParse->azVar[x-1] = sqlite3DbStrNDup(db, z, n); + } + } + if( pParse->nVar>db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER] ){ + sqlite3ErrorMsg(pParse, "too many SQL variables"); + } +} + +/* +** Recursively delete an expression tree. +*/ +static SQLITE_NOINLINE void sqlite3ExprDeleteNN(sqlite3 *db, Expr *p){ + assert( p!=0 ); + /* Sanity check: Assert that the IntValue is non-negative if it exists */ + assert( !ExprHasProperty(p, EP_IntValue) || p->u.iValue>=0 ); +#ifdef SQLITE_DEBUG + if( ExprHasProperty(p, EP_Leaf) && !ExprHasProperty(p, EP_TokenOnly) ){ + assert( p->pLeft==0 ); + assert( p->pRight==0 ); + assert( p->x.pSelect==0 ); + } +#endif + if( !ExprHasProperty(p, (EP_TokenOnly|EP_Leaf)) ){ + /* The Expr.x union is never used at the same time as Expr.pRight */ + assert( p->x.pList==0 || p->pRight==0 ); + if( p->pLeft && p->op!=TK_SELECT_COLUMN ) sqlite3ExprDeleteNN(db, p->pLeft); + sqlite3ExprDelete(db, p->pRight); + if( ExprHasProperty(p, EP_xIsSelect) ){ + sqlite3SelectDelete(db, p->x.pSelect); + }else{ + sqlite3ExprListDelete(db, p->x.pList); + } + } + if( ExprHasProperty(p, EP_MemToken) ) sqlite3DbFree(db, p->u.zToken); + if( !ExprHasProperty(p, EP_Static) ){ + sqlite3DbFree(db, p); + } +} +SQLITE_PRIVATE void sqlite3ExprDelete(sqlite3 *db, Expr *p){ + if( p ) sqlite3ExprDeleteNN(db, p); +} + +/* +** Return the number of bytes allocated for the expression structure +** passed as the first argument. This is always one of EXPR_FULLSIZE, +** EXPR_REDUCEDSIZE or EXPR_TOKENONLYSIZE. +*/ +static int exprStructSize(Expr *p){ + if( ExprHasProperty(p, EP_TokenOnly) ) return EXPR_TOKENONLYSIZE; + if( ExprHasProperty(p, EP_Reduced) ) return EXPR_REDUCEDSIZE; + return EXPR_FULLSIZE; +} + +/* +** The dupedExpr*Size() routines each return the number of bytes required +** to store a copy of an expression or expression tree. They differ in +** how much of the tree is measured. +** +** dupedExprStructSize() Size of only the Expr structure +** dupedExprNodeSize() Size of Expr + space for token +** dupedExprSize() Expr + token + subtree components +** +*************************************************************************** +** +** The dupedExprStructSize() function returns two values OR-ed together: +** (1) the space required for a copy of the Expr structure only and +** (2) the EP_xxx flags that indicate what the structure size should be. +** The return values is always one of: +** +** EXPR_FULLSIZE +** EXPR_REDUCEDSIZE | EP_Reduced +** EXPR_TOKENONLYSIZE | EP_TokenOnly +** +** The size of the structure can be found by masking the return value +** of this routine with 0xfff. The flags can be found by masking the +** return value with EP_Reduced|EP_TokenOnly. +** +** Note that with flags==EXPRDUP_REDUCE, this routines works on full-size +** (unreduced) Expr objects as they or originally constructed by the parser. +** During expression analysis, extra information is computed and moved into +** later parts of teh Expr object and that extra information might get chopped +** off if the expression is reduced. Note also that it does not work to +** make an EXPRDUP_REDUCE copy of a reduced expression. It is only legal +** to reduce a pristine expression tree from the parser. The implementation +** of dupedExprStructSize() contain multiple assert() statements that attempt +** to enforce this constraint. +*/ +static int dupedExprStructSize(Expr *p, int flags){ + int nSize; + assert( flags==EXPRDUP_REDUCE || flags==0 ); /* Only one flag value allowed */ + assert( EXPR_FULLSIZE<=0xfff ); + assert( (0xfff & (EP_Reduced|EP_TokenOnly))==0 ); + if( 0==flags ){ + nSize = EXPR_FULLSIZE; + }else{ + assert( !ExprHasProperty(p, EP_TokenOnly|EP_Reduced) ); + assert( !ExprHasProperty(p, EP_FromJoin) ); + assert( !ExprHasProperty(p, EP_MemToken) ); + assert( !ExprHasProperty(p, EP_NoReduce) ); + if( p->pLeft || p->x.pList ){ + nSize = EXPR_REDUCEDSIZE | EP_Reduced; + }else{ + assert( p->pRight==0 ); + nSize = EXPR_TOKENONLYSIZE | EP_TokenOnly; + } + } + return nSize; +} + +/* +** This function returns the space in bytes required to store the copy +** of the Expr structure and a copy of the Expr.u.zToken string (if that +** string is defined.) +*/ +static int dupedExprNodeSize(Expr *p, int flags){ + int nByte = dupedExprStructSize(p, flags) & 0xfff; + if( !ExprHasProperty(p, EP_IntValue) && p->u.zToken ){ + nByte += sqlite3Strlen30(p->u.zToken)+1; + } + return ROUND8(nByte); +} + +/* +** Return the number of bytes required to create a duplicate of the +** expression passed as the first argument. The second argument is a +** mask containing EXPRDUP_XXX flags. +** +** The value returned includes space to create a copy of the Expr struct +** itself and the buffer referred to by Expr.u.zToken, if any. +** +** If the EXPRDUP_REDUCE flag is set, then the return value includes +** space to duplicate all Expr nodes in the tree formed by Expr.pLeft +** and Expr.pRight variables (but not for any structures pointed to or +** descended from the Expr.x.pList or Expr.x.pSelect variables). +*/ +static int dupedExprSize(Expr *p, int flags){ + int nByte = 0; + if( p ){ + nByte = dupedExprNodeSize(p, flags); + if( flags&EXPRDUP_REDUCE ){ + nByte += dupedExprSize(p->pLeft, flags) + dupedExprSize(p->pRight, flags); + } + } + return nByte; +} + +/* +** This function is similar to sqlite3ExprDup(), except that if pzBuffer +** is not NULL then *pzBuffer is assumed to point to a buffer large enough +** to store the copy of expression p, the copies of p->u.zToken +** (if applicable), and the copies of the p->pLeft and p->pRight expressions, +** if any. Before returning, *pzBuffer is set to the first byte past the +** portion of the buffer copied into by this function. +*/ +static Expr *exprDup(sqlite3 *db, Expr *p, int dupFlags, u8 **pzBuffer){ + Expr *pNew; /* Value to return */ + u8 *zAlloc; /* Memory space from which to build Expr object */ + u32 staticFlag; /* EP_Static if space not obtained from malloc */ + + assert( db!=0 ); + assert( p ); + assert( dupFlags==0 || dupFlags==EXPRDUP_REDUCE ); + assert( pzBuffer==0 || dupFlags==EXPRDUP_REDUCE ); + + /* Figure out where to write the new Expr structure. */ + if( pzBuffer ){ + zAlloc = *pzBuffer; + staticFlag = EP_Static; + }else{ + zAlloc = sqlite3DbMallocRawNN(db, dupedExprSize(p, dupFlags)); + staticFlag = 0; + } + pNew = (Expr *)zAlloc; + + if( pNew ){ + /* Set nNewSize to the size allocated for the structure pointed to + ** by pNew. This is either EXPR_FULLSIZE, EXPR_REDUCEDSIZE or + ** EXPR_TOKENONLYSIZE. nToken is set to the number of bytes consumed + ** by the copy of the p->u.zToken string (if any). + */ + const unsigned nStructSize = dupedExprStructSize(p, dupFlags); + const int nNewSize = nStructSize & 0xfff; + int nToken; + if( !ExprHasProperty(p, EP_IntValue) && p->u.zToken ){ + nToken = sqlite3Strlen30(p->u.zToken) + 1; + }else{ + nToken = 0; + } + if( dupFlags ){ + assert( ExprHasProperty(p, EP_Reduced)==0 ); + memcpy(zAlloc, p, nNewSize); + }else{ + u32 nSize = (u32)exprStructSize(p); + memcpy(zAlloc, p, nSize); + if( nSizeflags &= ~(EP_Reduced|EP_TokenOnly|EP_Static|EP_MemToken); + pNew->flags |= nStructSize & (EP_Reduced|EP_TokenOnly); + pNew->flags |= staticFlag; + + /* Copy the p->u.zToken string, if any. */ + if( nToken ){ + char *zToken = pNew->u.zToken = (char*)&zAlloc[nNewSize]; + memcpy(zToken, p->u.zToken, nToken); + } + + if( 0==((p->flags|pNew->flags) & (EP_TokenOnly|EP_Leaf)) ){ + /* Fill in the pNew->x.pSelect or pNew->x.pList member. */ + if( ExprHasProperty(p, EP_xIsSelect) ){ + pNew->x.pSelect = sqlite3SelectDup(db, p->x.pSelect, dupFlags); + }else{ + pNew->x.pList = sqlite3ExprListDup(db, p->x.pList, dupFlags); + } + } + + /* Fill in pNew->pLeft and pNew->pRight. */ + if( ExprHasProperty(pNew, EP_Reduced|EP_TokenOnly) ){ + zAlloc += dupedExprNodeSize(p, dupFlags); + if( !ExprHasProperty(pNew, EP_TokenOnly|EP_Leaf) ){ + pNew->pLeft = p->pLeft ? + exprDup(db, p->pLeft, EXPRDUP_REDUCE, &zAlloc) : 0; + pNew->pRight = p->pRight ? + exprDup(db, p->pRight, EXPRDUP_REDUCE, &zAlloc) : 0; + } + if( pzBuffer ){ + *pzBuffer = zAlloc; + } + }else{ + if( !ExprHasProperty(p, EP_TokenOnly|EP_Leaf) ){ + if( pNew->op==TK_SELECT_COLUMN ){ + pNew->pLeft = p->pLeft; + }else{ + pNew->pLeft = sqlite3ExprDup(db, p->pLeft, 0); + } + pNew->pRight = sqlite3ExprDup(db, p->pRight, 0); + } + } + } + return pNew; +} + +/* +** Create and return a deep copy of the object passed as the second +** argument. If an OOM condition is encountered, NULL is returned +** and the db->mallocFailed flag set. +*/ +#ifndef SQLITE_OMIT_CTE +static With *withDup(sqlite3 *db, With *p){ + With *pRet = 0; + if( p ){ + int nByte = sizeof(*p) + sizeof(p->a[0]) * (p->nCte-1); + pRet = sqlite3DbMallocZero(db, nByte); + if( pRet ){ + int i; + pRet->nCte = p->nCte; + for(i=0; inCte; i++){ + pRet->a[i].pSelect = sqlite3SelectDup(db, p->a[i].pSelect, 0); + pRet->a[i].pCols = sqlite3ExprListDup(db, p->a[i].pCols, 0); + pRet->a[i].zName = sqlite3DbStrDup(db, p->a[i].zName); + } + } + } + return pRet; +} +#else +# define withDup(x,y) 0 +#endif + +/* +** The following group of routines make deep copies of expressions, +** expression lists, ID lists, and select statements. The copies can +** be deleted (by being passed to their respective ...Delete() routines) +** without effecting the originals. +** +** The expression list, ID, and source lists return by sqlite3ExprListDup(), +** sqlite3IdListDup(), and sqlite3SrcListDup() can not be further expanded +** by subsequent calls to sqlite*ListAppend() routines. +** +** Any tables that the SrcList might point to are not duplicated. +** +** The flags parameter contains a combination of the EXPRDUP_XXX flags. +** If the EXPRDUP_REDUCE flag is set, then the structure returned is a +** truncated version of the usual Expr structure that will be stored as +** part of the in-memory representation of the database schema. +*/ +SQLITE_PRIVATE Expr *sqlite3ExprDup(sqlite3 *db, Expr *p, int flags){ + assert( flags==0 || flags==EXPRDUP_REDUCE ); + return p ? exprDup(db, p, flags, 0) : 0; +} +SQLITE_PRIVATE ExprList *sqlite3ExprListDup(sqlite3 *db, ExprList *p, int flags){ + ExprList *pNew; + struct ExprList_item *pItem, *pOldItem; + int i; + assert( db!=0 ); + if( p==0 ) return 0; + pNew = sqlite3DbMallocRawNN(db, sizeof(*pNew) ); + if( pNew==0 ) return 0; + pNew->nExpr = i = p->nExpr; + if( (flags & EXPRDUP_REDUCE)==0 ) for(i=1; inExpr; i+=i){} + pNew->a = pItem = sqlite3DbMallocRawNN(db, i*sizeof(p->a[0]) ); + if( pItem==0 ){ + sqlite3DbFree(db, pNew); + return 0; + } + pOldItem = p->a; + for(i=0; inExpr; i++, pItem++, pOldItem++){ + Expr *pOldExpr = pOldItem->pExpr; + pItem->pExpr = sqlite3ExprDup(db, pOldExpr, flags); + pItem->zName = sqlite3DbStrDup(db, pOldItem->zName); + pItem->zSpan = sqlite3DbStrDup(db, pOldItem->zSpan); + pItem->sortOrder = pOldItem->sortOrder; + pItem->done = 0; + pItem->bSpanIsTab = pOldItem->bSpanIsTab; + pItem->u = pOldItem->u; + } + return pNew; +} + +/* +** If cursors, triggers, views and subqueries are all omitted from +** the build, then none of the following routines, except for +** sqlite3SelectDup(), can be called. sqlite3SelectDup() is sometimes +** called with a NULL argument. +*/ +#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_TRIGGER) \ + || !defined(SQLITE_OMIT_SUBQUERY) +SQLITE_PRIVATE SrcList *sqlite3SrcListDup(sqlite3 *db, SrcList *p, int flags){ + SrcList *pNew; + int i; + int nByte; + assert( db!=0 ); + if( p==0 ) return 0; + nByte = sizeof(*p) + (p->nSrc>0 ? sizeof(p->a[0]) * (p->nSrc-1) : 0); + pNew = sqlite3DbMallocRawNN(db, nByte ); + if( pNew==0 ) return 0; + pNew->nSrc = pNew->nAlloc = p->nSrc; + for(i=0; inSrc; i++){ + struct SrcList_item *pNewItem = &pNew->a[i]; + struct SrcList_item *pOldItem = &p->a[i]; + Table *pTab; + pNewItem->pSchema = pOldItem->pSchema; + pNewItem->zDatabase = sqlite3DbStrDup(db, pOldItem->zDatabase); + pNewItem->zName = sqlite3DbStrDup(db, pOldItem->zName); + pNewItem->zAlias = sqlite3DbStrDup(db, pOldItem->zAlias); + pNewItem->fg = pOldItem->fg; + pNewItem->iCursor = pOldItem->iCursor; + pNewItem->addrFillSub = pOldItem->addrFillSub; + pNewItem->regReturn = pOldItem->regReturn; + if( pNewItem->fg.isIndexedBy ){ + pNewItem->u1.zIndexedBy = sqlite3DbStrDup(db, pOldItem->u1.zIndexedBy); + } + pNewItem->pIBIndex = pOldItem->pIBIndex; + if( pNewItem->fg.isTabFunc ){ + pNewItem->u1.pFuncArg = + sqlite3ExprListDup(db, pOldItem->u1.pFuncArg, flags); + } + pTab = pNewItem->pTab = pOldItem->pTab; + if( pTab ){ + pTab->nRef++; + } + pNewItem->pSelect = sqlite3SelectDup(db, pOldItem->pSelect, flags); + pNewItem->pOn = sqlite3ExprDup(db, pOldItem->pOn, flags); + pNewItem->pUsing = sqlite3IdListDup(db, pOldItem->pUsing); + pNewItem->colUsed = pOldItem->colUsed; + } + return pNew; +} +SQLITE_PRIVATE IdList *sqlite3IdListDup(sqlite3 *db, IdList *p){ + IdList *pNew; + int i; + assert( db!=0 ); + if( p==0 ) return 0; + pNew = sqlite3DbMallocRawNN(db, sizeof(*pNew) ); + if( pNew==0 ) return 0; + pNew->nId = p->nId; + pNew->a = sqlite3DbMallocRawNN(db, p->nId*sizeof(p->a[0]) ); + if( pNew->a==0 ){ + sqlite3DbFree(db, pNew); + return 0; + } + /* Note that because the size of the allocation for p->a[] is not + ** necessarily a power of two, sqlite3IdListAppend() may not be called + ** on the duplicate created by this function. */ + for(i=0; inId; i++){ + struct IdList_item *pNewItem = &pNew->a[i]; + struct IdList_item *pOldItem = &p->a[i]; + pNewItem->zName = sqlite3DbStrDup(db, pOldItem->zName); + pNewItem->idx = pOldItem->idx; + } + return pNew; +} +SQLITE_PRIVATE Select *sqlite3SelectDup(sqlite3 *db, Select *p, int flags){ + Select *pNew, *pPrior; + assert( db!=0 ); + if( p==0 ) return 0; + pNew = sqlite3DbMallocRawNN(db, sizeof(*p) ); + if( pNew==0 ) return 0; + pNew->pEList = sqlite3ExprListDup(db, p->pEList, flags); + pNew->pSrc = sqlite3SrcListDup(db, p->pSrc, flags); + pNew->pWhere = sqlite3ExprDup(db, p->pWhere, flags); + pNew->pGroupBy = sqlite3ExprListDup(db, p->pGroupBy, flags); + pNew->pHaving = sqlite3ExprDup(db, p->pHaving, flags); + pNew->pOrderBy = sqlite3ExprListDup(db, p->pOrderBy, flags); + pNew->op = p->op; + pNew->pPrior = pPrior = sqlite3SelectDup(db, p->pPrior, flags); + if( pPrior ) pPrior->pNext = pNew; + pNew->pNext = 0; + pNew->pLimit = sqlite3ExprDup(db, p->pLimit, flags); + pNew->pOffset = sqlite3ExprDup(db, p->pOffset, flags); + pNew->iLimit = 0; + pNew->iOffset = 0; + pNew->selFlags = p->selFlags & ~SF_UsesEphemeral; + pNew->addrOpenEphm[0] = -1; + pNew->addrOpenEphm[1] = -1; + pNew->nSelectRow = p->nSelectRow; + pNew->pWith = withDup(db, p->pWith); + sqlite3SelectSetName(pNew, p->zSelName); + return pNew; +} +#else +SQLITE_PRIVATE Select *sqlite3SelectDup(sqlite3 *db, Select *p, int flags){ + assert( p==0 ); + return 0; +} +#endif + + +/* +** Add a new element to the end of an expression list. If pList is +** initially NULL, then create a new expression list. +** +** If a memory allocation error occurs, the entire list is freed and +** NULL is returned. If non-NULL is returned, then it is guaranteed +** that the new entry was successfully appended. +*/ +SQLITE_PRIVATE ExprList *sqlite3ExprListAppend( + Parse *pParse, /* Parsing context */ + ExprList *pList, /* List to which to append. Might be NULL */ + Expr *pExpr /* Expression to be appended. Might be NULL */ +){ + sqlite3 *db = pParse->db; + assert( db!=0 ); + if( pList==0 ){ + pList = sqlite3DbMallocRawNN(db, sizeof(ExprList) ); + if( pList==0 ){ + goto no_mem; + } + pList->nExpr = 0; + pList->a = sqlite3DbMallocRawNN(db, sizeof(pList->a[0])); + if( pList->a==0 ) goto no_mem; + }else if( (pList->nExpr & (pList->nExpr-1))==0 ){ + struct ExprList_item *a; + assert( pList->nExpr>0 ); + a = sqlite3DbRealloc(db, pList->a, pList->nExpr*2*sizeof(pList->a[0])); + if( a==0 ){ + goto no_mem; + } + pList->a = a; + } + assert( pList->a!=0 ); + if( 1 ){ + struct ExprList_item *pItem = &pList->a[pList->nExpr++]; + memset(pItem, 0, sizeof(*pItem)); + pItem->pExpr = pExpr; + } + return pList; + +no_mem: + /* Avoid leaking memory if malloc has failed. */ + sqlite3ExprDelete(db, pExpr); + sqlite3ExprListDelete(db, pList); + return 0; +} + +/* +** pColumns and pExpr form a vector assignment which is part of the SET +** clause of an UPDATE statement. Like this: +** +** (a,b,c) = (expr1,expr2,expr3) +** Or: (a,b,c) = (SELECT x,y,z FROM ....) +** +** For each term of the vector assignment, append new entries to the +** expression list pList. In the case of a subquery on the LHS, append +** TK_SELECT_COLUMN expressions. +*/ +SQLITE_PRIVATE ExprList *sqlite3ExprListAppendVector( + Parse *pParse, /* Parsing context */ + ExprList *pList, /* List to which to append. Might be NULL */ + IdList *pColumns, /* List of names of LHS of the assignment */ + Expr *pExpr /* Vector expression to be appended. Might be NULL */ +){ + sqlite3 *db = pParse->db; + int n; + int i; + int iFirst = pList ? pList->nExpr : 0; + /* pColumns can only be NULL due to an OOM but an OOM will cause an + ** exit prior to this routine being invoked */ + if( NEVER(pColumns==0) ) goto vector_append_error; + if( pExpr==0 ) goto vector_append_error; + n = sqlite3ExprVectorSize(pExpr); + if( pColumns->nId!=n ){ + sqlite3ErrorMsg(pParse, "%d columns assigned %d values", + pColumns->nId, n); + goto vector_append_error; + } + for(i=0; inExpr==iFirst+i+1 ); + pList->a[pList->nExpr-1].zName = pColumns->a[i].zName; + pColumns->a[i].zName = 0; + } + } + if( pExpr->op==TK_SELECT ){ + if( pList && pList->a[iFirst].pExpr ){ + assert( pList->a[iFirst].pExpr->op==TK_SELECT_COLUMN ); + pList->a[iFirst].pExpr->pRight = pExpr; + pExpr = 0; + } + } + +vector_append_error: + sqlite3ExprDelete(db, pExpr); + sqlite3IdListDelete(db, pColumns); + return pList; +} + +/* +** Set the sort order for the last element on the given ExprList. +*/ +SQLITE_PRIVATE void sqlite3ExprListSetSortOrder(ExprList *p, int iSortOrder){ + if( p==0 ) return; + assert( SQLITE_SO_UNDEFINED<0 && SQLITE_SO_ASC>=0 && SQLITE_SO_DESC>0 ); + assert( p->nExpr>0 ); + if( iSortOrder<0 ){ + assert( p->a[p->nExpr-1].sortOrder==SQLITE_SO_ASC ); + return; + } + p->a[p->nExpr-1].sortOrder = (u8)iSortOrder; +} + +/* +** Set the ExprList.a[].zName element of the most recently added item +** on the expression list. +** +** pList might be NULL following an OOM error. But pName should never be +** NULL. If a memory allocation fails, the pParse->db->mallocFailed flag +** is set. +*/ +SQLITE_PRIVATE void sqlite3ExprListSetName( + Parse *pParse, /* Parsing context */ + ExprList *pList, /* List to which to add the span. */ + Token *pName, /* Name to be added */ + int dequote /* True to cause the name to be dequoted */ +){ + assert( pList!=0 || pParse->db->mallocFailed!=0 ); + if( pList ){ + struct ExprList_item *pItem; + assert( pList->nExpr>0 ); + pItem = &pList->a[pList->nExpr-1]; + assert( pItem->zName==0 ); + pItem->zName = sqlite3DbStrNDup(pParse->db, pName->z, pName->n); + if( dequote ) sqlite3Dequote(pItem->zName); + } +} + +/* +** Set the ExprList.a[].zSpan element of the most recently added item +** on the expression list. +** +** pList might be NULL following an OOM error. But pSpan should never be +** NULL. If a memory allocation fails, the pParse->db->mallocFailed flag +** is set. +*/ +SQLITE_PRIVATE void sqlite3ExprListSetSpan( + Parse *pParse, /* Parsing context */ + ExprList *pList, /* List to which to add the span. */ + ExprSpan *pSpan /* The span to be added */ +){ + sqlite3 *db = pParse->db; + assert( pList!=0 || db->mallocFailed!=0 ); + if( pList ){ + struct ExprList_item *pItem = &pList->a[pList->nExpr-1]; + assert( pList->nExpr>0 ); + assert( db->mallocFailed || pItem->pExpr==pSpan->pExpr ); + sqlite3DbFree(db, pItem->zSpan); + pItem->zSpan = sqlite3DbStrNDup(db, (char*)pSpan->zStart, + (int)(pSpan->zEnd - pSpan->zStart)); + } +} + +/* +** If the expression list pEList contains more than iLimit elements, +** leave an error message in pParse. +*/ +SQLITE_PRIVATE void sqlite3ExprListCheckLength( + Parse *pParse, + ExprList *pEList, + const char *zObject +){ + int mx = pParse->db->aLimit[SQLITE_LIMIT_COLUMN]; + testcase( pEList && pEList->nExpr==mx ); + testcase( pEList && pEList->nExpr==mx+1 ); + if( pEList && pEList->nExpr>mx ){ + sqlite3ErrorMsg(pParse, "too many columns in %s", zObject); + } +} + +/* +** Delete an entire expression list. +*/ +static SQLITE_NOINLINE void exprListDeleteNN(sqlite3 *db, ExprList *pList){ + int i; + struct ExprList_item *pItem; + assert( pList->a!=0 || pList->nExpr==0 ); + for(pItem=pList->a, i=0; inExpr; i++, pItem++){ + sqlite3ExprDelete(db, pItem->pExpr); + sqlite3DbFree(db, pItem->zName); + sqlite3DbFree(db, pItem->zSpan); + } + sqlite3DbFree(db, pList->a); + sqlite3DbFree(db, pList); +} +SQLITE_PRIVATE void sqlite3ExprListDelete(sqlite3 *db, ExprList *pList){ + if( pList ) exprListDeleteNN(db, pList); +} + +/* +** Return the bitwise-OR of all Expr.flags fields in the given +** ExprList. +*/ +SQLITE_PRIVATE u32 sqlite3ExprListFlags(const ExprList *pList){ + int i; + u32 m = 0; + if( pList ){ + for(i=0; inExpr; i++){ + Expr *pExpr = pList->a[i].pExpr; + assert( pExpr!=0 ); + m |= pExpr->flags; + } + } + return m; +} + +/* +** These routines are Walker callbacks used to check expressions to +** see if they are "constant" for some definition of constant. The +** Walker.eCode value determines the type of "constant" we are looking +** for. +** +** These callback routines are used to implement the following: +** +** sqlite3ExprIsConstant() pWalker->eCode==1 +** sqlite3ExprIsConstantNotJoin() pWalker->eCode==2 +** sqlite3ExprIsTableConstant() pWalker->eCode==3 +** sqlite3ExprIsConstantOrFunction() pWalker->eCode==4 or 5 +** +** In all cases, the callbacks set Walker.eCode=0 and abort if the expression +** is found to not be a constant. +** +** The sqlite3ExprIsConstantOrFunction() is used for evaluating expressions +** in a CREATE TABLE statement. The Walker.eCode value is 5 when parsing +** an existing schema and 4 when processing a new statement. A bound +** parameter raises an error for new statements, but is silently converted +** to NULL for existing schemas. This allows sqlite_master tables that +** contain a bound parameter because they were generated by older versions +** of SQLite to be parsed by newer versions of SQLite without raising a +** malformed schema error. +*/ +static int exprNodeIsConstant(Walker *pWalker, Expr *pExpr){ + + /* If pWalker->eCode is 2 then any term of the expression that comes from + ** the ON or USING clauses of a left join disqualifies the expression + ** from being considered constant. */ + if( pWalker->eCode==2 && ExprHasProperty(pExpr, EP_FromJoin) ){ + pWalker->eCode = 0; + return WRC_Abort; + } + + switch( pExpr->op ){ + /* Consider functions to be constant if all their arguments are constant + ** and either pWalker->eCode==4 or 5 or the function has the + ** SQLITE_FUNC_CONST flag. */ + case TK_FUNCTION: + if( pWalker->eCode>=4 || ExprHasProperty(pExpr,EP_ConstFunc) ){ + return WRC_Continue; + }else{ + pWalker->eCode = 0; + return WRC_Abort; + } + case TK_ID: + case TK_COLUMN: + case TK_AGG_FUNCTION: + case TK_AGG_COLUMN: + testcase( pExpr->op==TK_ID ); + testcase( pExpr->op==TK_COLUMN ); + testcase( pExpr->op==TK_AGG_FUNCTION ); + testcase( pExpr->op==TK_AGG_COLUMN ); + if( pWalker->eCode==3 && pExpr->iTable==pWalker->u.iCur ){ + return WRC_Continue; + }else{ + pWalker->eCode = 0; + return WRC_Abort; + } + case TK_VARIABLE: + if( pWalker->eCode==5 ){ + /* Silently convert bound parameters that appear inside of CREATE + ** statements into a NULL when parsing the CREATE statement text out + ** of the sqlite_master table */ + pExpr->op = TK_NULL; + }else if( pWalker->eCode==4 ){ + /* A bound parameter in a CREATE statement that originates from + ** sqlite3_prepare() causes an error */ + pWalker->eCode = 0; + return WRC_Abort; + } + /* Fall through */ + default: + testcase( pExpr->op==TK_SELECT ); /* selectNodeIsConstant will disallow */ + testcase( pExpr->op==TK_EXISTS ); /* selectNodeIsConstant will disallow */ + return WRC_Continue; + } +} +static int selectNodeIsConstant(Walker *pWalker, Select *NotUsed){ + UNUSED_PARAMETER(NotUsed); + pWalker->eCode = 0; + return WRC_Abort; +} +static int exprIsConst(Expr *p, int initFlag, int iCur){ + Walker w; + memset(&w, 0, sizeof(w)); + w.eCode = initFlag; + w.xExprCallback = exprNodeIsConstant; + w.xSelectCallback = selectNodeIsConstant; + w.u.iCur = iCur; + sqlite3WalkExpr(&w, p); + return w.eCode; +} + +/* +** Walk an expression tree. Return non-zero if the expression is constant +** and 0 if it involves variables or function calls. +** +** For the purposes of this function, a double-quoted string (ex: "abc") +** is considered a variable but a single-quoted string (ex: 'abc') is +** a constant. +*/ +SQLITE_PRIVATE int sqlite3ExprIsConstant(Expr *p){ + return exprIsConst(p, 1, 0); +} + +/* +** Walk an expression tree. Return non-zero if the expression is constant +** that does no originate from the ON or USING clauses of a join. +** Return 0 if it involves variables or function calls or terms from +** an ON or USING clause. +*/ +SQLITE_PRIVATE int sqlite3ExprIsConstantNotJoin(Expr *p){ + return exprIsConst(p, 2, 0); +} + +/* +** Walk an expression tree. Return non-zero if the expression is constant +** for any single row of the table with cursor iCur. In other words, the +** expression must not refer to any non-deterministic function nor any +** table other than iCur. +*/ +SQLITE_PRIVATE int sqlite3ExprIsTableConstant(Expr *p, int iCur){ + return exprIsConst(p, 3, iCur); +} + +/* +** Walk an expression tree. Return non-zero if the expression is constant +** or a function call with constant arguments. Return and 0 if there +** are any variables. +** +** For the purposes of this function, a double-quoted string (ex: "abc") +** is considered a variable but a single-quoted string (ex: 'abc') is +** a constant. +*/ +SQLITE_PRIVATE int sqlite3ExprIsConstantOrFunction(Expr *p, u8 isInit){ + assert( isInit==0 || isInit==1 ); + return exprIsConst(p, 4+isInit, 0); +} + +#ifdef SQLITE_ENABLE_CURSOR_HINTS +/* +** Walk an expression tree. Return 1 if the expression contains a +** subquery of some kind. Return 0 if there are no subqueries. +*/ +SQLITE_PRIVATE int sqlite3ExprContainsSubquery(Expr *p){ + Walker w; + memset(&w, 0, sizeof(w)); + w.eCode = 1; + w.xExprCallback = sqlite3ExprWalkNoop; + w.xSelectCallback = selectNodeIsConstant; + sqlite3WalkExpr(&w, p); + return w.eCode==0; +} +#endif + +/* +** If the expression p codes a constant integer that is small enough +** to fit in a 32-bit integer, return 1 and put the value of the integer +** in *pValue. If the expression is not an integer or if it is too big +** to fit in a signed 32-bit integer, return 0 and leave *pValue unchanged. +*/ +SQLITE_PRIVATE int sqlite3ExprIsInteger(Expr *p, int *pValue){ + int rc = 0; + + /* If an expression is an integer literal that fits in a signed 32-bit + ** integer, then the EP_IntValue flag will have already been set */ + assert( p->op!=TK_INTEGER || (p->flags & EP_IntValue)!=0 + || sqlite3GetInt32(p->u.zToken, &rc)==0 ); + + if( p->flags & EP_IntValue ){ + *pValue = p->u.iValue; + return 1; + } + switch( p->op ){ + case TK_UPLUS: { + rc = sqlite3ExprIsInteger(p->pLeft, pValue); + break; + } + case TK_UMINUS: { + int v; + if( sqlite3ExprIsInteger(p->pLeft, &v) ){ + assert( v!=(-2147483647-1) ); + *pValue = -v; + rc = 1; + } + break; + } + default: break; + } + 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; + case TK_COLUMN: + assert( p->pTab!=0 ); + return ExprHasProperty(p, EP_CanBeNull) || + (p->iColumn>=0 && p->pTab->aCol[p->iColumn].notNull==0); + default: + return 1; + } +} + +/* +** 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_BLOB ) 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. +*/ +SQLITE_PRIVATE int sqlite3IsRowid(const char *z){ + if( sqlite3StrICmp(z, "_ROWID_")==0 ) return 1; + if( sqlite3StrICmp(z, "ROWID")==0 ) return 1; + if( sqlite3StrICmp(z, "OID")==0 ) return 1; + return 0; +} + +/* +** pX is the RHS of an IN operator. If pX is a SELECT statement +** that can be simplified to a direct table access, then return +** a pointer to the SELECT statement. If pX is not a SELECT statement, +** or if the SELECT statement needs to be manifested into a transient +** table, then return NULL. +*/ +#ifndef SQLITE_OMIT_SUBQUERY +static Select *isCandidateForInOpt(Expr *pX){ + Select *p; + SrcList *pSrc; + ExprList *pEList; + Table *pTab; + int i; + if( !ExprHasProperty(pX, EP_xIsSelect) ) return 0; /* Not a subquery */ + if( ExprHasProperty(pX, EP_VarSelect) ) return 0; /* Correlated subq */ + p = pX->x.pSelect; + if( p->pPrior ) return 0; /* Not a compound SELECT */ + if( p->selFlags & (SF_Distinct|SF_Aggregate) ){ + testcase( (p->selFlags & (SF_Distinct|SF_Aggregate))==SF_Distinct ); + testcase( (p->selFlags & (SF_Distinct|SF_Aggregate))==SF_Aggregate ); + return 0; /* No DISTINCT keyword and no aggregate functions */ + } + assert( p->pGroupBy==0 ); /* Has no GROUP BY clause */ + if( p->pLimit ) return 0; /* Has no LIMIT clause */ + assert( p->pOffset==0 ); /* No LIMIT means no OFFSET */ + if( p->pWhere ) return 0; /* Has no WHERE clause */ + pSrc = p->pSrc; + assert( pSrc!=0 ); + if( pSrc->nSrc!=1 ) return 0; /* Single term in FROM clause */ + if( pSrc->a[0].pSelect ) return 0; /* FROM is not a subquery or view */ + pTab = pSrc->a[0].pTab; + assert( pTab!=0 ); + assert( pTab->pSelect==0 ); /* FROM clause is not a view */ + if( IsVirtual(pTab) ) return 0; /* FROM clause not a virtual table */ + pEList = p->pEList; + assert( pEList!=0 ); + /* All SELECT results must be columns. */ + for(i=0; inExpr; i++){ + Expr *pRes = pEList->a[i].pExpr; + if( pRes->op!=TK_COLUMN ) return 0; + assert( pRes->iTable==pSrc->a[0].iCursor ); /* Not a correlated subquery */ + } + return p; +} +#endif /* SQLITE_OMIT_SUBQUERY */ + +#ifndef SQLITE_OMIT_SUBQUERY +/* +** Generate code that checks the left-most column of index table iCur to see if +** it contains any NULL entries. Cause the register at regHasNull to be set +** to a non-NULL value if iCur contains no NULLs. Cause register regHasNull +** to be set to NULL if iCur contains one or more NULL values. +*/ +static void sqlite3SetHasNullFlag(Vdbe *v, int iCur, int regHasNull){ + int addr1; + sqlite3VdbeAddOp2(v, OP_Integer, 0, regHasNull); + addr1 = sqlite3VdbeAddOp1(v, OP_Rewind, iCur); VdbeCoverage(v); + sqlite3VdbeAddOp3(v, OP_Column, iCur, 0, regHasNull); + sqlite3VdbeChangeP5(v, OPFLAG_TYPEOFARG); + VdbeComment((v, "first_entry_in(%d)", iCur)); + sqlite3VdbeJumpHere(v, addr1); +} +#endif + + +#ifndef SQLITE_OMIT_SUBQUERY +/* +** The argument is an IN operator with a list (not a subquery) on the +** right-hand side. Return TRUE if that list is constant. +*/ +static int sqlite3InRhsIsConstant(Expr *pIn){ + Expr *pLHS; + int res; + assert( !ExprHasProperty(pIn, EP_xIsSelect) ); + pLHS = pIn->pLeft; + pIn->pLeft = 0; + res = sqlite3ExprIsConstant(pIn); + pIn->pLeft = pLHS; + return res; +} +#endif + +/* +** This function is used by the implementation of the IN (...) operator. +** The pX parameter is the expression on the RHS of the IN operator, which +** might be either a list of expressions or a subquery. +** +** The job of this routine is to find or create a b-tree object that can +** be used either to test for membership in the RHS set or to iterate through +** all members of the RHS set, skipping duplicates. +** +** A cursor is opened on the b-tree object that is the RHS of the IN operator +** and pX->iTable is set to the index of that cursor. +** +** The returned value of this function indicates the b-tree type, as follows: +** +** IN_INDEX_ROWID - The cursor was opened on a database table. +** IN_INDEX_INDEX_ASC - The cursor was opened on an ascending index. +** IN_INDEX_INDEX_DESC - The cursor was opened on a descending index. +** IN_INDEX_EPH - The cursor was opened on a specially created and +** populated epheremal table. +** IN_INDEX_NOOP - No cursor was allocated. The IN operator must be +** implemented as a sequence of comparisons. +** +** An existing b-tree might be used if the RHS expression pX is a simple +** subquery such as: +** +** SELECT , ... FROM +** +** If the RHS of the IN operator is a list or a more complex subquery, then +** an ephemeral table might need to be generated from the RHS and then +** pX->iTable made to point to the ephemeral table instead of an +** existing table. +** +** The inFlags parameter must contain exactly one of the bits +** IN_INDEX_MEMBERSHIP or IN_INDEX_LOOP. If inFlags contains +** IN_INDEX_MEMBERSHIP, then the generated table will be used for a +** fast membership test. When the IN_INDEX_LOOP bit is set, the +** IN index will be used to loop over all values of the RHS of the +** IN operator. +** +** When IN_INDEX_LOOP is used (and the b-tree will be used to iterate +** through the set members) then the b-tree must not contain duplicates. +** An epheremal table must be used unless the selected columns are guaranteed +** to be unique - either because it is an INTEGER PRIMARY KEY or due to +** a UNIQUE constraint or index. +** +** When IN_INDEX_MEMBERSHIP is used (and the b-tree will be used +** for fast set membership tests) then an epheremal table must +** be used unless is a single INTEGER PRIMARY KEY column or an +** index can be found with the specified as its left-most. +** +** If the IN_INDEX_NOOP_OK and IN_INDEX_MEMBERSHIP are both set and +** if the RHS of the IN operator is a list (not a subquery) then this +** routine might decide that creating an ephemeral b-tree for membership +** testing is too expensive and return IN_INDEX_NOOP. In that case, the +** calling routine should implement the IN operator using a sequence +** of Eq or Ne comparison operations. +** +** When the b-tree is being used for membership tests, the calling function +** might need to know whether or not the RHS side of the IN operator +** contains a NULL. If prRhsHasNull is not a NULL pointer and +** 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 *prRhsHasNull. If there is no chance that the (...) contains a +** NULL value, then *prRhsHasNull is left unchanged. +** +** If a register is allocated and its location stored in *prRhsHasNull, then +** the value in that register will be NULL if the b-tree contains one or more +** NULL values, and it will be some non-NULL value if the b-tree contains no +** NULL values. +** +** If the aiMap parameter is not NULL, it must point to an array containing +** one element for each column returned by the SELECT statement on the RHS +** of the IN(...) operator. The i'th entry of the array is populated with the +** offset of the index column that matches the i'th column returned by the +** SELECT. For example, if the expression and selected index are: +** +** (?,?,?) IN (SELECT a, b, c FROM t1) +** CREATE INDEX i1 ON t1(b, c, a); +** +** then aiMap[] is populated with {2, 0, 1}. +*/ +#ifndef SQLITE_OMIT_SUBQUERY +SQLITE_PRIVATE int sqlite3FindInIndex( + Parse *pParse, /* Parsing context */ + Expr *pX, /* The right-hand side (RHS) of the IN operator */ + u32 inFlags, /* IN_INDEX_LOOP, _MEMBERSHIP, and/or _NOOP_OK */ + int *prRhsHasNull, /* Register holding NULL status. See notes */ + int *aiMap /* Mapping from Index fields to RHS fields */ +){ + Select *p; /* SELECT to the right of IN operator */ + int eType = 0; /* Type of RHS table. IN_INDEX_* */ + int iTab = pParse->nTab++; /* Cursor of the RHS table */ + int mustBeUnique; /* True if RHS must be unique */ + Vdbe *v = sqlite3GetVdbe(pParse); /* Virtual machine being coded */ + + assert( pX->op==TK_IN ); + mustBeUnique = (inFlags & IN_INDEX_LOOP)!=0; + + /* If the RHS of this IN(...) operator is a SELECT, and if it matters + ** whether or not the SELECT result contains NULL values, check whether + ** or not NULL is actually possible (it may not be, for example, due + ** to NOT NULL constraints in the schema). If no NULL values are possible, + ** set prRhsHasNull to 0 before continuing. */ + if( prRhsHasNull && (pX->flags & EP_xIsSelect) ){ + int i; + ExprList *pEList = pX->x.pSelect->pEList; + for(i=0; inExpr; i++){ + if( sqlite3ExprCanBeNull(pEList->a[i].pExpr) ) break; + } + if( i==pEList->nExpr ){ + prRhsHasNull = 0; + } + } + + /* 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. */ + if( pParse->nErr==0 && (p = isCandidateForInOpt(pX))!=0 ){ + sqlite3 *db = pParse->db; /* Database connection */ + Table *pTab; /* Table
      . */ + i16 iDb; /* Database idx for pTab */ + ExprList *pEList = p->pEList; + int nExpr = pEList->nExpr; + + assert( p->pEList!=0 ); /* Because of isCandidateForInOpt(p) */ + assert( p->pEList->a[0].pExpr!=0 ); /* Because of isCandidateForInOpt(p) */ + assert( p->pSrc!=0 ); /* Because of isCandidateForInOpt(p) */ + pTab = p->pSrc->a[0].pTab; + + /* Code an OP_Transaction and OP_TableLock for
      . */ + iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + sqlite3CodeVerifySchema(pParse, iDb); + sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName); + + assert(v); /* sqlite3GetVdbe() has always been previously called */ + if( nExpr==1 && pEList->a[0].pExpr->iColumn<0 ){ + /* The "x IN (SELECT rowid FROM table)" case */ + int iAddr = sqlite3VdbeAddOp0(v, OP_Once); + VdbeCoverage(v); + + sqlite3OpenTable(pParse, iTab, iDb, pTab, OP_OpenRead); + eType = IN_INDEX_ROWID; + + sqlite3VdbeJumpHere(v, iAddr); + }else{ + Index *pIdx; /* Iterator variable */ + int affinity_ok = 1; + int i; + + /* Check that the affinity that will be used to perform each + ** comparison is the same as the affinity of each column in table + ** on the RHS of the IN operator. If it not, it is not possible to + ** use any index of the RHS table. */ + for(i=0; ipLeft, i); + int iCol = pEList->a[i].pExpr->iColumn; + char idxaff = sqlite3TableColumnAffinity(pTab,iCol); /* RHS table */ + char cmpaff = sqlite3CompareAffinity(pLhs, idxaff); + testcase( cmpaff==SQLITE_AFF_BLOB ); + testcase( cmpaff==SQLITE_AFF_TEXT ); + switch( cmpaff ){ + case SQLITE_AFF_BLOB: + break; + case SQLITE_AFF_TEXT: + /* sqlite3CompareAffinity() only returns TEXT if one side or the + ** other has no affinity and the other side is TEXT. Hence, + ** the only way for cmpaff to be TEXT is for idxaff to be TEXT + ** and for the term on the LHS of the IN to have no affinity. */ + assert( idxaff==SQLITE_AFF_TEXT ); + break; + default: + affinity_ok = sqlite3IsNumericAffinity(idxaff); + } + } + + if( affinity_ok ){ + /* Search for an existing index that will work for this IN operator */ + for(pIdx=pTab->pIndex; pIdx && eType==0; pIdx=pIdx->pNext){ + Bitmask colUsed; /* Columns of the index used */ + Bitmask mCol; /* Mask for the current column */ + if( pIdx->nColumnnColumn==BMS-2 ); + testcase( pIdx->nColumn==BMS-1 ); + if( pIdx->nColumn>=BMS-1 ) continue; + if( mustBeUnique ){ + if( pIdx->nKeyCol>nExpr + ||(pIdx->nColumn>nExpr && !IsUniqueIndex(pIdx)) + ){ + continue; /* This index is not unique over the IN RHS columns */ + } + } + + colUsed = 0; /* Columns of index used so far */ + for(i=0; ipLeft, i); + Expr *pRhs = pEList->a[i].pExpr; + CollSeq *pReq = sqlite3BinaryCompareCollSeq(pParse, pLhs, pRhs); + int j; + + assert( pReq!=0 || pRhs->iColumn==XN_ROWID || pParse->nErr ); + for(j=0; jaiColumn[j]!=pRhs->iColumn ) continue; + assert( pIdx->azColl[j] ); + if( pReq!=0 && sqlite3StrICmp(pReq->zName, pIdx->azColl[j])!=0 ){ + continue; + } + break; + } + if( j==nExpr ) break; + mCol = MASKBIT(j); + if( mCol & colUsed ) break; /* Each column used only once */ + colUsed |= mCol; + if( aiMap ) aiMap[i] = j; + } + + assert( i==nExpr || colUsed!=(MASKBIT(nExpr)-1) ); + if( colUsed==(MASKBIT(nExpr)-1) ){ + /* If we reach this point, that means the index pIdx is usable */ + int iAddr = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); +#ifndef SQLITE_OMIT_EXPLAIN + sqlite3VdbeAddOp4(v, OP_Explain, 0, 0, 0, + sqlite3MPrintf(db, "USING INDEX %s FOR IN-OPERATOR",pIdx->zName), + P4_DYNAMIC); +#endif + sqlite3VdbeAddOp3(v, OP_OpenRead, iTab, pIdx->tnum, iDb); + sqlite3VdbeSetP4KeyInfo(pParse, pIdx); + VdbeComment((v, "%s", pIdx->zName)); + assert( IN_INDEX_INDEX_DESC == IN_INDEX_INDEX_ASC+1 ); + eType = IN_INDEX_INDEX_ASC + pIdx->aSortOrder[0]; + + if( prRhsHasNull ){ +#ifdef SQLITE_ENABLE_COLUMN_USED_MASK + i64 mask = (1<nMem; + if( nExpr==1 ){ + sqlite3SetHasNullFlag(v, iTab, *prRhsHasNull); + } + } + sqlite3VdbeJumpHere(v, iAddr); + } + } /* End loop over indexes */ + } /* End if( affinity_ok ) */ + } /* End if not an rowid index */ + } /* End attempt to optimize using an index */ + + /* If no preexisting index is available for the IN clause + ** and IN_INDEX_NOOP is an allowed reply + ** and the RHS of the IN operator is a list, not a subquery + ** and the RHS is not constant or has two or fewer terms, + ** then it is not worth creating an ephemeral table to evaluate + ** the IN operator so return IN_INDEX_NOOP. + */ + if( eType==0 + && (inFlags & IN_INDEX_NOOP_OK) + && !ExprHasProperty(pX, EP_xIsSelect) + && (!sqlite3InRhsIsConstant(pX) || pX->x.pList->nExpr<=2) + ){ + eType = IN_INDEX_NOOP; + } + + if( eType==0 ){ + /* Could not find an existing table or index to use as the RHS b-tree. + ** We will have to generate an ephemeral table to do the job. + */ + u32 savedNQueryLoop = pParse->nQueryLoop; + int rMayHaveNull = 0; + eType = IN_INDEX_EPH; + if( inFlags & IN_INDEX_LOOP ){ + pParse->nQueryLoop = 0; + if( pX->pLeft->iColumn<0 && !ExprHasProperty(pX, EP_xIsSelect) ){ + eType = IN_INDEX_ROWID; + } + }else if( prRhsHasNull ){ + *prRhsHasNull = rMayHaveNull = ++pParse->nMem; + } + sqlite3CodeSubselect(pParse, pX, rMayHaveNull, eType==IN_INDEX_ROWID); + pParse->nQueryLoop = savedNQueryLoop; + }else{ + pX->iTable = iTab; + } + + if( aiMap && eType!=IN_INDEX_INDEX_ASC && eType!=IN_INDEX_INDEX_DESC ){ + int i, n; + n = sqlite3ExprVectorSize(pX->pLeft); + for(i=0; ipLeft; + int nVal = sqlite3ExprVectorSize(pLeft); + Select *pSelect = (pExpr->flags & EP_xIsSelect) ? pExpr->x.pSelect : 0; + char *zRet; + + assert( pExpr->op==TK_IN ); + zRet = sqlite3DbMallocZero(pParse->db, nVal+1); + if( zRet ){ + int i; + for(i=0; ipEList->a[i].pExpr, a); + }else{ + zRet[i] = a; + } + } + zRet[nVal] = '\0'; + } + return zRet; +} +#endif + +#ifndef SQLITE_OMIT_SUBQUERY +/* +** Load the Parse object passed as the first argument with an error +** message of the form: +** +** "sub-select returns N columns - expected M" +*/ +SQLITE_PRIVATE void sqlite3SubselectError(Parse *pParse, int nActual, int nExpect){ + const char *zFmt = "sub-select returns %d columns - expected %d"; + sqlite3ErrorMsg(pParse, zFmt, nActual, nExpect); +} +#endif + +/* +** Generate code for scalar subqueries used as a subquery expression, EXISTS, +** or IN operators. Examples: +** +** (SELECT a FROM b) -- subquery +** EXISTS (SELECT a FROM b) -- EXISTS subquery +** x IN (4,5,11) -- IN operator with list on right-hand side +** x IN (SELECT a FROM b) -- IN operator with subquery on the right +** +** The pExpr parameter describes the expression that contains the IN +** operator or subquery. +** +** If parameter isRowid is non-zero, then expression pExpr is guaranteed +** to be of the form " IN (?, ?, ?)", where is a reference +** to some integer key column of a table B-Tree. In this case, use an +** intkey B-Tree to store the set of IN(...) values instead of the usual +** (slower) variable length keys B-Tree. +** +** If rMayHaveNull is non-zero, that means that the operation is an IN +** (not a SELECT or EXISTS) and that the RHS might contains NULLs. +** All this routine does is initialize the register given by rMayHaveNull +** to NULL. Calling routines will take care of changing this register +** value to non-NULL if the RHS is NULL-free. +** +** For a SELECT or EXISTS operator, return the register that holds the +** result. For a multi-column SELECT, the result is stored in a contiguous +** array of registers and the return value is the register of the left-most +** result column. Return 0 for IN operators or if an error occurs. +*/ +#ifndef SQLITE_OMIT_SUBQUERY +SQLITE_PRIVATE int sqlite3CodeSubselect( + Parse *pParse, /* Parsing context */ + Expr *pExpr, /* The IN, SELECT, or EXISTS operator */ + int rHasNullFlag, /* Register that records whether NULLs exist in RHS */ + int isRowid /* If true, LHS of IN operator is a rowid */ +){ + int jmpIfDynamic = -1; /* One-time test address */ + int rReg = 0; /* Register storing resulting */ + Vdbe *v = sqlite3GetVdbe(pParse); + if( NEVER(v==0) ) return 0; + sqlite3ExprCachePush(pParse); + + /* The evaluation of the IN/EXISTS/SELECT must be repeated every time it + ** is encountered if any of the following is true: + ** + ** * The right-hand side is a correlated subquery + ** * The right-hand side is an expression list containing variables + ** * We are inside a trigger + ** + ** If all of the above are false, then we can run this code just once + ** save the results, and reuse the same result on subsequent invocations. + */ + if( !ExprHasProperty(pExpr, EP_VarSelect) ){ + jmpIfDynamic = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); + } + +#ifndef SQLITE_OMIT_EXPLAIN + if( pParse->explain==2 ){ + char *zMsg = sqlite3MPrintf(pParse->db, "EXECUTE %s%s SUBQUERY %d", + jmpIfDynamic>=0?"":"CORRELATED ", + pExpr->op==TK_IN?"LIST":"SCALAR", + pParse->iNextSelectId + ); + sqlite3VdbeAddOp4(v, OP_Explain, pParse->iSelectId, 0, 0, zMsg, P4_DYNAMIC); + } +#endif + + switch( pExpr->op ){ + case TK_IN: { + int addr; /* Address of OP_OpenEphemeral instruction */ + Expr *pLeft = pExpr->pLeft; /* the LHS of the IN operator */ + KeyInfo *pKeyInfo = 0; /* Key information */ + int nVal; /* Size of vector pLeft */ + + nVal = sqlite3ExprVectorSize(pLeft); + assert( !isRowid || nVal==1 ); + + /* Whether this is an 'x IN(SELECT...)' or an 'x IN()' + ** expression it is handled the same way. An ephemeral table is + ** filled with index keys representing the results from the + ** SELECT or the . + ** + ** If the 'x' expression is a column value, or the SELECT... + ** statement returns a column value, then the affinity of that + ** column is used to build the index keys. If both 'x' and the + ** SELECT... statement are columns, then numeric affinity is used + ** if either column has NUMERIC or INTEGER affinity. If neither + ** 'x' nor the SELECT... statement are columns, then numeric affinity + ** is used. + */ + pExpr->iTable = pParse->nTab++; + addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, + pExpr->iTable, (isRowid?0:nVal)); + pKeyInfo = isRowid ? 0 : sqlite3KeyInfoAlloc(pParse->db, nVal, 1); + + if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + /* Case 1: expr IN (SELECT ...) + ** + ** Generate code to write the results of the select into the temporary + ** table allocated and opened above. + */ + Select *pSelect = pExpr->x.pSelect; + ExprList *pEList = pSelect->pEList; + + assert( !isRowid ); + /* If the LHS and RHS of the IN operator do not match, that + ** error will have been caught long before we reach this point. */ + if( ALWAYS(pEList->nExpr==nVal) ){ + SelectDest dest; + int i; + sqlite3SelectDestInit(&dest, SRT_Set, pExpr->iTable); + dest.zAffSdst = exprINAffinity(pParse, pExpr); + assert( (pExpr->iTable&0x0000FFFF)==pExpr->iTable ); + pSelect->iLimit = 0; + testcase( pSelect->selFlags & SF_Distinct ); + testcase( pKeyInfo==0 ); /* Caused by OOM in sqlite3KeyInfoAlloc() */ + if( sqlite3Select(pParse, pSelect, &dest) ){ + sqlite3DbFree(pParse->db, dest.zAffSdst); + sqlite3KeyInfoUnref(pKeyInfo); + return 0; + } + sqlite3DbFree(pParse->db, dest.zAffSdst); + assert( pKeyInfo!=0 ); /* OOM will cause exit after sqlite3Select() */ + assert( pEList!=0 ); + assert( pEList->nExpr>0 ); + assert( sqlite3KeyInfoIsWriteable(pKeyInfo) ); + for(i=0; iaColl[i] = sqlite3BinaryCompareCollSeq( + pParse, p, pEList->a[i].pExpr + ); + } + } + }else if( ALWAYS(pExpr->x.pList!=0) ){ + /* Case 2: expr IN (exprlist) + ** + ** For each expression, build an index key from the evaluation and + ** store it in the temporary table. If is a column, then use + ** that columns affinity when building index keys. If is not + ** a column, use numeric affinity. + */ + char affinity; /* Affinity of the LHS of the IN */ + int i; + ExprList *pList = pExpr->x.pList; + struct ExprList_item *pItem; + int r1, r2, r3; + + affinity = sqlite3ExprAffinity(pLeft); + if( !affinity ){ + affinity = SQLITE_AFF_BLOB; + } + if( pKeyInfo ){ + assert( sqlite3KeyInfoIsWriteable(pKeyInfo) ); + pKeyInfo->aColl[0] = sqlite3ExprCollSeq(pParse, pExpr->pLeft); + } + + /* Loop through each expression in . */ + r1 = sqlite3GetTempReg(pParse); + r2 = sqlite3GetTempReg(pParse); + if( isRowid ) 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 + ** this code only executes once. Because for a non-constant + ** expression we need to rerun this code each time. + */ + if( jmpIfDynamic>=0 && !sqlite3ExprIsConstant(pE2) ){ + sqlite3VdbeChangeToNoop(v, jmpIfDynamic); + jmpIfDynamic = -1; + } + + /* Evaluate the expression and insert it into the temp table */ + if( isRowid && sqlite3ExprIsInteger(pE2, &iValToIns) ){ + sqlite3VdbeAddOp3(v, OP_InsertInt, pExpr->iTable, r2, iValToIns); + }else{ + r3 = sqlite3ExprCodeTarget(pParse, pE2, r1); + if( isRowid ){ + sqlite3VdbeAddOp2(v, OP_MustBeInt, r3, + sqlite3VdbeCurrentAddr(v)+2); + VdbeCoverage(v); + 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); + sqlite3ReleaseTempReg(pParse, r2); + } + if( pKeyInfo ){ + sqlite3VdbeChangeP4(v, addr, (void *)pKeyInfo, P4_KEYINFO); + } + break; + } + + case TK_EXISTS: + case TK_SELECT: + default: { + /* Case 3: (SELECT ... FROM ...) + ** or: EXISTS(SELECT ... FROM ...) + ** + ** For a SELECT, generate code to put the values for all columns of + ** the first row into an array of registers and return the index of + ** the first register. + ** + ** If this is an EXISTS, write an integer 0 (not exists) or 1 (exists) + ** into a register and return that register number. + ** + ** In both cases, the query is augmented with "LIMIT 1". Any + ** preexisting limit is discarded in place of the new LIMIT 1. + */ + Select *pSel; /* SELECT statement to encode */ + SelectDest dest; /* How to deal with SELECT result */ + int nReg; /* Registers to allocate */ + + testcase( pExpr->op==TK_EXISTS ); + testcase( pExpr->op==TK_SELECT ); + assert( pExpr->op==TK_EXISTS || pExpr->op==TK_SELECT ); + assert( ExprHasProperty(pExpr, EP_xIsSelect) ); + + pSel = pExpr->x.pSelect; + nReg = pExpr->op==TK_SELECT ? pSel->pEList->nExpr : 1; + sqlite3SelectDestInit(&dest, 0, pParse->nMem+1); + pParse->nMem += nReg; + if( pExpr->op==TK_SELECT ){ + dest.eDest = SRT_Mem; + dest.iSdst = dest.iSDParm; + dest.nSdst = nReg; + sqlite3VdbeAddOp3(v, OP_Null, 0, dest.iSDParm, dest.iSDParm+nReg-1); + VdbeComment((v, "Init subquery result")); + }else{ + dest.eDest = SRT_Exists; + sqlite3VdbeAddOp2(v, OP_Integer, 0, dest.iSDParm); + VdbeComment((v, "Init EXISTS result")); + } + sqlite3ExprDelete(pParse->db, pSel->pLimit); + pSel->pLimit = sqlite3ExprAlloc(pParse->db, TK_INTEGER, + &sqlite3IntTokens[1], 0); + pSel->iLimit = 0; + pSel->selFlags &= ~SF_MultiValue; + if( sqlite3Select(pParse, pSel, &dest) ){ + return 0; + } + rReg = dest.iSDParm; + ExprSetVVAProperty(pExpr, EP_NoReduce); + break; + } + } + + if( rHasNullFlag ){ + sqlite3SetHasNullFlag(v, pExpr->iTable, rHasNullFlag); + } + + if( jmpIfDynamic>=0 ){ + sqlite3VdbeJumpHere(v, jmpIfDynamic); + } + sqlite3ExprCachePop(pParse); + + return rReg; +} +#endif /* SQLITE_OMIT_SUBQUERY */ + +#ifndef SQLITE_OMIT_SUBQUERY +/* +** Expr pIn is an IN(...) expression. This function checks that the +** sub-select on the RHS of the IN() operator has the same number of +** columns as the vector on the LHS. Or, if the RHS of the IN() is not +** a sub-query, that the LHS is a vector of size 1. +*/ +SQLITE_PRIVATE int sqlite3ExprCheckIN(Parse *pParse, Expr *pIn){ + int nVector = sqlite3ExprVectorSize(pIn->pLeft); + if( (pIn->flags & EP_xIsSelect) ){ + if( nVector!=pIn->x.pSelect->pEList->nExpr ){ + sqlite3SubselectError(pParse, pIn->x.pSelect->pEList->nExpr, nVector); + return 1; + } + }else if( nVector!=1 ){ + if( (pIn->pLeft->flags & EP_xIsSelect) ){ + sqlite3SubselectError(pParse, nVector, 1); + }else{ + sqlite3ErrorMsg(pParse, "row value misused"); + } + return 1; + } + return 0; +} +#endif + +#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 or vector expression. The +** right-hand side (RHS) is an array of zero or more scalar values, or a +** subquery. If the RHS is a subquery, the number of result columns must +** match the number of columns in the vector on the LHS. If the RHS is +** a list of values, the LHS must be a scalar. +** +** The IN operator is true if the LHS value is contained within the RHS. +** The result is false if the LHS is definitely not in the RHS. The +** result is NULL if the presence of the LHS in the RHS cannot be +** determined due to NULLs. +** +** This routine generates code that jumps 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. +** +** See the separate in-operator.md documentation file in the canonical +** SQLite source tree for additional information. +*/ +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 */ + int eType; /* Type of the RHS */ + int rLhs; /* Register(s) holding the LHS values */ + int rLhsOrig; /* LHS values prior to reordering by aiMap[] */ + Vdbe *v; /* Statement under construction */ + int *aiMap = 0; /* Map from vector field to index column */ + char *zAff = 0; /* Affinity string for comparisons */ + int nVector; /* Size of vectors for this IN operator */ + int iDummy; /* Dummy parameter to exprCodeVector() */ + Expr *pLeft; /* The LHS of the IN operator */ + int i; /* loop counter */ + int destStep2; /* Where to jump when NULLs seen in step 2 */ + int destStep6 = 0; /* Start of code for Step 6 */ + int addrTruthOp; /* Address of opcode that determines the IN is true */ + int destNotNull; /* Jump here if a comparison is not true in step 6 */ + int addrTop; /* Top of the step-6 loop */ + + pLeft = pExpr->pLeft; + if( sqlite3ExprCheckIN(pParse, pExpr) ) return; + zAff = exprINAffinity(pParse, pExpr); + nVector = sqlite3ExprVectorSize(pExpr->pLeft); + aiMap = (int*)sqlite3DbMallocZero( + pParse->db, nVector*(sizeof(int) + sizeof(char)) + 1 + ); + if( pParse->db->mallocFailed ) goto sqlite3ExprCodeIN_oom_error; + + /* Attempt to compute the RHS. After this step, if anything other than + ** IN_INDEX_NOOP is returned, the table opened ith cursor pExpr->iTable + ** contains the values that make up the RHS. If IN_INDEX_NOOP is returned, + ** the RHS has not yet been coded. */ + v = pParse->pVdbe; + assert( v!=0 ); /* OOM detected prior to this routine */ + VdbeNoopComment((v, "begin IN expr")); + eType = sqlite3FindInIndex(pParse, pExpr, + IN_INDEX_MEMBERSHIP | IN_INDEX_NOOP_OK, + destIfFalse==destIfNull ? 0 : &rRhsHasNull, aiMap); + + assert( pParse->nErr || nVector==1 || eType==IN_INDEX_EPH + || eType==IN_INDEX_INDEX_ASC || eType==IN_INDEX_INDEX_DESC + ); +#ifdef SQLITE_DEBUG + /* Confirm that aiMap[] contains nVector integer values between 0 and + ** nVector-1. */ + for(i=0; i from " IN (...)". If the LHS is a + ** vector, then it is stored in an array of nVector registers starting + ** at r1. + ** + ** sqlite3FindInIndex() might have reordered the fields of the LHS vector + ** so that the fields are in the same order as an existing index. The + ** aiMap[] array contains a mapping from the original LHS field order to + ** the field order that matches the RHS index. + */ + sqlite3ExprCachePush(pParse); + rLhsOrig = exprCodeVector(pParse, pLeft, &iDummy); + for(i=0; ix.pList; + CollSeq *pColl = sqlite3ExprCollSeq(pParse, pExpr->pLeft); + int labelOk = sqlite3VdbeMakeLabel(v); + int r2, regToFree; + int regCkNull = 0; + int ii; + assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); + if( destIfNull!=destIfFalse ){ + regCkNull = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp3(v, OP_BitAnd, rLhs, rLhs, regCkNull); + } + for(ii=0; iinExpr; ii++){ + r2 = sqlite3ExprCodeTemp(pParse, pList->a[ii].pExpr, ®ToFree); + if( regCkNull && sqlite3ExprCanBeNull(pList->a[ii].pExpr) ){ + sqlite3VdbeAddOp3(v, OP_BitAnd, regCkNull, r2, regCkNull); + } + if( iinExpr-1 || destIfNull!=destIfFalse ){ + sqlite3VdbeAddOp4(v, OP_Eq, rLhs, labelOk, r2, + (void*)pColl, P4_COLLSEQ); + VdbeCoverageIf(v, iinExpr-1); + VdbeCoverageIf(v, ii==pList->nExpr-1); + sqlite3VdbeChangeP5(v, zAff[0]); + }else{ + assert( destIfNull==destIfFalse ); + sqlite3VdbeAddOp4(v, OP_Ne, rLhs, destIfFalse, r2, + (void*)pColl, P4_COLLSEQ); VdbeCoverage(v); + sqlite3VdbeChangeP5(v, zAff[0] | SQLITE_JUMPIFNULL); + } + sqlite3ReleaseTempReg(pParse, regToFree); + } + if( regCkNull ){ + sqlite3VdbeAddOp2(v, OP_IsNull, regCkNull, destIfNull); VdbeCoverage(v); + sqlite3VdbeGoto(v, destIfFalse); + } + sqlite3VdbeResolveLabel(v, labelOk); + sqlite3ReleaseTempReg(pParse, regCkNull); + goto sqlite3ExprCodeIN_finished; + } + + /* Step 2: Check to see if the LHS contains any NULL columns. If the + ** LHS does contain NULLs then the result must be either FALSE or NULL. + ** We will then skip the binary search of the RHS. + */ + if( destIfNull==destIfFalse ){ + destStep2 = destIfFalse; + }else{ + destStep2 = destStep6 = sqlite3VdbeMakeLabel(v); + } + for(i=0; ipLeft, i); + if( sqlite3ExprCanBeNull(p) ){ + sqlite3VdbeAddOp2(v, OP_IsNull, rLhs+i, destStep2); + VdbeCoverage(v); + } + } + + /* Step 3. The LHS is now known to be non-NULL. Do the binary search + ** of the RHS using the LHS as a probe. If found, the result is + ** true. + */ + if( eType==IN_INDEX_ROWID ){ + /* In this case, the RHS is the ROWID of table b-tree and so we also + ** know that the RHS is non-NULL. Hence, we combine steps 3 and 4 + ** into a single opcode. */ + sqlite3VdbeAddOp3(v, OP_SeekRowid, pExpr->iTable, destIfFalse, rLhs); + VdbeCoverage(v); + addrTruthOp = sqlite3VdbeAddOp0(v, OP_Goto); /* Return True */ + }else{ + sqlite3VdbeAddOp4(v, OP_Affinity, rLhs, nVector, 0, zAff, nVector); + if( destIfFalse==destIfNull ){ + /* Combine Step 3 and Step 5 into a single opcode */ + sqlite3VdbeAddOp4Int(v, OP_NotFound, pExpr->iTable, destIfFalse, + rLhs, nVector); VdbeCoverage(v); + goto sqlite3ExprCodeIN_finished; + } + /* Ordinary Step 3, for the case where FALSE and NULL are distinct */ + addrTruthOp = sqlite3VdbeAddOp4Int(v, OP_Found, pExpr->iTable, 0, + rLhs, nVector); VdbeCoverage(v); + } + + /* Step 4. If the RHS is known to be non-NULL and we did not find + ** an match on the search above, then the result must be FALSE. + */ + if( rRhsHasNull && nVector==1 ){ + sqlite3VdbeAddOp2(v, OP_NotNull, rRhsHasNull, destIfFalse); + VdbeCoverage(v); + } + + /* Step 5. If we do not care about the difference between NULL and + ** FALSE, then just return false. + */ + if( destIfFalse==destIfNull ) sqlite3VdbeGoto(v, destIfFalse); + + /* Step 6: Loop through rows of the RHS. Compare each row to the LHS. + ** If any comparison is NULL, then the result is NULL. If all + ** comparisons are FALSE then the final result is FALSE. + ** + ** For a scalar LHS, it is sufficient to check just the first row + ** of the RHS. + */ + if( destStep6 ) sqlite3VdbeResolveLabel(v, destStep6); + addrTop = sqlite3VdbeAddOp2(v, OP_Rewind, pExpr->iTable, destIfFalse); + VdbeCoverage(v); + if( nVector>1 ){ + destNotNull = sqlite3VdbeMakeLabel(v); + }else{ + /* For nVector==1, combine steps 6 and 7 by immediately returning + ** FALSE if the first comparison is not NULL */ + destNotNull = destIfFalse; + } + for(i=0; iiTable, i, r3); + sqlite3VdbeAddOp4(v, OP_Ne, rLhs+i, destNotNull, r3, + (void*)pColl, P4_COLLSEQ); + VdbeCoverage(v); + sqlite3ReleaseTempReg(pParse, r3); + } + sqlite3VdbeAddOp2(v, OP_Goto, 0, destIfNull); + if( nVector>1 ){ + sqlite3VdbeResolveLabel(v, destNotNull); + sqlite3VdbeAddOp2(v, OP_Next, pExpr->iTable, addrTop+1); + VdbeCoverage(v); + + /* Step 7: If we reach this point, we know that the result must + ** be false. */ + sqlite3VdbeAddOp2(v, OP_Goto, 0, destIfFalse); + } + + /* Jumps here in order to return true. */ + sqlite3VdbeJumpHere(v, addrTruthOp); + +sqlite3ExprCodeIN_finished: + if( rLhs!=rLhsOrig ) sqlite3ReleaseTempReg(pParse, rLhs); + sqlite3ExprCachePop(pParse); + VdbeComment((v, "end IN expr")); +sqlite3ExprCodeIN_oom_error: + sqlite3DbFree(pParse->db, aiMap); + sqlite3DbFree(pParse->db, zAff); +} +#endif /* SQLITE_OMIT_SUBQUERY */ + +#ifndef SQLITE_OMIT_FLOATING_POINT +/* +** Generate an instruction that will put the floating point +** value described by z[0..n-1] into register iMem. +** +** The z[] string will probably not be zero-terminated. But the +** z[n] character is guaranteed to be something that does not look +** like the continuation of the number. +*/ +static void codeReal(Vdbe *v, const char *z, int negateFlag, int iMem){ + if( ALWAYS(z!=0) ){ + double value; + sqlite3AtoF(z, &value, sqlite3Strlen30(z), SQLITE_UTF8); + assert( !sqlite3IsNaN(value) ); /* The new AtoF never returns NaN */ + if( negateFlag ) value = -value; + sqlite3VdbeAddOp4Dup8(v, OP_Real, 0, iMem, 0, (u8*)&value, P4_REAL); + } +} +#endif + + +/* +** Generate an instruction that will put the integer describe by +** text z[0..n-1] into register iMem. +** +** Expr.u.zToken is always UTF8 and zero-terminated. +*/ +static void codeInteger(Parse *pParse, Expr *pExpr, int negFlag, int iMem){ + Vdbe *v = pParse->pVdbe; + if( pExpr->flags & EP_IntValue ){ + int i = pExpr->u.iValue; + assert( i>=0 ); + if( negFlag ) i = -i; + sqlite3VdbeAddOp2(v, OP_Integer, i, iMem); + }else{ + int c; + i64 value; + const char *z = pExpr->u.zToken; + assert( z!=0 ); + c = sqlite3DecOrHexToI64(z, &value); + if( c==0 || (c==2 && negFlag) ){ + if( negFlag ){ value = c==2 ? SMALLEST_INT64 : -value; } + sqlite3VdbeAddOp4Dup8(v, OP_Int64, 0, iMem, 0, (u8*)&value, P4_INT64); + }else{ +#ifdef SQLITE_OMIT_FLOATING_POINT + sqlite3ErrorMsg(pParse, "oversized integer: %s%s", negFlag ? "-" : "", z); +#else +#ifndef SQLITE_OMIT_HEX_INTEGER + if( sqlite3_strnicmp(z,"0x",2)==0 ){ + sqlite3ErrorMsg(pParse, "hex literal too big: %s", z); + }else +#endif + { + codeReal(v, z, negFlag, iMem); + } +#endif + } + } +} + +/* +** Erase column-cache entry number i +*/ +static void cacheEntryClear(Parse *pParse, int i){ + if( pParse->aColCache[i].tempReg ){ + if( pParse->nTempRegaTempReg) ){ + pParse->aTempReg[pParse->nTempReg++] = pParse->aColCache[i].iReg; + } + } + pParse->nColCache--; + if( inColCache ){ + pParse->aColCache[i] = pParse->aColCache[pParse->nColCache]; + } +} + + +/* +** Record in the column cache that a particular column from a +** particular table is stored in a particular register. +*/ +SQLITE_PRIVATE void sqlite3ExprCacheStore(Parse *pParse, int iTab, int iCol, int iReg){ + int i; + int minLru; + int idxLru; + struct yColCache *p; + + /* Unless an error has occurred, register numbers are always positive. */ + assert( iReg>0 || pParse->nErr || pParse->db->mallocFailed ); + assert( iCol>=-1 && iCol<32768 ); /* Finite column numbers */ + + /* 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( OptimizationDisabled(pParse->db, 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; inColCache; i++, p++){ + assert( p->iTable!=iTab || p->iColumn!=iCol ); + } +#endif + + /* If the cache is already full, delete the least recently used entry */ + if( pParse->nColCache>=SQLITE_N_COLCACHE ){ + minLru = 0x7fffffff; + idxLru = -1; + for(i=0, p=pParse->aColCache; ilrulru; + } + } + p = &pParse->aColCache[idxLru]; + }else{ + p = &pParse->aColCache[pParse->nColCache++]; + } + + /* Add the new entry to the end of the cache */ + p->iLevel = pParse->iCacheLevel; + p->iTable = iTab; + p->iColumn = iCol; + p->iReg = iReg; + p->tempReg = 0; + p->lru = pParse->iCacheCnt++; +} + +/* +** 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, int nReg){ + int i = 0; + while( inColCache ){ + struct yColCache *p = &pParse->aColCache[i]; + if( p->iReg >= iReg && p->iReg < iReg+nReg ){ + cacheEntryClear(pParse, i); + }else{ + i++; + } + } +} + +/* +** Remember the current column cache context. Any new entries added +** added to the column cache after this call are removed when the +** corresponding pop occurs. +*/ +SQLITE_PRIVATE void sqlite3ExprCachePush(Parse *pParse){ + pParse->iCacheLevel++; +#ifdef SQLITE_DEBUG + if( pParse->db->flags & SQLITE_VdbeAddopTrace ){ + printf("PUSH to %d\n", pParse->iCacheLevel); + } +#endif +} + +/* +** Remove from the column cache any entries that were added since the +** the previous sqlite3ExprCachePush operation. In other words, restore +** the cache to the state it was in prior the most recent Push. +*/ +SQLITE_PRIVATE void sqlite3ExprCachePop(Parse *pParse){ + int i = 0; + assert( pParse->iCacheLevel>=1 ); + pParse->iCacheLevel--; +#ifdef SQLITE_DEBUG + if( pParse->db->flags & SQLITE_VdbeAddopTrace ){ + printf("POP to %d\n", pParse->iCacheLevel); + } +#endif + while( inColCache ){ + if( pParse->aColCache[i].iLevel>pParse->iCacheLevel ){ + cacheEntryClear(pParse, i); + }else{ + i++; + } + } +} + +/* +** When a cached column is reused, make sure that its register is +** no longer available as a temp register. ticket #3879: that same +** register might be in the cache in multiple places, so be sure to +** get them all. +*/ +static void sqlite3ExprCachePinRegister(Parse *pParse, int iReg){ + int i; + struct yColCache *p; + for(i=0, p=pParse->aColCache; inColCache; i++, p++){ + if( p->iReg==iReg ){ + p->tempReg = 0; + } + } +} + +/* Generate code that will load into register regOut a value that is +** appropriate for the iIdxCol-th column of index pIdx. +*/ +SQLITE_PRIVATE void sqlite3ExprCodeLoadIndexColumn( + Parse *pParse, /* The parsing context */ + Index *pIdx, /* The index whose column is to be loaded */ + int iTabCur, /* Cursor pointing to a table row */ + int iIdxCol, /* The column of the index to be loaded */ + int regOut /* Store the index column value in this register */ +){ + i16 iTabCol = pIdx->aiColumn[iIdxCol]; + if( iTabCol==XN_EXPR ){ + assert( pIdx->aColExpr ); + assert( pIdx->aColExpr->nExpr>iIdxCol ); + pParse->iSelfTab = iTabCur; + sqlite3ExprCodeCopy(pParse, pIdx->aColExpr->a[iIdxCol].pExpr, regOut); + }else{ + sqlite3ExprCodeGetColumnOfTable(pParse->pVdbe, pIdx->pTable, iTabCur, + iTabCol, regOut); + } +} + +/* +** Generate code to extract the value of the iCol-th column of a table. +*/ +SQLITE_PRIVATE void sqlite3ExprCodeGetColumnOfTable( + Vdbe *v, /* The VDBE under construction */ + Table *pTab, /* The table containing the value */ + int iTabCur, /* The table cursor. Or the PK cursor for WITHOUT ROWID */ + int iCol, /* Index of the column to extract */ + int regOut /* Extract the value into this register */ +){ + if( iCol<0 || iCol==pTab->iPKey ){ + sqlite3VdbeAddOp2(v, OP_Rowid, iTabCur, regOut); + }else{ + int op = IsVirtual(pTab) ? OP_VColumn : OP_Column; + int x = iCol; + if( !HasRowid(pTab) && !IsVirtual(pTab) ){ + x = sqlite3ColumnOfIndex(sqlite3PrimaryKeyIndex(pTab), iCol); + } + sqlite3VdbeAddOp3(v, op, iTabCur, x, regOut); + } + if( iCol>=0 ){ + sqlite3ColumnDefault(v, pTab, iCol, regOut); + } +} + +/* +** Generate code that will extract the iColumn-th column from +** table pTab and store the column value in a register. +** +** An effort is made to store the column value in register iReg. This +** is not garanteeed for GetColumn() - the result can be stored in +** any register. But the result is guaranteed to land in register iReg +** for GetColumnToReg(). +** +** 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. +*/ +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 */ + u8 p5 /* P5 value for OP_Column + FLAGS */ +){ + Vdbe *v = pParse->pVdbe; + int i; + struct yColCache *p; + + for(i=0, p=pParse->aColCache; inColCache; i++, p++){ + if( p->iTable==iTable && p->iColumn==iColumn ){ + p->lru = pParse->iCacheCnt++; + sqlite3ExprCachePinRegister(pParse, p->iReg); + return p->iReg; + } + } + assert( v!=0 ); + sqlite3ExprCodeGetColumnOfTable(v, pTab, iTable, iColumn, iReg); + if( p5 ){ + sqlite3VdbeChangeP5(v, p5); + }else{ + sqlite3ExprCacheStore(pParse, iTable, iColumn, iReg); + } + return iReg; +} +SQLITE_PRIVATE void sqlite3ExprCodeGetColumnToReg( + 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 r1 = sqlite3ExprCodeGetColumn(pParse, pTab, iColumn, iTable, iReg, 0); + if( r1!=iReg ) sqlite3VdbeAddOp2(pParse->pVdbe, OP_SCopy, r1, iReg); +} + + +/* +** Clear all column cache entries. +*/ +SQLITE_PRIVATE void sqlite3ExprCacheClear(Parse *pParse){ + int i; + +#if SQLITE_DEBUG + if( pParse->db->flags & SQLITE_VdbeAddopTrace ){ + printf("CLEAR\n"); + } +#endif + for(i=0; inColCache; i++){ + if( pParse->aColCache[i].tempReg + && pParse->nTempRegaTempReg) + ){ + pParse->aTempReg[pParse->nTempReg++] = pParse->aColCache[i].iReg; + } + } + pParse->nColCache = 0; +} + +/* +** Record the fact that an affinity change has occurred on iCount +** registers starting with iStart. +*/ +SQLITE_PRIVATE void sqlite3ExprCacheAffinityChange(Parse *pParse, int iStart, int iCount){ + sqlite3ExprCacheRemove(pParse, iStart, iCount); +} + +/* +** Generate code to move content from registers iFrom...iFrom+nReg-1 +** over to iTo..iTo+nReg-1. Keep the column cache up-to-date. +*/ +SQLITE_PRIVATE void sqlite3ExprCodeMove(Parse *pParse, int iFrom, int iTo, int nReg){ + assert( iFrom>=iTo+nReg || iFrom+nReg<=iTo ); + sqlite3VdbeAddOp3(pParse->pVdbe, OP_Move, iFrom, iTo, nReg); + sqlite3ExprCacheRemove(pParse, iFrom, nReg); +} + +#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; inColCache; i++, p++){ + int r = p->iReg; + if( r>=iFrom && r<=iTo ) return 1; /*NO_TEST*/ + } + return 0; +} +#endif /* SQLITE_DEBUG || SQLITE_COVERAGE_TEST */ + + +/* +** Convert a scalar expression node to a TK_REGISTER referencing +** register iReg. The caller must ensure that iReg already contains +** the correct value for the expression. +*/ +static void exprToRegister(Expr *p, int iReg){ + p->op2 = p->op; + p->op = TK_REGISTER; + p->iTable = iReg; + ExprClearProperty(p, EP_Skip); +} + +/* +** Evaluate an expression (either a vector or a scalar expression) and store +** the result in continguous temporary registers. Return the index of +** the first register used to store the result. +** +** If the returned result register is a temporary scalar, then also write +** that register number into *piFreeable. If the returned result register +** is not a temporary or if the expression is a vector set *piFreeable +** to 0. +*/ +static int exprCodeVector(Parse *pParse, Expr *p, int *piFreeable){ + int iResult; + int nResult = sqlite3ExprVectorSize(p); + if( nResult==1 ){ + iResult = sqlite3ExprCodeTemp(pParse, p, piFreeable); + }else{ + *piFreeable = 0; + if( p->op==TK_SELECT ){ + iResult = sqlite3CodeSubselect(pParse, p, 0, 0); + }else{ + int i; + iResult = pParse->nMem+1; + pParse->nMem += nResult; + for(i=0; ix.pList->a[i].pExpr, i+iResult); + } + } + } + return iResult; +} + + +/* +** Generate code into the current Vdbe to evaluate the given +** expression. Attempt to store the results in register "target". +** Return the register where results are stored. +** +** With this routine, there is no guarantee that results will +** be stored in target. The result might be stored in some other +** register if it is convenient to do so. The calling function +** must check the return code and move the results to the desired +** register. +*/ +SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target){ + Vdbe *v = pParse->pVdbe; /* The VM under construction */ + int op; /* The opcode being coded */ + int inReg = target; /* Results stored in register inReg */ + int regFree1 = 0; /* If non-zero free this temporary register */ + int regFree2 = 0; /* If non-zero free this temporary register */ + int r1, r2; /* Various register numbers */ + Expr tempX; /* Temporary expression node */ + int p5 = 0; + + assert( target>0 && target<=pParse->nMem ); + if( v==0 ){ + assert( pParse->db->mallocFailed ); + return 0; + } + + if( pExpr==0 ){ + op = TK_NULL; + }else{ + op = pExpr->op; + } + switch( op ){ + case TK_AGG_COLUMN: { + AggInfo *pAggInfo = pExpr->pAggInfo; + struct AggInfo_col *pCol = &pAggInfo->aCol[pExpr->iAgg]; + if( !pAggInfo->directMode ){ + assert( pCol->iMem>0 ); + return pCol->iMem; + }else if( pAggInfo->useSortingIdx ){ + sqlite3VdbeAddOp3(v, OP_Column, pAggInfo->sortingIdxPTab, + pCol->iSorterColumn, target); + return target; + } + /* Otherwise, fall thru into the TK_COLUMN case */ + } + case TK_COLUMN: { + int iTab = pExpr->iTable; + if( iTab<0 ){ + if( pParse->ckBase>0 ){ + /* Generating CHECK constraints or inserting into partial index */ + return pExpr->iColumn + pParse->ckBase; + }else{ + /* Coding an expression that is part of an index where column names + ** in the index refer to the table to which the index belongs */ + iTab = pParse->iSelfTab; + } + } + return sqlite3ExprCodeGetColumn(pParse, pExpr->pTab, + pExpr->iColumn, iTab, target, + pExpr->op2); + } + case TK_INTEGER: { + codeInteger(pParse, pExpr, 0, target); + return target; + } +#ifndef SQLITE_OMIT_FLOATING_POINT + case TK_FLOAT: { + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + codeReal(v, pExpr->u.zToken, 0, target); + return target; + } +#endif + case TK_STRING: { + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + sqlite3VdbeLoadString(v, target, pExpr->u.zToken); + return target; + } + case TK_NULL: { + sqlite3VdbeAddOp2(v, OP_Null, 0, target); + return target; + } +#ifndef SQLITE_OMIT_BLOB_LITERAL + case TK_BLOB: { + int n; + const char *z; + char *zBlob; + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + assert( pExpr->u.zToken[0]=='x' || pExpr->u.zToken[0]=='X' ); + assert( pExpr->u.zToken[1]=='\'' ); + z = &pExpr->u.zToken[2]; + n = sqlite3Strlen30(z) - 1; + assert( z[n]=='\'' ); + zBlob = sqlite3HexToBlob(sqlite3VdbeDb(v), z, n); + sqlite3VdbeAddOp4(v, OP_Blob, n/2, target, 0, zBlob, P4_DYNAMIC); + return target; + } +#endif + case TK_VARIABLE: { + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + assert( pExpr->u.zToken!=0 ); + assert( pExpr->u.zToken[0]!=0 ); + sqlite3VdbeAddOp2(v, OP_Variable, pExpr->iColumn, target); + if( pExpr->u.zToken[1]!=0 ){ + assert( pExpr->u.zToken[0]=='?' + || strcmp(pExpr->u.zToken, pParse->azVar[pExpr->iColumn-1])==0 ); + sqlite3VdbeChangeP4(v, -1, pParse->azVar[pExpr->iColumn-1], P4_STATIC); + } + return target; + } + case TK_REGISTER: { + return pExpr->iTable; + } +#ifndef SQLITE_OMIT_CAST + case TK_CAST: { + /* Expressions of the form: CAST(pLeft AS token) */ + inReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft, target); + if( inReg!=target ){ + sqlite3VdbeAddOp2(v, OP_SCopy, inReg, target); + inReg = target; + } + sqlite3VdbeAddOp2(v, OP_Cast, target, + sqlite3AffinityType(pExpr->u.zToken, 0)); + testcase( usedAsColumnCache(pParse, inReg, inReg) ); + sqlite3ExprCacheAffinityChange(pParse, inReg, 1); + return inReg; + } +#endif /* SQLITE_OMIT_CAST */ + case TK_IS: + case TK_ISNOT: + op = (op==TK_IS) ? TK_EQ : TK_NE; + p5 = SQLITE_NULLEQ; + /* fall-through */ + case TK_LT: + case TK_LE: + case TK_GT: + case TK_GE: + case TK_NE: + case TK_EQ: { + Expr *pLeft = pExpr->pLeft; + if( sqlite3ExprIsVector(pLeft) ){ + codeVectorCompare(pParse, pExpr, target, op, p5); + }else{ + r1 = sqlite3ExprCodeTemp(pParse, pLeft, ®Free1); + r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2); + codeCompare(pParse, pLeft, pExpr->pRight, op, + r1, r2, inReg, SQLITE_STOREP2 | p5); + assert(TK_LT==OP_Lt); testcase(op==OP_Lt); VdbeCoverageIf(v,op==OP_Lt); + assert(TK_LE==OP_Le); testcase(op==OP_Le); VdbeCoverageIf(v,op==OP_Le); + assert(TK_GT==OP_Gt); testcase(op==OP_Gt); VdbeCoverageIf(v,op==OP_Gt); + assert(TK_GE==OP_Ge); testcase(op==OP_Ge); VdbeCoverageIf(v,op==OP_Ge); + assert(TK_EQ==OP_Eq); testcase(op==OP_Eq); VdbeCoverageIf(v,op==OP_Eq); + assert(TK_NE==OP_Ne); testcase(op==OP_Ne); VdbeCoverageIf(v,op==OP_Ne); + testcase( regFree1==0 ); + testcase( regFree2==0 ); + } + break; + } + case TK_AND: + case TK_OR: + case TK_PLUS: + case TK_STAR: + case TK_MINUS: + case TK_REM: + case TK_BITAND: + case TK_BITOR: + case TK_SLASH: + case TK_LSHIFT: + case TK_RSHIFT: + case TK_CONCAT: { + assert( TK_AND==OP_And ); testcase( op==TK_AND ); + assert( TK_OR==OP_Or ); testcase( op==TK_OR ); + assert( TK_PLUS==OP_Add ); testcase( op==TK_PLUS ); + assert( TK_MINUS==OP_Subtract ); testcase( op==TK_MINUS ); + assert( TK_REM==OP_Remainder ); testcase( op==TK_REM ); + assert( TK_BITAND==OP_BitAnd ); testcase( op==TK_BITAND ); + assert( TK_BITOR==OP_BitOr ); testcase( op==TK_BITOR ); + assert( TK_SLASH==OP_Divide ); testcase( op==TK_SLASH ); + assert( TK_LSHIFT==OP_ShiftLeft ); testcase( op==TK_LSHIFT ); + assert( TK_RSHIFT==OP_ShiftRight ); testcase( op==TK_RSHIFT ); + assert( TK_CONCAT==OP_Concat ); testcase( op==TK_CONCAT ); + r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); + r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2); + sqlite3VdbeAddOp3(v, op, r2, r1, target); + testcase( regFree1==0 ); + testcase( regFree2==0 ); + break; + } + case TK_UMINUS: { + Expr *pLeft = pExpr->pLeft; + assert( pLeft ); + if( pLeft->op==TK_INTEGER ){ + codeInteger(pParse, pLeft, 1, target); + return target; +#ifndef SQLITE_OMIT_FLOATING_POINT + }else if( pLeft->op==TK_FLOAT ){ + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + codeReal(v, pLeft->u.zToken, 1, target); + return target; +#endif + }else{ + tempX.op = TK_INTEGER; + tempX.flags = EP_IntValue|EP_TokenOnly; + tempX.u.iValue = 0; + r1 = sqlite3ExprCodeTemp(pParse, &tempX, ®Free1); + r2 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free2); + sqlite3VdbeAddOp3(v, OP_Subtract, r2, r1, target); + testcase( regFree2==0 ); + } + break; + } + case TK_BITNOT: + case TK_NOT: { + assert( TK_BITNOT==OP_BitNot ); testcase( op==TK_BITNOT ); + assert( TK_NOT==OP_Not ); testcase( op==TK_NOT ); + r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); + testcase( regFree1==0 ); + sqlite3VdbeAddOp2(v, op, r1, inReg); + break; + } + case TK_ISNULL: + case TK_NOTNULL: { + int addr; + assert( TK_ISNULL==OP_IsNull ); testcase( op==TK_ISNULL ); + assert( TK_NOTNULL==OP_NotNull ); testcase( op==TK_NOTNULL ); + sqlite3VdbeAddOp2(v, OP_Integer, 1, target); + r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); + testcase( regFree1==0 ); + addr = sqlite3VdbeAddOp1(v, op, r1); + VdbeCoverageIf(v, op==TK_ISNULL); + VdbeCoverageIf(v, op==TK_NOTNULL); + sqlite3VdbeAddOp2(v, OP_Integer, 0, target); + sqlite3VdbeJumpHere(v, addr); + break; + } + case TK_AGG_FUNCTION: { + AggInfo *pInfo = pExpr->pAggInfo; + if( pInfo==0 ){ + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + sqlite3ErrorMsg(pParse, "misuse of aggregate: %s()", pExpr->u.zToken); + }else{ + return pInfo->aFunc[pExpr->iAgg].iMem; + } + break; + } + case TK_FUNCTION: { + ExprList *pFarg; /* List of function arguments */ + int nFarg; /* Number of function arguments */ + FuncDef *pDef; /* The function definition object */ + const char *zId; /* The function name */ + u32 constMask = 0; /* Mask of function arguments that are constant */ + int i; /* Loop counter */ + sqlite3 *db = pParse->db; /* The database connection */ + u8 enc = ENC(db); /* The text encoding used by this database */ + CollSeq *pColl = 0; /* A collating sequence */ + + assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); + if( ExprHasProperty(pExpr, EP_TokenOnly) ){ + pFarg = 0; + }else{ + pFarg = pExpr->x.pList; + } + nFarg = pFarg ? pFarg->nExpr : 0; + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + zId = pExpr->u.zToken; + pDef = sqlite3FindFunction(db, zId, nFarg, enc, 0); +#ifdef SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION + if( pDef==0 && pParse->explain ){ + pDef = sqlite3FindFunction(db, "unknown", nFarg, enc, 0); + } +#endif + if( pDef==0 || pDef->xFinalize!=0 ){ + sqlite3ErrorMsg(pParse, "unknown function: %s()", zId); + break; + } + + /* Attempt a direct implementation of the built-in COALESCE() and + ** IFNULL() functions. This avoids unnecessary evaluation of + ** arguments past the first non-NULL argument. + */ + if( pDef->funcFlags & 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); + } + sqlite3VdbeResolveLabel(v, endCoalesce); + break; + } + + /* The UNLIKELY() function is a no-op. The result is the value + ** of the first argument. + */ + if( pDef->funcFlags & SQLITE_FUNC_UNLIKELY ){ + assert( nFarg>=1 ); + return sqlite3ExprCodeTarget(pParse, pFarg->a[0].pExpr, target); + } + + for(i=0; ia[i].pExpr) ){ + testcase( i==31 ); + constMask |= MASKBIT32(i); + } + if( (pDef->funcFlags & SQLITE_FUNC_NEEDCOLL)!=0 && !pColl ){ + pColl = sqlite3ExprCollSeq(pParse, pFarg->a[i].pExpr); + } + } + if( pFarg ){ + if( constMask ){ + r1 = pParse->nMem+1; + pParse->nMem += nFarg; + }else{ + r1 = sqlite3GetTempRange(pParse, nFarg); + } + + /* For length() and typeof() functions with a column argument, + ** set the P5 parameter to the OP_Column opcode to OPFLAG_LENGTHARG + ** or OPFLAG_TYPEOFARG respectively, to avoid unnecessary data + ** loading. + */ + if( (pDef->funcFlags & (SQLITE_FUNC_LENGTH|SQLITE_FUNC_TYPEOF))!=0 ){ + u8 exprOp; + assert( nFarg==1 ); + assert( pFarg->a[0].pExpr!=0 ); + exprOp = pFarg->a[0].pExpr->op; + if( exprOp==TK_COLUMN || exprOp==TK_AGG_COLUMN ){ + assert( SQLITE_FUNC_LENGTH==OPFLAG_LENGTHARG ); + assert( SQLITE_FUNC_TYPEOF==OPFLAG_TYPEOFARG ); + testcase( pDef->funcFlags & OPFLAG_LENGTHARG ); + pFarg->a[0].pExpr->op2 = + pDef->funcFlags & (OPFLAG_LENGTHARG|OPFLAG_TYPEOFARG); + } + } + + sqlite3ExprCachePush(pParse); /* Ticket 2ea2425d34be */ + sqlite3ExprCodeExprList(pParse, pFarg, r1, 0, + SQLITE_ECEL_DUP|SQLITE_ECEL_FACTOR); + sqlite3ExprCachePop(pParse); /* Ticket 2ea2425d34be */ + }else{ + r1 = 0; + } +#ifndef SQLITE_OMIT_VIRTUALTABLE + /* Possibly overload the function if the first argument is + ** a virtual table column. + ** + ** For infix functions (LIKE, GLOB, REGEXP, and MATCH) use the + ** second argument, not the first, as the argument to test to + ** see if it is a column in a virtual table. This is done because + ** the left operand of infix functions (the operand we want to + ** control overloading) ends up as the second argument to the + ** function. The expression "A glob B" is equivalent to + ** "glob(B,A). We want to use the A in "A glob B" to test + ** for function overloading. But we use the B term in "glob(B,A)". + */ + if( nFarg>=2 && (pExpr->flags & EP_InfixFunc) ){ + pDef = sqlite3VtabOverloadFunction(db, pDef, nFarg, pFarg->a[1].pExpr); + }else if( nFarg>0 ){ + pDef = sqlite3VtabOverloadFunction(db, pDef, nFarg, pFarg->a[0].pExpr); + } +#endif + if( pDef->funcFlags & SQLITE_FUNC_NEEDCOLL ){ + if( !pColl ) pColl = db->pDfltColl; + sqlite3VdbeAddOp4(v, OP_CollSeq, 0, 0, 0, (char *)pColl, P4_COLLSEQ); + } + sqlite3VdbeAddOp4(v, OP_Function0, constMask, r1, target, + (char*)pDef, P4_FUNCDEF); + sqlite3VdbeChangeP5(v, (u8)nFarg); + if( nFarg && constMask==0 ){ + sqlite3ReleaseTempRange(pParse, r1, nFarg); + } + return target; + } +#ifndef SQLITE_OMIT_SUBQUERY + case TK_EXISTS: + case TK_SELECT: { + int nCol; + testcase( op==TK_EXISTS ); + testcase( op==TK_SELECT ); + if( op==TK_SELECT && (nCol = pExpr->x.pSelect->pEList->nExpr)!=1 ){ + sqlite3SubselectError(pParse, nCol, 1); + }else{ + return sqlite3CodeSubselect(pParse, pExpr, 0, 0); + } + break; + } + case TK_SELECT_COLUMN: { + if( pExpr->pLeft->iTable==0 ){ + pExpr->pLeft->iTable = sqlite3CodeSubselect(pParse, pExpr->pLeft, 0, 0); + } + return pExpr->pLeft->iTable + pExpr->iColumn; + } + case TK_IN: { + 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); + return target; + } +#endif /* SQLITE_OMIT_SUBQUERY */ + + + /* + ** x BETWEEN y AND z + ** + ** This is equivalent to + ** + ** x>=y AND x<=z + ** + ** X is stored in pExpr->pLeft. + ** Y is stored in pExpr->pList->a[0].pExpr. + ** Z is stored in pExpr->pList->a[1].pExpr. + */ + case TK_BETWEEN: { + exprCodeBetween(pParse, pExpr, target, 0, 0); + return target; + } + case TK_SPAN: + case TK_COLLATE: + case TK_UPLUS: { + return sqlite3ExprCodeTarget(pParse, pExpr->pLeft, target); + } + + case TK_TRIGGER: { + /* If the opcode is TK_TRIGGER, then the expression is a reference + ** to a column in the new.* or old.* pseudo-tables available to + ** trigger programs. In this case Expr.iTable is set to 1 for the + ** new.* pseudo-table, or 0 for the old.* pseudo-table. Expr.iColumn + ** is set to the column of the pseudo-table to read, or to -1 to + ** read the rowid field. + ** + ** The expression is implemented using an OP_Param opcode. The p1 + ** parameter is set to 0 for an old.rowid reference, or to (i+1) + ** to reference another column of the old.* pseudo-table, where + ** i is the index of the column. For a new.rowid reference, p1 is + ** set to (n+1), where n is the number of columns in each pseudo-table. + ** For a reference to any other column in the new.* pseudo-table, p1 + ** is set to (n+2+i), where n and i are as defined previously. For + ** example, if the table on which triggers are being fired is + ** declared as: + ** + ** CREATE TABLE t1(a, b); + ** + ** Then p1 is interpreted as follows: + ** + ** p1==0 -> old.rowid p1==3 -> new.rowid + ** p1==1 -> old.a p1==4 -> new.a + ** p1==2 -> old.b p1==5 -> new.b + */ + Table *pTab = pExpr->pTab; + int p1 = pExpr->iTable * (pTab->nCol+1) + 1 + pExpr->iColumn; + + assert( pExpr->iTable==0 || pExpr->iTable==1 ); + assert( pExpr->iColumn>=-1 && pExpr->iColumnnCol ); + assert( pTab->iPKey<0 || pExpr->iColumn!=pTab->iPKey ); + assert( p1>=0 && p1<(pTab->nCol*2+2) ); + + sqlite3VdbeAddOp2(v, OP_Param, p1, target); + VdbeComment((v, "%s.%s -> $%d", + (pExpr->iTable ? "new" : "old"), + (pExpr->iColumn<0 ? "rowid" : pExpr->pTab->aCol[pExpr->iColumn].zName), + target + )); + +#ifndef SQLITE_OMIT_FLOATING_POINT + /* If the column has REAL affinity, it may currently be stored as an + ** integer. Use OP_RealAffinity to make sure it is really real. + ** + ** EVIDENCE-OF: R-60985-57662 SQLite will convert the value back to + ** floating point when extracting it from the record. */ + if( pExpr->iColumn>=0 + && pTab->aCol[pExpr->iColumn].affinity==SQLITE_AFF_REAL + ){ + sqlite3VdbeAddOp1(v, OP_RealAffinity, target); + } +#endif + break; + } + + case TK_VECTOR: { + sqlite3ErrorMsg(pParse, "row value misused"); + break; + } + + /* + ** Form A: + ** CASE x WHEN e1 THEN r1 WHEN e2 THEN r2 ... WHEN eN THEN rN ELSE y END + ** + ** Form B: + ** CASE WHEN e1 THEN r1 WHEN e2 THEN r2 ... WHEN eN THEN rN ELSE y END + ** + ** Form A is can be transformed into the equivalent form B as follows: + ** CASE WHEN x=e1 THEN r1 WHEN x=e2 THEN r2 ... + ** WHEN x=eN THEN rN ELSE y END + ** + ** X (if it exists) is in pExpr->pLeft. + ** Y is in the last element of pExpr->x.pList if pExpr->x.pList->nExpr is + ** odd. The Y is also optional. If the number of elements in x.pList + ** is even, then Y is omitted and the "otherwise" result is NULL. + ** Ei is in pExpr->pList->a[i*2] and Ri is pExpr->pList->a[i*2+1]. + ** + ** The result of the expression is the Ri for the first matching Ei, + ** or if there is no matching Ei, the ELSE term Y, or if there is + ** no ELSE term, NULL. + */ + default: assert( op==TK_CASE ); { + int endLabel; /* GOTO label for end of CASE stmt */ + int nextCase; /* GOTO label for next WHEN clause */ + int nExpr; /* 2x number of WHEN terms */ + int i; /* Loop counter */ + ExprList *pEList; /* List of WHEN terms */ + struct ExprList_item *aListelem; /* Array of WHEN terms */ + Expr opCompare; /* The X==Ei expression */ + Expr *pX; /* The X expression */ + Expr *pTest = 0; /* X==Ei (form A) or just Ei (form B) */ + VVA_ONLY( int iCacheLevel = pParse->iCacheLevel; ) + + assert( !ExprHasProperty(pExpr, EP_xIsSelect) && pExpr->x.pList ); + assert(pExpr->x.pList->nExpr > 0); + pEList = pExpr->x.pList; + aListelem = pEList->a; + nExpr = pEList->nExpr; + endLabel = sqlite3VdbeMakeLabel(v); + if( (pX = pExpr->pLeft)!=0 ){ + tempX = *pX; + testcase( pX->op==TK_COLUMN ); + exprToRegister(&tempX, exprCodeVector(pParse, &tempX, ®Free1)); + testcase( regFree1==0 ); + memset(&opCompare, 0, sizeof(opCompare)); + opCompare.op = TK_EQ; + opCompare.pLeft = &tempX; + pTest = &opCompare; + /* Ticket b351d95f9cd5ef17e9d9dbae18f5ca8611190001: + ** The value in regFree1 might get SCopy-ed into the file result. + ** So make sure that the regFree1 register is not reused for other + ** purposes and possibly overwritten. */ + regFree1 = 0; + } + for(i=0; iop==TK_COLUMN ); + sqlite3ExprIfFalse(pParse, pTest, nextCase, SQLITE_JUMPIFNULL); + testcase( aListelem[i+1].pExpr->op==TK_COLUMN ); + sqlite3ExprCode(pParse, aListelem[i+1].pExpr, target); + sqlite3VdbeGoto(v, endLabel); + sqlite3ExprCachePop(pParse); + sqlite3VdbeResolveLabel(v, nextCase); + } + if( (nExpr&1)!=0 ){ + sqlite3ExprCachePush(pParse); + sqlite3ExprCode(pParse, pEList->a[nExpr-1].pExpr, target); + sqlite3ExprCachePop(pParse); + }else{ + sqlite3VdbeAddOp2(v, OP_Null, 0, target); + } + assert( pParse->db->mallocFailed || pParse->nErr>0 + || pParse->iCacheLevel==iCacheLevel ); + sqlite3VdbeResolveLabel(v, endLabel); + break; + } +#ifndef SQLITE_OMIT_TRIGGER + case TK_RAISE: { + assert( pExpr->affinity==OE_Rollback + || pExpr->affinity==OE_Abort + || pExpr->affinity==OE_Fail + || pExpr->affinity==OE_Ignore + ); + if( !pParse->pTriggerTab ){ + sqlite3ErrorMsg(pParse, + "RAISE() may only be used within a trigger-program"); + return 0; + } + if( pExpr->affinity==OE_Abort ){ + sqlite3MayAbort(pParse); + } + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + if( pExpr->affinity==OE_Ignore ){ + sqlite3VdbeAddOp4( + v, OP_Halt, SQLITE_OK, OE_Ignore, 0, pExpr->u.zToken,0); + VdbeCoverage(v); + }else{ + sqlite3HaltConstraint(pParse, SQLITE_CONSTRAINT_TRIGGER, + pExpr->affinity, pExpr->u.zToken, 0, 0); + } + + break; + } +#endif + } + sqlite3ReleaseTempReg(pParse, regFree1); + sqlite3ReleaseTempReg(pParse, regFree2); + return inReg; +} + +/* +** Factor out the code of the given expression to initialization time. +*/ +SQLITE_PRIVATE void sqlite3ExprCodeAtInit( + Parse *pParse, /* Parsing context */ + Expr *pExpr, /* The expression to code when the VDBE initializes */ + int regDest, /* Store the value in this register */ + u8 reusable /* True if this expression is reusable */ +){ + ExprList *p; + assert( ConstFactorOk(pParse) ); + p = pParse->pConstExpr; + pExpr = sqlite3ExprDup(pParse->db, pExpr, 0); + p = sqlite3ExprListAppend(pParse, p, pExpr); + if( p ){ + struct ExprList_item *pItem = &p->a[p->nExpr-1]; + pItem->u.iConstExprReg = regDest; + pItem->reusable = reusable; + } + pParse->pConstExpr = p; +} + +/* +** Generate code to evaluate an expression and store the results +** into a register. Return the register number where the results +** are stored. +** +** If the register is a temporary register that can be deallocated, +** then write its number into *pReg. If the result register is not +** a temporary, then set *pReg to zero. +** +** If pExpr is a constant, then this routine might generate this +** code to fill the register in the initialization section of the +** VDBE program, in order to factor it out of the evaluation loop. +*/ +SQLITE_PRIVATE int sqlite3ExprCodeTemp(Parse *pParse, Expr *pExpr, int *pReg){ + int r2; + pExpr = sqlite3ExprSkipCollate(pExpr); + if( ConstFactorOk(pParse) + && pExpr->op!=TK_REGISTER + && sqlite3ExprIsConstantNotJoin(pExpr) + ){ + ExprList *p = pParse->pConstExpr; + int i; + *pReg = 0; + if( p ){ + struct ExprList_item *pItem; + for(pItem=p->a, i=p->nExpr; i>0; pItem++, i--){ + if( pItem->reusable && sqlite3ExprCompare(pItem->pExpr,pExpr,-1)==0 ){ + return pItem->u.iConstExprReg; + } + } + } + r2 = ++pParse->nMem; + sqlite3ExprCodeAtInit(pParse, pExpr, r2, 1); + }else{ + int r1 = sqlite3GetTempReg(pParse); + r2 = sqlite3ExprCodeTarget(pParse, pExpr, r1); + if( r2==r1 ){ + *pReg = r1; + }else{ + sqlite3ReleaseTempReg(pParse, r1); + *pReg = 0; + } + } + return r2; +} + +/* +** Generate code that will evaluate expression pExpr and store the +** results in register target. The results are guaranteed to appear +** in register target. +*/ +SQLITE_PRIVATE void sqlite3ExprCode(Parse *pParse, Expr *pExpr, int target){ + int inReg; + + assert( target>0 && target<=pParse->nMem ); + if( pExpr && pExpr->op==TK_REGISTER ){ + sqlite3VdbeAddOp2(pParse->pVdbe, OP_Copy, pExpr->iTable, target); + }else{ + inReg = sqlite3ExprCodeTarget(pParse, pExpr, target); + assert( pParse->pVdbe!=0 || pParse->db->mallocFailed ); + if( inReg!=target && pParse->pVdbe ){ + sqlite3VdbeAddOp2(pParse->pVdbe, OP_SCopy, inReg, target); + } + } +} + +/* +** Make a transient copy of expression pExpr and then code it using +** sqlite3ExprCode(). This routine works just like sqlite3ExprCode() +** except that the input expression is guaranteed to be unchanged. +*/ +SQLITE_PRIVATE void sqlite3ExprCodeCopy(Parse *pParse, Expr *pExpr, int target){ + sqlite3 *db = pParse->db; + pExpr = sqlite3ExprDup(db, pExpr, 0); + if( !db->mallocFailed ) sqlite3ExprCode(pParse, pExpr, target); + sqlite3ExprDelete(db, pExpr); +} + +/* +** Generate code that will evaluate expression pExpr and store the +** results in register target. The results are guaranteed to appear +** in register target. If the expression is constant, then this routine +** might choose to code the expression at initialization time. +*/ +SQLITE_PRIVATE void sqlite3ExprCodeFactorable(Parse *pParse, Expr *pExpr, int target){ + if( pParse->okConstFactor && sqlite3ExprIsConstant(pExpr) ){ + sqlite3ExprCodeAtInit(pParse, pExpr, target, 0); + }else{ + sqlite3ExprCode(pParse, pExpr, target); + } +} + +/* +** Generate code that evaluates the given expression and puts the result +** in register target. +** +** Also make a copy of the expression results into another "cache" register +** and modify the expression so that the next time it is evaluated, +** the result is a copy of the cache register. +** +** This routine is used for expressions that are used multiple +** times. They are evaluated once and the results of the expression +** are reused. +*/ +SQLITE_PRIVATE void sqlite3ExprCodeAndCache(Parse *pParse, Expr *pExpr, int target){ + Vdbe *v = pParse->pVdbe; + int iMem; + + assert( target>0 ); + assert( pExpr->op!=TK_REGISTER ); + sqlite3ExprCode(pParse, pExpr, target); + iMem = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Copy, target, iMem); + exprToRegister(pExpr, iMem); +} + +/* +** Generate code that pushes the value of every element of the given +** expression list into a sequence of registers beginning at target. +** +** Return the number of elements evaluated. +** +** The SQLITE_ECEL_DUP flag prevents the arguments from being +** filled using OP_SCopy. OP_Copy must be used instead. +** +** The SQLITE_ECEL_FACTOR argument allows constant arguments to be +** factored out into initialization code. +** +** The SQLITE_ECEL_REF flag means that expressions in the list with +** ExprList.a[].u.x.iOrderByCol>0 have already been evaluated and stored +** in registers at srcReg, and so the value can be copied from there. +*/ +SQLITE_PRIVATE int sqlite3ExprCodeExprList( + Parse *pParse, /* Parsing context */ + ExprList *pList, /* The expression list to be coded */ + int target, /* Where to write results */ + int srcReg, /* Source registers if SQLITE_ECEL_REF */ + u8 flags /* SQLITE_ECEL_* flags */ +){ + struct ExprList_item *pItem; + int i, j, n; + u8 copyOp = (flags & SQLITE_ECEL_DUP) ? OP_Copy : OP_SCopy; + Vdbe *v = pParse->pVdbe; + assert( pList!=0 ); + assert( target>0 ); + assert( pParse->pVdbe!=0 ); /* Never gets this far otherwise */ + n = pList->nExpr; + if( !ConstFactorOk(pParse) ) flags &= ~SQLITE_ECEL_FACTOR; + for(pItem=pList->a, i=0; ipExpr; + if( (flags & SQLITE_ECEL_REF)!=0 && (j = pList->a[i].u.x.iOrderByCol)>0 ){ + sqlite3VdbeAddOp2(v, copyOp, j+srcReg-1, target+i); + }else if( (flags & SQLITE_ECEL_FACTOR)!=0 && sqlite3ExprIsConstant(pExpr) ){ + sqlite3ExprCodeAtInit(pParse, pExpr, target+i, 0); + }else{ + int inReg = sqlite3ExprCodeTarget(pParse, pExpr, target+i); + if( inReg!=target+i ){ + VdbeOp *pOp; + if( copyOp==OP_Copy + && (pOp=sqlite3VdbeGetOp(v, -1))->opcode==OP_Copy + && pOp->p1+pOp->p3+1==inReg + && pOp->p2+pOp->p3+1==target+i + ){ + pOp->p3++; + }else{ + sqlite3VdbeAddOp2(v, copyOp, inReg, target+i); + } + } + } + } + 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 +** elimination of x. +** +** The xJumpIf parameter determines details: +** +** NULL: Store the boolean result in reg[dest] +** sqlite3ExprIfTrue: Jump to dest if true +** sqlite3ExprIfFalse: Jump to dest if false +** +** The jumpIfNull parameter is ignored if xJumpIf is NULL. +*/ +static void exprCodeBetween( + Parse *pParse, /* Parsing and code generating context */ + Expr *pExpr, /* The BETWEEN expression */ + int dest, /* Jump destination or storage location */ + void (*xJump)(Parse*,Expr*,int,int), /* Action to take */ + 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 */ + + + memset(&compLeft, 0, sizeof(Expr)); + memset(&compRight, 0, sizeof(Expr)); + memset(&exprAnd, 0, sizeof(Expr)); + + 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; + exprToRegister(&exprX, exprCodeVector(pParse, &exprX, ®Free1)); + if( xJump ){ + xJump(pParse, &exprAnd, dest, jumpIfNull); + }else{ + exprX.flags |= EP_FromJoin; + sqlite3ExprCodeTarget(pParse, &exprAnd, dest); + } + sqlite3ReleaseTempReg(pParse, regFree1); + + /* Ensure adequate test coverage */ + testcase( xJump==sqlite3ExprIfTrue && jumpIfNull==0 && regFree1==0 ); + testcase( xJump==sqlite3ExprIfTrue && jumpIfNull==0 && regFree1!=0 ); + testcase( xJump==sqlite3ExprIfTrue && jumpIfNull!=0 && regFree1==0 ); + testcase( xJump==sqlite3ExprIfTrue && jumpIfNull!=0 && regFree1!=0 ); + testcase( xJump==sqlite3ExprIfFalse && jumpIfNull==0 && regFree1==0 ); + testcase( xJump==sqlite3ExprIfFalse && jumpIfNull==0 && regFree1!=0 ); + testcase( xJump==sqlite3ExprIfFalse && jumpIfNull!=0 && regFree1==0 ); + testcase( xJump==sqlite3ExprIfFalse && jumpIfNull!=0 && regFree1!=0 ); + testcase( xJump==0 ); +} + +/* +** Generate code for a boolean expression such that a jump is made +** to the label "dest" if the expression is true but execution +** continues straight thru if the expression is false. +** +** If the expression evaluates to NULL (neither true nor false), then +** take the jump if the jumpIfNull flag is SQLITE_JUMPIFNULL. +** +** This code depends on the fact that certain token values (ex: TK_EQ) +** are the same as opcode values (ex: OP_Eq) that implement the corresponding +** operation. Special comments in vdbe.c and the mkopcodeh.awk script in +** the make process cause these values to align. Assert()s in the code +** below verify that the numbers are aligned correctly. +*/ +SQLITE_PRIVATE void sqlite3ExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){ + Vdbe *v = pParse->pVdbe; + int op = 0; + int regFree1 = 0; + int regFree2 = 0; + int r1, r2; + + assert( jumpIfNull==SQLITE_JUMPIFNULL || jumpIfNull==0 ); + if( NEVER(v==0) ) return; /* Existence of VDBE checked by caller */ + if( NEVER(pExpr==0) ) return; /* No way this can happen */ + op = pExpr->op; + switch( op ){ + case TK_AND: { + int d2 = sqlite3VdbeMakeLabel(v); + testcase( jumpIfNull==0 ); + sqlite3ExprIfFalse(pParse, pExpr->pLeft, d2,jumpIfNull^SQLITE_JUMPIFNULL); + sqlite3ExprCachePush(pParse); + sqlite3ExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull); + sqlite3VdbeResolveLabel(v, d2); + sqlite3ExprCachePop(pParse); + break; + } + case TK_OR: { + testcase( jumpIfNull==0 ); + sqlite3ExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull); + sqlite3ExprCachePush(pParse); + sqlite3ExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull); + sqlite3ExprCachePop(pParse); + break; + } + case TK_NOT: { + testcase( jumpIfNull==0 ); + sqlite3ExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull); + break; + } + case TK_IS: + case TK_ISNOT: + testcase( op==TK_IS ); + testcase( op==TK_ISNOT ); + op = (op==TK_IS) ? TK_EQ : TK_NE; + jumpIfNull = SQLITE_NULLEQ; + /* Fall thru */ + case TK_LT: + case TK_LE: + case TK_GT: + case TK_GE: + case TK_NE: + case TK_EQ: { + if( sqlite3ExprIsVector(pExpr->pLeft) ) goto default_expr; + testcase( jumpIfNull==0 ); + r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); + r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2); + codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op, + r1, r2, dest, jumpIfNull); + assert(TK_LT==OP_Lt); testcase(op==OP_Lt); VdbeCoverageIf(v,op==OP_Lt); + assert(TK_LE==OP_Le); testcase(op==OP_Le); VdbeCoverageIf(v,op==OP_Le); + assert(TK_GT==OP_Gt); testcase(op==OP_Gt); VdbeCoverageIf(v,op==OP_Gt); + assert(TK_GE==OP_Ge); testcase(op==OP_Ge); VdbeCoverageIf(v,op==OP_Ge); + assert(TK_EQ==OP_Eq); testcase(op==OP_Eq); + VdbeCoverageIf(v, op==OP_Eq && jumpIfNull==SQLITE_NULLEQ); + VdbeCoverageIf(v, op==OP_Eq && jumpIfNull!=SQLITE_NULLEQ); + assert(TK_NE==OP_Ne); testcase(op==OP_Ne); + VdbeCoverageIf(v, op==OP_Ne && jumpIfNull==SQLITE_NULLEQ); + VdbeCoverageIf(v, op==OP_Ne && jumpIfNull!=SQLITE_NULLEQ); + testcase( regFree1==0 ); + testcase( regFree2==0 ); + break; + } + case TK_ISNULL: + case TK_NOTNULL: { + assert( TK_ISNULL==OP_IsNull ); testcase( op==TK_ISNULL ); + assert( TK_NOTNULL==OP_NotNull ); testcase( op==TK_NOTNULL ); + r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); + sqlite3VdbeAddOp2(v, op, r1, dest); + VdbeCoverageIf(v, op==TK_ISNULL); + VdbeCoverageIf(v, op==TK_NOTNULL); + testcase( regFree1==0 ); + break; + } + case TK_BETWEEN: { + testcase( jumpIfNull==0 ); + exprCodeBetween(pParse, pExpr, dest, sqlite3ExprIfTrue, jumpIfNull); + break; + } +#ifndef SQLITE_OMIT_SUBQUERY + case TK_IN: { + int destIfFalse = sqlite3VdbeMakeLabel(v); + int destIfNull = jumpIfNull ? dest : destIfFalse; + sqlite3ExprCodeIN(pParse, pExpr, destIfFalse, destIfNull); + sqlite3VdbeGoto(v, dest); + sqlite3VdbeResolveLabel(v, destIfFalse); + break; + } +#endif + default: { + default_expr: + if( exprAlwaysTrue(pExpr) ){ + sqlite3VdbeGoto(v, dest); + }else if( exprAlwaysFalse(pExpr) ){ + /* No-op */ + }else{ + r1 = sqlite3ExprCodeTemp(pParse, pExpr, ®Free1); + sqlite3VdbeAddOp3(v, OP_If, r1, dest, jumpIfNull!=0); + VdbeCoverage(v); + testcase( regFree1==0 ); + testcase( jumpIfNull==0 ); + } + break; + } + } + sqlite3ReleaseTempReg(pParse, regFree1); + sqlite3ReleaseTempReg(pParse, regFree2); +} + +/* +** Generate code for a boolean expression such that a jump is made +** to the label "dest" if the expression is false but execution +** continues straight thru if the expression is true. +** +** If the expression evaluates to NULL (neither true nor false) then +** jump if jumpIfNull is SQLITE_JUMPIFNULL or fall through if jumpIfNull +** is 0. +*/ +SQLITE_PRIVATE void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){ + Vdbe *v = pParse->pVdbe; + int op = 0; + int regFree1 = 0; + int regFree2 = 0; + int r1, r2; + + assert( jumpIfNull==SQLITE_JUMPIFNULL || jumpIfNull==0 ); + if( NEVER(v==0) ) return; /* Existence of VDBE checked by caller */ + if( pExpr==0 ) return; + + /* The value of pExpr->op and op are related as follows: + ** + ** pExpr->op op + ** --------- ---------- + ** TK_ISNULL OP_NotNull + ** TK_NOTNULL OP_IsNull + ** TK_NE OP_Eq + ** TK_EQ OP_Ne + ** TK_GT OP_Le + ** TK_LE OP_Gt + ** TK_GE OP_Lt + ** TK_LT OP_Ge + ** + ** For other values of pExpr->op, op is undefined and unused. + ** The value of TK_ and OP_ constants are arranged such that we + ** can compute the mapping above using the following expression. + ** Assert()s verify that the computation is correct. + */ + op = ((pExpr->op+(TK_ISNULL&1))^1)-(TK_ISNULL&1); + + /* Verify correct alignment of TK_ and OP_ constants + */ + assert( pExpr->op!=TK_ISNULL || op==OP_NotNull ); + assert( pExpr->op!=TK_NOTNULL || op==OP_IsNull ); + assert( pExpr->op!=TK_NE || op==OP_Eq ); + assert( pExpr->op!=TK_EQ || op==OP_Ne ); + assert( pExpr->op!=TK_LT || op==OP_Ge ); + assert( pExpr->op!=TK_LE || op==OP_Gt ); + assert( pExpr->op!=TK_GT || op==OP_Le ); + assert( pExpr->op!=TK_GE || op==OP_Lt ); + + switch( pExpr->op ){ + case TK_AND: { + testcase( jumpIfNull==0 ); + sqlite3ExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull); + sqlite3ExprCachePush(pParse); + sqlite3ExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull); + sqlite3ExprCachePop(pParse); + break; + } + case TK_OR: { + int d2 = sqlite3VdbeMakeLabel(v); + testcase( jumpIfNull==0 ); + sqlite3ExprIfTrue(pParse, pExpr->pLeft, d2, jumpIfNull^SQLITE_JUMPIFNULL); + sqlite3ExprCachePush(pParse); + sqlite3ExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull); + sqlite3VdbeResolveLabel(v, d2); + sqlite3ExprCachePop(pParse); + break; + } + case TK_NOT: { + testcase( jumpIfNull==0 ); + sqlite3ExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull); + break; + } + case TK_IS: + case TK_ISNOT: + testcase( pExpr->op==TK_IS ); + testcase( pExpr->op==TK_ISNOT ); + op = (pExpr->op==TK_IS) ? TK_NE : TK_EQ; + jumpIfNull = SQLITE_NULLEQ; + /* Fall thru */ + case TK_LT: + case TK_LE: + case TK_GT: + case TK_GE: + case TK_NE: + case TK_EQ: { + if( sqlite3ExprIsVector(pExpr->pLeft) ) goto default_expr; + testcase( jumpIfNull==0 ); + r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); + r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2); + codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op, + r1, r2, dest, jumpIfNull); + assert(TK_LT==OP_Lt); testcase(op==OP_Lt); VdbeCoverageIf(v,op==OP_Lt); + assert(TK_LE==OP_Le); testcase(op==OP_Le); VdbeCoverageIf(v,op==OP_Le); + assert(TK_GT==OP_Gt); testcase(op==OP_Gt); VdbeCoverageIf(v,op==OP_Gt); + assert(TK_GE==OP_Ge); testcase(op==OP_Ge); VdbeCoverageIf(v,op==OP_Ge); + assert(TK_EQ==OP_Eq); testcase(op==OP_Eq); + VdbeCoverageIf(v, op==OP_Eq && jumpIfNull!=SQLITE_NULLEQ); + VdbeCoverageIf(v, op==OP_Eq && jumpIfNull==SQLITE_NULLEQ); + assert(TK_NE==OP_Ne); testcase(op==OP_Ne); + VdbeCoverageIf(v, op==OP_Ne && jumpIfNull!=SQLITE_NULLEQ); + VdbeCoverageIf(v, op==OP_Ne && jumpIfNull==SQLITE_NULLEQ); + testcase( regFree1==0 ); + testcase( regFree2==0 ); + break; + } + case TK_ISNULL: + case TK_NOTNULL: { + r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); + sqlite3VdbeAddOp2(v, op, r1, dest); + testcase( op==TK_ISNULL ); VdbeCoverageIf(v, op==TK_ISNULL); + testcase( op==TK_NOTNULL ); VdbeCoverageIf(v, op==TK_NOTNULL); + testcase( regFree1==0 ); + break; + } + case TK_BETWEEN: { + testcase( jumpIfNull==0 ); + exprCodeBetween(pParse, pExpr, dest, sqlite3ExprIfFalse, jumpIfNull); + break; + } +#ifndef SQLITE_OMIT_SUBQUERY + case TK_IN: { + if( jumpIfNull ){ + sqlite3ExprCodeIN(pParse, pExpr, dest, dest); + }else{ + int destIfNull = sqlite3VdbeMakeLabel(v); + sqlite3ExprCodeIN(pParse, pExpr, dest, destIfNull); + sqlite3VdbeResolveLabel(v, destIfNull); + } + break; + } +#endif + default: { + default_expr: + if( exprAlwaysFalse(pExpr) ){ + sqlite3VdbeGoto(v, dest); + }else if( exprAlwaysTrue(pExpr) ){ + /* no-op */ + }else{ + r1 = sqlite3ExprCodeTemp(pParse, pExpr, ®Free1); + sqlite3VdbeAddOp3(v, OP_IfNot, r1, dest, jumpIfNull!=0); + VdbeCoverage(v); + testcase( regFree1==0 ); + testcase( jumpIfNull==0 ); + } + break; + } + } + sqlite3ReleaseTempReg(pParse, regFree1); + sqlite3ReleaseTempReg(pParse, regFree2); +} + +/* +** Like sqlite3ExprIfFalse() except that a copy is made of pExpr before +** code generation, and that copy is deleted after code generation. This +** ensures that the original pExpr is unchanged. +*/ +SQLITE_PRIVATE void sqlite3ExprIfFalseDup(Parse *pParse, Expr *pExpr, int dest,int jumpIfNull){ + sqlite3 *db = pParse->db; + Expr *pCopy = sqlite3ExprDup(db, pExpr, 0); + if( db->mallocFailed==0 ){ + sqlite3ExprIfFalse(pParse, pCopy, dest, jumpIfNull); + } + sqlite3ExprDelete(db, pCopy); +} + + +/* +** Do a deep comparison of two expression trees. Return 0 if the two +** expressions are completely identical. Return 1 if they differ only +** by a COLLATE operator at the top level. Return 2 if there are differences +** other than the top-level COLLATE operator. +** +** If any subelement of pB has Expr.iTable==(-1) then it is allowed +** to compare equal to an equivalent element in pA with Expr.iTable==iTab. +** +** The pA side might be using TK_REGISTER. If that is the case and pB is +** not using TK_REGISTER but is otherwise equivalent, then still return 0. +** +** Sometimes this routine will return 2 even if the two expressions +** really are equivalent. If we cannot prove that the expressions are +** identical, we return 2 just to be safe. So if this routine +** returns 2, then you do not really know for certain if the two +** expressions are the same. But if you get a 0 or 1 return, then you +** can be sure the expressions are the same. In the places where +** this routine is used, it does not hurt to get an extra 2 - that +** just might result in some slightly slower code. But returning +** an incorrect 0 or 1 could lead to a malfunction. +*/ +SQLITE_PRIVATE int sqlite3ExprCompare(Expr *pA, Expr *pB, int iTab){ + u32 combinedFlags; + if( pA==0 || pB==0 ){ + return pB==pA ? 0 : 2; + } + combinedFlags = pA->flags | pB->flags; + if( combinedFlags & EP_IntValue ){ + if( (pA->flags&pB->flags&EP_IntValue)!=0 && pA->u.iValue==pB->u.iValue ){ + return 0; + } + return 2; + } + if( pA->op!=pB->op ){ + if( pA->op==TK_COLLATE && sqlite3ExprCompare(pA->pLeft, pB, iTab)<2 ){ + return 1; + } + if( pB->op==TK_COLLATE && sqlite3ExprCompare(pA, pB->pLeft, iTab)<2 ){ + return 1; + } + return 2; + } + if( pA->op!=TK_COLUMN && pA->op!=TK_AGG_COLUMN && pA->u.zToken ){ + if( pA->op==TK_FUNCTION ){ + if( sqlite3StrICmp(pA->u.zToken,pB->u.zToken)!=0 ) return 2; + }else if( strcmp(pA->u.zToken,pB->u.zToken)!=0 ){ + return pA->op==TK_COLLATE ? 1 : 2; + } + } + if( (pA->flags & EP_Distinct)!=(pB->flags & EP_Distinct) ) return 2; + if( ALWAYS((combinedFlags & EP_TokenOnly)==0) ){ + if( combinedFlags & EP_xIsSelect ) return 2; + if( sqlite3ExprCompare(pA->pLeft, pB->pLeft, iTab) ) return 2; + if( sqlite3ExprCompare(pA->pRight, pB->pRight, iTab) ) return 2; + if( sqlite3ExprListCompare(pA->x.pList, pB->x.pList, iTab) ) return 2; + if( ALWAYS((combinedFlags & EP_Reduced)==0) && pA->op!=TK_STRING ){ + if( pA->iColumn!=pB->iColumn ) return 2; + if( pA->iTable!=pB->iTable + && (pA->iTable!=iTab || NEVER(pB->iTable>=0)) ) return 2; + } + } + return 0; +} + +/* +** Compare two ExprList objects. Return 0 if they are identical and +** non-zero if they differ in any way. +** +** If any subelement of pB has Expr.iTable==(-1) then it is allowed +** to compare equal to an equivalent element in pA with Expr.iTable==iTab. +** +** This routine might return non-zero for equivalent ExprLists. The +** only consequence will be disabled optimizations. But this routine +** must never return 0 if the two ExprList objects are different, or +** a malfunction will result. +** +** Two NULL pointers are considered to be the same. But a NULL pointer +** always differs from a non-NULL pointer. +*/ +SQLITE_PRIVATE int sqlite3ExprListCompare(ExprList *pA, ExprList *pB, int iTab){ + int i; + if( pA==0 && pB==0 ) return 0; + if( pA==0 || pB==0 ) return 1; + if( pA->nExpr!=pB->nExpr ) return 1; + for(i=0; inExpr; i++){ + Expr *pExprA = pA->a[i].pExpr; + Expr *pExprB = pB->a[i].pExpr; + if( pA->a[i].sortOrder!=pB->a[i].sortOrder ) return 1; + if( sqlite3ExprCompare(pExprA, pExprB, iTab) ) return 1; + } + return 0; +} + +/* +** Return true if we can prove the pE2 will always be true if pE1 is +** true. Return false if we cannot complete the proof or if pE2 might +** be false. Examples: +** +** pE1: x==5 pE2: x==5 Result: true +** pE1: x>0 pE2: x==5 Result: false +** pE1: x=21 pE2: x=21 OR y=43 Result: true +** pE1: x!=123 pE2: x IS NOT NULL Result: true +** pE1: x!=?1 pE2: x IS NOT NULL Result: true +** pE1: x IS NULL pE2: x IS NOT NULL Result: false +** pE1: x IS ?2 pE2: x IS NOT NULL Reuslt: false +** +** When comparing TK_COLUMN nodes between pE1 and pE2, if pE2 has +** Expr.iTable<0 then assume a table number given by iTab. +** +** When in doubt, return false. Returning true might give a performance +** improvement. Returning false might cause a performance reduction, but +** it will always give the correct answer and is hence always safe. +*/ +SQLITE_PRIVATE int sqlite3ExprImpliesExpr(Expr *pE1, Expr *pE2, int iTab){ + if( sqlite3ExprCompare(pE1, pE2, iTab)==0 ){ + return 1; + } + if( pE2->op==TK_OR + && (sqlite3ExprImpliesExpr(pE1, pE2->pLeft, iTab) + || sqlite3ExprImpliesExpr(pE1, pE2->pRight, iTab) ) + ){ + return 1; + } + if( pE2->op==TK_NOTNULL + && sqlite3ExprCompare(pE1->pLeft, pE2->pLeft, iTab)==0 + && (pE1->op!=TK_ISNULL && pE1->op!=TK_IS) + ){ + return 1; + } + return 0; +} + +/* +** An instance of the following structure is used by the tree walker +** to determine if an expression can be evaluated by reference to the +** index only, without having to do a search for the corresponding +** table entry. The IdxCover.pIdx field is the index. IdxCover.iCur +** is the cursor for the table. +*/ +struct IdxCover { + Index *pIdx; /* The index to be tested for coverage */ + int iCur; /* Cursor number for the table corresponding to the index */ +}; + +/* +** Check to see if there are references to columns in table +** pWalker->u.pIdxCover->iCur can be satisfied using the index +** pWalker->u.pIdxCover->pIdx. +*/ +static int exprIdxCover(Walker *pWalker, Expr *pExpr){ + if( pExpr->op==TK_COLUMN + && pExpr->iTable==pWalker->u.pIdxCover->iCur + && sqlite3ColumnOfIndex(pWalker->u.pIdxCover->pIdx, pExpr->iColumn)<0 + ){ + pWalker->eCode = 1; + return WRC_Abort; + } + return WRC_Continue; +} + +/* +** Determine if an index pIdx on table with cursor iCur contains will +** the expression pExpr. Return true if the index does cover the +** expression and false if the pExpr expression references table columns +** that are not found in the index pIdx. +** +** An index covering an expression means that the expression can be +** evaluated using only the index and without having to lookup the +** corresponding table entry. +*/ +SQLITE_PRIVATE int sqlite3ExprCoveredByIndex( + Expr *pExpr, /* The index to be tested */ + int iCur, /* The cursor number for the corresponding table */ + Index *pIdx /* The index that might be used for coverage */ +){ + Walker w; + struct IdxCover xcov; + memset(&w, 0, sizeof(w)); + xcov.iCur = iCur; + xcov.pIdx = pIdx; + w.xExprCallback = exprIdxCover; + w.u.pIdxCover = &xcov; + sqlite3WalkExpr(&w, pExpr); + return !w.eCode; +} + + +/* +** An instance of the following structure is used by the tree walker +** to count references to table columns in the arguments of an +** aggregate function, in order to implement the +** sqlite3FunctionThisSrc() routine. +*/ +struct SrcCount { + SrcList *pSrc; /* One particular FROM clause in a nested query */ + int nThis; /* Number of references to columns in pSrcList */ + int nOther; /* Number of references to columns in other FROM clauses */ +}; + +/* +** Count the number of references to columns. +*/ +static int exprSrcCount(Walker *pWalker, Expr *pExpr){ + /* The NEVER() on the second term is because sqlite3FunctionUsesThisSrc() + ** is always called before sqlite3ExprAnalyzeAggregates() and so the + ** TK_COLUMNs have not yet been converted into TK_AGG_COLUMN. If + ** sqlite3FunctionUsesThisSrc() is used differently in the future, the + ** NEVER() will need to be removed. */ + if( pExpr->op==TK_COLUMN || NEVER(pExpr->op==TK_AGG_COLUMN) ){ + int i; + struct SrcCount *p = pWalker->u.pSrcCount; + SrcList *pSrc = p->pSrc; + int nSrc = pSrc ? pSrc->nSrc : 0; + for(i=0; iiTable==pSrc->a[i].iCursor ) break; + } + if( inThis++; + }else{ + p->nOther++; + } + } + return WRC_Continue; +} + +/* +** Determine if any of the arguments to the pExpr Function reference +** pSrcList. Return true if they do. Also return true if the function +** has no arguments or has only constant arguments. Return false if pExpr +** references columns but not columns of tables found in pSrcList. +*/ +SQLITE_PRIVATE int sqlite3FunctionUsesThisSrc(Expr *pExpr, SrcList *pSrcList){ + Walker w; + struct SrcCount cnt; + assert( pExpr->op==TK_AGG_FUNCTION ); + memset(&w, 0, sizeof(w)); + w.xExprCallback = exprSrcCount; + w.u.pSrcCount = &cnt; + cnt.pSrc = pSrcList; + cnt.nThis = 0; + cnt.nOther = 0; + sqlite3WalkExprList(&w, pExpr->x.pList); + return cnt.nThis>0 || cnt.nOther==0; +} + +/* +** Add a new element to the pAggInfo->aCol[] array. Return the index of +** the new element. Return a negative number if malloc fails. +*/ +static int addAggInfoColumn(sqlite3 *db, AggInfo *pInfo){ + int i; + pInfo->aCol = sqlite3ArrayAllocate( + db, + pInfo->aCol, + sizeof(pInfo->aCol[0]), + &pInfo->nColumn, + &i + ); + return i; +} + +/* +** Add a new element to the pAggInfo->aFunc[] array. Return the index of +** the new element. Return a negative number if malloc fails. +*/ +static int addAggInfoFunc(sqlite3 *db, AggInfo *pInfo){ + int i; + pInfo->aFunc = sqlite3ArrayAllocate( + db, + pInfo->aFunc, + sizeof(pInfo->aFunc[0]), + &pInfo->nFunc, + &i + ); + return i; +} + +/* +** This is the xExprCallback for a tree walker. It is used to +** implement sqlite3ExprAnalyzeAggregates(). See sqlite3ExprAnalyzeAggregates +** for additional information. +*/ +static int analyzeAggregate(Walker *pWalker, Expr *pExpr){ + int i; + NameContext *pNC = pWalker->u.pNC; + Parse *pParse = pNC->pParse; + SrcList *pSrcList = pNC->pSrcList; + AggInfo *pAggInfo = pNC->pAggInfo; + + switch( pExpr->op ){ + case TK_AGG_COLUMN: + case TK_COLUMN: { + testcase( pExpr->op==TK_AGG_COLUMN ); + testcase( pExpr->op==TK_COLUMN ); + /* Check to see if the column is in one of the tables in the FROM + ** clause of the aggregate query */ + if( ALWAYS(pSrcList!=0) ){ + struct SrcList_item *pItem = pSrcList->a; + for(i=0; inSrc; i++, pItem++){ + struct AggInfo_col *pCol; + assert( !ExprHasProperty(pExpr, EP_TokenOnly|EP_Reduced) ); + if( pExpr->iTable==pItem->iCursor ){ + /* If we reach this point, it means that pExpr refers to a table + ** that is in the FROM clause of the aggregate query. + ** + ** Make an entry for the column in pAggInfo->aCol[] if there + ** is not an entry there already. + */ + int k; + pCol = pAggInfo->aCol; + for(k=0; knColumn; k++, pCol++){ + if( pCol->iTable==pExpr->iTable && + pCol->iColumn==pExpr->iColumn ){ + break; + } + } + if( (k>=pAggInfo->nColumn) + && (k = addAggInfoColumn(pParse->db, pAggInfo))>=0 + ){ + pCol = &pAggInfo->aCol[k]; + pCol->pTab = pExpr->pTab; + pCol->iTable = pExpr->iTable; + pCol->iColumn = pExpr->iColumn; + pCol->iMem = ++pParse->nMem; + pCol->iSorterColumn = -1; + pCol->pExpr = pExpr; + if( pAggInfo->pGroupBy ){ + int j, n; + ExprList *pGB = pAggInfo->pGroupBy; + struct ExprList_item *pTerm = pGB->a; + n = pGB->nExpr; + for(j=0; jpExpr; + if( pE->op==TK_COLUMN && pE->iTable==pExpr->iTable && + pE->iColumn==pExpr->iColumn ){ + pCol->iSorterColumn = j; + break; + } + } + } + if( pCol->iSorterColumn<0 ){ + pCol->iSorterColumn = pAggInfo->nSortingColumn++; + } + } + /* There is now an entry for pExpr in pAggInfo->aCol[] (either + ** because it was there before or because we just created it). + ** Convert the pExpr to be a TK_AGG_COLUMN referring to that + ** pAggInfo->aCol[] entry. + */ + ExprSetVVAProperty(pExpr, EP_NoReduce); + pExpr->pAggInfo = pAggInfo; + pExpr->op = TK_AGG_COLUMN; + pExpr->iAgg = (i16)k; + break; + } /* endif pExpr->iTable==pItem->iCursor */ + } /* end loop over pSrcList */ + } + return WRC_Prune; + } + case TK_AGG_FUNCTION: { + if( (pNC->ncFlags & NC_InAggFunc)==0 + && pWalker->walkerDepth==pExpr->op2 + ){ + /* Check to see if pExpr is a duplicate of another aggregate + ** function that is already in the pAggInfo structure + */ + struct AggInfo_func *pItem = pAggInfo->aFunc; + for(i=0; inFunc; i++, pItem++){ + if( sqlite3ExprCompare(pItem->pExpr, pExpr, -1)==0 ){ + break; + } + } + if( i>=pAggInfo->nFunc ){ + /* pExpr is original. Make a new entry in pAggInfo->aFunc[] + */ + u8 enc = ENC(pParse->db); + i = addAggInfoFunc(pParse->db, pAggInfo); + if( i>=0 ){ + assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); + pItem = &pAggInfo->aFunc[i]; + pItem->pExpr = pExpr; + pItem->iMem = ++pParse->nMem; + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + pItem->pFunc = sqlite3FindFunction(pParse->db, + pExpr->u.zToken, + pExpr->x.pList ? pExpr->x.pList->nExpr : 0, enc, 0); + if( pExpr->flags & EP_Distinct ){ + pItem->iDistinct = pParse->nTab++; + }else{ + pItem->iDistinct = -1; + } + } + } + /* Make pExpr point to the appropriate pAggInfo->aFunc[] entry + */ + assert( !ExprHasProperty(pExpr, EP_TokenOnly|EP_Reduced) ); + ExprSetVVAProperty(pExpr, EP_NoReduce); + pExpr->iAgg = (i16)i; + pExpr->pAggInfo = pAggInfo; + return WRC_Prune; + }else{ + return WRC_Continue; + } + } + } + return WRC_Continue; +} +static int analyzeAggregatesInSelect(Walker *pWalker, Select *pSelect){ + UNUSED_PARAMETER(pWalker); + UNUSED_PARAMETER(pSelect); + return WRC_Continue; +} + +/* +** Analyze the pExpr expression looking for aggregate functions and +** for variables that need to be added to AggInfo object that pNC->pAggInfo +** points to. Additional entries are made on the AggInfo object as +** necessary. +** +** This routine should only be called after the expression has been +** analyzed by sqlite3ResolveExprNames(). +*/ +SQLITE_PRIVATE void sqlite3ExprAnalyzeAggregates(NameContext *pNC, Expr *pExpr){ + Walker w; + memset(&w, 0, sizeof(w)); + w.xExprCallback = analyzeAggregate; + w.xSelectCallback = analyzeAggregatesInSelect; + w.u.pNC = pNC; + assert( pNC->pSrcList!=0 ); + sqlite3WalkExpr(&w, pExpr); +} + +/* +** Call sqlite3ExprAnalyzeAggregates() for every expression in an +** expression list. Return the number of errors. +** +** If an error is found, the analysis is cut short. +*/ +SQLITE_PRIVATE void sqlite3ExprAnalyzeAggList(NameContext *pNC, ExprList *pList){ + struct ExprList_item *pItem; + int i; + if( pList ){ + for(pItem=pList->a, i=0; inExpr; i++, pItem++){ + sqlite3ExprAnalyzeAggregates(pNC, pItem->pExpr); + } + } +} + +/* +** Allocate a single new register for use to hold some intermediate result. +*/ +SQLITE_PRIVATE int sqlite3GetTempReg(Parse *pParse){ + if( pParse->nTempReg==0 ){ + return ++pParse->nMem; + } + return pParse->aTempReg[--pParse->nTempReg]; +} + +/* +** Deallocate a register, making available for reuse for some other +** purpose. +** +** If a register is currently being used by the column cache, then +** the deallocation is deferred until the column cache line that uses +** the register becomes stale. +*/ +SQLITE_PRIVATE void sqlite3ReleaseTempReg(Parse *pParse, int iReg){ + if( iReg && pParse->nTempRegaTempReg) ){ + int i; + struct yColCache *p; + for(i=0, p=pParse->aColCache; inColCache; i++, p++){ + if( p->iReg==iReg ){ + p->tempReg = 1; + return; + } + } + pParse->aTempReg[pParse->nTempReg++] = iReg; + } +} + +/* +** Allocate or deallocate a block of nReg consecutive registers. +*/ +SQLITE_PRIVATE int sqlite3GetTempRange(Parse *pParse, int nReg){ + int i, n; + if( nReg==1 ) return sqlite3GetTempReg(pParse); + i = pParse->iRangeReg; + n = pParse->nRangeReg; + if( nReg<=n ){ + assert( !usedAsColumnCache(pParse, i, i+n-1) ); + pParse->iRangeReg += nReg; + pParse->nRangeReg -= nReg; + }else{ + i = pParse->nMem+1; + pParse->nMem += nReg; + } + return i; +} +SQLITE_PRIVATE void sqlite3ReleaseTempRange(Parse *pParse, int iReg, int nReg){ + if( nReg==1 ){ + sqlite3ReleaseTempReg(pParse, iReg); + return; + } + sqlite3ExprCacheRemove(pParse, iReg, nReg); + if( nReg>pParse->nRangeReg ){ + pParse->nRangeReg = nReg; + pParse->iRangeReg = iReg; + } +} + +/* +** Mark all temporary registers as being unavailable for reuse. +*/ +SQLITE_PRIVATE void sqlite3ClearTempRegCache(Parse *pParse){ + pParse->nTempReg = 0; + pParse->nRangeReg = 0; +} + +/* +** Validate that no temporary register falls within the range of +** iFirst..iLast, inclusive. This routine is only call from within assert() +** statements. +*/ +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE int sqlite3NoTempsInRange(Parse *pParse, int iFirst, int iLast){ + int i; + if( pParse->nRangeReg>0 + && pParse->iRangeReg+pParse->nRangeRegiRangeReg>=iFirst + ){ + return 0; + } + for(i=0; inTempReg; i++){ + if( pParse->aTempReg[i]>=iFirst && pParse->aTempReg[i]<=iLast ){ + return 0; + } + } + return 1; +} +#endif /* SQLITE_DEBUG */ + +/************** End of expr.c ************************************************/ +/************** Begin file alter.c *******************************************/ +/* +** 2005 February 15 +** +** 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 C code routines that used to generate VDBE code +** that implements the ALTER TABLE command. +*/ +/* #include "sqliteInt.h" */ + +/* +** The code in this file only exists if we are not omitting the +** ALTER TABLE logic from the build. +*/ +#ifndef SQLITE_OMIT_ALTERTABLE + + +/* +** This function is used by SQL generated to implement the +** ALTER TABLE command. The first argument is the text of a CREATE TABLE or +** CREATE INDEX command. The second is a table name. The table name in +** the CREATE TABLE or CREATE INDEX statement is replaced with the third +** argument and the result returned. Examples: +** +** sqlite_rename_table('CREATE TABLE abc(a, b, c)', 'def') +** -> 'CREATE TABLE def(a, b, c)' +** +** sqlite_rename_table('CREATE INDEX i ON abc(a)', 'def') +** -> 'CREATE INDEX i ON def(a, b, c)' +*/ +static void renameTableFunc( + sqlite3_context *context, + int NotUsed, + sqlite3_value **argv +){ + unsigned char const *zSql = sqlite3_value_text(argv[0]); + unsigned char const *zTableName = sqlite3_value_text(argv[1]); + + int token; + Token tname; + unsigned char const *zCsr = zSql; + int len = 0; + char *zRet; + + sqlite3 *db = sqlite3_context_db_handle(context); + + UNUSED_PARAMETER(NotUsed); + + /* The principle used to locate the table name in the CREATE TABLE + ** statement is that the table name is the first non-space token that + ** is immediately followed by a TK_LP or TK_USING token. + */ + if( zSql ){ + do { + if( !*zCsr ){ + /* Ran out of input before finding an opening bracket. Return NULL. */ + return; + } + + /* Store the token that zCsr points to in tname. */ + tname.z = (char*)zCsr; + tname.n = len; + + /* Advance zCsr to the next token. Store that token type in 'token', + ** and its length in 'len' (to be used next iteration of this loop). + */ + do { + zCsr += len; + len = sqlite3GetToken(zCsr, &token); + } while( token==TK_SPACE ); + assert( len>0 ); + } while( token!=TK_LP && token!=TK_USING ); + + zRet = sqlite3MPrintf(db, "%.*s\"%w\"%s", (int)(((u8*)tname.z) - zSql), + zSql, zTableName, tname.z+tname.n); + sqlite3_result_text(context, zRet, -1, SQLITE_DYNAMIC); + } +} + +/* +** This C function implements an SQL user function that is used by SQL code +** generated by the ALTER TABLE ... RENAME command to modify the definition +** of any foreign key constraints that use the table being renamed as the +** parent table. It is passed three arguments: +** +** 1) The complete text of the CREATE TABLE statement being modified, +** 2) The old name of the table being renamed, and +** 3) The new name of the table being renamed. +** +** It returns the new CREATE TABLE statement. For example: +** +** sqlite_rename_parent('CREATE TABLE t1(a REFERENCES t2)', 't2', 't3') +** -> 'CREATE TABLE t1(a REFERENCES t3)' +*/ +#ifndef SQLITE_OMIT_FOREIGN_KEY +static void renameParentFunc( + sqlite3_context *context, + int NotUsed, + sqlite3_value **argv +){ + sqlite3 *db = sqlite3_context_db_handle(context); + char *zOutput = 0; + char *zResult; + unsigned char const *zInput = sqlite3_value_text(argv[0]); + unsigned char const *zOld = sqlite3_value_text(argv[1]); + unsigned char const *zNew = sqlite3_value_text(argv[2]); + + unsigned const char *z; /* Pointer to token */ + int n; /* Length of token z */ + int token; /* Type of token */ + + UNUSED_PARAMETER(NotUsed); + if( zInput==0 || zOld==0 ) return; + for(z=zInput; *z; z=z+n){ + n = sqlite3GetToken(z, &token); + if( token==TK_REFERENCES ){ + char *zParent; + do { + z += n; + n = sqlite3GetToken(z, &token); + }while( token==TK_SPACE ); + + if( token==TK_ILLEGAL ) break; + zParent = sqlite3DbStrNDup(db, (const char *)z, n); + if( zParent==0 ) break; + sqlite3Dequote(zParent); + if( 0==sqlite3StrICmp((const char *)zOld, zParent) ){ + char *zOut = sqlite3MPrintf(db, "%s%.*s\"%w\"", + (zOutput?zOutput:""), (int)(z-zInput), zInput, (const char *)zNew + ); + sqlite3DbFree(db, zOutput); + zOutput = zOut; + zInput = &z[n]; + } + sqlite3DbFree(db, zParent); + } + } + + zResult = sqlite3MPrintf(db, "%s%s", (zOutput?zOutput:""), zInput), + sqlite3_result_text(context, zResult, -1, SQLITE_DYNAMIC); + sqlite3DbFree(db, zOutput); +} +#endif + +#ifndef SQLITE_OMIT_TRIGGER +/* This function is used by SQL generated to implement the +** ALTER TABLE command. The first argument is the text of a CREATE TRIGGER +** statement. The second is a table name. The table name in the CREATE +** TRIGGER statement is replaced with the third argument and the result +** returned. This is analagous to renameTableFunc() above, except for CREATE +** TRIGGER, not CREATE INDEX and CREATE TABLE. +*/ +static void renameTriggerFunc( + sqlite3_context *context, + int NotUsed, + sqlite3_value **argv +){ + unsigned char const *zSql = sqlite3_value_text(argv[0]); + unsigned char const *zTableName = sqlite3_value_text(argv[1]); + + int token; + Token tname; + int dist = 3; + unsigned char const *zCsr = zSql; + int len = 0; + char *zRet; + sqlite3 *db = sqlite3_context_db_handle(context); + + UNUSED_PARAMETER(NotUsed); + + /* The principle used to locate the table name in the CREATE TRIGGER + ** statement is that the table name is the first token that is immediately + ** preceded by either TK_ON or TK_DOT and immediately followed by one + ** of TK_WHEN, TK_BEGIN or TK_FOR. + */ + if( zSql ){ + do { + + if( !*zCsr ){ + /* Ran out of input before finding the table name. Return NULL. */ + return; + } + + /* Store the token that zCsr points to in tname. */ + tname.z = (char*)zCsr; + tname.n = len; + + /* Advance zCsr to the next token. Store that token type in 'token', + ** and its length in 'len' (to be used next iteration of this loop). + */ + do { + zCsr += len; + len = sqlite3GetToken(zCsr, &token); + }while( token==TK_SPACE ); + assert( len>0 ); + + /* Variable 'dist' stores the number of tokens read since the most + ** recent TK_DOT or TK_ON. This means that when a WHEN, FOR or BEGIN + ** token is read and 'dist' equals 2, the condition stated above + ** to be met. + ** + ** Note that ON cannot be a database, table or column name, so + ** there is no need to worry about syntax like + ** "CREATE TRIGGER ... ON ON.ON BEGIN ..." etc. + */ + dist++; + if( token==TK_DOT || token==TK_ON ){ + dist = 0; + } + } while( dist!=2 || (token!=TK_WHEN && token!=TK_FOR && token!=TK_BEGIN) ); + + /* Variable tname now contains the token that is the old table-name + ** in the CREATE TRIGGER statement. + */ + zRet = sqlite3MPrintf(db, "%.*s\"%w\"%s", (int)(((u8*)tname.z) - zSql), + zSql, zTableName, tname.z+tname.n); + sqlite3_result_text(context, zRet, -1, SQLITE_DYNAMIC); + } +} +#endif /* !SQLITE_OMIT_TRIGGER */ + +/* +** Register built-in functions used to help implement ALTER TABLE +*/ +SQLITE_PRIVATE void sqlite3AlterFunctions(void){ + static FuncDef aAlterTableFuncs[] = { + FUNCTION(sqlite_rename_table, 2, 0, 0, renameTableFunc), +#ifndef SQLITE_OMIT_TRIGGER + FUNCTION(sqlite_rename_trigger, 2, 0, 0, renameTriggerFunc), +#endif +#ifndef SQLITE_OMIT_FOREIGN_KEY + FUNCTION(sqlite_rename_parent, 3, 0, 0, renameParentFunc), +#endif + }; + sqlite3InsertBuiltinFuncs(aAlterTableFuncs, ArraySize(aAlterTableFuncs)); +} + +/* +** This function is used to create the text of expressions of the form: +** +** name= OR name= OR ... +** +** If argument zWhere is NULL, then a pointer string containing the text +** "name=" is returned, where is the quoted version +** of the string passed as argument zConstant. The returned buffer is +** allocated using sqlite3DbMalloc(). It is the responsibility of the +** caller to ensure that it is eventually freed. +** +** If argument zWhere is not NULL, then the string returned is +** " OR name=", where is the contents of zWhere. +** In this case zWhere is passed to sqlite3DbFree() before returning. +** +*/ +static char *whereOrName(sqlite3 *db, char *zWhere, char *zConstant){ + char *zNew; + if( !zWhere ){ + zNew = sqlite3MPrintf(db, "name=%Q", zConstant); + }else{ + zNew = sqlite3MPrintf(db, "%s OR name=%Q", zWhere, zConstant); + sqlite3DbFree(db, zWhere); + } + return zNew; +} + +#if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER) +/* +** Generate the text of a WHERE expression which can be used to select all +** tables that have foreign key constraints that refer to table pTab (i.e. +** constraints for which pTab is the parent table) from the sqlite_master +** table. +*/ +static char *whereForeignKeys(Parse *pParse, Table *pTab){ + FKey *p; + char *zWhere = 0; + for(p=sqlite3FkReferences(pTab); p; p=p->pNextTo){ + zWhere = whereOrName(pParse->db, zWhere, p->pFrom->zName); + } + return zWhere; +} +#endif + +/* +** Generate the text of a WHERE expression which can be used to select all +** temporary triggers on table pTab from the sqlite_temp_master table. If +** table pTab has no temporary triggers, or is itself stored in the +** temporary database, NULL is returned. +*/ +static char *whereTempTriggers(Parse *pParse, Table *pTab){ + Trigger *pTrig; + char *zWhere = 0; + const Schema *pTempSchema = pParse->db->aDb[1].pSchema; /* Temp db schema */ + + /* If the table is not located in the temp-db (in which case NULL is + ** returned, loop through the tables list of triggers. For each trigger + ** that is not part of the temp-db schema, add a clause to the WHERE + ** expression being built up in zWhere. + */ + if( pTab->pSchema!=pTempSchema ){ + sqlite3 *db = pParse->db; + for(pTrig=sqlite3TriggerList(pParse, pTab); pTrig; pTrig=pTrig->pNext){ + if( pTrig->pSchema==pTempSchema ){ + zWhere = whereOrName(db, zWhere, pTrig->zName); + } + } + } + if( zWhere ){ + char *zNew = sqlite3MPrintf(pParse->db, "type='trigger' AND (%s)", zWhere); + sqlite3DbFree(pParse->db, zWhere); + zWhere = zNew; + } + return zWhere; +} + +/* +** Generate code to drop and reload the internal representation of table +** pTab from the database, including triggers and temporary triggers. +** Argument zName is the name of the table in the database schema at +** the time the generated code is executed. This can be different from +** pTab->zName if this function is being called to code part of an +** "ALTER TABLE RENAME TO" statement. +*/ +static void reloadTableSchema(Parse *pParse, Table *pTab, const char *zName){ + Vdbe *v; + char *zWhere; + int iDb; /* Index of database containing pTab */ +#ifndef SQLITE_OMIT_TRIGGER + Trigger *pTrig; +#endif + + v = sqlite3GetVdbe(pParse); + if( NEVER(v==0) ) return; + assert( sqlite3BtreeHoldsAllMutexes(pParse->db) ); + iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); + assert( iDb>=0 ); + +#ifndef SQLITE_OMIT_TRIGGER + /* Drop any table triggers from the internal schema. */ + for(pTrig=sqlite3TriggerList(pParse, pTab); pTrig; pTrig=pTrig->pNext){ + int iTrigDb = sqlite3SchemaToIndex(pParse->db, pTrig->pSchema); + assert( iTrigDb==iDb || iTrigDb==1 ); + sqlite3VdbeAddOp4(v, OP_DropTrigger, iTrigDb, 0, 0, pTrig->zName, 0); + } +#endif + + /* Drop the table and index from the internal schema. */ + sqlite3VdbeAddOp4(v, OP_DropTable, iDb, 0, 0, pTab->zName, 0); + + /* Reload the table, index and permanent trigger schemas. */ + zWhere = sqlite3MPrintf(pParse->db, "tbl_name=%Q", zName); + if( !zWhere ) return; + sqlite3VdbeAddParseSchemaOp(v, iDb, zWhere); + +#ifndef SQLITE_OMIT_TRIGGER + /* Now, if the table is not stored in the temp database, reload any temp + ** triggers. Don't use IN(...) in case SQLITE_OMIT_SUBQUERY is defined. + */ + if( (zWhere=whereTempTriggers(pParse, pTab))!=0 ){ + sqlite3VdbeAddParseSchemaOp(v, 1, zWhere); + } +#endif +} + +/* +** Parameter zName is the name of a table that is about to be altered +** (either with ALTER TABLE ... RENAME TO or ALTER TABLE ... ADD COLUMN). +** If the table is a system table, this function leaves an error message +** in pParse->zErr (system tables may not be altered) and returns non-zero. +** +** Or, if zName is not a system table, zero is returned. +*/ +static int isSystemTable(Parse *pParse, const char *zName){ + if( sqlite3Strlen30(zName)>6 && 0==sqlite3StrNICmp(zName, "sqlite_", 7) ){ + sqlite3ErrorMsg(pParse, "table %s may not be altered", zName); + return 1; + } + return 0; +} + +/* +** Generate code to implement the "ALTER TABLE xxx RENAME TO yyy" +** command. +*/ +SQLITE_PRIVATE void sqlite3AlterRenameTable( + Parse *pParse, /* Parser context. */ + SrcList *pSrc, /* The table to rename. */ + Token *pName /* The new table name. */ +){ + int iDb; /* Database that contains the table */ + char *zDb; /* Name of database iDb */ + Table *pTab; /* Table being renamed */ + char *zName = 0; /* NULL-terminated version of pName */ + sqlite3 *db = pParse->db; /* Database connection */ + int nTabName; /* Number of UTF-8 characters in zTabName */ + const char *zTabName; /* Original name of the table */ + Vdbe *v; +#ifndef SQLITE_OMIT_TRIGGER + char *zWhere = 0; /* Where clause to locate temp triggers */ +#endif + VTable *pVTab = 0; /* Non-zero if this is a v-tab with an xRename() */ + int savedDbFlags; /* Saved value of db->flags */ + + savedDbFlags = db->flags; + if( NEVER(db->mallocFailed) ) goto exit_rename_table; + assert( pSrc->nSrc==1 ); + assert( sqlite3BtreeHoldsAllMutexes(pParse->db) ); + + pTab = sqlite3LocateTableItem(pParse, 0, &pSrc->a[0]); + if( !pTab ) goto exit_rename_table; + iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); + zDb = db->aDb[iDb].zDbSName; + db->flags |= SQLITE_PreferBuiltin; + + /* Get a NULL terminated version of the new table name. */ + zName = sqlite3NameFromToken(db, pName); + if( !zName ) goto exit_rename_table; + + /* Check that a table or index named 'zName' does not already exist + ** in database iDb. If so, this is an error. + */ + if( sqlite3FindTable(db, zName, zDb) || sqlite3FindIndex(db, zName, zDb) ){ + sqlite3ErrorMsg(pParse, + "there is already another table or index with this name: %s", zName); + goto exit_rename_table; + } + + /* Make sure it is not a system table being altered, or a reserved name + ** that the table is being renamed to. + */ + if( SQLITE_OK!=isSystemTable(pParse, pTab->zName) ){ + goto exit_rename_table; + } + if( SQLITE_OK!=sqlite3CheckObjectName(pParse, zName) ){ goto + exit_rename_table; + } + +#ifndef SQLITE_OMIT_VIEW + if( pTab->pSelect ){ + sqlite3ErrorMsg(pParse, "view %s may not be altered", pTab->zName); + goto exit_rename_table; + } +#endif + +#ifndef SQLITE_OMIT_AUTHORIZATION + /* Invoke the authorization callback. */ + if( sqlite3AuthCheck(pParse, SQLITE_ALTER_TABLE, zDb, pTab->zName, 0) ){ + goto exit_rename_table; + } +#endif + +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( sqlite3ViewGetColumnNames(pParse, pTab) ){ + goto exit_rename_table; + } + if( IsVirtual(pTab) ){ + pVTab = sqlite3GetVTable(db, pTab); + if( pVTab->pVtab->pModule->xRename==0 ){ + pVTab = 0; + } + } +#endif + + /* Begin a transaction for database iDb. + ** Then modify the schema cookie (since the ALTER TABLE modifies the + ** schema). Open a statement transaction if the table is a virtual + ** table. + */ + v = sqlite3GetVdbe(pParse); + if( v==0 ){ + goto exit_rename_table; + } + sqlite3BeginWriteOperation(pParse, pVTab!=0, iDb); + sqlite3ChangeCookie(pParse, iDb); + + /* If this is a virtual table, invoke the xRename() function if + ** one is defined. The xRename() callback will modify the names + ** of any resources used by the v-table implementation (including other + ** SQLite tables) that are identified by the name of the virtual table. + */ +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( pVTab ){ + int i = ++pParse->nMem; + sqlite3VdbeLoadString(v, i, zName); + sqlite3VdbeAddOp4(v, OP_VRename, i, 0, 0,(const char*)pVTab, P4_VTAB); + sqlite3MayAbort(pParse); + } +#endif + + /* figure out how many UTF-8 characters are in zName */ + zTabName = pTab->zName; + nTabName = sqlite3Utf8CharLen(zTabName, -1); + +#if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER) + if( db->flags&SQLITE_ForeignKeys ){ + /* If foreign-key support is enabled, rewrite the CREATE TABLE + ** statements corresponding to all child tables of foreign key constraints + ** for which the renamed table is the parent table. */ + if( (zWhere=whereForeignKeys(pParse, pTab))!=0 ){ + sqlite3NestedParse(pParse, + "UPDATE \"%w\".%s SET " + "sql = sqlite_rename_parent(sql, %Q, %Q) " + "WHERE %s;", zDb, SCHEMA_TABLE(iDb), zTabName, zName, zWhere); + sqlite3DbFree(db, zWhere); + } + } +#endif + + /* Modify the sqlite_master table to use the new table name. */ + sqlite3NestedParse(pParse, + "UPDATE %Q.%s SET " +#ifdef SQLITE_OMIT_TRIGGER + "sql = sqlite_rename_table(sql, %Q), " +#else + "sql = CASE " + "WHEN type = 'trigger' THEN sqlite_rename_trigger(sql, %Q)" + "ELSE sqlite_rename_table(sql, %Q) END, " +#endif + "tbl_name = %Q, " + "name = CASE " + "WHEN type='table' THEN %Q " + "WHEN name LIKE 'sqlite_autoindex%%' AND type='index' THEN " + "'sqlite_autoindex_' || %Q || substr(name,%d+18) " + "ELSE name END " + "WHERE tbl_name=%Q COLLATE nocase AND " + "(type='table' OR type='index' OR type='trigger');", + zDb, SCHEMA_TABLE(iDb), zName, zName, zName, +#ifndef SQLITE_OMIT_TRIGGER + zName, +#endif + zName, nTabName, zTabName + ); + +#ifndef SQLITE_OMIT_AUTOINCREMENT + /* If the sqlite_sequence table exists in this database, then update + ** it with the new table name. + */ + if( sqlite3FindTable(db, "sqlite_sequence", zDb) ){ + sqlite3NestedParse(pParse, + "UPDATE \"%w\".sqlite_sequence set name = %Q WHERE name = %Q", + zDb, zName, pTab->zName); + } +#endif + +#ifndef SQLITE_OMIT_TRIGGER + /* If there are TEMP triggers on this table, modify the sqlite_temp_master + ** table. Don't do this if the table being ALTERed is itself located in + ** the temp database. + */ + if( (zWhere=whereTempTriggers(pParse, pTab))!=0 ){ + sqlite3NestedParse(pParse, + "UPDATE sqlite_temp_master SET " + "sql = sqlite_rename_trigger(sql, %Q), " + "tbl_name = %Q " + "WHERE %s;", zName, zName, zWhere); + sqlite3DbFree(db, zWhere); + } +#endif + +#if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER) + if( db->flags&SQLITE_ForeignKeys ){ + FKey *p; + for(p=sqlite3FkReferences(pTab); p; p=p->pNextTo){ + Table *pFrom = p->pFrom; + if( pFrom!=pTab ){ + reloadTableSchema(pParse, p->pFrom, pFrom->zName); + } + } + } +#endif + + /* Drop and reload the internal table schema. */ + reloadTableSchema(pParse, pTab, zName); + +exit_rename_table: + sqlite3SrcListDelete(db, pSrc); + sqlite3DbFree(db, zName); + db->flags = savedDbFlags; +} + +/* +** This function is called after an "ALTER TABLE ... ADD" statement +** has been parsed. Argument pColDef contains the text of the new +** column definition. +** +** The Table structure pParse->pNewTable was extended to include +** the new column during parsing. +*/ +SQLITE_PRIVATE void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){ + Table *pNew; /* Copy of pParse->pNewTable */ + Table *pTab; /* Table being altered */ + int iDb; /* Database number */ + const char *zDb; /* Database name */ + const char *zTab; /* Table name */ + char *zCol; /* Null-terminated column definition */ + Column *pCol; /* The new column */ + Expr *pDflt; /* Default value for the new column */ + sqlite3 *db; /* The database connection; */ + Vdbe *v = pParse->pVdbe; /* The prepared statement under construction */ + int r1; /* Temporary registers */ + + db = pParse->db; + if( pParse->nErr || db->mallocFailed ) return; + assert( v!=0 ); + pNew = pParse->pNewTable; + assert( pNew ); + + assert( sqlite3BtreeHoldsAllMutexes(db) ); + iDb = sqlite3SchemaToIndex(db, pNew->pSchema); + zDb = db->aDb[iDb].zDbSName; + zTab = &pNew->zName[16]; /* Skip the "sqlite_altertab_" prefix on the name */ + pCol = &pNew->aCol[pNew->nCol-1]; + pDflt = pCol->pDflt; + pTab = sqlite3FindTable(db, zTab, zDb); + assert( pTab ); + +#ifndef SQLITE_OMIT_AUTHORIZATION + /* Invoke the authorization callback. */ + if( sqlite3AuthCheck(pParse, SQLITE_ALTER_TABLE, zDb, pTab->zName, 0) ){ + return; + } +#endif + + /* If the default value for the new column was specified with a + ** literal NULL, then set pDflt to 0. This simplifies checking + ** for an SQL NULL default below. + */ + assert( pDflt==0 || pDflt->op==TK_SPAN ); + if( pDflt && pDflt->pLeft->op==TK_NULL ){ + pDflt = 0; + } + + /* Check that the new column is not specified as PRIMARY KEY or UNIQUE. + ** If there is a NOT NULL constraint, then the default value for the + ** column must not be NULL. + */ + if( pCol->colFlags & COLFLAG_PRIMKEY ){ + sqlite3ErrorMsg(pParse, "Cannot add a PRIMARY KEY column"); + return; + } + if( pNew->pIndex ){ + sqlite3ErrorMsg(pParse, "Cannot add a UNIQUE column"); + return; + } + if( (db->flags&SQLITE_ForeignKeys) && pNew->pFKey && pDflt ){ + sqlite3ErrorMsg(pParse, + "Cannot add a REFERENCES column with non-NULL default value"); + return; + } + if( pCol->notNull && !pDflt ){ + sqlite3ErrorMsg(pParse, + "Cannot add a NOT NULL column with default value NULL"); + return; + } + + /* Ensure the default expression is something that sqlite3ValueFromExpr() + ** can handle (i.e. not CURRENT_TIME etc.) + */ + if( pDflt ){ + sqlite3_value *pVal = 0; + int rc; + rc = sqlite3ValueFromExpr(db, pDflt, SQLITE_UTF8, SQLITE_AFF_BLOB, &pVal); + assert( rc==SQLITE_OK || rc==SQLITE_NOMEM ); + if( rc!=SQLITE_OK ){ + assert( db->mallocFailed == 1 ); + return; + } + if( !pVal ){ + sqlite3ErrorMsg(pParse, "Cannot add a column with non-constant default"); + return; + } + sqlite3ValueFree(pVal); + } + + /* Modify the CREATE TABLE statement. */ + zCol = sqlite3DbStrNDup(db, (char*)pColDef->z, pColDef->n); + if( zCol ){ + char *zEnd = &zCol[pColDef->n-1]; + int savedDbFlags = db->flags; + while( zEnd>zCol && (*zEnd==';' || sqlite3Isspace(*zEnd)) ){ + *zEnd-- = '\0'; + } + db->flags |= SQLITE_PreferBuiltin; + sqlite3NestedParse(pParse, + "UPDATE \"%w\".%s SET " + "sql = substr(sql,1,%d) || ', ' || %Q || substr(sql,%d) " + "WHERE type = 'table' AND name = %Q", + zDb, SCHEMA_TABLE(iDb), pNew->addColOffset, zCol, pNew->addColOffset+1, + zTab + ); + sqlite3DbFree(db, zCol); + db->flags = savedDbFlags; + } + + /* Make sure the schema version is at least 3. But do not upgrade + ** from less than 3 to 4, as that will corrupt any preexisting DESC + ** index. + */ + r1 = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp3(v, OP_ReadCookie, iDb, r1, BTREE_FILE_FORMAT); + sqlite3VdbeUsesBtree(v, iDb); + sqlite3VdbeAddOp2(v, OP_AddImm, r1, -2); + sqlite3VdbeAddOp2(v, OP_IfPos, r1, sqlite3VdbeCurrentAddr(v)+2); + VdbeCoverage(v); + sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_FILE_FORMAT, 3); + sqlite3ReleaseTempReg(pParse, r1); + + /* Reload the schema of the modified table. */ + reloadTableSchema(pParse, pTab, pTab->zName); +} + +/* +** This function is called by the parser after the table-name in +** an "ALTER TABLE ADD" statement is parsed. Argument +** pSrc is the full-name of the table being altered. +** +** This routine makes a (partial) copy of the Table structure +** for the table being altered and sets Parse.pNewTable to point +** to it. Routines called by the parser as the column definition +** is parsed (i.e. sqlite3AddColumn()) add the new Column data to +** the copy. The copy of the Table structure is deleted by tokenize.c +** after parsing is finished. +** +** Routine sqlite3AlterFinishAddColumn() will be called to complete +** coding the "ALTER TABLE ... ADD" statement. +*/ +SQLITE_PRIVATE void sqlite3AlterBeginAddColumn(Parse *pParse, SrcList *pSrc){ + Table *pNew; + Table *pTab; + Vdbe *v; + int iDb; + int i; + int nAlloc; + sqlite3 *db = pParse->db; + + /* Look up the table being altered. */ + assert( pParse->pNewTable==0 ); + assert( sqlite3BtreeHoldsAllMutexes(db) ); + if( db->mallocFailed ) goto exit_begin_add_column; + pTab = sqlite3LocateTableItem(pParse, 0, &pSrc->a[0]); + if( !pTab ) goto exit_begin_add_column; + +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( IsVirtual(pTab) ){ + sqlite3ErrorMsg(pParse, "virtual tables may not be altered"); + goto exit_begin_add_column; + } +#endif + + /* Make sure this is not an attempt to ALTER a view. */ + if( pTab->pSelect ){ + sqlite3ErrorMsg(pParse, "Cannot add a column to a view"); + goto exit_begin_add_column; + } + if( SQLITE_OK!=isSystemTable(pParse, pTab->zName) ){ + goto exit_begin_add_column; + } + + assert( pTab->addColOffset>0 ); + iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + + /* Put a copy of the Table struct in Parse.pNewTable for the + ** sqlite3AddColumn() function and friends to modify. But modify + ** the name by adding an "sqlite_altertab_" prefix. By adding this + ** prefix, we insure that the name will not collide with an existing + ** table because user table are not allowed to have the "sqlite_" + ** prefix on their name. + */ + pNew = (Table*)sqlite3DbMallocZero(db, sizeof(Table)); + if( !pNew ) goto exit_begin_add_column; + pParse->pNewTable = pNew; + pNew->nRef = 1; + pNew->nCol = pTab->nCol; + assert( pNew->nCol>0 ); + nAlloc = (((pNew->nCol-1)/8)*8)+8; + assert( nAlloc>=pNew->nCol && nAlloc%8==0 && nAlloc-pNew->nCol<8 ); + pNew->aCol = (Column*)sqlite3DbMallocZero(db, sizeof(Column)*nAlloc); + pNew->zName = sqlite3MPrintf(db, "sqlite_altertab_%s", pTab->zName); + if( !pNew->aCol || !pNew->zName ){ + assert( db->mallocFailed ); + goto exit_begin_add_column; + } + memcpy(pNew->aCol, pTab->aCol, sizeof(Column)*pNew->nCol); + for(i=0; inCol; i++){ + Column *pCol = &pNew->aCol[i]; + pCol->zName = sqlite3DbStrDup(db, pCol->zName); + pCol->zColl = 0; + pCol->pDflt = 0; + } + pNew->pSchema = db->aDb[iDb].pSchema; + pNew->addColOffset = pTab->addColOffset; + pNew->nRef = 1; + + /* Begin a transaction and increment the schema cookie. */ + sqlite3BeginWriteOperation(pParse, 0, iDb); + v = sqlite3GetVdbe(pParse); + if( !v ) goto exit_begin_add_column; + sqlite3ChangeCookie(pParse, iDb); + +exit_begin_add_column: + sqlite3SrcListDelete(db, pSrc); + return; +} +#endif /* SQLITE_ALTER_TABLE */ + +/************** End of alter.c ***********************************************/ +/************** Begin file analyze.c *****************************************/ +/* +** 2005-07-08 +** +** 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 associated with the ANALYZE command. +** +** The ANALYZE command gather statistics about the content of tables +** and indices. These statistics are made available to the query planner +** to help it make better decisions about how to perform queries. +** +** The following system tables are or have been supported: +** +** CREATE TABLE sqlite_stat1(tbl, idx, stat); +** CREATE TABLE sqlite_stat2(tbl, idx, sampleno, sample); +** CREATE TABLE sqlite_stat3(tbl, idx, nEq, nLt, nDLt, sample); +** CREATE TABLE sqlite_stat4(tbl, idx, nEq, nLt, nDLt, sample); +** +** Additional tables might be added in future releases of SQLite. +** The sqlite_stat2 table is not created or used unless the SQLite version +** is between 3.6.18 and 3.7.8, inclusive, and unless SQLite is compiled +** with SQLITE_ENABLE_STAT2. The sqlite_stat2 table is deprecated. +** The sqlite_stat2 table is superseded by sqlite_stat3, which is only +** created and used by SQLite versions 3.7.9 and later and with +** SQLITE_ENABLE_STAT3 defined. The functionality of sqlite_stat3 +** is a superset of sqlite_stat2. The sqlite_stat4 is an enhanced +** version of sqlite_stat3 and is only available when compiled with +** SQLITE_ENABLE_STAT4 and in SQLite versions 3.8.1 and later. It is +** not possible to enable both STAT3 and STAT4 at the same time. If they +** are both enabled, then STAT4 takes precedence. +** +** For most applications, sqlite_stat1 provides all the statistics required +** for the query planner to make good choices. +** +** Format of sqlite_stat1: +** +** There is normally one row per index, with the index identified by the +** name in the idx column. The tbl column is the name of the table to +** which the index belongs. In each such row, the stat column will be +** a string consisting of a list of integers. The first integer in this +** list is the number of rows in the index. (This is the same as the +** number of rows in the table, except for partial indices.) The second +** integer is the average number of rows in the index that have the same +** value in the first column of the index. The third integer is the average +** number of rows in the index that have the same value for the first two +** columns. The N-th integer (for N>1) is the average number of rows in +** the index which have the same value for the first N-1 columns. For +** a K-column index, there will be K+1 integers in the stat column. If +** the index is unique, then the last integer will be 1. +** +** The list of integers in the stat column can optionally be followed +** by the keyword "unordered". The "unordered" keyword, if it is present, +** must be separated from the last integer by a single space. If the +** "unordered" keyword is present, then the query planner assumes that +** the index is unordered and will not use the index for a range query. +** +** If the sqlite_stat1.idx column is NULL, then the sqlite_stat1.stat +** column contains a single integer which is the (estimated) number of +** rows in the table identified by sqlite_stat1.tbl. +** +** Format of sqlite_stat2: +** +** The sqlite_stat2 is only created and is only used if SQLite is compiled +** with SQLITE_ENABLE_STAT2 and if the SQLite version number is between +** 3.6.18 and 3.7.8. The "stat2" table contains additional information +** about the distribution of keys within an index. The index is identified by +** the "idx" column and the "tbl" column is the name of the table to which +** the index belongs. There are usually 10 rows in the sqlite_stat2 +** table for each index. +** +** The sqlite_stat2 entries for an index that have sampleno between 0 and 9 +** inclusive are samples of the left-most key value in the index taken at +** evenly spaced points along the index. Let the number of samples be S +** (10 in the standard build) and let C be the number of rows in the index. +** Then the sampled rows are given by: +** +** rownumber = (i*C*2 + C)/(S*2) +** +** For i between 0 and S-1. Conceptually, the index space is divided into +** S uniform buckets and the samples are the middle row from each bucket. +** +** The format for sqlite_stat2 is recorded here for legacy reference. This +** version of SQLite does not support sqlite_stat2. It neither reads nor +** writes the sqlite_stat2 table. This version of SQLite only supports +** sqlite_stat3. +** +** Format for sqlite_stat3: +** +** The sqlite_stat3 format is a subset of sqlite_stat4. Hence, the +** sqlite_stat4 format will be described first. Further information +** about sqlite_stat3 follows the sqlite_stat4 description. +** +** Format for sqlite_stat4: +** +** As with sqlite_stat2, the sqlite_stat4 table contains histogram data +** to aid the query planner in choosing good indices based on the values +** that indexed columns are compared against in the WHERE clauses of +** queries. +** +** The sqlite_stat4 table contains multiple entries for each index. +** The idx column names the index and the tbl column is the table of the +** index. If the idx and tbl columns are the same, then the sample is +** of the INTEGER PRIMARY KEY. The sample column is a blob which is the +** binary encoding of a key from the index. The nEq column is a +** list of integers. The first integer is the approximate number +** of entries in the index whose left-most column exactly matches +** the left-most column of the sample. The second integer in nEq +** is the approximate number of entries in the index where the +** first two columns match the first two columns of the sample. +** And so forth. nLt is another list of integers that show the approximate +** number of entries that are strictly less than the sample. The first +** integer in nLt contains the number of entries in the index where the +** left-most column is less than the left-most column of the sample. +** The K-th integer in the nLt entry is the number of index entries +** where the first K columns are less than the first K columns of the +** sample. The nDLt column is like nLt except that it contains the +** number of distinct entries in the index that are less than the +** sample. +** +** There can be an arbitrary number of sqlite_stat4 entries per index. +** The ANALYZE command will typically generate sqlite_stat4 tables +** that contain between 10 and 40 samples which are distributed across +** the key space, though not uniformly, and which include samples with +** large nEq values. +** +** Format for sqlite_stat3 redux: +** +** The sqlite_stat3 table is like sqlite_stat4 except that it only +** looks at the left-most column of the index. The sqlite_stat3.sample +** column contains the actual value of the left-most column instead +** of a blob encoding of the complete index key as is found in +** sqlite_stat4.sample. The nEq, nLt, and nDLt entries of sqlite_stat3 +** all contain just a single integer which is the same as the first +** integer in the equivalent columns in sqlite_stat4. +*/ +#ifndef SQLITE_OMIT_ANALYZE +/* #include "sqliteInt.h" */ + +#if defined(SQLITE_ENABLE_STAT4) +# define IsStat4 1 +# define IsStat3 0 +#elif defined(SQLITE_ENABLE_STAT3) +# define IsStat4 0 +# define IsStat3 1 +#else +# define IsStat4 0 +# define IsStat3 0 +# undef SQLITE_STAT4_SAMPLES +# define SQLITE_STAT4_SAMPLES 1 +#endif +#define IsStat34 (IsStat3+IsStat4) /* 1 for STAT3 or STAT4. 0 otherwise */ + +/* +** This routine generates code that opens the sqlite_statN tables. +** The sqlite_stat1 table is always relevant. sqlite_stat2 is now +** obsolete. sqlite_stat3 and sqlite_stat4 are only opened when +** appropriate compile-time options are provided. +** +** If the sqlite_statN tables do not previously exist, it is created. +** +** Argument zWhere may be a pointer to a buffer containing a table name, +** or it may be a NULL pointer. If it is not NULL, then all entries in +** the sqlite_statN tables associated with the named table are deleted. +** If zWhere==0, then code is generated to delete all stat table entries. +*/ +static void openStatTable( + Parse *pParse, /* Parsing context */ + int iDb, /* The database we are looking in */ + int iStatCur, /* Open the sqlite_stat1 table on this cursor */ + const char *zWhere, /* Delete entries for this table or index */ + const char *zWhereType /* Either "tbl" or "idx" */ +){ + static const struct { + const char *zName; + const char *zCols; + } aTable[] = { + { "sqlite_stat1", "tbl,idx,stat" }, +#if defined(SQLITE_ENABLE_STAT4) + { "sqlite_stat4", "tbl,idx,neq,nlt,ndlt,sample" }, + { "sqlite_stat3", 0 }, +#elif defined(SQLITE_ENABLE_STAT3) + { "sqlite_stat3", "tbl,idx,neq,nlt,ndlt,sample" }, + { "sqlite_stat4", 0 }, +#else + { "sqlite_stat3", 0 }, + { "sqlite_stat4", 0 }, +#endif + }; + int i; + sqlite3 *db = pParse->db; + Db *pDb; + Vdbe *v = sqlite3GetVdbe(pParse); + int aRoot[ArraySize(aTable)]; + u8 aCreateTbl[ArraySize(aTable)]; + + if( v==0 ) return; + assert( sqlite3BtreeHoldsAllMutexes(db) ); + assert( sqlite3VdbeDb(v)==db ); + pDb = &db->aDb[iDb]; + + /* Create new statistic tables if they do not exist, or clear them + ** if they do already exist. + */ + for(i=0; izDbSName))==0 ){ + if( aTable[i].zCols ){ + /* The sqlite_statN table does not exist. Create it. Note that a + ** side-effect of the CREATE TABLE statement is to leave the rootpage + ** of the new table in register pParse->regRoot. This is important + ** because the OpenWrite opcode below will be needing it. */ + sqlite3NestedParse(pParse, + "CREATE TABLE %Q.%s(%s)", pDb->zDbSName, zTab, aTable[i].zCols + ); + aRoot[i] = pParse->regRoot; + aCreateTbl[i] = OPFLAG_P2ISREG; + } + }else{ + /* The table already exists. If zWhere is not NULL, delete all entries + ** associated with the table zWhere. If zWhere is NULL, delete the + ** entire contents of the table. */ + aRoot[i] = pStat->tnum; + aCreateTbl[i] = 0; + sqlite3TableLock(pParse, iDb, aRoot[i], 1, zTab); + if( zWhere ){ + sqlite3NestedParse(pParse, + "DELETE FROM %Q.%s WHERE %s=%Q", + pDb->zDbSName, zTab, zWhereType, zWhere + ); + }else{ + /* The sqlite_stat[134] table already exists. Delete all rows. */ + sqlite3VdbeAddOp2(v, OP_Clear, aRoot[i], iDb); + } + } + } + + /* Open the sqlite_stat[134] tables for writing. */ + for(i=0; aTable[i].zCols; i++){ + assert( inRowid ){ + sqlite3DbFree(db, p->u.aRowid); + p->nRowid = 0; + } +} +#endif + +/* Initialize the BLOB value of a ROWID +*/ +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +static void sampleSetRowid(sqlite3 *db, Stat4Sample *p, int n, const u8 *pData){ + assert( db!=0 ); + if( p->nRowid ) sqlite3DbFree(db, p->u.aRowid); + p->u.aRowid = sqlite3DbMallocRawNN(db, n); + if( p->u.aRowid ){ + p->nRowid = n; + memcpy(p->u.aRowid, pData, n); + }else{ + p->nRowid = 0; + } +} +#endif + +/* Initialize the INTEGER value of a ROWID. +*/ +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +static void sampleSetRowidInt64(sqlite3 *db, Stat4Sample *p, i64 iRowid){ + assert( db!=0 ); + if( p->nRowid ) sqlite3DbFree(db, p->u.aRowid); + p->nRowid = 0; + p->u.iRowid = iRowid; +} +#endif + + +/* +** Copy the contents of object (*pFrom) into (*pTo). +*/ +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +static void sampleCopy(Stat4Accum *p, Stat4Sample *pTo, Stat4Sample *pFrom){ + pTo->isPSample = pFrom->isPSample; + pTo->iCol = pFrom->iCol; + pTo->iHash = pFrom->iHash; + memcpy(pTo->anEq, pFrom->anEq, sizeof(tRowcnt)*p->nCol); + memcpy(pTo->anLt, pFrom->anLt, sizeof(tRowcnt)*p->nCol); + memcpy(pTo->anDLt, pFrom->anDLt, sizeof(tRowcnt)*p->nCol); + if( pFrom->nRowid ){ + sampleSetRowid(p->db, pTo, pFrom->nRowid, pFrom->u.aRowid); + }else{ + sampleSetRowidInt64(p->db, pTo, pFrom->u.iRowid); + } +} +#endif + +/* +** Reclaim all memory of a Stat4Accum structure. +*/ +static void stat4Destructor(void *pOld){ + Stat4Accum *p = (Stat4Accum*)pOld; +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 + int i; + for(i=0; inCol; i++) sampleClear(p->db, p->aBest+i); + for(i=0; imxSample; i++) sampleClear(p->db, p->a+i); + sampleClear(p->db, &p->current); +#endif + sqlite3DbFree(p->db, p); +} + +/* +** Implementation of the stat_init(N,K,C) SQL function. The three parameters +** are: +** N: The number of columns in the index including the rowid/pk (note 1) +** K: The number of columns in the index excluding the rowid/pk. +** C: The number of rows in the index (note 2) +** +** Note 1: In the special case of the covering index that implements a +** WITHOUT ROWID table, N is the number of PRIMARY KEY columns, not the +** total number of columns in the table. +** +** Note 2: C is only used for STAT3 and STAT4. +** +** For indexes on ordinary rowid tables, N==K+1. But for indexes on +** WITHOUT ROWID tables, N=K+P where P is the number of columns in the +** PRIMARY KEY of the table. The covering index that implements the +** original WITHOUT ROWID table as N==K as a special case. +** +** This routine allocates the Stat4Accum object in heap memory. The return +** value is a pointer to the Stat4Accum object. The datatype of the +** return value is BLOB, but it is really just a pointer to the Stat4Accum +** object. +*/ +static void statInit( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + Stat4Accum *p; + int nCol; /* Number of columns in index being sampled */ + int nKeyCol; /* Number of key columns */ + int nColUp; /* nCol rounded up for alignment */ + int n; /* Bytes of space to allocate */ + sqlite3 *db; /* Database connection */ +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 + int mxSample = SQLITE_STAT4_SAMPLES; +#endif + + /* Decode the three function arguments */ + UNUSED_PARAMETER(argc); + nCol = sqlite3_value_int(argv[0]); + assert( nCol>0 ); + nColUp = sizeof(tRowcnt)<8 ? (nCol+1)&~1 : nCol; + nKeyCol = sqlite3_value_int(argv[1]); + assert( nKeyCol<=nCol ); + assert( nKeyCol>0 ); + + /* Allocate the space required for the Stat4Accum object */ + n = sizeof(*p) + + sizeof(tRowcnt)*nColUp /* Stat4Accum.anEq */ + + sizeof(tRowcnt)*nColUp /* Stat4Accum.anDLt */ +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 + + sizeof(tRowcnt)*nColUp /* Stat4Accum.anLt */ + + sizeof(Stat4Sample)*(nCol+mxSample) /* Stat4Accum.aBest[], a[] */ + + sizeof(tRowcnt)*3*nColUp*(nCol+mxSample) +#endif + ; + db = sqlite3_context_db_handle(context); + p = sqlite3DbMallocZero(db, n); + if( p==0 ){ + sqlite3_result_error_nomem(context); + return; + } + + p->db = db; + p->nRow = 0; + p->nCol = nCol; + p->nKeyCol = nKeyCol; + p->current.anDLt = (tRowcnt*)&p[1]; + p->current.anEq = &p->current.anDLt[nColUp]; + +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 + { + u8 *pSpace; /* Allocated space not yet assigned */ + int i; /* Used to iterate through p->aSample[] */ + + p->iGet = -1; + p->mxSample = mxSample; + p->nPSample = (tRowcnt)(sqlite3_value_int64(argv[2])/(mxSample/3+1) + 1); + p->current.anLt = &p->current.anEq[nColUp]; + p->iPrn = 0x689e962d*(u32)nCol ^ 0xd0944565*(u32)sqlite3_value_int(argv[2]); + + /* Set up the Stat4Accum.a[] and aBest[] arrays */ + p->a = (struct Stat4Sample*)&p->current.anLt[nColUp]; + p->aBest = &p->a[mxSample]; + pSpace = (u8*)(&p->a[mxSample+nCol]); + for(i=0; i<(mxSample+nCol); i++){ + p->a[i].anEq = (tRowcnt *)pSpace; pSpace += (sizeof(tRowcnt) * nColUp); + p->a[i].anLt = (tRowcnt *)pSpace; pSpace += (sizeof(tRowcnt) * nColUp); + p->a[i].anDLt = (tRowcnt *)pSpace; pSpace += (sizeof(tRowcnt) * nColUp); + } + assert( (pSpace - (u8*)p)==n ); + + for(i=0; iaBest[i].iCol = i; + } + } +#endif + + /* Return a pointer to the allocated object to the caller. Note that + ** only the pointer (the 2nd parameter) matters. The size of the object + ** (given by the 3rd parameter) is never used and can be any positive + ** value. */ + sqlite3_result_blob(context, p, sizeof(*p), stat4Destructor); +} +static const FuncDef statInitFuncdef = { + 2+IsStat34, /* nArg */ + SQLITE_UTF8, /* funcFlags */ + 0, /* pUserData */ + 0, /* pNext */ + statInit, /* xSFunc */ + 0, /* xFinalize */ + "stat_init", /* zName */ + {0} +}; + +#ifdef SQLITE_ENABLE_STAT4 +/* +** pNew and pOld are both candidate non-periodic samples selected for +** the same column (pNew->iCol==pOld->iCol). Ignoring this column and +** considering only any trailing columns and the sample hash value, this +** function returns true if sample pNew is to be preferred over pOld. +** In other words, if we assume that the cardinalities of the selected +** column for pNew and pOld are equal, is pNew to be preferred over pOld. +** +** This function assumes that for each argument sample, the contents of +** the anEq[] array from pSample->anEq[pSample->iCol+1] onwards are valid. +*/ +static int sampleIsBetterPost( + Stat4Accum *pAccum, + Stat4Sample *pNew, + Stat4Sample *pOld +){ + int nCol = pAccum->nCol; + int i; + assert( pNew->iCol==pOld->iCol ); + for(i=pNew->iCol+1; ianEq[i]>pOld->anEq[i] ) return 1; + if( pNew->anEq[i]anEq[i] ) return 0; + } + if( pNew->iHash>pOld->iHash ) return 1; + return 0; +} +#endif + +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +/* +** Return true if pNew is to be preferred over pOld. +** +** This function assumes that for each argument sample, the contents of +** the anEq[] array from pSample->anEq[pSample->iCol] onwards are valid. +*/ +static int sampleIsBetter( + Stat4Accum *pAccum, + Stat4Sample *pNew, + Stat4Sample *pOld +){ + tRowcnt nEqNew = pNew->anEq[pNew->iCol]; + tRowcnt nEqOld = pOld->anEq[pOld->iCol]; + + assert( pOld->isPSample==0 && pNew->isPSample==0 ); + assert( IsStat4 || (pNew->iCol==0 && pOld->iCol==0) ); + + if( (nEqNew>nEqOld) ) return 1; +#ifdef SQLITE_ENABLE_STAT4 + if( nEqNew==nEqOld ){ + if( pNew->iColiCol ) return 1; + return (pNew->iCol==pOld->iCol && sampleIsBetterPost(pAccum, pNew, pOld)); + } + return 0; +#else + return (nEqNew==nEqOld && pNew->iHash>pOld->iHash); +#endif +} + +/* +** Copy the contents of sample *pNew into the p->a[] array. If necessary, +** remove the least desirable sample from p->a[] to make room. +*/ +static void sampleInsert(Stat4Accum *p, Stat4Sample *pNew, int nEqZero){ + Stat4Sample *pSample = 0; + int i; + + assert( IsStat4 || nEqZero==0 ); + +#ifdef SQLITE_ENABLE_STAT4 + if( pNew->isPSample==0 ){ + Stat4Sample *pUpgrade = 0; + assert( pNew->anEq[pNew->iCol]>0 ); + + /* This sample is being added because the prefix that ends in column + ** iCol occurs many times in the table. However, if we have already + ** added a sample that shares this prefix, there is no need to add + ** this one. Instead, upgrade the priority of the highest priority + ** existing sample that shares this prefix. */ + for(i=p->nSample-1; i>=0; i--){ + Stat4Sample *pOld = &p->a[i]; + if( pOld->anEq[pNew->iCol]==0 ){ + if( pOld->isPSample ) return; + assert( pOld->iCol>pNew->iCol ); + assert( sampleIsBetter(p, pNew, pOld) ); + if( pUpgrade==0 || sampleIsBetter(p, pOld, pUpgrade) ){ + pUpgrade = pOld; + } + } + } + if( pUpgrade ){ + pUpgrade->iCol = pNew->iCol; + pUpgrade->anEq[pUpgrade->iCol] = pNew->anEq[pUpgrade->iCol]; + goto find_new_min; + } + } +#endif + + /* If necessary, remove sample iMin to make room for the new sample. */ + if( p->nSample>=p->mxSample ){ + Stat4Sample *pMin = &p->a[p->iMin]; + tRowcnt *anEq = pMin->anEq; + tRowcnt *anLt = pMin->anLt; + tRowcnt *anDLt = pMin->anDLt; + sampleClear(p->db, pMin); + memmove(pMin, &pMin[1], sizeof(p->a[0])*(p->nSample-p->iMin-1)); + pSample = &p->a[p->nSample-1]; + pSample->nRowid = 0; + pSample->anEq = anEq; + pSample->anDLt = anDLt; + pSample->anLt = anLt; + p->nSample = p->mxSample-1; + } + + /* The "rows less-than" for the rowid column must be greater than that + ** for the last sample in the p->a[] array. Otherwise, the samples would + ** be out of order. */ +#ifdef SQLITE_ENABLE_STAT4 + assert( p->nSample==0 + || pNew->anLt[p->nCol-1] > p->a[p->nSample-1].anLt[p->nCol-1] ); +#endif + + /* Insert the new sample */ + pSample = &p->a[p->nSample]; + sampleCopy(p, pSample, pNew); + p->nSample++; + + /* Zero the first nEqZero entries in the anEq[] array. */ + memset(pSample->anEq, 0, sizeof(tRowcnt)*nEqZero); + +#ifdef SQLITE_ENABLE_STAT4 + find_new_min: +#endif + if( p->nSample>=p->mxSample ){ + int iMin = -1; + for(i=0; imxSample; i++){ + if( p->a[i].isPSample ) continue; + if( iMin<0 || sampleIsBetter(p, &p->a[iMin], &p->a[i]) ){ + iMin = i; + } + } + assert( iMin>=0 ); + p->iMin = iMin; + } +} +#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */ + +/* +** Field iChng of the index being scanned has changed. So at this point +** p->current contains a sample that reflects the previous row of the +** index. The value of anEq[iChng] and subsequent anEq[] elements are +** correct at this point. +*/ +static void samplePushPrevious(Stat4Accum *p, int iChng){ +#ifdef SQLITE_ENABLE_STAT4 + int i; + + /* Check if any samples from the aBest[] array should be pushed + ** into IndexSample.a[] at this point. */ + for(i=(p->nCol-2); i>=iChng; i--){ + Stat4Sample *pBest = &p->aBest[i]; + pBest->anEq[i] = p->current.anEq[i]; + if( p->nSamplemxSample || sampleIsBetter(p, pBest, &p->a[p->iMin]) ){ + sampleInsert(p, pBest, i); + } + } + + /* Update the anEq[] fields of any samples already collected. */ + for(i=p->nSample-1; i>=0; i--){ + int j; + for(j=iChng; jnCol; j++){ + if( p->a[i].anEq[j]==0 ) p->a[i].anEq[j] = p->current.anEq[j]; + } + } +#endif + +#if defined(SQLITE_ENABLE_STAT3) && !defined(SQLITE_ENABLE_STAT4) + if( iChng==0 ){ + tRowcnt nLt = p->current.anLt[0]; + tRowcnt nEq = p->current.anEq[0]; + + /* Check if this is to be a periodic sample. If so, add it. */ + if( (nLt/p->nPSample)!=(nLt+nEq)/p->nPSample ){ + p->current.isPSample = 1; + sampleInsert(p, &p->current, 0); + p->current.isPSample = 0; + }else + + /* Or if it is a non-periodic sample. Add it in this case too. */ + if( p->nSamplemxSample + || sampleIsBetter(p, &p->current, &p->a[p->iMin]) + ){ + sampleInsert(p, &p->current, 0); + } + } +#endif + +#ifndef SQLITE_ENABLE_STAT3_OR_STAT4 + UNUSED_PARAMETER( p ); + UNUSED_PARAMETER( iChng ); +#endif +} + +/* +** Implementation of the stat_push SQL function: stat_push(P,C,R) +** Arguments: +** +** P Pointer to the Stat4Accum object created by stat_init() +** C Index of left-most column to differ from previous row +** R Rowid for the current row. Might be a key record for +** WITHOUT ROWID tables. +** +** This SQL function always returns NULL. It's purpose it to accumulate +** statistical data and/or samples in the Stat4Accum object about the +** index being analyzed. The stat_get() SQL function will later be used to +** extract relevant information for constructing the sqlite_statN tables. +** +** The R parameter is only used for STAT3 and STAT4 +*/ +static void statPush( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + int i; + + /* The three function arguments */ + Stat4Accum *p = (Stat4Accum*)sqlite3_value_blob(argv[0]); + int iChng = sqlite3_value_int(argv[1]); + + UNUSED_PARAMETER( argc ); + UNUSED_PARAMETER( context ); + assert( p->nCol>0 ); + assert( iChngnCol ); + + if( p->nRow==0 ){ + /* This is the first call to this function. Do initialization. */ + for(i=0; inCol; i++) p->current.anEq[i] = 1; + }else{ + /* Second and subsequent calls get processed here */ + samplePushPrevious(p, iChng); + + /* Update anDLt[], anLt[] and anEq[] to reflect the values that apply + ** to the current row of the index. */ + for(i=0; icurrent.anEq[i]++; + } + for(i=iChng; inCol; i++){ + p->current.anDLt[i]++; +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 + p->current.anLt[i] += p->current.anEq[i]; +#endif + p->current.anEq[i] = 1; + } + } + p->nRow++; +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 + if( sqlite3_value_type(argv[2])==SQLITE_INTEGER ){ + sampleSetRowidInt64(p->db, &p->current, sqlite3_value_int64(argv[2])); + }else{ + sampleSetRowid(p->db, &p->current, sqlite3_value_bytes(argv[2]), + sqlite3_value_blob(argv[2])); + } + p->current.iHash = p->iPrn = p->iPrn*1103515245 + 12345; +#endif + +#ifdef SQLITE_ENABLE_STAT4 + { + tRowcnt nLt = p->current.anLt[p->nCol-1]; + + /* Check if this is to be a periodic sample. If so, add it. */ + if( (nLt/p->nPSample)!=(nLt+1)/p->nPSample ){ + p->current.isPSample = 1; + p->current.iCol = 0; + sampleInsert(p, &p->current, p->nCol-1); + p->current.isPSample = 0; + } + + /* Update the aBest[] array. */ + for(i=0; i<(p->nCol-1); i++){ + p->current.iCol = i; + if( i>=iChng || sampleIsBetterPost(p, &p->current, &p->aBest[i]) ){ + sampleCopy(p, &p->aBest[i], &p->current); + } + } + } +#endif +} +static const FuncDef statPushFuncdef = { + 2+IsStat34, /* nArg */ + SQLITE_UTF8, /* funcFlags */ + 0, /* pUserData */ + 0, /* pNext */ + statPush, /* xSFunc */ + 0, /* xFinalize */ + "stat_push", /* zName */ + {0} +}; + +#define STAT_GET_STAT1 0 /* "stat" column of stat1 table */ +#define STAT_GET_ROWID 1 /* "rowid" column of stat[34] entry */ +#define STAT_GET_NEQ 2 /* "neq" column of stat[34] entry */ +#define STAT_GET_NLT 3 /* "nlt" column of stat[34] entry */ +#define STAT_GET_NDLT 4 /* "ndlt" column of stat[34] entry */ + +/* +** Implementation of the stat_get(P,J) SQL function. This routine is +** used to query statistical information that has been gathered into +** the Stat4Accum object by prior calls to stat_push(). The P parameter +** has type BLOB but it is really just a pointer to the Stat4Accum object. +** The content to returned is determined by the parameter J +** which is one of the STAT_GET_xxxx values defined above. +** +** If neither STAT3 nor STAT4 are enabled, then J is always +** STAT_GET_STAT1 and is hence omitted and this routine becomes +** a one-parameter function, stat_get(P), that always returns the +** stat1 table entry information. +*/ +static void statGet( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + Stat4Accum *p = (Stat4Accum*)sqlite3_value_blob(argv[0]); +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 + /* STAT3 and STAT4 have a parameter on this routine. */ + int eCall = sqlite3_value_int(argv[1]); + assert( argc==2 ); + assert( eCall==STAT_GET_STAT1 || eCall==STAT_GET_NEQ + || eCall==STAT_GET_ROWID || eCall==STAT_GET_NLT + || eCall==STAT_GET_NDLT + ); + if( eCall==STAT_GET_STAT1 ) +#else + assert( argc==1 ); +#endif + { + /* Return the value to store in the "stat" column of the sqlite_stat1 + ** table for this index. + ** + ** The value is a string composed of a list of integers describing + ** the index. The first integer in the list is the total number of + ** entries in the index. There is one additional integer in the list + ** for each indexed column. This additional integer is an estimate of + ** the number of rows matched by a stabbing query on the index using + ** a key with the corresponding number of fields. In other words, + ** if the index is on columns (a,b) and the sqlite_stat1 value is + ** "100 10 2", then SQLite estimates that: + ** + ** * the index contains 100 rows, + ** * "WHERE a=?" matches 10 rows, and + ** * "WHERE a=? AND b=?" matches 2 rows. + ** + ** If D is the count of distinct values and K is the total number of + ** rows, then each estimate is computed as: + ** + ** I = (K+D-1)/D + */ + char *z; + int i; + + char *zRet = sqlite3MallocZero( (p->nKeyCol+1)*25 ); + if( zRet==0 ){ + sqlite3_result_error_nomem(context); + return; + } + + sqlite3_snprintf(24, zRet, "%llu", (u64)p->nRow); + z = zRet + sqlite3Strlen30(zRet); + for(i=0; inKeyCol; i++){ + u64 nDistinct = p->current.anDLt[i] + 1; + u64 iVal = (p->nRow + nDistinct - 1) / nDistinct; + sqlite3_snprintf(24, z, " %llu", iVal); + z += sqlite3Strlen30(z); + assert( p->current.anEq[i] ); + } + assert( z[0]=='\0' && z>zRet ); + + sqlite3_result_text(context, zRet, -1, sqlite3_free); + } +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 + else if( eCall==STAT_GET_ROWID ){ + if( p->iGet<0 ){ + samplePushPrevious(p, 0); + p->iGet = 0; + } + if( p->iGetnSample ){ + Stat4Sample *pS = p->a + p->iGet; + if( pS->nRowid==0 ){ + sqlite3_result_int64(context, pS->u.iRowid); + }else{ + sqlite3_result_blob(context, pS->u.aRowid, pS->nRowid, + SQLITE_TRANSIENT); + } + } + }else{ + tRowcnt *aCnt = 0; + + assert( p->iGetnSample ); + switch( eCall ){ + case STAT_GET_NEQ: aCnt = p->a[p->iGet].anEq; break; + case STAT_GET_NLT: aCnt = p->a[p->iGet].anLt; break; + default: { + aCnt = p->a[p->iGet].anDLt; + p->iGet++; + break; + } + } + + if( IsStat3 ){ + sqlite3_result_int64(context, (i64)aCnt[0]); + }else{ + char *zRet = sqlite3MallocZero(p->nCol * 25); + if( zRet==0 ){ + sqlite3_result_error_nomem(context); + }else{ + int i; + char *z = zRet; + for(i=0; inCol; i++){ + sqlite3_snprintf(24, z, "%llu ", (u64)aCnt[i]); + z += sqlite3Strlen30(z); + } + assert( z[0]=='\0' && z>zRet ); + z[-1] = '\0'; + sqlite3_result_text(context, zRet, -1, sqlite3_free); + } + } + } +#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */ +#ifndef SQLITE_DEBUG + UNUSED_PARAMETER( argc ); +#endif +} +static const FuncDef statGetFuncdef = { + 1+IsStat34, /* nArg */ + SQLITE_UTF8, /* funcFlags */ + 0, /* pUserData */ + 0, /* pNext */ + statGet, /* xSFunc */ + 0, /* xFinalize */ + "stat_get", /* zName */ + {0} +}; + +static void callStatGet(Vdbe *v, int regStat4, int iParam, int regOut){ + assert( regOut!=regStat4 && regOut!=regStat4+1 ); +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 + sqlite3VdbeAddOp2(v, OP_Integer, iParam, regStat4+1); +#elif SQLITE_DEBUG + assert( iParam==STAT_GET_STAT1 ); +#else + UNUSED_PARAMETER( iParam ); +#endif + sqlite3VdbeAddOp4(v, OP_Function0, 0, regStat4, regOut, + (char*)&statGetFuncdef, P4_FUNCDEF); + sqlite3VdbeChangeP5(v, 1 + IsStat34); +} + +/* +** Generate code to do an analysis of all indices associated with +** a single table. +*/ +static void analyzeOneTable( + Parse *pParse, /* Parser context */ + Table *pTab, /* Table whose indices are to be analyzed */ + Index *pOnlyIdx, /* If not NULL, only analyze this one index */ + int iStatCur, /* Index of VdbeCursor that writes the sqlite_stat1 table */ + int iMem, /* Available memory locations begin here */ + int iTab /* Next available cursor */ +){ + sqlite3 *db = pParse->db; /* Database handle */ + Index *pIdx; /* An index to being analyzed */ + int iIdxCur; /* Cursor open on index being analyzed */ + int iTabCur; /* Table cursor */ + Vdbe *v; /* The virtual machine being built up */ + int i; /* Loop counter */ + int jZeroRows = -1; /* Jump from here if number of rows is zero */ + int iDb; /* Index of database containing pTab */ + u8 needTableCnt = 1; /* True to count the table */ + int regNewRowid = iMem++; /* Rowid for the inserted record */ + int regStat4 = iMem++; /* Register to hold Stat4Accum object */ + int regChng = iMem++; /* Index of changed index field */ +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 + int regRowid = iMem++; /* Rowid argument passed to stat_push() */ +#endif + int regTemp = iMem++; /* Temporary use register */ + int regTabname = iMem++; /* Register containing table name */ + int regIdxname = iMem++; /* Register containing index name */ + int regStat1 = iMem++; /* Value for the stat column of sqlite_stat1 */ + int regPrev = iMem; /* MUST BE LAST (see below) */ + + pParse->nMem = MAX(pParse->nMem, iMem); + v = sqlite3GetVdbe(pParse); + if( v==0 || NEVER(pTab==0) ){ + return; + } + if( pTab->tnum==0 ){ + /* Do not gather statistics on views or virtual tables */ + return; + } + if( sqlite3_strlike("sqlite_%", pTab->zName, 0)==0 ){ + /* Do not gather statistics on system tables */ + return; + } + assert( sqlite3BtreeHoldsAllMutexes(db) ); + iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + assert( iDb>=0 ); + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); +#ifndef SQLITE_OMIT_AUTHORIZATION + if( sqlite3AuthCheck(pParse, SQLITE_ANALYZE, pTab->zName, 0, + db->aDb[iDb].zDbSName ) ){ + return; + } +#endif + + /* Establish a read-lock on the table at the shared-cache level. + ** Open a read-only cursor on the table. Also allocate a cursor number + ** to use for scanning indexes (iIdxCur). No index cursor is opened at + ** this time though. */ + sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName); + iTabCur = iTab++; + iIdxCur = iTab++; + pParse->nTab = MAX(pParse->nTab, iTab); + sqlite3OpenTable(pParse, iTabCur, iDb, pTab, OP_OpenRead); + sqlite3VdbeLoadString(v, regTabname, pTab->zName); + + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + int nCol; /* Number of columns in pIdx. "N" */ + int addrRewind; /* Address of "OP_Rewind iIdxCur" */ + int addrNextRow; /* Address of "next_row:" */ + const char *zIdxName; /* Name of the index */ + int nColTest; /* Number of columns to test for changes */ + + if( pOnlyIdx && pOnlyIdx!=pIdx ) continue; + if( pIdx->pPartIdxWhere==0 ) needTableCnt = 0; + if( !HasRowid(pTab) && IsPrimaryKeyIndex(pIdx) ){ + nCol = pIdx->nKeyCol; + zIdxName = pTab->zName; + nColTest = nCol - 1; + }else{ + nCol = pIdx->nColumn; + zIdxName = pIdx->zName; + nColTest = pIdx->uniqNotNull ? pIdx->nKeyCol-1 : nCol-1; + } + + /* Populate the register containing the index name. */ + sqlite3VdbeLoadString(v, regIdxname, zIdxName); + VdbeComment((v, "Analysis for %s.%s", pTab->zName, zIdxName)); + + /* + ** Pseudo-code for loop that calls stat_push(): + ** + ** Rewind csr + ** if eof(csr) goto end_of_scan; + ** regChng = 0 + ** goto chng_addr_0; + ** + ** next_row: + ** regChng = 0 + ** if( idx(0) != regPrev(0) ) goto chng_addr_0 + ** regChng = 1 + ** if( idx(1) != regPrev(1) ) goto chng_addr_1 + ** ... + ** regChng = N + ** goto chng_addr_N + ** + ** chng_addr_0: + ** regPrev(0) = idx(0) + ** chng_addr_1: + ** regPrev(1) = idx(1) + ** ... + ** + ** endDistinctTest: + ** regRowid = idx(rowid) + ** stat_push(P, regChng, regRowid) + ** Next csr + ** if !eof(csr) goto next_row; + ** + ** end_of_scan: + */ + + /* Make sure there are enough memory cells allocated to accommodate + ** the regPrev array and a trailing rowid (the rowid slot is required + ** when building a record to insert into the sample column of + ** the sqlite_stat4 table. */ + pParse->nMem = MAX(pParse->nMem, regPrev+nColTest); + + /* Open a read-only cursor on the index being analyzed. */ + assert( iDb==sqlite3SchemaToIndex(db, pIdx->pSchema) ); + sqlite3VdbeAddOp3(v, OP_OpenRead, iIdxCur, pIdx->tnum, iDb); + sqlite3VdbeSetP4KeyInfo(pParse, pIdx); + VdbeComment((v, "%s", pIdx->zName)); + + /* Invoke the stat_init() function. The arguments are: + ** + ** (1) the number of columns in the index including the rowid + ** (or for a WITHOUT ROWID table, the number of PK columns), + ** (2) the number of columns in the key without the rowid/pk + ** (3) the number of rows in the index, + ** + ** + ** The third argument is only used for STAT3 and STAT4 + */ +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 + sqlite3VdbeAddOp2(v, OP_Count, iIdxCur, regStat4+3); +#endif + sqlite3VdbeAddOp2(v, OP_Integer, nCol, regStat4+1); + sqlite3VdbeAddOp2(v, OP_Integer, pIdx->nKeyCol, regStat4+2); + sqlite3VdbeAddOp4(v, OP_Function0, 0, regStat4+1, regStat4, + (char*)&statInitFuncdef, P4_FUNCDEF); + sqlite3VdbeChangeP5(v, 2+IsStat34); + + /* Implementation of the following: + ** + ** Rewind csr + ** if eof(csr) goto end_of_scan; + ** regChng = 0 + ** goto next_push_0; + ** + */ + addrRewind = sqlite3VdbeAddOp1(v, OP_Rewind, iIdxCur); + VdbeCoverage(v); + sqlite3VdbeAddOp2(v, OP_Integer, 0, regChng); + addrNextRow = sqlite3VdbeCurrentAddr(v); + + if( nColTest>0 ){ + int endDistinctTest = sqlite3VdbeMakeLabel(v); + int *aGotoChng; /* Array of jump instruction addresses */ + aGotoChng = sqlite3DbMallocRawNN(db, sizeof(int)*nColTest); + if( aGotoChng==0 ) continue; + + /* + ** next_row: + ** regChng = 0 + ** if( idx(0) != regPrev(0) ) goto chng_addr_0 + ** regChng = 1 + ** if( idx(1) != regPrev(1) ) goto chng_addr_1 + ** ... + ** regChng = N + ** goto endDistinctTest + */ + sqlite3VdbeAddOp0(v, OP_Goto); + addrNextRow = sqlite3VdbeCurrentAddr(v); + if( nColTest==1 && pIdx->nKeyCol==1 && IsUniqueIndex(pIdx) ){ + /* For a single-column UNIQUE index, once we have found a non-NULL + ** row, we know that all the rest will be distinct, so skip + ** subsequent distinctness tests. */ + sqlite3VdbeAddOp2(v, OP_NotNull, regPrev, endDistinctTest); + VdbeCoverage(v); + } + for(i=0; iazColl[i]); + sqlite3VdbeAddOp2(v, OP_Integer, i, regChng); + sqlite3VdbeAddOp3(v, OP_Column, iIdxCur, i, regTemp); + aGotoChng[i] = + sqlite3VdbeAddOp4(v, OP_Ne, regTemp, 0, regPrev+i, pColl, P4_COLLSEQ); + sqlite3VdbeChangeP5(v, SQLITE_NULLEQ); + VdbeCoverage(v); + } + sqlite3VdbeAddOp2(v, OP_Integer, nColTest, regChng); + sqlite3VdbeGoto(v, endDistinctTest); + + + /* + ** chng_addr_0: + ** regPrev(0) = idx(0) + ** chng_addr_1: + ** regPrev(1) = idx(1) + ** ... + */ + sqlite3VdbeJumpHere(v, addrNextRow-1); + for(i=0; ipTable); + int j, k, regKey; + regKey = sqlite3GetTempRange(pParse, pPk->nKeyCol); + for(j=0; jnKeyCol; j++){ + k = sqlite3ColumnOfIndex(pIdx, pPk->aiColumn[j]); + assert( k>=0 && knCol ); + sqlite3VdbeAddOp3(v, OP_Column, iIdxCur, k, regKey+j); + VdbeComment((v, "%s", pTab->aCol[pPk->aiColumn[j]].zName)); + } + sqlite3VdbeAddOp3(v, OP_MakeRecord, regKey, pPk->nKeyCol, regRowid); + sqlite3ReleaseTempRange(pParse, regKey, pPk->nKeyCol); + } +#endif + assert( regChng==(regStat4+1) ); + sqlite3VdbeAddOp4(v, OP_Function0, 1, regStat4, regTemp, + (char*)&statPushFuncdef, P4_FUNCDEF); + sqlite3VdbeChangeP5(v, 2+IsStat34); + sqlite3VdbeAddOp2(v, OP_Next, iIdxCur, addrNextRow); VdbeCoverage(v); + + /* Add the entry to the stat1 table. */ + callStatGet(v, regStat4, STAT_GET_STAT1, regStat1); + assert( "BBB"[0]==SQLITE_AFF_TEXT ); + sqlite3VdbeAddOp4(v, OP_MakeRecord, regTabname, 3, regTemp, "BBB", 0); + sqlite3VdbeAddOp2(v, OP_NewRowid, iStatCur, regNewRowid); + sqlite3VdbeAddOp3(v, OP_Insert, iStatCur, regTemp, regNewRowid); + sqlite3VdbeChangeP5(v, OPFLAG_APPEND); + + /* Add the entries to the stat3 or stat4 table. */ +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 + { + int regEq = regStat1; + int regLt = regStat1+1; + int regDLt = regStat1+2; + int regSample = regStat1+3; + int regCol = regStat1+4; + int regSampleRowid = regCol + nCol; + int addrNext; + int addrIsNull; + u8 seekOp = HasRowid(pTab) ? OP_NotExists : OP_NotFound; + + pParse->nMem = MAX(pParse->nMem, regCol+nCol); + + addrNext = sqlite3VdbeCurrentAddr(v); + callStatGet(v, regStat4, STAT_GET_ROWID, regSampleRowid); + addrIsNull = sqlite3VdbeAddOp1(v, OP_IsNull, regSampleRowid); + VdbeCoverage(v); + callStatGet(v, regStat4, STAT_GET_NEQ, regEq); + callStatGet(v, regStat4, STAT_GET_NLT, regLt); + callStatGet(v, regStat4, STAT_GET_NDLT, regDLt); + sqlite3VdbeAddOp4Int(v, seekOp, iTabCur, addrNext, regSampleRowid, 0); + /* We know that the regSampleRowid row exists because it was read by + ** the previous loop. Thus the not-found jump of seekOp will never + ** be taken */ + VdbeCoverageNeverTaken(v); +#ifdef SQLITE_ENABLE_STAT3 + sqlite3ExprCodeLoadIndexColumn(pParse, pIdx, iTabCur, 0, regSample); +#else + for(i=0; izName)); + sqlite3VdbeAddOp2(v, OP_Count, iTabCur, regStat1); + jZeroRows = sqlite3VdbeAddOp1(v, OP_IfNot, regStat1); VdbeCoverage(v); + sqlite3VdbeAddOp2(v, OP_Null, 0, regIdxname); + assert( "BBB"[0]==SQLITE_AFF_TEXT ); + sqlite3VdbeAddOp4(v, OP_MakeRecord, regTabname, 3, regTemp, "BBB", 0); + sqlite3VdbeAddOp2(v, OP_NewRowid, iStatCur, regNewRowid); + sqlite3VdbeAddOp3(v, OP_Insert, iStatCur, regTemp, regNewRowid); + sqlite3VdbeChangeP5(v, OPFLAG_APPEND); + sqlite3VdbeJumpHere(v, jZeroRows); + } +} + + +/* +** Generate code that will cause the most recent index analysis to +** be loaded into internal hash tables where is can be used. +*/ +static void loadAnalysis(Parse *pParse, int iDb){ + Vdbe *v = sqlite3GetVdbe(pParse); + if( v ){ + sqlite3VdbeAddOp1(v, OP_LoadAnalysis, iDb); + } +} + +/* +** Generate code that will do an analysis of an entire database +*/ +static void analyzeDatabase(Parse *pParse, int iDb){ + sqlite3 *db = pParse->db; + Schema *pSchema = db->aDb[iDb].pSchema; /* Schema of database iDb */ + HashElem *k; + int iStatCur; + int iMem; + int iTab; + + sqlite3BeginWriteOperation(pParse, 0, iDb); + iStatCur = pParse->nTab; + pParse->nTab += 3; + openStatTable(pParse, iDb, iStatCur, 0, 0); + iMem = pParse->nMem+1; + iTab = pParse->nTab; + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + for(k=sqliteHashFirst(&pSchema->tblHash); k; k=sqliteHashNext(k)){ + Table *pTab = (Table*)sqliteHashData(k); + analyzeOneTable(pParse, pTab, 0, iStatCur, iMem, iTab); + } + loadAnalysis(pParse, iDb); +} + +/* +** Generate code that will do an analysis of a single table in +** a database. If pOnlyIdx is not NULL then it is a single index +** in pTab that should be analyzed. +*/ +static void analyzeTable(Parse *pParse, Table *pTab, Index *pOnlyIdx){ + int iDb; + int iStatCur; + + assert( pTab!=0 ); + assert( sqlite3BtreeHoldsAllMutexes(pParse->db) ); + iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); + sqlite3BeginWriteOperation(pParse, 0, iDb); + iStatCur = pParse->nTab; + pParse->nTab += 3; + if( pOnlyIdx ){ + openStatTable(pParse, iDb, iStatCur, pOnlyIdx->zName, "idx"); + }else{ + openStatTable(pParse, iDb, iStatCur, pTab->zName, "tbl"); + } + analyzeOneTable(pParse, pTab, pOnlyIdx, iStatCur,pParse->nMem+1,pParse->nTab); + loadAnalysis(pParse, iDb); +} + +/* +** Generate code for the ANALYZE command. The parser calls this routine +** when it recognizes an ANALYZE command. +** +** ANALYZE -- 1 +** ANALYZE -- 2 +** ANALYZE ?.? -- 3 +** +** Form 1 causes all indices in all attached databases to be analyzed. +** Form 2 analyzes all indices the single database named. +** Form 3 analyzes all indices associated with the named table. +*/ +SQLITE_PRIVATE void sqlite3Analyze(Parse *pParse, Token *pName1, Token *pName2){ + sqlite3 *db = pParse->db; + int iDb; + int i; + char *z, *zDb; + Table *pTab; + Index *pIdx; + Token *pTableName; + Vdbe *v; + + /* Read the database schema. If an error occurs, leave an error message + ** and code in pParse and return NULL. */ + assert( sqlite3BtreeHoldsAllMutexes(pParse->db) ); + if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){ + return; + } + + assert( pName2!=0 || pName1==0 ); + if( pName1==0 ){ + /* Form 1: Analyze everything */ + for(i=0; inDb; i++){ + if( i==1 ) continue; /* Do not analyze the TEMP database */ + analyzeDatabase(pParse, i); + } + }else if( pName2->n==0 ){ + /* Form 2: Analyze the database or table named */ + iDb = sqlite3FindDb(db, pName1); + if( iDb>=0 ){ + analyzeDatabase(pParse, iDb); + }else{ + z = sqlite3NameFromToken(db, pName1); + if( z ){ + if( (pIdx = sqlite3FindIndex(db, z, 0))!=0 ){ + analyzeTable(pParse, pIdx->pTable, pIdx); + }else if( (pTab = sqlite3LocateTable(pParse, 0, z, 0))!=0 ){ + analyzeTable(pParse, pTab, 0); + } + sqlite3DbFree(db, z); + } + } + }else{ + /* Form 3: Analyze the fully qualified table name */ + iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pTableName); + if( iDb>=0 ){ + zDb = db->aDb[iDb].zDbSName; + z = sqlite3NameFromToken(db, pTableName); + if( z ){ + if( (pIdx = sqlite3FindIndex(db, z, zDb))!=0 ){ + analyzeTable(pParse, pIdx->pTable, pIdx); + }else if( (pTab = sqlite3LocateTable(pParse, 0, z, zDb))!=0 ){ + analyzeTable(pParse, pTab, 0); + } + sqlite3DbFree(db, z); + } + } + } + v = sqlite3GetVdbe(pParse); + if( v ) sqlite3VdbeAddOp0(v, OP_Expire); +} + +/* +** Used to pass information from the analyzer reader through to the +** callback routine. +*/ +typedef struct analysisInfo analysisInfo; +struct analysisInfo { + sqlite3 *db; + const char *zDatabase; +}; + +/* +** The first argument points to a nul-terminated string containing a +** list of space separated integers. Read the first nOut of these into +** the array aOut[]. +*/ +static void decodeIntArray( + char *zIntArray, /* String containing int array to decode */ + int nOut, /* Number of slots in aOut[] */ + tRowcnt *aOut, /* Store integers here */ + LogEst *aLog, /* Or, if aOut==0, here */ + Index *pIndex /* Handle extra flags for this index, if not NULL */ +){ + char *z = zIntArray; + int c; + int i; + tRowcnt v; + +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 + if( z==0 ) z = ""; +#else + assert( z!=0 ); +#endif + for(i=0; *z && i='0' && c<='9' ){ + v = v*10 + c - '0'; + z++; + } +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 + if( aOut ) aOut[i] = v; + if( aLog ) aLog[i] = sqlite3LogEst(v); +#else + assert( aOut==0 ); + UNUSED_PARAMETER(aOut); + assert( aLog!=0 ); + aLog[i] = sqlite3LogEst(v); +#endif + if( *z==' ' ) z++; + } +#ifndef SQLITE_ENABLE_STAT3_OR_STAT4 + assert( pIndex!=0 ); { +#else + if( pIndex ){ +#endif + pIndex->bUnordered = 0; + pIndex->noSkipScan = 0; + while( z[0] ){ + if( sqlite3_strglob("unordered*", z)==0 ){ + pIndex->bUnordered = 1; + }else if( sqlite3_strglob("sz=[0-9]*", z)==0 ){ + pIndex->szIdxRow = sqlite3LogEst(sqlite3Atoi(z+3)); + }else if( sqlite3_strglob("noskipscan*", z)==0 ){ + pIndex->noSkipScan = 1; + } +#ifdef SQLITE_ENABLE_COSTMULT + else if( sqlite3_strglob("costmult=[0-9]*",z)==0 ){ + pIndex->pTable->costMult = sqlite3LogEst(sqlite3Atoi(z+9)); + } +#endif + while( z[0]!=0 && z[0]!=' ' ) z++; + while( z[0]==' ' ) z++; + } + } +} + +/* +** This callback is invoked once for each index when reading the +** sqlite_stat1 table. +** +** argv[0] = name of the table +** argv[1] = name of the index (might be NULL) +** argv[2] = results of analysis - on integer for each column +** +** Entries for which argv[1]==NULL simply record the number of rows in +** the table. +*/ +static int analysisLoader(void *pData, int argc, char **argv, char **NotUsed){ + analysisInfo *pInfo = (analysisInfo*)pData; + Index *pIndex; + Table *pTable; + const char *z; + + assert( argc==3 ); + UNUSED_PARAMETER2(NotUsed, argc); + + if( argv==0 || argv[0]==0 || argv[2]==0 ){ + return 0; + } + pTable = sqlite3FindTable(pInfo->db, argv[0], pInfo->zDatabase); + if( pTable==0 ){ + return 0; + } + if( argv[1]==0 ){ + pIndex = 0; + }else if( sqlite3_stricmp(argv[0],argv[1])==0 ){ + pIndex = sqlite3PrimaryKeyIndex(pTable); + }else{ + pIndex = sqlite3FindIndex(pInfo->db, argv[1], pInfo->zDatabase); + } + z = argv[2]; + + if( pIndex ){ + tRowcnt *aiRowEst = 0; + int nCol = pIndex->nKeyCol+1; +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 + /* Index.aiRowEst may already be set here if there are duplicate + ** sqlite_stat1 entries for this index. In that case just clobber + ** the old data with the new instead of allocating a new array. */ + if( pIndex->aiRowEst==0 ){ + pIndex->aiRowEst = (tRowcnt*)sqlite3MallocZero(sizeof(tRowcnt) * nCol); + if( pIndex->aiRowEst==0 ) sqlite3OomFault(pInfo->db); + } + aiRowEst = pIndex->aiRowEst; +#endif + pIndex->bUnordered = 0; + decodeIntArray((char*)z, nCol, aiRowEst, pIndex->aiRowLogEst, pIndex); + if( pIndex->pPartIdxWhere==0 ) pTable->nRowLogEst = pIndex->aiRowLogEst[0]; + }else{ + Index fakeIdx; + fakeIdx.szIdxRow = pTable->szTabRow; +#ifdef SQLITE_ENABLE_COSTMULT + fakeIdx.pTable = pTable; +#endif + decodeIntArray((char*)z, 1, 0, &pTable->nRowLogEst, &fakeIdx); + pTable->szTabRow = fakeIdx.szIdxRow; + } + + return 0; +} + +/* +** If the Index.aSample variable is not NULL, delete the aSample[] array +** and its contents. +*/ +SQLITE_PRIVATE void sqlite3DeleteIndexSamples(sqlite3 *db, Index *pIdx){ +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 + if( pIdx->aSample ){ + int j; + for(j=0; jnSample; j++){ + IndexSample *p = &pIdx->aSample[j]; + sqlite3DbFree(db, p->p); + } + sqlite3DbFree(db, pIdx->aSample); + } + if( db && db->pnBytesFreed==0 ){ + pIdx->nSample = 0; + pIdx->aSample = 0; + } +#else + UNUSED_PARAMETER(db); + UNUSED_PARAMETER(pIdx); +#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */ +} + +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +/* +** Populate the pIdx->aAvgEq[] array based on the samples currently +** stored in pIdx->aSample[]. +*/ +static void initAvgEq(Index *pIdx){ + if( pIdx ){ + IndexSample *aSample = pIdx->aSample; + IndexSample *pFinal = &aSample[pIdx->nSample-1]; + int iCol; + int nCol = 1; + if( pIdx->nSampleCol>1 ){ + /* If this is stat4 data, then calculate aAvgEq[] values for all + ** sample columns except the last. The last is always set to 1, as + ** once the trailing PK fields are considered all index keys are + ** unique. */ + nCol = pIdx->nSampleCol-1; + pIdx->aAvgEq[nCol] = 1; + } + for(iCol=0; iColnSample; + int i; /* Used to iterate through samples */ + tRowcnt sumEq = 0; /* Sum of the nEq values */ + tRowcnt avgEq = 0; + tRowcnt nRow; /* Number of rows in index */ + i64 nSum100 = 0; /* Number of terms contributing to sumEq */ + i64 nDist100; /* Number of distinct values in index */ + + if( !pIdx->aiRowEst || iCol>=pIdx->nKeyCol || pIdx->aiRowEst[iCol+1]==0 ){ + nRow = pFinal->anLt[iCol]; + nDist100 = (i64)100 * pFinal->anDLt[iCol]; + nSample--; + }else{ + nRow = pIdx->aiRowEst[0]; + nDist100 = ((i64)100 * pIdx->aiRowEst[0]) / pIdx->aiRowEst[iCol+1]; + } + pIdx->nRowEst0 = nRow; + + /* Set nSum to the number of distinct (iCol+1) field prefixes that + ** occur in the stat4 table for this index. Set sumEq to the sum of + ** the nEq values for column iCol for the same set (adding the value + ** only once where there exist duplicate prefixes). */ + for(i=0; inSample-1) + || aSample[i].anDLt[iCol]!=aSample[i+1].anDLt[iCol] + ){ + sumEq += aSample[i].anEq[iCol]; + nSum100 += 100; + } + } + + if( nDist100>nSum100 ){ + avgEq = ((i64)100 * (nRow - sumEq))/(nDist100 - nSum100); + } + if( avgEq==0 ) avgEq = 1; + pIdx->aAvgEq[iCol] = avgEq; + } + } +} + +/* +** Look up an index by name. Or, if the name of a WITHOUT ROWID table +** is supplied instead, find the PRIMARY KEY index for that table. +*/ +static Index *findIndexOrPrimaryKey( + sqlite3 *db, + const char *zName, + const char *zDb +){ + Index *pIdx = sqlite3FindIndex(db, zName, zDb); + if( pIdx==0 ){ + Table *pTab = sqlite3FindTable(db, zName, zDb); + if( pTab && !HasRowid(pTab) ) pIdx = sqlite3PrimaryKeyIndex(pTab); + } + return pIdx; +} + +/* +** Load the content from either the sqlite_stat4 or sqlite_stat3 table +** into the relevant Index.aSample[] arrays. +** +** Arguments zSql1 and zSql2 must point to SQL statements that return +** data equivalent to the following (statements are different for stat3, +** see the caller of this function for details): +** +** zSql1: SELECT idx,count(*) FROM %Q.sqlite_stat4 GROUP BY idx +** zSql2: SELECT idx,neq,nlt,ndlt,sample FROM %Q.sqlite_stat4 +** +** where %Q is replaced with the database name before the SQL is executed. +*/ +static int loadStatTbl( + sqlite3 *db, /* Database handle */ + int bStat3, /* Assume single column records only */ + const char *zSql1, /* SQL statement 1 (see above) */ + const char *zSql2, /* SQL statement 2 (see above) */ + const char *zDb /* Database name (e.g. "main") */ +){ + int rc; /* Result codes from subroutines */ + sqlite3_stmt *pStmt = 0; /* An SQL statement being run */ + char *zSql; /* Text of the SQL statement */ + Index *pPrevIdx = 0; /* Previous index in the loop */ + IndexSample *pSample; /* A slot in pIdx->aSample[] */ + + assert( db->lookaside.bDisable ); + zSql = sqlite3MPrintf(db, zSql1, zDb); + if( !zSql ){ + return SQLITE_NOMEM_BKPT; + } + rc = sqlite3_prepare(db, zSql, -1, &pStmt, 0); + sqlite3DbFree(db, zSql); + if( rc ) return rc; + + while( sqlite3_step(pStmt)==SQLITE_ROW ){ + int nIdxCol = 1; /* Number of columns in stat4 records */ + + char *zIndex; /* Index name */ + Index *pIdx; /* Pointer to the index object */ + int nSample; /* Number of samples */ + int nByte; /* Bytes of space required */ + int i; /* Bytes of space required */ + tRowcnt *pSpace; + + zIndex = (char *)sqlite3_column_text(pStmt, 0); + if( zIndex==0 ) continue; + nSample = sqlite3_column_int(pStmt, 1); + pIdx = findIndexOrPrimaryKey(db, zIndex, zDb); + assert( pIdx==0 || bStat3 || pIdx->nSample==0 ); + /* Index.nSample is non-zero at this point if data has already been + ** loaded from the stat4 table. In this case ignore stat3 data. */ + if( pIdx==0 || pIdx->nSample ) continue; + if( bStat3==0 ){ + assert( !HasRowid(pIdx->pTable) || pIdx->nColumn==pIdx->nKeyCol+1 ); + if( !HasRowid(pIdx->pTable) && IsPrimaryKeyIndex(pIdx) ){ + nIdxCol = pIdx->nKeyCol; + }else{ + nIdxCol = pIdx->nColumn; + } + } + pIdx->nSampleCol = nIdxCol; + nByte = sizeof(IndexSample) * nSample; + nByte += sizeof(tRowcnt) * nIdxCol * 3 * nSample; + nByte += nIdxCol * sizeof(tRowcnt); /* Space for Index.aAvgEq[] */ + + pIdx->aSample = sqlite3DbMallocZero(db, nByte); + if( pIdx->aSample==0 ){ + sqlite3_finalize(pStmt); + return SQLITE_NOMEM_BKPT; + } + pSpace = (tRowcnt*)&pIdx->aSample[nSample]; + pIdx->aAvgEq = pSpace; pSpace += nIdxCol; + for(i=0; iaSample[i].anEq = pSpace; pSpace += nIdxCol; + pIdx->aSample[i].anLt = pSpace; pSpace += nIdxCol; + pIdx->aSample[i].anDLt = pSpace; pSpace += nIdxCol; + } + assert( ((u8*)pSpace)-nByte==(u8*)(pIdx->aSample) ); + } + rc = sqlite3_finalize(pStmt); + if( rc ) return rc; + + zSql = sqlite3MPrintf(db, zSql2, zDb); + if( !zSql ){ + return SQLITE_NOMEM_BKPT; + } + rc = sqlite3_prepare(db, zSql, -1, &pStmt, 0); + sqlite3DbFree(db, zSql); + if( rc ) return rc; + + while( sqlite3_step(pStmt)==SQLITE_ROW ){ + char *zIndex; /* Index name */ + Index *pIdx; /* Pointer to the index object */ + int nCol = 1; /* Number of columns in index */ + + zIndex = (char *)sqlite3_column_text(pStmt, 0); + if( zIndex==0 ) continue; + pIdx = findIndexOrPrimaryKey(db, zIndex, zDb); + if( pIdx==0 ) continue; + /* This next condition is true if data has already been loaded from + ** the sqlite_stat4 table. In this case ignore stat3 data. */ + nCol = pIdx->nSampleCol; + if( bStat3 && nCol>1 ) continue; + if( pIdx!=pPrevIdx ){ + initAvgEq(pPrevIdx); + pPrevIdx = pIdx; + } + pSample = &pIdx->aSample[pIdx->nSample]; + decodeIntArray((char*)sqlite3_column_text(pStmt,1),nCol,pSample->anEq,0,0); + decodeIntArray((char*)sqlite3_column_text(pStmt,2),nCol,pSample->anLt,0,0); + decodeIntArray((char*)sqlite3_column_text(pStmt,3),nCol,pSample->anDLt,0,0); + + /* Take a copy of the sample. Add two 0x00 bytes the end of the buffer. + ** This is in case the sample record is corrupted. In that case, the + ** sqlite3VdbeRecordCompare() may read up to two varints past the + ** end of the allocated buffer before it realizes it is dealing with + ** a corrupt record. Adding the two 0x00 bytes prevents this from causing + ** a buffer overread. */ + pSample->n = sqlite3_column_bytes(pStmt, 4); + pSample->p = sqlite3DbMallocZero(db, pSample->n + 2); + if( pSample->p==0 ){ + sqlite3_finalize(pStmt); + return SQLITE_NOMEM_BKPT; + } + memcpy(pSample->p, sqlite3_column_blob(pStmt, 4), pSample->n); + pIdx->nSample++; + } + rc = sqlite3_finalize(pStmt); + if( rc==SQLITE_OK ) initAvgEq(pPrevIdx); + return rc; +} + +/* +** Load content from the sqlite_stat4 and sqlite_stat3 tables into +** the Index.aSample[] arrays of all indices. +*/ +static int loadStat4(sqlite3 *db, const char *zDb){ + int rc = SQLITE_OK; /* Result codes from subroutines */ + + assert( db->lookaside.bDisable ); + if( sqlite3FindTable(db, "sqlite_stat4", zDb) ){ + rc = loadStatTbl(db, 0, + "SELECT idx,count(*) FROM %Q.sqlite_stat4 GROUP BY idx", + "SELECT idx,neq,nlt,ndlt,sample FROM %Q.sqlite_stat4", + zDb + ); + } + + if( rc==SQLITE_OK && sqlite3FindTable(db, "sqlite_stat3", zDb) ){ + rc = loadStatTbl(db, 1, + "SELECT idx,count(*) FROM %Q.sqlite_stat3 GROUP BY idx", + "SELECT idx,neq,nlt,ndlt,sqlite_record(sample) FROM %Q.sqlite_stat3", + zDb + ); + } + + return rc; +} +#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */ + +/* +** Load the content of the sqlite_stat1 and sqlite_stat3/4 tables. The +** contents of sqlite_stat1 are used to populate the Index.aiRowEst[] +** arrays. The contents of sqlite_stat3/4 are used to populate the +** Index.aSample[] arrays. +** +** If the sqlite_stat1 table is not present in the database, SQLITE_ERROR +** is returned. In this case, even if SQLITE_ENABLE_STAT3/4 was defined +** during compilation and the sqlite_stat3/4 table is present, no data is +** read from it. +** +** If SQLITE_ENABLE_STAT3/4 was defined during compilation and the +** sqlite_stat4 table is not present in the database, SQLITE_ERROR is +** returned. However, in this case, data is read from the sqlite_stat1 +** table (if it is present) before returning. +** +** If an OOM error occurs, this function always sets db->mallocFailed. +** This means if the caller does not care about other errors, the return +** code may be ignored. +*/ +SQLITE_PRIVATE int sqlite3AnalysisLoad(sqlite3 *db, int iDb){ + analysisInfo sInfo; + HashElem *i; + char *zSql; + int rc = SQLITE_OK; + + assert( iDb>=0 && iDbnDb ); + assert( db->aDb[iDb].pBt!=0 ); + + /* Clear any prior statistics */ + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + for(i=sqliteHashFirst(&db->aDb[iDb].pSchema->idxHash);i;i=sqliteHashNext(i)){ + Index *pIdx = sqliteHashData(i); + pIdx->aiRowLogEst[0] = 0; +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 + sqlite3DeleteIndexSamples(db, pIdx); + pIdx->aSample = 0; +#endif + } + + /* Load new statistics out of the sqlite_stat1 table */ + sInfo.db = db; + sInfo.zDatabase = db->aDb[iDb].zDbSName; + if( sqlite3FindTable(db, "sqlite_stat1", sInfo.zDatabase)!=0 ){ + zSql = sqlite3MPrintf(db, + "SELECT tbl,idx,stat FROM %Q.sqlite_stat1", sInfo.zDatabase); + if( zSql==0 ){ + rc = SQLITE_NOMEM_BKPT; + }else{ + rc = sqlite3_exec(db, zSql, analysisLoader, &sInfo, 0); + sqlite3DbFree(db, zSql); + } + } + + /* Set appropriate defaults on all indexes not in the sqlite_stat1 table */ + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + for(i=sqliteHashFirst(&db->aDb[iDb].pSchema->idxHash);i;i=sqliteHashNext(i)){ + Index *pIdx = sqliteHashData(i); + if( pIdx->aiRowLogEst[0]==0 ) sqlite3DefaultRowEst(pIdx); + } + + /* Load the statistics from the sqlite_stat4 table. */ +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 + if( rc==SQLITE_OK && OptimizationEnabled(db, SQLITE_Stat34) ){ + db->lookaside.bDisable++; + rc = loadStat4(db, sInfo.zDatabase); + db->lookaside.bDisable--; + } + for(i=sqliteHashFirst(&db->aDb[iDb].pSchema->idxHash);i;i=sqliteHashNext(i)){ + Index *pIdx = sqliteHashData(i); + sqlite3_free(pIdx->aiRowEst); + pIdx->aiRowEst = 0; + } +#endif + + if( rc==SQLITE_NOMEM ){ + sqlite3OomFault(db); + } + return rc; +} + + +#endif /* SQLITE_OMIT_ANALYZE */ + +/************** End of analyze.c *********************************************/ +/************** Begin file attach.c ******************************************/ +/* +** 2003 April 6 +** +** 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 implement the ATTACH and DETACH commands. +*/ +/* #include "sqliteInt.h" */ + +#ifndef SQLITE_OMIT_ATTACH +/* +** Resolve an expression that was part of an ATTACH or DETACH statement. This +** is slightly different from resolving a normal SQL expression, because simple +** identifiers are treated as strings, not possible column names or aliases. +** +** i.e. if the parser sees: +** +** ATTACH DATABASE abc AS def +** +** it treats the two expressions as literal strings 'abc' and 'def' instead of +** looking for columns of the same name. +** +** This only applies to the root node of pExpr, so the statement: +** +** ATTACH DATABASE abc||def AS 'db2' +** +** will fail because neither abc or def can be resolved. +*/ +static int resolveAttachExpr(NameContext *pName, Expr *pExpr) +{ + int rc = SQLITE_OK; + if( pExpr ){ + if( pExpr->op!=TK_ID ){ + rc = sqlite3ResolveExprNames(pName, pExpr); + }else{ + pExpr->op = TK_STRING; + } + } + return rc; +} + +/* +** An SQL user-function registered to do the work of an ATTACH statement. The +** three arguments to the function come directly from an attach statement: +** +** ATTACH DATABASE x AS y KEY z +** +** SELECT sqlite_attach(x, y, z) +** +** If the optional "KEY z" syntax is omitted, an SQL NULL is passed as the +** third argument. +*/ +static void attachFunc( + sqlite3_context *context, + int NotUsed, + sqlite3_value **argv +){ + int i; + int rc = 0; + sqlite3 *db = sqlite3_context_db_handle(context); + const char *zName; + const char *zFile; + char *zPath = 0; + char *zErr = 0; + unsigned int flags; + Db *aNew; + char *zErrDyn = 0; + sqlite3_vfs *pVfs; + + UNUSED_PARAMETER(NotUsed); + + zFile = (const char *)sqlite3_value_text(argv[0]); + zName = (const char *)sqlite3_value_text(argv[1]); + if( zFile==0 ) zFile = ""; + if( zName==0 ) zName = ""; + + /* Check for the following errors: + ** + ** * Too many attached databases, + ** * Transaction currently open + ** * Specified database name already being used. + */ + if( db->nDb>=db->aLimit[SQLITE_LIMIT_ATTACHED]+2 ){ + zErrDyn = sqlite3MPrintf(db, "too many attached databases - max %d", + db->aLimit[SQLITE_LIMIT_ATTACHED] + ); + goto attach_error; + } + if( !db->autoCommit ){ + zErrDyn = sqlite3MPrintf(db, "cannot ATTACH database within transaction"); + goto attach_error; + } + for(i=0; inDb; i++){ + char *z = db->aDb[i].zDbSName; + assert( z && zName ); + if( sqlite3StrICmp(z, zName)==0 ){ + zErrDyn = sqlite3MPrintf(db, "database %s is already in use", zName); + goto attach_error; + } + } + + /* Allocate the new entry in the db->aDb[] array and initialize the schema + ** hash tables. + */ + if( db->aDb==db->aDbStatic ){ + aNew = sqlite3DbMallocRawNN(db, sizeof(db->aDb[0])*3 ); + if( aNew==0 ) return; + memcpy(aNew, db->aDb, sizeof(db->aDb[0])*2); + }else{ + aNew = sqlite3DbRealloc(db, db->aDb, sizeof(db->aDb[0])*(db->nDb+1) ); + if( aNew==0 ) return; + } + db->aDb = aNew; + aNew = &db->aDb[db->nDb]; + memset(aNew, 0, sizeof(*aNew)); + + /* Open the database file. If the btree is successfully opened, use + ** it to obtain the database schema. At this point the schema may + ** or may not be initialized. + */ + flags = db->openFlags; + rc = sqlite3ParseUri(db->pVfs->zName, zFile, &flags, &pVfs, &zPath, &zErr); + if( rc!=SQLITE_OK ){ + if( rc==SQLITE_NOMEM ) sqlite3OomFault(db); + sqlite3_result_error(context, zErr, -1); + sqlite3_free(zErr); + return; + } + assert( pVfs ); + flags |= SQLITE_OPEN_MAIN_DB; + rc = sqlite3BtreeOpen(pVfs, zPath, db, &aNew->pBt, 0, flags); + sqlite3_free( zPath ); + db->nDb++; + if( rc==SQLITE_CONSTRAINT ){ + rc = SQLITE_ERROR; + zErrDyn = sqlite3MPrintf(db, "database is already attached"); + }else if( rc==SQLITE_OK ){ + Pager *pPager; + aNew->pSchema = sqlite3SchemaGet(db, aNew->pBt); + if( !aNew->pSchema ){ + rc = SQLITE_NOMEM_BKPT; + }else if( aNew->pSchema->file_format && aNew->pSchema->enc!=ENC(db) ){ + zErrDyn = sqlite3MPrintf(db, + "attached databases must use the same text encoding as main database"); + rc = SQLITE_ERROR; + } + sqlite3BtreeEnter(aNew->pBt); + pPager = sqlite3BtreePager(aNew->pBt); + sqlite3PagerLockingMode(pPager, db->dfltLockMode); + sqlite3BtreeSecureDelete(aNew->pBt, + sqlite3BtreeSecureDelete(db->aDb[0].pBt,-1) ); +#ifndef SQLITE_OMIT_PAGER_PRAGMAS + sqlite3BtreeSetPagerFlags(aNew->pBt, + PAGER_SYNCHRONOUS_FULL | (db->flags & PAGER_FLAGS_MASK)); +#endif + sqlite3BtreeLeave(aNew->pBt); + } + aNew->safety_level = SQLITE_DEFAULT_SYNCHRONOUS+1; + aNew->zDbSName = sqlite3DbStrDup(db, zName); + if( rc==SQLITE_OK && aNew->zDbSName==0 ){ + rc = SQLITE_NOMEM_BKPT; + } + + +#ifdef SQLITE_HAS_CODEC + if( rc==SQLITE_OK ){ + extern int sqlite3CodecAttach(sqlite3*, int, const void*, int); + extern void sqlite3CodecGetKey(sqlite3*, int, void**, int*); + int nKey; + char *zKey; + int t = sqlite3_value_type(argv[2]); + switch( t ){ + case SQLITE_INTEGER: + case SQLITE_FLOAT: + zErrDyn = sqlite3DbStrDup(db, "Invalid key value"); + rc = SQLITE_ERROR; + break; + + case SQLITE_TEXT: + case SQLITE_BLOB: + nKey = sqlite3_value_bytes(argv[2]); + zKey = (char *)sqlite3_value_blob(argv[2]); + 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); + if( nKey || sqlite3BtreeGetOptimalReserve(db->aDb[0].pBt)>0 ){ + rc = sqlite3CodecAttach(db, db->nDb-1, zKey, nKey); + } + break; + } + } +#endif + + /* If the file was opened successfully, read the schema for the new database. + ** If this fails, or if opening the file failed, then close the file and + ** remove the entry from the db->aDb[] array. i.e. put everything back the way + ** we found it. + */ + if( rc==SQLITE_OK ){ + sqlite3BtreeEnterAll(db); + rc = sqlite3Init(db, &zErrDyn); + sqlite3BtreeLeaveAll(db); + } +#ifdef SQLITE_USER_AUTHENTICATION + if( rc==SQLITE_OK ){ + u8 newAuth = 0; + rc = sqlite3UserAuthCheckLogin(db, zName, &newAuth); + if( newAuthauth.authLevel ){ + rc = SQLITE_AUTH_USER; + } + } +#endif + if( rc ){ + int iDb = db->nDb - 1; + assert( iDb>=2 ); + if( db->aDb[iDb].pBt ){ + sqlite3BtreeClose(db->aDb[iDb].pBt); + db->aDb[iDb].pBt = 0; + db->aDb[iDb].pSchema = 0; + } + sqlite3ResetAllSchemasOfConnection(db); + db->nDb = iDb; + if( rc==SQLITE_NOMEM || rc==SQLITE_IOERR_NOMEM ){ + sqlite3OomFault(db); + sqlite3DbFree(db, zErrDyn); + zErrDyn = sqlite3MPrintf(db, "out of memory"); + }else if( zErrDyn==0 ){ + zErrDyn = sqlite3MPrintf(db, "unable to open database: %s", zFile); + } + goto attach_error; + } + + return; + +attach_error: + /* Return an error if we get here */ + if( zErrDyn ){ + sqlite3_result_error(context, zErrDyn, -1); + sqlite3DbFree(db, zErrDyn); + } + if( rc ) sqlite3_result_error_code(context, rc); +} + +/* +** An SQL user-function registered to do the work of an DETACH statement. The +** three arguments to the function come directly from a detach statement: +** +** DETACH DATABASE x +** +** SELECT sqlite_detach(x) +*/ +static void detachFunc( + sqlite3_context *context, + int NotUsed, + sqlite3_value **argv +){ + const char *zName = (const char *)sqlite3_value_text(argv[0]); + sqlite3 *db = sqlite3_context_db_handle(context); + int i; + Db *pDb = 0; + char zErr[128]; + + UNUSED_PARAMETER(NotUsed); + + if( zName==0 ) zName = ""; + for(i=0; inDb; i++){ + pDb = &db->aDb[i]; + if( pDb->pBt==0 ) continue; + if( sqlite3StrICmp(pDb->zDbSName, zName)==0 ) break; + } + + if( i>=db->nDb ){ + sqlite3_snprintf(sizeof(zErr),zErr, "no such database: %s", zName); + goto detach_error; + } + if( i<2 ){ + sqlite3_snprintf(sizeof(zErr),zErr, "cannot detach database %s", zName); + goto detach_error; + } + if( !db->autoCommit ){ + sqlite3_snprintf(sizeof(zErr), zErr, + "cannot DETACH database within transaction"); + goto detach_error; + } + if( sqlite3BtreeIsInReadTrans(pDb->pBt) || sqlite3BtreeIsInBackup(pDb->pBt) ){ + sqlite3_snprintf(sizeof(zErr),zErr, "database %s is locked", zName); + goto detach_error; + } + + sqlite3BtreeClose(pDb->pBt); + pDb->pBt = 0; + pDb->pSchema = 0; + sqlite3CollapseDatabaseArray(db); + return; + +detach_error: + sqlite3_result_error(context, zErr, -1); +} + +/* +** This procedure generates VDBE code for a single invocation of either the +** sqlite_detach() or sqlite_attach() SQL user functions. +*/ +static void codeAttach( + Parse *pParse, /* The parser context */ + int type, /* Either SQLITE_ATTACH or SQLITE_DETACH */ + FuncDef const *pFunc,/* FuncDef wrapper for detachFunc() or attachFunc() */ + Expr *pAuthArg, /* Expression to pass to authorization callback */ + Expr *pFilename, /* Name of database file */ + Expr *pDbname, /* Name of the database to use internally */ + Expr *pKey /* Database key for encryption extension */ +){ + int rc; + NameContext sName; + Vdbe *v; + sqlite3* db = pParse->db; + int regArgs; + + if( pParse->nErr ) goto attach_end; + memset(&sName, 0, sizeof(NameContext)); + sName.pParse = pParse; + + if( + SQLITE_OK!=(rc = resolveAttachExpr(&sName, pFilename)) || + SQLITE_OK!=(rc = resolveAttachExpr(&sName, pDbname)) || + SQLITE_OK!=(rc = resolveAttachExpr(&sName, pKey)) + ){ + goto attach_end; + } + +#ifndef SQLITE_OMIT_AUTHORIZATION + if( pAuthArg ){ + char *zAuthArg; + if( pAuthArg->op==TK_STRING ){ + zAuthArg = pAuthArg->u.zToken; + }else{ + zAuthArg = 0; + } + rc = sqlite3AuthCheck(pParse, type, zAuthArg, 0, 0); + if(rc!=SQLITE_OK ){ + goto attach_end; + } + } +#endif /* SQLITE_OMIT_AUTHORIZATION */ + + + v = sqlite3GetVdbe(pParse); + regArgs = sqlite3GetTempRange(pParse, 4); + sqlite3ExprCode(pParse, pFilename, regArgs); + sqlite3ExprCode(pParse, pDbname, regArgs+1); + sqlite3ExprCode(pParse, pKey, regArgs+2); + + assert( v || db->mallocFailed ); + if( v ){ + sqlite3VdbeAddOp4(v, OP_Function0, 0, regArgs+3-pFunc->nArg, regArgs+3, + (char *)pFunc, P4_FUNCDEF); + assert( pFunc->nArg==-1 || (pFunc->nArg&0xff)==pFunc->nArg ); + sqlite3VdbeChangeP5(v, (u8)(pFunc->nArg)); + + /* Code an OP_Expire. For an ATTACH statement, set P1 to true (expire this + ** statement only). For DETACH, set it to false (expire all existing + ** statements). + */ + sqlite3VdbeAddOp1(v, OP_Expire, (type==SQLITE_ATTACH)); + } + +attach_end: + sqlite3ExprDelete(db, pFilename); + sqlite3ExprDelete(db, pDbname); + sqlite3ExprDelete(db, pKey); +} + +/* +** Called by the parser to compile a DETACH statement. +** +** DETACH pDbname +*/ +SQLITE_PRIVATE void sqlite3Detach(Parse *pParse, Expr *pDbname){ + static const FuncDef detach_func = { + 1, /* nArg */ + SQLITE_UTF8, /* funcFlags */ + 0, /* pUserData */ + 0, /* pNext */ + detachFunc, /* xSFunc */ + 0, /* xFinalize */ + "sqlite_detach", /* zName */ + {0} + }; + codeAttach(pParse, SQLITE_DETACH, &detach_func, pDbname, 0, 0, pDbname); +} + +/* +** Called by the parser to compile an ATTACH statement. +** +** ATTACH p AS pDbname KEY pKey +*/ +SQLITE_PRIVATE void sqlite3Attach(Parse *pParse, Expr *p, Expr *pDbname, Expr *pKey){ + static const FuncDef attach_func = { + 3, /* nArg */ + SQLITE_UTF8, /* funcFlags */ + 0, /* pUserData */ + 0, /* pNext */ + attachFunc, /* xSFunc */ + 0, /* xFinalize */ + "sqlite_attach", /* zName */ + {0} + }; + codeAttach(pParse, SQLITE_ATTACH, &attach_func, p, p, pDbname, pKey); +} +#endif /* SQLITE_OMIT_ATTACH */ + +/* +** Initialize a DbFixer structure. This routine must be called prior +** to passing the structure to one of the sqliteFixAAAA() routines below. +*/ +SQLITE_PRIVATE void sqlite3FixInit( + DbFixer *pFix, /* The fixer to be initialized */ + Parse *pParse, /* Error messages will be written here */ + int iDb, /* This is the database that must be used */ + const char *zType, /* "view", "trigger", or "index" */ + const Token *pName /* Name of the view, trigger, or index */ +){ + sqlite3 *db; + + db = pParse->db; + assert( db->nDb>iDb ); + pFix->pParse = pParse; + pFix->zDb = db->aDb[iDb].zDbSName; + pFix->pSchema = db->aDb[iDb].pSchema; + pFix->zType = zType; + pFix->pName = pName; + pFix->bVarOnly = (iDb==1); +} + +/* +** The following set of routines walk through the parse tree and assign +** a specific database to all table references where the database name +** was left unspecified in the original SQL statement. The pFix structure +** must have been initialized by a prior call to sqlite3FixInit(). +** +** These routines are used to make sure that an index, trigger, or +** view in one database does not refer to objects in a different database. +** (Exception: indices, triggers, and views in the TEMP database are +** allowed to refer to anything.) If a reference is explicitly made +** to an object in a different database, an error message is added to +** pParse->zErrMsg and these routines return non-zero. If everything +** checks out, these routines return 0. +*/ +SQLITE_PRIVATE int sqlite3FixSrcList( + DbFixer *pFix, /* Context of the fixation */ + SrcList *pList /* The Source list to check and modify */ +){ + int i; + const char *zDb; + struct SrcList_item *pItem; + + if( NEVER(pList==0) ) return 0; + zDb = pFix->zDb; + for(i=0, pItem=pList->a; inSrc; i++, pItem++){ + if( pFix->bVarOnly==0 ){ + if( pItem->zDatabase && sqlite3StrICmp(pItem->zDatabase, zDb) ){ + sqlite3ErrorMsg(pFix->pParse, + "%s %T cannot reference objects in database %s", + pFix->zType, pFix->pName, pItem->zDatabase); + return 1; + } + sqlite3DbFree(pFix->pParse->db, pItem->zDatabase); + pItem->zDatabase = 0; + pItem->pSchema = pFix->pSchema; + } +#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_TRIGGER) + if( sqlite3FixSelect(pFix, pItem->pSelect) ) return 1; + if( sqlite3FixExpr(pFix, pItem->pOn) ) return 1; +#endif + } + return 0; +} +#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_TRIGGER) +SQLITE_PRIVATE int sqlite3FixSelect( + DbFixer *pFix, /* Context of the fixation */ + Select *pSelect /* The SELECT statement to be fixed to one database */ +){ + while( pSelect ){ + if( sqlite3FixExprList(pFix, pSelect->pEList) ){ + return 1; + } + if( sqlite3FixSrcList(pFix, pSelect->pSrc) ){ + return 1; + } + if( sqlite3FixExpr(pFix, pSelect->pWhere) ){ + return 1; + } + if( sqlite3FixExprList(pFix, pSelect->pGroupBy) ){ + return 1; + } + if( sqlite3FixExpr(pFix, pSelect->pHaving) ){ + return 1; + } + if( sqlite3FixExprList(pFix, pSelect->pOrderBy) ){ + return 1; + } + if( sqlite3FixExpr(pFix, pSelect->pLimit) ){ + return 1; + } + if( sqlite3FixExpr(pFix, pSelect->pOffset) ){ + return 1; + } + pSelect = pSelect->pPrior; + } + return 0; +} +SQLITE_PRIVATE int sqlite3FixExpr( + DbFixer *pFix, /* Context of the fixation */ + Expr *pExpr /* The expression to be fixed to one database */ +){ + while( pExpr ){ + if( pExpr->op==TK_VARIABLE ){ + if( pFix->pParse->db->init.busy ){ + pExpr->op = TK_NULL; + }else{ + sqlite3ErrorMsg(pFix->pParse, "%s cannot use variables", pFix->zType); + return 1; + } + } + if( ExprHasProperty(pExpr, EP_TokenOnly|EP_Leaf) ) break; + if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + if( sqlite3FixSelect(pFix, pExpr->x.pSelect) ) return 1; + }else{ + if( sqlite3FixExprList(pFix, pExpr->x.pList) ) return 1; + } + if( sqlite3FixExpr(pFix, pExpr->pRight) ){ + return 1; + } + pExpr = pExpr->pLeft; + } + return 0; +} +SQLITE_PRIVATE int sqlite3FixExprList( + DbFixer *pFix, /* Context of the fixation */ + ExprList *pList /* The expression to be fixed to one database */ +){ + int i; + struct ExprList_item *pItem; + if( pList==0 ) return 0; + for(i=0, pItem=pList->a; inExpr; i++, pItem++){ + if( sqlite3FixExpr(pFix, pItem->pExpr) ){ + return 1; + } + } + return 0; +} +#endif + +#ifndef SQLITE_OMIT_TRIGGER +SQLITE_PRIVATE int sqlite3FixTriggerStep( + DbFixer *pFix, /* Context of the fixation */ + TriggerStep *pStep /* The trigger step be fixed to one database */ +){ + while( pStep ){ + if( sqlite3FixSelect(pFix, pStep->pSelect) ){ + return 1; + } + if( sqlite3FixExpr(pFix, pStep->pWhere) ){ + return 1; + } + if( sqlite3FixExprList(pFix, pStep->pExprList) ){ + return 1; + } + pStep = pStep->pNext; + } + return 0; +} +#endif + +/************** End of attach.c **********************************************/ +/************** Begin file auth.c ********************************************/ +/* +** 2003 January 11 +** +** 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 implement the sqlite3_set_authorizer() +** 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 +*/ +/* #include "sqliteInt.h" */ + +/* +** All of the code in this file may be omitted by defining a single +** macro. +*/ +#ifndef SQLITE_OMIT_AUTHORIZATION + +/* +** Set or clear the access authorization function. +** +** The access authorization function is be called during the compilation +** phase to verify that the user has read and/or write access permission on +** various fields of the database. The first argument to the auth function +** is a copy of the 3rd argument to this routine. The second argument +** to the auth function is one of these constants: +** +** SQLITE_CREATE_INDEX +** SQLITE_CREATE_TABLE +** SQLITE_CREATE_TEMP_INDEX +** SQLITE_CREATE_TEMP_TABLE +** SQLITE_CREATE_TEMP_TRIGGER +** SQLITE_CREATE_TEMP_VIEW +** SQLITE_CREATE_TRIGGER +** SQLITE_CREATE_VIEW +** SQLITE_DELETE +** SQLITE_DROP_INDEX +** SQLITE_DROP_TABLE +** SQLITE_DROP_TEMP_INDEX +** SQLITE_DROP_TEMP_TABLE +** SQLITE_DROP_TEMP_TRIGGER +** SQLITE_DROP_TEMP_VIEW +** SQLITE_DROP_TRIGGER +** SQLITE_DROP_VIEW +** SQLITE_INSERT +** SQLITE_PRAGMA +** SQLITE_READ +** SQLITE_SELECT +** SQLITE_TRANSACTION +** SQLITE_UPDATE +** +** The third and fourth arguments to the auth function are the name of +** the table and the column that are being accessed. The auth function +** should return either SQLITE_OK, SQLITE_DENY, or SQLITE_IGNORE. If +** SQLITE_OK is returned, it means that access is allowed. SQLITE_DENY +** means that the SQL statement will never-run - the sqlite3_exec() call +** will return with an error. SQLITE_IGNORE means that the SQL statement +** should run but attempts to read the specified column will return NULL +** and attempts to write the column will be ignored. +** +** Setting the auth function to NULL disables this hook. The default +** setting of the auth function is NULL. +*/ +SQLITE_API int sqlite3_set_authorizer( + sqlite3 *db, + int (*xAuth)(void*,int,const char*,const char*,const char*,const char*), + void *pArg +){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; +#endif + sqlite3_mutex_enter(db->mutex); + db->xAuth = (sqlite3_xauth)xAuth; + db->pAuthArg = pArg; + sqlite3ExpirePreparedStatements(db); + sqlite3_mutex_leave(db->mutex); + return SQLITE_OK; +} + +/* +** Write an error message into pParse->zErrMsg that explains that the +** user-supplied authorization function returned an illegal value. +*/ +static void sqliteAuthBadReturnCode(Parse *pParse){ + sqlite3ErrorMsg(pParse, "authorizer malfunction"); + pParse->rc = SQLITE_ERROR; +} + +/* +** Invoke the authorization callback for permission to read column zCol from +** table zTab in database zDb. This function assumes that an authorization +** callback has been registered (i.e. that sqlite3.xAuth is not NULL). +** +** If SQLITE_IGNORE is returned and pExpr is not NULL, then pExpr is changed +** to an SQL NULL expression. Otherwise, if pExpr is NULL, then SQLITE_IGNORE +** is treated as SQLITE_DENY. In this case an error is left in pParse. +*/ +SQLITE_PRIVATE int sqlite3AuthReadCol( + Parse *pParse, /* The parser context */ + const char *zTab, /* Table name */ + const char *zCol, /* Column name */ + int iDb /* Index of containing database. */ +){ + sqlite3 *db = pParse->db; /* Database handle */ + char *zDb = db->aDb[iDb].zDbSName; /* Schema name of attached database */ + int rc; /* Auth callback return code */ + + if( db->init.busy ) return SQLITE_OK; + rc = db->xAuth(db->pAuthArg, SQLITE_READ, zTab,zCol,zDb,pParse->zAuthContext +#ifdef SQLITE_USER_AUTHENTICATION + ,db->auth.zAuthUser +#endif + ); + if( rc==SQLITE_DENY ){ + if( db->nDb>2 || iDb!=0 ){ + sqlite3ErrorMsg(pParse, "access to %s.%s.%s is prohibited",zDb,zTab,zCol); + }else{ + sqlite3ErrorMsg(pParse, "access to %s.%s is prohibited", zTab, zCol); + } + pParse->rc = SQLITE_AUTH; + }else if( rc!=SQLITE_IGNORE && rc!=SQLITE_OK ){ + sqliteAuthBadReturnCode(pParse); + } + return rc; +} + +/* +** The pExpr should be a TK_COLUMN expression. The table referred to +** is in pTabList or else it is the NEW or OLD table of a trigger. +** Check to see if it is OK to read this particular column. +** +** If the auth function returns SQLITE_IGNORE, change the TK_COLUMN +** instruction into a TK_NULL. If the auth function returns SQLITE_DENY, +** then generate an error. +*/ +SQLITE_PRIVATE void sqlite3AuthRead( + Parse *pParse, /* The parser context */ + Expr *pExpr, /* The expression to check authorization on */ + Schema *pSchema, /* The schema of the expression */ + SrcList *pTabList /* All table that pExpr might refer to */ +){ + sqlite3 *db = pParse->db; + Table *pTab = 0; /* The table being read */ + const char *zCol; /* Name of the column of the table */ + int iSrc; /* Index in pTabList->a[] of table being read */ + int iDb; /* The index of the database the expression refers to */ + int iCol; /* Index of column in table */ + + if( db->xAuth==0 ) return; + iDb = sqlite3SchemaToIndex(pParse->db, pSchema); + if( iDb<0 ){ + /* An attempt to read a column out of a subquery or other + ** temporary table. */ + return; + } + + assert( pExpr->op==TK_COLUMN || pExpr->op==TK_TRIGGER ); + if( pExpr->op==TK_TRIGGER ){ + pTab = pParse->pTriggerTab; + }else{ + assert( pTabList ); + for(iSrc=0; ALWAYS(iSrcnSrc); iSrc++){ + if( pExpr->iTable==pTabList->a[iSrc].iCursor ){ + pTab = pTabList->a[iSrc].pTab; + break; + } + } + } + iCol = pExpr->iColumn; + if( NEVER(pTab==0) ) return; + + if( iCol>=0 ){ + assert( iColnCol ); + zCol = pTab->aCol[iCol].zName; + }else if( pTab->iPKey>=0 ){ + assert( pTab->iPKeynCol ); + zCol = pTab->aCol[pTab->iPKey].zName; + }else{ + zCol = "ROWID"; + } + assert( iDb>=0 && iDbnDb ); + if( SQLITE_IGNORE==sqlite3AuthReadCol(pParse, pTab->zName, zCol, iDb) ){ + pExpr->op = TK_NULL; + } +} + +/* +** Do an authorization check using the code and arguments given. Return +** either SQLITE_OK (zero) or SQLITE_IGNORE or SQLITE_DENY. If SQLITE_DENY +** is returned, then the error count and error message in pParse are +** modified appropriately. +*/ +SQLITE_PRIVATE int sqlite3AuthCheck( + Parse *pParse, + int code, + const char *zArg1, + const char *zArg2, + const char *zArg3 +){ + sqlite3 *db = pParse->db; + int rc; + + /* Don't do any authorization checks if the database is initialising + ** or if the parser is being invoked from within sqlite3_declare_vtab. + */ + if( db->init.busy || IN_DECLARE_VTAB ){ + return SQLITE_OK; + } + + if( db->xAuth==0 ){ + return SQLITE_OK; + } + rc = db->xAuth(db->pAuthArg, code, zArg1, zArg2, zArg3, pParse->zAuthContext +#ifdef SQLITE_USER_AUTHENTICATION + ,db->auth.zAuthUser +#endif + ); + if( rc==SQLITE_DENY ){ + sqlite3ErrorMsg(pParse, "not authorized"); + pParse->rc = SQLITE_AUTH; + }else if( rc!=SQLITE_OK && rc!=SQLITE_IGNORE ){ + rc = SQLITE_DENY; + sqliteAuthBadReturnCode(pParse); + } + return rc; +} + +/* +** Push an authorization context. After this routine is called, the +** zArg3 argument to authorization callbacks will be zContext until +** popped. Or if pParse==0, this routine is a no-op. +*/ +SQLITE_PRIVATE void sqlite3AuthContextPush( + Parse *pParse, + AuthContext *pContext, + const char *zContext +){ + assert( pParse ); + pContext->pParse = pParse; + pContext->zAuthContext = pParse->zAuthContext; + pParse->zAuthContext = zContext; +} + +/* +** Pop an authorization context that was previously pushed +** by sqlite3AuthContextPush +*/ +SQLITE_PRIVATE void sqlite3AuthContextPop(AuthContext *pContext){ + if( pContext->pParse ){ + pContext->pParse->zAuthContext = pContext->zAuthContext; + pContext->pParse = 0; + } +} + +#endif /* SQLITE_OMIT_AUTHORIZATION */ + +/************** End of auth.c ************************************************/ +/************** Begin file build.c *******************************************/ +/* +** 2001 September 15 +** +** 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 C code routines that are called by the SQLite parser +** when syntax rules are reduced. The routines in this file handle the +** following kinds of SQL syntax: +** +** CREATE TABLE +** DROP TABLE +** CREATE INDEX +** DROP INDEX +** creating ID lists +** BEGIN TRANSACTION +** COMMIT +** ROLLBACK +*/ +/* #include "sqliteInt.h" */ + +#ifndef SQLITE_OMIT_SHARED_CACHE +/* +** The TableLock structure is only used by the sqlite3TableLock() and +** codeTableLocks() functions. +*/ +struct TableLock { + int iDb; /* The database containing the table to be locked */ + int iTab; /* The root page of the table to be locked */ + u8 isWriteLock; /* True for write lock. False for a read lock */ + const char *zName; /* Name of the table */ +}; + +/* +** Record the fact that we want to lock a table at run-time. +** +** The table to be locked has root page iTab and is found in database iDb. +** A read or a write lock can be taken depending on isWritelock. +** +** This routine just records the fact that the lock is desired. The +** code to make the lock occur is generated by a later call to +** codeTableLocks() which occurs during sqlite3FinishCoding(). +*/ +SQLITE_PRIVATE void sqlite3TableLock( + Parse *pParse, /* Parsing context */ + int iDb, /* Index of the database containing the table to lock */ + int iTab, /* Root page number of the table to be locked */ + u8 isWriteLock, /* True for a write lock */ + const char *zName /* Name of the table to be locked */ +){ + Parse *pToplevel = sqlite3ParseToplevel(pParse); + int i; + int nBytes; + TableLock *p; + assert( iDb>=0 ); + + for(i=0; inTableLock; i++){ + p = &pToplevel->aTableLock[i]; + if( p->iDb==iDb && p->iTab==iTab ){ + p->isWriteLock = (p->isWriteLock || isWriteLock); + return; + } + } + + nBytes = sizeof(TableLock) * (pToplevel->nTableLock+1); + pToplevel->aTableLock = + sqlite3DbReallocOrFree(pToplevel->db, pToplevel->aTableLock, nBytes); + if( pToplevel->aTableLock ){ + p = &pToplevel->aTableLock[pToplevel->nTableLock++]; + p->iDb = iDb; + p->iTab = iTab; + p->isWriteLock = isWriteLock; + p->zName = zName; + }else{ + pToplevel->nTableLock = 0; + sqlite3OomFault(pToplevel->db); + } +} + +/* +** Code an OP_TableLock instruction for each table locked by the +** statement (configured by calls to sqlite3TableLock()). +*/ +static void codeTableLocks(Parse *pParse){ + int i; + Vdbe *pVdbe; + + pVdbe = sqlite3GetVdbe(pParse); + assert( pVdbe!=0 ); /* sqlite3GetVdbe cannot fail: VDBE already allocated */ + + for(i=0; inTableLock; i++){ + TableLock *p = &pParse->aTableLock[i]; + int p1 = p->iDb; + sqlite3VdbeAddOp4(pVdbe, OP_TableLock, p1, p->iTab, p->isWriteLock, + p->zName, P4_STATIC); + } +} +#else + #define codeTableLocks(x) +#endif + +/* +** Return TRUE if the given yDbMask object is empty - if it contains no +** 1 bits. This routine is used by the DbMaskAllZero() and DbMaskNotZero() +** macros when SQLITE_MAX_ATTACHED is greater than 30. +*/ +#if SQLITE_MAX_ATTACHED>30 +SQLITE_PRIVATE int sqlite3DbMaskAllZero(yDbMask m){ + int i; + for(i=0; ipToplevel==0 ); + db = pParse->db; + if( pParse->nested ) return; + if( db->mallocFailed || pParse->nErr ){ + if( pParse->rc==SQLITE_OK ) pParse->rc = SQLITE_ERROR; + return; + } + + /* Begin by generating some termination code at the end of the + ** vdbe program + */ + v = sqlite3GetVdbe(pParse); + assert( !pParse->isMultiWrite + || sqlite3VdbeAssertMayAbort(v, pParse->mayAbort)); + if( v ){ + sqlite3VdbeAddOp0(v, OP_Halt); + +#if SQLITE_USER_AUTHENTICATION + if( pParse->nTableLock>0 && db->init.busy==0 ){ + sqlite3UserAuthInit(db); + if( db->auth.authLevelrc = SQLITE_AUTH_USER; + return; + } + } +#endif + + /* The cookie mask contains one bit for each database file open. + ** (Bit 0 is for main, bit 1 is for temp, and so forth.) Bits are + ** set for each database that is used. Generate code to start a + ** transaction on each used database and to verify the schema cookie + ** on each used database. + */ + if( db->mallocFailed==0 + && (DbMaskNonZero(pParse->cookieMask) || pParse->pConstExpr) + ){ + int iDb, i; + assert( sqlite3VdbeGetOp(v, 0)->opcode==OP_Init ); + sqlite3VdbeJumpHere(v, 0); + for(iDb=0; iDbnDb; iDb++){ + Schema *pSchema; + if( DbMaskTest(pParse->cookieMask, iDb)==0 ) continue; + sqlite3VdbeUsesBtree(v, iDb); + pSchema = db->aDb[iDb].pSchema; + sqlite3VdbeAddOp4Int(v, + OP_Transaction, /* Opcode */ + iDb, /* P1 */ + DbMaskTest(pParse->writeMask,iDb), /* P2 */ + pSchema->schema_cookie, /* P3 */ + pSchema->iGeneration /* P4 */ + ); + if( db->init.busy==0 ) sqlite3VdbeChangeP5(v, 1); + VdbeComment((v, + "usesStmtJournal=%d", pParse->mayAbort && pParse->isMultiWrite)); + } +#ifndef SQLITE_OMIT_VIRTUALTABLE + for(i=0; inVtabLock; i++){ + char *vtab = (char *)sqlite3GetVTable(db, pParse->apVtabLock[i]); + sqlite3VdbeAddOp4(v, OP_VBegin, 0, 0, 0, vtab, P4_VTAB); + } + pParse->nVtabLock = 0; +#endif + + /* Once all the cookies have been verified and transactions opened, + ** obtain the required table-locks. This is a no-op unless the + ** shared-cache feature is enabled. + */ + codeTableLocks(pParse); + + /* Initialize any AUTOINCREMENT data structures required. + */ + sqlite3AutoincrementBegin(pParse); + + /* Code constant expressions that where factored out of inner loops */ + if( pParse->pConstExpr ){ + ExprList *pEL = pParse->pConstExpr; + pParse->okConstFactor = 0; + for(i=0; inExpr; i++){ + sqlite3ExprCode(pParse, pEL->a[i].pExpr, pEL->a[i].u.iConstExprReg); + } + } + + /* Finally, jump back to the beginning of the executable code. */ + sqlite3VdbeGoto(v, 1); + } + } + + + /* Get the VDBE program ready for execution + */ + if( v && pParse->nErr==0 && !db->mallocFailed ){ + assert( pParse->iCacheLevel==0 ); /* Disables and re-enables match */ + /* A minimum of one cursor is required if autoincrement is used + * See ticket [a696379c1f08866] */ + if( pParse->pAinc!=0 && pParse->nTab==0 ) pParse->nTab = 1; + sqlite3VdbeMakeReady(v, pParse); + pParse->rc = SQLITE_DONE; + }else{ + pParse->rc = SQLITE_ERROR; + } +} + +/* +** Run the parser and code generator recursively in order to generate +** code for the SQL statement given onto the end of the pParse context +** currently under construction. When the parser is run recursively +** this way, the final OP_Halt is not appended and other initialization +** and finalization steps are omitted because those are handling by the +** outermost parser. +** +** Not everything is nestable. This facility is designed to permit +** INSERT, UPDATE, and DELETE operations against SQLITE_MASTER. Use +** care if you decide to try to use this routine for some other purposes. +*/ +SQLITE_PRIVATE void sqlite3NestedParse(Parse *pParse, const char *zFormat, ...){ + va_list ap; + char *zSql; + char *zErrMsg = 0; + sqlite3 *db = pParse->db; + char saveBuf[PARSE_TAIL_SZ]; + + if( pParse->nErr ) return; + assert( pParse->nested<10 ); /* Nesting should only be of limited depth */ + va_start(ap, zFormat); + zSql = sqlite3VMPrintf(db, zFormat, ap); + va_end(ap); + if( zSql==0 ){ + return; /* A malloc must have failed */ + } + pParse->nested++; + memcpy(saveBuf, PARSE_TAIL(pParse), PARSE_TAIL_SZ); + memset(PARSE_TAIL(pParse), 0, PARSE_TAIL_SZ); + sqlite3RunParser(pParse, zSql, &zErrMsg); + sqlite3DbFree(db, zErrMsg); + sqlite3DbFree(db, zSql); + memcpy(PARSE_TAIL(pParse), saveBuf, PARSE_TAIL_SZ); + pParse->nested--; +} + +#if SQLITE_USER_AUTHENTICATION +/* +** Return TRUE if zTable is the name of the system table that stores the +** list of users and their access credentials. +*/ +SQLITE_PRIVATE int sqlite3UserAuthTable(const char *zTable){ + return sqlite3_stricmp(zTable, "sqlite_user")==0; +} +#endif + +/* +** Locate the in-memory structure that describes a particular database +** table given the name of that table and (optionally) the name of the +** database containing the table. Return NULL if not found. +** +** If zDatabase is 0, all databases are searched for the table and the +** first matching table is returned. (No checking for duplicate table +** names is done.) The search order is TEMP first, then MAIN, then any +** auxiliary databases added using the ATTACH command. +** +** See also sqlite3LocateTable(). +*/ +SQLITE_PRIVATE Table *sqlite3FindTable(sqlite3 *db, const char *zName, const char *zDatabase){ + Table *p = 0; + int i; + + /* All mutexes are required for schema access. Make sure we hold them. */ + assert( zDatabase!=0 || sqlite3BtreeHoldsAllMutexes(db) ); +#if SQLITE_USER_AUTHENTICATION + /* Only the admin user is allowed to know that the sqlite_user table + ** exists */ + if( db->auth.authLevelnDb; i++){ + int j = (i<2) ? i^1 : i; /* Search TEMP before MAIN */ + if( zDatabase==0 || sqlite3StrICmp(zDatabase, db->aDb[j].zDbSName)==0 ){ + assert( sqlite3SchemaMutexHeld(db, j, 0) ); + p = sqlite3HashFind(&db->aDb[j].pSchema->tblHash, zName); + if( p ) break; + } + } + return p; +} + +/* +** Locate the in-memory structure that describes a particular database +** table given the name of that table and (optionally) the name of the +** database containing the table. Return NULL if not found. Also leave an +** error message in pParse->zErrMsg. +** +** The difference between this routine and sqlite3FindTable() is that this +** routine leaves an error message in pParse->zErrMsg where +** sqlite3FindTable() does not. +*/ +SQLITE_PRIVATE Table *sqlite3LocateTable( + Parse *pParse, /* context in which to report errors */ + u32 flags, /* LOCATE_VIEW or LOCATE_NOERR */ + const char *zName, /* Name of the table we are looking for */ + const char *zDbase /* Name of the database. Might be NULL */ +){ + Table *p; + + /* Read the database schema. If an error occurs, leave an error message + ** and code in pParse and return NULL. */ + if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){ + return 0; + } + + p = sqlite3FindTable(pParse->db, zName, zDbase); + if( p==0 ){ + const char *zMsg = flags & LOCATE_VIEW ? "no such view" : "no such table"; +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( sqlite3FindDbName(pParse->db, zDbase)<1 ){ + /* If zName is the not the name of a table in the schema created using + ** CREATE, then check to see if it is the name of an virtual table that + ** can be an eponymous virtual table. */ + Module *pMod = (Module*)sqlite3HashFind(&pParse->db->aModule, zName); + if( pMod && sqlite3VtabEponymousTableInit(pParse, pMod) ){ + return pMod->pEpoTab; + } + } +#endif + if( (flags & LOCATE_NOERR)==0 ){ + if( zDbase ){ + sqlite3ErrorMsg(pParse, "%s: %s.%s", zMsg, zDbase, zName); + }else{ + sqlite3ErrorMsg(pParse, "%s: %s", zMsg, zName); + } + pParse->checkSchema = 1; + } + } + + return p; +} + +/* +** Locate the table identified by *p. +** +** This is a wrapper around sqlite3LocateTable(). The difference between +** sqlite3LocateTable() and this function is that this function restricts +** the search to schema (p->pSchema) if it is not NULL. p->pSchema may be +** non-NULL if it is part of a view or trigger program definition. See +** sqlite3FixSrcList() for details. +*/ +SQLITE_PRIVATE Table *sqlite3LocateTableItem( + Parse *pParse, + u32 flags, + struct SrcList_item *p +){ + const char *zDb; + assert( p->pSchema==0 || p->zDatabase==0 ); + if( p->pSchema ){ + int iDb = sqlite3SchemaToIndex(pParse->db, p->pSchema); + zDb = pParse->db->aDb[iDb].zDbSName; + }else{ + zDb = p->zDatabase; + } + return sqlite3LocateTable(pParse, flags, p->zName, zDb); +} + +/* +** Locate the in-memory structure that describes +** a particular index given the name of that index +** and the name of the database that contains the index. +** Return NULL if not found. +** +** If zDatabase is 0, all databases are searched for the +** table and the first matching index is returned. (No checking +** for duplicate index names is done.) The search order is +** TEMP first, then MAIN, then any auxiliary databases added +** using the ATTACH command. +*/ +SQLITE_PRIVATE Index *sqlite3FindIndex(sqlite3 *db, const char *zName, const char *zDb){ + Index *p = 0; + int i; + /* All mutexes are required for schema access. Make sure we hold them. */ + assert( zDb!=0 || sqlite3BtreeHoldsAllMutexes(db) ); + for(i=OMIT_TEMPDB; inDb; i++){ + int j = (i<2) ? i^1 : i; /* Search TEMP before MAIN */ + Schema *pSchema = db->aDb[j].pSchema; + assert( pSchema ); + if( zDb && sqlite3StrICmp(zDb, db->aDb[j].zDbSName) ) continue; + assert( sqlite3SchemaMutexHeld(db, j, 0) ); + p = sqlite3HashFind(&pSchema->idxHash, zName); + if( p ) break; + } + return p; +} + +/* +** Reclaim the memory used by an index +*/ +static void freeIndex(sqlite3 *db, Index *p){ +#ifndef SQLITE_OMIT_ANALYZE + sqlite3DeleteIndexSamples(db, p); +#endif + sqlite3ExprDelete(db, p->pPartIdxWhere); + sqlite3ExprListDelete(db, p->aColExpr); + sqlite3DbFree(db, p->zColAff); + if( p->isResized ) sqlite3DbFree(db, (void *)p->azColl); +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 + sqlite3_free(p->aiRowEst); +#endif + sqlite3DbFree(db, p); +} + +/* +** For the index called zIdxName which is found in the database iDb, +** unlike that index from its Table then remove the index from +** the index hash table and free all memory structures associated +** with the index. +*/ +SQLITE_PRIVATE void sqlite3UnlinkAndDeleteIndex(sqlite3 *db, int iDb, const char *zIdxName){ + Index *pIndex; + Hash *pHash; + + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + pHash = &db->aDb[iDb].pSchema->idxHash; + pIndex = sqlite3HashInsert(pHash, zIdxName, 0); + if( ALWAYS(pIndex) ){ + if( pIndex->pTable->pIndex==pIndex ){ + pIndex->pTable->pIndex = pIndex->pNext; + }else{ + Index *p; + /* Justification of ALWAYS(); The index must be on the list of + ** indices. */ + p = pIndex->pTable->pIndex; + while( ALWAYS(p) && p->pNext!=pIndex ){ p = p->pNext; } + if( ALWAYS(p && p->pNext==pIndex) ){ + p->pNext = pIndex->pNext; + } + } + freeIndex(db, pIndex); + } + db->flags |= SQLITE_InternChanges; +} + +/* +** Look through the list of open database files in db->aDb[] and if +** any have been closed, remove them from the list. Reallocate the +** db->aDb[] structure to a smaller size, if possible. +** +** Entry 0 (the "main" database) and entry 1 (the "temp" database) +** are never candidates for being collapsed. +*/ +SQLITE_PRIVATE void sqlite3CollapseDatabaseArray(sqlite3 *db){ + int i, j; + for(i=j=2; inDb; i++){ + struct Db *pDb = &db->aDb[i]; + if( pDb->pBt==0 ){ + sqlite3DbFree(db, pDb->zDbSName); + pDb->zDbSName = 0; + continue; + } + if( jaDb[j] = db->aDb[i]; + } + j++; + } + db->nDb = j; + if( db->nDb<=2 && db->aDb!=db->aDbStatic ){ + memcpy(db->aDbStatic, db->aDb, 2*sizeof(db->aDb[0])); + sqlite3DbFree(db, db->aDb); + db->aDb = db->aDbStatic; + } +} + +/* +** Reset the schema for the database at index iDb. Also reset the +** TEMP schema. +*/ +SQLITE_PRIVATE void sqlite3ResetOneSchema(sqlite3 *db, int iDb){ + Db *pDb; + assert( iDbnDb ); + + /* Case 1: Reset the single schema identified by iDb */ + pDb = &db->aDb[iDb]; + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + assert( pDb->pSchema!=0 ); + sqlite3SchemaClear(pDb->pSchema); + + /* If any database other than TEMP is reset, then also reset TEMP + ** since TEMP might be holding triggers that reference tables in the + ** other database. + */ + if( iDb!=1 ){ + pDb = &db->aDb[1]; + assert( pDb->pSchema!=0 ); + sqlite3SchemaClear(pDb->pSchema); + } + return; +} + +/* +** Erase all schema information from all attached databases (including +** "main" and "temp") for a single database connection. +*/ +SQLITE_PRIVATE void sqlite3ResetAllSchemasOfConnection(sqlite3 *db){ + int i; + sqlite3BtreeEnterAll(db); + for(i=0; inDb; i++){ + Db *pDb = &db->aDb[i]; + if( pDb->pSchema ){ + sqlite3SchemaClear(pDb->pSchema); + } + } + db->flags &= ~SQLITE_InternChanges; + sqlite3VtabUnlockList(db); + sqlite3BtreeLeaveAll(db); + sqlite3CollapseDatabaseArray(db); +} + +/* +** This routine is called when a commit occurs. +*/ +SQLITE_PRIVATE void sqlite3CommitInternalChanges(sqlite3 *db){ + db->flags &= ~SQLITE_InternChanges; +} + +/* +** Delete memory allocated for the column names of a table or view (the +** Table.aCol[] array). +*/ +SQLITE_PRIVATE void sqlite3DeleteColumnNames(sqlite3 *db, Table *pTable){ + int i; + Column *pCol; + assert( pTable!=0 ); + if( (pCol = pTable->aCol)!=0 ){ + for(i=0; inCol; i++, pCol++){ + sqlite3DbFree(db, pCol->zName); + sqlite3ExprDelete(db, pCol->pDflt); + sqlite3DbFree(db, pCol->zColl); + } + sqlite3DbFree(db, pTable->aCol); + } +} + +/* +** Remove the memory data structures associated with the given +** Table. No changes are made to disk by this routine. +** +** This routine just deletes the data structure. It does not unlink +** the table data structure from the hash table. But it does destroy +** memory structures of the indices and foreign keys associated with +** the table. +** +** The db parameter is optional. It is needed if the Table object +** contains lookaside memory. (Table objects in the schema do not use +** lookaside memory, but some ephemeral Table objects do.) Or the +** db parameter can be used with db->pnBytesFreed to measure the memory +** used by the Table object. +*/ +static void SQLITE_NOINLINE deleteTable(sqlite3 *db, Table *pTable){ + Index *pIndex, *pNext; + TESTONLY( int nLookaside; ) /* Used to verify lookaside not used for schema */ + + /* Record the number of outstanding lookaside allocations in schema Tables + ** prior to doing any free() operations. Since schema Tables do not use + ** lookaside, this number should not change. */ + TESTONLY( nLookaside = (db && (pTable->tabFlags & TF_Ephemeral)==0) ? + db->lookaside.nOut : 0 ); + + /* Delete all indices associated with this table. */ + for(pIndex = pTable->pIndex; pIndex; pIndex=pNext){ + pNext = pIndex->pNext; + assert( pIndex->pSchema==pTable->pSchema + || (IsVirtual(pTable) && pIndex->idxType!=SQLITE_IDXTYPE_APPDEF) ); + if( (db==0 || db->pnBytesFreed==0) && !IsVirtual(pTable) ){ + char *zName = pIndex->zName; + TESTONLY ( Index *pOld = ) sqlite3HashInsert( + &pIndex->pSchema->idxHash, zName, 0 + ); + assert( db==0 || sqlite3SchemaMutexHeld(db, 0, pIndex->pSchema) ); + assert( pOld==pIndex || pOld==0 ); + } + freeIndex(db, pIndex); + } + + /* Delete any foreign keys attached to this table. */ + sqlite3FkDelete(db, pTable); + + /* Delete the Table structure itself. + */ + sqlite3DeleteColumnNames(db, pTable); + sqlite3DbFree(db, pTable->zName); + sqlite3DbFree(db, pTable->zColAff); + sqlite3SelectDelete(db, pTable->pSelect); + sqlite3ExprListDelete(db, pTable->pCheck); +#ifndef SQLITE_OMIT_VIRTUALTABLE + sqlite3VtabClear(db, pTable); +#endif + sqlite3DbFree(db, pTable); + + /* Verify that no lookaside memory was used by schema tables */ + assert( nLookaside==0 || nLookaside==db->lookaside.nOut ); +} +SQLITE_PRIVATE void sqlite3DeleteTable(sqlite3 *db, Table *pTable){ + /* Do not delete the table until the reference count reaches zero. */ + if( !pTable ) return; + if( ((!db || db->pnBytesFreed==0) && (--pTable->nRef)>0) ) return; + deleteTable(db, pTable); +} + + +/* +** Unlink the given table from the hash tables and the delete the +** table structure with all its indices and foreign keys. +*/ +SQLITE_PRIVATE void sqlite3UnlinkAndDeleteTable(sqlite3 *db, int iDb, const char *zTabName){ + Table *p; + Db *pDb; + + assert( db!=0 ); + assert( iDb>=0 && iDbnDb ); + assert( zTabName ); + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + testcase( zTabName[0]==0 ); /* Zero-length table names are allowed */ + pDb = &db->aDb[iDb]; + p = sqlite3HashInsert(&pDb->pSchema->tblHash, zTabName, 0); + sqlite3DeleteTable(db, p); + db->flags |= SQLITE_InternChanges; +} + +/* +** Given a token, return a string that consists of the text of that +** token. Space to hold the returned string +** is obtained from sqliteMalloc() and must be freed by the calling +** function. +** +** Any quotation marks (ex: "name", 'name', [name], or `name`) that +** surround the body of the token are removed. +** +** Tokens are often just pointers into the original SQL text and so +** are not \000 terminated and are not persistent. The returned string +** is \000 terminated and is persistent. +*/ +SQLITE_PRIVATE char *sqlite3NameFromToken(sqlite3 *db, Token *pName){ + char *zName; + if( pName ){ + zName = sqlite3DbStrNDup(db, (char*)pName->z, pName->n); + sqlite3Dequote(zName); + }else{ + zName = 0; + } + return zName; +} + +/* +** Open the sqlite_master table stored in database number iDb for +** writing. The table is opened using cursor 0. +*/ +SQLITE_PRIVATE void sqlite3OpenMasterTable(Parse *p, int iDb){ + Vdbe *v = sqlite3GetVdbe(p); + sqlite3TableLock(p, iDb, MASTER_ROOT, 1, SCHEMA_TABLE(iDb)); + sqlite3VdbeAddOp4Int(v, OP_OpenWrite, 0, MASTER_ROOT, iDb, 5); + if( p->nTab==0 ){ + p->nTab = 1; + } +} + +/* +** Parameter zName points to a nul-terminated buffer containing the name +** of a database ("main", "temp" or the name of an attached db). This +** function returns the index of the named database in db->aDb[], or +** -1 if the named db cannot be found. +*/ +SQLITE_PRIVATE int sqlite3FindDbName(sqlite3 *db, const char *zName){ + int i = -1; /* Database number */ + if( zName ){ + Db *pDb; + for(i=(db->nDb-1), pDb=&db->aDb[i]; i>=0; i--, pDb--){ + if( 0==sqlite3StrICmp(pDb->zDbSName, zName) ) break; + } + } + return i; +} + +/* +** The token *pName contains the name of a database (either "main" or +** "temp" or the name of an attached db). This routine returns the +** index of the named database in db->aDb[], or -1 if the named db +** does not exist. +*/ +SQLITE_PRIVATE int sqlite3FindDb(sqlite3 *db, Token *pName){ + int i; /* Database number */ + char *zName; /* Name we are searching for */ + zName = sqlite3NameFromToken(db, pName); + i = sqlite3FindDbName(db, zName); + sqlite3DbFree(db, zName); + return i; +} + +/* The table or view or trigger name is passed to this routine via tokens +** pName1 and pName2. If the table name was fully qualified, for example: +** +** CREATE TABLE xxx.yyy (...); +** +** Then pName1 is set to "xxx" and pName2 "yyy". On the other hand if +** the table name is not fully qualified, i.e.: +** +** CREATE TABLE yyy(...); +** +** Then pName1 is set to "yyy" and pName2 is "". +** +** This routine sets the *ppUnqual pointer to point at the token (pName1 or +** pName2) that stores the unqualified table name. The index of the +** database "xxx" is returned. +*/ +SQLITE_PRIVATE int sqlite3TwoPartName( + Parse *pParse, /* Parsing and code generating context */ + Token *pName1, /* The "xxx" in the name "xxx.yyy" or "xxx" */ + Token *pName2, /* The "yyy" in the name "xxx.yyy" */ + Token **pUnqual /* Write the unqualified object name here */ +){ + int iDb; /* Database holding the object */ + sqlite3 *db = pParse->db; + + assert( pName2!=0 ); + if( pName2->n>0 ){ + if( db->init.busy ) { + sqlite3ErrorMsg(pParse, "corrupt database"); + return -1; + } + *pUnqual = pName2; + iDb = sqlite3FindDb(db, pName1); + if( iDb<0 ){ + sqlite3ErrorMsg(pParse, "unknown database %T", pName1); + return -1; + } + }else{ + assert( db->init.iDb==0 || db->init.busy || (db->flags & SQLITE_Vacuum)!=0); + iDb = db->init.iDb; + *pUnqual = pName1; + } + return iDb; +} + +/* +** This routine is used to check if the UTF-8 string zName is a legal +** unqualified name for a new schema object (table, index, view or +** trigger). All names are legal except those that begin with the string +** "sqlite_" (in upper, lower or mixed case). This portion of the namespace +** is reserved for internal use. +*/ +SQLITE_PRIVATE int sqlite3CheckObjectName(Parse *pParse, const char *zName){ + if( !pParse->db->init.busy && pParse->nested==0 + && (pParse->db->flags & SQLITE_WriteSchema)==0 + && 0==sqlite3StrNICmp(zName, "sqlite_", 7) ){ + sqlite3ErrorMsg(pParse, "object name reserved for internal use: %s", zName); + return SQLITE_ERROR; + } + return SQLITE_OK; +} + +/* +** Return the PRIMARY KEY index of a table +*/ +SQLITE_PRIVATE Index *sqlite3PrimaryKeyIndex(Table *pTab){ + Index *p; + for(p=pTab->pIndex; p && !IsPrimaryKeyIndex(p); p=p->pNext){} + return p; +} + +/* +** Return the column of index pIdx that corresponds to table +** column iCol. Return -1 if not found. +*/ +SQLITE_PRIVATE i16 sqlite3ColumnOfIndex(Index *pIdx, i16 iCol){ + int i; + for(i=0; inColumn; i++){ + if( iCol==pIdx->aiColumn[i] ) return i; + } + return -1; +} + +/* +** Begin constructing a new table representation in memory. This is +** the first of several action routines that get called in response +** to a CREATE TABLE statement. In particular, this routine is called +** after seeing tokens "CREATE" and "TABLE" and the table name. The isTemp +** flag is true if the table should be stored in the auxiliary database +** file instead of in the main database file. This is normally the case +** when the "TEMP" or "TEMPORARY" keyword occurs in between +** CREATE and TABLE. +** +** The new table record is initialized and put in pParse->pNewTable. +** As more of the CREATE TABLE statement is parsed, additional action +** routines will be called to add more information to this record. +** At the end of the CREATE TABLE statement, the sqlite3EndTable() routine +** is called to complete the construction of the new table record. +*/ +SQLITE_PRIVATE void sqlite3StartTable( + Parse *pParse, /* Parser context */ + Token *pName1, /* First part of the name of the table or view */ + Token *pName2, /* Second part of the name of the table or view */ + int isTemp, /* True if this is a TEMP table */ + int isView, /* True if this is a VIEW */ + int isVirtual, /* True if this is a VIRTUAL table */ + int noErr /* Do nothing if table already exists */ +){ + Table *pTable; + char *zName = 0; /* The name of the new table */ + sqlite3 *db = pParse->db; + Vdbe *v; + int iDb; /* Database number to create the table in */ + Token *pName; /* Unqualified name of the table to create */ + + if( db->init.busy && db->init.newTnum==1 ){ + /* Special case: Parsing the sqlite_master or sqlite_temp_master schema */ + iDb = db->init.iDb; + zName = sqlite3DbStrDup(db, SCHEMA_TABLE(iDb)); + pName = pName1; + }else{ + /* The common case */ + iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pName); + if( iDb<0 ) return; + if( !OMIT_TEMPDB && isTemp && pName2->n>0 && iDb!=1 ){ + /* If creating a temp table, the name may not be qualified. Unless + ** the database name is "temp" anyway. */ + sqlite3ErrorMsg(pParse, "temporary table name must be unqualified"); + return; + } + if( !OMIT_TEMPDB && isTemp ) iDb = 1; + zName = sqlite3NameFromToken(db, pName); + } + pParse->sNameToken = *pName; + if( zName==0 ) return; + if( SQLITE_OK!=sqlite3CheckObjectName(pParse, zName) ){ + goto begin_table_error; + } + if( db->init.iDb==1 ) isTemp = 1; +#ifndef SQLITE_OMIT_AUTHORIZATION + assert( isTemp==0 || isTemp==1 ); + assert( isView==0 || isView==1 ); + { + static const u8 aCode[] = { + SQLITE_CREATE_TABLE, + SQLITE_CREATE_TEMP_TABLE, + SQLITE_CREATE_VIEW, + SQLITE_CREATE_TEMP_VIEW + }; + char *zDb = db->aDb[iDb].zDbSName; + if( sqlite3AuthCheck(pParse, SQLITE_INSERT, SCHEMA_TABLE(isTemp), 0, zDb) ){ + goto begin_table_error; + } + if( !isVirtual && sqlite3AuthCheck(pParse, (int)aCode[isTemp+2*isView], + zName, 0, zDb) ){ + goto begin_table_error; + } + } +#endif + + /* Make sure the new table name does not collide with an existing + ** index or table name in the same database. Issue an error message if + ** it does. The exception is if the statement being parsed was passed + ** to an sqlite3_declare_vtab() call. In that case only the column names + ** and types will be used, so there is no need to test for namespace + ** collisions. + */ + if( !IN_DECLARE_VTAB ){ + char *zDb = db->aDb[iDb].zDbSName; + if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){ + goto begin_table_error; + } + pTable = sqlite3FindTable(db, zName, zDb); + if( pTable ){ + if( !noErr ){ + sqlite3ErrorMsg(pParse, "table %T already exists", pName); + }else{ + assert( !db->init.busy || CORRUPT_DB ); + sqlite3CodeVerifySchema(pParse, iDb); + } + goto begin_table_error; + } + if( sqlite3FindIndex(db, zName, zDb)!=0 ){ + sqlite3ErrorMsg(pParse, "there is already an index named %s", zName); + goto begin_table_error; + } + } + + pTable = sqlite3DbMallocZero(db, sizeof(Table)); + if( pTable==0 ){ + assert( db->mallocFailed ); + pParse->rc = SQLITE_NOMEM_BKPT; + pParse->nErr++; + goto begin_table_error; + } + pTable->zName = zName; + pTable->iPKey = -1; + pTable->pSchema = db->aDb[iDb].pSchema; + pTable->nRef = 1; + pTable->nRowLogEst = 200; assert( 200==sqlite3LogEst(1048576) ); + assert( pParse->pNewTable==0 ); + pParse->pNewTable = pTable; + + /* If this is the magic sqlite_sequence table used by autoincrement, + ** then record a pointer to this table in the main database structure + ** so that INSERT can find the table easily. + */ +#ifndef SQLITE_OMIT_AUTOINCREMENT + if( !pParse->nested && strcmp(zName, "sqlite_sequence")==0 ){ + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + pTable->pSchema->pSeqTab = pTable; + } +#endif + + /* Begin generating the code that will insert the table record into + ** the SQLITE_MASTER table. Note in particular that we must go ahead + ** and allocate the record number for the table entry now. Before any + ** PRIMARY KEY or UNIQUE keywords are parsed. Those keywords will cause + ** indices to be created and the table record must come before the + ** indices. Hence, the record number for the table must be allocated + ** now. + */ + if( !db->init.busy && (v = sqlite3GetVdbe(pParse))!=0 ){ + int addr1; + int fileFormat; + int reg1, reg2, reg3; + /* nullRow[] is an OP_Record encoding of a row containing 5 NULLs */ + static const char nullRow[] = { 6, 0, 0, 0, 0, 0 }; + sqlite3BeginWriteOperation(pParse, 1, iDb); + +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( isVirtual ){ + sqlite3VdbeAddOp0(v, OP_VBegin); + } +#endif + + /* If the file format and encoding in the database have not been set, + ** set them now. + */ + reg1 = pParse->regRowid = ++pParse->nMem; + reg2 = pParse->regRoot = ++pParse->nMem; + reg3 = ++pParse->nMem; + sqlite3VdbeAddOp3(v, OP_ReadCookie, iDb, reg3, BTREE_FILE_FORMAT); + sqlite3VdbeUsesBtree(v, iDb); + addr1 = sqlite3VdbeAddOp1(v, OP_If, reg3); VdbeCoverage(v); + fileFormat = (db->flags & SQLITE_LegacyFileFmt)!=0 ? + 1 : SQLITE_MAX_FILE_FORMAT; + sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_FILE_FORMAT, fileFormat); + sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_TEXT_ENCODING, ENC(db)); + sqlite3VdbeJumpHere(v, addr1); + + /* This just creates a place-holder record in the sqlite_master table. + ** The record created does not contain anything yet. It will be replaced + ** by the real entry in code generated at sqlite3EndTable(). + ** + ** The rowid for the new entry is left in register pParse->regRowid. + ** The root page number of the new table is left in reg pParse->regRoot. + ** The rowid and root page number values are needed by the code that + ** sqlite3EndTable will generate. + */ +#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE) + if( isView || isVirtual ){ + sqlite3VdbeAddOp2(v, OP_Integer, 0, reg2); + }else +#endif + { + pParse->addrCrTab = sqlite3VdbeAddOp2(v, OP_CreateTable, iDb, reg2); + } + sqlite3OpenMasterTable(pParse, iDb); + sqlite3VdbeAddOp2(v, OP_NewRowid, 0, reg1); + sqlite3VdbeAddOp4(v, OP_Blob, 6, reg3, 0, nullRow, P4_STATIC); + sqlite3VdbeAddOp3(v, OP_Insert, 0, reg3, reg1); + sqlite3VdbeChangeP5(v, OPFLAG_APPEND); + sqlite3VdbeAddOp0(v, OP_Close); + } + + /* Normal (non-error) return. */ + return; + + /* If an error occurs, we jump here */ +begin_table_error: + sqlite3DbFree(db, zName); + return; +} + +/* Set properties of a table column based on the (magical) +** name of the column. +*/ +#if SQLITE_ENABLE_HIDDEN_COLUMNS +SQLITE_PRIVATE void sqlite3ColumnPropertiesFromName(Table *pTab, Column *pCol){ + if( sqlite3_strnicmp(pCol->zName, "__hidden__", 10)==0 ){ + pCol->colFlags |= COLFLAG_HIDDEN; + }else if( pTab && pCol!=pTab->aCol && (pCol[-1].colFlags & COLFLAG_HIDDEN) ){ + pTab->tabFlags |= TF_OOOHidden; + } +} +#endif + + +/* +** Add a new column to the table currently being constructed. +** +** The parser calls this routine once for each column declaration +** in a CREATE TABLE statement. sqlite3StartTable() gets called +** first to get things going. Then this routine is called for each +** column. +*/ +SQLITE_PRIVATE void sqlite3AddColumn(Parse *pParse, Token *pName, Token *pType){ + Table *p; + int i; + char *z; + char *zType; + Column *pCol; + sqlite3 *db = pParse->db; + if( (p = pParse->pNewTable)==0 ) return; +#if SQLITE_MAX_COLUMN + if( p->nCol+1>db->aLimit[SQLITE_LIMIT_COLUMN] ){ + sqlite3ErrorMsg(pParse, "too many columns on %s", p->zName); + return; + } +#endif + z = sqlite3DbMallocRaw(db, pName->n + pType->n + 2); + if( z==0 ) return; + memcpy(z, pName->z, pName->n); + z[pName->n] = 0; + sqlite3Dequote(z); + for(i=0; inCol; i++){ + if( sqlite3_stricmp(z, p->aCol[i].zName)==0 ){ + sqlite3ErrorMsg(pParse, "duplicate column name: %s", z); + sqlite3DbFree(db, z); + return; + } + } + if( (p->nCol & 0x7)==0 ){ + Column *aNew; + aNew = sqlite3DbRealloc(db,p->aCol,(p->nCol+8)*sizeof(p->aCol[0])); + if( aNew==0 ){ + sqlite3DbFree(db, z); + return; + } + p->aCol = aNew; + } + pCol = &p->aCol[p->nCol]; + memset(pCol, 0, sizeof(p->aCol[0])); + pCol->zName = z; + sqlite3ColumnPropertiesFromName(p, pCol); + + if( pType->n==0 ){ + /* If there is no type specified, columns have the default affinity + ** 'BLOB'. */ + pCol->affinity = SQLITE_AFF_BLOB; + pCol->szEst = 1; + }else{ + zType = z + sqlite3Strlen30(z) + 1; + memcpy(zType, pType->z, pType->n); + zType[pType->n] = 0; + sqlite3Dequote(zType); + pCol->affinity = sqlite3AffinityType(zType, &pCol->szEst); + pCol->colFlags |= COLFLAG_HASTYPE; + } + p->nCol++; + pParse->constraintName.n = 0; +} + +/* +** This routine is called by the parser while in the middle of +** parsing a CREATE TABLE statement. A "NOT NULL" constraint has +** been seen on a column. This routine sets the notNull flag on +** the column currently under construction. +*/ +SQLITE_PRIVATE void sqlite3AddNotNull(Parse *pParse, int onError){ + Table *p; + p = pParse->pNewTable; + if( p==0 || NEVER(p->nCol<1) ) return; + p->aCol[p->nCol-1].notNull = (u8)onError; +} + +/* +** Scan the column type name zType (length nType) and return the +** associated affinity type. +** +** This routine does a case-independent search of zType for the +** substrings in the following table. If one of the substrings is +** found, the corresponding affinity is returned. If zType contains +** more than one of the substrings, entries toward the top of +** the table take priority. For example, if zType is 'BLOBINT', +** SQLITE_AFF_INTEGER is returned. +** +** Substring | Affinity +** -------------------------------- +** 'INT' | SQLITE_AFF_INTEGER +** 'CHAR' | SQLITE_AFF_TEXT +** 'CLOB' | SQLITE_AFF_TEXT +** 'TEXT' | SQLITE_AFF_TEXT +** 'BLOB' | SQLITE_AFF_BLOB +** 'REAL' | SQLITE_AFF_REAL +** 'FLOA' | SQLITE_AFF_REAL +** 'DOUB' | SQLITE_AFF_REAL +** +** If none of the substrings in the above table are found, +** SQLITE_AFF_NUMERIC is returned. +*/ +SQLITE_PRIVATE char sqlite3AffinityType(const char *zIn, u8 *pszEst){ + u32 h = 0; + char aff = SQLITE_AFF_NUMERIC; + const char *zChar = 0; + + assert( zIn!=0 ); + while( zIn[0] ){ + h = (h<<8) + sqlite3UpperToLower[(*zIn)&0xff]; + zIn++; + if( h==(('c'<<24)+('h'<<16)+('a'<<8)+'r') ){ /* CHAR */ + aff = SQLITE_AFF_TEXT; + zChar = zIn; + }else if( h==(('c'<<24)+('l'<<16)+('o'<<8)+'b') ){ /* CLOB */ + aff = SQLITE_AFF_TEXT; + }else if( h==(('t'<<24)+('e'<<16)+('x'<<8)+'t') ){ /* TEXT */ + aff = SQLITE_AFF_TEXT; + }else if( h==(('b'<<24)+('l'<<16)+('o'<<8)+'b') /* BLOB */ + && (aff==SQLITE_AFF_NUMERIC || aff==SQLITE_AFF_REAL) ){ + aff = SQLITE_AFF_BLOB; + if( zIn[0]=='(' ) zChar = zIn; +#ifndef SQLITE_OMIT_FLOATING_POINT + }else if( h==(('r'<<24)+('e'<<16)+('a'<<8)+'l') /* REAL */ + && aff==SQLITE_AFF_NUMERIC ){ + aff = SQLITE_AFF_REAL; + }else if( h==(('f'<<24)+('l'<<16)+('o'<<8)+'a') /* FLOA */ + && aff==SQLITE_AFF_NUMERIC ){ + aff = SQLITE_AFF_REAL; + }else if( h==(('d'<<24)+('o'<<16)+('u'<<8)+'b') /* DOUB */ + && aff==SQLITE_AFF_NUMERIC ){ + aff = SQLITE_AFF_REAL; +#endif + }else if( (h&0x00FFFFFF)==(('i'<<16)+('n'<<8)+'t') ){ /* INT */ + aff = SQLITE_AFF_INTEGER; + break; + } + } + + /* If pszEst is not NULL, store an estimate of the field size. The + ** estimate is scaled so that the size of an integer is 1. */ + if( pszEst ){ + *pszEst = 1; /* default size is approx 4 bytes */ + if( aff255 ) v = 255; + *pszEst = v; /* BLOB(k), VARCHAR(k), CHAR(k) -> r=(k/4+1) */ + break; + } + zChar++; + } + }else{ + *pszEst = 5; /* BLOB, TEXT, CLOB -> r=5 (approx 20 bytes)*/ + } + } + } + return aff; +} + +/* +** The expression is the default value for the most recently added column +** of the table currently under construction. +** +** Default value expressions must be constant. Raise an exception if this +** is not the case. +** +** This routine is called by the parser while in the middle of +** parsing a CREATE TABLE statement. +*/ +SQLITE_PRIVATE void sqlite3AddDefaultValue(Parse *pParse, ExprSpan *pSpan){ + Table *p; + Column *pCol; + sqlite3 *db = pParse->db; + p = pParse->pNewTable; + if( p!=0 ){ + pCol = &(p->aCol[p->nCol-1]); + if( !sqlite3ExprIsConstantOrFunction(pSpan->pExpr, db->init.busy) ){ + sqlite3ErrorMsg(pParse, "default value of column [%s] is not constant", + pCol->zName); + }else{ + /* A copy of pExpr is used instead of the original, as pExpr contains + ** tokens that point to volatile memory. The 'span' of the expression + ** is required by pragma table_info. + */ + Expr x; + sqlite3ExprDelete(db, pCol->pDflt); + memset(&x, 0, sizeof(x)); + x.op = TK_SPAN; + x.u.zToken = sqlite3DbStrNDup(db, (char*)pSpan->zStart, + (int)(pSpan->zEnd - pSpan->zStart)); + x.pLeft = pSpan->pExpr; + x.flags = EP_Skip; + pCol->pDflt = sqlite3ExprDup(db, &x, EXPRDUP_REDUCE); + sqlite3DbFree(db, x.u.zToken); + } + } + sqlite3ExprDelete(db, pSpan->pExpr); +} + +/* +** Backwards Compatibility Hack: +** +** Historical versions of SQLite accepted strings as column names in +** indexes and PRIMARY KEY constraints and in UNIQUE constraints. Example: +** +** CREATE TABLE xyz(a,b,c,d,e,PRIMARY KEY('a'),UNIQUE('b','c' COLLATE trim) +** CREATE INDEX abc ON xyz('c','d' DESC,'e' COLLATE nocase DESC); +** +** This is goofy. But to preserve backwards compatibility we continue to +** accept it. This routine does the necessary conversion. It converts +** the expression given in its argument from a TK_STRING into a TK_ID +** if the expression is just a TK_STRING with an optional COLLATE clause. +** If the epxression is anything other than TK_STRING, the expression is +** unchanged. +*/ +static void sqlite3StringToId(Expr *p){ + if( p->op==TK_STRING ){ + p->op = TK_ID; + }else if( p->op==TK_COLLATE && p->pLeft->op==TK_STRING ){ + p->pLeft->op = TK_ID; + } +} + +/* +** Designate the PRIMARY KEY for the table. pList is a list of names +** of columns that form the primary key. If pList is NULL, then the +** most recently added column of the table is the primary key. +** +** A table can have at most one primary key. If the table already has +** a primary key (and this is the second primary key) then create an +** error. +** +** If the PRIMARY KEY is on a single column whose datatype is INTEGER, +** then we will try to use that column as the rowid. Set the Table.iPKey +** field of the table under construction to be the index of the +** INTEGER PRIMARY KEY column. Table.iPKey is set to -1 if there is +** no INTEGER PRIMARY KEY. +** +** If the key is not an INTEGER PRIMARY KEY, then create a unique +** index for the key. No index is created for INTEGER PRIMARY KEYs. +*/ +SQLITE_PRIVATE void sqlite3AddPrimaryKey( + Parse *pParse, /* Parsing context */ + ExprList *pList, /* List of field names to be indexed */ + int onError, /* What to do with a uniqueness conflict */ + int autoInc, /* True if the AUTOINCREMENT keyword is present */ + int sortOrder /* SQLITE_SO_ASC or SQLITE_SO_DESC */ +){ + Table *pTab = pParse->pNewTable; + Column *pCol = 0; + int iCol = -1, i; + int nTerm; + if( pTab==0 ) goto primary_key_exit; + if( pTab->tabFlags & TF_HasPrimaryKey ){ + sqlite3ErrorMsg(pParse, + "table \"%s\" has more than one primary key", pTab->zName); + goto primary_key_exit; + } + pTab->tabFlags |= TF_HasPrimaryKey; + if( pList==0 ){ + iCol = pTab->nCol - 1; + pCol = &pTab->aCol[iCol]; + pCol->colFlags |= COLFLAG_PRIMKEY; + nTerm = 1; + }else{ + nTerm = pList->nExpr; + for(i=0; ia[i].pExpr); + assert( pCExpr!=0 ); + sqlite3StringToId(pCExpr); + if( pCExpr->op==TK_ID ){ + const char *zCName = pCExpr->u.zToken; + for(iCol=0; iColnCol; iCol++){ + if( sqlite3StrICmp(zCName, pTab->aCol[iCol].zName)==0 ){ + pCol = &pTab->aCol[iCol]; + pCol->colFlags |= COLFLAG_PRIMKEY; + break; + } + } + } + } + } + if( nTerm==1 + && pCol + && sqlite3StrICmp(sqlite3ColumnType(pCol,""), "INTEGER")==0 + && sortOrder!=SQLITE_SO_DESC + ){ + pTab->iPKey = iCol; + pTab->keyConf = (u8)onError; + assert( autoInc==0 || autoInc==1 ); + pTab->tabFlags |= autoInc*TF_Autoincrement; + if( pList ) pParse->iPkSortOrder = pList->a[0].sortOrder; + }else if( autoInc ){ +#ifndef SQLITE_OMIT_AUTOINCREMENT + sqlite3ErrorMsg(pParse, "AUTOINCREMENT is only allowed on an " + "INTEGER PRIMARY KEY"); +#endif + }else{ + sqlite3CreateIndex(pParse, 0, 0, 0, pList, onError, 0, + 0, sortOrder, 0, SQLITE_IDXTYPE_PRIMARYKEY); + pList = 0; + } + +primary_key_exit: + sqlite3ExprListDelete(pParse->db, pList); + return; +} + +/* +** Add a new CHECK constraint to the table currently under construction. +*/ +SQLITE_PRIVATE void sqlite3AddCheckConstraint( + Parse *pParse, /* Parsing context */ + Expr *pCheckExpr /* The check expression */ +){ +#ifndef SQLITE_OMIT_CHECK + Table *pTab = pParse->pNewTable; + sqlite3 *db = pParse->db; + if( pTab && !IN_DECLARE_VTAB + && !sqlite3BtreeIsReadonly(db->aDb[db->init.iDb].pBt) + ){ + pTab->pCheck = sqlite3ExprListAppend(pParse, pTab->pCheck, pCheckExpr); + if( pParse->constraintName.n ){ + sqlite3ExprListSetName(pParse, pTab->pCheck, &pParse->constraintName, 1); + } + }else +#endif + { + sqlite3ExprDelete(pParse->db, pCheckExpr); + } +} + +/* +** Set the collation function of the most recently parsed table column +** to the CollSeq given. +*/ +SQLITE_PRIVATE void sqlite3AddCollateType(Parse *pParse, Token *pToken){ + Table *p; + int i; + char *zColl; /* Dequoted name of collation sequence */ + sqlite3 *db; + + if( (p = pParse->pNewTable)==0 ) return; + i = p->nCol-1; + db = pParse->db; + zColl = sqlite3NameFromToken(db, pToken); + if( !zColl ) return; + + if( sqlite3LocateCollSeq(pParse, zColl) ){ + Index *pIdx; + sqlite3DbFree(db, p->aCol[i].zColl); + p->aCol[i].zColl = zColl; + + /* If the column is declared as " PRIMARY KEY COLLATE ", + ** then an index may have been created on this column before the + ** collation type was added. Correct this if it is the case. + */ + for(pIdx=p->pIndex; pIdx; pIdx=pIdx->pNext){ + assert( pIdx->nKeyCol==1 ); + if( pIdx->aiColumn[0]==i ){ + pIdx->azColl[0] = p->aCol[i].zColl; + } + } + }else{ + sqlite3DbFree(db, zColl); + } +} + +/* +** This function returns the collation sequence for database native text +** encoding identified by the string zName, length nName. +** +** If the requested collation sequence is not available, or not available +** in the database native encoding, the collation factory is invoked to +** request it. If the collation factory does not supply such a sequence, +** and the sequence is available in another text encoding, then that is +** returned instead. +** +** If no versions of the requested collations sequence are available, or +** another error occurs, NULL is returned and an error message written into +** pParse. +** +** This routine is a wrapper around sqlite3FindCollSeq(). This routine +** invokes the collation factory if the named collation cannot be found +** and generates an error message. +** +** See also: sqlite3FindCollSeq(), sqlite3GetCollSeq() +*/ +SQLITE_PRIVATE CollSeq *sqlite3LocateCollSeq(Parse *pParse, const char *zName){ + sqlite3 *db = pParse->db; + u8 enc = ENC(db); + u8 initbusy = db->init.busy; + CollSeq *pColl; + + pColl = sqlite3FindCollSeq(db, enc, zName, initbusy); + if( !initbusy && (!pColl || !pColl->xCmp) ){ + pColl = sqlite3GetCollSeq(pParse, enc, pColl, zName); + } + + return pColl; +} + + +/* +** Generate code that will increment the schema cookie. +** +** The schema cookie is used to determine when the schema for the +** database changes. After each schema change, the cookie value +** changes. When a process first reads the schema it records the +** cookie. Thereafter, whenever it goes to access the database, +** it checks the cookie to make sure the schema has not changed +** since it was last read. +** +** This plan is not completely bullet-proof. It is possible for +** the schema to change multiple times and for the cookie to be +** set back to prior value. But schema changes are infrequent +** and the probability of hitting the same cookie value is only +** 1 chance in 2^32. So we're safe enough. +** +** IMPLEMENTATION-OF: R-34230-56049 SQLite automatically increments +** the schema-version whenever the schema changes. +*/ +SQLITE_PRIVATE void sqlite3ChangeCookie(Parse *pParse, int iDb){ + sqlite3 *db = pParse->db; + Vdbe *v = pParse->pVdbe; + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_SCHEMA_VERSION, + db->aDb[iDb].pSchema->schema_cookie+1); +} + +/* +** Measure the number of characters needed to output the given +** identifier. The number returned includes any quotes used +** but does not include the null terminator. +** +** The estimate is conservative. It might be larger that what is +** really needed. +*/ +static int identLength(const char *z){ + int n; + for(n=0; *z; n++, z++){ + if( *z=='"' ){ n++; } + } + return n + 2; +} + +/* +** The first parameter is a pointer to an output buffer. The second +** parameter is a pointer to an integer that contains the offset at +** which to write into the output buffer. This function copies the +** nul-terminated string pointed to by the third parameter, zSignedIdent, +** to the specified offset in the buffer and updates *pIdx to refer +** to the first byte after the last byte written before returning. +** +** If the string zSignedIdent consists entirely of alpha-numeric +** characters, does not begin with a digit and is not an SQL keyword, +** then it is copied to the output buffer exactly as it is. Otherwise, +** it is quoted using double-quotes. +*/ +static void identPut(char *z, int *pIdx, char *zSignedIdent){ + unsigned char *zIdent = (unsigned char*)zSignedIdent; + int i, j, needQuote; + i = *pIdx; + + for(j=0; zIdent[j]; j++){ + if( !sqlite3Isalnum(zIdent[j]) && zIdent[j]!='_' ) break; + } + needQuote = sqlite3Isdigit(zIdent[0]) + || sqlite3KeywordCode(zIdent, j)!=TK_ID + || zIdent[j]!=0 + || j==0; + + if( needQuote ) z[i++] = '"'; + for(j=0; zIdent[j]; j++){ + z[i++] = zIdent[j]; + if( zIdent[j]=='"' ) z[i++] = '"'; + } + if( needQuote ) z[i++] = '"'; + z[i] = 0; + *pIdx = i; +} + +/* +** Generate a CREATE TABLE statement appropriate for the given +** table. Memory to hold the text of the statement is obtained +** from sqliteMalloc() and must be freed by the calling function. +*/ +static char *createTableStmt(sqlite3 *db, Table *p){ + int i, k, n; + char *zStmt; + char *zSep, *zSep2, *zEnd; + Column *pCol; + n = 0; + for(pCol = p->aCol, i=0; inCol; i++, pCol++){ + n += identLength(pCol->zName) + 5; + } + n += identLength(p->zName); + if( n<50 ){ + zSep = ""; + zSep2 = ","; + zEnd = ")"; + }else{ + zSep = "\n "; + zSep2 = ",\n "; + zEnd = "\n)"; + } + n += 35 + 6*p->nCol; + zStmt = sqlite3DbMallocRaw(0, n); + if( zStmt==0 ){ + sqlite3OomFault(db); + return 0; + } + sqlite3_snprintf(n, zStmt, "CREATE TABLE "); + k = sqlite3Strlen30(zStmt); + identPut(zStmt, &k, p->zName); + zStmt[k++] = '('; + for(pCol=p->aCol, i=0; inCol; i++, pCol++){ + static const char * const azType[] = { + /* SQLITE_AFF_BLOB */ "", + /* SQLITE_AFF_TEXT */ " TEXT", + /* SQLITE_AFF_NUMERIC */ " NUM", + /* SQLITE_AFF_INTEGER */ " INT", + /* SQLITE_AFF_REAL */ " REAL" + }; + int len; + const char *zType; + + sqlite3_snprintf(n-k, &zStmt[k], zSep); + k += sqlite3Strlen30(&zStmt[k]); + zSep = zSep2; + identPut(zStmt, &k, pCol->zName); + assert( pCol->affinity-SQLITE_AFF_BLOB >= 0 ); + assert( pCol->affinity-SQLITE_AFF_BLOB < ArraySize(azType) ); + testcase( pCol->affinity==SQLITE_AFF_BLOB ); + testcase( pCol->affinity==SQLITE_AFF_TEXT ); + testcase( pCol->affinity==SQLITE_AFF_NUMERIC ); + testcase( pCol->affinity==SQLITE_AFF_INTEGER ); + testcase( pCol->affinity==SQLITE_AFF_REAL ); + + zType = azType[pCol->affinity - SQLITE_AFF_BLOB]; + len = sqlite3Strlen30(zType); + assert( pCol->affinity==SQLITE_AFF_BLOB + || pCol->affinity==sqlite3AffinityType(zType, 0) ); + memcpy(&zStmt[k], zType, len); + k += len; + assert( k<=n ); + } + sqlite3_snprintf(n-k, &zStmt[k], "%s", zEnd); + return zStmt; +} + +/* +** Resize an Index object to hold N columns total. Return SQLITE_OK +** on success and SQLITE_NOMEM on an OOM error. +*/ +static int resizeIndexObject(sqlite3 *db, Index *pIdx, int N){ + char *zExtra; + int nByte; + if( pIdx->nColumn>=N ) return SQLITE_OK; + assert( pIdx->isResized==0 ); + nByte = (sizeof(char*) + sizeof(i16) + 1)*N; + zExtra = sqlite3DbMallocZero(db, nByte); + if( zExtra==0 ) return SQLITE_NOMEM_BKPT; + memcpy(zExtra, pIdx->azColl, sizeof(char*)*pIdx->nColumn); + pIdx->azColl = (const char**)zExtra; + zExtra += sizeof(char*)*N; + memcpy(zExtra, pIdx->aiColumn, sizeof(i16)*pIdx->nColumn); + pIdx->aiColumn = (i16*)zExtra; + zExtra += sizeof(i16)*N; + memcpy(zExtra, pIdx->aSortOrder, pIdx->nColumn); + pIdx->aSortOrder = (u8*)zExtra; + pIdx->nColumn = N; + pIdx->isResized = 1; + return SQLITE_OK; +} + +/* +** Estimate the total row width for a table. +*/ +static void estimateTableWidth(Table *pTab){ + unsigned wTable = 0; + const Column *pTabCol; + int i; + for(i=pTab->nCol, pTabCol=pTab->aCol; i>0; i--, pTabCol++){ + wTable += pTabCol->szEst; + } + if( pTab->iPKey<0 ) wTable++; + pTab->szTabRow = sqlite3LogEst(wTable*4); +} + +/* +** Estimate the average size of a row for an index. +*/ +static void estimateIndexWidth(Index *pIdx){ + unsigned wIndex = 0; + int i; + const Column *aCol = pIdx->pTable->aCol; + for(i=0; inColumn; i++){ + i16 x = pIdx->aiColumn[i]; + assert( xpTable->nCol ); + wIndex += x<0 ? 1 : aCol[pIdx->aiColumn[i]].szEst; + } + pIdx->szIdxRow = sqlite3LogEst(wIndex*4); +} + +/* Return true if value x is found any of the first nCol entries of aiCol[] +*/ +static int hasColumn(const i16 *aiCol, int nCol, int x){ + while( nCol-- > 0 ) if( x==*(aiCol++) ) return 1; + return 0; +} + +/* +** This routine runs at the end of parsing a CREATE TABLE statement that +** has a WITHOUT ROWID clause. The job of this routine is to convert both +** internal schema data structures and the generated VDBE code so that they +** are appropriate for a WITHOUT ROWID table instead of a rowid table. +** Changes include: +** +** (1) Set all columns of the PRIMARY KEY schema object to be NOT NULL. +** (2) Convert the OP_CreateTable into an OP_CreateIndex. There is +** no rowid btree for a WITHOUT ROWID. Instead, the canonical +** data storage is a covering index btree. +** (3) Bypass the creation of the sqlite_master table entry +** for the PRIMARY KEY as the primary key index is now +** identified by the sqlite_master table entry of the table itself. +** (4) Set the Index.tnum of the PRIMARY KEY Index object in the +** schema to the rootpage from the main table. +** (5) Add all table columns to the PRIMARY KEY Index object +** so that the PRIMARY KEY is a covering index. The surplus +** columns are part of KeyInfo.nXField and are not used for +** sorting or lookup or uniqueness checks. +** (6) Replace the rowid tail on all automatically generated UNIQUE +** indices with the PRIMARY KEY columns. +** +** For virtual tables, only (1) is performed. +*/ +static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){ + Index *pIdx; + Index *pPk; + int nPk; + int i, j; + sqlite3 *db = pParse->db; + Vdbe *v = pParse->pVdbe; + + /* Mark every PRIMARY KEY column as NOT NULL (except for imposter tables) + */ + if( !db->init.imposterTable ){ + for(i=0; inCol; i++){ + if( (pTab->aCol[i].colFlags & COLFLAG_PRIMKEY)!=0 ){ + pTab->aCol[i].notNull = OE_Abort; + } + } + } + + /* The remaining transformations only apply to b-tree tables, not to + ** virtual tables */ + if( IN_DECLARE_VTAB ) return; + + /* Convert the OP_CreateTable opcode that would normally create the + ** root-page for the table into an OP_CreateIndex opcode. The index + ** created will become the PRIMARY KEY index. + */ + if( pParse->addrCrTab ){ + assert( v ); + sqlite3VdbeChangeOpcode(v, pParse->addrCrTab, OP_CreateIndex); + } + + /* Locate the PRIMARY KEY index. Or, if this table was originally + ** an INTEGER PRIMARY KEY table, create a new PRIMARY KEY index. + */ + if( pTab->iPKey>=0 ){ + ExprList *pList; + Token ipkToken; + sqlite3TokenInit(&ipkToken, pTab->aCol[pTab->iPKey].zName); + pList = sqlite3ExprListAppend(pParse, 0, + sqlite3ExprAlloc(db, TK_ID, &ipkToken, 0)); + if( pList==0 ) return; + pList->a[0].sortOrder = pParse->iPkSortOrder; + assert( pParse->pNewTable==pTab ); + sqlite3CreateIndex(pParse, 0, 0, 0, pList, pTab->keyConf, 0, 0, 0, 0, + SQLITE_IDXTYPE_PRIMARYKEY); + if( db->mallocFailed ) return; + pPk = sqlite3PrimaryKeyIndex(pTab); + pTab->iPKey = -1; + }else{ + pPk = sqlite3PrimaryKeyIndex(pTab); + + /* Bypass the creation of the PRIMARY KEY btree and the sqlite_master + ** table entry. This is only required if currently generating VDBE + ** code for a CREATE TABLE (not when parsing one as part of reading + ** a database schema). */ + if( v ){ + assert( db->init.busy==0 ); + sqlite3VdbeChangeOpcode(v, pPk->tnum, OP_Goto); + } + + /* + ** Remove all redundant columns from the PRIMARY KEY. For example, change + ** "PRIMARY KEY(a,b,a,b,c,b,c,d)" into just "PRIMARY KEY(a,b,c,d)". Later + ** code assumes the PRIMARY KEY contains no repeated columns. + */ + for(i=j=1; inKeyCol; i++){ + if( hasColumn(pPk->aiColumn, j, pPk->aiColumn[i]) ){ + pPk->nColumn--; + }else{ + pPk->aiColumn[j++] = pPk->aiColumn[i]; + } + } + pPk->nKeyCol = j; + } + assert( pPk!=0 ); + pPk->isCovering = 1; + if( !db->init.imposterTable ) pPk->uniqNotNull = 1; + nPk = pPk->nKeyCol; + + /* The root page of the PRIMARY KEY is the table root page */ + pPk->tnum = pTab->tnum; + + /* Update the in-memory representation of all UNIQUE indices by converting + ** the final rowid column into one or more columns of the PRIMARY KEY. + */ + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + int n; + if( IsPrimaryKeyIndex(pIdx) ) continue; + for(i=n=0; iaiColumn, pIdx->nKeyCol, pPk->aiColumn[i]) ) n++; + } + if( n==0 ){ + /* This index is a superset of the primary key */ + pIdx->nColumn = pIdx->nKeyCol; + continue; + } + if( resizeIndexObject(db, pIdx, pIdx->nKeyCol+n) ) return; + for(i=0, j=pIdx->nKeyCol; iaiColumn, pIdx->nKeyCol, pPk->aiColumn[i]) ){ + pIdx->aiColumn[j] = pPk->aiColumn[i]; + pIdx->azColl[j] = pPk->azColl[i]; + j++; + } + } + assert( pIdx->nColumn>=pIdx->nKeyCol+n ); + assert( pIdx->nColumn>=j ); + } + + /* Add all table columns to the PRIMARY KEY index + */ + if( nPknCol ){ + if( resizeIndexObject(db, pPk, pTab->nCol) ) return; + for(i=0, j=nPk; inCol; i++){ + if( !hasColumn(pPk->aiColumn, j, i) ){ + assert( jnColumn ); + pPk->aiColumn[j] = i; + pPk->azColl[j] = sqlite3StrBINARY; + j++; + } + } + assert( pPk->nColumn==j ); + assert( pTab->nCol==j ); + }else{ + pPk->nColumn = pTab->nCol; + } +} + +/* +** This routine is called to report the final ")" that terminates +** a CREATE TABLE statement. +** +** The table structure that other action routines have been building +** is added to the internal hash tables, assuming no errors have +** occurred. +** +** An entry for the table is made in the master table on disk, unless +** this is a temporary table or db->init.busy==1. When db->init.busy==1 +** it means we are reading the sqlite_master table because we just +** connected to the database or because the sqlite_master table has +** recently changed, so the entry for this table already exists in +** the sqlite_master table. We do not want to create it again. +** +** If the pSelect argument is not NULL, it means that this routine +** was called to create a table generated from a +** "CREATE TABLE ... AS SELECT ..." statement. The column names of +** the new table will match the result set of the SELECT. +*/ +SQLITE_PRIVATE void sqlite3EndTable( + Parse *pParse, /* Parse context */ + Token *pCons, /* The ',' token after the last column defn. */ + Token *pEnd, /* The ')' before options in the CREATE TABLE */ + u8 tabOpts, /* Extra table options. Usually 0. */ + Select *pSelect /* Select from a "CREATE ... AS SELECT" */ +){ + Table *p; /* The new table */ + sqlite3 *db = pParse->db; /* The database connection */ + int iDb; /* Database in which the table lives */ + Index *pIdx; /* An implied index of the table */ + + if( pEnd==0 && pSelect==0 ){ + return; + } + assert( !db->mallocFailed ); + p = pParse->pNewTable; + if( p==0 ) return; + + assert( !db->init.busy || !pSelect ); + + /* If the db->init.busy is 1 it means we are reading the SQL off the + ** "sqlite_master" or "sqlite_temp_master" table on the disk. + ** So do not write to the disk again. Extract the root page number + ** for the table from the db->init.newTnum field. (The page number + ** should have been put there by the sqliteOpenCb routine.) + ** + ** If the root page number is 1, that means this is the sqlite_master + ** table itself. So mark it read-only. + */ + if( db->init.busy ){ + p->tnum = db->init.newTnum; + if( p->tnum==1 ) p->tabFlags |= TF_Readonly; + } + + /* Special processing for WITHOUT ROWID Tables */ + if( tabOpts & TF_WithoutRowid ){ + if( (p->tabFlags & TF_Autoincrement) ){ + sqlite3ErrorMsg(pParse, + "AUTOINCREMENT not allowed on WITHOUT ROWID tables"); + return; + } + if( (p->tabFlags & TF_HasPrimaryKey)==0 ){ + sqlite3ErrorMsg(pParse, "PRIMARY KEY missing on table %s", p->zName); + }else{ + p->tabFlags |= TF_WithoutRowid | TF_NoVisibleRowid; + convertToWithoutRowidTable(pParse, p); + } + } + + iDb = sqlite3SchemaToIndex(db, p->pSchema); + +#ifndef SQLITE_OMIT_CHECK + /* Resolve names in all CHECK constraint expressions. + */ + if( p->pCheck ){ + sqlite3ResolveSelfReference(pParse, p, NC_IsCheck, 0, p->pCheck); + } +#endif /* !defined(SQLITE_OMIT_CHECK) */ + + /* Estimate the average row size for the table and for all implied indices */ + estimateTableWidth(p); + for(pIdx=p->pIndex; pIdx; pIdx=pIdx->pNext){ + estimateIndexWidth(pIdx); + } + + /* If not initializing, then create a record for the new table + ** in the SQLITE_MASTER table of the database. + ** + ** If this is a TEMPORARY table, write the entry into the auxiliary + ** file instead of into the main database file. + */ + if( !db->init.busy ){ + int n; + Vdbe *v; + char *zType; /* "view" or "table" */ + char *zType2; /* "VIEW" or "TABLE" */ + char *zStmt; /* Text of the CREATE TABLE or CREATE VIEW statement */ + + v = sqlite3GetVdbe(pParse); + if( NEVER(v==0) ) return; + + sqlite3VdbeAddOp1(v, OP_Close, 0); + + /* + ** Initialize zType for the new view or table. + */ + if( p->pSelect==0 ){ + /* A regular table */ + zType = "table"; + zType2 = "TABLE"; +#ifndef SQLITE_OMIT_VIEW + }else{ + /* A view */ + zType = "view"; + zType2 = "VIEW"; +#endif + } + + /* If this is a CREATE TABLE xx AS SELECT ..., execute the SELECT + ** statement to populate the new table. The root-page number for the + ** new table is in register pParse->regRoot. + ** + ** Once the SELECT has been coded by sqlite3Select(), it is in a + ** suitable state to query for the column names and types to be used + ** by the new table. + ** + ** A shared-cache write-lock is not required to write to the new table, + ** as a schema-lock must have already been obtained to create it. Since + ** a schema-lock excludes all other database users, the write-lock would + ** be redundant. + */ + if( pSelect ){ + SelectDest dest; /* Where the SELECT should store results */ + int regYield; /* Register holding co-routine entry-point */ + int addrTop; /* Top of the co-routine */ + int regRec; /* A record to be insert into the new table */ + int regRowid; /* Rowid of the next row to insert */ + int addrInsLoop; /* Top of the loop for inserting rows */ + Table *pSelTab; /* A table that describes the SELECT results */ + + regYield = ++pParse->nMem; + regRec = ++pParse->nMem; + regRowid = ++pParse->nMem; + assert(pParse->nTab==1); + sqlite3MayAbort(pParse); + sqlite3VdbeAddOp3(v, OP_OpenWrite, 1, pParse->regRoot, iDb); + sqlite3VdbeChangeP5(v, OPFLAG_P2ISREG); + pParse->nTab = 2; + addrTop = sqlite3VdbeCurrentAddr(v) + 1; + sqlite3VdbeAddOp3(v, OP_InitCoroutine, regYield, 0, addrTop); + sqlite3SelectDestInit(&dest, SRT_Coroutine, regYield); + sqlite3Select(pParse, pSelect, &dest); + sqlite3VdbeEndCoroutine(v, regYield); + sqlite3VdbeJumpHere(v, addrTop - 1); + if( pParse->nErr ) return; + pSelTab = sqlite3ResultSetOfSelect(pParse, pSelect); + if( pSelTab==0 ) return; + assert( p->aCol==0 ); + p->nCol = pSelTab->nCol; + p->aCol = pSelTab->aCol; + pSelTab->nCol = 0; + pSelTab->aCol = 0; + sqlite3DeleteTable(db, pSelTab); + addrInsLoop = sqlite3VdbeAddOp1(v, OP_Yield, dest.iSDParm); + VdbeCoverage(v); + sqlite3VdbeAddOp3(v, OP_MakeRecord, dest.iSdst, dest.nSdst, regRec); + sqlite3TableAffinity(v, p, 0); + sqlite3VdbeAddOp2(v, OP_NewRowid, 1, regRowid); + sqlite3VdbeAddOp3(v, OP_Insert, 1, regRec, regRowid); + sqlite3VdbeGoto(v, addrInsLoop); + sqlite3VdbeJumpHere(v, addrInsLoop); + sqlite3VdbeAddOp1(v, OP_Close, 1); + } + + /* Compute the complete text of the CREATE statement */ + if( pSelect ){ + zStmt = createTableStmt(db, p); + }else{ + Token *pEnd2 = tabOpts ? &pParse->sLastToken : pEnd; + n = (int)(pEnd2->z - pParse->sNameToken.z); + if( pEnd2->z[0]!=';' ) n += pEnd2->n; + zStmt = sqlite3MPrintf(db, + "CREATE %s %.*s", zType2, n, pParse->sNameToken.z + ); + } + + /* A slot for the record has already been allocated in the + ** SQLITE_MASTER table. We just need to update that slot with all + ** the information we've collected. + */ + sqlite3NestedParse(pParse, + "UPDATE %Q.%s " + "SET type='%s', name=%Q, tbl_name=%Q, rootpage=#%d, sql=%Q " + "WHERE rowid=#%d", + db->aDb[iDb].zDbSName, SCHEMA_TABLE(iDb), + zType, + p->zName, + p->zName, + pParse->regRoot, + zStmt, + pParse->regRowid + ); + sqlite3DbFree(db, zStmt); + sqlite3ChangeCookie(pParse, iDb); + +#ifndef SQLITE_OMIT_AUTOINCREMENT + /* Check to see if we need to create an sqlite_sequence table for + ** keeping track of autoincrement keys. + */ + if( (p->tabFlags & TF_Autoincrement)!=0 ){ + Db *pDb = &db->aDb[iDb]; + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + if( pDb->pSchema->pSeqTab==0 ){ + sqlite3NestedParse(pParse, + "CREATE TABLE %Q.sqlite_sequence(name,seq)", + pDb->zDbSName + ); + } + } +#endif + + /* Reparse everything to update our internal data structures */ + sqlite3VdbeAddParseSchemaOp(v, iDb, + sqlite3MPrintf(db, "tbl_name='%q' AND type!='trigger'", p->zName)); + } + + + /* Add the table to the in-memory representation of the database. + */ + if( db->init.busy ){ + Table *pOld; + Schema *pSchema = p->pSchema; + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + pOld = sqlite3HashInsert(&pSchema->tblHash, p->zName, p); + if( pOld ){ + assert( p==pOld ); /* Malloc must have failed inside HashInsert() */ + sqlite3OomFault(db); + return; + } + pParse->pNewTable = 0; + db->flags |= SQLITE_InternChanges; + +#ifndef SQLITE_OMIT_ALTERTABLE + if( !p->pSelect ){ + const char *zName = (const char *)pParse->sNameToken.z; + int nName; + assert( !pSelect && pCons && pEnd ); + if( pCons->z==0 ){ + pCons = pEnd; + } + nName = (int)((const char *)pCons->z - zName); + p->addColOffset = 13 + sqlite3Utf8CharLen(zName, nName); + } +#endif + } +} + +#ifndef SQLITE_OMIT_VIEW +/* +** The parser calls this routine in order to create a new VIEW +*/ +SQLITE_PRIVATE void sqlite3CreateView( + Parse *pParse, /* The parsing context */ + Token *pBegin, /* The CREATE token that begins the statement */ + Token *pName1, /* The token that holds the name of the view */ + Token *pName2, /* The token that holds the name of the view */ + ExprList *pCNames, /* Optional list of view column names */ + Select *pSelect, /* A SELECT statement that will become the new view */ + int isTemp, /* TRUE for a TEMPORARY view */ + int noErr /* Suppress error messages if VIEW already exists */ +){ + Table *p; + int n; + const char *z; + Token sEnd; + DbFixer sFix; + Token *pName = 0; + int iDb; + sqlite3 *db = pParse->db; + + if( pParse->nVar>0 ){ + sqlite3ErrorMsg(pParse, "parameters are not allowed in views"); + goto create_view_fail; + } + sqlite3StartTable(pParse, pName1, pName2, isTemp, 1, 0, noErr); + p = pParse->pNewTable; + if( p==0 || pParse->nErr ) goto create_view_fail; + sqlite3TwoPartName(pParse, pName1, pName2, &pName); + iDb = sqlite3SchemaToIndex(db, p->pSchema); + sqlite3FixInit(&sFix, pParse, iDb, "view", pName); + if( sqlite3FixSelect(&sFix, pSelect) ) goto create_view_fail; + + /* Make a copy of the entire SELECT statement that defines the view. + ** This will force all the Expr.token.z values to be dynamically + ** allocated rather than point to the input string - which means that + ** they will persist after the current sqlite3_exec() call returns. + */ + p->pSelect = sqlite3SelectDup(db, pSelect, EXPRDUP_REDUCE); + p->pCheck = sqlite3ExprListDup(db, pCNames, EXPRDUP_REDUCE); + if( db->mallocFailed ) goto create_view_fail; + + /* Locate the end of the CREATE VIEW statement. Make sEnd point to + ** the end. + */ + sEnd = pParse->sLastToken; + assert( sEnd.z[0]!=0 ); + if( sEnd.z[0]!=';' ){ + sEnd.z += sEnd.n; + } + sEnd.n = 0; + n = (int)(sEnd.z - pBegin->z); + assert( n>0 ); + z = pBegin->z; + while( sqlite3Isspace(z[n-1]) ){ n--; } + sEnd.z = &z[n-1]; + sEnd.n = 1; + + /* Use sqlite3EndTable() to add the view to the SQLITE_MASTER table */ + sqlite3EndTable(pParse, 0, &sEnd, 0, 0); + +create_view_fail: + sqlite3SelectDelete(db, pSelect); + sqlite3ExprListDelete(db, pCNames); + return; +} +#endif /* SQLITE_OMIT_VIEW */ + +#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE) +/* +** The Table structure pTable is really a VIEW. Fill in the names of +** the columns of the view in the pTable structure. Return the number +** of errors. If an error is seen leave an error message in pParse->zErrMsg. +*/ +SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ + Table *pSelTab; /* A fake table from which we get the result set */ + Select *pSel; /* Copy of the SELECT that implements the view */ + int nErr = 0; /* Number of errors encountered */ + int n; /* Temporarily holds the number of cursors assigned */ + sqlite3 *db = pParse->db; /* Database connection for malloc errors */ +#ifndef SQLITE_OMIT_AUTHORIZATION + sqlite3_xauth xAuth; /* Saved xAuth pointer */ +#endif + + assert( pTable ); + +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( sqlite3VtabCallConnect(pParse, pTable) ){ + return SQLITE_ERROR; + } + if( IsVirtual(pTable) ) return 0; +#endif + +#ifndef SQLITE_OMIT_VIEW + /* A positive nCol means the columns names for this view are + ** already known. + */ + if( pTable->nCol>0 ) return 0; + + /* A negative nCol is a special marker meaning that we are currently + ** trying to compute the column names. If we enter this routine with + ** a negative nCol, it means two or more views form a loop, like this: + ** + ** CREATE VIEW one AS SELECT * FROM two; + ** CREATE VIEW two AS SELECT * FROM one; + ** + ** Actually, the error above is now caught prior to reaching this point. + ** But the following test is still important as it does come up + ** in the following: + ** + ** CREATE TABLE main.ex1(a); + ** CREATE TEMP VIEW ex1 AS SELECT a FROM ex1; + ** SELECT * FROM temp.ex1; + */ + if( pTable->nCol<0 ){ + sqlite3ErrorMsg(pParse, "view %s is circularly defined", pTable->zName); + return 1; + } + assert( pTable->nCol>=0 ); + + /* If we get this far, it means we need to compute the table names. + ** Note that the call to sqlite3ResultSetOfSelect() will expand any + ** "*" elements in the results set of the view and will assign cursors + ** to the elements of the FROM clause. But we do not want these changes + ** to be permanent. So the computation is done on a copy of the SELECT + ** statement that defines the view. + */ + assert( pTable->pSelect ); + pSel = sqlite3SelectDup(db, pTable->pSelect, 0); + if( pSel ){ + n = pParse->nTab; + sqlite3SrcListAssignCursors(pParse, pSel->pSrc); + pTable->nCol = -1; + db->lookaside.bDisable++; +#ifndef SQLITE_OMIT_AUTHORIZATION + xAuth = db->xAuth; + db->xAuth = 0; + pSelTab = sqlite3ResultSetOfSelect(pParse, pSel); + db->xAuth = xAuth; +#else + pSelTab = sqlite3ResultSetOfSelect(pParse, pSel); +#endif + pParse->nTab = n; + if( pTable->pCheck ){ + /* CREATE VIEW name(arglist) AS ... + ** The names of the columns in the table are taken from + ** arglist which is stored in pTable->pCheck. The pCheck field + ** normally holds CHECK constraints on an ordinary table, but for + ** a VIEW it holds the list of column names. + */ + sqlite3ColumnsFromExprList(pParse, pTable->pCheck, + &pTable->nCol, &pTable->aCol); + if( db->mallocFailed==0 + && pParse->nErr==0 + && pTable->nCol==pSel->pEList->nExpr + ){ + sqlite3SelectAddColumnTypeAndCollation(pParse, pTable, pSel); + } + }else if( pSelTab ){ + /* CREATE VIEW name AS... without an argument list. Construct + ** the column names from the SELECT statement that defines the view. + */ + assert( pTable->aCol==0 ); + pTable->nCol = pSelTab->nCol; + pTable->aCol = pSelTab->aCol; + pSelTab->nCol = 0; + pSelTab->aCol = 0; + assert( sqlite3SchemaMutexHeld(db, 0, pTable->pSchema) ); + }else{ + pTable->nCol = 0; + nErr++; + } + sqlite3DeleteTable(db, pSelTab); + sqlite3SelectDelete(db, pSel); + db->lookaside.bDisable--; + } else { + nErr++; + } + pTable->pSchema->schemaFlags |= DB_UnresetViews; +#endif /* SQLITE_OMIT_VIEW */ + return nErr; +} +#endif /* !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE) */ + +#ifndef SQLITE_OMIT_VIEW +/* +** Clear the column names from every VIEW in database idx. +*/ +static void sqliteViewResetAll(sqlite3 *db, int idx){ + HashElem *i; + assert( sqlite3SchemaMutexHeld(db, idx, 0) ); + if( !DbHasProperty(db, idx, DB_UnresetViews) ) return; + for(i=sqliteHashFirst(&db->aDb[idx].pSchema->tblHash); i;i=sqliteHashNext(i)){ + Table *pTab = sqliteHashData(i); + if( pTab->pSelect ){ + sqlite3DeleteColumnNames(db, pTab); + pTab->aCol = 0; + pTab->nCol = 0; + } + } + DbClearProperty(db, idx, DB_UnresetViews); +} +#else +# define sqliteViewResetAll(A,B) +#endif /* SQLITE_OMIT_VIEW */ + +/* +** This function is called by the VDBE to adjust the internal schema +** used by SQLite when the btree layer moves a table root page. The +** root-page of a table or index in database iDb has changed from iFrom +** to iTo. +** +** Ticket #1728: The symbol table might still contain information +** on tables and/or indices that are the process of being deleted. +** If you are unlucky, one of those deleted indices or tables might +** have the same rootpage number as the real table or index that is +** being moved. So we cannot stop searching after the first match +** because the first match might be for one of the deleted indices +** or tables and not the table/index that is actually being moved. +** We must continue looping until all tables and indices with +** rootpage==iFrom have been converted to have a rootpage of iTo +** in order to be certain that we got the right one. +*/ +#ifndef SQLITE_OMIT_AUTOVACUUM +SQLITE_PRIVATE void sqlite3RootPageMoved(sqlite3 *db, int iDb, int iFrom, int iTo){ + HashElem *pElem; + Hash *pHash; + Db *pDb; + + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + pDb = &db->aDb[iDb]; + pHash = &pDb->pSchema->tblHash; + for(pElem=sqliteHashFirst(pHash); pElem; pElem=sqliteHashNext(pElem)){ + Table *pTab = sqliteHashData(pElem); + if( pTab->tnum==iFrom ){ + pTab->tnum = iTo; + } + } + pHash = &pDb->pSchema->idxHash; + for(pElem=sqliteHashFirst(pHash); pElem; pElem=sqliteHashNext(pElem)){ + Index *pIdx = sqliteHashData(pElem); + if( pIdx->tnum==iFrom ){ + pIdx->tnum = iTo; + } + } +} +#endif + +/* +** Write code to erase the table with root-page iTable from database iDb. +** Also write code to modify the sqlite_master table and internal schema +** if a root-page of another table is moved by the btree-layer whilst +** erasing iTable (this can happen with an auto-vacuum database). +*/ +static void destroyRootPage(Parse *pParse, int iTable, int iDb){ + Vdbe *v = sqlite3GetVdbe(pParse); + int r1 = sqlite3GetTempReg(pParse); + assert( iTable>1 ); + sqlite3VdbeAddOp3(v, OP_Destroy, iTable, r1, iDb); + sqlite3MayAbort(pParse); +#ifndef SQLITE_OMIT_AUTOVACUUM + /* OP_Destroy stores an in integer r1. If this integer + ** is non-zero, then it is the root page number of a table moved to + ** location iTable. The following code modifies the sqlite_master table to + ** reflect this. + ** + ** The "#NNN" in the SQL is a special constant that means whatever value + ** is in register NNN. See grammar rules associated with the TK_REGISTER + ** token for additional information. + */ + sqlite3NestedParse(pParse, + "UPDATE %Q.%s SET rootpage=%d WHERE #%d AND rootpage=#%d", + pParse->db->aDb[iDb].zDbSName, SCHEMA_TABLE(iDb), iTable, r1, r1); +#endif + sqlite3ReleaseTempReg(pParse, r1); +} + +/* +** Write VDBE code to erase table pTab and all associated indices on disk. +** Code to update the sqlite_master tables and internal schema definitions +** in case a root-page belonging to another table is moved by the btree layer +** is also added (this can happen with an auto-vacuum database). +*/ +static void destroyTable(Parse *pParse, Table *pTab){ +#ifdef SQLITE_OMIT_AUTOVACUUM + Index *pIdx; + int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); + destroyRootPage(pParse, pTab->tnum, iDb); + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + destroyRootPage(pParse, pIdx->tnum, iDb); + } +#else + /* If the database may be auto-vacuum capable (if SQLITE_OMIT_AUTOVACUUM + ** is not defined), then it is important to call OP_Destroy on the + ** table and index root-pages in order, starting with the numerically + ** largest root-page number. This guarantees that none of the root-pages + ** to be destroyed is relocated by an earlier OP_Destroy. i.e. if the + ** following were coded: + ** + ** OP_Destroy 4 0 + ** ... + ** OP_Destroy 5 0 + ** + ** and root page 5 happened to be the largest root-page number in the + ** database, then root page 5 would be moved to page 4 by the + ** "OP_Destroy 4 0" opcode. The subsequent "OP_Destroy 5 0" would hit + ** a free-list page. + */ + int iTab = pTab->tnum; + int iDestroyed = 0; + + while( 1 ){ + Index *pIdx; + int iLargest = 0; + + if( iDestroyed==0 || iTabpIndex; pIdx; pIdx=pIdx->pNext){ + int iIdx = pIdx->tnum; + assert( pIdx->pSchema==pTab->pSchema ); + if( (iDestroyed==0 || (iIdxiLargest ){ + iLargest = iIdx; + } + } + if( iLargest==0 ){ + return; + }else{ + int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); + assert( iDb>=0 && iDbdb->nDb ); + destroyRootPage(pParse, iLargest, iDb); + iDestroyed = iLargest; + } + } +#endif +} + +/* +** Remove entries from the sqlite_statN tables (for N in (1,2,3)) +** after a DROP INDEX or DROP TABLE command. +*/ +static void sqlite3ClearStatTables( + Parse *pParse, /* The parsing context */ + int iDb, /* The database number */ + const char *zType, /* "idx" or "tbl" */ + const char *zName /* Name of index or table */ +){ + int i; + const char *zDbName = pParse->db->aDb[iDb].zDbSName; + for(i=1; i<=4; i++){ + char zTab[24]; + sqlite3_snprintf(sizeof(zTab),zTab,"sqlite_stat%d",i); + if( sqlite3FindTable(pParse->db, zTab, zDbName) ){ + sqlite3NestedParse(pParse, + "DELETE FROM %Q.%s WHERE %s=%Q", + zDbName, zTab, zType, zName + ); + } + } +} + +/* +** Generate code to drop a table. +*/ +SQLITE_PRIVATE void sqlite3CodeDropTable(Parse *pParse, Table *pTab, int iDb, int isView){ + Vdbe *v; + sqlite3 *db = pParse->db; + Trigger *pTrigger; + Db *pDb = &db->aDb[iDb]; + + v = sqlite3GetVdbe(pParse); + assert( v!=0 ); + sqlite3BeginWriteOperation(pParse, 1, iDb); + +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( IsVirtual(pTab) ){ + sqlite3VdbeAddOp0(v, OP_VBegin); + } +#endif + + /* Drop all triggers associated with the table being dropped. Code + ** is generated to remove entries from sqlite_master and/or + ** sqlite_temp_master if required. + */ + pTrigger = sqlite3TriggerList(pParse, pTab); + while( pTrigger ){ + assert( pTrigger->pSchema==pTab->pSchema || + pTrigger->pSchema==db->aDb[1].pSchema ); + sqlite3DropTriggerPtr(pParse, pTrigger); + pTrigger = pTrigger->pNext; + } + +#ifndef SQLITE_OMIT_AUTOINCREMENT + /* Remove any entries of the sqlite_sequence table associated with + ** the table being dropped. This is done before the table is dropped + ** at the btree level, in case the sqlite_sequence table needs to + ** move as a result of the drop (can happen in auto-vacuum mode). + */ + if( pTab->tabFlags & TF_Autoincrement ){ + sqlite3NestedParse(pParse, + "DELETE FROM %Q.sqlite_sequence WHERE name=%Q", + pDb->zDbSName, pTab->zName + ); + } +#endif + + /* Drop all SQLITE_MASTER table and index entries that refer to the + ** table. The program name loops through the master table and deletes + ** every row that refers to a table of the same name as the one being + ** dropped. Triggers are handled separately because a trigger can be + ** created in the temp database that refers to a table in another + ** database. + */ + sqlite3NestedParse(pParse, + "DELETE FROM %Q.%s WHERE tbl_name=%Q and type!='trigger'", + pDb->zDbSName, SCHEMA_TABLE(iDb), pTab->zName); + if( !isView && !IsVirtual(pTab) ){ + destroyTable(pParse, pTab); + } + + /* Remove the table entry from SQLite's internal schema and modify + ** the schema cookie. + */ + if( IsVirtual(pTab) ){ + sqlite3VdbeAddOp4(v, OP_VDestroy, iDb, 0, 0, pTab->zName, 0); + } + sqlite3VdbeAddOp4(v, OP_DropTable, iDb, 0, 0, pTab->zName, 0); + sqlite3ChangeCookie(pParse, iDb); + sqliteViewResetAll(db, iDb); +} + +/* +** This routine is called to do the work of a DROP TABLE statement. +** pName is the name of the table to be dropped. +*/ +SQLITE_PRIVATE void sqlite3DropTable(Parse *pParse, SrcList *pName, int isView, int noErr){ + Table *pTab; + Vdbe *v; + sqlite3 *db = pParse->db; + int iDb; + + if( db->mallocFailed ){ + goto exit_drop_table; + } + assert( pParse->nErr==0 ); + assert( pName->nSrc==1 ); + if( sqlite3ReadSchema(pParse) ) goto exit_drop_table; + if( noErr ) db->suppressErr++; + assert( isView==0 || isView==LOCATE_VIEW ); + pTab = sqlite3LocateTableItem(pParse, isView, &pName->a[0]); + if( noErr ) db->suppressErr--; + + if( pTab==0 ){ + if( noErr ) sqlite3CodeVerifyNamedSchema(pParse, pName->a[0].zDatabase); + goto exit_drop_table; + } + iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + assert( iDb>=0 && iDbnDb ); + + /* If pTab is a virtual table, call ViewGetColumnNames() to ensure + ** it is initialized. + */ + if( IsVirtual(pTab) && sqlite3ViewGetColumnNames(pParse, pTab) ){ + goto exit_drop_table; + } +#ifndef SQLITE_OMIT_AUTHORIZATION + { + int code; + const char *zTab = SCHEMA_TABLE(iDb); + const char *zDb = db->aDb[iDb].zDbSName; + const char *zArg2 = 0; + if( sqlite3AuthCheck(pParse, SQLITE_DELETE, zTab, 0, zDb)){ + goto exit_drop_table; + } + if( isView ){ + if( !OMIT_TEMPDB && iDb==1 ){ + code = SQLITE_DROP_TEMP_VIEW; + }else{ + code = SQLITE_DROP_VIEW; + } +#ifndef SQLITE_OMIT_VIRTUALTABLE + }else if( IsVirtual(pTab) ){ + code = SQLITE_DROP_VTABLE; + zArg2 = sqlite3GetVTable(db, pTab)->pMod->zName; +#endif + }else{ + if( !OMIT_TEMPDB && iDb==1 ){ + code = SQLITE_DROP_TEMP_TABLE; + }else{ + code = SQLITE_DROP_TABLE; + } + } + if( sqlite3AuthCheck(pParse, code, pTab->zName, zArg2, zDb) ){ + goto exit_drop_table; + } + if( sqlite3AuthCheck(pParse, SQLITE_DELETE, pTab->zName, 0, zDb) ){ + goto exit_drop_table; + } + } +#endif + if( sqlite3StrNICmp(pTab->zName, "sqlite_", 7)==0 + && sqlite3StrNICmp(pTab->zName, "sqlite_stat", 11)!=0 ){ + sqlite3ErrorMsg(pParse, "table %s may not be dropped", pTab->zName); + goto exit_drop_table; + } + +#ifndef SQLITE_OMIT_VIEW + /* Ensure DROP TABLE is not used on a view, and DROP VIEW is not used + ** on a table. + */ + if( isView && pTab->pSelect==0 ){ + sqlite3ErrorMsg(pParse, "use DROP TABLE to delete table %s", pTab->zName); + goto exit_drop_table; + } + if( !isView && pTab->pSelect ){ + sqlite3ErrorMsg(pParse, "use DROP VIEW to delete view %s", pTab->zName); + goto exit_drop_table; + } +#endif + + /* Generate code to remove the table from the master table + ** on disk. + */ + v = sqlite3GetVdbe(pParse); + if( v ){ + sqlite3BeginWriteOperation(pParse, 1, iDb); + sqlite3ClearStatTables(pParse, iDb, "tbl", pTab->zName); + sqlite3FkDropTable(pParse, pName, pTab); + sqlite3CodeDropTable(pParse, pTab, iDb, isView); + } + +exit_drop_table: + sqlite3SrcListDelete(db, pName); +} + +/* +** This routine is called to create a new foreign key on the table +** currently under construction. pFromCol determines which columns +** in the current table point to the foreign key. If pFromCol==0 then +** connect the key to the last column inserted. pTo is the name of +** the table referred to (a.k.a the "parent" table). pToCol is a list +** of tables in the parent pTo table. flags contains all +** information about the conflict resolution algorithms specified +** in the ON DELETE, ON UPDATE and ON INSERT clauses. +** +** An FKey structure is created and added to the table currently +** under construction in the pParse->pNewTable field. +** +** The foreign key is set for IMMEDIATE processing. A subsequent call +** to sqlite3DeferForeignKey() might change this to DEFERRED. +*/ +SQLITE_PRIVATE void sqlite3CreateForeignKey( + Parse *pParse, /* Parsing context */ + ExprList *pFromCol, /* Columns in this table that point to other table */ + Token *pTo, /* Name of the other table */ + ExprList *pToCol, /* Columns in the other table */ + int flags /* Conflict resolution algorithms. */ +){ + sqlite3 *db = pParse->db; +#ifndef SQLITE_OMIT_FOREIGN_KEY + FKey *pFKey = 0; + FKey *pNextTo; + Table *p = pParse->pNewTable; + int nByte; + int i; + int nCol; + char *z; + + assert( pTo!=0 ); + if( p==0 || IN_DECLARE_VTAB ) goto fk_end; + if( pFromCol==0 ){ + int iCol = p->nCol-1; + if( NEVER(iCol<0) ) goto fk_end; + if( pToCol && pToCol->nExpr!=1 ){ + sqlite3ErrorMsg(pParse, "foreign key on %s" + " should reference only one column of table %T", + p->aCol[iCol].zName, pTo); + goto fk_end; + } + nCol = 1; + }else if( pToCol && pToCol->nExpr!=pFromCol->nExpr ){ + sqlite3ErrorMsg(pParse, + "number of columns in foreign key does not match the number of " + "columns in the referenced table"); + goto fk_end; + }else{ + nCol = pFromCol->nExpr; + } + nByte = sizeof(*pFKey) + (nCol-1)*sizeof(pFKey->aCol[0]) + pTo->n + 1; + if( pToCol ){ + for(i=0; inExpr; i++){ + nByte += sqlite3Strlen30(pToCol->a[i].zName) + 1; + } + } + pFKey = sqlite3DbMallocZero(db, nByte ); + if( pFKey==0 ){ + goto fk_end; + } + pFKey->pFrom = p; + pFKey->pNextFrom = p->pFKey; + z = (char*)&pFKey->aCol[nCol]; + pFKey->zTo = z; + memcpy(z, pTo->z, pTo->n); + z[pTo->n] = 0; + sqlite3Dequote(z); + z += pTo->n+1; + pFKey->nCol = nCol; + if( pFromCol==0 ){ + pFKey->aCol[0].iFrom = p->nCol-1; + }else{ + for(i=0; inCol; j++){ + if( sqlite3StrICmp(p->aCol[j].zName, pFromCol->a[i].zName)==0 ){ + pFKey->aCol[i].iFrom = j; + break; + } + } + if( j>=p->nCol ){ + sqlite3ErrorMsg(pParse, + "unknown column \"%s\" in foreign key definition", + pFromCol->a[i].zName); + goto fk_end; + } + } + } + if( pToCol ){ + for(i=0; ia[i].zName); + pFKey->aCol[i].zCol = z; + memcpy(z, pToCol->a[i].zName, n); + z[n] = 0; + z += n+1; + } + } + pFKey->isDeferred = 0; + pFKey->aAction[0] = (u8)(flags & 0xff); /* ON DELETE action */ + pFKey->aAction[1] = (u8)((flags >> 8 ) & 0xff); /* ON UPDATE action */ + + assert( sqlite3SchemaMutexHeld(db, 0, p->pSchema) ); + pNextTo = (FKey *)sqlite3HashInsert(&p->pSchema->fkeyHash, + pFKey->zTo, (void *)pFKey + ); + if( pNextTo==pFKey ){ + sqlite3OomFault(db); + goto fk_end; + } + if( pNextTo ){ + assert( pNextTo->pPrevTo==0 ); + pFKey->pNextTo = pNextTo; + pNextTo->pPrevTo = pFKey; + } + + /* Link the foreign key to the table as the last step. + */ + p->pFKey = pFKey; + pFKey = 0; + +fk_end: + sqlite3DbFree(db, pFKey); +#endif /* !defined(SQLITE_OMIT_FOREIGN_KEY) */ + sqlite3ExprListDelete(db, pFromCol); + sqlite3ExprListDelete(db, pToCol); +} + +/* +** This routine is called when an INITIALLY IMMEDIATE or INITIALLY DEFERRED +** clause is seen as part of a foreign key definition. The isDeferred +** parameter is 1 for INITIALLY DEFERRED and 0 for INITIALLY IMMEDIATE. +** The behavior of the most recently created foreign key is adjusted +** accordingly. +*/ +SQLITE_PRIVATE void sqlite3DeferForeignKey(Parse *pParse, int isDeferred){ +#ifndef SQLITE_OMIT_FOREIGN_KEY + Table *pTab; + FKey *pFKey; + if( (pTab = pParse->pNewTable)==0 || (pFKey = pTab->pFKey)==0 ) return; + assert( isDeferred==0 || isDeferred==1 ); /* EV: R-30323-21917 */ + pFKey->isDeferred = (u8)isDeferred; +#endif +} + +/* +** Generate code that will erase and refill index *pIdx. This is +** used to initialize a newly created index or to recompute the +** content of an index in response to a REINDEX command. +** +** if memRootPage is not negative, it means that the index is newly +** created. The register specified by memRootPage contains the +** root page number of the index. If memRootPage is negative, then +** the index already exists and must be cleared before being refilled and +** the root page number of the index is taken from pIndex->tnum. +*/ +static void sqlite3RefillIndex(Parse *pParse, Index *pIndex, int memRootPage){ + Table *pTab = pIndex->pTable; /* The table that is indexed */ + int iTab = pParse->nTab++; /* Btree cursor used for pTab */ + int iIdx = pParse->nTab++; /* Btree cursor used for pIndex */ + int iSorter; /* Cursor opened by OpenSorter (if in use) */ + int addr1; /* Address of top of loop */ + int addr2; /* Address to jump to for next iteration */ + int tnum; /* Root page of index */ + int iPartIdxLabel; /* Jump to this label to skip a row */ + Vdbe *v; /* Generate code into this virtual machine */ + KeyInfo *pKey; /* KeyInfo for index */ + int regRecord; /* Register holding assembled index record */ + sqlite3 *db = pParse->db; /* The database connection */ + int iDb = sqlite3SchemaToIndex(db, pIndex->pSchema); + +#ifndef SQLITE_OMIT_AUTHORIZATION + if( sqlite3AuthCheck(pParse, SQLITE_REINDEX, pIndex->zName, 0, + db->aDb[iDb].zDbSName ) ){ + return; + } +#endif + + /* Require a write-lock on the table to perform this operation */ + sqlite3TableLock(pParse, iDb, pTab->tnum, 1, pTab->zName); + + v = sqlite3GetVdbe(pParse); + if( v==0 ) return; + if( memRootPage>=0 ){ + tnum = memRootPage; + }else{ + tnum = pIndex->tnum; + } + pKey = sqlite3KeyInfoOfIndex(pParse, pIndex); + assert( pKey!=0 || db->mallocFailed || pParse->nErr ); + + /* Open the sorter cursor if we are to use one. */ + iSorter = pParse->nTab++; + sqlite3VdbeAddOp4(v, OP_SorterOpen, iSorter, 0, pIndex->nKeyCol, (char*) + sqlite3KeyInfoRef(pKey), P4_KEYINFO); + + /* Open the table. Loop through all rows of the table, inserting index + ** records into the sorter. */ + sqlite3OpenTable(pParse, iTab, iDb, pTab, OP_OpenRead); + addr1 = sqlite3VdbeAddOp2(v, OP_Rewind, iTab, 0); VdbeCoverage(v); + regRecord = sqlite3GetTempReg(pParse); + + sqlite3GenerateIndexKey(pParse,pIndex,iTab,regRecord,0,&iPartIdxLabel,0,0); + sqlite3VdbeAddOp2(v, OP_SorterInsert, iSorter, regRecord); + sqlite3ResolvePartIdxLabel(pParse, iPartIdxLabel); + sqlite3VdbeAddOp2(v, OP_Next, iTab, addr1+1); VdbeCoverage(v); + sqlite3VdbeJumpHere(v, addr1); + if( memRootPage<0 ) sqlite3VdbeAddOp2(v, OP_Clear, tnum, iDb); + sqlite3VdbeAddOp4(v, OP_OpenWrite, iIdx, tnum, iDb, + (char *)pKey, P4_KEYINFO); + sqlite3VdbeChangeP5(v, OPFLAG_BULKCSR|((memRootPage>=0)?OPFLAG_P2ISREG:0)); + + addr1 = sqlite3VdbeAddOp2(v, OP_SorterSort, iSorter, 0); VdbeCoverage(v); + if( IsUniqueIndex(pIndex) ){ + int j2 = sqlite3VdbeCurrentAddr(v) + 3; + sqlite3VdbeGoto(v, j2); + addr2 = sqlite3VdbeCurrentAddr(v); + sqlite3VdbeAddOp4Int(v, OP_SorterCompare, iSorter, j2, regRecord, + pIndex->nKeyCol); VdbeCoverage(v); + sqlite3UniqueConstraint(pParse, OE_Abort, pIndex); + }else{ + addr2 = sqlite3VdbeCurrentAddr(v); + } + sqlite3VdbeAddOp3(v, OP_SorterData, iSorter, regRecord, iIdx); + sqlite3VdbeAddOp3(v, OP_Last, iIdx, 0, -1); + sqlite3VdbeAddOp3(v, OP_IdxInsert, iIdx, regRecord, 0); + sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT); + sqlite3ReleaseTempReg(pParse, regRecord); + sqlite3VdbeAddOp2(v, OP_SorterNext, iSorter, addr2); VdbeCoverage(v); + sqlite3VdbeJumpHere(v, addr1); + + sqlite3VdbeAddOp1(v, OP_Close, iTab); + sqlite3VdbeAddOp1(v, OP_Close, iIdx); + sqlite3VdbeAddOp1(v, OP_Close, iSorter); +} + +/* +** Allocate heap space to hold an Index object with nCol columns. +** +** Increase the allocation size to provide an extra nExtra bytes +** of 8-byte aligned space after the Index object and return a +** pointer to this extra space in *ppExtra. +*/ +SQLITE_PRIVATE Index *sqlite3AllocateIndexObject( + sqlite3 *db, /* Database connection */ + i16 nCol, /* Total number of columns in the index */ + int nExtra, /* Number of bytes of extra space to alloc */ + char **ppExtra /* Pointer to the "extra" space */ +){ + Index *p; /* Allocated index object */ + int nByte; /* Bytes of space for Index object + arrays */ + + nByte = ROUND8(sizeof(Index)) + /* Index structure */ + ROUND8(sizeof(char*)*nCol) + /* Index.azColl */ + ROUND8(sizeof(LogEst)*(nCol+1) + /* Index.aiRowLogEst */ + sizeof(i16)*nCol + /* Index.aiColumn */ + sizeof(u8)*nCol); /* Index.aSortOrder */ + p = sqlite3DbMallocZero(db, nByte + nExtra); + if( p ){ + char *pExtra = ((char*)p)+ROUND8(sizeof(Index)); + p->azColl = (const char**)pExtra; pExtra += ROUND8(sizeof(char*)*nCol); + p->aiRowLogEst = (LogEst*)pExtra; pExtra += sizeof(LogEst)*(nCol+1); + p->aiColumn = (i16*)pExtra; pExtra += sizeof(i16)*nCol; + p->aSortOrder = (u8*)pExtra; + p->nColumn = nCol; + p->nKeyCol = nCol - 1; + *ppExtra = ((char*)p) + nByte; + } + return p; +} + +/* +** Create a new index for an SQL table. pName1.pName2 is the name of the index +** and pTblList is the name of the table that is to be indexed. Both will +** be NULL for a primary key or an index that is created to satisfy a +** UNIQUE constraint. If pTable and pIndex are NULL, use pParse->pNewTable +** as the table to be indexed. pParse->pNewTable is a table that is +** currently being constructed by a CREATE TABLE statement. +** +** pList is a list of columns to be indexed. pList will be NULL if this +** is a primary key or unique-constraint on the most recent column added +** to the table currently under construction. +*/ +SQLITE_PRIVATE void sqlite3CreateIndex( + Parse *pParse, /* All information about this parse */ + Token *pName1, /* First part of index name. May be NULL */ + Token *pName2, /* Second part of index name. May be NULL */ + SrcList *pTblName, /* Table to index. Use pParse->pNewTable if 0 */ + ExprList *pList, /* A list of columns to be indexed */ + int onError, /* OE_Abort, OE_Ignore, OE_Replace, or OE_None */ + Token *pStart, /* The CREATE token that begins this statement */ + Expr *pPIWhere, /* WHERE clause for partial indices */ + int sortOrder, /* Sort order of primary key when pList==NULL */ + int ifNotExist, /* Omit error if index already exists */ + u8 idxType /* The index type */ +){ + Table *pTab = 0; /* Table to be indexed */ + Index *pIndex = 0; /* The index to be created */ + char *zName = 0; /* Name of the index */ + int nName; /* Number of characters in zName */ + int i, j; + DbFixer sFix; /* For assigning database names to pTable */ + int sortOrderMask; /* 1 to honor DESC in index. 0 to ignore. */ + sqlite3 *db = pParse->db; + Db *pDb; /* The specific table containing the indexed database */ + int iDb; /* Index of the database that is being written */ + Token *pName = 0; /* Unqualified name of the index to create */ + struct ExprList_item *pListItem; /* For looping over pList */ + int nExtra = 0; /* Space allocated for zExtra[] */ + int nExtraCol; /* Number of extra columns needed */ + char *zExtra = 0; /* Extra space after the Index object */ + Index *pPk = 0; /* PRIMARY KEY index for WITHOUT ROWID tables */ + + if( db->mallocFailed || pParse->nErr>0 ){ + goto exit_create_index; + } + if( IN_DECLARE_VTAB && idxType!=SQLITE_IDXTYPE_PRIMARYKEY ){ + goto exit_create_index; + } + if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){ + goto exit_create_index; + } + + /* + ** Find the table that is to be indexed. Return early if not found. + */ + if( pTblName!=0 ){ + + /* Use the two-part index name to determine the database + ** to search for the table. 'Fix' the table name to this db + ** before looking up the table. + */ + assert( pName1 && pName2 ); + iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pName); + if( iDb<0 ) goto exit_create_index; + assert( pName && pName->z ); + +#ifndef SQLITE_OMIT_TEMPDB + /* If the index name was unqualified, check if the table + ** is a temp table. If so, set the database to 1. Do not do this + ** if initialising a database schema. + */ + if( !db->init.busy ){ + pTab = sqlite3SrcListLookup(pParse, pTblName); + if( pName2->n==0 && pTab && pTab->pSchema==db->aDb[1].pSchema ){ + iDb = 1; + } + } +#endif + + sqlite3FixInit(&sFix, pParse, iDb, "index", pName); + if( sqlite3FixSrcList(&sFix, pTblName) ){ + /* Because the parser constructs pTblName from a single identifier, + ** sqlite3FixSrcList can never fail. */ + assert(0); + } + pTab = sqlite3LocateTableItem(pParse, 0, &pTblName->a[0]); + assert( db->mallocFailed==0 || pTab==0 ); + if( pTab==0 ) goto exit_create_index; + if( iDb==1 && db->aDb[iDb].pSchema!=pTab->pSchema ){ + sqlite3ErrorMsg(pParse, + "cannot create a TEMP index on non-TEMP table \"%s\"", + pTab->zName); + goto exit_create_index; + } + if( !HasRowid(pTab) ) pPk = sqlite3PrimaryKeyIndex(pTab); + }else{ + assert( pName==0 ); + assert( pStart==0 ); + pTab = pParse->pNewTable; + if( !pTab ) goto exit_create_index; + iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + } + pDb = &db->aDb[iDb]; + + assert( pTab!=0 ); + assert( pParse->nErr==0 ); + if( sqlite3StrNICmp(pTab->zName, "sqlite_", 7)==0 + && db->init.busy==0 +#if SQLITE_USER_AUTHENTICATION + && sqlite3UserAuthTable(pTab->zName)==0 +#endif + && sqlite3StrNICmp(&pTab->zName[7],"altertab_",9)!=0 ){ + sqlite3ErrorMsg(pParse, "table %s may not be indexed", pTab->zName); + goto exit_create_index; + } +#ifndef SQLITE_OMIT_VIEW + if( pTab->pSelect ){ + sqlite3ErrorMsg(pParse, "views may not be indexed"); + goto exit_create_index; + } +#endif +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( IsVirtual(pTab) ){ + sqlite3ErrorMsg(pParse, "virtual tables may not be indexed"); + goto exit_create_index; + } +#endif + + /* + ** Find the name of the index. Make sure there is not already another + ** index or table with the same name. + ** + ** Exception: If we are reading the names of permanent indices from the + ** sqlite_master table (because some other process changed the schema) and + ** one of the index names collides with the name of a temporary table or + ** index, then we will continue to process this index. + ** + ** If pName==0 it means that we are + ** dealing with a primary key or UNIQUE constraint. We have to invent our + ** own name. + */ + if( pName ){ + zName = sqlite3NameFromToken(db, pName); + if( zName==0 ) goto exit_create_index; + assert( pName->z!=0 ); + if( SQLITE_OK!=sqlite3CheckObjectName(pParse, zName) ){ + goto exit_create_index; + } + if( !db->init.busy ){ + if( sqlite3FindTable(db, zName, 0)!=0 ){ + sqlite3ErrorMsg(pParse, "there is already a table named %s", zName); + goto exit_create_index; + } + } + if( sqlite3FindIndex(db, zName, pDb->zDbSName)!=0 ){ + if( !ifNotExist ){ + sqlite3ErrorMsg(pParse, "index %s already exists", zName); + }else{ + assert( !db->init.busy ); + sqlite3CodeVerifySchema(pParse, iDb); + } + goto exit_create_index; + } + }else{ + int n; + Index *pLoop; + for(pLoop=pTab->pIndex, n=1; pLoop; pLoop=pLoop->pNext, n++){} + zName = sqlite3MPrintf(db, "sqlite_autoindex_%s_%d", pTab->zName, n); + if( zName==0 ){ + goto exit_create_index; + } + + /* Automatic index names generated from within sqlite3_declare_vtab() + ** must have names that are distinct from normal automatic index names. + ** The following statement converts "sqlite3_autoindex..." into + ** "sqlite3_butoindex..." in order to make the names distinct. + ** The "vtab_err.test" test demonstrates the need of this statement. */ + if( IN_DECLARE_VTAB ) zName[7]++; + } + + /* Check for authorization to create an index. + */ +#ifndef SQLITE_OMIT_AUTHORIZATION + { + const char *zDb = pDb->zDbSName; + if( sqlite3AuthCheck(pParse, SQLITE_INSERT, SCHEMA_TABLE(iDb), 0, zDb) ){ + goto exit_create_index; + } + i = SQLITE_CREATE_INDEX; + if( !OMIT_TEMPDB && iDb==1 ) i = SQLITE_CREATE_TEMP_INDEX; + if( sqlite3AuthCheck(pParse, i, zName, pTab->zName, zDb) ){ + goto exit_create_index; + } + } +#endif + + /* If pList==0, it means this routine was called to make a primary + ** key out of the last column added to the table under construction. + ** So create a fake list to simulate this. + */ + if( pList==0 ){ + Token prevCol; + sqlite3TokenInit(&prevCol, pTab->aCol[pTab->nCol-1].zName); + pList = sqlite3ExprListAppend(pParse, 0, + sqlite3ExprAlloc(db, TK_ID, &prevCol, 0)); + if( pList==0 ) goto exit_create_index; + assert( pList->nExpr==1 ); + sqlite3ExprListSetSortOrder(pList, sortOrder); + }else{ + sqlite3ExprListCheckLength(pParse, pList, "index"); + } + + /* Figure out how many bytes of space are required to store explicitly + ** specified collation sequence names. + */ + for(i=0; inExpr; i++){ + Expr *pExpr = pList->a[i].pExpr; + assert( pExpr!=0 ); + if( pExpr->op==TK_COLLATE ){ + nExtra += (1 + sqlite3Strlen30(pExpr->u.zToken)); + } + } + + /* + ** Allocate the index structure. + */ + nName = sqlite3Strlen30(zName); + nExtraCol = pPk ? pPk->nKeyCol : 1; + pIndex = sqlite3AllocateIndexObject(db, pList->nExpr + nExtraCol, + nName + nExtra + 1, &zExtra); + if( db->mallocFailed ){ + goto exit_create_index; + } + assert( EIGHT_BYTE_ALIGNMENT(pIndex->aiRowLogEst) ); + assert( EIGHT_BYTE_ALIGNMENT(pIndex->azColl) ); + pIndex->zName = zExtra; + zExtra += nName + 1; + memcpy(pIndex->zName, zName, nName+1); + pIndex->pTable = pTab; + pIndex->onError = (u8)onError; + pIndex->uniqNotNull = onError!=OE_None; + pIndex->idxType = idxType; + pIndex->pSchema = db->aDb[iDb].pSchema; + pIndex->nKeyCol = pList->nExpr; + if( pPIWhere ){ + sqlite3ResolveSelfReference(pParse, pTab, NC_PartIdx, pPIWhere, 0); + pIndex->pPartIdxWhere = pPIWhere; + pPIWhere = 0; + } + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + + /* Check to see if we should honor DESC requests on index columns + */ + if( pDb->pSchema->file_format>=4 ){ + sortOrderMask = -1; /* Honor DESC */ + }else{ + sortOrderMask = 0; /* Ignore DESC */ + } + + /* Analyze the list of expressions that form the terms of the index and + ** report any errors. In the common case where the expression is exactly + ** a table column, store that column in aiColumn[]. For general expressions, + ** populate pIndex->aColExpr and store XN_EXPR (-2) in aiColumn[]. + ** + ** TODO: Issue a warning if two or more columns of the index are identical. + ** TODO: Issue a warning if the table primary key is used as part of the + ** index key. + */ + for(i=0, pListItem=pList->a; inExpr; i++, pListItem++){ + Expr *pCExpr; /* The i-th index expression */ + int requestedSortOrder; /* ASC or DESC on the i-th expression */ + const char *zColl; /* Collation sequence name */ + + sqlite3StringToId(pListItem->pExpr); + sqlite3ResolveSelfReference(pParse, pTab, NC_IdxExpr, pListItem->pExpr, 0); + if( pParse->nErr ) goto exit_create_index; + pCExpr = sqlite3ExprSkipCollate(pListItem->pExpr); + if( pCExpr->op!=TK_COLUMN ){ + if( pTab==pParse->pNewTable ){ + sqlite3ErrorMsg(pParse, "expressions prohibited in PRIMARY KEY and " + "UNIQUE constraints"); + goto exit_create_index; + } + if( pIndex->aColExpr==0 ){ + ExprList *pCopy = sqlite3ExprListDup(db, pList, 0); + pIndex->aColExpr = pCopy; + if( !db->mallocFailed ){ + assert( pCopy!=0 ); + pListItem = &pCopy->a[i]; + } + } + j = XN_EXPR; + pIndex->aiColumn[i] = XN_EXPR; + pIndex->uniqNotNull = 0; + }else{ + j = pCExpr->iColumn; + assert( j<=0x7fff ); + if( j<0 ){ + j = pTab->iPKey; + }else if( pTab->aCol[j].notNull==0 ){ + pIndex->uniqNotNull = 0; + } + pIndex->aiColumn[i] = (i16)j; + } + zColl = 0; + if( pListItem->pExpr->op==TK_COLLATE ){ + int nColl; + zColl = pListItem->pExpr->u.zToken; + nColl = sqlite3Strlen30(zColl) + 1; + assert( nExtra>=nColl ); + memcpy(zExtra, zColl, nColl); + zColl = zExtra; + zExtra += nColl; + nExtra -= nColl; + }else if( j>=0 ){ + zColl = pTab->aCol[j].zColl; + } + if( !zColl ) zColl = sqlite3StrBINARY; + if( !db->init.busy && !sqlite3LocateCollSeq(pParse, zColl) ){ + goto exit_create_index; + } + pIndex->azColl[i] = zColl; + requestedSortOrder = pListItem->sortOrder & sortOrderMask; + pIndex->aSortOrder[i] = (u8)requestedSortOrder; + } + + /* Append the table key to the end of the index. For WITHOUT ROWID + ** tables (when pPk!=0) this will be the declared PRIMARY KEY. For + ** normal tables (when pPk==0) this will be the rowid. + */ + if( pPk ){ + for(j=0; jnKeyCol; j++){ + int x = pPk->aiColumn[j]; + assert( x>=0 ); + if( hasColumn(pIndex->aiColumn, pIndex->nKeyCol, x) ){ + pIndex->nColumn--; + }else{ + pIndex->aiColumn[i] = x; + pIndex->azColl[i] = pPk->azColl[j]; + pIndex->aSortOrder[i] = pPk->aSortOrder[j]; + i++; + } + } + assert( i==pIndex->nColumn ); + }else{ + pIndex->aiColumn[i] = XN_ROWID; + pIndex->azColl[i] = sqlite3StrBINARY; + } + sqlite3DefaultRowEst(pIndex); + if( pParse->pNewTable==0 ) estimateIndexWidth(pIndex); + + /* If this index contains every column of its table, then mark + ** it as a covering index */ + assert( HasRowid(pTab) + || pTab->iPKey<0 || sqlite3ColumnOfIndex(pIndex, pTab->iPKey)>=0 ); + if( pTblName!=0 && pIndex->nColumn>=pTab->nCol ){ + pIndex->isCovering = 1; + for(j=0; jnCol; j++){ + if( j==pTab->iPKey ) continue; + if( sqlite3ColumnOfIndex(pIndex,j)>=0 ) continue; + pIndex->isCovering = 0; + break; + } + } + + if( pTab==pParse->pNewTable ){ + /* This routine has been called to create an automatic index as a + ** result of a PRIMARY KEY or UNIQUE clause on a column definition, or + ** a PRIMARY KEY or UNIQUE clause following the column definitions. + ** i.e. one of: + ** + ** CREATE TABLE t(x PRIMARY KEY, y); + ** CREATE TABLE t(x, y, UNIQUE(x, y)); + ** + ** Either way, check to see if the table already has such an index. If + ** so, don't bother creating this one. This only applies to + ** automatically created indices. Users can do as they wish with + ** explicit indices. + ** + ** Two UNIQUE or PRIMARY KEY constraints are considered equivalent + ** (and thus suppressing the second one) even if they have different + ** sort orders. + ** + ** If there are different collating sequences or if the columns of + ** the constraint occur in different orders, then the constraints are + ** considered distinct and both result in separate indices. + */ + Index *pIdx; + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + int k; + assert( IsUniqueIndex(pIdx) ); + assert( pIdx->idxType!=SQLITE_IDXTYPE_APPDEF ); + assert( IsUniqueIndex(pIndex) ); + + if( pIdx->nKeyCol!=pIndex->nKeyCol ) continue; + for(k=0; knKeyCol; k++){ + const char *z1; + const char *z2; + assert( pIdx->aiColumn[k]>=0 ); + if( pIdx->aiColumn[k]!=pIndex->aiColumn[k] ) break; + z1 = pIdx->azColl[k]; + z2 = pIndex->azColl[k]; + if( sqlite3StrICmp(z1, z2) ) break; + } + if( k==pIdx->nKeyCol ){ + if( pIdx->onError!=pIndex->onError ){ + /* This constraint creates the same index as a previous + ** constraint specified somewhere in the CREATE TABLE statement. + ** However the ON CONFLICT clauses are different. If both this + ** constraint and the previous equivalent constraint have explicit + ** ON CONFLICT clauses this is an error. Otherwise, use the + ** explicitly specified behavior for the index. + */ + if( !(pIdx->onError==OE_Default || pIndex->onError==OE_Default) ){ + sqlite3ErrorMsg(pParse, + "conflicting ON CONFLICT clauses specified", 0); + } + if( pIdx->onError==OE_Default ){ + pIdx->onError = pIndex->onError; + } + } + if( idxType==SQLITE_IDXTYPE_PRIMARYKEY ) pIdx->idxType = idxType; + goto exit_create_index; + } + } + } + + /* Link the new Index structure to its table and to the other + ** in-memory database structures. + */ + assert( pParse->nErr==0 ); + if( db->init.busy ){ + Index *p; + assert( !IN_DECLARE_VTAB ); + assert( sqlite3SchemaMutexHeld(db, 0, pIndex->pSchema) ); + p = sqlite3HashInsert(&pIndex->pSchema->idxHash, + pIndex->zName, pIndex); + if( p ){ + assert( p==pIndex ); /* Malloc must have failed */ + sqlite3OomFault(db); + goto exit_create_index; + } + db->flags |= SQLITE_InternChanges; + if( pTblName!=0 ){ + pIndex->tnum = db->init.newTnum; + } + } + + /* If this is the initial CREATE INDEX statement (or CREATE TABLE if the + ** index is an implied index for a UNIQUE or PRIMARY KEY constraint) then + ** emit code to allocate the index rootpage on disk and make an entry for + ** the index in the sqlite_master table and populate the index with + ** content. But, do not do this if we are simply reading the sqlite_master + ** table to parse the schema, or if this index is the PRIMARY KEY index + ** of a WITHOUT ROWID table. + ** + ** If pTblName==0 it means this index is generated as an implied PRIMARY KEY + ** or UNIQUE index in a CREATE TABLE statement. Since the table + ** has just been created, it contains no data and the index initialization + ** step can be skipped. + */ + else if( HasRowid(pTab) || pTblName!=0 ){ + Vdbe *v; + char *zStmt; + int iMem = ++pParse->nMem; + + v = sqlite3GetVdbe(pParse); + if( v==0 ) goto exit_create_index; + + sqlite3BeginWriteOperation(pParse, 1, iDb); + + /* Create the rootpage for the index using CreateIndex. But before + ** doing so, code a Noop instruction and store its address in + ** Index.tnum. This is required in case this index is actually a + ** PRIMARY KEY and the table is actually a WITHOUT ROWID table. In + ** that case the convertToWithoutRowidTable() routine will replace + ** the Noop with a Goto to jump over the VDBE code generated below. */ + pIndex->tnum = sqlite3VdbeAddOp0(v, OP_Noop); + sqlite3VdbeAddOp2(v, OP_CreateIndex, iDb, iMem); + + /* Gather the complete text of the CREATE INDEX statement into + ** the zStmt variable + */ + if( pStart ){ + int n = (int)(pParse->sLastToken.z - pName->z) + pParse->sLastToken.n; + if( pName->z[n-1]==';' ) n--; + /* A named index with an explicit CREATE INDEX statement */ + zStmt = sqlite3MPrintf(db, "CREATE%s INDEX %.*s", + onError==OE_None ? "" : " UNIQUE", n, pName->z); + }else{ + /* An automatic index created by a PRIMARY KEY or UNIQUE constraint */ + /* zStmt = sqlite3MPrintf(""); */ + zStmt = 0; + } + + /* Add an entry in sqlite_master for this index + */ + sqlite3NestedParse(pParse, + "INSERT INTO %Q.%s VALUES('index',%Q,%Q,#%d,%Q);", + db->aDb[iDb].zDbSName, SCHEMA_TABLE(iDb), + pIndex->zName, + pTab->zName, + iMem, + zStmt + ); + sqlite3DbFree(db, zStmt); + + /* Fill the index with data and reparse the schema. Code an OP_Expire + ** to invalidate all pre-compiled statements. + */ + if( pTblName ){ + sqlite3RefillIndex(pParse, pIndex, iMem); + sqlite3ChangeCookie(pParse, iDb); + sqlite3VdbeAddParseSchemaOp(v, iDb, + sqlite3MPrintf(db, "name='%q' AND type='index'", pIndex->zName)); + sqlite3VdbeAddOp0(v, OP_Expire); + } + + sqlite3VdbeJumpHere(v, pIndex->tnum); + } + + /* When adding an index to the list of indices for a table, make + ** sure all indices labeled OE_Replace come after all those labeled + ** OE_Ignore. This is necessary for the correct constraint check + ** processing (in sqlite3GenerateConstraintChecks()) as part of + ** UPDATE and INSERT statements. + */ + if( db->init.busy || pTblName==0 ){ + if( onError!=OE_Replace || pTab->pIndex==0 + || pTab->pIndex->onError==OE_Replace){ + pIndex->pNext = pTab->pIndex; + pTab->pIndex = pIndex; + }else{ + Index *pOther = pTab->pIndex; + while( pOther->pNext && pOther->pNext->onError!=OE_Replace ){ + pOther = pOther->pNext; + } + pIndex->pNext = pOther->pNext; + pOther->pNext = pIndex; + } + pIndex = 0; + } + + /* Clean up before exiting */ +exit_create_index: + if( pIndex ) freeIndex(db, pIndex); + sqlite3ExprDelete(db, pPIWhere); + sqlite3ExprListDelete(db, pList); + sqlite3SrcListDelete(db, pTblName); + sqlite3DbFree(db, zName); +} + +/* +** Fill the Index.aiRowEst[] array with default information - information +** to be used when we have not run the ANALYZE command. +** +** aiRowEst[0] is supposed to contain the number of elements in the index. +** Since we do not know, guess 1 million. aiRowEst[1] is an estimate of the +** number of rows in the table that match any particular value of the +** first column of the index. aiRowEst[2] is an estimate of the number +** of rows that match any particular combination of the first 2 columns +** of the index. And so forth. It must always be the case that +* +** aiRowEst[N]<=aiRowEst[N-1] +** aiRowEst[N]>=1 +** +** Apart from that, we have little to go on besides intuition as to +** how aiRowEst[] should be initialized. The numbers generated here +** are based on typical values found in actual indices. +*/ +SQLITE_PRIVATE void sqlite3DefaultRowEst(Index *pIdx){ + /* 10, 9, 8, 7, 6 */ + LogEst aVal[] = { 33, 32, 30, 28, 26 }; + LogEst *a = pIdx->aiRowLogEst; + int nCopy = MIN(ArraySize(aVal), pIdx->nKeyCol); + int i; + + /* Set the first entry (number of rows in the index) to the estimated + ** number of rows in the table, or half the number of rows in the table + ** for a partial index. But do not let the estimate drop below 10. */ + a[0] = pIdx->pTable->nRowLogEst; + if( pIdx->pPartIdxWhere!=0 ) a[0] -= 10; assert( 10==sqlite3LogEst(2) ); + if( a[0]<33 ) a[0] = 33; assert( 33==sqlite3LogEst(10) ); + + /* Estimate that a[1] is 10, a[2] is 9, a[3] is 8, a[4] is 7, a[5] is + ** 6 and each subsequent value (if any) is 5. */ + memcpy(&a[1], aVal, nCopy*sizeof(LogEst)); + for(i=nCopy+1; i<=pIdx->nKeyCol; i++){ + a[i] = 23; assert( 23==sqlite3LogEst(5) ); + } + + assert( 0==sqlite3LogEst(1) ); + if( IsUniqueIndex(pIdx) ) a[pIdx->nKeyCol] = 0; +} + +/* +** This routine will drop an existing named index. This routine +** implements the DROP INDEX statement. +*/ +SQLITE_PRIVATE void sqlite3DropIndex(Parse *pParse, SrcList *pName, int ifExists){ + Index *pIndex; + Vdbe *v; + sqlite3 *db = pParse->db; + int iDb; + + assert( pParse->nErr==0 ); /* Never called with prior errors */ + if( db->mallocFailed ){ + goto exit_drop_index; + } + assert( pName->nSrc==1 ); + if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){ + goto exit_drop_index; + } + pIndex = sqlite3FindIndex(db, pName->a[0].zName, pName->a[0].zDatabase); + if( pIndex==0 ){ + if( !ifExists ){ + sqlite3ErrorMsg(pParse, "no such index: %S", pName, 0); + }else{ + sqlite3CodeVerifyNamedSchema(pParse, pName->a[0].zDatabase); + } + pParse->checkSchema = 1; + goto exit_drop_index; + } + if( pIndex->idxType!=SQLITE_IDXTYPE_APPDEF ){ + sqlite3ErrorMsg(pParse, "index associated with UNIQUE " + "or PRIMARY KEY constraint cannot be dropped", 0); + goto exit_drop_index; + } + iDb = sqlite3SchemaToIndex(db, pIndex->pSchema); +#ifndef SQLITE_OMIT_AUTHORIZATION + { + int code = SQLITE_DROP_INDEX; + Table *pTab = pIndex->pTable; + const char *zDb = db->aDb[iDb].zDbSName; + const char *zTab = SCHEMA_TABLE(iDb); + if( sqlite3AuthCheck(pParse, SQLITE_DELETE, zTab, 0, zDb) ){ + goto exit_drop_index; + } + if( !OMIT_TEMPDB && iDb ) code = SQLITE_DROP_TEMP_INDEX; + if( sqlite3AuthCheck(pParse, code, pIndex->zName, pTab->zName, zDb) ){ + goto exit_drop_index; + } + } +#endif + + /* Generate code to remove the index and from the master table */ + v = sqlite3GetVdbe(pParse); + if( v ){ + sqlite3BeginWriteOperation(pParse, 1, iDb); + sqlite3NestedParse(pParse, + "DELETE FROM %Q.%s WHERE name=%Q AND type='index'", + db->aDb[iDb].zDbSName, SCHEMA_TABLE(iDb), pIndex->zName + ); + sqlite3ClearStatTables(pParse, iDb, "idx", pIndex->zName); + sqlite3ChangeCookie(pParse, iDb); + destroyRootPage(pParse, pIndex->tnum, iDb); + sqlite3VdbeAddOp4(v, OP_DropIndex, iDb, 0, 0, pIndex->zName, 0); + } + +exit_drop_index: + sqlite3SrcListDelete(db, pName); +} + +/* +** pArray is a pointer to an array of objects. Each object in the +** array is szEntry bytes in size. This routine uses sqlite3DbRealloc() +** to extend the array so that there is space for a new object at the end. +** +** When this function is called, *pnEntry contains the current size of +** the array (in entries - so the allocation is ((*pnEntry) * szEntry) bytes +** in total). +** +** If the realloc() is successful (i.e. if no OOM condition occurs), the +** space allocated for the new object is zeroed, *pnEntry updated to +** reflect the new size of the array and a pointer to the new allocation +** returned. *pIdx is set to the index of the new array entry in this case. +** +** Otherwise, if the realloc() fails, *pIdx is set to -1, *pnEntry remains +** unchanged and a copy of pArray returned. +*/ +SQLITE_PRIVATE void *sqlite3ArrayAllocate( + sqlite3 *db, /* Connection to notify of malloc failures */ + void *pArray, /* Array of objects. Might be reallocated */ + int szEntry, /* Size of each object in the array */ + int *pnEntry, /* Number of objects currently in use */ + int *pIdx /* Write the index of a new slot here */ +){ + char *z; + int n = *pnEntry; + if( (n & (n-1))==0 ){ + int sz = (n==0) ? 1 : 2*n; + void *pNew = sqlite3DbRealloc(db, pArray, sz*szEntry); + if( pNew==0 ){ + *pIdx = -1; + return pArray; + } + pArray = pNew; + } + z = (char*)pArray; + memset(&z[n * szEntry], 0, szEntry); + *pIdx = n; + ++*pnEntry; + return pArray; +} + +/* +** Append a new element to the given IdList. Create a new IdList if +** need be. +** +** A new IdList is returned, or NULL if malloc() fails. +*/ +SQLITE_PRIVATE IdList *sqlite3IdListAppend(sqlite3 *db, IdList *pList, Token *pToken){ + int i; + if( pList==0 ){ + pList = sqlite3DbMallocZero(db, sizeof(IdList) ); + if( pList==0 ) return 0; + } + pList->a = sqlite3ArrayAllocate( + db, + pList->a, + sizeof(pList->a[0]), + &pList->nId, + &i + ); + if( i<0 ){ + sqlite3IdListDelete(db, pList); + return 0; + } + pList->a[i].zName = sqlite3NameFromToken(db, pToken); + return pList; +} + +/* +** Delete an IdList. +*/ +SQLITE_PRIVATE void sqlite3IdListDelete(sqlite3 *db, IdList *pList){ + int i; + if( pList==0 ) return; + for(i=0; inId; i++){ + sqlite3DbFree(db, pList->a[i].zName); + } + sqlite3DbFree(db, pList->a); + sqlite3DbFree(db, pList); +} + +/* +** Return the index in pList of the identifier named zId. Return -1 +** if not found. +*/ +SQLITE_PRIVATE int sqlite3IdListIndex(IdList *pList, const char *zName){ + int i; + if( pList==0 ) return -1; + for(i=0; inId; i++){ + if( sqlite3StrICmp(pList->a[i].zName, zName)==0 ) return i; + } + return -1; +} + +/* +** Expand the space allocated for the given SrcList object by +** creating nExtra new slots beginning at iStart. iStart is zero based. +** New slots are zeroed. +** +** For example, suppose a SrcList initially contains two entries: A,B. +** To append 3 new entries onto the end, do this: +** +** sqlite3SrcListEnlarge(db, pSrclist, 3, 2); +** +** After the call above it would contain: A, B, nil, nil, nil. +** If the iStart argument had been 1 instead of 2, then the result +** would have been: A, nil, nil, nil, B. To prepend the new slots, +** the iStart value would be 0. The result then would +** be: nil, nil, nil, A, B. +** +** If a memory allocation fails the SrcList is unchanged. The +** db->mallocFailed flag will be set to true. +*/ +SQLITE_PRIVATE SrcList *sqlite3SrcListEnlarge( + sqlite3 *db, /* Database connection to notify of OOM errors */ + SrcList *pSrc, /* The SrcList to be enlarged */ + int nExtra, /* Number of new slots to add to pSrc->a[] */ + int iStart /* Index in pSrc->a[] of first new slot */ +){ + int i; + + /* Sanity checking on calling parameters */ + assert( iStart>=0 ); + assert( nExtra>=1 ); + assert( pSrc!=0 ); + assert( iStart<=pSrc->nSrc ); + + /* Allocate additional space if needed */ + if( (u32)pSrc->nSrc+nExtra>pSrc->nAlloc ){ + SrcList *pNew; + int nAlloc = pSrc->nSrc+nExtra; + int nGot; + pNew = sqlite3DbRealloc(db, pSrc, + sizeof(*pSrc) + (nAlloc-1)*sizeof(pSrc->a[0]) ); + if( pNew==0 ){ + assert( db->mallocFailed ); + return pSrc; + } + pSrc = pNew; + nGot = (sqlite3DbMallocSize(db, pNew) - sizeof(*pSrc))/sizeof(pSrc->a[0])+1; + pSrc->nAlloc = nGot; + } + + /* Move existing slots that come after the newly inserted slots + ** out of the way */ + for(i=pSrc->nSrc-1; i>=iStart; i--){ + pSrc->a[i+nExtra] = pSrc->a[i]; + } + pSrc->nSrc += nExtra; + + /* Zero the newly allocated slots */ + memset(&pSrc->a[iStart], 0, sizeof(pSrc->a[0])*nExtra); + for(i=iStart; ia[i].iCursor = -1; + } + + /* Return a pointer to the enlarged SrcList */ + return pSrc; +} + + +/* +** Append a new table name to the given SrcList. Create a new SrcList if +** need be. A new entry is created in the SrcList even if pTable is NULL. +** +** A SrcList is returned, or NULL if there is an OOM error. The returned +** SrcList might be the same as the SrcList that was input or it might be +** a new one. If an OOM error does occurs, then the prior value of pList +** that is input to this routine is automatically freed. +** +** If pDatabase is not null, it means that the table has an optional +** database name prefix. Like this: "database.table". The pDatabase +** points to the table name and the pTable points to the database name. +** The SrcList.a[].zName field is filled with the table name which might +** come from pTable (if pDatabase is NULL) or from pDatabase. +** SrcList.a[].zDatabase is filled with the database name from pTable, +** or with NULL if no database is specified. +** +** In other words, if call like this: +** +** sqlite3SrcListAppend(D,A,B,0); +** +** Then B is a table name and the database name is unspecified. If called +** like this: +** +** sqlite3SrcListAppend(D,A,B,C); +** +** Then C is the table name and B is the database name. If C is defined +** then so is B. In other words, we never have a case where: +** +** sqlite3SrcListAppend(D,A,0,C); +** +** Both pTable and pDatabase are assumed to be quoted. They are dequoted +** before being added to the SrcList. +*/ +SQLITE_PRIVATE SrcList *sqlite3SrcListAppend( + sqlite3 *db, /* Connection to notify of malloc failures */ + SrcList *pList, /* Append to this SrcList. NULL creates a new SrcList */ + Token *pTable, /* Table to append */ + Token *pDatabase /* Database of the table */ +){ + struct SrcList_item *pItem; + assert( pDatabase==0 || pTable!=0 ); /* Cannot have C without B */ + assert( db!=0 ); + if( pList==0 ){ + pList = sqlite3DbMallocRawNN(db, sizeof(SrcList) ); + if( pList==0 ) return 0; + pList->nAlloc = 1; + pList->nSrc = 0; + } + pList = sqlite3SrcListEnlarge(db, pList, 1, pList->nSrc); + if( db->mallocFailed ){ + sqlite3SrcListDelete(db, pList); + return 0; + } + pItem = &pList->a[pList->nSrc-1]; + if( pDatabase && pDatabase->z==0 ){ + pDatabase = 0; + } + if( pDatabase ){ + Token *pTemp = pDatabase; + pDatabase = pTable; + pTable = pTemp; + } + pItem->zName = sqlite3NameFromToken(db, pTable); + pItem->zDatabase = sqlite3NameFromToken(db, pDatabase); + return pList; +} + +/* +** Assign VdbeCursor index numbers to all tables in a SrcList +*/ +SQLITE_PRIVATE void sqlite3SrcListAssignCursors(Parse *pParse, SrcList *pList){ + int i; + struct SrcList_item *pItem; + assert(pList || pParse->db->mallocFailed ); + if( pList ){ + for(i=0, pItem=pList->a; inSrc; i++, pItem++){ + if( pItem->iCursor>=0 ) break; + pItem->iCursor = pParse->nTab++; + if( pItem->pSelect ){ + sqlite3SrcListAssignCursors(pParse, pItem->pSelect->pSrc); + } + } + } +} + +/* +** Delete an entire SrcList including all its substructure. +*/ +SQLITE_PRIVATE void sqlite3SrcListDelete(sqlite3 *db, SrcList *pList){ + int i; + struct SrcList_item *pItem; + if( pList==0 ) return; + for(pItem=pList->a, i=0; inSrc; i++, pItem++){ + sqlite3DbFree(db, pItem->zDatabase); + sqlite3DbFree(db, pItem->zName); + sqlite3DbFree(db, pItem->zAlias); + if( pItem->fg.isIndexedBy ) sqlite3DbFree(db, pItem->u1.zIndexedBy); + if( pItem->fg.isTabFunc ) sqlite3ExprListDelete(db, pItem->u1.pFuncArg); + sqlite3DeleteTable(db, pItem->pTab); + sqlite3SelectDelete(db, pItem->pSelect); + sqlite3ExprDelete(db, pItem->pOn); + sqlite3IdListDelete(db, pItem->pUsing); + } + sqlite3DbFree(db, pList); +} + +/* +** This routine is called by the parser to add a new term to the +** end of a growing FROM clause. The "p" parameter is the part of +** the FROM clause that has already been constructed. "p" is NULL +** if this is the first term of the FROM clause. pTable and pDatabase +** are the name of the table and database named in the FROM clause term. +** pDatabase is NULL if the database name qualifier is missing - the +** usual case. If the term has an alias, then pAlias points to the +** alias token. If the term is a subquery, then pSubquery is the +** SELECT statement that the subquery encodes. The pTable and +** pDatabase parameters are NULL for subqueries. The pOn and pUsing +** parameters are the content of the ON and USING clauses. +** +** Return a new SrcList which encodes is the FROM with the new +** term added. +*/ +SQLITE_PRIVATE SrcList *sqlite3SrcListAppendFromTerm( + Parse *pParse, /* Parsing context */ + SrcList *p, /* The left part of the FROM clause already seen */ + Token *pTable, /* Name of the table to add to the FROM clause */ + Token *pDatabase, /* Name of the database containing pTable */ + Token *pAlias, /* The right-hand side of the AS subexpression */ + Select *pSubquery, /* A subquery used in place of a table name */ + Expr *pOn, /* The ON clause of a join */ + IdList *pUsing /* The USING clause of a join */ +){ + struct SrcList_item *pItem; + sqlite3 *db = pParse->db; + if( !p && (pOn || pUsing) ){ + sqlite3ErrorMsg(pParse, "a JOIN clause is required before %s", + (pOn ? "ON" : "USING") + ); + goto append_from_error; + } + p = sqlite3SrcListAppend(db, p, pTable, pDatabase); + if( p==0 || NEVER(p->nSrc==0) ){ + goto append_from_error; + } + pItem = &p->a[p->nSrc-1]; + assert( pAlias!=0 ); + if( pAlias->n ){ + pItem->zAlias = sqlite3NameFromToken(db, pAlias); + } + pItem->pSelect = pSubquery; + pItem->pOn = pOn; + pItem->pUsing = pUsing; + return p; + + append_from_error: + assert( p==0 ); + sqlite3ExprDelete(db, pOn); + sqlite3IdListDelete(db, pUsing); + sqlite3SelectDelete(db, pSubquery); + return 0; +} + +/* +** Add an INDEXED BY or NOT INDEXED clause to the most recently added +** element of the source-list passed as the second argument. +*/ +SQLITE_PRIVATE void sqlite3SrcListIndexedBy(Parse *pParse, SrcList *p, Token *pIndexedBy){ + assert( pIndexedBy!=0 ); + if( p && ALWAYS(p->nSrc>0) ){ + struct SrcList_item *pItem = &p->a[p->nSrc-1]; + assert( pItem->fg.notIndexed==0 ); + assert( pItem->fg.isIndexedBy==0 ); + assert( pItem->fg.isTabFunc==0 ); + if( pIndexedBy->n==1 && !pIndexedBy->z ){ + /* A "NOT INDEXED" clause was supplied. See parse.y + ** construct "indexed_opt" for details. */ + pItem->fg.notIndexed = 1; + }else{ + pItem->u1.zIndexedBy = sqlite3NameFromToken(pParse->db, pIndexedBy); + pItem->fg.isIndexedBy = (pItem->u1.zIndexedBy!=0); + } + } +} + +/* +** Add the list of function arguments to the SrcList entry for a +** table-valued-function. +*/ +SQLITE_PRIVATE void sqlite3SrcListFuncArgs(Parse *pParse, SrcList *p, ExprList *pList){ + if( p ){ + struct SrcList_item *pItem = &p->a[p->nSrc-1]; + assert( pItem->fg.notIndexed==0 ); + assert( pItem->fg.isIndexedBy==0 ); + assert( pItem->fg.isTabFunc==0 ); + pItem->u1.pFuncArg = pList; + pItem->fg.isTabFunc = 1; + }else{ + sqlite3ExprListDelete(pParse->db, pList); + } +} + +/* +** When building up a FROM clause in the parser, the join operator +** is initially attached to the left operand. But the code generator +** expects the join operator to be on the right operand. This routine +** Shifts all join operators from left to right for an entire FROM +** clause. +** +** Example: Suppose the join is like this: +** +** A natural cross join B +** +** The operator is "natural cross join". The A and B operands are stored +** in p->a[0] and p->a[1], respectively. The parser initially stores the +** operator with A. This routine shifts that operator over to B. +*/ +SQLITE_PRIVATE void sqlite3SrcListShiftJoinType(SrcList *p){ + if( p ){ + int i; + for(i=p->nSrc-1; i>0; i--){ + p->a[i].fg.jointype = p->a[i-1].fg.jointype; + } + p->a[0].fg.jointype = 0; + } +} + +/* +** Generate VDBE code for a BEGIN statement. +*/ +SQLITE_PRIVATE void sqlite3BeginTransaction(Parse *pParse, int type){ + sqlite3 *db; + Vdbe *v; + int i; + + assert( pParse!=0 ); + db = pParse->db; + assert( db!=0 ); + if( sqlite3AuthCheck(pParse, SQLITE_TRANSACTION, "BEGIN", 0, 0) ){ + return; + } + v = sqlite3GetVdbe(pParse); + if( !v ) return; + if( type!=TK_DEFERRED ){ + for(i=0; inDb; i++){ + sqlite3VdbeAddOp2(v, OP_Transaction, i, (type==TK_EXCLUSIVE)+1); + sqlite3VdbeUsesBtree(v, i); + } + } + sqlite3VdbeAddOp0(v, OP_AutoCommit); +} + +/* +** Generate VDBE code for a COMMIT statement. +*/ +SQLITE_PRIVATE void sqlite3CommitTransaction(Parse *pParse){ + Vdbe *v; + + assert( pParse!=0 ); + assert( pParse->db!=0 ); + if( sqlite3AuthCheck(pParse, SQLITE_TRANSACTION, "COMMIT", 0, 0) ){ + return; + } + v = sqlite3GetVdbe(pParse); + if( v ){ + sqlite3VdbeAddOp1(v, OP_AutoCommit, 1); + } +} + +/* +** Generate VDBE code for a ROLLBACK statement. +*/ +SQLITE_PRIVATE void sqlite3RollbackTransaction(Parse *pParse){ + Vdbe *v; + + assert( pParse!=0 ); + assert( pParse->db!=0 ); + if( sqlite3AuthCheck(pParse, SQLITE_TRANSACTION, "ROLLBACK", 0, 0) ){ + return; + } + v = sqlite3GetVdbe(pParse); + if( v ){ + sqlite3VdbeAddOp2(v, OP_AutoCommit, 1, 1); + } +} + +/* +** This function is called by the parser when it parses a command to create, +** release or rollback an SQL savepoint. +*/ +SQLITE_PRIVATE void sqlite3Savepoint(Parse *pParse, int op, Token *pName){ + char *zName = sqlite3NameFromToken(pParse->db, pName); + if( zName ){ + Vdbe *v = sqlite3GetVdbe(pParse); +#ifndef SQLITE_OMIT_AUTHORIZATION + static const char * const az[] = { "BEGIN", "RELEASE", "ROLLBACK" }; + assert( !SAVEPOINT_BEGIN && SAVEPOINT_RELEASE==1 && SAVEPOINT_ROLLBACK==2 ); +#endif + if( !v || sqlite3AuthCheck(pParse, SQLITE_SAVEPOINT, az[op], zName, 0) ){ + sqlite3DbFree(pParse->db, zName); + return; + } + sqlite3VdbeAddOp4(v, OP_Savepoint, op, 0, 0, zName, P4_DYNAMIC); + } +} + +/* +** Make sure the TEMP database is open and available for use. Return +** the number of errors. Leave any error messages in the pParse structure. +*/ +SQLITE_PRIVATE int sqlite3OpenTempDatabase(Parse *pParse){ + sqlite3 *db = pParse->db; + if( db->aDb[1].pBt==0 && !pParse->explain ){ + int rc; + Btree *pBt; + static const int flags = + SQLITE_OPEN_READWRITE | + SQLITE_OPEN_CREATE | + SQLITE_OPEN_EXCLUSIVE | + SQLITE_OPEN_DELETEONCLOSE | + SQLITE_OPEN_TEMP_DB; + + rc = sqlite3BtreeOpen(db->pVfs, 0, db, &pBt, 0, flags); + if( rc!=SQLITE_OK ){ + sqlite3ErrorMsg(pParse, "unable to open a temporary database " + "file for storing temporary tables"); + pParse->rc = rc; + return 1; + } + db->aDb[1].pBt = pBt; + assert( db->aDb[1].pSchema ); + if( SQLITE_NOMEM==sqlite3BtreeSetPageSize(pBt, db->nextPagesize, -1, 0) ){ + sqlite3OomFault(db); + return 1; + } + } + return 0; +} + +/* +** Record the fact that the schema cookie will need to be verified +** for database iDb. The code to actually verify the schema cookie +** will occur at the end of the top-level VDBE and will be generated +** later, by sqlite3FinishCoding(). +*/ +SQLITE_PRIVATE void sqlite3CodeVerifySchema(Parse *pParse, int iDb){ + Parse *pToplevel = sqlite3ParseToplevel(pParse); + + assert( iDb>=0 && iDbdb->nDb ); + assert( pParse->db->aDb[iDb].pBt!=0 || iDb==1 ); + assert( iDbdb, iDb, 0) ); + if( DbMaskTest(pToplevel->cookieMask, iDb)==0 ){ + DbMaskSet(pToplevel->cookieMask, iDb); + if( !OMIT_TEMPDB && iDb==1 ){ + sqlite3OpenTempDatabase(pToplevel); + } + } +} + +/* +** If argument zDb is NULL, then call sqlite3CodeVerifySchema() for each +** attached database. Otherwise, invoke it for the database named zDb only. +*/ +SQLITE_PRIVATE void sqlite3CodeVerifyNamedSchema(Parse *pParse, const char *zDb){ + sqlite3 *db = pParse->db; + int i; + for(i=0; inDb; i++){ + Db *pDb = &db->aDb[i]; + if( pDb->pBt && (!zDb || 0==sqlite3StrICmp(zDb, pDb->zDbSName)) ){ + sqlite3CodeVerifySchema(pParse, i); + } + } +} + +/* +** Generate VDBE code that prepares for doing an operation that +** might change the database. +** +** This routine starts a new transaction if we are not already within +** a transaction. If we are already within a transaction, then a checkpoint +** is set if the setStatement parameter is true. A checkpoint should +** be set for operations that might fail (due to a constraint) part of +** the way through and which will need to undo some writes without having to +** rollback the whole transaction. For operations where all constraints +** can be checked before any changes are made to the database, it is never +** necessary to undo a write and the checkpoint should not be set. +*/ +SQLITE_PRIVATE void sqlite3BeginWriteOperation(Parse *pParse, int setStatement, int iDb){ + Parse *pToplevel = sqlite3ParseToplevel(pParse); + sqlite3CodeVerifySchema(pParse, iDb); + DbMaskSet(pToplevel->writeMask, iDb); + pToplevel->isMultiWrite |= setStatement; +} + +/* +** Indicate that the statement currently under construction might write +** more than one entry (example: deleting one row then inserting another, +** inserting multiple rows in a table, or inserting a row and index entries.) +** If an abort occurs after some of these writes have completed, then it will +** be necessary to undo the completed writes. +*/ +SQLITE_PRIVATE void sqlite3MultiWrite(Parse *pParse){ + Parse *pToplevel = sqlite3ParseToplevel(pParse); + pToplevel->isMultiWrite = 1; +} + +/* +** The code generator calls this routine if is discovers that it is +** possible to abort a statement prior to completion. In order to +** perform this abort without corrupting the database, we need to make +** sure that the statement is protected by a statement transaction. +** +** Technically, we only need to set the mayAbort flag if the +** isMultiWrite flag was previously set. There is a time dependency +** such that the abort must occur after the multiwrite. This makes +** some statements involving the REPLACE conflict resolution algorithm +** go a little faster. But taking advantage of this time dependency +** makes it more difficult to prove that the code is correct (in +** particular, it prevents us from writing an effective +** implementation of sqlite3AssertMayAbort()) and so we have chosen +** to take the safe route and skip the optimization. +*/ +SQLITE_PRIVATE void sqlite3MayAbort(Parse *pParse){ + Parse *pToplevel = sqlite3ParseToplevel(pParse); + pToplevel->mayAbort = 1; +} + +/* +** Code an OP_Halt that causes the vdbe to return an SQLITE_CONSTRAINT +** error. The onError parameter determines which (if any) of the statement +** and/or current transaction is rolled back. +*/ +SQLITE_PRIVATE void sqlite3HaltConstraint( + Parse *pParse, /* Parsing context */ + int errCode, /* extended error code */ + int onError, /* Constraint type */ + char *p4, /* Error message */ + i8 p4type, /* P4_STATIC or P4_TRANSIENT */ + u8 p5Errmsg /* P5_ErrMsg type */ +){ + Vdbe *v = sqlite3GetVdbe(pParse); + assert( (errCode&0xff)==SQLITE_CONSTRAINT ); + if( onError==OE_Abort ){ + sqlite3MayAbort(pParse); + } + sqlite3VdbeAddOp4(v, OP_Halt, errCode, onError, 0, p4, p4type); + sqlite3VdbeChangeP5(v, p5Errmsg); +} + +/* +** Code an OP_Halt due to UNIQUE or PRIMARY KEY constraint violation. +*/ +SQLITE_PRIVATE void sqlite3UniqueConstraint( + Parse *pParse, /* Parsing context */ + int onError, /* Constraint type */ + Index *pIdx /* The index that triggers the constraint */ +){ + char *zErr; + int j; + StrAccum errMsg; + Table *pTab = pIdx->pTable; + + sqlite3StrAccumInit(&errMsg, pParse->db, 0, 0, 200); + if( pIdx->aColExpr ){ + sqlite3XPrintf(&errMsg, "index '%q'", pIdx->zName); + }else{ + for(j=0; jnKeyCol; j++){ + char *zCol; + assert( pIdx->aiColumn[j]>=0 ); + zCol = pTab->aCol[pIdx->aiColumn[j]].zName; + if( j ) sqlite3StrAccumAppend(&errMsg, ", ", 2); + sqlite3XPrintf(&errMsg, "%s.%s", pTab->zName, zCol); + } + } + zErr = sqlite3StrAccumFinish(&errMsg); + sqlite3HaltConstraint(pParse, + IsPrimaryKeyIndex(pIdx) ? SQLITE_CONSTRAINT_PRIMARYKEY + : SQLITE_CONSTRAINT_UNIQUE, + onError, zErr, P4_DYNAMIC, P5_ConstraintUnique); +} + + +/* +** Code an OP_Halt due to non-unique rowid. +*/ +SQLITE_PRIVATE void sqlite3RowidConstraint( + Parse *pParse, /* Parsing context */ + int onError, /* Conflict resolution algorithm */ + Table *pTab /* The table with the non-unique rowid */ +){ + char *zMsg; + int rc; + if( pTab->iPKey>=0 ){ + zMsg = sqlite3MPrintf(pParse->db, "%s.%s", pTab->zName, + pTab->aCol[pTab->iPKey].zName); + rc = SQLITE_CONSTRAINT_PRIMARYKEY; + }else{ + zMsg = sqlite3MPrintf(pParse->db, "%s.rowid", pTab->zName); + rc = SQLITE_CONSTRAINT_ROWID; + } + sqlite3HaltConstraint(pParse, rc, onError, zMsg, P4_DYNAMIC, + P5_ConstraintUnique); +} + +/* +** Check to see if pIndex uses the collating sequence pColl. Return +** true if it does and false if it does not. +*/ +#ifndef SQLITE_OMIT_REINDEX +static int collationMatch(const char *zColl, Index *pIndex){ + int i; + assert( zColl!=0 ); + for(i=0; inColumn; i++){ + const char *z = pIndex->azColl[i]; + assert( z!=0 || pIndex->aiColumn[i]<0 ); + if( pIndex->aiColumn[i]>=0 && 0==sqlite3StrICmp(z, zColl) ){ + return 1; + } + } + return 0; +} +#endif + +/* +** Recompute all indices of pTab that use the collating sequence pColl. +** If pColl==0 then recompute all indices of pTab. +*/ +#ifndef SQLITE_OMIT_REINDEX +static void reindexTable(Parse *pParse, Table *pTab, char const *zColl){ + Index *pIndex; /* An index associated with pTab */ + + for(pIndex=pTab->pIndex; pIndex; pIndex=pIndex->pNext){ + if( zColl==0 || collationMatch(zColl, pIndex) ){ + int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); + sqlite3BeginWriteOperation(pParse, 0, iDb); + sqlite3RefillIndex(pParse, pIndex, -1); + } + } +} +#endif + +/* +** Recompute all indices of all tables in all databases where the +** indices use the collating sequence pColl. If pColl==0 then recompute +** all indices everywhere. +*/ +#ifndef SQLITE_OMIT_REINDEX +static void reindexDatabases(Parse *pParse, char const *zColl){ + Db *pDb; /* A single database */ + int iDb; /* The database index number */ + sqlite3 *db = pParse->db; /* The database connection */ + HashElem *k; /* For looping over tables in pDb */ + Table *pTab; /* A table in the database */ + + assert( sqlite3BtreeHoldsAllMutexes(db) ); /* Needed for schema access */ + for(iDb=0, pDb=db->aDb; iDbnDb; iDb++, pDb++){ + assert( pDb!=0 ); + for(k=sqliteHashFirst(&pDb->pSchema->tblHash); k; k=sqliteHashNext(k)){ + pTab = (Table*)sqliteHashData(k); + reindexTable(pParse, pTab, zColl); + } + } +} +#endif + +/* +** Generate code for the REINDEX command. +** +** REINDEX -- 1 +** REINDEX -- 2 +** REINDEX ?.? -- 3 +** REINDEX ?.? -- 4 +** +** Form 1 causes all indices in all attached databases to be rebuilt. +** Form 2 rebuilds all indices in all databases that use the named +** collating function. Forms 3 and 4 rebuild the named index or all +** indices associated with the named table. +*/ +#ifndef SQLITE_OMIT_REINDEX +SQLITE_PRIVATE void sqlite3Reindex(Parse *pParse, Token *pName1, Token *pName2){ + CollSeq *pColl; /* Collating sequence to be reindexed, or NULL */ + char *z; /* Name of a table or index */ + const char *zDb; /* Name of the database */ + Table *pTab; /* A table in the database */ + Index *pIndex; /* An index associated with pTab */ + int iDb; /* The database index number */ + sqlite3 *db = pParse->db; /* The database connection */ + Token *pObjName; /* Name of the table or index to be reindexed */ + + /* Read the database schema. If an error occurs, leave an error message + ** and code in pParse and return NULL. */ + if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){ + return; + } + + if( pName1==0 ){ + reindexDatabases(pParse, 0); + return; + }else if( NEVER(pName2==0) || pName2->z==0 ){ + char *zColl; + assert( pName1->z ); + zColl = sqlite3NameFromToken(pParse->db, pName1); + if( !zColl ) return; + pColl = sqlite3FindCollSeq(db, ENC(db), zColl, 0); + if( pColl ){ + reindexDatabases(pParse, zColl); + sqlite3DbFree(db, zColl); + return; + } + sqlite3DbFree(db, zColl); + } + iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pObjName); + if( iDb<0 ) return; + z = sqlite3NameFromToken(db, pObjName); + if( z==0 ) return; + zDb = db->aDb[iDb].zDbSName; + pTab = sqlite3FindTable(db, z, zDb); + if( pTab ){ + reindexTable(pParse, pTab, 0); + sqlite3DbFree(db, z); + return; + } + pIndex = sqlite3FindIndex(db, z, zDb); + sqlite3DbFree(db, z); + if( pIndex ){ + sqlite3BeginWriteOperation(pParse, 0, iDb); + sqlite3RefillIndex(pParse, pIndex, -1); + return; + } + sqlite3ErrorMsg(pParse, "unable to identify the object to be reindexed"); +} +#endif + +/* +** Return a KeyInfo structure that is appropriate for the given Index. +** +** The caller should invoke sqlite3KeyInfoUnref() on the returned object +** when it has finished using it. +*/ +SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoOfIndex(Parse *pParse, Index *pIdx){ + int i; + int nCol = pIdx->nColumn; + int nKey = pIdx->nKeyCol; + KeyInfo *pKey; + if( pParse->nErr ) return 0; + if( pIdx->uniqNotNull ){ + pKey = sqlite3KeyInfoAlloc(pParse->db, nKey, nCol-nKey); + }else{ + pKey = sqlite3KeyInfoAlloc(pParse->db, nCol, 0); + } + if( pKey ){ + assert( sqlite3KeyInfoIsWriteable(pKey) ); + for(i=0; iazColl[i]; + pKey->aColl[i] = zColl==sqlite3StrBINARY ? 0 : + sqlite3LocateCollSeq(pParse, zColl); + pKey->aSortOrder[i] = pIdx->aSortOrder[i]; + } + if( pParse->nErr ){ + sqlite3KeyInfoUnref(pKey); + pKey = 0; + } + } + return pKey; +} + +#ifndef SQLITE_OMIT_CTE +/* +** This routine is invoked once per CTE by the parser while parsing a +** WITH clause. +*/ +SQLITE_PRIVATE With *sqlite3WithAdd( + Parse *pParse, /* Parsing context */ + With *pWith, /* Existing WITH clause, or NULL */ + Token *pName, /* Name of the common-table */ + ExprList *pArglist, /* Optional column name list for the table */ + Select *pQuery /* Query used to initialize the table */ +){ + sqlite3 *db = pParse->db; + With *pNew; + char *zName; + + /* Check that the CTE name is unique within this WITH clause. If + ** not, store an error in the Parse structure. */ + zName = sqlite3NameFromToken(pParse->db, pName); + if( zName && pWith ){ + int i; + for(i=0; inCte; i++){ + if( sqlite3StrICmp(zName, pWith->a[i].zName)==0 ){ + sqlite3ErrorMsg(pParse, "duplicate WITH table name: %s", zName); + } + } + } + + if( pWith ){ + int nByte = sizeof(*pWith) + (sizeof(pWith->a[1]) * pWith->nCte); + pNew = sqlite3DbRealloc(db, pWith, nByte); + }else{ + pNew = sqlite3DbMallocZero(db, sizeof(*pWith)); + } + assert( (pNew!=0 && zName!=0) || db->mallocFailed ); + + if( db->mallocFailed ){ + sqlite3ExprListDelete(db, pArglist); + sqlite3SelectDelete(db, pQuery); + sqlite3DbFree(db, zName); + pNew = pWith; + }else{ + pNew->a[pNew->nCte].pSelect = pQuery; + pNew->a[pNew->nCte].pCols = pArglist; + pNew->a[pNew->nCte].zName = zName; + pNew->a[pNew->nCte].zCteErr = 0; + pNew->nCte++; + } + + return pNew; +} + +/* +** Free the contents of the With object passed as the second argument. +*/ +SQLITE_PRIVATE void sqlite3WithDelete(sqlite3 *db, With *pWith){ + if( pWith ){ + int i; + for(i=0; inCte; i++){ + struct Cte *pCte = &pWith->a[i]; + sqlite3ExprListDelete(db, pCte->pCols); + sqlite3SelectDelete(db, pCte->pSelect); + sqlite3DbFree(db, pCte->zName); + } + sqlite3DbFree(db, pWith); + } +} +#endif /* !defined(SQLITE_OMIT_CTE) */ + +/************** End of build.c ***********************************************/ +/************** Begin file callback.c ****************************************/ +/* +** 2005 May 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. +** +************************************************************************* +** +** This file contains functions used to access the internal hash tables +** of user defined functions and collation sequences. +*/ + +/* #include "sqliteInt.h" */ + +/* +** Invoke the 'collation needed' callback to request a collation sequence +** in the encoding enc of name zName, length nName. +*/ +static void callCollNeeded(sqlite3 *db, int enc, const char *zName){ + assert( !db->xCollNeeded || !db->xCollNeeded16 ); + if( db->xCollNeeded ){ + char *zExternal = sqlite3DbStrDup(db, zName); + if( !zExternal ) return; + db->xCollNeeded(db->pCollNeededArg, db, enc, zExternal); + sqlite3DbFree(db, zExternal); + } +#ifndef SQLITE_OMIT_UTF16 + if( db->xCollNeeded16 ){ + char const *zExternal; + sqlite3_value *pTmp = sqlite3ValueNew(db); + sqlite3ValueSetStr(pTmp, -1, zName, SQLITE_UTF8, SQLITE_STATIC); + zExternal = sqlite3ValueText(pTmp, SQLITE_UTF16NATIVE); + if( zExternal ){ + db->xCollNeeded16(db->pCollNeededArg, db, (int)ENC(db), zExternal); + } + sqlite3ValueFree(pTmp); + } +#endif +} + +/* +** This routine is called if the collation factory fails to deliver a +** collation function in the best encoding but there may be other versions +** of this collation function (for other text encodings) available. Use one +** of these instead if they exist. Avoid a UTF-8 <-> UTF-16 conversion if +** possible. +*/ +static int synthCollSeq(sqlite3 *db, CollSeq *pColl){ + CollSeq *pColl2; + char *z = pColl->zName; + int i; + static const u8 aEnc[] = { SQLITE_UTF16BE, SQLITE_UTF16LE, SQLITE_UTF8 }; + for(i=0; i<3; i++){ + pColl2 = sqlite3FindCollSeq(db, aEnc[i], z, 0); + if( pColl2->xCmp!=0 ){ + memcpy(pColl, pColl2, sizeof(CollSeq)); + pColl->xDel = 0; /* Do not copy the destructor */ + return SQLITE_OK; + } + } + return SQLITE_ERROR; +} + +/* +** This function is responsible for invoking the collation factory callback +** or substituting a collation sequence of a different encoding when the +** requested collation sequence is not available in the desired encoding. +** +** If it is not NULL, then pColl must point to the database native encoding +** collation sequence with name zName, length nName. +** +** The return value is either the collation sequence to be used in database +** db for collation type name zName, length nName, or NULL, if no collation +** sequence can be found. If no collation is found, leave an error message. +** +** See also: sqlite3LocateCollSeq(), sqlite3FindCollSeq() +*/ +SQLITE_PRIVATE CollSeq *sqlite3GetCollSeq( + Parse *pParse, /* Parsing context */ + u8 enc, /* The desired encoding for the collating sequence */ + CollSeq *pColl, /* Collating sequence with native encoding, or NULL */ + const char *zName /* Collating sequence name */ +){ + CollSeq *p; + sqlite3 *db = pParse->db; + + p = pColl; + if( !p ){ + p = sqlite3FindCollSeq(db, enc, zName, 0); + } + if( !p || !p->xCmp ){ + /* No collation sequence of this type for this encoding is registered. + ** Call the collation factory to see if it can supply us with one. + */ + callCollNeeded(db, enc, zName); + p = sqlite3FindCollSeq(db, enc, zName, 0); + } + if( p && !p->xCmp && synthCollSeq(db, p) ){ + p = 0; + } + assert( !p || p->xCmp ); + if( p==0 ){ + sqlite3ErrorMsg(pParse, "no such collation sequence: %s", zName); + } + return p; +} + +/* +** This routine is called on a collation sequence before it is used to +** check that it is defined. An undefined collation sequence exists when +** a database is loaded that contains references to collation sequences +** that have not been defined by sqlite3_create_collation() etc. +** +** If required, this routine calls the 'collation needed' callback to +** request a definition of the collating sequence. If this doesn't work, +** an equivalent collating sequence that uses a text encoding different +** from the main database is substituted, if one is available. +*/ +SQLITE_PRIVATE int sqlite3CheckCollSeq(Parse *pParse, CollSeq *pColl){ + if( pColl ){ + const char *zName = pColl->zName; + sqlite3 *db = pParse->db; + CollSeq *p = sqlite3GetCollSeq(pParse, ENC(db), pColl, zName); + if( !p ){ + return SQLITE_ERROR; + } + assert( p==pColl ); + } + return SQLITE_OK; +} + + + +/* +** Locate and return an entry from the db.aCollSeq hash table. If the entry +** specified by zName and nName is not found and parameter 'create' is +** true, then create a new entry. Otherwise return NULL. +** +** Each pointer stored in the sqlite3.aCollSeq hash table contains an +** array of three CollSeq structures. The first is the collation sequence +** preferred for UTF-8, the second UTF-16le, and the third UTF-16be. +** +** Stored immediately after the three collation sequences is a copy of +** the collation sequence name. A pointer to this string is stored in +** each collation sequence structure. +*/ +static CollSeq *findCollSeqEntry( + sqlite3 *db, /* Database connection */ + const char *zName, /* Name of the collating sequence */ + int create /* Create a new entry if true */ +){ + CollSeq *pColl; + pColl = sqlite3HashFind(&db->aCollSeq, zName); + + if( 0==pColl && create ){ + int nName = sqlite3Strlen30(zName); + pColl = sqlite3DbMallocZero(db, 3*sizeof(*pColl) + nName + 1); + if( pColl ){ + CollSeq *pDel = 0; + pColl[0].zName = (char*)&pColl[3]; + pColl[0].enc = SQLITE_UTF8; + pColl[1].zName = (char*)&pColl[3]; + pColl[1].enc = SQLITE_UTF16LE; + pColl[2].zName = (char*)&pColl[3]; + pColl[2].enc = SQLITE_UTF16BE; + memcpy(pColl[0].zName, zName, nName); + pColl[0].zName[nName] = 0; + pDel = sqlite3HashInsert(&db->aCollSeq, pColl[0].zName, pColl); + + /* If a malloc() failure occurred in sqlite3HashInsert(), it will + ** return the pColl pointer to be deleted (because it wasn't added + ** to the hash table). + */ + assert( pDel==0 || pDel==pColl ); + if( pDel!=0 ){ + sqlite3OomFault(db); + sqlite3DbFree(db, pDel); + pColl = 0; + } + } + } + return pColl; +} + +/* +** Parameter zName points to a UTF-8 encoded string nName bytes long. +** Return the CollSeq* pointer for the collation sequence named zName +** for the encoding 'enc' from the database 'db'. +** +** If the entry specified is not found and 'create' is true, then create a +** new entry. Otherwise return NULL. +** +** A separate function sqlite3LocateCollSeq() is a wrapper around +** this routine. sqlite3LocateCollSeq() invokes the collation factory +** if necessary and generates an error message if the collating sequence +** cannot be found. +** +** See also: sqlite3LocateCollSeq(), sqlite3GetCollSeq() +*/ +SQLITE_PRIVATE CollSeq *sqlite3FindCollSeq( + sqlite3 *db, + u8 enc, + const char *zName, + int create +){ + CollSeq *pColl; + if( zName ){ + pColl = findCollSeqEntry(db, zName, create); + }else{ + pColl = db->pDfltColl; + } + assert( SQLITE_UTF8==1 && SQLITE_UTF16LE==2 && SQLITE_UTF16BE==3 ); + assert( enc>=SQLITE_UTF8 && enc<=SQLITE_UTF16BE ); + if( pColl ) pColl += enc-1; + return pColl; +} + +/* During the search for the best function definition, this procedure +** is called to test how well the function passed as the first argument +** matches the request for a function with nArg arguments in a system +** that uses encoding enc. The value returned indicates how well the +** request is matched. A higher value indicates a better match. +** +** If nArg is -1 that means to only return a match (non-zero) if p->nArg +** is also -1. In other words, we are searching for a function that +** takes a variable number of arguments. +** +** If nArg is -2 that means that we are searching for any function +** regardless of the number of arguments it uses, so return a positive +** match score for any +** +** The returned value is always between 0 and 6, as follows: +** +** 0: Not a match. +** 1: UTF8/16 conversion required and function takes any number of arguments. +** 2: UTF16 byte order change required and function takes any number of args. +** 3: encoding matches and function takes any number of arguments +** 4: UTF8/16 conversion required - argument count matches exactly +** 5: UTF16 byte order conversion required - argument count matches exactly +** 6: Perfect match: encoding and argument count match exactly. +** +** If nArg==(-2) then any function with a non-null xSFunc is +** a perfect match and any function with xSFunc NULL is +** a non-match. +*/ +#define FUNC_PERFECT_MATCH 6 /* The score for a perfect match */ +static int matchQuality( + FuncDef *p, /* The function we are evaluating for match quality */ + int nArg, /* Desired number of arguments. (-1)==any */ + u8 enc /* Desired text encoding */ +){ + int match; + + /* nArg of -2 is a special case */ + if( nArg==(-2) ) return (p->xSFunc==0) ? 0 : FUNC_PERFECT_MATCH; + + /* Wrong number of arguments means "no match" */ + if( p->nArg!=nArg && p->nArg>=0 ) return 0; + + /* Give a better score to a function with a specific number of arguments + ** than to function that accepts any number of arguments. */ + if( p->nArg==nArg ){ + match = 4; + }else{ + match = 1; + } + + /* Bonus points if the text encoding matches */ + if( enc==(p->funcFlags & SQLITE_FUNC_ENCMASK) ){ + match += 2; /* Exact encoding match */ + }else if( (enc & p->funcFlags & 2)!=0 ){ + match += 1; /* Both are UTF16, but with different byte orders */ + } + + return match; +} + +/* +** Search a FuncDefHash for a function with the given name. Return +** a pointer to the matching FuncDef if found, or 0 if there is no match. +*/ +static FuncDef *functionSearch( + int h, /* Hash of the name */ + const char *zFunc /* Name of function */ +){ + FuncDef *p; + for(p=sqlite3BuiltinFunctions.a[h]; p; p=p->u.pHash){ + if( sqlite3StrICmp(p->zName, zFunc)==0 ){ + return p; + } + } + return 0; +} + +/* +** Insert a new FuncDef into a FuncDefHash hash table. +*/ +SQLITE_PRIVATE void sqlite3InsertBuiltinFuncs( + FuncDef *aDef, /* List of global functions to be inserted */ + int nDef /* Length of the apDef[] list */ +){ + int i; + for(i=0; ipNext!=&aDef[i] ); + aDef[i].pNext = pOther->pNext; + pOther->pNext = &aDef[i]; + }else{ + aDef[i].pNext = 0; + aDef[i].u.pHash = sqlite3BuiltinFunctions.a[h]; + sqlite3BuiltinFunctions.a[h] = &aDef[i]; + } + } +} + + + +/* +** Locate a user function given a name, a number of arguments and a flag +** indicating whether the function prefers UTF-16 over UTF-8. Return a +** pointer to the FuncDef structure that defines that function, or return +** NULL if the function does not exist. +** +** If the createFlag argument is true, then a new (blank) FuncDef +** structure is created and liked into the "db" structure if a +** no matching function previously existed. +** +** If nArg is -2, then the first valid function found is returned. A +** function is valid if xSFunc is non-zero. The nArg==(-2) +** case is used to see if zName is a valid function name for some number +** of arguments. If nArg is -2, then createFlag must be 0. +** +** If createFlag is false, then a function with the required name and +** number of arguments may be returned even if the eTextRep flag does not +** match that requested. +*/ +SQLITE_PRIVATE FuncDef *sqlite3FindFunction( + sqlite3 *db, /* An open database */ + const char *zName, /* Name of the function. zero-terminated */ + int nArg, /* Number of arguments. -1 means any number */ + u8 enc, /* Preferred text encoding */ + u8 createFlag /* Create new entry if true and does not otherwise exist */ +){ + FuncDef *p; /* Iterator variable */ + FuncDef *pBest = 0; /* Best match found so far */ + int bestScore = 0; /* Score of best match */ + int h; /* Hash value */ + int nName; /* Length of the name */ + + assert( nArg>=(-2) ); + assert( nArg>=(-1) || createFlag==0 ); + nName = sqlite3Strlen30(zName); + + /* First search for a match amongst the application-defined functions. + */ + p = (FuncDef*)sqlite3HashFind(&db->aFunc, zName); + while( p ){ + int score = matchQuality(p, nArg, enc); + if( score>bestScore ){ + pBest = p; + bestScore = score; + } + p = p->pNext; + } + + /* If no match is found, search the built-in functions. + ** + ** If the SQLITE_PreferBuiltin flag is set, then search the built-in + ** functions even if a prior app-defined function was found. And give + ** priority to built-in functions. + ** + ** Except, if createFlag is true, that means that we are trying to + ** install a new function. Whatever FuncDef structure is returned it will + ** have fields overwritten with new information appropriate for the + ** new function. But the FuncDefs for built-in functions are read-only. + ** So we must not search for built-ins when creating a new function. + */ + if( !createFlag && (pBest==0 || (db->flags & SQLITE_PreferBuiltin)!=0) ){ + bestScore = 0; + h = (sqlite3UpperToLower[(u8)zName[0]] + nName) % SQLITE_FUNC_HASH_SZ; + p = functionSearch(h, zName); + while( p ){ + int score = matchQuality(p, nArg, enc); + if( score>bestScore ){ + pBest = p; + bestScore = score; + } + p = p->pNext; + } + } + + /* If the createFlag parameter is true and the search did not reveal an + ** exact match for the name, number of arguments and encoding, then add a + ** new entry to the hash table and return it. + */ + if( createFlag && bestScorezName = (const char*)&pBest[1]; + pBest->nArg = (u16)nArg; + pBest->funcFlags = enc; + memcpy((char*)&pBest[1], zName, nName+1); + pOther = (FuncDef*)sqlite3HashInsert(&db->aFunc, pBest->zName, pBest); + if( pOther==pBest ){ + sqlite3DbFree(db, pBest); + sqlite3OomFault(db); + return 0; + }else{ + pBest->pNext = pOther; + } + } + + if( pBest && (pBest->xSFunc || createFlag) ){ + return pBest; + } + return 0; +} + +/* +** Free all resources held by the schema structure. The void* argument points +** at a Schema struct. This function does not call sqlite3DbFree(db, ) on the +** pointer itself, it just cleans up subsidiary resources (i.e. the contents +** of the schema hash tables). +** +** The Schema.cache_size variable is not cleared. +*/ +SQLITE_PRIVATE void sqlite3SchemaClear(void *p){ + Hash temp1; + Hash temp2; + HashElem *pElem; + Schema *pSchema = (Schema *)p; + + temp1 = pSchema->tblHash; + temp2 = pSchema->trigHash; + sqlite3HashInit(&pSchema->trigHash); + sqlite3HashClear(&pSchema->idxHash); + for(pElem=sqliteHashFirst(&temp2); pElem; pElem=sqliteHashNext(pElem)){ + sqlite3DeleteTrigger(0, (Trigger*)sqliteHashData(pElem)); + } + sqlite3HashClear(&temp2); + sqlite3HashInit(&pSchema->tblHash); + for(pElem=sqliteHashFirst(&temp1); pElem; pElem=sqliteHashNext(pElem)){ + Table *pTab = sqliteHashData(pElem); + sqlite3DeleteTable(0, pTab); + } + sqlite3HashClear(&temp1); + sqlite3HashClear(&pSchema->fkeyHash); + pSchema->pSeqTab = 0; + if( pSchema->schemaFlags & DB_SchemaLoaded ){ + pSchema->iGeneration++; + pSchema->schemaFlags &= ~DB_SchemaLoaded; + } +} + +/* +** Find and return the schema associated with a BTree. Create +** a new one if necessary. +*/ +SQLITE_PRIVATE Schema *sqlite3SchemaGet(sqlite3 *db, Btree *pBt){ + Schema * p; + if( pBt ){ + p = (Schema *)sqlite3BtreeSchema(pBt, sizeof(Schema), sqlite3SchemaClear); + }else{ + p = (Schema *)sqlite3DbMallocZero(0, sizeof(Schema)); + } + if( !p ){ + sqlite3OomFault(db); + }else if ( 0==p->file_format ){ + sqlite3HashInit(&p->tblHash); + sqlite3HashInit(&p->idxHash); + sqlite3HashInit(&p->trigHash); + sqlite3HashInit(&p->fkeyHash); + p->enc = SQLITE_UTF8; + } + return p; +} + +/************** End of callback.c ********************************************/ +/************** Begin file delete.c ******************************************/ +/* +** 2001 September 15 +** +** 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 C code routines that are called by the parser +** in order to generate code for DELETE FROM statements. +*/ +/* #include "sqliteInt.h" */ + +/* +** While a SrcList can in general represent multiple tables and subqueries +** (as in the FROM clause of a SELECT statement) in this case it contains +** the name of a single table, as one might find in an INSERT, DELETE, +** or UPDATE statement. Look up that table in the symbol table and +** return a pointer. Set an error message and return NULL if the table +** name is not found or if any other error occurs. +** +** The following fields are initialized appropriate in pSrc: +** +** pSrc->a[0].pTab Pointer to the Table object +** pSrc->a[0].pIndex Pointer to the INDEXED BY index, if there is one +** +*/ +SQLITE_PRIVATE Table *sqlite3SrcListLookup(Parse *pParse, SrcList *pSrc){ + struct SrcList_item *pItem = pSrc->a; + Table *pTab; + assert( pItem && pSrc->nSrc==1 ); + pTab = sqlite3LocateTableItem(pParse, 0, pItem); + sqlite3DeleteTable(pParse->db, pItem->pTab); + pItem->pTab = pTab; + if( pTab ){ + pTab->nRef++; + } + if( sqlite3IndexedByLookup(pParse, pItem) ){ + pTab = 0; + } + return pTab; +} + +/* +** Check to make sure the given table is writable. If it is not +** writable, generate an error message and return 1. If it is +** writable return 0; +*/ +SQLITE_PRIVATE int sqlite3IsReadOnly(Parse *pParse, Table *pTab, int viewOk){ + /* A table is not writable under the following circumstances: + ** + ** 1) It is a virtual table and no implementation of the xUpdate method + ** has been provided, or + ** 2) It is a system table (i.e. sqlite_master), this call is not + ** part of a nested parse and writable_schema pragma has not + ** been specified. + ** + ** In either case leave an error message in pParse and return non-zero. + */ + if( ( IsVirtual(pTab) + && sqlite3GetVTable(pParse->db, pTab)->pMod->pModule->xUpdate==0 ) + || ( (pTab->tabFlags & TF_Readonly)!=0 + && (pParse->db->flags & SQLITE_WriteSchema)==0 + && pParse->nested==0 ) + ){ + sqlite3ErrorMsg(pParse, "table %s may not be modified", pTab->zName); + return 1; + } + +#ifndef SQLITE_OMIT_VIEW + if( !viewOk && pTab->pSelect ){ + sqlite3ErrorMsg(pParse,"cannot modify %s because it is a view",pTab->zName); + return 1; + } +#endif + return 0; +} + + +#if !defined(SQLITE_OMIT_VIEW) && !defined(SQLITE_OMIT_TRIGGER) +/* +** Evaluate a view and store its result in an ephemeral table. The +** pWhere argument is an optional WHERE clause that restricts the +** set of rows in the view that are to be added to the ephemeral table. +*/ +SQLITE_PRIVATE void sqlite3MaterializeView( + Parse *pParse, /* Parsing context */ + Table *pView, /* View definition */ + Expr *pWhere, /* Optional WHERE clause to be added */ + int iCur /* Cursor number for ephemeral table */ +){ + SelectDest dest; + Select *pSel; + SrcList *pFrom; + sqlite3 *db = pParse->db; + int iDb = sqlite3SchemaToIndex(db, pView->pSchema); + pWhere = sqlite3ExprDup(db, pWhere, 0); + pFrom = sqlite3SrcListAppend(db, 0, 0, 0); + if( pFrom ){ + assert( pFrom->nSrc==1 ); + pFrom->a[0].zName = sqlite3DbStrDup(db, pView->zName); + pFrom->a[0].zDatabase = sqlite3DbStrDup(db, db->aDb[iDb].zDbSName); + assert( pFrom->a[0].pOn==0 ); + assert( pFrom->a[0].pUsing==0 ); + } + pSel = sqlite3SelectNew(pParse, 0, pFrom, pWhere, 0, 0, 0, + SF_IncludeHidden, 0, 0); + sqlite3SelectDestInit(&dest, SRT_EphemTab, iCur); + sqlite3Select(pParse, pSel, &dest); + sqlite3SelectDelete(db, pSel); +} +#endif /* !defined(SQLITE_OMIT_VIEW) && !defined(SQLITE_OMIT_TRIGGER) */ + +#if defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) && !defined(SQLITE_OMIT_SUBQUERY) +/* +** Generate an expression tree to implement the WHERE, ORDER BY, +** and LIMIT/OFFSET portion of DELETE and UPDATE statements. +** +** DELETE FROM table_wxyz WHERE a<5 ORDER BY a LIMIT 1; +** \__________________________/ +** pLimitWhere (pInClause) +*/ +SQLITE_PRIVATE Expr *sqlite3LimitWhere( + Parse *pParse, /* The parser context */ + SrcList *pSrc, /* the FROM clause -- which tables to scan */ + Expr *pWhere, /* The WHERE clause. May be null */ + ExprList *pOrderBy, /* The ORDER BY clause. May be null */ + Expr *pLimit, /* The LIMIT clause. May be null */ + Expr *pOffset, /* The OFFSET clause. May be null */ + char *zStmtType /* Either DELETE or UPDATE. For err msgs. */ +){ + Expr *pWhereRowid = NULL; /* WHERE rowid .. */ + Expr *pInClause = NULL; /* WHERE rowid IN ( select ) */ + Expr *pSelectRowid = NULL; /* SELECT rowid ... */ + ExprList *pEList = NULL; /* Expression list contaning only pSelectRowid */ + SrcList *pSelectSrc = NULL; /* SELECT rowid FROM x ... (dup of pSrc) */ + Select *pSelect = NULL; /* Complete SELECT tree */ + + /* Check that there isn't an ORDER BY without a LIMIT clause. + */ + if( pOrderBy && (pLimit == 0) ) { + sqlite3ErrorMsg(pParse, "ORDER BY without LIMIT on %s", zStmtType); + goto limit_where_cleanup; + } + + /* We only need to generate a select expression if there + ** is a limit/offset term to enforce. + */ + if( pLimit == 0 ) { + /* if pLimit is null, pOffset will always be null as well. */ + assert( pOffset == 0 ); + return pWhere; + } + + /* Generate a select expression tree to enforce the limit/offset + ** term for the DELETE or UPDATE statement. For example: + ** DELETE FROM table_a WHERE col1=1 ORDER BY col2 LIMIT 1 OFFSET 1 + ** becomes: + ** DELETE FROM table_a WHERE rowid IN ( + ** SELECT rowid FROM table_a WHERE col1=1 ORDER BY col2 LIMIT 1 OFFSET 1 + ** ); + */ + + pSelectRowid = sqlite3PExpr(pParse, TK_ROW, 0, 0, 0); + if( pSelectRowid == 0 ) goto limit_where_cleanup; + pEList = sqlite3ExprListAppend(pParse, 0, pSelectRowid); + if( pEList == 0 ) goto limit_where_cleanup; + + /* duplicate the FROM clause as it is needed by both the DELETE/UPDATE tree + ** and the SELECT subtree. */ + pSelectSrc = sqlite3SrcListDup(pParse->db, pSrc, 0); + if( pSelectSrc == 0 ) { + sqlite3ExprListDelete(pParse->db, pEList); + goto limit_where_cleanup; + } + + /* generate the SELECT expression tree. */ + pSelect = sqlite3SelectNew(pParse,pEList,pSelectSrc,pWhere,0,0, + pOrderBy,0,pLimit,pOffset); + if( pSelect == 0 ) return 0; + + /* now generate the new WHERE rowid IN clause for the DELETE/UDPATE */ + pWhereRowid = sqlite3PExpr(pParse, TK_ROW, 0, 0, 0); + pInClause = pWhereRowid ? sqlite3PExpr(pParse, TK_IN, pWhereRowid, 0, 0) : 0; + sqlite3PExprAddSelect(pParse, pInClause, pSelect); + return pInClause; + +limit_where_cleanup: + sqlite3ExprDelete(pParse->db, pWhere); + sqlite3ExprListDelete(pParse->db, pOrderBy); + sqlite3ExprDelete(pParse->db, pLimit); + sqlite3ExprDelete(pParse->db, pOffset); + return 0; +} +#endif /* defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) */ + /* && !defined(SQLITE_OMIT_SUBQUERY) */ + +/* +** Generate code for a DELETE FROM statement. +** +** DELETE FROM table_wxyz WHERE a<5 AND b NOT NULL; +** \________/ \________________/ +** pTabList pWhere +*/ +SQLITE_PRIVATE void sqlite3DeleteFrom( + Parse *pParse, /* The parser context */ + SrcList *pTabList, /* The table from which we should delete things */ + Expr *pWhere /* The WHERE clause. May be null */ +){ + Vdbe *v; /* The virtual database engine */ + Table *pTab; /* The table from which records will be deleted */ + int i; /* Loop counter */ + WhereInfo *pWInfo; /* Information about the WHERE clause */ + Index *pIdx; /* For looping over indices of the table */ + int iTabCur; /* Cursor number for the table */ + int iDataCur = 0; /* VDBE cursor for the canonical data source */ + int iIdxCur = 0; /* Cursor number of the first index */ + int nIdx; /* Number of indices */ + sqlite3 *db; /* Main database structure */ + AuthContext sContext; /* Authorization context */ + NameContext sNC; /* Name context to resolve expressions in */ + int iDb; /* Database number */ + int memCnt = -1; /* Memory cell used for change counting */ + int rcauth; /* Value returned by authorization callback */ + int eOnePass; /* ONEPASS_OFF or _SINGLE or _MULTI */ + int aiCurOnePass[2]; /* The write cursors opened by WHERE_ONEPASS */ + u8 *aToOpen = 0; /* Open cursor iTabCur+j if aToOpen[j] is true */ + Index *pPk; /* The PRIMARY KEY index on the table */ + int iPk = 0; /* First of nPk registers holding PRIMARY KEY value */ + i16 nPk = 1; /* Number of columns in the PRIMARY KEY */ + int iKey; /* Memory cell holding key of row to be deleted */ + i16 nKey; /* Number of memory cells in the row key */ + int iEphCur = 0; /* Ephemeral table holding all primary key values */ + int iRowSet = 0; /* Register for rowset of rows to delete */ + int addrBypass = 0; /* Address of jump over the delete logic */ + int addrLoop = 0; /* Top of the delete loop */ + int addrEphOpen = 0; /* Instruction to open the Ephemeral table */ + int bComplex; /* True if there are triggers or FKs or + ** subqueries in the WHERE clause */ + +#ifndef SQLITE_OMIT_TRIGGER + int isView; /* True if attempting to delete from a view */ + Trigger *pTrigger; /* List of table triggers, if required */ +#endif + + memset(&sContext, 0, sizeof(sContext)); + db = pParse->db; + if( pParse->nErr || db->mallocFailed ){ + goto delete_from_cleanup; + } + assert( pTabList->nSrc==1 ); + + /* Locate the table which we want to delete. This table has to be + ** put in an SrcList structure because some of the subroutines we + ** will be calling are designed to work with multiple tables and expect + ** an SrcList* parameter instead of just a Table* parameter. + */ + pTab = sqlite3SrcListLookup(pParse, pTabList); + if( pTab==0 ) goto delete_from_cleanup; + + /* Figure out if we have any triggers and if the table being + ** deleted from is a view + */ +#ifndef SQLITE_OMIT_TRIGGER + pTrigger = sqlite3TriggersExist(pParse, pTab, TK_DELETE, 0, 0); + isView = pTab->pSelect!=0; + bComplex = pTrigger || sqlite3FkRequired(pParse, pTab, 0, 0); +#else +# define pTrigger 0 +# define isView 0 +#endif +#ifdef SQLITE_OMIT_VIEW +# undef isView +# define isView 0 +#endif + + /* If pTab is really a view, make sure it has been initialized. + */ + if( sqlite3ViewGetColumnNames(pParse, pTab) ){ + goto delete_from_cleanup; + } + + if( sqlite3IsReadOnly(pParse, pTab, (pTrigger?1:0)) ){ + goto delete_from_cleanup; + } + iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + assert( iDbnDb ); + rcauth = sqlite3AuthCheck(pParse, SQLITE_DELETE, pTab->zName, 0, + db->aDb[iDb].zDbSName); + assert( rcauth==SQLITE_OK || rcauth==SQLITE_DENY || rcauth==SQLITE_IGNORE ); + if( rcauth==SQLITE_DENY ){ + goto delete_from_cleanup; + } + assert(!isView || pTrigger); + + /* Assign cursor numbers to the table and all its indices. + */ + assert( pTabList->nSrc==1 ); + iTabCur = pTabList->a[0].iCursor = pParse->nTab++; + for(nIdx=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, nIdx++){ + pParse->nTab++; + } + + /* Start the view context + */ + if( isView ){ + sqlite3AuthContextPush(pParse, &sContext, pTab->zName); + } + + /* Begin generating code. + */ + v = sqlite3GetVdbe(pParse); + if( v==0 ){ + goto delete_from_cleanup; + } + if( pParse->nested==0 ) sqlite3VdbeCountChanges(v); + sqlite3BeginWriteOperation(pParse, 1, iDb); + + /* If we are trying to delete from a view, realize that view into + ** an ephemeral table. + */ +#if !defined(SQLITE_OMIT_VIEW) && !defined(SQLITE_OMIT_TRIGGER) + if( isView ){ + sqlite3MaterializeView(pParse, pTab, pWhere, iTabCur); + iDataCur = iIdxCur = iTabCur; + } +#endif + + /* Resolve the column names in the WHERE clause. + */ + memset(&sNC, 0, sizeof(sNC)); + sNC.pParse = pParse; + sNC.pSrcList = pTabList; + if( sqlite3ResolveExprNames(&sNC, pWhere) ){ + goto delete_from_cleanup; + } + + /* Initialize the counter of the number of rows deleted, if + ** we are counting rows. + */ + if( db->flags & SQLITE_CountRows ){ + memCnt = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Integer, 0, memCnt); + } + +#ifndef SQLITE_OMIT_TRUNCATE_OPTIMIZATION + /* Special case: A DELETE without a WHERE clause deletes everything. + ** It is easier just to erase the whole table. Prior to version 3.6.5, + ** this optimization caused the row change count (the value returned by + ** API function sqlite3_count_changes) to be set incorrectly. */ + if( rcauth==SQLITE_OK + && pWhere==0 + && !bComplex + && !IsVirtual(pTab) +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + && db->xPreUpdateCallback==0 +#endif + ){ + assert( !isView ); + sqlite3TableLock(pParse, iDb, pTab->tnum, 1, pTab->zName); + if( HasRowid(pTab) ){ + sqlite3VdbeAddOp4(v, OP_Clear, pTab->tnum, iDb, memCnt, + pTab->zName, P4_STATIC); + } + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + assert( pIdx->pSchema==pTab->pSchema ); + sqlite3VdbeAddOp2(v, OP_Clear, pIdx->tnum, iDb); + } + }else +#endif /* SQLITE_OMIT_TRUNCATE_OPTIMIZATION */ + { + u16 wcf = WHERE_ONEPASS_DESIRED|WHERE_DUPLICATES_OK|WHERE_SEEK_TABLE; + if( sNC.ncFlags & NC_VarSelect ) bComplex = 1; + wcf |= (bComplex ? 0 : WHERE_ONEPASS_MULTIROW); + if( HasRowid(pTab) ){ + /* For a rowid table, initialize the RowSet to an empty set */ + pPk = 0; + nPk = 1; + iRowSet = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Null, 0, iRowSet); + }else{ + /* For a WITHOUT ROWID table, create an ephemeral table used to + ** hold all primary keys for rows to be deleted. */ + pPk = sqlite3PrimaryKeyIndex(pTab); + assert( pPk!=0 ); + nPk = pPk->nKeyCol; + iPk = pParse->nMem+1; + pParse->nMem += nPk; + iEphCur = pParse->nTab++; + addrEphOpen = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, iEphCur, nPk); + sqlite3VdbeSetP4KeyInfo(pParse, pPk); + } + + /* Construct a query to find the rowid or primary key for every row + ** to be deleted, based on the WHERE clause. Set variable eOnePass + ** to indicate the strategy used to implement this delete: + ** + ** ONEPASS_OFF: Two-pass approach - use a FIFO for rowids/PK values. + ** ONEPASS_SINGLE: One-pass approach - at most one row deleted. + ** ONEPASS_MULTI: One-pass approach - any number of rows may be deleted. + */ + pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, 0, 0, wcf, iTabCur+1); + if( pWInfo==0 ) goto delete_from_cleanup; + eOnePass = sqlite3WhereOkOnePass(pWInfo, aiCurOnePass); + assert( IsVirtual(pTab)==0 || eOnePass!=ONEPASS_MULTI ); + assert( IsVirtual(pTab) || bComplex || eOnePass!=ONEPASS_OFF ); + + /* Keep track of the number of rows to be deleted */ + if( db->flags & SQLITE_CountRows ){ + sqlite3VdbeAddOp2(v, OP_AddImm, memCnt, 1); + } + + /* Extract the rowid or primary key for the current row */ + if( pPk ){ + for(i=0; iaiColumn[i]>=0 ); + sqlite3ExprCodeGetColumnOfTable(v, pTab, iTabCur, + pPk->aiColumn[i], iPk+i); + } + iKey = iPk; + }else{ + iKey = pParse->nMem + 1; + iKey = sqlite3ExprCodeGetColumn(pParse, pTab, -1, iTabCur, iKey, 0); + if( iKey>pParse->nMem ) pParse->nMem = iKey; + } + + if( eOnePass!=ONEPASS_OFF ){ + /* For ONEPASS, no need to store the rowid/primary-key. There is only + ** one, so just keep it in its register(s) and fall through to the + ** delete code. */ + nKey = nPk; /* OP_Found will use an unpacked key */ + aToOpen = sqlite3DbMallocRawNN(db, nIdx+2); + if( aToOpen==0 ){ + sqlite3WhereEnd(pWInfo); + goto delete_from_cleanup; + } + memset(aToOpen, 1, nIdx+1); + aToOpen[nIdx+1] = 0; + if( aiCurOnePass[0]>=0 ) aToOpen[aiCurOnePass[0]-iTabCur] = 0; + if( aiCurOnePass[1]>=0 ) aToOpen[aiCurOnePass[1]-iTabCur] = 0; + if( addrEphOpen ) sqlite3VdbeChangeToNoop(v, addrEphOpen); + }else{ + if( pPk ){ + /* Add the PK key for this row to the temporary table */ + iKey = ++pParse->nMem; + nKey = 0; /* Zero tells OP_Found to use a composite key */ + sqlite3VdbeAddOp4(v, OP_MakeRecord, iPk, nPk, iKey, + sqlite3IndexAffinityStr(pParse->db, pPk), nPk); + sqlite3VdbeAddOp2(v, OP_IdxInsert, iEphCur, iKey); + }else{ + /* Add the rowid of the row to be deleted to the RowSet */ + nKey = 1; /* OP_Seek always uses a single rowid */ + sqlite3VdbeAddOp2(v, OP_RowSetAdd, iRowSet, iKey); + } + } + + /* If this DELETE cannot use the ONEPASS strategy, this is the + ** end of the WHERE loop */ + if( eOnePass!=ONEPASS_OFF ){ + addrBypass = sqlite3VdbeMakeLabel(v); + }else{ + sqlite3WhereEnd(pWInfo); + } + + /* Unless this is a view, open cursors for the table we are + ** deleting from and all its indices. If this is a view, then the + ** only effect this statement has is to fire the INSTEAD OF + ** triggers. + */ + if( !isView ){ + int iAddrOnce = 0; + if( eOnePass==ONEPASS_MULTI ){ + iAddrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); + } + testcase( IsVirtual(pTab) ); + sqlite3OpenTableAndIndices(pParse, pTab, OP_OpenWrite, OPFLAG_FORDELETE, + iTabCur, aToOpen, &iDataCur, &iIdxCur); + assert( pPk || IsVirtual(pTab) || iDataCur==iTabCur ); + assert( pPk || IsVirtual(pTab) || iIdxCur==iDataCur+1 ); + if( eOnePass==ONEPASS_MULTI ) sqlite3VdbeJumpHere(v, iAddrOnce); + } + + /* Set up a loop over the rowids/primary-keys that were found in the + ** where-clause loop above. + */ + if( eOnePass!=ONEPASS_OFF ){ + assert( nKey==nPk ); /* OP_Found will use an unpacked key */ + if( !IsVirtual(pTab) && aToOpen[iDataCur-iTabCur] ){ + assert( pPk!=0 || pTab->pSelect!=0 ); + sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, addrBypass, iKey, nKey); + VdbeCoverage(v); + } + }else if( pPk ){ + addrLoop = sqlite3VdbeAddOp1(v, OP_Rewind, iEphCur); VdbeCoverage(v); + sqlite3VdbeAddOp2(v, OP_RowKey, iEphCur, iKey); + assert( nKey==0 ); /* OP_Found will use a composite key */ + }else{ + addrLoop = sqlite3VdbeAddOp3(v, OP_RowSetRead, iRowSet, 0, iKey); + VdbeCoverage(v); + assert( nKey==1 ); + } + + /* Delete the row */ +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( IsVirtual(pTab) ){ + const char *pVTab = (const char *)sqlite3GetVTable(db, pTab); + sqlite3VtabMakeWritable(pParse, pTab); + sqlite3VdbeAddOp4(v, OP_VUpdate, 0, 1, iKey, pVTab, P4_VTAB); + sqlite3VdbeChangeP5(v, OE_Abort); + assert( eOnePass==ONEPASS_OFF || eOnePass==ONEPASS_SINGLE ); + sqlite3MayAbort(pParse); + if( eOnePass==ONEPASS_SINGLE && sqlite3IsToplevel(pParse) ){ + pParse->isMultiWrite = 0; + } + }else +#endif + { + int count = (pParse->nested==0); /* True to count changes */ + int iIdxNoSeek = -1; + if( bComplex==0 && aiCurOnePass[1]!=iDataCur ){ + iIdxNoSeek = aiCurOnePass[1]; + } + sqlite3GenerateRowDelete(pParse, pTab, pTrigger, iDataCur, iIdxCur, + iKey, nKey, count, OE_Default, eOnePass, iIdxNoSeek); + } + + /* End of the loop over all rowids/primary-keys. */ + if( eOnePass!=ONEPASS_OFF ){ + sqlite3VdbeResolveLabel(v, addrBypass); + sqlite3WhereEnd(pWInfo); + }else if( pPk ){ + sqlite3VdbeAddOp2(v, OP_Next, iEphCur, addrLoop+1); VdbeCoverage(v); + sqlite3VdbeJumpHere(v, addrLoop); + }else{ + sqlite3VdbeGoto(v, addrLoop); + sqlite3VdbeJumpHere(v, addrLoop); + } + + /* Close the cursors open on the table and its indexes. */ + if( !isView && !IsVirtual(pTab) ){ + if( !pPk ) sqlite3VdbeAddOp1(v, OP_Close, iDataCur); + for(i=0, pIdx=pTab->pIndex; pIdx; i++, pIdx=pIdx->pNext){ + sqlite3VdbeAddOp1(v, OP_Close, iIdxCur + i); + } + } + } /* End non-truncate path */ + + /* Update the sqlite_sequence table by storing the content of the + ** maximum rowid counter values recorded while inserting into + ** autoincrement tables. + */ + if( pParse->nested==0 && pParse->pTriggerTab==0 ){ + sqlite3AutoincrementEnd(pParse); + } + + /* Return the number of rows that were deleted. If this routine is + ** generating code because of a call to sqlite3NestedParse(), do not + ** invoke the callback function. + */ + if( (db->flags&SQLITE_CountRows) && !pParse->nested && !pParse->pTriggerTab ){ + sqlite3VdbeAddOp2(v, OP_ResultRow, memCnt, 1); + sqlite3VdbeSetNumCols(v, 1); + sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "rows deleted", SQLITE_STATIC); + } + +delete_from_cleanup: + sqlite3AuthContextPop(&sContext); + sqlite3SrcListDelete(db, pTabList); + sqlite3ExprDelete(db, pWhere); + sqlite3DbFree(db, aToOpen); + return; +} +/* Make sure "isView" and other macros defined above are undefined. Otherwise +** they may interfere with compilation of other functions in this file +** (or in another file, if this file becomes part of the amalgamation). */ +#ifdef isView + #undef isView +#endif +#ifdef pTrigger + #undef pTrigger +#endif + +/* +** This routine generates VDBE code that causes a single row of a +** single table to be deleted. Both the original table entry and +** all indices are removed. +** +** Preconditions: +** +** 1. iDataCur is an open cursor on the btree that is the canonical data +** store for the table. (This will be either the table itself, +** in the case of a rowid table, or the PRIMARY KEY index in the case +** of a WITHOUT ROWID table.) +** +** 2. Read/write cursors for all indices of pTab must be open as +** cursor number iIdxCur+i for the i-th index. +** +** 3. The primary key for the row to be deleted must be stored in a +** sequence of nPk memory cells starting at iPk. If nPk==0 that means +** that a search record formed from OP_MakeRecord is contained in the +** single memory location iPk. +** +** eMode: +** Parameter eMode may be passed either ONEPASS_OFF (0), ONEPASS_SINGLE, or +** ONEPASS_MULTI. If eMode is not ONEPASS_OFF, then the cursor +** iDataCur already points to the row to delete. If eMode is ONEPASS_OFF +** then this function must seek iDataCur to the entry identified by iPk +** and nPk before reading from it. +** +** If eMode is ONEPASS_MULTI, then this call is being made as part +** of a ONEPASS delete that affects multiple rows. In this case, if +** iIdxNoSeek is a valid cursor number (>=0), then its position should +** be preserved following the delete operation. Or, if iIdxNoSeek is not +** a valid cursor number, the position of iDataCur should be preserved +** instead. +** +** iIdxNoSeek: +** If iIdxNoSeek is a valid cursor number (>=0), then it identifies an +** index cursor (from within array of cursors starting at iIdxCur) that +** already points to the index entry to be deleted. +*/ +SQLITE_PRIVATE void sqlite3GenerateRowDelete( + Parse *pParse, /* Parsing context */ + Table *pTab, /* Table containing the row to be deleted */ + Trigger *pTrigger, /* List of triggers to (potentially) fire */ + int iDataCur, /* Cursor from which column data is extracted */ + int iIdxCur, /* First index cursor */ + int iPk, /* First memory cell containing the PRIMARY KEY */ + i16 nPk, /* Number of PRIMARY KEY memory cells */ + u8 count, /* If non-zero, increment the row change counter */ + u8 onconf, /* Default ON CONFLICT policy for triggers */ + u8 eMode, /* ONEPASS_OFF, _SINGLE, or _MULTI. See above */ + int iIdxNoSeek /* Cursor number of cursor that does not need seeking */ +){ + Vdbe *v = pParse->pVdbe; /* Vdbe */ + int iOld = 0; /* First register in OLD.* array */ + int iLabel; /* Label resolved to end of generated code */ + u8 opSeek; /* Seek opcode */ + + /* Vdbe is guaranteed to have been allocated by this stage. */ + assert( v ); + VdbeModuleComment((v, "BEGIN: GenRowDel(%d,%d,%d,%d)", + iDataCur, iIdxCur, iPk, (int)nPk)); + + /* Seek cursor iCur to the row to delete. If this row no longer exists + ** (this can happen if a trigger program has already deleted it), do + ** not attempt to delete it or fire any DELETE triggers. */ + iLabel = sqlite3VdbeMakeLabel(v); + opSeek = HasRowid(pTab) ? OP_NotExists : OP_NotFound; + if( eMode==ONEPASS_OFF ){ + sqlite3VdbeAddOp4Int(v, opSeek, iDataCur, iLabel, iPk, nPk); + VdbeCoverageIf(v, opSeek==OP_NotExists); + VdbeCoverageIf(v, opSeek==OP_NotFound); + } + + /* If there are any triggers to fire, allocate a range of registers to + ** use for the old.* references in the triggers. */ + if( sqlite3FkRequired(pParse, pTab, 0, 0) || pTrigger ){ + u32 mask; /* Mask of OLD.* columns in use */ + int iCol; /* Iterator used while populating OLD.* */ + int addrStart; /* Start of BEFORE trigger programs */ + + /* TODO: Could use temporary registers here. Also could attempt to + ** avoid copying the contents of the rowid register. */ + 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); + + /* Populate the OLD.* pseudo-table register array. These values will be + ** used by any BEFORE and AFTER triggers that exist. */ + sqlite3VdbeAddOp2(v, OP_Copy, iPk, iOld); + for(iCol=0; iColnCol; iCol++){ + testcase( mask!=0xffffffff && iCol==31 ); + testcase( mask!=0xffffffff && iCol==32 ); + if( mask==0xffffffff || (iCol<=31 && (mask & MASKBIT32(iCol))!=0) ){ + sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, iCol, iOld+iCol+1); + } + } + + /* Invoke BEFORE DELETE trigger programs. */ + addrStart = sqlite3VdbeCurrentAddr(v); + sqlite3CodeRowTrigger(pParse, pTrigger, + TK_DELETE, 0, TRIGGER_BEFORE, pTab, iOld, onconf, iLabel + ); + + /* If any BEFORE triggers were coded, then seek the cursor to the + ** row to be deleted again. It may be that the BEFORE triggers moved + ** the cursor or of already deleted the row that the cursor was + ** pointing to. + */ + if( addrStartpSelect==0 ){ + u8 p5 = 0; + sqlite3GenerateRowIndexDelete(pParse, pTab, iDataCur, iIdxCur,0,iIdxNoSeek); + sqlite3VdbeAddOp2(v, OP_Delete, iDataCur, (count?OPFLAG_NCHANGE:0)); + sqlite3VdbeChangeP4(v, -1, (char*)pTab, P4_TABLE); + if( eMode!=ONEPASS_OFF ){ + sqlite3VdbeChangeP5(v, OPFLAG_AUXDELETE); + } + if( iIdxNoSeek>=0 ){ + sqlite3VdbeAddOp1(v, OP_Delete, iIdxNoSeek); + } + if( eMode==ONEPASS_MULTI ) p5 |= OPFLAG_SAVEPOSITION; + sqlite3VdbeChangeP5(v, p5); + } + + /* Do any ON CASCADE, SET NULL or SET DEFAULT operations required to + ** handle rows (possibly in other tables) that refer via a foreign key + ** to the row just deleted. */ + sqlite3FkActions(pParse, pTab, 0, iOld, 0, 0); + + /* Invoke AFTER DELETE trigger programs. */ + sqlite3CodeRowTrigger(pParse, pTrigger, + TK_DELETE, 0, TRIGGER_AFTER, pTab, iOld, onconf, iLabel + ); + + /* Jump here if the row had already been deleted before any BEFORE + ** trigger programs were invoked. Or if a trigger program throws a + ** RAISE(IGNORE) exception. */ + sqlite3VdbeResolveLabel(v, iLabel); + VdbeModuleComment((v, "END: GenRowDel()")); +} + +/* +** This routine generates VDBE code that causes the deletion of all +** index entries associated with a single row of a single table, pTab +** +** Preconditions: +** +** 1. A read/write cursor "iDataCur" must be open on the canonical storage +** btree for the table pTab. (This will be either the table itself +** for rowid tables or to the primary key index for WITHOUT ROWID +** tables.) +** +** 2. Read/write cursors for all indices of pTab must be open as +** cursor number iIdxCur+i for the i-th index. (The pTab->pIndex +** index is the 0-th index.) +** +** 3. The "iDataCur" cursor must be already be positioned on the row +** that is to be deleted. +*/ +SQLITE_PRIVATE void sqlite3GenerateRowIndexDelete( + Parse *pParse, /* Parsing and code generating context */ + Table *pTab, /* Table containing the row to be deleted */ + int iDataCur, /* Cursor of table holding data. */ + int iIdxCur, /* First index cursor */ + int *aRegIdx, /* Only delete if aRegIdx!=0 && aRegIdx[i]>0 */ + int iIdxNoSeek /* Do not delete from this cursor */ +){ + int i; /* Index loop counter */ + int r1 = -1; /* Register holding an index key */ + int iPartIdxLabel; /* Jump destination for skipping partial index entries */ + Index *pIdx; /* Current index */ + Index *pPrior = 0; /* Prior index */ + Vdbe *v; /* The prepared statement under construction */ + Index *pPk; /* PRIMARY KEY index, or NULL for rowid tables */ + + v = pParse->pVdbe; + pPk = HasRowid(pTab) ? 0 : sqlite3PrimaryKeyIndex(pTab); + for(i=0, pIdx=pTab->pIndex; pIdx; i++, pIdx=pIdx->pNext){ + assert( iIdxCur+i!=iDataCur || pPk==pIdx ); + if( aRegIdx!=0 && aRegIdx[i]==0 ) continue; + if( pIdx==pPk ) continue; + if( iIdxCur+i==iIdxNoSeek ) continue; + VdbeModuleComment((v, "GenRowIdxDel for %s", pIdx->zName)); + r1 = sqlite3GenerateIndexKey(pParse, pIdx, iDataCur, 0, 1, + &iPartIdxLabel, pPrior, r1); + sqlite3VdbeAddOp3(v, OP_IdxDelete, iIdxCur+i, r1, + pIdx->uniqNotNull ? pIdx->nKeyCol : pIdx->nColumn); + sqlite3ResolvePartIdxLabel(pParse, iPartIdxLabel); + pPrior = pIdx; + } +} + +/* +** Generate code that will assemble an index key and stores it in register +** regOut. The key with be for index pIdx which is an index on pTab. +** iCur is the index of a cursor open on the pTab table and pointing to +** the entry that needs indexing. If pTab is a WITHOUT ROWID table, then +** iCur must be the cursor of the PRIMARY KEY index. +** +** Return a register number which is the first in a block of +** registers that holds the elements of the index key. The +** block of registers has already been deallocated by the time +** this routine returns. +** +** If *piPartIdxLabel is not NULL, fill it in with a label and jump +** to that label if pIdx is a partial index that should be skipped. +** The label should be resolved using sqlite3ResolvePartIdxLabel(). +** A partial index should be skipped if its WHERE clause evaluates +** to false or null. If pIdx is not a partial index, *piPartIdxLabel +** will be set to zero which is an empty label that is ignored by +** sqlite3ResolvePartIdxLabel(). +** +** The pPrior and regPrior parameters are used to implement a cache to +** avoid unnecessary register loads. If pPrior is not NULL, then it is +** a pointer to a different index for which an index key has just been +** computed into register regPrior. If the current pIdx index is generating +** its key into the same sequence of registers and if pPrior and pIdx share +** a column in common, then the register corresponding to that column already +** holds the correct value and the loading of that register is skipped. +** This optimization is helpful when doing a DELETE or an INTEGRITY_CHECK +** on a table with multiple indices, and especially with the ROWID or +** PRIMARY KEY columns of the index. +*/ +SQLITE_PRIVATE int sqlite3GenerateIndexKey( + Parse *pParse, /* Parsing context */ + Index *pIdx, /* The index for which to generate a key */ + int iDataCur, /* Cursor number from which to take column data */ + int regOut, /* Put the new key into this register if not 0 */ + int prefixOnly, /* Compute only a unique prefix of the key */ + int *piPartIdxLabel, /* OUT: Jump to this label to skip partial index */ + Index *pPrior, /* Previously generated index key */ + int regPrior /* Register holding previous generated key */ +){ + Vdbe *v = pParse->pVdbe; + int j; + int regBase; + int nCol; + + if( piPartIdxLabel ){ + if( pIdx->pPartIdxWhere ){ + *piPartIdxLabel = sqlite3VdbeMakeLabel(v); + pParse->iSelfTab = iDataCur; + sqlite3ExprCachePush(pParse); + sqlite3ExprIfFalseDup(pParse, pIdx->pPartIdxWhere, *piPartIdxLabel, + SQLITE_JUMPIFNULL); + }else{ + *piPartIdxLabel = 0; + } + } + nCol = (prefixOnly && pIdx->uniqNotNull) ? pIdx->nKeyCol : pIdx->nColumn; + regBase = sqlite3GetTempRange(pParse, nCol); + if( pPrior && (regBase!=regPrior || pPrior->pPartIdxWhere) ) pPrior = 0; + for(j=0; jaiColumn[j]==pIdx->aiColumn[j] + && pPrior->aiColumn[j]!=XN_EXPR + ){ + /* This column was already computed by the previous index */ + continue; + } + sqlite3ExprCodeLoadIndexColumn(pParse, pIdx, iDataCur, j, regBase+j); + /* If the column affinity is REAL but the number is an integer, then it + ** might be stored in the table as an integer (using a compact + ** representation) then converted to REAL by an OP_RealAffinity opcode. + ** But we are getting ready to store this value back into an index, where + ** it should be converted by to INTEGER again. So omit the OP_RealAffinity + ** opcode if it is present */ + sqlite3VdbeDeletePriorOpcode(v, OP_RealAffinity); + } + if( regOut ){ + sqlite3VdbeAddOp3(v, OP_MakeRecord, regBase, nCol, regOut); + } + sqlite3ReleaseTempRange(pParse, regBase, nCol); + return regBase; +} + +/* +** If a prior call to sqlite3GenerateIndexKey() generated a jump-over label +** because it was a partial index, then this routine should be called to +** resolve that label. +*/ +SQLITE_PRIVATE void sqlite3ResolvePartIdxLabel(Parse *pParse, int iLabel){ + if( iLabel ){ + sqlite3VdbeResolveLabel(pParse->pVdbe, iLabel); + sqlite3ExprCachePop(pParse); + } +} + +/************** End of delete.c **********************************************/ +/************** Begin file func.c ********************************************/ +/* +** 2002 February 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. +** +************************************************************************* +** This file contains the C-language implementations for many of the SQL +** functions of SQLite. (Some function, and in particular the date and +** time functions, are implemented separately.) +*/ +/* #include "sqliteInt.h" */ +/* #include */ +/* #include */ +/* #include "vdbeInt.h" */ + +/* +** Return the collating function associated with a function. +*/ +static CollSeq *sqlite3GetFuncCollSeq(sqlite3_context *context){ + VdbeOp *pOp; + assert( context->pVdbe!=0 ); + pOp = &context->pVdbe->aOp[context->iOp-1]; + assert( pOp->opcode==OP_CollSeq ); + assert( pOp->p4type==P4_COLLSEQ ); + return pOp->p4.pColl; +} + +/* +** Indicate that the accumulator load should be skipped on this +** iteration of the aggregate loop. +*/ +static void sqlite3SkipAccumulatorLoad(sqlite3_context *context){ + context->skipFlag = 1; +} + +/* +** Implementation of the non-aggregate min() and max() functions +*/ +static void minmaxFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + int i; + int mask; /* 0 for min() or 0xffffffff for max() */ + int iBest; + CollSeq *pColl; + + assert( argc>1 ); + mask = sqlite3_user_data(context)==0 ? 0 : -1; + pColl = sqlite3GetFuncCollSeq(context); + assert( pColl ); + assert( mask==-1 || mask==0 ); + iBest = 0; + if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return; + for(i=1; i=0 ){ + testcase( mask==0 ); + iBest = i; + } + } + sqlite3_result_value(context, argv[iBest]); +} + +/* +** Return the type of the argument. +*/ +static void typeofFunc( + sqlite3_context *context, + int NotUsed, + sqlite3_value **argv +){ + const char *z = 0; + UNUSED_PARAMETER(NotUsed); + switch( sqlite3_value_type(argv[0]) ){ + case SQLITE_INTEGER: z = "integer"; break; + case SQLITE_TEXT: z = "text"; break; + case SQLITE_FLOAT: z = "real"; break; + case SQLITE_BLOB: z = "blob"; break; + default: z = "null"; break; + } + sqlite3_result_text(context, z, -1, SQLITE_STATIC); +} + + +/* +** Implementation of the length() function +*/ +static void lengthFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + int len; + + assert( argc==1 ); + UNUSED_PARAMETER(argc); + switch( sqlite3_value_type(argv[0]) ){ + case SQLITE_BLOB: + case SQLITE_INTEGER: + case SQLITE_FLOAT: { + sqlite3_result_int(context, sqlite3_value_bytes(argv[0])); + break; + } + case SQLITE_TEXT: { + const unsigned char *z = sqlite3_value_text(argv[0]); + if( z==0 ) return; + len = 0; + while( *z ){ + len++; + SQLITE_SKIP_UTF8(z); + } + sqlite3_result_int(context, len); + break; + } + default: { + sqlite3_result_null(context); + break; + } + } +} + +/* +** 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 ); + UNUSED_PARAMETER(argc); + switch( sqlite3_value_type(argv[0]) ){ + case SQLITE_INTEGER: { + i64 iVal = sqlite3_value_int64(argv[0]); + if( iVal<0 ){ + if( iVal==SMALLEST_INT64 ){ + /* IMP: R-31676-45509 If X is the integer -9223372036854775808 + ** 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; + } + iVal = -iVal; + } + sqlite3_result_int64(context, iVal); + 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-01992-00519 Abs(X) returns 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); + break; + } + } +} + +/* +** Implementation of the instr() function. +** +** instr(haystack,needle) finds the first occurrence of needle +** in haystack and returns the number of previous characters plus 1, +** or 0 if needle does not occur within haystack. +** +** If both haystack and needle are BLOBs, then the result is one more than +** the number of bytes in haystack prior to the first occurrence of needle, +** or 0 if needle never occurs in haystack. +*/ +static void instrFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const unsigned char *zHaystack; + const unsigned char *zNeedle; + int nHaystack; + int nNeedle; + int typeHaystack, typeNeedle; + int N = 1; + int isText; + + UNUSED_PARAMETER(argc); + typeHaystack = sqlite3_value_type(argv[0]); + typeNeedle = sqlite3_value_type(argv[1]); + if( typeHaystack==SQLITE_NULL || typeNeedle==SQLITE_NULL ) return; + nHaystack = sqlite3_value_bytes(argv[0]); + nNeedle = sqlite3_value_bytes(argv[1]); + if( typeHaystack==SQLITE_BLOB && typeNeedle==SQLITE_BLOB ){ + zHaystack = sqlite3_value_blob(argv[0]); + zNeedle = sqlite3_value_blob(argv[1]); + isText = 0; + }else{ + zHaystack = sqlite3_value_text(argv[0]); + zNeedle = sqlite3_value_text(argv[1]); + isText = 1; + if( zNeedle==0 ) return; + assert( zHaystack ); + } + while( nNeedle<=nHaystack && memcmp(zHaystack, zNeedle, nNeedle)!=0 ){ + N++; + do{ + nHaystack--; + zHaystack++; + }while( isText && (zHaystack[0]&0xc0)==0x80 ); + } + if( nNeedle>nHaystack ) N = 0; + sqlite3_result_int(context, N); +} + +/* +** Implementation of the printf() function. +*/ +static void printfFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + PrintfArguments x; + StrAccum str; + const char *zFormat; + int n; + sqlite3 *db = sqlite3_context_db_handle(context); + + if( argc>=1 && (zFormat = (const char*)sqlite3_value_text(argv[0]))!=0 ){ + x.nArg = argc-1; + x.nUsed = 0; + x.apArg = argv+1; + sqlite3StrAccumInit(&str, db, 0, 0, db->aLimit[SQLITE_LIMIT_LENGTH]); + str.printfFlags = SQLITE_PRINTF_SQLFUNC; + sqlite3XPrintf(&str, zFormat, &x); + n = str.nChar; + sqlite3_result_text(context, sqlite3StrAccumFinish(&str), n, + SQLITE_DYNAMIC); + } +} + +/* +** Implementation of the substr() function. +** +** substr(x,p1,p2) returns p2 characters of x[] beginning with p1. +** p1 is 1-indexed. So substr(x,1,1) returns the first character +** of x. If x is text, then we actually count UTF-8 characters. +** 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 preceding p1. +*/ +static void substrFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const unsigned char *z; + const unsigned char *z2; + int len; + int p0type; + i64 p1, p2; + int negP2 = 0; + + assert( argc==3 || argc==2 ); + if( sqlite3_value_type(argv[1])==SQLITE_NULL + || (argc==3 && sqlite3_value_type(argv[2])==SQLITE_NULL) + ){ + 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]); + if( z==0 ) return; + assert( len==sqlite3_value_bytes(argv[0]) ); + }else{ + z = sqlite3_value_text(argv[0]); + if( z==0 ) return; + len = 0; + if( p1<0 ){ + for(z2=z; *z2; len++){ + SQLITE_SKIP_UTF8(z2); + } + } + } +#ifdef SQLITE_SUBSTR_COMPATIBILITY + /* If SUBSTR_COMPATIBILITY is defined then substr(X,0,N) work the same as + ** as substr(X,1,N) - it returns the first N characters of X. This + ** is essentially a back-out of the bug-fix in check-in [5fc125d362df4b8] + ** from 2009-02-02 for compatibility of applications that exploited the + ** old buggy behavior. */ + if( p1==0 ) p1 = 1; /* */ +#endif + if( argc==3 ){ + p2 = sqlite3_value_int(argv[2]); + if( p2<0 ){ + p2 = -p2; + negP2 = 1; + } + }else{ + p2 = sqlite3_context_db_handle(context)->aLimit[SQLITE_LIMIT_LENGTH]; + } + if( p1<0 ){ + p1 += len; + if( p1<0 ){ + p2 += p1; + if( p2<0 ) p2 = 0; + p1 = 0; + } + }else if( p1>0 ){ + p1--; + }else if( p2>0 ){ + p2--; + } + if( negP2 ){ + p1 -= p2; + if( p1<0 ){ + p2 += p1; + p1 = 0; + } + } + assert( p1>=0 && p2>=0 ); + if( p0type!=SQLITE_BLOB ){ + while( *z && p1 ){ + SQLITE_SKIP_UTF8(z); + p1--; + } + for(z2=z; *z2 && p2; p2--){ + SQLITE_SKIP_UTF8(z2); + } + sqlite3_result_text64(context, (char*)z, z2-z, SQLITE_TRANSIENT, + SQLITE_UTF8); + }else{ + if( p1+p2>len ){ + p2 = len-p1; + if( p2<0 ) p2 = 0; + } + sqlite3_result_blob64(context, (char*)&z[p1], (u64)p2, SQLITE_TRANSIENT); + } +} + +/* +** Implementation of the round() function +*/ +#ifndef SQLITE_OMIT_FLOATING_POINT +static void roundFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ + int n = 0; + double r; + char *zBuf; + assert( argc==1 || argc==2 ); + if( argc==2 ){ + if( SQLITE_NULL==sqlite3_value_type(argv[1]) ) return; + n = sqlite3_value_int(argv[1]); + if( n>30 ) n = 30; + if( n<0 ) n = 0; + } + if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return; + r = sqlite3_value_double(argv[0]); + /* If Y==0 and X will fit in a 64-bit int, + ** handle the rounding directly, + ** otherwise use printf. + */ + if( n==0 && r>=0 && r0 ); + testcase( nByte==db->aLimit[SQLITE_LIMIT_LENGTH] ); + testcase( nByte==db->aLimit[SQLITE_LIMIT_LENGTH]+1 ); + if( nByte>db->aLimit[SQLITE_LIMIT_LENGTH] ){ + sqlite3_result_error_toobig(context); + z = 0; + }else{ + z = sqlite3Malloc(nByte); + if( !z ){ + sqlite3_result_error_nomem(context); + } + } + return z; +} + +/* +** Implementation of the upper() and lower() SQL functions. +*/ +static void upperFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ + char *z1; + const char *z2; + int i, n; + UNUSED_PARAMETER(argc); + z2 = (char*)sqlite3_value_text(argv[0]); + n = sqlite3_value_bytes(argv[0]); + /* Verify that the call to _bytes() does not invalidate the _text() pointer */ + assert( z2==(char*)sqlite3_value_text(argv[0]) ); + if( z2 ){ + z1 = contextMalloc(context, ((i64)n)+1); + if( z1 ){ + for(i=0; imatchOne; /* "?" or "_" */ + u32 matchAll = pInfo->matchAll; /* "*" or "%" */ + u8 noCase = pInfo->noCase; /* True if uppercase==lowercase */ + const u8 *zEscaped = 0; /* One past the last escaped input char */ + + while( (c = Utf8Read(zPattern))!=0 ){ + if( c==matchAll ){ /* Match "*" */ + /* Skip over multiple "*" characters in the pattern. If there + ** are also "?" characters, skip those as well, but consume a + ** single character of the input string for each "?" skipped */ + while( (c=Utf8Read(zPattern)) == matchAll || c == matchOne ){ + if( c==matchOne && sqlite3Utf8Read(&zString)==0 ){ + return 0; + } + } + if( c==0 ){ + return 1; /* "*" at the end of the pattern matches */ + }else if( c==matchOther ){ + if( pInfo->matchSet==0 ){ + c = sqlite3Utf8Read(&zPattern); + if( c==0 ) return 0; + }else{ + /* "[...]" immediately follows the "*". We have to do a slow + ** recursive search in this case, but it is an unusual case. */ + assert( matchOther<0x80 ); /* '[' is a single-byte character */ + while( *zString + && patternCompare(&zPattern[-1],zString,pInfo,matchOther)==0 ){ + SQLITE_SKIP_UTF8(zString); + } + return *zString!=0; + } + } + + /* At this point variable c contains the first character of the + ** pattern string past the "*". Search in the input string for the + ** first matching character and recursively contine the match from + ** that point. + ** + ** For a case-insensitive search, set variable cx to be the same as + ** c but in the other case and search the input string for either + ** c or cx. + */ + if( c<=0x80 ){ + u32 cx; + if( noCase ){ + cx = sqlite3Toupper(c); + c = sqlite3Tolower(c); + }else{ + cx = c; + } + while( (c2 = *(zString++))!=0 ){ + if( c2!=c && c2!=cx ) continue; + if( patternCompare(zPattern,zString,pInfo,matchOther) ) return 1; + } + }else{ + while( (c2 = Utf8Read(zString))!=0 ){ + if( c2!=c ) continue; + if( patternCompare(zPattern,zString,pInfo,matchOther) ) return 1; + } + } + return 0; + } + if( c==matchOther ){ + if( pInfo->matchSet==0 ){ + c = sqlite3Utf8Read(&zPattern); + if( c==0 ) return 0; + zEscaped = zPattern; + }else{ + u32 prior_c = 0; + int seen = 0; + int invert = 0; + c = sqlite3Utf8Read(&zString); + if( c==0 ) return 0; + c2 = sqlite3Utf8Read(&zPattern); + if( c2=='^' ){ + invert = 1; + c2 = sqlite3Utf8Read(&zPattern); + } + if( c2==']' ){ + if( c==']' ) seen = 1; + c2 = sqlite3Utf8Read(&zPattern); + } + while( c2 && c2!=']' ){ + if( c2=='-' && zPattern[0]!=']' && zPattern[0]!=0 && prior_c>0 ){ + c2 = sqlite3Utf8Read(&zPattern); + if( c>=prior_c && c<=c2 ) seen = 1; + prior_c = 0; + }else{ + if( c==c2 ){ + seen = 1; + } + prior_c = c2; + } + c2 = sqlite3Utf8Read(&zPattern); + } + if( c2==0 || (seen ^ invert)==0 ){ + return 0; + } + continue; + } + } + c2 = Utf8Read(zString); + if( c==c2 ) continue; + if( noCase && sqlite3Tolower(c)==sqlite3Tolower(c2) && c<0x80 && c2<0x80 ){ + continue; + } + if( c==matchOne && zPattern!=zEscaped && c2!=0 ) continue; + return 0; + } + return *zString==0; +} + +/* +** The sqlite3_strglob() interface. +*/ +SQLITE_API int sqlite3_strglob(const char *zGlobPattern, const char *zString){ + return patternCompare((u8*)zGlobPattern, (u8*)zString, &globInfo, '[')==0; +} + +/* +** The sqlite3_strlike() interface. +*/ +SQLITE_API int sqlite3_strlike(const char *zPattern, const char *zStr, unsigned int esc){ + return patternCompare((u8*)zPattern, (u8*)zStr, &likeInfoNorm, esc)==0; +} + +/* +** Count the number of times that the LIKE operator (or GLOB which is +** just a variation of LIKE) gets called. This is used for testing +** only. +*/ +#ifdef SQLITE_TEST +SQLITE_API int sqlite3_like_count = 0; +#endif + + +/* +** Implementation of the like() SQL function. This function implements +** the build-in LIKE operator. The first argument to the function is the +** pattern and the second argument is the string. So, the SQL statements: +** +** A LIKE B +** +** is implemented as like(B,A). +** +** This same function (with a different compareInfo structure) computes +** the GLOB operator. +*/ +static void likeFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const unsigned char *zA, *zB; + u32 escape; + int nPat; + sqlite3 *db = sqlite3_context_db_handle(context); + struct compareInfo *pInfo = sqlite3_user_data(context); + +#ifdef SQLITE_LIKE_DOESNT_MATCH_BLOBS + if( sqlite3_value_type(argv[0])==SQLITE_BLOB + || sqlite3_value_type(argv[1])==SQLITE_BLOB + ){ +#ifdef SQLITE_TEST + sqlite3_like_count++; +#endif + sqlite3_result_int(context, 0); + return; + } +#endif + zB = sqlite3_value_text(argv[0]); + zA = sqlite3_value_text(argv[1]); + + /* Limit the length of the LIKE or GLOB pattern to avoid problems + ** of deep recursion and N*N behavior in patternCompare(). + */ + nPat = sqlite3_value_bytes(argv[0]); + testcase( nPat==db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH] ); + testcase( nPat==db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH]+1 ); + if( nPat > db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH] ){ + sqlite3_result_error(context, "LIKE or GLOB pattern too complex", -1); + return; + } + assert( zB==sqlite3_value_text(argv[0]) ); /* Encoding did not change */ + + if( argc==3 ){ + /* The escape character string must consist of a single UTF-8 character. + ** Otherwise, return an error. + */ + const unsigned char *zEsc = sqlite3_value_text(argv[2]); + if( zEsc==0 ) return; + if( sqlite3Utf8CharLen((char*)zEsc, -1)!=1 ){ + sqlite3_result_error(context, + "ESCAPE expression must be a single character", -1); + return; + } + escape = sqlite3Utf8Read(&zEsc); + }else{ + escape = pInfo->matchSet; + } + if( zA && zB ){ +#ifdef SQLITE_TEST + sqlite3_like_count++; +#endif + sqlite3_result_int(context, patternCompare(zB, zA, pInfo, escape)); + } +} + +/* +** Implementation of the NULLIF(x,y) function. The result is the first +** argument if the arguments are different. The result is NULL if the +** arguments are equal to each other. +*/ +static void nullifFunc( + sqlite3_context *context, + int NotUsed, + sqlite3_value **argv +){ + CollSeq *pColl = sqlite3GetFuncCollSeq(context); + UNUSED_PARAMETER(NotUsed); + if( sqlite3MemCompare(argv[0], argv[1], pColl)!=0 ){ + sqlite3_result_value(context, argv[0]); + } +} + +/* +** Implementation of the sqlite_version() function. The result is the version +** of the SQLite library that is running. +*/ +static void versionFunc( + sqlite3_context *context, + int NotUsed, + sqlite3_value **NotUsed2 +){ + UNUSED_PARAMETER2(NotUsed, NotUsed2); + /* IMP: R-48699-48617 This function is an SQL wrapper around the + ** sqlite3_libversion() C-interface. */ + sqlite3_result_text(context, sqlite3_libversion(), -1, SQLITE_STATIC); +} + +/* +** Implementation of the sqlite_source_id() function. The result is a string +** that identifies the particular version of the source code used to build +** SQLite. +*/ +static void sourceidFunc( + sqlite3_context *context, + int NotUsed, + sqlite3_value **NotUsed2 +){ + UNUSED_PARAMETER2(NotUsed, NotUsed2); + /* IMP: R-24470-31136 This function is an SQL wrapper around the + ** sqlite3_sourceid() C interface. */ + sqlite3_result_text(context, sqlite3_sourceid(), -1, SQLITE_STATIC); +} + +/* +** Implementation of the sqlite_log() function. This is a wrapper around +** sqlite3_log(). The return value is NULL. The function exists purely for +** its side-effects. +*/ +static void errlogFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + UNUSED_PARAMETER(argc); + UNUSED_PARAMETER(context); + sqlite3_log(sqlite3_value_int(argv[0]), "%s", sqlite3_value_text(argv[1])); +} + +/* +** Implementation of the sqlite_compileoption_used() function. +** The result is an integer that identifies if the compiler option +** was used to build SQLite. +*/ +#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS +static void compileoptionusedFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const char *zOptName; + assert( argc==1 ); + UNUSED_PARAMETER(argc); + /* IMP: R-39564-36305 The sqlite_compileoption_used() SQL + ** function is a wrapper around the sqlite3_compileoption_used() C/C++ + ** function. + */ + if( (zOptName = (const char*)sqlite3_value_text(argv[0]))!=0 ){ + sqlite3_result_int(context, sqlite3_compileoption_used(zOptName)); + } +} +#endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */ + +/* +** Implementation of the sqlite_compileoption_get() function. +** The result is a string that identifies the compiler options +** used to build SQLite. +*/ +#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS +static void compileoptiongetFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + int n; + assert( argc==1 ); + UNUSED_PARAMETER(argc); + /* IMP: R-04922-24076 The sqlite_compileoption_get() SQL function + ** is a wrapper around the sqlite3_compileoption_get() C/C++ function. + */ + n = sqlite3_value_int(argv[0]); + sqlite3_result_text(context, sqlite3_compileoption_get(n), -1, SQLITE_STATIC); +} +#endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */ + +/* Array for converting from half-bytes (nybbles) into ASCII hex +** digits. */ +static const char hexdigits[] = { + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' +}; + +/* +** Implementation of the QUOTE() function. This function takes a single +** argument. If the argument is numeric, the return value is the same as +** the argument. If the argument is NULL, the return value is the string +** "NULL". Otherwise, the argument is enclosed in single quotes with +** single-quote escapes. +*/ +static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ + assert( argc==1 ); + UNUSED_PARAMETER(argc); + switch( sqlite3_value_type(argv[0]) ){ + case SQLITE_FLOAT: { + double r1, r2; + char zBuf[50]; + r1 = sqlite3_value_double(argv[0]); + sqlite3_snprintf(sizeof(zBuf), zBuf, "%!.15g", r1); + sqlite3AtoF(zBuf, &r2, 20, SQLITE_UTF8); + if( r1!=r2 ){ + sqlite3_snprintf(sizeof(zBuf), zBuf, "%!.20e", r1); + } + sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT); + break; + } + case SQLITE_INTEGER: { + sqlite3_result_value(context, argv[0]); + break; + } + case SQLITE_BLOB: { + char *zText = 0; + char const *zBlob = sqlite3_value_blob(argv[0]); + int nBlob = sqlite3_value_bytes(argv[0]); + assert( zBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */ + zText = (char *)contextMalloc(context, (2*(i64)nBlob)+4); + if( zText ){ + int i; + for(i=0; i>4)&0x0F]; + zText[(i*2)+3] = hexdigits[(zBlob[i])&0x0F]; + } + zText[(nBlob*2)+2] = '\''; + zText[(nBlob*2)+3] = '\0'; + zText[0] = 'X'; + zText[1] = '\''; + sqlite3_result_text(context, zText, -1, SQLITE_TRANSIENT); + sqlite3_free(zText); + } + break; + } + case SQLITE_TEXT: { + int i,j; + u64 n; + const unsigned char *zArg = sqlite3_value_text(argv[0]); + char *z; + + if( zArg==0 ) return; + for(i=0, n=0; zArg[i]; i++){ if( zArg[i]=='\'' ) n++; } + z = contextMalloc(context, ((i64)i)+((i64)n)+3); + if( z ){ + z[0] = '\''; + for(i=0, j=1; zArg[i]; i++){ + z[j++] = zArg[i]; + if( zArg[i]=='\'' ){ + z[j++] = '\''; + } + } + z[j++] = '\''; + z[j] = 0; + sqlite3_result_text(context, z, j, sqlite3_free); + } + break; + } + default: { + assert( sqlite3_value_type(argv[0])==SQLITE_NULL ); + sqlite3_result_text(context, "NULL", 4, SQLITE_STATIC); + break; + } + } +} + +/* +** The unicode() function. Return the integer unicode code-point value +** for the first character of the input string. +*/ +static void unicodeFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const unsigned char *z = sqlite3_value_text(argv[0]); + (void)argc; + if( z && z[0] ) sqlite3_result_int(context, sqlite3Utf8Read(&z)); +} + +/* +** The char() function takes zero or more arguments, each of which is +** an integer. It constructs a string where each character of the string +** is the unicode character for the corresponding integer argument. +*/ +static void charFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + unsigned char *z, *zOut; + int i; + zOut = z = sqlite3_malloc64( argc*4+1 ); + if( z==0 ){ + sqlite3_result_error_nomem(context); + return; + } + for(i=0; i0x10ffff ) x = 0xfffd; + c = (unsigned)(x & 0x1fffff); + if( c<0x00080 ){ + *zOut++ = (u8)(c&0xFF); + }else if( c<0x00800 ){ + *zOut++ = 0xC0 + (u8)((c>>6)&0x1F); + *zOut++ = 0x80 + (u8)(c & 0x3F); + }else if( c<0x10000 ){ + *zOut++ = 0xE0 + (u8)((c>>12)&0x0F); + *zOut++ = 0x80 + (u8)((c>>6) & 0x3F); + *zOut++ = 0x80 + (u8)(c & 0x3F); + }else{ + *zOut++ = 0xF0 + (u8)((c>>18) & 0x07); + *zOut++ = 0x80 + (u8)((c>>12) & 0x3F); + *zOut++ = 0x80 + (u8)((c>>6) & 0x3F); + *zOut++ = 0x80 + (u8)(c & 0x3F); + } \ + } + sqlite3_result_text64(context, (char*)z, zOut-z, sqlite3_free, SQLITE_UTF8); +} + +/* +** The hex() function. Interpret the argument as a blob. Return +** a hexadecimal rendering as text. +*/ +static void hexFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + int i, n; + const unsigned char *pBlob; + char *zHex, *z; + assert( argc==1 ); + UNUSED_PARAMETER(argc); + pBlob = sqlite3_value_blob(argv[0]); + n = sqlite3_value_bytes(argv[0]); + assert( pBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */ + z = zHex = contextMalloc(context, ((i64)n)*2 + 1); + if( zHex ){ + for(i=0; i>4)&0xf]; + *(z++) = hexdigits[c&0xf]; + } + *z = 0; + sqlite3_result_text(context, zHex, n*2, sqlite3_free); + } +} + +/* +** The zeroblob(N) function returns a zero-filled blob of size N bytes. +*/ +static void zeroblobFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + i64 n; + int rc; + assert( argc==1 ); + UNUSED_PARAMETER(argc); + n = sqlite3_value_int64(argv[0]); + if( n<0 ) n = 0; + rc = sqlite3_result_zeroblob64(context, n); /* IMP: R-00293-64994 */ + if( rc ){ + sqlite3_result_error_code(context, rc); + } +} + +/* +** The replace() function. Three arguments are all strings: call +** them A, B, and C. The result is also a string which is derived +** from A by replacing every occurrence of B with C. The match +** must be exact. Collating sequences are not used. +*/ +static void replaceFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const unsigned char *zStr; /* The input string A */ + const unsigned char *zPattern; /* The pattern string B */ + const unsigned char *zRep; /* The replacement string C */ + unsigned char *zOut; /* The output */ + int nStr; /* Size of zStr */ + int nPattern; /* Size of zPattern */ + int nRep; /* Size of zRep */ + i64 nOut; /* Maximum size of zOut */ + int loopLimit; /* Last zStr[] that might match zPattern[] */ + int i, j; /* Loop counters */ + + assert( argc==3 ); + UNUSED_PARAMETER(argc); + zStr = sqlite3_value_text(argv[0]); + if( zStr==0 ) return; + nStr = sqlite3_value_bytes(argv[0]); + assert( zStr==sqlite3_value_text(argv[0]) ); /* No encoding change */ + zPattern = sqlite3_value_text(argv[1]); + if( zPattern==0 ){ + assert( sqlite3_value_type(argv[1])==SQLITE_NULL + || sqlite3_context_db_handle(context)->mallocFailed ); + return; + } + if( zPattern[0]==0 ){ + assert( sqlite3_value_type(argv[1])!=SQLITE_NULL ); + sqlite3_result_value(context, argv[0]); + return; + } + nPattern = sqlite3_value_bytes(argv[1]); + assert( zPattern==sqlite3_value_text(argv[1]) ); /* No encoding change */ + zRep = sqlite3_value_text(argv[2]); + if( zRep==0 ) return; + nRep = sqlite3_value_bytes(argv[2]); + assert( zRep==sqlite3_value_text(argv[2]) ); + nOut = nStr + 1; + assert( nOutaLimit[SQLITE_LIMIT_LENGTH] ); + testcase( nOut-2==db->aLimit[SQLITE_LIMIT_LENGTH] ); + if( nOut-1>db->aLimit[SQLITE_LIMIT_LENGTH] ){ + sqlite3_result_error_toobig(context); + sqlite3_free(zOut); + return; + } + zOld = zOut; + zOut = sqlite3_realloc64(zOut, (int)nOut); + if( zOut==0 ){ + sqlite3_result_error_nomem(context); + sqlite3_free(zOld); + return; + } + memcpy(&zOut[j], zRep, nRep); + j += nRep; + i += nPattern-1; + } + } + assert( j+nStr-i+1==nOut ); + memcpy(&zOut[j], &zStr[i], nStr-i); + j += nStr - i; + assert( j<=nOut ); + zOut[j] = 0; + sqlite3_result_text(context, (char*)zOut, j, sqlite3_free); +} + +/* +** Implementation of the TRIM(), LTRIM(), and RTRIM() functions. +** The userdata is 0x1 for left trim, 0x2 for right trim, 0x3 for both. +*/ +static void trimFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const unsigned char *zIn; /* Input string */ + const unsigned char *zCharSet; /* Set of characters to trim */ + int nIn; /* Number of bytes in input */ + int flags; /* 1: trimleft 2: trimright 3: trim */ + int i; /* Loop counter */ + unsigned char *aLen = 0; /* Length of each character in zCharSet */ + unsigned char **azChar = 0; /* Individual characters in zCharSet */ + int nChar; /* Number of characters in zCharSet */ + + if( sqlite3_value_type(argv[0])==SQLITE_NULL ){ + return; + } + zIn = sqlite3_value_text(argv[0]); + if( zIn==0 ) return; + nIn = sqlite3_value_bytes(argv[0]); + assert( zIn==sqlite3_value_text(argv[0]) ); + if( argc==1 ){ + static const unsigned char lenOne[] = { 1 }; + static unsigned char * const azOne[] = { (u8*)" " }; + nChar = 1; + aLen = (u8*)lenOne; + azChar = (unsigned char **)azOne; + zCharSet = 0; + }else if( (zCharSet = sqlite3_value_text(argv[1]))==0 ){ + return; + }else{ + const unsigned char *z; + for(z=zCharSet, nChar=0; *z; nChar++){ + SQLITE_SKIP_UTF8(z); + } + if( nChar>0 ){ + azChar = contextMalloc(context, ((i64)nChar)*(sizeof(char*)+1)); + if( azChar==0 ){ + return; + } + aLen = (unsigned char*)&azChar[nChar]; + for(z=zCharSet, nChar=0; *z; nChar++){ + azChar[nChar] = (unsigned char *)z; + SQLITE_SKIP_UTF8(z); + aLen[nChar] = (u8)(z - azChar[nChar]); + } + } + } + if( nChar>0 ){ + flags = SQLITE_PTR_TO_INT(sqlite3_user_data(context)); + if( flags & 1 ){ + while( nIn>0 ){ + int len = 0; + for(i=0; i=nChar ) break; + zIn += len; + nIn -= len; + } + } + if( flags & 2 ){ + while( nIn>0 ){ + int len = 0; + for(i=0; i=nChar ) break; + nIn -= len; + } + } + if( zCharSet ){ + sqlite3_free(azChar); + } + } + sqlite3_result_text(context, (char*)zIn, nIn, SQLITE_TRANSIENT); +} + + +#ifdef SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION +/* +** The "unknown" function is automatically substituted in place of +** any unrecognized function name when doing an EXPLAIN or EXPLAIN QUERY PLAN +** when the SQLITE_ENABLE_UNKNOWN_FUNCTION compile-time option is used. +** When the "sqlite3" command-line shell is built using this functionality, +** that allows an EXPLAIN or EXPLAIN QUERY PLAN for complex queries +** involving application-defined functions to be examined in a generic +** sqlite3 shell. +*/ +static void unknownFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + /* no-op */ +} +#endif /*SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION*/ + + +/* 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, + int argc, + sqlite3_value **argv +){ + char zResult[8]; + const u8 *zIn; + int i, j; + static const unsigned char iCode[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0, + 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0, + 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0, + }; + assert( argc==1 ); + zIn = (u8*)sqlite3_value_text(argv[0]); + if( zIn==0 ) zIn = (u8*)""; + for(i=0; zIn[i] && !sqlite3Isalpha(zIn[i]); i++){} + if( zIn[i] ){ + u8 prevcode = iCode[zIn[i]&0x7f]; + zResult[0] = sqlite3Toupper(zIn[i]); + for(j=1; j<4 && zIn[i]; i++){ + int code = iCode[zIn[i]&0x7f]; + if( code>0 ){ + if( code!=prevcode ){ + prevcode = code; + zResult[j++] = code + '0'; + } + }else{ + prevcode = 0; + } + } + while( j<4 ){ + zResult[j++] = '0'; + } + 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 /* SQLITE_SOUNDEX */ + +#ifndef SQLITE_OMIT_LOAD_EXTENSION +/* +** A function that loads a shared-library extension then returns NULL. +*/ +static void loadExt(sqlite3_context *context, int argc, sqlite3_value **argv){ + const char *zFile = (const char *)sqlite3_value_text(argv[0]); + const char *zProc; + sqlite3 *db = sqlite3_context_db_handle(context); + char *zErrMsg = 0; + + /* Disallow the load_extension() SQL function unless the SQLITE_LoadExtFunc + ** flag is set. See the sqlite3_enable_load_extension() API. + */ + if( (db->flags & SQLITE_LoadExtFunc)==0 ){ + sqlite3_result_error(context, "not authorized", -1); + return; + } + + if( argc==2 ){ + zProc = (const char *)sqlite3_value_text(argv[1]); + }else{ + zProc = 0; + } + if( zFile && sqlite3_load_extension(db, zFile, zProc, &zErrMsg) ){ + sqlite3_result_error(context, zErrMsg, -1); + sqlite3_free(zErrMsg); + } +} +#endif + + +/* +** An instance of the following structure holds the context of a +** sum() or avg() aggregate computation. +*/ +typedef struct SumCtx SumCtx; +struct SumCtx { + double rSum; /* Floating point sum */ + i64 iSum; /* Integer sum */ + i64 cnt; /* Number of elements summed */ + u8 overflow; /* True if integer overflow seen */ + u8 approx; /* True if non-integer value was input to the sum */ +}; + +/* +** Routines used to compute the sum, average, and total. +** +** The SUM() function follows the (broken) SQL standard which means +** that it returns NULL if it sums over no inputs. TOTAL returns +** 0.0 in that case. In addition, TOTAL always returns a float where +** SUM might return an integer if it never encounters a floating point +** value. TOTAL never fails, but SUM might through an exception if +** it overflows an integer. +*/ +static void sumStep(sqlite3_context *context, int argc, sqlite3_value **argv){ + SumCtx *p; + int type; + assert( argc==1 ); + UNUSED_PARAMETER(argc); + p = sqlite3_aggregate_context(context, sizeof(*p)); + type = sqlite3_value_numeric_type(argv[0]); + if( p && type!=SQLITE_NULL ){ + p->cnt++; + if( type==SQLITE_INTEGER ){ + i64 v = sqlite3_value_int64(argv[0]); + p->rSum += v; + if( (p->approx|p->overflow)==0 && sqlite3AddInt64(&p->iSum, v) ){ + p->overflow = 1; + } + }else{ + p->rSum += sqlite3_value_double(argv[0]); + p->approx = 1; + } + } +} +static void sumFinalize(sqlite3_context *context){ + SumCtx *p; + p = sqlite3_aggregate_context(context, 0); + if( p && p->cnt>0 ){ + if( p->overflow ){ + sqlite3_result_error(context,"integer overflow",-1); + }else if( p->approx ){ + sqlite3_result_double(context, p->rSum); + }else{ + sqlite3_result_int64(context, p->iSum); + } + } +} +static void avgFinalize(sqlite3_context *context){ + SumCtx *p; + p = sqlite3_aggregate_context(context, 0); + if( p && p->cnt>0 ){ + sqlite3_result_double(context, p->rSum/(double)p->cnt); + } +} +static void totalFinalize(sqlite3_context *context){ + SumCtx *p; + p = sqlite3_aggregate_context(context, 0); + /* (double)0 In case of SQLITE_OMIT_FLOATING_POINT... */ + sqlite3_result_double(context, p ? p->rSum : (double)0); +} + +/* +** The following structure keeps track of state information for the +** count() aggregate function. +*/ +typedef struct CountCtx CountCtx; +struct CountCtx { + i64 n; +}; + +/* +** Routines to implement the count() aggregate function. +*/ +static void countStep(sqlite3_context *context, int argc, sqlite3_value **argv){ + CountCtx *p; + p = sqlite3_aggregate_context(context, sizeof(*p)); + if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && p ){ + p->n++; + } + +#ifndef SQLITE_OMIT_DEPRECATED + /* The sqlite3_aggregate_count() function is deprecated. But just to make + ** sure it still operates correctly, verify that its count agrees with our + ** internal count when using count(*) and when the total count can be + ** expressed as a 32-bit integer. */ + assert( argc==1 || p==0 || p->n>0x7fffffff + || p->n==sqlite3_aggregate_count(context) ); +#endif +} +static void countFinalize(sqlite3_context *context){ + CountCtx *p; + p = sqlite3_aggregate_context(context, 0); + sqlite3_result_int64(context, p ? p->n : 0); +} + +/* +** Routines to implement min() and max() aggregate functions. +*/ +static void minmaxStep( + sqlite3_context *context, + int NotUsed, + sqlite3_value **argv +){ + Mem *pArg = (Mem *)argv[0]; + Mem *pBest; + UNUSED_PARAMETER(NotUsed); + + pBest = (Mem *)sqlite3_aggregate_context(context, sizeof(*pBest)); + if( !pBest ) return; + + if( sqlite3_value_type(argv[0])==SQLITE_NULL ){ + if( pBest->flags ) sqlite3SkipAccumulatorLoad(context); + }else if( pBest->flags ){ + int max; + int cmp; + CollSeq *pColl = sqlite3GetFuncCollSeq(context); + /* This step function is used for both the min() and max() aggregates, + ** the only difference between the two being that the sense of the + ** comparison is inverted. For the max() aggregate, the + ** sqlite3_user_data() function returns (void *)-1. For min() it + ** returns (void *)db, where db is the sqlite3* database pointer. + ** Therefore the next statement sets variable 'max' to 1 for the max() + ** aggregate, or 0 for min(). + */ + max = sqlite3_user_data(context)!=0; + cmp = sqlite3MemCompare(pBest, pArg, pColl); + if( (max && cmp<0) || (!max && cmp>0) ){ + sqlite3VdbeMemCopy(pBest, pArg); + }else{ + sqlite3SkipAccumulatorLoad(context); + } + }else{ + pBest->db = sqlite3_context_db_handle(context); + sqlite3VdbeMemCopy(pBest, pArg); + } +} +static void minMaxFinalize(sqlite3_context *context){ + sqlite3_value *pRes; + pRes = (sqlite3_value *)sqlite3_aggregate_context(context, 0); + if( pRes ){ + if( pRes->flags ){ + sqlite3_result_value(context, pRes); + } + sqlite3VdbeMemRelease(pRes); + } +} + +/* +** group_concat(EXPR, ?SEPARATOR?) +*/ +static void groupConcatStep( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const char *zVal; + StrAccum *pAccum; + const char *zSep; + int nVal, nSep; + assert( argc==1 || argc==2 ); + if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return; + pAccum = (StrAccum*)sqlite3_aggregate_context(context, sizeof(*pAccum)); + + if( pAccum ){ + sqlite3 *db = sqlite3_context_db_handle(context); + int firstTerm = pAccum->mxAlloc==0; + pAccum->mxAlloc = db->aLimit[SQLITE_LIMIT_LENGTH]; + if( !firstTerm ){ + if( argc==2 ){ + zSep = (char*)sqlite3_value_text(argv[1]); + nSep = sqlite3_value_bytes(argv[1]); + }else{ + zSep = ","; + nSep = 1; + } + if( nSep ) sqlite3StrAccumAppend(pAccum, zSep, nSep); + } + zVal = (char*)sqlite3_value_text(argv[0]); + nVal = sqlite3_value_bytes(argv[0]); + if( zVal ) sqlite3StrAccumAppend(pAccum, zVal, nVal); + } +} +static void groupConcatFinalize(sqlite3_context *context){ + StrAccum *pAccum; + pAccum = sqlite3_aggregate_context(context, 0); + if( pAccum ){ + if( pAccum->accError==STRACCUM_TOOBIG ){ + sqlite3_result_error_toobig(context); + }else if( pAccum->accError==STRACCUM_NOMEM ){ + sqlite3_result_error_nomem(context); + }else{ + sqlite3_result_text(context, sqlite3StrAccumFinish(pAccum), -1, + sqlite3_free); + } + } +} + +/* +** This routine does per-connection function registration. Most +** of the built-in functions above are part of the global function set. +** This routine only deals with those that are not global. +*/ +SQLITE_PRIVATE void sqlite3RegisterPerConnectionBuiltinFunctions(sqlite3 *db){ + int rc = sqlite3_overload_function(db, "MATCH", 2); + assert( rc==SQLITE_NOMEM || rc==SQLITE_OK ); + if( rc==SQLITE_NOMEM ){ + sqlite3OomFault(db); + } +} + +/* +** Set the LIKEOPT flag on the 2-argument function with the given name. +*/ +static void setLikeOptFlag(sqlite3 *db, const char *zName, u8 flagVal){ + FuncDef *pDef; + pDef = sqlite3FindFunction(db, zName, 2, SQLITE_UTF8, 0); + if( ALWAYS(pDef) ){ + pDef->funcFlags |= flagVal; + } +} + +/* +** Register the built-in LIKE and GLOB functions. The caseSensitive +** parameter determines whether or not the LIKE operator is case +** sensitive. GLOB is always case sensitive. +*/ +SQLITE_PRIVATE void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive){ + struct compareInfo *pInfo; + if( caseSensitive ){ + pInfo = (struct compareInfo*)&likeInfoAlt; + }else{ + pInfo = (struct compareInfo*)&likeInfoNorm; + } + sqlite3CreateFunc(db, "like", 2, SQLITE_UTF8, pInfo, likeFunc, 0, 0, 0); + sqlite3CreateFunc(db, "like", 3, SQLITE_UTF8, pInfo, likeFunc, 0, 0, 0); + sqlite3CreateFunc(db, "glob", 2, SQLITE_UTF8, + (struct compareInfo*)&globInfo, likeFunc, 0, 0, 0); + setLikeOptFlag(db, "glob", SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE); + setLikeOptFlag(db, "like", + caseSensitive ? (SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE) : SQLITE_FUNC_LIKE); +} + +/* +** pExpr points to an expression which implements a function. If +** it is appropriate to apply the LIKE optimization to that function +** then set aWc[0] through aWc[2] to the wildcard characters and +** return TRUE. If the function is not a LIKE-style function then +** return FALSE. +** +** *pIsNocase is set to true if uppercase and lowercase are equivalent for +** the function (default for LIKE). If the function makes the distinction +** between uppercase and lowercase (as does GLOB) then *pIsNocase is set to +** false. +*/ +SQLITE_PRIVATE int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocase, char *aWc){ + FuncDef *pDef; + if( pExpr->op!=TK_FUNCTION + || !pExpr->x.pList + || pExpr->x.pList->nExpr!=2 + ){ + return 0; + } + assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); + pDef = sqlite3FindFunction(db, pExpr->u.zToken, 2, SQLITE_UTF8, 0); + if( NEVER(pDef==0) || (pDef->funcFlags & SQLITE_FUNC_LIKE)==0 ){ + return 0; + } + + /* The memcpy() statement assumes that the wildcard characters are + ** the first three statements in the compareInfo structure. The + ** asserts() that follow verify that assumption + */ + memcpy(aWc, pDef->pUserData, 3); + assert( (char*)&likeInfoAlt == (char*)&likeInfoAlt.matchAll ); + assert( &((char*)&likeInfoAlt)[1] == (char*)&likeInfoAlt.matchOne ); + assert( &((char*)&likeInfoAlt)[2] == (char*)&likeInfoAlt.matchSet ); + *pIsNocase = (pDef->funcFlags & SQLITE_FUNC_CASE)==0; + return 1; +} + +/* +** All of the FuncDef structures in the aBuiltinFunc[] array above +** to the global function hash table. This occurs at start-time (as +** a consequence of calling sqlite3_initialize()). +** +** After this routine runs +*/ +SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(void){ + /* + ** The following array holds FuncDef structures for all of the functions + ** defined in this file. + ** + ** The array cannot be constant since changes are made to the + ** FuncDef.pHash elements at start-time. The elements of this array + ** are read-only after initialization is complete. + ** + ** For peak efficiency, put the most frequently used function last. + */ + static FuncDef aBuiltinFunc[] = { +#ifdef SQLITE_SOUNDEX + FUNCTION(soundex, 1, 0, 0, soundexFunc ), +#endif +#ifndef SQLITE_OMIT_LOAD_EXTENSION + VFUNCTION(load_extension, 1, 0, 0, loadExt ), + VFUNCTION(load_extension, 2, 0, 0, loadExt ), +#endif +#if SQLITE_USER_AUTHENTICATION + FUNCTION(sqlite_crypt, 2, 0, 0, sqlite3CryptFunc ), +#endif +#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS + DFUNCTION(sqlite_compileoption_used,1, 0, 0, compileoptionusedFunc ), + DFUNCTION(sqlite_compileoption_get, 1, 0, 0, compileoptiongetFunc ), +#endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */ + FUNCTION2(unlikely, 1, 0, 0, noopFunc, SQLITE_FUNC_UNLIKELY), + FUNCTION2(likelihood, 2, 0, 0, noopFunc, SQLITE_FUNC_UNLIKELY), + FUNCTION2(likely, 1, 0, 0, noopFunc, SQLITE_FUNC_UNLIKELY), + FUNCTION(ltrim, 1, 1, 0, trimFunc ), + FUNCTION(ltrim, 2, 1, 0, trimFunc ), + FUNCTION(rtrim, 1, 2, 0, trimFunc ), + FUNCTION(rtrim, 2, 2, 0, trimFunc ), + FUNCTION(trim, 1, 3, 0, trimFunc ), + FUNCTION(trim, 2, 3, 0, trimFunc ), + FUNCTION(min, -1, 0, 1, minmaxFunc ), + FUNCTION(min, 0, 0, 1, 0 ), + AGGREGATE2(min, 1, 0, 1, minmaxStep, minMaxFinalize, + SQLITE_FUNC_MINMAX ), + FUNCTION(max, -1, 1, 1, minmaxFunc ), + FUNCTION(max, 0, 1, 1, 0 ), + AGGREGATE2(max, 1, 1, 1, minmaxStep, minMaxFinalize, + SQLITE_FUNC_MINMAX ), + FUNCTION2(typeof, 1, 0, 0, typeofFunc, SQLITE_FUNC_TYPEOF), + FUNCTION2(length, 1, 0, 0, lengthFunc, SQLITE_FUNC_LENGTH), + FUNCTION(instr, 2, 0, 0, instrFunc ), + FUNCTION(printf, -1, 0, 0, printfFunc ), + FUNCTION(unicode, 1, 0, 0, unicodeFunc ), + FUNCTION(char, -1, 0, 0, charFunc ), + FUNCTION(abs, 1, 0, 0, absFunc ), +#ifndef SQLITE_OMIT_FLOATING_POINT + FUNCTION(round, 1, 0, 0, roundFunc ), + FUNCTION(round, 2, 0, 0, roundFunc ), +#endif + FUNCTION(upper, 1, 0, 0, upperFunc ), + FUNCTION(lower, 1, 0, 0, lowerFunc ), + FUNCTION(hex, 1, 0, 0, hexFunc ), + FUNCTION2(ifnull, 2, 0, 0, noopFunc, SQLITE_FUNC_COALESCE), + VFUNCTION(random, 0, 0, 0, randomFunc ), + VFUNCTION(randomblob, 1, 0, 0, randomBlob ), + FUNCTION(nullif, 2, 0, 1, nullifFunc ), + DFUNCTION(sqlite_version, 0, 0, 0, versionFunc ), + DFUNCTION(sqlite_source_id, 0, 0, 0, sourceidFunc ), + FUNCTION(sqlite_log, 2, 0, 0, errlogFunc ), + FUNCTION(quote, 1, 0, 0, quoteFunc ), + VFUNCTION(last_insert_rowid, 0, 0, 0, last_insert_rowid), + VFUNCTION(changes, 0, 0, 0, changes ), + VFUNCTION(total_changes, 0, 0, 0, total_changes ), + FUNCTION(replace, 3, 0, 0, replaceFunc ), + FUNCTION(zeroblob, 1, 0, 0, zeroblobFunc ), + FUNCTION(substr, 2, 0, 0, substrFunc ), + FUNCTION(substr, 3, 0, 0, substrFunc ), + AGGREGATE(sum, 1, 0, 0, sumStep, sumFinalize ), + AGGREGATE(total, 1, 0, 0, sumStep, totalFinalize ), + AGGREGATE(avg, 1, 0, 0, sumStep, avgFinalize ), + AGGREGATE2(count, 0, 0, 0, countStep, countFinalize, + SQLITE_FUNC_COUNT ), + AGGREGATE(count, 1, 0, 0, countStep, countFinalize ), + AGGREGATE(group_concat, 1, 0, 0, groupConcatStep, groupConcatFinalize), + AGGREGATE(group_concat, 2, 0, 0, groupConcatStep, groupConcatFinalize), + + LIKEFUNC(glob, 2, &globInfo, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE), +#ifdef SQLITE_CASE_SENSITIVE_LIKE + LIKEFUNC(like, 2, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE), + LIKEFUNC(like, 3, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE), +#else + LIKEFUNC(like, 2, &likeInfoNorm, SQLITE_FUNC_LIKE), + LIKEFUNC(like, 3, &likeInfoNorm, SQLITE_FUNC_LIKE), +#endif +#ifdef SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION + FUNCTION(unknown, -1, 0, 0, unknownFunc ), +#endif + FUNCTION(coalesce, 1, 0, 0, 0 ), + FUNCTION(coalesce, 0, 0, 0, 0 ), + FUNCTION2(coalesce, -1, 0, 0, noopFunc, SQLITE_FUNC_COALESCE), + }; +#ifndef SQLITE_OMIT_ALTERTABLE + sqlite3AlterFunctions(); +#endif +#if defined(SQLITE_ENABLE_STAT3) || defined(SQLITE_ENABLE_STAT4) + sqlite3AnalyzeFunctions(); +#endif + sqlite3RegisterDateTimeFunctions(); + sqlite3InsertBuiltinFuncs(aBuiltinFunc, ArraySize(aBuiltinFunc)); + +#if 0 /* Enable to print out how the built-in functions are hashed */ + { + int i; + FuncDef *p; + for(i=0; iu.pHash){ + int n = sqlite3Strlen30(p->zName); + int h = p->zName[0] + n; + printf(" %s(%d)", p->zName, h); + } + printf("\n"); + } + } +#endif +} + +/************** End of func.c ************************************************/ +/************** Begin file fkey.c ********************************************/ +/* +** +** 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 by the compiler to add foreign key +** support to compiled SQL statements. +*/ +/* #include "sqliteInt.h" */ + +#ifndef SQLITE_OMIT_FOREIGN_KEY +#ifndef SQLITE_OMIT_TRIGGER + +/* +** Deferred and Immediate FKs +** -------------------------- +** +** Foreign keys in SQLite come in two flavours: deferred and immediate. +** If an immediate foreign key constraint is violated, +** SQLITE_CONSTRAINT_FOREIGNKEY is returned and the current +** statement transaction rolled back. If a +** deferred foreign key constraint is violated, no action is taken +** immediately. However if the application attempts to commit the +** transaction before fixing the constraint violation, the attempt fails. +** +** Deferred constraints are implemented using a simple counter associated +** with the database handle. The counter is set to zero each time a +** database transaction is opened. Each time a statement is executed +** that causes a foreign key violation, the counter is incremented. Each +** time a statement is executed that removes an existing violation from +** the database, the counter is decremented. When the transaction is +** committed, the commit fails if the current value of the counter is +** greater than zero. This scheme has two big drawbacks: +** +** * When a commit fails due to a deferred foreign key constraint, +** there is no way to tell which foreign constraint is not satisfied, +** or which row it is not satisfied for. +** +** * If the database contains foreign key violations when the +** transaction is opened, this may cause the mechanism to malfunction. +** +** Despite these problems, this approach is adopted as it seems simpler +** than the alternatives. +** +** INSERT operations: +** +** I.1) For each FK for which the table is the child table, search +** the parent table for a match. If none is found increment the +** constraint counter. +** +** I.2) For each FK for which the table is the parent table, +** search the child table for rows that correspond to the new +** row in the parent table. Decrement the counter for each row +** found (as the constraint is now satisfied). +** +** DELETE operations: +** +** D.1) For each FK for which the table is the child table, +** search the parent table for a row that corresponds to the +** deleted row in the child table. If such a row is not found, +** decrement the counter. +** +** D.2) For each FK for which the table is the parent table, search +** the child table for rows that correspond to the deleted row +** in the parent table. For each found increment the counter. +** +** UPDATE operations: +** +** An UPDATE command requires that all 4 steps above are taken, but only +** for FK constraints for which the affected columns are actually +** modified (values must be compared at runtime). +** +** Note that I.1 and D.1 are very similar operations, as are I.2 and D.2. +** This simplifies the implementation a bit. +** +** For the purposes of immediate FK constraints, the OR REPLACE conflict +** resolution is considered to delete rows before the new row is inserted. +** If a delete caused by OR REPLACE violates an FK constraint, an exception +** is thrown, even if the FK constraint would be satisfied after the new +** row is inserted. +** +** Immediate constraints are usually handled similarly. The only difference +** is that the counter used is stored as part of each individual statement +** object (struct Vdbe). If, after the statement has run, its immediate +** constraint counter is greater than zero, +** it returns SQLITE_CONSTRAINT_FOREIGNKEY +** and the statement transaction is rolled back. An exception is an INSERT +** statement that inserts a single row only (no triggers). In this case, +** instead of using a counter, an exception is thrown immediately if the +** INSERT violates a foreign key constraint. This is necessary as such +** an INSERT does not open a statement transaction. +** +** TODO: How should dropping a table be handled? How should renaming a +** table be handled? +** +** +** Query API Notes +** --------------- +** +** Before coding an UPDATE or DELETE row operation, the code-generator +** for those two operations needs to know whether or not the operation +** requires any FK processing and, if so, which columns of the original +** row are required by the FK processing VDBE code (i.e. if FKs were +** implemented using triggers, which of the old.* columns would be +** accessed). No information is required by the code-generator before +** coding an INSERT operation. The functions used by the UPDATE/DELETE +** generation code to query for this information are: +** +** sqlite3FkRequired() - Test to see if FK processing is required. +** sqlite3FkOldmask() - Query for the set of required old.* columns. +** +** +** Externally accessible module functions +** -------------------------------------- +** +** sqlite3FkCheck() - Check for foreign key violations. +** sqlite3FkActions() - Code triggers for ON UPDATE/ON DELETE actions. +** sqlite3FkDelete() - Delete an FKey structure. +*/ + +/* +** VDBE Calling Convention +** ----------------------- +** +** Example: +** +** For the following INSERT statement: +** +** CREATE TABLE t1(a, b INTEGER PRIMARY KEY, c); +** INSERT INTO t1 VALUES(1, 2, 3.1); +** +** Register (x): 2 (type integer) +** Register (x+1): 1 (type integer) +** Register (x+2): NULL (type NULL) +** Register (x+3): 3.1 (type real) +*/ + +/* +** A foreign key constraint requires that the key columns in the parent +** table are collectively subject to a UNIQUE or PRIMARY KEY constraint. +** Given that pParent is the parent table for foreign key constraint pFKey, +** search the schema for a unique index on the parent key columns. +** +** If successful, zero is returned. If the parent key is an INTEGER PRIMARY +** KEY column, then output variable *ppIdx is set to NULL. Otherwise, *ppIdx +** is set to point to the unique index. +** +** If the parent key consists of a single column (the foreign key constraint +** is not a composite foreign key), output variable *paiCol is set to NULL. +** Otherwise, it is set to point to an allocated array of size N, where +** N is the number of columns in the parent key. The first element of the +** array is the index of the child table column that is mapped by the FK +** constraint to the parent table column stored in the left-most column +** of index *ppIdx. The second element of the array is the index of the +** child table column that corresponds to the second left-most column of +** *ppIdx, and so on. +** +** If the required index cannot be found, either because: +** +** 1) The named parent key columns do not exist, or +** +** 2) The named parent key columns do exist, but are not subject to a +** UNIQUE or PRIMARY KEY constraint, or +** +** 3) No parent key columns were provided explicitly as part of the +** foreign key definition, and the parent table does not have a +** PRIMARY KEY, or +** +** 4) No parent key columns were provided explicitly as part of the +** foreign key definition, and the PRIMARY KEY of the parent table +** consists of a different number of columns to the child key in +** the child table. +** +** then non-zero is returned, and a "foreign key mismatch" error loaded +** into pParse. If an OOM error occurs, non-zero is returned and the +** pParse->db->mallocFailed flag is set. +*/ +SQLITE_PRIVATE int sqlite3FkLocateIndex( + Parse *pParse, /* Parse context to store any error in */ + Table *pParent, /* Parent table of FK constraint pFKey */ + FKey *pFKey, /* Foreign key to find index for */ + Index **ppIdx, /* OUT: Unique index on parent table */ + int **paiCol /* OUT: Map of index columns in pFKey */ +){ + Index *pIdx = 0; /* Value to return via *ppIdx */ + int *aiCol = 0; /* Value to return via *paiCol */ + int nCol = pFKey->nCol; /* Number of columns in parent key */ + char *zKey = pFKey->aCol[0].zCol; /* Name of left-most parent key column */ + + /* The caller is responsible for zeroing output parameters. */ + assert( ppIdx && *ppIdx==0 ); + assert( !paiCol || *paiCol==0 ); + assert( pParse ); + + /* If this is a non-composite (single column) foreign key, check if it + ** maps to the INTEGER PRIMARY KEY of table pParent. If so, leave *ppIdx + ** and *paiCol set to zero and return early. + ** + ** Otherwise, for a composite foreign key (more than one column), allocate + ** space for the aiCol array (returned via output parameter *paiCol). + ** Non-composite foreign keys do not require the aiCol array. + */ + if( nCol==1 ){ + /* The FK maps to the IPK if any of the following are true: + ** + ** 1) There is an INTEGER PRIMARY KEY column and the FK is implicitly + ** mapped to the primary key of table pParent, or + ** 2) The FK is explicitly mapped to a column declared as INTEGER + ** PRIMARY KEY. + */ + if( pParent->iPKey>=0 ){ + if( !zKey ) return 0; + if( !sqlite3StrICmp(pParent->aCol[pParent->iPKey].zName, zKey) ) return 0; + } + }else if( paiCol ){ + assert( nCol>1 ); + aiCol = (int *)sqlite3DbMallocRawNN(pParse->db, nCol*sizeof(int)); + if( !aiCol ) return 1; + *paiCol = aiCol; + } + + for(pIdx=pParent->pIndex; pIdx; pIdx=pIdx->pNext){ + if( pIdx->nKeyCol==nCol && IsUniqueIndex(pIdx) ){ + /* pIdx is a UNIQUE index (or a PRIMARY KEY) and has the right number + ** of columns. If each indexed column corresponds to a foreign key + ** column of pFKey, then this index is a winner. */ + + if( zKey==0 ){ + /* If zKey is NULL, then this foreign key is implicitly mapped to + ** the PRIMARY KEY of table pParent. The PRIMARY KEY index may be + ** identified by the test. */ + if( IsPrimaryKeyIndex(pIdx) ){ + if( aiCol ){ + int i; + for(i=0; iaCol[i].iFrom; + } + break; + } + }else{ + /* If zKey is non-NULL, then this foreign key was declared to + ** map to an explicit list of columns in table pParent. Check if this + ** index matches those columns. Also, check that the index uses + ** the default collation sequences for each column. */ + int i, j; + for(i=0; iaiColumn[i]; /* Index of column in parent tbl */ + const char *zDfltColl; /* Def. collation for column */ + char *zIdxCol; /* Name of indexed column */ + + if( iCol<0 ) break; /* No foreign keys against expression indexes */ + + /* If the index uses a collation sequence that is different from + ** the default collation sequence for the column, this index is + ** unusable. Bail out early in this case. */ + zDfltColl = pParent->aCol[iCol].zColl; + if( !zDfltColl ) zDfltColl = sqlite3StrBINARY; + if( sqlite3StrICmp(pIdx->azColl[i], zDfltColl) ) break; + + zIdxCol = pParent->aCol[iCol].zName; + for(j=0; jaCol[j].zCol, zIdxCol)==0 ){ + if( aiCol ) aiCol[i] = pFKey->aCol[j].iFrom; + break; + } + } + if( j==nCol ) break; + } + if( i==nCol ) break; /* pIdx is usable */ + } + } + } + + if( !pIdx ){ + if( !pParse->disableTriggers ){ + sqlite3ErrorMsg(pParse, + "foreign key mismatch - \"%w\" referencing \"%w\"", + pFKey->pFrom->zName, pFKey->zTo); + } + sqlite3DbFree(pParse->db, aiCol); + return 1; + } + + *ppIdx = pIdx; + return 0; +} + +/* +** This function is called when a row is inserted into or deleted from the +** child table of foreign key constraint pFKey. If an SQL UPDATE is executed +** on the child table of pFKey, this function is invoked twice for each row +** affected - once to "delete" the old row, and then again to "insert" the +** new row. +** +** Each time it is called, this function generates VDBE code to locate the +** row in the parent table that corresponds to the row being inserted into +** or deleted from the child table. If the parent row can be found, no +** special action is taken. Otherwise, if the parent row can *not* be +** found in the parent table: +** +** Operation | FK type | Action taken +** -------------------------------------------------------------------------- +** INSERT immediate Increment the "immediate constraint counter". +** +** DELETE immediate Decrement the "immediate constraint counter". +** +** INSERT deferred Increment the "deferred constraint counter". +** +** DELETE deferred Decrement the "deferred constraint counter". +** +** These operations are identified in the comment at the top of this file +** (fkey.c) as "I.1" and "D.1". +*/ +static void fkLookupParent( + Parse *pParse, /* Parse context */ + int iDb, /* Index of database housing pTab */ + Table *pTab, /* Parent table of FK pFKey */ + Index *pIdx, /* Unique index on parent key columns in pTab */ + FKey *pFKey, /* Foreign key constraint */ + int *aiCol, /* Map from parent key columns to child table columns */ + int regData, /* Address of array containing child table row */ + int nIncr, /* Increment constraint counter by this */ + int isIgnore /* If true, pretend pTab contains all NULL values */ +){ + int i; /* Iterator variable */ + Vdbe *v = sqlite3GetVdbe(pParse); /* Vdbe to add code to */ + int iCur = pParse->nTab - 1; /* Cursor number to use */ + int iOk = sqlite3VdbeMakeLabel(v); /* jump here if parent key found */ + + /* If nIncr is less than zero, then check at runtime if there are any + ** outstanding constraints to resolve. If there are not, there is no need + ** to check if deleting this row resolves any outstanding violations. + ** + ** Check if any of the key columns in the child table row are NULL. If + ** any are, then the constraint is considered satisfied. No need to + ** search for a matching row in the parent table. */ + if( nIncr<0 ){ + sqlite3VdbeAddOp2(v, OP_FkIfZero, pFKey->isDeferred, iOk); + VdbeCoverage(v); + } + for(i=0; inCol; i++){ + int iReg = aiCol[i] + regData + 1; + sqlite3VdbeAddOp2(v, OP_IsNull, iReg, iOk); VdbeCoverage(v); + } + + if( isIgnore==0 ){ + if( pIdx==0 ){ + /* If pIdx is NULL, then the parent key is the INTEGER PRIMARY KEY + ** column of the parent table (table pTab). */ + int iMustBeInt; /* Address of MustBeInt instruction */ + int regTemp = sqlite3GetTempReg(pParse); + + /* Invoke MustBeInt to coerce the child key value to an integer (i.e. + ** apply the affinity of the parent key). If this fails, then there + ** is no matching parent key. Before using MustBeInt, make a copy of + ** the value. Otherwise, the value inserted into the child key column + ** will have INTEGER affinity applied to it, which may not be correct. */ + sqlite3VdbeAddOp2(v, OP_SCopy, aiCol[0]+1+regData, regTemp); + iMustBeInt = sqlite3VdbeAddOp2(v, OP_MustBeInt, regTemp, 0); + VdbeCoverage(v); + + /* If the parent table is the same as the child table, and we are about + ** to increment the constraint-counter (i.e. this is an INSERT operation), + ** then check if the row being inserted matches itself. If so, do not + ** increment the constraint-counter. */ + if( pTab==pFKey->pFrom && nIncr==1 ){ + sqlite3VdbeAddOp3(v, OP_Eq, regData, iOk, regTemp); VdbeCoverage(v); + sqlite3VdbeChangeP5(v, SQLITE_NOTNULL); + } + + sqlite3OpenTable(pParse, iCur, iDb, pTab, OP_OpenRead); + sqlite3VdbeAddOp3(v, OP_NotExists, iCur, 0, regTemp); VdbeCoverage(v); + sqlite3VdbeGoto(v, iOk); + sqlite3VdbeJumpHere(v, sqlite3VdbeCurrentAddr(v)-2); + sqlite3VdbeJumpHere(v, iMustBeInt); + sqlite3ReleaseTempReg(pParse, regTemp); + }else{ + int nCol = pFKey->nCol; + int regTemp = sqlite3GetTempRange(pParse, nCol); + int regRec = sqlite3GetTempReg(pParse); + + sqlite3VdbeAddOp3(v, OP_OpenRead, iCur, pIdx->tnum, iDb); + sqlite3VdbeSetP4KeyInfo(pParse, pIdx); + for(i=0; ipFrom && nIncr==1 ){ + int iJump = sqlite3VdbeCurrentAddr(v) + nCol + 1; + for(i=0; iaiColumn[i]+1+regData; + assert( pIdx->aiColumn[i]>=0 ); + assert( aiCol[i]!=pTab->iPKey ); + if( pIdx->aiColumn[i]==pTab->iPKey ){ + /* The parent key is a composite key that includes the IPK column */ + iParent = regData; + } + sqlite3VdbeAddOp3(v, OP_Ne, iChild, iJump, iParent); VdbeCoverage(v); + sqlite3VdbeChangeP5(v, SQLITE_JUMPIFNULL); + } + sqlite3VdbeGoto(v, iOk); + } + + sqlite3VdbeAddOp4(v, OP_MakeRecord, regTemp, nCol, regRec, + sqlite3IndexAffinityStr(pParse->db,pIdx), nCol); + sqlite3VdbeAddOp4Int(v, OP_Found, iCur, iOk, regRec, 0); VdbeCoverage(v); + + sqlite3ReleaseTempReg(pParse, regRec); + sqlite3ReleaseTempRange(pParse, regTemp, nCol); + } + } + + if( !pFKey->isDeferred && !(pParse->db->flags & SQLITE_DeferFKs) + && !pParse->pToplevel + && !pParse->isMultiWrite + ){ + /* Special case: If this is an INSERT statement that will insert exactly + ** one row into the table, raise a constraint immediately instead of + ** incrementing a counter. This is necessary as the VM code is being + ** generated for will not open a statement transaction. */ + assert( nIncr==1 ); + sqlite3HaltConstraint(pParse, SQLITE_CONSTRAINT_FOREIGNKEY, + OE_Abort, 0, P4_STATIC, P5_ConstraintFK); + }else{ + if( nIncr>0 && pFKey->isDeferred==0 ){ + sqlite3MayAbort(pParse); + } + sqlite3VdbeAddOp2(v, OP_FkCounter, pFKey->isDeferred, nIncr); + } + + sqlite3VdbeResolveLabel(v, iOk); + sqlite3VdbeAddOp1(v, OP_Close, iCur); +} + + +/* +** Return an Expr object that refers to a memory register corresponding +** to column iCol of table pTab. +** +** regBase is the first of an array of register that contains the data +** for pTab. regBase itself holds the rowid. regBase+1 holds the first +** column. regBase+2 holds the second column, and so forth. +*/ +static Expr *exprTableRegister( + Parse *pParse, /* Parsing and code generating context */ + Table *pTab, /* The table whose content is at r[regBase]... */ + int regBase, /* Contents of table pTab */ + i16 iCol /* Which column of pTab is desired */ +){ + Expr *pExpr; + Column *pCol; + const char *zColl; + sqlite3 *db = pParse->db; + + pExpr = sqlite3Expr(db, TK_REGISTER, 0); + if( pExpr ){ + if( iCol>=0 && iCol!=pTab->iPKey ){ + pCol = &pTab->aCol[iCol]; + pExpr->iTable = regBase + iCol + 1; + pExpr->affinity = pCol->affinity; + zColl = pCol->zColl; + if( zColl==0 ) zColl = db->pDfltColl->zName; + pExpr = sqlite3ExprAddCollateString(pParse, pExpr, zColl); + }else{ + pExpr->iTable = regBase; + pExpr->affinity = SQLITE_AFF_INTEGER; + } + } + return pExpr; +} + +/* +** Return an Expr object that refers to column iCol of table pTab which +** has cursor iCur. +*/ +static Expr *exprTableColumn( + sqlite3 *db, /* The database connection */ + Table *pTab, /* The table whose column is desired */ + int iCursor, /* The open cursor on the table */ + i16 iCol /* The column that is wanted */ +){ + Expr *pExpr = sqlite3Expr(db, TK_COLUMN, 0); + if( pExpr ){ + pExpr->pTab = pTab; + pExpr->iTable = iCursor; + pExpr->iColumn = iCol; + } + return pExpr; +} + +/* +** This function is called to generate code executed when a row is deleted +** from the parent table of foreign key constraint pFKey and, if pFKey is +** deferred, when a row is inserted into the same table. When generating +** code for an SQL UPDATE operation, this function may be called twice - +** once to "delete" the old row and once to "insert" the new row. +** +** Parameter nIncr is passed -1 when inserting a row (as this may decrease +** the number of FK violations in the db) or +1 when deleting one (as this +** may increase the number of FK constraint problems). +** +** The code generated by this function scans through the rows in the child +** table that correspond to the parent table row being deleted or inserted. +** For each child row found, one of the following actions is taken: +** +** Operation | FK type | Action taken +** -------------------------------------------------------------------------- +** DELETE immediate Increment the "immediate constraint counter". +** Or, if the ON (UPDATE|DELETE) action is RESTRICT, +** throw a "FOREIGN KEY constraint failed" exception. +** +** INSERT immediate Decrement the "immediate constraint counter". +** +** DELETE deferred Increment the "deferred constraint counter". +** Or, if the ON (UPDATE|DELETE) action is RESTRICT, +** throw a "FOREIGN KEY constraint failed" exception. +** +** INSERT deferred Decrement the "deferred constraint counter". +** +** These operations are identified in the comment at the top of this file +** (fkey.c) as "I.2" and "D.2". +*/ +static void fkScanChildren( + Parse *pParse, /* Parse context */ + SrcList *pSrc, /* The child table to be scanned */ + Table *pTab, /* The parent table */ + Index *pIdx, /* Index on parent covering the foreign key */ + FKey *pFKey, /* The foreign key linking pSrc to pTab */ + int *aiCol, /* Map from pIdx cols to child table cols */ + int regData, /* Parent row data starts here */ + int nIncr /* Amount to increment deferred counter by */ +){ + sqlite3 *db = pParse->db; /* Database handle */ + int i; /* Iterator variable */ + Expr *pWhere = 0; /* WHERE clause to scan with */ + NameContext sNameContext; /* Context used to resolve WHERE clause */ + WhereInfo *pWInfo; /* Context used by sqlite3WhereXXX() */ + int iFkIfZero = 0; /* Address of OP_FkIfZero */ + Vdbe *v = sqlite3GetVdbe(pParse); + + assert( pIdx==0 || pIdx->pTable==pTab ); + assert( pIdx==0 || pIdx->nKeyCol==pFKey->nCol ); + assert( pIdx!=0 || pFKey->nCol==1 ); + assert( pIdx!=0 || HasRowid(pTab) ); + + if( nIncr<0 ){ + iFkIfZero = sqlite3VdbeAddOp2(v, OP_FkIfZero, pFKey->isDeferred, 0); + VdbeCoverage(v); + } + + /* Create an Expr object representing an SQL expression like: + ** + ** = AND = ... + ** + ** The collation sequence used for the comparison should be that of + ** the parent key columns. The affinity of the parent key column should + ** be applied to each child key value before the comparison takes place. + */ + for(i=0; inCol; i++){ + Expr *pLeft; /* Value from parent table row */ + Expr *pRight; /* Column ref to child table */ + Expr *pEq; /* Expression (pLeft = pRight) */ + i16 iCol; /* Index of column in child table */ + const char *zCol; /* Name of column in child table */ + + iCol = pIdx ? pIdx->aiColumn[i] : -1; + pLeft = exprTableRegister(pParse, pTab, regData, iCol); + iCol = aiCol ? aiCol[i] : pFKey->aCol[0].iFrom; + assert( iCol>=0 ); + zCol = pFKey->pFrom->aCol[iCol].zName; + pRight = sqlite3Expr(db, TK_ID, zCol); + pEq = sqlite3PExpr(pParse, TK_EQ, pLeft, pRight, 0); + pWhere = sqlite3ExprAnd(db, pWhere, pEq); + } + + /* If the child table is the same as the parent table, then add terms + ** to the WHERE clause that prevent this entry from being scanned. + ** The added WHERE clause terms are like this: + ** + ** $current_rowid!=rowid + ** NOT( $current_a==a AND $current_b==b AND ... ) + ** + ** The first form is used for rowid tables. The second form is used + ** for WITHOUT ROWID tables. In the second form, the primary key is + ** (a,b,...) + */ + if( pTab==pFKey->pFrom && nIncr>0 ){ + Expr *pNe; /* Expression (pLeft != pRight) */ + Expr *pLeft; /* Value from parent table row */ + Expr *pRight; /* Column ref to child table */ + if( HasRowid(pTab) ){ + pLeft = exprTableRegister(pParse, pTab, regData, -1); + pRight = exprTableColumn(db, pTab, pSrc->a[0].iCursor, -1); + pNe = sqlite3PExpr(pParse, TK_NE, pLeft, pRight, 0); + }else{ + Expr *pEq, *pAll = 0; + Index *pPk = sqlite3PrimaryKeyIndex(pTab); + assert( pIdx!=0 ); + for(i=0; inKeyCol; i++){ + i16 iCol = pIdx->aiColumn[i]; + assert( iCol>=0 ); + pLeft = exprTableRegister(pParse, pTab, regData, iCol); + pRight = exprTableColumn(db, pTab, pSrc->a[0].iCursor, iCol); + pEq = sqlite3PExpr(pParse, TK_EQ, pLeft, pRight, 0); + pAll = sqlite3ExprAnd(db, pAll, pEq); + } + pNe = sqlite3PExpr(pParse, TK_NOT, pAll, 0, 0); + } + pWhere = sqlite3ExprAnd(db, pWhere, pNe); + } + + /* Resolve the references in the WHERE clause. */ + memset(&sNameContext, 0, sizeof(NameContext)); + sNameContext.pSrcList = pSrc; + sNameContext.pParse = pParse; + sqlite3ResolveExprNames(&sNameContext, pWhere); + + /* Create VDBE to loop through the entries in pSrc that match the WHERE + ** clause. For each row found, increment either the deferred or immediate + ** foreign key constraint counter. */ + pWInfo = sqlite3WhereBegin(pParse, pSrc, pWhere, 0, 0, 0, 0); + sqlite3VdbeAddOp2(v, OP_FkCounter, pFKey->isDeferred, nIncr); + if( pWInfo ){ + sqlite3WhereEnd(pWInfo); + } + + /* Clean up the WHERE clause constructed above. */ + sqlite3ExprDelete(db, pWhere); + if( iFkIfZero ){ + sqlite3VdbeJumpHere(v, iFkIfZero); + } +} + +/* +** This function returns a linked list of FKey objects (connected by +** FKey.pNextTo) holding all children of table pTab. For example, +** given the following schema: +** +** CREATE TABLE t1(a PRIMARY KEY); +** CREATE TABLE t2(b REFERENCES t1(a); +** +** Calling this function with table "t1" as an argument returns a pointer +** to the FKey structure representing the foreign key constraint on table +** "t2". Calling this function with "t2" as the argument would return a +** NULL pointer (as there are no FK constraints for which t2 is the parent +** table). +*/ +SQLITE_PRIVATE FKey *sqlite3FkReferences(Table *pTab){ + return (FKey *)sqlite3HashFind(&pTab->pSchema->fkeyHash, pTab->zName); +} + +/* +** The second argument is a Trigger structure allocated by the +** fkActionTrigger() routine. This function deletes the Trigger structure +** and all of its sub-components. +** +** The Trigger structure or any of its sub-components may be allocated from +** the lookaside buffer belonging to database handle dbMem. +*/ +static void fkTriggerDelete(sqlite3 *dbMem, Trigger *p){ + if( p ){ + TriggerStep *pStep = p->step_list; + sqlite3ExprDelete(dbMem, pStep->pWhere); + sqlite3ExprListDelete(dbMem, pStep->pExprList); + sqlite3SelectDelete(dbMem, pStep->pSelect); + sqlite3ExprDelete(dbMem, p->pWhen); + sqlite3DbFree(dbMem, p); + } +} + +/* +** This function is called to generate code that runs when table pTab is +** being dropped from the database. The SrcList passed as the second argument +** to this function contains a single entry guaranteed to resolve to +** table pTab. +** +** Normally, no code is required. However, if either +** +** (a) The table is the parent table of a FK constraint, or +** (b) The table is the child table of a deferred FK constraint and it is +** determined at runtime that there are outstanding deferred FK +** constraint violations in the database, +** +** then the equivalent of "DELETE FROM " is executed before dropping +** the table from the database. Triggers are disabled while running this +** DELETE, but foreign key actions are not. +*/ +SQLITE_PRIVATE void sqlite3FkDropTable(Parse *pParse, SrcList *pName, Table *pTab){ + sqlite3 *db = pParse->db; + if( (db->flags&SQLITE_ForeignKeys) && !IsVirtual(pTab) && !pTab->pSelect ){ + int iSkip = 0; + Vdbe *v = sqlite3GetVdbe(pParse); + + assert( v ); /* VDBE has already been allocated */ + if( sqlite3FkReferences(pTab)==0 ){ + /* Search for a deferred foreign key constraint for which this table + ** is the child table. If one cannot be found, return without + ** generating any VDBE code. If one can be found, then jump over + ** the entire DELETE if there are no outstanding deferred constraints + ** when this statement is run. */ + FKey *p; + for(p=pTab->pFKey; p; p=p->pNextFrom){ + if( p->isDeferred || (db->flags & SQLITE_DeferFKs) ) break; + } + if( !p ) return; + iSkip = sqlite3VdbeMakeLabel(v); + sqlite3VdbeAddOp2(v, OP_FkIfZero, 1, iSkip); VdbeCoverage(v); + } + + pParse->disableTriggers = 1; + sqlite3DeleteFrom(pParse, sqlite3SrcListDup(db, pName, 0), 0); + pParse->disableTriggers = 0; + + /* If the DELETE has generated immediate foreign key constraint + ** violations, halt the VDBE and return an error at this point, before + ** any modifications to the schema are made. This is because statement + ** transactions are not able to rollback schema changes. + ** + ** If the SQLITE_DeferFKs flag is set, then this is not required, as + ** the statement transaction will not be rolled back even if FK + ** constraints are violated. + */ + if( (db->flags & SQLITE_DeferFKs)==0 ){ + sqlite3VdbeAddOp2(v, OP_FkIfZero, 0, sqlite3VdbeCurrentAddr(v)+2); + VdbeCoverage(v); + sqlite3HaltConstraint(pParse, SQLITE_CONSTRAINT_FOREIGNKEY, + OE_Abort, 0, P4_STATIC, P5_ConstraintFK); + } + + if( iSkip ){ + sqlite3VdbeResolveLabel(v, iSkip); + } + } +} + + +/* +** The second argument points to an FKey object representing a foreign key +** for which pTab is the child table. An UPDATE statement against pTab +** is currently being processed. For each column of the table that is +** actually updated, the corresponding element in the aChange[] array +** is zero or greater (if a column is unmodified the corresponding element +** is set to -1). If the rowid column is modified by the UPDATE statement +** the bChngRowid argument is non-zero. +** +** This function returns true if any of the columns that are part of the +** child key for FK constraint *p are modified. +*/ +static int fkChildIsModified( + Table *pTab, /* Table being updated */ + FKey *p, /* Foreign key for which pTab is the child */ + int *aChange, /* Array indicating modified columns */ + int bChngRowid /* True if rowid is modified by this update */ +){ + int i; + for(i=0; inCol; i++){ + int iChildKey = p->aCol[i].iFrom; + if( aChange[iChildKey]>=0 ) return 1; + if( iChildKey==pTab->iPKey && bChngRowid ) return 1; + } + return 0; +} + +/* +** The second argument points to an FKey object representing a foreign key +** for which pTab is the parent table. An UPDATE statement against pTab +** is currently being processed. For each column of the table that is +** actually updated, the corresponding element in the aChange[] array +** is zero or greater (if a column is unmodified the corresponding element +** is set to -1). If the rowid column is modified by the UPDATE statement +** the bChngRowid argument is non-zero. +** +** This function returns true if any of the columns that are part of the +** parent key for FK constraint *p are modified. +*/ +static int fkParentIsModified( + Table *pTab, + FKey *p, + int *aChange, + int bChngRowid +){ + int i; + for(i=0; inCol; i++){ + char *zKey = p->aCol[i].zCol; + int iKey; + for(iKey=0; iKeynCol; iKey++){ + if( aChange[iKey]>=0 || (iKey==pTab->iPKey && bChngRowid) ){ + Column *pCol = &pTab->aCol[iKey]; + if( zKey ){ + if( 0==sqlite3StrICmp(pCol->zName, zKey) ) return 1; + }else if( pCol->colFlags & COLFLAG_PRIMKEY ){ + return 1; + } + } + } + } + return 0; +} + +/* +** Return true if the parser passed as the first argument is being +** used to code a trigger that is really a "SET NULL" action belonging +** to trigger pFKey. +*/ +static int isSetNullAction(Parse *pParse, FKey *pFKey){ + Parse *pTop = sqlite3ParseToplevel(pParse); + if( pTop->pTriggerPrg ){ + Trigger *p = pTop->pTriggerPrg->pTrigger; + if( (p==pFKey->apTrigger[0] && pFKey->aAction[0]==OE_SetNull) + || (p==pFKey->apTrigger[1] && pFKey->aAction[1]==OE_SetNull) + ){ + return 1; + } + } + return 0; +} + +/* +** This function is called when inserting, deleting or updating a row of +** table pTab to generate VDBE code to perform foreign key constraint +** processing for the operation. +** +** For a DELETE operation, parameter regOld is passed the index of the +** first register in an array of (pTab->nCol+1) registers containing the +** rowid of the row being deleted, followed by each of the column values +** of the row being deleted, from left to right. Parameter regNew is passed +** zero in this case. +** +** For an INSERT operation, regOld is passed zero and regNew is passed the +** first register of an array of (pTab->nCol+1) registers containing the new +** row data. +** +** For an UPDATE operation, this function is called twice. Once before +** the original record is deleted from the table using the calling convention +** described for DELETE. Then again after the original record is deleted +** but before the new record is inserted using the INSERT convention. +*/ +SQLITE_PRIVATE void sqlite3FkCheck( + Parse *pParse, /* Parse context */ + Table *pTab, /* Row is being deleted from this table */ + int regOld, /* Previous row data is stored here */ + int regNew, /* New row data is stored here */ + int *aChange, /* Array indicating UPDATEd columns (or 0) */ + int bChngRowid /* True if rowid is UPDATEd */ +){ + sqlite3 *db = pParse->db; /* Database handle */ + FKey *pFKey; /* Used to iterate through FKs */ + int iDb; /* Index of database containing pTab */ + const char *zDb; /* Name of database containing pTab */ + int isIgnoreErrors = pParse->disableTriggers; + + /* Exactly one of regOld and regNew should be non-zero. */ + assert( (regOld==0)!=(regNew==0) ); + + /* If foreign-keys are disabled, this function is a no-op. */ + if( (db->flags&SQLITE_ForeignKeys)==0 ) return; + + iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + zDb = db->aDb[iDb].zDbSName; + + /* Loop through all the foreign key constraints for which pTab is the + ** child table (the table that the foreign key definition is part of). */ + for(pFKey=pTab->pFKey; pFKey; pFKey=pFKey->pNextFrom){ + Table *pTo; /* Parent table of foreign key pFKey */ + Index *pIdx = 0; /* Index on key columns in pTo */ + int *aiFree = 0; + int *aiCol; + int iCol; + int i; + int bIgnore = 0; + + if( aChange + && sqlite3_stricmp(pTab->zName, pFKey->zTo)!=0 + && fkChildIsModified(pTab, pFKey, aChange, bChngRowid)==0 + ){ + continue; + } + + /* Find the parent table of this foreign key. Also find a unique index + ** on the parent key columns in the parent table. If either of these + ** schema items cannot be located, set an error in pParse and return + ** early. */ + if( pParse->disableTriggers ){ + pTo = sqlite3FindTable(db, pFKey->zTo, zDb); + }else{ + pTo = sqlite3LocateTable(pParse, 0, pFKey->zTo, zDb); + } + if( !pTo || sqlite3FkLocateIndex(pParse, pTo, pFKey, &pIdx, &aiFree) ){ + assert( isIgnoreErrors==0 || (regOld!=0 && regNew==0) ); + if( !isIgnoreErrors || db->mallocFailed ) return; + if( pTo==0 ){ + /* If isIgnoreErrors is true, then a table is being dropped. In this + ** case SQLite runs a "DELETE FROM xxx" on the table being dropped + ** before actually dropping it in order to check FK constraints. + ** If the parent table of an FK constraint on the current table is + ** missing, behave as if it is empty. i.e. decrement the relevant + ** FK counter for each row of the current table with non-NULL keys. + */ + Vdbe *v = sqlite3GetVdbe(pParse); + int iJump = sqlite3VdbeCurrentAddr(v) + pFKey->nCol + 1; + for(i=0; inCol; i++){ + int iReg = pFKey->aCol[i].iFrom + regOld + 1; + sqlite3VdbeAddOp2(v, OP_IsNull, iReg, iJump); VdbeCoverage(v); + } + sqlite3VdbeAddOp2(v, OP_FkCounter, pFKey->isDeferred, -1); + } + continue; + } + assert( pFKey->nCol==1 || (aiFree && pIdx) ); + + if( aiFree ){ + aiCol = aiFree; + }else{ + iCol = pFKey->aCol[0].iFrom; + aiCol = &iCol; + } + for(i=0; inCol; i++){ + if( aiCol[i]==pTab->iPKey ){ + aiCol[i] = -1; + } + assert( pIdx==0 || pIdx->aiColumn[i]>=0 ); +#ifndef SQLITE_OMIT_AUTHORIZATION + /* Request permission to read the parent key columns. If the + ** authorization callback returns SQLITE_IGNORE, behave as if any + ** values read from the parent table are NULL. */ + if( db->xAuth ){ + int rcauth; + char *zCol = pTo->aCol[pIdx ? pIdx->aiColumn[i] : pTo->iPKey].zName; + rcauth = sqlite3AuthReadCol(pParse, pTo->zName, zCol, iDb); + bIgnore = (rcauth==SQLITE_IGNORE); + } +#endif + } + + /* Take a shared-cache advisory read-lock on the parent table. Allocate + ** a cursor to use to search the unique index on the parent key columns + ** in the parent table. */ + sqlite3TableLock(pParse, iDb, pTo->tnum, 0, pTo->zName); + pParse->nTab++; + + if( regOld!=0 ){ + /* A row is being removed from the child table. Search for the parent. + ** If the parent does not exist, removing the child row resolves an + ** outstanding foreign key constraint violation. */ + fkLookupParent(pParse, iDb, pTo, pIdx, pFKey, aiCol, regOld, -1, bIgnore); + } + if( regNew!=0 && !isSetNullAction(pParse, pFKey) ){ + /* A row is being added to the child table. If a parent row cannot + ** be found, adding the child row has violated the FK constraint. + ** + ** If this operation is being performed as part of a trigger program + ** that is actually a "SET NULL" action belonging to this very + ** foreign key, then omit this scan altogether. As all child key + ** values are guaranteed to be NULL, it is not possible for adding + ** this row to cause an FK violation. */ + fkLookupParent(pParse, iDb, pTo, pIdx, pFKey, aiCol, regNew, +1, bIgnore); + } + + sqlite3DbFree(db, aiFree); + } + + /* Loop through all the foreign key constraints that refer to this table. + ** (the "child" constraints) */ + for(pFKey = sqlite3FkReferences(pTab); pFKey; pFKey=pFKey->pNextTo){ + Index *pIdx = 0; /* Foreign key index for pFKey */ + SrcList *pSrc; + int *aiCol = 0; + + if( aChange && fkParentIsModified(pTab, pFKey, aChange, bChngRowid)==0 ){ + continue; + } + + if( !pFKey->isDeferred && !(db->flags & SQLITE_DeferFKs) + && !pParse->pToplevel && !pParse->isMultiWrite + ){ + assert( regOld==0 && regNew!=0 ); + /* Inserting a single row into a parent table cannot cause (or fix) + ** an immediate foreign key violation. So do nothing in this case. */ + continue; + } + + if( sqlite3FkLocateIndex(pParse, pTab, pFKey, &pIdx, &aiCol) ){ + if( !isIgnoreErrors || db->mallocFailed ) return; + continue; + } + assert( aiCol || pFKey->nCol==1 ); + + /* Create a SrcList structure containing the child table. We need the + ** child table as a SrcList for sqlite3WhereBegin() */ + pSrc = sqlite3SrcListAppend(db, 0, 0, 0); + if( pSrc ){ + struct SrcList_item *pItem = pSrc->a; + pItem->pTab = pFKey->pFrom; + pItem->zName = pFKey->pFrom->zName; + pItem->pTab->nRef++; + pItem->iCursor = pParse->nTab++; + + if( regNew!=0 ){ + fkScanChildren(pParse, pSrc, pTab, pIdx, pFKey, aiCol, regNew, -1); + } + if( regOld!=0 ){ + int eAction = pFKey->aAction[aChange!=0]; + fkScanChildren(pParse, pSrc, pTab, pIdx, pFKey, aiCol, regOld, 1); + /* If this is a deferred FK constraint, or a CASCADE or SET NULL + ** action applies, then any foreign key violations caused by + ** removing the parent key will be rectified by the action trigger. + ** So do not set the "may-abort" flag in this case. + ** + ** Note 1: If the FK is declared "ON UPDATE CASCADE", then the + ** may-abort flag will eventually be set on this statement anyway + ** (when this function is called as part of processing the UPDATE + ** within the action trigger). + ** + ** Note 2: At first glance it may seem like SQLite could simply omit + ** all OP_FkCounter related scans when either CASCADE or SET NULL + ** applies. The trouble starts if the CASCADE or SET NULL action + ** trigger causes other triggers or action rules attached to the + ** child table to fire. In these cases the fk constraint counters + ** might be set incorrectly if any OP_FkCounter related scans are + ** omitted. */ + if( !pFKey->isDeferred && eAction!=OE_Cascade && eAction!=OE_SetNull ){ + sqlite3MayAbort(pParse); + } + } + pItem->zName = 0; + sqlite3SrcListDelete(db, pSrc); + } + sqlite3DbFree(db, aiCol); + } +} + +#define COLUMN_MASK(x) (((x)>31) ? 0xffffffff : ((u32)1<<(x))) + +/* +** This function is called before generating code to update or delete a +** row contained in table pTab. +*/ +SQLITE_PRIVATE u32 sqlite3FkOldmask( + Parse *pParse, /* Parse context */ + Table *pTab /* Table being modified */ +){ + u32 mask = 0; + if( pParse->db->flags&SQLITE_ForeignKeys ){ + FKey *p; + int i; + for(p=pTab->pFKey; p; p=p->pNextFrom){ + for(i=0; inCol; i++) mask |= COLUMN_MASK(p->aCol[i].iFrom); + } + for(p=sqlite3FkReferences(pTab); p; p=p->pNextTo){ + Index *pIdx = 0; + sqlite3FkLocateIndex(pParse, pTab, p, &pIdx, 0); + if( pIdx ){ + for(i=0; inKeyCol; i++){ + assert( pIdx->aiColumn[i]>=0 ); + mask |= COLUMN_MASK(pIdx->aiColumn[i]); + } + } + } + } + return mask; +} + + +/* +** This function is called before generating code to update or delete a +** row contained in table pTab. If the operation is a DELETE, then +** parameter aChange is passed a NULL value. For an UPDATE, aChange points +** to an array of size N, where N is the number of columns in table pTab. +** If the i'th column is not modified by the UPDATE, then the corresponding +** entry in the aChange[] array is set to -1. If the column is modified, +** the value is 0 or greater. Parameter chngRowid is set to true if the +** UPDATE statement modifies the rowid fields of the table. +** +** If any foreign key processing will be required, this function returns +** true. If there is no foreign key related processing, this function +** returns false. +*/ +SQLITE_PRIVATE int sqlite3FkRequired( + Parse *pParse, /* Parse context */ + Table *pTab, /* Table being modified */ + int *aChange, /* Non-NULL for UPDATE operations */ + int chngRowid /* True for UPDATE that affects rowid */ +){ + if( pParse->db->flags&SQLITE_ForeignKeys ){ + if( !aChange ){ + /* A DELETE operation. Foreign key processing is required if the + ** table in question is either the child or parent table for any + ** foreign key constraint. */ + return (sqlite3FkReferences(pTab) || pTab->pFKey); + }else{ + /* This is an UPDATE. Foreign key processing is only required if the + ** operation modifies one or more child or parent key columns. */ + FKey *p; + + /* Check if any child key columns are being modified. */ + for(p=pTab->pFKey; p; p=p->pNextFrom){ + if( fkChildIsModified(pTab, p, aChange, chngRowid) ) return 1; + } + + /* Check if any parent key columns are being modified. */ + for(p=sqlite3FkReferences(pTab); p; p=p->pNextTo){ + if( fkParentIsModified(pTab, p, aChange, chngRowid) ) return 1; + } + } + } + return 0; +} + +/* +** This function is called when an UPDATE or DELETE operation is being +** compiled on table pTab, which is the parent table of foreign-key pFKey. +** If the current operation is an UPDATE, then the pChanges parameter is +** passed a pointer to the list of columns being modified. If it is a +** DELETE, pChanges is passed a NULL pointer. +** +** It returns a pointer to a Trigger structure containing a trigger +** equivalent to the ON UPDATE or ON DELETE action specified by pFKey. +** If the action is "NO ACTION" or "RESTRICT", then a NULL pointer is +** returned (these actions require no special handling by the triggers +** sub-system, code for them is created by fkScanChildren()). +** +** For example, if pFKey is the foreign key and pTab is table "p" in +** the following schema: +** +** CREATE TABLE p(pk PRIMARY KEY); +** CREATE TABLE c(ck REFERENCES p ON DELETE CASCADE); +** +** then the returned trigger structure is equivalent to: +** +** CREATE TRIGGER ... DELETE ON p BEGIN +** DELETE FROM c WHERE ck = old.pk; +** END; +** +** The returned pointer is cached as part of the foreign key object. It +** is eventually freed along with the rest of the foreign key object by +** sqlite3FkDelete(). +*/ +static Trigger *fkActionTrigger( + Parse *pParse, /* Parse context */ + Table *pTab, /* Table being updated or deleted from */ + FKey *pFKey, /* Foreign key to get action for */ + ExprList *pChanges /* Change-list for UPDATE, NULL for DELETE */ +){ + sqlite3 *db = pParse->db; /* Database handle */ + int action; /* One of OE_None, OE_Cascade etc. */ + Trigger *pTrigger; /* Trigger definition to return */ + int iAction = (pChanges!=0); /* 1 for UPDATE, 0 for DELETE */ + + action = pFKey->aAction[iAction]; + if( action==OE_Restrict && (db->flags & SQLITE_DeferFKs) ){ + return 0; + } + pTrigger = pFKey->apTrigger[iAction]; + + if( action!=OE_None && !pTrigger ){ + char const *zFrom; /* Name of child table */ + int nFrom; /* Length in bytes of zFrom */ + Index *pIdx = 0; /* Parent key index for this FK */ + int *aiCol = 0; /* child table cols -> parent key cols */ + TriggerStep *pStep = 0; /* First (only) step of trigger program */ + Expr *pWhere = 0; /* WHERE clause of trigger step */ + ExprList *pList = 0; /* Changes list if ON UPDATE CASCADE */ + Select *pSelect = 0; /* If RESTRICT, "SELECT RAISE(...)" */ + int i; /* Iterator variable */ + Expr *pWhen = 0; /* WHEN clause for the trigger */ + + if( sqlite3FkLocateIndex(pParse, pTab, pFKey, &pIdx, &aiCol) ) return 0; + assert( aiCol || pFKey->nCol==1 ); + + for(i=0; inCol; i++){ + Token tOld = { "old", 3 }; /* Literal "old" token */ + Token tNew = { "new", 3 }; /* Literal "new" token */ + Token tFromCol; /* Name of column in child table */ + Token tToCol; /* Name of column in parent table */ + int iFromCol; /* Idx of column in child table */ + Expr *pEq; /* tFromCol = OLD.tToCol */ + + iFromCol = aiCol ? aiCol[i] : pFKey->aCol[0].iFrom; + assert( iFromCol>=0 ); + assert( pIdx!=0 || (pTab->iPKey>=0 && pTab->iPKeynCol) ); + assert( pIdx==0 || pIdx->aiColumn[i]>=0 ); + sqlite3TokenInit(&tToCol, + pTab->aCol[pIdx ? pIdx->aiColumn[i] : pTab->iPKey].zName); + sqlite3TokenInit(&tFromCol, pFKey->pFrom->aCol[iFromCol].zName); + + /* Create the expression "OLD.zToCol = zFromCol". It is important + ** that the "OLD.zToCol" term is on the LHS of the = operator, so + ** that the affinity and collation sequence associated with the + ** parent table are used for the comparison. */ + pEq = sqlite3PExpr(pParse, TK_EQ, + sqlite3PExpr(pParse, TK_DOT, + sqlite3ExprAlloc(db, TK_ID, &tOld, 0), + sqlite3ExprAlloc(db, TK_ID, &tToCol, 0) + , 0), + sqlite3ExprAlloc(db, TK_ID, &tFromCol, 0) + , 0); + pWhere = sqlite3ExprAnd(db, pWhere, pEq); + + /* For ON UPDATE, construct the next term of the WHEN clause. + ** The final WHEN clause will be like this: + ** + ** WHEN NOT(old.col1 IS new.col1 AND ... AND old.colN IS new.colN) + */ + if( pChanges ){ + pEq = sqlite3PExpr(pParse, TK_IS, + sqlite3PExpr(pParse, TK_DOT, + sqlite3ExprAlloc(db, TK_ID, &tOld, 0), + sqlite3ExprAlloc(db, TK_ID, &tToCol, 0), + 0), + sqlite3PExpr(pParse, TK_DOT, + sqlite3ExprAlloc(db, TK_ID, &tNew, 0), + sqlite3ExprAlloc(db, TK_ID, &tToCol, 0), + 0), + 0); + pWhen = sqlite3ExprAnd(db, pWhen, pEq); + } + + if( action!=OE_Restrict && (action!=OE_Cascade || pChanges) ){ + Expr *pNew; + if( action==OE_Cascade ){ + pNew = sqlite3PExpr(pParse, TK_DOT, + sqlite3ExprAlloc(db, TK_ID, &tNew, 0), + sqlite3ExprAlloc(db, TK_ID, &tToCol, 0) + , 0); + }else if( action==OE_SetDflt ){ + Expr *pDflt = pFKey->pFrom->aCol[iFromCol].pDflt; + if( pDflt ){ + pNew = sqlite3ExprDup(db, pDflt, 0); + }else{ + pNew = sqlite3ExprAlloc(db, TK_NULL, 0, 0); + } + }else{ + pNew = sqlite3ExprAlloc(db, TK_NULL, 0, 0); + } + pList = sqlite3ExprListAppend(pParse, pList, pNew); + sqlite3ExprListSetName(pParse, pList, &tFromCol, 0); + } + } + sqlite3DbFree(db, aiCol); + + zFrom = pFKey->pFrom->zName; + nFrom = sqlite3Strlen30(zFrom); + + if( action==OE_Restrict ){ + Token tFrom; + Expr *pRaise; + + tFrom.z = zFrom; + tFrom.n = nFrom; + pRaise = sqlite3Expr(db, TK_RAISE, "FOREIGN KEY constraint failed"); + if( pRaise ){ + pRaise->affinity = OE_Abort; + } + pSelect = sqlite3SelectNew(pParse, + sqlite3ExprListAppend(pParse, 0, pRaise), + sqlite3SrcListAppend(db, 0, &tFrom, 0), + pWhere, + 0, 0, 0, 0, 0, 0 + ); + pWhere = 0; + } + + /* Disable lookaside memory allocation */ + db->lookaside.bDisable++; + + pTrigger = (Trigger *)sqlite3DbMallocZero(db, + sizeof(Trigger) + /* struct Trigger */ + sizeof(TriggerStep) + /* Single step in trigger program */ + nFrom + 1 /* Space for pStep->zTarget */ + ); + if( pTrigger ){ + pStep = pTrigger->step_list = (TriggerStep *)&pTrigger[1]; + pStep->zTarget = (char *)&pStep[1]; + memcpy((char *)pStep->zTarget, zFrom, nFrom); + + pStep->pWhere = sqlite3ExprDup(db, pWhere, EXPRDUP_REDUCE); + pStep->pExprList = sqlite3ExprListDup(db, pList, EXPRDUP_REDUCE); + pStep->pSelect = sqlite3SelectDup(db, pSelect, EXPRDUP_REDUCE); + if( pWhen ){ + pWhen = sqlite3PExpr(pParse, TK_NOT, pWhen, 0, 0); + pTrigger->pWhen = sqlite3ExprDup(db, pWhen, EXPRDUP_REDUCE); + } + } + + /* Re-enable the lookaside buffer, if it was disabled earlier. */ + db->lookaside.bDisable--; + + sqlite3ExprDelete(db, pWhere); + sqlite3ExprDelete(db, pWhen); + sqlite3ExprListDelete(db, pList); + sqlite3SelectDelete(db, pSelect); + if( db->mallocFailed==1 ){ + fkTriggerDelete(db, pTrigger); + return 0; + } + assert( pStep!=0 ); + + switch( action ){ + case OE_Restrict: + pStep->op = TK_SELECT; + break; + case OE_Cascade: + if( !pChanges ){ + pStep->op = TK_DELETE; + break; + } + default: + pStep->op = TK_UPDATE; + } + pStep->pTrig = pTrigger; + pTrigger->pSchema = pTab->pSchema; + pTrigger->pTabSchema = pTab->pSchema; + pFKey->apTrigger[iAction] = pTrigger; + pTrigger->op = (pChanges ? TK_UPDATE : TK_DELETE); + } + + return pTrigger; +} + +/* +** This function is called when deleting or updating a row to implement +** any required CASCADE, SET NULL or SET DEFAULT actions. +*/ +SQLITE_PRIVATE void sqlite3FkActions( + Parse *pParse, /* Parse context */ + Table *pTab, /* Table being updated or deleted from */ + ExprList *pChanges, /* Change-list for UPDATE, NULL for DELETE */ + int regOld, /* Address of array containing old row */ + int *aChange, /* Array indicating UPDATEd columns (or 0) */ + int bChngRowid /* True if rowid is UPDATEd */ +){ + /* If foreign-key support is enabled, iterate through all FKs that + ** refer to table pTab. If there is an action associated with the FK + ** for this operation (either update or delete), invoke the associated + ** trigger sub-program. */ + if( pParse->db->flags&SQLITE_ForeignKeys ){ + FKey *pFKey; /* Iterator variable */ + for(pFKey = sqlite3FkReferences(pTab); pFKey; pFKey=pFKey->pNextTo){ + if( aChange==0 || fkParentIsModified(pTab, pFKey, aChange, bChngRowid) ){ + Trigger *pAct = fkActionTrigger(pParse, pTab, pFKey, pChanges); + if( pAct ){ + sqlite3CodeRowTriggerDirect(pParse, pAct, pTab, regOld, OE_Abort, 0); + } + } + } + } +} + +#endif /* ifndef SQLITE_OMIT_TRIGGER */ + +/* +** Free all memory associated with foreign key definitions attached to +** table pTab. Remove the deleted foreign keys from the Schema.fkeyHash +** hash table. +*/ +SQLITE_PRIVATE void sqlite3FkDelete(sqlite3 *db, Table *pTab){ + FKey *pFKey; /* Iterator variable */ + FKey *pNext; /* Copy of pFKey->pNextFrom */ + + assert( db==0 || IsVirtual(pTab) + || sqlite3SchemaMutexHeld(db, 0, pTab->pSchema) ); + for(pFKey=pTab->pFKey; pFKey; pFKey=pNext){ + + /* Remove the FK from the fkeyHash hash table. */ + if( !db || db->pnBytesFreed==0 ){ + if( pFKey->pPrevTo ){ + pFKey->pPrevTo->pNextTo = pFKey->pNextTo; + }else{ + void *p = (void *)pFKey->pNextTo; + const char *z = (p ? pFKey->pNextTo->zTo : pFKey->zTo); + sqlite3HashInsert(&pTab->pSchema->fkeyHash, z, p); + } + if( pFKey->pNextTo ){ + pFKey->pNextTo->pPrevTo = pFKey->pPrevTo; + } + } + + /* EV: R-30323-21917 Each foreign key constraint in SQLite is + ** classified as either immediate or deferred. + */ + assert( pFKey->isDeferred==0 || pFKey->isDeferred==1 ); + + /* Delete any triggers created to implement actions for this FK. */ +#ifndef SQLITE_OMIT_TRIGGER + fkTriggerDelete(db, pFKey->apTrigger[0]); + fkTriggerDelete(db, pFKey->apTrigger[1]); +#endif + + pNext = pFKey->pNextFrom; + sqlite3DbFree(db, pFKey); + } +} +#endif /* ifndef SQLITE_OMIT_FOREIGN_KEY */ + +/************** End of fkey.c ************************************************/ +/************** Begin file insert.c ******************************************/ +/* +** 2001 September 15 +** +** 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 C code routines that are called by the parser +** to handle INSERT statements in SQLite. +*/ +/* #include "sqliteInt.h" */ + +/* +** Generate code that will +** +** (1) acquire a lock for table pTab then +** (2) open pTab as cursor iCur. +** +** If pTab is a WITHOUT ROWID table, then it is the PRIMARY KEY index +** for that table that is actually opened. +*/ +SQLITE_PRIVATE void sqlite3OpenTable( + Parse *pParse, /* Generate code into this VDBE */ + int iCur, /* The cursor number of the table */ + int iDb, /* The database index in sqlite3.aDb[] */ + Table *pTab, /* The table to be opened */ + int opcode /* OP_OpenRead or OP_OpenWrite */ +){ + Vdbe *v; + assert( !IsVirtual(pTab) ); + v = sqlite3GetVdbe(pParse); + assert( opcode==OP_OpenWrite || opcode==OP_OpenRead ); + sqlite3TableLock(pParse, iDb, pTab->tnum, + (opcode==OP_OpenWrite)?1:0, pTab->zName); + if( HasRowid(pTab) ){ + sqlite3VdbeAddOp4Int(v, opcode, iCur, pTab->tnum, iDb, pTab->nCol); + VdbeComment((v, "%s", pTab->zName)); + }else{ + Index *pPk = sqlite3PrimaryKeyIndex(pTab); + assert( pPk!=0 ); + assert( pPk->tnum==pTab->tnum ); + sqlite3VdbeAddOp3(v, opcode, iCur, pPk->tnum, iDb); + sqlite3VdbeSetP4KeyInfo(pParse, pPk); + VdbeComment((v, "%s", pTab->zName)); + } +} + +/* +** Return a pointer to the column affinity string associated with index +** pIdx. A column affinity string has one character for each column in +** the table, according to the affinity of the column: +** +** Character Column affinity +** ------------------------------ +** 'A' BLOB +** 'B' TEXT +** 'C' NUMERIC +** 'D' INTEGER +** 'F' REAL +** +** An extra 'D' is appended to the end of the string to cover the +** rowid that appears as the last column in every index. +** +** Memory for the buffer containing the column index affinity string +** is managed along with the rest of the Index structure. It will be +** released when sqlite3DeleteIndex() is called. +*/ +SQLITE_PRIVATE const char *sqlite3IndexAffinityStr(sqlite3 *db, Index *pIdx){ + if( !pIdx->zColAff ){ + /* The first time a column affinity string for a particular index is + ** required, it is allocated and populated here. It is then stored as + ** a member of the Index structure for subsequent use. + ** + ** The column affinity string will eventually be deleted by + ** sqliteDeleteIndex() when the Index structure itself is cleaned + ** up. + */ + int n; + Table *pTab = pIdx->pTable; + pIdx->zColAff = (char *)sqlite3DbMallocRaw(0, pIdx->nColumn+1); + if( !pIdx->zColAff ){ + sqlite3OomFault(db); + return 0; + } + for(n=0; nnColumn; n++){ + i16 x = pIdx->aiColumn[n]; + if( x>=0 ){ + pIdx->zColAff[n] = pTab->aCol[x].affinity; + }else if( x==XN_ROWID ){ + pIdx->zColAff[n] = SQLITE_AFF_INTEGER; + }else{ + char aff; + assert( x==XN_EXPR ); + assert( pIdx->aColExpr!=0 ); + aff = sqlite3ExprAffinity(pIdx->aColExpr->a[n].pExpr); + if( aff==0 ) aff = SQLITE_AFF_BLOB; + pIdx->zColAff[n] = aff; + } + } + pIdx->zColAff[n] = 0; + } + + return pIdx->zColAff; +} + +/* +** Compute the affinity string for table pTab, if it has not already been +** computed. As an optimization, omit trailing SQLITE_AFF_BLOB affinities. +** +** If the affinity exists (if it is no entirely SQLITE_AFF_BLOB values) and +** if iReg>0 then code an OP_Affinity opcode that will set the affinities +** for register iReg and following. Or if affinities exists and iReg==0, +** then just set the P4 operand of the previous opcode (which should be +** an OP_MakeRecord) to the affinity string. +** +** A column affinity string has one character per column: +** +** Character Column affinity +** ------------------------------ +** 'A' BLOB +** 'B' TEXT +** 'C' NUMERIC +** 'D' INTEGER +** 'E' REAL +*/ +SQLITE_PRIVATE void sqlite3TableAffinity(Vdbe *v, Table *pTab, int iReg){ + int i; + char *zColAff = pTab->zColAff; + if( zColAff==0 ){ + sqlite3 *db = sqlite3VdbeDb(v); + zColAff = (char *)sqlite3DbMallocRaw(0, pTab->nCol+1); + if( !zColAff ){ + sqlite3OomFault(db); + return; + } + + for(i=0; inCol; i++){ + zColAff[i] = pTab->aCol[i].affinity; + } + do{ + zColAff[i--] = 0; + }while( i>=0 && zColAff[i]==SQLITE_AFF_BLOB ); + pTab->zColAff = zColAff; + } + i = sqlite3Strlen30(zColAff); + if( i ){ + if( iReg ){ + sqlite3VdbeAddOp4(v, OP_Affinity, iReg, i, 0, zColAff, i); + }else{ + sqlite3VdbeChangeP4(v, -1, zColAff, i); + } + } +} + +/* +** Return non-zero if the table pTab in database iDb or any of its indices +** have been opened at any point in the VDBE program. This is used to see if +** a statement of the form "INSERT INTO SELECT ..." can +** run without using a temporary table for the results of the SELECT. +*/ +static int readsTable(Parse *p, int iDb, Table *pTab){ + Vdbe *v = sqlite3GetVdbe(p); + int i; + int iEnd = sqlite3VdbeCurrentAddr(v); +#ifndef SQLITE_OMIT_VIRTUALTABLE + VTable *pVTab = IsVirtual(pTab) ? sqlite3GetVTable(p->db, pTab) : 0; +#endif + + for(i=1; iopcode==OP_OpenRead && pOp->p3==iDb ){ + Index *pIndex; + int tnum = pOp->p2; + if( tnum==pTab->tnum ){ + return 1; + } + for(pIndex=pTab->pIndex; pIndex; pIndex=pIndex->pNext){ + if( tnum==pIndex->tnum ){ + return 1; + } + } + } +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( pOp->opcode==OP_VOpen && pOp->p4.pVtab==pVTab ){ + assert( pOp->p4.pVtab!=0 ); + assert( pOp->p4type==P4_VTAB ); + return 1; + } +#endif + } + return 0; +} + +#ifndef SQLITE_OMIT_AUTOINCREMENT +/* +** Locate or create an AutoincInfo structure associated with table pTab +** which is in database iDb. Return the register number for the register +** that holds the maximum rowid. Return zero if pTab is not an AUTOINCREMENT +** table. (Also return zero when doing a VACUUM since we do not want to +** update the AUTOINCREMENT counters during a VACUUM.) +** +** There is at most one AutoincInfo structure per table even if the +** same table is autoincremented multiple times due to inserts within +** triggers. A new AutoincInfo structure is created if this is the +** first use of table pTab. On 2nd and subsequent uses, the original +** AutoincInfo structure is used. +** +** Three memory locations are allocated: +** +** (1) Register to hold the name of the pTab table. +** (2) Register to hold the maximum ROWID of pTab. +** (3) Register to hold the rowid in sqlite_sequence of pTab +** +** The 2nd register is the one that is returned. That is all the +** insert routine needs to know about. +*/ +static int autoIncBegin( + Parse *pParse, /* Parsing context */ + int iDb, /* Index of the database holding pTab */ + Table *pTab /* The table we are writing to */ +){ + int memId = 0; /* Register holding maximum rowid */ + if( (pTab->tabFlags & TF_Autoincrement)!=0 + && (pParse->db->flags & SQLITE_Vacuum)==0 + ){ + Parse *pToplevel = sqlite3ParseToplevel(pParse); + AutoincInfo *pInfo; + + pInfo = pToplevel->pAinc; + while( pInfo && pInfo->pTab!=pTab ){ pInfo = pInfo->pNext; } + if( pInfo==0 ){ + pInfo = sqlite3DbMallocRawNN(pParse->db, sizeof(*pInfo)); + if( pInfo==0 ) return 0; + pInfo->pNext = pToplevel->pAinc; + pToplevel->pAinc = pInfo; + pInfo->pTab = pTab; + pInfo->iDb = iDb; + pToplevel->nMem++; /* Register to hold name of table */ + pInfo->regCtr = ++pToplevel->nMem; /* Max rowid register */ + pToplevel->nMem++; /* Rowid in sqlite_sequence */ + } + memId = pInfo->regCtr; + } + return memId; +} + +/* +** This routine generates code that will initialize all of the +** register used by the autoincrement tracker. +*/ +SQLITE_PRIVATE void sqlite3AutoincrementBegin(Parse *pParse){ + AutoincInfo *p; /* Information about an AUTOINCREMENT */ + sqlite3 *db = pParse->db; /* The database connection */ + Db *pDb; /* Database only autoinc table */ + int memId; /* Register holding max rowid */ + Vdbe *v = pParse->pVdbe; /* VDBE under construction */ + + /* This routine is never called during trigger-generation. It is + ** only called from the top-level */ + assert( pParse->pTriggerTab==0 ); + assert( sqlite3IsToplevel(pParse) ); + + assert( v ); /* We failed long ago if this is not so */ + for(p = pParse->pAinc; p; p = p->pNext){ + static const int iLn = VDBE_OFFSET_LINENO(2); + static const VdbeOpList autoInc[] = { + /* 0 */ {OP_Null, 0, 0, 0}, + /* 1 */ {OP_Rewind, 0, 9, 0}, + /* 2 */ {OP_Column, 0, 0, 0}, + /* 3 */ {OP_Ne, 0, 7, 0}, + /* 4 */ {OP_Rowid, 0, 0, 0}, + /* 5 */ {OP_Column, 0, 1, 0}, + /* 6 */ {OP_Goto, 0, 9, 0}, + /* 7 */ {OP_Next, 0, 2, 0}, + /* 8 */ {OP_Integer, 0, 0, 0}, + /* 9 */ {OP_Close, 0, 0, 0} + }; + VdbeOp *aOp; + pDb = &db->aDb[p->iDb]; + memId = p->regCtr; + assert( sqlite3SchemaMutexHeld(db, 0, pDb->pSchema) ); + sqlite3OpenTable(pParse, 0, p->iDb, pDb->pSchema->pSeqTab, OP_OpenRead); + sqlite3VdbeLoadString(v, memId-1, p->pTab->zName); + aOp = sqlite3VdbeAddOpList(v, ArraySize(autoInc), autoInc, iLn); + if( aOp==0 ) break; + aOp[0].p2 = memId; + aOp[0].p3 = memId+1; + aOp[2].p3 = memId; + aOp[3].p1 = memId-1; + aOp[3].p3 = memId; + aOp[3].p5 = SQLITE_JUMPIFNULL; + aOp[4].p2 = memId+1; + aOp[5].p3 = memId; + aOp[8].p2 = memId; + } +} + +/* +** Update the maximum rowid for an autoincrement calculation. +** +** This routine should be called when the regRowid register holds a +** new rowid that is about to be inserted. If that new rowid is +** larger than the maximum rowid in the memId memory cell, then the +** memory cell is updated. +*/ +static void autoIncStep(Parse *pParse, int memId, int regRowid){ + if( memId>0 ){ + sqlite3VdbeAddOp2(pParse->pVdbe, OP_MemMax, memId, regRowid); + } +} + +/* +** This routine generates the code needed to write autoincrement +** maximum rowid values back into the sqlite_sequence register. +** Every statement that might do an INSERT into an autoincrement +** table (either directly or through triggers) needs to call this +** routine just before the "exit" code. +*/ +static SQLITE_NOINLINE void autoIncrementEnd(Parse *pParse){ + AutoincInfo *p; + Vdbe *v = pParse->pVdbe; + sqlite3 *db = pParse->db; + + assert( v ); + for(p = pParse->pAinc; p; p = p->pNext){ + static const int iLn = VDBE_OFFSET_LINENO(2); + static const VdbeOpList autoIncEnd[] = { + /* 0 */ {OP_NotNull, 0, 2, 0}, + /* 1 */ {OP_NewRowid, 0, 0, 0}, + /* 2 */ {OP_MakeRecord, 0, 2, 0}, + /* 3 */ {OP_Insert, 0, 0, 0}, + /* 4 */ {OP_Close, 0, 0, 0} + }; + VdbeOp *aOp; + Db *pDb = &db->aDb[p->iDb]; + int iRec; + int memId = p->regCtr; + + iRec = sqlite3GetTempReg(pParse); + assert( sqlite3SchemaMutexHeld(db, 0, pDb->pSchema) ); + sqlite3OpenTable(pParse, 0, p->iDb, pDb->pSchema->pSeqTab, OP_OpenWrite); + aOp = sqlite3VdbeAddOpList(v, ArraySize(autoIncEnd), autoIncEnd, iLn); + if( aOp==0 ) break; + aOp[0].p1 = memId+1; + aOp[1].p2 = memId+1; + aOp[2].p1 = memId-1; + aOp[2].p3 = iRec; + aOp[3].p2 = iRec; + aOp[3].p3 = memId+1; + aOp[3].p5 = OPFLAG_APPEND; + sqlite3ReleaseTempReg(pParse, iRec); + } +} +SQLITE_PRIVATE void sqlite3AutoincrementEnd(Parse *pParse){ + if( pParse->pAinc ) autoIncrementEnd(pParse); +} +#else +/* +** If SQLITE_OMIT_AUTOINCREMENT is defined, then the three routines +** above are all no-ops +*/ +# define autoIncBegin(A,B,C) (0) +# define autoIncStep(A,B,C) +#endif /* SQLITE_OMIT_AUTOINCREMENT */ + + +/* Forward declaration */ +static int xferOptimization( + Parse *pParse, /* Parser context */ + Table *pDest, /* The table we are inserting into */ + Select *pSelect, /* A SELECT statement to use as the data source */ + int onError, /* How to handle constraint errors */ + int iDbDest /* The database of pDest */ +); + +/* +** This routine is called to handle SQL of the following forms: +** +** insert into TABLE (IDLIST) values(EXPRLIST),(EXPRLIST),... +** insert into TABLE (IDLIST) select +** insert into TABLE (IDLIST) default values +** +** The IDLIST following the table name is always optional. If omitted, +** then a list of all (non-hidden) columns for the table is substituted. +** The IDLIST appears in the pColumn parameter. pColumn is NULL if IDLIST +** is omitted. +** +** For the pSelect parameter holds the values to be inserted for the +** first two forms shown above. A VALUES clause is really just short-hand +** for a SELECT statement that omits the FROM clause and everything else +** that follows. If the pSelect parameter is NULL, that means that the +** DEFAULT VALUES form of the INSERT statement is intended. +** +** The code generated follows one of four templates. For a simple +** insert with data coming from a single-row VALUES clause, the code executes +** once straight down through. Pseudo-code follows (we call this +** the "1st template"): +** +** open write cursor to
      and its indices +** put VALUES clause expressions into registers +** write the resulting record into
      +** cleanup +** +** The three remaining templates assume the statement is of the form +** +** INSERT INTO
      SELECT ... +** +** If the SELECT clause is of the restricted form "SELECT * FROM " - +** in other words if the SELECT pulls all columns from a single table +** and there is no WHERE or LIMIT or GROUP BY or ORDER BY clauses, and +** if and are distinct tables but have identical +** schemas, including all the same indices, then a special optimization +** is invoked that copies raw records from over to . +** See the xferOptimization() function for the implementation of this +** template. This is the 2nd template. +** +** open a write cursor to
      +** open read cursor on +** transfer all records in over to
      +** close cursors +** foreach index on
      +** open a write cursor on the
      index +** open a read cursor on the corresponding index +** transfer all records from the read to the write cursors +** close cursors +** end foreach +** +** The 3rd template is for when the second template does not apply +** and the SELECT clause does not read from
      at any time. +** The generated code follows this template: +** +** X <- A +** goto B +** A: setup for the SELECT +** loop over the rows in the SELECT +** load values into registers R..R+n +** yield X +** end loop +** cleanup after the SELECT +** end-coroutine X +** B: open write cursor to
      and its indices +** C: yield X, at EOF goto D +** insert the select result into
      from R..R+n +** goto C +** D: cleanup +** +** The 4th template is used if the insert statement takes its +** values from a SELECT but the data is being inserted into a table +** that is also read as part of the SELECT. In the third form, +** we have to use an intermediate table to store the results of +** the select. The template is like this: +** +** X <- A +** goto B +** A: setup for the SELECT +** loop over the tables in the SELECT +** load value into register R..R+n +** yield X +** end loop +** cleanup after the SELECT +** end co-routine R +** B: open temp table +** L: yield X, at EOF goto M +** insert row from R..R+n into temp table +** goto L +** M: open write cursor to
      and its indices +** rewind temp table +** C: loop over rows of intermediate table +** transfer values form intermediate table into
      +** end loop +** D: cleanup +*/ +SQLITE_PRIVATE void sqlite3Insert( + Parse *pParse, /* Parser context */ + SrcList *pTabList, /* Name of table into which we are inserting */ + Select *pSelect, /* A SELECT statement to use as the data source */ + IdList *pColumn, /* Column names corresponding to IDLIST. */ + int onError /* How to handle constraint errors */ +){ + sqlite3 *db; /* The main database structure */ + Table *pTab; /* The table to insert into. aka TABLE */ + char *zTab; /* Name of the table into which we are inserting */ + int i, j, idx; /* Loop counters */ + Vdbe *v; /* Generate code into this virtual machine */ + Index *pIdx; /* For looping over indices of the table */ + int nColumn; /* Number of columns in the data */ + int nHidden = 0; /* Number of hidden columns if TABLE is virtual */ + int iDataCur = 0; /* VDBE cursor that is the main data repository */ + int iIdxCur = 0; /* First index cursor */ + int ipkColumn = -1; /* Column that is the INTEGER PRIMARY KEY */ + int endOfLoop; /* Label for the end of the insertion loop */ + int srcTab = 0; /* Data comes from this temporary cursor if >=0 */ + int addrInsTop = 0; /* Jump to label "D" */ + int addrCont = 0; /* Top of insert loop. Label "C" in templates 3 and 4 */ + SelectDest dest; /* Destination for SELECT on rhs of INSERT */ + int iDb; /* Index of database holding TABLE */ + u8 useTempTable = 0; /* Store SELECT results in intermediate table */ + u8 appendFlag = 0; /* True if the insert is likely to be an append */ + u8 withoutRowid; /* 0 for normal table. 1 for WITHOUT ROWID table */ + u8 bIdListInOrder; /* True if IDLIST is in table order */ + ExprList *pList = 0; /* List of VALUES() to be inserted */ + + /* Register allocations */ + int regFromSelect = 0;/* Base register for data coming from SELECT */ + int regAutoinc = 0; /* Register holding the AUTOINCREMENT counter */ + int regRowCount = 0; /* Memory cell used for the row counter */ + int regIns; /* Block of regs holding rowid+data being inserted */ + int regRowid; /* registers holding insert rowid */ + int regData; /* register holding first column to insert */ + int *aRegIdx = 0; /* One register allocated to each index */ + +#ifndef SQLITE_OMIT_TRIGGER + int isView; /* True if attempting to insert into a view */ + Trigger *pTrigger; /* List of triggers on pTab, if required */ + int tmask; /* Mask of trigger times */ +#endif + + db = pParse->db; + memset(&dest, 0, sizeof(dest)); + if( pParse->nErr || db->mallocFailed ){ + goto insert_cleanup; + } + + /* If the Select object is really just a simple VALUES() list with a + ** single row (the common case) then keep that one row of values + ** and discard the other (unused) parts of the pSelect object + */ + if( pSelect && (pSelect->selFlags & SF_Values)!=0 && pSelect->pPrior==0 ){ + pList = pSelect->pEList; + pSelect->pEList = 0; + sqlite3SelectDelete(db, pSelect); + pSelect = 0; + } + + /* Locate the table into which we will be inserting new information. + */ + assert( pTabList->nSrc==1 ); + zTab = pTabList->a[0].zName; + if( NEVER(zTab==0) ) goto insert_cleanup; + pTab = sqlite3SrcListLookup(pParse, pTabList); + if( pTab==0 ){ + goto insert_cleanup; + } + iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + assert( iDbnDb ); + if( sqlite3AuthCheck(pParse, SQLITE_INSERT, pTab->zName, 0, + db->aDb[iDb].zDbSName) ){ + goto insert_cleanup; + } + withoutRowid = !HasRowid(pTab); + + /* Figure out if we have any triggers and if the table being + ** inserted into is a view + */ +#ifndef SQLITE_OMIT_TRIGGER + pTrigger = sqlite3TriggersExist(pParse, pTab, TK_INSERT, 0, &tmask); + isView = pTab->pSelect!=0; +#else +# define pTrigger 0 +# define tmask 0 +# define isView 0 +#endif +#ifdef SQLITE_OMIT_VIEW +# undef isView +# define isView 0 +#endif + assert( (pTrigger && tmask) || (pTrigger==0 && tmask==0) ); + + /* If pTab is really a view, make sure it has been initialized. + ** ViewGetColumnNames() is a no-op if pTab is not a view. + */ + if( sqlite3ViewGetColumnNames(pParse, pTab) ){ + goto insert_cleanup; + } + + /* Cannot insert into a read-only table. + */ + if( sqlite3IsReadOnly(pParse, pTab, tmask) ){ + goto insert_cleanup; + } + + /* Allocate a VDBE + */ + v = sqlite3GetVdbe(pParse); + if( v==0 ) goto insert_cleanup; + if( pParse->nested==0 ) sqlite3VdbeCountChanges(v); + sqlite3BeginWriteOperation(pParse, pSelect || pTrigger, iDb); + +#ifndef SQLITE_OMIT_XFER_OPT + /* If the statement is of the form + ** + ** INSERT INTO SELECT * FROM ; + ** + ** Then special optimizations can be applied that make the transfer + ** very fast and which reduce fragmentation of indices. + ** + ** This is the 2nd template. + */ + if( pColumn==0 && xferOptimization(pParse, pTab, pSelect, onError, iDb) ){ + assert( !pTrigger ); + assert( pList==0 ); + goto insert_end; + } +#endif /* SQLITE_OMIT_XFER_OPT */ + + /* If this is an AUTOINCREMENT table, look up the sequence number in the + ** sqlite_sequence table and store it in memory cell regAutoinc. + */ + regAutoinc = autoIncBegin(pParse, iDb, pTab); + + /* Allocate registers for holding the rowid of the new row, + ** the content of the new row, and the assembled row record. + */ + regRowid = regIns = pParse->nMem+1; + pParse->nMem += pTab->nCol + 1; + if( IsVirtual(pTab) ){ + regRowid++; + pParse->nMem++; + } + regData = regRowid+1; + + /* If the INSERT statement included an IDLIST term, then make sure + ** all elements of the IDLIST really are columns of the table and + ** remember the column indices. + ** + ** If the table has an INTEGER PRIMARY KEY column and that column + ** is named in the IDLIST, then record in the ipkColumn variable + ** the index into IDLIST of the primary key column. ipkColumn is + ** the index of the primary key as it appears in IDLIST, not as + ** is appears in the original table. (The index of the INTEGER + ** PRIMARY KEY in the original table is pTab->iPKey.) + */ + bIdListInOrder = (pTab->tabFlags & TF_OOOHidden)==0; + if( pColumn ){ + for(i=0; inId; i++){ + pColumn->a[i].idx = -1; + } + for(i=0; inId; i++){ + for(j=0; jnCol; j++){ + if( sqlite3StrICmp(pColumn->a[i].zName, pTab->aCol[j].zName)==0 ){ + pColumn->a[i].idx = j; + if( i!=j ) bIdListInOrder = 0; + if( j==pTab->iPKey ){ + ipkColumn = i; assert( !withoutRowid ); + } + break; + } + } + if( j>=pTab->nCol ){ + if( sqlite3IsRowid(pColumn->a[i].zName) && !withoutRowid ){ + ipkColumn = i; + bIdListInOrder = 0; + }else{ + sqlite3ErrorMsg(pParse, "table %S has no column named %s", + pTabList, 0, pColumn->a[i].zName); + pParse->checkSchema = 1; + goto insert_cleanup; + } + } + } + } + + /* Figure out how many columns of data are supplied. If the data + ** is coming from a SELECT statement, then generate a co-routine that + ** produces a single row of the SELECT on each invocation. The + ** co-routine is the common header to the 3rd and 4th templates. + */ + if( pSelect ){ + /* Data is coming from a SELECT or from a multi-row VALUES clause. + ** Generate a co-routine to run the SELECT. */ + int regYield; /* Register holding co-routine entry-point */ + int addrTop; /* Top of the co-routine */ + int rc; /* Result code */ + + regYield = ++pParse->nMem; + addrTop = sqlite3VdbeCurrentAddr(v) + 1; + sqlite3VdbeAddOp3(v, OP_InitCoroutine, regYield, 0, addrTop); + sqlite3SelectDestInit(&dest, SRT_Coroutine, regYield); + dest.iSdst = bIdListInOrder ? regData : 0; + dest.nSdst = pTab->nCol; + rc = sqlite3Select(pParse, pSelect, &dest); + regFromSelect = dest.iSdst; + if( rc || db->mallocFailed || pParse->nErr ) goto insert_cleanup; + sqlite3VdbeEndCoroutine(v, regYield); + sqlite3VdbeJumpHere(v, addrTop - 1); /* label B: */ + assert( pSelect->pEList ); + nColumn = pSelect->pEList->nExpr; + + /* Set useTempTable to TRUE if the result of the SELECT statement + ** should be written into a temporary table (template 4). Set to + ** FALSE if each output row of the SELECT can be written directly into + ** the destination table (template 3). + ** + ** A temp table must be used if the table being updated is also one + ** of the tables being read by the SELECT statement. Also use a + ** temp table in the case of row triggers. + */ + if( pTrigger || readsTable(pParse, iDb, pTab) ){ + useTempTable = 1; + } + + if( useTempTable ){ + /* Invoke the coroutine to extract information from the SELECT + ** and add it to a transient table srcTab. The code generated + ** here is from the 4th template: + ** + ** B: open temp table + ** L: yield X, goto M at EOF + ** insert row from R..R+n into temp table + ** goto L + ** M: ... + */ + int regRec; /* Register to hold packed record */ + int regTempRowid; /* Register to hold temp table ROWID */ + int addrL; /* Label "L" */ + + srcTab = pParse->nTab++; + regRec = sqlite3GetTempReg(pParse); + regTempRowid = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp2(v, OP_OpenEphemeral, srcTab, nColumn); + addrL = sqlite3VdbeAddOp1(v, OP_Yield, dest.iSDParm); VdbeCoverage(v); + sqlite3VdbeAddOp3(v, OP_MakeRecord, regFromSelect, nColumn, regRec); + sqlite3VdbeAddOp2(v, OP_NewRowid, srcTab, regTempRowid); + sqlite3VdbeAddOp3(v, OP_Insert, srcTab, regRec, regTempRowid); + sqlite3VdbeGoto(v, addrL); + sqlite3VdbeJumpHere(v, addrL); + sqlite3ReleaseTempReg(pParse, regRec); + sqlite3ReleaseTempReg(pParse, regTempRowid); + } + }else{ + /* This is the case if the data for the INSERT is coming from a + ** single-row VALUES clause + */ + NameContext sNC; + memset(&sNC, 0, sizeof(sNC)); + sNC.pParse = pParse; + srcTab = -1; + assert( useTempTable==0 ); + if( pList ){ + nColumn = pList->nExpr; + if( sqlite3ResolveExprListNames(&sNC, pList) ){ + goto insert_cleanup; + } + }else{ + nColumn = 0; + } + } + + /* If there is no IDLIST term but the table has an integer primary + ** key, the set the ipkColumn variable to the integer primary key + ** column index in the original table definition. + */ + if( pColumn==0 && nColumn>0 ){ + ipkColumn = pTab->iPKey; + } + + /* Make sure the number of columns in the source data matches the number + ** of columns to be inserted into the table. + */ + for(i=0; inCol; i++){ + nHidden += (IsHiddenColumn(&pTab->aCol[i]) ? 1 : 0); + } + if( pColumn==0 && nColumn && nColumn!=(pTab->nCol-nHidden) ){ + sqlite3ErrorMsg(pParse, + "table %S has %d columns but %d values were supplied", + pTabList, 0, pTab->nCol-nHidden, nColumn); + goto insert_cleanup; + } + if( pColumn!=0 && nColumn!=pColumn->nId ){ + sqlite3ErrorMsg(pParse, "%d values for %d columns", nColumn, pColumn->nId); + goto insert_cleanup; + } + + /* Initialize the count of rows to be inserted + */ + if( db->flags & SQLITE_CountRows ){ + regRowCount = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Integer, 0, regRowCount); + } + + /* If this is not a view, open the table and and all indices */ + if( !isView ){ + int nIdx; + nIdx = sqlite3OpenTableAndIndices(pParse, pTab, OP_OpenWrite, 0, -1, 0, + &iDataCur, &iIdxCur); + aRegIdx = sqlite3DbMallocRawNN(db, sizeof(int)*(nIdx+1)); + if( aRegIdx==0 ){ + goto insert_cleanup; + } + for(i=0; inMem; + } + } + + /* This is the top of the main insertion loop */ + if( useTempTable ){ + /* This block codes the top of loop only. The complete loop is the + ** following pseudocode (template 4): + ** + ** rewind temp table, if empty goto D + ** C: loop over rows of intermediate table + ** transfer values form intermediate table into
      + ** end loop + ** D: ... + */ + addrInsTop = sqlite3VdbeAddOp1(v, OP_Rewind, srcTab); VdbeCoverage(v); + addrCont = sqlite3VdbeCurrentAddr(v); + }else if( pSelect ){ + /* This block codes the top of loop only. The complete loop is the + ** following pseudocode (template 3): + ** + ** C: yield X, at EOF goto D + ** insert the select result into
      from R..R+n + ** goto C + ** D: ... + */ + addrInsTop = addrCont = sqlite3VdbeAddOp1(v, OP_Yield, dest.iSDParm); + VdbeCoverage(v); + } + + /* Run the BEFORE and INSTEAD OF triggers, if there are any + */ + endOfLoop = sqlite3VdbeMakeLabel(v); + if( tmask & TRIGGER_BEFORE ){ + int regCols = sqlite3GetTempRange(pParse, pTab->nCol+1); + + /* build the NEW.* reference row. Note that if there is an INTEGER + ** PRIMARY KEY into which a NULL is being inserted, that NULL will be + ** translated into a unique ID for the row. But on a BEFORE trigger, + ** we do not know what the unique ID will be (because the insert has + ** not happened yet) so we substitute a rowid of -1 + */ + if( ipkColumn<0 ){ + sqlite3VdbeAddOp2(v, OP_Integer, -1, regCols); + }else{ + int addr1; + assert( !withoutRowid ); + if( useTempTable ){ + sqlite3VdbeAddOp3(v, OP_Column, srcTab, ipkColumn, regCols); + }else{ + assert( pSelect==0 ); /* Otherwise useTempTable is true */ + sqlite3ExprCode(pParse, pList->a[ipkColumn].pExpr, regCols); + } + addr1 = sqlite3VdbeAddOp1(v, OP_NotNull, regCols); VdbeCoverage(v); + sqlite3VdbeAddOp2(v, OP_Integer, -1, regCols); + sqlite3VdbeJumpHere(v, addr1); + sqlite3VdbeAddOp1(v, OP_MustBeInt, regCols); VdbeCoverage(v); + } + + /* Cannot have triggers on a virtual table. If it were possible, + ** this block would have to account for hidden column. + */ + assert( !IsVirtual(pTab) ); + + /* Create the new column data + */ + for(i=j=0; inCol; i++){ + if( pColumn ){ + for(j=0; jnId; j++){ + if( pColumn->a[j].idx==i ) break; + } + } + if( (!useTempTable && !pList) || (pColumn && j>=pColumn->nId) + || (pColumn==0 && IsOrdinaryHiddenColumn(&pTab->aCol[i])) ){ + sqlite3ExprCode(pParse, pTab->aCol[i].pDflt, regCols+i+1); + }else if( useTempTable ){ + sqlite3VdbeAddOp3(v, OP_Column, srcTab, j, regCols+i+1); + }else{ + assert( pSelect==0 ); /* Otherwise useTempTable is true */ + sqlite3ExprCodeAndCache(pParse, pList->a[j].pExpr, regCols+i+1); + } + if( pColumn==0 && !IsOrdinaryHiddenColumn(&pTab->aCol[i]) ) j++; + } + + /* If this is an INSERT on a view with an INSTEAD OF INSERT trigger, + ** do not attempt any conversions before assembling the record. + ** If this is a real table, attempt conversions as required by the + ** table column affinities. + */ + if( !isView ){ + sqlite3TableAffinity(v, pTab, regCols+1); + } + + /* Fire BEFORE or INSTEAD OF triggers */ + sqlite3CodeRowTrigger(pParse, pTrigger, TK_INSERT, 0, TRIGGER_BEFORE, + pTab, regCols-pTab->nCol-1, onError, endOfLoop); + + sqlite3ReleaseTempRange(pParse, regCols, pTab->nCol+1); + } + + /* Compute the content of the next row to insert into a range of + ** registers beginning at regIns. + */ + if( !isView ){ + if( IsVirtual(pTab) ){ + /* The row that the VUpdate opcode will delete: none */ + sqlite3VdbeAddOp2(v, OP_Null, 0, regIns); + } + if( ipkColumn>=0 ){ + if( useTempTable ){ + sqlite3VdbeAddOp3(v, OP_Column, srcTab, ipkColumn, regRowid); + }else if( pSelect ){ + sqlite3VdbeAddOp2(v, OP_Copy, regFromSelect+ipkColumn, regRowid); + }else{ + VdbeOp *pOp; + sqlite3ExprCode(pParse, pList->a[ipkColumn].pExpr, regRowid); + pOp = sqlite3VdbeGetOp(v, -1); + if( ALWAYS(pOp) && pOp->opcode==OP_Null && !IsVirtual(pTab) ){ + appendFlag = 1; + pOp->opcode = OP_NewRowid; + pOp->p1 = iDataCur; + pOp->p2 = regRowid; + pOp->p3 = regAutoinc; + } + } + /* If the PRIMARY KEY expression is NULL, then use OP_NewRowid + ** to generate a unique primary key value. + */ + if( !appendFlag ){ + int addr1; + if( !IsVirtual(pTab) ){ + addr1 = sqlite3VdbeAddOp1(v, OP_NotNull, regRowid); VdbeCoverage(v); + sqlite3VdbeAddOp3(v, OP_NewRowid, iDataCur, regRowid, regAutoinc); + sqlite3VdbeJumpHere(v, addr1); + }else{ + addr1 = sqlite3VdbeCurrentAddr(v); + sqlite3VdbeAddOp2(v, OP_IsNull, regRowid, addr1+2); VdbeCoverage(v); + } + sqlite3VdbeAddOp1(v, OP_MustBeInt, regRowid); VdbeCoverage(v); + } + }else if( IsVirtual(pTab) || withoutRowid ){ + sqlite3VdbeAddOp2(v, OP_Null, 0, regRowid); + }else{ + sqlite3VdbeAddOp3(v, OP_NewRowid, iDataCur, regRowid, regAutoinc); + appendFlag = 1; + } + autoIncStep(pParse, regAutoinc, regRowid); + + /* Compute data for all columns of the new entry, beginning + ** with the first column. + */ + nHidden = 0; + for(i=0; inCol; i++){ + int iRegStore = regRowid+1+i; + if( i==pTab->iPKey ){ + /* The value of the INTEGER PRIMARY KEY column is always a NULL. + ** Whenever this column is read, the rowid will be substituted + ** in its place. Hence, fill this column with a NULL to avoid + ** taking up data space with information that will never be used. + ** As there may be shallow copies of this value, make it a soft-NULL */ + sqlite3VdbeAddOp1(v, OP_SoftNull, iRegStore); + continue; + } + if( pColumn==0 ){ + if( IsHiddenColumn(&pTab->aCol[i]) ){ + j = -1; + nHidden++; + }else{ + j = i - nHidden; + } + }else{ + for(j=0; jnId; j++){ + if( pColumn->a[j].idx==i ) break; + } + } + if( j<0 || nColumn==0 || (pColumn && j>=pColumn->nId) ){ + sqlite3ExprCodeFactorable(pParse, pTab->aCol[i].pDflt, iRegStore); + }else if( useTempTable ){ + sqlite3VdbeAddOp3(v, OP_Column, srcTab, j, iRegStore); + }else if( pSelect ){ + if( regFromSelect!=regData ){ + sqlite3VdbeAddOp2(v, OP_SCopy, regFromSelect+j, iRegStore); + } + }else{ + sqlite3ExprCode(pParse, pList->a[j].pExpr, iRegStore); + } + } + + /* Generate code to check constraints and generate index keys and + ** do the insertion. + */ +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( IsVirtual(pTab) ){ + const char *pVTab = (const char *)sqlite3GetVTable(db, pTab); + sqlite3VtabMakeWritable(pParse, pTab); + sqlite3VdbeAddOp4(v, OP_VUpdate, 1, pTab->nCol+2, regIns, pVTab, P4_VTAB); + sqlite3VdbeChangeP5(v, onError==OE_Default ? OE_Abort : onError); + sqlite3MayAbort(pParse); + }else +#endif + { + int isReplace; /* Set to true if constraints may cause a replace */ + sqlite3GenerateConstraintChecks(pParse, pTab, aRegIdx, iDataCur, iIdxCur, + regIns, 0, ipkColumn>=0, onError, endOfLoop, &isReplace, 0 + ); + sqlite3FkCheck(pParse, pTab, 0, regIns, 0, 0); + sqlite3CompleteInsertion(pParse, pTab, iDataCur, iIdxCur, + regIns, aRegIdx, 0, appendFlag, isReplace==0); + } + } + + /* Update the count of rows that are inserted + */ + if( (db->flags & SQLITE_CountRows)!=0 ){ + sqlite3VdbeAddOp2(v, OP_AddImm, regRowCount, 1); + } + + if( pTrigger ){ + /* Code AFTER triggers */ + sqlite3CodeRowTrigger(pParse, pTrigger, TK_INSERT, 0, TRIGGER_AFTER, + pTab, regData-2-pTab->nCol, onError, endOfLoop); + } + + /* The bottom of the main insertion loop, if the data source + ** is a SELECT statement. + */ + sqlite3VdbeResolveLabel(v, endOfLoop); + if( useTempTable ){ + sqlite3VdbeAddOp2(v, OP_Next, srcTab, addrCont); VdbeCoverage(v); + sqlite3VdbeJumpHere(v, addrInsTop); + sqlite3VdbeAddOp1(v, OP_Close, srcTab); + }else if( pSelect ){ + sqlite3VdbeGoto(v, addrCont); + sqlite3VdbeJumpHere(v, addrInsTop); + } + + if( !IsVirtual(pTab) && !isView ){ + /* Close all tables opened */ + if( iDataCurpIndex; pIdx; pIdx=pIdx->pNext, idx++){ + sqlite3VdbeAddOp1(v, OP_Close, idx+iIdxCur); + } + } + +insert_end: + /* Update the sqlite_sequence table by storing the content of the + ** maximum rowid counter values recorded while inserting into + ** autoincrement tables. + */ + if( pParse->nested==0 && pParse->pTriggerTab==0 ){ + sqlite3AutoincrementEnd(pParse); + } + + /* + ** Return the number of rows inserted. If this routine is + ** generating code because of a call to sqlite3NestedParse(), do not + ** invoke the callback function. + */ + if( (db->flags&SQLITE_CountRows) && !pParse->nested && !pParse->pTriggerTab ){ + sqlite3VdbeAddOp2(v, OP_ResultRow, regRowCount, 1); + sqlite3VdbeSetNumCols(v, 1); + sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "rows inserted", SQLITE_STATIC); + } + +insert_cleanup: + sqlite3SrcListDelete(db, pTabList); + sqlite3ExprListDelete(db, pList); + sqlite3SelectDelete(db, pSelect); + sqlite3IdListDelete(db, pColumn); + sqlite3DbFree(db, aRegIdx); +} + +/* Make sure "isView" and other macros defined above are undefined. Otherwise +** they may interfere with compilation of other functions in this file +** (or in another file, if this file becomes part of the amalgamation). */ +#ifdef isView + #undef isView +#endif +#ifdef pTrigger + #undef pTrigger +#endif +#ifdef tmask + #undef tmask +#endif + +/* +** Meanings of bits in of pWalker->eCode for checkConstraintUnchanged() +*/ +#define CKCNSTRNT_COLUMN 0x01 /* CHECK constraint uses a changing column */ +#define CKCNSTRNT_ROWID 0x02 /* CHECK constraint references the ROWID */ + +/* This is the Walker callback from checkConstraintUnchanged(). Set +** bit 0x01 of pWalker->eCode if +** pWalker->eCode to 0 if this expression node references any of the +** columns that are being modifed by an UPDATE statement. +*/ +static int checkConstraintExprNode(Walker *pWalker, Expr *pExpr){ + if( pExpr->op==TK_COLUMN ){ + assert( pExpr->iColumn>=0 || pExpr->iColumn==-1 ); + if( pExpr->iColumn>=0 ){ + if( pWalker->u.aiCol[pExpr->iColumn]>=0 ){ + pWalker->eCode |= CKCNSTRNT_COLUMN; + } + }else{ + pWalker->eCode |= CKCNSTRNT_ROWID; + } + } + return WRC_Continue; +} + +/* +** pExpr is a CHECK constraint on a row that is being UPDATE-ed. The +** only columns that are modified by the UPDATE are those for which +** aiChng[i]>=0, and also the ROWID is modified if chngRowid is true. +** +** Return true if CHECK constraint pExpr does not use any of the +** changing columns (or the rowid if it is changing). In other words, +** return true if this CHECK constraint can be skipped when validating +** the new row in the UPDATE statement. +*/ +static int checkConstraintUnchanged(Expr *pExpr, int *aiChng, int chngRowid){ + Walker w; + memset(&w, 0, sizeof(w)); + w.eCode = 0; + w.xExprCallback = checkConstraintExprNode; + w.u.aiCol = aiChng; + sqlite3WalkExpr(&w, pExpr); + if( !chngRowid ){ + testcase( (w.eCode & CKCNSTRNT_ROWID)!=0 ); + w.eCode &= ~CKCNSTRNT_ROWID; + } + testcase( w.eCode==0 ); + testcase( w.eCode==CKCNSTRNT_COLUMN ); + testcase( w.eCode==CKCNSTRNT_ROWID ); + testcase( w.eCode==(CKCNSTRNT_ROWID|CKCNSTRNT_COLUMN) ); + return !w.eCode; +} + +/* +** Generate code to do constraint checks prior to an INSERT or an UPDATE +** on table pTab. +** +** The regNewData parameter is the first register in a range that contains +** the data to be inserted or the data after the update. There will be +** pTab->nCol+1 registers in this range. The first register (the one +** that regNewData points to) will contain the new rowid, or NULL in the +** case of a WITHOUT ROWID table. The second register in the range will +** contain the content of the first table column. The third register will +** contain the content of the second table column. And so forth. +** +** The regOldData parameter is similar to regNewData except that it contains +** the data prior to an UPDATE rather than afterwards. regOldData is zero +** for an INSERT. This routine can distinguish between UPDATE and INSERT by +** checking regOldData for zero. +** +** For an UPDATE, the pkChng boolean is true if the true primary key (the +** rowid for a normal table or the PRIMARY KEY for a WITHOUT ROWID table) +** might be modified by the UPDATE. If pkChng is false, then the key of +** the iDataCur content table is guaranteed to be unchanged by the UPDATE. +** +** For an INSERT, the pkChng boolean indicates whether or not the rowid +** was explicitly specified as part of the INSERT statement. If pkChng +** is zero, it means that the either rowid is computed automatically or +** that the table is a WITHOUT ROWID table and has no rowid. On an INSERT, +** pkChng will only be true if the INSERT statement provides an integer +** value for either the rowid column or its INTEGER PRIMARY KEY alias. +** +** The code generated by this routine will store new index entries into +** registers identified by aRegIdx[]. No index entry is created for +** indices where aRegIdx[i]==0. The order of indices in aRegIdx[] is +** the same as the order of indices on the linked list of indices +** at pTab->pIndex. +** +** The caller must have already opened writeable cursors on the main +** table and all applicable indices (that is to say, all indices for which +** aRegIdx[] is not zero). iDataCur is the cursor for the main table when +** inserting or updating a rowid table, or the cursor for the PRIMARY KEY +** index when operating on a WITHOUT ROWID table. iIdxCur is the cursor +** for the first index in the pTab->pIndex list. Cursors for other indices +** are at iIdxCur+N for the N-th element of the pTab->pIndex list. +** +** This routine also generates code to check constraints. NOT NULL, +** CHECK, and UNIQUE constraints are all checked. If a constraint fails, +** then the appropriate action is performed. There are five possible +** actions: ROLLBACK, ABORT, FAIL, REPLACE, and IGNORE. +** +** Constraint type Action What Happens +** --------------- ---------- ---------------------------------------- +** any ROLLBACK The current transaction is rolled back and +** sqlite3_step() returns immediately with a +** return code of SQLITE_CONSTRAINT. +** +** any ABORT Back out changes from the current command +** only (do not do a complete rollback) then +** cause sqlite3_step() to return immediately +** with SQLITE_CONSTRAINT. +** +** any FAIL Sqlite3_step() returns immediately with a +** return code of SQLITE_CONSTRAINT. The +** transaction is not rolled back and any +** changes to prior rows are retained. +** +** any IGNORE The attempt in insert or update the current +** row is skipped, without throwing an error. +** Processing continues with the next row. +** (There is an immediate jump to ignoreDest.) +** +** NOT NULL REPLACE The NULL value is replace by the default +** value for that column. If the default value +** is NULL, the action is the same as ABORT. +** +** UNIQUE REPLACE The other row that conflicts with the row +** being inserted is removed. +** +** CHECK REPLACE Illegal. The results in an exception. +** +** Which action to take is determined by the overrideError parameter. +** Or if overrideError==OE_Default, then the pParse->onError parameter +** is used. Or if pParse->onError==OE_Default then the onError value +** for the constraint is used. +*/ +SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( + Parse *pParse, /* The parser context */ + Table *pTab, /* The table being inserted or updated */ + int *aRegIdx, /* Use register aRegIdx[i] for index i. 0 for unused */ + int iDataCur, /* Canonical data cursor (main table or PK index) */ + int iIdxCur, /* First index cursor */ + int regNewData, /* First register in a range holding values to insert */ + int regOldData, /* Previous content. 0 for INSERTs */ + u8 pkChng, /* Non-zero if the rowid or PRIMARY KEY changed */ + u8 overrideError, /* Override onError to this if not OE_Default */ + int ignoreDest, /* Jump to this label on an OE_Ignore resolution */ + int *pbMayReplace, /* OUT: Set to true if constraint may cause a replace */ + int *aiChng /* column i is unchanged if aiChng[i]<0 */ +){ + Vdbe *v; /* VDBE under constrution */ + Index *pIdx; /* Pointer to one of the indices */ + Index *pPk = 0; /* The PRIMARY KEY index */ + sqlite3 *db; /* Database connection */ + int i; /* loop counter */ + int ix; /* Index loop counter */ + int nCol; /* Number of columns */ + int onError; /* Conflict resolution strategy */ + int addr1; /* Address of jump instruction */ + int seenReplace = 0; /* True if REPLACE is used to resolve INT PK conflict */ + int nPkField; /* Number of fields in PRIMARY KEY. 1 for ROWID tables */ + int ipkTop = 0; /* Top of the rowid change constraint check */ + int ipkBottom = 0; /* Bottom of the rowid change constraint check */ + u8 isUpdate; /* True if this is an UPDATE operation */ + u8 bAffinityDone = 0; /* True if the OP_Affinity operation has been run */ + int regRowid = -1; /* Register holding ROWID value */ + + isUpdate = regOldData!=0; + db = pParse->db; + v = sqlite3GetVdbe(pParse); + assert( v!=0 ); + assert( pTab->pSelect==0 ); /* This table is not a VIEW */ + nCol = pTab->nCol; + + /* pPk is the PRIMARY KEY index for WITHOUT ROWID tables and NULL for + ** normal rowid tables. nPkField is the number of key fields in the + ** pPk index or 1 for a rowid table. In other words, nPkField is the + ** number of fields in the true primary key of the table. */ + if( HasRowid(pTab) ){ + pPk = 0; + nPkField = 1; + }else{ + pPk = sqlite3PrimaryKeyIndex(pTab); + nPkField = pPk->nKeyCol; + } + + /* Record that this module has started */ + VdbeModuleComment((v, "BEGIN: GenCnstCks(%d,%d,%d,%d,%d)", + iDataCur, iIdxCur, regNewData, regOldData, pkChng)); + + /* Test all NOT NULL constraints. + */ + for(i=0; iiPKey ){ + continue; /* ROWID is never NULL */ + } + if( aiChng && aiChng[i]<0 ){ + /* Don't bother checking for NOT NULL on columns that do not change */ + continue; + } + onError = pTab->aCol[i].notNull; + if( onError==OE_None ) continue; /* This column is allowed to be NULL */ + if( overrideError!=OE_Default ){ + onError = overrideError; + }else if( onError==OE_Default ){ + onError = OE_Abort; + } + if( onError==OE_Replace && pTab->aCol[i].pDflt==0 ){ + onError = OE_Abort; + } + assert( onError==OE_Rollback || onError==OE_Abort || onError==OE_Fail + || onError==OE_Ignore || onError==OE_Replace ); + switch( onError ){ + case OE_Abort: + sqlite3MayAbort(pParse); + /* Fall through */ + case OE_Rollback: + case OE_Fail: { + char *zMsg = sqlite3MPrintf(db, "%s.%s", pTab->zName, + pTab->aCol[i].zName); + sqlite3VdbeAddOp4(v, OP_HaltIfNull, SQLITE_CONSTRAINT_NOTNULL, onError, + regNewData+1+i, zMsg, P4_DYNAMIC); + sqlite3VdbeChangeP5(v, P5_ConstraintNotNull); + VdbeCoverage(v); + break; + } + case OE_Ignore: { + sqlite3VdbeAddOp2(v, OP_IsNull, regNewData+1+i, ignoreDest); + VdbeCoverage(v); + break; + } + default: { + assert( onError==OE_Replace ); + addr1 = sqlite3VdbeAddOp1(v, OP_NotNull, regNewData+1+i); + VdbeCoverage(v); + sqlite3ExprCode(pParse, pTab->aCol[i].pDflt, regNewData+1+i); + sqlite3VdbeJumpHere(v, addr1); + break; + } + } + } + + /* Test all CHECK constraints + */ +#ifndef SQLITE_OMIT_CHECK + if( pTab->pCheck && (db->flags & SQLITE_IgnoreChecks)==0 ){ + ExprList *pCheck = pTab->pCheck; + pParse->ckBase = regNewData+1; + onError = overrideError!=OE_Default ? overrideError : OE_Abort; + for(i=0; inExpr; i++){ + int allOk; + Expr *pExpr = pCheck->a[i].pExpr; + if( aiChng && checkConstraintUnchanged(pExpr, aiChng, pkChng) ) continue; + allOk = sqlite3VdbeMakeLabel(v); + sqlite3ExprIfTrue(pParse, pExpr, allOk, SQLITE_JUMPIFNULL); + if( onError==OE_Ignore ){ + sqlite3VdbeGoto(v, ignoreDest); + }else{ + char *zName = pCheck->a[i].zName; + if( zName==0 ) zName = pTab->zName; + if( onError==OE_Replace ) onError = OE_Abort; /* IMP: R-15569-63625 */ + sqlite3HaltConstraint(pParse, SQLITE_CONSTRAINT_CHECK, + onError, zName, P4_TRANSIENT, + P5_ConstraintCheck); + } + sqlite3VdbeResolveLabel(v, allOk); + } + } +#endif /* !defined(SQLITE_OMIT_CHECK) */ + + /* If rowid is changing, make sure the new rowid does not previously + ** exist in the table. + */ + if( pkChng && pPk==0 ){ + int addrRowidOk = sqlite3VdbeMakeLabel(v); + + /* Figure out what action to take in case of a rowid collision */ + onError = pTab->keyConf; + if( overrideError!=OE_Default ){ + onError = overrideError; + }else if( onError==OE_Default ){ + onError = OE_Abort; + } + + if( isUpdate ){ + /* pkChng!=0 does not mean that the rowid has change, only that + ** it might have changed. Skip the conflict logic below if the rowid + ** is unchanged. */ + sqlite3VdbeAddOp3(v, OP_Eq, regNewData, addrRowidOk, regOldData); + sqlite3VdbeChangeP5(v, SQLITE_NOTNULL); + VdbeCoverage(v); + } + + /* If the response to a rowid conflict is REPLACE but the response + ** to some other UNIQUE constraint is FAIL or IGNORE, then we need + ** to defer the running of the rowid conflict checking until after + ** the UNIQUE constraints have run. + */ + if( onError==OE_Replace && overrideError!=OE_Replace ){ + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + if( pIdx->onError==OE_Ignore || pIdx->onError==OE_Fail ){ + ipkTop = sqlite3VdbeAddOp0(v, OP_Goto); + break; + } + } + } + + /* Check to see if the new rowid already exists in the table. Skip + ** the following conflict logic if it does not. */ + sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, addrRowidOk, regNewData); + VdbeCoverage(v); + + /* Generate code that deals with a rowid collision */ + switch( onError ){ + default: { + onError = OE_Abort; + /* Fall thru into the next case */ + } + case OE_Rollback: + case OE_Abort: + case OE_Fail: { + sqlite3RowidConstraint(pParse, onError, pTab); + break; + } + case OE_Replace: { + /* If there are DELETE triggers on this table and the + ** recursive-triggers flag is set, call GenerateRowDelete() to + ** remove the conflicting row from the table. This will fire + ** the triggers and remove both the table and index b-tree entries. + ** + ** Otherwise, if there are no triggers or the recursive-triggers + ** flag is not set, but the table has one or more indexes, call + ** GenerateRowIndexDelete(). This removes the index b-tree entries + ** only. The table b-tree entry will be replaced by the new entry + ** when it is inserted. + ** + ** If either GenerateRowDelete() or GenerateRowIndexDelete() is called, + ** also invoke MultiWrite() to indicate that this VDBE may require + ** statement rollback (if the statement is aborted after the delete + ** takes place). Earlier versions called sqlite3MultiWrite() regardless, + ** but being more selective here allows statements like: + ** + ** REPLACE INTO t(rowid) VALUES($newrowid) + ** + ** to run without a statement journal if there are no indexes on the + ** table. + */ + Trigger *pTrigger = 0; + if( db->flags&SQLITE_RecTriggers ){ + pTrigger = sqlite3TriggersExist(pParse, pTab, TK_DELETE, 0, 0); + } + if( pTrigger || sqlite3FkRequired(pParse, pTab, 0, 0) ){ + sqlite3MultiWrite(pParse); + sqlite3GenerateRowDelete(pParse, pTab, pTrigger, iDataCur, iIdxCur, + regNewData, 1, 0, OE_Replace, 1, -1); + }else{ +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + if( HasRowid(pTab) ){ + /* This OP_Delete opcode fires the pre-update-hook only. It does + ** not modify the b-tree. It is more efficient to let the coming + ** OP_Insert replace the existing entry than it is to delete the + ** existing entry and then insert a new one. */ + sqlite3VdbeAddOp2(v, OP_Delete, iDataCur, OPFLAG_ISNOOP); + sqlite3VdbeChangeP4(v, -1, (char *)pTab, P4_TABLE); + } +#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */ + if( pTab->pIndex ){ + sqlite3MultiWrite(pParse); + sqlite3GenerateRowIndexDelete(pParse, pTab, iDataCur, iIdxCur,0,-1); + } + } + seenReplace = 1; + break; + } + case OE_Ignore: { + /*assert( seenReplace==0 );*/ + sqlite3VdbeGoto(v, ignoreDest); + break; + } + } + sqlite3VdbeResolveLabel(v, addrRowidOk); + if( ipkTop ){ + ipkBottom = sqlite3VdbeAddOp0(v, OP_Goto); + sqlite3VdbeJumpHere(v, ipkTop); + } + } + + /* Test all UNIQUE constraints by creating entries for each UNIQUE + ** index and making sure that duplicate entries do not already exist. + ** Compute the revised record entries for indices as we go. + ** + ** This loop also handles the case of the PRIMARY KEY index for a + ** WITHOUT ROWID table. + */ + for(ix=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, ix++){ + int regIdx; /* Range of registers hold conent for pIdx */ + int regR; /* Range of registers holding conflicting PK */ + int iThisCur; /* Cursor for this UNIQUE index */ + int addrUniqueOk; /* Jump here if the UNIQUE constraint is satisfied */ + + if( aRegIdx[ix]==0 ) continue; /* Skip indices that do not change */ + if( bAffinityDone==0 ){ + sqlite3TableAffinity(v, pTab, regNewData+1); + bAffinityDone = 1; + } + iThisCur = iIdxCur+ix; + addrUniqueOk = sqlite3VdbeMakeLabel(v); + + /* Skip partial indices for which the WHERE clause is not true */ + if( pIdx->pPartIdxWhere ){ + sqlite3VdbeAddOp2(v, OP_Null, 0, aRegIdx[ix]); + pParse->ckBase = regNewData+1; + sqlite3ExprIfFalseDup(pParse, pIdx->pPartIdxWhere, addrUniqueOk, + SQLITE_JUMPIFNULL); + pParse->ckBase = 0; + } + + /* Create a record for this index entry as it should appear after + ** the insert or update. Store that record in the aRegIdx[ix] register + */ + regIdx = sqlite3GetTempRange(pParse, pIdx->nColumn); + for(i=0; inColumn; i++){ + int iField = pIdx->aiColumn[i]; + int x; + if( iField==XN_EXPR ){ + pParse->ckBase = regNewData+1; + sqlite3ExprCodeCopy(pParse, pIdx->aColExpr->a[i].pExpr, regIdx+i); + pParse->ckBase = 0; + VdbeComment((v, "%s column %d", pIdx->zName, i)); + }else{ + if( iField==XN_ROWID || iField==pTab->iPKey ){ + if( regRowid==regIdx+i ) continue; /* ROWID already in regIdx+i */ + x = regNewData; + regRowid = pIdx->pPartIdxWhere ? -1 : regIdx+i; + }else{ + x = iField + regNewData + 1; + } + sqlite3VdbeAddOp2(v, iField<0 ? OP_IntCopy : OP_SCopy, x, regIdx+i); + VdbeComment((v, "%s", iField<0 ? "rowid" : pTab->aCol[iField].zName)); + } + } + sqlite3VdbeAddOp3(v, OP_MakeRecord, regIdx, pIdx->nColumn, aRegIdx[ix]); + VdbeComment((v, "for %s", pIdx->zName)); + sqlite3ExprCacheAffinityChange(pParse, regIdx, pIdx->nColumn); + + /* In an UPDATE operation, if this index is the PRIMARY KEY index + ** of a WITHOUT ROWID table and there has been no change the + ** primary key, then no collision is possible. The collision detection + ** logic below can all be skipped. */ + if( isUpdate && pPk==pIdx && pkChng==0 ){ + sqlite3VdbeResolveLabel(v, addrUniqueOk); + continue; + } + + /* Find out what action to take in case there is a uniqueness conflict */ + onError = pIdx->onError; + if( onError==OE_None ){ + sqlite3ReleaseTempRange(pParse, regIdx, pIdx->nColumn); + sqlite3VdbeResolveLabel(v, addrUniqueOk); + continue; /* pIdx is not a UNIQUE index */ + } + if( overrideError!=OE_Default ){ + onError = overrideError; + }else if( onError==OE_Default ){ + onError = OE_Abort; + } + + /* Check to see if the new index entry will be unique */ + sqlite3VdbeAddOp4Int(v, OP_NoConflict, iThisCur, addrUniqueOk, + regIdx, pIdx->nKeyCol); VdbeCoverage(v); + + /* Generate code to handle collisions */ + regR = (pIdx==pPk) ? regIdx : sqlite3GetTempRange(pParse, nPkField); + if( isUpdate || onError==OE_Replace ){ + if( HasRowid(pTab) ){ + sqlite3VdbeAddOp2(v, OP_IdxRowid, iThisCur, regR); + /* Conflict only if the rowid of the existing index entry + ** is different from old-rowid */ + if( isUpdate ){ + sqlite3VdbeAddOp3(v, OP_Eq, regR, addrUniqueOk, regOldData); + sqlite3VdbeChangeP5(v, SQLITE_NOTNULL); + VdbeCoverage(v); + } + }else{ + int x; + /* Extract the PRIMARY KEY from the end of the index entry and + ** store it in registers regR..regR+nPk-1 */ + if( pIdx!=pPk ){ + for(i=0; inKeyCol; i++){ + assert( pPk->aiColumn[i]>=0 ); + x = sqlite3ColumnOfIndex(pIdx, pPk->aiColumn[i]); + sqlite3VdbeAddOp3(v, OP_Column, iThisCur, x, regR+i); + VdbeComment((v, "%s.%s", pTab->zName, + pTab->aCol[pPk->aiColumn[i]].zName)); + } + } + if( isUpdate ){ + /* If currently processing the PRIMARY KEY of a WITHOUT ROWID + ** table, only conflict if the new PRIMARY KEY values are actually + ** different from the old. + ** + ** For a UNIQUE index, only conflict if the PRIMARY KEY values + ** of the matched index row are different from the original PRIMARY + ** KEY values of this row before the update. */ + int addrJump = sqlite3VdbeCurrentAddr(v)+pPk->nKeyCol; + int op = OP_Ne; + int regCmp = (IsPrimaryKeyIndex(pIdx) ? regIdx : regR); + + for(i=0; inKeyCol; i++){ + char *p4 = (char*)sqlite3LocateCollSeq(pParse, pPk->azColl[i]); + x = pPk->aiColumn[i]; + assert( x>=0 ); + if( i==(pPk->nKeyCol-1) ){ + addrJump = addrUniqueOk; + op = OP_Eq; + } + sqlite3VdbeAddOp4(v, op, + regOldData+1+x, addrJump, regCmp+i, p4, P4_COLLSEQ + ); + sqlite3VdbeChangeP5(v, SQLITE_NOTNULL); + VdbeCoverageIf(v, op==OP_Eq); + VdbeCoverageIf(v, op==OP_Ne); + } + } + } + } + + /* Generate code that executes if the new index entry is not unique */ + assert( onError==OE_Rollback || onError==OE_Abort || onError==OE_Fail + || onError==OE_Ignore || onError==OE_Replace ); + switch( onError ){ + case OE_Rollback: + case OE_Abort: + case OE_Fail: { + sqlite3UniqueConstraint(pParse, onError, pIdx); + break; + } + case OE_Ignore: { + sqlite3VdbeGoto(v, ignoreDest); + break; + } + default: { + Trigger *pTrigger = 0; + assert( onError==OE_Replace ); + sqlite3MultiWrite(pParse); + if( db->flags&SQLITE_RecTriggers ){ + pTrigger = sqlite3TriggersExist(pParse, pTab, TK_DELETE, 0, 0); + } + sqlite3GenerateRowDelete(pParse, pTab, pTrigger, iDataCur, iIdxCur, + regR, nPkField, 0, OE_Replace, + (pIdx==pPk ? ONEPASS_SINGLE : ONEPASS_OFF), -1); + seenReplace = 1; + break; + } + } + sqlite3VdbeResolveLabel(v, addrUniqueOk); + sqlite3ReleaseTempRange(pParse, regIdx, pIdx->nColumn); + if( regR!=regIdx ) sqlite3ReleaseTempRange(pParse, regR, nPkField); + } + if( ipkTop ){ + sqlite3VdbeGoto(v, ipkTop+1); + sqlite3VdbeJumpHere(v, ipkBottom); + } + + *pbMayReplace = seenReplace; + VdbeModuleComment((v, "END: GenCnstCks(%d)", seenReplace)); +} + +/* +** This routine generates code to finish the INSERT or UPDATE operation +** that was started by a prior call to sqlite3GenerateConstraintChecks. +** A consecutive range of registers starting at regNewData contains the +** rowid and the content to be inserted. +** +** The arguments to this routine should be the same as the first six +** arguments to sqlite3GenerateConstraintChecks. +*/ +SQLITE_PRIVATE void sqlite3CompleteInsertion( + Parse *pParse, /* The parser context */ + Table *pTab, /* the table into which we are inserting */ + int iDataCur, /* Cursor of the canonical data source */ + int iIdxCur, /* First index cursor */ + int regNewData, /* Range of content */ + int *aRegIdx, /* Register used by each index. 0 for unused indices */ + int isUpdate, /* True for UPDATE, False for INSERT */ + int appendBias, /* True if this is likely to be an append */ + int useSeekResult /* True to set the USESEEKRESULT flag on OP_[Idx]Insert */ +){ + Vdbe *v; /* Prepared statements under construction */ + Index *pIdx; /* An index being inserted or updated */ + u8 pik_flags; /* flag values passed to the btree insert */ + int regData; /* Content registers (after the rowid) */ + int regRec; /* Register holding assembled record for the table */ + int i; /* Loop counter */ + u8 bAffinityDone = 0; /* True if OP_Affinity has been run already */ + + v = sqlite3GetVdbe(pParse); + assert( v!=0 ); + assert( pTab->pSelect==0 ); /* This table is not a VIEW */ + for(i=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, i++){ + if( aRegIdx[i]==0 ) continue; + bAffinityDone = 1; + if( pIdx->pPartIdxWhere ){ + sqlite3VdbeAddOp2(v, OP_IsNull, aRegIdx[i], sqlite3VdbeCurrentAddr(v)+2); + VdbeCoverage(v); + } + sqlite3VdbeAddOp2(v, OP_IdxInsert, iIdxCur+i, aRegIdx[i]); + pik_flags = 0; + if( useSeekResult ) pik_flags = OPFLAG_USESEEKRESULT; + if( IsPrimaryKeyIndex(pIdx) && !HasRowid(pTab) ){ + assert( pParse->nested==0 ); + pik_flags |= OPFLAG_NCHANGE; + } + sqlite3VdbeChangeP5(v, pik_flags); + } + if( !HasRowid(pTab) ) return; + regData = regNewData + 1; + regRec = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp3(v, OP_MakeRecord, regData, pTab->nCol, regRec); + if( !bAffinityDone ) sqlite3TableAffinity(v, pTab, 0); + sqlite3ExprCacheAffinityChange(pParse, regData, pTab->nCol); + if( pParse->nested ){ + pik_flags = 0; + }else{ + pik_flags = OPFLAG_NCHANGE; + pik_flags |= (isUpdate?OPFLAG_ISUPDATE:OPFLAG_LASTROWID); + } + if( appendBias ){ + pik_flags |= OPFLAG_APPEND; + } + if( useSeekResult ){ + pik_flags |= OPFLAG_USESEEKRESULT; + } + sqlite3VdbeAddOp3(v, OP_Insert, iDataCur, regRec, regNewData); + if( !pParse->nested ){ + sqlite3VdbeChangeP4(v, -1, (char *)pTab, P4_TABLE); + } + sqlite3VdbeChangeP5(v, pik_flags); +} + +/* +** Allocate cursors for the pTab table and all its indices and generate +** code to open and initialized those cursors. +** +** The cursor for the object that contains the complete data (normally +** the table itself, but the PRIMARY KEY index in the case of a WITHOUT +** ROWID table) is returned in *piDataCur. The first index cursor is +** returned in *piIdxCur. The number of indices is returned. +** +** Use iBase as the first cursor (either the *piDataCur for rowid tables +** or the first index for WITHOUT ROWID tables) if it is non-negative. +** If iBase is negative, then allocate the next available cursor. +** +** For a rowid table, *piDataCur will be exactly one less than *piIdxCur. +** For a WITHOUT ROWID table, *piDataCur will be somewhere in the range +** of *piIdxCurs, depending on where the PRIMARY KEY index appears on the +** pTab->pIndex list. +** +** If pTab is a virtual table, then this routine is a no-op and the +** *piDataCur and *piIdxCur values are left uninitialized. +*/ +SQLITE_PRIVATE int sqlite3OpenTableAndIndices( + Parse *pParse, /* Parsing context */ + Table *pTab, /* Table to be opened */ + int op, /* OP_OpenRead or OP_OpenWrite */ + u8 p5, /* P5 value for OP_Open* opcodes (except on WITHOUT ROWID) */ + int iBase, /* Use this for the table cursor, if there is one */ + u8 *aToOpen, /* If not NULL: boolean for each table and index */ + int *piDataCur, /* Write the database source cursor number here */ + int *piIdxCur /* Write the first index cursor number here */ +){ + int i; + int iDb; + int iDataCur; + Index *pIdx; + Vdbe *v; + + assert( op==OP_OpenRead || op==OP_OpenWrite ); + assert( op==OP_OpenWrite || p5==0 ); + if( IsVirtual(pTab) ){ + /* This routine is a no-op for virtual tables. Leave the output + ** variables *piDataCur and *piIdxCur uninitialized so that valgrind + ** can detect if they are used by mistake in the caller. */ + return 0; + } + iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); + v = sqlite3GetVdbe(pParse); + assert( v!=0 ); + if( iBase<0 ) iBase = pParse->nTab; + iDataCur = iBase++; + if( piDataCur ) *piDataCur = iDataCur; + if( HasRowid(pTab) && (aToOpen==0 || aToOpen[0]) ){ + sqlite3OpenTable(pParse, iDataCur, iDb, pTab, op); + }else{ + sqlite3TableLock(pParse, iDb, pTab->tnum, op==OP_OpenWrite, pTab->zName); + } + if( piIdxCur ) *piIdxCur = iBase; + for(i=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, i++){ + int iIdxCur = iBase++; + assert( pIdx->pSchema==pTab->pSchema ); + if( IsPrimaryKeyIndex(pIdx) && !HasRowid(pTab) ){ + if( piDataCur ) *piDataCur = iIdxCur; + p5 = 0; + } + if( aToOpen==0 || aToOpen[i+1] ){ + sqlite3VdbeAddOp3(v, op, iIdxCur, pIdx->tnum, iDb); + sqlite3VdbeSetP4KeyInfo(pParse, pIdx); + sqlite3VdbeChangeP5(v, p5); + VdbeComment((v, "%s", pIdx->zName)); + } + } + if( iBase>pParse->nTab ) pParse->nTab = iBase; + return i; +} + + +#ifdef SQLITE_TEST +/* +** The following global variable is incremented whenever the +** transfer optimization is used. This is used for testing +** purposes only - to make sure the transfer optimization really +** is happening when it is supposed to. +*/ +SQLITE_API int sqlite3_xferopt_count; +#endif /* SQLITE_TEST */ + + +#ifndef SQLITE_OMIT_XFER_OPT +/* +** Check to see if index pSrc is compatible as a source of data +** for index pDest in an insert transfer optimization. The rules +** for a compatible index: +** +** * The index is over the same set of columns +** * The same DESC and ASC markings occurs on all columns +** * The same onError processing (OE_Abort, OE_Ignore, etc) +** * The same collating sequence on each column +** * The index has the exact same WHERE clause +*/ +static int xferCompatibleIndex(Index *pDest, Index *pSrc){ + int i; + assert( pDest && pSrc ); + assert( pDest->pTable!=pSrc->pTable ); + if( pDest->nKeyCol!=pSrc->nKeyCol ){ + return 0; /* Different number of columns */ + } + if( pDest->onError!=pSrc->onError ){ + return 0; /* Different conflict resolution strategies */ + } + for(i=0; inKeyCol; i++){ + if( pSrc->aiColumn[i]!=pDest->aiColumn[i] ){ + return 0; /* Different columns indexed */ + } + if( pSrc->aiColumn[i]==XN_EXPR ){ + assert( pSrc->aColExpr!=0 && pDest->aColExpr!=0 ); + if( sqlite3ExprCompare(pSrc->aColExpr->a[i].pExpr, + pDest->aColExpr->a[i].pExpr, -1)!=0 ){ + return 0; /* Different expressions in the index */ + } + } + if( pSrc->aSortOrder[i]!=pDest->aSortOrder[i] ){ + return 0; /* Different sort orders */ + } + if( sqlite3_stricmp(pSrc->azColl[i],pDest->azColl[i])!=0 ){ + return 0; /* Different collating sequences */ + } + } + if( sqlite3ExprCompare(pSrc->pPartIdxWhere, pDest->pPartIdxWhere, -1) ){ + return 0; /* Different WHERE clauses */ + } + + /* If no test above fails then the indices must be compatible */ + return 1; +} + +/* +** Attempt the transfer optimization on INSERTs of the form +** +** INSERT INTO tab1 SELECT * FROM tab2; +** +** The xfer optimization transfers raw records from tab2 over to tab1. +** Columns are not decoded and reassembled, which greatly improves +** performance. Raw index records are transferred in the same way. +** +** The xfer optimization is only attempted if tab1 and tab2 are compatible. +** There are lots of rules for determining compatibility - see comments +** embedded in the code for details. +** +** This routine returns TRUE if the optimization is guaranteed to be used. +** Sometimes the xfer optimization will only work if the destination table +** is empty - a factor that can only be determined at run-time. In that +** case, this routine generates code for the xfer optimization but also +** does a test to see if the destination table is empty and jumps over the +** xfer optimization code if the test fails. In that case, this routine +** returns FALSE so that the caller will know to go ahead and generate +** an unoptimized transfer. This routine also returns FALSE if there +** is no chance that the xfer optimization can be applied. +** +** This optimization is particularly useful at making VACUUM run faster. +*/ +static int xferOptimization( + Parse *pParse, /* Parser context */ + Table *pDest, /* The table we are inserting into */ + Select *pSelect, /* A SELECT statement to use as the data source */ + int onError, /* How to handle constraint errors */ + int iDbDest /* The database of pDest */ +){ + sqlite3 *db = pParse->db; + ExprList *pEList; /* The result set of the SELECT */ + Table *pSrc; /* The table in the FROM clause of SELECT */ + Index *pSrcIdx, *pDestIdx; /* Source and destination indices */ + struct SrcList_item *pItem; /* An element of pSelect->pSrc */ + int i; /* Loop counter */ + int iDbSrc; /* The database of pSrc */ + int iSrc, iDest; /* Cursors from source and destination */ + int addr1, addr2; /* Loop addresses */ + int emptyDestTest = 0; /* Address of test for empty pDest */ + int emptySrcTest = 0; /* Address of test for empty pSrc */ + Vdbe *v; /* The VDBE we are building */ + int regAutoinc; /* Memory register used by AUTOINC */ + int destHasUniqueIdx = 0; /* True if pDest has a UNIQUE index */ + int regData, regRowid; /* Registers holding data and rowid */ + + if( pSelect==0 ){ + return 0; /* Must be of the form INSERT INTO ... SELECT ... */ + } + if( pParse->pWith || pSelect->pWith ){ + /* Do not attempt to process this query if there are an WITH clauses + ** attached to it. Proceeding may generate a false "no such table: xxx" + ** error if pSelect reads from a CTE named "xxx". */ + return 0; + } + if( sqlite3TriggerList(pParse, pDest) ){ + return 0; /* tab1 must not have triggers */ + } +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( pDest->tabFlags & TF_Virtual ){ + return 0; /* tab1 must not be a virtual table */ + } +#endif + if( onError==OE_Default ){ + if( pDest->iPKey>=0 ) onError = pDest->keyConf; + if( onError==OE_Default ) onError = OE_Abort; + } + assert(pSelect->pSrc); /* allocated even if there is no FROM clause */ + if( pSelect->pSrc->nSrc!=1 ){ + return 0; /* FROM clause must have exactly one term */ + } + if( pSelect->pSrc->a[0].pSelect ){ + return 0; /* FROM clause cannot contain a subquery */ + } + if( pSelect->pWhere ){ + return 0; /* SELECT may not have a WHERE clause */ + } + if( pSelect->pOrderBy ){ + return 0; /* SELECT may not have an ORDER BY clause */ + } + /* Do not need to test for a HAVING clause. If HAVING is present but + ** there is no ORDER BY, we will get an error. */ + if( pSelect->pGroupBy ){ + return 0; /* SELECT may not have a GROUP BY clause */ + } + if( pSelect->pLimit ){ + return 0; /* SELECT may not have a LIMIT clause */ + } + assert( pSelect->pOffset==0 ); /* Must be so if pLimit==0 */ + if( pSelect->pPrior ){ + return 0; /* SELECT may not be a compound query */ + } + if( pSelect->selFlags & SF_Distinct ){ + return 0; /* SELECT may not be DISTINCT */ + } + pEList = pSelect->pEList; + assert( pEList!=0 ); + if( pEList->nExpr!=1 ){ + return 0; /* The result set must have exactly one column */ + } + assert( pEList->a[0].pExpr ); + if( pEList->a[0].pExpr->op!=TK_ASTERISK ){ + return 0; /* The result set must be the special operator "*" */ + } + + /* At this point we have established that the statement is of the + ** correct syntactic form to participate in this optimization. Now + ** we have to check the semantics. + */ + pItem = pSelect->pSrc->a; + pSrc = sqlite3LocateTableItem(pParse, 0, pItem); + if( pSrc==0 ){ + return 0; /* FROM clause does not contain a real table */ + } + if( pSrc==pDest ){ + return 0; /* tab1 and tab2 may not be the same table */ + } + if( HasRowid(pDest)!=HasRowid(pSrc) ){ + return 0; /* source and destination must both be WITHOUT ROWID or not */ + } +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( pSrc->tabFlags & TF_Virtual ){ + return 0; /* tab2 must not be a virtual table */ + } +#endif + if( pSrc->pSelect ){ + return 0; /* tab2 may not be a view */ + } + if( pDest->nCol!=pSrc->nCol ){ + return 0; /* Number of columns must be the same in tab1 and tab2 */ + } + if( pDest->iPKey!=pSrc->iPKey ){ + return 0; /* Both tables must have the same INTEGER PRIMARY KEY */ + } + for(i=0; inCol; i++){ + Column *pDestCol = &pDest->aCol[i]; + Column *pSrcCol = &pSrc->aCol[i]; +#ifdef SQLITE_ENABLE_HIDDEN_COLUMNS + if( (db->flags & SQLITE_Vacuum)==0 + && (pDestCol->colFlags | pSrcCol->colFlags) & COLFLAG_HIDDEN + ){ + return 0; /* Neither table may have __hidden__ columns */ + } +#endif + if( pDestCol->affinity!=pSrcCol->affinity ){ + return 0; /* Affinity must be the same on all columns */ + } + if( sqlite3_stricmp(pDestCol->zColl, pSrcCol->zColl)!=0 ){ + return 0; /* Collating sequence must be the same on all columns */ + } + if( pDestCol->notNull && !pSrcCol->notNull ){ + return 0; /* tab2 must be NOT NULL if tab1 is */ + } + /* Default values for second and subsequent columns need to match. */ + if( i>0 ){ + assert( pDestCol->pDflt==0 || pDestCol->pDflt->op==TK_SPAN ); + assert( pSrcCol->pDflt==0 || pSrcCol->pDflt->op==TK_SPAN ); + if( (pDestCol->pDflt==0)!=(pSrcCol->pDflt==0) + || (pDestCol->pDflt && strcmp(pDestCol->pDflt->u.zToken, + pSrcCol->pDflt->u.zToken)!=0) + ){ + return 0; /* Default values must be the same for all columns */ + } + } + } + for(pDestIdx=pDest->pIndex; pDestIdx; pDestIdx=pDestIdx->pNext){ + if( IsUniqueIndex(pDestIdx) ){ + destHasUniqueIdx = 1; + } + for(pSrcIdx=pSrc->pIndex; pSrcIdx; pSrcIdx=pSrcIdx->pNext){ + if( xferCompatibleIndex(pDestIdx, pSrcIdx) ) break; + } + if( pSrcIdx==0 ){ + return 0; /* pDestIdx has no corresponding index in pSrc */ + } + } +#ifndef SQLITE_OMIT_CHECK + if( pDest->pCheck && sqlite3ExprListCompare(pSrc->pCheck,pDest->pCheck,-1) ){ + return 0; /* Tables have different CHECK constraints. Ticket #2252 */ + } +#endif +#ifndef SQLITE_OMIT_FOREIGN_KEY + /* Disallow the transfer optimization if the destination table constains + ** any foreign key constraints. This is more restrictive than necessary. + ** But the main beneficiary of the transfer optimization is the VACUUM + ** command, and the VACUUM command disables foreign key constraints. So + ** the extra complication to make this rule less restrictive is probably + ** not worth the effort. Ticket [6284df89debdfa61db8073e062908af0c9b6118e] + */ + if( (db->flags & SQLITE_ForeignKeys)!=0 && pDest->pFKey!=0 ){ + return 0; + } +#endif + if( (db->flags & SQLITE_CountRows)!=0 ){ + return 0; /* xfer opt does not play well with PRAGMA count_changes */ + } + + /* If we get this far, it means that the xfer optimization is at + ** least a possibility, though it might only work if the destination + ** table (tab1) is initially empty. + */ +#ifdef SQLITE_TEST + sqlite3_xferopt_count++; +#endif + iDbSrc = sqlite3SchemaToIndex(db, pSrc->pSchema); + v = sqlite3GetVdbe(pParse); + sqlite3CodeVerifySchema(pParse, iDbSrc); + iSrc = pParse->nTab++; + iDest = pParse->nTab++; + regAutoinc = autoIncBegin(pParse, iDbDest, pDest); + regData = sqlite3GetTempReg(pParse); + regRowid = sqlite3GetTempReg(pParse); + sqlite3OpenTable(pParse, iDest, iDbDest, pDest, OP_OpenWrite); + assert( HasRowid(pDest) || destHasUniqueIdx ); + if( (db->flags & SQLITE_Vacuum)==0 && ( + (pDest->iPKey<0 && pDest->pIndex!=0) /* (1) */ + || destHasUniqueIdx /* (2) */ + || (onError!=OE_Abort && onError!=OE_Rollback) /* (3) */ + )){ + /* In some circumstances, we are able to run the xfer optimization + ** only if the destination table is initially empty. Unless the + ** SQLITE_Vacuum flag is set, this block generates code to make + ** that determination. If SQLITE_Vacuum is set, then the destination + ** table is always empty. + ** + ** Conditions under which the destination must be empty: + ** + ** (1) There is no INTEGER PRIMARY KEY but there are indices. + ** (If the destination is not initially empty, the rowid fields + ** of index entries might need to change.) + ** + ** (2) The destination has a unique index. (The xfer optimization + ** is unable to test uniqueness.) + ** + ** (3) onError is something other than OE_Abort and OE_Rollback. + */ + addr1 = sqlite3VdbeAddOp2(v, OP_Rewind, iDest, 0); VdbeCoverage(v); + emptyDestTest = sqlite3VdbeAddOp0(v, OP_Goto); + sqlite3VdbeJumpHere(v, addr1); + } + if( HasRowid(pSrc) ){ + sqlite3OpenTable(pParse, iSrc, iDbSrc, pSrc, OP_OpenRead); + emptySrcTest = sqlite3VdbeAddOp2(v, OP_Rewind, iSrc, 0); VdbeCoverage(v); + if( pDest->iPKey>=0 ){ + addr1 = sqlite3VdbeAddOp2(v, OP_Rowid, iSrc, regRowid); + addr2 = sqlite3VdbeAddOp3(v, OP_NotExists, iDest, 0, regRowid); + VdbeCoverage(v); + sqlite3RowidConstraint(pParse, onError, pDest); + sqlite3VdbeJumpHere(v, addr2); + autoIncStep(pParse, regAutoinc, regRowid); + }else if( pDest->pIndex==0 ){ + addr1 = sqlite3VdbeAddOp2(v, OP_NewRowid, iDest, regRowid); + }else{ + addr1 = sqlite3VdbeAddOp2(v, OP_Rowid, iSrc, regRowid); + assert( (pDest->tabFlags & TF_Autoincrement)==0 ); + } + sqlite3VdbeAddOp2(v, OP_RowData, iSrc, regData); + sqlite3VdbeAddOp4(v, OP_Insert, iDest, regData, regRowid, + (char*)pDest, P4_TABLE); + sqlite3VdbeChangeP5(v, OPFLAG_NCHANGE|OPFLAG_LASTROWID|OPFLAG_APPEND); + sqlite3VdbeAddOp2(v, OP_Next, iSrc, addr1); VdbeCoverage(v); + sqlite3VdbeAddOp2(v, OP_Close, iSrc, 0); + sqlite3VdbeAddOp2(v, OP_Close, iDest, 0); + }else{ + sqlite3TableLock(pParse, iDbDest, pDest->tnum, 1, pDest->zName); + sqlite3TableLock(pParse, iDbSrc, pSrc->tnum, 0, pSrc->zName); + } + for(pDestIdx=pDest->pIndex; pDestIdx; pDestIdx=pDestIdx->pNext){ + u8 idxInsFlags = 0; + for(pSrcIdx=pSrc->pIndex; ALWAYS(pSrcIdx); pSrcIdx=pSrcIdx->pNext){ + if( xferCompatibleIndex(pDestIdx, pSrcIdx) ) break; + } + assert( pSrcIdx ); + sqlite3VdbeAddOp3(v, OP_OpenRead, iSrc, pSrcIdx->tnum, iDbSrc); + sqlite3VdbeSetP4KeyInfo(pParse, pSrcIdx); + VdbeComment((v, "%s", pSrcIdx->zName)); + sqlite3VdbeAddOp3(v, OP_OpenWrite, iDest, pDestIdx->tnum, iDbDest); + sqlite3VdbeSetP4KeyInfo(pParse, pDestIdx); + sqlite3VdbeChangeP5(v, OPFLAG_BULKCSR); + VdbeComment((v, "%s", pDestIdx->zName)); + addr1 = sqlite3VdbeAddOp2(v, OP_Rewind, iSrc, 0); VdbeCoverage(v); + sqlite3VdbeAddOp2(v, OP_RowKey, iSrc, regData); + if( db->flags & SQLITE_Vacuum ){ + /* This INSERT command is part of a VACUUM operation, which guarantees + ** that the destination table is empty. If all indexed columns use + ** collation sequence BINARY, then it can also be assumed that the + ** index will be populated by inserting keys in strictly sorted + ** order. In this case, instead of seeking within the b-tree as part + ** of every OP_IdxInsert opcode, an OP_Last is added before the + ** OP_IdxInsert to seek to the point within the b-tree where each key + ** should be inserted. This is faster. + ** + ** If any of the indexed columns use a collation sequence other than + ** BINARY, this optimization is disabled. This is because the user + ** might change the definition of a collation sequence and then run + ** a VACUUM command. In that case keys may not be written in strictly + ** sorted order. */ + for(i=0; inColumn; i++){ + const char *zColl = pSrcIdx->azColl[i]; + assert( sqlite3_stricmp(sqlite3StrBINARY, zColl)!=0 + || sqlite3StrBINARY==zColl ); + if( sqlite3_stricmp(sqlite3StrBINARY, zColl) ) break; + } + if( i==pSrcIdx->nColumn ){ + idxInsFlags = OPFLAG_USESEEKRESULT; + sqlite3VdbeAddOp3(v, OP_Last, iDest, 0, -1); + } + } + if( !HasRowid(pSrc) && pDestIdx->idxType==2 ){ + idxInsFlags |= OPFLAG_NCHANGE; + } + sqlite3VdbeAddOp3(v, OP_IdxInsert, iDest, regData, 1); + sqlite3VdbeChangeP5(v, idxInsFlags); + sqlite3VdbeAddOp2(v, OP_Next, iSrc, addr1+1); VdbeCoverage(v); + sqlite3VdbeJumpHere(v, addr1); + sqlite3VdbeAddOp2(v, OP_Close, iSrc, 0); + sqlite3VdbeAddOp2(v, OP_Close, iDest, 0); + } + if( emptySrcTest ) sqlite3VdbeJumpHere(v, emptySrcTest); + sqlite3ReleaseTempReg(pParse, regRowid); + sqlite3ReleaseTempReg(pParse, regData); + if( emptyDestTest ){ + sqlite3AutoincrementEnd(pParse); + sqlite3VdbeAddOp2(v, OP_Halt, SQLITE_OK, 0); + sqlite3VdbeJumpHere(v, emptyDestTest); + sqlite3VdbeAddOp2(v, OP_Close, iDest, 0); + return 0; + }else{ + return 1; + } +} +#endif /* SQLITE_OMIT_XFER_OPT */ + +/************** End of insert.c **********************************************/ +/************** Begin file legacy.c ******************************************/ +/* +** 2001 September 15 +** +** 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. +** +************************************************************************* +** Main file for the SQLite library. The routines in this file +** 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. +*/ + +/* #include "sqliteInt.h" */ + +/* +** Execute SQL code. Return one of the SQLITE_ success/failure +** codes. Also write an error message into memory obtained from +** malloc() and make *pzErrMsg point to that message. +** +** If the SQL is a query, then for each row in the query result +** the xCallback() function is called. pArg becomes the first +** argument to xCallback(). If xCallback=NULL then no callback +** is invoked, even for queries. +*/ +SQLITE_API int sqlite3_exec( + sqlite3 *db, /* The database on which the SQL executes */ + const char *zSql, /* The SQL to be executed */ + sqlite3_callback xCallback, /* Invoke this callback routine */ + void *pArg, /* First argument to xCallback() */ + char **pzErrMsg /* Write error messages here */ +){ + int rc = SQLITE_OK; /* Return code */ + const char *zLeftover; /* Tail of unprocessed SQL */ + sqlite3_stmt *pStmt = 0; /* The current SQL statement */ + char **azCols = 0; /* Names of result columns */ + int callbackIsInit; /* True if callback data is initialized */ + + if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; + if( zSql==0 ) zSql = ""; + + sqlite3_mutex_enter(db->mutex); + sqlite3Error(db, SQLITE_OK); + while( rc==SQLITE_OK && zSql[0] ){ + int nCol; + char **azVals = 0; + + pStmt = 0; + rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover); + assert( rc==SQLITE_OK || pStmt==0 ); + if( rc!=SQLITE_OK ){ + continue; + } + if( !pStmt ){ + /* this happens for a comment or white-space */ + zSql = zLeftover; + continue; + } + + callbackIsInit = 0; + nCol = sqlite3_column_count(pStmt); + + while( 1 ){ + int i; + rc = sqlite3_step(pStmt); + + /* Invoke the callback function if required */ + if( xCallback && (SQLITE_ROW==rc || + (SQLITE_DONE==rc && !callbackIsInit + && db->flags&SQLITE_NullCallback)) ){ + if( !callbackIsInit ){ + azCols = sqlite3DbMallocZero(db, 2*nCol*sizeof(const char*) + 1); + if( azCols==0 ){ + goto exec_out; + } + for(i=0; ierrMask)==rc ); + sqlite3_mutex_leave(db->mutex); + return rc; +} + +/************** End of legacy.c **********************************************/ +/************** Begin file loadext.c *****************************************/ +/* +** 2006 June 7 +** +** 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 dynamically load extensions into +** the SQLite library. +*/ + +#ifndef SQLITE_CORE + #define SQLITE_CORE 1 /* Disable the API redefinition in sqlite3ext.h */ +#endif +/************** Include sqlite3ext.h in the middle of loadext.c **************/ +/************** Begin file sqlite3ext.h **************************************/ +/* +** 2006 June 7 +** +** 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 header file defines the SQLite interface for use by +** shared libraries that want to be imported as extensions into +** an SQLite instance. Shared libraries that intend to be loaded +** as extensions by SQLite should #include this file instead of +** sqlite3.h. +*/ +#ifndef SQLITE3EXT_H +#define SQLITE3EXT_H +/* #include "sqlite3.h" */ + +/* +** The following structure holds pointers to all of the SQLite API +** routines. +** +** WARNING: In order to maintain backwards compatibility, add new +** interfaces to the end of this structure only. If you insert new +** interfaces in the middle of this structure, then older different +** versions of SQLite will not be able to load each other's shared +** libraries! +*/ +struct sqlite3_api_routines { + void * (*aggregate_context)(sqlite3_context*,int nBytes); + int (*aggregate_count)(sqlite3_context*); + int (*bind_blob)(sqlite3_stmt*,int,const void*,int n,void(*)(void*)); + int (*bind_double)(sqlite3_stmt*,int,double); + int (*bind_int)(sqlite3_stmt*,int,int); + int (*bind_int64)(sqlite3_stmt*,int,sqlite_int64); + int (*bind_null)(sqlite3_stmt*,int); + int (*bind_parameter_count)(sqlite3_stmt*); + int (*bind_parameter_index)(sqlite3_stmt*,const char*zName); + const char * (*bind_parameter_name)(sqlite3_stmt*,int); + int (*bind_text)(sqlite3_stmt*,int,const char*,int n,void(*)(void*)); + int (*bind_text16)(sqlite3_stmt*,int,const void*,int,void(*)(void*)); + int (*bind_value)(sqlite3_stmt*,int,const sqlite3_value*); + int (*busy_handler)(sqlite3*,int(*)(void*,int),void*); + int (*busy_timeout)(sqlite3*,int ms); + int (*changes)(sqlite3*); + int (*close)(sqlite3*); + int (*collation_needed)(sqlite3*,void*,void(*)(void*,sqlite3*, + int eTextRep,const char*)); + int (*collation_needed16)(sqlite3*,void*,void(*)(void*,sqlite3*, + int eTextRep,const void*)); + const void * (*column_blob)(sqlite3_stmt*,int iCol); + int (*column_bytes)(sqlite3_stmt*,int iCol); + int (*column_bytes16)(sqlite3_stmt*,int iCol); + int (*column_count)(sqlite3_stmt*pStmt); + const char * (*column_database_name)(sqlite3_stmt*,int); + const void * (*column_database_name16)(sqlite3_stmt*,int); + const char * (*column_decltype)(sqlite3_stmt*,int i); + const void * (*column_decltype16)(sqlite3_stmt*,int); + double (*column_double)(sqlite3_stmt*,int iCol); + int (*column_int)(sqlite3_stmt*,int iCol); + sqlite_int64 (*column_int64)(sqlite3_stmt*,int iCol); + const char * (*column_name)(sqlite3_stmt*,int); + const void * (*column_name16)(sqlite3_stmt*,int); + const char * (*column_origin_name)(sqlite3_stmt*,int); + const void * (*column_origin_name16)(sqlite3_stmt*,int); + const char * (*column_table_name)(sqlite3_stmt*,int); + const void * (*column_table_name16)(sqlite3_stmt*,int); + const unsigned char * (*column_text)(sqlite3_stmt*,int iCol); + const void * (*column_text16)(sqlite3_stmt*,int iCol); + int (*column_type)(sqlite3_stmt*,int iCol); + sqlite3_value* (*column_value)(sqlite3_stmt*,int iCol); + void * (*commit_hook)(sqlite3*,int(*)(void*),void*); + int (*complete)(const char*sql); + int (*complete16)(const void*sql); + int (*create_collation)(sqlite3*,const char*,int,void*, + int(*)(void*,int,const void*,int,const void*)); + int (*create_collation16)(sqlite3*,const void*,int,void*, + int(*)(void*,int,const void*,int,const void*)); + int (*create_function)(sqlite3*,const char*,int,int,void*, + void (*xFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*)); + int (*create_function16)(sqlite3*,const void*,int,int,void*, + void (*xFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*)); + int (*create_module)(sqlite3*,const char*,const sqlite3_module*,void*); + int (*data_count)(sqlite3_stmt*pStmt); + sqlite3 * (*db_handle)(sqlite3_stmt*); + int (*declare_vtab)(sqlite3*,const char*); + int (*enable_shared_cache)(int); + int (*errcode)(sqlite3*db); + const char * (*errmsg)(sqlite3*); + const void * (*errmsg16)(sqlite3*); + int (*exec)(sqlite3*,const char*,sqlite3_callback,void*,char**); + int (*expired)(sqlite3_stmt*); + int (*finalize)(sqlite3_stmt*pStmt); + void (*free)(void*); + void (*free_table)(char**result); + int (*get_autocommit)(sqlite3*); + void * (*get_auxdata)(sqlite3_context*,int); + int (*get_table)(sqlite3*,const char*,char***,int*,int*,char**); + int (*global_recover)(void); + void (*interruptx)(sqlite3*); + sqlite_int64 (*last_insert_rowid)(sqlite3*); + const char * (*libversion)(void); + int (*libversion_number)(void); + void *(*malloc)(int); + char * (*mprintf)(const char*,...); + int (*open)(const char*,sqlite3**); + int (*open16)(const void*,sqlite3**); + int (*prepare)(sqlite3*,const char*,int,sqlite3_stmt**,const char**); + int (*prepare16)(sqlite3*,const void*,int,sqlite3_stmt**,const void**); + void * (*profile)(sqlite3*,void(*)(void*,const char*,sqlite_uint64),void*); + void (*progress_handler)(sqlite3*,int,int(*)(void*),void*); + void *(*realloc)(void*,int); + int (*reset)(sqlite3_stmt*pStmt); + void (*result_blob)(sqlite3_context*,const void*,int,void(*)(void*)); + void (*result_double)(sqlite3_context*,double); + void (*result_error)(sqlite3_context*,const char*,int); + void (*result_error16)(sqlite3_context*,const void*,int); + void (*result_int)(sqlite3_context*,int); + void (*result_int64)(sqlite3_context*,sqlite_int64); + void (*result_null)(sqlite3_context*); + void (*result_text)(sqlite3_context*,const char*,int,void(*)(void*)); + void (*result_text16)(sqlite3_context*,const void*,int,void(*)(void*)); + void (*result_text16be)(sqlite3_context*,const void*,int,void(*)(void*)); + void (*result_text16le)(sqlite3_context*,const void*,int,void(*)(void*)); + void (*result_value)(sqlite3_context*,sqlite3_value*); + void * (*rollback_hook)(sqlite3*,void(*)(void*),void*); + int (*set_authorizer)(sqlite3*,int(*)(void*,int,const char*,const char*, + const char*,const char*),void*); + void (*set_auxdata)(sqlite3_context*,int,void*,void (*)(void*)); + char * (*snprintf)(int,char*,const char*,...); + int (*step)(sqlite3_stmt*); + int (*table_column_metadata)(sqlite3*,const char*,const char*,const char*, + char const**,char const**,int*,int*,int*); + void (*thread_cleanup)(void); + int (*total_changes)(sqlite3*); + void * (*trace)(sqlite3*,void(*xTrace)(void*,const char*),void*); + int (*transfer_bindings)(sqlite3_stmt*,sqlite3_stmt*); + void * (*update_hook)(sqlite3*,void(*)(void*,int ,char const*,char const*, + sqlite_int64),void*); + void * (*user_data)(sqlite3_context*); + const void * (*value_blob)(sqlite3_value*); + int (*value_bytes)(sqlite3_value*); + int (*value_bytes16)(sqlite3_value*); + double (*value_double)(sqlite3_value*); + int (*value_int)(sqlite3_value*); + sqlite_int64 (*value_int64)(sqlite3_value*); + int (*value_numeric_type)(sqlite3_value*); + const unsigned char * (*value_text)(sqlite3_value*); + const void * (*value_text16)(sqlite3_value*); + const void * (*value_text16be)(sqlite3_value*); + const void * (*value_text16le)(sqlite3_value*); + int (*value_type)(sqlite3_value*); + char *(*vmprintf)(const char*,va_list); + /* Added ??? */ + int (*overload_function)(sqlite3*, const char *zFuncName, int nArg); + /* Added by 3.3.13 */ + int (*prepare_v2)(sqlite3*,const char*,int,sqlite3_stmt**,const char**); + int (*prepare16_v2)(sqlite3*,const void*,int,sqlite3_stmt**,const void**); + int (*clear_bindings)(sqlite3_stmt*); + /* Added by 3.4.1 */ + int (*create_module_v2)(sqlite3*,const char*,const sqlite3_module*,void*, + void (*xDestroy)(void *)); + /* Added by 3.5.0 */ + int (*bind_zeroblob)(sqlite3_stmt*,int,int); + int (*blob_bytes)(sqlite3_blob*); + int (*blob_close)(sqlite3_blob*); + int (*blob_open)(sqlite3*,const char*,const char*,const char*,sqlite3_int64, + int,sqlite3_blob**); + int (*blob_read)(sqlite3_blob*,void*,int,int); + int (*blob_write)(sqlite3_blob*,const void*,int,int); + int (*create_collation_v2)(sqlite3*,const char*,int,void*, + int(*)(void*,int,const void*,int,const void*), + void(*)(void*)); + int (*file_control)(sqlite3*,const char*,int,void*); + sqlite3_int64 (*memory_highwater)(int); + sqlite3_int64 (*memory_used)(void); + sqlite3_mutex *(*mutex_alloc)(int); + void (*mutex_enter)(sqlite3_mutex*); + void (*mutex_free)(sqlite3_mutex*); + void (*mutex_leave)(sqlite3_mutex*); + int (*mutex_try)(sqlite3_mutex*); + int (*open_v2)(const char*,sqlite3**,int,const char*); + int (*release_memory)(int); + void (*result_error_nomem)(sqlite3_context*); + void (*result_error_toobig)(sqlite3_context*); + int (*sleep)(int); + void (*soft_heap_limit)(int); + sqlite3_vfs *(*vfs_find)(const char*); + int (*vfs_register)(sqlite3_vfs*,int); + int (*vfs_unregister)(sqlite3_vfs*); + int (*xthreadsafe)(void); + void (*result_zeroblob)(sqlite3_context*,int); + void (*result_error_code)(sqlite3_context*,int); + int (*test_control)(int, ...); + void (*randomness)(int,void*); + sqlite3 *(*context_db_handle)(sqlite3_context*); + int (*extended_result_codes)(sqlite3*,int); + int (*limit)(sqlite3*,int,int); + sqlite3_stmt *(*next_stmt)(sqlite3*,sqlite3_stmt*); + const char *(*sql)(sqlite3_stmt*); + int (*status)(int,int*,int*,int); + int (*backup_finish)(sqlite3_backup*); + sqlite3_backup *(*backup_init)(sqlite3*,const char*,sqlite3*,const char*); + int (*backup_pagecount)(sqlite3_backup*); + int (*backup_remaining)(sqlite3_backup*); + int (*backup_step)(sqlite3_backup*,int); + const char *(*compileoption_get)(int); + int (*compileoption_used)(const char*); + int (*create_function_v2)(sqlite3*,const char*,int,int,void*, + void (*xFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*), + void(*xDestroy)(void*)); + int (*db_config)(sqlite3*,int,...); + sqlite3_mutex *(*db_mutex)(sqlite3*); + int (*db_status)(sqlite3*,int,int*,int*,int); + int (*extended_errcode)(sqlite3*); + void (*log)(int,const char*,...); + sqlite3_int64 (*soft_heap_limit64)(sqlite3_int64); + const char *(*sourceid)(void); + int (*stmt_status)(sqlite3_stmt*,int,int); + int (*strnicmp)(const char*,const char*,int); + int (*unlock_notify)(sqlite3*,void(*)(void**,int),void*); + int (*wal_autocheckpoint)(sqlite3*,int); + int (*wal_checkpoint)(sqlite3*,const char*); + void *(*wal_hook)(sqlite3*,int(*)(void*,sqlite3*,const char*,int),void*); + int (*blob_reopen)(sqlite3_blob*,sqlite3_int64); + int (*vtab_config)(sqlite3*,int op,...); + int (*vtab_on_conflict)(sqlite3*); + /* Version 3.7.16 and later */ + int (*close_v2)(sqlite3*); + const char *(*db_filename)(sqlite3*,const char*); + int (*db_readonly)(sqlite3*,const char*); + int (*db_release_memory)(sqlite3*); + const char *(*errstr)(int); + int (*stmt_busy)(sqlite3_stmt*); + int (*stmt_readonly)(sqlite3_stmt*); + int (*stricmp)(const char*,const char*); + int (*uri_boolean)(const char*,const char*,int); + sqlite3_int64 (*uri_int64)(const char*,const char*,sqlite3_int64); + const char *(*uri_parameter)(const char*,const char*); + char *(*vsnprintf)(int,char*,const char*,va_list); + int (*wal_checkpoint_v2)(sqlite3*,const char*,int,int*,int*); + /* Version 3.8.7 and later */ + int (*auto_extension)(void(*)(void)); + int (*bind_blob64)(sqlite3_stmt*,int,const void*,sqlite3_uint64, + void(*)(void*)); + int (*bind_text64)(sqlite3_stmt*,int,const char*,sqlite3_uint64, + void(*)(void*),unsigned char); + int (*cancel_auto_extension)(void(*)(void)); + int (*load_extension)(sqlite3*,const char*,const char*,char**); + void *(*malloc64)(sqlite3_uint64); + sqlite3_uint64 (*msize)(void*); + void *(*realloc64)(void*,sqlite3_uint64); + void (*reset_auto_extension)(void); + void (*result_blob64)(sqlite3_context*,const void*,sqlite3_uint64, + void(*)(void*)); + void (*result_text64)(sqlite3_context*,const char*,sqlite3_uint64, + void(*)(void*), unsigned char); + int (*strglob)(const char*,const char*); + /* Version 3.8.11 and later */ + sqlite3_value *(*value_dup)(const sqlite3_value*); + void (*value_free)(sqlite3_value*); + int (*result_zeroblob64)(sqlite3_context*,sqlite3_uint64); + int (*bind_zeroblob64)(sqlite3_stmt*, int, sqlite3_uint64); + /* Version 3.9.0 and later */ + unsigned int (*value_subtype)(sqlite3_value*); + void (*result_subtype)(sqlite3_context*,unsigned int); + /* Version 3.10.0 and later */ + int (*status64)(int,sqlite3_int64*,sqlite3_int64*,int); + int (*strlike)(const char*,const char*,unsigned int); + int (*db_cacheflush)(sqlite3*); + /* Version 3.12.0 and later */ + int (*system_errno)(sqlite3*); + /* Version 3.14.0 and later */ + int (*trace_v2)(sqlite3*,unsigned,int(*)(unsigned,void*,void*,void*),void*); + char *(*expanded_sql)(sqlite3_stmt*); +}; + +/* +** This is the function signature used for all extension entry points. It +** is also defined in the file "loadext.c". +*/ +typedef int (*sqlite3_loadext_entry)( + sqlite3 *db, /* Handle to the database. */ + char **pzErrMsg, /* Used to set error string on failure. */ + const sqlite3_api_routines *pThunk /* Extension API function pointers. */ +); + +/* +** The following macros redefine the API routines so that they are +** redirected through the global sqlite3_api structure. +** +** This header file is also used by the loadext.c source file +** (part of the main SQLite library - not an extension) so that +** it can get access to the sqlite3_api_routines structure +** definition. But the main library does not want to redefine +** the API. So the redefinition macros are only valid if the +** SQLITE_CORE macros is undefined. +*/ +#if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) +#define sqlite3_aggregate_context sqlite3_api->aggregate_context +#ifndef SQLITE_OMIT_DEPRECATED +#define sqlite3_aggregate_count sqlite3_api->aggregate_count +#endif +#define sqlite3_bind_blob sqlite3_api->bind_blob +#define sqlite3_bind_double sqlite3_api->bind_double +#define sqlite3_bind_int sqlite3_api->bind_int +#define sqlite3_bind_int64 sqlite3_api->bind_int64 +#define sqlite3_bind_null sqlite3_api->bind_null +#define sqlite3_bind_parameter_count sqlite3_api->bind_parameter_count +#define sqlite3_bind_parameter_index sqlite3_api->bind_parameter_index +#define sqlite3_bind_parameter_name sqlite3_api->bind_parameter_name +#define sqlite3_bind_text sqlite3_api->bind_text +#define sqlite3_bind_text16 sqlite3_api->bind_text16 +#define sqlite3_bind_value sqlite3_api->bind_value +#define sqlite3_busy_handler sqlite3_api->busy_handler +#define sqlite3_busy_timeout sqlite3_api->busy_timeout +#define sqlite3_changes sqlite3_api->changes +#define sqlite3_close sqlite3_api->close +#define sqlite3_collation_needed sqlite3_api->collation_needed +#define sqlite3_collation_needed16 sqlite3_api->collation_needed16 +#define sqlite3_column_blob sqlite3_api->column_blob +#define sqlite3_column_bytes sqlite3_api->column_bytes +#define sqlite3_column_bytes16 sqlite3_api->column_bytes16 +#define sqlite3_column_count sqlite3_api->column_count +#define sqlite3_column_database_name sqlite3_api->column_database_name +#define sqlite3_column_database_name16 sqlite3_api->column_database_name16 +#define sqlite3_column_decltype sqlite3_api->column_decltype +#define sqlite3_column_decltype16 sqlite3_api->column_decltype16 +#define sqlite3_column_double sqlite3_api->column_double +#define sqlite3_column_int sqlite3_api->column_int +#define sqlite3_column_int64 sqlite3_api->column_int64 +#define sqlite3_column_name sqlite3_api->column_name +#define sqlite3_column_name16 sqlite3_api->column_name16 +#define sqlite3_column_origin_name sqlite3_api->column_origin_name +#define sqlite3_column_origin_name16 sqlite3_api->column_origin_name16 +#define sqlite3_column_table_name sqlite3_api->column_table_name +#define sqlite3_column_table_name16 sqlite3_api->column_table_name16 +#define sqlite3_column_text sqlite3_api->column_text +#define sqlite3_column_text16 sqlite3_api->column_text16 +#define sqlite3_column_type sqlite3_api->column_type +#define sqlite3_column_value sqlite3_api->column_value +#define sqlite3_commit_hook sqlite3_api->commit_hook +#define sqlite3_complete sqlite3_api->complete +#define sqlite3_complete16 sqlite3_api->complete16 +#define sqlite3_create_collation sqlite3_api->create_collation +#define sqlite3_create_collation16 sqlite3_api->create_collation16 +#define sqlite3_create_function sqlite3_api->create_function +#define sqlite3_create_function16 sqlite3_api->create_function16 +#define sqlite3_create_module sqlite3_api->create_module +#define sqlite3_create_module_v2 sqlite3_api->create_module_v2 +#define sqlite3_data_count sqlite3_api->data_count +#define sqlite3_db_handle sqlite3_api->db_handle +#define sqlite3_declare_vtab sqlite3_api->declare_vtab +#define sqlite3_enable_shared_cache sqlite3_api->enable_shared_cache +#define sqlite3_errcode sqlite3_api->errcode +#define sqlite3_errmsg sqlite3_api->errmsg +#define sqlite3_errmsg16 sqlite3_api->errmsg16 +#define sqlite3_exec sqlite3_api->exec +#ifndef SQLITE_OMIT_DEPRECATED +#define sqlite3_expired sqlite3_api->expired +#endif +#define sqlite3_finalize sqlite3_api->finalize +#define sqlite3_free sqlite3_api->free +#define sqlite3_free_table sqlite3_api->free_table +#define sqlite3_get_autocommit sqlite3_api->get_autocommit +#define sqlite3_get_auxdata sqlite3_api->get_auxdata +#define sqlite3_get_table sqlite3_api->get_table +#ifndef SQLITE_OMIT_DEPRECATED +#define sqlite3_global_recover sqlite3_api->global_recover +#endif +#define sqlite3_interrupt sqlite3_api->interruptx +#define sqlite3_last_insert_rowid sqlite3_api->last_insert_rowid +#define sqlite3_libversion sqlite3_api->libversion +#define sqlite3_libversion_number sqlite3_api->libversion_number +#define sqlite3_malloc sqlite3_api->malloc +#define sqlite3_mprintf sqlite3_api->mprintf +#define sqlite3_open sqlite3_api->open +#define sqlite3_open16 sqlite3_api->open16 +#define sqlite3_prepare sqlite3_api->prepare +#define sqlite3_prepare16 sqlite3_api->prepare16 +#define sqlite3_prepare_v2 sqlite3_api->prepare_v2 +#define sqlite3_prepare16_v2 sqlite3_api->prepare16_v2 +#define sqlite3_profile sqlite3_api->profile +#define sqlite3_progress_handler sqlite3_api->progress_handler +#define sqlite3_realloc sqlite3_api->realloc +#define sqlite3_reset sqlite3_api->reset +#define sqlite3_result_blob sqlite3_api->result_blob +#define sqlite3_result_double sqlite3_api->result_double +#define sqlite3_result_error sqlite3_api->result_error +#define sqlite3_result_error16 sqlite3_api->result_error16 +#define sqlite3_result_int sqlite3_api->result_int +#define sqlite3_result_int64 sqlite3_api->result_int64 +#define sqlite3_result_null sqlite3_api->result_null +#define sqlite3_result_text sqlite3_api->result_text +#define sqlite3_result_text16 sqlite3_api->result_text16 +#define sqlite3_result_text16be sqlite3_api->result_text16be +#define sqlite3_result_text16le sqlite3_api->result_text16le +#define sqlite3_result_value sqlite3_api->result_value +#define sqlite3_rollback_hook sqlite3_api->rollback_hook +#define sqlite3_set_authorizer sqlite3_api->set_authorizer +#define sqlite3_set_auxdata sqlite3_api->set_auxdata +#define sqlite3_snprintf sqlite3_api->snprintf +#define sqlite3_step sqlite3_api->step +#define sqlite3_table_column_metadata sqlite3_api->table_column_metadata +#define sqlite3_thread_cleanup sqlite3_api->thread_cleanup +#define sqlite3_total_changes sqlite3_api->total_changes +#define sqlite3_trace sqlite3_api->trace +#ifndef SQLITE_OMIT_DEPRECATED +#define sqlite3_transfer_bindings sqlite3_api->transfer_bindings +#endif +#define sqlite3_update_hook sqlite3_api->update_hook +#define sqlite3_user_data sqlite3_api->user_data +#define sqlite3_value_blob sqlite3_api->value_blob +#define sqlite3_value_bytes sqlite3_api->value_bytes +#define sqlite3_value_bytes16 sqlite3_api->value_bytes16 +#define sqlite3_value_double sqlite3_api->value_double +#define sqlite3_value_int sqlite3_api->value_int +#define sqlite3_value_int64 sqlite3_api->value_int64 +#define sqlite3_value_numeric_type sqlite3_api->value_numeric_type +#define sqlite3_value_text sqlite3_api->value_text +#define sqlite3_value_text16 sqlite3_api->value_text16 +#define sqlite3_value_text16be sqlite3_api->value_text16be +#define sqlite3_value_text16le sqlite3_api->value_text16le +#define sqlite3_value_type sqlite3_api->value_type +#define sqlite3_vmprintf sqlite3_api->vmprintf +#define sqlite3_vsnprintf sqlite3_api->vsnprintf +#define sqlite3_overload_function sqlite3_api->overload_function +#define sqlite3_prepare_v2 sqlite3_api->prepare_v2 +#define sqlite3_prepare16_v2 sqlite3_api->prepare16_v2 +#define sqlite3_clear_bindings sqlite3_api->clear_bindings +#define sqlite3_bind_zeroblob sqlite3_api->bind_zeroblob +#define sqlite3_blob_bytes sqlite3_api->blob_bytes +#define sqlite3_blob_close sqlite3_api->blob_close +#define sqlite3_blob_open sqlite3_api->blob_open +#define sqlite3_blob_read sqlite3_api->blob_read +#define sqlite3_blob_write sqlite3_api->blob_write +#define sqlite3_create_collation_v2 sqlite3_api->create_collation_v2 +#define sqlite3_file_control sqlite3_api->file_control +#define sqlite3_memory_highwater sqlite3_api->memory_highwater +#define sqlite3_memory_used sqlite3_api->memory_used +#define sqlite3_mutex_alloc sqlite3_api->mutex_alloc +#define sqlite3_mutex_enter sqlite3_api->mutex_enter +#define sqlite3_mutex_free sqlite3_api->mutex_free +#define sqlite3_mutex_leave sqlite3_api->mutex_leave +#define sqlite3_mutex_try sqlite3_api->mutex_try +#define sqlite3_open_v2 sqlite3_api->open_v2 +#define sqlite3_release_memory sqlite3_api->release_memory +#define sqlite3_result_error_nomem sqlite3_api->result_error_nomem +#define sqlite3_result_error_toobig sqlite3_api->result_error_toobig +#define sqlite3_sleep sqlite3_api->sleep +#define sqlite3_soft_heap_limit sqlite3_api->soft_heap_limit +#define sqlite3_vfs_find sqlite3_api->vfs_find +#define sqlite3_vfs_register sqlite3_api->vfs_register +#define sqlite3_vfs_unregister sqlite3_api->vfs_unregister +#define sqlite3_threadsafe sqlite3_api->xthreadsafe +#define sqlite3_result_zeroblob sqlite3_api->result_zeroblob +#define sqlite3_result_error_code sqlite3_api->result_error_code +#define sqlite3_test_control sqlite3_api->test_control +#define sqlite3_randomness sqlite3_api->randomness +#define sqlite3_context_db_handle sqlite3_api->context_db_handle +#define sqlite3_extended_result_codes sqlite3_api->extended_result_codes +#define sqlite3_limit sqlite3_api->limit +#define sqlite3_next_stmt sqlite3_api->next_stmt +#define sqlite3_sql sqlite3_api->sql +#define sqlite3_status sqlite3_api->status +#define sqlite3_backup_finish sqlite3_api->backup_finish +#define sqlite3_backup_init sqlite3_api->backup_init +#define sqlite3_backup_pagecount sqlite3_api->backup_pagecount +#define sqlite3_backup_remaining sqlite3_api->backup_remaining +#define sqlite3_backup_step sqlite3_api->backup_step +#define sqlite3_compileoption_get sqlite3_api->compileoption_get +#define sqlite3_compileoption_used sqlite3_api->compileoption_used +#define sqlite3_create_function_v2 sqlite3_api->create_function_v2 +#define sqlite3_db_config sqlite3_api->db_config +#define sqlite3_db_mutex sqlite3_api->db_mutex +#define sqlite3_db_status sqlite3_api->db_status +#define sqlite3_extended_errcode sqlite3_api->extended_errcode +#define sqlite3_log sqlite3_api->log +#define sqlite3_soft_heap_limit64 sqlite3_api->soft_heap_limit64 +#define sqlite3_sourceid sqlite3_api->sourceid +#define sqlite3_stmt_status sqlite3_api->stmt_status +#define sqlite3_strnicmp sqlite3_api->strnicmp +#define sqlite3_unlock_notify sqlite3_api->unlock_notify +#define sqlite3_wal_autocheckpoint sqlite3_api->wal_autocheckpoint +#define sqlite3_wal_checkpoint sqlite3_api->wal_checkpoint +#define sqlite3_wal_hook sqlite3_api->wal_hook +#define sqlite3_blob_reopen sqlite3_api->blob_reopen +#define sqlite3_vtab_config sqlite3_api->vtab_config +#define sqlite3_vtab_on_conflict sqlite3_api->vtab_on_conflict +/* Version 3.7.16 and later */ +#define sqlite3_close_v2 sqlite3_api->close_v2 +#define sqlite3_db_filename sqlite3_api->db_filename +#define sqlite3_db_readonly sqlite3_api->db_readonly +#define sqlite3_db_release_memory sqlite3_api->db_release_memory +#define sqlite3_errstr sqlite3_api->errstr +#define sqlite3_stmt_busy sqlite3_api->stmt_busy +#define sqlite3_stmt_readonly sqlite3_api->stmt_readonly +#define sqlite3_stricmp sqlite3_api->stricmp +#define sqlite3_uri_boolean sqlite3_api->uri_boolean +#define sqlite3_uri_int64 sqlite3_api->uri_int64 +#define sqlite3_uri_parameter sqlite3_api->uri_parameter +#define sqlite3_uri_vsnprintf sqlite3_api->vsnprintf +#define sqlite3_wal_checkpoint_v2 sqlite3_api->wal_checkpoint_v2 +/* Version 3.8.7 and later */ +#define sqlite3_auto_extension sqlite3_api->auto_extension +#define sqlite3_bind_blob64 sqlite3_api->bind_blob64 +#define sqlite3_bind_text64 sqlite3_api->bind_text64 +#define sqlite3_cancel_auto_extension sqlite3_api->cancel_auto_extension +#define sqlite3_load_extension sqlite3_api->load_extension +#define sqlite3_malloc64 sqlite3_api->malloc64 +#define sqlite3_msize sqlite3_api->msize +#define sqlite3_realloc64 sqlite3_api->realloc64 +#define sqlite3_reset_auto_extension sqlite3_api->reset_auto_extension +#define sqlite3_result_blob64 sqlite3_api->result_blob64 +#define sqlite3_result_text64 sqlite3_api->result_text64 +#define sqlite3_strglob sqlite3_api->strglob +/* Version 3.8.11 and later */ +#define sqlite3_value_dup sqlite3_api->value_dup +#define sqlite3_value_free sqlite3_api->value_free +#define sqlite3_result_zeroblob64 sqlite3_api->result_zeroblob64 +#define sqlite3_bind_zeroblob64 sqlite3_api->bind_zeroblob64 +/* Version 3.9.0 and later */ +#define sqlite3_value_subtype sqlite3_api->value_subtype +#define sqlite3_result_subtype sqlite3_api->result_subtype +/* Version 3.10.0 and later */ +#define sqlite3_status64 sqlite3_api->status64 +#define sqlite3_strlike sqlite3_api->strlike +#define sqlite3_db_cacheflush sqlite3_api->db_cacheflush +/* Version 3.12.0 and later */ +#define sqlite3_system_errno sqlite3_api->system_errno +/* Version 3.14.0 and later */ +#define sqlite3_trace_v2 sqlite3_api->trace_v2 +#define sqlite3_expanded_sql sqlite3_api->expanded_sql +#endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */ + +#if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) + /* This case when the file really is being compiled as a loadable + ** extension */ +# define SQLITE_EXTENSION_INIT1 const sqlite3_api_routines *sqlite3_api=0; +# define SQLITE_EXTENSION_INIT2(v) sqlite3_api=v; +# define SQLITE_EXTENSION_INIT3 \ + extern const sqlite3_api_routines *sqlite3_api; +#else + /* This case when the file is being statically linked into the + ** application */ +# define SQLITE_EXTENSION_INIT1 /*no-op*/ +# define SQLITE_EXTENSION_INIT2(v) (void)v; /* unused parameter */ +# define SQLITE_EXTENSION_INIT3 /*no-op*/ +#endif + +#endif /* SQLITE3EXT_H */ + +/************** End of sqlite3ext.h ******************************************/ +/************** Continuing where we left off in loadext.c ********************/ +/* #include "sqliteInt.h" */ +/* #include */ + +#ifndef SQLITE_OMIT_LOAD_EXTENSION +/* +** Some API routines are omitted when various features are +** excluded from a build of SQLite. Substitute a NULL pointer +** for any missing APIs. +*/ +#ifndef SQLITE_ENABLE_COLUMN_METADATA +# define sqlite3_column_database_name 0 +# define sqlite3_column_database_name16 0 +# define sqlite3_column_table_name 0 +# define sqlite3_column_table_name16 0 +# define sqlite3_column_origin_name 0 +# define sqlite3_column_origin_name16 0 +#endif + +#ifdef SQLITE_OMIT_AUTHORIZATION +# define sqlite3_set_authorizer 0 +#endif + +#ifdef SQLITE_OMIT_UTF16 +# define sqlite3_bind_text16 0 +# define sqlite3_collation_needed16 0 +# define sqlite3_column_decltype16 0 +# define sqlite3_column_name16 0 +# define sqlite3_column_text16 0 +# define sqlite3_complete16 0 +# define sqlite3_create_collation16 0 +# define sqlite3_create_function16 0 +# define sqlite3_errmsg16 0 +# define sqlite3_open16 0 +# define sqlite3_prepare16 0 +# define sqlite3_prepare16_v2 0 +# define sqlite3_result_error16 0 +# define sqlite3_result_text16 0 +# define sqlite3_result_text16be 0 +# define sqlite3_result_text16le 0 +# define sqlite3_value_text16 0 +# define sqlite3_value_text16be 0 +# define sqlite3_value_text16le 0 +# define sqlite3_column_database_name16 0 +# define sqlite3_column_table_name16 0 +# define sqlite3_column_origin_name16 0 +#endif + +#ifdef SQLITE_OMIT_COMPLETE +# define sqlite3_complete 0 +# define sqlite3_complete16 0 +#endif + +#ifdef SQLITE_OMIT_DECLTYPE +# define sqlite3_column_decltype16 0 +# define sqlite3_column_decltype 0 +#endif + +#ifdef SQLITE_OMIT_PROGRESS_CALLBACK +# define sqlite3_progress_handler 0 +#endif + +#ifdef SQLITE_OMIT_VIRTUALTABLE +# define sqlite3_create_module 0 +# define sqlite3_create_module_v2 0 +# define sqlite3_declare_vtab 0 +# define sqlite3_vtab_config 0 +# define sqlite3_vtab_on_conflict 0 +#endif + +#ifdef SQLITE_OMIT_SHARED_CACHE +# define sqlite3_enable_shared_cache 0 +#endif + +#if defined(SQLITE_OMIT_TRACE) || defined(SQLITE_OMIT_DEPRECATED) +# define sqlite3_profile 0 +# define sqlite3_trace 0 +#endif + +#ifdef SQLITE_OMIT_GET_TABLE +# define sqlite3_free_table 0 +# define sqlite3_get_table 0 +#endif + +#ifdef SQLITE_OMIT_INCRBLOB +#define sqlite3_bind_zeroblob 0 +#define sqlite3_blob_bytes 0 +#define sqlite3_blob_close 0 +#define sqlite3_blob_open 0 +#define sqlite3_blob_read 0 +#define sqlite3_blob_write 0 +#define sqlite3_blob_reopen 0 +#endif + +#if defined(SQLITE_OMIT_TRACE) +# define sqlite3_trace_v2 0 +#endif + +/* +** The following structure contains pointers to all SQLite API routines. +** A pointer to this structure is passed into extensions when they are +** loaded so that the extension can make calls back into the SQLite +** library. +** +** When adding new APIs, add them to the bottom of this structure +** in order to preserve backwards compatibility. +** +** Extensions that use newer APIs should first call the +** sqlite3_libversion_number() to make sure that the API they +** intend to use is supported by the library. Extensions should +** also check to make sure that the pointer to the function is +** not NULL before calling it. +*/ +static const sqlite3_api_routines sqlite3Apis = { + sqlite3_aggregate_context, +#ifndef SQLITE_OMIT_DEPRECATED + sqlite3_aggregate_count, +#else + 0, +#endif + sqlite3_bind_blob, + sqlite3_bind_double, + sqlite3_bind_int, + sqlite3_bind_int64, + sqlite3_bind_null, + sqlite3_bind_parameter_count, + sqlite3_bind_parameter_index, + sqlite3_bind_parameter_name, + sqlite3_bind_text, + sqlite3_bind_text16, + sqlite3_bind_value, + sqlite3_busy_handler, + sqlite3_busy_timeout, + sqlite3_changes, + sqlite3_close, + sqlite3_collation_needed, + sqlite3_collation_needed16, + sqlite3_column_blob, + sqlite3_column_bytes, + sqlite3_column_bytes16, + sqlite3_column_count, + sqlite3_column_database_name, + sqlite3_column_database_name16, + sqlite3_column_decltype, + sqlite3_column_decltype16, + sqlite3_column_double, + sqlite3_column_int, + sqlite3_column_int64, + sqlite3_column_name, + sqlite3_column_name16, + sqlite3_column_origin_name, + sqlite3_column_origin_name16, + sqlite3_column_table_name, + sqlite3_column_table_name16, + sqlite3_column_text, + sqlite3_column_text16, + sqlite3_column_type, + sqlite3_column_value, + sqlite3_commit_hook, + sqlite3_complete, + sqlite3_complete16, + sqlite3_create_collation, + sqlite3_create_collation16, + sqlite3_create_function, + sqlite3_create_function16, + sqlite3_create_module, + sqlite3_data_count, + sqlite3_db_handle, + sqlite3_declare_vtab, + sqlite3_enable_shared_cache, + sqlite3_errcode, + sqlite3_errmsg, + sqlite3_errmsg16, + sqlite3_exec, +#ifndef SQLITE_OMIT_DEPRECATED + sqlite3_expired, +#else + 0, +#endif + sqlite3_finalize, + sqlite3_free, + sqlite3_free_table, + sqlite3_get_autocommit, + sqlite3_get_auxdata, + sqlite3_get_table, + 0, /* Was sqlite3_global_recover(), but that function is deprecated */ + sqlite3_interrupt, + sqlite3_last_insert_rowid, + sqlite3_libversion, + sqlite3_libversion_number, + sqlite3_malloc, + sqlite3_mprintf, + sqlite3_open, + sqlite3_open16, + sqlite3_prepare, + sqlite3_prepare16, + sqlite3_profile, + sqlite3_progress_handler, + sqlite3_realloc, + sqlite3_reset, + sqlite3_result_blob, + sqlite3_result_double, + sqlite3_result_error, + sqlite3_result_error16, + sqlite3_result_int, + sqlite3_result_int64, + sqlite3_result_null, + sqlite3_result_text, + sqlite3_result_text16, + sqlite3_result_text16be, + sqlite3_result_text16le, + sqlite3_result_value, + sqlite3_rollback_hook, + sqlite3_set_authorizer, + sqlite3_set_auxdata, + sqlite3_snprintf, + sqlite3_step, + sqlite3_table_column_metadata, +#ifndef SQLITE_OMIT_DEPRECATED + sqlite3_thread_cleanup, +#else + 0, +#endif + sqlite3_total_changes, + sqlite3_trace, +#ifndef SQLITE_OMIT_DEPRECATED + sqlite3_transfer_bindings, +#else + 0, +#endif + sqlite3_update_hook, + sqlite3_user_data, + sqlite3_value_blob, + sqlite3_value_bytes, + sqlite3_value_bytes16, + sqlite3_value_double, + sqlite3_value_int, + sqlite3_value_int64, + sqlite3_value_numeric_type, + sqlite3_value_text, + sqlite3_value_text16, + sqlite3_value_text16be, + sqlite3_value_text16le, + sqlite3_value_type, + sqlite3_vmprintf, + /* + ** The original API set ends here. All extensions can call any + ** of the APIs above provided that the pointer is not NULL. But + ** before calling APIs that follow, extension should check the + ** sqlite3_libversion_number() to make sure they are dealing with + ** a library that is new enough to support that API. + ************************************************************************* + */ + sqlite3_overload_function, + + /* + ** Added after 3.3.13 + */ + sqlite3_prepare_v2, + sqlite3_prepare16_v2, + sqlite3_clear_bindings, + + /* + ** Added for 3.4.1 + */ + sqlite3_create_module_v2, + + /* + ** Added for 3.5.0 + */ + sqlite3_bind_zeroblob, + sqlite3_blob_bytes, + sqlite3_blob_close, + sqlite3_blob_open, + sqlite3_blob_read, + sqlite3_blob_write, + sqlite3_create_collation_v2, + sqlite3_file_control, + sqlite3_memory_highwater, + sqlite3_memory_used, +#ifdef SQLITE_MUTEX_OMIT + 0, + 0, + 0, + 0, + 0, +#else + sqlite3_mutex_alloc, + sqlite3_mutex_enter, + sqlite3_mutex_free, + sqlite3_mutex_leave, + sqlite3_mutex_try, +#endif + sqlite3_open_v2, + sqlite3_release_memory, + sqlite3_result_error_nomem, + sqlite3_result_error_toobig, + sqlite3_sleep, + sqlite3_soft_heap_limit, + sqlite3_vfs_find, + sqlite3_vfs_register, + sqlite3_vfs_unregister, + + /* + ** Added for 3.5.8 + */ + sqlite3_threadsafe, + sqlite3_result_zeroblob, + sqlite3_result_error_code, + sqlite3_test_control, + sqlite3_randomness, + sqlite3_context_db_handle, + + /* + ** Added for 3.6.0 + */ + sqlite3_extended_result_codes, + sqlite3_limit, + sqlite3_next_stmt, + sqlite3_sql, + sqlite3_status, + + /* + ** Added for 3.7.4 + */ + sqlite3_backup_finish, + sqlite3_backup_init, + sqlite3_backup_pagecount, + sqlite3_backup_remaining, + sqlite3_backup_step, +#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS + sqlite3_compileoption_get, + sqlite3_compileoption_used, +#else + 0, + 0, +#endif + sqlite3_create_function_v2, + sqlite3_db_config, + sqlite3_db_mutex, + sqlite3_db_status, + sqlite3_extended_errcode, + sqlite3_log, + sqlite3_soft_heap_limit64, + sqlite3_sourceid, + sqlite3_stmt_status, + sqlite3_strnicmp, +#ifdef SQLITE_ENABLE_UNLOCK_NOTIFY + sqlite3_unlock_notify, +#else + 0, +#endif +#ifndef SQLITE_OMIT_WAL + sqlite3_wal_autocheckpoint, + sqlite3_wal_checkpoint, + sqlite3_wal_hook, +#else + 0, + 0, + 0, +#endif + sqlite3_blob_reopen, + sqlite3_vtab_config, + sqlite3_vtab_on_conflict, + sqlite3_close_v2, + sqlite3_db_filename, + sqlite3_db_readonly, + sqlite3_db_release_memory, + sqlite3_errstr, + sqlite3_stmt_busy, + sqlite3_stmt_readonly, + sqlite3_stricmp, + sqlite3_uri_boolean, + sqlite3_uri_int64, + sqlite3_uri_parameter, + sqlite3_vsnprintf, + sqlite3_wal_checkpoint_v2, + /* Version 3.8.7 and later */ + sqlite3_auto_extension, + sqlite3_bind_blob64, + sqlite3_bind_text64, + sqlite3_cancel_auto_extension, + sqlite3_load_extension, + sqlite3_malloc64, + sqlite3_msize, + sqlite3_realloc64, + sqlite3_reset_auto_extension, + sqlite3_result_blob64, + sqlite3_result_text64, + sqlite3_strglob, + /* Version 3.8.11 and later */ + (sqlite3_value*(*)(const sqlite3_value*))sqlite3_value_dup, + sqlite3_value_free, + sqlite3_result_zeroblob64, + sqlite3_bind_zeroblob64, + /* Version 3.9.0 and later */ + sqlite3_value_subtype, + sqlite3_result_subtype, + /* Version 3.10.0 and later */ + sqlite3_status64, + sqlite3_strlike, + sqlite3_db_cacheflush, + /* Version 3.12.0 and later */ + sqlite3_system_errno, + /* Version 3.14.0 and later */ + sqlite3_trace_v2, + sqlite3_expanded_sql +}; + +/* +** Attempt to load an SQLite extension library contained in the file +** zFile. The entry point is zProc. zProc may be 0 in which case a +** default entry point name (sqlite3_extension_init) is used. Use +** of the default name is recommended. +** +** Return SQLITE_OK on success and SQLITE_ERROR if something goes wrong. +** +** If an error occurs and pzErrMsg is not 0, then fill *pzErrMsg with +** error message text. The calling function should free this memory +** by calling sqlite3DbFree(db, ). +*/ +static int sqlite3LoadExtension( + sqlite3 *db, /* Load the extension into this database connection */ + const char *zFile, /* Name of the shared library containing extension */ + const char *zProc, /* Entry point. Use "sqlite3_extension_init" if 0 */ + char **pzErrMsg /* Put error message here if not 0 */ +){ + sqlite3_vfs *pVfs = db->pVfs; + void *handle; + sqlite3_loadext_entry xInit; + char *zErrmsg = 0; + const char *zEntry; + char *zAltEntry = 0; + void **aHandle; + u64 nMsg = 300 + sqlite3Strlen30(zFile); + int ii; + int rc; + + /* Shared library endings to try if zFile cannot be loaded as written */ + static const char *azEndings[] = { +#if SQLITE_OS_WIN + "dll" +#elif defined(__APPLE__) + "dylib" +#else + "so" +#endif + }; + + + if( pzErrMsg ) *pzErrMsg = 0; + + /* Ticket #1863. To avoid a creating security problems for older + ** applications that relink against newer versions of SQLite, the + ** ability to run load_extension is turned off by default. One + ** must call either sqlite3_enable_load_extension(db) or + ** sqlite3_db_config(db, SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION, 1, 0) + ** to turn on extension loading. + */ + if( (db->flags & SQLITE_LoadExtension)==0 ){ + if( pzErrMsg ){ + *pzErrMsg = sqlite3_mprintf("not authorized"); + } + return SQLITE_ERROR; + } + + zEntry = zProc ? zProc : "sqlite3_extension_init"; + + handle = sqlite3OsDlOpen(pVfs, zFile); +#if SQLITE_OS_UNIX || SQLITE_OS_WIN + for(ii=0; ii sqlite3_example_init + ** C:/lib/mathfuncs.dll ==> sqlite3_mathfuncs_init + */ + if( xInit==0 && zProc==0 ){ + int iFile, iEntry, c; + int ncFile = sqlite3Strlen30(zFile); + zAltEntry = sqlite3_malloc64(ncFile+30); + if( zAltEntry==0 ){ + sqlite3OsDlClose(pVfs, handle); + return SQLITE_NOMEM_BKPT; + } + memcpy(zAltEntry, "sqlite3_", 8); + for(iFile=ncFile-1; iFile>=0 && zFile[iFile]!='/'; iFile--){} + iFile++; + if( sqlite3_strnicmp(zFile+iFile, "lib", 3)==0 ) iFile += 3; + for(iEntry=8; (c = zFile[iFile])!=0 && c!='.'; iFile++){ + if( sqlite3Isalpha(c) ){ + zAltEntry[iEntry++] = (char)sqlite3UpperToLower[(unsigned)c]; + } + } + memcpy(zAltEntry+iEntry, "_init", 6); + zEntry = zAltEntry; + xInit = (sqlite3_loadext_entry)sqlite3OsDlSym(pVfs, handle, zEntry); + } + if( xInit==0 ){ + if( pzErrMsg ){ + nMsg += sqlite3Strlen30(zEntry); + *pzErrMsg = zErrmsg = sqlite3_malloc64(nMsg); + if( zErrmsg ){ + sqlite3_snprintf(nMsg, zErrmsg, + "no entry point [%s] in shared library [%s]", zEntry, zFile); + sqlite3OsDlError(pVfs, nMsg-1, zErrmsg); + } + } + sqlite3OsDlClose(pVfs, handle); + sqlite3_free(zAltEntry); + return SQLITE_ERROR; + } + sqlite3_free(zAltEntry); + rc = xInit(db, &zErrmsg, &sqlite3Apis); + if( rc ){ + if( rc==SQLITE_OK_LOAD_PERMANENTLY ) return SQLITE_OK; + if( pzErrMsg ){ + *pzErrMsg = sqlite3_mprintf("error during initialization: %s", zErrmsg); + } + sqlite3_free(zErrmsg); + sqlite3OsDlClose(pVfs, handle); + return SQLITE_ERROR; + } + + /* Append the new shared library handle to the db->aExtension array. */ + aHandle = sqlite3DbMallocZero(db, sizeof(handle)*(db->nExtension+1)); + if( aHandle==0 ){ + return SQLITE_NOMEM_BKPT; + } + if( db->nExtension>0 ){ + memcpy(aHandle, db->aExtension, sizeof(handle)*db->nExtension); + } + sqlite3DbFree(db, db->aExtension); + db->aExtension = aHandle; + + db->aExtension[db->nExtension++] = handle; + return SQLITE_OK; +} +SQLITE_API int sqlite3_load_extension( + sqlite3 *db, /* Load the extension into this database connection */ + const char *zFile, /* Name of the shared library containing extension */ + const char *zProc, /* Entry point. Use "sqlite3_extension_init" if 0 */ + char **pzErrMsg /* Put error message here if not 0 */ +){ + int rc; + sqlite3_mutex_enter(db->mutex); + rc = sqlite3LoadExtension(db, zFile, zProc, pzErrMsg); + rc = sqlite3ApiExit(db, rc); + sqlite3_mutex_leave(db->mutex); + return rc; +} + +/* +** Call this routine when the database connection is closing in order +** to clean up loaded extensions +*/ +SQLITE_PRIVATE void sqlite3CloseExtensions(sqlite3 *db){ + int i; + assert( sqlite3_mutex_held(db->mutex) ); + for(i=0; inExtension; i++){ + sqlite3OsDlClose(db->pVfs, db->aExtension[i]); + } + sqlite3DbFree(db, db->aExtension); +} + +/* +** Enable or disable extension loading. Extension loading is disabled by +** default so as not to open security holes in older applications. +*/ +SQLITE_API int sqlite3_enable_load_extension(sqlite3 *db, int onoff){ + sqlite3_mutex_enter(db->mutex); + if( onoff ){ + db->flags |= SQLITE_LoadExtension|SQLITE_LoadExtFunc; + }else{ + db->flags &= ~(SQLITE_LoadExtension|SQLITE_LoadExtFunc); + } + sqlite3_mutex_leave(db->mutex); + return SQLITE_OK; +} + +#endif /* !defined(SQLITE_OMIT_LOAD_EXTENSION) */ + +/* +** The following object holds the list of automatically loaded +** extensions. +** +** This list is shared across threads. The SQLITE_MUTEX_STATIC_MASTER +** mutex must be held while accessing this list. +*/ +typedef struct sqlite3AutoExtList sqlite3AutoExtList; +static SQLITE_WSD struct sqlite3AutoExtList { + u32 nExt; /* Number of entries in aExt[] */ + void (**aExt)(void); /* Pointers to the extension init functions */ +} sqlite3Autoext = { 0, 0 }; + +/* The "wsdAutoext" macro will resolve to the autoextension +** state vector. If writable static data is unsupported on the target, +** we have to locate the state vector at run-time. In the more common +** case where writable static data is supported, wsdStat can refer directly +** to the "sqlite3Autoext" state vector declared above. +*/ +#ifdef SQLITE_OMIT_WSD +# define wsdAutoextInit \ + sqlite3AutoExtList *x = &GLOBAL(sqlite3AutoExtList,sqlite3Autoext) +# define wsdAutoext x[0] +#else +# define wsdAutoextInit +# define wsdAutoext sqlite3Autoext +#endif + + +/* +** Register a statically linked extension that is automatically +** loaded by every new database connection. +*/ +SQLITE_API int sqlite3_auto_extension( + void (*xInit)(void) +){ + int rc = SQLITE_OK; +#ifndef SQLITE_OMIT_AUTOINIT + rc = sqlite3_initialize(); + if( rc ){ + return rc; + }else +#endif + { + u32 i; +#if SQLITE_THREADSAFE + sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); +#endif + wsdAutoextInit; + sqlite3_mutex_enter(mutex); + for(i=0; i=0; i--){ + if( wsdAutoext.aExt[i]==xInit ){ + wsdAutoext.nExt--; + wsdAutoext.aExt[i] = wsdAutoext.aExt[wsdAutoext.nExt]; + n++; + break; + } + } + sqlite3_mutex_leave(mutex); + return n; +} + +/* +** Reset the automatic extension loading mechanism. +*/ +SQLITE_API void sqlite3_reset_auto_extension(void){ +#ifndef SQLITE_OMIT_AUTOINIT + if( sqlite3_initialize()==SQLITE_OK ) +#endif + { +#if SQLITE_THREADSAFE + sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); +#endif + wsdAutoextInit; + sqlite3_mutex_enter(mutex); + sqlite3_free(wsdAutoext.aExt); + wsdAutoext.aExt = 0; + wsdAutoext.nExt = 0; + sqlite3_mutex_leave(mutex); + } +} + +/* +** Load all automatic extensions. +** +** If anything goes wrong, set an error in the database connection. +*/ +SQLITE_PRIVATE void sqlite3AutoLoadExtensions(sqlite3 *db){ + u32 i; + int go = 1; + int rc; + sqlite3_loadext_entry xInit; + + wsdAutoextInit; + if( wsdAutoext.nExt==0 ){ + /* Common case: early out without every having to acquire a mutex */ + return; + } + for(i=0; go; i++){ + char *zErrmsg; +#if SQLITE_THREADSAFE + sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); +#endif +#ifdef SQLITE_OMIT_LOAD_EXTENSION + const sqlite3_api_routines *pThunk = 0; +#else + const sqlite3_api_routines *pThunk = &sqlite3Apis; +#endif + sqlite3_mutex_enter(mutex); + if( i>=wsdAutoext.nExt ){ + xInit = 0; + go = 0; + }else{ + xInit = (sqlite3_loadext_entry)wsdAutoext.aExt[i]; + } + sqlite3_mutex_leave(mutex); + zErrmsg = 0; + if( xInit && (rc = xInit(db, &zErrmsg, pThunk))!=0 ){ + sqlite3ErrorWithMsg(db, rc, + "automatic extension loading failed: %s", zErrmsg); + go = 0; + } + sqlite3_free(zErrmsg); + } +} + +/************** End of loadext.c *********************************************/ +/************** Begin file pragma.c ******************************************/ +/* +** 2003 April 6 +** +** 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 implement the PRAGMA command. +*/ +/* #include "sqliteInt.h" */ + +#if !defined(SQLITE_ENABLE_LOCKING_STYLE) +# if defined(__APPLE__) +# define SQLITE_ENABLE_LOCKING_STYLE 1 +# else +# define SQLITE_ENABLE_LOCKING_STYLE 0 +# endif +#endif + +/*************************************************************************** +** The "pragma.h" include file is an automatically generated file that +** that includes the PragType_XXXX macro definitions and the aPragmaName[] +** object. This ensures that the aPragmaName[] table is arranged in +** lexicographical order to facility a binary search of the pragma name. +** Do not edit pragma.h directly. Edit and rerun the script in at +** ../tool/mkpragmatab.tcl. */ +/************** Include pragma.h in the middle of pragma.c *******************/ +/************** Begin file pragma.h ******************************************/ +/* DO NOT EDIT! +** This file is automatically generated by the script at +** ../tool/mkpragmatab.tcl. To update the set of pragmas, edit +** that script and rerun it. +*/ +#define PragTyp_HEADER_VALUE 0 +#define PragTyp_AUTO_VACUUM 1 +#define PragTyp_FLAG 2 +#define PragTyp_BUSY_TIMEOUT 3 +#define PragTyp_CACHE_SIZE 4 +#define PragTyp_CACHE_SPILL 5 +#define PragTyp_CASE_SENSITIVE_LIKE 6 +#define PragTyp_COLLATION_LIST 7 +#define PragTyp_COMPILE_OPTIONS 8 +#define PragTyp_DATA_STORE_DIRECTORY 9 +#define PragTyp_DATABASE_LIST 10 +#define PragTyp_DEFAULT_CACHE_SIZE 11 +#define PragTyp_ENCODING 12 +#define PragTyp_FOREIGN_KEY_CHECK 13 +#define PragTyp_FOREIGN_KEY_LIST 14 +#define PragTyp_INCREMENTAL_VACUUM 15 +#define PragTyp_INDEX_INFO 16 +#define PragTyp_INDEX_LIST 17 +#define PragTyp_INTEGRITY_CHECK 18 +#define PragTyp_JOURNAL_MODE 19 +#define PragTyp_JOURNAL_SIZE_LIMIT 20 +#define PragTyp_LOCK_PROXY_FILE 21 +#define PragTyp_LOCKING_MODE 22 +#define PragTyp_PAGE_COUNT 23 +#define PragTyp_MMAP_SIZE 24 +#define PragTyp_PAGE_SIZE 25 +#define PragTyp_SECURE_DELETE 26 +#define PragTyp_SHRINK_MEMORY 27 +#define PragTyp_SOFT_HEAP_LIMIT 28 +#define PragTyp_STATS 29 +#define PragTyp_SYNCHRONOUS 30 +#define PragTyp_TABLE_INFO 31 +#define PragTyp_TEMP_STORE 32 +#define PragTyp_TEMP_STORE_DIRECTORY 33 +#define PragTyp_THREADS 34 +#define PragTyp_WAL_AUTOCHECKPOINT 35 +#define PragTyp_WAL_CHECKPOINT 36 +#define PragTyp_ACTIVATE_EXTENSIONS 37 +#define PragTyp_HEXKEY 38 +#define PragTyp_KEY 39 +#define PragTyp_REKEY 40 +#define PragTyp_LOCK_STATUS 41 +#define PragTyp_PARSER_TRACE 42 +#define PragFlag_NeedSchema 0x01 +#define PragFlag_ReadOnly 0x02 +static const struct sPragmaNames { + const char *const zName; /* Name of pragma */ + u8 ePragTyp; /* PragTyp_XXX value */ + u8 mPragFlag; /* Zero or more PragFlag_XXX values */ + u32 iArg; /* Extra argument */ +} aPragmaNames[] = { +#if defined(SQLITE_HAS_CODEC) || defined(SQLITE_ENABLE_CEROD) + { /* zName: */ "activate_extensions", + /* ePragTyp: */ PragTyp_ACTIVATE_EXTENSIONS, + /* ePragFlag: */ 0, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS) + { /* zName: */ "application_id", + /* ePragTyp: */ PragTyp_HEADER_VALUE, + /* ePragFlag: */ 0, + /* iArg: */ BTREE_APPLICATION_ID }, +#endif +#if !defined(SQLITE_OMIT_AUTOVACUUM) + { /* zName: */ "auto_vacuum", + /* ePragTyp: */ PragTyp_AUTO_VACUUM, + /* ePragFlag: */ PragFlag_NeedSchema, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) +#if !defined(SQLITE_OMIT_AUTOMATIC_INDEX) + { /* zName: */ "automatic_index", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlag: */ 0, + /* iArg: */ SQLITE_AutoIndex }, +#endif +#endif + { /* zName: */ "busy_timeout", + /* ePragTyp: */ PragTyp_BUSY_TIMEOUT, + /* ePragFlag: */ 0, + /* iArg: */ 0 }, +#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) + { /* zName: */ "cache_size", + /* ePragTyp: */ PragTyp_CACHE_SIZE, + /* ePragFlag: */ PragFlag_NeedSchema, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) + { /* zName: */ "cache_spill", + /* ePragTyp: */ PragTyp_CACHE_SPILL, + /* ePragFlag: */ 0, + /* iArg: */ 0 }, +#endif + { /* zName: */ "case_sensitive_like", + /* ePragTyp: */ PragTyp_CASE_SENSITIVE_LIKE, + /* ePragFlag: */ 0, + /* iArg: */ 0 }, + { /* zName: */ "cell_size_check", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlag: */ 0, + /* iArg: */ SQLITE_CellSizeCk }, +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) + { /* zName: */ "checkpoint_fullfsync", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlag: */ 0, + /* iArg: */ SQLITE_CkptFullFSync }, +#endif +#if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) + { /* zName: */ "collation_list", + /* ePragTyp: */ PragTyp_COLLATION_LIST, + /* ePragFlag: */ 0, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_COMPILEOPTION_DIAGS) + { /* zName: */ "compile_options", + /* ePragTyp: */ PragTyp_COMPILE_OPTIONS, + /* ePragFlag: */ 0, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) + { /* zName: */ "count_changes", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlag: */ 0, + /* iArg: */ SQLITE_CountRows }, +#endif +#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && SQLITE_OS_WIN + { /* zName: */ "data_store_directory", + /* ePragTyp: */ PragTyp_DATA_STORE_DIRECTORY, + /* ePragFlag: */ 0, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS) + { /* zName: */ "data_version", + /* ePragTyp: */ PragTyp_HEADER_VALUE, + /* ePragFlag: */ PragFlag_ReadOnly, + /* iArg: */ BTREE_DATA_VERSION }, +#endif +#if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) + { /* zName: */ "database_list", + /* ePragTyp: */ PragTyp_DATABASE_LIST, + /* ePragFlag: */ PragFlag_NeedSchema, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && !defined(SQLITE_OMIT_DEPRECATED) + { /* zName: */ "default_cache_size", + /* ePragTyp: */ PragTyp_DEFAULT_CACHE_SIZE, + /* ePragFlag: */ PragFlag_NeedSchema, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) +#if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER) + { /* zName: */ "defer_foreign_keys", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlag: */ 0, + /* iArg: */ SQLITE_DeferFKs }, +#endif +#endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) + { /* zName: */ "empty_result_callbacks", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlag: */ 0, + /* iArg: */ SQLITE_NullCallback }, +#endif +#if !defined(SQLITE_OMIT_UTF16) + { /* zName: */ "encoding", + /* ePragTyp: */ PragTyp_ENCODING, + /* ePragFlag: */ 0, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER) + { /* zName: */ "foreign_key_check", + /* ePragTyp: */ PragTyp_FOREIGN_KEY_CHECK, + /* ePragFlag: */ PragFlag_NeedSchema, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_FOREIGN_KEY) + { /* zName: */ "foreign_key_list", + /* ePragTyp: */ PragTyp_FOREIGN_KEY_LIST, + /* ePragFlag: */ PragFlag_NeedSchema, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) +#if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER) + { /* zName: */ "foreign_keys", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlag: */ 0, + /* iArg: */ SQLITE_ForeignKeys }, +#endif +#endif +#if !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS) + { /* zName: */ "freelist_count", + /* ePragTyp: */ PragTyp_HEADER_VALUE, + /* ePragFlag: */ PragFlag_ReadOnly, + /* iArg: */ BTREE_FREE_PAGE_COUNT }, +#endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) + { /* zName: */ "full_column_names", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlag: */ 0, + /* iArg: */ SQLITE_FullColNames }, + { /* zName: */ "fullfsync", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlag: */ 0, + /* iArg: */ SQLITE_FullFSync }, +#endif +#if defined(SQLITE_HAS_CODEC) + { /* zName: */ "hexkey", + /* ePragTyp: */ PragTyp_HEXKEY, + /* ePragFlag: */ 0, + /* iArg: */ 0 }, + { /* zName: */ "hexrekey", + /* ePragTyp: */ PragTyp_HEXKEY, + /* ePragFlag: */ 0, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) +#if !defined(SQLITE_OMIT_CHECK) + { /* zName: */ "ignore_check_constraints", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlag: */ 0, + /* iArg: */ SQLITE_IgnoreChecks }, +#endif +#endif +#if !defined(SQLITE_OMIT_AUTOVACUUM) + { /* zName: */ "incremental_vacuum", + /* ePragTyp: */ PragTyp_INCREMENTAL_VACUUM, + /* ePragFlag: */ PragFlag_NeedSchema, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) + { /* zName: */ "index_info", + /* ePragTyp: */ PragTyp_INDEX_INFO, + /* ePragFlag: */ PragFlag_NeedSchema, + /* iArg: */ 0 }, + { /* zName: */ "index_list", + /* ePragTyp: */ PragTyp_INDEX_LIST, + /* ePragFlag: */ PragFlag_NeedSchema, + /* iArg: */ 0 }, + { /* zName: */ "index_xinfo", + /* ePragTyp: */ PragTyp_INDEX_INFO, + /* ePragFlag: */ PragFlag_NeedSchema, + /* iArg: */ 1 }, +#endif +#if !defined(SQLITE_OMIT_INTEGRITY_CHECK) + { /* zName: */ "integrity_check", + /* ePragTyp: */ PragTyp_INTEGRITY_CHECK, + /* ePragFlag: */ PragFlag_NeedSchema, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) + { /* zName: */ "journal_mode", + /* ePragTyp: */ PragTyp_JOURNAL_MODE, + /* ePragFlag: */ PragFlag_NeedSchema, + /* iArg: */ 0 }, + { /* zName: */ "journal_size_limit", + /* ePragTyp: */ PragTyp_JOURNAL_SIZE_LIMIT, + /* ePragFlag: */ 0, + /* iArg: */ 0 }, +#endif +#if defined(SQLITE_HAS_CODEC) + { /* zName: */ "key", + /* ePragTyp: */ PragTyp_KEY, + /* ePragFlag: */ 0, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) + { /* zName: */ "legacy_file_format", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlag: */ 0, + /* iArg: */ SQLITE_LegacyFileFmt }, +#endif +#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && SQLITE_ENABLE_LOCKING_STYLE + { /* zName: */ "lock_proxy_file", + /* ePragTyp: */ PragTyp_LOCK_PROXY_FILE, + /* ePragFlag: */ 0, + /* iArg: */ 0 }, +#endif +#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) + { /* zName: */ "lock_status", + /* ePragTyp: */ PragTyp_LOCK_STATUS, + /* ePragFlag: */ 0, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) + { /* zName: */ "locking_mode", + /* ePragTyp: */ PragTyp_LOCKING_MODE, + /* ePragFlag: */ 0, + /* iArg: */ 0 }, + { /* zName: */ "max_page_count", + /* ePragTyp: */ PragTyp_PAGE_COUNT, + /* ePragFlag: */ PragFlag_NeedSchema, + /* iArg: */ 0 }, + { /* zName: */ "mmap_size", + /* ePragTyp: */ PragTyp_MMAP_SIZE, + /* ePragFlag: */ 0, + /* iArg: */ 0 }, + { /* zName: */ "page_count", + /* ePragTyp: */ PragTyp_PAGE_COUNT, + /* ePragFlag: */ PragFlag_NeedSchema, + /* iArg: */ 0 }, + { /* zName: */ "page_size", + /* ePragTyp: */ PragTyp_PAGE_SIZE, + /* ePragFlag: */ 0, + /* iArg: */ 0 }, +#endif +#if defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_PARSER_TRACE) + { /* zName: */ "parser_trace", + /* ePragTyp: */ PragTyp_PARSER_TRACE, + /* ePragFlag: */ 0, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) + { /* zName: */ "query_only", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlag: */ 0, + /* iArg: */ SQLITE_QueryOnly }, +#endif +#if !defined(SQLITE_OMIT_INTEGRITY_CHECK) + { /* zName: */ "quick_check", + /* ePragTyp: */ PragTyp_INTEGRITY_CHECK, + /* ePragFlag: */ PragFlag_NeedSchema, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) + { /* zName: */ "read_uncommitted", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlag: */ 0, + /* iArg: */ SQLITE_ReadUncommitted }, + { /* zName: */ "recursive_triggers", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlag: */ 0, + /* iArg: */ SQLITE_RecTriggers }, +#endif +#if defined(SQLITE_HAS_CODEC) + { /* zName: */ "rekey", + /* ePragTyp: */ PragTyp_REKEY, + /* ePragFlag: */ 0, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) + { /* zName: */ "reverse_unordered_selects", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlag: */ 0, + /* iArg: */ SQLITE_ReverseOrder }, +#endif +#if !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS) + { /* zName: */ "schema_version", + /* ePragTyp: */ PragTyp_HEADER_VALUE, + /* ePragFlag: */ 0, + /* iArg: */ BTREE_SCHEMA_VERSION }, +#endif +#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) + { /* zName: */ "secure_delete", + /* ePragTyp: */ PragTyp_SECURE_DELETE, + /* ePragFlag: */ 0, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) + { /* zName: */ "short_column_names", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlag: */ 0, + /* iArg: */ SQLITE_ShortColNames }, +#endif + { /* zName: */ "shrink_memory", + /* ePragTyp: */ PragTyp_SHRINK_MEMORY, + /* ePragFlag: */ 0, + /* iArg: */ 0 }, + { /* zName: */ "soft_heap_limit", + /* ePragTyp: */ PragTyp_SOFT_HEAP_LIMIT, + /* ePragFlag: */ 0, + /* iArg: */ 0 }, +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) +#if defined(SQLITE_DEBUG) + { /* zName: */ "sql_trace", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlag: */ 0, + /* iArg: */ SQLITE_SqlTrace }, +#endif +#endif +#if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) + { /* zName: */ "stats", + /* ePragTyp: */ PragTyp_STATS, + /* ePragFlag: */ PragFlag_NeedSchema, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) + { /* zName: */ "synchronous", + /* ePragTyp: */ PragTyp_SYNCHRONOUS, + /* ePragFlag: */ PragFlag_NeedSchema, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) + { /* zName: */ "table_info", + /* ePragTyp: */ PragTyp_TABLE_INFO, + /* ePragFlag: */ PragFlag_NeedSchema, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) + { /* zName: */ "temp_store", + /* ePragTyp: */ PragTyp_TEMP_STORE, + /* ePragFlag: */ 0, + /* iArg: */ 0 }, + { /* zName: */ "temp_store_directory", + /* ePragTyp: */ PragTyp_TEMP_STORE_DIRECTORY, + /* ePragFlag: */ 0, + /* iArg: */ 0 }, +#endif + { /* zName: */ "threads", + /* ePragTyp: */ PragTyp_THREADS, + /* ePragFlag: */ 0, + /* iArg: */ 0 }, +#if !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS) + { /* zName: */ "user_version", + /* ePragTyp: */ PragTyp_HEADER_VALUE, + /* ePragFlag: */ 0, + /* iArg: */ BTREE_USER_VERSION }, +#endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) +#if defined(SQLITE_DEBUG) + { /* zName: */ "vdbe_addoptrace", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlag: */ 0, + /* iArg: */ SQLITE_VdbeAddopTrace }, + { /* zName: */ "vdbe_debug", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlag: */ 0, + /* iArg: */ SQLITE_SqlTrace|SQLITE_VdbeListing|SQLITE_VdbeTrace }, + { /* zName: */ "vdbe_eqp", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlag: */ 0, + /* iArg: */ SQLITE_VdbeEQP }, + { /* zName: */ "vdbe_listing", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlag: */ 0, + /* iArg: */ SQLITE_VdbeListing }, + { /* zName: */ "vdbe_trace", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlag: */ 0, + /* iArg: */ SQLITE_VdbeTrace }, +#endif +#endif +#if !defined(SQLITE_OMIT_WAL) + { /* zName: */ "wal_autocheckpoint", + /* ePragTyp: */ PragTyp_WAL_AUTOCHECKPOINT, + /* ePragFlag: */ 0, + /* iArg: */ 0 }, + { /* zName: */ "wal_checkpoint", + /* ePragTyp: */ PragTyp_WAL_CHECKPOINT, + /* ePragFlag: */ PragFlag_NeedSchema, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) + { /* zName: */ "writable_schema", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlag: */ 0, + /* iArg: */ SQLITE_WriteSchema|SQLITE_RecoveryMode }, +#endif +}; +/* Number of pragmas: 60 on by default, 73 total. */ + +/************** End of pragma.h **********************************************/ +/************** Continuing where we left off in pragma.c *********************/ + +/* +** Interpret the given string as a safety level. Return 0 for OFF, +** 1 for ON or NORMAL, 2 for FULL, and 3 for EXTRA. Return 1 for an empty or +** unrecognized string argument. The FULL and EXTRA option is disallowed +** if the omitFull parameter it 1. +** +** Note that the values returned are one less that the values that +** should be passed into sqlite3BtreeSetSafetyLevel(). The is done +** to support legacy SQL code. The safety level used to be boolean +** and older scripts may have used numbers 0 for OFF and 1 for ON. +*/ +static u8 getSafetyLevel(const char *z, int omitFull, u8 dflt){ + /* 123456789 123456789 123 */ + static const char zText[] = "onoffalseyestruextrafull"; + static const u8 iOffset[] = {0, 1, 2, 4, 9, 12, 15, 20}; + static const u8 iLength[] = {2, 2, 3, 5, 3, 4, 5, 4}; + static const u8 iValue[] = {1, 0, 0, 0, 1, 1, 3, 2}; + /* on no off false yes true extra full */ + int i, n; + if( sqlite3Isdigit(*z) ){ + return (u8)sqlite3Atoi(z); + } + n = sqlite3Strlen30(z); + for(i=0; i=0&&i<=2)?i:0); +} +#endif /* ifndef SQLITE_OMIT_AUTOVACUUM */ + +#ifndef SQLITE_OMIT_PAGER_PRAGMAS +/* +** Interpret the given string as a temp db location. Return 1 for file +** backed temporary databases, 2 for the Red-Black tree in memory database +** and 0 to use the compile-time default. +*/ +static int getTempStore(const char *z){ + if( z[0]>='0' && z[0]<='2' ){ + return z[0] - '0'; + }else if( sqlite3StrICmp(z, "file")==0 ){ + return 1; + }else if( sqlite3StrICmp(z, "memory")==0 ){ + return 2; + }else{ + return 0; + } +} +#endif /* SQLITE_PAGER_PRAGMAS */ + +#ifndef SQLITE_OMIT_PAGER_PRAGMAS +/* +** Invalidate temp storage, either when the temp storage is changed +** from default, or when 'file' and the temp_store_directory has changed +*/ +static int invalidateTempStorage(Parse *pParse){ + sqlite3 *db = pParse->db; + if( db->aDb[1].pBt!=0 ){ + if( !db->autoCommit || sqlite3BtreeIsInReadTrans(db->aDb[1].pBt) ){ + sqlite3ErrorMsg(pParse, "temporary storage cannot be changed " + "from within a transaction"); + return SQLITE_ERROR; + } + sqlite3BtreeClose(db->aDb[1].pBt); + db->aDb[1].pBt = 0; + sqlite3ResetAllSchemasOfConnection(db); + } + return SQLITE_OK; +} +#endif /* SQLITE_PAGER_PRAGMAS */ + +#ifndef SQLITE_OMIT_PAGER_PRAGMAS +/* +** If the TEMP database is open, close it and mark the database schema +** as needing reloading. This must be done when using the SQLITE_TEMP_STORE +** or DEFAULT_TEMP_STORE pragmas. +*/ +static int changeTempStorage(Parse *pParse, const char *zStorageType){ + int ts = getTempStore(zStorageType); + sqlite3 *db = pParse->db; + if( db->temp_store==ts ) return SQLITE_OK; + if( invalidateTempStorage( pParse ) != SQLITE_OK ){ + return SQLITE_ERROR; + } + db->temp_store = (u8)ts; + return SQLITE_OK; +} +#endif /* SQLITE_PAGER_PRAGMAS */ + +/* +** Set the names of the first N columns to the values in azCol[] +*/ +static void setAllColumnNames( + Vdbe *v, /* The query under construction */ + int N, /* Number of columns */ + const char **azCol /* Names of columns */ +){ + int i; + sqlite3VdbeSetNumCols(v, N); + for(i=0; iautoCommit ){ + Db *pDb = db->aDb; + int n = db->nDb; + assert( SQLITE_FullFSync==PAGER_FULLFSYNC ); + assert( SQLITE_CkptFullFSync==PAGER_CKPT_FULLFSYNC ); + assert( SQLITE_CacheSpill==PAGER_CACHESPILL ); + assert( (PAGER_FULLFSYNC | PAGER_CKPT_FULLFSYNC | PAGER_CACHESPILL) + == PAGER_FLAGS_MASK ); + assert( (pDb->safety_level & PAGER_SYNCHRONOUS_MASK)==pDb->safety_level ); + while( (n--) > 0 ){ + if( pDb->pBt ){ + sqlite3BtreeSetPagerFlags(pDb->pBt, + pDb->safety_level | (db->flags & PAGER_FLAGS_MASK) ); + } + pDb++; + } + } +} +#else +# define setAllPagerFlags(X) /* no-op */ +#endif + + +/* +** Return a human-readable name for a constraint resolution action. +*/ +#ifndef SQLITE_OMIT_FOREIGN_KEY +static const char *actionName(u8 action){ + const char *zName; + switch( action ){ + case OE_SetNull: zName = "SET NULL"; break; + case OE_SetDflt: zName = "SET DEFAULT"; break; + case OE_Cascade: zName = "CASCADE"; break; + case OE_Restrict: zName = "RESTRICT"; break; + default: zName = "NO ACTION"; + assert( action==OE_None ); break; + } + return zName; +} +#endif + + +/* +** Parameter eMode must be one of the PAGER_JOURNALMODE_XXX constants +** defined in pager.h. This function returns the associated lowercase +** journal-mode name. +*/ +SQLITE_PRIVATE const char *sqlite3JournalModename(int eMode){ + static char * const azModeName[] = { + "delete", "persist", "off", "truncate", "memory" +#ifndef SQLITE_OMIT_WAL + , "wal" +#endif + }; + assert( PAGER_JOURNALMODE_DELETE==0 ); + assert( PAGER_JOURNALMODE_PERSIST==1 ); + assert( PAGER_JOURNALMODE_OFF==2 ); + assert( PAGER_JOURNALMODE_TRUNCATE==3 ); + assert( PAGER_JOURNALMODE_MEMORY==4 ); + assert( PAGER_JOURNALMODE_WAL==5 ); + assert( eMode>=0 && eMode<=ArraySize(azModeName) ); + + if( eMode==ArraySize(azModeName) ) return 0; + return azModeName[eMode]; +} + +/* +** Process a pragma statement. +** +** Pragmas are of this form: +** +** PRAGMA [schema.]id [= value] +** +** The identifier might also be a string. The value is a string, and +** identifier, or a number. If minusFlag is true, then the value is +** a number that was preceded by a minus sign. +** +** If the left side is "database.id" then pId1 is the database name +** and pId2 is the id. If the left side is just "id" then pId1 is the +** id and pId2 is any empty string. +*/ +SQLITE_PRIVATE void sqlite3Pragma( + Parse *pParse, + Token *pId1, /* First part of [schema.]id field */ + Token *pId2, /* Second part of [schema.]id field, or NULL */ + Token *pValue, /* Token for , or NULL */ + int minusFlag /* True if a '-' sign preceded */ +){ + char *zLeft = 0; /* Nul-terminated UTF-8 string */ + char *zRight = 0; /* Nul-terminated UTF-8 string , or NULL */ + const char *zDb = 0; /* The database name */ + Token *pId; /* Pointer to token */ + char *aFcntl[4]; /* Argument to SQLITE_FCNTL_PRAGMA */ + int iDb; /* Database index for */ + int lwr, upr, mid = 0; /* Binary search bounds */ + int rc; /* return value form SQLITE_FCNTL_PRAGMA */ + sqlite3 *db = pParse->db; /* The database connection */ + Db *pDb; /* The specific database being pragmaed */ + Vdbe *v = sqlite3GetVdbe(pParse); /* Prepared statement */ + const struct sPragmaNames *pPragma; + + if( v==0 ) return; + sqlite3VdbeRunOnlyOnce(v); + pParse->nMem = 2; + + /* Interpret the [schema.] part of the pragma statement. iDb is the + ** index of the database this pragma is being applied to in db.aDb[]. */ + iDb = sqlite3TwoPartName(pParse, pId1, pId2, &pId); + if( iDb<0 ) return; + pDb = &db->aDb[iDb]; + + /* If the temp database has been explicitly named as part of the + ** pragma, make sure it is open. + */ + if( iDb==1 && sqlite3OpenTempDatabase(pParse) ){ + return; + } + + zLeft = sqlite3NameFromToken(db, pId); + if( !zLeft ) return; + if( minusFlag ){ + zRight = sqlite3MPrintf(db, "-%T", pValue); + }else{ + zRight = sqlite3NameFromToken(db, pValue); + } + + assert( pId2 ); + zDb = pId2->n>0 ? pDb->zDbSName : 0; + if( sqlite3AuthCheck(pParse, SQLITE_PRAGMA, zLeft, zRight, zDb) ){ + goto pragma_out; + } + + /* Send an SQLITE_FCNTL_PRAGMA file-control to the underlying VFS + ** connection. If it returns SQLITE_OK, then assume that the VFS + ** handled the pragma and generate a no-op prepared statement. + ** + ** IMPLEMENTATION-OF: R-12238-55120 Whenever a PRAGMA statement is parsed, + ** an SQLITE_FCNTL_PRAGMA file control is sent to the open sqlite3_file + ** object corresponding to the database file to which the pragma + ** statement refers. + ** + ** IMPLEMENTATION-OF: R-29875-31678 The argument to the SQLITE_FCNTL_PRAGMA + ** file control is an array of pointers to strings (char**) in which the + ** second element of the array is the name of the pragma and the third + ** element is the argument to the pragma or NULL if the pragma has no + ** argument. + */ + aFcntl[0] = 0; + aFcntl[1] = zLeft; + aFcntl[2] = zRight; + aFcntl[3] = 0; + db->busyHandler.nBusy = 0; + rc = sqlite3_file_control(db, zDb, SQLITE_FCNTL_PRAGMA, (void*)aFcntl); + if( rc==SQLITE_OK ){ + returnSingleText(v, "result", aFcntl[0]); + sqlite3_free(aFcntl[0]); + goto pragma_out; + } + if( rc!=SQLITE_NOTFOUND ){ + if( aFcntl[0] ){ + sqlite3ErrorMsg(pParse, "%s", aFcntl[0]); + sqlite3_free(aFcntl[0]); + } + pParse->nErr++; + pParse->rc = rc; + goto pragma_out; + } + + /* Locate the pragma in the lookup table */ + lwr = 0; + upr = ArraySize(aPragmaNames)-1; + while( lwr<=upr ){ + mid = (lwr+upr)/2; + rc = sqlite3_stricmp(zLeft, aPragmaNames[mid].zName); + if( rc==0 ) break; + if( rc<0 ){ + upr = mid - 1; + }else{ + lwr = mid + 1; + } + } + if( lwr>upr ) goto pragma_out; + pPragma = &aPragmaNames[mid]; + + /* Make sure the database schema is loaded if the pragma requires that */ + if( (pPragma->mPragFlag & PragFlag_NeedSchema)!=0 ){ + if( sqlite3ReadSchema(pParse) ) goto pragma_out; + } + + /* Jump to the appropriate pragma handler */ + switch( pPragma->ePragTyp ){ + +#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && !defined(SQLITE_OMIT_DEPRECATED) + /* + ** PRAGMA [schema.]default_cache_size + ** PRAGMA [schema.]default_cache_size=N + ** + ** The first form reports the current persistent setting for the + ** page cache size. The value returned is the maximum number of + ** pages in the page cache. The second form sets both the current + ** page cache size value and the persistent page cache size value + ** stored in the database file. + ** + ** Older versions of SQLite would set the default cache size to a + ** negative number to indicate synchronous=OFF. These days, synchronous + ** is always on by default regardless of the sign of the default cache + ** size. But continue to take the absolute value of the default cache + ** size of historical compatibility. + */ + case PragTyp_DEFAULT_CACHE_SIZE: { + static const int iLn = VDBE_OFFSET_LINENO(2); + static const VdbeOpList getCacheSize[] = { + { OP_Transaction, 0, 0, 0}, /* 0 */ + { OP_ReadCookie, 0, 1, BTREE_DEFAULT_CACHE_SIZE}, /* 1 */ + { OP_IfPos, 1, 8, 0}, + { OP_Integer, 0, 2, 0}, + { OP_Subtract, 1, 2, 1}, + { OP_IfPos, 1, 8, 0}, + { OP_Integer, 0, 1, 0}, /* 6 */ + { OP_Noop, 0, 0, 0}, + { OP_ResultRow, 1, 1, 0}, + }; + VdbeOp *aOp; + sqlite3VdbeUsesBtree(v, iDb); + if( !zRight ){ + setOneColumnName(v, "cache_size"); + pParse->nMem += 2; + sqlite3VdbeVerifyNoMallocRequired(v, ArraySize(getCacheSize)); + aOp = sqlite3VdbeAddOpList(v, ArraySize(getCacheSize), getCacheSize, iLn); + if( ONLY_IF_REALLOC_STRESS(aOp==0) ) break; + aOp[0].p1 = iDb; + aOp[1].p1 = iDb; + aOp[6].p1 = SQLITE_DEFAULT_CACHE_SIZE; + }else{ + int size = sqlite3AbsInt32(sqlite3Atoi(zRight)); + sqlite3BeginWriteOperation(pParse, 0, iDb); + sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_DEFAULT_CACHE_SIZE, size); + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + pDb->pSchema->cache_size = size; + sqlite3BtreeSetCacheSize(pDb->pBt, pDb->pSchema->cache_size); + } + break; + } +#endif /* !SQLITE_OMIT_PAGER_PRAGMAS && !SQLITE_OMIT_DEPRECATED */ + +#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) + /* + ** PRAGMA [schema.]page_size + ** PRAGMA [schema.]page_size=N + ** + ** The first form reports the current setting for the + ** database page size in bytes. The second form sets the + ** database page size value. The value can only be set if + ** the database has not yet been created. + */ + case PragTyp_PAGE_SIZE: { + Btree *pBt = pDb->pBt; + assert( pBt!=0 ); + if( !zRight ){ + int size = ALWAYS(pBt) ? sqlite3BtreeGetPageSize(pBt) : 0; + returnSingleInt(v, "page_size", size); + }else{ + /* Malloc may fail when setting the page-size, as there is an internal + ** buffer that the pager module resizes using sqlite3_realloc(). + */ + db->nextPagesize = sqlite3Atoi(zRight); + if( SQLITE_NOMEM==sqlite3BtreeSetPageSize(pBt, db->nextPagesize,-1,0) ){ + sqlite3OomFault(db); + } + } + break; + } + + /* + ** PRAGMA [schema.]secure_delete + ** PRAGMA [schema.]secure_delete=ON/OFF + ** + ** The first form reports the current setting for the + ** secure_delete flag. The second form changes the secure_delete + ** flag setting and reports thenew value. + */ + case PragTyp_SECURE_DELETE: { + Btree *pBt = pDb->pBt; + int b = -1; + assert( pBt!=0 ); + if( zRight ){ + b = sqlite3GetBoolean(zRight, 0); + } + if( pId2->n==0 && b>=0 ){ + int ii; + for(ii=0; iinDb; ii++){ + sqlite3BtreeSecureDelete(db->aDb[ii].pBt, b); + } + } + b = sqlite3BtreeSecureDelete(pBt, b); + returnSingleInt(v, "secure_delete", b); + break; + } + + /* + ** PRAGMA [schema.]max_page_count + ** PRAGMA [schema.]max_page_count=N + ** + ** The first form reports the current setting for the + ** maximum number of pages in the database file. The + ** second form attempts to change this setting. Both + ** forms return the current setting. + ** + ** The absolute value of N is used. This is undocumented and might + ** change. The only purpose is to provide an easy way to test + ** the sqlite3AbsInt32() function. + ** + ** PRAGMA [schema.]page_count + ** + ** Return the number of pages in the specified database. + */ + case PragTyp_PAGE_COUNT: { + int iReg; + sqlite3CodeVerifySchema(pParse, iDb); + iReg = ++pParse->nMem; + if( sqlite3Tolower(zLeft[0])=='p' ){ + sqlite3VdbeAddOp2(v, OP_Pagecount, iDb, iReg); + }else{ + sqlite3VdbeAddOp3(v, OP_MaxPgcnt, iDb, iReg, + sqlite3AbsInt32(sqlite3Atoi(zRight))); + } + sqlite3VdbeAddOp2(v, OP_ResultRow, iReg, 1); + sqlite3VdbeSetNumCols(v, 1); + sqlite3VdbeSetColName(v, 0, COLNAME_NAME, zLeft, SQLITE_TRANSIENT); + break; + } + + /* + ** PRAGMA [schema.]locking_mode + ** PRAGMA [schema.]locking_mode = (normal|exclusive) + */ + case PragTyp_LOCKING_MODE: { + const char *zRet = "normal"; + int eMode = getLockingMode(zRight); + + if( pId2->n==0 && eMode==PAGER_LOCKINGMODE_QUERY ){ + /* Simple "PRAGMA locking_mode;" statement. This is a query for + ** the current default locking mode (which may be different to + ** the locking-mode of the main database). + */ + eMode = db->dfltLockMode; + }else{ + Pager *pPager; + if( pId2->n==0 ){ + /* This indicates that no database name was specified as part + ** of the PRAGMA command. In this case the locking-mode must be + ** set on all attached databases, as well as the main db file. + ** + ** Also, the sqlite3.dfltLockMode variable is set so that + ** any subsequently attached databases also use the specified + ** locking mode. + */ + int ii; + assert(pDb==&db->aDb[0]); + for(ii=2; iinDb; ii++){ + pPager = sqlite3BtreePager(db->aDb[ii].pBt); + sqlite3PagerLockingMode(pPager, eMode); + } + db->dfltLockMode = (u8)eMode; + } + pPager = sqlite3BtreePager(pDb->pBt); + eMode = sqlite3PagerLockingMode(pPager, eMode); + } + + assert( eMode==PAGER_LOCKINGMODE_NORMAL + || eMode==PAGER_LOCKINGMODE_EXCLUSIVE ); + if( eMode==PAGER_LOCKINGMODE_EXCLUSIVE ){ + zRet = "exclusive"; + } + returnSingleText(v, "locking_mode", zRet); + break; + } + + /* + ** PRAGMA [schema.]journal_mode + ** PRAGMA [schema.]journal_mode = + ** (delete|persist|off|truncate|memory|wal|off) + */ + case PragTyp_JOURNAL_MODE: { + int eMode; /* One of the PAGER_JOURNALMODE_XXX symbols */ + int ii; /* Loop counter */ + + setOneColumnName(v, "journal_mode"); + if( zRight==0 ){ + /* If there is no "=MODE" part of the pragma, do a query for the + ** current mode */ + eMode = PAGER_JOURNALMODE_QUERY; + }else{ + const char *zMode; + int n = sqlite3Strlen30(zRight); + for(eMode=0; (zMode = sqlite3JournalModename(eMode))!=0; eMode++){ + if( sqlite3StrNICmp(zRight, zMode, n)==0 ) break; + } + if( !zMode ){ + /* If the "=MODE" part does not match any known journal mode, + ** then do a query */ + eMode = PAGER_JOURNALMODE_QUERY; + } + } + if( eMode==PAGER_JOURNALMODE_QUERY && pId2->n==0 ){ + /* Convert "PRAGMA journal_mode" into "PRAGMA main.journal_mode" */ + iDb = 0; + pId2->n = 1; + } + for(ii=db->nDb-1; ii>=0; ii--){ + if( db->aDb[ii].pBt && (ii==iDb || pId2->n==0) ){ + sqlite3VdbeUsesBtree(v, ii); + sqlite3VdbeAddOp3(v, OP_JournalMode, ii, 1, eMode); + } + } + sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1); + break; + } + + /* + ** PRAGMA [schema.]journal_size_limit + ** PRAGMA [schema.]journal_size_limit=N + ** + ** Get or set the size limit on rollback journal files. + */ + case PragTyp_JOURNAL_SIZE_LIMIT: { + Pager *pPager = sqlite3BtreePager(pDb->pBt); + i64 iLimit = -2; + if( zRight ){ + sqlite3DecOrHexToI64(zRight, &iLimit); + if( iLimit<-1 ) iLimit = -1; + } + iLimit = sqlite3PagerJournalSizeLimit(pPager, iLimit); + returnSingleInt(v, "journal_size_limit", iLimit); + break; + } + +#endif /* SQLITE_OMIT_PAGER_PRAGMAS */ + + /* + ** PRAGMA [schema.]auto_vacuum + ** PRAGMA [schema.]auto_vacuum=N + ** + ** Get or set the value of the database 'auto-vacuum' parameter. + ** The value is one of: 0 NONE 1 FULL 2 INCREMENTAL + */ +#ifndef SQLITE_OMIT_AUTOVACUUM + case PragTyp_AUTO_VACUUM: { + Btree *pBt = pDb->pBt; + assert( pBt!=0 ); + if( !zRight ){ + returnSingleInt(v, "auto_vacuum", sqlite3BtreeGetAutoVacuum(pBt)); + }else{ + int eAuto = getAutoVacuum(zRight); + assert( eAuto>=0 && eAuto<=2 ); + db->nextAutovac = (u8)eAuto; + /* Call SetAutoVacuum() to set initialize the internal auto and + ** incr-vacuum flags. This is required in case this connection + ** creates the database file. It is important that it is created + ** as an auto-vacuum capable db. + */ + rc = sqlite3BtreeSetAutoVacuum(pBt, eAuto); + if( rc==SQLITE_OK && (eAuto==1 || eAuto==2) ){ + /* When setting the auto_vacuum mode to either "full" or + ** "incremental", write the value of meta[6] in the database + ** file. Before writing to meta[6], check that meta[3] indicates + ** that this really is an auto-vacuum capable database. + */ + static const int iLn = VDBE_OFFSET_LINENO(2); + static const VdbeOpList setMeta6[] = { + { OP_Transaction, 0, 1, 0}, /* 0 */ + { OP_ReadCookie, 0, 1, BTREE_LARGEST_ROOT_PAGE}, + { OP_If, 1, 0, 0}, /* 2 */ + { OP_Halt, SQLITE_OK, OE_Abort, 0}, /* 3 */ + { OP_SetCookie, 0, BTREE_INCR_VACUUM, 0}, /* 4 */ + }; + VdbeOp *aOp; + int iAddr = sqlite3VdbeCurrentAddr(v); + sqlite3VdbeVerifyNoMallocRequired(v, ArraySize(setMeta6)); + aOp = sqlite3VdbeAddOpList(v, ArraySize(setMeta6), setMeta6, iLn); + if( ONLY_IF_REALLOC_STRESS(aOp==0) ) break; + aOp[0].p1 = iDb; + aOp[1].p1 = iDb; + aOp[2].p2 = iAddr+4; + aOp[4].p1 = iDb; + aOp[4].p3 = eAuto - 1; + sqlite3VdbeUsesBtree(v, iDb); + } + } + break; + } +#endif + + /* + ** PRAGMA [schema.]incremental_vacuum(N) + ** + ** Do N steps of incremental vacuuming on a database. + */ +#ifndef SQLITE_OMIT_AUTOVACUUM + case PragTyp_INCREMENTAL_VACUUM: { + int iLimit, addr; + if( zRight==0 || !sqlite3GetInt32(zRight, &iLimit) || iLimit<=0 ){ + iLimit = 0x7fffffff; + } + sqlite3BeginWriteOperation(pParse, 0, iDb); + sqlite3VdbeAddOp2(v, OP_Integer, iLimit, 1); + addr = sqlite3VdbeAddOp1(v, OP_IncrVacuum, iDb); VdbeCoverage(v); + sqlite3VdbeAddOp1(v, OP_ResultRow, 1); + sqlite3VdbeAddOp2(v, OP_AddImm, 1, -1); + sqlite3VdbeAddOp2(v, OP_IfPos, 1, addr); VdbeCoverage(v); + sqlite3VdbeJumpHere(v, addr); + break; + } +#endif + +#ifndef SQLITE_OMIT_PAGER_PRAGMAS + /* + ** PRAGMA [schema.]cache_size + ** PRAGMA [schema.]cache_size=N + ** + ** The first form reports the current local setting for the + ** page cache size. The second form sets the local + ** page cache size value. If N is positive then that is the + ** number of pages in the cache. If N is negative, then the + ** number of pages is adjusted so that the cache uses -N kibibytes + ** of memory. + */ + case PragTyp_CACHE_SIZE: { + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + if( !zRight ){ + returnSingleInt(v, "cache_size", pDb->pSchema->cache_size); + }else{ + int size = sqlite3Atoi(zRight); + pDb->pSchema->cache_size = size; + sqlite3BtreeSetCacheSize(pDb->pBt, pDb->pSchema->cache_size); + } + break; + } + + /* + ** PRAGMA [schema.]cache_spill + ** PRAGMA cache_spill=BOOLEAN + ** PRAGMA [schema.]cache_spill=N + ** + ** The first form reports the current local setting for the + ** page cache spill size. The second form turns cache spill on + ** or off. When turnning cache spill on, the size is set to the + ** current cache_size. The third form sets a spill size that + ** may be different form the cache size. + ** If N is positive then that is the + ** number of pages in the cache. If N is negative, then the + ** number of pages is adjusted so that the cache uses -N kibibytes + ** of memory. + ** + ** If the number of cache_spill pages is less then the number of + ** cache_size pages, no spilling occurs until the page count exceeds + ** the number of cache_size pages. + ** + ** The cache_spill=BOOLEAN setting applies to all attached schemas, + ** not just the schema specified. + */ + case PragTyp_CACHE_SPILL: { + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + if( !zRight ){ + returnSingleInt(v, "cache_spill", + (db->flags & SQLITE_CacheSpill)==0 ? 0 : + sqlite3BtreeSetSpillSize(pDb->pBt,0)); + }else{ + int size = 1; + if( sqlite3GetInt32(zRight, &size) ){ + sqlite3BtreeSetSpillSize(pDb->pBt, size); + } + if( sqlite3GetBoolean(zRight, size!=0) ){ + db->flags |= SQLITE_CacheSpill; + }else{ + db->flags &= ~SQLITE_CacheSpill; + } + setAllPagerFlags(db); + } + break; + } + + /* + ** PRAGMA [schema.]mmap_size(N) + ** + ** Used to set mapping size limit. The mapping size limit is + ** used to limit the aggregate size of all memory mapped regions of the + ** database file. If this parameter is set to zero, then memory mapping + ** is not used at all. If N is negative, then the default memory map + ** limit determined by sqlite3_config(SQLITE_CONFIG_MMAP_SIZE) is set. + ** The parameter N is measured in bytes. + ** + ** This value is advisory. The underlying VFS is free to memory map + ** as little or as much as it wants. Except, if N is set to 0 then the + ** upper layers will never invoke the xFetch interfaces to the VFS. + */ + case PragTyp_MMAP_SIZE: { + sqlite3_int64 sz; +#if SQLITE_MAX_MMAP_SIZE>0 + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + if( zRight ){ + int ii; + sqlite3DecOrHexToI64(zRight, &sz); + if( sz<0 ) sz = sqlite3GlobalConfig.szMmap; + if( pId2->n==0 ) db->szMmap = sz; + for(ii=db->nDb-1; ii>=0; ii--){ + if( db->aDb[ii].pBt && (ii==iDb || pId2->n==0) ){ + sqlite3BtreeSetMmapLimit(db->aDb[ii].pBt, sz); + } + } + } + sz = -1; + rc = sqlite3_file_control(db, zDb, SQLITE_FCNTL_MMAP_SIZE, &sz); +#else + sz = 0; + rc = SQLITE_OK; +#endif + if( rc==SQLITE_OK ){ + returnSingleInt(v, "mmap_size", sz); + }else if( rc!=SQLITE_NOTFOUND ){ + pParse->nErr++; + pParse->rc = rc; + } + break; + } + + /* + ** PRAGMA temp_store + ** PRAGMA temp_store = "default"|"memory"|"file" + ** + ** Return or set the local value of the temp_store flag. Changing + ** the local value does not make changes to the disk file and the default + ** value will be restored the next time the database is opened. + ** + ** Note that it is possible for the library compile-time options to + ** override this setting + */ + case PragTyp_TEMP_STORE: { + if( !zRight ){ + returnSingleInt(v, "temp_store", db->temp_store); + }else{ + changeTempStorage(pParse, zRight); + } + break; + } + + /* + ** PRAGMA temp_store_directory + ** PRAGMA temp_store_directory = ""|"directory_name" + ** + ** Return or set the local value of the temp_store_directory flag. Changing + ** the value sets a specific directory to be used for temporary files. + ** Setting to a null string reverts to the default temporary directory search. + ** If temporary directory is changed, then invalidateTempStorage. + ** + */ + case PragTyp_TEMP_STORE_DIRECTORY: { + if( !zRight ){ + returnSingleText(v, "temp_store_directory", sqlite3_temp_directory); + }else{ +#ifndef SQLITE_OMIT_WSD + if( zRight[0] ){ + int res; + rc = sqlite3OsAccess(db->pVfs, zRight, SQLITE_ACCESS_READWRITE, &res); + if( rc!=SQLITE_OK || res==0 ){ + sqlite3ErrorMsg(pParse, "not a writable directory"); + goto pragma_out; + } + } + if( SQLITE_TEMP_STORE==0 + || (SQLITE_TEMP_STORE==1 && db->temp_store<=1) + || (SQLITE_TEMP_STORE==2 && db->temp_store==1) + ){ + invalidateTempStorage(pParse); + } + sqlite3_free(sqlite3_temp_directory); + if( zRight[0] ){ + sqlite3_temp_directory = sqlite3_mprintf("%s", zRight); + }else{ + sqlite3_temp_directory = 0; + } +#endif /* SQLITE_OMIT_WSD */ + } + break; + } + +#if SQLITE_OS_WIN + /* + ** PRAGMA data_store_directory + ** PRAGMA data_store_directory = ""|"directory_name" + ** + ** Return or set the local value of the data_store_directory flag. Changing + ** the value sets a specific directory to be used for database files that + ** were specified with a relative pathname. Setting to a null string reverts + ** to the default database directory, which for database files specified with + ** a relative path will probably be based on the current directory for the + ** process. Database file specified with an absolute path are not impacted + ** by this setting, regardless of its value. + ** + */ + case PragTyp_DATA_STORE_DIRECTORY: { + if( !zRight ){ + returnSingleText(v, "data_store_directory", sqlite3_data_directory); + }else{ +#ifndef SQLITE_OMIT_WSD + if( zRight[0] ){ + int res; + rc = sqlite3OsAccess(db->pVfs, zRight, SQLITE_ACCESS_READWRITE, &res); + if( rc!=SQLITE_OK || res==0 ){ + sqlite3ErrorMsg(pParse, "not a writable directory"); + goto pragma_out; + } + } + sqlite3_free(sqlite3_data_directory); + if( zRight[0] ){ + sqlite3_data_directory = sqlite3_mprintf("%s", zRight); + }else{ + sqlite3_data_directory = 0; + } +#endif /* SQLITE_OMIT_WSD */ + } + break; + } +#endif + +#if SQLITE_ENABLE_LOCKING_STYLE + /* + ** PRAGMA [schema.]lock_proxy_file + ** PRAGMA [schema.]lock_proxy_file = ":auto:"|"lock_file_path" + ** + ** Return or set the value of the lock_proxy_file flag. Changing + ** the value sets a specific file to be used for database access locks. + ** + */ + case PragTyp_LOCK_PROXY_FILE: { + if( !zRight ){ + Pager *pPager = sqlite3BtreePager(pDb->pBt); + char *proxy_file_path = NULL; + sqlite3_file *pFile = sqlite3PagerFile(pPager); + sqlite3OsFileControlHint(pFile, SQLITE_GET_LOCKPROXYFILE, + &proxy_file_path); + returnSingleText(v, "lock_proxy_file", proxy_file_path); + }else{ + Pager *pPager = sqlite3BtreePager(pDb->pBt); + sqlite3_file *pFile = sqlite3PagerFile(pPager); + int res; + if( zRight[0] ){ + res=sqlite3OsFileControl(pFile, SQLITE_SET_LOCKPROXYFILE, + zRight); + } else { + res=sqlite3OsFileControl(pFile, SQLITE_SET_LOCKPROXYFILE, + NULL); + } + if( res!=SQLITE_OK ){ + sqlite3ErrorMsg(pParse, "failed to set lock proxy file"); + goto pragma_out; + } + } + break; + } +#endif /* SQLITE_ENABLE_LOCKING_STYLE */ + + /* + ** PRAGMA [schema.]synchronous + ** PRAGMA [schema.]synchronous=OFF|ON|NORMAL|FULL|EXTRA + ** + ** Return or set the local value of the synchronous flag. Changing + ** the local value does not make changes to the disk file and the + ** default value will be restored the next time the database is + ** opened. + */ + case PragTyp_SYNCHRONOUS: { + if( !zRight ){ + returnSingleInt(v, "synchronous", pDb->safety_level-1); + }else{ + if( !db->autoCommit ){ + sqlite3ErrorMsg(pParse, + "Safety level may not be changed inside a transaction"); + }else{ + int iLevel = (getSafetyLevel(zRight,0,1)+1) & PAGER_SYNCHRONOUS_MASK; + if( iLevel==0 ) iLevel = 1; + pDb->safety_level = iLevel; + pDb->bSyncSet = 1; + setAllPagerFlags(db); + } + } + break; + } +#endif /* SQLITE_OMIT_PAGER_PRAGMAS */ + +#ifndef SQLITE_OMIT_FLAG_PRAGMAS + case PragTyp_FLAG: { + if( zRight==0 ){ + returnSingleInt(v, pPragma->zName, (db->flags & pPragma->iArg)!=0 ); + }else{ + int mask = pPragma->iArg; /* Mask of bits to set or clear. */ + if( db->autoCommit==0 ){ + /* Foreign key support may not be enabled or disabled while not + ** in auto-commit mode. */ + mask &= ~(SQLITE_ForeignKeys); + } +#if SQLITE_USER_AUTHENTICATION + if( db->auth.authLevel==UAUTH_User ){ + /* Do not allow non-admin users to modify the schema arbitrarily */ + mask &= ~(SQLITE_WriteSchema); + } +#endif + + if( sqlite3GetBoolean(zRight, 0) ){ + db->flags |= mask; + }else{ + db->flags &= ~mask; + if( mask==SQLITE_DeferFKs ) db->nDeferredImmCons = 0; + } + + /* Many of the flag-pragmas modify the code generated by the SQL + ** compiler (eg. count_changes). So add an opcode to expire all + ** compiled SQL statements after modifying a pragma value. + */ + sqlite3VdbeAddOp0(v, OP_Expire); + setAllPagerFlags(db); + } + break; + } +#endif /* SQLITE_OMIT_FLAG_PRAGMAS */ + +#ifndef SQLITE_OMIT_SCHEMA_PRAGMAS + /* + ** PRAGMA table_info(
      ) + ** + ** Return a single row for each column of the named table. The columns of + ** the returned data set are: + ** + ** cid: Column id (numbered from left to right, starting at 0) + ** name: Column name + ** type: Column declaration type. + ** notnull: True if 'NOT NULL' is part of column declaration + ** dflt_value: The default value for the column, if any. + */ + case PragTyp_TABLE_INFO: if( zRight ){ + Table *pTab; + pTab = sqlite3LocateTable(pParse, LOCATE_NOERR, zRight, zDb); + if( pTab ){ + static const char *azCol[] = { + "cid", "name", "type", "notnull", "dflt_value", "pk" + }; + int i, k; + int nHidden = 0; + Column *pCol; + Index *pPk = sqlite3PrimaryKeyIndex(pTab); + pParse->nMem = 6; + sqlite3CodeVerifySchema(pParse, iDb); + setAllColumnNames(v, 6, azCol); assert( 6==ArraySize(azCol) ); + sqlite3ViewGetColumnNames(pParse, pTab); + for(i=0, pCol=pTab->aCol; inCol; i++, pCol++){ + if( IsHiddenColumn(pCol) ){ + nHidden++; + continue; + } + if( (pCol->colFlags & COLFLAG_PRIMKEY)==0 ){ + k = 0; + }else if( pPk==0 ){ + k = 1; + }else{ + for(k=1; k<=pTab->nCol && pPk->aiColumn[k-1]!=i; k++){} + } + assert( pCol->pDflt==0 || pCol->pDflt->op==TK_SPAN ); + sqlite3VdbeMultiLoad(v, 1, "issisi", + i-nHidden, + pCol->zName, + sqlite3ColumnType(pCol,""), + pCol->notNull ? 1 : 0, + pCol->pDflt ? pCol->pDflt->u.zToken : 0, + k); + sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 6); + } + } + } + break; + + case PragTyp_STATS: { + static const char *azCol[] = { "table", "index", "width", "height" }; + Index *pIdx; + HashElem *i; + v = sqlite3GetVdbe(pParse); + pParse->nMem = 4; + sqlite3CodeVerifySchema(pParse, iDb); + setAllColumnNames(v, 4, azCol); assert( 4==ArraySize(azCol) ); + for(i=sqliteHashFirst(&pDb->pSchema->tblHash); i; i=sqliteHashNext(i)){ + Table *pTab = sqliteHashData(i); + sqlite3VdbeMultiLoad(v, 1, "ssii", + pTab->zName, + 0, + pTab->szTabRow, + pTab->nRowLogEst); + sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 4); + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + sqlite3VdbeMultiLoad(v, 2, "sii", + pIdx->zName, + pIdx->szIdxRow, + pIdx->aiRowLogEst[0]); + sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 4); + } + } + } + break; + + case PragTyp_INDEX_INFO: if( zRight ){ + Index *pIdx; + Table *pTab; + pIdx = sqlite3FindIndex(db, zRight, zDb); + if( pIdx ){ + static const char *azCol[] = { + "seqno", "cid", "name", "desc", "coll", "key" + }; + int i; + int mx; + if( pPragma->iArg ){ + /* PRAGMA index_xinfo (newer version with more rows and columns) */ + mx = pIdx->nColumn; + pParse->nMem = 6; + }else{ + /* PRAGMA index_info (legacy version) */ + mx = pIdx->nKeyCol; + pParse->nMem = 3; + } + pTab = pIdx->pTable; + sqlite3CodeVerifySchema(pParse, iDb); + assert( pParse->nMem<=ArraySize(azCol) ); + setAllColumnNames(v, pParse->nMem, azCol); + for(i=0; iaiColumn[i]; + sqlite3VdbeMultiLoad(v, 1, "iis", i, cnum, + cnum<0 ? 0 : pTab->aCol[cnum].zName); + if( pPragma->iArg ){ + sqlite3VdbeMultiLoad(v, 4, "isi", + pIdx->aSortOrder[i], + pIdx->azColl[i], + inKeyCol); + } + sqlite3VdbeAddOp2(v, OP_ResultRow, 1, pParse->nMem); + } + } + } + break; + + case PragTyp_INDEX_LIST: if( zRight ){ + Index *pIdx; + Table *pTab; + int i; + pTab = sqlite3FindTable(db, zRight, zDb); + if( pTab ){ + static const char *azCol[] = { + "seq", "name", "unique", "origin", "partial" + }; + v = sqlite3GetVdbe(pParse); + pParse->nMem = 5; + sqlite3CodeVerifySchema(pParse, iDb); + setAllColumnNames(v, 5, azCol); assert( 5==ArraySize(azCol) ); + for(pIdx=pTab->pIndex, i=0; pIdx; pIdx=pIdx->pNext, i++){ + const char *azOrigin[] = { "c", "u", "pk" }; + sqlite3VdbeMultiLoad(v, 1, "isisi", + i, + pIdx->zName, + IsUniqueIndex(pIdx), + azOrigin[pIdx->idxType], + pIdx->pPartIdxWhere!=0); + sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 5); + } + } + } + break; + + case PragTyp_DATABASE_LIST: { + static const char *azCol[] = { "seq", "name", "file" }; + int i; + pParse->nMem = 3; + setAllColumnNames(v, 3, azCol); assert( 3==ArraySize(azCol) ); + for(i=0; inDb; i++){ + if( db->aDb[i].pBt==0 ) continue; + assert( db->aDb[i].zDbSName!=0 ); + sqlite3VdbeMultiLoad(v, 1, "iss", + i, + db->aDb[i].zDbSName, + sqlite3BtreeGetFilename(db->aDb[i].pBt)); + sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 3); + } + } + break; + + case PragTyp_COLLATION_LIST: { + static const char *azCol[] = { "seq", "name" }; + int i = 0; + HashElem *p; + pParse->nMem = 2; + setAllColumnNames(v, 2, azCol); assert( 2==ArraySize(azCol) ); + for(p=sqliteHashFirst(&db->aCollSeq); p; p=sqliteHashNext(p)){ + CollSeq *pColl = (CollSeq *)sqliteHashData(p); + sqlite3VdbeMultiLoad(v, 1, "is", i++, pColl->zName); + sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 2); + } + } + break; +#endif /* SQLITE_OMIT_SCHEMA_PRAGMAS */ + +#ifndef SQLITE_OMIT_FOREIGN_KEY + case PragTyp_FOREIGN_KEY_LIST: if( zRight ){ + FKey *pFK; + Table *pTab; + pTab = sqlite3FindTable(db, zRight, zDb); + if( pTab ){ + v = sqlite3GetVdbe(pParse); + pFK = pTab->pFKey; + if( pFK ){ + static const char *azCol[] = { + "id", "seq", "table", "from", "to", "on_update", "on_delete", + "match" + }; + int i = 0; + pParse->nMem = 8; + sqlite3CodeVerifySchema(pParse, iDb); + setAllColumnNames(v, 8, azCol); assert( 8==ArraySize(azCol) ); + while(pFK){ + int j; + for(j=0; jnCol; j++){ + sqlite3VdbeMultiLoad(v, 1, "iissssss", + i, + j, + pFK->zTo, + pTab->aCol[pFK->aCol[j].iFrom].zName, + pFK->aCol[j].zCol, + actionName(pFK->aAction[1]), /* ON UPDATE */ + actionName(pFK->aAction[0]), /* ON DELETE */ + "NONE"); + sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 8); + } + ++i; + pFK = pFK->pNextFrom; + } + } + } + } + break; +#endif /* !defined(SQLITE_OMIT_FOREIGN_KEY) */ + +#ifndef SQLITE_OMIT_FOREIGN_KEY +#ifndef SQLITE_OMIT_TRIGGER + case PragTyp_FOREIGN_KEY_CHECK: { + FKey *pFK; /* A foreign key constraint */ + Table *pTab; /* Child table contain "REFERENCES" keyword */ + Table *pParent; /* Parent table that child points to */ + Index *pIdx; /* Index in the parent table */ + int i; /* Loop counter: Foreign key number for pTab */ + int j; /* Loop counter: Field of the foreign key */ + HashElem *k; /* Loop counter: Next table in schema */ + int x; /* result variable */ + int regResult; /* 3 registers to hold a result row */ + int regKey; /* Register to hold key for checking the FK */ + int regRow; /* Registers to hold a row from pTab */ + int addrTop; /* Top of a loop checking foreign keys */ + int addrOk; /* Jump here if the key is OK */ + int *aiCols; /* child to parent column mapping */ + static const char *azCol[] = { "table", "rowid", "parent", "fkid" }; + + regResult = pParse->nMem+1; + pParse->nMem += 4; + regKey = ++pParse->nMem; + regRow = ++pParse->nMem; + v = sqlite3GetVdbe(pParse); + setAllColumnNames(v, 4, azCol); assert( 4==ArraySize(azCol) ); + sqlite3CodeVerifySchema(pParse, iDb); + k = sqliteHashFirst(&db->aDb[iDb].pSchema->tblHash); + while( k ){ + if( zRight ){ + pTab = sqlite3LocateTable(pParse, 0, zRight, zDb); + k = 0; + }else{ + pTab = (Table*)sqliteHashData(k); + k = sqliteHashNext(k); + } + if( pTab==0 || pTab->pFKey==0 ) continue; + sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName); + if( pTab->nCol+regRow>pParse->nMem ) pParse->nMem = pTab->nCol + regRow; + sqlite3OpenTable(pParse, 0, iDb, pTab, OP_OpenRead); + sqlite3VdbeLoadString(v, regResult, pTab->zName); + for(i=1, pFK=pTab->pFKey; pFK; i++, pFK=pFK->pNextFrom){ + pParent = sqlite3FindTable(db, pFK->zTo, zDb); + if( pParent==0 ) continue; + pIdx = 0; + sqlite3TableLock(pParse, iDb, pParent->tnum, 0, pParent->zName); + x = sqlite3FkLocateIndex(pParse, pParent, pFK, &pIdx, 0); + if( x==0 ){ + if( pIdx==0 ){ + sqlite3OpenTable(pParse, i, iDb, pParent, OP_OpenRead); + }else{ + sqlite3VdbeAddOp3(v, OP_OpenRead, i, pIdx->tnum, iDb); + sqlite3VdbeSetP4KeyInfo(pParse, pIdx); + } + }else{ + k = 0; + break; + } + } + assert( pParse->nErr>0 || pFK==0 ); + if( pFK ) break; + if( pParse->nTabnTab = i; + addrTop = sqlite3VdbeAddOp1(v, OP_Rewind, 0); VdbeCoverage(v); + for(i=1, pFK=pTab->pFKey; pFK; i++, pFK=pFK->pNextFrom){ + pParent = sqlite3FindTable(db, pFK->zTo, zDb); + pIdx = 0; + aiCols = 0; + if( pParent ){ + x = sqlite3FkLocateIndex(pParse, pParent, pFK, &pIdx, &aiCols); + assert( x==0 ); + } + addrOk = sqlite3VdbeMakeLabel(v); + if( pParent && pIdx==0 ){ + int iKey = pFK->aCol[0].iFrom; + assert( iKey>=0 && iKeynCol ); + if( iKey!=pTab->iPKey ){ + sqlite3VdbeAddOp3(v, OP_Column, 0, iKey, regRow); + sqlite3ColumnDefault(v, pTab, iKey, regRow); + sqlite3VdbeAddOp2(v, OP_IsNull, regRow, addrOk); VdbeCoverage(v); + }else{ + sqlite3VdbeAddOp2(v, OP_Rowid, 0, regRow); + } + sqlite3VdbeAddOp3(v, OP_SeekRowid, i, 0, regRow); VdbeCoverage(v); + sqlite3VdbeGoto(v, addrOk); + sqlite3VdbeJumpHere(v, sqlite3VdbeCurrentAddr(v)-2); + }else{ + for(j=0; jnCol; j++){ + sqlite3ExprCodeGetColumnOfTable(v, pTab, 0, + aiCols ? aiCols[j] : pFK->aCol[j].iFrom, regRow+j); + sqlite3VdbeAddOp2(v, OP_IsNull, regRow+j, addrOk); VdbeCoverage(v); + } + if( pParent ){ + sqlite3VdbeAddOp4(v, OP_MakeRecord, regRow, pFK->nCol, regKey, + sqlite3IndexAffinityStr(db,pIdx), pFK->nCol); + sqlite3VdbeAddOp4Int(v, OP_Found, i, addrOk, regKey, 0); + VdbeCoverage(v); + } + } + sqlite3VdbeAddOp2(v, OP_Rowid, 0, regResult+1); + sqlite3VdbeMultiLoad(v, regResult+2, "si", pFK->zTo, i-1); + sqlite3VdbeAddOp2(v, OP_ResultRow, regResult, 4); + sqlite3VdbeResolveLabel(v, addrOk); + sqlite3DbFree(db, aiCols); + } + sqlite3VdbeAddOp2(v, OP_Next, 0, addrTop+1); VdbeCoverage(v); + sqlite3VdbeJumpHere(v, addrTop); + } + } + break; +#endif /* !defined(SQLITE_OMIT_TRIGGER) */ +#endif /* !defined(SQLITE_OMIT_FOREIGN_KEY) */ + +#ifndef NDEBUG + case PragTyp_PARSER_TRACE: { + if( zRight ){ + if( sqlite3GetBoolean(zRight, 0) ){ + sqlite3ParserTrace(stdout, "parser: "); + }else{ + sqlite3ParserTrace(0, 0); + } + } + } + break; +#endif + + /* Reinstall the LIKE and GLOB functions. The variant of LIKE + ** used will be case sensitive or not depending on the RHS. + */ + case PragTyp_CASE_SENSITIVE_LIKE: { + if( zRight ){ + sqlite3RegisterLikeFunctions(db, sqlite3GetBoolean(zRight, 0)); + } + } + break; + +#ifndef SQLITE_INTEGRITY_CHECK_ERROR_MAX +# define SQLITE_INTEGRITY_CHECK_ERROR_MAX 100 +#endif + +#ifndef SQLITE_OMIT_INTEGRITY_CHECK + /* Pragma "quick_check" is reduced version of + ** integrity_check designed to detect most database corruption + ** without most of the overhead of a full integrity-check. + */ + case PragTyp_INTEGRITY_CHECK: { + int i, j, addr, mxErr; + + int isQuick = (sqlite3Tolower(zLeft[0])=='q'); + + /* If the PRAGMA command was of the form "PRAGMA .integrity_check", + ** then iDb is set to the index of the database identified by . + ** In this case, the integrity of database iDb only is verified by + ** the VDBE created below. + ** + ** Otherwise, if the command was simply "PRAGMA integrity_check" (or + ** "PRAGMA quick_check"), then iDb is set to 0. In this case, set iDb + ** to -1 here, to indicate that the VDBE should verify the integrity + ** of all attached databases. */ + assert( iDb>=0 ); + assert( iDb==0 || pId2->z ); + if( pId2->z==0 ) iDb = -1; + + /* Initialize the VDBE program */ + pParse->nMem = 6; + setOneColumnName(v, "integrity_check"); + + /* Set the maximum error count */ + mxErr = SQLITE_INTEGRITY_CHECK_ERROR_MAX; + if( zRight ){ + sqlite3GetInt32(zRight, &mxErr); + if( mxErr<=0 ){ + mxErr = SQLITE_INTEGRITY_CHECK_ERROR_MAX; + } + } + sqlite3VdbeAddOp2(v, OP_Integer, mxErr, 1); /* reg[1] holds errors left */ + + /* Do an integrity check on each database file */ + for(i=0; inDb; i++){ + HashElem *x; + Hash *pTbls; + int *aRoot; + int cnt = 0; + int mxIdx = 0; + int nIdx; + + if( OMIT_TEMPDB && i==1 ) continue; + if( iDb>=0 && i!=iDb ) continue; + + sqlite3CodeVerifySchema(pParse, i); + addr = sqlite3VdbeAddOp1(v, OP_IfPos, 1); /* Halt if out of errors */ + VdbeCoverage(v); + sqlite3VdbeAddOp2(v, OP_Halt, 0, 0); + sqlite3VdbeJumpHere(v, addr); + + /* Do an integrity check of the B-Tree + ** + ** Begin by finding the root pages numbers + ** for all tables and indices in the database. + */ + assert( sqlite3SchemaMutexHeld(db, i, 0) ); + pTbls = &db->aDb[i].pSchema->tblHash; + for(cnt=0, x=sqliteHashFirst(pTbls); x; x=sqliteHashNext(x)){ + Table *pTab = sqliteHashData(x); + Index *pIdx; + if( HasRowid(pTab) ) cnt++; + for(nIdx=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, nIdx++){ cnt++; } + if( nIdx>mxIdx ) mxIdx = nIdx; + } + aRoot = sqlite3DbMallocRawNN(db, sizeof(int)*(cnt+1)); + if( aRoot==0 ) break; + for(cnt=0, x=sqliteHashFirst(pTbls); x; x=sqliteHashNext(x)){ + Table *pTab = sqliteHashData(x); + Index *pIdx; + if( HasRowid(pTab) ) aRoot[cnt++] = pTab->tnum; + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + aRoot[cnt++] = pIdx->tnum; + } + } + aRoot[cnt] = 0; + + /* Make sure sufficient number of registers have been allocated */ + pParse->nMem = MAX( pParse->nMem, 8+mxIdx ); + + /* Do the b-tree integrity checks */ + sqlite3VdbeAddOp4(v, OP_IntegrityCk, 2, cnt, 1, (char*)aRoot,P4_INTARRAY); + sqlite3VdbeChangeP5(v, (u8)i); + addr = sqlite3VdbeAddOp1(v, OP_IsNull, 2); VdbeCoverage(v); + sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, + sqlite3MPrintf(db, "*** in database %s ***\n", db->aDb[i].zDbSName), + P4_DYNAMIC); + sqlite3VdbeAddOp3(v, OP_Move, 2, 4, 1); + sqlite3VdbeAddOp3(v, OP_Concat, 4, 3, 2); + sqlite3VdbeAddOp2(v, OP_ResultRow, 2, 1); + sqlite3VdbeJumpHere(v, addr); + + /* Make sure all the indices are constructed correctly. + */ + for(x=sqliteHashFirst(pTbls); x && !isQuick; x=sqliteHashNext(x)){ + Table *pTab = sqliteHashData(x); + Index *pIdx, *pPk; + Index *pPrior = 0; + int loopTop; + int iDataCur, iIdxCur; + int r1 = -1; + + if( pTab->pIndex==0 ) continue; + pPk = HasRowid(pTab) ? 0 : sqlite3PrimaryKeyIndex(pTab); + addr = sqlite3VdbeAddOp1(v, OP_IfPos, 1); /* Stop if out of errors */ + VdbeCoverage(v); + sqlite3VdbeAddOp2(v, OP_Halt, 0, 0); + sqlite3VdbeJumpHere(v, addr); + sqlite3ExprCacheClear(pParse); + sqlite3OpenTableAndIndices(pParse, pTab, OP_OpenRead, 0, + 1, 0, &iDataCur, &iIdxCur); + sqlite3VdbeAddOp2(v, OP_Integer, 0, 7); + for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ + sqlite3VdbeAddOp2(v, OP_Integer, 0, 8+j); /* index entries counter */ + } + assert( pParse->nMem>=8+j ); + assert( sqlite3NoTempsInRange(pParse,1,7+j) ); + sqlite3VdbeAddOp2(v, OP_Rewind, iDataCur, 0); VdbeCoverage(v); + loopTop = sqlite3VdbeAddOp2(v, OP_AddImm, 7, 1); + /* Verify that all NOT NULL columns really are NOT NULL */ + for(j=0; jnCol; j++){ + char *zErr; + int jmp2, jmp3; + if( j==pTab->iPKey ) continue; + if( pTab->aCol[j].notNull==0 ) continue; + sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, j, 3); + sqlite3VdbeChangeP5(v, OPFLAG_TYPEOFARG); + jmp2 = sqlite3VdbeAddOp1(v, OP_NotNull, 3); VdbeCoverage(v); + sqlite3VdbeAddOp2(v, OP_AddImm, 1, -1); /* Decrement error limit */ + zErr = sqlite3MPrintf(db, "NULL value in %s.%s", pTab->zName, + pTab->aCol[j].zName); + sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, zErr, P4_DYNAMIC); + sqlite3VdbeAddOp2(v, OP_ResultRow, 3, 1); + jmp3 = sqlite3VdbeAddOp1(v, OP_IfPos, 1); VdbeCoverage(v); + sqlite3VdbeAddOp0(v, OP_Halt); + sqlite3VdbeJumpHere(v, jmp2); + sqlite3VdbeJumpHere(v, jmp3); + } + /* Validate index entries for the current row */ + for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ + int jmp2, jmp3, jmp4, jmp5; + int ckUniq = sqlite3VdbeMakeLabel(v); + if( pPk==pIdx ) continue; + r1 = sqlite3GenerateIndexKey(pParse, pIdx, iDataCur, 0, 0, &jmp3, + pPrior, r1); + pPrior = pIdx; + sqlite3VdbeAddOp2(v, OP_AddImm, 8+j, 1); /* increment entry count */ + /* Verify that an index entry exists for the current table row */ + jmp2 = sqlite3VdbeAddOp4Int(v, OP_Found, iIdxCur+j, ckUniq, r1, + pIdx->nColumn); VdbeCoverage(v); + sqlite3VdbeAddOp2(v, OP_AddImm, 1, -1); /* Decrement error limit */ + sqlite3VdbeLoadString(v, 3, "row "); + sqlite3VdbeAddOp3(v, OP_Concat, 7, 3, 3); + sqlite3VdbeLoadString(v, 4, " missing from index "); + sqlite3VdbeAddOp3(v, OP_Concat, 4, 3, 3); + jmp5 = sqlite3VdbeLoadString(v, 4, pIdx->zName); + sqlite3VdbeAddOp3(v, OP_Concat, 4, 3, 3); + sqlite3VdbeAddOp2(v, OP_ResultRow, 3, 1); + jmp4 = sqlite3VdbeAddOp1(v, OP_IfPos, 1); VdbeCoverage(v); + sqlite3VdbeAddOp0(v, OP_Halt); + sqlite3VdbeJumpHere(v, jmp2); + /* For UNIQUE indexes, verify that only one entry exists with the + ** current key. The entry is unique if (1) any column is NULL + ** or (2) the next entry has a different key */ + if( IsUniqueIndex(pIdx) ){ + int uniqOk = sqlite3VdbeMakeLabel(v); + int jmp6; + int kk; + for(kk=0; kknKeyCol; kk++){ + int iCol = pIdx->aiColumn[kk]; + assert( iCol!=XN_ROWID && iColnCol ); + if( iCol>=0 && pTab->aCol[iCol].notNull ) continue; + sqlite3VdbeAddOp2(v, OP_IsNull, r1+kk, uniqOk); + VdbeCoverage(v); + } + jmp6 = sqlite3VdbeAddOp1(v, OP_Next, iIdxCur+j); VdbeCoverage(v); + sqlite3VdbeGoto(v, uniqOk); + sqlite3VdbeJumpHere(v, jmp6); + sqlite3VdbeAddOp4Int(v, OP_IdxGT, iIdxCur+j, uniqOk, r1, + pIdx->nKeyCol); VdbeCoverage(v); + sqlite3VdbeAddOp2(v, OP_AddImm, 1, -1); /* Decrement error limit */ + sqlite3VdbeLoadString(v, 3, "non-unique entry in index "); + sqlite3VdbeGoto(v, jmp5); + sqlite3VdbeResolveLabel(v, uniqOk); + } + sqlite3VdbeJumpHere(v, jmp4); + sqlite3ResolvePartIdxLabel(pParse, jmp3); + } + sqlite3VdbeAddOp2(v, OP_Next, iDataCur, loopTop); VdbeCoverage(v); + sqlite3VdbeJumpHere(v, loopTop-1); +#ifndef SQLITE_OMIT_BTREECOUNT + sqlite3VdbeLoadString(v, 2, "wrong # of entries in index "); + for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ + if( pPk==pIdx ) continue; + addr = sqlite3VdbeCurrentAddr(v); + sqlite3VdbeAddOp2(v, OP_IfPos, 1, addr+2); VdbeCoverage(v); + sqlite3VdbeAddOp2(v, OP_Halt, 0, 0); + sqlite3VdbeAddOp2(v, OP_Count, iIdxCur+j, 3); + sqlite3VdbeAddOp3(v, OP_Eq, 8+j, addr+8, 3); VdbeCoverage(v); + sqlite3VdbeChangeP5(v, SQLITE_NOTNULL); + sqlite3VdbeAddOp2(v, OP_AddImm, 1, -1); + sqlite3VdbeLoadString(v, 3, pIdx->zName); + sqlite3VdbeAddOp3(v, OP_Concat, 3, 2, 7); + sqlite3VdbeAddOp2(v, OP_ResultRow, 7, 1); + } +#endif /* SQLITE_OMIT_BTREECOUNT */ + } + } + { + static const int iLn = VDBE_OFFSET_LINENO(2); + static const VdbeOpList endCode[] = { + { OP_AddImm, 1, 0, 0}, /* 0 */ + { OP_If, 1, 4, 0}, /* 1 */ + { OP_String8, 0, 3, 0}, /* 2 */ + { OP_ResultRow, 3, 1, 0}, /* 3 */ + }; + VdbeOp *aOp; + + aOp = sqlite3VdbeAddOpList(v, ArraySize(endCode), endCode, iLn); + if( aOp ){ + aOp[0].p2 = -mxErr; + aOp[2].p4type = P4_STATIC; + aOp[2].p4.z = "ok"; + } + } + } + break; +#endif /* SQLITE_OMIT_INTEGRITY_CHECK */ + +#ifndef SQLITE_OMIT_UTF16 + /* + ** PRAGMA encoding + ** PRAGMA encoding = "utf-8"|"utf-16"|"utf-16le"|"utf-16be" + ** + ** In its first form, this pragma returns the encoding of the main + ** database. If the database is not initialized, it is initialized now. + ** + ** The second form of this pragma is a no-op if the main database file + ** has not already been initialized. In this case it sets the default + ** encoding that will be used for the main database file if a new file + ** is created. If an existing main database file is opened, then the + ** default text encoding for the existing database is used. + ** + ** In all cases new databases created using the ATTACH command are + ** created to use the same default text encoding as the main database. If + ** the main database has not been initialized and/or created when ATTACH + ** is executed, this is done before the ATTACH operation. + ** + ** In the second form this pragma sets the text encoding to be used in + ** new database files created using this database handle. It is only + ** useful if invoked immediately after the main database i + */ + case PragTyp_ENCODING: { + static const struct EncName { + char *zName; + u8 enc; + } encnames[] = { + { "UTF8", SQLITE_UTF8 }, + { "UTF-8", SQLITE_UTF8 }, /* Must be element [1] */ + { "UTF-16le", SQLITE_UTF16LE }, /* Must be element [2] */ + { "UTF-16be", SQLITE_UTF16BE }, /* Must be element [3] */ + { "UTF16le", SQLITE_UTF16LE }, + { "UTF16be", SQLITE_UTF16BE }, + { "UTF-16", 0 }, /* SQLITE_UTF16NATIVE */ + { "UTF16", 0 }, /* SQLITE_UTF16NATIVE */ + { 0, 0 } + }; + const struct EncName *pEnc; + if( !zRight ){ /* "PRAGMA encoding" */ + if( sqlite3ReadSchema(pParse) ) goto pragma_out; + assert( encnames[SQLITE_UTF8].enc==SQLITE_UTF8 ); + assert( encnames[SQLITE_UTF16LE].enc==SQLITE_UTF16LE ); + assert( encnames[SQLITE_UTF16BE].enc==SQLITE_UTF16BE ); + returnSingleText(v, "encoding", encnames[ENC(pParse->db)].zName); + }else{ /* "PRAGMA encoding = XXX" */ + /* Only change the value of sqlite.enc if the database handle is not + ** initialized. If the main database exists, the new sqlite.enc value + ** will be overwritten when the schema is next loaded. If it does not + ** already exists, it will be created to use the new encoding value. + */ + if( + !(DbHasProperty(db, 0, DB_SchemaLoaded)) || + DbHasProperty(db, 0, DB_Empty) + ){ + for(pEnc=&encnames[0]; pEnc->zName; pEnc++){ + if( 0==sqlite3StrICmp(zRight, pEnc->zName) ){ + SCHEMA_ENC(db) = ENC(db) = + pEnc->enc ? pEnc->enc : SQLITE_UTF16NATIVE; + break; + } + } + if( !pEnc->zName ){ + sqlite3ErrorMsg(pParse, "unsupported encoding: %s", zRight); + } + } + } + } + break; +#endif /* SQLITE_OMIT_UTF16 */ + +#ifndef SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS + /* + ** PRAGMA [schema.]schema_version + ** PRAGMA [schema.]schema_version = + ** + ** PRAGMA [schema.]user_version + ** PRAGMA [schema.]user_version = + ** + ** PRAGMA [schema.]freelist_count + ** + ** PRAGMA [schema.]data_version + ** + ** PRAGMA [schema.]application_id + ** PRAGMA [schema.]application_id = + ** + ** The pragma's schema_version and user_version are used to set or get + ** the value of the schema-version and user-version, respectively. Both + ** the schema-version and the user-version are 32-bit signed integers + ** stored in the database header. + ** + ** The schema-cookie is usually only manipulated internally by SQLite. It + ** is incremented by SQLite whenever the database schema is modified (by + ** creating or dropping a table or index). The schema version is used by + ** SQLite each time a query is executed to ensure that the internal cache + ** of the schema used when compiling the SQL query matches the schema of + ** the database against which the compiled query is actually executed. + ** Subverting this mechanism by using "PRAGMA schema_version" to modify + ** the schema-version is potentially dangerous and may lead to program + ** crashes or database corruption. Use with caution! + ** + ** The user-version is not used internally by SQLite. It may be used by + ** applications for any purpose. + */ + case PragTyp_HEADER_VALUE: { + int iCookie = pPragma->iArg; /* Which cookie to read or write */ + sqlite3VdbeUsesBtree(v, iDb); + if( zRight && (pPragma->mPragFlag & PragFlag_ReadOnly)==0 ){ + /* Write the specified cookie value */ + static const VdbeOpList setCookie[] = { + { OP_Transaction, 0, 1, 0}, /* 0 */ + { OP_SetCookie, 0, 0, 0}, /* 1 */ + }; + VdbeOp *aOp; + sqlite3VdbeVerifyNoMallocRequired(v, ArraySize(setCookie)); + aOp = sqlite3VdbeAddOpList(v, ArraySize(setCookie), setCookie, 0); + if( ONLY_IF_REALLOC_STRESS(aOp==0) ) break; + aOp[0].p1 = iDb; + aOp[1].p1 = iDb; + aOp[1].p2 = iCookie; + aOp[1].p3 = sqlite3Atoi(zRight); + }else{ + /* Read the specified cookie value */ + static const VdbeOpList readCookie[] = { + { OP_Transaction, 0, 0, 0}, /* 0 */ + { OP_ReadCookie, 0, 1, 0}, /* 1 */ + { OP_ResultRow, 1, 1, 0} + }; + VdbeOp *aOp; + sqlite3VdbeVerifyNoMallocRequired(v, ArraySize(readCookie)); + aOp = sqlite3VdbeAddOpList(v, ArraySize(readCookie),readCookie,0); + if( ONLY_IF_REALLOC_STRESS(aOp==0) ) break; + aOp[0].p1 = iDb; + aOp[1].p1 = iDb; + aOp[1].p3 = iCookie; + sqlite3VdbeSetNumCols(v, 1); + sqlite3VdbeSetColName(v, 0, COLNAME_NAME, zLeft, SQLITE_TRANSIENT); + sqlite3VdbeReusable(v); + } + } + break; +#endif /* SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS */ + +#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS + /* + ** PRAGMA compile_options + ** + ** Return the names of all compile-time options used in this build, + ** one option per row. + */ + case PragTyp_COMPILE_OPTIONS: { + int i = 0; + const char *zOpt; + pParse->nMem = 1; + setOneColumnName(v, "compile_option"); + while( (zOpt = sqlite3_compileoption_get(i++))!=0 ){ + sqlite3VdbeLoadString(v, 1, zOpt); + sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1); + } + sqlite3VdbeReusable(v); + } + break; +#endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */ + +#ifndef SQLITE_OMIT_WAL + /* + ** PRAGMA [schema.]wal_checkpoint = passive|full|restart|truncate + ** + ** Checkpoint the database. + */ + case PragTyp_WAL_CHECKPOINT: { + static const char *azCol[] = { "busy", "log", "checkpointed" }; + int iBt = (pId2->z?iDb:SQLITE_MAX_ATTACHED); + int eMode = SQLITE_CHECKPOINT_PASSIVE; + if( zRight ){ + if( sqlite3StrICmp(zRight, "full")==0 ){ + eMode = SQLITE_CHECKPOINT_FULL; + }else if( sqlite3StrICmp(zRight, "restart")==0 ){ + eMode = SQLITE_CHECKPOINT_RESTART; + }else if( sqlite3StrICmp(zRight, "truncate")==0 ){ + eMode = SQLITE_CHECKPOINT_TRUNCATE; + } + } + setAllColumnNames(v, 3, azCol); assert( 3==ArraySize(azCol) ); + pParse->nMem = 3; + sqlite3VdbeAddOp3(v, OP_Checkpoint, iBt, eMode, 1); + sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 3); + } + break; + + /* + ** PRAGMA wal_autocheckpoint + ** PRAGMA wal_autocheckpoint = N + ** + ** Configure a database connection to automatically checkpoint a database + ** after accumulating N frames in the log. Or query for the current value + ** of N. + */ + case PragTyp_WAL_AUTOCHECKPOINT: { + if( zRight ){ + sqlite3_wal_autocheckpoint(db, sqlite3Atoi(zRight)); + } + returnSingleInt(v, "wal_autocheckpoint", + db->xWalCallback==sqlite3WalDefaultHook ? + SQLITE_PTR_TO_INT(db->pWalArg) : 0); + } + break; +#endif + + /* + ** PRAGMA shrink_memory + ** + ** IMPLEMENTATION-OF: R-23445-46109 This pragma causes the database + ** connection on which it is invoked to free up as much memory as it + ** can, by calling sqlite3_db_release_memory(). + */ + case PragTyp_SHRINK_MEMORY: { + sqlite3_db_release_memory(db); + break; + } + + /* + ** PRAGMA busy_timeout + ** PRAGMA busy_timeout = N + ** + ** Call sqlite3_busy_timeout(db, N). Return the current timeout value + ** if one is set. If no busy handler or a different busy handler is set + ** then 0 is returned. Setting the busy_timeout to 0 or negative + ** disables the timeout. + */ + /*case PragTyp_BUSY_TIMEOUT*/ default: { + assert( pPragma->ePragTyp==PragTyp_BUSY_TIMEOUT ); + if( zRight ){ + sqlite3_busy_timeout(db, sqlite3Atoi(zRight)); + } + returnSingleInt(v, "timeout", db->busyTimeout); + break; + } + + /* + ** PRAGMA soft_heap_limit + ** PRAGMA soft_heap_limit = N + ** + ** IMPLEMENTATION-OF: R-26343-45930 This pragma invokes the + ** sqlite3_soft_heap_limit64() interface with the argument N, if N is + ** specified and is a non-negative integer. + ** IMPLEMENTATION-OF: R-64451-07163 The soft_heap_limit pragma always + ** returns the same integer that would be returned by the + ** sqlite3_soft_heap_limit64(-1) C-language function. + */ + case PragTyp_SOFT_HEAP_LIMIT: { + sqlite3_int64 N; + if( zRight && sqlite3DecOrHexToI64(zRight, &N)==SQLITE_OK ){ + sqlite3_soft_heap_limit64(N); + } + returnSingleInt(v, "soft_heap_limit", sqlite3_soft_heap_limit64(-1)); + break; + } + + /* + ** PRAGMA threads + ** PRAGMA threads = N + ** + ** Configure the maximum number of worker threads. Return the new + ** maximum, which might be less than requested. + */ + case PragTyp_THREADS: { + sqlite3_int64 N; + if( zRight + && sqlite3DecOrHexToI64(zRight, &N)==SQLITE_OK + && N>=0 + ){ + sqlite3_limit(db, SQLITE_LIMIT_WORKER_THREADS, (int)(N&0x7fffffff)); + } + returnSingleInt(v, "threads", + sqlite3_limit(db, SQLITE_LIMIT_WORKER_THREADS, -1)); + break; + } + +#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) + /* + ** Report the current state of file logs for all databases + */ + case PragTyp_LOCK_STATUS: { + static const char *const azLockName[] = { + "unlocked", "shared", "reserved", "pending", "exclusive" + }; + static const char *azCol[] = { "database", "status" }; + int i; + setAllColumnNames(v, 2, azCol); assert( 2==ArraySize(azCol) ); + pParse->nMem = 2; + for(i=0; inDb; i++){ + Btree *pBt; + const char *zState = "unknown"; + int j; + if( db->aDb[i].zDbSName==0 ) continue; + pBt = db->aDb[i].pBt; + if( pBt==0 || sqlite3BtreePager(pBt)==0 ){ + zState = "closed"; + }else if( sqlite3_file_control(db, i ? db->aDb[i].zDbSName : 0, + SQLITE_FCNTL_LOCKSTATE, &j)==SQLITE_OK ){ + zState = azLockName[j]; + } + sqlite3VdbeMultiLoad(v, 1, "ss", db->aDb[i].zDbSName, zState); + sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 2); + } + break; + } +#endif + +#ifdef SQLITE_HAS_CODEC + case PragTyp_KEY: { + if( zRight ) sqlite3_key_v2(db, zDb, zRight, sqlite3Strlen30(zRight)); + break; + } + case PragTyp_REKEY: { + if( zRight ) sqlite3_rekey_v2(db, zDb, zRight, sqlite3Strlen30(zRight)); + break; + } + case PragTyp_HEXKEY: { + if( zRight ){ + u8 iByte; + int i; + char zKey[40]; + for(i=0, iByte=0; idb; + if( !db->mallocFailed && (db->flags & SQLITE_RecoveryMode)==0 ){ + char *z; + if( zObj==0 ) zObj = "?"; + z = sqlite3MPrintf(db, "malformed database schema (%s)", zObj); + if( zExtra ) z = sqlite3MPrintf(db, "%z - %s", z, zExtra); + sqlite3DbFree(db, *pData->pzErrMsg); + *pData->pzErrMsg = z; + } + pData->rc = db->mallocFailed ? SQLITE_NOMEM_BKPT : SQLITE_CORRUPT_BKPT; +} + +/* +** This is the callback routine for the code that initializes the +** database. See sqlite3Init() below for additional information. +** This routine is also called from the OP_ParseSchema opcode of the VDBE. +** +** Each callback contains the following information: +** +** argv[0] = name of thing being created +** argv[1] = root page number for table or index. 0 for trigger or view. +** argv[2] = SQL text for the CREATE statement. +** +*/ +SQLITE_PRIVATE int sqlite3InitCallback(void *pInit, int argc, char **argv, char **NotUsed){ + InitData *pData = (InitData*)pInit; + sqlite3 *db = pData->db; + int iDb = pData->iDb; + + assert( argc==3 ); + UNUSED_PARAMETER2(NotUsed, argc); + assert( sqlite3_mutex_held(db->mutex) ); + DbClearProperty(db, iDb, DB_Empty); + if( db->mallocFailed ){ + corruptSchema(pData, argv[0], 0); + return 1; + } + + assert( iDb>=0 && iDbnDb ); + if( argv==0 ) return 0; /* Might happen if EMPTY_RESULT_CALLBACKS are on */ + if( argv[1]==0 ){ + corruptSchema(pData, argv[0], 0); + }else if( sqlite3_strnicmp(argv[2],"create ",7)==0 ){ + /* Call the parser to process a CREATE TABLE, INDEX or VIEW. + ** But because db->init.busy is set to 1, no VDBE code is generated + ** or executed. All the parser does is build the internal data + ** structures that describe the table, index, or view. + */ + int rc; + u8 saved_iDb = db->init.iDb; + sqlite3_stmt *pStmt; + TESTONLY(int rcp); /* Return code from sqlite3_prepare() */ + + assert( db->init.busy ); + db->init.iDb = iDb; + db->init.newTnum = sqlite3Atoi(argv[1]); + db->init.orphanTrigger = 0; + TESTONLY(rcp = ) sqlite3_prepare(db, argv[2], -1, &pStmt, 0); + rc = db->errCode; + assert( (rc&0xFF)==(rcp&0xFF) ); + db->init.iDb = saved_iDb; + assert( saved_iDb==0 || (db->flags & SQLITE_Vacuum)!=0 ); + if( SQLITE_OK!=rc ){ + if( db->init.orphanTrigger ){ + assert( iDb==1 ); + }else{ + pData->rc = rc; + if( rc==SQLITE_NOMEM ){ + sqlite3OomFault(db); + }else if( rc!=SQLITE_INTERRUPT && (rc&0xFF)!=SQLITE_LOCKED ){ + corruptSchema(pData, argv[0], sqlite3_errmsg(db)); + } + } + } + sqlite3_finalize(pStmt); + }else if( argv[0]==0 || (argv[2]!=0 && argv[2][0]!=0) ){ + corruptSchema(pData, argv[0], 0); + }else{ + /* If the SQL column is blank it means this is an index that + ** was created to be the PRIMARY KEY or to fulfill a UNIQUE + ** constraint for a CREATE TABLE. The index should have already + ** been created when we processed the CREATE TABLE. All we have + ** to do here is record the root page number for that index. + */ + Index *pIndex; + pIndex = sqlite3FindIndex(db, argv[0], db->aDb[iDb].zDbSName); + if( pIndex==0 ){ + /* This can occur if there exists an index on a TEMP table which + ** has the same name as another index on a permanent index. Since + ** the permanent table is hidden by the TEMP table, we can also + ** safely ignore the index on the permanent table. + */ + /* Do Nothing */; + }else if( sqlite3GetInt32(argv[1], &pIndex->tnum)==0 ){ + corruptSchema(pData, argv[0], "invalid rootpage"); + } + } + return 0; +} + +/* +** Attempt to read the database schema and initialize internal +** data structures for a single database file. The index of the +** database file is given by iDb. iDb==0 is used for the main +** database. iDb==1 should never be used. iDb>=2 is used for +** auxiliary databases. Return one of the SQLITE_ error codes to +** indicate success or failure. +*/ +static int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg){ + int rc; + int i; +#ifndef SQLITE_OMIT_DEPRECATED + int size; +#endif + Db *pDb; + char const *azArg[4]; + int meta[5]; + InitData initData; + const char *zMasterName; + int openedTransaction = 0; + + assert( iDb>=0 && iDbnDb ); + assert( db->aDb[iDb].pSchema ); + assert( sqlite3_mutex_held(db->mutex) ); + assert( iDb==1 || sqlite3BtreeHoldsMutex(db->aDb[iDb].pBt) ); + + /* Construct the in-memory representation schema tables (sqlite_master or + ** sqlite_temp_master) by invoking the parser directly. The appropriate + ** table name will be inserted automatically by the parser so we can just + ** use the abbreviation "x" here. The parser will also automatically tag + ** the schema table as read-only. */ + azArg[0] = zMasterName = SCHEMA_TABLE(iDb); + azArg[1] = "1"; + azArg[2] = "CREATE TABLE x(type text,name text,tbl_name text," + "rootpage integer,sql text)"; + azArg[3] = 0; + initData.db = db; + initData.iDb = iDb; + initData.rc = SQLITE_OK; + initData.pzErrMsg = pzErrMsg; + sqlite3InitCallback(&initData, 3, (char **)azArg, 0); + if( initData.rc ){ + rc = initData.rc; + goto error_out; + } + + /* Create a cursor to hold the database open + */ + pDb = &db->aDb[iDb]; + if( pDb->pBt==0 ){ + if( !OMIT_TEMPDB && ALWAYS(iDb==1) ){ + DbSetProperty(db, 1, DB_SchemaLoaded); + } + return SQLITE_OK; + } + + /* If there is not already a read-only (or read-write) transaction opened + ** on the b-tree database, open one now. If a transaction is opened, it + ** will be closed before this function returns. */ + sqlite3BtreeEnter(pDb->pBt); + if( !sqlite3BtreeIsInReadTrans(pDb->pBt) ){ + rc = sqlite3BtreeBeginTrans(pDb->pBt, 0); + if( rc!=SQLITE_OK ){ + sqlite3SetString(pzErrMsg, db, sqlite3ErrStr(rc)); + goto initone_error_out; + } + openedTransaction = 1; + } + + /* Get the database meta information. + ** + ** Meta values are as follows: + ** meta[0] Schema cookie. Changes with each schema change. + ** meta[1] File format of schema layer. + ** meta[2] Size of the page cache. + ** meta[3] Largest rootpage (auto/incr_vacuum mode) + ** meta[4] Db text encoding. 1:UTF-8 2:UTF-16LE 3:UTF-16BE + ** meta[5] User version + ** meta[6] Incremental vacuum mode + ** meta[7] unused + ** meta[8] unused + ** meta[9] unused + ** + ** Note: The #defined SQLITE_UTF* symbols in sqliteInt.h correspond to + ** the possible values of meta[4]. + */ + for(i=0; ipBt, i+1, (u32 *)&meta[i]); + } + pDb->pSchema->schema_cookie = meta[BTREE_SCHEMA_VERSION-1]; + + /* If opening a non-empty database, check the text encoding. For the + ** main database, set sqlite3.enc to the encoding of the main database. + ** For an attached db, it is an error if the encoding is not the same + ** as sqlite3.enc. + */ + if( meta[BTREE_TEXT_ENCODING-1] ){ /* text encoding */ + if( iDb==0 ){ +#ifndef SQLITE_OMIT_UTF16 + u8 encoding; + /* If opening the main database, set ENC(db). */ + encoding = (u8)meta[BTREE_TEXT_ENCODING-1] & 3; + if( encoding==0 ) encoding = SQLITE_UTF8; + ENC(db) = encoding; +#else + ENC(db) = SQLITE_UTF8; +#endif + }else{ + /* If opening an attached database, the encoding much match ENC(db) */ + if( meta[BTREE_TEXT_ENCODING-1]!=ENC(db) ){ + sqlite3SetString(pzErrMsg, db, "attached databases must use the same" + " text encoding as main database"); + rc = SQLITE_ERROR; + goto initone_error_out; + } + } + }else{ + DbSetProperty(db, iDb, DB_Empty); + } + pDb->pSchema->enc = ENC(db); + + if( pDb->pSchema->cache_size==0 ){ +#ifndef SQLITE_OMIT_DEPRECATED + size = sqlite3AbsInt32(meta[BTREE_DEFAULT_CACHE_SIZE-1]); + if( size==0 ){ size = SQLITE_DEFAULT_CACHE_SIZE; } + pDb->pSchema->cache_size = size; +#else + pDb->pSchema->cache_size = SQLITE_DEFAULT_CACHE_SIZE; +#endif + sqlite3BtreeSetCacheSize(pDb->pBt, pDb->pSchema->cache_size); + } + + /* + ** file_format==1 Version 3.0.0. + ** file_format==2 Version 3.1.3. // ALTER TABLE ADD COLUMN + ** file_format==3 Version 3.1.4. // ditto but with non-NULL defaults + ** file_format==4 Version 3.3.0. // DESC indices. Boolean constants + */ + pDb->pSchema->file_format = (u8)meta[BTREE_FILE_FORMAT-1]; + if( pDb->pSchema->file_format==0 ){ + pDb->pSchema->file_format = 1; + } + if( pDb->pSchema->file_format>SQLITE_MAX_FILE_FORMAT ){ + sqlite3SetString(pzErrMsg, db, "unsupported file format"); + rc = SQLITE_ERROR; + goto initone_error_out; + } + + /* Ticket #2804: When we open a database in the newer file format, + ** clear the legacy_file_format pragma flag so that a VACUUM will + ** not downgrade the database and thus invalidate any descending + ** indices that the user might have created. + */ + if( iDb==0 && meta[BTREE_FILE_FORMAT-1]>=4 ){ + db->flags &= ~SQLITE_LegacyFileFmt; + } + + /* Read the schema information out of the schema tables + */ + assert( db->init.busy ); + { + char *zSql; + zSql = sqlite3MPrintf(db, + "SELECT name, rootpage, sql FROM \"%w\".%s ORDER BY rowid", + db->aDb[iDb].zDbSName, zMasterName); +#ifndef SQLITE_OMIT_AUTHORIZATION + { + sqlite3_xauth xAuth; + xAuth = db->xAuth; + db->xAuth = 0; +#endif + rc = sqlite3_exec(db, zSql, sqlite3InitCallback, &initData, 0); +#ifndef SQLITE_OMIT_AUTHORIZATION + db->xAuth = xAuth; + } +#endif + if( rc==SQLITE_OK ) rc = initData.rc; + sqlite3DbFree(db, zSql); +#ifndef SQLITE_OMIT_ANALYZE + if( rc==SQLITE_OK ){ + sqlite3AnalysisLoad(db, iDb); + } +#endif + } + if( db->mallocFailed ){ + rc = SQLITE_NOMEM_BKPT; + sqlite3ResetAllSchemasOfConnection(db); + } + if( rc==SQLITE_OK || (db->flags&SQLITE_RecoveryMode)){ + /* Black magic: If the SQLITE_RecoveryMode flag is set, then consider + ** the schema loaded, even if errors occurred. In this situation the + ** current sqlite3_prepare() operation will fail, but the following one + ** will attempt to compile the supplied statement against whatever subset + ** of the schema was loaded before the error occurred. The primary + ** purpose of this is to allow access to the sqlite_master table + ** even when its contents have been corrupted. + */ + DbSetProperty(db, iDb, DB_SchemaLoaded); + rc = SQLITE_OK; + } + + /* Jump here for an error that occurs after successfully allocating + ** curMain and calling sqlite3BtreeEnter(). For an error that occurs + ** before that point, jump to error_out. + */ +initone_error_out: + if( openedTransaction ){ + sqlite3BtreeCommit(pDb->pBt); + } + sqlite3BtreeLeave(pDb->pBt); + +error_out: + if( rc==SQLITE_NOMEM || rc==SQLITE_IOERR_NOMEM ){ + sqlite3OomFault(db); + } + return rc; +} + +/* +** Initialize all database files - the main database file, the file +** used to store temporary tables, and any additional database files +** created using ATTACH statements. Return a success code. If an +** error occurs, write an error message into *pzErrMsg. +** +** After a database is initialized, the DB_SchemaLoaded bit is set +** bit is set in the flags field of the Db structure. If the database +** file was of zero-length, then the DB_Empty flag is also set. +*/ +SQLITE_PRIVATE int sqlite3Init(sqlite3 *db, char **pzErrMsg){ + int i, rc; + int commit_internal = !(db->flags&SQLITE_InternChanges); + + assert( sqlite3_mutex_held(db->mutex) ); + assert( sqlite3BtreeHoldsMutex(db->aDb[0].pBt) ); + assert( db->init.busy==0 ); + rc = SQLITE_OK; + db->init.busy = 1; + ENC(db) = SCHEMA_ENC(db); + for(i=0; rc==SQLITE_OK && inDb; i++){ + if( DbHasProperty(db, i, DB_SchemaLoaded) || i==1 ) continue; + rc = sqlite3InitOne(db, i, pzErrMsg); + if( rc ){ + sqlite3ResetOneSchema(db, i); + } + } + + /* Once all the other databases have been initialized, load the schema + ** for the TEMP database. This is loaded last, as the TEMP database + ** schema may contain references to objects in other databases. + */ +#ifndef SQLITE_OMIT_TEMPDB + assert( db->nDb>1 ); + if( rc==SQLITE_OK && !DbHasProperty(db, 1, DB_SchemaLoaded) ){ + rc = sqlite3InitOne(db, 1, pzErrMsg); + if( rc ){ + sqlite3ResetOneSchema(db, 1); + } + } +#endif + + db->init.busy = 0; + if( rc==SQLITE_OK && commit_internal ){ + sqlite3CommitInternalChanges(db); + } + + return rc; +} + +/* +** This routine is a no-op if the database schema is already initialized. +** Otherwise, the schema is loaded. An error code is returned. +*/ +SQLITE_PRIVATE int sqlite3ReadSchema(Parse *pParse){ + int rc = SQLITE_OK; + sqlite3 *db = pParse->db; + assert( sqlite3_mutex_held(db->mutex) ); + if( !db->init.busy ){ + rc = sqlite3Init(db, &pParse->zErrMsg); + } + if( rc!=SQLITE_OK ){ + pParse->rc = rc; + pParse->nErr++; + } + return rc; +} + + +/* +** Check schema cookies in all databases. If any cookie is out +** of date set pParse->rc to SQLITE_SCHEMA. If all schema cookies +** make no changes to pParse->rc. +*/ +static void schemaIsValid(Parse *pParse){ + sqlite3 *db = pParse->db; + int iDb; + int rc; + int cookie; + + assert( pParse->checkSchema ); + assert( sqlite3_mutex_held(db->mutex) ); + for(iDb=0; iDbnDb; iDb++){ + int openedTransaction = 0; /* True if a transaction is opened */ + Btree *pBt = db->aDb[iDb].pBt; /* Btree database to read cookie from */ + if( pBt==0 ) continue; + + /* If there is not already a read-only (or read-write) transaction opened + ** on the b-tree database, open one now. If a transaction is opened, it + ** will be closed immediately after reading the meta-value. */ + if( !sqlite3BtreeIsInReadTrans(pBt) ){ + rc = sqlite3BtreeBeginTrans(pBt, 0); + if( rc==SQLITE_NOMEM || rc==SQLITE_IOERR_NOMEM ){ + sqlite3OomFault(db); + } + if( rc!=SQLITE_OK ) return; + openedTransaction = 1; + } + + /* Read the schema cookie from the database. If it does not match the + ** value stored as part of the in-memory schema representation, + ** set Parse.rc to SQLITE_SCHEMA. */ + sqlite3BtreeGetMeta(pBt, BTREE_SCHEMA_VERSION, (u32 *)&cookie); + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + if( cookie!=db->aDb[iDb].pSchema->schema_cookie ){ + sqlite3ResetOneSchema(db, iDb); + pParse->rc = SQLITE_SCHEMA; + } + + /* Close the transaction, if one was opened. */ + if( openedTransaction ){ + sqlite3BtreeCommit(pBt); + } + } +} + +/* +** Convert a schema pointer into the iDb index that indicates +** which database file in db->aDb[] the schema refers to. +** +** If the same database is attached more than once, the first +** attached database is returned. +*/ +SQLITE_PRIVATE int sqlite3SchemaToIndex(sqlite3 *db, Schema *pSchema){ + int i = -1000000; + + /* If pSchema is NULL, then return -1000000. This happens when code in + ** expr.c is trying to resolve a reference to a transient table (i.e. one + ** created by a sub-select). In this case the return value of this + ** function should never be used. + ** + ** We return -1000000 instead of the more usual -1 simply because using + ** -1000000 as the incorrect index into db->aDb[] is much + ** more likely to cause a segfault than -1 (of course there are assert() + ** statements too, but it never hurts to play the odds). + */ + assert( sqlite3_mutex_held(db->mutex) ); + if( pSchema ){ + for(i=0; ALWAYS(inDb); i++){ + if( db->aDb[i].pSchema==pSchema ){ + break; + } + } + assert( i>=0 && inDb ); + } + return i; +} + +/* +** Free all memory allocations in the pParse object +*/ +SQLITE_PRIVATE void sqlite3ParserReset(Parse *pParse){ + if( pParse ){ + sqlite3 *db = pParse->db; + sqlite3DbFree(db, pParse->aLabel); + sqlite3ExprListDelete(db, pParse->pConstExpr); + if( db ){ + assert( db->lookaside.bDisable >= pParse->disableLookaside ); + db->lookaside.bDisable -= pParse->disableLookaside; + } + pParse->disableLookaside = 0; + } +} + +/* +** Compile the UTF-8 encoded SQL statement zSql into a statement handle. +*/ +static int sqlite3Prepare( + sqlite3 *db, /* Database handle. */ + 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 */ +){ + char *zErrMsg = 0; /* Error message */ + int rc = SQLITE_OK; /* Result code */ + int i; /* Loop counter */ + Parse sParse; /* Parsing context */ + + memset(&sParse, 0, PARSE_HDR_SZ); + memset(PARSE_TAIL(&sParse), 0, PARSE_TAIL_SZ); + sParse.pReprepare = pReprepare; + assert( ppStmt && *ppStmt==0 ); + /* assert( !db->mallocFailed ); // not true with SQLITE_USE_ALLOCA */ + assert( sqlite3_mutex_held(db->mutex) ); + + /* Check to verify that it is possible to get a read lock on all + ** database schemas. The inability to get a read lock indicates that + ** some other database connection is holding a write-lock, which in + ** turn means that the other connection has made uncommitted changes + ** to the schema. + ** + ** Were we to proceed and prepare the statement against the uncommitted + ** schema changes and if those schema changes are subsequently rolled + ** back and different changes are made in their place, then when this + ** prepared statement goes to run the schema cookie would fail to detect + ** the schema change. Disaster would follow. + ** + ** This thread is currently holding mutexes on all Btrees (because + ** of the sqlite3BtreeEnterAll() in sqlite3LockAndPrepare()) so it + ** is not possible for another thread to start a new schema change + ** while this routine is running. Hence, we do not need to hold + ** locks on the schema, we just need to make sure nobody else is + ** holding them. + ** + ** Note that setting READ_UNCOMMITTED overrides most lock detection, + ** but it does *not* override schema lock detection, so this all still + ** works even if READ_UNCOMMITTED is set. + */ + for(i=0; inDb; i++) { + Btree *pBt = db->aDb[i].pBt; + if( pBt ){ + assert( sqlite3BtreeHoldsMutex(pBt) ); + rc = sqlite3BtreeSchemaLocked(pBt); + if( rc ){ + const char *zDb = db->aDb[i].zDbSName; + sqlite3ErrorWithMsg(db, rc, "database schema is locked: %s", zDb); + testcase( db->flags & SQLITE_ReadUncommitted ); + goto end_prepare; + } + } + } + + sqlite3VtabUnlockList(db); + + sParse.db = db; + if( nBytes>=0 && (nBytes==0 || zSql[nBytes-1]!=0) ){ + char *zSqlCopy; + int mxLen = db->aLimit[SQLITE_LIMIT_SQL_LENGTH]; + testcase( nBytes==mxLen ); + testcase( nBytes==mxLen+1 ); + if( nBytes>mxLen ){ + sqlite3ErrorWithMsg(db, SQLITE_TOOBIG, "statement too long"); + rc = sqlite3ApiExit(db, SQLITE_TOOBIG); + goto end_prepare; + } + zSqlCopy = sqlite3DbStrNDup(db, zSql, nBytes); + if( zSqlCopy ){ + sqlite3RunParser(&sParse, zSqlCopy, &zErrMsg); + sParse.zTail = &zSql[sParse.zTail-zSqlCopy]; + sqlite3DbFree(db, zSqlCopy); + }else{ + sParse.zTail = &zSql[nBytes]; + } + }else{ + sqlite3RunParser(&sParse, zSql, &zErrMsg); + } + assert( 0==sParse.nQueryLoop ); + + if( sParse.rc==SQLITE_DONE ) sParse.rc = SQLITE_OK; + if( sParse.checkSchema ){ + schemaIsValid(&sParse); + } + if( db->mallocFailed ){ + sParse.rc = SQLITE_NOMEM_BKPT; + } + if( pzTail ){ + *pzTail = sParse.zTail; + } + rc = sParse.rc; + +#ifndef SQLITE_OMIT_EXPLAIN + if( rc==SQLITE_OK && sParse.pVdbe && sParse.explain ){ + static const char * const azColName[] = { + "addr", "opcode", "p1", "p2", "p3", "p4", "p5", "comment", + "selectid", "order", "from", "detail" + }; + int iFirst, mx; + if( sParse.explain==2 ){ + sqlite3VdbeSetNumCols(sParse.pVdbe, 4); + iFirst = 8; + mx = 12; + }else{ + sqlite3VdbeSetNumCols(sParse.pVdbe, 8); + iFirst = 0; + mx = 8; + } + for(i=iFirst; iinit.busy==0 ){ + Vdbe *pVdbe = sParse.pVdbe; + sqlite3VdbeSetSql(pVdbe, zSql, (int)(sParse.zTail-zSql), saveSqlFlag); + } + if( sParse.pVdbe && (rc!=SQLITE_OK || db->mallocFailed) ){ + sqlite3VdbeFinalize(sParse.pVdbe); + assert(!(*ppStmt)); + }else{ + *ppStmt = (sqlite3_stmt*)sParse.pVdbe; + } + + if( zErrMsg ){ + sqlite3ErrorWithMsg(db, rc, "%s", zErrMsg); + sqlite3DbFree(db, zErrMsg); + }else{ + sqlite3Error(db, rc); + } + + /* Delete any TriggerPrg structures allocated while parsing this statement. */ + while( sParse.pTriggerPrg ){ + TriggerPrg *pT = sParse.pTriggerPrg; + sParse.pTriggerPrg = pT->pNext; + sqlite3DbFree(db, pT); + } + +end_prepare: + + sqlite3ParserReset(&sParse); + rc = sqlite3ApiExit(db, rc); + assert( (rc&db->errMask)==rc ); + return rc; +} +static int sqlite3LockAndPrepare( + sqlite3 *db, /* Database handle. */ + 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 */ +){ + int rc; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( ppStmt==0 ) return SQLITE_MISUSE_BKPT; +#endif + *ppStmt = 0; + if( !sqlite3SafetyCheckOk(db)||zSql==0 ){ + return SQLITE_MISUSE_BKPT; + } + sqlite3_mutex_enter(db->mutex); + sqlite3BtreeEnterAll(db); + rc = sqlite3Prepare(db, zSql, nBytes, saveSqlFlag, pOld, ppStmt, pzTail); + if( rc==SQLITE_SCHEMA ){ + sqlite3_finalize(*ppStmt); + rc = sqlite3Prepare(db, zSql, nBytes, saveSqlFlag, pOld, ppStmt, pzTail); + } + sqlite3BtreeLeaveAll(db); + sqlite3_mutex_leave(db->mutex); + assert( rc==SQLITE_OK || *ppStmt==0 ); + return rc; +} + +/* +** Rerun the compilation of a statement after a schema change. +** +** If the statement is successfully recompiled, return SQLITE_OK. Otherwise, +** if the statement cannot be recompiled because another connection has +** locked the sqlite3_master table, return SQLITE_LOCKED. If any other error +** occurs, return SQLITE_SCHEMA. +*/ +SQLITE_PRIVATE int sqlite3Reprepare(Vdbe *p){ + int rc; + sqlite3_stmt *pNew; + const char *zSql; + sqlite3 *db; + + assert( sqlite3_mutex_held(sqlite3VdbeDb(p)->mutex) ); + zSql = sqlite3_sql((sqlite3_stmt *)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, p, &pNew, 0); + if( rc ){ + if( rc==SQLITE_NOMEM ){ + sqlite3OomFault(db); + } + assert( pNew==0 ); + return rc; + }else{ + assert( pNew!=0 ); + } + sqlite3VdbeSwap((Vdbe*)pNew, p); + sqlite3TransferBindings(pNew, (sqlite3_stmt*)p); + sqlite3VdbeResetStepResult((Vdbe*)pNew); + sqlite3VdbeFinalize((Vdbe*)pNew); + return SQLITE_OK; +} + + +/* +** Two versions of the official API. Legacy and new use. In the legacy +** version, the original SQL text is not saved in the prepared statement +** and so if a schema change occurs, SQLITE_SCHEMA is returned by +** sqlite3_step(). In the new version, the original SQL text is retained +** and the statement is automatically recompiled if an schema change +** occurs. +*/ +SQLITE_API int sqlite3_prepare( + sqlite3 *db, /* Database handle. */ + const char *zSql, /* UTF-8 encoded SQL statement. */ + int nBytes, /* Length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ + const char **pzTail /* OUT: End of parsed string */ +){ + int rc; + rc = sqlite3LockAndPrepare(db,zSql,nBytes,0,0,ppStmt,pzTail); + assert( rc==SQLITE_OK || ppStmt==0 || *ppStmt==0 ); /* VERIFY: F13021 */ + return rc; +} +SQLITE_API int sqlite3_prepare_v2( + sqlite3 *db, /* Database handle. */ + const char *zSql, /* UTF-8 encoded SQL statement. */ + int nBytes, /* Length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ + const char **pzTail /* OUT: End of parsed string */ +){ + int rc; + rc = sqlite3LockAndPrepare(db,zSql,nBytes,1,0,ppStmt,pzTail); + assert( rc==SQLITE_OK || ppStmt==0 || *ppStmt==0 ); /* VERIFY: F13021 */ + return rc; +} + + +#ifndef SQLITE_OMIT_UTF16 +/* +** Compile the UTF-16 encoded SQL statement zSql into a statement handle. +*/ +static int sqlite3Prepare16( + sqlite3 *db, /* Database handle. */ + const void *zSql, /* UTF-16 encoded SQL statement. */ + int nBytes, /* Length of zSql in bytes. */ + int saveSqlFlag, /* True to save SQL text into the sqlite3_stmt */ + sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ + const void **pzTail /* OUT: End of parsed string */ +){ + /* This function currently works by first transforming the UTF-16 + ** encoded string to UTF-8, then invoking sqlite3_prepare(). The + ** tricky bit is figuring out the pointer to return in *pzTail. + */ + char *zSql8; + const char *zTail8 = 0; + int rc = SQLITE_OK; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( ppStmt==0 ) return SQLITE_MISUSE_BKPT; +#endif + *ppStmt = 0; + if( !sqlite3SafetyCheckOk(db)||zSql==0 ){ + return SQLITE_MISUSE_BKPT; + } + if( nBytes>=0 ){ + int sz; + const char *z = (const char*)zSql; + for(sz=0; szmutex); + zSql8 = sqlite3Utf16to8(db, zSql, nBytes, SQLITE_UTF16NATIVE); + if( zSql8 ){ + rc = sqlite3LockAndPrepare(db, zSql8, -1, saveSqlFlag, 0, ppStmt, &zTail8); + } + + if( zTail8 && pzTail ){ + /* If sqlite3_prepare returns a tail pointer, we calculate the + ** equivalent pointer into the UTF-16 string by counting the unicode + ** characters between zSql8 and zTail8, and then returning a pointer + ** the same number of characters into the UTF-16 string. + */ + int chars_parsed = sqlite3Utf8CharLen(zSql8, (int)(zTail8-zSql8)); + *pzTail = (u8 *)zSql + sqlite3Utf16ByteLen(zSql, chars_parsed); + } + sqlite3DbFree(db, zSql8); + rc = sqlite3ApiExit(db, rc); + sqlite3_mutex_leave(db->mutex); + return rc; +} + +/* +** Two versions of the official API. Legacy and new use. In the legacy +** version, the original SQL text is not saved in the prepared statement +** and so if a schema change occurs, SQLITE_SCHEMA is returned by +** sqlite3_step(). In the new version, the original SQL text is retained +** and the statement is automatically recompiled if an schema change +** occurs. +*/ +SQLITE_API int sqlite3_prepare16( + sqlite3 *db, /* Database handle. */ + const void *zSql, /* UTF-16 encoded SQL statement. */ + int nBytes, /* Length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ + const void **pzTail /* OUT: End of parsed string */ +){ + int rc; + rc = sqlite3Prepare16(db,zSql,nBytes,0,ppStmt,pzTail); + assert( rc==SQLITE_OK || ppStmt==0 || *ppStmt==0 ); /* VERIFY: F13021 */ + return rc; +} +SQLITE_API int sqlite3_prepare16_v2( + sqlite3 *db, /* Database handle. */ + const void *zSql, /* UTF-16 encoded SQL statement. */ + int nBytes, /* Length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ + const void **pzTail /* OUT: End of parsed string */ +){ + int rc; + rc = sqlite3Prepare16(db,zSql,nBytes,1,ppStmt,pzTail); + assert( rc==SQLITE_OK || ppStmt==0 || *ppStmt==0 ); /* VERIFY: F13021 */ + return rc; +} + +#endif /* SQLITE_OMIT_UTF16 */ + +/************** End of prepare.c *********************************************/ +/************** Begin file select.c ******************************************/ +/* +** 2001 September 15 +** +** 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 C code routines that are called by the parser +** to handle SELECT statements in SQLite. +*/ +/* #include "sqliteInt.h" */ + +/* +** Trace output macros +*/ +#if SELECTTRACE_ENABLED +/***/ int sqlite3SelectTrace = 0; +# define SELECTTRACE(K,P,S,X) \ + if(sqlite3SelectTrace&(K)) \ + sqlite3DebugPrintf("%*s%s.%p: ",(P)->nSelectIndent*2-2,"",\ + (S)->zSelName,(S)),\ + sqlite3DebugPrintf X +#else +# define SELECTTRACE(K,P,S,X) +#endif + + +/* +** An instance of the following object is used to record information about +** how to process the DISTINCT keyword, to simplify passing that information +** into the selectInnerLoop() routine. +*/ +typedef struct DistinctCtx DistinctCtx; +struct DistinctCtx { + u8 isTnct; /* True if the DISTINCT keyword is present */ + u8 eTnctType; /* One of the WHERE_DISTINCT_* operators */ + int tabTnct; /* Ephemeral table used for DISTINCT processing */ + int addrTnct; /* Address of OP_OpenEphemeral opcode for tabTnct */ +}; + +/* +** An instance of the following object is used to record information about +** the ORDER BY (or GROUP BY) clause of query is being coded. +*/ +typedef struct SortCtx SortCtx; +struct SortCtx { + ExprList *pOrderBy; /* The ORDER BY (or GROUP BY clause) */ + int nOBSat; /* Number of ORDER BY terms satisfied by indices */ + int iECursor; /* Cursor number for the sorter */ + int regReturn; /* Register holding block-output return address */ + int labelBkOut; /* Start label for the block-output subroutine */ + int addrSortIndex; /* Address of the OP_SorterOpen or OP_OpenEphemeral */ + int labelDone; /* Jump here when done, ex: LIMIT reached */ + u8 sortFlags; /* Zero or more SORTFLAG_* bits */ + u8 bOrderedInnerLoop; /* ORDER BY correctly sorts the inner loop */ +}; +#define SORTFLAG_UseSorter 0x01 /* Use SorterOpen instead of OpenEphemeral */ + +/* +** Delete all the content of a Select structure. Deallocate the structure +** itself only if bFree is true. +*/ +static void clearSelect(sqlite3 *db, Select *p, int bFree){ + while( p ){ + Select *pPrior = p->pPrior; + sqlite3ExprListDelete(db, p->pEList); + sqlite3SrcListDelete(db, p->pSrc); + sqlite3ExprDelete(db, p->pWhere); + sqlite3ExprListDelete(db, p->pGroupBy); + sqlite3ExprDelete(db, p->pHaving); + sqlite3ExprListDelete(db, p->pOrderBy); + sqlite3ExprDelete(db, p->pLimit); + sqlite3ExprDelete(db, p->pOffset); + if( p->pWith ) sqlite3WithDelete(db, p->pWith); + if( bFree ) sqlite3DbFree(db, p); + p = pPrior; + bFree = 1; + } +} + +/* +** Initialize a SelectDest structure. +*/ +SQLITE_PRIVATE void sqlite3SelectDestInit(SelectDest *pDest, int eDest, int iParm){ + pDest->eDest = (u8)eDest; + pDest->iSDParm = iParm; + pDest->zAffSdst = 0; + pDest->iSdst = 0; + pDest->nSdst = 0; +} + + +/* +** Allocate a new Select structure and return a pointer to that +** structure. +*/ +SQLITE_PRIVATE Select *sqlite3SelectNew( + Parse *pParse, /* Parsing context */ + ExprList *pEList, /* which columns to include in the result */ + SrcList *pSrc, /* the FROM clause -- which tables to scan */ + Expr *pWhere, /* the WHERE clause */ + ExprList *pGroupBy, /* the GROUP BY clause */ + Expr *pHaving, /* the HAVING clause */ + ExprList *pOrderBy, /* the ORDER BY clause */ + u32 selFlags, /* Flag parameters, such as SF_Distinct */ + Expr *pLimit, /* LIMIT value. NULL means not used */ + Expr *pOffset /* OFFSET value. NULL means no offset */ +){ + Select *pNew; + Select standin; + sqlite3 *db = pParse->db; + pNew = sqlite3DbMallocRawNN(db, sizeof(*pNew) ); + if( pNew==0 ){ + assert( db->mallocFailed ); + pNew = &standin; + } + if( pEList==0 ){ + pEList = sqlite3ExprListAppend(pParse, 0, sqlite3Expr(db,TK_ASTERISK,0)); + } + pNew->pEList = pEList; + pNew->op = TK_SELECT; + pNew->selFlags = selFlags; + pNew->iLimit = 0; + pNew->iOffset = 0; +#if SELECTTRACE_ENABLED + pNew->zSelName[0] = 0; +#endif + pNew->addrOpenEphm[0] = -1; + pNew->addrOpenEphm[1] = -1; + pNew->nSelectRow = 0; + if( pSrc==0 ) pSrc = sqlite3DbMallocZero(db, sizeof(*pSrc)); + pNew->pSrc = pSrc; + pNew->pWhere = pWhere; + pNew->pGroupBy = pGroupBy; + pNew->pHaving = pHaving; + pNew->pOrderBy = pOrderBy; + pNew->pPrior = 0; + pNew->pNext = 0; + pNew->pLimit = pLimit; + pNew->pOffset = pOffset; + pNew->pWith = 0; + assert( pOffset==0 || pLimit!=0 || pParse->nErr>0 || db->mallocFailed!=0 ); + if( db->mallocFailed ) { + clearSelect(db, pNew, pNew!=&standin); + pNew = 0; + }else{ + assert( pNew->pSrc!=0 || pParse->nErr>0 ); + } + assert( pNew!=&standin ); + return pNew; +} + +#if SELECTTRACE_ENABLED +/* +** Set the name of a Select object +*/ +SQLITE_PRIVATE void sqlite3SelectSetName(Select *p, const char *zName){ + if( p && zName ){ + sqlite3_snprintf(sizeof(p->zSelName), p->zSelName, "%s", zName); + } +} +#endif + + +/* +** Delete the given Select structure and all of its substructures. +*/ +SQLITE_PRIVATE void sqlite3SelectDelete(sqlite3 *db, Select *p){ + if( p ) clearSelect(db, p, 1); +} + +/* +** Return a pointer to the right-most SELECT statement in a compound. +*/ +static Select *findRightmost(Select *p){ + while( p->pNext ) p = p->pNext; + return p; +} + +/* +** Given 1 to 3 identifiers preceding the JOIN keyword, determine the +** type of join. Return an integer constant that expresses that type +** in terms of the following bit values: +** +** JT_INNER +** JT_CROSS +** JT_OUTER +** JT_NATURAL +** JT_LEFT +** JT_RIGHT +** +** A full outer join is the combination of JT_LEFT and JT_RIGHT. +** +** If an illegal or unsupported join type is seen, then still return +** a join type, but put an error in the pParse structure. +*/ +SQLITE_PRIVATE int sqlite3JoinType(Parse *pParse, Token *pA, Token *pB, Token *pC){ + int jointype = 0; + Token *apAll[3]; + Token *p; + /* 0123456789 123456789 123456789 123 */ + static const char zKeyText[] = "naturaleftouterightfullinnercross"; + static const struct { + u8 i; /* Beginning of keyword text in zKeyText[] */ + u8 nChar; /* Length of the keyword in characters */ + u8 code; /* Join type mask */ + } aKeyword[] = { + /* natural */ { 0, 7, JT_NATURAL }, + /* left */ { 6, 4, JT_LEFT|JT_OUTER }, + /* outer */ { 10, 5, JT_OUTER }, + /* right */ { 14, 5, JT_RIGHT|JT_OUTER }, + /* full */ { 19, 4, JT_LEFT|JT_RIGHT|JT_OUTER }, + /* inner */ { 23, 5, JT_INNER }, + /* cross */ { 28, 5, JT_INNER|JT_CROSS }, + }; + int i, j; + apAll[0] = pA; + apAll[1] = pB; + apAll[2] = pC; + for(i=0; i<3 && apAll[i]; i++){ + p = apAll[i]; + for(j=0; jn==aKeyword[j].nChar + && sqlite3StrNICmp((char*)p->z, &zKeyText[aKeyword[j].i], p->n)==0 ){ + jointype |= aKeyword[j].code; + break; + } + } + testcase( j==0 || j==1 || j==2 || j==3 || j==4 || j==5 || j==6 ); + if( j>=ArraySize(aKeyword) ){ + jointype |= JT_ERROR; + break; + } + } + if( + (jointype & (JT_INNER|JT_OUTER))==(JT_INNER|JT_OUTER) || + (jointype & JT_ERROR)!=0 + ){ + const char *zSp = " "; + assert( pB!=0 ); + if( pC==0 ){ zSp++; } + sqlite3ErrorMsg(pParse, "unknown or unsupported join type: " + "%T %T%s%T", pA, pB, zSp, pC); + jointype = JT_INNER; + }else if( (jointype & JT_OUTER)!=0 + && (jointype & (JT_LEFT|JT_RIGHT))!=JT_LEFT ){ + sqlite3ErrorMsg(pParse, + "RIGHT and FULL OUTER JOINs are not currently supported"); + jointype = JT_INNER; + } + return jointype; +} + +/* +** Return the index of a column in a table. Return -1 if the column +** is not contained in the table. +*/ +static int columnIndex(Table *pTab, const char *zCol){ + int i; + for(i=0; inCol; i++){ + if( sqlite3StrICmp(pTab->aCol[i].zName, zCol)==0 ) return i; + } + return -1; +} + +/* +** 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. +*/ +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; +} + +/* +** 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 */ + 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 */ +){ + sqlite3 *db = pParse->db; + Expr *pE1; + Expr *pE2; + Expr *pEq; + + 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( !ExprHasProperty(pEq, EP_TokenOnly|EP_Reduced) ); + ExprSetVVAProperty(pEq, EP_NoReduce); + pEq->iRightJoinTable = (i16)pE2->iTable; + } + *ppWhere = sqlite3ExprAnd(db, *ppWhere, pEq); +} + +/* +** Set the EP_FromJoin property on all terms of the given expression. +** And set the Expr.iRightJoinTable to iTable for every term in the +** expression. +** +** The EP_FromJoin property is used on terms of an expression to tell +** the LEFT OUTER JOIN processing logic that this term is part of the +** join restriction specified in the ON or USING clause and not a part +** of the more general WHERE clause. These terms are moved over to the +** WHERE clause during join processing but we need to remember that they +** originated in the ON or USING clause. +** +** The Expr.iRightJoinTable tells the WHERE clause processing that the +** expression depends on table iRightJoinTable even if that table is not +** explicitly mentioned in the expression. That information is needed +** for cases like this: +** +** SELECT * FROM t1 LEFT JOIN t2 ON t1.a=t2.b AND t1.x=5 +** +** The where clause needs to defer the handling of the t1.x=5 +** term until after the t2 loop of the join. In that way, a +** NULL t2 row will be inserted whenever t1.x!=5. If we do not +** defer the handling of t1.x=5, it will be processed immediately +** after the t1 loop and rows with t1.x!=5 will never appear in +** the output, which is incorrect. +*/ +static void setJoinExpr(Expr *p, int iTable){ + while( p ){ + ExprSetProperty(p, EP_FromJoin); + assert( !ExprHasProperty(p, EP_TokenOnly|EP_Reduced) ); + ExprSetVVAProperty(p, EP_NoReduce); + p->iRightJoinTable = (i16)iTable; + if( p->op==TK_FUNCTION && p->x.pList ){ + int i; + for(i=0; ix.pList->nExpr; i++){ + setJoinExpr(p->x.pList->a[i].pExpr, iTable); + } + } + setJoinExpr(p->pLeft, iTable); + p = p->pRight; + } +} + +/* +** This routine processes the join information for a SELECT statement. +** ON and USING clauses are converted into extra terms of the WHERE clause. +** NATURAL joins also create extra WHERE clause terms. +** +** The terms of a FROM clause are contained in the Select.pSrc structure. +** The left most table is the first entry in Select.pSrc. The right-most +** table is the last entry. The join operator is held in the entry to +** the left. Thus entry 0 contains the join operator for the join between +** entries 0 and 1. Any ON or USING clauses associated with the join are +** also attached to the left entry. +** +** This routine returns the number of errors encountered. +*/ +static int sqliteProcessJoin(Parse *pParse, Select *p){ + SrcList *pSrc; /* All tables in the FROM clause */ + int i, j; /* Loop counters */ + struct SrcList_item *pLeft; /* Left table being joined */ + struct SrcList_item *pRight; /* Right table being joined */ + + pSrc = p->pSrc; + pLeft = &pSrc->a[0]; + pRight = &pLeft[1]; + for(i=0; inSrc-1; i++, pRight++, pLeft++){ + Table *pLeftTab = pLeft->pTab; + Table *pRightTab = pRight->pTab; + int isOuter; + + if( NEVER(pLeftTab==0 || pRightTab==0) ) continue; + isOuter = (pRight->fg.jointype & JT_OUTER)!=0; + + /* When the NATURAL keyword is present, add WHERE clause terms for + ** every column that the two tables have in common. + */ + if( pRight->fg.jointype & JT_NATURAL ){ + if( pRight->pOn || pRight->pUsing ){ + sqlite3ErrorMsg(pParse, "a NATURAL join may not have " + "an ON or USING clause", 0); + return 1; + } + 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); + } + } + } + + /* Disallow both ON and USING clauses in the same join + */ + if( pRight->pOn && pRight->pUsing ){ + sqlite3ErrorMsg(pParse, "cannot have both ON and USING " + "clauses in the same join"); + return 1; + } + + /* Add the ON clause to the end of the WHERE clause, connected by + ** an AND operator. + */ + if( pRight->pOn ){ + if( isOuter ) setJoinExpr(pRight->pOn, pRight->iCursor); + p->pWhere = sqlite3ExprAnd(pParse->db, p->pWhere, pRight->pOn); + pRight->pOn = 0; + } + + /* Create extra terms on the WHERE clause for each column named + ** in the USING clause. Example: If the two tables to be joined are + ** A and B and the USING clause names X, Y, and Z, then add this + ** to the WHERE clause: A.X=B.X AND A.Y=B.Y AND A.Z=B.Z + ** Report an error if any column mentioned in the USING clause is + ** not contained in both tables to be joined. + */ + if( pRight->pUsing ){ + IdList *pList = pRight->pUsing; + for(j=0; jnId; j++){ + 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, pSrc, iLeft, iLeftCol, i+1, iRightCol, + isOuter, &p->pWhere); + } + } + } + return 0; +} + +/* Forward reference */ +static KeyInfo *keyInfoFromExprList( + Parse *pParse, /* Parsing context */ + ExprList *pList, /* Form the KeyInfo object from this ExprList */ + int iStart, /* Begin with this column of pList */ + int nExtra /* Add this many extra columns to the end */ +); + +/* +** Generate code that will push the record in registers regData +** through regData+nData-1 onto the sorter. +*/ +static void pushOntoSorter( + Parse *pParse, /* Parser context */ + SortCtx *pSort, /* Information about the ORDER BY clause */ + Select *pSelect, /* The whole SELECT statement */ + int regData, /* First register holding data to be sorted */ + int regOrigData, /* First register holding data before packing */ + int nData, /* Number of elements in the data array */ + int nPrefixReg /* No. of reg prior to regData available for use */ +){ + Vdbe *v = pParse->pVdbe; /* Stmt under construction */ + int bSeq = ((pSort->sortFlags & SORTFLAG_UseSorter)==0); + int nExpr = pSort->pOrderBy->nExpr; /* No. of ORDER BY terms */ + int nBase = nExpr + bSeq + nData; /* Fields in sorter record */ + int regBase; /* Regs for sorter record */ + int regRecord = ++pParse->nMem; /* Assembled sorter record */ + int nOBSat = pSort->nOBSat; /* ORDER BY terms to skip */ + int op; /* Opcode to add sorter record to sorter */ + int iLimit; /* LIMIT counter */ + + assert( bSeq==0 || bSeq==1 ); + assert( nData==1 || regData==regOrigData ); + if( nPrefixReg ){ + assert( nPrefixReg==nExpr+bSeq ); + regBase = regData - nExpr - bSeq; + }else{ + regBase = pParse->nMem + 1; + pParse->nMem += nBase; + } + assert( pSelect->iOffset==0 || pSelect->iLimit!=0 ); + iLimit = pSelect->iOffset ? pSelect->iOffset+1 : pSelect->iLimit; + pSort->labelDone = sqlite3VdbeMakeLabel(v); + sqlite3ExprCodeExprList(pParse, pSort->pOrderBy, regBase, regOrigData, + SQLITE_ECEL_DUP|SQLITE_ECEL_REF); + if( bSeq ){ + sqlite3VdbeAddOp2(v, OP_Sequence, pSort->iECursor, regBase+nExpr); + } + if( nPrefixReg==0 ){ + sqlite3ExprCodeMove(pParse, regData, regBase+nExpr+bSeq, nData); + } + sqlite3VdbeAddOp3(v, OP_MakeRecord, regBase+nOBSat, nBase-nOBSat, regRecord); + if( nOBSat>0 ){ + int regPrevKey; /* The first nOBSat columns of the previous row */ + int addrFirst; /* Address of the OP_IfNot opcode */ + int addrJmp; /* Address of the OP_Jump opcode */ + VdbeOp *pOp; /* Opcode that opens the sorter */ + int nKey; /* Number of sorting key columns, including OP_Sequence */ + KeyInfo *pKI; /* Original KeyInfo on the sorter table */ + + regPrevKey = pParse->nMem+1; + pParse->nMem += pSort->nOBSat; + nKey = nExpr - pSort->nOBSat + bSeq; + if( bSeq ){ + addrFirst = sqlite3VdbeAddOp1(v, OP_IfNot, regBase+nExpr); + }else{ + addrFirst = sqlite3VdbeAddOp1(v, OP_SequenceTest, pSort->iECursor); + } + VdbeCoverage(v); + sqlite3VdbeAddOp3(v, OP_Compare, regPrevKey, regBase, pSort->nOBSat); + pOp = sqlite3VdbeGetOp(v, pSort->addrSortIndex); + if( pParse->db->mallocFailed ) return; + pOp->p2 = nKey + nData; + pKI = pOp->p4.pKeyInfo; + memset(pKI->aSortOrder, 0, pKI->nField); /* Makes OP_Jump below testable */ + sqlite3VdbeChangeP4(v, -1, (char*)pKI, P4_KEYINFO); + testcase( pKI->nXField>2 ); + pOp->p4.pKeyInfo = keyInfoFromExprList(pParse, pSort->pOrderBy, nOBSat, + pKI->nXField-1); + addrJmp = sqlite3VdbeCurrentAddr(v); + sqlite3VdbeAddOp3(v, OP_Jump, addrJmp+1, 0, addrJmp+1); VdbeCoverage(v); + pSort->labelBkOut = sqlite3VdbeMakeLabel(v); + pSort->regReturn = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Gosub, pSort->regReturn, pSort->labelBkOut); + sqlite3VdbeAddOp1(v, OP_ResetSorter, pSort->iECursor); + if( iLimit ){ + sqlite3VdbeAddOp2(v, OP_IfNot, iLimit, pSort->labelDone); + VdbeCoverage(v); + } + sqlite3VdbeJumpHere(v, addrFirst); + sqlite3ExprCodeMove(pParse, regBase, regPrevKey, pSort->nOBSat); + sqlite3VdbeJumpHere(v, addrJmp); + } + if( pSort->sortFlags & SORTFLAG_UseSorter ){ + op = OP_SorterInsert; + }else{ + op = OP_IdxInsert; + } + sqlite3VdbeAddOp2(v, op, pSort->iECursor, regRecord); + if( iLimit ){ + int addr; + int r1 = 0; + /* Fill the sorter until it contains LIMIT+OFFSET entries. (The iLimit + ** register is initialized with value of LIMIT+OFFSET.) After the sorter + ** fills up, delete the least entry in the sorter after each insert. + ** Thus we never hold more than the LIMIT+OFFSET rows in memory at once */ + addr = sqlite3VdbeAddOp3(v, OP_IfNotZero, iLimit, 0, 1); VdbeCoverage(v); + sqlite3VdbeAddOp1(v, OP_Last, pSort->iECursor); + if( pSort->bOrderedInnerLoop ){ + r1 = ++pParse->nMem; + sqlite3VdbeAddOp3(v, OP_Column, pSort->iECursor, nExpr, r1); + VdbeComment((v, "seq")); + } + sqlite3VdbeAddOp1(v, OP_Delete, pSort->iECursor); + if( pSort->bOrderedInnerLoop ){ + /* If the inner loop is driven by an index such that values from + ** the same iteration of the inner loop are in sorted order, then + ** immediately jump to the next iteration of an inner loop if the + ** entry from the current iteration does not fit into the top + ** LIMIT+OFFSET entries of the sorter. */ + int iBrk = sqlite3VdbeCurrentAddr(v) + 2; + sqlite3VdbeAddOp3(v, OP_Eq, regBase+nExpr, iBrk, r1); + sqlite3VdbeChangeP5(v, SQLITE_NULLEQ); + VdbeCoverage(v); + } + sqlite3VdbeJumpHere(v, addr); + } +} + +/* +** Add code to implement the OFFSET +*/ +static void codeOffset( + Vdbe *v, /* Generate code into this VM */ + int iOffset, /* Register holding the offset counter */ + int iContinue /* Jump here to skip the current record */ +){ + if( iOffset>0 ){ + sqlite3VdbeAddOp3(v, OP_IfPos, iOffset, iContinue, 1); VdbeCoverage(v); + VdbeComment((v, "OFFSET")); + } +} + +/* +** Add code that will check to make sure the N registers starting at iMem +** form a distinct entry. iTab is a sorting index that holds previously +** seen combinations of the N values. A new entry is made in iTab +** if the current N values are new. +** +** A jump to addrRepeat is made and the N+1 values are popped from the +** stack if the top N elements are not distinct. +*/ +static void codeDistinct( + Parse *pParse, /* Parsing and code generating context */ + int iTab, /* A sorting index used to test for distinctness */ + int addrRepeat, /* Jump to here if not distinct */ + int N, /* Number of elements */ + int iMem /* First element */ +){ + Vdbe *v; + int r1; + + v = pParse->pVdbe; + r1 = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp4Int(v, OP_Found, iTab, addrRepeat, iMem, N); VdbeCoverage(v); + sqlite3VdbeAddOp3(v, OP_MakeRecord, iMem, N, r1); + sqlite3VdbeAddOp2(v, OP_IdxInsert, iTab, r1); + sqlite3ReleaseTempReg(pParse, r1); +} + +/* +** This routine generates the code for the inside of the inner loop +** of a SELECT. +** +** If srcTab is negative, then the pEList expressions +** are evaluated in order to get the data for this row. If srcTab is +** zero or more, then data is pulled from srcTab and pEList is used only +** to get number columns and the datatype for each column. +*/ +static void selectInnerLoop( + Parse *pParse, /* The parser context */ + Select *p, /* The complete select statement being coded */ + ExprList *pEList, /* List of values being extracted */ + int srcTab, /* Pull data from this table */ + SortCtx *pSort, /* If not NULL, info on how to process ORDER BY */ + DistinctCtx *pDistinct, /* If not NULL, info on how to process DISTINCT */ + SelectDest *pDest, /* How to dispose of the results */ + int iContinue, /* Jump here to continue with next row */ + int iBreak /* Jump here to break out of the inner loop */ +){ + Vdbe *v = pParse->pVdbe; + int i; + int hasDistinct; /* True if the DISTINCT keyword is present */ + int regResult; /* Start of memory holding result set */ + int eDest = pDest->eDest; /* How to dispose of results */ + int iParm = pDest->iSDParm; /* First argument to disposal method */ + int nResultCol; /* Number of result columns */ + int nPrefixReg = 0; /* Number of extra registers before regResult */ + + assert( v ); + assert( pEList!=0 ); + hasDistinct = pDistinct ? pDistinct->eTnctType : WHERE_DISTINCT_NOOP; + if( pSort && pSort->pOrderBy==0 ) pSort = 0; + if( pSort==0 && !hasDistinct ){ + assert( iContinue!=0 ); + codeOffset(v, p->iOffset, iContinue); + } + + /* Pull the requested columns. + */ + nResultCol = pEList->nExpr; + + if( pDest->iSdst==0 ){ + if( pSort ){ + nPrefixReg = pSort->pOrderBy->nExpr; + if( !(pSort->sortFlags & SORTFLAG_UseSorter) ) nPrefixReg++; + pParse->nMem += nPrefixReg; + } + pDest->iSdst = pParse->nMem+1; + pParse->nMem += nResultCol; + }else if( pDest->iSdst+nResultCol > pParse->nMem ){ + /* This is an error condition that can result, for example, when a SELECT + ** on the right-hand side of an INSERT contains more result columns than + ** there are columns in the table on the left. The error will be caught + ** and reported later. But we need to make sure enough memory is allocated + ** to avoid other spurious errors in the meantime. */ + pParse->nMem += nResultCol; + } + pDest->nSdst = nResultCol; + regResult = pDest->iSdst; + if( srcTab>=0 ){ + for(i=0; ia[i].zName)); + } + }else if( eDest!=SRT_Exists ){ + /* If the destination is an EXISTS(...) expression, the actual + ** values returned by the SELECT are not required. + */ + u8 ecelFlags; + if( eDest==SRT_Mem || eDest==SRT_Output || eDest==SRT_Coroutine ){ + ecelFlags = SQLITE_ECEL_DUP; + }else{ + ecelFlags = 0; + } + sqlite3ExprCodeExprList(pParse, pEList, regResult, 0, ecelFlags); + } + + /* If the DISTINCT keyword was present on the SELECT statement + ** and this row has been seen before, then do not make this row + ** part of the result. + */ + if( hasDistinct ){ + switch( pDistinct->eTnctType ){ + case WHERE_DISTINCT_ORDERED: { + VdbeOp *pOp; /* No longer required OpenEphemeral instr. */ + int iJump; /* Jump destination */ + int regPrev; /* Previous row content */ + + /* Allocate space for the previous row */ + regPrev = pParse->nMem+1; + pParse->nMem += nResultCol; + + /* Change the OP_OpenEphemeral coded earlier to an OP_Null + ** sets the MEM_Cleared bit on the first register of the + ** previous value. This will cause the OP_Ne below to always + ** fail on the first iteration of the loop even if the first + ** row is all NULLs. + */ + sqlite3VdbeChangeToNoop(v, pDistinct->addrTnct); + pOp = sqlite3VdbeGetOp(v, pDistinct->addrTnct); + pOp->opcode = OP_Null; + pOp->p1 = 1; + pOp->p2 = regPrev; + + iJump = sqlite3VdbeCurrentAddr(v) + nResultCol; + for(i=0; ia[i].pExpr); + if( idb->mallocFailed ); + sqlite3VdbeAddOp3(v, OP_Copy, regResult, regPrev, nResultCol-1); + break; + } + + case WHERE_DISTINCT_UNIQUE: { + sqlite3VdbeChangeToNoop(v, pDistinct->addrTnct); + break; + } + + default: { + assert( pDistinct->eTnctType==WHERE_DISTINCT_UNORDERED ); + codeDistinct(pParse, pDistinct->tabTnct, iContinue, nResultCol, + regResult); + break; + } + } + if( pSort==0 ){ + codeOffset(v, p->iOffset, iContinue); + } + } + + switch( eDest ){ + /* In this mode, write each query result to the key of the temporary + ** table iParm. + */ +#ifndef SQLITE_OMIT_COMPOUND_SELECT + case SRT_Union: { + int r1; + r1 = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp3(v, OP_MakeRecord, regResult, nResultCol, r1); + sqlite3VdbeAddOp2(v, OP_IdxInsert, iParm, r1); + sqlite3ReleaseTempReg(pParse, r1); + break; + } + + /* Construct a record from the query result, but instead of + ** saving that record, use it as a key to delete elements from + ** the temporary table iParm. + */ + case SRT_Except: { + sqlite3VdbeAddOp3(v, OP_IdxDelete, iParm, regResult, nResultCol); + break; + } +#endif /* SQLITE_OMIT_COMPOUND_SELECT */ + + /* Store the result as data using a unique key. + */ + case SRT_Fifo: + case SRT_DistFifo: + case SRT_Table: + case SRT_EphemTab: { + int r1 = sqlite3GetTempRange(pParse, nPrefixReg+1); + testcase( eDest==SRT_Table ); + testcase( eDest==SRT_EphemTab ); + testcase( eDest==SRT_Fifo ); + testcase( eDest==SRT_DistFifo ); + sqlite3VdbeAddOp3(v, OP_MakeRecord, regResult, nResultCol, r1+nPrefixReg); +#ifndef SQLITE_OMIT_CTE + if( eDest==SRT_DistFifo ){ + /* If the destination is DistFifo, then cursor (iParm+1) is open + ** on an ephemeral index. If the current row is already present + ** in the index, do not write it to the output. If not, add the + ** current row to the index and proceed with writing it to the + ** output table as well. */ + int addr = sqlite3VdbeCurrentAddr(v) + 4; + sqlite3VdbeAddOp4Int(v, OP_Found, iParm+1, addr, r1, 0); + VdbeCoverage(v); + sqlite3VdbeAddOp2(v, OP_IdxInsert, iParm+1, r1); + assert( pSort==0 ); + } +#endif + if( pSort ){ + pushOntoSorter(pParse, pSort, p, r1+nPrefixReg,regResult,1,nPrefixReg); + }else{ + int r2 = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp2(v, OP_NewRowid, iParm, r2); + sqlite3VdbeAddOp3(v, OP_Insert, iParm, r1, r2); + sqlite3VdbeChangeP5(v, OPFLAG_APPEND); + sqlite3ReleaseTempReg(pParse, r2); + } + sqlite3ReleaseTempRange(pParse, r1, nPrefixReg+1); + break; + } + +#ifndef SQLITE_OMIT_SUBQUERY + /* If we are creating a set for an "expr IN (SELECT ...)" construct, + ** then there should be a single item on the stack. Write this + ** item into the set table with bogus data. + */ + case SRT_Set: { + if( pSort ){ + /* At first glance you would think we could optimize out the + ** ORDER BY in this case since the order of entries in the set + ** does not matter. But there might be a LIMIT clause, in which + ** case the order does matter */ + pushOntoSorter( + pParse, pSort, p, regResult, regResult, nResultCol, nPrefixReg); + }else{ + int r1 = sqlite3GetTempReg(pParse); + assert( sqlite3Strlen30(pDest->zAffSdst)==nResultCol ); + sqlite3VdbeAddOp4(v, OP_MakeRecord, regResult, nResultCol, + r1, pDest->zAffSdst, nResultCol); + sqlite3ExprCacheAffinityChange(pParse, regResult, nResultCol); + sqlite3VdbeAddOp2(v, OP_IdxInsert, iParm, r1); + sqlite3ReleaseTempReg(pParse, r1); + } + break; + } + + /* If any row exist in the result set, record that fact and abort. + */ + case SRT_Exists: { + sqlite3VdbeAddOp2(v, OP_Integer, 1, iParm); + /* The LIMIT clause will terminate the loop for us */ + break; + } + + /* If this is a scalar select that is part of an expression, then + ** store the results in the appropriate memory cell or array of + ** memory cells and break out of the scan loop. + */ + case SRT_Mem: { + assert( nResultCol==pDest->nSdst ); + if( pSort ){ + pushOntoSorter( + pParse, pSort, p, regResult, regResult, nResultCol, nPrefixReg); + }else{ + assert( regResult==iParm ); + /* The LIMIT clause will jump out of the loop for us */ + } + break; + } +#endif /* #ifndef SQLITE_OMIT_SUBQUERY */ + + case SRT_Coroutine: /* Send data to a co-routine */ + case SRT_Output: { /* Return the results */ + testcase( eDest==SRT_Coroutine ); + testcase( eDest==SRT_Output ); + if( pSort ){ + pushOntoSorter(pParse, pSort, p, regResult, regResult, nResultCol, + nPrefixReg); + }else if( eDest==SRT_Coroutine ){ + sqlite3VdbeAddOp1(v, OP_Yield, pDest->iSDParm); + }else{ + sqlite3VdbeAddOp2(v, OP_ResultRow, regResult, nResultCol); + sqlite3ExprCacheAffinityChange(pParse, regResult, nResultCol); + } + break; + } + +#ifndef SQLITE_OMIT_CTE + /* Write the results into a priority queue that is order according to + ** pDest->pOrderBy (in pSO). pDest->iSDParm (in iParm) is the cursor for an + ** index with pSO->nExpr+2 columns. Build a key using pSO for the first + ** pSO->nExpr columns, then make sure all keys are unique by adding a + ** final OP_Sequence column. The last column is the record as a blob. + */ + case SRT_DistQueue: + case SRT_Queue: { + int nKey; + int r1, r2, r3; + int addrTest = 0; + ExprList *pSO; + pSO = pDest->pOrderBy; + assert( pSO ); + nKey = pSO->nExpr; + r1 = sqlite3GetTempReg(pParse); + r2 = sqlite3GetTempRange(pParse, nKey+2); + r3 = r2+nKey+1; + if( eDest==SRT_DistQueue ){ + /* If the destination is DistQueue, then cursor (iParm+1) is open + ** on a second ephemeral index that holds all values every previously + ** added to the queue. */ + addrTest = sqlite3VdbeAddOp4Int(v, OP_Found, iParm+1, 0, + regResult, nResultCol); + VdbeCoverage(v); + } + sqlite3VdbeAddOp3(v, OP_MakeRecord, regResult, nResultCol, r3); + if( eDest==SRT_DistQueue ){ + sqlite3VdbeAddOp2(v, OP_IdxInsert, iParm+1, r3); + sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT); + } + for(i=0; ia[i].u.x.iOrderByCol - 1, + r2+i); + } + sqlite3VdbeAddOp2(v, OP_Sequence, iParm, r2+nKey); + sqlite3VdbeAddOp3(v, OP_MakeRecord, r2, nKey+2, r1); + sqlite3VdbeAddOp2(v, OP_IdxInsert, iParm, r1); + if( addrTest ) sqlite3VdbeJumpHere(v, addrTest); + sqlite3ReleaseTempReg(pParse, r1); + sqlite3ReleaseTempRange(pParse, r2, nKey+2); + break; + } +#endif /* SQLITE_OMIT_CTE */ + + + +#if !defined(SQLITE_OMIT_TRIGGER) + /* Discard the results. This is used for SELECT statements inside + ** the body of a TRIGGER. The purpose of such selects is to call + ** user-defined functions that have side effects. We do not care + ** about the actual results of the select. + */ + default: { + assert( eDest==SRT_Discard ); + break; + } +#endif + } + + /* Jump to the end of the loop if the LIMIT is reached. Except, if + ** there is a sorter, in which case the sorter has already limited + ** the output for us. + */ + if( pSort==0 && p->iLimit ){ + sqlite3VdbeAddOp2(v, OP_DecrJumpZero, p->iLimit, iBreak); VdbeCoverage(v); + } +} + +/* +** Allocate a KeyInfo object sufficient for an index of N key columns and +** X extra columns. +*/ +SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoAlloc(sqlite3 *db, int N, int X){ + int nExtra = (N+X)*(sizeof(CollSeq*)+1); + KeyInfo *p = sqlite3DbMallocRawNN(db, sizeof(KeyInfo) + nExtra); + if( p ){ + p->aSortOrder = (u8*)&p->aColl[N+X]; + p->nField = (u16)N; + p->nXField = (u16)X; + p->enc = ENC(db); + p->db = db; + p->nRef = 1; + memset(&p[1], 0, nExtra); + }else{ + sqlite3OomFault(db); + } + return p; +} + +/* +** Deallocate a KeyInfo object +*/ +SQLITE_PRIVATE void sqlite3KeyInfoUnref(KeyInfo *p){ + if( p ){ + assert( p->nRef>0 ); + p->nRef--; + if( p->nRef==0 ) sqlite3DbFree(p->db, p); + } +} + +/* +** Make a new pointer to a KeyInfo object +*/ +SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoRef(KeyInfo *p){ + if( p ){ + assert( p->nRef>0 ); + p->nRef++; + } + return p; +} + +#ifdef SQLITE_DEBUG +/* +** Return TRUE if a KeyInfo object can be change. The KeyInfo object +** can only be changed if this is just a single reference to the object. +** +** This routine is used only inside of assert() statements. +*/ +SQLITE_PRIVATE int sqlite3KeyInfoIsWriteable(KeyInfo *p){ return p->nRef==1; } +#endif /* SQLITE_DEBUG */ + +/* +** Given an expression list, generate a KeyInfo structure that records +** the collating sequence for each expression in that expression list. +** +** If the ExprList is an ORDER BY or GROUP BY clause then the resulting +** KeyInfo structure is appropriate for initializing a virtual index to +** implement that clause. If the ExprList is the result set of a SELECT +** then the KeyInfo structure is appropriate for initializing a virtual +** index to implement a DISTINCT test. +** +** Space to hold the KeyInfo structure is obtained from malloc. The calling +** function is responsible for seeing that this structure is eventually +** freed. +*/ +static KeyInfo *keyInfoFromExprList( + Parse *pParse, /* Parsing context */ + ExprList *pList, /* Form the KeyInfo object from this ExprList */ + int iStart, /* Begin with this column of pList */ + int nExtra /* Add this many extra columns to the end */ +){ + int nExpr; + KeyInfo *pInfo; + struct ExprList_item *pItem; + sqlite3 *db = pParse->db; + int i; + + nExpr = pList->nExpr; + pInfo = sqlite3KeyInfoAlloc(db, nExpr-iStart, nExtra+1); + if( pInfo ){ + assert( sqlite3KeyInfoIsWriteable(pInfo) ); + for(i=iStart, pItem=pList->a+iStart; ipExpr); + if( !pColl ) pColl = db->pDfltColl; + pInfo->aColl[i-iStart] = pColl; + pInfo->aSortOrder[i-iStart] = pItem->sortOrder; + } + } + return pInfo; +} + +/* +** Name of the connection operator, used for error messages. +*/ +static const char *selectOpName(int id){ + char *z; + switch( id ){ + case TK_ALL: z = "UNION ALL"; break; + case TK_INTERSECT: z = "INTERSECT"; break; + case TK_EXCEPT: z = "EXCEPT"; break; + default: z = "UNION"; break; + } + return z; +} + +#ifndef SQLITE_OMIT_EXPLAIN +/* +** Unless an "EXPLAIN QUERY PLAN" command is being processed, this function +** is a no-op. Otherwise, it adds a single row of output to the EQP result, +** where the caption is of the form: +** +** "USE TEMP B-TREE FOR xxx" +** +** where xxx is one of "DISTINCT", "ORDER BY" or "GROUP BY". Exactly which +** is determined by the zUsage argument. +*/ +static void explainTempTable(Parse *pParse, const char *zUsage){ + if( pParse->explain==2 ){ + Vdbe *v = pParse->pVdbe; + char *zMsg = sqlite3MPrintf(pParse->db, "USE TEMP B-TREE FOR %s", zUsage); + sqlite3VdbeAddOp4(v, OP_Explain, pParse->iSelectId, 0, 0, zMsg, P4_DYNAMIC); + } +} + +/* +** Assign expression b to lvalue a. A second, no-op, version of this macro +** is provided when SQLITE_OMIT_EXPLAIN is defined. This allows the code +** in sqlite3Select() to assign values to structure member variables that +** only exist if SQLITE_OMIT_EXPLAIN is not defined without polluting the +** code with #ifndef directives. +*/ +# define explainSetInteger(a, b) a = b + +#else +/* No-op versions of the explainXXX() functions and macros. */ +# define explainTempTable(y,z) +# define explainSetInteger(y,z) +#endif + +#if !defined(SQLITE_OMIT_EXPLAIN) && !defined(SQLITE_OMIT_COMPOUND_SELECT) +/* +** Unless an "EXPLAIN QUERY PLAN" command is being processed, this function +** is a no-op. Otherwise, it adds a single row of output to the EQP result, +** where the caption is of one of the two forms: +** +** "COMPOSITE SUBQUERIES iSub1 and iSub2 (op)" +** "COMPOSITE SUBQUERIES iSub1 and iSub2 USING TEMP B-TREE (op)" +** +** where iSub1 and iSub2 are the integers passed as the corresponding +** function parameters, and op is the text representation of the parameter +** of the same name. The parameter "op" must be one of TK_UNION, TK_EXCEPT, +** TK_INTERSECT or TK_ALL. The first form is used if argument bUseTmp is +** false, or the second form if it is true. +*/ +static void explainComposite( + Parse *pParse, /* Parse context */ + int op, /* One of TK_UNION, TK_EXCEPT etc. */ + int iSub1, /* Subquery id 1 */ + int iSub2, /* Subquery id 2 */ + int bUseTmp /* True if a temp table was used */ +){ + assert( op==TK_UNION || op==TK_EXCEPT || op==TK_INTERSECT || op==TK_ALL ); + if( pParse->explain==2 ){ + Vdbe *v = pParse->pVdbe; + char *zMsg = sqlite3MPrintf( + pParse->db, "COMPOUND SUBQUERIES %d AND %d %s(%s)", iSub1, iSub2, + bUseTmp?"USING TEMP B-TREE ":"", selectOpName(op) + ); + sqlite3VdbeAddOp4(v, OP_Explain, pParse->iSelectId, 0, 0, zMsg, P4_DYNAMIC); + } +} +#else +/* No-op versions of the explainXXX() functions and macros. */ +# define explainComposite(v,w,x,y,z) +#endif + +/* +** If the inner loop was generated using a non-null pOrderBy argument, +** then the results were placed in a sorter. After the loop is terminated +** we need to run the sorter and output the results. The following +** routine generates the code needed to do that. +*/ +static void generateSortTail( + Parse *pParse, /* Parsing context */ + Select *p, /* The SELECT statement */ + SortCtx *pSort, /* Information on the ORDER BY clause */ + int nColumn, /* Number of columns of data */ + SelectDest *pDest /* Write the sorted results here */ +){ + Vdbe *v = pParse->pVdbe; /* The prepared statement */ + int addrBreak = pSort->labelDone; /* Jump here to exit loop */ + int addrContinue = sqlite3VdbeMakeLabel(v); /* Jump here for next cycle */ + int addr; + int addrOnce = 0; + int iTab; + ExprList *pOrderBy = pSort->pOrderBy; + int eDest = pDest->eDest; + int iParm = pDest->iSDParm; + int regRow; + int regRowid; + int nKey; + int iSortTab; /* Sorter cursor to read from */ + int nSortData; /* Trailing values to read from sorter */ + int i; + int bSeq; /* True if sorter record includes seq. no. */ +#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS + struct ExprList_item *aOutEx = p->pEList->a; +#endif + + assert( addrBreak<0 ); + if( pSort->labelBkOut ){ + sqlite3VdbeAddOp2(v, OP_Gosub, pSort->regReturn, pSort->labelBkOut); + sqlite3VdbeGoto(v, addrBreak); + sqlite3VdbeResolveLabel(v, pSort->labelBkOut); + } + iTab = pSort->iECursor; + if( eDest==SRT_Output || eDest==SRT_Coroutine || eDest==SRT_Mem ){ + regRowid = 0; + regRow = pDest->iSdst; + nSortData = nColumn; + }else{ + regRowid = sqlite3GetTempReg(pParse); + regRow = sqlite3GetTempRange(pParse, nColumn); + nSortData = nColumn; + } + nKey = pOrderBy->nExpr - pSort->nOBSat; + if( pSort->sortFlags & SORTFLAG_UseSorter ){ + int regSortOut = ++pParse->nMem; + iSortTab = pParse->nTab++; + if( pSort->labelBkOut ){ + addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); + } + sqlite3VdbeAddOp3(v, OP_OpenPseudo, iSortTab, regSortOut, nKey+1+nSortData); + if( addrOnce ) sqlite3VdbeJumpHere(v, addrOnce); + addr = 1 + sqlite3VdbeAddOp2(v, OP_SorterSort, iTab, addrBreak); + VdbeCoverage(v); + codeOffset(v, p->iOffset, addrContinue); + sqlite3VdbeAddOp3(v, OP_SorterData, iTab, regSortOut, iSortTab); + bSeq = 0; + }else{ + addr = 1 + sqlite3VdbeAddOp2(v, OP_Sort, iTab, addrBreak); VdbeCoverage(v); + codeOffset(v, p->iOffset, addrContinue); + iSortTab = iTab; + bSeq = 1; + } + for(i=0; izAffSdst) ); + sqlite3VdbeAddOp4(v, OP_MakeRecord, regRow, nColumn, regRowid, + pDest->zAffSdst, nColumn); + sqlite3ExprCacheAffinityChange(pParse, regRow, nColumn); + sqlite3VdbeAddOp2(v, OP_IdxInsert, iParm, regRowid); + break; + } + case SRT_Mem: { + /* The LIMIT clause will terminate the loop for us */ + break; + } +#endif + default: { + assert( eDest==SRT_Output || eDest==SRT_Coroutine ); + testcase( eDest==SRT_Output ); + testcase( eDest==SRT_Coroutine ); + if( eDest==SRT_Output ){ + sqlite3VdbeAddOp2(v, OP_ResultRow, pDest->iSdst, nColumn); + sqlite3ExprCacheAffinityChange(pParse, pDest->iSdst, nColumn); + }else{ + sqlite3VdbeAddOp1(v, OP_Yield, pDest->iSDParm); + } + break; + } + } + if( regRowid ){ + if( eDest==SRT_Set ){ + sqlite3ReleaseTempRange(pParse, regRow, nColumn); + }else{ + sqlite3ReleaseTempReg(pParse, regRow); + } + sqlite3ReleaseTempReg(pParse, regRowid); + } + /* The bottom of the loop + */ + sqlite3VdbeResolveLabel(v, addrContinue); + if( pSort->sortFlags & SORTFLAG_UseSorter ){ + sqlite3VdbeAddOp2(v, OP_SorterNext, iTab, addr); VdbeCoverage(v); + }else{ + sqlite3VdbeAddOp2(v, OP_Next, iTab, addr); VdbeCoverage(v); + } + if( pSort->regReturn ) sqlite3VdbeAddOp1(v, OP_Return, pSort->regReturn); + sqlite3VdbeResolveLabel(v, addrBreak); +} + +/* +** Return a pointer to a string containing the 'declaration type' of the +** expression pExpr. The string may be treated as static by the caller. +** +** Also try to estimate the size of the returned value and return that +** result in *pEstWidth. +** +** The declaration type is the exact datatype definition extracted from the +** original CREATE TABLE statement if the expression is a column. The +** declaration type for a ROWID field is INTEGER. Exactly when an expression +** is considered a column can be complex in the presence of subqueries. The +** result-set expression in all of the following SELECT statements is +** considered a column by this function. +** +** SELECT col FROM tbl; +** SELECT (SELECT col FROM tbl; +** SELECT (SELECT col FROM tbl); +** SELECT abc FROM (SELECT col AS abc FROM tbl); +** +** The declaration type for any expression other than a column is NULL. +** +** This routine has either 3 or 6 parameters depending on whether or not +** the SQLITE_ENABLE_COLUMN_METADATA compile-time option is used. +*/ +#ifdef SQLITE_ENABLE_COLUMN_METADATA +# define columnType(A,B,C,D,E,F) columnTypeImpl(A,B,C,D,E,F) +#else /* if !defined(SQLITE_ENABLE_COLUMN_METADATA) */ +# define columnType(A,B,C,D,E,F) columnTypeImpl(A,B,F) +#endif +static const char *columnTypeImpl( + NameContext *pNC, + Expr *pExpr, +#ifdef SQLITE_ENABLE_COLUMN_METADATA + const char **pzOrigDb, + const char **pzOrigTab, + const char **pzOrigCol, +#endif + u8 *pEstWidth +){ + char const *zType = 0; + int j; + u8 estWidth = 1; +#ifdef SQLITE_ENABLE_COLUMN_METADATA + char const *zOrigDb = 0; + char const *zOrigTab = 0; + char const *zOrigCol = 0; +#endif + + assert( pExpr!=0 ); + assert( pNC->pSrcList!=0 ); + switch( pExpr->op ){ + case TK_AGG_COLUMN: + case TK_COLUMN: { + /* The expression is a column. Locate the table the column is being + ** extracted from in NameContext.pSrcList. This table may be real + ** database table or a subquery. + */ + Table *pTab = 0; /* Table structure column is extracted from */ + Select *pS = 0; /* Select the column is extracted from */ + int iCol = pExpr->iColumn; /* Index of column in pTab */ + testcase( pExpr->op==TK_AGG_COLUMN ); + testcase( pExpr->op==TK_COLUMN ); + while( pNC && !pTab ){ + SrcList *pTabList = pNC->pSrcList; + for(j=0;jnSrc && pTabList->a[j].iCursor!=pExpr->iTable;j++); + if( jnSrc ){ + pTab = pTabList->a[j].pTab; + pS = pTabList->a[j].pSelect; + }else{ + pNC = pNC->pNext; + } + } + + if( pTab==0 ){ + /* At one time, code such as "SELECT new.x" within a trigger would + ** cause this condition to run. Since then, we have restructured how + ** trigger code is generated and so this condition is no longer + ** possible. However, it can still be true for statements like + ** the following: + ** + ** CREATE TABLE t1(col INTEGER); + ** SELECT (SELECT t1.col) FROM FROM t1; + ** + ** when columnType() is called on the expression "t1.col" in the + ** sub-select. In this case, set the column type to NULL, even + ** though it should really be "INTEGER". + ** + ** This is not a problem, as the column type of "t1.col" is never + ** used. When columnType() is called on the expression + ** "(SELECT t1.col)", the correct type is returned (see the TK_SELECT + ** branch below. */ + break; + } + + assert( pTab && pExpr->pTab==pTab ); + if( pS ){ + /* The "table" is actually a sub-select or a view in the FROM clause + ** of the SELECT statement. Return the declaration type and origin + ** data for the result-set column of the sub-select. + */ + 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. + ** + ** The ALWAYS() is because iCol>=pS->pEList->nExpr will have been + ** caught already by name resolution. + */ + NameContext sNC; + Expr *p = pS->pEList->a[iCol].pExpr; + sNC.pSrcList = pS->pSrc; + sNC.pNext = pNC; + sNC.pParse = pNC->pParse; + zType = columnType(&sNC, p,&zOrigDb,&zOrigTab,&zOrigCol, &estWidth); + } + }else if( pTab->pSchema ){ + /* A real table */ + assert( !pS ); + if( iCol<0 ) iCol = pTab->iPKey; + assert( iCol==-1 || (iCol>=0 && iColnCol) ); +#ifdef SQLITE_ENABLE_COLUMN_METADATA + if( iCol<0 ){ + zType = "INTEGER"; + zOrigCol = "rowid"; + }else{ + zOrigCol = pTab->aCol[iCol].zName; + zType = sqlite3ColumnType(&pTab->aCol[iCol],0); + estWidth = pTab->aCol[iCol].szEst; + } + zOrigTab = pTab->zName; + if( pNC->pParse ){ + int iDb = sqlite3SchemaToIndex(pNC->pParse->db, pTab->pSchema); + zOrigDb = pNC->pParse->db->aDb[iDb].zDbSName; + } +#else + if( iCol<0 ){ + zType = "INTEGER"; + }else{ + zType = sqlite3ColumnType(&pTab->aCol[iCol],0); + estWidth = pTab->aCol[iCol].szEst; + } +#endif + } + break; + } +#ifndef SQLITE_OMIT_SUBQUERY + case TK_SELECT: { + /* The expression is a sub-select. Return the declaration type and + ** origin info for the single column in the result set of the SELECT + ** statement. + */ + NameContext sNC; + Select *pS = pExpr->x.pSelect; + Expr *p = pS->pEList->a[0].pExpr; + assert( ExprHasProperty(pExpr, EP_xIsSelect) ); + sNC.pSrcList = pS->pSrc; + sNC.pNext = pNC; + sNC.pParse = pNC->pParse; + zType = columnType(&sNC, p, &zOrigDb, &zOrigTab, &zOrigCol, &estWidth); + break; + } +#endif + } + +#ifdef SQLITE_ENABLE_COLUMN_METADATA + if( pzOrigDb ){ + assert( pzOrigTab && pzOrigCol ); + *pzOrigDb = zOrigDb; + *pzOrigTab = zOrigTab; + *pzOrigCol = zOrigCol; + } +#endif + if( pEstWidth ) *pEstWidth = estWidth; + return zType; +} + +/* +** Generate code that will tell the VDBE the declaration types of columns +** in the result set. +*/ +static void generateColumnTypes( + Parse *pParse, /* Parser context */ + SrcList *pTabList, /* List of tables */ + ExprList *pEList /* Expressions defining the result set */ +){ +#ifndef SQLITE_OMIT_DECLTYPE + Vdbe *v = pParse->pVdbe; + int i; + NameContext sNC; + sNC.pSrcList = pTabList; + sNC.pParse = pParse; + for(i=0; inExpr; i++){ + Expr *p = pEList->a[i].pExpr; + const char *zType; +#ifdef SQLITE_ENABLE_COLUMN_METADATA + const char *zOrigDb = 0; + const char *zOrigTab = 0; + const char *zOrigCol = 0; + zType = columnType(&sNC, p, &zOrigDb, &zOrigTab, &zOrigCol, 0); + + /* The vdbe must make its own copy of the column-type and other + ** column specific strings, in case the schema is reset before this + ** virtual machine is deleted. + */ + sqlite3VdbeSetColName(v, i, COLNAME_DATABASE, zOrigDb, SQLITE_TRANSIENT); + sqlite3VdbeSetColName(v, i, COLNAME_TABLE, zOrigTab, SQLITE_TRANSIENT); + sqlite3VdbeSetColName(v, i, COLNAME_COLUMN, zOrigCol, SQLITE_TRANSIENT); +#else + zType = columnType(&sNC, p, 0, 0, 0, 0); +#endif + sqlite3VdbeSetColName(v, i, COLNAME_DECLTYPE, zType, SQLITE_TRANSIENT); + } +#endif /* !defined(SQLITE_OMIT_DECLTYPE) */ +} + +/* +** Generate code that will tell the VDBE the names of columns +** in the result set. This information is used to provide the +** azCol[] values in the callback. +*/ +static void generateColumnNames( + Parse *pParse, /* Parser context */ + SrcList *pTabList, /* List of tables */ + ExprList *pEList /* Expressions defining the result set */ +){ + Vdbe *v = pParse->pVdbe; + int i, j; + sqlite3 *db = pParse->db; + int fullNames, shortNames; + +#ifndef SQLITE_OMIT_EXPLAIN + /* If this is an EXPLAIN, skip this step */ + if( pParse->explain ){ + return; + } +#endif + + if( pParse->colNamesSet || db->mallocFailed ) return; + assert( v!=0 ); + assert( pTabList!=0 ); + pParse->colNamesSet = 1; + fullNames = (db->flags & SQLITE_FullColNames)!=0; + shortNames = (db->flags & SQLITE_ShortColNames)!=0; + sqlite3VdbeSetNumCols(v, pEList->nExpr); + for(i=0; inExpr; i++){ + Expr *p; + p = pEList->a[i].pExpr; + if( NEVER(p==0) ) continue; + if( pEList->a[i].zName ){ + char *zName = pEList->a[i].zName; + sqlite3VdbeSetColName(v, i, COLNAME_NAME, zName, SQLITE_TRANSIENT); + }else if( p->op==TK_COLUMN || p->op==TK_AGG_COLUMN ){ + Table *pTab; + char *zCol; + int iCol = p->iColumn; + for(j=0; ALWAYS(jnSrc); j++){ + if( pTabList->a[j].iCursor==p->iTable ) break; + } + assert( jnSrc ); + pTab = pTabList->a[j].pTab; + if( iCol<0 ) iCol = pTab->iPKey; + assert( iCol==-1 || (iCol>=0 && iColnCol) ); + if( iCol<0 ){ + zCol = "rowid"; + }else{ + zCol = pTab->aCol[iCol].zName; + } + if( !shortNames && !fullNames ){ + sqlite3VdbeSetColName(v, i, COLNAME_NAME, + sqlite3DbStrDup(db, pEList->a[i].zSpan), SQLITE_DYNAMIC); + }else if( fullNames ){ + char *zName = 0; + zName = sqlite3MPrintf(db, "%s.%s", pTab->zName, zCol); + sqlite3VdbeSetColName(v, i, COLNAME_NAME, zName, SQLITE_DYNAMIC); + }else{ + sqlite3VdbeSetColName(v, i, COLNAME_NAME, zCol, SQLITE_TRANSIENT); + } + }else{ + const char *z = pEList->a[i].zSpan; + z = z==0 ? sqlite3MPrintf(db, "column%d", i+1) : sqlite3DbStrDup(db, z); + sqlite3VdbeSetColName(v, i, COLNAME_NAME, z, SQLITE_DYNAMIC); + } + } + generateColumnTypes(pParse, pTabList, pEList); +} + +/* +** Given an expression list (which is really the list of expressions +** that form the result set of a SELECT statement) compute appropriate +** column names for a table that would hold the expression list. +** +** All column names will be unique. +** +** Only the column names are computed. Column.zType, Column.zColl, +** and other fields of Column are zeroed. +** +** Return SQLITE_OK on success. If a memory allocation error occurs, +** store NULL in *paCol and 0 in *pnCol and return SQLITE_NOMEM. +*/ +SQLITE_PRIVATE int sqlite3ColumnsFromExprList( + Parse *pParse, /* Parsing context */ + ExprList *pEList, /* Expr list from which to derive column names */ + i16 *pnCol, /* Write the number of columns here */ + Column **paCol /* Write the new column list here */ +){ + sqlite3 *db = pParse->db; /* Database connection */ + int i, j; /* Loop counters */ + u32 cnt; /* Index added to make the name unique */ + Column *aCol, *pCol; /* For looping over result columns */ + int nCol; /* Number of columns in the result set */ + Expr *p; /* Expression for a single result column */ + char *zName; /* Column name */ + int nName; /* Size of name in zName[] */ + Hash ht; /* Hash table of column names */ + + sqlite3HashInit(&ht); + if( pEList ){ + nCol = pEList->nExpr; + aCol = sqlite3DbMallocZero(db, sizeof(aCol[0])*nCol); + testcase( aCol==0 ); + }else{ + nCol = 0; + aCol = 0; + } + assert( nCol==(i16)nCol ); + *pnCol = nCol; + *paCol = aCol; + + for(i=0, pCol=aCol; imallocFailed; i++, pCol++){ + /* Get an appropriate name for the column + */ + p = sqlite3ExprSkipCollate(pEList->a[i].pExpr); + if( (zName = pEList->a[i].zName)!=0 ){ + /* If the column contains an "AS " phrase, use as the name */ + }else{ + Expr *pColExpr = p; /* The expression that is the result column name */ + Table *pTab; /* Table associated with this expression */ + while( pColExpr->op==TK_DOT ){ + pColExpr = pColExpr->pRight; + assert( pColExpr!=0 ); + } + if( pColExpr->op==TK_COLUMN && ALWAYS(pColExpr->pTab!=0) ){ + /* For columns use the column name name */ + int iCol = pColExpr->iColumn; + pTab = pColExpr->pTab; + if( iCol<0 ) iCol = pTab->iPKey; + zName = iCol>=0 ? pTab->aCol[iCol].zName : "rowid"; + }else if( pColExpr->op==TK_ID ){ + assert( !ExprHasProperty(pColExpr, EP_IntValue) ); + zName = pColExpr->u.zToken; + }else{ + /* Use the original text of the column expression as its name */ + zName = pEList->a[i].zSpan; + } + } + zName = sqlite3MPrintf(db, "%s", zName); + + /* Make sure the column name is unique. If the name is not unique, + ** append an integer to the name so that it becomes unique. + */ + cnt = 0; + while( zName && sqlite3HashFind(&ht, zName)!=0 ){ + nName = sqlite3Strlen30(zName); + if( nName>0 ){ + for(j=nName-1; j>0 && sqlite3Isdigit(zName[j]); j--){} + if( zName[j]==':' ) nName = j; + } + zName = sqlite3MPrintf(db, "%.*z:%u", nName, zName, ++cnt); + if( cnt>3 ) sqlite3_randomness(sizeof(cnt), &cnt); + } + pCol->zName = zName; + sqlite3ColumnPropertiesFromName(0, pCol); + if( zName && sqlite3HashInsert(&ht, zName, pCol)==pCol ){ + sqlite3OomFault(db); + } + } + sqlite3HashClear(&ht); + if( db->mallocFailed ){ + for(j=0; jdb; + NameContext sNC; + Column *pCol; + CollSeq *pColl; + int i; + Expr *p; + struct ExprList_item *a; + u64 szAll = 0; + + assert( pSelect!=0 ); + assert( (pSelect->selFlags & SF_Resolved)!=0 ); + assert( pTab->nCol==pSelect->pEList->nExpr || db->mallocFailed ); + if( db->mallocFailed ) return; + memset(&sNC, 0, sizeof(sNC)); + sNC.pSrcList = pSelect->pSrc; + a = pSelect->pEList->a; + for(i=0, pCol=pTab->aCol; inCol; i++, pCol++){ + const char *zType; + int n, m; + p = a[i].pExpr; + zType = columnType(&sNC, p, 0, 0, 0, &pCol->szEst); + szAll += pCol->szEst; + pCol->affinity = sqlite3ExprAffinity(p); + if( zType && (m = sqlite3Strlen30(zType))>0 ){ + n = sqlite3Strlen30(pCol->zName); + pCol->zName = sqlite3DbReallocOrFree(db, pCol->zName, n+m+2); + if( pCol->zName ){ + memcpy(&pCol->zName[n+1], zType, m+1); + pCol->colFlags |= COLFLAG_HASTYPE; + } + } + if( pCol->affinity==0 ) pCol->affinity = SQLITE_AFF_BLOB; + pColl = sqlite3ExprCollSeq(pParse, p); + if( pColl && pCol->zColl==0 ){ + pCol->zColl = sqlite3DbStrDup(db, pColl->zName); + } + } + pTab->szTabRow = sqlite3LogEst(szAll*4); +} + +/* +** Given a SELECT statement, generate a Table structure that describes +** the result set of that SELECT. +*/ +SQLITE_PRIVATE Table *sqlite3ResultSetOfSelect(Parse *pParse, Select *pSelect){ + Table *pTab; + sqlite3 *db = pParse->db; + int savedFlags; + + savedFlags = db->flags; + db->flags &= ~SQLITE_FullColNames; + db->flags |= SQLITE_ShortColNames; + sqlite3SelectPrep(pParse, pSelect, 0); + if( pParse->nErr ) return 0; + while( pSelect->pPrior ) pSelect = pSelect->pPrior; + db->flags = savedFlags; + pTab = sqlite3DbMallocZero(db, sizeof(Table) ); + if( pTab==0 ){ + return 0; + } + /* The sqlite3ResultSetOfSelect() is only used n contexts where lookaside + ** is disabled */ + assert( db->lookaside.bDisable ); + pTab->nRef = 1; + pTab->zName = 0; + pTab->nRowLogEst = 200; assert( 200==sqlite3LogEst(1048576) ); + sqlite3ColumnsFromExprList(pParse, pSelect->pEList, &pTab->nCol, &pTab->aCol); + sqlite3SelectAddColumnTypeAndCollation(pParse, pTab, pSelect); + pTab->iPKey = -1; + if( db->mallocFailed ){ + sqlite3DeleteTable(db, pTab); + return 0; + } + return pTab; +} + +/* +** Get a VDBE for the given parser context. Create a new one if necessary. +** If an error occurs, return NULL and leave a message in pParse. +*/ +static SQLITE_NOINLINE Vdbe *allocVdbe(Parse *pParse){ + Vdbe *v = pParse->pVdbe = sqlite3VdbeCreate(pParse); + if( v ) sqlite3VdbeAddOp2(v, OP_Init, 0, 1); + if( pParse->pToplevel==0 + && OptimizationEnabled(pParse->db,SQLITE_FactorOutConst) + ){ + pParse->okConstFactor = 1; + } + return v; +} +SQLITE_PRIVATE Vdbe *sqlite3GetVdbe(Parse *pParse){ + Vdbe *v = pParse->pVdbe; + return v ? v : allocVdbe(pParse); +} + + +/* +** Compute the iLimit and iOffset fields of the SELECT based on the +** pLimit and pOffset expressions. pLimit and pOffset hold the expressions +** that appear in the original SQL statement after the LIMIT and OFFSET +** keywords. Or NULL if those keywords are omitted. iLimit and iOffset +** are the integer memory register numbers for counters used to compute +** the limit and offset. If there is no limit and/or offset, then +** iLimit and iOffset are negative. +** +** This routine changes the values of iLimit and iOffset only if +** a limit or offset is defined by pLimit and pOffset. iLimit and +** iOffset should have been preset to appropriate default values (zero) +** prior to calling this routine. +** +** The iOffset register (if it exists) is initialized to the value +** of the OFFSET. The iLimit register is initialized to LIMIT. Register +** iOffset+1 is initialized to LIMIT+OFFSET. +** +** Only if pLimit!=0 or pOffset!=0 do the limit registers get +** redefined. The UNION ALL operator uses this property to force +** the reuse of the same limit and offset registers across multiple +** SELECT statements. +*/ +static void computeLimitRegisters(Parse *pParse, Select *p, int iBreak){ + Vdbe *v = 0; + int iLimit = 0; + int iOffset; + int n; + if( p->iLimit ) return; + + /* + ** "LIMIT -1" always shows all rows. There is some + ** controversy about what the correct behavior should be. + ** The current implementation interprets "LIMIT 0" to mean + ** no rows. + */ + sqlite3ExprCacheClear(pParse); + assert( p->pOffset==0 || p->pLimit!=0 ); + if( p->pLimit ){ + p->iLimit = iLimit = ++pParse->nMem; + v = sqlite3GetVdbe(pParse); + assert( v!=0 ); + if( sqlite3ExprIsInteger(p->pLimit, &n) ){ + sqlite3VdbeAddOp2(v, OP_Integer, n, iLimit); + VdbeComment((v, "LIMIT counter")); + if( n==0 ){ + sqlite3VdbeGoto(v, iBreak); + }else if( n>=0 && p->nSelectRow>sqlite3LogEst((u64)n) ){ + p->nSelectRow = sqlite3LogEst((u64)n); + p->selFlags |= SF_FixedLimit; + } + }else{ + sqlite3ExprCode(pParse, p->pLimit, iLimit); + sqlite3VdbeAddOp1(v, OP_MustBeInt, iLimit); VdbeCoverage(v); + VdbeComment((v, "LIMIT counter")); + sqlite3VdbeAddOp2(v, OP_IfNot, iLimit, iBreak); VdbeCoverage(v); + } + if( p->pOffset ){ + p->iOffset = iOffset = ++pParse->nMem; + pParse->nMem++; /* Allocate an extra register for limit+offset */ + sqlite3ExprCode(pParse, p->pOffset, iOffset); + sqlite3VdbeAddOp1(v, OP_MustBeInt, iOffset); VdbeCoverage(v); + VdbeComment((v, "OFFSET counter")); + sqlite3VdbeAddOp3(v, OP_OffsetLimit, iLimit, iOffset+1, iOffset); + VdbeComment((v, "LIMIT+OFFSET")); + } + } +} + +#ifndef SQLITE_OMIT_COMPOUND_SELECT +/* +** Return the appropriate collating sequence for the iCol-th column of +** the result set for the compound-select statement "p". Return NULL if +** the column has no default collating sequence. +** +** The collating sequence for the compound select is taken from the +** left-most term of the select that has a collating sequence. +*/ +static CollSeq *multiSelectCollSeq(Parse *pParse, Select *p, int iCol){ + CollSeq *pRet; + if( p->pPrior ){ + pRet = multiSelectCollSeq(pParse, p->pPrior, iCol); + }else{ + pRet = 0; + } + assert( iCol>=0 ); + /* iCol must be less than p->pEList->nExpr. Otherwise an error would + ** have been thrown during name resolution and we would not have gotten + ** this far */ + if( pRet==0 && ALWAYS(iColpEList->nExpr) ){ + pRet = sqlite3ExprCollSeq(pParse, p->pEList->a[iCol].pExpr); + } + return pRet; +} + +/* +** The select statement passed as the second parameter is a compound SELECT +** with an ORDER BY clause. This function allocates and returns a KeyInfo +** structure suitable for implementing the ORDER BY. +** +** Space to hold the KeyInfo structure is obtained from malloc. The calling +** function is responsible for ensuring that this structure is eventually +** freed. +*/ +static KeyInfo *multiSelectOrderByKeyInfo(Parse *pParse, Select *p, int nExtra){ + ExprList *pOrderBy = p->pOrderBy; + int nOrderBy = p->pOrderBy->nExpr; + sqlite3 *db = pParse->db; + KeyInfo *pRet = sqlite3KeyInfoAlloc(db, nOrderBy+nExtra, 1); + if( pRet ){ + int i; + for(i=0; ia[i]; + Expr *pTerm = pItem->pExpr; + CollSeq *pColl; + + if( pTerm->flags & EP_Collate ){ + pColl = sqlite3ExprCollSeq(pParse, pTerm); + }else{ + pColl = multiSelectCollSeq(pParse, p, pItem->u.x.iOrderByCol-1); + if( pColl==0 ) pColl = db->pDfltColl; + pOrderBy->a[i].pExpr = + sqlite3ExprAddCollateString(pParse, pTerm, pColl->zName); + } + assert( sqlite3KeyInfoIsWriteable(pRet) ); + pRet->aColl[i] = pColl; + pRet->aSortOrder[i] = pOrderBy->a[i].sortOrder; + } + } + + return pRet; +} + +#ifndef SQLITE_OMIT_CTE +/* +** This routine generates VDBE code to compute the content of a WITH RECURSIVE +** query of the form: +** +** AS ( UNION [ALL] ) +** \___________/ \_______________/ +** p->pPrior p +** +** +** There is exactly one reference to the recursive-table in the FROM clause +** of recursive-query, marked with the SrcList->a[].fg.isRecursive flag. +** +** The setup-query runs once to generate an initial set of rows that go +** into a Queue table. Rows are extracted from the Queue table one by +** one. Each row extracted from Queue is output to pDest. Then the single +** extracted row (now in the iCurrent table) becomes the content of the +** recursive-table for a recursive-query run. The output of the recursive-query +** is added back into the Queue table. Then another row is extracted from Queue +** and the iteration continues until the Queue table is empty. +** +** If the compound query operator is UNION then no duplicate rows are ever +** inserted into the Queue table. The iDistinct table keeps a copy of all rows +** that have ever been inserted into Queue and causes duplicates to be +** discarded. If the operator is UNION ALL, then duplicates are allowed. +** +** If the query has an ORDER BY, then entries in the Queue table are kept in +** ORDER BY order and the first entry is extracted for each cycle. Without +** an ORDER BY, the Queue table is just a FIFO. +** +** If a LIMIT clause is provided, then the iteration stops after LIMIT rows +** have been output to pDest. A LIMIT of zero means to output no rows and a +** negative LIMIT means to output all rows. If there is also an OFFSET clause +** with a positive value, then the first OFFSET outputs are discarded rather +** than being sent to pDest. The LIMIT count does not begin until after OFFSET +** rows have been skipped. +*/ +static void generateWithRecursiveQuery( + Parse *pParse, /* Parsing context */ + Select *p, /* The recursive SELECT to be coded */ + SelectDest *pDest /* What to do with query results */ +){ + SrcList *pSrc = p->pSrc; /* The FROM clause of the recursive query */ + int nCol = p->pEList->nExpr; /* Number of columns in the recursive table */ + Vdbe *v = pParse->pVdbe; /* The prepared statement under construction */ + Select *pSetup = p->pPrior; /* The setup query */ + int addrTop; /* Top of the loop */ + int addrCont, addrBreak; /* CONTINUE and BREAK addresses */ + int iCurrent = 0; /* The Current table */ + int regCurrent; /* Register holding Current table */ + int iQueue; /* The Queue table */ + int iDistinct = 0; /* To ensure unique results if UNION */ + int eDest = SRT_Fifo; /* How to write to Queue */ + SelectDest destQueue; /* SelectDest targetting the Queue table */ + int i; /* Loop counter */ + int rc; /* Result code */ + ExprList *pOrderBy; /* The ORDER BY clause */ + Expr *pLimit, *pOffset; /* Saved LIMIT and OFFSET */ + int regLimit, regOffset; /* Registers used by LIMIT and OFFSET */ + + /* Obtain authorization to do a recursive query */ + if( sqlite3AuthCheck(pParse, SQLITE_RECURSIVE, 0, 0, 0) ) return; + + /* Process the LIMIT and OFFSET clauses, if they exist */ + addrBreak = sqlite3VdbeMakeLabel(v); + computeLimitRegisters(pParse, p, addrBreak); + pLimit = p->pLimit; + pOffset = p->pOffset; + regLimit = p->iLimit; + regOffset = p->iOffset; + p->pLimit = p->pOffset = 0; + p->iLimit = p->iOffset = 0; + pOrderBy = p->pOrderBy; + + /* Locate the cursor number of the Current table */ + for(i=0; ALWAYS(inSrc); i++){ + if( pSrc->a[i].fg.isRecursive ){ + iCurrent = pSrc->a[i].iCursor; + break; + } + } + + /* Allocate cursors numbers for Queue and Distinct. The cursor number for + ** the Distinct table must be exactly one greater than Queue in order + ** for the SRT_DistFifo and SRT_DistQueue destinations to work. */ + iQueue = pParse->nTab++; + if( p->op==TK_UNION ){ + eDest = pOrderBy ? SRT_DistQueue : SRT_DistFifo; + iDistinct = pParse->nTab++; + }else{ + eDest = pOrderBy ? SRT_Queue : SRT_Fifo; + } + sqlite3SelectDestInit(&destQueue, eDest, iQueue); + + /* Allocate cursors for Current, Queue, and Distinct. */ + regCurrent = ++pParse->nMem; + sqlite3VdbeAddOp3(v, OP_OpenPseudo, iCurrent, regCurrent, nCol); + if( pOrderBy ){ + KeyInfo *pKeyInfo = multiSelectOrderByKeyInfo(pParse, p, 1); + sqlite3VdbeAddOp4(v, OP_OpenEphemeral, iQueue, pOrderBy->nExpr+2, 0, + (char*)pKeyInfo, P4_KEYINFO); + destQueue.pOrderBy = pOrderBy; + }else{ + sqlite3VdbeAddOp2(v, OP_OpenEphemeral, iQueue, nCol); + } + VdbeComment((v, "Queue table")); + if( iDistinct ){ + p->addrOpenEphm[0] = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, iDistinct, 0); + p->selFlags |= SF_UsesEphemeral; + } + + /* Detach the ORDER BY clause from the compound SELECT */ + p->pOrderBy = 0; + + /* Store the results of the setup-query in Queue. */ + pSetup->pNext = 0; + rc = sqlite3Select(pParse, pSetup, &destQueue); + pSetup->pNext = p; + if( rc ) goto end_of_recursive_query; + + /* Find the next row in the Queue and output that row */ + addrTop = sqlite3VdbeAddOp2(v, OP_Rewind, iQueue, addrBreak); VdbeCoverage(v); + + /* Transfer the next row in Queue over to Current */ + sqlite3VdbeAddOp1(v, OP_NullRow, iCurrent); /* To reset column cache */ + if( pOrderBy ){ + sqlite3VdbeAddOp3(v, OP_Column, iQueue, pOrderBy->nExpr+1, regCurrent); + }else{ + sqlite3VdbeAddOp2(v, OP_RowData, iQueue, regCurrent); + } + sqlite3VdbeAddOp1(v, OP_Delete, iQueue); + + /* Output the single row in Current */ + addrCont = sqlite3VdbeMakeLabel(v); + codeOffset(v, regOffset, addrCont); + selectInnerLoop(pParse, p, p->pEList, iCurrent, + 0, 0, pDest, addrCont, addrBreak); + if( regLimit ){ + sqlite3VdbeAddOp2(v, OP_DecrJumpZero, regLimit, addrBreak); + VdbeCoverage(v); + } + sqlite3VdbeResolveLabel(v, addrCont); + + /* Execute the recursive SELECT taking the single row in Current as + ** the value for the recursive-table. Store the results in the Queue. + */ + if( p->selFlags & SF_Aggregate ){ + sqlite3ErrorMsg(pParse, "recursive aggregate queries not supported"); + }else{ + p->pPrior = 0; + sqlite3Select(pParse, p, &destQueue); + assert( p->pPrior==0 ); + p->pPrior = pSetup; + } + + /* Keep running the loop until the Queue is empty */ + sqlite3VdbeGoto(v, addrTop); + sqlite3VdbeResolveLabel(v, addrBreak); + +end_of_recursive_query: + sqlite3ExprListDelete(pParse->db, p->pOrderBy); + p->pOrderBy = pOrderBy; + p->pLimit = pLimit; + p->pOffset = pOffset; + return; +} +#endif /* SQLITE_OMIT_CTE */ + +/* Forward references */ +static int multiSelectOrderBy( + Parse *pParse, /* Parsing context */ + Select *p, /* The right-most of SELECTs to be coded */ + SelectDest *pDest /* What to do with query results */ +); + +/* +** Handle the special case of a compound-select that originates from a +** VALUES clause. By handling this as a special case, we avoid deep +** recursion, and thus do not need to enforce the SQLITE_LIMIT_COMPOUND_SELECT +** on a VALUES clause. +** +** Because the Select object originates from a VALUES clause: +** (1) It has no LIMIT or OFFSET +** (2) All terms are UNION ALL +** (3) There is no ORDER BY clause +*/ +static int multiSelectValues( + Parse *pParse, /* Parsing context */ + Select *p, /* The right-most of SELECTs to be coded */ + SelectDest *pDest /* What to do with query results */ +){ + Select *pPrior; + int nRow = 1; + int rc = 0; + assert( p->selFlags & SF_MultiValue ); + do{ + assert( p->selFlags & SF_Values ); + assert( p->op==TK_ALL || (p->op==TK_SELECT && p->pPrior==0) ); + assert( p->pLimit==0 ); + assert( p->pOffset==0 ); + assert( p->pNext==0 || p->pEList->nExpr==p->pNext->pEList->nExpr ); + if( p->pPrior==0 ) break; + assert( p->pPrior->pNext==p ); + p = p->pPrior; + nRow++; + }while(1); + while( p ){ + pPrior = p->pPrior; + p->pPrior = 0; + rc = sqlite3Select(pParse, p, pDest); + p->pPrior = pPrior; + if( rc ) break; + p->nSelectRow = nRow; + p = p->pNext; + } + return rc; +} + +/* +** This routine is called to process a compound query form from +** two or more separate queries using UNION, UNION ALL, EXCEPT, or +** INTERSECT +** +** "p" points to the right-most of the two queries. the query on the +** left is p->pPrior. The left query could also be a compound query +** in which case this routine will be called recursively. +** +** The results of the total query are to be written into a destination +** of type eDest with parameter iParm. +** +** Example 1: Consider a three-way compound SQL statement. +** +** SELECT a FROM t1 UNION SELECT b FROM t2 UNION SELECT c FROM t3 +** +** This statement is parsed up as follows: +** +** SELECT c FROM t3 +** | +** `-----> SELECT b FROM t2 +** | +** `------> SELECT a FROM t1 +** +** The arrows in the diagram above represent the Select.pPrior pointer. +** So if this routine is called with p equal to the t3 query, then +** pPrior will be the t2 query. p->op will be TK_UNION in this case. +** +** Notice that because of the way SQLite parses compound SELECTs, the +** individual selects always group from left to right. +*/ +static int multiSelect( + Parse *pParse, /* Parsing context */ + Select *p, /* The right-most of SELECTs to be coded */ + SelectDest *pDest /* What to do with query results */ +){ + int rc = SQLITE_OK; /* Success code from a subroutine */ + Select *pPrior; /* Another SELECT immediately to our left */ + Vdbe *v; /* Generate code to this VDBE */ + SelectDest dest; /* Alternative data destination */ + Select *pDelete = 0; /* Chain of simple selects to delete */ + sqlite3 *db; /* Database connection */ +#ifndef SQLITE_OMIT_EXPLAIN + int iSub1 = 0; /* EQP id of left-hand query */ + int iSub2 = 0; /* EQP id of right-hand query */ +#endif + + /* Make sure there is no ORDER BY or LIMIT clause on prior SELECTs. Only + ** the last (right-most) SELECT in the series may have an ORDER BY or LIMIT. + */ + assert( p && p->pPrior ); /* Calling function guarantees this much */ + assert( (p->selFlags & SF_Recursive)==0 || p->op==TK_ALL || p->op==TK_UNION ); + db = pParse->db; + pPrior = p->pPrior; + dest = *pDest; + if( pPrior->pOrderBy ){ + sqlite3ErrorMsg(pParse,"ORDER BY clause should come after %s not before", + selectOpName(p->op)); + rc = 1; + goto multi_select_end; + } + if( pPrior->pLimit ){ + sqlite3ErrorMsg(pParse,"LIMIT clause should come after %s not before", + selectOpName(p->op)); + rc = 1; + goto multi_select_end; + } + + v = sqlite3GetVdbe(pParse); + assert( v!=0 ); /* The VDBE already created by calling function */ + + /* Create the destination temporary table if necessary + */ + if( dest.eDest==SRT_EphemTab ){ + assert( p->pEList ); + sqlite3VdbeAddOp2(v, OP_OpenEphemeral, dest.iSDParm, p->pEList->nExpr); + dest.eDest = SRT_Table; + } + + /* Special handling for a compound-select that originates as a VALUES clause. + */ + if( p->selFlags & SF_MultiValue ){ + rc = multiSelectValues(pParse, p, &dest); + goto multi_select_end; + } + + /* Make sure all SELECTs in the statement have the same number of elements + ** in their result sets. + */ + assert( p->pEList && pPrior->pEList ); + assert( p->pEList->nExpr==pPrior->pEList->nExpr ); + +#ifndef SQLITE_OMIT_CTE + if( p->selFlags & SF_Recursive ){ + generateWithRecursiveQuery(pParse, p, &dest); + }else +#endif + + /* Compound SELECTs that have an ORDER BY clause are handled separately. + */ + if( p->pOrderBy ){ + return multiSelectOrderBy(pParse, p, pDest); + }else + + /* Generate code for the left and right SELECT statements. + */ + switch( p->op ){ + case TK_ALL: { + int addr = 0; + int nLimit; + assert( !pPrior->pLimit ); + pPrior->iLimit = p->iLimit; + pPrior->iOffset = p->iOffset; + pPrior->pLimit = p->pLimit; + pPrior->pOffset = p->pOffset; + explainSetInteger(iSub1, pParse->iNextSelectId); + rc = sqlite3Select(pParse, pPrior, &dest); + p->pLimit = 0; + p->pOffset = 0; + if( rc ){ + goto multi_select_end; + } + p->pPrior = 0; + p->iLimit = pPrior->iLimit; + p->iOffset = pPrior->iOffset; + if( p->iLimit ){ + addr = sqlite3VdbeAddOp1(v, OP_IfNot, p->iLimit); VdbeCoverage(v); + VdbeComment((v, "Jump ahead if LIMIT reached")); + if( p->iOffset ){ + sqlite3VdbeAddOp3(v, OP_OffsetLimit, + p->iLimit, p->iOffset+1, p->iOffset); + } + } + explainSetInteger(iSub2, pParse->iNextSelectId); + rc = sqlite3Select(pParse, p, &dest); + testcase( rc!=SQLITE_OK ); + pDelete = p->pPrior; + p->pPrior = pPrior; + p->nSelectRow = sqlite3LogEstAdd(p->nSelectRow, pPrior->nSelectRow); + if( pPrior->pLimit + && sqlite3ExprIsInteger(pPrior->pLimit, &nLimit) + && nLimit>0 && p->nSelectRow > sqlite3LogEst((u64)nLimit) + ){ + p->nSelectRow = sqlite3LogEst((u64)nLimit); + } + if( addr ){ + sqlite3VdbeJumpHere(v, addr); + } + break; + } + case TK_EXCEPT: + case TK_UNION: { + int unionTab; /* Cursor number of the temporary table holding result */ + u8 op = 0; /* One of the SRT_ operations to apply to self */ + int priorOp; /* The SRT_ operation to apply to prior selects */ + Expr *pLimit, *pOffset; /* Saved values of p->nLimit and p->nOffset */ + int addr; + SelectDest uniondest; + + testcase( p->op==TK_EXCEPT ); + testcase( p->op==TK_UNION ); + priorOp = SRT_Union; + if( dest.eDest==priorOp ){ + /* We can reuse a temporary table generated by a SELECT to our + ** right. + */ + assert( p->pLimit==0 ); /* Not allowed on leftward elements */ + assert( p->pOffset==0 ); /* Not allowed on leftward elements */ + unionTab = dest.iSDParm; + }else{ + /* We will need to create our own temporary table to hold the + ** intermediate results. + */ + unionTab = pParse->nTab++; + assert( p->pOrderBy==0 ); + addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, unionTab, 0); + assert( p->addrOpenEphm[0] == -1 ); + p->addrOpenEphm[0] = addr; + findRightmost(p)->selFlags |= SF_UsesEphemeral; + assert( p->pEList ); + } + + /* Code the SELECT statements to our left + */ + assert( !pPrior->pOrderBy ); + sqlite3SelectDestInit(&uniondest, priorOp, unionTab); + explainSetInteger(iSub1, pParse->iNextSelectId); + rc = sqlite3Select(pParse, pPrior, &uniondest); + if( rc ){ + goto multi_select_end; + } + + /* Code the current SELECT statement + */ + if( p->op==TK_EXCEPT ){ + op = SRT_Except; + }else{ + assert( p->op==TK_UNION ); + op = SRT_Union; + } + p->pPrior = 0; + pLimit = p->pLimit; + p->pLimit = 0; + pOffset = p->pOffset; + p->pOffset = 0; + uniondest.eDest = op; + explainSetInteger(iSub2, pParse->iNextSelectId); + rc = sqlite3Select(pParse, p, &uniondest); + testcase( rc!=SQLITE_OK ); + /* Query flattening in sqlite3Select() might refill p->pOrderBy. + ** Be sure to delete p->pOrderBy, therefore, to avoid a memory leak. */ + sqlite3ExprListDelete(db, p->pOrderBy); + pDelete = p->pPrior; + p->pPrior = pPrior; + p->pOrderBy = 0; + if( p->op==TK_UNION ){ + p->nSelectRow = sqlite3LogEstAdd(p->nSelectRow, pPrior->nSelectRow); + } + sqlite3ExprDelete(db, p->pLimit); + p->pLimit = pLimit; + p->pOffset = pOffset; + p->iLimit = 0; + p->iOffset = 0; + + /* Convert the data in the temporary table into whatever form + ** it is that we currently need. + */ + assert( unionTab==dest.iSDParm || dest.eDest!=priorOp ); + if( dest.eDest!=priorOp ){ + int iCont, iBreak, iStart; + assert( p->pEList ); + if( dest.eDest==SRT_Output ){ + Select *pFirst = p; + while( pFirst->pPrior ) pFirst = pFirst->pPrior; + generateColumnNames(pParse, pFirst->pSrc, pFirst->pEList); + } + iBreak = sqlite3VdbeMakeLabel(v); + iCont = sqlite3VdbeMakeLabel(v); + computeLimitRegisters(pParse, p, iBreak); + sqlite3VdbeAddOp2(v, OP_Rewind, unionTab, iBreak); VdbeCoverage(v); + iStart = sqlite3VdbeCurrentAddr(v); + selectInnerLoop(pParse, p, p->pEList, unionTab, + 0, 0, &dest, iCont, iBreak); + sqlite3VdbeResolveLabel(v, iCont); + sqlite3VdbeAddOp2(v, OP_Next, unionTab, iStart); VdbeCoverage(v); + sqlite3VdbeResolveLabel(v, iBreak); + sqlite3VdbeAddOp2(v, OP_Close, unionTab, 0); + } + break; + } + default: assert( p->op==TK_INTERSECT ); { + int tab1, tab2; + int iCont, iBreak, iStart; + Expr *pLimit, *pOffset; + int addr; + SelectDest intersectdest; + int r1; + + /* INTERSECT is different from the others since it requires + ** two temporary tables. Hence it has its own case. Begin + ** by allocating the tables we will need. + */ + tab1 = pParse->nTab++; + tab2 = pParse->nTab++; + assert( p->pOrderBy==0 ); + + addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, tab1, 0); + assert( p->addrOpenEphm[0] == -1 ); + p->addrOpenEphm[0] = addr; + findRightmost(p)->selFlags |= SF_UsesEphemeral; + assert( p->pEList ); + + /* Code the SELECTs to our left into temporary table "tab1". + */ + sqlite3SelectDestInit(&intersectdest, SRT_Union, tab1); + explainSetInteger(iSub1, pParse->iNextSelectId); + rc = sqlite3Select(pParse, pPrior, &intersectdest); + if( rc ){ + goto multi_select_end; + } + + /* Code the current SELECT into temporary table "tab2" + */ + addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, tab2, 0); + assert( p->addrOpenEphm[1] == -1 ); + p->addrOpenEphm[1] = addr; + p->pPrior = 0; + pLimit = p->pLimit; + p->pLimit = 0; + pOffset = p->pOffset; + p->pOffset = 0; + intersectdest.iSDParm = tab2; + explainSetInteger(iSub2, pParse->iNextSelectId); + rc = sqlite3Select(pParse, p, &intersectdest); + testcase( rc!=SQLITE_OK ); + pDelete = p->pPrior; + p->pPrior = pPrior; + if( p->nSelectRow>pPrior->nSelectRow ) p->nSelectRow = pPrior->nSelectRow; + sqlite3ExprDelete(db, p->pLimit); + p->pLimit = pLimit; + p->pOffset = pOffset; + + /* Generate code to take the intersection of the two temporary + ** tables. + */ + assert( p->pEList ); + if( dest.eDest==SRT_Output ){ + Select *pFirst = p; + while( pFirst->pPrior ) pFirst = pFirst->pPrior; + generateColumnNames(pParse, pFirst->pSrc, pFirst->pEList); + } + iBreak = sqlite3VdbeMakeLabel(v); + iCont = sqlite3VdbeMakeLabel(v); + computeLimitRegisters(pParse, p, iBreak); + sqlite3VdbeAddOp2(v, OP_Rewind, tab1, iBreak); VdbeCoverage(v); + r1 = sqlite3GetTempReg(pParse); + iStart = sqlite3VdbeAddOp2(v, OP_RowKey, tab1, r1); + sqlite3VdbeAddOp4Int(v, OP_NotFound, tab2, iCont, r1, 0); VdbeCoverage(v); + sqlite3ReleaseTempReg(pParse, r1); + selectInnerLoop(pParse, p, p->pEList, tab1, + 0, 0, &dest, iCont, iBreak); + sqlite3VdbeResolveLabel(v, iCont); + sqlite3VdbeAddOp2(v, OP_Next, tab1, iStart); VdbeCoverage(v); + sqlite3VdbeResolveLabel(v, iBreak); + sqlite3VdbeAddOp2(v, OP_Close, tab2, 0); + sqlite3VdbeAddOp2(v, OP_Close, tab1, 0); + break; + } + } + + explainComposite(pParse, p->op, iSub1, iSub2, p->op!=TK_ALL); + + /* Compute collating sequences used by + ** temporary tables needed to implement the compound select. + ** Attach the KeyInfo structure to all temporary tables. + ** + ** This section is run by the right-most SELECT statement only. + ** SELECT statements to the left always skip this part. The right-most + ** SELECT might also skip this part if it has no ORDER BY clause and + ** no temp tables are required. + */ + if( p->selFlags & SF_UsesEphemeral ){ + int i; /* Loop counter */ + KeyInfo *pKeyInfo; /* Collating sequence for the result set */ + Select *pLoop; /* For looping through SELECT statements */ + CollSeq **apColl; /* For looping through pKeyInfo->aColl[] */ + int nCol; /* Number of columns in result set */ + + assert( p->pNext==0 ); + nCol = p->pEList->nExpr; + pKeyInfo = sqlite3KeyInfoAlloc(db, nCol, 1); + if( !pKeyInfo ){ + rc = SQLITE_NOMEM_BKPT; + goto multi_select_end; + } + for(i=0, apColl=pKeyInfo->aColl; ipDfltColl; + } + } + + for(pLoop=p; pLoop; pLoop=pLoop->pPrior){ + for(i=0; i<2; i++){ + int addr = pLoop->addrOpenEphm[i]; + if( addr<0 ){ + /* If [0] is unused then [1] is also unused. So we can + ** always safely abort as soon as the first unused slot is found */ + assert( pLoop->addrOpenEphm[1]<0 ); + break; + } + sqlite3VdbeChangeP2(v, addr, nCol); + sqlite3VdbeChangeP4(v, addr, (char*)sqlite3KeyInfoRef(pKeyInfo), + P4_KEYINFO); + pLoop->addrOpenEphm[i] = -1; + } + } + sqlite3KeyInfoUnref(pKeyInfo); + } + +multi_select_end: + pDest->iSdst = dest.iSdst; + pDest->nSdst = dest.nSdst; + sqlite3SelectDelete(db, pDelete); + return rc; +} +#endif /* SQLITE_OMIT_COMPOUND_SELECT */ + +/* +** Error message for when two or more terms of a compound select have different +** size result sets. +*/ +SQLITE_PRIVATE void sqlite3SelectWrongNumTermsError(Parse *pParse, Select *p){ + if( p->selFlags & SF_Values ){ + sqlite3ErrorMsg(pParse, "all VALUES must have the same number of terms"); + }else{ + sqlite3ErrorMsg(pParse, "SELECTs to the left and right of %s" + " do not have the same number of result columns", selectOpName(p->op)); + } +} + +/* +** Code an output subroutine for a coroutine implementation of a +** SELECT statment. +** +** The data to be output is contained in pIn->iSdst. There are +** pIn->nSdst columns to be output. pDest is where the output should +** be sent. +** +** regReturn is the number of the register holding the subroutine +** return address. +** +** If regPrev>0 then it is the first register in a vector that +** records the previous output. mem[regPrev] is a flag that is false +** if there has been no previous output. If regPrev>0 then code is +** generated to suppress duplicates. pKeyInfo is used for comparing +** keys. +** +** If the LIMIT found in p->iLimit is reached, jump immediately to +** iBreak. +*/ +static int generateOutputSubroutine( + Parse *pParse, /* Parsing context */ + Select *p, /* The SELECT statement */ + SelectDest *pIn, /* Coroutine supplying data */ + SelectDest *pDest, /* Where to send the data */ + int regReturn, /* The return address register */ + int regPrev, /* Previous result register. No uniqueness if 0 */ + KeyInfo *pKeyInfo, /* For comparing with previous entry */ + int iBreak /* Jump here if we hit the LIMIT */ +){ + Vdbe *v = pParse->pVdbe; + int iContinue; + int addr; + + addr = sqlite3VdbeCurrentAddr(v); + iContinue = sqlite3VdbeMakeLabel(v); + + /* Suppress duplicates for UNION, EXCEPT, and INTERSECT + */ + if( regPrev ){ + int addr1, addr2; + addr1 = sqlite3VdbeAddOp1(v, OP_IfNot, regPrev); VdbeCoverage(v); + addr2 = sqlite3VdbeAddOp4(v, OP_Compare, pIn->iSdst, regPrev+1, pIn->nSdst, + (char*)sqlite3KeyInfoRef(pKeyInfo), P4_KEYINFO); + sqlite3VdbeAddOp3(v, OP_Jump, addr2+2, iContinue, addr2+2); VdbeCoverage(v); + sqlite3VdbeJumpHere(v, addr1); + sqlite3VdbeAddOp3(v, OP_Copy, pIn->iSdst, regPrev+1, pIn->nSdst-1); + sqlite3VdbeAddOp2(v, OP_Integer, 1, regPrev); + } + if( pParse->db->mallocFailed ) return 0; + + /* Suppress the first OFFSET entries if there is an OFFSET clause + */ + codeOffset(v, p->iOffset, iContinue); + + assert( pDest->eDest!=SRT_Exists ); + assert( pDest->eDest!=SRT_Table ); + switch( pDest->eDest ){ + /* Store the result as data using a unique key. + */ + case SRT_EphemTab: { + int r1 = sqlite3GetTempReg(pParse); + int r2 = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp3(v, OP_MakeRecord, pIn->iSdst, pIn->nSdst, r1); + sqlite3VdbeAddOp2(v, OP_NewRowid, pDest->iSDParm, r2); + sqlite3VdbeAddOp3(v, OP_Insert, pDest->iSDParm, r1, r2); + sqlite3VdbeChangeP5(v, OPFLAG_APPEND); + sqlite3ReleaseTempReg(pParse, r2); + sqlite3ReleaseTempReg(pParse, r1); + break; + } + +#ifndef SQLITE_OMIT_SUBQUERY + /* If we are creating a set for an "expr IN (SELECT ...)". + */ + case SRT_Set: { + int r1; + testcase( pIn->nSdst>1 ); + r1 = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp4(v, OP_MakeRecord, pIn->iSdst, pIn->nSdst, + r1, pDest->zAffSdst, pIn->nSdst); + sqlite3ExprCacheAffinityChange(pParse, pIn->iSdst, pIn->nSdst); + sqlite3VdbeAddOp2(v, OP_IdxInsert, pDest->iSDParm, r1); + sqlite3ReleaseTempReg(pParse, r1); + break; + } + + /* If this is a scalar select that is part of an expression, then + ** store the results in the appropriate memory cell and break out + ** of the scan loop. + */ + case SRT_Mem: { + assert( pIn->nSdst==1 || pParse->nErr>0 ); testcase( pIn->nSdst!=1 ); + sqlite3ExprCodeMove(pParse, pIn->iSdst, pDest->iSDParm, 1); + /* The LIMIT clause will jump out of the loop for us */ + break; + } +#endif /* #ifndef SQLITE_OMIT_SUBQUERY */ + + /* The results are stored in a sequence of registers + ** starting at pDest->iSdst. Then the co-routine yields. + */ + case SRT_Coroutine: { + if( pDest->iSdst==0 ){ + pDest->iSdst = sqlite3GetTempRange(pParse, pIn->nSdst); + pDest->nSdst = pIn->nSdst; + } + sqlite3ExprCodeMove(pParse, pIn->iSdst, pDest->iSdst, pIn->nSdst); + sqlite3VdbeAddOp1(v, OP_Yield, pDest->iSDParm); + break; + } + + /* If none of the above, then the result destination must be + ** SRT_Output. This routine is never called with any other + ** destination other than the ones handled above or SRT_Output. + ** + ** For SRT_Output, results are stored in a sequence of registers. + ** Then the OP_ResultRow opcode is used to cause sqlite3_step() to + ** return the next row of result. + */ + default: { + assert( pDest->eDest==SRT_Output ); + sqlite3VdbeAddOp2(v, OP_ResultRow, pIn->iSdst, pIn->nSdst); + sqlite3ExprCacheAffinityChange(pParse, pIn->iSdst, pIn->nSdst); + break; + } + } + + /* Jump to the end of the loop if the LIMIT is reached. + */ + if( p->iLimit ){ + sqlite3VdbeAddOp2(v, OP_DecrJumpZero, p->iLimit, iBreak); VdbeCoverage(v); + } + + /* Generate the subroutine return + */ + sqlite3VdbeResolveLabel(v, iContinue); + sqlite3VdbeAddOp1(v, OP_Return, regReturn); + + return addr; +} + +/* +** Alternative compound select code generator for cases when there +** is an ORDER BY clause. +** +** We assume a query of the following form: +** +** ORDER BY +** +** is one of UNION ALL, UNION, EXCEPT, or INTERSECT. The idea +** is to code both and with the ORDER BY clause as +** co-routines. Then run the co-routines in parallel and merge the results +** into the output. In addition to the two coroutines (called selectA and +** selectB) there are 7 subroutines: +** +** outA: Move the output of the selectA coroutine into the output +** of the compound query. +** +** outB: Move the output of the selectB coroutine into the output +** of the compound query. (Only generated for UNION and +** UNION ALL. EXCEPT and INSERTSECT never output a row that +** appears only in B.) +** +** AltB: Called when there is data from both coroutines and AB. +** +** EofA: Called when data is exhausted from selectA. +** +** EofB: Called when data is exhausted from selectB. +** +** The implementation of the latter five subroutines depend on which +** is used: +** +** +** UNION ALL UNION EXCEPT INTERSECT +** ------------- ----------------- -------------- ----------------- +** AltB: outA, nextA outA, nextA outA, nextA nextA +** +** AeqB: outA, nextA nextA nextA outA, nextA +** +** AgtB: outB, nextB outB, nextB nextB nextB +** +** EofA: outB, nextB outB, nextB halt halt +** +** EofB: outA, nextA outA, nextA outA, nextA halt +** +** In the AltB, AeqB, and AgtB subroutines, an EOF on A following nextA +** causes an immediate jump to EofA and an EOF on B following nextB causes +** an immediate jump to EofB. Within EofA and EofB, and EOF on entry or +** following nextX causes a jump to the end of the select processing. +** +** Duplicate removal in the UNION, EXCEPT, and INTERSECT cases is handled +** within the output subroutine. The regPrev register set holds the previously +** output value. A comparison is made against this value and the output +** is skipped if the next results would be the same as the previous. +** +** The implementation plan is to implement the two coroutines and seven +** subroutines first, then put the control logic at the bottom. Like this: +** +** goto Init +** coA: coroutine for left query (A) +** coB: coroutine for right query (B) +** outA: output one row of A +** outB: output one row of B (UNION and UNION ALL only) +** EofA: ... +** EofB: ... +** AltB: ... +** AeqB: ... +** AgtB: ... +** Init: initialize coroutine registers +** yield coA +** if eof(A) goto EofA +** yield coB +** if eof(B) goto EofB +** Cmpr: Compare A, B +** Jump AltB, AeqB, AgtB +** End: ... +** +** We call AltB, AeqB, AgtB, EofA, and EofB "subroutines" but they are not +** actually called using Gosub and they do not Return. EofA and EofB loop +** until all data is exhausted then jump to the "end" labe. AltB, AeqB, +** and AgtB jump to either L2 or to one of EofA or EofB. +*/ +#ifndef SQLITE_OMIT_COMPOUND_SELECT +static int multiSelectOrderBy( + Parse *pParse, /* Parsing context */ + Select *p, /* The right-most of SELECTs to be coded */ + SelectDest *pDest /* What to do with query results */ +){ + int i, j; /* Loop counters */ + Select *pPrior; /* Another SELECT immediately to our left */ + Vdbe *v; /* Generate code to this VDBE */ + SelectDest destA; /* Destination for coroutine A */ + SelectDest destB; /* Destination for coroutine B */ + int regAddrA; /* Address register for select-A coroutine */ + int regAddrB; /* Address register for select-B coroutine */ + int addrSelectA; /* Address of the select-A coroutine */ + int addrSelectB; /* Address of the select-B coroutine */ + int regOutA; /* Address register for the output-A subroutine */ + int regOutB; /* Address register for the output-B subroutine */ + int addrOutA; /* Address of the output-A subroutine */ + int addrOutB = 0; /* Address of the output-B subroutine */ + int addrEofA; /* Address of the select-A-exhausted subroutine */ + int addrEofA_noB; /* Alternate addrEofA if B is uninitialized */ + int addrEofB; /* Address of the select-B-exhausted subroutine */ + int addrAltB; /* Address of the AB subroutine */ + int regLimitA; /* Limit register for select-A */ + int regLimitB; /* Limit register for select-A */ + int regPrev; /* A range of registers to hold previous output */ + int savedLimit; /* Saved value of p->iLimit */ + int savedOffset; /* Saved value of p->iOffset */ + int labelCmpr; /* Label for the start of the merge algorithm */ + int labelEnd; /* Label for the end of the overall SELECT stmt */ + int addr1; /* Jump instructions that get retargetted */ + int op; /* One of TK_ALL, TK_UNION, TK_EXCEPT, TK_INTERSECT */ + KeyInfo *pKeyDup = 0; /* Comparison information for duplicate removal */ + KeyInfo *pKeyMerge; /* Comparison information for merging rows */ + sqlite3 *db; /* Database connection */ + ExprList *pOrderBy; /* The ORDER BY clause */ + int nOrderBy; /* Number of terms in the ORDER BY clause */ + int *aPermute; /* Mapping from ORDER BY terms to result set columns */ +#ifndef SQLITE_OMIT_EXPLAIN + int iSub1; /* EQP id of left-hand query */ + int iSub2; /* EQP id of right-hand query */ +#endif + + assert( p->pOrderBy!=0 ); + assert( pKeyDup==0 ); /* "Managed" code needs this. Ticket #3382. */ + db = pParse->db; + v = pParse->pVdbe; + assert( v!=0 ); /* Already thrown the error if VDBE alloc failed */ + labelEnd = sqlite3VdbeMakeLabel(v); + labelCmpr = sqlite3VdbeMakeLabel(v); + + + /* Patch up the ORDER BY clause + */ + op = p->op; + pPrior = p->pPrior; + assert( pPrior->pOrderBy==0 ); + pOrderBy = p->pOrderBy; + assert( pOrderBy ); + nOrderBy = pOrderBy->nExpr; + + /* For operators other than UNION ALL we have to make sure that + ** the ORDER BY clause covers every term of the result set. Add + ** terms to the ORDER BY clause as necessary. + */ + if( op!=TK_ALL ){ + for(i=1; db->mallocFailed==0 && i<=p->pEList->nExpr; i++){ + struct ExprList_item *pItem; + for(j=0, pItem=pOrderBy->a; ju.x.iOrderByCol>0 ); + if( pItem->u.x.iOrderByCol==i ) break; + } + if( j==nOrderBy ){ + Expr *pNew = sqlite3Expr(db, TK_INTEGER, 0); + if( pNew==0 ) return SQLITE_NOMEM_BKPT; + pNew->flags |= EP_IntValue; + pNew->u.iValue = i; + pOrderBy = sqlite3ExprListAppend(pParse, pOrderBy, pNew); + if( pOrderBy ) pOrderBy->a[nOrderBy++].u.x.iOrderByCol = (u16)i; + } + } + } + + /* Compute the comparison permutation and keyinfo that is used with + ** the permutation used to determine if the next + ** row of results comes from selectA or selectB. Also add explicit + ** collations to the ORDER BY clause terms so that when the subqueries + ** to the right and the left are evaluated, they use the correct + ** collation. + */ + aPermute = sqlite3DbMallocRawNN(db, sizeof(int)*(nOrderBy + 1)); + if( aPermute ){ + struct ExprList_item *pItem; + aPermute[0] = nOrderBy; + for(i=1, pItem=pOrderBy->a; i<=nOrderBy; i++, pItem++){ + assert( pItem->u.x.iOrderByCol>0 ); + assert( pItem->u.x.iOrderByCol<=p->pEList->nExpr ); + aPermute[i] = pItem->u.x.iOrderByCol - 1; + } + pKeyMerge = multiSelectOrderByKeyInfo(pParse, p, 1); + }else{ + pKeyMerge = 0; + } + + /* Reattach the ORDER BY clause to the query. + */ + p->pOrderBy = pOrderBy; + pPrior->pOrderBy = sqlite3ExprListDup(pParse->db, pOrderBy, 0); + + /* Allocate a range of temporary registers and the KeyInfo needed + ** for the logic that removes duplicate result rows when the + ** operator is UNION, EXCEPT, or INTERSECT (but not UNION ALL). + */ + if( op==TK_ALL ){ + regPrev = 0; + }else{ + int nExpr = p->pEList->nExpr; + assert( nOrderBy>=nExpr || db->mallocFailed ); + regPrev = pParse->nMem+1; + pParse->nMem += nExpr+1; + sqlite3VdbeAddOp2(v, OP_Integer, 0, regPrev); + pKeyDup = sqlite3KeyInfoAlloc(db, nExpr, 1); + if( pKeyDup ){ + assert( sqlite3KeyInfoIsWriteable(pKeyDup) ); + for(i=0; iaColl[i] = multiSelectCollSeq(pParse, p, i); + pKeyDup->aSortOrder[i] = 0; + } + } + } + + /* Separate the left and the right query from one another + */ + p->pPrior = 0; + pPrior->pNext = 0; + sqlite3ResolveOrderGroupBy(pParse, p, p->pOrderBy, "ORDER"); + if( pPrior->pPrior==0 ){ + sqlite3ResolveOrderGroupBy(pParse, pPrior, pPrior->pOrderBy, "ORDER"); + } + + /* Compute the limit registers */ + computeLimitRegisters(pParse, p, labelEnd); + if( p->iLimit && op==TK_ALL ){ + regLimitA = ++pParse->nMem; + regLimitB = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Copy, p->iOffset ? p->iOffset+1 : p->iLimit, + regLimitA); + sqlite3VdbeAddOp2(v, OP_Copy, regLimitA, regLimitB); + }else{ + regLimitA = regLimitB = 0; + } + sqlite3ExprDelete(db, p->pLimit); + p->pLimit = 0; + sqlite3ExprDelete(db, p->pOffset); + p->pOffset = 0; + + regAddrA = ++pParse->nMem; + regAddrB = ++pParse->nMem; + regOutA = ++pParse->nMem; + regOutB = ++pParse->nMem; + sqlite3SelectDestInit(&destA, SRT_Coroutine, regAddrA); + sqlite3SelectDestInit(&destB, SRT_Coroutine, regAddrB); + + /* Generate a coroutine to evaluate the SELECT statement to the + ** left of the compound operator - the "A" select. + */ + addrSelectA = sqlite3VdbeCurrentAddr(v) + 1; + addr1 = sqlite3VdbeAddOp3(v, OP_InitCoroutine, regAddrA, 0, addrSelectA); + VdbeComment((v, "left SELECT")); + pPrior->iLimit = regLimitA; + explainSetInteger(iSub1, pParse->iNextSelectId); + sqlite3Select(pParse, pPrior, &destA); + sqlite3VdbeEndCoroutine(v, regAddrA); + sqlite3VdbeJumpHere(v, addr1); + + /* Generate a coroutine to evaluate the SELECT statement on + ** the right - the "B" select + */ + addrSelectB = sqlite3VdbeCurrentAddr(v) + 1; + addr1 = sqlite3VdbeAddOp3(v, OP_InitCoroutine, regAddrB, 0, addrSelectB); + VdbeComment((v, "right SELECT")); + savedLimit = p->iLimit; + savedOffset = p->iOffset; + p->iLimit = regLimitB; + p->iOffset = 0; + explainSetInteger(iSub2, pParse->iNextSelectId); + sqlite3Select(pParse, p, &destB); + p->iLimit = savedLimit; + p->iOffset = savedOffset; + sqlite3VdbeEndCoroutine(v, regAddrB); + + /* Generate a subroutine that outputs the current row of the A + ** select as the next output row of the compound select. + */ + VdbeNoopComment((v, "Output routine for A")); + addrOutA = generateOutputSubroutine(pParse, + p, &destA, pDest, regOutA, + regPrev, pKeyDup, labelEnd); + + /* Generate a subroutine that outputs the current row of the B + ** select as the next output row of the compound select. + */ + if( op==TK_ALL || op==TK_UNION ){ + VdbeNoopComment((v, "Output routine for B")); + addrOutB = generateOutputSubroutine(pParse, + p, &destB, pDest, regOutB, + regPrev, pKeyDup, labelEnd); + } + sqlite3KeyInfoUnref(pKeyDup); + + /* Generate a subroutine to run when the results from select A + ** are exhausted and only data in select B remains. + */ + if( op==TK_EXCEPT || op==TK_INTERSECT ){ + addrEofA_noB = addrEofA = labelEnd; + }else{ + VdbeNoopComment((v, "eof-A subroutine")); + addrEofA = sqlite3VdbeAddOp2(v, OP_Gosub, regOutB, addrOutB); + addrEofA_noB = sqlite3VdbeAddOp2(v, OP_Yield, regAddrB, labelEnd); + VdbeCoverage(v); + sqlite3VdbeGoto(v, addrEofA); + p->nSelectRow = sqlite3LogEstAdd(p->nSelectRow, pPrior->nSelectRow); + } + + /* Generate a subroutine to run when the results from select B + ** are exhausted and only data in select A remains. + */ + if( op==TK_INTERSECT ){ + addrEofB = addrEofA; + if( p->nSelectRow > pPrior->nSelectRow ) p->nSelectRow = pPrior->nSelectRow; + }else{ + VdbeNoopComment((v, "eof-B subroutine")); + addrEofB = sqlite3VdbeAddOp2(v, OP_Gosub, regOutA, addrOutA); + sqlite3VdbeAddOp2(v, OP_Yield, regAddrA, labelEnd); VdbeCoverage(v); + sqlite3VdbeGoto(v, addrEofB); + } + + /* Generate code to handle the case of AB + */ + VdbeNoopComment((v, "A-gt-B subroutine")); + addrAgtB = sqlite3VdbeCurrentAddr(v); + if( op==TK_ALL || op==TK_UNION ){ + sqlite3VdbeAddOp2(v, OP_Gosub, regOutB, addrOutB); + } + sqlite3VdbeAddOp2(v, OP_Yield, regAddrB, addrEofB); VdbeCoverage(v); + sqlite3VdbeGoto(v, labelCmpr); + + /* This code runs once to initialize everything. + */ + sqlite3VdbeJumpHere(v, addr1); + sqlite3VdbeAddOp2(v, OP_Yield, regAddrA, addrEofA_noB); VdbeCoverage(v); + sqlite3VdbeAddOp2(v, OP_Yield, regAddrB, addrEofB); VdbeCoverage(v); + + /* Implement the main merge loop + */ + sqlite3VdbeResolveLabel(v, labelCmpr); + sqlite3VdbeAddOp4(v, OP_Permutation, 0, 0, 0, (char*)aPermute, P4_INTARRAY); + sqlite3VdbeAddOp4(v, OP_Compare, destA.iSdst, destB.iSdst, nOrderBy, + (char*)pKeyMerge, P4_KEYINFO); + sqlite3VdbeChangeP5(v, OPFLAG_PERMUTE); + sqlite3VdbeAddOp3(v, OP_Jump, addrAltB, addrAeqB, addrAgtB); VdbeCoverage(v); + + /* Jump to the this point in order to terminate the query. + */ + sqlite3VdbeResolveLabel(v, labelEnd); + + /* Set the number of output columns + */ + if( pDest->eDest==SRT_Output ){ + Select *pFirst = pPrior; + while( pFirst->pPrior ) pFirst = pFirst->pPrior; + generateColumnNames(pParse, pFirst->pSrc, pFirst->pEList); + } + + /* Reassembly the compound query so that it will be freed correctly + ** by the calling function */ + if( p->pPrior ){ + sqlite3SelectDelete(db, p->pPrior); + } + p->pPrior = pPrior; + pPrior->pNext = p; + + /*** TBD: Insert subroutine calls to close cursors on incomplete + **** subqueries ****/ + explainComposite(pParse, p->op, iSub1, iSub2, 0); + return pParse->nErr!=0; +} +#endif + +#if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) +/* Forward Declarations */ +static void substExprList(sqlite3*, ExprList*, int, ExprList*); +static void substSelect(sqlite3*, Select *, int, ExprList*, int); + +/* +** Scan through the expression pExpr. Replace every reference to +** a column in table number iTable with a copy of the iColumn-th +** entry in pEList. (But leave references to the ROWID column +** unchanged.) +** +** This routine is part of the flattening procedure. A subquery +** whose result set is defined by pEList appears as entry in the +** FROM clause of a SELECT such that the VDBE cursor assigned to that +** FORM clause entry is iTable. This routine make the necessary +** changes to pExpr so that it refers directly to the source table +** of the subquery rather the result set of the subquery. +*/ +static Expr *substExpr( + sqlite3 *db, /* Report malloc errors to this connection */ + Expr *pExpr, /* Expr in which substitution occurs */ + int iTable, /* Table to be substituted */ + ExprList *pEList /* Substitute expressions */ +){ + if( pExpr==0 ) return 0; + if( pExpr->op==TK_COLUMN && pExpr->iTable==iTable ){ + if( pExpr->iColumn<0 ){ + pExpr->op = TK_NULL; + }else{ + Expr *pNew; + assert( pEList!=0 && pExpr->iColumnnExpr ); + assert( pExpr->pLeft==0 && pExpr->pRight==0 ); + pNew = sqlite3ExprDup(db, pEList->a[pExpr->iColumn].pExpr, 0); + sqlite3ExprDelete(db, pExpr); + pExpr = pNew; + } + }else{ + pExpr->pLeft = substExpr(db, pExpr->pLeft, iTable, pEList); + pExpr->pRight = substExpr(db, pExpr->pRight, iTable, pEList); + if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + substSelect(db, pExpr->x.pSelect, iTable, pEList, 1); + }else{ + substExprList(db, pExpr->x.pList, iTable, pEList); + } + } + return pExpr; +} +static void substExprList( + sqlite3 *db, /* Report malloc errors here */ + ExprList *pList, /* List to scan and in which to make substitutes */ + int iTable, /* Table to be substituted */ + ExprList *pEList /* Substitute values */ +){ + int i; + if( pList==0 ) return; + for(i=0; inExpr; i++){ + pList->a[i].pExpr = substExpr(db, pList->a[i].pExpr, iTable, pEList); + } +} +static void substSelect( + sqlite3 *db, /* Report malloc errors here */ + Select *p, /* SELECT statement in which to make substitutions */ + int iTable, /* Table to be replaced */ + ExprList *pEList, /* Substitute values */ + int doPrior /* Do substitutes on p->pPrior too */ +){ + SrcList *pSrc; + struct SrcList_item *pItem; + int i; + if( !p ) return; + do{ + substExprList(db, p->pEList, iTable, pEList); + substExprList(db, p->pGroupBy, iTable, pEList); + substExprList(db, p->pOrderBy, iTable, pEList); + p->pHaving = substExpr(db, p->pHaving, iTable, pEList); + p->pWhere = substExpr(db, p->pWhere, iTable, pEList); + pSrc = p->pSrc; + assert( pSrc!=0 ); + for(i=pSrc->nSrc, pItem=pSrc->a; i>0; i--, pItem++){ + substSelect(db, pItem->pSelect, iTable, pEList, 1); + if( pItem->fg.isTabFunc ){ + substExprList(db, pItem->u1.pFuncArg, iTable, pEList); + } + } + }while( doPrior && (p = p->pPrior)!=0 ); +} +#endif /* !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) */ + +#if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) +/* +** This routine attempts to flatten subqueries as a performance optimization. +** This routine returns 1 if it makes changes and 0 if no flattening occurs. +** +** To understand the concept of flattening, consider the following +** query: +** +** SELECT a FROM (SELECT x+y AS a FROM t1 WHERE z<100) WHERE a>5 +** +** The default way of implementing this query is to execute the +** subquery first and store the results in a temporary table, then +** run the outer query on that temporary table. This requires two +** passes over the data. Furthermore, because the temporary table +** has no indices, the WHERE clause on the outer query cannot be +** optimized. +** +** This routine attempts to rewrite queries such as the above into +** a single flat select, like this: +** +** SELECT x+y AS a FROM t1 WHERE z<100 AND a>5 +** +** The code generated for this simplification gives the same result +** but only has to scan the data once. And because indices might +** exist on the table t1, a complete scan of the data might be +** avoided. +** +** Flattening is only attempted if all of the following are true: +** +** (1) The subquery and the outer query do not both use aggregates. +** +** (2) The subquery is not an aggregate or (2a) the outer query is not a join +** and (2b) the outer query does not use subqueries other than the one +** FROM-clause subquery that is a candidate for flattening. (2b is +** due to ticket [2f7170d73bf9abf80] from 2015-02-09.) +** +** (3) The subquery is not the right operand of a left outer join +** (Originally ticket #306. Strengthened by ticket #3300) +** +** (4) The subquery is not DISTINCT. +** +** (**) At one point restrictions (4) and (5) defined a subset of DISTINCT +** sub-queries that were excluded from this optimization. Restriction +** (4) has since been expanded to exclude all DISTINCT subqueries. +** +** (6) The subquery does not use aggregates or the outer query is not +** DISTINCT. +** +** (7) The subquery has a FROM clause. TODO: For subqueries without +** A FROM clause, consider adding a FROM close with the special +** table sqlite_once that consists of a single row containing a +** single NULL. +** +** (8) The subquery does not use LIMIT or the outer query is not a join. +** +** (9) The subquery does not use LIMIT or the outer query does not use +** aggregates. +** +** (**) Restriction (10) was removed from the code on 2005-02-05 but we +** accidently carried the comment forward until 2014-09-15. Original +** text: "The subquery does not use aggregates or the outer query +** does not use LIMIT." +** +** (11) The subquery and the outer query do not both have ORDER BY clauses. +** +** (**) 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. +** +** (14) The subquery does not use OFFSET. +** +** (15) The outer query is not part of a compound select or the +** subquery does not have a LIMIT clause. +** (See ticket #2339 and ticket [02a8e81d44]). +** +** (16) The outer query is not an aggregate or the subquery does +** not contain ORDER BY. (Ticket #2942) This used to not matter +** until we introduced the group_concat() function. +** +** (17) The sub-query is not a compound select, or it is a UNION ALL +** compound clause made up entirely of non-aggregate queries, and +** the parent query: +** +** * is not itself part of a compound select, +** * is not an aggregate or DISTINCT query, and +** * is not a join +** +** The parent and sub-query may contain WHERE clauses. Subject to +** rules (11), (13) and (14), they may also contain ORDER BY, +** LIMIT and OFFSET clauses. The subquery cannot use any compound +** operator other than UNION ALL because all the other compound +** operators have an implied DISTINCT which is disallowed by +** restriction (4). +** +** Also, each component of the sub-query must return the same number +** of result columns. This is actually a requirement for any compound +** SELECT statement, but all the code here does is make sure that no +** such (illegal) sub-query is flattened. The caller will detect the +** syntax error and return a detailed message. +** +** (18) If the sub-query is a compound select, then all terms of the +** ORDER by clause of the parent must be simple references to +** columns of the sub-query. +** +** (19) The subquery does not use LIMIT or the outer query does not +** have a WHERE clause. +** +** (20) If the sub-query is a compound select, then it must not use +** an ORDER BY clause. Ticket #3773. We could relax this constraint +** somewhat by saying that the terms of the ORDER BY clause must +** appear as unmodified result columns in the outer query. But we +** have other optimizations in mind to deal with that case. +** +** (21) The subquery does not use LIMIT or the outer query is not +** DISTINCT. (See ticket [752e1646fc]). +** +** (22) The subquery is not a recursive CTE. +** +** (23) The parent is not a recursive CTE, or the sub-query is not a +** compound query. This restriction is because transforming the +** parent to a compound query confuses the code that handles +** recursive queries in multiSelect(). +** +** (24) The subquery is not an aggregate that uses the built-in min() or +** or max() functions. (Without this restriction, a query like: +** "SELECT x FROM (SELECT max(y), x FROM t1)" would not necessarily +** return the value X for which Y was maximal.) +** +** +** In this routine, the "p" parameter is a pointer to the outer query. +** The subquery is p->pSrc->a[iFrom]. isAgg is true if the outer query +** uses aggregates and subqueryIsAgg is true if the subquery uses aggregates. +** +** If flattening is not attempted, this routine is a no-op and returns 0. +** If flattening is attempted this routine returns 1. +** +** All of the expression analysis must occur on both the outer query and +** the subquery before this routine runs. +*/ +static int flattenSubquery( + Parse *pParse, /* Parsing context */ + Select *p, /* The parent or outer SELECT statement */ + int iFrom, /* Index in p->pSrc->a[] of the inner subquery */ + int isAgg, /* True if outer SELECT uses aggregate functions */ + int subqueryIsAgg /* True if the subquery uses aggregate functions */ +){ + const char *zSavedAuthContext = pParse->zAuthContext; + Select *pParent; /* Current UNION ALL term of the other query */ + Select *pSub; /* The inner query or "subquery" */ + Select *pSub1; /* Pointer to the rightmost select in sub-query */ + SrcList *pSrc; /* The FROM clause of the outer query */ + SrcList *pSubSrc; /* The FROM clause of the subquery */ + ExprList *pList; /* The result set of the outer query */ + int iParent; /* VDBE cursor number of the pSub result set temp table */ + int i; /* Loop counter */ + Expr *pWhere; /* The WHERE clause */ + struct SrcList_item *pSubitem; /* The subquery */ + sqlite3 *db = pParse->db; + + /* Check to see if flattening is permitted. Return 0 if not. + */ + assert( p!=0 ); + assert( p->pPrior==0 ); /* Unable to flatten compound queries */ + if( OptimizationDisabled(db, SQLITE_QueryFlattener) ) return 0; + pSrc = p->pSrc; + assert( pSrc && iFrom>=0 && iFromnSrc ); + pSubitem = &pSrc->a[iFrom]; + iParent = pSubitem->iCursor; + pSub = pSubitem->pSelect; + assert( pSub!=0 ); + if( subqueryIsAgg ){ + if( isAgg ) return 0; /* Restriction (1) */ + if( pSrc->nSrc>1 ) return 0; /* Restriction (2a) */ + if( (p->pWhere && ExprHasProperty(p->pWhere,EP_Subquery)) + || (sqlite3ExprListFlags(p->pEList) & EP_Subquery)!=0 + || (sqlite3ExprListFlags(p->pOrderBy) & EP_Subquery)!=0 + ){ + return 0; /* Restriction (2b) */ + } + } + + pSubSrc = pSub->pSrc; + assert( pSubSrc ); + /* Prior to version 3.1.2, when LIMIT and OFFSET had to be simple constants, + ** not arbitrary expressions, we allowed some combining of LIMIT and OFFSET + ** because they could be computed at compile-time. But when LIMIT and OFFSET + ** became arbitrary expressions, we were forced to add restrictions (13) + ** and (14). */ + if( pSub->pLimit && p->pLimit ) return 0; /* Restriction (13) */ + if( pSub->pOffset ) return 0; /* Restriction (14) */ + if( (p->selFlags & SF_Compound)!=0 && pSub->pLimit ){ + return 0; /* Restriction (15) */ + } + if( pSubSrc->nSrc==0 ) return 0; /* Restriction (7) */ + if( pSub->selFlags & SF_Distinct ) return 0; /* Restriction (5) */ + if( pSub->pLimit && (pSrc->nSrc>1 || isAgg) ){ + return 0; /* Restrictions (8)(9) */ + } + if( (p->selFlags & SF_Distinct)!=0 && subqueryIsAgg ){ + return 0; /* Restriction (6) */ + } + if( p->pOrderBy && pSub->pOrderBy ){ + return 0; /* Restriction (11) */ + } + if( isAgg && pSub->pOrderBy ) return 0; /* Restriction (16) */ + if( pSub->pLimit && p->pWhere ) return 0; /* Restriction (19) */ + if( pSub->pLimit && (p->selFlags & SF_Distinct)!=0 ){ + return 0; /* Restriction (21) */ + } + testcase( pSub->selFlags & SF_Recursive ); + testcase( pSub->selFlags & SF_MinMaxAgg ); + if( pSub->selFlags & (SF_Recursive|SF_MinMaxAgg) ){ + return 0; /* Restrictions (22) and (24) */ + } + if( (p->selFlags & SF_Recursive) && pSub->pPrior ){ + return 0; /* Restriction (23) */ + } + + /* OBSOLETE COMMENT 1: + ** Restriction 3: If the subquery is a join, make sure the subquery is + ** not used as the right operand of an outer join. Examples of why this + ** is not allowed: + ** + ** t1 LEFT OUTER JOIN (t2 JOIN t3) + ** + ** If we flatten the above, we would get + ** + ** (t1 LEFT OUTER JOIN t2) JOIN t3 + ** + ** which is not at all the same thing. + ** + ** OBSOLETE COMMENT 2: + ** Restriction 12: If the subquery is the right operand of a left outer + ** join, make sure the subquery has no WHERE clause. + ** An examples of why this is not allowed: + ** + ** t1 LEFT OUTER JOIN (SELECT * FROM t2 WHERE t2.x>0) + ** + ** If we flatten the above, we would get + ** + ** (t1 LEFT OUTER JOIN t2) WHERE t2.x>0 + ** + ** But the t2.x>0 test will always fail on a NULL row of t2, which + ** effectively converts the OUTER JOIN into an INNER JOIN. + ** + ** THIS OVERRIDES OBSOLETE COMMENTS 1 AND 2 ABOVE: + ** Ticket #3300 shows that flattening the right term of a LEFT JOIN + ** is fraught with danger. Best to avoid the whole thing. If the + ** subquery is the right term of a LEFT JOIN, then do not flatten. + */ + if( (pSubitem->fg.jointype & JT_OUTER)!=0 ){ + return 0; + } + + /* Restriction 17: If the sub-query is a compound SELECT, then it must + ** use only the UNION ALL operator. And none of the simple select queries + ** that make up the compound SELECT are allowed to be aggregate or distinct + ** queries. + */ + if( pSub->pPrior ){ + if( pSub->pOrderBy ){ + return 0; /* Restriction 20 */ + } + if( isAgg || (p->selFlags & SF_Distinct)!=0 || pSrc->nSrc!=1 ){ + return 0; + } + for(pSub1=pSub; pSub1; pSub1=pSub1->pPrior){ + testcase( (pSub1->selFlags & (SF_Distinct|SF_Aggregate))==SF_Distinct ); + testcase( (pSub1->selFlags & (SF_Distinct|SF_Aggregate))==SF_Aggregate ); + assert( pSub->pSrc!=0 ); + assert( pSub->pEList->nExpr==pSub1->pEList->nExpr ); + if( (pSub1->selFlags & (SF_Distinct|SF_Aggregate))!=0 + || (pSub1->pPrior && pSub1->op!=TK_ALL) + || pSub1->pSrc->nSrc<1 + ){ + return 0; + } + testcase( pSub1->pSrc->nSrc>1 ); + } + + /* Restriction 18. */ + if( p->pOrderBy ){ + int ii; + for(ii=0; iipOrderBy->nExpr; ii++){ + if( p->pOrderBy->a[ii].u.x.iOrderByCol==0 ) return 0; + } + } + } + + /***** If we reach this point, flattening is permitted. *****/ + SELECTTRACE(1,pParse,p,("flatten %s.%p from term %d\n", + pSub->zSelName, pSub, iFrom)); + + /* Authorize the subquery */ + pParse->zAuthContext = pSubitem->zName; + TESTONLY(i =) sqlite3AuthCheck(pParse, SQLITE_SELECT, 0, 0, 0); + testcase( i==SQLITE_DENY ); + pParse->zAuthContext = zSavedAuthContext; + + /* If the sub-query is a compound SELECT statement, then (by restrictions + ** 17 and 18 above) it must be a UNION ALL and the parent query must + ** be of the form: + ** + ** SELECT FROM () + ** + ** followed by any ORDER BY, LIMIT and/or OFFSET clauses. This block + ** creates N-1 copies of the parent query without any ORDER BY, LIMIT or + ** OFFSET clauses and joins them to the left-hand-side of the original + ** using UNION ALL operators. In this case N is the number of simple + ** select statements in the compound sub-query. + ** + ** Example: + ** + ** SELECT a+1 FROM ( + ** SELECT x FROM tab + ** UNION ALL + ** SELECT y FROM tab + ** UNION ALL + ** SELECT abs(z*2) FROM tab2 + ** ) WHERE a!=5 ORDER BY 1 + ** + ** Transformed into: + ** + ** SELECT x+1 FROM tab WHERE x+1!=5 + ** UNION ALL + ** SELECT y+1 FROM tab WHERE y+1!=5 + ** UNION ALL + ** SELECT abs(z*2)+1 FROM tab2 WHERE abs(z*2)+1!=5 + ** ORDER BY 1 + ** + ** We call this the "compound-subquery flattening". + */ + for(pSub=pSub->pPrior; pSub; pSub=pSub->pPrior){ + Select *pNew; + ExprList *pOrderBy = p->pOrderBy; + Expr *pLimit = p->pLimit; + Expr *pOffset = p->pOffset; + Select *pPrior = p->pPrior; + p->pOrderBy = 0; + p->pSrc = 0; + p->pPrior = 0; + p->pLimit = 0; + p->pOffset = 0; + pNew = sqlite3SelectDup(db, p, 0); + sqlite3SelectSetName(pNew, pSub->zSelName); + p->pOffset = pOffset; + p->pLimit = pLimit; + p->pOrderBy = pOrderBy; + p->pSrc = pSrc; + p->op = TK_ALL; + if( pNew==0 ){ + p->pPrior = pPrior; + }else{ + pNew->pPrior = pPrior; + if( pPrior ) pPrior->pNext = pNew; + pNew->pNext = p; + p->pPrior = pNew; + SELECTTRACE(2,pParse,p, + ("compound-subquery flattener creates %s.%p as peer\n", + pNew->zSelName, pNew)); + } + if( db->mallocFailed ) return 1; + } + + /* Begin flattening the iFrom-th entry of the FROM clause + ** in the outer query. + */ + pSub = pSub1 = pSubitem->pSelect; + + /* Delete the transient table structure associated with the + ** subquery + */ + sqlite3DbFree(db, pSubitem->zDatabase); + sqlite3DbFree(db, pSubitem->zName); + sqlite3DbFree(db, pSubitem->zAlias); + pSubitem->zDatabase = 0; + pSubitem->zName = 0; + pSubitem->zAlias = 0; + pSubitem->pSelect = 0; + + /* Defer deleting the Table object associated with the + ** subquery until code generation is + ** complete, since there may still exist Expr.pTab entries that + ** refer to the subquery even after flattening. Ticket #3346. + ** + ** pSubitem->pTab is always non-NULL by test restrictions and tests above. + */ + if( ALWAYS(pSubitem->pTab!=0) ){ + Table *pTabToDel = pSubitem->pTab; + if( pTabToDel->nRef==1 ){ + Parse *pToplevel = sqlite3ParseToplevel(pParse); + pTabToDel->pNextZombie = pToplevel->pZombieTab; + pToplevel->pZombieTab = pTabToDel; + }else{ + pTabToDel->nRef--; + } + pSubitem->pTab = 0; + } + + /* The following loop runs once for each term in a compound-subquery + ** flattening (as described above). If we are doing a different kind + ** of flattening - a flattening other than a compound-subquery flattening - + ** then this loop only runs once. + ** + ** This loop moves all of the FROM elements of the subquery into the + ** the FROM clause of the outer query. Before doing this, remember + ** the cursor number for the original outer query FROM element in + ** iParent. The iParent cursor will never be used. Subsequent code + ** will scan expressions looking for iParent references and replace + ** those references with expressions that resolve to the subquery FROM + ** elements we are now copying in. + */ + for(pParent=p; pParent; pParent=pParent->pPrior, pSub=pSub->pPrior){ + int nSubSrc; + u8 jointype = 0; + pSubSrc = pSub->pSrc; /* FROM clause of subquery */ + nSubSrc = pSubSrc->nSrc; /* Number of terms in subquery FROM clause */ + pSrc = pParent->pSrc; /* FROM clause of the outer query */ + + if( pSrc ){ + assert( pParent==p ); /* First time through the loop */ + jointype = pSubitem->fg.jointype; + }else{ + assert( pParent!=p ); /* 2nd and subsequent times through the loop */ + pSrc = pParent->pSrc = sqlite3SrcListAppend(db, 0, 0, 0); + if( pSrc==0 ){ + assert( db->mallocFailed ); + break; + } + } + + /* The subquery uses a single slot of the FROM clause of the outer + ** query. If the subquery has more than one element in its FROM clause, + ** then expand the outer query to make space for it to hold all elements + ** of the subquery. + ** + ** Example: + ** + ** SELECT * FROM tabA, (SELECT * FROM sub1, sub2), tabB; + ** + ** The outer query has 3 slots in its FROM clause. One slot of the + ** outer query (the middle slot) is used by the subquery. The next + ** block of code will expand the outer query FROM clause to 4 slots. + ** The middle slot is expanded to two slots in order to make space + ** for the two elements in the FROM clause of the subquery. + */ + if( nSubSrc>1 ){ + pParent->pSrc = pSrc = sqlite3SrcListEnlarge(db, pSrc, nSubSrc-1,iFrom+1); + if( db->mallocFailed ){ + break; + } + } + + /* Transfer the FROM clause terms from the subquery into the + ** outer query. + */ + for(i=0; ia[i+iFrom].pUsing); + assert( pSrc->a[i+iFrom].fg.isTabFunc==0 ); + pSrc->a[i+iFrom] = pSubSrc->a[i]; + memset(&pSubSrc->a[i], 0, sizeof(pSubSrc->a[i])); + } + pSrc->a[iFrom].fg.jointype = jointype; + + /* Now begin substituting subquery result set expressions for + ** references to the iParent in the outer query. + ** + ** Example: + ** + ** SELECT a+5, b*10 FROM (SELECT x*3 AS a, y+10 AS b FROM t1) WHERE a>b; + ** \ \_____________ subquery __________/ / + ** \_____________________ outer query ______________________________/ + ** + ** We look at every expression in the outer query and every place we see + ** "a" we substitute "x*3" and every place we see "b" we substitute "y+10". + */ + pList = pParent->pEList; + for(i=0; inExpr; i++){ + if( pList->a[i].zName==0 ){ + char *zName = sqlite3DbStrDup(db, pList->a[i].zSpan); + sqlite3Dequote(zName); + pList->a[i].zName = zName; + } + } + if( pSub->pOrderBy ){ + /* At this point, any non-zero iOrderByCol values indicate that the + ** ORDER BY column expression is identical to the iOrderByCol'th + ** expression returned by SELECT statement pSub. Since these values + ** do not necessarily correspond to columns in SELECT statement pParent, + ** zero them before transfering the ORDER BY clause. + ** + ** Not doing this may cause an error if a subsequent call to this + ** function attempts to flatten a compound sub-query into pParent + ** (the only way this can happen is if the compound sub-query is + ** currently part of pSub->pSrc). See ticket [d11a6e908f]. */ + ExprList *pOrderBy = pSub->pOrderBy; + for(i=0; inExpr; i++){ + pOrderBy->a[i].u.x.iOrderByCol = 0; + } + assert( pParent->pOrderBy==0 ); + assert( pSub->pPrior==0 ); + pParent->pOrderBy = pOrderBy; + pSub->pOrderBy = 0; + } + pWhere = sqlite3ExprDup(db, pSub->pWhere, 0); + if( subqueryIsAgg ){ + assert( pParent->pHaving==0 ); + pParent->pHaving = pParent->pWhere; + pParent->pWhere = pWhere; + pParent->pHaving = sqlite3ExprAnd(db, + sqlite3ExprDup(db, pSub->pHaving, 0), pParent->pHaving + ); + assert( pParent->pGroupBy==0 ); + pParent->pGroupBy = sqlite3ExprListDup(db, pSub->pGroupBy, 0); + }else{ + pParent->pWhere = sqlite3ExprAnd(db, pWhere, pParent->pWhere); + } + substSelect(db, pParent, iParent, pSub->pEList, 0); + + /* The flattened query is distinct if either the inner or the + ** outer query is distinct. + */ + pParent->selFlags |= pSub->selFlags & SF_Distinct; + + /* + ** SELECT ... FROM (SELECT ... LIMIT a OFFSET b) LIMIT x OFFSET y; + ** + ** One is tempted to try to add a and b to combine the limits. But this + ** does not work if either limit is negative. + */ + if( pSub->pLimit ){ + pParent->pLimit = pSub->pLimit; + pSub->pLimit = 0; + } + } + + /* Finially, delete what is left of the subquery and return + ** success. + */ + sqlite3SelectDelete(db, pSub1); + +#if SELECTTRACE_ENABLED + if( sqlite3SelectTrace & 0x100 ){ + SELECTTRACE(0x100,pParse,p,("After flattening:\n")); + sqlite3TreeViewSelect(0, p, 0); + } +#endif + + return 1; +} +#endif /* !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) */ + + + +#if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) +/* +** Make copies of relevant WHERE clause terms of the outer query into +** the WHERE clause of subquery. Example: +** +** SELECT * FROM (SELECT a AS x, c-d AS y FROM t1) WHERE x=5 AND y=10; +** +** Transformed into: +** +** SELECT * FROM (SELECT a AS x, c-d AS y FROM t1 WHERE a=5 AND c-d=10) +** WHERE x=5 AND y=10; +** +** The hope is that the terms added to the inner query will make it more +** efficient. +** +** Do not attempt this optimization if: +** +** (1) The inner query is an aggregate. (In that case, we'd really want +** to copy the outer WHERE-clause terms onto the HAVING clause of the +** inner query. But they probably won't help there so do not bother.) +** +** (2) The inner query is the recursive part of a common table expression. +** +** (3) The inner query has a LIMIT clause (since the changes to the WHERE +** close would change the meaning of the LIMIT). +** +** (4) The inner query is the right operand of a LEFT JOIN. (The caller +** enforces this restriction since this routine does not have enough +** information to know.) +** +** (5) The WHERE clause expression originates in the ON or USING clause +** of a LEFT JOIN. +** +** Return 0 if no changes are made and non-zero if one or more WHERE clause +** terms are duplicated into the subquery. +*/ +static int pushDownWhereTerms( + sqlite3 *db, /* The database connection (for malloc()) */ + Select *pSubq, /* The subquery whose WHERE clause is to be augmented */ + Expr *pWhere, /* The WHERE clause of the outer query */ + int iCursor /* Cursor number of the subquery */ +){ + Expr *pNew; + int nChng = 0; + Select *pX; /* For looping over compound SELECTs in pSubq */ + if( pWhere==0 ) return 0; + for(pX=pSubq; pX; pX=pX->pPrior){ + if( (pX->selFlags & (SF_Aggregate|SF_Recursive))!=0 ){ + testcase( pX->selFlags & SF_Aggregate ); + testcase( pX->selFlags & SF_Recursive ); + testcase( pX!=pSubq ); + return 0; /* restrictions (1) and (2) */ + } + } + if( pSubq->pLimit!=0 ){ + return 0; /* restriction (3) */ + } + while( pWhere->op==TK_AND ){ + nChng += pushDownWhereTerms(db, pSubq, pWhere->pRight, iCursor); + pWhere = pWhere->pLeft; + } + if( ExprHasProperty(pWhere,EP_FromJoin) ) return 0; /* restriction 5 */ + if( sqlite3ExprIsTableConstant(pWhere, iCursor) ){ + nChng++; + while( pSubq ){ + pNew = sqlite3ExprDup(db, pWhere, 0); + pNew = substExpr(db, pNew, iCursor, pSubq->pEList); + pSubq->pWhere = sqlite3ExprAnd(db, pSubq->pWhere, pNew); + pSubq = pSubq->pPrior; + } + } + return nChng; +} +#endif /* !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) */ + +/* +** Based on the contents of the AggInfo structure indicated by the first +** argument, this function checks if the following are true: +** +** * the query contains just a single aggregate function, +** * the aggregate function is either min() or max(), and +** * the argument to the aggregate function is a column value. +** +** If all of the above are true, then WHERE_ORDERBY_MIN or WHERE_ORDERBY_MAX +** is returned as appropriate. Also, *ppMinMax is set to point to the +** list of arguments passed to the aggregate before returning. +** +** Or, if the conditions above are not met, *ppMinMax is set to 0 and +** WHERE_ORDERBY_NORMAL is returned. +*/ +static u8 minMaxQuery(AggInfo *pAggInfo, ExprList **ppMinMax){ + int eRet = WHERE_ORDERBY_NORMAL; /* Return value */ + + *ppMinMax = 0; + if( pAggInfo->nFunc==1 ){ + Expr *pExpr = pAggInfo->aFunc[0].pExpr; /* Aggregate function */ + ExprList *pEList = pExpr->x.pList; /* Arguments to agg function */ + + assert( pExpr->op==TK_AGG_FUNCTION ); + if( pEList && pEList->nExpr==1 && pEList->a[0].pExpr->op==TK_AGG_COLUMN ){ + const char *zFunc = pExpr->u.zToken; + if( sqlite3StrICmp(zFunc, "min")==0 ){ + eRet = WHERE_ORDERBY_MIN; + *ppMinMax = pEList; + }else if( sqlite3StrICmp(zFunc, "max")==0 ){ + eRet = WHERE_ORDERBY_MAX; + *ppMinMax = pEList; + } + } + } + + assert( *ppMinMax==0 || (*ppMinMax)->nExpr==1 ); + return eRet; +} + +/* +** The select statement passed as the first argument is an aggregate query. +** The second argument is the associated aggregate-info object. This +** function tests if the SELECT is of the form: +** +** SELECT count(*) FROM +** +** where table is a database table, not a sub-select or view. If the query +** does match this pattern, then a pointer to the Table object representing +** is returned. Otherwise, 0 is returned. +*/ +static Table *isSimpleCount(Select *p, AggInfo *pAggInfo){ + Table *pTab; + Expr *pExpr; + + assert( !p->pGroupBy ); + + if( p->pWhere || p->pEList->nExpr!=1 + || p->pSrc->nSrc!=1 || p->pSrc->a[0].pSelect + ){ + return 0; + } + pTab = p->pSrc->a[0].pTab; + pExpr = p->pEList->a[0].pExpr; + assert( pTab && !pTab->pSelect && pExpr ); + + if( IsVirtual(pTab) ) return 0; + if( pExpr->op!=TK_AGG_FUNCTION ) return 0; + if( NEVER(pAggInfo->nFunc==0) ) return 0; + if( (pAggInfo->aFunc[0].pFunc->funcFlags&SQLITE_FUNC_COUNT)==0 ) return 0; + if( pExpr->flags&EP_Distinct ) return 0; + + return pTab; +} + +/* +** If the source-list item passed as an argument was augmented with an +** INDEXED BY clause, then try to locate the specified index. If there +** was such a clause and the named index cannot be found, return +** SQLITE_ERROR and leave an error in pParse. Otherwise, populate +** pFrom->pIndex and return SQLITE_OK. +*/ +SQLITE_PRIVATE int sqlite3IndexedByLookup(Parse *pParse, struct SrcList_item *pFrom){ + if( pFrom->pTab && pFrom->fg.isIndexedBy ){ + Table *pTab = pFrom->pTab; + char *zIndexedBy = pFrom->u1.zIndexedBy; + Index *pIdx; + for(pIdx=pTab->pIndex; + pIdx && sqlite3StrICmp(pIdx->zName, zIndexedBy); + pIdx=pIdx->pNext + ); + if( !pIdx ){ + sqlite3ErrorMsg(pParse, "no such index: %s", zIndexedBy, 0); + pParse->checkSchema = 1; + return SQLITE_ERROR; + } + pFrom->pIBIndex = pIdx; + } + return SQLITE_OK; +} +/* +** Detect compound SELECT statements that use an ORDER BY clause with +** an alternative collating sequence. +** +** SELECT ... FROM t1 EXCEPT SELECT ... FROM t2 ORDER BY .. COLLATE ... +** +** These are rewritten as a subquery: +** +** SELECT * FROM (SELECT ... FROM t1 EXCEPT SELECT ... FROM t2) +** ORDER BY ... COLLATE ... +** +** This transformation is necessary because the multiSelectOrderBy() routine +** above that generates the code for a compound SELECT with an ORDER BY clause +** uses a merge algorithm that requires the same collating sequence on the +** result columns as on the ORDER BY clause. See ticket +** http://www.sqlite.org/src/info/6709574d2a +** +** This transformation is only needed for EXCEPT, INTERSECT, and UNION. +** The UNION ALL operator works fine with multiSelectOrderBy() even when +** there are COLLATE terms in the ORDER BY. +*/ +static int convertCompoundSelectToSubquery(Walker *pWalker, Select *p){ + int i; + Select *pNew; + Select *pX; + sqlite3 *db; + struct ExprList_item *a; + SrcList *pNewSrc; + Parse *pParse; + Token dummy; + + if( p->pPrior==0 ) return WRC_Continue; + if( p->pOrderBy==0 ) return WRC_Continue; + for(pX=p; pX && (pX->op==TK_ALL || pX->op==TK_SELECT); pX=pX->pPrior){} + if( pX==0 ) return WRC_Continue; + a = p->pOrderBy->a; + for(i=p->pOrderBy->nExpr-1; i>=0; i--){ + if( a[i].pExpr->flags & EP_Collate ) break; + } + if( i<0 ) return WRC_Continue; + + /* If we reach this point, that means the transformation is required. */ + + pParse = pWalker->pParse; + db = pParse->db; + pNew = sqlite3DbMallocZero(db, sizeof(*pNew) ); + if( pNew==0 ) return WRC_Abort; + memset(&dummy, 0, sizeof(dummy)); + pNewSrc = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&dummy,pNew,0,0); + if( pNewSrc==0 ) return WRC_Abort; + *pNew = *p; + p->pSrc = pNewSrc; + p->pEList = sqlite3ExprListAppend(pParse, 0, sqlite3Expr(db, TK_ASTERISK, 0)); + p->op = TK_SELECT; + p->pWhere = 0; + pNew->pGroupBy = 0; + pNew->pHaving = 0; + pNew->pOrderBy = 0; + p->pPrior = 0; + p->pNext = 0; + p->pWith = 0; + p->selFlags &= ~SF_Compound; + assert( (p->selFlags & SF_Converted)==0 ); + p->selFlags |= SF_Converted; + assert( pNew->pPrior!=0 ); + pNew->pPrior->pNext = pNew; + pNew->pLimit = 0; + pNew->pOffset = 0; + return WRC_Continue; +} + +/* +** Check to see if the FROM clause term pFrom has table-valued function +** arguments. If it does, leave an error message in pParse and return +** non-zero, since pFrom is not allowed to be a table-valued function. +*/ +static int cannotBeFunction(Parse *pParse, struct SrcList_item *pFrom){ + if( pFrom->fg.isTabFunc ){ + sqlite3ErrorMsg(pParse, "'%s' is not a function", pFrom->zName); + return 1; + } + return 0; +} + +#ifndef SQLITE_OMIT_CTE +/* +** Argument pWith (which may be NULL) points to a linked list of nested +** WITH contexts, from inner to outermost. If the table identified by +** FROM clause element pItem is really a common-table-expression (CTE) +** then return a pointer to the CTE definition for that table. Otherwise +** return NULL. +** +** If a non-NULL value is returned, set *ppContext to point to the With +** object that the returned CTE belongs to. +*/ +static struct Cte *searchWith( + With *pWith, /* Current innermost WITH clause */ + struct SrcList_item *pItem, /* FROM clause element to resolve */ + With **ppContext /* OUT: WITH clause return value belongs to */ +){ + const char *zName; + if( pItem->zDatabase==0 && (zName = pItem->zName)!=0 ){ + With *p; + for(p=pWith; p; p=p->pOuter){ + int i; + for(i=0; inCte; i++){ + if( sqlite3StrICmp(zName, p->a[i].zName)==0 ){ + *ppContext = p; + return &p->a[i]; + } + } + } + } + return 0; +} + +/* The code generator maintains a stack of active WITH clauses +** with the inner-most WITH clause being at the top of the stack. +** +** This routine pushes the WITH clause passed as the second argument +** onto the top of the stack. If argument bFree is true, then this +** WITH clause will never be popped from the stack. In this case it +** should be freed along with the Parse object. In other cases, when +** bFree==0, the With object will be freed along with the SELECT +** statement with which it is associated. +*/ +SQLITE_PRIVATE void sqlite3WithPush(Parse *pParse, With *pWith, u8 bFree){ + assert( bFree==0 || (pParse->pWith==0 && pParse->pWithToFree==0) ); + if( pWith ){ + assert( pParse->pWith!=pWith ); + pWith->pOuter = pParse->pWith; + pParse->pWith = pWith; + if( bFree ) pParse->pWithToFree = pWith; + } +} + +/* +** This function checks if argument pFrom refers to a CTE declared by +** a WITH clause on the stack currently maintained by the parser. And, +** if currently processing a CTE expression, if it is a recursive +** reference to the current CTE. +** +** If pFrom falls into either of the two categories above, pFrom->pTab +** and other fields are populated accordingly. The caller should check +** (pFrom->pTab!=0) to determine whether or not a successful match +** was found. +** +** Whether or not a match is found, SQLITE_OK is returned if no error +** occurs. If an error does occur, an error message is stored in the +** parser and some error code other than SQLITE_OK returned. +*/ +static int withExpand( + Walker *pWalker, + struct SrcList_item *pFrom +){ + Parse *pParse = pWalker->pParse; + sqlite3 *db = pParse->db; + struct Cte *pCte; /* Matched CTE (or NULL if no match) */ + With *pWith; /* WITH clause that pCte belongs to */ + + assert( pFrom->pTab==0 ); + + pCte = searchWith(pParse->pWith, pFrom, &pWith); + if( pCte ){ + Table *pTab; + ExprList *pEList; + Select *pSel; + Select *pLeft; /* Left-most SELECT statement */ + int bMayRecursive; /* True if compound joined by UNION [ALL] */ + With *pSavedWith; /* Initial value of pParse->pWith */ + + /* If pCte->zCteErr is non-NULL at this point, then this is an illegal + ** recursive reference to CTE pCte. Leave an error in pParse and return + ** early. If pCte->zCteErr is NULL, then this is not a recursive reference. + ** In this case, proceed. */ + if( pCte->zCteErr ){ + sqlite3ErrorMsg(pParse, pCte->zCteErr, pCte->zName); + return SQLITE_ERROR; + } + if( cannotBeFunction(pParse, pFrom) ) return SQLITE_ERROR; + + assert( pFrom->pTab==0 ); + pFrom->pTab = pTab = sqlite3DbMallocZero(db, sizeof(Table)); + if( pTab==0 ) return WRC_Abort; + pTab->nRef = 1; + pTab->zName = sqlite3DbStrDup(db, pCte->zName); + pTab->iPKey = -1; + pTab->nRowLogEst = 200; assert( 200==sqlite3LogEst(1048576) ); + pTab->tabFlags |= TF_Ephemeral | TF_NoVisibleRowid; + pFrom->pSelect = sqlite3SelectDup(db, pCte->pSelect, 0); + if( db->mallocFailed ) return SQLITE_NOMEM_BKPT; + assert( pFrom->pSelect ); + + /* Check if this is a recursive CTE. */ + pSel = pFrom->pSelect; + bMayRecursive = ( pSel->op==TK_ALL || pSel->op==TK_UNION ); + if( bMayRecursive ){ + int i; + SrcList *pSrc = pFrom->pSelect->pSrc; + for(i=0; inSrc; i++){ + struct SrcList_item *pItem = &pSrc->a[i]; + if( pItem->zDatabase==0 + && pItem->zName!=0 + && 0==sqlite3StrICmp(pItem->zName, pCte->zName) + ){ + pItem->pTab = pTab; + pItem->fg.isRecursive = 1; + pTab->nRef++; + pSel->selFlags |= SF_Recursive; + } + } + } + + /* Only one recursive reference is permitted. */ + if( pTab->nRef>2 ){ + sqlite3ErrorMsg( + pParse, "multiple references to recursive table: %s", pCte->zName + ); + return SQLITE_ERROR; + } + assert( pTab->nRef==1 || ((pSel->selFlags&SF_Recursive) && pTab->nRef==2 )); + + pCte->zCteErr = "circular reference: %s"; + pSavedWith = pParse->pWith; + pParse->pWith = pWith; + sqlite3WalkSelect(pWalker, bMayRecursive ? pSel->pPrior : pSel); + pParse->pWith = pWith; + + for(pLeft=pSel; pLeft->pPrior; pLeft=pLeft->pPrior); + pEList = pLeft->pEList; + if( pCte->pCols ){ + if( pEList && pEList->nExpr!=pCte->pCols->nExpr ){ + sqlite3ErrorMsg(pParse, "table %s has %d values for %d columns", + pCte->zName, pEList->nExpr, pCte->pCols->nExpr + ); + pParse->pWith = pSavedWith; + return SQLITE_ERROR; + } + pEList = pCte->pCols; + } + + sqlite3ColumnsFromExprList(pParse, pEList, &pTab->nCol, &pTab->aCol); + if( bMayRecursive ){ + if( pSel->selFlags & SF_Recursive ){ + pCte->zCteErr = "multiple recursive references: %s"; + }else{ + pCte->zCteErr = "recursive reference in a subquery: %s"; + } + sqlite3WalkSelect(pWalker, pSel); + } + pCte->zCteErr = 0; + pParse->pWith = pSavedWith; + } + + return SQLITE_OK; +} +#endif + +#ifndef SQLITE_OMIT_CTE +/* +** If the SELECT passed as the second argument has an associated WITH +** clause, pop it from the stack stored as part of the Parse object. +** +** This function is used as the xSelectCallback2() callback by +** sqlite3SelectExpand() when walking a SELECT tree to resolve table +** names and other FROM clause elements. +*/ +static void selectPopWith(Walker *pWalker, Select *p){ + Parse *pParse = pWalker->pParse; + With *pWith = findRightmost(p)->pWith; + if( pWith!=0 ){ + assert( pParse->pWith==pWith ); + pParse->pWith = pWith->pOuter; + } +} +#else +#define selectPopWith 0 +#endif + +/* +** This routine is a Walker callback for "expanding" a SELECT statement. +** "Expanding" means to do the following: +** +** (1) Make sure VDBE cursor numbers have been assigned to every +** element of the FROM clause. +** +** (2) Fill in the pTabList->a[].pTab fields in the SrcList that +** defines FROM clause. When views appear in the FROM clause, +** fill pTabList->a[].pSelect with a copy of the SELECT statement +** that implements the view. A copy is made of the view's SELECT +** statement so that we can freely modify or delete that statement +** without worrying about messing up the persistent representation +** of the view. +** +** (3) Add terms to the WHERE clause to accommodate the NATURAL keyword +** on joins and the ON and USING clause of joins. +** +** (4) Scan the list of columns in the result set (pEList) looking +** for instances of the "*" operator or the TABLE.* operator. +** If found, expand each "*" to be every column in every table +** and TABLE.* to be every column in TABLE. +** +*/ +static int selectExpander(Walker *pWalker, Select *p){ + Parse *pParse = pWalker->pParse; + int i, j, k; + SrcList *pTabList; + ExprList *pEList; + struct SrcList_item *pFrom; + sqlite3 *db = pParse->db; + Expr *pE, *pRight, *pExpr; + u16 selFlags = p->selFlags; + + p->selFlags |= SF_Expanded; + if( db->mallocFailed ){ + return WRC_Abort; + } + if( NEVER(p->pSrc==0) || (selFlags & SF_Expanded)!=0 ){ + return WRC_Prune; + } + pTabList = p->pSrc; + pEList = p->pEList; + if( pWalker->xSelectCallback2==selectPopWith ){ + sqlite3WithPush(pParse, findRightmost(p)->pWith, 0); + } + + /* Make sure cursor numbers have been assigned to all entries in + ** the FROM clause of the SELECT statement. + */ + sqlite3SrcListAssignCursors(pParse, pTabList); + + /* Look up every table named in the FROM clause of the select. If + ** an entry of the FROM clause is a subquery instead of a table or view, + ** then create a transient table structure to describe the subquery. + */ + for(i=0, pFrom=pTabList->a; inSrc; i++, pFrom++){ + Table *pTab; + assert( pFrom->fg.isRecursive==0 || pFrom->pTab!=0 ); + if( pFrom->fg.isRecursive ) continue; + assert( pFrom->pTab==0 ); +#ifndef SQLITE_OMIT_CTE + if( withExpand(pWalker, pFrom) ) return WRC_Abort; + if( pFrom->pTab ) {} else +#endif + if( pFrom->zName==0 ){ +#ifndef SQLITE_OMIT_SUBQUERY + Select *pSel = pFrom->pSelect; + /* A sub-query in the FROM clause of a SELECT */ + assert( pSel!=0 ); + assert( pFrom->pTab==0 ); + if( sqlite3WalkSelect(pWalker, pSel) ) return WRC_Abort; + pFrom->pTab = pTab = sqlite3DbMallocZero(db, sizeof(Table)); + if( pTab==0 ) return WRC_Abort; + pTab->nRef = 1; + pTab->zName = sqlite3MPrintf(db, "sqlite_sq_%p", (void*)pTab); + while( pSel->pPrior ){ pSel = pSel->pPrior; } + sqlite3ColumnsFromExprList(pParse, pSel->pEList,&pTab->nCol,&pTab->aCol); + pTab->iPKey = -1; + pTab->nRowLogEst = 200; assert( 200==sqlite3LogEst(1048576) ); + pTab->tabFlags |= TF_Ephemeral; +#endif + }else{ + /* An ordinary table or view name in the FROM clause */ + assert( pFrom->pTab==0 ); + pFrom->pTab = pTab = sqlite3LocateTableItem(pParse, 0, pFrom); + if( pTab==0 ) return WRC_Abort; + if( pTab->nRef==0xffff ){ + sqlite3ErrorMsg(pParse, "too many references to \"%s\": max 65535", + pTab->zName); + pFrom->pTab = 0; + return WRC_Abort; + } + pTab->nRef++; + if( !IsVirtual(pTab) && cannotBeFunction(pParse, pFrom) ){ + return WRC_Abort; + } +#if !defined(SQLITE_OMIT_VIEW) || !defined (SQLITE_OMIT_VIRTUALTABLE) + if( IsVirtual(pTab) || pTab->pSelect ){ + i16 nCol; + if( sqlite3ViewGetColumnNames(pParse, pTab) ) return WRC_Abort; + assert( pFrom->pSelect==0 ); + pFrom->pSelect = sqlite3SelectDup(db, pTab->pSelect, 0); + sqlite3SelectSetName(pFrom->pSelect, pTab->zName); + nCol = pTab->nCol; + pTab->nCol = -1; + sqlite3WalkSelect(pWalker, pFrom->pSelect); + pTab->nCol = nCol; + } +#endif + } + + /* Locate the index named by the INDEXED BY clause, if any. */ + if( sqlite3IndexedByLookup(pParse, pFrom) ){ + return WRC_Abort; + } + } + + /* Process NATURAL keywords, and ON and USING clauses of joins. + */ + if( db->mallocFailed || sqliteProcessJoin(pParse, p) ){ + return WRC_Abort; + } + + /* For every "*" that occurs in the column list, insert the names of + ** all columns in all tables. And for every TABLE.* insert the names + ** of all columns in TABLE. The parser inserted a special expression + ** with the TK_ASTERISK operator for each "*" that it found in the column + ** list. The following code just has to locate the TK_ASTERISK + ** expressions and expand each one to the list of all columns in + ** all tables. + ** + ** The first loop just checks to see if there are any "*" operators + ** that need expanding. + */ + for(k=0; knExpr; k++){ + pE = pEList->a[k].pExpr; + if( pE->op==TK_ASTERISK ) break; + assert( pE->op!=TK_DOT || pE->pRight!=0 ); + assert( pE->op!=TK_DOT || (pE->pLeft!=0 && pE->pLeft->op==TK_ID) ); + if( pE->op==TK_DOT && pE->pRight->op==TK_ASTERISK ) break; + } + if( knExpr ){ + /* + ** If we get here it means the result set contains one or more "*" + ** operators that need to be expanded. Loop through each expression + ** in the result set and expand them one by one. + */ + struct ExprList_item *a = pEList->a; + ExprList *pNew = 0; + int flags = pParse->db->flags; + int longNames = (flags & SQLITE_FullColNames)!=0 + && (flags & SQLITE_ShortColNames)==0; + + for(k=0; knExpr; k++){ + pE = a[k].pExpr; + pRight = pE->pRight; + assert( pE->op!=TK_DOT || pRight!=0 ); + if( pE->op!=TK_ASTERISK + && (pE->op!=TK_DOT || pRight->op!=TK_ASTERISK) + ){ + /* This particular expression does not need to be expanded. + */ + pNew = sqlite3ExprListAppend(pParse, pNew, a[k].pExpr); + if( pNew ){ + pNew->a[pNew->nExpr-1].zName = a[k].zName; + pNew->a[pNew->nExpr-1].zSpan = a[k].zSpan; + a[k].zName = 0; + a[k].zSpan = 0; + } + a[k].pExpr = 0; + }else{ + /* This expression is a "*" or a "TABLE.*" and needs to be + ** expanded. */ + int tableSeen = 0; /* Set to 1 when TABLE matches */ + char *zTName = 0; /* text of name of TABLE */ + if( pE->op==TK_DOT ){ + assert( pE->pLeft!=0 ); + assert( !ExprHasProperty(pE->pLeft, EP_IntValue) ); + zTName = pE->pLeft->u.zToken; + } + for(i=0, pFrom=pTabList->a; inSrc; i++, pFrom++){ + Table *pTab = pFrom->pTab; + Select *pSub = pFrom->pSelect; + char *zTabName = pFrom->zAlias; + const char *zSchemaName = 0; + int iDb; + if( zTabName==0 ){ + zTabName = pTab->zName; + } + if( db->mallocFailed ) break; + if( pSub==0 || (pSub->selFlags & SF_NestedFrom)==0 ){ + pSub = 0; + if( zTName && sqlite3StrICmp(zTName, zTabName)!=0 ){ + continue; + } + iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + zSchemaName = iDb>=0 ? db->aDb[iDb].zDbSName : "*"; + } + for(j=0; jnCol; j++){ + char *zName = pTab->aCol[j].zName; + char *zColname; /* The computed column name */ + char *zToFree; /* Malloced string that needs to be freed */ + Token sColname; /* Computed column name as a token */ + + assert( zName ); + if( zTName && pSub + && sqlite3MatchSpanName(pSub->pEList->a[j].zSpan, 0, zTName, 0)==0 + ){ + continue; + } + + /* If a column is marked as 'hidden', omit it from the expanded + ** result-set list unless the SELECT has the SF_IncludeHidden + ** bit set. + */ + if( (p->selFlags & SF_IncludeHidden)==0 + && IsHiddenColumn(&pTab->aCol[j]) + ){ + continue; + } + tableSeen = 1; + + if( i>0 && zTName==0 ){ + if( (pFrom->fg.jointype & JT_NATURAL)!=0 + && tableAndColumnIndex(pTabList, i, zName, 0, 0) + ){ + /* In a NATURAL join, omit the join columns from the + ** table to the right of the join */ + continue; + } + 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; + } + } + pRight = sqlite3Expr(db, TK_ID, zName); + zColname = zName; + zToFree = 0; + if( longNames || pTabList->nSrc>1 ){ + Expr *pLeft; + pLeft = sqlite3Expr(db, TK_ID, zTabName); + pExpr = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight, 0); + if( zSchemaName ){ + pLeft = sqlite3Expr(db, TK_ID, zSchemaName); + pExpr = sqlite3PExpr(pParse, TK_DOT, pLeft, pExpr, 0); + } + if( longNames ){ + zColname = sqlite3MPrintf(db, "%s.%s", zTabName, zName); + zToFree = zColname; + } + }else{ + pExpr = pRight; + } + pNew = sqlite3ExprListAppend(pParse, pNew, pExpr); + sqlite3TokenInit(&sColname, zColname); + sqlite3ExprListSetName(pParse, pNew, &sColname, 0); + if( pNew && (p->selFlags & SF_NestedFrom)!=0 ){ + struct ExprList_item *pX = &pNew->a[pNew->nExpr-1]; + if( pSub ){ + pX->zSpan = sqlite3DbStrDup(db, pSub->pEList->a[j].zSpan); + testcase( pX->zSpan==0 ); + }else{ + pX->zSpan = sqlite3MPrintf(db, "%s.%s.%s", + zSchemaName, zTabName, zColname); + testcase( pX->zSpan==0 ); + } + pX->bSpanIsTab = 1; + } + sqlite3DbFree(db, zToFree); + } + } + if( !tableSeen ){ + if( zTName ){ + sqlite3ErrorMsg(pParse, "no such table: %s", zTName); + }else{ + sqlite3ErrorMsg(pParse, "no tables specified"); + } + } + } + } + sqlite3ExprListDelete(db, pEList); + p->pEList = pNew; + } +#if SQLITE_MAX_COLUMN + if( p->pEList && p->pEList->nExpr>db->aLimit[SQLITE_LIMIT_COLUMN] ){ + sqlite3ErrorMsg(pParse, "too many columns in result set"); + return WRC_Abort; + } +#endif + return WRC_Continue; +} + +/* +** No-op routine for the parse-tree walker. +** +** When this routine is the Walker.xExprCallback then expression trees +** are walked without any actions being taken at each node. Presumably, +** when this routine is used for Walker.xExprCallback then +** Walker.xSelectCallback is set to do something useful for every +** subquery in the parser tree. +*/ +SQLITE_PRIVATE int sqlite3ExprWalkNoop(Walker *NotUsed, Expr *NotUsed2){ + UNUSED_PARAMETER2(NotUsed, NotUsed2); + return WRC_Continue; +} + +/* +** This routine "expands" a SELECT statement and all of its subqueries. +** For additional information on what it means to "expand" a SELECT +** statement, see the comment on the selectExpand worker callback above. +** +** Expanding a SELECT statement is the first step in processing a +** SELECT statement. The SELECT statement must be expanded before +** name resolution is performed. +** +** If anything goes wrong, an error message is written into pParse. +** The calling function can detect the problem by looking at pParse->nErr +** and/or pParse->db->mallocFailed. +*/ +static void sqlite3SelectExpand(Parse *pParse, Select *pSelect){ + Walker w; + memset(&w, 0, sizeof(w)); + w.xExprCallback = sqlite3ExprWalkNoop; + w.pParse = pParse; + if( pParse->hasCompound ){ + w.xSelectCallback = convertCompoundSelectToSubquery; + sqlite3WalkSelect(&w, pSelect); + } + w.xSelectCallback = selectExpander; + if( (pSelect->selFlags & SF_MultiValue)==0 ){ + w.xSelectCallback2 = selectPopWith; + } + sqlite3WalkSelect(&w, pSelect); +} + + +#ifndef SQLITE_OMIT_SUBQUERY +/* +** This is a Walker.xSelectCallback callback for the sqlite3SelectTypeInfo() +** interface. +** +** For each FROM-clause subquery, add Column.zType and Column.zColl +** information to the Table structure that represents the result set +** of that subquery. +** +** The Table structure that represents the result set was constructed +** by selectExpander() but the type and collation information was omitted +** at that point because identifiers had not yet been resolved. This +** routine is called after identifier resolution. +*/ +static void selectAddSubqueryTypeInfo(Walker *pWalker, Select *p){ + Parse *pParse; + int i; + SrcList *pTabList; + struct SrcList_item *pFrom; + + assert( p->selFlags & SF_Resolved ); + assert( (p->selFlags & SF_HasTypeInfo)==0 ); + p->selFlags |= SF_HasTypeInfo; + pParse = pWalker->pParse; + pTabList = p->pSrc; + for(i=0, pFrom=pTabList->a; inSrc; i++, pFrom++){ + Table *pTab = pFrom->pTab; + assert( pTab!=0 ); + if( (pTab->tabFlags & TF_Ephemeral)!=0 ){ + /* A sub-query in the FROM clause of a SELECT */ + Select *pSel = pFrom->pSelect; + if( pSel ){ + while( pSel->pPrior ) pSel = pSel->pPrior; + sqlite3SelectAddColumnTypeAndCollation(pParse, pTab, pSel); + } + } + } +} +#endif + + +/* +** This routine adds datatype and collating sequence information to +** the Table structures of all FROM-clause subqueries in a +** SELECT statement. +** +** Use this routine after name resolution. +*/ +static void sqlite3SelectAddTypeInfo(Parse *pParse, Select *pSelect){ +#ifndef SQLITE_OMIT_SUBQUERY + Walker w; + memset(&w, 0, sizeof(w)); + w.xSelectCallback2 = selectAddSubqueryTypeInfo; + w.xExprCallback = sqlite3ExprWalkNoop; + w.pParse = pParse; + sqlite3WalkSelect(&w, pSelect); +#endif +} + + +/* +** This routine sets up a SELECT statement for processing. The +** following is accomplished: +** +** * VDBE Cursor numbers are assigned to all FROM-clause terms. +** * Ephemeral Table objects are created for all FROM-clause subqueries. +** * ON and USING clauses are shifted into WHERE statements +** * Wildcards "*" and "TABLE.*" in result sets are expanded. +** * Identifiers in expression are matched to tables. +** +** This routine acts recursively on all subqueries within the SELECT. +*/ +SQLITE_PRIVATE void sqlite3SelectPrep( + Parse *pParse, /* The parser context */ + Select *p, /* The SELECT statement being coded. */ + NameContext *pOuterNC /* Name context for container */ +){ + sqlite3 *db; + if( NEVER(p==0) ) return; + db = pParse->db; + if( db->mallocFailed ) return; + if( p->selFlags & SF_HasTypeInfo ) return; + sqlite3SelectExpand(pParse, p); + if( pParse->nErr || db->mallocFailed ) return; + sqlite3ResolveSelectNames(pParse, p, pOuterNC); + if( pParse->nErr || db->mallocFailed ) return; + sqlite3SelectAddTypeInfo(pParse, p); +} + +/* +** Reset the aggregate accumulator. +** +** The aggregate accumulator is a set of memory cells that hold +** intermediate results while calculating an aggregate. This +** routine generates code that stores NULLs in all of those memory +** cells. +*/ +static void resetAccumulator(Parse *pParse, AggInfo *pAggInfo){ + Vdbe *v = pParse->pVdbe; + int i; + struct AggInfo_func *pFunc; + int nReg = pAggInfo->nFunc + pAggInfo->nColumn; + if( nReg==0 ) return; +#ifdef SQLITE_DEBUG + /* Verify that all AggInfo registers are within the range specified by + ** AggInfo.mnReg..AggInfo.mxReg */ + assert( nReg==pAggInfo->mxReg-pAggInfo->mnReg+1 ); + for(i=0; inColumn; i++){ + assert( pAggInfo->aCol[i].iMem>=pAggInfo->mnReg + && pAggInfo->aCol[i].iMem<=pAggInfo->mxReg ); + } + for(i=0; inFunc; i++){ + assert( pAggInfo->aFunc[i].iMem>=pAggInfo->mnReg + && pAggInfo->aFunc[i].iMem<=pAggInfo->mxReg ); + } +#endif + sqlite3VdbeAddOp3(v, OP_Null, 0, pAggInfo->mnReg, pAggInfo->mxReg); + for(pFunc=pAggInfo->aFunc, i=0; inFunc; i++, pFunc++){ + if( pFunc->iDistinct>=0 ){ + Expr *pE = pFunc->pExpr; + assert( !ExprHasProperty(pE, EP_xIsSelect) ); + if( pE->x.pList==0 || pE->x.pList->nExpr!=1 ){ + sqlite3ErrorMsg(pParse, "DISTINCT aggregates must have exactly one " + "argument"); + pFunc->iDistinct = -1; + }else{ + KeyInfo *pKeyInfo = keyInfoFromExprList(pParse, pE->x.pList, 0, 0); + sqlite3VdbeAddOp4(v, OP_OpenEphemeral, pFunc->iDistinct, 0, 0, + (char*)pKeyInfo, P4_KEYINFO); + } + } + } +} + +/* +** Invoke the OP_AggFinalize opcode for every aggregate function +** in the AggInfo structure. +*/ +static void finalizeAggFunctions(Parse *pParse, AggInfo *pAggInfo){ + Vdbe *v = pParse->pVdbe; + int i; + struct AggInfo_func *pF; + for(i=0, pF=pAggInfo->aFunc; inFunc; i++, pF++){ + ExprList *pList = pF->pExpr->x.pList; + assert( !ExprHasProperty(pF->pExpr, EP_xIsSelect) ); + sqlite3VdbeAddOp4(v, OP_AggFinal, pF->iMem, pList ? pList->nExpr : 0, 0, + (void*)pF->pFunc, P4_FUNCDEF); + } +} + +/* +** Update the accumulator memory cells for an aggregate based on +** the current cursor position. +*/ +static void updateAccumulator(Parse *pParse, AggInfo *pAggInfo){ + Vdbe *v = pParse->pVdbe; + int i; + int regHit = 0; + int addrHitTest = 0; + struct AggInfo_func *pF; + struct AggInfo_col *pC; + + pAggInfo->directMode = 1; + for(i=0, pF=pAggInfo->aFunc; inFunc; i++, pF++){ + int nArg; + int addrNext = 0; + int regAgg; + ExprList *pList = pF->pExpr->x.pList; + assert( !ExprHasProperty(pF->pExpr, EP_xIsSelect) ); + if( pList ){ + nArg = pList->nExpr; + regAgg = sqlite3GetTempRange(pParse, nArg); + sqlite3ExprCodeExprList(pParse, pList, regAgg, 0, SQLITE_ECEL_DUP); + }else{ + nArg = 0; + regAgg = 0; + } + if( pF->iDistinct>=0 ){ + addrNext = sqlite3VdbeMakeLabel(v); + testcase( nArg==0 ); /* Error condition */ + testcase( nArg>1 ); /* Also an error */ + codeDistinct(pParse, pF->iDistinct, addrNext, 1, regAgg); + } + if( pF->pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL ){ + CollSeq *pColl = 0; + struct ExprList_item *pItem; + int j; + assert( pList!=0 ); /* pList!=0 if pF->pFunc has NEEDCOLL */ + for(j=0, pItem=pList->a; !pColl && jpExpr); + } + if( !pColl ){ + pColl = pParse->db->pDfltColl; + } + if( regHit==0 && pAggInfo->nAccumulator ) regHit = ++pParse->nMem; + sqlite3VdbeAddOp4(v, OP_CollSeq, regHit, 0, 0, (char *)pColl, P4_COLLSEQ); + } + sqlite3VdbeAddOp4(v, OP_AggStep0, 0, regAgg, pF->iMem, + (void*)pF->pFunc, P4_FUNCDEF); + sqlite3VdbeChangeP5(v, (u8)nArg); + sqlite3ExprCacheAffinityChange(pParse, regAgg, nArg); + sqlite3ReleaseTempRange(pParse, regAgg, nArg); + if( addrNext ){ + sqlite3VdbeResolveLabel(v, addrNext); + sqlite3ExprCacheClear(pParse); + } + } + + /* Before populating the accumulator registers, clear the column cache. + ** Otherwise, if any of the required column values are already present + ** in registers, sqlite3ExprCode() may use OP_SCopy to copy the value + ** to pC->iMem. But by the time the value is used, the original register + ** may have been used, invalidating the underlying buffer holding the + ** text or blob value. See ticket [883034dcb5]. + ** + ** Another solution would be to change the OP_SCopy used to copy cached + ** values to an OP_Copy. + */ + if( regHit ){ + addrHitTest = sqlite3VdbeAddOp1(v, OP_If, regHit); VdbeCoverage(v); + } + sqlite3ExprCacheClear(pParse); + for(i=0, pC=pAggInfo->aCol; inAccumulator; i++, pC++){ + sqlite3ExprCode(pParse, pC->pExpr, pC->iMem); + } + pAggInfo->directMode = 0; + sqlite3ExprCacheClear(pParse); + if( addrHitTest ){ + sqlite3VdbeJumpHere(v, addrHitTest); + } +} + +/* +** Add a single OP_Explain instruction to the VDBE to explain a simple +** count(*) query ("SELECT count(*) FROM pTab"). +*/ +#ifndef SQLITE_OMIT_EXPLAIN +static void explainSimpleCount( + Parse *pParse, /* Parse context */ + Table *pTab, /* Table being queried */ + Index *pIdx /* Index used to optimize scan, or NULL */ +){ + if( pParse->explain==2 ){ + int bCover = (pIdx!=0 && (HasRowid(pTab) || !IsPrimaryKeyIndex(pIdx))); + char *zEqp = sqlite3MPrintf(pParse->db, "SCAN TABLE %s%s%s", + pTab->zName, + bCover ? " USING COVERING INDEX " : "", + bCover ? pIdx->zName : "" + ); + sqlite3VdbeAddOp4( + pParse->pVdbe, OP_Explain, pParse->iSelectId, 0, 0, zEqp, P4_DYNAMIC + ); + } +} +#else +# define explainSimpleCount(a,b,c) +#endif + +/* +** Generate code for the SELECT statement given in the p argument. +** +** The results are returned according to the SelectDest structure. +** See comments in sqliteInt.h for further information. +** +** This routine returns the number of errors. If any errors are +** encountered, then an appropriate error message is left in +** pParse->zErrMsg. +** +** This routine does NOT free the Select structure passed in. The +** calling function needs to do that. +*/ +SQLITE_PRIVATE int sqlite3Select( + Parse *pParse, /* The parser context */ + Select *p, /* The SELECT statement being coded. */ + SelectDest *pDest /* What to do with the query results */ +){ + int i, j; /* Loop counters */ + WhereInfo *pWInfo; /* Return from sqlite3WhereBegin() */ + Vdbe *v; /* The virtual machine under construction */ + int isAgg; /* True for select lists like "count(*)" */ + ExprList *pEList = 0; /* List of columns to extract. */ + SrcList *pTabList; /* List of tables to select from */ + Expr *pWhere; /* The WHERE clause. May be NULL */ + ExprList *pGroupBy; /* The GROUP BY clause. May be NULL */ + Expr *pHaving; /* The HAVING clause. May be NULL */ + int rc = 1; /* Value to return from this function */ + DistinctCtx sDistinct; /* Info on how to code the DISTINCT keyword */ + SortCtx sSort; /* Info on how to code the ORDER BY clause */ + AggInfo sAggInfo; /* Information used by aggregate queries */ + int iEnd; /* Address of the end of the query */ + sqlite3 *db; /* The database connection */ + +#ifndef SQLITE_OMIT_EXPLAIN + int iRestoreSelectId = pParse->iSelectId; + pParse->iSelectId = pParse->iNextSelectId++; +#endif + + db = pParse->db; + if( p==0 || db->mallocFailed || pParse->nErr ){ + return 1; + } + if( sqlite3AuthCheck(pParse, SQLITE_SELECT, 0, 0, 0) ) return 1; + memset(&sAggInfo, 0, sizeof(sAggInfo)); +#if SELECTTRACE_ENABLED + pParse->nSelectIndent++; + SELECTTRACE(1,pParse,p, ("begin processing:\n")); + if( sqlite3SelectTrace & 0x100 ){ + sqlite3TreeViewSelect(0, p, 0); + } +#endif + + assert( p->pOrderBy==0 || pDest->eDest!=SRT_DistFifo ); + assert( p->pOrderBy==0 || pDest->eDest!=SRT_Fifo ); + assert( p->pOrderBy==0 || pDest->eDest!=SRT_DistQueue ); + assert( p->pOrderBy==0 || pDest->eDest!=SRT_Queue ); + if( IgnorableOrderby(pDest) ){ + assert(pDest->eDest==SRT_Exists || pDest->eDest==SRT_Union || + pDest->eDest==SRT_Except || pDest->eDest==SRT_Discard || + pDest->eDest==SRT_Queue || pDest->eDest==SRT_DistFifo || + pDest->eDest==SRT_DistQueue || pDest->eDest==SRT_Fifo); + /* If ORDER BY makes no difference in the output then neither does + ** DISTINCT so it can be removed too. */ + sqlite3ExprListDelete(db, p->pOrderBy); + p->pOrderBy = 0; + p->selFlags &= ~SF_Distinct; + } + sqlite3SelectPrep(pParse, p, 0); + memset(&sSort, 0, sizeof(sSort)); + sSort.pOrderBy = p->pOrderBy; + pTabList = p->pSrc; + if( pParse->nErr || db->mallocFailed ){ + goto select_end; + } + assert( p->pEList!=0 ); + isAgg = (p->selFlags & SF_Aggregate)!=0; +#if SELECTTRACE_ENABLED + if( sqlite3SelectTrace & 0x100 ){ + SELECTTRACE(0x100,pParse,p, ("after name resolution:\n")); + sqlite3TreeViewSelect(0, p, 0); + } +#endif + + /* Try to flatten subqueries in the FROM clause up into the main query + */ +#if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) + for(i=0; !p->pPrior && inSrc; i++){ + struct SrcList_item *pItem = &pTabList->a[i]; + Select *pSub = pItem->pSelect; + int isAggSub; + Table *pTab = pItem->pTab; + if( pSub==0 ) continue; + + /* Catch mismatch in the declared columns of a view and the number of + ** columns in the SELECT on the RHS */ + if( pTab->nCol!=pSub->pEList->nExpr ){ + sqlite3ErrorMsg(pParse, "expected %d columns for '%s' but got %d", + pTab->nCol, pTab->zName, pSub->pEList->nExpr); + goto select_end; + } + + isAggSub = (pSub->selFlags & SF_Aggregate)!=0; + if( flattenSubquery(pParse, p, i, isAgg, isAggSub) ){ + /* This subquery can be absorbed into its parent. */ + if( isAggSub ){ + isAgg = 1; + p->selFlags |= SF_Aggregate; + } + i = -1; + } + pTabList = p->pSrc; + if( db->mallocFailed ) goto select_end; + if( !IgnorableOrderby(pDest) ){ + sSort.pOrderBy = p->pOrderBy; + } + } +#endif + + /* Get a pointer the VDBE under construction, allocating a new VDBE if one + ** does not already exist */ + v = sqlite3GetVdbe(pParse); + if( v==0 ) goto select_end; + +#ifndef SQLITE_OMIT_COMPOUND_SELECT + /* Handle compound SELECT statements using the separate multiSelect() + ** procedure. + */ + if( p->pPrior ){ + rc = multiSelect(pParse, p, pDest); + explainSetInteger(pParse->iSelectId, iRestoreSelectId); +#if SELECTTRACE_ENABLED + SELECTTRACE(1,pParse,p,("end compound-select processing\n")); + pParse->nSelectIndent--; +#endif + return rc; + } +#endif + + /* Generate code for all sub-queries in the FROM clause + */ +#if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) + for(i=0; inSrc; i++){ + struct SrcList_item *pItem = &pTabList->a[i]; + SelectDest dest; + Select *pSub = pItem->pSelect; + if( pSub==0 ) continue; + + /* Sometimes the code for a subquery will be generated more than + ** once, if the subquery is part of the WHERE clause in a LEFT JOIN, + ** for example. In that case, do not regenerate the code to manifest + ** a view or the co-routine to implement a view. The first instance + ** is sufficient, though the subroutine to manifest the view does need + ** to be invoked again. */ + if( pItem->addrFillSub ){ + if( pItem->fg.viaCoroutine==0 ){ + sqlite3VdbeAddOp2(v, OP_Gosub, pItem->regReturn, pItem->addrFillSub); + } + continue; + } + + /* Increment Parse.nHeight by the height of the largest expression + ** tree referred to by this, the parent select. The child select + ** may contain expression trees of at most + ** (SQLITE_MAX_EXPR_DEPTH-Parse.nHeight) height. This is a bit + ** more conservative than necessary, but much easier than enforcing + ** an exact limit. + */ + pParse->nHeight += sqlite3SelectExprHeight(p); + + /* Make copies of constant WHERE-clause terms in the outer query down + ** inside the subquery. This can help the subquery to run more efficiently. + */ + if( (pItem->fg.jointype & JT_OUTER)==0 + && pushDownWhereTerms(db, pSub, p->pWhere, pItem->iCursor) + ){ +#if SELECTTRACE_ENABLED + if( sqlite3SelectTrace & 0x100 ){ + SELECTTRACE(0x100,pParse,p,("After WHERE-clause push-down:\n")); + sqlite3TreeViewSelect(0, p, 0); + } +#endif + } + + /* Generate code to implement the subquery + ** + ** The subquery is implemented as a co-routine if all of these are true: + ** (1) The subquery is guaranteed to be the outer loop (so that it + ** does not need to be computed more than once) + ** (2) The ALL keyword after SELECT is omitted. (Applications are + ** allowed to say "SELECT ALL" instead of just "SELECT" to disable + ** the use of co-routines.) + ** (3) Co-routines are not disabled using sqlite3_test_control() + ** with SQLITE_TESTCTRL_OPTIMIZATIONS. + ** + ** TODO: Are there other reasons beside (1) to use a co-routine + ** implementation? + */ + if( i==0 + && (pTabList->nSrc==1 + || (pTabList->a[1].fg.jointype&(JT_LEFT|JT_CROSS))!=0) /* (1) */ + && (p->selFlags & SF_All)==0 /* (2) */ + && OptimizationEnabled(db, SQLITE_SubqCoroutine) /* (3) */ + ){ + /* Implement a co-routine that will return a single row of the result + ** set on each invocation. + */ + int addrTop = sqlite3VdbeCurrentAddr(v)+1; + pItem->regReturn = ++pParse->nMem; + sqlite3VdbeAddOp3(v, OP_InitCoroutine, pItem->regReturn, 0, addrTop); + VdbeComment((v, "%s", pItem->pTab->zName)); + pItem->addrFillSub = addrTop; + sqlite3SelectDestInit(&dest, SRT_Coroutine, pItem->regReturn); + explainSetInteger(pItem->iSelectId, (u8)pParse->iNextSelectId); + sqlite3Select(pParse, pSub, &dest); + pItem->pTab->nRowLogEst = pSub->nSelectRow; + pItem->fg.viaCoroutine = 1; + pItem->regResult = dest.iSdst; + sqlite3VdbeEndCoroutine(v, pItem->regReturn); + sqlite3VdbeJumpHere(v, addrTop-1); + sqlite3ClearTempRegCache(pParse); + }else{ + /* Generate a subroutine that will fill an ephemeral table with + ** the content of this subquery. pItem->addrFillSub will point + ** to the address of the generated subroutine. pItem->regReturn + ** is a register allocated to hold the subroutine return address + */ + int topAddr; + int onceAddr = 0; + int retAddr; + assert( pItem->addrFillSub==0 ); + pItem->regReturn = ++pParse->nMem; + topAddr = sqlite3VdbeAddOp2(v, OP_Integer, 0, pItem->regReturn); + pItem->addrFillSub = topAddr+1; + if( pItem->fg.isCorrelated==0 ){ + /* If the subquery is not correlated and if we are not inside of + ** a trigger, then we only need to compute the value of the subquery + ** once. */ + onceAddr = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); + VdbeComment((v, "materialize \"%s\"", pItem->pTab->zName)); + }else{ + VdbeNoopComment((v, "materialize \"%s\"", pItem->pTab->zName)); + } + sqlite3SelectDestInit(&dest, SRT_EphemTab, pItem->iCursor); + explainSetInteger(pItem->iSelectId, (u8)pParse->iNextSelectId); + sqlite3Select(pParse, pSub, &dest); + pItem->pTab->nRowLogEst = pSub->nSelectRow; + if( onceAddr ) sqlite3VdbeJumpHere(v, onceAddr); + retAddr = sqlite3VdbeAddOp1(v, OP_Return, pItem->regReturn); + VdbeComment((v, "end %s", pItem->pTab->zName)); + sqlite3VdbeChangeP1(v, topAddr, retAddr); + sqlite3ClearTempRegCache(pParse); + } + if( db->mallocFailed ) goto select_end; + pParse->nHeight -= sqlite3SelectExprHeight(p); + } +#endif + + /* Various elements of the SELECT copied into local variables for + ** convenience */ + pEList = p->pEList; + pWhere = p->pWhere; + pGroupBy = p->pGroupBy; + pHaving = p->pHaving; + sDistinct.isTnct = (p->selFlags & SF_Distinct)!=0; + +#if SELECTTRACE_ENABLED + if( sqlite3SelectTrace & 0x400 ){ + SELECTTRACE(0x400,pParse,p,("After all FROM-clause analysis:\n")); + sqlite3TreeViewSelect(0, p, 0); + } +#endif + + /* If the query is DISTINCT with an ORDER BY but is not an aggregate, and + ** if the select-list is the same as the ORDER BY list, then this query + ** can be rewritten as a GROUP BY. In other words, this: + ** + ** SELECT DISTINCT xyz FROM ... ORDER BY xyz + ** + ** is transformed to: + ** + ** SELECT xyz FROM ... GROUP BY xyz ORDER BY xyz + ** + ** The second form is preferred as a single index (or temp-table) may be + ** used for both the ORDER BY and DISTINCT processing. As originally + ** written the query must use a temp-table for at least one of the ORDER + ** BY and DISTINCT, and an index or separate temp-table for the other. + */ + if( (p->selFlags & (SF_Distinct|SF_Aggregate))==SF_Distinct + && sqlite3ExprListCompare(sSort.pOrderBy, pEList, -1)==0 + ){ + p->selFlags &= ~SF_Distinct; + pGroupBy = p->pGroupBy = sqlite3ExprListDup(db, pEList, 0); + /* Notice that even thought SF_Distinct has been cleared from p->selFlags, + ** the sDistinct.isTnct is still set. Hence, isTnct represents the + ** original setting of the SF_Distinct flag, not the current setting */ + assert( sDistinct.isTnct ); + +#if SELECTTRACE_ENABLED + if( sqlite3SelectTrace & 0x400 ){ + SELECTTRACE(0x400,pParse,p,("Transform DISTINCT into GROUP BY:\n")); + sqlite3TreeViewSelect(0, p, 0); + } +#endif + } + + /* If there is an ORDER BY clause, then create an ephemeral index to + ** do the sorting. But this sorting ephemeral index might end up + ** being unused if the data can be extracted in pre-sorted order. + ** If that is the case, then the OP_OpenEphemeral instruction will be + ** changed to an OP_Noop once we figure out that the sorting index is + ** not needed. The sSort.addrSortIndex variable is used to facilitate + ** that change. + */ + if( sSort.pOrderBy ){ + KeyInfo *pKeyInfo; + pKeyInfo = keyInfoFromExprList(pParse, sSort.pOrderBy, 0, pEList->nExpr); + sSort.iECursor = pParse->nTab++; + sSort.addrSortIndex = + sqlite3VdbeAddOp4(v, OP_OpenEphemeral, + sSort.iECursor, sSort.pOrderBy->nExpr+1+pEList->nExpr, 0, + (char*)pKeyInfo, P4_KEYINFO + ); + }else{ + sSort.addrSortIndex = -1; + } + + /* If the output is destined for a temporary table, open that table. + */ + if( pDest->eDest==SRT_EphemTab ){ + sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pDest->iSDParm, pEList->nExpr); + } + + /* Set the limiter. + */ + iEnd = sqlite3VdbeMakeLabel(v); + p->nSelectRow = 320; /* 4 billion rows */ + computeLimitRegisters(pParse, p, iEnd); + if( p->iLimit==0 && sSort.addrSortIndex>=0 ){ + sqlite3VdbeChangeOpcode(v, sSort.addrSortIndex, OP_SorterOpen); + sSort.sortFlags |= SORTFLAG_UseSorter; + } + + /* Open an ephemeral index to use for the distinct set. + */ + if( p->selFlags & SF_Distinct ){ + sDistinct.tabTnct = pParse->nTab++; + sDistinct.addrTnct = sqlite3VdbeAddOp4(v, OP_OpenEphemeral, + sDistinct.tabTnct, 0, 0, + (char*)keyInfoFromExprList(pParse, p->pEList,0,0), + P4_KEYINFO); + sqlite3VdbeChangeP5(v, BTREE_UNORDERED); + sDistinct.eTnctType = WHERE_DISTINCT_UNORDERED; + }else{ + sDistinct.eTnctType = WHERE_DISTINCT_NOOP; + } + + if( !isAgg && pGroupBy==0 ){ + /* No aggregate functions and no GROUP BY clause */ + u16 wctrlFlags = (sDistinct.isTnct ? WHERE_WANT_DISTINCT : 0); + assert( WHERE_USE_LIMIT==SF_FixedLimit ); + wctrlFlags |= p->selFlags & SF_FixedLimit; + + /* Begin the database scan. */ + pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, sSort.pOrderBy, + p->pEList, wctrlFlags, p->nSelectRow); + if( pWInfo==0 ) goto select_end; + if( sqlite3WhereOutputRowCount(pWInfo) < p->nSelectRow ){ + p->nSelectRow = sqlite3WhereOutputRowCount(pWInfo); + } + if( sDistinct.isTnct && sqlite3WhereIsDistinct(pWInfo) ){ + sDistinct.eTnctType = sqlite3WhereIsDistinct(pWInfo); + } + if( sSort.pOrderBy ){ + sSort.nOBSat = sqlite3WhereIsOrdered(pWInfo); + sSort.bOrderedInnerLoop = sqlite3WhereOrderedInnerLoop(pWInfo); + if( sSort.nOBSat==sSort.pOrderBy->nExpr ){ + sSort.pOrderBy = 0; + } + } + + /* If sorting index that was created by a prior OP_OpenEphemeral + ** instruction ended up not being needed, then change the OP_OpenEphemeral + ** into an OP_Noop. + */ + if( sSort.addrSortIndex>=0 && sSort.pOrderBy==0 ){ + sqlite3VdbeChangeToNoop(v, sSort.addrSortIndex); + } + + /* Use the standard inner loop. */ + selectInnerLoop(pParse, p, pEList, -1, &sSort, &sDistinct, pDest, + sqlite3WhereContinueLabel(pWInfo), + sqlite3WhereBreakLabel(pWInfo)); + + /* End the database scan loop. + */ + sqlite3WhereEnd(pWInfo); + }else{ + /* This case when there exist aggregate functions or a GROUP BY clause + ** or both */ + NameContext sNC; /* Name context for processing aggregate information */ + int iAMem; /* First Mem address for storing current GROUP BY */ + int iBMem; /* First Mem address for previous GROUP BY */ + int iUseFlag; /* Mem address holding flag indicating that at least + ** one row of the input to the aggregator has been + ** processed */ + int iAbortFlag; /* Mem address which causes query abort if positive */ + int groupBySort; /* Rows come from source in GROUP BY order */ + int addrEnd; /* End of processing for this SELECT */ + int sortPTab = 0; /* Pseudotable used to decode sorting results */ + int sortOut = 0; /* Output register from the sorter */ + int orderByGrp = 0; /* True if the GROUP BY and ORDER BY are the same */ + + /* Remove any and all aliases between the result set and the + ** GROUP BY clause. + */ + if( pGroupBy ){ + int k; /* Loop counter */ + struct ExprList_item *pItem; /* For looping over expression in a list */ + + for(k=p->pEList->nExpr, pItem=p->pEList->a; k>0; k--, pItem++){ + pItem->u.x.iAlias = 0; + } + for(k=pGroupBy->nExpr, pItem=pGroupBy->a; k>0; k--, pItem++){ + pItem->u.x.iAlias = 0; + } + assert( 66==sqlite3LogEst(100) ); + if( p->nSelectRow>66 ) p->nSelectRow = 66; + }else{ + assert( 0==sqlite3LogEst(1) ); + p->nSelectRow = 0; + } + + /* If there is both a GROUP BY and an ORDER BY clause and they are + ** identical, then it may be possible to disable the ORDER BY clause + ** on the grounds that the GROUP BY will cause elements to come out + ** in the correct order. It also may not - the GROUP BY might use a + ** database index that causes rows to be grouped together as required + ** but not actually sorted. Either way, record the fact that the + ** ORDER BY and GROUP BY clauses are the same by setting the orderByGrp + ** variable. */ + if( sqlite3ExprListCompare(pGroupBy, sSort.pOrderBy, -1)==0 ){ + orderByGrp = 1; + } + + /* Create a label to jump to when we want to abort the query */ + addrEnd = sqlite3VdbeMakeLabel(v); + + /* Convert TK_COLUMN nodes into TK_AGG_COLUMN and make entries in + ** sAggInfo for all TK_AGG_FUNCTION nodes in expressions of the + ** SELECT statement. + */ + memset(&sNC, 0, sizeof(sNC)); + sNC.pParse = pParse; + sNC.pSrcList = pTabList; + sNC.pAggInfo = &sAggInfo; + sAggInfo.mnReg = pParse->nMem+1; + sAggInfo.nSortingColumn = pGroupBy ? pGroupBy->nExpr : 0; + sAggInfo.pGroupBy = pGroupBy; + sqlite3ExprAnalyzeAggList(&sNC, pEList); + sqlite3ExprAnalyzeAggList(&sNC, sSort.pOrderBy); + if( pHaving ){ + sqlite3ExprAnalyzeAggregates(&sNC, pHaving); + } + sAggInfo.nAccumulator = sAggInfo.nColumn; + for(i=0; ix.pList); + sNC.ncFlags &= ~NC_InAggFunc; + } + sAggInfo.mxReg = pParse->nMem; + if( db->mallocFailed ) goto select_end; + + /* Processing for aggregates with GROUP BY is very different and + ** much more complex than aggregates without a GROUP BY. + */ + if( pGroupBy ){ + KeyInfo *pKeyInfo; /* Keying information for the group by clause */ + int addr1; /* A-vs-B comparision jump */ + int addrOutputRow; /* Start of subroutine that outputs a result row */ + int regOutputRow; /* Return address register for output subroutine */ + int addrSetAbort; /* Set the abort flag and return */ + int addrTopOfLoop; /* Top of the input loop */ + int addrSortingIdx; /* The OP_OpenEphemeral for the sorting index */ + int addrReset; /* Subroutine for resetting the accumulator */ + int regReset; /* Return address register for reset subroutine */ + + /* If there is a GROUP BY clause we might need a sorting index to + ** implement it. Allocate that sorting index now. If it turns out + ** that we do not need it after all, the OP_SorterOpen instruction + ** will be converted into a Noop. + */ + sAggInfo.sortingIdx = pParse->nTab++; + pKeyInfo = keyInfoFromExprList(pParse, pGroupBy, 0, sAggInfo.nColumn); + addrSortingIdx = sqlite3VdbeAddOp4(v, OP_SorterOpen, + sAggInfo.sortingIdx, sAggInfo.nSortingColumn, + 0, (char*)pKeyInfo, P4_KEYINFO); + + /* Initialize memory locations used by GROUP BY aggregate processing + */ + iUseFlag = ++pParse->nMem; + iAbortFlag = ++pParse->nMem; + regOutputRow = ++pParse->nMem; + addrOutputRow = sqlite3VdbeMakeLabel(v); + regReset = ++pParse->nMem; + addrReset = sqlite3VdbeMakeLabel(v); + iAMem = pParse->nMem + 1; + pParse->nMem += pGroupBy->nExpr; + iBMem = pParse->nMem + 1; + pParse->nMem += pGroupBy->nExpr; + sqlite3VdbeAddOp2(v, OP_Integer, 0, iAbortFlag); + VdbeComment((v, "clear abort flag")); + sqlite3VdbeAddOp2(v, OP_Integer, 0, iUseFlag); + VdbeComment((v, "indicate accumulator empty")); + sqlite3VdbeAddOp3(v, OP_Null, 0, iAMem, iAMem+pGroupBy->nExpr-1); + + /* Begin a loop that will extract all source rows in GROUP BY order. + ** This might involve two separate loops with an OP_Sort in between, or + ** it might be a single loop that uses an index to extract information + ** in the right order to begin with. + */ + sqlite3VdbeAddOp2(v, OP_Gosub, regReset, addrReset); + pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, pGroupBy, 0, + WHERE_GROUPBY | (orderByGrp ? WHERE_SORTBYGROUP : 0), 0 + ); + if( pWInfo==0 ) goto select_end; + if( sqlite3WhereIsOrdered(pWInfo)==pGroupBy->nExpr ){ + /* The optimizer is able to deliver rows in group by order so + ** we do not have to sort. The OP_OpenEphemeral table will be + ** cancelled later because we still need to use the pKeyInfo + */ + groupBySort = 0; + }else{ + /* Rows are coming out in undetermined order. We have to push + ** each row into a sorting index, terminate the first loop, + ** then loop over the sorting index in order to get the output + ** in sorted order + */ + int regBase; + int regRecord; + int nCol; + int nGroupBy; + + explainTempTable(pParse, + (sDistinct.isTnct && (p->selFlags&SF_Distinct)==0) ? + "DISTINCT" : "GROUP BY"); + + groupBySort = 1; + nGroupBy = pGroupBy->nExpr; + nCol = nGroupBy; + j = nGroupBy; + for(i=0; i=j ){ + nCol++; + j++; + } + } + regBase = sqlite3GetTempRange(pParse, nCol); + sqlite3ExprCacheClear(pParse); + sqlite3ExprCodeExprList(pParse, pGroupBy, regBase, 0, 0); + j = nGroupBy; + for(i=0; iiSorterColumn>=j ){ + int r1 = j + regBase; + sqlite3ExprCodeGetColumnToReg(pParse, + pCol->pTab, pCol->iColumn, pCol->iTable, r1); + j++; + } + } + regRecord = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp3(v, OP_MakeRecord, regBase, nCol, regRecord); + sqlite3VdbeAddOp2(v, OP_SorterInsert, sAggInfo.sortingIdx, regRecord); + sqlite3ReleaseTempReg(pParse, regRecord); + sqlite3ReleaseTempRange(pParse, regBase, nCol); + sqlite3WhereEnd(pWInfo); + sAggInfo.sortingIdxPTab = sortPTab = pParse->nTab++; + sortOut = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp3(v, OP_OpenPseudo, sortPTab, sortOut, nCol); + sqlite3VdbeAddOp2(v, OP_SorterSort, sAggInfo.sortingIdx, addrEnd); + VdbeComment((v, "GROUP BY sort")); VdbeCoverage(v); + sAggInfo.useSortingIdx = 1; + sqlite3ExprCacheClear(pParse); + + } + + /* If the index or temporary table used by the GROUP BY sort + ** will naturally deliver rows in the order required by the ORDER BY + ** clause, cancel the ephemeral table open coded earlier. + ** + ** This is an optimization - the correct answer should result regardless. + ** Use the SQLITE_GroupByOrder flag with SQLITE_TESTCTRL_OPTIMIZER to + ** disable this optimization for testing purposes. */ + if( orderByGrp && OptimizationEnabled(db, SQLITE_GroupByOrder) + && (groupBySort || sqlite3WhereIsSorted(pWInfo)) + ){ + sSort.pOrderBy = 0; + sqlite3VdbeChangeToNoop(v, sSort.addrSortIndex); + } + + /* Evaluate the current GROUP BY terms and store in b0, b1, b2... + ** (b0 is memory location iBMem+0, b1 is iBMem+1, and so forth) + ** Then compare the current GROUP BY terms against the GROUP BY terms + ** from the previous row currently stored in a0, a1, a2... + */ + addrTopOfLoop = sqlite3VdbeCurrentAddr(v); + sqlite3ExprCacheClear(pParse); + if( groupBySort ){ + sqlite3VdbeAddOp3(v, OP_SorterData, sAggInfo.sortingIdx, + sortOut, sortPTab); + } + for(j=0; jnExpr; j++){ + if( groupBySort ){ + sqlite3VdbeAddOp3(v, OP_Column, sortPTab, j, iBMem+j); + }else{ + sAggInfo.directMode = 1; + sqlite3ExprCode(pParse, pGroupBy->a[j].pExpr, iBMem+j); + } + } + sqlite3VdbeAddOp4(v, OP_Compare, iAMem, iBMem, pGroupBy->nExpr, + (char*)sqlite3KeyInfoRef(pKeyInfo), P4_KEYINFO); + addr1 = sqlite3VdbeCurrentAddr(v); + sqlite3VdbeAddOp3(v, OP_Jump, addr1+1, 0, addr1+1); VdbeCoverage(v); + + /* Generate code that runs whenever the GROUP BY changes. + ** Changes in the GROUP BY are detected by the previous code + ** block. If there were no changes, this block is skipped. + ** + ** This code copies current group by terms in b0,b1,b2,... + ** over to a0,a1,a2. It then calls the output subroutine + ** and resets the aggregate accumulator registers in preparation + ** for the next GROUP BY batch. + */ + sqlite3ExprCodeMove(pParse, iBMem, iAMem, pGroupBy->nExpr); + sqlite3VdbeAddOp2(v, OP_Gosub, regOutputRow, addrOutputRow); + VdbeComment((v, "output one row")); + sqlite3VdbeAddOp2(v, OP_IfPos, iAbortFlag, addrEnd); VdbeCoverage(v); + VdbeComment((v, "check abort flag")); + sqlite3VdbeAddOp2(v, OP_Gosub, regReset, addrReset); + VdbeComment((v, "reset accumulator")); + + /* Update the aggregate accumulators based on the content of + ** the current row + */ + sqlite3VdbeJumpHere(v, addr1); + updateAccumulator(pParse, &sAggInfo); + sqlite3VdbeAddOp2(v, OP_Integer, 1, iUseFlag); + VdbeComment((v, "indicate data in accumulator")); + + /* End of the loop + */ + if( groupBySort ){ + sqlite3VdbeAddOp2(v, OP_SorterNext, sAggInfo.sortingIdx, addrTopOfLoop); + VdbeCoverage(v); + }else{ + sqlite3WhereEnd(pWInfo); + sqlite3VdbeChangeToNoop(v, addrSortingIdx); + } + + /* Output the final row of result + */ + sqlite3VdbeAddOp2(v, OP_Gosub, regOutputRow, addrOutputRow); + VdbeComment((v, "output final row")); + + /* Jump over the subroutines + */ + sqlite3VdbeGoto(v, addrEnd); + + /* Generate a subroutine that outputs a single row of the result + ** set. This subroutine first looks at the iUseFlag. If iUseFlag + ** is less than or equal to zero, the subroutine is a no-op. If + ** the processing calls for the query to abort, this subroutine + ** increments the iAbortFlag memory location before returning in + ** order to signal the caller to abort. + */ + addrSetAbort = sqlite3VdbeCurrentAddr(v); + sqlite3VdbeAddOp2(v, OP_Integer, 1, iAbortFlag); + VdbeComment((v, "set abort flag")); + sqlite3VdbeAddOp1(v, OP_Return, regOutputRow); + sqlite3VdbeResolveLabel(v, addrOutputRow); + addrOutputRow = sqlite3VdbeCurrentAddr(v); + sqlite3VdbeAddOp2(v, OP_IfPos, iUseFlag, addrOutputRow+2); + VdbeCoverage(v); + VdbeComment((v, "Groupby result generator entry point")); + sqlite3VdbeAddOp1(v, OP_Return, regOutputRow); + finalizeAggFunctions(pParse, &sAggInfo); + sqlite3ExprIfFalse(pParse, pHaving, addrOutputRow+1, SQLITE_JUMPIFNULL); + selectInnerLoop(pParse, p, p->pEList, -1, &sSort, + &sDistinct, pDest, + addrOutputRow+1, addrSetAbort); + sqlite3VdbeAddOp1(v, OP_Return, regOutputRow); + VdbeComment((v, "end groupby result generator")); + + /* Generate a subroutine that will reset the group-by accumulator + */ + sqlite3VdbeResolveLabel(v, addrReset); + resetAccumulator(pParse, &sAggInfo); + sqlite3VdbeAddOp1(v, OP_Return, regReset); + + } /* endif pGroupBy. Begin aggregate queries without GROUP BY: */ + else { + ExprList *pDel = 0; +#ifndef SQLITE_OMIT_BTREECOUNT + Table *pTab; + if( (pTab = isSimpleCount(p, &sAggInfo))!=0 ){ + /* If isSimpleCount() returns a pointer to a Table structure, then + ** the SQL statement is of the form: + ** + ** SELECT count(*) FROM + ** + ** where the Table structure returned represents table . + ** + ** This statement is so common that it is optimized specially. The + ** OP_Count instruction is executed either on the intkey table that + ** contains the data for table or on one of its indexes. It + ** is better to execute the op on an index, as indexes are almost + ** always spread across less pages than their corresponding tables. + */ + const int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); + const int iCsr = pParse->nTab++; /* Cursor to scan b-tree */ + Index *pIdx; /* Iterator variable */ + KeyInfo *pKeyInfo = 0; /* Keyinfo for scanned index */ + Index *pBest = 0; /* Best index found so far */ + int iRoot = pTab->tnum; /* Root page of scanned b-tree */ + + sqlite3CodeVerifySchema(pParse, iDb); + sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName); + + /* Search for the index that has the lowest scan cost. + ** + ** (2011-04-15) Do not do a full scan of an unordered index. + ** + ** (2013-10-03) Do not count the entries in a partial index. + ** + ** In practice the KeyInfo structure will not be used. It is only + ** passed to keep OP_OpenRead happy. + */ + if( !HasRowid(pTab) ) pBest = sqlite3PrimaryKeyIndex(pTab); + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + if( pIdx->bUnordered==0 + && pIdx->szIdxRowszTabRow + && pIdx->pPartIdxWhere==0 + && (!pBest || pIdx->szIdxRowszIdxRow) + ){ + pBest = pIdx; + } + } + if( pBest ){ + iRoot = pBest->tnum; + pKeyInfo = sqlite3KeyInfoOfIndex(pParse, pBest); + } + + /* Open a read-only cursor, execute the OP_Count, close the cursor. */ + sqlite3VdbeAddOp4Int(v, OP_OpenRead, iCsr, iRoot, iDb, 1); + if( pKeyInfo ){ + sqlite3VdbeChangeP4(v, -1, (char *)pKeyInfo, P4_KEYINFO); + } + sqlite3VdbeAddOp2(v, OP_Count, iCsr, sAggInfo.aFunc[0].iMem); + sqlite3VdbeAddOp1(v, OP_Close, iCsr); + explainSimpleCount(pParse, pTab, pBest); + }else +#endif /* SQLITE_OMIT_BTREECOUNT */ + { + /* Check if the query is of one of the following forms: + ** + ** SELECT min(x) FROM ... + ** SELECT max(x) FROM ... + ** + ** If it is, then ask the code in where.c to attempt to sort results + ** as if there was an "ORDER ON x" or "ORDER ON x DESC" clause. + ** If where.c is able to produce results sorted in this order, then + ** add vdbe code to break out of the processing loop after the + ** first iteration (since the first iteration of the loop is + ** guaranteed to operate on the row with the minimum or maximum + ** value of x, the only row required). + ** + ** A special flag must be passed to sqlite3WhereBegin() to slightly + ** modify behavior as follows: + ** + ** + If the query is a "SELECT min(x)", then the loop coded by + ** where.c should not iterate over any values with a NULL value + ** for x. + ** + ** + The optimizer code in where.c (the thing that decides which + ** index or indices to use) should place a different priority on + ** satisfying the 'ORDER BY' clause than it does in other cases. + ** Refer to code and comments in where.c for details. + */ + ExprList *pMinMax = 0; + u8 flag = WHERE_ORDERBY_NORMAL; + + assert( p->pGroupBy==0 ); + assert( flag==0 ); + if( p->pHaving==0 ){ + flag = minMaxQuery(&sAggInfo, &pMinMax); + } + assert( flag==0 || (pMinMax!=0 && pMinMax->nExpr==1) ); + + if( flag ){ + pMinMax = sqlite3ExprListDup(db, pMinMax, 0); + pDel = pMinMax; + assert( db->mallocFailed || pMinMax!=0 ); + if( !db->mallocFailed ){ + pMinMax->a[0].sortOrder = flag!=WHERE_ORDERBY_MIN ?1:0; + pMinMax->a[0].pExpr->op = TK_COLUMN; + } + } + + /* This case runs if the aggregate has no GROUP BY clause. The + ** processing is much simpler since there is only a single row + ** of output. + */ + resetAccumulator(pParse, &sAggInfo); + pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, pMinMax,0,flag,0); + if( pWInfo==0 ){ + sqlite3ExprListDelete(db, pDel); + goto select_end; + } + updateAccumulator(pParse, &sAggInfo); + assert( pMinMax==0 || pMinMax->nExpr==1 ); + if( sqlite3WhereIsOrdered(pWInfo)>0 ){ + sqlite3VdbeGoto(v, sqlite3WhereBreakLabel(pWInfo)); + VdbeComment((v, "%s() by index", + (flag==WHERE_ORDERBY_MIN?"min":"max"))); + } + sqlite3WhereEnd(pWInfo); + finalizeAggFunctions(pParse, &sAggInfo); + } + + sSort.pOrderBy = 0; + sqlite3ExprIfFalse(pParse, pHaving, addrEnd, SQLITE_JUMPIFNULL); + selectInnerLoop(pParse, p, p->pEList, -1, 0, 0, + pDest, addrEnd, addrEnd); + sqlite3ExprListDelete(db, pDel); + } + sqlite3VdbeResolveLabel(v, addrEnd); + + } /* endif aggregate query */ + + if( sDistinct.eTnctType==WHERE_DISTINCT_UNORDERED ){ + explainTempTable(pParse, "DISTINCT"); + } + + /* If there is an ORDER BY clause, then we need to sort the results + ** and send them to the callback one by one. + */ + if( sSort.pOrderBy ){ + explainTempTable(pParse, + sSort.nOBSat>0 ? "RIGHT PART OF ORDER BY":"ORDER BY"); + generateSortTail(pParse, p, &sSort, pEList->nExpr, pDest); + } + + /* Jump here to skip this query + */ + sqlite3VdbeResolveLabel(v, iEnd); + + /* The SELECT has been coded. If there is an error in the Parse structure, + ** set the return code to 1. Otherwise 0. */ + rc = (pParse->nErr>0); + + /* Control jumps to here if an error is encountered above, or upon + ** successful coding of the SELECT. + */ +select_end: + explainSetInteger(pParse->iSelectId, iRestoreSelectId); + + /* Identify column names if results of the SELECT are to be output. + */ + if( rc==SQLITE_OK && pDest->eDest==SRT_Output ){ + generateColumnNames(pParse, pTabList, pEList); + } + + sqlite3DbFree(db, sAggInfo.aCol); + sqlite3DbFree(db, sAggInfo.aFunc); +#if SELECTTRACE_ENABLED + SELECTTRACE(1,pParse,p,("end processing\n")); + pParse->nSelectIndent--; +#endif + return rc; +} + +/************** End of select.c **********************************************/ +/************** Begin file table.c *******************************************/ +/* +** 2001 September 15 +** +** 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 the sqlite3_get_table() and sqlite3_free_table() +** interface routines. These are just wrappers around the main +** interface routine of sqlite3_exec(). +** +** These routines are in a separate files so that they will not be linked +** if they are not used. +*/ +/* #include "sqliteInt.h" */ +/* #include */ +/* #include */ + +#ifndef SQLITE_OMIT_GET_TABLE + +/* +** This structure is used to pass data from sqlite3_get_table() through +** to the callback function is uses to build the result. +*/ +typedef struct TabResult { + char **azResult; /* Accumulated output */ + char *zErrMsg; /* Error message text, if an error occurs */ + u32 nAlloc; /* Slots allocated for azResult[] */ + u32 nRow; /* Number of rows in the result */ + u32 nColumn; /* Number of columns in the result */ + u32 nData; /* Slots used in azResult[]. (nRow+1)*nColumn */ + int rc; /* Return code from sqlite3_exec() */ +} TabResult; + +/* +** This routine is called once for each row in the result table. Its job +** is to fill in the TabResult structure appropriately, allocating new +** memory as necessary. +*/ +static int sqlite3_get_table_cb(void *pArg, int nCol, char **argv, char **colv){ + TabResult *p = (TabResult*)pArg; /* Result accumulator */ + int need; /* Slots needed in p->azResult[] */ + int i; /* Loop counter */ + char *z; /* A single column of result */ + + /* Make sure there is enough space in p->azResult to hold everything + ** we need to remember from this invocation of the callback. + */ + if( p->nRow==0 && argv!=0 ){ + need = nCol*2; + }else{ + need = nCol; + } + if( p->nData + need > p->nAlloc ){ + char **azNew; + p->nAlloc = p->nAlloc*2 + need; + azNew = sqlite3_realloc64( p->azResult, sizeof(char*)*p->nAlloc ); + if( azNew==0 ) goto malloc_failed; + p->azResult = azNew; + } + + /* If this is the first row, then generate an extra row containing + ** the names of all columns. + */ + if( p->nRow==0 ){ + p->nColumn = nCol; + for(i=0; iazResult[p->nData++] = z; + } + }else if( (int)p->nColumn!=nCol ){ + sqlite3_free(p->zErrMsg); + p->zErrMsg = sqlite3_mprintf( + "sqlite3_get_table() called with two or more incompatible queries" + ); + p->rc = SQLITE_ERROR; + return 1; + } + + /* Copy over the row data + */ + if( argv!=0 ){ + for(i=0; iazResult[p->nData++] = z; + } + p->nRow++; + } + return 0; + +malloc_failed: + p->rc = SQLITE_NOMEM_BKPT; + return 1; +} + +/* +** Query the database. But instead of invoking a callback for each row, +** malloc() for space to hold the result and return the entire results +** at the conclusion of the call. +** +** The result that is written to ***pazResult is held in memory obtained +** from malloc(). But the caller cannot free this memory directly. +** Instead, the entire table should be passed to sqlite3_free_table() when +** the calling procedure is finished using it. +*/ +SQLITE_API int sqlite3_get_table( + sqlite3 *db, /* The database on which the SQL executes */ + const char *zSql, /* The SQL to be executed */ + char ***pazResult, /* Write the result table here */ + int *pnRow, /* Write the number of rows in the result here */ + int *pnColumn, /* Write the number of columns of result here */ + char **pzErrMsg /* Write error messages here */ +){ + int rc; + TabResult res; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) || pazResult==0 ) return SQLITE_MISUSE_BKPT; +#endif + *pazResult = 0; + if( pnColumn ) *pnColumn = 0; + if( pnRow ) *pnRow = 0; + if( pzErrMsg ) *pzErrMsg = 0; + res.zErrMsg = 0; + res.nRow = 0; + res.nColumn = 0; + res.nData = 1; + res.nAlloc = 20; + res.rc = SQLITE_OK; + res.azResult = sqlite3_malloc64(sizeof(char*)*res.nAlloc ); + if( res.azResult==0 ){ + db->errCode = SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; + } + res.azResult[0] = 0; + rc = sqlite3_exec(db, zSql, sqlite3_get_table_cb, &res, pzErrMsg); + assert( sizeof(res.azResult[0])>= sizeof(res.nData) ); + res.azResult[0] = SQLITE_INT_TO_PTR(res.nData); + if( (rc&0xff)==SQLITE_ABORT ){ + sqlite3_free_table(&res.azResult[1]); + if( res.zErrMsg ){ + if( pzErrMsg ){ + sqlite3_free(*pzErrMsg); + *pzErrMsg = sqlite3_mprintf("%s",res.zErrMsg); + } + sqlite3_free(res.zErrMsg); + } + db->errCode = res.rc; /* Assume 32-bit assignment is atomic */ + return res.rc; + } + sqlite3_free(res.zErrMsg); + if( rc!=SQLITE_OK ){ + sqlite3_free_table(&res.azResult[1]); + return rc; + } + if( res.nAlloc>res.nData ){ + char **azNew; + azNew = sqlite3_realloc64( res.azResult, sizeof(char*)*res.nData ); + if( azNew==0 ){ + sqlite3_free_table(&res.azResult[1]); + db->errCode = SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; + } + res.azResult = azNew; + } + *pazResult = &res.azResult[1]; + if( pnColumn ) *pnColumn = res.nColumn; + if( pnRow ) *pnRow = res.nRow; + return rc; +} + +/* +** This routine frees the space the sqlite3_get_table() malloced. +*/ +SQLITE_API void sqlite3_free_table( + char **azResult /* Result returned from sqlite3_get_table() */ +){ + if( azResult ){ + int i, n; + azResult--; + assert( azResult!=0 ); + n = SQLITE_PTR_TO_INT(azResult[0]); + for(i=1; ipNext; + + sqlite3ExprDelete(db, pTmp->pWhere); + sqlite3ExprListDelete(db, pTmp->pExprList); + sqlite3SelectDelete(db, pTmp->pSelect); + sqlite3IdListDelete(db, pTmp->pIdList); + + sqlite3DbFree(db, pTmp); + } +} + +/* +** Given table pTab, return a list of all the triggers attached to +** the table. The list is connected by Trigger.pNext pointers. +** +** All of the triggers on pTab that are in the same database as pTab +** are already attached to pTab->pTrigger. But there might be additional +** triggers on pTab in the TEMP schema. This routine prepends all +** TEMP triggers on pTab to the beginning of the pTab->pTrigger list +** and returns the combined list. +** +** To state it another way: This routine returns a list of all triggers +** that fire off of pTab. The list will include any TEMP triggers on +** pTab as well as the triggers lised in pTab->pTrigger. +*/ +SQLITE_PRIVATE Trigger *sqlite3TriggerList(Parse *pParse, Table *pTab){ + Schema * const pTmpSchema = pParse->db->aDb[1].pSchema; + Trigger *pList = 0; /* List of triggers to return */ + + if( pParse->disableTriggers ){ + return 0; + } + + if( pTmpSchema!=pTab->pSchema ){ + HashElem *p; + assert( sqlite3SchemaMutexHeld(pParse->db, 0, pTmpSchema) ); + for(p=sqliteHashFirst(&pTmpSchema->trigHash); p; p=sqliteHashNext(p)){ + Trigger *pTrig = (Trigger *)sqliteHashData(p); + if( pTrig->pTabSchema==pTab->pSchema + && 0==sqlite3StrICmp(pTrig->table, pTab->zName) + ){ + pTrig->pNext = (pList ? pList : pTab->pTrigger); + pList = pTrig; + } + } + } + + return (pList ? pList : pTab->pTrigger); +} + +/* +** This is called by the parser when it sees a CREATE TRIGGER statement +** up to the point of the BEGIN before the trigger actions. A Trigger +** structure is generated based on the information available and stored +** in pParse->pNewTrigger. After the trigger actions have been parsed, the +** sqlite3FinishTrigger() function is called to complete the trigger +** construction process. +*/ +SQLITE_PRIVATE void sqlite3BeginTrigger( + Parse *pParse, /* The parse context of the CREATE TRIGGER statement */ + Token *pName1, /* The name of the trigger */ + Token *pName2, /* The name of the trigger */ + int tr_tm, /* One of TK_BEFORE, TK_AFTER, TK_INSTEAD */ + int op, /* One of TK_INSERT, TK_UPDATE, TK_DELETE */ + IdList *pColumns, /* column list if this is an UPDATE OF trigger */ + SrcList *pTableName,/* The name of the table/view the trigger applies to */ + Expr *pWhen, /* WHEN clause */ + int isTemp, /* True if the TEMPORARY keyword is present */ + int noErr /* Suppress errors if the trigger already exists */ +){ + Trigger *pTrigger = 0; /* The new trigger */ + Table *pTab; /* Table that the trigger fires off of */ + char *zName = 0; /* Name of the trigger */ + sqlite3 *db = pParse->db; /* The database connection */ + int iDb; /* The database to store the trigger in */ + Token *pName; /* The unqualified db name */ + DbFixer sFix; /* State vector for the DB fixer */ + + assert( pName1!=0 ); /* pName1->z might be NULL, but not pName1 itself */ + assert( pName2!=0 ); + assert( op==TK_INSERT || op==TK_UPDATE || op==TK_DELETE ); + assert( op>0 && op<0xff ); + if( isTemp ){ + /* If TEMP was specified, then the trigger name may not be qualified. */ + if( pName2->n>0 ){ + sqlite3ErrorMsg(pParse, "temporary trigger may not have qualified name"); + goto trigger_cleanup; + } + iDb = 1; + pName = pName1; + }else{ + /* Figure out the db that the trigger will be created in */ + iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pName); + if( iDb<0 ){ + goto trigger_cleanup; + } + } + if( !pTableName || db->mallocFailed ){ + goto trigger_cleanup; + } + + /* A long-standing parser bug is that this syntax was allowed: + ** + ** CREATE TRIGGER attached.demo AFTER INSERT ON attached.tab .... + ** ^^^^^^^^ + ** + ** To maintain backwards compatibility, ignore the database + ** name on pTableName if we are reparsing out of SQLITE_MASTER. + */ + if( db->init.busy && iDb!=1 ){ + sqlite3DbFree(db, pTableName->a[0].zDatabase); + pTableName->a[0].zDatabase = 0; + } + + /* If the trigger name was unqualified, and the table is a temp table, + ** then set iDb to 1 to create the trigger in the temporary database. + ** If sqlite3SrcListLookup() returns 0, indicating the table does not + ** exist, the error is caught by the block below. + */ + pTab = sqlite3SrcListLookup(pParse, pTableName); + if( db->init.busy==0 && pName2->n==0 && pTab + && pTab->pSchema==db->aDb[1].pSchema ){ + iDb = 1; + } + + /* Ensure the table name matches database name and that the table exists */ + if( db->mallocFailed ) goto trigger_cleanup; + assert( pTableName->nSrc==1 ); + sqlite3FixInit(&sFix, pParse, iDb, "trigger", pName); + if( sqlite3FixSrcList(&sFix, pTableName) ){ + goto trigger_cleanup; + } + pTab = sqlite3SrcListLookup(pParse, pTableName); + if( !pTab ){ + /* The table does not exist. */ + if( db->init.iDb==1 ){ + /* Ticket #3810. + ** Normally, whenever a table is dropped, all associated triggers are + ** dropped too. But if a TEMP trigger is created on a non-TEMP table + ** and the table is dropped by a different database connection, the + ** trigger is not visible to the database connection that does the + ** drop so the trigger cannot be dropped. This results in an + ** "orphaned trigger" - a trigger whose associated table is missing. + */ + db->init.orphanTrigger = 1; + } + goto trigger_cleanup; + } + if( IsVirtual(pTab) ){ + sqlite3ErrorMsg(pParse, "cannot create triggers on virtual tables"); + goto trigger_cleanup; + } + + /* Check that the trigger name is not reserved and that no trigger of the + ** specified name exists */ + zName = sqlite3NameFromToken(db, pName); + if( !zName || SQLITE_OK!=sqlite3CheckObjectName(pParse, zName) ){ + goto trigger_cleanup; + } + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + if( sqlite3HashFind(&(db->aDb[iDb].pSchema->trigHash),zName) ){ + if( !noErr ){ + sqlite3ErrorMsg(pParse, "trigger %T already exists", pName); + }else{ + assert( !db->init.busy ); + sqlite3CodeVerifySchema(pParse, iDb); + } + goto trigger_cleanup; + } + + /* Do not create a trigger on a system table */ + if( sqlite3StrNICmp(pTab->zName, "sqlite_", 7)==0 ){ + sqlite3ErrorMsg(pParse, "cannot create trigger on system table"); + goto trigger_cleanup; + } + + /* INSTEAD of triggers are only for views and views only support INSTEAD + ** of triggers. + */ + if( pTab->pSelect && tr_tm!=TK_INSTEAD ){ + sqlite3ErrorMsg(pParse, "cannot create %s trigger on view: %S", + (tr_tm == TK_BEFORE)?"BEFORE":"AFTER", pTableName, 0); + goto trigger_cleanup; + } + if( !pTab->pSelect && tr_tm==TK_INSTEAD ){ + sqlite3ErrorMsg(pParse, "cannot create INSTEAD OF" + " trigger on table: %S", pTableName, 0); + goto trigger_cleanup; + } + +#ifndef SQLITE_OMIT_AUTHORIZATION + { + int iTabDb = sqlite3SchemaToIndex(db, pTab->pSchema); + int code = SQLITE_CREATE_TRIGGER; + const char *zDb = db->aDb[iTabDb].zDbSName; + const char *zDbTrig = isTemp ? db->aDb[1].zDbSName : zDb; + if( iTabDb==1 || isTemp ) code = SQLITE_CREATE_TEMP_TRIGGER; + if( sqlite3AuthCheck(pParse, code, zName, pTab->zName, zDbTrig) ){ + goto trigger_cleanup; + } + if( sqlite3AuthCheck(pParse, SQLITE_INSERT, SCHEMA_TABLE(iTabDb),0,zDb)){ + goto trigger_cleanup; + } + } +#endif + + /* INSTEAD OF triggers can only appear on views and BEFORE triggers + ** cannot appear on views. So we might as well translate every + ** INSTEAD OF trigger into a BEFORE trigger. It simplifies code + ** elsewhere. + */ + if (tr_tm == TK_INSTEAD){ + tr_tm = TK_BEFORE; + } + + /* Build the Trigger object */ + pTrigger = (Trigger*)sqlite3DbMallocZero(db, sizeof(Trigger)); + if( pTrigger==0 ) goto trigger_cleanup; + pTrigger->zName = zName; + zName = 0; + pTrigger->table = sqlite3DbStrDup(db, pTableName->a[0].zName); + pTrigger->pSchema = db->aDb[iDb].pSchema; + pTrigger->pTabSchema = pTab->pSchema; + pTrigger->op = (u8)op; + pTrigger->tr_tm = tr_tm==TK_BEFORE ? TRIGGER_BEFORE : TRIGGER_AFTER; + pTrigger->pWhen = sqlite3ExprDup(db, pWhen, EXPRDUP_REDUCE); + pTrigger->pColumns = sqlite3IdListDup(db, pColumns); + assert( pParse->pNewTrigger==0 ); + pParse->pNewTrigger = pTrigger; + +trigger_cleanup: + sqlite3DbFree(db, zName); + sqlite3SrcListDelete(db, pTableName); + sqlite3IdListDelete(db, pColumns); + sqlite3ExprDelete(db, pWhen); + if( !pParse->pNewTrigger ){ + sqlite3DeleteTrigger(db, pTrigger); + }else{ + assert( pParse->pNewTrigger==pTrigger ); + } +} + +/* +** This routine is called after all of the trigger actions have been parsed +** in order to complete the process of building the trigger. +*/ +SQLITE_PRIVATE void sqlite3FinishTrigger( + Parse *pParse, /* Parser context */ + TriggerStep *pStepList, /* The triggered program */ + Token *pAll /* Token that describes the complete CREATE TRIGGER */ +){ + Trigger *pTrig = pParse->pNewTrigger; /* Trigger being finished */ + char *zName; /* Name of trigger */ + sqlite3 *db = pParse->db; /* The database */ + DbFixer sFix; /* Fixer object */ + int iDb; /* Database containing the trigger */ + Token nameToken; /* Trigger name for error reporting */ + + pParse->pNewTrigger = 0; + if( NEVER(pParse->nErr) || !pTrig ) goto triggerfinish_cleanup; + zName = pTrig->zName; + iDb = sqlite3SchemaToIndex(pParse->db, pTrig->pSchema); + pTrig->step_list = pStepList; + while( pStepList ){ + pStepList->pTrig = pTrig; + pStepList = pStepList->pNext; + } + sqlite3TokenInit(&nameToken, pTrig->zName); + sqlite3FixInit(&sFix, pParse, iDb, "trigger", &nameToken); + if( sqlite3FixTriggerStep(&sFix, pTrig->step_list) + || sqlite3FixExpr(&sFix, pTrig->pWhen) + ){ + goto triggerfinish_cleanup; + } + + /* if we are not initializing, + ** build the sqlite_master entry + */ + if( !db->init.busy ){ + Vdbe *v; + char *z; + + /* Make an entry in the sqlite_master table */ + v = sqlite3GetVdbe(pParse); + if( v==0 ) goto triggerfinish_cleanup; + sqlite3BeginWriteOperation(pParse, 0, iDb); + z = sqlite3DbStrNDup(db, (char*)pAll->z, pAll->n); + sqlite3NestedParse(pParse, + "INSERT INTO %Q.%s VALUES('trigger',%Q,%Q,0,'CREATE TRIGGER %q')", + db->aDb[iDb].zDbSName, SCHEMA_TABLE(iDb), zName, + pTrig->table, z); + sqlite3DbFree(db, z); + sqlite3ChangeCookie(pParse, iDb); + sqlite3VdbeAddParseSchemaOp(v, iDb, + sqlite3MPrintf(db, "type='trigger' AND name='%q'", zName)); + } + + if( db->init.busy ){ + Trigger *pLink = pTrig; + Hash *pHash = &db->aDb[iDb].pSchema->trigHash; + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + pTrig = sqlite3HashInsert(pHash, zName, pTrig); + if( pTrig ){ + sqlite3OomFault(db); + }else if( pLink->pSchema==pLink->pTabSchema ){ + Table *pTab; + pTab = sqlite3HashFind(&pLink->pTabSchema->tblHash, pLink->table); + assert( pTab!=0 ); + pLink->pNext = pTab->pTrigger; + pTab->pTrigger = pLink; + } + } + +triggerfinish_cleanup: + sqlite3DeleteTrigger(db, pTrig); + assert( !pParse->pNewTrigger ); + sqlite3DeleteTriggerStep(db, pStepList); +} + +/* +** Turn a SELECT statement (that the pSelect parameter points to) into +** a trigger step. Return a pointer to a TriggerStep structure. +** +** The parser calls this routine when it finds a SELECT statement in +** body of a TRIGGER. +*/ +SQLITE_PRIVATE TriggerStep *sqlite3TriggerSelectStep(sqlite3 *db, Select *pSelect){ + TriggerStep *pTriggerStep = sqlite3DbMallocZero(db, sizeof(TriggerStep)); + if( pTriggerStep==0 ) { + sqlite3SelectDelete(db, pSelect); + return 0; + } + pTriggerStep->op = TK_SELECT; + pTriggerStep->pSelect = pSelect; + pTriggerStep->orconf = OE_Default; + return pTriggerStep; +} + +/* +** Allocate space to hold a new trigger step. The allocated space +** holds both the TriggerStep object and the TriggerStep.target.z string. +** +** If an OOM error occurs, NULL is returned and db->mallocFailed is set. +*/ +static TriggerStep *triggerStepAllocate( + sqlite3 *db, /* Database connection */ + u8 op, /* Trigger opcode */ + Token *pName /* The target name */ +){ + TriggerStep *pTriggerStep; + + pTriggerStep = sqlite3DbMallocZero(db, sizeof(TriggerStep) + pName->n + 1); + if( pTriggerStep ){ + char *z = (char*)&pTriggerStep[1]; + memcpy(z, pName->z, pName->n); + sqlite3Dequote(z); + pTriggerStep->zTarget = z; + pTriggerStep->op = op; + } + return pTriggerStep; +} + +/* +** Build a trigger step out of an INSERT statement. Return a pointer +** to the new trigger step. +** +** The parser calls this routine when it sees an INSERT inside the +** body of a trigger. +*/ +SQLITE_PRIVATE TriggerStep *sqlite3TriggerInsertStep( + sqlite3 *db, /* The database connection */ + Token *pTableName, /* Name of the table into which we insert */ + IdList *pColumn, /* List of columns in pTableName to insert into */ + Select *pSelect, /* A SELECT statement that supplies values */ + u8 orconf /* The conflict algorithm (OE_Abort, OE_Replace, etc.) */ +){ + TriggerStep *pTriggerStep; + + assert(pSelect != 0 || db->mallocFailed); + + pTriggerStep = triggerStepAllocate(db, TK_INSERT, pTableName); + if( pTriggerStep ){ + pTriggerStep->pSelect = sqlite3SelectDup(db, pSelect, EXPRDUP_REDUCE); + pTriggerStep->pIdList = pColumn; + pTriggerStep->orconf = orconf; + }else{ + sqlite3IdListDelete(db, pColumn); + } + sqlite3SelectDelete(db, pSelect); + + return pTriggerStep; +} + +/* +** Construct a trigger step that implements an UPDATE statement and return +** a pointer to that trigger step. The parser calls this routine when it +** sees an UPDATE statement inside the body of a CREATE TRIGGER. +*/ +SQLITE_PRIVATE TriggerStep *sqlite3TriggerUpdateStep( + sqlite3 *db, /* The database connection */ + Token *pTableName, /* Name of the table to be updated */ + ExprList *pEList, /* The SET clause: list of column and new values */ + Expr *pWhere, /* The WHERE clause */ + u8 orconf /* The conflict algorithm. (OE_Abort, OE_Ignore, etc) */ +){ + TriggerStep *pTriggerStep; + + pTriggerStep = triggerStepAllocate(db, TK_UPDATE, pTableName); + if( pTriggerStep ){ + pTriggerStep->pExprList = sqlite3ExprListDup(db, pEList, EXPRDUP_REDUCE); + pTriggerStep->pWhere = sqlite3ExprDup(db, pWhere, EXPRDUP_REDUCE); + pTriggerStep->orconf = orconf; + } + sqlite3ExprListDelete(db, pEList); + sqlite3ExprDelete(db, pWhere); + return pTriggerStep; +} + +/* +** Construct a trigger step that implements a DELETE statement and return +** a pointer to that trigger step. The parser calls this routine when it +** sees a DELETE statement inside the body of a CREATE TRIGGER. +*/ +SQLITE_PRIVATE TriggerStep *sqlite3TriggerDeleteStep( + sqlite3 *db, /* Database connection */ + Token *pTableName, /* The table from which rows are deleted */ + Expr *pWhere /* The WHERE clause */ +){ + TriggerStep *pTriggerStep; + + pTriggerStep = triggerStepAllocate(db, TK_DELETE, pTableName); + if( pTriggerStep ){ + pTriggerStep->pWhere = sqlite3ExprDup(db, pWhere, EXPRDUP_REDUCE); + pTriggerStep->orconf = OE_Default; + } + sqlite3ExprDelete(db, pWhere); + return pTriggerStep; +} + +/* +** Recursively delete a Trigger structure +*/ +SQLITE_PRIVATE void sqlite3DeleteTrigger(sqlite3 *db, Trigger *pTrigger){ + if( pTrigger==0 ) return; + sqlite3DeleteTriggerStep(db, pTrigger->step_list); + sqlite3DbFree(db, pTrigger->zName); + sqlite3DbFree(db, pTrigger->table); + sqlite3ExprDelete(db, pTrigger->pWhen); + sqlite3IdListDelete(db, pTrigger->pColumns); + sqlite3DbFree(db, pTrigger); +} + +/* +** This function is called to drop a trigger from the database schema. +** +** This may be called directly from the parser and therefore identifies +** the trigger by name. The sqlite3DropTriggerPtr() routine does the +** same job as this routine except it takes a pointer to the trigger +** instead of the trigger name. +**/ +SQLITE_PRIVATE void sqlite3DropTrigger(Parse *pParse, SrcList *pName, int noErr){ + Trigger *pTrigger = 0; + int i; + const char *zDb; + const char *zName; + sqlite3 *db = pParse->db; + + if( db->mallocFailed ) goto drop_trigger_cleanup; + if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){ + goto drop_trigger_cleanup; + } + + assert( pName->nSrc==1 ); + zDb = pName->a[0].zDatabase; + zName = pName->a[0].zName; + assert( zDb!=0 || sqlite3BtreeHoldsAllMutexes(db) ); + for(i=OMIT_TEMPDB; inDb; i++){ + int j = (i<2) ? i^1 : i; /* Search TEMP before MAIN */ + if( zDb && sqlite3StrICmp(db->aDb[j].zDbSName, zDb) ) continue; + assert( sqlite3SchemaMutexHeld(db, j, 0) ); + pTrigger = sqlite3HashFind(&(db->aDb[j].pSchema->trigHash), zName); + if( pTrigger ) break; + } + if( !pTrigger ){ + if( !noErr ){ + sqlite3ErrorMsg(pParse, "no such trigger: %S", pName, 0); + }else{ + sqlite3CodeVerifyNamedSchema(pParse, zDb); + } + pParse->checkSchema = 1; + goto drop_trigger_cleanup; + } + sqlite3DropTriggerPtr(pParse, pTrigger); + +drop_trigger_cleanup: + sqlite3SrcListDelete(db, pName); +} + +/* +** Return a pointer to the Table structure for the table that a trigger +** is set on. +*/ +static Table *tableOfTrigger(Trigger *pTrigger){ + return sqlite3HashFind(&pTrigger->pTabSchema->tblHash, pTrigger->table); +} + + +/* +** Drop a trigger given a pointer to that trigger. +*/ +SQLITE_PRIVATE void sqlite3DropTriggerPtr(Parse *pParse, Trigger *pTrigger){ + Table *pTable; + Vdbe *v; + sqlite3 *db = pParse->db; + int iDb; + + iDb = sqlite3SchemaToIndex(pParse->db, pTrigger->pSchema); + assert( iDb>=0 && iDbnDb ); + pTable = tableOfTrigger(pTrigger); + assert( pTable ); + assert( pTable->pSchema==pTrigger->pSchema || iDb==1 ); +#ifndef SQLITE_OMIT_AUTHORIZATION + { + int code = SQLITE_DROP_TRIGGER; + const char *zDb = db->aDb[iDb].zDbSName; + const char *zTab = SCHEMA_TABLE(iDb); + if( iDb==1 ) code = SQLITE_DROP_TEMP_TRIGGER; + if( sqlite3AuthCheck(pParse, code, pTrigger->zName, pTable->zName, zDb) || + sqlite3AuthCheck(pParse, SQLITE_DELETE, zTab, 0, zDb) ){ + return; + } + } +#endif + + /* Generate code to destroy the database record of the trigger. + */ + assert( pTable!=0 ); + if( (v = sqlite3GetVdbe(pParse))!=0 ){ + sqlite3NestedParse(pParse, + "DELETE FROM %Q.%s WHERE name=%Q AND type='trigger'", + db->aDb[iDb].zDbSName, SCHEMA_TABLE(iDb), pTrigger->zName + ); + sqlite3ChangeCookie(pParse, iDb); + sqlite3VdbeAddOp4(v, OP_DropTrigger, iDb, 0, 0, pTrigger->zName, 0); + } +} + +/* +** Remove a trigger from the hash tables of the sqlite* pointer. +*/ +SQLITE_PRIVATE void sqlite3UnlinkAndDeleteTrigger(sqlite3 *db, int iDb, const char *zName){ + Trigger *pTrigger; + Hash *pHash; + + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + pHash = &(db->aDb[iDb].pSchema->trigHash); + pTrigger = sqlite3HashInsert(pHash, zName, 0); + if( ALWAYS(pTrigger) ){ + if( pTrigger->pSchema==pTrigger->pTabSchema ){ + Table *pTab = tableOfTrigger(pTrigger); + Trigger **pp; + for(pp=&pTab->pTrigger; *pp!=pTrigger; pp=&((*pp)->pNext)); + *pp = (*pp)->pNext; + } + sqlite3DeleteTrigger(db, pTrigger); + db->flags |= SQLITE_InternChanges; + } +} + +/* +** pEList is the SET clause of an UPDATE statement. Each entry +** in pEList is of the format =. If any of the entries +** in pEList have an which matches an identifier in pIdList, +** then return TRUE. If pIdList==NULL, then it is considered a +** wildcard that matches anything. Likewise if pEList==NULL then +** it matches anything so always return true. Return false only +** if there is no match. +*/ +static int checkColumnOverlap(IdList *pIdList, ExprList *pEList){ + int e; + if( pIdList==0 || NEVER(pEList==0) ) return 1; + for(e=0; enExpr; e++){ + if( sqlite3IdListIndex(pIdList, pEList->a[e].zName)>=0 ) return 1; + } + return 0; +} + +/* +** Return a list of all triggers on table pTab if there exists at least +** one trigger that must be fired when an operation of type 'op' is +** performed on the table, and, if that operation is an UPDATE, if at +** least one of the columns in pChanges is being modified. +*/ +SQLITE_PRIVATE Trigger *sqlite3TriggersExist( + Parse *pParse, /* Parse context */ + Table *pTab, /* The table the contains the triggers */ + int op, /* one of TK_DELETE, TK_INSERT, TK_UPDATE */ + ExprList *pChanges, /* Columns that change in an UPDATE statement */ + int *pMask /* OUT: Mask of TRIGGER_BEFORE|TRIGGER_AFTER */ +){ + int mask = 0; + Trigger *pList = 0; + Trigger *p; + + if( (pParse->db->flags & SQLITE_EnableTrigger)!=0 ){ + pList = sqlite3TriggerList(pParse, pTab); + } + assert( pList==0 || IsVirtual(pTab)==0 ); + for(p=pList; p; p=p->pNext){ + if( p->op==op && checkColumnOverlap(p->pColumns, pChanges) ){ + mask |= p->tr_tm; + } + } + if( pMask ){ + *pMask = mask; + } + return (mask ? pList : 0); +} + +/* +** Convert the pStep->zTarget string into a SrcList and return a pointer +** to that SrcList. +** +** This routine adds a specific database name, if needed, to the target when +** forming the SrcList. This prevents a trigger in one database from +** referring to a target in another database. An exception is when the +** trigger is in TEMP in which case it can refer to any other database it +** wants. +*/ +static SrcList *targetSrcList( + Parse *pParse, /* The parsing context */ + TriggerStep *pStep /* The trigger containing the target token */ +){ + sqlite3 *db = pParse->db; + int iDb; /* Index of the database to use */ + SrcList *pSrc; /* SrcList to be returned */ + + pSrc = sqlite3SrcListAppend(db, 0, 0, 0); + if( pSrc ){ + assert( pSrc->nSrc>0 ); + pSrc->a[pSrc->nSrc-1].zName = sqlite3DbStrDup(db, pStep->zTarget); + iDb = sqlite3SchemaToIndex(db, pStep->pTrig->pSchema); + if( iDb==0 || iDb>=2 ){ + const char *zDb; + assert( iDbnDb ); + zDb = db->aDb[iDb].zDbSName; + pSrc->a[pSrc->nSrc-1].zDatabase = sqlite3DbStrDup(db, zDb); + } + } + return pSrc; +} + +/* +** Generate VDBE code for the statements inside the body of a single +** trigger. +*/ +static int codeTriggerProgram( + Parse *pParse, /* The parser context */ + TriggerStep *pStepList, /* List of statements inside the trigger body */ + int orconf /* Conflict algorithm. (OE_Abort, etc) */ +){ + TriggerStep *pStep; + Vdbe *v = pParse->pVdbe; + sqlite3 *db = pParse->db; + + assert( pParse->pTriggerTab && pParse->pToplevel ); + assert( pStepList ); + assert( v!=0 ); + for(pStep=pStepList; pStep; pStep=pStep->pNext){ + /* Figure out the ON CONFLICT policy that will be used for this step + ** of the trigger program. If the statement that caused this trigger + ** to fire had an explicit ON CONFLICT, then use it. Otherwise, use + ** the ON CONFLICT policy that was specified as part of the trigger + ** step statement. Example: + ** + ** CREATE TRIGGER AFTER INSERT ON t1 BEGIN; + ** INSERT OR REPLACE INTO t2 VALUES(new.a, new.b); + ** END; + ** + ** INSERT INTO t1 ... ; -- insert into t2 uses REPLACE policy + ** INSERT OR IGNORE INTO t1 ... ; -- insert into t2 uses IGNORE policy + */ + pParse->eOrconf = (orconf==OE_Default)?pStep->orconf:(u8)orconf; + assert( pParse->okConstFactor==0 ); + + switch( pStep->op ){ + case TK_UPDATE: { + sqlite3Update(pParse, + targetSrcList(pParse, pStep), + sqlite3ExprListDup(db, pStep->pExprList, 0), + sqlite3ExprDup(db, pStep->pWhere, 0), + pParse->eOrconf + ); + break; + } + case TK_INSERT: { + sqlite3Insert(pParse, + targetSrcList(pParse, pStep), + sqlite3SelectDup(db, pStep->pSelect, 0), + sqlite3IdListDup(db, pStep->pIdList), + pParse->eOrconf + ); + break; + } + case TK_DELETE: { + sqlite3DeleteFrom(pParse, + targetSrcList(pParse, pStep), + sqlite3ExprDup(db, pStep->pWhere, 0) + ); + break; + } + default: assert( pStep->op==TK_SELECT ); { + SelectDest sDest; + Select *pSelect = sqlite3SelectDup(db, pStep->pSelect, 0); + sqlite3SelectDestInit(&sDest, SRT_Discard, 0); + sqlite3Select(pParse, pSelect, &sDest); + sqlite3SelectDelete(db, pSelect); + break; + } + } + if( pStep->op!=TK_SELECT ){ + sqlite3VdbeAddOp0(v, OP_ResetCount); + } + } + + return 0; +} + +#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS +/* +** This function is used to add VdbeComment() annotations to a VDBE +** program. It is not used in production code, only for debugging. +*/ +static const char *onErrorText(int onError){ + switch( onError ){ + case OE_Abort: return "abort"; + case OE_Rollback: return "rollback"; + case OE_Fail: return "fail"; + case OE_Replace: return "replace"; + case OE_Ignore: return "ignore"; + case OE_Default: return "default"; + } + return "n/a"; +} +#endif + +/* +** Parse context structure pFrom has just been used to create a sub-vdbe +** (trigger program). If an error has occurred, transfer error information +** from pFrom to pTo. +*/ +static void transferParseError(Parse *pTo, Parse *pFrom){ + assert( pFrom->zErrMsg==0 || pFrom->nErr ); + assert( pTo->zErrMsg==0 || pTo->nErr ); + if( pTo->nErr==0 ){ + pTo->zErrMsg = pFrom->zErrMsg; + pTo->nErr = pFrom->nErr; + pTo->rc = pFrom->rc; + }else{ + sqlite3DbFree(pFrom->db, pFrom->zErrMsg); + } +} + +/* +** Create and populate a new TriggerPrg object with a sub-program +** implementing trigger pTrigger with ON CONFLICT policy orconf. +*/ +static TriggerPrg *codeRowTrigger( + Parse *pParse, /* Current parse context */ + Trigger *pTrigger, /* Trigger to code */ + Table *pTab, /* The table pTrigger is attached to */ + int orconf /* ON CONFLICT policy to code trigger program with */ +){ + Parse *pTop = sqlite3ParseToplevel(pParse); + sqlite3 *db = pParse->db; /* Database handle */ + TriggerPrg *pPrg; /* Value to return */ + Expr *pWhen = 0; /* Duplicate of trigger WHEN expression */ + Vdbe *v; /* Temporary VM */ + NameContext sNC; /* Name context for sub-vdbe */ + SubProgram *pProgram = 0; /* Sub-vdbe for trigger program */ + Parse *pSubParse; /* Parse context for sub-vdbe */ + int iEndTrigger = 0; /* Label to jump to if WHEN is false */ + + assert( pTrigger->zName==0 || pTab==tableOfTrigger(pTrigger) ); + assert( pTop->pVdbe ); + + /* Allocate the TriggerPrg and SubProgram objects. To ensure that they + ** are freed if an error occurs, link them into the Parse.pTriggerPrg + ** list of the top-level Parse object sooner rather than later. */ + pPrg = sqlite3DbMallocZero(db, sizeof(TriggerPrg)); + if( !pPrg ) return 0; + pPrg->pNext = pTop->pTriggerPrg; + pTop->pTriggerPrg = pPrg; + pPrg->pProgram = pProgram = sqlite3DbMallocZero(db, sizeof(SubProgram)); + if( !pProgram ) return 0; + sqlite3VdbeLinkSubProgram(pTop->pVdbe, pProgram); + pPrg->pTrigger = pTrigger; + pPrg->orconf = orconf; + pPrg->aColmask[0] = 0xffffffff; + pPrg->aColmask[1] = 0xffffffff; + + /* Allocate and populate a new Parse context to use for coding the + ** trigger sub-program. */ + pSubParse = sqlite3StackAllocZero(db, sizeof(Parse)); + if( !pSubParse ) return 0; + memset(&sNC, 0, sizeof(sNC)); + sNC.pParse = pSubParse; + pSubParse->db = db; + pSubParse->pTriggerTab = pTab; + pSubParse->pToplevel = pTop; + pSubParse->zAuthContext = pTrigger->zName; + pSubParse->eTriggerOp = pTrigger->op; + pSubParse->nQueryLoop = pParse->nQueryLoop; + + v = sqlite3GetVdbe(pSubParse); + if( v ){ + VdbeComment((v, "Start: %s.%s (%s %s%s%s ON %s)", + pTrigger->zName, onErrorText(orconf), + (pTrigger->tr_tm==TRIGGER_BEFORE ? "BEFORE" : "AFTER"), + (pTrigger->op==TK_UPDATE ? "UPDATE" : ""), + (pTrigger->op==TK_INSERT ? "INSERT" : ""), + (pTrigger->op==TK_DELETE ? "DELETE" : ""), + pTab->zName + )); +#ifndef SQLITE_OMIT_TRACE + sqlite3VdbeChangeP4(v, -1, + sqlite3MPrintf(db, "-- TRIGGER %s", pTrigger->zName), P4_DYNAMIC + ); +#endif + + /* If one was specified, code the WHEN clause. If it evaluates to false + ** (or NULL) the sub-vdbe is immediately halted by jumping to the + ** OP_Halt inserted at the end of the program. */ + if( pTrigger->pWhen ){ + pWhen = sqlite3ExprDup(db, pTrigger->pWhen, 0); + if( SQLITE_OK==sqlite3ResolveExprNames(&sNC, pWhen) + && db->mallocFailed==0 + ){ + iEndTrigger = sqlite3VdbeMakeLabel(v); + sqlite3ExprIfFalse(pSubParse, pWhen, iEndTrigger, SQLITE_JUMPIFNULL); + } + sqlite3ExprDelete(db, pWhen); + } + + /* Code the trigger program into the sub-vdbe. */ + codeTriggerProgram(pSubParse, pTrigger->step_list, orconf); + + /* Insert an OP_Halt at the end of the sub-program. */ + if( iEndTrigger ){ + sqlite3VdbeResolveLabel(v, iEndTrigger); + } + sqlite3VdbeAddOp0(v, OP_Halt); + VdbeComment((v, "End: %s.%s", pTrigger->zName, onErrorText(orconf))); + + transferParseError(pParse, pSubParse); + if( db->mallocFailed==0 ){ + pProgram->aOp = sqlite3VdbeTakeOpArray(v, &pProgram->nOp, &pTop->nMaxArg); + } + pProgram->nMem = pSubParse->nMem; + pProgram->nCsr = pSubParse->nTab; + pProgram->token = (void *)pTrigger; + pPrg->aColmask[0] = pSubParse->oldmask; + pPrg->aColmask[1] = pSubParse->newmask; + sqlite3VdbeDelete(v); + } + + assert( !pSubParse->pAinc && !pSubParse->pZombieTab ); + assert( !pSubParse->pTriggerPrg && !pSubParse->nMaxArg ); + sqlite3ParserReset(pSubParse); + sqlite3StackFree(db, pSubParse); + + return pPrg; +} + +/* +** Return a pointer to a TriggerPrg object containing the sub-program for +** trigger pTrigger with default ON CONFLICT algorithm orconf. If no such +** TriggerPrg object exists, a new object is allocated and populated before +** being returned. +*/ +static TriggerPrg *getRowTrigger( + Parse *pParse, /* Current parse context */ + Trigger *pTrigger, /* Trigger to code */ + Table *pTab, /* The table trigger pTrigger is attached to */ + int orconf /* ON CONFLICT algorithm. */ +){ + Parse *pRoot = sqlite3ParseToplevel(pParse); + TriggerPrg *pPrg; + + assert( pTrigger->zName==0 || pTab==tableOfTrigger(pTrigger) ); + + /* It may be that this trigger has already been coded (or is in the + ** process of being coded). If this is the case, then an entry with + ** a matching TriggerPrg.pTrigger field will be present somewhere + ** in the Parse.pTriggerPrg list. Search for such an entry. */ + for(pPrg=pRoot->pTriggerPrg; + pPrg && (pPrg->pTrigger!=pTrigger || pPrg->orconf!=orconf); + pPrg=pPrg->pNext + ); + + /* If an existing TriggerPrg could not be located, create a new one. */ + if( !pPrg ){ + pPrg = codeRowTrigger(pParse, pTrigger, pTab, orconf); + } + + return pPrg; +} + +/* +** Generate code for the trigger program associated with trigger p on +** table pTab. The reg, orconf and ignoreJump parameters passed to this +** function are the same as those described in the header function for +** sqlite3CodeRowTrigger() +*/ +SQLITE_PRIVATE void sqlite3CodeRowTriggerDirect( + Parse *pParse, /* Parse context */ + Trigger *p, /* Trigger to code */ + Table *pTab, /* The table to code triggers from */ + int reg, /* Reg array containing OLD.* and NEW.* values */ + int orconf, /* ON CONFLICT policy */ + int ignoreJump /* Instruction to jump to for RAISE(IGNORE) */ +){ + Vdbe *v = sqlite3GetVdbe(pParse); /* Main VM */ + TriggerPrg *pPrg; + pPrg = getRowTrigger(pParse, p, pTab, orconf); + assert( pPrg || pParse->nErr || pParse->db->mallocFailed ); + + /* Code the OP_Program opcode in the parent VDBE. P4 of the OP_Program + ** is a pointer to the sub-vdbe containing the trigger program. */ + if( pPrg ){ + int bRecursive = (p->zName && 0==(pParse->db->flags&SQLITE_RecTriggers)); + + sqlite3VdbeAddOp4(v, OP_Program, reg, ignoreJump, ++pParse->nMem, + (const char *)pPrg->pProgram, P4_SUBPROGRAM); + VdbeComment( + (v, "Call: %s.%s", (p->zName?p->zName:"fkey"), onErrorText(orconf))); + + /* Set the P5 operand of the OP_Program instruction to non-zero if + ** recursive invocation of this trigger program is disallowed. Recursive + ** invocation is disallowed if (a) the sub-program is really a trigger, + ** not a foreign key action, and (b) the flag to enable recursive triggers + ** is clear. */ + sqlite3VdbeChangeP5(v, (u8)bRecursive); + } +} + +/* +** This is called to code the required FOR EACH ROW triggers for an operation +** on table pTab. The operation to code triggers for (INSERT, UPDATE or DELETE) +** is given by the op parameter. The tr_tm parameter determines whether the +** BEFORE or AFTER triggers are coded. If the operation is an UPDATE, then +** parameter pChanges is passed the list of columns being modified. +** +** If there are no triggers that fire at the specified time for the specified +** operation on pTab, this function is a no-op. +** +** The reg argument is the address of the first in an array of registers +** that contain the values substituted for the new.* and old.* references +** in the trigger program. If N is the number of columns in table pTab +** (a copy of pTab->nCol), then registers are populated as follows: +** +** Register Contains +** ------------------------------------------------------ +** reg+0 OLD.rowid +** reg+1 OLD.* value of left-most column of pTab +** ... ... +** reg+N OLD.* value of right-most column of pTab +** reg+N+1 NEW.rowid +** reg+N+2 OLD.* value of left-most column of pTab +** ... ... +** reg+N+N+1 NEW.* value of right-most column of pTab +** +** For ON DELETE triggers, the registers containing the NEW.* values will +** never be accessed by the trigger program, so they are not allocated or +** populated by the caller (there is no data to populate them with anyway). +** Similarly, for ON INSERT triggers the values stored in the OLD.* registers +** are never accessed, and so are not allocated by the caller. So, for an +** ON INSERT trigger, the value passed to this function as parameter reg +** is not a readable register, although registers (reg+N) through +** (reg+N+N+1) are. +** +** Parameter orconf is the default conflict resolution algorithm for the +** trigger program to use (REPLACE, IGNORE etc.). Parameter ignoreJump +** is the instruction that control should jump to if a trigger program +** raises an IGNORE exception. +*/ +SQLITE_PRIVATE void sqlite3CodeRowTrigger( + Parse *pParse, /* Parse context */ + Trigger *pTrigger, /* List of triggers on table pTab */ + int op, /* One of TK_UPDATE, TK_INSERT, TK_DELETE */ + ExprList *pChanges, /* Changes list for any UPDATE OF triggers */ + int tr_tm, /* One of TRIGGER_BEFORE, TRIGGER_AFTER */ + Table *pTab, /* The table to code triggers from */ + int reg, /* The first in an array of registers (see above) */ + int orconf, /* ON CONFLICT policy */ + int ignoreJump /* Instruction to jump to for RAISE(IGNORE) */ +){ + Trigger *p; /* Used to iterate through pTrigger list */ + + assert( op==TK_UPDATE || op==TK_INSERT || op==TK_DELETE ); + assert( tr_tm==TRIGGER_BEFORE || tr_tm==TRIGGER_AFTER ); + assert( (op==TK_UPDATE)==(pChanges!=0) ); + + for(p=pTrigger; p; p=p->pNext){ + + /* Sanity checking: The schema for the trigger and for the table are + ** always defined. The trigger must be in the same schema as the table + ** or else it must be a TEMP trigger. */ + assert( p->pSchema!=0 ); + assert( p->pTabSchema!=0 ); + assert( p->pSchema==p->pTabSchema + || p->pSchema==pParse->db->aDb[1].pSchema ); + + /* Determine whether we should code this trigger */ + if( p->op==op + && p->tr_tm==tr_tm + && checkColumnOverlap(p->pColumns, pChanges) + ){ + sqlite3CodeRowTriggerDirect(pParse, p, pTab, reg, orconf, ignoreJump); + } + } +} + +/* +** 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|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 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. +** +** 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 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 */ +){ + const int op = pChanges ? TK_UPDATE : TK_DELETE; + u32 mask = 0; + Trigger *p; + + assert( isNew==1 || isNew==0 ); + for(p=pTrigger; p; p=p->pNext){ + 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->aColmask[isNew]; + } + } + } + + return mask; +} + +#endif /* !defined(SQLITE_OMIT_TRIGGER) */ + +/************** End of trigger.c *********************************************/ +/************** Begin file update.c ******************************************/ +/* +** 2001 September 15 +** +** 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 C code routines that are called by the parser +** to handle UPDATE statements. +*/ +/* #include "sqliteInt.h" */ + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* Forward declaration */ +static void updateVirtualTable( + Parse *pParse, /* The parsing context */ + SrcList *pSrc, /* The virtual table to be modified */ + Table *pTab, /* The virtual table */ + ExprList *pChanges, /* The columns to change in the UPDATE statement */ + Expr *pRowidExpr, /* Expression used to recompute the rowid */ + int *aXRef, /* Mapping from columns of pTab to entries in pChanges */ + Expr *pWhere, /* WHERE clause of the UPDATE statement */ + int onError /* ON CONFLICT strategy */ +); +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + +/* +** The most recently coded instruction was an OP_Column to retrieve the +** i-th column of table pTab. This routine sets the P4 parameter of the +** OP_Column to the default value, if any. +** +** The default value of a column is specified by a DEFAULT clause in the +** column definition. This was either supplied by the user when the table +** was created, or added later to the table definition by an ALTER TABLE +** command. If the latter, then the row-records in the table btree on disk +** may not contain a value for the column and the default value, taken +** from the P4 parameter of the OP_Column instruction, is returned instead. +** If the former, then all row-records are guaranteed to include a value +** for the column and the P4 value is not required. +** +** Column definitions created by an ALTER TABLE command may only have +** literal default values specified: a number, null or a string. (If a more +** complicated default expression value was provided, it is evaluated +** when the ALTER TABLE is executed and one of the literal values written +** into the sqlite_master table.) +** +** Therefore, the P4 parameter is only required if the default value for +** the column is a literal number, string or null. The sqlite3ValueFromExpr() +** function is capable of transforming these types of expressions into +** sqlite3_value objects. +** +** If parameter iReg is not negative, code an OP_RealAffinity instruction +** on register iReg. This is used when an equivalent integer value is +** stored in place of an 8-byte floating point value in order to save +** space. +*/ +SQLITE_PRIVATE void sqlite3ColumnDefault(Vdbe *v, Table *pTab, int i, int iReg){ + assert( pTab!=0 ); + if( !pTab->pSelect ){ + sqlite3_value *pValue = 0; + u8 enc = ENC(sqlite3VdbeDb(v)); + Column *pCol = &pTab->aCol[i]; + VdbeComment((v, "%s.%s", pTab->zName, pCol->zName)); + assert( inCol ); + sqlite3ValueFromExpr(sqlite3VdbeDb(v), pCol->pDflt, enc, + pCol->affinity, &pValue); + if( pValue ){ + sqlite3VdbeChangeP4(v, -1, (const char *)pValue, P4_MEM); + } +#ifndef SQLITE_OMIT_FLOATING_POINT + if( pTab->aCol[i].affinity==SQLITE_AFF_REAL ){ + sqlite3VdbeAddOp1(v, OP_RealAffinity, iReg); + } +#endif + } +} + +/* +** Process an UPDATE statement. +** +** UPDATE OR IGNORE table_wxyz SET a=b, c=d WHERE e<5 AND f NOT NULL; +** \_______/ \________/ \______/ \________________/ +* onError pTabList pChanges pWhere +*/ +SQLITE_PRIVATE void sqlite3Update( + Parse *pParse, /* The parser context */ + SrcList *pTabList, /* The table in which we should change things */ + ExprList *pChanges, /* Things to be changed */ + Expr *pWhere, /* The WHERE clause. May be null */ + int onError /* How to handle constraint errors */ +){ + int i, j; /* Loop counters */ + Table *pTab; /* The table to be updated */ + int addrTop = 0; /* VDBE instruction address of the start of the loop */ + WhereInfo *pWInfo; /* Information about the WHERE clause */ + Vdbe *v; /* The virtual database engine */ + Index *pIdx; /* For looping over indices */ + Index *pPk; /* The PRIMARY KEY index for WITHOUT ROWID tables */ + int nIdx; /* Number of indices that need updating */ + int iBaseCur; /* Base cursor number */ + int iDataCur; /* Cursor for the canonical data btree */ + int iIdxCur; /* Cursor for the first index */ + sqlite3 *db; /* The database structure */ + int *aRegIdx = 0; /* One register assigned to each index to be updated */ + int *aXRef = 0; /* aXRef[i] is the index in pChanges->a[] of the + ** an expression for the i-th column of the table. + ** aXRef[i]==-1 if the i-th column is not changed. */ + u8 *aToOpen; /* 1 for tables and indices to be opened */ + u8 chngPk; /* PRIMARY KEY changed in a WITHOUT ROWID table */ + u8 chngRowid; /* Rowid changed in a normal table */ + u8 chngKey; /* Either chngPk or chngRowid */ + Expr *pRowidExpr = 0; /* Expression defining the new record number */ + AuthContext sContext; /* The authorization context */ + NameContext sNC; /* The name-context to resolve expressions in */ + int iDb; /* Database containing the table being updated */ + int okOnePass; /* True for one-pass algorithm without the FIFO */ + int hasFK; /* True if foreign key processing is required */ + int labelBreak; /* Jump here to break out of UPDATE loop */ + int labelContinue; /* Jump here to continue next step of UPDATE loop */ + +#ifndef SQLITE_OMIT_TRIGGER + 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 */ + int iEph = 0; /* Ephemeral table holding all primary key values */ + int nKey = 0; /* Number of elements in regKey for WITHOUT ROWID */ + int aiCurOnePass[2]; /* The write cursors opened by WHERE_ONEPASS */ + + /* Register Allocations */ + int regRowCount = 0; /* A count of rows changed */ + int regOldRowid = 0; /* The old rowid */ + int regNewRowid = 0; /* The new rowid */ + int regNew = 0; /* Content of the NEW.* table in triggers */ + int regOld = 0; /* Content of OLD.* table in triggers */ + int regRowSet = 0; /* Rowset of rows to be updated */ + int regKey = 0; /* composite PRIMARY KEY value */ + + memset(&sContext, 0, sizeof(sContext)); + db = pParse->db; + if( pParse->nErr || db->mallocFailed ){ + goto update_cleanup; + } + assert( pTabList->nSrc==1 ); + + /* Locate the table which we want to update. + */ + pTab = sqlite3SrcListLookup(pParse, pTabList); + if( pTab==0 ) goto update_cleanup; + iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); + + /* Figure out if we have any triggers and if the table being + ** updated is a view. + */ +#ifndef SQLITE_OMIT_TRIGGER + 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 +# define isView 0 +#endif + + if( sqlite3ViewGetColumnNames(pParse, pTab) ){ + goto update_cleanup; + } + if( sqlite3IsReadOnly(pParse, pTab, tmask) ){ + goto update_cleanup; + } + + /* Allocate a cursors for the main database table and for all indices. + ** The index cursors might not be used, but if they are used they + ** need to occur right after the database cursor. So go ahead and + ** allocate enough space, just in case. + */ + pTabList->a[0].iCursor = iBaseCur = iDataCur = pParse->nTab++; + iIdxCur = iDataCur+1; + pPk = HasRowid(pTab) ? 0 : sqlite3PrimaryKeyIndex(pTab); + for(nIdx=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, nIdx++){ + if( IsPrimaryKeyIndex(pIdx) && pPk!=0 ){ + iDataCur = pParse->nTab; + pTabList->a[0].iCursor = iDataCur; + } + pParse->nTab++; + } + + /* Allocate space for aXRef[], aRegIdx[], and aToOpen[]. + ** Initialize aXRef[] and aToOpen[] to their default values. + */ + aXRef = sqlite3DbMallocRawNN(db, sizeof(int) * (pTab->nCol+nIdx) + nIdx+2 ); + if( aXRef==0 ) goto update_cleanup; + aRegIdx = aXRef+pTab->nCol; + aToOpen = (u8*)(aRegIdx+nIdx); + memset(aToOpen, 1, nIdx+1); + aToOpen[nIdx+1] = 0; + for(i=0; inCol; i++) aXRef[i] = -1; + + /* Initialize the name-context */ + memset(&sNC, 0, sizeof(sNC)); + sNC.pParse = pParse; + sNC.pSrcList = pTabList; + + /* Resolve the column names in all the expressions of the + ** of the UPDATE statement. Also find the column index + ** for each column to be updated in the pChanges array. For each + ** column to be updated, make sure we have authorization to change + ** that column. + */ + chngRowid = chngPk = 0; + for(i=0; inExpr; i++){ + if( sqlite3ResolveExprNames(&sNC, pChanges->a[i].pExpr) ){ + goto update_cleanup; + } + for(j=0; jnCol; j++){ + if( sqlite3StrICmp(pTab->aCol[j].zName, pChanges->a[i].zName)==0 ){ + if( j==pTab->iPKey ){ + chngRowid = 1; + pRowidExpr = pChanges->a[i].pExpr; + }else if( pPk && (pTab->aCol[j].colFlags & COLFLAG_PRIMKEY)!=0 ){ + chngPk = 1; + } + aXRef[j] = i; + break; + } + } + if( j>=pTab->nCol ){ + if( pPk==0 && sqlite3IsRowid(pChanges->a[i].zName) ){ + j = -1; + chngRowid = 1; + pRowidExpr = pChanges->a[i].pExpr; + }else{ + sqlite3ErrorMsg(pParse, "no such column: %s", pChanges->a[i].zName); + pParse->checkSchema = 1; + goto update_cleanup; + } + } +#ifndef SQLITE_OMIT_AUTHORIZATION + { + int rc; + rc = sqlite3AuthCheck(pParse, SQLITE_UPDATE, pTab->zName, + j<0 ? "ROWID" : pTab->aCol[j].zName, + db->aDb[iDb].zDbSName); + if( rc==SQLITE_DENY ){ + goto update_cleanup; + }else if( rc==SQLITE_IGNORE ){ + aXRef[j] = -1; + } + } +#endif + } + assert( (chngRowid & chngPk)==0 ); + assert( chngRowid==0 || chngRowid==1 ); + assert( chngPk==0 || chngPk==1 ); + chngKey = chngRowid + chngPk; + + /* The SET expressions are not actually used inside the WHERE loop. + ** So reset the colUsed mask. Unless this is a virtual table. In that + ** case, set all bits of the colUsed mask (to ensure that the virtual + ** table implementation makes all columns available). + */ + pTabList->a[0].colUsed = IsVirtual(pTab) ? ALLBITS : 0; + + hasFK = sqlite3FkRequired(pParse, pTab, aXRef, chngKey); + + /* There is one entry in the aRegIdx[] array for each index on the table + ** being updated. Fill in aRegIdx[] with a register number that will hold + ** the key for accessing each index. + ** + ** FIXME: Be smarter about omitting indexes that use expressions. + */ + for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ + int reg; + if( chngKey || hasFK || pIdx->pPartIdxWhere || pIdx==pPk ){ + reg = ++pParse->nMem; + }else{ + reg = 0; + for(i=0; inKeyCol; i++){ + i16 iIdxCol = pIdx->aiColumn[i]; + if( iIdxCol<0 || aXRef[iIdxCol]>=0 ){ + reg = ++pParse->nMem; + break; + } + } + } + if( reg==0 ) aToOpen[j+1] = 0; + aRegIdx[j] = reg; + } + + /* Begin generating code. */ + v = sqlite3GetVdbe(pParse); + if( v==0 ) goto update_cleanup; + if( pParse->nested==0 ) sqlite3VdbeCountChanges(v); + sqlite3BeginWriteOperation(pParse, 1, iDb); + + /* Allocate required registers. */ + if( !IsVirtual(pTab) ){ + regRowSet = ++pParse->nMem; + regOldRowid = regNewRowid = ++pParse->nMem; + if( chngPk || pTrigger || hasFK ){ + regOld = pParse->nMem + 1; + pParse->nMem += pTab->nCol; + } + if( chngKey || pTrigger || hasFK ){ + regNewRowid = ++pParse->nMem; + } + regNew = pParse->nMem + 1; + pParse->nMem += pTab->nCol; + } + + /* Start the view context. */ + if( isView ){ + sqlite3AuthContextPush(pParse, &sContext, pTab->zName); + } + + /* If we are trying to update a view, realize that view into + ** an ephemeral table. + */ +#if !defined(SQLITE_OMIT_VIEW) && !defined(SQLITE_OMIT_TRIGGER) + if( isView ){ + sqlite3MaterializeView(pParse, pTab, pWhere, iDataCur); + } +#endif + + /* Resolve the column names in all the expressions in the + ** WHERE clause. + */ + if( sqlite3ResolveExprNames(&sNC, pWhere) ){ + goto update_cleanup; + } + +#ifndef SQLITE_OMIT_VIRTUALTABLE + /* Virtual tables must be handled separately */ + if( IsVirtual(pTab) ){ + updateVirtualTable(pParse, pTabList, pTab, pChanges, pRowidExpr, aXRef, + pWhere, onError); + goto update_cleanup; + } +#endif + + /* Begin the database scan + */ + if( HasRowid(pTab) ){ + sqlite3VdbeAddOp3(v, OP_Null, 0, regRowSet, regOldRowid); + pWInfo = sqlite3WhereBegin( + pParse, pTabList, pWhere, 0, 0, + WHERE_ONEPASS_DESIRED | WHERE_SEEK_TABLE, iIdxCur + ); + if( pWInfo==0 ) goto update_cleanup; + okOnePass = sqlite3WhereOkOnePass(pWInfo, aiCurOnePass); + + /* Remember the rowid of every item to be updated. + */ + sqlite3VdbeAddOp2(v, OP_Rowid, iDataCur, regOldRowid); + if( !okOnePass ){ + sqlite3VdbeAddOp2(v, OP_RowSetAdd, regRowSet, regOldRowid); + } + + /* End the database scan loop. + */ + sqlite3WhereEnd(pWInfo); + }else{ + int iPk; /* First of nPk memory cells holding PRIMARY KEY value */ + i16 nPk; /* Number of components of the PRIMARY KEY */ + int addrOpen; /* Address of the OpenEphemeral instruction */ + + assert( pPk!=0 ); + nPk = pPk->nKeyCol; + iPk = pParse->nMem+1; + pParse->nMem += nPk; + regKey = ++pParse->nMem; + iEph = pParse->nTab++; + sqlite3VdbeAddOp2(v, OP_Null, 0, iPk); + addrOpen = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, iEph, nPk); + sqlite3VdbeSetP4KeyInfo(pParse, pPk); + pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, 0, 0, + WHERE_ONEPASS_DESIRED, iIdxCur); + if( pWInfo==0 ) goto update_cleanup; + okOnePass = sqlite3WhereOkOnePass(pWInfo, aiCurOnePass); + for(i=0; iaiColumn[i]>=0 ); + sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, pPk->aiColumn[i], + iPk+i); + } + if( okOnePass ){ + sqlite3VdbeChangeToNoop(v, addrOpen); + nKey = nPk; + regKey = iPk; + }else{ + sqlite3VdbeAddOp4(v, OP_MakeRecord, iPk, nPk, regKey, + sqlite3IndexAffinityStr(db, pPk), nPk); + sqlite3VdbeAddOp2(v, OP_IdxInsert, iEph, regKey); + } + sqlite3WhereEnd(pWInfo); + } + + /* Initialize the count of updated rows + */ + if( (db->flags & SQLITE_CountRows) && !pParse->pTriggerTab ){ + regRowCount = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Integer, 0, regRowCount); + } + + labelBreak = sqlite3VdbeMakeLabel(v); + if( !isView ){ + /* + ** Open every index that needs updating. Note that if any + ** index could potentially invoke a REPLACE conflict resolution + ** action, then we need to open all indices because we might need + ** to be deleting some records. + */ + if( onError==OE_Replace ){ + memset(aToOpen, 1, nIdx+1); + }else{ + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + if( pIdx->onError==OE_Replace ){ + memset(aToOpen, 1, nIdx+1); + break; + } + } + } + if( okOnePass ){ + if( aiCurOnePass[0]>=0 ) aToOpen[aiCurOnePass[0]-iBaseCur] = 0; + if( aiCurOnePass[1]>=0 ) aToOpen[aiCurOnePass[1]-iBaseCur] = 0; + } + sqlite3OpenTableAndIndices(pParse, pTab, OP_OpenWrite, 0, iBaseCur, aToOpen, + 0, 0); + } + + /* Top of the update loop */ + if( okOnePass ){ + if( aToOpen[iDataCur-iBaseCur] && !isView ){ + assert( pPk ); + sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, labelBreak, regKey, nKey); + VdbeCoverageNeverTaken(v); + } + labelContinue = labelBreak; + sqlite3VdbeAddOp2(v, OP_IsNull, pPk ? regKey : regOldRowid, labelBreak); + VdbeCoverageIf(v, pPk==0); + VdbeCoverageIf(v, pPk!=0); + }else if( pPk ){ + labelContinue = sqlite3VdbeMakeLabel(v); + sqlite3VdbeAddOp2(v, OP_Rewind, iEph, labelBreak); VdbeCoverage(v); + addrTop = sqlite3VdbeAddOp2(v, OP_RowKey, iEph, regKey); + sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, labelContinue, regKey, 0); + VdbeCoverage(v); + }else{ + labelContinue = sqlite3VdbeAddOp3(v, OP_RowSetRead, regRowSet, labelBreak, + regOldRowid); + VdbeCoverage(v); + sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, labelContinue, regOldRowid); + VdbeCoverage(v); + } + + /* If the record number will change, set register regNewRowid to + ** contain the new value. If the record number is not being modified, + ** then regNewRowid is the same register as regOldRowid, which is + ** already populated. */ + assert( chngKey || pTrigger || hasFK || regOldRowid==regNewRowid ); + if( chngRowid ){ + sqlite3ExprCode(pParse, pRowidExpr, regNewRowid); + sqlite3VdbeAddOp1(v, OP_MustBeInt, regNewRowid); VdbeCoverage(v); + } + + /* Compute the old pre-UPDATE content of the row being changed, if that + ** information is needed */ + if( chngPk || hasFK || pTrigger ){ + u32 oldmask = (hasFK ? sqlite3FkOldmask(pParse, pTab) : 0); + oldmask |= sqlite3TriggerColmask(pParse, + pTrigger, pChanges, 0, TRIGGER_BEFORE|TRIGGER_AFTER, pTab, onError + ); + for(i=0; inCol; i++){ + if( oldmask==0xffffffff + || (i<32 && (oldmask & MASKBIT32(i))!=0) + || (pTab->aCol[i].colFlags & COLFLAG_PRIMKEY)!=0 + ){ + testcase( oldmask!=0xffffffff && i==31 ); + sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, i, regOld+i); + }else{ + sqlite3VdbeAddOp2(v, OP_Null, 0, regOld+i); + } + } + if( chngRowid==0 && pPk==0 ){ + sqlite3VdbeAddOp2(v, OP_Copy, regOldRowid, regNewRowid); + } + } + + /* Populate the array of registers beginning at regNew with the new + ** row data. This array is used to check constants, create the new + ** table and index records, and as the values for any new.* references + ** made by triggers. + ** + ** If there are one or more BEFORE triggers, then do not populate the + ** registers associated with columns that are (a) not modified by + ** this UPDATE statement and (b) not accessed by new.* references. The + ** values for registers not modified by the UPDATE must be reloaded from + ** the database after the BEFORE triggers are fired anyway (as the trigger + ** may have modified them). So not loading those that are not going to + ** be used eliminates some redundant opcodes. + */ + newmask = sqlite3TriggerColmask( + pParse, pTrigger, pChanges, 1, TRIGGER_BEFORE, pTab, onError + ); + for(i=0; inCol; i++){ + if( i==pTab->iPKey ){ + sqlite3VdbeAddOp2(v, OP_Null, 0, regNew+i); + }else{ + j = aXRef[i]; + if( j>=0 ){ + sqlite3ExprCode(pParse, pChanges->a[j].pExpr, regNew+i); + }else if( 0==(tmask&TRIGGER_BEFORE) || i>31 || (newmask & MASKBIT32(i)) ){ + /* This branch loads the value of a column that will not be changed + ** into a register. This is done if there are no BEFORE triggers, or + ** if there are one or more BEFORE triggers that use this value via + ** a new.* reference in a trigger program. + */ + testcase( i==31 ); + testcase( i==32 ); + sqlite3ExprCodeGetColumnToReg(pParse, pTab, i, iDataCur, regNew+i); + }else{ + sqlite3VdbeAddOp2(v, OP_Null, 0, regNew+i); + } + } + } + + /* Fire any BEFORE UPDATE triggers. This happens before constraints are + ** verified. One could argue that this is wrong. + */ + if( tmask&TRIGGER_BEFORE ){ + sqlite3TableAffinity(v, pTab, regNew); + sqlite3CodeRowTrigger(pParse, pTrigger, TK_UPDATE, pChanges, + TRIGGER_BEFORE, pTab, regOldRowid, onError, labelContinue); + + /* The row-trigger may have deleted the row being updated. In this + ** case, jump to the next row. No updates or AFTER triggers are + ** required. This behavior - what happens when the row being updated + ** is deleted or renamed by a BEFORE trigger - is left undefined in the + ** documentation. + */ + if( pPk ){ + sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, labelContinue,regKey,nKey); + VdbeCoverage(v); + }else{ + sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, labelContinue, regOldRowid); + VdbeCoverage(v); + } + + /* 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 ){ + sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, i, regNew+i); + } + } + } + + if( !isView ){ + int addr1 = 0; /* Address of jump instruction */ + int bReplace = 0; /* True if REPLACE conflict resolution might happen */ + + /* Do constraint checks. */ + assert( regOldRowid>0 ); + sqlite3GenerateConstraintChecks(pParse, pTab, aRegIdx, iDataCur, iIdxCur, + regNewRowid, regOldRowid, chngKey, onError, labelContinue, &bReplace, + aXRef); + + /* Do FK constraint checks. */ + if( hasFK ){ + sqlite3FkCheck(pParse, pTab, regOldRowid, 0, aXRef, chngKey); + } + + /* Delete the index entries associated with the current record. */ + if( bReplace || chngKey ){ + if( pPk ){ + addr1 = sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, 0, regKey, nKey); + }else{ + addr1 = sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, 0, regOldRowid); + } + VdbeCoverageNeverTaken(v); + } + sqlite3GenerateRowIndexDelete(pParse, pTab, iDataCur, iIdxCur, aRegIdx, -1); + + /* If changing the rowid value, or if there are foreign key constraints + ** to process, delete the old record. Otherwise, add a noop OP_Delete + ** to invoke the pre-update hook. + ** + ** That (regNew==regnewRowid+1) is true is also important for the + ** pre-update hook. If the caller invokes preupdate_new(), the returned + ** value is copied from memory cell (regNewRowid+1+iCol), where iCol + ** is the column index supplied by the user. + */ + assert( regNew==regNewRowid+1 ); +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + sqlite3VdbeAddOp3(v, OP_Delete, iDataCur, + OPFLAG_ISUPDATE | ((hasFK || chngKey || pPk!=0) ? 0 : OPFLAG_ISNOOP), + regNewRowid + ); + if( !pParse->nested ){ + sqlite3VdbeChangeP4(v, -1, (char*)pTab, P4_TABLE); + } +#else + if( hasFK || chngKey || pPk!=0 ){ + sqlite3VdbeAddOp2(v, OP_Delete, iDataCur, 0); + } +#endif + if( bReplace || chngKey ){ + sqlite3VdbeJumpHere(v, addr1); + } + + if( hasFK ){ + sqlite3FkCheck(pParse, pTab, 0, regNewRowid, aXRef, chngKey); + } + + /* Insert the new index entries and the new record. */ + sqlite3CompleteInsertion(pParse, pTab, iDataCur, iIdxCur, + regNewRowid, aRegIdx, 1, 0, 0); + + /* Do any ON CASCADE, SET NULL or SET DEFAULT operations required to + ** handle rows (possibly in other tables) that refer via a foreign key + ** to the row just updated. */ + if( hasFK ){ + sqlite3FkActions(pParse, pTab, pChanges, regOldRowid, aXRef, chngKey); + } + } + + /* Increment the row counter + */ + if( (db->flags & SQLITE_CountRows) && !pParse->pTriggerTab){ + sqlite3VdbeAddOp2(v, OP_AddImm, regRowCount, 1); + } + + sqlite3CodeRowTrigger(pParse, pTrigger, TK_UPDATE, pChanges, + TRIGGER_AFTER, pTab, regOldRowid, onError, labelContinue); + + /* Repeat the above with the next record to be updated, until + ** all record selected by the WHERE clause have been updated. + */ + if( okOnePass ){ + /* Nothing to do at end-of-loop for a single-pass */ + }else if( pPk ){ + sqlite3VdbeResolveLabel(v, labelContinue); + sqlite3VdbeAddOp2(v, OP_Next, iEph, addrTop); VdbeCoverage(v); + }else{ + sqlite3VdbeGoto(v, labelContinue); + } + sqlite3VdbeResolveLabel(v, labelBreak); + + /* Close all tables */ + for(i=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, i++){ + assert( aRegIdx ); + if( aToOpen[i+1] ){ + sqlite3VdbeAddOp2(v, OP_Close, iIdxCur+i, 0); + } + } + if( iDataCurnested==0 && pParse->pTriggerTab==0 ){ + sqlite3AutoincrementEnd(pParse); + } + + /* + ** Return the number of rows that were changed. If this routine is + ** generating code because of a call to sqlite3NestedParse(), do not + ** invoke the callback function. + */ + if( (db->flags&SQLITE_CountRows) && !pParse->pTriggerTab && !pParse->nested ){ + sqlite3VdbeAddOp2(v, OP_ResultRow, regRowCount, 1); + sqlite3VdbeSetNumCols(v, 1); + sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "rows updated", SQLITE_STATIC); + } + +update_cleanup: + sqlite3AuthContextPop(&sContext); + sqlite3DbFree(db, aXRef); /* Also frees aRegIdx[] and aToOpen[] */ + sqlite3SrcListDelete(db, pTabList); + sqlite3ExprListDelete(db, pChanges); + sqlite3ExprDelete(db, pWhere); + return; +} +/* Make sure "isView" and other macros defined above are undefined. Otherwise +** they may interfere with compilation of other functions in this file +** (or in another file, if this file becomes part of the amalgamation). */ +#ifdef isView + #undef isView +#endif +#ifdef pTrigger + #undef pTrigger +#endif + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* +** Generate code for an UPDATE of a virtual table. +** +** There are two possible strategies - the default and the special +** "onepass" strategy. Onepass is only used if the virtual table +** implementation indicates that pWhere may match at most one row. +** +** The default strategy is to create an ephemeral table that contains +** for each row to be changed: +** +** (A) The original rowid of that row. +** (B) The revised rowid for the row. +** (C) The content of every column in the row. +** +** Then loop through the contents of this ephemeral table executing a +** VUpdate for each row. When finished, drop the ephemeral table. +** +** The "onepass" strategy does not use an ephemeral table. Instead, it +** stores the same values (A, B and C above) in a register array and +** makes a single invocation of VUpdate. +*/ +static void updateVirtualTable( + Parse *pParse, /* The parsing context */ + SrcList *pSrc, /* The virtual table to be modified */ + Table *pTab, /* The virtual table */ + ExprList *pChanges, /* The columns to change in the UPDATE statement */ + Expr *pRowid, /* Expression used to recompute the rowid */ + int *aXRef, /* Mapping from columns of pTab to entries in pChanges */ + Expr *pWhere, /* WHERE clause of the UPDATE statement */ + int onError /* ON CONFLICT strategy */ +){ + Vdbe *v = pParse->pVdbe; /* Virtual machine under construction */ + int ephemTab; /* Table holding the result of the SELECT */ + int i; /* Loop counter */ + sqlite3 *db = pParse->db; /* Database connection */ + const char *pVTab = (const char*)sqlite3GetVTable(db, pTab); + WhereInfo *pWInfo; + int nArg = 2 + pTab->nCol; /* Number of arguments to VUpdate */ + int regArg; /* First register in VUpdate arg array */ + int regRec; /* Register in which to assemble record */ + int regRowid; /* Register for ephem table rowid */ + int iCsr = pSrc->a[0].iCursor; /* Cursor used for virtual table scan */ + int aDummy[2]; /* Unused arg for sqlite3WhereOkOnePass() */ + int bOnePass; /* True to use onepass strategy */ + int addr; /* Address of OP_OpenEphemeral */ + + /* Allocate nArg registers to martial the arguments to VUpdate. Then + ** create and open the ephemeral table in which the records created from + ** these arguments will be temporarily stored. */ + assert( v ); + ephemTab = pParse->nTab++; + addr= sqlite3VdbeAddOp2(v, OP_OpenEphemeral, ephemTab, nArg); + regArg = pParse->nMem + 1; + pParse->nMem += nArg; + regRec = ++pParse->nMem; + regRowid = ++pParse->nMem; + + /* Start scanning the virtual table */ + pWInfo = sqlite3WhereBegin(pParse, pSrc, pWhere, 0,0,WHERE_ONEPASS_DESIRED,0); + if( pWInfo==0 ) return; + + /* Populate the argument registers. */ + sqlite3VdbeAddOp2(v, OP_Rowid, iCsr, regArg); + if( pRowid ){ + sqlite3ExprCode(pParse, pRowid, regArg+1); + }else{ + sqlite3VdbeAddOp2(v, OP_Rowid, iCsr, regArg+1); + } + for(i=0; inCol; i++){ + if( aXRef[i]>=0 ){ + sqlite3ExprCode(pParse, pChanges->a[aXRef[i]].pExpr, regArg+2+i); + }else{ + sqlite3VdbeAddOp3(v, OP_VColumn, iCsr, i, regArg+2+i); + } + } + + bOnePass = sqlite3WhereOkOnePass(pWInfo, aDummy); + + if( bOnePass ){ + /* If using the onepass strategy, no-op out the OP_OpenEphemeral coded + ** above. Also, if this is a top-level parse (not a trigger), clear the + ** multi-write flag so that the VM does not open a statement journal */ + sqlite3VdbeChangeToNoop(v, addr); + if( sqlite3IsToplevel(pParse) ){ + pParse->isMultiWrite = 0; + } + }else{ + /* Create a record from the argument register contents and insert it into + ** the ephemeral table. */ + sqlite3VdbeAddOp3(v, OP_MakeRecord, regArg, nArg, regRec); + sqlite3VdbeAddOp2(v, OP_NewRowid, ephemTab, regRowid); + sqlite3VdbeAddOp3(v, OP_Insert, ephemTab, regRec, regRowid); + } + + + if( bOnePass==0 ){ + /* End the virtual table scan */ + sqlite3WhereEnd(pWInfo); + + /* Begin scannning through the ephemeral table. */ + addr = sqlite3VdbeAddOp1(v, OP_Rewind, ephemTab); VdbeCoverage(v); + + /* Extract arguments from the current row of the ephemeral table and + ** invoke the VUpdate method. */ + for(i=0; i=2 || iDb==0) ){ + sqlite3VdbeAddOp1(v, OP_Vacuum, iDb); + sqlite3VdbeUsesBtree(v, iDb); + } + return; +} + +/* +** This routine implements the OP_Vacuum opcode of the VDBE. +*/ +SQLITE_PRIVATE int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db, int iDb){ + int rc = SQLITE_OK; /* Return code from service routines */ + Btree *pMain; /* The database being vacuumed */ + Btree *pTemp; /* The temporary database we vacuum into */ + 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 */ + u8 saved_mTrace; /* Saved trace settings */ + Db *pDb = 0; /* Database to detach at end of vacuum */ + int isMemDb; /* True if vacuuming a :memory: database */ + int nRes; /* Bytes of reserved space at the end of each page */ + int nDb; /* Number of attached databases */ + const char *zDbMain; /* Schema name of database to vacuum */ + + if( !db->autoCommit ){ + sqlite3SetString(pzErrMsg, db, "cannot VACUUM from within a transaction"); + return SQLITE_ERROR; + } + if( db->nVdbeActive>1 ){ + sqlite3SetString(pzErrMsg, db,"cannot VACUUM - SQL statements in progress"); + return SQLITE_ERROR; + } + + /* Save the current value of the database flags so that it can be + ** restored before returning. Then set the writable-schema flag, and + ** disable CHECK and foreign key constraints. */ + saved_flags = db->flags; + saved_nChange = db->nChange; + saved_nTotalChange = db->nTotalChange; + saved_mTrace = db->mTrace; + db->flags |= (SQLITE_WriteSchema | SQLITE_IgnoreChecks + | SQLITE_PreferBuiltin | SQLITE_Vacuum); + db->flags &= ~(SQLITE_ForeignKeys | SQLITE_ReverseOrder | SQLITE_CountRows); + db->mTrace = 0; + + zDbMain = db->aDb[iDb].zDbSName; + pMain = db->aDb[iDb].pBt; + isMemDb = sqlite3PagerIsMemdb(sqlite3BtreePager(pMain)); + + /* Attach the temporary database as 'vacuum_db'. The synchronous pragma + ** can be set to 'off' for this file, as it is not recovered if a crash + ** occurs anyway. The integrity of the database is maintained by a + ** (possibly synchronous) transaction opened on the main database before + ** sqlite3BtreeCopyFile() is called. + ** + ** An optimisation would be to use a non-journaled pager. + ** (Later:) I tried setting "PRAGMA vacuum_db.journal_mode=OFF" but + ** that actually made the VACUUM run slower. Very little journalling + ** actually occurs when doing a vacuum since the vacuum_db is initially + ** empty. Only the journal header is written. Apparently it takes more + ** time to parse and run the PRAGMA to turn journalling off than it does + ** to write the journal header file. + */ + nDb = db->nDb; + rc = execSql(db, pzErrMsg, "ATTACH''AS vacuum_db"); + if( rc!=SQLITE_OK ) goto end_of_vacuum; + assert( (db->nDb-1)==nDb ); + pDb = &db->aDb[nDb]; + assert( strcmp(pDb->zDbSName,"vacuum_db")==0 ); + pTemp = pDb->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 = sqlite3BtreeGetOptimalReserve(pMain); + + /* A VACUUM cannot change the pagesize of an encrypted database. */ +#ifdef SQLITE_HAS_CODEC + if( db->nextPagesize ){ + extern void sqlite3CodecGetKey(sqlite3*, int, void**, int*); + int nKey; + char *zKey; + sqlite3CodecGetKey(db, 0, (void**)&zKey, &nKey); + if( nKey ) db->nextPagesize = 0; + } +#endif + + sqlite3BtreeSetCacheSize(pTemp, db->aDb[iDb].pSchema->cache_size); + sqlite3BtreeSetSpillSize(pTemp, sqlite3BtreeSetSpillSize(pMain,0)); + sqlite3BtreeSetPagerFlags(pTemp, PAGER_SYNCHRONOUS_OFF|PAGER_CACHESPILL); + + /* Begin a transaction and take an exclusive lock on the main database + ** file. This is done before the sqlite3BtreeGetPageSize(pMain) call below, + ** to ensure that we do not try to change the page-size on a WAL database. + */ + rc = execSql(db, pzErrMsg, "BEGIN"); + if( rc!=SQLITE_OK ) goto end_of_vacuum; + rc = sqlite3BtreeBeginTrans(pMain, 2); + if( rc!=SQLITE_OK ) goto end_of_vacuum; + + /* Do not attempt to change the page size for a WAL database */ + if( sqlite3PagerGetJournalMode(sqlite3BtreePager(pMain)) + ==PAGER_JOURNALMODE_WAL ){ + db->nextPagesize = 0; + } + + if( sqlite3BtreeSetPageSize(pTemp, sqlite3BtreeGetPageSize(pMain), nRes, 0) + || (!isMemDb && sqlite3BtreeSetPageSize(pTemp, db->nextPagesize, nRes, 0)) + || NEVER(db->mallocFailed) + ){ + rc = SQLITE_NOMEM_BKPT; + goto end_of_vacuum; + } + +#ifndef SQLITE_OMIT_AUTOVACUUM + sqlite3BtreeSetAutoVacuum(pTemp, db->nextAutovac>=0 ? db->nextAutovac : + sqlite3BtreeGetAutoVacuum(pMain)); +#endif + + /* Query the schema of the main database. Create a mirror schema + ** in the temporary database. + */ + db->init.iDb = nDb; /* force new CREATE statements into vacuum_db */ + rc = execSqlF(db, pzErrMsg, + "SELECT sql FROM \"%w\".sqlite_master" + " WHERE type='table'AND name<>'sqlite_sequence'" + " AND coalesce(rootpage,1)>0", + zDbMain + ); + if( rc!=SQLITE_OK ) goto end_of_vacuum; + rc = execSqlF(db, pzErrMsg, + "SELECT sql FROM \"%w\".sqlite_master" + " WHERE type='index' AND length(sql)>10", + zDbMain + ); + if( rc!=SQLITE_OK ) goto end_of_vacuum; + db->init.iDb = 0; + + /* Loop through the tables in the main database. For each, do + ** an "INSERT INTO vacuum_db.xxx SELECT * FROM main.xxx;" to copy + ** the contents to the temporary database. + */ + rc = execSqlF(db, pzErrMsg, + "SELECT'INSERT INTO vacuum_db.'||quote(name)" + "||' SELECT*FROM\"%w\".'||quote(name)" + "FROM vacuum_db.sqlite_master " + "WHERE type='table'AND coalesce(rootpage,1)>0", + zDbMain + ); + assert( (db->flags & SQLITE_Vacuum)!=0 ); + db->flags &= ~SQLITE_Vacuum; + if( rc!=SQLITE_OK ) goto end_of_vacuum; + + /* Copy the triggers, views, and virtual tables from the main database + ** over to the temporary database. None of these objects has any + ** associated storage, so all we have to do is copy their entries + ** from the SQLITE_MASTER table. + */ + rc = execSqlF(db, pzErrMsg, + "INSERT INTO vacuum_db.sqlite_master" + " SELECT*FROM \"%w\".sqlite_master" + " WHERE type IN('view','trigger')" + " OR(type='table'AND rootpage=0)", + zDbMain + ); + if( rc ) goto end_of_vacuum; + + /* At this point, there is a write transaction open on both the + ** vacuum database and the main database. Assuming no error occurs, + ** both transactions are closed by this block - the main database + ** transaction by sqlite3BtreeCopyFile() and the other by an explicit + ** call to sqlite3BtreeCommit(). + */ + { + u32 meta; + int i; + + /* This array determines which meta meta values are preserved in the + ** vacuum. Even entries are the meta value number and odd entries + ** are an increment to apply to the meta value after the vacuum. + ** The increment is used to increase the schema cookie so that other + ** connections to the same database will know to reread the schema. + */ + static const unsigned char aCopy[] = { + BTREE_SCHEMA_VERSION, 1, /* Add one to the old schema cookie */ + BTREE_DEFAULT_CACHE_SIZE, 0, /* Preserve the default page cache size */ + BTREE_TEXT_ENCODING, 0, /* Preserve the text encoding */ + BTREE_USER_VERSION, 0, /* Preserve the user version */ + BTREE_APPLICATION_ID, 0, /* Preserve the application id */ + }; + + assert( 1==sqlite3BtreeIsInTrans(pTemp) ); + assert( 1==sqlite3BtreeIsInTrans(pMain) ); + + /* Copy Btree meta values */ + for(i=0; iflags */ + db->init.iDb = 0; + db->flags = saved_flags; + db->nChange = saved_nChange; + db->nTotalChange = saved_nTotalChange; + db->mTrace = saved_mTrace; + sqlite3BtreeSetPageSize(pMain, -1, -1, 1); + + /* Currently there is an SQL level transaction open on the vacuum + ** database. No locks are held on any other files (since the main file + ** was committed at the btree level). So it safe to end the transaction + ** by manually setting the autoCommit flag to true and detaching the + ** vacuum database. The vacuum_db journal file is deleted when the pager + ** is closed by the DETACH. + */ + db->autoCommit = 1; + + if( pDb ){ + sqlite3BtreeClose(pDb->pBt); + pDb->pBt = 0; + pDb->pSchema = 0; + } + + /* This both clears the schemas and reduces the size of the db->aDb[] + ** array. */ + sqlite3ResetAllSchemasOfConnection(db); + + return rc; +} + +#endif /* SQLITE_OMIT_VACUUM && SQLITE_OMIT_ATTACH */ + +/************** End of vacuum.c **********************************************/ +/************** Begin file vtab.c ********************************************/ +/* +** 2006 June 10 +** +** 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 help implement virtual tables. +*/ +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* #include "sqliteInt.h" */ + +/* +** Before a virtual table xCreate() or xConnect() method is invoked, the +** sqlite3.pVtabCtx member variable is set to point to an instance of +** this struct allocated on the stack. It is used by the implementation of +** the sqlite3_declare_vtab() and sqlite3_vtab_config() APIs, both of which +** are invoked only from within xCreate and xConnect methods. +*/ +struct VtabCtx { + VTable *pVTable; /* The virtual table being constructed */ + Table *pTab; /* The Table object to which the virtual table belongs */ + VtabCtx *pPrior; /* Parent context (if any) */ + int bDeclared; /* True after sqlite3_declare_vtab() is called */ +}; + +/* +** The actual function that does the work of creating a new module. +** This function implements the sqlite3_create_module() and +** sqlite3_create_module_v2() interfaces. +*/ +static int createModule( + sqlite3 *db, /* Database in which module is registered */ + const char *zName, /* Name assigned to this module */ + const sqlite3_module *pModule, /* The definition of the module */ + void *pAux, /* Context pointer for xCreate/xConnect */ + void (*xDestroy)(void *) /* Module destructor function */ +){ + int rc = SQLITE_OK; + int nName; + + sqlite3_mutex_enter(db->mutex); + nName = sqlite3Strlen30(zName); + if( sqlite3HashFind(&db->aModule, zName) ){ + rc = SQLITE_MISUSE_BKPT; + }else{ + Module *pMod; + pMod = (Module *)sqlite3DbMallocRawNN(db, sizeof(Module) + nName + 1); + if( pMod ){ + Module *pDel; + char *zCopy = (char *)(&pMod[1]); + memcpy(zCopy, zName, nName+1); + pMod->zName = zCopy; + pMod->pModule = pModule; + pMod->pAux = pAux; + pMod->xDestroy = xDestroy; + pMod->pEpoTab = 0; + pDel = (Module *)sqlite3HashInsert(&db->aModule,zCopy,(void*)pMod); + assert( pDel==0 || pDel==pMod ); + if( pDel ){ + sqlite3OomFault(db); + sqlite3DbFree(db, pDel); + } + } + } + rc = sqlite3ApiExit(db, rc); + if( rc!=SQLITE_OK && xDestroy ) xDestroy(pAux); + + sqlite3_mutex_leave(db->mutex); + return rc; +} + + +/* +** External API function used to create a new virtual-table module. +*/ +SQLITE_API int sqlite3_create_module( + sqlite3 *db, /* Database in which module is registered */ + const char *zName, /* Name assigned to this module */ + const sqlite3_module *pModule, /* The definition of the module */ + void *pAux /* Context pointer for xCreate/xConnect */ +){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) || zName==0 ) return SQLITE_MISUSE_BKPT; +#endif + return createModule(db, zName, pModule, pAux, 0); +} + +/* +** External API function used to create a new virtual-table module. +*/ +SQLITE_API int sqlite3_create_module_v2( + sqlite3 *db, /* Database in which module is registered */ + const char *zName, /* Name assigned to this module */ + const sqlite3_module *pModule, /* The definition of the module */ + void *pAux, /* Context pointer for xCreate/xConnect */ + void (*xDestroy)(void *) /* Module destructor function */ +){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) || zName==0 ) return SQLITE_MISUSE_BKPT; +#endif + return createModule(db, zName, pModule, pAux, xDestroy); +} + +/* +** Lock the virtual table so that it cannot be disconnected. +** Locks nest. Every lock should have a corresponding unlock. +** If an unlock is omitted, resources leaks will occur. +** +** If a disconnect is attempted while a virtual table is locked, +** the disconnect is deferred until all locks have been removed. +*/ +SQLITE_PRIVATE void sqlite3VtabLock(VTable *pVTab){ + pVTab->nRef++; +} + + +/* +** pTab is a pointer to a Table structure representing a virtual-table. +** Return a pointer to the VTable object used by connection db to access +** this virtual-table, if one has been created, or NULL otherwise. +*/ +SQLITE_PRIVATE VTable *sqlite3GetVTable(sqlite3 *db, Table *pTab){ + VTable *pVtab; + assert( IsVirtual(pTab) ); + for(pVtab=pTab->pVTable; pVtab && pVtab->db!=db; pVtab=pVtab->pNext); + return pVtab; +} + +/* +** Decrement the ref-count on a virtual table object. When the ref-count +** reaches zero, call the xDisconnect() method to delete the object. +*/ +SQLITE_PRIVATE void sqlite3VtabUnlock(VTable *pVTab){ + sqlite3 *db = pVTab->db; + + assert( db ); + assert( pVTab->nRef>0 ); + assert( db->magic==SQLITE_MAGIC_OPEN || db->magic==SQLITE_MAGIC_ZOMBIE ); + + pVTab->nRef--; + if( pVTab->nRef==0 ){ + sqlite3_vtab *p = pVTab->pVtab; + if( p ){ + p->pModule->xDisconnect(p); + } + sqlite3DbFree(db, pVTab); + } +} + +/* +** Table p is a virtual table. This function moves all elements in the +** p->pVTable list to the sqlite3.pDisconnect lists of their associated +** database connections to be disconnected at the next opportunity. +** Except, if argument db is not NULL, then the entry associated with +** connection db is left in the p->pVTable list. +*/ +static VTable *vtabDisconnectAll(sqlite3 *db, Table *p){ + VTable *pRet = 0; + VTable *pVTable = p->pVTable; + p->pVTable = 0; + + /* Assert that the mutex (if any) associated with the BtShared database + ** that contains table p is held by the caller. See header comments + ** above function sqlite3VtabUnlockList() for an explanation of why + ** this makes it safe to access the sqlite3.pDisconnect list of any + ** database connection that may have an entry in the p->pVTable list. + */ + assert( db==0 || sqlite3SchemaMutexHeld(db, 0, p->pSchema) ); + + while( pVTable ){ + sqlite3 *db2 = pVTable->db; + VTable *pNext = pVTable->pNext; + assert( db2 ); + if( db2==db ){ + pRet = pVTable; + p->pVTable = pRet; + pRet->pNext = 0; + }else{ + pVTable->pNext = db2->pDisconnect; + db2->pDisconnect = pVTable; + } + pVTable = pNext; + } + + assert( !db || pRet ); + return pRet; +} + +/* +** Table *p is a virtual table. This function removes the VTable object +** for table *p associated with database connection db from the linked +** list in p->pVTab. It also decrements the VTable ref count. This is +** used when closing database connection db to free all of its VTable +** objects without disturbing the rest of the Schema object (which may +** be being used by other shared-cache connections). +*/ +SQLITE_PRIVATE void sqlite3VtabDisconnect(sqlite3 *db, Table *p){ + VTable **ppVTab; + + assert( IsVirtual(p) ); + assert( sqlite3BtreeHoldsAllMutexes(db) ); + assert( sqlite3_mutex_held(db->mutex) ); + + for(ppVTab=&p->pVTable; *ppVTab; ppVTab=&(*ppVTab)->pNext){ + if( (*ppVTab)->db==db ){ + VTable *pVTab = *ppVTab; + *ppVTab = pVTab->pNext; + sqlite3VtabUnlock(pVTab); + break; + } + } +} + + +/* +** Disconnect all the virtual table objects in the sqlite3.pDisconnect list. +** +** This function may only be called when the mutexes associated with all +** shared b-tree databases opened using connection db are held by the +** caller. This is done to protect the sqlite3.pDisconnect list. The +** sqlite3.pDisconnect list is accessed only as follows: +** +** 1) By this function. In this case, all BtShared mutexes and the mutex +** associated with the database handle itself must be held. +** +** 2) By function vtabDisconnectAll(), when it adds a VTable entry to +** the sqlite3.pDisconnect list. In this case either the BtShared mutex +** associated with the database the virtual table is stored in is held +** or, if the virtual table is stored in a non-sharable database, then +** the database handle mutex is held. +** +** As a result, a sqlite3.pDisconnect cannot be accessed simultaneously +** by multiple threads. It is thread-safe. +*/ +SQLITE_PRIVATE void sqlite3VtabUnlockList(sqlite3 *db){ + VTable *p = db->pDisconnect; + db->pDisconnect = 0; + + assert( sqlite3BtreeHoldsAllMutexes(db) ); + assert( sqlite3_mutex_held(db->mutex) ); + + if( p ){ + sqlite3ExpirePreparedStatements(db); + do { + VTable *pNext = p->pNext; + sqlite3VtabUnlock(p); + p = pNext; + }while( p ); + } +} + +/* +** Clear any and all virtual-table information from the Table record. +** This routine is called, for example, just before deleting the Table +** record. +** +** Since it is a virtual-table, the Table structure contains a pointer +** to the head of a linked list of VTable structures. Each VTable +** structure is associated with a single sqlite3* user of the schema. +** The reference count of the VTable structure associated with database +** connection db is decremented immediately (which may lead to the +** structure being xDisconnected and free). Any other VTable structures +** in the list are moved to the sqlite3.pDisconnect list of the associated +** database connection. +*/ +SQLITE_PRIVATE void sqlite3VtabClear(sqlite3 *db, Table *p){ + if( !db || db->pnBytesFreed==0 ) vtabDisconnectAll(0, p); + if( p->azModuleArg ){ + int i; + for(i=0; inModuleArg; i++){ + if( i!=1 ) sqlite3DbFree(db, p->azModuleArg[i]); + } + sqlite3DbFree(db, p->azModuleArg); + } +} + +/* +** Add a new module argument to pTable->azModuleArg[]. +** The string is not copied - the pointer is stored. The +** string will be freed automatically when the table is +** deleted. +*/ +static void addModuleArgument(sqlite3 *db, Table *pTable, char *zArg){ + int nBytes = sizeof(char *)*(2+pTable->nModuleArg); + char **azModuleArg; + azModuleArg = sqlite3DbRealloc(db, pTable->azModuleArg, nBytes); + if( azModuleArg==0 ){ + sqlite3DbFree(db, zArg); + }else{ + int i = pTable->nModuleArg++; + azModuleArg[i] = zArg; + azModuleArg[i+1] = 0; + pTable->azModuleArg = azModuleArg; + } +} + +/* +** The parser calls this routine when it first sees a CREATE VIRTUAL TABLE +** statement. The module name has been parsed, but the optional list +** of parameters that follow the module name are still pending. +*/ +SQLITE_PRIVATE void sqlite3VtabBeginParse( + Parse *pParse, /* Parsing context */ + Token *pName1, /* Name of new table, or database name */ + Token *pName2, /* Name of new table or NULL */ + Token *pModuleName, /* Name of the module for the virtual table */ + int ifNotExists /* No error if the table already exists */ +){ + int iDb; /* The database the table is being created in */ + Table *pTable; /* The new virtual table */ + sqlite3 *db; /* Database connection */ + + sqlite3StartTable(pParse, pName1, pName2, 0, 0, 1, ifNotExists); + pTable = pParse->pNewTable; + if( pTable==0 ) return; + assert( 0==pTable->pIndex ); + + db = pParse->db; + iDb = sqlite3SchemaToIndex(db, pTable->pSchema); + assert( iDb>=0 ); + + pTable->tabFlags |= TF_Virtual; + pTable->nModuleArg = 0; + addModuleArgument(db, pTable, sqlite3NameFromToken(db, pModuleName)); + addModuleArgument(db, pTable, 0); + addModuleArgument(db, pTable, sqlite3DbStrDup(db, pTable->zName)); + assert( (pParse->sNameToken.z==pName2->z && pName2->z!=0) + || (pParse->sNameToken.z==pName1->z && pName2->z==0) + ); + pParse->sNameToken.n = (int)( + &pModuleName->z[pModuleName->n] - pParse->sNameToken.z + ); + +#ifndef SQLITE_OMIT_AUTHORIZATION + /* Creating a virtual table invokes the authorization callback twice. + ** The first invocation, to obtain permission to INSERT a row into the + ** sqlite_master table, has already been made by sqlite3StartTable(). + ** The second call, to obtain permission to create the table, is made now. + */ + if( pTable->azModuleArg ){ + sqlite3AuthCheck(pParse, SQLITE_CREATE_VTABLE, pTable->zName, + pTable->azModuleArg[0], pParse->db->aDb[iDb].zDbSName); + } +#endif +} + +/* +** This routine takes the module argument that has been accumulating +** in pParse->zArg[] and appends it to the list of arguments on the +** virtual table currently under construction in pParse->pTable. +*/ +static void addArgumentToVtab(Parse *pParse){ + if( pParse->sArg.z && pParse->pNewTable ){ + const char *z = (const char*)pParse->sArg.z; + int n = pParse->sArg.n; + sqlite3 *db = pParse->db; + addModuleArgument(db, pParse->pNewTable, sqlite3DbStrNDup(db, z, n)); + } +} + +/* +** The parser calls this routine after the CREATE VIRTUAL TABLE statement +** has been completely parsed. +*/ +SQLITE_PRIVATE void sqlite3VtabFinishParse(Parse *pParse, Token *pEnd){ + Table *pTab = pParse->pNewTable; /* The table being constructed */ + sqlite3 *db = pParse->db; /* The database connection */ + + if( pTab==0 ) return; + addArgumentToVtab(pParse); + pParse->sArg.z = 0; + if( pTab->nModuleArg<1 ) return; + + /* If the CREATE VIRTUAL TABLE statement is being entered for the + ** first time (in other words if the virtual table is actually being + ** created now instead of just being read out of sqlite_master) then + ** do additional initialization work and store the statement text + ** in the sqlite_master table. + */ + if( !db->init.busy ){ + char *zStmt; + char *zWhere; + int iDb; + int iReg; + Vdbe *v; + + /* Compute the complete text of the CREATE VIRTUAL TABLE statement */ + if( pEnd ){ + pParse->sNameToken.n = (int)(pEnd->z - pParse->sNameToken.z) + pEnd->n; + } + zStmt = sqlite3MPrintf(db, "CREATE VIRTUAL TABLE %T", &pParse->sNameToken); + + /* A slot for the record has already been allocated in the + ** SQLITE_MASTER table. We just need to update that slot with all + ** the information we've collected. + ** + ** The VM register number pParse->regRowid holds the rowid of an + ** entry in the sqlite_master table tht was created for this vtab + ** by sqlite3StartTable(). + */ + iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + sqlite3NestedParse(pParse, + "UPDATE %Q.%s " + "SET type='table', name=%Q, tbl_name=%Q, rootpage=0, sql=%Q " + "WHERE rowid=#%d", + db->aDb[iDb].zDbSName, SCHEMA_TABLE(iDb), + pTab->zName, + pTab->zName, + zStmt, + pParse->regRowid + ); + sqlite3DbFree(db, zStmt); + v = sqlite3GetVdbe(pParse); + sqlite3ChangeCookie(pParse, iDb); + + sqlite3VdbeAddOp0(v, OP_Expire); + zWhere = sqlite3MPrintf(db, "name='%q' AND type='table'", pTab->zName); + sqlite3VdbeAddParseSchemaOp(v, iDb, zWhere); + + iReg = ++pParse->nMem; + sqlite3VdbeLoadString(v, iReg, pTab->zName); + sqlite3VdbeAddOp2(v, OP_VCreate, iDb, iReg); + } + + /* If we are rereading the sqlite_master table create the in-memory + ** record of the table. The xConnect() method is not called until + ** the first time the virtual table is used in an SQL statement. This + ** allows a schema that contains virtual tables to be loaded before + ** the required virtual table implementations are registered. */ + else { + Table *pOld; + Schema *pSchema = pTab->pSchema; + const char *zName = pTab->zName; + assert( sqlite3SchemaMutexHeld(db, 0, pSchema) ); + pOld = sqlite3HashInsert(&pSchema->tblHash, zName, pTab); + if( pOld ){ + sqlite3OomFault(db); + assert( pTab==pOld ); /* Malloc must have failed inside HashInsert() */ + return; + } + pParse->pNewTable = 0; + } +} + +/* +** The parser calls this routine when it sees the first token +** of an argument to the module name in a CREATE VIRTUAL TABLE statement. +*/ +SQLITE_PRIVATE void sqlite3VtabArgInit(Parse *pParse){ + addArgumentToVtab(pParse); + pParse->sArg.z = 0; + pParse->sArg.n = 0; +} + +/* +** The parser calls this routine for each token after the first token +** in an argument to the module name in a CREATE VIRTUAL TABLE statement. +*/ +SQLITE_PRIVATE void sqlite3VtabArgExtend(Parse *pParse, Token *p){ + Token *pArg = &pParse->sArg; + if( pArg->z==0 ){ + pArg->z = p->z; + pArg->n = p->n; + }else{ + assert(pArg->z <= p->z); + pArg->n = (int)(&p->z[p->n] - pArg->z); + } +} + +/* +** Invoke a virtual table constructor (either xCreate or xConnect). The +** pointer to the function to invoke is passed as the fourth parameter +** to this procedure. +*/ +static int vtabCallConstructor( + sqlite3 *db, + Table *pTab, + Module *pMod, + int (*xConstruct)(sqlite3*,void*,int,const char*const*,sqlite3_vtab**,char**), + char **pzErr +){ + VtabCtx sCtx; + VTable *pVTable; + int rc; + const char *const*azArg = (const char *const*)pTab->azModuleArg; + int nArg = pTab->nModuleArg; + char *zErr = 0; + char *zModuleName; + int iDb; + VtabCtx *pCtx; + + /* Check that the virtual-table is not already being initialized */ + for(pCtx=db->pVtabCtx; pCtx; pCtx=pCtx->pPrior){ + if( pCtx->pTab==pTab ){ + *pzErr = sqlite3MPrintf(db, + "vtable constructor called recursively: %s", pTab->zName + ); + return SQLITE_LOCKED; + } + } + + zModuleName = sqlite3MPrintf(db, "%s", pTab->zName); + if( !zModuleName ){ + return SQLITE_NOMEM_BKPT; + } + + pVTable = sqlite3DbMallocZero(db, sizeof(VTable)); + if( !pVTable ){ + sqlite3DbFree(db, zModuleName); + return SQLITE_NOMEM_BKPT; + } + pVTable->db = db; + pVTable->pMod = pMod; + + iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + pTab->azModuleArg[1] = db->aDb[iDb].zDbSName; + + /* Invoke the virtual table constructor */ + assert( &db->pVtabCtx ); + assert( xConstruct ); + sCtx.pTab = pTab; + sCtx.pVTable = pVTable; + sCtx.pPrior = db->pVtabCtx; + sCtx.bDeclared = 0; + db->pVtabCtx = &sCtx; + rc = xConstruct(db, pMod->pAux, nArg, azArg, &pVTable->pVtab, &zErr); + db->pVtabCtx = sCtx.pPrior; + if( rc==SQLITE_NOMEM ) sqlite3OomFault(db); + assert( sCtx.pTab==pTab ); + + if( SQLITE_OK!=rc ){ + if( zErr==0 ){ + *pzErr = sqlite3MPrintf(db, "vtable constructor failed: %s", zModuleName); + }else { + *pzErr = sqlite3MPrintf(db, "%s", zErr); + sqlite3_free(zErr); + } + sqlite3DbFree(db, pVTable); + }else if( ALWAYS(pVTable->pVtab) ){ + /* Justification of ALWAYS(): A correct vtab constructor must allocate + ** the sqlite3_vtab object if successful. */ + memset(pVTable->pVtab, 0, sizeof(pVTable->pVtab[0])); + pVTable->pVtab->pModule = pMod->pModule; + pVTable->nRef = 1; + if( sCtx.bDeclared==0 ){ + const char *zFormat = "vtable constructor did not declare schema: %s"; + *pzErr = sqlite3MPrintf(db, zFormat, pTab->zName); + sqlite3VtabUnlock(pVTable); + rc = SQLITE_ERROR; + }else{ + int iCol; + u8 oooHidden = 0; + /* If everything went according to plan, link the new VTable structure + ** into the linked list headed by pTab->pVTable. Then loop through the + ** columns of the table to see if any of them contain the token "hidden". + ** If so, set the Column COLFLAG_HIDDEN flag and remove the token from + ** the type string. */ + pVTable->pNext = pTab->pVTable; + pTab->pVTable = pVTable; + + for(iCol=0; iColnCol; iCol++){ + char *zType = sqlite3ColumnType(&pTab->aCol[iCol], ""); + int nType; + int i = 0; + nType = sqlite3Strlen30(zType); + for(i=0; i0 ){ + assert(zType[i-1]==' '); + zType[i-1] = '\0'; + } + pTab->aCol[iCol].colFlags |= COLFLAG_HIDDEN; + oooHidden = TF_OOOHidden; + }else{ + pTab->tabFlags |= oooHidden; + } + } + } + } + + sqlite3DbFree(db, zModuleName); + return rc; +} + +/* +** This function is invoked by the parser to call the xConnect() method +** of the virtual table pTab. If an error occurs, an error code is returned +** and an error left in pParse. +** +** This call is a no-op if table pTab is not a virtual table. +*/ +SQLITE_PRIVATE int sqlite3VtabCallConnect(Parse *pParse, Table *pTab){ + sqlite3 *db = pParse->db; + const char *zMod; + Module *pMod; + int rc; + + assert( pTab ); + if( (pTab->tabFlags & TF_Virtual)==0 || sqlite3GetVTable(db, pTab) ){ + return SQLITE_OK; + } + + /* Locate the required virtual table module */ + zMod = pTab->azModuleArg[0]; + pMod = (Module*)sqlite3HashFind(&db->aModule, zMod); + + if( !pMod ){ + const char *zModule = pTab->azModuleArg[0]; + sqlite3ErrorMsg(pParse, "no such module: %s", zModule); + rc = SQLITE_ERROR; + }else{ + char *zErr = 0; + rc = vtabCallConstructor(db, pTab, pMod, pMod->pModule->xConnect, &zErr); + if( rc!=SQLITE_OK ){ + sqlite3ErrorMsg(pParse, "%s", zErr); + } + sqlite3DbFree(db, zErr); + } + + return rc; +} +/* +** Grow the db->aVTrans[] array so that there is room for at least one +** more v-table. Return SQLITE_NOMEM if a malloc fails, or SQLITE_OK otherwise. +*/ +static int growVTrans(sqlite3 *db){ + const int ARRAY_INCR = 5; + + /* Grow the sqlite3.aVTrans array if required */ + if( (db->nVTrans%ARRAY_INCR)==0 ){ + VTable **aVTrans; + int nBytes = sizeof(sqlite3_vtab *) * (db->nVTrans + ARRAY_INCR); + aVTrans = sqlite3DbRealloc(db, (void *)db->aVTrans, nBytes); + if( !aVTrans ){ + return SQLITE_NOMEM_BKPT; + } + memset(&aVTrans[db->nVTrans], 0, sizeof(sqlite3_vtab *)*ARRAY_INCR); + db->aVTrans = aVTrans; + } + + return SQLITE_OK; +} + +/* +** Add the virtual table pVTab to the array sqlite3.aVTrans[]. Space should +** have already been reserved using growVTrans(). +*/ +static void addToVTrans(sqlite3 *db, VTable *pVTab){ + /* Add pVtab to the end of sqlite3.aVTrans */ + db->aVTrans[db->nVTrans++] = pVTab; + sqlite3VtabLock(pVTab); +} + +/* +** This function is invoked by the vdbe to call the xCreate method +** of the virtual table named zTab in database iDb. +** +** If an error occurs, *pzErr is set to point to an English language +** description of the error and an SQLITE_XXX error code is returned. +** In this case the caller must call sqlite3DbFree(db, ) on *pzErr. +*/ +SQLITE_PRIVATE int sqlite3VtabCallCreate(sqlite3 *db, int iDb, const char *zTab, char **pzErr){ + int rc = SQLITE_OK; + Table *pTab; + Module *pMod; + const char *zMod; + + pTab = sqlite3FindTable(db, zTab, db->aDb[iDb].zDbSName); + assert( pTab && (pTab->tabFlags & TF_Virtual)!=0 && !pTab->pVTable ); + + /* Locate the required virtual table module */ + zMod = pTab->azModuleArg[0]; + pMod = (Module*)sqlite3HashFind(&db->aModule, zMod); + + /* If the module has been registered and includes a Create method, + ** invoke it now. If the module has not been registered, return an + ** error. Otherwise, do nothing. + */ + if( pMod==0 || pMod->pModule->xCreate==0 || pMod->pModule->xDestroy==0 ){ + *pzErr = sqlite3MPrintf(db, "no such module: %s", zMod); + rc = SQLITE_ERROR; + }else{ + rc = vtabCallConstructor(db, pTab, pMod, pMod->pModule->xCreate, pzErr); + } + + /* Justification of ALWAYS(): The xConstructor method is required to + ** create a valid sqlite3_vtab if it returns SQLITE_OK. */ + if( rc==SQLITE_OK && ALWAYS(sqlite3GetVTable(db, pTab)) ){ + rc = growVTrans(db); + if( rc==SQLITE_OK ){ + addToVTrans(db, sqlite3GetVTable(db, pTab)); + } + } + + return rc; +} + +/* +** This function is used to set the schema of a virtual table. It is only +** valid to call this function from within the xCreate() or xConnect() of a +** virtual table module. +*/ +SQLITE_API int sqlite3_declare_vtab(sqlite3 *db, const char *zCreateTable){ + VtabCtx *pCtx; + Parse *pParse; + int rc = SQLITE_OK; + Table *pTab; + char *zErr = 0; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) || zCreateTable==0 ){ + return SQLITE_MISUSE_BKPT; + } +#endif + sqlite3_mutex_enter(db->mutex); + pCtx = db->pVtabCtx; + if( !pCtx || pCtx->bDeclared ){ + sqlite3Error(db, SQLITE_MISUSE); + sqlite3_mutex_leave(db->mutex); + return SQLITE_MISUSE_BKPT; + } + pTab = pCtx->pTab; + assert( (pTab->tabFlags & TF_Virtual)!=0 ); + + pParse = sqlite3StackAllocZero(db, sizeof(*pParse)); + if( pParse==0 ){ + rc = SQLITE_NOMEM_BKPT; + }else{ + pParse->declareVtab = 1; + pParse->db = db; + pParse->nQueryLoop = 1; + + if( SQLITE_OK==sqlite3RunParser(pParse, zCreateTable, &zErr) + && pParse->pNewTable + && !db->mallocFailed + && !pParse->pNewTable->pSelect + && (pParse->pNewTable->tabFlags & TF_Virtual)==0 + ){ + if( !pTab->aCol ){ + Table *pNew = pParse->pNewTable; + Index *pIdx; + pTab->aCol = pNew->aCol; + pTab->nCol = pNew->nCol; + pTab->tabFlags |= pNew->tabFlags & (TF_WithoutRowid|TF_NoVisibleRowid); + pNew->nCol = 0; + pNew->aCol = 0; + assert( pTab->pIndex==0 ); + if( !HasRowid(pNew) && pCtx->pVTable->pMod->pModule->xUpdate!=0 ){ + rc = SQLITE_ERROR; + } + pIdx = pNew->pIndex; + if( pIdx ){ + assert( pIdx->pNext==0 ); + pTab->pIndex = pIdx; + pNew->pIndex = 0; + pIdx->pTable = pTab; + } + } + pCtx->bDeclared = 1; + }else{ + sqlite3ErrorWithMsg(db, SQLITE_ERROR, (zErr ? "%s" : 0), zErr); + sqlite3DbFree(db, zErr); + rc = SQLITE_ERROR; + } + pParse->declareVtab = 0; + + if( pParse->pVdbe ){ + sqlite3VdbeFinalize(pParse->pVdbe); + } + sqlite3DeleteTable(db, pParse->pNewTable); + sqlite3ParserReset(pParse); + sqlite3StackFree(db, pParse); + } + + assert( (rc&0xff)==rc ); + rc = sqlite3ApiExit(db, rc); + sqlite3_mutex_leave(db->mutex); + return rc; +} + +/* +** This function is invoked by the vdbe to call the xDestroy method +** of the virtual table named zTab in database iDb. This occurs +** when a DROP TABLE is mentioned. +** +** This call is a no-op if zTab is not a virtual table. +*/ +SQLITE_PRIVATE int sqlite3VtabCallDestroy(sqlite3 *db, int iDb, const char *zTab){ + int rc = SQLITE_OK; + Table *pTab; + + pTab = sqlite3FindTable(db, zTab, db->aDb[iDb].zDbSName); + if( pTab!=0 && ALWAYS(pTab->pVTable!=0) ){ + VTable *p; + int (*xDestroy)(sqlite3_vtab *); + for(p=pTab->pVTable; p; p=p->pNext){ + assert( p->pVtab ); + if( p->pVtab->nRef>0 ){ + return SQLITE_LOCKED; + } + } + p = vtabDisconnectAll(db, pTab); + xDestroy = p->pMod->pModule->xDestroy; + assert( xDestroy!=0 ); /* Checked before the virtual table is created */ + rc = xDestroy(p->pVtab); + /* Remove the sqlite3_vtab* from the aVTrans[] array, if applicable */ + if( rc==SQLITE_OK ){ + assert( pTab->pVTable==p && p->pNext==0 ); + p->pVtab = 0; + pTab->pVTable = 0; + sqlite3VtabUnlock(p); + } + } + + return rc; +} + +/* +** This function invokes either the xRollback or xCommit method +** of each of the virtual tables in the sqlite3.aVTrans array. The method +** called is identified by the second argument, "offset", which is +** the offset of the method to call in the sqlite3_module structure. +** +** The array is cleared after invoking the callbacks. +*/ +static void callFinaliser(sqlite3 *db, int offset){ + int i; + if( db->aVTrans ){ + VTable **aVTrans = db->aVTrans; + db->aVTrans = 0; + for(i=0; inVTrans; i++){ + VTable *pVTab = aVTrans[i]; + sqlite3_vtab *p = pVTab->pVtab; + if( p ){ + int (*x)(sqlite3_vtab *); + x = *(int (**)(sqlite3_vtab *))((char *)p->pModule + offset); + if( x ) x(p); + } + pVTab->iSavepoint = 0; + sqlite3VtabUnlock(pVTab); + } + sqlite3DbFree(db, aVTrans); + db->nVTrans = 0; + } +} + +/* +** Invoke the xSync method of all virtual tables in the sqlite3.aVTrans +** array. Return the error code for the first error that occurs, or +** SQLITE_OK if all xSync operations are successful. +** +** If an error message is available, leave it in p->zErrMsg. +*/ +SQLITE_PRIVATE int sqlite3VtabSync(sqlite3 *db, Vdbe *p){ + int i; + int rc = SQLITE_OK; + VTable **aVTrans = db->aVTrans; + + db->aVTrans = 0; + for(i=0; rc==SQLITE_OK && inVTrans; i++){ + int (*x)(sqlite3_vtab *); + sqlite3_vtab *pVtab = aVTrans[i]->pVtab; + if( pVtab && (x = pVtab->pModule->xSync)!=0 ){ + rc = x(pVtab); + sqlite3VtabImportErrmsg(p, pVtab); + } + } + db->aVTrans = aVTrans; + return rc; +} + +/* +** Invoke the xRollback method of all virtual tables in the +** sqlite3.aVTrans array. Then clear the array itself. +*/ +SQLITE_PRIVATE int sqlite3VtabRollback(sqlite3 *db){ + callFinaliser(db, offsetof(sqlite3_module,xRollback)); + return SQLITE_OK; +} + +/* +** Invoke the xCommit method of all virtual tables in the +** sqlite3.aVTrans array. Then clear the array itself. +*/ +SQLITE_PRIVATE int sqlite3VtabCommit(sqlite3 *db){ + callFinaliser(db, offsetof(sqlite3_module,xCommit)); + return SQLITE_OK; +} + +/* +** If the virtual table pVtab supports the transaction interface +** (xBegin/xRollback/xCommit and optionally xSync) and a transaction is +** not currently open, invoke the xBegin method now. +** +** If the xBegin call is successful, place the sqlite3_vtab pointer +** in the sqlite3.aVTrans array. +*/ +SQLITE_PRIVATE int sqlite3VtabBegin(sqlite3 *db, VTable *pVTab){ + int rc = SQLITE_OK; + const sqlite3_module *pModule; + + /* Special case: If db->aVTrans is NULL and db->nVTrans is greater + ** than zero, then this function is being called from within a + ** virtual module xSync() callback. It is illegal to write to + ** virtual module tables in this case, so return SQLITE_LOCKED. + */ + if( sqlite3VtabInSync(db) ){ + return SQLITE_LOCKED; + } + if( !pVTab ){ + return SQLITE_OK; + } + pModule = pVTab->pVtab->pModule; + + if( pModule->xBegin ){ + int i; + + /* If pVtab is already in the aVTrans array, return early */ + for(i=0; inVTrans; i++){ + if( db->aVTrans[i]==pVTab ){ + return SQLITE_OK; + } + } + + /* Invoke the xBegin method. If successful, add the vtab to the + ** sqlite3.aVTrans[] array. */ + rc = growVTrans(db); + if( rc==SQLITE_OK ){ + rc = pModule->xBegin(pVTab->pVtab); + if( rc==SQLITE_OK ){ + int iSvpt = db->nStatement + db->nSavepoint; + addToVTrans(db, pVTab); + if( iSvpt && pModule->xSavepoint ){ + pVTab->iSavepoint = iSvpt; + rc = pModule->xSavepoint(pVTab->pVtab, iSvpt-1); + } + } + } + } + return rc; +} + +/* +** Invoke either the xSavepoint, xRollbackTo or xRelease method of all +** virtual tables that currently have an open transaction. Pass iSavepoint +** as the second argument to the virtual table method invoked. +** +** If op is SAVEPOINT_BEGIN, the xSavepoint method is invoked. If it is +** SAVEPOINT_ROLLBACK, the xRollbackTo method. Otherwise, if op is +** SAVEPOINT_RELEASE, then the xRelease method of each virtual table with +** an open transaction is invoked. +** +** If any virtual table method returns an error code other than SQLITE_OK, +** processing is abandoned and the error returned to the caller of this +** function immediately. If all calls to virtual table methods are successful, +** SQLITE_OK is returned. +*/ +SQLITE_PRIVATE int sqlite3VtabSavepoint(sqlite3 *db, int op, int iSavepoint){ + int rc = SQLITE_OK; + + assert( op==SAVEPOINT_RELEASE||op==SAVEPOINT_ROLLBACK||op==SAVEPOINT_BEGIN ); + assert( iSavepoint>=-1 ); + if( db->aVTrans ){ + int i; + for(i=0; rc==SQLITE_OK && inVTrans; i++){ + VTable *pVTab = db->aVTrans[i]; + const sqlite3_module *pMod = pVTab->pMod->pModule; + if( pVTab->pVtab && pMod->iVersion>=2 ){ + int (*xMethod)(sqlite3_vtab *, int); + switch( op ){ + case SAVEPOINT_BEGIN: + xMethod = pMod->xSavepoint; + pVTab->iSavepoint = iSavepoint+1; + break; + case SAVEPOINT_ROLLBACK: + xMethod = pMod->xRollbackTo; + break; + default: + xMethod = pMod->xRelease; + break; + } + if( xMethod && pVTab->iSavepoint>iSavepoint ){ + rc = xMethod(pVTab->pVtab, iSavepoint); + } + } + } + } + return rc; +} + +/* +** The first parameter (pDef) is a function implementation. The +** second parameter (pExpr) is the first argument to this function. +** If pExpr is a column in a virtual table, then let the virtual +** table implementation have an opportunity to overload the function. +** +** This routine is used to allow virtual table implementations to +** overload MATCH, LIKE, GLOB, and REGEXP operators. +** +** Return either the pDef argument (indicating no change) or a +** new FuncDef structure that is marked as ephemeral using the +** SQLITE_FUNC_EPHEM flag. +*/ +SQLITE_PRIVATE FuncDef *sqlite3VtabOverloadFunction( + sqlite3 *db, /* Database connection for reporting malloc problems */ + FuncDef *pDef, /* Function to possibly overload */ + int nArg, /* Number of arguments to the function */ + Expr *pExpr /* First argument to the function */ +){ + Table *pTab; + sqlite3_vtab *pVtab; + sqlite3_module *pMod; + void (*xSFunc)(sqlite3_context*,int,sqlite3_value**) = 0; + void *pArg = 0; + FuncDef *pNew; + int rc = 0; + char *zLowerName; + unsigned char *z; + + + /* Check to see the left operand is a column in a virtual table */ + if( NEVER(pExpr==0) ) return pDef; + if( pExpr->op!=TK_COLUMN ) return pDef; + pTab = pExpr->pTab; + if( NEVER(pTab==0) ) return pDef; + if( (pTab->tabFlags & TF_Virtual)==0 ) return pDef; + pVtab = sqlite3GetVTable(db, pTab)->pVtab; + assert( pVtab!=0 ); + assert( pVtab->pModule!=0 ); + pMod = (sqlite3_module *)pVtab->pModule; + if( pMod->xFindFunction==0 ) return pDef; + + /* Call the xFindFunction method on the virtual table implementation + ** to see if the implementation wants to overload this function + */ + zLowerName = sqlite3DbStrDup(db, pDef->zName); + if( zLowerName ){ + for(z=(unsigned char*)zLowerName; *z; z++){ + *z = sqlite3UpperToLower[*z]; + } + rc = pMod->xFindFunction(pVtab, nArg, zLowerName, &xSFunc, &pArg); + sqlite3DbFree(db, zLowerName); + } + if( rc==0 ){ + return pDef; + } + + /* Create a new ephemeral function definition for the overloaded + ** function */ + pNew = sqlite3DbMallocZero(db, sizeof(*pNew) + + sqlite3Strlen30(pDef->zName) + 1); + if( pNew==0 ){ + return pDef; + } + *pNew = *pDef; + pNew->zName = (const char*)&pNew[1]; + memcpy((char*)&pNew[1], pDef->zName, sqlite3Strlen30(pDef->zName)+1); + pNew->xSFunc = xSFunc; + pNew->pUserData = pArg; + pNew->funcFlags |= SQLITE_FUNC_EPHEM; + return pNew; +} + +/* +** Make sure virtual table pTab is contained in the pParse->apVirtualLock[] +** array so that an OP_VBegin will get generated for it. Add pTab to the +** array if it is missing. If pTab is already in the array, this routine +** is a no-op. +*/ +SQLITE_PRIVATE void sqlite3VtabMakeWritable(Parse *pParse, Table *pTab){ + Parse *pToplevel = sqlite3ParseToplevel(pParse); + int i, n; + Table **apVtabLock; + + assert( IsVirtual(pTab) ); + for(i=0; inVtabLock; i++){ + if( pTab==pToplevel->apVtabLock[i] ) return; + } + n = (pToplevel->nVtabLock+1)*sizeof(pToplevel->apVtabLock[0]); + apVtabLock = sqlite3_realloc64(pToplevel->apVtabLock, n); + if( apVtabLock ){ + pToplevel->apVtabLock = apVtabLock; + pToplevel->apVtabLock[pToplevel->nVtabLock++] = pTab; + }else{ + sqlite3OomFault(pToplevel->db); + } +} + +/* +** Check to see if virtual table module pMod can be have an eponymous +** virtual table instance. If it can, create one if one does not already +** exist. Return non-zero if the eponymous virtual table instance exists +** when this routine returns, and return zero if it does not exist. +** +** An eponymous virtual table instance is one that is named after its +** module, and more importantly, does not require a CREATE VIRTUAL TABLE +** statement in order to come into existance. Eponymous virtual table +** instances always exist. They cannot be DROP-ed. +** +** Any virtual table module for which xConnect and xCreate are the same +** method can have an eponymous virtual table instance. +*/ +SQLITE_PRIVATE int sqlite3VtabEponymousTableInit(Parse *pParse, Module *pMod){ + const sqlite3_module *pModule = pMod->pModule; + Table *pTab; + char *zErr = 0; + int rc; + sqlite3 *db = pParse->db; + if( pMod->pEpoTab ) return 1; + if( pModule->xCreate!=0 && pModule->xCreate!=pModule->xConnect ) return 0; + pTab = sqlite3DbMallocZero(db, sizeof(Table)); + if( pTab==0 ) return 0; + pTab->zName = sqlite3DbStrDup(db, pMod->zName); + if( pTab->zName==0 ){ + sqlite3DbFree(db, pTab); + return 0; + } + pMod->pEpoTab = pTab; + pTab->nRef = 1; + pTab->pSchema = db->aDb[0].pSchema; + pTab->tabFlags |= TF_Virtual; + pTab->nModuleArg = 0; + pTab->iPKey = -1; + addModuleArgument(db, pTab, sqlite3DbStrDup(db, pTab->zName)); + addModuleArgument(db, pTab, 0); + addModuleArgument(db, pTab, sqlite3DbStrDup(db, pTab->zName)); + rc = vtabCallConstructor(db, pTab, pMod, pModule->xConnect, &zErr); + if( rc ){ + sqlite3ErrorMsg(pParse, "%s", zErr); + sqlite3DbFree(db, zErr); + sqlite3VtabEponymousTableClear(db, pMod); + return 0; + } + return 1; +} + +/* +** Erase the eponymous virtual table instance associated with +** virtual table module pMod, if it exists. +*/ +SQLITE_PRIVATE void sqlite3VtabEponymousTableClear(sqlite3 *db, Module *pMod){ + Table *pTab = pMod->pEpoTab; + if( pTab!=0 ){ + /* Mark the table as Ephemeral prior to deleting it, so that the + ** sqlite3DeleteTable() routine will know that it is not stored in + ** the schema. */ + pTab->tabFlags |= TF_Ephemeral; + sqlite3DeleteTable(db, pTab); + pMod->pEpoTab = 0; + } +} + +/* +** Return the ON CONFLICT resolution mode in effect for the virtual +** table update operation currently in progress. +** +** The results of this routine are undefined unless it is called from +** within an xUpdate method. +*/ +SQLITE_API int sqlite3_vtab_on_conflict(sqlite3 *db){ + static const unsigned char aMap[] = { + SQLITE_ROLLBACK, SQLITE_ABORT, SQLITE_FAIL, SQLITE_IGNORE, SQLITE_REPLACE + }; +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; +#endif + assert( OE_Rollback==1 && OE_Abort==2 && OE_Fail==3 ); + assert( OE_Ignore==4 && OE_Replace==5 ); + assert( db->vtabOnConflict>=1 && db->vtabOnConflict<=5 ); + return (int)aMap[db->vtabOnConflict-1]; +} + +/* +** Call from within the xCreate() or xConnect() methods to provide +** the SQLite core with additional information about the behavior +** of the virtual table being implemented. +*/ +SQLITE_API int sqlite3_vtab_config(sqlite3 *db, int op, ...){ + va_list ap; + int rc = SQLITE_OK; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; +#endif + sqlite3_mutex_enter(db->mutex); + va_start(ap, op); + switch( op ){ + case SQLITE_VTAB_CONSTRAINT_SUPPORT: { + VtabCtx *p = db->pVtabCtx; + if( !p ){ + rc = SQLITE_MISUSE_BKPT; + }else{ + assert( p->pTab==0 || (p->pTab->tabFlags & TF_Virtual)!=0 ); + p->pVTable->bConstraint = (u8)va_arg(ap, int); + } + break; + } + default: + rc = SQLITE_MISUSE_BKPT; + break; + } + va_end(ap); + + if( rc!=SQLITE_OK ) sqlite3Error(db, rc); + sqlite3_mutex_leave(db->mutex); + return rc; +} + +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + +/************** End of vtab.c ************************************************/ +/************** Begin file wherecode.c ***************************************/ +/* +** 2015-06-06 +** +** 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 C code that generates VDBE code used to process +** the WHERE clause of SQL statements. +** +** This file was split off from where.c on 2015-06-06 in order to reduce the +** size of where.c and make it easier to edit. This file contains the routines +** that actually generate the bulk of the WHERE loop code. The original where.c +** file retains the code that does query planning and analysis. +*/ +/* #include "sqliteInt.h" */ +/************** Include whereInt.h in the middle of wherecode.c **************/ +/************** Begin file whereInt.h ****************************************/ +/* +** 2013-11-12 +** +** 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 structure and macro definitions for the query +** planner logic in "where.c". These definitions are broken out into +** a separate source file for easier editing. +*/ + +/* +** Trace output macros +*/ +#if defined(SQLITE_TEST) || defined(SQLITE_DEBUG) +/***/ int sqlite3WhereTrace; +#endif +#if defined(SQLITE_DEBUG) \ + && (defined(SQLITE_TEST) || defined(SQLITE_ENABLE_WHERETRACE)) +# define WHERETRACE(K,X) if(sqlite3WhereTrace&(K)) sqlite3DebugPrintf X +# define WHERETRACE_ENABLED 1 +#else +# define WHERETRACE(K,X) +#endif + +/* Forward references +*/ +typedef struct WhereClause WhereClause; +typedef struct WhereMaskSet WhereMaskSet; +typedef struct WhereOrInfo WhereOrInfo; +typedef struct WhereAndInfo WhereAndInfo; +typedef struct WhereLevel WhereLevel; +typedef struct WhereLoop WhereLoop; +typedef struct WherePath WherePath; +typedef struct WhereTerm WhereTerm; +typedef struct WhereLoopBuilder WhereLoopBuilder; +typedef struct WhereScan WhereScan; +typedef struct WhereOrCost WhereOrCost; +typedef struct WhereOrSet WhereOrSet; + +/* +** This object contains information needed to implement a single nested +** loop in WHERE clause. +** +** Contrast this object with WhereLoop. This object describes the +** implementation of the loop. WhereLoop describes the algorithm. +** This object contains a pointer to the WhereLoop algorithm as one of +** its elements. +** +** The WhereInfo object contains a single instance of this object for +** each term in the FROM clause (which is to say, for each of the +** nested loops as implemented). The order of WhereLevel objects determines +** the loop nested order, with WhereInfo.a[0] being the outer loop and +** WhereInfo.a[WhereInfo.nLevel-1] being the inner loop. +*/ +struct WhereLevel { + int iLeftJoin; /* Memory cell used to implement LEFT OUTER JOIN */ + int iTabCur; /* The VDBE cursor used to access the table */ + int iIdxCur; /* The VDBE cursor used to access pIdx */ + int addrBrk; /* Jump here to break out of the loop */ + int addrNxt; /* Jump here to start the next IN combination */ + int addrSkip; /* Jump here for next iteration of skip-scan */ + int addrCont; /* Jump here to continue with the next loop cycle */ + int addrFirst; /* First instruction of interior of the loop */ + int addrBody; /* Beginning of the body of this loop */ +#ifndef SQLITE_LIKE_DOESNT_MATCH_BLOBS + u32 iLikeRepCntr; /* LIKE range processing counter register (times 2) */ + int addrLikeRep; /* LIKE range processing address */ +#endif + u8 iFrom; /* Which entry in the FROM clause */ + u8 op, p3, p5; /* Opcode, P3 & P5 of the opcode that ends the loop */ + int p1, p2; /* Operands of the opcode used to ends the loop */ + union { /* Information that depends on pWLoop->wsFlags */ + struct { + int nIn; /* Number of entries in aInLoop[] */ + struct InLoop { + int iCur; /* The VDBE cursor used by this IN operator */ + int addrInTop; /* Top of the IN loop */ + u8 eEndLoopOp; /* IN Loop terminator. OP_Next or OP_Prev */ + } *aInLoop; /* Information about each nested IN operator */ + } in; /* Used when pWLoop->wsFlags&WHERE_IN_ABLE */ + Index *pCovidx; /* Possible covering index for WHERE_MULTI_OR */ + } u; + struct WhereLoop *pWLoop; /* The selected WhereLoop object */ + Bitmask notReady; /* FROM entries not usable at this level */ +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS + int addrVisit; /* Address at which row is visited */ +#endif +}; + +/* +** Each instance of this object represents an algorithm for evaluating one +** term of a join. Every term of the FROM clause will have at least +** one corresponding WhereLoop object (unless INDEXED BY constraints +** prevent a query solution - which is an error) and many terms of the +** FROM clause will have multiple WhereLoop objects, each describing a +** potential way of implementing that FROM-clause term, together with +** dependencies and cost estimates for using the chosen algorithm. +** +** Query planning consists of building up a collection of these WhereLoop +** objects, then computing a particular sequence of WhereLoop objects, with +** one WhereLoop object per FROM clause term, that satisfy all dependencies +** and that minimize the overall cost. +*/ +struct WhereLoop { + Bitmask prereq; /* Bitmask of other loops that must run first */ + Bitmask maskSelf; /* Bitmask identifying table iTab */ +#ifdef SQLITE_DEBUG + char cId; /* Symbolic ID of this loop for debugging use */ +#endif + u8 iTab; /* Position in FROM clause of table for this loop */ + u8 iSortIdx; /* Sorting index number. 0==None */ + LogEst rSetup; /* One-time setup cost (ex: create transient index) */ + LogEst rRun; /* Cost of running each loop */ + LogEst nOut; /* Estimated number of output rows */ + union { + struct { /* Information for internal btree tables */ + u16 nEq; /* Number of equality constraints */ + u16 nBtm; /* Size of BTM vector */ + u16 nTop; /* Size of TOP vector */ + Index *pIndex; /* Index used, or NULL */ + } btree; + struct { /* Information for virtual tables */ + int idxNum; /* Index number */ + u8 needFree; /* True if sqlite3_free(idxStr) is needed */ + i8 isOrdered; /* True if satisfies ORDER BY */ + u16 omitMask; /* Terms that may be omitted */ + char *idxStr; /* Index identifier string */ + } vtab; + } u; + u32 wsFlags; /* WHERE_* flags describing the plan */ + u16 nLTerm; /* Number of entries in aLTerm[] */ + u16 nSkip; /* Number of NULL aLTerm[] entries */ + /**** whereLoopXfer() copies fields above ***********************/ +# define WHERE_LOOP_XFER_SZ offsetof(WhereLoop,nLSlot) + u16 nLSlot; /* Number of slots allocated for aLTerm[] */ + WhereTerm **aLTerm; /* WhereTerms used */ + WhereLoop *pNextLoop; /* Next WhereLoop object in the WhereClause */ + WhereTerm *aLTermSpace[3]; /* Initial aLTerm[] space */ +}; + +/* This object holds the prerequisites and the cost of running a +** subquery on one operand of an OR operator in the WHERE clause. +** See WhereOrSet for additional information +*/ +struct WhereOrCost { + Bitmask prereq; /* Prerequisites */ + LogEst rRun; /* Cost of running this subquery */ + LogEst nOut; /* Number of outputs for this subquery */ +}; + +/* The WhereOrSet object holds a set of possible WhereOrCosts that +** correspond to the subquery(s) of OR-clause processing. Only the +** best N_OR_COST elements are retained. +*/ +#define N_OR_COST 3 +struct WhereOrSet { + u16 n; /* Number of valid a[] entries */ + WhereOrCost a[N_OR_COST]; /* Set of best costs */ +}; + +/* +** Each instance of this object holds a sequence of WhereLoop objects +** that implement some or all of a query plan. +** +** Think of each WhereLoop object as a node in a graph with arcs +** showing dependencies and costs for travelling between nodes. (That is +** not a completely accurate description because WhereLoop costs are a +** vector, not a scalar, and because dependencies are many-to-one, not +** one-to-one as are graph nodes. But it is a useful visualization aid.) +** Then a WherePath object is a path through the graph that visits some +** or all of the WhereLoop objects once. +** +** The "solver" works by creating the N best WherePath objects of length +** 1. Then using those as a basis to compute the N best WherePath objects +** of length 2. And so forth until the length of WherePaths equals the +** number of nodes in the FROM clause. The best (lowest cost) WherePath +** at the end is the chosen query plan. +*/ +struct WherePath { + Bitmask maskLoop; /* Bitmask of all WhereLoop objects in this path */ + Bitmask revLoop; /* aLoop[]s that should be reversed for ORDER BY */ + LogEst nRow; /* Estimated number of rows generated by this path */ + LogEst rCost; /* Total cost of this path */ + LogEst rUnsorted; /* Total cost of this path ignoring sorting costs */ + i8 isOrdered; /* No. of ORDER BY terms satisfied. -1 for unknown */ + WhereLoop **aLoop; /* Array of WhereLoop objects implementing this path */ +}; + +/* +** The query generator uses an array of instances of this structure to +** help it analyze the subexpressions of the WHERE clause. Each WHERE +** clause subexpression is separated from the others by AND operators, +** usually, or sometimes subexpressions separated by OR. +** +** All WhereTerms are collected into a single WhereClause structure. +** The following identity holds: +** +** WhereTerm.pWC->a[WhereTerm.idx] == WhereTerm +** +** When a term is of the form: +** +** X +** +** where X is a column name and is one of certain operators, +** then WhereTerm.leftCursor and WhereTerm.u.leftColumn record the +** cursor number and column number for X. WhereTerm.eOperator records +** the using a bitmask encoding defined by WO_xxx below. The +** use of a bitmask encoding for the operator allows us to search +** quickly for terms that match any of several different operators. +** +** A WhereTerm might also be two or more subterms connected by OR: +** +** (t1.X ) OR (t1.Y ) OR .... +** +** In this second case, wtFlag has the TERM_ORINFO bit set and eOperator==WO_OR +** and the WhereTerm.u.pOrInfo field points to auxiliary information that +** is collected about the OR clause. +** +** If a term in the WHERE clause does not match either of the two previous +** categories, then eOperator==0. The WhereTerm.pExpr field is still set +** to the original subexpression content and wtFlags is set up appropriately +** but no other fields in the WhereTerm object are meaningful. +** +** When eOperator!=0, prereqRight and prereqAll record sets of cursor numbers, +** but they do so indirectly. A single WhereMaskSet structure translates +** cursor number into bits and the translated bit is stored in the prereq +** fields. The translation is used in order to maximize the number of +** bits that will fit in a Bitmask. The VDBE cursor numbers might be +** spread out over the non-negative integers. For example, the cursor +** numbers might be 3, 8, 9, 10, 20, 23, 41, and 45. The WhereMaskSet +** translates these sparse cursor numbers into consecutive integers +** beginning with 0 in order to make the best possible use of the available +** bits in the Bitmask. So, in the example above, the cursor numbers +** would be mapped into integers 0 through 7. +** +** The number of terms in a join is limited by the number of bits +** in prereqRight and prereqAll. The default is 64 bits, hence SQLite +** is only able to process joins with 64 or fewer tables. +*/ +struct WhereTerm { + Expr *pExpr; /* Pointer to the subexpression that is this term */ + WhereClause *pWC; /* The clause this term is part of */ + LogEst truthProb; /* Probability of truth for this expression */ + u16 wtFlags; /* TERM_xxx bit flags. See below */ + u16 eOperator; /* A WO_xx value describing */ + u8 nChild; /* Number of children that must disable us */ + u8 eMatchOp; /* Op for vtab MATCH/LIKE/GLOB/REGEXP terms */ + int iParent; /* Disable pWC->a[iParent] when this term disabled */ + int leftCursor; /* Cursor number of X in "X " */ + int iField; /* Field in (?,?,?) IN (SELECT...) vector */ + union { + int leftColumn; /* Column number of X in "X " */ + WhereOrInfo *pOrInfo; /* Extra information if (eOperator & WO_OR)!=0 */ + WhereAndInfo *pAndInfo; /* Extra information if (eOperator& WO_AND)!=0 */ + } u; + Bitmask prereqRight; /* Bitmask of tables used by pExpr->pRight */ + Bitmask prereqAll; /* Bitmask of tables referenced by pExpr */ +}; + +/* +** Allowed values of WhereTerm.wtFlags +*/ +#define TERM_DYNAMIC 0x01 /* Need to call sqlite3ExprDelete(db, pExpr) */ +#define TERM_VIRTUAL 0x02 /* Added by the optimizer. Do not code */ +#define TERM_CODED 0x04 /* This term is already coded */ +#define TERM_COPIED 0x08 /* Has a child */ +#define TERM_ORINFO 0x10 /* Need to free the WhereTerm.u.pOrInfo object */ +#define TERM_ANDINFO 0x20 /* Need to free the WhereTerm.u.pAndInfo obj */ +#define TERM_OR_OK 0x40 /* Used during OR-clause processing */ +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +# define TERM_VNULL 0x80 /* Manufactured x>NULL or x<=NULL term */ +#else +# define TERM_VNULL 0x00 /* Disabled if not using stat3 */ +#endif +#define TERM_LIKEOPT 0x100 /* Virtual terms from the LIKE optimization */ +#define TERM_LIKECOND 0x200 /* Conditionally this LIKE operator term */ +#define TERM_LIKE 0x400 /* The original LIKE operator */ +#define TERM_IS 0x800 /* Term.pExpr is an IS operator */ + +/* +** An instance of the WhereScan object is used as an iterator for locating +** terms in the WHERE clause that are useful to the query planner. +*/ +struct WhereScan { + WhereClause *pOrigWC; /* Original, innermost WhereClause */ + WhereClause *pWC; /* WhereClause currently being scanned */ + const char *zCollName; /* Required collating sequence, if not NULL */ + Expr *pIdxExpr; /* Search for this index expression */ + char idxaff; /* Must match this affinity, if zCollName!=NULL */ + unsigned char nEquiv; /* Number of entries in aEquiv[] */ + unsigned char iEquiv; /* Next unused slot in aEquiv[] */ + u32 opMask; /* Acceptable operators */ + int k; /* Resume scanning at this->pWC->a[this->k] */ + int aiCur[11]; /* Cursors in the equivalence class */ + i16 aiColumn[11]; /* Corresponding column number in the eq-class */ +}; + +/* +** An instance of the following structure holds all information about a +** WHERE clause. Mostly this is a container for one or more WhereTerms. +** +** Explanation of pOuter: For a WHERE clause of the form +** +** a AND ((b AND c) OR (d AND e)) AND f +** +** There are separate WhereClause objects for the whole clause and for +** the subclauses "(b AND c)" and "(d AND e)". The pOuter field of the +** subclauses points to the WhereClause object for the whole clause. +*/ +struct WhereClause { + WhereInfo *pWInfo; /* WHERE clause processing context */ + WhereClause *pOuter; /* Outer conjunction */ + u8 op; /* Split operator. TK_AND or TK_OR */ + int nTerm; /* Number of terms */ + int nSlot; /* Number of entries in a[] */ + WhereTerm *a; /* Each a[] describes a term of the WHERE cluase */ +#if defined(SQLITE_SMALL_STACK) + WhereTerm aStatic[1]; /* Initial static space for a[] */ +#else + WhereTerm aStatic[8]; /* Initial static space for a[] */ +#endif +}; + +/* +** A WhereTerm with eOperator==WO_OR has its u.pOrInfo pointer set to +** a dynamically allocated instance of the following structure. +*/ +struct WhereOrInfo { + WhereClause wc; /* Decomposition into subterms */ + Bitmask indexable; /* Bitmask of all indexable tables in the clause */ +}; + +/* +** A WhereTerm with eOperator==WO_AND has its u.pAndInfo pointer set to +** a dynamically allocated instance of the following structure. +*/ +struct WhereAndInfo { + WhereClause wc; /* The subexpression broken out */ +}; + +/* +** An instance of the following structure keeps track of a mapping +** between VDBE cursor numbers and bits of the bitmasks in WhereTerm. +** +** The VDBE cursor numbers are small integers contained in +** SrcList_item.iCursor and Expr.iTable fields. For any given WHERE +** clause, the cursor numbers might not begin with 0 and they might +** contain gaps in the numbering sequence. But we want to make maximum +** use of the bits in our bitmasks. This structure provides a mapping +** from the sparse cursor numbers into consecutive integers beginning +** with 0. +** +** If WhereMaskSet.ix[A]==B it means that The A-th bit of a Bitmask +** corresponds VDBE cursor number B. The A-th bit of a bitmask is 1<3, 5->1, 8->2, 29->0, +** 57->5, 73->4. Or one of 719 other combinations might be used. It +** does not really matter. What is important is that sparse cursor +** numbers all get mapped into bit numbers that begin with 0 and contain +** no gaps. +*/ +struct WhereMaskSet { + int n; /* Number of assigned cursor values */ + int ix[BMS]; /* Cursor assigned to each bit */ +}; + +/* +** Initialize a WhereMaskSet object +*/ +#define initMaskSet(P) (P)->n=0 + +/* +** This object is a convenience wrapper holding all information needed +** to construct WhereLoop objects for a particular query. +*/ +struct WhereLoopBuilder { + WhereInfo *pWInfo; /* Information about this WHERE */ + WhereClause *pWC; /* WHERE clause terms */ + ExprList *pOrderBy; /* ORDER BY clause */ + WhereLoop *pNew; /* Template WhereLoop */ + WhereOrSet *pOrSet; /* Record best loops here, if not NULL */ +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 + UnpackedRecord *pRec; /* Probe for stat4 (if required) */ + int nRecValid; /* Number of valid fields currently in pRec */ +#endif +}; + +/* +** The WHERE clause processing routine has two halves. The +** first part does the start of the WHERE loop and the second +** half does the tail of the WHERE loop. An instance of +** this structure is returned by the first half and passed +** into the second half to give some continuity. +** +** An instance of this object holds the complete state of the query +** planner. +*/ +struct WhereInfo { + Parse *pParse; /* Parsing and code generating context */ + SrcList *pTabList; /* List of tables in the join */ + ExprList *pOrderBy; /* The ORDER BY clause or NULL */ + ExprList *pDistinctSet; /* DISTINCT over all these values */ + LogEst iLimit; /* LIMIT if wctrlFlags has WHERE_USE_LIMIT */ + int aiCurOnePass[2]; /* OP_OpenWrite cursors for the ONEPASS opt */ + int iContinue; /* Jump here to continue with next record */ + int iBreak; /* Jump here to break out of the loop */ + int savedNQueryLoop; /* pParse->nQueryLoop outside the WHERE loop */ + u16 wctrlFlags; /* Flags originally passed to sqlite3WhereBegin() */ + u8 nLevel; /* Number of nested loop */ + i8 nOBSat; /* Number of ORDER BY terms satisfied by indices */ + u8 sorted; /* True if really sorted (not just grouped) */ + u8 eOnePass; /* ONEPASS_OFF, or _SINGLE, or _MULTI */ + u8 untestedTerms; /* Not all WHERE terms resolved by outer loop */ + u8 eDistinct; /* One of the WHERE_DISTINCT_* values */ + u8 bOrderedInnerLoop; /* True if only the inner-most loop is ordered */ + int iTop; /* The very beginning of the WHERE loop */ + WhereLoop *pLoops; /* List of all WhereLoop objects */ + Bitmask revMask; /* Mask of ORDER BY terms that need reversing */ + LogEst nRowOut; /* Estimated number of output rows */ + WhereClause sWC; /* Decomposition of the WHERE clause */ + WhereMaskSet sMaskSet; /* Map cursor numbers to bitmasks */ + WhereLevel a[1]; /* Information about each nest loop in WHERE */ +}; + +/* +** Private interfaces - callable only by other where.c routines. +** +** where.c: +*/ +SQLITE_PRIVATE Bitmask sqlite3WhereGetMask(WhereMaskSet*,int); +#ifdef WHERETRACE_ENABLED +SQLITE_PRIVATE void sqlite3WhereClausePrint(WhereClause *pWC); +#endif +SQLITE_PRIVATE WhereTerm *sqlite3WhereFindTerm( + WhereClause *pWC, /* The WHERE clause to be searched */ + int iCur, /* Cursor number of LHS */ + int iColumn, /* Column number of LHS */ + Bitmask notReady, /* RHS must not overlap with this mask */ + u32 op, /* Mask of WO_xx values describing operator */ + Index *pIdx /* Must be compatible with this index, if not NULL */ +); + +/* wherecode.c: */ +#ifndef SQLITE_OMIT_EXPLAIN +SQLITE_PRIVATE int sqlite3WhereExplainOneScan( + Parse *pParse, /* Parse context */ + SrcList *pTabList, /* Table list this loop refers to */ + WhereLevel *pLevel, /* Scan to write OP_Explain opcode for */ + int iLevel, /* Value for "level" column of output */ + int iFrom, /* Value for "from" column of output */ + u16 wctrlFlags /* Flags passed to sqlite3WhereBegin() */ +); +#else +# define sqlite3WhereExplainOneScan(u,v,w,x,y,z) 0 +#endif /* SQLITE_OMIT_EXPLAIN */ +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS +SQLITE_PRIVATE void sqlite3WhereAddScanStatus( + Vdbe *v, /* Vdbe to add scanstatus entry to */ + SrcList *pSrclist, /* FROM clause pLvl reads data from */ + WhereLevel *pLvl, /* Level to add scanstatus() entry for */ + int addrExplain /* Address of OP_Explain (or 0) */ +); +#else +# define sqlite3WhereAddScanStatus(a, b, c, d) ((void)d) +#endif +SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( + WhereInfo *pWInfo, /* Complete information about the WHERE clause */ + int iLevel, /* Which level of pWInfo->a[] should be coded */ + Bitmask notReady /* Which tables are currently available */ +); + +/* whereexpr.c: */ +SQLITE_PRIVATE void sqlite3WhereClauseInit(WhereClause*,WhereInfo*); +SQLITE_PRIVATE void sqlite3WhereClauseClear(WhereClause*); +SQLITE_PRIVATE void sqlite3WhereSplit(WhereClause*,Expr*,u8); +SQLITE_PRIVATE Bitmask sqlite3WhereExprUsage(WhereMaskSet*, Expr*); +SQLITE_PRIVATE Bitmask sqlite3WhereExprListUsage(WhereMaskSet*, ExprList*); +SQLITE_PRIVATE void sqlite3WhereExprAnalyze(SrcList*, WhereClause*); +SQLITE_PRIVATE void sqlite3WhereTabFuncArgs(Parse*, struct SrcList_item*, WhereClause*); + + + + + +/* +** Bitmasks for the operators on WhereTerm objects. These are all +** operators that are of interest to the query planner. An +** OR-ed combination of these values can be used when searching for +** particular WhereTerms within a WhereClause. +** +** Value constraints: +** WO_EQ == SQLITE_INDEX_CONSTRAINT_EQ +** WO_LT == SQLITE_INDEX_CONSTRAINT_LT +** WO_LE == SQLITE_INDEX_CONSTRAINT_LE +** WO_GT == SQLITE_INDEX_CONSTRAINT_GT +** WO_GE == SQLITE_INDEX_CONSTRAINT_GE +** WO_MATCH == SQLITE_INDEX_CONSTRAINT_MATCH +*/ +#define WO_IN 0x0001 +#define WO_EQ 0x0002 +#define WO_LT (WO_EQ<<(TK_LT-TK_EQ)) +#define WO_LE (WO_EQ<<(TK_LE-TK_EQ)) +#define WO_GT (WO_EQ<<(TK_GT-TK_EQ)) +#define WO_GE (WO_EQ<<(TK_GE-TK_EQ)) +#define WO_MATCH 0x0040 +#define WO_IS 0x0080 +#define WO_ISNULL 0x0100 +#define WO_OR 0x0200 /* Two or more OR-connected terms */ +#define WO_AND 0x0400 /* Two or more AND-connected terms */ +#define WO_EQUIV 0x0800 /* Of the form A==B, both columns */ +#define WO_NOOP 0x1000 /* This term does not restrict search space */ + +#define WO_ALL 0x1fff /* Mask of all possible WO_* values */ +#define WO_SINGLE 0x01ff /* Mask of all non-compound WO_* values */ + +/* +** These are definitions of bits in the WhereLoop.wsFlags field. +** The particular combination of bits in each WhereLoop help to +** determine the algorithm that WhereLoop represents. +*/ +#define WHERE_COLUMN_EQ 0x00000001 /* x=EXPR */ +#define WHERE_COLUMN_RANGE 0x00000002 /* xEXPR */ +#define WHERE_COLUMN_IN 0x00000004 /* x IN (...) */ +#define WHERE_COLUMN_NULL 0x00000008 /* x IS NULL */ +#define WHERE_CONSTRAINT 0x0000000f /* Any of the WHERE_COLUMN_xxx values */ +#define WHERE_TOP_LIMIT 0x00000010 /* xEXPR or x>=EXPR constraint */ +#define WHERE_BOTH_LIMIT 0x00000030 /* Both x>EXPR and xaiColumn[i]; + if( i==XN_EXPR ) return ""; + if( i==XN_ROWID ) return "rowid"; + return pIdx->pTable->aCol[i].zName; +} + +/* +** This routine is a helper for explainIndexRange() below +** +** pStr holds the text of an expression that we are building up one term +** at a time. This routine adds a new term to the end of the expression. +** Terms are separated by AND so add the "AND" text for second and subsequent +** terms only. +*/ +static void explainAppendTerm( + StrAccum *pStr, /* The text expression being built */ + Index *pIdx, /* Index to read column names from */ + int nTerm, /* Number of terms */ + int iTerm, /* Zero-based index of first term. */ + int bAnd, /* Non-zero to append " AND " */ + const char *zOp /* Name of the operator */ +){ + int i; + + assert( nTerm>=1 ); + if( bAnd ) sqlite3StrAccumAppend(pStr, " AND ", 5); + + if( nTerm>1 ) sqlite3StrAccumAppend(pStr, "(", 1); + for(i=0; i1 ) sqlite3StrAccumAppend(pStr, ")", 1); + + sqlite3StrAccumAppend(pStr, zOp, 1); + + if( nTerm>1 ) sqlite3StrAccumAppend(pStr, "(", 1); + for(i=0; i1 ) sqlite3StrAccumAppend(pStr, ")", 1); +} + +/* +** Argument pLevel describes a strategy for scanning table pTab. This +** function appends text to pStr that describes the subset of table +** rows scanned by the strategy in the form of an SQL expression. +** +** For example, if the query: +** +** SELECT * FROM t1 WHERE a=1 AND b>2; +** +** is run and there is an index on (a, b), then this function returns a +** string similar to: +** +** "a=? AND b>?" +*/ +static void explainIndexRange(StrAccum *pStr, WhereLoop *pLoop){ + Index *pIndex = pLoop->u.btree.pIndex; + u16 nEq = pLoop->u.btree.nEq; + u16 nSkip = pLoop->nSkip; + int i, j; + + if( nEq==0 && (pLoop->wsFlags&(WHERE_BTM_LIMIT|WHERE_TOP_LIMIT))==0 ) return; + sqlite3StrAccumAppend(pStr, " (", 2); + for(i=0; i=nSkip ? "%s=?" : "ANY(%s)", z); + } + + j = i; + if( pLoop->wsFlags&WHERE_BTM_LIMIT ){ + explainAppendTerm(pStr, pIndex, pLoop->u.btree.nBtm, j, i, ">"); + i = 1; + } + if( pLoop->wsFlags&WHERE_TOP_LIMIT ){ + explainAppendTerm(pStr, pIndex, pLoop->u.btree.nTop, j, i, "<"); + } + sqlite3StrAccumAppend(pStr, ")", 1); +} + +/* +** This function is a no-op unless currently processing an EXPLAIN QUERY PLAN +** command, or if either SQLITE_DEBUG or SQLITE_ENABLE_STMT_SCANSTATUS was +** defined at compile-time. If it is not a no-op, a single OP_Explain opcode +** is added to the output to describe the table scan strategy in pLevel. +** +** If an OP_Explain opcode is added to the VM, its address is returned. +** Otherwise, if no OP_Explain is coded, zero is returned. +*/ +SQLITE_PRIVATE int sqlite3WhereExplainOneScan( + Parse *pParse, /* Parse context */ + SrcList *pTabList, /* Table list this loop refers to */ + WhereLevel *pLevel, /* Scan to write OP_Explain opcode for */ + int iLevel, /* Value for "level" column of output */ + int iFrom, /* Value for "from" column of output */ + u16 wctrlFlags /* Flags passed to sqlite3WhereBegin() */ +){ + int ret = 0; +#if !defined(SQLITE_DEBUG) && !defined(SQLITE_ENABLE_STMT_SCANSTATUS) + if( pParse->explain==2 ) +#endif + { + struct SrcList_item *pItem = &pTabList->a[pLevel->iFrom]; + Vdbe *v = pParse->pVdbe; /* VM being constructed */ + sqlite3 *db = pParse->db; /* Database handle */ + int iId = pParse->iSelectId; /* Select id (left-most output column) */ + int isSearch; /* True for a SEARCH. False for SCAN. */ + WhereLoop *pLoop; /* The controlling WhereLoop object */ + u32 flags; /* Flags that describe this loop */ + char *zMsg; /* Text to add to EQP output */ + StrAccum str; /* EQP output string */ + char zBuf[100]; /* Initial space for EQP output string */ + + pLoop = pLevel->pWLoop; + flags = pLoop->wsFlags; + if( (flags&WHERE_MULTI_OR) || (wctrlFlags&WHERE_OR_SUBCLAUSE) ) return 0; + + isSearch = (flags&(WHERE_BTM_LIMIT|WHERE_TOP_LIMIT))!=0 + || ((flags&WHERE_VIRTUALTABLE)==0 && (pLoop->u.btree.nEq>0)) + || (wctrlFlags&(WHERE_ORDERBY_MIN|WHERE_ORDERBY_MAX)); + + sqlite3StrAccumInit(&str, db, zBuf, sizeof(zBuf), SQLITE_MAX_LENGTH); + sqlite3StrAccumAppendAll(&str, isSearch ? "SEARCH" : "SCAN"); + if( pItem->pSelect ){ + sqlite3XPrintf(&str, " SUBQUERY %d", pItem->iSelectId); + }else{ + sqlite3XPrintf(&str, " TABLE %s", pItem->zName); + } + + if( pItem->zAlias ){ + sqlite3XPrintf(&str, " AS %s", pItem->zAlias); + } + if( (flags & (WHERE_IPK|WHERE_VIRTUALTABLE))==0 ){ + const char *zFmt = 0; + Index *pIdx; + + assert( pLoop->u.btree.pIndex!=0 ); + pIdx = pLoop->u.btree.pIndex; + assert( !(flags&WHERE_AUTO_INDEX) || (flags&WHERE_IDX_ONLY) ); + if( !HasRowid(pItem->pTab) && IsPrimaryKeyIndex(pIdx) ){ + if( isSearch ){ + zFmt = "PRIMARY KEY"; + } + }else if( flags & WHERE_PARTIALIDX ){ + zFmt = "AUTOMATIC PARTIAL COVERING INDEX"; + }else if( flags & WHERE_AUTO_INDEX ){ + zFmt = "AUTOMATIC COVERING INDEX"; + }else if( flags & WHERE_IDX_ONLY ){ + zFmt = "COVERING INDEX %s"; + }else{ + zFmt = "INDEX %s"; + } + if( zFmt ){ + sqlite3StrAccumAppend(&str, " USING ", 7); + sqlite3XPrintf(&str, zFmt, pIdx->zName); + explainIndexRange(&str, pLoop); + } + }else if( (flags & WHERE_IPK)!=0 && (flags & WHERE_CONSTRAINT)!=0 ){ + const char *zRangeOp; + if( flags&(WHERE_COLUMN_EQ|WHERE_COLUMN_IN) ){ + zRangeOp = "="; + }else if( (flags&WHERE_BOTH_LIMIT)==WHERE_BOTH_LIMIT ){ + zRangeOp = ">? AND rowid<"; + }else if( flags&WHERE_BTM_LIMIT ){ + zRangeOp = ">"; + }else{ + assert( flags&WHERE_TOP_LIMIT); + zRangeOp = "<"; + } + sqlite3XPrintf(&str, " USING INTEGER PRIMARY KEY (rowid%s?)",zRangeOp); + } +#ifndef SQLITE_OMIT_VIRTUALTABLE + else if( (flags & WHERE_VIRTUALTABLE)!=0 ){ + sqlite3XPrintf(&str, " VIRTUAL TABLE INDEX %d:%s", + pLoop->u.vtab.idxNum, pLoop->u.vtab.idxStr); + } +#endif +#ifdef SQLITE_EXPLAIN_ESTIMATED_ROWS + if( pLoop->nOut>=10 ){ + sqlite3XPrintf(&str, " (~%llu rows)", sqlite3LogEstToInt(pLoop->nOut)); + }else{ + sqlite3StrAccumAppend(&str, " (~1 row)", 9); + } +#endif + zMsg = sqlite3StrAccumFinish(&str); + ret = sqlite3VdbeAddOp4(v, OP_Explain, iId, iLevel, iFrom, zMsg,P4_DYNAMIC); + } + return ret; +} +#endif /* SQLITE_OMIT_EXPLAIN */ + +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS +/* +** Configure the VM passed as the first argument with an +** sqlite3_stmt_scanstatus() entry corresponding to the scan used to +** implement level pLvl. Argument pSrclist is a pointer to the FROM +** clause that the scan reads data from. +** +** If argument addrExplain is not 0, it must be the address of an +** OP_Explain instruction that describes the same loop. +*/ +SQLITE_PRIVATE void sqlite3WhereAddScanStatus( + Vdbe *v, /* Vdbe to add scanstatus entry to */ + SrcList *pSrclist, /* FROM clause pLvl reads data from */ + WhereLevel *pLvl, /* Level to add scanstatus() entry for */ + int addrExplain /* Address of OP_Explain (or 0) */ +){ + const char *zObj = 0; + WhereLoop *pLoop = pLvl->pWLoop; + if( (pLoop->wsFlags & WHERE_VIRTUALTABLE)==0 && pLoop->u.btree.pIndex!=0 ){ + zObj = pLoop->u.btree.pIndex->zName; + }else{ + zObj = pSrclist->a[pLvl->iFrom].zName; + } + sqlite3VdbeScanStatus( + v, addrExplain, pLvl->addrBody, pLvl->addrVisit, pLoop->nOut, zObj + ); +} +#endif + + +/* +** Disable a term in the WHERE clause. Except, do not disable the term +** if it controls a LEFT OUTER JOIN and it did not originate in the ON +** or USING clause of that join. +** +** Consider the term t2.z='ok' in the following queries: +** +** (1) SELECT * FROM t1 LEFT JOIN t2 ON t1.a=t2.x WHERE t2.z='ok' +** (2) SELECT * FROM t1 LEFT JOIN t2 ON t1.a=t2.x AND t2.z='ok' +** (3) SELECT * FROM t1, t2 WHERE t1.a=t2.x AND t2.z='ok' +** +** The t2.z='ok' is disabled in the in (2) because it originates +** in the ON clause. The term is disabled in (3) because it is not part +** of a LEFT OUTER JOIN. In (1), the term is not disabled. +** +** Disabling a term causes that term to not be tested in the inner loop +** of the join. Disabling is an optimization. When terms are satisfied +** by indices, we disable them to prevent redundant tests in the inner +** loop. We would get the correct results if nothing were ever disabled, +** but joins might run a little slower. The trick is to disable as much +** as we can without disabling too much. If we disabled in (1), we'd get +** the wrong answer. See ticket #813. +** +** If all the children of a term are disabled, then that term is also +** automatically disabled. In this way, terms get disabled if derived +** virtual terms are tested first. For example: +** +** x GLOB 'abc*' AND x>='abc' AND x<'acd' +** \___________/ \______/ \_____/ +** parent child1 child2 +** +** Only the parent term was in the original WHERE clause. The child1 +** and child2 terms were added by the LIKE optimization. If both of +** the virtual child terms are valid, then testing of the parent can be +** skipped. +** +** Usually the parent term is marked as TERM_CODED. But if the parent +** term was originally TERM_LIKE, then the parent gets TERM_LIKECOND instead. +** The TERM_LIKECOND marking indicates that the term should be coded inside +** a conditional such that is only evaluated on the second pass of a +** LIKE-optimization loop, when scanning BLOBs instead of strings. +*/ +static void disableTerm(WhereLevel *pLevel, WhereTerm *pTerm){ + int nLoop = 0; + while( ALWAYS(pTerm!=0) + && (pTerm->wtFlags & TERM_CODED)==0 + && (pLevel->iLeftJoin==0 || ExprHasProperty(pTerm->pExpr, EP_FromJoin)) + && (pLevel->notReady & pTerm->prereqAll)==0 + ){ + if( nLoop && (pTerm->wtFlags & TERM_LIKE)!=0 ){ + pTerm->wtFlags |= TERM_LIKECOND; + }else{ + pTerm->wtFlags |= TERM_CODED; + } + if( pTerm->iParent<0 ) break; + pTerm = &pTerm->pWC->a[pTerm->iParent]; + pTerm->nChild--; + if( pTerm->nChild!=0 ) break; + nLoop++; + } +} + +/* +** Code an OP_Affinity opcode to apply the column affinity string zAff +** to the n registers starting at base. +** +** As an optimization, SQLITE_AFF_BLOB entries (which are no-ops) at the +** beginning and end of zAff are ignored. If all entries in zAff are +** SQLITE_AFF_BLOB, 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 ); + + /* Adjust base and n to skip over SQLITE_AFF_BLOB entries at the beginning + ** and end of the affinity string. + */ + while( n>0 && zAff[0]==SQLITE_AFF_BLOB ){ + n--; + base++; + zAff++; + } + while( n>1 && zAff[n-1]==SQLITE_AFF_BLOB ){ + n--; + } + + /* Code the OP_Affinity opcode if there is anything left to do. */ + if( n>0 ){ + sqlite3VdbeAddOp4(v, OP_Affinity, base, n, 0, zAff, n); + sqlite3ExprCacheAffinityChange(pParse, base, n); + } +} + +/* +** Expression pRight, which is the RHS of a comparison operation, is +** either a vector of n elements or, if n==1, a scalar expression. +** Before the comparison operation, affinity zAff is to be applied +** to the pRight values. This function modifies characters within the +** affinity string to SQLITE_AFF_BLOB if either: +** +** * the comparison will be performed with no affinity, or +** * the affinity change in zAff is guaranteed not to change the value. +*/ +static void updateRangeAffinityStr( + Expr *pRight, /* RHS of comparison */ + int n, /* Number of vector elements in comparison */ + char *zAff /* Affinity string to modify */ +){ + int i; + for(i=0; ipExpr; + Vdbe *v = pParse->pVdbe; + int iReg; /* Register holding results */ + + assert( pLevel->pWLoop->aLTerm[iEq]==pTerm ); + assert( iTarget>0 ); + if( pX->op==TK_EQ || pX->op==TK_IS ){ + iReg = sqlite3ExprCodeTarget(pParse, pX->pRight, iTarget); + }else if( pX->op==TK_ISNULL ){ + iReg = iTarget; + sqlite3VdbeAddOp2(v, OP_Null, 0, iReg); +#ifndef SQLITE_OMIT_SUBQUERY + }else{ + int eType = IN_INDEX_NOOP; + int iTab; + struct InLoop *pIn; + WhereLoop *pLoop = pLevel->pWLoop; + int i; + int nEq = 0; + int *aiMap = 0; + + if( (pLoop->wsFlags & WHERE_VIRTUALTABLE)==0 + && pLoop->u.btree.pIndex!=0 + && pLoop->u.btree.pIndex->aSortOrder[iEq] + ){ + testcase( iEq==0 ); + testcase( bRev ); + bRev = !bRev; + } + assert( pX->op==TK_IN ); + iReg = iTarget; + + for(i=0; iaLTerm[i] && pLoop->aLTerm[i]->pExpr==pX ){ + disableTerm(pLevel, pTerm); + return iTarget; + } + } + for(i=iEq;inLTerm; i++){ + if( ALWAYS(pLoop->aLTerm[i]) && pLoop->aLTerm[i]->pExpr==pX ) nEq++; + } + + if( (pX->flags & EP_xIsSelect)==0 || pX->x.pSelect->pEList->nExpr==1 ){ + eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, 0); + }else{ + Select *pSelect = pX->x.pSelect; + sqlite3 *db = pParse->db; + u16 savedDbOptFlags = db->dbOptFlags; + ExprList *pOrigRhs = pSelect->pEList; + ExprList *pOrigLhs = pX->pLeft->x.pList; + ExprList *pRhs = 0; /* New Select.pEList for RHS */ + ExprList *pLhs = 0; /* New pX->pLeft vector */ + + for(i=iEq;inLTerm; i++){ + if( pLoop->aLTerm[i]->pExpr==pX ){ + int iField = pLoop->aLTerm[i]->iField - 1; + Expr *pNewRhs = sqlite3ExprDup(db, pOrigRhs->a[iField].pExpr, 0); + Expr *pNewLhs = sqlite3ExprDup(db, pOrigLhs->a[iField].pExpr, 0); + + pRhs = sqlite3ExprListAppend(pParse, pRhs, pNewRhs); + pLhs = sqlite3ExprListAppend(pParse, pLhs, pNewLhs); + } + } + if( !db->mallocFailed ){ + Expr *pLeft = pX->pLeft; + + if( pSelect->pOrderBy ){ + /* If the SELECT statement has an ORDER BY clause, zero the + ** iOrderByCol variables. These are set to non-zero when an + ** ORDER BY term exactly matches one of the terms of the + ** result-set. Since the result-set of the SELECT statement may + ** have been modified or reordered, these variables are no longer + ** set correctly. Since setting them is just an optimization, + ** it's easiest just to zero them here. */ + ExprList *pOrderBy = pSelect->pOrderBy; + for(i=0; inExpr; i++){ + pOrderBy->a[i].u.x.iOrderByCol = 0; + } + } + + /* Take care here not to generate a TK_VECTOR containing only a + ** single value. Since the parser never creates such a vector, some + ** of the subroutines do not handle this case. */ + if( pLhs->nExpr==1 ){ + pX->pLeft = pLhs->a[0].pExpr; + }else{ + pLeft->x.pList = pLhs; + aiMap = (int*)sqlite3DbMallocZero(pParse->db, sizeof(int) * nEq); + testcase( aiMap==0 ); + } + pSelect->pEList = pRhs; + db->dbOptFlags |= SQLITE_QueryFlattener; + eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, aiMap); + db->dbOptFlags = savedDbOptFlags; + testcase( aiMap!=0 && aiMap[0]!=0 ); + pSelect->pEList = pOrigRhs; + pLeft->x.pList = pOrigLhs; + pX->pLeft = pLeft; + } + sqlite3ExprListDelete(pParse->db, pLhs); + sqlite3ExprListDelete(pParse->db, pRhs); + } + + if( eType==IN_INDEX_INDEX_DESC ){ + testcase( bRev ); + bRev = !bRev; + } + iTab = pX->iTable; + sqlite3VdbeAddOp2(v, bRev ? OP_Last : OP_Rewind, iTab, 0); + VdbeCoverageIf(v, bRev); + VdbeCoverageIf(v, !bRev); + assert( (pLoop->wsFlags & WHERE_MULTI_OR)==0 ); + + pLoop->wsFlags |= WHERE_IN_ABLE; + if( pLevel->u.in.nIn==0 ){ + pLevel->addrNxt = sqlite3VdbeMakeLabel(v); + } + + i = pLevel->u.in.nIn; + pLevel->u.in.nIn += nEq; + pLevel->u.in.aInLoop = + sqlite3DbReallocOrFree(pParse->db, pLevel->u.in.aInLoop, + sizeof(pLevel->u.in.aInLoop[0])*pLevel->u.in.nIn); + pIn = pLevel->u.in.aInLoop; + if( pIn ){ + int iMap = 0; /* Index in aiMap[] */ + pIn += i; + for(i=iEq;inLTerm; i++){ + if( pLoop->aLTerm[i]->pExpr==pX ){ + int iOut = iReg + i - iEq; + if( eType==IN_INDEX_ROWID ){ + testcase( nEq>1 ); /* Happens with a UNIQUE index on ROWID */ + pIn->addrInTop = sqlite3VdbeAddOp2(v, OP_Rowid, iTab, iOut); + }else{ + int iCol = aiMap ? aiMap[iMap++] : 0; + pIn->addrInTop = sqlite3VdbeAddOp3(v,OP_Column,iTab, iCol, iOut); + } + sqlite3VdbeAddOp1(v, OP_IsNull, iOut); VdbeCoverage(v); + if( i==iEq ){ + pIn->iCur = iTab; + pIn->eEndLoopOp = bRev ? OP_PrevIfOpen : OP_NextIfOpen; + }else{ + pIn->eEndLoopOp = OP_Noop; + } + pIn++; + } + } + }else{ + pLevel->u.in.nIn = 0; + } + sqlite3DbFree(pParse->db, aiMap); +#endif + } + disableTerm(pLevel, pTerm); + return iReg; +} + +/* +** Generate code that will evaluate all == and IN constraints for an +** index scan. +** +** 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 +** The index has as many as three equality constraints, but in this +** example, the third "c" value is an inequality. So only two +** constraints are coded. This routine will generate code to evaluate +** a==5 and b IN (1,2,3). The current values for a and b will be stored +** in consecutive registers and the index of the first register is returned. +** +** 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 and +** compute the affinity string. +** +** The nExtraReg parameter is 0 or 1. It is 0 if all WHERE clause constraints +** are == or IN and are covered by the nEq. nExtraReg is 1 if there is +** an inequality constraint (such as the "c>=5 AND c<10" in the example) that +** occurs after the nEq quality constraints. +** +** This routine allocates a range of nEq+nExtraReg memory cells and returns +** the index of the first memory cell in that range. The code that +** calls this routine will use that memory range to store keys for +** start and termination conditions of the loop. +** key value of the loop. If one or more IN operators appear, then +** this routine allocates an additional nEq memory cells for internal +** use. +** +** Before returning, *pzAff is set to point to a buffer containing a +** copy of the column affinity string of the index allocated using +** sqlite3DbMalloc(). Except, entries in the copy of the string associated +** with equality constraints that use BLOB or NONE affinity are set to +** SQLITE_AFF_BLOB. This is to deal with SQL such as the following: +** +** CREATE TABLE t1(a TEXT PRIMARY KEY, b); +** SELECT ... FROM t1 AS t2, t1 WHERE t1.a = t2.b; +** +** In the example above, the index on t1(a) has TEXT affinity. But since +** the right hand side of the equality constraint (t2.b) has BLOB/NONE affinity, +** no conversion should be attempted before using a t2.b value as part of +** a key to search the index. Hence the first byte in the returned affinity +** string in this example would be set to SQLITE_AFF_BLOB. +*/ +static int codeAllEqualityTerms( + Parse *pParse, /* Parsing context */ + WhereLevel *pLevel, /* Which nested loop of the FROM we are coding */ + int bRev, /* Reverse the order of IN operators */ + int nExtraReg, /* Number of extra registers to allocate */ + char **pzAff /* OUT: Set to point to affinity string */ +){ + u16 nEq; /* The number of == or IN constraints to code */ + u16 nSkip; /* Number of left-most columns to skip */ + Vdbe *v = pParse->pVdbe; /* The vm under construction */ + Index *pIdx; /* The index being used for this loop */ + WhereTerm *pTerm; /* A single constraint term */ + WhereLoop *pLoop; /* The WhereLoop object */ + int j; /* Loop counter */ + int regBase; /* Base register */ + int nReg; /* Number of registers to allocate */ + char *zAff; /* Affinity string to return */ + + /* This module is only called on query plans that use an index. */ + pLoop = pLevel->pWLoop; + assert( (pLoop->wsFlags & WHERE_VIRTUALTABLE)==0 ); + nEq = pLoop->u.btree.nEq; + nSkip = pLoop->nSkip; + pIdx = pLoop->u.btree.pIndex; + assert( pIdx!=0 ); + + /* Figure out how many memory cells we will need then allocate them. + */ + regBase = pParse->nMem + 1; + nReg = pLoop->u.btree.nEq + nExtraReg; + pParse->nMem += nReg; + + zAff = sqlite3DbStrDup(pParse->db,sqlite3IndexAffinityStr(pParse->db,pIdx)); + assert( zAff!=0 || pParse->db->mallocFailed ); + + if( nSkip ){ + int iIdxCur = pLevel->iIdxCur; + sqlite3VdbeAddOp1(v, (bRev?OP_Last:OP_Rewind), iIdxCur); + VdbeCoverageIf(v, bRev==0); + VdbeCoverageIf(v, bRev!=0); + VdbeComment((v, "begin skip-scan on %s", pIdx->zName)); + j = sqlite3VdbeAddOp0(v, OP_Goto); + pLevel->addrSkip = sqlite3VdbeAddOp4Int(v, (bRev?OP_SeekLT:OP_SeekGT), + iIdxCur, 0, regBase, nSkip); + VdbeCoverageIf(v, bRev==0); + VdbeCoverageIf(v, bRev!=0); + sqlite3VdbeJumpHere(v, j); + for(j=0; jaiColumn[j]==XN_EXPR ); + VdbeComment((v, "%s", explainIndexColumnName(pIdx, j))); + } + } + + /* Evaluate the equality constraints + */ + assert( zAff==0 || (int)strlen(zAff)>=nEq ); + for(j=nSkip; jaLTerm[j]; + assert( pTerm!=0 ); + /* The following testcase is true for indices with redundant columns. + ** Ex: CREATE INDEX i1 ON t1(a,b,a); SELECT * FROM t1 WHERE a=0 AND b=0; */ + testcase( (pTerm->wtFlags & TERM_CODED)!=0 ); + testcase( pTerm->wtFlags & TERM_VIRTUAL ); + r1 = codeEqualityTerm(pParse, pTerm, pLevel, j, bRev, regBase+j); + if( r1!=regBase+j ){ + if( nReg==1 ){ + sqlite3ReleaseTempReg(pParse, regBase); + regBase = r1; + }else{ + sqlite3VdbeAddOp2(v, OP_SCopy, r1, regBase+j); + } + } + if( pTerm->eOperator & WO_IN ){ + if( pTerm->pExpr->flags & EP_xIsSelect ){ + /* No affinity ever needs to be (or should be) applied to a value + ** from the RHS of an "? IN (SELECT ...)" expression. The + ** sqlite3FindInIndex() routine has already ensured that the + ** affinity of the comparison has been applied to the value. */ + if( zAff ) zAff[j] = SQLITE_AFF_BLOB; + } + }else if( (pTerm->eOperator & WO_ISNULL)==0 ){ + Expr *pRight = pTerm->pExpr->pRight; + if( (pTerm->wtFlags & TERM_IS)==0 && sqlite3ExprCanBeNull(pRight) ){ + sqlite3VdbeAddOp2(v, OP_IsNull, regBase+j, pLevel->addrBrk); + VdbeCoverage(v); + } + if( zAff ){ + if( sqlite3CompareAffinity(pRight, zAff[j])==SQLITE_AFF_BLOB ){ + zAff[j] = SQLITE_AFF_BLOB; + } + if( sqlite3ExprNeedsNoAffinityChange(pRight, zAff[j]) ){ + zAff[j] = SQLITE_AFF_BLOB; + } + } + } + } + *pzAff = zAff; + return regBase; +} + +#ifndef SQLITE_LIKE_DOESNT_MATCH_BLOBS +/* +** If the most recently coded instruction is a constant range constraint +** (a string literal) that originated from the LIKE optimization, then +** set P3 and P5 on the OP_String opcode so that the string will be cast +** to a BLOB at appropriate times. +** +** The LIKE optimization trys to evaluate "x LIKE 'abc%'" as a range +** expression: "x>='ABC' AND x<'abd'". But this requires that the range +** scan loop run twice, once for strings and a second time for BLOBs. +** The OP_String opcodes on the second pass convert the upper and lower +** bound string constants to blobs. This routine makes the necessary changes +** to the OP_String opcodes for that to happen. +** +** Except, of course, if SQLITE_LIKE_DOESNT_MATCH_BLOBS is defined, then +** only the one pass through the string space is required, so this routine +** becomes a no-op. +*/ +static void whereLikeOptimizationStringFixup( + Vdbe *v, /* prepared statement under construction */ + WhereLevel *pLevel, /* The loop that contains the LIKE operator */ + WhereTerm *pTerm /* The upper or lower bound just coded */ +){ + if( pTerm->wtFlags & TERM_LIKEOPT ){ + VdbeOp *pOp; + assert( pLevel->iLikeRepCntr>0 ); + pOp = sqlite3VdbeGetOp(v, -1); + assert( pOp!=0 ); + assert( pOp->opcode==OP_String8 + || pTerm->pWC->pWInfo->pParse->db->mallocFailed ); + pOp->p3 = (int)(pLevel->iLikeRepCntr>>1); /* Register holding counter */ + pOp->p5 = (u8)(pLevel->iLikeRepCntr&1); /* ASC or DESC */ + } +} +#else +# define whereLikeOptimizationStringFixup(A,B,C) +#endif + +#ifdef SQLITE_ENABLE_CURSOR_HINTS +/* +** Information is passed from codeCursorHint() down to individual nodes of +** the expression tree (by sqlite3WalkExpr()) using an instance of this +** structure. +*/ +struct CCurHint { + int iTabCur; /* Cursor for the main table */ + int iIdxCur; /* Cursor for the index, if pIdx!=0. Unused otherwise */ + Index *pIdx; /* The index used to access the table */ +}; + +/* +** This function is called for every node of an expression that is a candidate +** for a cursor hint on an index cursor. For TK_COLUMN nodes that reference +** the table CCurHint.iTabCur, verify that the same column can be +** accessed through the index. If it cannot, then set pWalker->eCode to 1. +*/ +static int codeCursorHintCheckExpr(Walker *pWalker, Expr *pExpr){ + struct CCurHint *pHint = pWalker->u.pCCurHint; + assert( pHint->pIdx!=0 ); + if( pExpr->op==TK_COLUMN + && pExpr->iTable==pHint->iTabCur + && sqlite3ColumnOfIndex(pHint->pIdx, pExpr->iColumn)<0 + ){ + pWalker->eCode = 1; + } + return WRC_Continue; +} + +/* +** Test whether or not expression pExpr, which was part of a WHERE clause, +** should be included in the cursor-hint for a table that is on the rhs +** of a LEFT JOIN. Set Walker.eCode to non-zero before returning if the +** expression is not suitable. +** +** An expression is unsuitable if it might evaluate to non NULL even if +** a TK_COLUMN node that does affect the value of the expression is set +** to NULL. For example: +** +** col IS NULL +** col IS NOT NULL +** coalesce(col, 1) +** CASE WHEN col THEN 0 ELSE 1 END +*/ +static int codeCursorHintIsOrFunction(Walker *pWalker, Expr *pExpr){ + if( pExpr->op==TK_IS + || pExpr->op==TK_ISNULL || pExpr->op==TK_ISNOT + || pExpr->op==TK_NOTNULL || pExpr->op==TK_CASE + ){ + pWalker->eCode = 1; + }else if( pExpr->op==TK_FUNCTION ){ + int d1; + char d2[3]; + if( 0==sqlite3IsLikeFunction(pWalker->pParse->db, pExpr, &d1, d2) ){ + pWalker->eCode = 1; + } + } + + return WRC_Continue; +} + + +/* +** This function is called on every node of an expression tree used as an +** argument to the OP_CursorHint instruction. If the node is a TK_COLUMN +** that accesses any table other than the one identified by +** CCurHint.iTabCur, then do the following: +** +** 1) allocate a register and code an OP_Column instruction to read +** the specified column into the new register, and +** +** 2) transform the expression node to a TK_REGISTER node that reads +** from the newly populated register. +** +** Also, if the node is a TK_COLUMN that does access the table idenified +** by pCCurHint.iTabCur, and an index is being used (which we will +** know because CCurHint.pIdx!=0) then transform the TK_COLUMN into +** an access of the index rather than the original table. +*/ +static int codeCursorHintFixExpr(Walker *pWalker, Expr *pExpr){ + int rc = WRC_Continue; + struct CCurHint *pHint = pWalker->u.pCCurHint; + if( pExpr->op==TK_COLUMN ){ + if( pExpr->iTable!=pHint->iTabCur ){ + Vdbe *v = pWalker->pParse->pVdbe; + int reg = ++pWalker->pParse->nMem; /* Register for column value */ + sqlite3ExprCodeGetColumnOfTable( + v, pExpr->pTab, pExpr->iTable, pExpr->iColumn, reg + ); + pExpr->op = TK_REGISTER; + pExpr->iTable = reg; + }else if( pHint->pIdx!=0 ){ + pExpr->iTable = pHint->iIdxCur; + pExpr->iColumn = sqlite3ColumnOfIndex(pHint->pIdx, pExpr->iColumn); + assert( pExpr->iColumn>=0 ); + } + }else if( pExpr->op==TK_AGG_FUNCTION ){ + /* An aggregate function in the WHERE clause of a query means this must + ** be a correlated sub-query, and expression pExpr is an aggregate from + ** the parent context. Do not walk the function arguments in this case. + ** + ** todo: It should be possible to replace this node with a TK_REGISTER + ** expression, as the result of the expression must be stored in a + ** register at this point. The same holds for TK_AGG_COLUMN nodes. */ + rc = WRC_Prune; + } + return rc; +} + +/* +** Insert an OP_CursorHint instruction if it is appropriate to do so. +*/ +static void codeCursorHint( + struct SrcList_item *pTabItem, /* FROM clause item */ + WhereInfo *pWInfo, /* The where clause */ + WhereLevel *pLevel, /* Which loop to provide hints for */ + WhereTerm *pEndRange /* Hint this end-of-scan boundary term if not NULL */ +){ + Parse *pParse = pWInfo->pParse; + sqlite3 *db = pParse->db; + Vdbe *v = pParse->pVdbe; + Expr *pExpr = 0; + WhereLoop *pLoop = pLevel->pWLoop; + int iCur; + WhereClause *pWC; + WhereTerm *pTerm; + int i, j; + struct CCurHint sHint; + Walker sWalker; + + if( OptimizationDisabled(db, SQLITE_CursorHints) ) return; + iCur = pLevel->iTabCur; + assert( iCur==pWInfo->pTabList->a[pLevel->iFrom].iCursor ); + sHint.iTabCur = iCur; + sHint.iIdxCur = pLevel->iIdxCur; + sHint.pIdx = pLoop->u.btree.pIndex; + memset(&sWalker, 0, sizeof(sWalker)); + sWalker.pParse = pParse; + sWalker.u.pCCurHint = &sHint; + pWC = &pWInfo->sWC; + for(i=0; inTerm; i++){ + pTerm = &pWC->a[i]; + if( pTerm->wtFlags & (TERM_VIRTUAL|TERM_CODED) ) continue; + if( pTerm->prereqAll & pLevel->notReady ) continue; + + /* Any terms specified as part of the ON(...) clause for any LEFT + ** JOIN for which the current table is not the rhs are omitted + ** from the cursor-hint. + ** + ** If this table is the rhs of a LEFT JOIN, "IS" or "IS NULL" terms + ** that were specified as part of the WHERE clause must be excluded. + ** This is to address the following: + ** + ** SELECT ... t1 LEFT JOIN t2 ON (t1.a=t2.b) WHERE t2.c IS NULL; + ** + ** Say there is a single row in t2 that matches (t1.a=t2.b), but its + ** t2.c values is not NULL. If the (t2.c IS NULL) constraint is + ** pushed down to the cursor, this row is filtered out, causing + ** SQLite to synthesize a row of NULL values. Which does match the + ** WHERE clause, and so the query returns a row. Which is incorrect. + ** + ** For the same reason, WHERE terms such as: + ** + ** WHERE 1 = (t2.c IS NULL) + ** + ** are also excluded. See codeCursorHintIsOrFunction() for details. + */ + if( pTabItem->fg.jointype & JT_LEFT ){ + Expr *pExpr = pTerm->pExpr; + if( !ExprHasProperty(pExpr, EP_FromJoin) + || pExpr->iRightJoinTable!=pTabItem->iCursor + ){ + sWalker.eCode = 0; + sWalker.xExprCallback = codeCursorHintIsOrFunction; + sqlite3WalkExpr(&sWalker, pTerm->pExpr); + if( sWalker.eCode ) continue; + } + }else{ + if( ExprHasProperty(pTerm->pExpr, EP_FromJoin) ) continue; + } + + /* All terms in pWLoop->aLTerm[] except pEndRange are used to initialize + ** the cursor. These terms are not needed as hints for a pure range + ** scan (that has no == terms) so omit them. */ + if( pLoop->u.btree.nEq==0 && pTerm!=pEndRange ){ + for(j=0; jnLTerm && pLoop->aLTerm[j]!=pTerm; j++){} + if( jnLTerm ) continue; + } + + /* No subqueries or non-deterministic functions allowed */ + if( sqlite3ExprContainsSubquery(pTerm->pExpr) ) continue; + + /* For an index scan, make sure referenced columns are actually in + ** the index. */ + if( sHint.pIdx!=0 ){ + sWalker.eCode = 0; + sWalker.xExprCallback = codeCursorHintCheckExpr; + sqlite3WalkExpr(&sWalker, pTerm->pExpr); + if( sWalker.eCode ) continue; + } + + /* If we survive all prior tests, that means this term is worth hinting */ + pExpr = sqlite3ExprAnd(db, pExpr, sqlite3ExprDup(db, pTerm->pExpr, 0)); + } + if( pExpr!=0 ){ + sWalker.xExprCallback = codeCursorHintFixExpr; + sqlite3WalkExpr(&sWalker, pExpr); + sqlite3VdbeAddOp4(v, OP_CursorHint, + (sHint.pIdx ? sHint.iIdxCur : sHint.iTabCur), 0, 0, + (const char*)pExpr, P4_EXPR); + } +} +#else +# define codeCursorHint(A,B,C,D) /* No-op */ +#endif /* SQLITE_ENABLE_CURSOR_HINTS */ + +/* +** Cursor iCur is open on an intkey b-tree (a table). Register iRowid contains +** a rowid value just read from cursor iIdxCur, open on index pIdx. This +** function generates code to do a deferred seek of cursor iCur to the +** rowid stored in register iRowid. +** +** Normally, this is just: +** +** OP_Seek $iCur $iRowid +** +** However, if the scan currently being coded is a branch of an OR-loop and +** the statement currently being coded is a SELECT, then P3 of the OP_Seek +** is set to iIdxCur and P4 is set to point to an array of integers +** containing one entry for each column of the table cursor iCur is open +** on. For each table column, if the column is the i'th column of the +** index, then the corresponding array entry is set to (i+1). If the column +** does not appear in the index at all, the array entry is set to 0. +*/ +static void codeDeferredSeek( + WhereInfo *pWInfo, /* Where clause context */ + Index *pIdx, /* Index scan is using */ + int iCur, /* Cursor for IPK b-tree */ + int iIdxCur /* Index cursor */ +){ + Parse *pParse = pWInfo->pParse; /* Parse context */ + Vdbe *v = pParse->pVdbe; /* Vdbe to generate code within */ + + assert( iIdxCur>0 ); + assert( pIdx->aiColumn[pIdx->nColumn-1]==-1 ); + + sqlite3VdbeAddOp3(v, OP_Seek, iIdxCur, 0, iCur); + if( (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE) + && DbMaskAllZero(sqlite3ParseToplevel(pParse)->writeMask) + ){ + int i; + Table *pTab = pIdx->pTable; + int *ai = (int*)sqlite3DbMallocZero(pParse->db, sizeof(int)*(pTab->nCol+1)); + if( ai ){ + ai[0] = pTab->nCol; + for(i=0; inColumn-1; i++){ + assert( pIdx->aiColumn[i]nCol ); + if( pIdx->aiColumn[i]>=0 ) ai[pIdx->aiColumn[i]+1] = i+1; + } + sqlite3VdbeChangeP4(v, -1, (char*)ai, P4_INTARRAY); + } + } +} + +/* +** If the expression passed as the second argument is a vector, generate +** code to write the first nReg elements of the vector into an array +** of registers starting with iReg. +** +** If the expression is not a vector, then nReg must be passed 1. In +** this case, generate code to evaluate the expression and leave the +** result in register iReg. +*/ +static void codeExprOrVector(Parse *pParse, Expr *p, int iReg, int nReg){ + assert( nReg>0 ); + if( sqlite3ExprIsVector(p) ){ +#ifndef SQLITE_OMIT_SUBQUERY + if( (p->flags & EP_xIsSelect) ){ + Vdbe *v = pParse->pVdbe; + int iSelect = sqlite3CodeSubselect(pParse, p, 0, 0); + sqlite3VdbeAddOp3(v, OP_Copy, iSelect, iReg, nReg-1); + }else +#endif + { + int i; + ExprList *pList = p->x.pList; + assert( nReg<=pList->nExpr ); + for(i=0; ia[i].pExpr, iReg+i); + } + } + }else{ + assert( nReg==1 ); + sqlite3ExprCode(pParse, p, iReg); + } +} + +/* +** Generate code for the start of the iLevel-th loop in the WHERE clause +** implementation described by pWInfo. +*/ +SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( + WhereInfo *pWInfo, /* Complete information about the WHERE clause */ + int iLevel, /* Which level of pWInfo->a[] should be coded */ + Bitmask notReady /* Which tables are currently available */ +){ + int j, k; /* Loop counters */ + int iCur; /* The VDBE cursor for the table */ + int addrNxt; /* Where to jump to continue with the next IN case */ + int omitTable; /* True if we use the index only */ + int bRev; /* True if we need to scan in reverse order */ + WhereLevel *pLevel; /* The where level to be coded */ + WhereLoop *pLoop; /* The WhereLoop object being coded */ + WhereClause *pWC; /* Decomposition of the entire WHERE clause */ + WhereTerm *pTerm; /* A WHERE clause term */ + Parse *pParse; /* Parsing context */ + sqlite3 *db; /* Database connection */ + Vdbe *v; /* The prepared stmt under constructions */ + struct SrcList_item *pTabItem; /* FROM clause term being coded */ + int addrBrk; /* Jump here to break out of the loop */ + int addrCont; /* Jump here to continue with next cycle */ + int iRowidReg = 0; /* Rowid is stored in this register, if not zero */ + int iReleaseReg = 0; /* Temp register to free before returning */ + + pParse = pWInfo->pParse; + v = pParse->pVdbe; + pWC = &pWInfo->sWC; + db = pParse->db; + pLevel = &pWInfo->a[iLevel]; + pLoop = pLevel->pWLoop; + pTabItem = &pWInfo->pTabList->a[pLevel->iFrom]; + iCur = pTabItem->iCursor; + pLevel->notReady = notReady & ~sqlite3WhereGetMask(&pWInfo->sMaskSet, iCur); + bRev = (pWInfo->revMask>>iLevel)&1; + omitTable = (pLoop->wsFlags & WHERE_IDX_ONLY)!=0 + && (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0; + VdbeModuleComment((v, "Begin WHERE-loop%d: %s",iLevel,pTabItem->pTab->zName)); + + /* Create labels for the "break" and "continue" instructions + ** for the current loop. Jump to addrBrk to break out of a loop. + ** Jump to cont to go immediately to the next iteration of the + ** loop. + ** + ** When there is an IN operator, we also have a "addrNxt" label that + ** means to continue with the next IN value combination. When + ** there are no IN operators in the constraints, the "addrNxt" label + ** is the same as "addrBrk". + */ + addrBrk = pLevel->addrBrk = pLevel->addrNxt = sqlite3VdbeMakeLabel(v); + addrCont = pLevel->addrCont = sqlite3VdbeMakeLabel(v); + + /* If this is the right table of a LEFT OUTER JOIN, allocate and + ** initialize a memory cell that records if this table matches any + ** row of the left table of the join. + */ + if( pLevel->iFrom>0 && (pTabItem[0].fg.jointype & JT_LEFT)!=0 ){ + pLevel->iLeftJoin = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Integer, 0, pLevel->iLeftJoin); + VdbeComment((v, "init LEFT JOIN no-match flag")); + } + + /* Special case of a FROM clause subquery implemented as a co-routine */ + if( pTabItem->fg.viaCoroutine ){ + int regYield = pTabItem->regReturn; + sqlite3VdbeAddOp3(v, OP_InitCoroutine, regYield, 0, pTabItem->addrFillSub); + pLevel->p2 = sqlite3VdbeAddOp2(v, OP_Yield, regYield, addrBrk); + VdbeCoverage(v); + VdbeComment((v, "next row of \"%s\"", pTabItem->pTab->zName)); + pLevel->op = OP_Goto; + }else + +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( (pLoop->wsFlags & WHERE_VIRTUALTABLE)!=0 ){ + /* Case 1: The table is a virtual-table. Use the VFilter and VNext + ** to access the data. + */ + int iReg; /* P3 Value for OP_VFilter */ + int addrNotFound; + int nConstraint = pLoop->nLTerm; + int iIn; /* Counter for IN constraints */ + + sqlite3ExprCachePush(pParse); + iReg = sqlite3GetTempRange(pParse, nConstraint+2); + addrNotFound = pLevel->addrBrk; + for(j=0; jaLTerm[j]; + if( NEVER(pTerm==0) ) continue; + if( pTerm->eOperator & WO_IN ){ + codeEqualityTerm(pParse, pTerm, pLevel, j, bRev, iTarget); + addrNotFound = pLevel->addrNxt; + }else{ + Expr *pRight = pTerm->pExpr->pRight; + codeExprOrVector(pParse, pRight, iTarget, 1); + } + } + sqlite3VdbeAddOp2(v, OP_Integer, pLoop->u.vtab.idxNum, iReg); + sqlite3VdbeAddOp2(v, OP_Integer, nConstraint, iReg+1); + sqlite3VdbeAddOp4(v, OP_VFilter, iCur, addrNotFound, iReg, + pLoop->u.vtab.idxStr, + pLoop->u.vtab.needFree ? P4_MPRINTF : P4_STATIC); + VdbeCoverage(v); + pLoop->u.vtab.needFree = 0; + pLevel->p1 = iCur; + pLevel->op = pWInfo->eOnePass ? OP_Noop : OP_VNext; + pLevel->p2 = sqlite3VdbeCurrentAddr(v); + iIn = pLevel->u.in.nIn; + for(j=nConstraint-1; j>=0; j--){ + pTerm = pLoop->aLTerm[j]; + if( j<16 && (pLoop->u.vtab.omitMask>>j)&1 ){ + disableTerm(pLevel, pTerm); + }else if( (pTerm->eOperator & WO_IN)!=0 ){ + Expr *pCompare; /* The comparison operator */ + Expr *pRight; /* RHS of the comparison */ + VdbeOp *pOp; /* Opcode to access the value of the IN constraint */ + + /* Reload the constraint value into reg[iReg+j+2]. The same value + ** was loaded into the same register prior to the OP_VFilter, but + ** the xFilter implementation might have changed the datatype or + ** encoding of the value in the register, so it *must* be reloaded. */ + assert( pLevel->u.in.aInLoop!=0 || db->mallocFailed ); + if( !db->mallocFailed ){ + assert( iIn>0 ); + pOp = sqlite3VdbeGetOp(v, pLevel->u.in.aInLoop[--iIn].addrInTop); + assert( pOp->opcode==OP_Column || pOp->opcode==OP_Rowid ); + assert( pOp->opcode!=OP_Column || pOp->p3==iReg+j+2 ); + assert( pOp->opcode!=OP_Rowid || pOp->p2==iReg+j+2 ); + testcase( pOp->opcode==OP_Rowid ); + sqlite3VdbeAddOp3(v, pOp->opcode, pOp->p1, pOp->p2, pOp->p3); + } + + /* Generate code that will continue to the next row if + ** the IN constraint is not satisfied */ + pCompare = sqlite3PExpr(pParse, TK_EQ, 0, 0, 0); + assert( pCompare!=0 || db->mallocFailed ); + if( pCompare ){ + pCompare->pLeft = pTerm->pExpr->pLeft; + pCompare->pRight = pRight = sqlite3Expr(db, TK_REGISTER, 0); + if( pRight ){ + pRight->iTable = iReg+j+2; + sqlite3ExprIfFalse(pParse, pCompare, pLevel->addrCont, 0); + } + pCompare->pLeft = 0; + sqlite3ExprDelete(db, pCompare); + } + } + } + /* These registers need to be preserved in case there is an IN operator + ** loop. So we could deallocate the registers here (and potentially + ** reuse them later) if (pLoop->wsFlags & WHERE_IN_ABLE)==0. But it seems + ** simpler and safer to simply not reuse the registers. + ** + ** sqlite3ReleaseTempRange(pParse, iReg, nConstraint+2); + */ + sqlite3ExprCachePop(pParse); + }else +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + + if( (pLoop->wsFlags & WHERE_IPK)!=0 + && (pLoop->wsFlags & (WHERE_COLUMN_IN|WHERE_COLUMN_EQ))!=0 + ){ + /* Case 2: We can directly reference a single row using an + ** equality comparison against the ROWID field. Or + ** we reference multiple rows using a "rowid IN (...)" + ** construct. + */ + assert( pLoop->u.btree.nEq==1 ); + pTerm = pLoop->aLTerm[0]; + assert( pTerm!=0 ); + assert( pTerm->pExpr!=0 ); + assert( omitTable==0 ); + testcase( pTerm->wtFlags & TERM_VIRTUAL ); + iReleaseReg = ++pParse->nMem; + iRowidReg = codeEqualityTerm(pParse, pTerm, pLevel, 0, bRev, iReleaseReg); + if( iRowidReg!=iReleaseReg ) sqlite3ReleaseTempReg(pParse, iReleaseReg); + addrNxt = pLevel->addrNxt; + sqlite3VdbeAddOp3(v, OP_SeekRowid, iCur, addrNxt, iRowidReg); + VdbeCoverage(v); + sqlite3ExprCacheAffinityChange(pParse, iRowidReg, 1); + sqlite3ExprCacheStore(pParse, iCur, -1, iRowidReg); + VdbeComment((v, "pk")); + pLevel->op = OP_Noop; + }else if( (pLoop->wsFlags & WHERE_IPK)!=0 + && (pLoop->wsFlags & WHERE_COLUMN_RANGE)!=0 + ){ + /* Case 3: We have an inequality comparison against the ROWID field. + */ + int testOp = OP_Noop; + int start; + int memEndValue = 0; + WhereTerm *pStart, *pEnd; + + assert( omitTable==0 ); + j = 0; + pStart = pEnd = 0; + if( pLoop->wsFlags & WHERE_BTM_LIMIT ) pStart = pLoop->aLTerm[j++]; + if( pLoop->wsFlags & WHERE_TOP_LIMIT ) pEnd = pLoop->aLTerm[j++]; + assert( pStart!=0 || pEnd!=0 ); + if( bRev ){ + pTerm = pStart; + pStart = pEnd; + pEnd = pTerm; + } + codeCursorHint(pTabItem, pWInfo, pLevel, pEnd); + if( pStart ){ + Expr *pX; /* The expression that defines the start bound */ + int r1, rTemp; /* Registers for holding the start boundary */ + int op; /* Cursor seek operation */ + + /* The following constant maps TK_xx codes into corresponding + ** seek opcodes. It depends on a particular ordering of TK_xx + */ + const u8 aMoveOp[] = { + /* TK_GT */ OP_SeekGT, + /* TK_LE */ OP_SeekLE, + /* TK_LT */ OP_SeekLT, + /* TK_GE */ OP_SeekGE + }; + assert( TK_LE==TK_GT+1 ); /* Make sure the ordering.. */ + assert( TK_LT==TK_GT+2 ); /* ... of the TK_xx values... */ + assert( TK_GE==TK_GT+3 ); /* ... is correcct. */ + + assert( (pStart->wtFlags & TERM_VNULL)==0 ); + testcase( pStart->wtFlags & TERM_VIRTUAL ); + pX = pStart->pExpr; + assert( pX!=0 ); + testcase( pStart->leftCursor!=iCur ); /* transitive constraints */ + if( sqlite3ExprIsVector(pX->pRight) ){ + r1 = rTemp = sqlite3GetTempReg(pParse); + codeExprOrVector(pParse, pX->pRight, r1, 1); + op = aMoveOp[(pX->op - TK_GT) | 0x0001]; + }else{ + r1 = sqlite3ExprCodeTemp(pParse, pX->pRight, &rTemp); + disableTerm(pLevel, pStart); + op = aMoveOp[(pX->op - TK_GT)]; + } + sqlite3VdbeAddOp3(v, op, iCur, addrBrk, r1); + VdbeComment((v, "pk")); + VdbeCoverageIf(v, pX->op==TK_GT); + VdbeCoverageIf(v, pX->op==TK_LE); + VdbeCoverageIf(v, pX->op==TK_LT); + VdbeCoverageIf(v, pX->op==TK_GE); + sqlite3ExprCacheAffinityChange(pParse, r1, 1); + sqlite3ReleaseTempReg(pParse, rTemp); + }else{ + sqlite3VdbeAddOp2(v, bRev ? OP_Last : OP_Rewind, iCur, addrBrk); + VdbeCoverageIf(v, bRev==0); + VdbeCoverageIf(v, bRev!=0); + } + if( pEnd ){ + Expr *pX; + pX = pEnd->pExpr; + assert( pX!=0 ); + assert( (pEnd->wtFlags & TERM_VNULL)==0 ); + testcase( pEnd->leftCursor!=iCur ); /* Transitive constraints */ + testcase( pEnd->wtFlags & TERM_VIRTUAL ); + memEndValue = ++pParse->nMem; + codeExprOrVector(pParse, pX->pRight, memEndValue, 1); + if( 0==sqlite3ExprIsVector(pX->pRight) + && (pX->op==TK_LT || pX->op==TK_GT) + ){ + testOp = bRev ? OP_Le : OP_Ge; + }else{ + testOp = bRev ? OP_Lt : OP_Gt; + } + if( 0==sqlite3ExprIsVector(pX->pRight) ){ + disableTerm(pLevel, pEnd); + } + } + start = sqlite3VdbeCurrentAddr(v); + pLevel->op = bRev ? OP_Prev : OP_Next; + pLevel->p1 = iCur; + pLevel->p2 = start; + assert( pLevel->p5==0 ); + if( testOp!=OP_Noop ){ + iRowidReg = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Rowid, iCur, iRowidReg); + sqlite3ExprCacheStore(pParse, iCur, -1, iRowidReg); + sqlite3VdbeAddOp3(v, testOp, memEndValue, addrBrk, iRowidReg); + VdbeCoverageIf(v, testOp==OP_Le); + VdbeCoverageIf(v, testOp==OP_Lt); + VdbeCoverageIf(v, testOp==OP_Ge); + VdbeCoverageIf(v, testOp==OP_Gt); + sqlite3VdbeChangeP5(v, SQLITE_AFF_NUMERIC | SQLITE_JUMPIFNULL); + } + }else if( pLoop->wsFlags & WHERE_INDEXED ){ + /* Case 4: A scan using an index. + ** + ** The WHERE clause may contain zero or more equality + ** terms ("==" or "IN" operators) that refer to the N + ** left-most columns of the index. It may also contain + ** inequality constraints (>, <, >= or <=) on the indexed + ** column that immediately follows the N equalities. Only + ** the right-most column can be an inequality - the rest must + ** use the "==" and "IN" operators. For example, if the + ** index is on (x,y,z), then the following clauses are all + ** optimized: + ** + ** x=5 + ** x=5 AND y=10 + ** x=5 AND y<10 + ** x=5 AND y>5 AND y<10 + ** x=5 AND y=5 AND z<=10 + ** + ** The z<10 term of the following cannot be used, only + ** the x=5 term: + ** + ** x=5 AND z<10 + ** + ** N may be zero if there are inequality constraints. + ** If there are no inequality constraints, then N is at + ** least one. + ** + ** This case is also used when there are no WHERE clause + ** constraints but an index is selected anyway, in order + ** to force the output order to conform to an ORDER BY. + */ + static const u8 aStartOp[] = { + 0, + 0, + OP_Rewind, /* 2: (!start_constraints && startEq && !bRev) */ + OP_Last, /* 3: (!start_constraints && startEq && bRev) */ + OP_SeekGT, /* 4: (start_constraints && !startEq && !bRev) */ + OP_SeekLT, /* 5: (start_constraints && !startEq && bRev) */ + OP_SeekGE, /* 6: (start_constraints && startEq && !bRev) */ + OP_SeekLE /* 7: (start_constraints && startEq && bRev) */ + }; + static const u8 aEndOp[] = { + OP_IdxGE, /* 0: (end_constraints && !bRev && !endEq) */ + OP_IdxGT, /* 1: (end_constraints && !bRev && endEq) */ + OP_IdxLE, /* 2: (end_constraints && bRev && !endEq) */ + OP_IdxLT, /* 3: (end_constraints && bRev && endEq) */ + }; + u16 nEq = pLoop->u.btree.nEq; /* Number of == or IN terms */ + u16 nBtm = pLoop->u.btree.nBtm; /* Length of BTM vector */ + u16 nTop = pLoop->u.btree.nTop; /* Length of TOP vector */ + int regBase; /* Base register holding constraint values */ + WhereTerm *pRangeStart = 0; /* Inequality constraint at range start */ + WhereTerm *pRangeEnd = 0; /* Inequality constraint at range end */ + int startEq; /* True if range start uses ==, >= or <= */ + int endEq; /* True if range end uses ==, >= or <= */ + int start_constraints; /* Start of range is constrained */ + int nConstraint; /* Number of constraint terms */ + Index *pIdx; /* The index we will be using */ + int iIdxCur; /* The VDBE cursor for the index */ + int nExtraReg = 0; /* Number of extra registers needed */ + int op; /* Instruction opcode */ + char *zStartAff; /* Affinity for start of range constraint */ + char *zEndAff = 0; /* Affinity for end of range constraint */ + u8 bSeekPastNull = 0; /* True to seek past initial nulls */ + u8 bStopAtNull = 0; /* Add condition to terminate at NULLs */ + + pIdx = pLoop->u.btree.pIndex; + iIdxCur = pLevel->iIdxCur; + assert( nEq>=pLoop->nSkip ); + + /* If this loop satisfies a sort order (pOrderBy) request that + ** was passed to this function to implement a "SELECT min(x) ..." + ** query, then the caller will only allow the loop to run for + ** a single iteration. This means that the first row returned + ** should not have a NULL value stored in 'x'. If column 'x' is + ** the first one after the nEq equality constraints in the index, + ** this requires some special handling. + */ + assert( pWInfo->pOrderBy==0 + || pWInfo->pOrderBy->nExpr==1 + || (pWInfo->wctrlFlags&WHERE_ORDERBY_MIN)==0 ); + if( (pWInfo->wctrlFlags&WHERE_ORDERBY_MIN)!=0 + && pWInfo->nOBSat>0 + && (pIdx->nKeyCol>nEq) + ){ + assert( pLoop->nSkip==0 ); + bSeekPastNull = 1; + nExtraReg = 1; + } + + /* Find any inequality constraint terms for the start and end + ** of the range. + */ + j = nEq; + if( pLoop->wsFlags & WHERE_BTM_LIMIT ){ + pRangeStart = pLoop->aLTerm[j++]; + nExtraReg = MAX(nExtraReg, pLoop->u.btree.nBtm); + /* Like optimization range constraints always occur in pairs */ + assert( (pRangeStart->wtFlags & TERM_LIKEOPT)==0 || + (pLoop->wsFlags & WHERE_TOP_LIMIT)!=0 ); + } + if( pLoop->wsFlags & WHERE_TOP_LIMIT ){ + pRangeEnd = pLoop->aLTerm[j++]; + nExtraReg = MAX(nExtraReg, pLoop->u.btree.nTop); +#ifndef SQLITE_LIKE_DOESNT_MATCH_BLOBS + if( (pRangeEnd->wtFlags & TERM_LIKEOPT)!=0 ){ + assert( pRangeStart!=0 ); /* LIKE opt constraints */ + assert( pRangeStart->wtFlags & TERM_LIKEOPT ); /* occur in pairs */ + pLevel->iLikeRepCntr = (u32)++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Integer, 1, (int)pLevel->iLikeRepCntr); + VdbeComment((v, "LIKE loop counter")); + pLevel->addrLikeRep = sqlite3VdbeCurrentAddr(v); + /* iLikeRepCntr actually stores 2x the counter register number. The + ** bottom bit indicates whether the search order is ASC or DESC. */ + testcase( bRev ); + testcase( pIdx->aSortOrder[nEq]==SQLITE_SO_DESC ); + assert( (bRev & ~1)==0 ); + pLevel->iLikeRepCntr <<=1; + pLevel->iLikeRepCntr |= bRev ^ (pIdx->aSortOrder[nEq]==SQLITE_SO_DESC); + } +#endif + if( pRangeStart==0 ){ + j = pIdx->aiColumn[nEq]; + if( (j>=0 && pIdx->pTable->aCol[j].notNull==0) || j==XN_EXPR ){ + bSeekPastNull = 1; + } + } + } + assert( pRangeEnd==0 || (pRangeEnd->wtFlags & TERM_VNULL)==0 ); + + /* If we are doing a reverse order scan on an ascending index, or + ** a forward order scan on a descending index, interchange the + ** start and end terms (pRangeStart and pRangeEnd). + */ + if( (nEqnKeyCol && bRev==(pIdx->aSortOrder[nEq]==SQLITE_SO_ASC)) + || (bRev && pIdx->nKeyCol==nEq) + ){ + SWAP(WhereTerm *, pRangeEnd, pRangeStart); + SWAP(u8, bSeekPastNull, bStopAtNull); + SWAP(u8, nBtm, nTop); + } + + /* Generate code to evaluate all constraint terms using == or IN + ** and store the values of those terms in an array of registers + ** starting at regBase. + */ + codeCursorHint(pTabItem, pWInfo, pLevel, pRangeEnd); + regBase = codeAllEqualityTerms(pParse,pLevel,bRev,nExtraReg,&zStartAff); + assert( zStartAff==0 || sqlite3Strlen30(zStartAff)>=nEq ); + if( zStartAff && nTop ){ + zEndAff = sqlite3DbStrDup(db, &zStartAff[nEq]); + } + addrNxt = pLevel->addrNxt; + + testcase( pRangeStart && (pRangeStart->eOperator & WO_LE)!=0 ); + testcase( pRangeStart && (pRangeStart->eOperator & WO_GE)!=0 ); + testcase( pRangeEnd && (pRangeEnd->eOperator & WO_LE)!=0 ); + testcase( pRangeEnd && (pRangeEnd->eOperator & WO_GE)!=0 ); + startEq = !pRangeStart || pRangeStart->eOperator & (WO_LE|WO_GE); + endEq = !pRangeEnd || pRangeEnd->eOperator & (WO_LE|WO_GE); + start_constraints = pRangeStart || nEq>0; + + /* Seek the index cursor to the start of the range. */ + nConstraint = nEq; + if( pRangeStart ){ + Expr *pRight = pRangeStart->pExpr->pRight; + codeExprOrVector(pParse, pRight, regBase+nEq, nBtm); + whereLikeOptimizationStringFixup(v, pLevel, pRangeStart); + if( (pRangeStart->wtFlags & TERM_VNULL)==0 + && sqlite3ExprCanBeNull(pRight) + ){ + sqlite3VdbeAddOp2(v, OP_IsNull, regBase+nEq, addrNxt); + VdbeCoverage(v); + } + if( zStartAff ){ + updateRangeAffinityStr(pRight, nBtm, &zStartAff[nEq]); + } + nConstraint += nBtm; + testcase( pRangeStart->wtFlags & TERM_VIRTUAL ); + if( sqlite3ExprIsVector(pRight)==0 ){ + disableTerm(pLevel, pRangeStart); + }else{ + startEq = 1; + } + bSeekPastNull = 0; + }else if( bSeekPastNull ){ + sqlite3VdbeAddOp2(v, OP_Null, 0, regBase+nEq); + nConstraint++; + startEq = 0; + start_constraints = 1; + } + codeApplyAffinity(pParse, regBase, nConstraint - bSeekPastNull, zStartAff); + if( pLoop->nSkip>0 && nConstraint==pLoop->nSkip ){ + /* The skip-scan logic inside the call to codeAllEqualityConstraints() + ** above has already left the cursor sitting on the correct row, + ** so no further seeking is needed */ + }else{ + op = aStartOp[(start_constraints<<2) + (startEq<<1) + bRev]; + assert( op!=0 ); + sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, nConstraint); + VdbeCoverage(v); + VdbeCoverageIf(v, op==OP_Rewind); testcase( op==OP_Rewind ); + VdbeCoverageIf(v, op==OP_Last); testcase( op==OP_Last ); + VdbeCoverageIf(v, op==OP_SeekGT); testcase( op==OP_SeekGT ); + VdbeCoverageIf(v, op==OP_SeekGE); testcase( op==OP_SeekGE ); + VdbeCoverageIf(v, op==OP_SeekLE); testcase( op==OP_SeekLE ); + VdbeCoverageIf(v, op==OP_SeekLT); testcase( op==OP_SeekLT ); + } + + /* Load the value for the inequality constraint at the end of the + ** range (if any). + */ + nConstraint = nEq; + if( pRangeEnd ){ + Expr *pRight = pRangeEnd->pExpr->pRight; + sqlite3ExprCacheRemove(pParse, regBase+nEq, 1); + codeExprOrVector(pParse, pRight, regBase+nEq, nTop); + whereLikeOptimizationStringFixup(v, pLevel, pRangeEnd); + if( (pRangeEnd->wtFlags & TERM_VNULL)==0 + && sqlite3ExprCanBeNull(pRight) + ){ + sqlite3VdbeAddOp2(v, OP_IsNull, regBase+nEq, addrNxt); + VdbeCoverage(v); + } + if( zEndAff ){ + updateRangeAffinityStr(pRight, nTop, zEndAff); + codeApplyAffinity(pParse, regBase+nEq, nTop, zEndAff); + }else{ + assert( pParse->db->mallocFailed ); + } + nConstraint += nTop; + testcase( pRangeEnd->wtFlags & TERM_VIRTUAL ); + + if( sqlite3ExprIsVector(pRight)==0 ){ + disableTerm(pLevel, pRangeEnd); + }else{ + endEq = 1; + } + }else if( bStopAtNull ){ + sqlite3VdbeAddOp2(v, OP_Null, 0, regBase+nEq); + endEq = 0; + nConstraint++; + } + sqlite3DbFree(db, zStartAff); + sqlite3DbFree(db, zEndAff); + + /* Top of the loop body */ + pLevel->p2 = sqlite3VdbeCurrentAddr(v); + + /* Check if the index cursor is past the end of the range. */ + if( nConstraint ){ + op = aEndOp[bRev*2 + endEq]; + sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, nConstraint); + testcase( op==OP_IdxGT ); VdbeCoverageIf(v, op==OP_IdxGT ); + testcase( op==OP_IdxGE ); VdbeCoverageIf(v, op==OP_IdxGE ); + testcase( op==OP_IdxLT ); VdbeCoverageIf(v, op==OP_IdxLT ); + testcase( op==OP_IdxLE ); VdbeCoverageIf(v, op==OP_IdxLE ); + } + + /* Seek the table cursor, if required */ + if( omitTable ){ + /* pIdx is a covering index. No need to access the main table. */ + }else if( HasRowid(pIdx->pTable) ){ + if( (pWInfo->wctrlFlags & WHERE_SEEK_TABLE)!=0 ){ + iRowidReg = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_IdxRowid, iIdxCur, iRowidReg); + sqlite3ExprCacheStore(pParse, iCur, -1, iRowidReg); + sqlite3VdbeAddOp3(v, OP_NotExists, iCur, 0, iRowidReg); + VdbeCoverage(v); + }else{ + codeDeferredSeek(pWInfo, pIdx, iCur, iIdxCur); + } + }else if( iCur!=iIdxCur ){ + Index *pPk = sqlite3PrimaryKeyIndex(pIdx->pTable); + iRowidReg = sqlite3GetTempRange(pParse, pPk->nKeyCol); + for(j=0; jnKeyCol; j++){ + k = sqlite3ColumnOfIndex(pIdx, pPk->aiColumn[j]); + sqlite3VdbeAddOp3(v, OP_Column, iIdxCur, k, iRowidReg+j); + } + sqlite3VdbeAddOp4Int(v, OP_NotFound, iCur, addrCont, + iRowidReg, pPk->nKeyCol); VdbeCoverage(v); + } + + /* Record the instruction used to terminate the loop. */ + if( pLoop->wsFlags & WHERE_ONEROW ){ + pLevel->op = OP_Noop; + }else if( bRev ){ + pLevel->op = OP_Prev; + }else{ + pLevel->op = OP_Next; + } + pLevel->p1 = iIdxCur; + pLevel->p3 = (pLoop->wsFlags&WHERE_UNQ_WANTED)!=0 ? 1:0; + if( (pLoop->wsFlags & WHERE_CONSTRAINT)==0 ){ + pLevel->p5 = SQLITE_STMTSTATUS_FULLSCAN_STEP; + }else{ + assert( pLevel->p5==0 ); + } + }else + +#ifndef SQLITE_OMIT_OR_OPTIMIZATION + if( pLoop->wsFlags & WHERE_MULTI_OR ){ + /* Case 5: Two or more separately indexed terms connected by OR + ** + ** Example: + ** + ** CREATE TABLE t1(a,b,c,d); + ** CREATE INDEX i1 ON t1(a); + ** CREATE INDEX i2 ON t1(b); + ** CREATE INDEX i3 ON t1(c); + ** + ** SELECT * FROM t1 WHERE a=5 OR b=7 OR (c=11 AND d=13) + ** + ** In the example, there are three indexed terms connected by OR. + ** The top of the loop looks like this: + ** + ** Null 1 # Zero the rowset in reg 1 + ** + ** Then, for each indexed term, the following. The arguments to + ** RowSetTest are such that the rowid of the current row is inserted + ** into the RowSet. If it is already present, control skips the + ** Gosub opcode and jumps straight to the code generated by WhereEnd(). + ** + ** sqlite3WhereBegin() + ** RowSetTest # Insert rowid into rowset + ** Gosub 2 A + ** sqlite3WhereEnd() + ** + ** Following the above, code to terminate the loop. Label A, the target + ** of the Gosub above, jumps to the instruction right after the Goto. + ** + ** Null 1 # Zero the rowset in reg 1 + ** Goto B # The loop is finished. + ** + ** A: # Return data, whatever. + ** + ** Return 2 # Jump back to the Gosub + ** + ** B: + ** + ** Added 2014-05-26: If the table is a WITHOUT ROWID table, then + ** use an ephemeral index instead of a RowSet to record the primary + ** keys of the rows we have already seen. + ** + */ + WhereClause *pOrWc; /* The OR-clause broken out into subterms */ + SrcList *pOrTab; /* Shortened table list or OR-clause generation */ + Index *pCov = 0; /* Potential covering index (or NULL) */ + int iCovCur = pParse->nTab++; /* Cursor used for index scans (if any) */ + + 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; /* Loop counter */ + u16 wctrlFlags; /* Flags for sub-WHERE clause */ + Expr *pAndExpr = 0; /* An ".. AND (...)" expression */ + Table *pTab = pTabItem->pTab; + + pTerm = pLoop->aLTerm[0]; + assert( pTerm!=0 ); + assert( pTerm->eOperator & WO_OR ); + assert( (pTerm->wtFlags & TERM_ORINFO)!=0 ); + pOrWc = &pTerm->u.pOrInfo->wc; + pLevel->op = OP_Return; + pLevel->p1 = regReturn; + + /* Set up a new SrcList in 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(db, + sizeof(*pOrTab)+ nNotReady*sizeof(pOrTab->a[0])); + if( pOrTab==0 ) return notReady; + pOrTab->nAlloc = (u8)(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. Or, create an ephemeral index + ** capable of holding primary keys in the case of a WITHOUT ROWID. + ** + ** Also initialize regReturn to contain the address of the instruction + ** immediately following the OP_Return at the bottom of the loop. This + ** is required in a few obscure LEFT JOIN cases where control jumps + ** over the top of the loop into the body of it. In this case the + ** correct response for the end-of-loop code (the OP_Return) is to + ** fall through to the next instruction, just as an OP_Next does if + ** called on an uninitialized cursor. + */ + if( (pWInfo->wctrlFlags & WHERE_DUPLICATES_OK)==0 ){ + if( HasRowid(pTab) ){ + regRowset = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Null, 0, regRowset); + }else{ + Index *pPk = sqlite3PrimaryKeyIndex(pTab); + regRowset = pParse->nTab++; + sqlite3VdbeAddOp2(v, OP_OpenEphemeral, regRowset, pPk->nKeyCol); + sqlite3VdbeSetP4KeyInfo(pParse, pPk); + } + regRowid = ++pParse->nMem; + } + iRetInit = sqlite3VdbeAddOp2(v, OP_Integer, 0, regReturn); + + /* If the original WHERE clause is z of the form: (x1 OR x2 OR ...) AND y + ** Then for every term xN, evaluate as the subexpression: xN AND z + ** That way, terms in y that are factored into the disjunction will + ** be picked up by the recursive calls to sqlite3WhereBegin() below. + ** + ** Actually, each subexpression is converted to "xN AND w" where w is + ** the "interesting" terms of z - terms that did not originate in the + ** ON or USING clause of a LEFT JOIN, and terms that are usable as + ** indices. + ** + ** This optimization also only applies if the (x1 OR x2 OR ...) term + ** is not contained in the ON clause of a LEFT JOIN. + ** See ticket http://www.sqlite.org/src/info/f2369304e4 + */ + if( pWC->nTerm>1 ){ + int iTerm; + for(iTerm=0; iTermnTerm; iTerm++){ + Expr *pExpr = pWC->a[iTerm].pExpr; + if( &pWC->a[iTerm] == pTerm ) continue; + if( ExprHasProperty(pExpr, EP_FromJoin) ) continue; + testcase( pWC->a[iTerm].wtFlags & TERM_VIRTUAL ); + testcase( pWC->a[iTerm].wtFlags & TERM_CODED ); + if( (pWC->a[iTerm].wtFlags & (TERM_VIRTUAL|TERM_CODED))!=0 ) continue; + if( (pWC->a[iTerm].eOperator & WO_ALL)==0 ) continue; + testcase( pWC->a[iTerm].wtFlags & TERM_ORINFO ); + pExpr = sqlite3ExprDup(db, pExpr, 0); + pAndExpr = sqlite3ExprAnd(db, pAndExpr, pExpr); + } + if( pAndExpr ){ + pAndExpr = sqlite3PExpr(pParse, TK_AND|TKFLG_DONTFOLD, 0, pAndExpr, 0); + } + } + + /* Run a separate WHERE clause for each term of the OR clause. After + ** eliminating duplicates from other WHERE clauses, the action for each + ** sub-WHERE clause is to to invoke the main loop body as a subroutine. + */ + wctrlFlags = WHERE_OR_SUBCLAUSE | (pWInfo->wctrlFlags & WHERE_SEEK_TABLE); + for(ii=0; iinTerm; ii++){ + WhereTerm *pOrTerm = &pOrWc->a[ii]; + if( pOrTerm->leftCursor==iCur || (pOrTerm->eOperator & WO_AND)!=0 ){ + WhereInfo *pSubWInfo; /* Info for single OR-term scan */ + Expr *pOrExpr = pOrTerm->pExpr; /* Current OR clause term */ + int jmp1 = 0; /* Address of jump operation */ + if( pAndExpr && !ExprHasProperty(pOrExpr, EP_FromJoin) ){ + pAndExpr->pLeft = pOrExpr; + pOrExpr = pAndExpr; + } + /* Loop through table entries that match term pOrTerm. */ + WHERETRACE(0xffff, ("Subplan for OR-clause:\n")); + pSubWInfo = sqlite3WhereBegin(pParse, pOrTab, pOrExpr, 0, 0, + wctrlFlags, iCovCur); + assert( pSubWInfo || pParse->nErr || db->mallocFailed ); + if( pSubWInfo ){ + WhereLoop *pSubLoop; + int addrExplain = sqlite3WhereExplainOneScan( + pParse, pOrTab, &pSubWInfo->a[0], iLevel, pLevel->iFrom, 0 + ); + sqlite3WhereAddScanStatus(v, pOrTab, &pSubWInfo->a[0], addrExplain); + + /* This is the sub-WHERE clause body. First skip over + ** duplicate rows from prior sub-WHERE clauses, and record the + ** rowid (or PRIMARY KEY) for the current row so that the same + ** row will be skipped in subsequent sub-WHERE clauses. + */ + if( (pWInfo->wctrlFlags & WHERE_DUPLICATES_OK)==0 ){ + int r; + int iSet = ((ii==pOrWc->nTerm-1)?-1:ii); + if( HasRowid(pTab) ){ + r = sqlite3ExprCodeGetColumn(pParse, pTab, -1, iCur, regRowid, 0); + jmp1 = sqlite3VdbeAddOp4Int(v, OP_RowSetTest, regRowset, 0, + r,iSet); + VdbeCoverage(v); + }else{ + Index *pPk = sqlite3PrimaryKeyIndex(pTab); + int nPk = pPk->nKeyCol; + int iPk; + + /* Read the PK into an array of temp registers. */ + r = sqlite3GetTempRange(pParse, nPk); + for(iPk=0; iPkaiColumn[iPk]; + sqlite3ExprCodeGetColumnToReg(pParse, pTab, iCol, iCur, r+iPk); + } + + /* Check if the temp table already contains this key. If so, + ** the row has already been included in the result set and + ** can be ignored (by jumping past the Gosub below). Otherwise, + ** insert the key into the temp table and proceed with processing + ** the row. + ** + ** Use some of the same optimizations as OP_RowSetTest: If iSet + ** is zero, assume that the key cannot already be present in + ** the temp table. And if iSet is -1, assume that there is no + ** need to insert the key into the temp table, as it will never + ** be tested for. */ + if( iSet ){ + jmp1 = sqlite3VdbeAddOp4Int(v, OP_Found, regRowset, 0, r, nPk); + VdbeCoverage(v); + } + if( iSet>=0 ){ + sqlite3VdbeAddOp3(v, OP_MakeRecord, r, nPk, regRowid); + sqlite3VdbeAddOp3(v, OP_IdxInsert, regRowset, regRowid, 0); + if( iSet ) sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT); + } + + /* Release the array of temp registers */ + sqlite3ReleaseTempRange(pParse, r, nPk); + } + } + + /* Invoke the main loop body as a subroutine */ + sqlite3VdbeAddOp2(v, OP_Gosub, regReturn, iLoopBody); + + /* Jump here (skipping the main loop body subroutine) if the + ** current sub-WHERE row is a duplicate from prior sub-WHEREs. */ + if( jmp1 ) sqlite3VdbeJumpHere(v, jmp1); + + /* 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; + + /* If all of the OR-connected terms are optimized using the same + ** index, and the index is opened using the same cursor number + ** by each call to sqlite3WhereBegin() made by this loop, it may + ** be possible to use that index as a covering index. + ** + ** If the call to sqlite3WhereBegin() above resulted in a scan that + ** uses an index, and this is either the first OR-connected term + ** processed or the index is the same as that used by all previous + ** terms, set pCov to the candidate covering index. Otherwise, set + ** pCov to NULL to indicate that no candidate covering index will + ** be available. + */ + pSubLoop = pSubWInfo->a[0].pWLoop; + assert( (pSubLoop->wsFlags & WHERE_AUTO_INDEX)==0 ); + if( (pSubLoop->wsFlags & WHERE_INDEXED)!=0 + && (ii==0 || pSubLoop->u.btree.pIndex==pCov) + && (HasRowid(pTab) || !IsPrimaryKeyIndex(pSubLoop->u.btree.pIndex)) + ){ + assert( pSubWInfo->a[0].iIdxCur==iCovCur ); + pCov = pSubLoop->u.btree.pIndex; + }else{ + pCov = 0; + } + + /* Finish the loop through table entries that match term pOrTerm. */ + sqlite3WhereEnd(pSubWInfo); + } + } + } + pLevel->u.pCovidx = pCov; + if( pCov ) pLevel->iIdxCur = iCovCur; + if( pAndExpr ){ + pAndExpr->pLeft = 0; + sqlite3ExprDelete(db, pAndExpr); + } + sqlite3VdbeChangeP1(v, iRetInit, sqlite3VdbeCurrentAddr(v)); + sqlite3VdbeGoto(v, pLevel->addrBrk); + sqlite3VdbeResolveLabel(v, iLoopBody); + + if( pWInfo->nLevel>1 ) sqlite3StackFree(db, pOrTab); + if( !untestedTerms ) disableTerm(pLevel, pTerm); + }else +#endif /* SQLITE_OMIT_OR_OPTIMIZATION */ + + { + /* Case 6: There is no usable index. We must do a complete + ** scan of the entire table. + */ + static const u8 aStep[] = { OP_Next, OP_Prev }; + static const u8 aStart[] = { OP_Rewind, OP_Last }; + assert( bRev==0 || bRev==1 ); + if( pTabItem->fg.isRecursive ){ + /* Tables marked isRecursive have only a single row that is stored in + ** a pseudo-cursor. No need to Rewind or Next such cursors. */ + pLevel->op = OP_Noop; + }else{ + codeCursorHint(pTabItem, pWInfo, pLevel, 0); + pLevel->op = aStep[bRev]; + pLevel->p1 = iCur; + pLevel->p2 = 1 + sqlite3VdbeAddOp2(v, aStart[bRev], iCur, addrBrk); + VdbeCoverageIf(v, bRev==0); + VdbeCoverageIf(v, bRev!=0); + pLevel->p5 = SQLITE_STMTSTATUS_FULLSCAN_STEP; + } + } + +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS + pLevel->addrVisit = sqlite3VdbeCurrentAddr(v); +#endif + + /* Insert code to test every subexpression that can be completely + ** computed using the current set of tables. + */ + for(pTerm=pWC->a, j=pWC->nTerm; j>0; j--, pTerm++){ + Expr *pE; + int skipLikeAddr = 0; + testcase( pTerm->wtFlags & TERM_VIRTUAL ); + testcase( pTerm->wtFlags & TERM_CODED ); + if( pTerm->wtFlags & (TERM_VIRTUAL|TERM_CODED) ) continue; + if( (pTerm->prereqAll & pLevel->notReady)!=0 ){ + testcase( pWInfo->untestedTerms==0 + && (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)!=0 ); + pWInfo->untestedTerms = 1; + continue; + } + pE = pTerm->pExpr; + assert( pE!=0 ); + if( pLevel->iLeftJoin && !ExprHasProperty(pE, EP_FromJoin) ){ + continue; + } + if( pTerm->wtFlags & TERM_LIKECOND ){ + /* If the TERM_LIKECOND flag is set, that means that the range search + ** is sufficient to guarantee that the LIKE operator is true, so we + ** can skip the call to the like(A,B) function. But this only works + ** for strings. So do not skip the call to the function on the pass + ** that compares BLOBs. */ +#ifdef SQLITE_LIKE_DOESNT_MATCH_BLOBS + continue; +#else + u32 x = pLevel->iLikeRepCntr; + assert( x>0 ); + skipLikeAddr = sqlite3VdbeAddOp1(v, (x&1)? OP_IfNot : OP_If, (int)(x>>1)); + VdbeCoverage(v); +#endif + } + sqlite3ExprIfFalse(pParse, pE, addrCont, SQLITE_JUMPIFNULL); + if( skipLikeAddr ) sqlite3VdbeJumpHere(v, skipLikeAddr); + pTerm->wtFlags |= TERM_CODED; + } + + /* Insert code to test for implied constraints based on transitivity + ** of the "==" operator. + ** + ** Example: If the WHERE clause contains "t1.a=t2.b" and "t2.b=123" + ** and we are coding the t1 loop and the t2 loop has not yet coded, + ** then we cannot use the "t1.a=t2.b" constraint, but we can code + ** the implied "t1.a=123" constraint. + */ + for(pTerm=pWC->a, j=pWC->nTerm; j>0; j--, pTerm++){ + Expr *pE, sEAlt; + WhereTerm *pAlt; + if( pTerm->wtFlags & (TERM_VIRTUAL|TERM_CODED) ) continue; + if( (pTerm->eOperator & (WO_EQ|WO_IS))==0 ) continue; + if( (pTerm->eOperator & WO_EQUIV)==0 ) continue; + if( pTerm->leftCursor!=iCur ) continue; + if( pLevel->iLeftJoin ) continue; + pE = pTerm->pExpr; + assert( !ExprHasProperty(pE, EP_FromJoin) ); + assert( (pTerm->prereqRight & pLevel->notReady)!=0 ); + pAlt = sqlite3WhereFindTerm(pWC, iCur, pTerm->u.leftColumn, notReady, + WO_EQ|WO_IN|WO_IS, 0); + if( pAlt==0 ) continue; + if( pAlt->wtFlags & (TERM_CODED) ) continue; + testcase( pAlt->eOperator & WO_EQ ); + testcase( pAlt->eOperator & WO_IS ); + testcase( pAlt->eOperator & WO_IN ); + VdbeModuleComment((v, "begin transitive constraint")); + sEAlt = *pAlt->pExpr; + sEAlt.pLeft = pE->pLeft; + sqlite3ExprIfFalse(pParse, &sEAlt, addrCont, SQLITE_JUMPIFNULL); + } + + /* For a LEFT OUTER JOIN, generate code that will record the fact that + ** at least one row of the right table has matched the left table. + */ + if( pLevel->iLeftJoin ){ + pLevel->addrFirst = sqlite3VdbeCurrentAddr(v); + sqlite3VdbeAddOp2(v, OP_Integer, 1, pLevel->iLeftJoin); + VdbeComment((v, "record LEFT JOIN hit")); + sqlite3ExprCacheClear(pParse); + for(pTerm=pWC->a, j=0; jnTerm; j++, pTerm++){ + testcase( pTerm->wtFlags & TERM_VIRTUAL ); + testcase( pTerm->wtFlags & TERM_CODED ); + if( pTerm->wtFlags & (TERM_VIRTUAL|TERM_CODED) ) continue; + if( (pTerm->prereqAll & pLevel->notReady)!=0 ){ + assert( pWInfo->untestedTerms ); + continue; + } + assert( pTerm->pExpr ); + sqlite3ExprIfFalse(pParse, pTerm->pExpr, addrCont, SQLITE_JUMPIFNULL); + pTerm->wtFlags |= TERM_CODED; + } + } + + return pLevel->notReady; +} + +/************** End of wherecode.c *******************************************/ +/************** Begin file whereexpr.c ***************************************/ +/* +** 2015-06-08 +** +** 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 C code that generates VDBE code used to process +** the WHERE clause of SQL statements. +** +** This file was originally part of where.c but was split out to improve +** readability and editabiliity. This file contains utility routines for +** analyzing Expr objects in the WHERE clause. +*/ +/* #include "sqliteInt.h" */ +/* #include "whereInt.h" */ + +/* Forward declarations */ +static void exprAnalyze(SrcList*, WhereClause*, int); + +/* +** Deallocate all memory associated with a WhereOrInfo object. +*/ +static void whereOrInfoDelete(sqlite3 *db, WhereOrInfo *p){ + sqlite3WhereClauseClear(&p->wc); + sqlite3DbFree(db, p); +} + +/* +** Deallocate all memory associated with a WhereAndInfo object. +*/ +static void whereAndInfoDelete(sqlite3 *db, WhereAndInfo *p){ + sqlite3WhereClauseClear(&p->wc); + sqlite3DbFree(db, p); +} + +/* +** Add a single new WhereTerm entry to the WhereClause object pWC. +** The new WhereTerm object is constructed from Expr p and with wtFlags. +** The index in pWC->a[] of the new WhereTerm is returned on success. +** 0 is returned if the new WhereTerm could not be added due to a memory +** allocation error. The memory allocation failure will be recorded in +** the db->mallocFailed flag so that higher-level functions can detect it. +** +** This routine will increase the size of the pWC->a[] array as necessary. +** +** If the wtFlags argument includes TERM_DYNAMIC, then responsibility +** for freeing the expression p is assumed by the WhereClause object pWC. +** This is true even if this routine fails to allocate a new WhereTerm. +** +** WARNING: This routine might reallocate the space used to store +** WhereTerms. All pointers to WhereTerms should be invalidated after +** calling this routine. Such pointers may be reinitialized by referencing +** the pWC->a[] array. +*/ +static int whereClauseInsert(WhereClause *pWC, Expr *p, u16 wtFlags){ + WhereTerm *pTerm; + int idx; + testcase( wtFlags & TERM_VIRTUAL ); + if( pWC->nTerm>=pWC->nSlot ){ + WhereTerm *pOld = pWC->a; + sqlite3 *db = pWC->pWInfo->pParse->db; + pWC->a = sqlite3DbMallocRawNN(db, sizeof(pWC->a[0])*pWC->nSlot*2 ); + if( pWC->a==0 ){ + if( wtFlags & TERM_DYNAMIC ){ + sqlite3ExprDelete(db, p); + } + pWC->a = pOld; + return 0; + } + memcpy(pWC->a, pOld, sizeof(pWC->a[0])*pWC->nTerm); + if( pOld!=pWC->aStatic ){ + sqlite3DbFree(db, pOld); + } + pWC->nSlot = sqlite3DbMallocSize(db, pWC->a)/sizeof(pWC->a[0]); + } + pTerm = &pWC->a[idx = pWC->nTerm++]; + if( p && ExprHasProperty(p, EP_Unlikely) ){ + pTerm->truthProb = sqlite3LogEst(p->iTable) - 270; + }else{ + pTerm->truthProb = 1; + } + pTerm->pExpr = sqlite3ExprSkipCollate(p); + pTerm->wtFlags = wtFlags; + pTerm->pWC = pWC; + pTerm->iParent = -1; + memset(&pTerm->eOperator, 0, + sizeof(WhereTerm) - offsetof(WhereTerm,eOperator)); + return idx; +} + +/* +** Return TRUE if the given operator is one of the operators that is +** allowed for an indexable WHERE clause term. The allowed operators are +** "=", "<", ">", "<=", ">=", "IN", "IS", and "IS NULL" +*/ +static int allowedOp(int op){ + assert( TK_GT>TK_EQ && TK_GTTK_EQ && TK_LTTK_EQ && TK_LE=TK_EQ && op<=TK_GE) || op==TK_ISNULL || op==TK_IS; +} + +/* +** Commute a comparison operator. Expressions of the form "X op Y" +** are converted into "Y op X". +** +** If left/right precedence rules come into play when determining the +** collating sequence, then COLLATE operators are adjusted to ensure +** that the collating sequence does not change. For example: +** "Y collate NOCASE op X" becomes "X op Y" because any collation sequence on +** the left hand side of a comparison overrides any collation sequence +** attached to the right. For the same reason the EP_Collate flag +** is not commuted. +*/ +static void exprCommute(Parse *pParse, Expr *pExpr){ + u16 expRight = (pExpr->pRight->flags & EP_Collate); + u16 expLeft = (pExpr->pLeft->flags & EP_Collate); + assert( allowedOp(pExpr->op) && pExpr->op!=TK_IN ); + if( expRight==expLeft ){ + /* Either X and Y both have COLLATE operator or neither do */ + if( expRight ){ + /* Both X and Y have COLLATE operators. Make sure X is always + ** used by clearing the EP_Collate flag from Y. */ + pExpr->pRight->flags &= ~EP_Collate; + }else if( sqlite3ExprCollSeq(pParse, pExpr->pLeft)!=0 ){ + /* Neither X nor Y have COLLATE operators, but X has a non-default + ** collating sequence. So add the EP_Collate marker on X to cause + ** it to be searched first. */ + pExpr->pLeft->flags |= EP_Collate; + } + } + SWAP(Expr*,pExpr->pRight,pExpr->pLeft); + if( pExpr->op>=TK_GT ){ + assert( TK_LT==TK_GT+2 ); + assert( TK_GE==TK_LE+2 ); + assert( TK_GT>TK_EQ ); + assert( TK_GTop>=TK_GT && pExpr->op<=TK_GE ); + pExpr->op = ((pExpr->op-TK_GT)^2)+TK_GT; + } +} + +/* +** Translate from TK_xx operator to WO_xx bitmask. +*/ +static u16 operatorMask(int op){ + u16 c; + assert( allowedOp(op) ); + if( op==TK_IN ){ + c = WO_IN; + }else if( op==TK_ISNULL ){ + c = WO_ISNULL; + }else if( op==TK_IS ){ + c = WO_IS; + }else{ + assert( (WO_EQ<<(op-TK_EQ)) < 0x7fff ); + c = (u16)(WO_EQ<<(op-TK_EQ)); + } + assert( op!=TK_ISNULL || c==WO_ISNULL ); + assert( op!=TK_IN || c==WO_IN ); + assert( op!=TK_EQ || c==WO_EQ ); + assert( op!=TK_LT || c==WO_LT ); + assert( op!=TK_LE || c==WO_LE ); + assert( op!=TK_GT || c==WO_GT ); + assert( op!=TK_GE || c==WO_GE ); + assert( op!=TK_IS || c==WO_IS ); + return c; +} + + +#ifndef SQLITE_OMIT_LIKE_OPTIMIZATION +/* +** Check to see if the given expression is a LIKE or GLOB operator that +** can be optimized using inequality constraints. Return TRUE if it is +** so and false if not. +** +** In order for the operator to be optimizible, the RHS must be a string +** literal that does not begin with a wildcard. The LHS must be a column +** that may only be NULL, a string, or a BLOB, never a number. (This means +** that virtual tables cannot participate in the LIKE optimization.) The +** collating sequence for the column on the LHS must be appropriate for +** the operator. +*/ +static int isLikeOrGlob( + Parse *pParse, /* Parsing and code generating context */ + Expr *pExpr, /* Test this expression */ + 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 = 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[] */ + int cnt; /* Number of non-wildcard prefix characters */ + char wc[3]; /* Wildcard characters */ + sqlite3 *db = pParse->db; /* Database connection */ + sqlite3_value *pVal = 0; + int op; /* Opcode of pRight */ + int rc; /* Result code to return */ + + if( !sqlite3IsLikeFunction(db, pExpr, pnoCase, wc) ){ + return 0; + } +#ifdef SQLITE_EBCDIC + if( *pnoCase ) return 0; +#endif + pList = pExpr->x.pList; + pLeft = pList->a[1].pExpr; + if( pLeft->op!=TK_COLUMN + || sqlite3ExprAffinity(pLeft)!=SQLITE_AFF_TEXT + || IsVirtual(pLeft->pTab) /* Value might be numeric */ + ){ + /* 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 */ + + pRight = sqlite3ExprSkipCollate(pList->a[0].pExpr); + op = pRight->op; + if( op==TK_VARIABLE ){ + Vdbe *pReprepare = pParse->pReprepare; + int iCol = pRight->iColumn; + pVal = sqlite3VdbeGetBoundValue(pReprepare, iCol, SQLITE_AFF_BLOB); + if( pVal && sqlite3_value_type(pVal)==SQLITE_TEXT ){ + z = (char *)sqlite3_value_text(pVal); + } + sqlite3VdbeSetVarmask(pParse->pVdbe, iCol); + 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 && 255!=(u8)z[cnt-1] ){ + Expr *pPrefix; + *pisComplete = c==wc[0] && z[cnt+1]==0; + 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 work around 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; + } + } + + rc = (z!=0); + sqlite3ValueFree(pVal); + return rc; +} +#endif /* SQLITE_OMIT_LIKE_OPTIMIZATION */ + + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* +** Check to see if the given expression is of the form +** +** column OP expr +** +** where OP is one of MATCH, GLOB, LIKE or REGEXP and "column" is a +** column of a virtual table. +** +** If it is then return TRUE. If not, return FALSE. +*/ +static int isMatchOfColumn( + Expr *pExpr, /* Test this expression */ + unsigned char *peOp2 /* OUT: 0 for MATCH, or else an op2 value */ +){ + static const struct Op2 { + const char *zOp; + unsigned char eOp2; + } aOp[] = { + { "match", SQLITE_INDEX_CONSTRAINT_MATCH }, + { "glob", SQLITE_INDEX_CONSTRAINT_GLOB }, + { "like", SQLITE_INDEX_CONSTRAINT_LIKE }, + { "regexp", SQLITE_INDEX_CONSTRAINT_REGEXP } + }; + ExprList *pList; + Expr *pCol; /* Column reference */ + int i; + + if( pExpr->op!=TK_FUNCTION ){ + return 0; + } + pList = pExpr->x.pList; + if( pList==0 || pList->nExpr!=2 ){ + return 0; + } + pCol = pList->a[1].pExpr; + if( pCol->op!=TK_COLUMN || !IsVirtual(pCol->pTab) ){ + return 0; + } + for(i=0; iu.zToken, aOp[i].zOp)==0 ){ + *peOp2 = aOp[i].eOp2; + return 1; + } + } + return 0; +} +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + +/* +** If the pBase expression originated in the ON or USING clause of +** a join, then transfer the appropriate markings over to derived. +*/ +static void transferJoinMarkings(Expr *pDerived, Expr *pBase){ + if( pDerived ){ + pDerived->flags |= pBase->flags & EP_FromJoin; + pDerived->iRightJoinTable = pBase->iRightJoinTable; + } +} + +/* +** Mark term iChild as being a child of term iParent +*/ +static void markTermAsChild(WhereClause *pWC, int iChild, int iParent){ + pWC->a[iChild].iParent = iParent; + pWC->a[iChild].truthProb = pWC->a[iParent].truthProb; + pWC->a[iParent].nChild++; +} + +/* +** Return the N-th AND-connected subterm of pTerm. Or if pTerm is not +** a conjunction, then return just pTerm when N==0. If N is exceeds +** the number of available subterms, return NULL. +*/ +static WhereTerm *whereNthSubterm(WhereTerm *pTerm, int N){ + if( pTerm->eOperator!=WO_AND ){ + return N==0 ? pTerm : 0; + } + if( Nu.pAndInfo->wc.nTerm ){ + return &pTerm->u.pAndInfo->wc.a[N]; + } + return 0; +} + +/* +** Subterms pOne and pTwo are contained within WHERE clause pWC. The +** two subterms are in disjunction - they are OR-ed together. +** +** If these two terms are both of the form: "A op B" with the same +** A and B values but different operators and if the operators are +** compatible (if one is = and the other is <, for example) then +** add a new virtual AND term to pWC that is the combination of the +** two. +** +** Some examples: +** +** x x<=y +** x=y OR x=y --> x=y +** x<=y OR x x<=y +** +** The following is NOT generated: +** +** xy --> x!=y +*/ +static void whereCombineDisjuncts( + SrcList *pSrc, /* the FROM clause */ + WhereClause *pWC, /* The complete WHERE clause */ + WhereTerm *pOne, /* First disjunct */ + WhereTerm *pTwo /* Second disjunct */ +){ + u16 eOp = pOne->eOperator | pTwo->eOperator; + sqlite3 *db; /* Database connection (for malloc) */ + Expr *pNew; /* New virtual expression */ + int op; /* Operator for the combined expression */ + int idxNew; /* Index in pWC of the next virtual term */ + + if( (pOne->eOperator & (WO_EQ|WO_LT|WO_LE|WO_GT|WO_GE))==0 ) return; + if( (pTwo->eOperator & (WO_EQ|WO_LT|WO_LE|WO_GT|WO_GE))==0 ) return; + if( (eOp & (WO_EQ|WO_LT|WO_LE))!=eOp + && (eOp & (WO_EQ|WO_GT|WO_GE))!=eOp ) return; + assert( pOne->pExpr->pLeft!=0 && pOne->pExpr->pRight!=0 ); + assert( pTwo->pExpr->pLeft!=0 && pTwo->pExpr->pRight!=0 ); + if( sqlite3ExprCompare(pOne->pExpr->pLeft, pTwo->pExpr->pLeft, -1) ) return; + if( sqlite3ExprCompare(pOne->pExpr->pRight, pTwo->pExpr->pRight, -1) )return; + /* If we reach this point, it means the two subterms can be combined */ + if( (eOp & (eOp-1))!=0 ){ + if( eOp & (WO_LT|WO_LE) ){ + eOp = WO_LE; + }else{ + assert( eOp & (WO_GT|WO_GE) ); + eOp = WO_GE; + } + } + db = pWC->pWInfo->pParse->db; + pNew = sqlite3ExprDup(db, pOne->pExpr, 0); + if( pNew==0 ) return; + for(op=TK_EQ; eOp!=(WO_EQ<<(op-TK_EQ)); op++){ assert( opop = op; + idxNew = whereClauseInsert(pWC, pNew, TERM_VIRTUAL|TERM_DYNAMIC); + exprAnalyze(pSrc, pWC, idxNew); +} + +#if !defined(SQLITE_OMIT_OR_OPTIMIZATION) && !defined(SQLITE_OMIT_SUBQUERY) +/* +** Analyze a term that consists of two or more OR-connected +** subterms. So in: +** +** ... WHERE (a=5) AND (b=7 OR c=9 OR d=13) AND (d=13) +** ^^^^^^^^^^^^^^^^^^^^ +** +** This routine analyzes terms such as the middle term in the above example. +** A WhereOrTerm object is computed and attached to the term under +** analysis, regardless of the outcome of the analysis. Hence: +** +** WhereTerm.wtFlags |= TERM_ORINFO +** WhereTerm.u.pOrInfo = a dynamically allocated WhereOrTerm object +** +** The term being analyzed must have two or more of OR-connected subterms. +** A single subterm might be a set of AND-connected sub-subterms. +** Examples of terms under analysis: +** +** (A) t1.x=t2.y OR t1.x=t2.z OR t1.y=15 OR t1.z=t3.a+5 +** (B) x=expr1 OR expr2=x OR x=expr3 +** (C) t1.x=t2.y OR (t1.x=t2.z AND t1.y=15) +** (D) x=expr1 OR (y>11 AND y<22 AND z LIKE '*hello*') +** (E) (p.a=1 AND q.b=2 AND r.c=3) OR (p.x=4 AND q.y=5 AND r.z=6) +** (F) x>A OR (x=A AND y>=B) +** +** CASE 1: +** +** If all subterms are of the form T.C=expr for some single column of C and +** a single table T (as shown in example B above) then create a new virtual +** term that is an equivalent IN expression. In other words, if the term +** being analyzed is: +** +** x = expr1 OR expr2 = x OR x = expr3 +** +** then create a new virtual term like this: +** +** x IN (expr1,expr2,expr3) +** +** CASE 2: +** +** If there are exactly two disjuncts and one side has x>A and the other side +** has x=A (for the same x and A) then add a new virtual conjunct term to the +** WHERE clause of the form "x>=A". Example: +** +** x>A OR (x=A AND y>B) adds: x>=A +** +** The added conjunct can sometimes be helpful in query planning. +** +** CASE 3: +** +** If all subterms are indexable by a single table T, then set +** +** WhereTerm.eOperator = WO_OR +** WhereTerm.u.pOrInfo->indexable |= the cursor number for table T +** +** A subterm is "indexable" if it is of the form +** "T.C " where C is any column of table T and +** is one of "=", "<", "<=", ">", ">=", "IS NULL", or "IN". +** A subterm is also indexable if it is an AND of two or more +** subsubterms at least one of which is indexable. Indexable AND +** subterms have their eOperator set to WO_AND and they have +** u.pAndInfo set to a dynamically allocated WhereAndTerm object. +** +** From another point of view, "indexable" means that the subterm could +** potentially be used with an index if an appropriate index exists. +** This analysis does not consider whether or not the index exists; that +** is decided elsewhere. This analysis only looks at whether subterms +** appropriate for indexing exist. +** +** All examples A through E above satisfy case 3. But if a term +** also satisfies case 1 (such as B) we know that the optimizer will +** always prefer case 1, so in that case we pretend that case 3 is not +** satisfied. +** +** It might be the case that multiple tables are indexable. For example, +** (E) above is indexable on tables P, Q, and R. +** +** Terms that satisfy case 3 are candidates for lookup by using +** separate indices to find rowids for each subterm and composing +** the union of all rowids using a RowSet object. This is similar +** to "bitmap indices" in other database engines. +** +** OTHERWISE: +** +** If none of cases 1, 2, or 3 apply, then leave the eOperator set to +** zero. This term is not useful for search. +*/ +static void exprAnalyzeOrTerm( + SrcList *pSrc, /* the FROM clause */ + WhereClause *pWC, /* the complete WHERE clause */ + int idxTerm /* Index of the OR-term to be analyzed */ +){ + WhereInfo *pWInfo = pWC->pWInfo; /* WHERE clause processing context */ + Parse *pParse = pWInfo->pParse; /* Parser context */ + sqlite3 *db = pParse->db; /* Database connection */ + WhereTerm *pTerm = &pWC->a[idxTerm]; /* The term to be analyzed */ + Expr *pExpr = pTerm->pExpr; /* The expression of the term */ + int i; /* Loop counters */ + WhereClause *pOrWc; /* Breakup of pTerm into subterms */ + WhereTerm *pOrTerm; /* A Sub-term within the pOrWc */ + WhereOrInfo *pOrInfo; /* Additional information associated with pTerm */ + Bitmask chngToIN; /* Tables that might satisfy case 1 */ + Bitmask indexable; /* Tables that are indexable, satisfying case 2 */ + + /* + ** Break the OR clause into its separate subterms. The subterms are + ** stored in a WhereClause structure containing within the WhereOrInfo + ** object that is attached to the original OR clause term. + */ + assert( (pTerm->wtFlags & (TERM_DYNAMIC|TERM_ORINFO|TERM_ANDINFO))==0 ); + assert( pExpr->op==TK_OR ); + pTerm->u.pOrInfo = pOrInfo = sqlite3DbMallocZero(db, sizeof(*pOrInfo)); + if( pOrInfo==0 ) return; + pTerm->wtFlags |= TERM_ORINFO; + pOrWc = &pOrInfo->wc; + memset(pOrWc->aStatic, 0, sizeof(pOrWc->aStatic)); + sqlite3WhereClauseInit(pOrWc, pWInfo); + sqlite3WhereSplit(pOrWc, pExpr, TK_OR); + sqlite3WhereExprAnalyze(pSrc, pOrWc); + if( db->mallocFailed ) return; + assert( pOrWc->nTerm>=2 ); + + /* + ** Compute the set of tables that might satisfy cases 1 or 3. + */ + indexable = ~(Bitmask)0; + chngToIN = ~(Bitmask)0; + for(i=pOrWc->nTerm-1, pOrTerm=pOrWc->a; i>=0 && indexable; i--, pOrTerm++){ + if( (pOrTerm->eOperator & WO_SINGLE)==0 ){ + WhereAndInfo *pAndInfo; + assert( (pOrTerm->wtFlags & (TERM_ANDINFO|TERM_ORINFO))==0 ); + chngToIN = 0; + pAndInfo = sqlite3DbMallocRawNN(db, sizeof(*pAndInfo)); + if( pAndInfo ){ + WhereClause *pAndWC; + WhereTerm *pAndTerm; + int j; + Bitmask b = 0; + pOrTerm->u.pAndInfo = pAndInfo; + pOrTerm->wtFlags |= TERM_ANDINFO; + pOrTerm->eOperator = WO_AND; + pAndWC = &pAndInfo->wc; + memset(pAndWC->aStatic, 0, sizeof(pAndWC->aStatic)); + sqlite3WhereClauseInit(pAndWC, pWC->pWInfo); + sqlite3WhereSplit(pAndWC, pOrTerm->pExpr, TK_AND); + sqlite3WhereExprAnalyze(pSrc, pAndWC); + pAndWC->pOuter = pWC; + if( !db->mallocFailed ){ + for(j=0, pAndTerm=pAndWC->a; jnTerm; j++, pAndTerm++){ + assert( pAndTerm->pExpr ); + if( allowedOp(pAndTerm->pExpr->op) + || pAndTerm->eOperator==WO_MATCH + ){ + b |= sqlite3WhereGetMask(&pWInfo->sMaskSet, pAndTerm->leftCursor); + } + } + } + indexable &= b; + } + }else if( pOrTerm->wtFlags & TERM_COPIED ){ + /* Skip this term for now. We revisit it when we process the + ** corresponding TERM_VIRTUAL term */ + }else{ + Bitmask b; + b = sqlite3WhereGetMask(&pWInfo->sMaskSet, pOrTerm->leftCursor); + if( pOrTerm->wtFlags & TERM_VIRTUAL ){ + WhereTerm *pOther = &pOrWc->a[pOrTerm->iParent]; + b |= sqlite3WhereGetMask(&pWInfo->sMaskSet, pOther->leftCursor); + } + indexable &= b; + if( (pOrTerm->eOperator & WO_EQ)==0 ){ + chngToIN = 0; + }else{ + chngToIN &= b; + } + } + } + + /* + ** Record the set of tables that satisfy case 3. The set might be + ** empty. + */ + pOrInfo->indexable = indexable; + pTerm->eOperator = indexable==0 ? 0 : WO_OR; + + /* For a two-way OR, attempt to implementation case 2. + */ + if( indexable && pOrWc->nTerm==2 ){ + int iOne = 0; + WhereTerm *pOne; + while( (pOne = whereNthSubterm(&pOrWc->a[0],iOne++))!=0 ){ + int iTwo = 0; + WhereTerm *pTwo; + while( (pTwo = whereNthSubterm(&pOrWc->a[1],iTwo++))!=0 ){ + whereCombineDisjuncts(pSrc, pWC, pOne, pTwo); + } + } + } + + /* + ** chngToIN holds a set of tables that *might* satisfy case 1. But + ** we have to do some additional checking to see if case 1 really + ** is satisfied. + ** + ** chngToIN will hold either 0, 1, or 2 bits. The 0-bit case means + ** that there is no possibility of transforming the OR clause into an + ** IN operator because one or more terms in the OR clause contain + ** something other than == on a column in the single table. The 1-bit + ** case means that every term of the OR clause is of the form + ** "table.column=expr" for some single table. The one bit that is set + ** will correspond to the common table. We still need to check to make + ** sure the same column is used on all terms. The 2-bit case is when + ** the all terms are of the form "table1.column=table2.column". It + ** might be possible to form an IN operator with either table1.column + ** or table2.column as the LHS if either is common to every term of + ** the OR clause. + ** + ** Note that terms of the form "table.column1=table.column2" (the + ** same table on both sizes of the ==) cannot be optimized. + */ + if( chngToIN ){ + int okToChngToIN = 0; /* True if the conversion to IN is valid */ + int iColumn = -1; /* Column index on lhs of IN operator */ + int iCursor = -1; /* Table cursor common to all terms */ + int j = 0; /* Loop counter */ + + /* Search for a table and column that appears on one side or the + ** other of the == operator in every subterm. That table and column + ** will be recorded in iCursor and iColumn. There might not be any + ** such table and column. Set okToChngToIN if an appropriate table + ** and column is found but leave okToChngToIN false if not found. + */ + for(j=0; j<2 && !okToChngToIN; j++){ + pOrTerm = pOrWc->a; + for(i=pOrWc->nTerm-1; i>=0; i--, pOrTerm++){ + assert( pOrTerm->eOperator & WO_EQ ); + pOrTerm->wtFlags &= ~TERM_OR_OK; + if( pOrTerm->leftCursor==iCursor ){ + /* This is the 2-bit case and we are on the second iteration and + ** current term is from the first iteration. So skip this term. */ + assert( j==1 ); + continue; + } + if( (chngToIN & sqlite3WhereGetMask(&pWInfo->sMaskSet, + pOrTerm->leftCursor))==0 ){ + /* This term must be of the form t1.a==t2.b where t2 is in the + ** chngToIN set but t1 is not. This term will be either preceded + ** or follwed by an inverted copy (t2.b==t1.a). Skip this term + ** and use its inversion. */ + testcase( pOrTerm->wtFlags & TERM_COPIED ); + testcase( pOrTerm->wtFlags & TERM_VIRTUAL ); + assert( pOrTerm->wtFlags & (TERM_COPIED|TERM_VIRTUAL) ); + continue; + } + iColumn = pOrTerm->u.leftColumn; + iCursor = pOrTerm->leftCursor; + break; + } + if( i<0 ){ + /* No candidate table+column was found. This can only occur + ** on the second iteration */ + assert( j==1 ); + assert( IsPowerOfTwo(chngToIN) ); + assert( chngToIN==sqlite3WhereGetMask(&pWInfo->sMaskSet, iCursor) ); + break; + } + testcase( j==1 ); + + /* We have found a candidate table and column. Check to see if that + ** table and column is common to every term in the OR clause */ + okToChngToIN = 1; + for(; i>=0 && okToChngToIN; i--, pOrTerm++){ + assert( pOrTerm->eOperator & WO_EQ ); + if( pOrTerm->leftCursor!=iCursor ){ + pOrTerm->wtFlags &= ~TERM_OR_OK; + }else if( pOrTerm->u.leftColumn!=iColumn ){ + okToChngToIN = 0; + }else{ + int affLeft, affRight; + /* If the right-hand side is also a column, then the affinities + ** of both right and left sides must be such that no type + ** conversions are required on the right. (Ticket #2249) + */ + affRight = sqlite3ExprAffinity(pOrTerm->pExpr->pRight); + affLeft = sqlite3ExprAffinity(pOrTerm->pExpr->pLeft); + if( affRight!=0 && affRight!=affLeft ){ + okToChngToIN = 0; + }else{ + pOrTerm->wtFlags |= TERM_OR_OK; + } + } + } + } + + /* At this point, okToChngToIN is true if original pTerm satisfies + ** case 1. In that case, construct a new virtual term that is + ** pTerm converted into an IN operator. + */ + if( okToChngToIN ){ + Expr *pDup; /* A transient duplicate expression */ + ExprList *pList = 0; /* The RHS of the IN operator */ + Expr *pLeft = 0; /* The LHS of the IN operator */ + Expr *pNew; /* The complete IN operator */ + + for(i=pOrWc->nTerm-1, pOrTerm=pOrWc->a; i>=0; i--, pOrTerm++){ + if( (pOrTerm->wtFlags & TERM_OR_OK)==0 ) continue; + assert( pOrTerm->eOperator & WO_EQ ); + assert( pOrTerm->leftCursor==iCursor ); + assert( pOrTerm->u.leftColumn==iColumn ); + pDup = sqlite3ExprDup(db, pOrTerm->pExpr->pRight, 0); + pList = sqlite3ExprListAppend(pWInfo->pParse, pList, pDup); + pLeft = pOrTerm->pExpr->pLeft; + } + assert( pLeft!=0 ); + pDup = sqlite3ExprDup(db, pLeft, 0); + pNew = sqlite3PExpr(pParse, TK_IN, pDup, 0, 0); + if( pNew ){ + int idxNew; + transferJoinMarkings(pNew, pExpr); + assert( !ExprHasProperty(pNew, EP_xIsSelect) ); + pNew->x.pList = pList; + idxNew = whereClauseInsert(pWC, pNew, TERM_VIRTUAL|TERM_DYNAMIC); + testcase( idxNew==0 ); + exprAnalyze(pSrc, pWC, idxNew); + pTerm = &pWC->a[idxTerm]; + markTermAsChild(pWC, idxNew, idxTerm); + }else{ + sqlite3ExprListDelete(db, pList); + } + pTerm->eOperator = WO_NOOP; /* case 1 trumps case 3 */ + } + } +} +#endif /* !SQLITE_OMIT_OR_OPTIMIZATION && !SQLITE_OMIT_SUBQUERY */ + +/* +** We already know that pExpr is a binary operator where both operands are +** column references. This routine checks to see if pExpr is an equivalence +** relation: +** 1. The SQLITE_Transitive optimization must be enabled +** 2. Must be either an == or an IS operator +** 3. Not originating in the ON clause of an OUTER JOIN +** 4. The affinities of A and B must be compatible +** 5a. Both operands use the same collating sequence OR +** 5b. The overall collating sequence is BINARY +** If this routine returns TRUE, that means that the RHS can be substituted +** for the LHS anyplace else in the WHERE clause where the LHS column occurs. +** This is an optimization. No harm comes from returning 0. But if 1 is +** returned when it should not be, then incorrect answers might result. +*/ +static int termIsEquivalence(Parse *pParse, Expr *pExpr){ + char aff1, aff2; + CollSeq *pColl; + const char *zColl1, *zColl2; + if( !OptimizationEnabled(pParse->db, SQLITE_Transitive) ) return 0; + if( pExpr->op!=TK_EQ && pExpr->op!=TK_IS ) return 0; + if( ExprHasProperty(pExpr, EP_FromJoin) ) return 0; + aff1 = sqlite3ExprAffinity(pExpr->pLeft); + aff2 = sqlite3ExprAffinity(pExpr->pRight); + if( aff1!=aff2 + && (!sqlite3IsNumericAffinity(aff1) || !sqlite3IsNumericAffinity(aff2)) + ){ + return 0; + } + pColl = sqlite3BinaryCompareCollSeq(pParse, pExpr->pLeft, pExpr->pRight); + if( pColl==0 || sqlite3StrICmp(pColl->zName, "BINARY")==0 ) return 1; + pColl = sqlite3ExprCollSeq(pParse, pExpr->pLeft); + zColl1 = pColl ? pColl->zName : 0; + pColl = sqlite3ExprCollSeq(pParse, pExpr->pRight); + zColl2 = pColl ? pColl->zName : 0; + return sqlite3_stricmp(zColl1, zColl2)==0; +} + +/* +** Recursively walk the expressions of a SELECT statement and generate +** a bitmask indicating which tables are used in that expression +** tree. +*/ +static Bitmask exprSelectUsage(WhereMaskSet *pMaskSet, Select *pS){ + Bitmask mask = 0; + while( pS ){ + SrcList *pSrc = pS->pSrc; + mask |= sqlite3WhereExprListUsage(pMaskSet, pS->pEList); + mask |= sqlite3WhereExprListUsage(pMaskSet, pS->pGroupBy); + mask |= sqlite3WhereExprListUsage(pMaskSet, pS->pOrderBy); + mask |= sqlite3WhereExprUsage(pMaskSet, pS->pWhere); + mask |= sqlite3WhereExprUsage(pMaskSet, pS->pHaving); + if( ALWAYS(pSrc!=0) ){ + int i; + for(i=0; inSrc; i++){ + mask |= exprSelectUsage(pMaskSet, pSrc->a[i].pSelect); + mask |= sqlite3WhereExprUsage(pMaskSet, pSrc->a[i].pOn); + } + } + pS = pS->pPrior; + } + return mask; +} + +/* +** Expression pExpr is one operand of a comparison operator that might +** be useful for indexing. This routine checks to see if pExpr appears +** in any index. Return TRUE (1) if pExpr is an indexed term and return +** FALSE (0) if not. If TRUE is returned, also set *piCur to the cursor +** number of the table that is indexed and *piColumn to the column number +** of the column that is indexed, or XN_EXPR (-2) if an expression is being +** indexed. +** +** If pExpr is a TK_COLUMN column reference, then this routine always returns +** true even if that particular column is not indexed, because the column +** might be added to an automatic index later. +*/ +static int exprMightBeIndexed( + SrcList *pFrom, /* The FROM clause */ + int op, /* The specific comparison operator */ + Bitmask mPrereq, /* Bitmask of FROM clause terms referenced by pExpr */ + Expr *pExpr, /* An operand of a comparison operator */ + int *piCur, /* Write the referenced table cursor number here */ + int *piColumn /* Write the referenced table column number here */ +){ + Index *pIdx; + int i; + int iCur; + + /* If this expression is a vector to the left or right of a + ** inequality constraint (>, <, >= or <=), perform the processing + ** on the first element of the vector. */ + assert( TK_GT+1==TK_LE && TK_GT+2==TK_LT && TK_GT+3==TK_GE ); + assert( TK_ISop==TK_VECTOR && (op>=TK_GT && ALWAYS(op<=TK_GE)) ){ + pExpr = pExpr->x.pList->a[0].pExpr; + } + + if( pExpr->op==TK_COLUMN ){ + *piCur = pExpr->iTable; + *piColumn = pExpr->iColumn; + return 1; + } + if( mPrereq==0 ) return 0; /* No table references */ + if( (mPrereq&(mPrereq-1))!=0 ) return 0; /* Refs more than one table */ + for(i=0; mPrereq>1; i++, mPrereq>>=1){} + iCur = pFrom->a[i].iCursor; + for(pIdx=pFrom->a[i].pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + if( pIdx->aColExpr==0 ) continue; + for(i=0; inKeyCol; i++){ + if( pIdx->aiColumn[i]!=XN_EXPR ) continue; + if( sqlite3ExprCompare(pExpr, pIdx->aColExpr->a[i].pExpr, iCur)==0 ){ + *piCur = iCur; + *piColumn = XN_EXPR; + return 1; + } + } + } + return 0; +} + +/* +** The input to this routine is an WhereTerm structure with only the +** "pExpr" field filled in. The job of this routine is to analyze the +** subexpression and populate all the other fields of the WhereTerm +** structure. +** +** If the expression is of the form " X" it gets commuted +** to the standard form of "X ". +** +** If the expression is of the form "X Y" where both X and Y are +** columns, then the original expression is unchanged and a new virtual +** term of the form "Y X" is added to the WHERE clause and +** analyzed separately. The original term is marked with TERM_COPIED +** and the new term is marked with TERM_DYNAMIC (because it's pExpr +** needs to be freed with the WhereClause) and TERM_VIRTUAL (because it +** is a commuted copy of a prior term.) The original term has nChild=1 +** and the copy has idxParent set to the index of the original term. +*/ +static void exprAnalyze( + SrcList *pSrc, /* the FROM clause */ + WhereClause *pWC, /* the WHERE clause */ + int idxTerm /* Index of the term to be analyzed */ +){ + WhereInfo *pWInfo = pWC->pWInfo; /* WHERE clause processing context */ + WhereTerm *pTerm; /* The term to be analyzed */ + WhereMaskSet *pMaskSet; /* Set of table index masks */ + Expr *pExpr; /* The expression to be analyzed */ + Bitmask prereqLeft; /* Prerequesites of the pExpr->pLeft */ + Bitmask prereqAll; /* Prerequesites of pExpr */ + Bitmask extraRight = 0; /* Extra dependencies on LEFT JOIN */ + Expr *pStr1 = 0; /* RHS of LIKE/GLOB operator */ + int isComplete = 0; /* RHS of LIKE/GLOB ends with wildcard */ + int noCase = 0; /* uppercase equivalent to lowercase */ + int op; /* Top-level operator. pExpr->op */ + Parse *pParse = pWInfo->pParse; /* Parsing context */ + sqlite3 *db = pParse->db; /* Database connection */ + unsigned char eOp2; /* op2 value for LIKE/REGEXP/GLOB */ + + if( db->mallocFailed ){ + return; + } + pTerm = &pWC->a[idxTerm]; + pMaskSet = &pWInfo->sMaskSet; + pExpr = pTerm->pExpr; + assert( pExpr->op!=TK_AS && pExpr->op!=TK_COLLATE ); + prereqLeft = sqlite3WhereExprUsage(pMaskSet, pExpr->pLeft); + op = pExpr->op; + if( op==TK_IN ){ + assert( pExpr->pRight==0 ); + if( sqlite3ExprCheckIN(pParse, pExpr) ) return; + if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + pTerm->prereqRight = exprSelectUsage(pMaskSet, pExpr->x.pSelect); + }else{ + pTerm->prereqRight = sqlite3WhereExprListUsage(pMaskSet, pExpr->x.pList); + } + }else if( op==TK_ISNULL ){ + pTerm->prereqRight = 0; + }else{ + pTerm->prereqRight = sqlite3WhereExprUsage(pMaskSet, pExpr->pRight); + } + prereqAll = sqlite3WhereExprUsage(pMaskSet, pExpr); + if( ExprHasProperty(pExpr, EP_FromJoin) ){ + Bitmask x = sqlite3WhereGetMask(pMaskSet, pExpr->iRightJoinTable); + prereqAll |= x; + extraRight = x-1; /* ON clause terms may not be used with an index + ** on left table of a LEFT JOIN. Ticket #3015 */ + } + pTerm->prereqAll = prereqAll; + pTerm->leftCursor = -1; + pTerm->iParent = -1; + pTerm->eOperator = 0; + if( allowedOp(op) ){ + int iCur, iColumn; + Expr *pLeft = sqlite3ExprSkipCollate(pExpr->pLeft); + Expr *pRight = sqlite3ExprSkipCollate(pExpr->pRight); + u16 opMask = (pTerm->prereqRight & prereqLeft)==0 ? WO_ALL : WO_EQUIV; + + if( pTerm->iField>0 ){ + assert( op==TK_IN ); + assert( pLeft->op==TK_VECTOR ); + pLeft = pLeft->x.pList->a[pTerm->iField-1].pExpr; + } + + if( exprMightBeIndexed(pSrc, op, prereqLeft, pLeft, &iCur, &iColumn) ){ + pTerm->leftCursor = iCur; + pTerm->u.leftColumn = iColumn; + pTerm->eOperator = operatorMask(op) & opMask; + } + if( op==TK_IS ) pTerm->wtFlags |= TERM_IS; + if( pRight + && exprMightBeIndexed(pSrc, op, pTerm->prereqRight, pRight, &iCur,&iColumn) + ){ + WhereTerm *pNew; + Expr *pDup; + u16 eExtraOp = 0; /* Extra bits for pNew->eOperator */ + assert( pTerm->iField==0 ); + if( pTerm->leftCursor>=0 ){ + int idxNew; + pDup = sqlite3ExprDup(db, pExpr, 0); + if( db->mallocFailed ){ + sqlite3ExprDelete(db, pDup); + return; + } + idxNew = whereClauseInsert(pWC, pDup, TERM_VIRTUAL|TERM_DYNAMIC); + if( idxNew==0 ) return; + pNew = &pWC->a[idxNew]; + markTermAsChild(pWC, idxNew, idxTerm); + if( op==TK_IS ) pNew->wtFlags |= TERM_IS; + pTerm = &pWC->a[idxTerm]; + pTerm->wtFlags |= TERM_COPIED; + + if( termIsEquivalence(pParse, pDup) ){ + pTerm->eOperator |= WO_EQUIV; + eExtraOp = WO_EQUIV; + } + }else{ + pDup = pExpr; + pNew = pTerm; + } + exprCommute(pParse, pDup); + pNew->leftCursor = iCur; + pNew->u.leftColumn = iColumn; + testcase( (prereqLeft | extraRight) != prereqLeft ); + pNew->prereqRight = prereqLeft | extraRight; + pNew->prereqAll = prereqAll; + pNew->eOperator = (operatorMask(pDup->op) + eExtraOp) & opMask; + } + } + +#ifndef SQLITE_OMIT_BETWEEN_OPTIMIZATION + /* If a term is the BETWEEN operator, create two new virtual terms + ** that define the range that the BETWEEN implements. For example: + ** + ** a BETWEEN b AND c + ** + ** is converted into: + ** + ** (a BETWEEN b AND c) AND (a>=b) AND (a<=c) + ** + ** The two new terms are added onto the end of the WhereClause object. + ** The new terms are "dynamic" and are children of the original BETWEEN + ** term. That means that if the BETWEEN term is coded, the children are + ** skipped. Or, if the children are satisfied by an index, the original + ** BETWEEN term is skipped. + */ + else if( pExpr->op==TK_BETWEEN && pWC->op==TK_AND ){ + ExprList *pList = pExpr->x.pList; + int i; + static const u8 ops[] = {TK_GE, TK_LE}; + assert( pList!=0 ); + assert( pList->nExpr==2 ); + for(i=0; i<2; i++){ + Expr *pNewExpr; + int idxNew; + pNewExpr = sqlite3PExpr(pParse, ops[i], + sqlite3ExprDup(db, pExpr->pLeft, 0), + sqlite3ExprDup(db, pList->a[i].pExpr, 0), 0); + transferJoinMarkings(pNewExpr, pExpr); + idxNew = whereClauseInsert(pWC, pNewExpr, TERM_VIRTUAL|TERM_DYNAMIC); + testcase( idxNew==0 ); + exprAnalyze(pSrc, pWC, idxNew); + pTerm = &pWC->a[idxTerm]; + markTermAsChild(pWC, idxNew, idxTerm); + } + } +#endif /* SQLITE_OMIT_BETWEEN_OPTIMIZATION */ + +#if !defined(SQLITE_OMIT_OR_OPTIMIZATION) && !defined(SQLITE_OMIT_SUBQUERY) + /* Analyze a term that is composed of two or more subterms connected by + ** an OR operator. + */ + else if( pExpr->op==TK_OR ){ + assert( pWC->op==TK_AND ); + exprAnalyzeOrTerm(pSrc, pWC, idxTerm); + pTerm = &pWC->a[idxTerm]; + } +#endif /* SQLITE_OMIT_OR_OPTIMIZATION */ + +#ifndef SQLITE_OMIT_LIKE_OPTIMIZATION + /* Add constraints to reduce the search space on a LIKE or GLOB + ** operator. + ** + ** A like pattern of the form "x LIKE 'aBc%'" is changed into constraints + ** + ** x>='ABC' AND x<'abd' AND x LIKE 'aBc%' + ** + ** The last character of the prefix "abc" is incremented to form the + ** termination condition "abd". If case is not significant (the default + ** for LIKE) then the lower-bound is made all uppercase and the upper- + ** bound is made all lowercase so that the bounds also work when comparing + ** BLOBs. + */ + 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; + const char *zCollSeqName; /* Name of collating sequence */ + const u16 wtFlags = TERM_LIKEOPT | TERM_VIRTUAL | TERM_DYNAMIC; + + pLeft = pExpr->x.pList->a[1].pExpr; + pStr2 = sqlite3ExprDup(db, pStr1, 0); + + /* Convert the lower bound to upper-case and the upper bound to + ** lower-case (upper-case is less than lower-case in ASCII) so that + ** the range constraints also work for BLOBs + */ + if( noCase && !pParse->db->mallocFailed ){ + int i; + char c; + pTerm->wtFlags |= TERM_LIKE; + for(i=0; (c = pStr1->u.zToken[i])!=0; i++){ + pStr1->u.zToken[i] = sqlite3Toupper(c); + pStr2->u.zToken[i] = sqlite3Tolower(c); + } + } + + if( !db->mallocFailed ){ + u8 c, *pC; /* Last character before the first wildcard */ + 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 + ** wildcard. But if we increment '@', that will push it into the + ** alphabetic range where case conversions will mess up the + ** inequality. To avoid this, make sure to also run the full + ** LIKE on all candidate expressions by clearing the isComplete flag + */ + if( c=='A'-1 ) isComplete = 0; + c = sqlite3UpperToLower[c]; + } + *pC = c + 1; + } + zCollSeqName = noCase ? "NOCASE" : "BINARY"; + pNewExpr1 = sqlite3ExprDup(db, pLeft, 0); + pNewExpr1 = sqlite3PExpr(pParse, TK_GE, + sqlite3ExprAddCollateString(pParse,pNewExpr1,zCollSeqName), + pStr1, 0); + transferJoinMarkings(pNewExpr1, pExpr); + idxNew1 = whereClauseInsert(pWC, pNewExpr1, wtFlags); + testcase( idxNew1==0 ); + exprAnalyze(pSrc, pWC, idxNew1); + pNewExpr2 = sqlite3ExprDup(db, pLeft, 0); + pNewExpr2 = sqlite3PExpr(pParse, TK_LT, + sqlite3ExprAddCollateString(pParse,pNewExpr2,zCollSeqName), + pStr2, 0); + transferJoinMarkings(pNewExpr2, pExpr); + idxNew2 = whereClauseInsert(pWC, pNewExpr2, wtFlags); + testcase( idxNew2==0 ); + exprAnalyze(pSrc, pWC, idxNew2); + pTerm = &pWC->a[idxTerm]; + if( isComplete ){ + markTermAsChild(pWC, idxNew1, idxTerm); + markTermAsChild(pWC, idxNew2, idxTerm); + } + } +#endif /* SQLITE_OMIT_LIKE_OPTIMIZATION */ + +#ifndef SQLITE_OMIT_VIRTUALTABLE + /* Add a WO_MATCH auxiliary term to the constraint set if the + ** current expression is of the form: column MATCH expr. + ** This information is used by the xBestIndex methods of + ** virtual tables. The native query optimizer does not attempt + ** to do anything with MATCH functions. + */ + if( pWC->op==TK_AND && isMatchOfColumn(pExpr, &eOp2) ){ + int idxNew; + Expr *pRight, *pLeft; + WhereTerm *pNewTerm; + Bitmask prereqColumn, prereqExpr; + + pRight = pExpr->x.pList->a[0].pExpr; + pLeft = pExpr->x.pList->a[1].pExpr; + prereqExpr = sqlite3WhereExprUsage(pMaskSet, pRight); + prereqColumn = sqlite3WhereExprUsage(pMaskSet, pLeft); + if( (prereqExpr & prereqColumn)==0 ){ + Expr *pNewExpr; + pNewExpr = sqlite3PExpr(pParse, TK_MATCH, + 0, sqlite3ExprDup(db, pRight, 0), 0); + idxNew = whereClauseInsert(pWC, pNewExpr, TERM_VIRTUAL|TERM_DYNAMIC); + testcase( idxNew==0 ); + pNewTerm = &pWC->a[idxNew]; + pNewTerm->prereqRight = prereqExpr; + pNewTerm->leftCursor = pLeft->iTable; + pNewTerm->u.leftColumn = pLeft->iColumn; + pNewTerm->eOperator = WO_MATCH; + pNewTerm->eMatchOp = eOp2; + markTermAsChild(pWC, idxNew, idxTerm); + pTerm = &pWC->a[idxTerm]; + pTerm->wtFlags |= TERM_COPIED; + pNewTerm->prereqAll = pTerm->prereqAll; + } + } +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + + /* If there is a vector == or IS term - e.g. "(a, b) == (?, ?)" - create + ** new terms for each component comparison - "a = ?" and "b = ?". The + ** new terms completely replace the original vector comparison, which is + ** no longer used. + ** + ** This is only required if at least one side of the comparison operation + ** is not a sub-select. */ + if( pWC->op==TK_AND + && (pExpr->op==TK_EQ || pExpr->op==TK_IS) + && sqlite3ExprIsVector(pExpr->pLeft) + && ( (pExpr->pLeft->flags & EP_xIsSelect)==0 + || (pExpr->pRight->flags & EP_xIsSelect)==0 + )){ + int nLeft = sqlite3ExprVectorSize(pExpr->pLeft); + int i; + assert( nLeft==sqlite3ExprVectorSize(pExpr->pRight) ); + for(i=0; ipLeft, i); + Expr *pRight = sqlite3ExprForVectorField(pParse, pExpr->pRight, i); + + pNew = sqlite3PExpr(pParse, pExpr->op, pLeft, pRight, 0); + transferJoinMarkings(pNew, pExpr); + idxNew = whereClauseInsert(pWC, pNew, TERM_DYNAMIC); + exprAnalyze(pSrc, pWC, idxNew); + } + pTerm = &pWC->a[idxTerm]; + pTerm->wtFlags = TERM_CODED|TERM_VIRTUAL; /* Disable the original */ + pTerm->eOperator = 0; + } + + /* If there is a vector IN term - e.g. "(a, b) IN (SELECT ...)" - create + ** a virtual term for each vector component. The expression object + ** used by each such virtual term is pExpr (the full vector IN(...) + ** expression). The WhereTerm.iField variable identifies the index within + ** the vector on the LHS that the virtual term represents. + ** + ** This only works if the RHS is a simple SELECT, not a compound + */ + if( pWC->op==TK_AND && pExpr->op==TK_IN && pTerm->iField==0 + && pExpr->pLeft->op==TK_VECTOR + && pExpr->x.pSelect->pPrior==0 + ){ + int i; + for(i=0; ipLeft); i++){ + int idxNew; + idxNew = whereClauseInsert(pWC, pExpr, TERM_VIRTUAL); + pWC->a[idxNew].iField = i+1; + exprAnalyze(pSrc, pWC, idxNew); + markTermAsChild(pWC, idxNew, idxTerm); + } + } + +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 + /* When sqlite_stat3 histogram data is available an operator of the + ** form "x IS NOT NULL" can sometimes be evaluated more efficiently + ** as "x>NULL" if x is not an INTEGER PRIMARY KEY. So construct a + ** virtual term of that form. + ** + ** Note that the virtual term must be tagged with TERM_VNULL. + */ + if( pExpr->op==TK_NOTNULL + && pExpr->pLeft->op==TK_COLUMN + && pExpr->pLeft->iColumn>=0 + && OptimizationEnabled(db, SQLITE_Stat34) + ){ + Expr *pNewExpr; + Expr *pLeft = pExpr->pLeft; + int idxNew; + WhereTerm *pNewTerm; + + pNewExpr = sqlite3PExpr(pParse, TK_GT, + sqlite3ExprDup(db, pLeft, 0), + sqlite3ExprAlloc(db, TK_NULL, 0, 0), 0); + + idxNew = whereClauseInsert(pWC, pNewExpr, + TERM_VIRTUAL|TERM_DYNAMIC|TERM_VNULL); + if( idxNew ){ + pNewTerm = &pWC->a[idxNew]; + pNewTerm->prereqRight = 0; + pNewTerm->leftCursor = pLeft->iTable; + pNewTerm->u.leftColumn = pLeft->iColumn; + pNewTerm->eOperator = WO_GT; + markTermAsChild(pWC, idxNew, idxTerm); + pTerm = &pWC->a[idxTerm]; + pTerm->wtFlags |= TERM_COPIED; + pNewTerm->prereqAll = pTerm->prereqAll; + } + } +#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */ + + /* Prevent ON clause terms of a LEFT JOIN from being used to drive + ** an index for tables to the left of the join. + */ + testcase( pTerm!=&pWC->a[idxTerm] ); + pTerm = &pWC->a[idxTerm]; + pTerm->prereqRight |= extraRight; +} + +/*************************************************************************** +** Routines with file scope above. Interface to the rest of the where.c +** subsystem follows. +***************************************************************************/ + +/* +** This routine identifies subexpressions in the WHERE clause where +** each subexpression is separated by the AND operator or some other +** operator specified in the op parameter. The WhereClause structure +** is filled with pointers to subexpressions. For example: +** +** WHERE a=='hello' AND coalesce(b,11)<10 AND (c+12!=d OR c==22) +** \________/ \_______________/ \________________/ +** slot[0] slot[1] slot[2] +** +** The original WHERE clause in pExpr is unaltered. All this routine +** does is make slot[] entries point to substructure within pExpr. +** +** In the previous sentence and in the diagram, "slot[]" refers to +** the WhereClause.a[] array. The slot[] array grows as needed to contain +** all terms of the WHERE clause. +*/ +SQLITE_PRIVATE void sqlite3WhereSplit(WhereClause *pWC, Expr *pExpr, u8 op){ + Expr *pE2 = sqlite3ExprSkipCollate(pExpr); + pWC->op = op; + if( pE2==0 ) return; + if( pE2->op!=op ){ + whereClauseInsert(pWC, pExpr, 0); + }else{ + sqlite3WhereSplit(pWC, pE2->pLeft, op); + sqlite3WhereSplit(pWC, pE2->pRight, op); + } +} + +/* +** Initialize a preallocated WhereClause structure. +*/ +SQLITE_PRIVATE void sqlite3WhereClauseInit( + WhereClause *pWC, /* The WhereClause to be initialized */ + WhereInfo *pWInfo /* The WHERE processing context */ +){ + pWC->pWInfo = pWInfo; + pWC->pOuter = 0; + pWC->nTerm = 0; + pWC->nSlot = ArraySize(pWC->aStatic); + pWC->a = pWC->aStatic; +} + +/* +** Deallocate a WhereClause structure. The WhereClause structure +** itself is not freed. This routine is the inverse of +** sqlite3WhereClauseInit(). +*/ +SQLITE_PRIVATE void sqlite3WhereClauseClear(WhereClause *pWC){ + int i; + WhereTerm *a; + sqlite3 *db = pWC->pWInfo->pParse->db; + for(i=pWC->nTerm-1, a=pWC->a; i>=0; i--, a++){ + if( a->wtFlags & TERM_DYNAMIC ){ + sqlite3ExprDelete(db, a->pExpr); + } + if( a->wtFlags & TERM_ORINFO ){ + whereOrInfoDelete(db, a->u.pOrInfo); + }else if( a->wtFlags & TERM_ANDINFO ){ + whereAndInfoDelete(db, a->u.pAndInfo); + } + } + if( pWC->a!=pWC->aStatic ){ + sqlite3DbFree(db, pWC->a); + } +} + + +/* +** These routines walk (recursively) an expression tree and generate +** a bitmask indicating which tables are used in that expression +** tree. +*/ +SQLITE_PRIVATE Bitmask sqlite3WhereExprUsage(WhereMaskSet *pMaskSet, Expr *p){ + Bitmask mask; + if( p==0 ) return 0; + if( p->op==TK_COLUMN ){ + mask = sqlite3WhereGetMask(pMaskSet, p->iTable); + return mask; + } + assert( !ExprHasProperty(p, EP_TokenOnly) ); + mask = p->pRight ? sqlite3WhereExprUsage(pMaskSet, p->pRight) : 0; + if( p->pLeft ) mask |= sqlite3WhereExprUsage(pMaskSet, p->pLeft); + if( ExprHasProperty(p, EP_xIsSelect) ){ + mask |= exprSelectUsage(pMaskSet, p->x.pSelect); + }else if( p->x.pList ){ + mask |= sqlite3WhereExprListUsage(pMaskSet, p->x.pList); + } + return mask; +} +SQLITE_PRIVATE Bitmask sqlite3WhereExprListUsage(WhereMaskSet *pMaskSet, ExprList *pList){ + int i; + Bitmask mask = 0; + if( pList ){ + for(i=0; inExpr; i++){ + mask |= sqlite3WhereExprUsage(pMaskSet, pList->a[i].pExpr); + } + } + return mask; +} + + +/* +** Call exprAnalyze on all terms in a WHERE clause. +** +** Note that exprAnalyze() might add new virtual terms onto the +** end of the WHERE clause. We do not want to analyze these new +** virtual terms, so start analyzing at the end and work forward +** so that the added virtual terms are never processed. +*/ +SQLITE_PRIVATE void sqlite3WhereExprAnalyze( + SrcList *pTabList, /* the FROM clause */ + WhereClause *pWC /* the WHERE clause to be analyzed */ +){ + int i; + for(i=pWC->nTerm-1; i>=0; i--){ + exprAnalyze(pTabList, pWC, i); + } +} + +/* +** For table-valued-functions, transform the function arguments into +** new WHERE clause terms. +** +** Each function argument translates into an equality constraint against +** a HIDDEN column in the table. +*/ +SQLITE_PRIVATE void sqlite3WhereTabFuncArgs( + Parse *pParse, /* Parsing context */ + struct SrcList_item *pItem, /* The FROM clause term to process */ + WhereClause *pWC /* Xfer function arguments to here */ +){ + Table *pTab; + int j, k; + ExprList *pArgs; + Expr *pColRef; + Expr *pTerm; + if( pItem->fg.isTabFunc==0 ) return; + pTab = pItem->pTab; + assert( pTab!=0 ); + pArgs = pItem->u1.pFuncArg; + if( pArgs==0 ) return; + for(j=k=0; jnExpr; j++){ + while( knCol && (pTab->aCol[k].colFlags & COLFLAG_HIDDEN)==0 ){k++;} + if( k>=pTab->nCol ){ + sqlite3ErrorMsg(pParse, "too many arguments on %s() - max %d", + pTab->zName, j); + return; + } + pColRef = sqlite3ExprAlloc(pParse->db, TK_COLUMN, 0, 0); + if( pColRef==0 ) return; + pColRef->iTable = pItem->iCursor; + pColRef->iColumn = k++; + pColRef->pTab = pTab; + pTerm = sqlite3PExpr(pParse, TK_EQ, pColRef, + sqlite3ExprDup(pParse->db, pArgs->a[j].pExpr, 0), 0); + whereClauseInsert(pWC, pTerm, TERM_DYNAMIC); + } +} + +/************** End of whereexpr.c *******************************************/ +/************** Begin file where.c *******************************************/ +/* +** 2001 September 15 +** +** 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 C code that generates VDBE code used to process +** the WHERE clause of SQL statements. This module is responsible for +** generating the code that loops through a table looking for applicable +** 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". +*/ +/* #include "sqliteInt.h" */ +/* #include "whereInt.h" */ + +/* Forward declaration of methods */ +static int whereLoopResize(sqlite3*, WhereLoop*, int); + +/* Test variable that can be set to enable WHERE tracing */ +#if defined(SQLITE_TEST) || defined(SQLITE_DEBUG) +/***/ int sqlite3WhereTrace = 0; +#endif + + +/* +** Return the estimated number of output rows from a WHERE clause +*/ +SQLITE_PRIVATE LogEst sqlite3WhereOutputRowCount(WhereInfo *pWInfo){ + return pWInfo->nRowOut; +} + +/* +** Return one of the WHERE_DISTINCT_xxxxx values to indicate how this +** WHERE clause returns outputs for DISTINCT processing. +*/ +SQLITE_PRIVATE int sqlite3WhereIsDistinct(WhereInfo *pWInfo){ + return pWInfo->eDistinct; +} + +/* +** Return TRUE if the WHERE clause returns rows in ORDER BY order. +** Return FALSE if the output needs to be sorted. +*/ +SQLITE_PRIVATE int sqlite3WhereIsOrdered(WhereInfo *pWInfo){ + return pWInfo->nOBSat; +} + +/* +** Return TRUE if the innermost loop of the WHERE clause implementation +** returns rows in ORDER BY order for complete run of the inner loop. +** +** Across multiple iterations of outer loops, the output rows need not be +** sorted. As long as rows are sorted for just the innermost loop, this +** routine can return TRUE. +*/ +SQLITE_PRIVATE int sqlite3WhereOrderedInnerLoop(WhereInfo *pWInfo){ + return pWInfo->bOrderedInnerLoop; +} + +/* +** Return the VDBE address or label to jump to in order to continue +** immediately with the next row of a WHERE clause. +*/ +SQLITE_PRIVATE int sqlite3WhereContinueLabel(WhereInfo *pWInfo){ + assert( pWInfo->iContinue!=0 ); + return pWInfo->iContinue; +} + +/* +** Return the VDBE address or label to jump to in order to break +** out of a WHERE loop. +*/ +SQLITE_PRIVATE int sqlite3WhereBreakLabel(WhereInfo *pWInfo){ + return pWInfo->iBreak; +} + +/* +** Return ONEPASS_OFF (0) if an UPDATE or DELETE statement is unable to +** operate directly on the rowis returned by a WHERE clause. Return +** ONEPASS_SINGLE (1) if the statement can operation directly because only +** a single row is to be changed. Return ONEPASS_MULTI (2) if the one-pass +** optimization can be used on multiple +** +** If the ONEPASS optimization is used (if this routine returns true) +** then also write the indices of open cursors used by ONEPASS +** into aiCur[0] and aiCur[1]. iaCur[0] gets the cursor of the data +** table and iaCur[1] gets the cursor used by an auxiliary index. +** Either value may be -1, indicating that cursor is not used. +** Any cursors returned will have been opened for writing. +** +** aiCur[0] and aiCur[1] both get -1 if the where-clause logic is +** unable to use the ONEPASS optimization. +*/ +SQLITE_PRIVATE int sqlite3WhereOkOnePass(WhereInfo *pWInfo, int *aiCur){ + memcpy(aiCur, pWInfo->aiCurOnePass, sizeof(int)*2); +#ifdef WHERETRACE_ENABLED + if( sqlite3WhereTrace && pWInfo->eOnePass!=ONEPASS_OFF ){ + sqlite3DebugPrintf("%s cursors: %d %d\n", + pWInfo->eOnePass==ONEPASS_SINGLE ? "ONEPASS_SINGLE" : "ONEPASS_MULTI", + aiCur[0], aiCur[1]); + } +#endif + return pWInfo->eOnePass; +} + +/* +** Move the content of pSrc into pDest +*/ +static void whereOrMove(WhereOrSet *pDest, WhereOrSet *pSrc){ + pDest->n = pSrc->n; + memcpy(pDest->a, pSrc->a, pDest->n*sizeof(pDest->a[0])); +} + +/* +** Try to insert a new prerequisite/cost entry into the WhereOrSet pSet. +** +** The new entry might overwrite an existing entry, or it might be +** appended, or it might be discarded. Do whatever is the right thing +** so that pSet keeps the N_OR_COST best entries seen so far. +*/ +static int whereOrInsert( + WhereOrSet *pSet, /* The WhereOrSet to be updated */ + Bitmask prereq, /* Prerequisites of the new entry */ + LogEst rRun, /* Run-cost of the new entry */ + LogEst nOut /* Number of outputs for the new entry */ +){ + u16 i; + WhereOrCost *p; + for(i=pSet->n, p=pSet->a; i>0; i--, p++){ + if( rRun<=p->rRun && (prereq & p->prereq)==prereq ){ + goto whereOrInsert_done; + } + if( p->rRun<=rRun && (p->prereq & prereq)==p->prereq ){ + return 0; + } + } + if( pSet->na[pSet->n++]; + p->nOut = nOut; + }else{ + p = pSet->a; + for(i=1; in; i++){ + if( p->rRun>pSet->a[i].rRun ) p = pSet->a + i; + } + if( p->rRun<=rRun ) return 0; + } +whereOrInsert_done: + p->prereq = prereq; + p->rRun = rRun; + if( p->nOut>nOut ) p->nOut = nOut; + return 1; +} + +/* +** Return the bitmask for the given cursor number. Return 0 if +** iCursor is not in the set. +*/ +SQLITE_PRIVATE Bitmask sqlite3WhereGetMask(WhereMaskSet *pMaskSet, int iCursor){ + int i; + assert( pMaskSet->n<=(int)sizeof(Bitmask)*8 ); + for(i=0; in; i++){ + if( pMaskSet->ix[i]==iCursor ){ + return MASKBIT(i); + } + } + return 0; +} + +/* +** Create a new mask for cursor iCursor. +** +** There is one cursor per table in the FROM clause. The number of +** tables in the FROM clause is limited by a test early in the +** sqlite3WhereBegin() routine. So we know that the pMaskSet->ix[] +** array will never overflow. +*/ +static void createMask(WhereMaskSet *pMaskSet, int iCursor){ + assert( pMaskSet->n < ArraySize(pMaskSet->ix) ); + pMaskSet->ix[pMaskSet->n++] = iCursor; +} + +/* +** Advance to the next WhereTerm that matches according to the criteria +** established when the pScan object was initialized by whereScanInit(). +** Return NULL if there are no more matching WhereTerms. +*/ +static WhereTerm *whereScanNext(WhereScan *pScan){ + int iCur; /* The cursor on the LHS of the term */ + i16 iColumn; /* The column on the LHS of the term. -1 for IPK */ + Expr *pX; /* An expression being tested */ + WhereClause *pWC; /* Shorthand for pScan->pWC */ + WhereTerm *pTerm; /* The term being tested */ + int k = pScan->k; /* Where to start scanning */ + + while( pScan->iEquiv<=pScan->nEquiv ){ + iCur = pScan->aiCur[pScan->iEquiv-1]; + iColumn = pScan->aiColumn[pScan->iEquiv-1]; + if( iColumn==XN_EXPR && pScan->pIdxExpr==0 ) return 0; + while( (pWC = pScan->pWC)!=0 ){ + for(pTerm=pWC->a+k; knTerm; k++, pTerm++){ + if( pTerm->leftCursor==iCur + && pTerm->u.leftColumn==iColumn + && (iColumn!=XN_EXPR + || sqlite3ExprCompare(pTerm->pExpr->pLeft,pScan->pIdxExpr,iCur)==0) + && (pScan->iEquiv<=1 || !ExprHasProperty(pTerm->pExpr, EP_FromJoin)) + ){ + if( (pTerm->eOperator & WO_EQUIV)!=0 + && pScan->nEquivaiCur) + && (pX = sqlite3ExprSkipCollate(pTerm->pExpr->pRight))->op==TK_COLUMN + ){ + int j; + for(j=0; jnEquiv; j++){ + if( pScan->aiCur[j]==pX->iTable + && pScan->aiColumn[j]==pX->iColumn ){ + break; + } + } + if( j==pScan->nEquiv ){ + pScan->aiCur[j] = pX->iTable; + pScan->aiColumn[j] = pX->iColumn; + pScan->nEquiv++; + } + } + if( (pTerm->eOperator & pScan->opMask)!=0 ){ + /* Verify the affinity and collating sequence match */ + if( pScan->zCollName && (pTerm->eOperator & WO_ISNULL)==0 ){ + CollSeq *pColl; + Parse *pParse = pWC->pWInfo->pParse; + pX = pTerm->pExpr; + if( !sqlite3IndexAffinityOk(pX, pScan->idxaff) ){ + continue; + } + assert(pX->pLeft); + pColl = sqlite3BinaryCompareCollSeq(pParse, + pX->pLeft, pX->pRight); + if( pColl==0 ) pColl = pParse->db->pDfltColl; + if( sqlite3StrICmp(pColl->zName, pScan->zCollName) ){ + continue; + } + } + if( (pTerm->eOperator & (WO_EQ|WO_IS))!=0 + && (pX = pTerm->pExpr->pRight)->op==TK_COLUMN + && pX->iTable==pScan->aiCur[0] + && pX->iColumn==pScan->aiColumn[0] + ){ + testcase( pTerm->eOperator & WO_IS ); + continue; + } + pScan->k = k+1; + return pTerm; + } + } + } + pScan->pWC = pScan->pWC->pOuter; + k = 0; + } + pScan->pWC = pScan->pOrigWC; + k = 0; + pScan->iEquiv++; + } + return 0; +} + +/* +** Initialize a WHERE clause scanner object. Return a pointer to the +** first match. Return NULL if there are no matches. +** +** The scanner will be searching the WHERE clause pWC. It will look +** for terms of the form "X " where X is column iColumn of table +** iCur. Or if pIdx!=0 then X is column iColumn of index pIdx. pIdx +** must be one of the indexes of table iCur. +** +** The must be one of the operators described by opMask. +** +** If the search is for X and the WHERE clause contains terms of the +** form X=Y then this routine might also return terms of the form +** "Y ". The number of levels of transitivity is limited, +** but is enough to handle most commonly occurring SQL statements. +** +** If X is not the INTEGER PRIMARY KEY then X must be compatible with +** index pIdx. +*/ +static WhereTerm *whereScanInit( + WhereScan *pScan, /* The WhereScan object being initialized */ + WhereClause *pWC, /* The WHERE clause to be scanned */ + int iCur, /* Cursor to scan for */ + int iColumn, /* Column to scan for */ + u32 opMask, /* Operator(s) to scan for */ + Index *pIdx /* Must be compatible with this index */ +){ + int j = 0; + + /* memset(pScan, 0, sizeof(*pScan)); */ + pScan->pOrigWC = pWC; + pScan->pWC = pWC; + pScan->pIdxExpr = 0; + if( pIdx ){ + j = iColumn; + iColumn = pIdx->aiColumn[j]; + if( iColumn==XN_EXPR ) pScan->pIdxExpr = pIdx->aColExpr->a[j].pExpr; + if( iColumn==pIdx->pTable->iPKey ) iColumn = XN_ROWID; + } + if( pIdx && iColumn>=0 ){ + pScan->idxaff = pIdx->pTable->aCol[iColumn].affinity; + pScan->zCollName = pIdx->azColl[j]; + }else{ + pScan->idxaff = 0; + pScan->zCollName = 0; + } + pScan->opMask = opMask; + pScan->k = 0; + pScan->aiCur[0] = iCur; + pScan->aiColumn[0] = iColumn; + pScan->nEquiv = 1; + pScan->iEquiv = 1; + return whereScanNext(pScan); +} + +/* +** Search for a term in the WHERE clause that is of the form "X " +** where X is a reference to the iColumn of table iCur or of index pIdx +** if pIdx!=0 and is one of the WO_xx operator codes specified by +** the op parameter. Return a pointer to the term. Return 0 if not found. +** +** If pIdx!=0 then it must be one of the indexes of table iCur. +** Search for terms matching the iColumn-th column of pIdx +** rather than the iColumn-th column of table iCur. +** +** The term returned might by Y= if there is another constraint in +** the WHERE clause that specifies that X=Y. Any such constraints will be +** identified by the WO_EQUIV bit in the pTerm->eOperator field. The +** aiCur[]/iaColumn[] arrays hold X and all its equivalents. There are 11 +** slots in aiCur[]/aiColumn[] so that means we can look for X plus up to 10 +** other equivalent values. Hence a search for X will return if X=A1 +** and A1=A2 and A2=A3 and ... and A9=A10 and A10=. +** +** If there are multiple terms in the WHERE clause of the form "X " +** then try for the one with no dependencies on - in other words where +** is a constant expression of some kind. Only return entries of +** the form "X Y" where Y is a column in another table if no terms of +** the form "X " exist. If no terms with a constant RHS +** exist, try to return a term that does not use WO_EQUIV. +*/ +SQLITE_PRIVATE WhereTerm *sqlite3WhereFindTerm( + WhereClause *pWC, /* The WHERE clause to be searched */ + int iCur, /* Cursor number of LHS */ + int iColumn, /* Column number of LHS */ + Bitmask notReady, /* RHS must not overlap with this mask */ + u32 op, /* Mask of WO_xx values describing operator */ + Index *pIdx /* Must be compatible with this index, if not NULL */ +){ + WhereTerm *pResult = 0; + WhereTerm *p; + WhereScan scan; + + p = whereScanInit(&scan, pWC, iCur, iColumn, op, pIdx); + op &= WO_EQ|WO_IS; + while( p ){ + if( (p->prereqRight & notReady)==0 ){ + if( p->prereqRight==0 && (p->eOperator&op)!=0 ){ + testcase( p->eOperator & WO_IS ); + return p; + } + if( pResult==0 ) pResult = p; + } + p = whereScanNext(&scan); + } + return pResult; +} + +/* +** This function searches pList for an entry that matches the iCol-th column +** of index pIdx. +** +** If such an expression is found, its index in pList->a[] is returned. If +** no expression is found, -1 is returned. +*/ +static int findIndexCol( + Parse *pParse, /* Parse context */ + ExprList *pList, /* Expression list to search */ + int iBase, /* Cursor for table associated with pIdx */ + Index *pIdx, /* Index to match column of */ + int iCol /* Column of index to match */ +){ + int i; + const char *zColl = pIdx->azColl[iCol]; + + for(i=0; inExpr; i++){ + Expr *p = sqlite3ExprSkipCollate(pList->a[i].pExpr); + if( p->op==TK_COLUMN + && p->iColumn==pIdx->aiColumn[iCol] + && p->iTable==iBase + ){ + CollSeq *pColl = sqlite3ExprCollSeq(pParse, pList->a[i].pExpr); + if( pColl && 0==sqlite3StrICmp(pColl->zName, zColl) ){ + return i; + } + } + } + + return -1; +} + +/* +** Return TRUE if the iCol-th column of index pIdx is NOT NULL +*/ +static int indexColumnNotNull(Index *pIdx, int iCol){ + int j; + assert( pIdx!=0 ); + assert( iCol>=0 && iColnColumn ); + j = pIdx->aiColumn[iCol]; + if( j>=0 ){ + return pIdx->pTable->aCol[j].notNull; + }else if( j==(-1) ){ + return 1; + }else{ + assert( j==(-2) ); + return 0; /* Assume an indexed expression can always yield a NULL */ + + } +} + +/* +** Return true if the DISTINCT expression-list passed as the third argument +** is redundant. +** +** A DISTINCT list is redundant if any subset of the columns in the +** DISTINCT list are collectively unique and individually non-null. +*/ +static int isDistinctRedundant( + Parse *pParse, /* Parsing context */ + SrcList *pTabList, /* The FROM clause */ + WhereClause *pWC, /* The WHERE clause */ + ExprList *pDistinct /* The result set that needs to be DISTINCT */ +){ + Table *pTab; + Index *pIdx; + int i; + int iBase; + + /* If there is more than one table or sub-select in the FROM clause of + ** this query, then it will not be possible to show that the DISTINCT + ** clause is redundant. */ + if( pTabList->nSrc!=1 ) return 0; + iBase = pTabList->a[0].iCursor; + pTab = pTabList->a[0].pTab; + + /* If any of the expressions is an IPK column on table iBase, then return + ** true. Note: The (p->iTable==iBase) part of this test may be false if the + ** current SELECT is a correlated sub-query. + */ + for(i=0; inExpr; i++){ + Expr *p = sqlite3ExprSkipCollate(pDistinct->a[i].pExpr); + if( p->op==TK_COLUMN && p->iTable==iBase && p->iColumn<0 ) return 1; + } + + /* Loop through all indices on the table, checking each to see if it makes + ** the DISTINCT qualifier redundant. It does so if: + ** + ** 1. The index is itself UNIQUE, and + ** + ** 2. All of the columns in the index are either part of the pDistinct + ** list, or else the WHERE clause contains a term of the form "col=X", + ** where X is a constant value. The collation sequences of the + ** comparison and select-list expressions must match those of the index. + ** + ** 3. All of those index columns for which the WHERE clause does not + ** contain a "col=X" term are subject to a NOT NULL constraint. + */ + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + if( !IsUniqueIndex(pIdx) ) continue; + for(i=0; inKeyCol; i++){ + if( 0==sqlite3WhereFindTerm(pWC, iBase, i, ~(Bitmask)0, WO_EQ, pIdx) ){ + if( findIndexCol(pParse, pDistinct, iBase, pIdx, i)<0 ) break; + if( indexColumnNotNull(pIdx, i)==0 ) break; + } + } + if( i==pIdx->nKeyCol ){ + /* This index implies that the DISTINCT qualifier is redundant. */ + return 1; + } + } + + return 0; +} + + +/* +** Estimate the logarithm of the input value to base 2. +*/ +static LogEst estLog(LogEst N){ + return N<=10 ? 0 : sqlite3LogEst(N) - 33; +} + +/* +** Convert OP_Column opcodes to OP_Copy in previously generated code. +** +** This routine runs over generated VDBE code and translates OP_Column +** opcodes into OP_Copy when the table is being accessed via co-routine +** instead of via table lookup. +** +** If the bIncrRowid parameter is 0, then any OP_Rowid instructions on +** cursor iTabCur are transformed into OP_Null. Or, if bIncrRowid is non-zero, +** then each OP_Rowid is transformed into an instruction to increment the +** value stored in its output register. +*/ +static void translateColumnToCopy( + Vdbe *v, /* The VDBE containing code to translate */ + int iStart, /* Translate from this opcode to the end */ + int iTabCur, /* OP_Column/OP_Rowid references to this table */ + int iRegister, /* The first column is in this register */ + int bIncrRowid /* If non-zero, transform OP_rowid to OP_AddImm(1) */ +){ + VdbeOp *pOp = sqlite3VdbeGetOp(v, iStart); + int iEnd = sqlite3VdbeCurrentAddr(v); + for(; iStartp1!=iTabCur ) continue; + if( pOp->opcode==OP_Column ){ + pOp->opcode = OP_Copy; + pOp->p1 = pOp->p2 + iRegister; + pOp->p2 = pOp->p3; + pOp->p3 = 0; + }else if( pOp->opcode==OP_Rowid ){ + if( bIncrRowid ){ + /* Increment the value stored in the P2 operand of the OP_Rowid. */ + pOp->opcode = OP_AddImm; + pOp->p1 = pOp->p2; + pOp->p2 = 1; + }else{ + pOp->opcode = OP_Null; + pOp->p1 = 0; + pOp->p3 = 0; + } + } + } +} + +/* +** Two routines for printing the content of an sqlite3_index_info +** structure. Used for testing and debugging only. If neither +** SQLITE_TEST or SQLITE_DEBUG are defined, then these routines +** are no-ops. +*/ +#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(WHERETRACE_ENABLED) +static void TRACE_IDX_INPUTS(sqlite3_index_info *p){ + int i; + if( !sqlite3WhereTrace ) return; + for(i=0; inConstraint; i++){ + sqlite3DebugPrintf(" constraint[%d]: col=%d termid=%d op=%d usabled=%d\n", + i, + p->aConstraint[i].iColumn, + p->aConstraint[i].iTermOffset, + p->aConstraint[i].op, + p->aConstraint[i].usable); + } + for(i=0; inOrderBy; i++){ + sqlite3DebugPrintf(" orderby[%d]: col=%d desc=%d\n", + i, + p->aOrderBy[i].iColumn, + p->aOrderBy[i].desc); + } +} +static void TRACE_IDX_OUTPUTS(sqlite3_index_info *p){ + int i; + if( !sqlite3WhereTrace ) return; + for(i=0; inConstraint; i++){ + sqlite3DebugPrintf(" usage[%d]: argvIdx=%d omit=%d\n", + i, + p->aConstraintUsage[i].argvIndex, + p->aConstraintUsage[i].omit); + } + sqlite3DebugPrintf(" idxNum=%d\n", p->idxNum); + sqlite3DebugPrintf(" idxStr=%s\n", p->idxStr); + sqlite3DebugPrintf(" orderByConsumed=%d\n", p->orderByConsumed); + sqlite3DebugPrintf(" estimatedCost=%g\n", p->estimatedCost); + sqlite3DebugPrintf(" estimatedRows=%lld\n", p->estimatedRows); +} +#else +#define TRACE_IDX_INPUTS(A) +#define TRACE_IDX_OUTPUTS(A) +#endif + +#ifndef SQLITE_OMIT_AUTOMATIC_INDEX +/* +** Return TRUE if the WHERE clause term pTerm is of a form where it +** could be used with an index to access pSrc, assuming an appropriate +** index existed. +*/ +static int termCanDriveIndex( + WhereTerm *pTerm, /* WHERE clause term to check */ + struct SrcList_item *pSrc, /* Table we are trying to access */ + Bitmask notReady /* Tables in outer loops of the join */ +){ + char aff; + if( pTerm->leftCursor!=pSrc->iCursor ) return 0; + if( (pTerm->eOperator & (WO_EQ|WO_IS))==0 ) return 0; + if( (pTerm->prereqRight & notReady)!=0 ) return 0; + if( pTerm->u.leftColumn<0 ) return 0; + aff = pSrc->pTab->aCol[pTerm->u.leftColumn].affinity; + if( !sqlite3IndexAffinityOk(pTerm->pExpr, aff) ) return 0; + testcase( pTerm->pExpr->op==TK_IS ); + return 1; +} +#endif + + +#ifndef SQLITE_OMIT_AUTOMATIC_INDEX +/* +** Generate code to construct the Index object for an automatic index +** and to set up the WhereLevel object pLevel so that the code generator +** makes use of the automatic index. +*/ +static void constructAutomaticIndex( + Parse *pParse, /* The parsing context */ + WhereClause *pWC, /* The WHERE clause */ + struct SrcList_item *pSrc, /* The FROM clause term to get the next index */ + Bitmask notReady, /* Mask of cursors that are not available */ + WhereLevel *pLevel /* Write new index here */ +){ + int nKeyCol; /* Number of columns in the constructed index */ + WhereTerm *pTerm; /* A single term of the WHERE clause */ + WhereTerm *pWCEnd; /* End of pWC->a[] */ + Index *pIdx; /* Object describing the transient index */ + Vdbe *v; /* Prepared statement under construction */ + int addrInit; /* Address of the initialization bypass jump */ + Table *pTable; /* The table being indexed */ + int addrTop; /* Top of the index fill loop */ + int regRecord; /* Register holding an index record */ + int n; /* Column counter */ + int i; /* Loop counter */ + int mxBitCol; /* Maximum column in pSrc->colUsed */ + CollSeq *pColl; /* Collating sequence to on a column */ + WhereLoop *pLoop; /* The Loop object */ + char *zNotUsed; /* Extra space on the end of pIdx */ + Bitmask idxCols; /* Bitmap of columns used for indexing */ + Bitmask extraCols; /* Bitmap of additional columns */ + u8 sentWarning = 0; /* True if a warnning has been issued */ + Expr *pPartial = 0; /* Partial Index Expression */ + int iContinue = 0; /* Jump here to skip excluded rows */ + struct SrcList_item *pTabItem; /* FROM clause term being indexed */ + int addrCounter = 0; /* Address where integer counter is initialized */ + int regBase; /* Array of registers where record is assembled */ + + /* Generate code to skip over the creation and initialization of the + ** transient index on 2nd and subsequent iterations of the loop. */ + v = pParse->pVdbe; + assert( v!=0 ); + addrInit = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); + + /* Count the number of columns that will be added to the index + ** and used to match WHERE clause constraints */ + nKeyCol = 0; + pTable = pSrc->pTab; + pWCEnd = &pWC->a[pWC->nTerm]; + pLoop = pLevel->pWLoop; + idxCols = 0; + for(pTerm=pWC->a; pTermpExpr; + assert( !ExprHasProperty(pExpr, EP_FromJoin) /* prereq always non-zero */ + || pExpr->iRightJoinTable!=pSrc->iCursor /* for the right-hand */ + || pLoop->prereq!=0 ); /* table of a LEFT JOIN */ + if( pLoop->prereq==0 + && (pTerm->wtFlags & TERM_VIRTUAL)==0 + && !ExprHasProperty(pExpr, EP_FromJoin) + && sqlite3ExprIsTableConstant(pExpr, pSrc->iCursor) ){ + pPartial = sqlite3ExprAnd(pParse->db, pPartial, + sqlite3ExprDup(pParse->db, pExpr, 0)); + } + if( termCanDriveIndex(pTerm, pSrc, notReady) ){ + int iCol = pTerm->u.leftColumn; + Bitmask cMask = iCol>=BMS ? MASKBIT(BMS-1) : MASKBIT(iCol); + testcase( iCol==BMS ); + testcase( iCol==BMS-1 ); + if( !sentWarning ){ + sqlite3_log(SQLITE_WARNING_AUTOINDEX, + "automatic index on %s(%s)", pTable->zName, + pTable->aCol[iCol].zName); + sentWarning = 1; + } + if( (idxCols & cMask)==0 ){ + if( whereLoopResize(pParse->db, pLoop, nKeyCol+1) ){ + goto end_auto_index_create; + } + pLoop->aLTerm[nKeyCol++] = pTerm; + idxCols |= cMask; + } + } + } + assert( nKeyCol>0 ); + pLoop->u.btree.nEq = pLoop->nLTerm = nKeyCol; + pLoop->wsFlags = WHERE_COLUMN_EQ | WHERE_IDX_ONLY | WHERE_INDEXED + | WHERE_AUTO_INDEX; + + /* Count the number of additional columns needed to create a + ** covering index. A "covering index" is an index that contains all + ** columns that are needed by the query. With a covering index, the + ** original table never needs to be accessed. Automatic indices must + ** be a covering index because the index will not be updated if the + ** original table changes and the index and table cannot both be used + ** if they go out of sync. + */ + extraCols = pSrc->colUsed & (~idxCols | MASKBIT(BMS-1)); + mxBitCol = MIN(BMS-1,pTable->nCol); + testcase( pTable->nCol==BMS-1 ); + testcase( pTable->nCol==BMS-2 ); + for(i=0; icolUsed & MASKBIT(BMS-1) ){ + nKeyCol += pTable->nCol - BMS + 1; + } + + /* Construct the Index object to describe this index */ + pIdx = sqlite3AllocateIndexObject(pParse->db, nKeyCol+1, 0, &zNotUsed); + if( pIdx==0 ) goto end_auto_index_create; + pLoop->u.btree.pIndex = pIdx; + pIdx->zName = "auto-index"; + pIdx->pTable = pTable; + n = 0; + idxCols = 0; + for(pTerm=pWC->a; pTermu.leftColumn; + Bitmask cMask = iCol>=BMS ? MASKBIT(BMS-1) : MASKBIT(iCol); + testcase( iCol==BMS-1 ); + testcase( iCol==BMS ); + if( (idxCols & cMask)==0 ){ + Expr *pX = pTerm->pExpr; + idxCols |= cMask; + pIdx->aiColumn[n] = pTerm->u.leftColumn; + pColl = sqlite3BinaryCompareCollSeq(pParse, pX->pLeft, pX->pRight); + pIdx->azColl[n] = pColl ? pColl->zName : sqlite3StrBINARY; + n++; + } + } + } + assert( (u32)n==pLoop->u.btree.nEq ); + + /* Add additional columns needed to make the automatic index into + ** a covering index */ + for(i=0; iaiColumn[n] = i; + pIdx->azColl[n] = sqlite3StrBINARY; + n++; + } + } + if( pSrc->colUsed & MASKBIT(BMS-1) ){ + for(i=BMS-1; inCol; i++){ + pIdx->aiColumn[n] = i; + pIdx->azColl[n] = sqlite3StrBINARY; + n++; + } + } + assert( n==nKeyCol ); + pIdx->aiColumn[n] = XN_ROWID; + pIdx->azColl[n] = sqlite3StrBINARY; + + /* Create the automatic index */ + assert( pLevel->iIdxCur>=0 ); + pLevel->iIdxCur = pParse->nTab++; + sqlite3VdbeAddOp2(v, OP_OpenAutoindex, pLevel->iIdxCur, nKeyCol+1); + sqlite3VdbeSetP4KeyInfo(pParse, pIdx); + VdbeComment((v, "for %s", pTable->zName)); + + /* Fill the automatic index with content */ + sqlite3ExprCachePush(pParse); + pTabItem = &pWC->pWInfo->pTabList->a[pLevel->iFrom]; + if( pTabItem->fg.viaCoroutine ){ + int regYield = pTabItem->regReturn; + addrCounter = sqlite3VdbeAddOp2(v, OP_Integer, 0, 0); + sqlite3VdbeAddOp3(v, OP_InitCoroutine, regYield, 0, pTabItem->addrFillSub); + addrTop = sqlite3VdbeAddOp1(v, OP_Yield, regYield); + VdbeCoverage(v); + VdbeComment((v, "next row of \"%s\"", pTabItem->pTab->zName)); + }else{ + addrTop = sqlite3VdbeAddOp1(v, OP_Rewind, pLevel->iTabCur); VdbeCoverage(v); + } + if( pPartial ){ + iContinue = sqlite3VdbeMakeLabel(v); + sqlite3ExprIfFalse(pParse, pPartial, iContinue, SQLITE_JUMPIFNULL); + pLoop->wsFlags |= WHERE_PARTIALIDX; + } + regRecord = sqlite3GetTempReg(pParse); + regBase = sqlite3GenerateIndexKey( + pParse, pIdx, pLevel->iTabCur, regRecord, 0, 0, 0, 0 + ); + sqlite3VdbeAddOp2(v, OP_IdxInsert, pLevel->iIdxCur, regRecord); + sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT); + if( pPartial ) sqlite3VdbeResolveLabel(v, iContinue); + if( pTabItem->fg.viaCoroutine ){ + sqlite3VdbeChangeP2(v, addrCounter, regBase+n); + translateColumnToCopy(v, addrTop, pLevel->iTabCur, pTabItem->regResult, 1); + sqlite3VdbeGoto(v, addrTop); + pTabItem->fg.viaCoroutine = 0; + }else{ + sqlite3VdbeAddOp2(v, OP_Next, pLevel->iTabCur, addrTop+1); VdbeCoverage(v); + } + sqlite3VdbeChangeP5(v, SQLITE_STMTSTATUS_AUTOINDEX); + sqlite3VdbeJumpHere(v, addrTop); + sqlite3ReleaseTempReg(pParse, regRecord); + sqlite3ExprCachePop(pParse); + + /* Jump here when skipping the initialization */ + sqlite3VdbeJumpHere(v, addrInit); + +end_auto_index_create: + sqlite3ExprDelete(pParse->db, pPartial); +} +#endif /* SQLITE_OMIT_AUTOMATIC_INDEX */ + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* +** Allocate and populate an sqlite3_index_info structure. It is the +** responsibility of the caller to eventually release the structure +** by passing the pointer returned by this function to sqlite3_free(). +*/ +static sqlite3_index_info *allocateIndexInfo( + Parse *pParse, + WhereClause *pWC, + Bitmask mUnusable, /* Ignore terms with these prereqs */ + struct SrcList_item *pSrc, + ExprList *pOrderBy, + u16 *pmNoOmit /* Mask of terms not to omit */ +){ + int i, j; + int nTerm; + struct sqlite3_index_constraint *pIdxCons; + struct sqlite3_index_orderby *pIdxOrderBy; + struct sqlite3_index_constraint_usage *pUsage; + WhereTerm *pTerm; + int nOrderBy; + sqlite3_index_info *pIdxInfo; + u16 mNoOmit = 0; + + /* Count the number of possible WHERE clause constraints referring + ** to this virtual table */ + for(i=nTerm=0, pTerm=pWC->a; inTerm; i++, pTerm++){ + if( pTerm->leftCursor != pSrc->iCursor ) continue; + if( pTerm->prereqRight & mUnusable ) continue; + assert( IsPowerOfTwo(pTerm->eOperator & ~WO_EQUIV) ); + testcase( pTerm->eOperator & WO_IN ); + testcase( pTerm->eOperator & WO_ISNULL ); + testcase( pTerm->eOperator & WO_IS ); + testcase( pTerm->eOperator & WO_ALL ); + if( (pTerm->eOperator & ~(WO_ISNULL|WO_EQUIV|WO_IS))==0 ) continue; + if( pTerm->wtFlags & TERM_VNULL ) continue; + assert( pTerm->u.leftColumn>=(-1) ); + nTerm++; + } + + /* If the ORDER BY clause contains only columns in the current + ** virtual table then allocate space for the aOrderBy part of + ** the sqlite3_index_info structure. + */ + nOrderBy = 0; + if( pOrderBy ){ + int n = pOrderBy->nExpr; + for(i=0; ia[i].pExpr; + if( pExpr->op!=TK_COLUMN || pExpr->iTable!=pSrc->iCursor ) break; + } + if( i==n){ + nOrderBy = n; + } + } + + /* Allocate the sqlite3_index_info structure + */ + pIdxInfo = sqlite3DbMallocZero(pParse->db, sizeof(*pIdxInfo) + + (sizeof(*pIdxCons) + sizeof(*pUsage))*nTerm + + sizeof(*pIdxOrderBy)*nOrderBy ); + if( pIdxInfo==0 ){ + sqlite3ErrorMsg(pParse, "out of memory"); + return 0; + } + + /* Initialize the structure. The sqlite3_index_info structure contains + ** many fields that are declared "const" to prevent xBestIndex from + ** changing them. We have to do some funky casting in order to + ** initialize those fields. + */ + pIdxCons = (struct sqlite3_index_constraint*)&pIdxInfo[1]; + pIdxOrderBy = (struct sqlite3_index_orderby*)&pIdxCons[nTerm]; + pUsage = (struct sqlite3_index_constraint_usage*)&pIdxOrderBy[nOrderBy]; + *(int*)&pIdxInfo->nConstraint = nTerm; + *(int*)&pIdxInfo->nOrderBy = nOrderBy; + *(struct sqlite3_index_constraint**)&pIdxInfo->aConstraint = pIdxCons; + *(struct sqlite3_index_orderby**)&pIdxInfo->aOrderBy = pIdxOrderBy; + *(struct sqlite3_index_constraint_usage**)&pIdxInfo->aConstraintUsage = + pUsage; + + for(i=j=0, pTerm=pWC->a; inTerm; i++, pTerm++){ + u8 op; + if( pTerm->leftCursor != pSrc->iCursor ) continue; + if( pTerm->prereqRight & mUnusable ) continue; + assert( IsPowerOfTwo(pTerm->eOperator & ~WO_EQUIV) ); + testcase( pTerm->eOperator & WO_IN ); + testcase( pTerm->eOperator & WO_IS ); + testcase( pTerm->eOperator & WO_ISNULL ); + testcase( pTerm->eOperator & WO_ALL ); + if( (pTerm->eOperator & ~(WO_ISNULL|WO_EQUIV|WO_IS))==0 ) continue; + if( pTerm->wtFlags & TERM_VNULL ) continue; + assert( pTerm->u.leftColumn>=(-1) ); + pIdxCons[j].iColumn = pTerm->u.leftColumn; + pIdxCons[j].iTermOffset = i; + op = (u8)pTerm->eOperator & WO_ALL; + if( op==WO_IN ) op = WO_EQ; + if( op==WO_MATCH ){ + op = pTerm->eMatchOp; + } + pIdxCons[j].op = op; + /* The direct assignment in the previous line is possible only because + ** the WO_ and SQLITE_INDEX_CONSTRAINT_ codes are identical. The + ** following asserts verify this fact. */ + assert( WO_EQ==SQLITE_INDEX_CONSTRAINT_EQ ); + assert( WO_LT==SQLITE_INDEX_CONSTRAINT_LT ); + assert( WO_LE==SQLITE_INDEX_CONSTRAINT_LE ); + assert( WO_GT==SQLITE_INDEX_CONSTRAINT_GT ); + assert( WO_GE==SQLITE_INDEX_CONSTRAINT_GE ); + assert( WO_MATCH==SQLITE_INDEX_CONSTRAINT_MATCH ); + assert( pTerm->eOperator & (WO_IN|WO_EQ|WO_LT|WO_LE|WO_GT|WO_GE|WO_MATCH) ); + + if( op & (WO_LT|WO_LE|WO_GT|WO_GE) + && sqlite3ExprIsVector(pTerm->pExpr->pRight) + ){ + if( i<16 ) mNoOmit |= (1 << i); + if( op==WO_LT ) pIdxCons[j].op = WO_LE; + if( op==WO_GT ) pIdxCons[j].op = WO_GE; + } + + j++; + } + for(i=0; ia[i].pExpr; + pIdxOrderBy[i].iColumn = pExpr->iColumn; + pIdxOrderBy[i].desc = pOrderBy->a[i].sortOrder; + } + + *pmNoOmit = mNoOmit; + return pIdxInfo; +} + +/* +** The table object reference passed as the second argument to this function +** must represent a virtual table. This function invokes the xBestIndex() +** method of the virtual table with the sqlite3_index_info object that +** comes in as the 3rd argument to this function. +** +** If an error occurs, pParse is populated with an error message and a +** non-zero value is returned. Otherwise, 0 is returned and the output +** part of the sqlite3_index_info structure is left populated. +** +** Whether or not an error is returned, it is the responsibility of the +** caller to eventually free p->idxStr if p->needToFreeIdxStr indicates +** that this is required. +*/ +static int vtabBestIndex(Parse *pParse, Table *pTab, sqlite3_index_info *p){ + sqlite3_vtab *pVtab = sqlite3GetVTable(pParse->db, pTab)->pVtab; + int rc; + + TRACE_IDX_INPUTS(p); + rc = pVtab->pModule->xBestIndex(pVtab, p); + TRACE_IDX_OUTPUTS(p); + + if( rc!=SQLITE_OK ){ + if( rc==SQLITE_NOMEM ){ + sqlite3OomFault(pParse->db); + }else if( !pVtab->zErrMsg ){ + sqlite3ErrorMsg(pParse, "%s", sqlite3ErrStr(rc)); + }else{ + sqlite3ErrorMsg(pParse, "%s", pVtab->zErrMsg); + } + } + sqlite3_free(pVtab->zErrMsg); + pVtab->zErrMsg = 0; + +#if 0 + /* This error is now caught by the caller. + ** Search for "xBestIndex malfunction" below */ + for(i=0; inConstraint; i++){ + if( !p->aConstraint[i].usable && p->aConstraintUsage[i].argvIndex>0 ){ + sqlite3ErrorMsg(pParse, + "table %s: xBestIndex returned an invalid plan", pTab->zName); + } + } +#endif + + return pParse->nErr; +} +#endif /* !defined(SQLITE_OMIT_VIRTUALTABLE) */ + +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +/* +** Estimate the location of a particular key among all keys in an +** index. Store the results in aStat as follows: +** +** aStat[0] Est. number of rows less than pRec +** aStat[1] Est. number of rows equal to pRec +** +** Return the index of the sample that is the smallest sample that +** is greater than or equal to pRec. Note that this index is not an index +** into the aSample[] array - it is an index into a virtual set of samples +** based on the contents of aSample[] and the number of fields in record +** pRec. +*/ +static int whereKeyStats( + Parse *pParse, /* Database connection */ + Index *pIdx, /* Index to consider domain of */ + UnpackedRecord *pRec, /* Vector of values to consider */ + int roundUp, /* Round up if true. Round down if false */ + tRowcnt *aStat /* OUT: stats written here */ +){ + IndexSample *aSample = pIdx->aSample; + int iCol; /* Index of required stats in anEq[] etc. */ + int i; /* Index of first sample >= pRec */ + int iSample; /* Smallest sample larger than or equal to pRec */ + int iMin = 0; /* Smallest sample not yet tested */ + int iTest; /* Next sample to test */ + int res; /* Result of comparison operation */ + int nField; /* Number of fields in pRec */ + tRowcnt iLower = 0; /* anLt[] + anEq[] of largest sample pRec is > */ + +#ifndef SQLITE_DEBUG + UNUSED_PARAMETER( pParse ); +#endif + assert( pRec!=0 ); + assert( pIdx->nSample>0 ); + assert( pRec->nField>0 && pRec->nField<=pIdx->nSampleCol ); + + /* Do a binary search to find the first sample greater than or equal + ** to pRec. If pRec contains a single field, the set of samples to search + ** is simply the aSample[] array. If the samples in aSample[] contain more + ** than one fields, all fields following the first are ignored. + ** + ** If pRec contains N fields, where N is more than one, then as well as the + ** samples in aSample[] (truncated to N fields), the search also has to + ** consider prefixes of those samples. For example, if the set of samples + ** in aSample is: + ** + ** aSample[0] = (a, 5) + ** aSample[1] = (a, 10) + ** aSample[2] = (b, 5) + ** aSample[3] = (c, 100) + ** aSample[4] = (c, 105) + ** + ** Then the search space should ideally be the samples above and the + ** unique prefixes [a], [b] and [c]. But since that is hard to organize, + ** the code actually searches this set: + ** + ** 0: (a) + ** 1: (a, 5) + ** 2: (a, 10) + ** 3: (a, 10) + ** 4: (b) + ** 5: (b, 5) + ** 6: (c) + ** 7: (c, 100) + ** 8: (c, 105) + ** 9: (c, 105) + ** + ** For each sample in the aSample[] array, N samples are present in the + ** effective sample array. In the above, samples 0 and 1 are based on + ** sample aSample[0]. Samples 2 and 3 on aSample[1] etc. + ** + ** Often, sample i of each block of N effective samples has (i+1) fields. + ** Except, each sample may be extended to ensure that it is greater than or + ** equal to the previous sample in the array. For example, in the above, + ** sample 2 is the first sample of a block of N samples, so at first it + ** appears that it should be 1 field in size. However, that would make it + ** smaller than sample 1, so the binary search would not work. As a result, + ** it is extended to two fields. The duplicates that this creates do not + ** cause any problems. + */ + nField = pRec->nField; + iCol = 0; + iSample = pIdx->nSample * nField; + do{ + int iSamp; /* Index in aSample[] of test sample */ + int n; /* Number of fields in test sample */ + + iTest = (iMin+iSample)/2; + iSamp = iTest / nField; + if( iSamp>0 ){ + /* The proposed effective sample is a prefix of sample aSample[iSamp]. + ** Specifically, the shortest prefix of at least (1 + iTest%nField) + ** fields that is greater than the previous effective sample. */ + for(n=(iTest % nField) + 1; nnField = n; + res = sqlite3VdbeRecordCompare(aSample[iSamp].n, aSample[iSamp].p, pRec); + if( res<0 ){ + iLower = aSample[iSamp].anLt[n-1] + aSample[iSamp].anEq[n-1]; + iMin = iTest+1; + }else if( res==0 && ndb->mallocFailed==0 ){ + if( res==0 ){ + /* If (res==0) is true, then pRec must be equal to sample i. */ + assert( inSample ); + assert( iCol==nField-1 ); + pRec->nField = nField; + assert( 0==sqlite3VdbeRecordCompare(aSample[i].n, aSample[i].p, pRec) + || pParse->db->mallocFailed + ); + }else{ + /* Unless i==pIdx->nSample, indicating that pRec is larger than + ** all samples in the aSample[] array, pRec must be smaller than the + ** (iCol+1) field prefix of sample i. */ + assert( i<=pIdx->nSample && i>=0 ); + pRec->nField = iCol+1; + assert( i==pIdx->nSample + || sqlite3VdbeRecordCompare(aSample[i].n, aSample[i].p, pRec)>0 + || pParse->db->mallocFailed ); + + /* if i==0 and iCol==0, then record pRec is smaller than all samples + ** in the aSample[] array. Otherwise, if (iCol>0) then pRec must + ** be greater than or equal to the (iCol) field prefix of sample i. + ** If (i>0), then pRec must also be greater than sample (i-1). */ + if( iCol>0 ){ + pRec->nField = iCol; + assert( sqlite3VdbeRecordCompare(aSample[i].n, aSample[i].p, pRec)<=0 + || pParse->db->mallocFailed ); + } + if( i>0 ){ + pRec->nField = nField; + assert( sqlite3VdbeRecordCompare(aSample[i-1].n, aSample[i-1].p, pRec)<0 + || pParse->db->mallocFailed ); + } + } + } +#endif /* ifdef SQLITE_DEBUG */ + + if( res==0 ){ + /* Record pRec is equal to sample i */ + assert( iCol==nField-1 ); + aStat[0] = aSample[i].anLt[iCol]; + aStat[1] = aSample[i].anEq[iCol]; + }else{ + /* At this point, the (iCol+1) field prefix of aSample[i] is the first + ** sample that is greater than pRec. Or, if i==pIdx->nSample then pRec + ** is larger than all samples in the array. */ + tRowcnt iUpper, iGap; + if( i>=pIdx->nSample ){ + iUpper = sqlite3LogEstToInt(pIdx->aiRowLogEst[0]); + }else{ + iUpper = aSample[i].anLt[iCol]; + } + + if( iLower>=iUpper ){ + iGap = 0; + }else{ + iGap = iUpper - iLower; + } + if( roundUp ){ + iGap = (iGap*2)/3; + }else{ + iGap = iGap/3; + } + aStat[0] = iLower + iGap; + aStat[1] = pIdx->aAvgEq[iCol]; + } + + /* Restore the pRec->nField value before returning. */ + pRec->nField = nField; + return i; +} +#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */ + +/* +** If it is not NULL, pTerm is a term that provides an upper or lower +** bound on a range scan. Without considering pTerm, it is estimated +** that the scan will visit nNew rows. This function returns the number +** estimated to be visited after taking pTerm into account. +** +** If the user explicitly specified a likelihood() value for this term, +** then the return value is the likelihood multiplied by the number of +** input rows. Otherwise, this function assumes that an "IS NOT NULL" term +** has a likelihood of 0.50, and any other term a likelihood of 0.25. +*/ +static LogEst whereRangeAdjust(WhereTerm *pTerm, LogEst nNew){ + LogEst nRet = nNew; + if( pTerm ){ + if( pTerm->truthProb<=0 ){ + nRet += pTerm->truthProb; + }else if( (pTerm->wtFlags & TERM_VNULL)==0 ){ + nRet -= 20; assert( 20==sqlite3LogEst(4) ); + } + } + return nRet; +} + + +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +/* +** Return the affinity for a single column of an index. +*/ +SQLITE_PRIVATE char sqlite3IndexColumnAffinity(sqlite3 *db, Index *pIdx, int iCol){ + assert( iCol>=0 && iColnColumn ); + if( !pIdx->zColAff ){ + if( sqlite3IndexAffinityStr(db, pIdx)==0 ) return SQLITE_AFF_BLOB; + } + return pIdx->zColAff[iCol]; +} +#endif + + +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +/* +** This function is called to estimate the number of rows visited by a +** range-scan on a skip-scan index. For example: +** +** CREATE INDEX i1 ON t1(a, b, c); +** SELECT * FROM t1 WHERE a=? AND c BETWEEN ? AND ?; +** +** Value pLoop->nOut is currently set to the estimated number of rows +** visited for scanning (a=? AND b=?). This function reduces that estimate +** by some factor to account for the (c BETWEEN ? AND ?) expression based +** on the stat4 data for the index. this scan will be peformed multiple +** times (once for each (a,b) combination that matches a=?) is dealt with +** by the caller. +** +** It does this by scanning through all stat4 samples, comparing values +** extracted from pLower and pUpper with the corresponding column in each +** sample. If L and U are the number of samples found to be less than or +** equal to the values extracted from pLower and pUpper respectively, and +** N is the total number of samples, the pLoop->nOut value is adjusted +** as follows: +** +** nOut = nOut * ( min(U - L, 1) / N ) +** +** If pLower is NULL, or a value cannot be extracted from the term, L is +** set to zero. If pUpper is NULL, or a value cannot be extracted from it, +** U is set to N. +** +** Normally, this function sets *pbDone to 1 before returning. However, +** if no value can be extracted from either pLower or pUpper (and so the +** estimate of the number of rows delivered remains unchanged), *pbDone +** is left as is. +** +** If an error occurs, an SQLite error code is returned. Otherwise, +** SQLITE_OK. +*/ +static int whereRangeSkipScanEst( + Parse *pParse, /* Parsing & code generating context */ + WhereTerm *pLower, /* Lower bound on the range. ex: "x>123" Might be NULL */ + WhereTerm *pUpper, /* Upper bound on the range. ex: "x<455" Might be NULL */ + WhereLoop *pLoop, /* Update the .nOut value of this loop */ + int *pbDone /* Set to true if at least one expr. value extracted */ +){ + Index *p = pLoop->u.btree.pIndex; + int nEq = pLoop->u.btree.nEq; + sqlite3 *db = pParse->db; + int nLower = -1; + int nUpper = p->nSample+1; + int rc = SQLITE_OK; + u8 aff = sqlite3IndexColumnAffinity(db, p, nEq); + CollSeq *pColl; + + sqlite3_value *p1 = 0; /* Value extracted from pLower */ + sqlite3_value *p2 = 0; /* Value extracted from pUpper */ + sqlite3_value *pVal = 0; /* Value extracted from record */ + + pColl = sqlite3LocateCollSeq(pParse, p->azColl[nEq]); + if( pLower ){ + rc = sqlite3Stat4ValueFromExpr(pParse, pLower->pExpr->pRight, aff, &p1); + nLower = 0; + } + if( pUpper && rc==SQLITE_OK ){ + rc = sqlite3Stat4ValueFromExpr(pParse, pUpper->pExpr->pRight, aff, &p2); + nUpper = p2 ? 0 : p->nSample; + } + + if( p1 || p2 ){ + int i; + int nDiff; + for(i=0; rc==SQLITE_OK && inSample; i++){ + rc = sqlite3Stat4Column(db, p->aSample[i].p, p->aSample[i].n, nEq, &pVal); + if( rc==SQLITE_OK && p1 ){ + int res = sqlite3MemCompare(p1, pVal, pColl); + if( res>=0 ) nLower++; + } + if( rc==SQLITE_OK && p2 ){ + int res = sqlite3MemCompare(p2, pVal, pColl); + if( res>=0 ) nUpper++; + } + } + nDiff = (nUpper - nLower); + if( nDiff<=0 ) nDiff = 1; + + /* If there is both an upper and lower bound specified, and the + ** comparisons indicate that they are close together, use the fallback + ** method (assume that the scan visits 1/64 of the rows) for estimating + ** the number of rows visited. Otherwise, estimate the number of rows + ** using the method described in the header comment for this function. */ + if( nDiff!=1 || pUpper==0 || pLower==0 ){ + int nAdjust = (sqlite3LogEst(p->nSample) - sqlite3LogEst(nDiff)); + pLoop->nOut -= nAdjust; + *pbDone = 1; + WHERETRACE(0x10, ("range skip-scan regions: %u..%u adjust=%d est=%d\n", + nLower, nUpper, nAdjust*-1, pLoop->nOut)); + } + + }else{ + assert( *pbDone==0 ); + } + + sqlite3ValueFree(p1); + sqlite3ValueFree(p2); + sqlite3ValueFree(pVal); + + return rc; +} +#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */ + +/* +** 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 +** bound, a lower bound, or both. The WHERE clause terms that set the upper +** and lower bounds are represented by pLower and pUpper respectively. For +** example, assuming that index p is on t1(a): +** +** ... FROM t1 WHERE a > ? AND a < ? ... +** |_____| |_____| +** | | +** pLower pUpper +** +** If either of the upper or lower bound is not present, then NULL is passed in +** place of the corresponding WhereTerm. +** +** The value in (pBuilder->pNew->u.btree.nEq) is the number of the index +** column subject to the range constraint. Or, equivalently, the number of +** equality constraints optimized by the proposed index scan. For example, +** assuming index p is on t1(a, b), and the SQL query is: +** +** ... FROM t1 WHERE a = ? AND b > ? AND b < ? ... +** +** then nEq is set to 1 (as the range restricted column, b, is the second +** left-most column of the index). Or, if the query is: +** +** ... FROM t1 WHERE a > ? AND a < ? ... +** +** then nEq is set to 0. +** +** When this function is called, *pnOut is set to the sqlite3LogEst() of the +** number of rows that the index scan is expected to visit without +** considering the range constraints. If nEq is 0, then *pnOut is the number of +** rows in the index. Assuming no error occurs, *pnOut is adjusted (reduced) +** to account for the range constraints pLower and pUpper. +** +** In the absence of sqlite_stat4 ANALYZE data, or if such data cannot be +** used, a single range inequality reduces the search space by a factor of 4. +** and a pair of constraints (x>? AND x123" Might be NULL */ + WhereTerm *pUpper, /* Upper bound on the range. ex: "x<455" Might be NULL */ + WhereLoop *pLoop /* Modify the .nOut and maybe .rRun fields */ +){ + int rc = SQLITE_OK; + int nOut = pLoop->nOut; + LogEst nNew; + +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 + Index *p = pLoop->u.btree.pIndex; + int nEq = pLoop->u.btree.nEq; + + if( p->nSample>0 && nEqnSampleCol ){ + if( nEq==pBuilder->nRecValid ){ + UnpackedRecord *pRec = pBuilder->pRec; + tRowcnt a[2]; + int nBtm = pLoop->u.btree.nBtm; + int nTop = pLoop->u.btree.nTop; + + /* Variable iLower will be set to the estimate of the number of rows in + ** the index that are less than the lower bound of the range query. The + ** lower bound being the concatenation of $P and $L, where $P is the + ** key-prefix formed by the nEq values matched against the nEq left-most + ** columns of the index, and $L is the value in pLower. + ** + ** Or, if pLower is NULL or $L cannot be extracted from it (because it + ** is not a simple variable or literal value), the lower bound of the + ** range is $P. Due to a quirk in the way whereKeyStats() works, even + ** if $L is available, whereKeyStats() is called for both ($P) and + ** ($P:$L) and the larger of the two returned values is used. + ** + ** Similarly, iUpper is to be set to the estimate of the number of rows + ** less than the upper bound of the range query. Where the upper bound + ** is either ($P) or ($P:$U). Again, even if $U is available, both values + ** of iUpper are requested of whereKeyStats() and the smaller used. + ** + ** The number of rows between the two bounds is then just iUpper-iLower. + */ + tRowcnt iLower; /* Rows less than the lower bound */ + tRowcnt iUpper; /* Rows less than the upper bound */ + int iLwrIdx = -2; /* aSample[] for the lower bound */ + int iUprIdx = -1; /* aSample[] for the upper bound */ + + if( pRec ){ + testcase( pRec->nField!=pBuilder->nRecValid ); + pRec->nField = pBuilder->nRecValid; + } + /* Determine iLower and iUpper using ($P) only. */ + if( nEq==0 ){ + iLower = 0; + iUpper = p->nRowEst0; + }else{ + /* Note: this call could be optimized away - since the same values must + ** have been requested when testing key $P in whereEqualScanEst(). */ + whereKeyStats(pParse, p, pRec, 0, a); + iLower = a[0]; + iUpper = a[0] + a[1]; + } + + assert( pLower==0 || (pLower->eOperator & (WO_GT|WO_GE))!=0 ); + assert( pUpper==0 || (pUpper->eOperator & (WO_LT|WO_LE))!=0 ); + assert( p->aSortOrder!=0 ); + if( p->aSortOrder[nEq] ){ + /* The roles of pLower and pUpper are swapped for a DESC index */ + SWAP(WhereTerm*, pLower, pUpper); + SWAP(int, nBtm, nTop); + } + + /* If possible, improve on the iLower estimate using ($P:$L). */ + if( pLower ){ + int n; /* Values extracted from pExpr */ + Expr *pExpr = pLower->pExpr->pRight; + rc = sqlite3Stat4ProbeSetValue(pParse, p, &pRec, pExpr, nBtm, nEq, &n); + if( rc==SQLITE_OK && n ){ + tRowcnt iNew; + u16 mask = WO_GT|WO_LE; + if( sqlite3ExprVectorSize(pExpr)>n ) mask = (WO_LE|WO_LT); + iLwrIdx = whereKeyStats(pParse, p, pRec, 0, a); + iNew = a[0] + ((pLower->eOperator & mask) ? a[1] : 0); + if( iNew>iLower ) iLower = iNew; + nOut--; + pLower = 0; + } + } + + /* If possible, improve on the iUpper estimate using ($P:$U). */ + if( pUpper ){ + int n; /* Values extracted from pExpr */ + Expr *pExpr = pUpper->pExpr->pRight; + rc = sqlite3Stat4ProbeSetValue(pParse, p, &pRec, pExpr, nTop, nEq, &n); + if( rc==SQLITE_OK && n ){ + tRowcnt iNew; + u16 mask = WO_GT|WO_LE; + if( sqlite3ExprVectorSize(pExpr)>n ) mask = (WO_LE|WO_LT); + iUprIdx = whereKeyStats(pParse, p, pRec, 1, a); + iNew = a[0] + ((pUpper->eOperator & mask) ? a[1] : 0); + if( iNewpRec = pRec; + if( rc==SQLITE_OK ){ + if( iUpper>iLower ){ + nNew = sqlite3LogEst(iUpper - iLower); + /* TUNING: If both iUpper and iLower are derived from the same + ** sample, then assume they are 4x more selective. This brings + ** the estimated selectivity more in line with what it would be + ** if estimated without the use of STAT3/4 tables. */ + if( iLwrIdx==iUprIdx ) nNew -= 20; assert( 20==sqlite3LogEst(4) ); + }else{ + nNew = 10; assert( 10==sqlite3LogEst(2) ); + } + if( nNewwtFlags & TERM_VNULL)==0 ); + nNew = whereRangeAdjust(pLower, nOut); + nNew = whereRangeAdjust(pUpper, nNew); + + /* TUNING: If there is both an upper and lower limit and neither limit + ** has an application-defined likelihood(), assume the range is + ** reduced by an additional 75%. This means that, by default, an open-ended + ** range query (e.g. col > ?) is assumed to match 1/4 of the rows in the + ** index. While a closed range (e.g. col BETWEEN ? AND ?) is estimated to + ** match 1/64 of the index. */ + if( pLower && pLower->truthProb>0 && pUpper && pUpper->truthProb>0 ){ + nNew -= 20; + } + + nOut -= (pLower!=0) + (pUpper!=0); + if( nNew<10 ) nNew = 10; + if( nNewnOut>nOut ){ + WHERETRACE(0x10,("Range scan lowers nOut from %d to %d\n", + pLoop->nOut, nOut)); + } +#endif + pLoop->nOut = (LogEst)nOut; + return rc; +} + +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +/* +** Estimate the number of rows that will be returned based on +** an equality constraint x=VALUE and where that VALUE occurs in +** the histogram data. This only works when x is the left-most +** column of an index and sqlite_stat3 histogram data is available +** for that index. When pExpr==NULL that means the constraint is +** "x IS NULL" instead of "x=VALUE". +** +** Write the estimated row count into *pnRow and return SQLITE_OK. +** If unable to make an estimate, leave *pnRow unchanged and return +** non-zero. +** +** This routine can fail if it is unable to load a collating sequence +** required for string comparison, or if unable to allocate memory +** for a UTF conversion required for comparison. The error is stored +** in the pParse structure. +*/ +static int whereEqualScanEst( + Parse *pParse, /* Parsing & code generating context */ + WhereLoopBuilder *pBuilder, + Expr *pExpr, /* Expression for VALUE in the x=VALUE constraint */ + tRowcnt *pnRow /* Write the revised row estimate here */ +){ + Index *p = pBuilder->pNew->u.btree.pIndex; + int nEq = pBuilder->pNew->u.btree.nEq; + UnpackedRecord *pRec = pBuilder->pRec; + int rc; /* Subfunction return code */ + tRowcnt a[2]; /* Statistics */ + int bOk; + + assert( nEq>=1 ); + assert( nEq<=p->nColumn ); + assert( p->aSample!=0 ); + assert( p->nSample>0 ); + assert( pBuilder->nRecValidnRecValid<(nEq-1) ){ + return SQLITE_NOTFOUND; + } + + /* This is an optimization only. The call to sqlite3Stat4ProbeSetValue() + ** below would return the same value. */ + if( nEq>=p->nColumn ){ + *pnRow = 1; + return SQLITE_OK; + } + + rc = sqlite3Stat4ProbeSetValue(pParse, p, &pRec, pExpr, 1, nEq-1, &bOk); + pBuilder->pRec = pRec; + if( rc!=SQLITE_OK ) return rc; + if( bOk==0 ) return SQLITE_NOTFOUND; + pBuilder->nRecValid = nEq; + + whereKeyStats(pParse, p, pRec, 0, a); + WHERETRACE(0x10,("equality scan regions %s(%d): %d\n", + p->zName, nEq-1, (int)a[1])); + *pnRow = a[1]; + + return rc; +} +#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */ + +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +/* +** Estimate the number of rows that will be returned based on +** an IN constraint where the right-hand side of the IN operator +** is a list of values. Example: +** +** WHERE x IN (1,2,3,4) +** +** Write the estimated row count into *pnRow and return SQLITE_OK. +** If unable to make an estimate, leave *pnRow unchanged and return +** non-zero. +** +** This routine can fail if it is unable to load a collating sequence +** required for string comparison, or if unable to allocate memory +** for a UTF conversion required for comparison. The error is stored +** in the pParse structure. +*/ +static int whereInScanEst( + Parse *pParse, /* Parsing & code generating context */ + WhereLoopBuilder *pBuilder, + ExprList *pList, /* The value list on the RHS of "x IN (v1,v2,v3,...)" */ + tRowcnt *pnRow /* Write the revised row estimate here */ +){ + Index *p = pBuilder->pNew->u.btree.pIndex; + i64 nRow0 = sqlite3LogEstToInt(p->aiRowLogEst[0]); + int nRecValid = pBuilder->nRecValid; + int rc = SQLITE_OK; /* Subfunction return code */ + tRowcnt nEst; /* Number of rows for a single term */ + tRowcnt nRowEst = 0; /* New estimate of the number of rows */ + int i; /* Loop counter */ + + assert( p->aSample!=0 ); + for(i=0; rc==SQLITE_OK && inExpr; i++){ + nEst = nRow0; + rc = whereEqualScanEst(pParse, pBuilder, pList->a[i].pExpr, &nEst); + nRowEst += nEst; + pBuilder->nRecValid = nRecValid; + } + + if( rc==SQLITE_OK ){ + if( nRowEst > nRow0 ) nRowEst = nRow0; + *pnRow = nRowEst; + WHERETRACE(0x10,("IN row estimate: est=%d\n", nRowEst)); + } + assert( pBuilder->nRecValid==nRecValid ); + return rc; +} +#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */ + + +#ifdef WHERETRACE_ENABLED +/* +** Print the content of a WhereTerm object +*/ +static void whereTermPrint(WhereTerm *pTerm, int iTerm){ + if( pTerm==0 ){ + sqlite3DebugPrintf("TERM-%-3d NULL\n", iTerm); + }else{ + char zType[4]; + char zLeft[50]; + memcpy(zType, "...", 4); + if( pTerm->wtFlags & TERM_VIRTUAL ) zType[0] = 'V'; + if( pTerm->eOperator & WO_EQUIV ) zType[1] = 'E'; + if( ExprHasProperty(pTerm->pExpr, EP_FromJoin) ) zType[2] = 'L'; + if( pTerm->eOperator & WO_SINGLE ){ + sqlite3_snprintf(sizeof(zLeft),zLeft,"left={%d:%d}", + pTerm->leftCursor, pTerm->u.leftColumn); + }else if( (pTerm->eOperator & WO_OR)!=0 && pTerm->u.pOrInfo!=0 ){ + sqlite3_snprintf(sizeof(zLeft),zLeft,"indexable=0x%lld", + pTerm->u.pOrInfo->indexable); + }else{ + sqlite3_snprintf(sizeof(zLeft),zLeft,"left=%d", pTerm->leftCursor); + } + sqlite3DebugPrintf( + "TERM-%-3d %p %s %-12s prob=%-3d op=0x%03x wtFlags=0x%04x", + iTerm, pTerm, zType, zLeft, pTerm->truthProb, + pTerm->eOperator, pTerm->wtFlags); + if( pTerm->iField ){ + sqlite3DebugPrintf(" iField=%d\n", pTerm->iField); + }else{ + sqlite3DebugPrintf("\n"); + } + sqlite3TreeViewExpr(0, pTerm->pExpr, 0); + } +} +#endif + +#ifdef WHERETRACE_ENABLED +/* +** Show the complete content of a WhereClause +*/ +SQLITE_PRIVATE void sqlite3WhereClausePrint(WhereClause *pWC){ + int i; + for(i=0; inTerm; i++){ + whereTermPrint(&pWC->a[i], i); + } +} +#endif + +#ifdef WHERETRACE_ENABLED +/* +** Print a WhereLoop object for debugging purposes +*/ +static void whereLoopPrint(WhereLoop *p, WhereClause *pWC){ + WhereInfo *pWInfo = pWC->pWInfo; + int nb = 1+(pWInfo->pTabList->nSrc+3)/4; + struct SrcList_item *pItem = pWInfo->pTabList->a + p->iTab; + Table *pTab = pItem->pTab; + Bitmask mAll = (((Bitmask)1)<<(nb*4)) - 1; + sqlite3DebugPrintf("%c%2d.%0*llx.%0*llx", p->cId, + p->iTab, nb, p->maskSelf, nb, p->prereq & mAll); + sqlite3DebugPrintf(" %12s", + pItem->zAlias ? pItem->zAlias : pTab->zName); + if( (p->wsFlags & WHERE_VIRTUALTABLE)==0 ){ + const char *zName; + if( p->u.btree.pIndex && (zName = p->u.btree.pIndex->zName)!=0 ){ + if( strncmp(zName, "sqlite_autoindex_", 17)==0 ){ + int i = sqlite3Strlen30(zName) - 1; + while( zName[i]!='_' ) i--; + zName += i; + } + sqlite3DebugPrintf(".%-16s %2d", zName, p->u.btree.nEq); + }else{ + sqlite3DebugPrintf("%20s",""); + } + }else{ + char *z; + if( p->u.vtab.idxStr ){ + z = sqlite3_mprintf("(%d,\"%s\",%x)", + p->u.vtab.idxNum, p->u.vtab.idxStr, p->u.vtab.omitMask); + }else{ + z = sqlite3_mprintf("(%d,%x)", p->u.vtab.idxNum, p->u.vtab.omitMask); + } + sqlite3DebugPrintf(" %-19s", z); + sqlite3_free(z); + } + if( p->wsFlags & WHERE_SKIPSCAN ){ + sqlite3DebugPrintf(" f %05x %d-%d", p->wsFlags, p->nLTerm,p->nSkip); + }else{ + sqlite3DebugPrintf(" f %05x N %d", p->wsFlags, p->nLTerm); + } + sqlite3DebugPrintf(" cost %d,%d,%d\n", p->rSetup, p->rRun, p->nOut); + if( p->nLTerm && (sqlite3WhereTrace & 0x100)!=0 ){ + int i; + for(i=0; inLTerm; i++){ + whereTermPrint(p->aLTerm[i], i); + } + } +} +#endif + +/* +** Convert bulk memory into a valid WhereLoop that can be passed +** to whereLoopClear harmlessly. +*/ +static void whereLoopInit(WhereLoop *p){ + p->aLTerm = p->aLTermSpace; + p->nLTerm = 0; + p->nLSlot = ArraySize(p->aLTermSpace); + p->wsFlags = 0; +} + +/* +** Clear the WhereLoop.u union. Leave WhereLoop.pLTerm intact. +*/ +static void whereLoopClearUnion(sqlite3 *db, WhereLoop *p){ + if( p->wsFlags & (WHERE_VIRTUALTABLE|WHERE_AUTO_INDEX) ){ + if( (p->wsFlags & WHERE_VIRTUALTABLE)!=0 && p->u.vtab.needFree ){ + sqlite3_free(p->u.vtab.idxStr); + p->u.vtab.needFree = 0; + p->u.vtab.idxStr = 0; + }else if( (p->wsFlags & WHERE_AUTO_INDEX)!=0 && p->u.btree.pIndex!=0 ){ + sqlite3DbFree(db, p->u.btree.pIndex->zColAff); + sqlite3DbFree(db, p->u.btree.pIndex); + p->u.btree.pIndex = 0; + } + } +} + +/* +** Deallocate internal memory used by a WhereLoop object +*/ +static void whereLoopClear(sqlite3 *db, WhereLoop *p){ + if( p->aLTerm!=p->aLTermSpace ) sqlite3DbFree(db, p->aLTerm); + whereLoopClearUnion(db, p); + whereLoopInit(p); +} + +/* +** Increase the memory allocation for pLoop->aLTerm[] to be at least n. +*/ +static int whereLoopResize(sqlite3 *db, WhereLoop *p, int n){ + WhereTerm **paNew; + if( p->nLSlot>=n ) return SQLITE_OK; + n = (n+7)&~7; + paNew = sqlite3DbMallocRawNN(db, sizeof(p->aLTerm[0])*n); + if( paNew==0 ) return SQLITE_NOMEM_BKPT; + memcpy(paNew, p->aLTerm, sizeof(p->aLTerm[0])*p->nLSlot); + if( p->aLTerm!=p->aLTermSpace ) sqlite3DbFree(db, p->aLTerm); + p->aLTerm = paNew; + p->nLSlot = n; + return SQLITE_OK; +} + +/* +** Transfer content from the second pLoop into the first. +*/ +static int whereLoopXfer(sqlite3 *db, WhereLoop *pTo, WhereLoop *pFrom){ + whereLoopClearUnion(db, pTo); + if( whereLoopResize(db, pTo, pFrom->nLTerm) ){ + memset(&pTo->u, 0, sizeof(pTo->u)); + return SQLITE_NOMEM_BKPT; + } + memcpy(pTo, pFrom, WHERE_LOOP_XFER_SZ); + memcpy(pTo->aLTerm, pFrom->aLTerm, pTo->nLTerm*sizeof(pTo->aLTerm[0])); + if( pFrom->wsFlags & WHERE_VIRTUALTABLE ){ + pFrom->u.vtab.needFree = 0; + }else if( (pFrom->wsFlags & WHERE_AUTO_INDEX)!=0 ){ + pFrom->u.btree.pIndex = 0; + } + return SQLITE_OK; +} + +/* +** Delete a WhereLoop object +*/ +static void whereLoopDelete(sqlite3 *db, WhereLoop *p){ + whereLoopClear(db, p); + sqlite3DbFree(db, p); +} + +/* +** Free a WhereInfo structure +*/ +static void whereInfoFree(sqlite3 *db, WhereInfo *pWInfo){ + if( ALWAYS(pWInfo) ){ + int i; + for(i=0; inLevel; i++){ + WhereLevel *pLevel = &pWInfo->a[i]; + if( pLevel->pWLoop && (pLevel->pWLoop->wsFlags & WHERE_IN_ABLE) ){ + sqlite3DbFree(db, pLevel->u.in.aInLoop); + } + } + sqlite3WhereClauseClear(&pWInfo->sWC); + while( pWInfo->pLoops ){ + WhereLoop *p = pWInfo->pLoops; + pWInfo->pLoops = p->pNextLoop; + whereLoopDelete(db, p); + } + sqlite3DbFree(db, pWInfo); + } +} + +/* +** Return TRUE if all of the following are true: +** +** (1) X has the same or lower cost that Y +** (2) X is a proper subset of Y +** (3) X skips at least as many columns as Y +** +** By "proper subset" we mean that X uses fewer WHERE clause terms +** than Y and that every WHERE clause term used by X is also used +** by Y. +** +** If X is a proper subset of Y then Y is a better choice and ought +** to have a lower cost. This routine returns TRUE when that cost +** relationship is inverted and needs to be adjusted. The third rule +** was added because if X uses skip-scan less than Y it still might +** deserve a lower cost even if it is a proper subset of Y. +*/ +static int whereLoopCheaperProperSubset( + const WhereLoop *pX, /* First WhereLoop to compare */ + const WhereLoop *pY /* Compare against this WhereLoop */ +){ + int i, j; + if( pX->nLTerm-pX->nSkip >= pY->nLTerm-pY->nSkip ){ + return 0; /* X is not a subset of Y */ + } + if( pY->nSkip > pX->nSkip ) return 0; + if( pX->rRun >= pY->rRun ){ + if( pX->rRun > pY->rRun ) return 0; /* X costs more than Y */ + if( pX->nOut > pY->nOut ) return 0; /* X costs more than Y */ + } + for(i=pX->nLTerm-1; i>=0; i--){ + if( pX->aLTerm[i]==0 ) continue; + for(j=pY->nLTerm-1; j>=0; j--){ + if( pY->aLTerm[j]==pX->aLTerm[i] ) break; + } + if( j<0 ) return 0; /* X not a subset of Y since term X[i] not used by Y */ + } + return 1; /* All conditions meet */ +} + +/* +** Try to adjust the cost of WhereLoop pTemplate upwards or downwards so +** that: +** +** (1) pTemplate costs less than any other WhereLoops that are a proper +** subset of pTemplate +** +** (2) pTemplate costs more than any other WhereLoops for which pTemplate +** is a proper subset. +** +** To say "WhereLoop X is a proper subset of Y" means that X uses fewer +** WHERE clause terms than Y and that every WHERE clause term used by X is +** also used by Y. +*/ +static void whereLoopAdjustCost(const WhereLoop *p, WhereLoop *pTemplate){ + if( (pTemplate->wsFlags & WHERE_INDEXED)==0 ) return; + for(; p; p=p->pNextLoop){ + if( p->iTab!=pTemplate->iTab ) continue; + if( (p->wsFlags & WHERE_INDEXED)==0 ) continue; + if( whereLoopCheaperProperSubset(p, pTemplate) ){ + /* Adjust pTemplate cost downward so that it is cheaper than its + ** subset p. */ + WHERETRACE(0x80,("subset cost adjustment %d,%d to %d,%d\n", + pTemplate->rRun, pTemplate->nOut, p->rRun, p->nOut-1)); + pTemplate->rRun = p->rRun; + pTemplate->nOut = p->nOut - 1; + }else if( whereLoopCheaperProperSubset(pTemplate, p) ){ + /* Adjust pTemplate cost upward so that it is costlier than p since + ** pTemplate is a proper subset of p */ + WHERETRACE(0x80,("subset cost adjustment %d,%d to %d,%d\n", + pTemplate->rRun, pTemplate->nOut, p->rRun, p->nOut+1)); + pTemplate->rRun = p->rRun; + pTemplate->nOut = p->nOut + 1; + } + } +} + +/* +** Search the list of WhereLoops in *ppPrev looking for one that can be +** supplanted by pTemplate. +** +** Return NULL if the WhereLoop list contains an entry that can supplant +** pTemplate, in other words if pTemplate does not belong on the list. +** +** If pX is a WhereLoop that pTemplate can supplant, then return the +** link that points to pX. +** +** If pTemplate cannot supplant any existing element of the list but needs +** to be added to the list, then return a pointer to the tail of the list. +*/ +static WhereLoop **whereLoopFindLesser( + WhereLoop **ppPrev, + const WhereLoop *pTemplate +){ + WhereLoop *p; + for(p=(*ppPrev); p; ppPrev=&p->pNextLoop, p=*ppPrev){ + if( p->iTab!=pTemplate->iTab || p->iSortIdx!=pTemplate->iSortIdx ){ + /* If either the iTab or iSortIdx values for two WhereLoop are different + ** then those WhereLoops need to be considered separately. Neither is + ** a candidate to replace the other. */ + continue; + } + /* In the current implementation, the rSetup value is either zero + ** or the cost of building an automatic index (NlogN) and the NlogN + ** is the same for compatible WhereLoops. */ + assert( p->rSetup==0 || pTemplate->rSetup==0 + || p->rSetup==pTemplate->rSetup ); + + /* whereLoopAddBtree() always generates and inserts the automatic index + ** case first. Hence compatible candidate WhereLoops never have a larger + ** rSetup. Call this SETUP-INVARIANT */ + assert( p->rSetup>=pTemplate->rSetup ); + + /* Any loop using an appliation-defined index (or PRIMARY KEY or + ** UNIQUE constraint) with one or more == constraints is better + ** than an automatic index. Unless it is a skip-scan. */ + if( (p->wsFlags & WHERE_AUTO_INDEX)!=0 + && (pTemplate->nSkip)==0 + && (pTemplate->wsFlags & WHERE_INDEXED)!=0 + && (pTemplate->wsFlags & WHERE_COLUMN_EQ)!=0 + && (p->prereq & pTemplate->prereq)==pTemplate->prereq + ){ + break; + } + + /* If existing WhereLoop p is better than pTemplate, pTemplate can be + ** discarded. WhereLoop p is better if: + ** (1) p has no more dependencies than pTemplate, and + ** (2) p has an equal or lower cost than pTemplate + */ + if( (p->prereq & pTemplate->prereq)==p->prereq /* (1) */ + && p->rSetup<=pTemplate->rSetup /* (2a) */ + && p->rRun<=pTemplate->rRun /* (2b) */ + && p->nOut<=pTemplate->nOut /* (2c) */ + ){ + return 0; /* Discard pTemplate */ + } + + /* If pTemplate is always better than p, then cause p to be overwritten + ** with pTemplate. pTemplate is better than p if: + ** (1) pTemplate has no more dependences than p, and + ** (2) pTemplate has an equal or lower cost than p. + */ + if( (p->prereq & pTemplate->prereq)==pTemplate->prereq /* (1) */ + && p->rRun>=pTemplate->rRun /* (2a) */ + && p->nOut>=pTemplate->nOut /* (2b) */ + ){ + assert( p->rSetup>=pTemplate->rSetup ); /* SETUP-INVARIANT above */ + break; /* Cause p to be overwritten by pTemplate */ + } + } + return ppPrev; +} + +/* +** Insert or replace a WhereLoop entry using the template supplied. +** +** An existing WhereLoop entry might be overwritten if the new template +** is better and has fewer dependencies. Or the template will be ignored +** and no insert will occur if an existing WhereLoop is faster and has +** fewer dependencies than the template. Otherwise a new WhereLoop is +** added based on the template. +** +** If pBuilder->pOrSet is not NULL then we care about only the +** prerequisites and rRun and nOut costs of the N best loops. That +** information is gathered in the pBuilder->pOrSet object. This special +** processing mode is used only for OR clause processing. +** +** When accumulating multiple loops (when pBuilder->pOrSet is NULL) we +** still might overwrite similar loops with the new template if the +** new template is better. Loops may be overwritten if the following +** conditions are met: +** +** (1) They have the same iTab. +** (2) They have the same iSortIdx. +** (3) The template has same or fewer dependencies than the current loop +** (4) The template has the same or lower cost than the current loop +*/ +static int whereLoopInsert(WhereLoopBuilder *pBuilder, WhereLoop *pTemplate){ + WhereLoop **ppPrev, *p; + WhereInfo *pWInfo = pBuilder->pWInfo; + sqlite3 *db = pWInfo->pParse->db; + int rc; + + /* If pBuilder->pOrSet is defined, then only keep track of the costs + ** and prereqs. + */ + if( pBuilder->pOrSet!=0 ){ + if( pTemplate->nLTerm ){ +#if WHERETRACE_ENABLED + u16 n = pBuilder->pOrSet->n; + int x = +#endif + whereOrInsert(pBuilder->pOrSet, pTemplate->prereq, pTemplate->rRun, + pTemplate->nOut); +#if WHERETRACE_ENABLED /* 0x8 */ + if( sqlite3WhereTrace & 0x8 ){ + sqlite3DebugPrintf(x?" or-%d: ":" or-X: ", n); + whereLoopPrint(pTemplate, pBuilder->pWC); + } +#endif + } + return SQLITE_OK; + } + + /* Look for an existing WhereLoop to replace with pTemplate + */ + whereLoopAdjustCost(pWInfo->pLoops, pTemplate); + ppPrev = whereLoopFindLesser(&pWInfo->pLoops, pTemplate); + + if( ppPrev==0 ){ + /* There already exists a WhereLoop on the list that is better + ** than pTemplate, so just ignore pTemplate */ +#if WHERETRACE_ENABLED /* 0x8 */ + if( sqlite3WhereTrace & 0x8 ){ + sqlite3DebugPrintf(" skip: "); + whereLoopPrint(pTemplate, pBuilder->pWC); + } +#endif + return SQLITE_OK; + }else{ + p = *ppPrev; + } + + /* If we reach this point it means that either p[] should be overwritten + ** with pTemplate[] if p[] exists, or if p==NULL then allocate a new + ** WhereLoop and insert it. + */ +#if WHERETRACE_ENABLED /* 0x8 */ + if( sqlite3WhereTrace & 0x8 ){ + if( p!=0 ){ + sqlite3DebugPrintf("replace: "); + whereLoopPrint(p, pBuilder->pWC); + } + sqlite3DebugPrintf(" add: "); + whereLoopPrint(pTemplate, pBuilder->pWC); + } +#endif + if( p==0 ){ + /* Allocate a new WhereLoop to add to the end of the list */ + *ppPrev = p = sqlite3DbMallocRawNN(db, sizeof(WhereLoop)); + if( p==0 ) return SQLITE_NOMEM_BKPT; + whereLoopInit(p); + p->pNextLoop = 0; + }else{ + /* We will be overwriting WhereLoop p[]. But before we do, first + ** go through the rest of the list and delete any other entries besides + ** p[] that are also supplated by pTemplate */ + WhereLoop **ppTail = &p->pNextLoop; + WhereLoop *pToDel; + while( *ppTail ){ + ppTail = whereLoopFindLesser(ppTail, pTemplate); + if( ppTail==0 ) break; + pToDel = *ppTail; + if( pToDel==0 ) break; + *ppTail = pToDel->pNextLoop; +#if WHERETRACE_ENABLED /* 0x8 */ + if( sqlite3WhereTrace & 0x8 ){ + sqlite3DebugPrintf(" delete: "); + whereLoopPrint(pToDel, pBuilder->pWC); + } +#endif + whereLoopDelete(db, pToDel); + } + } + rc = whereLoopXfer(db, p, pTemplate); + if( (p->wsFlags & WHERE_VIRTUALTABLE)==0 ){ + Index *pIndex = p->u.btree.pIndex; + if( pIndex && pIndex->tnum==0 ){ + p->u.btree.pIndex = 0; + } + } + return rc; +} + +/* +** Adjust the WhereLoop.nOut value downward to account for terms of the +** WHERE clause that reference the loop but which are not used by an +** index. +* +** For every WHERE clause term that is not used by the index +** and which has a truth probability assigned by one of the likelihood(), +** likely(), or unlikely() SQL functions, reduce the estimated number +** of output rows by the probability specified. +** +** TUNING: For every WHERE clause term that is not used by the index +** and which does not have an assigned truth probability, heuristics +** described below are used to try to estimate the truth probability. +** TODO --> Perhaps this is something that could be improved by better +** table statistics. +** +** Heuristic 1: Estimate the truth probability as 93.75%. The 93.75% +** value corresponds to -1 in LogEst notation, so this means decrement +** the WhereLoop.nOut field for every such WHERE clause term. +** +** Heuristic 2: If there exists one or more WHERE clause terms of the +** form "x==EXPR" and EXPR is not a constant 0 or 1, then make sure the +** final output row estimate is no greater than 1/4 of the total number +** of rows in the table. In other words, assume that x==EXPR will filter +** out at least 3 out of 4 rows. If EXPR is -1 or 0 or 1, then maybe the +** "x" column is boolean or else -1 or 0 or 1 is a common default value +** on the "x" column and so in that case only cap the output row estimate +** at 1/2 instead of 1/4. +*/ +static void whereLoopOutputAdjust( + WhereClause *pWC, /* The WHERE clause */ + WhereLoop *pLoop, /* The loop to adjust downward */ + LogEst nRow /* Number of rows in the entire table */ +){ + WhereTerm *pTerm, *pX; + Bitmask notAllowed = ~(pLoop->prereq|pLoop->maskSelf); + int i, j, k; + LogEst iReduce = 0; /* pLoop->nOut should not exceed nRow-iReduce */ + + assert( (pLoop->wsFlags & WHERE_AUTO_INDEX)==0 ); + for(i=pWC->nTerm, pTerm=pWC->a; i>0; i--, pTerm++){ + if( (pTerm->wtFlags & TERM_VIRTUAL)!=0 ) break; + if( (pTerm->prereqAll & pLoop->maskSelf)==0 ) continue; + if( (pTerm->prereqAll & notAllowed)!=0 ) continue; + for(j=pLoop->nLTerm-1; j>=0; j--){ + pX = pLoop->aLTerm[j]; + if( pX==0 ) continue; + if( pX==pTerm ) break; + if( pX->iParent>=0 && (&pWC->a[pX->iParent])==pTerm ) break; + } + if( j<0 ){ + if( pTerm->truthProb<=0 ){ + /* If a truth probability is specified using the likelihood() hints, + ** then use the probability provided by the application. */ + pLoop->nOut += pTerm->truthProb; + }else{ + /* In the absence of explicit truth probabilities, use heuristics to + ** guess a reasonable truth probability. */ + pLoop->nOut--; + if( pTerm->eOperator&(WO_EQ|WO_IS) ){ + Expr *pRight = pTerm->pExpr->pRight; + testcase( pTerm->pExpr->op==TK_IS ); + if( sqlite3ExprIsInteger(pRight, &k) && k>=(-1) && k<=1 ){ + k = 10; + }else{ + k = 20; + } + if( iReducenOut > nRow-iReduce ) pLoop->nOut = nRow - iReduce; +} + +/* +** Term pTerm is a vector range comparison operation. The first comparison +** in the vector can be optimized using column nEq of the index. This +** function returns the total number of vector elements that can be used +** as part of the range comparison. +** +** For example, if the query is: +** +** WHERE a = ? AND (b, c, d) > (?, ?, ?) +** +** and the index: +** +** CREATE INDEX ... ON (a, b, c, d, e) +** +** then this function would be invoked with nEq=1. The value returned in +** this case is 3. +*/ +static int whereRangeVectorLen( + Parse *pParse, /* Parsing context */ + int iCur, /* Cursor open on pIdx */ + Index *pIdx, /* The index to be used for a inequality constraint */ + int nEq, /* Number of prior equality constraints on same index */ + WhereTerm *pTerm /* The vector inequality constraint */ +){ + int nCmp = sqlite3ExprVectorSize(pTerm->pExpr->pLeft); + int i; + + nCmp = MIN(nCmp, (pIdx->nColumn - nEq)); + for(i=1; ipExpr->pLeft->x.pList->a[i].pExpr; + Expr *pRhs = pTerm->pExpr->pRight; + if( pRhs->flags & EP_xIsSelect ){ + pRhs = pRhs->x.pSelect->pEList->a[i].pExpr; + }else{ + pRhs = pRhs->x.pList->a[i].pExpr; + } + + /* Check that the LHS of the comparison is a column reference to + ** the right column of the right source table. And that the sort + ** order of the index column is the same as the sort order of the + ** leftmost index column. */ + if( pLhs->op!=TK_COLUMN + || pLhs->iTable!=iCur + || pLhs->iColumn!=pIdx->aiColumn[i+nEq] + || pIdx->aSortOrder[i+nEq]!=pIdx->aSortOrder[nEq] + ){ + break; + } + + testcase( pLhs->iColumn==XN_ROWID ); + aff = sqlite3CompareAffinity(pRhs, sqlite3ExprAffinity(pLhs)); + idxaff = sqlite3TableColumnAffinity(pIdx->pTable, pLhs->iColumn); + if( aff!=idxaff ) break; + + pColl = sqlite3BinaryCompareCollSeq(pParse, pLhs, pRhs); + if( pColl==0 ) break; + if( sqlite3StrICmp(pColl->zName, pIdx->azColl[i+nEq]) ) break; + } + return i; +} + +/* +** Adjust the cost C by the costMult facter T. This only occurs if +** compiled with -DSQLITE_ENABLE_COSTMULT +*/ +#ifdef SQLITE_ENABLE_COSTMULT +# define ApplyCostMultiplier(C,T) C += T +#else +# define ApplyCostMultiplier(C,T) +#endif + +/* +** We have so far matched pBuilder->pNew->u.btree.nEq terms of the +** index pIndex. Try to match one more. +** +** When this function is called, pBuilder->pNew->nOut contains the +** number of rows expected to be visited by filtering using the nEq +** terms only. If it is modified, this value is restored before this +** function returns. +** +** If pProbe->tnum==0, that means pIndex is a fake index used for the +** INTEGER PRIMARY KEY. +*/ +static int whereLoopAddBtreeIndex( + WhereLoopBuilder *pBuilder, /* The WhereLoop factory */ + struct SrcList_item *pSrc, /* FROM clause term being analyzed */ + Index *pProbe, /* An index on pSrc */ + LogEst nInMul /* log(Number of iterations due to IN) */ +){ + WhereInfo *pWInfo = pBuilder->pWInfo; /* WHERE analyse context */ + Parse *pParse = pWInfo->pParse; /* Parsing context */ + sqlite3 *db = pParse->db; /* Database connection malloc context */ + WhereLoop *pNew; /* Template WhereLoop under construction */ + WhereTerm *pTerm; /* A WhereTerm under consideration */ + int opMask; /* Valid operators for constraints */ + WhereScan scan; /* Iterator for WHERE terms */ + Bitmask saved_prereq; /* Original value of pNew->prereq */ + u16 saved_nLTerm; /* Original value of pNew->nLTerm */ + u16 saved_nEq; /* Original value of pNew->u.btree.nEq */ + u16 saved_nBtm; /* Original value of pNew->u.btree.nBtm */ + u16 saved_nTop; /* Original value of pNew->u.btree.nTop */ + u16 saved_nSkip; /* Original value of pNew->nSkip */ + u32 saved_wsFlags; /* Original value of pNew->wsFlags */ + LogEst saved_nOut; /* Original value of pNew->nOut */ + int rc = SQLITE_OK; /* Return code */ + LogEst rSize; /* Number of rows in the table */ + LogEst rLogSize; /* Logarithm of table size */ + WhereTerm *pTop = 0, *pBtm = 0; /* Top and bottom range constraints */ + + pNew = pBuilder->pNew; + if( db->mallocFailed ) return SQLITE_NOMEM_BKPT; + WHERETRACE(0x800, ("BEGIN addBtreeIdx(%s), nEq=%d\n", + pProbe->zName, pNew->u.btree.nEq)); + + assert( (pNew->wsFlags & WHERE_VIRTUALTABLE)==0 ); + assert( (pNew->wsFlags & WHERE_TOP_LIMIT)==0 ); + if( pNew->wsFlags & WHERE_BTM_LIMIT ){ + opMask = WO_LT|WO_LE; + }else{ + assert( pNew->u.btree.nBtm==0 ); + opMask = WO_EQ|WO_IN|WO_GT|WO_GE|WO_LT|WO_LE|WO_ISNULL|WO_IS; + } + if( pProbe->bUnordered ) opMask &= ~(WO_GT|WO_GE|WO_LT|WO_LE); + + assert( pNew->u.btree.nEqnColumn ); + + saved_nEq = pNew->u.btree.nEq; + saved_nBtm = pNew->u.btree.nBtm; + saved_nTop = pNew->u.btree.nTop; + saved_nSkip = pNew->nSkip; + saved_nLTerm = pNew->nLTerm; + saved_wsFlags = pNew->wsFlags; + saved_prereq = pNew->prereq; + saved_nOut = pNew->nOut; + pTerm = whereScanInit(&scan, pBuilder->pWC, pSrc->iCursor, saved_nEq, + opMask, pProbe); + pNew->rSetup = 0; + rSize = pProbe->aiRowLogEst[0]; + rLogSize = estLog(rSize); + for(; rc==SQLITE_OK && pTerm!=0; pTerm = whereScanNext(&scan)){ + u16 eOp = pTerm->eOperator; /* Shorthand for pTerm->eOperator */ + LogEst rCostIdx; + LogEst nOutUnadjusted; /* nOut before IN() and WHERE adjustments */ + int nIn = 0; +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 + int nRecValid = pBuilder->nRecValid; +#endif + if( (eOp==WO_ISNULL || (pTerm->wtFlags&TERM_VNULL)!=0) + && indexColumnNotNull(pProbe, saved_nEq) + ){ + continue; /* ignore IS [NOT] NULL constraints on NOT NULL columns */ + } + if( pTerm->prereqRight & pNew->maskSelf ) continue; + + /* Do not allow the upper bound of a LIKE optimization range constraint + ** to mix with a lower range bound from some other source */ + if( pTerm->wtFlags & TERM_LIKEOPT && pTerm->eOperator==WO_LT ) continue; + + /* Do not allow IS constraints from the WHERE clause to be used by the + ** right table of a LEFT JOIN. Only constraints in the ON clause are + ** allowed */ + if( (pSrc->fg.jointype & JT_LEFT)!=0 + && !ExprHasProperty(pTerm->pExpr, EP_FromJoin) + && (eOp & (WO_IS|WO_ISNULL))!=0 + ){ + testcase( eOp & WO_IS ); + testcase( eOp & WO_ISNULL ); + continue; + } + + pNew->wsFlags = saved_wsFlags; + pNew->u.btree.nEq = saved_nEq; + pNew->u.btree.nBtm = saved_nBtm; + pNew->u.btree.nTop = saved_nTop; + pNew->nLTerm = saved_nLTerm; + if( whereLoopResize(db, pNew, pNew->nLTerm+1) ) break; /* OOM */ + pNew->aLTerm[pNew->nLTerm++] = pTerm; + pNew->prereq = (saved_prereq | pTerm->prereqRight) & ~pNew->maskSelf; + + assert( nInMul==0 + || (pNew->wsFlags & WHERE_COLUMN_NULL)!=0 + || (pNew->wsFlags & WHERE_COLUMN_IN)!=0 + || (pNew->wsFlags & WHERE_SKIPSCAN)!=0 + ); + + if( eOp & WO_IN ){ + Expr *pExpr = pTerm->pExpr; + pNew->wsFlags |= WHERE_COLUMN_IN; + if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + /* "x IN (SELECT ...)": TUNING: the SELECT returns 25 rows */ + int i; + nIn = 46; assert( 46==sqlite3LogEst(25) ); + + /* The expression may actually be of the form (x, y) IN (SELECT...). + ** In this case there is a separate term for each of (x) and (y). + ** However, the nIn multiplier should only be applied once, not once + ** for each such term. The following loop checks that pTerm is the + ** first such term in use, and sets nIn back to 0 if it is not. */ + for(i=0; inLTerm-1; i++){ + if( pNew->aLTerm[i] && pNew->aLTerm[i]->pExpr==pExpr ) nIn = 0; + } + }else if( ALWAYS(pExpr->x.pList && pExpr->x.pList->nExpr) ){ + /* "x IN (value, value, ...)" */ + nIn = sqlite3LogEst(pExpr->x.pList->nExpr); + assert( nIn>0 ); /* RHS always has 2 or more terms... The parser + ** changes "x IN (?)" into "x=?". */ + } + }else if( eOp & (WO_EQ|WO_IS) ){ + int iCol = pProbe->aiColumn[saved_nEq]; + pNew->wsFlags |= WHERE_COLUMN_EQ; + assert( saved_nEq==pNew->u.btree.nEq ); + if( iCol==XN_ROWID + || (iCol>0 && nInMul==0 && saved_nEq==pProbe->nKeyCol-1) + ){ + if( iCol>=0 && pProbe->uniqNotNull==0 ){ + pNew->wsFlags |= WHERE_UNQ_WANTED; + }else{ + pNew->wsFlags |= WHERE_ONEROW; + } + } + }else if( eOp & WO_ISNULL ){ + pNew->wsFlags |= WHERE_COLUMN_NULL; + }else if( eOp & (WO_GT|WO_GE) ){ + testcase( eOp & WO_GT ); + testcase( eOp & WO_GE ); + pNew->wsFlags |= WHERE_COLUMN_RANGE|WHERE_BTM_LIMIT; + pNew->u.btree.nBtm = whereRangeVectorLen( + pParse, pSrc->iCursor, pProbe, saved_nEq, pTerm + ); + pBtm = pTerm; + pTop = 0; + if( pTerm->wtFlags & TERM_LIKEOPT ){ + /* Range contraints that come from the LIKE optimization are + ** always used in pairs. */ + pTop = &pTerm[1]; + assert( (pTop-(pTerm->pWC->a))pWC->nTerm ); + assert( pTop->wtFlags & TERM_LIKEOPT ); + assert( pTop->eOperator==WO_LT ); + if( whereLoopResize(db, pNew, pNew->nLTerm+1) ) break; /* OOM */ + pNew->aLTerm[pNew->nLTerm++] = pTop; + pNew->wsFlags |= WHERE_TOP_LIMIT; + pNew->u.btree.nTop = 1; + } + }else{ + assert( eOp & (WO_LT|WO_LE) ); + testcase( eOp & WO_LT ); + testcase( eOp & WO_LE ); + pNew->wsFlags |= WHERE_COLUMN_RANGE|WHERE_TOP_LIMIT; + pNew->u.btree.nTop = whereRangeVectorLen( + pParse, pSrc->iCursor, pProbe, saved_nEq, pTerm + ); + pTop = pTerm; + pBtm = (pNew->wsFlags & WHERE_BTM_LIMIT)!=0 ? + pNew->aLTerm[pNew->nLTerm-2] : 0; + } + + /* At this point pNew->nOut is set to the number of rows expected to + ** be visited by the index scan before considering term pTerm, or the + ** values of nIn and nInMul. In other words, assuming that all + ** "x IN(...)" terms are replaced with "x = ?". This block updates + ** the value of pNew->nOut to account for pTerm (but not nIn/nInMul). */ + assert( pNew->nOut==saved_nOut ); + if( pNew->wsFlags & WHERE_COLUMN_RANGE ){ + /* Adjust nOut using stat3/stat4 data. Or, if there is no stat3/stat4 + ** data, using some other estimate. */ + whereRangeScanEst(pParse, pBuilder, pBtm, pTop, pNew); + }else{ + int nEq = ++pNew->u.btree.nEq; + assert( eOp & (WO_ISNULL|WO_EQ|WO_IN|WO_IS) ); + + assert( pNew->nOut==saved_nOut ); + if( pTerm->truthProb<=0 && pProbe->aiColumn[saved_nEq]>=0 ){ + assert( (eOp & WO_IN) || nIn==0 ); + testcase( eOp & WO_IN ); + pNew->nOut += pTerm->truthProb; + pNew->nOut -= nIn; + }else{ +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 + tRowcnt nOut = 0; + if( nInMul==0 + && pProbe->nSample + && pNew->u.btree.nEq<=pProbe->nSampleCol + && ((eOp & WO_IN)==0 || !ExprHasProperty(pTerm->pExpr, EP_xIsSelect)) + ){ + Expr *pExpr = pTerm->pExpr; + if( (eOp & (WO_EQ|WO_ISNULL|WO_IS))!=0 ){ + testcase( eOp & WO_EQ ); + testcase( eOp & WO_IS ); + testcase( eOp & WO_ISNULL ); + rc = whereEqualScanEst(pParse, pBuilder, pExpr->pRight, &nOut); + }else{ + rc = whereInScanEst(pParse, pBuilder, pExpr->x.pList, &nOut); + } + if( rc==SQLITE_NOTFOUND ) rc = SQLITE_OK; + if( rc!=SQLITE_OK ) break; /* Jump out of the pTerm loop */ + if( nOut ){ + pNew->nOut = sqlite3LogEst(nOut); + if( pNew->nOut>saved_nOut ) pNew->nOut = saved_nOut; + pNew->nOut -= nIn; + } + } + if( nOut==0 ) +#endif + { + pNew->nOut += (pProbe->aiRowLogEst[nEq] - pProbe->aiRowLogEst[nEq-1]); + if( eOp & WO_ISNULL ){ + /* TUNING: If there is no likelihood() value, assume that a + ** "col IS NULL" expression matches twice as many rows + ** as (col=?). */ + pNew->nOut += 10; + } + } + } + } + + /* Set rCostIdx to the cost of visiting selected rows in index. Add + ** it to pNew->rRun, which is currently set to the cost of the index + ** seek only. Then, if this is a non-covering index, add the cost of + ** visiting the rows in the main table. */ + rCostIdx = pNew->nOut + 1 + (15*pProbe->szIdxRow)/pSrc->pTab->szTabRow; + pNew->rRun = sqlite3LogEstAdd(rLogSize, rCostIdx); + if( (pNew->wsFlags & (WHERE_IDX_ONLY|WHERE_IPK))==0 ){ + pNew->rRun = sqlite3LogEstAdd(pNew->rRun, pNew->nOut + 16); + } + ApplyCostMultiplier(pNew->rRun, pProbe->pTable->costMult); + + nOutUnadjusted = pNew->nOut; + pNew->rRun += nInMul + nIn; + pNew->nOut += nInMul + nIn; + whereLoopOutputAdjust(pBuilder->pWC, pNew, rSize); + rc = whereLoopInsert(pBuilder, pNew); + + if( pNew->wsFlags & WHERE_COLUMN_RANGE ){ + pNew->nOut = saved_nOut; + }else{ + pNew->nOut = nOutUnadjusted; + } + + if( (pNew->wsFlags & WHERE_TOP_LIMIT)==0 + && pNew->u.btree.nEqnColumn + ){ + whereLoopAddBtreeIndex(pBuilder, pSrc, pProbe, nInMul+nIn); + } + pNew->nOut = saved_nOut; +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 + pBuilder->nRecValid = nRecValid; +#endif + } + pNew->prereq = saved_prereq; + pNew->u.btree.nEq = saved_nEq; + pNew->u.btree.nBtm = saved_nBtm; + pNew->u.btree.nTop = saved_nTop; + pNew->nSkip = saved_nSkip; + pNew->wsFlags = saved_wsFlags; + pNew->nOut = saved_nOut; + pNew->nLTerm = saved_nLTerm; + + /* Consider using a skip-scan if there are no WHERE clause constraints + ** available for the left-most terms of the index, and if the average + ** number of repeats in the left-most terms is at least 18. + ** + ** The magic number 18 is selected on the basis that scanning 17 rows + ** is almost always quicker than an index seek (even though if the index + ** contains fewer than 2^17 rows we assume otherwise in other parts of + ** the code). And, even if it is not, it should not be too much slower. + ** On the other hand, the extra seeks could end up being significantly + ** more expensive. */ + assert( 42==sqlite3LogEst(18) ); + if( saved_nEq==saved_nSkip + && saved_nEq+1nKeyCol + && pProbe->noSkipScan==0 + && pProbe->aiRowLogEst[saved_nEq+1]>=42 /* TUNING: Minimum for skip-scan */ + && (rc = whereLoopResize(db, pNew, pNew->nLTerm+1))==SQLITE_OK + ){ + LogEst nIter; + pNew->u.btree.nEq++; + pNew->nSkip++; + pNew->aLTerm[pNew->nLTerm++] = 0; + pNew->wsFlags |= WHERE_SKIPSCAN; + nIter = pProbe->aiRowLogEst[saved_nEq] - pProbe->aiRowLogEst[saved_nEq+1]; + pNew->nOut -= nIter; + /* TUNING: Because uncertainties in the estimates for skip-scan queries, + ** add a 1.375 fudge factor to make skip-scan slightly less likely. */ + nIter += 5; + whereLoopAddBtreeIndex(pBuilder, pSrc, pProbe, nIter + nInMul); + pNew->nOut = saved_nOut; + pNew->u.btree.nEq = saved_nEq; + pNew->nSkip = saved_nSkip; + pNew->wsFlags = saved_wsFlags; + } + + WHERETRACE(0x800, ("END addBtreeIdx(%s), nEq=%d, rc=%d\n", + pProbe->zName, saved_nEq, rc)); + return rc; +} + +/* +** Return True if it is possible that pIndex might be useful in +** implementing the ORDER BY clause in pBuilder. +** +** Return False if pBuilder does not contain an ORDER BY clause or +** if there is no way for pIndex to be useful in implementing that +** ORDER BY clause. +*/ +static int indexMightHelpWithOrderBy( + WhereLoopBuilder *pBuilder, + Index *pIndex, + int iCursor +){ + ExprList *pOB; + ExprList *aColExpr; + int ii, jj; + + if( pIndex->bUnordered ) return 0; + if( (pOB = pBuilder->pWInfo->pOrderBy)==0 ) return 0; + for(ii=0; iinExpr; ii++){ + Expr *pExpr = sqlite3ExprSkipCollate(pOB->a[ii].pExpr); + if( pExpr->op==TK_COLUMN && pExpr->iTable==iCursor ){ + if( pExpr->iColumn<0 ) return 1; + for(jj=0; jjnKeyCol; jj++){ + if( pExpr->iColumn==pIndex->aiColumn[jj] ) return 1; + } + }else if( (aColExpr = pIndex->aColExpr)!=0 ){ + for(jj=0; jjnKeyCol; jj++){ + if( pIndex->aiColumn[jj]!=XN_EXPR ) continue; + if( sqlite3ExprCompare(pExpr,aColExpr->a[jj].pExpr,iCursor)==0 ){ + return 1; + } + } + } + } + return 0; +} + +/* +** Return a bitmask where 1s indicate that the corresponding column of +** the table is used by an index. Only the first 63 columns are considered. +*/ +static Bitmask columnsInIndex(Index *pIdx){ + Bitmask m = 0; + int j; + for(j=pIdx->nColumn-1; j>=0; j--){ + int x = pIdx->aiColumn[j]; + if( x>=0 ){ + testcase( x==BMS-1 ); + testcase( x==BMS-2 ); + if( xop==TK_AND ){ + if( !whereUsablePartialIndex(iTab,pWC,pWhere->pLeft) ) return 0; + pWhere = pWhere->pRight; + } + for(i=0, pTerm=pWC->a; inTerm; i++, pTerm++){ + Expr *pExpr = pTerm->pExpr; + if( sqlite3ExprImpliesExpr(pExpr, pWhere, iTab) + && (!ExprHasProperty(pExpr, EP_FromJoin) || pExpr->iRightJoinTable==iTab) + ){ + return 1; + } + } + return 0; +} + +/* +** Add all WhereLoop objects for a single table of the join where the table +** is identified by pBuilder->pNew->iTab. That table is guaranteed to be +** a b-tree table, not a virtual table. +** +** The costs (WhereLoop.rRun) of the b-tree loops added by this function +** are calculated as follows: +** +** For a full scan, assuming the table (or index) contains nRow rows: +** +** cost = nRow * 3.0 // full-table scan +** cost = nRow * K // scan of covering index +** cost = nRow * (K+3.0) // scan of non-covering index +** +** where K is a value between 1.1 and 3.0 set based on the relative +** estimated average size of the index and table records. +** +** For an index scan, where nVisit is the number of index rows visited +** by the scan, and nSeek is the number of seek operations required on +** the index b-tree: +** +** cost = nSeek * (log(nRow) + K * nVisit) // covering index +** cost = nSeek * (log(nRow) + (K+3.0) * nVisit) // non-covering index +** +** Normally, nSeek is 1. nSeek values greater than 1 come about if the +** WHERE clause includes "x IN (....)" terms used in place of "x=?". Or when +** implicit "x IN (SELECT x FROM tbl)" terms are added for skip-scans. +** +** The estimated values (nRow, nVisit, nSeek) often contain a large amount +** of uncertainty. For this reason, scoring is designed to pick plans that +** "do the least harm" if the estimates are inaccurate. For example, a +** log(nRow) factor is omitted from a non-covering index scan in order to +** bias the scoring in favor of using an index, since the worst-case +** performance of using an index is far better than the worst-case performance +** of a full table scan. +*/ +static int whereLoopAddBtree( + WhereLoopBuilder *pBuilder, /* WHERE clause information */ + Bitmask mPrereq /* Extra prerequesites for using this table */ +){ + WhereInfo *pWInfo; /* WHERE analysis context */ + Index *pProbe; /* An index we are evaluating */ + Index sPk; /* A fake index object for the primary key */ + LogEst aiRowEstPk[2]; /* The aiRowLogEst[] value for the sPk index */ + i16 aiColumnPk = -1; /* The aColumn[] value for the sPk index */ + SrcList *pTabList; /* The FROM clause */ + struct SrcList_item *pSrc; /* The FROM clause btree term to add */ + WhereLoop *pNew; /* Template WhereLoop object */ + int rc = SQLITE_OK; /* Return code */ + int iSortIdx = 1; /* Index number */ + int b; /* A boolean value */ + LogEst rSize; /* number of rows in the table */ + LogEst rLogSize; /* Logarithm of the number of rows in the table */ + WhereClause *pWC; /* The parsed WHERE clause */ + Table *pTab; /* Table being queried */ + + pNew = pBuilder->pNew; + pWInfo = pBuilder->pWInfo; + pTabList = pWInfo->pTabList; + pSrc = pTabList->a + pNew->iTab; + pTab = pSrc->pTab; + pWC = pBuilder->pWC; + assert( !IsVirtual(pSrc->pTab) ); + + if( pSrc->pIBIndex ){ + /* An INDEXED BY clause specifies a particular index to use */ + pProbe = pSrc->pIBIndex; + }else if( !HasRowid(pTab) ){ + pProbe = pTab->pIndex; + }else{ + /* There is no INDEXED BY clause. Create a fake Index object in local + ** variable sPk to represent the rowid primary key index. Make this + ** fake index the first in a chain of Index objects with all of the real + ** indices to follow */ + Index *pFirst; /* First of real indices on the table */ + memset(&sPk, 0, sizeof(Index)); + sPk.nKeyCol = 1; + sPk.nColumn = 1; + sPk.aiColumn = &aiColumnPk; + sPk.aiRowLogEst = aiRowEstPk; + sPk.onError = OE_Replace; + sPk.pTable = pTab; + sPk.szIdxRow = pTab->szTabRow; + aiRowEstPk[0] = pTab->nRowLogEst; + aiRowEstPk[1] = 0; + pFirst = pSrc->pTab->pIndex; + if( pSrc->fg.notIndexed==0 ){ + /* The real indices of the table are only considered if the + ** NOT INDEXED qualifier is omitted from the FROM clause */ + sPk.pNext = pFirst; + } + pProbe = &sPk; + } + rSize = pTab->nRowLogEst; + rLogSize = estLog(rSize); + +#ifndef SQLITE_OMIT_AUTOMATIC_INDEX + /* Automatic indexes */ + if( !pBuilder->pOrSet /* Not part of an OR optimization */ + && (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0 + && (pWInfo->pParse->db->flags & SQLITE_AutoIndex)!=0 + && pSrc->pIBIndex==0 /* Has no INDEXED BY clause */ + && !pSrc->fg.notIndexed /* Has no NOT INDEXED clause */ + && HasRowid(pTab) /* Not WITHOUT ROWID table. (FIXME: Why not?) */ + && !pSrc->fg.isCorrelated /* Not a correlated subquery */ + && !pSrc->fg.isRecursive /* Not a recursive common table expression. */ + ){ + /* Generate auto-index WhereLoops */ + WhereTerm *pTerm; + WhereTerm *pWCEnd = pWC->a + pWC->nTerm; + for(pTerm=pWC->a; rc==SQLITE_OK && pTermprereqRight & pNew->maskSelf ) continue; + if( termCanDriveIndex(pTerm, pSrc, 0) ){ + pNew->u.btree.nEq = 1; + pNew->nSkip = 0; + pNew->u.btree.pIndex = 0; + pNew->nLTerm = 1; + pNew->aLTerm[0] = pTerm; + /* TUNING: One-time cost for computing the automatic index is + ** estimated to be X*N*log2(N) where N is the number of rows in + ** the table being indexed and where X is 7 (LogEst=28) for normal + ** tables or 1.375 (LogEst=4) for views and subqueries. The value + ** of X is smaller for views and subqueries so that the query planner + ** will be more aggressive about generating automatic indexes for + ** those objects, since there is no opportunity to add schema + ** indexes on subqueries and views. */ + pNew->rSetup = rLogSize + rSize + 4; + if( pTab->pSelect==0 && (pTab->tabFlags & TF_Ephemeral)==0 ){ + pNew->rSetup += 24; + } + ApplyCostMultiplier(pNew->rSetup, pTab->costMult); + if( pNew->rSetup<0 ) pNew->rSetup = 0; + /* TUNING: Each index lookup yields 20 rows in the table. This + ** is more than the usual guess of 10 rows, since we have no way + ** of knowing how selective the index will ultimately be. It would + ** not be unreasonable to make this value much larger. */ + pNew->nOut = 43; assert( 43==sqlite3LogEst(20) ); + pNew->rRun = sqlite3LogEstAdd(rLogSize,pNew->nOut); + pNew->wsFlags = WHERE_AUTO_INDEX; + pNew->prereq = mPrereq | pTerm->prereqRight; + rc = whereLoopInsert(pBuilder, pNew); + } + } + } +#endif /* SQLITE_OMIT_AUTOMATIC_INDEX */ + + /* Loop over all indices + */ + for(; rc==SQLITE_OK && pProbe; pProbe=pProbe->pNext, iSortIdx++){ + if( pProbe->pPartIdxWhere!=0 + && !whereUsablePartialIndex(pSrc->iCursor, pWC, pProbe->pPartIdxWhere) ){ + testcase( pNew->iTab!=pSrc->iCursor ); /* See ticket [98d973b8f5] */ + continue; /* Partial index inappropriate for this query */ + } + rSize = pProbe->aiRowLogEst[0]; + pNew->u.btree.nEq = 0; + pNew->u.btree.nBtm = 0; + pNew->u.btree.nTop = 0; + pNew->nSkip = 0; + pNew->nLTerm = 0; + pNew->iSortIdx = 0; + pNew->rSetup = 0; + pNew->prereq = mPrereq; + pNew->nOut = rSize; + pNew->u.btree.pIndex = pProbe; + b = indexMightHelpWithOrderBy(pBuilder, pProbe, pSrc->iCursor); + /* The ONEPASS_DESIRED flags never occurs together with ORDER BY */ + assert( (pWInfo->wctrlFlags & WHERE_ONEPASS_DESIRED)==0 || b==0 ); + if( pProbe->tnum<=0 ){ + /* Integer primary key index */ + pNew->wsFlags = WHERE_IPK; + + /* Full table scan */ + pNew->iSortIdx = b ? iSortIdx : 0; + /* TUNING: Cost of full table scan is (N*3.0). */ + pNew->rRun = rSize + 16; + ApplyCostMultiplier(pNew->rRun, pTab->costMult); + whereLoopOutputAdjust(pWC, pNew, rSize); + rc = whereLoopInsert(pBuilder, pNew); + pNew->nOut = rSize; + if( rc ) break; + }else{ + Bitmask m; + if( pProbe->isCovering ){ + pNew->wsFlags = WHERE_IDX_ONLY | WHERE_INDEXED; + m = 0; + }else{ + m = pSrc->colUsed & ~columnsInIndex(pProbe); + pNew->wsFlags = (m==0) ? (WHERE_IDX_ONLY|WHERE_INDEXED) : WHERE_INDEXED; + } + + /* Full scan via index */ + if( b + || !HasRowid(pTab) + || pProbe->pPartIdxWhere!=0 + || ( m==0 + && pProbe->bUnordered==0 + && (pProbe->szIdxRowszTabRow) + && (pWInfo->wctrlFlags & WHERE_ONEPASS_DESIRED)==0 + && sqlite3GlobalConfig.bUseCis + && OptimizationEnabled(pWInfo->pParse->db, SQLITE_CoverIdxScan) + ) + ){ + pNew->iSortIdx = b ? iSortIdx : 0; + + /* The cost of visiting the index rows is N*K, where K is + ** between 1.1 and 3.0, depending on the relative sizes of the + ** index and table rows. */ + pNew->rRun = rSize + 1 + (15*pProbe->szIdxRow)/pTab->szTabRow; + if( m!=0 ){ + /* If this is a non-covering index scan, add in the cost of + ** doing table lookups. The cost will be 3x the number of + ** lookups. Take into account WHERE clause terms that can be + ** satisfied using just the index, and that do not require a + ** table lookup. */ + LogEst nLookup = rSize + 16; /* Base cost: N*3 */ + int ii; + int iCur = pSrc->iCursor; + WhereClause *pWC2 = &pWInfo->sWC; + for(ii=0; iinTerm; ii++){ + WhereTerm *pTerm = &pWC2->a[ii]; + if( !sqlite3ExprCoveredByIndex(pTerm->pExpr, iCur, pProbe) ){ + break; + } + /* pTerm can be evaluated using just the index. So reduce + ** the expected number of table lookups accordingly */ + if( pTerm->truthProb<=0 ){ + nLookup += pTerm->truthProb; + }else{ + nLookup--; + if( pTerm->eOperator & (WO_EQ|WO_IS) ) nLookup -= 19; + } + } + + pNew->rRun = sqlite3LogEstAdd(pNew->rRun, nLookup); + } + ApplyCostMultiplier(pNew->rRun, pTab->costMult); + whereLoopOutputAdjust(pWC, pNew, rSize); + rc = whereLoopInsert(pBuilder, pNew); + pNew->nOut = rSize; + if( rc ) break; + } + } + + rc = whereLoopAddBtreeIndex(pBuilder, pSrc, pProbe, 0); +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 + sqlite3Stat4ProbeFree(pBuilder->pRec); + pBuilder->nRecValid = 0; + pBuilder->pRec = 0; +#endif + + /* If there was an INDEXED BY clause, then only that one index is + ** considered. */ + if( pSrc->pIBIndex ) break; + } + return rc; +} + +#ifndef SQLITE_OMIT_VIRTUALTABLE + +/* +** Argument pIdxInfo is already populated with all constraints that may +** be used by the virtual table identified by pBuilder->pNew->iTab. This +** function marks a subset of those constraints usable, invokes the +** xBestIndex method and adds the returned plan to pBuilder. +** +** A constraint is marked usable if: +** +** * Argument mUsable indicates that its prerequisites are available, and +** +** * It is not one of the operators specified in the mExclude mask passed +** as the fourth argument (which in practice is either WO_IN or 0). +** +** Argument mPrereq is a mask of tables that must be scanned before the +** virtual table in question. These are added to the plans prerequisites +** before it is added to pBuilder. +** +** Output parameter *pbIn is set to true if the plan added to pBuilder +** uses one or more WO_IN terms, or false otherwise. +*/ +static int whereLoopAddVirtualOne( + WhereLoopBuilder *pBuilder, + Bitmask mPrereq, /* Mask of tables that must be used. */ + Bitmask mUsable, /* Mask of usable tables */ + u16 mExclude, /* Exclude terms using these operators */ + sqlite3_index_info *pIdxInfo, /* Populated object for xBestIndex */ + u16 mNoOmit, /* Do not omit these constraints */ + int *pbIn /* OUT: True if plan uses an IN(...) op */ +){ + WhereClause *pWC = pBuilder->pWC; + struct sqlite3_index_constraint *pIdxCons; + struct sqlite3_index_constraint_usage *pUsage = pIdxInfo->aConstraintUsage; + int i; + int mxTerm; + int rc = SQLITE_OK; + WhereLoop *pNew = pBuilder->pNew; + Parse *pParse = pBuilder->pWInfo->pParse; + struct SrcList_item *pSrc = &pBuilder->pWInfo->pTabList->a[pNew->iTab]; + int nConstraint = pIdxInfo->nConstraint; + + assert( (mUsable & mPrereq)==mPrereq ); + *pbIn = 0; + pNew->prereq = mPrereq; + + /* Set the usable flag on the subset of constraints identified by + ** arguments mUsable and mExclude. */ + pIdxCons = *(struct sqlite3_index_constraint**)&pIdxInfo->aConstraint; + for(i=0; ia[pIdxCons->iTermOffset]; + pIdxCons->usable = 0; + if( (pTerm->prereqRight & mUsable)==pTerm->prereqRight + && (pTerm->eOperator & mExclude)==0 + ){ + pIdxCons->usable = 1; + } + } + + /* Initialize the output fields of the sqlite3_index_info structure */ + memset(pUsage, 0, sizeof(pUsage[0])*nConstraint); + assert( pIdxInfo->needToFreeIdxStr==0 ); + pIdxInfo->idxStr = 0; + pIdxInfo->idxNum = 0; + pIdxInfo->orderByConsumed = 0; + pIdxInfo->estimatedCost = SQLITE_BIG_DBL / (double)2; + pIdxInfo->estimatedRows = 25; + pIdxInfo->idxFlags = 0; + pIdxInfo->colUsed = (sqlite3_int64)pSrc->colUsed; + + /* Invoke the virtual table xBestIndex() method */ + rc = vtabBestIndex(pParse, pSrc->pTab, pIdxInfo); + if( rc ) return rc; + + mxTerm = -1; + assert( pNew->nLSlot>=nConstraint ); + for(i=0; iaLTerm[i] = 0; + pNew->u.vtab.omitMask = 0; + pIdxCons = *(struct sqlite3_index_constraint**)&pIdxInfo->aConstraint; + for(i=0; i=0 ){ + WhereTerm *pTerm; + int j = pIdxCons->iTermOffset; + if( iTerm>=nConstraint + || j<0 + || j>=pWC->nTerm + || pNew->aLTerm[iTerm]!=0 + || pIdxCons->usable==0 + ){ + rc = SQLITE_ERROR; + sqlite3ErrorMsg(pParse,"%s.xBestIndex malfunction",pSrc->pTab->zName); + return rc; + } + testcase( iTerm==nConstraint-1 ); + testcase( j==0 ); + testcase( j==pWC->nTerm-1 ); + pTerm = &pWC->a[j]; + pNew->prereq |= pTerm->prereqRight; + assert( iTermnLSlot ); + pNew->aLTerm[iTerm] = pTerm; + if( iTerm>mxTerm ) mxTerm = iTerm; + testcase( iTerm==15 ); + testcase( iTerm==16 ); + if( iTerm<16 && pUsage[i].omit ) pNew->u.vtab.omitMask |= 1<eOperator & WO_IN)!=0 ){ + /* A virtual table that is constrained by an IN clause may not + ** consume the ORDER BY clause because (1) the order of IN terms + ** is not necessarily related to the order of output terms and + ** (2) Multiple outputs from a single IN value will not merge + ** together. */ + pIdxInfo->orderByConsumed = 0; + pIdxInfo->idxFlags &= ~SQLITE_INDEX_SCAN_UNIQUE; + *pbIn = 1; assert( (mExclude & WO_IN)==0 ); + } + } + } + pNew->u.vtab.omitMask &= ~mNoOmit; + + pNew->nLTerm = mxTerm+1; + assert( pNew->nLTerm<=pNew->nLSlot ); + pNew->u.vtab.idxNum = pIdxInfo->idxNum; + pNew->u.vtab.needFree = pIdxInfo->needToFreeIdxStr; + pIdxInfo->needToFreeIdxStr = 0; + pNew->u.vtab.idxStr = pIdxInfo->idxStr; + pNew->u.vtab.isOrdered = (i8)(pIdxInfo->orderByConsumed ? + pIdxInfo->nOrderBy : 0); + pNew->rSetup = 0; + pNew->rRun = sqlite3LogEstFromDouble(pIdxInfo->estimatedCost); + pNew->nOut = sqlite3LogEst(pIdxInfo->estimatedRows); + + /* Set the WHERE_ONEROW flag if the xBestIndex() method indicated + ** that the scan will visit at most one row. Clear it otherwise. */ + if( pIdxInfo->idxFlags & SQLITE_INDEX_SCAN_UNIQUE ){ + pNew->wsFlags |= WHERE_ONEROW; + }else{ + pNew->wsFlags &= ~WHERE_ONEROW; + } + rc = whereLoopInsert(pBuilder, pNew); + if( pNew->u.vtab.needFree ){ + sqlite3_free(pNew->u.vtab.idxStr); + pNew->u.vtab.needFree = 0; + } + WHERETRACE(0xffff, (" bIn=%d prereqIn=%04llx prereqOut=%04llx\n", + *pbIn, (sqlite3_uint64)mPrereq, + (sqlite3_uint64)(pNew->prereq & ~mPrereq))); + + return rc; +} + + +/* +** Add all WhereLoop objects for a table of the join identified by +** pBuilder->pNew->iTab. That table is guaranteed to be a virtual table. +** +** If there are no LEFT or CROSS JOIN joins in the query, both mPrereq and +** mUnusable are set to 0. Otherwise, mPrereq is a mask of all FROM clause +** entries that occur before the virtual table in the FROM clause and are +** separated from it by at least one LEFT or CROSS JOIN. Similarly, the +** mUnusable mask contains all FROM clause entries that occur after the +** virtual table and are separated from it by at least one LEFT or +** CROSS JOIN. +** +** For example, if the query were: +** +** ... FROM t1, t2 LEFT JOIN t3, t4, vt CROSS JOIN t5, t6; +** +** then mPrereq corresponds to (t1, t2) and mUnusable to (t5, t6). +** +** All the tables in mPrereq must be scanned before the current virtual +** table. So any terms for which all prerequisites are satisfied by +** mPrereq may be specified as "usable" in all calls to xBestIndex. +** Conversely, all tables in mUnusable must be scanned after the current +** virtual table, so any terms for which the prerequisites overlap with +** mUnusable should always be configured as "not-usable" for xBestIndex. +*/ +static int whereLoopAddVirtual( + WhereLoopBuilder *pBuilder, /* WHERE clause information */ + Bitmask mPrereq, /* Tables that must be scanned before this one */ + Bitmask mUnusable /* Tables that must be scanned after this one */ +){ + int rc = SQLITE_OK; /* Return code */ + WhereInfo *pWInfo; /* WHERE analysis context */ + Parse *pParse; /* The parsing context */ + WhereClause *pWC; /* The WHERE clause */ + struct SrcList_item *pSrc; /* The FROM clause term to search */ + sqlite3_index_info *p; /* Object to pass to xBestIndex() */ + int nConstraint; /* Number of constraints in p */ + int bIn; /* True if plan uses IN(...) operator */ + WhereLoop *pNew; + Bitmask mBest; /* Tables used by best possible plan */ + u16 mNoOmit; + + assert( (mPrereq & mUnusable)==0 ); + pWInfo = pBuilder->pWInfo; + pParse = pWInfo->pParse; + pWC = pBuilder->pWC; + pNew = pBuilder->pNew; + pSrc = &pWInfo->pTabList->a[pNew->iTab]; + assert( IsVirtual(pSrc->pTab) ); + p = allocateIndexInfo(pParse, pWC, mUnusable, pSrc, pBuilder->pOrderBy, + &mNoOmit); + if( p==0 ) return SQLITE_NOMEM_BKPT; + pNew->rSetup = 0; + pNew->wsFlags = WHERE_VIRTUALTABLE; + pNew->nLTerm = 0; + pNew->u.vtab.needFree = 0; + nConstraint = p->nConstraint; + if( whereLoopResize(pParse->db, pNew, nConstraint) ){ + sqlite3DbFree(pParse->db, p); + return SQLITE_NOMEM_BKPT; + } + + /* First call xBestIndex() with all constraints usable. */ + WHERETRACE(0x40, (" VirtualOne: all usable\n")); + rc = whereLoopAddVirtualOne(pBuilder, mPrereq, ALLBITS, 0, p, mNoOmit, &bIn); + + /* If the call to xBestIndex() with all terms enabled produced a plan + ** that does not require any source tables (IOW: a plan with mBest==0), + ** then there is no point in making any further calls to xBestIndex() + ** since they will all return the same result (if the xBestIndex() + ** implementation is sane). */ + if( rc==SQLITE_OK && (mBest = (pNew->prereq & ~mPrereq))!=0 ){ + int seenZero = 0; /* True if a plan with no prereqs seen */ + int seenZeroNoIN = 0; /* Plan with no prereqs and no IN(...) seen */ + Bitmask mPrev = 0; + Bitmask mBestNoIn = 0; + + /* If the plan produced by the earlier call uses an IN(...) term, call + ** xBestIndex again, this time with IN(...) terms disabled. */ + if( bIn ){ + WHERETRACE(0x40, (" VirtualOne: all usable w/o IN\n")); + rc = whereLoopAddVirtualOne( + pBuilder, mPrereq, ALLBITS, WO_IN, p, mNoOmit, &bIn); + assert( bIn==0 ); + mBestNoIn = pNew->prereq & ~mPrereq; + if( mBestNoIn==0 ){ + seenZero = 1; + seenZeroNoIN = 1; + } + } + + /* Call xBestIndex once for each distinct value of (prereqRight & ~mPrereq) + ** in the set of terms that apply to the current virtual table. */ + while( rc==SQLITE_OK ){ + int i; + Bitmask mNext = ALLBITS; + assert( mNext>0 ); + for(i=0; ia[p->aConstraint[i].iTermOffset].prereqRight & ~mPrereq + ); + if( mThis>mPrev && mThisprereq==mPrereq ){ + seenZero = 1; + if( bIn==0 ) seenZeroNoIN = 1; + } + } + + /* If the calls to xBestIndex() in the above loop did not find a plan + ** that requires no source tables at all (i.e. one guaranteed to be + ** usable), make a call here with all source tables disabled */ + if( rc==SQLITE_OK && seenZero==0 ){ + WHERETRACE(0x40, (" VirtualOne: all disabled\n")); + rc = whereLoopAddVirtualOne( + pBuilder, mPrereq, mPrereq, 0, p, mNoOmit, &bIn); + if( bIn==0 ) seenZeroNoIN = 1; + } + + /* If the calls to xBestIndex() have so far failed to find a plan + ** that requires no source tables at all and does not use an IN(...) + ** operator, make a final call to obtain one here. */ + if( rc==SQLITE_OK && seenZeroNoIN==0 ){ + WHERETRACE(0x40, (" VirtualOne: all disabled and w/o IN\n")); + rc = whereLoopAddVirtualOne( + pBuilder, mPrereq, mPrereq, WO_IN, p, mNoOmit, &bIn); + } + } + + if( p->needToFreeIdxStr ) sqlite3_free(p->idxStr); + sqlite3DbFree(pParse->db, p); + return rc; +} +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + +/* +** Add WhereLoop entries to handle OR terms. This works for either +** btrees or virtual tables. +*/ +static int whereLoopAddOr( + WhereLoopBuilder *pBuilder, + Bitmask mPrereq, + Bitmask mUnusable +){ + WhereInfo *pWInfo = pBuilder->pWInfo; + WhereClause *pWC; + WhereLoop *pNew; + WhereTerm *pTerm, *pWCEnd; + int rc = SQLITE_OK; + int iCur; + WhereClause tempWC; + WhereLoopBuilder sSubBuild; + WhereOrSet sSum, sCur; + struct SrcList_item *pItem; + + pWC = pBuilder->pWC; + pWCEnd = pWC->a + pWC->nTerm; + pNew = pBuilder->pNew; + memset(&sSum, 0, sizeof(sSum)); + pItem = pWInfo->pTabList->a + pNew->iTab; + iCur = pItem->iCursor; + + for(pTerm=pWC->a; pTermeOperator & WO_OR)!=0 + && (pTerm->u.pOrInfo->indexable & pNew->maskSelf)!=0 + ){ + WhereClause * const pOrWC = &pTerm->u.pOrInfo->wc; + WhereTerm * const pOrWCEnd = &pOrWC->a[pOrWC->nTerm]; + WhereTerm *pOrTerm; + int once = 1; + int i, j; + + sSubBuild = *pBuilder; + sSubBuild.pOrderBy = 0; + sSubBuild.pOrSet = &sCur; + + WHERETRACE(0x200, ("Begin processing OR-clause %p\n", pTerm)); + for(pOrTerm=pOrWC->a; pOrTermeOperator & WO_AND)!=0 ){ + sSubBuild.pWC = &pOrTerm->u.pAndInfo->wc; + }else if( pOrTerm->leftCursor==iCur ){ + tempWC.pWInfo = pWC->pWInfo; + tempWC.pOuter = pWC; + tempWC.op = TK_AND; + tempWC.nTerm = 1; + tempWC.a = pOrTerm; + sSubBuild.pWC = &tempWC; + }else{ + continue; + } + sCur.n = 0; +#ifdef WHERETRACE_ENABLED + WHERETRACE(0x200, ("OR-term %d of %p has %d subterms:\n", + (int)(pOrTerm-pOrWC->a), pTerm, sSubBuild.pWC->nTerm)); + if( sqlite3WhereTrace & 0x400 ){ + sqlite3WhereClausePrint(sSubBuild.pWC); + } +#endif +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( IsVirtual(pItem->pTab) ){ + rc = whereLoopAddVirtual(&sSubBuild, mPrereq, mUnusable); + }else +#endif + { + rc = whereLoopAddBtree(&sSubBuild, mPrereq); + } + if( rc==SQLITE_OK ){ + rc = whereLoopAddOr(&sSubBuild, mPrereq, mUnusable); + } + assert( rc==SQLITE_OK || sCur.n==0 ); + if( sCur.n==0 ){ + sSum.n = 0; + break; + }else if( once ){ + whereOrMove(&sSum, &sCur); + once = 0; + }else{ + WhereOrSet sPrev; + whereOrMove(&sPrev, &sSum); + sSum.n = 0; + for(i=0; inLTerm = 1; + pNew->aLTerm[0] = pTerm; + pNew->wsFlags = WHERE_MULTI_OR; + pNew->rSetup = 0; + pNew->iSortIdx = 0; + memset(&pNew->u, 0, sizeof(pNew->u)); + for(i=0; rc==SQLITE_OK && irRun = sSum.a[i].rRun + 1; + pNew->nOut = sSum.a[i].nOut; + pNew->prereq = sSum.a[i].prereq; + rc = whereLoopInsert(pBuilder, pNew); + } + WHERETRACE(0x200, ("End processing OR-clause %p\n", pTerm)); + } + } + return rc; +} + +/* +** Add all WhereLoop objects for all tables +*/ +static int whereLoopAddAll(WhereLoopBuilder *pBuilder){ + WhereInfo *pWInfo = pBuilder->pWInfo; + Bitmask mPrereq = 0; + Bitmask mPrior = 0; + int iTab; + SrcList *pTabList = pWInfo->pTabList; + struct SrcList_item *pItem; + struct SrcList_item *pEnd = &pTabList->a[pWInfo->nLevel]; + sqlite3 *db = pWInfo->pParse->db; + int rc = SQLITE_OK; + WhereLoop *pNew; + u8 priorJointype = 0; + + /* Loop over the tables in the join, from left to right */ + pNew = pBuilder->pNew; + whereLoopInit(pNew); + for(iTab=0, pItem=pTabList->a; pItemiTab = iTab; + pNew->maskSelf = sqlite3WhereGetMask(&pWInfo->sMaskSet, pItem->iCursor); + if( ((pItem->fg.jointype|priorJointype) & (JT_LEFT|JT_CROSS))!=0 ){ + /* This condition is true when pItem is the FROM clause term on the + ** right-hand-side of a LEFT or CROSS JOIN. */ + mPrereq = mPrior; + } + priorJointype = pItem->fg.jointype; +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( IsVirtual(pItem->pTab) ){ + struct SrcList_item *p; + for(p=&pItem[1]; pfg.jointype & (JT_LEFT|JT_CROSS)) ){ + mUnusable |= sqlite3WhereGetMask(&pWInfo->sMaskSet, p->iCursor); + } + } + rc = whereLoopAddVirtual(pBuilder, mPrereq, mUnusable); + }else +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + { + rc = whereLoopAddBtree(pBuilder, mPrereq); + } + if( rc==SQLITE_OK ){ + rc = whereLoopAddOr(pBuilder, mPrereq, mUnusable); + } + mPrior |= pNew->maskSelf; + if( rc || db->mallocFailed ) break; + } + + whereLoopClear(db, pNew); + return rc; +} + +/* +** Examine a WherePath (with the addition of the extra WhereLoop of the 5th +** parameters) to see if it outputs rows in the requested ORDER BY +** (or GROUP BY) without requiring a separate sort operation. Return N: +** +** N>0: N terms of the ORDER BY clause are satisfied +** N==0: No terms of the ORDER BY clause are satisfied +** N<0: Unknown yet how many terms of ORDER BY might be satisfied. +** +** Note that processing for WHERE_GROUPBY and WHERE_DISTINCTBY is not as +** strict. With GROUP BY and DISTINCT the only requirement is that +** equivalent rows appear immediately adjacent to one another. GROUP BY +** and DISTINCT do not require rows to appear in any particular order as long +** as equivalent rows are grouped together. Thus for GROUP BY and DISTINCT +** the pOrderBy terms can be matched in any order. With ORDER BY, the +** pOrderBy terms must be matched in strict left-to-right order. +*/ +static i8 wherePathSatisfiesOrderBy( + WhereInfo *pWInfo, /* The WHERE clause */ + ExprList *pOrderBy, /* ORDER BY or GROUP BY or DISTINCT clause to check */ + WherePath *pPath, /* The WherePath to check */ + u16 wctrlFlags, /* WHERE_GROUPBY or _DISTINCTBY or _ORDERBY_LIMIT */ + u16 nLoop, /* Number of entries in pPath->aLoop[] */ + WhereLoop *pLast, /* Add this WhereLoop to the end of pPath->aLoop[] */ + Bitmask *pRevMask /* OUT: Mask of WhereLoops to run in reverse order */ +){ + u8 revSet; /* True if rev is known */ + u8 rev; /* Composite sort order */ + u8 revIdx; /* Index sort order */ + u8 isOrderDistinct; /* All prior WhereLoops are order-distinct */ + u8 distinctColumns; /* True if the loop has UNIQUE NOT NULL columns */ + u8 isMatch; /* iColumn matches a term of the ORDER BY clause */ + u16 eqOpMask; /* Allowed equality operators */ + u16 nKeyCol; /* Number of key columns in pIndex */ + u16 nColumn; /* Total number of ordered columns in the index */ + u16 nOrderBy; /* Number terms in the ORDER BY clause */ + int iLoop; /* Index of WhereLoop in pPath being processed */ + int i, j; /* Loop counters */ + int iCur; /* Cursor number for current WhereLoop */ + int iColumn; /* A column number within table iCur */ + WhereLoop *pLoop = 0; /* Current WhereLoop being processed. */ + WhereTerm *pTerm; /* A single term of the WHERE clause */ + Expr *pOBExpr; /* An expression from the ORDER BY clause */ + CollSeq *pColl; /* COLLATE function from an ORDER BY clause term */ + Index *pIndex; /* The index associated with pLoop */ + sqlite3 *db = pWInfo->pParse->db; /* Database connection */ + Bitmask obSat = 0; /* Mask of ORDER BY terms satisfied so far */ + Bitmask obDone; /* Mask of all ORDER BY terms */ + Bitmask orderDistinctMask; /* Mask of all well-ordered loops */ + Bitmask ready; /* Mask of inner loops */ + + /* + ** We say the WhereLoop is "one-row" if it generates no more than one + ** row of output. A WhereLoop is one-row if all of the following are true: + ** (a) All index columns match with WHERE_COLUMN_EQ. + ** (b) The index is unique + ** Any WhereLoop with an WHERE_COLUMN_EQ constraint on the rowid is one-row. + ** Every one-row WhereLoop will have the WHERE_ONEROW bit set in wsFlags. + ** + ** We say the WhereLoop is "order-distinct" if the set of columns from + ** that WhereLoop that are in the ORDER BY clause are different for every + ** row of the WhereLoop. Every one-row WhereLoop is automatically + ** order-distinct. A WhereLoop that has no columns in the ORDER BY clause + ** is not order-distinct. To be order-distinct is not quite the same as being + ** UNIQUE since a UNIQUE column or index can have multiple rows that + ** are NULL and NULL values are equivalent for the purpose of order-distinct. + ** To be order-distinct, the columns must be UNIQUE and NOT NULL. + ** + ** The rowid for a table is always UNIQUE and NOT NULL so whenever the + ** rowid appears in the ORDER BY clause, the corresponding WhereLoop is + ** automatically order-distinct. + */ + + assert( pOrderBy!=0 ); + if( nLoop && OptimizationDisabled(db, SQLITE_OrderByIdxJoin) ) return 0; + + nOrderBy = pOrderBy->nExpr; + testcase( nOrderBy==BMS-1 ); + if( nOrderBy>BMS-1 ) return 0; /* Cannot optimize overly large ORDER BYs */ + isOrderDistinct = 1; + obDone = MASKBIT(nOrderBy)-1; + orderDistinctMask = 0; + ready = 0; + eqOpMask = WO_EQ | WO_IS | WO_ISNULL; + if( wctrlFlags & WHERE_ORDERBY_LIMIT ) eqOpMask |= WO_IN; + for(iLoop=0; isOrderDistinct && obSat0 ) ready |= pLoop->maskSelf; + if( iLoopaLoop[iLoop]; + if( wctrlFlags & WHERE_ORDERBY_LIMIT ) continue; + }else{ + pLoop = pLast; + } + if( pLoop->wsFlags & WHERE_VIRTUALTABLE ){ + if( pLoop->u.vtab.isOrdered ) obSat = obDone; + break; + } + iCur = pWInfo->pTabList->a[pLoop->iTab].iCursor; + + /* Mark off any ORDER BY term X that is a column in the table of + ** the current loop for which there is term in the WHERE + ** clause of the form X IS NULL or X=? that reference only outer + ** loops. + */ + for(i=0; ia[i].pExpr); + if( pOBExpr->op!=TK_COLUMN ) continue; + if( pOBExpr->iTable!=iCur ) continue; + pTerm = sqlite3WhereFindTerm(&pWInfo->sWC, iCur, pOBExpr->iColumn, + ~ready, eqOpMask, 0); + if( pTerm==0 ) continue; + if( pTerm->eOperator==WO_IN ){ + /* IN terms are only valid for sorting in the ORDER BY LIMIT + ** optimization, and then only if they are actually used + ** by the query plan */ + assert( wctrlFlags & WHERE_ORDERBY_LIMIT ); + for(j=0; jnLTerm && pTerm!=pLoop->aLTerm[j]; j++){} + if( j>=pLoop->nLTerm ) continue; + } + if( (pTerm->eOperator&(WO_EQ|WO_IS))!=0 && pOBExpr->iColumn>=0 ){ + const char *z1, *z2; + pColl = sqlite3ExprCollSeq(pWInfo->pParse, pOrderBy->a[i].pExpr); + if( !pColl ) pColl = db->pDfltColl; + z1 = pColl->zName; + pColl = sqlite3ExprCollSeq(pWInfo->pParse, pTerm->pExpr); + if( !pColl ) pColl = db->pDfltColl; + z2 = pColl->zName; + if( sqlite3StrICmp(z1, z2)!=0 ) continue; + testcase( pTerm->pExpr->op==TK_IS ); + } + obSat |= MASKBIT(i); + } + + if( (pLoop->wsFlags & WHERE_ONEROW)==0 ){ + if( pLoop->wsFlags & WHERE_IPK ){ + pIndex = 0; + nKeyCol = 0; + nColumn = 1; + }else if( (pIndex = pLoop->u.btree.pIndex)==0 || pIndex->bUnordered ){ + return 0; + }else{ + nKeyCol = pIndex->nKeyCol; + nColumn = pIndex->nColumn; + assert( nColumn==nKeyCol+1 || !HasRowid(pIndex->pTable) ); + assert( pIndex->aiColumn[nColumn-1]==XN_ROWID + || !HasRowid(pIndex->pTable)); + isOrderDistinct = IsUniqueIndex(pIndex); + } + + /* Loop through all columns of the index and deal with the ones + ** that are not constrained by == or IN. + */ + rev = revSet = 0; + distinctColumns = 0; + for(j=0; j=pLoop->u.btree.nEq + || (pLoop->aLTerm[j]==0)==(jnSkip) + ); + if( ju.btree.nEq && j>=pLoop->nSkip ){ + u16 eOp = pLoop->aLTerm[j]->eOperator; + + /* Skip over == and IS and ISNULL terms. (Also skip IN terms when + ** doing WHERE_ORDERBY_LIMIT processing). + ** + ** If the current term is a column of an ((?,?) IN (SELECT...)) + ** expression for which the SELECT returns more than one column, + ** check that it is the only column used by this loop. Otherwise, + ** if it is one of two or more, none of the columns can be + ** considered to match an ORDER BY term. */ + if( (eOp & eqOpMask)!=0 ){ + if( eOp & WO_ISNULL ){ + testcase( isOrderDistinct ); + isOrderDistinct = 0; + } + continue; + }else if( ALWAYS(eOp & WO_IN) ){ + /* ALWAYS() justification: eOp is an equality operator due to the + ** ju.btree.nEq constraint above. Any equality other + ** than WO_IN is captured by the previous "if". So this one + ** always has to be WO_IN. */ + Expr *pX = pLoop->aLTerm[j]->pExpr; + for(i=j+1; iu.btree.nEq; i++){ + if( pLoop->aLTerm[i]->pExpr==pX ){ + assert( (pLoop->aLTerm[i]->eOperator & WO_IN) ); + bOnce = 0; + break; + } + } + } + } + + /* Get the column number in the table (iColumn) and sort order + ** (revIdx) for the j-th column of the index. + */ + if( pIndex ){ + iColumn = pIndex->aiColumn[j]; + revIdx = pIndex->aSortOrder[j]; + if( iColumn==pIndex->pTable->iPKey ) iColumn = -1; + }else{ + iColumn = XN_ROWID; + revIdx = 0; + } + + /* An unconstrained column that might be NULL means that this + ** WhereLoop is not well-ordered + */ + if( isOrderDistinct + && iColumn>=0 + && j>=pLoop->u.btree.nEq + && pIndex->pTable->aCol[iColumn].notNull==0 + ){ + isOrderDistinct = 0; + } + + /* Find the ORDER BY term that corresponds to the j-th column + ** of the index and mark that ORDER BY term off + */ + isMatch = 0; + for(i=0; bOnce && ia[i].pExpr); + testcase( wctrlFlags & WHERE_GROUPBY ); + testcase( wctrlFlags & WHERE_DISTINCTBY ); + if( (wctrlFlags & (WHERE_GROUPBY|WHERE_DISTINCTBY))==0 ) bOnce = 0; + if( iColumn>=(-1) ){ + if( pOBExpr->op!=TK_COLUMN ) continue; + if( pOBExpr->iTable!=iCur ) continue; + if( pOBExpr->iColumn!=iColumn ) continue; + }else{ + if( sqlite3ExprCompare(pOBExpr,pIndex->aColExpr->a[j].pExpr,iCur) ){ + continue; + } + } + if( iColumn>=0 ){ + pColl = sqlite3ExprCollSeq(pWInfo->pParse, pOrderBy->a[i].pExpr); + if( !pColl ) pColl = db->pDfltColl; + if( sqlite3StrICmp(pColl->zName, pIndex->azColl[j])!=0 ) continue; + } + isMatch = 1; + break; + } + if( isMatch && (wctrlFlags & WHERE_GROUPBY)==0 ){ + /* Make sure the sort order is compatible in an ORDER BY clause. + ** Sort order is irrelevant for a GROUP BY clause. */ + if( revSet ){ + if( (rev ^ revIdx)!=pOrderBy->a[i].sortOrder ) isMatch = 0; + }else{ + rev = revIdx ^ pOrderBy->a[i].sortOrder; + if( rev ) *pRevMask |= MASKBIT(iLoop); + revSet = 1; + } + } + if( isMatch ){ + if( iColumn==XN_ROWID ){ + testcase( distinctColumns==0 ); + distinctColumns = 1; + } + obSat |= MASKBIT(i); + }else{ + /* No match found */ + if( j==0 || jmaskSelf; + for(i=0; ia[i].pExpr; + mTerm = sqlite3WhereExprUsage(&pWInfo->sMaskSet,p); + if( mTerm==0 && !sqlite3ExprIsConstant(p) ) continue; + if( (mTerm&~orderDistinctMask)==0 ){ + obSat |= MASKBIT(i); + } + } + } + } /* End the loop over all WhereLoops from outer-most down to inner-most */ + if( obSat==obDone ) return (i8)nOrderBy; + if( !isOrderDistinct ){ + for(i=nOrderBy-1; i>0; i--){ + Bitmask m = MASKBIT(i) - 1; + if( (obSat&m)==m ) return i; + } + return 0; + } + return -1; +} + + +/* +** If the WHERE_GROUPBY flag is set in the mask passed to sqlite3WhereBegin(), +** the planner assumes that the specified pOrderBy list is actually a GROUP +** BY clause - and so any order that groups rows as required satisfies the +** request. +** +** Normally, in this case it is not possible for the caller to determine +** whether or not the rows are really being delivered in sorted order, or +** just in some other order that provides the required grouping. However, +** if the WHERE_SORTBYGROUP flag is also passed to sqlite3WhereBegin(), then +** this function may be called on the returned WhereInfo object. It returns +** true if the rows really will be sorted in the specified order, or false +** otherwise. +** +** For example, assuming: +** +** CREATE INDEX i1 ON t1(x, Y); +** +** then +** +** SELECT * FROM t1 GROUP BY x,y ORDER BY x,y; -- IsSorted()==1 +** SELECT * FROM t1 GROUP BY y,x ORDER BY y,x; -- IsSorted()==0 +*/ +SQLITE_PRIVATE int sqlite3WhereIsSorted(WhereInfo *pWInfo){ + assert( pWInfo->wctrlFlags & WHERE_GROUPBY ); + assert( pWInfo->wctrlFlags & WHERE_SORTBYGROUP ); + return pWInfo->sorted; +} + +#ifdef WHERETRACE_ENABLED +/* For debugging use only: */ +static const char *wherePathName(WherePath *pPath, int nLoop, WhereLoop *pLast){ + static char zName[65]; + int i; + for(i=0; iaLoop[i]->cId; } + if( pLast ) zName[i++] = pLast->cId; + zName[i] = 0; + return zName; +} +#endif + +/* +** Return the cost of sorting nRow rows, assuming that the keys have +** nOrderby columns and that the first nSorted columns are already in +** order. +*/ +static LogEst whereSortingCost( + WhereInfo *pWInfo, + LogEst nRow, + int nOrderBy, + int nSorted +){ + /* TUNING: Estimated cost of a full external sort, where N is + ** the number of rows to sort is: + ** + ** cost = (3.0 * N * log(N)). + ** + ** Or, if the order-by clause has X terms but only the last Y + ** terms are out of order, then block-sorting will reduce the + ** sorting cost to: + ** + ** cost = (3.0 * N * log(N)) * (Y/X) + ** + ** The (Y/X) term is implemented using stack variable rScale + ** below. */ + LogEst rScale, rSortCost; + assert( nOrderBy>0 && 66==sqlite3LogEst(100) ); + rScale = sqlite3LogEst((nOrderBy-nSorted)*100/nOrderBy) - 66; + rSortCost = nRow + rScale + 16; + + /* Multiple by log(M) where M is the number of output rows. + ** Use the LIMIT for M if it is smaller */ + if( (pWInfo->wctrlFlags & WHERE_USE_LIMIT)!=0 && pWInfo->iLimitiLimit; + } + rSortCost += estLog(nRow); + return rSortCost; +} + +/* +** Given the list of WhereLoop objects at pWInfo->pLoops, this routine +** attempts to find the lowest cost path that visits each WhereLoop +** once. This path is then loaded into the pWInfo->a[].pWLoop fields. +** +** Assume that the total number of output rows that will need to be sorted +** will be nRowEst (in the 10*log2 representation). Or, ignore sorting +** costs if nRowEst==0. +** +** Return SQLITE_OK on success or SQLITE_NOMEM of a memory allocation +** error occurs. +*/ +static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ + int mxChoice; /* Maximum number of simultaneous paths tracked */ + int nLoop; /* Number of terms in the join */ + Parse *pParse; /* Parsing context */ + sqlite3 *db; /* The database connection */ + int iLoop; /* Loop counter over the terms of the join */ + int ii, jj; /* Loop counters */ + int mxI = 0; /* Index of next entry to replace */ + int nOrderBy; /* Number of ORDER BY clause terms */ + LogEst mxCost = 0; /* Maximum cost of a set of paths */ + LogEst mxUnsorted = 0; /* Maximum unsorted cost of a set of path */ + int nTo, nFrom; /* Number of valid entries in aTo[] and aFrom[] */ + WherePath *aFrom; /* All nFrom paths at the previous level */ + WherePath *aTo; /* The nTo best paths at the current level */ + WherePath *pFrom; /* An element of aFrom[] that we are working on */ + WherePath *pTo; /* An element of aTo[] that we are working on */ + WhereLoop *pWLoop; /* One of the WhereLoop objects */ + WhereLoop **pX; /* Used to divy up the pSpace memory */ + LogEst *aSortCost = 0; /* Sorting and partial sorting costs */ + char *pSpace; /* Temporary memory used by this routine */ + int nSpace; /* Bytes of space allocated at pSpace */ + + pParse = pWInfo->pParse; + db = pParse->db; + nLoop = pWInfo->nLevel; + /* TUNING: For simple queries, only the best path is tracked. + ** For 2-way joins, the 5 best paths are followed. + ** For joins of 3 or more tables, track the 10 best paths */ + mxChoice = (nLoop<=1) ? 1 : (nLoop==2 ? 5 : 10); + assert( nLoop<=pWInfo->pTabList->nSrc ); + WHERETRACE(0x002, ("---- begin solver. (nRowEst=%d)\n", nRowEst)); + + /* If nRowEst is zero and there is an ORDER BY clause, ignore it. In this + ** case the purpose of this call is to estimate the number of rows returned + ** by the overall query. Once this estimate has been obtained, the caller + ** will invoke this function a second time, passing the estimate as the + ** nRowEst parameter. */ + if( pWInfo->pOrderBy==0 || nRowEst==0 ){ + nOrderBy = 0; + }else{ + nOrderBy = pWInfo->pOrderBy->nExpr; + } + + /* Allocate and initialize space for aTo, aFrom and aSortCost[] */ + nSpace = (sizeof(WherePath)+sizeof(WhereLoop*)*nLoop)*mxChoice*2; + nSpace += sizeof(LogEst) * nOrderBy; + pSpace = sqlite3DbMallocRawNN(db, nSpace); + if( pSpace==0 ) return SQLITE_NOMEM_BKPT; + aTo = (WherePath*)pSpace; + aFrom = aTo+mxChoice; + memset(aFrom, 0, sizeof(aFrom[0])); + pX = (WhereLoop**)(aFrom+mxChoice); + for(ii=mxChoice*2, pFrom=aTo; ii>0; ii--, pFrom++, pX += nLoop){ + pFrom->aLoop = pX; + } + if( nOrderBy ){ + /* If there is an ORDER BY clause and it is not being ignored, set up + ** space for the aSortCost[] array. Each element of the aSortCost array + ** is either zero - meaning it has not yet been initialized - or the + ** cost of sorting nRowEst rows of data where the first X terms of + ** the ORDER BY clause are already in order, where X is the array + ** index. */ + aSortCost = (LogEst*)pX; + memset(aSortCost, 0, sizeof(LogEst) * nOrderBy); + } + assert( aSortCost==0 || &pSpace[nSpace]==(char*)&aSortCost[nOrderBy] ); + assert( aSortCost!=0 || &pSpace[nSpace]==(char*)pX ); + + /* Seed the search with a single WherePath containing zero WhereLoops. + ** + ** TUNING: Do not let the number of iterations go above 28. If the cost + ** of computing an automatic index is not paid back within the first 28 + ** rows, then do not use the automatic index. */ + aFrom[0].nRow = MIN(pParse->nQueryLoop, 48); assert( 48==sqlite3LogEst(28) ); + nFrom = 1; + assert( aFrom[0].isOrdered==0 ); + if( nOrderBy ){ + /* If nLoop is zero, then there are no FROM terms in the query. Since + ** in this case the query may return a maximum of one row, the results + ** are already in the requested order. Set isOrdered to nOrderBy to + ** indicate this. Or, if nLoop is greater than zero, set isOrdered to + ** -1, indicating that the result set may or may not be ordered, + ** depending on the loops added to the current plan. */ + aFrom[0].isOrdered = nLoop>0 ? -1 : nOrderBy; + } + + /* Compute successively longer WherePaths using the previous generation + ** of WherePaths as the basis for the next. Keep track of the mxChoice + ** best paths at each generation */ + for(iLoop=0; iLooppLoops; pWLoop; pWLoop=pWLoop->pNextLoop){ + LogEst nOut; /* Rows visited by (pFrom+pWLoop) */ + LogEst rCost; /* Cost of path (pFrom+pWLoop) */ + LogEst rUnsorted; /* Unsorted cost of (pFrom+pWLoop) */ + i8 isOrdered = pFrom->isOrdered; /* isOrdered for (pFrom+pWLoop) */ + Bitmask maskNew; /* Mask of src visited by (..) */ + Bitmask revMask = 0; /* Mask of rev-order loops for (..) */ + + if( (pWLoop->prereq & ~pFrom->maskLoop)!=0 ) continue; + if( (pWLoop->maskSelf & pFrom->maskLoop)!=0 ) continue; + if( (pWLoop->wsFlags & WHERE_AUTO_INDEX)!=0 && pFrom->nRow<10 ){ + /* Do not use an automatic index if the this loop is expected + ** to run less than 2 times. */ + assert( 10==sqlite3LogEst(2) ); + continue; + } + /* At this point, pWLoop is a candidate to be the next loop. + ** Compute its cost */ + rUnsorted = sqlite3LogEstAdd(pWLoop->rSetup,pWLoop->rRun + pFrom->nRow); + rUnsorted = sqlite3LogEstAdd(rUnsorted, pFrom->rUnsorted); + nOut = pFrom->nRow + pWLoop->nOut; + maskNew = pFrom->maskLoop | pWLoop->maskSelf; + if( isOrdered<0 ){ + isOrdered = wherePathSatisfiesOrderBy(pWInfo, + pWInfo->pOrderBy, pFrom, pWInfo->wctrlFlags, + iLoop, pWLoop, &revMask); + }else{ + revMask = pFrom->revLoop; + } + if( isOrdered>=0 && isOrderedisOrdered^isOrdered)&0x80)==0" is equivalent + ** to (pTo->isOrdered==(-1))==(isOrdered==(-1))" for the range + ** of legal values for isOrdered, -1..64. + */ + for(jj=0, pTo=aTo; jjmaskLoop==maskNew + && ((pTo->isOrdered^isOrdered)&0x80)==0 + ){ + testcase( jj==nTo-1 ); + break; + } + } + if( jj>=nTo ){ + /* None of the existing best-so-far paths match the candidate. */ + if( nTo>=mxChoice + && (rCost>mxCost || (rCost==mxCost && rUnsorted>=mxUnsorted)) + ){ + /* The current candidate is no better than any of the mxChoice + ** paths currently in the best-so-far buffer. So discard + ** this candidate as not viable. */ +#ifdef WHERETRACE_ENABLED /* 0x4 */ + if( sqlite3WhereTrace&0x4 ){ + sqlite3DebugPrintf("Skip %s cost=%-3d,%3d order=%c\n", + wherePathName(pFrom, iLoop, pWLoop), rCost, nOut, + isOrdered>=0 ? isOrdered+'0' : '?'); + } +#endif + continue; + } + /* If we reach this points it means that the new candidate path + ** needs to be added to the set of best-so-far paths. */ + if( nTo=0 ? isOrdered+'0' : '?'); + } +#endif + }else{ + /* Control reaches here if best-so-far path pTo=aTo[jj] covers the + ** same set of loops and has the sam isOrdered setting as the + ** candidate path. Check to see if the candidate should replace + ** pTo or if the candidate should be skipped */ + if( pTo->rCostrCost==rCost && pTo->nRow<=nOut) ){ +#ifdef WHERETRACE_ENABLED /* 0x4 */ + if( sqlite3WhereTrace&0x4 ){ + sqlite3DebugPrintf( + "Skip %s cost=%-3d,%3d order=%c", + wherePathName(pFrom, iLoop, pWLoop), rCost, nOut, + isOrdered>=0 ? isOrdered+'0' : '?'); + sqlite3DebugPrintf(" vs %s cost=%-3d,%d order=%c\n", + wherePathName(pTo, iLoop+1, 0), pTo->rCost, pTo->nRow, + pTo->isOrdered>=0 ? pTo->isOrdered+'0' : '?'); + } +#endif + /* Discard the candidate path from further consideration */ + testcase( pTo->rCost==rCost ); + continue; + } + testcase( pTo->rCost==rCost+1 ); + /* Control reaches here if the candidate path is better than the + ** pTo path. Replace pTo with the candidate. */ +#ifdef WHERETRACE_ENABLED /* 0x4 */ + if( sqlite3WhereTrace&0x4 ){ + sqlite3DebugPrintf( + "Update %s cost=%-3d,%3d order=%c", + wherePathName(pFrom, iLoop, pWLoop), rCost, nOut, + isOrdered>=0 ? isOrdered+'0' : '?'); + sqlite3DebugPrintf(" was %s cost=%-3d,%3d order=%c\n", + wherePathName(pTo, iLoop+1, 0), pTo->rCost, pTo->nRow, + pTo->isOrdered>=0 ? pTo->isOrdered+'0' : '?'); + } +#endif + } + /* pWLoop is a winner. Add it to the set of best so far */ + pTo->maskLoop = pFrom->maskLoop | pWLoop->maskSelf; + pTo->revLoop = revMask; + pTo->nRow = nOut; + pTo->rCost = rCost; + pTo->rUnsorted = rUnsorted; + pTo->isOrdered = isOrdered; + memcpy(pTo->aLoop, pFrom->aLoop, sizeof(WhereLoop*)*iLoop); + pTo->aLoop[iLoop] = pWLoop; + if( nTo>=mxChoice ){ + mxI = 0; + mxCost = aTo[0].rCost; + mxUnsorted = aTo[0].nRow; + for(jj=1, pTo=&aTo[1]; jjrCost>mxCost + || (pTo->rCost==mxCost && pTo->rUnsorted>mxUnsorted) + ){ + mxCost = pTo->rCost; + mxUnsorted = pTo->rUnsorted; + mxI = jj; + } + } + } + } + } + +#ifdef WHERETRACE_ENABLED /* >=2 */ + if( sqlite3WhereTrace & 0x02 ){ + sqlite3DebugPrintf("---- after round %d ----\n", iLoop); + for(ii=0, pTo=aTo; iirCost, pTo->nRow, + pTo->isOrdered>=0 ? (pTo->isOrdered+'0') : '?'); + if( pTo->isOrdered>0 ){ + sqlite3DebugPrintf(" rev=0x%llx\n", pTo->revLoop); + }else{ + sqlite3DebugPrintf("\n"); + } + } + } +#endif + + /* Swap the roles of aFrom and aTo for the next generation */ + pFrom = aTo; + aTo = aFrom; + aFrom = pFrom; + nFrom = nTo; + } + + if( nFrom==0 ){ + sqlite3ErrorMsg(pParse, "no query solution"); + sqlite3DbFree(db, pSpace); + return SQLITE_ERROR; + } + + /* Find the lowest cost path. pFrom will be left pointing to that path */ + pFrom = aFrom; + for(ii=1; iirCost>aFrom[ii].rCost ) pFrom = &aFrom[ii]; + } + assert( pWInfo->nLevel==nLoop ); + /* Load the lowest cost path into pWInfo */ + for(iLoop=0; iLoopa + iLoop; + pLevel->pWLoop = pWLoop = pFrom->aLoop[iLoop]; + pLevel->iFrom = pWLoop->iTab; + pLevel->iTabCur = pWInfo->pTabList->a[pLevel->iFrom].iCursor; + } + if( (pWInfo->wctrlFlags & WHERE_WANT_DISTINCT)!=0 + && (pWInfo->wctrlFlags & WHERE_DISTINCTBY)==0 + && pWInfo->eDistinct==WHERE_DISTINCT_NOOP + && nRowEst + ){ + Bitmask notUsed; + int rc = wherePathSatisfiesOrderBy(pWInfo, pWInfo->pDistinctSet, pFrom, + WHERE_DISTINCTBY, nLoop-1, pFrom->aLoop[nLoop-1], ¬Used); + if( rc==pWInfo->pDistinctSet->nExpr ){ + pWInfo->eDistinct = WHERE_DISTINCT_ORDERED; + } + } + if( pWInfo->pOrderBy ){ + if( pWInfo->wctrlFlags & WHERE_DISTINCTBY ){ + if( pFrom->isOrdered==pWInfo->pOrderBy->nExpr ){ + pWInfo->eDistinct = WHERE_DISTINCT_ORDERED; + } + }else{ + pWInfo->nOBSat = pFrom->isOrdered; + pWInfo->revMask = pFrom->revLoop; + if( pWInfo->nOBSat<=0 ){ + pWInfo->nOBSat = 0; + if( nLoop>0 ){ + u32 wsFlags = pFrom->aLoop[nLoop-1]->wsFlags; + if( (wsFlags & WHERE_ONEROW)==0 + && (wsFlags&(WHERE_IPK|WHERE_COLUMN_IN))!=(WHERE_IPK|WHERE_COLUMN_IN) + ){ + Bitmask m = 0; + int rc = wherePathSatisfiesOrderBy(pWInfo, pWInfo->pOrderBy, pFrom, + WHERE_ORDERBY_LIMIT, nLoop-1, pFrom->aLoop[nLoop-1], &m); + testcase( wsFlags & WHERE_IPK ); + testcase( wsFlags & WHERE_COLUMN_IN ); + if( rc==pWInfo->pOrderBy->nExpr ){ + pWInfo->bOrderedInnerLoop = 1; + pWInfo->revMask = m; + } + } + } + } + } + if( (pWInfo->wctrlFlags & WHERE_SORTBYGROUP) + && pWInfo->nOBSat==pWInfo->pOrderBy->nExpr && nLoop>0 + ){ + Bitmask revMask = 0; + int nOrder = wherePathSatisfiesOrderBy(pWInfo, pWInfo->pOrderBy, + pFrom, 0, nLoop-1, pFrom->aLoop[nLoop-1], &revMask + ); + assert( pWInfo->sorted==0 ); + if( nOrder==pWInfo->pOrderBy->nExpr ){ + pWInfo->sorted = 1; + pWInfo->revMask = revMask; + } + } + } + + + pWInfo->nRowOut = pFrom->nRow; + + /* Free temporary memory and return success */ + sqlite3DbFree(db, pSpace); + return SQLITE_OK; +} + +/* +** Most queries use only a single table (they are not joins) and have +** simple == constraints against indexed fields. This routine attempts +** to plan those simple cases using much less ceremony than the +** general-purpose query planner, and thereby yield faster sqlite3_prepare() +** times for the common case. +** +** Return non-zero on success, if this query can be handled by this +** no-frills query planner. Return zero if this query needs the +** general-purpose query planner. +*/ +static int whereShortCut(WhereLoopBuilder *pBuilder){ + WhereInfo *pWInfo; + struct SrcList_item *pItem; + WhereClause *pWC; + WhereTerm *pTerm; + WhereLoop *pLoop; + int iCur; + int j; + Table *pTab; + Index *pIdx; + + pWInfo = pBuilder->pWInfo; + if( pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE ) return 0; + assert( pWInfo->pTabList->nSrc>=1 ); + pItem = pWInfo->pTabList->a; + pTab = pItem->pTab; + if( IsVirtual(pTab) ) return 0; + if( pItem->fg.isIndexedBy ) return 0; + iCur = pItem->iCursor; + pWC = &pWInfo->sWC; + pLoop = pBuilder->pNew; + pLoop->wsFlags = 0; + pLoop->nSkip = 0; + pTerm = sqlite3WhereFindTerm(pWC, iCur, -1, 0, WO_EQ|WO_IS, 0); + if( pTerm ){ + testcase( pTerm->eOperator & WO_IS ); + pLoop->wsFlags = WHERE_COLUMN_EQ|WHERE_IPK|WHERE_ONEROW; + pLoop->aLTerm[0] = pTerm; + pLoop->nLTerm = 1; + pLoop->u.btree.nEq = 1; + /* TUNING: Cost of a rowid lookup is 10 */ + pLoop->rRun = 33; /* 33==sqlite3LogEst(10) */ + }else{ + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + int opMask; + assert( pLoop->aLTermSpace==pLoop->aLTerm ); + if( !IsUniqueIndex(pIdx) + || pIdx->pPartIdxWhere!=0 + || pIdx->nKeyCol>ArraySize(pLoop->aLTermSpace) + ) continue; + opMask = pIdx->uniqNotNull ? (WO_EQ|WO_IS) : WO_EQ; + for(j=0; jnKeyCol; j++){ + pTerm = sqlite3WhereFindTerm(pWC, iCur, j, 0, opMask, pIdx); + if( pTerm==0 ) break; + testcase( pTerm->eOperator & WO_IS ); + pLoop->aLTerm[j] = pTerm; + } + if( j!=pIdx->nKeyCol ) continue; + pLoop->wsFlags = WHERE_COLUMN_EQ|WHERE_ONEROW|WHERE_INDEXED; + if( pIdx->isCovering || (pItem->colUsed & ~columnsInIndex(pIdx))==0 ){ + pLoop->wsFlags |= WHERE_IDX_ONLY; + } + pLoop->nLTerm = j; + pLoop->u.btree.nEq = j; + pLoop->u.btree.pIndex = pIdx; + /* TUNING: Cost of a unique index lookup is 15 */ + pLoop->rRun = 39; /* 39==sqlite3LogEst(15) */ + break; + } + } + if( pLoop->wsFlags ){ + pLoop->nOut = (LogEst)1; + pWInfo->a[0].pWLoop = pLoop; + pLoop->maskSelf = sqlite3WhereGetMask(&pWInfo->sMaskSet, iCur); + pWInfo->a[0].iTabCur = iCur; + pWInfo->nRowOut = 1; + if( pWInfo->pOrderBy ) pWInfo->nOBSat = pWInfo->pOrderBy->nExpr; + if( pWInfo->wctrlFlags & WHERE_WANT_DISTINCT ){ + pWInfo->eDistinct = WHERE_DISTINCT_UNIQUE; + } +#ifdef SQLITE_DEBUG + pLoop->cId = '0'; +#endif + return 1; + } + return 0; +} + +/* +** Generate the beginning of the loop used for WHERE clause processing. +** The return value is a pointer to an opaque structure that contains +** information needed to terminate the loop. Later, the calling routine +** should invoke sqlite3WhereEnd() with the return value of this function +** in order to complete the WHERE clause processing. +** +** If an error occurs, this routine returns NULL. +** +** The basic idea is to do a nested loop, one loop for each table in +** the FROM clause of a select. (INSERT and UPDATE statements are the +** same as a SELECT with only a single table in the FROM clause.) For +** example, if the SQL is this: +** +** SELECT * FROM t1, t2, t3 WHERE ...; +** +** Then the code generated is conceptually like the following: +** +** foreach row1 in t1 do \ Code generated +** foreach row2 in t2 do |-- by sqlite3WhereBegin() +** foreach row3 in t3 do / +** ... +** end \ Code generated +** end |-- by sqlite3WhereEnd() +** end / +** +** Note that the loops might not be nested in the order in which they +** appear in the FROM clause if a different order is better able to make +** use of indices. Note also that when the IN operator appears in +** the WHERE clause, it might result in additional nested loops for +** scanning through all values on the right-hand side of the IN. +** +** There are Btree cursors associated with each table. t1 uses cursor +** number pTabList->a[0].iCursor. t2 uses the cursor pTabList->a[1].iCursor. +** And so forth. This routine generates code to open those VDBE cursors +** and sqlite3WhereEnd() generates the code to close them. +** +** The code that sqlite3WhereBegin() generates leaves the cursors named +** in pTabList pointing at their appropriate entries. The [...] code +** can use OP_Column and OP_Rowid opcodes on these cursors to extract +** data from the various tables of the loop. +** +** If the WHERE clause is empty, the foreach loops must each scan their +** entire tables. Thus a three-way join is an O(N^3) operation. But if +** the tables have indices and there are terms in the WHERE clause that +** refer to those indices, a complete table scan can be avoided and the +** code will run much faster. Most of the work of this routine is checking +** to see if there are indices that can be used to speed up the loop. +** +** Terms of the WHERE clause are also used to limit which rows actually +** make it to the "..." in the middle of the loop. After each "foreach", +** terms of the WHERE clause that use only terms in that loop and outer +** loops are evaluated and if false a jump is made around all subsequent +** inner loops (or around the "..." if the test occurs within the inner- +** most loop) +** +** OUTER JOINS +** +** An outer join of tables t1 and t2 is conceptally coded as follows: +** +** foreach row1 in t1 do +** flag = 0 +** foreach row2 in t2 do +** start: +** ... +** flag = 1 +** end +** if flag==0 then +** move the row2 cursor to a null row +** goto start +** fi +** end +** +** ORDER BY CLAUSE PROCESSING +** +** pOrderBy is a pointer to the ORDER BY clause (or the GROUP BY clause +** if the WHERE_GROUPBY flag is set in wctrlFlags) of a SELECT statement +** if there is one. If there is no ORDER BY clause or if this routine +** is called from an UPDATE or DELETE statement, then pOrderBy is NULL. +** +** The iIdxCur parameter is the cursor number of an index. If +** WHERE_OR_SUBCLAUSE is set, iIdxCur is the cursor number of an index +** to use for OR clause processing. The WHERE clause should use this +** specific cursor. If WHERE_ONEPASS_DESIRED is set, then iIdxCur is +** the first cursor in an array of cursors for all indices. iIdxCur should +** be used to compute the appropriate cursor depending on which index is +** used. +*/ +SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( + Parse *pParse, /* The parser context */ + SrcList *pTabList, /* FROM clause: A list of all tables to be scanned */ + Expr *pWhere, /* The WHERE clause */ + ExprList *pOrderBy, /* An ORDER BY (or GROUP BY) clause, or NULL */ + ExprList *pDistinctSet, /* Try not to output two rows that duplicate these */ + u16 wctrlFlags, /* The WHERE_* flags defined in sqliteInt.h */ + int iAuxArg /* If WHERE_OR_SUBCLAUSE is set, index cursor number + ** If WHERE_USE_LIMIT, then the limit amount */ +){ + 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 */ + WhereLoopBuilder sWLB; /* The WhereLoop builder */ + WhereMaskSet *pMaskSet; /* The expression mask set */ + WhereLevel *pLevel; /* A single level in pWInfo->a[] */ + WhereLoop *pLoop; /* Pointer to a single WhereLoop object */ + int ii; /* Loop counter */ + sqlite3 *db; /* Database connection */ + int rc; /* Return code */ + u8 bFordelete = 0; /* OPFLAG_FORDELETE or zero, as appropriate */ + + assert( (wctrlFlags & WHERE_ONEPASS_MULTIROW)==0 || ( + (wctrlFlags & WHERE_ONEPASS_DESIRED)!=0 + && (wctrlFlags & WHERE_OR_SUBCLAUSE)==0 + )); + + /* Only one of WHERE_OR_SUBCLAUSE or WHERE_USE_LIMIT */ + assert( (wctrlFlags & WHERE_OR_SUBCLAUSE)==0 + || (wctrlFlags & WHERE_USE_LIMIT)==0 ); + + /* Variable initialization */ + db = pParse->db; + memset(&sWLB, 0, sizeof(sWLB)); + + /* An ORDER/GROUP BY clause of more than 63 terms cannot be optimized */ + testcase( pOrderBy && pOrderBy->nExpr==BMS-1 ); + if( pOrderBy && pOrderBy->nExpr>=BMS ) pOrderBy = 0; + sWLB.pOrderBy = pOrderBy; + + /* Disable the DISTINCT optimization if SQLITE_DistinctOpt is set via + ** sqlite3_test_ctrl(SQLITE_TESTCTRL_OPTIMIZATIONS,...) */ + if( OptimizationDisabled(db, SQLITE_DistinctOpt) ){ + wctrlFlags &= ~WHERE_WANT_DISTINCT; + } + + /* The number of tables in the FROM clause is limited by the number of + ** bits in a Bitmask + */ + testcase( pTabList->nSrc==BMS ); + if( pTabList->nSrc>BMS ){ + sqlite3ErrorMsg(pParse, "at most %d tables in a join", BMS); + return 0; + } + + /* This function normally generates a nested loop for all tables in + ** pTabList. But if the WHERE_OR_SUBCLAUSE 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_OR_SUBCLAUSE) ? 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 + ** and the WhereMaskSet structure. Since WhereClause contains an 8-byte + ** field (type Bitmask) it must be aligned on an 8-byte boundary on + ** some architectures. Hence the ROUND8() below. + */ + nByteWInfo = ROUND8(sizeof(WhereInfo)+(nTabList-1)*sizeof(WhereLevel)); + pWInfo = sqlite3DbMallocRawNN(db, nByteWInfo + sizeof(WhereLoop)); + if( db->mallocFailed ){ + sqlite3DbFree(db, pWInfo); + pWInfo = 0; + goto whereBeginError; + } + pWInfo->pParse = pParse; + pWInfo->pTabList = pTabList; + pWInfo->pOrderBy = pOrderBy; + pWInfo->pDistinctSet = pDistinctSet; + pWInfo->aiCurOnePass[0] = pWInfo->aiCurOnePass[1] = -1; + pWInfo->nLevel = nTabList; + pWInfo->iBreak = pWInfo->iContinue = sqlite3VdbeMakeLabel(v); + pWInfo->wctrlFlags = wctrlFlags; + pWInfo->iLimit = iAuxArg; + pWInfo->savedNQueryLoop = pParse->nQueryLoop; + memset(&pWInfo->nOBSat, 0, + offsetof(WhereInfo,sWC) - offsetof(WhereInfo,nOBSat)); + memset(&pWInfo->a[0], 0, sizeof(WhereLoop)+nTabList*sizeof(WhereLevel)); + assert( pWInfo->eOnePass==ONEPASS_OFF ); /* ONEPASS defaults to OFF */ + pMaskSet = &pWInfo->sMaskSet; + sWLB.pWInfo = pWInfo; + sWLB.pWC = &pWInfo->sWC; + sWLB.pNew = (WhereLoop*)(((char*)pWInfo)+nByteWInfo); + assert( EIGHT_BYTE_ALIGNMENT(sWLB.pNew) ); + whereLoopInit(sWLB.pNew); +#ifdef SQLITE_DEBUG + sWLB.pNew->cId = '*'; +#endif + + /* Split the WHERE clause into separate subexpressions where each + ** subexpression is separated by an AND operator. + */ + initMaskSet(pMaskSet); + sqlite3WhereClauseInit(&pWInfo->sWC, pWInfo); + sqlite3WhereSplit(&pWInfo->sWC, pWhere, TK_AND); + + /* Special case: a WHERE clause that is constant. Evaluate the + ** expression and either jump over all of the code or fall thru. + */ + for(ii=0; iinTerm; ii++){ + if( nTabList==0 || sqlite3ExprIsConstantNotJoin(sWLB.pWC->a[ii].pExpr) ){ + sqlite3ExprIfFalse(pParse, sWLB.pWC->a[ii].pExpr, pWInfo->iBreak, + SQLITE_JUMPIFNULL); + sWLB.pWC->a[ii].wtFlags |= TERM_CODED; + } + } + + /* Special case: No FROM clause + */ + if( nTabList==0 ){ + if( pOrderBy ) pWInfo->nOBSat = pOrderBy->nExpr; + if( wctrlFlags & WHERE_WANT_DISTINCT ){ + pWInfo->eDistinct = WHERE_DISTINCT_UNIQUE; + } + } + + /* Assign a bit from the bitmask to every term in the FROM clause. + ** + ** The N-th term of the FROM clause is assigned a bitmask of 1<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_OR_SUBCLAUSE flag is set. + */ + for(ii=0; iinSrc; ii++){ + createMask(pMaskSet, pTabList->a[ii].iCursor); + sqlite3WhereTabFuncArgs(pParse, &pTabList->a[ii], &pWInfo->sWC); + } +#ifdef SQLITE_DEBUG + for(ii=0; iinSrc; ii++){ + Bitmask m = sqlite3WhereGetMask(pMaskSet, pTabList->a[ii].iCursor); + assert( m==MASKBIT(ii) ); + } +#endif + + /* Analyze all of the subexpressions. */ + sqlite3WhereExprAnalyze(pTabList, &pWInfo->sWC); + if( db->mallocFailed ) goto whereBeginError; + + if( wctrlFlags & WHERE_WANT_DISTINCT ){ + if( isDistinctRedundant(pParse, pTabList, &pWInfo->sWC, pDistinctSet) ){ + /* The DISTINCT marking is pointless. Ignore it. */ + pWInfo->eDistinct = WHERE_DISTINCT_UNIQUE; + }else if( pOrderBy==0 ){ + /* Try to ORDER BY the result set to make distinct processing easier */ + pWInfo->wctrlFlags |= WHERE_DISTINCTBY; + pWInfo->pOrderBy = pDistinctSet; + } + } + + /* Construct the WhereLoop objects */ +#if defined(WHERETRACE_ENABLED) + if( sqlite3WhereTrace & 0xffff ){ + sqlite3DebugPrintf("*** Optimizer Start *** (wctrlFlags: 0x%x",wctrlFlags); + if( wctrlFlags & WHERE_USE_LIMIT ){ + sqlite3DebugPrintf(", limit: %d", iAuxArg); + } + sqlite3DebugPrintf(")\n"); + } + if( sqlite3WhereTrace & 0x100 ){ /* Display all terms of the WHERE clause */ + sqlite3WhereClausePrint(sWLB.pWC); + } +#endif + + if( nTabList!=1 || whereShortCut(&sWLB)==0 ){ + rc = whereLoopAddAll(&sWLB); + if( rc ) goto whereBeginError; + +#ifdef WHERETRACE_ENABLED + if( sqlite3WhereTrace ){ /* Display all of the WhereLoop objects */ + WhereLoop *p; + int i; + static const char zLabel[] = "0123456789abcdefghijklmnopqrstuvwyxz" + "ABCDEFGHIJKLMNOPQRSTUVWYXZ"; + for(p=pWInfo->pLoops, i=0; p; p=p->pNextLoop, i++){ + p->cId = zLabel[i%sizeof(zLabel)]; + whereLoopPrint(p, sWLB.pWC); + } + } +#endif + + wherePathSolver(pWInfo, 0); + if( db->mallocFailed ) goto whereBeginError; + if( pWInfo->pOrderBy ){ + wherePathSolver(pWInfo, pWInfo->nRowOut+1); + if( db->mallocFailed ) goto whereBeginError; + } + } + if( pWInfo->pOrderBy==0 && (db->flags & SQLITE_ReverseOrder)!=0 ){ + pWInfo->revMask = ALLBITS; + } + if( pParse->nErr || NEVER(db->mallocFailed) ){ + goto whereBeginError; + } +#ifdef WHERETRACE_ENABLED + if( sqlite3WhereTrace ){ + sqlite3DebugPrintf("---- Solution nRow=%d", pWInfo->nRowOut); + if( pWInfo->nOBSat>0 ){ + sqlite3DebugPrintf(" ORDERBY=%d,0x%llx", pWInfo->nOBSat, pWInfo->revMask); + } + switch( pWInfo->eDistinct ){ + case WHERE_DISTINCT_UNIQUE: { + sqlite3DebugPrintf(" DISTINCT=unique"); + break; + } + case WHERE_DISTINCT_ORDERED: { + sqlite3DebugPrintf(" DISTINCT=ordered"); + break; + } + case WHERE_DISTINCT_UNORDERED: { + sqlite3DebugPrintf(" DISTINCT=unordered"); + break; + } + } + sqlite3DebugPrintf("\n"); + for(ii=0; iinLevel; ii++){ + whereLoopPrint(pWInfo->a[ii].pWLoop, sWLB.pWC); + } + } +#endif + /* Attempt to omit tables from the join that do not effect the result */ + if( pWInfo->nLevel>=2 + && pDistinctSet!=0 + && OptimizationEnabled(db, SQLITE_OmitNoopJoin) + ){ + Bitmask tabUsed = sqlite3WhereExprListUsage(pMaskSet, pDistinctSet); + if( sWLB.pOrderBy ){ + tabUsed |= sqlite3WhereExprListUsage(pMaskSet, sWLB.pOrderBy); + } + while( pWInfo->nLevel>=2 ){ + WhereTerm *pTerm, *pEnd; + pLoop = pWInfo->a[pWInfo->nLevel-1].pWLoop; + if( (pWInfo->pTabList->a[pLoop->iTab].fg.jointype & JT_LEFT)==0 ) break; + if( (wctrlFlags & WHERE_WANT_DISTINCT)==0 + && (pLoop->wsFlags & WHERE_ONEROW)==0 + ){ + break; + } + if( (tabUsed & pLoop->maskSelf)!=0 ) break; + pEnd = sWLB.pWC->a + sWLB.pWC->nTerm; + for(pTerm=sWLB.pWC->a; pTermprereqAll & pLoop->maskSelf)!=0 + && !ExprHasProperty(pTerm->pExpr, EP_FromJoin) + ){ + break; + } + } + if( pTerm drop loop %c not used\n", pLoop->cId)); + pWInfo->nLevel--; + nTabList--; + } + } + WHERETRACE(0xffff,("*** Optimizer Finished ***\n")); + pWInfo->pParse->nQueryLoop += pWInfo->nRowOut; + + /* If the caller is an UPDATE or DELETE statement that is requesting + ** to use a one-pass algorithm, determine if this is appropriate. + */ + assert( (wctrlFlags & WHERE_ONEPASS_DESIRED)==0 || pWInfo->nLevel==1 ); + if( (wctrlFlags & WHERE_ONEPASS_DESIRED)!=0 ){ + int wsFlags = pWInfo->a[0].pWLoop->wsFlags; + int bOnerow = (wsFlags & WHERE_ONEROW)!=0; + if( bOnerow + || ((wctrlFlags & WHERE_ONEPASS_MULTIROW)!=0 + && 0==(wsFlags & WHERE_VIRTUALTABLE)) + ){ + pWInfo->eOnePass = bOnerow ? ONEPASS_SINGLE : ONEPASS_MULTI; + if( HasRowid(pTabList->a[0].pTab) && (wsFlags & WHERE_IDX_ONLY) ){ + if( wctrlFlags & WHERE_ONEPASS_MULTIROW ){ + bFordelete = OPFLAG_FORDELETE; + } + pWInfo->a[0].pWLoop->wsFlags = (wsFlags & ~WHERE_IDX_ONLY); + } + } + } + + /* Open all tables in the pTabList and any indices selected for + ** searching those tables. + */ + for(ii=0, pLevel=pWInfo->a; iia[pLevel->iFrom]; + pTab = pTabItem->pTab; + iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + pLoop = pLevel->pWLoop; + if( (pTab->tabFlags & TF_Ephemeral)!=0 || pTab->pSelect ){ + /* Do nothing */ + }else +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( (pLoop->wsFlags & WHERE_VIRTUALTABLE)!=0 ){ + const char *pVTab = (const char *)sqlite3GetVTable(db, pTab); + int iCur = pTabItem->iCursor; + sqlite3VdbeAddOp4(v, OP_VOpen, iCur, 0, 0, pVTab, P4_VTAB); + }else if( IsVirtual(pTab) ){ + /* noop */ + }else +#endif + if( (pLoop->wsFlags & WHERE_IDX_ONLY)==0 + && (wctrlFlags & WHERE_OR_SUBCLAUSE)==0 ){ + int op = OP_OpenRead; + if( pWInfo->eOnePass!=ONEPASS_OFF ){ + op = OP_OpenWrite; + pWInfo->aiCurOnePass[0] = pTabItem->iCursor; + }; + sqlite3OpenTable(pParse, pTabItem->iCursor, iDb, pTab, op); + assert( pTabItem->iCursor==pLevel->iTabCur ); + testcase( pWInfo->eOnePass==ONEPASS_OFF && pTab->nCol==BMS-1 ); + testcase( pWInfo->eOnePass==ONEPASS_OFF && pTab->nCol==BMS ); + if( pWInfo->eOnePass==ONEPASS_OFF && pTab->nColcolUsed; + int n = 0; + for(; b; b=b>>1, n++){} + sqlite3VdbeChangeP4(v, -1, SQLITE_INT_TO_PTR(n), P4_INT32); + assert( n<=pTab->nCol ); + } +#ifdef SQLITE_ENABLE_CURSOR_HINTS + if( pLoop->u.btree.pIndex!=0 ){ + sqlite3VdbeChangeP5(v, OPFLAG_SEEKEQ|bFordelete); + }else +#endif + { + sqlite3VdbeChangeP5(v, bFordelete); + } +#ifdef SQLITE_ENABLE_COLUMN_USED_MASK + sqlite3VdbeAddOp4Dup8(v, OP_ColumnsUsed, pTabItem->iCursor, 0, 0, + (const u8*)&pTabItem->colUsed, P4_INT64); +#endif + }else{ + sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName); + } + if( pLoop->wsFlags & WHERE_INDEXED ){ + Index *pIx = pLoop->u.btree.pIndex; + int iIndexCur; + int op = OP_OpenRead; + /* iAuxArg is always set if to a positive value if ONEPASS is possible */ + assert( iAuxArg!=0 || (pWInfo->wctrlFlags & WHERE_ONEPASS_DESIRED)==0 ); + if( !HasRowid(pTab) && IsPrimaryKeyIndex(pIx) + && (wctrlFlags & WHERE_OR_SUBCLAUSE)!=0 + ){ + /* This is one term of an OR-optimization using the PRIMARY KEY of a + ** WITHOUT ROWID table. No need for a separate index */ + iIndexCur = pLevel->iTabCur; + op = 0; + }else if( pWInfo->eOnePass!=ONEPASS_OFF ){ + Index *pJ = pTabItem->pTab->pIndex; + iIndexCur = iAuxArg; + assert( wctrlFlags & WHERE_ONEPASS_DESIRED ); + while( ALWAYS(pJ) && pJ!=pIx ){ + iIndexCur++; + pJ = pJ->pNext; + } + op = OP_OpenWrite; + pWInfo->aiCurOnePass[1] = iIndexCur; + }else if( iAuxArg && (wctrlFlags & WHERE_OR_SUBCLAUSE)!=0 ){ + iIndexCur = iAuxArg; + op = OP_ReopenIdx; + }else{ + iIndexCur = pParse->nTab++; + } + pLevel->iIdxCur = iIndexCur; + assert( pIx->pSchema==pTab->pSchema ); + assert( iIndexCur>=0 ); + if( op ){ + sqlite3VdbeAddOp3(v, op, iIndexCur, pIx->tnum, iDb); + sqlite3VdbeSetP4KeyInfo(pParse, pIx); + if( (pLoop->wsFlags & WHERE_CONSTRAINT)!=0 + && (pLoop->wsFlags & (WHERE_COLUMN_RANGE|WHERE_SKIPSCAN))==0 + && (pWInfo->wctrlFlags&WHERE_ORDERBY_MIN)==0 + ){ + sqlite3VdbeChangeP5(v, OPFLAG_SEEKEQ); /* Hint to COMDB2 */ + } + VdbeComment((v, "%s", pIx->zName)); +#ifdef SQLITE_ENABLE_COLUMN_USED_MASK + { + u64 colUsed = 0; + int ii, jj; + for(ii=0; iinColumn; ii++){ + jj = pIx->aiColumn[ii]; + if( jj<0 ) continue; + if( jj>63 ) jj = 63; + if( (pTabItem->colUsed & MASKBIT(jj))==0 ) continue; + colUsed |= ((u64)1)<<(ii<63 ? ii : 63); + } + sqlite3VdbeAddOp4Dup8(v, OP_ColumnsUsed, iIndexCur, 0, 0, + (u8*)&colUsed, P4_INT64); + } +#endif /* SQLITE_ENABLE_COLUMN_USED_MASK */ + } + } + if( iDb>=0 ) sqlite3CodeVerifySchema(pParse, iDb); + } + pWInfo->iTop = sqlite3VdbeCurrentAddr(v); + if( db->mallocFailed ) goto whereBeginError; + + /* Generate the code to do the search. Each iteration of the for + ** loop below generates code for a single nested loop of the VM + ** program. + */ + notReady = ~(Bitmask)0; + for(ii=0; iia[ii]; + wsFlags = pLevel->pWLoop->wsFlags; +#ifndef SQLITE_OMIT_AUTOMATIC_INDEX + if( (pLevel->pWLoop->wsFlags & WHERE_AUTO_INDEX)!=0 ){ + constructAutomaticIndex(pParse, &pWInfo->sWC, + &pTabList->a[pLevel->iFrom], notReady, pLevel); + if( db->mallocFailed ) goto whereBeginError; + } +#endif + addrExplain = sqlite3WhereExplainOneScan( + pParse, pTabList, pLevel, ii, pLevel->iFrom, wctrlFlags + ); + pLevel->addrBody = sqlite3VdbeCurrentAddr(v); + notReady = sqlite3WhereCodeOneLoopStart(pWInfo, ii, notReady); + pWInfo->iContinue = pLevel->addrCont; + if( (wsFlags&WHERE_MULTI_OR)==0 && (wctrlFlags&WHERE_OR_SUBCLAUSE)==0 ){ + sqlite3WhereAddScanStatus(v, pTabList, pLevel, addrExplain); + } + } + + /* Done. */ + VdbeModuleComment((v, "Begin WHERE-core")); + return pWInfo; + + /* Jump here if malloc fails */ +whereBeginError: + if( pWInfo ){ + pParse->nQueryLoop = pWInfo->savedNQueryLoop; + whereInfoFree(db, pWInfo); + } + return 0; +} + +/* +** Generate the end of the WHERE loop. See comments on +** sqlite3WhereBegin() for additional information. +*/ +SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ + Parse *pParse = pWInfo->pParse; + Vdbe *v = pParse->pVdbe; + int i; + WhereLevel *pLevel; + WhereLoop *pLoop; + SrcList *pTabList = pWInfo->pTabList; + sqlite3 *db = pParse->db; + + /* Generate loop termination code. + */ + VdbeModuleComment((v, "End WHERE-core")); + sqlite3ExprCacheClear(pParse); + for(i=pWInfo->nLevel-1; i>=0; i--){ + int addr; + pLevel = &pWInfo->a[i]; + pLoop = pLevel->pWLoop; + sqlite3VdbeResolveLabel(v, pLevel->addrCont); + if( pLevel->op!=OP_Noop ){ + sqlite3VdbeAddOp3(v, pLevel->op, pLevel->p1, pLevel->p2, pLevel->p3); + sqlite3VdbeChangeP5(v, pLevel->p5); + VdbeCoverage(v); + VdbeCoverageIf(v, pLevel->op==OP_Next); + VdbeCoverageIf(v, pLevel->op==OP_Prev); + VdbeCoverageIf(v, pLevel->op==OP_VNext); + } + if( pLoop->wsFlags & WHERE_IN_ABLE && pLevel->u.in.nIn>0 ){ + struct InLoop *pIn; + int j; + sqlite3VdbeResolveLabel(v, pLevel->addrNxt); + for(j=pLevel->u.in.nIn, pIn=&pLevel->u.in.aInLoop[j-1]; j>0; j--, pIn--){ + sqlite3VdbeJumpHere(v, pIn->addrInTop+1); + if( pIn->eEndLoopOp!=OP_Noop ){ + sqlite3VdbeAddOp2(v, pIn->eEndLoopOp, pIn->iCur, pIn->addrInTop); + VdbeCoverage(v); + VdbeCoverageIf(v, pIn->eEndLoopOp==OP_PrevIfOpen); + VdbeCoverageIf(v, pIn->eEndLoopOp==OP_NextIfOpen); + } + sqlite3VdbeJumpHere(v, pIn->addrInTop-1); + } + } + sqlite3VdbeResolveLabel(v, pLevel->addrBrk); + if( pLevel->addrSkip ){ + sqlite3VdbeGoto(v, pLevel->addrSkip); + VdbeComment((v, "next skip-scan on %s", pLoop->u.btree.pIndex->zName)); + sqlite3VdbeJumpHere(v, pLevel->addrSkip); + sqlite3VdbeJumpHere(v, pLevel->addrSkip-2); + } +#ifndef SQLITE_LIKE_DOESNT_MATCH_BLOBS + if( pLevel->addrLikeRep ){ + sqlite3VdbeAddOp2(v, OP_DecrJumpZero, (int)(pLevel->iLikeRepCntr>>1), + pLevel->addrLikeRep); + VdbeCoverage(v); + } +#endif + if( pLevel->iLeftJoin ){ + int ws = pLoop->wsFlags; + addr = sqlite3VdbeAddOp1(v, OP_IfPos, pLevel->iLeftJoin); VdbeCoverage(v); + assert( (ws & WHERE_IDX_ONLY)==0 || (ws & WHERE_INDEXED)!=0 ); + if( (ws & WHERE_IDX_ONLY)==0 ){ + sqlite3VdbeAddOp1(v, OP_NullRow, pTabList->a[i].iCursor); + } + if( (ws & WHERE_INDEXED) + || ((ws & WHERE_MULTI_OR) && pLevel->u.pCovidx) + ){ + sqlite3VdbeAddOp1(v, OP_NullRow, pLevel->iIdxCur); + } + if( pLevel->op==OP_Return ){ + sqlite3VdbeAddOp2(v, OP_Gosub, pLevel->p1, pLevel->addrFirst); + }else{ + sqlite3VdbeGoto(v, pLevel->addrFirst); + } + sqlite3VdbeJumpHere(v, addr); + } + VdbeModuleComment((v, "End WHERE-loop%d: %s", i, + pWInfo->pTabList->a[pLevel->iFrom].pTab->zName)); + } + + /* The "break" point is here, just past the end of the outer loop. + ** Set it. + */ + sqlite3VdbeResolveLabel(v, pWInfo->iBreak); + + assert( pWInfo->nLevel<=pTabList->nSrc ); + for(i=0, pLevel=pWInfo->a; inLevel; i++, pLevel++){ + int k, last; + VdbeOp *pOp; + Index *pIdx = 0; + struct SrcList_item *pTabItem = &pTabList->a[pLevel->iFrom]; + Table *pTab = pTabItem->pTab; + assert( pTab!=0 ); + pLoop = pLevel->pWLoop; + + /* For a co-routine, change all OP_Column references to the table of + ** the co-routine into OP_Copy of result contained in a register. + ** OP_Rowid becomes OP_Null. + */ + if( pTabItem->fg.viaCoroutine && !db->mallocFailed ){ + translateColumnToCopy(v, pLevel->addrBody, pLevel->iTabCur, + pTabItem->regResult, 0); + continue; + } + + /* Close all of the cursors that were opened by sqlite3WhereBegin. + ** Except, do not close cursors that will be reused by the OR optimization + ** (WHERE_OR_SUBCLAUSE). And do not close the OP_OpenWrite cursors + ** created for the ONEPASS optimization. + */ + if( (pTab->tabFlags & TF_Ephemeral)==0 + && pTab->pSelect==0 + && (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0 + ){ + int ws = pLoop->wsFlags; + if( pWInfo->eOnePass==ONEPASS_OFF && (ws & WHERE_IDX_ONLY)==0 ){ + sqlite3VdbeAddOp1(v, OP_Close, pTabItem->iCursor); + } + if( (ws & WHERE_INDEXED)!=0 + && (ws & (WHERE_IPK|WHERE_AUTO_INDEX))==0 + && pLevel->iIdxCur!=pWInfo->aiCurOnePass[1] + ){ + sqlite3VdbeAddOp1(v, OP_Close, pLevel->iIdxCur); + } + } + + /* If this scan uses an index, make VDBE code substitutions to read data + ** from the index instead of from the table where possible. In some cases + ** this optimization prevents the table from ever being read, which can + ** yield a significant performance boost. + ** + ** Calls to the code generator in between sqlite3WhereBegin and + ** sqlite3WhereEnd will have created code that references the table + ** directly. This loop scans all that code looking for opcodes + ** that reference the table and converts them into opcodes that + ** reference the index. + */ + if( pLoop->wsFlags & (WHERE_INDEXED|WHERE_IDX_ONLY) ){ + pIdx = pLoop->u.btree.pIndex; + }else if( pLoop->wsFlags & WHERE_MULTI_OR ){ + pIdx = pLevel->u.pCovidx; + } + if( pIdx + && (pWInfo->eOnePass==ONEPASS_OFF || !HasRowid(pIdx->pTable)) + && !db->mallocFailed + ){ + last = sqlite3VdbeCurrentAddr(v); + k = pLevel->addrBody; + pOp = sqlite3VdbeGetOp(v, k); + for(; kp1!=pLevel->iTabCur ) continue; + if( pOp->opcode==OP_Column ){ + int x = pOp->p2; + assert( pIdx->pTable==pTab ); + if( !HasRowid(pTab) ){ + Index *pPk = sqlite3PrimaryKeyIndex(pTab); + x = pPk->aiColumn[x]; + assert( x>=0 ); + } + x = sqlite3ColumnOfIndex(pIdx, x); + if( x>=0 ){ + pOp->p2 = x; + pOp->p1 = pLevel->iIdxCur; + } + assert( (pLoop->wsFlags & WHERE_IDX_ONLY)==0 || x>=0 ); + }else if( pOp->opcode==OP_Rowid ){ + pOp->p1 = pLevel->iIdxCur; + pOp->opcode = OP_IdxRowid; + } + } + } + } + + /* Final cleanup + */ + pParse->nQueryLoop = pWInfo->savedNQueryLoop; + whereInfoFree(db, pWInfo); + return; +} + +/************** End of where.c ***********************************************/ +/************** Begin file parse.c *******************************************/ +/* +** 2000-05-29 +** +** 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. +** +************************************************************************* +** Driver template for the LEMON parser generator. +** +** The "lemon" program processes an LALR(1) input grammar file, then uses +** this template to construct a parser. The "lemon" program inserts text +** at each "%%" line. Also, any "P-a-r-s-e" identifer prefix (without the +** interstitial "-" characters) contained in this template is changed into +** the value of the %name directive from the grammar. Otherwise, the content +** of this template is copied straight through into the generate parser +** source file. +** +** The following is the concatenation of all %include directives from the +** input grammar file: +*/ +/* #include */ +/************ Begin %include sections from the grammar ************************/ + +/* #include "sqliteInt.h" */ + +/* +** Disable all error recovery processing in the parser push-down +** automaton. +*/ +#define YYNOERRORRECOVERY 1 + +/* +** Make yytestcase() the same as testcase() +*/ +#define yytestcase(X) testcase(X) + +/* +** Indicate that sqlite3ParserFree() will never be called with a null +** pointer. +*/ +#define YYPARSEFREENEVERNULL 1 + +/* +** Alternative datatype for the argument to the malloc() routine passed +** into sqlite3ParserAlloc(). The default is size_t. +*/ +#define YYMALLOCARGTYPE u64 + +/* +** An instance of this structure holds information about the +** LIMIT clause of a SELECT statement. +*/ +struct LimitVal { + Expr *pLimit; /* The LIMIT expression. NULL if there is no limit */ + Expr *pOffset; /* The OFFSET expression. NULL if there is none */ +}; + +/* +** An instance of the following structure describes the event of a +** TRIGGER. "a" is the event type, one of TK_UPDATE, TK_INSERT, +** TK_DELETE, or TK_INSTEAD. If the event is of the form +** +** UPDATE ON (a,b,c) +** +** Then the "b" IdList records the list "a,b,c". +*/ +struct TrigEvent { int a; IdList * b; }; + +/* +** Disable lookaside memory allocation for objects that might be +** shared across database connections. +*/ +static void disableLookaside(Parse *pParse){ + pParse->disableLookaside++; + pParse->db->lookaside.bDisable++; +} + + + /* + ** For a compound SELECT statement, make sure p->pPrior->pNext==p for + ** all elements in the list. And make sure list length does not exceed + ** SQLITE_LIMIT_COMPOUND_SELECT. + */ + static void parserDoubleLinkSelect(Parse *pParse, Select *p){ + if( p->pPrior ){ + Select *pNext = 0, *pLoop; + int mxSelect, cnt = 0; + for(pLoop=p; pLoop; pNext=pLoop, pLoop=pLoop->pPrior, cnt++){ + pLoop->pNext = pNext; + pLoop->selFlags |= SF_Compound; + } + if( (p->selFlags & SF_MultiValue)==0 && + (mxSelect = pParse->db->aLimit[SQLITE_LIMIT_COMPOUND_SELECT])>0 && + cnt>mxSelect + ){ + sqlite3ErrorMsg(pParse, "too many terms in compound SELECT"); + } + } + } + + /* This is a utility routine used to set the ExprSpan.zStart and + ** ExprSpan.zEnd values of pOut so that the span covers the complete + ** range of text beginning with pStart and going to the end of pEnd. + */ + static void spanSet(ExprSpan *pOut, Token *pStart, Token *pEnd){ + pOut->zStart = pStart->z; + pOut->zEnd = &pEnd->z[pEnd->n]; + } + + /* Construct a new Expr object from a single identifier. Use the + ** new Expr to populate pOut. Set the span of pOut to be the identifier + ** that created the expression. + */ + static void spanExpr(ExprSpan *pOut, Parse *pParse, int op, Token t){ + Expr *p = sqlite3DbMallocRawNN(pParse->db, sizeof(Expr)+t.n+1); + if( p ){ + memset(p, 0, sizeof(Expr)); + p->op = (u8)op; + p->flags = EP_Leaf; + p->iAgg = -1; + p->u.zToken = (char*)&p[1]; + memcpy(p->u.zToken, t.z, t.n); + p->u.zToken[t.n] = 0; + if( sqlite3Isquote(p->u.zToken[0]) ){ + if( p->u.zToken[0]=='"' ) p->flags |= EP_DblQuoted; + sqlite3Dequote(p->u.zToken); + } +#if SQLITE_MAX_EXPR_DEPTH>0 + p->nHeight = 1; +#endif + } + pOut->pExpr = p; + pOut->zStart = t.z; + pOut->zEnd = &t.z[t.n]; + } + + /* This routine constructs a binary expression node out of two ExprSpan + ** objects and uses the result to populate a new ExprSpan object. + */ + static void spanBinaryExpr( + Parse *pParse, /* The parsing context. Errors accumulate here */ + int op, /* The binary operation */ + ExprSpan *pLeft, /* The left operand, and output */ + ExprSpan *pRight /* The right operand */ + ){ + pLeft->pExpr = sqlite3PExpr(pParse, op, pLeft->pExpr, pRight->pExpr, 0); + pLeft->zEnd = pRight->zEnd; + } + + /* If doNot is true, then add a TK_NOT Expr-node wrapper around the + ** outside of *ppExpr. + */ + static void exprNot(Parse *pParse, int doNot, ExprSpan *pSpan){ + if( doNot ){ + pSpan->pExpr = sqlite3PExpr(pParse, TK_NOT, pSpan->pExpr, 0, 0); + } + } + + /* Construct an expression node for a unary postfix operator + */ + static void spanUnaryPostfix( + Parse *pParse, /* Parsing context to record errors */ + int op, /* The operator */ + ExprSpan *pOperand, /* The operand, and output */ + Token *pPostOp /* The operand token for setting the span */ + ){ + pOperand->pExpr = sqlite3PExpr(pParse, op, pOperand->pExpr, 0, 0); + pOperand->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( pA && pY && 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( + ExprSpan *pOut, /* Write the new expression node here */ + Parse *pParse, /* Parsing context to record errors */ + int op, /* The operator */ + ExprSpan *pOperand, /* The operand */ + Token *pPreOp /* The operand token for setting the span */ + ){ + pOut->zStart = pPreOp->z; + pOut->pExpr = sqlite3PExpr(pParse, op, pOperand->pExpr, 0, 0); + pOut->zEnd = pOperand->zEnd; + } + + /* Add a single new term to an ExprList that is used to store a + ** list of identifiers. Report an error if the ID list contains + ** a COLLATE clause or an ASC or DESC keyword, except ignore the + ** error while parsing a legacy schema. + */ + static ExprList *parserAddExprIdListTerm( + Parse *pParse, + ExprList *pPrior, + Token *pIdToken, + int hasCollate, + int sortOrder + ){ + ExprList *p = sqlite3ExprListAppend(pParse, pPrior, 0); + if( (hasCollate || sortOrder!=SQLITE_SO_UNDEFINED) + && pParse->db->init.busy==0 + ){ + sqlite3ErrorMsg(pParse, "syntax error after column name \"%.*s\"", + pIdToken->n, pIdToken->z); + } + sqlite3ExprListSetName(pParse, p, pIdToken, 1); + return p; + } +/**************** End of %include directives **********************************/ +/* These constants specify the various numeric values for terminal symbols +** in a format understandable to "makeheaders". This section is blank unless +** "lemon" is run with the "-m" command-line option. +***************** Begin makeheaders token definitions *************************/ +/**************** End makeheaders token definitions ***************************/ + +/* The next sections is a series of control #defines. +** various aspects of the generated parser. +** YYCODETYPE is the data type used to store the integer codes +** that represent terminal and non-terminal symbols. +** "unsigned char" is used if there are fewer than +** 256 symbols. Larger types otherwise. +** YYNOCODE is a number of type YYCODETYPE that is not used for +** any terminal or nonterminal symbol. +** YYFALLBACK If defined, this indicates that one or more tokens +** (also known as: "terminal symbols") have fall-back +** values which should be used if the original symbol +** would not parse. This permits keywords to sometimes +** be used as identifiers, for example. +** YYACTIONTYPE is the data type used for "action codes" - numbers +** that indicate what to do in response to the next +** token. +** sqlite3ParserTOKENTYPE is the data type used for minor type for terminal +** symbols. Background: A "minor type" is a semantic +** value associated with a terminal or non-terminal +** symbols. For example, for an "ID" terminal symbol, +** the minor type might be the name of the identifier. +** Each non-terminal can have a different minor type. +** Terminal symbols all have the same minor type, though. +** This macros defines the minor type for terminal +** symbols. +** YYMINORTYPE is the data type used for all minor types. +** This is typically a union of many types, one of +** which is sqlite3ParserTOKENTYPE. The entry in the union +** for terminal symbols is called "yy0". +** YYSTACKDEPTH is the maximum depth of the parser's stack. If +** zero the stack is dynamically sized using realloc() +** sqlite3ParserARG_SDECL A static variable declaration for the %extra_argument +** sqlite3ParserARG_PDECL A parameter declaration for the %extra_argument +** sqlite3ParserARG_STORE Code to store %extra_argument into yypParser +** sqlite3ParserARG_FETCH Code to extract %extra_argument from yypParser +** YYERRORSYMBOL is the code number of the error symbol. If not +** defined, then do no error processing. +** YYNSTATE the combined number of states. +** YYNRULE the number of rules in the grammar +** YY_MAX_SHIFT Maximum value for shift actions +** YY_MIN_SHIFTREDUCE Minimum value for shift-reduce actions +** YY_MAX_SHIFTREDUCE Maximum value for shift-reduce actions +** YY_MIN_REDUCE Maximum value for reduce actions +** YY_ERROR_ACTION The yy_action[] code for syntax error +** YY_ACCEPT_ACTION The yy_action[] code for accept +** YY_NO_ACTION The yy_action[] code for no-op +*/ +#ifndef INTERFACE +# define INTERFACE 1 +#endif +/************* Begin control #defines *****************************************/ +#define YYCODETYPE unsigned char +#define YYNOCODE 252 +#define YYACTIONTYPE unsigned short int +#define YYWILDCARD 96 +#define sqlite3ParserTOKENTYPE Token +typedef union { + int yyinit; + sqlite3ParserTOKENTYPE yy0; + Expr* yy72; + TriggerStep* yy145; + ExprList* yy148; + SrcList* yy185; + ExprSpan yy190; + int yy194; + Select* yy243; + IdList* yy254; + With* yy285; + struct TrigEvent yy332; + struct LimitVal yy354; + struct {int value; int mask;} yy497; +} YYMINORTYPE; +#ifndef YYSTACKDEPTH +#define YYSTACKDEPTH 100 +#endif +#define sqlite3ParserARG_SDECL Parse *pParse; +#define sqlite3ParserARG_PDECL ,Parse *pParse +#define sqlite3ParserARG_FETCH Parse *pParse = yypParser->pParse +#define sqlite3ParserARG_STORE yypParser->pParse = pParse +#define YYFALLBACK 1 +#define YYNSTATE 456 +#define YYNRULE 332 +#define YY_MAX_SHIFT 455 +#define YY_MIN_SHIFTREDUCE 668 +#define YY_MAX_SHIFTREDUCE 999 +#define YY_MIN_REDUCE 1000 +#define YY_MAX_REDUCE 1331 +#define YY_ERROR_ACTION 1332 +#define YY_ACCEPT_ACTION 1333 +#define YY_NO_ACTION 1334 +/************* End control #defines *******************************************/ + +/* Define the yytestcase() macro to be a no-op if is not already defined +** otherwise. +** +** Applications can choose to define yytestcase() in the %include section +** to a macro that can assist in verifying code coverage. For production +** code the yytestcase() macro should be turned off. But it is useful +** for testing. +*/ +#ifndef yytestcase +# define yytestcase(X) +#endif + + +/* Next are the tables used to determine what action to take based on the +** current state and lookahead token. These tables are used to implement +** functions that take a state number and lookahead value and return an +** action integer. +** +** Suppose the action integer is N. Then the action is determined as +** follows +** +** 0 <= N <= YY_MAX_SHIFT Shift N. That is, push the lookahead +** token onto the stack and goto state N. +** +** N between YY_MIN_SHIFTREDUCE Shift to an arbitrary state then +** and YY_MAX_SHIFTREDUCE reduce by rule N-YY_MIN_SHIFTREDUCE. +** +** N between YY_MIN_REDUCE Reduce by rule N-YY_MIN_REDUCE +** and YY_MAX_REDUCE +** +** N == YY_ERROR_ACTION A syntax error has occurred. +** +** N == YY_ACCEPT_ACTION The parser accepts its input. +** +** N == YY_NO_ACTION No such action. Denotes unused +** slots in the yy_action[] table. +** +** The action table is constructed as a single large table named yy_action[]. +** Given state S and lookahead X, the action is computed as either: +** +** (A) N = yy_action[ yy_shift_ofst[S] + X ] +** (B) N = yy_default[S] +** +** The (A) formula is preferred. The B formula is used instead if: +** (1) The yy_shift_ofst[S]+X value is out of range, or +** (2) yy_lookahead[yy_shift_ofst[S]+X] is not equal to X, or +** (3) yy_shift_ofst[S] equal YY_SHIFT_USE_DFLT. +** (Implementation note: YY_SHIFT_USE_DFLT is chosen so that +** YY_SHIFT_USE_DFLT+X will be out of range for all possible lookaheads X. +** Hence only tests (1) and (2) need to be evaluated.) +** +** The formulas above are for computing the action when the lookahead is +** a terminal symbol. If the lookahead is a non-terminal (as occurs after +** a reduce action) then the yy_reduce_ofst[] array is used in place of +** the yy_shift_ofst[] array and YY_REDUCE_USE_DFLT is used in place of +** YY_SHIFT_USE_DFLT. +** +** The following are the tables generated in this section: +** +** yy_action[] A single table containing all actions. +** yy_lookahead[] A table containing the lookahead for each entry in +** yy_action. Used to detect hash collisions. +** yy_shift_ofst[] For each state, the offset into yy_action for +** shifting terminals. +** yy_reduce_ofst[] For each state, the offset into yy_action for +** shifting non-terminals after a reduce. +** yy_default[] Default action for each state. +** +*********** Begin parsing tables **********************************************/ +#define YY_ACTTAB_COUNT (1567) +static const YYACTIONTYPE yy_action[] = { + /* 0 */ 325, 832, 351, 825, 5, 203, 203, 819, 99, 100, + /* 10 */ 90, 842, 842, 854, 857, 846, 846, 97, 97, 98, + /* 20 */ 98, 98, 98, 301, 96, 96, 96, 96, 95, 95, + /* 30 */ 94, 94, 94, 93, 351, 325, 977, 977, 824, 824, + /* 40 */ 826, 947, 354, 99, 100, 90, 842, 842, 854, 857, + /* 50 */ 846, 846, 97, 97, 98, 98, 98, 98, 338, 96, + /* 60 */ 96, 96, 96, 95, 95, 94, 94, 94, 93, 351, + /* 70 */ 95, 95, 94, 94, 94, 93, 351, 791, 977, 977, + /* 80 */ 325, 94, 94, 94, 93, 351, 792, 75, 99, 100, + /* 90 */ 90, 842, 842, 854, 857, 846, 846, 97, 97, 98, + /* 100 */ 98, 98, 98, 450, 96, 96, 96, 96, 95, 95, + /* 110 */ 94, 94, 94, 93, 351, 1333, 155, 155, 2, 325, + /* 120 */ 275, 146, 132, 52, 52, 93, 351, 99, 100, 90, + /* 130 */ 842, 842, 854, 857, 846, 846, 97, 97, 98, 98, + /* 140 */ 98, 98, 101, 96, 96, 96, 96, 95, 95, 94, + /* 150 */ 94, 94, 93, 351, 958, 958, 325, 268, 428, 413, + /* 160 */ 411, 61, 752, 752, 99, 100, 90, 842, 842, 854, + /* 170 */ 857, 846, 846, 97, 97, 98, 98, 98, 98, 60, + /* 180 */ 96, 96, 96, 96, 95, 95, 94, 94, 94, 93, + /* 190 */ 351, 325, 270, 329, 273, 277, 959, 960, 250, 99, + /* 200 */ 100, 90, 842, 842, 854, 857, 846, 846, 97, 97, + /* 210 */ 98, 98, 98, 98, 301, 96, 96, 96, 96, 95, + /* 220 */ 95, 94, 94, 94, 93, 351, 325, 938, 1326, 698, + /* 230 */ 706, 1326, 242, 412, 99, 100, 90, 842, 842, 854, + /* 240 */ 857, 846, 846, 97, 97, 98, 98, 98, 98, 347, + /* 250 */ 96, 96, 96, 96, 95, 95, 94, 94, 94, 93, + /* 260 */ 351, 325, 938, 1327, 384, 699, 1327, 381, 379, 99, + /* 270 */ 100, 90, 842, 842, 854, 857, 846, 846, 97, 97, + /* 280 */ 98, 98, 98, 98, 701, 96, 96, 96, 96, 95, + /* 290 */ 95, 94, 94, 94, 93, 351, 325, 92, 89, 178, + /* 300 */ 833, 936, 373, 700, 99, 100, 90, 842, 842, 854, + /* 310 */ 857, 846, 846, 97, 97, 98, 98, 98, 98, 375, + /* 320 */ 96, 96, 96, 96, 95, 95, 94, 94, 94, 93, + /* 330 */ 351, 325, 1276, 947, 354, 818, 936, 739, 739, 99, + /* 340 */ 100, 90, 842, 842, 854, 857, 846, 846, 97, 97, + /* 350 */ 98, 98, 98, 98, 230, 96, 96, 96, 96, 95, + /* 360 */ 95, 94, 94, 94, 93, 351, 325, 969, 227, 92, + /* 370 */ 89, 178, 373, 300, 99, 100, 90, 842, 842, 854, + /* 380 */ 857, 846, 846, 97, 97, 98, 98, 98, 98, 921, + /* 390 */ 96, 96, 96, 96, 95, 95, 94, 94, 94, 93, + /* 400 */ 351, 325, 449, 447, 447, 447, 147, 737, 737, 99, + /* 410 */ 100, 90, 842, 842, 854, 857, 846, 846, 97, 97, + /* 420 */ 98, 98, 98, 98, 296, 96, 96, 96, 96, 95, + /* 430 */ 95, 94, 94, 94, 93, 351, 325, 419, 231, 958, + /* 440 */ 958, 158, 25, 422, 99, 100, 90, 842, 842, 854, + /* 450 */ 857, 846, 846, 97, 97, 98, 98, 98, 98, 450, + /* 460 */ 96, 96, 96, 96, 95, 95, 94, 94, 94, 93, + /* 470 */ 351, 443, 224, 224, 420, 958, 958, 962, 325, 52, + /* 480 */ 52, 959, 960, 176, 415, 78, 99, 100, 90, 842, + /* 490 */ 842, 854, 857, 846, 846, 97, 97, 98, 98, 98, + /* 500 */ 98, 379, 96, 96, 96, 96, 95, 95, 94, 94, + /* 510 */ 94, 93, 351, 325, 428, 418, 298, 959, 960, 962, + /* 520 */ 81, 99, 88, 90, 842, 842, 854, 857, 846, 846, + /* 530 */ 97, 97, 98, 98, 98, 98, 717, 96, 96, 96, + /* 540 */ 96, 95, 95, 94, 94, 94, 93, 351, 325, 843, + /* 550 */ 843, 855, 858, 996, 318, 343, 379, 100, 90, 842, + /* 560 */ 842, 854, 857, 846, 846, 97, 97, 98, 98, 98, + /* 570 */ 98, 450, 96, 96, 96, 96, 95, 95, 94, 94, + /* 580 */ 94, 93, 351, 325, 350, 350, 350, 260, 377, 340, + /* 590 */ 929, 52, 52, 90, 842, 842, 854, 857, 846, 846, + /* 600 */ 97, 97, 98, 98, 98, 98, 361, 96, 96, 96, + /* 610 */ 96, 95, 95, 94, 94, 94, 93, 351, 86, 445, + /* 620 */ 847, 3, 1203, 361, 360, 378, 344, 813, 958, 958, + /* 630 */ 1300, 86, 445, 729, 3, 212, 169, 287, 405, 282, + /* 640 */ 404, 199, 232, 450, 300, 760, 83, 84, 280, 245, + /* 650 */ 262, 365, 251, 85, 352, 352, 92, 89, 178, 83, + /* 660 */ 84, 242, 412, 52, 52, 448, 85, 352, 352, 246, + /* 670 */ 959, 960, 194, 455, 670, 402, 399, 398, 448, 243, + /* 680 */ 221, 114, 434, 776, 361, 450, 397, 268, 747, 224, + /* 690 */ 224, 132, 132, 198, 832, 434, 452, 451, 428, 427, + /* 700 */ 819, 415, 734, 713, 132, 52, 52, 832, 268, 452, + /* 710 */ 451, 734, 194, 819, 363, 402, 399, 398, 450, 1271, + /* 720 */ 1271, 23, 958, 958, 86, 445, 397, 3, 228, 429, + /* 730 */ 895, 824, 824, 826, 827, 19, 203, 720, 52, 52, + /* 740 */ 428, 408, 439, 249, 824, 824, 826, 827, 19, 229, + /* 750 */ 403, 153, 83, 84, 761, 177, 241, 450, 721, 85, + /* 760 */ 352, 352, 120, 157, 959, 960, 58, 977, 409, 355, + /* 770 */ 330, 448, 268, 428, 430, 320, 790, 32, 32, 86, + /* 780 */ 445, 776, 3, 341, 98, 98, 98, 98, 434, 96, + /* 790 */ 96, 96, 96, 95, 95, 94, 94, 94, 93, 351, + /* 800 */ 832, 120, 452, 451, 813, 887, 819, 83, 84, 977, + /* 810 */ 813, 132, 410, 920, 85, 352, 352, 132, 407, 789, + /* 820 */ 958, 958, 92, 89, 178, 917, 448, 262, 370, 261, + /* 830 */ 82, 914, 80, 262, 370, 261, 776, 824, 824, 826, + /* 840 */ 827, 19, 934, 434, 96, 96, 96, 96, 95, 95, + /* 850 */ 94, 94, 94, 93, 351, 832, 74, 452, 451, 958, + /* 860 */ 958, 819, 959, 960, 120, 92, 89, 178, 945, 2, + /* 870 */ 918, 965, 268, 1, 976, 76, 445, 762, 3, 708, + /* 880 */ 901, 901, 387, 958, 958, 757, 919, 371, 740, 778, + /* 890 */ 756, 257, 824, 824, 826, 827, 19, 417, 741, 450, + /* 900 */ 24, 959, 960, 83, 84, 369, 958, 958, 177, 226, + /* 910 */ 85, 352, 352, 885, 315, 314, 313, 215, 311, 10, + /* 920 */ 10, 683, 448, 349, 348, 959, 960, 909, 777, 157, + /* 930 */ 120, 958, 958, 337, 776, 416, 711, 310, 450, 434, + /* 940 */ 450, 321, 450, 791, 103, 200, 175, 450, 959, 960, + /* 950 */ 908, 832, 792, 452, 451, 9, 9, 819, 10, 10, + /* 960 */ 52, 52, 51, 51, 180, 716, 248, 10, 10, 171, + /* 970 */ 170, 167, 339, 959, 960, 247, 984, 702, 702, 450, + /* 980 */ 715, 233, 686, 982, 889, 983, 182, 914, 824, 824, + /* 990 */ 826, 827, 19, 183, 256, 423, 132, 181, 394, 10, + /* 1000 */ 10, 889, 891, 749, 958, 958, 917, 268, 985, 198, + /* 1010 */ 985, 349, 348, 425, 415, 299, 817, 832, 326, 825, + /* 1020 */ 120, 332, 133, 819, 268, 98, 98, 98, 98, 91, + /* 1030 */ 96, 96, 96, 96, 95, 95, 94, 94, 94, 93, + /* 1040 */ 351, 157, 810, 371, 382, 359, 959, 960, 358, 268, + /* 1050 */ 450, 918, 368, 324, 824, 824, 826, 450, 709, 450, + /* 1060 */ 264, 380, 889, 450, 877, 746, 253, 919, 255, 433, + /* 1070 */ 36, 36, 234, 450, 234, 120, 269, 37, 37, 12, + /* 1080 */ 12, 334, 272, 27, 27, 450, 330, 118, 450, 162, + /* 1090 */ 742, 280, 450, 38, 38, 450, 985, 356, 985, 450, + /* 1100 */ 709, 1210, 450, 132, 450, 39, 39, 450, 40, 40, + /* 1110 */ 450, 362, 41, 41, 450, 42, 42, 450, 254, 28, + /* 1120 */ 28, 450, 29, 29, 31, 31, 450, 43, 43, 450, + /* 1130 */ 44, 44, 450, 714, 45, 45, 450, 11, 11, 767, + /* 1140 */ 450, 46, 46, 450, 268, 450, 105, 105, 450, 47, + /* 1150 */ 47, 450, 48, 48, 450, 237, 33, 33, 450, 172, + /* 1160 */ 49, 49, 450, 50, 50, 34, 34, 274, 122, 122, + /* 1170 */ 450, 123, 123, 450, 124, 124, 450, 898, 56, 56, + /* 1180 */ 450, 897, 35, 35, 450, 267, 450, 817, 450, 817, + /* 1190 */ 106, 106, 450, 53, 53, 385, 107, 107, 450, 817, + /* 1200 */ 108, 108, 817, 450, 104, 104, 121, 121, 119, 119, + /* 1210 */ 450, 117, 112, 112, 450, 276, 450, 225, 111, 111, + /* 1220 */ 450, 730, 450, 109, 109, 450, 673, 674, 675, 912, + /* 1230 */ 110, 110, 317, 998, 55, 55, 57, 57, 692, 331, + /* 1240 */ 54, 54, 26, 26, 696, 30, 30, 317, 937, 197, + /* 1250 */ 196, 195, 335, 281, 336, 446, 331, 745, 689, 436, + /* 1260 */ 440, 444, 120, 72, 386, 223, 175, 345, 757, 933, + /* 1270 */ 20, 286, 319, 756, 815, 372, 374, 202, 202, 202, + /* 1280 */ 263, 395, 285, 74, 208, 21, 696, 719, 718, 884, + /* 1290 */ 120, 120, 120, 120, 120, 754, 278, 828, 77, 74, + /* 1300 */ 726, 727, 785, 783, 880, 202, 999, 208, 894, 893, + /* 1310 */ 894, 893, 694, 816, 763, 116, 774, 1290, 431, 432, + /* 1320 */ 302, 999, 390, 303, 823, 697, 691, 680, 159, 289, + /* 1330 */ 679, 884, 681, 952, 291, 218, 293, 7, 316, 828, + /* 1340 */ 173, 805, 259, 364, 252, 911, 376, 713, 295, 435, + /* 1350 */ 308, 168, 955, 993, 135, 400, 990, 284, 882, 881, + /* 1360 */ 205, 928, 926, 59, 333, 62, 144, 156, 130, 72, + /* 1370 */ 802, 366, 367, 393, 137, 185, 189, 160, 139, 383, + /* 1380 */ 67, 896, 140, 141, 142, 148, 389, 812, 775, 266, + /* 1390 */ 219, 190, 154, 391, 913, 876, 271, 406, 191, 322, + /* 1400 */ 682, 733, 192, 342, 732, 724, 731, 711, 723, 421, + /* 1410 */ 705, 71, 323, 6, 204, 771, 288, 79, 297, 346, + /* 1420 */ 772, 704, 290, 283, 703, 770, 292, 294, 967, 239, + /* 1430 */ 769, 102, 862, 438, 426, 240, 424, 442, 73, 213, + /* 1440 */ 688, 238, 22, 453, 953, 214, 217, 216, 454, 677, + /* 1450 */ 676, 671, 753, 125, 115, 235, 126, 669, 353, 166, + /* 1460 */ 127, 244, 179, 357, 306, 304, 305, 307, 113, 892, + /* 1470 */ 327, 890, 811, 328, 134, 128, 136, 138, 743, 258, + /* 1480 */ 907, 184, 143, 129, 910, 186, 63, 64, 145, 187, + /* 1490 */ 906, 65, 8, 66, 13, 188, 202, 899, 265, 149, + /* 1500 */ 987, 388, 150, 685, 161, 392, 285, 193, 279, 396, + /* 1510 */ 151, 401, 68, 14, 15, 722, 69, 236, 831, 131, + /* 1520 */ 830, 860, 70, 751, 16, 414, 755, 4, 174, 220, + /* 1530 */ 222, 784, 201, 152, 779, 77, 74, 17, 18, 875, + /* 1540 */ 861, 859, 916, 864, 915, 207, 206, 942, 163, 437, + /* 1550 */ 948, 943, 164, 209, 1002, 441, 863, 165, 210, 829, + /* 1560 */ 695, 87, 312, 211, 1292, 1291, 309, +}; +static const YYCODETYPE yy_lookahead[] = { + /* 0 */ 19, 95, 53, 97, 22, 24, 24, 101, 27, 28, + /* 10 */ 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + /* 20 */ 39, 40, 41, 152, 43, 44, 45, 46, 47, 48, + /* 30 */ 49, 50, 51, 52, 53, 19, 55, 55, 132, 133, + /* 40 */ 134, 1, 2, 27, 28, 29, 30, 31, 32, 33, + /* 50 */ 34, 35, 36, 37, 38, 39, 40, 41, 187, 43, + /* 60 */ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + /* 70 */ 47, 48, 49, 50, 51, 52, 53, 61, 97, 97, + /* 80 */ 19, 49, 50, 51, 52, 53, 70, 26, 27, 28, + /* 90 */ 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + /* 100 */ 39, 40, 41, 152, 43, 44, 45, 46, 47, 48, + /* 110 */ 49, 50, 51, 52, 53, 144, 145, 146, 147, 19, + /* 120 */ 16, 22, 92, 172, 173, 52, 53, 27, 28, 29, + /* 130 */ 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + /* 140 */ 40, 41, 81, 43, 44, 45, 46, 47, 48, 49, + /* 150 */ 50, 51, 52, 53, 55, 56, 19, 152, 207, 208, + /* 160 */ 115, 24, 117, 118, 27, 28, 29, 30, 31, 32, + /* 170 */ 33, 34, 35, 36, 37, 38, 39, 40, 41, 79, + /* 180 */ 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + /* 190 */ 53, 19, 88, 157, 90, 23, 97, 98, 193, 27, + /* 200 */ 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + /* 210 */ 38, 39, 40, 41, 152, 43, 44, 45, 46, 47, + /* 220 */ 48, 49, 50, 51, 52, 53, 19, 22, 23, 172, + /* 230 */ 23, 26, 119, 120, 27, 28, 29, 30, 31, 32, + /* 240 */ 33, 34, 35, 36, 37, 38, 39, 40, 41, 187, + /* 250 */ 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + /* 260 */ 53, 19, 22, 23, 228, 23, 26, 231, 152, 27, + /* 270 */ 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + /* 280 */ 38, 39, 40, 41, 172, 43, 44, 45, 46, 47, + /* 290 */ 48, 49, 50, 51, 52, 53, 19, 221, 222, 223, + /* 300 */ 23, 96, 152, 172, 27, 28, 29, 30, 31, 32, + /* 310 */ 33, 34, 35, 36, 37, 38, 39, 40, 41, 152, + /* 320 */ 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + /* 330 */ 53, 19, 0, 1, 2, 23, 96, 190, 191, 27, + /* 340 */ 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + /* 350 */ 38, 39, 40, 41, 238, 43, 44, 45, 46, 47, + /* 360 */ 48, 49, 50, 51, 52, 53, 19, 185, 218, 221, + /* 370 */ 222, 223, 152, 152, 27, 28, 29, 30, 31, 32, + /* 380 */ 33, 34, 35, 36, 37, 38, 39, 40, 41, 241, + /* 390 */ 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + /* 400 */ 53, 19, 152, 168, 169, 170, 22, 190, 191, 27, + /* 410 */ 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + /* 420 */ 38, 39, 40, 41, 152, 43, 44, 45, 46, 47, + /* 430 */ 48, 49, 50, 51, 52, 53, 19, 19, 218, 55, + /* 440 */ 56, 24, 22, 152, 27, 28, 29, 30, 31, 32, + /* 450 */ 33, 34, 35, 36, 37, 38, 39, 40, 41, 152, + /* 460 */ 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + /* 470 */ 53, 250, 194, 195, 56, 55, 56, 55, 19, 172, + /* 480 */ 173, 97, 98, 152, 206, 138, 27, 28, 29, 30, + /* 490 */ 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + /* 500 */ 41, 152, 43, 44, 45, 46, 47, 48, 49, 50, + /* 510 */ 51, 52, 53, 19, 207, 208, 152, 97, 98, 97, + /* 520 */ 138, 27, 28, 29, 30, 31, 32, 33, 34, 35, + /* 530 */ 36, 37, 38, 39, 40, 41, 181, 43, 44, 45, + /* 540 */ 46, 47, 48, 49, 50, 51, 52, 53, 19, 30, + /* 550 */ 31, 32, 33, 247, 248, 19, 152, 28, 29, 30, + /* 560 */ 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + /* 570 */ 41, 152, 43, 44, 45, 46, 47, 48, 49, 50, + /* 580 */ 51, 52, 53, 19, 168, 169, 170, 238, 19, 53, + /* 590 */ 152, 172, 173, 29, 30, 31, 32, 33, 34, 35, + /* 600 */ 36, 37, 38, 39, 40, 41, 152, 43, 44, 45, + /* 610 */ 46, 47, 48, 49, 50, 51, 52, 53, 19, 20, + /* 620 */ 101, 22, 23, 169, 170, 56, 207, 85, 55, 56, + /* 630 */ 23, 19, 20, 26, 22, 99, 100, 101, 102, 103, + /* 640 */ 104, 105, 238, 152, 152, 210, 47, 48, 112, 152, + /* 650 */ 108, 109, 110, 54, 55, 56, 221, 222, 223, 47, + /* 660 */ 48, 119, 120, 172, 173, 66, 54, 55, 56, 152, + /* 670 */ 97, 98, 99, 148, 149, 102, 103, 104, 66, 154, + /* 680 */ 23, 156, 83, 26, 230, 152, 113, 152, 163, 194, + /* 690 */ 195, 92, 92, 30, 95, 83, 97, 98, 207, 208, + /* 700 */ 101, 206, 179, 180, 92, 172, 173, 95, 152, 97, + /* 710 */ 98, 188, 99, 101, 219, 102, 103, 104, 152, 119, + /* 720 */ 120, 196, 55, 56, 19, 20, 113, 22, 193, 163, + /* 730 */ 11, 132, 133, 134, 135, 136, 24, 65, 172, 173, + /* 740 */ 207, 208, 250, 152, 132, 133, 134, 135, 136, 193, + /* 750 */ 78, 84, 47, 48, 49, 98, 199, 152, 86, 54, + /* 760 */ 55, 56, 196, 152, 97, 98, 209, 55, 163, 244, + /* 770 */ 107, 66, 152, 207, 208, 164, 175, 172, 173, 19, + /* 780 */ 20, 124, 22, 111, 38, 39, 40, 41, 83, 43, + /* 790 */ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + /* 800 */ 95, 196, 97, 98, 85, 152, 101, 47, 48, 97, + /* 810 */ 85, 92, 207, 193, 54, 55, 56, 92, 49, 175, + /* 820 */ 55, 56, 221, 222, 223, 12, 66, 108, 109, 110, + /* 830 */ 137, 163, 139, 108, 109, 110, 26, 132, 133, 134, + /* 840 */ 135, 136, 152, 83, 43, 44, 45, 46, 47, 48, + /* 850 */ 49, 50, 51, 52, 53, 95, 26, 97, 98, 55, + /* 860 */ 56, 101, 97, 98, 196, 221, 222, 223, 146, 147, + /* 870 */ 57, 171, 152, 22, 26, 19, 20, 49, 22, 179, + /* 880 */ 108, 109, 110, 55, 56, 116, 73, 219, 75, 124, + /* 890 */ 121, 152, 132, 133, 134, 135, 136, 163, 85, 152, + /* 900 */ 232, 97, 98, 47, 48, 237, 55, 56, 98, 5, + /* 910 */ 54, 55, 56, 193, 10, 11, 12, 13, 14, 172, + /* 920 */ 173, 17, 66, 47, 48, 97, 98, 152, 124, 152, + /* 930 */ 196, 55, 56, 186, 124, 152, 106, 160, 152, 83, + /* 940 */ 152, 164, 152, 61, 22, 211, 212, 152, 97, 98, + /* 950 */ 152, 95, 70, 97, 98, 172, 173, 101, 172, 173, + /* 960 */ 172, 173, 172, 173, 60, 181, 62, 172, 173, 47, + /* 970 */ 48, 123, 186, 97, 98, 71, 100, 55, 56, 152, + /* 980 */ 181, 186, 21, 107, 152, 109, 82, 163, 132, 133, + /* 990 */ 134, 135, 136, 89, 16, 207, 92, 93, 19, 172, + /* 1000 */ 173, 169, 170, 195, 55, 56, 12, 152, 132, 30, + /* 1010 */ 134, 47, 48, 186, 206, 225, 152, 95, 114, 97, + /* 1020 */ 196, 245, 246, 101, 152, 38, 39, 40, 41, 42, + /* 1030 */ 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + /* 1040 */ 53, 152, 163, 219, 152, 141, 97, 98, 193, 152, + /* 1050 */ 152, 57, 91, 164, 132, 133, 134, 152, 55, 152, + /* 1060 */ 152, 237, 230, 152, 103, 193, 88, 73, 90, 75, + /* 1070 */ 172, 173, 183, 152, 185, 196, 152, 172, 173, 172, + /* 1080 */ 173, 217, 152, 172, 173, 152, 107, 22, 152, 24, + /* 1090 */ 193, 112, 152, 172, 173, 152, 132, 242, 134, 152, + /* 1100 */ 97, 140, 152, 92, 152, 172, 173, 152, 172, 173, + /* 1110 */ 152, 100, 172, 173, 152, 172, 173, 152, 140, 172, + /* 1120 */ 173, 152, 172, 173, 172, 173, 152, 172, 173, 152, + /* 1130 */ 172, 173, 152, 152, 172, 173, 152, 172, 173, 213, + /* 1140 */ 152, 172, 173, 152, 152, 152, 172, 173, 152, 172, + /* 1150 */ 173, 152, 172, 173, 152, 210, 172, 173, 152, 26, + /* 1160 */ 172, 173, 152, 172, 173, 172, 173, 152, 172, 173, + /* 1170 */ 152, 172, 173, 152, 172, 173, 152, 59, 172, 173, + /* 1180 */ 152, 63, 172, 173, 152, 193, 152, 152, 152, 152, + /* 1190 */ 172, 173, 152, 172, 173, 77, 172, 173, 152, 152, + /* 1200 */ 172, 173, 152, 152, 172, 173, 172, 173, 172, 173, + /* 1210 */ 152, 22, 172, 173, 152, 152, 152, 22, 172, 173, + /* 1220 */ 152, 152, 152, 172, 173, 152, 7, 8, 9, 163, + /* 1230 */ 172, 173, 22, 23, 172, 173, 172, 173, 166, 167, + /* 1240 */ 172, 173, 172, 173, 55, 172, 173, 22, 23, 108, + /* 1250 */ 109, 110, 217, 152, 217, 166, 167, 163, 163, 163, + /* 1260 */ 163, 163, 196, 130, 217, 211, 212, 217, 116, 23, + /* 1270 */ 22, 101, 26, 121, 23, 23, 23, 26, 26, 26, + /* 1280 */ 23, 23, 112, 26, 26, 37, 97, 100, 101, 55, + /* 1290 */ 196, 196, 196, 196, 196, 23, 23, 55, 26, 26, + /* 1300 */ 7, 8, 23, 152, 23, 26, 96, 26, 132, 132, + /* 1310 */ 134, 134, 23, 152, 152, 26, 152, 122, 152, 191, + /* 1320 */ 152, 96, 234, 152, 152, 152, 152, 152, 197, 210, + /* 1330 */ 152, 97, 152, 152, 210, 233, 210, 198, 150, 97, + /* 1340 */ 184, 201, 239, 214, 214, 201, 239, 180, 214, 227, + /* 1350 */ 200, 198, 155, 67, 243, 176, 69, 175, 175, 175, + /* 1360 */ 122, 159, 159, 240, 159, 240, 22, 220, 27, 130, + /* 1370 */ 201, 18, 159, 18, 189, 158, 158, 220, 192, 159, + /* 1380 */ 137, 236, 192, 192, 192, 189, 74, 189, 159, 235, + /* 1390 */ 159, 158, 22, 177, 201, 201, 159, 107, 158, 177, + /* 1400 */ 159, 174, 158, 76, 174, 182, 174, 106, 182, 125, + /* 1410 */ 174, 107, 177, 22, 159, 216, 215, 137, 159, 53, + /* 1420 */ 216, 176, 215, 174, 174, 216, 215, 215, 174, 229, + /* 1430 */ 216, 129, 224, 177, 126, 229, 127, 177, 128, 25, + /* 1440 */ 162, 226, 26, 161, 13, 153, 6, 153, 151, 151, + /* 1450 */ 151, 151, 205, 165, 178, 178, 165, 4, 3, 22, + /* 1460 */ 165, 142, 15, 94, 202, 204, 203, 201, 16, 23, + /* 1470 */ 249, 23, 120, 249, 246, 111, 131, 123, 20, 16, + /* 1480 */ 1, 125, 123, 111, 56, 64, 37, 37, 131, 122, + /* 1490 */ 1, 37, 5, 37, 22, 107, 26, 80, 140, 80, + /* 1500 */ 87, 72, 107, 20, 24, 19, 112, 105, 23, 79, + /* 1510 */ 22, 79, 22, 22, 22, 58, 22, 79, 23, 68, + /* 1520 */ 23, 23, 26, 116, 22, 26, 23, 22, 122, 23, + /* 1530 */ 23, 56, 64, 22, 124, 26, 26, 64, 64, 23, + /* 1540 */ 23, 23, 23, 11, 23, 22, 26, 23, 22, 24, + /* 1550 */ 1, 23, 22, 26, 251, 24, 23, 22, 122, 23, + /* 1560 */ 23, 22, 15, 122, 122, 122, 23, +}; +#define YY_SHIFT_USE_DFLT (1567) +#define YY_SHIFT_COUNT (455) +#define YY_SHIFT_MIN (-94) +#define YY_SHIFT_MAX (1549) +static const short yy_shift_ofst[] = { + /* 0 */ 40, 599, 904, 612, 760, 760, 760, 760, 725, -19, + /* 10 */ 16, 16, 100, 760, 760, 760, 760, 760, 760, 760, + /* 20 */ 876, 876, 573, 542, 719, 600, 61, 137, 172, 207, + /* 30 */ 242, 277, 312, 347, 382, 417, 459, 459, 459, 459, + /* 40 */ 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, + /* 50 */ 459, 459, 459, 494, 459, 529, 564, 564, 705, 760, + /* 60 */ 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, + /* 70 */ 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, + /* 80 */ 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, + /* 90 */ 856, 760, 760, 760, 760, 760, 760, 760, 760, 760, + /* 100 */ 760, 760, 760, 760, 987, 746, 746, 746, 746, 746, + /* 110 */ 801, 23, 32, 949, 961, 979, 964, 964, 949, 73, + /* 120 */ 113, -51, 1567, 1567, 1567, 536, 536, 536, 99, 99, + /* 130 */ 813, 813, 667, 205, 240, 949, 949, 949, 949, 949, + /* 140 */ 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, + /* 150 */ 949, 949, 949, 949, 949, 332, 1011, 422, 422, 113, + /* 160 */ 30, 30, 30, 30, 30, 30, 1567, 1567, 1567, 922, + /* 170 */ -94, -94, 384, 613, 828, 420, 765, 804, 851, 949, + /* 180 */ 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, + /* 190 */ 949, 949, 949, 949, 949, 672, 672, 672, 949, 949, + /* 200 */ 657, 949, 949, 949, -18, 949, 949, 994, 949, 949, + /* 210 */ 949, 949, 949, 949, 949, 949, 949, 949, 772, 1118, + /* 220 */ 712, 712, 712, 810, 45, 769, 1219, 1133, 418, 418, + /* 230 */ 569, 1133, 569, 830, 607, 663, 882, 418, 693, 882, + /* 240 */ 882, 848, 1152, 1065, 1286, 1238, 1238, 1287, 1287, 1238, + /* 250 */ 1344, 1341, 1239, 1353, 1353, 1353, 1353, 1238, 1355, 1239, + /* 260 */ 1344, 1341, 1341, 1239, 1238, 1355, 1243, 1312, 1238, 1238, + /* 270 */ 1355, 1370, 1238, 1355, 1238, 1355, 1370, 1290, 1290, 1290, + /* 280 */ 1327, 1370, 1290, 1301, 1290, 1327, 1290, 1290, 1284, 1304, + /* 290 */ 1284, 1304, 1284, 1304, 1284, 1304, 1238, 1391, 1238, 1280, + /* 300 */ 1370, 1366, 1366, 1370, 1302, 1308, 1310, 1309, 1239, 1414, + /* 310 */ 1416, 1431, 1431, 1440, 1440, 1440, 1440, 1567, 1567, 1567, + /* 320 */ 1567, 1567, 1567, 1567, 1567, 519, 978, 1210, 1225, 104, + /* 330 */ 1141, 1189, 1246, 1248, 1251, 1252, 1253, 1257, 1258, 1273, + /* 340 */ 1003, 1187, 1293, 1170, 1272, 1279, 1234, 1281, 1176, 1177, + /* 350 */ 1289, 1242, 1195, 1453, 1455, 1437, 1319, 1447, 1369, 1452, + /* 360 */ 1446, 1448, 1352, 1345, 1364, 1354, 1458, 1356, 1463, 1479, + /* 370 */ 1359, 1357, 1449, 1450, 1454, 1456, 1372, 1428, 1421, 1367, + /* 380 */ 1489, 1487, 1472, 1388, 1358, 1417, 1470, 1419, 1413, 1429, + /* 390 */ 1395, 1480, 1483, 1486, 1394, 1402, 1488, 1430, 1490, 1491, + /* 400 */ 1485, 1492, 1432, 1457, 1494, 1438, 1451, 1495, 1497, 1498, + /* 410 */ 1496, 1407, 1502, 1503, 1505, 1499, 1406, 1506, 1507, 1475, + /* 420 */ 1468, 1511, 1410, 1509, 1473, 1510, 1474, 1516, 1509, 1517, + /* 430 */ 1518, 1519, 1520, 1521, 1523, 1532, 1524, 1526, 1525, 1527, + /* 440 */ 1528, 1530, 1531, 1527, 1533, 1535, 1536, 1537, 1539, 1436, + /* 450 */ 1441, 1442, 1443, 1543, 1547, 1549, +}; +#define YY_REDUCE_USE_DFLT (-130) +#define YY_REDUCE_COUNT (324) +#define YY_REDUCE_MIN (-129) +#define YY_REDUCE_MAX (1300) +static const short yy_reduce_ofst[] = { + /* 0 */ -29, 566, 525, 605, -49, 307, 491, 533, 668, 435, + /* 10 */ 601, 644, 148, 747, 786, 795, 419, 788, 827, 790, + /* 20 */ 454, 832, 889, 495, 824, 734, 76, 76, 76, 76, + /* 30 */ 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + /* 40 */ 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + /* 50 */ 76, 76, 76, 76, 76, 76, 76, 76, 783, 898, + /* 60 */ 905, 907, 911, 921, 933, 936, 940, 943, 947, 950, + /* 70 */ 952, 955, 958, 962, 965, 969, 974, 977, 980, 984, + /* 80 */ 988, 991, 993, 996, 999, 1002, 1006, 1010, 1018, 1021, + /* 90 */ 1024, 1028, 1032, 1034, 1036, 1040, 1046, 1051, 1058, 1062, + /* 100 */ 1064, 1068, 1070, 1073, 76, 76, 76, 76, 76, 76, + /* 110 */ 76, 76, 76, 855, 36, 523, 235, 416, 777, 76, + /* 120 */ 278, 76, 76, 76, 76, 700, 700, 700, 150, 220, + /* 130 */ 147, 217, 221, 306, 306, 611, 5, 535, 556, 620, + /* 140 */ 720, 872, 897, 116, 864, 349, 1035, 1037, 404, 1047, + /* 150 */ 992, -129, 1050, 492, 62, 722, 879, 1072, 1089, 808, + /* 160 */ 1066, 1094, 1095, 1096, 1097, 1098, 776, 1054, 557, 57, + /* 170 */ 112, 131, 167, 182, 250, 272, 291, 331, 364, 438, + /* 180 */ 497, 517, 591, 653, 690, 739, 775, 798, 892, 908, + /* 190 */ 924, 930, 1015, 1063, 1069, 355, 784, 799, 981, 1101, + /* 200 */ 926, 1151, 1161, 1162, 945, 1164, 1166, 1128, 1168, 1171, + /* 210 */ 1172, 250, 1173, 1174, 1175, 1178, 1180, 1181, 1088, 1102, + /* 220 */ 1119, 1124, 1126, 926, 1131, 1139, 1188, 1140, 1129, 1130, + /* 230 */ 1103, 1144, 1107, 1179, 1156, 1167, 1182, 1134, 1122, 1183, + /* 240 */ 1184, 1150, 1153, 1197, 1111, 1202, 1203, 1123, 1125, 1205, + /* 250 */ 1147, 1185, 1169, 1186, 1190, 1191, 1192, 1213, 1217, 1193, + /* 260 */ 1157, 1196, 1198, 1194, 1220, 1218, 1145, 1154, 1229, 1231, + /* 270 */ 1233, 1216, 1237, 1240, 1241, 1244, 1222, 1227, 1230, 1232, + /* 280 */ 1223, 1235, 1236, 1245, 1249, 1226, 1250, 1254, 1199, 1201, + /* 290 */ 1204, 1207, 1209, 1211, 1214, 1212, 1255, 1208, 1259, 1215, + /* 300 */ 1256, 1200, 1206, 1260, 1247, 1261, 1263, 1262, 1266, 1278, + /* 310 */ 1282, 1292, 1294, 1297, 1298, 1299, 1300, 1221, 1224, 1228, + /* 320 */ 1288, 1291, 1276, 1277, 1295, +}; +static const YYACTIONTYPE yy_default[] = { + /* 0 */ 1281, 1271, 1271, 1271, 1203, 1203, 1203, 1203, 1271, 1096, + /* 10 */ 1125, 1125, 1255, 1332, 1332, 1332, 1332, 1332, 1332, 1202, + /* 20 */ 1332, 1332, 1332, 1332, 1271, 1100, 1131, 1332, 1332, 1332, + /* 30 */ 1332, 1204, 1205, 1332, 1332, 1332, 1254, 1256, 1141, 1140, + /* 40 */ 1139, 1138, 1237, 1112, 1136, 1129, 1133, 1204, 1198, 1199, + /* 50 */ 1197, 1201, 1205, 1332, 1132, 1167, 1182, 1166, 1332, 1332, + /* 60 */ 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, + /* 70 */ 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, + /* 80 */ 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, + /* 90 */ 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, + /* 100 */ 1332, 1332, 1332, 1332, 1176, 1181, 1188, 1180, 1177, 1169, + /* 110 */ 1168, 1170, 1171, 1332, 1019, 1067, 1332, 1332, 1332, 1172, + /* 120 */ 1332, 1173, 1185, 1184, 1183, 1262, 1289, 1288, 1332, 1332, + /* 130 */ 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, + /* 140 */ 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, + /* 150 */ 1332, 1332, 1332, 1332, 1332, 1281, 1271, 1025, 1025, 1332, + /* 160 */ 1271, 1271, 1271, 1271, 1271, 1271, 1267, 1100, 1091, 1332, + /* 170 */ 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, + /* 180 */ 1259, 1257, 1332, 1218, 1332, 1332, 1332, 1332, 1332, 1332, + /* 190 */ 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, + /* 200 */ 1332, 1332, 1332, 1332, 1096, 1332, 1332, 1332, 1332, 1332, + /* 210 */ 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1283, 1332, 1232, + /* 220 */ 1096, 1096, 1096, 1098, 1080, 1090, 1004, 1135, 1114, 1114, + /* 230 */ 1321, 1135, 1321, 1042, 1303, 1039, 1125, 1114, 1200, 1125, + /* 240 */ 1125, 1097, 1090, 1332, 1324, 1105, 1105, 1323, 1323, 1105, + /* 250 */ 1146, 1070, 1135, 1076, 1076, 1076, 1076, 1105, 1016, 1135, + /* 260 */ 1146, 1070, 1070, 1135, 1105, 1016, 1236, 1318, 1105, 1105, + /* 270 */ 1016, 1211, 1105, 1016, 1105, 1016, 1211, 1068, 1068, 1068, + /* 280 */ 1057, 1211, 1068, 1042, 1068, 1057, 1068, 1068, 1118, 1113, + /* 290 */ 1118, 1113, 1118, 1113, 1118, 1113, 1105, 1206, 1105, 1332, + /* 300 */ 1211, 1215, 1215, 1211, 1130, 1119, 1128, 1126, 1135, 1022, + /* 310 */ 1060, 1286, 1286, 1282, 1282, 1282, 1282, 1329, 1329, 1267, + /* 320 */ 1298, 1298, 1044, 1044, 1298, 1332, 1332, 1332, 1332, 1332, + /* 330 */ 1332, 1293, 1332, 1220, 1332, 1332, 1332, 1332, 1332, 1332, + /* 340 */ 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, + /* 350 */ 1332, 1332, 1152, 1332, 1000, 1264, 1332, 1332, 1263, 1332, + /* 360 */ 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, + /* 370 */ 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1320, + /* 380 */ 1332, 1332, 1332, 1332, 1332, 1332, 1235, 1234, 1332, 1332, + /* 390 */ 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, + /* 400 */ 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, + /* 410 */ 1332, 1082, 1332, 1332, 1332, 1307, 1332, 1332, 1332, 1332, + /* 420 */ 1332, 1332, 1332, 1127, 1332, 1120, 1332, 1332, 1311, 1332, + /* 430 */ 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1273, + /* 440 */ 1332, 1332, 1332, 1272, 1332, 1332, 1332, 1332, 1332, 1154, + /* 450 */ 1332, 1153, 1157, 1332, 1010, 1332, +}; +/********** End of lemon-generated parsing tables *****************************/ + +/* The next table maps tokens (terminal symbols) into fallback tokens. +** If a construct like the following: +** +** %fallback ID X Y Z. +** +** appears in the grammar, then ID becomes a fallback token for X, Y, +** and Z. Whenever one of the tokens X, Y, or Z is input to the parser +** but it does not parse, the type of the token is changed to ID and +** the parse is retried before an error is thrown. +** +** This feature can be used, for example, to cause some keywords in a language +** to revert to identifiers if they keyword does not apply in the context where +** it appears. +*/ +#ifdef YYFALLBACK +static const YYCODETYPE yyFallback[] = { + 0, /* $ => nothing */ + 0, /* SEMI => nothing */ + 55, /* EXPLAIN => ID */ + 55, /* QUERY => ID */ + 55, /* PLAN => ID */ + 55, /* BEGIN => ID */ + 0, /* TRANSACTION => nothing */ + 55, /* DEFERRED => ID */ + 55, /* IMMEDIATE => ID */ + 55, /* EXCLUSIVE => ID */ + 0, /* COMMIT => nothing */ + 55, /* END => ID */ + 55, /* ROLLBACK => ID */ + 55, /* SAVEPOINT => ID */ + 55, /* RELEASE => ID */ + 0, /* TO => nothing */ + 0, /* TABLE => nothing */ + 0, /* CREATE => nothing */ + 55, /* IF => ID */ + 0, /* NOT => nothing */ + 0, /* EXISTS => nothing */ + 55, /* TEMP => ID */ + 0, /* LP => nothing */ + 0, /* RP => nothing */ + 0, /* AS => nothing */ + 55, /* WITHOUT => ID */ + 0, /* COMMA => nothing */ + 0, /* OR => nothing */ + 0, /* AND => nothing */ + 0, /* IS => nothing */ + 55, /* MATCH => ID */ + 55, /* LIKE_KW => ID */ + 0, /* BETWEEN => nothing */ + 0, /* IN => nothing */ + 0, /* ISNULL => nothing */ + 0, /* NOTNULL => nothing */ + 0, /* NE => nothing */ + 0, /* EQ => nothing */ + 0, /* GT => nothing */ + 0, /* LE => nothing */ + 0, /* LT => nothing */ + 0, /* GE => nothing */ + 0, /* ESCAPE => nothing */ + 0, /* BITAND => nothing */ + 0, /* BITOR => nothing */ + 0, /* LSHIFT => nothing */ + 0, /* RSHIFT => nothing */ + 0, /* PLUS => nothing */ + 0, /* MINUS => nothing */ + 0, /* STAR => nothing */ + 0, /* SLASH => nothing */ + 0, /* REM => nothing */ + 0, /* CONCAT => nothing */ + 0, /* COLLATE => nothing */ + 0, /* BITNOT => nothing */ + 0, /* ID => nothing */ + 0, /* INDEXED => nothing */ + 55, /* ABORT => ID */ + 55, /* ACTION => ID */ + 55, /* AFTER => ID */ + 55, /* ANALYZE => ID */ + 55, /* ASC => ID */ + 55, /* ATTACH => ID */ + 55, /* BEFORE => ID */ + 55, /* BY => ID */ + 55, /* CASCADE => ID */ + 55, /* CAST => ID */ + 55, /* COLUMNKW => ID */ + 55, /* CONFLICT => ID */ + 55, /* DATABASE => ID */ + 55, /* DESC => ID */ + 55, /* DETACH => ID */ + 55, /* EACH => ID */ + 55, /* FAIL => ID */ + 55, /* FOR => ID */ + 55, /* IGNORE => ID */ + 55, /* INITIALLY => ID */ + 55, /* INSTEAD => ID */ + 55, /* NO => ID */ + 55, /* KEY => ID */ + 55, /* OF => ID */ + 55, /* OFFSET => ID */ + 55, /* PRAGMA => ID */ + 55, /* RAISE => ID */ + 55, /* RECURSIVE => ID */ + 55, /* REPLACE => ID */ + 55, /* RESTRICT => ID */ + 55, /* ROW => ID */ + 55, /* TRIGGER => ID */ + 55, /* VACUUM => ID */ + 55, /* VIEW => ID */ + 55, /* VIRTUAL => ID */ + 55, /* WITH => ID */ + 55, /* REINDEX => ID */ + 55, /* RENAME => ID */ + 55, /* CTIME_KW => ID */ +}; +#endif /* YYFALLBACK */ + +/* The following structure represents a single element of the +** parser's stack. Information stored includes: +** +** + The state number for the parser at this level of the stack. +** +** + The value of the token stored at this level of the stack. +** (In other words, the "major" token.) +** +** + The semantic value stored at this level of the stack. This is +** the information used by the action routines in the grammar. +** It is sometimes called the "minor" token. +** +** After the "shift" half of a SHIFTREDUCE action, the stateno field +** actually contains the reduce action for the second half of the +** SHIFTREDUCE. +*/ +struct yyStackEntry { + YYACTIONTYPE stateno; /* The state-number, or reduce action in SHIFTREDUCE */ + YYCODETYPE major; /* The major token value. This is the code + ** number for the token at this stack level */ + YYMINORTYPE minor; /* The user-supplied minor token value. This + ** is the value of the token */ +}; +typedef struct yyStackEntry yyStackEntry; + +/* The state of the parser is completely contained in an instance of +** the following structure */ +struct yyParser { + yyStackEntry *yytos; /* Pointer to top element of the stack */ +#ifdef YYTRACKMAXSTACKDEPTH + int yyhwm; /* High-water mark of the stack */ +#endif +#ifndef YYNOERRORRECOVERY + int yyerrcnt; /* Shifts left before out of the error */ +#endif + sqlite3ParserARG_SDECL /* A place to hold %extra_argument */ +#if YYSTACKDEPTH<=0 + int yystksz; /* Current side of the stack */ + yyStackEntry *yystack; /* The parser's stack */ + yyStackEntry yystk0; /* First stack entry */ +#else + yyStackEntry yystack[YYSTACKDEPTH]; /* The parser's stack */ +#endif +}; +typedef struct yyParser yyParser; + +#ifndef NDEBUG +/* #include */ +static FILE *yyTraceFILE = 0; +static char *yyTracePrompt = 0; +#endif /* NDEBUG */ + +#ifndef NDEBUG +/* +** Turn parser tracing on by giving a stream to which to write the trace +** and a prompt to preface each trace message. Tracing is turned off +** by making either argument NULL +** +** Inputs: +**
        +**
      • A FILE* to which trace output should be written. +** If NULL, then tracing is turned off. +**
      • A prefix string written at the beginning of every +** line of trace output. If NULL, then tracing is +** turned off. +**
      +** +** Outputs: +** None. +*/ +SQLITE_PRIVATE void sqlite3ParserTrace(FILE *TraceFILE, char *zTracePrompt){ + yyTraceFILE = TraceFILE; + yyTracePrompt = zTracePrompt; + if( yyTraceFILE==0 ) yyTracePrompt = 0; + else if( yyTracePrompt==0 ) yyTraceFILE = 0; +} +#endif /* NDEBUG */ + +#ifndef NDEBUG +/* For tracing shifts, the names of all terminals and nonterminals +** are required. The following table supplies these names */ +static const char *const yyTokenName[] = { + "$", "SEMI", "EXPLAIN", "QUERY", + "PLAN", "BEGIN", "TRANSACTION", "DEFERRED", + "IMMEDIATE", "EXCLUSIVE", "COMMIT", "END", + "ROLLBACK", "SAVEPOINT", "RELEASE", "TO", + "TABLE", "CREATE", "IF", "NOT", + "EXISTS", "TEMP", "LP", "RP", + "AS", "WITHOUT", "COMMA", "OR", + "AND", "IS", "MATCH", "LIKE_KW", + "BETWEEN", "IN", "ISNULL", "NOTNULL", + "NE", "EQ", "GT", "LE", + "LT", "GE", "ESCAPE", "BITAND", + "BITOR", "LSHIFT", "RSHIFT", "PLUS", + "MINUS", "STAR", "SLASH", "REM", + "CONCAT", "COLLATE", "BITNOT", "ID", + "INDEXED", "ABORT", "ACTION", "AFTER", + "ANALYZE", "ASC", "ATTACH", "BEFORE", + "BY", "CASCADE", "CAST", "COLUMNKW", + "CONFLICT", "DATABASE", "DESC", "DETACH", + "EACH", "FAIL", "FOR", "IGNORE", + "INITIALLY", "INSTEAD", "NO", "KEY", + "OF", "OFFSET", "PRAGMA", "RAISE", + "RECURSIVE", "REPLACE", "RESTRICT", "ROW", + "TRIGGER", "VACUUM", "VIEW", "VIRTUAL", + "WITH", "REINDEX", "RENAME", "CTIME_KW", + "ANY", "STRING", "JOIN_KW", "CONSTRAINT", + "DEFAULT", "NULL", "PRIMARY", "UNIQUE", + "CHECK", "REFERENCES", "AUTOINCR", "ON", + "INSERT", "DELETE", "UPDATE", "SET", + "DEFERRABLE", "FOREIGN", "DROP", "UNION", + "ALL", "EXCEPT", "INTERSECT", "SELECT", + "VALUES", "DISTINCT", "DOT", "FROM", + "JOIN", "USING", "ORDER", "GROUP", + "HAVING", "LIMIT", "WHERE", "INTO", + "FLOAT", "BLOB", "INTEGER", "VARIABLE", + "CASE", "WHEN", "THEN", "ELSE", + "INDEX", "ALTER", "ADD", "error", + "input", "cmdlist", "ecmd", "explain", + "cmdx", "cmd", "transtype", "trans_opt", + "nm", "savepoint_opt", "create_table", "create_table_args", + "createkw", "temp", "ifnotexists", "dbnm", + "columnlist", "conslist_opt", "table_options", "select", + "columnname", "carglist", "typetoken", "typename", + "signed", "plus_num", "minus_num", "ccons", + "term", "expr", "onconf", "sortorder", + "autoinc", "eidlist_opt", "refargs", "defer_subclause", + "refarg", "refact", "init_deferred_pred_opt", "conslist", + "tconscomma", "tcons", "sortlist", "eidlist", + "defer_subclause_opt", "orconf", "resolvetype", "raisetype", + "ifexists", "fullname", "selectnowith", "oneselect", + "with", "multiselect_op", "distinct", "selcollist", + "from", "where_opt", "groupby_opt", "having_opt", + "orderby_opt", "limit_opt", "values", "nexprlist", + "exprlist", "sclp", "as", "seltablist", + "stl_prefix", "joinop", "indexed_opt", "on_opt", + "using_opt", "idlist", "setlist", "insert_cmd", + "idlist_opt", "likeop", "between_op", "in_op", + "paren_exprlist", "case_operand", "case_exprlist", "case_else", + "uniqueflag", "collate", "nmnum", "trigger_decl", + "trigger_cmd_list", "trigger_time", "trigger_event", "foreach_clause", + "when_clause", "trigger_cmd", "trnm", "tridxby", + "database_kw_opt", "key_opt", "add_column_fullname", "kwcolumn_opt", + "create_vtab", "vtabarglist", "vtabarg", "vtabargtoken", + "lp", "anylist", "wqlist", +}; +#endif /* NDEBUG */ + +#ifndef NDEBUG +/* For tracing reduce actions, the names of all rules are required. +*/ +static const char *const yyRuleName[] = { + /* 0 */ "explain ::= EXPLAIN", + /* 1 */ "explain ::= EXPLAIN QUERY PLAN", + /* 2 */ "cmdx ::= cmd", + /* 3 */ "cmd ::= BEGIN transtype trans_opt", + /* 4 */ "transtype ::=", + /* 5 */ "transtype ::= DEFERRED", + /* 6 */ "transtype ::= IMMEDIATE", + /* 7 */ "transtype ::= EXCLUSIVE", + /* 8 */ "cmd ::= COMMIT trans_opt", + /* 9 */ "cmd ::= END trans_opt", + /* 10 */ "cmd ::= ROLLBACK trans_opt", + /* 11 */ "cmd ::= SAVEPOINT nm", + /* 12 */ "cmd ::= RELEASE savepoint_opt nm", + /* 13 */ "cmd ::= ROLLBACK trans_opt TO savepoint_opt nm", + /* 14 */ "create_table ::= createkw temp TABLE ifnotexists nm dbnm", + /* 15 */ "createkw ::= CREATE", + /* 16 */ "ifnotexists ::=", + /* 17 */ "ifnotexists ::= IF NOT EXISTS", + /* 18 */ "temp ::= TEMP", + /* 19 */ "temp ::=", + /* 20 */ "create_table_args ::= LP columnlist conslist_opt RP table_options", + /* 21 */ "create_table_args ::= AS select", + /* 22 */ "table_options ::=", + /* 23 */ "table_options ::= WITHOUT nm", + /* 24 */ "columnname ::= nm typetoken", + /* 25 */ "typetoken ::=", + /* 26 */ "typetoken ::= typename LP signed RP", + /* 27 */ "typetoken ::= typename LP signed COMMA signed RP", + /* 28 */ "typename ::= typename ID|STRING", + /* 29 */ "ccons ::= CONSTRAINT nm", + /* 30 */ "ccons ::= DEFAULT term", + /* 31 */ "ccons ::= DEFAULT LP expr RP", + /* 32 */ "ccons ::= DEFAULT PLUS term", + /* 33 */ "ccons ::= DEFAULT MINUS term", + /* 34 */ "ccons ::= DEFAULT ID|INDEXED", + /* 35 */ "ccons ::= NOT NULL onconf", + /* 36 */ "ccons ::= PRIMARY KEY sortorder onconf autoinc", + /* 37 */ "ccons ::= UNIQUE onconf", + /* 38 */ "ccons ::= CHECK LP expr RP", + /* 39 */ "ccons ::= REFERENCES nm eidlist_opt refargs", + /* 40 */ "ccons ::= defer_subclause", + /* 41 */ "ccons ::= COLLATE ID|STRING", + /* 42 */ "autoinc ::=", + /* 43 */ "autoinc ::= AUTOINCR", + /* 44 */ "refargs ::=", + /* 45 */ "refargs ::= refargs refarg", + /* 46 */ "refarg ::= MATCH nm", + /* 47 */ "refarg ::= ON INSERT refact", + /* 48 */ "refarg ::= ON DELETE refact", + /* 49 */ "refarg ::= ON UPDATE refact", + /* 50 */ "refact ::= SET NULL", + /* 51 */ "refact ::= SET DEFAULT", + /* 52 */ "refact ::= CASCADE", + /* 53 */ "refact ::= RESTRICT", + /* 54 */ "refact ::= NO ACTION", + /* 55 */ "defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt", + /* 56 */ "defer_subclause ::= DEFERRABLE init_deferred_pred_opt", + /* 57 */ "init_deferred_pred_opt ::=", + /* 58 */ "init_deferred_pred_opt ::= INITIALLY DEFERRED", + /* 59 */ "init_deferred_pred_opt ::= INITIALLY IMMEDIATE", + /* 60 */ "conslist_opt ::=", + /* 61 */ "tconscomma ::= COMMA", + /* 62 */ "tcons ::= CONSTRAINT nm", + /* 63 */ "tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf", + /* 64 */ "tcons ::= UNIQUE LP sortlist RP onconf", + /* 65 */ "tcons ::= CHECK LP expr RP onconf", + /* 66 */ "tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt", + /* 67 */ "defer_subclause_opt ::=", + /* 68 */ "onconf ::=", + /* 69 */ "onconf ::= ON CONFLICT resolvetype", + /* 70 */ "orconf ::=", + /* 71 */ "orconf ::= OR resolvetype", + /* 72 */ "resolvetype ::= IGNORE", + /* 73 */ "resolvetype ::= REPLACE", + /* 74 */ "cmd ::= DROP TABLE ifexists fullname", + /* 75 */ "ifexists ::= IF EXISTS", + /* 76 */ "ifexists ::=", + /* 77 */ "cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select", + /* 78 */ "cmd ::= DROP VIEW ifexists fullname", + /* 79 */ "cmd ::= select", + /* 80 */ "select ::= with selectnowith", + /* 81 */ "selectnowith ::= selectnowith multiselect_op oneselect", + /* 82 */ "multiselect_op ::= UNION", + /* 83 */ "multiselect_op ::= UNION ALL", + /* 84 */ "multiselect_op ::= EXCEPT|INTERSECT", + /* 85 */ "oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt", + /* 86 */ "values ::= VALUES LP nexprlist RP", + /* 87 */ "values ::= values COMMA LP exprlist RP", + /* 88 */ "distinct ::= DISTINCT", + /* 89 */ "distinct ::= ALL", + /* 90 */ "distinct ::=", + /* 91 */ "sclp ::=", + /* 92 */ "selcollist ::= sclp expr as", + /* 93 */ "selcollist ::= sclp STAR", + /* 94 */ "selcollist ::= sclp nm DOT STAR", + /* 95 */ "as ::= AS nm", + /* 96 */ "as ::=", + /* 97 */ "from ::=", + /* 98 */ "from ::= FROM seltablist", + /* 99 */ "stl_prefix ::= seltablist joinop", + /* 100 */ "stl_prefix ::=", + /* 101 */ "seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt", + /* 102 */ "seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt", + /* 103 */ "seltablist ::= stl_prefix LP select RP as on_opt using_opt", + /* 104 */ "seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt", + /* 105 */ "dbnm ::=", + /* 106 */ "dbnm ::= DOT nm", + /* 107 */ "fullname ::= nm dbnm", + /* 108 */ "joinop ::= COMMA|JOIN", + /* 109 */ "joinop ::= JOIN_KW JOIN", + /* 110 */ "joinop ::= JOIN_KW nm JOIN", + /* 111 */ "joinop ::= JOIN_KW nm nm JOIN", + /* 112 */ "on_opt ::= ON expr", + /* 113 */ "on_opt ::=", + /* 114 */ "indexed_opt ::=", + /* 115 */ "indexed_opt ::= INDEXED BY nm", + /* 116 */ "indexed_opt ::= NOT INDEXED", + /* 117 */ "using_opt ::= USING LP idlist RP", + /* 118 */ "using_opt ::=", + /* 119 */ "orderby_opt ::=", + /* 120 */ "orderby_opt ::= ORDER BY sortlist", + /* 121 */ "sortlist ::= sortlist COMMA expr sortorder", + /* 122 */ "sortlist ::= expr sortorder", + /* 123 */ "sortorder ::= ASC", + /* 124 */ "sortorder ::= DESC", + /* 125 */ "sortorder ::=", + /* 126 */ "groupby_opt ::=", + /* 127 */ "groupby_opt ::= GROUP BY nexprlist", + /* 128 */ "having_opt ::=", + /* 129 */ "having_opt ::= HAVING expr", + /* 130 */ "limit_opt ::=", + /* 131 */ "limit_opt ::= LIMIT expr", + /* 132 */ "limit_opt ::= LIMIT expr OFFSET expr", + /* 133 */ "limit_opt ::= LIMIT expr COMMA expr", + /* 134 */ "cmd ::= with DELETE FROM fullname indexed_opt where_opt", + /* 135 */ "where_opt ::=", + /* 136 */ "where_opt ::= WHERE expr", + /* 137 */ "cmd ::= with UPDATE orconf fullname indexed_opt SET setlist where_opt", + /* 138 */ "setlist ::= setlist COMMA nm EQ expr", + /* 139 */ "setlist ::= setlist COMMA LP idlist RP EQ expr", + /* 140 */ "setlist ::= nm EQ expr", + /* 141 */ "setlist ::= LP idlist RP EQ expr", + /* 142 */ "cmd ::= with insert_cmd INTO fullname idlist_opt select", + /* 143 */ "cmd ::= with insert_cmd INTO fullname idlist_opt DEFAULT VALUES", + /* 144 */ "insert_cmd ::= INSERT orconf", + /* 145 */ "insert_cmd ::= REPLACE", + /* 146 */ "idlist_opt ::=", + /* 147 */ "idlist_opt ::= LP idlist RP", + /* 148 */ "idlist ::= idlist COMMA nm", + /* 149 */ "idlist ::= nm", + /* 150 */ "expr ::= LP expr RP", + /* 151 */ "term ::= NULL", + /* 152 */ "expr ::= ID|INDEXED", + /* 153 */ "expr ::= JOIN_KW", + /* 154 */ "expr ::= nm DOT nm", + /* 155 */ "expr ::= nm DOT nm DOT nm", + /* 156 */ "term ::= FLOAT|BLOB", + /* 157 */ "term ::= STRING", + /* 158 */ "term ::= INTEGER", + /* 159 */ "expr ::= VARIABLE", + /* 160 */ "expr ::= expr COLLATE ID|STRING", + /* 161 */ "expr ::= CAST LP expr AS typetoken RP", + /* 162 */ "expr ::= ID|INDEXED LP distinct exprlist RP", + /* 163 */ "expr ::= ID|INDEXED LP STAR RP", + /* 164 */ "term ::= CTIME_KW", + /* 165 */ "expr ::= LP nexprlist COMMA expr RP", + /* 166 */ "expr ::= expr AND expr", + /* 167 */ "expr ::= expr OR expr", + /* 168 */ "expr ::= expr LT|GT|GE|LE expr", + /* 169 */ "expr ::= expr EQ|NE expr", + /* 170 */ "expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr", + /* 171 */ "expr ::= expr PLUS|MINUS expr", + /* 172 */ "expr ::= expr STAR|SLASH|REM expr", + /* 173 */ "expr ::= expr CONCAT expr", + /* 174 */ "likeop ::= LIKE_KW|MATCH", + /* 175 */ "likeop ::= NOT LIKE_KW|MATCH", + /* 176 */ "expr ::= expr likeop expr", + /* 177 */ "expr ::= expr likeop expr ESCAPE expr", + /* 178 */ "expr ::= expr ISNULL|NOTNULL", + /* 179 */ "expr ::= expr NOT NULL", + /* 180 */ "expr ::= expr IS expr", + /* 181 */ "expr ::= expr IS NOT expr", + /* 182 */ "expr ::= NOT expr", + /* 183 */ "expr ::= BITNOT expr", + /* 184 */ "expr ::= MINUS expr", + /* 185 */ "expr ::= PLUS expr", + /* 186 */ "between_op ::= BETWEEN", + /* 187 */ "between_op ::= NOT BETWEEN", + /* 188 */ "expr ::= expr between_op expr AND expr", + /* 189 */ "in_op ::= IN", + /* 190 */ "in_op ::= NOT IN", + /* 191 */ "expr ::= expr in_op LP exprlist RP", + /* 192 */ "expr ::= LP select RP", + /* 193 */ "expr ::= expr in_op LP select RP", + /* 194 */ "expr ::= expr in_op nm dbnm paren_exprlist", + /* 195 */ "expr ::= EXISTS LP select RP", + /* 196 */ "expr ::= CASE case_operand case_exprlist case_else END", + /* 197 */ "case_exprlist ::= case_exprlist WHEN expr THEN expr", + /* 198 */ "case_exprlist ::= WHEN expr THEN expr", + /* 199 */ "case_else ::= ELSE expr", + /* 200 */ "case_else ::=", + /* 201 */ "case_operand ::= expr", + /* 202 */ "case_operand ::=", + /* 203 */ "exprlist ::=", + /* 204 */ "nexprlist ::= nexprlist COMMA expr", + /* 205 */ "nexprlist ::= expr", + /* 206 */ "paren_exprlist ::=", + /* 207 */ "paren_exprlist ::= LP exprlist RP", + /* 208 */ "cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt", + /* 209 */ "uniqueflag ::= UNIQUE", + /* 210 */ "uniqueflag ::=", + /* 211 */ "eidlist_opt ::=", + /* 212 */ "eidlist_opt ::= LP eidlist RP", + /* 213 */ "eidlist ::= eidlist COMMA nm collate sortorder", + /* 214 */ "eidlist ::= nm collate sortorder", + /* 215 */ "collate ::=", + /* 216 */ "collate ::= COLLATE ID|STRING", + /* 217 */ "cmd ::= DROP INDEX ifexists fullname", + /* 218 */ "cmd ::= VACUUM", + /* 219 */ "cmd ::= VACUUM nm", + /* 220 */ "cmd ::= PRAGMA nm dbnm", + /* 221 */ "cmd ::= PRAGMA nm dbnm EQ nmnum", + /* 222 */ "cmd ::= PRAGMA nm dbnm LP nmnum RP", + /* 223 */ "cmd ::= PRAGMA nm dbnm EQ minus_num", + /* 224 */ "cmd ::= PRAGMA nm dbnm LP minus_num RP", + /* 225 */ "plus_num ::= PLUS INTEGER|FLOAT", + /* 226 */ "minus_num ::= MINUS INTEGER|FLOAT", + /* 227 */ "cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END", + /* 228 */ "trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause", + /* 229 */ "trigger_time ::= BEFORE", + /* 230 */ "trigger_time ::= AFTER", + /* 231 */ "trigger_time ::= INSTEAD OF", + /* 232 */ "trigger_time ::=", + /* 233 */ "trigger_event ::= DELETE|INSERT", + /* 234 */ "trigger_event ::= UPDATE", + /* 235 */ "trigger_event ::= UPDATE OF idlist", + /* 236 */ "when_clause ::=", + /* 237 */ "when_clause ::= WHEN expr", + /* 238 */ "trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI", + /* 239 */ "trigger_cmd_list ::= trigger_cmd SEMI", + /* 240 */ "trnm ::= nm DOT nm", + /* 241 */ "tridxby ::= INDEXED BY nm", + /* 242 */ "tridxby ::= NOT INDEXED", + /* 243 */ "trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt", + /* 244 */ "trigger_cmd ::= insert_cmd INTO trnm idlist_opt select", + /* 245 */ "trigger_cmd ::= DELETE FROM trnm tridxby where_opt", + /* 246 */ "trigger_cmd ::= select", + /* 247 */ "expr ::= RAISE LP IGNORE RP", + /* 248 */ "expr ::= RAISE LP raisetype COMMA nm RP", + /* 249 */ "raisetype ::= ROLLBACK", + /* 250 */ "raisetype ::= ABORT", + /* 251 */ "raisetype ::= FAIL", + /* 252 */ "cmd ::= DROP TRIGGER ifexists fullname", + /* 253 */ "cmd ::= ATTACH database_kw_opt expr AS expr key_opt", + /* 254 */ "cmd ::= DETACH database_kw_opt expr", + /* 255 */ "key_opt ::=", + /* 256 */ "key_opt ::= KEY expr", + /* 257 */ "cmd ::= REINDEX", + /* 258 */ "cmd ::= REINDEX nm dbnm", + /* 259 */ "cmd ::= ANALYZE", + /* 260 */ "cmd ::= ANALYZE nm dbnm", + /* 261 */ "cmd ::= ALTER TABLE fullname RENAME TO nm", + /* 262 */ "cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist", + /* 263 */ "add_column_fullname ::= fullname", + /* 264 */ "cmd ::= create_vtab", + /* 265 */ "cmd ::= create_vtab LP vtabarglist RP", + /* 266 */ "create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm", + /* 267 */ "vtabarg ::=", + /* 268 */ "vtabargtoken ::= ANY", + /* 269 */ "vtabargtoken ::= lp anylist RP", + /* 270 */ "lp ::= LP", + /* 271 */ "with ::=", + /* 272 */ "with ::= WITH wqlist", + /* 273 */ "with ::= WITH RECURSIVE wqlist", + /* 274 */ "wqlist ::= nm eidlist_opt AS LP select RP", + /* 275 */ "wqlist ::= wqlist COMMA nm eidlist_opt AS LP select RP", + /* 276 */ "input ::= cmdlist", + /* 277 */ "cmdlist ::= cmdlist ecmd", + /* 278 */ "cmdlist ::= ecmd", + /* 279 */ "ecmd ::= SEMI", + /* 280 */ "ecmd ::= explain cmdx SEMI", + /* 281 */ "explain ::=", + /* 282 */ "trans_opt ::=", + /* 283 */ "trans_opt ::= TRANSACTION", + /* 284 */ "trans_opt ::= TRANSACTION nm", + /* 285 */ "savepoint_opt ::= SAVEPOINT", + /* 286 */ "savepoint_opt ::=", + /* 287 */ "cmd ::= create_table create_table_args", + /* 288 */ "columnlist ::= columnlist COMMA columnname carglist", + /* 289 */ "columnlist ::= columnname carglist", + /* 290 */ "nm ::= ID|INDEXED", + /* 291 */ "nm ::= STRING", + /* 292 */ "nm ::= JOIN_KW", + /* 293 */ "typetoken ::= typename", + /* 294 */ "typename ::= ID|STRING", + /* 295 */ "signed ::= plus_num", + /* 296 */ "signed ::= minus_num", + /* 297 */ "carglist ::= carglist ccons", + /* 298 */ "carglist ::=", + /* 299 */ "ccons ::= NULL onconf", + /* 300 */ "conslist_opt ::= COMMA conslist", + /* 301 */ "conslist ::= conslist tconscomma tcons", + /* 302 */ "conslist ::= tcons", + /* 303 */ "tconscomma ::=", + /* 304 */ "defer_subclause_opt ::= defer_subclause", + /* 305 */ "resolvetype ::= raisetype", + /* 306 */ "selectnowith ::= oneselect", + /* 307 */ "oneselect ::= values", + /* 308 */ "sclp ::= selcollist COMMA", + /* 309 */ "as ::= ID|STRING", + /* 310 */ "expr ::= term", + /* 311 */ "exprlist ::= nexprlist", + /* 312 */ "nmnum ::= plus_num", + /* 313 */ "nmnum ::= nm", + /* 314 */ "nmnum ::= ON", + /* 315 */ "nmnum ::= DELETE", + /* 316 */ "nmnum ::= DEFAULT", + /* 317 */ "plus_num ::= INTEGER|FLOAT", + /* 318 */ "foreach_clause ::=", + /* 319 */ "foreach_clause ::= FOR EACH ROW", + /* 320 */ "trnm ::= nm", + /* 321 */ "tridxby ::=", + /* 322 */ "database_kw_opt ::= DATABASE", + /* 323 */ "database_kw_opt ::=", + /* 324 */ "kwcolumn_opt ::=", + /* 325 */ "kwcolumn_opt ::= COLUMNKW", + /* 326 */ "vtabarglist ::= vtabarg", + /* 327 */ "vtabarglist ::= vtabarglist COMMA vtabarg", + /* 328 */ "vtabarg ::= vtabarg vtabargtoken", + /* 329 */ "anylist ::=", + /* 330 */ "anylist ::= anylist LP anylist RP", + /* 331 */ "anylist ::= anylist ANY", +}; +#endif /* NDEBUG */ + + +#if YYSTACKDEPTH<=0 +/* +** Try to increase the size of the parser stack. Return the number +** of errors. Return 0 on success. +*/ +static int yyGrowStack(yyParser *p){ + int newSize; + int idx; + yyStackEntry *pNew; + + newSize = p->yystksz*2 + 100; + idx = p->yytos ? (int)(p->yytos - p->yystack) : 0; + if( p->yystack==&p->yystk0 ){ + pNew = malloc(newSize*sizeof(pNew[0])); + if( pNew ) pNew[0] = p->yystk0; + }else{ + pNew = realloc(p->yystack, newSize*sizeof(pNew[0])); + } + if( pNew ){ + p->yystack = pNew; + p->yytos = &p->yystack[idx]; +#ifndef NDEBUG + if( yyTraceFILE ){ + fprintf(yyTraceFILE,"%sStack grows from %d to %d entries.\n", + yyTracePrompt, p->yystksz, newSize); + } +#endif + p->yystksz = newSize; + } + return pNew==0; +} +#endif + +/* Datatype of the argument to the memory allocated passed as the +** second argument to sqlite3ParserAlloc() below. This can be changed by +** putting an appropriate #define in the %include section of the input +** grammar. +*/ +#ifndef YYMALLOCARGTYPE +# define YYMALLOCARGTYPE size_t +#endif + +/* +** This function allocates a new parser. +** The only argument is a pointer to a function which works like +** malloc. +** +** Inputs: +** A pointer to the function used to allocate memory. +** +** Outputs: +** A pointer to a parser. This pointer is used in subsequent calls +** to sqlite3Parser and sqlite3ParserFree. +*/ +SQLITE_PRIVATE void *sqlite3ParserAlloc(void *(*mallocProc)(YYMALLOCARGTYPE)){ + yyParser *pParser; + pParser = (yyParser*)(*mallocProc)( (YYMALLOCARGTYPE)sizeof(yyParser) ); + if( pParser ){ +#ifdef YYTRACKMAXSTACKDEPTH + pParser->yyhwm = 0; +#endif +#if YYSTACKDEPTH<=0 + pParser->yytos = NULL; + pParser->yystack = NULL; + pParser->yystksz = 0; + if( yyGrowStack(pParser) ){ + pParser->yystack = &pParser->yystk0; + pParser->yystksz = 1; + } +#endif +#ifndef YYNOERRORRECOVERY + pParser->yyerrcnt = -1; +#endif + pParser->yytos = pParser->yystack; + pParser->yystack[0].stateno = 0; + pParser->yystack[0].major = 0; + } + return pParser; +} + +/* The following function deletes the "minor type" or semantic value +** associated with a symbol. The symbol can be either a terminal +** or nonterminal. "yymajor" is the symbol code, and "yypminor" is +** a pointer to the value to be deleted. The code used to do the +** deletions is derived from the %destructor and/or %token_destructor +** directives of the input grammar. +*/ +static void yy_destructor( + yyParser *yypParser, /* The parser */ + YYCODETYPE yymajor, /* Type code for object to destroy */ + YYMINORTYPE *yypminor /* The object to be destroyed */ +){ + sqlite3ParserARG_FETCH; + switch( yymajor ){ + /* Here is inserted the actions which take place when a + ** terminal or non-terminal is destroyed. This can happen + ** when the symbol is popped from the stack during a + ** reduce or during error processing or when a parser is + ** being destroyed before it is finished parsing. + ** + ** Note: during a reduce, the only symbols destroyed are those + ** which appear on the RHS of the rule, but which are *not* used + ** inside the C code. + */ +/********* Begin destructor definitions ***************************************/ + case 163: /* select */ + case 194: /* selectnowith */ + case 195: /* oneselect */ + case 206: /* values */ +{ +sqlite3SelectDelete(pParse->db, (yypminor->yy243)); +} + break; + case 172: /* term */ + case 173: /* expr */ +{ +sqlite3ExprDelete(pParse->db, (yypminor->yy190).pExpr); +} + break; + case 177: /* eidlist_opt */ + case 186: /* sortlist */ + case 187: /* eidlist */ + case 199: /* selcollist */ + case 202: /* groupby_opt */ + case 204: /* orderby_opt */ + case 207: /* nexprlist */ + case 208: /* exprlist */ + case 209: /* sclp */ + case 218: /* setlist */ + case 224: /* paren_exprlist */ + case 226: /* case_exprlist */ +{ +sqlite3ExprListDelete(pParse->db, (yypminor->yy148)); +} + break; + case 193: /* fullname */ + case 200: /* from */ + case 211: /* seltablist */ + case 212: /* stl_prefix */ +{ +sqlite3SrcListDelete(pParse->db, (yypminor->yy185)); +} + break; + case 196: /* with */ + case 250: /* wqlist */ +{ +sqlite3WithDelete(pParse->db, (yypminor->yy285)); +} + break; + case 201: /* where_opt */ + case 203: /* having_opt */ + case 215: /* on_opt */ + case 225: /* case_operand */ + case 227: /* case_else */ + case 236: /* when_clause */ + case 241: /* key_opt */ +{ +sqlite3ExprDelete(pParse->db, (yypminor->yy72)); +} + break; + case 216: /* using_opt */ + case 217: /* idlist */ + case 220: /* idlist_opt */ +{ +sqlite3IdListDelete(pParse->db, (yypminor->yy254)); +} + break; + case 232: /* trigger_cmd_list */ + case 237: /* trigger_cmd */ +{ +sqlite3DeleteTriggerStep(pParse->db, (yypminor->yy145)); +} + break; + case 234: /* trigger_event */ +{ +sqlite3IdListDelete(pParse->db, (yypminor->yy332).b); +} + break; +/********* End destructor definitions *****************************************/ + default: break; /* If no destructor action specified: do nothing */ + } +} + +/* +** Pop the parser's stack once. +** +** If there is a destructor routine associated with the token which +** is popped from the stack, then call it. +*/ +static void yy_pop_parser_stack(yyParser *pParser){ + yyStackEntry *yytos; + assert( pParser->yytos!=0 ); + assert( pParser->yytos > pParser->yystack ); + yytos = pParser->yytos--; +#ifndef NDEBUG + if( yyTraceFILE ){ + fprintf(yyTraceFILE,"%sPopping %s\n", + yyTracePrompt, + yyTokenName[yytos->major]); + } +#endif + yy_destructor(pParser, yytos->major, &yytos->minor); +} + +/* +** Deallocate and destroy a parser. Destructors are called for +** all stack elements before shutting the parser down. +** +** If the YYPARSEFREENEVERNULL macro exists (for example because it +** is defined in a %include section of the input grammar) then it is +** assumed that the input pointer is never NULL. +*/ +SQLITE_PRIVATE void sqlite3ParserFree( + void *p, /* The parser to be deleted */ + void (*freeProc)(void*) /* Function used to reclaim memory */ +){ + yyParser *pParser = (yyParser*)p; +#ifndef YYPARSEFREENEVERNULL + if( pParser==0 ) return; +#endif + while( pParser->yytos>pParser->yystack ) yy_pop_parser_stack(pParser); +#if YYSTACKDEPTH<=0 + if( pParser->yystack!=&pParser->yystk0 ) free(pParser->yystack); +#endif + (*freeProc)((void*)pParser); +} + +/* +** Return the peak depth of the stack for a parser. +*/ +#ifdef YYTRACKMAXSTACKDEPTH +SQLITE_PRIVATE int sqlite3ParserStackPeak(void *p){ + yyParser *pParser = (yyParser*)p; + return pParser->yyhwm; +} +#endif + +/* +** Find the appropriate action for a parser given the terminal +** look-ahead token iLookAhead. +*/ +static unsigned int yy_find_shift_action( + yyParser *pParser, /* The parser */ + YYCODETYPE iLookAhead /* The look-ahead token */ +){ + int i; + int stateno = pParser->yytos->stateno; + + if( stateno>=YY_MIN_REDUCE ) return stateno; + assert( stateno <= YY_SHIFT_COUNT ); + do{ + i = yy_shift_ofst[stateno]; + assert( iLookAhead!=YYNOCODE ); + i += iLookAhead; + if( i<0 || i>=YY_ACTTAB_COUNT || yy_lookahead[i]!=iLookAhead ){ +#ifdef YYFALLBACK + YYCODETYPE iFallback; /* Fallback token */ + if( iLookAhead %s\n", + yyTracePrompt, yyTokenName[iLookAhead], yyTokenName[iFallback]); + } +#endif + assert( yyFallback[iFallback]==0 ); /* Fallback loop must terminate */ + iLookAhead = iFallback; + continue; + } +#endif +#ifdef YYWILDCARD + { + int j = i - iLookAhead + YYWILDCARD; + if( +#if YY_SHIFT_MIN+YYWILDCARD<0 + j>=0 && +#endif +#if YY_SHIFT_MAX+YYWILDCARD>=YY_ACTTAB_COUNT + j0 + ){ +#ifndef NDEBUG + if( yyTraceFILE ){ + fprintf(yyTraceFILE, "%sWILDCARD %s => %s\n", + yyTracePrompt, yyTokenName[iLookAhead], + yyTokenName[YYWILDCARD]); + } +#endif /* NDEBUG */ + return yy_action[j]; + } + } +#endif /* YYWILDCARD */ + return yy_default[stateno]; + }else{ + return yy_action[i]; + } + }while(1); +} + +/* +** Find the appropriate action for a parser given the non-terminal +** look-ahead token iLookAhead. +*/ +static int yy_find_reduce_action( + int stateno, /* Current state number */ + YYCODETYPE iLookAhead /* The look-ahead token */ +){ + int i; +#ifdef YYERRORSYMBOL + if( stateno>YY_REDUCE_COUNT ){ + return yy_default[stateno]; + } +#else + 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_ACTTAB_COUNT || yy_lookahead[i]!=iLookAhead ){ + return yy_default[stateno]; + } +#else + assert( i>=0 && iyytos--; +#ifndef NDEBUG + if( yyTraceFILE ){ + fprintf(yyTraceFILE,"%sStack Overflow!\n",yyTracePrompt); + } +#endif + while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser); + /* Here code is inserted which will execute if the parser + ** stack every overflows */ +/******** Begin %stack_overflow code ******************************************/ + + sqlite3ErrorMsg(pParse, "parser stack overflow"); +/******** End %stack_overflow code ********************************************/ + sqlite3ParserARG_STORE; /* Suppress warning about unused %extra_argument var */ +} + +/* +** Print tracing information for a SHIFT action +*/ +#ifndef NDEBUG +static void yyTraceShift(yyParser *yypParser, int yyNewState){ + if( yyTraceFILE ){ + if( yyNewStateyytos->major], + yyNewState); + }else{ + fprintf(yyTraceFILE,"%sShift '%s'\n", + yyTracePrompt,yyTokenName[yypParser->yytos->major]); + } + } +} +#else +# define yyTraceShift(X,Y) +#endif + +/* +** Perform a shift action. +*/ +static void yy_shift( + yyParser *yypParser, /* The parser to be shifted */ + int yyNewState, /* The new state to shift in */ + int yyMajor, /* The major token to shift in */ + sqlite3ParserTOKENTYPE yyMinor /* The minor token to shift in */ +){ + yyStackEntry *yytos; + yypParser->yytos++; +#ifdef YYTRACKMAXSTACKDEPTH + if( (int)(yypParser->yytos - yypParser->yystack)>yypParser->yyhwm ){ + yypParser->yyhwm++; + assert( yypParser->yyhwm == (int)(yypParser->yytos - yypParser->yystack) ); + } +#endif +#if YYSTACKDEPTH>0 + if( yypParser->yytos>=&yypParser->yystack[YYSTACKDEPTH] ){ + yyStackOverflow(yypParser); + return; + } +#else + if( yypParser->yytos>=&yypParser->yystack[yypParser->yystksz] ){ + if( yyGrowStack(yypParser) ){ + yyStackOverflow(yypParser); + return; + } + } +#endif + if( yyNewState > YY_MAX_SHIFT ){ + yyNewState += YY_MIN_REDUCE - YY_MIN_SHIFTREDUCE; + } + yytos = yypParser->yytos; + yytos->stateno = (YYACTIONTYPE)yyNewState; + yytos->major = (YYCODETYPE)yyMajor; + yytos->minor.yy0 = yyMinor; + yyTraceShift(yypParser, yyNewState); +} + +/* The following table contains information about every rule that +** is used during the reduce. +*/ +static const struct { + YYCODETYPE lhs; /* Symbol on the left-hand side of the rule */ + unsigned char nrhs; /* Number of right-hand side symbols in the rule */ +} yyRuleInfo[] = { + { 147, 1 }, + { 147, 3 }, + { 148, 1 }, + { 149, 3 }, + { 150, 0 }, + { 150, 1 }, + { 150, 1 }, + { 150, 1 }, + { 149, 2 }, + { 149, 2 }, + { 149, 2 }, + { 149, 2 }, + { 149, 3 }, + { 149, 5 }, + { 154, 6 }, + { 156, 1 }, + { 158, 0 }, + { 158, 3 }, + { 157, 1 }, + { 157, 0 }, + { 155, 5 }, + { 155, 2 }, + { 162, 0 }, + { 162, 2 }, + { 164, 2 }, + { 166, 0 }, + { 166, 4 }, + { 166, 6 }, + { 167, 2 }, + { 171, 2 }, + { 171, 2 }, + { 171, 4 }, + { 171, 3 }, + { 171, 3 }, + { 171, 2 }, + { 171, 3 }, + { 171, 5 }, + { 171, 2 }, + { 171, 4 }, + { 171, 4 }, + { 171, 1 }, + { 171, 2 }, + { 176, 0 }, + { 176, 1 }, + { 178, 0 }, + { 178, 2 }, + { 180, 2 }, + { 180, 3 }, + { 180, 3 }, + { 180, 3 }, + { 181, 2 }, + { 181, 2 }, + { 181, 1 }, + { 181, 1 }, + { 181, 2 }, + { 179, 3 }, + { 179, 2 }, + { 182, 0 }, + { 182, 2 }, + { 182, 2 }, + { 161, 0 }, + { 184, 1 }, + { 185, 2 }, + { 185, 7 }, + { 185, 5 }, + { 185, 5 }, + { 185, 10 }, + { 188, 0 }, + { 174, 0 }, + { 174, 3 }, + { 189, 0 }, + { 189, 2 }, + { 190, 1 }, + { 190, 1 }, + { 149, 4 }, + { 192, 2 }, + { 192, 0 }, + { 149, 9 }, + { 149, 4 }, + { 149, 1 }, + { 163, 2 }, + { 194, 3 }, + { 197, 1 }, + { 197, 2 }, + { 197, 1 }, + { 195, 9 }, + { 206, 4 }, + { 206, 5 }, + { 198, 1 }, + { 198, 1 }, + { 198, 0 }, + { 209, 0 }, + { 199, 3 }, + { 199, 2 }, + { 199, 4 }, + { 210, 2 }, + { 210, 0 }, + { 200, 0 }, + { 200, 2 }, + { 212, 2 }, + { 212, 0 }, + { 211, 7 }, + { 211, 9 }, + { 211, 7 }, + { 211, 7 }, + { 159, 0 }, + { 159, 2 }, + { 193, 2 }, + { 213, 1 }, + { 213, 2 }, + { 213, 3 }, + { 213, 4 }, + { 215, 2 }, + { 215, 0 }, + { 214, 0 }, + { 214, 3 }, + { 214, 2 }, + { 216, 4 }, + { 216, 0 }, + { 204, 0 }, + { 204, 3 }, + { 186, 4 }, + { 186, 2 }, + { 175, 1 }, + { 175, 1 }, + { 175, 0 }, + { 202, 0 }, + { 202, 3 }, + { 203, 0 }, + { 203, 2 }, + { 205, 0 }, + { 205, 2 }, + { 205, 4 }, + { 205, 4 }, + { 149, 6 }, + { 201, 0 }, + { 201, 2 }, + { 149, 8 }, + { 218, 5 }, + { 218, 7 }, + { 218, 3 }, + { 218, 5 }, + { 149, 6 }, + { 149, 7 }, + { 219, 2 }, + { 219, 1 }, + { 220, 0 }, + { 220, 3 }, + { 217, 3 }, + { 217, 1 }, + { 173, 3 }, + { 172, 1 }, + { 173, 1 }, + { 173, 1 }, + { 173, 3 }, + { 173, 5 }, + { 172, 1 }, + { 172, 1 }, + { 172, 1 }, + { 173, 1 }, + { 173, 3 }, + { 173, 6 }, + { 173, 5 }, + { 173, 4 }, + { 172, 1 }, + { 173, 5 }, + { 173, 3 }, + { 173, 3 }, + { 173, 3 }, + { 173, 3 }, + { 173, 3 }, + { 173, 3 }, + { 173, 3 }, + { 173, 3 }, + { 221, 1 }, + { 221, 2 }, + { 173, 3 }, + { 173, 5 }, + { 173, 2 }, + { 173, 3 }, + { 173, 3 }, + { 173, 4 }, + { 173, 2 }, + { 173, 2 }, + { 173, 2 }, + { 173, 2 }, + { 222, 1 }, + { 222, 2 }, + { 173, 5 }, + { 223, 1 }, + { 223, 2 }, + { 173, 5 }, + { 173, 3 }, + { 173, 5 }, + { 173, 5 }, + { 173, 4 }, + { 173, 5 }, + { 226, 5 }, + { 226, 4 }, + { 227, 2 }, + { 227, 0 }, + { 225, 1 }, + { 225, 0 }, + { 208, 0 }, + { 207, 3 }, + { 207, 1 }, + { 224, 0 }, + { 224, 3 }, + { 149, 12 }, + { 228, 1 }, + { 228, 0 }, + { 177, 0 }, + { 177, 3 }, + { 187, 5 }, + { 187, 3 }, + { 229, 0 }, + { 229, 2 }, + { 149, 4 }, + { 149, 1 }, + { 149, 2 }, + { 149, 3 }, + { 149, 5 }, + { 149, 6 }, + { 149, 5 }, + { 149, 6 }, + { 169, 2 }, + { 170, 2 }, + { 149, 5 }, + { 231, 11 }, + { 233, 1 }, + { 233, 1 }, + { 233, 2 }, + { 233, 0 }, + { 234, 1 }, + { 234, 1 }, + { 234, 3 }, + { 236, 0 }, + { 236, 2 }, + { 232, 3 }, + { 232, 2 }, + { 238, 3 }, + { 239, 3 }, + { 239, 2 }, + { 237, 7 }, + { 237, 5 }, + { 237, 5 }, + { 237, 1 }, + { 173, 4 }, + { 173, 6 }, + { 191, 1 }, + { 191, 1 }, + { 191, 1 }, + { 149, 4 }, + { 149, 6 }, + { 149, 3 }, + { 241, 0 }, + { 241, 2 }, + { 149, 1 }, + { 149, 3 }, + { 149, 1 }, + { 149, 3 }, + { 149, 6 }, + { 149, 7 }, + { 242, 1 }, + { 149, 1 }, + { 149, 4 }, + { 244, 8 }, + { 246, 0 }, + { 247, 1 }, + { 247, 3 }, + { 248, 1 }, + { 196, 0 }, + { 196, 2 }, + { 196, 3 }, + { 250, 6 }, + { 250, 8 }, + { 144, 1 }, + { 145, 2 }, + { 145, 1 }, + { 146, 1 }, + { 146, 3 }, + { 147, 0 }, + { 151, 0 }, + { 151, 1 }, + { 151, 2 }, + { 153, 1 }, + { 153, 0 }, + { 149, 2 }, + { 160, 4 }, + { 160, 2 }, + { 152, 1 }, + { 152, 1 }, + { 152, 1 }, + { 166, 1 }, + { 167, 1 }, + { 168, 1 }, + { 168, 1 }, + { 165, 2 }, + { 165, 0 }, + { 171, 2 }, + { 161, 2 }, + { 183, 3 }, + { 183, 1 }, + { 184, 0 }, + { 188, 1 }, + { 190, 1 }, + { 194, 1 }, + { 195, 1 }, + { 209, 2 }, + { 210, 1 }, + { 173, 1 }, + { 208, 1 }, + { 230, 1 }, + { 230, 1 }, + { 230, 1 }, + { 230, 1 }, + { 230, 1 }, + { 169, 1 }, + { 235, 0 }, + { 235, 3 }, + { 238, 1 }, + { 239, 0 }, + { 240, 1 }, + { 240, 0 }, + { 243, 0 }, + { 243, 1 }, + { 245, 1 }, + { 245, 3 }, + { 246, 2 }, + { 249, 0 }, + { 249, 4 }, + { 249, 2 }, +}; + +static void yy_accept(yyParser*); /* Forward Declaration */ + +/* +** Perform a reduce action and the shift that must immediately +** follow the reduce. +*/ +static void yy_reduce( + yyParser *yypParser, /* The parser */ + unsigned int yyruleno /* Number of the rule by which to reduce */ +){ + int yygoto; /* The next state */ + int yyact; /* The next action */ + yyStackEntry *yymsp; /* The top of the parser's stack */ + int yysize; /* Amount to pop the stack */ + sqlite3ParserARG_FETCH; + yymsp = yypParser->yytos; +#ifndef NDEBUG + if( yyTraceFILE && yyruleno<(int)(sizeof(yyRuleName)/sizeof(yyRuleName[0])) ){ + yysize = yyRuleInfo[yyruleno].nrhs; + fprintf(yyTraceFILE, "%sReduce [%s], go to state %d.\n", yyTracePrompt, + yyRuleName[yyruleno], yymsp[-yysize].stateno); + } +#endif /* NDEBUG */ + + /* Check that the stack is large enough to grow by a single entry + ** if the RHS of the rule is empty. This ensures that there is room + ** enough on the stack to push the LHS value */ + if( yyRuleInfo[yyruleno].nrhs==0 ){ +#ifdef YYTRACKMAXSTACKDEPTH + if( (int)(yypParser->yytos - yypParser->yystack)>yypParser->yyhwm ){ + yypParser->yyhwm++; + assert( yypParser->yyhwm == (int)(yypParser->yytos - yypParser->yystack)); + } +#endif +#if YYSTACKDEPTH>0 + if( yypParser->yytos>=&yypParser->yystack[YYSTACKDEPTH-1] ){ + yyStackOverflow(yypParser); + return; + } +#else + if( yypParser->yytos>=&yypParser->yystack[yypParser->yystksz-1] ){ + if( yyGrowStack(yypParser) ){ + yyStackOverflow(yypParser); + return; + } + yymsp = yypParser->yytos; + } +#endif + } + + switch( yyruleno ){ + /* Beginning here are the reduction cases. A typical example + ** follows: + ** case 0: + ** #line + ** { ... } // User supplied code + ** #line + ** break; + */ +/********** Begin reduce actions **********************************************/ + YYMINORTYPE yylhsminor; + case 0: /* explain ::= EXPLAIN */ +{ pParse->explain = 1; } + break; + case 1: /* explain ::= EXPLAIN QUERY PLAN */ +{ pParse->explain = 2; } + break; + case 2: /* cmdx ::= cmd */ +{ sqlite3FinishCoding(pParse); } + break; + case 3: /* cmd ::= BEGIN transtype trans_opt */ +{sqlite3BeginTransaction(pParse, yymsp[-1].minor.yy194);} + break; + case 4: /* transtype ::= */ +{yymsp[1].minor.yy194 = TK_DEFERRED;} + break; + case 5: /* transtype ::= DEFERRED */ + case 6: /* transtype ::= IMMEDIATE */ yytestcase(yyruleno==6); + case 7: /* transtype ::= EXCLUSIVE */ yytestcase(yyruleno==7); +{yymsp[0].minor.yy194 = yymsp[0].major; /*A-overwrites-X*/} + break; + case 8: /* cmd ::= COMMIT trans_opt */ + case 9: /* cmd ::= END trans_opt */ yytestcase(yyruleno==9); +{sqlite3CommitTransaction(pParse);} + break; + case 10: /* cmd ::= ROLLBACK trans_opt */ +{sqlite3RollbackTransaction(pParse);} + break; + case 11: /* cmd ::= SAVEPOINT nm */ +{ + sqlite3Savepoint(pParse, SAVEPOINT_BEGIN, &yymsp[0].minor.yy0); +} + break; + case 12: /* cmd ::= RELEASE savepoint_opt nm */ +{ + sqlite3Savepoint(pParse, SAVEPOINT_RELEASE, &yymsp[0].minor.yy0); +} + break; + case 13: /* cmd ::= ROLLBACK trans_opt TO savepoint_opt nm */ +{ + sqlite3Savepoint(pParse, SAVEPOINT_ROLLBACK, &yymsp[0].minor.yy0); +} + break; + case 14: /* create_table ::= createkw temp TABLE ifnotexists nm dbnm */ +{ + sqlite3StartTable(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0,yymsp[-4].minor.yy194,0,0,yymsp[-2].minor.yy194); +} + break; + case 15: /* createkw ::= CREATE */ +{disableLookaside(pParse);} + break; + case 16: /* ifnotexists ::= */ + case 19: /* temp ::= */ yytestcase(yyruleno==19); + case 22: /* table_options ::= */ yytestcase(yyruleno==22); + case 42: /* autoinc ::= */ yytestcase(yyruleno==42); + case 57: /* init_deferred_pred_opt ::= */ yytestcase(yyruleno==57); + case 67: /* defer_subclause_opt ::= */ yytestcase(yyruleno==67); + case 76: /* ifexists ::= */ yytestcase(yyruleno==76); + case 90: /* distinct ::= */ yytestcase(yyruleno==90); + case 215: /* collate ::= */ yytestcase(yyruleno==215); +{yymsp[1].minor.yy194 = 0;} + break; + case 17: /* ifnotexists ::= IF NOT EXISTS */ +{yymsp[-2].minor.yy194 = 1;} + break; + case 18: /* temp ::= TEMP */ + case 43: /* autoinc ::= AUTOINCR */ yytestcase(yyruleno==43); +{yymsp[0].minor.yy194 = 1;} + break; + case 20: /* create_table_args ::= LP columnlist conslist_opt RP table_options */ +{ + sqlite3EndTable(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,yymsp[0].minor.yy194,0); +} + break; + case 21: /* create_table_args ::= AS select */ +{ + sqlite3EndTable(pParse,0,0,0,yymsp[0].minor.yy243); + sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy243); +} + break; + case 23: /* table_options ::= WITHOUT nm */ +{ + if( yymsp[0].minor.yy0.n==5 && sqlite3_strnicmp(yymsp[0].minor.yy0.z,"rowid",5)==0 ){ + yymsp[-1].minor.yy194 = TF_WithoutRowid | TF_NoVisibleRowid; + }else{ + yymsp[-1].minor.yy194 = 0; + sqlite3ErrorMsg(pParse, "unknown table option: %.*s", yymsp[0].minor.yy0.n, yymsp[0].minor.yy0.z); + } +} + break; + case 24: /* columnname ::= nm typetoken */ +{sqlite3AddColumn(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0);} + break; + case 25: /* typetoken ::= */ + case 60: /* conslist_opt ::= */ yytestcase(yyruleno==60); + case 96: /* as ::= */ yytestcase(yyruleno==96); +{yymsp[1].minor.yy0.n = 0; yymsp[1].minor.yy0.z = 0;} + break; + case 26: /* typetoken ::= typename LP signed RP */ +{ + yymsp[-3].minor.yy0.n = (int)(&yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n] - yymsp[-3].minor.yy0.z); +} + break; + case 27: /* typetoken ::= typename LP signed COMMA signed RP */ +{ + yymsp[-5].minor.yy0.n = (int)(&yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n] - yymsp[-5].minor.yy0.z); +} + break; + case 28: /* typename ::= typename ID|STRING */ +{yymsp[-1].minor.yy0.n=yymsp[0].minor.yy0.n+(int)(yymsp[0].minor.yy0.z-yymsp[-1].minor.yy0.z);} + break; + case 29: /* ccons ::= CONSTRAINT nm */ + case 62: /* tcons ::= CONSTRAINT nm */ yytestcase(yyruleno==62); +{pParse->constraintName = yymsp[0].minor.yy0;} + break; + case 30: /* ccons ::= DEFAULT term */ + case 32: /* ccons ::= DEFAULT PLUS term */ yytestcase(yyruleno==32); +{sqlite3AddDefaultValue(pParse,&yymsp[0].minor.yy190);} + break; + case 31: /* ccons ::= DEFAULT LP expr RP */ +{sqlite3AddDefaultValue(pParse,&yymsp[-1].minor.yy190);} + break; + case 33: /* ccons ::= DEFAULT MINUS term */ +{ + ExprSpan v; + v.pExpr = sqlite3PExpr(pParse, TK_UMINUS, yymsp[0].minor.yy190.pExpr, 0, 0); + v.zStart = yymsp[-1].minor.yy0.z; + v.zEnd = yymsp[0].minor.yy190.zEnd; + sqlite3AddDefaultValue(pParse,&v); +} + break; + case 34: /* ccons ::= DEFAULT ID|INDEXED */ +{ + ExprSpan v; + spanExpr(&v, pParse, TK_STRING, yymsp[0].minor.yy0); + sqlite3AddDefaultValue(pParse,&v); +} + break; + case 35: /* ccons ::= NOT NULL onconf */ +{sqlite3AddNotNull(pParse, yymsp[0].minor.yy194);} + break; + case 36: /* ccons ::= PRIMARY KEY sortorder onconf autoinc */ +{sqlite3AddPrimaryKey(pParse,0,yymsp[-1].minor.yy194,yymsp[0].minor.yy194,yymsp[-2].minor.yy194);} + break; + case 37: /* ccons ::= UNIQUE onconf */ +{sqlite3CreateIndex(pParse,0,0,0,0,yymsp[0].minor.yy194,0,0,0,0, + SQLITE_IDXTYPE_UNIQUE);} + break; + case 38: /* ccons ::= CHECK LP expr RP */ +{sqlite3AddCheckConstraint(pParse,yymsp[-1].minor.yy190.pExpr);} + break; + case 39: /* ccons ::= REFERENCES nm eidlist_opt refargs */ +{sqlite3CreateForeignKey(pParse,0,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy148,yymsp[0].minor.yy194);} + break; + case 40: /* ccons ::= defer_subclause */ +{sqlite3DeferForeignKey(pParse,yymsp[0].minor.yy194);} + break; + case 41: /* ccons ::= COLLATE ID|STRING */ +{sqlite3AddCollateType(pParse, &yymsp[0].minor.yy0);} + break; + case 44: /* refargs ::= */ +{ yymsp[1].minor.yy194 = OE_None*0x0101; /* EV: R-19803-45884 */} + break; + case 45: /* refargs ::= refargs refarg */ +{ yymsp[-1].minor.yy194 = (yymsp[-1].minor.yy194 & ~yymsp[0].minor.yy497.mask) | yymsp[0].minor.yy497.value; } + break; + case 46: /* refarg ::= MATCH nm */ +{ yymsp[-1].minor.yy497.value = 0; yymsp[-1].minor.yy497.mask = 0x000000; } + break; + case 47: /* refarg ::= ON INSERT refact */ +{ yymsp[-2].minor.yy497.value = 0; yymsp[-2].minor.yy497.mask = 0x000000; } + break; + case 48: /* refarg ::= ON DELETE refact */ +{ yymsp[-2].minor.yy497.value = yymsp[0].minor.yy194; yymsp[-2].minor.yy497.mask = 0x0000ff; } + break; + case 49: /* refarg ::= ON UPDATE refact */ +{ yymsp[-2].minor.yy497.value = yymsp[0].minor.yy194<<8; yymsp[-2].minor.yy497.mask = 0x00ff00; } + break; + case 50: /* refact ::= SET NULL */ +{ yymsp[-1].minor.yy194 = OE_SetNull; /* EV: R-33326-45252 */} + break; + case 51: /* refact ::= SET DEFAULT */ +{ yymsp[-1].minor.yy194 = OE_SetDflt; /* EV: R-33326-45252 */} + break; + case 52: /* refact ::= CASCADE */ +{ yymsp[0].minor.yy194 = OE_Cascade; /* EV: R-33326-45252 */} + break; + case 53: /* refact ::= RESTRICT */ +{ yymsp[0].minor.yy194 = OE_Restrict; /* EV: R-33326-45252 */} + break; + case 54: /* refact ::= NO ACTION */ +{ yymsp[-1].minor.yy194 = OE_None; /* EV: R-33326-45252 */} + break; + case 55: /* defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt */ +{yymsp[-2].minor.yy194 = 0;} + break; + case 56: /* defer_subclause ::= DEFERRABLE init_deferred_pred_opt */ + case 71: /* orconf ::= OR resolvetype */ yytestcase(yyruleno==71); + case 144: /* insert_cmd ::= INSERT orconf */ yytestcase(yyruleno==144); +{yymsp[-1].minor.yy194 = yymsp[0].minor.yy194;} + break; + case 58: /* init_deferred_pred_opt ::= INITIALLY DEFERRED */ + case 75: /* ifexists ::= IF EXISTS */ yytestcase(yyruleno==75); + case 187: /* between_op ::= NOT BETWEEN */ yytestcase(yyruleno==187); + case 190: /* in_op ::= NOT IN */ yytestcase(yyruleno==190); + case 216: /* collate ::= COLLATE ID|STRING */ yytestcase(yyruleno==216); +{yymsp[-1].minor.yy194 = 1;} + break; + case 59: /* init_deferred_pred_opt ::= INITIALLY IMMEDIATE */ +{yymsp[-1].minor.yy194 = 0;} + break; + case 61: /* tconscomma ::= COMMA */ +{pParse->constraintName.n = 0;} + break; + case 63: /* tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf */ +{sqlite3AddPrimaryKey(pParse,yymsp[-3].minor.yy148,yymsp[0].minor.yy194,yymsp[-2].minor.yy194,0);} + break; + case 64: /* tcons ::= UNIQUE LP sortlist RP onconf */ +{sqlite3CreateIndex(pParse,0,0,0,yymsp[-2].minor.yy148,yymsp[0].minor.yy194,0,0,0,0, + SQLITE_IDXTYPE_UNIQUE);} + break; + case 65: /* tcons ::= CHECK LP expr RP onconf */ +{sqlite3AddCheckConstraint(pParse,yymsp[-2].minor.yy190.pExpr);} + break; + case 66: /* tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt */ +{ + sqlite3CreateForeignKey(pParse, yymsp[-6].minor.yy148, &yymsp[-3].minor.yy0, yymsp[-2].minor.yy148, yymsp[-1].minor.yy194); + sqlite3DeferForeignKey(pParse, yymsp[0].minor.yy194); +} + break; + case 68: /* onconf ::= */ + case 70: /* orconf ::= */ yytestcase(yyruleno==70); +{yymsp[1].minor.yy194 = OE_Default;} + break; + case 69: /* onconf ::= ON CONFLICT resolvetype */ +{yymsp[-2].minor.yy194 = yymsp[0].minor.yy194;} + break; + case 72: /* resolvetype ::= IGNORE */ +{yymsp[0].minor.yy194 = OE_Ignore;} + break; + case 73: /* resolvetype ::= REPLACE */ + case 145: /* insert_cmd ::= REPLACE */ yytestcase(yyruleno==145); +{yymsp[0].minor.yy194 = OE_Replace;} + break; + case 74: /* cmd ::= DROP TABLE ifexists fullname */ +{ + sqlite3DropTable(pParse, yymsp[0].minor.yy185, 0, yymsp[-1].minor.yy194); +} + break; + case 77: /* cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select */ +{ + sqlite3CreateView(pParse, &yymsp[-8].minor.yy0, &yymsp[-4].minor.yy0, &yymsp[-3].minor.yy0, yymsp[-2].minor.yy148, yymsp[0].minor.yy243, yymsp[-7].minor.yy194, yymsp[-5].minor.yy194); +} + break; + case 78: /* cmd ::= DROP VIEW ifexists fullname */ +{ + sqlite3DropTable(pParse, yymsp[0].minor.yy185, 1, yymsp[-1].minor.yy194); +} + break; + case 79: /* cmd ::= select */ +{ + SelectDest dest = {SRT_Output, 0, 0, 0, 0, 0}; + sqlite3Select(pParse, yymsp[0].minor.yy243, &dest); + sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy243); +} + break; + case 80: /* select ::= with selectnowith */ +{ + Select *p = yymsp[0].minor.yy243; + if( p ){ + p->pWith = yymsp[-1].minor.yy285; + parserDoubleLinkSelect(pParse, p); + }else{ + sqlite3WithDelete(pParse->db, yymsp[-1].minor.yy285); + } + yymsp[-1].minor.yy243 = p; /*A-overwrites-W*/ +} + break; + case 81: /* selectnowith ::= selectnowith multiselect_op oneselect */ +{ + Select *pRhs = yymsp[0].minor.yy243; + Select *pLhs = yymsp[-2].minor.yy243; + if( pRhs && pRhs->pPrior ){ + SrcList *pFrom; + Token x; + x.n = 0; + parserDoubleLinkSelect(pParse, pRhs); + pFrom = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&x,pRhs,0,0); + pRhs = sqlite3SelectNew(pParse,0,pFrom,0,0,0,0,0,0,0); + } + if( pRhs ){ + pRhs->op = (u8)yymsp[-1].minor.yy194; + pRhs->pPrior = pLhs; + if( ALWAYS(pLhs) ) pLhs->selFlags &= ~SF_MultiValue; + pRhs->selFlags &= ~SF_MultiValue; + if( yymsp[-1].minor.yy194!=TK_ALL ) pParse->hasCompound = 1; + }else{ + sqlite3SelectDelete(pParse->db, pLhs); + } + yymsp[-2].minor.yy243 = pRhs; +} + break; + case 82: /* multiselect_op ::= UNION */ + case 84: /* multiselect_op ::= EXCEPT|INTERSECT */ yytestcase(yyruleno==84); +{yymsp[0].minor.yy194 = yymsp[0].major; /*A-overwrites-OP*/} + break; + case 83: /* multiselect_op ::= UNION ALL */ +{yymsp[-1].minor.yy194 = TK_ALL;} + break; + case 85: /* oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */ +{ +#if SELECTTRACE_ENABLED + Token s = yymsp[-8].minor.yy0; /*A-overwrites-S*/ +#endif + yymsp[-8].minor.yy243 = sqlite3SelectNew(pParse,yymsp[-6].minor.yy148,yymsp[-5].minor.yy185,yymsp[-4].minor.yy72,yymsp[-3].minor.yy148,yymsp[-2].minor.yy72,yymsp[-1].minor.yy148,yymsp[-7].minor.yy194,yymsp[0].minor.yy354.pLimit,yymsp[0].minor.yy354.pOffset); +#if SELECTTRACE_ENABLED + /* Populate the Select.zSelName[] string that is used to help with + ** query planner debugging, to differentiate between multiple Select + ** objects in a complex query. + ** + ** If the SELECT keyword is immediately followed by a C-style comment + ** then extract the first few alphanumeric characters from within that + ** comment to be the zSelName value. Otherwise, the label is #N where + ** is an integer that is incremented with each SELECT statement seen. + */ + if( yymsp[-8].minor.yy243!=0 ){ + const char *z = s.z+6; + int i; + sqlite3_snprintf(sizeof(yymsp[-8].minor.yy243->zSelName), yymsp[-8].minor.yy243->zSelName, "#%d", + ++pParse->nSelect); + while( z[0]==' ' ) z++; + if( z[0]=='/' && z[1]=='*' ){ + z += 2; + while( z[0]==' ' ) z++; + for(i=0; sqlite3Isalnum(z[i]); i++){} + sqlite3_snprintf(sizeof(yymsp[-8].minor.yy243->zSelName), yymsp[-8].minor.yy243->zSelName, "%.*s", i, z); + } + } +#endif /* SELECTRACE_ENABLED */ +} + break; + case 86: /* values ::= VALUES LP nexprlist RP */ +{ + yymsp[-3].minor.yy243 = sqlite3SelectNew(pParse,yymsp[-1].minor.yy148,0,0,0,0,0,SF_Values,0,0); +} + break; + case 87: /* values ::= values COMMA LP exprlist RP */ +{ + Select *pRight, *pLeft = yymsp[-4].minor.yy243; + pRight = sqlite3SelectNew(pParse,yymsp[-1].minor.yy148,0,0,0,0,0,SF_Values|SF_MultiValue,0,0); + if( ALWAYS(pLeft) ) pLeft->selFlags &= ~SF_MultiValue; + if( pRight ){ + pRight->op = TK_ALL; + pRight->pPrior = pLeft; + yymsp[-4].minor.yy243 = pRight; + }else{ + yymsp[-4].minor.yy243 = pLeft; + } +} + break; + case 88: /* distinct ::= DISTINCT */ +{yymsp[0].minor.yy194 = SF_Distinct;} + break; + case 89: /* distinct ::= ALL */ +{yymsp[0].minor.yy194 = SF_All;} + break; + case 91: /* sclp ::= */ + case 119: /* orderby_opt ::= */ yytestcase(yyruleno==119); + case 126: /* groupby_opt ::= */ yytestcase(yyruleno==126); + case 203: /* exprlist ::= */ yytestcase(yyruleno==203); + case 206: /* paren_exprlist ::= */ yytestcase(yyruleno==206); + case 211: /* eidlist_opt ::= */ yytestcase(yyruleno==211); +{yymsp[1].minor.yy148 = 0;} + break; + case 92: /* selcollist ::= sclp expr as */ +{ + yymsp[-2].minor.yy148 = sqlite3ExprListAppend(pParse, yymsp[-2].minor.yy148, yymsp[-1].minor.yy190.pExpr); + if( yymsp[0].minor.yy0.n>0 ) sqlite3ExprListSetName(pParse, yymsp[-2].minor.yy148, &yymsp[0].minor.yy0, 1); + sqlite3ExprListSetSpan(pParse,yymsp[-2].minor.yy148,&yymsp[-1].minor.yy190); +} + break; + case 93: /* selcollist ::= sclp STAR */ +{ + Expr *p = sqlite3Expr(pParse->db, TK_ASTERISK, 0); + yymsp[-1].minor.yy148 = sqlite3ExprListAppend(pParse, yymsp[-1].minor.yy148, p); +} + break; + case 94: /* selcollist ::= sclp nm DOT STAR */ +{ + Expr *pRight = sqlite3PExpr(pParse, TK_ASTERISK, 0, 0, 0); + Expr *pLeft = sqlite3PExpr(pParse, TK_ID, 0, 0, &yymsp[-2].minor.yy0); + Expr *pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight, 0); + yymsp[-3].minor.yy148 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy148, pDot); +} + break; + case 95: /* as ::= AS nm */ + case 106: /* dbnm ::= DOT nm */ yytestcase(yyruleno==106); + case 225: /* plus_num ::= PLUS INTEGER|FLOAT */ yytestcase(yyruleno==225); + case 226: /* minus_num ::= MINUS INTEGER|FLOAT */ yytestcase(yyruleno==226); +{yymsp[-1].minor.yy0 = yymsp[0].minor.yy0;} + break; + case 97: /* from ::= */ +{yymsp[1].minor.yy185 = sqlite3DbMallocZero(pParse->db, sizeof(*yymsp[1].minor.yy185));} + break; + case 98: /* from ::= FROM seltablist */ +{ + yymsp[-1].minor.yy185 = yymsp[0].minor.yy185; + sqlite3SrcListShiftJoinType(yymsp[-1].minor.yy185); +} + break; + case 99: /* stl_prefix ::= seltablist joinop */ +{ + if( ALWAYS(yymsp[-1].minor.yy185 && yymsp[-1].minor.yy185->nSrc>0) ) yymsp[-1].minor.yy185->a[yymsp[-1].minor.yy185->nSrc-1].fg.jointype = (u8)yymsp[0].minor.yy194; +} + break; + case 100: /* stl_prefix ::= */ +{yymsp[1].minor.yy185 = 0;} + break; + case 101: /* seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt */ +{ + yymsp[-6].minor.yy185 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy185,&yymsp[-5].minor.yy0,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,0,yymsp[-1].minor.yy72,yymsp[0].minor.yy254); + sqlite3SrcListIndexedBy(pParse, yymsp[-6].minor.yy185, &yymsp[-2].minor.yy0); +} + break; + case 102: /* seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt */ +{ + yymsp[-8].minor.yy185 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-8].minor.yy185,&yymsp[-7].minor.yy0,&yymsp[-6].minor.yy0,&yymsp[-2].minor.yy0,0,yymsp[-1].minor.yy72,yymsp[0].minor.yy254); + sqlite3SrcListFuncArgs(pParse, yymsp[-8].minor.yy185, yymsp[-4].minor.yy148); +} + break; + case 103: /* seltablist ::= stl_prefix LP select RP as on_opt using_opt */ +{ + yymsp[-6].minor.yy185 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy185,0,0,&yymsp[-2].minor.yy0,yymsp[-4].minor.yy243,yymsp[-1].minor.yy72,yymsp[0].minor.yy254); + } + break; + case 104: /* seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt */ +{ + if( yymsp[-6].minor.yy185==0 && yymsp[-2].minor.yy0.n==0 && yymsp[-1].minor.yy72==0 && yymsp[0].minor.yy254==0 ){ + yymsp[-6].minor.yy185 = yymsp[-4].minor.yy185; + }else if( yymsp[-4].minor.yy185->nSrc==1 ){ + yymsp[-6].minor.yy185 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy185,0,0,&yymsp[-2].minor.yy0,0,yymsp[-1].minor.yy72,yymsp[0].minor.yy254); + if( yymsp[-6].minor.yy185 ){ + struct SrcList_item *pNew = &yymsp[-6].minor.yy185->a[yymsp[-6].minor.yy185->nSrc-1]; + struct SrcList_item *pOld = yymsp[-4].minor.yy185->a; + pNew->zName = pOld->zName; + pNew->zDatabase = pOld->zDatabase; + pNew->pSelect = pOld->pSelect; + pOld->zName = pOld->zDatabase = 0; + pOld->pSelect = 0; + } + sqlite3SrcListDelete(pParse->db, yymsp[-4].minor.yy185); + }else{ + Select *pSubquery; + sqlite3SrcListShiftJoinType(yymsp[-4].minor.yy185); + pSubquery = sqlite3SelectNew(pParse,0,yymsp[-4].minor.yy185,0,0,0,0,SF_NestedFrom,0,0); + yymsp[-6].minor.yy185 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy185,0,0,&yymsp[-2].minor.yy0,pSubquery,yymsp[-1].minor.yy72,yymsp[0].minor.yy254); + } + } + break; + case 105: /* dbnm ::= */ + case 114: /* indexed_opt ::= */ yytestcase(yyruleno==114); +{yymsp[1].minor.yy0.z=0; yymsp[1].minor.yy0.n=0;} + break; + case 107: /* fullname ::= nm dbnm */ +{yymsp[-1].minor.yy185 = sqlite3SrcListAppend(pParse->db,0,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-X*/} + break; + case 108: /* joinop ::= COMMA|JOIN */ +{ yymsp[0].minor.yy194 = JT_INNER; } + break; + case 109: /* joinop ::= JOIN_KW JOIN */ +{yymsp[-1].minor.yy194 = sqlite3JoinType(pParse,&yymsp[-1].minor.yy0,0,0); /*X-overwrites-A*/} + break; + case 110: /* joinop ::= JOIN_KW nm JOIN */ +{yymsp[-2].minor.yy194 = sqlite3JoinType(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,0); /*X-overwrites-A*/} + break; + case 111: /* joinop ::= JOIN_KW nm nm JOIN */ +{yymsp[-3].minor.yy194 = sqlite3JoinType(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0);/*X-overwrites-A*/} + break; + case 112: /* on_opt ::= ON expr */ + case 129: /* having_opt ::= HAVING expr */ yytestcase(yyruleno==129); + case 136: /* where_opt ::= WHERE expr */ yytestcase(yyruleno==136); + case 199: /* case_else ::= ELSE expr */ yytestcase(yyruleno==199); +{yymsp[-1].minor.yy72 = yymsp[0].minor.yy190.pExpr;} + break; + case 113: /* on_opt ::= */ + case 128: /* having_opt ::= */ yytestcase(yyruleno==128); + case 135: /* where_opt ::= */ yytestcase(yyruleno==135); + case 200: /* case_else ::= */ yytestcase(yyruleno==200); + case 202: /* case_operand ::= */ yytestcase(yyruleno==202); +{yymsp[1].minor.yy72 = 0;} + break; + case 115: /* indexed_opt ::= INDEXED BY nm */ +{yymsp[-2].minor.yy0 = yymsp[0].minor.yy0;} + break; + case 116: /* indexed_opt ::= NOT INDEXED */ +{yymsp[-1].minor.yy0.z=0; yymsp[-1].minor.yy0.n=1;} + break; + case 117: /* using_opt ::= USING LP idlist RP */ +{yymsp[-3].minor.yy254 = yymsp[-1].minor.yy254;} + break; + case 118: /* using_opt ::= */ + case 146: /* idlist_opt ::= */ yytestcase(yyruleno==146); +{yymsp[1].minor.yy254 = 0;} + break; + case 120: /* orderby_opt ::= ORDER BY sortlist */ + case 127: /* groupby_opt ::= GROUP BY nexprlist */ yytestcase(yyruleno==127); +{yymsp[-2].minor.yy148 = yymsp[0].minor.yy148;} + break; + case 121: /* sortlist ::= sortlist COMMA expr sortorder */ +{ + yymsp[-3].minor.yy148 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy148,yymsp[-1].minor.yy190.pExpr); + sqlite3ExprListSetSortOrder(yymsp[-3].minor.yy148,yymsp[0].minor.yy194); +} + break; + case 122: /* sortlist ::= expr sortorder */ +{ + yymsp[-1].minor.yy148 = sqlite3ExprListAppend(pParse,0,yymsp[-1].minor.yy190.pExpr); /*A-overwrites-Y*/ + sqlite3ExprListSetSortOrder(yymsp[-1].minor.yy148,yymsp[0].minor.yy194); +} + break; + case 123: /* sortorder ::= ASC */ +{yymsp[0].minor.yy194 = SQLITE_SO_ASC;} + break; + case 124: /* sortorder ::= DESC */ +{yymsp[0].minor.yy194 = SQLITE_SO_DESC;} + break; + case 125: /* sortorder ::= */ +{yymsp[1].minor.yy194 = SQLITE_SO_UNDEFINED;} + break; + case 130: /* limit_opt ::= */ +{yymsp[1].minor.yy354.pLimit = 0; yymsp[1].minor.yy354.pOffset = 0;} + break; + case 131: /* limit_opt ::= LIMIT expr */ +{yymsp[-1].minor.yy354.pLimit = yymsp[0].minor.yy190.pExpr; yymsp[-1].minor.yy354.pOffset = 0;} + break; + case 132: /* limit_opt ::= LIMIT expr OFFSET expr */ +{yymsp[-3].minor.yy354.pLimit = yymsp[-2].minor.yy190.pExpr; yymsp[-3].minor.yy354.pOffset = yymsp[0].minor.yy190.pExpr;} + break; + case 133: /* limit_opt ::= LIMIT expr COMMA expr */ +{yymsp[-3].minor.yy354.pOffset = yymsp[-2].minor.yy190.pExpr; yymsp[-3].minor.yy354.pLimit = yymsp[0].minor.yy190.pExpr;} + break; + case 134: /* cmd ::= with DELETE FROM fullname indexed_opt where_opt */ +{ + sqlite3WithPush(pParse, yymsp[-5].minor.yy285, 1); + sqlite3SrcListIndexedBy(pParse, yymsp[-2].minor.yy185, &yymsp[-1].minor.yy0); + sqlite3DeleteFrom(pParse,yymsp[-2].minor.yy185,yymsp[0].minor.yy72); +} + break; + case 137: /* cmd ::= with UPDATE orconf fullname indexed_opt SET setlist where_opt */ +{ + sqlite3WithPush(pParse, yymsp[-7].minor.yy285, 1); + sqlite3SrcListIndexedBy(pParse, yymsp[-4].minor.yy185, &yymsp[-3].minor.yy0); + sqlite3ExprListCheckLength(pParse,yymsp[-1].minor.yy148,"set list"); + sqlite3Update(pParse,yymsp[-4].minor.yy185,yymsp[-1].minor.yy148,yymsp[0].minor.yy72,yymsp[-5].minor.yy194); +} + break; + case 138: /* setlist ::= setlist COMMA nm EQ expr */ +{ + yymsp[-4].minor.yy148 = sqlite3ExprListAppend(pParse, yymsp[-4].minor.yy148, yymsp[0].minor.yy190.pExpr); + sqlite3ExprListSetName(pParse, yymsp[-4].minor.yy148, &yymsp[-2].minor.yy0, 1); +} + break; + case 139: /* setlist ::= setlist COMMA LP idlist RP EQ expr */ +{ + yymsp[-6].minor.yy148 = sqlite3ExprListAppendVector(pParse, yymsp[-6].minor.yy148, yymsp[-3].minor.yy254, yymsp[0].minor.yy190.pExpr); +} + break; + case 140: /* setlist ::= nm EQ expr */ +{ + yylhsminor.yy148 = sqlite3ExprListAppend(pParse, 0, yymsp[0].minor.yy190.pExpr); + sqlite3ExprListSetName(pParse, yylhsminor.yy148, &yymsp[-2].minor.yy0, 1); +} + yymsp[-2].minor.yy148 = yylhsminor.yy148; + break; + case 141: /* setlist ::= LP idlist RP EQ expr */ +{ + yymsp[-4].minor.yy148 = sqlite3ExprListAppendVector(pParse, 0, yymsp[-3].minor.yy254, yymsp[0].minor.yy190.pExpr); +} + break; + case 142: /* cmd ::= with insert_cmd INTO fullname idlist_opt select */ +{ + sqlite3WithPush(pParse, yymsp[-5].minor.yy285, 1); + sqlite3Insert(pParse, yymsp[-2].minor.yy185, yymsp[0].minor.yy243, yymsp[-1].minor.yy254, yymsp[-4].minor.yy194); +} + break; + case 143: /* cmd ::= with insert_cmd INTO fullname idlist_opt DEFAULT VALUES */ +{ + sqlite3WithPush(pParse, yymsp[-6].minor.yy285, 1); + sqlite3Insert(pParse, yymsp[-3].minor.yy185, 0, yymsp[-2].minor.yy254, yymsp[-5].minor.yy194); +} + break; + case 147: /* idlist_opt ::= LP idlist RP */ +{yymsp[-2].minor.yy254 = yymsp[-1].minor.yy254;} + break; + case 148: /* idlist ::= idlist COMMA nm */ +{yymsp[-2].minor.yy254 = sqlite3IdListAppend(pParse->db,yymsp[-2].minor.yy254,&yymsp[0].minor.yy0);} + break; + case 149: /* idlist ::= nm */ +{yymsp[0].minor.yy254 = sqlite3IdListAppend(pParse->db,0,&yymsp[0].minor.yy0); /*A-overwrites-Y*/} + break; + case 150: /* expr ::= LP expr RP */ +{spanSet(&yymsp[-2].minor.yy190,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-B*/ yymsp[-2].minor.yy190.pExpr = yymsp[-1].minor.yy190.pExpr;} + break; + case 151: /* term ::= NULL */ + case 156: /* term ::= FLOAT|BLOB */ yytestcase(yyruleno==156); + case 157: /* term ::= STRING */ yytestcase(yyruleno==157); +{spanExpr(&yymsp[0].minor.yy190,pParse,yymsp[0].major,yymsp[0].minor.yy0);/*A-overwrites-X*/} + break; + case 152: /* expr ::= ID|INDEXED */ + case 153: /* expr ::= JOIN_KW */ yytestcase(yyruleno==153); +{spanExpr(&yymsp[0].minor.yy190,pParse,TK_ID,yymsp[0].minor.yy0); /*A-overwrites-X*/} + break; + case 154: /* expr ::= nm DOT nm */ +{ + Expr *temp1 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[-2].minor.yy0, 1); + Expr *temp2 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[0].minor.yy0, 1); + spanSet(&yymsp[-2].minor.yy190,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-X*/ + yymsp[-2].minor.yy190.pExpr = sqlite3PExpr(pParse, TK_DOT, temp1, temp2, 0); +} + break; + case 155: /* expr ::= nm DOT nm DOT nm */ +{ + Expr *temp1 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[-4].minor.yy0, 1); + Expr *temp2 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[-2].minor.yy0, 1); + Expr *temp3 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[0].minor.yy0, 1); + Expr *temp4 = sqlite3PExpr(pParse, TK_DOT, temp2, temp3, 0); + spanSet(&yymsp[-4].minor.yy190,&yymsp[-4].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-X*/ + yymsp[-4].minor.yy190.pExpr = sqlite3PExpr(pParse, TK_DOT, temp1, temp4, 0); +} + break; + case 158: /* term ::= INTEGER */ +{ + yylhsminor.yy190.pExpr = sqlite3ExprAlloc(pParse->db, TK_INTEGER, &yymsp[0].minor.yy0, 1); + yylhsminor.yy190.zStart = yymsp[0].minor.yy0.z; + yylhsminor.yy190.zEnd = yymsp[0].minor.yy0.z + yymsp[0].minor.yy0.n; + if( yylhsminor.yy190.pExpr ) yylhsminor.yy190.pExpr->flags |= EP_Leaf; +} + yymsp[0].minor.yy190 = yylhsminor.yy190; + break; + case 159: /* expr ::= VARIABLE */ +{ + if( !(yymsp[0].minor.yy0.z[0]=='#' && sqlite3Isdigit(yymsp[0].minor.yy0.z[1])) ){ + u32 n = yymsp[0].minor.yy0.n; + spanExpr(&yymsp[0].minor.yy190, pParse, TK_VARIABLE, yymsp[0].minor.yy0); + sqlite3ExprAssignVarNumber(pParse, yymsp[0].minor.yy190.pExpr, n); + }else{ + /* When doing a nested parse, one can include terms in an expression + ** that look like this: #1 #2 ... These terms refer to registers + ** in the virtual machine. #N is the N-th register. */ + Token t = yymsp[0].minor.yy0; /*A-overwrites-X*/ + assert( t.n>=2 ); + spanSet(&yymsp[0].minor.yy190, &t, &t); + if( pParse->nested==0 ){ + sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &t); + yymsp[0].minor.yy190.pExpr = 0; + }else{ + yymsp[0].minor.yy190.pExpr = sqlite3PExpr(pParse, TK_REGISTER, 0, 0, 0); + if( yymsp[0].minor.yy190.pExpr ) sqlite3GetInt32(&t.z[1], &yymsp[0].minor.yy190.pExpr->iTable); + } + } +} + break; + case 160: /* expr ::= expr COLLATE ID|STRING */ +{ + yymsp[-2].minor.yy190.pExpr = sqlite3ExprAddCollateToken(pParse, yymsp[-2].minor.yy190.pExpr, &yymsp[0].minor.yy0, 1); + yymsp[-2].minor.yy190.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n]; +} + break; + case 161: /* expr ::= CAST LP expr AS typetoken RP */ +{ + spanSet(&yymsp[-5].minor.yy190,&yymsp[-5].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-X*/ + yymsp[-5].minor.yy190.pExpr = sqlite3PExpr(pParse, TK_CAST, yymsp[-3].minor.yy190.pExpr, 0, &yymsp[-1].minor.yy0); +} + break; + case 162: /* expr ::= ID|INDEXED LP distinct exprlist RP */ +{ + if( yymsp[-1].minor.yy148 && yymsp[-1].minor.yy148->nExpr>pParse->db->aLimit[SQLITE_LIMIT_FUNCTION_ARG] ){ + sqlite3ErrorMsg(pParse, "too many arguments on function %T", &yymsp[-4].minor.yy0); + } + yylhsminor.yy190.pExpr = sqlite3ExprFunction(pParse, yymsp[-1].minor.yy148, &yymsp[-4].minor.yy0); + spanSet(&yylhsminor.yy190,&yymsp[-4].minor.yy0,&yymsp[0].minor.yy0); + if( yymsp[-2].minor.yy194==SF_Distinct && yylhsminor.yy190.pExpr ){ + yylhsminor.yy190.pExpr->flags |= EP_Distinct; + } +} + yymsp[-4].minor.yy190 = yylhsminor.yy190; + break; + case 163: /* expr ::= ID|INDEXED LP STAR RP */ +{ + yylhsminor.yy190.pExpr = sqlite3ExprFunction(pParse, 0, &yymsp[-3].minor.yy0); + spanSet(&yylhsminor.yy190,&yymsp[-3].minor.yy0,&yymsp[0].minor.yy0); +} + yymsp[-3].minor.yy190 = yylhsminor.yy190; + break; + case 164: /* term ::= CTIME_KW */ +{ + yylhsminor.yy190.pExpr = sqlite3ExprFunction(pParse, 0, &yymsp[0].minor.yy0); + spanSet(&yylhsminor.yy190, &yymsp[0].minor.yy0, &yymsp[0].minor.yy0); +} + yymsp[0].minor.yy190 = yylhsminor.yy190; + break; + case 165: /* expr ::= LP nexprlist COMMA expr RP */ +{ + ExprList *pList = sqlite3ExprListAppend(pParse, yymsp[-3].minor.yy148, yymsp[-1].minor.yy190.pExpr); + yylhsminor.yy190.pExpr = sqlite3PExpr(pParse, TK_VECTOR, 0, 0, 0); + if( yylhsminor.yy190.pExpr ){ + yylhsminor.yy190.pExpr->x.pList = pList; + spanSet(&yylhsminor.yy190, &yymsp[-4].minor.yy0, &yymsp[0].minor.yy0); + }else{ + sqlite3ExprListDelete(pParse->db, pList); + } +} + yymsp[-4].minor.yy190 = yylhsminor.yy190; + break; + case 166: /* expr ::= expr AND expr */ + case 167: /* expr ::= expr OR expr */ yytestcase(yyruleno==167); + case 168: /* expr ::= expr LT|GT|GE|LE expr */ yytestcase(yyruleno==168); + case 169: /* expr ::= expr EQ|NE expr */ yytestcase(yyruleno==169); + case 170: /* expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */ yytestcase(yyruleno==170); + case 171: /* expr ::= expr PLUS|MINUS expr */ yytestcase(yyruleno==171); + case 172: /* expr ::= expr STAR|SLASH|REM expr */ yytestcase(yyruleno==172); + case 173: /* expr ::= expr CONCAT expr */ yytestcase(yyruleno==173); +{spanBinaryExpr(pParse,yymsp[-1].major,&yymsp[-2].minor.yy190,&yymsp[0].minor.yy190);} + break; + case 174: /* likeop ::= LIKE_KW|MATCH */ +{yymsp[0].minor.yy0=yymsp[0].minor.yy0;/*A-overwrites-X*/} + break; + case 175: /* likeop ::= NOT LIKE_KW|MATCH */ +{yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.n|=0x80000000; /*yymsp[-1].minor.yy0-overwrite-yymsp[0].minor.yy0*/} + break; + case 176: /* expr ::= expr likeop expr */ +{ + ExprList *pList; + int bNot = yymsp[-1].minor.yy0.n & 0x80000000; + yymsp[-1].minor.yy0.n &= 0x7fffffff; + pList = sqlite3ExprListAppend(pParse,0, yymsp[0].minor.yy190.pExpr); + pList = sqlite3ExprListAppend(pParse,pList, yymsp[-2].minor.yy190.pExpr); + yymsp[-2].minor.yy190.pExpr = sqlite3ExprFunction(pParse, pList, &yymsp[-1].minor.yy0); + exprNot(pParse, bNot, &yymsp[-2].minor.yy190); + yymsp[-2].minor.yy190.zEnd = yymsp[0].minor.yy190.zEnd; + if( yymsp[-2].minor.yy190.pExpr ) yymsp[-2].minor.yy190.pExpr->flags |= EP_InfixFunc; +} + break; + case 177: /* expr ::= expr likeop expr ESCAPE expr */ +{ + ExprList *pList; + int bNot = yymsp[-3].minor.yy0.n & 0x80000000; + yymsp[-3].minor.yy0.n &= 0x7fffffff; + pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy190.pExpr); + pList = sqlite3ExprListAppend(pParse,pList, yymsp[-4].minor.yy190.pExpr); + pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy190.pExpr); + yymsp[-4].minor.yy190.pExpr = sqlite3ExprFunction(pParse, pList, &yymsp[-3].minor.yy0); + exprNot(pParse, bNot, &yymsp[-4].minor.yy190); + yymsp[-4].minor.yy190.zEnd = yymsp[0].minor.yy190.zEnd; + if( yymsp[-4].minor.yy190.pExpr ) yymsp[-4].minor.yy190.pExpr->flags |= EP_InfixFunc; +} + break; + case 178: /* expr ::= expr ISNULL|NOTNULL */ +{spanUnaryPostfix(pParse,yymsp[0].major,&yymsp[-1].minor.yy190,&yymsp[0].minor.yy0);} + break; + case 179: /* expr ::= expr NOT NULL */ +{spanUnaryPostfix(pParse,TK_NOTNULL,&yymsp[-2].minor.yy190,&yymsp[0].minor.yy0);} + break; + case 180: /* expr ::= expr IS expr */ +{ + spanBinaryExpr(pParse,TK_IS,&yymsp[-2].minor.yy190,&yymsp[0].minor.yy190); + binaryToUnaryIfNull(pParse, yymsp[0].minor.yy190.pExpr, yymsp[-2].minor.yy190.pExpr, TK_ISNULL); +} + break; + case 181: /* expr ::= expr IS NOT expr */ +{ + spanBinaryExpr(pParse,TK_ISNOT,&yymsp[-3].minor.yy190,&yymsp[0].minor.yy190); + binaryToUnaryIfNull(pParse, yymsp[0].minor.yy190.pExpr, yymsp[-3].minor.yy190.pExpr, TK_NOTNULL); +} + break; + case 182: /* expr ::= NOT expr */ + case 183: /* expr ::= BITNOT expr */ yytestcase(yyruleno==183); +{spanUnaryPrefix(&yymsp[-1].minor.yy190,pParse,yymsp[-1].major,&yymsp[0].minor.yy190,&yymsp[-1].minor.yy0);/*A-overwrites-B*/} + break; + case 184: /* expr ::= MINUS expr */ +{spanUnaryPrefix(&yymsp[-1].minor.yy190,pParse,TK_UMINUS,&yymsp[0].minor.yy190,&yymsp[-1].minor.yy0);/*A-overwrites-B*/} + break; + case 185: /* expr ::= PLUS expr */ +{spanUnaryPrefix(&yymsp[-1].minor.yy190,pParse,TK_UPLUS,&yymsp[0].minor.yy190,&yymsp[-1].minor.yy0);/*A-overwrites-B*/} + break; + case 186: /* between_op ::= BETWEEN */ + case 189: /* in_op ::= IN */ yytestcase(yyruleno==189); +{yymsp[0].minor.yy194 = 0;} + break; + case 188: /* expr ::= expr between_op expr AND expr */ +{ + ExprList *pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy190.pExpr); + pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy190.pExpr); + yymsp[-4].minor.yy190.pExpr = sqlite3PExpr(pParse, TK_BETWEEN, yymsp[-4].minor.yy190.pExpr, 0, 0); + if( yymsp[-4].minor.yy190.pExpr ){ + yymsp[-4].minor.yy190.pExpr->x.pList = pList; + }else{ + sqlite3ExprListDelete(pParse->db, pList); + } + exprNot(pParse, yymsp[-3].minor.yy194, &yymsp[-4].minor.yy190); + yymsp[-4].minor.yy190.zEnd = yymsp[0].minor.yy190.zEnd; +} + break; + case 191: /* expr ::= expr in_op LP exprlist RP */ +{ + if( yymsp[-1].minor.yy148==0 ){ + /* Expressions of the form + ** + ** expr1 IN () + ** expr1 NOT IN () + ** + ** simplify to constants 0 (false) and 1 (true), respectively, + ** regardless of the value of expr1. + */ + sqlite3ExprDelete(pParse->db, yymsp[-4].minor.yy190.pExpr); + yymsp[-4].minor.yy190.pExpr = sqlite3PExpr(pParse, TK_INTEGER, 0, 0, &sqlite3IntTokens[yymsp[-3].minor.yy194]); + }else if( yymsp[-1].minor.yy148->nExpr==1 ){ + /* Expressions of the form: + ** + ** expr1 IN (?1) + ** expr1 NOT IN (?2) + ** + ** with exactly one value on the RHS can be simplified to something + ** like this: + ** + ** expr1 == ?1 + ** expr1 <> ?2 + ** + ** But, the RHS of the == or <> is marked with the EP_Generic flag + ** so that it may not contribute to the computation of comparison + ** affinity or the collating sequence to use for comparison. Otherwise, + ** the semantics would be subtly different from IN or NOT IN. + */ + Expr *pRHS = yymsp[-1].minor.yy148->a[0].pExpr; + yymsp[-1].minor.yy148->a[0].pExpr = 0; + sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy148); + /* pRHS cannot be NULL because a malloc error would have been detected + ** before now and control would have never reached this point */ + if( ALWAYS(pRHS) ){ + pRHS->flags &= ~EP_Collate; + pRHS->flags |= EP_Generic; + } + yymsp[-4].minor.yy190.pExpr = sqlite3PExpr(pParse, yymsp[-3].minor.yy194 ? TK_NE : TK_EQ, yymsp[-4].minor.yy190.pExpr, pRHS, 0); + }else{ + yymsp[-4].minor.yy190.pExpr = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy190.pExpr, 0, 0); + if( yymsp[-4].minor.yy190.pExpr ){ + yymsp[-4].minor.yy190.pExpr->x.pList = yymsp[-1].minor.yy148; + sqlite3ExprSetHeightAndFlags(pParse, yymsp[-4].minor.yy190.pExpr); + }else{ + sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy148); + } + exprNot(pParse, yymsp[-3].minor.yy194, &yymsp[-4].minor.yy190); + } + yymsp[-4].minor.yy190.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n]; + } + break; + case 192: /* expr ::= LP select RP */ +{ + spanSet(&yymsp[-2].minor.yy190,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-B*/ + yymsp[-2].minor.yy190.pExpr = sqlite3PExpr(pParse, TK_SELECT, 0, 0, 0); + sqlite3PExprAddSelect(pParse, yymsp[-2].minor.yy190.pExpr, yymsp[-1].minor.yy243); + } + break; + case 193: /* expr ::= expr in_op LP select RP */ +{ + yymsp[-4].minor.yy190.pExpr = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy190.pExpr, 0, 0); + sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy190.pExpr, yymsp[-1].minor.yy243); + exprNot(pParse, yymsp[-3].minor.yy194, &yymsp[-4].minor.yy190); + yymsp[-4].minor.yy190.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n]; + } + break; + case 194: /* expr ::= expr in_op nm dbnm paren_exprlist */ +{ + SrcList *pSrc = sqlite3SrcListAppend(pParse->db, 0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0); + Select *pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0,0); + if( yymsp[0].minor.yy148 ) sqlite3SrcListFuncArgs(pParse, pSelect ? pSrc : 0, yymsp[0].minor.yy148); + yymsp[-4].minor.yy190.pExpr = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy190.pExpr, 0, 0); + sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy190.pExpr, pSelect); + exprNot(pParse, yymsp[-3].minor.yy194, &yymsp[-4].minor.yy190); + yymsp[-4].minor.yy190.zEnd = yymsp[-1].minor.yy0.z ? &yymsp[-1].minor.yy0.z[yymsp[-1].minor.yy0.n] : &yymsp[-2].minor.yy0.z[yymsp[-2].minor.yy0.n]; + } + break; + case 195: /* expr ::= EXISTS LP select RP */ +{ + Expr *p; + spanSet(&yymsp[-3].minor.yy190,&yymsp[-3].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-B*/ + p = yymsp[-3].minor.yy190.pExpr = sqlite3PExpr(pParse, TK_EXISTS, 0, 0, 0); + sqlite3PExprAddSelect(pParse, p, yymsp[-1].minor.yy243); + } + break; + case 196: /* expr ::= CASE case_operand case_exprlist case_else END */ +{ + spanSet(&yymsp[-4].minor.yy190,&yymsp[-4].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-C*/ + yymsp[-4].minor.yy190.pExpr = sqlite3PExpr(pParse, TK_CASE, yymsp[-3].minor.yy72, 0, 0); + if( yymsp[-4].minor.yy190.pExpr ){ + yymsp[-4].minor.yy190.pExpr->x.pList = yymsp[-1].minor.yy72 ? sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy148,yymsp[-1].minor.yy72) : yymsp[-2].minor.yy148; + sqlite3ExprSetHeightAndFlags(pParse, yymsp[-4].minor.yy190.pExpr); + }else{ + sqlite3ExprListDelete(pParse->db, yymsp[-2].minor.yy148); + sqlite3ExprDelete(pParse->db, yymsp[-1].minor.yy72); + } +} + break; + case 197: /* case_exprlist ::= case_exprlist WHEN expr THEN expr */ +{ + yymsp[-4].minor.yy148 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy148, yymsp[-2].minor.yy190.pExpr); + yymsp[-4].minor.yy148 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy148, yymsp[0].minor.yy190.pExpr); +} + break; + case 198: /* case_exprlist ::= WHEN expr THEN expr */ +{ + yymsp[-3].minor.yy148 = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy190.pExpr); + yymsp[-3].minor.yy148 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy148, yymsp[0].minor.yy190.pExpr); +} + break; + case 201: /* case_operand ::= expr */ +{yymsp[0].minor.yy72 = yymsp[0].minor.yy190.pExpr; /*A-overwrites-X*/} + break; + case 204: /* nexprlist ::= nexprlist COMMA expr */ +{yymsp[-2].minor.yy148 = sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy148,yymsp[0].minor.yy190.pExpr);} + break; + case 205: /* nexprlist ::= expr */ +{yymsp[0].minor.yy148 = sqlite3ExprListAppend(pParse,0,yymsp[0].minor.yy190.pExpr); /*A-overwrites-Y*/} + break; + case 207: /* paren_exprlist ::= LP exprlist RP */ + case 212: /* eidlist_opt ::= LP eidlist RP */ yytestcase(yyruleno==212); +{yymsp[-2].minor.yy148 = yymsp[-1].minor.yy148;} + break; + case 208: /* cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */ +{ + sqlite3CreateIndex(pParse, &yymsp[-7].minor.yy0, &yymsp[-6].minor.yy0, + sqlite3SrcListAppend(pParse->db,0,&yymsp[-4].minor.yy0,0), yymsp[-2].minor.yy148, yymsp[-10].minor.yy194, + &yymsp[-11].minor.yy0, yymsp[0].minor.yy72, SQLITE_SO_ASC, yymsp[-8].minor.yy194, SQLITE_IDXTYPE_APPDEF); +} + break; + case 209: /* uniqueflag ::= UNIQUE */ + case 250: /* raisetype ::= ABORT */ yytestcase(yyruleno==250); +{yymsp[0].minor.yy194 = OE_Abort;} + break; + case 210: /* uniqueflag ::= */ +{yymsp[1].minor.yy194 = OE_None;} + break; + case 213: /* eidlist ::= eidlist COMMA nm collate sortorder */ +{ + yymsp[-4].minor.yy148 = parserAddExprIdListTerm(pParse, yymsp[-4].minor.yy148, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy194, yymsp[0].minor.yy194); +} + break; + case 214: /* eidlist ::= nm collate sortorder */ +{ + yymsp[-2].minor.yy148 = parserAddExprIdListTerm(pParse, 0, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy194, yymsp[0].minor.yy194); /*A-overwrites-Y*/ +} + break; + case 217: /* cmd ::= DROP INDEX ifexists fullname */ +{sqlite3DropIndex(pParse, yymsp[0].minor.yy185, yymsp[-1].minor.yy194);} + break; + case 218: /* cmd ::= VACUUM */ +{sqlite3Vacuum(pParse,0);} + break; + case 219: /* cmd ::= VACUUM nm */ +{sqlite3Vacuum(pParse,&yymsp[0].minor.yy0);} + break; + case 220: /* cmd ::= PRAGMA nm dbnm */ +{sqlite3Pragma(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0,0,0);} + break; + case 221: /* cmd ::= PRAGMA nm dbnm EQ nmnum */ +{sqlite3Pragma(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0,0);} + break; + case 222: /* cmd ::= PRAGMA nm dbnm LP nmnum RP */ +{sqlite3Pragma(pParse,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,&yymsp[-1].minor.yy0,0);} + break; + case 223: /* cmd ::= PRAGMA nm dbnm EQ minus_num */ +{sqlite3Pragma(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0,1);} + break; + case 224: /* 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 227: /* cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ +{ + Token all; + all.z = yymsp[-3].minor.yy0.z; + all.n = (int)(yymsp[0].minor.yy0.z - yymsp[-3].minor.yy0.z) + yymsp[0].minor.yy0.n; + sqlite3FinishTrigger(pParse, yymsp[-1].minor.yy145, &all); +} + break; + case 228: /* 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.yy194, yymsp[-4].minor.yy332.a, yymsp[-4].minor.yy332.b, yymsp[-2].minor.yy185, yymsp[0].minor.yy72, yymsp[-10].minor.yy194, yymsp[-8].minor.yy194); + yymsp[-10].minor.yy0 = (yymsp[-6].minor.yy0.n==0?yymsp[-7].minor.yy0:yymsp[-6].minor.yy0); /*A-overwrites-T*/ +} + break; + case 229: /* trigger_time ::= BEFORE */ +{ yymsp[0].minor.yy194 = TK_BEFORE; } + break; + case 230: /* trigger_time ::= AFTER */ +{ yymsp[0].minor.yy194 = TK_AFTER; } + break; + case 231: /* trigger_time ::= INSTEAD OF */ +{ yymsp[-1].minor.yy194 = TK_INSTEAD;} + break; + case 232: /* trigger_time ::= */ +{ yymsp[1].minor.yy194 = TK_BEFORE; } + break; + case 233: /* trigger_event ::= DELETE|INSERT */ + case 234: /* trigger_event ::= UPDATE */ yytestcase(yyruleno==234); +{yymsp[0].minor.yy332.a = yymsp[0].major; /*A-overwrites-X*/ yymsp[0].minor.yy332.b = 0;} + break; + case 235: /* trigger_event ::= UPDATE OF idlist */ +{yymsp[-2].minor.yy332.a = TK_UPDATE; yymsp[-2].minor.yy332.b = yymsp[0].minor.yy254;} + break; + case 236: /* when_clause ::= */ + case 255: /* key_opt ::= */ yytestcase(yyruleno==255); +{ yymsp[1].minor.yy72 = 0; } + break; + case 237: /* when_clause ::= WHEN expr */ + case 256: /* key_opt ::= KEY expr */ yytestcase(yyruleno==256); +{ yymsp[-1].minor.yy72 = yymsp[0].minor.yy190.pExpr; } + break; + case 238: /* trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ +{ + assert( yymsp[-2].minor.yy145!=0 ); + yymsp[-2].minor.yy145->pLast->pNext = yymsp[-1].minor.yy145; + yymsp[-2].minor.yy145->pLast = yymsp[-1].minor.yy145; +} + break; + case 239: /* trigger_cmd_list ::= trigger_cmd SEMI */ +{ + assert( yymsp[-1].minor.yy145!=0 ); + yymsp[-1].minor.yy145->pLast = yymsp[-1].minor.yy145; +} + break; + case 240: /* trnm ::= nm DOT nm */ +{ + yymsp[-2].minor.yy0 = yymsp[0].minor.yy0; + sqlite3ErrorMsg(pParse, + "qualified table names are not allowed on INSERT, UPDATE, and DELETE " + "statements within triggers"); +} + break; + case 241: /* tridxby ::= INDEXED BY nm */ +{ + sqlite3ErrorMsg(pParse, + "the INDEXED BY clause is not allowed on UPDATE or DELETE statements " + "within triggers"); +} + break; + case 242: /* tridxby ::= NOT INDEXED */ +{ + sqlite3ErrorMsg(pParse, + "the NOT INDEXED clause is not allowed on UPDATE or DELETE statements " + "within triggers"); +} + break; + case 243: /* trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt */ +{yymsp[-6].minor.yy145 = sqlite3TriggerUpdateStep(pParse->db, &yymsp[-4].minor.yy0, yymsp[-1].minor.yy148, yymsp[0].minor.yy72, yymsp[-5].minor.yy194);} + break; + case 244: /* trigger_cmd ::= insert_cmd INTO trnm idlist_opt select */ +{yymsp[-4].minor.yy145 = sqlite3TriggerInsertStep(pParse->db, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy254, yymsp[0].minor.yy243, yymsp[-4].minor.yy194);/*A-overwrites-R*/} + break; + case 245: /* trigger_cmd ::= DELETE FROM trnm tridxby where_opt */ +{yymsp[-4].minor.yy145 = sqlite3TriggerDeleteStep(pParse->db, &yymsp[-2].minor.yy0, yymsp[0].minor.yy72);} + break; + case 246: /* trigger_cmd ::= select */ +{yymsp[0].minor.yy145 = sqlite3TriggerSelectStep(pParse->db, yymsp[0].minor.yy243); /*A-overwrites-X*/} + break; + case 247: /* expr ::= RAISE LP IGNORE RP */ +{ + spanSet(&yymsp[-3].minor.yy190,&yymsp[-3].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-X*/ + yymsp[-3].minor.yy190.pExpr = sqlite3PExpr(pParse, TK_RAISE, 0, 0, 0); + if( yymsp[-3].minor.yy190.pExpr ){ + yymsp[-3].minor.yy190.pExpr->affinity = OE_Ignore; + } +} + break; + case 248: /* expr ::= RAISE LP raisetype COMMA nm RP */ +{ + spanSet(&yymsp[-5].minor.yy190,&yymsp[-5].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-X*/ + yymsp[-5].minor.yy190.pExpr = sqlite3PExpr(pParse, TK_RAISE, 0, 0, &yymsp[-1].minor.yy0); + if( yymsp[-5].minor.yy190.pExpr ) { + yymsp[-5].minor.yy190.pExpr->affinity = (char)yymsp[-3].minor.yy194; + } +} + break; + case 249: /* raisetype ::= ROLLBACK */ +{yymsp[0].minor.yy194 = OE_Rollback;} + break; + case 251: /* raisetype ::= FAIL */ +{yymsp[0].minor.yy194 = OE_Fail;} + break; + case 252: /* cmd ::= DROP TRIGGER ifexists fullname */ +{ + sqlite3DropTrigger(pParse,yymsp[0].minor.yy185,yymsp[-1].minor.yy194); +} + break; + case 253: /* cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ +{ + sqlite3Attach(pParse, yymsp[-3].minor.yy190.pExpr, yymsp[-1].minor.yy190.pExpr, yymsp[0].minor.yy72); +} + break; + case 254: /* cmd ::= DETACH database_kw_opt expr */ +{ + sqlite3Detach(pParse, yymsp[0].minor.yy190.pExpr); +} + break; + case 257: /* cmd ::= REINDEX */ +{sqlite3Reindex(pParse, 0, 0);} + break; + case 258: /* cmd ::= REINDEX nm dbnm */ +{sqlite3Reindex(pParse, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0);} + break; + case 259: /* cmd ::= ANALYZE */ +{sqlite3Analyze(pParse, 0, 0);} + break; + case 260: /* cmd ::= ANALYZE nm dbnm */ +{sqlite3Analyze(pParse, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0);} + break; + case 261: /* cmd ::= ALTER TABLE fullname RENAME TO nm */ +{ + sqlite3AlterRenameTable(pParse,yymsp[-3].minor.yy185,&yymsp[0].minor.yy0); +} + break; + case 262: /* cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */ +{ + yymsp[-1].minor.yy0.n = (int)(pParse->sLastToken.z-yymsp[-1].minor.yy0.z) + pParse->sLastToken.n; + sqlite3AlterFinishAddColumn(pParse, &yymsp[-1].minor.yy0); +} + break; + case 263: /* add_column_fullname ::= fullname */ +{ + disableLookaside(pParse); + sqlite3AlterBeginAddColumn(pParse, yymsp[0].minor.yy185); +} + break; + case 264: /* cmd ::= create_vtab */ +{sqlite3VtabFinishParse(pParse,0);} + break; + case 265: /* cmd ::= create_vtab LP vtabarglist RP */ +{sqlite3VtabFinishParse(pParse,&yymsp[0].minor.yy0);} + break; + case 266: /* create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */ +{ + sqlite3VtabBeginParse(pParse, &yymsp[-3].minor.yy0, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-4].minor.yy194); +} + break; + case 267: /* vtabarg ::= */ +{sqlite3VtabArgInit(pParse);} + break; + case 268: /* vtabargtoken ::= ANY */ + case 269: /* vtabargtoken ::= lp anylist RP */ yytestcase(yyruleno==269); + case 270: /* lp ::= LP */ yytestcase(yyruleno==270); +{sqlite3VtabArgExtend(pParse,&yymsp[0].minor.yy0);} + break; + case 271: /* with ::= */ +{yymsp[1].minor.yy285 = 0;} + break; + case 272: /* with ::= WITH wqlist */ +{ yymsp[-1].minor.yy285 = yymsp[0].minor.yy285; } + break; + case 273: /* with ::= WITH RECURSIVE wqlist */ +{ yymsp[-2].minor.yy285 = yymsp[0].minor.yy285; } + break; + case 274: /* wqlist ::= nm eidlist_opt AS LP select RP */ +{ + yymsp[-5].minor.yy285 = sqlite3WithAdd(pParse, 0, &yymsp[-5].minor.yy0, yymsp[-4].minor.yy148, yymsp[-1].minor.yy243); /*A-overwrites-X*/ +} + break; + case 275: /* wqlist ::= wqlist COMMA nm eidlist_opt AS LP select RP */ +{ + yymsp[-7].minor.yy285 = sqlite3WithAdd(pParse, yymsp[-7].minor.yy285, &yymsp[-5].minor.yy0, yymsp[-4].minor.yy148, yymsp[-1].minor.yy243); +} + break; + default: + /* (276) input ::= cmdlist */ yytestcase(yyruleno==276); + /* (277) cmdlist ::= cmdlist ecmd */ yytestcase(yyruleno==277); + /* (278) cmdlist ::= ecmd (OPTIMIZED OUT) */ assert(yyruleno!=278); + /* (279) ecmd ::= SEMI */ yytestcase(yyruleno==279); + /* (280) ecmd ::= explain cmdx SEMI */ yytestcase(yyruleno==280); + /* (281) explain ::= */ yytestcase(yyruleno==281); + /* (282) trans_opt ::= */ yytestcase(yyruleno==282); + /* (283) trans_opt ::= TRANSACTION */ yytestcase(yyruleno==283); + /* (284) trans_opt ::= TRANSACTION nm */ yytestcase(yyruleno==284); + /* (285) savepoint_opt ::= SAVEPOINT */ yytestcase(yyruleno==285); + /* (286) savepoint_opt ::= */ yytestcase(yyruleno==286); + /* (287) cmd ::= create_table create_table_args */ yytestcase(yyruleno==287); + /* (288) columnlist ::= columnlist COMMA columnname carglist */ yytestcase(yyruleno==288); + /* (289) columnlist ::= columnname carglist */ yytestcase(yyruleno==289); + /* (290) nm ::= ID|INDEXED */ yytestcase(yyruleno==290); + /* (291) nm ::= STRING */ yytestcase(yyruleno==291); + /* (292) nm ::= JOIN_KW */ yytestcase(yyruleno==292); + /* (293) typetoken ::= typename */ yytestcase(yyruleno==293); + /* (294) typename ::= ID|STRING */ yytestcase(yyruleno==294); + /* (295) signed ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=295); + /* (296) signed ::= minus_num (OPTIMIZED OUT) */ assert(yyruleno!=296); + /* (297) carglist ::= carglist ccons */ yytestcase(yyruleno==297); + /* (298) carglist ::= */ yytestcase(yyruleno==298); + /* (299) ccons ::= NULL onconf */ yytestcase(yyruleno==299); + /* (300) conslist_opt ::= COMMA conslist */ yytestcase(yyruleno==300); + /* (301) conslist ::= conslist tconscomma tcons */ yytestcase(yyruleno==301); + /* (302) conslist ::= tcons (OPTIMIZED OUT) */ assert(yyruleno!=302); + /* (303) tconscomma ::= */ yytestcase(yyruleno==303); + /* (304) defer_subclause_opt ::= defer_subclause (OPTIMIZED OUT) */ assert(yyruleno!=304); + /* (305) resolvetype ::= raisetype (OPTIMIZED OUT) */ assert(yyruleno!=305); + /* (306) selectnowith ::= oneselect (OPTIMIZED OUT) */ assert(yyruleno!=306); + /* (307) oneselect ::= values */ yytestcase(yyruleno==307); + /* (308) sclp ::= selcollist COMMA */ yytestcase(yyruleno==308); + /* (309) as ::= ID|STRING */ yytestcase(yyruleno==309); + /* (310) expr ::= term (OPTIMIZED OUT) */ assert(yyruleno!=310); + /* (311) exprlist ::= nexprlist */ yytestcase(yyruleno==311); + /* (312) nmnum ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=312); + /* (313) nmnum ::= nm (OPTIMIZED OUT) */ assert(yyruleno!=313); + /* (314) nmnum ::= ON */ yytestcase(yyruleno==314); + /* (315) nmnum ::= DELETE */ yytestcase(yyruleno==315); + /* (316) nmnum ::= DEFAULT */ yytestcase(yyruleno==316); + /* (317) plus_num ::= INTEGER|FLOAT */ yytestcase(yyruleno==317); + /* (318) foreach_clause ::= */ yytestcase(yyruleno==318); + /* (319) foreach_clause ::= FOR EACH ROW */ yytestcase(yyruleno==319); + /* (320) trnm ::= nm */ yytestcase(yyruleno==320); + /* (321) tridxby ::= */ yytestcase(yyruleno==321); + /* (322) database_kw_opt ::= DATABASE */ yytestcase(yyruleno==322); + /* (323) database_kw_opt ::= */ yytestcase(yyruleno==323); + /* (324) kwcolumn_opt ::= */ yytestcase(yyruleno==324); + /* (325) kwcolumn_opt ::= COLUMNKW */ yytestcase(yyruleno==325); + /* (326) vtabarglist ::= vtabarg */ yytestcase(yyruleno==326); + /* (327) vtabarglist ::= vtabarglist COMMA vtabarg */ yytestcase(yyruleno==327); + /* (328) vtabarg ::= vtabarg vtabargtoken */ yytestcase(yyruleno==328); + /* (329) anylist ::= */ yytestcase(yyruleno==329); + /* (330) anylist ::= anylist LP anylist RP */ yytestcase(yyruleno==330); + /* (331) anylist ::= anylist ANY */ yytestcase(yyruleno==331); + break; +/********** End reduce actions ************************************************/ + }; + assert( yyrulenoYY_MAX_SHIFT ){ + yyact += YY_MIN_REDUCE - YY_MIN_SHIFTREDUCE; + } + yymsp -= yysize-1; + yypParser->yytos = yymsp; + yymsp->stateno = (YYACTIONTYPE)yyact; + yymsp->major = (YYCODETYPE)yygoto; + yyTraceShift(yypParser, yyact); + }else{ + assert( yyact == YY_ACCEPT_ACTION ); + yypParser->yytos -= yysize; + yy_accept(yypParser); + } +} + +/* +** The following code executes when the parse fails +*/ +#ifndef YYNOERRORRECOVERY +static void yy_parse_failed( + yyParser *yypParser /* The parser */ +){ + sqlite3ParserARG_FETCH; +#ifndef NDEBUG + if( yyTraceFILE ){ + fprintf(yyTraceFILE,"%sFail!\n",yyTracePrompt); + } +#endif + while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser); + /* Here code is inserted which will be executed whenever the + ** parser fails */ +/************ Begin %parse_failure code ***************************************/ +/************ End %parse_failure code *****************************************/ + sqlite3ParserARG_STORE; /* Suppress warning about unused %extra_argument variable */ +} +#endif /* YYNOERRORRECOVERY */ + +/* +** The following code executes when a syntax error first occurs. +*/ +static void yy_syntax_error( + yyParser *yypParser, /* The parser */ + int yymajor, /* The major type of the error token */ + sqlite3ParserTOKENTYPE yyminor /* The minor type of the error token */ +){ + sqlite3ParserARG_FETCH; +#define TOKEN yyminor +/************ Begin %syntax_error code ****************************************/ + + UNUSED_PARAMETER(yymajor); /* Silence some compiler warnings */ + assert( TOKEN.z[0] ); /* The tokenizer always gives us a token */ + sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &TOKEN); +/************ End %syntax_error code ******************************************/ + sqlite3ParserARG_STORE; /* Suppress warning about unused %extra_argument variable */ +} + +/* +** The following is executed when the parser accepts +*/ +static void yy_accept( + yyParser *yypParser /* The parser */ +){ + sqlite3ParserARG_FETCH; +#ifndef NDEBUG + if( yyTraceFILE ){ + fprintf(yyTraceFILE,"%sAccept!\n",yyTracePrompt); + } +#endif +#ifndef YYNOERRORRECOVERY + yypParser->yyerrcnt = -1; +#endif + assert( yypParser->yytos==yypParser->yystack ); + /* Here code is inserted which will be executed whenever the + ** parser accepts */ +/*********** Begin %parse_accept code *****************************************/ +/*********** End %parse_accept code *******************************************/ + sqlite3ParserARG_STORE; /* Suppress warning about unused %extra_argument variable */ +} + +/* The main parser program. +** The first argument is a pointer to a structure obtained from +** "sqlite3ParserAlloc" which describes the current state of the parser. +** The second argument is the major token number. The third is +** the minor token. The fourth optional argument is whatever the +** user wants (and specified in the grammar) and is available for +** use by the action routines. +** +** Inputs: +**
        +**
      • A pointer to the parser (an opaque structure.) +**
      • The major token number. +**
      • The minor token number. +**
      • An option argument of a grammar-specified type. +**
      +** +** Outputs: +** None. +*/ +SQLITE_PRIVATE void sqlite3Parser( + void *yyp, /* The parser */ + int yymajor, /* The major token code number */ + sqlite3ParserTOKENTYPE yyminor /* The value for the token */ + sqlite3ParserARG_PDECL /* Optional %extra_argument parameter */ +){ + YYMINORTYPE yyminorunion; + unsigned int yyact; /* The parser action. */ +#if !defined(YYERRORSYMBOL) && !defined(YYNOERRORRECOVERY) + int yyendofinput; /* True if we are at the end of input */ +#endif +#ifdef YYERRORSYMBOL + int yyerrorhit = 0; /* True if yymajor has invoked an error */ +#endif + yyParser *yypParser; /* The parser */ + + yypParser = (yyParser*)yyp; + assert( yypParser->yytos!=0 ); +#if !defined(YYERRORSYMBOL) && !defined(YYNOERRORRECOVERY) + yyendofinput = (yymajor==0); +#endif + sqlite3ParserARG_STORE; + +#ifndef NDEBUG + if( yyTraceFILE ){ + fprintf(yyTraceFILE,"%sInput '%s'\n",yyTracePrompt,yyTokenName[yymajor]); + } +#endif + + do{ + yyact = yy_find_shift_action(yypParser,(YYCODETYPE)yymajor); + if( yyact <= YY_MAX_SHIFTREDUCE ){ + yy_shift(yypParser,yyact,yymajor,yyminor); +#ifndef YYNOERRORRECOVERY + yypParser->yyerrcnt--; +#endif + yymajor = YYNOCODE; + }else if( yyact <= YY_MAX_REDUCE ){ + yy_reduce(yypParser,yyact-YY_MIN_REDUCE); + }else{ + assert( yyact == YY_ERROR_ACTION ); + yyminorunion.yy0 = yyminor; +#ifdef YYERRORSYMBOL + int yymx; +#endif +#ifndef NDEBUG + if( yyTraceFILE ){ + fprintf(yyTraceFILE,"%sSyntax Error!\n",yyTracePrompt); + } +#endif +#ifdef YYERRORSYMBOL + /* A syntax error has occurred. + ** The response to an error depends upon whether or not the + ** grammar defines an error token "ERROR". + ** + ** This is what we do if the grammar does define ERROR: + ** + ** * Call the %syntax_error function. + ** + ** * Begin popping the stack until we enter a state where + ** it is legal to shift the error symbol, then shift + ** the error symbol. + ** + ** * Set the error count to three. + ** + ** * Begin accepting and shifting new tokens. No new error + ** processing will occur until three tokens have been + ** shifted successfully. + ** + */ + if( yypParser->yyerrcnt<0 ){ + yy_syntax_error(yypParser,yymajor,yyminor); + } + yymx = yypParser->yytos->major; + if( yymx==YYERRORSYMBOL || yyerrorhit ){ +#ifndef NDEBUG + if( yyTraceFILE ){ + fprintf(yyTraceFILE,"%sDiscard input token %s\n", + yyTracePrompt,yyTokenName[yymajor]); + } +#endif + yy_destructor(yypParser, (YYCODETYPE)yymajor, &yyminorunion); + yymajor = YYNOCODE; + }else{ + while( yypParser->yytos >= yypParser->yystack + && yymx != YYERRORSYMBOL + && (yyact = yy_find_reduce_action( + yypParser->yytos->stateno, + YYERRORSYMBOL)) >= YY_MIN_REDUCE + ){ + yy_pop_parser_stack(yypParser); + } + if( yypParser->yytos < yypParser->yystack || yymajor==0 ){ + yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion); + yy_parse_failed(yypParser); +#ifndef YYNOERRORRECOVERY + yypParser->yyerrcnt = -1; +#endif + yymajor = YYNOCODE; + }else if( yymx!=YYERRORSYMBOL ){ + yy_shift(yypParser,yyact,YYERRORSYMBOL,yyminor); + } + } + yypParser->yyerrcnt = 3; + yyerrorhit = 1; +#elif defined(YYNOERRORRECOVERY) + /* If the YYNOERRORRECOVERY macro is defined, then do not attempt to + ** do any kind of error recovery. Instead, simply invoke the syntax + ** error routine and continue going as if nothing had happened. + ** + ** Applications can set this macro (for example inside %include) if + ** they intend to abandon the parse upon the first syntax error seen. + */ + yy_syntax_error(yypParser,yymajor, yyminor); + yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion); + yymajor = YYNOCODE; + +#else /* YYERRORSYMBOL is not defined */ + /* This is what we do if the grammar does not define ERROR: + ** + ** * Report an error message, and throw away the input token. + ** + ** * If the input token is $, then fail the parse. + ** + ** As before, subsequent error messages are suppressed until + ** three input tokens have been successfully shifted. + */ + if( yypParser->yyerrcnt<=0 ){ + yy_syntax_error(yypParser,yymajor, yyminor); + } + yypParser->yyerrcnt = 3; + yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion); + if( yyendofinput ){ + yy_parse_failed(yypParser); +#ifndef YYNOERRORRECOVERY + yypParser->yyerrcnt = -1; +#endif + } + yymajor = YYNOCODE; +#endif + } + }while( yymajor!=YYNOCODE && yypParser->yytos>yypParser->yystack ); +#ifndef NDEBUG + if( yyTraceFILE ){ + yyStackEntry *i; + char cDiv = '['; + fprintf(yyTraceFILE,"%sReturn. Stack=",yyTracePrompt); + for(i=&yypParser->yystack[1]; i<=yypParser->yytos; i++){ + fprintf(yyTraceFILE,"%c%s", cDiv, yyTokenName[i->major]); + cDiv = ' '; + } + fprintf(yyTraceFILE,"]\n"); + } +#endif + return; +} + +/************** End of parse.c ***********************************************/ +/************** Begin file tokenize.c ****************************************/ +/* +** 2001 September 15 +** +** 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. +** +************************************************************************* +** An tokenizer for SQL +** +** 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. +*/ +/* #include "sqliteInt.h" */ +/* #include */ + +/* Character classes for tokenizing +** +** In the sqlite3GetToken() function, a switch() on aiClass[c] is implemented +** using a lookup table, whereas a switch() directly on c uses a binary search. +** The lookup table is much faster. To maximize speed, and to ensure that +** a lookup table is used, all of the classes need to be small integers and +** all of them need to be used within the switch. +*/ +#define CC_X 0 /* The letter 'x', or start of BLOB literal */ +#define CC_KYWD 1 /* Alphabetics or '_'. Usable in a keyword */ +#define CC_ID 2 /* unicode characters usable in IDs */ +#define CC_DIGIT 3 /* Digits */ +#define CC_DOLLAR 4 /* '$' */ +#define CC_VARALPHA 5 /* '@', '#', ':'. Alphabetic SQL variables */ +#define CC_VARNUM 6 /* '?'. Numeric SQL variables */ +#define CC_SPACE 7 /* Space characters */ +#define CC_QUOTE 8 /* '"', '\'', or '`'. String literals, quoted ids */ +#define CC_QUOTE2 9 /* '['. [...] style quoted ids */ +#define CC_PIPE 10 /* '|'. Bitwise OR or concatenate */ +#define CC_MINUS 11 /* '-'. Minus or SQL-style comment */ +#define CC_LT 12 /* '<'. Part of < or <= or <> */ +#define CC_GT 13 /* '>'. Part of > or >= */ +#define CC_EQ 14 /* '='. Part of = or == */ +#define CC_BANG 15 /* '!'. Part of != */ +#define CC_SLASH 16 /* '/'. / or c-style comment */ +#define CC_LP 17 /* '(' */ +#define CC_RP 18 /* ')' */ +#define CC_SEMI 19 /* ';' */ +#define CC_PLUS 20 /* '+' */ +#define CC_STAR 21 /* '*' */ +#define CC_PERCENT 22 /* '%' */ +#define CC_COMMA 23 /* ',' */ +#define CC_AND 24 /* '&' */ +#define CC_TILDA 25 /* '~' */ +#define CC_DOT 26 /* '.' */ +#define CC_ILLEGAL 27 /* Illegal character */ + +static const unsigned char aiClass[] = { +#ifdef SQLITE_ASCII +/* x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xa xb xc xd xe xf */ +/* 0x */ 27, 27, 27, 27, 27, 27, 27, 27, 27, 7, 7, 27, 7, 7, 27, 27, +/* 1x */ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +/* 2x */ 7, 15, 8, 5, 4, 22, 24, 8, 17, 18, 21, 20, 23, 11, 26, 16, +/* 3x */ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 19, 12, 14, 13, 6, +/* 4x */ 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +/* 5x */ 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 9, 27, 27, 27, 1, +/* 6x */ 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +/* 7x */ 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 27, 10, 27, 25, 27, +/* 8x */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +/* 9x */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +/* Ax */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +/* Bx */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +/* Cx */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +/* Dx */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +/* Ex */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +/* Fx */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 +#endif +#ifdef SQLITE_EBCDIC +/* x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xa xb xc xd xe xf */ +/* 0x */ 27, 27, 27, 27, 27, 7, 27, 27, 27, 27, 27, 27, 7, 7, 27, 27, +/* 1x */ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +/* 2x */ 27, 27, 27, 27, 27, 7, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +/* 3x */ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +/* 4x */ 7, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 12, 17, 20, 10, +/* 5x */ 24, 27, 27, 27, 27, 27, 27, 27, 27, 27, 15, 4, 21, 18, 19, 27, +/* 6x */ 11, 16, 27, 27, 27, 27, 27, 27, 27, 27, 27, 23, 22, 1, 13, 7, +/* 7x */ 27, 27, 27, 27, 27, 27, 27, 27, 27, 8, 5, 5, 5, 8, 14, 8, +/* 8x */ 27, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 27, 27, 27, 27, 27, +/* 9x */ 27, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 27, 27, 27, 27, 27, +/* 9x */ 25, 1, 1, 1, 1, 1, 1, 0, 1, 1, 27, 27, 27, 27, 27, 27, +/* Bx */ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 9, 27, 27, 27, 27, 27, +/* Cx */ 27, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 27, 27, 27, 27, 27, +/* Dx */ 27, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 27, 27, 27, 27, 27, +/* Ex */ 27, 27, 1, 1, 1, 1, 1, 0, 1, 1, 27, 27, 27, 27, 27, 27, +/* Fx */ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 27, 27, 27, 27, 27, 27, +#endif +}; + +/* +** The charMap() macro maps alphabetic characters (only) into their +** lower-case ASCII equivalent. On ASCII machines, this is just +** an upper-to-lower case map. On EBCDIC machines we also need +** to adjust the encoding. The mapping is only valid for alphabetics +** which are the only characters for which this feature is used. +** +** Used by keywordhash.h +*/ +#ifdef SQLITE_ASCII +# define charMap(X) sqlite3UpperToLower[(unsigned char)X] +#endif +#ifdef SQLITE_EBCDIC +# define charMap(X) ebcdicToAscii[(unsigned char)X] +const unsigned char ebcdicToAscii[] = { +/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ + 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 2x */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 3x */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 4x */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 5x */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 0, 0, /* 6x */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 7x */ + 0, 97, 98, 99,100,101,102,103,104,105, 0, 0, 0, 0, 0, 0, /* 8x */ + 0,106,107,108,109,110,111,112,113,114, 0, 0, 0, 0, 0, 0, /* 9x */ + 0, 0,115,116,117,118,119,120,121,122, 0, 0, 0, 0, 0, 0, /* Ax */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* Bx */ + 0, 97, 98, 99,100,101,102,103,104,105, 0, 0, 0, 0, 0, 0, /* Cx */ + 0,106,107,108,109,110,111,112,113,114, 0, 0, 0, 0, 0, 0, /* Dx */ + 0, 0,115,116,117,118,119,120,121,122, 0, 0, 0, 0, 0, 0, /* Ex */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* Fx */ +}; +#endif + +/* +** The sqlite3KeywordCode function looks up an identifier to determine if +** it is a keyword. If it is a keyword, the token code of that keyword is +** returned. If the input is not a keyword, TK_ID is returned. +** +** The implementation of this routine was generated by a program, +** mkkeywordhash.c, located in the tool subdirectory of the distribution. +** The output of the mkkeywordhash.c program is written into a file +** named keywordhash.h and then included into this source file by +** the #include below. +*/ +/************** Include keywordhash.h in the middle of tokenize.c ************/ +/************** Begin file keywordhash.h *************************************/ +/***** This file contains automatically generated code ****** +** +** The code in this file has been automatically generated by +** +** 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 +** might be implemented more directly using a hand-written hash table. +** But by using this automatically generated code, the size of the code +** is substantially reduced. This is important for embedded applications +** on platforms with limited memory. +*/ +/* Hash score: 182 */ +static int keywordCode(const char *z, int n, int *pType){ + /* zText[] encodes 834 bytes of keywords in 554 bytes */ + /* REINDEXEDESCAPEACHECKEYBEFOREIGNOREGEXPLAINSTEADDATABASELECT */ + /* ABLEFTHENDEFERRABLELSEXCEPTRANSACTIONATURALTERAISEXCLUSIVE */ + /* XISTSAVEPOINTERSECTRIGGEREFERENCESCONSTRAINTOFFSETEMPORARY */ + /* UNIQUERYWITHOUTERELEASEATTACHAVINGROUPDATEBEGINNERECURSIVE */ + /* BETWEENOTNULLIKECASCADELETECASECOLLATECREATECURRENT_DATEDETACH */ + /* IMMEDIATEJOINSERTMATCHPLANALYZEPRAGMABORTVALUESVIRTUALIMITWHEN */ + /* WHERENAMEAFTEREPLACEANDEFAULTAUTOINCREMENTCASTCOLUMNCOMMIT */ + /* CONFLICTCROSSCURRENT_TIMESTAMPRIMARYDEFERREDISTINCTDROPFAIL */ + /* FROMFULLGLOBYIFISNULLORDERESTRICTRIGHTROLLBACKROWUNIONUSING */ + /* VACUUMVIEWINITIALLY */ + static const char zText[553] = { + 'R','E','I','N','D','E','X','E','D','E','S','C','A','P','E','A','C','H', + 'E','C','K','E','Y','B','E','F','O','R','E','I','G','N','O','R','E','G', + 'E','X','P','L','A','I','N','S','T','E','A','D','D','A','T','A','B','A', + 'S','E','L','E','C','T','A','B','L','E','F','T','H','E','N','D','E','F', + 'E','R','R','A','B','L','E','L','S','E','X','C','E','P','T','R','A','N', + 'S','A','C','T','I','O','N','A','T','U','R','A','L','T','E','R','A','I', + 'S','E','X','C','L','U','S','I','V','E','X','I','S','T','S','A','V','E', + 'P','O','I','N','T','E','R','S','E','C','T','R','I','G','G','E','R','E', + 'F','E','R','E','N','C','E','S','C','O','N','S','T','R','A','I','N','T', + 'O','F','F','S','E','T','E','M','P','O','R','A','R','Y','U','N','I','Q', + 'U','E','R','Y','W','I','T','H','O','U','T','E','R','E','L','E','A','S', + 'E','A','T','T','A','C','H','A','V','I','N','G','R','O','U','P','D','A', + 'T','E','B','E','G','I','N','N','E','R','E','C','U','R','S','I','V','E', + 'B','E','T','W','E','E','N','O','T','N','U','L','L','I','K','E','C','A', + 'S','C','A','D','E','L','E','T','E','C','A','S','E','C','O','L','L','A', + 'T','E','C','R','E','A','T','E','C','U','R','R','E','N','T','_','D','A', + 'T','E','D','E','T','A','C','H','I','M','M','E','D','I','A','T','E','J', + 'O','I','N','S','E','R','T','M','A','T','C','H','P','L','A','N','A','L', + 'Y','Z','E','P','R','A','G','M','A','B','O','R','T','V','A','L','U','E', + 'S','V','I','R','T','U','A','L','I','M','I','T','W','H','E','N','W','H', + 'E','R','E','N','A','M','E','A','F','T','E','R','E','P','L','A','C','E', + 'A','N','D','E','F','A','U','L','T','A','U','T','O','I','N','C','R','E', + 'M','E','N','T','C','A','S','T','C','O','L','U','M','N','C','O','M','M', + 'I','T','C','O','N','F','L','I','C','T','C','R','O','S','S','C','U','R', + 'R','E','N','T','_','T','I','M','E','S','T','A','M','P','R','I','M','A', + 'R','Y','D','E','F','E','R','R','E','D','I','S','T','I','N','C','T','D', + 'R','O','P','F','A','I','L','F','R','O','M','F','U','L','L','G','L','O', + 'B','Y','I','F','I','S','N','U','L','L','O','R','D','E','R','E','S','T', + 'R','I','C','T','R','I','G','H','T','R','O','L','L','B','A','C','K','R', + 'O','W','U','N','I','O','N','U','S','I','N','G','V','A','C','U','U','M', + 'V','I','E','W','I','N','I','T','I','A','L','L','Y', + }; + static const unsigned char aHash[127] = { + 76, 105, 117, 74, 0, 45, 0, 0, 82, 0, 77, 0, 0, + 42, 12, 78, 15, 0, 116, 85, 54, 112, 0, 19, 0, 0, + 121, 0, 119, 115, 0, 22, 93, 0, 9, 0, 0, 70, 71, + 0, 69, 6, 0, 48, 90, 102, 0, 118, 101, 0, 0, 44, + 0, 103, 24, 0, 17, 0, 122, 53, 23, 0, 5, 110, 25, + 96, 0, 0, 124, 106, 60, 123, 57, 28, 55, 0, 91, 0, + 100, 26, 0, 99, 0, 0, 0, 95, 92, 97, 88, 109, 14, + 39, 108, 0, 81, 0, 18, 89, 111, 32, 0, 120, 80, 113, + 62, 46, 84, 0, 0, 94, 40, 59, 114, 0, 36, 0, 0, + 29, 0, 86, 63, 64, 0, 20, 61, 0, 56, + }; + static const unsigned char aNext[124] = { + 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, 33, 0, 21, 0, 0, 0, 0, 0, 50, + 0, 43, 3, 47, 0, 0, 0, 0, 30, 0, 58, 0, 38, + 0, 0, 0, 1, 66, 0, 0, 67, 0, 41, 0, 0, 0, + 0, 0, 0, 49, 65, 0, 0, 0, 0, 31, 52, 16, 34, + 10, 0, 0, 0, 0, 0, 0, 0, 11, 72, 79, 0, 8, + 0, 104, 98, 0, 107, 0, 87, 0, 75, 51, 0, 27, 37, + 73, 83, 0, 35, 68, 0, 0, + }; + static const unsigned char aLen[124] = { + 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, 9, 4, 2, 6, 5, 7, 4, 5, 7, + 6, 6, 5, 6, 5, 5, 9, 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, 4, 4, 2, 2, 6, 5, 8, 5, 8, + 3, 5, 5, 6, 4, 9, 3, + }; + static const unsigned short int aOffset[124] = { + 0, 2, 2, 8, 9, 14, 16, 20, 23, 25, 25, 29, 33, + 36, 41, 46, 48, 53, 54, 59, 62, 65, 67, 69, 78, 81, + 86, 91, 95, 96, 101, 105, 109, 117, 122, 128, 136, 142, 152, + 159, 162, 162, 165, 167, 167, 171, 176, 179, 184, 184, 188, 192, + 199, 204, 209, 212, 218, 221, 225, 234, 240, 240, 240, 243, 246, + 250, 251, 255, 261, 265, 272, 278, 290, 296, 305, 307, 313, 318, + 320, 327, 332, 337, 343, 349, 354, 358, 361, 367, 371, 378, 380, + 387, 389, 391, 400, 404, 410, 416, 424, 429, 429, 445, 452, 459, + 460, 467, 471, 475, 479, 483, 486, 488, 490, 496, 500, 508, 513, + 521, 524, 529, 534, 540, 544, 549, + }; + static const unsigned char aCode[124] = { + TK_REINDEX, TK_INDEXED, TK_INDEX, TK_DESC, TK_ESCAPE, + TK_EACH, TK_CHECK, TK_KEY, TK_BEFORE, TK_FOREIGN, + TK_FOR, TK_IGNORE, TK_LIKE_KW, TK_EXPLAIN, TK_INSTEAD, + TK_ADD, TK_DATABASE, TK_AS, TK_SELECT, TK_TABLE, + TK_JOIN_KW, TK_THEN, TK_END, TK_DEFERRABLE, TK_ELSE, + TK_EXCEPT, TK_TRANSACTION,TK_ACTION, TK_ON, TK_JOIN_KW, + TK_ALTER, TK_RAISE, TK_EXCLUSIVE, TK_EXISTS, TK_SAVEPOINT, + TK_INTERSECT, TK_TRIGGER, TK_REFERENCES, TK_CONSTRAINT, TK_INTO, + TK_OFFSET, TK_OF, TK_SET, TK_TEMP, TK_TEMP, + TK_OR, TK_UNIQUE, TK_QUERY, TK_WITHOUT, TK_WITH, + TK_JOIN_KW, TK_RELEASE, TK_ATTACH, TK_HAVING, TK_GROUP, + TK_UPDATE, TK_BEGIN, TK_JOIN_KW, TK_RECURSIVE, 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, TK_PRAGMA, + TK_ABORT, TK_VALUES, TK_VIRTUAL, TK_LIMIT, TK_WHEN, + TK_WHERE, TK_RENAME, TK_AFTER, TK_REPLACE, TK_AND, + TK_DEFAULT, TK_AUTOINCR, TK_TO, TK_IN, TK_CAST, + TK_COLUMNKW, TK_COMMIT, TK_CONFLICT, TK_JOIN_KW, TK_CTIME_KW, + TK_CTIME_KW, TK_PRIMARY, TK_DEFERRED, TK_DISTINCT, TK_IS, + TK_DROP, TK_FAIL, TK_FROM, TK_JOIN_KW, TK_LIKE_KW, + TK_BY, TK_IF, TK_ISNULL, TK_ORDER, TK_RESTRICT, + TK_JOIN_KW, TK_ROLLBACK, TK_ROW, TK_UNION, TK_USING, + TK_VACUUM, TK_VIEW, TK_INITIALLY, TK_ALL, + }; + int i, j; + const char *zKW; + if( n>=2 ){ + i = ((charMap(z[0])*4) ^ (charMap(z[n-1])*3) ^ n) % 127; + for(i=((int)aHash[i])-1; i>=0; i=((int)aNext[i])-1){ + if( aLen[i]!=n ) continue; + j = 0; + zKW = &zText[aOffset[i]]; +#ifdef SQLITE_ASCII + while( j=0x42 && sqlite3IsEbcdicIdChar[c-0x40])) +#endif + +/* Make the IdChar function accessible from ctime.c */ +#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS +SQLITE_PRIVATE int sqlite3IsIdChar(u8 c){ return IdChar(c); } +#endif + + +/* +** Return the length (in bytes) of the token that begins at z[0]. +** Store the token type in *tokenType before returning. +*/ +SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){ + int i, c; + switch( aiClass[*z] ){ /* Switch on the character-class of the first byte + ** of the token. See the comment on the CC_ defines + ** above. */ + case CC_SPACE: { + testcase( z[0]==' ' ); + testcase( z[0]=='\t' ); + testcase( z[0]=='\n' ); + testcase( z[0]=='\f' ); + testcase( z[0]=='\r' ); + for(i=1; sqlite3Isspace(z[i]); i++){} + *tokenType = TK_SPACE; + return i; + } + case CC_MINUS: { + if( z[1]=='-' ){ + for(i=2; (c=z[i])!=0 && c!='\n'; i++){} + *tokenType = TK_SPACE; /* IMP: R-22934-25134 */ + return i; + } + *tokenType = TK_MINUS; + return 1; + } + case CC_LP: { + *tokenType = TK_LP; + return 1; + } + case CC_RP: { + *tokenType = TK_RP; + return 1; + } + case CC_SEMI: { + *tokenType = TK_SEMI; + return 1; + } + case CC_PLUS: { + *tokenType = TK_PLUS; + return 1; + } + case CC_STAR: { + *tokenType = TK_STAR; + return 1; + } + case CC_SLASH: { + if( z[1]!='*' || z[2]==0 ){ + *tokenType = TK_SLASH; + return 1; + } + for(i=3, c=z[2]; (c!='*' || z[i]!='/') && (c=z[i])!=0; i++){} + if( c ) i++; + *tokenType = TK_SPACE; /* IMP: R-22934-25134 */ + return i; + } + case CC_PERCENT: { + *tokenType = TK_REM; + return 1; + } + case CC_EQ: { + *tokenType = TK_EQ; + return 1 + (z[1]=='='); + } + case CC_LT: { + if( (c=z[1])=='=' ){ + *tokenType = TK_LE; + return 2; + }else if( c=='>' ){ + *tokenType = TK_NE; + return 2; + }else if( c=='<' ){ + *tokenType = TK_LSHIFT; + return 2; + }else{ + *tokenType = TK_LT; + return 1; + } + } + case CC_GT: { + if( (c=z[1])=='=' ){ + *tokenType = TK_GE; + return 2; + }else if( c=='>' ){ + *tokenType = TK_RSHIFT; + return 2; + }else{ + *tokenType = TK_GT; + return 1; + } + } + case CC_BANG: { + if( z[1]!='=' ){ + *tokenType = TK_ILLEGAL; + return 1; + }else{ + *tokenType = TK_NE; + return 2; + } + } + case CC_PIPE: { + if( z[1]!='|' ){ + *tokenType = TK_BITOR; + return 1; + }else{ + *tokenType = TK_CONCAT; + return 2; + } + } + case CC_COMMA: { + *tokenType = TK_COMMA; + return 1; + } + case CC_AND: { + *tokenType = TK_BITAND; + return 1; + } + case CC_TILDA: { + *tokenType = TK_BITNOT; + return 1; + } + case CC_QUOTE: { + int delim = z[0]; + testcase( delim=='`' ); + testcase( delim=='\'' ); + testcase( delim=='"' ); + for(i=1; (c=z[i])!=0; i++){ + if( c==delim ){ + if( z[i+1]==delim ){ + i++; + }else{ + break; + } + } + } + if( c=='\'' ){ + *tokenType = TK_STRING; + return i+1; + }else if( c!=0 ){ + *tokenType = TK_ID; + return i+1; + }else{ + *tokenType = TK_ILLEGAL; + return i; + } + } + case CC_DOT: { +#ifndef SQLITE_OMIT_FLOATING_POINT + if( !sqlite3Isdigit(z[1]) ) +#endif + { + *tokenType = TK_DOT; + return 1; + } + /* If the next character is a digit, this is a floating point + ** number that begins with ".". Fall thru into the next case */ + } + case CC_DIGIT: { + testcase( z[0]=='0' ); testcase( z[0]=='1' ); testcase( z[0]=='2' ); + testcase( z[0]=='3' ); testcase( z[0]=='4' ); testcase( z[0]=='5' ); + testcase( z[0]=='6' ); testcase( z[0]=='7' ); testcase( z[0]=='8' ); + testcase( z[0]=='9' ); + *tokenType = TK_INTEGER; +#ifndef SQLITE_OMIT_HEX_INTEGER + if( z[0]=='0' && (z[1]=='x' || z[1]=='X') && sqlite3Isxdigit(z[2]) ){ + for(i=3; sqlite3Isxdigit(z[i]); i++){} + return i; + } +#endif + for(i=0; sqlite3Isdigit(z[i]); i++){} +#ifndef SQLITE_OMIT_FLOATING_POINT + if( z[i]=='.' ){ + i++; + while( sqlite3Isdigit(z[i]) ){ i++; } + *tokenType = TK_FLOAT; + } + if( (z[i]=='e' || z[i]=='E') && + ( sqlite3Isdigit(z[i+1]) + || ((z[i+1]=='+' || z[i+1]=='-') && sqlite3Isdigit(z[i+2])) + ) + ){ + i += 2; + while( sqlite3Isdigit(z[i]) ){ i++; } + *tokenType = TK_FLOAT; + } +#endif + while( IdChar(z[i]) ){ + *tokenType = TK_ILLEGAL; + i++; + } + return i; + } + case CC_QUOTE2: { + for(i=1, c=z[0]; c!=']' && (c=z[i])!=0; i++){} + *tokenType = c==']' ? TK_ID : TK_ILLEGAL; + return i; + } + case CC_VARNUM: { + *tokenType = TK_VARIABLE; + for(i=1; sqlite3Isdigit(z[i]); i++){} + return i; + } + case CC_DOLLAR: + case CC_VARALPHA: { + int n = 0; + testcase( z[0]=='$' ); testcase( z[0]=='@' ); + testcase( z[0]==':' ); testcase( z[0]=='#' ); + *tokenType = TK_VARIABLE; + for(i=1; (c=z[i])!=0; i++){ + if( IdChar(c) ){ + n++; +#ifndef SQLITE_OMIT_TCL_VARIABLE + }else if( c=='(' && n>0 ){ + do{ + i++; + }while( (c=z[i])!=0 && !sqlite3Isspace(c) && c!=')' ); + if( c==')' ){ + i++; + }else{ + *tokenType = TK_ILLEGAL; + } + break; + }else if( c==':' && z[i+1]==':' ){ + i++; +#endif + }else{ + break; + } + } + if( n==0 ) *tokenType = TK_ILLEGAL; + return i; + } + case CC_KYWD: { + for(i=1; aiClass[z[i]]<=CC_KYWD; i++){} + if( IdChar(z[i]) ){ + /* This token started out using characters that can appear in keywords, + ** but z[i] is a character not allowed within keywords, so this must + ** be an identifier instead */ + i++; + break; + } + *tokenType = TK_ID; + return keywordCode((char*)z, i, tokenType); + } + case CC_X: { +#ifndef SQLITE_OMIT_BLOB_LITERAL + testcase( z[0]=='x' ); testcase( z[0]=='X' ); + if( z[1]=='\'' ){ + *tokenType = TK_BLOB; + for(i=2; sqlite3Isxdigit(z[i]); i++){} + if( z[i]!='\'' || i%2 ){ + *tokenType = TK_ILLEGAL; + while( z[i] && z[i]!='\'' ){ i++; } + } + if( z[i] ) i++; + return i; + } +#endif + /* If it is not a BLOB literal, then it must be an ID, since no + ** SQL keywords start with the letter 'x'. Fall through */ + } + case CC_ID: { + i = 1; + break; + } + default: { + *tokenType = TK_ILLEGAL; + return 1; + } + } + while( IdChar(z[i]) ){ i++; } + *tokenType = TK_ID; + return i; +} + +/* +** Run the parser on the given SQL string. The parser structure is +** passed in. An SQLITE_ status code is returned. If an error occurs +** then an and attempt is made to write an error message into +** memory obtained from sqlite3_malloc() and to make *pzErrMsg point to that +** error message. +*/ +SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzErrMsg){ + int nErr = 0; /* Number of errors encountered */ + int i; /* Loop counter */ + void *pEngine; /* The LEMON-generated LALR(1) parser */ + int tokenType; /* type of the next token */ + int lastTokenParsed = -1; /* type of the previous token */ + sqlite3 *db = pParse->db; /* The database connection */ + int mxSqlLen; /* Max length of an SQL string */ + + assert( zSql!=0 ); + mxSqlLen = db->aLimit[SQLITE_LIMIT_SQL_LENGTH]; + if( db->nVdbeActive==0 ){ + db->u1.isInterrupted = 0; + } + pParse->rc = SQLITE_OK; + pParse->zTail = zSql; + i = 0; + assert( pzErrMsg!=0 ); + /* sqlite3ParserTrace(stdout, "parser: "); */ + pEngine = sqlite3ParserAlloc(sqlite3Malloc); + if( pEngine==0 ){ + sqlite3OomFault(db); + return SQLITE_NOMEM_BKPT; + } + assert( pParse->pNewTable==0 ); + assert( pParse->pNewTrigger==0 ); + assert( pParse->nVar==0 ); + assert( pParse->nzVar==0 ); + assert( pParse->azVar==0 ); + while( 1 ){ + assert( i>=0 ); + if( zSql[i]!=0 ){ + pParse->sLastToken.z = &zSql[i]; + pParse->sLastToken.n = sqlite3GetToken((u8*)&zSql[i],&tokenType); + i += pParse->sLastToken.n; + if( i>mxSqlLen ){ + pParse->rc = SQLITE_TOOBIG; + break; + } + }else{ + /* Upon reaching the end of input, call the parser two more times + ** with tokens TK_SEMI and 0, in that order. */ + if( lastTokenParsed==TK_SEMI ){ + tokenType = 0; + }else if( lastTokenParsed==0 ){ + break; + }else{ + tokenType = TK_SEMI; + } + } + if( tokenType>=TK_SPACE ){ + assert( tokenType==TK_SPACE || tokenType==TK_ILLEGAL ); + if( db->u1.isInterrupted ){ + pParse->rc = SQLITE_INTERRUPT; + break; + } + if( tokenType==TK_ILLEGAL ){ + sqlite3ErrorMsg(pParse, "unrecognized token: \"%T\"", + &pParse->sLastToken); + break; + } + }else{ + sqlite3Parser(pEngine, tokenType, pParse->sLastToken, pParse); + lastTokenParsed = tokenType; + if( pParse->rc!=SQLITE_OK || db->mallocFailed ) break; + } + } + assert( nErr==0 ); + pParse->zTail = &zSql[i]; +#ifdef YYTRACKMAXSTACKDEPTH + sqlite3_mutex_enter(sqlite3MallocMutex()); + sqlite3StatusHighwater(SQLITE_STATUS_PARSER_STACK, + sqlite3ParserStackPeak(pEngine) + ); + sqlite3_mutex_leave(sqlite3MallocMutex()); +#endif /* YYDEBUG */ + sqlite3ParserFree(pEngine, sqlite3_free); + if( db->mallocFailed ){ + pParse->rc = SQLITE_NOMEM_BKPT; + } + if( pParse->rc!=SQLITE_OK && pParse->rc!=SQLITE_DONE && pParse->zErrMsg==0 ){ + pParse->zErrMsg = sqlite3MPrintf(db, "%s", sqlite3ErrStr(pParse->rc)); + } + assert( pzErrMsg!=0 ); + if( pParse->zErrMsg ){ + *pzErrMsg = pParse->zErrMsg; + sqlite3_log(pParse->rc, "%s", *pzErrMsg); + pParse->zErrMsg = 0; + nErr++; + } + if( pParse->pVdbe && pParse->nErr>0 && pParse->nested==0 ){ + sqlite3VdbeDelete(pParse->pVdbe); + pParse->pVdbe = 0; + } +#ifndef SQLITE_OMIT_SHARED_CACHE + if( pParse->nested==0 ){ + sqlite3DbFree(db, pParse->aTableLock); + pParse->aTableLock = 0; + pParse->nTableLock = 0; + } +#endif +#ifndef SQLITE_OMIT_VIRTUALTABLE + sqlite3_free(pParse->apVtabLock); +#endif + + if( !IN_DECLARE_VTAB ){ + /* If the pParse->declareVtab flag is set, do not delete any table + ** structure built up in pParse->pNewTable. The calling code (see vtab.c) + ** will take responsibility for freeing the Table structure. + */ + sqlite3DeleteTable(db, pParse->pNewTable); + } + + if( pParse->pWithToFree ) sqlite3WithDelete(db, pParse->pWithToFree); + sqlite3DeleteTrigger(db, pParse->pNewTrigger); + for(i=pParse->nzVar-1; i>=0; i--) sqlite3DbFree(db, pParse->azVar[i]); + sqlite3DbFree(db, pParse->azVar); + while( pParse->pAinc ){ + AutoincInfo *p = pParse->pAinc; + pParse->pAinc = p->pNext; + sqlite3DbFree(db, p); + } + while( pParse->pZombieTab ){ + Table *p = pParse->pZombieTab; + pParse->pZombieTab = p->pNextZombie; + sqlite3DeleteTable(db, p); + } + assert( nErr==0 || pParse->rc!=SQLITE_OK ); + return nErr; +} + +/************** End of tokenize.c ********************************************/ +/************** Begin file complete.c ****************************************/ +/* +** 2001 September 15 +** +** 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. +** +************************************************************************* +** An tokenizer for SQL +** +** This file contains C code that implements the sqlite3_complete() API. +** 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. +*/ +/* #include "sqliteInt.h" */ +#ifndef SQLITE_OMIT_COMPLETE + +/* +** This is defined in tokenize.c. We just have to import the definition. +*/ +#ifndef SQLITE_AMALGAMATION +#ifdef SQLITE_ASCII +#define IdChar(C) ((sqlite3CtypeMap[(unsigned char)C]&0x46)!=0) +#endif +#ifdef SQLITE_EBCDIC +SQLITE_PRIVATE const char sqlite3IsEbcdicIdChar[]; +#define IdChar(C) (((c=C)>=0x42 && sqlite3IsEbcdicIdChar[c-0x40])) +#endif +#endif /* SQLITE_AMALGAMATION */ + + +/* +** Token types used by the sqlite3_complete() routine. See the header +** comments on that procedure for additional information. +*/ +#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. +** +** Special handling is require for CREATE TRIGGER statements. +** Whenever the CREATE TRIGGER keywords are seen, the statement +** must end with ";END;". +** +** This implementation uses a state machine with 8 states: +** +** (0) INVALID We have not yet seen a non-whitespace character. +** +** (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. +** +** (2) NORMAL We are in the middle of statement which ends with a single +** semicolon. +** +** (3) EXPLAIN The keyword EXPLAIN has been seen at the beginning of +** a statement. +** +** (4) CREATE The keyword CREATE has been seen at the beginning of a +** statement, possibly preceded by EXPLAIN and/or followed by +** TEMP or TEMPORARY +** +** (5) TRIGGER We are in the middle of a trigger definition that must be +** ended by a semicolon, the keyword END, and another semicolon. +** +** (6) SEMI We've seen the first semicolon in the ";END;" that occurs at +** the end of a trigger definition. +** +** (7) END We've seen the ";END" of the ";END;" that occurs at the end +** of a trigger definition. +** +** Transitions between states above are determined by tokens extracted +** from the input. The following tokens are significant: +** +** (0) tkSEMI A semicolon. +** (1) tkWS Whitespace. +** (2) tkOTHER Any other SQL token. +** (3) tkEXPLAIN The "explain" keyword. +** (4) tkCREATE The "create" keyword. +** (5) tkTEMP The "temp" or "temporary" keyword. +** (6) tkTRIGGER The "trigger" keyword. +** (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 +** is look for a semicolon that is not part of an string or comment. +*/ +SQLITE_API int sqlite3_complete(const char *zSql){ + u8 state = 0; /* Current state, using numbers defined in header comment */ + u8 token; /* Value of the next token */ + +#ifndef SQLITE_OMIT_TRIGGER + /* A complex statement machine used to detect the end of a CREATE TRIGGER + ** statement. This is the normal case. + */ + static const u8 trans[8][8] = { + /* Token: */ + /* 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 supported by this compile then the statement machine + ** used to detect the end of a statement is much simpler + */ + static const u8 trans[3][3] = { + /* Token: */ + /* State: ** SEMI WS OTHER */ + /* 0 INVALID: */ { 1, 0, 2, }, + /* 1 START: */ { 1, 1, 2, }, + /* 2 NORMAL: */ { 1, 2, 2, }, + }; +#endif /* SQLITE_OMIT_TRIGGER */ + +#ifdef SQLITE_ENABLE_API_ARMOR + if( zSql==0 ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + + while( *zSql ){ + switch( *zSql ){ + case ';': { /* A semicolon */ + token = tkSEMI; + break; + } + case ' ': + case '\r': + case '\t': + case '\n': + case '\f': { /* White space is ignored */ + token = tkWS; + break; + } + case '/': { /* C-style comments */ + if( zSql[1]!='*' ){ + token = tkOTHER; + break; + } + zSql += 2; + while( zSql[0] && (zSql[0]!='*' || zSql[1]!='/') ){ zSql++; } + if( zSql[0]==0 ) return 0; + zSql++; + token = tkWS; + break; + } + case '-': { /* SQL-style comments from "--" to end of line */ + if( zSql[1]!='-' ){ + token = tkOTHER; + break; + } + while( *zSql && *zSql!='\n' ){ zSql++; } + if( *zSql==0 ) return state==1; + token = tkWS; + break; + } + case '[': { /* Microsoft-style identifiers in [...] */ + zSql++; + while( *zSql && *zSql!=']' ){ zSql++; } + if( *zSql==0 ) return 0; + token = tkOTHER; + break; + } + case '`': /* Grave-accent quoted symbols used by MySQL */ + case '"': /* single- and double-quoted strings */ + case '\'': { + int c = *zSql; + zSql++; + while( *zSql && *zSql!=c ){ zSql++; } + if( *zSql==0 ) return 0; + token = tkOTHER; + break; + } + default: { +#ifdef SQLITE_EBCDIC + unsigned char c; +#endif + if( IdChar((u8)*zSql) ){ + /* Keywords and unquoted identifiers */ + int nId; + for(nId=1; IdChar(zSql[nId]); nId++){} +#ifdef SQLITE_OMIT_TRIGGER + token = tkOTHER; +#else + switch( *zSql ){ + case 'c': case 'C': { + if( nId==6 && sqlite3StrNICmp(zSql, "create", 6)==0 ){ + token = tkCREATE; + }else{ + token = tkOTHER; + } + break; + } + case 't': case 'T': { + if( nId==7 && sqlite3StrNICmp(zSql, "trigger", 7)==0 ){ + token = tkTRIGGER; + }else if( nId==4 && sqlite3StrNICmp(zSql, "temp", 4)==0 ){ + token = tkTEMP; + }else if( nId==9 && sqlite3StrNICmp(zSql, "temporary", 9)==0 ){ + token = tkTEMP; + }else{ + token = tkOTHER; + } + break; + } + case 'e': case 'E': { + if( nId==3 && sqlite3StrNICmp(zSql, "end", 3)==0 ){ + token = tkEND; + }else +#ifndef SQLITE_OMIT_EXPLAIN + if( nId==7 && sqlite3StrNICmp(zSql, "explain", 7)==0 ){ + token = tkEXPLAIN; + }else +#endif + { + token = tkOTHER; + } + break; + } + default: { + token = tkOTHER; + break; + } + } +#endif /* SQLITE_OMIT_TRIGGER */ + zSql += nId-1; + }else{ + /* Operators and special symbols */ + token = tkOTHER; + } + break; + } + } + state = trans[state][token]; + zSql++; + } + return state==1; +} + +#ifndef SQLITE_OMIT_UTF16 +/* +** This routine is the same as the sqlite3_complete() routine described +** above, except that the parameter is required to be UTF-16 encoded, not +** UTF-8. +*/ +SQLITE_API int sqlite3_complete16(const void *zSql){ + sqlite3_value *pVal; + char const *zSql8; + int rc; + +#ifndef SQLITE_OMIT_AUTOINIT + rc = sqlite3_initialize(); + if( rc ) return rc; +#endif + pVal = sqlite3ValueNew(0); + sqlite3ValueSetStr(pVal, -1, zSql, SQLITE_UTF16NATIVE, SQLITE_STATIC); + zSql8 = sqlite3ValueText(pVal, SQLITE_UTF8); + if( zSql8 ){ + rc = sqlite3_complete(zSql8); + }else{ + rc = SQLITE_NOMEM_BKPT; + } + sqlite3ValueFree(pVal); + return rc & 0xff; +} +#endif /* SQLITE_OMIT_UTF16 */ +#endif /* SQLITE_OMIT_COMPLETE */ + +/************** End of complete.c ********************************************/ +/************** Begin file main.c ********************************************/ +/* +** 2001 September 15 +** +** 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. +** +************************************************************************* +** Main file for the SQLite library. The routines in this file +** 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. +*/ +/* #include "sqliteInt.h" */ + +#ifdef SQLITE_ENABLE_FTS3 +/************** Include fts3.h in the middle of main.c ***********************/ +/************** Begin file fts3.h ********************************************/ +/* +** 2006 Oct 10 +** +** 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 header file is used by programs that want to link against the +** FTS3 library. All it does is declare the sqlite3Fts3Init() interface. +*/ +/* #include "sqlite3.h" */ + +#if 0 +extern "C" { +#endif /* __cplusplus */ + +SQLITE_PRIVATE int sqlite3Fts3Init(sqlite3 *db); + +#if 0 +} /* extern "C" */ +#endif /* __cplusplus */ + +/************** End of fts3.h ************************************************/ +/************** Continuing where we left off in main.c ***********************/ +#endif +#ifdef SQLITE_ENABLE_RTREE +/************** Include rtree.h in the middle of main.c **********************/ +/************** Begin file rtree.h *******************************************/ +/* +** 2008 May 26 +** +** 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 header file is used by programs that want to link against the +** RTREE library. All it does is declare the sqlite3RtreeInit() interface. +*/ +/* #include "sqlite3.h" */ + +#if 0 +extern "C" { +#endif /* __cplusplus */ + +SQLITE_PRIVATE int sqlite3RtreeInit(sqlite3 *db); + +#if 0 +} /* extern "C" */ +#endif /* __cplusplus */ + +/************** End of rtree.h ***********************************************/ +/************** Continuing where we left off in main.c ***********************/ +#endif +#ifdef SQLITE_ENABLE_ICU +/************** Include sqliteicu.h in the middle of main.c ******************/ +/************** Begin file sqliteicu.h ***************************************/ +/* +** 2008 May 26 +** +** 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 header file is used by programs that want to link against the +** ICU extension. All it does is declare the sqlite3IcuInit() interface. +*/ +/* #include "sqlite3.h" */ + +#if 0 +extern "C" { +#endif /* __cplusplus */ + +SQLITE_PRIVATE int sqlite3IcuInit(sqlite3 *db); + +#if 0 +} /* extern "C" */ +#endif /* __cplusplus */ + + +/************** End of sqliteicu.h *******************************************/ +/************** Continuing where we left off in main.c ***********************/ +#endif +#ifdef SQLITE_ENABLE_JSON1 +SQLITE_PRIVATE int sqlite3Json1Init(sqlite3*); +#endif +#ifdef SQLITE_ENABLE_FTS5 +SQLITE_PRIVATE int sqlite3Fts5Init(sqlite3*); +#endif + +#ifndef SQLITE_AMALGAMATION +/* IMPLEMENTATION-OF: R-46656-45156 The sqlite3_version[] string constant +** contains the text of SQLITE_VERSION macro. +*/ +SQLITE_API const char sqlite3_version[] = SQLITE_VERSION; +#endif + +/* IMPLEMENTATION-OF: R-53536-42575 The sqlite3_libversion() function returns +** a pointer to the to the sqlite3_version[] string constant. +*/ +SQLITE_API const char *sqlite3_libversion(void){ return sqlite3_version; } + +/* IMPLEMENTATION-OF: R-63124-39300 The sqlite3_sourceid() function returns a +** pointer to a string constant whose value is the same as the +** SQLITE_SOURCE_ID C preprocessor macro. +*/ +SQLITE_API const char *sqlite3_sourceid(void){ return SQLITE_SOURCE_ID; } + +/* IMPLEMENTATION-OF: R-35210-63508 The sqlite3_libversion_number() function +** returns an integer equal to SQLITE_VERSION_NUMBER. +*/ +SQLITE_API int sqlite3_libversion_number(void){ return SQLITE_VERSION_NUMBER; } + +/* IMPLEMENTATION-OF: R-20790-14025 The sqlite3_threadsafe() function returns +** zero if and only if SQLite was compiled with mutexing code omitted due to +** the SQLITE_THREADSAFE compile-time option being set to 0. +*/ +SQLITE_API int sqlite3_threadsafe(void){ return SQLITE_THREADSAFE; } + +/* +** When compiling the test fixture or with debugging enabled (on Win32), +** this variable being set to non-zero will cause OSTRACE macros to emit +** extra diagnostic information. +*/ +#ifdef SQLITE_HAVE_OS_TRACE +# ifndef SQLITE_DEBUG_OS_TRACE +# define SQLITE_DEBUG_OS_TRACE 0 +# endif + int sqlite3OSTrace = SQLITE_DEBUG_OS_TRACE; +#endif + +#if !defined(SQLITE_OMIT_TRACE) && defined(SQLITE_ENABLE_IOTRACE) +/* +** If the following function pointer is not NULL and if +** SQLITE_ENABLE_IOTRACE is enabled, then messages describing +** I/O active are written using this function. These messages +** are intended for debugging activity only. +*/ +SQLITE_API void (SQLITE_CDECL *sqlite3IoTrace)(const char*, ...) = 0; +#endif + +/* +** If the following global variable points to a string which is the +** name of a directory, then that directory will be used to store +** temporary files. +** +** See also the "PRAGMA temp_store_directory" SQL command. +*/ +SQLITE_API char *sqlite3_temp_directory = 0; + +/* +** If the following global variable points to a string which is the +** name of a directory, then that directory will be used to store +** all database files specified with a relative pathname. +** +** See also the "PRAGMA data_store_directory" SQL command. +*/ +SQLITE_API char *sqlite3_data_directory = 0; + +/* +** Initialize SQLite. +** +** This routine must be called to initialize the memory allocation, +** VFS, and mutex subsystems prior to doing any serious work with +** SQLite. But as long as you do not compile with SQLITE_OMIT_AUTOINIT +** this routine will be called automatically by key routines such as +** sqlite3_open(). +** +** This routine is a no-op except on its very first call for the process, +** or for the first call after a call to sqlite3_shutdown. +** +** The first thread to call this routine runs the initialization to +** completion. If subsequent threads call this routine before the first +** thread has finished the initialization process, then the subsequent +** threads must block until the first thread finishes with the initialization. +** +** The first thread might call this routine recursively. Recursive +** calls to this routine should not block, of course. Otherwise the +** initialization process would never complete. +** +** Let X be the first thread to enter this routine. Let Y be some other +** thread. Then while the initial invocation of this routine by X is +** incomplete, it is required that: +** +** * Calls to this routine from Y must block until the outer-most +** call by X completes. +** +** * Recursive calls to this routine from thread X return immediately +** without blocking. +*/ +SQLITE_API int sqlite3_initialize(void){ + MUTEX_LOGIC( sqlite3_mutex *pMaster; ) /* The main static mutex */ + int rc; /* Result code */ +#ifdef SQLITE_EXTRA_INIT + int bRunExtraInit = 0; /* Extra initialization needed */ +#endif + +#ifdef SQLITE_OMIT_WSD + rc = sqlite3_wsd_init(4096, 24); + if( rc!=SQLITE_OK ){ + return rc; + } +#endif + + /* If the following assert() fails on some obscure processor/compiler + ** combination, the work-around is to set the correct pointer + ** size at compile-time using -DSQLITE_PTRSIZE=n compile-time option */ + assert( SQLITE_PTRSIZE==sizeof(char*) ); + + /* If SQLite is already completely initialized, then this call + ** to sqlite3_initialize() should be a no-op. But the initialization + ** must be complete. So isInit must not be set until the very end + ** of this routine. + */ + if( sqlite3GlobalConfig.isInit ) return SQLITE_OK; + + /* Make sure the mutex subsystem is initialized. If unable to + ** initialize the mutex subsystem, return early with the error. + ** If the system is so sick that we are unable to allocate a mutex, + ** there is not much SQLite is going to be able to do. + ** + ** The mutex subsystem must take care of serializing its own + ** initialization. + */ + rc = sqlite3MutexInit(); + if( rc ) return rc; + + /* Initialize the malloc() system and the recursive pInitMutex mutex. + ** This operation is protected by the STATIC_MASTER mutex. Note that + ** MutexAlloc() is called for a static mutex prior to initializing the + ** malloc subsystem - this implies that the allocation of a static + ** mutex must not require support from the malloc subsystem. + */ + MUTEX_LOGIC( pMaster = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); ) + sqlite3_mutex_enter(pMaster); + sqlite3GlobalConfig.isMutexInit = 1; + if( !sqlite3GlobalConfig.isMallocInit ){ + rc = sqlite3MallocInit(); + } + if( rc==SQLITE_OK ){ + sqlite3GlobalConfig.isMallocInit = 1; + if( !sqlite3GlobalConfig.pInitMutex ){ + sqlite3GlobalConfig.pInitMutex = + sqlite3MutexAlloc(SQLITE_MUTEX_RECURSIVE); + if( sqlite3GlobalConfig.bCoreMutex && !sqlite3GlobalConfig.pInitMutex ){ + rc = SQLITE_NOMEM_BKPT; + } + } + } + if( rc==SQLITE_OK ){ + sqlite3GlobalConfig.nRefInitMutex++; + } + sqlite3_mutex_leave(pMaster); + + /* If rc is not SQLITE_OK at this point, then either the malloc + ** subsystem could not be initialized or the system failed to allocate + ** the pInitMutex mutex. Return an error in either case. */ + if( rc!=SQLITE_OK ){ + return rc; + } + + /* Do the rest of the initialization under the recursive mutex so + ** that we will be able to handle recursive calls into + ** sqlite3_initialize(). The recursive calls normally come through + ** sqlite3_os_init() when it invokes sqlite3_vfs_register(), but other + ** recursive calls might also be possible. + ** + ** IMPLEMENTATION-OF: R-00140-37445 SQLite automatically serializes calls + ** to the xInit method, so the xInit method need not be threadsafe. + ** + ** The following mutex is what serializes access to the appdef pcache xInit + ** methods. The sqlite3_pcache_methods.xInit() all is embedded in the + ** call to sqlite3PcacheInitialize(). + */ + sqlite3_mutex_enter(sqlite3GlobalConfig.pInitMutex); + if( sqlite3GlobalConfig.isInit==0 && sqlite3GlobalConfig.inProgress==0 ){ + sqlite3GlobalConfig.inProgress = 1; +#ifdef SQLITE_ENABLE_SQLLOG + { + extern void sqlite3_init_sqllog(void); + sqlite3_init_sqllog(); + } +#endif + memset(&sqlite3BuiltinFunctions, 0, sizeof(sqlite3BuiltinFunctions)); + sqlite3RegisterBuiltinFunctions(); + if( sqlite3GlobalConfig.isPCacheInit==0 ){ + rc = sqlite3PcacheInitialize(); + } + if( rc==SQLITE_OK ){ + sqlite3GlobalConfig.isPCacheInit = 1; + rc = sqlite3OsInit(); + } + if( rc==SQLITE_OK ){ + sqlite3PCacheBufferSetup( sqlite3GlobalConfig.pPage, + sqlite3GlobalConfig.szPage, sqlite3GlobalConfig.nPage); + sqlite3GlobalConfig.isInit = 1; +#ifdef SQLITE_EXTRA_INIT + bRunExtraInit = 1; +#endif + } + sqlite3GlobalConfig.inProgress = 0; + } + sqlite3_mutex_leave(sqlite3GlobalConfig.pInitMutex); + + /* Go back under the static mutex and clean up the recursive + ** mutex to prevent a resource leak. + */ + sqlite3_mutex_enter(pMaster); + sqlite3GlobalConfig.nRefInitMutex--; + if( sqlite3GlobalConfig.nRefInitMutex<=0 ){ + assert( sqlite3GlobalConfig.nRefInitMutex==0 ); + sqlite3_mutex_free(sqlite3GlobalConfig.pInitMutex); + sqlite3GlobalConfig.pInitMutex = 0; + } + sqlite3_mutex_leave(pMaster); + + /* The following is just a sanity check to make sure SQLite has + ** been compiled correctly. It is important to run this code, but + ** we don't want to run it too often and soak up CPU cycles for no + ** reason. So we run it once during initialization. + */ +#ifndef NDEBUG +#ifndef SQLITE_OMIT_FLOATING_POINT + /* This section of code's only "output" is via assert() statements. */ + if ( rc==SQLITE_OK ){ + u64 x = (((u64)1)<<63)-1; + double y; + assert(sizeof(x)==8); + assert(sizeof(x)==sizeof(y)); + memcpy(&y, &x, 8); + assert( sqlite3IsNaN(y) ); + } +#endif +#endif + + /* Do extra initialization steps requested by the SQLITE_EXTRA_INIT + ** compile-time option. + */ +#ifdef SQLITE_EXTRA_INIT + if( bRunExtraInit ){ + int SQLITE_EXTRA_INIT(const char*); + rc = SQLITE_EXTRA_INIT(0); + } +#endif + + return rc; +} + +/* +** Undo the effects of sqlite3_initialize(). Must not be called while +** there are outstanding database connections or memory allocations or +** while any part of SQLite is otherwise in use in any thread. This +** routine is not threadsafe. But it is safe to invoke this routine +** on when SQLite is already shut down. If SQLite is already shut down +** when this routine is invoked, then this routine is a harmless no-op. +*/ +SQLITE_API int sqlite3_shutdown(void){ +#ifdef SQLITE_OMIT_WSD + int rc = sqlite3_wsd_init(4096, 24); + if( rc!=SQLITE_OK ){ + return rc; + } +#endif + + if( sqlite3GlobalConfig.isInit ){ +#ifdef SQLITE_EXTRA_SHUTDOWN + void SQLITE_EXTRA_SHUTDOWN(void); + SQLITE_EXTRA_SHUTDOWN(); +#endif + sqlite3_os_end(); + sqlite3_reset_auto_extension(); + sqlite3GlobalConfig.isInit = 0; + } + if( sqlite3GlobalConfig.isPCacheInit ){ + sqlite3PcacheShutdown(); + sqlite3GlobalConfig.isPCacheInit = 0; + } + if( sqlite3GlobalConfig.isMallocInit ){ + sqlite3MallocEnd(); + sqlite3GlobalConfig.isMallocInit = 0; + +#ifndef SQLITE_OMIT_SHUTDOWN_DIRECTORIES + /* The heap subsystem has now been shutdown and these values are supposed + ** to be NULL or point to memory that was obtained from sqlite3_malloc(), + ** which would rely on that heap subsystem; therefore, make sure these + ** values cannot refer to heap memory that was just invalidated when the + ** heap subsystem was shutdown. This is only done if the current call to + ** this function resulted in the heap subsystem actually being shutdown. + */ + sqlite3_data_directory = 0; + sqlite3_temp_directory = 0; +#endif + } + if( sqlite3GlobalConfig.isMutexInit ){ + sqlite3MutexEnd(); + sqlite3GlobalConfig.isMutexInit = 0; + } + + return SQLITE_OK; +} + +/* +** This API allows applications to modify the global configuration of +** the SQLite library at run-time. +** +** This routine should only be called when there are no outstanding +** database connections or memory allocations. This routine is not +** threadsafe. Failure to heed these warnings can lead to unpredictable +** behavior. +*/ +SQLITE_API int sqlite3_config(int op, ...){ + va_list ap; + int rc = SQLITE_OK; + + /* sqlite3_config() shall return SQLITE_MISUSE if it is invoked while + ** the SQLite library is in use. */ + if( sqlite3GlobalConfig.isInit ) return SQLITE_MISUSE_BKPT; + + va_start(ap, op); + switch( op ){ + + /* Mutex configuration options are only available in a threadsafe + ** compile. + */ +#if defined(SQLITE_THREADSAFE) && SQLITE_THREADSAFE>0 /* IMP: R-54466-46756 */ + case SQLITE_CONFIG_SINGLETHREAD: { + /* EVIDENCE-OF: R-02748-19096 This option sets the threading mode to + ** Single-thread. */ + sqlite3GlobalConfig.bCoreMutex = 0; /* Disable mutex on core */ + sqlite3GlobalConfig.bFullMutex = 0; /* Disable mutex on connections */ + break; + } +#endif +#if defined(SQLITE_THREADSAFE) && SQLITE_THREADSAFE>0 /* IMP: R-20520-54086 */ + case SQLITE_CONFIG_MULTITHREAD: { + /* EVIDENCE-OF: R-14374-42468 This option sets the threading mode to + ** Multi-thread. */ + sqlite3GlobalConfig.bCoreMutex = 1; /* Enable mutex on core */ + sqlite3GlobalConfig.bFullMutex = 0; /* Disable mutex on connections */ + break; + } +#endif +#if defined(SQLITE_THREADSAFE) && SQLITE_THREADSAFE>0 /* IMP: R-59593-21810 */ + case SQLITE_CONFIG_SERIALIZED: { + /* EVIDENCE-OF: R-41220-51800 This option sets the threading mode to + ** Serialized. */ + sqlite3GlobalConfig.bCoreMutex = 1; /* Enable mutex on core */ + sqlite3GlobalConfig.bFullMutex = 1; /* Enable mutex on connections */ + break; + } +#endif +#if defined(SQLITE_THREADSAFE) && SQLITE_THREADSAFE>0 /* IMP: R-63666-48755 */ + case SQLITE_CONFIG_MUTEX: { + /* Specify an alternative mutex implementation */ + sqlite3GlobalConfig.mutex = *va_arg(ap, sqlite3_mutex_methods*); + break; + } +#endif +#if defined(SQLITE_THREADSAFE) && SQLITE_THREADSAFE>0 /* IMP: R-14450-37597 */ + case SQLITE_CONFIG_GETMUTEX: { + /* Retrieve the current mutex implementation */ + *va_arg(ap, sqlite3_mutex_methods*) = sqlite3GlobalConfig.mutex; + break; + } +#endif + + case SQLITE_CONFIG_MALLOC: { + /* EVIDENCE-OF: R-55594-21030 The SQLITE_CONFIG_MALLOC 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. */ + sqlite3GlobalConfig.m = *va_arg(ap, sqlite3_mem_methods*); + break; + } + case SQLITE_CONFIG_GETMALLOC: { + /* EVIDENCE-OF: R-51213-46414 The SQLITE_CONFIG_GETMALLOC 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. */ + if( sqlite3GlobalConfig.m.xMalloc==0 ) sqlite3MemSetDefault(); + *va_arg(ap, sqlite3_mem_methods*) = sqlite3GlobalConfig.m; + break; + } + case SQLITE_CONFIG_MEMSTATUS: { + /* EVIDENCE-OF: R-61275-35157 The SQLITE_CONFIG_MEMSTATUS option takes + ** single argument of type int, interpreted as a boolean, which enables + ** or disables the collection of memory allocation statistics. */ + sqlite3GlobalConfig.bMemstat = va_arg(ap, int); + break; + } + case SQLITE_CONFIG_SCRATCH: { + /* EVIDENCE-OF: R-08404-60887 There are three arguments to + ** SQLITE_CONFIG_SCRATCH: A pointer an 8-byte aligned memory buffer from + ** which the scratch allocations will be drawn, the size of each scratch + ** allocation (sz), and the maximum number of scratch allocations (N). */ + sqlite3GlobalConfig.pScratch = va_arg(ap, void*); + sqlite3GlobalConfig.szScratch = va_arg(ap, int); + sqlite3GlobalConfig.nScratch = va_arg(ap, int); + break; + } + case SQLITE_CONFIG_PAGECACHE: { + /* EVIDENCE-OF: R-18761-36601 There are three arguments to + ** SQLITE_CONFIG_PAGECACHE: A pointer to 8-byte aligned memory (pMem), + ** the size of each page cache line (sz), and the number of cache lines + ** (N). */ + sqlite3GlobalConfig.pPage = va_arg(ap, void*); + sqlite3GlobalConfig.szPage = va_arg(ap, int); + sqlite3GlobalConfig.nPage = va_arg(ap, int); + break; + } + case SQLITE_CONFIG_PCACHE_HDRSZ: { + /* EVIDENCE-OF: R-39100-27317 The SQLITE_CONFIG_PCACHE_HDRSZ option takes + ** a single parameter which is a pointer to an integer and writes into + ** that integer the number of extra bytes per page required for each page + ** in SQLITE_CONFIG_PAGECACHE. */ + *va_arg(ap, int*) = + sqlite3HeaderSizeBtree() + + sqlite3HeaderSizePcache() + + sqlite3HeaderSizePcache1(); + break; + } + + case SQLITE_CONFIG_PCACHE: { + /* no-op */ + break; + } + case SQLITE_CONFIG_GETPCACHE: { + /* now an error */ + rc = SQLITE_ERROR; + break; + } + + case SQLITE_CONFIG_PCACHE2: { + /* EVIDENCE-OF: R-63325-48378 The SQLITE_CONFIG_PCACHE2 option takes a + ** single argument which is a pointer to an sqlite3_pcache_methods2 + ** object. This object specifies the interface to a custom page cache + ** implementation. */ + sqlite3GlobalConfig.pcache2 = *va_arg(ap, sqlite3_pcache_methods2*); + break; + } + case SQLITE_CONFIG_GETPCACHE2: { + /* EVIDENCE-OF: R-22035-46182 The SQLITE_CONFIG_GETPCACHE2 option takes a + ** single argument which is a pointer to an sqlite3_pcache_methods2 + ** object. SQLite copies of the current page cache implementation into + ** that object. */ + if( sqlite3GlobalConfig.pcache2.xInit==0 ){ + sqlite3PCacheSetDefault(); + } + *va_arg(ap, sqlite3_pcache_methods2*) = sqlite3GlobalConfig.pcache2; + break; + } + +/* EVIDENCE-OF: R-06626-12911 The SQLITE_CONFIG_HEAP option is only +** available if SQLite is compiled with either SQLITE_ENABLE_MEMSYS3 or +** SQLITE_ENABLE_MEMSYS5 and returns SQLITE_ERROR if invoked otherwise. */ +#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5) + case SQLITE_CONFIG_HEAP: { + /* EVIDENCE-OF: R-19854-42126 There are three arguments to + ** SQLITE_CONFIG_HEAP: An 8-byte aligned pointer to the memory, the + ** number of bytes in the memory buffer, and the minimum allocation size. + */ + sqlite3GlobalConfig.pHeap = va_arg(ap, void*); + sqlite3GlobalConfig.nHeap = va_arg(ap, int); + sqlite3GlobalConfig.mnReq = va_arg(ap, int); + + if( sqlite3GlobalConfig.mnReq<1 ){ + sqlite3GlobalConfig.mnReq = 1; + }else if( sqlite3GlobalConfig.mnReq>(1<<12) ){ + /* cap min request size at 2^12 */ + sqlite3GlobalConfig.mnReq = (1<<12); + } + + if( sqlite3GlobalConfig.pHeap==0 ){ + /* EVIDENCE-OF: R-49920-60189 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. + ** + ** Setting sqlite3GlobalConfig.m to all zeros will cause malloc to + ** revert to its default implementation when sqlite3_initialize() is run + */ + memset(&sqlite3GlobalConfig.m, 0, sizeof(sqlite3GlobalConfig.m)); + }else{ + /* EVIDENCE-OF: R-61006-08918 If the memory pointer is not NULL then the + ** alternative memory allocator is engaged to handle all of SQLites + ** memory allocation needs. */ +#ifdef SQLITE_ENABLE_MEMSYS3 + sqlite3GlobalConfig.m = *sqlite3MemGetMemsys3(); +#endif +#ifdef SQLITE_ENABLE_MEMSYS5 + sqlite3GlobalConfig.m = *sqlite3MemGetMemsys5(); +#endif + } + break; + } +#endif + + case SQLITE_CONFIG_LOOKASIDE: { + sqlite3GlobalConfig.szLookaside = va_arg(ap, int); + sqlite3GlobalConfig.nLookaside = va_arg(ap, int); + break; + } + + /* Record a pointer to the logger function and its first argument. + ** The default is NULL. Logging is disabled if the function pointer is + ** NULL. + */ + case SQLITE_CONFIG_LOG: { + /* MSVC is picky about pulling func ptrs from va lists. + ** http://support.microsoft.com/kb/47961 + ** sqlite3GlobalConfig.xLog = va_arg(ap, void(*)(void*,int,const char*)); + */ + typedef void(*LOGFUNC_t)(void*,int,const char*); + sqlite3GlobalConfig.xLog = va_arg(ap, LOGFUNC_t); + sqlite3GlobalConfig.pLogArg = va_arg(ap, void*); + break; + } + + /* EVIDENCE-OF: R-55548-33817 The compile-time setting for URI filenames + ** can be changed at start-time using the + ** sqlite3_config(SQLITE_CONFIG_URI,1) or + ** sqlite3_config(SQLITE_CONFIG_URI,0) configuration calls. + */ + case SQLITE_CONFIG_URI: { + /* EVIDENCE-OF: R-25451-61125 The SQLITE_CONFIG_URI option takes a single + ** argument of type int. If non-zero, then URI handling is globally + ** enabled. If the parameter is zero, then URI handling is globally + ** disabled. */ + sqlite3GlobalConfig.bOpenUri = va_arg(ap, int); + break; + } + + case SQLITE_CONFIG_COVERING_INDEX_SCAN: { + /* EVIDENCE-OF: R-36592-02772 The SQLITE_CONFIG_COVERING_INDEX_SCAN + ** option takes a single integer argument which is interpreted as a + ** boolean in order to enable or disable the use of covering indices for + ** full table scans in the query optimizer. */ + sqlite3GlobalConfig.bUseCis = va_arg(ap, int); + break; + } + +#ifdef SQLITE_ENABLE_SQLLOG + case SQLITE_CONFIG_SQLLOG: { + typedef void(*SQLLOGFUNC_t)(void*, sqlite3*, const char*, int); + sqlite3GlobalConfig.xSqllog = va_arg(ap, SQLLOGFUNC_t); + sqlite3GlobalConfig.pSqllogArg = va_arg(ap, void *); + break; + } +#endif + + case SQLITE_CONFIG_MMAP_SIZE: { + /* EVIDENCE-OF: R-58063-38258 SQLITE_CONFIG_MMAP_SIZE takes two 64-bit + ** integer (sqlite3_int64) values that are the default mmap size limit + ** (the default setting for PRAGMA mmap_size) and the maximum allowed + ** mmap size limit. */ + sqlite3_int64 szMmap = va_arg(ap, sqlite3_int64); + sqlite3_int64 mxMmap = va_arg(ap, sqlite3_int64); + /* EVIDENCE-OF: R-53367-43190 If either argument to this option is + ** negative, then that argument is changed to its compile-time default. + ** + ** EVIDENCE-OF: R-34993-45031 The maximum allowed mmap size will be + ** silently truncated if necessary so that it does not exceed the + ** compile-time maximum mmap size set by the SQLITE_MAX_MMAP_SIZE + ** compile-time option. + */ + if( mxMmap<0 || mxMmap>SQLITE_MAX_MMAP_SIZE ){ + mxMmap = SQLITE_MAX_MMAP_SIZE; + } + if( szMmap<0 ) szMmap = SQLITE_DEFAULT_MMAP_SIZE; + if( szMmap>mxMmap) szMmap = mxMmap; + sqlite3GlobalConfig.mxMmap = mxMmap; + sqlite3GlobalConfig.szMmap = szMmap; + break; + } + +#if SQLITE_OS_WIN && defined(SQLITE_WIN32_MALLOC) /* IMP: R-04780-55815 */ + case SQLITE_CONFIG_WIN32_HEAPSIZE: { + /* EVIDENCE-OF: R-34926-03360 SQLITE_CONFIG_WIN32_HEAPSIZE takes a 32-bit + ** unsigned integer value that specifies the maximum size of the created + ** heap. */ + sqlite3GlobalConfig.nHeap = va_arg(ap, int); + break; + } +#endif + + case SQLITE_CONFIG_PMASZ: { + sqlite3GlobalConfig.szPma = va_arg(ap, unsigned int); + break; + } + + case SQLITE_CONFIG_STMTJRNL_SPILL: { + sqlite3GlobalConfig.nStmtSpill = va_arg(ap, int); + break; + } + + default: { + rc = SQLITE_ERROR; + break; + } + } + va_end(ap); + return rc; +} + +/* +** Set up the lookaside buffers for a database connection. +** Return SQLITE_OK on success. +** If lookaside is already active, return SQLITE_BUSY. +** +** The sz parameter is the number of bytes in each lookaside slot. +** The cnt parameter is the number of slots. If pStart is NULL the +** space for the lookaside memory is obtained from sqlite3_malloc(). +** If pStart is not NULL then it is sz*cnt bytes of memory to use for +** the lookaside memory. +*/ +static int setupLookaside(sqlite3 *db, void *pBuf, int sz, int cnt){ +#ifndef SQLITE_OMIT_LOOKASIDE + void *pStart; + if( db->lookaside.nOut ){ + return SQLITE_BUSY; + } + /* Free any existing lookaside buffer for this handle before + ** allocating a new one so we don't have to have space for + ** both at the same time. + */ + if( db->lookaside.bMalloced ){ + sqlite3_free(db->lookaside.pStart); + } + /* The size of a lookaside slot after ROUNDDOWN8 needs to be larger + ** than a pointer to be useful. + */ + sz = ROUNDDOWN8(sz); /* IMP: R-33038-09382 */ + if( sz<=(int)sizeof(LookasideSlot*) ) sz = 0; + if( cnt<0 ) cnt = 0; + if( sz==0 || cnt==0 ){ + sz = 0; + pStart = 0; + }else if( pBuf==0 ){ + sqlite3BeginBenignMalloc(); + pStart = sqlite3Malloc( sz*cnt ); /* IMP: R-61949-35727 */ + sqlite3EndBenignMalloc(); + if( pStart ) cnt = sqlite3MallocSize(pStart)/sz; + }else{ + pStart = pBuf; + } + db->lookaside.pStart = pStart; + db->lookaside.pFree = 0; + db->lookaside.sz = (u16)sz; + if( pStart ){ + int i; + LookasideSlot *p; + assert( sz > (int)sizeof(LookasideSlot*) ); + p = (LookasideSlot*)pStart; + for(i=cnt-1; i>=0; i--){ + p->pNext = db->lookaside.pFree; + db->lookaside.pFree = p; + p = (LookasideSlot*)&((u8*)p)[sz]; + } + db->lookaside.pEnd = p; + db->lookaside.bDisable = 0; + db->lookaside.bMalloced = pBuf==0 ?1:0; + }else{ + db->lookaside.pStart = db; + db->lookaside.pEnd = db; + db->lookaside.bDisable = 1; + db->lookaside.bMalloced = 0; + } +#endif /* SQLITE_OMIT_LOOKASIDE */ + return SQLITE_OK; +} + +/* +** Return the mutex associated with a database connection. +*/ +SQLITE_API sqlite3_mutex *sqlite3_db_mutex(sqlite3 *db){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + return db->mutex; +} + +/* +** Free up as much memory as we can from the given database +** connection. +*/ +SQLITE_API int sqlite3_db_release_memory(sqlite3 *db){ + int i; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; +#endif + sqlite3_mutex_enter(db->mutex); + sqlite3BtreeEnterAll(db); + for(i=0; inDb; i++){ + Btree *pBt = db->aDb[i].pBt; + if( pBt ){ + Pager *pPager = sqlite3BtreePager(pBt); + sqlite3PagerShrink(pPager); + } + } + sqlite3BtreeLeaveAll(db); + sqlite3_mutex_leave(db->mutex); + return SQLITE_OK; +} + +/* +** Flush any dirty pages in the pager-cache for any attached database +** to disk. +*/ +SQLITE_API int sqlite3_db_cacheflush(sqlite3 *db){ + int i; + int rc = SQLITE_OK; + int bSeenBusy = 0; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; +#endif + sqlite3_mutex_enter(db->mutex); + sqlite3BtreeEnterAll(db); + for(i=0; rc==SQLITE_OK && inDb; i++){ + Btree *pBt = db->aDb[i].pBt; + if( pBt && sqlite3BtreeIsInTrans(pBt) ){ + Pager *pPager = sqlite3BtreePager(pBt); + rc = sqlite3PagerFlush(pPager); + if( rc==SQLITE_BUSY ){ + bSeenBusy = 1; + rc = SQLITE_OK; + } + } + } + sqlite3BtreeLeaveAll(db); + sqlite3_mutex_leave(db->mutex); + return ((rc==SQLITE_OK && bSeenBusy) ? SQLITE_BUSY : rc); +} + +/* +** Configuration settings for an individual database connection +*/ +SQLITE_API int sqlite3_db_config(sqlite3 *db, int op, ...){ + va_list ap; + int rc; + va_start(ap, op); + switch( op ){ + case SQLITE_DBCONFIG_MAINDBNAME: { + db->aDb[0].zDbSName = va_arg(ap,char*); + rc = SQLITE_OK; + break; + } + case SQLITE_DBCONFIG_LOOKASIDE: { + void *pBuf = va_arg(ap, void*); /* IMP: R-26835-10964 */ + int sz = va_arg(ap, int); /* IMP: R-47871-25994 */ + int cnt = va_arg(ap, int); /* IMP: R-04460-53386 */ + rc = setupLookaside(db, pBuf, sz, cnt); + break; + } + default: { + static const struct { + int op; /* The opcode */ + u32 mask; /* Mask of the bit in sqlite3.flags to set/clear */ + } aFlagOp[] = { + { SQLITE_DBCONFIG_ENABLE_FKEY, SQLITE_ForeignKeys }, + { SQLITE_DBCONFIG_ENABLE_TRIGGER, SQLITE_EnableTrigger }, + { SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER, SQLITE_Fts3Tokenizer }, + { SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION, SQLITE_LoadExtension }, + }; + unsigned int i; + rc = SQLITE_ERROR; /* IMP: R-42790-23372 */ + for(i=0; iflags; + if( onoff>0 ){ + db->flags |= aFlagOp[i].mask; + }else if( onoff==0 ){ + db->flags &= ~aFlagOp[i].mask; + } + if( oldFlags!=db->flags ){ + sqlite3ExpirePreparedStatements(db); + } + if( pRes ){ + *pRes = (db->flags & aFlagOp[i].mask)!=0; + } + rc = SQLITE_OK; + break; + } + } + break; + } + } + va_end(ap); + return rc; +} + + +/* +** Return true if the buffer z[0..n-1] contains all spaces. +*/ +static int allSpaces(const char *z, int n){ + while( n>0 && z[n-1]==' ' ){ n--; } + return n==0; +} + +/* +** This is the default collating function named "BINARY" which is always +** available. +** +** If the padFlag argument is not NULL then space padding at the end +** of strings is ignored. This implements the RTRIM collation. +*/ +static int binCollFunc( + void *padFlag, + int nKey1, const void *pKey1, + int nKey2, const void *pKey2 +){ + int rc, n; + n = nKey1lastRowid; +} + +/* +** Return the number of changes in the most recent call to sqlite3_exec(). +*/ +SQLITE_API int sqlite3_changes(sqlite3 *db){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + return db->nChange; +} + +/* +** Return the number of changes since the database handle was opened. +*/ +SQLITE_API int sqlite3_total_changes(sqlite3 *db){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + return db->nTotalChange; +} + +/* +** Close all open savepoints. This function only manipulates fields of the +** database handle object, it does not close any savepoints that may be open +** at the b-tree/pager level. +*/ +SQLITE_PRIVATE void sqlite3CloseSavepoints(sqlite3 *db){ + while( db->pSavepoint ){ + Savepoint *pTmp = db->pSavepoint; + db->pSavepoint = pTmp->pNext; + sqlite3DbFree(db, pTmp); + } + db->nSavepoint = 0; + db->nStatement = 0; + db->isTransactionSavepoint = 0; +} + +/* +** Invoke the destructor function associated with FuncDef p, if any. Except, +** if this is not the last copy of the function, do not invoke it. Multiple +** copies of a single function are created when create_function() is called +** with SQLITE_ANY as the encoding. +*/ +static void functionDestroy(sqlite3 *db, FuncDef *p){ + FuncDestructor *pDestructor = p->u.pDestructor; + if( pDestructor ){ + pDestructor->nRef--; + if( pDestructor->nRef==0 ){ + pDestructor->xDestroy(pDestructor->pUserData); + sqlite3DbFree(db, pDestructor); + } + } +} + +/* +** Disconnect all sqlite3_vtab objects that belong to database connection +** db. This is called when db is being closed. +*/ +static void disconnectAllVtab(sqlite3 *db){ +#ifndef SQLITE_OMIT_VIRTUALTABLE + int i; + HashElem *p; + sqlite3BtreeEnterAll(db); + for(i=0; inDb; i++){ + Schema *pSchema = db->aDb[i].pSchema; + if( db->aDb[i].pSchema ){ + for(p=sqliteHashFirst(&pSchema->tblHash); p; p=sqliteHashNext(p)){ + Table *pTab = (Table *)sqliteHashData(p); + if( IsVirtual(pTab) ) sqlite3VtabDisconnect(db, pTab); + } + } + } + for(p=sqliteHashFirst(&db->aModule); p; p=sqliteHashNext(p)){ + Module *pMod = (Module *)sqliteHashData(p); + if( pMod->pEpoTab ){ + sqlite3VtabDisconnect(db, pMod->pEpoTab); + } + } + sqlite3VtabUnlockList(db); + sqlite3BtreeLeaveAll(db); +#else + UNUSED_PARAMETER(db); +#endif +} + +/* +** Return TRUE if database connection db has unfinalized prepared +** statements or unfinished sqlite3_backup objects. +*/ +static int connectionIsBusy(sqlite3 *db){ + int j; + assert( sqlite3_mutex_held(db->mutex) ); + if( db->pVdbe ) return 1; + for(j=0; jnDb; j++){ + Btree *pBt = db->aDb[j].pBt; + if( pBt && sqlite3BtreeIsInBackup(pBt) ) return 1; + } + return 0; +} + +/* +** Close an existing SQLite database +*/ +static int sqlite3Close(sqlite3 *db, int forceZombie){ + if( !db ){ + /* EVIDENCE-OF: R-63257-11740 Calling sqlite3_close() or + ** sqlite3_close_v2() with a NULL pointer argument is a harmless no-op. */ + return SQLITE_OK; + } + if( !sqlite3SafetyCheckSickOrOk(db) ){ + return SQLITE_MISUSE_BKPT; + } + sqlite3_mutex_enter(db->mutex); + if( db->mTrace & SQLITE_TRACE_CLOSE ){ + db->xTrace(SQLITE_TRACE_CLOSE, db->pTraceArg, db, 0); + } + + /* Force xDisconnect calls on all virtual tables */ + disconnectAllVtab(db); + + /* If a transaction is open, the disconnectAllVtab() call above + ** will not have called the xDisconnect() method on any virtual + ** tables in the db->aVTrans[] array. The following sqlite3VtabRollback() + ** call will do so. We need to do this before the check for active + ** SQL statements below, as the v-table implementation may be storing + ** some prepared statements internally. + */ + sqlite3VtabRollback(db); + + /* Legacy behavior (sqlite3_close() behavior) is to return + ** SQLITE_BUSY if the connection can not be closed immediately. + */ + if( !forceZombie && connectionIsBusy(db) ){ + sqlite3ErrorWithMsg(db, SQLITE_BUSY, "unable to close due to unfinalized " + "statements or unfinished backups"); + sqlite3_mutex_leave(db->mutex); + return SQLITE_BUSY; + } + +#ifdef SQLITE_ENABLE_SQLLOG + if( sqlite3GlobalConfig.xSqllog ){ + /* Closing the handle. Fourth parameter is passed the value 2. */ + sqlite3GlobalConfig.xSqllog(sqlite3GlobalConfig.pSqllogArg, db, 0, 2); + } +#endif + + /* Convert the connection into a zombie and then close it. + */ + db->magic = SQLITE_MAGIC_ZOMBIE; + sqlite3LeaveMutexAndCloseZombie(db); + return SQLITE_OK; +} + +/* +** Two variations on the public interface for closing a database +** connection. The sqlite3_close() version returns SQLITE_BUSY and +** leaves the connection option if there are unfinalized prepared +** statements or unfinished sqlite3_backups. The sqlite3_close_v2() +** version forces the connection to become a zombie if there are +** unclosed resources, and arranges for deallocation when the last +** prepare statement or sqlite3_backup closes. +*/ +SQLITE_API int sqlite3_close(sqlite3 *db){ return sqlite3Close(db,0); } +SQLITE_API int sqlite3_close_v2(sqlite3 *db){ return sqlite3Close(db,1); } + + +/* +** Close the mutex on database connection db. +** +** Furthermore, if database connection db is a zombie (meaning that there +** has been a prior call to sqlite3_close(db) or sqlite3_close_v2(db)) and +** every sqlite3_stmt has now been finalized and every sqlite3_backup has +** finished, then free all resources. +*/ +SQLITE_PRIVATE void sqlite3LeaveMutexAndCloseZombie(sqlite3 *db){ + HashElem *i; /* Hash table iterator */ + int j; + + /* If there are outstanding sqlite3_stmt or sqlite3_backup objects + ** or if the connection has not yet been closed by sqlite3_close_v2(), + ** then just leave the mutex and return. + */ + if( db->magic!=SQLITE_MAGIC_ZOMBIE || connectionIsBusy(db) ){ + sqlite3_mutex_leave(db->mutex); + return; + } + + /* If we reach this point, it means that the database connection has + ** closed all sqlite3_stmt and sqlite3_backup objects and has been + ** passed to sqlite3_close (meaning that it is a zombie). Therefore, + ** go ahead and free all resources. + */ + + /* If a transaction is open, roll it back. This also ensures that if + ** any database schemas have been modified by an uncommitted transaction + ** they are reset. And that the required b-tree mutex is held to make + ** the pager rollback and schema reset an atomic operation. */ + sqlite3RollbackAll(db, SQLITE_OK); + + /* Free any outstanding Savepoint structures. */ + sqlite3CloseSavepoints(db); + + /* Close all database connections */ + for(j=0; jnDb; j++){ + struct Db *pDb = &db->aDb[j]; + if( pDb->pBt ){ + sqlite3BtreeClose(pDb->pBt); + pDb->pBt = 0; + if( j!=1 ){ + pDb->pSchema = 0; + } + } + } + /* Clear the TEMP schema separately and last */ + if( db->aDb[1].pSchema ){ + sqlite3SchemaClear(db->aDb[1].pSchema); + } + sqlite3VtabUnlockList(db); + + /* Free up the array of auxiliary databases */ + sqlite3CollapseDatabaseArray(db); + assert( db->nDb<=2 ); + assert( db->aDb==db->aDbStatic ); + + /* Tell the code in notify.c that the connection no longer holds any + ** locks and does not require any further unlock-notify callbacks. + */ + sqlite3ConnectionClosed(db); + + for(i=sqliteHashFirst(&db->aFunc); i; i=sqliteHashNext(i)){ + FuncDef *pNext, *p; + p = sqliteHashData(i); + do{ + functionDestroy(db, p); + pNext = p->pNext; + sqlite3DbFree(db, p); + p = pNext; + }while( p ); + } + sqlite3HashClear(&db->aFunc); + for(i=sqliteHashFirst(&db->aCollSeq); i; i=sqliteHashNext(i)){ + CollSeq *pColl = (CollSeq *)sqliteHashData(i); + /* Invoke any destructors registered for collation sequence user data. */ + for(j=0; j<3; j++){ + if( pColl[j].xDel ){ + pColl[j].xDel(pColl[j].pUser); + } + } + sqlite3DbFree(db, pColl); + } + sqlite3HashClear(&db->aCollSeq); +#ifndef SQLITE_OMIT_VIRTUALTABLE + for(i=sqliteHashFirst(&db->aModule); i; i=sqliteHashNext(i)){ + Module *pMod = (Module *)sqliteHashData(i); + if( pMod->xDestroy ){ + pMod->xDestroy(pMod->pAux); + } + sqlite3VtabEponymousTableClear(db, pMod); + sqlite3DbFree(db, pMod); + } + sqlite3HashClear(&db->aModule); +#endif + + sqlite3Error(db, SQLITE_OK); /* Deallocates any cached error strings. */ + sqlite3ValueFree(db->pErr); + sqlite3CloseExtensions(db); +#if SQLITE_USER_AUTHENTICATION + sqlite3_free(db->auth.zAuthUser); + sqlite3_free(db->auth.zAuthPW); +#endif + + db->magic = SQLITE_MAGIC_ERROR; + + /* The temp-database schema is allocated differently from the other schema + ** objects (using sqliteMalloc() directly, instead of sqlite3BtreeSchema()). + ** So it needs to be freed here. Todo: Why not roll the temp schema into + ** the same sqliteMalloc() as the one that allocates the database + ** structure? + */ + sqlite3DbFree(db, db->aDb[1].pSchema); + sqlite3_mutex_leave(db->mutex); + db->magic = SQLITE_MAGIC_CLOSED; + sqlite3_mutex_free(db->mutex); + assert( db->lookaside.nOut==0 ); /* Fails on a lookaside memory leak */ + if( db->lookaside.bMalloced ){ + sqlite3_free(db->lookaside.pStart); + } + sqlite3_free(db); +} + +/* +** Rollback all database files. If tripCode is not SQLITE_OK, then +** any write cursors are invalidated ("tripped" - as in "tripping a circuit +** breaker") and made to return tripCode if there are any further +** attempts to use that cursor. Read cursors remain open and valid +** but are "saved" in case the table pages are moved around. +*/ +SQLITE_PRIVATE void sqlite3RollbackAll(sqlite3 *db, int tripCode){ + int i; + int inTrans = 0; + int schemaChange; + assert( sqlite3_mutex_held(db->mutex) ); + sqlite3BeginBenignMalloc(); + + /* Obtain all b-tree mutexes before making any calls to BtreeRollback(). + ** This is important in case the transaction being rolled back has + ** modified the database schema. If the b-tree mutexes are not taken + ** here, then another shared-cache connection might sneak in between + ** the database rollback and schema reset, which can cause false + ** corruption reports in some cases. */ + sqlite3BtreeEnterAll(db); + schemaChange = (db->flags & SQLITE_InternChanges)!=0 && db->init.busy==0; + + for(i=0; inDb; i++){ + Btree *p = db->aDb[i].pBt; + if( p ){ + if( sqlite3BtreeIsInTrans(p) ){ + inTrans = 1; + } + sqlite3BtreeRollback(p, tripCode, !schemaChange); + } + } + sqlite3VtabRollback(db); + sqlite3EndBenignMalloc(); + + if( (db->flags&SQLITE_InternChanges)!=0 && db->init.busy==0 ){ + sqlite3ExpirePreparedStatements(db); + sqlite3ResetAllSchemasOfConnection(db); + } + sqlite3BtreeLeaveAll(db); + + /* Any deferred constraint violations have now been resolved. */ + db->nDeferredCons = 0; + db->nDeferredImmCons = 0; + db->flags &= ~SQLITE_DeferFKs; + + /* If one has been configured, invoke the rollback-hook callback */ + if( db->xRollbackCallback && (inTrans || !db->autoCommit) ){ + db->xRollbackCallback(db->pRollbackArg); + } +} + +/* +** Return a static string containing the name corresponding to the error code +** specified in the argument. +*/ +#if defined(SQLITE_NEED_ERR_NAME) +SQLITE_PRIVATE const char *sqlite3ErrName(int rc){ + const char *zName = 0; + int i, origRc = rc; + for(i=0; i<2 && zName==0; i++, rc &= 0xff){ + switch( rc ){ + case SQLITE_OK: zName = "SQLITE_OK"; break; + case SQLITE_ERROR: zName = "SQLITE_ERROR"; break; + case SQLITE_INTERNAL: zName = "SQLITE_INTERNAL"; break; + case SQLITE_PERM: zName = "SQLITE_PERM"; break; + case SQLITE_ABORT: zName = "SQLITE_ABORT"; break; + case SQLITE_ABORT_ROLLBACK: zName = "SQLITE_ABORT_ROLLBACK"; break; + case SQLITE_BUSY: zName = "SQLITE_BUSY"; break; + case SQLITE_BUSY_RECOVERY: zName = "SQLITE_BUSY_RECOVERY"; break; + case SQLITE_BUSY_SNAPSHOT: zName = "SQLITE_BUSY_SNAPSHOT"; break; + case SQLITE_LOCKED: zName = "SQLITE_LOCKED"; break; + case SQLITE_LOCKED_SHAREDCACHE: zName = "SQLITE_LOCKED_SHAREDCACHE";break; + case SQLITE_NOMEM: zName = "SQLITE_NOMEM"; break; + case SQLITE_READONLY: zName = "SQLITE_READONLY"; break; + case SQLITE_READONLY_RECOVERY: zName = "SQLITE_READONLY_RECOVERY"; break; + case SQLITE_READONLY_CANTLOCK: zName = "SQLITE_READONLY_CANTLOCK"; break; + case SQLITE_READONLY_ROLLBACK: zName = "SQLITE_READONLY_ROLLBACK"; break; + case SQLITE_READONLY_DBMOVED: zName = "SQLITE_READONLY_DBMOVED"; break; + case SQLITE_INTERRUPT: zName = "SQLITE_INTERRUPT"; break; + case SQLITE_IOERR: zName = "SQLITE_IOERR"; break; + case SQLITE_IOERR_READ: zName = "SQLITE_IOERR_READ"; break; + case SQLITE_IOERR_SHORT_READ: zName = "SQLITE_IOERR_SHORT_READ"; break; + case SQLITE_IOERR_WRITE: zName = "SQLITE_IOERR_WRITE"; break; + case SQLITE_IOERR_FSYNC: zName = "SQLITE_IOERR_FSYNC"; break; + case SQLITE_IOERR_DIR_FSYNC: zName = "SQLITE_IOERR_DIR_FSYNC"; break; + case SQLITE_IOERR_TRUNCATE: zName = "SQLITE_IOERR_TRUNCATE"; break; + case SQLITE_IOERR_FSTAT: zName = "SQLITE_IOERR_FSTAT"; break; + case SQLITE_IOERR_UNLOCK: zName = "SQLITE_IOERR_UNLOCK"; break; + case SQLITE_IOERR_RDLOCK: zName = "SQLITE_IOERR_RDLOCK"; break; + case SQLITE_IOERR_DELETE: zName = "SQLITE_IOERR_DELETE"; break; + case SQLITE_IOERR_NOMEM: zName = "SQLITE_IOERR_NOMEM"; break; + case SQLITE_IOERR_ACCESS: zName = "SQLITE_IOERR_ACCESS"; break; + case SQLITE_IOERR_CHECKRESERVEDLOCK: + zName = "SQLITE_IOERR_CHECKRESERVEDLOCK"; break; + case SQLITE_IOERR_LOCK: zName = "SQLITE_IOERR_LOCK"; break; + case SQLITE_IOERR_CLOSE: zName = "SQLITE_IOERR_CLOSE"; break; + case SQLITE_IOERR_DIR_CLOSE: zName = "SQLITE_IOERR_DIR_CLOSE"; break; + case SQLITE_IOERR_SHMOPEN: zName = "SQLITE_IOERR_SHMOPEN"; break; + case SQLITE_IOERR_SHMSIZE: zName = "SQLITE_IOERR_SHMSIZE"; break; + case SQLITE_IOERR_SHMLOCK: zName = "SQLITE_IOERR_SHMLOCK"; break; + case SQLITE_IOERR_SHMMAP: zName = "SQLITE_IOERR_SHMMAP"; break; + case SQLITE_IOERR_SEEK: zName = "SQLITE_IOERR_SEEK"; break; + case SQLITE_IOERR_DELETE_NOENT: zName = "SQLITE_IOERR_DELETE_NOENT";break; + case SQLITE_IOERR_MMAP: zName = "SQLITE_IOERR_MMAP"; break; + case SQLITE_IOERR_GETTEMPPATH: zName = "SQLITE_IOERR_GETTEMPPATH"; break; + case SQLITE_IOERR_CONVPATH: zName = "SQLITE_IOERR_CONVPATH"; break; + case SQLITE_CORRUPT: zName = "SQLITE_CORRUPT"; break; + case SQLITE_CORRUPT_VTAB: zName = "SQLITE_CORRUPT_VTAB"; break; + case SQLITE_NOTFOUND: zName = "SQLITE_NOTFOUND"; break; + case SQLITE_FULL: zName = "SQLITE_FULL"; break; + case SQLITE_CANTOPEN: zName = "SQLITE_CANTOPEN"; break; + case SQLITE_CANTOPEN_NOTEMPDIR: zName = "SQLITE_CANTOPEN_NOTEMPDIR";break; + case SQLITE_CANTOPEN_ISDIR: zName = "SQLITE_CANTOPEN_ISDIR"; break; + case SQLITE_CANTOPEN_FULLPATH: zName = "SQLITE_CANTOPEN_FULLPATH"; break; + case SQLITE_CANTOPEN_CONVPATH: zName = "SQLITE_CANTOPEN_CONVPATH"; break; + case SQLITE_PROTOCOL: zName = "SQLITE_PROTOCOL"; break; + case SQLITE_EMPTY: zName = "SQLITE_EMPTY"; break; + case SQLITE_SCHEMA: zName = "SQLITE_SCHEMA"; break; + case SQLITE_TOOBIG: zName = "SQLITE_TOOBIG"; break; + case SQLITE_CONSTRAINT: zName = "SQLITE_CONSTRAINT"; break; + case SQLITE_CONSTRAINT_UNIQUE: zName = "SQLITE_CONSTRAINT_UNIQUE"; break; + case SQLITE_CONSTRAINT_TRIGGER: zName = "SQLITE_CONSTRAINT_TRIGGER";break; + case SQLITE_CONSTRAINT_FOREIGNKEY: + zName = "SQLITE_CONSTRAINT_FOREIGNKEY"; break; + case SQLITE_CONSTRAINT_CHECK: zName = "SQLITE_CONSTRAINT_CHECK"; break; + case SQLITE_CONSTRAINT_PRIMARYKEY: + zName = "SQLITE_CONSTRAINT_PRIMARYKEY"; break; + case SQLITE_CONSTRAINT_NOTNULL: zName = "SQLITE_CONSTRAINT_NOTNULL";break; + case SQLITE_CONSTRAINT_COMMITHOOK: + zName = "SQLITE_CONSTRAINT_COMMITHOOK"; break; + case SQLITE_CONSTRAINT_VTAB: zName = "SQLITE_CONSTRAINT_VTAB"; break; + case SQLITE_CONSTRAINT_FUNCTION: + zName = "SQLITE_CONSTRAINT_FUNCTION"; break; + case SQLITE_CONSTRAINT_ROWID: zName = "SQLITE_CONSTRAINT_ROWID"; break; + case SQLITE_MISMATCH: zName = "SQLITE_MISMATCH"; break; + case SQLITE_MISUSE: zName = "SQLITE_MISUSE"; break; + case SQLITE_NOLFS: zName = "SQLITE_NOLFS"; break; + case SQLITE_AUTH: zName = "SQLITE_AUTH"; break; + case SQLITE_FORMAT: zName = "SQLITE_FORMAT"; break; + case SQLITE_RANGE: zName = "SQLITE_RANGE"; break; + case SQLITE_NOTADB: zName = "SQLITE_NOTADB"; break; + case SQLITE_ROW: zName = "SQLITE_ROW"; break; + case SQLITE_NOTICE: zName = "SQLITE_NOTICE"; break; + case SQLITE_NOTICE_RECOVER_WAL: zName = "SQLITE_NOTICE_RECOVER_WAL";break; + case SQLITE_NOTICE_RECOVER_ROLLBACK: + zName = "SQLITE_NOTICE_RECOVER_ROLLBACK"; break; + case SQLITE_WARNING: zName = "SQLITE_WARNING"; break; + case SQLITE_WARNING_AUTOINDEX: zName = "SQLITE_WARNING_AUTOINDEX"; break; + case SQLITE_DONE: zName = "SQLITE_DONE"; break; + } + } + if( zName==0 ){ + static char zBuf[50]; + sqlite3_snprintf(sizeof(zBuf), zBuf, "SQLITE_UNKNOWN(%d)", origRc); + zName = zBuf; + } + return zName; +} +#endif + +/* +** Return a static string that describes the kind of error specified in the +** argument. +*/ +SQLITE_PRIVATE const char *sqlite3ErrStr(int rc){ + static const char* const aMsg[] = { + /* SQLITE_OK */ "not an error", + /* SQLITE_ERROR */ "SQL logic error or missing database", + /* SQLITE_INTERNAL */ 0, + /* SQLITE_PERM */ "access permission denied", + /* SQLITE_ABORT */ "callback requested query abort", + /* SQLITE_BUSY */ "database is locked", + /* SQLITE_LOCKED */ "database table is locked", + /* SQLITE_NOMEM */ "out of memory", + /* SQLITE_READONLY */ "attempt to write a readonly database", + /* SQLITE_INTERRUPT */ "interrupted", + /* SQLITE_IOERR */ "disk I/O error", + /* SQLITE_CORRUPT */ "database disk image is malformed", + /* SQLITE_NOTFOUND */ "unknown operation", + /* SQLITE_FULL */ "database or disk is full", + /* SQLITE_CANTOPEN */ "unable to open database file", + /* SQLITE_PROTOCOL */ "locking protocol", + /* SQLITE_EMPTY */ "table contains no data", + /* SQLITE_SCHEMA */ "database schema has changed", + /* SQLITE_TOOBIG */ "string or blob too big", + /* SQLITE_CONSTRAINT */ "constraint failed", + /* SQLITE_MISMATCH */ "datatype mismatch", + /* SQLITE_MISUSE */ "library routine called out of sequence", + /* SQLITE_NOLFS */ "large file support is disabled", + /* SQLITE_AUTH */ "authorization denied", + /* SQLITE_FORMAT */ "auxiliary database format error", + /* SQLITE_RANGE */ "bind or column index out of range", + /* SQLITE_NOTADB */ "file is encrypted or is not a database", + }; + const char *zErr = "unknown error"; + switch( rc ){ + case SQLITE_ABORT_ROLLBACK: { + zErr = "abort due to ROLLBACK"; + break; + } + default: { + rc &= 0xff; + if( ALWAYS(rc>=0) && rcbusyTimeout; + int delay, prior; + + assert( count>=0 ); + if( count < NDELAY ){ + delay = delays[count]; + prior = totals[count]; + }else{ + delay = delays[NDELAY-1]; + prior = totals[NDELAY-1] + delay*(count-(NDELAY-1)); + } + if( prior + delay > timeout ){ + delay = timeout - prior; + if( delay<=0 ) return 0; + } + sqlite3OsSleep(db->pVfs, delay*1000); + return 1; +#else + sqlite3 *db = (sqlite3 *)ptr; + int timeout = ((sqlite3 *)ptr)->busyTimeout; + if( (count+1)*1000 > timeout ){ + return 0; + } + sqlite3OsSleep(db->pVfs, 1000000); + return 1; +#endif +} + +/* +** Invoke the given busy handler. +** +** This routine is called when an operation failed with a lock. +** If this routine returns non-zero, the lock is retried. If it +** returns 0, the operation aborts with an SQLITE_BUSY error. +*/ +SQLITE_PRIVATE int sqlite3InvokeBusyHandler(BusyHandler *p){ + int rc; + if( NEVER(p==0) || p->xFunc==0 || p->nBusy<0 ) return 0; + rc = p->xFunc(p->pArg, p->nBusy); + if( rc==0 ){ + p->nBusy = -1; + }else{ + p->nBusy++; + } + return rc; +} + +/* +** This routine sets the busy callback for an Sqlite database to the +** given callback function with the given argument. +*/ +SQLITE_API int sqlite3_busy_handler( + sqlite3 *db, + int (*xBusy)(void*,int), + void *pArg +){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; +#endif + sqlite3_mutex_enter(db->mutex); + db->busyHandler.xFunc = xBusy; + db->busyHandler.pArg = pArg; + db->busyHandler.nBusy = 0; + db->busyTimeout = 0; + sqlite3_mutex_leave(db->mutex); + return SQLITE_OK; +} + +#ifndef SQLITE_OMIT_PROGRESS_CALLBACK +/* +** This routine sets the progress callback for an Sqlite database to the +** given callback function with the given argument. The progress callback will +** be invoked every nOps opcodes. +*/ +SQLITE_API void sqlite3_progress_handler( + sqlite3 *db, + int nOps, + int (*xProgress)(void*), + void *pArg +){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return; + } +#endif + sqlite3_mutex_enter(db->mutex); + if( nOps>0 ){ + db->xProgress = xProgress; + db->nProgressOps = (unsigned)nOps; + db->pProgressArg = pArg; + }else{ + db->xProgress = 0; + db->nProgressOps = 0; + db->pProgressArg = 0; + } + sqlite3_mutex_leave(db->mutex); +} +#endif + + +/* +** This routine installs a default busy handler that waits for the +** specified number of milliseconds before returning 0. +*/ +SQLITE_API int sqlite3_busy_timeout(sqlite3 *db, int ms){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; +#endif + if( ms>0 ){ + sqlite3_busy_handler(db, sqliteDefaultBusyCallback, (void*)db); + db->busyTimeout = ms; + }else{ + sqlite3_busy_handler(db, 0, 0); + } + return SQLITE_OK; +} + +/* +** Cause any pending operation to stop at its earliest opportunity. +*/ +SQLITE_API void sqlite3_interrupt(sqlite3 *db){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return; + } +#endif + db->u1.isInterrupted = 1; +} + + +/* +** This function is exactly the same as sqlite3_create_function(), except +** that it is designed to be called by internal code. The difference is +** that if a malloc() fails in sqlite3_create_function(), an error code +** is returned and the mallocFailed flag cleared. +*/ +SQLITE_PRIVATE int sqlite3CreateFunc( + sqlite3 *db, + const char *zFunctionName, + int nArg, + int enc, + void *pUserData, + void (*xSFunc)(sqlite3_context*,int,sqlite3_value **), + void (*xStep)(sqlite3_context*,int,sqlite3_value **), + void (*xFinal)(sqlite3_context*), + FuncDestructor *pDestructor +){ + FuncDef *p; + int nName; + int extraFlags; + + assert( sqlite3_mutex_held(db->mutex) ); + if( zFunctionName==0 || + (xSFunc && (xFinal || xStep)) || + (!xSFunc && (xFinal && !xStep)) || + (!xSFunc && (!xFinal && xStep)) || + (nArg<-1 || nArg>SQLITE_MAX_FUNCTION_ARG) || + (255<(nName = sqlite3Strlen30( zFunctionName))) ){ + return SQLITE_MISUSE_BKPT; + } + + assert( SQLITE_FUNC_CONSTANT==SQLITE_DETERMINISTIC ); + extraFlags = enc & SQLITE_DETERMINISTIC; + enc &= (SQLITE_FUNC_ENCMASK|SQLITE_ANY); + +#ifndef SQLITE_OMIT_UTF16 + /* If SQLITE_UTF16 is specified as the encoding type, transform this + ** to one of SQLITE_UTF16LE or SQLITE_UTF16BE using the + ** SQLITE_UTF16NATIVE macro. SQLITE_UTF16 is not used internally. + ** + ** If SQLITE_ANY is specified, add three versions of the function + ** to the hash table. + */ + if( enc==SQLITE_UTF16 ){ + enc = SQLITE_UTF16NATIVE; + }else if( enc==SQLITE_ANY ){ + int rc; + rc = sqlite3CreateFunc(db, zFunctionName, nArg, SQLITE_UTF8|extraFlags, + pUserData, xSFunc, xStep, xFinal, pDestructor); + if( rc==SQLITE_OK ){ + rc = sqlite3CreateFunc(db, zFunctionName, nArg, SQLITE_UTF16LE|extraFlags, + pUserData, xSFunc, xStep, xFinal, pDestructor); + } + if( rc!=SQLITE_OK ){ + return rc; + } + enc = SQLITE_UTF16BE; + } +#else + enc = SQLITE_UTF8; +#endif + + /* Check if an existing function is being overridden or deleted. If so, + ** and there are active VMs, then return SQLITE_BUSY. If a function + ** is being overridden/deleted but there are no active VMs, allow the + ** operation to continue but invalidate all precompiled statements. + */ + p = sqlite3FindFunction(db, zFunctionName, nArg, (u8)enc, 0); + if( p && (p->funcFlags & SQLITE_FUNC_ENCMASK)==enc && p->nArg==nArg ){ + if( db->nVdbeActive ){ + sqlite3ErrorWithMsg(db, SQLITE_BUSY, + "unable to delete/modify user-function due to active statements"); + assert( !db->mallocFailed ); + return SQLITE_BUSY; + }else{ + sqlite3ExpirePreparedStatements(db); + } + } + + p = sqlite3FindFunction(db, zFunctionName, nArg, (u8)enc, 1); + assert(p || db->mallocFailed); + if( !p ){ + return SQLITE_NOMEM_BKPT; + } + + /* If an older version of the function with a configured destructor is + ** being replaced invoke the destructor function here. */ + functionDestroy(db, p); + + if( pDestructor ){ + pDestructor->nRef++; + } + p->u.pDestructor = pDestructor; + p->funcFlags = (p->funcFlags & SQLITE_FUNC_ENCMASK) | extraFlags; + testcase( p->funcFlags & SQLITE_DETERMINISTIC ); + p->xSFunc = xSFunc ? xSFunc : xStep; + p->xFinalize = xFinal; + p->pUserData = pUserData; + p->nArg = (u16)nArg; + return SQLITE_OK; +} + +/* +** Create new user functions. +*/ +SQLITE_API int sqlite3_create_function( + sqlite3 *db, + const char *zFunc, + int nArg, + int enc, + void *p, + void (*xSFunc)(sqlite3_context*,int,sqlite3_value **), + void (*xStep)(sqlite3_context*,int,sqlite3_value **), + void (*xFinal)(sqlite3_context*) +){ + return sqlite3_create_function_v2(db, zFunc, nArg, enc, p, xSFunc, xStep, + xFinal, 0); +} + +SQLITE_API int sqlite3_create_function_v2( + sqlite3 *db, + const char *zFunc, + int nArg, + int enc, + void *p, + void (*xSFunc)(sqlite3_context*,int,sqlite3_value **), + void (*xStep)(sqlite3_context*,int,sqlite3_value **), + void (*xFinal)(sqlite3_context*), + void (*xDestroy)(void *) +){ + int rc = SQLITE_ERROR; + FuncDestructor *pArg = 0; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + return SQLITE_MISUSE_BKPT; + } +#endif + sqlite3_mutex_enter(db->mutex); + if( xDestroy ){ + pArg = (FuncDestructor *)sqlite3DbMallocZero(db, sizeof(FuncDestructor)); + if( !pArg ){ + xDestroy(p); + goto out; + } + pArg->xDestroy = xDestroy; + pArg->pUserData = p; + } + rc = sqlite3CreateFunc(db, zFunc, nArg, enc, p, xSFunc, xStep, xFinal, pArg); + if( pArg && pArg->nRef==0 ){ + assert( rc!=SQLITE_OK ); + xDestroy(p); + sqlite3DbFree(db, pArg); + } + + out: + rc = sqlite3ApiExit(db, rc); + sqlite3_mutex_leave(db->mutex); + return rc; +} + +#ifndef SQLITE_OMIT_UTF16 +SQLITE_API int sqlite3_create_function16( + sqlite3 *db, + const void *zFunctionName, + int nArg, + int eTextRep, + void *p, + void (*xSFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*) +){ + int rc; + char *zFunc8; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) || zFunctionName==0 ) return SQLITE_MISUSE_BKPT; +#endif + sqlite3_mutex_enter(db->mutex); + assert( !db->mallocFailed ); + zFunc8 = sqlite3Utf16to8(db, zFunctionName, -1, SQLITE_UTF16NATIVE); + rc = sqlite3CreateFunc(db, zFunc8, nArg, eTextRep, p, xSFunc,xStep,xFinal,0); + sqlite3DbFree(db, zFunc8); + rc = sqlite3ApiExit(db, rc); + sqlite3_mutex_leave(db->mutex); + return rc; +} +#endif + + +/* +** Declare that a function has been overloaded by a virtual table. +** +** If the function already exists as a regular global function, then +** this routine is a no-op. If the function does not exist, then create +** a new one that always throws a run-time error. +** +** When virtual tables intend to provide an overloaded function, they +** should call this routine to make sure the global function exists. +** A global function must exist in order for name resolution to work +** properly. +*/ +SQLITE_API int sqlite3_overload_function( + sqlite3 *db, + const char *zName, + int nArg +){ + int rc = SQLITE_OK; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) || zName==0 || nArg<-2 ){ + return SQLITE_MISUSE_BKPT; + } +#endif + sqlite3_mutex_enter(db->mutex); + if( sqlite3FindFunction(db, zName, nArg, SQLITE_UTF8, 0)==0 ){ + rc = sqlite3CreateFunc(db, zName, nArg, SQLITE_UTF8, + 0, sqlite3InvalidFunction, 0, 0, 0); + } + rc = sqlite3ApiExit(db, rc); + sqlite3_mutex_leave(db->mutex); + return rc; +} + +#ifndef SQLITE_OMIT_TRACE +/* +** Register a trace function. The pArg from the previously registered trace +** is returned. +** +** A NULL trace function means that no tracing is executes. A non-NULL +** trace is a pointer to a function that is invoked at the start of each +** SQL statement. +*/ +#ifndef SQLITE_OMIT_DEPRECATED +SQLITE_API void *sqlite3_trace(sqlite3 *db, void(*xTrace)(void*,const char*), void *pArg){ + void *pOld; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + sqlite3_mutex_enter(db->mutex); + pOld = db->pTraceArg; + db->mTrace = xTrace ? SQLITE_TRACE_LEGACY : 0; + db->xTrace = (int(*)(u32,void*,void*,void*))xTrace; + db->pTraceArg = pArg; + sqlite3_mutex_leave(db->mutex); + return pOld; +} +#endif /* SQLITE_OMIT_DEPRECATED */ + +/* Register a trace callback using the version-2 interface. +*/ +SQLITE_API int sqlite3_trace_v2( + sqlite3 *db, /* Trace this connection */ + unsigned mTrace, /* Mask of events to be traced */ + int(*xTrace)(unsigned,void*,void*,void*), /* Callback to invoke */ + void *pArg /* Context */ +){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + return SQLITE_MISUSE_BKPT; + } +#endif + sqlite3_mutex_enter(db->mutex); + if( mTrace==0 ) xTrace = 0; + if( xTrace==0 ) mTrace = 0; + db->mTrace = mTrace; + db->xTrace = xTrace; + db->pTraceArg = pArg; + sqlite3_mutex_leave(db->mutex); + return SQLITE_OK; +} + +#ifndef SQLITE_OMIT_DEPRECATED +/* +** Register a profile function. The pArg from the previously registered +** profile function is returned. +** +** A NULL profile function means that no profiling is executes. A non-NULL +** profile is a pointer to a function that is invoked at the conclusion of +** each SQL statement that is run. +*/ +SQLITE_API void *sqlite3_profile( + sqlite3 *db, + void (*xProfile)(void*,const char*,sqlite_uint64), + void *pArg +){ + void *pOld; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + sqlite3_mutex_enter(db->mutex); + pOld = db->pProfileArg; + db->xProfile = xProfile; + db->pProfileArg = pArg; + sqlite3_mutex_leave(db->mutex); + return pOld; +} +#endif /* SQLITE_OMIT_DEPRECATED */ +#endif /* SQLITE_OMIT_TRACE */ + +/* +** Register a function to be invoked when a transaction commits. +** If the invoked function returns non-zero, then the commit becomes a +** rollback. +*/ +SQLITE_API void *sqlite3_commit_hook( + sqlite3 *db, /* Attach the hook to this database */ + int (*xCallback)(void*), /* Function to invoke on each commit */ + void *pArg /* Argument to the function */ +){ + void *pOld; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + sqlite3_mutex_enter(db->mutex); + pOld = db->pCommitArg; + db->xCommitCallback = xCallback; + db->pCommitArg = pArg; + sqlite3_mutex_leave(db->mutex); + return pOld; +} + +/* +** Register a callback to be invoked each time a row is updated, +** inserted or deleted using this database connection. +*/ +SQLITE_API void *sqlite3_update_hook( + sqlite3 *db, /* Attach the hook to this database */ + void (*xCallback)(void*,int,char const *,char const *,sqlite_int64), + void *pArg /* Argument to the function */ +){ + void *pRet; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + sqlite3_mutex_enter(db->mutex); + pRet = db->pUpdateArg; + db->xUpdateCallback = xCallback; + db->pUpdateArg = pArg; + sqlite3_mutex_leave(db->mutex); + return pRet; +} + +/* +** Register a callback to be invoked each time a transaction is rolled +** back by this database connection. +*/ +SQLITE_API void *sqlite3_rollback_hook( + sqlite3 *db, /* Attach the hook to this database */ + void (*xCallback)(void*), /* Callback function */ + void *pArg /* Argument to the function */ +){ + void *pRet; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + sqlite3_mutex_enter(db->mutex); + pRet = db->pRollbackArg; + db->xRollbackCallback = xCallback; + db->pRollbackArg = pArg; + sqlite3_mutex_leave(db->mutex); + return pRet; +} + +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK +/* +** Register a callback to be invoked each time a row is updated, +** inserted or deleted using this database connection. +*/ +SQLITE_API void *sqlite3_preupdate_hook( + sqlite3 *db, /* Attach the hook to this database */ + void(*xCallback)( /* Callback function */ + void*,sqlite3*,int,char const*,char const*,sqlite3_int64,sqlite3_int64), + void *pArg /* First callback argument */ +){ + void *pRet; + sqlite3_mutex_enter(db->mutex); + pRet = db->pPreUpdateArg; + db->xPreUpdateCallback = xCallback; + db->pPreUpdateArg = pArg; + sqlite3_mutex_leave(db->mutex); + return pRet; +} +#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */ + +#ifndef SQLITE_OMIT_WAL +/* +** The sqlite3_wal_hook() callback registered by sqlite3_wal_autocheckpoint(). +** Invoke sqlite3_wal_checkpoint if the number of frames in the log file +** is greater than sqlite3.pWalArg cast to an integer (the value configured by +** wal_autocheckpoint()). +*/ +SQLITE_PRIVATE int sqlite3WalDefaultHook( + void *pClientData, /* Argument */ + sqlite3 *db, /* Connection */ + const char *zDb, /* Database */ + int nFrame /* Size of WAL */ +){ + if( nFrame>=SQLITE_PTR_TO_INT(pClientData) ){ + sqlite3BeginBenignMalloc(); + sqlite3_wal_checkpoint(db, zDb); + sqlite3EndBenignMalloc(); + } + return SQLITE_OK; +} +#endif /* SQLITE_OMIT_WAL */ + +/* +** Configure an sqlite3_wal_hook() callback to automatically checkpoint +** a database after committing a transaction if there are nFrame or +** more frames in the log file. Passing zero or a negative value as the +** nFrame parameter disables automatic checkpoints entirely. +** +** The callback registered by this function replaces any existing callback +** registered using sqlite3_wal_hook(). Likewise, registering a callback +** using sqlite3_wal_hook() disables the automatic checkpoint mechanism +** configured by this function. +*/ +SQLITE_API int sqlite3_wal_autocheckpoint(sqlite3 *db, int nFrame){ +#ifdef SQLITE_OMIT_WAL + UNUSED_PARAMETER(db); + UNUSED_PARAMETER(nFrame); +#else +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; +#endif + if( nFrame>0 ){ + sqlite3_wal_hook(db, sqlite3WalDefaultHook, SQLITE_INT_TO_PTR(nFrame)); + }else{ + sqlite3_wal_hook(db, 0, 0); + } +#endif + return SQLITE_OK; +} + +/* +** Register a callback to be invoked each time a transaction is written +** into the write-ahead-log by this database connection. +*/ +SQLITE_API void *sqlite3_wal_hook( + sqlite3 *db, /* Attach the hook to this db handle */ + int(*xCallback)(void *, sqlite3*, const char*, int), + void *pArg /* First argument passed to xCallback() */ +){ +#ifndef SQLITE_OMIT_WAL + void *pRet; +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + sqlite3_mutex_enter(db->mutex); + pRet = db->pWalArg; + db->xWalCallback = xCallback; + db->pWalArg = pArg; + sqlite3_mutex_leave(db->mutex); + return pRet; +#else + return 0; +#endif +} + +/* +** Checkpoint database zDb. +*/ +SQLITE_API int sqlite3_wal_checkpoint_v2( + sqlite3 *db, /* Database handle */ + const char *zDb, /* Name of attached database (or NULL) */ + int eMode, /* SQLITE_CHECKPOINT_* value */ + int *pnLog, /* OUT: Size of WAL log in frames */ + int *pnCkpt /* OUT: Total number of frames checkpointed */ +){ +#ifdef SQLITE_OMIT_WAL + return SQLITE_OK; +#else + int rc; /* Return code */ + int iDb = SQLITE_MAX_ATTACHED; /* sqlite3.aDb[] index of db to checkpoint */ + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; +#endif + + /* Initialize the output variables to -1 in case an error occurs. */ + if( pnLog ) *pnLog = -1; + if( pnCkpt ) *pnCkpt = -1; + + assert( SQLITE_CHECKPOINT_PASSIVE==0 ); + assert( SQLITE_CHECKPOINT_FULL==1 ); + assert( SQLITE_CHECKPOINT_RESTART==2 ); + assert( SQLITE_CHECKPOINT_TRUNCATE==3 ); + if( eModeSQLITE_CHECKPOINT_TRUNCATE ){ + /* EVIDENCE-OF: R-03996-12088 The M parameter must be a valid checkpoint + ** mode: */ + return SQLITE_MISUSE; + } + + sqlite3_mutex_enter(db->mutex); + if( zDb && zDb[0] ){ + iDb = sqlite3FindDbName(db, zDb); + } + if( iDb<0 ){ + rc = SQLITE_ERROR; + sqlite3ErrorWithMsg(db, SQLITE_ERROR, "unknown database: %s", zDb); + }else{ + db->busyHandler.nBusy = 0; + rc = sqlite3Checkpoint(db, iDb, eMode, pnLog, pnCkpt); + sqlite3Error(db, rc); + } + rc = sqlite3ApiExit(db, rc); + sqlite3_mutex_leave(db->mutex); + return rc; +#endif +} + + +/* +** Checkpoint database zDb. If zDb is NULL, or if the buffer zDb points +** to contains a zero-length string, all attached databases are +** checkpointed. +*/ +SQLITE_API int sqlite3_wal_checkpoint(sqlite3 *db, const char *zDb){ + /* EVIDENCE-OF: R-41613-20553 The sqlite3_wal_checkpoint(D,X) is equivalent to + ** sqlite3_wal_checkpoint_v2(D,X,SQLITE_CHECKPOINT_PASSIVE,0,0). */ + return sqlite3_wal_checkpoint_v2(db,zDb,SQLITE_CHECKPOINT_PASSIVE,0,0); +} + +#ifndef SQLITE_OMIT_WAL +/* +** Run a checkpoint on database iDb. This is a no-op if database iDb is +** not currently open in WAL mode. +** +** If a transaction is open on the database being checkpointed, this +** function returns SQLITE_LOCKED and a checkpoint is not attempted. If +** an error occurs while running the checkpoint, an SQLite error code is +** returned (i.e. SQLITE_IOERR). Otherwise, SQLITE_OK. +** +** The mutex on database handle db should be held by the caller. The mutex +** associated with the specific b-tree being checkpointed is taken by +** this function while the checkpoint is running. +** +** If iDb is passed SQLITE_MAX_ATTACHED, then all attached databases are +** checkpointed. If an error is encountered it is returned immediately - +** no attempt is made to checkpoint any remaining databases. +** +** Parameter eMode is one of SQLITE_CHECKPOINT_PASSIVE, FULL or RESTART. +*/ +SQLITE_PRIVATE int sqlite3Checkpoint(sqlite3 *db, int iDb, int eMode, int *pnLog, int *pnCkpt){ + int rc = SQLITE_OK; /* Return code */ + int i; /* Used to iterate through attached dbs */ + int bBusy = 0; /* True if SQLITE_BUSY has been encountered */ + + assert( sqlite3_mutex_held(db->mutex) ); + assert( !pnLog || *pnLog==-1 ); + assert( !pnCkpt || *pnCkpt==-1 ); + + for(i=0; inDb && rc==SQLITE_OK; i++){ + if( i==iDb || iDb==SQLITE_MAX_ATTACHED ){ + rc = sqlite3BtreeCheckpoint(db->aDb[i].pBt, eMode, pnLog, pnCkpt); + pnLog = 0; + pnCkpt = 0; + if( rc==SQLITE_BUSY ){ + bBusy = 1; + rc = SQLITE_OK; + } + } + } + + return (rc==SQLITE_OK && bBusy) ? SQLITE_BUSY : rc; +} +#endif /* SQLITE_OMIT_WAL */ + +/* +** This function returns true if main-memory should be used instead of +** a temporary file for transient pager files and statement journals. +** The value returned depends on the value of db->temp_store (runtime +** parameter) and the compile time value of SQLITE_TEMP_STORE. The +** following table describes the relationship between these two values +** and this functions return value. +** +** SQLITE_TEMP_STORE db->temp_store Location of temporary database +** ----------------- -------------- ------------------------------ +** 0 any file (return 0) +** 1 1 file (return 0) +** 1 2 memory (return 1) +** 1 0 file (return 0) +** 2 1 file (return 0) +** 2 2 memory (return 1) +** 2 0 memory (return 1) +** 3 any memory (return 1) +*/ +SQLITE_PRIVATE int sqlite3TempInMemory(const sqlite3 *db){ +#if SQLITE_TEMP_STORE==1 + return ( db->temp_store==2 ); +#endif +#if SQLITE_TEMP_STORE==2 + return ( db->temp_store!=1 ); +#endif +#if SQLITE_TEMP_STORE==3 + UNUSED_PARAMETER(db); + return 1; +#endif +#if SQLITE_TEMP_STORE<1 || SQLITE_TEMP_STORE>3 + UNUSED_PARAMETER(db); + return 0; +#endif +} + +/* +** Return UTF-8 encoded English language explanation of the most recent +** error. +*/ +SQLITE_API const char *sqlite3_errmsg(sqlite3 *db){ + const char *z; + if( !db ){ + return sqlite3ErrStr(SQLITE_NOMEM_BKPT); + } + if( !sqlite3SafetyCheckSickOrOk(db) ){ + return sqlite3ErrStr(SQLITE_MISUSE_BKPT); + } + sqlite3_mutex_enter(db->mutex); + if( db->mallocFailed ){ + z = sqlite3ErrStr(SQLITE_NOMEM_BKPT); + }else{ + testcase( db->pErr==0 ); + z = (char*)sqlite3_value_text(db->pErr); + assert( !db->mallocFailed ); + if( z==0 ){ + z = sqlite3ErrStr(db->errCode); + } + } + sqlite3_mutex_leave(db->mutex); + return z; +} + +#ifndef SQLITE_OMIT_UTF16 +/* +** Return UTF-16 encoded English language explanation of the most recent +** error. +*/ +SQLITE_API const void *sqlite3_errmsg16(sqlite3 *db){ + static const u16 outOfMem[] = { + 'o', 'u', 't', ' ', 'o', 'f', ' ', 'm', 'e', 'm', 'o', 'r', 'y', 0 + }; + static const u16 misuse[] = { + 'l', 'i', 'b', 'r', 'a', 'r', 'y', ' ', + 'r', 'o', 'u', 't', 'i', 'n', 'e', ' ', + 'c', 'a', 'l', 'l', 'e', 'd', ' ', + 'o', 'u', 't', ' ', + 'o', 'f', ' ', + 's', 'e', 'q', 'u', 'e', 'n', 'c', 'e', 0 + }; + + const void *z; + if( !db ){ + return (void *)outOfMem; + } + if( !sqlite3SafetyCheckSickOrOk(db) ){ + return (void *)misuse; + } + sqlite3_mutex_enter(db->mutex); + if( db->mallocFailed ){ + z = (void *)outOfMem; + }else{ + z = sqlite3_value_text16(db->pErr); + if( z==0 ){ + sqlite3ErrorWithMsg(db, db->errCode, sqlite3ErrStr(db->errCode)); + z = sqlite3_value_text16(db->pErr); + } + /* A malloc() may have failed within the call to sqlite3_value_text16() + ** above. If this is the case, then the db->mallocFailed flag needs to + ** be cleared before returning. Do this directly, instead of via + ** sqlite3ApiExit(), to avoid setting the database handle error message. + */ + sqlite3OomClear(db); + } + sqlite3_mutex_leave(db->mutex); + return z; +} +#endif /* SQLITE_OMIT_UTF16 */ + +/* +** Return the most recent error code generated by an SQLite routine. If NULL is +** passed to this function, we assume a malloc() failed during sqlite3_open(). +*/ +SQLITE_API int sqlite3_errcode(sqlite3 *db){ + if( db && !sqlite3SafetyCheckSickOrOk(db) ){ + return SQLITE_MISUSE_BKPT; + } + if( !db || db->mallocFailed ){ + return SQLITE_NOMEM_BKPT; + } + return db->errCode & db->errMask; +} +SQLITE_API int sqlite3_extended_errcode(sqlite3 *db){ + if( db && !sqlite3SafetyCheckSickOrOk(db) ){ + return SQLITE_MISUSE_BKPT; + } + if( !db || db->mallocFailed ){ + return SQLITE_NOMEM_BKPT; + } + return db->errCode; +} +SQLITE_API int sqlite3_system_errno(sqlite3 *db){ + return db ? db->iSysErrno : 0; +} + +/* +** Return a string that describes the kind of error specified in the +** argument. For now, this simply calls the internal sqlite3ErrStr() +** function. +*/ +SQLITE_API const char *sqlite3_errstr(int rc){ + return sqlite3ErrStr(rc); +} + +/* +** Create a new collating function for database "db". The name is zName +** and the encoding is enc. +*/ +static int createCollation( + sqlite3* db, + const char *zName, + u8 enc, + void* pCtx, + int(*xCompare)(void*,int,const void*,int,const void*), + void(*xDel)(void*) +){ + CollSeq *pColl; + int enc2; + + assert( sqlite3_mutex_held(db->mutex) ); + + /* If SQLITE_UTF16 is specified as the encoding type, transform this + ** to one of SQLITE_UTF16LE or SQLITE_UTF16BE using the + ** SQLITE_UTF16NATIVE macro. SQLITE_UTF16 is not used internally. + */ + enc2 = enc; + testcase( enc2==SQLITE_UTF16 ); + testcase( enc2==SQLITE_UTF16_ALIGNED ); + if( enc2==SQLITE_UTF16 || enc2==SQLITE_UTF16_ALIGNED ){ + enc2 = SQLITE_UTF16NATIVE; + } + if( enc2SQLITE_UTF16BE ){ + return SQLITE_MISUSE_BKPT; + } + + /* Check if this call is removing or replacing an existing collation + ** sequence. If so, and there are active VMs, return busy. If there + ** are no active VMs, invalidate any pre-compiled statements. + */ + pColl = sqlite3FindCollSeq(db, (u8)enc2, zName, 0); + if( pColl && pColl->xCmp ){ + if( db->nVdbeActive ){ + sqlite3ErrorWithMsg(db, SQLITE_BUSY, + "unable to delete/modify collation sequence due to active statements"); + return SQLITE_BUSY; + } + sqlite3ExpirePreparedStatements(db); + + /* If collation sequence pColl was created directly by a call to + ** sqlite3_create_collation, and not generated by synthCollSeq(), + ** then any copies made by synthCollSeq() need to be invalidated. + ** Also, collation destructor - CollSeq.xDel() - function may need + ** to be called. + */ + if( (pColl->enc & ~SQLITE_UTF16_ALIGNED)==enc2 ){ + CollSeq *aColl = sqlite3HashFind(&db->aCollSeq, zName); + int j; + for(j=0; j<3; j++){ + CollSeq *p = &aColl[j]; + if( p->enc==pColl->enc ){ + if( p->xDel ){ + p->xDel(p->pUser); + } + p->xCmp = 0; + } + } + } + } + + pColl = sqlite3FindCollSeq(db, (u8)enc2, zName, 1); + if( pColl==0 ) return SQLITE_NOMEM_BKPT; + pColl->xCmp = xCompare; + pColl->pUser = pCtx; + pColl->xDel = xDel; + pColl->enc = (u8)(enc2 | (enc & SQLITE_UTF16_ALIGNED)); + sqlite3Error(db, SQLITE_OK); + return SQLITE_OK; +} + + +/* +** This array defines hard upper bounds on limit values. The +** initializer must be kept in sync with the SQLITE_LIMIT_* +** #defines in sqlite3.h. +*/ +static const int aHardLimit[] = { + SQLITE_MAX_LENGTH, + SQLITE_MAX_SQL_LENGTH, + SQLITE_MAX_COLUMN, + SQLITE_MAX_EXPR_DEPTH, + SQLITE_MAX_COMPOUND_SELECT, + SQLITE_MAX_VDBE_OP, + SQLITE_MAX_FUNCTION_ARG, + SQLITE_MAX_ATTACHED, + SQLITE_MAX_LIKE_PATTERN_LENGTH, + SQLITE_MAX_VARIABLE_NUMBER, /* IMP: R-38091-32352 */ + SQLITE_MAX_TRIGGER_DEPTH, + SQLITE_MAX_WORKER_THREADS, +}; + +/* +** Make sure the hard limits are set to reasonable values +*/ +#if SQLITE_MAX_LENGTH<100 +# error SQLITE_MAX_LENGTH must be at least 100 +#endif +#if SQLITE_MAX_SQL_LENGTH<100 +# error SQLITE_MAX_SQL_LENGTH must be at least 100 +#endif +#if SQLITE_MAX_SQL_LENGTH>SQLITE_MAX_LENGTH +# error SQLITE_MAX_SQL_LENGTH must not be greater than SQLITE_MAX_LENGTH +#endif +#if SQLITE_MAX_COMPOUND_SELECT<2 +# error SQLITE_MAX_COMPOUND_SELECT must be at least 2 +#endif +#if SQLITE_MAX_VDBE_OP<40 +# error SQLITE_MAX_VDBE_OP must be at least 40 +#endif +#if SQLITE_MAX_FUNCTION_ARG<0 || SQLITE_MAX_FUNCTION_ARG>127 +# error SQLITE_MAX_FUNCTION_ARG must be between 0 and 127 +#endif +#if SQLITE_MAX_ATTACHED<0 || SQLITE_MAX_ATTACHED>125 +# error SQLITE_MAX_ATTACHED must be between 0 and 125 +#endif +#if SQLITE_MAX_LIKE_PATTERN_LENGTH<1 +# error SQLITE_MAX_LIKE_PATTERN_LENGTH must be at least 1 +#endif +#if SQLITE_MAX_COLUMN>32767 +# error SQLITE_MAX_COLUMN must not exceed 32767 +#endif +#if SQLITE_MAX_TRIGGER_DEPTH<1 +# error SQLITE_MAX_TRIGGER_DEPTH must be at least 1 +#endif +#if SQLITE_MAX_WORKER_THREADS<0 || SQLITE_MAX_WORKER_THREADS>50 +# error SQLITE_MAX_WORKER_THREADS must be between 0 and 50 +#endif + + +/* +** Change the value of a limit. Report the old value. +** If an invalid limit index is supplied, report -1. +** Make no changes but still report the old value if the +** new limit is negative. +** +** A new lower limit does not shrink existing constructs. +** It merely prevents new constructs that exceed the limit +** from forming. +*/ +SQLITE_API int sqlite3_limit(sqlite3 *db, int limitId, int newLimit){ + int oldLimit; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return -1; + } +#endif + + /* EVIDENCE-OF: R-30189-54097 For each limit category SQLITE_LIMIT_NAME + ** there is a hard upper bound set at compile-time by a C preprocessor + ** macro called SQLITE_MAX_NAME. (The "_LIMIT_" in the name is changed to + ** "_MAX_".) + */ + assert( aHardLimit[SQLITE_LIMIT_LENGTH]==SQLITE_MAX_LENGTH ); + assert( aHardLimit[SQLITE_LIMIT_SQL_LENGTH]==SQLITE_MAX_SQL_LENGTH ); + assert( aHardLimit[SQLITE_LIMIT_COLUMN]==SQLITE_MAX_COLUMN ); + assert( aHardLimit[SQLITE_LIMIT_EXPR_DEPTH]==SQLITE_MAX_EXPR_DEPTH ); + assert( aHardLimit[SQLITE_LIMIT_COMPOUND_SELECT]==SQLITE_MAX_COMPOUND_SELECT); + assert( aHardLimit[SQLITE_LIMIT_VDBE_OP]==SQLITE_MAX_VDBE_OP ); + assert( aHardLimit[SQLITE_LIMIT_FUNCTION_ARG]==SQLITE_MAX_FUNCTION_ARG ); + assert( aHardLimit[SQLITE_LIMIT_ATTACHED]==SQLITE_MAX_ATTACHED ); + assert( aHardLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH]== + SQLITE_MAX_LIKE_PATTERN_LENGTH ); + assert( aHardLimit[SQLITE_LIMIT_VARIABLE_NUMBER]==SQLITE_MAX_VARIABLE_NUMBER); + assert( aHardLimit[SQLITE_LIMIT_TRIGGER_DEPTH]==SQLITE_MAX_TRIGGER_DEPTH ); + assert( aHardLimit[SQLITE_LIMIT_WORKER_THREADS]==SQLITE_MAX_WORKER_THREADS ); + assert( SQLITE_LIMIT_WORKER_THREADS==(SQLITE_N_LIMIT-1) ); + + + if( limitId<0 || limitId>=SQLITE_N_LIMIT ){ + return -1; + } + oldLimit = db->aLimit[limitId]; + if( newLimit>=0 ){ /* IMP: R-52476-28732 */ + if( newLimit>aHardLimit[limitId] ){ + newLimit = aHardLimit[limitId]; /* IMP: R-51463-25634 */ + } + db->aLimit[limitId] = newLimit; + } + return oldLimit; /* IMP: R-53341-35419 */ +} + +/* +** This function is used to parse both URIs and non-URI filenames passed by the +** user to API functions sqlite3_open() or sqlite3_open_v2(), and for database +** URIs specified as part of ATTACH statements. +** +** The first argument to this function is the name of the VFS to use (or +** a NULL to signify the default VFS) if the URI does not contain a "vfs=xxx" +** query parameter. The second argument contains the URI (or non-URI filename) +** itself. When this function is called the *pFlags variable should contain +** the default flags to open the database handle with. The value stored in +** *pFlags may be updated before returning if the URI filename contains +** "cache=xxx" or "mode=xxx" query parameters. +** +** If successful, SQLITE_OK is returned. In this case *ppVfs is set to point to +** the VFS that should be used to open the database file. *pzFile is set to +** point to a buffer containing the name of the file to open. It is the +** responsibility of the caller to eventually call sqlite3_free() to release +** this buffer. +** +** If an error occurs, then an SQLite error code is returned and *pzErrMsg +** may be set to point to a buffer containing an English language error +** message. It is the responsibility of the caller to eventually release +** this buffer by calling sqlite3_free(). +*/ +SQLITE_PRIVATE int sqlite3ParseUri( + const char *zDefaultVfs, /* VFS to use if no "vfs=xxx" query option */ + const char *zUri, /* Nul-terminated URI to parse */ + unsigned int *pFlags, /* IN/OUT: SQLITE_OPEN_XXX flags */ + sqlite3_vfs **ppVfs, /* OUT: VFS to use */ + char **pzFile, /* OUT: Filename component of URI */ + char **pzErrMsg /* OUT: Error message (if rc!=SQLITE_OK) */ +){ + int rc = SQLITE_OK; + unsigned int flags = *pFlags; + const char *zVfs = zDefaultVfs; + char *zFile; + char c; + int nUri = sqlite3Strlen30(zUri); + + assert( *pzErrMsg==0 ); + + if( ((flags & SQLITE_OPEN_URI) /* IMP: R-48725-32206 */ + || sqlite3GlobalConfig.bOpenUri) /* IMP: R-51689-46548 */ + && nUri>=5 && memcmp(zUri, "file:", 5)==0 /* IMP: R-57884-37496 */ + ){ + char *zOpt; + int eState; /* Parser state when parsing URI */ + int iIn; /* Input character index */ + int iOut = 0; /* Output character index */ + u64 nByte = nUri+2; /* Bytes of space to allocate */ + + /* Make sure the SQLITE_OPEN_URI flag is set to indicate to the VFS xOpen + ** method that there may be extra parameters following the file-name. */ + flags |= SQLITE_OPEN_URI; + + for(iIn=0; iIn=0 && octet<256 ); + if( octet==0 ){ + /* This branch is taken when "%00" appears within the URI. In this + ** case we ignore all text in the remainder of the path, name or + ** value currently being parsed. So ignore the current character + ** and skip to the next "?", "=" or "&", as appropriate. */ + while( (c = zUri[iIn])!=0 && c!='#' + && (eState!=0 || c!='?') + && (eState!=1 || (c!='=' && c!='&')) + && (eState!=2 || c!='&') + ){ + iIn++; + } + continue; + } + c = octet; + }else if( eState==1 && (c=='&' || c=='=') ){ + if( zFile[iOut-1]==0 ){ + /* An empty option name. Ignore this option altogether. */ + while( zUri[iIn] && zUri[iIn]!='#' && zUri[iIn-1]!='&' ) iIn++; + continue; + } + if( c=='&' ){ + zFile[iOut++] = '\0'; + }else{ + eState = 2; + } + c = 0; + }else if( (eState==0 && c=='?') || (eState==2 && c=='&') ){ + c = 0; + eState = 1; + } + zFile[iOut++] = c; + } + if( eState==1 ) zFile[iOut++] = '\0'; + zFile[iOut++] = '\0'; + zFile[iOut++] = '\0'; + + /* Check if there were any options specified that should be interpreted + ** here. Options that are interpreted here include "vfs" and those that + ** correspond to flags that may be passed to the sqlite3_open_v2() + ** method. */ + zOpt = &zFile[sqlite3Strlen30(zFile)+1]; + while( zOpt[0] ){ + int nOpt = sqlite3Strlen30(zOpt); + char *zVal = &zOpt[nOpt+1]; + int nVal = sqlite3Strlen30(zVal); + + if( nOpt==3 && memcmp("vfs", zOpt, 3)==0 ){ + zVfs = zVal; + }else{ + struct OpenMode { + const char *z; + int mode; + } *aMode = 0; + char *zModeType = 0; + int mask = 0; + int limit = 0; + + if( nOpt==5 && memcmp("cache", zOpt, 5)==0 ){ + static struct OpenMode aCacheMode[] = { + { "shared", SQLITE_OPEN_SHAREDCACHE }, + { "private", SQLITE_OPEN_PRIVATECACHE }, + { 0, 0 } + }; + + mask = SQLITE_OPEN_SHAREDCACHE|SQLITE_OPEN_PRIVATECACHE; + aMode = aCacheMode; + limit = mask; + zModeType = "cache"; + } + if( nOpt==4 && memcmp("mode", zOpt, 4)==0 ){ + static struct OpenMode aOpenMode[] = { + { "ro", SQLITE_OPEN_READONLY }, + { "rw", SQLITE_OPEN_READWRITE }, + { "rwc", SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE }, + { "memory", SQLITE_OPEN_MEMORY }, + { 0, 0 } + }; + + mask = SQLITE_OPEN_READONLY | SQLITE_OPEN_READWRITE + | SQLITE_OPEN_CREATE | SQLITE_OPEN_MEMORY; + aMode = aOpenMode; + limit = mask & flags; + zModeType = "access"; + } + + if( aMode ){ + int i; + int mode = 0; + for(i=0; aMode[i].z; i++){ + const char *z = aMode[i].z; + if( nVal==sqlite3Strlen30(z) && 0==memcmp(zVal, z, nVal) ){ + mode = aMode[i].mode; + break; + } + } + if( mode==0 ){ + *pzErrMsg = sqlite3_mprintf("no such %s mode: %s", zModeType, zVal); + rc = SQLITE_ERROR; + goto parse_uri_out; + } + if( (mode & ~SQLITE_OPEN_MEMORY)>limit ){ + *pzErrMsg = sqlite3_mprintf("%s mode not allowed: %s", + zModeType, zVal); + rc = SQLITE_PERM; + goto parse_uri_out; + } + flags = (flags & ~mask) | mode; + } + } + + zOpt = &zVal[nVal+1]; + } + + }else{ + zFile = sqlite3_malloc64(nUri+2); + if( !zFile ) return SQLITE_NOMEM_BKPT; + memcpy(zFile, zUri, nUri); + zFile[nUri] = '\0'; + zFile[nUri+1] = '\0'; + flags &= ~SQLITE_OPEN_URI; + } + + *ppVfs = sqlite3_vfs_find(zVfs); + if( *ppVfs==0 ){ + *pzErrMsg = sqlite3_mprintf("no such vfs: %s", zVfs); + rc = SQLITE_ERROR; + } + parse_uri_out: + if( rc!=SQLITE_OK ){ + sqlite3_free(zFile); + zFile = 0; + } + *pFlags = flags; + *pzFile = zFile; + return rc; +} + + +/* +** This routine does the work of opening a database on behalf of +** sqlite3_open() and sqlite3_open16(). The database filename "zFilename" +** is UTF-8 encoded. +*/ +static int openDatabase( + const char *zFilename, /* Database filename UTF-8 encoded */ + sqlite3 **ppDb, /* OUT: Returned database handle */ + unsigned int flags, /* Operational flags */ + const char *zVfs /* Name of the VFS to use */ +){ + sqlite3 *db; /* Store allocated handle here */ + int rc; /* Return code */ + int isThreadsafe; /* True for threadsafe connections */ + char *zOpen = 0; /* Filename argument to pass to BtreeOpen() */ + char *zErrMsg = 0; /* Error message from sqlite3ParseUri() */ + +#ifdef SQLITE_ENABLE_API_ARMOR + if( ppDb==0 ) return SQLITE_MISUSE_BKPT; +#endif + *ppDb = 0; +#ifndef SQLITE_OMIT_AUTOINIT + rc = sqlite3_initialize(); + if( rc ) return rc; +#endif + + /* Only allow sensible combinations of bits in the flags argument. + ** Throw an error if any non-sense combination is used. If we + ** do not block illegal combinations here, it could trigger + ** assert() statements in deeper layers. Sensible combinations + ** are: + ** + ** 1: SQLITE_OPEN_READONLY + ** 2: SQLITE_OPEN_READWRITE + ** 6: SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE + */ + assert( SQLITE_OPEN_READONLY == 0x01 ); + assert( SQLITE_OPEN_READWRITE == 0x02 ); + assert( SQLITE_OPEN_CREATE == 0x04 ); + testcase( (1<<(flags&7))==0x02 ); /* READONLY */ + testcase( (1<<(flags&7))==0x04 ); /* READWRITE */ + testcase( (1<<(flags&7))==0x40 ); /* READWRITE | CREATE */ + if( ((1<<(flags&7)) & 0x46)==0 ){ + return SQLITE_MISUSE_BKPT; /* IMP: R-65497-44594 */ + } + + if( sqlite3GlobalConfig.bCoreMutex==0 ){ + isThreadsafe = 0; + }else if( flags & SQLITE_OPEN_NOMUTEX ){ + isThreadsafe = 0; + }else if( flags & SQLITE_OPEN_FULLMUTEX ){ + isThreadsafe = 1; + }else{ + isThreadsafe = sqlite3GlobalConfig.bFullMutex; + } + if( flags & SQLITE_OPEN_PRIVATECACHE ){ + flags &= ~SQLITE_OPEN_SHAREDCACHE; + }else if( sqlite3GlobalConfig.sharedCacheEnabled ){ + flags |= SQLITE_OPEN_SHAREDCACHE; + } + + /* Remove harmful bits from the flags parameter + ** + ** The SQLITE_OPEN_NOMUTEX and SQLITE_OPEN_FULLMUTEX flags were + ** dealt with in the previous code block. Besides these, the only + ** valid input flags for sqlite3_open_v2() are SQLITE_OPEN_READONLY, + ** SQLITE_OPEN_READWRITE, SQLITE_OPEN_CREATE, SQLITE_OPEN_SHAREDCACHE, + ** SQLITE_OPEN_PRIVATECACHE, and some reserved bits. Silently mask + ** off all other flags. + */ + flags &= ~( SQLITE_OPEN_DELETEONCLOSE | + SQLITE_OPEN_EXCLUSIVE | + SQLITE_OPEN_MAIN_DB | + SQLITE_OPEN_TEMP_DB | + SQLITE_OPEN_TRANSIENT_DB | + SQLITE_OPEN_MAIN_JOURNAL | + SQLITE_OPEN_TEMP_JOURNAL | + SQLITE_OPEN_SUBJOURNAL | + SQLITE_OPEN_MASTER_JOURNAL | + SQLITE_OPEN_NOMUTEX | + SQLITE_OPEN_FULLMUTEX | + SQLITE_OPEN_WAL + ); + + /* Allocate the sqlite data structure */ + db = sqlite3MallocZero( sizeof(sqlite3) ); + if( db==0 ) goto opendb_out; + if( isThreadsafe ){ + db->mutex = sqlite3MutexAlloc(SQLITE_MUTEX_RECURSIVE); + if( db->mutex==0 ){ + sqlite3_free(db); + db = 0; + goto opendb_out; + } + } + sqlite3_mutex_enter(db->mutex); + db->errMask = 0xff; + db->nDb = 2; + db->magic = SQLITE_MAGIC_BUSY; + db->aDb = db->aDbStatic; + + assert( sizeof(db->aLimit)==sizeof(aHardLimit) ); + memcpy(db->aLimit, aHardLimit, sizeof(db->aLimit)); + db->aLimit[SQLITE_LIMIT_WORKER_THREADS] = SQLITE_DEFAULT_WORKER_THREADS; + db->autoCommit = 1; + db->nextAutovac = -1; + db->szMmap = sqlite3GlobalConfig.szMmap; + db->nextPagesize = 0; + db->nMaxSorterMmap = 0x7FFFFFFF; + db->flags |= SQLITE_ShortColNames | SQLITE_EnableTrigger | SQLITE_CacheSpill +#if !defined(SQLITE_DEFAULT_AUTOMATIC_INDEX) || SQLITE_DEFAULT_AUTOMATIC_INDEX + | SQLITE_AutoIndex +#endif +#if SQLITE_DEFAULT_CKPTFULLFSYNC + | SQLITE_CkptFullFSync +#endif +#if SQLITE_DEFAULT_FILE_FORMAT<4 + | SQLITE_LegacyFileFmt +#endif +#ifdef SQLITE_ENABLE_LOAD_EXTENSION + | SQLITE_LoadExtension +#endif +#if SQLITE_DEFAULT_RECURSIVE_TRIGGERS + | SQLITE_RecTriggers +#endif +#if defined(SQLITE_DEFAULT_FOREIGN_KEYS) && SQLITE_DEFAULT_FOREIGN_KEYS + | SQLITE_ForeignKeys +#endif +#if defined(SQLITE_REVERSE_UNORDERED_SELECTS) + | SQLITE_ReverseOrder +#endif +#if defined(SQLITE_ENABLE_OVERSIZE_CELL_CHECK) + | SQLITE_CellSizeCk +#endif +#if defined(SQLITE_ENABLE_FTS3_TOKENIZER) + | SQLITE_Fts3Tokenizer +#endif + ; + sqlite3HashInit(&db->aCollSeq); +#ifndef SQLITE_OMIT_VIRTUALTABLE + sqlite3HashInit(&db->aModule); +#endif + + /* Add the default collation sequence BINARY. BINARY works for both UTF-8 + ** and UTF-16, so add a version for each to avoid any unnecessary + ** conversions. The only error that can occur here is a malloc() failure. + ** + ** EVIDENCE-OF: R-52786-44878 SQLite defines three built-in collating + ** functions: + */ + createCollation(db, sqlite3StrBINARY, SQLITE_UTF8, 0, binCollFunc, 0); + createCollation(db, sqlite3StrBINARY, SQLITE_UTF16BE, 0, binCollFunc, 0); + createCollation(db, sqlite3StrBINARY, SQLITE_UTF16LE, 0, binCollFunc, 0); + createCollation(db, "NOCASE", SQLITE_UTF8, 0, nocaseCollatingFunc, 0); + createCollation(db, "RTRIM", SQLITE_UTF8, (void*)1, binCollFunc, 0); + if( db->mallocFailed ){ + goto opendb_out; + } + /* EVIDENCE-OF: R-08308-17224 The default collating function for all + ** strings is BINARY. + */ + db->pDfltColl = sqlite3FindCollSeq(db, SQLITE_UTF8, sqlite3StrBINARY, 0); + assert( db->pDfltColl!=0 ); + + /* Parse the filename/URI argument. */ + db->openFlags = flags; + rc = sqlite3ParseUri(zVfs, zFilename, &flags, &db->pVfs, &zOpen, &zErrMsg); + if( rc!=SQLITE_OK ){ + if( rc==SQLITE_NOMEM ) sqlite3OomFault(db); + sqlite3ErrorWithMsg(db, rc, zErrMsg ? "%s" : 0, zErrMsg); + sqlite3_free(zErrMsg); + goto opendb_out; + } + + /* Open the backend database driver */ + rc = sqlite3BtreeOpen(db->pVfs, zOpen, db, &db->aDb[0].pBt, 0, + flags | SQLITE_OPEN_MAIN_DB); + if( rc!=SQLITE_OK ){ + if( rc==SQLITE_IOERR_NOMEM ){ + rc = SQLITE_NOMEM_BKPT; + } + sqlite3Error(db, rc); + goto opendb_out; + } + sqlite3BtreeEnter(db->aDb[0].pBt); + db->aDb[0].pSchema = sqlite3SchemaGet(db, db->aDb[0].pBt); + if( !db->mallocFailed ) ENC(db) = SCHEMA_ENC(db); + sqlite3BtreeLeave(db->aDb[0].pBt); + db->aDb[1].pSchema = sqlite3SchemaGet(db, 0); + + /* The default safety_level for the main database is FULL; for the temp + ** database it is OFF. This matches the pager layer defaults. + */ + db->aDb[0].zDbSName = "main"; + db->aDb[0].safety_level = SQLITE_DEFAULT_SYNCHRONOUS+1; + db->aDb[1].zDbSName = "temp"; + db->aDb[1].safety_level = PAGER_SYNCHRONOUS_OFF; + + db->magic = SQLITE_MAGIC_OPEN; + if( db->mallocFailed ){ + goto opendb_out; + } + + /* Register all built-in functions, but do not attempt to read the + ** database schema yet. This is delayed until the first time the database + ** is accessed. + */ + sqlite3Error(db, SQLITE_OK); + sqlite3RegisterPerConnectionBuiltinFunctions(db); + rc = sqlite3_errcode(db); + +#ifdef SQLITE_ENABLE_FTS5 + /* Register any built-in FTS5 module before loading the automatic + ** extensions. This allows automatic extensions to register FTS5 + ** tokenizers and auxiliary functions. */ + if( !db->mallocFailed && rc==SQLITE_OK ){ + rc = sqlite3Fts5Init(db); + } +#endif + + /* Load automatic extensions - extensions that have been registered + ** using the sqlite3_automatic_extension() API. + */ + if( rc==SQLITE_OK ){ + sqlite3AutoLoadExtensions(db); + rc = sqlite3_errcode(db); + if( rc!=SQLITE_OK ){ + goto opendb_out; + } + } + +#ifdef SQLITE_ENABLE_FTS1 + if( !db->mallocFailed ){ + extern int sqlite3Fts1Init(sqlite3*); + rc = sqlite3Fts1Init(db); + } +#endif + +#ifdef SQLITE_ENABLE_FTS2 + if( !db->mallocFailed && rc==SQLITE_OK ){ + extern int sqlite3Fts2Init(sqlite3*); + rc = sqlite3Fts2Init(db); + } +#endif + +#ifdef SQLITE_ENABLE_FTS3 /* automatically defined by SQLITE_ENABLE_FTS4 */ + if( !db->mallocFailed && rc==SQLITE_OK ){ + rc = sqlite3Fts3Init(db); + } +#endif + +#ifdef SQLITE_ENABLE_ICU + if( !db->mallocFailed && rc==SQLITE_OK ){ + rc = sqlite3IcuInit(db); + } +#endif + +#ifdef SQLITE_ENABLE_RTREE + if( !db->mallocFailed && rc==SQLITE_OK){ + rc = sqlite3RtreeInit(db); + } +#endif + +#ifdef SQLITE_ENABLE_DBSTAT_VTAB + if( !db->mallocFailed && rc==SQLITE_OK){ + rc = sqlite3DbstatRegister(db); + } +#endif + +#ifdef SQLITE_ENABLE_JSON1 + if( !db->mallocFailed && rc==SQLITE_OK){ + rc = sqlite3Json1Init(db); + } +#endif + + /* -DSQLITE_DEFAULT_LOCKING_MODE=1 makes EXCLUSIVE the default locking + ** mode. -DSQLITE_DEFAULT_LOCKING_MODE=0 make NORMAL the default locking + ** mode. Doing nothing at all also makes NORMAL the default. + */ +#ifdef SQLITE_DEFAULT_LOCKING_MODE + db->dfltLockMode = SQLITE_DEFAULT_LOCKING_MODE; + sqlite3PagerLockingMode(sqlite3BtreePager(db->aDb[0].pBt), + SQLITE_DEFAULT_LOCKING_MODE); +#endif + + if( rc ) sqlite3Error(db, rc); + + /* Enable the lookaside-malloc subsystem */ + setupLookaside(db, 0, sqlite3GlobalConfig.szLookaside, + sqlite3GlobalConfig.nLookaside); + + sqlite3_wal_autocheckpoint(db, SQLITE_DEFAULT_WAL_AUTOCHECKPOINT); + +opendb_out: + if( db ){ + assert( db->mutex!=0 || isThreadsafe==0 + || sqlite3GlobalConfig.bFullMutex==0 ); + sqlite3_mutex_leave(db->mutex); + } + rc = sqlite3_errcode(db); + assert( db!=0 || rc==SQLITE_NOMEM ); + if( rc==SQLITE_NOMEM ){ + sqlite3_close(db); + db = 0; + }else if( rc!=SQLITE_OK ){ + db->magic = SQLITE_MAGIC_SICK; + } + *ppDb = db; +#ifdef SQLITE_ENABLE_SQLLOG + if( sqlite3GlobalConfig.xSqllog ){ + /* Opening a db handle. Fourth parameter is passed 0. */ + void *pArg = sqlite3GlobalConfig.pSqllogArg; + sqlite3GlobalConfig.xSqllog(pArg, db, zFilename, 0); + } +#endif +#if defined(SQLITE_HAS_CODEC) + if( rc==SQLITE_OK ){ + const char *zHexKey = sqlite3_uri_parameter(zOpen, "hexkey"); + if( zHexKey && zHexKey[0] ){ + u8 iByte; + int i; + char zKey[40]; + for(i=0, iByte=0; imutex); + assert( !db->mallocFailed ); + rc = createCollation(db, zName, (u8)enc, pCtx, xCompare, xDel); + rc = sqlite3ApiExit(db, rc); + sqlite3_mutex_leave(db->mutex); + return rc; +} + +#ifndef SQLITE_OMIT_UTF16 +/* +** Register a new collation sequence with the database handle db. +*/ +SQLITE_API int sqlite3_create_collation16( + sqlite3* db, + const void *zName, + int enc, + void* pCtx, + int(*xCompare)(void*,int,const void*,int,const void*) +){ + int rc = SQLITE_OK; + char *zName8; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) || zName==0 ) return SQLITE_MISUSE_BKPT; +#endif + sqlite3_mutex_enter(db->mutex); + assert( !db->mallocFailed ); + zName8 = sqlite3Utf16to8(db, zName, -1, SQLITE_UTF16NATIVE); + if( zName8 ){ + rc = createCollation(db, zName8, (u8)enc, pCtx, xCompare, 0); + sqlite3DbFree(db, zName8); + } + rc = sqlite3ApiExit(db, rc); + sqlite3_mutex_leave(db->mutex); + return rc; +} +#endif /* SQLITE_OMIT_UTF16 */ + +/* +** Register a collation sequence factory callback with the database handle +** db. Replace any previously installed collation sequence factory. +*/ +SQLITE_API int sqlite3_collation_needed( + sqlite3 *db, + void *pCollNeededArg, + void(*xCollNeeded)(void*,sqlite3*,int eTextRep,const char*) +){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; +#endif + sqlite3_mutex_enter(db->mutex); + db->xCollNeeded = xCollNeeded; + db->xCollNeeded16 = 0; + db->pCollNeededArg = pCollNeededArg; + sqlite3_mutex_leave(db->mutex); + return SQLITE_OK; +} + +#ifndef SQLITE_OMIT_UTF16 +/* +** Register a collation sequence factory callback with the database handle +** db. Replace any previously installed collation sequence factory. +*/ +SQLITE_API int sqlite3_collation_needed16( + sqlite3 *db, + void *pCollNeededArg, + void(*xCollNeeded16)(void*,sqlite3*,int eTextRep,const void*) +){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; +#endif + sqlite3_mutex_enter(db->mutex); + db->xCollNeeded = 0; + db->xCollNeeded16 = xCollNeeded16; + db->pCollNeededArg = pCollNeededArg; + sqlite3_mutex_leave(db->mutex); + return SQLITE_OK; +} +#endif /* SQLITE_OMIT_UTF16 */ + +#ifndef SQLITE_OMIT_DEPRECATED +/* +** This function is now an anachronism. It used to be used to recover from a +** malloc() failure, but SQLite now does this automatically. +*/ +SQLITE_API int sqlite3_global_recover(void){ + return SQLITE_OK; +} +#endif + +/* +** Test to see whether or not the database connection is in autocommit +** mode. Return TRUE if it is and FALSE if not. Autocommit mode is on +** by default. Autocommit is disabled by a BEGIN statement and reenabled +** by the next COMMIT or ROLLBACK. +*/ +SQLITE_API int sqlite3_get_autocommit(sqlite3 *db){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + return db->autoCommit; +} + +/* +** The following routines are substitutes for constants SQLITE_CORRUPT, +** SQLITE_MISUSE, SQLITE_CANTOPEN, SQLITE_NOMEM and possibly other error +** constants. They serve two purposes: +** +** 1. Serve as a convenient place to set a breakpoint in a debugger +** to detect when version error conditions occurs. +** +** 2. Invoke sqlite3_log() to provide the source code location where +** a low-level error is first detected. +*/ +static int reportError(int iErr, int lineno, const char *zType){ + sqlite3_log(iErr, "%s at line %d of [%.10s]", + zType, lineno, 20+sqlite3_sourceid()); + return iErr; +} +SQLITE_PRIVATE int sqlite3CorruptError(int lineno){ + testcase( sqlite3GlobalConfig.xLog!=0 ); + return reportError(SQLITE_CORRUPT, lineno, "database corruption"); +} +SQLITE_PRIVATE int sqlite3MisuseError(int lineno){ + testcase( sqlite3GlobalConfig.xLog!=0 ); + return reportError(SQLITE_MISUSE, lineno, "misuse"); +} +SQLITE_PRIVATE int sqlite3CantopenError(int lineno){ + testcase( sqlite3GlobalConfig.xLog!=0 ); + return reportError(SQLITE_CANTOPEN, lineno, "cannot open file"); +} +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE int sqlite3NomemError(int lineno){ + testcase( sqlite3GlobalConfig.xLog!=0 ); + return reportError(SQLITE_NOMEM, lineno, "OOM"); +} +SQLITE_PRIVATE int sqlite3IoerrnomemError(int lineno){ + testcase( sqlite3GlobalConfig.xLog!=0 ); + return reportError(SQLITE_IOERR_NOMEM, lineno, "I/O OOM error"); +} +#endif + +#ifndef SQLITE_OMIT_DEPRECATED +/* +** This is a convenience routine that makes sure that all thread-specific +** data for this thread has been deallocated. +** +** SQLite no longer uses thread-specific data so this routine is now a +** no-op. It is retained for historical compatibility. +*/ +SQLITE_API void sqlite3_thread_cleanup(void){ +} +#endif + +/* +** Return meta information about a specific column of a database table. +** See comment in sqlite3.h (sqlite.h.in) for details. +*/ +SQLITE_API int sqlite3_table_column_metadata( + sqlite3 *db, /* Connection handle */ + const char *zDbName, /* Database name or NULL */ + const char *zTableName, /* Table name */ + const char *zColumnName, /* Column name */ + char const **pzDataType, /* OUTPUT: Declared data type */ + char const **pzCollSeq, /* OUTPUT: Collation sequence name */ + int *pNotNull, /* OUTPUT: True if NOT NULL constraint exists */ + int *pPrimaryKey, /* OUTPUT: True if column part of PK */ + int *pAutoinc /* OUTPUT: True if column is auto-increment */ +){ + int rc; + char *zErrMsg = 0; + Table *pTab = 0; + Column *pCol = 0; + int iCol = 0; + char const *zDataType = 0; + char const *zCollSeq = 0; + int notnull = 0; + int primarykey = 0; + int autoinc = 0; + + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) || zTableName==0 ){ + return SQLITE_MISUSE_BKPT; + } +#endif + + /* Ensure the database schema has been loaded */ + sqlite3_mutex_enter(db->mutex); + sqlite3BtreeEnterAll(db); + rc = sqlite3Init(db, &zErrMsg); + if( SQLITE_OK!=rc ){ + goto error_out; + } + + /* Locate the table in question */ + pTab = sqlite3FindTable(db, zTableName, zDbName); + if( !pTab || pTab->pSelect ){ + pTab = 0; + goto error_out; + } + + /* Find the column for which info is requested */ + if( zColumnName==0 ){ + /* Query for existance of table only */ + }else{ + for(iCol=0; iColnCol; iCol++){ + pCol = &pTab->aCol[iCol]; + if( 0==sqlite3StrICmp(pCol->zName, zColumnName) ){ + break; + } + } + if( iCol==pTab->nCol ){ + if( HasRowid(pTab) && sqlite3IsRowid(zColumnName) ){ + iCol = pTab->iPKey; + pCol = iCol>=0 ? &pTab->aCol[iCol] : 0; + }else{ + pTab = 0; + goto error_out; + } + } + } + + /* The following block stores the meta information that will be returned + ** to the caller in local variables zDataType, zCollSeq, notnull, primarykey + ** and autoinc. At this point there are two possibilities: + ** + ** 1. The specified column name was rowid", "oid" or "_rowid_" + ** and there is no explicitly declared IPK column. + ** + ** 2. The table is not a view and the column name identified an + ** explicitly declared column. Copy meta information from *pCol. + */ + if( pCol ){ + zDataType = sqlite3ColumnType(pCol,0); + zCollSeq = pCol->zColl; + notnull = pCol->notNull!=0; + primarykey = (pCol->colFlags & COLFLAG_PRIMKEY)!=0; + autoinc = pTab->iPKey==iCol && (pTab->tabFlags & TF_Autoincrement)!=0; + }else{ + zDataType = "INTEGER"; + primarykey = 1; + } + if( !zCollSeq ){ + zCollSeq = sqlite3StrBINARY; + } + +error_out: + sqlite3BtreeLeaveAll(db); + + /* Whether the function call succeeded or failed, set the output parameters + ** to whatever their local counterparts contain. If an error did occur, + ** this has the effect of zeroing all output parameters. + */ + if( pzDataType ) *pzDataType = zDataType; + if( pzCollSeq ) *pzCollSeq = zCollSeq; + if( pNotNull ) *pNotNull = notnull; + if( pPrimaryKey ) *pPrimaryKey = primarykey; + if( pAutoinc ) *pAutoinc = autoinc; + + if( SQLITE_OK==rc && !pTab ){ + sqlite3DbFree(db, zErrMsg); + zErrMsg = sqlite3MPrintf(db, "no such table column: %s.%s", zTableName, + zColumnName); + rc = SQLITE_ERROR; + } + sqlite3ErrorWithMsg(db, rc, (zErrMsg?"%s":0), zErrMsg); + sqlite3DbFree(db, zErrMsg); + rc = sqlite3ApiExit(db, rc); + sqlite3_mutex_leave(db->mutex); + return rc; +} + +/* +** Sleep for a little while. Return the amount of time slept. +*/ +SQLITE_API int sqlite3_sleep(int ms){ + sqlite3_vfs *pVfs; + int rc; + pVfs = sqlite3_vfs_find(0); + if( pVfs==0 ) return 0; + + /* This function works in milliseconds, but the underlying OsSleep() + ** API uses microseconds. Hence the 1000's. + */ + rc = (sqlite3OsSleep(pVfs, 1000*ms)/1000); + return rc; +} + +/* +** Enable or disable the extended result codes. +*/ +SQLITE_API int sqlite3_extended_result_codes(sqlite3 *db, int onoff){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; +#endif + sqlite3_mutex_enter(db->mutex); + db->errMask = onoff ? 0xffffffff : 0xff; + sqlite3_mutex_leave(db->mutex); + return SQLITE_OK; +} + +/* +** Invoke the xFileControl method on a particular database. +*/ +SQLITE_API int sqlite3_file_control(sqlite3 *db, const char *zDbName, int op, void *pArg){ + int rc = SQLITE_ERROR; + Btree *pBtree; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; +#endif + sqlite3_mutex_enter(db->mutex); + pBtree = sqlite3DbNameToBtree(db, zDbName); + if( pBtree ){ + Pager *pPager; + sqlite3_file *fd; + sqlite3BtreeEnter(pBtree); + pPager = sqlite3BtreePager(pBtree); + assert( pPager!=0 ); + fd = sqlite3PagerFile(pPager); + assert( fd!=0 ); + if( op==SQLITE_FCNTL_FILE_POINTER ){ + *(sqlite3_file**)pArg = fd; + rc = SQLITE_OK; + }else if( op==SQLITE_FCNTL_VFS_POINTER ){ + *(sqlite3_vfs**)pArg = sqlite3PagerVfs(pPager); + rc = SQLITE_OK; + }else if( op==SQLITE_FCNTL_JOURNAL_POINTER ){ + *(sqlite3_file**)pArg = sqlite3PagerJrnlFile(pPager); + rc = SQLITE_OK; + }else if( fd->pMethods ){ + rc = sqlite3OsFileControl(fd, op, pArg); + }else{ + rc = SQLITE_NOTFOUND; + } + sqlite3BtreeLeave(pBtree); + } + sqlite3_mutex_leave(db->mutex); + return rc; +} + +/* +** Interface to the testing logic. +*/ +SQLITE_API int sqlite3_test_control(int op, ...){ + int rc = 0; +#ifdef SQLITE_OMIT_BUILTIN_TEST + UNUSED_PARAMETER(op); +#else + va_list ap; + va_start(ap, op); + switch( op ){ + + /* + ** Save the current state of the PRNG. + */ + case SQLITE_TESTCTRL_PRNG_SAVE: { + sqlite3PrngSaveState(); + break; + } + + /* + ** Restore the state of the PRNG to the last state saved using + ** PRNG_SAVE. If PRNG_SAVE has never before been called, then + ** this verb acts like PRNG_RESET. + */ + case SQLITE_TESTCTRL_PRNG_RESTORE: { + sqlite3PrngRestoreState(); + break; + } + + /* + ** Reset the PRNG back to its uninitialized state. The next call + ** to sqlite3_randomness() will reseed the PRNG using a single call + ** to the xRandomness method of the default VFS. + */ + case SQLITE_TESTCTRL_PRNG_RESET: { + sqlite3_randomness(0,0); + break; + } + + /* + ** sqlite3_test_control(BITVEC_TEST, size, program) + ** + ** Run a test against a Bitvec object of size. The program argument + ** is an array of integers that defines the test. Return -1 on a + ** memory allocation error, 0 on success, or non-zero for an error. + ** See the sqlite3BitvecBuiltinTest() for additional information. + */ + case SQLITE_TESTCTRL_BITVEC_TEST: { + int sz = va_arg(ap, int); + int *aProg = va_arg(ap, int*); + rc = sqlite3BitvecBuiltinTest(sz, aProg); + break; + } + + /* + ** sqlite3_test_control(FAULT_INSTALL, xCallback) + ** + ** Arrange to invoke xCallback() whenever sqlite3FaultSim() is called, + ** if xCallback is not NULL. + ** + ** As a test of the fault simulator mechanism itself, sqlite3FaultSim(0) + ** is called immediately after installing the new callback and the return + ** value from sqlite3FaultSim(0) becomes the return from + ** sqlite3_test_control(). + */ + case SQLITE_TESTCTRL_FAULT_INSTALL: { + /* MSVC is picky about pulling func ptrs from va lists. + ** http://support.microsoft.com/kb/47961 + ** sqlite3GlobalConfig.xTestCallback = va_arg(ap, int(*)(int)); + */ + typedef int(*TESTCALLBACKFUNC_t)(int); + sqlite3GlobalConfig.xTestCallback = va_arg(ap, TESTCALLBACKFUNC_t); + rc = sqlite3FaultSim(0); + break; + } + + /* + ** sqlite3_test_control(BENIGN_MALLOC_HOOKS, xBegin, xEnd) + ** + ** Register hooks to call to indicate which malloc() failures + ** are benign. + */ + case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS: { + typedef void (*void_function)(void); + void_function xBenignBegin; + void_function xBenignEnd; + xBenignBegin = va_arg(ap, void_function); + xBenignEnd = va_arg(ap, void_function); + sqlite3BenignMallocHooks(xBenignBegin, xBenignEnd); + break; + } + + /* + ** sqlite3_test_control(SQLITE_TESTCTRL_PENDING_BYTE, unsigned int X) + ** + ** Set the PENDING byte to the value in the argument, if X>0. + ** Make no changes if X==0. Return the value of the pending byte + ** as it existing before this routine was called. + ** + ** IMPORTANT: Changing the PENDING byte from 0x40000000 results in + ** an incompatible database file format. Changing the PENDING byte + ** while any database connection is open results in undefined and + ** deleterious behavior. + */ + case SQLITE_TESTCTRL_PENDING_BYTE: { + rc = PENDING_BYTE; +#ifndef SQLITE_OMIT_WSD + { + unsigned int newVal = va_arg(ap, unsigned int); + if( newVal ) sqlite3PendingByte = newVal; + } +#endif + break; + } + + /* + ** sqlite3_test_control(SQLITE_TESTCTRL_ASSERT, int X) + ** + ** This action provides a run-time test to see whether or not + ** assert() was enabled at compile-time. If X is true and assert() + ** is enabled, then the return value is true. If X is true and + ** assert() is disabled, then the return value is zero. If X is + ** false and assert() is enabled, then the assertion fires and the + ** process aborts. If X is false and assert() is disabled, then the + ** return value is zero. + */ + case SQLITE_TESTCTRL_ASSERT: { + volatile int x = 0; + assert( /*side-effects-ok*/ (x = va_arg(ap,int))!=0 ); + rc = x; + break; + } + + + /* + ** sqlite3_test_control(SQLITE_TESTCTRL_ALWAYS, int X) + ** + ** This action provides a run-time test to see how the ALWAYS and + ** NEVER macros were defined at compile-time. + ** + ** The return value is ALWAYS(X). + ** + ** The recommended test is X==2. If the return value is 2, that means + ** ALWAYS() and NEVER() are both no-op pass-through macros, which is the + ** default setting. If the return value is 1, then ALWAYS() is either + ** hard-coded to true or else it asserts if its argument is false. + ** The first behavior (hard-coded to true) is the case if + ** SQLITE_TESTCTRL_ASSERT shows that assert() is disabled and the second + ** behavior (assert if the argument to ALWAYS() is false) is the case if + ** SQLITE_TESTCTRL_ASSERT shows that assert() is enabled. + ** + ** The run-time test procedure might look something like this: + ** + ** if( sqlite3_test_control(SQLITE_TESTCTRL_ALWAYS, 2)==2 ){ + ** // ALWAYS() and NEVER() are no-op pass-through macros + ** }else if( sqlite3_test_control(SQLITE_TESTCTRL_ASSERT, 1) ){ + ** // ALWAYS(x) asserts that x is true. NEVER(x) asserts x is false. + ** }else{ + ** // ALWAYS(x) is a constant 1. NEVER(x) is a constant 0. + ** } + */ + case SQLITE_TESTCTRL_ALWAYS: { + int x = va_arg(ap,int); + rc = ALWAYS(x); + break; + } + + /* + ** sqlite3_test_control(SQLITE_TESTCTRL_BYTEORDER); + ** + ** The integer returned reveals the byte-order of the computer on which + ** SQLite is running: + ** + ** 1 big-endian, determined at run-time + ** 10 little-endian, determined at run-time + ** 432101 big-endian, determined at compile-time + ** 123410 little-endian, determined at compile-time + */ + case SQLITE_TESTCTRL_BYTEORDER: { + rc = SQLITE_BYTEORDER*100 + SQLITE_LITTLEENDIAN*10 + SQLITE_BIGENDIAN; + break; + } + + /* sqlite3_test_control(SQLITE_TESTCTRL_RESERVE, sqlite3 *db, int N) + ** + ** Set the nReserve size to N for the main database on the database + ** connection db. + */ + case SQLITE_TESTCTRL_RESERVE: { + sqlite3 *db = va_arg(ap, sqlite3*); + int x = va_arg(ap,int); + sqlite3_mutex_enter(db->mutex); + sqlite3BtreeSetPageSize(db->aDb[0].pBt, 0, x, 0); + sqlite3_mutex_leave(db->mutex); + 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*); + db->dbOptFlags = (u16)(va_arg(ap, int) & 0xffff); + 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 + + /* sqlite3_test_control(SQLITE_TESTCTRL_SCRATCHMALLOC, sz, &pNew, pFree); + ** + ** Pass pFree into sqlite3ScratchFree(). + ** If sz>0 then allocate a scratch buffer into pNew. + */ + case SQLITE_TESTCTRL_SCRATCHMALLOC: { + void *pFree, **ppNew; + int sz; + sz = va_arg(ap, int); + ppNew = va_arg(ap, void**); + pFree = va_arg(ap, void*); + if( sz ) *ppNew = sqlite3ScratchMalloc(sz); + sqlite3ScratchFree(pFree); + break; + } + + /* sqlite3_test_control(SQLITE_TESTCTRL_LOCALTIME_FAULT, int onoff); + ** + ** If parameter onoff is non-zero, configure the wrappers so that all + ** subsequent calls to localtime() and variants fail. If onoff is zero, + ** undo this setting. + */ + case SQLITE_TESTCTRL_LOCALTIME_FAULT: { + sqlite3GlobalConfig.bLocaltimeFault = va_arg(ap, int); + break; + } + + /* sqlite3_test_control(SQLITE_TESTCTRL_NEVER_CORRUPT, int); + ** + ** Set or clear a flag that indicates that the database file is always well- + ** formed and never corrupt. This flag is clear by default, indicating that + ** database files might have arbitrary corruption. Setting the flag during + ** testing causes certain assert() statements in the code to be activated + ** that demonstrat invariants on well-formed database files. + */ + case SQLITE_TESTCTRL_NEVER_CORRUPT: { + sqlite3GlobalConfig.neverCorrupt = va_arg(ap, int); + break; + } + + /* Set the threshold at which OP_Once counters reset back to zero. + ** By default this is 0x7ffffffe (over 2 billion), but that value is + ** too big to test in a reasonable amount of time, so this control is + ** provided to set a small and easily reachable reset value. + */ + case SQLITE_TESTCTRL_ONCE_RESET_THRESHOLD: { + sqlite3GlobalConfig.iOnceResetThreshold = va_arg(ap, int); + break; + } + + /* sqlite3_test_control(SQLITE_TESTCTRL_VDBE_COVERAGE, xCallback, ptr); + ** + ** Set the VDBE coverage callback function to xCallback with context + ** pointer ptr. + */ + case SQLITE_TESTCTRL_VDBE_COVERAGE: { +#ifdef SQLITE_VDBE_COVERAGE + typedef void (*branch_callback)(void*,int,u8,u8); + sqlite3GlobalConfig.xVdbeBranch = va_arg(ap,branch_callback); + sqlite3GlobalConfig.pVdbeBranchArg = va_arg(ap,void*); +#endif + break; + } + + /* sqlite3_test_control(SQLITE_TESTCTRL_SORTER_MMAP, db, nMax); */ + case SQLITE_TESTCTRL_SORTER_MMAP: { + sqlite3 *db = va_arg(ap, sqlite3*); + db->nMaxSorterMmap = va_arg(ap, int); + break; + } + + /* sqlite3_test_control(SQLITE_TESTCTRL_ISINIT); + ** + ** Return SQLITE_OK if SQLite has been initialized and SQLITE_ERROR if + ** not. + */ + case SQLITE_TESTCTRL_ISINIT: { + if( sqlite3GlobalConfig.isInit==0 ) rc = SQLITE_ERROR; + break; + } + + /* sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, db, dbName, onOff, tnum); + ** + ** This test control is used to create imposter tables. "db" is a pointer + ** to the database connection. dbName is the database name (ex: "main" or + ** "temp") which will receive the imposter. "onOff" turns imposter mode on + ** or off. "tnum" is the root page of the b-tree to which the imposter + ** table should connect. + ** + ** Enable imposter mode only when the schema has already been parsed. Then + ** run a single CREATE TABLE statement to construct the imposter table in + ** the parsed schema. Then turn imposter mode back off again. + ** + ** If onOff==0 and tnum>0 then reset the schema for all databases, causing + ** the schema to be reparsed the next time it is needed. This has the + ** effect of erasing all imposter tables. + */ + case SQLITE_TESTCTRL_IMPOSTER: { + sqlite3 *db = va_arg(ap, sqlite3*); + sqlite3_mutex_enter(db->mutex); + db->init.iDb = sqlite3FindDbName(db, va_arg(ap,const char*)); + db->init.busy = db->init.imposterTable = va_arg(ap,int); + db->init.newTnum = va_arg(ap,int); + if( db->init.busy==0 && db->init.newTnum>0 ){ + sqlite3ResetAllSchemasOfConnection(db); + } + sqlite3_mutex_leave(db->mutex); + break; + } + } + va_end(ap); +#endif /* SQLITE_OMIT_BUILTIN_TEST */ + return rc; +} + +/* +** This is a utility routine, useful to VFS implementations, that checks +** to see if a database file was a URI that contained a specific query +** parameter, and if so obtains the value of the query parameter. +** +** The zFilename argument is the filename pointer passed into the xOpen() +** method of a VFS implementation. The zParam argument is the name of the +** query parameter we seek. This routine returns the value of the zParam +** parameter if it exists. If the parameter does not exist, this routine +** returns a NULL pointer. +*/ +SQLITE_API const char *sqlite3_uri_parameter(const char *zFilename, const char *zParam){ + if( zFilename==0 || zParam==0 ) return 0; + zFilename += sqlite3Strlen30(zFilename) + 1; + while( zFilename[0] ){ + int x = strcmp(zFilename, zParam); + zFilename += sqlite3Strlen30(zFilename) + 1; + if( x==0 ) return zFilename; + zFilename += sqlite3Strlen30(zFilename) + 1; + } + return 0; +} + +/* +** Return a boolean value for a query parameter. +*/ +SQLITE_API int sqlite3_uri_boolean(const char *zFilename, const char *zParam, int bDflt){ + const char *z = sqlite3_uri_parameter(zFilename, zParam); + bDflt = bDflt!=0; + return z ? sqlite3GetBoolean(z, bDflt) : bDflt; +} + +/* +** Return a 64-bit integer value for a query parameter. +*/ +SQLITE_API sqlite3_int64 sqlite3_uri_int64( + const char *zFilename, /* Filename as passed to xOpen */ + const char *zParam, /* URI parameter sought */ + sqlite3_int64 bDflt /* return if parameter is missing */ +){ + const char *z = sqlite3_uri_parameter(zFilename, zParam); + sqlite3_int64 v; + if( z && sqlite3DecOrHexToI64(z, &v)==SQLITE_OK ){ + bDflt = v; + } + return bDflt; +} + +/* +** Return the Btree pointer identified by zDbName. Return NULL if not found. +*/ +SQLITE_PRIVATE Btree *sqlite3DbNameToBtree(sqlite3 *db, const char *zDbName){ + int i; + for(i=0; inDb; i++){ + if( db->aDb[i].pBt + && (zDbName==0 || sqlite3StrICmp(zDbName, db->aDb[i].zDbSName)==0) + ){ + return db->aDb[i].pBt; + } + } + return 0; +} + +/* +** Return the filename of the database associated with a database +** connection. +*/ +SQLITE_API const char *sqlite3_db_filename(sqlite3 *db, const char *zDbName){ + Btree *pBt; +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + pBt = sqlite3DbNameToBtree(db, zDbName); + return pBt ? sqlite3BtreeGetFilename(pBt) : 0; +} + +/* +** Return 1 if database is read-only or 0 if read/write. Return -1 if +** no such database exists. +*/ +SQLITE_API int sqlite3_db_readonly(sqlite3 *db, const char *zDbName){ + Btree *pBt; +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return -1; + } +#endif + pBt = sqlite3DbNameToBtree(db, zDbName); + return pBt ? sqlite3BtreeIsReadonly(pBt) : -1; +} + +#ifdef SQLITE_ENABLE_SNAPSHOT +/* +** Obtain a snapshot handle for the snapshot of database zDb currently +** being read by handle db. +*/ +SQLITE_API int sqlite3_snapshot_get( + sqlite3 *db, + const char *zDb, + sqlite3_snapshot **ppSnapshot +){ + int rc = SQLITE_ERROR; +#ifndef SQLITE_OMIT_WAL + int iDb; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + return SQLITE_MISUSE_BKPT; + } +#endif + sqlite3_mutex_enter(db->mutex); + + iDb = sqlite3FindDbName(db, zDb); + if( iDb==0 || iDb>1 ){ + Btree *pBt = db->aDb[iDb].pBt; + if( 0==sqlite3BtreeIsInTrans(pBt) ){ + rc = sqlite3BtreeBeginTrans(pBt, 0); + if( rc==SQLITE_OK ){ + rc = sqlite3PagerSnapshotGet(sqlite3BtreePager(pBt), ppSnapshot); + } + } + } + + sqlite3_mutex_leave(db->mutex); +#endif /* SQLITE_OMIT_WAL */ + return rc; +} + +/* +** Open a read-transaction on the snapshot idendified by pSnapshot. +*/ +SQLITE_API int sqlite3_snapshot_open( + sqlite3 *db, + const char *zDb, + sqlite3_snapshot *pSnapshot +){ + int rc = SQLITE_ERROR; +#ifndef SQLITE_OMIT_WAL + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + return SQLITE_MISUSE_BKPT; + } +#endif + sqlite3_mutex_enter(db->mutex); + if( db->autoCommit==0 ){ + int iDb; + iDb = sqlite3FindDbName(db, zDb); + if( iDb==0 || iDb>1 ){ + Btree *pBt = db->aDb[iDb].pBt; + if( 0==sqlite3BtreeIsInReadTrans(pBt) ){ + rc = sqlite3PagerSnapshotOpen(sqlite3BtreePager(pBt), pSnapshot); + if( rc==SQLITE_OK ){ + rc = sqlite3BtreeBeginTrans(pBt, 0); + sqlite3PagerSnapshotOpen(sqlite3BtreePager(pBt), 0); + } + } + } + } + + sqlite3_mutex_leave(db->mutex); +#endif /* SQLITE_OMIT_WAL */ + return rc; +} + +/* +** Free a snapshot handle obtained from sqlite3_snapshot_get(). +*/ +SQLITE_API void sqlite3_snapshot_free(sqlite3_snapshot *pSnapshot){ + sqlite3_free(pSnapshot); +} +#endif /* SQLITE_ENABLE_SNAPSHOT */ + +/************** End of main.c ************************************************/ +/************** Begin file notify.c ******************************************/ +/* +** 2009 March 3 +** +** 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 the implementation of the sqlite3_unlock_notify() +** API method and its associated functionality. +*/ +/* #include "sqliteInt.h" */ +/* #include "btreeInt.h" */ + +/* Omit this entire file if SQLITE_ENABLE_UNLOCK_NOTIFY is not defined. */ +#ifdef SQLITE_ENABLE_UNLOCK_NOTIFY + +/* +** Public interfaces: +** +** sqlite3ConnectionBlocked() +** sqlite3ConnectionUnlocked() +** sqlite3ConnectionClosed() +** sqlite3_unlock_notify() +*/ + +#define assertMutexHeld() \ + assert( sqlite3_mutex_held(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER)) ) + +/* +** Head of a linked list of all sqlite3 objects created by this process +** for which either sqlite3.pBlockingConnection or sqlite3.pUnlockConnection +** is not NULL. This variable may only accessed while the STATIC_MASTER +** mutex is held. +*/ +static sqlite3 *SQLITE_WSD sqlite3BlockedList = 0; + +#ifndef NDEBUG +/* +** This function is a complex assert() that verifies the following +** properties of the blocked connections list: +** +** 1) Each entry in the list has a non-NULL value for either +** pUnlockConnection or pBlockingConnection, or both. +** +** 2) All entries in the list that share a common value for +** xUnlockNotify are grouped together. +** +** 3) If the argument db is not NULL, then none of the entries in the +** blocked connections list have pUnlockConnection or pBlockingConnection +** set to db. This is used when closing connection db. +*/ +static void checkListProperties(sqlite3 *db){ + sqlite3 *p; + for(p=sqlite3BlockedList; p; p=p->pNextBlocked){ + int seen = 0; + sqlite3 *p2; + + /* Verify property (1) */ + assert( p->pUnlockConnection || p->pBlockingConnection ); + + /* Verify property (2) */ + for(p2=sqlite3BlockedList; p2!=p; p2=p2->pNextBlocked){ + if( p2->xUnlockNotify==p->xUnlockNotify ) seen = 1; + assert( p2->xUnlockNotify==p->xUnlockNotify || !seen ); + assert( db==0 || p->pUnlockConnection!=db ); + assert( db==0 || p->pBlockingConnection!=db ); + } + } +} +#else +# define checkListProperties(x) +#endif + +/* +** Remove connection db from the blocked connections list. If connection +** db is not currently a part of the list, this function is a no-op. +*/ +static void removeFromBlockedList(sqlite3 *db){ + sqlite3 **pp; + assertMutexHeld(); + for(pp=&sqlite3BlockedList; *pp; pp = &(*pp)->pNextBlocked){ + if( *pp==db ){ + *pp = (*pp)->pNextBlocked; + break; + } + } +} + +/* +** Add connection db to the blocked connections list. It is assumed +** that it is not already a part of the list. +*/ +static void addToBlockedList(sqlite3 *db){ + sqlite3 **pp; + assertMutexHeld(); + for( + pp=&sqlite3BlockedList; + *pp && (*pp)->xUnlockNotify!=db->xUnlockNotify; + pp=&(*pp)->pNextBlocked + ); + db->pNextBlocked = *pp; + *pp = db; +} + +/* +** Obtain the STATIC_MASTER mutex. +*/ +static void enterMutex(void){ + sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER)); + checkListProperties(0); +} + +/* +** Release the STATIC_MASTER mutex. +*/ +static void leaveMutex(void){ + assertMutexHeld(); + checkListProperties(0); + sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER)); +} + +/* +** Register an unlock-notify callback. +** +** This is called after connection "db" has attempted some operation +** but has received an SQLITE_LOCKED error because another connection +** (call it pOther) in the same process was busy using the same shared +** cache. pOther is found by looking at db->pBlockingConnection. +** +** If there is no blocking connection, the callback is invoked immediately, +** before this routine returns. +** +** If pOther is already blocked on db, then report SQLITE_LOCKED, to indicate +** a deadlock. +** +** Otherwise, make arrangements to invoke xNotify when pOther drops +** its locks. +** +** Each call to this routine overrides any prior callbacks registered +** on the same "db". If xNotify==0 then any prior callbacks are immediately +** cancelled. +*/ +SQLITE_API int sqlite3_unlock_notify( + sqlite3 *db, + void (*xNotify)(void **, int), + void *pArg +){ + int rc = SQLITE_OK; + + sqlite3_mutex_enter(db->mutex); + enterMutex(); + + if( xNotify==0 ){ + removeFromBlockedList(db); + db->pBlockingConnection = 0; + db->pUnlockConnection = 0; + db->xUnlockNotify = 0; + db->pUnlockArg = 0; + }else if( 0==db->pBlockingConnection ){ + /* The blocking transaction has been concluded. Or there never was a + ** blocking transaction. In either case, invoke the notify callback + ** immediately. + */ + xNotify(&pArg, 1); + }else{ + sqlite3 *p; + + for(p=db->pBlockingConnection; p && p!=db; p=p->pUnlockConnection){} + if( p ){ + rc = SQLITE_LOCKED; /* Deadlock detected. */ + }else{ + db->pUnlockConnection = db->pBlockingConnection; + db->xUnlockNotify = xNotify; + db->pUnlockArg = pArg; + removeFromBlockedList(db); + addToBlockedList(db); + } + } + + leaveMutex(); + assert( !db->mallocFailed ); + sqlite3ErrorWithMsg(db, rc, (rc?"database is deadlocked":0)); + sqlite3_mutex_leave(db->mutex); + return rc; +} + +/* +** This function is called while stepping or preparing a statement +** associated with connection db. The operation will return SQLITE_LOCKED +** to the user because it requires a lock that will not be available +** until connection pBlocker concludes its current transaction. +*/ +SQLITE_PRIVATE void sqlite3ConnectionBlocked(sqlite3 *db, sqlite3 *pBlocker){ + enterMutex(); + if( db->pBlockingConnection==0 && db->pUnlockConnection==0 ){ + addToBlockedList(db); + } + db->pBlockingConnection = pBlocker; + leaveMutex(); +} + +/* +** This function is called when +** the transaction opened by database db has just finished. Locks held +** by database connection db have been released. +** +** This function loops through each entry in the blocked connections +** list and does the following: +** +** 1) If the sqlite3.pBlockingConnection member of a list entry is +** set to db, then set pBlockingConnection=0. +** +** 2) If the sqlite3.pUnlockConnection member of a list entry is +** set to db, then invoke the configured unlock-notify callback and +** set pUnlockConnection=0. +** +** 3) If the two steps above mean that pBlockingConnection==0 and +** pUnlockConnection==0, remove the entry from the blocked connections +** list. +*/ +SQLITE_PRIVATE void sqlite3ConnectionUnlocked(sqlite3 *db){ + void (*xUnlockNotify)(void **, int) = 0; /* Unlock-notify cb to invoke */ + int nArg = 0; /* Number of entries in aArg[] */ + sqlite3 **pp; /* Iterator variable */ + void **aArg; /* Arguments to the unlock callback */ + void **aDyn = 0; /* Dynamically allocated space for aArg[] */ + void *aStatic[16]; /* Starter space for aArg[]. No malloc required */ + + aArg = aStatic; + enterMutex(); /* Enter STATIC_MASTER mutex */ + + /* This loop runs once for each entry in the blocked-connections list. */ + for(pp=&sqlite3BlockedList; *pp; /* no-op */ ){ + sqlite3 *p = *pp; + + /* Step 1. */ + if( p->pBlockingConnection==db ){ + p->pBlockingConnection = 0; + } + + /* Step 2. */ + if( p->pUnlockConnection==db ){ + assert( p->xUnlockNotify ); + if( p->xUnlockNotify!=xUnlockNotify && nArg!=0 ){ + xUnlockNotify(aArg, nArg); + nArg = 0; + } + + sqlite3BeginBenignMalloc(); + assert( aArg==aDyn || (aDyn==0 && aArg==aStatic) ); + assert( nArg<=(int)ArraySize(aStatic) || aArg==aDyn ); + if( (!aDyn && nArg==(int)ArraySize(aStatic)) + || (aDyn && nArg==(int)(sqlite3MallocSize(aDyn)/sizeof(void*))) + ){ + /* The aArg[] array needs to grow. */ + void **pNew = (void **)sqlite3Malloc(nArg*sizeof(void *)*2); + if( pNew ){ + memcpy(pNew, aArg, nArg*sizeof(void *)); + sqlite3_free(aDyn); + aDyn = aArg = pNew; + }else{ + /* This occurs when the array of context pointers that need to + ** be passed to the unlock-notify callback is larger than the + ** aStatic[] array allocated on the stack and the attempt to + ** allocate a larger array from the heap has failed. + ** + ** This is a difficult situation to handle. Returning an error + ** code to the caller is insufficient, as even if an error code + ** is returned the transaction on connection db will still be + ** closed and the unlock-notify callbacks on blocked connections + ** will go unissued. This might cause the application to wait + ** indefinitely for an unlock-notify callback that will never + ** arrive. + ** + ** Instead, invoke the unlock-notify callback with the context + ** array already accumulated. We can then clear the array and + ** begin accumulating any further context pointers without + ** requiring any dynamic allocation. This is sub-optimal because + ** it means that instead of one callback with a large array of + ** context pointers the application will receive two or more + ** callbacks with smaller arrays of context pointers, which will + ** reduce the applications ability to prioritize multiple + ** connections. But it is the best that can be done under the + ** circumstances. + */ + xUnlockNotify(aArg, nArg); + nArg = 0; + } + } + sqlite3EndBenignMalloc(); + + aArg[nArg++] = p->pUnlockArg; + xUnlockNotify = p->xUnlockNotify; + p->pUnlockConnection = 0; + p->xUnlockNotify = 0; + p->pUnlockArg = 0; + } + + /* Step 3. */ + if( p->pBlockingConnection==0 && p->pUnlockConnection==0 ){ + /* Remove connection p from the blocked connections list. */ + *pp = p->pNextBlocked; + p->pNextBlocked = 0; + }else{ + pp = &p->pNextBlocked; + } + } + + if( nArg!=0 ){ + xUnlockNotify(aArg, nArg); + } + sqlite3_free(aDyn); + leaveMutex(); /* Leave STATIC_MASTER mutex */ +} + +/* +** This is called when the database connection passed as an argument is +** being closed. The connection is removed from the blocked list. +*/ +SQLITE_PRIVATE void sqlite3ConnectionClosed(sqlite3 *db){ + sqlite3ConnectionUnlocked(db); + enterMutex(); + removeFromBlockedList(db); + checkListProperties(db); + leaveMutex(); +} +#endif + +/************** End of notify.c **********************************************/ +/************** Begin file fts3.c ********************************************/ +/* +** 2006 Oct 10 +** +** 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 an SQLite module implementing full-text search. +*/ + +/* +** 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). +*/ + +/* The full-text index is stored in a series of b+tree (-like) +** structures called segments which map terms to doclists. The +** structures are like b+trees in layout, but are constructed from the +** bottom up in optimal fashion and are not updatable. Since trees +** are built from the bottom up, things will be described from the +** bottom up. +** +** +**** Varints **** +** The basic unit of encoding is a variable-length integer called a +** varint. We encode variable-length integers in little-endian order +** using seven bits * per byte as follows: +** +** KEY: +** A = 0xxxxxxx 7 bits of data and one flag bit +** B = 1xxxxxxx 7 bits of data and one flag bit +** +** 7 bits - A +** 14 bits - BA +** 21 bits - BBA +** and so on. +** +** This is similar in concept to how sqlite encodes "varints" but +** the encoding is not the same. SQLite varints are big-endian +** are are limited to 9 bytes in length whereas FTS3 varints are +** little-endian and can be up to 10 bytes in length (in theory). +** +** Example encodings: +** +** 1: 0x01 +** 127: 0x7f +** 128: 0x81 0x00 +** +** +**** Document lists **** +** A doclist (document list) holds a docid-sorted list of hits for a +** given term. Doclists hold docids and associated token positions. +** A docid is the unique integer identifier for a single document. +** A position is the index of a word within the document. The first +** word of the document has a position of 0. +** +** FTS3 used to optionally store character offsets using a compile-time +** option. But that functionality is no longer supported. +** +** A doclist is stored like this: +** +** array { +** varint docid; (delta from previous doclist) +** array { (position list for column 0) +** varint position; (2 more than the delta from previous position) +** } +** array { +** varint POS_COLUMN; (marks start of position list for new column) +** varint column; (index of new column) +** array { +** varint position; (2 more than the delta from previous position) +** } +** } +** varint POS_END; (marks end of positions for this document. +** } +** +** Here, array { X } means zero or more occurrences of X, adjacent in +** memory. A "position" is an index of a token in the token stream +** generated by the tokenizer. Note that POS_END and POS_COLUMN occur +** in the same logical place as the position element, and act as sentinals +** ending a position list array. POS_END is 0. POS_COLUMN is 1. +** The positions numbers are not stored literally but rather as two more +** than the difference from the prior position, or the just the position plus +** 2 for the first position. Example: +** +** label: A B C D E F G H I J K +** value: 123 5 9 1 1 14 35 0 234 72 0 +** +** The 123 value is the first docid. For column zero in this document +** there are two matches at positions 3 and 10 (5-2 and 9-2+3). The 1 +** at D signals the start of a new column; the 1 at E indicates that the +** new column is column number 1. There are two positions at 12 and 45 +** (14-2 and 35-2+12). The 0 at H indicate the end-of-document. The +** 234 at I is the delta to next docid (357). It has one position 70 +** (72-2) and then terminates with the 0 at K. +** +** A "position-list" is the list of positions for multiple columns for +** a single docid. A "column-list" is the set of positions for a single +** column. Hence, a position-list consists of one or more column-lists, +** a document record consists of a docid followed by a position-list and +** a doclist consists of one or more document records. +** +** A bare doclist omits the position information, becoming an +** array of varint-encoded docids. +** +**** Segment leaf nodes **** +** Segment leaf nodes store terms and doclists, ordered by term. Leaf +** nodes are written using LeafWriter, and read using LeafReader (to +** iterate through a single leaf node's data) and LeavesReader (to +** iterate through a segment's entire leaf layer). Leaf nodes have +** the format: +** +** varint iHeight; (height from leaf level, always 0) +** varint nTerm; (length of first term) +** char pTerm[nTerm]; (content of first term) +** varint nDoclist; (length of term's associated doclist) +** char pDoclist[nDoclist]; (content of doclist) +** array { +** (further terms are delta-encoded) +** varint nPrefix; (length of prefix shared with previous term) +** varint nSuffix; (length of unshared suffix) +** char pTermSuffix[nSuffix];(unshared suffix of next term) +** varint nDoclist; (length of term's associated doclist) +** char pDoclist[nDoclist]; (content of doclist) +** } +** +** Here, array { X } means zero or more occurrences of X, adjacent in +** memory. +** +** Leaf nodes are broken into blocks which are stored contiguously in +** the %_segments table in sorted order. This means that when the end +** of a node is reached, the next term is in the node with the next +** greater node id. +** +** New data is spilled to a new leaf node when the current node +** exceeds LEAF_MAX bytes (default 2048). New data which itself is +** larger than STANDALONE_MIN (default 1024) is placed in a standalone +** node (a leaf node with a single term and doclist). The goal of +** these settings is to pack together groups of small doclists while +** making it efficient to directly access large doclists. The +** assumption is that large doclists represent terms which are more +** likely to be query targets. +** +** TODO(shess) It may be useful for blocking decisions to be more +** dynamic. For instance, it may make more sense to have a 2.5k leaf +** node rather than splitting into 2k and .5k nodes. My intuition is +** that this might extend through 2x or 4x the pagesize. +** +** +**** Segment interior nodes **** +** Segment interior nodes store blockids for subtree nodes and terms +** to describe what data is stored by the each subtree. Interior +** nodes are written using InteriorWriter, and read using +** InteriorReader. InteriorWriters are created as needed when +** SegmentWriter creates new leaf nodes, or when an interior node +** itself grows too big and must be split. The format of interior +** nodes: +** +** varint iHeight; (height from leaf level, always >0) +** varint iBlockid; (block id of node's leftmost subtree) +** optional { +** varint nTerm; (length of first term) +** char pTerm[nTerm]; (content of first term) +** array { +** (further terms are delta-encoded) +** varint nPrefix; (length of shared prefix with previous term) +** varint nSuffix; (length of unshared suffix) +** char pTermSuffix[nSuffix]; (unshared suffix of next term) +** } +** } +** +** Here, optional { X } means an optional element, while array { X } +** means zero or more occurrences of X, adjacent in memory. +** +** An interior node encodes n terms separating n+1 subtrees. The +** subtree blocks are contiguous, so only the first subtree's blockid +** is encoded. The subtree at iBlockid will contain all terms less +** than the first term encoded (or all terms if no term is encoded). +** Otherwise, for terms greater than or equal to pTerm[i] but less +** than pTerm[i+1], the subtree for that term will be rooted at +** iBlockid+i. Interior nodes only store enough term data to +** distinguish adjacent children (if the rightmost term of the left +** child is "something", and the leftmost term of the right child is +** "wicked", only "w" is stored). +** +** New data is spilled to a new interior node at the same height when +** the current node exceeds INTERIOR_MAX bytes (default 2048). +** INTERIOR_MIN_TERMS (default 7) keeps large terms from monopolizing +** interior nodes and making the tree too skinny. The interior nodes +** at a given height are naturally tracked by interior nodes at +** height+1, and so on. +** +** +**** Segment directory **** +** The segment directory in table %_segdir stores meta-information for +** merging and deleting segments, and also the root node of the +** segment's tree. +** +** The root node is the top node of the segment's tree after encoding +** the entire segment, restricted to ROOT_MAX bytes (default 1024). +** This could be either a leaf node or an interior node. If the top +** node requires more than ROOT_MAX bytes, it is flushed to %_segments +** and a new root interior node is generated (which should always fit +** within ROOT_MAX because it only needs space for 2 varints, the +** height and the blockid of the previous root). +** +** The meta-information in the segment directory is: +** level - segment level (see below) +** idx - index within level +** - (level,idx uniquely identify a segment) +** start_block - first leaf node +** leaves_end_block - last leaf node +** end_block - last block (including interior nodes) +** root - contents of root node +** +** If the root node is a leaf node, then start_block, +** leaves_end_block, and end_block are all 0. +** +** +**** Segment merging **** +** To amortize update costs, segments are grouped into levels and +** merged in batches. Each increase in level represents exponentially +** more documents. +** +** New documents (actually, document updates) are tokenized and +** written individually (using LeafWriter) to a level 0 segment, with +** incrementing idx. When idx reaches MERGE_COUNT (default 16), all +** level 0 segments are merged into a single level 1 segment. Level 1 +** is populated like level 0, and eventually MERGE_COUNT level 1 +** segments are merged to a single level 2 segment (representing +** MERGE_COUNT^2 updates), and so on. +** +** A segment merge traverses all segments at a given level in +** parallel, performing a straightforward sorted merge. Since segment +** leaf nodes are written in to the %_segments table in order, this +** merge traverses the underlying sqlite disk structures efficiently. +** After the merge, all segment blocks from the merged level are +** deleted. +** +** MERGE_COUNT controls how often we merge segments. 16 seems to be +** somewhat of a sweet spot for insertion performance. 32 and 64 show +** very similar performance numbers to 16 on insertion, though they're +** a tiny bit slower (perhaps due to more overhead in merge-time +** sorting). 8 is about 20% slower than 16, 4 about 50% slower than +** 16, 2 about 66% slower than 16. +** +** At query time, high MERGE_COUNT increases the number of segments +** which need to be scanned and merged. For instance, with 100k docs +** inserted: +** +** MERGE_COUNT segments +** 16 25 +** 8 12 +** 4 10 +** 2 6 +** +** This appears to have only a moderate impact on queries for very +** frequent terms (which are somewhat dominated by segment merge +** costs), and infrequent and non-existent terms still seem to be fast +** even with many segments. +** +** TODO(shess) That said, it would be nice to have a better query-side +** argument for MERGE_COUNT of 16. Also, it is possible/likely that +** optimizations to things like doclist merging will swing the sweet +** spot around. +** +** +** +**** Handling of deletions and updates **** +** Since we're using a segmented structure, with no docid-oriented +** index into the term index, we clearly cannot simply update the term +** index when a document is deleted or updated. For deletions, we +** write an empty doclist (varint(docid) varint(POS_END)), for updates +** we simply write the new doclist. Segment merges overwrite older +** data for a particular docid with newer data, so deletes or updates +** will eventually overtake the earlier data and knock it out. The +** query logic likewise merges doclists so that newer data knocks out +** older data. +*/ + +/************** Include fts3Int.h in the middle of fts3.c ********************/ +/************** Begin file fts3Int.h *****************************************/ +/* +** 2009 Nov 12 +** +** 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. +** +****************************************************************************** +** +*/ +#ifndef _FTSINT_H +#define _FTSINT_H + +#if !defined(NDEBUG) && !defined(SQLITE_DEBUG) +# define NDEBUG 1 +#endif + +/* FTS3/FTS4 require virtual tables */ +#ifdef SQLITE_OMIT_VIRTUALTABLE +# undef SQLITE_ENABLE_FTS3 +# undef SQLITE_ENABLE_FTS4 +#endif + +/* +** FTS4 is really an extension for FTS3. It is enabled using the +** SQLITE_ENABLE_FTS3 macro. But to avoid confusion we also all +** the SQLITE_ENABLE_FTS4 macro to serve as an alisse for SQLITE_ENABLE_FTS3. +*/ +#if defined(SQLITE_ENABLE_FTS4) && !defined(SQLITE_ENABLE_FTS3) +# define SQLITE_ENABLE_FTS3 +#endif + +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) + +/* If not building as part of the core, include sqlite3ext.h. */ +#ifndef SQLITE_CORE +/* # include "sqlite3ext.h" */ +SQLITE_EXTENSION_INIT3 +#endif + +/* #include "sqlite3.h" */ +/************** Include fts3_tokenizer.h in the middle of fts3Int.h **********/ +/************** Begin file fts3_tokenizer.h **********************************/ +/* +** 2006 July 10 +** +** The author disclaims copyright to this source code. +** +************************************************************************* +** Defines the interface to tokenizers used by fulltext-search. There +** are three basic components: +** +** sqlite3_tokenizer_module is a singleton defining the tokenizer +** interface functions. This is essentially the class structure for +** tokenizers. +** +** sqlite3_tokenizer is used to define a particular tokenizer, perhaps +** including customization information defined at creation time. +** +** sqlite3_tokenizer_cursor is generated by a tokenizer to generate +** tokens from a particular input. +*/ +#ifndef _FTS3_TOKENIZER_H_ +#define _FTS3_TOKENIZER_H_ + +/* TODO(shess) Only used for SQLITE_OK and SQLITE_DONE at this time. +** If tokenizers are to be allowed to call sqlite3_*() functions, then +** we will need a way to register the API consistently. +*/ +/* #include "sqlite3.h" */ + +/* +** Structures used by the tokenizer interface. When a new tokenizer +** implementation is registered, the caller provides a pointer to +** an sqlite3_tokenizer_module containing pointers to the callback +** functions that make up an implementation. +** +** When an fts3 table is created, it passes any arguments passed to +** the tokenizer clause of the CREATE VIRTUAL TABLE statement to the +** sqlite3_tokenizer_module.xCreate() function of the requested tokenizer +** implementation. The xCreate() function in turn returns an +** sqlite3_tokenizer structure representing the specific tokenizer to +** be used for the fts3 table (customized by the tokenizer clause arguments). +** +** To tokenize an input buffer, the sqlite3_tokenizer_module.xOpen() +** method is called. It returns an sqlite3_tokenizer_cursor object +** that may be used to tokenize a specific input buffer based on +** the tokenization rules supplied by a specific sqlite3_tokenizer +** object. +*/ +typedef struct sqlite3_tokenizer_module sqlite3_tokenizer_module; +typedef struct sqlite3_tokenizer sqlite3_tokenizer; +typedef struct sqlite3_tokenizer_cursor sqlite3_tokenizer_cursor; + +struct sqlite3_tokenizer_module { + + /* + ** Structure version. Should always be set to 0 or 1. + */ + int iVersion; + + /* + ** Create a new tokenizer. The values in the argv[] array are the + ** arguments passed to the "tokenizer" clause of the CREATE VIRTUAL + ** TABLE statement that created the fts3 table. For example, if + ** the following SQL is executed: + ** + ** CREATE .. USING fts3( ... , tokenizer arg1 arg2) + ** + ** then argc is set to 2, and the argv[] array contains pointers + ** to the strings "arg1" and "arg2". + ** + ** This method should return either SQLITE_OK (0), or an SQLite error + ** code. If SQLITE_OK is returned, then *ppTokenizer should be set + ** to point at the newly created tokenizer structure. The generic + ** sqlite3_tokenizer.pModule variable should not be initialized by + ** this callback. The caller will do so. + */ + int (*xCreate)( + int argc, /* Size of argv array */ + const char *const*argv, /* Tokenizer argument strings */ + sqlite3_tokenizer **ppTokenizer /* OUT: Created tokenizer */ + ); + + /* + ** Destroy an existing tokenizer. The fts3 module calls this method + ** exactly once for each successful call to xCreate(). + */ + int (*xDestroy)(sqlite3_tokenizer *pTokenizer); + + /* + ** Create a tokenizer cursor to tokenize an input buffer. The caller + ** is responsible for ensuring that the input buffer remains valid + ** until the cursor is closed (using the xClose() method). + */ + int (*xOpen)( + sqlite3_tokenizer *pTokenizer, /* Tokenizer object */ + const char *pInput, int nBytes, /* Input buffer */ + sqlite3_tokenizer_cursor **ppCursor /* OUT: Created tokenizer cursor */ + ); + + /* + ** Destroy an existing tokenizer cursor. The fts3 module calls this + ** method exactly once for each successful call to xOpen(). + */ + int (*xClose)(sqlite3_tokenizer_cursor *pCursor); + + /* + ** Retrieve the next token from the tokenizer cursor pCursor. This + ** method should either return SQLITE_OK and set the values of the + ** "OUT" variables identified below, or SQLITE_DONE to indicate that + ** the end of the buffer has been reached, or an SQLite error code. + ** + ** *ppToken should be set to point at a buffer containing the + ** normalized version of the token (i.e. after any case-folding and/or + ** stemming has been performed). *pnBytes should be set to the length + ** of this buffer in bytes. The input text that generated the token is + ** identified by the byte offsets returned in *piStartOffset and + ** *piEndOffset. *piStartOffset should be set to the index of the first + ** byte of the token in the input buffer. *piEndOffset should be set + ** to the index of the first byte just past the end of the token in + ** the input buffer. + ** + ** The buffer *ppToken is set to point at is managed by the tokenizer + ** implementation. It is only required to be valid until the next call + ** to xNext() or xClose(). + */ + /* TODO(shess) current implementation requires pInput to be + ** nul-terminated. This should either be fixed, or pInput/nBytes + ** should be converted to zInput. + */ + int (*xNext)( + sqlite3_tokenizer_cursor *pCursor, /* Tokenizer cursor */ + const char **ppToken, int *pnBytes, /* OUT: Normalized text for token */ + int *piStartOffset, /* OUT: Byte offset of token in input buffer */ + int *piEndOffset, /* OUT: Byte offset of end of token in input buffer */ + int *piPosition /* OUT: Number of tokens returned before this one */ + ); + + /*********************************************************************** + ** Methods below this point are only available if iVersion>=1. + */ + + /* + ** Configure the language id of a tokenizer cursor. + */ + int (*xLanguageid)(sqlite3_tokenizer_cursor *pCsr, int iLangid); +}; + +struct sqlite3_tokenizer { + const sqlite3_tokenizer_module *pModule; /* The module for this tokenizer */ + /* Tokenizer implementations will typically add additional fields */ +}; + +struct sqlite3_tokenizer_cursor { + sqlite3_tokenizer *pTokenizer; /* Tokenizer for this cursor. */ + /* Tokenizer implementations will typically add additional fields */ +}; + +int fts3_global_term_cnt(int iTerm, int iCol); +int fts3_term_cnt(int iTerm, int iCol); + + +#endif /* _FTS3_TOKENIZER_H_ */ + +/************** 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 +** +** 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 header file for the generic hash-table implementation +** used in SQLite. We've modified it slightly to serve as a standalone +** hash table implementation for the full-text indexing module. +** +*/ +#ifndef _FTS3_HASH_H_ +#define _FTS3_HASH_H_ + +/* Forward declarations of structures. */ +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 +** code should not attempt to access or modify the fields of this structure +** directly. Change this structure only by using the routines below. +** However, many of the "procedures" and "functions" for modifying and +** accessing this structure are really macros, so we can't really make +** this structure opaque. +*/ +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 */ + 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 */ + } *ht; +}; + +/* Each element in the hash table is an instance of the following +** structure. All elements are stored on a single doubly-linked list. +** +** 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 */ + void *data; /* Data associated with this element */ + void *pKey; int nKey; /* Key associated with this element */ +}; + +/* +** There are 2 different modes of operation for a hash table: +** +** FTS3_HASH_STRING pKey points to a string that is nKey bytes long +** (including the null-terminator, if any). Case +** is respected in comparisons. +** +** FTS3_HASH_BINARY pKey points to binary data nKey bytes long. +** memcmp() is used to compare keys. +** +** A copy of the key is made if the copyKey parameter to fts3HashInit is 1. +*/ +#define FTS3_HASH_STRING 1 +#define FTS3_HASH_BINARY 2 + +/* +** Access routines. To delete, insert a NULL pointer. +*/ +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 fts3HashFindElem sqlite3Fts3HashFindElem + +/* +** Macros for looping over all elements of a hash table. The idiom is +** like this: +** +** Fts3Hash h; +** Fts3HashElem *p; +** ... +** for(p=fts3HashFirst(&h); p; p=fts3HashNext(p)){ +** SomeStructure *pData = fts3HashData(p); +** // do something with pData +** } +*/ +#define fts3HashFirst(H) ((H)->first) +#define fts3HashNext(E) ((E)->next) +#define fts3HashData(E) ((E)->data) +#define fts3HashKey(E) ((E)->pKey) +#define fts3HashKeysize(E) ((E)->nKey) + +/* +** Number of entries in a hash table +*/ +#define fts3HashCount(H) ((H)->count) + +#endif /* _FTS3_HASH_H_ */ + +/************** End of fts3_hash.h *******************************************/ +/************** Continuing where we left off in fts3Int.h ********************/ + +/* +** This constant determines the maximum depth of an FTS expression tree +** that the library will create and use. FTS uses recursion to perform +** various operations on the query tree, so the disadvantage of a large +** limit is that it may allow very large queries to use large amounts +** of stack space (perhaps causing a stack overflow). +*/ +#ifndef SQLITE_FTS3_MAX_EXPR_DEPTH +# define SQLITE_FTS3_MAX_EXPR_DEPTH 12 +#endif + + +/* +** 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 + +/* +** 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) + +/* +** 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]))) + + +#ifndef MIN +# define MIN(x,y) ((x)<(y)?(x):(y)) +#endif +#ifndef MAX +# define MAX(x,y) ((x)>(y)?(x):(y)) +#endif + +/* +** 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. +*/ +#define FTS3_VARINT_MAX 10 + +/* +** FTS4 virtual tables may maintain multiple indexes - one index of all terms +** in the document set and zero or more prefix indexes. All indexes are stored +** as one or more b+-trees in the %_segments and %_segdir tables. +** +** It is possible to determine which index a b+-tree belongs to based on the +** value stored in the "%_segdir.level" column. Given this value L, the index +** that the b+-tree belongs to is (L<<10). In other words, all b+-trees with +** level values between 0 and 1023 (inclusive) belong to index 0, all levels +** between 1024 and 2047 to index 1, and so on. +** +** It is considered impossible for an index to use more than 1024 levels. In +** theory though this may happen, but only after at least +** (FTS3_MERGE_COUNT^1024) separate flushes of the pending-terms tables. +*/ +#define FTS3_SEGDIR_MAXLEVEL 1024 +#define FTS3_SEGDIR_MAXLEVEL_STR "1024" + +/* +** The testcase() macro is only used by the amalgamation. If undefined, +** make it a no-op. +*/ +#ifndef testcase +# define testcase(X) +#endif + +/* +** Terminator values for position-lists and column-lists. +*/ +#define POS_COLUMN (1) /* Column-list terminator */ +#define POS_END (0) /* Position-list terminator */ + +/* +** This section provides definitions to allow the +** FTS3 extension to be compiled outside of the +** amalgamation. +*/ +#ifndef SQLITE_AMALGAMATION +/* +** Macros indicating that conditional expressions are always true or +** false. +*/ +#ifdef SQLITE_COVERAGE_TEST +# define ALWAYS(x) (1) +# define NEVER(X) (0) +#elif defined(SQLITE_DEBUG) +# define ALWAYS(x) sqlite3Fts3Always((x)!=0) +# define NEVER(x) sqlite3Fts3Never((x)!=0) +SQLITE_PRIVATE int sqlite3Fts3Always(int b); +SQLITE_PRIVATE int sqlite3Fts3Never(int b); +#else +# define ALWAYS(x) (x) +# define NEVER(x) (x) +#endif + +/* +** 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 */ +typedef sqlite3_int64 i64; /* 8-byte signed integer */ + +/* +** Macro used to suppress compiler warnings for unused parameters. +*/ +#define UNUSED_PARAMETER(x) (void)(x) + +/* +** Activate assert() only if SQLITE_TEST is enabled. +*/ +#if !defined(NDEBUG) && !defined(SQLITE_DEBUG) +# define NDEBUG 1 +#endif + +/* +** The TESTONLY macro is used to enclose variable declarations or +** other bits of code that are needed to support the arguments +** within testcase() and assert() macros. +*/ +#if defined(SQLITE_DEBUG) || defined(SQLITE_COVERAGE_TEST) +# define TESTONLY(X) X +#else +# define TESTONLY(X) +#endif + +#endif /* SQLITE_AMALGAMATION */ + +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE int sqlite3Fts3Corrupt(void); +# define FTS_CORRUPT_VTAB sqlite3Fts3Corrupt() +#else +# define FTS_CORRUPT_VTAB SQLITE_CORRUPT_VTAB +#endif + +typedef struct Fts3Table Fts3Table; +typedef struct Fts3Cursor Fts3Cursor; +typedef struct Fts3Expr Fts3Expr; +typedef struct Fts3Phrase Fts3Phrase; +typedef struct Fts3PhraseToken Fts3PhraseToken; + +typedef struct Fts3Doclist Fts3Doclist; +typedef struct Fts3SegFilter Fts3SegFilter; +typedef struct Fts3DeferredToken Fts3DeferredToken; +typedef struct Fts3SegReader Fts3SegReader; +typedef struct Fts3MultiSegReader Fts3MultiSegReader; + +typedef struct MatchinfoBuffer MatchinfoBuffer; + +/* +** 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 */ + u8 *abNotindexed; /* True for 'notindexed' columns */ + sqlite3_tokenizer *pTokenizer; /* tokenizer for inserts and queries */ + char *zContentTbl; /* content=xxx option, or NULL */ + char *zLanguageid; /* languageid=xxx option, or NULL */ + int nAutoincrmerge; /* Value configured by 'automerge' */ + u32 nLeafAdd; /* Number of leaf blocks added this trans */ + + /* Precompiled statements used by the implementation. Each of these + ** statements is run and reset within a single virtual table API call. + */ + sqlite3_stmt *aStmt[40]; + + char *zReadExprlist; + char *zWriteExprlist; + + int nNodeSize; /* Soft limit for node size */ + u8 bFts4; /* True for FTS4, false for FTS3 */ + u8 bHasStat; /* True if %_stat table exists (2==unknown) */ + u8 bHasDocsize; /* True if %_docsize table exists */ + u8 bDescIdx; /* True if doclists are in reverse order */ + u8 bIgnoreSavepoint; /* True to ignore xSavepoint invocations */ + int nPgsz; /* Page size for host database */ + char *zSegmentsTbl; /* Name of %_segments table */ + sqlite3_blob *pSegments; /* Blob handle open on %_segments table */ + + /* + ** The following array of hash tables is used to buffer pending index + ** updates during transactions. All pending updates buffered at any one + ** time must share a common language-id (see the FTS4 langid= feature). + ** The current language id is stored in variable iPrevLangid. + ** + ** A single FTS4 table may have multiple full-text indexes. For each index + ** there is an entry in the aIndex[] array. Index 0 is an index of all the + ** terms that appear in the document set. Each subsequent index in aIndex[] + ** is an index of prefixes of a specific length. + ** + ** Variable nPendingData contains an estimate the memory consumed by the + ** pending data structures, including hash table overhead, but not including + ** malloc overhead. When nPendingData exceeds nMaxPendingData, all hash + ** tables are flushed to disk. Variable iPrevDocid is the docid of the most + ** recently inserted record. + */ + int nIndex; /* Size of aIndex[] */ + struct Fts3Index { + int nPrefix; /* Prefix length (0 for main terms index) */ + Fts3Hash hPending; /* Pending terms table for this index */ + } *aIndex; + int nMaxPendingData; /* Max pending data before flush to disk */ + int nPendingData; /* Current bytes of pending data */ + sqlite_int64 iPrevDocid; /* Docid of most recently inserted document */ + int iPrevLangid; /* Langid of recently inserted document */ + int bPrevDelete; /* True if last operation was a delete */ + +#if defined(SQLITE_DEBUG) || defined(SQLITE_COVERAGE_TEST) + /* State variables used for validating that the transaction control + ** methods of the virtual table are called at appropriate times. These + ** values do not contribute to FTS functionality; they are used for + ** verifying the operation of the SQLite core. + */ + int inTransaction; /* True after xBegin but before xCommit/xRollback */ + int mxSavepoint; /* Largest valid xSavepoint integer */ +#endif + +#ifdef SQLITE_TEST + /* True to disable the incremental doclist optimization. This is controled + ** by special insert command 'test-no-incr-doclist'. */ + int bNoIncrDoclist; +#endif +}; + +/* +** 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 */ + int iLangid; /* Language being queried for */ + int nPhrase; /* Number of matchable phrases in query */ + Fts3DeferredToken *pDeferred; /* Deferred search tokens, if any */ + 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 */ + u8 bDesc; /* True to sort in descending order */ + int eEvalmode; /* An FTS3_EVAL_XX constant */ + int nRowAvg; /* Average size of database rows, in pages */ + sqlite3_int64 nDoc; /* Documents in table */ + i64 iMinDocid; /* Minimum docid to return */ + i64 iMaxDocid; /* Maximum docid to return */ + int isMatchinfoNeeded; /* True when aMatchinfo[] needs filling in */ + MatchinfoBuffer *pMIBuffer; /* Buffer for matchinfo data */ +}; + +#define FTS3_EVAL_FILTER 0 +#define FTS3_EVAL_NEXT 1 +#define FTS3_EVAL_MATCHINFO 2 + +/* +** 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 +** +** 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. +*/ +#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 */ + +/* +** The lower 16-bits of the sqlite3_index_info.idxNum value set by +** the xBestIndex() method contains the Fts3Cursor.eSearch value described +** above. The upper 16-bits contain a combination of the following +** bits, used to describe extra constraints on full-text searches. +*/ +#define FTS3_HAVE_LANGID 0x00010000 /* languageid=? */ +#define FTS3_HAVE_DOCID_GE 0x00020000 /* docid>=? */ +#define FTS3_HAVE_DOCID_LE 0x00040000 /* docid<=? */ + +struct Fts3Doclist { + char *aAll; /* Array containing doclist (or NULL) */ + int nAll; /* Size of a[] in bytes */ + char *pNextDocid; /* Pointer to next docid */ + + sqlite3_int64 iDocid; /* Current docid (if pList!=0) */ + int bFreeList; /* True if pList should be sqlite3_free()d */ + char *pList; /* Pointer to position list following iDocid */ + int nList; /* Length of position list */ +}; + +/* +** 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 double-quotes (i.e. "one two three") +** nToken will be the number of tokens in the string. +*/ +struct Fts3PhraseToken { + char *z; /* Text of the token */ + int n; /* Number of bytes in buffer z */ + int isPrefix; /* True if token ends with a "*" character */ + int bFirst; /* True if token must appear at position 0 */ + + /* Variables above this point are populated when the expression is + ** parsed (by code in fts3_expr.c). Below this point the variables are + ** used when evaluating the expression. */ + Fts3DeferredToken *pDeferred; /* Deferred token object for this token */ + Fts3MultiSegReader *pSegcsr; /* Segment-reader for this token */ +}; + +struct Fts3Phrase { + /* Cache of doclist for this phrase. */ + Fts3Doclist doclist; + int bIncr; /* True if doclist is loaded incrementally */ + int iDoclistToken; + + /* Used by sqlite3Fts3EvalPhrasePoslist() if this is a descendent of an + ** OR condition. */ + char *pOrPoslist; + i64 iOrDocid; + + /* Variables below this point are populated by fts3_expr.c when parsing + ** a MATCH expression. Everything above is part of the evaluation phase. + */ + int nToken; /* Number of tokens in the phrase */ + int iColumn; /* Index of column this phrase must match */ + Fts3PhraseToken aToken[1]; /* One entry for each token in the phrase */ +}; + +/* +** A tree of these objects forms the RHS of a MATCH operator. +** +** If Fts3Expr.eType is FTSQUERY_PHRASE and isLoaded is true, then aDoclist +** points to a malloced buffer, size nDoclist bytes, containing the results +** of this phrase query in FTS3 doclist format. As usual, the initial +** "Length" field found in doclists stored on disk is omitted from this +** buffer. +** +** Variable aMI is used only for FTSQUERY_NEAR nodes to store the global +** matchinfo data. If it is not NULL, it points to an array of size nCol*3, +** where nCol is the number of columns in the queried FTS table. The array +** is populated as follows: +** +** aMI[iCol*3 + 0] = Undefined +** aMI[iCol*3 + 1] = Number of occurrences +** aMI[iCol*3 + 2] = Number of rows containing at least one instance +** +** The aMI array is allocated using sqlite3_malloc(). It should be freed +** when the expression node is. +*/ +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 */ + + /* The following are used by the fts3_eval.c module. */ + sqlite3_int64 iDocid; /* Current docid */ + u8 bEof; /* True this expression is at EOF already */ + u8 bStart; /* True if iDocid is valid */ + u8 bDeferred; /* True if this expression is entirely deferred */ + + /* The following are used by the fts3_snippet.c module. */ + int iPhrase; /* Index of this phrase in matchinfo() results */ + u32 *aMI; /* See above */ +}; + +/* +** 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 + + +/* 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(int, int, sqlite3_int64, + sqlite3_int64, sqlite3_int64, const char *, int, Fts3SegReader**); +SQLITE_PRIVATE int sqlite3Fts3SegReaderPending( + Fts3Table*,int,const char*,int,int,Fts3SegReader**); +SQLITE_PRIVATE void sqlite3Fts3SegReaderFree(Fts3SegReader *); +SQLITE_PRIVATE int sqlite3Fts3AllSegdirs(Fts3Table*, int, int, int, sqlite3_stmt **); +SQLITE_PRIVATE int sqlite3Fts3ReadBlock(Fts3Table*, sqlite3_int64, char **, int*, int*); + +SQLITE_PRIVATE int sqlite3Fts3SelectDoctotal(Fts3Table *, sqlite3_stmt **); +SQLITE_PRIVATE int sqlite3Fts3SelectDocsize(Fts3Table *, sqlite3_int64, sqlite3_stmt **); + +#ifndef SQLITE_DISABLE_FTS4_DEFERRED +SQLITE_PRIVATE void sqlite3Fts3FreeDeferredTokens(Fts3Cursor *); +SQLITE_PRIVATE int sqlite3Fts3DeferToken(Fts3Cursor *, Fts3PhraseToken *, int); +SQLITE_PRIVATE int sqlite3Fts3CacheDeferredDoclists(Fts3Cursor *); +SQLITE_PRIVATE void sqlite3Fts3FreeDeferredDoclists(Fts3Cursor *); +SQLITE_PRIVATE int sqlite3Fts3DeferredTokenList(Fts3DeferredToken *, char **, int *); +#else +# define sqlite3Fts3FreeDeferredTokens(x) +# define sqlite3Fts3DeferToken(x,y,z) SQLITE_OK +# define sqlite3Fts3CacheDeferredDoclists(x) SQLITE_OK +# define sqlite3Fts3FreeDeferredDoclists(x) +# define sqlite3Fts3DeferredTokenList(x,y,z) SQLITE_OK +#endif + +SQLITE_PRIVATE void sqlite3Fts3SegmentsClose(Fts3Table *); +SQLITE_PRIVATE int sqlite3Fts3MaxLevel(Fts3Table *, int *); + +/* Special values interpreted by sqlite3SegReaderCursor() */ +#define FTS3_SEGCURSOR_PENDING -1 +#define FTS3_SEGCURSOR_ALL -2 + +SQLITE_PRIVATE int sqlite3Fts3SegReaderStart(Fts3Table*, Fts3MultiSegReader*, Fts3SegFilter*); +SQLITE_PRIVATE int sqlite3Fts3SegReaderStep(Fts3Table *, Fts3MultiSegReader *); +SQLITE_PRIVATE void sqlite3Fts3SegReaderFinish(Fts3MultiSegReader *); + +SQLITE_PRIVATE int sqlite3Fts3SegReaderCursor(Fts3Table *, + int, int, int, const char *, int, int, int, Fts3MultiSegReader *); + +/* 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 +#define FTS3_SEGMENT_SCAN 0x00000010 +#define FTS3_SEGMENT_FIRST 0x00000020 + +/* Type passed as 4th argument to SegmentReaderIterate() */ +struct Fts3SegFilter { + const char *zTerm; + int nTerm; + int iCol; + int flags; +}; + +struct Fts3MultiSegReader { + /* Used internally by sqlite3Fts3SegReaderXXX() calls */ + Fts3SegReader **apSegment; /* Array of Fts3SegReader objects */ + int nSegment; /* Size of apSegment array */ + int nAdvance; /* How many seg-readers to advance */ + Fts3SegFilter *pFilter; /* Pointer to filter object */ + char *aBuffer; /* Buffer to merge doclists in */ + int nBuffer; /* Allocated size of aBuffer[] in bytes */ + + int iColFilter; /* If >=0, filter for this column */ + int bRestart; + + /* Used by fts3.c only. */ + int nCost; /* Cost of running iterator */ + int bLookup; /* True if a lookup of a single entry. */ + + /* Output values. Valid only after Fts3SegReaderStep() returns SQLITE_ROW. */ + char *zTerm; /* Pointer to term buffer */ + int nTerm; /* Size of zTerm in bytes */ + char *aDoclist; /* Pointer to doclist buffer */ + int nDoclist; /* Size of aDoclist[] in bytes */ +}; + +SQLITE_PRIVATE int sqlite3Fts3Incrmerge(Fts3Table*,int,int); + +#define fts3GetVarint32(p, piVal) ( \ + (*(u8*)(p)&0x80) ? sqlite3Fts3GetVarint32(p, piVal) : (*piVal=*(u8*)(p), 1) \ +) + +/* fts3.c */ +SQLITE_PRIVATE void sqlite3Fts3ErrMsg(char**,const char*,...); +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 void sqlite3Fts3DoclistPrev(int,char*,int,char**,sqlite3_int64*,int*,u8*); +SQLITE_PRIVATE int sqlite3Fts3EvalPhraseStats(Fts3Cursor *, Fts3Expr *, u32 *); +SQLITE_PRIVATE int sqlite3Fts3FirstFilter(sqlite3_int64, char *, int, char *); +SQLITE_PRIVATE void sqlite3Fts3CreateStatTable(int*, Fts3Table*); +SQLITE_PRIVATE int sqlite3Fts3EvalTestDeferred(Fts3Cursor *pCsr, int *pRc); + +/* 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 **, char ** +); +SQLITE_PRIVATE int sqlite3Fts3IsIdChar(char); + +/* fts3_snippet.c */ +SQLITE_PRIVATE void sqlite3Fts3Offsets(sqlite3_context*, Fts3Cursor*); +SQLITE_PRIVATE void sqlite3Fts3Snippet(sqlite3_context *, Fts3Cursor *, const char *, + const char *, const char *, int, int +); +SQLITE_PRIVATE void sqlite3Fts3Matchinfo(sqlite3_context *, Fts3Cursor *, const char *); +SQLITE_PRIVATE void sqlite3Fts3MIBufferFree(MatchinfoBuffer *p); + +/* fts3_expr.c */ +SQLITE_PRIVATE int sqlite3Fts3ExprParse(sqlite3_tokenizer *, int, + char **, int, int, int, const char *, int, Fts3Expr **, char ** +); +SQLITE_PRIVATE void sqlite3Fts3ExprFree(Fts3Expr *); +#ifdef SQLITE_TEST +SQLITE_PRIVATE int sqlite3Fts3ExprInitTestInterface(sqlite3 *db); +SQLITE_PRIVATE int sqlite3Fts3InitTerm(sqlite3 *db); +#endif + +SQLITE_PRIVATE int sqlite3Fts3OpenTokenizer(sqlite3_tokenizer *, int, const char *, int, + sqlite3_tokenizer_cursor ** +); + +/* fts3_aux.c */ +SQLITE_PRIVATE int sqlite3Fts3InitAux(sqlite3 *db); + +SQLITE_PRIVATE void sqlite3Fts3EvalPhraseCleanup(Fts3Phrase *); + +SQLITE_PRIVATE int sqlite3Fts3MsrIncrStart( + Fts3Table*, Fts3MultiSegReader*, int, const char*, int); +SQLITE_PRIVATE int sqlite3Fts3MsrIncrNext( + Fts3Table *, Fts3MultiSegReader *, sqlite3_int64 *, char **, int *); +SQLITE_PRIVATE int sqlite3Fts3EvalPhrasePoslist(Fts3Cursor *, Fts3Expr *, int iCol, char **); +SQLITE_PRIVATE int sqlite3Fts3MsrOvfl(Fts3Cursor *, Fts3MultiSegReader *, int *); +SQLITE_PRIVATE int sqlite3Fts3MsrIncrRestart(Fts3MultiSegReader *pCsr); + +/* fts3_tokenize_vtab.c */ +SQLITE_PRIVATE int sqlite3Fts3InitTok(sqlite3*, Fts3Hash *); + +/* fts3_unicode2.c (functions generated by parsing unicode text files) */ +#ifndef SQLITE_DISABLE_FTS3_UNICODE +SQLITE_PRIVATE int sqlite3FtsUnicodeFold(int, int); +SQLITE_PRIVATE int sqlite3FtsUnicodeIsalnum(int); +SQLITE_PRIVATE int sqlite3FtsUnicodeIsdiacritic(int); +#endif + +#endif /* !SQLITE_CORE || SQLITE_ENABLE_FTS3 */ +#endif /* _FTSINT_H */ + +/************** End of fts3Int.h *********************************************/ +/************** Continuing where we left off in fts3.c ***********************/ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) + +#if defined(SQLITE_ENABLE_FTS3) && !defined(SQLITE_CORE) +# define SQLITE_CORE 1 +#endif + +/* #include */ +/* #include */ +/* #include */ +/* #include */ +/* #include */ +/* #include */ + +/* #include "fts3.h" */ +#ifndef SQLITE_CORE +/* # include "sqlite3ext.h" */ + SQLITE_EXTENSION_INIT1 +#endif + +static int fts3EvalNext(Fts3Cursor *pCsr); +static int fts3EvalStart(Fts3Cursor *pCsr); +static int fts3TermSegReaderCursor( + Fts3Cursor *, const char *, int, int, Fts3MultiSegReader **); + +#ifndef SQLITE_AMALGAMATION +# if defined(SQLITE_DEBUG) +SQLITE_PRIVATE int sqlite3Fts3Always(int b) { assert( b ); return b; } +SQLITE_PRIVATE int sqlite3Fts3Never(int b) { assert( !b ); return b; } +# endif +#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{ + *q++ = (unsigned char) ((vu & 0x7f) | 0x80); + vu >>= 7; + }while( vu!=0 ); + q[-1] &= 0x7f; /* turn off high bit in final byte */ + assert( q - (unsigned char *)p <= FTS3_VARINT_MAX ); + return (int) (q - (unsigned char *)p); +} + +#define GETVARINT_STEP(v, ptr, shift, mask1, mask2, var, ret) \ + v = (v & mask1) | ( (*ptr++) << shift ); \ + if( (v & mask2)==0 ){ var = v; return ret; } +#define GETVARINT_INIT(v, ptr, shift, mask1, mask2, var, ret) \ + v = (*ptr++); \ + if( (v & mask2)==0 ){ var = v; return ret; } + +/* +** 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 char *pStart = p; + u32 a; + u64 b; + int shift; + + GETVARINT_INIT(a, p, 0, 0x00, 0x80, *v, 1); + GETVARINT_STEP(a, p, 7, 0x7F, 0x4000, *v, 2); + GETVARINT_STEP(a, p, 14, 0x3FFF, 0x200000, *v, 3); + GETVARINT_STEP(a, p, 21, 0x1FFFFF, 0x10000000, *v, 4); + b = (a & 0x0FFFFFFF ); + + for(shift=28; shift<=63; shift+=7){ + u64 c = *p++; + b += (c&0x7F) << shift; + if( (c & 0x80)==0 ) break; + } + *v = b; + return (int)(p - pStart); +} + +/* +** 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){ + u32 a; + +#ifndef fts3GetVarint32 + GETVARINT_INIT(a, p, 0, 0x00, 0x80, *pi, 1); +#else + a = (*p++); + assert( a & 0x80 ); +#endif + + GETVARINT_STEP(a, p, 7, 0x7F, 0x4000, *pi, 2); + GETVARINT_STEP(a, p, 14, 0x3FFF, 0x200000, *pi, 3); + GETVARINT_STEP(a, p, 21, 0x1FFFFF, 0x10000000, *pi, 4); + a = (a & 0x0FFFFFFF ); + *pi = (int)(a | ((u32)(*p & 0x0F) << 28)); + return 5; +} + +/* +** Return the number of bytes required to encode v as a varint +*/ +SQLITE_PRIVATE int sqlite3Fts3VarintLen(sqlite3_uint64 v){ + int i = 0; + do{ + i++; + v >>= 7; + }while( v!=0 ); + return i; +} + +/* +** 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 +** +*/ +SQLITE_PRIVATE void sqlite3Fts3Dequote(char *z){ + char quote; /* Quote character (if any ) */ + + 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( z[iIn] ){ + if( z[iIn]==quote ){ + if( z[iIn+1]!=quote ) break; + z[iOut++] = quote; + iIn += 2; + }else{ + z[iOut++] = z[iIn++]; + } + } + z[iOut] = '\0'; + } +} + +/* +** Read a single varint from the doclist at *pp and advance *pp to point +** to the first byte past the end of the varint. Add the value of the varint +** to *pVal. +*/ +static void fts3GetDeltaVarint(char **pp, sqlite3_int64 *pVal){ + sqlite3_int64 iVal; + *pp += sqlite3Fts3GetVarint(*pp, &iVal); + *pVal += iVal; +} + +/* +** When this function is called, *pp points to the first byte following a +** varint that is part of a doclist (or position-list, or any other list +** of varints). This function moves *pp to point to the start of that varint, +** and sets *pVal by the varint value. +** +** Argument pStart points to the first byte of the doclist that the +** varint is part of. +*/ +static void fts3GetReverseVarint( + char **pp, + char *pStart, + sqlite3_int64 *pVal +){ + sqlite3_int64 iVal; + char *p; + + /* Pointer p now points at the first byte past the varint we are + ** interested in. So, unless the doclist is corrupt, the 0x80 bit is + ** clear on character p[-1]. */ + for(p = (*pp)-2; p>=pStart && *p&0x80; p--); + p++; + *pp = p; + + sqlite3Fts3GetVarint(p, &iVal); + *pVal = iVal; +} + +/* +** The xDisconnect() virtual table method. +*/ +static int fts3DisconnectMethod(sqlite3_vtab *pVtab){ + Fts3Table *p = (Fts3Table *)pVtab; + int i; + + assert( p->nPendingData==0 ); + assert( p->pSegments==0 ); + + /* Free any prepared statements held */ + for(i=0; iaStmt); i++){ + sqlite3_finalize(p->aStmt[i]); + } + sqlite3_free(p->zSegmentsTbl); + sqlite3_free(p->zReadExprlist); + sqlite3_free(p->zWriteExprlist); + sqlite3_free(p->zContentTbl); + sqlite3_free(p->zLanguageid); + + /* Invoke the tokenizer destructor to free the tokenizer. */ + p->pTokenizer->pModule->xDestroy(p->pTokenizer); + + sqlite3_free(p); + return SQLITE_OK; +} + +/* +** Write an error message into *pzErr +*/ +SQLITE_PRIVATE void sqlite3Fts3ErrMsg(char **pzErr, const char *zFormat, ...){ + va_list ap; + sqlite3_free(*pzErr); + va_start(ap, zFormat); + *pzErr = sqlite3_vmprintf(zFormat, ap); + va_end(ap); +} + +/* +** Construct one or more SQL statements from the format string given +** and then evaluate those statements. The success code is written +** into *pRc. +** +** If *pRc is initially non-zero then this routine is a no-op. +*/ +static void fts3DbExec( + int *pRc, /* Success code */ + sqlite3 *db, /* Database in which to run SQL */ + const char *zFormat, /* Format string for SQL */ + ... /* Arguments to the format string */ +){ + va_list ap; + char *zSql; + if( *pRc ) return; + va_start(ap, zFormat); + zSql = sqlite3_vmprintf(zFormat, ap); + va_end(ap); + if( zSql==0 ){ + *pRc = SQLITE_NOMEM; + }else{ + *pRc = sqlite3_exec(db, zSql, 0, 0, 0); + sqlite3_free(zSql); + } +} + +/* +** The xDestroy() virtual table method. +*/ +static int fts3DestroyMethod(sqlite3_vtab *pVtab){ + Fts3Table *p = (Fts3Table *)pVtab; + int rc = SQLITE_OK; /* Return code */ + const char *zDb = p->zDb; /* Name of database (e.g. "main", "temp") */ + sqlite3 *db = p->db; /* Database handle */ + + /* Drop the shadow tables */ + if( p->zContentTbl==0 ){ + fts3DbExec(&rc, db, "DROP TABLE IF EXISTS %Q.'%q_content'", zDb, p->zName); + } + fts3DbExec(&rc, db, "DROP TABLE IF EXISTS %Q.'%q_segments'", zDb,p->zName); + fts3DbExec(&rc, db, "DROP TABLE IF EXISTS %Q.'%q_segdir'", zDb, p->zName); + fts3DbExec(&rc, db, "DROP TABLE IF EXISTS %Q.'%q_docsize'", zDb, p->zName); + fts3DbExec(&rc, db, "DROP TABLE IF EXISTS %Q.'%q_stat'", zDb, p->zName); + + /* 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); +} + + +/* +** 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. +** +** If *pRc is non-zero when this function is called, it is a no-op. +** Otherwise, if an error occurs, an SQLite error code is stored in *pRc +** before returning. +*/ +static void fts3DeclareVtab(int *pRc, Fts3Table *p){ + if( *pRc==SQLITE_OK ){ + int i; /* Iterator variable */ + int rc; /* Return code */ + char *zSql; /* SQL statement passed to declare_vtab() */ + char *zCols; /* List of user defined columns */ + const char *zLanguageid; + + zLanguageid = (p->zLanguageid ? p->zLanguageid : "__langid"); + sqlite3_vtab_config(p->db, SQLITE_VTAB_CONSTRAINT_SUPPORT, 1); + + /* 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]); + } + + /* Create the whole "CREATE TABLE" statement to pass to SQLite */ + zSql = sqlite3_mprintf( + "CREATE TABLE x(%s %Q HIDDEN, docid HIDDEN, %Q HIDDEN)", + zCols, p->zName, zLanguageid + ); + if( !zCols || !zSql ){ + rc = SQLITE_NOMEM; + }else{ + rc = sqlite3_declare_vtab(p->db, zSql); + } + + sqlite3_free(zSql); + sqlite3_free(zCols); + *pRc = rc; + } +} + +/* +** Create the %_stat table if it does not already exist. +*/ +SQLITE_PRIVATE void sqlite3Fts3CreateStatTable(int *pRc, Fts3Table *p){ + fts3DbExec(pRc, p->db, + "CREATE TABLE IF NOT EXISTS %Q.'%q_stat'" + "(id INTEGER PRIMARY KEY, value BLOB);", + p->zDb, p->zName + ); + if( (*pRc)==SQLITE_OK ) p->bHasStat = 1; +} + +/* +** 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. +** +** If the p->bHasDocsize boolean is true (indicating that this is an +** FTS4 table, not an FTS3 table) then also create the %_docsize and +** %_stat tables required by FTS4. +*/ +static int fts3CreateTables(Fts3Table *p){ + int rc = SQLITE_OK; /* Return code */ + int i; /* Iterator variable */ + sqlite3 *db = p->db; /* The database connection */ + + if( p->zContentTbl==0 ){ + const char *zLanguageid = p->zLanguageid; + char *zContentCols; /* Columns of %_content table */ + + /* 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); + } + if( zLanguageid && zContentCols ){ + zContentCols = sqlite3_mprintf("%z, langid", zContentCols, zLanguageid); + } + if( zContentCols==0 ) rc = SQLITE_NOMEM; + + /* Create the content table */ + fts3DbExec(&rc, db, + "CREATE TABLE %Q.'%q_content'(%s)", + p->zDb, p->zName, zContentCols + ); + sqlite3_free(zContentCols); + } + + /* Create other tables */ + fts3DbExec(&rc, db, + "CREATE TABLE %Q.'%q_segments'(blockid INTEGER PRIMARY KEY, block BLOB);", + p->zDb, p->zName + ); + fts3DbExec(&rc, db, + "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 + ); + if( p->bHasDocsize ){ + fts3DbExec(&rc, db, + "CREATE TABLE %Q.'%q_docsize'(docid INTEGER PRIMARY KEY, size BLOB);", + p->zDb, p->zName + ); + } + assert( p->bHasStat==p->bFts4 ); + if( p->bHasStat ){ + sqlite3Fts3CreateStatTable(&rc, p); + } + return rc; +} + +/* +** Store the current database page-size in bytes in p->nPgsz. +** +** If *pRc is non-zero when this function is called, it is a no-op. +** Otherwise, if an error occurs, an SQLite error code is stored in *pRc +** before returning. +*/ +static void fts3DatabasePageSize(int *pRc, Fts3Table *p){ + if( *pRc==SQLITE_OK ){ + int rc; /* Return code */ + char *zSql; /* SQL text "PRAGMA %Q.page_size" */ + sqlite3_stmt *pStmt; /* Compiled "PRAGMA %Q.page_size" statement */ + + zSql = sqlite3_mprintf("PRAGMA %Q.page_size", p->zDb); + if( !zSql ){ + rc = SQLITE_NOMEM; + }else{ + rc = sqlite3_prepare(p->db, zSql, -1, &pStmt, 0); + if( rc==SQLITE_OK ){ + sqlite3_step(pStmt); + p->nPgsz = sqlite3_column_int(pStmt, 0); + rc = sqlite3_finalize(pStmt); + }else if( rc==SQLITE_AUTH ){ + p->nPgsz = 1024; + rc = SQLITE_OK; + } + } + assert( p->nPgsz>0 || rc!=SQLITE_OK ); + sqlite3_free(zSql); + *pRc = rc; + } +} + +/* +** "Special" FTS4 arguments are column specifications of the following form: +** +** = +** +** There may not be whitespace surrounding the "=" character. The +** term may be quoted, but the may not. +*/ +static int fts3IsSpecialColumn( + const char *z, + int *pnKey, + char **pzValue +){ + char *zValue; + const char *zCsr = z; + + while( *zCsr!='=' ){ + if( *zCsr=='\0' ) return 0; + zCsr++; + } + + *pnKey = (int)(zCsr-z); + zValue = sqlite3_mprintf("%s", &zCsr[1]); + if( zValue ){ + sqlite3Fts3Dequote(zValue); + } + *pzValue = zValue; + return 1; +} + +/* +** Append the output of a printf() style formatting to an existing string. +*/ +static void fts3Appendf( + int *pRc, /* IN/OUT: Error code */ + char **pz, /* IN/OUT: Pointer to string buffer */ + const char *zFormat, /* Printf format string to append */ + ... /* Arguments for printf format string */ +){ + if( *pRc==SQLITE_OK ){ + va_list ap; + char *z; + va_start(ap, zFormat); + z = sqlite3_vmprintf(zFormat, ap); + va_end(ap); + if( z && *pz ){ + char *z2 = sqlite3_mprintf("%s%s", *pz, z); + sqlite3_free(z); + z = z2; + } + if( z==0 ) *pRc = SQLITE_NOMEM; + sqlite3_free(*pz); + *pz = z; + } +} + +/* +** Return a copy of input string zInput enclosed in double-quotes (") and +** with all double quote characters escaped. For example: +** +** fts3QuoteId("un \"zip\"") -> "un \"\"zip\"\"" +** +** The pointer returned points to memory obtained from sqlite3_malloc(). It +** is the callers responsibility to call sqlite3_free() to release this +** memory. +*/ +static char *fts3QuoteId(char const *zInput){ + int nRet; + char *zRet; + nRet = 2 + (int)strlen(zInput)*2 + 1; + zRet = sqlite3_malloc(nRet); + if( zRet ){ + int i; + char *z = zRet; + *(z++) = '"'; + for(i=0; zInput[i]; i++){ + if( zInput[i]=='"' ) *(z++) = '"'; + *(z++) = zInput[i]; + } + *(z++) = '"'; + *(z++) = '\0'; + } + return zRet; +} + +/* +** Return a list of comma separated SQL expressions and a FROM clause that +** could be used in a SELECT statement such as the following: +** +** SELECT FROM %_content AS x ... +** +** to return the docid, followed by each column of text data in order +** from left to write. If parameter zFunc is not NULL, then instead of +** being returned directly each column of text data is passed to an SQL +** function named zFunc first. For example, if zFunc is "unzip" and the +** table has the three user-defined columns "a", "b", and "c", the following +** string is returned: +** +** "docid, unzip(x.'a'), unzip(x.'b'), unzip(x.'c') FROM %_content AS x" +** +** The pointer returned points to a buffer allocated by sqlite3_malloc(). It +** is the responsibility of the caller to eventually free it. +** +** If *pRc is not SQLITE_OK when this function is called, it is a no-op (and +** a NULL pointer is returned). Otherwise, if an OOM error is encountered +** by this function, NULL is returned and *pRc is set to SQLITE_NOMEM. If +** no error occurs, *pRc is left unmodified. +*/ +static char *fts3ReadExprList(Fts3Table *p, const char *zFunc, int *pRc){ + char *zRet = 0; + char *zFree = 0; + char *zFunction; + int i; + + if( p->zContentTbl==0 ){ + if( !zFunc ){ + zFunction = ""; + }else{ + zFree = zFunction = fts3QuoteId(zFunc); + } + fts3Appendf(pRc, &zRet, "docid"); + for(i=0; inColumn; i++){ + fts3Appendf(pRc, &zRet, ",%s(x.'c%d%q')", zFunction, i, p->azColumn[i]); + } + if( p->zLanguageid ){ + fts3Appendf(pRc, &zRet, ", x.%Q", "langid"); + } + sqlite3_free(zFree); + }else{ + fts3Appendf(pRc, &zRet, "rowid"); + for(i=0; inColumn; i++){ + fts3Appendf(pRc, &zRet, ", x.'%q'", p->azColumn[i]); + } + if( p->zLanguageid ){ + fts3Appendf(pRc, &zRet, ", x.%Q", p->zLanguageid); + } + } + fts3Appendf(pRc, &zRet, " FROM '%q'.'%q%s' AS x", + p->zDb, + (p->zContentTbl ? p->zContentTbl : p->zName), + (p->zContentTbl ? "" : "_content") + ); + return zRet; +} + +/* +** Return a list of N comma separated question marks, where N is the number +** of columns in the %_content table (one for the docid plus one for each +** user-defined text column). +** +** If argument zFunc is not NULL, then all but the first question mark +** is preceded by zFunc and an open bracket, and followed by a closed +** bracket. For example, if zFunc is "zip" and the FTS3 table has three +** user-defined text columns, the following string is returned: +** +** "?, zip(?), zip(?), zip(?)" +** +** The pointer returned points to a buffer allocated by sqlite3_malloc(). It +** is the responsibility of the caller to eventually free it. +** +** If *pRc is not SQLITE_OK when this function is called, it is a no-op (and +** a NULL pointer is returned). Otherwise, if an OOM error is encountered +** by this function, NULL is returned and *pRc is set to SQLITE_NOMEM. If +** no error occurs, *pRc is left unmodified. +*/ +static char *fts3WriteExprList(Fts3Table *p, const char *zFunc, int *pRc){ + char *zRet = 0; + char *zFree = 0; + char *zFunction; + int i; + + if( !zFunc ){ + zFunction = ""; + }else{ + zFree = zFunction = fts3QuoteId(zFunc); + } + fts3Appendf(pRc, &zRet, "?"); + for(i=0; inColumn; i++){ + fts3Appendf(pRc, &zRet, ",%s(?)", zFunction); + } + if( p->zLanguageid ){ + fts3Appendf(pRc, &zRet, ", ?"); + } + sqlite3_free(zFree); + return zRet; +} + +/* +** This function interprets the string at (*pp) as a non-negative integer +** value. It reads the integer and sets *pnOut to the value read, then +** sets *pp to point to the byte immediately following the last byte of +** the integer value. +** +** Only decimal digits ('0'..'9') may be part of an integer value. +** +** If *pp does not being with a decimal digit SQLITE_ERROR is returned and +** the output value undefined. Otherwise SQLITE_OK is returned. +** +** This function is used when parsing the "prefix=" FTS4 parameter. +*/ +static int fts3GobbleInt(const char **pp, int *pnOut){ + const int MAX_NPREFIX = 10000000; + const char *p; /* Iterator pointer */ + int nInt = 0; /* Output value */ + + for(p=*pp; p[0]>='0' && p[0]<='9'; p++){ + nInt = nInt * 10 + (p[0] - '0'); + if( nInt>MAX_NPREFIX ){ + nInt = 0; + break; + } + } + if( p==*pp ) return SQLITE_ERROR; + *pnOut = nInt; + *pp = p; + return SQLITE_OK; +} + +/* +** This function is called to allocate an array of Fts3Index structures +** representing the indexes maintained by the current FTS table. FTS tables +** always maintain the main "terms" index, but may also maintain one or +** more "prefix" indexes, depending on the value of the "prefix=" parameter +** (if any) specified as part of the CREATE VIRTUAL TABLE statement. +** +** Argument zParam is passed the value of the "prefix=" option if one was +** specified, or NULL otherwise. +** +** If no error occurs, SQLITE_OK is returned and *apIndex set to point to +** the allocated array. *pnIndex is set to the number of elements in the +** array. If an error does occur, an SQLite error code is returned. +** +** Regardless of whether or not an error is returned, it is the responsibility +** of the caller to call sqlite3_free() on the output array to free it. +*/ +static int fts3PrefixParameter( + const char *zParam, /* ABC in prefix=ABC parameter to parse */ + int *pnIndex, /* OUT: size of *apIndex[] array */ + struct Fts3Index **apIndex /* OUT: Array of indexes for this table */ +){ + struct Fts3Index *aIndex; /* Allocated array */ + int nIndex = 1; /* Number of entries in array */ + + if( zParam && zParam[0] ){ + const char *p; + nIndex++; + for(p=zParam; *p; p++){ + if( *p==',' ) nIndex++; + } + } + + aIndex = sqlite3_malloc(sizeof(struct Fts3Index) * nIndex); + *apIndex = aIndex; + if( !aIndex ){ + return SQLITE_NOMEM; + } + + memset(aIndex, 0, sizeof(struct Fts3Index) * nIndex); + if( zParam ){ + const char *p = zParam; + int i; + for(i=1; i=0 ); + if( nPrefix==0 ){ + nIndex--; + i--; + }else{ + aIndex[i].nPrefix = nPrefix; + } + p++; + } + } + + *pnIndex = nIndex; + return SQLITE_OK; +} + +/* +** This function is called when initializing an FTS4 table that uses the +** content=xxx option. It determines the number of and names of the columns +** of the new FTS4 table. +** +** The third argument passed to this function is the value passed to the +** config=xxx option (i.e. "xxx"). This function queries the database for +** a table of that name. If found, the output variables are populated +** as follows: +** +** *pnCol: Set to the number of columns table xxx has, +** +** *pnStr: Set to the total amount of space required to store a copy +** of each columns name, including the nul-terminator. +** +** *pazCol: Set to point to an array of *pnCol strings. Each string is +** the name of the corresponding column in table xxx. The array +** and its contents are allocated using a single allocation. It +** is the responsibility of the caller to free this allocation +** by eventually passing the *pazCol value to sqlite3_free(). +** +** If the table cannot be found, an error code is returned and the output +** variables are undefined. Or, if an OOM is encountered, SQLITE_NOMEM is +** returned (and the output variables are undefined). +*/ +static int fts3ContentColumns( + sqlite3 *db, /* Database handle */ + const char *zDb, /* Name of db (i.e. "main", "temp" etc.) */ + const char *zTbl, /* Name of content table */ + const char ***pazCol, /* OUT: Malloc'd array of column names */ + int *pnCol, /* OUT: Size of array *pazCol */ + int *pnStr, /* OUT: Bytes of string content */ + char **pzErr /* OUT: error message */ +){ + int rc = SQLITE_OK; /* Return code */ + char *zSql; /* "SELECT *" statement on zTbl */ + sqlite3_stmt *pStmt = 0; /* Compiled version of zSql */ + + zSql = sqlite3_mprintf("SELECT * FROM %Q.%Q", zDb, zTbl); + if( !zSql ){ + rc = SQLITE_NOMEM; + }else{ + rc = sqlite3_prepare(db, zSql, -1, &pStmt, 0); + if( rc!=SQLITE_OK ){ + sqlite3Fts3ErrMsg(pzErr, "%s", sqlite3_errmsg(db)); + } + } + sqlite3_free(zSql); + + if( rc==SQLITE_OK ){ + const char **azCol; /* Output array */ + int nStr = 0; /* Size of all column names (incl. 0x00) */ + int nCol; /* Number of table columns */ + int i; /* Used to iterate through columns */ + + /* Loop through the returned columns. Set nStr to the number of bytes of + ** space required to store a copy of each column name, including the + ** nul-terminator byte. */ + nCol = sqlite3_column_count(pStmt); + for(i=0; i module name ("fts3" or "fts4") +** 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 = 0; /* Pointer to allocated vtab */ + int rc = SQLITE_OK; /* Return code */ + int i; /* Iterator variable */ + int nByte; /* Size of allocation used for *p */ + int iCol; /* Column index */ + int nString = 0; /* Bytes required to hold all column names */ + int nCol = 0; /* Number of columns in the FTS table */ + char *zCsr; /* Space for holding column names */ + int nDb; /* Bytes required to hold database name */ + int nName; /* Bytes required to hold table name */ + int isFts4 = (argv[0][3]=='4'); /* True for FTS4, false for FTS3 */ + const char **aCol; /* Array of column names */ + sqlite3_tokenizer *pTokenizer = 0; /* Tokenizer for this table */ + + int nIndex = 0; /* Size of aIndex[] array */ + struct Fts3Index *aIndex = 0; /* Array of indexes for this table */ + + /* The results of parsing supported FTS4 key=value options: */ + int bNoDocsize = 0; /* True to omit %_docsize table */ + int bDescIdx = 0; /* True to store descending indexes */ + char *zPrefix = 0; /* Prefix parameter value (or NULL) */ + char *zCompress = 0; /* compress=? parameter (or NULL) */ + char *zUncompress = 0; /* uncompress=? parameter (or NULL) */ + char *zContent = 0; /* content=? parameter (or NULL) */ + char *zLanguageid = 0; /* languageid=? parameter (or NULL) */ + char **azNotindexed = 0; /* The set of notindexed= columns */ + int nNotindexed = 0; /* Size of azNotindexed[] array */ + + assert( strlen(argv[0])==4 ); + assert( (sqlite3_strnicmp(argv[0], "fts4", 4)==0 && isFts4) + || (sqlite3_strnicmp(argv[0], "fts3", 4)==0 && !isFts4) + ); + + nDb = (int)strlen(argv[1]) + 1; + nName = (int)strlen(argv[2]) + 1; + + nByte = sizeof(const char *) * (argc-2); + aCol = (const char **)sqlite3_malloc(nByte); + if( aCol ){ + memset((void*)aCol, 0, nByte); + azNotindexed = (char **)sqlite3_malloc(nByte); + } + if( azNotindexed ){ + memset(azNotindexed, 0, nByte); + } + if( !aCol || !azNotindexed ){ + rc = SQLITE_NOMEM; + goto fts3_init_out; + } + + /* Loop through all of the arguments passed by the user to the FTS3/4 + ** module (i.e. all the column names and special arguments). This loop + ** does the following: + ** + ** + Figures out the number of columns the FTSX table will have, and + ** the number of bytes of space that must be allocated to store copies + ** of the column names. + ** + ** + If there is a tokenizer specification included in the arguments, + ** initializes the tokenizer pTokenizer. + */ + for(i=3; rc==SQLITE_OK && i8 + && 0==sqlite3_strnicmp(z, "tokenize", 8) + && 0==sqlite3Fts3IsIdChar(z[8]) + ){ + rc = sqlite3Fts3InitTokenizer(pHash, &z[9], &pTokenizer, pzErr); + } + + /* Check if it is an FTS4 special argument. */ + else if( isFts4 && fts3IsSpecialColumn(z, &nKey, &zVal) ){ + struct Fts4Option { + const char *zOpt; + int nOpt; + } aFts4Opt[] = { + { "matchinfo", 9 }, /* 0 -> MATCHINFO */ + { "prefix", 6 }, /* 1 -> PREFIX */ + { "compress", 8 }, /* 2 -> COMPRESS */ + { "uncompress", 10 }, /* 3 -> UNCOMPRESS */ + { "order", 5 }, /* 4 -> ORDER */ + { "content", 7 }, /* 5 -> CONTENT */ + { "languageid", 10 }, /* 6 -> LANGUAGEID */ + { "notindexed", 10 } /* 7 -> NOTINDEXED */ + }; + + int iOpt; + if( !zVal ){ + rc = SQLITE_NOMEM; + }else{ + for(iOpt=0; iOptnOpt && !sqlite3_strnicmp(z, pOp->zOpt, pOp->nOpt) ){ + break; + } + } + if( iOpt==SizeofArray(aFts4Opt) ){ + sqlite3Fts3ErrMsg(pzErr, "unrecognized parameter: %s", z); + rc = SQLITE_ERROR; + }else{ + switch( iOpt ){ + case 0: /* MATCHINFO */ + if( strlen(zVal)!=4 || sqlite3_strnicmp(zVal, "fts3", 4) ){ + sqlite3Fts3ErrMsg(pzErr, "unrecognized matchinfo: %s", zVal); + rc = SQLITE_ERROR; + } + bNoDocsize = 1; + break; + + case 1: /* PREFIX */ + sqlite3_free(zPrefix); + zPrefix = zVal; + zVal = 0; + break; + + case 2: /* COMPRESS */ + sqlite3_free(zCompress); + zCompress = zVal; + zVal = 0; + break; + + case 3: /* UNCOMPRESS */ + sqlite3_free(zUncompress); + zUncompress = zVal; + zVal = 0; + break; + + case 4: /* ORDER */ + if( (strlen(zVal)!=3 || sqlite3_strnicmp(zVal, "asc", 3)) + && (strlen(zVal)!=4 || sqlite3_strnicmp(zVal, "desc", 4)) + ){ + sqlite3Fts3ErrMsg(pzErr, "unrecognized order: %s", zVal); + rc = SQLITE_ERROR; + } + bDescIdx = (zVal[0]=='d' || zVal[0]=='D'); + break; + + case 5: /* CONTENT */ + sqlite3_free(zContent); + zContent = zVal; + zVal = 0; + break; + + case 6: /* LANGUAGEID */ + assert( iOpt==6 ); + sqlite3_free(zLanguageid); + zLanguageid = zVal; + zVal = 0; + break; + + case 7: /* NOTINDEXED */ + azNotindexed[nNotindexed++] = zVal; + zVal = 0; + break; + } + } + sqlite3_free(zVal); + } + } + + /* Otherwise, the argument is a column name. */ + else { + nString += (int)(strlen(z) + 1); + aCol[nCol++] = z; + } + } + + /* If a content=xxx option was specified, the following: + ** + ** 1. Ignore any compress= and uncompress= options. + ** + ** 2. If no column names were specified as part of the CREATE VIRTUAL + ** TABLE statement, use all columns from the content table. + */ + if( rc==SQLITE_OK && zContent ){ + sqlite3_free(zCompress); + sqlite3_free(zUncompress); + zCompress = 0; + zUncompress = 0; + if( nCol==0 ){ + sqlite3_free((void*)aCol); + aCol = 0; + rc = fts3ContentColumns(db, argv[1], zContent,&aCol,&nCol,&nString,pzErr); + + /* If a languageid= option was specified, remove the language id + ** column from the aCol[] array. */ + if( rc==SQLITE_OK && zLanguageid ){ + int j; + for(j=0; jdb = db; + p->nColumn = nCol; + p->nPendingData = 0; + p->azColumn = (char **)&p[1]; + p->pTokenizer = pTokenizer; + p->nMaxPendingData = FTS3_MAX_PENDING_DATA; + p->bHasDocsize = (isFts4 && bNoDocsize==0); + p->bHasStat = isFts4; + p->bFts4 = isFts4; + p->bDescIdx = bDescIdx; + p->nAutoincrmerge = 0xff; /* 0xff means setting unknown */ + p->zContentTbl = zContent; + p->zLanguageid = zLanguageid; + zContent = 0; + zLanguageid = 0; + TESTONLY( p->inTransaction = -1 ); + TESTONLY( p->mxSavepoint = -1 ); + + p->aIndex = (struct Fts3Index *)&p->azColumn[nCol]; + memcpy(p->aIndex, aIndex, sizeof(struct Fts3Index) * nIndex); + p->nIndex = nIndex; + for(i=0; iaIndex[i].hPending, FTS3_HASH_STRING, 1); + } + p->abNotindexed = (u8 *)&p->aIndex[nIndex]; + + /* Fill in the zName and zDb fields of the vtab structure. */ + zCsr = (char *)&p->abNotindexed[nCol]; + 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 */ + for(iCol=0; iColazColumn[iCol] = zCsr; + zCsr += n+1; + assert( zCsr <= &((char *)p)[nByte] ); + } + + /* Fill in the abNotindexed array */ + for(iCol=0; iColazColumn[iCol]); + for(i=0; iazColumn[iCol], zNot, n) + ){ + p->abNotindexed[iCol] = 1; + sqlite3_free(zNot); + azNotindexed[i] = 0; + } + } + } + for(i=0; izReadExprlist = fts3ReadExprList(p, zUncompress, &rc); + p->zWriteExprlist = fts3WriteExprList(p, zCompress, &rc); + if( rc!=SQLITE_OK ) goto fts3_init_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); + } + + /* Check to see if a legacy fts3 table has been "upgraded" by the + ** addition of a %_stat table so that it can use incremental merge. + */ + if( !isFts4 && !isCreate ){ + p->bHasStat = 2; + } + + /* Figure out the page-size for the database. This is required in order to + ** estimate the cost of loading large doclists from the database. */ + fts3DatabasePageSize(&rc, p); + p->nNodeSize = p->nPgsz-35; + + /* Declare the table schema to SQLite. */ + fts3DeclareVtab(&rc, p); + +fts3_init_out: + sqlite3_free(zPrefix); + sqlite3_free(aIndex); + sqlite3_free(zCompress); + sqlite3_free(zUncompress); + sqlite3_free(zContent); + sqlite3_free(zLanguageid); + for(i=0; ipModule->xDestroy(pTokenizer); + } + }else{ + assert( p->pSegments==0 ); + *ppVTab = &p->base; + } + 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); +} + +/* +** Set the pIdxInfo->estimatedRows variable to nRow. Unless this +** extension is currently being used by a version of SQLite too old to +** support estimatedRows. In that case this function is a no-op. +*/ +static void fts3SetEstimatedRows(sqlite3_index_info *pIdxInfo, i64 nRow){ +#if SQLITE_VERSION_NUMBER>=3008002 + if( sqlite3_libversion_number()>=3008002 ){ + pIdxInfo->estimatedRows = nRow; + } +#endif +} + +/* +** Set the SQLITE_INDEX_SCAN_UNIQUE flag in pIdxInfo->flags. Unless this +** extension is currently being used by a version of SQLite too old to +** support index-info flags. In that case this function is a no-op. +*/ +static void fts3SetUniqueFlag(sqlite3_index_info *pIdxInfo){ +#if SQLITE_VERSION_NUMBER>=3008012 + if( sqlite3_libversion_number()>=3008012 ){ + pIdxInfo->idxFlags |= SQLITE_INDEX_SCAN_UNIQUE; + } +#endif +} + +/* +** 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. +*/ +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 */ + + int iLangidCons = -1; /* Index of langid=x constraint, if present */ + int iDocidGe = -1; /* Index of docid>=x constraint, if present */ + int iDocidLe = -1; /* Index of docid<=x constraint, if present */ + int iIdx; + + /* 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. + */ + pInfo->idxNum = FTS3_FULLSCAN_SEARCH; + pInfo->estimatedCost = 5000000; + for(i=0; inConstraint; i++){ + int bDocid; /* True if this constraint is on docid */ + struct sqlite3_index_constraint *pCons = &pInfo->aConstraint[i]; + if( pCons->usable==0 ){ + if( pCons->op==SQLITE_INDEX_CONSTRAINT_MATCH ){ + /* There exists an unusable MATCH constraint. This means that if + ** the planner does elect to use the results of this call as part + ** of the overall query plan the user will see an "unable to use + ** function MATCH in the requested context" error. To discourage + ** this, return a very high cost here. */ + pInfo->idxNum = FTS3_FULLSCAN_SEARCH; + pInfo->estimatedCost = 1e50; + fts3SetEstimatedRows(pInfo, ((sqlite3_int64)1) << 50); + return SQLITE_OK; + } + continue; + } + + bDocid = (pCons->iColumn<0 || pCons->iColumn==p->nColumn+1); + + /* A direct lookup on the rowid or docid column. Assign a cost of 1.0. */ + if( iCons<0 && pCons->op==SQLITE_INDEX_CONSTRAINT_EQ && bDocid ){ + pInfo->idxNum = FTS3_DOCID_SEARCH; + pInfo->estimatedCost = 1.0; + iCons = i; + } + + /* 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; + } + + /* Equality constraint on the langid column */ + if( pCons->op==SQLITE_INDEX_CONSTRAINT_EQ + && pCons->iColumn==p->nColumn + 2 + ){ + iLangidCons = i; + } + + if( bDocid ){ + switch( pCons->op ){ + case SQLITE_INDEX_CONSTRAINT_GE: + case SQLITE_INDEX_CONSTRAINT_GT: + iDocidGe = i; + break; + + case SQLITE_INDEX_CONSTRAINT_LE: + case SQLITE_INDEX_CONSTRAINT_LT: + iDocidLe = i; + break; + } + } + } + + /* If using a docid=? or rowid=? strategy, set the UNIQUE flag. */ + if( pInfo->idxNum==FTS3_DOCID_SEARCH ) fts3SetUniqueFlag(pInfo); + + iIdx = 1; + if( iCons>=0 ){ + pInfo->aConstraintUsage[iCons].argvIndex = iIdx++; + pInfo->aConstraintUsage[iCons].omit = 1; + } + if( iLangidCons>=0 ){ + pInfo->idxNum |= FTS3_HAVE_LANGID; + pInfo->aConstraintUsage[iLangidCons].argvIndex = iIdx++; + } + if( iDocidGe>=0 ){ + pInfo->idxNum |= FTS3_HAVE_DOCID_GE; + pInfo->aConstraintUsage[iDocidGe].argvIndex = iIdx++; + } + if( iDocidLe>=0 ){ + pInfo->idxNum |= FTS3_HAVE_DOCID_LE; + pInfo->aConstraintUsage[iDocidLe].argvIndex = iIdx++; + } + + /* Regardless of the strategy selected, FTS can deliver rows in rowid (or + ** docid) order. Both ascending and descending are possible. + */ + if( pInfo->nOrderBy==1 ){ + struct sqlite3_index_orderby *pOrder = &pInfo->aOrderBy[0]; + if( pOrder->iColumn<0 || pOrder->iColumn==p->nColumn+1 ){ + if( pOrder->desc ){ + pInfo->idxStr = "DESC"; + }else{ + pInfo->idxStr = "ASC"; + } + pInfo->orderByConsumed = 1; + } + } + + assert( p->pSegments==0 ); + return SQLITE_OK; +} + +/* +** Implementation of xOpen method. +*/ +static int fts3OpenMethod(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCsr){ + sqlite3_vtab_cursor *pCsr; /* Allocated cursor */ + + UNUSED_PARAMETER(pVTab); + + /* 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; +} + +/* +** Close the cursor. For additional information see the documentation +** on the xClose method of the virtual table interface. +*/ +static int fts3CloseMethod(sqlite3_vtab_cursor *pCursor){ + Fts3Cursor *pCsr = (Fts3Cursor *)pCursor; + assert( ((Fts3Table *)pCsr->base.pVtab)->pSegments==0 ); + sqlite3_finalize(pCsr->pStmt); + sqlite3Fts3ExprFree(pCsr->pExpr); + sqlite3Fts3FreeDeferredTokens(pCsr); + sqlite3_free(pCsr->aDoclist); + sqlite3Fts3MIBufferFree(pCsr->pMIBuffer); + assert( ((Fts3Table *)pCsr->base.pVtab)->pSegments==0 ); + sqlite3_free(pCsr); + return SQLITE_OK; +} + +/* +** If pCsr->pStmt has not been prepared (i.e. if pCsr->pStmt==0), then +** compose and prepare an SQL statement of the form: +** +** "SELECT FROM %_content WHERE rowid = ?" +** +** (or the equivalent for a content=xxx table) and set pCsr->pStmt to +** it. If an error occurs, return an SQLite error code. +** +** Otherwise, set *ppStmt to point to pCsr->pStmt and return SQLITE_OK. +*/ +static int fts3CursorSeekStmt(Fts3Cursor *pCsr, sqlite3_stmt **ppStmt){ + int rc = SQLITE_OK; + if( pCsr->pStmt==0 ){ + Fts3Table *p = (Fts3Table *)pCsr->base.pVtab; + char *zSql; + zSql = sqlite3_mprintf("SELECT %s WHERE rowid = ?", p->zReadExprlist); + if( !zSql ) return SQLITE_NOMEM; + rc = sqlite3_prepare_v2(p->db, zSql, -1, &pCsr->pStmt, 0); + sqlite3_free(zSql); + } + *ppStmt = pCsr->pStmt; + return rc; +} + +/* +** Position the pCsr->pStmt statement so that it is on the row +** of the %_content table that contains the last match. Return +** SQLITE_OK on success. +*/ +static int fts3CursorSeek(sqlite3_context *pContext, Fts3Cursor *pCsr){ + int rc = SQLITE_OK; + if( pCsr->isRequireSeek ){ + sqlite3_stmt *pStmt = 0; + + rc = fts3CursorSeekStmt(pCsr, &pStmt); + if( rc==SQLITE_OK ){ + sqlite3_bind_int64(pCsr->pStmt, 1, pCsr->iPrevId); + pCsr->isRequireSeek = 0; + if( SQLITE_ROW==sqlite3_step(pCsr->pStmt) ){ + return SQLITE_OK; + }else{ + rc = sqlite3_reset(pCsr->pStmt); + if( rc==SQLITE_OK && ((Fts3Table *)pCsr->base.pVtab)->zContentTbl==0 ){ + /* If no row was found and no error has occurred, then the %_content + ** table is missing a row that is present in the full-text index. + ** The data structures are corrupt. */ + rc = FTS_CORRUPT_VTAB; + pCsr->isEof = 1; + } + } + } + } + + if( rc!=SQLITE_OK && pContext ){ + sqlite3_result_error_code(pContext, rc); + } + return rc; +} + +/* +** This function is used to process a single interior node when searching +** a b-tree for a term or term prefix. The node data is passed to this +** function via the zNode/nNode parameters. The term to search for is +** passed in zTerm/nTerm. +** +** If piFirst is not NULL, then this function sets *piFirst to the blockid +** of the child node that heads the sub-tree that may contain the term. +** +** If piLast is not NULL, then *piLast is set to the right-most child node +** that heads a sub-tree that may contain a term for which zTerm/nTerm is +** a prefix. +** +** If an OOM error occurs, SQLITE_NOMEM is returned. Otherwise, SQLITE_OK. +*/ +static int fts3ScanInteriorNode( + 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 *piFirst, /* OUT: Selected child node */ + sqlite3_int64 *piLast /* OUT: Selected child 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 */ + int isFirstTerm = 1; /* True when processing first term on page */ + sqlite3_int64 iChild; /* Block id of child node to descend to */ + + /* Skip over the 'height' varint that occurs at the start of every + ** interior node. Then load the blockid of the left-child of the b-tree + ** node into variable iChild. + ** + ** Even if the data structure on disk is corrupted, this (reading two + ** varints from the buffer) does not risk an overread. If zNode is a + ** root node, then the buffer comes from a SELECT statement. SQLite does + ** not make this guarantee explicitly, but in practice there are always + ** either more than 20 bytes of allocated space following the nNode bytes of + ** contents, or two zero bytes. Or, if the node is read from the %_segments + ** table, then there are always 20 bytes of zeroed padding following the + ** nNode bytes of content (see sqlite3Fts3ReadBlock() for details). + */ + zCsr += sqlite3Fts3GetVarint(zCsr, &iChild); + zCsr += sqlite3Fts3GetVarint(zCsr, &iChild); + if( zCsr>zEnd ){ + return FTS_CORRUPT_VTAB; + } + + while( zCsrzEnd ){ + rc = FTS_CORRUPT_VTAB; + goto finish_scan; + } + if( nPrefix+nSuffix>nAlloc ){ + char *zNew; + nAlloc = (nPrefix+nSuffix) * 2; + zNew = (char *)sqlite3_realloc(zBuffer, nAlloc); + if( !zNew ){ + rc = SQLITE_NOMEM; + goto finish_scan; + } + zBuffer = zNew; + } + assert( zBuffer ); + 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( piFirst && (cmp<0 || (cmp==0 && nBuffer>nTerm)) ){ + *piFirst = iChild; + piFirst = 0; + } + + if( piLast && cmp<0 ){ + *piLast = iChild; + piLast = 0; + } + + iChild++; + }; + + if( piFirst ) *piFirst = iChild; + if( piLast ) *piLast = iChild; + + finish_scan: + sqlite3_free(zBuffer); + return rc; +} + + +/* +** The buffer pointed to by argument zNode (size nNode bytes) contains an +** interior node of a b-tree segment. The zTerm buffer (size nTerm bytes) +** contains a term. This function searches the sub-tree headed by the zNode +** node for the range of leaf nodes that may contain the specified term +** or terms for which the specified term is a prefix. +** +** If piLeaf is not NULL, then *piLeaf is set to the blockid of the +** left-most leaf node in the tree that may contain the specified term. +** If piLeaf2 is not NULL, then *piLeaf2 is set to the blockid of the +** right-most leaf node that may contain a term for which the specified +** term is a prefix. +** +** It is possible that the range of returned leaf nodes does not contain +** the specified term or any terms for which it is a prefix. However, if the +** segment does contain any such terms, they are stored within the identified +** range. 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 */ + sqlite3_int64 *piLeaf2 /* Selected leaf node */ +){ + int rc = SQLITE_OK; /* Return code */ + int iHeight; /* Height of this node in tree */ + + assert( piLeaf || piLeaf2 ); + + fts3GetVarint32(zNode, &iHeight); + rc = fts3ScanInteriorNode(zTerm, nTerm, zNode, nNode, piLeaf, piLeaf2); + assert( !piLeaf2 || !piLeaf || rc!=SQLITE_OK || (*piLeaf<=*piLeaf2) ); + + if( rc==SQLITE_OK && iHeight>1 ){ + char *zBlob = 0; /* Blob read from %_segments table */ + int nBlob = 0; /* Size of zBlob in bytes */ + + if( piLeaf && piLeaf2 && (*piLeaf!=*piLeaf2) ){ + rc = sqlite3Fts3ReadBlock(p, *piLeaf, &zBlob, &nBlob, 0); + if( rc==SQLITE_OK ){ + rc = fts3SelectLeaf(p, zTerm, nTerm, zBlob, nBlob, piLeaf, 0); + } + sqlite3_free(zBlob); + piLeaf = 0; + zBlob = 0; + } + + if( rc==SQLITE_OK ){ + rc = sqlite3Fts3ReadBlock(p, piLeaf?*piLeaf:*piLeaf2, &zBlob, &nBlob, 0); + } + if( rc==SQLITE_OK ){ + rc = fts3SelectLeaf(p, zTerm, nTerm, zBlob, nBlob, piLeaf, piLeaf2); + } + sqlite3_free(zBlob); + } + + return rc; +} + +/* +** 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 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; +} + +/* +** When this function is called, *ppPoslist is assumed to point to the +** start of a position-list. After it returns, *ppPoslist points to the +** first byte after the position-list. +** +** A position list is list of positions (delta encoded) and columns for +** a single document record of a doclist. So, in other words, this +** routine advances *ppPoslist so that it points to the next docid in +** the doclist, or to the first byte past the end of the doclist. +** +** If pp is not NULL, then the contents of the position list are copied +** to *pp. *pp is set to point to the first byte past the last byte copied +** before this function returns. +*/ +static void fts3PoslistCopy(char **pp, char **ppPoslist){ + char *pEnd = *ppPoslist; + char c = 0; + + /* The end of a position list is marked by a zero encoded as an FTS3 + ** varint. A single POS_END (0) byte. Except, if the 0 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 while-loop 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; + testcase( c!=0 && (*pEnd)==0 ); + } + pEnd++; /* Advance past the POS_END terminator byte */ + + if( pp ){ + int n = (int)(pEnd - *ppPoslist); + char *p = *pp; + memcpy(p, *ppPoslist, n); + p += n; + *pp = p; + } + *ppPoslist = pEnd; +} + +/* +** When this function is called, *ppPoslist is assumed to point to the +** start of a column-list. After it returns, *ppPoslist points to the +** to the terminator (POS_COLUMN or POS_END) byte of the column-list. +** +** A column-list is list of delta-encoded positions for a single column +** within a single document within a doclist. +** +** The column-list is terminated either by a POS_COLUMN varint (1) or +** a POS_END varint (0). This routine leaves *ppPoslist pointing to +** the POS_COLUMN or POS_END that terminates the column-list. +** +** If pp is not NULL, then the contents of the column-list are copied +** to *pp. *pp is set to point to the first byte past the last byte copied +** before this function returns. The POS_COLUMN or POS_END terminator +** is not copied into *pp. +*/ +static void fts3ColumnlistCopy(char **pp, char **ppPoslist){ + char *pEnd = *ppPoslist; + char c = 0; + + /* A column-list is terminated by either a 0x01 or 0x00 byte that is + ** not part of a multi-byte varint. + */ + while( 0xFE & (*pEnd | c) ){ + c = *pEnd++ & 0x80; + testcase( c!=0 && ((*pEnd)&0xfe)==0 ); + } + if( pp ){ + int n = (int)(pEnd - *ppPoslist); + char *p = *pp; + memcpy(p, *ppPoslist, n); + p += n; + *pp = p; + } + *ppPoslist = pEnd; +} + +/* +** Value used to signify the end of an position-list. This is safe because +** it is not possible to have a document with 2^31 terms. +*/ +#define POSITION_LIST_END 0x7fffffff + +/* +** This function is used to help parse position-lists. When this function is +** called, *pp may point to the start of the next varint in the position-list +** being parsed, or it may point to 1 byte past the end of the position-list +** (in which case **pp will be a terminator bytes POS_END (0) or +** (1)). +** +** If *pp points past the end of the current position-list, set *pi to +** POSITION_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. +** +** Before calling this routine *pi must be initialized to the value of +** the previous position, or zero if we are reading the first position +** in the position-list. Because positions are delta-encoded, the value +** of the previous position is needed in order to compute the value of +** the next position. +*/ +static void fts3ReadNextPos( + char **pp, /* IN/OUT: Pointer into position-list buffer */ + sqlite3_int64 *pi /* IN/OUT: Value read from position-list */ +){ + if( (**pp)&0xFE ){ + fts3GetDeltaVarint(pp, pi); + *pi -= 2; + }else{ + *pi = POSITION_LIST_END; + } +} + +/* +** If parameter iCol is not 0, write an POS_COLUMN (1) byte followed by +** the value of iCol encoded as a varint to *pp. This will start a new +** column list. +** +** 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]; + } + return n; +} + +/* +** Compute the union of two position lists. The output written +** into *pp contains all positions of both *pp1 and *pp2 in sorted +** order and with any duplicates removed. All pointers are +** updated appropriately. The caller is responsible for insuring +** that there is enough space in *pp to hold the complete output. +*/ +static void fts3PoslistMerge( + char **pp, /* Output buffer */ + char **pp1, /* Left input list */ + char **pp2 /* Right input list */ +){ + char *p = *pp; + char *p1 = *pp1; + char *p2 = *pp2; + + while( *p1 || *p2 ){ + int iCol1; /* The current column index in pp1 */ + int iCol2; /* The current column index in pp2 */ + + if( *p1==POS_COLUMN ) fts3GetVarint32(&p1[1], &iCol1); + else if( *p1==POS_END ) iCol1 = POSITION_LIST_END; + else iCol1 = 0; + + if( *p2==POS_COLUMN ) fts3GetVarint32(&p2[1], &iCol2); + else if( *p2==POS_END ) iCol2 = POSITION_LIST_END; + else iCol2 = 0; + + if( iCol1==iCol2 ){ + sqlite3_int64 i1 = 0; /* Last position from pp1 */ + sqlite3_int64 i2 = 0; /* Last position from pp2 */ + 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 column-lists + ** for the same column (the column with index iCol1 and iCol2). + ** A column-list is a list of non-negative delta-encoded varints, each + ** incremented by 2 before being stored. Each list is terminated by a + ** POS_END (0) or POS_COLUMN (1). 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 (POS_END or POS_COLUMN) is + ** written to the output. + */ + fts3GetDeltaVarint(&p1, &i1); + fts3GetDeltaVarint(&p2, &i2); + do { + fts3PutDeltaVarint(&p, &iPrev, (i1pos(*pp1) && pos(*pp2)-pos(*pp1)<=nToken). i.e. +** when the *pp1 token appears before the *pp2 token, but not more than nToken +** slots before it. +** +** e.g. nToken==1 searches for adjacent positions. +*/ +static int fts3PoslistPhraseMerge( + char **pp, /* IN/OUT: Preallocated output buffer */ + int nToken, /* Maximum difference in token positions */ + int isSaveLeft, /* Save the left position */ + int isExact, /* If *pp1 is exactly nTokens before *pp2 */ + char **pp1, /* IN/OUT: Left input list */ + char **pp2 /* IN/OUT: Right input list */ +){ + char *p = *pp; + char *p1 = *pp1; + char *p2 = *pp2; + int iCol1 = 0; + int iCol2 = 0; + + /* Never set both isSaveLeft and isExact for the same invocation. */ + assert( isSaveLeft==0 || isExact==0 ); + + assert( p!=0 && *p1!=0 && *p2!=0 ); + if( *p1==POS_COLUMN ){ + p1++; + p1 += fts3GetVarint32(p1, &iCol1); + } + if( *p2==POS_COLUMN ){ + p2++; + p2 += fts3GetVarint32(p2, &iCol2); + } + + while( 1 ){ + if( iCol1==iCol2 ){ + char *pSave = p; + sqlite3_int64 iPrev = 0; + sqlite3_int64 iPos1 = 0; + sqlite3_int64 iPos2 = 0; + + if( iCol1 ){ + *p++ = POS_COLUMN; + p += sqlite3Fts3PutVarint(p, iCol1); + } + + assert( *p1!=POS_END && *p1!=POS_COLUMN ); + assert( *p2!=POS_END && *p2!=POS_COLUMN ); + fts3GetDeltaVarint(&p1, &iPos1); iPos1 -= 2; + fts3GetDeltaVarint(&p2, &iPos2); iPos2 -= 2; + + while( 1 ){ + if( iPos2==iPos1+nToken + || (isExact==0 && iPos2>iPos1 && iPos2<=iPos1+nToken) + ){ + sqlite3_int64 iSave; + iSave = isSaveLeft ? iPos1 : iPos2; + fts3PutDeltaVarint(&p, &iPrev, iSave+2); iPrev -= 2; + pSave = 0; + assert( p ); + } + 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; + } + } + + if( pSave ){ + assert( pp && p ); + p = pSave; + } + + fts3ColumnlistCopy(0, &p1); + fts3ColumnlistCopy(0, &p2); + assert( (*p1&0xFE)==0 && (*p2&0xFE)==0 ); + if( 0==*p1 || 0==*p2 ) break; + + p1++; + p1 += fts3GetVarint32(p1, &iCol1); + p2++; + p2 += fts3GetVarint32(p2, &iCol2); + } + + /* Advance pointer p1 or p2 (whichever corresponds to the smaller of + ** iCol1 and iCol2) so that it points to either the 0x00 that marks the + ** end of the position list, or the 0x01 that precedes the next + ** column-number in the position list. + */ + else if( iCol1=pEnd ){ + *pp = 0; + }else{ + sqlite3_int64 iVal; + *pp += sqlite3Fts3GetVarint(*pp, &iVal); + if( bDescIdx ){ + *pVal -= iVal; + }else{ + *pVal += iVal; + } + } +} + +/* +** This function is used to write a single varint to a buffer. The varint +** is written to *pp. Before returning, *pp is set to point 1 byte past the +** end of the value written. +** +** If *pbFirst is zero when this function is called, the value written to +** the buffer is that of parameter iVal. +** +** If *pbFirst is non-zero when this function is called, then the value +** written is either (iVal-*piPrev) (if bDescIdx is zero) or (*piPrev-iVal) +** (if bDescIdx is non-zero). +** +** Before returning, this function always sets *pbFirst to 1 and *piPrev +** to the value of parameter iVal. +*/ +static void fts3PutDeltaVarint3( + char **pp, /* IN/OUT: Output pointer */ + int bDescIdx, /* True for descending docids */ + sqlite3_int64 *piPrev, /* IN/OUT: Previous value written to list */ + int *pbFirst, /* IN/OUT: True after first int written */ + sqlite3_int64 iVal /* Write this value to the list */ +){ + sqlite3_int64 iWrite; + if( bDescIdx==0 || *pbFirst==0 ){ + iWrite = iVal - *piPrev; + }else{ + iWrite = *piPrev - iVal; + } + assert( *pbFirst || *piPrev==0 ); + assert( *pbFirst==0 || iWrite>0 ); + *pp += sqlite3Fts3PutVarint(*pp, iWrite); + *piPrev = iVal; + *pbFirst = 1; +} + + +/* +** This macro is used by various functions that merge doclists. The two +** arguments are 64-bit docid values. If the value of the stack variable +** bDescDoclist is 0 when this macro is invoked, then it returns (i1-i2). +** Otherwise, (i2-i1). +** +** Using this makes it easier to write code that can merge doclists that are +** sorted in either ascending or descending order. +*/ +#define DOCID_CMP(i1, i2) ((bDescDoclist?-1:1) * (i1-i2)) + +/* +** This function does an "OR" merge of two doclists (output contains all +** positions contained in either argument doclist). If the docids in the +** input doclists are sorted in ascending order, parameter bDescDoclist +** should be false. If they are sorted in ascending order, it should be +** passed a non-zero value. +** +** If no error occurs, *paOut is set to point at an sqlite3_malloc'd buffer +** containing the output doclist and SQLITE_OK is returned. In this case +** *pnOut is set to the number of bytes in the output doclist. +** +** If an error occurs, an SQLite error code is returned. The output values +** are undefined in this case. +*/ +static int fts3DoclistOrMerge( + int bDescDoclist, /* True if arguments are desc */ + char *a1, int n1, /* First doclist */ + char *a2, int n2, /* Second doclist */ + char **paOut, int *pnOut /* OUT: Malloc'd doclist */ +){ + sqlite3_int64 i1 = 0; + sqlite3_int64 i2 = 0; + sqlite3_int64 iPrev = 0; + char *pEnd1 = &a1[n1]; + char *pEnd2 = &a2[n2]; + char *p1 = a1; + char *p2 = a2; + char *p; + char *aOut; + int bFirstOut = 0; + + *paOut = 0; + *pnOut = 0; + + /* Allocate space for the output. Both the input and output doclists + ** are delta encoded. If they are in ascending order (bDescDoclist==0), + ** then the first docid in each list is simply encoded as a varint. For + ** each subsequent docid, the varint stored is the difference between the + ** current and previous docid (a positive number - since the list is in + ** ascending order). + ** + ** The first docid written to the output is therefore encoded using the + ** same number of bytes as it is in whichever of the input lists it is + ** read from. And each subsequent docid read from the same input list + ** consumes either the same or less bytes as it did in the input (since + ** the difference between it and the previous value in the output must + ** be a positive value less than or equal to the delta value read from + ** the input list). The same argument applies to all but the first docid + ** read from the 'other' list. And to the contents of all position lists + ** that will be copied and merged from the input to the output. + ** + ** However, if the first docid copied to the output is a negative number, + ** then the encoding of the first docid from the 'other' input list may + ** be larger in the output than it was in the input (since the delta value + ** may be a larger positive integer than the actual docid). + ** + ** The space required to store the output is therefore the sum of the + ** sizes of the two inputs, plus enough space for exactly one of the input + ** docids to grow. + ** + ** A symetric argument may be made if the doclists are in descending + ** order. + */ + aOut = sqlite3_malloc(n1+n2+FTS3_VARINT_MAX-1); + if( !aOut ) return SQLITE_NOMEM; + + p = aOut; + fts3GetDeltaVarint3(&p1, pEnd1, 0, &i1); + fts3GetDeltaVarint3(&p2, pEnd2, 0, &i2); + while( p1 || p2 ){ + sqlite3_int64 iDiff = DOCID_CMP(i1, i2); + + if( p2 && p1 && iDiff==0 ){ + fts3PutDeltaVarint3(&p, bDescDoclist, &iPrev, &bFirstOut, i1); + fts3PoslistMerge(&p, &p1, &p2); + fts3GetDeltaVarint3(&p1, pEnd1, bDescDoclist, &i1); + fts3GetDeltaVarint3(&p2, pEnd2, bDescDoclist, &i2); + }else if( !p2 || (p1 && iDiff<0) ){ + fts3PutDeltaVarint3(&p, bDescDoclist, &iPrev, &bFirstOut, i1); + fts3PoslistCopy(&p, &p1); + fts3GetDeltaVarint3(&p1, pEnd1, bDescDoclist, &i1); + }else{ + fts3PutDeltaVarint3(&p, bDescDoclist, &iPrev, &bFirstOut, i2); + fts3PoslistCopy(&p, &p2); + fts3GetDeltaVarint3(&p2, pEnd2, bDescDoclist, &i2); + } + } + + *paOut = aOut; + *pnOut = (int)(p-aOut); + assert( *pnOut<=n1+n2+FTS3_VARINT_MAX-1 ); + return SQLITE_OK; +} + +/* +** This function does a "phrase" merge of two doclists. In a phrase merge, +** the output contains a copy of each position from the right-hand input +** doclist for which there is a position in the left-hand input doclist +** exactly nDist tokens before it. +** +** If the docids in the input doclists are sorted in ascending order, +** parameter bDescDoclist should be false. If they are sorted in ascending +** order, it should be passed a non-zero value. +** +** The right-hand input doclist is overwritten by this function. +*/ +static int fts3DoclistPhraseMerge( + int bDescDoclist, /* True if arguments are desc */ + int nDist, /* Distance from left to right (1=adjacent) */ + char *aLeft, int nLeft, /* Left doclist */ + char **paRight, int *pnRight /* IN/OUT: Right/output doclist */ +){ + sqlite3_int64 i1 = 0; + sqlite3_int64 i2 = 0; + sqlite3_int64 iPrev = 0; + char *aRight = *paRight; + char *pEnd1 = &aLeft[nLeft]; + char *pEnd2 = &aRight[*pnRight]; + char *p1 = aLeft; + char *p2 = aRight; + char *p; + int bFirstOut = 0; + char *aOut; + + assert( nDist>0 ); + if( bDescDoclist ){ + aOut = sqlite3_malloc(*pnRight + FTS3_VARINT_MAX); + if( aOut==0 ) return SQLITE_NOMEM; + }else{ + aOut = aRight; + } + p = aOut; + + fts3GetDeltaVarint3(&p1, pEnd1, 0, &i1); + fts3GetDeltaVarint3(&p2, pEnd2, 0, &i2); + + while( p1 && p2 ){ + sqlite3_int64 iDiff = DOCID_CMP(i1, i2); + if( iDiff==0 ){ + char *pSave = p; + sqlite3_int64 iPrevSave = iPrev; + int bFirstOutSave = bFirstOut; + + fts3PutDeltaVarint3(&p, bDescDoclist, &iPrev, &bFirstOut, i1); + if( 0==fts3PoslistPhraseMerge(&p, nDist, 0, 1, &p1, &p2) ){ + p = pSave; + iPrev = iPrevSave; + bFirstOut = bFirstOutSave; + } + fts3GetDeltaVarint3(&p1, pEnd1, bDescDoclist, &i1); + fts3GetDeltaVarint3(&p2, pEnd2, bDescDoclist, &i2); + }else if( iDiff<0 ){ + fts3PoslistCopy(0, &p1); + fts3GetDeltaVarint3(&p1, pEnd1, bDescDoclist, &i1); + }else{ + fts3PoslistCopy(0, &p2); + fts3GetDeltaVarint3(&p2, pEnd2, bDescDoclist, &i2); + } + } + + *pnRight = (int)(p - aOut); + if( bDescDoclist ){ + sqlite3_free(aRight); + *paRight = aOut; + } + + return SQLITE_OK; +} + +/* +** Argument pList points to a position list nList bytes in size. This +** function checks to see if the position list contains any entries for +** a token in position 0 (of any column). If so, it writes argument iDelta +** to the output buffer pOut, followed by a position list consisting only +** of the entries from pList at position 0, and terminated by an 0x00 byte. +** The value returned is the number of bytes written to pOut (if any). +*/ +SQLITE_PRIVATE int sqlite3Fts3FirstFilter( + sqlite3_int64 iDelta, /* Varint that may be written to pOut */ + char *pList, /* Position list (no 0x00 term) */ + int nList, /* Size of pList in bytes */ + char *pOut /* Write output here */ +){ + int nOut = 0; + int bWritten = 0; /* True once iDelta has been written */ + char *p = pList; + char *pEnd = &pList[nList]; + + if( *p!=0x01 ){ + if( *p==0x02 ){ + nOut += sqlite3Fts3PutVarint(&pOut[nOut], iDelta); + pOut[nOut++] = 0x02; + bWritten = 1; + } + fts3ColumnlistCopy(0, &p); + } + + while( paaOutput); i++){ + if( pTS->aaOutput[i] ){ + if( !aOut ){ + aOut = pTS->aaOutput[i]; + nOut = pTS->anOutput[i]; + pTS->aaOutput[i] = 0; + }else{ + int nNew; + char *aNew; + + int rc = fts3DoclistOrMerge(p->bDescIdx, + pTS->aaOutput[i], pTS->anOutput[i], aOut, nOut, &aNew, &nNew + ); + if( rc!=SQLITE_OK ){ + sqlite3_free(aOut); + return rc; + } + + sqlite3_free(pTS->aaOutput[i]); + sqlite3_free(aOut); + pTS->aaOutput[i] = 0; + aOut = aNew; + nOut = nNew; + } + } + } + + pTS->aaOutput[0] = aOut; + pTS->anOutput[0] = nOut; + return SQLITE_OK; +} + +/* +** Merge the doclist aDoclist/nDoclist into the TermSelect object passed +** as the first argument. The merge is an "OR" merge (see function +** fts3DoclistOrMerge() for details). +** +** This function is called with the doclist for each term that matches +** a queried prefix. It merges all these doclists into one, the doclist +** for the specified prefix. Since there can be a very large number of +** doclists to merge, the merging is done pair-wise using the TermSelect +** object. +** +** This function returns SQLITE_OK if the merge is successful, or an +** SQLite error code (SQLITE_NOMEM) if an error occurs. +*/ +static int fts3TermSelectMerge( + Fts3Table *p, /* FTS table handle */ + TermSelect *pTS, /* TermSelect object to merge into */ + char *aDoclist, /* Pointer to doclist */ + int nDoclist /* Size of aDoclist in bytes */ +){ + if( pTS->aaOutput[0]==0 ){ + /* If this is the first term selected, copy the doclist to the output + ** buffer using memcpy(). + ** + ** Add FTS3_VARINT_MAX bytes of unused space to the end of the + ** allocation. This is so as to ensure that the buffer is big enough + ** to hold the current doclist AND'd with any other doclist. If the + ** doclists are stored in order=ASC order, this padding would not be + ** required (since the size of [doclistA AND doclistB] is always less + ** than or equal to the size of [doclistA] in that case). But this is + ** not true for order=DESC. For example, a doclist containing (1, -1) + ** may be smaller than (-1), as in the first example the -1 may be stored + ** as a single-byte delta, whereas in the second it must be stored as a + ** FTS3_VARINT_MAX byte varint. + ** + ** Similar padding is added in the fts3DoclistOrMerge() function. + */ + pTS->aaOutput[0] = sqlite3_malloc(nDoclist + FTS3_VARINT_MAX + 1); + pTS->anOutput[0] = nDoclist; + if( pTS->aaOutput[0] ){ + memcpy(pTS->aaOutput[0], aDoclist, nDoclist); + }else{ + return SQLITE_NOMEM; + } + }else{ + char *aMerge = aDoclist; + int nMerge = nDoclist; + int iOut; + + for(iOut=0; iOutaaOutput); iOut++){ + if( pTS->aaOutput[iOut]==0 ){ + assert( iOut>0 ); + pTS->aaOutput[iOut] = aMerge; + pTS->anOutput[iOut] = nMerge; + break; + }else{ + char *aNew; + int nNew; + + int rc = fts3DoclistOrMerge(p->bDescIdx, aMerge, nMerge, + pTS->aaOutput[iOut], pTS->anOutput[iOut], &aNew, &nNew + ); + if( rc!=SQLITE_OK ){ + if( aMerge!=aDoclist ) sqlite3_free(aMerge); + return rc; + } + + if( aMerge!=aDoclist ) sqlite3_free(aMerge); + sqlite3_free(pTS->aaOutput[iOut]); + pTS->aaOutput[iOut] = 0; + + aMerge = aNew; + nMerge = nNew; + if( (iOut+1)==SizeofArray(pTS->aaOutput) ){ + pTS->aaOutput[iOut] = aMerge; + pTS->anOutput[iOut] = nMerge; + } + } + } + } + return SQLITE_OK; +} + +/* +** Append SegReader object pNew to the end of the pCsr->apSegment[] array. +*/ +static int fts3SegReaderCursorAppend( + Fts3MultiSegReader *pCsr, + Fts3SegReader *pNew +){ + if( (pCsr->nSegment%16)==0 ){ + Fts3SegReader **apNew; + int nByte = (pCsr->nSegment + 16)*sizeof(Fts3SegReader*); + apNew = (Fts3SegReader **)sqlite3_realloc(pCsr->apSegment, nByte); + if( !apNew ){ + sqlite3Fts3SegReaderFree(pNew); + return SQLITE_NOMEM; + } + pCsr->apSegment = apNew; + } + pCsr->apSegment[pCsr->nSegment++] = pNew; + return SQLITE_OK; +} + +/* +** Add seg-reader objects to the Fts3MultiSegReader object passed as the +** 8th argument. +** +** This function returns SQLITE_OK if successful, or an SQLite error code +** otherwise. +*/ +static int fts3SegReaderCursor( + Fts3Table *p, /* FTS3 table handle */ + int iLangid, /* Language id */ + int iIndex, /* Index to search (from 0 to p->nIndex-1) */ + int iLevel, /* Level of segments to scan */ + const char *zTerm, /* Term to query for */ + int nTerm, /* Size of zTerm in bytes */ + int isPrefix, /* True for a prefix search */ + int isScan, /* True to scan from zTerm to EOF */ + Fts3MultiSegReader *pCsr /* Cursor object to populate */ +){ + int rc = SQLITE_OK; /* Error code */ + sqlite3_stmt *pStmt = 0; /* Statement to iterate through segments */ + int rc2; /* Result of sqlite3_reset() */ + + /* If iLevel is less than 0 and this is not a scan, include a seg-reader + ** for the pending-terms. If this is a scan, then this call must be being + ** made by an fts4aux module, not an FTS table. In this case calling + ** Fts3SegReaderPending might segfault, as the data structures used by + ** fts4aux are not completely populated. So it's easiest to filter these + ** calls out here. */ + if( iLevel<0 && p->aIndex ){ + Fts3SegReader *pSeg = 0; + rc = sqlite3Fts3SegReaderPending(p, iIndex, zTerm, nTerm, isPrefix||isScan, &pSeg); + if( rc==SQLITE_OK && pSeg ){ + rc = fts3SegReaderCursorAppend(pCsr, pSeg); + } + } + + if( iLevel!=FTS3_SEGCURSOR_PENDING ){ + if( rc==SQLITE_OK ){ + rc = sqlite3Fts3AllSegdirs(p, iLangid, iIndex, iLevel, &pStmt); + } + + while( rc==SQLITE_OK && SQLITE_ROW==(rc = sqlite3_step(pStmt)) ){ + Fts3SegReader *pSeg = 0; + + /* Read the values returned by the SELECT into local variables. */ + sqlite3_int64 iStartBlock = sqlite3_column_int64(pStmt, 1); + sqlite3_int64 iLeavesEndBlock = sqlite3_column_int64(pStmt, 2); + sqlite3_int64 iEndBlock = sqlite3_column_int64(pStmt, 3); + int nRoot = sqlite3_column_bytes(pStmt, 4); + char const *zRoot = sqlite3_column_blob(pStmt, 4); + + /* If zTerm is not NULL, and this segment is not stored entirely on its + ** root node, the range of leaves scanned can be reduced. Do this. */ + if( iStartBlock && zTerm ){ + sqlite3_int64 *pi = (isPrefix ? &iLeavesEndBlock : 0); + rc = fts3SelectLeaf(p, zTerm, nTerm, zRoot, nRoot, &iStartBlock, pi); + if( rc!=SQLITE_OK ) goto finished; + if( isPrefix==0 && isScan==0 ) iLeavesEndBlock = iStartBlock; + } + + rc = sqlite3Fts3SegReaderNew(pCsr->nSegment+1, + (isPrefix==0 && isScan==0), + iStartBlock, iLeavesEndBlock, + iEndBlock, zRoot, nRoot, &pSeg + ); + if( rc!=SQLITE_OK ) goto finished; + rc = fts3SegReaderCursorAppend(pCsr, pSeg); + } + } + + finished: + rc2 = sqlite3_reset(pStmt); + if( rc==SQLITE_DONE ) rc = rc2; + + return rc; +} + +/* +** Set up a cursor object for iterating through a full-text index or a +** single level therein. +*/ +SQLITE_PRIVATE int sqlite3Fts3SegReaderCursor( + Fts3Table *p, /* FTS3 table handle */ + int iLangid, /* Language-id to search */ + int iIndex, /* Index to search (from 0 to p->nIndex-1) */ + int iLevel, /* Level of segments to scan */ + const char *zTerm, /* Term to query for */ + int nTerm, /* Size of zTerm in bytes */ + int isPrefix, /* True for a prefix search */ + int isScan, /* True to scan from zTerm to EOF */ + Fts3MultiSegReader *pCsr /* Cursor object to populate */ +){ + assert( iIndex>=0 && iIndexnIndex ); + assert( iLevel==FTS3_SEGCURSOR_ALL + || iLevel==FTS3_SEGCURSOR_PENDING + || iLevel>=0 + ); + assert( iLevelbase.pVtab; + + if( isPrefix ){ + for(i=1; bFound==0 && inIndex; i++){ + if( p->aIndex[i].nPrefix==nTerm ){ + bFound = 1; + rc = sqlite3Fts3SegReaderCursor(p, pCsr->iLangid, + i, FTS3_SEGCURSOR_ALL, zTerm, nTerm, 0, 0, pSegcsr + ); + pSegcsr->bLookup = 1; + } + } + + for(i=1; bFound==0 && inIndex; i++){ + if( p->aIndex[i].nPrefix==nTerm+1 ){ + bFound = 1; + rc = sqlite3Fts3SegReaderCursor(p, pCsr->iLangid, + i, FTS3_SEGCURSOR_ALL, zTerm, nTerm, 1, 0, pSegcsr + ); + if( rc==SQLITE_OK ){ + rc = fts3SegReaderCursorAddZero( + p, pCsr->iLangid, zTerm, nTerm, pSegcsr + ); + } + } + } + } + + if( bFound==0 ){ + rc = sqlite3Fts3SegReaderCursor(p, pCsr->iLangid, + 0, FTS3_SEGCURSOR_ALL, zTerm, nTerm, isPrefix, 0, pSegcsr + ); + pSegcsr->bLookup = !isPrefix; + } + } + + *ppSegcsr = pSegcsr; + return rc; +} + +/* +** Free an Fts3MultiSegReader allocated by fts3TermSegReaderCursor(). +*/ +static void fts3SegReaderCursorFree(Fts3MultiSegReader *pSegcsr){ + sqlite3Fts3SegReaderFinish(pSegcsr); + sqlite3_free(pSegcsr); +} + +/* +** This function retrieves the doclist for the specified term (or term +** prefix) from the database. +*/ +static int fts3TermSelect( + Fts3Table *p, /* Virtual table handle */ + Fts3PhraseToken *pTok, /* Token to query for */ + int iColumn, /* Column to query (or -ve for all columns) */ + int *pnOut, /* OUT: Size of buffer at *ppOut */ + char **ppOut /* OUT: Malloced result buffer */ +){ + int rc; /* Return code */ + Fts3MultiSegReader *pSegcsr; /* Seg-reader cursor for this term */ + TermSelect tsc; /* Object for pair-wise doclist merging */ + Fts3SegFilter filter; /* Segment term filter configuration */ + + pSegcsr = pTok->pSegcsr; + memset(&tsc, 0, sizeof(TermSelect)); + + filter.flags = FTS3_SEGMENT_IGNORE_EMPTY | FTS3_SEGMENT_REQUIRE_POS + | (pTok->isPrefix ? FTS3_SEGMENT_PREFIX : 0) + | (pTok->bFirst ? FTS3_SEGMENT_FIRST : 0) + | (iColumnnColumn ? FTS3_SEGMENT_COLUMN_FILTER : 0); + filter.iCol = iColumn; + filter.zTerm = pTok->z; + filter.nTerm = pTok->n; + + rc = sqlite3Fts3SegReaderStart(p, pSegcsr, &filter); + while( SQLITE_OK==rc + && SQLITE_ROW==(rc = sqlite3Fts3SegReaderStep(p, pSegcsr)) + ){ + rc = fts3TermSelectMerge(p, &tsc, pSegcsr->aDoclist, pSegcsr->nDoclist); + } + + if( rc==SQLITE_OK ){ + rc = fts3TermSelectFinishMerge(p, &tsc); + } + if( rc==SQLITE_OK ){ + *ppOut = tsc.aaOutput[0]; + *pnOut = tsc.anOutput[0]; + }else{ + int i; + for(i=0; ipSegcsr = 0; + return rc; +} + +/* +** This function counts the total number of docids in the doclist stored +** in buffer aList[], size nList bytes. +** +** If the isPoslist argument is true, then it is assumed that the doclist +** contains a position-list following each docid. Otherwise, it is assumed +** that the doclist is simply a list of docids stored as delta encoded +** varints. +*/ +static int fts3DoclistCountDocids(char *aList, int nList){ + int nDoc = 0; /* Return value */ + if( aList ){ + char *aEnd = &aList[nList]; /* Pointer to one byte after EOF */ + char *p = aList; /* Cursor */ + while( peSearch==FTS3_DOCID_SEARCH || pCsr->eSearch==FTS3_FULLSCAN_SEARCH ){ + if( SQLITE_ROW!=sqlite3_step(pCsr->pStmt) ){ + pCsr->isEof = 1; + rc = sqlite3_reset(pCsr->pStmt); + }else{ + pCsr->iPrevId = sqlite3_column_int64(pCsr->pStmt, 0); + rc = SQLITE_OK; + } + }else{ + rc = fts3EvalNext((Fts3Cursor *)pCursor); + } + assert( ((Fts3Table *)pCsr->base.pVtab)->pSegments==0 ); + return rc; +} + +/* +** The following are copied from sqliteInt.h. +** +** Constants for the largest and smallest possible 64-bit signed integers. +** These macros are designed to work correctly on both 32-bit and 64-bit +** compilers. +*/ +#ifndef SQLITE_AMALGAMATION +# define LARGEST_INT64 (0xffffffff|(((sqlite3_int64)0x7fffffff)<<32)) +# define SMALLEST_INT64 (((sqlite3_int64)-1) - LARGEST_INT64) +#endif + +/* +** If the numeric type of argument pVal is "integer", then return it +** converted to a 64-bit signed integer. Otherwise, return a copy of +** the second parameter, iDefault. +*/ +static sqlite3_int64 fts3DocidRange(sqlite3_value *pVal, i64 iDefault){ + if( pVal ){ + int eType = sqlite3_value_numeric_type(pVal); + if( eType==SQLITE_INTEGER ){ + return sqlite3_value_int64(pVal); + } + } + return iDefault; +} + +/* +** 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. +** +** 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 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 */ +){ + int rc = SQLITE_OK; + char *zSql; /* SQL statement used to access %_content */ + int eSearch; + Fts3Table *p = (Fts3Table *)pCursor->pVtab; + Fts3Cursor *pCsr = (Fts3Cursor *)pCursor; + + sqlite3_value *pCons = 0; /* The MATCH or rowid constraint, if any */ + sqlite3_value *pLangid = 0; /* The "langid = ?" constraint, if any */ + sqlite3_value *pDocidGe = 0; /* The "docid >= ?" constraint, if any */ + sqlite3_value *pDocidLe = 0; /* The "docid <= ?" constraint, if any */ + int iIdx; + + UNUSED_PARAMETER(idxStr); + UNUSED_PARAMETER(nVal); + + eSearch = (idxNum & 0x0000FFFF); + assert( eSearch>=0 && eSearch<=(FTS3_FULLTEXT_SEARCH+p->nColumn) ); + assert( p->pSegments==0 ); + + /* Collect arguments into local variables */ + iIdx = 0; + if( eSearch!=FTS3_FULLSCAN_SEARCH ) pCons = apVal[iIdx++]; + if( idxNum & FTS3_HAVE_LANGID ) pLangid = apVal[iIdx++]; + if( idxNum & FTS3_HAVE_DOCID_GE ) pDocidGe = apVal[iIdx++]; + if( idxNum & FTS3_HAVE_DOCID_LE ) pDocidLe = apVal[iIdx++]; + assert( iIdx==nVal ); + + /* In case the cursor has been used before, clear it now. */ + sqlite3_finalize(pCsr->pStmt); + sqlite3_free(pCsr->aDoclist); + sqlite3Fts3MIBufferFree(pCsr->pMIBuffer); + sqlite3Fts3ExprFree(pCsr->pExpr); + memset(&pCursor[1], 0, sizeof(Fts3Cursor)-sizeof(sqlite3_vtab_cursor)); + + /* Set the lower and upper bounds on docids to return */ + pCsr->iMinDocid = fts3DocidRange(pDocidGe, SMALLEST_INT64); + pCsr->iMaxDocid = fts3DocidRange(pDocidLe, LARGEST_INT64); + + if( idxStr ){ + pCsr->bDesc = (idxStr[0]=='D'); + }else{ + pCsr->bDesc = p->bDescIdx; + } + pCsr->eSearch = (i16)eSearch; + + if( eSearch!=FTS3_DOCID_SEARCH && eSearch!=FTS3_FULLSCAN_SEARCH ){ + int iCol = eSearch-FTS3_FULLTEXT_SEARCH; + const char *zQuery = (const char *)sqlite3_value_text(pCons); + + if( zQuery==0 && sqlite3_value_type(pCons)!=SQLITE_NULL ){ + return SQLITE_NOMEM; + } + + pCsr->iLangid = 0; + if( pLangid ) pCsr->iLangid = sqlite3_value_int(pLangid); + + assert( p->base.zErrMsg==0 ); + rc = sqlite3Fts3ExprParse(p->pTokenizer, pCsr->iLangid, + p->azColumn, p->bFts4, p->nColumn, iCol, zQuery, -1, &pCsr->pExpr, + &p->base.zErrMsg + ); + if( rc!=SQLITE_OK ){ + return rc; + } + + rc = fts3EvalStart(pCsr); + sqlite3Fts3SegmentsClose(p); + if( rc!=SQLITE_OK ) return rc; + pCsr->pNextId = pCsr->aDoclist; + pCsr->iPrevId = 0; + } + + /* 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. + */ + if( eSearch==FTS3_FULLSCAN_SEARCH ){ + if( pDocidGe || pDocidLe ){ + zSql = sqlite3_mprintf( + "SELECT %s WHERE rowid BETWEEN %lld AND %lld ORDER BY rowid %s", + p->zReadExprlist, pCsr->iMinDocid, pCsr->iMaxDocid, + (pCsr->bDesc ? "DESC" : "ASC") + ); + }else{ + zSql = sqlite3_mprintf("SELECT %s ORDER BY rowid %s", + p->zReadExprlist, (pCsr->bDesc ? "DESC" : "ASC") + ); + } + if( zSql ){ + rc = sqlite3_prepare_v2(p->db, zSql, -1, &pCsr->pStmt, 0); + sqlite3_free(zSql); + }else{ + rc = SQLITE_NOMEM; + } + }else if( eSearch==FTS3_DOCID_SEARCH ){ + rc = fts3CursorSeekStmt(pCsr, &pCsr->pStmt); + if( rc==SQLITE_OK ){ + rc = sqlite3_bind_value(pCsr->pStmt, 1, pCons); + } + } + if( rc!=SQLITE_OK ) return rc; + + return fts3NextMethod(pCursor); +} + +/* +** 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 fts3EofMethod(sqlite3_vtab_cursor *pCursor){ + return ((Fts3Cursor *)pCursor)->isEof; +} + +/* +** 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 fts3RowidMethod(sqlite3_vtab_cursor *pCursor, sqlite_int64 *pRowid){ + Fts3Cursor *pCsr = (Fts3Cursor *) pCursor; + *pRowid = pCsr->iPrevId; + return SQLITE_OK; +} + +/* +** This is the xColumn method, called by SQLite to request a value from +** the row that the supplied cursor currently points to. +** +** If: +** +** (iCol < p->nColumn) -> The value of the iCol'th user column. +** (iCol == p->nColumn) -> Magic column with the same name as the table. +** (iCol == p->nColumn+1) -> Docid column +** (iCol == p->nColumn+2) -> Langid column +*/ +static int fts3ColumnMethod( + sqlite3_vtab_cursor *pCursor, /* Cursor to retrieve value from */ + sqlite3_context *pCtx, /* Context for sqlite3_result_xxx() calls */ + int iCol /* Index of column to read value from */ +){ + int rc = SQLITE_OK; /* Return Code */ + Fts3Cursor *pCsr = (Fts3Cursor *) pCursor; + Fts3Table *p = (Fts3Table *)pCursor->pVtab; + + /* The column value supplied by SQLite must be in range. */ + assert( iCol>=0 && iCol<=p->nColumn+2 ); + + 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_result_int64(pCtx, pCsr->iPrevId); + }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(pCtx, &pCsr, sizeof(pCsr), SQLITE_TRANSIENT); + }else if( iCol==p->nColumn+2 && pCsr->pExpr ){ + sqlite3_result_int64(pCtx, pCsr->iLangid); + }else{ + /* The requested column is either a user column (one that contains + ** indexed data), or the language-id column. */ + rc = fts3CursorSeek(0, pCsr); + + if( rc==SQLITE_OK ){ + if( iCol==p->nColumn+2 ){ + int iLangid = 0; + if( p->zLanguageid ){ + iLangid = sqlite3_column_int(pCsr->pStmt, p->nColumn+1); + } + sqlite3_result_int(pCtx, iLangid); + }else if( sqlite3_data_count(pCsr->pStmt)>(iCol+1) ){ + sqlite3_result_value(pCtx, sqlite3_column_value(pCsr->pStmt, iCol+1)); + } + } + } + + assert( ((Fts3Table *)pCsr->base.pVtab)->pSegments==0 ); + return rc; +} + +/* +** 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); +} + +/* +** Implementation of xSync() method. Flush the contents of the pending-terms +** hash-table to the database. +*/ +static int fts3SyncMethod(sqlite3_vtab *pVtab){ + + /* Following an incremental-merge operation, assuming that the input + ** segments are not completely consumed (the usual case), they are updated + ** in place to remove the entries that have already been merged. This + ** involves updating the leaf block that contains the smallest unmerged + ** entry and each block (if any) between the leaf and the root node. So + ** if the height of the input segment b-trees is N, and input segments + ** are merged eight at a time, updating the input segments at the end + ** of an incremental-merge requires writing (8*(1+N)) blocks. N is usually + ** small - often between 0 and 2. So the overhead of the incremental + ** merge is somewhere between 8 and 24 blocks. To avoid this overhead + ** dwarfing the actual productive work accomplished, the incremental merge + ** is only attempted if it will write at least 64 leaf blocks. Hence + ** nMinMerge. + ** + ** Of course, updating the input segments also involves deleting a bunch + ** of blocks from the segments table. But this is not considered overhead + ** as it would also be required by a crisis-merge that used the same input + ** segments. + */ + const u32 nMinMerge = 64; /* Minimum amount of incr-merge work to do */ + + Fts3Table *p = (Fts3Table*)pVtab; + int rc = sqlite3Fts3PendingTermsFlush(p); + + if( rc==SQLITE_OK + && p->nLeafAdd>(nMinMerge/16) + && p->nAutoincrmerge && p->nAutoincrmerge!=0xff + ){ + int mxLevel = 0; /* Maximum relative level value in db */ + int A; /* Incr-merge parameter A */ + + rc = sqlite3Fts3MaxLevel(p, &mxLevel); + assert( rc==SQLITE_OK || mxLevel==0 ); + A = p->nLeafAdd * mxLevel; + A += (A/2); + if( A>(int)nMinMerge ) rc = sqlite3Fts3Incrmerge(p, A, p->nAutoincrmerge); + } + sqlite3Fts3SegmentsClose(p); + return rc; +} + +/* +** If it is currently unknown whether or not the FTS table has an %_stat +** table (if p->bHasStat==2), attempt to determine this (set p->bHasStat +** to 0 or 1). Return SQLITE_OK if successful, or an SQLite error code +** if an error occurs. +*/ +static int fts3SetHasStat(Fts3Table *p){ + int rc = SQLITE_OK; + if( p->bHasStat==2 ){ + const char *zFmt ="SELECT 1 FROM %Q.sqlite_master WHERE tbl_name='%q_stat'"; + char *zSql = sqlite3_mprintf(zFmt, p->zDb, p->zName); + if( zSql ){ + sqlite3_stmt *pStmt = 0; + rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); + if( rc==SQLITE_OK ){ + int bHasStat = (sqlite3_step(pStmt)==SQLITE_ROW); + rc = sqlite3_finalize(pStmt); + if( rc==SQLITE_OK ) p->bHasStat = bHasStat; + } + sqlite3_free(zSql); + }else{ + rc = SQLITE_NOMEM; + } + } + return rc; +} + +/* +** Implementation of xBegin() method. +*/ +static int fts3BeginMethod(sqlite3_vtab *pVtab){ + Fts3Table *p = (Fts3Table*)pVtab; + UNUSED_PARAMETER(pVtab); + assert( p->pSegments==0 ); + assert( p->nPendingData==0 ); + assert( p->inTransaction!=1 ); + TESTONLY( p->inTransaction = 1 ); + TESTONLY( p->mxSavepoint = -1; ); + p->nLeafAdd = 0; + return fts3SetHasStat(p); +} + +/* +** 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 int fts3CommitMethod(sqlite3_vtab *pVtab){ + TESTONLY( Fts3Table *p = (Fts3Table*)pVtab ); + UNUSED_PARAMETER(pVtab); + assert( p->nPendingData==0 ); + assert( p->inTransaction!=0 ); + assert( p->pSegments==0 ); + TESTONLY( p->inTransaction = 0 ); + TESTONLY( p->mxSavepoint = -1; ); + return SQLITE_OK; +} + +/* +** Implementation of xRollback(). Discard the contents of the pending-terms +** hash-table. Any changes made to the database are reverted by SQLite. +*/ +static int fts3RollbackMethod(sqlite3_vtab *pVtab){ + Fts3Table *p = (Fts3Table*)pVtab; + sqlite3Fts3PendingTermsClear(p); + assert( p->inTransaction!=0 ); + TESTONLY( p->inTransaction = 0 ); + TESTONLY( p->mxSavepoint = -1; ); + return SQLITE_OK; +} + +/* +** When called, *ppPoslist must point to the byte immediately following the +** end of a position-list. i.e. ( (*ppPoslist)[-1]==POS_END ). This function +** moves *ppPoslist so that it instead points to the first byte of the +** same position list. +*/ +static void fts3ReversePoslist(char *pStart, char **ppPoslist){ + char *p = &(*ppPoslist)[-2]; + char c = 0; + + /* Skip backwards passed any trailing 0x00 bytes added by NearTrim() */ + while( p>pStart && (c=*p--)==0 ); + + /* Search backwards for a varint with value zero (the end of the previous + ** poslist). This is an 0x00 byte preceded by some byte that does not + ** have the 0x80 bit set. */ + while( p>pStart && (*p & 0x80) | c ){ + c = *p--; + } + assert( p==pStart || c==0 ); + + /* At this point p points to that preceding byte without the 0x80 bit + ** set. So to find the start of the poslist, skip forward 2 bytes then + ** over a varint. + ** + ** Normally. The other case is that p==pStart and the poslist to return + ** is the first in the doclist. In this case do not skip forward 2 bytes. + ** The second part of the if condition (c==0 && *ppPoslist>&p[2]) + ** is required for cases where the first byte of a doclist and the + ** doclist is empty. For example, if the first docid is 10, a doclist + ** that begins with: + ** + ** 0x0A 0x00 + */ + if( p>pStart || (c==0 && *ppPoslist>&p[2]) ){ p = &p[2]; } + while( *p++&0x80 ); + *ppPoslist = p; +} + +/* +** Helper function used by the implementation of the overloaded snippet(), +** offsets() and optimize() SQL functions. +** +** If the value passed as the third argument is a blob of size +** sizeof(Fts3Cursor*), then the blob contents are copied to the +** output variable *ppCsr and SQLITE_OK is returned. Otherwise, an error +** message is written to context pContext and SQLITE_ERROR returned. The +** string passed via zFunc is used as part of the error message. +*/ +static int fts3FunctionArg( + sqlite3_context *pContext, /* SQL function call context */ + const char *zFunc, /* Function name */ + sqlite3_value *pVal, /* argv[0] passed to function */ + Fts3Cursor **ppCsr /* OUT: Store cursor handle here */ +){ + Fts3Cursor *pRet; + if( sqlite3_value_type(pVal)!=SQLITE_BLOB + || sqlite3_value_bytes(pVal)!=sizeof(Fts3Cursor *) + ){ + char *zErr = sqlite3_mprintf("illegal first argument to %s", zFunc); + sqlite3_result_error(pContext, zErr, -1); + sqlite3_free(zErr); + return SQLITE_ERROR; + } + memcpy(&pRet, sqlite3_value_blob(pVal), sizeof(Fts3Cursor *)); + *ppCsr = pRet; + return SQLITE_OK; +} + +/* +** Implementation of the snippet() function for FTS3 +*/ +static void fts3SnippetFunc( + 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 = 15; /* Default number of tokens in snippet */ + + /* 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( nToken==0 ){ + sqlite3_result_text(pContext, "", -1, SQLITE_STATIC); + }else if( SQLITE_OK==fts3CursorSeek(pContext, pCsr) ){ + sqlite3Fts3Snippet(pContext, pCsr, zStart, zEnd, zEllipsis, iCol, nToken); + } +} + +/* +** Implementation of the offsets() function for FTS3 +*/ +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); + } +} + +/* +** Implementation of the special optimize() function for FTS3. This +** function merges all segments in the database to a single segment. +** Example usage is: +** +** SELECT optimize(t) FROM t LIMIT 1; +** +** where 't' is the name of an FTS3 table. +*/ +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; + } +} + +/* +** Implementation of the matchinfo() function for FTS3 +*/ +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] */ + assert( nVal==1 || nVal==2 ); + if( SQLITE_OK==fts3FunctionArg(pContext, "matchinfo", apVal[0], &pCsr) ){ + const char *zArg = 0; + if( nVal>1 ){ + zArg = (const char *)sqlite3_value_text(apVal[1]); + } + sqlite3Fts3Matchinfo(pContext, pCsr, zArg); + } +} + +/* +** This routine implements the xFindFunction method for the FTS3 +** virtual table. +*/ +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 }, + { "offsets", fts3OffsetsFunc }, + { "optimize", fts3OptimizeFunc }, + { "matchinfo", fts3MatchinfoFunc }, + }; + int i; /* Iterator variable */ + + UNUSED_PARAMETER(pVtab); + UNUSED_PARAMETER(nArg); + UNUSED_PARAMETER(ppArg); + + for(i=0; idb; /* Database connection */ + int rc; /* Return Code */ + + /* At this point it must be known if the %_stat table exists or not. + ** So bHasStat may not be 2. */ + rc = fts3SetHasStat(p); + + /* As it happens, the pending terms table is always empty here. This is + ** because an "ALTER TABLE RENAME TABLE" statement inside a transaction + ** always opens a savepoint transaction. And the xSavepoint() method + ** flushes the pending terms table. But leave the (no-op) call to + ** PendingTermsFlush() in in case that changes. + */ + assert( p->nPendingData==0 ); + if( rc==SQLITE_OK ){ + rc = sqlite3Fts3PendingTermsFlush(p); + } + + if( p->zContentTbl==0 ){ + fts3DbExec(&rc, db, + "ALTER TABLE %Q.'%q_content' RENAME TO '%q_content';", + p->zDb, p->zName, zName + ); + } + + if( p->bHasDocsize ){ + fts3DbExec(&rc, db, + "ALTER TABLE %Q.'%q_docsize' RENAME TO '%q_docsize';", + p->zDb, p->zName, zName + ); + } + if( p->bHasStat ){ + fts3DbExec(&rc, db, + "ALTER TABLE %Q.'%q_stat' RENAME TO '%q_stat';", + p->zDb, p->zName, zName + ); + } + fts3DbExec(&rc, db, + "ALTER TABLE %Q.'%q_segments' RENAME TO '%q_segments';", + p->zDb, p->zName, zName + ); + fts3DbExec(&rc, db, + "ALTER TABLE %Q.'%q_segdir' RENAME TO '%q_segdir';", + p->zDb, p->zName, zName + ); + return rc; +} + +/* +** The xSavepoint() method. +** +** Flush the contents of the pending-terms table to disk. +*/ +static int fts3SavepointMethod(sqlite3_vtab *pVtab, int iSavepoint){ + int rc = SQLITE_OK; + UNUSED_PARAMETER(iSavepoint); + assert( ((Fts3Table *)pVtab)->inTransaction ); + assert( ((Fts3Table *)pVtab)->mxSavepoint < iSavepoint ); + TESTONLY( ((Fts3Table *)pVtab)->mxSavepoint = iSavepoint ); + if( ((Fts3Table *)pVtab)->bIgnoreSavepoint==0 ){ + rc = fts3SyncMethod(pVtab); + } + return rc; +} + +/* +** The xRelease() method. +** +** This is a no-op. +*/ +static int fts3ReleaseMethod(sqlite3_vtab *pVtab, int iSavepoint){ + TESTONLY( Fts3Table *p = (Fts3Table*)pVtab ); + UNUSED_PARAMETER(iSavepoint); + UNUSED_PARAMETER(pVtab); + assert( p->inTransaction ); + assert( p->mxSavepoint >= iSavepoint ); + TESTONLY( p->mxSavepoint = iSavepoint-1 ); + return SQLITE_OK; +} + +/* +** The xRollbackTo() method. +** +** Discard the contents of the pending terms table. +*/ +static int fts3RollbackToMethod(sqlite3_vtab *pVtab, int iSavepoint){ + Fts3Table *p = (Fts3Table*)pVtab; + UNUSED_PARAMETER(iSavepoint); + assert( p->inTransaction ); + assert( p->mxSavepoint >= iSavepoint ); + TESTONLY( p->mxSavepoint = iSavepoint ); + sqlite3Fts3PendingTermsClear(p); + return SQLITE_OK; +} + +static const sqlite3_module fts3Module = { + /* iVersion */ 2, + /* xCreate */ fts3CreateMethod, + /* xConnect */ fts3ConnectMethod, + /* xBestIndex */ fts3BestIndexMethod, + /* xDisconnect */ fts3DisconnectMethod, + /* xDestroy */ fts3DestroyMethod, + /* xOpen */ fts3OpenMethod, + /* xClose */ fts3CloseMethod, + /* xFilter */ fts3FilterMethod, + /* xNext */ fts3NextMethod, + /* xEof */ fts3EofMethod, + /* xColumn */ fts3ColumnMethod, + /* xRowid */ fts3RowidMethod, + /* xUpdate */ fts3UpdateMethod, + /* xBegin */ fts3BeginMethod, + /* xSync */ fts3SyncMethod, + /* xCommit */ fts3CommitMethod, + /* xRollback */ fts3RollbackMethod, + /* xFindFunction */ fts3FindFunctionMethod, + /* xRename */ fts3RenameMethod, + /* xSavepoint */ fts3SavepointMethod, + /* xRelease */ fts3ReleaseMethod, + /* xRollbackTo */ fts3RollbackToMethod, +}; + +/* +** 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); +} + +/* +** The fts3 built-in tokenizers - "simple", "porter" and "icu"- are +** implemented in files fts3_tokenizer1.c, fts3_porter.c and fts3_icu.c +** respectively. The following three forward declarations are for functions +** declared in these files used to retrieve the respective implementations. +** +** Calling sqlite3Fts3SimpleTokenizerModule() sets the value pointed +** to by the argument to point to the "simple" tokenizer implementation. +** And so on. +*/ +SQLITE_PRIVATE void sqlite3Fts3SimpleTokenizerModule(sqlite3_tokenizer_module const**ppModule); +SQLITE_PRIVATE void sqlite3Fts3PorterTokenizerModule(sqlite3_tokenizer_module const**ppModule); +#ifndef SQLITE_DISABLE_FTS3_UNICODE +SQLITE_PRIVATE void sqlite3Fts3UnicodeTokenizer(sqlite3_tokenizer_module const**ppModule); +#endif +#ifdef SQLITE_ENABLE_ICU +SQLITE_PRIVATE void sqlite3Fts3IcuTokenizerModule(sqlite3_tokenizer_module const**ppModule); +#endif + +/* +** Initialize 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; +#ifndef SQLITE_DISABLE_FTS3_UNICODE + const sqlite3_tokenizer_module *pUnicode = 0; +#endif + +#ifdef SQLITE_ENABLE_ICU + const sqlite3_tokenizer_module *pIcu = 0; + sqlite3Fts3IcuTokenizerModule(&pIcu); +#endif + +#ifndef SQLITE_DISABLE_FTS3_UNICODE + sqlite3Fts3UnicodeTokenizer(&pUnicode); +#endif + +#ifdef SQLITE_TEST + rc = sqlite3Fts3InitTerm(db); + if( rc!=SQLITE_OK ) return rc; +#endif + + rc = sqlite3Fts3InitAux(db); + if( rc!=SQLITE_OK ) return rc; + + sqlite3Fts3SimpleTokenizerModule(&pSimple); + sqlite3Fts3PorterTokenizerModule(&pPorter); + + /* Allocate and initialize the hash-table used to store tokenizers. */ + pHash = sqlite3_malloc(sizeof(Fts3Hash)); + if( !pHash ){ + rc = SQLITE_NOMEM; + }else{ + sqlite3Fts3HashInit(pHash, FTS3_HASH_STRING, 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) + +#ifndef SQLITE_DISABLE_FTS3_UNICODE + || sqlite3Fts3HashInsert(pHash, "unicode61", 10, (void *)pUnicode) +#endif +#ifdef SQLITE_ENABLE_ICU + || (pIcu && sqlite3Fts3HashInsert(pHash, "icu", 4, (void *)pIcu)) +#endif + ){ + rc = SQLITE_NOMEM; + } + } + +#ifdef SQLITE_TEST + if( rc==SQLITE_OK ){ + rc = 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, "matchinfo", 1)) + && SQLITE_OK==(rc = sqlite3_overload_function(db, "matchinfo", 2)) + && SQLITE_OK==(rc = sqlite3_overload_function(db, "optimize", 1)) + ){ + rc = sqlite3_create_module_v2( + db, "fts3", &fts3Module, (void *)pHash, hashDestroy + ); + if( rc==SQLITE_OK ){ + rc = sqlite3_create_module_v2( + db, "fts4", &fts3Module, (void *)pHash, 0 + ); + } + if( rc==SQLITE_OK ){ + rc = sqlite3Fts3InitTok(db, (void *)pHash); + } + return rc; + } + + + /* 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; +} + +/* +** Allocate an Fts3MultiSegReader for each token in the expression headed +** by pExpr. +** +** An Fts3SegReader object is a cursor that can seek or scan a range of +** entries within a single segment b-tree. An Fts3MultiSegReader uses multiple +** Fts3SegReader objects internally to provide an interface to seek or scan +** within the union of all segments of a b-tree. Hence the name. +** +** If the allocated Fts3MultiSegReader just seeks to a single entry in a +** segment b-tree (if the term is not a prefix or it is a prefix for which +** there exists prefix b-tree of the right length) then it may be traversed +** and merged incrementally. Otherwise, it has to be merged into an in-memory +** doclist and then traversed. +*/ +static void fts3EvalAllocateReaders( + Fts3Cursor *pCsr, /* FTS cursor handle */ + Fts3Expr *pExpr, /* Allocate readers for this expression */ + int *pnToken, /* OUT: Total number of tokens in phrase. */ + int *pnOr, /* OUT: Total number of OR nodes in expr. */ + int *pRc /* IN/OUT: Error code */ +){ + if( pExpr && SQLITE_OK==*pRc ){ + if( pExpr->eType==FTSQUERY_PHRASE ){ + int i; + int nToken = pExpr->pPhrase->nToken; + *pnToken += nToken; + for(i=0; ipPhrase->aToken[i]; + int rc = fts3TermSegReaderCursor(pCsr, + pToken->z, pToken->n, pToken->isPrefix, &pToken->pSegcsr + ); + if( rc!=SQLITE_OK ){ + *pRc = rc; + return; + } + } + assert( pExpr->pPhrase->iDoclistToken==0 ); + pExpr->pPhrase->iDoclistToken = -1; + }else{ + *pnOr += (pExpr->eType==FTSQUERY_OR); + fts3EvalAllocateReaders(pCsr, pExpr->pLeft, pnToken, pnOr, pRc); + fts3EvalAllocateReaders(pCsr, pExpr->pRight, pnToken, pnOr, pRc); + } + } +} + +/* +** Arguments pList/nList contain the doclist for token iToken of phrase p. +** It is merged into the main doclist stored in p->doclist.aAll/nAll. +** +** This function assumes that pList points to a buffer allocated using +** sqlite3_malloc(). This function takes responsibility for eventually +** freeing the buffer. +** +** SQLITE_OK is returned if successful, or SQLITE_NOMEM if an error occurs. +*/ +static int fts3EvalPhraseMergeToken( + Fts3Table *pTab, /* FTS Table pointer */ + Fts3Phrase *p, /* Phrase to merge pList/nList into */ + int iToken, /* Token pList/nList corresponds to */ + char *pList, /* Pointer to doclist */ + int nList /* Number of bytes in pList */ +){ + int rc = SQLITE_OK; + assert( iToken!=p->iDoclistToken ); + + if( pList==0 ){ + sqlite3_free(p->doclist.aAll); + p->doclist.aAll = 0; + p->doclist.nAll = 0; + } + + else if( p->iDoclistToken<0 ){ + p->doclist.aAll = pList; + p->doclist.nAll = nList; + } + + else if( p->doclist.aAll==0 ){ + sqlite3_free(pList); + } + + else { + char *pLeft; + char *pRight; + int nLeft; + int nRight; + int nDiff; + + if( p->iDoclistTokendoclist.aAll; + nLeft = p->doclist.nAll; + pRight = pList; + nRight = nList; + nDiff = iToken - p->iDoclistToken; + }else{ + pRight = p->doclist.aAll; + nRight = p->doclist.nAll; + pLeft = pList; + nLeft = nList; + nDiff = p->iDoclistToken - iToken; + } + + rc = fts3DoclistPhraseMerge( + pTab->bDescIdx, nDiff, pLeft, nLeft, &pRight, &nRight + ); + sqlite3_free(pLeft); + p->doclist.aAll = pRight; + p->doclist.nAll = nRight; + } + + if( iToken>p->iDoclistToken ) p->iDoclistToken = iToken; + return rc; +} + +/* +** Load the doclist for phrase p into p->doclist.aAll/nAll. The loaded doclist +** does not take deferred tokens into account. +** +** SQLITE_OK is returned if no error occurs, otherwise an SQLite error code. +*/ +static int fts3EvalPhraseLoad( + Fts3Cursor *pCsr, /* FTS Cursor handle */ + Fts3Phrase *p /* Phrase object */ +){ + Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab; + int iToken; + int rc = SQLITE_OK; + + for(iToken=0; rc==SQLITE_OK && iTokennToken; iToken++){ + Fts3PhraseToken *pToken = &p->aToken[iToken]; + assert( pToken->pDeferred==0 || pToken->pSegcsr==0 ); + + if( pToken->pSegcsr ){ + int nThis = 0; + char *pThis = 0; + rc = fts3TermSelect(pTab, pToken, p->iColumn, &nThis, &pThis); + if( rc==SQLITE_OK ){ + rc = fts3EvalPhraseMergeToken(pTab, p, iToken, pThis, nThis); + } + } + assert( pToken->pSegcsr==0 ); + } + + return rc; +} + +/* +** This function is called on each phrase after the position lists for +** any deferred tokens have been loaded into memory. It updates the phrases +** current position list to include only those positions that are really +** instances of the phrase (after considering deferred tokens). If this +** means that the phrase does not appear in the current row, doclist.pList +** and doclist.nList are both zeroed. +** +** SQLITE_OK is returned if no error occurs, otherwise an SQLite error code. +*/ +static int fts3EvalDeferredPhrase(Fts3Cursor *pCsr, Fts3Phrase *pPhrase){ + int iToken; /* Used to iterate through phrase tokens */ + char *aPoslist = 0; /* Position list for deferred tokens */ + int nPoslist = 0; /* Number of bytes in aPoslist */ + int iPrev = -1; /* Token number of previous deferred token */ + + assert( pPhrase->doclist.bFreeList==0 ); + + for(iToken=0; iTokennToken; iToken++){ + Fts3PhraseToken *pToken = &pPhrase->aToken[iToken]; + Fts3DeferredToken *pDeferred = pToken->pDeferred; + + if( pDeferred ){ + char *pList; + int nList; + int rc = sqlite3Fts3DeferredTokenList(pDeferred, &pList, &nList); + if( rc!=SQLITE_OK ) return rc; + + if( pList==0 ){ + sqlite3_free(aPoslist); + pPhrase->doclist.pList = 0; + pPhrase->doclist.nList = 0; + return SQLITE_OK; + + }else if( aPoslist==0 ){ + aPoslist = pList; + nPoslist = nList; + + }else{ + char *aOut = pList; + char *p1 = aPoslist; + char *p2 = aOut; + + assert( iPrev>=0 ); + fts3PoslistPhraseMerge(&aOut, iToken-iPrev, 0, 1, &p1, &p2); + sqlite3_free(aPoslist); + aPoslist = pList; + nPoslist = (int)(aOut - aPoslist); + if( nPoslist==0 ){ + sqlite3_free(aPoslist); + pPhrase->doclist.pList = 0; + pPhrase->doclist.nList = 0; + return SQLITE_OK; + } + } + iPrev = iToken; + } + } + + if( iPrev>=0 ){ + int nMaxUndeferred = pPhrase->iDoclistToken; + if( nMaxUndeferred<0 ){ + pPhrase->doclist.pList = aPoslist; + pPhrase->doclist.nList = nPoslist; + pPhrase->doclist.iDocid = pCsr->iPrevId; + pPhrase->doclist.bFreeList = 1; + }else{ + int nDistance; + char *p1; + char *p2; + char *aOut; + + if( nMaxUndeferred>iPrev ){ + p1 = aPoslist; + p2 = pPhrase->doclist.pList; + nDistance = nMaxUndeferred - iPrev; + }else{ + p1 = pPhrase->doclist.pList; + p2 = aPoslist; + nDistance = iPrev - nMaxUndeferred; + } + + aOut = (char *)sqlite3_malloc(nPoslist+8); + if( !aOut ){ + sqlite3_free(aPoslist); + return SQLITE_NOMEM; + } + + pPhrase->doclist.pList = aOut; + if( fts3PoslistPhraseMerge(&aOut, nDistance, 0, 1, &p1, &p2) ){ + pPhrase->doclist.bFreeList = 1; + pPhrase->doclist.nList = (int)(aOut - pPhrase->doclist.pList); + }else{ + sqlite3_free(aOut); + pPhrase->doclist.pList = 0; + pPhrase->doclist.nList = 0; + } + sqlite3_free(aPoslist); + } + } + + return SQLITE_OK; +} + +/* +** Maximum number of tokens a phrase may have to be considered for the +** incremental doclists strategy. +*/ +#define MAX_INCR_PHRASE_TOKENS 4 + +/* +** This function is called for each Fts3Phrase in a full-text query +** expression to initialize the mechanism for returning rows. Once this +** function has been called successfully on an Fts3Phrase, it may be +** used with fts3EvalPhraseNext() to iterate through the matching docids. +** +** If parameter bOptOk is true, then the phrase may (or may not) use the +** incremental loading strategy. Otherwise, the entire doclist is loaded into +** memory within this call. +** +** SQLITE_OK is returned if no error occurs, otherwise an SQLite error code. +*/ +static int fts3EvalPhraseStart(Fts3Cursor *pCsr, int bOptOk, Fts3Phrase *p){ + Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab; + int rc = SQLITE_OK; /* Error code */ + int i; + + /* Determine if doclists may be loaded from disk incrementally. This is + ** possible if the bOptOk argument is true, the FTS doclists will be + ** scanned in forward order, and the phrase consists of + ** MAX_INCR_PHRASE_TOKENS or fewer tokens, none of which are are "^first" + ** tokens or prefix tokens that cannot use a prefix-index. */ + int bHaveIncr = 0; + int bIncrOk = (bOptOk + && pCsr->bDesc==pTab->bDescIdx + && p->nToken<=MAX_INCR_PHRASE_TOKENS && p->nToken>0 +#ifdef SQLITE_TEST + && pTab->bNoIncrDoclist==0 +#endif + ); + for(i=0; bIncrOk==1 && inToken; i++){ + Fts3PhraseToken *pToken = &p->aToken[i]; + if( pToken->bFirst || (pToken->pSegcsr!=0 && !pToken->pSegcsr->bLookup) ){ + bIncrOk = 0; + } + if( pToken->pSegcsr ) bHaveIncr = 1; + } + + if( bIncrOk && bHaveIncr ){ + /* Use the incremental approach. */ + int iCol = (p->iColumn >= pTab->nColumn ? -1 : p->iColumn); + for(i=0; rc==SQLITE_OK && inToken; i++){ + Fts3PhraseToken *pToken = &p->aToken[i]; + Fts3MultiSegReader *pSegcsr = pToken->pSegcsr; + if( pSegcsr ){ + rc = sqlite3Fts3MsrIncrStart(pTab, pSegcsr, iCol, pToken->z, pToken->n); + } + } + p->bIncr = 1; + }else{ + /* Load the full doclist for the phrase into memory. */ + rc = fts3EvalPhraseLoad(pCsr, p); + p->bIncr = 0; + } + + assert( rc!=SQLITE_OK || p->nToken<1 || p->aToken[0].pSegcsr==0 || p->bIncr ); + return rc; +} + +/* +** This function is used to iterate backwards (from the end to start) +** through doclists. It is used by this module to iterate through phrase +** doclists in reverse and by the fts3_write.c module to iterate through +** pending-terms lists when writing to databases with "order=desc". +** +** The doclist may be sorted in ascending (parameter bDescIdx==0) or +** descending (parameter bDescIdx==1) order of docid. Regardless, this +** function iterates from the end of the doclist to the beginning. +*/ +SQLITE_PRIVATE void sqlite3Fts3DoclistPrev( + int bDescIdx, /* True if the doclist is desc */ + char *aDoclist, /* Pointer to entire doclist */ + int nDoclist, /* Length of aDoclist in bytes */ + char **ppIter, /* IN/OUT: Iterator pointer */ + sqlite3_int64 *piDocid, /* IN/OUT: Docid pointer */ + int *pnList, /* OUT: List length pointer */ + u8 *pbEof /* OUT: End-of-file flag */ +){ + char *p = *ppIter; + + assert( nDoclist>0 ); + assert( *pbEof==0 ); + assert( p || *piDocid==0 ); + assert( !p || (p>aDoclist && p<&aDoclist[nDoclist]) ); + + if( p==0 ){ + sqlite3_int64 iDocid = 0; + char *pNext = 0; + char *pDocid = aDoclist; + char *pEnd = &aDoclist[nDoclist]; + int iMul = 1; + + while( pDocid0 ); + assert( *pbEof==0 ); + assert( p || *piDocid==0 ); + assert( !p || (p>=aDoclist && p<=&aDoclist[nDoclist]) ); + + if( p==0 ){ + p = aDoclist; + p += sqlite3Fts3GetVarint(p, piDocid); + }else{ + fts3PoslistCopy(0, &p); + while( p<&aDoclist[nDoclist] && *p==0 ) p++; + if( p>=&aDoclist[nDoclist] ){ + *pbEof = 1; + }else{ + sqlite3_int64 iVar; + p += sqlite3Fts3GetVarint(p, &iVar); + *piDocid += ((bDescIdx ? -1 : 1) * iVar); + } + } + + *ppIter = p; +} + +/* +** Advance the iterator pDL to the next entry in pDL->aAll/nAll. Set *pbEof +** to true if EOF is reached. +*/ +static void fts3EvalDlPhraseNext( + Fts3Table *pTab, + Fts3Doclist *pDL, + u8 *pbEof +){ + char *pIter; /* Used to iterate through aAll */ + char *pEnd = &pDL->aAll[pDL->nAll]; /* 1 byte past end of aAll */ + + if( pDL->pNextDocid ){ + pIter = pDL->pNextDocid; + }else{ + pIter = pDL->aAll; + } + + if( pIter>=pEnd ){ + /* We have already reached the end of this doclist. EOF. */ + *pbEof = 1; + }else{ + sqlite3_int64 iDelta; + pIter += sqlite3Fts3GetVarint(pIter, &iDelta); + if( pTab->bDescIdx==0 || pDL->pNextDocid==0 ){ + pDL->iDocid += iDelta; + }else{ + pDL->iDocid -= iDelta; + } + pDL->pList = pIter; + fts3PoslistCopy(0, &pIter); + pDL->nList = (int)(pIter - pDL->pList); + + /* pIter now points just past the 0x00 that terminates the position- + ** list for document pDL->iDocid. However, if this position-list was + ** edited in place by fts3EvalNearTrim(), then pIter may not actually + ** point to the start of the next docid value. The following line deals + ** with this case by advancing pIter past the zero-padding added by + ** fts3EvalNearTrim(). */ + while( pIterpNextDocid = pIter; + assert( pIter>=&pDL->aAll[pDL->nAll] || *pIter ); + *pbEof = 0; + } +} + +/* +** Helper type used by fts3EvalIncrPhraseNext() and incrPhraseTokenNext(). +*/ +typedef struct TokenDoclist TokenDoclist; +struct TokenDoclist { + int bIgnore; + sqlite3_int64 iDocid; + char *pList; + int nList; +}; + +/* +** Token pToken is an incrementally loaded token that is part of a +** multi-token phrase. Advance it to the next matching document in the +** database and populate output variable *p with the details of the new +** entry. Or, if the iterator has reached EOF, set *pbEof to true. +** +** If an error occurs, return an SQLite error code. Otherwise, return +** SQLITE_OK. +*/ +static int incrPhraseTokenNext( + Fts3Table *pTab, /* Virtual table handle */ + Fts3Phrase *pPhrase, /* Phrase to advance token of */ + int iToken, /* Specific token to advance */ + TokenDoclist *p, /* OUT: Docid and doclist for new entry */ + u8 *pbEof /* OUT: True if iterator is at EOF */ +){ + int rc = SQLITE_OK; + + if( pPhrase->iDoclistToken==iToken ){ + assert( p->bIgnore==0 ); + assert( pPhrase->aToken[iToken].pSegcsr==0 ); + fts3EvalDlPhraseNext(pTab, &pPhrase->doclist, pbEof); + p->pList = pPhrase->doclist.pList; + p->nList = pPhrase->doclist.nList; + p->iDocid = pPhrase->doclist.iDocid; + }else{ + Fts3PhraseToken *pToken = &pPhrase->aToken[iToken]; + assert( pToken->pDeferred==0 ); + assert( pToken->pSegcsr || pPhrase->iDoclistToken>=0 ); + if( pToken->pSegcsr ){ + assert( p->bIgnore==0 ); + rc = sqlite3Fts3MsrIncrNext( + pTab, pToken->pSegcsr, &p->iDocid, &p->pList, &p->nList + ); + if( p->pList==0 ) *pbEof = 1; + }else{ + p->bIgnore = 1; + } + } + + return rc; +} + + +/* +** The phrase iterator passed as the second argument: +** +** * features at least one token that uses an incremental doclist, and +** +** * does not contain any deferred tokens. +** +** Advance it to the next matching documnent in the database and populate +** the Fts3Doclist.pList and nList fields. +** +** If there is no "next" entry and no error occurs, then *pbEof is set to +** 1 before returning. Otherwise, if no error occurs and the iterator is +** successfully advanced, *pbEof is set to 0. +** +** If an error occurs, return an SQLite error code. Otherwise, return +** SQLITE_OK. +*/ +static int fts3EvalIncrPhraseNext( + Fts3Cursor *pCsr, /* FTS Cursor handle */ + Fts3Phrase *p, /* Phrase object to advance to next docid */ + u8 *pbEof /* OUT: Set to 1 if EOF */ +){ + int rc = SQLITE_OK; + Fts3Doclist *pDL = &p->doclist; + Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab; + u8 bEof = 0; + + /* This is only called if it is guaranteed that the phrase has at least + ** one incremental token. In which case the bIncr flag is set. */ + assert( p->bIncr==1 ); + + if( p->nToken==1 && p->bIncr ){ + rc = sqlite3Fts3MsrIncrNext(pTab, p->aToken[0].pSegcsr, + &pDL->iDocid, &pDL->pList, &pDL->nList + ); + if( pDL->pList==0 ) bEof = 1; + }else{ + int bDescDoclist = pCsr->bDesc; + struct TokenDoclist a[MAX_INCR_PHRASE_TOKENS]; + + memset(a, 0, sizeof(a)); + assert( p->nToken<=MAX_INCR_PHRASE_TOKENS ); + assert( p->iDoclistTokennToken && bEof==0; i++){ + rc = incrPhraseTokenNext(pTab, p, i, &a[i], &bEof); + if( a[i].bIgnore==0 && (bMaxSet==0 || DOCID_CMP(iMax, a[i].iDocid)<0) ){ + iMax = a[i].iDocid; + bMaxSet = 1; + } + } + assert( rc!=SQLITE_OK || (p->nToken>=1 && a[p->nToken-1].bIgnore==0) ); + assert( rc!=SQLITE_OK || bMaxSet ); + + /* Keep advancing iterators until they all point to the same document */ + for(i=0; inToken; i++){ + while( rc==SQLITE_OK && bEof==0 + && a[i].bIgnore==0 && DOCID_CMP(a[i].iDocid, iMax)<0 + ){ + rc = incrPhraseTokenNext(pTab, p, i, &a[i], &bEof); + if( DOCID_CMP(a[i].iDocid, iMax)>0 ){ + iMax = a[i].iDocid; + i = 0; + } + } + } + + /* Check if the current entries really are a phrase match */ + if( bEof==0 ){ + int nList = 0; + int nByte = a[p->nToken-1].nList; + char *aDoclist = sqlite3_malloc(nByte+1); + if( !aDoclist ) return SQLITE_NOMEM; + memcpy(aDoclist, a[p->nToken-1].pList, nByte+1); + + for(i=0; i<(p->nToken-1); i++){ + if( a[i].bIgnore==0 ){ + char *pL = a[i].pList; + char *pR = aDoclist; + char *pOut = aDoclist; + int nDist = p->nToken-1-i; + int res = fts3PoslistPhraseMerge(&pOut, nDist, 0, 1, &pL, &pR); + if( res==0 ) break; + nList = (int)(pOut - aDoclist); + } + } + if( i==(p->nToken-1) ){ + pDL->iDocid = iMax; + pDL->pList = aDoclist; + pDL->nList = nList; + pDL->bFreeList = 1; + break; + } + sqlite3_free(aDoclist); + } + } + } + + *pbEof = bEof; + return rc; +} + +/* +** Attempt to move the phrase iterator to point to the next matching docid. +** If an error occurs, return an SQLite error code. Otherwise, return +** SQLITE_OK. +** +** If there is no "next" entry and no error occurs, then *pbEof is set to +** 1 before returning. Otherwise, if no error occurs and the iterator is +** successfully advanced, *pbEof is set to 0. +*/ +static int fts3EvalPhraseNext( + Fts3Cursor *pCsr, /* FTS Cursor handle */ + Fts3Phrase *p, /* Phrase object to advance to next docid */ + u8 *pbEof /* OUT: Set to 1 if EOF */ +){ + int rc = SQLITE_OK; + Fts3Doclist *pDL = &p->doclist; + Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab; + + if( p->bIncr ){ + rc = fts3EvalIncrPhraseNext(pCsr, p, pbEof); + }else if( pCsr->bDesc!=pTab->bDescIdx && pDL->nAll ){ + sqlite3Fts3DoclistPrev(pTab->bDescIdx, pDL->aAll, pDL->nAll, + &pDL->pNextDocid, &pDL->iDocid, &pDL->nList, pbEof + ); + pDL->pList = pDL->pNextDocid; + }else{ + fts3EvalDlPhraseNext(pTab, pDL, pbEof); + } + + return rc; +} + +/* +** +** If *pRc is not SQLITE_OK when this function is called, it is a no-op. +** Otherwise, fts3EvalPhraseStart() is called on all phrases within the +** expression. Also the Fts3Expr.bDeferred variable is set to true for any +** expressions for which all descendent tokens are deferred. +** +** If parameter bOptOk is zero, then it is guaranteed that the +** Fts3Phrase.doclist.aAll/nAll variables contain the entire doclist for +** each phrase in the expression (subject to deferred token processing). +** Or, if bOptOk is non-zero, then one or more tokens within the expression +** may be loaded incrementally, meaning doclist.aAll/nAll is not available. +** +** If an error occurs within this function, *pRc is set to an SQLite error +** code before returning. +*/ +static void fts3EvalStartReaders( + Fts3Cursor *pCsr, /* FTS Cursor handle */ + Fts3Expr *pExpr, /* Expression to initialize phrases in */ + int *pRc /* IN/OUT: Error code */ +){ + if( pExpr && SQLITE_OK==*pRc ){ + if( pExpr->eType==FTSQUERY_PHRASE ){ + int nToken = pExpr->pPhrase->nToken; + if( nToken ){ + int i; + for(i=0; ipPhrase->aToken[i].pDeferred==0 ) break; + } + pExpr->bDeferred = (i==nToken); + } + *pRc = fts3EvalPhraseStart(pCsr, 1, pExpr->pPhrase); + }else{ + fts3EvalStartReaders(pCsr, pExpr->pLeft, pRc); + fts3EvalStartReaders(pCsr, pExpr->pRight, pRc); + pExpr->bDeferred = (pExpr->pLeft->bDeferred && pExpr->pRight->bDeferred); + } + } +} + +/* +** An array of the following structures is assembled as part of the process +** of selecting tokens to defer before the query starts executing (as part +** of the xFilter() method). There is one element in the array for each +** token in the FTS expression. +** +** Tokens are divided into AND/NEAR clusters. All tokens in a cluster belong +** to phrases that are connected only by AND and NEAR operators (not OR or +** NOT). When determining tokens to defer, each AND/NEAR cluster is considered +** separately. The root of a tokens AND/NEAR cluster is stored in +** Fts3TokenAndCost.pRoot. +*/ +typedef struct Fts3TokenAndCost Fts3TokenAndCost; +struct Fts3TokenAndCost { + Fts3Phrase *pPhrase; /* The phrase the token belongs to */ + int iToken; /* Position of token in phrase */ + Fts3PhraseToken *pToken; /* The token itself */ + Fts3Expr *pRoot; /* Root of NEAR/AND cluster */ + int nOvfl; /* Number of overflow pages to load doclist */ + int iCol; /* The column the token must match */ +}; + +/* +** This function is used to populate an allocated Fts3TokenAndCost array. +** +** If *pRc is not SQLITE_OK when this function is called, it is a no-op. +** Otherwise, if an error occurs during execution, *pRc is set to an +** SQLite error code. +*/ +static void fts3EvalTokenCosts( + Fts3Cursor *pCsr, /* FTS Cursor handle */ + Fts3Expr *pRoot, /* Root of current AND/NEAR cluster */ + Fts3Expr *pExpr, /* Expression to consider */ + Fts3TokenAndCost **ppTC, /* Write new entries to *(*ppTC)++ */ + Fts3Expr ***ppOr, /* Write new OR root to *(*ppOr)++ */ + int *pRc /* IN/OUT: Error code */ +){ + if( *pRc==SQLITE_OK ){ + if( pExpr->eType==FTSQUERY_PHRASE ){ + Fts3Phrase *pPhrase = pExpr->pPhrase; + int i; + for(i=0; *pRc==SQLITE_OK && inToken; i++){ + Fts3TokenAndCost *pTC = (*ppTC)++; + pTC->pPhrase = pPhrase; + pTC->iToken = i; + pTC->pRoot = pRoot; + pTC->pToken = &pPhrase->aToken[i]; + pTC->iCol = pPhrase->iColumn; + *pRc = sqlite3Fts3MsrOvfl(pCsr, pTC->pToken->pSegcsr, &pTC->nOvfl); + } + }else if( pExpr->eType!=FTSQUERY_NOT ){ + assert( pExpr->eType==FTSQUERY_OR + || pExpr->eType==FTSQUERY_AND + || pExpr->eType==FTSQUERY_NEAR + ); + assert( pExpr->pLeft && pExpr->pRight ); + if( pExpr->eType==FTSQUERY_OR ){ + pRoot = pExpr->pLeft; + **ppOr = pRoot; + (*ppOr)++; + } + fts3EvalTokenCosts(pCsr, pRoot, pExpr->pLeft, ppTC, ppOr, pRc); + if( pExpr->eType==FTSQUERY_OR ){ + pRoot = pExpr->pRight; + **ppOr = pRoot; + (*ppOr)++; + } + fts3EvalTokenCosts(pCsr, pRoot, pExpr->pRight, ppTC, ppOr, pRc); + } + } +} + +/* +** Determine the average document (row) size in pages. If successful, +** write this value to *pnPage and return SQLITE_OK. Otherwise, return +** an SQLite error code. +** +** The average document size in pages is calculated by first calculating +** determining the average size in bytes, B. If B is less than the amount +** of data that will fit on a single leaf page of an intkey table in +** this database, then the average docsize is 1. Otherwise, it is 1 plus +** the number of overflow pages consumed by a record B bytes in size. +*/ +static int fts3EvalAverageDocsize(Fts3Cursor *pCsr, int *pnPage){ + if( pCsr->nRowAvg==0 ){ + /* The average document size, which is required to calculate the cost + ** of each doclist, has not yet been determined. Read the required + ** data from the %_stat table to calculate it. + ** + ** Entry 0 of the %_stat table is a blob containing (nCol+1) FTS3 + ** varints, where nCol is the number of columns in the FTS3 table. + ** The first varint is the number of documents currently stored in + ** the table. The following nCol varints contain the total amount of + ** data stored in all rows of each column of the table, from left + ** to right. + */ + int rc; + Fts3Table *p = (Fts3Table*)pCsr->base.pVtab; + sqlite3_stmt *pStmt; + sqlite3_int64 nDoc = 0; + sqlite3_int64 nByte = 0; + const char *pEnd; + const char *a; + + rc = sqlite3Fts3SelectDoctotal(p, &pStmt); + if( rc!=SQLITE_OK ) return rc; + a = sqlite3_column_blob(pStmt, 0); + assert( a ); + + pEnd = &a[sqlite3_column_bytes(pStmt, 0)]; + a += sqlite3Fts3GetVarint(a, &nDoc); + while( anDoc = nDoc; + pCsr->nRowAvg = (int)(((nByte / nDoc) + p->nPgsz) / p->nPgsz); + assert( pCsr->nRowAvg>0 ); + rc = sqlite3_reset(pStmt); + if( rc!=SQLITE_OK ) return rc; + } + + *pnPage = pCsr->nRowAvg; + return SQLITE_OK; +} + +/* +** This function is called to select the tokens (if any) that will be +** deferred. The array aTC[] has already been populated when this is +** called. +** +** This function is called once for each AND/NEAR cluster in the +** expression. Each invocation determines which tokens to defer within +** the cluster with root node pRoot. See comments above the definition +** of struct Fts3TokenAndCost for more details. +** +** If no error occurs, SQLITE_OK is returned and sqlite3Fts3DeferToken() +** called on each token to defer. Otherwise, an SQLite error code is +** returned. +*/ +static int fts3EvalSelectDeferred( + Fts3Cursor *pCsr, /* FTS Cursor handle */ + Fts3Expr *pRoot, /* Consider tokens with this root node */ + Fts3TokenAndCost *aTC, /* Array of expression tokens and costs */ + int nTC /* Number of entries in aTC[] */ +){ + Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab; + int nDocSize = 0; /* Number of pages per doc loaded */ + int rc = SQLITE_OK; /* Return code */ + int ii; /* Iterator variable for various purposes */ + int nOvfl = 0; /* Total overflow pages used by doclists */ + int nToken = 0; /* Total number of tokens in cluster */ + + int nMinEst = 0; /* The minimum count for any phrase so far. */ + int nLoad4 = 1; /* (Phrases that will be loaded)^4. */ + + /* Tokens are never deferred for FTS tables created using the content=xxx + ** option. The reason being that it is not guaranteed that the content + ** table actually contains the same data as the index. To prevent this from + ** causing any problems, the deferred token optimization is completely + ** disabled for content=xxx tables. */ + if( pTab->zContentTbl ){ + return SQLITE_OK; + } + + /* Count the tokens in this AND/NEAR cluster. If none of the doclists + ** associated with the tokens spill onto overflow pages, or if there is + ** only 1 token, exit early. No tokens to defer in this case. */ + for(ii=0; ii0 ); + + + /* Iterate through all tokens in this AND/NEAR cluster, in ascending order + ** of the number of overflow pages that will be loaded by the pager layer + ** to retrieve the entire doclist for the token from the full-text index. + ** Load the doclists for tokens that are either: + ** + ** a. The cheapest token in the entire query (i.e. the one visited by the + ** first iteration of this loop), or + ** + ** b. Part of a multi-token phrase. + ** + ** After each token doclist is loaded, merge it with the others from the + ** same phrase and count the number of documents that the merged doclist + ** contains. Set variable "nMinEst" to the smallest number of documents in + ** any phrase doclist for which 1 or more token doclists have been loaded. + ** Let nOther be the number of other phrases for which it is certain that + ** one or more tokens will not be deferred. + ** + ** Then, for each token, defer it if loading the doclist would result in + ** loading N or more overflow pages into memory, where N is computed as: + ** + ** (nMinEst + 4^nOther - 1) / (4^nOther) + */ + for(ii=0; iinOvfl) + ){ + pTC = &aTC[iTC]; + } + } + assert( pTC ); + + if( ii && pTC->nOvfl>=((nMinEst+(nLoad4/4)-1)/(nLoad4/4))*nDocSize ){ + /* The number of overflow pages to load for this (and therefore all + ** subsequent) tokens is greater than the estimated number of pages + ** that will be loaded if all subsequent tokens are deferred. + */ + Fts3PhraseToken *pToken = pTC->pToken; + rc = sqlite3Fts3DeferToken(pCsr, pToken, pTC->iCol); + fts3SegReaderCursorFree(pToken->pSegcsr); + pToken->pSegcsr = 0; + }else{ + /* Set nLoad4 to the value of (4^nOther) for the next iteration of the + ** for-loop. Except, limit the value to 2^24 to prevent it from + ** overflowing the 32-bit integer it is stored in. */ + if( ii<12 ) nLoad4 = nLoad4*4; + + if( ii==0 || (pTC->pPhrase->nToken>1 && ii!=nToken-1) ){ + /* Either this is the cheapest token in the entire query, or it is + ** part of a multi-token phrase. Either way, the entire doclist will + ** (eventually) be loaded into memory. It may as well be now. */ + Fts3PhraseToken *pToken = pTC->pToken; + int nList = 0; + char *pList = 0; + rc = fts3TermSelect(pTab, pToken, pTC->iCol, &nList, &pList); + assert( rc==SQLITE_OK || pList==0 ); + if( rc==SQLITE_OK ){ + rc = fts3EvalPhraseMergeToken( + pTab, pTC->pPhrase, pTC->iToken,pList,nList + ); + } + if( rc==SQLITE_OK ){ + int nCount; + nCount = fts3DoclistCountDocids( + pTC->pPhrase->doclist.aAll, pTC->pPhrase->doclist.nAll + ); + if( ii==0 || nCountpToken = 0; + } + + return rc; +} + +/* +** This function is called from within the xFilter method. It initializes +** the full-text query currently stored in pCsr->pExpr. To iterate through +** the results of a query, the caller does: +** +** fts3EvalStart(pCsr); +** while( 1 ){ +** fts3EvalNext(pCsr); +** if( pCsr->bEof ) break; +** ... return row pCsr->iPrevId to the caller ... +** } +*/ +static int fts3EvalStart(Fts3Cursor *pCsr){ + Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab; + int rc = SQLITE_OK; + int nToken = 0; + int nOr = 0; + + /* Allocate a MultiSegReader for each token in the expression. */ + fts3EvalAllocateReaders(pCsr, pCsr->pExpr, &nToken, &nOr, &rc); + + /* Determine which, if any, tokens in the expression should be deferred. */ +#ifndef SQLITE_DISABLE_FTS4_DEFERRED + if( rc==SQLITE_OK && nToken>1 && pTab->bFts4 ){ + Fts3TokenAndCost *aTC; + Fts3Expr **apOr; + aTC = (Fts3TokenAndCost *)sqlite3_malloc( + sizeof(Fts3TokenAndCost) * nToken + + sizeof(Fts3Expr *) * nOr * 2 + ); + apOr = (Fts3Expr **)&aTC[nToken]; + + if( !aTC ){ + rc = SQLITE_NOMEM; + }else{ + int ii; + Fts3TokenAndCost *pTC = aTC; + Fts3Expr **ppOr = apOr; + + fts3EvalTokenCosts(pCsr, 0, pCsr->pExpr, &pTC, &ppOr, &rc); + nToken = (int)(pTC-aTC); + nOr = (int)(ppOr-apOr); + + if( rc==SQLITE_OK ){ + rc = fts3EvalSelectDeferred(pCsr, 0, aTC, nToken); + for(ii=0; rc==SQLITE_OK && iipExpr, &rc); + return rc; +} + +/* +** Invalidate the current position list for phrase pPhrase. +*/ +static void fts3EvalInvalidatePoslist(Fts3Phrase *pPhrase){ + if( pPhrase->doclist.bFreeList ){ + sqlite3_free(pPhrase->doclist.pList); + } + pPhrase->doclist.pList = 0; + pPhrase->doclist.nList = 0; + pPhrase->doclist.bFreeList = 0; +} + +/* +** This function is called to edit the position list associated with +** the phrase object passed as the fifth argument according to a NEAR +** condition. For example: +** +** abc NEAR/5 "def ghi" +** +** Parameter nNear is passed the NEAR distance of the expression (5 in +** the example above). When this function is called, *paPoslist points to +** the position list, and *pnToken is the number of phrase tokens in, the +** phrase on the other side of the NEAR operator to pPhrase. For example, +** if pPhrase refers to the "def ghi" phrase, then *paPoslist points to +** the position list associated with phrase "abc". +** +** All positions in the pPhrase position list that are not sufficiently +** close to a position in the *paPoslist position list are removed. If this +** leaves 0 positions, zero is returned. Otherwise, non-zero. +** +** Before returning, *paPoslist is set to point to the position lsit +** associated with pPhrase. And *pnToken is set to the number of tokens in +** pPhrase. +*/ +static int fts3EvalNearTrim( + int nNear, /* NEAR distance. As in "NEAR/nNear". */ + char *aTmp, /* Temporary space to use */ + char **paPoslist, /* IN/OUT: Position list */ + int *pnToken, /* IN/OUT: Tokens in phrase of *paPoslist */ + Fts3Phrase *pPhrase /* The phrase object to trim the doclist of */ +){ + int nParam1 = nNear + pPhrase->nToken; + int nParam2 = nNear + *pnToken; + int nNew; + char *p2; + char *pOut; + int res; + + assert( pPhrase->doclist.pList ); + + p2 = pOut = pPhrase->doclist.pList; + res = fts3PoslistNearMerge( + &pOut, aTmp, nParam1, nParam2, paPoslist, &p2 + ); + if( res ){ + nNew = (int)(pOut - pPhrase->doclist.pList) - 1; + assert( pPhrase->doclist.pList[nNew]=='\0' ); + assert( nNew<=pPhrase->doclist.nList && nNew>0 ); + memset(&pPhrase->doclist.pList[nNew], 0, pPhrase->doclist.nList - nNew); + pPhrase->doclist.nList = nNew; + *paPoslist = pPhrase->doclist.pList; + *pnToken = pPhrase->nToken; + } + + return res; +} + +/* +** This function is a no-op if *pRc is other than SQLITE_OK when it is called. +** Otherwise, it advances the expression passed as the second argument to +** point to the next matching row in the database. Expressions iterate through +** matching rows in docid order. Ascending order if Fts3Cursor.bDesc is zero, +** or descending if it is non-zero. +** +** If an error occurs, *pRc is set to an SQLite error code. Otherwise, if +** successful, the following variables in pExpr are set: +** +** Fts3Expr.bEof (non-zero if EOF - there is no next row) +** Fts3Expr.iDocid (valid if bEof==0. The docid of the next row) +** +** If the expression is of type FTSQUERY_PHRASE, and the expression is not +** at EOF, then the following variables are populated with the position list +** for the phrase for the visited row: +** +** FTs3Expr.pPhrase->doclist.nList (length of pList in bytes) +** FTs3Expr.pPhrase->doclist.pList (pointer to position list) +** +** It says above that this function advances the expression to the next +** matching row. This is usually true, but there are the following exceptions: +** +** 1. Deferred tokens are not taken into account. If a phrase consists +** entirely of deferred tokens, it is assumed to match every row in +** the db. In this case the position-list is not populated at all. +** +** Or, if a phrase contains one or more deferred tokens and one or +** more non-deferred tokens, then the expression is advanced to the +** next possible match, considering only non-deferred tokens. In other +** words, if the phrase is "A B C", and "B" is deferred, the expression +** is advanced to the next row that contains an instance of "A * C", +** where "*" may match any single token. The position list in this case +** is populated as for "A * C" before returning. +** +** 2. NEAR is treated as AND. If the expression is "x NEAR y", it is +** advanced to point to the next row that matches "x AND y". +** +** See sqlite3Fts3EvalTestDeferred() for details on testing if a row is +** really a match, taking into account deferred tokens and NEAR operators. +*/ +static void fts3EvalNextRow( + Fts3Cursor *pCsr, /* FTS Cursor handle */ + Fts3Expr *pExpr, /* Expr. to advance to next matching row */ + int *pRc /* IN/OUT: Error code */ +){ + if( *pRc==SQLITE_OK ){ + int bDescDoclist = pCsr->bDesc; /* Used by DOCID_CMP() macro */ + assert( pExpr->bEof==0 ); + pExpr->bStart = 1; + + switch( pExpr->eType ){ + case FTSQUERY_NEAR: + case FTSQUERY_AND: { + Fts3Expr *pLeft = pExpr->pLeft; + Fts3Expr *pRight = pExpr->pRight; + assert( !pLeft->bDeferred || !pRight->bDeferred ); + + if( pLeft->bDeferred ){ + /* LHS is entirely deferred. So we assume it matches every row. + ** Advance the RHS iterator to find the next row visited. */ + fts3EvalNextRow(pCsr, pRight, pRc); + pExpr->iDocid = pRight->iDocid; + pExpr->bEof = pRight->bEof; + }else if( pRight->bDeferred ){ + /* RHS is entirely deferred. So we assume it matches every row. + ** Advance the LHS iterator to find the next row visited. */ + fts3EvalNextRow(pCsr, pLeft, pRc); + pExpr->iDocid = pLeft->iDocid; + pExpr->bEof = pLeft->bEof; + }else{ + /* Neither the RHS or LHS are deferred. */ + fts3EvalNextRow(pCsr, pLeft, pRc); + fts3EvalNextRow(pCsr, pRight, pRc); + while( !pLeft->bEof && !pRight->bEof && *pRc==SQLITE_OK ){ + sqlite3_int64 iDiff = DOCID_CMP(pLeft->iDocid, pRight->iDocid); + if( iDiff==0 ) break; + if( iDiff<0 ){ + fts3EvalNextRow(pCsr, pLeft, pRc); + }else{ + fts3EvalNextRow(pCsr, pRight, pRc); + } + } + pExpr->iDocid = pLeft->iDocid; + pExpr->bEof = (pLeft->bEof || pRight->bEof); + if( pExpr->eType==FTSQUERY_NEAR && pExpr->bEof ){ + if( pRight->pPhrase && pRight->pPhrase->doclist.aAll ){ + Fts3Doclist *pDl = &pRight->pPhrase->doclist; + while( *pRc==SQLITE_OK && pRight->bEof==0 ){ + memset(pDl->pList, 0, pDl->nList); + fts3EvalNextRow(pCsr, pRight, pRc); + } + } + if( pLeft->pPhrase && pLeft->pPhrase->doclist.aAll ){ + Fts3Doclist *pDl = &pLeft->pPhrase->doclist; + while( *pRc==SQLITE_OK && pLeft->bEof==0 ){ + memset(pDl->pList, 0, pDl->nList); + fts3EvalNextRow(pCsr, pLeft, pRc); + } + } + } + } + break; + } + + case FTSQUERY_OR: { + Fts3Expr *pLeft = pExpr->pLeft; + Fts3Expr *pRight = pExpr->pRight; + sqlite3_int64 iCmp = DOCID_CMP(pLeft->iDocid, pRight->iDocid); + + assert( pLeft->bStart || pLeft->iDocid==pRight->iDocid ); + assert( pRight->bStart || pLeft->iDocid==pRight->iDocid ); + + if( pRight->bEof || (pLeft->bEof==0 && iCmp<0) ){ + fts3EvalNextRow(pCsr, pLeft, pRc); + }else if( pLeft->bEof || (pRight->bEof==0 && iCmp>0) ){ + fts3EvalNextRow(pCsr, pRight, pRc); + }else{ + fts3EvalNextRow(pCsr, pLeft, pRc); + fts3EvalNextRow(pCsr, pRight, pRc); + } + + pExpr->bEof = (pLeft->bEof && pRight->bEof); + iCmp = DOCID_CMP(pLeft->iDocid, pRight->iDocid); + if( pRight->bEof || (pLeft->bEof==0 && iCmp<0) ){ + pExpr->iDocid = pLeft->iDocid; + }else{ + pExpr->iDocid = pRight->iDocid; + } + + break; + } + + case FTSQUERY_NOT: { + Fts3Expr *pLeft = pExpr->pLeft; + Fts3Expr *pRight = pExpr->pRight; + + if( pRight->bStart==0 ){ + fts3EvalNextRow(pCsr, pRight, pRc); + assert( *pRc!=SQLITE_OK || pRight->bStart ); + } + + fts3EvalNextRow(pCsr, pLeft, pRc); + if( pLeft->bEof==0 ){ + while( !*pRc + && !pRight->bEof + && DOCID_CMP(pLeft->iDocid, pRight->iDocid)>0 + ){ + fts3EvalNextRow(pCsr, pRight, pRc); + } + } + pExpr->iDocid = pLeft->iDocid; + pExpr->bEof = pLeft->bEof; + break; + } + + default: { + Fts3Phrase *pPhrase = pExpr->pPhrase; + fts3EvalInvalidatePoslist(pPhrase); + *pRc = fts3EvalPhraseNext(pCsr, pPhrase, &pExpr->bEof); + pExpr->iDocid = pPhrase->doclist.iDocid; + break; + } + } + } +} + +/* +** If *pRc is not SQLITE_OK, or if pExpr is not the root node of a NEAR +** cluster, then this function returns 1 immediately. +** +** Otherwise, it checks if the current row really does match the NEAR +** expression, using the data currently stored in the position lists +** (Fts3Expr->pPhrase.doclist.pList/nList) for each phrase in the expression. +** +** If the current row is a match, the position list associated with each +** phrase in the NEAR expression is edited in place to contain only those +** phrase instances sufficiently close to their peers to satisfy all NEAR +** constraints. In this case it returns 1. If the NEAR expression does not +** match the current row, 0 is returned. The position lists may or may not +** be edited if 0 is returned. +*/ +static int fts3EvalNearTest(Fts3Expr *pExpr, int *pRc){ + int res = 1; + + /* The following block runs if pExpr is the root of a NEAR query. + ** For example, the query: + ** + ** "w" NEAR "x" NEAR "y" NEAR "z" + ** + ** which is represented in tree form as: + ** + ** | + ** +--NEAR--+ <-- root of NEAR query + ** | | + ** +--NEAR--+ "z" + ** | | + ** +--NEAR--+ "y" + ** | | + ** "w" "x" + ** + ** The right-hand child of a NEAR node is always a phrase. The + ** left-hand child may be either a phrase or a NEAR node. There are + ** no exceptions to this - it's the way the parser in fts3_expr.c works. + */ + if( *pRc==SQLITE_OK + && pExpr->eType==FTSQUERY_NEAR + && pExpr->bEof==0 + && (pExpr->pParent==0 || pExpr->pParent->eType!=FTSQUERY_NEAR) + ){ + Fts3Expr *p; + int nTmp = 0; /* Bytes of temp space */ + char *aTmp; /* Temp space for PoslistNearMerge() */ + + /* Allocate temporary working space. */ + for(p=pExpr; p->pLeft; p=p->pLeft){ + nTmp += p->pRight->pPhrase->doclist.nList; + } + nTmp += p->pPhrase->doclist.nList; + if( nTmp==0 ){ + res = 0; + }else{ + aTmp = sqlite3_malloc(nTmp*2); + if( !aTmp ){ + *pRc = SQLITE_NOMEM; + res = 0; + }else{ + char *aPoslist = p->pPhrase->doclist.pList; + int nToken = p->pPhrase->nToken; + + for(p=p->pParent;res && p && p->eType==FTSQUERY_NEAR; p=p->pParent){ + Fts3Phrase *pPhrase = p->pRight->pPhrase; + int nNear = p->nNear; + res = fts3EvalNearTrim(nNear, aTmp, &aPoslist, &nToken, pPhrase); + } + + aPoslist = pExpr->pRight->pPhrase->doclist.pList; + nToken = pExpr->pRight->pPhrase->nToken; + for(p=pExpr->pLeft; p && res; p=p->pLeft){ + int nNear; + Fts3Phrase *pPhrase; + assert( p->pParent && p->pParent->pLeft==p ); + nNear = p->pParent->nNear; + pPhrase = ( + p->eType==FTSQUERY_NEAR ? p->pRight->pPhrase : p->pPhrase + ); + res = fts3EvalNearTrim(nNear, aTmp, &aPoslist, &nToken, pPhrase); + } + } + + sqlite3_free(aTmp); + } + } + + return res; +} + +/* +** This function is a helper function for sqlite3Fts3EvalTestDeferred(). +** Assuming no error occurs or has occurred, It returns non-zero if the +** expression passed as the second argument matches the row that pCsr +** currently points to, or zero if it does not. +** +** If *pRc is not SQLITE_OK when this function is called, it is a no-op. +** If an error occurs during execution of this function, *pRc is set to +** the appropriate SQLite error code. In this case the returned value is +** undefined. +*/ +static int fts3EvalTestExpr( + Fts3Cursor *pCsr, /* FTS cursor handle */ + Fts3Expr *pExpr, /* Expr to test. May or may not be root. */ + int *pRc /* IN/OUT: Error code */ +){ + int bHit = 1; /* Return value */ + if( *pRc==SQLITE_OK ){ + switch( pExpr->eType ){ + case FTSQUERY_NEAR: + case FTSQUERY_AND: + bHit = ( + fts3EvalTestExpr(pCsr, pExpr->pLeft, pRc) + && fts3EvalTestExpr(pCsr, pExpr->pRight, pRc) + && fts3EvalNearTest(pExpr, pRc) + ); + + /* If the NEAR expression does not match any rows, zero the doclist for + ** all phrases involved in the NEAR. This is because the snippet(), + ** offsets() and matchinfo() functions are not supposed to recognize + ** any instances of phrases that are part of unmatched NEAR queries. + ** For example if this expression: + ** + ** ... MATCH 'a OR (b NEAR c)' + ** + ** is matched against a row containing: + ** + ** 'a b d e' + ** + ** then any snippet() should ony highlight the "a" term, not the "b" + ** (as "b" is part of a non-matching NEAR clause). + */ + if( bHit==0 + && pExpr->eType==FTSQUERY_NEAR + && (pExpr->pParent==0 || pExpr->pParent->eType!=FTSQUERY_NEAR) + ){ + Fts3Expr *p; + for(p=pExpr; p->pPhrase==0; p=p->pLeft){ + if( p->pRight->iDocid==pCsr->iPrevId ){ + fts3EvalInvalidatePoslist(p->pRight->pPhrase); + } + } + if( p->iDocid==pCsr->iPrevId ){ + fts3EvalInvalidatePoslist(p->pPhrase); + } + } + + break; + + case FTSQUERY_OR: { + int bHit1 = fts3EvalTestExpr(pCsr, pExpr->pLeft, pRc); + int bHit2 = fts3EvalTestExpr(pCsr, pExpr->pRight, pRc); + bHit = bHit1 || bHit2; + break; + } + + case FTSQUERY_NOT: + bHit = ( + fts3EvalTestExpr(pCsr, pExpr->pLeft, pRc) + && !fts3EvalTestExpr(pCsr, pExpr->pRight, pRc) + ); + break; + + default: { +#ifndef SQLITE_DISABLE_FTS4_DEFERRED + if( pCsr->pDeferred + && (pExpr->iDocid==pCsr->iPrevId || pExpr->bDeferred) + ){ + Fts3Phrase *pPhrase = pExpr->pPhrase; + assert( pExpr->bDeferred || pPhrase->doclist.bFreeList==0 ); + if( pExpr->bDeferred ){ + fts3EvalInvalidatePoslist(pPhrase); + } + *pRc = fts3EvalDeferredPhrase(pCsr, pPhrase); + bHit = (pPhrase->doclist.pList!=0); + pExpr->iDocid = pCsr->iPrevId; + }else +#endif + { + bHit = (pExpr->bEof==0 && pExpr->iDocid==pCsr->iPrevId); + } + break; + } + } + } + return bHit; +} + +/* +** This function is called as the second part of each xNext operation when +** iterating through the results of a full-text query. At this point the +** cursor points to a row that matches the query expression, with the +** following caveats: +** +** * Up until this point, "NEAR" operators in the expression have been +** treated as "AND". +** +** * Deferred tokens have not yet been considered. +** +** If *pRc is not SQLITE_OK when this function is called, it immediately +** returns 0. Otherwise, it tests whether or not after considering NEAR +** operators and deferred tokens the current row is still a match for the +** expression. It returns 1 if both of the following are true: +** +** 1. *pRc is SQLITE_OK when this function returns, and +** +** 2. After scanning the current FTS table row for the deferred tokens, +** it is determined that the row does *not* match the query. +** +** Or, if no error occurs and it seems the current row does match the FTS +** query, return 0. +*/ +SQLITE_PRIVATE int sqlite3Fts3EvalTestDeferred(Fts3Cursor *pCsr, int *pRc){ + int rc = *pRc; + int bMiss = 0; + if( rc==SQLITE_OK ){ + + /* If there are one or more deferred tokens, load the current row into + ** memory and scan it to determine the position list for each deferred + ** token. Then, see if this row is really a match, considering deferred + ** tokens and NEAR operators (neither of which were taken into account + ** earlier, by fts3EvalNextRow()). + */ + if( pCsr->pDeferred ){ + rc = fts3CursorSeek(0, pCsr); + if( rc==SQLITE_OK ){ + rc = sqlite3Fts3CacheDeferredDoclists(pCsr); + } + } + bMiss = (0==fts3EvalTestExpr(pCsr, pCsr->pExpr, &rc)); + + /* Free the position-lists accumulated for each deferred token above. */ + sqlite3Fts3FreeDeferredDoclists(pCsr); + *pRc = rc; + } + return (rc==SQLITE_OK && bMiss); +} + +/* +** Advance to the next document that matches the FTS expression in +** Fts3Cursor.pExpr. +*/ +static int fts3EvalNext(Fts3Cursor *pCsr){ + int rc = SQLITE_OK; /* Return Code */ + Fts3Expr *pExpr = pCsr->pExpr; + assert( pCsr->isEof==0 ); + if( pExpr==0 ){ + pCsr->isEof = 1; + }else{ + do { + if( pCsr->isRequireSeek==0 ){ + sqlite3_reset(pCsr->pStmt); + } + assert( sqlite3_data_count(pCsr->pStmt)==0 ); + fts3EvalNextRow(pCsr, pExpr, &rc); + pCsr->isEof = pExpr->bEof; + pCsr->isRequireSeek = 1; + pCsr->isMatchinfoNeeded = 1; + pCsr->iPrevId = pExpr->iDocid; + }while( pCsr->isEof==0 && sqlite3Fts3EvalTestDeferred(pCsr, &rc) ); + } + + /* Check if the cursor is past the end of the docid range specified + ** by Fts3Cursor.iMinDocid/iMaxDocid. If so, set the EOF flag. */ + if( rc==SQLITE_OK && ( + (pCsr->bDesc==0 && pCsr->iPrevId>pCsr->iMaxDocid) + || (pCsr->bDesc!=0 && pCsr->iPrevIdiMinDocid) + )){ + pCsr->isEof = 1; + } + + return rc; +} + +/* +** Restart interation for expression pExpr so that the next call to +** fts3EvalNext() visits the first row. Do not allow incremental +** loading or merging of phrase doclists for this iteration. +** +** If *pRc is other than SQLITE_OK when this function is called, it is +** a no-op. If an error occurs within this function, *pRc is set to an +** SQLite error code before returning. +*/ +static void fts3EvalRestart( + Fts3Cursor *pCsr, + Fts3Expr *pExpr, + int *pRc +){ + if( pExpr && *pRc==SQLITE_OK ){ + Fts3Phrase *pPhrase = pExpr->pPhrase; + + if( pPhrase ){ + fts3EvalInvalidatePoslist(pPhrase); + if( pPhrase->bIncr ){ + int i; + for(i=0; inToken; i++){ + Fts3PhraseToken *pToken = &pPhrase->aToken[i]; + assert( pToken->pDeferred==0 ); + if( pToken->pSegcsr ){ + sqlite3Fts3MsrIncrRestart(pToken->pSegcsr); + } + } + *pRc = fts3EvalPhraseStart(pCsr, 0, pPhrase); + } + pPhrase->doclist.pNextDocid = 0; + pPhrase->doclist.iDocid = 0; + pPhrase->pOrPoslist = 0; + } + + pExpr->iDocid = 0; + pExpr->bEof = 0; + pExpr->bStart = 0; + + fts3EvalRestart(pCsr, pExpr->pLeft, pRc); + fts3EvalRestart(pCsr, pExpr->pRight, pRc); + } +} + +/* +** After allocating the Fts3Expr.aMI[] array for each phrase in the +** expression rooted at pExpr, the cursor iterates through all rows matched +** by pExpr, calling this function for each row. This function increments +** the values in Fts3Expr.aMI[] according to the position-list currently +** found in Fts3Expr.pPhrase->doclist.pList for each of the phrase +** expression nodes. +*/ +static void fts3EvalUpdateCounts(Fts3Expr *pExpr){ + if( pExpr ){ + Fts3Phrase *pPhrase = pExpr->pPhrase; + if( pPhrase && pPhrase->doclist.pList ){ + int iCol = 0; + char *p = pPhrase->doclist.pList; + + assert( *p ); + while( 1 ){ + u8 c = 0; + int iCnt = 0; + while( 0xFE & (*p | c) ){ + if( (c&0x80)==0 ) iCnt++; + c = *p++ & 0x80; + } + + /* aMI[iCol*3 + 1] = Number of occurrences + ** aMI[iCol*3 + 2] = Number of rows containing at least one instance + */ + pExpr->aMI[iCol*3 + 1] += iCnt; + pExpr->aMI[iCol*3 + 2] += (iCnt>0); + if( *p==0x00 ) break; + p++; + p += fts3GetVarint32(p, &iCol); + } + } + + fts3EvalUpdateCounts(pExpr->pLeft); + fts3EvalUpdateCounts(pExpr->pRight); + } +} + +/* +** Expression pExpr must be of type FTSQUERY_PHRASE. +** +** If it is not already allocated and populated, this function allocates and +** populates the Fts3Expr.aMI[] array for expression pExpr. If pExpr is part +** of a NEAR expression, then it also allocates and populates the same array +** for all other phrases that are part of the NEAR expression. +** +** SQLITE_OK is returned if the aMI[] array is successfully allocated and +** populated. Otherwise, if an error occurs, an SQLite error code is returned. +*/ +static int fts3EvalGatherStats( + Fts3Cursor *pCsr, /* Cursor object */ + Fts3Expr *pExpr /* FTSQUERY_PHRASE expression */ +){ + int rc = SQLITE_OK; /* Return code */ + + assert( pExpr->eType==FTSQUERY_PHRASE ); + if( pExpr->aMI==0 ){ + Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab; + Fts3Expr *pRoot; /* Root of NEAR expression */ + Fts3Expr *p; /* Iterator used for several purposes */ + + sqlite3_int64 iPrevId = pCsr->iPrevId; + sqlite3_int64 iDocid; + u8 bEof; + + /* Find the root of the NEAR expression */ + pRoot = pExpr; + while( pRoot->pParent && pRoot->pParent->eType==FTSQUERY_NEAR ){ + pRoot = pRoot->pParent; + } + iDocid = pRoot->iDocid; + bEof = pRoot->bEof; + assert( pRoot->bStart ); + + /* Allocate space for the aMSI[] array of each FTSQUERY_PHRASE node */ + for(p=pRoot; p; p=p->pLeft){ + Fts3Expr *pE = (p->eType==FTSQUERY_PHRASE?p:p->pRight); + assert( pE->aMI==0 ); + pE->aMI = (u32 *)sqlite3_malloc(pTab->nColumn * 3 * sizeof(u32)); + if( !pE->aMI ) return SQLITE_NOMEM; + memset(pE->aMI, 0, pTab->nColumn * 3 * sizeof(u32)); + } + + fts3EvalRestart(pCsr, pRoot, &rc); + + while( pCsr->isEof==0 && rc==SQLITE_OK ){ + + do { + /* Ensure the %_content statement is reset. */ + if( pCsr->isRequireSeek==0 ) sqlite3_reset(pCsr->pStmt); + assert( sqlite3_data_count(pCsr->pStmt)==0 ); + + /* Advance to the next document */ + fts3EvalNextRow(pCsr, pRoot, &rc); + pCsr->isEof = pRoot->bEof; + pCsr->isRequireSeek = 1; + pCsr->isMatchinfoNeeded = 1; + pCsr->iPrevId = pRoot->iDocid; + }while( pCsr->isEof==0 + && pRoot->eType==FTSQUERY_NEAR + && sqlite3Fts3EvalTestDeferred(pCsr, &rc) + ); + + if( rc==SQLITE_OK && pCsr->isEof==0 ){ + fts3EvalUpdateCounts(pRoot); + } + } + + pCsr->isEof = 0; + pCsr->iPrevId = iPrevId; + + if( bEof ){ + pRoot->bEof = bEof; + }else{ + /* Caution: pRoot may iterate through docids in ascending or descending + ** order. For this reason, even though it seems more defensive, the + ** do loop can not be written: + ** + ** do {...} while( pRoot->iDocidbEof==0 ); + }while( pRoot->iDocid!=iDocid && rc==SQLITE_OK ); + } + } + return rc; +} + +/* +** This function is used by the matchinfo() module to query a phrase +** expression node for the following information: +** +** 1. The total number of occurrences of the phrase in each column of +** the FTS table (considering all rows), and +** +** 2. For each column, the number of rows in the table for which the +** column contains at least one instance of the phrase. +** +** If no error occurs, SQLITE_OK is returned and the values for each column +** written into the array aiOut as follows: +** +** aiOut[iCol*3 + 1] = Number of occurrences +** aiOut[iCol*3 + 2] = Number of rows containing at least one instance +** +** Caveats: +** +** * If a phrase consists entirely of deferred tokens, then all output +** values are set to the number of documents in the table. In other +** words we assume that very common tokens occur exactly once in each +** column of each row of the table. +** +** * If a phrase contains some deferred tokens (and some non-deferred +** tokens), count the potential occurrence identified by considering +** the non-deferred tokens instead of actual phrase occurrences. +** +** * If the phrase is part of a NEAR expression, then only phrase instances +** that meet the NEAR constraint are included in the counts. +*/ +SQLITE_PRIVATE int sqlite3Fts3EvalPhraseStats( + Fts3Cursor *pCsr, /* FTS cursor handle */ + Fts3Expr *pExpr, /* Phrase expression */ + u32 *aiOut /* Array to write results into (see above) */ +){ + Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab; + int rc = SQLITE_OK; + int iCol; + + if( pExpr->bDeferred && pExpr->pParent->eType!=FTSQUERY_NEAR ){ + assert( pCsr->nDoc>0 ); + for(iCol=0; iColnColumn; iCol++){ + aiOut[iCol*3 + 1] = (u32)pCsr->nDoc; + aiOut[iCol*3 + 2] = (u32)pCsr->nDoc; + } + }else{ + rc = fts3EvalGatherStats(pCsr, pExpr); + if( rc==SQLITE_OK ){ + assert( pExpr->aMI ); + for(iCol=0; iColnColumn; iCol++){ + aiOut[iCol*3 + 1] = pExpr->aMI[iCol*3 + 1]; + aiOut[iCol*3 + 2] = pExpr->aMI[iCol*3 + 2]; + } + } + } + + return rc; +} + +/* +** The expression pExpr passed as the second argument to this function +** must be of type FTSQUERY_PHRASE. +** +** The returned value is either NULL or a pointer to a buffer containing +** a position-list indicating the occurrences of the phrase in column iCol +** of the current row. +** +** More specifically, the returned buffer contains 1 varint for each +** occurrence of the phrase in the column, stored using the normal (delta+2) +** compression and is terminated by either an 0x01 or 0x00 byte. For example, +** if the requested column contains "a b X c d X X" and the position-list +** for 'X' is requested, the buffer returned may contain: +** +** 0x04 0x05 0x03 0x01 or 0x04 0x05 0x03 0x00 +** +** This function works regardless of whether or not the phrase is deferred, +** incremental, or neither. +*/ +SQLITE_PRIVATE int sqlite3Fts3EvalPhrasePoslist( + Fts3Cursor *pCsr, /* FTS3 cursor object */ + Fts3Expr *pExpr, /* Phrase to return doclist for */ + int iCol, /* Column to return position list for */ + char **ppOut /* OUT: Pointer to position list */ +){ + Fts3Phrase *pPhrase = pExpr->pPhrase; + Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab; + char *pIter; + int iThis; + sqlite3_int64 iDocid; + + /* If this phrase is applies specifically to some column other than + ** column iCol, return a NULL pointer. */ + *ppOut = 0; + assert( iCol>=0 && iColnColumn ); + if( (pPhrase->iColumnnColumn && pPhrase->iColumn!=iCol) ){ + return SQLITE_OK; + } + + iDocid = pExpr->iDocid; + pIter = pPhrase->doclist.pList; + if( iDocid!=pCsr->iPrevId || pExpr->bEof ){ + int rc = SQLITE_OK; + int bDescDoclist = pTab->bDescIdx; /* For DOCID_CMP macro */ + int bOr = 0; + u8 bTreeEof = 0; + Fts3Expr *p; /* Used to iterate from pExpr to root */ + Fts3Expr *pNear; /* Most senior NEAR ancestor (or pExpr) */ + int bMatch; + + /* Check if this phrase descends from an OR expression node. If not, + ** return NULL. Otherwise, the entry that corresponds to docid + ** pCsr->iPrevId may lie earlier in the doclist buffer. Or, if the + ** tree that the node is part of has been marked as EOF, but the node + ** itself is not EOF, then it may point to an earlier entry. */ + pNear = pExpr; + for(p=pExpr->pParent; p; p=p->pParent){ + if( p->eType==FTSQUERY_OR ) bOr = 1; + if( p->eType==FTSQUERY_NEAR ) pNear = p; + if( p->bEof ) bTreeEof = 1; + } + if( bOr==0 ) return SQLITE_OK; + + /* This is the descendent of an OR node. In this case we cannot use + ** an incremental phrase. Load the entire doclist for the phrase + ** into memory in this case. */ + if( pPhrase->bIncr ){ + int bEofSave = pNear->bEof; + fts3EvalRestart(pCsr, pNear, &rc); + while( rc==SQLITE_OK && !pNear->bEof ){ + fts3EvalNextRow(pCsr, pNear, &rc); + if( bEofSave==0 && pNear->iDocid==iDocid ) break; + } + assert( rc!=SQLITE_OK || pPhrase->bIncr==0 ); + } + if( bTreeEof ){ + while( rc==SQLITE_OK && !pNear->bEof ){ + fts3EvalNextRow(pCsr, pNear, &rc); + } + } + if( rc!=SQLITE_OK ) return rc; + + bMatch = 1; + for(p=pNear; p; p=p->pLeft){ + u8 bEof = 0; + Fts3Expr *pTest = p; + Fts3Phrase *pPh; + assert( pTest->eType==FTSQUERY_NEAR || pTest->eType==FTSQUERY_PHRASE ); + if( pTest->eType==FTSQUERY_NEAR ) pTest = pTest->pRight; + assert( pTest->eType==FTSQUERY_PHRASE ); + pPh = pTest->pPhrase; + + pIter = pPh->pOrPoslist; + iDocid = pPh->iOrDocid; + if( pCsr->bDesc==bDescDoclist ){ + bEof = !pPh->doclist.nAll || + (pIter >= (pPh->doclist.aAll + pPh->doclist.nAll)); + while( (pIter==0 || DOCID_CMP(iDocid, pCsr->iPrevId)<0 ) && bEof==0 ){ + sqlite3Fts3DoclistNext( + bDescDoclist, pPh->doclist.aAll, pPh->doclist.nAll, + &pIter, &iDocid, &bEof + ); + } + }else{ + bEof = !pPh->doclist.nAll || (pIter && pIter<=pPh->doclist.aAll); + while( (pIter==0 || DOCID_CMP(iDocid, pCsr->iPrevId)>0 ) && bEof==0 ){ + int dummy; + sqlite3Fts3DoclistPrev( + bDescDoclist, pPh->doclist.aAll, pPh->doclist.nAll, + &pIter, &iDocid, &dummy, &bEof + ); + } + } + pPh->pOrPoslist = pIter; + pPh->iOrDocid = iDocid; + if( bEof || iDocid!=pCsr->iPrevId ) bMatch = 0; + } + + if( bMatch ){ + pIter = pPhrase->pOrPoslist; + }else{ + pIter = 0; + } + } + if( pIter==0 ) return SQLITE_OK; + + if( *pIter==0x01 ){ + pIter++; + pIter += fts3GetVarint32(pIter, &iThis); + }else{ + iThis = 0; + } + while( iThisdoclist, and +** * any Fts3MultiSegReader objects held by phrase tokens. +*/ +SQLITE_PRIVATE void sqlite3Fts3EvalPhraseCleanup(Fts3Phrase *pPhrase){ + if( pPhrase ){ + int i; + sqlite3_free(pPhrase->doclist.aAll); + fts3EvalInvalidatePoslist(pPhrase); + memset(&pPhrase->doclist, 0, sizeof(Fts3Doclist)); + for(i=0; inToken; i++){ + fts3SegReaderCursorFree(pPhrase->aToken[i].pSegcsr); + pPhrase->aToken[i].pSegcsr = 0; + } + } +} + + +/* +** Return SQLITE_CORRUPT_VTAB. +*/ +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE int sqlite3Fts3Corrupt(){ + return SQLITE_CORRUPT_VTAB; +} +#endif + +#if !SQLITE_CORE +/* +** Initialize API pointer table, if required. +*/ +#ifdef _WIN32 +__declspec(dllexport) +#endif +SQLITE_API int sqlite3_fts3_init( + sqlite3 *db, + char **pzErrMsg, + const sqlite3_api_routines *pApi +){ + SQLITE_EXTENSION_INIT2(pApi) + return sqlite3Fts3Init(db); +} +#endif + +#endif + +/************** End of fts3.c ************************************************/ +/************** Begin file fts3_aux.c ****************************************/ +/* +** 2011 Jan 27 +** +** 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. +** +****************************************************************************** +** +*/ +/* #include "fts3Int.h" */ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) + +/* #include */ +/* #include */ + +typedef struct Fts3auxTable Fts3auxTable; +typedef struct Fts3auxCursor Fts3auxCursor; + +struct Fts3auxTable { + sqlite3_vtab base; /* Base class used by SQLite core */ + Fts3Table *pFts3Tab; +}; + +struct Fts3auxCursor { + sqlite3_vtab_cursor base; /* Base class used by SQLite core */ + Fts3MultiSegReader csr; /* Must be right after "base" */ + Fts3SegFilter filter; + char *zStop; + int nStop; /* Byte-length of string zStop */ + int iLangid; /* Language id to query */ + int isEof; /* True if cursor is at EOF */ + sqlite3_int64 iRowid; /* Current rowid */ + + int iCol; /* Current value of 'col' column */ + int nStat; /* Size of aStat[] array */ + struct Fts3auxColstats { + sqlite3_int64 nDoc; /* 'documents' values for current csr row */ + sqlite3_int64 nOcc; /* 'occurrences' values for current csr row */ + } *aStat; +}; + +/* +** Schema of the terms table. +*/ +#define FTS3_AUX_SCHEMA \ + "CREATE TABLE x(term, col, documents, occurrences, languageid HIDDEN)" + +/* +** This function does all the work for both the xConnect and xCreate methods. +** These tables have no persistent representation of their own, so xConnect +** and xCreate are identical operations. +*/ +static int fts3auxConnectMethod( + sqlite3 *db, /* Database connection */ + void *pUnused, /* Unused */ + 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 */ +){ + char const *zDb; /* Name of database (e.g. "main") */ + char const *zFts3; /* Name of fts3 table */ + int nDb; /* Result of strlen(zDb) */ + int nFts3; /* Result of strlen(zFts3) */ + int nByte; /* Bytes of space to allocate here */ + int rc; /* value returned by declare_vtab() */ + Fts3auxTable *p; /* Virtual table object to return */ + + UNUSED_PARAMETER(pUnused); + + /* The user should invoke this in one of two forms: + ** + ** CREATE VIRTUAL TABLE xxx USING fts4aux(fts4-table); + ** CREATE VIRTUAL TABLE xxx USING fts4aux(fts4-table-db, fts4-table); + */ + if( argc!=4 && argc!=5 ) goto bad_args; + + zDb = argv[1]; + nDb = (int)strlen(zDb); + if( argc==5 ){ + if( nDb==4 && 0==sqlite3_strnicmp("temp", zDb, 4) ){ + zDb = argv[3]; + nDb = (int)strlen(zDb); + zFts3 = argv[4]; + }else{ + goto bad_args; + } + }else{ + zFts3 = argv[3]; + } + nFts3 = (int)strlen(zFts3); + + rc = sqlite3_declare_vtab(db, FTS3_AUX_SCHEMA); + if( rc!=SQLITE_OK ) return rc; + + nByte = sizeof(Fts3auxTable) + sizeof(Fts3Table) + nDb + nFts3 + 2; + p = (Fts3auxTable *)sqlite3_malloc(nByte); + if( !p ) return SQLITE_NOMEM; + memset(p, 0, nByte); + + p->pFts3Tab = (Fts3Table *)&p[1]; + p->pFts3Tab->zDb = (char *)&p->pFts3Tab[1]; + p->pFts3Tab->zName = &p->pFts3Tab->zDb[nDb+1]; + p->pFts3Tab->db = db; + p->pFts3Tab->nIndex = 1; + + memcpy((char *)p->pFts3Tab->zDb, zDb, nDb); + memcpy((char *)p->pFts3Tab->zName, zFts3, nFts3); + sqlite3Fts3Dequote((char *)p->pFts3Tab->zName); + + *ppVtab = (sqlite3_vtab *)p; + return SQLITE_OK; + + bad_args: + sqlite3Fts3ErrMsg(pzErr, "invalid arguments to fts4aux constructor"); + return SQLITE_ERROR; +} + +/* +** This function does the work for both the xDisconnect and xDestroy methods. +** These tables have no persistent representation of their own, so xDisconnect +** and xDestroy are identical operations. +*/ +static int fts3auxDisconnectMethod(sqlite3_vtab *pVtab){ + Fts3auxTable *p = (Fts3auxTable *)pVtab; + Fts3Table *pFts3 = p->pFts3Tab; + int i; + + /* Free any prepared statements held */ + for(i=0; iaStmt); i++){ + sqlite3_finalize(pFts3->aStmt[i]); + } + sqlite3_free(pFts3->zSegmentsTbl); + sqlite3_free(p); + return SQLITE_OK; +} + +#define FTS4AUX_EQ_CONSTRAINT 1 +#define FTS4AUX_GE_CONSTRAINT 2 +#define FTS4AUX_LE_CONSTRAINT 4 + +/* +** xBestIndex - Analyze a WHERE and ORDER BY clause. +*/ +static int fts3auxBestIndexMethod( + sqlite3_vtab *pVTab, + sqlite3_index_info *pInfo +){ + int i; + int iEq = -1; + int iGe = -1; + int iLe = -1; + int iLangid = -1; + int iNext = 1; /* Next free argvIndex value */ + + UNUSED_PARAMETER(pVTab); + + /* This vtab delivers always results in "ORDER BY term ASC" order. */ + if( pInfo->nOrderBy==1 + && pInfo->aOrderBy[0].iColumn==0 + && pInfo->aOrderBy[0].desc==0 + ){ + pInfo->orderByConsumed = 1; + } + + /* Search for equality and range constraints on the "term" column. + ** And equality constraints on the hidden "languageid" column. */ + for(i=0; inConstraint; i++){ + if( pInfo->aConstraint[i].usable ){ + int op = pInfo->aConstraint[i].op; + int iCol = pInfo->aConstraint[i].iColumn; + + if( iCol==0 ){ + if( op==SQLITE_INDEX_CONSTRAINT_EQ ) iEq = i; + if( op==SQLITE_INDEX_CONSTRAINT_LT ) iLe = i; + if( op==SQLITE_INDEX_CONSTRAINT_LE ) iLe = i; + if( op==SQLITE_INDEX_CONSTRAINT_GT ) iGe = i; + if( op==SQLITE_INDEX_CONSTRAINT_GE ) iGe = i; + } + if( iCol==4 ){ + if( op==SQLITE_INDEX_CONSTRAINT_EQ ) iLangid = i; + } + } + } + + if( iEq>=0 ){ + pInfo->idxNum = FTS4AUX_EQ_CONSTRAINT; + pInfo->aConstraintUsage[iEq].argvIndex = iNext++; + pInfo->estimatedCost = 5; + }else{ + pInfo->idxNum = 0; + pInfo->estimatedCost = 20000; + if( iGe>=0 ){ + pInfo->idxNum += FTS4AUX_GE_CONSTRAINT; + pInfo->aConstraintUsage[iGe].argvIndex = iNext++; + pInfo->estimatedCost /= 2; + } + if( iLe>=0 ){ + pInfo->idxNum += FTS4AUX_LE_CONSTRAINT; + pInfo->aConstraintUsage[iLe].argvIndex = iNext++; + pInfo->estimatedCost /= 2; + } + } + if( iLangid>=0 ){ + pInfo->aConstraintUsage[iLangid].argvIndex = iNext++; + pInfo->estimatedCost--; + } + + return SQLITE_OK; +} + +/* +** xOpen - Open a cursor. +*/ +static int fts3auxOpenMethod(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCsr){ + Fts3auxCursor *pCsr; /* Pointer to cursor object to return */ + + UNUSED_PARAMETER(pVTab); + + pCsr = (Fts3auxCursor *)sqlite3_malloc(sizeof(Fts3auxCursor)); + if( !pCsr ) return SQLITE_NOMEM; + memset(pCsr, 0, sizeof(Fts3auxCursor)); + + *ppCsr = (sqlite3_vtab_cursor *)pCsr; + return SQLITE_OK; +} + +/* +** xClose - Close a cursor. +*/ +static int fts3auxCloseMethod(sqlite3_vtab_cursor *pCursor){ + Fts3Table *pFts3 = ((Fts3auxTable *)pCursor->pVtab)->pFts3Tab; + Fts3auxCursor *pCsr = (Fts3auxCursor *)pCursor; + + sqlite3Fts3SegmentsClose(pFts3); + sqlite3Fts3SegReaderFinish(&pCsr->csr); + sqlite3_free((void *)pCsr->filter.zTerm); + sqlite3_free(pCsr->zStop); + sqlite3_free(pCsr->aStat); + sqlite3_free(pCsr); + return SQLITE_OK; +} + +static int fts3auxGrowStatArray(Fts3auxCursor *pCsr, int nSize){ + if( nSize>pCsr->nStat ){ + struct Fts3auxColstats *aNew; + aNew = (struct Fts3auxColstats *)sqlite3_realloc(pCsr->aStat, + sizeof(struct Fts3auxColstats) * nSize + ); + if( aNew==0 ) return SQLITE_NOMEM; + memset(&aNew[pCsr->nStat], 0, + sizeof(struct Fts3auxColstats) * (nSize - pCsr->nStat) + ); + pCsr->aStat = aNew; + pCsr->nStat = nSize; + } + return SQLITE_OK; +} + +/* +** xNext - Advance the cursor to the next row, if any. +*/ +static int fts3auxNextMethod(sqlite3_vtab_cursor *pCursor){ + Fts3auxCursor *pCsr = (Fts3auxCursor *)pCursor; + Fts3Table *pFts3 = ((Fts3auxTable *)pCursor->pVtab)->pFts3Tab; + int rc; + + /* Increment our pretend rowid value. */ + pCsr->iRowid++; + + for(pCsr->iCol++; pCsr->iColnStat; pCsr->iCol++){ + if( pCsr->aStat[pCsr->iCol].nDoc>0 ) return SQLITE_OK; + } + + rc = sqlite3Fts3SegReaderStep(pFts3, &pCsr->csr); + if( rc==SQLITE_ROW ){ + int i = 0; + int nDoclist = pCsr->csr.nDoclist; + char *aDoclist = pCsr->csr.aDoclist; + int iCol; + + int eState = 0; + + if( pCsr->zStop ){ + int n = (pCsr->nStopcsr.nTerm) ? pCsr->nStop : pCsr->csr.nTerm; + int mc = memcmp(pCsr->zStop, pCsr->csr.zTerm, n); + if( mc<0 || (mc==0 && pCsr->csr.nTerm>pCsr->nStop) ){ + pCsr->isEof = 1; + return SQLITE_OK; + } + } + + if( fts3auxGrowStatArray(pCsr, 2) ) return SQLITE_NOMEM; + memset(pCsr->aStat, 0, sizeof(struct Fts3auxColstats) * pCsr->nStat); + iCol = 0; + + while( iaStat[0].nDoc++; + eState = 1; + iCol = 0; + break; + + /* State 1. In this state we are expecting either a 1, indicating + ** that the following integer will be a column number, or the + ** start of a position list for column 0. + ** + ** The only difference between state 1 and state 2 is that if the + ** integer encountered in state 1 is not 0 or 1, then we need to + ** increment the column 0 "nDoc" count for this term. + */ + case 1: + assert( iCol==0 ); + if( v>1 ){ + pCsr->aStat[1].nDoc++; + } + eState = 2; + /* fall through */ + + case 2: + if( v==0 ){ /* 0x00. Next integer will be a docid. */ + eState = 0; + }else if( v==1 ){ /* 0x01. Next integer will be a column number. */ + eState = 3; + }else{ /* 2 or greater. A position. */ + pCsr->aStat[iCol+1].nOcc++; + pCsr->aStat[0].nOcc++; + } + break; + + /* State 3. The integer just read is a column number. */ + default: assert( eState==3 ); + iCol = (int)v; + if( fts3auxGrowStatArray(pCsr, iCol+2) ) return SQLITE_NOMEM; + pCsr->aStat[iCol+1].nDoc++; + eState = 2; + break; + } + } + + pCsr->iCol = 0; + rc = SQLITE_OK; + }else{ + pCsr->isEof = 1; + } + return rc; +} + +/* +** xFilter - Initialize a cursor to point at the start of its data. +*/ +static int fts3auxFilterMethod( + 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 */ +){ + Fts3auxCursor *pCsr = (Fts3auxCursor *)pCursor; + Fts3Table *pFts3 = ((Fts3auxTable *)pCursor->pVtab)->pFts3Tab; + int rc; + int isScan = 0; + int iLangVal = 0; /* Language id to query */ + + int iEq = -1; /* Index of term=? value in apVal */ + int iGe = -1; /* Index of term>=? value in apVal */ + int iLe = -1; /* Index of term<=? value in apVal */ + int iLangid = -1; /* Index of languageid=? value in apVal */ + int iNext = 0; + + UNUSED_PARAMETER(nVal); + UNUSED_PARAMETER(idxStr); + + assert( idxStr==0 ); + assert( idxNum==FTS4AUX_EQ_CONSTRAINT || idxNum==0 + || idxNum==FTS4AUX_LE_CONSTRAINT || idxNum==FTS4AUX_GE_CONSTRAINT + || idxNum==(FTS4AUX_LE_CONSTRAINT|FTS4AUX_GE_CONSTRAINT) + ); + + if( idxNum==FTS4AUX_EQ_CONSTRAINT ){ + iEq = iNext++; + }else{ + isScan = 1; + if( idxNum & FTS4AUX_GE_CONSTRAINT ){ + iGe = iNext++; + } + if( idxNum & FTS4AUX_LE_CONSTRAINT ){ + iLe = iNext++; + } + } + if( iNextfilter.zTerm); + sqlite3Fts3SegReaderFinish(&pCsr->csr); + sqlite3_free((void *)pCsr->filter.zTerm); + sqlite3_free(pCsr->aStat); + memset(&pCsr->csr, 0, ((u8*)&pCsr[1]) - (u8*)&pCsr->csr); + + pCsr->filter.flags = FTS3_SEGMENT_REQUIRE_POS|FTS3_SEGMENT_IGNORE_EMPTY; + if( isScan ) pCsr->filter.flags |= FTS3_SEGMENT_SCAN; + + if( iEq>=0 || iGe>=0 ){ + const unsigned char *zStr = sqlite3_value_text(apVal[0]); + assert( (iEq==0 && iGe==-1) || (iEq==-1 && iGe==0) ); + if( zStr ){ + pCsr->filter.zTerm = sqlite3_mprintf("%s", zStr); + pCsr->filter.nTerm = sqlite3_value_bytes(apVal[0]); + if( pCsr->filter.zTerm==0 ) return SQLITE_NOMEM; + } + } + + if( iLe>=0 ){ + pCsr->zStop = sqlite3_mprintf("%s", sqlite3_value_text(apVal[iLe])); + pCsr->nStop = sqlite3_value_bytes(apVal[iLe]); + if( pCsr->zStop==0 ) return SQLITE_NOMEM; + } + + if( iLangid>=0 ){ + iLangVal = sqlite3_value_int(apVal[iLangid]); + + /* If the user specified a negative value for the languageid, use zero + ** instead. This works, as the "languageid=?" constraint will also + ** be tested by the VDBE layer. The test will always be false (since + ** this module will not return a row with a negative languageid), and + ** so the overall query will return zero rows. */ + if( iLangVal<0 ) iLangVal = 0; + } + pCsr->iLangid = iLangVal; + + rc = sqlite3Fts3SegReaderCursor(pFts3, iLangVal, 0, FTS3_SEGCURSOR_ALL, + pCsr->filter.zTerm, pCsr->filter.nTerm, 0, isScan, &pCsr->csr + ); + if( rc==SQLITE_OK ){ + rc = sqlite3Fts3SegReaderStart(pFts3, &pCsr->csr, &pCsr->filter); + } + + if( rc==SQLITE_OK ) rc = fts3auxNextMethod(pCursor); + return rc; +} + +/* +** xEof - Return true if the cursor is at EOF, or false otherwise. +*/ +static int fts3auxEofMethod(sqlite3_vtab_cursor *pCursor){ + Fts3auxCursor *pCsr = (Fts3auxCursor *)pCursor; + return pCsr->isEof; +} + +/* +** xColumn - Return a column value. +*/ +static int fts3auxColumnMethod( + sqlite3_vtab_cursor *pCursor, /* Cursor to retrieve value from */ + sqlite3_context *pCtx, /* Context for sqlite3_result_xxx() calls */ + int iCol /* Index of column to read value from */ +){ + Fts3auxCursor *p = (Fts3auxCursor *)pCursor; + + assert( p->isEof==0 ); + switch( iCol ){ + case 0: /* term */ + sqlite3_result_text(pCtx, p->csr.zTerm, p->csr.nTerm, SQLITE_TRANSIENT); + break; + + case 1: /* col */ + if( p->iCol ){ + sqlite3_result_int(pCtx, p->iCol-1); + }else{ + sqlite3_result_text(pCtx, "*", -1, SQLITE_STATIC); + } + break; + + case 2: /* documents */ + sqlite3_result_int64(pCtx, p->aStat[p->iCol].nDoc); + break; + + case 3: /* occurrences */ + sqlite3_result_int64(pCtx, p->aStat[p->iCol].nOcc); + break; + + default: /* languageid */ + assert( iCol==4 ); + sqlite3_result_int(pCtx, p->iLangid); + break; + } + + return SQLITE_OK; +} + +/* +** xRowid - Return the current rowid for the cursor. +*/ +static int fts3auxRowidMethod( + sqlite3_vtab_cursor *pCursor, /* Cursor to retrieve value from */ + sqlite_int64 *pRowid /* OUT: Rowid value */ +){ + Fts3auxCursor *pCsr = (Fts3auxCursor *)pCursor; + *pRowid = pCsr->iRowid; + return SQLITE_OK; +} + +/* +** Register the fts3aux module with database connection db. Return SQLITE_OK +** if successful or an error code if sqlite3_create_module() fails. +*/ +SQLITE_PRIVATE int sqlite3Fts3InitAux(sqlite3 *db){ + static const sqlite3_module fts3aux_module = { + 0, /* iVersion */ + fts3auxConnectMethod, /* xCreate */ + fts3auxConnectMethod, /* xConnect */ + fts3auxBestIndexMethod, /* xBestIndex */ + fts3auxDisconnectMethod, /* xDisconnect */ + fts3auxDisconnectMethod, /* xDestroy */ + fts3auxOpenMethod, /* xOpen */ + fts3auxCloseMethod, /* xClose */ + fts3auxFilterMethod, /* xFilter */ + fts3auxNextMethod, /* xNext */ + fts3auxEofMethod, /* xEof */ + fts3auxColumnMethod, /* xColumn */ + fts3auxRowidMethod, /* xRowid */ + 0, /* xUpdate */ + 0, /* xBegin */ + 0, /* xSync */ + 0, /* xCommit */ + 0, /* xRollback */ + 0, /* xFindFunction */ + 0, /* xRename */ + 0, /* xSavepoint */ + 0, /* xRelease */ + 0 /* xRollbackTo */ + }; + int rc; /* Return code */ + + rc = sqlite3_create_module(db, "fts4aux", &fts3aux_module, 0); + return rc; +} + +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */ + +/************** End of fts3_aux.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. +*/ +/* #include "fts3Int.h" */ +#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...". +*/ + +#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 + +/* +** Default span for NEAR operators. +*/ +#define SQLITE_FTS3_DEFAULT_NEAR_PARAM 10 + +/* #include */ +/* #include */ + +/* +** isNot: +** This variable is used by function getNextNode(). When getNextNode() is +** called, it sets ParseContext.isNot to true if the 'next node' is a +** FTSQUERY_PHRASE with a unary "-" attached to it. i.e. "mysql" in the +** FTS3 query "sqlite -mysql". Otherwise, ParseContext.isNot is set to +** zero. +*/ +typedef struct ParseContext ParseContext; +struct ParseContext { + sqlite3_tokenizer *pTokenizer; /* Tokenizer module */ + int iLangid; /* Language id used with tokenizer */ + const char **azCol; /* Array of column names for fts3 table */ + int bFts4; /* True to allow FTS4-only syntax */ + int nCol; /* Number of entries in azCol[] */ + int iDefaultCol; /* Default column to query */ + int isNot; /* True if getNextNode() sees a unary - */ + sqlite3_context *pCtx; /* Write error message here */ + int nNest; /* Number of nested brackets */ +}; + +/* +** 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 behavior 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==' ' || c=='\t' || c=='\n' || c=='\r' || c=='\v' || c=='\f'; +} + +/* +** Allocate nByte bytes of memory using sqlite3_malloc(). If successful, +** zero the memory before returning a pointer to it. If unsuccessful, +** return NULL. +*/ +static void *fts3MallocZero(int nByte){ + void *pRet = sqlite3_malloc(nByte); + if( pRet ) memset(pRet, 0, nByte); + return pRet; +} + +SQLITE_PRIVATE int sqlite3Fts3OpenTokenizer( + sqlite3_tokenizer *pTokenizer, + int iLangid, + const char *z, + int n, + sqlite3_tokenizer_cursor **ppCsr +){ + sqlite3_tokenizer_module const *pModule = pTokenizer->pModule; + sqlite3_tokenizer_cursor *pCsr = 0; + int rc; + + rc = pModule->xOpen(pTokenizer, z, n, &pCsr); + assert( rc==SQLITE_OK || pCsr==0 ); + if( rc==SQLITE_OK ){ + pCsr->pTokenizer = pTokenizer; + if( pModule->iVersion>=1 ){ + rc = pModule->xLanguageid(pCsr, iLangid); + if( rc!=SQLITE_OK ){ + pModule->xClose(pCsr); + pCsr = 0; + } + } + } + *ppCsr = pCsr; + 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 *); + +/* +** 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 i = 0; + + /* Set variable i to the maximum number of bytes of input to tokenize. */ + for(i=0; iiLangid, z, i, &pCursor); + if( rc==SQLITE_OK ){ + const char *zToken; + int nToken = 0, iStart = 0, iEnd = 0, iPosition = 0; + int nByte; /* total space to allocate */ + + rc = pModule->xNext(pCursor, &zToken, &nToken, &iStart, &iEnd, &iPosition); + if( rc==SQLITE_OK ){ + nByte = sizeof(Fts3Expr) + sizeof(Fts3Phrase) + nToken; + pRet = (Fts3Expr *)fts3MallocZero(nByte); + if( !pRet ){ + rc = SQLITE_NOMEM; + }else{ + 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); + + if( iEndpPhrase->aToken[0].isPrefix = 1; + iEnd++; + } + + while( 1 ){ + if( !sqlite3_fts3_enable_parentheses + && iStart>0 && z[iStart-1]=='-' + ){ + pParse->isNot = 1; + iStart--; + }else if( pParse->bFts4 && iStart>0 && z[iStart-1]=='^' ){ + pRet->pPhrase->aToken[0].bFirst = 1; + iStart--; + }else{ + break; + } + } + + } + *pnConsumed = iEnd; + }else if( i && rc==SQLITE_DONE ){ + rc = SQLITE_OK; + } + + pModule->xClose(pCursor); + } + + *ppExpr = pRet; + return rc; +} + + +/* +** Enlarge a memory allocation. If an out-of-memory allocation occurs, +** then free the old allocation. +*/ +static void *fts3ReallocOrFree(void *pOrig, int nNew){ + void *pRet = sqlite3_realloc(pOrig, nNew); + if( !pRet ){ + sqlite3_free(pOrig); + } + return pRet; +} + +/* +** 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. +** +** 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 */ +){ + 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; + + const int nSpace = sizeof(Fts3Expr) + sizeof(Fts3Phrase); + int nToken = 0; + + /* The final Fts3Expr data structure, including the Fts3Phrase, + ** Fts3PhraseToken structures token buffers are all stored as a single + ** allocation so that the expression can be freed with a single call to + ** sqlite3_free(). Setting this up requires a two pass approach. + ** + ** The first pass, in the block below, uses a tokenizer cursor to iterate + ** through the tokens in the expression. This pass uses fts3ReallocOrFree() + ** to assemble data in two dynamic buffers: + ** + ** Buffer p: Points to the Fts3Expr structure, followed by the Fts3Phrase + ** structure, followed by the array of Fts3PhraseToken + ** structures. This pass only populates the Fts3PhraseToken array. + ** + ** Buffer zTemp: Contains copies of all tokens. + ** + ** The second pass, in the block that begins "if( rc==SQLITE_DONE )" below, + ** appends buffer zTemp to buffer p, and fills in the Fts3Expr and Fts3Phrase + ** structures. + */ + rc = sqlite3Fts3OpenTokenizer( + pTokenizer, pParse->iLangid, zInput, nInput, &pCursor); + if( rc==SQLITE_OK ){ + int ii; + for(ii=0; rc==SQLITE_OK; ii++){ + const char *zByte; + int nByte = 0, iBegin = 0, iEnd = 0, iPos = 0; + rc = pModule->xNext(pCursor, &zByte, &nByte, &iBegin, &iEnd, &iPos); + if( rc==SQLITE_OK ){ + Fts3PhraseToken *pToken; + + p = fts3ReallocOrFree(p, nSpace + ii*sizeof(Fts3PhraseToken)); + if( !p ) goto no_mem; + + zTemp = fts3ReallocOrFree(zTemp, nTemp + nByte); + if( !zTemp ) goto no_mem; + + assert( nToken==ii ); + pToken = &((Fts3Phrase *)(&p[1]))->aToken[ii]; + memset(pToken, 0, sizeof(Fts3PhraseToken)); + + memcpy(&zTemp[nTemp], zByte, nByte); + nTemp += nByte; + + pToken->n = nByte; + pToken->isPrefix = (iEndbFirst = (iBegin>0 && zInput[iBegin-1]=='^'); + nToken = ii+1; + } + } + + pModule->xClose(pCursor); + pCursor = 0; + } + + if( rc==SQLITE_DONE ){ + int jj; + char *zBuf = 0; + + p = fts3ReallocOrFree(p, nSpace + nToken*sizeof(Fts3PhraseToken) + nTemp); + if( !p ) goto no_mem; + memset(p, 0, (char *)&(((Fts3Phrase *)&p[1])->aToken[0])-(char *)p); + p->eType = FTSQUERY_PHRASE; + p->pPhrase = (Fts3Phrase *)&p[1]; + p->pPhrase->iColumn = pParse->iDefaultCol; + p->pPhrase->nToken = nToken; + + zBuf = (char *)&p->pPhrase->aToken[nToken]; + if( zTemp ){ + memcpy(zBuf, zTemp, nTemp); + sqlite3_free(zTemp); + }else{ + assert( nTemp==0 ); + } + + for(jj=0; jjpPhrase->nToken; jj++){ + p->pPhrase->aToken[jj].z = zBuf; + zBuf += p->pPhrase->aToken[jj].n; + } + rc = SQLITE_OK; + } + + *ppExpr = p; + return rc; +no_mem: + + if( pCursor ){ + pModule->xClose(pCursor); + } + sqlite3_free(zTemp); + sqlite3_free(p); + *ppExpr = 0; + return SQLITE_NOMEM; +} + +/* +** 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 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; + + const char *zInput = z; + int nInput = n; + + pParse->isNot = 0; + + /* 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; + } + + /* 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; + } + + if( nInput>=pKey->n && 0==memcmp(zInput, pKey->z, pKey->n) ){ + int nNear = SQLITE_FTS3_DEFAULT_NEAR_PARAM; + int nKey = pKey->n; + char cNext; + + /* 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'); + } + } + } + + /* 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 *)fts3MallocZero(sizeof(Fts3Expr)); + if( !pRet ){ + return SQLITE_NOMEM; + } + pRet->eType = pKey->eType; + pRet->nNear = nNear; + *ppExpr = pRet; + *pnConsumed = (int)((zInput - z) + nKey); + return SQLITE_OK; + } + + /* Turns out that wasn't a keyword after all. This happens if the + ** user has supplied a token such as "ORacle". Continue. + */ + } + } + + /* 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; iinNest++; + 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; + }else if( *zInput==')' ){ + pParse->nNest--; + *pnConsumed = (int)((zInput - z) + 1); + *ppExpr = 0; + return SQLITE_DONE; + } + } + + /* 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. + */ + iCol = pParse->iDefaultCol; + 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; + } + } + 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. +*/ +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; +} + +/* +** 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 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 */ +){ + Fts3Expr *pSplit = pPrev; + while( pSplit->pParent && opPrecedence(pSplit->pParent)<=opPrecedence(pNew) ){ + pSplit = pSplit->pParent; + } + + if( pSplit->pParent ){ + assert( pSplit->pParent->pRight==pSplit ); + pSplit->pParent->pRight = pNew; + pNew->pParent = pSplit->pParent; + }else{ + *ppHead = pNew; + } + pNew->pLeft = pSplit; + pSplit->pParent = pNew; +} + +/* +** 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 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); + assert( nByte>0 || (rc!=SQLITE_OK && p==0) ); + if( rc==SQLITE_OK ){ + if( p ){ + int isPhrase; + + if( !sqlite3_fts3_enable_parentheses + && p->eType==FTSQUERY_PHRASE && pParse->isNot + ){ + /* Create an implicit NOT operator. */ + Fts3Expr *pNot = fts3MallocZero(sizeof(Fts3Expr)); + if( !pNot ){ + sqlite3Fts3ExprFree(p); + rc = SQLITE_NOMEM; + goto exprparse_out; + } + pNot->eType = FTSQUERY_NOT; + pNot->pRight = p; + p->pParent = pNot; + if( pNotBranch ){ + pNot->pLeft = pNotBranch; + pNotBranch->pParent = pNot; + } + pNotBranch = pNot; + p = pPrev; + }else{ + int eType = p->eType; + 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 = fts3MallocZero(sizeof(Fts3Expr)); + if( !pAnd ){ + sqlite3Fts3ExprFree(p); + rc = SQLITE_NOMEM; + goto exprparse_out; + } + 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; + } + pPrev = p; + } + assert( nByte>0 ); + } + assert( rc!=SQLITE_OK || (nByte>0 && nByte<=nIn) ); + nIn -= nByte; + zIn += nByte; + } + + if( rc==SQLITE_DONE && pRet && isRequirePhrase ){ + rc = SQLITE_ERROR; + } + + 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->pParent = pIter; + pRet = pNotBranch; + } + } + } + *pnConsumed = n - nIn; + +exprparse_out: + if( rc!=SQLITE_OK ){ + sqlite3Fts3ExprFree(pRet); + sqlite3Fts3ExprFree(pNotBranch); + pRet = 0; + } + *ppExpr = pRet; + return rc; +} + +/* +** Return SQLITE_ERROR if the maximum depth of the expression tree passed +** as the only argument is more than nMaxDepth. +*/ +static int fts3ExprCheckDepth(Fts3Expr *p, int nMaxDepth){ + int rc = SQLITE_OK; + if( p ){ + if( nMaxDepth<0 ){ + rc = SQLITE_TOOBIG; + }else{ + rc = fts3ExprCheckDepth(p->pLeft, nMaxDepth-1); + if( rc==SQLITE_OK ){ + rc = fts3ExprCheckDepth(p->pRight, nMaxDepth-1); + } + } + } + return rc; +} + +/* +** This function attempts to transform the expression tree at (*pp) to +** an equivalent but more balanced form. The tree is modified in place. +** If successful, SQLITE_OK is returned and (*pp) set to point to the +** new root expression node. +** +** nMaxDepth is the maximum allowable depth of the balanced sub-tree. +** +** Otherwise, if an error occurs, an SQLite error code is returned and +** expression (*pp) freed. +*/ +static int fts3ExprBalance(Fts3Expr **pp, int nMaxDepth){ + int rc = SQLITE_OK; /* Return code */ + Fts3Expr *pRoot = *pp; /* Initial root node */ + Fts3Expr *pFree = 0; /* List of free nodes. Linked by pParent. */ + int eType = pRoot->eType; /* Type of node in this tree */ + + if( nMaxDepth==0 ){ + rc = SQLITE_ERROR; + } + + if( rc==SQLITE_OK ){ + if( (eType==FTSQUERY_AND || eType==FTSQUERY_OR) ){ + Fts3Expr **apLeaf; + apLeaf = (Fts3Expr **)sqlite3_malloc(sizeof(Fts3Expr *) * nMaxDepth); + if( 0==apLeaf ){ + rc = SQLITE_NOMEM; + }else{ + memset(apLeaf, 0, sizeof(Fts3Expr *) * nMaxDepth); + } + + if( rc==SQLITE_OK ){ + int i; + Fts3Expr *p; + + /* Set $p to point to the left-most leaf in the tree of eType nodes. */ + for(p=pRoot; p->eType==eType; p=p->pLeft){ + assert( p->pParent==0 || p->pParent->pLeft==p ); + assert( p->pLeft && p->pRight ); + } + + /* This loop runs once for each leaf in the tree of eType nodes. */ + while( 1 ){ + int iLvl; + Fts3Expr *pParent = p->pParent; /* Current parent of p */ + + assert( pParent==0 || pParent->pLeft==p ); + p->pParent = 0; + if( pParent ){ + pParent->pLeft = 0; + }else{ + pRoot = 0; + } + rc = fts3ExprBalance(&p, nMaxDepth-1); + if( rc!=SQLITE_OK ) break; + + for(iLvl=0; p && iLvlpLeft = apLeaf[iLvl]; + pFree->pRight = p; + pFree->pLeft->pParent = pFree; + pFree->pRight->pParent = pFree; + + p = pFree; + pFree = pFree->pParent; + p->pParent = 0; + apLeaf[iLvl] = 0; + } + } + if( p ){ + sqlite3Fts3ExprFree(p); + rc = SQLITE_TOOBIG; + break; + } + + /* If that was the last leaf node, break out of the loop */ + if( pParent==0 ) break; + + /* Set $p to point to the next leaf in the tree of eType nodes */ + for(p=pParent->pRight; p->eType==eType; p=p->pLeft); + + /* Remove pParent from the original tree. */ + assert( pParent->pParent==0 || pParent->pParent->pLeft==pParent ); + pParent->pRight->pParent = pParent->pParent; + if( pParent->pParent ){ + pParent->pParent->pLeft = pParent->pRight; + }else{ + assert( pParent==pRoot ); + pRoot = pParent->pRight; + } + + /* Link pParent into the free node list. It will be used as an + ** internal node of the new tree. */ + pParent->pParent = pFree; + pFree = pParent; + } + + if( rc==SQLITE_OK ){ + p = 0; + for(i=0; ipParent = 0; + }else{ + assert( pFree!=0 ); + pFree->pRight = p; + pFree->pLeft = apLeaf[i]; + pFree->pLeft->pParent = pFree; + pFree->pRight->pParent = pFree; + + p = pFree; + pFree = pFree->pParent; + p->pParent = 0; + } + } + } + pRoot = p; + }else{ + /* An error occurred. Delete the contents of the apLeaf[] array + ** and pFree list. Everything else is cleaned up by the call to + ** sqlite3Fts3ExprFree(pRoot) below. */ + Fts3Expr *pDel; + for(i=0; ipParent; + sqlite3_free(pDel); + } + } + + assert( pFree==0 ); + sqlite3_free( apLeaf ); + } + }else if( eType==FTSQUERY_NOT ){ + Fts3Expr *pLeft = pRoot->pLeft; + Fts3Expr *pRight = pRoot->pRight; + + pRoot->pLeft = 0; + pRoot->pRight = 0; + pLeft->pParent = 0; + pRight->pParent = 0; + + rc = fts3ExprBalance(&pLeft, nMaxDepth-1); + if( rc==SQLITE_OK ){ + rc = fts3ExprBalance(&pRight, nMaxDepth-1); + } + + if( rc!=SQLITE_OK ){ + sqlite3Fts3ExprFree(pRight); + sqlite3Fts3ExprFree(pLeft); + }else{ + assert( pLeft && pRight ); + pRoot->pLeft = pLeft; + pLeft->pParent = pRoot; + pRoot->pRight = pRight; + pRight->pParent = pRoot; + } + } + } + + if( rc!=SQLITE_OK ){ + sqlite3Fts3ExprFree(pRoot); + pRoot = 0; + } + *pp = pRoot; + return rc; +} + +/* +** This function is similar to sqlite3Fts3ExprParse(), with the following +** differences: +** +** 1. It does not do expression rebalancing. +** 2. It does not check that the expression does not exceed the +** maximum allowable depth. +** 3. Even if it fails, *ppExpr may still be set to point to an +** expression tree. It should be deleted using sqlite3Fts3ExprFree() +** in this case. +*/ +static int fts3ExprParseUnbalanced( + sqlite3_tokenizer *pTokenizer, /* Tokenizer module */ + int iLangid, /* Language id for tokenizer */ + char **azCol, /* Array of column names for fts3 table */ + int bFts4, /* True to allow FTS4-only syntax */ + 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 */ +){ + int nParsed; + int rc; + ParseContext sParse; + + memset(&sParse, 0, sizeof(ParseContext)); + sParse.pTokenizer = pTokenizer; + sParse.iLangid = iLangid; + sParse.azCol = (const char **)azCol; + sParse.nCol = nCol; + sParse.iDefaultCol = iDefaultCol; + sParse.bFts4 = bFts4; + if( z==0 ){ + *ppExpr = 0; + return SQLITE_OK; + } + if( n<0 ){ + n = (int)strlen(z); + } + rc = fts3ExprParse(&sParse, z, n, ppExpr, &nParsed); + assert( rc==SQLITE_OK || *ppExpr==0 ); + + /* Check for mismatched parenthesis */ + if( rc==SQLITE_OK && sParse.nNest ){ + rc = SQLITE_ERROR; + } + + 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. +** +** 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(). +** +** 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. +** +** 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. +*/ +SQLITE_PRIVATE int sqlite3Fts3ExprParse( + sqlite3_tokenizer *pTokenizer, /* Tokenizer module */ + int iLangid, /* Language id for tokenizer */ + char **azCol, /* Array of column names for fts3 table */ + int bFts4, /* True to allow FTS4-only syntax */ + 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 */ + char **pzErr /* OUT: Error message (sqlite3_malloc) */ +){ + int rc = fts3ExprParseUnbalanced( + pTokenizer, iLangid, azCol, bFts4, nCol, iDefaultCol, z, n, ppExpr + ); + + /* Rebalance the expression. And check that its depth does not exceed + ** SQLITE_FTS3_MAX_EXPR_DEPTH. */ + if( rc==SQLITE_OK && *ppExpr ){ + rc = fts3ExprBalance(ppExpr, SQLITE_FTS3_MAX_EXPR_DEPTH); + if( rc==SQLITE_OK ){ + rc = fts3ExprCheckDepth(*ppExpr, SQLITE_FTS3_MAX_EXPR_DEPTH); + } + } + + if( rc!=SQLITE_OK ){ + sqlite3Fts3ExprFree(*ppExpr); + *ppExpr = 0; + if( rc==SQLITE_TOOBIG ){ + sqlite3Fts3ErrMsg(pzErr, + "FTS expression tree is too large (maximum depth %d)", + SQLITE_FTS3_MAX_EXPR_DEPTH + ); + rc = SQLITE_ERROR; + }else if( rc==SQLITE_ERROR ){ + sqlite3Fts3ErrMsg(pzErr, "malformed MATCH expression: [%s]", z); + } + } + + return rc; +} + +/* +** Free a single node of an expression tree. +*/ +static void fts3FreeExprNode(Fts3Expr *p){ + assert( p->eType==FTSQUERY_PHRASE || p->pPhrase==0 ); + sqlite3Fts3EvalPhraseCleanup(p->pPhrase); + sqlite3_free(p->aMI); + sqlite3_free(p); +} + +/* +** Free a parsed fts3 query expression allocated by sqlite3Fts3ExprParse(). +** +** This function would be simpler if it recursively called itself. But +** that would mean passing a sufficiently large expression to ExprParse() +** could cause a stack overflow. +*/ +SQLITE_PRIVATE void sqlite3Fts3ExprFree(Fts3Expr *pDel){ + Fts3Expr *p; + assert( pDel==0 || pDel->pParent==0 ); + for(p=pDel; p && (p->pLeft||p->pRight); p=(p->pLeft ? p->pLeft : p->pRight)){ + assert( p->pParent==0 || p==p->pParent->pRight || p==p->pParent->pLeft ); + } + while( p ){ + Fts3Expr *pParent = p->pParent; + fts3FreeExprNode(p); + if( pParent && p==pParent->pLeft && pParent->pRight ){ + p = pParent->pRight; + while( p && (p->pLeft || p->pRight) ){ + assert( p==p->pParent->pRight || p==p->pParent->pLeft ); + p = (p->pLeft ? p->pLeft : p->pRight); + } + }else{ + p = pParent; + } + } +} + +/**************************************************************************** +***************************************************************************** +** Everything after this point is just test code. +*/ + +#ifdef SQLITE_TEST + +/* #include */ + +/* +** Function to query the hash-table of tokenizers (see README.tokenizers). +*/ +static int queryTestTokenizer( + sqlite3 *db, + const char *zName, + const sqlite3_tokenizer_module **pp +){ + int rc; + sqlite3_stmt *pStmt; + const char zSql[] = "SELECT fts3_tokenizer(?)"; + + *pp = 0; + rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); + 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((void *)pp, sqlite3_column_blob(pStmt, 0), sizeof(*pp)); + } + } + + return sqlite3_finalize(pStmt); +} + +/* +** Return a pointer to a buffer containing a text representation of the +** expression passed as the first argument. The buffer is obtained from +** sqlite3_malloc(). It is the responsibility of the caller to use +** sqlite3_free() to release the memory. If an OOM condition is encountered, +** NULL is returned. +** +** If the second argument is not NULL, then its contents are prepended to +** the returned expression text and then freed using sqlite3_free(). +*/ +static char *exprToString(Fts3Expr *pExpr, char *zBuf){ + if( pExpr==0 ){ + return sqlite3_mprintf(""); + } + switch( pExpr->eType ){ + case FTSQUERY_PHRASE: { + Fts3Phrase *pPhrase = pExpr->pPhrase; + int i; + zBuf = sqlite3_mprintf( + "%zPHRASE %d 0", zBuf, pPhrase->iColumn); + for(i=0; zBuf && inToken; i++){ + zBuf = sqlite3_mprintf("%z %.*s%s", zBuf, + pPhrase->aToken[i].n, pPhrase->aToken[i].z, + (pPhrase->aToken[i].isPrefix?"+":"") + ); + } + return zBuf; + } + + case FTSQUERY_NEAR: + zBuf = sqlite3_mprintf("%zNEAR/%d ", zBuf, pExpr->nNear); + break; + case FTSQUERY_NOT: + zBuf = sqlite3_mprintf("%zNOT ", zBuf); + break; + case FTSQUERY_AND: + zBuf = sqlite3_mprintf("%zAND ", zBuf); + break; + case FTSQUERY_OR: + zBuf = sqlite3_mprintf("%zOR ", zBuf); + break; + } + + if( zBuf ) zBuf = sqlite3_mprintf("%z{", zBuf); + if( zBuf ) zBuf = exprToString(pExpr->pLeft, zBuf); + if( zBuf ) zBuf = sqlite3_mprintf("%z} {", zBuf); + + if( zBuf ) zBuf = exprToString(pExpr->pRight, zBuf); + if( zBuf ) zBuf = sqlite3_mprintf("%z}", zBuf); + + return zBuf; +} + +/* +** 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: +** +** SELECT fts3_exprtest('simple', 'Bill col2:Bloggs', 'col1', 'col2'); +*/ +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; + char *zBuf = 0; + sqlite3 *db = sqlite3_context_db_handle(context); + + if( argc<3 ){ + sqlite3_result_error(context, + "Usage: fts3_exprtest(tokenizer, expr, col1, ...", -1 + ); + return; + } + + 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; + } + + 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; + } + 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; iixDestroy(pTokenizer); + } + sqlite3_free(azCol); +} + +/* +** Register the query expression parser test function fts3_exprtest() +** with database connection db. +*/ +SQLITE_PRIVATE int sqlite3Fts3ExprInitTestInterface(sqlite3* db){ + int rc = sqlite3_create_function( + db, "fts3_exprtest", -1, SQLITE_UTF8, 0, fts3ExprTest, 0, 0 + ); + if( rc==SQLITE_OK ){ + rc = sqlite3_create_function(db, "fts3_exprtest_rebalance", + -1, SQLITE_UTF8, (void *)1, fts3ExprTest, 0, 0 + ); + } + return rc; +} + +#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. +*/ + +/* +** 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). +*/ +/* #include "fts3Int.h" */ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) + +/* #include */ +/* #include */ +/* #include */ + +/* #include "fts3_hash.h" */ + +/* +** Malloc and Free functions +*/ +static void *fts3HashMalloc(int n){ + void *p = sqlite3_malloc(n); + if( p ){ + memset(p, 0, n); + } + return p; +} +static void fts3HashFree(void *p){ + sqlite3_free(p); +} + +/* 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; +} + +/* 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( 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; + } + pH->count = 0; +} + +/* +** Hash and comparison functions when the mode is FTS3_HASH_STRING +*/ +static int fts3StrHash(const void *pKey, int nKey){ + const char *z = (const char *)pKey; + unsigned h = 0; + if( nKey<=0 ) nKey = (int) strlen(z); + while( nKey > 0 ){ + h = (h<<3) ^ h ^ *z++; + nKey--; + } + return (int)(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); +} + +/* +** 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); +} + +/* +** Return a pointer to the appropriate hash function given the key class. +** +** The C syntax in this function definition may be unfamilar to some +** programmers, so we provide the following additional explanation: +** +** 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". +*/ +static int (*ftsHashFunction(int keyClass))(const void*,int){ + if( keyClass==FTS3_HASH_STRING ){ + return &fts3StrHash; + }else{ + assert( keyClass==FTS3_HASH_BINARY ); + return &fts3BinHash; + } +} + +/* +** 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 (*ftsCompareFunction(int keyClass))(const void*,int,const void*,int){ + if( keyClass==FTS3_HASH_STRING ){ + return &fts3StrCompare; + }else{ + assert( keyClass==FTS3_HASH_BINARY ); + return &fts3BinCompare; + } +} + +/* 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{ + pNew->next = pH->first; + if( pH->first ){ pH->first->prev = pNew; } + pNew->prev = 0; + pH->first = pNew; + } + pEntry->count++; + pEntry->chain = pNew; +} + + +/* 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 */ + + 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); + } + return 0; +} + +/* 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 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 */ + + 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; +} + +/* Remove a single entry from the hash table given a pointer to that +** element and a hash on the element's key. +*/ +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{ + 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); + } +} + +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 */ + + 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)); +} + +/* +** 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. +*/ +SQLITE_PRIVATE void *sqlite3Fts3HashFind(const Fts3Hash *pH, const void *pKey, int nKey){ + Fts3HashElem *pElem; /* The element that matches key (if any) */ + + pElem = sqlite3Fts3HashFindElem(pH, pKey, nKey); + return pElem ? pElem->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. +*/ +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 */ + + 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; + } + 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; + } + 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; + } + 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) */ + +/************** 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: +** +** * 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). +*/ +/* #include "fts3Int.h" */ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) + +/* #include */ +/* #include */ +/* #include */ +/* #include */ + +/* #include "fts3_tokenizer.h" */ + +/* +** Class derived from sqlite3_tokenizer +*/ +typedef struct porter_tokenizer { + sqlite3_tokenizer base; /* Base class */ +} porter_tokenizer; + +/* +** Class derived from sqlite3_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; + + +/* +** Create a new tokenizer instance. +*/ +static int porterCreate( + int argc, const char * const *argv, + sqlite3_tokenizer **ppTokenizer +){ + porter_tokenizer *t; + + UNUSED_PARAMETER(argc); + UNUSED_PARAMETER(argv); + + t = (porter_tokenizer *) sqlite3_malloc(sizeof(*t)); + if( t==NULL ) return SQLITE_NOMEM; + memset(t, 0, sizeof(*t)); + *ppTokenizer = &t->base; + return SQLITE_OK; +} + +/* +** Destroy a tokenizer +*/ +static int porterDestroy(sqlite3_tokenizer *pTokenizer){ + sqlite3_free(pTokenizer); + return SQLITE_OK; +} + +/* +** 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; + + UNUSED_PARAMETER(pTokenizer); + + c = (porter_tokenizer_cursor *) sqlite3_malloc(sizeof(*c)); + if( c==NULL ) return SQLITE_NOMEM; + + 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; +} + +/* +** Close a tokenization cursor previously opened by a call to +** porterOpen() above. +*/ +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 +}; + +/* +** 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 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); +} + +/* +** 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 a consonant followed by a vowel. +*/ +static int m_gt_0(const char *z){ + while( isVowel(z) ){ z++; } + if( *z==0 ) return 0; + while( isConsonant(z) ){ z++; } + return *z!=0; +} + +/* 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; +} + +/* 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; +} + +/* +** Return TRUE if there is a vowel anywhere within z[0..n-1] +*/ +static int hasVowel(const char *z){ + while( isConsonant(z) ){ z++; } + return *z!=0; +} + +/* +** 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 doubleConsonant(const char *z){ + return isConsonant(z) && z[0]==z[1]; +} + +/* +** 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 star_oh(const char *z){ + return + isConsonant(z) && + z[0]!='w' && z[0]!='x' && z[0]!='y' && + isVowel(z+1) && + isConsonant(z+2); +} + +/* +** 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 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; +} + +/* +** 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 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; + } + } + mx = hasDigit ? 3 : 10; + if( nIn>mx*2 ){ + for(j=mx, i=nIn-mx; i=(int)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; + } + } + 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++; + } + } + + /* 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'; + } + + /* Step 2 */ + switch( z[1] ){ + case 'a': + if( !stem(&z, "lanoita", "ate", m_gt_0) ){ + stem(&z, "lanoit", "tion", m_gt_0); + } + break; + case 'c': + if( !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': + if( !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': + if( !stem(&z, "noitazi", "ize", m_gt_0) + && !stem(&z, "noita", "ate", m_gt_0) + ){ + stem(&z, "rota", "ate", m_gt_0); + } + break; + case 's': + if( !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': + if( !stem(&z, "itila", "al", m_gt_0) + && !stem(&z, "itivi", "ive", m_gt_0) + ){ + stem(&z, "itilib", "ble", m_gt_0); + } + break; + } + + /* Step 3 */ + switch( z[0] ){ + case 'e': + if( !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': + if( !stem(&z, "laci", "ic", m_gt_0) ){ + stem(&z, "luf", "", m_gt_0); + } + break; + case 's': + stem(&z, "ssen", "", m_gt_0); + break; + } + + /* 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' ){ + if( !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': + if( !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; + } + + /* 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++; + } + } + + /* Step 5b */ + if( m_gt_1(z) && z[0]=='l' && z[1]=='l' ){ + z++; + } + + /* z[] is now the stemmed word in reverse order. Flip it back + ** around into forward order and return. + */ + *pnOut = i = (int)strlen(z); + zOut[i] = 0; + while( *z ){ + zOut[--i] = *(z++); + } +} + +/* +** 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. +*/ +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])) + +/* +** Extract the next token from a tokenization cursor. The cursor must +** have been opened by a prior call to porterOpen(). +*/ +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 */ +){ + 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++; + } + + /* Count non-delimiter characters. */ + iStartOffset = c->iOffset; + while( c->iOffsetnInput && !isDelim(z[c->iOffset]) ){ + c->iOffset++; + } + + if( c->iOffset>iStartOffset ){ + int n = c->iOffset-iStartOffset; + if( n>c->nAllocated ){ + char *pNew; + c->nAllocated = n+20; + pNew = sqlite3_realloc(c->zToken, c->nAllocated); + if( !pNew ) return SQLITE_NOMEM; + c->zToken = pNew; + } + porter_stemmer(&z[iStartOffset], n, c->zToken, pnBytes); + *pzToken = c->zToken; + *piStartOffset = iStartOffset; + *piEndOffset = c->iOffset; + *piPosition = c->iToken++; + return SQLITE_OK; + } + } + 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, + 0 +}; + +/* +** 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; +} + +#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). +*/ +/* #include "fts3Int.h" */ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) + +/* #include */ +/* #include */ + +/* +** Return true if the two-argument version of fts3_tokenizer() +** has been activated via a prior call to sqlite3_db_config(db, +** SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER, 1, 0); +*/ +static int fts3TokenizerEnabled(sqlite3_context *context){ + sqlite3 *db = sqlite3_context_db_handle(context); + int isEnabled = 0; + sqlite3_db_config(db,SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER,-1,&isEnabled); + return isEnabled; +} + +/* +** 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 void fts3TokenizerFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + Fts3Hash *pHash; + void *pPtr = 0; + const unsigned char *zName; + int nName; + + assert( argc==1 || argc==2 ); + + pHash = (Fts3Hash *)sqlite3_user_data(context); + + zName = sqlite3_value_text(argv[0]); + nName = sqlite3_value_bytes(argv[0])+1; + + if( argc==2 ){ + if( fts3TokenizerEnabled(context) ){ + void *pOld; + int n = sqlite3_value_bytes(argv[1]); + if( zName==0 || 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); + } + }else{ + sqlite3_result_error(context, "fts3tokenize disabled", -1); + return; + } + }else{ + if( zName ){ + 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_blob(context, (void *)&pPtr, sizeof(pPtr), SQLITE_TRANSIENT); +} + +SQLITE_PRIVATE int sqlite3Fts3IsIdChar(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; + + default: + if( sqlite3Fts3IsIdChar(*z1) ){ + z2 = &z1[1]; + while( sqlite3Fts3IsIdChar(*z2) ) z2++; + }else{ + z1++; + } + } + } + + *pn = (int)(z2-z1); + return z1; +} + +SQLITE_PRIVATE int sqlite3Fts3InitTokenizer( + Fts3Hash *pHash, /* Tokenizer hash table */ + const char *zArg, /* Tokenizer name */ + sqlite3_tokenizer **ppTok, /* OUT: Tokenizer (if applicable) */ + char **pzErr /* OUT: Set to malloced error message */ +){ + int rc; + char *z = (char *)zArg; + int n = 0; + char *zCopy; + char *zEnd; /* Pointer to nul-term of zCopy */ + sqlite3_tokenizer_module *m; + + zCopy = sqlite3_mprintf("%s", zArg); + if( !zCopy ) return SQLITE_NOMEM; + zEnd = &zCopy[strlen(zCopy)]; + + z = (char *)sqlite3Fts3NextToken(zCopy, &n); + if( z==0 ){ + assert( n==0 ); + z = zCopy; + } + z[n] = '\0'; + sqlite3Fts3Dequote(z); + + m = (sqlite3_tokenizer_module *)sqlite3Fts3HashFind(pHash,z,(int)strlen(z)+1); + if( !m ){ + sqlite3Fts3ErrMsg(pzErr, "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 ){ + sqlite3Fts3ErrMsg(pzErr, "unknown tokenizer"); + }else{ + (*ppTok)->pModule = m; + } + sqlite3_free((void *)aArg); + } + + sqlite3_free(zCopy); + return rc; +} + + +#ifdef SQLITE_TEST + +#if defined(INCLUDE_SQLITE_TCL_H) +# include "sqlite_tcl.h" +#else +# include "tcl.h" +#endif +/* #include */ + +/* +** 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 or more arguments: +** +** 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; + + const char *zErr = 0; + + const char *zName; + int nName; + const char *zInput; + int nInput; + + const char *azArg[64]; + + const char *zToken; + int nToken = 0; + int iStart = 0; + int iEnd = 0; + int iPos = 0; + int i; + + Tcl_Obj *pRet; + + if( argc<2 ){ + sqlite3_result_error(context, "insufficient arguments", -1); + return; + } + + 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]); + + pHash = (Fts3Hash *)sqlite3_user_data(context); + p = (sqlite3_tokenizer_module *)sqlite3Fts3HashFind(pHash, zName, nName+1); + + if( !p ){ + char *zErr2 = sqlite3_mprintf("unknown tokenizer: %s", zName); + sqlite3_result_error(context, zErr2, -1); + sqlite3_free(zErr2); + return; + } + + pRet = Tcl_NewObj(); + Tcl_IncrRefCount(pRet); + + for(i=1; ixCreate(argc-2, azArg, &pTokenizer) ){ + zErr = "error in xCreate()"; + goto finish; + } + pTokenizer->pModule = p; + if( sqlite3Fts3OpenTokenizer(pTokenizer, 0, zInput, nInput, &pCsr) ){ + zErr = "error in xOpen()"; + goto finish; + } + + 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)); + } + + if( SQLITE_OK!=p->xClose(pCsr) ){ + zErr = "error in xClose()"; + goto finish; + } + if( SQLITE_OK!=p->xDestroy(pTokenizer) ){ + zErr = "error in xDestroy()"; + goto finish; + } + +finish: + if( zErr ){ + sqlite3_result_error(context, zErr, -1); + }else{ + sqlite3_result_text(context, Tcl_GetString(pRet), -1, SQLITE_TRANSIENT); + } + Tcl_DecrRefCount(pRet); +} + +static +int registerTokenizer( + sqlite3 *db, + char *zName, + const sqlite3_tokenizer_module *p +){ + int rc; + sqlite3_stmt *pStmt; + const char zSql[] = "SELECT fts3_tokenizer(?, ?)"; + + rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); + if( rc!=SQLITE_OK ){ + return rc; + } + + sqlite3_bind_text(pStmt, 1, zName, -1, SQLITE_STATIC); + sqlite3_bind_blob(pStmt, 2, &p, sizeof(p), SQLITE_STATIC); + sqlite3_step(pStmt); + + return sqlite3_finalize(pStmt); +} + + +static +int queryTokenizer( + sqlite3 *db, + char *zName, + const sqlite3_tokenizer_module **pp +){ + int rc; + sqlite3_stmt *pStmt; + const char zSql[] = "SELECT fts3_tokenizer(?)"; + + *pp = 0; + rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); + 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((void *)pp, sqlite3_column_blob(pStmt, 0), sizeof(*pp)); + } + } + + return sqlite3_finalize(pStmt); +} + +SQLITE_PRIVATE void sqlite3Fts3SimpleTokenizerModule(sqlite3_tokenizer_module const**ppModule); + +/* +** 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 +){ + int rc; + const sqlite3_tokenizer_module *p1; + const sqlite3_tokenizer_module *p2; + sqlite3 *db = (sqlite3 *)sqlite3_user_data(context); + + UNUSED_PARAMETER(argc); + UNUSED_PARAMETER(argv); + + /* 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") ); + + /* Test the storage function */ + if( fts3TokenizerEnabled(context) ){ + 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); +} + +#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 initialized 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 +** fts3TokenizerFunc() 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 +){ + int rc = SQLITE_OK; + void *p = (void *)pHash; + const int any = SQLITE_ANY; + +#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 + + if( SQLITE_OK==rc ){ + rc = sqlite3_create_function(db, zName, 1, any, p, fts3TokenizerFunc, 0, 0); + } + if( SQLITE_OK==rc ){ + rc = sqlite3_create_function(db, zName, 2, any, p, fts3TokenizerFunc, 0, 0); + } +#ifdef SQLITE_TEST + if( SQLITE_OK==rc ){ + rc = sqlite3_create_function(db, zTest, -1, any, p, testFunc, 0, 0); + } + if( SQLITE_OK==rc ){ + rc = sqlite3_create_function(db, zTest2, 0, any, pdb, intTestFunc, 0, 0); + } +#endif + +#ifdef SQLITE_TEST + sqlite3_free(zTest); + sqlite3_free(zTest2); +#endif + + return rc; +} + +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */ + +/************** End of fts3_tokenizer.c **************************************/ +/************** Begin file fts3_tokenizer1.c *********************************/ +/* +** 2006 Oct 10 +** +** 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 "simple" full-text-search tokenizer. +*/ + +/* +** 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). +*/ +/* #include "fts3Int.h" */ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) + +/* #include */ +/* #include */ +/* #include */ +/* #include */ + +/* #include "fts3_tokenizer.h" */ + +typedef struct simple_tokenizer { + sqlite3_tokenizer base; + char delim[128]; /* flag ASCII delimiters */ +} simple_tokenizer; + +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; + + +static int simpleDelim(simple_tokenizer *t, unsigned char c){ + return c<0x80 && t->delim[c]; +} +static int fts3_isalnum(int x){ + return (x>='0' && x<='9') || (x>='A' && x<='Z') || (x>='a' && x<='z'); +} + +/* +** Create a new tokenizer instance. +*/ +static int simpleCreate( + int argc, const char * const *argv, + sqlite3_tokenizer **ppTokenizer +){ + simple_tokenizer *t; + + t = (simple_tokenizer *) sqlite3_malloc(sizeof(*t)); + if( t==NULL ) return SQLITE_NOMEM; + memset(t, 0, sizeof(*t)); + + /* 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; + } + t->delim[ch] = 1; + } + } else { + /* Mark non-alphanumeric ASCII characters as delimiters */ + int i; + for(i=1; i<0x80; i++){ + t->delim[i] = !fts3_isalnum(i) ? -1 : 0; + } + } + + *ppTokenizer = &t->base; + return SQLITE_OK; +} + +/* +** Destroy a tokenizer +*/ +static int simpleDestroy(sqlite3_tokenizer *pTokenizer){ + sqlite3_free(pTokenizer); + 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 */ +){ + simple_tokenizer_cursor *c; + + UNUSED_PARAMETER(pTokenizer); + + c = (simple_tokenizer_cursor *) sqlite3_malloc(sizeof(*c)); + if( c==NULL ) 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; + + *ppCursor = &c->base; + return SQLITE_OK; +} + +/* +** 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; +} + +/* +** 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; + + while( c->iOffsetnBytes ){ + int iStartOffset; + + /* Scan past delimiter characters */ + while( c->iOffsetnBytes && simpleDelim(t, p[c->iOffset]) ){ + c->iOffset++; + } + + /* Count non-delimiter characters. */ + iStartOffset = c->iOffset; + while( c->iOffsetnBytes && !simpleDelim(t, p[c->iOffset]) ){ + c->iOffset++; + } + + if( c->iOffset>iStartOffset ){ + int i, n = c->iOffset-iStartOffset; + if( n>c->nTokenAllocated ){ + char *pNew; + c->nTokenAllocated = n+20; + pNew = sqlite3_realloc(c->pToken, c->nTokenAllocated); + if( !pNew ) return SQLITE_NOMEM; + c->pToken = pNew; + } + for(i=0; ipToken[i] = (char)((ch>='A' && ch<='Z') ? ch-'A'+'a' : ch); + } + *ppToken = c->pToken; + *pnBytes = n; + *piStartOffset = iStartOffset; + *piEndOffset = c->iOffset; + *piPosition = c->iToken++; + + return SQLITE_OK; + } + } + return SQLITE_DONE; +} + +/* +** The set of routines that implement the simple tokenizer +*/ +static const sqlite3_tokenizer_module simpleTokenizerModule = { + 0, + simpleCreate, + simpleDestroy, + simpleOpen, + simpleClose, + simpleNext, + 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; +} + +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */ + +/************** End of fts3_tokenizer1.c *************************************/ +/************** Begin file fts3_tokenize_vtab.c ******************************/ +/* +** 2013 Apr 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 file contains code for the "fts3tokenize" virtual table module. +** An fts3tokenize virtual table is created as follows: +** +** CREATE VIRTUAL TABLE USING fts3tokenize( +** , , ... +** ); +** +** The table created has the following schema: +** +** CREATE TABLE (input, token, start, end, position) +** +** When queried, the query must include a WHERE clause of type: +** +** input = +** +** The virtual table module tokenizes this , using the FTS3 +** tokenizer specified by the arguments to the CREATE VIRTUAL TABLE +** statement and returns one row for each token in the result. With +** fields set as follows: +** +** input: Always set to a copy of +** token: A token from the input. +** start: Byte offset of the token within the input . +** end: Byte offset of the byte immediately following the end of the +** token within the input string. +** pos: Token offset of token within input. +** +*/ +/* #include "fts3Int.h" */ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) + +/* #include */ +/* #include */ + +typedef struct Fts3tokTable Fts3tokTable; +typedef struct Fts3tokCursor Fts3tokCursor; + +/* +** Virtual table structure. +*/ +struct Fts3tokTable { + sqlite3_vtab base; /* Base class used by SQLite core */ + const sqlite3_tokenizer_module *pMod; + sqlite3_tokenizer *pTok; +}; + +/* +** Virtual table cursor structure. +*/ +struct Fts3tokCursor { + sqlite3_vtab_cursor base; /* Base class used by SQLite core */ + char *zInput; /* Input string */ + sqlite3_tokenizer_cursor *pCsr; /* Cursor to iterate through zInput */ + int iRowid; /* Current 'rowid' value */ + const char *zToken; /* Current 'token' value */ + int nToken; /* Size of zToken in bytes */ + int iStart; /* Current 'start' value */ + int iEnd; /* Current 'end' value */ + int iPos; /* Current 'pos' value */ +}; + +/* +** Query FTS for the tokenizer implementation named zName. +*/ +static int fts3tokQueryTokenizer( + Fts3Hash *pHash, + const char *zName, + const sqlite3_tokenizer_module **pp, + char **pzErr +){ + sqlite3_tokenizer_module *p; + int nName = (int)strlen(zName); + + p = (sqlite3_tokenizer_module *)sqlite3Fts3HashFind(pHash, zName, nName+1); + if( !p ){ + sqlite3Fts3ErrMsg(pzErr, "unknown tokenizer: %s", zName); + return SQLITE_ERROR; + } + + *pp = p; + return SQLITE_OK; +} + +/* +** The second argument, argv[], is an array of pointers to nul-terminated +** strings. This function makes a copy of the array and strings into a +** single block of memory. It then dequotes any of the strings that appear +** to be quoted. +** +** If successful, output parameter *pazDequote is set to point at the +** array of dequoted strings and SQLITE_OK is returned. The caller is +** responsible for eventually calling sqlite3_free() to free the array +** in this case. Or, if an error occurs, an SQLite error code is returned. +** The final value of *pazDequote is undefined in this case. +*/ +static int fts3tokDequoteArray( + int argc, /* Number of elements in argv[] */ + const char * const *argv, /* Input array */ + char ***pazDequote /* Output array */ +){ + int rc = SQLITE_OK; /* Return code */ + if( argc==0 ){ + *pazDequote = 0; + }else{ + int i; + int nByte = 0; + char **azDequote; + + for(i=0; ixCreate((nDequote>1 ? nDequote-1 : 0), azArg, &pTok); + } + + if( rc==SQLITE_OK ){ + pTab = (Fts3tokTable *)sqlite3_malloc(sizeof(Fts3tokTable)); + if( pTab==0 ){ + rc = SQLITE_NOMEM; + } + } + + if( rc==SQLITE_OK ){ + memset(pTab, 0, sizeof(Fts3tokTable)); + pTab->pMod = pMod; + pTab->pTok = pTok; + *ppVtab = &pTab->base; + }else{ + if( pTok ){ + pMod->xDestroy(pTok); + } + } + + sqlite3_free(azDequote); + return rc; +} + +/* +** This function does the work for both the xDisconnect and xDestroy methods. +** These tables have no persistent representation of their own, so xDisconnect +** and xDestroy are identical operations. +*/ +static int fts3tokDisconnectMethod(sqlite3_vtab *pVtab){ + Fts3tokTable *pTab = (Fts3tokTable *)pVtab; + + pTab->pMod->xDestroy(pTab->pTok); + sqlite3_free(pTab); + return SQLITE_OK; +} + +/* +** xBestIndex - Analyze a WHERE and ORDER BY clause. +*/ +static int fts3tokBestIndexMethod( + sqlite3_vtab *pVTab, + sqlite3_index_info *pInfo +){ + int i; + UNUSED_PARAMETER(pVTab); + + for(i=0; inConstraint; i++){ + if( pInfo->aConstraint[i].usable + && pInfo->aConstraint[i].iColumn==0 + && pInfo->aConstraint[i].op==SQLITE_INDEX_CONSTRAINT_EQ + ){ + pInfo->idxNum = 1; + pInfo->aConstraintUsage[i].argvIndex = 1; + pInfo->aConstraintUsage[i].omit = 1; + pInfo->estimatedCost = 1; + return SQLITE_OK; + } + } + + pInfo->idxNum = 0; + assert( pInfo->estimatedCost>1000000.0 ); + + return SQLITE_OK; +} + +/* +** xOpen - Open a cursor. +*/ +static int fts3tokOpenMethod(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCsr){ + Fts3tokCursor *pCsr; + UNUSED_PARAMETER(pVTab); + + pCsr = (Fts3tokCursor *)sqlite3_malloc(sizeof(Fts3tokCursor)); + if( pCsr==0 ){ + return SQLITE_NOMEM; + } + memset(pCsr, 0, sizeof(Fts3tokCursor)); + + *ppCsr = (sqlite3_vtab_cursor *)pCsr; + return SQLITE_OK; +} + +/* +** Reset the tokenizer cursor passed as the only argument. As if it had +** just been returned by fts3tokOpenMethod(). +*/ +static void fts3tokResetCursor(Fts3tokCursor *pCsr){ + if( pCsr->pCsr ){ + Fts3tokTable *pTab = (Fts3tokTable *)(pCsr->base.pVtab); + pTab->pMod->xClose(pCsr->pCsr); + pCsr->pCsr = 0; + } + sqlite3_free(pCsr->zInput); + pCsr->zInput = 0; + pCsr->zToken = 0; + pCsr->nToken = 0; + pCsr->iStart = 0; + pCsr->iEnd = 0; + pCsr->iPos = 0; + pCsr->iRowid = 0; +} + +/* +** xClose - Close a cursor. +*/ +static int fts3tokCloseMethod(sqlite3_vtab_cursor *pCursor){ + Fts3tokCursor *pCsr = (Fts3tokCursor *)pCursor; + + fts3tokResetCursor(pCsr); + sqlite3_free(pCsr); + return SQLITE_OK; +} + +/* +** xNext - Advance the cursor to the next row, if any. +*/ +static int fts3tokNextMethod(sqlite3_vtab_cursor *pCursor){ + Fts3tokCursor *pCsr = (Fts3tokCursor *)pCursor; + Fts3tokTable *pTab = (Fts3tokTable *)(pCursor->pVtab); + int rc; /* Return code */ + + pCsr->iRowid++; + rc = pTab->pMod->xNext(pCsr->pCsr, + &pCsr->zToken, &pCsr->nToken, + &pCsr->iStart, &pCsr->iEnd, &pCsr->iPos + ); + + if( rc!=SQLITE_OK ){ + fts3tokResetCursor(pCsr); + if( rc==SQLITE_DONE ) rc = SQLITE_OK; + } + + return rc; +} + +/* +** xFilter - Initialize a cursor to point at the start of its data. +*/ +static int fts3tokFilterMethod( + 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 */ +){ + int rc = SQLITE_ERROR; + Fts3tokCursor *pCsr = (Fts3tokCursor *)pCursor; + Fts3tokTable *pTab = (Fts3tokTable *)(pCursor->pVtab); + UNUSED_PARAMETER(idxStr); + UNUSED_PARAMETER(nVal); + + fts3tokResetCursor(pCsr); + if( idxNum==1 ){ + const char *zByte = (const char *)sqlite3_value_text(apVal[0]); + int nByte = sqlite3_value_bytes(apVal[0]); + pCsr->zInput = sqlite3_malloc(nByte+1); + if( pCsr->zInput==0 ){ + rc = SQLITE_NOMEM; + }else{ + memcpy(pCsr->zInput, zByte, nByte); + pCsr->zInput[nByte] = 0; + rc = pTab->pMod->xOpen(pTab->pTok, pCsr->zInput, nByte, &pCsr->pCsr); + if( rc==SQLITE_OK ){ + pCsr->pCsr->pTokenizer = pTab->pTok; + } + } + } + + if( rc!=SQLITE_OK ) return rc; + return fts3tokNextMethod(pCursor); +} + +/* +** xEof - Return true if the cursor is at EOF, or false otherwise. +*/ +static int fts3tokEofMethod(sqlite3_vtab_cursor *pCursor){ + Fts3tokCursor *pCsr = (Fts3tokCursor *)pCursor; + return (pCsr->zToken==0); +} + +/* +** xColumn - Return a column value. +*/ +static int fts3tokColumnMethod( + sqlite3_vtab_cursor *pCursor, /* Cursor to retrieve value from */ + sqlite3_context *pCtx, /* Context for sqlite3_result_xxx() calls */ + int iCol /* Index of column to read value from */ +){ + Fts3tokCursor *pCsr = (Fts3tokCursor *)pCursor; + + /* CREATE TABLE x(input, token, start, end, position) */ + switch( iCol ){ + case 0: + sqlite3_result_text(pCtx, pCsr->zInput, -1, SQLITE_TRANSIENT); + break; + case 1: + sqlite3_result_text(pCtx, pCsr->zToken, pCsr->nToken, SQLITE_TRANSIENT); + break; + case 2: + sqlite3_result_int(pCtx, pCsr->iStart); + break; + case 3: + sqlite3_result_int(pCtx, pCsr->iEnd); + break; + default: + assert( iCol==4 ); + sqlite3_result_int(pCtx, pCsr->iPos); + break; + } + return SQLITE_OK; +} + +/* +** xRowid - Return the current rowid for the cursor. +*/ +static int fts3tokRowidMethod( + sqlite3_vtab_cursor *pCursor, /* Cursor to retrieve value from */ + sqlite_int64 *pRowid /* OUT: Rowid value */ +){ + Fts3tokCursor *pCsr = (Fts3tokCursor *)pCursor; + *pRowid = (sqlite3_int64)pCsr->iRowid; + return SQLITE_OK; +} + +/* +** Register the fts3tok module with database connection db. Return SQLITE_OK +** if successful or an error code if sqlite3_create_module() fails. +*/ +SQLITE_PRIVATE int sqlite3Fts3InitTok(sqlite3 *db, Fts3Hash *pHash){ + static const sqlite3_module fts3tok_module = { + 0, /* iVersion */ + fts3tokConnectMethod, /* xCreate */ + fts3tokConnectMethod, /* xConnect */ + fts3tokBestIndexMethod, /* xBestIndex */ + fts3tokDisconnectMethod, /* xDisconnect */ + fts3tokDisconnectMethod, /* xDestroy */ + fts3tokOpenMethod, /* xOpen */ + fts3tokCloseMethod, /* xClose */ + fts3tokFilterMethod, /* xFilter */ + fts3tokNextMethod, /* xNext */ + fts3tokEofMethod, /* xEof */ + fts3tokColumnMethod, /* xColumn */ + fts3tokRowidMethod, /* xRowid */ + 0, /* xUpdate */ + 0, /* xBegin */ + 0, /* xSync */ + 0, /* xCommit */ + 0, /* xRollback */ + 0, /* xFindFunction */ + 0, /* xRename */ + 0, /* xSavepoint */ + 0, /* xRelease */ + 0 /* xRollbackTo */ + }; + int rc; /* Return code */ + + rc = sqlite3_create_module(db, "fts3tokenize", &fts3tok_module, (void*)pHash); + return rc; +} + +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */ + +/************** End of fts3_tokenize_vtab.c **********************************/ +/************** Begin file fts3_write.c **************************************/ +/* +** 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. +** +****************************************************************************** +** +** 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. +*/ + +/* #include "fts3Int.h" */ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) + +/* #include */ +/* #include */ +/* #include */ + + +#define FTS_MAX_APPENDABLE_HEIGHT 16 + +/* +** When full-text index nodes are loaded from disk, the buffer that they +** are loaded into has the following number of bytes of padding at the end +** of it. i.e. if a full-text index node is 900 bytes in size, then a buffer +** of 920 bytes is allocated for it. +** +** This means that if we have a pointer into a buffer containing node data, +** it is always safe to read up to two varints from it without risking an +** overread, even if the node data is corrupted. +*/ +#define FTS3_NODE_PADDING (FTS3_VARINT_MAX*2) + +/* +** Under certain circumstances, b-tree nodes (doclists) can be loaded into +** memory incrementally instead of all at once. This can be a big performance +** win (reduced IO and CPU) if SQLite stops calling the virtual table xNext() +** method before retrieving all query results (as may happen, for example, +** if a query has a LIMIT clause). +** +** Incremental loading is used for b-tree nodes FTS3_NODE_CHUNK_THRESHOLD +** bytes and larger. Nodes are loaded in chunks of FTS3_NODE_CHUNKSIZE bytes. +** The code is written so that the hard lower-limit for each of these values +** is 1. Clearly such small values would be inefficient, but can be useful +** for testing purposes. +** +** If this module is built with SQLITE_TEST defined, these constants may +** be overridden at runtime for testing purposes. File fts3_test.c contains +** a Tcl interface to read and write the values. +*/ +#ifdef SQLITE_TEST +int test_fts3_node_chunksize = (4*1024); +int test_fts3_node_chunk_threshold = (4*1024)*4; +# define FTS3_NODE_CHUNKSIZE test_fts3_node_chunksize +# define FTS3_NODE_CHUNK_THRESHOLD test_fts3_node_chunk_threshold +#else +# define FTS3_NODE_CHUNKSIZE (4*1024) +# define FTS3_NODE_CHUNK_THRESHOLD (FTS3_NODE_CHUNKSIZE*4) +#endif + +/* +** The two values that may be meaningfully bound to the :1 parameter in +** statements SQL_REPLACE_STAT and SQL_SELECT_STAT. +*/ +#define FTS_STAT_DOCTOTAL 0 +#define FTS_STAT_INCRMERGEHINT 1 +#define FTS_STAT_AUTOINCRMERGE 2 + +/* +** If FTS_LOG_MERGES is defined, call sqlite3_log() to report each automatic +** and incremental merge operation that takes place. This is used for +** debugging FTS only, it should not usually be turned on in production +** systems. +*/ +#ifdef FTS3_LOG_MERGES +static void fts3LogMerge(int nMerge, sqlite3_int64 iAbsLevel){ + sqlite3_log(SQLITE_OK, "%d-way merge from level %d", nMerge, (int)iAbsLevel); +} +#else +#define fts3LogMerge(x, y) +#endif + + +typedef struct PendingList PendingList; +typedef struct SegmentNode SegmentNode; +typedef struct SegmentWriter SegmentWriter; + +/* +** An instance of the following data structure is used to build doclists +** incrementally. See function fts3PendingListAppend() for details. +*/ +struct PendingList { + int nData; + char *aData; + int nSpace; + sqlite3_int64 iLastDocid; + sqlite3_int64 iLastCol; + sqlite3_int64 iLastPos; +}; + + +/* +** Each cursor has a (possibly empty) linked list of the following objects. +*/ +struct Fts3DeferredToken { + Fts3PhraseToken *pToken; /* Pointer to corresponding expr token */ + int iCol; /* Column token must occur in */ + Fts3DeferredToken *pNext; /* Next in list of deferred tokens */ + PendingList *pList; /* Doclist is assembled here */ +}; + +/* +** 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 */ + u8 bLookup; /* True for a lookup only */ + u8 rootOnly; /* True for a root-only reader */ + + sqlite3_int64 iStartBlock; /* Rowid of first leaf block to traverse */ + sqlite3_int64 iLeafEndBlock; /* Rowid of final leaf block to traverse */ + sqlite3_int64 iEndBlock; /* Rowid of final block in segment (or 0) */ + sqlite3_int64 iCurrentBlock; /* Current leaf block (or 0) */ + + char *aNode; /* Pointer to node data (or NULL) */ + int nNode; /* Size of buffer at aNode (or 0) */ + int nPopulate; /* If >0, bytes of buffer aNode[] loaded */ + sqlite3_blob *pBlob; /* If not NULL, blob handle to read node */ + + 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 */ + int nTermAlloc; /* Allocated size of zTerm buffer */ + char *aDoclist; /* Pointer to doclist of current entry */ + int nDoclist; /* Size of doclist in current entry */ + + /* The following variables are used by fts3SegReaderNextDocid() to iterate + ** through the current doclist (aDoclist/nDoclist). + */ + char *pOffsetList; + int nOffsetList; /* For descending pending seg-readers only */ + sqlite3_int64 iDocid; +}; + +#define fts3SegReaderIsPending(p) ((p)->ppNextElem!=0) +#define fts3SegReaderIsRootOnly(p) ((p)->rootOnly!=0) + +/* +** 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: +** +** fts3SegWriterAdd() +** fts3SegWriterFlush() +** fts3SegWriterFree() +*/ +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() */ + i64 nLeafData; /* Number of bytes of leaf data written */ +}; + +/* +** 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() +** +** When a b+tree is written to the database (either as a result of a merge +** or the pending-terms table being flushed), leaves are written into the +** database file as soon as they are completely populated. The interior of +** the tree is assembled in memory and written out only once all leaves have +** been populated and stored. This is Ok, as the b+-tree fanout is usually +** very large, meaning that the interior of the tree consumes relatively +** little memory. +*/ +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 */ +}; + +/* +** 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_DELETE_ALL_DOCSIZE 5 +#define SQL_DELETE_ALL_STAT 6 +#define SQL_SELECT_CONTENT_BY_ROWID 7 +#define SQL_NEXT_SEGMENT_INDEX 8 +#define SQL_INSERT_SEGMENTS 9 +#define SQL_NEXT_SEGMENTS_ID 10 +#define SQL_INSERT_SEGDIR 11 +#define SQL_SELECT_LEVEL 12 +#define SQL_SELECT_LEVEL_RANGE 13 +#define SQL_SELECT_LEVEL_COUNT 14 +#define SQL_SELECT_SEGDIR_MAX_LEVEL 15 +#define SQL_DELETE_SEGDIR_LEVEL 16 +#define SQL_DELETE_SEGMENTS_RANGE 17 +#define SQL_CONTENT_INSERT 18 +#define SQL_DELETE_DOCSIZE 19 +#define SQL_REPLACE_DOCSIZE 20 +#define SQL_SELECT_DOCSIZE 21 +#define SQL_SELECT_STAT 22 +#define SQL_REPLACE_STAT 23 + +#define SQL_SELECT_ALL_PREFIX_LEVEL 24 +#define SQL_DELETE_ALL_TERMS_SEGDIR 25 +#define SQL_DELETE_SEGDIR_RANGE 26 +#define SQL_SELECT_ALL_LANGID 27 +#define SQL_FIND_MERGE_LEVEL 28 +#define SQL_MAX_LEAF_NODE_ESTIMATE 29 +#define SQL_DELETE_SEGDIR_ENTRY 30 +#define SQL_SHIFT_SEGDIR_ENTRY 31 +#define SQL_SELECT_SEGDIR 32 +#define SQL_CHOMP_SEGDIR 33 +#define SQL_SEGMENT_IS_APPENDABLE 34 +#define SQL_SELECT_INDEXES 35 +#define SQL_SELECT_MXLEVEL 36 + +#define SQL_SELECT_LEVEL_RANGE2 37 +#define SQL_UPDATE_LEVEL_IDX 38 +#define SQL_UPDATE_LEVEL 39 + +/* +** 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 */ "DELETE FROM %Q.'%q_docsize'", +/* 6 */ "DELETE FROM %Q.'%q_stat'", +/* 7 */ "SELECT %s WHERE rowid=?", +/* 8 */ "SELECT (SELECT max(idx) FROM %Q.'%q_segdir' WHERE level = ?) + 1", +/* 9 */ "REPLACE INTO %Q.'%q_segments'(blockid, block) VALUES(?, ?)", +/* 10 */ "SELECT coalesce((SELECT max(blockid) FROM %Q.'%q_segments') + 1, 1)", +/* 11 */ "REPLACE INTO %Q.'%q_segdir' VALUES(?,?,?,?,?,?)", + + /* Return segments in order from oldest to newest.*/ +/* 12 */ "SELECT idx, start_block, leaves_end_block, end_block, root " + "FROM %Q.'%q_segdir' WHERE level = ? ORDER BY idx ASC", +/* 13 */ "SELECT idx, start_block, leaves_end_block, end_block, root " + "FROM %Q.'%q_segdir' WHERE level BETWEEN ? AND ?" + "ORDER BY level DESC, idx ASC", + +/* 14 */ "SELECT count(*) FROM %Q.'%q_segdir' WHERE level = ?", +/* 15 */ "SELECT max(level) FROM %Q.'%q_segdir' WHERE level BETWEEN ? AND ?", + +/* 16 */ "DELETE FROM %Q.'%q_segdir' WHERE level = ?", +/* 17 */ "DELETE FROM %Q.'%q_segments' WHERE blockid BETWEEN ? AND ?", +/* 18 */ "INSERT INTO %Q.'%q_content' VALUES(%s)", +/* 19 */ "DELETE FROM %Q.'%q_docsize' WHERE docid = ?", +/* 20 */ "REPLACE INTO %Q.'%q_docsize' VALUES(?,?)", +/* 21 */ "SELECT size FROM %Q.'%q_docsize' WHERE docid=?", +/* 22 */ "SELECT value FROM %Q.'%q_stat' WHERE id=?", +/* 23 */ "REPLACE INTO %Q.'%q_stat' VALUES(?,?)", +/* 24 */ "", +/* 25 */ "", + +/* 26 */ "DELETE FROM %Q.'%q_segdir' WHERE level BETWEEN ? AND ?", +/* 27 */ "SELECT ? UNION SELECT level / (1024 * ?) FROM %Q.'%q_segdir'", + +/* This statement is used to determine which level to read the input from +** when performing an incremental merge. It returns the absolute level number +** of the oldest level in the db that contains at least ? segments. Or, +** if no level in the FTS index contains more than ? segments, the statement +** returns zero rows. */ +/* 28 */ "SELECT level, count(*) AS cnt FROM %Q.'%q_segdir' " + " GROUP BY level HAVING cnt>=?" + " ORDER BY (level %% 1024) ASC LIMIT 1", + +/* Estimate the upper limit on the number of leaf nodes in a new segment +** created by merging the oldest :2 segments from absolute level :1. See +** function sqlite3Fts3Incrmerge() for details. */ +/* 29 */ "SELECT 2 * total(1 + leaves_end_block - start_block) " + " FROM %Q.'%q_segdir' WHERE level = ? AND idx < ?", + +/* SQL_DELETE_SEGDIR_ENTRY +** Delete the %_segdir entry on absolute level :1 with index :2. */ +/* 30 */ "DELETE FROM %Q.'%q_segdir' WHERE level = ? AND idx = ?", + +/* SQL_SHIFT_SEGDIR_ENTRY +** Modify the idx value for the segment with idx=:3 on absolute level :2 +** to :1. */ +/* 31 */ "UPDATE %Q.'%q_segdir' SET idx = ? WHERE level=? AND idx=?", + +/* SQL_SELECT_SEGDIR +** Read a single entry from the %_segdir table. The entry from absolute +** level :1 with index value :2. */ +/* 32 */ "SELECT idx, start_block, leaves_end_block, end_block, root " + "FROM %Q.'%q_segdir' WHERE level = ? AND idx = ?", + +/* SQL_CHOMP_SEGDIR +** Update the start_block (:1) and root (:2) fields of the %_segdir +** entry located on absolute level :3 with index :4. */ +/* 33 */ "UPDATE %Q.'%q_segdir' SET start_block = ?, root = ?" + "WHERE level = ? AND idx = ?", + +/* SQL_SEGMENT_IS_APPENDABLE +** Return a single row if the segment with end_block=? is appendable. Or +** no rows otherwise. */ +/* 34 */ "SELECT 1 FROM %Q.'%q_segments' WHERE blockid=? AND block IS NULL", + +/* SQL_SELECT_INDEXES +** Return the list of valid segment indexes for absolute level ? */ +/* 35 */ "SELECT idx FROM %Q.'%q_segdir' WHERE level=? ORDER BY 1 ASC", + +/* SQL_SELECT_MXLEVEL +** Return the largest relative level in the FTS index or indexes. */ +/* 36 */ "SELECT max( level %% 1024 ) FROM %Q.'%q_segdir'", + + /* Return segments in order from oldest to newest.*/ +/* 37 */ "SELECT level, idx, end_block " + "FROM %Q.'%q_segdir' WHERE level BETWEEN ? AND ? " + "ORDER BY level DESC, idx ASC", + + /* Update statements used while promoting segments */ +/* 38 */ "UPDATE OR FAIL %Q.'%q_segdir' SET level=-1,idx=? " + "WHERE level=? AND idx=?", +/* 39 */ "UPDATE OR FAIL %Q.'%q_segdir' SET level=? WHERE level=-1" + + }; + int rc = SQLITE_OK; + sqlite3_stmt *pStmt; + + assert( SizeofArray(azSql)==SizeofArray(p->aStmt) ); + assert( eStmt=0 ); + + pStmt = p->aStmt[eStmt]; + if( !pStmt ){ + char *zSql; + if( eStmt==SQL_CONTENT_INSERT ){ + zSql = sqlite3_mprintf(azSql[eStmt], p->zDb, p->zName, p->zWriteExprlist); + }else if( eStmt==SQL_SELECT_CONTENT_BY_ROWID ){ + zSql = sqlite3_mprintf(azSql[eStmt], p->zReadExprlist); + }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; + } + } + if( apVal ){ + int i; + int nParam = sqlite3_bind_parameter_count(pStmt); + for(i=0; rc==SQLITE_OK && inPendingData==0 ){ + sqlite3_stmt *pStmt; + rc = fts3SqlStmt(p, SQL_DELETE_SEGDIR_LEVEL, &pStmt, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_null(pStmt, 1); + sqlite3_step(pStmt); + rc = sqlite3_reset(pStmt); + } + } + + return rc; +} + +/* +** FTS maintains a separate indexes for each language-id (a 32-bit integer). +** Within each language id, a separate index is maintained to store the +** document terms, and each configured prefix size (configured the FTS +** "prefix=" option). And each index consists of multiple levels ("relative +** levels"). +** +** All three of these values (the language id, the specific index and the +** level within the index) are encoded in 64-bit integer values stored +** in the %_segdir table on disk. This function is used to convert three +** separate component values into the single 64-bit integer value that +** can be used to query the %_segdir table. +** +** Specifically, each language-id/index combination is allocated 1024 +** 64-bit integer level values ("absolute levels"). The main terms index +** for language-id 0 is allocate values 0-1023. The first prefix index +** (if any) for language-id 0 is allocated values 1024-2047. And so on. +** Language 1 indexes are allocated immediately following language 0. +** +** So, for a system with nPrefix prefix indexes configured, the block of +** absolute levels that corresponds to language-id iLangid and index +** iIndex starts at absolute level ((iLangid * (nPrefix+1) + iIndex) * 1024). +*/ +static sqlite3_int64 getAbsoluteLevel( + Fts3Table *p, /* FTS3 table handle */ + int iLangid, /* Language id */ + int iIndex, /* Index in p->aIndex[] */ + int iLevel /* Level of segments */ +){ + sqlite3_int64 iBase; /* First absolute level for iLangid/iIndex */ + assert( iLangid>=0 ); + assert( p->nIndex>0 ); + assert( iIndex>=0 && iIndexnIndex ); + + iBase = ((sqlite3_int64)iLangid * p->nIndex + iIndex) * FTS3_SEGDIR_MAXLEVEL; + return iBase + iLevel; +} + +/* +** Set *ppStmt to a statement handle that may be used to iterate through +** all rows in the %_segdir table, from oldest to newest. If successful, +** return SQLITE_OK. If an error occurs while preparing the statement, +** return an SQLite error code. +** +** There is only ever one instance of this SQL statement compiled for +** each FTS3 table. +** +** The statement returns the following columns from the %_segdir table: +** +** 0: idx +** 1: start_block +** 2: leaves_end_block +** 3: end_block +** 4: root +*/ +SQLITE_PRIVATE int sqlite3Fts3AllSegdirs( + Fts3Table *p, /* FTS3 table */ + int iLangid, /* Language being queried */ + int iIndex, /* Index for p->aIndex[] */ + int iLevel, /* Level to select (relative level) */ + sqlite3_stmt **ppStmt /* OUT: Compiled statement */ +){ + int rc; + sqlite3_stmt *pStmt = 0; + + assert( iLevel==FTS3_SEGCURSOR_ALL || iLevel>=0 ); + assert( iLevel=0 && iIndexnIndex ); + + if( iLevel<0 ){ + /* "SELECT * FROM %_segdir WHERE level BETWEEN ? AND ? ORDER BY ..." */ + rc = fts3SqlStmt(p, SQL_SELECT_LEVEL_RANGE, &pStmt, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int64(pStmt, 1, getAbsoluteLevel(p, iLangid, iIndex, 0)); + sqlite3_bind_int64(pStmt, 2, + getAbsoluteLevel(p, iLangid, iIndex, FTS3_SEGDIR_MAXLEVEL-1) + ); + } + }else{ + /* "SELECT * FROM %_segdir WHERE level = ? ORDER BY ..." */ + rc = fts3SqlStmt(p, SQL_SELECT_LEVEL, &pStmt, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int64(pStmt, 1, getAbsoluteLevel(p, iLangid, iIndex,iLevel)); + } + } + *ppStmt = pStmt; + return rc; +} + + +/* +** Append a single varint to a PendingList buffer. SQLITE_OK is returned +** if successful, or an SQLite error code otherwise. +** +** This function also serves to allocate the PendingList structure itself. +** For example, to create a new PendingList structure containing two +** varints: +** +** PendingList *p = 0; +** fts3PendingListAppendVarint(&p, 1); +** fts3PendingListAppendVarint(&p, 2); +*/ +static int fts3PendingListAppendVarint( + PendingList **pp, /* IN/OUT: Pointer to PendingList struct */ + sqlite3_int64 i /* Value to append to data */ +){ + PendingList *p = *pp; + + /* Allocate or grow the PendingList as required. */ + if( !p ){ + p = sqlite3_malloc(sizeof(*p) + 100); + if( !p ){ + return SQLITE_NOMEM; + } + p->nSpace = 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]; + } + + /* 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; +} + +/* +** 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. +** +** 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 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; +} + +/* +** Free a PendingList object allocated by fts3PendingListAppend(). +*/ +static void fts3PendingListDelete(PendingList *pList){ + sqlite3_free(pList); +} + +/* +** Add an entry to one of the pending-terms hash tables. +*/ +static int fts3PendingTermsAddOne( + Fts3Table *p, + int iCol, + int iPos, + Fts3Hash *pHash, /* Pending terms hash table to add entry to */ + const char *zToken, + int nToken +){ + PendingList *pList; + int rc = SQLITE_OK; + + pList = (PendingList *)fts3HashFind(pHash, zToken, nToken); + if( pList ){ + p->nPendingData -= (pList->nData + nToken + sizeof(Fts3HashElem)); + } + if( fts3PendingListAppend(&pList, p->iPrevDocid, iCol, iPos, &rc) ){ + if( pList==fts3HashInsert(pHash, 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(pHash, zToken, nToken) ); + sqlite3_free(pList); + rc = SQLITE_NOMEM; + } + } + if( rc==SQLITE_OK ){ + p->nPendingData += (pList->nData + nToken + sizeof(Fts3HashElem)); + } + return rc; +} + +/* +** 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. +** +** If successful, SQLITE_OK is returned. Otherwise, an SQLite error code. +*/ +static int fts3PendingTermsAdd( + Fts3Table *p, /* Table into which text will be inserted */ + int iLangid, /* Language id to use */ + const char *zText, /* Text of document to be inserted */ + int iCol, /* Column into which text is being inserted */ + u32 *pnWord /* IN/OUT: Incr. by number tokens inserted */ +){ + int rc; + int iStart = 0; + int iEnd = 0; + int iPos = 0; + int nWord = 0; + + char const *zToken; + int nToken = 0; + + 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*); + + assert( pTokenizer && pModule ); + + /* If the user has inserted a NULL value, this function may be called with + ** zText==0. In this case, add zero token entries to the hash table and + ** return early. */ + if( zText==0 ){ + *pnWord = 0; + return SQLITE_OK; + } + + rc = sqlite3Fts3OpenTokenizer(pTokenizer, iLangid, zText, -1, &pCsr); + if( rc!=SQLITE_OK ){ + return rc; + } + + xNext = pModule->xNext; + while( SQLITE_OK==rc + && SQLITE_OK==(rc = xNext(pCsr, &zToken, &nToken, &iStart, &iEnd, &iPos)) + ){ + int i; + if( iPos>=nWord ) nWord = iPos+1; + + /* 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; + } + + /* Add the term to the terms index */ + rc = fts3PendingTermsAddOne( + p, iCol, iPos, &p->aIndex[0].hPending, zToken, nToken + ); + + /* Add the term to each of the prefix indexes that it is not too + ** short for. */ + for(i=1; rc==SQLITE_OK && inIndex; i++){ + struct Fts3Index *pIndex = &p->aIndex[i]; + if( nTokennPrefix ) continue; + rc = fts3PendingTermsAddOne( + p, iCol, iPos, &pIndex->hPending, zToken, pIndex->nPrefix + ); + } + } + + pModule->xClose(pCsr); + *pnWord += nWord; + 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, /* Full-text table handle */ + int bDelete, /* True if this op is a delete */ + int iLangid, /* Language id of row being written */ + sqlite_int64 iDocid /* Docid of row being written */ +){ + assert( iLangid>=0 ); + assert( bDelete==1 || bDelete==0 ); + + /* 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( iDocidiPrevDocid + || (iDocid==p->iPrevDocid && p->bPrevDelete==0) + || p->iPrevLangid!=iLangid + || p->nPendingData>p->nMaxPendingData + ){ + int rc = sqlite3Fts3PendingTermsFlush(p); + if( rc!=SQLITE_OK ) return rc; + } + p->iPrevDocid = iDocid; + p->iPrevLangid = iLangid; + p->bPrevDelete = bDelete; + return SQLITE_OK; +} + +/* +** Discard the contents of the pending-terms hash tables. +*/ +SQLITE_PRIVATE void sqlite3Fts3PendingTermsClear(Fts3Table *p){ + int i; + for(i=0; inIndex; i++){ + Fts3HashElem *pElem; + Fts3Hash *pHash = &p->aIndex[i].hPending; + for(pElem=fts3HashFirst(pHash); pElem; pElem=fts3HashNext(pElem)){ + PendingList *pList = (PendingList *)fts3HashData(pElem); + fts3PendingListDelete(pList); + } + fts3HashClear(pHash); + } + p->nPendingData = 0; +} + +/* +** 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. +*/ +static int fts3InsertTerms( + Fts3Table *p, + int iLangid, + sqlite3_value **apVal, + u32 *aSz +){ + int i; /* Iterator variable */ + for(i=2; inColumn+2; i++){ + int iCol = i-2; + if( p->abNotindexed[iCol]==0 ){ + const char *zText = (const char *)sqlite3_value_text(apVal[i]); + int rc = fts3PendingTermsAdd(p, iLangid, zText, iCol, &aSz[iCol]); + if( rc!=SQLITE_OK ){ + return rc; + } + aSz[p->nColumn] += sqlite3_value_bytes(apVal[i]); + } + } + return SQLITE_OK; +} + +/* +** 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: +** +** 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) +** apVal[p->nColumn+4] Hidden languageid column +*/ +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 */ +){ + int rc; /* Return code */ + sqlite3_stmt *pContentInsert; /* INSERT INTO %_content VALUES(...) */ + + if( p->zContentTbl ){ + sqlite3_value *pRowid = apVal[p->nColumn+3]; + if( sqlite3_value_type(pRowid)==SQLITE_NULL ){ + pRowid = apVal[1]; + } + if( sqlite3_value_type(pRowid)!=SQLITE_INTEGER ){ + return SQLITE_CONSTRAINT; + } + *piDocid = sqlite3_value_int64(pRowid); + return SQLITE_OK; + } + + /* 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 && p->zLanguageid ){ + rc = sqlite3_bind_int( + pContentInsert, p->nColumn+2, + sqlite3_value_int(apVal[p->nColumn+4]) + ); + } + if( rc!=SQLITE_OK ) return rc; + + /* 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; + } + rc = sqlite3_bind_value(pContentInsert, 1, apVal[3+p->nColumn]); + if( rc!=SQLITE_OK ) return rc; + } + + /* Execute the statement to insert the record. Set *piDocid to the + ** new docid value. + */ + sqlite3_step(pContentInsert); + rc = sqlite3_reset(pContentInsert); + + *piDocid = sqlite3_last_insert_rowid(p->db); + return rc; +} + + + +/* +** Remove all data from the FTS3 table. Clear the hash table containing +** pending terms. +*/ +static int fts3DeleteAll(Fts3Table *p, int bContent){ + int rc = SQLITE_OK; /* Return code */ + + /* Discard the contents of the pending-terms hash table. */ + sqlite3Fts3PendingTermsClear(p); + + /* Delete everything from the shadow tables. Except, leave %_content as + ** is if bContent is false. */ + assert( p->zContentTbl==0 || bContent==0 ); + if( bContent ) fts3SqlExec(&rc, p, SQL_DELETE_ALL_CONTENT, 0); + fts3SqlExec(&rc, p, SQL_DELETE_ALL_SEGMENTS, 0); + fts3SqlExec(&rc, p, SQL_DELETE_ALL_SEGDIR, 0); + if( p->bHasDocsize ){ + fts3SqlExec(&rc, p, SQL_DELETE_ALL_DOCSIZE, 0); + } + if( p->bHasStat ){ + fts3SqlExec(&rc, p, SQL_DELETE_ALL_STAT, 0); + } + return rc; +} + +/* +** +*/ +static int langidFromSelect(Fts3Table *p, sqlite3_stmt *pSelect){ + int iLangid = 0; + if( p->zLanguageid ) iLangid = sqlite3_column_int(pSelect, p->nColumn+1); + return iLangid; +} + +/* +** 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 void fts3DeleteTerms( + int *pRC, /* Result code */ + Fts3Table *p, /* The FTS table to delete from */ + sqlite3_value *pRowid, /* The docid to be deleted */ + u32 *aSz, /* Sizes of deleted document written here */ + int *pbFound /* OUT: Set to true if row really does exist */ +){ + int rc; + sqlite3_stmt *pSelect; + + assert( *pbFound==0 ); + if( *pRC ) return; + rc = fts3SqlStmt(p, SQL_SELECT_CONTENT_BY_ROWID, &pSelect, &pRowid); + if( rc==SQLITE_OK ){ + if( SQLITE_ROW==sqlite3_step(pSelect) ){ + int i; + int iLangid = langidFromSelect(p, pSelect); + i64 iDocid = sqlite3_column_int64(pSelect, 0); + rc = fts3PendingTermsDocid(p, 1, iLangid, iDocid); + for(i=1; rc==SQLITE_OK && i<=p->nColumn; i++){ + int iCol = i-1; + if( p->abNotindexed[iCol]==0 ){ + const char *zText = (const char *)sqlite3_column_text(pSelect, i); + rc = fts3PendingTermsAdd(p, iLangid, zText, -1, &aSz[iCol]); + aSz[p->nColumn] += sqlite3_column_bytes(pSelect, i); + } + } + if( rc!=SQLITE_OK ){ + sqlite3_reset(pSelect); + *pRC = rc; + return; + } + *pbFound = 1; + } + rc = sqlite3_reset(pSelect); + }else{ + sqlite3_reset(pSelect); + } + *pRC = rc; +} + +/* +** Forward declaration to account for the circular dependency between +** functions fts3SegmentMerge() and fts3AllocateSegdirIdx(). +*/ +static int fts3SegmentMerge(Fts3Table *, int, int, int); + +/* +** 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 iLangid, /* Language id */ + int iIndex, /* Index for p->aIndex */ + 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 */ + + assert( iLangid>=0 ); + assert( p->nIndex>=1 ); + + /* 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_int64( + pNextIdx, 1, getAbsoluteLevel(p, iLangid, iIndex, iLevel) + ); + if( SQLITE_ROW==sqlite3_step(pNextIdx) ){ + iNext = sqlite3_column_int(pNextIdx, 0); + } + rc = sqlite3_reset(pNextIdx); + } + + 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 ){ + fts3LogMerge(16, getAbsoluteLevel(p, iLangid, iIndex, iLevel)); + rc = fts3SegmentMerge(p, iLangid, iIndex, iLevel); + *piIdx = 0; + }else{ + *piIdx = iNext; + } + } + + return rc; +} + +/* +** The %_segments table is declared as follows: +** +** CREATE TABLE %_segments(blockid INTEGER PRIMARY KEY, block BLOB) +** +** This function reads data from a single row of the %_segments table. The +** specific row is identified by the iBlockid parameter. If paBlob is not +** NULL, then a buffer is allocated using sqlite3_malloc() and populated +** with the contents of the blob stored in the "block" column of the +** identified table row is. Whether or not paBlob is NULL, *pnBlob is set +** to the size of the blob in bytes before returning. +** +** If an error occurs, or the table does not contain the specified row, +** an SQLite error code is returned. Otherwise, SQLITE_OK is returned. If +** paBlob is non-NULL, then it is the responsibility of the caller to +** eventually free the returned buffer. +** +** This function may leave an open sqlite3_blob* handle in the +** Fts3Table.pSegments variable. This handle is reused by subsequent calls +** to this function. The handle may be closed by calling the +** sqlite3Fts3SegmentsClose() function. Reusing a blob handle is a handy +** performance improvement, but the blob handle should always be closed +** before control is returned to the user (to prevent a lock being held +** on the database file for longer than necessary). Thus, any virtual table +** method (xFilter etc.) that may directly or indirectly call this function +** must call sqlite3Fts3SegmentsClose() before returning. +*/ +SQLITE_PRIVATE int sqlite3Fts3ReadBlock( + Fts3Table *p, /* FTS3 table handle */ + sqlite3_int64 iBlockid, /* Access the row with blockid=$iBlockid */ + char **paBlob, /* OUT: Blob data in malloc'd buffer */ + int *pnBlob, /* OUT: Size of blob data */ + int *pnLoad /* OUT: Bytes actually loaded */ +){ + int rc; /* Return code */ + + /* pnBlob must be non-NULL. paBlob may be NULL or non-NULL. */ + assert( pnBlob ); + + if( p->pSegments ){ + rc = sqlite3_blob_reopen(p->pSegments, iBlockid); + }else{ + if( 0==p->zSegmentsTbl ){ + p->zSegmentsTbl = sqlite3_mprintf("%s_segments", p->zName); + if( 0==p->zSegmentsTbl ) return SQLITE_NOMEM; + } + rc = sqlite3_blob_open( + p->db, p->zDb, p->zSegmentsTbl, "block", iBlockid, 0, &p->pSegments + ); + } + + if( rc==SQLITE_OK ){ + int nByte = sqlite3_blob_bytes(p->pSegments); + *pnBlob = nByte; + if( paBlob ){ + char *aByte = sqlite3_malloc(nByte + FTS3_NODE_PADDING); + if( !aByte ){ + rc = SQLITE_NOMEM; + }else{ + if( pnLoad && nByte>(FTS3_NODE_CHUNK_THRESHOLD) ){ + nByte = FTS3_NODE_CHUNKSIZE; + *pnLoad = nByte; + } + rc = sqlite3_blob_read(p->pSegments, aByte, nByte, 0); + memset(&aByte[nByte], 0, FTS3_NODE_PADDING); + if( rc!=SQLITE_OK ){ + sqlite3_free(aByte); + aByte = 0; + } + } + *paBlob = aByte; + } + } + + return rc; +} + +/* +** Close the blob handle at p->pSegments, if it is open. See comments above +** the sqlite3Fts3ReadBlock() function for details. +*/ +SQLITE_PRIVATE void sqlite3Fts3SegmentsClose(Fts3Table *p){ + sqlite3_blob_close(p->pSegments); + p->pSegments = 0; +} + +static int fts3SegReaderIncrRead(Fts3SegReader *pReader){ + int nRead; /* Number of bytes to read */ + int rc; /* Return code */ + + nRead = MIN(pReader->nNode - pReader->nPopulate, FTS3_NODE_CHUNKSIZE); + rc = sqlite3_blob_read( + pReader->pBlob, + &pReader->aNode[pReader->nPopulate], + nRead, + pReader->nPopulate + ); + + if( rc==SQLITE_OK ){ + pReader->nPopulate += nRead; + memset(&pReader->aNode[pReader->nPopulate], 0, FTS3_NODE_PADDING); + if( pReader->nPopulate==pReader->nNode ){ + sqlite3_blob_close(pReader->pBlob); + pReader->pBlob = 0; + pReader->nPopulate = 0; + } + } + return rc; +} + +static int fts3SegReaderRequire(Fts3SegReader *pReader, char *pFrom, int nByte){ + int rc = SQLITE_OK; + assert( !pReader->pBlob + || (pFrom>=pReader->aNode && pFrom<&pReader->aNode[pReader->nNode]) + ); + while( pReader->pBlob && rc==SQLITE_OK + && (pFrom - pReader->aNode + nByte)>pReader->nPopulate + ){ + rc = fts3SegReaderIncrRead(pReader); + } + return rc; +} + +/* +** Set an Fts3SegReader cursor to point at EOF. +*/ +static void fts3SegReaderSetEof(Fts3SegReader *pSeg){ + if( !fts3SegReaderIsRootOnly(pSeg) ){ + sqlite3_free(pSeg->aNode); + sqlite3_blob_close(pSeg->pBlob); + pSeg->pBlob = 0; + } + pSeg->aNode = 0; +} + +/* +** 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( + Fts3Table *p, + Fts3SegReader *pReader, + int bIncr +){ + int rc; /* Return code of various sub-routines */ + 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] ){ + + if( fts3SegReaderIsPending(pReader) ){ + Fts3HashElem *pElem = *(pReader->ppNextElem); + sqlite3_free(pReader->aNode); + pReader->aNode = 0; + if( pElem ){ + char *aCopy; + PendingList *pList = (PendingList *)fts3HashData(pElem); + int nCopy = pList->nData+1; + pReader->zTerm = (char *)fts3HashKey(pElem); + pReader->nTerm = fts3HashKeysize(pElem); + aCopy = (char*)sqlite3_malloc(nCopy); + if( !aCopy ) return SQLITE_NOMEM; + memcpy(aCopy, pList->aData, nCopy); + pReader->nNode = pReader->nDoclist = nCopy; + pReader->aNode = pReader->aDoclist = aCopy; + pReader->ppNextElem++; + assert( pReader->aNode ); + } + return SQLITE_OK; + } + + fts3SegReaderSetEof(pReader); + + /* If iCurrentBlock>=iLeafEndBlock, this is an EOF condition. All leaf + ** blocks have already been traversed. */ + assert( pReader->iCurrentBlock<=pReader->iLeafEndBlock ); + if( pReader->iCurrentBlock>=pReader->iLeafEndBlock ){ + return SQLITE_OK; + } + + rc = sqlite3Fts3ReadBlock( + p, ++pReader->iCurrentBlock, &pReader->aNode, &pReader->nNode, + (bIncr ? &pReader->nPopulate : 0) + ); + if( rc!=SQLITE_OK ) return rc; + assert( pReader->pBlob==0 ); + if( bIncr && pReader->nPopulatenNode ){ + pReader->pBlob = p->pSegments; + p->pSegments = 0; + } + pNext = pReader->aNode; + } + + assert( !fts3SegReaderIsPending(pReader) ); + + rc = fts3SegReaderRequire(pReader, pNext, FTS3_VARINT_MAX*2); + if( rc!=SQLITE_OK ) return rc; + + /* Because of the FTS3_NODE_PADDING bytes of padding, the following is + ** safe (no risk of overread) even if the node data is corrupted. */ + pNext += fts3GetVarint32(pNext, &nPrefix); + pNext += fts3GetVarint32(pNext, &nSuffix); + if( nPrefix<0 || nSuffix<=0 + || &pNext[nSuffix]>&pReader->aNode[pReader->nNode] + ){ + return FTS_CORRUPT_VTAB; + } + + if( nPrefix+nSuffix>pReader->nTermAlloc ){ + int nNew = (nPrefix+nSuffix)*2; + char *zNew = sqlite3_realloc(pReader->zTerm, nNew); + if( !zNew ){ + return SQLITE_NOMEM; + } + pReader->zTerm = zNew; + pReader->nTermAlloc = nNew; + } + + rc = fts3SegReaderRequire(pReader, pNext, nSuffix+FTS3_VARINT_MAX); + if( rc!=SQLITE_OK ) return rc; + + memcpy(&pReader->zTerm[nPrefix], pNext, nSuffix); + pReader->nTerm = nPrefix+nSuffix; + pNext += nSuffix; + pNext += fts3GetVarint32(pNext, &pReader->nDoclist); + pReader->aDoclist = pNext; + pReader->pOffsetList = 0; + + /* Check that the doclist does not appear to extend past the end of the + ** b-tree node. And that the final byte of the doclist is 0x00. If either + ** of these statements is untrue, then the data structure is corrupt. + */ + if( &pReader->aDoclist[pReader->nDoclist]>&pReader->aNode[pReader->nNode] + || (pReader->nPopulate==0 && pReader->aDoclist[pReader->nDoclist-1]) + ){ + return FTS_CORRUPT_VTAB; + } + return SQLITE_OK; +} + +/* +** Set the SegReader to point to the first docid in the doclist associated +** with the current term. +*/ +static int fts3SegReaderFirstDocid(Fts3Table *pTab, Fts3SegReader *pReader){ + int rc = SQLITE_OK; + assert( pReader->aDoclist ); + assert( !pReader->pOffsetList ); + if( pTab->bDescIdx && fts3SegReaderIsPending(pReader) ){ + u8 bEof = 0; + pReader->iDocid = 0; + pReader->nOffsetList = 0; + sqlite3Fts3DoclistPrev(0, + pReader->aDoclist, pReader->nDoclist, &pReader->pOffsetList, + &pReader->iDocid, &pReader->nOffsetList, &bEof + ); + }else{ + rc = fts3SegReaderRequire(pReader, pReader->aDoclist, FTS3_VARINT_MAX); + if( rc==SQLITE_OK ){ + int n = sqlite3Fts3GetVarint(pReader->aDoclist, &pReader->iDocid); + pReader->pOffsetList = &pReader->aDoclist[n]; + } + } + return rc; +} + +/* +** 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 int fts3SegReaderNextDocid( + Fts3Table *pTab, + Fts3SegReader *pReader, /* Reader to advance to next docid */ + char **ppOffsetList, /* OUT: Pointer to current position-list */ + int *pnOffsetList /* OUT: Length of *ppOffsetList in bytes */ +){ + int rc = SQLITE_OK; + char *p = pReader->pOffsetList; + char c = 0; + + assert( p ); + + if( pTab->bDescIdx && fts3SegReaderIsPending(pReader) ){ + /* A pending-terms seg-reader for an FTS4 table that uses order=desc. + ** Pending-terms doclists are always built up in ascending order, so + ** we have to iterate through them backwards here. */ + u8 bEof = 0; + if( ppOffsetList ){ + *ppOffsetList = pReader->pOffsetList; + *pnOffsetList = pReader->nOffsetList - 1; + } + sqlite3Fts3DoclistPrev(0, + pReader->aDoclist, pReader->nDoclist, &p, &pReader->iDocid, + &pReader->nOffsetList, &bEof + ); + if( bEof ){ + pReader->pOffsetList = 0; + }else{ + pReader->pOffsetList = p; + } + }else{ + char *pEnd = &pReader->aDoclist[pReader->nDoclist]; + + /* Pointer p currently points at the first byte of an offset list. The + ** following block advances it to point one byte past the end of + ** the same offset list. */ + while( 1 ){ + + /* The following line of code (and the "p++" below the while() loop) is + ** normally all that is required to move pointer p to the desired + ** position. The exception is if this node is being loaded from disk + ** incrementally and pointer "p" now points to the first byte past + ** the populated part of pReader->aNode[]. + */ + while( *p | c ) c = *p++ & 0x80; + assert( *p==0 ); + + if( pReader->pBlob==0 || p<&pReader->aNode[pReader->nPopulate] ) break; + rc = fts3SegReaderIncrRead(pReader); + if( rc!=SQLITE_OK ) return rc; + } + 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); + } + + /* List may have been edited in place by fts3EvalNearTrim() */ + while( p=pEnd ){ + pReader->pOffsetList = 0; + }else{ + rc = fts3SegReaderRequire(pReader, p, FTS3_VARINT_MAX); + if( rc==SQLITE_OK ){ + sqlite3_int64 iDelta; + pReader->pOffsetList = p + sqlite3Fts3GetVarint(p, &iDelta); + if( pTab->bDescIdx ){ + pReader->iDocid -= iDelta; + }else{ + pReader->iDocid += iDelta; + } + } + } + } + + return SQLITE_OK; +} + + +SQLITE_PRIVATE int sqlite3Fts3MsrOvfl( + Fts3Cursor *pCsr, + Fts3MultiSegReader *pMsr, + int *pnOvfl +){ + Fts3Table *p = (Fts3Table*)pCsr->base.pVtab; + int nOvfl = 0; + int ii; + int rc = SQLITE_OK; + int pgsz = p->nPgsz; + + assert( p->bFts4 ); + assert( pgsz>0 ); + + for(ii=0; rc==SQLITE_OK && iinSegment; ii++){ + Fts3SegReader *pReader = pMsr->apSegment[ii]; + if( !fts3SegReaderIsPending(pReader) + && !fts3SegReaderIsRootOnly(pReader) + ){ + sqlite3_int64 jj; + for(jj=pReader->iStartBlock; jj<=pReader->iLeafEndBlock; jj++){ + int nBlob; + rc = sqlite3Fts3ReadBlock(p, jj, 0, &nBlob, 0); + if( rc!=SQLITE_OK ) break; + if( (nBlob+35)>pgsz ){ + nOvfl += (nBlob + 34)/pgsz; + } + } + } + } + *pnOvfl = nOvfl; + return rc; +} + +/* +** Free all allocations associated with the iterator passed as the +** second argument. +*/ +SQLITE_PRIVATE void sqlite3Fts3SegReaderFree(Fts3SegReader *pReader){ + if( pReader ){ + if( !fts3SegReaderIsPending(pReader) ){ + sqlite3_free(pReader->zTerm); + } + if( !fts3SegReaderIsRootOnly(pReader) ){ + sqlite3_free(pReader->aNode); + } + sqlite3_blob_close(pReader->pBlob); + } + sqlite3_free(pReader); +} + +/* +** Allocate a new SegReader object. +*/ +SQLITE_PRIVATE int sqlite3Fts3SegReaderNew( + int iAge, /* Segment "age". */ + int bLookup, /* True for a lookup only */ + 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 */ +){ + Fts3SegReader *pReader; /* Newly allocated SegReader object */ + int nExtra = 0; /* Bytes to allocate segment root node */ + + assert( iStartLeaf<=iEndLeaf ); + if( iStartLeaf==0 ){ + nExtra = nRoot + FTS3_NODE_PADDING; + } + + pReader = (Fts3SegReader *)sqlite3_malloc(sizeof(Fts3SegReader) + nExtra); + if( !pReader ){ + return SQLITE_NOMEM; + } + memset(pReader, 0, sizeof(Fts3SegReader)); + pReader->iIdx = iAge; + pReader->bLookup = bLookup!=0; + pReader->iStartBlock = iStartLeaf; + pReader->iLeafEndBlock = iEndLeaf; + pReader->iEndBlock = iEndBlock; + + if( nExtra ){ + /* The entire segment is stored in the root node. */ + pReader->aNode = (char *)&pReader[1]; + pReader->rootOnly = 1; + pReader->nNode = nRoot; + memcpy(pReader->aNode, zRoot, nRoot); + memset(&pReader->aNode[nRoot], 0, FTS3_NODE_PADDING); + }else{ + pReader->iCurrentBlock = iStartLeaf-1; + } + *ppReader = pReader; + return SQLITE_OK; +} + +/* +** 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 SQLITE_CDECL 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); + + int n = (n1aIndex */ + const char *zTerm, /* Term to search for */ + int nTerm, /* Size of buffer zTerm */ + int bPrefix, /* True for a prefix iterator */ + Fts3SegReader **ppReader /* OUT: SegReader for pending-terms */ +){ + Fts3SegReader *pReader = 0; /* Fts3SegReader object to return */ + Fts3HashElem *pE; /* Iterator variable */ + Fts3HashElem **aElem = 0; /* Array of term hash entries to scan */ + int nElem = 0; /* Size of array at aElem */ + int rc = SQLITE_OK; /* Return Code */ + Fts3Hash *pHash; + + pHash = &p->aIndex[iIndex].hPending; + if( bPrefix ){ + int nAlloc = 0; /* Size of allocated array at aElem */ + + for(pE=fts3HashFirst(pHash); 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; + nElem = 0; + break; + } + aElem = aElem2; + } + + aElem[nElem++] = pE; + } + } + + /* 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{ + /* The query is a simple term lookup that matches at most one term in + ** the index. All that is required is a straight hash-lookup. + ** + ** Because the stack address of pE may be accessed via the aElem pointer + ** below, the "Fts3HashElem *pE" must be declared so that it is valid + ** within this entire function, not just this "else{...}" block. + */ + pE = fts3HashFindElem(pHash, zTerm, nTerm); + if( pE ){ + aElem = &pE; + nElem = 1; + } + } + + 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 *)); + } + } + + if( bPrefix ){ + sqlite3_free(aElem); + } + *ppReader = pReader; + return rc; +} + +/* +** 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; + 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); + } + if( rc==0 ){ + rc = pRhs->iIdx - pLhs->iIdx; + } + assert( rc!=0 ); + return rc; +} + +/* +** 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. +*/ +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; +} +static int fts3SegReaderDoclistCmpRev(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; +} + +/* +** 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. +*/ +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; +} + +/* +** 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 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 i; /* Iterator variable */ + + assert( nSuspect<=nSegment ); + + 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; + } + } + +#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 +} + +/* +** Insert a record into the %_segments table. +*/ +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; +} + +/* +** Find the largest relative level number in the table. If successful, set +** *pnMax to this value and return SQLITE_OK. Otherwise, if an error occurs, +** set *pnMax to zero and return an SQLite error code. +*/ +SQLITE_PRIVATE int sqlite3Fts3MaxLevel(Fts3Table *p, int *pnMax){ + int rc; + int mxLevel = 0; + sqlite3_stmt *pStmt = 0; + + rc = fts3SqlStmt(p, SQL_SELECT_MXLEVEL, &pStmt, 0); + if( rc==SQLITE_OK ){ + if( SQLITE_ROW==sqlite3_step(pStmt) ){ + mxLevel = sqlite3_column_int(pStmt, 0); + } + rc = sqlite3_reset(pStmt); + } + *pnMax = mxLevel; + return rc; +} + +/* +** Insert a record into the %_segdir table. +*/ +static int fts3WriteSegdir( + Fts3Table *p, /* Virtual table handle */ + sqlite3_int64 iLevel, /* Value for "level" field (absolute level) */ + 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 */ + sqlite3_int64 nLeafData, /* Bytes of leaf data in segment */ + 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_int64(pStmt, 1, iLevel); + sqlite3_bind_int(pStmt, 2, iIdx); + sqlite3_bind_int64(pStmt, 3, iStartBlock); + sqlite3_bind_int64(pStmt, 4, iLeafEndBlock); + if( nLeafData==0 ){ + sqlite3_bind_int64(pStmt, 5, iEndBlock); + }else{ + char *zEnd = sqlite3_mprintf("%lld %lld", iEndBlock, nLeafData); + if( !zEnd ) return SQLITE_NOMEM; + sqlite3_bind_text(pStmt, 5, zEnd, -1, sqlite3_free); + } + sqlite3_bind_blob(pStmt, 6, zRoot, nRoot, SQLITE_STATIC); + sqlite3_step(pStmt); + rc = sqlite3_reset(pStmt); + } + return rc; +} + +/* +** Return the size of the common prefix (if any) shared by zPrev and +** zNext, in bytes. For example, +** +** fts3PrefixCompress("abc", 3, "abcdef", 6) // returns 3 +** fts3PrefixCompress("abX", 3, "abcdef", 6) // returns 2 +** fts3PrefixCompress("abX", 3, "Xbcdef", 6) // returns 0 +*/ +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 */ +){ + 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( pTree->zTerm ){ + /* There is no prefix-length field for first term in a node */ + nData += sqlite3Fts3PutVarint(&pTree->aData[nData], nPrefix); + } + + nData += sqlite3Fts3PutVarint(&pTree->aData[nData], nSuffix); + memcpy(&pTree->aData[nData], &zTerm[nPrefix], nSuffix); + pTree->nData = nData + nSuffix; + pTree->nEntry++; + + 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; + } + } + + /* If control flows to here, it was not possible to append zTerm to the + ** current node. Create a new node (a right-sibling of the current node). + ** If this is the first node in the tree, the term is added to it. + ** + ** Otherwise, the term is not added to the new node, it is left empty for + ** now. Instead, the term is inserted into the parent of pTree. If pTree + ** has no parent, one is created here. + */ + pNew = (SegmentNode *)sqlite3_malloc(sizeof(SegmentNode) + p->nNodeSize); + if( !pNew ){ + return SQLITE_NOMEM; + } + 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{ + pNew->pLeftmost = pNew; + rc = fts3NodeAddTerm(p, &pNew, isCopyTerm, zTerm, nTerm); + } + + *ppTree = pNew; + return rc; +} + +/* +** Helper function for fts3NodeWrite(). +*/ +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; +} + +/* +** 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. +** +** 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. +** +** 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; + } + } +} + +/* +** 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. +** +** If successful, SQLITE_OK is returned. Otherwise, an SQLite error code. +*/ +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; + p->nLeafAdd++; + + /* 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 */ + } + + /* Increase the total number of bytes written to account for the new entry. */ + pWriter->nLeafData += nReq; + + /* 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; +} + +/* +** 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 int fts3SegWriterFlush( + Fts3Table *p, /* Virtual table handle */ + SegmentWriter *pWriter, /* SegmentWriter to flush to the db */ + sqlite3_int64 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, pWriter->nLeafData, 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->nLeafData, pWriter->aData, pWriter->nData); + } + p->nLeafAdd++; + return rc; +} + +/* +** Release all memory held by the SegmentWriter object passed as the +** first argument. +*/ +static void fts3SegWriterFree(SegmentWriter *pWriter){ + if( pWriter ){ + sqlite3_free(pWriter->aData); + sqlite3_free(pWriter->zMalloc); + fts3NodeFree(pWriter->pTree); + sqlite3_free(pWriter); + } +} + +/* +** 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 +** pRowid would mean the FTS3 table were empty. +** +** If successful, *pisEmpty is set to true if the table is empty except for +** document pRowid, or false otherwise, and SQLITE_OK is returned. If an +** error occurs, an SQLite error code is returned. +*/ +static int fts3IsEmpty(Fts3Table *p, sqlite3_value *pRowid, int *pisEmpty){ + sqlite3_stmt *pStmt; + int rc; + if( p->zContentTbl ){ + /* If using the content=xxx option, assume the table is never empty */ + *pisEmpty = 0; + rc = SQLITE_OK; + }else{ + rc = fts3SqlStmt(p, SQL_IS_EMPTY, &pStmt, &pRowid); + if( rc==SQLITE_OK ){ + if( SQLITE_ROW==sqlite3_step(pStmt) ){ + *pisEmpty = sqlite3_column_int(pStmt, 0); + } + rc = sqlite3_reset(pStmt); + } + } + return rc; +} + +/* +** Set *pnMax to the largest segment level in the database for the index +** iIndex. +** +** 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 fts3SegmentMaxLevel( + Fts3Table *p, + int iLangid, + int iIndex, + sqlite3_int64 *pnMax +){ + sqlite3_stmt *pStmt; + int rc; + assert( iIndex>=0 && iIndexnIndex ); + + /* Set pStmt to the compiled version of: + ** + ** SELECT max(level) FROM %Q.'%q_segdir' WHERE level BETWEEN ? AND ? + ** + ** (1024 is actually the value of macro FTS3_SEGDIR_PREFIXLEVEL_STR). + */ + rc = fts3SqlStmt(p, SQL_SELECT_SEGDIR_MAX_LEVEL, &pStmt, 0); + if( rc!=SQLITE_OK ) return rc; + sqlite3_bind_int64(pStmt, 1, getAbsoluteLevel(p, iLangid, iIndex, 0)); + sqlite3_bind_int64(pStmt, 2, + getAbsoluteLevel(p, iLangid, iIndex, FTS3_SEGDIR_MAXLEVEL-1) + ); + if( SQLITE_ROW==sqlite3_step(pStmt) ){ + *pnMax = sqlite3_column_int64(pStmt, 0); + } + return sqlite3_reset(pStmt); +} + +/* +** iAbsLevel is an absolute level that may be assumed to exist within +** the database. This function checks if it is the largest level number +** within its index. Assuming no error occurs, *pbMax is set to 1 if +** iAbsLevel is indeed the largest level, or 0 otherwise, and SQLITE_OK +** is returned. If an error occurs, an error code is returned and the +** final value of *pbMax is undefined. +*/ +static int fts3SegmentIsMaxLevel(Fts3Table *p, i64 iAbsLevel, int *pbMax){ + + /* Set pStmt to the compiled version of: + ** + ** SELECT max(level) FROM %Q.'%q_segdir' WHERE level BETWEEN ? AND ? + ** + ** (1024 is actually the value of macro FTS3_SEGDIR_PREFIXLEVEL_STR). + */ + sqlite3_stmt *pStmt; + int rc = fts3SqlStmt(p, SQL_SELECT_SEGDIR_MAX_LEVEL, &pStmt, 0); + if( rc!=SQLITE_OK ) return rc; + sqlite3_bind_int64(pStmt, 1, iAbsLevel+1); + sqlite3_bind_int64(pStmt, 2, + ((iAbsLevel/FTS3_SEGDIR_MAXLEVEL)+1) * FTS3_SEGDIR_MAXLEVEL + ); + + *pbMax = 0; + if( SQLITE_ROW==sqlite3_step(pStmt) ){ + *pbMax = sqlite3_column_type(pStmt, 0)==SQLITE_NULL; + } + return sqlite3_reset(pStmt); +} + +/* +** Delete all entries in the %_segments table associated with the segment +** opened with seg-reader pSeg. This function does not affect the contents +** of the %_segdir table. +*/ +static int fts3DeleteSegment( + Fts3Table *p, /* FTS table handle */ + Fts3SegReader *pSeg /* Segment to delete */ +){ + int rc = SQLITE_OK; /* Return code */ + if( pSeg->iStartBlock ){ + sqlite3_stmt *pDelete; /* SQL statement to delete rows */ + rc = fts3SqlStmt(p, SQL_DELETE_SEGMENTS_RANGE, &pDelete, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int64(pDelete, 1, pSeg->iStartBlock); + sqlite3_bind_int64(pDelete, 2, pSeg->iEndBlock); + sqlite3_step(pDelete); + rc = sqlite3_reset(pDelete); + } + } + return rc; +} + +/* +** 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 +** +** 2) deletes all %_segdir entries with level iLevel, or all %_segdir +** entries regardless of level if (iLevel<0). +** +** SQLITE_OK is returned if successful, otherwise an SQLite error code. +*/ +static int fts3DeleteSegdir( + Fts3Table *p, /* Virtual table handle */ + int iLangid, /* Language id */ + int iIndex, /* Index for p->aIndex */ + int iLevel, /* Level of %_segdir entries to delete */ + Fts3SegReader **apSegment, /* Array of SegReader objects */ + int nReader /* Size of array apSegment */ +){ + int rc = SQLITE_OK; /* Return Code */ + int i; /* Iterator variable */ + sqlite3_stmt *pDelete = 0; /* SQL statement to delete rows */ + + for(i=0; rc==SQLITE_OK && i=0 || iLevel==FTS3_SEGCURSOR_ALL ); + if( iLevel==FTS3_SEGCURSOR_ALL ){ + rc = fts3SqlStmt(p, SQL_DELETE_SEGDIR_RANGE, &pDelete, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int64(pDelete, 1, getAbsoluteLevel(p, iLangid, iIndex, 0)); + sqlite3_bind_int64(pDelete, 2, + getAbsoluteLevel(p, iLangid, iIndex, FTS3_SEGDIR_MAXLEVEL-1) + ); + } + }else{ + rc = fts3SqlStmt(p, SQL_DELETE_SEGDIR_LEVEL, &pDelete, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int64( + pDelete, 1, getAbsoluteLevel(p, iLangid, iIndex, iLevel) + ); + } + } + + if( rc==SQLITE_OK ){ + sqlite3_step(pDelete); + rc = sqlite3_reset(pDelete); + } + + return rc; +} + +/* +** 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. +** +** If there are no entries in the input position list for column iCol, then +** *pnList is set to zero before returning. +** +** If parameter bZero is non-zero, then any part of the input list following +** the end of the output list is zeroed before returning. +*/ +static void fts3ColumnFilter( + int iCol, /* Column to filter on */ + int bZero, /* Zero out anything following *ppList */ + 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( ppMsr->nBuffer ){ + char *pNew; + pMsr->nBuffer = nList*2; + pNew = (char *)sqlite3_realloc(pMsr->aBuffer, pMsr->nBuffer); + if( !pNew ) return SQLITE_NOMEM; + pMsr->aBuffer = pNew; + } + + memcpy(pMsr->aBuffer, pList, nList); + return SQLITE_OK; +} + +SQLITE_PRIVATE int sqlite3Fts3MsrIncrNext( + Fts3Table *p, /* Virtual table handle */ + Fts3MultiSegReader *pMsr, /* Multi-segment-reader handle */ + sqlite3_int64 *piDocid, /* OUT: Docid value */ + char **paPoslist, /* OUT: Pointer to position list */ + int *pnPoslist /* OUT: Size of position list in bytes */ +){ + int nMerge = pMsr->nAdvance; + Fts3SegReader **apSegment = pMsr->apSegment; + int (*xCmp)(Fts3SegReader *, Fts3SegReader *) = ( + p->bDescIdx ? fts3SegReaderDoclistCmpRev : fts3SegReaderDoclistCmp + ); + + if( nMerge==0 ){ + *paPoslist = 0; + return SQLITE_OK; + } + + while( 1 ){ + Fts3SegReader *pSeg; + pSeg = pMsr->apSegment[0]; + + if( pSeg->pOffsetList==0 ){ + *paPoslist = 0; + break; + }else{ + int rc; + char *pList; + int nList; + int j; + sqlite3_int64 iDocid = apSegment[0]->iDocid; + + rc = fts3SegReaderNextDocid(p, apSegment[0], &pList, &nList); + j = 1; + while( rc==SQLITE_OK + && jpOffsetList + && apSegment[j]->iDocid==iDocid + ){ + rc = fts3SegReaderNextDocid(p, apSegment[j], 0, 0); + j++; + } + if( rc!=SQLITE_OK ) return rc; + fts3SegReaderSort(pMsr->apSegment, nMerge, j, xCmp); + + if( nList>0 && fts3SegReaderIsPending(apSegment[0]) ){ + rc = fts3MsrBufferData(pMsr, pList, nList+1); + if( rc!=SQLITE_OK ) return rc; + assert( (pMsr->aBuffer[nList] & 0xFE)==0x00 ); + pList = pMsr->aBuffer; + } + + if( pMsr->iColFilter>=0 ){ + fts3ColumnFilter(pMsr->iColFilter, 1, &pList, &nList); + } + + if( nList>0 ){ + *paPoslist = pList; + *piDocid = iDocid; + *pnPoslist = nList; + break; + } + } + } + + return SQLITE_OK; +} + +static int fts3SegReaderStart( + Fts3Table *p, /* Virtual table handle */ + Fts3MultiSegReader *pCsr, /* Cursor object */ + const char *zTerm, /* Term searched for (or NULL) */ + int nTerm /* Length of zTerm in bytes */ +){ + int i; + int nSeg = pCsr->nSegment; + + /* 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. + */ + for(i=0; pCsr->bRestart==0 && inSegment; i++){ + int res = 0; + Fts3SegReader *pSeg = pCsr->apSegment[i]; + do { + int rc = fts3SegReaderNext(p, pSeg, 0); + if( rc!=SQLITE_OK ) return rc; + }while( zTerm && (res = fts3SegReaderTermCmp(pSeg, zTerm, nTerm))<0 ); + + if( pSeg->bLookup && res!=0 ){ + fts3SegReaderSetEof(pSeg); + } + } + fts3SegReaderSort(pCsr->apSegment, nSeg, nSeg, fts3SegReaderCmp); + + return SQLITE_OK; +} + +SQLITE_PRIVATE int sqlite3Fts3SegReaderStart( + Fts3Table *p, /* Virtual table handle */ + Fts3MultiSegReader *pCsr, /* Cursor object */ + Fts3SegFilter *pFilter /* Restrictions on range of iteration */ +){ + pCsr->pFilter = pFilter; + return fts3SegReaderStart(p, pCsr, pFilter->zTerm, pFilter->nTerm); +} + +SQLITE_PRIVATE int sqlite3Fts3MsrIncrStart( + Fts3Table *p, /* Virtual table handle */ + Fts3MultiSegReader *pCsr, /* Cursor object */ + int iCol, /* Column to match on. */ + const char *zTerm, /* Term to iterate through a doclist for */ + int nTerm /* Number of bytes in zTerm */ +){ + int i; + int rc; + int nSegment = pCsr->nSegment; + int (*xCmp)(Fts3SegReader *, Fts3SegReader *) = ( + p->bDescIdx ? fts3SegReaderDoclistCmpRev : fts3SegReaderDoclistCmp + ); + + assert( pCsr->pFilter==0 ); + assert( zTerm && nTerm>0 ); + + /* Advance each segment iterator until it points to the term zTerm/nTerm. */ + rc = fts3SegReaderStart(p, pCsr, zTerm, nTerm); + if( rc!=SQLITE_OK ) return rc; + + /* Determine how many of the segments actually point to zTerm/nTerm. */ + for(i=0; iapSegment[i]; + if( !pSeg->aNode || fts3SegReaderTermCmp(pSeg, zTerm, nTerm) ){ + break; + } + } + pCsr->nAdvance = i; + + /* Advance each of the segments to point to the first docid. */ + for(i=0; inAdvance; i++){ + rc = fts3SegReaderFirstDocid(p, pCsr->apSegment[i]); + if( rc!=SQLITE_OK ) return rc; + } + fts3SegReaderSort(pCsr->apSegment, i, i, xCmp); + + assert( iCol<0 || iColnColumn ); + pCsr->iColFilter = iCol; + + return SQLITE_OK; +} + +/* +** This function is called on a MultiSegReader that has been started using +** sqlite3Fts3MsrIncrStart(). One or more calls to MsrIncrNext() may also +** have been made. Calling this function puts the MultiSegReader in such +** a state that if the next two calls are: +** +** sqlite3Fts3SegReaderStart() +** sqlite3Fts3SegReaderStep() +** +** then the entire doclist for the term is available in +** MultiSegReader.aDoclist/nDoclist. +*/ +SQLITE_PRIVATE int sqlite3Fts3MsrIncrRestart(Fts3MultiSegReader *pCsr){ + int i; /* Used to iterate through segment-readers */ + + assert( pCsr->zTerm==0 ); + assert( pCsr->nTerm==0 ); + assert( pCsr->aDoclist==0 ); + assert( pCsr->nDoclist==0 ); + + pCsr->nAdvance = 0; + pCsr->bRestart = 1; + for(i=0; inSegment; i++){ + pCsr->apSegment[i]->pOffsetList = 0; + pCsr->apSegment[i]->nOffsetList = 0; + pCsr->apSegment[i]->iDocid = 0; + } + + return SQLITE_OK; +} + + +SQLITE_PRIVATE int sqlite3Fts3SegReaderStep( + Fts3Table *p, /* Virtual table handle */ + Fts3MultiSegReader *pCsr /* Cursor object */ +){ + int rc = SQLITE_OK; + + int isIgnoreEmpty = (pCsr->pFilter->flags & FTS3_SEGMENT_IGNORE_EMPTY); + int isRequirePos = (pCsr->pFilter->flags & FTS3_SEGMENT_REQUIRE_POS); + int isColFilter = (pCsr->pFilter->flags & FTS3_SEGMENT_COLUMN_FILTER); + int isPrefix = (pCsr->pFilter->flags & FTS3_SEGMENT_PREFIX); + int isScan = (pCsr->pFilter->flags & FTS3_SEGMENT_SCAN); + int isFirst = (pCsr->pFilter->flags & FTS3_SEGMENT_FIRST); + + Fts3SegReader **apSegment = pCsr->apSegment; + int nSegment = pCsr->nSegment; + Fts3SegFilter *pFilter = pCsr->pFilter; + int (*xCmp)(Fts3SegReader *, Fts3SegReader *) = ( + p->bDescIdx ? fts3SegReaderDoclistCmpRev : fts3SegReaderDoclistCmp + ); + + if( pCsr->nSegment==0 ) return SQLITE_OK; + + do { + int nMerge; + int i; + + /* Advance the first pCsr->nAdvance entries in the apSegment[] array + ** forward. Then sort the list in order of current term again. + */ + for(i=0; inAdvance; i++){ + Fts3SegReader *pSeg = apSegment[i]; + if( pSeg->bLookup ){ + fts3SegReaderSetEof(pSeg); + }else{ + rc = fts3SegReaderNext(p, pSeg, 0); + } + if( rc!=SQLITE_OK ) return rc; + } + fts3SegReaderSort(apSegment, nSegment, pCsr->nAdvance, fts3SegReaderCmp); + pCsr->nAdvance = 0; + + /* If all the seg-readers are at EOF, we're finished. return SQLITE_OK. */ + assert( rc==SQLITE_OK ); + if( apSegment[0]->aNode==0 ) break; + + pCsr->nTerm = apSegment[0]->nTerm; + pCsr->zTerm = apSegment[0]->zTerm; + + /* 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 && !isScan ){ + if( pCsr->nTermnTerm + || (!isPrefix && pCsr->nTerm>pFilter->nTerm) + || memcmp(pCsr->zTerm, pFilter->zTerm, pFilter->nTerm) + ){ + break; + } + } + + nMerge = 1; + while( nMergeaNode + && apSegment[nMerge]->nTerm==pCsr->nTerm + && 0==memcmp(pCsr->zTerm, apSegment[nMerge]->zTerm, pCsr->nTerm) + ){ + nMerge++; + } + + assert( isIgnoreEmpty || (isRequirePos && !isColFilter) ); + if( nMerge==1 + && !isIgnoreEmpty + && !isFirst + && (p->bDescIdx==0 || fts3SegReaderIsPending(apSegment[0])==0) + ){ + pCsr->nDoclist = apSegment[0]->nDoclist; + if( fts3SegReaderIsPending(apSegment[0]) ){ + rc = fts3MsrBufferData(pCsr, apSegment[0]->aDoclist, pCsr->nDoclist); + pCsr->aDoclist = pCsr->aBuffer; + }else{ + pCsr->aDoclist = apSegment[0]->aDoclist; + } + if( rc==SQLITE_OK ) rc = SQLITE_ROW; + }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 returned with the merged doclist. + */ + for(i=0; ipOffsetList ){ + int j; /* Number of segments that share a docid */ + char *pList = 0; + int nList = 0; + int nByte; + sqlite3_int64 iDocid = apSegment[0]->iDocid; + fts3SegReaderNextDocid(p, apSegment[0], &pList, &nList); + j = 1; + while( jpOffsetList + && apSegment[j]->iDocid==iDocid + ){ + fts3SegReaderNextDocid(p, apSegment[j], 0, 0); + j++; + } + + if( isColFilter ){ + fts3ColumnFilter(pFilter->iCol, 0, &pList, &nList); + } + + if( !isIgnoreEmpty || nList>0 ){ + + /* Calculate the 'docid' delta value to write into the merged + ** doclist. */ + sqlite3_int64 iDelta; + if( p->bDescIdx && nDoclist>0 ){ + iDelta = iPrev - iDocid; + }else{ + iDelta = iDocid - iPrev; + } + assert( iDelta>0 || (nDoclist==0 && iDelta==iDocid) ); + assert( nDoclist>0 || iDelta==iDocid ); + + nByte = sqlite3Fts3VarintLen(iDelta) + (isRequirePos?nList+1:0); + if( nDoclist+nByte>pCsr->nBuffer ){ + char *aNew; + pCsr->nBuffer = (nDoclist+nByte)*2; + aNew = sqlite3_realloc(pCsr->aBuffer, pCsr->nBuffer); + if( !aNew ){ + return SQLITE_NOMEM; + } + pCsr->aBuffer = aNew; + } + + if( isFirst ){ + char *a = &pCsr->aBuffer[nDoclist]; + int nWrite; + + nWrite = sqlite3Fts3FirstFilter(iDelta, pList, nList, a); + if( nWrite ){ + iPrev = iDocid; + nDoclist += nWrite; + } + }else{ + nDoclist += sqlite3Fts3PutVarint(&pCsr->aBuffer[nDoclist], iDelta); + iPrev = iDocid; + if( isRequirePos ){ + memcpy(&pCsr->aBuffer[nDoclist], pList, nList); + nDoclist += nList; + pCsr->aBuffer[nDoclist++] = '\0'; + } + } + } + + fts3SegReaderSort(apSegment, nMerge, j, xCmp); + } + if( nDoclist>0 ){ + pCsr->aDoclist = pCsr->aBuffer; + pCsr->nDoclist = nDoclist; + rc = SQLITE_ROW; + } + } + pCsr->nAdvance = nMerge; + }while( rc==SQLITE_OK ); + + return rc; +} + + +SQLITE_PRIVATE void sqlite3Fts3SegReaderFinish( + Fts3MultiSegReader *pCsr /* Cursor object */ +){ + if( pCsr ){ + int i; + for(i=0; inSegment; i++){ + sqlite3Fts3SegReaderFree(pCsr->apSegment[i]); + } + sqlite3_free(pCsr->apSegment); + sqlite3_free(pCsr->aBuffer); + + pCsr->nSegment = 0; + pCsr->apSegment = 0; + pCsr->aBuffer = 0; + } +} + +/* +** Decode the "end_block" field, selected by column iCol of the SELECT +** statement passed as the first argument. +** +** The "end_block" field may contain either an integer, or a text field +** containing the text representation of two non-negative integers separated +** by one or more space (0x20) characters. In the first case, set *piEndBlock +** to the integer value and *pnByte to zero before returning. In the second, +** set *piEndBlock to the first value and *pnByte to the second. +*/ +static void fts3ReadEndBlockField( + sqlite3_stmt *pStmt, + int iCol, + i64 *piEndBlock, + i64 *pnByte +){ + const unsigned char *zText = sqlite3_column_text(pStmt, iCol); + if( zText ){ + int i; + int iMul = 1; + i64 iVal = 0; + for(i=0; zText[i]>='0' && zText[i]<='9'; i++){ + iVal = iVal*10 + (zText[i] - '0'); + } + *piEndBlock = iVal; + while( zText[i]==' ' ) i++; + iVal = 0; + if( zText[i]=='-' ){ + i++; + iMul = -1; + } + for(/* no-op */; zText[i]>='0' && zText[i]<='9'; i++){ + iVal = iVal*10 + (zText[i] - '0'); + } + *pnByte = (iVal * (i64)iMul); + } +} + + +/* +** A segment of size nByte bytes has just been written to absolute level +** iAbsLevel. Promote any segments that should be promoted as a result. +*/ +static int fts3PromoteSegments( + Fts3Table *p, /* FTS table handle */ + sqlite3_int64 iAbsLevel, /* Absolute level just updated */ + sqlite3_int64 nByte /* Size of new segment at iAbsLevel */ +){ + int rc = SQLITE_OK; + sqlite3_stmt *pRange; + + rc = fts3SqlStmt(p, SQL_SELECT_LEVEL_RANGE2, &pRange, 0); + + if( rc==SQLITE_OK ){ + int bOk = 0; + i64 iLast = (iAbsLevel/FTS3_SEGDIR_MAXLEVEL + 1) * FTS3_SEGDIR_MAXLEVEL - 1; + i64 nLimit = (nByte*3)/2; + + /* Loop through all entries in the %_segdir table corresponding to + ** segments in this index on levels greater than iAbsLevel. If there is + ** at least one such segment, and it is possible to determine that all + ** such segments are smaller than nLimit bytes in size, they will be + ** promoted to level iAbsLevel. */ + sqlite3_bind_int64(pRange, 1, iAbsLevel+1); + sqlite3_bind_int64(pRange, 2, iLast); + while( SQLITE_ROW==sqlite3_step(pRange) ){ + i64 nSize = 0, dummy; + fts3ReadEndBlockField(pRange, 2, &dummy, &nSize); + if( nSize<=0 || nSize>nLimit ){ + /* If nSize==0, then the %_segdir.end_block field does not not + ** contain a size value. This happens if it was written by an + ** old version of FTS. In this case it is not possible to determine + ** the size of the segment, and so segment promotion does not + ** take place. */ + bOk = 0; + break; + } + bOk = 1; + } + rc = sqlite3_reset(pRange); + + if( bOk ){ + int iIdx = 0; + sqlite3_stmt *pUpdate1 = 0; + sqlite3_stmt *pUpdate2 = 0; + + if( rc==SQLITE_OK ){ + rc = fts3SqlStmt(p, SQL_UPDATE_LEVEL_IDX, &pUpdate1, 0); + } + if( rc==SQLITE_OK ){ + rc = fts3SqlStmt(p, SQL_UPDATE_LEVEL, &pUpdate2, 0); + } + + if( rc==SQLITE_OK ){ + + /* Loop through all %_segdir entries for segments in this index with + ** levels equal to or greater than iAbsLevel. As each entry is visited, + ** updated it to set (level = -1) and (idx = N), where N is 0 for the + ** oldest segment in the range, 1 for the next oldest, and so on. + ** + ** In other words, move all segments being promoted to level -1, + ** setting the "idx" fields as appropriate to keep them in the same + ** order. The contents of level -1 (which is never used, except + ** transiently here), will be moved back to level iAbsLevel below. */ + sqlite3_bind_int64(pRange, 1, iAbsLevel); + while( SQLITE_ROW==sqlite3_step(pRange) ){ + sqlite3_bind_int(pUpdate1, 1, iIdx++); + sqlite3_bind_int(pUpdate1, 2, sqlite3_column_int(pRange, 0)); + sqlite3_bind_int(pUpdate1, 3, sqlite3_column_int(pRange, 1)); + sqlite3_step(pUpdate1); + rc = sqlite3_reset(pUpdate1); + if( rc!=SQLITE_OK ){ + sqlite3_reset(pRange); + break; + } + } + } + if( rc==SQLITE_OK ){ + rc = sqlite3_reset(pRange); + } + + /* Move level -1 to level iAbsLevel */ + if( rc==SQLITE_OK ){ + sqlite3_bind_int64(pUpdate2, 1, iAbsLevel); + sqlite3_step(pUpdate2); + rc = sqlite3_reset(pUpdate2); + } + } + } + + + return rc; +} + +/* +** Merge all level iLevel segments in the database into a single +** iLevel+1 segment. Or, if iLevel<0, merge all segments into a +** single segment with a level equal to the numerically largest level +** currently present in the database. +** +** If this function is called with iLevel<0, but there is only one +** segment in the database, SQLITE_DONE is returned immediately. +** Otherwise, if successful, SQLITE_OK is returned. If an error occurs, +** an SQLite error code is returned. +*/ +static int fts3SegmentMerge( + Fts3Table *p, + int iLangid, /* Language id to merge */ + int iIndex, /* Index in p->aIndex[] to merge */ + int iLevel /* Level to merge */ +){ + int rc; /* Return code */ + int iIdx = 0; /* Index of new segment */ + sqlite3_int64 iNewLevel = 0; /* Level/index to create new segment at */ + SegmentWriter *pWriter = 0; /* Used to write the new, merged, segment */ + Fts3SegFilter filter; /* Segment term filter condition */ + Fts3MultiSegReader csr; /* Cursor to iterate through level(s) */ + int bIgnoreEmpty = 0; /* True to ignore empty segments */ + i64 iMaxLevel = 0; /* Max level number for this index/langid */ + + assert( iLevel==FTS3_SEGCURSOR_ALL + || iLevel==FTS3_SEGCURSOR_PENDING + || iLevel>=0 + ); + assert( iLevel=0 && iIndexnIndex ); + + rc = sqlite3Fts3SegReaderCursor(p, iLangid, iIndex, iLevel, 0, 0, 1, 0, &csr); + if( rc!=SQLITE_OK || csr.nSegment==0 ) goto finished; + + if( iLevel!=FTS3_SEGCURSOR_PENDING ){ + rc = fts3SegmentMaxLevel(p, iLangid, iIndex, &iMaxLevel); + if( rc!=SQLITE_OK ) goto finished; + } + + if( iLevel==FTS3_SEGCURSOR_ALL ){ + /* This call is to merge all segments in the database to a single + ** segment. The level of the new segment is equal to the numerically + ** greatest segment level currently present in the database for this + ** index. The idx of the new segment is always 0. */ + if( csr.nSegment==1 && 0==fts3SegReaderIsPending(csr.apSegment[0]) ){ + rc = SQLITE_DONE; + goto finished; + } + iNewLevel = iMaxLevel; + bIgnoreEmpty = 1; + + }else{ + /* 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. */ + assert( FTS3_SEGCURSOR_PENDING==-1 ); + iNewLevel = getAbsoluteLevel(p, iLangid, iIndex, iLevel+1); + rc = fts3AllocateSegdirIdx(p, iLangid, iIndex, iLevel+1, &iIdx); + bIgnoreEmpty = (iLevel!=FTS3_SEGCURSOR_PENDING) && (iNewLevel>iMaxLevel); + } + if( rc!=SQLITE_OK ) goto finished; + + assert( csr.nSegment>0 ); + assert( iNewLevel>=getAbsoluteLevel(p, iLangid, iIndex, 0) ); + assert( iNewLevelnLeafData); + } + } + } + + finished: + fts3SegWriterFree(pWriter); + sqlite3Fts3SegReaderFinish(&csr); + return rc; +} + + +/* +** Flush the contents of pendingTerms to level 0 segments. +*/ +SQLITE_PRIVATE int sqlite3Fts3PendingTermsFlush(Fts3Table *p){ + int rc = SQLITE_OK; + int i; + + for(i=0; rc==SQLITE_OK && inIndex; i++){ + rc = fts3SegmentMerge(p, p->iPrevLangid, i, FTS3_SEGCURSOR_PENDING); + if( rc==SQLITE_DONE ) rc = SQLITE_OK; + } + sqlite3Fts3PendingTermsClear(p); + + /* Determine the auto-incr-merge setting if unknown. If enabled, + ** estimate the number of leaf blocks of content to be written + */ + if( rc==SQLITE_OK && p->bHasStat + && p->nAutoincrmerge==0xff && p->nLeafAdd>0 + ){ + sqlite3_stmt *pStmt = 0; + rc = fts3SqlStmt(p, SQL_SELECT_STAT, &pStmt, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int(pStmt, 1, FTS_STAT_AUTOINCRMERGE); + rc = sqlite3_step(pStmt); + if( rc==SQLITE_ROW ){ + p->nAutoincrmerge = sqlite3_column_int(pStmt, 0); + if( p->nAutoincrmerge==1 ) p->nAutoincrmerge = 8; + }else if( rc==SQLITE_DONE ){ + p->nAutoincrmerge = 0; + } + rc = sqlite3_reset(pStmt); + } + } + return rc; +} + +/* +** Encode N integers as varints into a blob. +*/ +static void fts3EncodeIntArray( + int N, /* The number of integers to encode */ + u32 *a, /* The integer values */ + char *zBuf, /* Write the BLOB here */ + int *pNBuf /* Write number of bytes if zBuf[] used here */ +){ + int i, j; + for(i=j=0; iiPrevDocid. The sizes are encoded as +** a blob of varints. +*/ +static void fts3InsertDocsize( + int *pRC, /* Result code */ + Fts3Table *p, /* Table into which to insert */ + u32 *aSz /* Sizes of each column, in tokens */ +){ + char *pBlob; /* The BLOB encoding of the document size */ + int nBlob; /* Number of bytes in the BLOB */ + sqlite3_stmt *pStmt; /* Statement used to insert the encoding */ + int rc; /* Result code from subfunctions */ + + if( *pRC ) return; + pBlob = sqlite3_malloc( 10*p->nColumn ); + if( pBlob==0 ){ + *pRC = SQLITE_NOMEM; + return; + } + fts3EncodeIntArray(p->nColumn, aSz, pBlob, &nBlob); + rc = fts3SqlStmt(p, SQL_REPLACE_DOCSIZE, &pStmt, 0); + if( rc ){ + sqlite3_free(pBlob); + *pRC = rc; + return; + } + sqlite3_bind_int64(pStmt, 1, p->iPrevDocid); + sqlite3_bind_blob(pStmt, 2, pBlob, nBlob, sqlite3_free); + sqlite3_step(pStmt); + *pRC = sqlite3_reset(pStmt); +} + +/* +** Record 0 of the %_stat table contains a blob consisting of N varints, +** where N is the number of user defined columns in the fts3 table plus +** two. If nCol is the number of user defined columns, then values of the +** varints are set as follows: +** +** Varint 0: Total number of rows in the table. +** +** Varint 1..nCol: For each column, the total number of tokens stored in +** the column for all rows of the table. +** +** Varint 1+nCol: The total size, in bytes, of all text values in all +** columns of all rows of the table. +** +*/ +static void fts3UpdateDocTotals( + int *pRC, /* The result code */ + Fts3Table *p, /* Table being updated */ + u32 *aSzIns, /* Size increases */ + u32 *aSzDel, /* Size decreases */ + int nChng /* Change in the number of documents */ +){ + char *pBlob; /* Storage for BLOB written into %_stat */ + int nBlob; /* Size of BLOB written into %_stat */ + u32 *a; /* Array of integers that becomes the BLOB */ + sqlite3_stmt *pStmt; /* Statement for reading and writing */ + int i; /* Loop counter */ + int rc; /* Result code from subfunctions */ + + const int nStat = p->nColumn+2; + + if( *pRC ) return; + a = sqlite3_malloc( (sizeof(u32)+10)*nStat ); + if( a==0 ){ + *pRC = SQLITE_NOMEM; + return; + } + pBlob = (char*)&a[nStat]; + rc = fts3SqlStmt(p, SQL_SELECT_STAT, &pStmt, 0); + if( rc ){ + sqlite3_free(a); + *pRC = rc; + return; + } + sqlite3_bind_int(pStmt, 1, FTS_STAT_DOCTOTAL); + if( sqlite3_step(pStmt)==SQLITE_ROW ){ + fts3DecodeIntArray(nStat, a, + sqlite3_column_blob(pStmt, 0), + sqlite3_column_bytes(pStmt, 0)); + }else{ + memset(a, 0, sizeof(u32)*(nStat) ); + } + rc = sqlite3_reset(pStmt); + if( rc!=SQLITE_OK ){ + sqlite3_free(a); + *pRC = rc; + return; + } + if( nChng<0 && a[0]<(u32)(-nChng) ){ + a[0] = 0; + }else{ + a[0] += nChng; + } + for(i=0; inColumn+1; i++){ + u32 x = a[i+1]; + if( x+aSzIns[i] < aSzDel[i] ){ + x = 0; + }else{ + x = x + aSzIns[i] - aSzDel[i]; + } + a[i+1] = x; + } + fts3EncodeIntArray(nStat, a, pBlob, &nBlob); + rc = fts3SqlStmt(p, SQL_REPLACE_STAT, &pStmt, 0); + if( rc ){ + sqlite3_free(a); + *pRC = rc; + return; + } + sqlite3_bind_int(pStmt, 1, FTS_STAT_DOCTOTAL); + sqlite3_bind_blob(pStmt, 2, pBlob, nBlob, SQLITE_STATIC); + sqlite3_step(pStmt); + *pRC = sqlite3_reset(pStmt); + sqlite3_free(a); +} + +/* +** Merge the entire database so that there is one segment for each +** iIndex/iLangid combination. +*/ +static int fts3DoOptimize(Fts3Table *p, int bReturnDone){ + int bSeenDone = 0; + int rc; + sqlite3_stmt *pAllLangid = 0; + + rc = fts3SqlStmt(p, SQL_SELECT_ALL_LANGID, &pAllLangid, 0); + if( rc==SQLITE_OK ){ + int rc2; + sqlite3_bind_int(pAllLangid, 1, p->iPrevLangid); + sqlite3_bind_int(pAllLangid, 2, p->nIndex); + while( sqlite3_step(pAllLangid)==SQLITE_ROW ){ + int i; + int iLangid = sqlite3_column_int(pAllLangid, 0); + for(i=0; rc==SQLITE_OK && inIndex; i++){ + rc = fts3SegmentMerge(p, iLangid, i, FTS3_SEGCURSOR_ALL); + if( rc==SQLITE_DONE ){ + bSeenDone = 1; + rc = SQLITE_OK; + } + } + } + rc2 = sqlite3_reset(pAllLangid); + if( rc==SQLITE_OK ) rc = rc2; + } + + sqlite3Fts3SegmentsClose(p); + sqlite3Fts3PendingTermsClear(p); + + return (rc==SQLITE_OK && bReturnDone && bSeenDone) ? SQLITE_DONE : rc; +} + +/* +** This function is called when the user executes the following statement: +** +** INSERT INTO () VALUES('rebuild'); +** +** The entire FTS index is discarded and rebuilt. If the table is one +** created using the content=xxx option, then the new index is based on +** the current contents of the xxx table. Otherwise, it is rebuilt based +** on the contents of the %_content table. +*/ +static int fts3DoRebuild(Fts3Table *p){ + int rc; /* Return Code */ + + rc = fts3DeleteAll(p, 0); + if( rc==SQLITE_OK ){ + u32 *aSz = 0; + u32 *aSzIns = 0; + u32 *aSzDel = 0; + sqlite3_stmt *pStmt = 0; + int nEntry = 0; + + /* Compose and prepare an SQL statement to loop through the content table */ + char *zSql = sqlite3_mprintf("SELECT %s" , p->zReadExprlist); + if( !zSql ){ + rc = SQLITE_NOMEM; + }else{ + rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); + sqlite3_free(zSql); + } + + if( rc==SQLITE_OK ){ + int nByte = sizeof(u32) * (p->nColumn+1)*3; + aSz = (u32 *)sqlite3_malloc(nByte); + if( aSz==0 ){ + rc = SQLITE_NOMEM; + }else{ + memset(aSz, 0, nByte); + aSzIns = &aSz[p->nColumn+1]; + aSzDel = &aSzIns[p->nColumn+1]; + } + } + + while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ + int iCol; + int iLangid = langidFromSelect(p, pStmt); + rc = fts3PendingTermsDocid(p, 0, iLangid, sqlite3_column_int64(pStmt, 0)); + memset(aSz, 0, sizeof(aSz[0]) * (p->nColumn+1)); + for(iCol=0; rc==SQLITE_OK && iColnColumn; iCol++){ + if( p->abNotindexed[iCol]==0 ){ + const char *z = (const char *) sqlite3_column_text(pStmt, iCol+1); + rc = fts3PendingTermsAdd(p, iLangid, z, iCol, &aSz[iCol]); + aSz[p->nColumn] += sqlite3_column_bytes(pStmt, iCol+1); + } + } + if( p->bHasDocsize ){ + fts3InsertDocsize(&rc, p, aSz); + } + if( rc!=SQLITE_OK ){ + sqlite3_finalize(pStmt); + pStmt = 0; + }else{ + nEntry++; + for(iCol=0; iCol<=p->nColumn; iCol++){ + aSzIns[iCol] += aSz[iCol]; + } + } + } + if( p->bFts4 ){ + fts3UpdateDocTotals(&rc, p, aSzIns, aSzDel, nEntry); + } + sqlite3_free(aSz); + + if( pStmt ){ + int rc2 = sqlite3_finalize(pStmt); + if( rc==SQLITE_OK ){ + rc = rc2; + } + } + } + + return rc; +} + + +/* +** This function opens a cursor used to read the input data for an +** incremental merge operation. Specifically, it opens a cursor to scan +** the oldest nSeg segments (idx=0 through idx=(nSeg-1)) in absolute +** level iAbsLevel. +*/ +static int fts3IncrmergeCsr( + Fts3Table *p, /* FTS3 table handle */ + sqlite3_int64 iAbsLevel, /* Absolute level to open */ + int nSeg, /* Number of segments to merge */ + Fts3MultiSegReader *pCsr /* Cursor object to populate */ +){ + int rc; /* Return Code */ + sqlite3_stmt *pStmt = 0; /* Statement used to read %_segdir entry */ + int nByte; /* Bytes allocated at pCsr->apSegment[] */ + + /* Allocate space for the Fts3MultiSegReader.aCsr[] array */ + memset(pCsr, 0, sizeof(*pCsr)); + nByte = sizeof(Fts3SegReader *) * nSeg; + pCsr->apSegment = (Fts3SegReader **)sqlite3_malloc(nByte); + + if( pCsr->apSegment==0 ){ + rc = SQLITE_NOMEM; + }else{ + memset(pCsr->apSegment, 0, nByte); + rc = fts3SqlStmt(p, SQL_SELECT_LEVEL, &pStmt, 0); + } + if( rc==SQLITE_OK ){ + int i; + int rc2; + sqlite3_bind_int64(pStmt, 1, iAbsLevel); + assert( pCsr->nSegment==0 ); + for(i=0; rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW && iapSegment[i] + ); + pCsr->nSegment++; + } + rc2 = sqlite3_reset(pStmt); + if( rc==SQLITE_OK ) rc = rc2; + } + + return rc; +} + +typedef struct IncrmergeWriter IncrmergeWriter; +typedef struct NodeWriter NodeWriter; +typedef struct Blob Blob; +typedef struct NodeReader NodeReader; + +/* +** An instance of the following structure is used as a dynamic buffer +** to build up nodes or other blobs of data in. +** +** The function blobGrowBuffer() is used to extend the allocation. +*/ +struct Blob { + char *a; /* Pointer to allocation */ + int n; /* Number of valid bytes of data in a[] */ + int nAlloc; /* Allocated size of a[] (nAlloc>=n) */ +}; + +/* +** This structure is used to build up buffers containing segment b-tree +** nodes (blocks). +*/ +struct NodeWriter { + sqlite3_int64 iBlock; /* Current block id */ + Blob key; /* Last key written to the current block */ + Blob block; /* Current block image */ +}; + +/* +** An object of this type contains the state required to create or append +** to an appendable b-tree segment. +*/ +struct IncrmergeWriter { + int nLeafEst; /* Space allocated for leaf blocks */ + int nWork; /* Number of leaf pages flushed */ + sqlite3_int64 iAbsLevel; /* Absolute level of input segments */ + int iIdx; /* Index of *output* segment in iAbsLevel+1 */ + sqlite3_int64 iStart; /* Block number of first allocated block */ + sqlite3_int64 iEnd; /* Block number of last allocated block */ + sqlite3_int64 nLeafData; /* Bytes of leaf page data so far */ + u8 bNoLeafData; /* If true, store 0 for segment size */ + NodeWriter aNodeWriter[FTS_MAX_APPENDABLE_HEIGHT]; +}; + +/* +** An object of the following type is used to read data from a single +** FTS segment node. See the following functions: +** +** nodeReaderInit() +** nodeReaderNext() +** nodeReaderRelease() +*/ +struct NodeReader { + const char *aNode; + int nNode; + int iOff; /* Current offset within aNode[] */ + + /* Output variables. Containing the current node entry. */ + sqlite3_int64 iChild; /* Pointer to child node */ + Blob term; /* Current term */ + const char *aDoclist; /* Pointer to doclist */ + int nDoclist; /* Size of doclist in bytes */ +}; + +/* +** If *pRc is not SQLITE_OK when this function is called, it is a no-op. +** Otherwise, if the allocation at pBlob->a is not already at least nMin +** bytes in size, extend (realloc) it to be so. +** +** If an OOM error occurs, set *pRc to SQLITE_NOMEM and leave pBlob->a +** unmodified. Otherwise, if the allocation succeeds, update pBlob->nAlloc +** to reflect the new size of the pBlob->a[] buffer. +*/ +static void blobGrowBuffer(Blob *pBlob, int nMin, int *pRc){ + if( *pRc==SQLITE_OK && nMin>pBlob->nAlloc ){ + int nAlloc = nMin; + char *a = (char *)sqlite3_realloc(pBlob->a, nAlloc); + if( a ){ + pBlob->nAlloc = nAlloc; + pBlob->a = a; + }else{ + *pRc = SQLITE_NOMEM; + } + } +} + +/* +** Attempt to advance the node-reader object passed as the first argument to +** the next entry on the node. +** +** Return an error code if an error occurs (SQLITE_NOMEM is possible). +** Otherwise return SQLITE_OK. If there is no next entry on the node +** (e.g. because the current entry is the last) set NodeReader->aNode to +** NULL to indicate EOF. Otherwise, populate the NodeReader structure output +** variables for the new entry. +*/ +static int nodeReaderNext(NodeReader *p){ + int bFirst = (p->term.n==0); /* True for first term on the node */ + int nPrefix = 0; /* Bytes to copy from previous term */ + int nSuffix = 0; /* Bytes to append to the prefix */ + int rc = SQLITE_OK; /* Return code */ + + assert( p->aNode ); + if( p->iChild && bFirst==0 ) p->iChild++; + if( p->iOff>=p->nNode ){ + /* EOF */ + p->aNode = 0; + }else{ + if( bFirst==0 ){ + p->iOff += fts3GetVarint32(&p->aNode[p->iOff], &nPrefix); + } + p->iOff += fts3GetVarint32(&p->aNode[p->iOff], &nSuffix); + + blobGrowBuffer(&p->term, nPrefix+nSuffix, &rc); + if( rc==SQLITE_OK ){ + memcpy(&p->term.a[nPrefix], &p->aNode[p->iOff], nSuffix); + p->term.n = nPrefix+nSuffix; + p->iOff += nSuffix; + if( p->iChild==0 ){ + p->iOff += fts3GetVarint32(&p->aNode[p->iOff], &p->nDoclist); + p->aDoclist = &p->aNode[p->iOff]; + p->iOff += p->nDoclist; + } + } + } + + assert( p->iOff<=p->nNode ); + + return rc; +} + +/* +** Release all dynamic resources held by node-reader object *p. +*/ +static void nodeReaderRelease(NodeReader *p){ + sqlite3_free(p->term.a); +} + +/* +** Initialize a node-reader object to read the node in buffer aNode/nNode. +** +** If successful, SQLITE_OK is returned and the NodeReader object set to +** point to the first entry on the node (if any). Otherwise, an SQLite +** error code is returned. +*/ +static int nodeReaderInit(NodeReader *p, const char *aNode, int nNode){ + memset(p, 0, sizeof(NodeReader)); + p->aNode = aNode; + p->nNode = nNode; + + /* Figure out if this is a leaf or an internal node. */ + if( p->aNode[0] ){ + /* An internal node. */ + p->iOff = 1 + sqlite3Fts3GetVarint(&p->aNode[1], &p->iChild); + }else{ + p->iOff = 1; + } + + return nodeReaderNext(p); +} + +/* +** This function is called while writing an FTS segment each time a leaf o +** node is finished and written to disk. The key (zTerm/nTerm) is guaranteed +** to be greater than the largest key on the node just written, but smaller +** than or equal to the first key that will be written to the next leaf +** node. +** +** The block id of the leaf node just written to disk may be found in +** (pWriter->aNodeWriter[0].iBlock) when this function is called. +*/ +static int fts3IncrmergePush( + Fts3Table *p, /* Fts3 table handle */ + IncrmergeWriter *pWriter, /* Writer object */ + const char *zTerm, /* Term to write to internal node */ + int nTerm /* Bytes at zTerm */ +){ + sqlite3_int64 iPtr = pWriter->aNodeWriter[0].iBlock; + int iLayer; + + assert( nTerm>0 ); + for(iLayer=1; ALWAYS(iLayeraNodeWriter[iLayer]; + int rc = SQLITE_OK; + int nPrefix; + int nSuffix; + int nSpace; + + /* Figure out how much space the key will consume if it is written to + ** the current node of layer iLayer. Due to the prefix compression, + ** the space required changes depending on which node the key is to + ** be added to. */ + nPrefix = fts3PrefixCompress(pNode->key.a, pNode->key.n, zTerm, nTerm); + nSuffix = nTerm - nPrefix; + nSpace = sqlite3Fts3VarintLen(nPrefix); + nSpace += sqlite3Fts3VarintLen(nSuffix) + nSuffix; + + if( pNode->key.n==0 || (pNode->block.n + nSpace)<=p->nNodeSize ){ + /* If the current node of layer iLayer contains zero keys, or if adding + ** the key to it will not cause it to grow to larger than nNodeSize + ** bytes in size, write the key here. */ + + Blob *pBlk = &pNode->block; + if( pBlk->n==0 ){ + blobGrowBuffer(pBlk, p->nNodeSize, &rc); + if( rc==SQLITE_OK ){ + pBlk->a[0] = (char)iLayer; + pBlk->n = 1 + sqlite3Fts3PutVarint(&pBlk->a[1], iPtr); + } + } + blobGrowBuffer(pBlk, pBlk->n + nSpace, &rc); + blobGrowBuffer(&pNode->key, nTerm, &rc); + + if( rc==SQLITE_OK ){ + if( pNode->key.n ){ + pBlk->n += sqlite3Fts3PutVarint(&pBlk->a[pBlk->n], nPrefix); + } + pBlk->n += sqlite3Fts3PutVarint(&pBlk->a[pBlk->n], nSuffix); + memcpy(&pBlk->a[pBlk->n], &zTerm[nPrefix], nSuffix); + pBlk->n += nSuffix; + + memcpy(pNode->key.a, zTerm, nTerm); + pNode->key.n = nTerm; + } + }else{ + /* Otherwise, flush the current node of layer iLayer to disk. + ** Then allocate a new, empty sibling node. The key will be written + ** into the parent of this node. */ + rc = fts3WriteSegment(p, pNode->iBlock, pNode->block.a, pNode->block.n); + + assert( pNode->block.nAlloc>=p->nNodeSize ); + pNode->block.a[0] = (char)iLayer; + pNode->block.n = 1 + sqlite3Fts3PutVarint(&pNode->block.a[1], iPtr+1); + + iNextPtr = pNode->iBlock; + pNode->iBlock++; + pNode->key.n = 0; + } + + if( rc!=SQLITE_OK || iNextPtr==0 ) return rc; + iPtr = iNextPtr; + } + + assert( 0 ); + return 0; +} + +/* +** Append a term and (optionally) doclist to the FTS segment node currently +** stored in blob *pNode. The node need not contain any terms, but the +** header must be written before this function is called. +** +** A node header is a single 0x00 byte for a leaf node, or a height varint +** followed by the left-hand-child varint for an internal node. +** +** The term to be appended is passed via arguments zTerm/nTerm. For a +** leaf node, the doclist is passed as aDoclist/nDoclist. For an internal +** node, both aDoclist and nDoclist must be passed 0. +** +** If the size of the value in blob pPrev is zero, then this is the first +** term written to the node. Otherwise, pPrev contains a copy of the +** previous term. Before this function returns, it is updated to contain a +** copy of zTerm/nTerm. +** +** It is assumed that the buffer associated with pNode is already large +** enough to accommodate the new entry. The buffer associated with pPrev +** is extended by this function if requrired. +** +** If an error (i.e. OOM condition) occurs, an SQLite error code is +** returned. Otherwise, SQLITE_OK. +*/ +static int fts3AppendToNode( + Blob *pNode, /* Current node image to append to */ + Blob *pPrev, /* Buffer containing previous term written */ + const char *zTerm, /* New term to write */ + int nTerm, /* Size of zTerm in bytes */ + const char *aDoclist, /* Doclist (or NULL) to write */ + int nDoclist /* Size of aDoclist in bytes */ +){ + int rc = SQLITE_OK; /* Return code */ + int bFirst = (pPrev->n==0); /* True if this is the first term written */ + int nPrefix; /* Size of term prefix in bytes */ + int nSuffix; /* Size of term suffix in bytes */ + + /* Node must have already been started. There must be a doclist for a + ** leaf node, and there must not be a doclist for an internal node. */ + assert( pNode->n>0 ); + assert( (pNode->a[0]=='\0')==(aDoclist!=0) ); + + blobGrowBuffer(pPrev, nTerm, &rc); + if( rc!=SQLITE_OK ) return rc; + + nPrefix = fts3PrefixCompress(pPrev->a, pPrev->n, zTerm, nTerm); + nSuffix = nTerm - nPrefix; + memcpy(pPrev->a, zTerm, nTerm); + pPrev->n = nTerm; + + if( bFirst==0 ){ + pNode->n += sqlite3Fts3PutVarint(&pNode->a[pNode->n], nPrefix); + } + pNode->n += sqlite3Fts3PutVarint(&pNode->a[pNode->n], nSuffix); + memcpy(&pNode->a[pNode->n], &zTerm[nPrefix], nSuffix); + pNode->n += nSuffix; + + if( aDoclist ){ + pNode->n += sqlite3Fts3PutVarint(&pNode->a[pNode->n], nDoclist); + memcpy(&pNode->a[pNode->n], aDoclist, nDoclist); + pNode->n += nDoclist; + } + + assert( pNode->n<=pNode->nAlloc ); + + return SQLITE_OK; +} + +/* +** Append the current term and doclist pointed to by cursor pCsr to the +** appendable b-tree segment opened for writing by pWriter. +** +** Return SQLITE_OK if successful, or an SQLite error code otherwise. +*/ +static int fts3IncrmergeAppend( + Fts3Table *p, /* Fts3 table handle */ + IncrmergeWriter *pWriter, /* Writer object */ + Fts3MultiSegReader *pCsr /* Cursor containing term and doclist */ +){ + const char *zTerm = pCsr->zTerm; + int nTerm = pCsr->nTerm; + const char *aDoclist = pCsr->aDoclist; + int nDoclist = pCsr->nDoclist; + int rc = SQLITE_OK; /* Return code */ + int nSpace; /* Total space in bytes required on leaf */ + int nPrefix; /* Size of prefix shared with previous term */ + int nSuffix; /* Size of suffix (nTerm - nPrefix) */ + NodeWriter *pLeaf; /* Object used to write leaf nodes */ + + pLeaf = &pWriter->aNodeWriter[0]; + nPrefix = fts3PrefixCompress(pLeaf->key.a, pLeaf->key.n, zTerm, nTerm); + nSuffix = nTerm - nPrefix; + + nSpace = sqlite3Fts3VarintLen(nPrefix); + nSpace += sqlite3Fts3VarintLen(nSuffix) + nSuffix; + nSpace += sqlite3Fts3VarintLen(nDoclist) + nDoclist; + + /* If the current block is not empty, and if adding this term/doclist + ** to the current block would make it larger than Fts3Table.nNodeSize + ** bytes, write this block out to the database. */ + if( pLeaf->block.n>0 && (pLeaf->block.n + nSpace)>p->nNodeSize ){ + rc = fts3WriteSegment(p, pLeaf->iBlock, pLeaf->block.a, pLeaf->block.n); + pWriter->nWork++; + + /* Add the current term to the parent node. The term added to the + ** parent must: + ** + ** a) be greater than the largest term on the leaf node just written + ** to the database (still available in pLeaf->key), 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. + */ + if( rc==SQLITE_OK ){ + rc = fts3IncrmergePush(p, pWriter, zTerm, nPrefix+1); + } + + /* Advance to the next output block */ + pLeaf->iBlock++; + pLeaf->key.n = 0; + pLeaf->block.n = 0; + + nSuffix = nTerm; + nSpace = 1; + nSpace += sqlite3Fts3VarintLen(nSuffix) + nSuffix; + nSpace += sqlite3Fts3VarintLen(nDoclist) + nDoclist; + } + + pWriter->nLeafData += nSpace; + blobGrowBuffer(&pLeaf->block, pLeaf->block.n + nSpace, &rc); + if( rc==SQLITE_OK ){ + if( pLeaf->block.n==0 ){ + pLeaf->block.n = 1; + pLeaf->block.a[0] = '\0'; + } + rc = fts3AppendToNode( + &pLeaf->block, &pLeaf->key, zTerm, nTerm, aDoclist, nDoclist + ); + } + + return rc; +} + +/* +** This function is called to release all dynamic resources held by the +** merge-writer object pWriter, and if no error has occurred, to flush +** all outstanding node buffers held by pWriter to disk. +** +** If *pRc is not SQLITE_OK when this function is called, then no attempt +** is made to write any data to disk. Instead, this function serves only +** to release outstanding resources. +** +** Otherwise, if *pRc is initially SQLITE_OK and an error occurs while +** flushing buffers to disk, *pRc is set to an SQLite error code before +** returning. +*/ +static void fts3IncrmergeRelease( + Fts3Table *p, /* FTS3 table handle */ + IncrmergeWriter *pWriter, /* Merge-writer object */ + int *pRc /* IN/OUT: Error code */ +){ + int i; /* Used to iterate through non-root layers */ + int iRoot; /* Index of root in pWriter->aNodeWriter */ + NodeWriter *pRoot; /* NodeWriter for root node */ + int rc = *pRc; /* Error code */ + + /* Set iRoot to the index in pWriter->aNodeWriter[] of the output segment + ** root node. If the segment fits entirely on a single leaf node, iRoot + ** will be set to 0. If the root node is the parent of the leaves, iRoot + ** will be 1. And so on. */ + for(iRoot=FTS_MAX_APPENDABLE_HEIGHT-1; iRoot>=0; iRoot--){ + NodeWriter *pNode = &pWriter->aNodeWriter[iRoot]; + if( pNode->block.n>0 ) break; + assert( *pRc || pNode->block.nAlloc==0 ); + assert( *pRc || pNode->key.nAlloc==0 ); + sqlite3_free(pNode->block.a); + sqlite3_free(pNode->key.a); + } + + /* Empty output segment. This is a no-op. */ + if( iRoot<0 ) return; + + /* The entire output segment fits on a single node. Normally, this means + ** the node would be stored as a blob in the "root" column of the %_segdir + ** table. However, this is not permitted in this case. The problem is that + ** space has already been reserved in the %_segments table, and so the + ** start_block and end_block fields of the %_segdir table must be populated. + ** And, by design or by accident, released versions of FTS cannot handle + ** segments that fit entirely on the root node with start_block!=0. + ** + ** Instead, create a synthetic root node that contains nothing but a + ** pointer to the single content node. So that the segment consists of a + ** single leaf and a single interior (root) node. + ** + ** Todo: Better might be to defer allocating space in the %_segments + ** table until we are sure it is needed. + */ + if( iRoot==0 ){ + Blob *pBlock = &pWriter->aNodeWriter[1].block; + blobGrowBuffer(pBlock, 1 + FTS3_VARINT_MAX, &rc); + if( rc==SQLITE_OK ){ + pBlock->a[0] = 0x01; + pBlock->n = 1 + sqlite3Fts3PutVarint( + &pBlock->a[1], pWriter->aNodeWriter[0].iBlock + ); + } + iRoot = 1; + } + pRoot = &pWriter->aNodeWriter[iRoot]; + + /* Flush all currently outstanding nodes to disk. */ + for(i=0; iaNodeWriter[i]; + if( pNode->block.n>0 && rc==SQLITE_OK ){ + rc = fts3WriteSegment(p, pNode->iBlock, pNode->block.a, pNode->block.n); + } + sqlite3_free(pNode->block.a); + sqlite3_free(pNode->key.a); + } + + /* Write the %_segdir record. */ + if( rc==SQLITE_OK ){ + rc = fts3WriteSegdir(p, + pWriter->iAbsLevel+1, /* level */ + pWriter->iIdx, /* idx */ + pWriter->iStart, /* start_block */ + pWriter->aNodeWriter[0].iBlock, /* leaves_end_block */ + pWriter->iEnd, /* end_block */ + (pWriter->bNoLeafData==0 ? pWriter->nLeafData : 0), /* end_block */ + pRoot->block.a, pRoot->block.n /* root */ + ); + } + sqlite3_free(pRoot->block.a); + sqlite3_free(pRoot->key.a); + + *pRc = rc; +} + +/* +** Compare the term in buffer zLhs (size in bytes nLhs) with that in +** zRhs (size in bytes nRhs) using memcmp. If one term is a prefix of +** the other, it is considered to be smaller than the other. +** +** Return -ve if zLhs is smaller than zRhs, 0 if it is equal, or +ve +** if it is greater. +*/ +static int fts3TermCmp( + const char *zLhs, int nLhs, /* LHS of comparison */ + const char *zRhs, int nRhs /* RHS of comparison */ +){ + int nCmp = MIN(nLhs, nRhs); + int res; + + res = memcmp(zLhs, zRhs, nCmp); + if( res==0 ) res = nLhs - nRhs; + + return res; +} + + +/* +** Query to see if the entry in the %_segments table with blockid iEnd is +** NULL. If no error occurs and the entry is NULL, set *pbRes 1 before +** returning. Otherwise, set *pbRes to 0. +** +** Or, if an error occurs while querying the database, return an SQLite +** error code. The final value of *pbRes is undefined in this case. +** +** This is used to test if a segment is an "appendable" segment. If it +** is, then a NULL entry has been inserted into the %_segments table +** with blockid %_segdir.end_block. +*/ +static int fts3IsAppendable(Fts3Table *p, sqlite3_int64 iEnd, int *pbRes){ + int bRes = 0; /* Result to set *pbRes to */ + sqlite3_stmt *pCheck = 0; /* Statement to query database with */ + int rc; /* Return code */ + + rc = fts3SqlStmt(p, SQL_SEGMENT_IS_APPENDABLE, &pCheck, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int64(pCheck, 1, iEnd); + if( SQLITE_ROW==sqlite3_step(pCheck) ) bRes = 1; + rc = sqlite3_reset(pCheck); + } + + *pbRes = bRes; + return rc; +} + +/* +** This function is called when initializing an incremental-merge operation. +** It checks if the existing segment with index value iIdx at absolute level +** (iAbsLevel+1) can be appended to by the incremental merge. If it can, the +** merge-writer object *pWriter is initialized to write to it. +** +** An existing segment can be appended to by an incremental merge if: +** +** * It was initially created as an appendable segment (with all required +** space pre-allocated), and +** +** * The first key read from the input (arguments zKey and nKey) is +** greater than the largest key currently stored in the potential +** output segment. +*/ +static int fts3IncrmergeLoad( + Fts3Table *p, /* Fts3 table handle */ + sqlite3_int64 iAbsLevel, /* Absolute level of input segments */ + int iIdx, /* Index of candidate output segment */ + const char *zKey, /* First key to write */ + int nKey, /* Number of bytes in nKey */ + IncrmergeWriter *pWriter /* Populate this object */ +){ + int rc; /* Return code */ + sqlite3_stmt *pSelect = 0; /* SELECT to read %_segdir entry */ + + rc = fts3SqlStmt(p, SQL_SELECT_SEGDIR, &pSelect, 0); + if( rc==SQLITE_OK ){ + sqlite3_int64 iStart = 0; /* Value of %_segdir.start_block */ + sqlite3_int64 iLeafEnd = 0; /* Value of %_segdir.leaves_end_block */ + sqlite3_int64 iEnd = 0; /* Value of %_segdir.end_block */ + const char *aRoot = 0; /* Pointer to %_segdir.root buffer */ + int nRoot = 0; /* Size of aRoot[] in bytes */ + int rc2; /* Return code from sqlite3_reset() */ + int bAppendable = 0; /* Set to true if segment is appendable */ + + /* Read the %_segdir entry for index iIdx absolute level (iAbsLevel+1) */ + sqlite3_bind_int64(pSelect, 1, iAbsLevel+1); + sqlite3_bind_int(pSelect, 2, iIdx); + if( sqlite3_step(pSelect)==SQLITE_ROW ){ + iStart = sqlite3_column_int64(pSelect, 1); + iLeafEnd = sqlite3_column_int64(pSelect, 2); + fts3ReadEndBlockField(pSelect, 3, &iEnd, &pWriter->nLeafData); + if( pWriter->nLeafData<0 ){ + pWriter->nLeafData = pWriter->nLeafData * -1; + } + pWriter->bNoLeafData = (pWriter->nLeafData==0); + nRoot = sqlite3_column_bytes(pSelect, 4); + aRoot = sqlite3_column_blob(pSelect, 4); + }else{ + return sqlite3_reset(pSelect); + } + + /* Check for the zero-length marker in the %_segments table */ + rc = fts3IsAppendable(p, iEnd, &bAppendable); + + /* Check that zKey/nKey is larger than the largest key the candidate */ + if( rc==SQLITE_OK && bAppendable ){ + char *aLeaf = 0; + int nLeaf = 0; + + rc = sqlite3Fts3ReadBlock(p, iLeafEnd, &aLeaf, &nLeaf, 0); + if( rc==SQLITE_OK ){ + NodeReader reader; + for(rc = nodeReaderInit(&reader, aLeaf, nLeaf); + rc==SQLITE_OK && reader.aNode; + rc = nodeReaderNext(&reader) + ){ + assert( reader.aNode ); + } + if( fts3TermCmp(zKey, nKey, reader.term.a, reader.term.n)<=0 ){ + bAppendable = 0; + } + nodeReaderRelease(&reader); + } + sqlite3_free(aLeaf); + } + + if( rc==SQLITE_OK && bAppendable ){ + /* It is possible to append to this segment. Set up the IncrmergeWriter + ** object to do so. */ + int i; + int nHeight = (int)aRoot[0]; + NodeWriter *pNode; + + pWriter->nLeafEst = (int)((iEnd - iStart) + 1)/FTS_MAX_APPENDABLE_HEIGHT; + pWriter->iStart = iStart; + pWriter->iEnd = iEnd; + pWriter->iAbsLevel = iAbsLevel; + pWriter->iIdx = iIdx; + + for(i=nHeight+1; iaNodeWriter[i].iBlock = pWriter->iStart + i*pWriter->nLeafEst; + } + + pNode = &pWriter->aNodeWriter[nHeight]; + pNode->iBlock = pWriter->iStart + pWriter->nLeafEst*nHeight; + blobGrowBuffer(&pNode->block, MAX(nRoot, p->nNodeSize), &rc); + if( rc==SQLITE_OK ){ + memcpy(pNode->block.a, aRoot, nRoot); + pNode->block.n = nRoot; + } + + for(i=nHeight; i>=0 && rc==SQLITE_OK; i--){ + NodeReader reader; + pNode = &pWriter->aNodeWriter[i]; + + rc = nodeReaderInit(&reader, pNode->block.a, pNode->block.n); + while( reader.aNode && rc==SQLITE_OK ) rc = nodeReaderNext(&reader); + blobGrowBuffer(&pNode->key, reader.term.n, &rc); + if( rc==SQLITE_OK ){ + memcpy(pNode->key.a, reader.term.a, reader.term.n); + pNode->key.n = reader.term.n; + if( i>0 ){ + char *aBlock = 0; + int nBlock = 0; + pNode = &pWriter->aNodeWriter[i-1]; + pNode->iBlock = reader.iChild; + rc = sqlite3Fts3ReadBlock(p, reader.iChild, &aBlock, &nBlock, 0); + blobGrowBuffer(&pNode->block, MAX(nBlock, p->nNodeSize), &rc); + if( rc==SQLITE_OK ){ + memcpy(pNode->block.a, aBlock, nBlock); + pNode->block.n = nBlock; + } + sqlite3_free(aBlock); + } + } + nodeReaderRelease(&reader); + } + } + + rc2 = sqlite3_reset(pSelect); + if( rc==SQLITE_OK ) rc = rc2; + } + + return rc; +} + +/* +** Determine the largest segment index value that exists within absolute +** level iAbsLevel+1. If no error occurs, set *piIdx to this value plus +** one before returning SQLITE_OK. Or, if there are no segments at all +** within level iAbsLevel, set *piIdx to zero. +** +** If an error occurs, return an SQLite error code. The final value of +** *piIdx is undefined in this case. +*/ +static int fts3IncrmergeOutputIdx( + Fts3Table *p, /* FTS Table handle */ + sqlite3_int64 iAbsLevel, /* Absolute index of input segments */ + int *piIdx /* OUT: Next free index at iAbsLevel+1 */ +){ + int rc; + sqlite3_stmt *pOutputIdx = 0; /* SQL used to find output index */ + + rc = fts3SqlStmt(p, SQL_NEXT_SEGMENT_INDEX, &pOutputIdx, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int64(pOutputIdx, 1, iAbsLevel+1); + sqlite3_step(pOutputIdx); + *piIdx = sqlite3_column_int(pOutputIdx, 0); + rc = sqlite3_reset(pOutputIdx); + } + + return rc; +} + +/* +** Allocate an appendable output segment on absolute level iAbsLevel+1 +** with idx value iIdx. +** +** In the %_segdir table, a segment is defined by the values in three +** columns: +** +** start_block +** leaves_end_block +** end_block +** +** When an appendable segment is allocated, it is estimated that the +** maximum number of leaf blocks that may be required is the sum of the +** number of leaf blocks consumed by the input segments, plus the number +** of input segments, multiplied by two. This value is stored in stack +** variable nLeafEst. +** +** A total of 16*nLeafEst blocks are allocated when an appendable segment +** is created ((1 + end_block - start_block)==16*nLeafEst). The contiguous +** array of leaf nodes starts at the first block allocated. The array +** of interior nodes that are parents of the leaf nodes start at block +** (start_block + (1 + end_block - start_block) / 16). And so on. +** +** In the actual code below, the value "16" is replaced with the +** pre-processor macro FTS_MAX_APPENDABLE_HEIGHT. +*/ +static int fts3IncrmergeWriter( + Fts3Table *p, /* Fts3 table handle */ + sqlite3_int64 iAbsLevel, /* Absolute level of input segments */ + int iIdx, /* Index of new output segment */ + Fts3MultiSegReader *pCsr, /* Cursor that data will be read from */ + IncrmergeWriter *pWriter /* Populate this object */ +){ + int rc; /* Return Code */ + int i; /* Iterator variable */ + int nLeafEst = 0; /* Blocks allocated for leaf nodes */ + sqlite3_stmt *pLeafEst = 0; /* SQL used to determine nLeafEst */ + sqlite3_stmt *pFirstBlock = 0; /* SQL used to determine first block */ + + /* Calculate nLeafEst. */ + rc = fts3SqlStmt(p, SQL_MAX_LEAF_NODE_ESTIMATE, &pLeafEst, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int64(pLeafEst, 1, iAbsLevel); + sqlite3_bind_int64(pLeafEst, 2, pCsr->nSegment); + if( SQLITE_ROW==sqlite3_step(pLeafEst) ){ + nLeafEst = sqlite3_column_int(pLeafEst, 0); + } + rc = sqlite3_reset(pLeafEst); + } + if( rc!=SQLITE_OK ) return rc; + + /* Calculate the first block to use in the output segment */ + rc = fts3SqlStmt(p, SQL_NEXT_SEGMENTS_ID, &pFirstBlock, 0); + if( rc==SQLITE_OK ){ + if( SQLITE_ROW==sqlite3_step(pFirstBlock) ){ + pWriter->iStart = sqlite3_column_int64(pFirstBlock, 0); + pWriter->iEnd = pWriter->iStart - 1; + pWriter->iEnd += nLeafEst * FTS_MAX_APPENDABLE_HEIGHT; + } + rc = sqlite3_reset(pFirstBlock); + } + if( rc!=SQLITE_OK ) return rc; + + /* Insert the marker in the %_segments table to make sure nobody tries + ** to steal the space just allocated. This is also used to identify + ** appendable segments. */ + rc = fts3WriteSegment(p, pWriter->iEnd, 0, 0); + if( rc!=SQLITE_OK ) return rc; + + pWriter->iAbsLevel = iAbsLevel; + pWriter->nLeafEst = nLeafEst; + pWriter->iIdx = iIdx; + + /* Set up the array of NodeWriter objects */ + for(i=0; iaNodeWriter[i].iBlock = pWriter->iStart + i*pWriter->nLeafEst; + } + return SQLITE_OK; +} + +/* +** Remove an entry from the %_segdir table. This involves running the +** following two statements: +** +** DELETE FROM %_segdir WHERE level = :iAbsLevel AND idx = :iIdx +** UPDATE %_segdir SET idx = idx - 1 WHERE level = :iAbsLevel AND idx > :iIdx +** +** The DELETE statement removes the specific %_segdir level. The UPDATE +** statement ensures that the remaining segments have contiguously allocated +** idx values. +*/ +static int fts3RemoveSegdirEntry( + Fts3Table *p, /* FTS3 table handle */ + sqlite3_int64 iAbsLevel, /* Absolute level to delete from */ + int iIdx /* Index of %_segdir entry to delete */ +){ + int rc; /* Return code */ + sqlite3_stmt *pDelete = 0; /* DELETE statement */ + + rc = fts3SqlStmt(p, SQL_DELETE_SEGDIR_ENTRY, &pDelete, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int64(pDelete, 1, iAbsLevel); + sqlite3_bind_int(pDelete, 2, iIdx); + sqlite3_step(pDelete); + rc = sqlite3_reset(pDelete); + } + + return rc; +} + +/* +** One or more segments have just been removed from absolute level iAbsLevel. +** Update the 'idx' values of the remaining segments in the level so that +** the idx values are a contiguous sequence starting from 0. +*/ +static int fts3RepackSegdirLevel( + Fts3Table *p, /* FTS3 table handle */ + sqlite3_int64 iAbsLevel /* Absolute level to repack */ +){ + int rc; /* Return code */ + int *aIdx = 0; /* Array of remaining idx values */ + int nIdx = 0; /* Valid entries in aIdx[] */ + int nAlloc = 0; /* Allocated size of aIdx[] */ + int i; /* Iterator variable */ + sqlite3_stmt *pSelect = 0; /* Select statement to read idx values */ + sqlite3_stmt *pUpdate = 0; /* Update statement to modify idx values */ + + rc = fts3SqlStmt(p, SQL_SELECT_INDEXES, &pSelect, 0); + if( rc==SQLITE_OK ){ + int rc2; + sqlite3_bind_int64(pSelect, 1, iAbsLevel); + while( SQLITE_ROW==sqlite3_step(pSelect) ){ + if( nIdx>=nAlloc ){ + int *aNew; + nAlloc += 16; + aNew = sqlite3_realloc(aIdx, nAlloc*sizeof(int)); + if( !aNew ){ + rc = SQLITE_NOMEM; + break; + } + aIdx = aNew; + } + aIdx[nIdx++] = sqlite3_column_int(pSelect, 0); + } + rc2 = sqlite3_reset(pSelect); + if( rc==SQLITE_OK ) rc = rc2; + } + + if( rc==SQLITE_OK ){ + rc = fts3SqlStmt(p, SQL_SHIFT_SEGDIR_ENTRY, &pUpdate, 0); + } + if( rc==SQLITE_OK ){ + sqlite3_bind_int64(pUpdate, 2, iAbsLevel); + } + + assert( p->bIgnoreSavepoint==0 ); + p->bIgnoreSavepoint = 1; + for(i=0; rc==SQLITE_OK && ibIgnoreSavepoint = 0; + + sqlite3_free(aIdx); + return rc; +} + +static void fts3StartNode(Blob *pNode, int iHeight, sqlite3_int64 iChild){ + pNode->a[0] = (char)iHeight; + if( iChild ){ + assert( pNode->nAlloc>=1+sqlite3Fts3VarintLen(iChild) ); + pNode->n = 1 + sqlite3Fts3PutVarint(&pNode->a[1], iChild); + }else{ + assert( pNode->nAlloc>=1 ); + pNode->n = 1; + } +} + +/* +** The first two arguments are a pointer to and the size of a segment b-tree +** node. The node may be a leaf or an internal node. +** +** This function creates a new node image in blob object *pNew by copying +** all terms that are greater than or equal to zTerm/nTerm (for leaf nodes) +** or greater than zTerm/nTerm (for internal nodes) from aNode/nNode. +*/ +static int fts3TruncateNode( + const char *aNode, /* Current node image */ + int nNode, /* Size of aNode in bytes */ + Blob *pNew, /* OUT: Write new node image here */ + const char *zTerm, /* Omit all terms smaller than this */ + int nTerm, /* Size of zTerm in bytes */ + sqlite3_int64 *piBlock /* OUT: Block number in next layer down */ +){ + NodeReader reader; /* Reader object */ + Blob prev = {0, 0, 0}; /* Previous term written to new node */ + int rc = SQLITE_OK; /* Return code */ + int bLeaf = aNode[0]=='\0'; /* True for a leaf node */ + + /* Allocate required output space */ + blobGrowBuffer(pNew, nNode, &rc); + if( rc!=SQLITE_OK ) return rc; + pNew->n = 0; + + /* Populate new node buffer */ + for(rc = nodeReaderInit(&reader, aNode, nNode); + rc==SQLITE_OK && reader.aNode; + rc = nodeReaderNext(&reader) + ){ + if( pNew->n==0 ){ + int res = fts3TermCmp(reader.term.a, reader.term.n, zTerm, nTerm); + if( res<0 || (bLeaf==0 && res==0) ) continue; + fts3StartNode(pNew, (int)aNode[0], reader.iChild); + *piBlock = reader.iChild; + } + rc = fts3AppendToNode( + pNew, &prev, reader.term.a, reader.term.n, + reader.aDoclist, reader.nDoclist + ); + if( rc!=SQLITE_OK ) break; + } + if( pNew->n==0 ){ + fts3StartNode(pNew, (int)aNode[0], reader.iChild); + *piBlock = reader.iChild; + } + assert( pNew->n<=pNew->nAlloc ); + + nodeReaderRelease(&reader); + sqlite3_free(prev.a); + return rc; +} + +/* +** Remove all terms smaller than zTerm/nTerm from segment iIdx in absolute +** level iAbsLevel. This may involve deleting entries from the %_segments +** table, and modifying existing entries in both the %_segments and %_segdir +** tables. +** +** SQLITE_OK is returned if the segment is updated successfully. Or an +** SQLite error code otherwise. +*/ +static int fts3TruncateSegment( + Fts3Table *p, /* FTS3 table handle */ + sqlite3_int64 iAbsLevel, /* Absolute level of segment to modify */ + int iIdx, /* Index within level of segment to modify */ + const char *zTerm, /* Remove terms smaller than this */ + int nTerm /* Number of bytes in buffer zTerm */ +){ + int rc = SQLITE_OK; /* Return code */ + Blob root = {0,0,0}; /* New root page image */ + Blob block = {0,0,0}; /* Buffer used for any other block */ + sqlite3_int64 iBlock = 0; /* Block id */ + sqlite3_int64 iNewStart = 0; /* New value for iStartBlock */ + sqlite3_int64 iOldStart = 0; /* Old value for iStartBlock */ + sqlite3_stmt *pFetch = 0; /* Statement used to fetch segdir */ + + rc = fts3SqlStmt(p, SQL_SELECT_SEGDIR, &pFetch, 0); + if( rc==SQLITE_OK ){ + int rc2; /* sqlite3_reset() return code */ + sqlite3_bind_int64(pFetch, 1, iAbsLevel); + sqlite3_bind_int(pFetch, 2, iIdx); + if( SQLITE_ROW==sqlite3_step(pFetch) ){ + const char *aRoot = sqlite3_column_blob(pFetch, 4); + int nRoot = sqlite3_column_bytes(pFetch, 4); + iOldStart = sqlite3_column_int64(pFetch, 1); + rc = fts3TruncateNode(aRoot, nRoot, &root, zTerm, nTerm, &iBlock); + } + rc2 = sqlite3_reset(pFetch); + if( rc==SQLITE_OK ) rc = rc2; + } + + while( rc==SQLITE_OK && iBlock ){ + char *aBlock = 0; + int nBlock = 0; + iNewStart = iBlock; + + rc = sqlite3Fts3ReadBlock(p, iBlock, &aBlock, &nBlock, 0); + if( rc==SQLITE_OK ){ + rc = fts3TruncateNode(aBlock, nBlock, &block, zTerm, nTerm, &iBlock); + } + if( rc==SQLITE_OK ){ + rc = fts3WriteSegment(p, iNewStart, block.a, block.n); + } + sqlite3_free(aBlock); + } + + /* Variable iNewStart now contains the first valid leaf node. */ + if( rc==SQLITE_OK && iNewStart ){ + sqlite3_stmt *pDel = 0; + rc = fts3SqlStmt(p, SQL_DELETE_SEGMENTS_RANGE, &pDel, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int64(pDel, 1, iOldStart); + sqlite3_bind_int64(pDel, 2, iNewStart-1); + sqlite3_step(pDel); + rc = sqlite3_reset(pDel); + } + } + + if( rc==SQLITE_OK ){ + sqlite3_stmt *pChomp = 0; + rc = fts3SqlStmt(p, SQL_CHOMP_SEGDIR, &pChomp, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int64(pChomp, 1, iNewStart); + sqlite3_bind_blob(pChomp, 2, root.a, root.n, SQLITE_STATIC); + sqlite3_bind_int64(pChomp, 3, iAbsLevel); + sqlite3_bind_int(pChomp, 4, iIdx); + sqlite3_step(pChomp); + rc = sqlite3_reset(pChomp); + } + } + + sqlite3_free(root.a); + sqlite3_free(block.a); + return rc; +} + +/* +** This function is called after an incrmental-merge operation has run to +** merge (or partially merge) two or more segments from absolute level +** iAbsLevel. +** +** Each input segment is either removed from the db completely (if all of +** its data was copied to the output segment by the incrmerge operation) +** or modified in place so that it no longer contains those entries that +** have been duplicated in the output segment. +*/ +static int fts3IncrmergeChomp( + Fts3Table *p, /* FTS table handle */ + sqlite3_int64 iAbsLevel, /* Absolute level containing segments */ + Fts3MultiSegReader *pCsr, /* Chomp all segments opened by this cursor */ + int *pnRem /* Number of segments not deleted */ +){ + int i; + int nRem = 0; + int rc = SQLITE_OK; + + for(i=pCsr->nSegment-1; i>=0 && rc==SQLITE_OK; i--){ + Fts3SegReader *pSeg = 0; + int j; + + /* Find the Fts3SegReader object with Fts3SegReader.iIdx==i. It is hiding + ** somewhere in the pCsr->apSegment[] array. */ + for(j=0; ALWAYS(jnSegment); j++){ + pSeg = pCsr->apSegment[j]; + if( pSeg->iIdx==i ) break; + } + assert( jnSegment && pSeg->iIdx==i ); + + if( pSeg->aNode==0 ){ + /* Seg-reader is at EOF. Remove the entire input segment. */ + rc = fts3DeleteSegment(p, pSeg); + if( rc==SQLITE_OK ){ + rc = fts3RemoveSegdirEntry(p, iAbsLevel, pSeg->iIdx); + } + *pnRem = 0; + }else{ + /* The incremental merge did not copy all the data from this + ** segment to the upper level. The segment is modified in place + ** so that it contains no keys smaller than zTerm/nTerm. */ + const char *zTerm = pSeg->zTerm; + int nTerm = pSeg->nTerm; + rc = fts3TruncateSegment(p, iAbsLevel, pSeg->iIdx, zTerm, nTerm); + nRem++; + } + } + + if( rc==SQLITE_OK && nRem!=pCsr->nSegment ){ + rc = fts3RepackSegdirLevel(p, iAbsLevel); + } + + *pnRem = nRem; + return rc; +} + +/* +** Store an incr-merge hint in the database. +*/ +static int fts3IncrmergeHintStore(Fts3Table *p, Blob *pHint){ + sqlite3_stmt *pReplace = 0; + int rc; /* Return code */ + + rc = fts3SqlStmt(p, SQL_REPLACE_STAT, &pReplace, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int(pReplace, 1, FTS_STAT_INCRMERGEHINT); + sqlite3_bind_blob(pReplace, 2, pHint->a, pHint->n, SQLITE_STATIC); + sqlite3_step(pReplace); + rc = sqlite3_reset(pReplace); + } + + return rc; +} + +/* +** Load an incr-merge hint from the database. The incr-merge hint, if one +** exists, is stored in the rowid==1 row of the %_stat table. +** +** If successful, populate blob *pHint with the value read from the %_stat +** table and return SQLITE_OK. Otherwise, if an error occurs, return an +** SQLite error code. +*/ +static int fts3IncrmergeHintLoad(Fts3Table *p, Blob *pHint){ + sqlite3_stmt *pSelect = 0; + int rc; + + pHint->n = 0; + rc = fts3SqlStmt(p, SQL_SELECT_STAT, &pSelect, 0); + if( rc==SQLITE_OK ){ + int rc2; + sqlite3_bind_int(pSelect, 1, FTS_STAT_INCRMERGEHINT); + if( SQLITE_ROW==sqlite3_step(pSelect) ){ + const char *aHint = sqlite3_column_blob(pSelect, 0); + int nHint = sqlite3_column_bytes(pSelect, 0); + if( aHint ){ + blobGrowBuffer(pHint, nHint, &rc); + if( rc==SQLITE_OK ){ + memcpy(pHint->a, aHint, nHint); + pHint->n = nHint; + } + } + } + rc2 = sqlite3_reset(pSelect); + if( rc==SQLITE_OK ) rc = rc2; + } + + return rc; +} + +/* +** If *pRc is not SQLITE_OK when this function is called, it is a no-op. +** Otherwise, append an entry to the hint stored in blob *pHint. Each entry +** consists of two varints, the absolute level number of the input segments +** and the number of input segments. +** +** If successful, leave *pRc set to SQLITE_OK and return. If an error occurs, +** set *pRc to an SQLite error code before returning. +*/ +static void fts3IncrmergeHintPush( + Blob *pHint, /* Hint blob to append to */ + i64 iAbsLevel, /* First varint to store in hint */ + int nInput, /* Second varint to store in hint */ + int *pRc /* IN/OUT: Error code */ +){ + blobGrowBuffer(pHint, pHint->n + 2*FTS3_VARINT_MAX, pRc); + if( *pRc==SQLITE_OK ){ + pHint->n += sqlite3Fts3PutVarint(&pHint->a[pHint->n], iAbsLevel); + pHint->n += sqlite3Fts3PutVarint(&pHint->a[pHint->n], (i64)nInput); + } +} + +/* +** Read the last entry (most recently pushed) from the hint blob *pHint +** and then remove the entry. Write the two values read to *piAbsLevel and +** *pnInput before returning. +** +** If no error occurs, return SQLITE_OK. If the hint blob in *pHint does +** not contain at least two valid varints, return SQLITE_CORRUPT_VTAB. +*/ +static int fts3IncrmergeHintPop(Blob *pHint, i64 *piAbsLevel, int *pnInput){ + const int nHint = pHint->n; + int i; + + i = pHint->n-2; + while( i>0 && (pHint->a[i-1] & 0x80) ) i--; + while( i>0 && (pHint->a[i-1] & 0x80) ) i--; + + pHint->n = i; + i += sqlite3Fts3GetVarint(&pHint->a[i], piAbsLevel); + i += fts3GetVarint32(&pHint->a[i], pnInput); + if( i!=nHint ) return FTS_CORRUPT_VTAB; + + return SQLITE_OK; +} + + +/* +** Attempt an incremental merge that writes nMerge leaf blocks. +** +** Incremental merges happen nMin segments at a time. The segments +** to be merged are the nMin oldest segments (the ones with the smallest +** values for the _segdir.idx field) in the highest level that contains +** at least nMin segments. Multiple merges might occur in an attempt to +** write the quota of nMerge leaf blocks. +*/ +SQLITE_PRIVATE int sqlite3Fts3Incrmerge(Fts3Table *p, int nMerge, int nMin){ + int rc; /* Return code */ + int nRem = nMerge; /* Number of leaf pages yet to be written */ + Fts3MultiSegReader *pCsr; /* Cursor used to read input data */ + Fts3SegFilter *pFilter; /* Filter used with cursor pCsr */ + IncrmergeWriter *pWriter; /* Writer object */ + int nSeg = 0; /* Number of input segments */ + sqlite3_int64 iAbsLevel = 0; /* Absolute level number to work on */ + Blob hint = {0, 0, 0}; /* Hint read from %_stat table */ + int bDirtyHint = 0; /* True if blob 'hint' has been modified */ + + /* Allocate space for the cursor, filter and writer objects */ + const int nAlloc = sizeof(*pCsr) + sizeof(*pFilter) + sizeof(*pWriter); + pWriter = (IncrmergeWriter *)sqlite3_malloc(nAlloc); + if( !pWriter ) return SQLITE_NOMEM; + pFilter = (Fts3SegFilter *)&pWriter[1]; + pCsr = (Fts3MultiSegReader *)&pFilter[1]; + + rc = fts3IncrmergeHintLoad(p, &hint); + while( rc==SQLITE_OK && nRem>0 ){ + const i64 nMod = FTS3_SEGDIR_MAXLEVEL * p->nIndex; + sqlite3_stmt *pFindLevel = 0; /* SQL used to determine iAbsLevel */ + int bUseHint = 0; /* True if attempting to append */ + int iIdx = 0; /* Largest idx in level (iAbsLevel+1) */ + + /* Search the %_segdir table for the absolute level with the smallest + ** relative level number that contains at least nMin segments, if any. + ** If one is found, set iAbsLevel to the absolute level number and + ** nSeg to nMin. If no level with at least nMin segments can be found, + ** set nSeg to -1. + */ + rc = fts3SqlStmt(p, SQL_FIND_MERGE_LEVEL, &pFindLevel, 0); + sqlite3_bind_int(pFindLevel, 1, MAX(2, nMin)); + if( sqlite3_step(pFindLevel)==SQLITE_ROW ){ + iAbsLevel = sqlite3_column_int64(pFindLevel, 0); + nSeg = sqlite3_column_int(pFindLevel, 1); + assert( nSeg>=2 ); + }else{ + nSeg = -1; + } + rc = sqlite3_reset(pFindLevel); + + /* If the hint read from the %_stat table is not empty, check if the + ** last entry in it specifies a relative level smaller than or equal + ** to the level identified by the block above (if any). If so, this + ** iteration of the loop will work on merging at the hinted level. + */ + if( rc==SQLITE_OK && hint.n ){ + int nHint = hint.n; + sqlite3_int64 iHintAbsLevel = 0; /* Hint level */ + int nHintSeg = 0; /* Hint number of segments */ + + rc = fts3IncrmergeHintPop(&hint, &iHintAbsLevel, &nHintSeg); + if( nSeg<0 || (iAbsLevel % nMod) >= (iHintAbsLevel % nMod) ){ + iAbsLevel = iHintAbsLevel; + nSeg = nHintSeg; + bUseHint = 1; + bDirtyHint = 1; + }else{ + /* This undoes the effect of the HintPop() above - so that no entry + ** is removed from the hint blob. */ + hint.n = nHint; + } + } + + /* If nSeg is less that zero, then there is no level with at least + ** nMin segments and no hint in the %_stat table. No work to do. + ** Exit early in this case. */ + if( nSeg<0 ) break; + + /* Open a cursor to iterate through the contents of the oldest nSeg + ** indexes of absolute level iAbsLevel. If this cursor is opened using + ** the 'hint' parameters, it is possible that there are less than nSeg + ** segments available in level iAbsLevel. In this case, no work is + ** done on iAbsLevel - fall through to the next iteration of the loop + ** to start work on some other level. */ + memset(pWriter, 0, nAlloc); + pFilter->flags = FTS3_SEGMENT_REQUIRE_POS; + + if( rc==SQLITE_OK ){ + rc = fts3IncrmergeOutputIdx(p, iAbsLevel, &iIdx); + assert( bUseHint==1 || bUseHint==0 ); + if( iIdx==0 || (bUseHint && iIdx==1) ){ + int bIgnore = 0; + rc = fts3SegmentIsMaxLevel(p, iAbsLevel+1, &bIgnore); + if( bIgnore ){ + pFilter->flags |= FTS3_SEGMENT_IGNORE_EMPTY; + } + } + } + + if( rc==SQLITE_OK ){ + rc = fts3IncrmergeCsr(p, iAbsLevel, nSeg, pCsr); + } + if( SQLITE_OK==rc && pCsr->nSegment==nSeg + && SQLITE_OK==(rc = sqlite3Fts3SegReaderStart(p, pCsr, pFilter)) + && SQLITE_ROW==(rc = sqlite3Fts3SegReaderStep(p, pCsr)) + ){ + if( bUseHint && iIdx>0 ){ + const char *zKey = pCsr->zTerm; + int nKey = pCsr->nTerm; + rc = fts3IncrmergeLoad(p, iAbsLevel, iIdx-1, zKey, nKey, pWriter); + }else{ + rc = fts3IncrmergeWriter(p, iAbsLevel, iIdx, pCsr, pWriter); + } + + if( rc==SQLITE_OK && pWriter->nLeafEst ){ + fts3LogMerge(nSeg, iAbsLevel); + do { + rc = fts3IncrmergeAppend(p, pWriter, pCsr); + if( rc==SQLITE_OK ) rc = sqlite3Fts3SegReaderStep(p, pCsr); + if( pWriter->nWork>=nRem && rc==SQLITE_ROW ) rc = SQLITE_OK; + }while( rc==SQLITE_ROW ); + + /* Update or delete the input segments */ + if( rc==SQLITE_OK ){ + nRem -= (1 + pWriter->nWork); + rc = fts3IncrmergeChomp(p, iAbsLevel, pCsr, &nSeg); + if( nSeg!=0 ){ + bDirtyHint = 1; + fts3IncrmergeHintPush(&hint, iAbsLevel, nSeg, &rc); + } + } + } + + if( nSeg!=0 ){ + pWriter->nLeafData = pWriter->nLeafData * -1; + } + fts3IncrmergeRelease(p, pWriter, &rc); + if( nSeg==0 && pWriter->bNoLeafData==0 ){ + fts3PromoteSegments(p, iAbsLevel+1, pWriter->nLeafData); + } + } + + sqlite3Fts3SegReaderFinish(pCsr); + } + + /* Write the hint values into the %_stat table for the next incr-merger */ + if( bDirtyHint && rc==SQLITE_OK ){ + rc = fts3IncrmergeHintStore(p, &hint); + } + + sqlite3_free(pWriter); + sqlite3_free(hint.a); + return rc; +} + +/* +** Convert the text beginning at *pz into an integer and return +** its value. Advance *pz to point to the first character past +** the integer. +*/ +static int fts3Getint(const char **pz){ + const char *z = *pz; + int i = 0; + while( (*z)>='0' && (*z)<='9' ) i = 10*i + *(z++) - '0'; + *pz = z; + return i; +} + +/* +** Process statements of the form: +** +** INSERT INTO table(table) VALUES('merge=A,B'); +** +** A and B are integers that decode to be the number of leaf pages +** written for the merge, and the minimum number of segments on a level +** before it will be selected for a merge, respectively. +*/ +static int fts3DoIncrmerge( + Fts3Table *p, /* FTS3 table handle */ + const char *zParam /* Nul-terminated string containing "A,B" */ +){ + int rc; + int nMin = (FTS3_MERGE_COUNT / 2); + int nMerge = 0; + const char *z = zParam; + + /* Read the first integer value */ + nMerge = fts3Getint(&z); + + /* If the first integer value is followed by a ',', read the second + ** integer value. */ + if( z[0]==',' && z[1]!='\0' ){ + z++; + nMin = fts3Getint(&z); + } + + if( z[0]!='\0' || nMin<2 ){ + rc = SQLITE_ERROR; + }else{ + rc = SQLITE_OK; + if( !p->bHasStat ){ + assert( p->bFts4==0 ); + sqlite3Fts3CreateStatTable(&rc, p); + } + if( rc==SQLITE_OK ){ + rc = sqlite3Fts3Incrmerge(p, nMerge, nMin); + } + sqlite3Fts3SegmentsClose(p); + } + return rc; +} + +/* +** Process statements of the form: +** +** INSERT INTO table(table) VALUES('automerge=X'); +** +** where X is an integer. X==0 means to turn automerge off. X!=0 means +** turn it on. The setting is persistent. +*/ +static int fts3DoAutoincrmerge( + Fts3Table *p, /* FTS3 table handle */ + const char *zParam /* Nul-terminated string containing boolean */ +){ + int rc = SQLITE_OK; + sqlite3_stmt *pStmt = 0; + p->nAutoincrmerge = fts3Getint(&zParam); + if( p->nAutoincrmerge==1 || p->nAutoincrmerge>FTS3_MERGE_COUNT ){ + p->nAutoincrmerge = 8; + } + if( !p->bHasStat ){ + assert( p->bFts4==0 ); + sqlite3Fts3CreateStatTable(&rc, p); + if( rc ) return rc; + } + rc = fts3SqlStmt(p, SQL_REPLACE_STAT, &pStmt, 0); + if( rc ) return rc; + sqlite3_bind_int(pStmt, 1, FTS_STAT_AUTOINCRMERGE); + sqlite3_bind_int(pStmt, 2, p->nAutoincrmerge); + sqlite3_step(pStmt); + rc = sqlite3_reset(pStmt); + return rc; +} + +/* +** Return a 64-bit checksum for the FTS index entry specified by the +** arguments to this function. +*/ +static u64 fts3ChecksumEntry( + const char *zTerm, /* Pointer to buffer containing term */ + int nTerm, /* Size of zTerm in bytes */ + int iLangid, /* Language id for current row */ + int iIndex, /* Index (0..Fts3Table.nIndex-1) */ + i64 iDocid, /* Docid for current row. */ + int iCol, /* Column number */ + int iPos /* Position */ +){ + int i; + u64 ret = (u64)iDocid; + + ret += (ret<<3) + iLangid; + ret += (ret<<3) + iIndex; + ret += (ret<<3) + iCol; + ret += (ret<<3) + iPos; + for(i=0; inIndex-1) */ + int *pRc /* OUT: Return code */ +){ + Fts3SegFilter filter; + Fts3MultiSegReader csr; + int rc; + u64 cksum = 0; + + assert( *pRc==SQLITE_OK ); + + memset(&filter, 0, sizeof(filter)); + memset(&csr, 0, sizeof(csr)); + filter.flags = FTS3_SEGMENT_REQUIRE_POS|FTS3_SEGMENT_IGNORE_EMPTY; + filter.flags |= FTS3_SEGMENT_SCAN; + + rc = sqlite3Fts3SegReaderCursor( + p, iLangid, iIndex, FTS3_SEGCURSOR_ALL, 0, 0, 0, 1,&csr + ); + if( rc==SQLITE_OK ){ + rc = sqlite3Fts3SegReaderStart(p, &csr, &filter); + } + + if( rc==SQLITE_OK ){ + while( SQLITE_ROW==(rc = sqlite3Fts3SegReaderStep(p, &csr)) ){ + char *pCsr = csr.aDoclist; + char *pEnd = &pCsr[csr.nDoclist]; + + i64 iDocid = 0; + i64 iCol = 0; + i64 iPos = 0; + + pCsr += sqlite3Fts3GetVarint(pCsr, &iDocid); + while( pCsriPrevLangid); + sqlite3_bind_int(pAllLangid, 2, p->nIndex); + while( rc==SQLITE_OK && sqlite3_step(pAllLangid)==SQLITE_ROW ){ + int iLangid = sqlite3_column_int(pAllLangid, 0); + int i; + for(i=0; inIndex; i++){ + cksum1 = cksum1 ^ fts3ChecksumIndex(p, iLangid, i, &rc); + } + } + rc2 = sqlite3_reset(pAllLangid); + if( rc==SQLITE_OK ) rc = rc2; + } + + /* This block calculates the checksum according to the %_content table */ + if( rc==SQLITE_OK ){ + sqlite3_tokenizer_module const *pModule = p->pTokenizer->pModule; + sqlite3_stmt *pStmt = 0; + char *zSql; + + zSql = sqlite3_mprintf("SELECT %s" , p->zReadExprlist); + if( !zSql ){ + rc = SQLITE_NOMEM; + }else{ + rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); + sqlite3_free(zSql); + } + + while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ + i64 iDocid = sqlite3_column_int64(pStmt, 0); + int iLang = langidFromSelect(p, pStmt); + int iCol; + + for(iCol=0; rc==SQLITE_OK && iColnColumn; iCol++){ + if( p->abNotindexed[iCol]==0 ){ + const char *zText = (const char *)sqlite3_column_text(pStmt, iCol+1); + int nText = sqlite3_column_bytes(pStmt, iCol+1); + sqlite3_tokenizer_cursor *pT = 0; + + rc = sqlite3Fts3OpenTokenizer(p->pTokenizer, iLang, zText, nText,&pT); + while( rc==SQLITE_OK ){ + char const *zToken; /* Buffer containing token */ + int nToken = 0; /* Number of bytes in token */ + int iDum1 = 0, iDum2 = 0; /* Dummy variables */ + int iPos = 0; /* Position of token in zText */ + + rc = pModule->xNext(pT, &zToken, &nToken, &iDum1, &iDum2, &iPos); + if( rc==SQLITE_OK ){ + int i; + cksum2 = cksum2 ^ fts3ChecksumEntry( + zToken, nToken, iLang, 0, iDocid, iCol, iPos + ); + for(i=1; inIndex; i++){ + if( p->aIndex[i].nPrefix<=nToken ){ + cksum2 = cksum2 ^ fts3ChecksumEntry( + zToken, p->aIndex[i].nPrefix, iLang, i, iDocid, iCol, iPos + ); + } + } + } + } + if( pT ) pModule->xClose(pT); + if( rc==SQLITE_DONE ) rc = SQLITE_OK; + } + } + } + + sqlite3_finalize(pStmt); + } + + *pbOk = (cksum1==cksum2); + return rc; +} + +/* +** Run the integrity-check. If no error occurs and the current contents of +** the FTS index are correct, return SQLITE_OK. Or, if the contents of the +** FTS index are incorrect, return SQLITE_CORRUPT_VTAB. +** +** Or, if an error (e.g. an OOM or IO error) occurs, return an SQLite +** error code. +** +** The integrity-check works as follows. For each token and indexed token +** prefix in the document set, a 64-bit checksum is calculated (by code +** in fts3ChecksumEntry()) based on the following: +** +** + The index number (0 for the main index, 1 for the first prefix +** index etc.), +** + The token (or token prefix) text itself, +** + The language-id of the row it appears in, +** + The docid of the row it appears in, +** + The column it appears in, and +** + The tokens position within that column. +** +** The checksums for all entries in the index are XORed together to create +** a single checksum for the entire index. +** +** The integrity-check code calculates the same checksum in two ways: +** +** 1. By scanning the contents of the FTS index, and +** 2. By scanning and tokenizing the content table. +** +** If the two checksums are identical, the integrity-check is deemed to have +** passed. +*/ +static int fts3DoIntegrityCheck( + Fts3Table *p /* FTS3 table handle */ +){ + int rc; + int bOk = 0; + rc = fts3IntegrityCheck(p, &bOk); + if( rc==SQLITE_OK && bOk==0 ) rc = FTS_CORRUPT_VTAB; + return rc; +} + +/* +** Handle a 'special' INSERT of the form: +** +** "INSERT INTO tbl(tbl) VALUES()" +** +** Argument pVal contains the result of . Currently the only +** meaningful value to insert is the text 'optimize'. +*/ +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 = fts3DoOptimize(p, 0); + }else if( nVal==7 && 0==sqlite3_strnicmp(zVal, "rebuild", 7) ){ + rc = fts3DoRebuild(p); + }else if( nVal==15 && 0==sqlite3_strnicmp(zVal, "integrity-check", 15) ){ + rc = fts3DoIntegrityCheck(p); + }else if( nVal>6 && 0==sqlite3_strnicmp(zVal, "merge=", 6) ){ + rc = fts3DoIncrmerge(p, &zVal[6]); + }else if( nVal>10 && 0==sqlite3_strnicmp(zVal, "automerge=", 10) ){ + rc = fts3DoAutoincrmerge(p, &zVal[10]); +#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; + }else if( nVal>21 && 0==sqlite3_strnicmp(zVal, "test-no-incr-doclist=", 21) ){ + p->bNoIncrDoclist = atoi(&zVal[21]); + rc = SQLITE_OK; +#endif + }else{ + rc = SQLITE_ERROR; + } + + return rc; +} + +#ifndef SQLITE_DISABLE_FTS4_DEFERRED +/* +** Delete all cached deferred doclists. Deferred doclists are cached +** (allocated) by the sqlite3Fts3CacheDeferredDoclists() function. +*/ +SQLITE_PRIVATE void sqlite3Fts3FreeDeferredDoclists(Fts3Cursor *pCsr){ + Fts3DeferredToken *pDef; + for(pDef=pCsr->pDeferred; pDef; pDef=pDef->pNext){ + fts3PendingListDelete(pDef->pList); + pDef->pList = 0; + } +} + +/* +** Free all entries in the pCsr->pDeffered list. Entries are added to +** this list using sqlite3Fts3DeferToken(). +*/ +SQLITE_PRIVATE void sqlite3Fts3FreeDeferredTokens(Fts3Cursor *pCsr){ + Fts3DeferredToken *pDef; + Fts3DeferredToken *pNext; + for(pDef=pCsr->pDeferred; pDef; pDef=pNext){ + pNext = pDef->pNext; + fts3PendingListDelete(pDef->pList); + sqlite3_free(pDef); + } + pCsr->pDeferred = 0; +} + +/* +** Generate deferred-doclists for all tokens in the pCsr->pDeferred list +** based on the row that pCsr currently points to. +** +** A deferred-doclist is like any other doclist with position information +** included, except that it only contains entries for a single row of the +** table, not for all rows. +*/ +SQLITE_PRIVATE int sqlite3Fts3CacheDeferredDoclists(Fts3Cursor *pCsr){ + int rc = SQLITE_OK; /* Return code */ + if( pCsr->pDeferred ){ + int i; /* Used to iterate through table columns */ + sqlite3_int64 iDocid; /* Docid of the row pCsr points to */ + Fts3DeferredToken *pDef; /* Used to iterate through deferred tokens */ + + Fts3Table *p = (Fts3Table *)pCsr->base.pVtab; + sqlite3_tokenizer *pT = p->pTokenizer; + sqlite3_tokenizer_module const *pModule = pT->pModule; + + assert( pCsr->isRequireSeek==0 ); + iDocid = sqlite3_column_int64(pCsr->pStmt, 0); + + for(i=0; inColumn && rc==SQLITE_OK; i++){ + if( p->abNotindexed[i]==0 ){ + const char *zText = (const char *)sqlite3_column_text(pCsr->pStmt, i+1); + sqlite3_tokenizer_cursor *pTC = 0; + + rc = sqlite3Fts3OpenTokenizer(pT, pCsr->iLangid, zText, -1, &pTC); + while( rc==SQLITE_OK ){ + char const *zToken; /* Buffer containing token */ + int nToken = 0; /* Number of bytes in token */ + int iDum1 = 0, iDum2 = 0; /* Dummy variables */ + int iPos = 0; /* Position of token in zText */ + + rc = pModule->xNext(pTC, &zToken, &nToken, &iDum1, &iDum2, &iPos); + for(pDef=pCsr->pDeferred; pDef && rc==SQLITE_OK; pDef=pDef->pNext){ + Fts3PhraseToken *pPT = pDef->pToken; + if( (pDef->iCol>=p->nColumn || pDef->iCol==i) + && (pPT->bFirst==0 || iPos==0) + && (pPT->n==nToken || (pPT->isPrefix && pPT->nz, pPT->n)) + ){ + fts3PendingListAppend(&pDef->pList, iDocid, i, iPos, &rc); + } + } + } + if( pTC ) pModule->xClose(pTC); + if( rc==SQLITE_DONE ) rc = SQLITE_OK; + } + } + + for(pDef=pCsr->pDeferred; pDef && rc==SQLITE_OK; pDef=pDef->pNext){ + if( pDef->pList ){ + rc = fts3PendingListAppendVarint(&pDef->pList, 0); + } + } + } + + return rc; +} + +SQLITE_PRIVATE int sqlite3Fts3DeferredTokenList( + Fts3DeferredToken *p, + char **ppData, + int *pnData +){ + char *pRet; + int nSkip; + sqlite3_int64 dummy; + + *ppData = 0; + *pnData = 0; + + if( p->pList==0 ){ + return SQLITE_OK; + } + + pRet = (char *)sqlite3_malloc(p->pList->nData); + if( !pRet ) return SQLITE_NOMEM; + + nSkip = sqlite3Fts3GetVarint(p->pList->aData, &dummy); + *pnData = p->pList->nData - nSkip; + *ppData = pRet; + + memcpy(pRet, &p->pList->aData[nSkip], *pnData); + return SQLITE_OK; +} + +/* +** Add an entry for token pToken to the pCsr->pDeferred list. +*/ +SQLITE_PRIVATE int sqlite3Fts3DeferToken( + Fts3Cursor *pCsr, /* Fts3 table cursor */ + Fts3PhraseToken *pToken, /* Token to defer */ + int iCol /* Column that token must appear in (or -1) */ +){ + Fts3DeferredToken *pDeferred; + pDeferred = sqlite3_malloc(sizeof(*pDeferred)); + if( !pDeferred ){ + return SQLITE_NOMEM; + } + memset(pDeferred, 0, sizeof(*pDeferred)); + pDeferred->pToken = pToken; + pDeferred->pNext = pCsr->pDeferred; + pDeferred->iCol = iCol; + pCsr->pDeferred = pDeferred; + + assert( pToken->pDeferred==0 ); + pToken->pDeferred = pDeferred; + + return SQLITE_OK; +} +#endif + +/* +** SQLite value pRowid contains the rowid of a row that may or may not be +** present in the FTS3 table. If it is, delete it and adjust the contents +** of subsiduary data structures accordingly. +*/ +static int fts3DeleteByRowid( + Fts3Table *p, + sqlite3_value *pRowid, + int *pnChng, /* IN/OUT: Decrement if row is deleted */ + u32 *aSzDel +){ + int rc = SQLITE_OK; /* Return code */ + int bFound = 0; /* True if *pRowid really is in the table */ + + fts3DeleteTerms(&rc, p, pRowid, aSzDel, &bFound); + if( bFound && rc==SQLITE_OK ){ + int isEmpty = 0; /* Deleting *pRowid leaves the table empty */ + rc = fts3IsEmpty(p, pRowid, &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, 1); + *pnChng = 0; + memset(aSzDel, 0, sizeof(u32) * (p->nColumn+1) * 2); + }else{ + *pnChng = *pnChng - 1; + if( p->zContentTbl==0 ){ + fts3SqlExec(&rc, p, SQL_DELETE_CONTENT, &pRowid); + } + if( p->bHasDocsize ){ + fts3SqlExec(&rc, p, SQL_DELETE_DOCSIZE, &pRowid); + } + } + } + } + + return rc; +} + +/* +** This function does the work for the xUpdate method of FTS3 virtual +** tables. The schema of the virtual table being: +** +** CREATE TABLE
      ( +** , +**
      HIDDEN, +** docid HIDDEN, +** HIDDEN +** ); +** +** +*/ +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 */ + u32 *aSzIns = 0; /* Sizes of inserted documents */ + u32 *aSzDel = 0; /* Sizes of deleted documents */ + int nChng = 0; /* Net change in number of documents */ + int bInsertDone = 0; + + /* At this point it must be known if the %_stat table exists or not. + ** So bHasStat may not be 2. */ + assert( p->bHasStat==0 || p->bHasStat==1 ); + + assert( p->pSegments==0 ); + assert( + nArg==1 /* DELETE operations */ + || nArg==(2 + p->nColumn + 3) /* INSERT or UPDATE operations */ + ); + + /* Check for a "special" INSERT operation. One of the form: + ** + ** INSERT INTO xyz(xyz) VALUES('command'); + */ + if( nArg>1 + && sqlite3_value_type(apVal[0])==SQLITE_NULL + && sqlite3_value_type(apVal[p->nColumn+2])!=SQLITE_NULL + ){ + rc = fts3SpecialInsert(p, apVal[p->nColumn+2]); + goto update_out; + } + + if( nArg>1 && sqlite3_value_int(apVal[2 + p->nColumn + 2])<0 ){ + rc = SQLITE_CONSTRAINT; + goto update_out; + } + + /* Allocate space to hold the change in document sizes */ + aSzDel = sqlite3_malloc( sizeof(aSzDel[0])*(p->nColumn+1)*2 ); + if( aSzDel==0 ){ + rc = SQLITE_NOMEM; + goto update_out; + } + aSzIns = &aSzDel[p->nColumn+1]; + memset(aSzDel, 0, sizeof(aSzDel[0])*(p->nColumn+1)*2); + + rc = fts3Writelock(p); + if( rc!=SQLITE_OK ) goto update_out; + + /* If this is an INSERT operation, or an UPDATE that modifies the rowid + ** value, then this operation requires constraint handling. + ** + ** If the on-conflict mode is REPLACE, this means that the existing row + ** should be deleted from the database before inserting the new row. Or, + ** if the on-conflict mode is other than REPLACE, then this method must + ** detect the conflict and return SQLITE_CONSTRAINT before beginning to + ** modify the database file. + */ + if( nArg>1 && p->zContentTbl==0 ){ + /* Find the value object that holds the new rowid value. */ + sqlite3_value *pNewRowid = apVal[3+p->nColumn]; + if( sqlite3_value_type(pNewRowid)==SQLITE_NULL ){ + pNewRowid = apVal[1]; + } + + if( sqlite3_value_type(pNewRowid)!=SQLITE_NULL && ( + sqlite3_value_type(apVal[0])==SQLITE_NULL + || sqlite3_value_int64(apVal[0])!=sqlite3_value_int64(pNewRowid) + )){ + /* The new rowid is not NULL (in this case the rowid will be + ** automatically assigned and there is no chance of a conflict), and + ** the statement is either an INSERT or an UPDATE that modifies the + ** rowid column. So if the conflict mode is REPLACE, then delete any + ** existing row with rowid=pNewRowid. + ** + ** Or, if the conflict mode is not REPLACE, insert the new record into + ** the %_content table. If we hit the duplicate rowid constraint (or any + ** other error) while doing so, return immediately. + ** + ** This branch may also run if pNewRowid contains a value that cannot + ** be losslessly converted to an integer. In this case, the eventual + ** call to fts3InsertData() (either just below or further on in this + ** function) will return SQLITE_MISMATCH. If fts3DeleteByRowid is + ** invoked, it will delete zero rows (since no row will have + ** docid=$pNewRowid if $pNewRowid is not an integer value). + */ + if( sqlite3_vtab_on_conflict(p->db)==SQLITE_REPLACE ){ + rc = fts3DeleteByRowid(p, pNewRowid, &nChng, aSzDel); + }else{ + rc = fts3InsertData(p, apVal, pRowid); + bInsertDone = 1; + } + } + } + if( rc!=SQLITE_OK ){ + goto update_out; + } + + /* If this is a DELETE or UPDATE operation, remove the old record. */ + if( sqlite3_value_type(apVal[0])!=SQLITE_NULL ){ + assert( sqlite3_value_type(apVal[0])==SQLITE_INTEGER ); + rc = fts3DeleteByRowid(p, apVal[0], &nChng, aSzDel); + isRemove = 1; + } + + /* If this is an INSERT or UPDATE operation, insert the new record. */ + if( nArg>1 && rc==SQLITE_OK ){ + int iLangid = sqlite3_value_int(apVal[2 + p->nColumn + 2]); + if( bInsertDone==0 ){ + rc = fts3InsertData(p, apVal, pRowid); + if( rc==SQLITE_CONSTRAINT && p->zContentTbl==0 ){ + rc = FTS_CORRUPT_VTAB; + } + } + if( rc==SQLITE_OK && (!isRemove || *pRowid!=p->iPrevDocid ) ){ + rc = fts3PendingTermsDocid(p, 0, iLangid, *pRowid); + } + if( rc==SQLITE_OK ){ + assert( p->iPrevDocid==*pRowid ); + rc = fts3InsertTerms(p, iLangid, apVal, aSzIns); + } + if( p->bHasDocsize ){ + fts3InsertDocsize(&rc, p, aSzIns); + } + nChng++; + } + + if( p->bFts4 ){ + fts3UpdateDocTotals(&rc, p, aSzIns, aSzDel, nChng); + } + + update_out: + sqlite3_free(aSzDel); + sqlite3Fts3SegmentsClose(p); + return rc; +} + +/* +** 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. +*/ +SQLITE_PRIVATE int sqlite3Fts3Optimize(Fts3Table *p){ + int rc; + rc = sqlite3_exec(p->db, "SAVEPOINT fts3", 0, 0, 0); + if( rc==SQLITE_OK ){ + rc = fts3DoOptimize(p, 1); + if( rc==SQLITE_OK || rc==SQLITE_DONE ){ + int rc2 = sqlite3_exec(p->db, "RELEASE fts3", 0, 0, 0); + if( rc2!=SQLITE_OK ) rc = rc2; + }else{ + sqlite3_exec(p->db, "ROLLBACK TO fts3", 0, 0, 0); + sqlite3_exec(p->db, "RELEASE fts3", 0, 0, 0); + } + } + sqlite3Fts3SegmentsClose(p); + return rc; +} + +#endif + +/************** End of fts3_write.c ******************************************/ +/************** Begin file fts3_snippet.c ************************************/ +/* +** 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. +** +****************************************************************************** +*/ + +/* #include "fts3Int.h" */ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) + +/* #include */ +/* #include */ + +/* +** Characters that may appear in the second argument to matchinfo(). +*/ +#define FTS3_MATCHINFO_NPHRASE 'p' /* 1 value */ +#define FTS3_MATCHINFO_NCOL 'c' /* 1 value */ +#define FTS3_MATCHINFO_NDOC 'n' /* 1 value */ +#define FTS3_MATCHINFO_AVGLENGTH 'a' /* nCol values */ +#define FTS3_MATCHINFO_LENGTH 'l' /* nCol values */ +#define FTS3_MATCHINFO_LCS 's' /* nCol values */ +#define FTS3_MATCHINFO_HITS 'x' /* 3*nCol*nPhrase values */ +#define FTS3_MATCHINFO_LHITS 'y' /* nCol*nPhrase values */ +#define FTS3_MATCHINFO_LHITS_BM 'b' /* nCol*nPhrase values */ + +/* +** The default value for the second argument to matchinfo(). +*/ +#define FTS3_MATCHINFO_DEFAULT "pcx" + + +/* +** Used as an fts3ExprIterate() context when loading phrase doclists to +** Fts3Expr.aDoclist[]/nDoclist. +*/ +typedef struct LoadDoclistCtx LoadDoclistCtx; +struct LoadDoclistCtx { + Fts3Cursor *pCsr; /* FTS3 Cursor */ + int nPhrase; /* Number of phrases seen so far */ + int nToken; /* Number of tokens seen so far */ +}; + +/* +** The following types are used as part of the implementation of the +** fts3BestSnippet() routine. +*/ +typedef struct SnippetIter SnippetIter; +typedef struct SnippetPhrase SnippetPhrase; +typedef struct SnippetFragment SnippetFragment; + +struct SnippetIter { + Fts3Cursor *pCsr; /* Cursor snippet is being generated from */ + int iCol; /* Extract snippet from this column */ + int nSnippet; /* Requested snippet length (in tokens) */ + int nPhrase; /* Number of phrases in query */ + SnippetPhrase *aPhrase; /* Array of size nPhrase */ + int iCurrent; /* First token of current snippet */ +}; + +struct SnippetPhrase { + int nToken; /* Number of tokens in phrase */ + char *pList; /* Pointer to start of phrase position list */ + int iHead; /* Next value in position list */ + char *pHead; /* Position list data following iHead */ + int iTail; /* Next value in trailing position list */ + char *pTail; /* Position list data following iTail */ +}; + +struct SnippetFragment { + int iCol; /* Column snippet is extracted from */ + int iPos; /* Index of first token in snippet */ + u64 covered; /* Mask of query phrases covered */ + u64 hlmask; /* Mask of snippet terms to highlight */ +}; + +/* +** This type is used as an fts3ExprIterate() context object while +** accumulating the data returned by the matchinfo() function. +*/ +typedef struct MatchInfo MatchInfo; +struct MatchInfo { + Fts3Cursor *pCursor; /* FTS3 Cursor */ + int nCol; /* Number of columns in table */ + int nPhrase; /* Number of matchable phrases in query */ + sqlite3_int64 nDoc; /* Number of docs in database */ + char flag; + u32 *aMatchinfo; /* Pre-allocated buffer */ +}; + +/* +** An instance of this structure is used to manage a pair of buffers, each +** (nElem * sizeof(u32)) bytes in size. See the MatchinfoBuffer code below +** for details. +*/ +struct MatchinfoBuffer { + u8 aRef[3]; + int nElem; + int bGlobal; /* Set if global data is loaded */ + char *zMatchinfo; + u32 aMatchinfo[1]; +}; + + +/* +** The snippet() and offsets() functions both return text values. An instance +** of the following structure is used to accumulate those values while the +** functions are running. See fts3StringAppend() for details. +*/ +typedef struct StrBuffer StrBuffer; +struct StrBuffer { + char *z; /* Pointer to buffer containing string */ + int n; /* Length of z in bytes (excl. nul-term) */ + int nAlloc; /* Allocated size of buffer z in bytes */ +}; + + +/************************************************************************* +** Start of MatchinfoBuffer code. +*/ + +/* +** Allocate a two-slot MatchinfoBuffer object. +*/ +static MatchinfoBuffer *fts3MIBufferNew(int nElem, const char *zMatchinfo){ + MatchinfoBuffer *pRet; + int nByte = sizeof(u32) * (2*nElem + 1) + sizeof(MatchinfoBuffer); + int nStr = (int)strlen(zMatchinfo); + + pRet = sqlite3_malloc(nByte + nStr+1); + if( pRet ){ + memset(pRet, 0, nByte); + pRet->aMatchinfo[0] = (u8*)(&pRet->aMatchinfo[1]) - (u8*)pRet; + pRet->aMatchinfo[1+nElem] = pRet->aMatchinfo[0] + sizeof(u32)*(nElem+1); + pRet->nElem = nElem; + pRet->zMatchinfo = ((char*)pRet) + nByte; + memcpy(pRet->zMatchinfo, zMatchinfo, nStr+1); + pRet->aRef[0] = 1; + } + + return pRet; +} + +static void fts3MIBufferFree(void *p){ + MatchinfoBuffer *pBuf = (MatchinfoBuffer*)((u8*)p - ((u32*)p)[-1]); + + assert( (u32*)p==&pBuf->aMatchinfo[1] + || (u32*)p==&pBuf->aMatchinfo[pBuf->nElem+2] + ); + if( (u32*)p==&pBuf->aMatchinfo[1] ){ + pBuf->aRef[1] = 0; + }else{ + pBuf->aRef[2] = 0; + } + + if( pBuf->aRef[0]==0 && pBuf->aRef[1]==0 && pBuf->aRef[2]==0 ){ + sqlite3_free(pBuf); + } +} + +static void (*fts3MIBufferAlloc(MatchinfoBuffer *p, u32 **paOut))(void*){ + void (*xRet)(void*) = 0; + u32 *aOut = 0; + + if( p->aRef[1]==0 ){ + p->aRef[1] = 1; + aOut = &p->aMatchinfo[1]; + xRet = fts3MIBufferFree; + } + else if( p->aRef[2]==0 ){ + p->aRef[2] = 1; + aOut = &p->aMatchinfo[p->nElem+2]; + xRet = fts3MIBufferFree; + }else{ + aOut = (u32*)sqlite3_malloc(p->nElem * sizeof(u32)); + if( aOut ){ + xRet = sqlite3_free; + if( p->bGlobal ) memcpy(aOut, &p->aMatchinfo[1], p->nElem*sizeof(u32)); + } + } + + *paOut = aOut; + return xRet; +} + +static void fts3MIBufferSetGlobal(MatchinfoBuffer *p){ + p->bGlobal = 1; + memcpy(&p->aMatchinfo[2+p->nElem], &p->aMatchinfo[1], p->nElem*sizeof(u32)); +} + +/* +** Free a MatchinfoBuffer object allocated using fts3MIBufferNew() +*/ +SQLITE_PRIVATE void sqlite3Fts3MIBufferFree(MatchinfoBuffer *p){ + if( p ){ + assert( p->aRef[0]==1 ); + p->aRef[0] = 0; + if( p->aRef[0]==0 && p->aRef[1]==0 && p->aRef[2]==0 ){ + sqlite3_free(p); + } + } +} + +/* +** End of MatchinfoBuffer code. +*************************************************************************/ + + +/* +** This function is used to help iterate through a position-list. A position +** list is a list of unique integers, sorted from smallest to largest. Each +** element of the list is represented by an FTS3 varint that takes the value +** of the difference between the current element and the previous one plus +** two. For example, to store the position-list: +** +** 4 9 113 +** +** the three varints: +** +** 6 7 106 +** +** are encoded. +** +** When this function is called, *pp points to the start of an element of +** the list. *piPos contains the value of the previous entry in the list. +** After it returns, *piPos contains the value of the next element of the +** list and *pp is advanced to the following varint. +*/ +static void fts3GetDeltaPosition(char **pp, int *piPos){ + int iVal; + *pp += fts3GetVarint32(*pp, &iVal); + *piPos += (iVal-2); +} + +/* +** Helper function for fts3ExprIterate() (see below). +*/ +static int fts3ExprIterate2( + Fts3Expr *pExpr, /* Expression to iterate phrases of */ + int *piPhrase, /* Pointer to phrase counter */ + int (*x)(Fts3Expr*,int,void*), /* Callback function to invoke for phrases */ + void *pCtx /* Second argument to pass to callback */ +){ + int rc; /* Return code */ + int eType = pExpr->eType; /* Type of expression node pExpr */ + + if( eType!=FTSQUERY_PHRASE ){ + assert( pExpr->pLeft && pExpr->pRight ); + rc = fts3ExprIterate2(pExpr->pLeft, piPhrase, x, pCtx); + if( rc==SQLITE_OK && eType!=FTSQUERY_NOT ){ + rc = fts3ExprIterate2(pExpr->pRight, piPhrase, x, pCtx); + } + }else{ + rc = x(pExpr, *piPhrase, pCtx); + (*piPhrase)++; + } + return rc; +} + +/* +** 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. +** +** 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 int fts3ExprIterate( + Fts3Expr *pExpr, /* Expression to iterate phrases of */ + int (*x)(Fts3Expr*,int,void*), /* Callback function to invoke for phrases */ + void *pCtx /* Second argument to pass to callback */ +){ + int iPhrase = 0; /* Variable used as the phrase counter */ + return fts3ExprIterate2(pExpr, &iPhrase, x, pCtx); +} + + +/* +** This is an fts3ExprIterate() callback used while loading the doclists +** for each phrase into Fts3Expr.aDoclist[]/nDoclist. See also +** fts3ExprLoadDoclists(). +*/ +static int fts3ExprLoadDoclistsCb(Fts3Expr *pExpr, int iPhrase, void *ctx){ + int rc = SQLITE_OK; + Fts3Phrase *pPhrase = pExpr->pPhrase; + LoadDoclistCtx *p = (LoadDoclistCtx *)ctx; + + UNUSED_PARAMETER(iPhrase); + + p->nPhrase++; + p->nToken += pPhrase->nToken; + + return rc; +} + +/* +** Load the doclists for each phrase in the query associated with FTS3 cursor +** pCsr. +** +** If pnPhrase is not NULL, then *pnPhrase is set to the number of matchable +** phrases in the expression (all phrases except those directly or +** indirectly descended from the right-hand-side of a NOT operator). If +** pnToken is not NULL, then it is set to the number of tokens in all +** matchable phrases of the expression. +*/ +static int fts3ExprLoadDoclists( + Fts3Cursor *pCsr, /* Fts3 cursor for current query */ + int *pnPhrase, /* OUT: Number of phrases in query */ + int *pnToken /* OUT: Number of tokens in query */ +){ + int rc; /* Return Code */ + LoadDoclistCtx sCtx = {0,0,0}; /* Context for fts3ExprIterate() */ + sCtx.pCsr = pCsr; + rc = fts3ExprIterate(pCsr->pExpr, fts3ExprLoadDoclistsCb, (void *)&sCtx); + if( pnPhrase ) *pnPhrase = sCtx.nPhrase; + if( pnToken ) *pnToken = sCtx.nToken; + return rc; +} + +static int fts3ExprPhraseCountCb(Fts3Expr *pExpr, int iPhrase, void *ctx){ + (*(int *)ctx)++; + pExpr->iPhrase = iPhrase; + return SQLITE_OK; +} +static int fts3ExprPhraseCount(Fts3Expr *pExpr){ + int nPhrase = 0; + (void)fts3ExprIterate(pExpr, fts3ExprPhraseCountCb, (void *)&nPhrase); + return nPhrase; +} + +/* +** Advance the position list iterator specified by the first two +** arguments so that it points to the first element with a value greater +** than or equal to parameter iNext. +*/ +static void fts3SnippetAdvance(char **ppIter, int *piIter, int iNext){ + char *pIter = *ppIter; + if( pIter ){ + int iIter = *piIter; + + while( iIteriCurrent<0 ){ + /* The SnippetIter object has just been initialized. The first snippet + ** candidate always starts at offset 0 (even if this candidate has a + ** score of 0.0). + */ + pIter->iCurrent = 0; + + /* Advance the 'head' iterator of each phrase to the first offset that + ** is greater than or equal to (iNext+nSnippet). + */ + for(i=0; inPhrase; i++){ + SnippetPhrase *pPhrase = &pIter->aPhrase[i]; + fts3SnippetAdvance(&pPhrase->pHead, &pPhrase->iHead, pIter->nSnippet); + } + }else{ + int iStart; + int iEnd = 0x7FFFFFFF; + + for(i=0; inPhrase; i++){ + SnippetPhrase *pPhrase = &pIter->aPhrase[i]; + if( pPhrase->pHead && pPhrase->iHeadiHead; + } + } + if( iEnd==0x7FFFFFFF ){ + return 1; + } + + pIter->iCurrent = iStart = iEnd - pIter->nSnippet + 1; + for(i=0; inPhrase; i++){ + SnippetPhrase *pPhrase = &pIter->aPhrase[i]; + fts3SnippetAdvance(&pPhrase->pHead, &pPhrase->iHead, iEnd+1); + fts3SnippetAdvance(&pPhrase->pTail, &pPhrase->iTail, iStart); + } + } + + return 0; +} + +/* +** Retrieve information about the current candidate snippet of snippet +** iterator pIter. +*/ +static void fts3SnippetDetails( + SnippetIter *pIter, /* Snippet iterator */ + u64 mCovered, /* Bitmask of phrases already covered */ + int *piToken, /* OUT: First token of proposed snippet */ + int *piScore, /* OUT: "Score" for this snippet */ + u64 *pmCover, /* OUT: Bitmask of phrases covered */ + u64 *pmHighlight /* OUT: Bitmask of terms to highlight */ +){ + int iStart = pIter->iCurrent; /* First token of snippet */ + int iScore = 0; /* Score of this snippet */ + int i; /* Loop counter */ + u64 mCover = 0; /* Mask of phrases covered by this snippet */ + u64 mHighlight = 0; /* Mask of tokens to highlight in snippet */ + + for(i=0; inPhrase; i++){ + SnippetPhrase *pPhrase = &pIter->aPhrase[i]; + if( pPhrase->pTail ){ + char *pCsr = pPhrase->pTail; + int iCsr = pPhrase->iTail; + + while( iCsr<(iStart+pIter->nSnippet) ){ + int j; + u64 mPhrase = (u64)1 << i; + u64 mPos = (u64)1 << (iCsr - iStart); + assert( iCsr>=iStart ); + if( (mCover|mCovered)&mPhrase ){ + iScore++; + }else{ + iScore += 1000; + } + mCover |= mPhrase; + + for(j=0; jnToken; j++){ + mHighlight |= (mPos>>j); + } + + if( 0==(*pCsr & 0x0FE) ) break; + fts3GetDeltaPosition(&pCsr, &iCsr); + } + } + } + + /* Set the output variables before returning. */ + *piToken = iStart; + *piScore = iScore; + *pmCover = mCover; + *pmHighlight = mHighlight; +} + +/* +** This function is an fts3ExprIterate() callback used by fts3BestSnippet(). +** Each invocation populates an element of the SnippetIter.aPhrase[] array. +*/ +static int fts3SnippetFindPositions(Fts3Expr *pExpr, int iPhrase, void *ctx){ + SnippetIter *p = (SnippetIter *)ctx; + SnippetPhrase *pPhrase = &p->aPhrase[iPhrase]; + char *pCsr; + int rc; + + pPhrase->nToken = pExpr->pPhrase->nToken; + rc = sqlite3Fts3EvalPhrasePoslist(p->pCsr, pExpr, p->iCol, &pCsr); + assert( rc==SQLITE_OK || pCsr==0 ); + if( pCsr ){ + int iFirst = 0; + pPhrase->pList = pCsr; + fts3GetDeltaPosition(&pCsr, &iFirst); + assert( iFirst>=0 ); + pPhrase->pHead = pCsr; + pPhrase->pTail = pCsr; + pPhrase->iHead = iFirst; + pPhrase->iTail = iFirst; + }else{ + assert( rc!=SQLITE_OK || ( + pPhrase->pList==0 && pPhrase->pHead==0 && pPhrase->pTail==0 + )); + } + + return rc; +} + +/* +** Select the fragment of text consisting of nFragment contiguous tokens +** from column iCol that represent the "best" snippet. The best snippet +** is the snippet with the highest score, where scores are calculated +** by adding: +** +** (a) +1 point for each occurrence of a matchable phrase in the snippet. +** +** (b) +1000 points for the first occurrence of each matchable phrase in +** the snippet for which the corresponding mCovered bit is not set. +** +** The selected snippet parameters are stored in structure *pFragment before +** returning. The score of the selected snippet is stored in *piScore +** before returning. +*/ +static int fts3BestSnippet( + int nSnippet, /* Desired snippet length */ + Fts3Cursor *pCsr, /* Cursor to create snippet for */ + int iCol, /* Index of column to create snippet from */ + u64 mCovered, /* Mask of phrases already covered */ + u64 *pmSeen, /* IN/OUT: Mask of phrases seen */ + SnippetFragment *pFragment, /* OUT: Best snippet found */ + int *piScore /* OUT: Score of snippet pFragment */ +){ + int rc; /* Return Code */ + int nList; /* Number of phrases in expression */ + SnippetIter sIter; /* Iterates through snippet candidates */ + int nByte; /* Number of bytes of space to allocate */ + int iBestScore = -1; /* Best snippet score found so far */ + int i; /* Loop counter */ + + memset(&sIter, 0, sizeof(sIter)); + + /* 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, 0); + if( rc!=SQLITE_OK ){ + return rc; + } + + /* Now that it is known how many phrases there are, allocate and zero + ** the required space using malloc(). + */ + nByte = sizeof(SnippetPhrase) * nList; + sIter.aPhrase = (SnippetPhrase *)sqlite3_malloc(nByte); + if( !sIter.aPhrase ){ + return SQLITE_NOMEM; + } + memset(sIter.aPhrase, 0, nByte); + + /* Initialize the contents of the SnippetIter object. Then iterate through + ** the set of phrases in the expression to populate the aPhrase[] array. + */ + sIter.pCsr = pCsr; + sIter.iCol = iCol; + sIter.nSnippet = nSnippet; + sIter.nPhrase = nList; + sIter.iCurrent = -1; + rc = fts3ExprIterate(pCsr->pExpr, fts3SnippetFindPositions, (void*)&sIter); + if( rc==SQLITE_OK ){ + + /* Set the *pmSeen output variable. */ + for(i=0; iiCol = iCol; + while( !fts3SnippetNextCandidate(&sIter) ){ + int iPos; + int iScore; + u64 mCover; + u64 mHighlite; + fts3SnippetDetails(&sIter, mCovered, &iPos, &iScore, &mCover,&mHighlite); + assert( iScore>=0 ); + if( iScore>iBestScore ){ + pFragment->iPos = iPos; + pFragment->hlmask = mHighlite; + pFragment->covered = mCover; + iBestScore = iScore; + } + } + + *piScore = iBestScore; + } + sqlite3_free(sIter.aPhrase); + return rc; +} + + +/* +** Append a string to the string-buffer passed as the first argument. +** +** If nAppend is negative, then the length of the string zAppend is +** determined using strlen(). +*/ +static int fts3StringAppend( + StrBuffer *pStr, /* Buffer to append to */ + const char *zAppend, /* Pointer to data to append to buffer */ + int nAppend /* Size of zAppend in bytes (or -1) */ +){ + if( nAppend<0 ){ + nAppend = (int)strlen(zAppend); + } + + /* If there is insufficient space allocated at StrBuffer.z, use realloc() + ** to grow the buffer until so that it is big enough to accomadate the + ** appended data. + */ + 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; + } + assert( pStr->z!=0 && (pStr->nAlloc >= pStr->n+nAppend+1) ); + + /* Append the data to the string buffer. */ + memcpy(&pStr->z[pStr->n], zAppend, nAppend); + pStr->n += nAppend; + pStr->z[pStr->n] = '\0'; + + return SQLITE_OK; +} + +/* +** The fts3BestSnippet() function often selects snippets that end with a +** query term. That is, the final term of the snippet is always a term +** that requires highlighting. For example, if 'X' is a highlighted term +** and '.' is a non-highlighted term, BestSnippet() may select: +** +** ........X.....X +** +** This function "shifts" the beginning of the snippet forward in the +** document so that there are approximately the same number of +** non-highlighted terms to the right of the final highlighted term as there +** are to the left of the first highlighted term. For example, to this: +** +** ....X.....X.... +** +** This is done as part of extracting the snippet text, not when selecting +** the snippet. Snippet selection is done based on doclists only, so there +** is no way for fts3BestSnippet() to know whether or not the document +** actually contains terms that follow the final highlighted term. +*/ +static int fts3SnippetShift( + Fts3Table *pTab, /* FTS3 table snippet comes from */ + int iLangid, /* Language id to use in tokenizing */ + int nSnippet, /* Number of tokens desired for snippet */ + const char *zDoc, /* Document text to extract snippet from */ + int nDoc, /* Size of buffer zDoc in bytes */ + int *piPos, /* IN/OUT: First token of snippet */ + u64 *pHlmask /* IN/OUT: Mask of tokens to highlight */ +){ + u64 hlmask = *pHlmask; /* Local copy of initial highlight-mask */ + + if( hlmask ){ + int nLeft; /* Tokens to the left of first highlight */ + int nRight; /* Tokens to the right of last highlight */ + int nDesired; /* Ideal number of tokens to shift forward */ + + for(nLeft=0; !(hlmask & ((u64)1 << nLeft)); nLeft++); + for(nRight=0; !(hlmask & ((u64)1 << (nSnippet-1-nRight))); nRight++); + nDesired = (nLeft-nRight)/2; + + /* Ideally, the start of the snippet should be pushed forward in the + ** document nDesired tokens. This block checks if there are actually + ** nDesired tokens to the right of the snippet. If so, *piPos and + ** *pHlMask are updated to shift the snippet nDesired tokens to the + ** right. Otherwise, the snippet is shifted by the number of tokens + ** available. + */ + if( nDesired>0 ){ + int nShift; /* Number of tokens to shift snippet by */ + int iCurrent = 0; /* Token counter */ + int rc; /* Return Code */ + sqlite3_tokenizer_module *pMod; + sqlite3_tokenizer_cursor *pC; + pMod = (sqlite3_tokenizer_module *)pTab->pTokenizer->pModule; + + /* Open a cursor on zDoc/nDoc. Check if there are (nSnippet+nDesired) + ** or more tokens in zDoc/nDoc. + */ + rc = sqlite3Fts3OpenTokenizer(pTab->pTokenizer, iLangid, zDoc, nDoc, &pC); + if( rc!=SQLITE_OK ){ + return rc; + } + while( rc==SQLITE_OK && iCurrent<(nSnippet+nDesired) ){ + const char *ZDUMMY; int DUMMY1 = 0, DUMMY2 = 0, DUMMY3 = 0; + rc = pMod->xNext(pC, &ZDUMMY, &DUMMY1, &DUMMY2, &DUMMY3, &iCurrent); + } + pMod->xClose(pC); + if( rc!=SQLITE_OK && rc!=SQLITE_DONE ){ return rc; } + + nShift = (rc==SQLITE_DONE)+iCurrent-nSnippet; + assert( nShift<=nDesired ); + if( nShift>0 ){ + *piPos += nShift; + *pHlmask = hlmask >> nShift; + } + } + } + return SQLITE_OK; +} + +/* +** Extract the snippet text for fragment pFragment from cursor pCsr and +** append it to string buffer pOut. +*/ +static int fts3SnippetText( + Fts3Cursor *pCsr, /* FTS3 Cursor */ + SnippetFragment *pFragment, /* Snippet to extract */ + int iFragment, /* Fragment number */ + int isLast, /* True for final fragment in snippet */ + int nSnippet, /* Number of tokens in extracted snippet */ + const char *zOpen, /* String inserted before highlighted term */ + const char *zClose, /* String inserted after highlighted term */ + const char *zEllipsis, /* String inserted between snippets */ + StrBuffer *pOut /* Write output here */ +){ + Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab; + int rc; /* Return code */ + const char *zDoc; /* Document text to extract snippet from */ + int nDoc; /* Size of zDoc in bytes */ + int iCurrent = 0; /* Current token number of document */ + int iEnd = 0; /* Byte offset of end of current token */ + int isShiftDone = 0; /* True after snippet is shifted */ + int iPos = pFragment->iPos; /* First token of snippet */ + u64 hlmask = pFragment->hlmask; /* Highlight-mask for snippet */ + int iCol = pFragment->iCol+1; /* Query column to extract text from */ + sqlite3_tokenizer_module *pMod; /* Tokenizer module methods object */ + sqlite3_tokenizer_cursor *pC; /* Tokenizer cursor open on zDoc/nDoc */ + + zDoc = (const char *)sqlite3_column_text(pCsr->pStmt, iCol); + if( zDoc==0 ){ + if( sqlite3_column_type(pCsr->pStmt, iCol)!=SQLITE_NULL ){ + return SQLITE_NOMEM; + } + return SQLITE_OK; + } + nDoc = sqlite3_column_bytes(pCsr->pStmt, iCol); + + /* Open a token cursor on the document. */ + pMod = (sqlite3_tokenizer_module *)pTab->pTokenizer->pModule; + rc = sqlite3Fts3OpenTokenizer(pTab->pTokenizer, pCsr->iLangid, zDoc,nDoc,&pC); + if( rc!=SQLITE_OK ){ + return rc; + } + + while( rc==SQLITE_OK ){ + const char *ZDUMMY; /* Dummy argument used with tokenizer */ + int DUMMY1 = -1; /* Dummy argument used with tokenizer */ + int iBegin = 0; /* Offset in zDoc of start of token */ + int iFin = 0; /* Offset in zDoc of end of token */ + int isHighlight = 0; /* True for highlighted terms */ + + /* Variable DUMMY1 is initialized to a negative value above. Elsewhere + ** in the FTS code the variable that the third argument to xNext points to + ** is initialized to zero before the first (*but not necessarily + ** subsequent*) call to xNext(). This is done for a particular application + ** that needs to know whether or not the tokenizer is being used for + ** snippet generation or for some other purpose. + ** + ** Extreme care is required when writing code to depend on this + ** initialization. It is not a documented part of the tokenizer interface. + ** If a tokenizer is used directly by any code outside of FTS, this + ** convention might not be respected. */ + rc = pMod->xNext(pC, &ZDUMMY, &DUMMY1, &iBegin, &iFin, &iCurrent); + if( rc!=SQLITE_OK ){ + if( rc==SQLITE_DONE ){ + /* Special case - the last token of the snippet is also the last token + ** of the column. Append any punctuation that occurred between the end + ** of the previous token and the end of the document to the output. + ** Then break out of the loop. */ + rc = fts3StringAppend(pOut, &zDoc[iEnd], -1); + } + break; + } + if( iCurrentiLangid, nSnippet, &zDoc[iBegin], n, &iPos, &hlmask + ); + isShiftDone = 1; + + /* Now that the shift has been done, check if the initial "..." are + ** required. They are required if (a) this is not the first fragment, + ** or (b) this fragment does not begin at position 0 of its column. + */ + if( rc==SQLITE_OK ){ + if( iPos>0 || iFragment>0 ){ + rc = fts3StringAppend(pOut, zEllipsis, -1); + }else if( iBegin ){ + rc = fts3StringAppend(pOut, zDoc, iBegin); + } + } + if( rc!=SQLITE_OK || iCurrent=(iPos+nSnippet) ){ + if( isLast ){ + rc = fts3StringAppend(pOut, zEllipsis, -1); + } + break; + } + + /* Set isHighlight to true if this term should be highlighted. */ + isHighlight = (hlmask & ((u64)1 << (iCurrent-iPos)))!=0; + + if( iCurrent>iPos ) rc = fts3StringAppend(pOut, &zDoc[iEnd], iBegin-iEnd); + if( rc==SQLITE_OK && isHighlight ) rc = fts3StringAppend(pOut, zOpen, -1); + if( rc==SQLITE_OK ) rc = fts3StringAppend(pOut, &zDoc[iBegin], iFin-iBegin); + if( rc==SQLITE_OK && isHighlight ) rc = fts3StringAppend(pOut, zClose, -1); + + iEnd = iFin; + } + + pMod->xClose(pC); + return rc; +} + + +/* +** This function is used to count the entries in a column-list (a +** delta-encoded list of term offsets within a single column of a single +** row). When this function is called, *ppCollist should point to the +** beginning of the first varint in the column-list (the varint that +** contains the position of the first matching term in the column data). +** Before returning, *ppCollist is set to point to the first byte after +** the last varint in the column-list (either the 0x00 signifying the end +** of the position-list, or the 0x01 that precedes the column number of +** the next column in the position-list). +** +** The number of elements in the column-list is returned. +*/ +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++; + } + + *ppCollist = pEnd; + return nEntry; +} + +/* +** This function gathers 'y' or 'b' data for a single phrase. +*/ +static void fts3ExprLHits( + Fts3Expr *pExpr, /* Phrase expression node */ + MatchInfo *p /* Matchinfo context */ +){ + Fts3Table *pTab = (Fts3Table *)p->pCursor->base.pVtab; + int iStart; + Fts3Phrase *pPhrase = pExpr->pPhrase; + char *pIter = pPhrase->doclist.pList; + int iCol = 0; + + assert( p->flag==FTS3_MATCHINFO_LHITS_BM || p->flag==FTS3_MATCHINFO_LHITS ); + if( p->flag==FTS3_MATCHINFO_LHITS ){ + iStart = pExpr->iPhrase * p->nCol; + }else{ + iStart = pExpr->iPhrase * ((p->nCol + 31) / 32); + } + + while( 1 ){ + int nHit = fts3ColumnlistCount(&pIter); + if( (pPhrase->iColumn>=pTab->nColumn || pPhrase->iColumn==iCol) ){ + if( p->flag==FTS3_MATCHINFO_LHITS ){ + p->aMatchinfo[iStart + iCol] = (u32)nHit; + }else if( nHit ){ + p->aMatchinfo[iStart + (iCol+1)/32] |= (1 << (iCol&0x1F)); + } + } + assert( *pIter==0x00 || *pIter==0x01 ); + if( *pIter!=0x01 ) break; + pIter++; + pIter += fts3GetVarint32(pIter, &iCol); + } +} + +/* +** Gather the results for matchinfo directives 'y' and 'b'. +*/ +static void fts3ExprLHitGather( + Fts3Expr *pExpr, + MatchInfo *p +){ + assert( (pExpr->pLeft==0)==(pExpr->pRight==0) ); + if( pExpr->bEof==0 && pExpr->iDocid==p->pCursor->iPrevId ){ + if( pExpr->pLeft ){ + fts3ExprLHitGather(pExpr->pLeft, p); + fts3ExprLHitGather(pExpr->pRight, p); + }else{ + fts3ExprLHits(pExpr, p); + } + } +} + +/* +** fts3ExprIterate() callback used to collect the "global" matchinfo stats +** for a single query. +** +** fts3ExprIterate() callback to load the 'global' elements of a +** FTS3_MATCHINFO_HITS matchinfo array. The global stats are those elements +** of the matchinfo array that are constant for all rows returned by the +** current query. +** +** Argument pCtx is actually a pointer to a struct of type MatchInfo. This +** function populates Matchinfo.aMatchinfo[] as follows: +** +** for(iCol=0; iColpCursor, pExpr, &p->aMatchinfo[3*iPhrase*p->nCol] + ); +} + +/* +** fts3ExprIterate() callback used to collect the "local" part of the +** FTS3_MATCHINFO_HITS array. The local stats are those elements of the +** array that are different for each row returned by the query. +*/ +static int fts3ExprLocalHitsCb( + Fts3Expr *pExpr, /* Phrase expression node */ + int iPhrase, /* Phrase number */ + void *pCtx /* Pointer to MatchInfo structure */ +){ + int rc = SQLITE_OK; + MatchInfo *p = (MatchInfo *)pCtx; + int iStart = iPhrase * p->nCol * 3; + int i; + + for(i=0; inCol && rc==SQLITE_OK; i++){ + char *pCsr; + rc = sqlite3Fts3EvalPhrasePoslist(p->pCursor, pExpr, i, &pCsr); + if( pCsr ){ + p->aMatchinfo[iStart+i*3] = fts3ColumnlistCount(&pCsr); + }else{ + p->aMatchinfo[iStart+i*3] = 0; + } + } + + return rc; +} + +static int fts3MatchinfoCheck( + Fts3Table *pTab, + char cArg, + char **pzErr +){ + if( (cArg==FTS3_MATCHINFO_NPHRASE) + || (cArg==FTS3_MATCHINFO_NCOL) + || (cArg==FTS3_MATCHINFO_NDOC && pTab->bFts4) + || (cArg==FTS3_MATCHINFO_AVGLENGTH && pTab->bFts4) + || (cArg==FTS3_MATCHINFO_LENGTH && pTab->bHasDocsize) + || (cArg==FTS3_MATCHINFO_LCS) + || (cArg==FTS3_MATCHINFO_HITS) + || (cArg==FTS3_MATCHINFO_LHITS) + || (cArg==FTS3_MATCHINFO_LHITS_BM) + ){ + return SQLITE_OK; + } + sqlite3Fts3ErrMsg(pzErr, "unrecognized matchinfo request: %c", cArg); + return SQLITE_ERROR; +} + +static int fts3MatchinfoSize(MatchInfo *pInfo, char cArg){ + int nVal; /* Number of integers output by cArg */ + + switch( cArg ){ + case FTS3_MATCHINFO_NDOC: + case FTS3_MATCHINFO_NPHRASE: + case FTS3_MATCHINFO_NCOL: + nVal = 1; + break; + + case FTS3_MATCHINFO_AVGLENGTH: + case FTS3_MATCHINFO_LENGTH: + case FTS3_MATCHINFO_LCS: + nVal = pInfo->nCol; + break; + + case FTS3_MATCHINFO_LHITS: + nVal = pInfo->nCol * pInfo->nPhrase; + break; + + case FTS3_MATCHINFO_LHITS_BM: + nVal = pInfo->nPhrase * ((pInfo->nCol + 31) / 32); + break; + + default: + assert( cArg==FTS3_MATCHINFO_HITS ); + nVal = pInfo->nCol * pInfo->nPhrase * 3; + break; + } + + return nVal; +} + +static int fts3MatchinfoSelectDoctotal( + Fts3Table *pTab, + sqlite3_stmt **ppStmt, + sqlite3_int64 *pnDoc, + const char **paLen +){ + sqlite3_stmt *pStmt; + const char *a; + sqlite3_int64 nDoc; + + if( !*ppStmt ){ + int rc = sqlite3Fts3SelectDoctotal(pTab, ppStmt); + if( rc!=SQLITE_OK ) return rc; + } + pStmt = *ppStmt; + assert( sqlite3_data_count(pStmt)==1 ); + + a = sqlite3_column_blob(pStmt, 0); + a += sqlite3Fts3GetVarint(a, &nDoc); + if( nDoc==0 ) return FTS_CORRUPT_VTAB; + *pnDoc = (u32)nDoc; + + if( paLen ) *paLen = a; + return SQLITE_OK; +} + +/* +** An instance of the following structure is used to store state while +** iterating through a multi-column position-list corresponding to the +** hits for a single phrase on a single row in order to calculate the +** values for a matchinfo() FTS3_MATCHINFO_LCS request. +*/ +typedef struct LcsIterator LcsIterator; +struct LcsIterator { + Fts3Expr *pExpr; /* Pointer to phrase expression */ + int iPosOffset; /* Tokens count up to end of this phrase */ + char *pRead; /* Cursor used to iterate through aDoclist */ + int iPos; /* Current position */ +}; + +/* +** If LcsIterator.iCol is set to the following value, the iterator has +** finished iterating through all offsets for all columns. +*/ +#define LCS_ITERATOR_FINISHED 0x7FFFFFFF; + +static int fts3MatchinfoLcsCb( + Fts3Expr *pExpr, /* Phrase expression node */ + int iPhrase, /* Phrase number (numbered from zero) */ + void *pCtx /* Pointer to MatchInfo structure */ +){ + LcsIterator *aIter = (LcsIterator *)pCtx; + aIter[iPhrase].pExpr = pExpr; + return SQLITE_OK; +} + +/* +** Advance the iterator passed as an argument to the next position. Return +** 1 if the iterator is at EOF or if it now points to the start of the +** position list for the next column. +*/ +static int fts3LcsIteratorAdvance(LcsIterator *pIter){ + char *pRead = pIter->pRead; + sqlite3_int64 iRead; + int rc = 0; + + pRead += sqlite3Fts3GetVarint(pRead, &iRead); + if( iRead==0 || iRead==1 ){ + pRead = 0; + rc = 1; + }else{ + pIter->iPos += (int)(iRead-2); + } + + pIter->pRead = pRead; + return rc; +} + +/* +** This function implements the FTS3_MATCHINFO_LCS matchinfo() flag. +** +** If the call is successful, the longest-common-substring lengths for each +** column are written into the first nCol elements of the pInfo->aMatchinfo[] +** array before returning. SQLITE_OK is returned in this case. +** +** Otherwise, if an error occurs, an SQLite error code is returned and the +** data written to the first nCol elements of pInfo->aMatchinfo[] is +** undefined. +*/ +static int fts3MatchinfoLcs(Fts3Cursor *pCsr, MatchInfo *pInfo){ + LcsIterator *aIter; + int i; + int iCol; + int nToken = 0; + + /* Allocate and populate the array of LcsIterator objects. The array + ** contains one element for each matchable phrase in the query. + **/ + aIter = sqlite3_malloc(sizeof(LcsIterator) * pCsr->nPhrase); + if( !aIter ) return SQLITE_NOMEM; + memset(aIter, 0, sizeof(LcsIterator) * pCsr->nPhrase); + (void)fts3ExprIterate(pCsr->pExpr, fts3MatchinfoLcsCb, (void*)aIter); + + for(i=0; inPhrase; i++){ + LcsIterator *pIter = &aIter[i]; + nToken -= pIter->pExpr->pPhrase->nToken; + pIter->iPosOffset = nToken; + } + + for(iCol=0; iColnCol; iCol++){ + int nLcs = 0; /* LCS value for this column */ + int nLive = 0; /* Number of iterators in aIter not at EOF */ + + for(i=0; inPhrase; i++){ + int rc; + LcsIterator *pIt = &aIter[i]; + rc = sqlite3Fts3EvalPhrasePoslist(pCsr, pIt->pExpr, iCol, &pIt->pRead); + if( rc!=SQLITE_OK ) return rc; + if( pIt->pRead ){ + pIt->iPos = pIt->iPosOffset; + fts3LcsIteratorAdvance(&aIter[i]); + nLive++; + } + } + + while( nLive>0 ){ + LcsIterator *pAdv = 0; /* The iterator to advance by one position */ + int nThisLcs = 0; /* LCS for the current iterator positions */ + + for(i=0; inPhrase; i++){ + LcsIterator *pIter = &aIter[i]; + if( pIter->pRead==0 ){ + /* This iterator is already at EOF for this column. */ + nThisLcs = 0; + }else{ + if( pAdv==0 || pIter->iPosiPos ){ + pAdv = pIter; + } + if( nThisLcs==0 || pIter->iPos==pIter[-1].iPos ){ + nThisLcs++; + }else{ + nThisLcs = 1; + } + if( nThisLcs>nLcs ) nLcs = nThisLcs; + } + } + if( fts3LcsIteratorAdvance(pAdv) ) nLive--; + } + + pInfo->aMatchinfo[iCol] = nLcs; + } + + sqlite3_free(aIter); + return SQLITE_OK; +} + +/* +** Populate the buffer pInfo->aMatchinfo[] with an array of integers to +** be returned by the matchinfo() function. Argument zArg contains the +** format string passed as the second argument to matchinfo (or the +** default value "pcx" if no second argument was specified). The format +** string has already been validated and the pInfo->aMatchinfo[] array +** is guaranteed to be large enough for the output. +** +** If bGlobal is true, then populate all fields of the matchinfo() output. +** If it is false, then assume that those fields that do not change between +** rows (i.e. FTS3_MATCHINFO_NPHRASE, NCOL, NDOC, AVGLENGTH and part of HITS) +** have already been populated. +** +** Return SQLITE_OK if successful, or an SQLite error code if an error +** occurs. If a value other than SQLITE_OK is returned, the state the +** pInfo->aMatchinfo[] buffer is left in is undefined. +*/ +static int fts3MatchinfoValues( + Fts3Cursor *pCsr, /* FTS3 cursor object */ + int bGlobal, /* True to grab the global stats */ + MatchInfo *pInfo, /* Matchinfo context object */ + const char *zArg /* Matchinfo format string */ +){ + int rc = SQLITE_OK; + int i; + Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab; + sqlite3_stmt *pSelect = 0; + + for(i=0; rc==SQLITE_OK && zArg[i]; i++){ + pInfo->flag = zArg[i]; + switch( zArg[i] ){ + case FTS3_MATCHINFO_NPHRASE: + if( bGlobal ) pInfo->aMatchinfo[0] = pInfo->nPhrase; + break; + + case FTS3_MATCHINFO_NCOL: + if( bGlobal ) pInfo->aMatchinfo[0] = pInfo->nCol; + break; + + case FTS3_MATCHINFO_NDOC: + if( bGlobal ){ + sqlite3_int64 nDoc = 0; + rc = fts3MatchinfoSelectDoctotal(pTab, &pSelect, &nDoc, 0); + pInfo->aMatchinfo[0] = (u32)nDoc; + } + break; + + case FTS3_MATCHINFO_AVGLENGTH: + if( bGlobal ){ + sqlite3_int64 nDoc; /* Number of rows in table */ + const char *a; /* Aggregate column length array */ + + rc = fts3MatchinfoSelectDoctotal(pTab, &pSelect, &nDoc, &a); + if( rc==SQLITE_OK ){ + int iCol; + for(iCol=0; iColnCol; iCol++){ + u32 iVal; + sqlite3_int64 nToken; + a += sqlite3Fts3GetVarint(a, &nToken); + iVal = (u32)(((u32)(nToken&0xffffffff)+nDoc/2)/nDoc); + pInfo->aMatchinfo[iCol] = iVal; + } + } + } + break; + + case FTS3_MATCHINFO_LENGTH: { + sqlite3_stmt *pSelectDocsize = 0; + rc = sqlite3Fts3SelectDocsize(pTab, pCsr->iPrevId, &pSelectDocsize); + if( rc==SQLITE_OK ){ + int iCol; + const char *a = sqlite3_column_blob(pSelectDocsize, 0); + for(iCol=0; iColnCol; iCol++){ + sqlite3_int64 nToken; + a += sqlite3Fts3GetVarint(a, &nToken); + pInfo->aMatchinfo[iCol] = (u32)nToken; + } + } + sqlite3_reset(pSelectDocsize); + break; + } + + case FTS3_MATCHINFO_LCS: + rc = fts3ExprLoadDoclists(pCsr, 0, 0); + if( rc==SQLITE_OK ){ + rc = fts3MatchinfoLcs(pCsr, pInfo); + } + break; + + case FTS3_MATCHINFO_LHITS_BM: + case FTS3_MATCHINFO_LHITS: { + int nZero = fts3MatchinfoSize(pInfo, zArg[i]) * sizeof(u32); + memset(pInfo->aMatchinfo, 0, nZero); + fts3ExprLHitGather(pCsr->pExpr, pInfo); + break; + } + + default: { + Fts3Expr *pExpr; + assert( zArg[i]==FTS3_MATCHINFO_HITS ); + pExpr = pCsr->pExpr; + rc = fts3ExprLoadDoclists(pCsr, 0, 0); + if( rc!=SQLITE_OK ) break; + if( bGlobal ){ + if( pCsr->pDeferred ){ + rc = fts3MatchinfoSelectDoctotal(pTab, &pSelect, &pInfo->nDoc, 0); + if( rc!=SQLITE_OK ) break; + } + rc = fts3ExprIterate(pExpr, fts3ExprGlobalHitsCb,(void*)pInfo); + sqlite3Fts3EvalTestDeferred(pCsr, &rc); + if( rc!=SQLITE_OK ) break; + } + (void)fts3ExprIterate(pExpr, fts3ExprLocalHitsCb,(void*)pInfo); + break; + } + } + + pInfo->aMatchinfo += fts3MatchinfoSize(pInfo, zArg[i]); + } + + sqlite3_reset(pSelect); + return rc; +} + + +/* +** Populate pCsr->aMatchinfo[] with data for the current row. The +** 'matchinfo' data is an array of 32-bit unsigned integers (C type u32). +*/ +static void fts3GetMatchinfo( + sqlite3_context *pCtx, /* Return results here */ + Fts3Cursor *pCsr, /* FTS3 Cursor object */ + const char *zArg /* Second argument to matchinfo() function */ +){ + MatchInfo sInfo; + Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab; + int rc = SQLITE_OK; + int bGlobal = 0; /* Collect 'global' stats as well as local */ + + u32 *aOut = 0; + void (*xDestroyOut)(void*) = 0; + + memset(&sInfo, 0, sizeof(MatchInfo)); + sInfo.pCursor = pCsr; + sInfo.nCol = pTab->nColumn; + + /* If there is cached matchinfo() data, but the format string for the + ** cache does not match the format string for this request, discard + ** the cached data. */ + if( pCsr->pMIBuffer && strcmp(pCsr->pMIBuffer->zMatchinfo, zArg) ){ + sqlite3Fts3MIBufferFree(pCsr->pMIBuffer); + pCsr->pMIBuffer = 0; + } + + /* If Fts3Cursor.pMIBuffer is NULL, then this is the first time the + ** matchinfo function has been called for this query. In this case + ** allocate the array used to accumulate the matchinfo data and + ** initialize those elements that are constant for every row. + */ + if( pCsr->pMIBuffer==0 ){ + int nMatchinfo = 0; /* Number of u32 elements in match-info */ + int i; /* Used to iterate through zArg */ + + /* Determine the number of phrases in the query */ + pCsr->nPhrase = fts3ExprPhraseCount(pCsr->pExpr); + sInfo.nPhrase = pCsr->nPhrase; + + /* Determine the number of integers in the buffer returned by this call. */ + for(i=0; zArg[i]; i++){ + char *zErr = 0; + if( fts3MatchinfoCheck(pTab, zArg[i], &zErr) ){ + sqlite3_result_error(pCtx, zErr, -1); + sqlite3_free(zErr); + return; + } + nMatchinfo += fts3MatchinfoSize(&sInfo, zArg[i]); + } + + /* Allocate space for Fts3Cursor.aMatchinfo[] and Fts3Cursor.zMatchinfo. */ + pCsr->pMIBuffer = fts3MIBufferNew(nMatchinfo, zArg); + if( !pCsr->pMIBuffer ) rc = SQLITE_NOMEM; + + pCsr->isMatchinfoNeeded = 1; + bGlobal = 1; + } + + if( rc==SQLITE_OK ){ + xDestroyOut = fts3MIBufferAlloc(pCsr->pMIBuffer, &aOut); + if( xDestroyOut==0 ){ + rc = SQLITE_NOMEM; + } + } + + if( rc==SQLITE_OK ){ + sInfo.aMatchinfo = aOut; + sInfo.nPhrase = pCsr->nPhrase; + rc = fts3MatchinfoValues(pCsr, bGlobal, &sInfo, zArg); + if( bGlobal ){ + fts3MIBufferSetGlobal(pCsr->pMIBuffer); + } + } + + if( rc!=SQLITE_OK ){ + sqlite3_result_error_code(pCtx, rc); + if( xDestroyOut ) xDestroyOut(aOut); + }else{ + int n = pCsr->pMIBuffer->nElem * sizeof(u32); + sqlite3_result_blob(pCtx, aOut, n, xDestroyOut); + } +} + +/* +** Implementation of snippet() function. +*/ +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 - "..." */ + int iCol, /* Extract snippet from this column */ + int nToken /* Approximate number of tokens in snippet */ +){ + Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab; + int rc = SQLITE_OK; + int i; + StrBuffer res = {0, 0, 0}; + + /* The returned text includes up to four fragments of text extracted from + ** the data in the current row. The first iteration of the for(...) loop + ** below attempts to locate a single fragment of text nToken tokens in + ** size that contains at least one instance of all phrases in the query + ** expression that appear in the current row. If such a fragment of text + ** cannot be found, the second iteration of the loop attempts to locate + ** a pair of fragments, and so on. + */ + int nSnippet = 0; /* Number of fragments in this snippet */ + SnippetFragment aSnippet[4]; /* Maximum of 4 fragments per snippet */ + int nFToken = -1; /* Number of tokens in each fragment */ + + if( !pCsr->pExpr ){ + sqlite3_result_text(pCtx, "", 0, SQLITE_STATIC); + return; + } + + for(nSnippet=1; 1; nSnippet++){ + + int iSnip; /* Loop counter 0..nSnippet-1 */ + u64 mCovered = 0; /* Bitmask of phrases covered by snippet */ + u64 mSeen = 0; /* Bitmask of phrases seen by BestSnippet() */ + + if( nToken>=0 ){ + nFToken = (nToken+nSnippet-1) / nSnippet; + }else{ + nFToken = -1 * nToken; + } + + for(iSnip=0; iSnipnColumn; iRead++){ + SnippetFragment sF = {0, 0, 0, 0}; + int iS = 0; + if( iCol>=0 && iRead!=iCol ) continue; + + /* Find the best snippet of nFToken tokens in column iRead. */ + rc = fts3BestSnippet(nFToken, pCsr, iRead, mCovered, &mSeen, &sF, &iS); + if( rc!=SQLITE_OK ){ + goto snippet_out; + } + if( iS>iBestScore ){ + *pFragment = sF; + iBestScore = iS; + } + } + + mCovered |= pFragment->covered; + } + + /* If all query phrases seen by fts3BestSnippet() are present in at least + ** one of the nSnippet snippet fragments, break out of the loop. + */ + assert( (mCovered&mSeen)==mCovered ); + if( mSeen==mCovered || nSnippet==SizeofArray(aSnippet) ) break; + } + + assert( nFToken>0 ); + + for(i=0; ipCsr, pExpr, p->iCol, &pList); + nTerm = pExpr->pPhrase->nToken; + if( pList ){ + fts3GetDeltaPosition(&pList, &iPos); + assert( iPos>=0 ); + } + + for(iTerm=0; iTermaTerm[p->iTerm++]; + pT->iOff = nTerm-iTerm-1; + pT->pList = pList; + pT->iPos = iPos; + } + + return rc; +} + +/* +** Implementation of offsets() function. +*/ +SQLITE_PRIVATE void sqlite3Fts3Offsets( + sqlite3_context *pCtx, /* SQLite function call context */ + Fts3Cursor *pCsr /* Cursor object */ +){ + Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab; + sqlite3_tokenizer_module const *pMod = pTab->pTokenizer->pModule; + int rc; /* Return Code */ + int nToken; /* Number of tokens in query */ + int iCol; /* Column currently being processed */ + StrBuffer res = {0, 0, 0}; /* Result string */ + TermOffsetCtx sCtx; /* Context for fts3ExprTermOffsetInit() */ + + if( !pCsr->pExpr ){ + sqlite3_result_text(pCtx, "", 0, SQLITE_STATIC); + return; + } + + memset(&sCtx, 0, sizeof(sCtx)); + assert( pCsr->isRequireSeek==0 ); + + /* Count the number of terms in the query */ + rc = fts3ExprLoadDoclists(pCsr, 0, &nToken); + if( rc!=SQLITE_OK ) goto offsets_out; + + /* Allocate the array of TermOffset iterators. */ + sCtx.aTerm = (TermOffset *)sqlite3_malloc(sizeof(TermOffset)*nToken); + if( 0==sCtx.aTerm ){ + rc = SQLITE_NOMEM; + goto offsets_out; + } + sCtx.iDocid = pCsr->iPrevId; + sCtx.pCsr = pCsr; + + /* Loop through the table columns, appending offset information to + ** string-buffer res for each column. + */ + for(iCol=0; iColnColumn; iCol++){ + sqlite3_tokenizer_cursor *pC; /* Tokenizer cursor */ + const char *ZDUMMY; /* Dummy argument used with xNext() */ + int NDUMMY = 0; /* Dummy argument used with xNext() */ + int iStart = 0; + int iEnd = 0; + int iCurrent = 0; + const char *zDoc; + int nDoc; + + /* Initialize the contents of sCtx.aTerm[] for column iCol. There is + ** no way that this operation can fail, so the return code from + ** fts3ExprIterate() can be discarded. + */ + sCtx.iCol = iCol; + sCtx.iTerm = 0; + (void)fts3ExprIterate(pCsr->pExpr, fts3ExprTermOffsetInit, (void*)&sCtx); + + /* Retreive the text stored in column iCol. If an SQL NULL is stored + ** in column iCol, jump immediately to the next iteration of the loop. + ** If an OOM occurs while retrieving the data (this can happen if SQLite + ** needs to transform the data from utf-16 to utf-8), return SQLITE_NOMEM + ** to the caller. + */ + zDoc = (const char *)sqlite3_column_text(pCsr->pStmt, iCol+1); + nDoc = sqlite3_column_bytes(pCsr->pStmt, iCol+1); + if( zDoc==0 ){ + if( sqlite3_column_type(pCsr->pStmt, iCol+1)==SQLITE_NULL ){ + continue; + } + rc = SQLITE_NOMEM; + goto offsets_out; + } + + /* Initialize a tokenizer iterator to iterate through column iCol. */ + rc = sqlite3Fts3OpenTokenizer(pTab->pTokenizer, pCsr->iLangid, + zDoc, nDoc, &pC + ); + if( rc!=SQLITE_OK ) goto offsets_out; + + rc = pMod->xNext(pC, &ZDUMMY, &NDUMMY, &iStart, &iEnd, &iCurrent); + while( rc==SQLITE_OK ){ + int i; /* Used to loop through terms */ + int iMinPos = 0x7FFFFFFF; /* Position of next token */ + TermOffset *pTerm = 0; /* TermOffset associated with next token */ + + for(i=0; ipList && (pT->iPos-pT->iOff)iPos-pT->iOff; + pTerm = pT; + } + } + + if( !pTerm ){ + /* All offsets for this column have been gathered. */ + rc = SQLITE_DONE; + }else{ + assert( iCurrent<=iMinPos ); + if( 0==(0xFE&*pTerm->pList) ){ + pTerm->pList = 0; + }else{ + fts3GetDeltaPosition(&pTerm->pList, &pTerm->iPos); + } + while( rc==SQLITE_OK && iCurrentxNext(pC, &ZDUMMY, &NDUMMY, &iStart, &iEnd, &iCurrent); + } + if( rc==SQLITE_OK ){ + char aBuffer[64]; + sqlite3_snprintf(sizeof(aBuffer), aBuffer, + "%d %d %d %d ", iCol, pTerm-sCtx.aTerm, iStart, iEnd-iStart + ); + rc = fts3StringAppend(&res, aBuffer, -1); + }else if( rc==SQLITE_DONE && pTab->zContentTbl==0 ){ + rc = FTS_CORRUPT_VTAB; + } + } + } + if( rc==SQLITE_DONE ){ + rc = SQLITE_OK; + } + + pMod->xClose(pC); + if( rc!=SQLITE_OK ) goto offsets_out; + } + + offsets_out: + sqlite3_free(sCtx.aTerm); + assert( rc!=SQLITE_DONE ); + sqlite3Fts3SegmentsClose(pTab); + if( rc!=SQLITE_OK ){ + sqlite3_result_error_code(pCtx, rc); + sqlite3_free(res.z); + }else{ + sqlite3_result_text(pCtx, res.z, res.n-1, sqlite3_free); + } + return; +} + +/* +** Implementation of matchinfo() function. +*/ +SQLITE_PRIVATE void sqlite3Fts3Matchinfo( + sqlite3_context *pContext, /* Function call context */ + Fts3Cursor *pCsr, /* FTS3 table cursor */ + const char *zArg /* Second arg to matchinfo() function */ +){ + Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab; + const char *zFormat; + + if( zArg ){ + zFormat = zArg; + }else{ + zFormat = FTS3_MATCHINFO_DEFAULT; + } + + if( !pCsr->pExpr ){ + sqlite3_result_blob(pContext, "", 0, SQLITE_STATIC); + return; + }else{ + /* Retrieve matchinfo() data. */ + fts3GetMatchinfo(pContext, pCsr, zFormat); + sqlite3Fts3SegmentsClose(pTab); + } +} + +#endif + +/************** End of fts3_snippet.c ****************************************/ +/************** Begin file fts3_unicode.c ************************************/ +/* +** 2012 May 24 +** +** 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 "unicode" full-text-search tokenizer. +*/ + +#ifndef SQLITE_DISABLE_FTS3_UNICODE + +/* #include "fts3Int.h" */ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) + +/* #include */ +/* #include */ +/* #include */ +/* #include */ + +/* #include "fts3_tokenizer.h" */ + +/* +** The following two macros - READ_UTF8 and WRITE_UTF8 - have been copied +** from the sqlite3 source file utf.c. If this file is compiled as part +** of the amalgamation, they are not required. +*/ +#ifndef SQLITE_AMALGAMATION + +static const unsigned char sqlite3Utf8Trans1[] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x00, 0x01, 0x02, 0x03, 0x00, 0x01, 0x00, 0x00, +}; + +#define READ_UTF8(zIn, zTerm, c) \ + c = *(zIn++); \ + if( c>=0xc0 ){ \ + c = sqlite3Utf8Trans1[c-0xc0]; \ + while( zIn!=zTerm && (*zIn & 0xc0)==0x80 ){ \ + c = (c<<6) + (0x3f & *(zIn++)); \ + } \ + if( c<0x80 \ + || (c&0xFFFFF800)==0xD800 \ + || (c&0xFFFFFFFE)==0xFFFE ){ c = 0xFFFD; } \ + } + +#define WRITE_UTF8(zOut, c) { \ + if( c<0x00080 ){ \ + *zOut++ = (u8)(c&0xFF); \ + } \ + else if( c<0x00800 ){ \ + *zOut++ = 0xC0 + (u8)((c>>6)&0x1F); \ + *zOut++ = 0x80 + (u8)(c & 0x3F); \ + } \ + else if( c<0x10000 ){ \ + *zOut++ = 0xE0 + (u8)((c>>12)&0x0F); \ + *zOut++ = 0x80 + (u8)((c>>6) & 0x3F); \ + *zOut++ = 0x80 + (u8)(c & 0x3F); \ + }else{ \ + *zOut++ = 0xF0 + (u8)((c>>18) & 0x07); \ + *zOut++ = 0x80 + (u8)((c>>12) & 0x3F); \ + *zOut++ = 0x80 + (u8)((c>>6) & 0x3F); \ + *zOut++ = 0x80 + (u8)(c & 0x3F); \ + } \ +} + +#endif /* ifndef SQLITE_AMALGAMATION */ + +typedef struct unicode_tokenizer unicode_tokenizer; +typedef struct unicode_cursor unicode_cursor; + +struct unicode_tokenizer { + sqlite3_tokenizer base; + int bRemoveDiacritic; + int nException; + int *aiException; +}; + +struct unicode_cursor { + sqlite3_tokenizer_cursor base; + const unsigned char *aInput; /* Input text being tokenized */ + int nInput; /* Size of aInput[] in bytes */ + int iOff; /* Current offset within aInput[] */ + int iToken; /* Index of next token to be returned */ + char *zToken; /* storage for current token */ + int nAlloc; /* space allocated at zToken */ +}; + + +/* +** Destroy a tokenizer allocated by unicodeCreate(). +*/ +static int unicodeDestroy(sqlite3_tokenizer *pTokenizer){ + if( pTokenizer ){ + unicode_tokenizer *p = (unicode_tokenizer *)pTokenizer; + sqlite3_free(p->aiException); + sqlite3_free(p); + } + return SQLITE_OK; +} + +/* +** As part of a tokenchars= or separators= option, the CREATE VIRTUAL TABLE +** statement has specified that the tokenizer for this table shall consider +** all characters in string zIn/nIn to be separators (if bAlnum==0) or +** token characters (if bAlnum==1). +** +** For each codepoint in the zIn/nIn string, this function checks if the +** sqlite3FtsUnicodeIsalnum() function already returns the desired result. +** If so, no action is taken. Otherwise, the codepoint is added to the +** unicode_tokenizer.aiException[] array. For the purposes of tokenization, +** the return value of sqlite3FtsUnicodeIsalnum() is inverted for all +** codepoints in the aiException[] array. +** +** If a standalone diacritic mark (one that sqlite3FtsUnicodeIsdiacritic() +** identifies as a diacritic) occurs in the zIn/nIn string it is ignored. +** It is not possible to change the behavior of the tokenizer with respect +** to these codepoints. +*/ +static int unicodeAddExceptions( + unicode_tokenizer *p, /* Tokenizer to add exceptions to */ + int bAlnum, /* Replace Isalnum() return value with this */ + const char *zIn, /* Array of characters to make exceptions */ + int nIn /* Length of z in bytes */ +){ + const unsigned char *z = (const unsigned char *)zIn; + const unsigned char *zTerm = &z[nIn]; + int iCode; + int nEntry = 0; + + assert( bAlnum==0 || bAlnum==1 ); + + while( zaiException, (p->nException+nEntry)*sizeof(int)); + if( aNew==0 ) return SQLITE_NOMEM; + nNew = p->nException; + + z = (const unsigned char *)zIn; + while( zi; j--) aNew[j] = aNew[j-1]; + aNew[i] = iCode; + nNew++; + } + } + p->aiException = aNew; + p->nException = nNew; + } + + return SQLITE_OK; +} + +/* +** Return true if the p->aiException[] array contains the value iCode. +*/ +static int unicodeIsException(unicode_tokenizer *p, int iCode){ + if( p->nException>0 ){ + int *a = p->aiException; + int iLo = 0; + int iHi = p->nException-1; + + while( iHi>=iLo ){ + int iTest = (iHi + iLo) / 2; + if( iCode==a[iTest] ){ + return 1; + }else if( iCode>a[iTest] ){ + iLo = iTest+1; + }else{ + iHi = iTest-1; + } + } + } + + return 0; +} + +/* +** Return true if, for the purposes of tokenization, codepoint iCode is +** considered a token character (not a separator). +*/ +static int unicodeIsAlnum(unicode_tokenizer *p, int iCode){ + assert( (sqlite3FtsUnicodeIsalnum(iCode) & 0xFFFFFFFE)==0 ); + return sqlite3FtsUnicodeIsalnum(iCode) ^ unicodeIsException(p, iCode); +} + +/* +** Create a new tokenizer instance. +*/ +static int unicodeCreate( + int nArg, /* Size of array argv[] */ + const char * const *azArg, /* Tokenizer creation arguments */ + sqlite3_tokenizer **pp /* OUT: New tokenizer handle */ +){ + unicode_tokenizer *pNew; /* New tokenizer object */ + int i; + int rc = SQLITE_OK; + + pNew = (unicode_tokenizer *) sqlite3_malloc(sizeof(unicode_tokenizer)); + if( pNew==NULL ) return SQLITE_NOMEM; + memset(pNew, 0, sizeof(unicode_tokenizer)); + pNew->bRemoveDiacritic = 1; + + for(i=0; rc==SQLITE_OK && ibRemoveDiacritic = 1; + } + else if( n==19 && memcmp("remove_diacritics=0", z, 19)==0 ){ + pNew->bRemoveDiacritic = 0; + } + else if( n>=11 && memcmp("tokenchars=", z, 11)==0 ){ + rc = unicodeAddExceptions(pNew, 1, &z[11], n-11); + } + else if( n>=11 && memcmp("separators=", z, 11)==0 ){ + rc = unicodeAddExceptions(pNew, 0, &z[11], n-11); + } + else{ + /* Unrecognized argument */ + rc = SQLITE_ERROR; + } + } + + if( rc!=SQLITE_OK ){ + unicodeDestroy((sqlite3_tokenizer *)pNew); + pNew = 0; + } + *pp = (sqlite3_tokenizer *)pNew; + return rc; +} + +/* +** 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 unicodeOpen( + sqlite3_tokenizer *p, /* The tokenizer */ + const char *aInput, /* Input string */ + int nInput, /* Size of string aInput in bytes */ + sqlite3_tokenizer_cursor **pp /* OUT: New cursor object */ +){ + unicode_cursor *pCsr; + + pCsr = (unicode_cursor *)sqlite3_malloc(sizeof(unicode_cursor)); + if( pCsr==0 ){ + return SQLITE_NOMEM; + } + memset(pCsr, 0, sizeof(unicode_cursor)); + + pCsr->aInput = (const unsigned char *)aInput; + if( aInput==0 ){ + pCsr->nInput = 0; + }else if( nInput<0 ){ + pCsr->nInput = (int)strlen(aInput); + }else{ + pCsr->nInput = nInput; + } + + *pp = &pCsr->base; + UNUSED_PARAMETER(p); + return SQLITE_OK; +} + +/* +** Close a tokenization cursor previously opened by a call to +** simpleOpen() above. +*/ +static int unicodeClose(sqlite3_tokenizer_cursor *pCursor){ + unicode_cursor *pCsr = (unicode_cursor *) pCursor; + sqlite3_free(pCsr->zToken); + sqlite3_free(pCsr); + return SQLITE_OK; +} + +/* +** Extract the next token from a tokenization cursor. The cursor must +** have been opened by a prior call to simpleOpen(). +*/ +static int unicodeNext( + sqlite3_tokenizer_cursor *pC, /* Cursor returned by simpleOpen */ + const char **paToken, /* OUT: Token text */ + int *pnToken, /* OUT: Number of bytes at *paToken */ + int *piStart, /* OUT: Starting offset of token */ + int *piEnd, /* OUT: Ending offset of token */ + int *piPos /* OUT: Position integer of token */ +){ + unicode_cursor *pCsr = (unicode_cursor *)pC; + unicode_tokenizer *p = ((unicode_tokenizer *)pCsr->base.pTokenizer); + int iCode = 0; + char *zOut; + const unsigned char *z = &pCsr->aInput[pCsr->iOff]; + const unsigned char *zStart = z; + const unsigned char *zEnd; + const unsigned char *zTerm = &pCsr->aInput[pCsr->nInput]; + + /* Scan past any delimiter characters before the start of the next token. + ** Return SQLITE_DONE early if this takes us all the way to the end of + ** the input. */ + while( z=zTerm ) return SQLITE_DONE; + + zOut = pCsr->zToken; + do { + int iOut; + + /* Grow the output buffer if required. */ + if( (zOut-pCsr->zToken)>=(pCsr->nAlloc-4) ){ + char *zNew = sqlite3_realloc(pCsr->zToken, pCsr->nAlloc+64); + if( !zNew ) return SQLITE_NOMEM; + zOut = &zNew[zOut - pCsr->zToken]; + pCsr->zToken = zNew; + pCsr->nAlloc += 64; + } + + /* Write the folded case of the last character read to the output */ + zEnd = z; + iOut = sqlite3FtsUnicodeFold(iCode, p->bRemoveDiacritic); + if( iOut ){ + WRITE_UTF8(zOut, iOut); + } + + /* If the cursor is not at EOF, read the next character */ + if( z>=zTerm ) break; + READ_UTF8(z, zTerm, iCode); + }while( unicodeIsAlnum(p, iCode) + || sqlite3FtsUnicodeIsdiacritic(iCode) + ); + + /* Set the output variables and return. */ + pCsr->iOff = (int)(z - pCsr->aInput); + *paToken = pCsr->zToken; + *pnToken = (int)(zOut - pCsr->zToken); + *piStart = (int)(zStart - pCsr->aInput); + *piEnd = (int)(zEnd - pCsr->aInput); + *piPos = pCsr->iToken++; + return SQLITE_OK; +} + +/* +** Set *ppModule to a pointer to the sqlite3_tokenizer_module +** structure for the unicode tokenizer. +*/ +SQLITE_PRIVATE void sqlite3Fts3UnicodeTokenizer(sqlite3_tokenizer_module const **ppModule){ + static const sqlite3_tokenizer_module module = { + 0, + unicodeCreate, + unicodeDestroy, + unicodeOpen, + unicodeClose, + unicodeNext, + 0, + }; + *ppModule = &module; +} + +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */ +#endif /* ifndef SQLITE_DISABLE_FTS3_UNICODE */ + +/************** End of fts3_unicode.c ****************************************/ +/************** Begin file fts3_unicode2.c ***********************************/ +/* +** 2012 May 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. +** +****************************************************************************** +*/ + +/* +** DO NOT EDIT THIS MACHINE GENERATED FILE. +*/ + +#ifndef SQLITE_DISABLE_FTS3_UNICODE +#if defined(SQLITE_ENABLE_FTS3) || defined(SQLITE_ENABLE_FTS4) + +/* #include */ + +/* +** Return true if the argument corresponds to a unicode codepoint +** classified as either a letter or a number. Otherwise false. +** +** The results are undefined if the value passed to this function +** is less than zero. +*/ +SQLITE_PRIVATE int sqlite3FtsUnicodeIsalnum(int c){ + /* Each unsigned integer in the following array corresponds to a contiguous + ** range of unicode codepoints that are not either letters or numbers (i.e. + ** codepoints for which this function should return 0). + ** + ** The most significant 22 bits in each 32-bit value contain the first + ** codepoint in the range. The least significant 10 bits are used to store + ** the size of the range (always at least 1). In other words, the value + ** ((C<<22) + N) represents a range of N codepoints starting with codepoint + ** C. It is not possible to represent a range larger than 1023 codepoints + ** using this format. + */ + static const unsigned int aEntry[] = { + 0x00000030, 0x0000E807, 0x00016C06, 0x0001EC2F, 0x0002AC07, + 0x0002D001, 0x0002D803, 0x0002EC01, 0x0002FC01, 0x00035C01, + 0x0003DC01, 0x000B0804, 0x000B480E, 0x000B9407, 0x000BB401, + 0x000BBC81, 0x000DD401, 0x000DF801, 0x000E1002, 0x000E1C01, + 0x000FD801, 0x00120808, 0x00156806, 0x00162402, 0x00163C01, + 0x00164437, 0x0017CC02, 0x00180005, 0x00181816, 0x00187802, + 0x00192C15, 0x0019A804, 0x0019C001, 0x001B5001, 0x001B580F, + 0x001B9C07, 0x001BF402, 0x001C000E, 0x001C3C01, 0x001C4401, + 0x001CC01B, 0x001E980B, 0x001FAC09, 0x001FD804, 0x00205804, + 0x00206C09, 0x00209403, 0x0020A405, 0x0020C00F, 0x00216403, + 0x00217801, 0x0023901B, 0x00240004, 0x0024E803, 0x0024F812, + 0x00254407, 0x00258804, 0x0025C001, 0x00260403, 0x0026F001, + 0x0026F807, 0x00271C02, 0x00272C03, 0x00275C01, 0x00278802, + 0x0027C802, 0x0027E802, 0x00280403, 0x0028F001, 0x0028F805, + 0x00291C02, 0x00292C03, 0x00294401, 0x0029C002, 0x0029D401, + 0x002A0403, 0x002AF001, 0x002AF808, 0x002B1C03, 0x002B2C03, + 0x002B8802, 0x002BC002, 0x002C0403, 0x002CF001, 0x002CF807, + 0x002D1C02, 0x002D2C03, 0x002D5802, 0x002D8802, 0x002DC001, + 0x002E0801, 0x002EF805, 0x002F1803, 0x002F2804, 0x002F5C01, + 0x002FCC08, 0x00300403, 0x0030F807, 0x00311803, 0x00312804, + 0x00315402, 0x00318802, 0x0031FC01, 0x00320802, 0x0032F001, + 0x0032F807, 0x00331803, 0x00332804, 0x00335402, 0x00338802, + 0x00340802, 0x0034F807, 0x00351803, 0x00352804, 0x00355C01, + 0x00358802, 0x0035E401, 0x00360802, 0x00372801, 0x00373C06, + 0x00375801, 0x00376008, 0x0037C803, 0x0038C401, 0x0038D007, + 0x0038FC01, 0x00391C09, 0x00396802, 0x003AC401, 0x003AD006, + 0x003AEC02, 0x003B2006, 0x003C041F, 0x003CD00C, 0x003DC417, + 0x003E340B, 0x003E6424, 0x003EF80F, 0x003F380D, 0x0040AC14, + 0x00412806, 0x00415804, 0x00417803, 0x00418803, 0x00419C07, + 0x0041C404, 0x0042080C, 0x00423C01, 0x00426806, 0x0043EC01, + 0x004D740C, 0x004E400A, 0x00500001, 0x0059B402, 0x005A0001, + 0x005A6C02, 0x005BAC03, 0x005C4803, 0x005CC805, 0x005D4802, + 0x005DC802, 0x005ED023, 0x005F6004, 0x005F7401, 0x0060000F, + 0x0062A401, 0x0064800C, 0x0064C00C, 0x00650001, 0x00651002, + 0x0066C011, 0x00672002, 0x00677822, 0x00685C05, 0x00687802, + 0x0069540A, 0x0069801D, 0x0069FC01, 0x006A8007, 0x006AA006, + 0x006C0005, 0x006CD011, 0x006D6823, 0x006E0003, 0x006E840D, + 0x006F980E, 0x006FF004, 0x00709014, 0x0070EC05, 0x0071F802, + 0x00730008, 0x00734019, 0x0073B401, 0x0073C803, 0x00770027, + 0x0077F004, 0x007EF401, 0x007EFC03, 0x007F3403, 0x007F7403, + 0x007FB403, 0x007FF402, 0x00800065, 0x0081A806, 0x0081E805, + 0x00822805, 0x0082801A, 0x00834021, 0x00840002, 0x00840C04, + 0x00842002, 0x00845001, 0x00845803, 0x00847806, 0x00849401, + 0x00849C01, 0x0084A401, 0x0084B801, 0x0084E802, 0x00850005, + 0x00852804, 0x00853C01, 0x00864264, 0x00900027, 0x0091000B, + 0x0092704E, 0x00940200, 0x009C0475, 0x009E53B9, 0x00AD400A, + 0x00B39406, 0x00B3BC03, 0x00B3E404, 0x00B3F802, 0x00B5C001, + 0x00B5FC01, 0x00B7804F, 0x00B8C00C, 0x00BA001A, 0x00BA6C59, + 0x00BC00D6, 0x00BFC00C, 0x00C00005, 0x00C02019, 0x00C0A807, + 0x00C0D802, 0x00C0F403, 0x00C26404, 0x00C28001, 0x00C3EC01, + 0x00C64002, 0x00C6580A, 0x00C70024, 0x00C8001F, 0x00C8A81E, + 0x00C94001, 0x00C98020, 0x00CA2827, 0x00CB003F, 0x00CC0100, + 0x01370040, 0x02924037, 0x0293F802, 0x02983403, 0x0299BC10, + 0x029A7C01, 0x029BC008, 0x029C0017, 0x029C8002, 0x029E2402, + 0x02A00801, 0x02A01801, 0x02A02C01, 0x02A08C09, 0x02A0D804, + 0x02A1D004, 0x02A20002, 0x02A2D011, 0x02A33802, 0x02A38012, + 0x02A3E003, 0x02A4980A, 0x02A51C0D, 0x02A57C01, 0x02A60004, + 0x02A6CC1B, 0x02A77802, 0x02A8A40E, 0x02A90C01, 0x02A93002, + 0x02A97004, 0x02A9DC03, 0x02A9EC01, 0x02AAC001, 0x02AAC803, + 0x02AADC02, 0x02AAF802, 0x02AB0401, 0x02AB7802, 0x02ABAC07, + 0x02ABD402, 0x02AF8C0B, 0x03600001, 0x036DFC02, 0x036FFC02, + 0x037FFC01, 0x03EC7801, 0x03ECA401, 0x03EEC810, 0x03F4F802, + 0x03F7F002, 0x03F8001A, 0x03F88007, 0x03F8C023, 0x03F95013, + 0x03F9A004, 0x03FBFC01, 0x03FC040F, 0x03FC6807, 0x03FCEC06, + 0x03FD6C0B, 0x03FF8007, 0x03FFA007, 0x03FFE405, 0x04040003, + 0x0404DC09, 0x0405E411, 0x0406400C, 0x0407402E, 0x040E7C01, + 0x040F4001, 0x04215C01, 0x04247C01, 0x0424FC01, 0x04280403, + 0x04281402, 0x04283004, 0x0428E003, 0x0428FC01, 0x04294009, + 0x0429FC01, 0x042CE407, 0x04400003, 0x0440E016, 0x04420003, + 0x0442C012, 0x04440003, 0x04449C0E, 0x04450004, 0x04460003, + 0x0446CC0E, 0x04471404, 0x045AAC0D, 0x0491C004, 0x05BD442E, + 0x05BE3C04, 0x074000F6, 0x07440027, 0x0744A4B5, 0x07480046, + 0x074C0057, 0x075B0401, 0x075B6C01, 0x075BEC01, 0x075C5401, + 0x075CD401, 0x075D3C01, 0x075DBC01, 0x075E2401, 0x075EA401, + 0x075F0C01, 0x07BBC002, 0x07C0002C, 0x07C0C064, 0x07C2800F, + 0x07C2C40E, 0x07C3040F, 0x07C3440F, 0x07C4401F, 0x07C4C03C, + 0x07C5C02B, 0x07C7981D, 0x07C8402B, 0x07C90009, 0x07C94002, + 0x07CC0021, 0x07CCC006, 0x07CCDC46, 0x07CE0014, 0x07CE8025, + 0x07CF1805, 0x07CF8011, 0x07D0003F, 0x07D10001, 0x07D108B6, + 0x07D3E404, 0x07D4003E, 0x07D50004, 0x07D54018, 0x07D7EC46, + 0x07D9140B, 0x07DA0046, 0x07DC0074, 0x38000401, 0x38008060, + 0x380400F0, + }; + static const unsigned int aAscii[4] = { + 0xFFFFFFFF, 0xFC00FFFF, 0xF8000001, 0xF8000001, + }; + + if( c<128 ){ + return ( (aAscii[c >> 5] & (1 << (c & 0x001F)))==0 ); + }else if( c<(1<<22) ){ + unsigned int key = (((unsigned int)c)<<10) | 0x000003FF; + int iRes = 0; + int iHi = sizeof(aEntry)/sizeof(aEntry[0]) - 1; + int iLo = 0; + while( iHi>=iLo ){ + int iTest = (iHi + iLo) / 2; + if( key >= aEntry[iTest] ){ + iRes = iTest; + iLo = iTest+1; + }else{ + iHi = iTest-1; + } + } + assert( aEntry[0]=aEntry[iRes] ); + return (((unsigned int)c) >= ((aEntry[iRes]>>10) + (aEntry[iRes]&0x3FF))); + } + return 1; +} + + +/* +** If the argument is a codepoint corresponding to a lowercase letter +** in the ASCII range with a diacritic added, return the codepoint +** of the ASCII letter only. For example, if passed 235 - "LATIN +** SMALL LETTER E WITH DIAERESIS" - return 65 ("LATIN SMALL LETTER +** E"). The resuls of passing a codepoint that corresponds to an +** uppercase letter are undefined. +*/ +static int remove_diacritic(int c){ + unsigned short aDia[] = { + 0, 1797, 1848, 1859, 1891, 1928, 1940, 1995, + 2024, 2040, 2060, 2110, 2168, 2206, 2264, 2286, + 2344, 2383, 2472, 2488, 2516, 2596, 2668, 2732, + 2782, 2842, 2894, 2954, 2984, 3000, 3028, 3336, + 3456, 3696, 3712, 3728, 3744, 3896, 3912, 3928, + 3968, 4008, 4040, 4106, 4138, 4170, 4202, 4234, + 4266, 4296, 4312, 4344, 4408, 4424, 4472, 4504, + 6148, 6198, 6264, 6280, 6360, 6429, 6505, 6529, + 61448, 61468, 61534, 61592, 61642, 61688, 61704, 61726, + 61784, 61800, 61836, 61880, 61914, 61948, 61998, 62122, + 62154, 62200, 62218, 62302, 62364, 62442, 62478, 62536, + 62554, 62584, 62604, 62640, 62648, 62656, 62664, 62730, + 62924, 63050, 63082, 63274, 63390, + }; + char aChar[] = { + '\0', 'a', 'c', 'e', 'i', 'n', 'o', 'u', 'y', 'y', 'a', 'c', + 'd', 'e', 'e', 'g', 'h', 'i', 'j', 'k', 'l', 'n', 'o', 'r', + 's', 't', 'u', 'u', 'w', 'y', 'z', 'o', 'u', 'a', 'i', 'o', + 'u', 'g', 'k', 'o', 'j', 'g', 'n', 'a', 'e', 'i', 'o', 'r', + 'u', 's', 't', 'h', 'a', 'e', 'o', 'y', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', 'a', 'b', 'd', 'd', 'e', 'f', 'g', 'h', + 'h', 'i', 'k', 'l', 'l', 'm', 'n', 'p', 'r', 'r', 's', 't', + 'u', 'v', 'w', 'w', 'x', 'y', 'z', 'h', 't', 'w', 'y', 'a', + 'e', 'i', 'o', 'u', 'y', + }; + + unsigned int key = (((unsigned int)c)<<3) | 0x00000007; + int iRes = 0; + int iHi = sizeof(aDia)/sizeof(aDia[0]) - 1; + int iLo = 0; + while( iHi>=iLo ){ + int iTest = (iHi + iLo) / 2; + if( key >= aDia[iTest] ){ + iRes = iTest; + iLo = iTest+1; + }else{ + iHi = iTest-1; + } + } + assert( key>=aDia[iRes] ); + return ((c > (aDia[iRes]>>3) + (aDia[iRes]&0x07)) ? c : (int)aChar[iRes]); +} + + +/* +** Return true if the argument interpreted as a unicode codepoint +** is a diacritical modifier character. +*/ +SQLITE_PRIVATE int sqlite3FtsUnicodeIsdiacritic(int c){ + unsigned int mask0 = 0x08029FDF; + unsigned int mask1 = 0x000361F8; + if( c<768 || c>817 ) return 0; + return (c < 768+32) ? + (mask0 & (1 << (c-768))) : + (mask1 & (1 << (c-768-32))); +} + + +/* +** Interpret the argument as a unicode codepoint. If the codepoint +** is an upper case character that has a lower case equivalent, +** return the codepoint corresponding to the lower case version. +** Otherwise, return a copy of the argument. +** +** The results are undefined if the value passed to this function +** is less than zero. +*/ +SQLITE_PRIVATE int sqlite3FtsUnicodeFold(int c, int bRemoveDiacritic){ + /* Each entry in the following array defines a rule for folding a range + ** of codepoints to lower case. The rule applies to a range of nRange + ** codepoints starting at codepoint iCode. + ** + ** If the least significant bit in flags is clear, then the rule applies + ** to all nRange codepoints (i.e. all nRange codepoints are upper case and + ** need to be folded). Or, if it is set, then the rule only applies to + ** every second codepoint in the range, starting with codepoint C. + ** + ** The 7 most significant bits in flags are an index into the aiOff[] + ** array. If a specific codepoint C does require folding, then its lower + ** case equivalent is ((C + aiOff[flags>>1]) & 0xFFFF). + ** + ** The contents of this array are generated by parsing the CaseFolding.txt + ** file distributed as part of the "Unicode Character Database". See + ** http://www.unicode.org for details. + */ + static const struct TableEntry { + unsigned short iCode; + unsigned char flags; + unsigned char nRange; + } aEntry[] = { + {65, 14, 26}, {181, 64, 1}, {192, 14, 23}, + {216, 14, 7}, {256, 1, 48}, {306, 1, 6}, + {313, 1, 16}, {330, 1, 46}, {376, 116, 1}, + {377, 1, 6}, {383, 104, 1}, {385, 50, 1}, + {386, 1, 4}, {390, 44, 1}, {391, 0, 1}, + {393, 42, 2}, {395, 0, 1}, {398, 32, 1}, + {399, 38, 1}, {400, 40, 1}, {401, 0, 1}, + {403, 42, 1}, {404, 46, 1}, {406, 52, 1}, + {407, 48, 1}, {408, 0, 1}, {412, 52, 1}, + {413, 54, 1}, {415, 56, 1}, {416, 1, 6}, + {422, 60, 1}, {423, 0, 1}, {425, 60, 1}, + {428, 0, 1}, {430, 60, 1}, {431, 0, 1}, + {433, 58, 2}, {435, 1, 4}, {439, 62, 1}, + {440, 0, 1}, {444, 0, 1}, {452, 2, 1}, + {453, 0, 1}, {455, 2, 1}, {456, 0, 1}, + {458, 2, 1}, {459, 1, 18}, {478, 1, 18}, + {497, 2, 1}, {498, 1, 4}, {502, 122, 1}, + {503, 134, 1}, {504, 1, 40}, {544, 110, 1}, + {546, 1, 18}, {570, 70, 1}, {571, 0, 1}, + {573, 108, 1}, {574, 68, 1}, {577, 0, 1}, + {579, 106, 1}, {580, 28, 1}, {581, 30, 1}, + {582, 1, 10}, {837, 36, 1}, {880, 1, 4}, + {886, 0, 1}, {902, 18, 1}, {904, 16, 3}, + {908, 26, 1}, {910, 24, 2}, {913, 14, 17}, + {931, 14, 9}, {962, 0, 1}, {975, 4, 1}, + {976, 140, 1}, {977, 142, 1}, {981, 146, 1}, + {982, 144, 1}, {984, 1, 24}, {1008, 136, 1}, + {1009, 138, 1}, {1012, 130, 1}, {1013, 128, 1}, + {1015, 0, 1}, {1017, 152, 1}, {1018, 0, 1}, + {1021, 110, 3}, {1024, 34, 16}, {1040, 14, 32}, + {1120, 1, 34}, {1162, 1, 54}, {1216, 6, 1}, + {1217, 1, 14}, {1232, 1, 88}, {1329, 22, 38}, + {4256, 66, 38}, {4295, 66, 1}, {4301, 66, 1}, + {7680, 1, 150}, {7835, 132, 1}, {7838, 96, 1}, + {7840, 1, 96}, {7944, 150, 8}, {7960, 150, 6}, + {7976, 150, 8}, {7992, 150, 8}, {8008, 150, 6}, + {8025, 151, 8}, {8040, 150, 8}, {8072, 150, 8}, + {8088, 150, 8}, {8104, 150, 8}, {8120, 150, 2}, + {8122, 126, 2}, {8124, 148, 1}, {8126, 100, 1}, + {8136, 124, 4}, {8140, 148, 1}, {8152, 150, 2}, + {8154, 120, 2}, {8168, 150, 2}, {8170, 118, 2}, + {8172, 152, 1}, {8184, 112, 2}, {8186, 114, 2}, + {8188, 148, 1}, {8486, 98, 1}, {8490, 92, 1}, + {8491, 94, 1}, {8498, 12, 1}, {8544, 8, 16}, + {8579, 0, 1}, {9398, 10, 26}, {11264, 22, 47}, + {11360, 0, 1}, {11362, 88, 1}, {11363, 102, 1}, + {11364, 90, 1}, {11367, 1, 6}, {11373, 84, 1}, + {11374, 86, 1}, {11375, 80, 1}, {11376, 82, 1}, + {11378, 0, 1}, {11381, 0, 1}, {11390, 78, 2}, + {11392, 1, 100}, {11499, 1, 4}, {11506, 0, 1}, + {42560, 1, 46}, {42624, 1, 24}, {42786, 1, 14}, + {42802, 1, 62}, {42873, 1, 4}, {42877, 76, 1}, + {42878, 1, 10}, {42891, 0, 1}, {42893, 74, 1}, + {42896, 1, 4}, {42912, 1, 10}, {42922, 72, 1}, + {65313, 14, 26}, + }; + static const unsigned short aiOff[] = { + 1, 2, 8, 15, 16, 26, 28, 32, + 37, 38, 40, 48, 63, 64, 69, 71, + 79, 80, 116, 202, 203, 205, 206, 207, + 209, 210, 211, 213, 214, 217, 218, 219, + 775, 7264, 10792, 10795, 23228, 23256, 30204, 54721, + 54753, 54754, 54756, 54787, 54793, 54809, 57153, 57274, + 57921, 58019, 58363, 61722, 65268, 65341, 65373, 65406, + 65408, 65410, 65415, 65424, 65436, 65439, 65450, 65462, + 65472, 65476, 65478, 65480, 65482, 65488, 65506, 65511, + 65514, 65521, 65527, 65528, 65529, + }; + + int ret = c; + + assert( c>=0 ); + assert( sizeof(unsigned short)==2 && sizeof(unsigned char)==1 ); + + if( c<128 ){ + if( c>='A' && c<='Z' ) ret = c + ('a' - 'A'); + }else if( c<65536 ){ + int iHi = sizeof(aEntry)/sizeof(aEntry[0]) - 1; + int iLo = 0; + int iRes = -1; + + while( iHi>=iLo ){ + int iTest = (iHi + iLo) / 2; + int cmp = (c - aEntry[iTest].iCode); + if( cmp>=0 ){ + iRes = iTest; + iLo = iTest+1; + }else{ + iHi = iTest-1; + } + } + assert( iRes<0 || c>=aEntry[iRes].iCode ); + + if( iRes>=0 ){ + const struct TableEntry *p = &aEntry[iRes]; + if( c<(p->iCode + p->nRange) && 0==(0x01 & p->flags & (p->iCode ^ c)) ){ + ret = (c + (aiOff[p->flags>>1])) & 0x0000FFFF; + assert( ret>0 ); + } + } + + if( bRemoveDiacritic ) ret = remove_diacritic(ret); + } + + else if( c>=66560 && c<66600 ){ + ret = c + 40; + } + + return ret; +} +#endif /* defined(SQLITE_ENABLE_FTS3) || defined(SQLITE_ENABLE_FTS4) */ +#endif /* !defined(SQLITE_DISABLE_FTS3_UNICODE) */ + +/************** End of fts3_unicode2.c ***************************************/ +/************** Begin file rtree.c *******************************************/ +/* +** 2001 September 15 +** +** 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 for implementations of the r-tree and r*-tree +** algorithms packaged as an SQLite virtual table module. +*/ + +/* +** Database Format of R-Tree Tables +** -------------------------------- +** +** The data structure for a single virtual r-tree table is stored in three +** native SQLite tables declared as follows. In each case, the '%' character +** in the table name is replaced with the user-supplied name of the r-tree +** table. +** +** CREATE TABLE %_node(nodeno INTEGER PRIMARY KEY, data BLOB) +** CREATE TABLE %_parent(nodeno INTEGER PRIMARY KEY, parentnode INTEGER) +** CREATE TABLE %_rowid(rowid INTEGER PRIMARY KEY, nodeno INTEGER) +** +** The data for each node of the r-tree structure is stored in the %_node +** table. For each node that is not the root node of the r-tree, there is +** an entry in the %_parent table associating the node with its parent. +** And for each row of data in the table, there is an entry in the %_rowid +** table that maps from the entries rowid to the id of the node that it +** is stored on. +** +** The root node of an r-tree always exists, even if the r-tree table is +** empty. The nodeno of the root node is always 1. All other nodes in the +** table must be the same size as the root node. The content of each node +** is formatted as follows: +** +** 1. If the node is the root node (node 1), then the first 2 bytes +** of the node contain the tree depth as a big-endian integer. +** For non-root nodes, the first 2 bytes are left unused. +** +** 2. The next 2 bytes contain the number of entries currently +** stored in the node. +** +** 3. The remainder of the node contains the node entries. Each entry +** consists of a single 8-byte integer followed by an even number +** of 4-byte coordinates. For leaf nodes the integer is the rowid +** of a record. For internal nodes it is the node number of a +** child page. +*/ + +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_RTREE) + +#ifndef SQLITE_CORE +/* #include "sqlite3ext.h" */ + SQLITE_EXTENSION_INIT1 +#else +/* #include "sqlite3.h" */ +#endif + +/* #include */ +/* #include */ +/* #include */ + +#ifndef SQLITE_AMALGAMATION +#include "sqlite3rtree.h" +typedef sqlite3_int64 i64; +typedef unsigned char u8; +typedef unsigned short u16; +typedef unsigned int u32; +#endif + +/* The following macro is used to suppress compiler warnings. +*/ +#ifndef UNUSED_PARAMETER +# define UNUSED_PARAMETER(x) (void)(x) +#endif + +typedef struct Rtree Rtree; +typedef struct RtreeCursor RtreeCursor; +typedef struct RtreeNode RtreeNode; +typedef struct RtreeCell RtreeCell; +typedef struct RtreeConstraint RtreeConstraint; +typedef struct RtreeMatchArg RtreeMatchArg; +typedef struct RtreeGeomCallback RtreeGeomCallback; +typedef union RtreeCoord RtreeCoord; +typedef struct RtreeSearchPoint RtreeSearchPoint; + +/* The rtree may have between 1 and RTREE_MAX_DIMENSIONS dimensions. */ +#define RTREE_MAX_DIMENSIONS 5 + +/* Size of hash table Rtree.aHash. This hash table is not expected to +** ever contain very many entries, so a fixed number of buckets is +** used. +*/ +#define HASHSIZE 97 + +/* The xBestIndex method of this virtual table requires an estimate of +** the number of rows in the virtual table to calculate the costs of +** various strategies. If possible, this estimate is loaded from the +** sqlite_stat1 table (with RTREE_MIN_ROWEST as a hard-coded minimum). +** Otherwise, if no sqlite_stat1 entry is available, use +** RTREE_DEFAULT_ROWEST. +*/ +#define RTREE_DEFAULT_ROWEST 1048576 +#define RTREE_MIN_ROWEST 100 + +/* +** An rtree virtual-table object. +*/ +struct Rtree { + sqlite3_vtab base; /* Base class. Must be first */ + sqlite3 *db; /* Host database connection */ + int iNodeSize; /* Size in bytes of each node in the node table */ + u8 nDim; /* Number of dimensions */ + u8 eCoordType; /* RTREE_COORD_REAL32 or RTREE_COORD_INT32 */ + u8 nBytesPerCell; /* Bytes consumed per cell */ + int iDepth; /* Current depth of the r-tree structure */ + char *zDb; /* Name of database containing r-tree table */ + char *zName; /* Name of r-tree table */ + int nBusy; /* Current number of users of this structure */ + i64 nRowEst; /* Estimated number of rows in this table */ + + /* List of nodes removed during a CondenseTree operation. List is + ** linked together via the pointer normally used for hash chains - + ** RtreeNode.pNext. RtreeNode.iNode stores the depth of the sub-tree + ** headed by the node (leaf nodes have RtreeNode.iNode==0). + */ + RtreeNode *pDeleted; + int iReinsertHeight; /* Height of sub-trees Reinsert() has run on */ + + /* Statements to read/write/delete a record from xxx_node */ + sqlite3_stmt *pReadNode; + sqlite3_stmt *pWriteNode; + sqlite3_stmt *pDeleteNode; + + /* Statements to read/write/delete a record from xxx_rowid */ + sqlite3_stmt *pReadRowid; + sqlite3_stmt *pWriteRowid; + sqlite3_stmt *pDeleteRowid; + + /* Statements to read/write/delete a record from xxx_parent */ + sqlite3_stmt *pReadParent; + sqlite3_stmt *pWriteParent; + sqlite3_stmt *pDeleteParent; + + RtreeNode *aHash[HASHSIZE]; /* Hash table of in-memory nodes. */ +}; + +/* Possible values for Rtree.eCoordType: */ +#define RTREE_COORD_REAL32 0 +#define RTREE_COORD_INT32 1 + +/* +** If SQLITE_RTREE_INT_ONLY is defined, then this virtual table will +** only deal with integer coordinates. No floating point operations +** will be done. +*/ +#ifdef SQLITE_RTREE_INT_ONLY + typedef sqlite3_int64 RtreeDValue; /* High accuracy coordinate */ + typedef int RtreeValue; /* Low accuracy coordinate */ +# define RTREE_ZERO 0 +#else + typedef double RtreeDValue; /* High accuracy coordinate */ + typedef float RtreeValue; /* Low accuracy coordinate */ +# define RTREE_ZERO 0.0 +#endif + +/* +** When doing a search of an r-tree, instances of the following structure +** record intermediate results from the tree walk. +** +** The id is always a node-id. For iLevel>=1 the id is the node-id of +** the node that the RtreeSearchPoint represents. When iLevel==0, however, +** the id is of the parent node and the cell that RtreeSearchPoint +** represents is the iCell-th entry in the parent node. +*/ +struct RtreeSearchPoint { + RtreeDValue rScore; /* The score for this node. Smallest goes first. */ + sqlite3_int64 id; /* Node ID */ + u8 iLevel; /* 0=entries. 1=leaf node. 2+ for higher */ + u8 eWithin; /* PARTLY_WITHIN or FULLY_WITHIN */ + u8 iCell; /* Cell index within the node */ +}; + +/* +** The minimum number of cells allowed for a node is a third of the +** maximum. In Gutman's notation: +** +** m = M/3 +** +** If an R*-tree "Reinsert" operation is required, the same number of +** cells are removed from the overfull node and reinserted into the tree. +*/ +#define RTREE_MINCELLS(p) ((((p)->iNodeSize-4)/(p)->nBytesPerCell)/3) +#define RTREE_REINSERT(p) RTREE_MINCELLS(p) +#define RTREE_MAXCELLS 51 + +/* +** The smallest possible node-size is (512-64)==448 bytes. And the largest +** supported cell size is 48 bytes (8 byte rowid + ten 4 byte coordinates). +** Therefore all non-root nodes must contain at least 3 entries. Since +** 2^40 is greater than 2^64, an r-tree structure always has a depth of +** 40 or less. +*/ +#define RTREE_MAX_DEPTH 40 + + +/* +** Number of entries in the cursor RtreeNode cache. The first entry is +** used to cache the RtreeNode for RtreeCursor.sPoint. The remaining +** entries cache the RtreeNode for the first elements of the priority queue. +*/ +#define RTREE_CACHE_SZ 5 + +/* +** An rtree cursor object. +*/ +struct RtreeCursor { + sqlite3_vtab_cursor base; /* Base class. Must be first */ + u8 atEOF; /* True if at end of search */ + u8 bPoint; /* True if sPoint is valid */ + int iStrategy; /* Copy of idxNum search parameter */ + int nConstraint; /* Number of entries in aConstraint */ + RtreeConstraint *aConstraint; /* Search constraints. */ + int nPointAlloc; /* Number of slots allocated for aPoint[] */ + int nPoint; /* Number of slots used in aPoint[] */ + int mxLevel; /* iLevel value for root of the tree */ + RtreeSearchPoint *aPoint; /* Priority queue for search points */ + RtreeSearchPoint sPoint; /* Cached next search point */ + RtreeNode *aNode[RTREE_CACHE_SZ]; /* Rtree node cache */ + u32 anQueue[RTREE_MAX_DEPTH+1]; /* Number of queued entries by iLevel */ +}; + +/* Return the Rtree of a RtreeCursor */ +#define RTREE_OF_CURSOR(X) ((Rtree*)((X)->base.pVtab)) + +/* +** A coordinate can be either a floating point number or a integer. All +** coordinates within a single R-Tree are always of the same time. +*/ +union RtreeCoord { + RtreeValue f; /* Floating point value */ + int i; /* Integer value */ + u32 u; /* Unsigned for byte-order conversions */ +}; + +/* +** The argument is an RtreeCoord. Return the value stored within the RtreeCoord +** formatted as a RtreeDValue (double or int64). This macro assumes that local +** variable pRtree points to the Rtree structure associated with the +** RtreeCoord. +*/ +#ifdef SQLITE_RTREE_INT_ONLY +# define DCOORD(coord) ((RtreeDValue)coord.i) +#else +# define DCOORD(coord) ( \ + (pRtree->eCoordType==RTREE_COORD_REAL32) ? \ + ((double)coord.f) : \ + ((double)coord.i) \ + ) +#endif + +/* +** A search constraint. +*/ +struct RtreeConstraint { + int iCoord; /* Index of constrained coordinate */ + int op; /* Constraining operation */ + union { + RtreeDValue rValue; /* Constraint value. */ + int (*xGeom)(sqlite3_rtree_geometry*,int,RtreeDValue*,int*); + int (*xQueryFunc)(sqlite3_rtree_query_info*); + } u; + sqlite3_rtree_query_info *pInfo; /* xGeom and xQueryFunc argument */ +}; + +/* Possible values for RtreeConstraint.op */ +#define RTREE_EQ 0x41 /* A */ +#define RTREE_LE 0x42 /* B */ +#define RTREE_LT 0x43 /* C */ +#define RTREE_GE 0x44 /* D */ +#define RTREE_GT 0x45 /* E */ +#define RTREE_MATCH 0x46 /* F: Old-style sqlite3_rtree_geometry_callback() */ +#define RTREE_QUERY 0x47 /* G: New-style sqlite3_rtree_query_callback() */ + + +/* +** An rtree structure node. +*/ +struct RtreeNode { + RtreeNode *pParent; /* Parent node */ + i64 iNode; /* The node number */ + int nRef; /* Number of references to this node */ + int isDirty; /* True if the node needs to be written to disk */ + u8 *zData; /* Content of the node, as should be on disk */ + RtreeNode *pNext; /* Next node in this hash collision chain */ +}; + +/* Return the number of cells in a node */ +#define NCELL(pNode) readInt16(&(pNode)->zData[2]) + +/* +** A single cell from a node, deserialized +*/ +struct RtreeCell { + i64 iRowid; /* Node or entry ID */ + RtreeCoord aCoord[RTREE_MAX_DIMENSIONS*2]; /* Bounding box coordinates */ +}; + + +/* +** This object becomes the sqlite3_user_data() for the SQL functions +** that are created by sqlite3_rtree_geometry_callback() and +** sqlite3_rtree_query_callback() and which appear on the right of MATCH +** operators in order to constrain a search. +** +** xGeom and xQueryFunc are the callback functions. Exactly one of +** xGeom and xQueryFunc fields is non-NULL, depending on whether the +** SQL function was created using sqlite3_rtree_geometry_callback() or +** sqlite3_rtree_query_callback(). +** +** This object is deleted automatically by the destructor mechanism in +** sqlite3_create_function_v2(). +*/ +struct RtreeGeomCallback { + int (*xGeom)(sqlite3_rtree_geometry*, int, RtreeDValue*, int*); + int (*xQueryFunc)(sqlite3_rtree_query_info*); + void (*xDestructor)(void*); + void *pContext; +}; + + +/* +** Value for the first field of every RtreeMatchArg object. The MATCH +** operator tests that the first field of a blob operand matches this +** value to avoid operating on invalid blobs (which could cause a segfault). +*/ +#define RTREE_GEOMETRY_MAGIC 0x891245AB + +/* +** An instance of this structure (in the form of a BLOB) is returned by +** the SQL functions that sqlite3_rtree_geometry_callback() and +** sqlite3_rtree_query_callback() create, and is read as the right-hand +** operand to the MATCH operator of an R-Tree. +*/ +struct RtreeMatchArg { + u32 magic; /* Always RTREE_GEOMETRY_MAGIC */ + RtreeGeomCallback cb; /* Info about the callback functions */ + int nParam; /* Number of parameters to the SQL function */ + sqlite3_value **apSqlParam; /* Original SQL parameter values */ + RtreeDValue aParam[1]; /* Values for parameters to the SQL function */ +}; + +#ifndef MAX +# define MAX(x,y) ((x) < (y) ? (y) : (x)) +#endif +#ifndef MIN +# define MIN(x,y) ((x) > (y) ? (y) : (x)) +#endif + +/* +** Functions to deserialize a 16 bit integer, 32 bit real number and +** 64 bit integer. The deserialized value is returned. +*/ +static int readInt16(u8 *p){ + return (p[0]<<8) + p[1]; +} +static void readCoord(u8 *p, RtreeCoord *pCoord){ + pCoord->u = ( + (((u32)p[0]) << 24) + + (((u32)p[1]) << 16) + + (((u32)p[2]) << 8) + + (((u32)p[3]) << 0) + ); +} +static i64 readInt64(u8 *p){ + return ( + (((i64)p[0]) << 56) + + (((i64)p[1]) << 48) + + (((i64)p[2]) << 40) + + (((i64)p[3]) << 32) + + (((i64)p[4]) << 24) + + (((i64)p[5]) << 16) + + (((i64)p[6]) << 8) + + (((i64)p[7]) << 0) + ); +} + +/* +** Functions to serialize a 16 bit integer, 32 bit real number and +** 64 bit integer. The value returned is the number of bytes written +** to the argument buffer (always 2, 4 and 8 respectively). +*/ +static int writeInt16(u8 *p, int i){ + p[0] = (i>> 8)&0xFF; + p[1] = (i>> 0)&0xFF; + return 2; +} +static int writeCoord(u8 *p, RtreeCoord *pCoord){ + u32 i; + assert( sizeof(RtreeCoord)==4 ); + assert( sizeof(u32)==4 ); + i = pCoord->u; + p[0] = (i>>24)&0xFF; + p[1] = (i>>16)&0xFF; + p[2] = (i>> 8)&0xFF; + p[3] = (i>> 0)&0xFF; + return 4; +} +static int writeInt64(u8 *p, i64 i){ + p[0] = (i>>56)&0xFF; + p[1] = (i>>48)&0xFF; + p[2] = (i>>40)&0xFF; + p[3] = (i>>32)&0xFF; + p[4] = (i>>24)&0xFF; + p[5] = (i>>16)&0xFF; + p[6] = (i>> 8)&0xFF; + p[7] = (i>> 0)&0xFF; + return 8; +} + +/* +** Increment the reference count of node p. +*/ +static void nodeReference(RtreeNode *p){ + if( p ){ + p->nRef++; + } +} + +/* +** Clear the content of node p (set all bytes to 0x00). +*/ +static void nodeZero(Rtree *pRtree, RtreeNode *p){ + memset(&p->zData[2], 0, pRtree->iNodeSize-2); + p->isDirty = 1; +} + +/* +** Given a node number iNode, return the corresponding key to use +** in the Rtree.aHash table. +*/ +static int nodeHash(i64 iNode){ + return iNode % HASHSIZE; +} + +/* +** Search the node hash table for node iNode. If found, return a pointer +** to it. Otherwise, return 0. +*/ +static RtreeNode *nodeHashLookup(Rtree *pRtree, i64 iNode){ + RtreeNode *p; + for(p=pRtree->aHash[nodeHash(iNode)]; p && p->iNode!=iNode; p=p->pNext); + return p; +} + +/* +** Add node pNode to the node hash table. +*/ +static void nodeHashInsert(Rtree *pRtree, RtreeNode *pNode){ + int iHash; + assert( pNode->pNext==0 ); + iHash = nodeHash(pNode->iNode); + pNode->pNext = pRtree->aHash[iHash]; + pRtree->aHash[iHash] = pNode; +} + +/* +** Remove node pNode from the node hash table. +*/ +static void nodeHashDelete(Rtree *pRtree, RtreeNode *pNode){ + RtreeNode **pp; + if( pNode->iNode!=0 ){ + pp = &pRtree->aHash[nodeHash(pNode->iNode)]; + for( ; (*pp)!=pNode; pp = &(*pp)->pNext){ assert(*pp); } + *pp = pNode->pNext; + pNode->pNext = 0; + } +} + +/* +** Allocate and return new r-tree node. Initially, (RtreeNode.iNode==0), +** indicating that node has not yet been assigned a node number. It is +** assigned a node number when nodeWrite() is called to write the +** node contents out to the database. +*/ +static RtreeNode *nodeNew(Rtree *pRtree, RtreeNode *pParent){ + RtreeNode *pNode; + pNode = (RtreeNode *)sqlite3_malloc(sizeof(RtreeNode) + pRtree->iNodeSize); + if( pNode ){ + memset(pNode, 0, sizeof(RtreeNode) + pRtree->iNodeSize); + pNode->zData = (u8 *)&pNode[1]; + pNode->nRef = 1; + pNode->pParent = pParent; + pNode->isDirty = 1; + nodeReference(pParent); + } + return pNode; +} + +/* +** Obtain a reference to an r-tree node. +*/ +static int nodeAcquire( + Rtree *pRtree, /* R-tree structure */ + i64 iNode, /* Node number to load */ + RtreeNode *pParent, /* Either the parent node or NULL */ + RtreeNode **ppNode /* OUT: Acquired node */ +){ + int rc; + int rc2 = SQLITE_OK; + RtreeNode *pNode; + + /* Check if the requested node is already in the hash table. If so, + ** increase its reference count and return it. + */ + if( (pNode = nodeHashLookup(pRtree, iNode)) ){ + assert( !pParent || !pNode->pParent || pNode->pParent==pParent ); + if( pParent && !pNode->pParent ){ + nodeReference(pParent); + pNode->pParent = pParent; + } + pNode->nRef++; + *ppNode = pNode; + return SQLITE_OK; + } + + sqlite3_bind_int64(pRtree->pReadNode, 1, iNode); + rc = sqlite3_step(pRtree->pReadNode); + if( rc==SQLITE_ROW ){ + const u8 *zBlob = sqlite3_column_blob(pRtree->pReadNode, 0); + if( pRtree->iNodeSize==sqlite3_column_bytes(pRtree->pReadNode, 0) ){ + pNode = (RtreeNode *)sqlite3_malloc(sizeof(RtreeNode)+pRtree->iNodeSize); + if( !pNode ){ + rc2 = SQLITE_NOMEM; + }else{ + pNode->pParent = pParent; + pNode->zData = (u8 *)&pNode[1]; + pNode->nRef = 1; + pNode->iNode = iNode; + pNode->isDirty = 0; + pNode->pNext = 0; + memcpy(pNode->zData, zBlob, pRtree->iNodeSize); + nodeReference(pParent); + } + } + } + rc = sqlite3_reset(pRtree->pReadNode); + if( rc==SQLITE_OK ) rc = rc2; + + /* If the root node was just loaded, set pRtree->iDepth to the height + ** of the r-tree structure. A height of zero means all data is stored on + ** the root node. A height of one means the children of the root node + ** are the leaves, and so on. If the depth as specified on the root node + ** is greater than RTREE_MAX_DEPTH, the r-tree structure must be corrupt. + */ + if( pNode && iNode==1 ){ + pRtree->iDepth = readInt16(pNode->zData); + if( pRtree->iDepth>RTREE_MAX_DEPTH ){ + rc = SQLITE_CORRUPT_VTAB; + } + } + + /* If no error has occurred so far, check if the "number of entries" + ** field on the node is too large. If so, set the return code to + ** SQLITE_CORRUPT_VTAB. + */ + if( pNode && rc==SQLITE_OK ){ + if( NCELL(pNode)>((pRtree->iNodeSize-4)/pRtree->nBytesPerCell) ){ + rc = SQLITE_CORRUPT_VTAB; + } + } + + if( rc==SQLITE_OK ){ + if( pNode!=0 ){ + nodeHashInsert(pRtree, pNode); + }else{ + rc = SQLITE_CORRUPT_VTAB; + } + *ppNode = pNode; + }else{ + sqlite3_free(pNode); + *ppNode = 0; + } + + return rc; +} + +/* +** Overwrite cell iCell of node pNode with the contents of pCell. +*/ +static void nodeOverwriteCell( + Rtree *pRtree, /* The overall R-Tree */ + RtreeNode *pNode, /* The node into which the cell is to be written */ + RtreeCell *pCell, /* The cell to write */ + int iCell /* Index into pNode into which pCell is written */ +){ + int ii; + u8 *p = &pNode->zData[4 + pRtree->nBytesPerCell*iCell]; + p += writeInt64(p, pCell->iRowid); + for(ii=0; ii<(pRtree->nDim*2); ii++){ + p += writeCoord(p, &pCell->aCoord[ii]); + } + pNode->isDirty = 1; +} + +/* +** Remove the cell with index iCell from node pNode. +*/ +static void nodeDeleteCell(Rtree *pRtree, RtreeNode *pNode, int iCell){ + u8 *pDst = &pNode->zData[4 + pRtree->nBytesPerCell*iCell]; + u8 *pSrc = &pDst[pRtree->nBytesPerCell]; + int nByte = (NCELL(pNode) - iCell - 1) * pRtree->nBytesPerCell; + memmove(pDst, pSrc, nByte); + writeInt16(&pNode->zData[2], NCELL(pNode)-1); + pNode->isDirty = 1; +} + +/* +** Insert the contents of cell pCell into node pNode. If the insert +** is successful, return SQLITE_OK. +** +** If there is not enough free space in pNode, return SQLITE_FULL. +*/ +static int nodeInsertCell( + Rtree *pRtree, /* The overall R-Tree */ + RtreeNode *pNode, /* Write new cell into this node */ + RtreeCell *pCell /* The cell to be inserted */ +){ + int nCell; /* Current number of cells in pNode */ + int nMaxCell; /* Maximum number of cells for pNode */ + + nMaxCell = (pRtree->iNodeSize-4)/pRtree->nBytesPerCell; + nCell = NCELL(pNode); + + assert( nCell<=nMaxCell ); + if( nCellzData[2], nCell+1); + pNode->isDirty = 1; + } + + return (nCell==nMaxCell); +} + +/* +** If the node is dirty, write it out to the database. +*/ +static int nodeWrite(Rtree *pRtree, RtreeNode *pNode){ + int rc = SQLITE_OK; + if( pNode->isDirty ){ + sqlite3_stmt *p = pRtree->pWriteNode; + if( pNode->iNode ){ + sqlite3_bind_int64(p, 1, pNode->iNode); + }else{ + sqlite3_bind_null(p, 1); + } + sqlite3_bind_blob(p, 2, pNode->zData, pRtree->iNodeSize, SQLITE_STATIC); + sqlite3_step(p); + pNode->isDirty = 0; + rc = sqlite3_reset(p); + if( pNode->iNode==0 && rc==SQLITE_OK ){ + pNode->iNode = sqlite3_last_insert_rowid(pRtree->db); + nodeHashInsert(pRtree, pNode); + } + } + return rc; +} + +/* +** Release a reference to a node. If the node is dirty and the reference +** count drops to zero, the node data is written to the database. +*/ +static int nodeRelease(Rtree *pRtree, RtreeNode *pNode){ + int rc = SQLITE_OK; + if( pNode ){ + assert( pNode->nRef>0 ); + pNode->nRef--; + if( pNode->nRef==0 ){ + if( pNode->iNode==1 ){ + pRtree->iDepth = -1; + } + if( pNode->pParent ){ + rc = nodeRelease(pRtree, pNode->pParent); + } + if( rc==SQLITE_OK ){ + rc = nodeWrite(pRtree, pNode); + } + nodeHashDelete(pRtree, pNode); + sqlite3_free(pNode); + } + } + return rc; +} + +/* +** Return the 64-bit integer value associated with cell iCell of +** node pNode. If pNode is a leaf node, this is a rowid. If it is +** an internal node, then the 64-bit integer is a child page number. +*/ +static i64 nodeGetRowid( + Rtree *pRtree, /* The overall R-Tree */ + RtreeNode *pNode, /* The node from which to extract the ID */ + int iCell /* The cell index from which to extract the ID */ +){ + assert( iCellzData[4 + pRtree->nBytesPerCell*iCell]); +} + +/* +** Return coordinate iCoord from cell iCell in node pNode. +*/ +static void nodeGetCoord( + Rtree *pRtree, /* The overall R-Tree */ + RtreeNode *pNode, /* The node from which to extract a coordinate */ + int iCell, /* The index of the cell within the node */ + int iCoord, /* Which coordinate to extract */ + RtreeCoord *pCoord /* OUT: Space to write result to */ +){ + readCoord(&pNode->zData[12 + pRtree->nBytesPerCell*iCell + 4*iCoord], pCoord); +} + +/* +** Deserialize cell iCell of node pNode. Populate the structure pointed +** to by pCell with the results. +*/ +static void nodeGetCell( + Rtree *pRtree, /* The overall R-Tree */ + RtreeNode *pNode, /* The node containing the cell to be read */ + int iCell, /* Index of the cell within the node */ + RtreeCell *pCell /* OUT: Write the cell contents here */ +){ + u8 *pData; + RtreeCoord *pCoord; + int ii; + pCell->iRowid = nodeGetRowid(pRtree, pNode, iCell); + pData = pNode->zData + (12 + pRtree->nBytesPerCell*iCell); + pCoord = pCell->aCoord; + for(ii=0; iinDim*2; ii++){ + readCoord(&pData[ii*4], &pCoord[ii]); + } +} + + +/* Forward declaration for the function that does the work of +** the virtual table module xCreate() and xConnect() methods. +*/ +static int rtreeInit( + sqlite3 *, void *, int, const char *const*, sqlite3_vtab **, char **, int +); + +/* +** Rtree virtual table module xCreate method. +*/ +static int rtreeCreate( + sqlite3 *db, + void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVtab, + char **pzErr +){ + return rtreeInit(db, pAux, argc, argv, ppVtab, pzErr, 1); +} + +/* +** Rtree virtual table module xConnect method. +*/ +static int rtreeConnect( + sqlite3 *db, + void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVtab, + char **pzErr +){ + return rtreeInit(db, pAux, argc, argv, ppVtab, pzErr, 0); +} + +/* +** Increment the r-tree reference count. +*/ +static void rtreeReference(Rtree *pRtree){ + pRtree->nBusy++; +} + +/* +** Decrement the r-tree reference count. When the reference count reaches +** zero the structure is deleted. +*/ +static void rtreeRelease(Rtree *pRtree){ + pRtree->nBusy--; + if( pRtree->nBusy==0 ){ + sqlite3_finalize(pRtree->pReadNode); + sqlite3_finalize(pRtree->pWriteNode); + sqlite3_finalize(pRtree->pDeleteNode); + sqlite3_finalize(pRtree->pReadRowid); + sqlite3_finalize(pRtree->pWriteRowid); + sqlite3_finalize(pRtree->pDeleteRowid); + sqlite3_finalize(pRtree->pReadParent); + sqlite3_finalize(pRtree->pWriteParent); + sqlite3_finalize(pRtree->pDeleteParent); + sqlite3_free(pRtree); + } +} + +/* +** Rtree virtual table module xDisconnect method. +*/ +static int rtreeDisconnect(sqlite3_vtab *pVtab){ + rtreeRelease((Rtree *)pVtab); + return SQLITE_OK; +} + +/* +** Rtree virtual table module xDestroy method. +*/ +static int rtreeDestroy(sqlite3_vtab *pVtab){ + Rtree *pRtree = (Rtree *)pVtab; + int rc; + char *zCreate = sqlite3_mprintf( + "DROP TABLE '%q'.'%q_node';" + "DROP TABLE '%q'.'%q_rowid';" + "DROP TABLE '%q'.'%q_parent';", + pRtree->zDb, pRtree->zName, + pRtree->zDb, pRtree->zName, + pRtree->zDb, pRtree->zName + ); + if( !zCreate ){ + rc = SQLITE_NOMEM; + }else{ + rc = sqlite3_exec(pRtree->db, zCreate, 0, 0, 0); + sqlite3_free(zCreate); + } + if( rc==SQLITE_OK ){ + rtreeRelease(pRtree); + } + + return rc; +} + +/* +** Rtree virtual table module xOpen method. +*/ +static int rtreeOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){ + int rc = SQLITE_NOMEM; + RtreeCursor *pCsr; + + pCsr = (RtreeCursor *)sqlite3_malloc(sizeof(RtreeCursor)); + if( pCsr ){ + memset(pCsr, 0, sizeof(RtreeCursor)); + pCsr->base.pVtab = pVTab; + rc = SQLITE_OK; + } + *ppCursor = (sqlite3_vtab_cursor *)pCsr; + + return rc; +} + + +/* +** Free the RtreeCursor.aConstraint[] array and its contents. +*/ +static void freeCursorConstraints(RtreeCursor *pCsr){ + if( pCsr->aConstraint ){ + int i; /* Used to iterate through constraint array */ + for(i=0; inConstraint; i++){ + sqlite3_rtree_query_info *pInfo = pCsr->aConstraint[i].pInfo; + if( pInfo ){ + if( pInfo->xDelUser ) pInfo->xDelUser(pInfo->pUser); + sqlite3_free(pInfo); + } + } + sqlite3_free(pCsr->aConstraint); + pCsr->aConstraint = 0; + } +} + +/* +** Rtree virtual table module xClose method. +*/ +static int rtreeClose(sqlite3_vtab_cursor *cur){ + Rtree *pRtree = (Rtree *)(cur->pVtab); + int ii; + RtreeCursor *pCsr = (RtreeCursor *)cur; + freeCursorConstraints(pCsr); + sqlite3_free(pCsr->aPoint); + for(ii=0; iiaNode[ii]); + sqlite3_free(pCsr); + return SQLITE_OK; +} + +/* +** Rtree virtual table module xEof method. +** +** Return non-zero if the cursor does not currently point to a valid +** record (i.e if the scan has finished), or zero otherwise. +*/ +static int rtreeEof(sqlite3_vtab_cursor *cur){ + RtreeCursor *pCsr = (RtreeCursor *)cur; + return pCsr->atEOF; +} + +/* +** Convert raw bits from the on-disk RTree record into a coordinate value. +** The on-disk format is big-endian and needs to be converted for little- +** endian platforms. The on-disk record stores integer coordinates if +** eInt is true and it stores 32-bit floating point records if eInt is +** false. a[] is the four bytes of the on-disk record to be decoded. +** Store the results in "r". +** +** There are three versions of this macro, one each for little-endian and +** big-endian processors and a third generic implementation. The endian- +** specific implementations are much faster and are preferred if the +** processor endianness is known at compile-time. The SQLITE_BYTEORDER +** macro is part of sqliteInt.h and hence the endian-specific +** implementation will only be used if this module is compiled as part +** of the amalgamation. +*/ +#if defined(SQLITE_BYTEORDER) && SQLITE_BYTEORDER==1234 +#define RTREE_DECODE_COORD(eInt, a, r) { \ + RtreeCoord c; /* Coordinate decoded */ \ + memcpy(&c.u,a,4); \ + c.u = ((c.u>>24)&0xff)|((c.u>>8)&0xff00)| \ + ((c.u&0xff)<<24)|((c.u&0xff00)<<8); \ + r = eInt ? (sqlite3_rtree_dbl)c.i : (sqlite3_rtree_dbl)c.f; \ +} +#elif defined(SQLITE_BYTEORDER) && SQLITE_BYTEORDER==4321 +#define RTREE_DECODE_COORD(eInt, a, r) { \ + RtreeCoord c; /* Coordinate decoded */ \ + memcpy(&c.u,a,4); \ + r = eInt ? (sqlite3_rtree_dbl)c.i : (sqlite3_rtree_dbl)c.f; \ +} +#else +#define RTREE_DECODE_COORD(eInt, a, r) { \ + RtreeCoord c; /* Coordinate decoded */ \ + c.u = ((u32)a[0]<<24) + ((u32)a[1]<<16) \ + +((u32)a[2]<<8) + a[3]; \ + r = eInt ? (sqlite3_rtree_dbl)c.i : (sqlite3_rtree_dbl)c.f; \ +} +#endif + +/* +** Check the RTree node or entry given by pCellData and p against the MATCH +** constraint pConstraint. +*/ +static int rtreeCallbackConstraint( + RtreeConstraint *pConstraint, /* The constraint to test */ + int eInt, /* True if RTree holding integer coordinates */ + u8 *pCellData, /* Raw cell content */ + RtreeSearchPoint *pSearch, /* Container of this cell */ + sqlite3_rtree_dbl *prScore, /* OUT: score for the cell */ + int *peWithin /* OUT: visibility of the cell */ +){ + int i; /* Loop counter */ + sqlite3_rtree_query_info *pInfo = pConstraint->pInfo; /* Callback info */ + int nCoord = pInfo->nCoord; /* No. of coordinates */ + int rc; /* Callback return code */ + sqlite3_rtree_dbl aCoord[RTREE_MAX_DIMENSIONS*2]; /* Decoded coordinates */ + + assert( pConstraint->op==RTREE_MATCH || pConstraint->op==RTREE_QUERY ); + assert( nCoord==2 || nCoord==4 || nCoord==6 || nCoord==8 || nCoord==10 ); + + if( pConstraint->op==RTREE_QUERY && pSearch->iLevel==1 ){ + pInfo->iRowid = readInt64(pCellData); + } + pCellData += 8; + for(i=0; iop==RTREE_MATCH ){ + rc = pConstraint->u.xGeom((sqlite3_rtree_geometry*)pInfo, + nCoord, aCoord, &i); + if( i==0 ) *peWithin = NOT_WITHIN; + *prScore = RTREE_ZERO; + }else{ + pInfo->aCoord = aCoord; + pInfo->iLevel = pSearch->iLevel - 1; + pInfo->rScore = pInfo->rParentScore = pSearch->rScore; + pInfo->eWithin = pInfo->eParentWithin = pSearch->eWithin; + rc = pConstraint->u.xQueryFunc(pInfo); + if( pInfo->eWithin<*peWithin ) *peWithin = pInfo->eWithin; + if( pInfo->rScore<*prScore || *prScorerScore; + } + } + return rc; +} + +/* +** Check the internal RTree node given by pCellData against constraint p. +** If this constraint cannot be satisfied by any child within the node, +** set *peWithin to NOT_WITHIN. +*/ +static void rtreeNonleafConstraint( + RtreeConstraint *p, /* The constraint to test */ + int eInt, /* True if RTree holds integer coordinates */ + u8 *pCellData, /* Raw cell content as appears on disk */ + int *peWithin /* Adjust downward, as appropriate */ +){ + sqlite3_rtree_dbl val; /* Coordinate value convert to a double */ + + /* p->iCoord might point to either a lower or upper bound coordinate + ** in a coordinate pair. But make pCellData point to the lower bound. + */ + pCellData += 8 + 4*(p->iCoord&0xfe); + + assert(p->op==RTREE_LE || p->op==RTREE_LT || p->op==RTREE_GE + || p->op==RTREE_GT || p->op==RTREE_EQ ); + switch( p->op ){ + case RTREE_LE: + case RTREE_LT: + case RTREE_EQ: + RTREE_DECODE_COORD(eInt, pCellData, val); + /* val now holds the lower bound of the coordinate pair */ + if( p->u.rValue>=val ) return; + if( p->op!=RTREE_EQ ) break; /* RTREE_LE and RTREE_LT end here */ + /* Fall through for the RTREE_EQ case */ + + default: /* RTREE_GT or RTREE_GE, or fallthrough of RTREE_EQ */ + pCellData += 4; + RTREE_DECODE_COORD(eInt, pCellData, val); + /* val now holds the upper bound of the coordinate pair */ + if( p->u.rValue<=val ) return; + } + *peWithin = NOT_WITHIN; +} + +/* +** Check the leaf RTree cell given by pCellData against constraint p. +** If this constraint is not satisfied, set *peWithin to NOT_WITHIN. +** If the constraint is satisfied, leave *peWithin unchanged. +** +** The constraint is of the form: xN op $val +** +** The op is given by p->op. The xN is p->iCoord-th coordinate in +** pCellData. $val is given by p->u.rValue. +*/ +static void rtreeLeafConstraint( + RtreeConstraint *p, /* The constraint to test */ + int eInt, /* True if RTree holds integer coordinates */ + u8 *pCellData, /* Raw cell content as appears on disk */ + int *peWithin /* Adjust downward, as appropriate */ +){ + RtreeDValue xN; /* Coordinate value converted to a double */ + + assert(p->op==RTREE_LE || p->op==RTREE_LT || p->op==RTREE_GE + || p->op==RTREE_GT || p->op==RTREE_EQ ); + pCellData += 8 + p->iCoord*4; + RTREE_DECODE_COORD(eInt, pCellData, xN); + switch( p->op ){ + case RTREE_LE: if( xN <= p->u.rValue ) return; break; + case RTREE_LT: if( xN < p->u.rValue ) return; break; + case RTREE_GE: if( xN >= p->u.rValue ) return; break; + case RTREE_GT: if( xN > p->u.rValue ) return; break; + default: if( xN == p->u.rValue ) return; break; + } + *peWithin = NOT_WITHIN; +} + +/* +** One of the cells in node pNode is guaranteed to have a 64-bit +** integer value equal to iRowid. Return the index of this cell. +*/ +static int nodeRowidIndex( + Rtree *pRtree, + RtreeNode *pNode, + i64 iRowid, + int *piIndex +){ + int ii; + int nCell = NCELL(pNode); + assert( nCell<200 ); + for(ii=0; iipParent; + if( pParent ){ + return nodeRowidIndex(pRtree, pParent, pNode->iNode, piIndex); + } + *piIndex = -1; + return SQLITE_OK; +} + +/* +** Compare two search points. Return negative, zero, or positive if the first +** is less than, equal to, or greater than the second. +** +** The rScore is the primary key. Smaller rScore values come first. +** If the rScore is a tie, then use iLevel as the tie breaker with smaller +** iLevel values coming first. In this way, if rScore is the same for all +** SearchPoints, then iLevel becomes the deciding factor and the result +** is a depth-first search, which is the desired default behavior. +*/ +static int rtreeSearchPointCompare( + const RtreeSearchPoint *pA, + const RtreeSearchPoint *pB +){ + if( pA->rScorerScore ) return -1; + if( pA->rScore>pB->rScore ) return +1; + if( pA->iLeveliLevel ) return -1; + if( pA->iLevel>pB->iLevel ) return +1; + return 0; +} + +/* +** Interchange to search points in a cursor. +*/ +static void rtreeSearchPointSwap(RtreeCursor *p, int i, int j){ + RtreeSearchPoint t = p->aPoint[i]; + assert( iaPoint[i] = p->aPoint[j]; + p->aPoint[j] = t; + i++; j++; + if( i=RTREE_CACHE_SZ ){ + nodeRelease(RTREE_OF_CURSOR(p), p->aNode[i]); + p->aNode[i] = 0; + }else{ + RtreeNode *pTemp = p->aNode[i]; + p->aNode[i] = p->aNode[j]; + p->aNode[j] = pTemp; + } + } +} + +/* +** Return the search point with the lowest current score. +*/ +static RtreeSearchPoint *rtreeSearchPointFirst(RtreeCursor *pCur){ + return pCur->bPoint ? &pCur->sPoint : pCur->nPoint ? pCur->aPoint : 0; +} + +/* +** Get the RtreeNode for the search point with the lowest score. +*/ +static RtreeNode *rtreeNodeOfFirstSearchPoint(RtreeCursor *pCur, int *pRC){ + sqlite3_int64 id; + int ii = 1 - pCur->bPoint; + assert( ii==0 || ii==1 ); + assert( pCur->bPoint || pCur->nPoint ); + if( pCur->aNode[ii]==0 ){ + assert( pRC!=0 ); + id = ii ? pCur->aPoint[0].id : pCur->sPoint.id; + *pRC = nodeAcquire(RTREE_OF_CURSOR(pCur), id, 0, &pCur->aNode[ii]); + } + return pCur->aNode[ii]; +} + +/* +** Push a new element onto the priority queue +*/ +static RtreeSearchPoint *rtreeEnqueue( + RtreeCursor *pCur, /* The cursor */ + RtreeDValue rScore, /* Score for the new search point */ + u8 iLevel /* Level for the new search point */ +){ + int i, j; + RtreeSearchPoint *pNew; + if( pCur->nPoint>=pCur->nPointAlloc ){ + int nNew = pCur->nPointAlloc*2 + 8; + pNew = sqlite3_realloc(pCur->aPoint, nNew*sizeof(pCur->aPoint[0])); + if( pNew==0 ) return 0; + pCur->aPoint = pNew; + pCur->nPointAlloc = nNew; + } + i = pCur->nPoint++; + pNew = pCur->aPoint + i; + pNew->rScore = rScore; + pNew->iLevel = iLevel; + assert( iLevel<=RTREE_MAX_DEPTH ); + while( i>0 ){ + RtreeSearchPoint *pParent; + j = (i-1)/2; + pParent = pCur->aPoint + j; + if( rtreeSearchPointCompare(pNew, pParent)>=0 ) break; + rtreeSearchPointSwap(pCur, j, i); + i = j; + pNew = pParent; + } + return pNew; +} + +/* +** Allocate a new RtreeSearchPoint and return a pointer to it. Return +** NULL if malloc fails. +*/ +static RtreeSearchPoint *rtreeSearchPointNew( + RtreeCursor *pCur, /* The cursor */ + RtreeDValue rScore, /* Score for the new search point */ + u8 iLevel /* Level for the new search point */ +){ + RtreeSearchPoint *pNew, *pFirst; + pFirst = rtreeSearchPointFirst(pCur); + pCur->anQueue[iLevel]++; + if( pFirst==0 + || pFirst->rScore>rScore + || (pFirst->rScore==rScore && pFirst->iLevel>iLevel) + ){ + if( pCur->bPoint ){ + int ii; + pNew = rtreeEnqueue(pCur, rScore, iLevel); + if( pNew==0 ) return 0; + ii = (int)(pNew - pCur->aPoint) + 1; + if( iiaNode[ii]==0 ); + pCur->aNode[ii] = pCur->aNode[0]; + }else{ + nodeRelease(RTREE_OF_CURSOR(pCur), pCur->aNode[0]); + } + pCur->aNode[0] = 0; + *pNew = pCur->sPoint; + } + pCur->sPoint.rScore = rScore; + pCur->sPoint.iLevel = iLevel; + pCur->bPoint = 1; + return &pCur->sPoint; + }else{ + return rtreeEnqueue(pCur, rScore, iLevel); + } +} + +#if 0 +/* Tracing routines for the RtreeSearchPoint queue */ +static void tracePoint(RtreeSearchPoint *p, int idx, RtreeCursor *pCur){ + if( idx<0 ){ printf(" s"); }else{ printf("%2d", idx); } + printf(" %d.%05lld.%02d %g %d", + p->iLevel, p->id, p->iCell, p->rScore, p->eWithin + ); + idx++; + if( idxaNode[idx]); + }else{ + printf("\n"); + } +} +static void traceQueue(RtreeCursor *pCur, const char *zPrefix){ + int ii; + printf("=== %9s ", zPrefix); + if( pCur->bPoint ){ + tracePoint(&pCur->sPoint, -1, pCur); + } + for(ii=0; iinPoint; ii++){ + if( ii>0 || pCur->bPoint ) printf(" "); + tracePoint(&pCur->aPoint[ii], ii, pCur); + } +} +# define RTREE_QUEUE_TRACE(A,B) traceQueue(A,B) +#else +# define RTREE_QUEUE_TRACE(A,B) /* no-op */ +#endif + +/* Remove the search point with the lowest current score. +*/ +static void rtreeSearchPointPop(RtreeCursor *p){ + int i, j, k, n; + i = 1 - p->bPoint; + assert( i==0 || i==1 ); + if( p->aNode[i] ){ + nodeRelease(RTREE_OF_CURSOR(p), p->aNode[i]); + p->aNode[i] = 0; + } + if( p->bPoint ){ + p->anQueue[p->sPoint.iLevel]--; + p->bPoint = 0; + }else if( p->nPoint ){ + p->anQueue[p->aPoint[0].iLevel]--; + n = --p->nPoint; + p->aPoint[0] = p->aPoint[n]; + if( naNode[1] = p->aNode[n+1]; + p->aNode[n+1] = 0; + } + i = 0; + while( (j = i*2+1)aPoint[k], &p->aPoint[j])<0 ){ + if( rtreeSearchPointCompare(&p->aPoint[k], &p->aPoint[i])<0 ){ + rtreeSearchPointSwap(p, i, k); + i = k; + }else{ + break; + } + }else{ + if( rtreeSearchPointCompare(&p->aPoint[j], &p->aPoint[i])<0 ){ + rtreeSearchPointSwap(p, i, j); + i = j; + }else{ + break; + } + } + } + } +} + + +/* +** Continue the search on cursor pCur until the front of the queue +** contains an entry suitable for returning as a result-set row, +** or until the RtreeSearchPoint queue is empty, indicating that the +** query has completed. +*/ +static int rtreeStepToLeaf(RtreeCursor *pCur){ + RtreeSearchPoint *p; + Rtree *pRtree = RTREE_OF_CURSOR(pCur); + RtreeNode *pNode; + int eWithin; + int rc = SQLITE_OK; + int nCell; + int nConstraint = pCur->nConstraint; + int ii; + int eInt; + RtreeSearchPoint x; + + eInt = pRtree->eCoordType==RTREE_COORD_INT32; + while( (p = rtreeSearchPointFirst(pCur))!=0 && p->iLevel>0 ){ + pNode = rtreeNodeOfFirstSearchPoint(pCur, &rc); + if( rc ) return rc; + nCell = NCELL(pNode); + assert( nCell<200 ); + while( p->iCellzData + (4+pRtree->nBytesPerCell*p->iCell); + eWithin = FULLY_WITHIN; + for(ii=0; iiaConstraint + ii; + if( pConstraint->op>=RTREE_MATCH ){ + rc = rtreeCallbackConstraint(pConstraint, eInt, pCellData, p, + &rScore, &eWithin); + if( rc ) return rc; + }else if( p->iLevel==1 ){ + rtreeLeafConstraint(pConstraint, eInt, pCellData, &eWithin); + }else{ + rtreeNonleafConstraint(pConstraint, eInt, pCellData, &eWithin); + } + if( eWithin==NOT_WITHIN ) break; + } + p->iCell++; + if( eWithin==NOT_WITHIN ) continue; + x.iLevel = p->iLevel - 1; + if( x.iLevel ){ + x.id = readInt64(pCellData); + x.iCell = 0; + }else{ + x.id = p->id; + x.iCell = p->iCell - 1; + } + if( p->iCell>=nCell ){ + RTREE_QUEUE_TRACE(pCur, "POP-S:"); + rtreeSearchPointPop(pCur); + } + if( rScoreeWithin = eWithin; + p->id = x.id; + p->iCell = x.iCell; + RTREE_QUEUE_TRACE(pCur, "PUSH-S:"); + break; + } + if( p->iCell>=nCell ){ + RTREE_QUEUE_TRACE(pCur, "POP-Se:"); + rtreeSearchPointPop(pCur); + } + } + pCur->atEOF = p==0; + return SQLITE_OK; +} + +/* +** Rtree virtual table module xNext method. +*/ +static int rtreeNext(sqlite3_vtab_cursor *pVtabCursor){ + RtreeCursor *pCsr = (RtreeCursor *)pVtabCursor; + int rc = SQLITE_OK; + + /* Move to the next entry that matches the configured constraints. */ + RTREE_QUEUE_TRACE(pCsr, "POP-Nx:"); + rtreeSearchPointPop(pCsr); + rc = rtreeStepToLeaf(pCsr); + return rc; +} + +/* +** Rtree virtual table module xRowid method. +*/ +static int rtreeRowid(sqlite3_vtab_cursor *pVtabCursor, sqlite_int64 *pRowid){ + RtreeCursor *pCsr = (RtreeCursor *)pVtabCursor; + RtreeSearchPoint *p = rtreeSearchPointFirst(pCsr); + int rc = SQLITE_OK; + RtreeNode *pNode = rtreeNodeOfFirstSearchPoint(pCsr, &rc); + if( rc==SQLITE_OK && p ){ + *pRowid = nodeGetRowid(RTREE_OF_CURSOR(pCsr), pNode, p->iCell); + } + return rc; +} + +/* +** Rtree virtual table module xColumn method. +*/ +static int rtreeColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i){ + Rtree *pRtree = (Rtree *)cur->pVtab; + RtreeCursor *pCsr = (RtreeCursor *)cur; + RtreeSearchPoint *p = rtreeSearchPointFirst(pCsr); + RtreeCoord c; + int rc = SQLITE_OK; + RtreeNode *pNode = rtreeNodeOfFirstSearchPoint(pCsr, &rc); + + if( rc ) return rc; + if( p==0 ) return SQLITE_OK; + if( i==0 ){ + sqlite3_result_int64(ctx, nodeGetRowid(pRtree, pNode, p->iCell)); + }else{ + if( rc ) return rc; + nodeGetCoord(pRtree, pNode, p->iCell, i-1, &c); +#ifndef SQLITE_RTREE_INT_ONLY + if( pRtree->eCoordType==RTREE_COORD_REAL32 ){ + sqlite3_result_double(ctx, c.f); + }else +#endif + { + assert( pRtree->eCoordType==RTREE_COORD_INT32 ); + sqlite3_result_int(ctx, c.i); + } + } + return SQLITE_OK; +} + +/* +** Use nodeAcquire() to obtain the leaf node containing the record with +** rowid iRowid. If successful, set *ppLeaf to point to the node and +** return SQLITE_OK. If there is no such record in the table, set +** *ppLeaf to 0 and return SQLITE_OK. If an error occurs, set *ppLeaf +** to zero and return an SQLite error code. +*/ +static int findLeafNode( + Rtree *pRtree, /* RTree to search */ + i64 iRowid, /* The rowid searching for */ + RtreeNode **ppLeaf, /* Write the node here */ + sqlite3_int64 *piNode /* Write the node-id here */ +){ + int rc; + *ppLeaf = 0; + sqlite3_bind_int64(pRtree->pReadRowid, 1, iRowid); + if( sqlite3_step(pRtree->pReadRowid)==SQLITE_ROW ){ + i64 iNode = sqlite3_column_int64(pRtree->pReadRowid, 0); + if( piNode ) *piNode = iNode; + rc = nodeAcquire(pRtree, iNode, 0, ppLeaf); + sqlite3_reset(pRtree->pReadRowid); + }else{ + rc = sqlite3_reset(pRtree->pReadRowid); + } + return rc; +} + +/* +** This function is called to configure the RtreeConstraint object passed +** as the second argument for a MATCH constraint. The value passed as the +** first argument to this function is the right-hand operand to the MATCH +** operator. +*/ +static int deserializeGeometry(sqlite3_value *pValue, RtreeConstraint *pCons){ + RtreeMatchArg *pBlob; /* BLOB returned by geometry function */ + sqlite3_rtree_query_info *pInfo; /* Callback information */ + int nBlob; /* Size of the geometry function blob */ + int nExpected; /* Expected size of the BLOB */ + + /* Check that value is actually a blob. */ + if( sqlite3_value_type(pValue)!=SQLITE_BLOB ) return SQLITE_ERROR; + + /* Check that the blob is roughly the right size. */ + nBlob = sqlite3_value_bytes(pValue); + if( nBlob<(int)sizeof(RtreeMatchArg) ){ + return SQLITE_ERROR; + } + + pInfo = (sqlite3_rtree_query_info*)sqlite3_malloc( sizeof(*pInfo)+nBlob ); + if( !pInfo ) return SQLITE_NOMEM; + memset(pInfo, 0, sizeof(*pInfo)); + pBlob = (RtreeMatchArg*)&pInfo[1]; + + memcpy(pBlob, sqlite3_value_blob(pValue), nBlob); + nExpected = (int)(sizeof(RtreeMatchArg) + + pBlob->nParam*sizeof(sqlite3_value*) + + (pBlob->nParam-1)*sizeof(RtreeDValue)); + if( pBlob->magic!=RTREE_GEOMETRY_MAGIC || nBlob!=nExpected ){ + sqlite3_free(pInfo); + return SQLITE_ERROR; + } + pInfo->pContext = pBlob->cb.pContext; + pInfo->nParam = pBlob->nParam; + pInfo->aParam = pBlob->aParam; + pInfo->apSqlParam = pBlob->apSqlParam; + + if( pBlob->cb.xGeom ){ + pCons->u.xGeom = pBlob->cb.xGeom; + }else{ + pCons->op = RTREE_QUERY; + pCons->u.xQueryFunc = pBlob->cb.xQueryFunc; + } + pCons->pInfo = pInfo; + return SQLITE_OK; +} + +/* +** Rtree virtual table module xFilter method. +*/ +static int rtreeFilter( + sqlite3_vtab_cursor *pVtabCursor, + int idxNum, const char *idxStr, + int argc, sqlite3_value **argv +){ + Rtree *pRtree = (Rtree *)pVtabCursor->pVtab; + RtreeCursor *pCsr = (RtreeCursor *)pVtabCursor; + RtreeNode *pRoot = 0; + int ii; + int rc = SQLITE_OK; + int iCell = 0; + + rtreeReference(pRtree); + + /* Reset the cursor to the same state as rtreeOpen() leaves it in. */ + freeCursorConstraints(pCsr); + sqlite3_free(pCsr->aPoint); + memset(pCsr, 0, sizeof(RtreeCursor)); + pCsr->base.pVtab = (sqlite3_vtab*)pRtree; + + pCsr->iStrategy = idxNum; + if( idxNum==1 ){ + /* Special case - lookup by rowid. */ + RtreeNode *pLeaf; /* Leaf on which the required cell resides */ + RtreeSearchPoint *p; /* Search point for the leaf */ + i64 iRowid = sqlite3_value_int64(argv[0]); + i64 iNode = 0; + rc = findLeafNode(pRtree, iRowid, &pLeaf, &iNode); + if( rc==SQLITE_OK && pLeaf!=0 ){ + p = rtreeSearchPointNew(pCsr, RTREE_ZERO, 0); + assert( p!=0 ); /* Always returns pCsr->sPoint */ + pCsr->aNode[0] = pLeaf; + p->id = iNode; + p->eWithin = PARTLY_WITHIN; + rc = nodeRowidIndex(pRtree, pLeaf, iRowid, &iCell); + p->iCell = iCell; + RTREE_QUEUE_TRACE(pCsr, "PUSH-F1:"); + }else{ + pCsr->atEOF = 1; + } + }else{ + /* Normal case - r-tree scan. Set up the RtreeCursor.aConstraint array + ** with the configured constraints. + */ + rc = nodeAcquire(pRtree, 1, 0, &pRoot); + if( rc==SQLITE_OK && argc>0 ){ + pCsr->aConstraint = sqlite3_malloc(sizeof(RtreeConstraint)*argc); + pCsr->nConstraint = argc; + if( !pCsr->aConstraint ){ + rc = SQLITE_NOMEM; + }else{ + memset(pCsr->aConstraint, 0, sizeof(RtreeConstraint)*argc); + memset(pCsr->anQueue, 0, sizeof(u32)*(pRtree->iDepth + 1)); + assert( (idxStr==0 && argc==0) + || (idxStr && (int)strlen(idxStr)==argc*2) ); + for(ii=0; iiaConstraint[ii]; + p->op = idxStr[ii*2]; + p->iCoord = idxStr[ii*2+1]-'0'; + if( p->op>=RTREE_MATCH ){ + /* A MATCH operator. The right-hand-side must be a blob that + ** can be cast into an RtreeMatchArg object. One created using + ** an sqlite3_rtree_geometry_callback() SQL user function. + */ + rc = deserializeGeometry(argv[ii], p); + if( rc!=SQLITE_OK ){ + break; + } + p->pInfo->nCoord = pRtree->nDim*2; + p->pInfo->anQueue = pCsr->anQueue; + p->pInfo->mxLevel = pRtree->iDepth + 1; + }else{ +#ifdef SQLITE_RTREE_INT_ONLY + p->u.rValue = sqlite3_value_int64(argv[ii]); +#else + p->u.rValue = sqlite3_value_double(argv[ii]); +#endif + } + } + } + } + if( rc==SQLITE_OK ){ + RtreeSearchPoint *pNew; + pNew = rtreeSearchPointNew(pCsr, RTREE_ZERO, pRtree->iDepth+1); + if( pNew==0 ) return SQLITE_NOMEM; + pNew->id = 1; + pNew->iCell = 0; + pNew->eWithin = PARTLY_WITHIN; + assert( pCsr->bPoint==1 ); + pCsr->aNode[0] = pRoot; + pRoot = 0; + RTREE_QUEUE_TRACE(pCsr, "PUSH-Fm:"); + rc = rtreeStepToLeaf(pCsr); + } + } + + nodeRelease(pRtree, pRoot); + rtreeRelease(pRtree); + return rc; +} + +/* +** Set the pIdxInfo->estimatedRows variable to nRow. Unless this +** extension is currently being used by a version of SQLite too old to +** support estimatedRows. In that case this function is a no-op. +*/ +static void setEstimatedRows(sqlite3_index_info *pIdxInfo, i64 nRow){ +#if SQLITE_VERSION_NUMBER>=3008002 + if( sqlite3_libversion_number()>=3008002 ){ + pIdxInfo->estimatedRows = nRow; + } +#endif +} + +/* +** Rtree virtual table module xBestIndex method. There are three +** table scan strategies to choose from (in order from most to +** least desirable): +** +** idxNum idxStr Strategy +** ------------------------------------------------ +** 1 Unused Direct lookup by rowid. +** 2 See below R-tree query or full-table scan. +** ------------------------------------------------ +** +** If strategy 1 is used, then idxStr is not meaningful. If strategy +** 2 is used, idxStr is formatted to contain 2 bytes for each +** constraint used. The first two bytes of idxStr correspond to +** the constraint in sqlite3_index_info.aConstraintUsage[] with +** (argvIndex==1) etc. +** +** The first of each pair of bytes in idxStr identifies the constraint +** operator as follows: +** +** Operator Byte Value +** ---------------------- +** = 0x41 ('A') +** <= 0x42 ('B') +** < 0x43 ('C') +** >= 0x44 ('D') +** > 0x45 ('E') +** MATCH 0x46 ('F') +** ---------------------- +** +** The second of each pair of bytes identifies the coordinate column +** to which the constraint applies. The leftmost coordinate column +** is 'a', the second from the left 'b' etc. +*/ +static int rtreeBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){ + Rtree *pRtree = (Rtree*)tab; + int rc = SQLITE_OK; + int ii; + int bMatch = 0; /* True if there exists a MATCH constraint */ + i64 nRow; /* Estimated rows returned by this scan */ + + int iIdx = 0; + char zIdxStr[RTREE_MAX_DIMENSIONS*8+1]; + memset(zIdxStr, 0, sizeof(zIdxStr)); + + /* Check if there exists a MATCH constraint - even an unusable one. If there + ** is, do not consider the lookup-by-rowid plan as using such a plan would + ** require the VDBE to evaluate the MATCH constraint, which is not currently + ** possible. */ + for(ii=0; iinConstraint; ii++){ + if( pIdxInfo->aConstraint[ii].op==SQLITE_INDEX_CONSTRAINT_MATCH ){ + bMatch = 1; + } + } + + assert( pIdxInfo->idxStr==0 ); + for(ii=0; iinConstraint && iIdx<(int)(sizeof(zIdxStr)-1); ii++){ + struct sqlite3_index_constraint *p = &pIdxInfo->aConstraint[ii]; + + if( bMatch==0 && p->usable + && p->iColumn==0 && p->op==SQLITE_INDEX_CONSTRAINT_EQ + ){ + /* We have an equality constraint on the rowid. Use strategy 1. */ + int jj; + for(jj=0; jjaConstraintUsage[jj].argvIndex = 0; + pIdxInfo->aConstraintUsage[jj].omit = 0; + } + pIdxInfo->idxNum = 1; + pIdxInfo->aConstraintUsage[ii].argvIndex = 1; + pIdxInfo->aConstraintUsage[jj].omit = 1; + + /* This strategy involves a two rowid lookups on an B-Tree structures + ** and then a linear search of an R-Tree node. This should be + ** considered almost as quick as a direct rowid lookup (for which + ** sqlite uses an internal cost of 0.0). It is expected to return + ** a single row. + */ + pIdxInfo->estimatedCost = 30.0; + setEstimatedRows(pIdxInfo, 1); + return SQLITE_OK; + } + + if( p->usable && (p->iColumn>0 || p->op==SQLITE_INDEX_CONSTRAINT_MATCH) ){ + u8 op; + switch( p->op ){ + case SQLITE_INDEX_CONSTRAINT_EQ: op = RTREE_EQ; break; + case SQLITE_INDEX_CONSTRAINT_GT: op = RTREE_GT; break; + case SQLITE_INDEX_CONSTRAINT_LE: op = RTREE_LE; break; + case SQLITE_INDEX_CONSTRAINT_LT: op = RTREE_LT; break; + case SQLITE_INDEX_CONSTRAINT_GE: op = RTREE_GE; break; + default: + assert( p->op==SQLITE_INDEX_CONSTRAINT_MATCH ); + op = RTREE_MATCH; + break; + } + zIdxStr[iIdx++] = op; + zIdxStr[iIdx++] = p->iColumn - 1 + '0'; + pIdxInfo->aConstraintUsage[ii].argvIndex = (iIdx/2); + pIdxInfo->aConstraintUsage[ii].omit = 1; + } + } + + pIdxInfo->idxNum = 2; + pIdxInfo->needToFreeIdxStr = 1; + if( iIdx>0 && 0==(pIdxInfo->idxStr = sqlite3_mprintf("%s", zIdxStr)) ){ + return SQLITE_NOMEM; + } + + nRow = pRtree->nRowEst >> (iIdx/2); + pIdxInfo->estimatedCost = (double)6.0 * (double)nRow; + setEstimatedRows(pIdxInfo, nRow); + + return rc; +} + +/* +** Return the N-dimensional volumn of the cell stored in *p. +*/ +static RtreeDValue cellArea(Rtree *pRtree, RtreeCell *p){ + RtreeDValue area = (RtreeDValue)1; + int ii; + for(ii=0; ii<(pRtree->nDim*2); ii+=2){ + area = (area * (DCOORD(p->aCoord[ii+1]) - DCOORD(p->aCoord[ii]))); + } + return area; +} + +/* +** Return the margin length of cell p. The margin length is the sum +** of the objects size in each dimension. +*/ +static RtreeDValue cellMargin(Rtree *pRtree, RtreeCell *p){ + RtreeDValue margin = (RtreeDValue)0; + int ii; + for(ii=0; ii<(pRtree->nDim*2); ii+=2){ + margin += (DCOORD(p->aCoord[ii+1]) - DCOORD(p->aCoord[ii])); + } + return margin; +} + +/* +** Store the union of cells p1 and p2 in p1. +*/ +static void cellUnion(Rtree *pRtree, RtreeCell *p1, RtreeCell *p2){ + int ii; + if( pRtree->eCoordType==RTREE_COORD_REAL32 ){ + for(ii=0; ii<(pRtree->nDim*2); ii+=2){ + p1->aCoord[ii].f = MIN(p1->aCoord[ii].f, p2->aCoord[ii].f); + p1->aCoord[ii+1].f = MAX(p1->aCoord[ii+1].f, p2->aCoord[ii+1].f); + } + }else{ + for(ii=0; ii<(pRtree->nDim*2); ii+=2){ + p1->aCoord[ii].i = MIN(p1->aCoord[ii].i, p2->aCoord[ii].i); + p1->aCoord[ii+1].i = MAX(p1->aCoord[ii+1].i, p2->aCoord[ii+1].i); + } + } +} + +/* +** Return true if the area covered by p2 is a subset of the area covered +** by p1. False otherwise. +*/ +static int cellContains(Rtree *pRtree, RtreeCell *p1, RtreeCell *p2){ + int ii; + int isInt = (pRtree->eCoordType==RTREE_COORD_INT32); + for(ii=0; ii<(pRtree->nDim*2); ii+=2){ + RtreeCoord *a1 = &p1->aCoord[ii]; + RtreeCoord *a2 = &p2->aCoord[ii]; + if( (!isInt && (a2[0].fa1[1].f)) + || ( isInt && (a2[0].ia1[1].i)) + ){ + return 0; + } + } + return 1; +} + +/* +** Return the amount cell p would grow by if it were unioned with pCell. +*/ +static RtreeDValue cellGrowth(Rtree *pRtree, RtreeCell *p, RtreeCell *pCell){ + RtreeDValue area; + RtreeCell cell; + memcpy(&cell, p, sizeof(RtreeCell)); + area = cellArea(pRtree, &cell); + cellUnion(pRtree, &cell, pCell); + return (cellArea(pRtree, &cell)-area); +} + +static RtreeDValue cellOverlap( + Rtree *pRtree, + RtreeCell *p, + RtreeCell *aCell, + int nCell +){ + int ii; + RtreeDValue overlap = RTREE_ZERO; + for(ii=0; iinDim*2); jj+=2){ + RtreeDValue x1, x2; + x1 = MAX(DCOORD(p->aCoord[jj]), DCOORD(aCell[ii].aCoord[jj])); + x2 = MIN(DCOORD(p->aCoord[jj+1]), DCOORD(aCell[ii].aCoord[jj+1])); + if( x2iDepth-iHeight); ii++){ + int iCell; + sqlite3_int64 iBest = 0; + + RtreeDValue fMinGrowth = RTREE_ZERO; + RtreeDValue fMinArea = RTREE_ZERO; + + int nCell = NCELL(pNode); + RtreeCell cell; + RtreeNode *pChild; + + RtreeCell *aCell = 0; + + /* Select the child node which will be enlarged the least if pCell + ** is inserted into it. Resolve ties by choosing the entry with + ** the smallest area. + */ + for(iCell=0; iCellpParent ){ + RtreeNode *pParent = p->pParent; + RtreeCell cell; + int iCell; + + if( nodeParentIndex(pRtree, p, &iCell) ){ + return SQLITE_CORRUPT_VTAB; + } + + nodeGetCell(pRtree, pParent, iCell, &cell); + if( !cellContains(pRtree, &cell, pCell) ){ + cellUnion(pRtree, &cell, pCell); + nodeOverwriteCell(pRtree, pParent, &cell, iCell); + } + + p = pParent; + } + return SQLITE_OK; +} + +/* +** Write mapping (iRowid->iNode) to the _rowid table. +*/ +static int rowidWrite(Rtree *pRtree, sqlite3_int64 iRowid, sqlite3_int64 iNode){ + sqlite3_bind_int64(pRtree->pWriteRowid, 1, iRowid); + sqlite3_bind_int64(pRtree->pWriteRowid, 2, iNode); + sqlite3_step(pRtree->pWriteRowid); + return sqlite3_reset(pRtree->pWriteRowid); +} + +/* +** Write mapping (iNode->iPar) to the _parent table. +*/ +static int parentWrite(Rtree *pRtree, sqlite3_int64 iNode, sqlite3_int64 iPar){ + sqlite3_bind_int64(pRtree->pWriteParent, 1, iNode); + sqlite3_bind_int64(pRtree->pWriteParent, 2, iPar); + sqlite3_step(pRtree->pWriteParent); + return sqlite3_reset(pRtree->pWriteParent); +} + +static int rtreeInsertCell(Rtree *, RtreeNode *, RtreeCell *, int); + + +/* +** Arguments aIdx, aDistance and aSpare all point to arrays of size +** nIdx. The aIdx array contains the set of integers from 0 to +** (nIdx-1) in no particular order. This function sorts the values +** in aIdx according to the indexed values in aDistance. For +** example, assuming the inputs: +** +** aIdx = { 0, 1, 2, 3 } +** aDistance = { 5.0, 2.0, 7.0, 6.0 } +** +** this function sets the aIdx array to contain: +** +** aIdx = { 0, 1, 2, 3 } +** +** The aSpare array is used as temporary working space by the +** sorting algorithm. +*/ +static void SortByDistance( + int *aIdx, + int nIdx, + RtreeDValue *aDistance, + int *aSpare +){ + if( nIdx>1 ){ + int iLeft = 0; + int iRight = 0; + + int nLeft = nIdx/2; + int nRight = nIdx-nLeft; + int *aLeft = aIdx; + int *aRight = &aIdx[nLeft]; + + SortByDistance(aLeft, nLeft, aDistance, aSpare); + SortByDistance(aRight, nRight, aDistance, aSpare); + + memcpy(aSpare, aLeft, sizeof(int)*nLeft); + aLeft = aSpare; + + while( iLeft1 ){ + + int iLeft = 0; + int iRight = 0; + + int nLeft = nIdx/2; + int nRight = nIdx-nLeft; + int *aLeft = aIdx; + int *aRight = &aIdx[nLeft]; + + SortByDimension(pRtree, aLeft, nLeft, iDim, aCell, aSpare); + SortByDimension(pRtree, aRight, nRight, iDim, aCell, aSpare); + + memcpy(aSpare, aLeft, sizeof(int)*nLeft); + aLeft = aSpare; + while( iLeftnDim+1)*(sizeof(int*)+nCell*sizeof(int)); + + aaSorted = (int **)sqlite3_malloc(nByte); + if( !aaSorted ){ + return SQLITE_NOMEM; + } + + aSpare = &((int *)&aaSorted[pRtree->nDim])[pRtree->nDim*nCell]; + memset(aaSorted, 0, nByte); + for(ii=0; iinDim; ii++){ + int jj; + aaSorted[ii] = &((int *)&aaSorted[pRtree->nDim])[ii*nCell]; + for(jj=0; jjnDim; ii++){ + RtreeDValue margin = RTREE_ZERO; + RtreeDValue fBestOverlap = RTREE_ZERO; + RtreeDValue fBestArea = RTREE_ZERO; + int iBestLeft = 0; + int nLeft; + + for( + nLeft=RTREE_MINCELLS(pRtree); + nLeft<=(nCell-RTREE_MINCELLS(pRtree)); + nLeft++ + ){ + RtreeCell left; + RtreeCell right; + int kk; + RtreeDValue overlap; + RtreeDValue area; + + memcpy(&left, &aCell[aaSorted[ii][0]], sizeof(RtreeCell)); + memcpy(&right, &aCell[aaSorted[ii][nCell-1]], sizeof(RtreeCell)); + for(kk=1; kk<(nCell-1); kk++){ + if( kk0 ){ + RtreeNode *pChild = nodeHashLookup(pRtree, iRowid); + if( pChild ){ + nodeRelease(pRtree, pChild->pParent); + nodeReference(pNode); + pChild->pParent = pNode; + } + } + return xSetMapping(pRtree, iRowid, pNode->iNode); +} + +static int SplitNode( + Rtree *pRtree, + RtreeNode *pNode, + RtreeCell *pCell, + int iHeight +){ + int i; + int newCellIsRight = 0; + + int rc = SQLITE_OK; + int nCell = NCELL(pNode); + RtreeCell *aCell; + int *aiUsed; + + RtreeNode *pLeft = 0; + RtreeNode *pRight = 0; + + RtreeCell leftbbox; + RtreeCell rightbbox; + + /* Allocate an array and populate it with a copy of pCell and + ** all cells from node pLeft. Then zero the original node. + */ + aCell = sqlite3_malloc((sizeof(RtreeCell)+sizeof(int))*(nCell+1)); + if( !aCell ){ + rc = SQLITE_NOMEM; + goto splitnode_out; + } + aiUsed = (int *)&aCell[nCell+1]; + memset(aiUsed, 0, sizeof(int)*(nCell+1)); + for(i=0; iiNode==1 ){ + pRight = nodeNew(pRtree, pNode); + pLeft = nodeNew(pRtree, pNode); + pRtree->iDepth++; + pNode->isDirty = 1; + writeInt16(pNode->zData, pRtree->iDepth); + }else{ + pLeft = pNode; + pRight = nodeNew(pRtree, pLeft->pParent); + nodeReference(pLeft); + } + + if( !pLeft || !pRight ){ + rc = SQLITE_NOMEM; + goto splitnode_out; + } + + memset(pLeft->zData, 0, pRtree->iNodeSize); + memset(pRight->zData, 0, pRtree->iNodeSize); + + rc = splitNodeStartree(pRtree, aCell, nCell, pLeft, pRight, + &leftbbox, &rightbbox); + if( rc!=SQLITE_OK ){ + goto splitnode_out; + } + + /* Ensure both child nodes have node numbers assigned to them by calling + ** nodeWrite(). Node pRight always needs a node number, as it was created + ** by nodeNew() above. But node pLeft sometimes already has a node number. + ** In this case avoid the all to nodeWrite(). + */ + if( SQLITE_OK!=(rc = nodeWrite(pRtree, pRight)) + || (0==pLeft->iNode && SQLITE_OK!=(rc = nodeWrite(pRtree, pLeft))) + ){ + goto splitnode_out; + } + + rightbbox.iRowid = pRight->iNode; + leftbbox.iRowid = pLeft->iNode; + + if( pNode->iNode==1 ){ + rc = rtreeInsertCell(pRtree, pLeft->pParent, &leftbbox, iHeight+1); + if( rc!=SQLITE_OK ){ + goto splitnode_out; + } + }else{ + RtreeNode *pParent = pLeft->pParent; + int iCell; + rc = nodeParentIndex(pRtree, pLeft, &iCell); + if( rc==SQLITE_OK ){ + nodeOverwriteCell(pRtree, pParent, &leftbbox, iCell); + rc = AdjustTree(pRtree, pParent, &leftbbox); + } + if( rc!=SQLITE_OK ){ + goto splitnode_out; + } + } + if( (rc = rtreeInsertCell(pRtree, pRight->pParent, &rightbbox, iHeight+1)) ){ + goto splitnode_out; + } + + for(i=0; iiRowid ){ + newCellIsRight = 1; + } + if( rc!=SQLITE_OK ){ + goto splitnode_out; + } + } + if( pNode->iNode==1 ){ + for(i=0; iiRowid, pLeft, iHeight); + } + + if( rc==SQLITE_OK ){ + rc = nodeRelease(pRtree, pRight); + pRight = 0; + } + if( rc==SQLITE_OK ){ + rc = nodeRelease(pRtree, pLeft); + pLeft = 0; + } + +splitnode_out: + nodeRelease(pRtree, pRight); + nodeRelease(pRtree, pLeft); + sqlite3_free(aCell); + return rc; +} + +/* +** If node pLeaf is not the root of the r-tree and its pParent pointer is +** still NULL, load all ancestor nodes of pLeaf into memory and populate +** the pLeaf->pParent chain all the way up to the root node. +** +** This operation is required when a row is deleted (or updated - an update +** is implemented as a delete followed by an insert). SQLite provides the +** rowid of the row to delete, which can be used to find the leaf on which +** the entry resides (argument pLeaf). Once the leaf is located, this +** function is called to determine its ancestry. +*/ +static int fixLeafParent(Rtree *pRtree, RtreeNode *pLeaf){ + int rc = SQLITE_OK; + RtreeNode *pChild = pLeaf; + while( rc==SQLITE_OK && pChild->iNode!=1 && pChild->pParent==0 ){ + int rc2 = SQLITE_OK; /* sqlite3_reset() return code */ + sqlite3_bind_int64(pRtree->pReadParent, 1, pChild->iNode); + rc = sqlite3_step(pRtree->pReadParent); + if( rc==SQLITE_ROW ){ + RtreeNode *pTest; /* Used to test for reference loops */ + i64 iNode; /* Node number of parent node */ + + /* Before setting pChild->pParent, test that we are not creating a + ** loop of references (as we would if, say, pChild==pParent). We don't + ** want to do this as it leads to a memory leak when trying to delete + ** the referenced counted node structures. + */ + iNode = sqlite3_column_int64(pRtree->pReadParent, 0); + for(pTest=pLeaf; pTest && pTest->iNode!=iNode; pTest=pTest->pParent); + if( !pTest ){ + rc2 = nodeAcquire(pRtree, iNode, 0, &pChild->pParent); + } + } + rc = sqlite3_reset(pRtree->pReadParent); + if( rc==SQLITE_OK ) rc = rc2; + if( rc==SQLITE_OK && !pChild->pParent ) rc = SQLITE_CORRUPT_VTAB; + pChild = pChild->pParent; + } + return rc; +} + +static int deleteCell(Rtree *, RtreeNode *, int, int); + +static int removeNode(Rtree *pRtree, RtreeNode *pNode, int iHeight){ + int rc; + int rc2; + RtreeNode *pParent = 0; + int iCell; + + assert( pNode->nRef==1 ); + + /* Remove the entry in the parent cell. */ + rc = nodeParentIndex(pRtree, pNode, &iCell); + if( rc==SQLITE_OK ){ + pParent = pNode->pParent; + pNode->pParent = 0; + rc = deleteCell(pRtree, pParent, iCell, iHeight+1); + } + rc2 = nodeRelease(pRtree, pParent); + if( rc==SQLITE_OK ){ + rc = rc2; + } + if( rc!=SQLITE_OK ){ + return rc; + } + + /* Remove the xxx_node entry. */ + sqlite3_bind_int64(pRtree->pDeleteNode, 1, pNode->iNode); + sqlite3_step(pRtree->pDeleteNode); + if( SQLITE_OK!=(rc = sqlite3_reset(pRtree->pDeleteNode)) ){ + return rc; + } + + /* Remove the xxx_parent entry. */ + sqlite3_bind_int64(pRtree->pDeleteParent, 1, pNode->iNode); + sqlite3_step(pRtree->pDeleteParent); + if( SQLITE_OK!=(rc = sqlite3_reset(pRtree->pDeleteParent)) ){ + return rc; + } + + /* Remove the node from the in-memory hash table and link it into + ** the Rtree.pDeleted list. Its contents will be re-inserted later on. + */ + nodeHashDelete(pRtree, pNode); + pNode->iNode = iHeight; + pNode->pNext = pRtree->pDeleted; + pNode->nRef++; + pRtree->pDeleted = pNode; + + return SQLITE_OK; +} + +static int fixBoundingBox(Rtree *pRtree, RtreeNode *pNode){ + RtreeNode *pParent = pNode->pParent; + int rc = SQLITE_OK; + if( pParent ){ + int ii; + int nCell = NCELL(pNode); + RtreeCell box; /* Bounding box for pNode */ + nodeGetCell(pRtree, pNode, 0, &box); + for(ii=1; iiiNode; + rc = nodeParentIndex(pRtree, pNode, &ii); + if( rc==SQLITE_OK ){ + nodeOverwriteCell(pRtree, pParent, &box, ii); + rc = fixBoundingBox(pRtree, pParent); + } + } + return rc; +} + +/* +** Delete the cell at index iCell of node pNode. After removing the +** cell, adjust the r-tree data structure if required. +*/ +static int deleteCell(Rtree *pRtree, RtreeNode *pNode, int iCell, int iHeight){ + RtreeNode *pParent; + int rc; + + if( SQLITE_OK!=(rc = fixLeafParent(pRtree, pNode)) ){ + return rc; + } + + /* Remove the cell from the node. This call just moves bytes around + ** the in-memory node image, so it cannot fail. + */ + nodeDeleteCell(pRtree, pNode, iCell); + + /* If the node is not the tree root and now has less than the minimum + ** number of cells, remove it from the tree. Otherwise, update the + ** cell in the parent node so that it tightly contains the updated + ** node. + */ + pParent = pNode->pParent; + assert( pParent || pNode->iNode==1 ); + if( pParent ){ + if( NCELL(pNode)nDim; iDim++){ + aCenterCoord[iDim] += DCOORD(aCell[ii].aCoord[iDim*2]); + aCenterCoord[iDim] += DCOORD(aCell[ii].aCoord[iDim*2+1]); + } + } + for(iDim=0; iDimnDim; iDim++){ + aCenterCoord[iDim] = (aCenterCoord[iDim]/(nCell*(RtreeDValue)2)); + } + + for(ii=0; iinDim; iDim++){ + RtreeDValue coord = (DCOORD(aCell[ii].aCoord[iDim*2+1]) - + DCOORD(aCell[ii].aCoord[iDim*2])); + aDistance[ii] += (coord-aCenterCoord[iDim])*(coord-aCenterCoord[iDim]); + } + } + + SortByDistance(aOrder, nCell, aDistance, aSpare); + nodeZero(pRtree, pNode); + + for(ii=0; rc==SQLITE_OK && ii<(nCell-(RTREE_MINCELLS(pRtree)+1)); ii++){ + RtreeCell *p = &aCell[aOrder[ii]]; + nodeInsertCell(pRtree, pNode, p); + if( p->iRowid==pCell->iRowid ){ + if( iHeight==0 ){ + rc = rowidWrite(pRtree, p->iRowid, pNode->iNode); + }else{ + rc = parentWrite(pRtree, p->iRowid, pNode->iNode); + } + } + } + if( rc==SQLITE_OK ){ + rc = fixBoundingBox(pRtree, pNode); + } + for(; rc==SQLITE_OK && iiiNode currently contains + ** the height of the sub-tree headed by the cell. + */ + RtreeNode *pInsert; + RtreeCell *p = &aCell[aOrder[ii]]; + rc = ChooseLeaf(pRtree, p, iHeight, &pInsert); + if( rc==SQLITE_OK ){ + int rc2; + rc = rtreeInsertCell(pRtree, pInsert, p, iHeight); + rc2 = nodeRelease(pRtree, pInsert); + if( rc==SQLITE_OK ){ + rc = rc2; + } + } + } + + sqlite3_free(aCell); + return rc; +} + +/* +** Insert cell pCell into node pNode. Node pNode is the head of a +** subtree iHeight high (leaf nodes have iHeight==0). +*/ +static int rtreeInsertCell( + Rtree *pRtree, + RtreeNode *pNode, + RtreeCell *pCell, + int iHeight +){ + int rc = SQLITE_OK; + if( iHeight>0 ){ + RtreeNode *pChild = nodeHashLookup(pRtree, pCell->iRowid); + if( pChild ){ + nodeRelease(pRtree, pChild->pParent); + nodeReference(pNode); + pChild->pParent = pNode; + } + } + if( nodeInsertCell(pRtree, pNode, pCell) ){ + if( iHeight<=pRtree->iReinsertHeight || pNode->iNode==1){ + rc = SplitNode(pRtree, pNode, pCell, iHeight); + }else{ + pRtree->iReinsertHeight = iHeight; + rc = Reinsert(pRtree, pNode, pCell, iHeight); + } + }else{ + rc = AdjustTree(pRtree, pNode, pCell); + if( rc==SQLITE_OK ){ + if( iHeight==0 ){ + rc = rowidWrite(pRtree, pCell->iRowid, pNode->iNode); + }else{ + rc = parentWrite(pRtree, pCell->iRowid, pNode->iNode); + } + } + } + return rc; +} + +static int reinsertNodeContent(Rtree *pRtree, RtreeNode *pNode){ + int ii; + int rc = SQLITE_OK; + int nCell = NCELL(pNode); + + for(ii=0; rc==SQLITE_OK && iiiNode currently contains + ** the height of the sub-tree headed by the cell. + */ + rc = ChooseLeaf(pRtree, &cell, (int)pNode->iNode, &pInsert); + if( rc==SQLITE_OK ){ + int rc2; + rc = rtreeInsertCell(pRtree, pInsert, &cell, (int)pNode->iNode); + rc2 = nodeRelease(pRtree, pInsert); + if( rc==SQLITE_OK ){ + rc = rc2; + } + } + } + return rc; +} + +/* +** Select a currently unused rowid for a new r-tree record. +*/ +static int newRowid(Rtree *pRtree, i64 *piRowid){ + int rc; + sqlite3_bind_null(pRtree->pWriteRowid, 1); + sqlite3_bind_null(pRtree->pWriteRowid, 2); + sqlite3_step(pRtree->pWriteRowid); + rc = sqlite3_reset(pRtree->pWriteRowid); + *piRowid = sqlite3_last_insert_rowid(pRtree->db); + return rc; +} + +/* +** Remove the entry with rowid=iDelete from the r-tree structure. +*/ +static int rtreeDeleteRowid(Rtree *pRtree, sqlite3_int64 iDelete){ + int rc; /* Return code */ + RtreeNode *pLeaf = 0; /* Leaf node containing record iDelete */ + int iCell; /* Index of iDelete cell in pLeaf */ + RtreeNode *pRoot; /* Root node of rtree structure */ + + + /* Obtain a reference to the root node to initialize Rtree.iDepth */ + rc = nodeAcquire(pRtree, 1, 0, &pRoot); + + /* Obtain a reference to the leaf node that contains the entry + ** about to be deleted. + */ + if( rc==SQLITE_OK ){ + rc = findLeafNode(pRtree, iDelete, &pLeaf, 0); + } + + /* Delete the cell in question from the leaf node. */ + if( rc==SQLITE_OK ){ + int rc2; + rc = nodeRowidIndex(pRtree, pLeaf, iDelete, &iCell); + if( rc==SQLITE_OK ){ + rc = deleteCell(pRtree, pLeaf, iCell, 0); + } + rc2 = nodeRelease(pRtree, pLeaf); + if( rc==SQLITE_OK ){ + rc = rc2; + } + } + + /* Delete the corresponding entry in the _rowid table. */ + if( rc==SQLITE_OK ){ + sqlite3_bind_int64(pRtree->pDeleteRowid, 1, iDelete); + sqlite3_step(pRtree->pDeleteRowid); + rc = sqlite3_reset(pRtree->pDeleteRowid); + } + + /* Check if the root node now has exactly one child. If so, remove + ** it, schedule the contents of the child for reinsertion and + ** reduce the tree height by one. + ** + ** This is equivalent to copying the contents of the child into + ** the root node (the operation that Gutman's paper says to perform + ** in this scenario). + */ + if( rc==SQLITE_OK && pRtree->iDepth>0 && NCELL(pRoot)==1 ){ + int rc2; + RtreeNode *pChild; + i64 iChild = nodeGetRowid(pRtree, pRoot, 0); + rc = nodeAcquire(pRtree, iChild, pRoot, &pChild); + if( rc==SQLITE_OK ){ + rc = removeNode(pRtree, pChild, pRtree->iDepth-1); + } + rc2 = nodeRelease(pRtree, pChild); + if( rc==SQLITE_OK ) rc = rc2; + if( rc==SQLITE_OK ){ + pRtree->iDepth--; + writeInt16(pRoot->zData, pRtree->iDepth); + pRoot->isDirty = 1; + } + } + + /* Re-insert the contents of any underfull nodes removed from the tree. */ + for(pLeaf=pRtree->pDeleted; pLeaf; pLeaf=pRtree->pDeleted){ + if( rc==SQLITE_OK ){ + rc = reinsertNodeContent(pRtree, pLeaf); + } + pRtree->pDeleted = pLeaf->pNext; + sqlite3_free(pLeaf); + } + + /* Release the reference to the root node. */ + if( rc==SQLITE_OK ){ + rc = nodeRelease(pRtree, pRoot); + }else{ + nodeRelease(pRtree, pRoot); + } + + return rc; +} + +/* +** Rounding constants for float->double conversion. +*/ +#define RNDTOWARDS (1.0 - 1.0/8388608.0) /* Round towards zero */ +#define RNDAWAY (1.0 + 1.0/8388608.0) /* Round away from zero */ + +#if !defined(SQLITE_RTREE_INT_ONLY) +/* +** Convert an sqlite3_value into an RtreeValue (presumably a float) +** while taking care to round toward negative or positive, respectively. +*/ +static RtreeValue rtreeValueDown(sqlite3_value *v){ + double d = sqlite3_value_double(v); + float f = (float)d; + if( f>d ){ + f = (float)(d*(d<0 ? RNDAWAY : RNDTOWARDS)); + } + return f; +} +static RtreeValue rtreeValueUp(sqlite3_value *v){ + double d = sqlite3_value_double(v); + float f = (float)d; + if( fbase.zErrMsg) to an appropriate value and returns +** SQLITE_CONSTRAINT. +** +** Parameter iCol is the index of the leftmost column involved in the +** constraint failure. If it is 0, then the constraint that failed is +** the unique constraint on the id column. Otherwise, it is the rtree +** (c1<=c2) constraint on columns iCol and iCol+1 that has failed. +** +** If an OOM occurs, SQLITE_NOMEM is returned instead of SQLITE_CONSTRAINT. +*/ +static int rtreeConstraintError(Rtree *pRtree, int iCol){ + sqlite3_stmt *pStmt = 0; + char *zSql; + int rc; + + assert( iCol==0 || iCol%2 ); + zSql = sqlite3_mprintf("SELECT * FROM %Q.%Q", pRtree->zDb, pRtree->zName); + if( zSql ){ + rc = sqlite3_prepare_v2(pRtree->db, zSql, -1, &pStmt, 0); + }else{ + rc = SQLITE_NOMEM; + } + sqlite3_free(zSql); + + if( rc==SQLITE_OK ){ + if( iCol==0 ){ + const char *zCol = sqlite3_column_name(pStmt, 0); + pRtree->base.zErrMsg = sqlite3_mprintf( + "UNIQUE constraint failed: %s.%s", pRtree->zName, zCol + ); + }else{ + const char *zCol1 = sqlite3_column_name(pStmt, iCol); + const char *zCol2 = sqlite3_column_name(pStmt, iCol+1); + pRtree->base.zErrMsg = sqlite3_mprintf( + "rtree constraint failed: %s.(%s<=%s)", pRtree->zName, zCol1, zCol2 + ); + } + } + + sqlite3_finalize(pStmt); + return (rc==SQLITE_OK ? SQLITE_CONSTRAINT : rc); +} + + + +/* +** The xUpdate method for rtree module virtual tables. +*/ +static int rtreeUpdate( + sqlite3_vtab *pVtab, + int nData, + sqlite3_value **azData, + sqlite_int64 *pRowid +){ + Rtree *pRtree = (Rtree *)pVtab; + int rc = SQLITE_OK; + RtreeCell cell; /* New cell to insert if nData>1 */ + int bHaveRowid = 0; /* Set to 1 after new rowid is determined */ + + rtreeReference(pRtree); + assert(nData>=1); + + cell.iRowid = 0; /* Used only to suppress a compiler warning */ + + /* Constraint handling. A write operation on an r-tree table may return + ** SQLITE_CONSTRAINT for two reasons: + ** + ** 1. A duplicate rowid value, or + ** 2. The supplied data violates the "x2>=x1" constraint. + ** + ** In the first case, if the conflict-handling mode is REPLACE, then + ** the conflicting row can be removed before proceeding. In the second + ** case, SQLITE_CONSTRAINT must be returned regardless of the + ** conflict-handling mode specified by the user. + */ + if( nData>1 ){ + int ii; + + /* Populate the cell.aCoord[] array. The first coordinate is azData[3]. + ** + ** NB: nData can only be less than nDim*2+3 if the rtree is mis-declared + ** with "column" that are interpreted as table constraints. + ** Example: CREATE VIRTUAL TABLE bad USING rtree(x,y,CHECK(y>5)); + ** This problem was discovered after years of use, so we silently ignore + ** these kinds of misdeclared tables to avoid breaking any legacy. + */ + assert( nData<=(pRtree->nDim*2 + 3) ); + +#ifndef SQLITE_RTREE_INT_ONLY + if( pRtree->eCoordType==RTREE_COORD_REAL32 ){ + for(ii=0; iicell.aCoord[ii+1].f ){ + rc = rtreeConstraintError(pRtree, ii+1); + goto constraint; + } + } + }else +#endif + { + for(ii=0; iicell.aCoord[ii+1].i ){ + rc = rtreeConstraintError(pRtree, ii+1); + goto constraint; + } + } + } + + /* If a rowid value was supplied, check if it is already present in + ** the table. If so, the constraint has failed. */ + if( sqlite3_value_type(azData[2])!=SQLITE_NULL ){ + cell.iRowid = sqlite3_value_int64(azData[2]); + if( sqlite3_value_type(azData[0])==SQLITE_NULL + || sqlite3_value_int64(azData[0])!=cell.iRowid + ){ + int steprc; + sqlite3_bind_int64(pRtree->pReadRowid, 1, cell.iRowid); + steprc = sqlite3_step(pRtree->pReadRowid); + rc = sqlite3_reset(pRtree->pReadRowid); + if( SQLITE_ROW==steprc ){ + if( sqlite3_vtab_on_conflict(pRtree->db)==SQLITE_REPLACE ){ + rc = rtreeDeleteRowid(pRtree, cell.iRowid); + }else{ + rc = rtreeConstraintError(pRtree, 0); + goto constraint; + } + } + } + bHaveRowid = 1; + } + } + + /* If azData[0] is not an SQL NULL value, it is the rowid of a + ** record to delete from the r-tree table. The following block does + ** just that. + */ + if( sqlite3_value_type(azData[0])!=SQLITE_NULL ){ + rc = rtreeDeleteRowid(pRtree, sqlite3_value_int64(azData[0])); + } + + /* If the azData[] array contains more than one element, elements + ** (azData[2]..azData[argc-1]) contain a new record to insert into + ** the r-tree structure. + */ + if( rc==SQLITE_OK && nData>1 ){ + /* Insert the new record into the r-tree */ + RtreeNode *pLeaf = 0; + + /* Figure out the rowid of the new row. */ + if( bHaveRowid==0 ){ + rc = newRowid(pRtree, &cell.iRowid); + } + *pRowid = cell.iRowid; + + if( rc==SQLITE_OK ){ + rc = ChooseLeaf(pRtree, &cell, 0, &pLeaf); + } + if( rc==SQLITE_OK ){ + int rc2; + pRtree->iReinsertHeight = -1; + rc = rtreeInsertCell(pRtree, pLeaf, &cell, 0); + rc2 = nodeRelease(pRtree, pLeaf); + if( rc==SQLITE_OK ){ + rc = rc2; + } + } + } + +constraint: + rtreeRelease(pRtree); + return rc; +} + +/* +** The xRename method for rtree module virtual tables. +*/ +static int rtreeRename(sqlite3_vtab *pVtab, const char *zNewName){ + Rtree *pRtree = (Rtree *)pVtab; + int rc = SQLITE_NOMEM; + char *zSql = sqlite3_mprintf( + "ALTER TABLE %Q.'%q_node' RENAME TO \"%w_node\";" + "ALTER TABLE %Q.'%q_parent' RENAME TO \"%w_parent\";" + "ALTER TABLE %Q.'%q_rowid' RENAME TO \"%w_rowid\";" + , pRtree->zDb, pRtree->zName, zNewName + , pRtree->zDb, pRtree->zName, zNewName + , pRtree->zDb, pRtree->zName, zNewName + ); + if( zSql ){ + rc = sqlite3_exec(pRtree->db, zSql, 0, 0, 0); + sqlite3_free(zSql); + } + return rc; +} + +/* +** This function populates the pRtree->nRowEst variable with an estimate +** of the number of rows in the virtual table. If possible, this is based +** on sqlite_stat1 data. Otherwise, use RTREE_DEFAULT_ROWEST. +*/ +static int rtreeQueryStat1(sqlite3 *db, Rtree *pRtree){ + const char *zFmt = "SELECT stat FROM %Q.sqlite_stat1 WHERE tbl = '%q_rowid'"; + char *zSql; + sqlite3_stmt *p; + int rc; + i64 nRow = 0; + + rc = sqlite3_table_column_metadata( + db, pRtree->zDb, "sqlite_stat1",0,0,0,0,0,0 + ); + if( rc!=SQLITE_OK ){ + pRtree->nRowEst = RTREE_DEFAULT_ROWEST; + return rc==SQLITE_ERROR ? SQLITE_OK : rc; + } + zSql = sqlite3_mprintf(zFmt, pRtree->zDb, pRtree->zName); + if( zSql==0 ){ + rc = SQLITE_NOMEM; + }else{ + rc = sqlite3_prepare_v2(db, zSql, -1, &p, 0); + if( rc==SQLITE_OK ){ + if( sqlite3_step(p)==SQLITE_ROW ) nRow = sqlite3_column_int64(p, 0); + rc = sqlite3_finalize(p); + }else if( rc!=SQLITE_NOMEM ){ + rc = SQLITE_OK; + } + + if( rc==SQLITE_OK ){ + if( nRow==0 ){ + pRtree->nRowEst = RTREE_DEFAULT_ROWEST; + }else{ + pRtree->nRowEst = MAX(nRow, RTREE_MIN_ROWEST); + } + } + sqlite3_free(zSql); + } + + return rc; +} + +static sqlite3_module rtreeModule = { + 0, /* iVersion */ + rtreeCreate, /* xCreate - create a table */ + rtreeConnect, /* xConnect - connect to an existing table */ + rtreeBestIndex, /* xBestIndex - Determine search strategy */ + rtreeDisconnect, /* xDisconnect - Disconnect from a table */ + rtreeDestroy, /* xDestroy - Drop a table */ + rtreeOpen, /* xOpen - open a cursor */ + rtreeClose, /* xClose - close a cursor */ + rtreeFilter, /* xFilter - configure scan constraints */ + rtreeNext, /* xNext - advance a cursor */ + rtreeEof, /* xEof */ + rtreeColumn, /* xColumn - read data */ + rtreeRowid, /* xRowid - read data */ + rtreeUpdate, /* xUpdate - write data */ + 0, /* xBegin - begin transaction */ + 0, /* xSync - sync transaction */ + 0, /* xCommit - commit transaction */ + 0, /* xRollback - rollback transaction */ + 0, /* xFindFunction - function overloading */ + rtreeRename, /* xRename - rename the table */ + 0, /* xSavepoint */ + 0, /* xRelease */ + 0 /* xRollbackTo */ +}; + +static int rtreeSqlInit( + Rtree *pRtree, + sqlite3 *db, + const char *zDb, + const char *zPrefix, + int isCreate +){ + int rc = SQLITE_OK; + + #define N_STATEMENT 9 + static const char *azSql[N_STATEMENT] = { + /* Read and write the xxx_node table */ + "SELECT data FROM '%q'.'%q_node' WHERE nodeno = :1", + "INSERT OR REPLACE INTO '%q'.'%q_node' VALUES(:1, :2)", + "DELETE FROM '%q'.'%q_node' WHERE nodeno = :1", + + /* Read and write the xxx_rowid table */ + "SELECT nodeno FROM '%q'.'%q_rowid' WHERE rowid = :1", + "INSERT OR REPLACE INTO '%q'.'%q_rowid' VALUES(:1, :2)", + "DELETE FROM '%q'.'%q_rowid' WHERE rowid = :1", + + /* Read and write the xxx_parent table */ + "SELECT parentnode FROM '%q'.'%q_parent' WHERE nodeno = :1", + "INSERT OR REPLACE INTO '%q'.'%q_parent' VALUES(:1, :2)", + "DELETE FROM '%q'.'%q_parent' WHERE nodeno = :1" + }; + sqlite3_stmt **appStmt[N_STATEMENT]; + int i; + + pRtree->db = db; + + if( isCreate ){ + char *zCreate = sqlite3_mprintf( +"CREATE TABLE \"%w\".\"%w_node\"(nodeno INTEGER PRIMARY KEY, data BLOB);" +"CREATE TABLE \"%w\".\"%w_rowid\"(rowid INTEGER PRIMARY KEY, nodeno INTEGER);" +"CREATE TABLE \"%w\".\"%w_parent\"(nodeno INTEGER PRIMARY KEY," + " parentnode INTEGER);" +"INSERT INTO '%q'.'%q_node' VALUES(1, zeroblob(%d))", + zDb, zPrefix, zDb, zPrefix, zDb, zPrefix, zDb, zPrefix, pRtree->iNodeSize + ); + if( !zCreate ){ + return SQLITE_NOMEM; + } + rc = sqlite3_exec(db, zCreate, 0, 0, 0); + sqlite3_free(zCreate); + if( rc!=SQLITE_OK ){ + return rc; + } + } + + appStmt[0] = &pRtree->pReadNode; + appStmt[1] = &pRtree->pWriteNode; + appStmt[2] = &pRtree->pDeleteNode; + appStmt[3] = &pRtree->pReadRowid; + appStmt[4] = &pRtree->pWriteRowid; + appStmt[5] = &pRtree->pDeleteRowid; + appStmt[6] = &pRtree->pReadParent; + appStmt[7] = &pRtree->pWriteParent; + appStmt[8] = &pRtree->pDeleteParent; + + rc = rtreeQueryStat1(db, pRtree); + for(i=0; iiNodeSize is populated and SQLITE_OK returned. +** Otherwise, an SQLite error code is returned. +** +** If this function is being called as part of an xConnect(), then the rtree +** table already exists. In this case the node-size is determined by inspecting +** the root node of the tree. +** +** Otherwise, for an xCreate(), use 64 bytes less than the database page-size. +** This ensures that each node is stored on a single database page. If the +** database page-size is so large that more than RTREE_MAXCELLS entries +** would fit in a single node, use a smaller node-size. +*/ +static int getNodeSize( + sqlite3 *db, /* Database handle */ + Rtree *pRtree, /* Rtree handle */ + int isCreate, /* True for xCreate, false for xConnect */ + char **pzErr /* OUT: Error message, if any */ +){ + int rc; + char *zSql; + if( isCreate ){ + int iPageSize = 0; + zSql = sqlite3_mprintf("PRAGMA %Q.page_size", pRtree->zDb); + rc = getIntFromStmt(db, zSql, &iPageSize); + if( rc==SQLITE_OK ){ + pRtree->iNodeSize = iPageSize-64; + if( (4+pRtree->nBytesPerCell*RTREE_MAXCELLS)iNodeSize ){ + pRtree->iNodeSize = 4+pRtree->nBytesPerCell*RTREE_MAXCELLS; + } + }else{ + *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db)); + } + }else{ + zSql = sqlite3_mprintf( + "SELECT length(data) FROM '%q'.'%q_node' WHERE nodeno = 1", + pRtree->zDb, pRtree->zName + ); + rc = getIntFromStmt(db, zSql, &pRtree->iNodeSize); + if( rc!=SQLITE_OK ){ + *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db)); + } + } + + sqlite3_free(zSql); + return rc; +} + +/* +** This function is the implementation of both the xConnect and xCreate +** methods of the r-tree virtual table. +** +** argv[0] -> module name +** argv[1] -> database name +** argv[2] -> table name +** argv[...] -> column names... +*/ +static int rtreeInit( + sqlite3 *db, /* Database connection */ + void *pAux, /* One of the RTREE_COORD_* constants */ + int argc, const char *const*argv, /* Parameters to CREATE TABLE statement */ + sqlite3_vtab **ppVtab, /* OUT: New virtual table */ + char **pzErr, /* OUT: Error message, if any */ + int isCreate /* True for xCreate, false for xConnect */ +){ + int rc = SQLITE_OK; + Rtree *pRtree; + int nDb; /* Length of string argv[1] */ + int nName; /* Length of string argv[2] */ + int eCoordType = (pAux ? RTREE_COORD_INT32 : RTREE_COORD_REAL32); + + const char *aErrMsg[] = { + 0, /* 0 */ + "Wrong number of columns for an rtree table", /* 1 */ + "Too few columns for an rtree table", /* 2 */ + "Too many columns for an rtree table" /* 3 */ + }; + + int iErr = (argc<6) ? 2 : argc>(RTREE_MAX_DIMENSIONS*2+4) ? 3 : argc%2; + if( aErrMsg[iErr] ){ + *pzErr = sqlite3_mprintf("%s", aErrMsg[iErr]); + return SQLITE_ERROR; + } + + sqlite3_vtab_config(db, SQLITE_VTAB_CONSTRAINT_SUPPORT, 1); + + /* Allocate the sqlite3_vtab structure */ + nDb = (int)strlen(argv[1]); + nName = (int)strlen(argv[2]); + pRtree = (Rtree *)sqlite3_malloc(sizeof(Rtree)+nDb+nName+2); + if( !pRtree ){ + return SQLITE_NOMEM; + } + memset(pRtree, 0, sizeof(Rtree)+nDb+nName+2); + pRtree->nBusy = 1; + pRtree->base.pModule = &rtreeModule; + pRtree->zDb = (char *)&pRtree[1]; + pRtree->zName = &pRtree->zDb[nDb+1]; + pRtree->nDim = (argc-4)/2; + pRtree->nBytesPerCell = 8 + pRtree->nDim*4*2; + pRtree->eCoordType = eCoordType; + memcpy(pRtree->zDb, argv[1], nDb); + memcpy(pRtree->zName, argv[2], nName); + + /* Figure out the node size to use. */ + rc = getNodeSize(db, pRtree, isCreate, pzErr); + + /* Create/Connect to the underlying relational database schema. If + ** that is successful, call sqlite3_declare_vtab() to configure + ** the r-tree table schema. + */ + if( rc==SQLITE_OK ){ + if( (rc = rtreeSqlInit(pRtree, db, argv[1], argv[2], isCreate)) ){ + *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db)); + }else{ + char *zSql = sqlite3_mprintf("CREATE TABLE x(%s", argv[3]); + char *zTmp; + int ii; + for(ii=4; zSql && iinBusy==1 ); + rtreeRelease(pRtree); + } + return rc; +} + + +/* +** Implementation of a scalar function that decodes r-tree nodes to +** human readable strings. This can be used for debugging and analysis. +** +** The scalar function takes two arguments: (1) the number of dimensions +** to the rtree (between 1 and 5, inclusive) and (2) a blob of data containing +** an r-tree node. For a two-dimensional r-tree structure called "rt", to +** deserialize all nodes, a statement like: +** +** SELECT rtreenode(2, data) FROM rt_node; +** +** The human readable string takes the form of a Tcl list with one +** entry for each cell in the r-tree node. Each entry is itself a +** list, containing the 8-byte rowid/pageno followed by the +** *2 coordinates. +*/ +static void rtreenode(sqlite3_context *ctx, int nArg, sqlite3_value **apArg){ + char *zText = 0; + RtreeNode node; + Rtree tree; + int ii; + + UNUSED_PARAMETER(nArg); + memset(&node, 0, sizeof(RtreeNode)); + memset(&tree, 0, sizeof(Rtree)); + tree.nDim = sqlite3_value_int(apArg[0]); + tree.nBytesPerCell = 8 + 8 * tree.nDim; + node.zData = (u8 *)sqlite3_value_blob(apArg[1]); + + for(ii=0; iixDestructor ) pInfo->xDestructor(pInfo->pContext); + sqlite3_free(p); +} + +/* +** This routine frees the BLOB that is returned by geomCallback(). +*/ +static void rtreeMatchArgFree(void *pArg){ + int i; + RtreeMatchArg *p = (RtreeMatchArg*)pArg; + for(i=0; inParam; i++){ + sqlite3_value_free(p->apSqlParam[i]); + } + sqlite3_free(p); +} + +/* +** Each call to sqlite3_rtree_geometry_callback() or +** sqlite3_rtree_query_callback() creates an ordinary SQLite +** scalar function that is implemented by this routine. +** +** All this function does is construct an RtreeMatchArg object that +** contains the geometry-checking callback routines and a list of +** parameters to this function, then return that RtreeMatchArg object +** as a BLOB. +** +** The R-Tree MATCH operator will read the returned BLOB, deserialize +** the RtreeMatchArg object, and use the RtreeMatchArg object to figure +** out which elements of the R-Tree should be returned by the query. +*/ +static void geomCallback(sqlite3_context *ctx, int nArg, sqlite3_value **aArg){ + RtreeGeomCallback *pGeomCtx = (RtreeGeomCallback *)sqlite3_user_data(ctx); + RtreeMatchArg *pBlob; + int nBlob; + int memErr = 0; + + nBlob = sizeof(RtreeMatchArg) + (nArg-1)*sizeof(RtreeDValue) + + nArg*sizeof(sqlite3_value*); + pBlob = (RtreeMatchArg *)sqlite3_malloc(nBlob); + if( !pBlob ){ + sqlite3_result_error_nomem(ctx); + }else{ + int i; + pBlob->magic = RTREE_GEOMETRY_MAGIC; + pBlob->cb = pGeomCtx[0]; + pBlob->apSqlParam = (sqlite3_value**)&pBlob->aParam[nArg]; + pBlob->nParam = nArg; + for(i=0; iapSqlParam[i] = sqlite3_value_dup(aArg[i]); + if( pBlob->apSqlParam[i]==0 ) memErr = 1; +#ifdef SQLITE_RTREE_INT_ONLY + pBlob->aParam[i] = sqlite3_value_int64(aArg[i]); +#else + pBlob->aParam[i] = sqlite3_value_double(aArg[i]); +#endif + } + if( memErr ){ + sqlite3_result_error_nomem(ctx); + rtreeMatchArgFree(pBlob); + }else{ + sqlite3_result_blob(ctx, pBlob, nBlob, rtreeMatchArgFree); + } + } +} + +/* +** Register a new geometry function for use with the r-tree MATCH operator. +*/ +SQLITE_API int sqlite3_rtree_geometry_callback( + sqlite3 *db, /* Register SQL function on this connection */ + const char *zGeom, /* Name of the new SQL function */ + int (*xGeom)(sqlite3_rtree_geometry*,int,RtreeDValue*,int*), /* Callback */ + void *pContext /* Extra data associated with the callback */ +){ + RtreeGeomCallback *pGeomCtx; /* Context object for new user-function */ + + /* Allocate and populate the context object. */ + pGeomCtx = (RtreeGeomCallback *)sqlite3_malloc(sizeof(RtreeGeomCallback)); + if( !pGeomCtx ) return SQLITE_NOMEM; + pGeomCtx->xGeom = xGeom; + pGeomCtx->xQueryFunc = 0; + pGeomCtx->xDestructor = 0; + pGeomCtx->pContext = pContext; + return sqlite3_create_function_v2(db, zGeom, -1, SQLITE_ANY, + (void *)pGeomCtx, geomCallback, 0, 0, rtreeFreeCallback + ); +} + +/* +** Register a new 2nd-generation geometry function for use with the +** r-tree MATCH operator. +*/ +SQLITE_API int sqlite3_rtree_query_callback( + sqlite3 *db, /* Register SQL function on this connection */ + const char *zQueryFunc, /* Name of new SQL function */ + int (*xQueryFunc)(sqlite3_rtree_query_info*), /* Callback */ + void *pContext, /* Extra data passed into the callback */ + void (*xDestructor)(void*) /* Destructor for the extra data */ +){ + RtreeGeomCallback *pGeomCtx; /* Context object for new user-function */ + + /* Allocate and populate the context object. */ + pGeomCtx = (RtreeGeomCallback *)sqlite3_malloc(sizeof(RtreeGeomCallback)); + if( !pGeomCtx ) return SQLITE_NOMEM; + pGeomCtx->xGeom = 0; + pGeomCtx->xQueryFunc = xQueryFunc; + pGeomCtx->xDestructor = xDestructor; + pGeomCtx->pContext = pContext; + return sqlite3_create_function_v2(db, zQueryFunc, -1, SQLITE_ANY, + (void *)pGeomCtx, geomCallback, 0, 0, rtreeFreeCallback + ); +} + +#if !SQLITE_CORE +#ifdef _WIN32 +__declspec(dllexport) +#endif +SQLITE_API int sqlite3_rtree_init( + sqlite3 *db, + char **pzErrMsg, + const sqlite3_api_routines *pApi +){ + SQLITE_EXTENSION_INIT2(pApi) + return sqlite3RtreeInit(db); +} +#endif + +#endif + +/************** End of rtree.c ***********************************************/ +/************** Begin file icu.c *********************************************/ +/* +** 2007 May 6 +** +** 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. +** +************************************************************************* +** $Id: icu.c,v 1.7 2007/12/13 21:54:11 drh Exp $ +** +** This file implements an integration between the ICU library +** ("International Components for Unicode", an open-source library +** for handling unicode data) and SQLite. The integration uses +** ICU to provide the following to SQLite: +** +** * An implementation of the SQL regexp() function (and hence REGEXP +** operator) using the ICU uregex_XX() APIs. +** +** * Implementations of the SQL scalar upper() and lower() functions +** for case mapping. +** +** * Integration of ICU and SQLite collation sequences. +** +** * An implementation of the LIKE operator that uses ICU to +** provide case-independent matching. +*/ + +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_ICU) + +/* Include ICU headers */ +#include +#include +#include +#include + +/* #include */ + +#ifndef SQLITE_CORE +/* #include "sqlite3ext.h" */ + SQLITE_EXTENSION_INIT1 +#else +/* #include "sqlite3.h" */ +#endif + +/* +** Maximum length (in bytes) of the pattern in a LIKE or GLOB +** operator. +*/ +#ifndef SQLITE_MAX_LIKE_PATTERN_LENGTH +# define SQLITE_MAX_LIKE_PATTERN_LENGTH 50000 +#endif + +/* +** Version of sqlite3_free() that is always a function, never a macro. +*/ +static void xFree(void *p){ + sqlite3_free(p); +} + +/* +** This lookup table is used to help decode the first byte of +** a multi-byte UTF8 character. It is copied here from SQLite source +** code file utf8.c. +*/ +static const unsigned char icuUtf8Trans1[] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x00, 0x01, 0x02, 0x03, 0x00, 0x01, 0x00, 0x00, +}; + +#define SQLITE_ICU_READ_UTF8(zIn, c) \ + c = *(zIn++); \ + if( c>=0xc0 ){ \ + c = icuUtf8Trans1[c-0xc0]; \ + while( (*zIn & 0xc0)==0x80 ){ \ + c = (c<<6) + (0x3f & *(zIn++)); \ + } \ + } + +#define SQLITE_ICU_SKIP_UTF8(zIn) \ + assert( *zIn ); \ + if( *(zIn++)>=0xc0 ){ \ + while( (*zIn & 0xc0)==0x80 ){zIn++;} \ + } + + +/* +** Compare two UTF-8 strings for equality where the first string is +** a "LIKE" expression. Return true (1) if they are the same and +** false (0) if they are different. +*/ +static int icuLikeCompare( + const uint8_t *zPattern, /* LIKE pattern */ + const uint8_t *zString, /* The UTF-8 string to compare against */ + const UChar32 uEsc /* The escape character */ +){ + static const int MATCH_ONE = (UChar32)'_'; + static const int MATCH_ALL = (UChar32)'%'; + + int prevEscape = 0; /* True if the previous character was uEsc */ + + while( 1 ){ + + /* Read (and consume) the next character from the input pattern. */ + UChar32 uPattern; + SQLITE_ICU_READ_UTF8(zPattern, uPattern); + if( uPattern==0 ) break; + + /* There are now 4 possibilities: + ** + ** 1. uPattern is an unescaped match-all character "%", + ** 2. uPattern is an unescaped match-one character "_", + ** 3. uPattern is an unescaped escape character, or + ** 4. uPattern is to be handled as an ordinary character + */ + if( !prevEscape && uPattern==MATCH_ALL ){ + /* Case 1. */ + uint8_t c; + + /* Skip any MATCH_ALL or MATCH_ONE characters that follow a + ** MATCH_ALL. For each MATCH_ONE, skip one character in the + ** test string. + */ + while( (c=*zPattern) == MATCH_ALL || c == MATCH_ONE ){ + if( c==MATCH_ONE ){ + if( *zString==0 ) return 0; + SQLITE_ICU_SKIP_UTF8(zString); + } + zPattern++; + } + + if( *zPattern==0 ) return 1; + + while( *zString ){ + if( icuLikeCompare(zPattern, zString, uEsc) ){ + return 1; + } + SQLITE_ICU_SKIP_UTF8(zString); + } + return 0; + + }else if( !prevEscape && uPattern==MATCH_ONE ){ + /* Case 2. */ + if( *zString==0 ) return 0; + SQLITE_ICU_SKIP_UTF8(zString); + + }else if( !prevEscape && uPattern==uEsc){ + /* Case 3. */ + prevEscape = 1; + + }else{ + /* Case 4. */ + UChar32 uString; + SQLITE_ICU_READ_UTF8(zString, uString); + uString = u_foldCase(uString, U_FOLD_CASE_DEFAULT); + uPattern = u_foldCase(uPattern, U_FOLD_CASE_DEFAULT); + if( uString!=uPattern ){ + return 0; + } + prevEscape = 0; + } + } + + return *zString==0; +} + +/* +** Implementation of the like() SQL function. This function implements +** the build-in LIKE operator. The first argument to the function is the +** pattern and the second argument is the string. So, the SQL statements: +** +** A LIKE B +** +** is implemented as like(B, A). If there is an escape character E, +** +** A LIKE B ESCAPE E +** +** is mapped to like(B, A, E). +*/ +static void icuLikeFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const unsigned char *zA = sqlite3_value_text(argv[0]); + const unsigned char *zB = sqlite3_value_text(argv[1]); + UChar32 uEsc = 0; + + /* Limit the length of the LIKE or GLOB pattern to avoid problems + ** of deep recursion and N*N behavior in patternCompare(). + */ + if( sqlite3_value_bytes(argv[0])>SQLITE_MAX_LIKE_PATTERN_LENGTH ){ + sqlite3_result_error(context, "LIKE or GLOB pattern too complex", -1); + return; + } + + + if( argc==3 ){ + /* The escape character string must consist of a single UTF-8 character. + ** Otherwise, return an error. + */ + int nE= sqlite3_value_bytes(argv[2]); + const unsigned char *zE = sqlite3_value_text(argv[2]); + int i = 0; + if( zE==0 ) return; + U8_NEXT(zE, i, nE, uEsc); + if( i!=nE){ + sqlite3_result_error(context, + "ESCAPE expression must be a single character", -1); + return; + } + } + + if( zA && zB ){ + sqlite3_result_int(context, icuLikeCompare(zA, zB, uEsc)); + } +} + +/* +** This function is called when an ICU function called from within +** the implementation of an SQL scalar function returns an error. +** +** The scalar function context passed as the first argument is +** loaded with an error message based on the following two args. +*/ +static void icuFunctionError( + sqlite3_context *pCtx, /* SQLite scalar function context */ + const char *zName, /* Name of ICU function that failed */ + UErrorCode e /* Error code returned by ICU function */ +){ + char zBuf[128]; + sqlite3_snprintf(128, zBuf, "ICU error: %s(): %s", zName, u_errorName(e)); + zBuf[127] = '\0'; + sqlite3_result_error(pCtx, zBuf, -1); +} + +/* +** Function to delete compiled regexp objects. Registered as +** a destructor function with sqlite3_set_auxdata(). +*/ +static void icuRegexpDelete(void *p){ + URegularExpression *pExpr = (URegularExpression *)p; + uregex_close(pExpr); +} + +/* +** Implementation of SQLite REGEXP operator. This scalar function takes +** two arguments. The first is a regular expression pattern to compile +** the second is a string to match against that pattern. If either +** argument is an SQL NULL, then NULL Is returned. Otherwise, the result +** is 1 if the string matches the pattern, or 0 otherwise. +** +** SQLite maps the regexp() function to the regexp() operator such +** that the following two are equivalent: +** +** zString REGEXP zPattern +** regexp(zPattern, zString) +** +** Uses the following ICU regexp APIs: +** +** uregex_open() +** uregex_matches() +** uregex_close() +*/ +static void icuRegexpFunc(sqlite3_context *p, int nArg, sqlite3_value **apArg){ + UErrorCode status = U_ZERO_ERROR; + URegularExpression *pExpr; + UBool res; + const UChar *zString = sqlite3_value_text16(apArg[1]); + + (void)nArg; /* Unused parameter */ + + /* If the left hand side of the regexp operator is NULL, + ** then the result is also NULL. + */ + if( !zString ){ + return; + } + + pExpr = sqlite3_get_auxdata(p, 0); + if( !pExpr ){ + const UChar *zPattern = sqlite3_value_text16(apArg[0]); + if( !zPattern ){ + return; + } + pExpr = uregex_open(zPattern, -1, 0, 0, &status); + + if( U_SUCCESS(status) ){ + sqlite3_set_auxdata(p, 0, pExpr, icuRegexpDelete); + }else{ + assert(!pExpr); + icuFunctionError(p, "uregex_open", status); + return; + } + } + + /* Configure the text that the regular expression operates on. */ + uregex_setText(pExpr, zString, -1, &status); + if( !U_SUCCESS(status) ){ + icuFunctionError(p, "uregex_setText", status); + return; + } + + /* Attempt the match */ + res = uregex_matches(pExpr, 0, &status); + if( !U_SUCCESS(status) ){ + icuFunctionError(p, "uregex_matches", status); + return; + } + + /* Set the text that the regular expression operates on to a NULL + ** pointer. This is not really necessary, but it is tidier than + ** leaving the regular expression object configured with an invalid + ** pointer after this function returns. + */ + uregex_setText(pExpr, 0, 0, &status); + + /* Return 1 or 0. */ + sqlite3_result_int(p, res ? 1 : 0); +} + +/* +** Implementations of scalar functions for case mapping - upper() and +** lower(). Function upper() converts its input to upper-case (ABC). +** Function lower() converts to lower-case (abc). +** +** ICU provides two types of case mapping, "general" case mapping and +** "language specific". Refer to ICU documentation for the differences +** between the two. +** +** To utilise "general" case mapping, the upper() or lower() scalar +** functions are invoked with one argument: +** +** upper('ABC') -> 'abc' +** lower('abc') -> 'ABC' +** +** To access ICU "language specific" case mapping, upper() or lower() +** should be invoked with two arguments. The second argument is the name +** of the locale to use. Passing an empty string ("") or SQL NULL value +** as the second argument is the same as invoking the 1 argument version +** of upper() or lower(). +** +** lower('I', 'en_us') -> 'i' +** lower('I', 'tr_tr') -> '\u131' (small dotless i) +** +** http://www.icu-project.org/userguide/posix.html#case_mappings +*/ +static void icuCaseFunc16(sqlite3_context *p, int nArg, sqlite3_value **apArg){ + const UChar *zInput; /* Pointer to input string */ + UChar *zOutput = 0; /* Pointer to output buffer */ + int nInput; /* Size of utf-16 input string in bytes */ + int nOut; /* Size of output buffer in bytes */ + int cnt; + int bToUpper; /* True for toupper(), false for tolower() */ + UErrorCode status; + const char *zLocale = 0; + + assert(nArg==1 || nArg==2); + bToUpper = (sqlite3_user_data(p)!=0); + if( nArg==2 ){ + zLocale = (const char *)sqlite3_value_text(apArg[1]); + } + + zInput = sqlite3_value_text16(apArg[0]); + if( !zInput ){ + return; + } + nOut = nInput = sqlite3_value_bytes16(apArg[0]); + if( nOut==0 ){ + sqlite3_result_text16(p, "", 0, SQLITE_STATIC); + return; + } + + for(cnt=0; cnt<2; cnt++){ + UChar *zNew = sqlite3_realloc(zOutput, nOut); + if( zNew==0 ){ + sqlite3_free(zOutput); + sqlite3_result_error_nomem(p); + return; + } + zOutput = zNew; + status = U_ZERO_ERROR; + if( bToUpper ){ + nOut = 2*u_strToUpper(zOutput,nOut/2,zInput,nInput/2,zLocale,&status); + }else{ + nOut = 2*u_strToLower(zOutput,nOut/2,zInput,nInput/2,zLocale,&status); + } + + if( U_SUCCESS(status) ){ + sqlite3_result_text16(p, zOutput, nOut, xFree); + }else if( status==U_BUFFER_OVERFLOW_ERROR ){ + assert( cnt==0 ); + continue; + }else{ + icuFunctionError(p, bToUpper ? "u_strToUpper" : "u_strToLower", status); + } + return; + } + assert( 0 ); /* Unreachable */ +} + +/* +** Collation sequence destructor function. The pCtx argument points to +** a UCollator structure previously allocated using ucol_open(). +*/ +static void icuCollationDel(void *pCtx){ + UCollator *p = (UCollator *)pCtx; + ucol_close(p); +} + +/* +** Collation sequence comparison function. The pCtx argument points to +** a UCollator structure previously allocated using ucol_open(). +*/ +static int icuCollationColl( + void *pCtx, + int nLeft, + const void *zLeft, + int nRight, + const void *zRight +){ + UCollationResult res; + UCollator *p = (UCollator *)pCtx; + res = ucol_strcoll(p, (UChar *)zLeft, nLeft/2, (UChar *)zRight, nRight/2); + switch( res ){ + case UCOL_LESS: return -1; + case UCOL_GREATER: return +1; + case UCOL_EQUAL: return 0; + } + assert(!"Unexpected return value from ucol_strcoll()"); + return 0; +} + +/* +** Implementation of the scalar function icu_load_collation(). +** +** This scalar function is used to add ICU collation based collation +** types to an SQLite database connection. It is intended to be called +** as follows: +** +** SELECT icu_load_collation(, ); +** +** Where is a string containing an ICU locale identifier (i.e. +** "en_AU", "tr_TR" etc.) and is the name of the +** collation sequence to create. +*/ +static void icuLoadCollation( + sqlite3_context *p, + int nArg, + sqlite3_value **apArg +){ + sqlite3 *db = (sqlite3 *)sqlite3_user_data(p); + UErrorCode status = U_ZERO_ERROR; + const char *zLocale; /* Locale identifier - (eg. "jp_JP") */ + const char *zName; /* SQL Collation sequence name (eg. "japanese") */ + UCollator *pUCollator; /* ICU library collation object */ + int rc; /* Return code from sqlite3_create_collation_x() */ + + assert(nArg==2); + (void)nArg; /* Unused parameter */ + zLocale = (const char *)sqlite3_value_text(apArg[0]); + zName = (const char *)sqlite3_value_text(apArg[1]); + + if( !zLocale || !zName ){ + return; + } + + pUCollator = ucol_open(zLocale, &status); + if( !U_SUCCESS(status) ){ + icuFunctionError(p, "ucol_open", status); + return; + } + assert(p); + + rc = sqlite3_create_collation_v2(db, zName, SQLITE_UTF16, (void *)pUCollator, + icuCollationColl, icuCollationDel + ); + if( rc!=SQLITE_OK ){ + ucol_close(pUCollator); + sqlite3_result_error(p, "Error registering collation function", -1); + } +} + +/* +** Register the ICU extension functions with database db. +*/ +SQLITE_PRIVATE int sqlite3IcuInit(sqlite3 *db){ + struct IcuScalar { + const char *zName; /* Function name */ + int nArg; /* Number of arguments */ + int enc; /* Optimal text encoding */ + void *pContext; /* sqlite3_user_data() context */ + void (*xFunc)(sqlite3_context*,int,sqlite3_value**); + } scalars[] = { + {"regexp", 2, SQLITE_ANY|SQLITE_DETERMINISTIC, 0, icuRegexpFunc}, + + {"lower", 1, SQLITE_UTF16|SQLITE_DETERMINISTIC, 0, icuCaseFunc16}, + {"lower", 2, SQLITE_UTF16|SQLITE_DETERMINISTIC, 0, icuCaseFunc16}, + {"upper", 1, SQLITE_UTF16|SQLITE_DETERMINISTIC, (void*)1, icuCaseFunc16}, + {"upper", 2, SQLITE_UTF16|SQLITE_DETERMINISTIC, (void*)1, icuCaseFunc16}, + + {"lower", 1, SQLITE_UTF8|SQLITE_DETERMINISTIC, 0, icuCaseFunc16}, + {"lower", 2, SQLITE_UTF8|SQLITE_DETERMINISTIC, 0, icuCaseFunc16}, + {"upper", 1, SQLITE_UTF8|SQLITE_DETERMINISTIC, (void*)1, icuCaseFunc16}, + {"upper", 2, SQLITE_UTF8|SQLITE_DETERMINISTIC, (void*)1, icuCaseFunc16}, + + {"like", 2, SQLITE_UTF8|SQLITE_DETERMINISTIC, 0, icuLikeFunc}, + {"like", 3, SQLITE_UTF8|SQLITE_DETERMINISTIC, 0, icuLikeFunc}, + + {"icu_load_collation", 2, SQLITE_UTF8, (void*)db, icuLoadCollation}, + }; + + int rc = SQLITE_OK; + int i; + + for(i=0; rc==SQLITE_OK && i<(int)(sizeof(scalars)/sizeof(scalars[0])); i++){ + struct IcuScalar *p = &scalars[i]; + rc = sqlite3_create_function( + db, p->zName, p->nArg, p->enc, p->pContext, p->xFunc, 0, 0 + ); + } + + return rc; +} + +#if !SQLITE_CORE +#ifdef _WIN32 +__declspec(dllexport) +#endif +SQLITE_API int sqlite3_icu_init( + sqlite3 *db, + char **pzErrMsg, + const sqlite3_api_routines *pApi +){ + SQLITE_EXTENSION_INIT2(pApi) + return sqlite3IcuInit(db); +} +#endif + +#endif + +/************** End of icu.c *************************************************/ +/************** Begin file fts3_icu.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 file implements a tokenizer for fts3 based on the ICU library. +*/ +/* #include "fts3Int.h" */ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) +#ifdef SQLITE_ENABLE_ICU + +/* #include */ +/* #include */ +/* #include "fts3_tokenizer.h" */ + +#include +/* #include */ +/* #include */ +#include + +typedef struct IcuTokenizer IcuTokenizer; +typedef struct IcuCursor IcuCursor; + +struct IcuTokenizer { + sqlite3_tokenizer base; + char *zLocale; +}; + +struct IcuCursor { + sqlite3_tokenizer_cursor base; + + UBreakIterator *pIter; /* ICU break-iterator object */ + int nChar; /* Number of UChar elements in pInput */ + UChar *aChar; /* Copy of input using utf-16 encoding */ + int *aOffset; /* Offsets of each character in utf-8 input */ + + int nBuffer; + char *zBuffer; + + int iToken; +}; + +/* +** Create a new tokenizer instance. +*/ +static int icuCreate( + int argc, /* Number of entries in argv[] */ + const char * const *argv, /* Tokenizer creation arguments */ + sqlite3_tokenizer **ppTokenizer /* OUT: Created tokenizer */ +){ + IcuTokenizer *p; + int n = 0; + + if( argc>0 ){ + n = strlen(argv[0])+1; + } + p = (IcuTokenizer *)sqlite3_malloc(sizeof(IcuTokenizer)+n); + if( !p ){ + return SQLITE_NOMEM; + } + memset(p, 0, sizeof(IcuTokenizer)); + + if( n ){ + p->zLocale = (char *)&p[1]; + memcpy(p->zLocale, argv[0], n); + } + + *ppTokenizer = (sqlite3_tokenizer *)p; + + return SQLITE_OK; +} + +/* +** Destroy a tokenizer +*/ +static int icuDestroy(sqlite3_tokenizer *pTokenizer){ + IcuTokenizer *p = (IcuTokenizer *)pTokenizer; + sqlite3_free(p); + 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 icuOpen( + sqlite3_tokenizer *pTokenizer, /* The tokenizer */ + const char *zInput, /* Input string */ + int nInput, /* Length of zInput in bytes */ + sqlite3_tokenizer_cursor **ppCursor /* OUT: Tokenization cursor */ +){ + IcuTokenizer *p = (IcuTokenizer *)pTokenizer; + IcuCursor *pCsr; + + const int32_t opt = U_FOLD_CASE_DEFAULT; + UErrorCode status = U_ZERO_ERROR; + int nChar; + + UChar32 c; + int iInput = 0; + int iOut = 0; + + *ppCursor = 0; + + if( zInput==0 ){ + nInput = 0; + zInput = ""; + }else if( nInput<0 ){ + nInput = strlen(zInput); + } + nChar = nInput+1; + pCsr = (IcuCursor *)sqlite3_malloc( + sizeof(IcuCursor) + /* IcuCursor */ + ((nChar+3)&~3) * sizeof(UChar) + /* IcuCursor.aChar[] */ + (nChar+1) * sizeof(int) /* IcuCursor.aOffset[] */ + ); + if( !pCsr ){ + return SQLITE_NOMEM; + } + memset(pCsr, 0, sizeof(IcuCursor)); + pCsr->aChar = (UChar *)&pCsr[1]; + pCsr->aOffset = (int *)&pCsr->aChar[(nChar+3)&~3]; + + pCsr->aOffset[iOut] = iInput; + U8_NEXT(zInput, iInput, nInput, c); + while( c>0 ){ + int isError = 0; + c = u_foldCase(c, opt); + U16_APPEND(pCsr->aChar, iOut, nChar, c, isError); + if( isError ){ + sqlite3_free(pCsr); + return SQLITE_ERROR; + } + pCsr->aOffset[iOut] = iInput; + + if( iInputpIter = ubrk_open(UBRK_WORD, p->zLocale, pCsr->aChar, iOut, &status); + if( !U_SUCCESS(status) ){ + sqlite3_free(pCsr); + return SQLITE_ERROR; + } + pCsr->nChar = iOut; + + ubrk_first(pCsr->pIter); + *ppCursor = (sqlite3_tokenizer_cursor *)pCsr; + return SQLITE_OK; +} + +/* +** Close a tokenization cursor previously opened by a call to icuOpen(). +*/ +static int icuClose(sqlite3_tokenizer_cursor *pCursor){ + IcuCursor *pCsr = (IcuCursor *)pCursor; + ubrk_close(pCsr->pIter); + sqlite3_free(pCsr->zBuffer); + sqlite3_free(pCsr); + return SQLITE_OK; +} + +/* +** Extract the next token from a tokenization cursor. +*/ +static int icuNext( + 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 */ +){ + IcuCursor *pCsr = (IcuCursor *)pCursor; + + int iStart = 0; + int iEnd = 0; + int nByte = 0; + + while( iStart==iEnd ){ + UChar32 c; + + iStart = ubrk_current(pCsr->pIter); + iEnd = ubrk_next(pCsr->pIter); + if( iEnd==UBRK_DONE ){ + return SQLITE_DONE; + } + + while( iStartaChar, iWhite, pCsr->nChar, c); + if( u_isspace(c) ){ + iStart = iWhite; + }else{ + break; + } + } + assert(iStart<=iEnd); + } + + do { + UErrorCode status = U_ZERO_ERROR; + if( nByte ){ + char *zNew = sqlite3_realloc(pCsr->zBuffer, nByte); + if( !zNew ){ + return SQLITE_NOMEM; + } + pCsr->zBuffer = zNew; + pCsr->nBuffer = nByte; + } + + u_strToUTF8( + pCsr->zBuffer, pCsr->nBuffer, &nByte, /* Output vars */ + &pCsr->aChar[iStart], iEnd-iStart, /* Input vars */ + &status /* Output success/failure */ + ); + } while( nByte>pCsr->nBuffer ); + + *ppToken = pCsr->zBuffer; + *pnBytes = nByte; + *piStartOffset = pCsr->aOffset[iStart]; + *piEndOffset = pCsr->aOffset[iEnd]; + *piPosition = pCsr->iToken++; + + return SQLITE_OK; +} + +/* +** The set of routines that implement the simple tokenizer +*/ +static const sqlite3_tokenizer_module icuTokenizerModule = { + 0, /* iVersion */ + icuCreate, /* xCreate */ + icuDestroy, /* xCreate */ + icuOpen, /* xOpen */ + icuClose, /* xClose */ + icuNext, /* xNext */ + 0, /* xLanguageid */ +}; + +/* +** Set *ppModule to point at the implementation of the ICU tokenizer. +*/ +SQLITE_PRIVATE void sqlite3Fts3IcuTokenizerModule( + sqlite3_tokenizer_module const**ppModule +){ + *ppModule = &icuTokenizerModule; +} + +#endif /* defined(SQLITE_ENABLE_ICU) */ +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */ + +/************** End of fts3_icu.c ********************************************/ +/************** Begin file sqlite3rbu.c **************************************/ +/* +** 2014 August 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. +** +************************************************************************* +** +** +** OVERVIEW +** +** The RBU extension requires that the RBU update be packaged as an +** SQLite database. The tables it expects to find are described in +** sqlite3rbu.h. Essentially, for each table xyz in the target database +** that the user wishes to write to, a corresponding data_xyz table is +** created in the RBU database and populated with one row for each row to +** update, insert or delete from the target table. +** +** The update proceeds in three stages: +** +** 1) The database is updated. The modified database pages are written +** to a *-oal file. A *-oal file is just like a *-wal file, except +** that it is named "-oal" instead of "-wal". +** Because regular SQLite clients do not look for file named +** "-oal", they go on using the original database in +** rollback mode while the *-oal file is being generated. +** +** During this stage RBU does not update the database by writing +** directly to the target tables. Instead it creates "imposter" +** tables using the SQLITE_TESTCTRL_IMPOSTER interface that it uses +** to update each b-tree individually. All updates required by each +** b-tree are completed before moving on to the next, and all +** updates are done in sorted key order. +** +** 2) The "-oal" file is moved to the equivalent "-wal" +** location using a call to rename(2). Before doing this the RBU +** module takes an EXCLUSIVE lock on the database file, ensuring +** that there are no other active readers. +** +** Once the EXCLUSIVE lock is released, any other database readers +** detect the new *-wal file and read the database in wal mode. At +** this point they see the new version of the database - including +** the updates made as part of the RBU update. +** +** 3) The new *-wal file is checkpointed. This proceeds in the same way +** as a regular database checkpoint, except that a single frame is +** checkpointed each time sqlite3rbu_step() is called. If the RBU +** handle is closed before the entire *-wal file is checkpointed, +** the checkpoint progress is saved in the RBU database and the +** checkpoint can be resumed by another RBU client at some point in +** the future. +** +** POTENTIAL PROBLEMS +** +** The rename() call might not be portable. And RBU is not currently +** syncing the directory after renaming the file. +** +** When state is saved, any commit to the *-oal file and the commit to +** the RBU update database are not atomic. So if the power fails at the +** wrong moment they might get out of sync. As the main database will be +** committed before the RBU update database this will likely either just +** pass unnoticed, or result in SQLITE_CONSTRAINT errors (due to UNIQUE +** constraint violations). +** +** If some client does modify the target database mid RBU update, or some +** other error occurs, the RBU extension will keep throwing errors. It's +** not really clear how to get out of this state. The system could just +** by delete the RBU update database and *-oal file and have the device +** download the update again and start over. +** +** At present, for an UPDATE, both the new.* and old.* records are +** collected in the rbu_xyz table. And for both UPDATEs and DELETEs all +** fields are collected. This means we're probably writing a lot more +** data to disk when saving the state of an ongoing update to the RBU +** update database than is strictly necessary. +** +*/ + +/* #include */ +/* #include */ +/* #include */ + +/* #include "sqlite3.h" */ + +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_RBU) +/************** Include sqlite3rbu.h in the middle of sqlite3rbu.c ***********/ +/************** Begin file sqlite3rbu.h **************************************/ +/* +** 2014 August 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. +** +************************************************************************* +** +** This file contains the public interface for the RBU extension. +*/ + +/* +** SUMMARY +** +** Writing a transaction containing a large number of operations on +** b-tree indexes that are collectively larger than the available cache +** memory can be very inefficient. +** +** The problem is that in order to update a b-tree, the leaf page (at least) +** containing the entry being inserted or deleted must be modified. If the +** working set of leaves is larger than the available cache memory, then a +** single leaf that is modified more than once as part of the transaction +** may be loaded from or written to the persistent media multiple times. +** Additionally, because the index updates are likely to be applied in +** random order, access to pages within the database is also likely to be in +** random order, which is itself quite inefficient. +** +** One way to improve the situation is to sort the operations on each index +** by index key before applying them to the b-tree. This leads to an IO +** pattern that resembles a single linear scan through the index b-tree, +** and all but guarantees each modified leaf page is loaded and stored +** exactly once. SQLite uses this trick to improve the performance of +** CREATE INDEX commands. This extension allows it to be used to improve +** the performance of large transactions on existing databases. +** +** Additionally, this extension allows the work involved in writing the +** large transaction to be broken down into sub-transactions performed +** sequentially by separate processes. This is useful if the system cannot +** guarantee that a single update process will run for long enough to apply +** the entire update, for example because the update is being applied on a +** mobile device that is frequently rebooted. Even after the writer process +** has committed one or more sub-transactions, other database clients continue +** to read from the original database snapshot. In other words, partially +** applied transactions are not visible to other clients. +** +** "RBU" stands for "Resumable Bulk Update". As in a large database update +** transmitted via a wireless network to a mobile device. A transaction +** applied using this extension is hence refered to as an "RBU update". +** +** +** LIMITATIONS +** +** An "RBU update" transaction is subject to the following limitations: +** +** * The transaction must consist of INSERT, UPDATE and DELETE operations +** only. +** +** * INSERT statements may not use any default values. +** +** * UPDATE and DELETE statements must identify their target rows by +** non-NULL PRIMARY KEY values. Rows with NULL values stored in PRIMARY +** KEY fields may not be updated or deleted. If the table being written +** has no PRIMARY KEY, affected rows must be identified by rowid. +** +** * UPDATE statements may not modify PRIMARY KEY columns. +** +** * No triggers will be fired. +** +** * No foreign key violations are detected or reported. +** +** * CHECK constraints are not enforced. +** +** * No constraint handling mode except for "OR ROLLBACK" is supported. +** +** +** PREPARATION +** +** An "RBU update" is stored as a separate SQLite database. A database +** containing an RBU update is an "RBU database". For each table in the +** target database to be updated, the RBU database should contain a table +** named "data_" containing the same set of columns as the +** target table, and one more - "rbu_control". The data_% table should +** have no PRIMARY KEY or UNIQUE constraints, but each column should have +** the same type as the corresponding column in the target database. +** The "rbu_control" column should have no type at all. For example, if +** the target database contains: +** +** CREATE TABLE t1(a INTEGER PRIMARY KEY, b TEXT, c UNIQUE); +** +** Then the RBU database should contain: +** +** CREATE TABLE data_t1(a INTEGER, b TEXT, c, rbu_control); +** +** The order of the columns in the data_% table does not matter. +** +** Instead of a regular table, the RBU database may also contain virtual +** tables or view named using the data_ naming scheme. +** +** Instead of the plain data_ naming scheme, RBU database tables +** may also be named data_, where is any sequence +** of zero or more numeric characters (0-9). This can be significant because +** tables within the RBU database are always processed in order sorted by +** name. By judicious selection of the portion of the names +** of the RBU tables the user can therefore control the order in which they +** are processed. This can be useful, for example, to ensure that "external +** content" FTS4 tables are updated before their underlying content tables. +** +** If the target database table is a virtual table or a table that has no +** PRIMARY KEY declaration, the data_% table must also contain a column +** named "rbu_rowid". This column is mapped to the tables implicit primary +** key column - "rowid". Virtual tables for which the "rowid" column does +** not function like a primary key value cannot be updated using RBU. For +** example, if the target db contains either of the following: +** +** CREATE VIRTUAL TABLE x1 USING fts3(a, b); +** CREATE TABLE x1(a, b) +** +** then the RBU database should contain: +** +** CREATE TABLE data_x1(a, b, rbu_rowid, rbu_control); +** +** All non-hidden columns (i.e. all columns matched by "SELECT *") of the +** target table must be present in the input table. For virtual tables, +** hidden columns are optional - they are updated by RBU if present in +** the input table, or not otherwise. For example, to write to an fts4 +** table with a hidden languageid column such as: +** +** CREATE VIRTUAL TABLE ft1 USING fts4(a, b, languageid='langid'); +** +** Either of the following input table schemas may be used: +** +** CREATE TABLE data_ft1(a, b, langid, rbu_rowid, rbu_control); +** CREATE TABLE data_ft1(a, b, rbu_rowid, rbu_control); +** +** For each row to INSERT into the target database as part of the RBU +** update, the corresponding data_% table should contain a single record +** with the "rbu_control" column set to contain integer value 0. The +** other columns should be set to the values that make up the new record +** to insert. +** +** If the target database table has an INTEGER PRIMARY KEY, it is not +** possible to insert a NULL value into the IPK column. Attempting to +** do so results in an SQLITE_MISMATCH error. +** +** For each row to DELETE from the target database as part of the RBU +** update, the corresponding data_% table should contain a single record +** with the "rbu_control" column set to contain integer value 1. The +** real primary key values of the row to delete should be stored in the +** corresponding columns of the data_% table. The values stored in the +** other columns are not used. +** +** For each row to UPDATE from the target database as part of the RBU +** update, the corresponding data_% table should contain a single record +** with the "rbu_control" column set to contain a value of type text. +** The real primary key values identifying the row to update should be +** stored in the corresponding columns of the data_% table row, as should +** the new values of all columns being update. The text value in the +** "rbu_control" column must contain the same number of characters as +** there are columns in the target database table, and must consist entirely +** of 'x' and '.' characters (or in some special cases 'd' - see below). For +** each column that is being updated, the corresponding character is set to +** 'x'. For those that remain as they are, the corresponding character of the +** rbu_control value should be set to '.'. For example, given the tables +** above, the update statement: +** +** UPDATE t1 SET c = 'usa' WHERE a = 4; +** +** is represented by the data_t1 row created by: +** +** INSERT INTO data_t1(a, b, c, rbu_control) VALUES(4, NULL, 'usa', '..x'); +** +** Instead of an 'x' character, characters of the rbu_control value specified +** for UPDATEs may also be set to 'd'. In this case, instead of updating the +** target table with the value stored in the corresponding data_% column, the +** user-defined SQL function "rbu_delta()" is invoked and the result stored in +** the target table column. rbu_delta() is invoked with two arguments - the +** original value currently stored in the target table column and the +** value specified in the data_xxx table. +** +** For example, this row: +** +** INSERT INTO data_t1(a, b, c, rbu_control) VALUES(4, NULL, 'usa', '..d'); +** +** is similar to an UPDATE statement such as: +** +** UPDATE t1 SET c = rbu_delta(c, 'usa') WHERE a = 4; +** +** Finally, if an 'f' character appears in place of a 'd' or 's' in an +** ota_control string, the contents of the data_xxx table column is assumed +** to be a "fossil delta" - a patch to be applied to a blob value in the +** format used by the fossil source-code management system. In this case +** the existing value within the target database table must be of type BLOB. +** It is replaced by the result of applying the specified fossil delta to +** itself. +** +** If the target database table is a virtual table or a table with no PRIMARY +** KEY, the rbu_control value should not include a character corresponding +** to the rbu_rowid value. For example, this: +** +** INSERT INTO data_ft1(a, b, rbu_rowid, rbu_control) +** VALUES(NULL, 'usa', 12, '.x'); +** +** causes a result similar to: +** +** UPDATE ft1 SET b = 'usa' WHERE rowid = 12; +** +** The data_xxx tables themselves should have no PRIMARY KEY declarations. +** However, RBU is more efficient if reading the rows in from each data_xxx +** table in "rowid" order is roughly the same as reading them sorted by +** the PRIMARY KEY of the corresponding target database table. In other +** words, rows should be sorted using the destination table PRIMARY KEY +** fields before they are inserted into the data_xxx tables. +** +** USAGE +** +** The API declared below allows an application to apply an RBU update +** stored on disk to an existing target database. Essentially, the +** application: +** +** 1) Opens an RBU handle using the sqlite3rbu_open() function. +** +** 2) Registers any required virtual table modules with the database +** handle returned by sqlite3rbu_db(). Also, if required, register +** the rbu_delta() implementation. +** +** 3) Calls the sqlite3rbu_step() function one or more times on +** the new handle. Each call to sqlite3rbu_step() performs a single +** b-tree operation, so thousands of calls may be required to apply +** a complete update. +** +** 4) Calls sqlite3rbu_close() to close the RBU update handle. If +** sqlite3rbu_step() has been called enough times to completely +** apply the update to the target database, then the RBU database +** is marked as fully applied. Otherwise, the state of the RBU +** update application is saved in the RBU database for later +** resumption. +** +** See comments below for more detail on APIs. +** +** If an update is only partially applied to the target database by the +** time sqlite3rbu_close() is called, various state information is saved +** within the RBU database. This allows subsequent processes to automatically +** resume the RBU update from where it left off. +** +** To remove all RBU extension state information, returning an RBU database +** to its original contents, it is sufficient to drop all tables that begin +** with the prefix "rbu_" +** +** DATABASE LOCKING +** +** An RBU update may not be applied to a database in WAL mode. Attempting +** to do so is an error (SQLITE_ERROR). +** +** While an RBU handle is open, a SHARED lock may be held on the target +** database file. This means it is possible for other clients to read the +** database, but not to write it. +** +** If an RBU update is started and then suspended before it is completed, +** then an external client writes to the database, then attempting to resume +** the suspended RBU update is also an error (SQLITE_BUSY). +*/ + +#ifndef _SQLITE3RBU_H +#define _SQLITE3RBU_H + +/* #include "sqlite3.h" ** Required for error code definitions ** */ + +#if 0 +extern "C" { +#endif + +typedef struct sqlite3rbu sqlite3rbu; + +/* +** Open an RBU handle. +** +** Argument zTarget is the path to the target database. Argument zRbu is +** the path to the RBU database. Each call to this function must be matched +** by a call to sqlite3rbu_close(). When opening the databases, RBU passes +** the SQLITE_CONFIG_URI flag to sqlite3_open_v2(). So if either zTarget +** or zRbu begin with "file:", it will be interpreted as an SQLite +** database URI, not a regular file name. +** +** If the zState argument is passed a NULL value, the RBU extension stores +** the current state of the update (how many rows have been updated, which +** indexes are yet to be updated etc.) within the RBU database itself. This +** can be convenient, as it means that the RBU application does not need to +** organize removing a separate state file after the update is concluded. +** Or, if zState is non-NULL, it must be a path to a database file in which +** the RBU extension can store the state of the update. +** +** When resuming an RBU update, the zState argument must be passed the same +** value as when the RBU update was started. +** +** Once the RBU update is finished, the RBU extension does not +** automatically remove any zState database file, even if it created it. +** +** By default, RBU uses the default VFS to access the files on disk. To +** use a VFS other than the default, an SQLite "file:" URI containing a +** "vfs=..." option may be passed as the zTarget option. +** +** IMPORTANT NOTE FOR ZIPVFS USERS: The RBU extension works with all of +** SQLite's built-in VFSs, including the multiplexor VFS. However it does +** not work out of the box with zipvfs. Refer to the comment describing +** the zipvfs_create_vfs() API below for details on using RBU with zipvfs. +*/ +SQLITE_API sqlite3rbu *sqlite3rbu_open( + const char *zTarget, + const char *zRbu, + const char *zState +); + +/* +** Open an RBU handle to perform an RBU vacuum on database file zTarget. +** An RBU vacuum is similar to SQLite's built-in VACUUM command, except +** that it can be suspended and resumed like an RBU update. +** +** The second argument to this function identifies a database in which +** to store the state of the RBU vacuum operation if it is suspended. The +** first time sqlite3rbu_vacuum() is called, to start an RBU vacuum +** operation, the state database should either not exist or be empty +** (contain no tables). If an RBU vacuum is suspended by calling +** sqlite3rbu_close() on the RBU handle before sqlite3rbu_step() has +** returned SQLITE_DONE, the vacuum state is stored in the state database. +** The vacuum can be resumed by calling this function to open a new RBU +** handle specifying the same target and state databases. +** +** If the second argument passed to this function is NULL, then the +** name of the state database is "-vacuum", where +** is the name of the target database file. In this case, on UNIX, if the +** state database is not already present in the file-system, it is created +** with the same permissions as the target db is made. +** +** This function does not delete the state database after an RBU vacuum +** is completed, even if it created it. However, if the call to +** sqlite3rbu_close() returns any value other than SQLITE_OK, the contents +** of the state tables within the state database are zeroed. This way, +** the next call to sqlite3rbu_vacuum() opens a handle that starts a +** new RBU vacuum operation. +** +** As with sqlite3rbu_open(), Zipvfs users should rever to the comment +** describing the sqlite3rbu_create_vfs() API function below for +** a description of the complications associated with using RBU with +** zipvfs databases. +*/ +SQLITE_API sqlite3rbu *sqlite3rbu_vacuum( + const char *zTarget, + const char *zState +); + +/* +** Internally, each RBU connection uses a separate SQLite database +** connection to access the target and rbu update databases. This +** API allows the application direct access to these database handles. +** +** The first argument passed to this function must be a valid, open, RBU +** handle. The second argument should be passed zero to access the target +** database handle, or non-zero to access the rbu update database handle. +** Accessing the underlying database handles may be useful in the +** following scenarios: +** +** * If any target tables are virtual tables, it may be necessary to +** call sqlite3_create_module() on the target database handle to +** register the required virtual table implementations. +** +** * If the data_xxx tables in the RBU source database are virtual +** tables, the application may need to call sqlite3_create_module() on +** the rbu update db handle to any required virtual table +** implementations. +** +** * If the application uses the "rbu_delta()" feature described above, +** it must use sqlite3_create_function() or similar to register the +** rbu_delta() implementation with the target database handle. +** +** If an error has occurred, either while opening or stepping the RBU object, +** this function may return NULL. The error code and message may be collected +** when sqlite3rbu_close() is called. +** +** Database handles returned by this function remain valid until the next +** call to any sqlite3rbu_xxx() function other than sqlite3rbu_db(). +*/ +SQLITE_API sqlite3 *sqlite3rbu_db(sqlite3rbu*, int bRbu); + +/* +** Do some work towards applying the RBU update to the target db. +** +** Return SQLITE_DONE if the update has been completely applied, or +** SQLITE_OK if no error occurs but there remains work to do to apply +** the RBU update. If an error does occur, some other error code is +** returned. +** +** Once a call to sqlite3rbu_step() has returned a value other than +** SQLITE_OK, all subsequent calls on the same RBU handle are no-ops +** that immediately return the same value. +*/ +SQLITE_API int sqlite3rbu_step(sqlite3rbu *pRbu); + +/* +** Force RBU to save its state to disk. +** +** If a power failure or application crash occurs during an update, following +** system recovery RBU may resume the update from the point at which the state +** was last saved. In other words, from the most recent successful call to +** sqlite3rbu_close() or this function. +** +** SQLITE_OK is returned if successful, or an SQLite error code otherwise. +*/ +SQLITE_API int sqlite3rbu_savestate(sqlite3rbu *pRbu); + +/* +** Close an RBU handle. +** +** If the RBU update has been completely applied, mark the RBU database +** as fully applied. Otherwise, assuming no error has occurred, save the +** current state of the RBU update appliation to the RBU database. +** +** If an error has already occurred as part of an sqlite3rbu_step() +** or sqlite3rbu_open() call, or if one occurs within this function, an +** SQLite error code is returned. Additionally, *pzErrmsg may be set to +** point to a buffer containing a utf-8 formatted English language error +** message. It is the responsibility of the caller to eventually free any +** such buffer using sqlite3_free(). +** +** Otherwise, if no error occurs, this function returns SQLITE_OK if the +** update has been partially applied, or SQLITE_DONE if it has been +** completely applied. +*/ +SQLITE_API int sqlite3rbu_close(sqlite3rbu *pRbu, char **pzErrmsg); + +/* +** Return the total number of key-value operations (inserts, deletes or +** updates) that have been performed on the target database since the +** current RBU update was started. +*/ +SQLITE_API sqlite3_int64 sqlite3rbu_progress(sqlite3rbu *pRbu); + +/* +** Obtain permyriadage (permyriadage is to 10000 as percentage is to 100) +** progress indications for the two stages of an RBU update. This API may +** be useful for driving GUI progress indicators and similar. +** +** An RBU update is divided into two stages: +** +** * Stage 1, in which changes are accumulated in an oal/wal file, and +** * Stage 2, in which the contents of the wal file are copied into the +** main database. +** +** The update is visible to non-RBU clients during stage 2. During stage 1 +** non-RBU reader clients may see the original database. +** +** If this API is called during stage 2 of the update, output variable +** (*pnOne) is set to 10000 to indicate that stage 1 has finished and (*pnTwo) +** to a value between 0 and 10000 to indicate the permyriadage progress of +** stage 2. A value of 5000 indicates that stage 2 is half finished, +** 9000 indicates that it is 90% finished, and so on. +** +** If this API is called during stage 1 of the update, output variable +** (*pnTwo) is set to 0 to indicate that stage 2 has not yet started. The +** value to which (*pnOne) is set depends on whether or not the RBU +** database contains an "rbu_count" table. The rbu_count table, if it +** exists, must contain the same columns as the following: +** +** CREATE TABLE rbu_count(tbl TEXT PRIMARY KEY, cnt INTEGER) WITHOUT ROWID; +** +** There must be one row in the table for each source (data_xxx) table within +** the RBU database. The 'tbl' column should contain the name of the source +** table. The 'cnt' column should contain the number of rows within the +** source table. +** +** If the rbu_count table is present and populated correctly and this +** API is called during stage 1, the *pnOne output variable is set to the +** permyriadage progress of the same stage. If the rbu_count table does +** not exist, then (*pnOne) is set to -1 during stage 1. If the rbu_count +** table exists but is not correctly populated, the value of the *pnOne +** output variable during stage 1 is undefined. +*/ +SQLITE_API void sqlite3rbu_bp_progress(sqlite3rbu *pRbu, int *pnOne, int *pnTwo); + +/* +** Obtain an indication as to the current stage of an RBU update or vacuum. +** This function always returns one of the SQLITE_RBU_STATE_XXX constants +** defined in this file. Return values should be interpreted as follows: +** +** SQLITE_RBU_STATE_OAL: +** RBU is currently building a *-oal file. The next call to sqlite3rbu_step() +** may either add further data to the *-oal file, or compute data that will +** be added by a subsequent call. +** +** SQLITE_RBU_STATE_MOVE: +** RBU has finished building the *-oal file. The next call to sqlite3rbu_step() +** will move the *-oal file to the equivalent *-wal path. If the current +** operation is an RBU update, then the updated version of the database +** file will become visible to ordinary SQLite clients following the next +** call to sqlite3rbu_step(). +** +** SQLITE_RBU_STATE_CHECKPOINT: +** RBU is currently performing an incremental checkpoint. The next call to +** sqlite3rbu_step() will copy a page of data from the *-wal file into +** the target database file. +** +** SQLITE_RBU_STATE_DONE: +** The RBU operation has finished. Any subsequent calls to sqlite3rbu_step() +** will immediately return SQLITE_DONE. +** +** SQLITE_RBU_STATE_ERROR: +** An error has occurred. Any subsequent calls to sqlite3rbu_step() will +** immediately return the SQLite error code associated with the error. +*/ +#define SQLITE_RBU_STATE_OAL 1 +#define SQLITE_RBU_STATE_MOVE 2 +#define SQLITE_RBU_STATE_CHECKPOINT 3 +#define SQLITE_RBU_STATE_DONE 4 +#define SQLITE_RBU_STATE_ERROR 5 + +SQLITE_API int sqlite3rbu_state(sqlite3rbu *pRbu); + +/* +** Create an RBU VFS named zName that accesses the underlying file-system +** via existing VFS zParent. Or, if the zParent parameter is passed NULL, +** then the new RBU VFS uses the default system VFS to access the file-system. +** The new object is registered as a non-default VFS with SQLite before +** returning. +** +** Part of the RBU implementation uses a custom VFS object. Usually, this +** object is created and deleted automatically by RBU. +** +** The exception is for applications that also use zipvfs. In this case, +** the custom VFS must be explicitly created by the user before the RBU +** handle is opened. The RBU VFS should be installed so that the zipvfs +** VFS uses the RBU VFS, which in turn uses any other VFS layers in use +** (for example multiplexor) to access the file-system. For example, +** to assemble an RBU enabled VFS stack that uses both zipvfs and +** multiplexor (error checking omitted): +** +** // Create a VFS named "multiplex" (not the default). +** sqlite3_multiplex_initialize(0, 0); +** +** // Create an rbu VFS named "rbu" that uses multiplexor. If the +** // second argument were replaced with NULL, the "rbu" VFS would +** // access the file-system via the system default VFS, bypassing the +** // multiplexor. +** sqlite3rbu_create_vfs("rbu", "multiplex"); +** +** // Create a zipvfs VFS named "zipvfs" that uses rbu. +** zipvfs_create_vfs_v3("zipvfs", "rbu", 0, xCompressorAlgorithmDetector); +** +** // Make zipvfs the default VFS. +** sqlite3_vfs_register(sqlite3_vfs_find("zipvfs"), 1); +** +** Because the default VFS created above includes a RBU functionality, it +** may be used by RBU clients. Attempting to use RBU with a zipvfs VFS stack +** that does not include the RBU layer results in an error. +** +** The overhead of adding the "rbu" VFS to the system is negligible for +** non-RBU users. There is no harm in an application accessing the +** file-system via "rbu" all the time, even if it only uses RBU functionality +** occasionally. +*/ +SQLITE_API int sqlite3rbu_create_vfs(const char *zName, const char *zParent); + +/* +** Deregister and destroy an RBU vfs created by an earlier call to +** sqlite3rbu_create_vfs(). +** +** VFS objects are not reference counted. If a VFS object is destroyed +** before all database handles that use it have been closed, the results +** are undefined. +*/ +SQLITE_API void sqlite3rbu_destroy_vfs(const char *zName); + +#if 0 +} /* end of the 'extern "C"' block */ +#endif + +#endif /* _SQLITE3RBU_H */ + +/************** End of sqlite3rbu.h ******************************************/ +/************** Continuing where we left off in sqlite3rbu.c *****************/ + +#if defined(_WIN32_WCE) +/* #include "windows.h" */ +#endif + +/* Maximum number of prepared UPDATE statements held by this module */ +#define SQLITE_RBU_UPDATE_CACHESIZE 16 + +/* +** Swap two objects of type TYPE. +*/ +#if !defined(SQLITE_AMALGAMATION) +# define SWAP(TYPE,A,B) {TYPE t=A; A=B; B=t;} +#endif + +/* +** The rbu_state table is used to save the state of a partially applied +** update so that it can be resumed later. The table consists of integer +** keys mapped to values as follows: +** +** RBU_STATE_STAGE: +** May be set to integer values 1, 2, 4 or 5. As follows: +** 1: the *-rbu file is currently under construction. +** 2: the *-rbu file has been constructed, but not yet moved +** to the *-wal path. +** 4: the checkpoint is underway. +** 5: the rbu update has been checkpointed. +** +** RBU_STATE_TBL: +** Only valid if STAGE==1. The target database name of the table +** currently being written. +** +** RBU_STATE_IDX: +** Only valid if STAGE==1. The target database name of the index +** currently being written, or NULL if the main table is currently being +** updated. +** +** RBU_STATE_ROW: +** Only valid if STAGE==1. Number of rows already processed for the current +** table/index. +** +** RBU_STATE_PROGRESS: +** Trbul number of sqlite3rbu_step() calls made so far as part of this +** rbu update. +** +** RBU_STATE_CKPT: +** Valid if STAGE==4. The 64-bit checksum associated with the wal-index +** header created by recovering the *-wal file. This is used to detect +** cases when another client appends frames to the *-wal file in the +** middle of an incremental checkpoint (an incremental checkpoint cannot +** be continued if this happens). +** +** RBU_STATE_COOKIE: +** Valid if STAGE==1. The current change-counter cookie value in the +** target db file. +** +** RBU_STATE_OALSZ: +** Valid if STAGE==1. The size in bytes of the *-oal file. +*/ +#define RBU_STATE_STAGE 1 +#define RBU_STATE_TBL 2 +#define RBU_STATE_IDX 3 +#define RBU_STATE_ROW 4 +#define RBU_STATE_PROGRESS 5 +#define RBU_STATE_CKPT 6 +#define RBU_STATE_COOKIE 7 +#define RBU_STATE_OALSZ 8 +#define RBU_STATE_PHASEONESTEP 9 + +#define RBU_STAGE_OAL 1 +#define RBU_STAGE_MOVE 2 +#define RBU_STAGE_CAPTURE 3 +#define RBU_STAGE_CKPT 4 +#define RBU_STAGE_DONE 5 + + +#define RBU_CREATE_STATE \ + "CREATE TABLE IF NOT EXISTS %s.rbu_state(k INTEGER PRIMARY KEY, v)" + +typedef struct RbuFrame RbuFrame; +typedef struct RbuObjIter RbuObjIter; +typedef struct RbuState RbuState; +typedef struct rbu_vfs rbu_vfs; +typedef struct rbu_file rbu_file; +typedef struct RbuUpdateStmt RbuUpdateStmt; + +#if !defined(SQLITE_AMALGAMATION) +typedef unsigned int u32; +typedef unsigned short u16; +typedef unsigned char u8; +typedef sqlite3_int64 i64; +#endif + +/* +** These values must match the values defined in wal.c for the equivalent +** locks. These are not magic numbers as they are part of the SQLite file +** format. +*/ +#define WAL_LOCK_WRITE 0 +#define WAL_LOCK_CKPT 1 +#define WAL_LOCK_READ0 3 + +#define SQLITE_FCNTL_RBUCNT 5149216 + +/* +** A structure to store values read from the rbu_state table in memory. +*/ +struct RbuState { + int eStage; + char *zTbl; + char *zIdx; + i64 iWalCksum; + int nRow; + i64 nProgress; + u32 iCookie; + i64 iOalSz; + i64 nPhaseOneStep; +}; + +struct RbuUpdateStmt { + char *zMask; /* Copy of update mask used with pUpdate */ + sqlite3_stmt *pUpdate; /* Last update statement (or NULL) */ + RbuUpdateStmt *pNext; +}; + +/* +** An iterator of this type is used to iterate through all objects in +** the target database that require updating. For each such table, the +** iterator visits, in order: +** +** * the table itself, +** * each index of the table (zero or more points to visit), and +** * a special "cleanup table" state. +** +** abIndexed: +** If the table has no indexes on it, abIndexed is set to NULL. Otherwise, +** it points to an array of flags nTblCol elements in size. The flag is +** set for each column that is either a part of the PK or a part of an +** index. Or clear otherwise. +** +*/ +struct RbuObjIter { + sqlite3_stmt *pTblIter; /* Iterate through tables */ + sqlite3_stmt *pIdxIter; /* Index iterator */ + int nTblCol; /* Size of azTblCol[] array */ + char **azTblCol; /* Array of unquoted target column names */ + char **azTblType; /* Array of target column types */ + int *aiSrcOrder; /* src table col -> target table col */ + u8 *abTblPk; /* Array of flags, set on target PK columns */ + u8 *abNotNull; /* Array of flags, set on NOT NULL columns */ + u8 *abIndexed; /* Array of flags, set on indexed & PK cols */ + int eType; /* Table type - an RBU_PK_XXX value */ + + /* Output variables. zTbl==0 implies EOF. */ + int bCleanup; /* True in "cleanup" state */ + const char *zTbl; /* Name of target db table */ + const char *zDataTbl; /* Name of rbu db table (or null) */ + const char *zIdx; /* Name of target db index (or null) */ + int iTnum; /* Root page of current object */ + int iPkTnum; /* If eType==EXTERNAL, root of PK index */ + int bUnique; /* Current index is unique */ + int nIndex; /* Number of aux. indexes on table zTbl */ + + /* Statements created by rbuObjIterPrepareAll() */ + int nCol; /* Number of columns in current object */ + sqlite3_stmt *pSelect; /* Source data */ + sqlite3_stmt *pInsert; /* Statement for INSERT operations */ + sqlite3_stmt *pDelete; /* Statement for DELETE ops */ + sqlite3_stmt *pTmpInsert; /* Insert into rbu_tmp_$zDataTbl */ + + /* Last UPDATE used (for PK b-tree updates only), or NULL. */ + RbuUpdateStmt *pRbuUpdate; +}; + +/* +** Values for RbuObjIter.eType +** +** 0: Table does not exist (error) +** 1: Table has an implicit rowid. +** 2: Table has an explicit IPK column. +** 3: Table has an external PK index. +** 4: Table is WITHOUT ROWID. +** 5: Table is a virtual table. +*/ +#define RBU_PK_NOTABLE 0 +#define RBU_PK_NONE 1 +#define RBU_PK_IPK 2 +#define RBU_PK_EXTERNAL 3 +#define RBU_PK_WITHOUT_ROWID 4 +#define RBU_PK_VTAB 5 + + +/* +** Within the RBU_STAGE_OAL stage, each call to sqlite3rbu_step() performs +** one of the following operations. +*/ +#define RBU_INSERT 1 /* Insert on a main table b-tree */ +#define RBU_DELETE 2 /* Delete a row from a main table b-tree */ +#define RBU_REPLACE 3 /* Delete and then insert a row */ +#define RBU_IDX_DELETE 4 /* Delete a row from an aux. index b-tree */ +#define RBU_IDX_INSERT 5 /* Insert on an aux. index b-tree */ + +#define RBU_UPDATE 6 /* Update a row in a main table b-tree */ + +/* +** A single step of an incremental checkpoint - frame iWalFrame of the wal +** file should be copied to page iDbPage of the database file. +*/ +struct RbuFrame { + u32 iDbPage; + u32 iWalFrame; +}; + +/* +** RBU handle. +** +** nPhaseOneStep: +** If the RBU database contains an rbu_count table, this value is set to +** a running estimate of the number of b-tree operations required to +** finish populating the *-oal file. This allows the sqlite3_bp_progress() +** API to calculate the permyriadage progress of populating the *-oal file +** using the formula: +** +** permyriadage = (10000 * nProgress) / nPhaseOneStep +** +** nPhaseOneStep is initialized to the sum of: +** +** nRow * (nIndex + 1) +** +** for all source tables in the RBU database, where nRow is the number +** of rows in the source table and nIndex the number of indexes on the +** corresponding target database table. +** +** This estimate is accurate if the RBU update consists entirely of +** INSERT operations. However, it is inaccurate if: +** +** * the RBU update contains any UPDATE operations. If the PK specified +** for an UPDATE operation does not exist in the target table, then +** no b-tree operations are required on index b-trees. Or if the +** specified PK does exist, then (nIndex*2) such operations are +** required (one delete and one insert on each index b-tree). +** +** * the RBU update contains any DELETE operations for which the specified +** PK does not exist. In this case no operations are required on index +** b-trees. +** +** * the RBU update contains REPLACE operations. These are similar to +** UPDATE operations. +** +** nPhaseOneStep is updated to account for the conditions above during the +** first pass of each source table. The updated nPhaseOneStep value is +** stored in the rbu_state table if the RBU update is suspended. +*/ +struct sqlite3rbu { + int eStage; /* Value of RBU_STATE_STAGE field */ + sqlite3 *dbMain; /* target database handle */ + sqlite3 *dbRbu; /* rbu database handle */ + char *zTarget; /* Path to target db */ + char *zRbu; /* Path to rbu db */ + char *zState; /* Path to state db (or NULL if zRbu) */ + char zStateDb[5]; /* Db name for state ("stat" or "main") */ + int rc; /* Value returned by last rbu_step() call */ + char *zErrmsg; /* Error message if rc!=SQLITE_OK */ + int nStep; /* Rows processed for current object */ + int nProgress; /* Rows processed for all objects */ + RbuObjIter objiter; /* Iterator for skipping through tbl/idx */ + const char *zVfsName; /* Name of automatically created rbu vfs */ + rbu_file *pTargetFd; /* File handle open on target db */ + i64 iOalSz; + i64 nPhaseOneStep; + + /* The following state variables are used as part of the incremental + ** checkpoint stage (eStage==RBU_STAGE_CKPT). See comments surrounding + ** function rbuSetupCheckpoint() for details. */ + u32 iMaxFrame; /* Largest iWalFrame value in aFrame[] */ + u32 mLock; + int nFrame; /* Entries in aFrame[] array */ + int nFrameAlloc; /* Allocated size of aFrame[] array */ + RbuFrame *aFrame; + int pgsz; + u8 *aBuf; + i64 iWalCksum; + + /* Used in RBU vacuum mode only */ + int nRbu; /* Number of RBU VFS in the stack */ + rbu_file *pRbuFd; /* Fd for main db of dbRbu */ +}; + +/* +** An rbu VFS is implemented using an instance of this structure. +*/ +struct rbu_vfs { + sqlite3_vfs base; /* rbu VFS shim methods */ + sqlite3_vfs *pRealVfs; /* Underlying VFS */ + sqlite3_mutex *mutex; /* Mutex to protect pMain */ + rbu_file *pMain; /* Linked list of main db files */ +}; + +/* +** Each file opened by an rbu VFS is represented by an instance of +** the following structure. +*/ +struct rbu_file { + sqlite3_file base; /* sqlite3_file methods */ + sqlite3_file *pReal; /* Underlying file handle */ + rbu_vfs *pRbuVfs; /* Pointer to the rbu_vfs object */ + sqlite3rbu *pRbu; /* Pointer to rbu object (rbu target only) */ + + int openFlags; /* Flags this file was opened with */ + u32 iCookie; /* Cookie value for main db files */ + u8 iWriteVer; /* "write-version" value for main db files */ + u8 bNolock; /* True to fail EXCLUSIVE locks */ + + int nShm; /* Number of entries in apShm[] array */ + char **apShm; /* Array of mmap'd *-shm regions */ + char *zDel; /* Delete this when closing file */ + + const char *zWal; /* Wal filename for this main db file */ + rbu_file *pWalFd; /* Wal file descriptor for this main db */ + rbu_file *pMainNext; /* Next MAIN_DB file */ +}; + +/* +** True for an RBU vacuum handle, or false otherwise. +*/ +#define rbuIsVacuum(p) ((p)->zTarget==0) + + +/************************************************************************* +** The following three functions, found below: +** +** rbuDeltaGetInt() +** rbuDeltaChecksum() +** rbuDeltaApply() +** +** are lifted from the fossil source code (http://fossil-scm.org). They +** are used to implement the scalar SQL function rbu_fossil_delta(). +*/ + +/* +** Read bytes from *pz and convert them into a positive integer. When +** finished, leave *pz pointing to the first character past the end of +** the integer. The *pLen parameter holds the length of the string +** in *pz and is decremented once for each character in the integer. +*/ +static unsigned int rbuDeltaGetInt(const char **pz, int *pLen){ + static const signed char zValue[] = { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, 36, + -1, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, -1, -1, -1, 63, -1, + }; + unsigned int v = 0; + int c; + unsigned char *z = (unsigned char*)*pz; + unsigned char *zStart = z; + while( (c = zValue[0x7f&*(z++)])>=0 ){ + v = (v<<6) + c; + } + z--; + *pLen -= z - zStart; + *pz = (char*)z; + return v; +} + +/* +** Compute a 32-bit checksum on the N-byte buffer. Return the result. +*/ +static unsigned int rbuDeltaChecksum(const char *zIn, size_t N){ + const unsigned char *z = (const unsigned char *)zIn; + unsigned sum0 = 0; + unsigned sum1 = 0; + unsigned sum2 = 0; + unsigned sum3 = 0; + while(N >= 16){ + sum0 += ((unsigned)z[0] + z[4] + z[8] + z[12]); + sum1 += ((unsigned)z[1] + z[5] + z[9] + z[13]); + sum2 += ((unsigned)z[2] + z[6] + z[10]+ z[14]); + sum3 += ((unsigned)z[3] + z[7] + z[11]+ z[15]); + z += 16; + N -= 16; + } + while(N >= 4){ + sum0 += z[0]; + sum1 += z[1]; + sum2 += z[2]; + sum3 += z[3]; + z += 4; + N -= 4; + } + sum3 += (sum2 << 8) + (sum1 << 16) + (sum0 << 24); + switch(N){ + case 3: sum3 += (z[2] << 8); + case 2: sum3 += (z[1] << 16); + case 1: sum3 += (z[0] << 24); + default: ; + } + return sum3; +} + +/* +** Apply a delta. +** +** The output buffer should be big enough to hold the whole output +** file and a NUL terminator at the end. The delta_output_size() +** routine will determine this size for you. +** +** The delta string should be null-terminated. But the delta string +** may contain embedded NUL characters (if the input and output are +** binary files) so we also have to pass in the length of the delta in +** the lenDelta parameter. +** +** This function returns the size of the output file in bytes (excluding +** the final NUL terminator character). Except, if the delta string is +** malformed or intended for use with a source file other than zSrc, +** then this routine returns -1. +** +** Refer to the delta_create() documentation above for a description +** of the delta file format. +*/ +static int rbuDeltaApply( + const char *zSrc, /* The source or pattern file */ + int lenSrc, /* Length of the source file */ + const char *zDelta, /* Delta to apply to the pattern */ + int lenDelta, /* Length of the delta */ + char *zOut /* Write the output into this preallocated buffer */ +){ + unsigned int limit; + unsigned int total = 0; +#ifndef FOSSIL_OMIT_DELTA_CKSUM_TEST + char *zOrigOut = zOut; +#endif + + limit = rbuDeltaGetInt(&zDelta, &lenDelta); + if( *zDelta!='\n' ){ + /* ERROR: size integer not terminated by "\n" */ + return -1; + } + zDelta++; lenDelta--; + while( *zDelta && lenDelta>0 ){ + unsigned int cnt, ofst; + cnt = rbuDeltaGetInt(&zDelta, &lenDelta); + switch( zDelta[0] ){ + case '@': { + zDelta++; lenDelta--; + ofst = rbuDeltaGetInt(&zDelta, &lenDelta); + if( lenDelta>0 && zDelta[0]!=',' ){ + /* ERROR: copy command not terminated by ',' */ + return -1; + } + zDelta++; lenDelta--; + total += cnt; + if( total>limit ){ + /* ERROR: copy exceeds output file size */ + return -1; + } + if( (int)(ofst+cnt) > lenSrc ){ + /* ERROR: copy extends past end of input */ + return -1; + } + memcpy(zOut, &zSrc[ofst], cnt); + zOut += cnt; + break; + } + case ':': { + zDelta++; lenDelta--; + total += cnt; + if( total>limit ){ + /* ERROR: insert command gives an output larger than predicted */ + return -1; + } + if( (int)cnt>lenDelta ){ + /* ERROR: insert count exceeds size of delta */ + return -1; + } + memcpy(zOut, zDelta, cnt); + zOut += cnt; + zDelta += cnt; + lenDelta -= cnt; + break; + } + case ';': { + zDelta++; lenDelta--; + zOut[0] = 0; +#ifndef FOSSIL_OMIT_DELTA_CKSUM_TEST + if( cnt!=rbuDeltaChecksum(zOrigOut, total) ){ + /* ERROR: bad checksum */ + return -1; + } +#endif + if( total!=limit ){ + /* ERROR: generated size does not match predicted size */ + return -1; + } + return total; + } + default: { + /* ERROR: unknown delta operator */ + return -1; + } + } + } + /* ERROR: unterminated delta */ + return -1; +} + +static int rbuDeltaOutputSize(const char *zDelta, int lenDelta){ + int size; + size = rbuDeltaGetInt(&zDelta, &lenDelta); + if( *zDelta!='\n' ){ + /* ERROR: size integer not terminated by "\n" */ + return -1; + } + return size; +} + +/* +** End of code taken from fossil. +*************************************************************************/ + +/* +** Implementation of SQL scalar function rbu_fossil_delta(). +** +** This function applies a fossil delta patch to a blob. Exactly two +** arguments must be passed to this function. The first is the blob to +** patch and the second the patch to apply. If no error occurs, this +** function returns the patched blob. +*/ +static void rbuFossilDeltaFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const char *aDelta; + int nDelta; + const char *aOrig; + int nOrig; + + int nOut; + int nOut2; + char *aOut; + + assert( argc==2 ); + + nOrig = sqlite3_value_bytes(argv[0]); + aOrig = (const char*)sqlite3_value_blob(argv[0]); + nDelta = sqlite3_value_bytes(argv[1]); + aDelta = (const char*)sqlite3_value_blob(argv[1]); + + /* Figure out the size of the output */ + nOut = rbuDeltaOutputSize(aDelta, nDelta); + if( nOut<0 ){ + sqlite3_result_error(context, "corrupt fossil delta", -1); + return; + } + + aOut = sqlite3_malloc(nOut+1); + if( aOut==0 ){ + sqlite3_result_error_nomem(context); + }else{ + nOut2 = rbuDeltaApply(aOrig, nOrig, aDelta, nDelta, aOut); + if( nOut2!=nOut ){ + sqlite3_result_error(context, "corrupt fossil delta", -1); + }else{ + sqlite3_result_blob(context, aOut, nOut, sqlite3_free); + } + } +} + + +/* +** Prepare the SQL statement in buffer zSql against database handle db. +** If successful, set *ppStmt to point to the new statement and return +** SQLITE_OK. +** +** Otherwise, if an error does occur, set *ppStmt to NULL and return +** an SQLite error code. Additionally, set output variable *pzErrmsg to +** point to a buffer containing an error message. It is the responsibility +** of the caller to (eventually) free this buffer using sqlite3_free(). +*/ +static int prepareAndCollectError( + sqlite3 *db, + sqlite3_stmt **ppStmt, + char **pzErrmsg, + const char *zSql +){ + int rc = sqlite3_prepare_v2(db, zSql, -1, ppStmt, 0); + if( rc!=SQLITE_OK ){ + *pzErrmsg = sqlite3_mprintf("%s", sqlite3_errmsg(db)); + *ppStmt = 0; + } + return rc; +} + +/* +** Reset the SQL statement passed as the first argument. Return a copy +** of the value returned by sqlite3_reset(). +** +** If an error has occurred, then set *pzErrmsg to point to a buffer +** containing an error message. It is the responsibility of the caller +** to eventually free this buffer using sqlite3_free(). +*/ +static int resetAndCollectError(sqlite3_stmt *pStmt, char **pzErrmsg){ + int rc = sqlite3_reset(pStmt); + if( rc!=SQLITE_OK ){ + *pzErrmsg = sqlite3_mprintf("%s", sqlite3_errmsg(sqlite3_db_handle(pStmt))); + } + return rc; +} + +/* +** Unless it is NULL, argument zSql points to a buffer allocated using +** sqlite3_malloc containing an SQL statement. This function prepares the SQL +** statement against database db and frees the buffer. If statement +** compilation is successful, *ppStmt is set to point to the new statement +** handle and SQLITE_OK is returned. +** +** Otherwise, if an error occurs, *ppStmt is set to NULL and an error code +** returned. In this case, *pzErrmsg may also be set to point to an error +** message. It is the responsibility of the caller to free this error message +** buffer using sqlite3_free(). +** +** If argument zSql is NULL, this function assumes that an OOM has occurred. +** In this case SQLITE_NOMEM is returned and *ppStmt set to NULL. +*/ +static int prepareFreeAndCollectError( + sqlite3 *db, + sqlite3_stmt **ppStmt, + char **pzErrmsg, + char *zSql +){ + int rc; + assert( *pzErrmsg==0 ); + if( zSql==0 ){ + rc = SQLITE_NOMEM; + *ppStmt = 0; + }else{ + rc = prepareAndCollectError(db, ppStmt, pzErrmsg, zSql); + sqlite3_free(zSql); + } + return rc; +} + +/* +** Free the RbuObjIter.azTblCol[] and RbuObjIter.abTblPk[] arrays allocated +** by an earlier call to rbuObjIterCacheTableInfo(). +*/ +static void rbuObjIterFreeCols(RbuObjIter *pIter){ + int i; + for(i=0; inTblCol; i++){ + sqlite3_free(pIter->azTblCol[i]); + sqlite3_free(pIter->azTblType[i]); + } + sqlite3_free(pIter->azTblCol); + pIter->azTblCol = 0; + pIter->azTblType = 0; + pIter->aiSrcOrder = 0; + pIter->abTblPk = 0; + pIter->abNotNull = 0; + pIter->nTblCol = 0; + pIter->eType = 0; /* Invalid value */ +} + +/* +** Finalize all statements and free all allocations that are specific to +** the current object (table/index pair). +*/ +static void rbuObjIterClearStatements(RbuObjIter *pIter){ + RbuUpdateStmt *pUp; + + sqlite3_finalize(pIter->pSelect); + sqlite3_finalize(pIter->pInsert); + sqlite3_finalize(pIter->pDelete); + sqlite3_finalize(pIter->pTmpInsert); + pUp = pIter->pRbuUpdate; + while( pUp ){ + RbuUpdateStmt *pTmp = pUp->pNext; + sqlite3_finalize(pUp->pUpdate); + sqlite3_free(pUp); + pUp = pTmp; + } + + pIter->pSelect = 0; + pIter->pInsert = 0; + pIter->pDelete = 0; + pIter->pRbuUpdate = 0; + pIter->pTmpInsert = 0; + pIter->nCol = 0; +} + +/* +** Clean up any resources allocated as part of the iterator object passed +** as the only argument. +*/ +static void rbuObjIterFinalize(RbuObjIter *pIter){ + rbuObjIterClearStatements(pIter); + sqlite3_finalize(pIter->pTblIter); + sqlite3_finalize(pIter->pIdxIter); + rbuObjIterFreeCols(pIter); + memset(pIter, 0, sizeof(RbuObjIter)); +} + +/* +** Advance the iterator to the next position. +** +** If no error occurs, SQLITE_OK is returned and the iterator is left +** pointing to the next entry. Otherwise, an error code and message is +** left in the RBU handle passed as the first argument. A copy of the +** error code is returned. +*/ +static int rbuObjIterNext(sqlite3rbu *p, RbuObjIter *pIter){ + int rc = p->rc; + if( rc==SQLITE_OK ){ + + /* Free any SQLite statements used while processing the previous object */ + rbuObjIterClearStatements(pIter); + if( pIter->zIdx==0 ){ + rc = sqlite3_exec(p->dbMain, + "DROP TRIGGER IF EXISTS temp.rbu_insert_tr;" + "DROP TRIGGER IF EXISTS temp.rbu_update1_tr;" + "DROP TRIGGER IF EXISTS temp.rbu_update2_tr;" + "DROP TRIGGER IF EXISTS temp.rbu_delete_tr;" + , 0, 0, &p->zErrmsg + ); + } + + if( rc==SQLITE_OK ){ + if( pIter->bCleanup ){ + rbuObjIterFreeCols(pIter); + pIter->bCleanup = 0; + rc = sqlite3_step(pIter->pTblIter); + if( rc!=SQLITE_ROW ){ + rc = resetAndCollectError(pIter->pTblIter, &p->zErrmsg); + pIter->zTbl = 0; + }else{ + pIter->zTbl = (const char*)sqlite3_column_text(pIter->pTblIter, 0); + pIter->zDataTbl = (const char*)sqlite3_column_text(pIter->pTblIter,1); + rc = (pIter->zDataTbl && pIter->zTbl) ? SQLITE_OK : SQLITE_NOMEM; + } + }else{ + if( pIter->zIdx==0 ){ + sqlite3_stmt *pIdx = pIter->pIdxIter; + rc = sqlite3_bind_text(pIdx, 1, pIter->zTbl, -1, SQLITE_STATIC); + } + if( rc==SQLITE_OK ){ + rc = sqlite3_step(pIter->pIdxIter); + if( rc!=SQLITE_ROW ){ + rc = resetAndCollectError(pIter->pIdxIter, &p->zErrmsg); + pIter->bCleanup = 1; + pIter->zIdx = 0; + }else{ + pIter->zIdx = (const char*)sqlite3_column_text(pIter->pIdxIter, 0); + pIter->iTnum = sqlite3_column_int(pIter->pIdxIter, 1); + pIter->bUnique = sqlite3_column_int(pIter->pIdxIter, 2); + rc = pIter->zIdx ? SQLITE_OK : SQLITE_NOMEM; + } + } + } + } + } + + if( rc!=SQLITE_OK ){ + rbuObjIterFinalize(pIter); + p->rc = rc; + } + return rc; +} + + +/* +** The implementation of the rbu_target_name() SQL function. This function +** accepts one or two arguments. The first argument is the name of a table - +** the name of a table in the RBU database. The second, if it is present, is 1 +** for a view or 0 for a table. +** +** For a non-vacuum RBU handle, if the table name matches the pattern: +** +** data[0-9]_ +** +** where is any sequence of 1 or more characters, is returned. +** Otherwise, if the only argument does not match the above pattern, an SQL +** NULL is returned. +** +** "data_t1" -> "t1" +** "data0123_t2" -> "t2" +** "dataAB_t3" -> NULL +** +** For an rbu vacuum handle, a copy of the first argument is returned if +** the second argument is either missing or 0 (not a view). +*/ +static void rbuTargetNameFunc( + sqlite3_context *pCtx, + int argc, + sqlite3_value **argv +){ + sqlite3rbu *p = sqlite3_user_data(pCtx); + const char *zIn; + assert( argc==1 || argc==2 ); + + zIn = (const char*)sqlite3_value_text(argv[0]); + if( zIn ){ + if( rbuIsVacuum(p) ){ + if( argc==1 || 0==sqlite3_value_int(argv[1]) ){ + sqlite3_result_text(pCtx, zIn, -1, SQLITE_STATIC); + } + }else{ + if( strlen(zIn)>4 && memcmp("data", zIn, 4)==0 ){ + int i; + for(i=4; zIn[i]>='0' && zIn[i]<='9'; i++); + if( zIn[i]=='_' && zIn[i+1] ){ + sqlite3_result_text(pCtx, &zIn[i+1], -1, SQLITE_STATIC); + } + } + } + } +} + +/* +** Initialize the iterator structure passed as the second argument. +** +** If no error occurs, SQLITE_OK is returned and the iterator is left +** pointing to the first entry. Otherwise, an error code and message is +** left in the RBU handle passed as the first argument. A copy of the +** error code is returned. +*/ +static int rbuObjIterFirst(sqlite3rbu *p, RbuObjIter *pIter){ + int rc; + memset(pIter, 0, sizeof(RbuObjIter)); + + rc = prepareFreeAndCollectError(p->dbRbu, &pIter->pTblIter, &p->zErrmsg, + sqlite3_mprintf( + "SELECT rbu_target_name(name, type='view') AS target, name " + "FROM sqlite_master " + "WHERE type IN ('table', 'view') AND target IS NOT NULL " + " %s " + "ORDER BY name" + , rbuIsVacuum(p) ? "AND rootpage!=0 AND rootpage IS NOT NULL" : "")); + + if( rc==SQLITE_OK ){ + rc = prepareAndCollectError(p->dbMain, &pIter->pIdxIter, &p->zErrmsg, + "SELECT name, rootpage, sql IS NULL OR substr(8, 6)=='UNIQUE' " + " FROM main.sqlite_master " + " WHERE type='index' AND tbl_name = ?" + ); + } + + pIter->bCleanup = 1; + p->rc = rc; + return rbuObjIterNext(p, pIter); +} + +/* +** This is a wrapper around "sqlite3_mprintf(zFmt, ...)". If an OOM occurs, +** an error code is stored in the RBU handle passed as the first argument. +** +** If an error has already occurred (p->rc is already set to something other +** than SQLITE_OK), then this function returns NULL without modifying the +** stored error code. In this case it still calls sqlite3_free() on any +** printf() parameters associated with %z conversions. +*/ +static char *rbuMPrintf(sqlite3rbu *p, const char *zFmt, ...){ + char *zSql = 0; + va_list ap; + va_start(ap, zFmt); + zSql = sqlite3_vmprintf(zFmt, ap); + if( p->rc==SQLITE_OK ){ + if( zSql==0 ) p->rc = SQLITE_NOMEM; + }else{ + sqlite3_free(zSql); + zSql = 0; + } + va_end(ap); + return zSql; +} + +/* +** Argument zFmt is a sqlite3_mprintf() style format string. The trailing +** arguments are the usual subsitution values. This function performs +** the printf() style substitutions and executes the result as an SQL +** statement on the RBU handles database. +** +** If an error occurs, an error code and error message is stored in the +** RBU handle. If an error has already occurred when this function is +** called, it is a no-op. +*/ +static int rbuMPrintfExec(sqlite3rbu *p, sqlite3 *db, const char *zFmt, ...){ + va_list ap; + char *zSql; + va_start(ap, zFmt); + zSql = sqlite3_vmprintf(zFmt, ap); + if( p->rc==SQLITE_OK ){ + if( zSql==0 ){ + p->rc = SQLITE_NOMEM; + }else{ + p->rc = sqlite3_exec(db, zSql, 0, 0, &p->zErrmsg); + } + } + sqlite3_free(zSql); + va_end(ap); + return p->rc; +} + +/* +** Attempt to allocate and return a pointer to a zeroed block of nByte +** bytes. +** +** If an error (i.e. an OOM condition) occurs, return NULL and leave an +** error code in the rbu handle passed as the first argument. Or, if an +** error has already occurred when this function is called, return NULL +** immediately without attempting the allocation or modifying the stored +** error code. +*/ +static void *rbuMalloc(sqlite3rbu *p, int nByte){ + void *pRet = 0; + if( p->rc==SQLITE_OK ){ + assert( nByte>0 ); + pRet = sqlite3_malloc64(nByte); + if( pRet==0 ){ + p->rc = SQLITE_NOMEM; + }else{ + memset(pRet, 0, nByte); + } + } + return pRet; +} + + +/* +** Allocate and zero the pIter->azTblCol[] and abTblPk[] arrays so that +** there is room for at least nCol elements. If an OOM occurs, store an +** error code in the RBU handle passed as the first argument. +*/ +static void rbuAllocateIterArrays(sqlite3rbu *p, RbuObjIter *pIter, int nCol){ + int nByte = (2*sizeof(char*) + sizeof(int) + 3*sizeof(u8)) * nCol; + char **azNew; + + azNew = (char**)rbuMalloc(p, nByte); + if( azNew ){ + pIter->azTblCol = azNew; + pIter->azTblType = &azNew[nCol]; + pIter->aiSrcOrder = (int*)&pIter->azTblType[nCol]; + pIter->abTblPk = (u8*)&pIter->aiSrcOrder[nCol]; + pIter->abNotNull = (u8*)&pIter->abTblPk[nCol]; + pIter->abIndexed = (u8*)&pIter->abNotNull[nCol]; + } +} + +/* +** The first argument must be a nul-terminated string. This function +** returns a copy of the string in memory obtained from sqlite3_malloc(). +** It is the responsibility of the caller to eventually free this memory +** using sqlite3_free(). +** +** If an OOM condition is encountered when attempting to allocate memory, +** output variable (*pRc) is set to SQLITE_NOMEM before returning. Otherwise, +** if the allocation succeeds, (*pRc) is left unchanged. +*/ +static char *rbuStrndup(const char *zStr, int *pRc){ + char *zRet = 0; + + assert( *pRc==SQLITE_OK ); + if( zStr ){ + size_t nCopy = strlen(zStr) + 1; + zRet = (char*)sqlite3_malloc64(nCopy); + if( zRet ){ + memcpy(zRet, zStr, nCopy); + }else{ + *pRc = SQLITE_NOMEM; + } + } + + return zRet; +} + +/* +** Finalize the statement passed as the second argument. +** +** If the sqlite3_finalize() call indicates that an error occurs, and the +** rbu handle error code is not already set, set the error code and error +** message accordingly. +*/ +static void rbuFinalize(sqlite3rbu *p, sqlite3_stmt *pStmt){ + sqlite3 *db = sqlite3_db_handle(pStmt); + int rc = sqlite3_finalize(pStmt); + if( p->rc==SQLITE_OK && rc!=SQLITE_OK ){ + p->rc = rc; + p->zErrmsg = sqlite3_mprintf("%s", sqlite3_errmsg(db)); + } +} + +/* Determine the type of a table. +** +** peType is of type (int*), a pointer to an output parameter of type +** (int). This call sets the output parameter as follows, depending +** on the type of the table specified by parameters dbName and zTbl. +** +** RBU_PK_NOTABLE: No such table. +** RBU_PK_NONE: Table has an implicit rowid. +** RBU_PK_IPK: Table has an explicit IPK column. +** RBU_PK_EXTERNAL: Table has an external PK index. +** RBU_PK_WITHOUT_ROWID: Table is WITHOUT ROWID. +** RBU_PK_VTAB: Table is a virtual table. +** +** Argument *piPk is also of type (int*), and also points to an output +** parameter. Unless the table has an external primary key index +** (i.e. unless *peType is set to 3), then *piPk is set to zero. Or, +** if the table does have an external primary key index, then *piPk +** is set to the root page number of the primary key index before +** returning. +** +** ALGORITHM: +** +** if( no entry exists in sqlite_master ){ +** return RBU_PK_NOTABLE +** }else if( sql for the entry starts with "CREATE VIRTUAL" ){ +** return RBU_PK_VTAB +** }else if( "PRAGMA index_list()" for the table contains a "pk" index ){ +** if( the index that is the pk exists in sqlite_master ){ +** *piPK = rootpage of that index. +** return RBU_PK_EXTERNAL +** }else{ +** return RBU_PK_WITHOUT_ROWID +** } +** }else if( "PRAGMA table_info()" lists one or more "pk" columns ){ +** return RBU_PK_IPK +** }else{ +** return RBU_PK_NONE +** } +*/ +static void rbuTableType( + sqlite3rbu *p, + const char *zTab, + int *peType, + int *piTnum, + int *piPk +){ + /* + ** 0) SELECT count(*) FROM sqlite_master where name=%Q AND IsVirtual(%Q) + ** 1) PRAGMA index_list = ? + ** 2) SELECT count(*) FROM sqlite_master where name=%Q + ** 3) PRAGMA table_info = ? + */ + sqlite3_stmt *aStmt[4] = {0, 0, 0, 0}; + + *peType = RBU_PK_NOTABLE; + *piPk = 0; + + assert( p->rc==SQLITE_OK ); + p->rc = prepareFreeAndCollectError(p->dbMain, &aStmt[0], &p->zErrmsg, + sqlite3_mprintf( + "SELECT (sql LIKE 'create virtual%%'), rootpage" + " FROM sqlite_master" + " WHERE name=%Q", zTab + )); + if( p->rc!=SQLITE_OK || sqlite3_step(aStmt[0])!=SQLITE_ROW ){ + /* Either an error, or no such table. */ + goto rbuTableType_end; + } + if( sqlite3_column_int(aStmt[0], 0) ){ + *peType = RBU_PK_VTAB; /* virtual table */ + goto rbuTableType_end; + } + *piTnum = sqlite3_column_int(aStmt[0], 1); + + p->rc = prepareFreeAndCollectError(p->dbMain, &aStmt[1], &p->zErrmsg, + sqlite3_mprintf("PRAGMA index_list=%Q",zTab) + ); + if( p->rc ) goto rbuTableType_end; + while( sqlite3_step(aStmt[1])==SQLITE_ROW ){ + const u8 *zOrig = sqlite3_column_text(aStmt[1], 3); + const u8 *zIdx = sqlite3_column_text(aStmt[1], 1); + if( zOrig && zIdx && zOrig[0]=='p' ){ + p->rc = prepareFreeAndCollectError(p->dbMain, &aStmt[2], &p->zErrmsg, + sqlite3_mprintf( + "SELECT rootpage FROM sqlite_master WHERE name = %Q", zIdx + )); + if( p->rc==SQLITE_OK ){ + if( sqlite3_step(aStmt[2])==SQLITE_ROW ){ + *piPk = sqlite3_column_int(aStmt[2], 0); + *peType = RBU_PK_EXTERNAL; + }else{ + *peType = RBU_PK_WITHOUT_ROWID; + } + } + goto rbuTableType_end; + } + } + + p->rc = prepareFreeAndCollectError(p->dbMain, &aStmt[3], &p->zErrmsg, + sqlite3_mprintf("PRAGMA table_info=%Q",zTab) + ); + if( p->rc==SQLITE_OK ){ + while( sqlite3_step(aStmt[3])==SQLITE_ROW ){ + if( sqlite3_column_int(aStmt[3],5)>0 ){ + *peType = RBU_PK_IPK; /* explicit IPK column */ + goto rbuTableType_end; + } + } + *peType = RBU_PK_NONE; + } + +rbuTableType_end: { + unsigned int i; + for(i=0; iabIndexed[] array. +*/ +static void rbuObjIterCacheIndexedCols(sqlite3rbu *p, RbuObjIter *pIter){ + sqlite3_stmt *pList = 0; + int bIndex = 0; + + if( p->rc==SQLITE_OK ){ + memcpy(pIter->abIndexed, pIter->abTblPk, sizeof(u8)*pIter->nTblCol); + p->rc = prepareFreeAndCollectError(p->dbMain, &pList, &p->zErrmsg, + sqlite3_mprintf("PRAGMA main.index_list = %Q", pIter->zTbl) + ); + } + + pIter->nIndex = 0; + while( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pList) ){ + const char *zIdx = (const char*)sqlite3_column_text(pList, 1); + sqlite3_stmt *pXInfo = 0; + if( zIdx==0 ) break; + p->rc = prepareFreeAndCollectError(p->dbMain, &pXInfo, &p->zErrmsg, + sqlite3_mprintf("PRAGMA main.index_xinfo = %Q", zIdx) + ); + while( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pXInfo) ){ + int iCid = sqlite3_column_int(pXInfo, 1); + if( iCid>=0 ) pIter->abIndexed[iCid] = 1; + } + rbuFinalize(p, pXInfo); + bIndex = 1; + pIter->nIndex++; + } + + if( pIter->eType==RBU_PK_WITHOUT_ROWID ){ + /* "PRAGMA index_list" includes the main PK b-tree */ + pIter->nIndex--; + } + + rbuFinalize(p, pList); + if( bIndex==0 ) pIter->abIndexed = 0; +} + + +/* +** If they are not already populated, populate the pIter->azTblCol[], +** pIter->abTblPk[], pIter->nTblCol and pIter->bRowid variables according to +** the table (not index) that the iterator currently points to. +** +** Return SQLITE_OK if successful, or an SQLite error code otherwise. If +** an error does occur, an error code and error message are also left in +** the RBU handle. +*/ +static int rbuObjIterCacheTableInfo(sqlite3rbu *p, RbuObjIter *pIter){ + if( pIter->azTblCol==0 ){ + sqlite3_stmt *pStmt = 0; + int nCol = 0; + int i; /* for() loop iterator variable */ + int bRbuRowid = 0; /* If input table has column "rbu_rowid" */ + int iOrder = 0; + int iTnum = 0; + + /* Figure out the type of table this step will deal with. */ + assert( pIter->eType==0 ); + rbuTableType(p, pIter->zTbl, &pIter->eType, &iTnum, &pIter->iPkTnum); + if( p->rc==SQLITE_OK && pIter->eType==RBU_PK_NOTABLE ){ + p->rc = SQLITE_ERROR; + p->zErrmsg = sqlite3_mprintf("no such table: %s", pIter->zTbl); + } + if( p->rc ) return p->rc; + if( pIter->zIdx==0 ) pIter->iTnum = iTnum; + + assert( pIter->eType==RBU_PK_NONE || pIter->eType==RBU_PK_IPK + || pIter->eType==RBU_PK_EXTERNAL || pIter->eType==RBU_PK_WITHOUT_ROWID + || pIter->eType==RBU_PK_VTAB + ); + + /* Populate the azTblCol[] and nTblCol variables based on the columns + ** of the input table. Ignore any input table columns that begin with + ** "rbu_". */ + p->rc = prepareFreeAndCollectError(p->dbRbu, &pStmt, &p->zErrmsg, + sqlite3_mprintf("SELECT * FROM '%q'", pIter->zDataTbl) + ); + if( p->rc==SQLITE_OK ){ + nCol = sqlite3_column_count(pStmt); + rbuAllocateIterArrays(p, pIter, nCol); + } + for(i=0; p->rc==SQLITE_OK && irc); + pIter->aiSrcOrder[pIter->nTblCol] = pIter->nTblCol; + pIter->azTblCol[pIter->nTblCol++] = zCopy; + } + else if( 0==sqlite3_stricmp("rbu_rowid", zName) ){ + bRbuRowid = 1; + } + } + sqlite3_finalize(pStmt); + pStmt = 0; + + if( p->rc==SQLITE_OK + && rbuIsVacuum(p)==0 + && bRbuRowid!=(pIter->eType==RBU_PK_VTAB || pIter->eType==RBU_PK_NONE) + ){ + p->rc = SQLITE_ERROR; + p->zErrmsg = sqlite3_mprintf( + "table %q %s rbu_rowid column", pIter->zDataTbl, + (bRbuRowid ? "may not have" : "requires") + ); + } + + /* Check that all non-HIDDEN columns in the destination table are also + ** present in the input table. Populate the abTblPk[], azTblType[] and + ** aiTblOrder[] arrays at the same time. */ + if( p->rc==SQLITE_OK ){ + p->rc = prepareFreeAndCollectError(p->dbMain, &pStmt, &p->zErrmsg, + sqlite3_mprintf("PRAGMA table_info(%Q)", pIter->zTbl) + ); + } + while( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ + const char *zName = (const char*)sqlite3_column_text(pStmt, 1); + if( zName==0 ) break; /* An OOM - finalize() below returns S_NOMEM */ + for(i=iOrder; inTblCol; i++){ + if( 0==strcmp(zName, pIter->azTblCol[i]) ) break; + } + if( i==pIter->nTblCol ){ + p->rc = SQLITE_ERROR; + p->zErrmsg = sqlite3_mprintf("column missing from %q: %s", + pIter->zDataTbl, zName + ); + }else{ + int iPk = sqlite3_column_int(pStmt, 5); + int bNotNull = sqlite3_column_int(pStmt, 3); + const char *zType = (const char*)sqlite3_column_text(pStmt, 2); + + if( i!=iOrder ){ + SWAP(int, pIter->aiSrcOrder[i], pIter->aiSrcOrder[iOrder]); + SWAP(char*, pIter->azTblCol[i], pIter->azTblCol[iOrder]); + } + + pIter->azTblType[iOrder] = rbuStrndup(zType, &p->rc); + pIter->abTblPk[iOrder] = (iPk!=0); + pIter->abNotNull[iOrder] = (u8)bNotNull || (iPk!=0); + iOrder++; + } + } + + rbuFinalize(p, pStmt); + rbuObjIterCacheIndexedCols(p, pIter); + assert( pIter->eType!=RBU_PK_VTAB || pIter->abIndexed==0 ); + assert( pIter->eType!=RBU_PK_VTAB || pIter->nIndex==0 ); + } + + return p->rc; +} + +/* +** This function constructs and returns a pointer to a nul-terminated +** string containing some SQL clause or list based on one or more of the +** column names currently stored in the pIter->azTblCol[] array. +*/ +static char *rbuObjIterGetCollist( + sqlite3rbu *p, /* RBU object */ + RbuObjIter *pIter /* Object iterator for column names */ +){ + char *zList = 0; + const char *zSep = ""; + int i; + for(i=0; inTblCol; i++){ + const char *z = pIter->azTblCol[i]; + zList = rbuMPrintf(p, "%z%s\"%w\"", zList, zSep, z); + zSep = ", "; + } + return zList; +} + +/* +** This function is used to create a SELECT list (the list of SQL +** expressions that follows a SELECT keyword) for a SELECT statement +** used to read from an data_xxx or rbu_tmp_xxx table while updating the +** index object currently indicated by the iterator object passed as the +** second argument. A "PRAGMA index_xinfo = " statement is used +** to obtain the required information. +** +** If the index is of the following form: +** +** CREATE INDEX i1 ON t1(c, b COLLATE nocase); +** +** and "t1" is a table with an explicit INTEGER PRIMARY KEY column +** "ipk", the returned string is: +** +** "`c` COLLATE 'BINARY', `b` COLLATE 'NOCASE', `ipk` COLLATE 'BINARY'" +** +** As well as the returned string, three other malloc'd strings are +** returned via output parameters. As follows: +** +** pzImposterCols: ... +** pzImposterPk: ... +** pzWhere: ... +*/ +static char *rbuObjIterGetIndexCols( + sqlite3rbu *p, /* RBU object */ + RbuObjIter *pIter, /* Object iterator for column names */ + char **pzImposterCols, /* OUT: Columns for imposter table */ + char **pzImposterPk, /* OUT: Imposter PK clause */ + char **pzWhere, /* OUT: WHERE clause */ + int *pnBind /* OUT: Trbul number of columns */ +){ + int rc = p->rc; /* Error code */ + int rc2; /* sqlite3_finalize() return code */ + char *zRet = 0; /* String to return */ + char *zImpCols = 0; /* String to return via *pzImposterCols */ + char *zImpPK = 0; /* String to return via *pzImposterPK */ + char *zWhere = 0; /* String to return via *pzWhere */ + int nBind = 0; /* Value to return via *pnBind */ + const char *zCom = ""; /* Set to ", " later on */ + const char *zAnd = ""; /* Set to " AND " later on */ + sqlite3_stmt *pXInfo = 0; /* PRAGMA index_xinfo = ? */ + + if( rc==SQLITE_OK ){ + assert( p->zErrmsg==0 ); + rc = prepareFreeAndCollectError(p->dbMain, &pXInfo, &p->zErrmsg, + sqlite3_mprintf("PRAGMA main.index_xinfo = %Q", pIter->zIdx) + ); + } + + while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pXInfo) ){ + int iCid = sqlite3_column_int(pXInfo, 1); + int bDesc = sqlite3_column_int(pXInfo, 3); + const char *zCollate = (const char*)sqlite3_column_text(pXInfo, 4); + const char *zCol; + const char *zType; + + if( iCid<0 ){ + /* An integer primary key. If the table has an explicit IPK, use + ** its name. Otherwise, use "rbu_rowid". */ + if( pIter->eType==RBU_PK_IPK ){ + int i; + for(i=0; pIter->abTblPk[i]==0; i++); + assert( inTblCol ); + zCol = pIter->azTblCol[i]; + }else if( rbuIsVacuum(p) ){ + zCol = "_rowid_"; + }else{ + zCol = "rbu_rowid"; + } + zType = "INTEGER"; + }else{ + zCol = pIter->azTblCol[iCid]; + zType = pIter->azTblType[iCid]; + } + + zRet = sqlite3_mprintf("%z%s\"%w\" COLLATE %Q", zRet, zCom, zCol, zCollate); + if( pIter->bUnique==0 || sqlite3_column_int(pXInfo, 5) ){ + const char *zOrder = (bDesc ? " DESC" : ""); + zImpPK = sqlite3_mprintf("%z%s\"rbu_imp_%d%w\"%s", + zImpPK, zCom, nBind, zCol, zOrder + ); + } + zImpCols = sqlite3_mprintf("%z%s\"rbu_imp_%d%w\" %s COLLATE %Q", + zImpCols, zCom, nBind, zCol, zType, zCollate + ); + zWhere = sqlite3_mprintf( + "%z%s\"rbu_imp_%d%w\" IS ?", zWhere, zAnd, nBind, zCol + ); + if( zRet==0 || zImpPK==0 || zImpCols==0 || zWhere==0 ) rc = SQLITE_NOMEM; + zCom = ", "; + zAnd = " AND "; + nBind++; + } + + rc2 = sqlite3_finalize(pXInfo); + if( rc==SQLITE_OK ) rc = rc2; + + if( rc!=SQLITE_OK ){ + sqlite3_free(zRet); + sqlite3_free(zImpCols); + sqlite3_free(zImpPK); + sqlite3_free(zWhere); + zRet = 0; + zImpCols = 0; + zImpPK = 0; + zWhere = 0; + p->rc = rc; + } + + *pzImposterCols = zImpCols; + *pzImposterPk = zImpPK; + *pzWhere = zWhere; + *pnBind = nBind; + return zRet; +} + +/* +** Assuming the current table columns are "a", "b" and "c", and the zObj +** paramter is passed "old", return a string of the form: +** +** "old.a, old.b, old.b" +** +** With the column names escaped. +** +** For tables with implicit rowids - RBU_PK_EXTERNAL and RBU_PK_NONE, append +** the text ", old._rowid_" to the returned value. +*/ +static char *rbuObjIterGetOldlist( + sqlite3rbu *p, + RbuObjIter *pIter, + const char *zObj +){ + char *zList = 0; + if( p->rc==SQLITE_OK && pIter->abIndexed ){ + const char *zS = ""; + int i; + for(i=0; inTblCol; i++){ + if( pIter->abIndexed[i] ){ + const char *zCol = pIter->azTblCol[i]; + zList = sqlite3_mprintf("%z%s%s.\"%w\"", zList, zS, zObj, zCol); + }else{ + zList = sqlite3_mprintf("%z%sNULL", zList, zS); + } + zS = ", "; + if( zList==0 ){ + p->rc = SQLITE_NOMEM; + break; + } + } + + /* For a table with implicit rowids, append "old._rowid_" to the list. */ + if( pIter->eType==RBU_PK_EXTERNAL || pIter->eType==RBU_PK_NONE ){ + zList = rbuMPrintf(p, "%z, %s._rowid_", zList, zObj); + } + } + return zList; +} + +/* +** Return an expression that can be used in a WHERE clause to match the +** primary key of the current table. For example, if the table is: +** +** CREATE TABLE t1(a, b, c, PRIMARY KEY(b, c)); +** +** Return the string: +** +** "b = ?1 AND c = ?2" +*/ +static char *rbuObjIterGetWhere( + sqlite3rbu *p, + RbuObjIter *pIter +){ + char *zList = 0; + if( pIter->eType==RBU_PK_VTAB || pIter->eType==RBU_PK_NONE ){ + zList = rbuMPrintf(p, "_rowid_ = ?%d", pIter->nTblCol+1); + }else if( pIter->eType==RBU_PK_EXTERNAL ){ + const char *zSep = ""; + int i; + for(i=0; inTblCol; i++){ + if( pIter->abTblPk[i] ){ + zList = rbuMPrintf(p, "%z%sc%d=?%d", zList, zSep, i, i+1); + zSep = " AND "; + } + } + zList = rbuMPrintf(p, + "_rowid_ = (SELECT id FROM rbu_imposter2 WHERE %z)", zList + ); + + }else{ + const char *zSep = ""; + int i; + for(i=0; inTblCol; i++){ + if( pIter->abTblPk[i] ){ + const char *zCol = pIter->azTblCol[i]; + zList = rbuMPrintf(p, "%z%s\"%w\"=?%d", zList, zSep, zCol, i+1); + zSep = " AND "; + } + } + } + return zList; +} + +/* +** The SELECT statement iterating through the keys for the current object +** (p->objiter.pSelect) currently points to a valid row. However, there +** is something wrong with the rbu_control value in the rbu_control value +** stored in the (p->nCol+1)'th column. Set the error code and error message +** of the RBU handle to something reflecting this. +*/ +static void rbuBadControlError(sqlite3rbu *p){ + p->rc = SQLITE_ERROR; + p->zErrmsg = sqlite3_mprintf("invalid rbu_control value"); +} + + +/* +** Return a nul-terminated string containing the comma separated list of +** assignments that should be included following the "SET" keyword of +** an UPDATE statement used to update the table object that the iterator +** passed as the second argument currently points to if the rbu_control +** column of the data_xxx table entry is set to zMask. +** +** The memory for the returned string is obtained from sqlite3_malloc(). +** It is the responsibility of the caller to eventually free it using +** sqlite3_free(). +** +** If an OOM error is encountered when allocating space for the new +** string, an error code is left in the rbu handle passed as the first +** argument and NULL is returned. Or, if an error has already occurred +** when this function is called, NULL is returned immediately, without +** attempting the allocation or modifying the stored error code. +*/ +static char *rbuObjIterGetSetlist( + sqlite3rbu *p, + RbuObjIter *pIter, + const char *zMask +){ + char *zList = 0; + if( p->rc==SQLITE_OK ){ + int i; + + if( (int)strlen(zMask)!=pIter->nTblCol ){ + rbuBadControlError(p); + }else{ + const char *zSep = ""; + for(i=0; inTblCol; i++){ + char c = zMask[pIter->aiSrcOrder[i]]; + if( c=='x' ){ + zList = rbuMPrintf(p, "%z%s\"%w\"=?%d", + zList, zSep, pIter->azTblCol[i], i+1 + ); + zSep = ", "; + } + else if( c=='d' ){ + zList = rbuMPrintf(p, "%z%s\"%w\"=rbu_delta(\"%w\", ?%d)", + zList, zSep, pIter->azTblCol[i], pIter->azTblCol[i], i+1 + ); + zSep = ", "; + } + else if( c=='f' ){ + zList = rbuMPrintf(p, "%z%s\"%w\"=rbu_fossil_delta(\"%w\", ?%d)", + zList, zSep, pIter->azTblCol[i], pIter->azTblCol[i], i+1 + ); + zSep = ", "; + } + } + } + } + return zList; +} + +/* +** Return a nul-terminated string consisting of nByte comma separated +** "?" expressions. For example, if nByte is 3, return a pointer to +** a buffer containing the string "?,?,?". +** +** The memory for the returned string is obtained from sqlite3_malloc(). +** It is the responsibility of the caller to eventually free it using +** sqlite3_free(). +** +** If an OOM error is encountered when allocating space for the new +** string, an error code is left in the rbu handle passed as the first +** argument and NULL is returned. Or, if an error has already occurred +** when this function is called, NULL is returned immediately, without +** attempting the allocation or modifying the stored error code. +*/ +static char *rbuObjIterGetBindlist(sqlite3rbu *p, int nBind){ + char *zRet = 0; + int nByte = nBind*2 + 1; + + zRet = (char*)rbuMalloc(p, nByte); + if( zRet ){ + int i; + for(i=0; izIdx==0 ); + if( p->rc==SQLITE_OK ){ + const char *zSep = "PRIMARY KEY("; + sqlite3_stmt *pXList = 0; /* PRAGMA index_list = (pIter->zTbl) */ + sqlite3_stmt *pXInfo = 0; /* PRAGMA index_xinfo = */ + + p->rc = prepareFreeAndCollectError(p->dbMain, &pXList, &p->zErrmsg, + sqlite3_mprintf("PRAGMA main.index_list = %Q", pIter->zTbl) + ); + while( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pXList) ){ + const char *zOrig = (const char*)sqlite3_column_text(pXList,3); + if( zOrig && strcmp(zOrig, "pk")==0 ){ + const char *zIdx = (const char*)sqlite3_column_text(pXList,1); + if( zIdx ){ + p->rc = prepareFreeAndCollectError(p->dbMain, &pXInfo, &p->zErrmsg, + sqlite3_mprintf("PRAGMA main.index_xinfo = %Q", zIdx) + ); + } + break; + } + } + rbuFinalize(p, pXList); + + while( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pXInfo) ){ + if( sqlite3_column_int(pXInfo, 5) ){ + /* int iCid = sqlite3_column_int(pXInfo, 0); */ + const char *zCol = (const char*)sqlite3_column_text(pXInfo, 2); + const char *zDesc = sqlite3_column_int(pXInfo, 3) ? " DESC" : ""; + z = rbuMPrintf(p, "%z%s\"%w\"%s", z, zSep, zCol, zDesc); + zSep = ", "; + } + } + z = rbuMPrintf(p, "%z)", z); + rbuFinalize(p, pXInfo); + } + return z; +} + +/* +** This function creates the second imposter table used when writing to +** a table b-tree where the table has an external primary key. If the +** iterator passed as the second argument does not currently point to +** a table (not index) with an external primary key, this function is a +** no-op. +** +** Assuming the iterator does point to a table with an external PK, this +** function creates a WITHOUT ROWID imposter table named "rbu_imposter2" +** used to access that PK index. For example, if the target table is +** declared as follows: +** +** CREATE TABLE t1(a, b TEXT, c REAL, PRIMARY KEY(b, c)); +** +** then the imposter table schema is: +** +** CREATE TABLE rbu_imposter2(c1 TEXT, c2 REAL, id INTEGER) WITHOUT ROWID; +** +*/ +static void rbuCreateImposterTable2(sqlite3rbu *p, RbuObjIter *pIter){ + if( p->rc==SQLITE_OK && pIter->eType==RBU_PK_EXTERNAL ){ + int tnum = pIter->iPkTnum; /* Root page of PK index */ + sqlite3_stmt *pQuery = 0; /* SELECT name ... WHERE rootpage = $tnum */ + const char *zIdx = 0; /* Name of PK index */ + sqlite3_stmt *pXInfo = 0; /* PRAGMA main.index_xinfo = $zIdx */ + const char *zComma = ""; + char *zCols = 0; /* Used to build up list of table cols */ + char *zPk = 0; /* Used to build up table PK declaration */ + + /* Figure out the name of the primary key index for the current table. + ** This is needed for the argument to "PRAGMA index_xinfo". Set + ** zIdx to point to a nul-terminated string containing this name. */ + p->rc = prepareAndCollectError(p->dbMain, &pQuery, &p->zErrmsg, + "SELECT name FROM sqlite_master WHERE rootpage = ?" + ); + if( p->rc==SQLITE_OK ){ + sqlite3_bind_int(pQuery, 1, tnum); + if( SQLITE_ROW==sqlite3_step(pQuery) ){ + zIdx = (const char*)sqlite3_column_text(pQuery, 0); + } + } + if( zIdx ){ + p->rc = prepareFreeAndCollectError(p->dbMain, &pXInfo, &p->zErrmsg, + sqlite3_mprintf("PRAGMA main.index_xinfo = %Q", zIdx) + ); + } + rbuFinalize(p, pQuery); + + while( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pXInfo) ){ + int bKey = sqlite3_column_int(pXInfo, 5); + if( bKey ){ + int iCid = sqlite3_column_int(pXInfo, 1); + int bDesc = sqlite3_column_int(pXInfo, 3); + const char *zCollate = (const char*)sqlite3_column_text(pXInfo, 4); + zCols = rbuMPrintf(p, "%z%sc%d %s COLLATE %s", zCols, zComma, + iCid, pIter->azTblType[iCid], zCollate + ); + zPk = rbuMPrintf(p, "%z%sc%d%s", zPk, zComma, iCid, bDesc?" DESC":""); + zComma = ", "; + } + } + zCols = rbuMPrintf(p, "%z, id INTEGER", zCols); + rbuFinalize(p, pXInfo); + + sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->dbMain, "main", 1, tnum); + rbuMPrintfExec(p, p->dbMain, + "CREATE TABLE rbu_imposter2(%z, PRIMARY KEY(%z)) WITHOUT ROWID", + zCols, zPk + ); + sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->dbMain, "main", 0, 0); + } +} + +/* +** If an error has already occurred when this function is called, it +** immediately returns zero (without doing any work). Or, if an error +** occurs during the execution of this function, it sets the error code +** in the sqlite3rbu object indicated by the first argument and returns +** zero. +** +** The iterator passed as the second argument is guaranteed to point to +** a table (not an index) when this function is called. This function +** attempts to create any imposter table required to write to the main +** table b-tree of the table before returning. Non-zero is returned if +** an imposter table are created, or zero otherwise. +** +** An imposter table is required in all cases except RBU_PK_VTAB. Only +** virtual tables are written to directly. The imposter table has the +** same schema as the actual target table (less any UNIQUE constraints). +** More precisely, the "same schema" means the same columns, types, +** collation sequences. For tables that do not have an external PRIMARY +** KEY, it also means the same PRIMARY KEY declaration. +*/ +static void rbuCreateImposterTable(sqlite3rbu *p, RbuObjIter *pIter){ + if( p->rc==SQLITE_OK && pIter->eType!=RBU_PK_VTAB ){ + int tnum = pIter->iTnum; + const char *zComma = ""; + char *zSql = 0; + int iCol; + sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->dbMain, "main", 0, 1); + + for(iCol=0; p->rc==SQLITE_OK && iColnTblCol; iCol++){ + const char *zPk = ""; + const char *zCol = pIter->azTblCol[iCol]; + const char *zColl = 0; + + p->rc = sqlite3_table_column_metadata( + p->dbMain, "main", pIter->zTbl, zCol, 0, &zColl, 0, 0, 0 + ); + + if( pIter->eType==RBU_PK_IPK && pIter->abTblPk[iCol] ){ + /* If the target table column is an "INTEGER PRIMARY KEY", add + ** "PRIMARY KEY" to the imposter table column declaration. */ + zPk = "PRIMARY KEY "; + } + zSql = rbuMPrintf(p, "%z%s\"%w\" %s %sCOLLATE %s%s", + zSql, zComma, zCol, pIter->azTblType[iCol], zPk, zColl, + (pIter->abNotNull[iCol] ? " NOT NULL" : "") + ); + zComma = ", "; + } + + if( pIter->eType==RBU_PK_WITHOUT_ROWID ){ + char *zPk = rbuWithoutRowidPK(p, pIter); + if( zPk ){ + zSql = rbuMPrintf(p, "%z, %z", zSql, zPk); + } + } + + sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->dbMain, "main", 1, tnum); + rbuMPrintfExec(p, p->dbMain, "CREATE TABLE \"rbu_imp_%w\"(%z)%s", + pIter->zTbl, zSql, + (pIter->eType==RBU_PK_WITHOUT_ROWID ? " WITHOUT ROWID" : "") + ); + sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->dbMain, "main", 0, 0); + } +} + +/* +** Prepare a statement used to insert rows into the "rbu_tmp_xxx" table. +** Specifically a statement of the form: +** +** INSERT INTO rbu_tmp_xxx VALUES(?, ?, ? ...); +** +** The number of bound variables is equal to the number of columns in +** the target table, plus one (for the rbu_control column), plus one more +** (for the rbu_rowid column) if the target table is an implicit IPK or +** virtual table. +*/ +static void rbuObjIterPrepareTmpInsert( + sqlite3rbu *p, + RbuObjIter *pIter, + const char *zCollist, + const char *zRbuRowid +){ + int bRbuRowid = (pIter->eType==RBU_PK_EXTERNAL || pIter->eType==RBU_PK_NONE); + char *zBind = rbuObjIterGetBindlist(p, pIter->nTblCol + 1 + bRbuRowid); + if( zBind ){ + assert( pIter->pTmpInsert==0 ); + p->rc = prepareFreeAndCollectError( + p->dbRbu, &pIter->pTmpInsert, &p->zErrmsg, sqlite3_mprintf( + "INSERT INTO %s.'rbu_tmp_%q'(rbu_control,%s%s) VALUES(%z)", + p->zStateDb, pIter->zDataTbl, zCollist, zRbuRowid, zBind + )); + } +} + +static void rbuTmpInsertFunc( + sqlite3_context *pCtx, + int nVal, + sqlite3_value **apVal +){ + sqlite3rbu *p = sqlite3_user_data(pCtx); + int rc = SQLITE_OK; + int i; + + assert( sqlite3_value_int(apVal[0])!=0 + || p->objiter.eType==RBU_PK_EXTERNAL + || p->objiter.eType==RBU_PK_NONE + ); + if( sqlite3_value_int(apVal[0])!=0 ){ + p->nPhaseOneStep += p->objiter.nIndex; + } + + for(i=0; rc==SQLITE_OK && iobjiter.pTmpInsert, i+1, apVal[i]); + } + if( rc==SQLITE_OK ){ + sqlite3_step(p->objiter.pTmpInsert); + rc = sqlite3_reset(p->objiter.pTmpInsert); + } + + if( rc!=SQLITE_OK ){ + sqlite3_result_error_code(pCtx, rc); + } +} + +/* +** Ensure that the SQLite statement handles required to update the +** target database object currently indicated by the iterator passed +** as the second argument are available. +*/ +static int rbuObjIterPrepareAll( + sqlite3rbu *p, + RbuObjIter *pIter, + int nOffset /* Add "LIMIT -1 OFFSET $nOffset" to SELECT */ +){ + assert( pIter->bCleanup==0 ); + if( pIter->pSelect==0 && rbuObjIterCacheTableInfo(p, pIter)==SQLITE_OK ){ + const int tnum = pIter->iTnum; + char *zCollist = 0; /* List of indexed columns */ + char **pz = &p->zErrmsg; + const char *zIdx = pIter->zIdx; + char *zLimit = 0; + + if( nOffset ){ + zLimit = sqlite3_mprintf(" LIMIT -1 OFFSET %d", nOffset); + if( !zLimit ) p->rc = SQLITE_NOMEM; + } + + if( zIdx ){ + const char *zTbl = pIter->zTbl; + char *zImposterCols = 0; /* Columns for imposter table */ + char *zImposterPK = 0; /* Primary key declaration for imposter */ + char *zWhere = 0; /* WHERE clause on PK columns */ + char *zBind = 0; + int nBind = 0; + + assert( pIter->eType!=RBU_PK_VTAB ); + zCollist = rbuObjIterGetIndexCols( + p, pIter, &zImposterCols, &zImposterPK, &zWhere, &nBind + ); + zBind = rbuObjIterGetBindlist(p, nBind); + + /* Create the imposter table used to write to this index. */ + sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->dbMain, "main", 0, 1); + sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->dbMain, "main", 1,tnum); + rbuMPrintfExec(p, p->dbMain, + "CREATE TABLE \"rbu_imp_%w\"( %s, PRIMARY KEY( %s ) ) WITHOUT ROWID", + zTbl, zImposterCols, zImposterPK + ); + sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->dbMain, "main", 0, 0); + + /* Create the statement to insert index entries */ + pIter->nCol = nBind; + if( p->rc==SQLITE_OK ){ + p->rc = prepareFreeAndCollectError( + p->dbMain, &pIter->pInsert, &p->zErrmsg, + sqlite3_mprintf("INSERT INTO \"rbu_imp_%w\" VALUES(%s)", zTbl, zBind) + ); + } + + /* And to delete index entries */ + if( rbuIsVacuum(p)==0 && p->rc==SQLITE_OK ){ + p->rc = prepareFreeAndCollectError( + p->dbMain, &pIter->pDelete, &p->zErrmsg, + sqlite3_mprintf("DELETE FROM \"rbu_imp_%w\" WHERE %s", zTbl, zWhere) + ); + } + + /* Create the SELECT statement to read keys in sorted order */ + if( p->rc==SQLITE_OK ){ + char *zSql; + if( rbuIsVacuum(p) ){ + zSql = sqlite3_mprintf( + "SELECT %s, 0 AS rbu_control FROM '%q' ORDER BY %s%s", + zCollist, + pIter->zDataTbl, + zCollist, zLimit + ); + }else + + if( pIter->eType==RBU_PK_EXTERNAL || pIter->eType==RBU_PK_NONE ){ + zSql = sqlite3_mprintf( + "SELECT %s, rbu_control FROM %s.'rbu_tmp_%q' ORDER BY %s%s", + zCollist, p->zStateDb, pIter->zDataTbl, + zCollist, zLimit + ); + }else{ + zSql = sqlite3_mprintf( + "SELECT %s, rbu_control FROM %s.'rbu_tmp_%q' " + "UNION ALL " + "SELECT %s, rbu_control FROM '%q' " + "WHERE typeof(rbu_control)='integer' AND rbu_control!=1 " + "ORDER BY %s%s", + zCollist, p->zStateDb, pIter->zDataTbl, + zCollist, pIter->zDataTbl, + zCollist, zLimit + ); + } + p->rc = prepareFreeAndCollectError(p->dbRbu, &pIter->pSelect, pz, zSql); + } + + sqlite3_free(zImposterCols); + sqlite3_free(zImposterPK); + sqlite3_free(zWhere); + sqlite3_free(zBind); + }else{ + int bRbuRowid = (pIter->eType==RBU_PK_VTAB) + ||(pIter->eType==RBU_PK_NONE) + ||(pIter->eType==RBU_PK_EXTERNAL && rbuIsVacuum(p)); + const char *zTbl = pIter->zTbl; /* Table this step applies to */ + const char *zWrite; /* Imposter table name */ + + char *zBindings = rbuObjIterGetBindlist(p, pIter->nTblCol + bRbuRowid); + char *zWhere = rbuObjIterGetWhere(p, pIter); + char *zOldlist = rbuObjIterGetOldlist(p, pIter, "old"); + char *zNewlist = rbuObjIterGetOldlist(p, pIter, "new"); + + zCollist = rbuObjIterGetCollist(p, pIter); + pIter->nCol = pIter->nTblCol; + + /* Create the imposter table or tables (if required). */ + rbuCreateImposterTable(p, pIter); + rbuCreateImposterTable2(p, pIter); + zWrite = (pIter->eType==RBU_PK_VTAB ? "" : "rbu_imp_"); + + /* Create the INSERT statement to write to the target PK b-tree */ + if( p->rc==SQLITE_OK ){ + p->rc = prepareFreeAndCollectError(p->dbMain, &pIter->pInsert, pz, + sqlite3_mprintf( + "INSERT INTO \"%s%w\"(%s%s) VALUES(%s)", + zWrite, zTbl, zCollist, (bRbuRowid ? ", _rowid_" : ""), zBindings + ) + ); + } + + /* Create the DELETE statement to write to the target PK b-tree. + ** Because it only performs INSERT operations, this is not required for + ** an rbu vacuum handle. */ + if( rbuIsVacuum(p)==0 && p->rc==SQLITE_OK ){ + p->rc = prepareFreeAndCollectError(p->dbMain, &pIter->pDelete, pz, + sqlite3_mprintf( + "DELETE FROM \"%s%w\" WHERE %s", zWrite, zTbl, zWhere + ) + ); + } + + if( rbuIsVacuum(p)==0 && pIter->abIndexed ){ + const char *zRbuRowid = ""; + if( pIter->eType==RBU_PK_EXTERNAL || pIter->eType==RBU_PK_NONE ){ + zRbuRowid = ", rbu_rowid"; + } + + /* Create the rbu_tmp_xxx table and the triggers to populate it. */ + rbuMPrintfExec(p, p->dbRbu, + "CREATE TABLE IF NOT EXISTS %s.'rbu_tmp_%q' AS " + "SELECT *%s FROM '%q' WHERE 0;" + , p->zStateDb, pIter->zDataTbl + , (pIter->eType==RBU_PK_EXTERNAL ? ", 0 AS rbu_rowid" : "") + , pIter->zDataTbl + ); + + rbuMPrintfExec(p, p->dbMain, + "CREATE TEMP TRIGGER rbu_delete_tr BEFORE DELETE ON \"%s%w\" " + "BEGIN " + " SELECT rbu_tmp_insert(3, %s);" + "END;" + + "CREATE TEMP TRIGGER rbu_update1_tr BEFORE UPDATE ON \"%s%w\" " + "BEGIN " + " SELECT rbu_tmp_insert(3, %s);" + "END;" + + "CREATE TEMP TRIGGER rbu_update2_tr AFTER UPDATE ON \"%s%w\" " + "BEGIN " + " SELECT rbu_tmp_insert(4, %s);" + "END;", + zWrite, zTbl, zOldlist, + zWrite, zTbl, zOldlist, + zWrite, zTbl, zNewlist + ); + + if( pIter->eType==RBU_PK_EXTERNAL || pIter->eType==RBU_PK_NONE ){ + rbuMPrintfExec(p, p->dbMain, + "CREATE TEMP TRIGGER rbu_insert_tr AFTER INSERT ON \"%s%w\" " + "BEGIN " + " SELECT rbu_tmp_insert(0, %s);" + "END;", + zWrite, zTbl, zNewlist + ); + } + + rbuObjIterPrepareTmpInsert(p, pIter, zCollist, zRbuRowid); + } + + /* Create the SELECT statement to read keys from data_xxx */ + if( p->rc==SQLITE_OK ){ + const char *zRbuRowid = ""; + if( bRbuRowid ){ + zRbuRowid = rbuIsVacuum(p) ? ",_rowid_ " : ",rbu_rowid"; + } + p->rc = prepareFreeAndCollectError(p->dbRbu, &pIter->pSelect, pz, + sqlite3_mprintf( + "SELECT %s,%s rbu_control%s FROM '%q'%s", + zCollist, + (rbuIsVacuum(p) ? "0 AS " : ""), + zRbuRowid, + pIter->zDataTbl, zLimit + ) + ); + } + + sqlite3_free(zWhere); + sqlite3_free(zOldlist); + sqlite3_free(zNewlist); + sqlite3_free(zBindings); + } + sqlite3_free(zCollist); + sqlite3_free(zLimit); + } + + return p->rc; +} + +/* +** Set output variable *ppStmt to point to an UPDATE statement that may +** be used to update the imposter table for the main table b-tree of the +** table object that pIter currently points to, assuming that the +** rbu_control column of the data_xyz table contains zMask. +** +** If the zMask string does not specify any columns to update, then this +** is not an error. Output variable *ppStmt is set to NULL in this case. +*/ +static int rbuGetUpdateStmt( + sqlite3rbu *p, /* RBU handle */ + RbuObjIter *pIter, /* Object iterator */ + const char *zMask, /* rbu_control value ('x.x.') */ + sqlite3_stmt **ppStmt /* OUT: UPDATE statement handle */ +){ + RbuUpdateStmt **pp; + RbuUpdateStmt *pUp = 0; + int nUp = 0; + + /* In case an error occurs */ + *ppStmt = 0; + + /* Search for an existing statement. If one is found, shift it to the front + ** of the LRU queue and return immediately. Otherwise, leave nUp pointing + ** to the number of statements currently in the cache and pUp to the + ** last object in the list. */ + for(pp=&pIter->pRbuUpdate; *pp; pp=&((*pp)->pNext)){ + pUp = *pp; + if( strcmp(pUp->zMask, zMask)==0 ){ + *pp = pUp->pNext; + pUp->pNext = pIter->pRbuUpdate; + pIter->pRbuUpdate = pUp; + *ppStmt = pUp->pUpdate; + return SQLITE_OK; + } + nUp++; + } + assert( pUp==0 || pUp->pNext==0 ); + + if( nUp>=SQLITE_RBU_UPDATE_CACHESIZE ){ + for(pp=&pIter->pRbuUpdate; *pp!=pUp; pp=&((*pp)->pNext)); + *pp = 0; + sqlite3_finalize(pUp->pUpdate); + pUp->pUpdate = 0; + }else{ + pUp = (RbuUpdateStmt*)rbuMalloc(p, sizeof(RbuUpdateStmt)+pIter->nTblCol+1); + } + + if( pUp ){ + char *zWhere = rbuObjIterGetWhere(p, pIter); + char *zSet = rbuObjIterGetSetlist(p, pIter, zMask); + char *zUpdate = 0; + + pUp->zMask = (char*)&pUp[1]; + memcpy(pUp->zMask, zMask, pIter->nTblCol); + pUp->pNext = pIter->pRbuUpdate; + pIter->pRbuUpdate = pUp; + + if( zSet ){ + const char *zPrefix = ""; + + if( pIter->eType!=RBU_PK_VTAB ) zPrefix = "rbu_imp_"; + zUpdate = sqlite3_mprintf("UPDATE \"%s%w\" SET %s WHERE %s", + zPrefix, pIter->zTbl, zSet, zWhere + ); + p->rc = prepareFreeAndCollectError( + p->dbMain, &pUp->pUpdate, &p->zErrmsg, zUpdate + ); + *ppStmt = pUp->pUpdate; + } + sqlite3_free(zWhere); + sqlite3_free(zSet); + } + + return p->rc; +} + +static sqlite3 *rbuOpenDbhandle( + sqlite3rbu *p, + const char *zName, + int bUseVfs +){ + sqlite3 *db = 0; + if( p->rc==SQLITE_OK ){ + const int flags = SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|SQLITE_OPEN_URI; + p->rc = sqlite3_open_v2(zName, &db, flags, bUseVfs ? p->zVfsName : 0); + if( p->rc ){ + p->zErrmsg = sqlite3_mprintf("%s", sqlite3_errmsg(db)); + sqlite3_close(db); + db = 0; + } + } + return db; +} + +/* +** Free an RbuState object allocated by rbuLoadState(). +*/ +static void rbuFreeState(RbuState *p){ + if( p ){ + sqlite3_free(p->zTbl); + sqlite3_free(p->zIdx); + sqlite3_free(p); + } +} + +/* +** Allocate an RbuState object and load the contents of the rbu_state +** table into it. Return a pointer to the new object. It is the +** responsibility of the caller to eventually free the object using +** sqlite3_free(). +** +** If an error occurs, leave an error code and message in the rbu handle +** and return NULL. +*/ +static RbuState *rbuLoadState(sqlite3rbu *p){ + RbuState *pRet = 0; + sqlite3_stmt *pStmt = 0; + int rc; + int rc2; + + pRet = (RbuState*)rbuMalloc(p, sizeof(RbuState)); + if( pRet==0 ) return 0; + + rc = prepareFreeAndCollectError(p->dbRbu, &pStmt, &p->zErrmsg, + sqlite3_mprintf("SELECT k, v FROM %s.rbu_state", p->zStateDb) + ); + while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ + switch( sqlite3_column_int(pStmt, 0) ){ + case RBU_STATE_STAGE: + pRet->eStage = sqlite3_column_int(pStmt, 1); + if( pRet->eStage!=RBU_STAGE_OAL + && pRet->eStage!=RBU_STAGE_MOVE + && pRet->eStage!=RBU_STAGE_CKPT + ){ + p->rc = SQLITE_CORRUPT; + } + break; + + case RBU_STATE_TBL: + pRet->zTbl = rbuStrndup((char*)sqlite3_column_text(pStmt, 1), &rc); + break; + + case RBU_STATE_IDX: + pRet->zIdx = rbuStrndup((char*)sqlite3_column_text(pStmt, 1), &rc); + break; + + case RBU_STATE_ROW: + pRet->nRow = sqlite3_column_int(pStmt, 1); + break; + + case RBU_STATE_PROGRESS: + pRet->nProgress = sqlite3_column_int64(pStmt, 1); + break; + + case RBU_STATE_CKPT: + pRet->iWalCksum = sqlite3_column_int64(pStmt, 1); + break; + + case RBU_STATE_COOKIE: + pRet->iCookie = (u32)sqlite3_column_int64(pStmt, 1); + break; + + case RBU_STATE_OALSZ: + pRet->iOalSz = (u32)sqlite3_column_int64(pStmt, 1); + break; + + case RBU_STATE_PHASEONESTEP: + pRet->nPhaseOneStep = sqlite3_column_int64(pStmt, 1); + break; + + default: + rc = SQLITE_CORRUPT; + break; + } + } + rc2 = sqlite3_finalize(pStmt); + if( rc==SQLITE_OK ) rc = rc2; + + p->rc = rc; + return pRet; +} + + +/* +** Open the database handle and attach the RBU database as "rbu". If an +** error occurs, leave an error code and message in the RBU handle. +*/ +static void rbuOpenDatabase(sqlite3rbu *p){ + assert( p->rc || (p->dbMain==0 && p->dbRbu==0) ); + assert( p->rc || rbuIsVacuum(p) || p->zTarget!=0 ); + + /* Open the RBU database */ + p->dbRbu = rbuOpenDbhandle(p, p->zRbu, 1); + + if( p->rc==SQLITE_OK && rbuIsVacuum(p) ){ + sqlite3_file_control(p->dbRbu, "main", SQLITE_FCNTL_RBUCNT, (void*)p); + if( p->zState==0 ){ + const char *zFile = sqlite3_db_filename(p->dbRbu, "main"); + p->zState = rbuMPrintf(p, "file://%s-vacuum?modeof=%s", zFile, zFile); + } + } + + /* If using separate RBU and state databases, attach the state database to + ** the RBU db handle now. */ + if( p->zState ){ + rbuMPrintfExec(p, p->dbRbu, "ATTACH %Q AS stat", p->zState); + memcpy(p->zStateDb, "stat", 4); + }else{ + memcpy(p->zStateDb, "main", 4); + } + +#if 0 + if( p->rc==SQLITE_OK && rbuIsVacuum(p) ){ + p->rc = sqlite3_exec(p->dbRbu, "BEGIN", 0, 0, 0); + } +#endif + + /* If it has not already been created, create the rbu_state table */ + rbuMPrintfExec(p, p->dbRbu, RBU_CREATE_STATE, p->zStateDb); + +#if 0 + if( rbuIsVacuum(p) ){ + if( p->rc==SQLITE_OK ){ + int rc2; + int bOk = 0; + sqlite3_stmt *pCnt = 0; + p->rc = prepareAndCollectError(p->dbRbu, &pCnt, &p->zErrmsg, + "SELECT count(*) FROM stat.sqlite_master" + ); + if( p->rc==SQLITE_OK + && sqlite3_step(pCnt)==SQLITE_ROW + && 1==sqlite3_column_int(pCnt, 0) + ){ + bOk = 1; + } + rc2 = sqlite3_finalize(pCnt); + if( p->rc==SQLITE_OK ) p->rc = rc2; + + if( p->rc==SQLITE_OK && bOk==0 ){ + p->rc = SQLITE_ERROR; + p->zErrmsg = sqlite3_mprintf("invalid state database"); + } + + if( p->rc==SQLITE_OK ){ + p->rc = sqlite3_exec(p->dbRbu, "COMMIT", 0, 0, 0); + } + } + } +#endif + + if( p->rc==SQLITE_OK && rbuIsVacuum(p) ){ + int bOpen = 0; + int rc; + p->nRbu = 0; + p->pRbuFd = 0; + rc = sqlite3_file_control(p->dbRbu, "main", SQLITE_FCNTL_RBUCNT, (void*)p); + if( rc!=SQLITE_NOTFOUND ) p->rc = rc; + if( p->eStage>=RBU_STAGE_MOVE ){ + bOpen = 1; + }else{ + RbuState *pState = rbuLoadState(p); + if( pState ){ + bOpen = (pState->eStage>RBU_STAGE_MOVE); + rbuFreeState(pState); + } + } + if( bOpen ) p->dbMain = rbuOpenDbhandle(p, p->zRbu, p->nRbu<=1); + } + + p->eStage = 0; + if( p->rc==SQLITE_OK && p->dbMain==0 ){ + if( !rbuIsVacuum(p) ){ + p->dbMain = rbuOpenDbhandle(p, p->zTarget, 1); + }else if( p->pRbuFd->pWalFd ){ + p->rc = SQLITE_ERROR; + p->zErrmsg = sqlite3_mprintf("cannot vacuum wal mode database"); + }else{ + char *zTarget; + char *zExtra = 0; + if( strlen(p->zRbu)>=5 && 0==memcmp("file:", p->zRbu, 5) ){ + zExtra = &p->zRbu[5]; + while( *zExtra ){ + if( *zExtra++=='?' ) break; + } + if( *zExtra=='\0' ) zExtra = 0; + } + + zTarget = sqlite3_mprintf("file:%s-vacuum?rbu_memory=1%s%s", + sqlite3_db_filename(p->dbRbu, "main"), + (zExtra==0 ? "" : "&"), (zExtra==0 ? "" : zExtra) + ); + + if( zTarget==0 ){ + p->rc = SQLITE_NOMEM; + return; + } + p->dbMain = rbuOpenDbhandle(p, zTarget, p->nRbu<=1); + sqlite3_free(zTarget); + } + } + + if( p->rc==SQLITE_OK ){ + p->rc = sqlite3_create_function(p->dbMain, + "rbu_tmp_insert", -1, SQLITE_UTF8, (void*)p, rbuTmpInsertFunc, 0, 0 + ); + } + + if( p->rc==SQLITE_OK ){ + p->rc = sqlite3_create_function(p->dbMain, + "rbu_fossil_delta", 2, SQLITE_UTF8, 0, rbuFossilDeltaFunc, 0, 0 + ); + } + + if( p->rc==SQLITE_OK ){ + p->rc = sqlite3_create_function(p->dbRbu, + "rbu_target_name", -1, SQLITE_UTF8, (void*)p, rbuTargetNameFunc, 0, 0 + ); + } + + if( p->rc==SQLITE_OK ){ + p->rc = sqlite3_file_control(p->dbMain, "main", SQLITE_FCNTL_RBU, (void*)p); + } + rbuMPrintfExec(p, p->dbMain, "SELECT * FROM sqlite_master"); + + /* Mark the database file just opened as an RBU target database. If + ** this call returns SQLITE_NOTFOUND, then the RBU vfs is not in use. + ** This is an error. */ + if( p->rc==SQLITE_OK ){ + p->rc = sqlite3_file_control(p->dbMain, "main", SQLITE_FCNTL_RBU, (void*)p); + } + + if( p->rc==SQLITE_NOTFOUND ){ + p->rc = SQLITE_ERROR; + p->zErrmsg = sqlite3_mprintf("rbu vfs not found"); + } +} + +/* +** This routine is a copy of the sqlite3FileSuffix3() routine from the core. +** It is a no-op unless SQLITE_ENABLE_8_3_NAMES is defined. +** +** If SQLITE_ENABLE_8_3_NAMES is set at compile-time and if the database +** filename in zBaseFilename is a URI with the "8_3_names=1" parameter and +** if filename in z[] has a suffix (a.k.a. "extension") that is longer than +** three characters, then shorten the suffix on z[] to be the last three +** characters of the original suffix. +** +** If SQLITE_ENABLE_8_3_NAMES is set to 2 at compile-time, then always +** do the suffix shortening regardless of URI parameter. +** +** Examples: +** +** test.db-journal => test.nal +** test.db-wal => test.wal +** test.db-shm => test.shm +** test.db-mj7f3319fa => test.9fa +*/ +static void rbuFileSuffix3(const char *zBase, char *z){ +#ifdef SQLITE_ENABLE_8_3_NAMES +#if SQLITE_ENABLE_8_3_NAMES<2 + if( sqlite3_uri_boolean(zBase, "8_3_names", 0) ) +#endif + { + int i, sz; + sz = (int)strlen(z)&0xffffff; + for(i=sz-1; i>0 && z[i]!='/' && z[i]!='.'; i--){} + if( z[i]=='.' && sz>i+4 ) memmove(&z[i+1], &z[sz-3], 4); + } +#endif +} + +/* +** Return the current wal-index header checksum for the target database +** as a 64-bit integer. +** +** The checksum is store in the first page of xShmMap memory as an 8-byte +** blob starting at byte offset 40. +*/ +static i64 rbuShmChecksum(sqlite3rbu *p){ + i64 iRet = 0; + if( p->rc==SQLITE_OK ){ + sqlite3_file *pDb = p->pTargetFd->pReal; + u32 volatile *ptr; + p->rc = pDb->pMethods->xShmMap(pDb, 0, 32*1024, 0, (void volatile**)&ptr); + if( p->rc==SQLITE_OK ){ + iRet = ((i64)ptr[10] << 32) + ptr[11]; + } + } + return iRet; +} + +/* +** This function is called as part of initializing or reinitializing an +** incremental checkpoint. +** +** It populates the sqlite3rbu.aFrame[] array with the set of +** (wal frame -> db page) copy operations required to checkpoint the +** current wal file, and obtains the set of shm locks required to safely +** perform the copy operations directly on the file-system. +** +** If argument pState is not NULL, then the incremental checkpoint is +** being resumed. In this case, if the checksum of the wal-index-header +** following recovery is not the same as the checksum saved in the RbuState +** object, then the rbu handle is set to DONE state. This occurs if some +** other client appends a transaction to the wal file in the middle of +** an incremental checkpoint. +*/ +static void rbuSetupCheckpoint(sqlite3rbu *p, RbuState *pState){ + + /* If pState is NULL, then the wal file may not have been opened and + ** recovered. Running a read-statement here to ensure that doing so + ** does not interfere with the "capture" process below. */ + if( pState==0 ){ + p->eStage = 0; + if( p->rc==SQLITE_OK ){ + p->rc = sqlite3_exec(p->dbMain, "SELECT * FROM sqlite_master", 0, 0, 0); + } + } + + /* Assuming no error has occurred, run a "restart" checkpoint with the + ** sqlite3rbu.eStage variable set to CAPTURE. This turns on the following + ** special behaviour in the rbu VFS: + ** + ** * If the exclusive shm WRITER or READ0 lock cannot be obtained, + ** the checkpoint fails with SQLITE_BUSY (normally SQLite would + ** proceed with running a passive checkpoint instead of failing). + ** + ** * Attempts to read from the *-wal file or write to the database file + ** do not perform any IO. Instead, the frame/page combinations that + ** would be read/written are recorded in the sqlite3rbu.aFrame[] + ** array. + ** + ** * Calls to xShmLock(UNLOCK) to release the exclusive shm WRITER, + ** READ0 and CHECKPOINT locks taken as part of the checkpoint are + ** no-ops. These locks will not be released until the connection + ** is closed. + ** + ** * Attempting to xSync() the database file causes an SQLITE_INTERNAL + ** error. + ** + ** As a result, unless an error (i.e. OOM or SQLITE_BUSY) occurs, the + ** checkpoint below fails with SQLITE_INTERNAL, and leaves the aFrame[] + ** array populated with a set of (frame -> page) mappings. Because the + ** WRITER, CHECKPOINT and READ0 locks are still held, it is safe to copy + ** data from the wal file into the database file according to the + ** contents of aFrame[]. + */ + if( p->rc==SQLITE_OK ){ + int rc2; + p->eStage = RBU_STAGE_CAPTURE; + rc2 = sqlite3_exec(p->dbMain, "PRAGMA main.wal_checkpoint=restart", 0, 0,0); + if( rc2!=SQLITE_INTERNAL ) p->rc = rc2; + } + + if( p->rc==SQLITE_OK ){ + p->eStage = RBU_STAGE_CKPT; + p->nStep = (pState ? pState->nRow : 0); + p->aBuf = rbuMalloc(p, p->pgsz); + p->iWalCksum = rbuShmChecksum(p); + } + + if( p->rc==SQLITE_OK && pState && pState->iWalCksum!=p->iWalCksum ){ + p->rc = SQLITE_DONE; + p->eStage = RBU_STAGE_DONE; + } +} + +/* +** Called when iAmt bytes are read from offset iOff of the wal file while +** the rbu object is in capture mode. Record the frame number of the frame +** being read in the aFrame[] array. +*/ +static int rbuCaptureWalRead(sqlite3rbu *pRbu, i64 iOff, int iAmt){ + const u32 mReq = (1<mLock!=mReq ){ + pRbu->rc = SQLITE_BUSY; + return SQLITE_INTERNAL; + } + + pRbu->pgsz = iAmt; + if( pRbu->nFrame==pRbu->nFrameAlloc ){ + int nNew = (pRbu->nFrameAlloc ? pRbu->nFrameAlloc : 64) * 2; + RbuFrame *aNew; + aNew = (RbuFrame*)sqlite3_realloc64(pRbu->aFrame, nNew * sizeof(RbuFrame)); + if( aNew==0 ) return SQLITE_NOMEM; + pRbu->aFrame = aNew; + pRbu->nFrameAlloc = nNew; + } + + iFrame = (u32)((iOff-32) / (i64)(iAmt+24)) + 1; + if( pRbu->iMaxFrame
    17. rY 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 z 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

      o9S7i(31I02 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�BNNd3DQb20>tpb;ojXaBR3diRbe2wxS98- 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%0D!g*VktJi^lRE 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 W*bOp*{)bcYa5I`Y`3I$8ng0*a6jdDn literal 0 HcmV?d00001 diff --git a/hdssd/external/win/sqlite/sqlite.sln b/hdssd/external/win/sqlite/sqlite.sln new file mode 100644 index 0000000..ae679f4 --- /dev/null +++ b/hdssd/external/win/sqlite/sqlite.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sqlite", "sqlite.vcproj", "{373AD417-FB19-443E-8126-F515B5EF1497}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {373AD417-FB19-443E-8126-F515B5EF1497}.Debug|Win32.ActiveCfg = Debug|Win32 + {373AD417-FB19-443E-8126-F515B5EF1497}.Debug|Win32.Build.0 = Debug|Win32 + {373AD417-FB19-443E-8126-F515B5EF1497}.Release|Win32.ActiveCfg = Release|Win32 + {373AD417-FB19-443E-8126-F515B5EF1497}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/hdssd/external/win/sqlite/sqlite.vcproj b/hdssd/external/win/sqlite/sqlite.vcproj new file mode 100644 index 0000000..4ce8ebb --- /dev/null +++ b/hdssd/external/win/sqlite/sqlite.vcproj @@ -0,0 +1,179 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/hdssd/external/win/sqlite/sqlite3.c b/hdssd/external/win/sqlite/sqlite3.c new file mode 100644 index 0000000..aaab200 --- /dev/null +++ b/hdssd/external/win/sqlite/sqlite3.c @@ -0,0 +1,199522 @@ +/****************************************************************************** +** This file is an amalgamation of many separate C source files from SQLite +** version 3.15.2. By combining all the individual C code files into this +** single large file, the entire code can be compiled as a single translation +** unit. This allows many compilers to do optimizations that would not be +** possible if the files were compiled separately. Performance improvements +** of 5% or more are commonly seen when SQLite is compiled as a single +** translation unit. +** +** This file is all you need to compile SQLite. To use SQLite in other +** programs, you need this file and the "sqlite3.h" header file that defines +** the programming interface to the SQLite library. (If you do not have +** the "sqlite3.h" header file at hand, you will find a copy embedded within +** the text of this file. Search for "Begin file sqlite3.h" to find the start +** of the embedded sqlite3.h header file.) Additional code files may be needed +** 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. +*/ +#define SQLITE_CORE 1 +#define SQLITE_AMALGAMATION 1 +#ifndef SQLITE_PRIVATE +# define SQLITE_PRIVATE static +#endif +/************** Begin file sqliteInt.h ***************************************/ +/* +** 2001 September 15 +** +** 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. +** +************************************************************************* +** Internal interface definitions for SQLite. +** +*/ +#ifndef SQLITEINT_H +#define SQLITEINT_H + +/* Special Comments: +** +** Some comments have special meaning to the tools that measure test +** coverage: +** +** NO_TEST - The branches on this line are not +** measured by branch coverage. This is +** used on lines of code that actually +** implement parts of coverage testing. +** +** OPTIMIZATION-IF-TRUE - This branch is allowed to alway be false +** and the correct answer is still obtained, +** though perhaps more slowly. +** +** OPTIMIZATION-IF-FALSE - This branch is allowed to alway be true +** and the correct answer is still obtained, +** though perhaps more slowly. +** +** PREVENTS-HARMLESS-OVERREAD - This branch prevents a buffer overread +** that would be harmless and undetectable +** if it did occur. +** +** In all cases, the special comment must be enclosed in the usual +** slash-asterisk...asterisk-slash comment marks, with no spaces between the +** asterisks and the comment text. +*/ + +/* +** Make sure the Tcl calling convention macro is defined. This macro is +** only used by test code and Tcl integration code. +*/ +#ifndef SQLITE_TCLAPI +# define SQLITE_TCLAPI +#endif + +/* +** Make sure that rand_s() is available on Windows systems with MSVC 2005 +** or higher. +*/ +#if defined(_MSC_VER) && _MSC_VER>=1400 +# define _CRT_RAND_S +#endif + +/* +** Include the header file used to customize the compiler options for MSVC. +** This should be done first so that it can successfully prevent spurious +** compiler warnings due to subsequent content in this file and other files +** that are included by this file. +*/ +/************** Include msvc.h in the middle of sqliteInt.h ******************/ +/************** Begin file msvc.h ********************************************/ +/* +** 2015 January 12 +** +** 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 that is specific to MSVC. +*/ +#ifndef SQLITE_MSVC_H +#define SQLITE_MSVC_H + +#if defined(_MSC_VER) +#pragma warning(disable : 4054) +#pragma warning(disable : 4055) +#pragma warning(disable : 4100) +#pragma warning(disable : 4127) +#pragma warning(disable : 4130) +#pragma warning(disable : 4152) +#pragma warning(disable : 4189) +#pragma warning(disable : 4206) +#pragma warning(disable : 4210) +#pragma warning(disable : 4232) +#pragma warning(disable : 4244) +#pragma warning(disable : 4305) +#pragma warning(disable : 4306) +#pragma warning(disable : 4702) +#pragma warning(disable : 4706) +#endif /* defined(_MSC_VER) */ + +#endif /* SQLITE_MSVC_H */ + +/************** End of msvc.h ************************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ + +/* +** Special setup for VxWorks +*/ +/************** Include vxworks.h in the middle of sqliteInt.h ***************/ +/************** Begin file vxworks.h *****************************************/ +/* +** 2015-03-02 +** +** 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 that is specific to Wind River's VxWorks +*/ +#if defined(__RTP__) || defined(_WRS_KERNEL) +/* This is VxWorks. Set up things specially for that OS +*/ +#include +#include /* amalgamator: dontcache */ +#define OS_VXWORKS 1 +#define SQLITE_OS_OTHER 0 +#define SQLITE_HOMEGROWN_RECURSIVE_MUTEX 1 +#define SQLITE_OMIT_LOAD_EXTENSION 1 +#define SQLITE_ENABLE_LOCKING_STYLE 0 +#define HAVE_UTIME 1 +#else +/* This is not VxWorks. */ +#define OS_VXWORKS 0 +#define HAVE_FCHOWN 1 +#define HAVE_READLINK 1 +#define HAVE_LSTAT 1 +#endif /* defined(_WRS_KERNEL) */ + +/************** End of vxworks.h *********************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ + +/* +** These #defines should enable >2GB file support on POSIX if the +** underlying operating system supports it. If the OS lacks +** large file support, or if the OS is windows, these should be no-ops. +** +** Ticket #2739: The _LARGEFILE_SOURCE macro must appear before any +** system #includes. Hence, this block of code must be the very first +** code in all source files. +** +** Large file support can be disabled using the -DSQLITE_DISABLE_LFS switch +** on the compiler command line. This is necessary if you are compiling +** on a recent machine (ex: Red Hat 7.2) but you want your code to work +** on an older machine (ex: Red Hat 6.0). If you compile on Red Hat 7.2 +** without this option, LFS is enable. But LFS does not exist in the kernel +** in Red Hat 6.0, so the code won't work. Hence, for maximum binary +** portability you should omit LFS. +** +** The previous paragraph was written in 2005. (This paragraph is written +** on 2008-11-28.) These days, all Linux kernels support large files, so +** you should probably leave LFS enabled. But some embedded platforms might +** lack LFS in which case the SQLITE_DISABLE_LFS macro might still be useful. +** +** Similar is true for Mac OS X. LFS is only supported on Mac OS X 9 and later. +*/ +#ifndef SQLITE_DISABLE_LFS +# define _LARGE_FILE 1 +# ifndef _FILE_OFFSET_BITS +# define _FILE_OFFSET_BITS 64 +# endif +# define _LARGEFILE_SOURCE 1 +#endif + +/* What version of GCC is being used. 0 means GCC is not being used */ +#ifdef __GNUC__ +# define GCC_VERSION (__GNUC__*1000000+__GNUC_MINOR__*1000+__GNUC_PATCHLEVEL__) +#else +# define GCC_VERSION 0 +#endif + +/* Needed for various definitions... */ +#if defined(__GNUC__) && !defined(_GNU_SOURCE) +# define _GNU_SOURCE +#endif + +#if defined(__OpenBSD__) && !defined(_BSD_SOURCE) +# define _BSD_SOURCE +#endif + +/* +** For MinGW, check to see if we can include the header file containing its +** version information, among other things. Normally, this internal MinGW +** header file would [only] be included automatically by other MinGW header +** files; however, the contained version information is now required by this +** header file to work around binary compatibility issues (see below) and +** this is the only known way to reliably obtain it. This entire #if block +** would be completely unnecessary if there was any other way of detecting +** MinGW via their preprocessor (e.g. if they customized their GCC to define +** some MinGW-specific macros). When compiling for MinGW, either the +** _HAVE_MINGW_H or _HAVE__MINGW_H (note the extra underscore) macro must be +** defined; otherwise, detection of conditions specific to MinGW will be +** disabled. +*/ +#if defined(_HAVE_MINGW_H) +# include "mingw.h" +#elif defined(_HAVE__MINGW_H) +# include "_mingw.h" +#endif + +/* +** For MinGW version 4.x (and higher), check to see if the _USE_32BIT_TIME_T +** define is required to maintain binary compatibility with the MSVC runtime +** library in use (e.g. for Windows XP). +*/ +#if !defined(_USE_32BIT_TIME_T) && !defined(_USE_64BIT_TIME_T) && \ + defined(_WIN32) && !defined(_WIN64) && \ + defined(__MINGW_MAJOR_VERSION) && __MINGW_MAJOR_VERSION >= 4 && \ + defined(__MSVCRT__) +# define _USE_32BIT_TIME_T +#endif + +/* The public SQLite interface. The _FILE_OFFSET_BITS macro must appear +** first in QNX. Also, the _USE_32BIT_TIME_T macro must appear first for +** MinGW. +*/ +/************** Include sqlite3.h in the middle of sqliteInt.h ***************/ +/************** Begin file sqlite3.h *****************************************/ +/* +** 2001 September 15 +** +** 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 header file defines the interface that the SQLite library +** presents to client programs. If a C-function, structure, datatype, +** or constant definition does not appear in this file, then it is +** not a published API of SQLite, is subject to change without +** notice, and should not be referenced by programs that use SQLite. +** +** Some of the definitions that are in this file are marked as +** "experimental". Experimental interfaces are normally new +** features recently added to SQLite. We do not anticipate changes +** to experimental interfaces but reserve the right to make minor changes +** if experience from use "in the wild" suggest such changes are prudent. +** +** The official C-language API documentation for SQLite is derived +** from comments in this file. This file is the authoritative source +** on how SQLite interfaces are supposed to operate. +** +** The name of this file under configuration management is "sqlite.h.in". +** The makefile makes some minor changes to this file (such as inserting +** the version number) and changes its name to "sqlite3.h" as +** part of the build process. +*/ +#ifndef SQLITE3_H +#define SQLITE3_H +#include /* Needed for the definition of va_list */ + +/* +** Make sure we can call this stuff from C++. +*/ +#if 0 +extern "C" { +#endif + + +/* +** Provide the ability to override linkage features of the interface. +*/ +#ifndef SQLITE_EXTERN +# define SQLITE_EXTERN extern +#endif +#ifndef SQLITE_API +# define SQLITE_API +#endif +#ifndef SQLITE_CDECL +# define SQLITE_CDECL +#endif +#ifndef SQLITE_APICALL +# define SQLITE_APICALL +#endif +#ifndef SQLITE_STDCALL +# define SQLITE_STDCALL SQLITE_APICALL +#endif +#ifndef SQLITE_CALLBACK +# define SQLITE_CALLBACK +#endif +#ifndef SQLITE_SYSAPI +# define SQLITE_SYSAPI +#endif + +/* +** These no-op macros are used in front of interfaces to mark those +** interfaces as either deprecated or experimental. New applications +** should not use deprecated interfaces - they are supported for backwards +** compatibility only. Application writers should be aware that +** experimental interfaces are subject to change in point releases. +** +** These macros used to resolve to various kinds of compiler magic that +** would generate warning messages when they were used. But that +** compiler magic ended up generating such a flurry of bug reports +** that we have taken it all out and gone back to using simple +** noop macros. +*/ +#define SQLITE_DEPRECATED +#define SQLITE_EXPERIMENTAL + +/* +** Ensure these symbols were not defined by some previous header file. +*/ +#ifdef SQLITE_VERSION +# undef SQLITE_VERSION +#endif +#ifdef SQLITE_VERSION_NUMBER +# undef SQLITE_VERSION_NUMBER +#endif + +/* +** 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] ([dateof:3.6.18]), +** SQLite source code has been stored in the +** Fossil configuration management +** system. ^The SQLITE_SOURCE_ID macro evaluates 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()]. +*/ +#define SQLITE_VERSION "3.15.2" +#define SQLITE_VERSION_NUMBER 3015002 +#define SQLITE_SOURCE_ID "2016-11-28 19:13:37 bbd85d235f7037c6a033a9690534391ffeacecc8" + +/* +** CAPI3REF: Run-Time Library Version Numbers +** KEYWORDS: sqlite3_version, sqlite3_sourceid +** +** These interfaces provide the same information as the [SQLITE_VERSION], +** [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 ensure that the application is +** compiled with matching library and header files. +** +**

      +** assert( sqlite3_libversion_number()==SQLITE_VERSION_NUMBER );
      +** assert( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)==0 );
      +** 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 returns +** 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()]. +*/ +SQLITE_API const char sqlite3_version[] = SQLITE_VERSION; +SQLITE_API const char *sqlite3_libversion(void); +SQLITE_API const char *sqlite3_sourceid(void); +SQLITE_API int sqlite3_libversion_number(void); + +/* +** CAPI3REF: Run-Time Library Compilation Options Diagnostics +** +** ^The sqlite3_compileoption_used() function returns 0 or 1 +** indicating whether the specified option was defined at +** compile time. ^The SQLITE_ prefix may be omitted from the +** option name passed to sqlite3_compileoption_used(). +** +** ^The sqlite3_compileoption_get() function allows iterating +** over the list of options that were defined at compile time by +** returning the N-th compile time option string. ^If N is out of range, +** sqlite3_compileoption_get() returns a NULL pointer. ^The SQLITE_ +** prefix is omitted from any strings returned by +** sqlite3_compileoption_get(). +** +** ^Support for the diagnostic functions sqlite3_compileoption_used() +** and sqlite3_compileoption_get() may be omitted by specifying the +** [SQLITE_OMIT_COMPILEOPTION_DIAGS] option at compile time. +** +** See also: SQL functions [sqlite_compileoption_used()] and +** [sqlite_compileoption_get()] and the [compile_options pragma]. +*/ +#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS +SQLITE_API int sqlite3_compileoption_used(const char *zOptName); +SQLITE_API const char *sqlite3_compileoption_get(int N); +#endif + +/* +** CAPI3REF: Test To See If The Library Is Threadsafe +** +** ^The sqlite3_threadsafe() function returns zero if and only if +** SQLite was compiled with 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 +** are enabled and SQLite is threadsafe. When the +** [SQLITE_THREADSAFE] macro is 0, +** the mutexes are omitted. Without the mutexes, it is not safe +** to use SQLite concurrently from more than one thread. +** +** 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. +** +** This interface can be used by an application to make sure that the +** version of SQLite that it is linking against was compiled with +** the desired setting of the [SQLITE_THREADSAFE] macro. +** +** This interface only reports on the compile-time mutex setting +** of the [SQLITE_THREADSAFE] flag. If SQLite is compiled with +** 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_SERIALIZED]. ^(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. +*/ +SQLITE_API int sqlite3_threadsafe(void); + +/* +** CAPI3REF: Database Connection Handle +** KEYWORDS: {database connection} {database connections} +** +** Each open SQLite database is represented by a pointer to an instance of +** the opaque structure named "sqlite3". It is useful to think of an sqlite3 +** pointer as an object. The [sqlite3_open()], [sqlite3_open16()], and +** [sqlite3_open_v2()] interfaces are its constructors, and [sqlite3_close()] +** and [sqlite3_close_v2()] are its destructors. There are many other +** interfaces (such as +** [sqlite3_prepare_v2()], [sqlite3_create_function()], and +** [sqlite3_busy_timeout()] to name but three) that are methods on an +** sqlite3 object. +*/ +typedef struct sqlite3 sqlite3; + +/* +** CAPI3REF: 64-Bit Integer Types +** KEYWORDS: sqlite_int64 sqlite_uint64 +** +** Because there is no cross-platform way to specify 64-bit integer types +** SQLite includes typedefs for 64-bit signed and unsigned integers. +** +** The sqlite3_int64 and sqlite3_uint64 are the preferred type definitions. +** The sqlite_int64 and sqlite_uint64 types are supported for backwards +** compatibility only. +** +** ^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; + typedef unsigned SQLITE_INT64_TYPE sqlite_uint64; +#elif defined(_MSC_VER) || defined(__BORLANDC__) + typedef __int64 sqlite_int64; + typedef unsigned __int64 sqlite_uint64; +#else + typedef long long int sqlite_int64; + typedef unsigned long long int sqlite_uint64; +#endif +typedef sqlite_int64 sqlite3_int64; +typedef sqlite_uint64 sqlite3_uint64; + +/* +** If compiling for a processor that lacks floating point support, +** substitute integer for floating-point. +*/ +#ifdef SQLITE_OMIT_FLOATING_POINT +# define double sqlite3_int64 +#endif + +/* +** CAPI3REF: Closing A Database Connection +** DESTRUCTOR: sqlite3 +** +** ^The sqlite3_close() and sqlite3_close_v2() routines are destructors +** for the [sqlite3] object. +** ^Calls to sqlite3_close() and sqlite3_close_v2() return [SQLITE_OK] if +** the [sqlite3] object is successfully destroyed and all associated +** resources are deallocated. +** +** ^If the database connection is associated with unfinalized prepared +** statements or unfinished sqlite3_backup objects then sqlite3_close() +** will leave the database connection open and return [SQLITE_BUSY]. +** ^If sqlite3_close_v2() is called with unfinalized prepared statements +** and/or unfinished sqlite3_backups, then the database connection becomes +** an unusable "zombie" which will automatically be deallocated when the +** last prepared statement is finalized or the last sqlite3_backup is +** finished. The sqlite3_close_v2() interface is intended for use with +** host languages that are garbage collected, and where the order in which +** destructors are called is arbitrary. +** +** Applications should [sqlite3_finalize | finalize] all [prepared statements], +** [sqlite3_blob_close | close] all [BLOB handles], and +** [sqlite3_backup_finish | finish] all [sqlite3_backup] objects associated +** with the [sqlite3] object prior to attempting to close the object. ^If +** sqlite3_close_v2() is called on a [database connection] that still has +** outstanding [prepared statements], [BLOB handles], and/or +** [sqlite3_backup] objects then it returns [SQLITE_OK] and the deallocation +** of resources is deferred until all [prepared statements], [BLOB handles], +** and [sqlite3_backup] objects are also destroyed. +** +** ^If an [sqlite3] object is destroyed while a transaction is open, +** the transaction is automatically rolled back. +** +** The C parameter to [sqlite3_close(C)] and [sqlite3_close_v2(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. +** ^Calling sqlite3_close() or sqlite3_close_v2() with a NULL pointer +** argument is a harmless no-op. +*/ +SQLITE_API int sqlite3_close(sqlite3*); +SQLITE_API int sqlite3_close_v2(sqlite3*); + +/* +** The type for a callback function. +** This is legacy and deprecated. It is included for historical +** compatibility and is not documented. +*/ +typedef int (*sqlite3_callback)(void*,int,char**, char**); + +/* +** CAPI3REF: One-Step Query Execution Interface +** METHOD: sqlite3 +** +** 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 +** 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 +** 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 application must ensure that the 1st parameter to sqlite3_exec() +** is a valid and open [database connection]. +**
      • The application must not close the [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 */ + const char *sql, /* SQL to be evaluated */ + int (*callback)(void*,int,char**,char**), /* Callback function */ + void *, /* 1st argument to callback */ + char **errmsg /* Error msg written here */ +); + +/* +** CAPI3REF: Result Codes +** KEYWORDS: {result code definitions} +** +** Many SQLite functions return an integer result code from the set shown +** here in order to indicate success or failure. +** +** New error codes may be added in future versions of SQLite. +** +** See also: [extended result code definitions] +*/ +#define SQLITE_OK 0 /* Successful result */ +/* beginning-of-error-codes */ +#define SQLITE_ERROR 1 /* SQL error or missing database */ +#define SQLITE_INTERNAL 2 /* Internal logic error in SQLite */ +#define SQLITE_PERM 3 /* Access permission denied */ +#define SQLITE_ABORT 4 /* Callback routine requested an abort */ +#define SQLITE_BUSY 5 /* The database file is locked */ +#define SQLITE_LOCKED 6 /* A table in the database is locked */ +#define SQLITE_NOMEM 7 /* A malloc() failed */ +#define SQLITE_READONLY 8 /* Attempt to write a readonly database */ +#define SQLITE_INTERRUPT 9 /* Operation terminated by sqlite3_interrupt()*/ +#define SQLITE_IOERR 10 /* Some kind of disk I/O error occurred */ +#define SQLITE_CORRUPT 11 /* The database disk image is malformed */ +#define SQLITE_NOTFOUND 12 /* Unknown opcode in sqlite3_file_control() */ +#define SQLITE_FULL 13 /* Insertion failed because database is full */ +#define SQLITE_CANTOPEN 14 /* Unable to open the database file */ +#define SQLITE_PROTOCOL 15 /* Database lock protocol error */ +#define SQLITE_EMPTY 16 /* Database is empty */ +#define SQLITE_SCHEMA 17 /* The database schema changed */ +#define SQLITE_TOOBIG 18 /* String or BLOB exceeds size limit */ +#define SQLITE_CONSTRAINT 19 /* Abort due to constraint violation */ +#define SQLITE_MISMATCH 20 /* Data type mismatch */ +#define SQLITE_MISUSE 21 /* Library used incorrectly */ +#define SQLITE_NOLFS 22 /* Uses OS features not supported on host */ +#define SQLITE_AUTH 23 /* Authorization denied */ +#define SQLITE_FORMAT 24 /* Auxiliary database format error */ +#define SQLITE_RANGE 25 /* 2nd parameter to sqlite3_bind out of range */ +#define SQLITE_NOTADB 26 /* File opened that is not a database file */ +#define SQLITE_NOTICE 27 /* Notifications from sqlite3_log() */ +#define SQLITE_WARNING 28 /* Warnings from sqlite3_log() */ +#define SQLITE_ROW 100 /* sqlite3_step() has another row ready */ +#define SQLITE_DONE 101 /* sqlite3_step() has finished executing */ +/* end-of-error-codes */ + +/* +** CAPI3REF: Extended Result Codes +** KEYWORDS: {extended result code definitions} +** +** In its default configuration, SQLite API routines return one of 30 integer +** [result codes]. However, experience has shown that many of +** these result codes are too coarse-grained. They do not provide as +** much information about problems as programmers might like. In an effort to +** address this, newer versions of SQLite (version 3.3.8 [dateof:3.3.8] +** and later) include +** support for additional result codes that provide more detailed information +** about errors. These [extended result codes] are enabled or disabled +** on a per database connection basis using the +** [sqlite3_extended_result_codes()] API. Or, the extended code for +** the most recent error can be obtained using +** [sqlite3_extended_errcode()]. +*/ +#define SQLITE_IOERR_READ (SQLITE_IOERR | (1<<8)) +#define SQLITE_IOERR_SHORT_READ (SQLITE_IOERR | (2<<8)) +#define SQLITE_IOERR_WRITE (SQLITE_IOERR | (3<<8)) +#define SQLITE_IOERR_FSYNC (SQLITE_IOERR | (4<<8)) +#define SQLITE_IOERR_DIR_FSYNC (SQLITE_IOERR | (5<<8)) +#define SQLITE_IOERR_TRUNCATE (SQLITE_IOERR | (6<<8)) +#define SQLITE_IOERR_FSTAT (SQLITE_IOERR | (7<<8)) +#define SQLITE_IOERR_UNLOCK (SQLITE_IOERR | (8<<8)) +#define SQLITE_IOERR_RDLOCK (SQLITE_IOERR | (9<<8)) +#define SQLITE_IOERR_DELETE (SQLITE_IOERR | (10<<8)) +#define SQLITE_IOERR_BLOCKED (SQLITE_IOERR | (11<<8)) +#define SQLITE_IOERR_NOMEM (SQLITE_IOERR | (12<<8)) +#define SQLITE_IOERR_ACCESS (SQLITE_IOERR | (13<<8)) +#define SQLITE_IOERR_CHECKRESERVEDLOCK (SQLITE_IOERR | (14<<8)) +#define SQLITE_IOERR_LOCK (SQLITE_IOERR | (15<<8)) +#define SQLITE_IOERR_CLOSE (SQLITE_IOERR | (16<<8)) +#define SQLITE_IOERR_DIR_CLOSE (SQLITE_IOERR | (17<<8)) +#define SQLITE_IOERR_SHMOPEN (SQLITE_IOERR | (18<<8)) +#define SQLITE_IOERR_SHMSIZE (SQLITE_IOERR | (19<<8)) +#define SQLITE_IOERR_SHMLOCK (SQLITE_IOERR | (20<<8)) +#define SQLITE_IOERR_SHMMAP (SQLITE_IOERR | (21<<8)) +#define SQLITE_IOERR_SEEK (SQLITE_IOERR | (22<<8)) +#define SQLITE_IOERR_DELETE_NOENT (SQLITE_IOERR | (23<<8)) +#define SQLITE_IOERR_MMAP (SQLITE_IOERR | (24<<8)) +#define SQLITE_IOERR_GETTEMPPATH (SQLITE_IOERR | (25<<8)) +#define SQLITE_IOERR_CONVPATH (SQLITE_IOERR | (26<<8)) +#define SQLITE_IOERR_VNODE (SQLITE_IOERR | (27<<8)) +#define SQLITE_IOERR_AUTH (SQLITE_IOERR | (28<<8)) +#define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8)) +#define SQLITE_BUSY_RECOVERY (SQLITE_BUSY | (1<<8)) +#define SQLITE_BUSY_SNAPSHOT (SQLITE_BUSY | (2<<8)) +#define SQLITE_CANTOPEN_NOTEMPDIR (SQLITE_CANTOPEN | (1<<8)) +#define SQLITE_CANTOPEN_ISDIR (SQLITE_CANTOPEN | (2<<8)) +#define SQLITE_CANTOPEN_FULLPATH (SQLITE_CANTOPEN | (3<<8)) +#define SQLITE_CANTOPEN_CONVPATH (SQLITE_CANTOPEN | (4<<8)) +#define SQLITE_CORRUPT_VTAB (SQLITE_CORRUPT | (1<<8)) +#define SQLITE_READONLY_RECOVERY (SQLITE_READONLY | (1<<8)) +#define SQLITE_READONLY_CANTLOCK (SQLITE_READONLY | (2<<8)) +#define SQLITE_READONLY_ROLLBACK (SQLITE_READONLY | (3<<8)) +#define SQLITE_READONLY_DBMOVED (SQLITE_READONLY | (4<<8)) +#define SQLITE_ABORT_ROLLBACK (SQLITE_ABORT | (2<<8)) +#define SQLITE_CONSTRAINT_CHECK (SQLITE_CONSTRAINT | (1<<8)) +#define SQLITE_CONSTRAINT_COMMITHOOK (SQLITE_CONSTRAINT | (2<<8)) +#define SQLITE_CONSTRAINT_FOREIGNKEY (SQLITE_CONSTRAINT | (3<<8)) +#define SQLITE_CONSTRAINT_FUNCTION (SQLITE_CONSTRAINT | (4<<8)) +#define SQLITE_CONSTRAINT_NOTNULL (SQLITE_CONSTRAINT | (5<<8)) +#define SQLITE_CONSTRAINT_PRIMARYKEY (SQLITE_CONSTRAINT | (6<<8)) +#define SQLITE_CONSTRAINT_TRIGGER (SQLITE_CONSTRAINT | (7<<8)) +#define SQLITE_CONSTRAINT_UNIQUE (SQLITE_CONSTRAINT | (8<<8)) +#define SQLITE_CONSTRAINT_VTAB (SQLITE_CONSTRAINT | (9<<8)) +#define SQLITE_CONSTRAINT_ROWID (SQLITE_CONSTRAINT |(10<<8)) +#define SQLITE_NOTICE_RECOVER_WAL (SQLITE_NOTICE | (1<<8)) +#define SQLITE_NOTICE_RECOVER_ROLLBACK (SQLITE_NOTICE | (2<<8)) +#define SQLITE_WARNING_AUTOINDEX (SQLITE_WARNING | (1<<8)) +#define SQLITE_AUTH_USER (SQLITE_AUTH | (1<<8)) +#define SQLITE_OK_LOAD_PERMANENTLY (SQLITE_OK | (1<<8)) + +/* +** CAPI3REF: Flags For File Open Operations +** +** These bit values are intended for use in the +** 3rd parameter to the [sqlite3_open_v2()] interface and +** in the 4th parameter to the [sqlite3_vfs.xOpen] method. +*/ +#define SQLITE_OPEN_READONLY 0x00000001 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_READWRITE 0x00000002 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_CREATE 0x00000004 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_DELETEONCLOSE 0x00000008 /* VFS only */ +#define SQLITE_OPEN_EXCLUSIVE 0x00000010 /* VFS only */ +#define SQLITE_OPEN_AUTOPROXY 0x00000020 /* VFS only */ +#define SQLITE_OPEN_URI 0x00000040 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_MEMORY 0x00000080 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_MAIN_DB 0x00000100 /* VFS only */ +#define SQLITE_OPEN_TEMP_DB 0x00000200 /* VFS only */ +#define SQLITE_OPEN_TRANSIENT_DB 0x00000400 /* VFS only */ +#define SQLITE_OPEN_MAIN_JOURNAL 0x00000800 /* VFS only */ +#define SQLITE_OPEN_TEMP_JOURNAL 0x00001000 /* VFS only */ +#define SQLITE_OPEN_SUBJOURNAL 0x00002000 /* VFS only */ +#define SQLITE_OPEN_MASTER_JOURNAL 0x00004000 /* VFS only */ +#define SQLITE_OPEN_NOMUTEX 0x00008000 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_FULLMUTEX 0x00010000 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_SHAREDCACHE 0x00020000 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_PRIVATECACHE 0x00040000 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_WAL 0x00080000 /* VFS only */ + +/* Reserved: 0x00F00000 */ + +/* +** CAPI3REF: Device Characteristics +** +** The xDeviceCharacteristics method of the [sqlite3_io_methods] +** object returns an integer which is a vector of these +** bit values expressing I/O characteristics of the mass storage +** device that holds the file that the [sqlite3_io_methods] +** refers to. +** +** The SQLITE_IOCAP_ATOMIC property means that all writes of +** any size are atomic. The SQLITE_IOCAP_ATOMICnnn values +** mean that writes of blocks that are nnn bytes in size and +** are aligned to an address which is an integer multiple of +** nnn are atomic. The SQLITE_IOCAP_SAFE_APPEND value means +** that when data is appended to a file, the data is appended +** first then the size of the file is extended, never the other +** way around. The SQLITE_IOCAP_SEQUENTIAL property means that +** information is written to disk in the same order as calls +** to xWrite(). The SQLITE_IOCAP_POWERSAFE_OVERWRITE property means that +** after reboot following a crash or power loss, the only bytes in a +** file that were written at the application level might have changed +** and that adjacent bytes, even bytes within the same sector are +** guaranteed to be unchanged. The SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN +** flag indicate that a file cannot be deleted when open. The +** SQLITE_IOCAP_IMMUTABLE flag indicates that the file is on +** read-only media and cannot be changed even by processes with +** elevated privileges. +*/ +#define SQLITE_IOCAP_ATOMIC 0x00000001 +#define SQLITE_IOCAP_ATOMIC512 0x00000002 +#define SQLITE_IOCAP_ATOMIC1K 0x00000004 +#define SQLITE_IOCAP_ATOMIC2K 0x00000008 +#define SQLITE_IOCAP_ATOMIC4K 0x00000010 +#define SQLITE_IOCAP_ATOMIC8K 0x00000020 +#define SQLITE_IOCAP_ATOMIC16K 0x00000040 +#define SQLITE_IOCAP_ATOMIC32K 0x00000080 +#define SQLITE_IOCAP_ATOMIC64K 0x00000100 +#define SQLITE_IOCAP_SAFE_APPEND 0x00000200 +#define SQLITE_IOCAP_SEQUENTIAL 0x00000400 +#define SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN 0x00000800 +#define SQLITE_IOCAP_POWERSAFE_OVERWRITE 0x00001000 +#define SQLITE_IOCAP_IMMUTABLE 0x00002000 + +/* +** 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 +** of an [sqlite3_io_methods] object. +*/ +#define SQLITE_LOCK_NONE 0 +#define SQLITE_LOCK_SHARED 1 +#define SQLITE_LOCK_RESERVED 2 +#define SQLITE_LOCK_PENDING 3 +#define SQLITE_LOCK_EXCLUSIVE 4 + +/* +** CAPI3REF: Synchronization Type Flags +** +** When SQLite invokes the xSync() method of an +** [sqlite3_io_methods] object it uses a combination of +** these integer values as the second argument. +** +** When the SQLITE_SYNC_DATAONLY flag is used, it means that the +** sync operation only needs to flush data to mass storage. Inode +** information need not be flushed. If the lower four bits of the flag +** equal SQLITE_SYNC_NORMAL, that means to use normal fsync() semantics. +** If the lower four bits equal SQLITE_SYNC_FULL, that means +** to use Mac OS X style fullsync instead of fsync(). +** +** Do not confuse the SQLITE_SYNC_NORMAL and SQLITE_SYNC_FULL flags +** with the [PRAGMA synchronous]=NORMAL and [PRAGMA synchronous]=FULL +** settings. The [synchronous pragma] determines when calls to the +** xSync VFS method occur and applies uniformly across all platforms. +** The SQLITE_SYNC_NORMAL and SQLITE_SYNC_FULL flags determine how +** energetic or rigorous or forceful the sync operations are and +** only make a difference on Mac OSX for the default SQLite code. +** (Third-party VFS implementations might also make the distinction +** between SQLITE_SYNC_NORMAL and SQLITE_SYNC_FULL, but among the +** operating systems natively supported by SQLite, only Mac OSX +** cares about the difference.) +*/ +#define SQLITE_SYNC_NORMAL 0x00002 +#define SQLITE_SYNC_FULL 0x00003 +#define SQLITE_SYNC_DATAONLY 0x00010 + +/* +** CAPI3REF: OS Interface Open File Handle +** +** An [sqlite3_file] object represents an open file in the +** [sqlite3_vfs | OS interface layer]. Individual OS interface +** implementations will +** want to subclass this object by appending additional fields +** for their own use. The pMethods entry is a pointer to an +** [sqlite3_io_methods] object that defines methods for performing +** I/O operations on the open file. +*/ +typedef struct sqlite3_file sqlite3_file; +struct sqlite3_file { + const struct sqlite3_io_methods *pMethods; /* Methods for an open file */ +}; + +/* +** 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 +** [sqlite3_file] object) with a pointer to an instance of this object. +** This object defines the methods used to perform various operations +** against the open file represented by the [sqlite3_file] object. +** +** If the [sqlite3_vfs.xOpen] method sets the sqlite3_file.pMethods element +** to a non-NULL pointer, then the sqlite3_io_methods.xClose method +** may be invoked even if the [sqlite3_vfs.xOpen] reported that it failed. The +** only way to prevent a call to xClose following a failed [sqlite3_vfs.xOpen] +** is for the [sqlite3_vfs.xOpen] to set the sqlite3_file.pMethods element +** to NULL. +** +** The flags argument to xSync may be one of [SQLITE_SYNC_NORMAL] or +** [SQLITE_SYNC_FULL]. The first choice is the normal fsync(). +** The second choice is a Mac OS X style fullsync. The [SQLITE_SYNC_DATAONLY] +** flag may be ORed in to indicate that only the data of the file +** and not its inode needs to be synced. +** +** The integer values to xLock() and xUnlock() are one of +**
        +**
      • [SQLITE_LOCK_NONE], +**
      • [SQLITE_LOCK_SHARED], +**
      • [SQLITE_LOCK_RESERVED], +**
      • [SQLITE_LOCK_PENDING], or +**
      • [SQLITE_LOCK_EXCLUSIVE]. +**
      +** xLock() increases the lock. xUnlock() decreases the lock. +** The xCheckReservedLock() method checks whether any database connection, +** either in this process or in some other process, is holding a RESERVED, +** PENDING, or EXCLUSIVE lock on the file. It returns true +** if such a lock exists and false otherwise. +** +** The xFileControl() method is a generic interface that allows custom +** VFS implementations to directly control an open file using the +** [sqlite3_file_control()] interface. The second "op" argument is an +** integer opcode. The third argument is a generic pointer intended to +** point to a structure that may contain arguments or space in which to +** write return values. Potential uses for xFileControl() might be +** functions to enable blocking locks with timeouts, to change the +** locking strategy (for example to use dot-file locks), to inquire +** about the status of a lock, or to break stale locks. The SQLite +** core reserves all opcodes less than 100 for its own use. +** A [file control opcodes | list of opcodes] less than 100 is available. +** Applications that define a custom xFileControl method should use opcodes +** greater than 100 to avoid conflicts. VFS implementations should +** return [SQLITE_NOTFOUND] for file control opcodes that they do not +** recognize. +** +** The xSectorSize() method returns the sector size of the +** device that underlies the file. The sector size is the +** minimum write that can be performed without disturbing +** other bytes in the file. The xDeviceCharacteristics() +** method returns a bit vector describing behaviors of the +** underlying device: +** +**
        +**
      • [SQLITE_IOCAP_ATOMIC] +**
      • [SQLITE_IOCAP_ATOMIC512] +**
      • [SQLITE_IOCAP_ATOMIC1K] +**
      • [SQLITE_IOCAP_ATOMIC2K] +**
      • [SQLITE_IOCAP_ATOMIC4K] +**
      • [SQLITE_IOCAP_ATOMIC8K] +**
      • [SQLITE_IOCAP_ATOMIC16K] +**
      • [SQLITE_IOCAP_ATOMIC32K] +**
      • [SQLITE_IOCAP_ATOMIC64K] +**
      • [SQLITE_IOCAP_SAFE_APPEND] +**
      • [SQLITE_IOCAP_SEQUENTIAL] +**
      +** +** The SQLITE_IOCAP_ATOMIC property means that all writes of +** any size are atomic. The SQLITE_IOCAP_ATOMICnnn values +** mean that writes of blocks that are nnn bytes in size and +** are aligned to an address which is an integer multiple of +** nnn are atomic. The SQLITE_IOCAP_SAFE_APPEND value means +** that when data is appended to a file, the data is appended +** first then the size of the file is extended, never the other +** way around. The SQLITE_IOCAP_SEQUENTIAL property means that +** information is written to disk in the same order as calls +** to xWrite(). +** +** If xRead() returns SQLITE_IOERR_SHORT_READ it must also fill +** in the unread portions of the buffer with zeros. A VFS that +** fails to zero-fill short reads might seem to work. However, +** failure to zero-fill short reads will eventually lead to +** database corruption. +*/ +typedef struct sqlite3_io_methods sqlite3_io_methods; +struct sqlite3_io_methods { + int iVersion; + int (*xClose)(sqlite3_file*); + int (*xRead)(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst); + int (*xWrite)(sqlite3_file*, const void*, int iAmt, sqlite3_int64 iOfst); + int (*xTruncate)(sqlite3_file*, sqlite3_int64 size); + int (*xSync)(sqlite3_file*, int flags); + int (*xFileSize)(sqlite3_file*, sqlite3_int64 *pSize); + int (*xLock)(sqlite3_file*, int); + int (*xUnlock)(sqlite3_file*, int); + int (*xCheckReservedLock)(sqlite3_file*, int *pResOut); + int (*xFileControl)(sqlite3_file*, int op, void *pArg); + int (*xSectorSize)(sqlite3_file*); + int (*xDeviceCharacteristics)(sqlite3_file*); + /* Methods above are valid for version 1 */ + int (*xShmMap)(sqlite3_file*, int iPg, int pgsz, int, void volatile**); + int (*xShmLock)(sqlite3_file*, int offset, int n, int flags); + void (*xShmBarrier)(sqlite3_file*); + int (*xShmUnmap)(sqlite3_file*, int deleteFlag); + /* Methods above are valid for version 2 */ + int (*xFetch)(sqlite3_file*, sqlite3_int64 iOfst, int iAmt, void **pp); + int (*xUnfetch)(sqlite3_file*, sqlite3_int64 iOfst, void *p); + /* Methods above are valid for version 3 */ + /* Additional methods may be added in future releases */ +}; + +/* +** CAPI3REF: Standard File Control Opcodes +** KEYWORDS: {file control opcodes} {file control opcode} +** +** These integer constants are opcodes for the xFileControl method +** of the [sqlite3_io_methods] object and for the [sqlite3_file_control()] +** interface. +** +**
        +**
      • [[SQLITE_FCNTL_LOCKSTATE]] +** The [SQLITE_FCNTL_LOCKSTATE] opcode is used for debugging. This +** opcode causes the xFileControl method to write the current state of +** the lock (one of [SQLITE_LOCK_NONE], [SQLITE_LOCK_SHARED], +** [SQLITE_LOCK_RESERVED], [SQLITE_LOCK_PENDING], or [SQLITE_LOCK_EXCLUSIVE]) +** into an integer that the pArg argument points to. This capability +** is used during testing and is only available when the SQLITE_TEST +** compile-time option is used. +** +**
      • [[SQLITE_FCNTL_SIZE_HINT]] +** The [SQLITE_FCNTL_SIZE_HINT] opcode is used by SQLite to give the VFS +** layer a hint of how large the database file will grow to be during the +** current transaction. This hint is not guaranteed to be accurate but it +** is often close. The underlying VFS might choose to preallocate database +** file space based on this hint in order to help writes to the database +** file run faster. +** +**
      • [[SQLITE_FCNTL_CHUNK_SIZE]] +** The [SQLITE_FCNTL_CHUNK_SIZE] opcode is used to request that the VFS +** extends and truncates the database file in chunks of a size specified +** by the user. The fourth argument to [sqlite3_file_control()] should +** point to an integer (type int) containing the new chunk-size to use +** for the nominated database. Allocating database file space in large +** chunks (say 1MB at a time), may reduce file-system fragmentation and +** improve performance on some systems. +** +**
      • [[SQLITE_FCNTL_FILE_POINTER]] +** The [SQLITE_FCNTL_FILE_POINTER] opcode is used to obtain a pointer +** to the [sqlite3_file] object associated with a particular database +** connection. See also [SQLITE_FCNTL_JOURNAL_POINTER]. +** +**
      • [[SQLITE_FCNTL_JOURNAL_POINTER]] +** The [SQLITE_FCNTL_JOURNAL_POINTER] opcode is used to obtain a pointer +** to the [sqlite3_file] object associated with the journal file (either +** the [rollback journal] or the [write-ahead log]) for a particular database +** connection. See also [SQLITE_FCNTL_FILE_POINTER]. +** +**
      • [[SQLITE_FCNTL_SYNC_OMITTED]] +** No longer in use. +** +**
      • [[SQLITE_FCNTL_SYNC]] +** The [SQLITE_FCNTL_SYNC] opcode is generated internally by SQLite and +** sent to the VFS immediately before the xSync method is invoked on a +** database file descriptor. Or, if the xSync method is not invoked +** because the user has configured SQLite with +** [PRAGMA synchronous | PRAGMA synchronous=OFF] it is invoked in place +** of the xSync method. In most cases, the pointer argument passed with +** this file-control is NULL. However, if the database file is being synced +** as part of a multi-database commit, the argument points to a nul-terminated +** string containing the transactions master-journal file name. VFSes that +** do not need this signal should silently ignore this opcode. Applications +** should not call [sqlite3_file_control()] with this opcode as doing so may +** disrupt the operation of the specialized VFSes that do require it. +** +**
      • [[SQLITE_FCNTL_COMMIT_PHASETWO]] +** The [SQLITE_FCNTL_COMMIT_PHASETWO] opcode is generated internally by SQLite +** and sent to the VFS after a transaction has been committed immediately +** but before the database is unlocked. VFSes that do not need this signal +** should silently ignore this opcode. Applications should not call +** [sqlite3_file_control()] with this opcode as doing so may disrupt the +** operation of the specialized VFSes that do require it. +** +**
      • [[SQLITE_FCNTL_WIN32_AV_RETRY]] +** ^The [SQLITE_FCNTL_WIN32_AV_RETRY] opcode is used to configure automatic +** retry counts and intervals for certain disk I/O operations for the +** windows [VFS] in order to provide robustness in the presence of +** anti-virus programs. By default, the windows VFS will retry file read, +** file write, and file delete operations up to 10 times, with a delay +** of 25 milliseconds before the first retry and with the delay increasing +** by an additional 25 milliseconds with each subsequent retry. This +** opcode allows these two values (10 retries and 25 milliseconds of delay) +** to be adjusted. The values are changed for all database connections +** within the same process. The argument is a pointer to an array of two +** integers where the first integer i the new retry count and the second +** integer is the delay. If either integer is negative, then the setting +** is not changed but instead the prior value of that setting is written +** into the array entry, allowing the current retry settings to be +** interrogated. The zDbName parameter is ignored. +** +**
      • [[SQLITE_FCNTL_PERSIST_WAL]] +** ^The [SQLITE_FCNTL_PERSIST_WAL] opcode is used to set or query the +** persistent [WAL | Write Ahead Log] setting. By default, the auxiliary +** write ahead log and shared memory files used for transaction control +** are automatically deleted when the latest connection to the database +** closes. Setting persistent WAL mode causes those files to persist after +** close. Persisting the files is useful when other processes that do not +** have write permission on the directory containing the database file want +** to read the database file, as the WAL and shared memory files must exist +** in order for the database to be readable. The fourth parameter to +** [sqlite3_file_control()] for this opcode should be a pointer to an integer. +** That integer is 0 to disable persistent WAL mode or 1 to enable persistent +** WAL mode. If the integer is -1, then it is overwritten with the current +** WAL persistence setting. +** +**
      • [[SQLITE_FCNTL_POWERSAFE_OVERWRITE]] +** ^The [SQLITE_FCNTL_POWERSAFE_OVERWRITE] opcode is used to set or query the +** persistent "powersafe-overwrite" or "PSOW" setting. The PSOW setting +** determines the [SQLITE_IOCAP_POWERSAFE_OVERWRITE] bit of the +** xDeviceCharacteristics methods. The fourth parameter to +** [sqlite3_file_control()] for this opcode should be a pointer to an integer. +** That integer is 0 to disable zero-damage mode or 1 to enable zero-damage +** mode. If the integer is -1, then it is overwritten with the current +** zero-damage mode setting. +** +**
      • [[SQLITE_FCNTL_OVERWRITE]] +** ^The [SQLITE_FCNTL_OVERWRITE] opcode is invoked by SQLite after opening +** a write transaction to indicate that, unless it is rolled back for some +** reason, the entire database file will be overwritten by the current +** transaction. This is used by VACUUM operations. +** +**
      • [[SQLITE_FCNTL_VFSNAME]] +** ^The [SQLITE_FCNTL_VFSNAME] opcode can be used to obtain the names of +** all [VFSes] in the VFS stack. The names are of all VFS shims and the +** final bottom-level VFS are written into memory obtained from +** [sqlite3_malloc()] and the result is stored in the char* variable +** that the fourth parameter of [sqlite3_file_control()] points to. +** The caller is responsible for freeing the memory when done. As with +** all file-control actions, there is no guarantee that this will actually +** do anything. Callers should initialize the char* variable to a NULL +** pointer in case this file-control is not implemented. This file-control +** is intended for diagnostic use only. +** +**
      • [[SQLITE_FCNTL_VFS_POINTER]] +** ^The [SQLITE_FCNTL_VFS_POINTER] opcode finds a pointer to the top-level +** [VFSes] currently in use. ^(The argument X in +** sqlite3_file_control(db,SQLITE_FCNTL_VFS_POINTER,X) must be +** of type "[sqlite3_vfs] **". This opcodes will set *X +** to a pointer to the top-level VFS.)^ +** ^When there are multiple VFS shims in the stack, this opcode finds the +** upper-most shim only. +** +**
      • [[SQLITE_FCNTL_PRAGMA]] +** ^Whenever a [PRAGMA] statement is parsed, an [SQLITE_FCNTL_PRAGMA] +** file control is sent to the open [sqlite3_file] object corresponding +** to the database file to which the pragma statement refers. ^The argument +** to the [SQLITE_FCNTL_PRAGMA] file control is an array of +** pointers to strings (char**) in which the second element of the array +** is the name of the pragma and the third element is the argument to the +** pragma or NULL if the pragma has no argument. ^The handler for an +** [SQLITE_FCNTL_PRAGMA] file control can optionally make the first element +** of the char** argument point to a string obtained from [sqlite3_mprintf()] +** or the equivalent and that string will become the result of the pragma or +** the error message if the pragma fails. ^If the +** [SQLITE_FCNTL_PRAGMA] file control returns [SQLITE_NOTFOUND], then normal +** [PRAGMA] processing continues. ^If the [SQLITE_FCNTL_PRAGMA] +** file control returns [SQLITE_OK], then the parser assumes that the +** VFS has handled the PRAGMA itself and the parser generates a no-op +** prepared statement if result string is NULL, or that returns a copy +** of the result string if the string is non-NULL. +** ^If the [SQLITE_FCNTL_PRAGMA] file control returns +** any result code other than [SQLITE_OK] or [SQLITE_NOTFOUND], that means +** that the VFS encountered an error while handling the [PRAGMA] and the +** compilation of the PRAGMA fails with an error. ^The [SQLITE_FCNTL_PRAGMA] +** file control occurs at the beginning of pragma statement analysis and so +** it is able to override built-in [PRAGMA] statements. +** +**
      • [[SQLITE_FCNTL_BUSYHANDLER]] +** ^The [SQLITE_FCNTL_BUSYHANDLER] +** file-control may be invoked by SQLite on the database file handle +** shortly after it is opened in order to provide a custom VFS with access +** to the connections busy-handler callback. The argument is of type (void **) +** - an array of two (void *) values. The first (void *) actually points +** to a function of type (int (*)(void *)). In order to invoke the connections +** busy-handler, this function should be invoked with the second (void *) in +** the array as the only argument. If it returns non-zero, then the operation +** should be retried. If it returns zero, the custom VFS should abandon the +** current operation. +** +**
      • [[SQLITE_FCNTL_TEMPFILENAME]] +** ^Application can invoke the [SQLITE_FCNTL_TEMPFILENAME] file-control +** to have SQLite generate a +** temporary filename using the same algorithm that is followed to generate +** temporary filenames for TEMP tables and other internal uses. The +** argument should be a char** which will be filled with the filename +** written into memory obtained from [sqlite3_malloc()]. The caller should +** invoke [sqlite3_free()] on the result to avoid a memory leak. +** +**
      • [[SQLITE_FCNTL_MMAP_SIZE]] +** The [SQLITE_FCNTL_MMAP_SIZE] file control is used to query or set the +** maximum number of bytes that will be used for memory-mapped I/O. +** The argument is a pointer to a value of type sqlite3_int64 that +** is an advisory maximum number of bytes in the file to memory map. The +** pointer is overwritten with the old value. The limit is not changed if +** the value originally pointed to is negative, and so the current limit +** can be queried by passing in a pointer to a negative number. This +** file-control is used internally to implement [PRAGMA mmap_size]. +** +**
      • [[SQLITE_FCNTL_TRACE]] +** The [SQLITE_FCNTL_TRACE] file control provides advisory information +** to the VFS about what the higher layers of the SQLite stack are doing. +** This file control is used by some VFS activity tracing [shims]. +** The argument is a zero-terminated string. Higher layers in the +** SQLite stack may generate instances of this file control if +** the [SQLITE_USE_FCNTL_TRACE] compile-time option is enabled. +** +**
      • [[SQLITE_FCNTL_HAS_MOVED]] +** The [SQLITE_FCNTL_HAS_MOVED] file control interprets its argument as a +** pointer to an integer and it writes a boolean into that integer depending +** on whether or not the file has been renamed, moved, or deleted since it +** was first opened. +** +**
      • [[SQLITE_FCNTL_WIN32_GET_HANDLE]] +** The [SQLITE_FCNTL_WIN32_GET_HANDLE] opcode can be used to obtain the +** underlying native file handle associated with a file handle. This file +** control interprets its argument as a pointer to a native file handle and +** writes the resulting value there. +** +**
      • [[SQLITE_FCNTL_WIN32_SET_HANDLE]] +** The [SQLITE_FCNTL_WIN32_SET_HANDLE] opcode is used for debugging. This +** opcode causes the xFileControl method to swap the file handle with the one +** pointed to by the pArg argument. This capability is used during testing +** and only needs to be supported when SQLITE_TEST is defined. +** +**
      • [[SQLITE_FCNTL_WAL_BLOCK]] +** The [SQLITE_FCNTL_WAL_BLOCK] is a signal to the VFS layer that it might +** be advantageous to block on the next WAL lock if the lock is not immediately +** available. The WAL subsystem issues this signal during rare +** circumstances in order to fix a problem with priority inversion. +** Applications should not use this file-control. +** +**
      • [[SQLITE_FCNTL_ZIPVFS]] +** The [SQLITE_FCNTL_ZIPVFS] opcode is implemented by zipvfs only. All other +** VFS should return SQLITE_NOTFOUND for this opcode. +** +**
      • [[SQLITE_FCNTL_RBU]] +** The [SQLITE_FCNTL_RBU] opcode is implemented by the special VFS used by +** the RBU extension only. All other VFS should return SQLITE_NOTFOUND for +** this opcode. +**
      +*/ +#define SQLITE_FCNTL_LOCKSTATE 1 +#define SQLITE_FCNTL_GET_LOCKPROXYFILE 2 +#define SQLITE_FCNTL_SET_LOCKPROXYFILE 3 +#define SQLITE_FCNTL_LAST_ERRNO 4 +#define SQLITE_FCNTL_SIZE_HINT 5 +#define SQLITE_FCNTL_CHUNK_SIZE 6 +#define SQLITE_FCNTL_FILE_POINTER 7 +#define SQLITE_FCNTL_SYNC_OMITTED 8 +#define SQLITE_FCNTL_WIN32_AV_RETRY 9 +#define SQLITE_FCNTL_PERSIST_WAL 10 +#define SQLITE_FCNTL_OVERWRITE 11 +#define SQLITE_FCNTL_VFSNAME 12 +#define SQLITE_FCNTL_POWERSAFE_OVERWRITE 13 +#define SQLITE_FCNTL_PRAGMA 14 +#define SQLITE_FCNTL_BUSYHANDLER 15 +#define SQLITE_FCNTL_TEMPFILENAME 16 +#define SQLITE_FCNTL_MMAP_SIZE 18 +#define SQLITE_FCNTL_TRACE 19 +#define SQLITE_FCNTL_HAS_MOVED 20 +#define SQLITE_FCNTL_SYNC 21 +#define SQLITE_FCNTL_COMMIT_PHASETWO 22 +#define SQLITE_FCNTL_WIN32_SET_HANDLE 23 +#define SQLITE_FCNTL_WAL_BLOCK 24 +#define SQLITE_FCNTL_ZIPVFS 25 +#define SQLITE_FCNTL_RBU 26 +#define SQLITE_FCNTL_VFS_POINTER 27 +#define SQLITE_FCNTL_JOURNAL_POINTER 28 +#define SQLITE_FCNTL_WIN32_GET_HANDLE 29 + +/* deprecated names */ +#define SQLITE_GET_LOCKPROXYFILE SQLITE_FCNTL_GET_LOCKPROXYFILE +#define SQLITE_SET_LOCKPROXYFILE SQLITE_FCNTL_SET_LOCKPROXYFILE +#define SQLITE_LAST_ERRNO SQLITE_FCNTL_LAST_ERRNO + + +/* +** 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 +** at the internal representation of an [sqlite3_mutex]. It only +** deals with pointers to the [sqlite3_mutex] object. +** +** Mutexes are created using [sqlite3_mutex_alloc()]. +*/ +typedef struct sqlite3_mutex sqlite3_mutex; + +/* +** CAPI3REF: Loadable Extension Thunk +** +** A pointer to the opaque sqlite3_api_routines structure is passed as +** the third parameter to entry points of [loadable extensions]. This +** structure must be typedefed in order to work around compiler warnings +** on some platforms. +*/ +typedef struct sqlite3_api_routines sqlite3_api_routines; + +/* +** 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" +** in the name of the object stands for "virtual file system". See +** the [VFS | VFS documentation] for further information. +** +** The value of the iVersion field is initially 1 but may be larger in +** future versions of SQLite. Additional fields may be appended to this +** object when the iVersion value is increased. Note that the structure +** of the sqlite3_vfs object changes in the transaction between +** SQLite version 3.5.9 and 3.6.0 and yet the iVersion field was not +** modified. +** +** The szOsFile field is the size of the subclassed [sqlite3_file] +** structure used by this VFS. mxPathname is the maximum length of +** a pathname in this VFS. +** +** Registered sqlite3_vfs objects are kept on a linked list formed by +** the pNext pointer. The [sqlite3_vfs_register()] +** and [sqlite3_vfs_unregister()] interfaces manage this list +** in a thread-safe way. The [sqlite3_vfs_find()] interface +** searches the list. Neither the application code nor the VFS +** implementation should use the pNext pointer. +** +** The pNext field is the only field in the sqlite3_vfs +** structure that SQLite will ever modify. SQLite will only access +** or modify this field while holding a particular static mutex. +** The application should never modify anything within the sqlite3_vfs +** object once the object has been registered. +** +** The zName field holds the name of the VFS module. The name must +** be unique across all VFS modules. +** +** [[sqlite3_vfs.xOpen]] +** ^SQLite guarantees that the zFilename parameter to xOpen +** is either a NULL pointer or string obtained +** from xFullPathname() with an optional suffix added. +** ^If a suffix is added to the zFilename parameter, it will +** consist of a single "-" character followed by no more than +** 11 alphanumeric and/or "-" characters. +** ^SQLite further guarantees that +** the string will be valid and unchanged until xClose() is +** called. Because of the previous sentence, +** the [sqlite3_file] can safely store a pointer to the +** filename if it needs to remember the filename for some reason. +** If the zFilename parameter to xOpen is a NULL pointer then xOpen +** must invent its own temporary name for the file. ^Whenever the +** xFilename parameter is NULL it will also be the case that the +** flags parameter will include [SQLITE_OPEN_DELETEONCLOSE]. +** +** The flags argument to xOpen() includes all bits set in +** the flags argument to [sqlite3_open_v2()]. Or if [sqlite3_open()] +** or [sqlite3_open16()] is used, then flags includes at least +** [SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE]. +** If xOpen() opens a file read-only then it sets *pOutFlags to +** include [SQLITE_OPEN_READONLY]. Other bits in *pOutFlags may be set. +** +** ^(SQLite will also add one of the following flags to the xOpen() +** call, depending on the object being opened: +** +**
        +**
      • [SQLITE_OPEN_MAIN_DB] +**
      • [SQLITE_OPEN_MAIN_JOURNAL] +**
      • [SQLITE_OPEN_TEMP_DB] +**
      • [SQLITE_OPEN_TEMP_JOURNAL] +**
      • [SQLITE_OPEN_TRANSIENT_DB] +**
      • [SQLITE_OPEN_SUBJOURNAL] +**
      • [SQLITE_OPEN_MASTER_JOURNAL] +**
      • [SQLITE_OPEN_WAL] +**
      )^ +** +** The file I/O implementation can use the object type flags to +** change the way it deals with files. For example, an application +** that does not care about crash recovery or rollback might make +** the open of a journal file a no-op. Writes to this journal would +** also be no-ops, and any attempt to read the journal would return +** SQLITE_IOERR. Or the implementation might recognize that a database +** file will be doing page-aligned sector reads and writes in a random +** order and set up its I/O subsystem accordingly. +** +** SQLite might also add one of the following flags to the xOpen method: +** +**
        +**
      • [SQLITE_OPEN_DELETEONCLOSE] +**
      • [SQLITE_OPEN_EXCLUSIVE] +**
      +** +** The [SQLITE_OPEN_DELETEONCLOSE] flag means the file should be +** deleted when it is closed. ^The [SQLITE_OPEN_DELETEONCLOSE] +** will be set for TEMP databases and their journals, transient +** databases, and subjournals. +** +** ^The [SQLITE_OPEN_EXCLUSIVE] flag is always used in conjunction +** with the [SQLITE_OPEN_CREATE] flag, which are both directly +** analogous to the O_EXCL and O_CREAT flags of the POSIX open() +** API. The SQLITE_OPEN_EXCLUSIVE flag, when paired with the +** SQLITE_OPEN_CREATE, is used to indicate that file should always +** be created, and that it is an error if it already exists. +** It is not used to indicate the file should be opened +** for exclusive access. +** +** ^At least szOsFile bytes of memory are allocated by SQLite +** to hold the [sqlite3_file] structure passed as the third +** argument to xOpen. The xOpen method does not have to +** allocate the structure; it should just fill it in. Note that +** the xOpen method must set the sqlite3_file.pMethods to either +** a valid [sqlite3_io_methods] object or to NULL. xOpen must do +** this even if the open fails. SQLite expects that the sqlite3_file.pMethods +** element will be valid after xOpen returns regardless of the success +** or failure of the xOpen call. +** +** [[sqlite3_vfs.xAccess]] +** ^The flags argument to xAccess() may be [SQLITE_ACCESS_EXISTS] +** to test for the existence of a file, or [SQLITE_ACCESS_READWRITE] to +** test whether a file is readable and writable, or [SQLITE_ACCESS_READ] +** to test whether a file is at least readable. The file can be a +** directory. +** +** ^SQLite will always allocate at least mxPathname+1 bytes for the +** output buffer xFullPathname. The exact size of the output buffer +** is also passed as a parameter to both methods. If the output buffer +** is not large enough, [SQLITE_CANTOPEN] should be returned. Since this is +** handled as a fatal error by SQLite, vfs implementations should endeavor +** to prevent this by setting mxPathname to a sufficiently large value. +** +** The xRandomness(), xSleep(), xCurrentTime(), and xCurrentTimeInt64() +** interfaces are not strictly a part of the filesystem, but they are +** included in the VFS structure for completeness. +** The xRandomness() function attempts to return nBytes bytes +** of good-quality randomness into zOut. The return value is +** the actual number of bytes of randomness obtained. +** The xSleep() method causes the calling thread to sleep for at +** least the number of microseconds given. ^The xCurrentTime() +** method returns a Julian Day Number for the current date and time as +** a floating point value. +** ^The xCurrentTimeInt64() method returns, as an integer, the Julian +** Day Number multiplied by 86400000 (the number of milliseconds in +** a 24-hour day). +** ^SQLite will use the xCurrentTimeInt64() method to get the current +** date and time if that method is available (if iVersion is 2 or +** greater and the function pointer is not NULL) and will fall back +** to xCurrentTime() if xCurrentTimeInt64() is unavailable. +** +** ^The xSetSystemCall(), xGetSystemCall(), and xNestSystemCall() interfaces +** are not used by the SQLite core. These optional interfaces are provided +** by some VFSes to facilitate testing of the VFS code. By overriding +** system calls with functions under its control, a test program can +** simulate faults and error conditions that would otherwise be difficult +** or impossible to induce. The set of system calls that can be overridden +** varies from one VFS to another, and from one version of the same VFS to the +** next. Applications that use these interfaces must be prepared for any +** or all of these interfaces to be NULL or for their behavior to change +** from one release to the next. Applications must not attempt to access +** any of these methods if the iVersion of the VFS is less than 3. +*/ +typedef struct sqlite3_vfs sqlite3_vfs; +typedef void (*sqlite3_syscall_ptr)(void); +struct sqlite3_vfs { + int iVersion; /* Structure version number (currently 3) */ + int szOsFile; /* Size of subclassed sqlite3_file */ + int mxPathname; /* Maximum file pathname length */ + sqlite3_vfs *pNext; /* Next registered VFS */ + const char *zName; /* Name of this virtual file system */ + void *pAppData; /* Pointer to application-specific data */ + int (*xOpen)(sqlite3_vfs*, const char *zName, sqlite3_file*, + int flags, int *pOutFlags); + int (*xDelete)(sqlite3_vfs*, const char *zName, int syncDir); + int (*xAccess)(sqlite3_vfs*, const char *zName, int flags, int *pResOut); + int (*xFullPathname)(sqlite3_vfs*, const char *zName, int nOut, char *zOut); + void *(*xDlOpen)(sqlite3_vfs*, const char *zFilename); + void (*xDlError)(sqlite3_vfs*, int nByte, char *zErrMsg); + void (*(*xDlSym)(sqlite3_vfs*,void*, const char *zSymbol))(void); + void (*xDlClose)(sqlite3_vfs*, void*); + int (*xRandomness)(sqlite3_vfs*, int nByte, char *zOut); + int (*xSleep)(sqlite3_vfs*, int microseconds); + int (*xCurrentTime)(sqlite3_vfs*, double*); + int (*xGetLastError)(sqlite3_vfs*, int, char *); + /* + ** The methods above are in version 1 of the sqlite_vfs object + ** definition. Those that follow are added in version 2 or later + */ + int (*xCurrentTimeInt64)(sqlite3_vfs*, sqlite3_int64*); + /* + ** The methods above are in versions 1 and 2 of the sqlite_vfs object. + ** Those below are for version 3 and greater. + */ + int (*xSetSystemCall)(sqlite3_vfs*, const char *zName, sqlite3_syscall_ptr); + sqlite3_syscall_ptr (*xGetSystemCall)(sqlite3_vfs*, const char *zName); + const char *(*xNextSystemCall)(sqlite3_vfs*, const char *zName); + /* + ** The methods above are in versions 1 through 3 of the sqlite_vfs object. + ** New fields may be appended in future versions. The iVersion + ** value will increment whenever this happens. + */ +}; + +/* +** 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. 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. +** With SQLITE_ACCESS_READWRITE, the xAccess method +** checks whether the named directory is both readable and writable +** (in other words, if files can be added, removed, and renamed within +** the directory). +** The SQLITE_ACCESS_READWRITE constant is currently used only by the +** [temp_store_directory pragma], though this could change in a future +** release of SQLite. +** With SQLITE_ACCESS_READ, the xAccess method +** checks whether the file is readable. The SQLITE_ACCESS_READ constant is +** currently unused, though it might be used in a future release of +** SQLite. +*/ +#define SQLITE_ACCESS_EXISTS 0 +#define SQLITE_ACCESS_READWRITE 1 /* Used by PRAGMA temp_store_directory */ +#define SQLITE_ACCESS_READ 2 /* Unused */ + +/* +** CAPI3REF: Flags for the xShmLock VFS method +** +** These integer constants define the various locking operations +** allowed by the xShmLock method of [sqlite3_io_methods]. The +** following are the only legal combinations of flags to the +** xShmLock method: +** +**
        +**
      • SQLITE_SHM_LOCK | SQLITE_SHM_SHARED +**
      • SQLITE_SHM_LOCK | SQLITE_SHM_EXCLUSIVE +**
      • SQLITE_SHM_UNLOCK | SQLITE_SHM_SHARED +**
      • SQLITE_SHM_UNLOCK | SQLITE_SHM_EXCLUSIVE +**
      +** +** When unlocking, the same SHARED or EXCLUSIVE flag must be supplied as +** was given on the corresponding lock. +** +** The xShmLock method can transition between unlocked and SHARED or +** between unlocked and EXCLUSIVE. It cannot transition between SHARED +** and EXCLUSIVE. +*/ +#define SQLITE_SHM_UNLOCK 1 +#define SQLITE_SHM_LOCK 2 +#define SQLITE_SHM_SHARED 4 +#define SQLITE_SHM_EXCLUSIVE 8 + +/* +** CAPI3REF: Maximum xShmLock index +** +** The xShmLock method on [sqlite3_io_methods] may use values +** between 0 and this upper bound as its "offset" argument. +** The SQLite core will never attempt to acquire or release a +** lock outside of this range +*/ +#define SQLITE_SHM_NLOCK 8 + + +/* +** CAPI3REF: Initialize The SQLite Library +** +** ^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 +** of sqlite3_initialize() does any initialization. All other calls +** 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 +** an effective call to sqlite3_shutdown() does any deinitialization. +** 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() 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 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 +** 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] +** 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, +** it is recommended that applications always invoke sqlite3_initialize() +** directly prior to using any other SQLite interface. Future releases +** of SQLite may require this. In other words, the behavior exhibited +** when SQLite is compiled with [SQLITE_OMIT_AUTOINIT] might become the +** default behavior in some future release of SQLite. +** +** The sqlite3_os_init() routine does operating-system specific +** initialization of the SQLite library. The sqlite3_os_end() +** routine undoes the effect of sqlite3_os_init(). Typical tasks +** performed by these routines include allocation or deallocation +** of static resources, initialization of global variables, +** setting up a default [sqlite3_vfs] module, or setting up +** a default configuration using [sqlite3_config()]. +** +** The application should never invoke either sqlite3_os_init() +** or sqlite3_os_end() directly. The application should only invoke +** sqlite3_initialize() and sqlite3_shutdown(). The sqlite3_os_init() +** interface is called automatically by sqlite3_initialize() and +** sqlite3_os_end() is called by sqlite3_shutdown(). Appropriate +** implementations for sqlite3_os_init() and sqlite3_os_end() +** are built into SQLite when it is compiled for Unix, Windows, or OS/2. +** When [custom builds | built for other platforms] +** (using the [SQLITE_OS_OTHER=1] compile-time +** option) the application must supply a suitable implementation for +** sqlite3_os_init() and sqlite3_os_end(). An application-supplied +** implementation of sqlite3_os_init() or sqlite3_os_end() +** must return [SQLITE_OK] on success and some other [error code] upon +** failure. +*/ +SQLITE_API int sqlite3_initialize(void); +SQLITE_API int sqlite3_shutdown(void); +SQLITE_API int sqlite3_os_init(void); +SQLITE_API int sqlite3_os_end(void); + +/* +** CAPI3REF: Configuring The SQLite Library +** +** The sqlite3_config() interface is used to make global configuration +** changes to SQLite in order to tune SQLite to the specific needs of +** the application. The default configuration is recommended for most +** applications and so this routine is usually not necessary. It is +** provided to support rare applications with unusual needs. +** +** The sqlite3_config() interface is not threadsafe. The application +** must ensure that no other SQLite interfaces are invoked by other +** threads while sqlite3_config() is running. +** +** The sqlite3_config() interface +** may only be invoked prior to library initialization using +** [sqlite3_initialize()] or after shutdown by [sqlite3_shutdown()]. +** ^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 +** [configuration option] that determines +** what property of SQLite is to be configured. Subsequent arguments +** vary depending on the [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 +** then this routine returns a non-zero [error code]. +*/ +SQLITE_API int sqlite3_config(int, ...); + +/* +** CAPI3REF: Configure database connections +** METHOD: sqlite3 +** +** 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 second argument to sqlite3_db_config(D,V,...) is the +** [SQLITE_DBCONFIG_LOOKASIDE | configuration verb] - an integer code +** that indicates what aspect of the [database connection] is being configured. +** Subsequent arguments vary depending on the configuration verb. +** +** ^Calls to sqlite3_db_config() return SQLITE_OK if and only if +** the call is considered successful. +*/ +SQLITE_API int sqlite3_db_config(sqlite3*, int op, ...); + +/* +** CAPI3REF: Memory Allocation Routines +** +** An instance of this object defines the interface between SQLite +** and low-level memory allocation routines. +** +** This object is used in only one place in the SQLite interface. +** A pointer to an instance of this object is the argument to +** [sqlite3_config()] when the configuration option is +** [SQLITE_CONFIG_MALLOC] or [SQLITE_CONFIG_GETMALLOC]. +** By creating an instance of this object +** and passing it to [sqlite3_config]([SQLITE_CONFIG_MALLOC]) +** during configuration, an application can specify an alternative +** memory allocation subsystem for SQLite to use for all of its +** dynamic memory needs. +** +** Note that SQLite comes with several [built-in memory allocators] +** that are perfectly adequate for the overwhelming majority of applications +** and that this object is only useful to a tiny minority of applications +** with specialized memory allocation requirements. This object is +** also used during testing of SQLite in order to specify an alternative +** memory allocator that simulates memory out-of-memory conditions in +** order to verify that SQLite recovers gracefully from such +** conditions. +** +** The xMalloc, xRealloc, and xFree methods must work like the +** malloc(), realloc() and free() functions from the standard C library. +** ^SQLite guarantees that the second argument to +** xRealloc is always a value returned by a prior call to xRoundup. +** +** xSize should return the allocated size of a memory allocation +** previously obtained from xMalloc or xRealloc. The allocated size +** is always at least as big as the requested size but may be larger. +** +** The xRoundup method returns what would be the allocated size of +** a memory allocation given a particular requested size. Most memory +** allocators round up memory allocations at least to the next multiple +** of 8. Some allocators round up to a larger multiple or to a power of 2. +** Every memory allocation request coming in through [sqlite3_malloc()] +** or [sqlite3_realloc()] first calls xRoundup. If xRoundup returns 0, +** that causes the corresponding memory allocation to fail. +** +** The xInit method initializes the memory allocator. For example, +** it might allocate any require mutexes or initialize internal data +** structures. The xShutdown method is invoked (indirectly) by +** [sqlite3_shutdown()] and should deallocate any resources acquired +** by xInit. The pAppData pointer is used as the only parameter to +** xInit and xShutdown. +** +** SQLite holds the [SQLITE_MUTEX_STATIC_MASTER] 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. For all other methods, SQLite +** holds the [SQLITE_MUTEX_STATIC_MEM] mutex as long as the +** [SQLITE_CONFIG_MEMSTATUS] configuration option is turned on (which +** it is by default) and so the methods are automatically serialized. +** However, if [SQLITE_CONFIG_MEMSTATUS] is disabled, then the other +** methods must be threadsafe or else make their own arrangements for +** serialization. +** +** SQLite will never invoke xInit() more than once without an intervening +** call to xShutdown(). +*/ +typedef struct sqlite3_mem_methods sqlite3_mem_methods; +struct sqlite3_mem_methods { + void *(*xMalloc)(int); /* Memory allocation function */ + void (*xFree)(void*); /* Free a prior allocation */ + void *(*xRealloc)(void*,int); /* Resize an allocation */ + int (*xSize)(void*); /* Return the size of an allocation */ + int (*xRoundup)(int); /* Round up request size to allocation size */ + int (*xInit)(void*); /* Initialize the memory allocator */ + void (*xShutdown)(void*); /* Deinitialize the memory allocator */ + void *pAppData; /* Argument to xInit() and xShutdown() */ +}; + +/* +** CAPI3REF: Configuration Options +** KEYWORDS: {configuration option} +** +** These constants are the available integer configuration options that +** can be passed as the first argument to the [sqlite3_config()] interface. +** +** 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_config()] to make sure that +** the call worked. The [sqlite3_config()] interface will return a +** non-zero [error code] if a discontinued or unsupported configuration option +** is invoked. +** +**
      +** [[SQLITE_CONFIG_SINGLETHREAD]]
      SQLITE_CONFIG_SINGLETHREAD
      +**
      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. ^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]]
      SQLITE_CONFIG_MULTITHREAD
      +**
      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. ^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]]
      SQLITE_CONFIG_SERIALIZED
      +**
      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 +** [SQLITE_THREADSAFE=1]) the SQLite library will itself serialize access +** 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. +** ^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]]
      SQLITE_CONFIG_MALLOC
      +**
      ^(The SQLITE_CONFIG_MALLOC 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.)^ ^SQLite makes +** its own private copy of the content of the [sqlite3_mem_methods] structure +** before the [sqlite3_config()] call returns.
      +** +** [[SQLITE_CONFIG_GETMALLOC]]
      SQLITE_CONFIG_GETMALLOC
      +**
      ^(The SQLITE_CONFIG_GETMALLOC 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.)^ +** 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.
      +** +** [[SQLITE_CONFIG_MEMSTATUS]]
      SQLITE_CONFIG_MEMSTATUS
      +**
      ^The SQLITE_CONFIG_MEMSTATUS option takes single argument of type int, +** interpreted as a boolean, which enables or disables the collection of +** memory allocation statistics. ^(When memory allocation statistics are +** disabled, the following SQLite interfaces become non-operational: +**
        +**
      • [sqlite3_memory_used()] +**
      • [sqlite3_memory_highwater()] +**
      • [sqlite3_soft_heap_limit64()] +**
      • [sqlite3_status64()] +**
      )^ +** ^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]]
      SQLITE_CONFIG_SCRATCH
      +**
      ^The SQLITE_CONFIG_SCRATCH option specifies a static memory buffer +** that SQLite can use for scratch memory. ^(There are three arguments +** to SQLITE_CONFIG_SCRATCH: A pointer an 8-byte +** aligned memory buffer from which the scratch allocations will be +** drawn, the size of each scratch allocation (sz), +** and the maximum number of scratch allocations (N).)^ +** The first argument must be a pointer to an 8-byte aligned buffer +** of at least sz*N bytes of memory. +** ^SQLite will not use more than one scratch buffers per thread. +** ^SQLite will never request 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.

      +** ^When the application provides any amount of scratch memory using +** SQLITE_CONFIG_SCRATCH, SQLite avoids unnecessary large +** [sqlite3_malloc|heap allocations]. +** This can help [Robson proof|prevent memory allocation failures] due to heap +** fragmentation in low-memory embedded systems. +**

      +** +** [[SQLITE_CONFIG_PAGECACHE]]
      SQLITE_CONFIG_PAGECACHE
      +**
      ^The SQLITE_CONFIG_PAGECACHE option specifies a memory pool +** that SQLite can use for the database page cache with the default page +** cache implementation. +** This configuration option is a no-op if an application-define page +** cache implementation is loaded using the [SQLITE_CONFIG_PCACHE2]. +** ^There are three arguments to SQLITE_CONFIG_PAGECACHE: A pointer to +** 8-byte aligned memory (pMem), the size of each page cache line (sz), +** and the number of cache lines (N). +** The sz argument should be the size of the largest database page +** (a power of two between 512 and 65536) plus some extra bytes for each +** page header. ^The number of extra bytes needed by the page header +** can be determined using [SQLITE_CONFIG_PCACHE_HDRSZ]. +** ^It is harmless, apart from the wasted memory, +** for the sz parameter to be larger than necessary. The pMem +** argument must be either a NULL pointer or a pointer to an 8-byte +** aligned block of memory of at least sz*N bytes, otherwise +** subsequent behavior is undefined. +** ^When pMem is not NULL, SQLite will strive to use the memory provided +** to satisfy page cache needs, falling back to [sqlite3_malloc()] if +** a page cache line is larger than sz bytes or if all of the pMem buffer +** is exhausted. +** ^If pMem is NULL and N is non-zero, then each database connection +** does an initial bulk allocation for page cache memory +** from [sqlite3_malloc()] sufficient for N cache lines if N is positive or +** of -1024*N bytes if N is negative, . ^If additional +** page cache memory is needed beyond what is provided by the initial +** allocation, then SQLite goes to [sqlite3_malloc()] separately for each +** additional cache line.
      +** +** [[SQLITE_CONFIG_HEAP]]
      SQLITE_CONFIG_HEAP
      +**
      ^The SQLITE_CONFIG_HEAP 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]. +** ^The SQLITE_CONFIG_HEAP option is only available if SQLite is compiled +** with either [SQLITE_ENABLE_MEMSYS3] or [SQLITE_ENABLE_MEMSYS5] and returns +** [SQLITE_ERROR] if invoked otherwise. +** ^There are three arguments to SQLITE_CONFIG_HEAP: +** 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 +** to using its default memory allocator (the system malloc() implementation), +** undoing any prior invocation of [SQLITE_CONFIG_MALLOC]. ^If the +** memory pointer is not NULL then the alternative memory +** allocator is engaged to handle all of SQLites memory allocation needs. +** The first pointer (the memory pointer) must be aligned to an 8-byte +** boundary or subsequent behavior of SQLite will be undefined. +** The minimum allocation size is capped at 2**12. Reasonable values +** for the minimum allocation size are 2**5 through 2**8.
      +** +** [[SQLITE_CONFIG_MUTEX]]
      SQLITE_CONFIG_MUTEX
      +**
      ^(The SQLITE_CONFIG_MUTEX 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.)^ ^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]]
      SQLITE_CONFIG_GETMUTEX
      +**
      ^(The SQLITE_CONFIG_GETMUTEX 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.)^ +** 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. ^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]]
      SQLITE_CONFIG_LOOKASIDE
      +**
      ^(The SQLITE_CONFIG_LOOKASIDE option takes two arguments that determine +** the default size of lookaside memory 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.)^ ^(SQLITE_CONFIG_LOOKASIDE +** sets the default lookaside size. The [SQLITE_DBCONFIG_LOOKASIDE] +** option to [sqlite3_db_config()] can be used to change the lookaside +** configuration on individual connections.)^
      +** +** [[SQLITE_CONFIG_PCACHE2]]
      SQLITE_CONFIG_PCACHE2
      +**
      ^(The SQLITE_CONFIG_PCACHE2 option takes a single argument which is +** a pointer to an [sqlite3_pcache_methods2] object. This object specifies +** the interface to a custom page cache implementation.)^ +** ^SQLite makes a copy of the [sqlite3_pcache_methods2] object.
      +** +** [[SQLITE_CONFIG_GETPCACHE2]]
      SQLITE_CONFIG_GETPCACHE2
      +**
      ^(The SQLITE_CONFIG_GETPCACHE2 option takes a single argument which +** is a pointer to an [sqlite3_pcache_methods2] object. SQLite copies of +** the current page cache implementation into that object.)^
      +** +** [[SQLITE_CONFIG_LOG]]
      SQLITE_CONFIG_LOG
      +**
      The SQLITE_CONFIG_LOG option is used to configure the SQLite +** global [error log]. +** (^The SQLITE_CONFIG_LOG option takes two arguments: a pointer to a +** function with a call signature of void(*)(void*,int,const char*), +** and a pointer to void. ^If the function pointer is not NULL, it is +** invoked by [sqlite3_log()] to process each logging event. ^If the +** function pointer is NULL, the [sqlite3_log()] interface becomes a no-op. +** ^The void pointer that is the second argument to SQLITE_CONFIG_LOG is +** passed through as the first parameter to the application-defined logger +** function whenever that function is invoked. ^The second parameter to +** the logger function is a copy of the first parameter to the corresponding +** [sqlite3_log()] call and is intended to be a [result code] or an +** [extended result code]. ^The third parameter passed to the logger is +** log message after formatting via [sqlite3_snprintf()]. +** The SQLite logging interface is not reentrant; the logger function +** supplied by the application must not invoke any SQLite interface. +** In a multi-threaded application, the application-defined logger +** function must be threadsafe.
      +** +** [[SQLITE_CONFIG_URI]]
      SQLITE_CONFIG_URI +**
      ^(The SQLITE_CONFIG_URI option takes a single argument of type int. +** If non-zero, then URI handling is globally enabled. If the parameter is zero, +** then URI handling is globally disabled.)^ ^If URI handling is globally +** enabled, all filenames passed to [sqlite3_open()], [sqlite3_open_v2()], +** [sqlite3_open16()] or +** specified as part of [ATTACH] commands are interpreted as URIs, regardless +** of whether or not the [SQLITE_OPEN_URI] flag is set when the database +** connection is opened. ^If it is globally disabled, filenames are +** only interpreted as URIs if the SQLITE_OPEN_URI flag is set when the +** database connection is opened. ^(By default, URI handling is globally +** disabled. The default value may be changed by compiling with the +** [SQLITE_USE_URI] symbol defined.)^ +** +** [[SQLITE_CONFIG_COVERING_INDEX_SCAN]]
      SQLITE_CONFIG_COVERING_INDEX_SCAN +**
      ^The SQLITE_CONFIG_COVERING_INDEX_SCAN option takes a single integer +** argument which is interpreted as a boolean in order to enable or disable +** the use of covering indices for full table scans in the query optimizer. +** ^The default setting is determined +** by the [SQLITE_ALLOW_COVERING_INDEX_SCAN] compile-time option, or is "on" +** if that compile-time option is omitted. +** The ability to disable the use of covering indices for full table scans +** is because some incorrectly coded legacy applications might malfunction +** when the optimization is enabled. Providing the ability to +** disable the optimization allows the older, buggy application code to work +** without change even with newer versions of SQLite. +** +** [[SQLITE_CONFIG_PCACHE]] [[SQLITE_CONFIG_GETPCACHE]] +**
      SQLITE_CONFIG_PCACHE and SQLITE_CONFIG_GETPCACHE +**
      These options are obsolete and should not be used by new code. +** They are retained for backwards compatibility but are now no-ops. +**
      +** +** [[SQLITE_CONFIG_SQLLOG]] +**
      SQLITE_CONFIG_SQLLOG +**
      This option is only available if sqlite is compiled with the +** [SQLITE_ENABLE_SQLLOG] pre-processor macro defined. The first argument should +** be a pointer to a function of type void(*)(void*,sqlite3*,const char*, int). +** The second should be of type (void*). The callback is invoked by the library +** in three separate circumstances, identified by the value passed as the +** fourth parameter. If the fourth parameter is 0, then the database connection +** passed as the second argument has just been opened. The third argument +** points to a buffer containing the name of the main database file. If the +** fourth parameter is 1, then the SQL statement that the third parameter +** points to has just been executed. Or, if the fourth parameter is 2, then +** the connection being passed as the second parameter is being closed. The +** third parameter is passed NULL In this case. An example of using this +** configuration option can be seen in the "test_sqllog.c" source file in +** the canonical SQLite source tree.
      +** +** [[SQLITE_CONFIG_MMAP_SIZE]] +**
      SQLITE_CONFIG_MMAP_SIZE +**
      ^SQLITE_CONFIG_MMAP_SIZE takes two 64-bit integer (sqlite3_int64) values +** that are the default mmap size limit (the default setting for +** [PRAGMA mmap_size]) and the maximum allowed mmap size limit. +** ^The default setting can be overridden by each database connection using +** either the [PRAGMA mmap_size] command, or by using the +** [SQLITE_FCNTL_MMAP_SIZE] file control. ^(The maximum allowed mmap size +** will be silently truncated if necessary so that it does not exceed the +** compile-time maximum mmap size set by the +** [SQLITE_MAX_MMAP_SIZE] compile-time option.)^ +** ^If either argument to this option is negative, then that argument is +** changed to its compile-time default. +** +** [[SQLITE_CONFIG_WIN32_HEAPSIZE]] +**
      SQLITE_CONFIG_WIN32_HEAPSIZE +**
      ^The SQLITE_CONFIG_WIN32_HEAPSIZE option is only available if SQLite is +** compiled for Windows with the [SQLITE_WIN32_MALLOC] pre-processor macro +** defined. ^SQLITE_CONFIG_WIN32_HEAPSIZE takes a 32-bit unsigned integer value +** that specifies the maximum size of the created heap. +** +** [[SQLITE_CONFIG_PCACHE_HDRSZ]] +**
      SQLITE_CONFIG_PCACHE_HDRSZ +**
      ^The SQLITE_CONFIG_PCACHE_HDRSZ option takes a single parameter which +** is a pointer to an integer and writes into that integer the number of extra +** bytes per page required for each page in [SQLITE_CONFIG_PAGECACHE]. +** The amount of extra space required can change depending on the compiler, +** target platform, and SQLite version. +** +** [[SQLITE_CONFIG_PMASZ]] +**
      SQLITE_CONFIG_PMASZ +**
      ^The SQLITE_CONFIG_PMASZ option takes a single parameter which +** is an unsigned integer and sets the "Minimum PMA Size" for the multithreaded +** sorter to that integer. The default minimum PMA Size is set by the +** [SQLITE_SORTER_PMASZ] compile-time option. New threads are launched +** to help with sort operations when multithreaded sorting +** is enabled (using the [PRAGMA threads] command) and the amount of content +** to be sorted exceeds the page size times the minimum of the +** [PRAGMA cache_size] setting and this value. +** +** [[SQLITE_CONFIG_STMTJRNL_SPILL]] +**
      SQLITE_CONFIG_STMTJRNL_SPILL +**
      ^The SQLITE_CONFIG_STMTJRNL_SPILL option takes a single parameter which +** becomes the [statement journal] spill-to-disk threshold. +** [Statement journals] are held in memory until their size (in bytes) +** exceeds this threshold, at which point they are written to disk. +** Or if the threshold is -1, statement journals are always held +** exclusively in memory. +** Since many statement journals never become large, setting the spill +** threshold to a value such as 64KiB can greatly reduce the amount of +** I/O required to support statement rollback. +** The default value for this setting is controlled by the +** [SQLITE_STMTJRNL_SPILL] compile-time option. +**
      +*/ +#define SQLITE_CONFIG_SINGLETHREAD 1 /* nil */ +#define SQLITE_CONFIG_MULTITHREAD 2 /* nil */ +#define SQLITE_CONFIG_SERIALIZED 3 /* nil */ +#define SQLITE_CONFIG_MALLOC 4 /* sqlite3_mem_methods* */ +#define SQLITE_CONFIG_GETMALLOC 5 /* sqlite3_mem_methods* */ +#define SQLITE_CONFIG_SCRATCH 6 /* void*, int sz, int N */ +#define SQLITE_CONFIG_PAGECACHE 7 /* void*, int sz, int N */ +#define SQLITE_CONFIG_HEAP 8 /* void*, int nByte, int min */ +#define SQLITE_CONFIG_MEMSTATUS 9 /* boolean */ +#define SQLITE_CONFIG_MUTEX 10 /* sqlite3_mutex_methods* */ +#define SQLITE_CONFIG_GETMUTEX 11 /* sqlite3_mutex_methods* */ +/* previously SQLITE_CONFIG_CHUNKALLOC 12 which is now unused. */ +#define SQLITE_CONFIG_LOOKASIDE 13 /* int int */ +#define SQLITE_CONFIG_PCACHE 14 /* no-op */ +#define SQLITE_CONFIG_GETPCACHE 15 /* no-op */ +#define SQLITE_CONFIG_LOG 16 /* xFunc, void* */ +#define SQLITE_CONFIG_URI 17 /* int */ +#define SQLITE_CONFIG_PCACHE2 18 /* sqlite3_pcache_methods2* */ +#define SQLITE_CONFIG_GETPCACHE2 19 /* sqlite3_pcache_methods2* */ +#define SQLITE_CONFIG_COVERING_INDEX_SCAN 20 /* int */ +#define SQLITE_CONFIG_SQLLOG 21 /* xSqllog, void* */ +#define SQLITE_CONFIG_MMAP_SIZE 22 /* sqlite3_int64, sqlite3_int64 */ +#define SQLITE_CONFIG_WIN32_HEAPSIZE 23 /* int nByte */ +#define SQLITE_CONFIG_PCACHE_HDRSZ 24 /* int *psz */ +#define SQLITE_CONFIG_PMASZ 25 /* unsigned int szPma */ +#define SQLITE_CONFIG_STMTJRNL_SPILL 26 /* int nByte */ + +/* +** CAPI3REF: Database Connection Configuration Options +** +** These constants are the available integer configuration options that +** can be passed as the second argument to the [sqlite3_db_config()] interface. +** +** 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 +** 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 +** [lookaside memory allocator] configuration for the [database connection]. +** ^The first argument (the third parameter to [sqlite3_db_config()] is a +** pointer to a memory buffer to use for lookaside memory. +** ^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 to +** SQLITE_DBCONFIG_LOOKASIDE is not a multiple of 8, it is internally +** rounded down to the next smaller multiple of 8. ^(The lookaside memory +** configuration for a database connection can only be changed when that +** connection is not currently using lookaside memory, or in other words +** when the "current value" returned by +** [sqlite3_db_status](D,[SQLITE_CONFIG_LOOKASIDE],...) is zero. +** Any attempt to change the lookaside memory configuration when lookaside +** memory is in use leaves the configuration unchanged and returns +** [SQLITE_BUSY].)^
      +** +**
      SQLITE_DBCONFIG_ENABLE_FKEY
      +**
      ^This option is used to enable or disable the enforcement of +** [foreign key constraints]. There should be two additional arguments. +** The first argument is an integer which is 0 to disable FK enforcement, +** positive to enable FK enforcement or negative to leave FK enforcement +** unchanged. The second parameter is a pointer to an integer into which +** is written 0 or 1 to indicate whether FK enforcement is off or on +** following this call. The second parameter may be a NULL pointer, in +** which case the FK enforcement setting is not reported back.
      +** +**
      SQLITE_DBCONFIG_ENABLE_TRIGGER
      +**
      ^This option is used to enable or disable [CREATE TRIGGER | triggers]. +** There should be two additional arguments. +** The first argument is an integer which is 0 to disable triggers, +** positive to enable triggers or negative to leave the setting unchanged. +** The second parameter is a pointer to an integer into which +** is written 0 or 1 to indicate whether triggers are disabled or enabled +** following this call. The second parameter may be a NULL pointer, in +** which case the trigger setting is not reported back.
      +** +**
      SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER
      +**
      ^This option is used to enable or disable the two-argument +** version of the [fts3_tokenizer()] function which is part of the +** [FTS3] full-text search engine extension. +** There should be two additional arguments. +** The first argument is an integer which is 0 to disable fts3_tokenizer() or +** positive to enable fts3_tokenizer() or negative to leave the setting +** unchanged. +** The second parameter is a pointer to an integer into which +** is written 0 or 1 to indicate whether fts3_tokenizer is disabled or enabled +** following this call. The second parameter may be a NULL pointer, in +** which case the new setting is not reported back.
      +** +**
      SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION
      +**
      ^This option is used to enable or disable the [sqlite3_load_extension()] +** interface independently of the [load_extension()] SQL function. +** The [sqlite3_enable_load_extension()] API enables or disables both the +** C-API [sqlite3_load_extension()] and the SQL function [load_extension()]. +** There should be two additional arguments. +** When the first argument to this interface is 1, then only the C-API is +** enabled and the SQL function remains disabled. If the first argument to +** this interface is 0, then both the C-API and the SQL function are disabled. +** If the first argument is -1, then no changes are made to state of either the +** C-API or the SQL function. +** The second parameter is a pointer to an integer into which +** is written 0 or 1 to indicate whether [sqlite3_load_extension()] interface +** is disabled or enabled following this call. The second parameter may +** be a NULL pointer, in which case the new setting is not reported back. +**
      +** +**
      SQLITE_DBCONFIG_MAINDBNAME
      +**
      ^This option is used to change the name of the "main" database +** schema. ^The sole argument is a pointer to a constant UTF8 string +** which will become the new schema name in place of "main". ^SQLite +** does not make a copy of the new main schema name string, so the application +** must ensure that the argument passed into this DBCONFIG option is unchanged +** until after the database connection closes. +**
      +** +**
      +*/ +#define SQLITE_DBCONFIG_MAINDBNAME 1000 /* const char* */ +#define SQLITE_DBCONFIG_LOOKASIDE 1001 /* void* int int */ +#define SQLITE_DBCONFIG_ENABLE_FKEY 1002 /* int int* */ +#define SQLITE_DBCONFIG_ENABLE_TRIGGER 1003 /* int int* */ +#define SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER 1004 /* int int* */ +#define SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION 1005 /* int int* */ + + +/* +** CAPI3REF: Enable Or Disable Extended Result Codes +** METHOD: sqlite3 +** +** ^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 +** METHOD: sqlite3 +** +** ^Each entry in most SQLite tables (except for [WITHOUT ROWID] tables) +** 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 +** the table has a column of type [INTEGER PRIMARY KEY] then that column +** is another alias for the rowid. +** +** ^The sqlite3_last_insert_rowid(D) interface returns the [rowid] of the +** most recent successful [INSERT] into a rowid table or [virtual table] +** on database connection D. +** ^Inserts into [WITHOUT ROWID] tables are not recorded. +** ^If no successful [INSERT]s into rowid tables +** have ever occurred on the database connection D, +** then sqlite3_last_insert_rowid(D) returns zero. +** +** ^(If an [INSERT] occurs within a trigger or within a [virtual table] +** method, then this routine will return the [rowid] of the inserted +** row as long as the trigger or virtual table method is running. +** But once the trigger or virtual table method ends, the value returned +** by this routine reverts to what it was before the trigger or virtual +** table method began.)^ +** +** ^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, +** and INSERT OR ABORT make no changes to the return value of this +** 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.)^ +** +** ^For the purposes of this routine, an [INSERT] is considered to +** be successful even if it is subsequently rolled back. +** +** 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()] +** function is running and thus changes the last insert [rowid], +** then the value returned by [sqlite3_last_insert_rowid()] is +** unpredictable and might not equal either the old or the new +** last insert [rowid]. +*/ +SQLITE_API sqlite3_int64 sqlite3_last_insert_rowid(sqlite3*); + +/* +** CAPI3REF: Count The Number Of Rows Modified +** METHOD: sqlite3 +** +** ^This function returns the number of rows modified, inserted or +** deleted by the most recently completed INSERT, UPDATE or DELETE +** statement on the database connection specified by the only parameter. +** ^Executing any other type of SQL statement does not modify the value +** returned by this function. +** +** ^Only changes made directly by the INSERT, UPDATE or DELETE statement are +** considered - auxiliary changes caused by [CREATE TRIGGER | triggers], +** [foreign key actions] or [REPLACE] constraint resolution are not counted. +** +** Changes to a view that are intercepted by +** [INSTEAD OF trigger | INSTEAD OF triggers] are not counted. ^The value +** returned by sqlite3_changes() immediately after an INSERT, UPDATE or +** DELETE statement run on a view is always zero. Only changes made to real +** tables are counted. +** +** Things are more complicated if the sqlite3_changes() function is +** executed while a trigger program is running. This may happen if the +** program uses the [changes() SQL function], or if some other callback +** function invokes sqlite3_changes() directly. Essentially: +** +**
        +**
      • ^(Before entering a trigger program the value returned by +** sqlite3_changes() function is saved. After the trigger program +** has finished, the original value is restored.)^ +** +**
      • ^(Within a trigger program each INSERT, UPDATE and DELETE +** statement sets the value returned by sqlite3_changes() +** upon completion as normal. Of course, this value will not include +** any changes performed by sub-triggers, as the sqlite3_changes() +** value will be saved and restored after each sub-trigger has run.)^ +**
      +** +** ^This means that if the changes() SQL function (or similar) is used +** by the first INSERT, UPDATE or DELETE statement within a trigger, it +** returns the value as set when the calling statement began executing. +** ^If it is used by the second or subsequent such statement within a trigger +** program, the value returned reflects the number of rows modified by the +** previous INSERT, UPDATE or DELETE statement within the same trigger. +** +** 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 +** is unpredictable and not meaningful. +*/ +SQLITE_API int sqlite3_changes(sqlite3*); + +/* +** CAPI3REF: Total Number Of Rows Modified +** METHOD: sqlite3 +** +** ^This function returns the total number of rows inserted, modified or +** deleted by all [INSERT], [UPDATE] or [DELETE] statements completed +** since the database connection was opened, including those executed as +** part of trigger programs. ^Executing any other type of SQL statement +** does not affect the value returned by sqlite3_total_changes(). +** +** ^Changes made as part of [foreign key actions] are included in the +** count, but those made as part of REPLACE constraint resolution are +** not. ^Changes to a view that are intercepted by INSTEAD OF triggers +** are not counted. +** +** 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 +** returned is unpredictable and not meaningful. +*/ +SQLITE_API int sqlite3_total_changes(sqlite3*); + +/* +** CAPI3REF: Interrupt A Long-Running Query +** METHOD: sqlite3 +** +** ^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 +** 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 +** 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 +** 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 +** 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 +** 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 +** SQL statements is a no-op and has no effect on SQL statements +** that are started after the sqlite3_interrupt() call returns. +** +** 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 +** +** 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 +** 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 +** 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 +** and comments that follow the final semicolon are ignored. +** +** ^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 +** will not detect syntactically incorrect SQL. +** +** ^(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.)^ +** +** The input to [sqlite3_complete()] must be a zero-terminated +** UTF-8 string. +** +** The input to [sqlite3_complete16()] must be a zero-terminated +** UTF-16 string in native byte order. +*/ +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 +** KEYWORDS: {busy-handler callback} {busy handler} +** METHOD: sqlite3 +** +** ^The sqlite3_busy_handler(D,X,P) routine sets a callback function X +** that might be invoked with argument P whenever +** an attempt is made to access a database table associated with +** [database connection] D when another thread +** or process has the table locked. +** The sqlite3_busy_handler() interface is used to implement +** [sqlite3_busy_timeout()] and [PRAGMA busy_timeout]. +** +** ^If the busy callback is NULL, then [SQLITE_BUSY] +** 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 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 previously for the same locking event. ^If the +** busy callback returns 0, then no additional attempts are made to +** access the database and [SQLITE_BUSY] is returned +** to the application. +** ^If the callback returns non-zero, then another attempt +** is made to access the database 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 +** handler could result in a deadlock, it will go ahead and return [SQLITE_BUSY] +** to the application instead of invoking the +** busy handler. +** Consider a scenario where one process is holding a read lock that +** it is trying to promote to a reserved lock and +** a second process is holding a reserved lock that it is trying +** to promote to an exclusive lock. The first process cannot proceed +** because it is blocked by the second and the second process cannot +** proceed because it is blocked by the first. If both processes +** invoke the busy handlers, neither will make any progress. Therefore, +** SQLite returns [SQLITE_BUSY] for the first process, hoping that this +** will induce the first process to release its read lock and allow +** the second process to proceed. +** +** ^The default busy callback is NULL. +** +** ^(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()] +** or evaluating [PRAGMA busy_timeout=N] will change the +** busy handler and thus clear any previously set busy handler. +** +** The busy callback should not take any actions which modify the +** database connection that invoked the busy handler. In other words, +** the busy handler is not reentrant. Any such actions +** result in undefined behavior. +** +** 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 +** METHOD: sqlite3 +** +** ^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. ^After at least "ms" milliseconds of sleeping, +** the handler returns 0 which causes [sqlite3_step()] to return +** [SQLITE_BUSY]. +** +** ^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 +** [database connection] at any given moment. If another busy handler +** was defined (using [sqlite3_busy_handler()]) prior to calling +** this routine, that other busy handler is cleared.)^ +** +** See also: [PRAGMA busy_timeout] +*/ +SQLITE_API int sqlite3_busy_timeout(sqlite3*, int ms); + +/* +** CAPI3REF: Convenience Routines For Running Queries +** METHOD: sqlite3 +** +** This is a legacy interface that is preserved for backwards compatibility. +** Use of this interface is not recommended. +** +** Definition: A result table is memory data structure created by the +** [sqlite3_get_table()] interface. A result table records the +** complete query results from one or more queries. +** +** The table conceptually has a number of rows and columns. But +** these numbers are not part of the result table itself. These +** numbers are obtained separately. Let N be the number of rows +** and M be the number of columns. +** +** A result table is an array of pointers to zero-terminated UTF-8 strings. +** There are (N+1)*M elements in the array. The first M pointers point +** to zero-terminated strings that contain the names of the columns. +** The remaining entries all point to query results. NULL values result +** in NULL pointers. All other values are in their UTF-8 zero-terminated +** string representation as returned by [sqlite3_column_text()]. +** +** A result table might consist of one or more memory allocations. +** It is not safe to pass a result table directly to [sqlite3_free()]. +** A result table should be deallocated using [sqlite3_free_table()]. +** +** ^(As an example of the result table format, suppose a query result +** is as follows: +** +**
      +**        Name        | Age
      +**        -----------------------
      +**        Alice       | 43
      +**        Bob         | 28
      +**        Cindy       | 21
      +** 
      +** +** There are two column (M==2) and three rows (N==3). Thus the +** result table has 8 entries. Suppose the result table is stored +** in an array names azResult. Then azResult holds this content: +** +**
      +**        azResult[0] = "Name";
      +**        azResult[1] = "Age";
      +**        azResult[2] = "Alice";
      +**        azResult[3] = "43";
      +**        azResult[4] = "Bob";
      +**        azResult[5] = "28";
      +**        azResult[6] = "Cindy";
      +**        azResult[7] = "21";
      +** 
      )^ +** +** ^The sqlite3_get_table() function evaluates one or more +** semicolon-separated SQL statements in the zero-terminated UTF-8 +** string of its 2nd parameter and returns a result table to the +** pointer given in its 3rd parameter. +** +** After the application has finished with the result from sqlite3_get_table(), +** it must 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 +** [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()]. +*/ +SQLITE_API int sqlite3_get_table( + sqlite3 *db, /* An open database */ + const char *zSql, /* SQL to be evaluated */ + char ***pazResult, /* Results of the query */ + int *pnRow, /* Number of result rows written here */ + int *pnColumn, /* Number of result columns written here */ + char **pzErrmsg /* Error msg written here */ +); +SQLITE_API void sqlite3_free_table(char **result); + +/* +** CAPI3REF: Formatted String Printing Functions +** +** These routines are work-alikes of the "printf()" family of functions +** from the standard C library. +** These routines understand most of the common K&R formatting options, +** plus some additional non-standard formats, detailed below. +** Note that some of the more obscure formatting options from recent +** C-library standards are omitted from this implementation. +** +** ^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 +** NULL pointer if [sqlite3_malloc()] is unable to allocate enough +** memory to hold the resulting string. +** +** ^(The 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 +** historical accident that cannot be fixed without breaking +** 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 +** 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 +** 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. +** +** ^The sqlite3_vsnprintf() routine is a varargs version of sqlite3_snprintf(). +** +** These routines all implement some additional formatting +** options that are useful for constructing SQL statements. +** All of the usual printf() formatting options apply. In addition, there +** is are "%q", "%Q", "%w" and "%z" options. +** +** ^(The %q option works like %s in that it substitutes a nul-terminated +** string from the argument list. But %q also doubles every '\'' character. +** %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. +** +** For example, assume the string variable zText contains text as follows: +** +**
      +**  char *zText = "It's a happy day!";
      +** 
      +** +** One can use this text in an SQL statement as follows: +** +**
      +**  char *zSQL = sqlite3_mprintf("INSERT INTO table VALUES('%q')", zText);
      +**  sqlite3_exec(db, zSQL, 0, 0, 0);
      +**  sqlite3_free(zSQL);
      +** 
      +** +** Because the %q format string is used, the '\'' character in zText +** is escaped and the SQL generated is as follows: +** +**
      +**  INSERT INTO table1 VALUES('It''s a happy day!')
      +** 
      +** +** This is correct. Had we used %s instead of %q, the generated SQL +** would have looked like this: +** +**
      +**  INSERT INTO table1 VALUES('It's a happy day!');
      +** 
      +** +** 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 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).)^ So, for example, one could say: +** +**
      +**  char *zSQL = sqlite3_mprintf("INSERT INTO table VALUES(%Q)", zText);
      +**  sqlite3_exec(db, zSQL, 0, 0, 0);
      +**  sqlite3_free(zSQL);
      +** 
      +** +** The code above will render a correct SQL statement in the zSQL +** variable even if the zText variable is a NULL pointer. +** +** ^(The "%w" formatting option is like "%q" except that it expects to +** be contained within double-quotes instead of single quotes, and it +** escapes the double-quote character instead of the single-quote +** character.)^ The "%w" formatting option is intended for safely inserting +** table and column names into a constructed SQL statement. +** +** ^(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.)^ +*/ +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*, ...); +SQLITE_API char *sqlite3_vsnprintf(int,char*,const char*, va_list); + +/* +** CAPI3REF: Memory Allocation Subsystem +** +** 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 +** 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 +** sqlite3_malloc() is zero or negative then sqlite3_malloc() returns +** a NULL pointer. +** +** ^The sqlite3_malloc64(N) routine works just like +** sqlite3_malloc(N) except that N is an unsigned 64-bit integer instead +** of a signed 32-bit integer. +** +** ^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 +** 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 +** memory might result in a segmentation fault or other severe error. +** Memory corruption, a segmentation fault, or other severe error +** 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(X,N) interface attempts to resize a +** prior memory allocation X to be at least N bytes. +** ^If the X parameter to sqlite3_realloc(X,N) +** is a NULL pointer then its behavior is identical to calling +** sqlite3_malloc(N). +** ^If the N parameter to sqlite3_realloc(X,N) is zero or +** negative then the behavior is exactly the same as calling +** sqlite3_free(X). +** ^sqlite3_realloc(X,N) returns a pointer to a memory allocation +** of at least N bytes in size or NULL if insufficient memory is available. +** ^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(X,N) and the prior allocation is freed. +** ^If sqlite3_realloc(X,N) returns NULL and N is positive, then the +** prior allocation is not freed. +** +** ^The sqlite3_realloc64(X,N) interfaces works the same as +** sqlite3_realloc(X,N) except that N is a 64-bit unsigned integer instead +** of a 32-bit signed integer. +** +** ^If X is a memory allocation previously obtained from sqlite3_malloc(), +** sqlite3_malloc64(), sqlite3_realloc(), or sqlite3_realloc64(), then +** sqlite3_msize(X) returns the size of that memory allocation in bytes. +** ^The value returned by sqlite3_msize(X) might be larger than the number +** of bytes requested when X was allocated. ^If X is a NULL pointer then +** sqlite3_msize(X) returns zero. If X points to something that is not +** the beginning of memory allocation, or if it points to a formerly +** valid memory allocation that has now been freed, then the behavior +** of sqlite3_msize(X) is undefined and possibly harmful. +** +** ^The memory returned by sqlite3_malloc(), sqlite3_realloc(), +** sqlite3_malloc64(), and sqlite3_realloc64() +** is always aligned to at least an 8 byte boundary, or to a +** 4 byte boundary if the [SQLITE_4_BYTE_ALIGNED_MALLOC] compile-time +** option is used. +** +** 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 +** implementation of these routines to be omitted. That capability +** is no longer provided. Only built-in memory allocators can be used. +** +** Prior to SQLite version 3.7.10, the Windows OS interface layer called +** the system malloc() and free() directly when converting +** filenames between the UTF-8 encoding used by SQLite +** and whatever filename encoding is used by the particular Windows +** installation. Memory allocation errors were detected, but +** they were reported back as [SQLITE_CANTOPEN] or +** [SQLITE_IOERR] rather than [SQLITE_NOMEM]. +** +** 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 +** not yet been released. +** +** The application must not read or write any part of +** a block of memory after it has been released using +** [sqlite3_free()] or [sqlite3_realloc()]. +*/ +SQLITE_API void *sqlite3_malloc(int); +SQLITE_API void *sqlite3_malloc64(sqlite3_uint64); +SQLITE_API void *sqlite3_realloc(void*, int); +SQLITE_API void *sqlite3_realloc64(void*, sqlite3_uint64); +SQLITE_API void sqlite3_free(void*); +SQLITE_API sqlite3_uint64 sqlite3_msize(void*); + +/* +** 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. +** +** ^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 +** +** SQLite contains a high-quality pseudo-random number generator (PRNG) used to +** select random [ROWID | ROWIDs] when inserting new records into a table that +** already uses the largest possible [ROWID]. The PRNG is also used for +** 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. +** ^The P parameter can be a NULL pointer. +** +** ^If this routine has not been previously called or if the previous +** call had N less than one or a NULL pointer for P, then the PRNG is +** seeded using randomness obtained from the xRandomness method of +** the default [sqlite3_vfs] object. +** ^If the previous call to this routine had an N of 1 or more and a +** non-NULL P then the pseudo-randomness is generated +** internally and without recourse to the [sqlite3_vfs] xRandomness +** method. +*/ +SQLITE_API void sqlite3_randomness(int N, void *P); + +/* +** CAPI3REF: Compile-Time Authorization Callbacks +** METHOD: sqlite3 +** +** ^This routine registers an authorizer callback with a particular +** [database connection], supplied in the first argument. +** ^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 +** 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 +** 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 +** 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 +** [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 +** to the callback is an integer [SQLITE_COPY | action code] that specifies +** 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] +** 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 +** [SQLITE_IGNORE] then the [DELETE] operation proceeds but the +** [truncate optimization] is disabled and all rows are deleted individually. +** +** An authorizer is used when [sqlite3_prepare | preparing] +** SQL statements from an untrusted source, to ensure that the SQL statements +** do not try to access data they are not allowed to see, or that they do not +** try to execute malicious statements that damage the database. For +** example, an application may allow a user to enter arbitrary +** SQL queries for evaluation by a database. But the application does +** not want the user to be able to make arbitrary changes to the +** database. An authorizer could then be put in place while the +** user-entered SQL is being [sqlite3_prepare | prepared] that +** disallows everything except [SELECT] statements. +** +** Applications that need to process SQL from untrusted sources +** might also consider lowering resource limits using [sqlite3_limit()] +** 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 +** at a time. Each call to sqlite3_set_authorizer overrides the +** 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 +** the database connection that invoked the authorizer callback. +** 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 +** 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 +** [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. +*/ +SQLITE_API int sqlite3_set_authorizer( + sqlite3*, + int (*xAuth)(void*,int,const char*,const char*,const char*,const char*), + void *pUserData +); + +/* +** CAPI3REF: Authorizer Return Codes +** +** The [sqlite3_set_authorizer | authorizer callback function] must +** return either [SQLITE_OK] or one of these two constants in order +** to signal SQLite whether or not the action is permitted. See the +** [sqlite3_set_authorizer | authorizer documentation] for additional +** information. +** +** Note that SQLITE_IGNORE is also used as a [conflict resolution mode] +** returned from the [sqlite3_vtab_on_conflict()] interface. +*/ +#define SQLITE_DENY 1 /* Abort the SQL statement with an error */ +#define SQLITE_IGNORE 2 /* Don't allow access, but don't generate an error */ + +/* +** CAPI3REF: Authorizer Action Codes +** +** The [sqlite3_set_authorizer()] interface registers a callback function +** that is invoked to authorize certain SQL statement actions. The +** second parameter to the callback is an integer code that specifies +** what action is being authorized. These are the integer action codes that +** the authorizer callback may be passed. +** +** 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 +** authorizer callback is the name of the database ("main", "temp", +** 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. +*/ +/******************************************* 3rd ************ 4th ***********/ +#define SQLITE_CREATE_INDEX 1 /* Index Name Table Name */ +#define SQLITE_CREATE_TABLE 2 /* Table Name NULL */ +#define SQLITE_CREATE_TEMP_INDEX 3 /* Index Name Table Name */ +#define SQLITE_CREATE_TEMP_TABLE 4 /* Table Name NULL */ +#define SQLITE_CREATE_TEMP_TRIGGER 5 /* Trigger Name Table Name */ +#define SQLITE_CREATE_TEMP_VIEW 6 /* View Name NULL */ +#define SQLITE_CREATE_TRIGGER 7 /* Trigger Name Table Name */ +#define SQLITE_CREATE_VIEW 8 /* View Name NULL */ +#define SQLITE_DELETE 9 /* Table Name NULL */ +#define SQLITE_DROP_INDEX 10 /* Index Name Table Name */ +#define SQLITE_DROP_TABLE 11 /* Table Name NULL */ +#define SQLITE_DROP_TEMP_INDEX 12 /* Index Name Table Name */ +#define SQLITE_DROP_TEMP_TABLE 13 /* Table Name NULL */ +#define SQLITE_DROP_TEMP_TRIGGER 14 /* Trigger Name Table Name */ +#define SQLITE_DROP_TEMP_VIEW 15 /* View Name NULL */ +#define SQLITE_DROP_TRIGGER 16 /* Trigger Name Table Name */ +#define SQLITE_DROP_VIEW 17 /* View Name NULL */ +#define SQLITE_INSERT 18 /* Table Name NULL */ +#define SQLITE_PRAGMA 19 /* Pragma Name 1st arg or NULL */ +#define SQLITE_READ 20 /* Table Name Column Name */ +#define SQLITE_SELECT 21 /* NULL NULL */ +#define SQLITE_TRANSACTION 22 /* Operation NULL */ +#define SQLITE_UPDATE 23 /* Table Name Column Name */ +#define SQLITE_ATTACH 24 /* Filename NULL */ +#define SQLITE_DETACH 25 /* Database Name NULL */ +#define SQLITE_ALTER_TABLE 26 /* Database Name Table Name */ +#define SQLITE_REINDEX 27 /* Index Name NULL */ +#define SQLITE_ANALYZE 28 /* Table Name NULL */ +#define SQLITE_CREATE_VTABLE 29 /* Table Name Module Name */ +#define SQLITE_DROP_VTABLE 30 /* Table Name Module Name */ +#define SQLITE_FUNCTION 31 /* NULL Function Name */ +#define SQLITE_SAVEPOINT 32 /* Operation Savepoint Name */ +#define SQLITE_COPY 0 /* No longer used */ +#define SQLITE_RECURSIVE 33 /* NULL NULL */ + +/* +** CAPI3REF: Tracing And Profiling Functions +** METHOD: sqlite3 +** +** These routines are deprecated. Use the [sqlite3_trace_v2()] interface +** instead of the routines described here. +** +** 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 +** various times when an SQL statement is being run by [sqlite3_step()]. +** ^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.)^ +** +** The [SQLITE_TRACE_SIZE_LIMIT] compile-time option can be used to limit +** the length of [bound parameter] expansion in the output of sqlite3_trace(). +** +** ^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. ^The profile callback +** time is in units of nanoseconds, however the current implementation +** is only capable of millisecond resolution so the six least significant +** digits in the time are meaningless. Future versions of SQLite +** might provide greater resolution on the profiler callback. The +** sqlite3_profile() function is considered experimental and is +** subject to change in future versions of SQLite. +*/ +SQLITE_API SQLITE_DEPRECATED void *sqlite3_trace(sqlite3*, + void(*xTrace)(void*,const char*), void*); +SQLITE_API SQLITE_DEPRECATED void *sqlite3_profile(sqlite3*, + void(*xProfile)(void*,const char*,sqlite3_uint64), void*); + +/* +** CAPI3REF: SQL Trace Event Codes +** KEYWORDS: SQLITE_TRACE +** +** These constants identify classes of events that can be monitored +** using the [sqlite3_trace_v2()] tracing logic. The third argument +** to [sqlite3_trace_v2()] is an OR-ed combination of one or more of +** the following constants. ^The first argument to the trace callback +** is one of the following constants. +** +** New tracing constants may be added in future releases. +** +** ^A trace callback has four arguments: xCallback(T,C,P,X). +** ^The T argument is one of the integer type codes above. +** ^The C argument is a copy of the context pointer passed in as the +** fourth argument to [sqlite3_trace_v2()]. +** The P and X arguments are pointers whose meanings depend on T. +** +**
      +** [[SQLITE_TRACE_STMT]]
      SQLITE_TRACE_STMT
      +**
      ^An SQLITE_TRACE_STMT callback is invoked when a prepared statement +** first begins running and possibly at other times during the +** execution of the prepared statement, such as at the start of each +** trigger subprogram. ^The P argument is a pointer to the +** [prepared statement]. ^The X argument is a pointer to a string which +** is the unexpanded SQL text of the prepared statement or an SQL comment +** that indicates the invocation of a trigger. ^The callback can compute +** the same text that would have been returned by the legacy [sqlite3_trace()] +** interface by using the X argument when X begins with "--" and invoking +** [sqlite3_expanded_sql(P)] otherwise. +** +** [[SQLITE_TRACE_PROFILE]]
      SQLITE_TRACE_PROFILE
      +**
      ^An SQLITE_TRACE_PROFILE callback provides approximately the same +** information as is provided by the [sqlite3_profile()] callback. +** ^The P argument is a pointer to the [prepared statement] and the +** X argument points to a 64-bit integer which is the estimated of +** the number of nanosecond that the prepared statement took to run. +** ^The SQLITE_TRACE_PROFILE callback is invoked when the statement finishes. +** +** [[SQLITE_TRACE_ROW]]
      SQLITE_TRACE_ROW
      +**
      ^An SQLITE_TRACE_ROW callback is invoked whenever a prepared +** statement generates a single row of result. +** ^The P argument is a pointer to the [prepared statement] and the +** X argument is unused. +** +** [[SQLITE_TRACE_CLOSE]]
      SQLITE_TRACE_CLOSE
      +**
      ^An SQLITE_TRACE_CLOSE callback is invoked when a database +** connection closes. +** ^The P argument is a pointer to the [database connection] object +** and the X argument is unused. +**
      +*/ +#define SQLITE_TRACE_STMT 0x01 +#define SQLITE_TRACE_PROFILE 0x02 +#define SQLITE_TRACE_ROW 0x04 +#define SQLITE_TRACE_CLOSE 0x08 + +/* +** CAPI3REF: SQL Trace Hook +** METHOD: sqlite3 +** +** ^The sqlite3_trace_v2(D,M,X,P) interface registers a trace callback +** function X against [database connection] D, using property mask M +** and context pointer P. ^If the X callback is +** NULL or if the M mask is zero, then tracing is disabled. The +** M argument should be the bitwise OR-ed combination of +** zero or more [SQLITE_TRACE] constants. +** +** ^Each call to either sqlite3_trace() or sqlite3_trace_v2() overrides +** (cancels) any prior calls to sqlite3_trace() or sqlite3_trace_v2(). +** +** ^The X callback is invoked whenever any of the events identified by +** mask M occur. ^The integer return value from the callback is currently +** ignored, though this may change in future releases. Callback +** implementations should return zero to ensure future compatibility. +** +** ^A trace callback is invoked with four arguments: callback(T,C,P,X). +** ^The T argument is one of the [SQLITE_TRACE] +** constants to indicate why the callback was invoked. +** ^The C argument is a copy of the context pointer. +** The P and X arguments are pointers whose meanings depend on T. +** +** The sqlite3_trace_v2() interface is intended to replace the legacy +** interfaces [sqlite3_trace()] and [sqlite3_profile()], both of which +** are deprecated. +*/ +SQLITE_API int sqlite3_trace_v2( + sqlite3*, + unsigned uMask, + int(*xCallback)(unsigned,void*,void*,void*), + void *pCtx +); + +/* +** CAPI3REF: Query Progress Callbacks +** METHOD: sqlite3 +** +** ^The sqlite3_progress_handler(D,N,X,P) interface causes the callback +** function X to be invoked periodically during long running calls to +** [sqlite3_exec()], [sqlite3_step()] and [sqlite3_get_table()] for +** database connection D. An example use for this +** interface is to keep a GUI updated during a large query. +** +** ^The parameter P is passed through as the only parameter to the +** callback function X. ^The parameter N is the approximate number of +** [virtual machine instructions] that are evaluated between successive +** invocations of the callback X. ^If N is less than one then the progress +** handler is disabled. +** +** ^Only a single progress handler may be defined at one time per +** [database connection]; setting a new progress handler cancels the +** old one. ^Setting parameter X to NULL disables the progress handler. +** ^The progress handler is also disabled by setting N to a value less +** than 1. +** +** ^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. +** +** The progress handler callback must not do anything that will modify +** the database connection that invoked the progress handler. +** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their +** database connections for the meaning of "modify" in this paragraph. +** +*/ +SQLITE_API void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); + +/* +** CAPI3REF: Opening A New Database Connection +** CONSTRUCTOR: sqlite3 +** +** ^These routines open an SQLite database file as specified 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 +** 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 +** [sqlite3_errmsg()] or [sqlite3_errmsg16()] routines can be used to obtain +** an English language description of the error following a failure of any +** of the sqlite3_open() routines. +** +** ^The default encoding will be UTF-8 for databases created using +** sqlite3_open() or sqlite3_open_v2(). ^The default encoding for databases +** created using sqlite3_open16() will be UTF-16 in the native byte order. +** +** Whether or not an error occurs when it is opened, resources +** associated with the [database connection] handle should be released by +** passing it to [sqlite3_close()] when it is no longer required. +** +** 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 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], +** [SQLITE_OPEN_PRIVATECACHE], and/or [SQLITE_OPEN_URI] flags:)^ +** +**
      +** ^(
      [SQLITE_OPEN_READONLY]
      +**
      The database is opened in read-only mode. If the database does not +** already exist, an error is returned.
      )^ +** +** ^(
      [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.
      )^ +** +** ^(
      [SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE]
      +**
      The database is opened for reading and writing, and is created if +** it does not already exist. This is the behavior that is always used for +** sqlite3_open() and sqlite3_open16().
      )^ +**
      +** +** If the 3rd parameter to sqlite3_open_v2() is not one of the +** combinations shown above optionally combined with other +** [SQLITE_OPEN_READONLY | SQLITE_OPEN_* bits] +** then the behavior is undefined. +** +** ^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 +** [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 +** eligible to use [shared cache mode], regardless of whether or not shared +** 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. +** +** ^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 +** a NULL pointer then the default [sqlite3_vfs] object is used. +** +** ^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 +** automatically deleted as soon as the database connection is closed. +** +** [[URI filenames in sqlite3_open()]]

      URI Filenames

      +** +** ^If [URI filename] interpretation is enabled, and the filename argument +** begins with "file:", then the filename is interpreted as a URI. ^URI +** filename interpretation is enabled if the [SQLITE_OPEN_URI] flag is +** set in the fourth argument to sqlite3_open_v2(), or if it has +** been enabled globally using the [SQLITE_CONFIG_URI] option with the +** [sqlite3_config()] method or by the [SQLITE_USE_URI] compile-time option. +** As of SQLite version 3.7.7, URI filename interpretation is turned off +** by default, but future releases of SQLite might enable URI filename +** interpretation by default. See "[URI filenames]" for additional +** information. +** +** URI filenames are parsed according to RFC 3986. ^If the URI contains an +** authority, then it must be either an empty string or the string +** "localhost". ^If the authority is not an empty string or "localhost", an +** error is returned to the caller. ^The fragment component of a URI, if +** present, is ignored. +** +** ^SQLite uses the path component of the URI as the name of the disk file +** which contains the database. ^If the path begins with a '/' character, +** then it is interpreted as an absolute path. ^If the path does not begin +** with a '/' (meaning that the authority section is omitted from the URI) +** then the path is interpreted as a relative path. +** ^(On windows, the first component of an absolute path +** is a drive specification (e.g. "C:").)^ +** +** [[core URI query parameters]] +** The query component of a URI may contain parameters that are interpreted +** either by SQLite itself, or by a [VFS | custom VFS implementation]. +** SQLite and its built-in [VFSes] interpret the +** following query parameters: +** +**
        +**
      • vfs: ^The "vfs" parameter may be used to specify the name of +** a VFS object that provides the operating system interface that should +** be used to access the database file on disk. ^If this option is set to +** an empty string the default VFS object is used. ^Specifying an unknown +** VFS is an error. ^If sqlite3_open_v2() is used and the vfs option is +** present, then the VFS specified by the option takes precedence over +** the value passed as the fourth parameter to sqlite3_open_v2(). +** +**
      • mode: ^(The mode parameter may be set to either "ro", "rw", +** "rwc", or "memory". Attempting to set it to any other value is +** an error)^. +** ^If "ro" is specified, then the database is opened for read-only +** access, just as if the [SQLITE_OPEN_READONLY] flag had been set in the +** third argument to sqlite3_open_v2(). ^If the mode option is set to +** "rw", then the database is opened for read-write (but not create) +** access, as if SQLITE_OPEN_READWRITE (but not SQLITE_OPEN_CREATE) had +** been set. ^Value "rwc" is equivalent to setting both +** SQLITE_OPEN_READWRITE and SQLITE_OPEN_CREATE. ^If the mode option is +** set to "memory" then a pure [in-memory database] that never reads +** or writes from disk is used. ^It is an error to specify a value for +** the mode parameter that is less restrictive than that specified by +** the flags passed in the third parameter to sqlite3_open_v2(). +** +**
      • cache: ^The cache parameter may be set to either "shared" or +** "private". ^Setting it to "shared" is equivalent to setting the +** SQLITE_OPEN_SHAREDCACHE bit in the flags argument passed to +** sqlite3_open_v2(). ^Setting the cache parameter to "private" is +** equivalent to setting the SQLITE_OPEN_PRIVATECACHE bit. +** ^If sqlite3_open_v2() is used and the "cache" parameter is present in +** a URI filename, its value overrides any behavior requested by setting +** SQLITE_OPEN_PRIVATECACHE or SQLITE_OPEN_SHAREDCACHE flag. +** +**
      • psow: ^The psow parameter indicates whether or not the +** [powersafe overwrite] property does or does not apply to the +** storage media on which the database file resides. +** +**
      • nolock: ^The nolock parameter is a boolean query parameter +** which if set disables file locking in rollback journal modes. This +** is useful for accessing a database on a filesystem that does not +** support locking. Caution: Database corruption might result if two +** or more processes write to the same database and any one of those +** processes uses nolock=1. +** +**
      • immutable: ^The immutable parameter is a boolean query +** parameter that indicates that the database file is stored on +** read-only media. ^When immutable is set, SQLite assumes that the +** database file cannot be changed, even by a process with higher +** privilege, and so the database is opened read-only and all locking +** and change detection is disabled. Caution: Setting the immutable +** property on a database file that does in fact change can result +** in incorrect query results and/or [SQLITE_CORRUPT] errors. +** See also: [SQLITE_IOCAP_IMMUTABLE]. +** +**
      +** +** ^Specifying an unknown parameter in the query component of a URI is not an +** error. Future versions of SQLite might understand additional query +** parameters. See "[query parameters with special meaning to SQLite]" for +** additional information. +** +** [[URI filename examples]]

      URI filename examples

      +** +** +**
      URI filenames Results +**
      file:data.db +** Open the file "data.db" in the current directory. +**
      file:/home/fred/data.db
      +** file:///home/fred/data.db
      +** file://localhost/home/fred/data.db
      +** Open the database file "/home/fred/data.db". +**
      file://darkstar/home/fred/data.db +** An error. "darkstar" is not a recognized authority. +**
      +** file:///C:/Documents%20and%20Settings/fred/Desktop/data.db +** Windows only: Open the file "data.db" on fred's desktop on drive +** C:. Note that the %20 escaping in this example is not strictly +** necessary - space characters can be used literally +** in URI filenames. +**
      file:data.db?mode=ro&cache=private +** Open file "data.db" in the current directory for read-only access. +** Regardless of whether or not shared-cache mode is enabled by +** default, use a private cache. +**
      file:/home/fred/data.db?vfs=unix-dotfile +** Open file "/home/fred/data.db". Use the special VFS "unix-dotfile" +** that uses dot-files in place of posix advisory locking. +**
      file:data.db?mode=readonly +** An error. "readonly" is not a valid option for the "mode" parameter. +**
      +** +** ^URI hexadecimal escape sequences (%HH) are supported within the path and +** query components of a URI. A hexadecimal escape sequence consists of a +** percent sign - "%" - followed by exactly two hexadecimal digits +** specifying an octet value. ^Before the path or query components of a +** URI filename are interpreted, they are encoded using UTF-8 and all +** hexadecimal escape sequences replaced by a single byte containing the +** corresponding octet. If this process generates an invalid UTF-8 encoding, +** the results are undefined. +** +** Note to Windows users: The encoding used for the filename argument +** of sqlite3_open() and sqlite3_open_v2() must be UTF-8, not whatever +** 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(). +** +** Note to Windows Runtime users: The temporary directory must be set +** prior to calling sqlite3_open() or sqlite3_open_v2(). Otherwise, various +** features that require the use of temporary files may fail. +** +** See also: [sqlite3_temp_directory] +*/ +SQLITE_API int sqlite3_open( + const char *filename, /* Database filename (UTF-8) */ + sqlite3 **ppDb /* OUT: SQLite db handle */ +); +SQLITE_API int sqlite3_open16( + const void *filename, /* Database filename (UTF-16) */ + sqlite3 **ppDb /* OUT: SQLite db handle */ +); +SQLITE_API int sqlite3_open_v2( + const char *filename, /* Database filename (UTF-8) */ + sqlite3 **ppDb, /* OUT: SQLite db handle */ + int flags, /* Flags */ + const char *zVfs /* Name of VFS module to use */ +); + +/* +** CAPI3REF: Obtain Values For URI Parameters +** +** These are utility routines, useful to VFS implementations, that check +** to see if a database file was a URI that contained a specific query +** parameter, and if so obtains the value of that query parameter. +** +** If F is the database filename pointer passed into the xOpen() method of +** a VFS implementation when the flags parameter to xOpen() has one or +** more of the [SQLITE_OPEN_URI] or [SQLITE_OPEN_MAIN_DB] bits set and +** P is the name of the query parameter, then +** sqlite3_uri_parameter(F,P) returns the value of the P +** parameter if it exists or a NULL pointer if P does not appear as a +** query parameter on F. If P is a query parameter of F +** has no explicit value, then sqlite3_uri_parameter(F,P) returns +** a pointer to an empty string. +** +** The sqlite3_uri_boolean(F,P,B) routine assumes that P is a boolean +** parameter and returns true (1) or false (0) according to the value +** of P. The sqlite3_uri_boolean(F,P,B) routine returns true (1) if the +** value of query parameter P is one of "yes", "true", or "on" in any +** case or if the value begins with a non-zero number. The +** sqlite3_uri_boolean(F,P,B) routines returns false (0) if the value of +** query parameter P is one of "no", "false", or "off" in any case or +** if the value begins with a numeric zero. If P is not a query +** parameter on F or if the value of P is does not match any of the +** above, then sqlite3_uri_boolean(F,P,B) returns (B!=0). +** +** The sqlite3_uri_int64(F,P,D) routine converts the value of P into a +** 64-bit signed integer and returns that integer, or D if P does not +** exist. If the value of P is something other than an integer, then +** zero is returned. +** +** If F is a NULL pointer, then sqlite3_uri_parameter(F,P) returns NULL and +** sqlite3_uri_boolean(F,P,B) returns B. If F is not a NULL pointer and +** is not a database file pathname pointer that SQLite passed into the xOpen +** VFS method, then the behavior of this routine is undefined and probably +** undesirable. +*/ +SQLITE_API const char *sqlite3_uri_parameter(const char *zFilename, const char *zParam); +SQLITE_API int sqlite3_uri_boolean(const char *zFile, const char *zParam, int bDefault); +SQLITE_API sqlite3_int64 sqlite3_uri_int64(const char*, const char*, sqlite3_int64); + + +/* +** CAPI3REF: Error Codes And Messages +** METHOD: sqlite3 +** +** ^If the most recent sqlite3_* API call associated with +** [database connection] D failed, then the sqlite3_errcode(D) interface +** returns the numeric [result code] or [extended result code] for that +** API call. +** If the most recent API call was successful, +** then the return value from 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 +** text that describes the error, as either UTF-8 or UTF-16 respectively. +** ^(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.)^ +** +** ^The sqlite3_errstr() interface returns the English-language text +** that describes the [result code], as UTF-8. +** ^(Memory to hold the error message string is managed internally +** and must not be freed by the application)^. +** +** When the serialized [threading mode] is in use, it might be the +** case that a second error occurs on a separate thread in between +** the time of the first error and the call to these interfaces. +** When that happens, the second error will be reported since these +** interfaces always report the most recent result. To avoid +** this, each thread can obtain exclusive use of the [database connection] D +** by invoking [sqlite3_mutex_enter]([sqlite3_db_mutex](D)) before beginning +** to use D and invoking [sqlite3_mutex_leave]([sqlite3_db_mutex](D)) after +** all calls to the interfaces listed here are completed. +** +** 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. +*/ +SQLITE_API int sqlite3_errcode(sqlite3 *db); +SQLITE_API int sqlite3_extended_errcode(sqlite3 *db); +SQLITE_API const char *sqlite3_errmsg(sqlite3*); +SQLITE_API const void *sqlite3_errmsg16(sqlite3*); +SQLITE_API const char *sqlite3_errstr(int); + +/* +** CAPI3REF: Prepared Statement Object +** KEYWORDS: {prepared statement} {prepared statements} +** +** An instance of this object represents a single SQL statement that +** has been compiled into binary form and is ready to be evaluated. +** +** Think of each SQL statement as a separate computer program. The +** original SQL text is source code. A prepared statement object +** is the compiled object code. All SQL must be converted into a +** prepared statement before it can be run. +** +** The life-cycle of a prepared statement object usually goes like this: +** +**
        +**
      1. Create the prepared statement object using [sqlite3_prepare_v2()]. +**
      2. Bind values to [parameters] using the sqlite3_bind_*() +** interfaces. +**
      3. Run the SQL by calling [sqlite3_step()] one or more times. +**
      4. Reset the prepared statement using [sqlite3_reset()] then go back +** to step 2. Do this zero or more times. +**
      5. Destroy the object using [sqlite3_finalize()]. +**
      +*/ +typedef struct sqlite3_stmt sqlite3_stmt; + +/* +** CAPI3REF: Run-time Limits +** METHOD: sqlite3 +** +** ^(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.)^ +** +** ^If the new limit is a negative number, the limit is unchanged. +** ^(For each limit category SQLITE_LIMIT_NAME there is a +** [limits | hard upper bound] +** set at compile-time by a C preprocessor macro called +** [limits | SQLITE_MAX_NAME]. +** (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. +** +** ^Regardless of whether or not the limit was changed, the +** [sqlite3_limit()] interface returns the prior value of the limit. +** ^Hence, to find the current value of a limit without changing it, +** simply invoke this interface with the third parameter set to -1. +** +** 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 +** separate databases controlled by JavaScript applications downloaded +** off the Internet. The internal databases can be given the +** large, default limits. Databases managed by external sources can +** be given much smaller limits designed to prevent a denial of service +** attack. Developers might also want to use the [sqlite3_set_authorizer()] +** interface to further control untrusted SQL. The size of the database +** created by an untrusted script can be contained using the +** [max_page_count] [PRAGMA]. +** +** New run-time limit categories may be added in future releases. +*/ +SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal); + +/* +** 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()]. +** The synopsis of the meanings of the various limits is shown below. +** Additional information is available at [limits | Limits in SQLite]. +** +**
      +** [[SQLITE_LIMIT_LENGTH]] ^(
      SQLITE_LIMIT_LENGTH
      +**
      The maximum size of any string or BLOB or table row, in bytes.
      )^ +** +** [[SQLITE_LIMIT_SQL_LENGTH]] ^(
      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.
      )^ +** +** [[SQLITE_LIMIT_EXPR_DEPTH]] ^(
      SQLITE_LIMIT_EXPR_DEPTH
      +**
      The maximum depth of the parse tree on any expression.
      )^ +** +** [[SQLITE_LIMIT_COMPOUND_SELECT]] ^(
      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. This limit is not currently +** enforced, though that might be added in some future release of +** SQLite.
      )^ +** +** [[SQLITE_LIMIT_FUNCTION_ARG]] ^(
      SQLITE_LIMIT_FUNCTION_ARG
      +**
      The maximum number of arguments on a function.
      )^ +** +** [[SQLITE_LIMIT_ATTACHED]] ^(
      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.
      )^ +** +** [[SQLITE_LIMIT_VARIABLE_NUMBER]] +** ^(
      SQLITE_LIMIT_VARIABLE_NUMBER
      +**
      The maximum index number of any [parameter] in an SQL statement.)^ +** +** [[SQLITE_LIMIT_TRIGGER_DEPTH]] ^(
      SQLITE_LIMIT_TRIGGER_DEPTH
      +**
      The maximum depth of recursion for triggers.
      )^ +** +** [[SQLITE_LIMIT_WORKER_THREADS]] ^(
      SQLITE_LIMIT_WORKER_THREADS
      +**
      The maximum number of auxiliary worker threads that a single +** [prepared statement] may start.
      )^ +**
      +*/ +#define SQLITE_LIMIT_LENGTH 0 +#define SQLITE_LIMIT_SQL_LENGTH 1 +#define SQLITE_LIMIT_COLUMN 2 +#define SQLITE_LIMIT_EXPR_DEPTH 3 +#define SQLITE_LIMIT_COMPOUND_SELECT 4 +#define SQLITE_LIMIT_VDBE_OP 5 +#define SQLITE_LIMIT_FUNCTION_ARG 6 +#define SQLITE_LIMIT_ATTACHED 7 +#define SQLITE_LIMIT_LIKE_PATTERN_LENGTH 8 +#define SQLITE_LIMIT_VARIABLE_NUMBER 9 +#define SQLITE_LIMIT_TRIGGER_DEPTH 10 +#define SQLITE_LIMIT_WORKER_THREADS 11 + +/* +** CAPI3REF: Compiling An SQL Statement +** KEYWORDS: {SQL statement compiler} +** METHOD: sqlite3 +** CONSTRUCTOR: sqlite3_stmt +** +** To execute an SQL query, it must first be compiled into a byte-code +** program using one of these routines. +** +** The first argument, "db", is a [database connection] obtained from a +** prior successful call to [sqlite3_open()], [sqlite3_open_v2()] or +** [sqlite3_open16()]. The database connection must not have been closed. +** +** The second argument, "zSql", is the statement to be compiled, encoded +** as either UTF-8 or UTF-16. The sqlite3_prepare() and sqlite3_prepare_v2() +** interfaces use UTF-8, and sqlite3_prepare16() and sqlite3_prepare16_v2() +** use UTF-16. +** +** ^If the nByte argument is negative, then zSql is read up to the +** first zero terminator. ^If nByte is positive, then it is the +** number of bytes read from zSql. ^If nByte is zero, then no prepared +** statement is generated. +** If the caller knows that the supplied string is nul-terminated, then +** there is a small performance advantage to passing an nByte parameter that +** is the number of bytes in the input string including +** the nul-terminator. +** +** ^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 +** 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, 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 +** that is returned (the [sqlite3_stmt] object) contains a copy of the +** original SQL text. This causes the [sqlite3_step()] interface to +** behave differently in three ways: +** +**
        +**
      1. +** ^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. As many as [SQLITE_MAX_SCHEMA_RETRY] +** retries will occur before sqlite3_step() gives up and returns an error. +**
      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 +** [sqlite3_step()] would only return a generic [SQLITE_ERROR] result code +** 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. +** +**
      5. +** ^If the specific value bound to [parameter | host parameter] in the +** WHERE clause might influence the choice of query plan for a statement, +** then the statement will 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 that [parameter]. +** ^The specific value of WHERE-clause [parameter] might influence the +** choice of query plan if the parameter is the left-hand side of a [LIKE] +** or [GLOB] operator or if the parameter is compared to an indexed column +** and the [SQLITE_ENABLE_STAT3] compile-time option is enabled. +**
      6. +**
      +*/ +SQLITE_API int sqlite3_prepare( + sqlite3 *db, /* Database handle */ + const char *zSql, /* SQL statement, UTF-8 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const char **pzTail /* OUT: Pointer to unused portion of zSql */ +); +SQLITE_API int sqlite3_prepare_v2( + sqlite3 *db, /* Database handle */ + const char *zSql, /* SQL statement, UTF-8 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const char **pzTail /* OUT: Pointer to unused portion of zSql */ +); +SQLITE_API int sqlite3_prepare16( + sqlite3 *db, /* Database handle */ + const void *zSql, /* SQL statement, UTF-16 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const void **pzTail /* OUT: Pointer to unused portion of zSql */ +); +SQLITE_API int sqlite3_prepare16_v2( + sqlite3 *db, /* Database handle */ + const void *zSql, /* SQL statement, UTF-16 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const void **pzTail /* OUT: Pointer to unused portion of zSql */ +); + +/* +** CAPI3REF: Retrieving Statement SQL +** METHOD: sqlite3_stmt +** +** ^The sqlite3_sql(P) interface returns a pointer to a copy of the UTF-8 +** SQL text used to create [prepared statement] P if P was +** created by either [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()]. +** ^The sqlite3_expanded_sql(P) interface returns a pointer to a UTF-8 +** string containing the SQL text of prepared statement P with +** [bound parameters] expanded. +** +** ^(For example, if a prepared statement is created using the SQL +** text "SELECT $abc,:xyz" and if parameter $abc is bound to integer 2345 +** and parameter :xyz is unbound, then sqlite3_sql() will return +** the original string, "SELECT $abc,:xyz" but sqlite3_expanded_sql() +** will return "SELECT 2345,NULL".)^ +** +** ^The sqlite3_expanded_sql() interface returns NULL if insufficient memory +** is available to hold the result, or if the result would exceed the +** the maximum string length determined by the [SQLITE_LIMIT_LENGTH]. +** +** ^The [SQLITE_TRACE_SIZE_LIMIT] compile-time option limits the size of +** bound parameter expansions. ^The [SQLITE_OMIT_TRACE] compile-time +** option causes sqlite3_expanded_sql() to always return NULL. +** +** ^The string returned by sqlite3_sql(P) is managed by SQLite and is +** automatically freed when the prepared statement is finalized. +** ^The string returned by sqlite3_expanded_sql(P), on the other hand, +** is obtained from [sqlite3_malloc()] and must be free by the application +** by passing it to [sqlite3_free()]. +*/ +SQLITE_API const char *sqlite3_sql(sqlite3_stmt *pStmt); +SQLITE_API char *sqlite3_expanded_sql(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Determine If An SQL Statement Writes The Database +** METHOD: sqlite3_stmt +** +** ^The sqlite3_stmt_readonly(X) interface returns true (non-zero) if +** and only if the [prepared statement] X makes no direct changes to +** the content of the database file. +** +** Note that [application-defined SQL functions] or +** [virtual tables] might change the database indirectly as a side effect. +** ^(For example, if an application defines a function "eval()" that +** calls [sqlite3_exec()], then the following SQL statement would +** change the database file through side-effects: +** +**
      +**    SELECT eval('DELETE FROM t1') FROM t2;
      +** 
      +** +** But because the [SELECT] statement does not change the database file +** directly, sqlite3_stmt_readonly() would still return true.)^ +** +** ^Transaction control statements such as [BEGIN], [COMMIT], [ROLLBACK], +** [SAVEPOINT], and [RELEASE] cause sqlite3_stmt_readonly() to return true, +** since the statements themselves do not actually modify the database but +** rather they control the timing of when other statements modify the +** database. ^The [ATTACH] and [DETACH] statements also cause +** sqlite3_stmt_readonly() to return true since, while those statements +** change the configuration of a database connection, they do not make +** changes to the content of the database files on disk. +*/ +SQLITE_API int sqlite3_stmt_readonly(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Determine If A Prepared Statement Has Been Reset +** METHOD: sqlite3_stmt +** +** ^The sqlite3_stmt_busy(S) interface returns true (non-zero) if the +** [prepared statement] S has been stepped at least once using +** [sqlite3_step(S)] but has neither run to completion (returned +** [SQLITE_DONE] from [sqlite3_step(S)]) nor +** been reset using [sqlite3_reset(S)]. ^The sqlite3_stmt_busy(S) +** interface returns false if S is a NULL pointer. If S is not a +** NULL pointer and is not a pointer to a valid [prepared statement] +** object, then the behavior is undefined and probably undesirable. +** +** This interface can be used in combination [sqlite3_next_stmt()] +** to locate all prepared statements associated with a database +** connection that are in need of being reset. This can be used, +** for example, in diagnostic routines to search for prepared +** statements that are holding a transaction open. +*/ +SQLITE_API int sqlite3_stmt_busy(sqlite3_stmt*); + +/* +** 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 +** can be integers, floating point values, strings, BLOBs, or NULL. +** +** An sqlite3_value object may be either "protected" or "unprotected". +** Some interfaces require a protected sqlite3_value. Other interfaces +** will accept either a protected or an unprotected sqlite3_value. +** Every interface that accepts sqlite3_value arguments specifies +** whether or not it requires a protected sqlite3_value. The +** [sqlite3_value_dup()] interface can be used to construct a new +** protected sqlite3_value from an unprotected sqlite3_value. +** +** The terms "protected" and "unprotected" refer to whether or not +** a mutex is held. An internal mutex is held for a protected +** sqlite3_value object but no mutex is held for an unprotected +** sqlite3_value object. If SQLite is compiled to be single-threaded +** (with [SQLITE_THREADSAFE=0] and with [sqlite3_threadsafe()] returning 0) +** or if SQLite is run in one of reduced mutex modes +** [SQLITE_CONFIG_SINGLETHREAD] or [SQLITE_CONFIG_MULTITHREAD] +** then there is no distinction between protected and unprotected +** sqlite3_value objects and they can be used interchangeably. However, +** for maximum code portability it is recommended that applications +** still make the distinction between protected and unprotected +** sqlite3_value objects even when not strictly required. +** +** ^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 +** [sqlite3_column_value()] is unprotected. +** Unprotected sqlite3_value objects may only be used with +** [sqlite3_result_value()] and [sqlite3_bind_value()]. +** The [sqlite3_value_blob | sqlite3_value_type()] family of +** interfaces require protected sqlite3_value objects. +*/ +typedef struct Mem sqlite3_value; + +/* +** 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 +** 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()], +** [sqlite3_aggregate_context()], [sqlite3_user_data()], +** [sqlite3_context_db_handle()], [sqlite3_get_auxdata()], +** and/or [sqlite3_set_auxdata()]. +*/ +typedef struct sqlite3_context sqlite3_context; + +/* +** CAPI3REF: Binding Values To Prepared Statements +** KEYWORDS: {host parameter} {host parameters} {host parameter name} +** KEYWORDS: {SQL parameter} {SQL parameters} {parameter binding} +** METHOD: sqlite3_stmt +** +** ^(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: +** +**
        +**
      • ? +**
      • ?NNN +**
      • :VVV +**
      • @VVV +**
      • $VVV +**
      +** +** In the templates above, NNN represents an integer literal, +** and VVV represents an alphanumeric identifier.)^ ^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 +** 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 +** 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 +** for "?NNN" parameters is the value of NNN. +** ^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. +** ^If the third parameter to sqlite3_bind_text() or sqlite3_bind_text16() +** or sqlite3_bind_blob() is a NULL pointer then the fourth parameter +** is ignored and the end result is the same as sqlite3_bind_null(). +** +** ^(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 to sqlite3_bind_text() or sqlite3_bind_text16() +** is negative, then the length of the string is +** the number of bytes up to the first zero terminator. +** If the fourth parameter to sqlite3_bind_blob() is negative, then +** the behavior is undefined. +** If a non-negative fourth parameter is provided to sqlite3_bind_text() +** or sqlite3_bind_text16() or sqlite3_bind_text64() then +** that parameter must be the byte offset +** where the NUL terminator would occur assuming the string were NUL +** terminated. If any NUL characters occur at byte offsets less than +** the value of the fourth parameter then the resulting string value will +** contain embedded NULs. The result of expressions involving strings +** with embedded NULs is undefined. +** +** ^The fifth argument to the BLOB and string binding interfaces +** is a destructor used to dispose of the BLOB or +** string after SQLite has finished with it. ^The destructor is called +** to dispose of the BLOB or string even if the call to bind API fails. +** ^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 +** SQLite makes its own private copy of the data immediately, before +** the sqlite3_bind_*() routine returns. +** +** ^The sixth argument to sqlite3_bind_text64() must be one of +** [SQLITE_UTF8], [SQLITE_UTF16], [SQLITE_UTF16BE], or [SQLITE_UTF16LE] +** to specify the encoding of the text in the third parameter. If +** the sixth argument to sqlite3_bind_text64() is not one of the +** allowed values shown above, or if the text encoding is different +** from the encoding specified by the sixth parameter, then the behavior +** is undefined. +** +** ^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. +** +** ^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. +** +** ^The sqlite3_bind_* routines return [SQLITE_OK] on success or an +** [error code] if anything goes wrong. +** ^[SQLITE_TOOBIG] might be returned if the size of a string or BLOB +** exceeds limits imposed by [sqlite3_limit]([SQLITE_LIMIT_LENGTH]) or +** [SQLITE_MAX_LENGTH]. +** ^[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_blob64(sqlite3_stmt*, int, const void*, sqlite3_uint64, + void(*)(void*)); +SQLITE_API int sqlite3_bind_double(sqlite3_stmt*, int, double); +SQLITE_API int sqlite3_bind_int(sqlite3_stmt*, int, int); +SQLITE_API int sqlite3_bind_int64(sqlite3_stmt*, int, sqlite3_int64); +SQLITE_API int sqlite3_bind_null(sqlite3_stmt*, int); +SQLITE_API int sqlite3_bind_text(sqlite3_stmt*,int,const char*,int,void(*)(void*)); +SQLITE_API int sqlite3_bind_text16(sqlite3_stmt*, int, const void*, int, void(*)(void*)); +SQLITE_API int sqlite3_bind_text64(sqlite3_stmt*, int, const char*, sqlite3_uint64, + void(*)(void*), unsigned char encoding); +SQLITE_API int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*); +SQLITE_API int sqlite3_bind_zeroblob(sqlite3_stmt*, int, int n); +SQLITE_API int sqlite3_bind_zeroblob64(sqlite3_stmt*, int, sqlite3_uint64); + +/* +** CAPI3REF: Number Of SQL Parameters +** METHOD: sqlite3_stmt +** +** ^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) +** parameter. For all forms except ?NNN, this will correspond to the +** 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()]. +*/ +SQLITE_API int sqlite3_bind_parameter_count(sqlite3_stmt*); + +/* +** CAPI3REF: Name Of A Host Parameter +** METHOD: sqlite3_stmt +** +** ^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 referred to as "nameless" or "anonymous parameters". +** +** ^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 +** always in UTF-8 encoding even if the named parameter was +** originally specified as UTF-16 in [sqlite3_prepare16()] or +** [sqlite3_prepare16_v2()]. +** +** See also: [sqlite3_bind_blob|sqlite3_bind()], +** [sqlite3_bind_parameter_count()], and +** [sqlite3_bind_parameter_index()]. +*/ +SQLITE_API const char *sqlite3_bind_parameter_name(sqlite3_stmt*, int); + +/* +** CAPI3REF: Index Of A Parameter With A Given Name +** METHOD: sqlite3_stmt +** +** ^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 +** 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_name()]. +*/ +SQLITE_API int sqlite3_bind_parameter_index(sqlite3_stmt*, const char *zName); + +/* +** CAPI3REF: Reset All Bindings On A Prepared Statement +** METHOD: sqlite3_stmt +** +** ^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. +*/ +SQLITE_API int sqlite3_clear_bindings(sqlite3_stmt*); + +/* +** CAPI3REF: Number Of Columns In A Result Set +** METHOD: sqlite3_stmt +** +** ^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]). +** +** See also: [sqlite3_data_count()] +*/ +SQLITE_API int sqlite3_column_count(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Column Names In A Result Set +** METHOD: sqlite3_stmt +** +** ^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. +** +** ^The returned string pointer is valid until either the [prepared statement] +** is destroyed by [sqlite3_finalize()] or until the statement is automatically +** reprepared by the first call to [sqlite3_step()] for a particular run +** 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 +** (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 +** 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. +*/ +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 +** METHOD: sqlite3_stmt +** +** ^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 +** using [sqlite3_finalize()] or until the statement is automatically +** reprepared by the first call to [sqlite3_step()] for a particular run +** or until the same information is requested +** again in a different encoding. +** +** ^The names returned are the original un-aliased names of the +** database, table, and column. +** +** ^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 +** 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, +** or column that query result column was extracted from. +** +** ^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. +** +** 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. +** +** If two or more threads call one or more +** [sqlite3_column_database_name | column metadata interfaces] +** for the same [prepared statement] and result column +** at the same time then the results are undefined. +*/ +SQLITE_API const char *sqlite3_column_database_name(sqlite3_stmt*,int); +SQLITE_API const void *sqlite3_column_database_name16(sqlite3_stmt*,int); +SQLITE_API const char *sqlite3_column_table_name(sqlite3_stmt*,int); +SQLITE_API const void *sqlite3_column_table_name16(sqlite3_stmt*,int); +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 +** METHOD: sqlite3_stmt +** +** ^(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 +** expression or subquery, then a NULL pointer is returned. +** ^The returned string is always UTF-8 encoded. +** +** ^(For example, given the database schema: +** +** CREATE TABLE t1(c1 VARIANT); +** +** and the following statement to be compiled: +** +** 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).)^ +** +** ^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 +** is associated with individual values, not with the containers +** used to hold those values. +*/ +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 +** METHOD: sqlite3_stmt +** +** After a [prepared statement] has been prepared using either +** [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()] or one of the legacy +** interfaces [sqlite3_prepare()] or [sqlite3_prepare16()], this function +** must be called one or more times to evaluate the statement. +** +** The details of the behavior of the sqlite3_step() interface depend +** on whether the statement was prepared using the newer "v2" interface +** [sqlite3_prepare_v2()] and [sqlite3_prepare16_v2()] or the older legacy +** interface [sqlite3_prepare()] and [sqlite3_prepare16()]. The use of the +** 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], +** [SQLITE_DONE], [SQLITE_ROW], [SQLITE_ERROR], or [SQLITE_MISUSE]. +** ^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] +** or occurs outside of an explicit transaction, then you can retry the +** statement. If the statement is not a [COMMIT] and occurs within an +** explicit transaction then you should rollback the transaction before +** continuing. +** +** ^[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] +** 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 +** 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, +** [SQLITE_INTERRUPT], [SQLITE_SCHEMA], [SQLITE_CORRUPT], and so forth) +** can be obtained by calling [sqlite3_reset()] on the +** [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. +** Perhaps it was called on a [prepared statement] that has +** already been [sqlite3_finalize | finalized] or on one that had +** previously returned [SQLITE_ERROR] or [SQLITE_DONE]. Or it could +** be the case that the same database connection is being used by two or +** more threads at the same moment in time. +** +** For all versions of SQLite up to and including 3.6.23.1, a call to +** [sqlite3_reset()] was required after sqlite3_step() returned anything +** other than [SQLITE_ROW] before any subsequent invocation of +** sqlite3_step(). Failure to reset the prepared statement using +** [sqlite3_reset()] would result in an [SQLITE_MISUSE] return from +** sqlite3_step(). But after [version 3.6.23.1] ([dateof:3.6.23.1], +** sqlite3_step() began +** calling [sqlite3_reset()] automatically in this circumstance rather +** than returning [SQLITE_MISUSE]. This is not considered a compatibility +** break because any application that ever receives an SQLITE_MISUSE error +** is broken by definition. The [SQLITE_OMIT_AUTORESET] compile-time option +** can be used to restore the legacy behavior. +** +** Goofy Interface Alert: In the legacy interface, the sqlite3_step() +** API always returns a generic error code, [SQLITE_ERROR], following any +** error other than [SQLITE_BUSY] and [SQLITE_MISUSE]. You must call +** [sqlite3_reset()] or [sqlite3_finalize()] in order to find one of the +** specific [error codes] that better describes the error. +** We admit that this is a goofy design. The problem has been fixed +** with the "v2" interface. If you prepare all of your SQL statements +** using either [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()] instead +** 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. +*/ +SQLITE_API int sqlite3_step(sqlite3_stmt*); + +/* +** CAPI3REF: Number of columns in a result set +** METHOD: sqlite3_stmt +** +** ^The sqlite3_data_count(P) interface returns the number of columns in the +** current row of the result set of [prepared statement] P. +** ^If prepared statement P does not have results ready to return +** (via calls to the [sqlite3_column_int | sqlite3_column_*()] of +** interfaces) then sqlite3_data_count(P) returns 0. +** ^The sqlite3_data_count(P) routine also returns 0 if P is a NULL pointer. +** ^The sqlite3_data_count(P) routine returns 0 if the previous call to +** [sqlite3_step](P) returned [SQLITE_DONE]. ^The sqlite3_data_count(P) +** will return non-zero if previous call to [sqlite3_step](P) returned +** [SQLITE_ROW], except in the case of the [PRAGMA incremental_vacuum] +** where it always returns zero since each step of that multi-step +** pragma returns 0 columns of data. +** +** See also: [sqlite3_column_count()] +*/ +SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Fundamental Datatypes +** KEYWORDS: SQLITE_TEXT +** +** ^(Every value in SQLite has one of five fundamental datatypes: +** +**
        +**
      • 64-bit signed integer +**
      • 64-bit IEEE floating point number +**
      • string +**
      • BLOB +**
      • NULL +**
      )^ +** +** These constants are codes for each of those types. +** +** Note that the SQLITE_TEXT constant was also used in SQLite version 2 +** for a completely different meaning. Software that links against both +** SQLite version 2 and SQLite version 3 should use SQLITE3_TEXT, not +** SQLITE_TEXT. +*/ +#define SQLITE_INTEGER 1 +#define SQLITE_FLOAT 2 +#define SQLITE_BLOB 4 +#define SQLITE_NULL 5 +#ifdef SQLITE_TEXT +# undef SQLITE_TEXT +#else +# define SQLITE_TEXT 3 +#endif +#define SQLITE3_TEXT 3 + +/* +** CAPI3REF: Result Values From A Query +** KEYWORDS: {column access functions} +** METHOD: sqlite3_stmt +** +** ^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. +** ^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. +** These routines may only be called when the most recent call to +** [sqlite3_step()] has returned [SQLITE_ROW] and neither +** [sqlite3_reset()] nor [sqlite3_finalize()] have been called subsequently. +** If any of these routines are called after [sqlite3_reset()] or +** [sqlite3_finalize()] or after [sqlite3_step()] has returned +** something other than [SQLITE_ROW], the results are undefined. +** If [sqlite3_step()] or [sqlite3_reset()] or [sqlite3_finalize()] +** 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 +** [SQLITE_INTEGER | datatype code] for the initial data type +** 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, +** the value returned by sqlite3_column_type() is undefined. Future +** 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() +** routine returns the number of bytes in that BLOB or string. +** ^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 +** [sqlite3_snprintf()] to convert that value to a UTF-8 string and returns +** the number of bytes in that string. +** ^If the result is NULL, then sqlite3_column_bytes() returns zero. +** +** ^If the result is a BLOB or UTF-16 string then the sqlite3_column_bytes16() +** routine returns the number of bytes in that BLOB or string. +** ^If the result is a UTF-8 string, then sqlite3_column_bytes16() converts +** the string to UTF-16 and then returns the number of bytes. +** ^If the result is a numeric value then sqlite3_column_bytes16() uses +** [sqlite3_snprintf()] to convert that value to a UTF-16 string and returns +** the number of bytes in that string. +** ^If the result is NULL, then sqlite3_column_bytes16() returns zero. +** +** ^The values returned by [sqlite3_column_bytes()] and +** [sqlite3_column_bytes16()] do not include the zero terminators at the end +** of the string. ^For clarity: the values returned by +** [sqlite3_column_bytes()] and [sqlite3_column_bytes16()] are 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 +** value from sqlite3_column_blob() for a zero-length BLOB is a NULL pointer. +** +** Warning: ^The object returned by [sqlite3_column_value()] is an +** [unprotected sqlite3_value] object. In a multithreaded environment, +** an unprotected sqlite3_value object may only be used safely with +** [sqlite3_bind_value()] and [sqlite3_result_value()]. +** If the [unprotected sqlite3_value] object returned by +** [sqlite3_column_value()] is used in any other way, including calls +** to routines like [sqlite3_value_int()], [sqlite3_value_text()], +** or [sqlite3_value_bytes()], the behavior is not threadsafe. +** +** 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 +** that are applied: +** +**
      +** +**
      Internal
      Type
      Requested
      Type
      Conversion +** +**
      NULL INTEGER Result is 0 +**
      NULL FLOAT Result is 0.0 +**
      NULL TEXT Result is a NULL pointer +**
      NULL BLOB Result is a NULL pointer +**
      INTEGER FLOAT Convert from integer to float +**
      INTEGER TEXT ASCII rendering of the integer +**
      INTEGER BLOB Same as INTEGER->TEXT +**
      FLOAT INTEGER [CAST] to INTEGER +**
      FLOAT TEXT ASCII rendering of the float +**
      FLOAT BLOB [CAST] to BLOB +**
      TEXT INTEGER [CAST] to INTEGER +**
      TEXT FLOAT [CAST] to REAL +**
      TEXT BLOB No change +**
      BLOB INTEGER [CAST] to INTEGER +**
      BLOB FLOAT [CAST] to REAL +**
      BLOB TEXT Add a zero terminator if needed +**
      +**
      )^ +** +** 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 +** in the following cases: +** +**
        +**
      • The initial content is a BLOB and sqlite3_column_text() or +** sqlite3_column_text16() is called. A zero-terminator might +** need to be added to the string.
      • +**
      • The initial content is UTF-8 text and sqlite3_column_bytes16() or +** sqlite3_column_text16() is called. The content must be converted +** to UTF-16.
      • +**
      • 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 +** not invalidate a prior pointer, though of course the content of the buffer +** that the prior pointer references 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 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 +** into the desired format, then invoke sqlite3_column_bytes() or +** sqlite3_column_bytes16() to find the size of the result. Do not mix calls +** to sqlite3_column_text() or sqlite3_column_blob() with calls to +** 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 +** described above, or until [sqlite3_step()] or [sqlite3_reset()] or +** [sqlite3_finalize()] is called. ^The memory space used to hold strings +** and BLOBs is freed automatically. Do not pass the pointers returned +** from [sqlite3_column_blob()], [sqlite3_column_text()], etc. into +** [sqlite3_free()]. +** +** ^(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].)^ +*/ +SQLITE_API const void *sqlite3_column_blob(sqlite3_stmt*, int iCol); +SQLITE_API int sqlite3_column_bytes(sqlite3_stmt*, int iCol); +SQLITE_API int sqlite3_column_bytes16(sqlite3_stmt*, int iCol); +SQLITE_API double sqlite3_column_double(sqlite3_stmt*, int iCol); +SQLITE_API int sqlite3_column_int(sqlite3_stmt*, int iCol); +SQLITE_API sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol); +SQLITE_API const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol); +SQLITE_API const void *sqlite3_column_text16(sqlite3_stmt*, int iCol); +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 +** DESTRUCTOR: sqlite3_stmt +** +** ^The sqlite3_finalize() function is called to delete a [prepared statement]. +** ^If the most recent evaluation of the statement encountered no errors +** or if the statement is never been evaluated, then sqlite3_finalize() returns +** SQLITE_OK. ^If the most recent evaluation of statement S failed, then +** sqlite3_finalize(S) returns the appropriate [error code] or +** [extended error code]. +** +** ^The sqlite3_finalize(S) routine can be called at any point during +** the life cycle of [prepared statement] S: +** before statement S is ever evaluated, after +** one or more calls to [sqlite3_reset()], or after any call +** to [sqlite3_step()] regardless of whether or not the statement has +** completed execution. +** +** ^Invoking sqlite3_finalize() on a NULL pointer is a harmless no-op. +** +** The application must finalize every [prepared statement] in order to avoid +** resource leaks. It is a grievous error for the application to try to use +** a prepared statement after it has been finalized. Any use of a prepared +** statement after it has been finalized can result in undefined and +** undesirable behavior such as segfaults and heap corruption. +*/ +SQLITE_API int sqlite3_finalize(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Reset A Prepared Statement Object +** METHOD: sqlite3_stmt +** +** 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 +** the [sqlite3_bind_blob | sqlite3_bind_*() API] retain their values. +** Use [sqlite3_clear_bindings()] to reset the bindings. +** +** ^The [sqlite3_reset(S)] interface resets the [prepared statement] S +** back to the beginning of its program. +** +** ^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 indicated an error, then +** [sqlite3_reset(S)] returns an appropriate [error code]. +** +** ^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 +** KEYWORDS: {function creation routines} +** KEYWORDS: {application-defined SQL function} +** KEYWORDS: {application-defined SQL functions} +** METHOD: sqlite3 +** +** ^These 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 differences between +** these routines are the text encoding expected for +** the second parameter (the name of the function being created) +** and the presence or absence of a destructor callback for +** the application data pointer. +** +** ^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 in a UTF-8 +** representation, exclusive of the zero-terminator. ^Note that the name +** length limit is in UTF-8 bytes, not characters nor UTF-16 bytes. +** ^Any attempt to create a function with a longer name +** will result in [SQLITE_MISUSE] being returned. +** +** ^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 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 +** undefined. +** +** ^The fourth parameter, eTextRep, specifies what +** [SQLITE_UTF8 | text encoding] this SQL function prefers for +** its parameters. The application should set this parameter to +** [SQLITE_UTF16LE] if the function implementation invokes +** [sqlite3_value_text16le()] on an input, or [SQLITE_UTF16BE] if the +** implementation invokes [sqlite3_value_text16be()] on an input, or +** [SQLITE_UTF16] if [sqlite3_value_text16()] is used, or [SQLITE_UTF8] +** otherwise. ^The same SQL function may be registered multiple times using +** different preferred text encodings, with different implementations for +** each encoding. +** ^When multiple implementations of the same function are available, SQLite +** will pick the one that involves the least amount of data conversion. +** +** ^The fourth parameter may optionally be ORed with [SQLITE_DETERMINISTIC] +** to signal that the function will always return the same result given +** the same inputs within a single SQL statement. Most SQL functions are +** deterministic. The built-in [random()] SQL function is an example of a +** function that is not deterministic. The SQLite query planner is able to +** perform additional optimizations on deterministic functions, so use +** of the [SQLITE_DETERMINISTIC] flag is recommended where possible. +** +** ^(The fifth parameter is an arbitrary pointer. The implementation of the +** function can gain access to this pointer using [sqlite3_user_data()].)^ +** +** ^The sixth, seventh and eighth 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 must be passed as the xStep and xFinal +** parameters. ^An aggregate SQL function requires an implementation of xStep +** and xFinal and NULL pointer must be passed for xFunc. ^To delete an existing +** SQL function or aggregate, pass NULL pointers for all three function +** callbacks. +** +** ^(If the ninth parameter to sqlite3_create_function_v2() is not NULL, +** then it is destructor for the application data pointer. +** The destructor is invoked when the function is deleted, either by being +** overloaded or when the database connection closes.)^ +** ^The destructor is also invoked if the call to +** sqlite3_create_function_v2() fails. +** ^When the destructor callback of the tenth parameter is invoked, it +** is passed a single argument which is a copy of the application data +** pointer which was the fifth parameter to sqlite3_create_function_v2(). +** +** ^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 +** the implementation that most closely matches the way in which the +** 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 +** 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 +** 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. +** +** ^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. +*/ +SQLITE_API int sqlite3_create_function( + sqlite3 *db, + const char *zFunctionName, + int nArg, + int eTextRep, + void *pApp, + void (*xFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*) +); +SQLITE_API int sqlite3_create_function16( + sqlite3 *db, + const void *zFunctionName, + int nArg, + int eTextRep, + void *pApp, + void (*xFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*) +); +SQLITE_API int sqlite3_create_function_v2( + sqlite3 *db, + const char *zFunctionName, + int nArg, + int eTextRep, + void *pApp, + void (*xFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*), + void(*xDestroy)(void*) +); + +/* +** CAPI3REF: Text Encodings +** +** These constant define integer codes that represent the various +** text encodings supported by SQLite. +*/ +#define SQLITE_UTF8 1 /* IMP: R-37514-35566 */ +#define SQLITE_UTF16LE 2 /* IMP: R-03371-37637 */ +#define SQLITE_UTF16BE 3 /* IMP: R-51971-34154 */ +#define SQLITE_UTF16 4 /* Use native byte order */ +#define SQLITE_ANY 5 /* Deprecated */ +#define SQLITE_UTF16_ALIGNED 8 /* sqlite3_create_collation only */ + +/* +** CAPI3REF: Function Flags +** +** These constants may be ORed together with the +** [SQLITE_UTF8 | preferred text encoding] as the fourth argument +** to [sqlite3_create_function()], [sqlite3_create_function16()], or +** [sqlite3_create_function_v2()]. +*/ +#define SQLITE_DETERMINISTIC 0x800 + +/* +** CAPI3REF: Deprecated Functions +** DEPRECATED +** +** These functions are [deprecated]. In order to maintain +** backwards compatibility with older code, these functions continue +** to be supported. However, new applications should avoid +** the use of these functions. To encourage programmers to avoid +** these functions, we will not explain what they do. +*/ +#ifndef SQLITE_OMIT_DEPRECATED +SQLITE_API SQLITE_DEPRECATED int sqlite3_aggregate_count(sqlite3_context*); +SQLITE_API SQLITE_DEPRECATED int sqlite3_expired(sqlite3_stmt*); +SQLITE_API SQLITE_DEPRECATED int sqlite3_transfer_bindings(sqlite3_stmt*, sqlite3_stmt*); +SQLITE_API SQLITE_DEPRECATED int sqlite3_global_recover(void); +SQLITE_API SQLITE_DEPRECATED void sqlite3_thread_cleanup(void); +SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void(*)(void*,sqlite3_int64,int), + void*,sqlite3_int64); +#endif + +/* +** CAPI3REF: Obtaining SQL Values +** METHOD: sqlite3_value +** +** The C-language implementation of SQL functions and aggregates uses +** this set of interface routines to access the parameter values on +** the function or aggregate. +** +** The xFunc (for scalar functions) or xStep (for aggregates) parameters +** to [sqlite3_create_function()] and [sqlite3_create_function16()] +** define callbacks that implement the SQL functions and aggregates. +** The 3rd parameter to these callbacks is an array of pointers to +** [protected sqlite3_value] objects. There is one [sqlite3_value] object for +** each parameter to the SQL function. These routines are used to +** extract values from the [sqlite3_value] objects. +** +** These routines work only with [protected sqlite3_value] objects. +** 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] +** 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 +** 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 +** 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.)^ +** +** Please pay particular attention to the fact that the pointer returned +** from [sqlite3_value_blob()], [sqlite3_value_text()], or +** [sqlite3_value_text16()] can be invalidated by a subsequent call to +** [sqlite3_value_bytes()], [sqlite3_value_bytes16()], [sqlite3_value_text()], +** or [sqlite3_value_text16()]. +** +** These routines must be called from the same thread as +** the SQL function that supplied the [sqlite3_value*] parameters. +*/ +SQLITE_API const void *sqlite3_value_blob(sqlite3_value*); +SQLITE_API int sqlite3_value_bytes(sqlite3_value*); +SQLITE_API int sqlite3_value_bytes16(sqlite3_value*); +SQLITE_API double sqlite3_value_double(sqlite3_value*); +SQLITE_API int sqlite3_value_int(sqlite3_value*); +SQLITE_API sqlite3_int64 sqlite3_value_int64(sqlite3_value*); +SQLITE_API const unsigned char *sqlite3_value_text(sqlite3_value*); +SQLITE_API const void *sqlite3_value_text16(sqlite3_value*); +SQLITE_API const void *sqlite3_value_text16le(sqlite3_value*); +SQLITE_API const void *sqlite3_value_text16be(sqlite3_value*); +SQLITE_API int sqlite3_value_type(sqlite3_value*); +SQLITE_API int sqlite3_value_numeric_type(sqlite3_value*); + +/* +** CAPI3REF: Finding The Subtype Of SQL Values +** METHOD: sqlite3_value +** +** The sqlite3_value_subtype(V) function returns the subtype for +** an [application-defined SQL function] argument V. The subtype +** information can be used to pass a limited amount of context from +** one SQL function to another. Use the [sqlite3_result_subtype()] +** routine to set the subtype for the return value of an SQL function. +** +** SQLite makes no use of subtype itself. It merely passes the subtype +** from the result of one [application-defined SQL function] into the +** input of another. +*/ +SQLITE_API unsigned int sqlite3_value_subtype(sqlite3_value*); + +/* +** CAPI3REF: Copy And Free SQL Values +** METHOD: sqlite3_value +** +** ^The sqlite3_value_dup(V) interface makes a copy of the [sqlite3_value] +** object D and returns a pointer to that copy. ^The [sqlite3_value] returned +** is a [protected sqlite3_value] object even if the input is not. +** ^The sqlite3_value_dup(V) interface returns NULL if V is NULL or if a +** memory allocation fails. +** +** ^The sqlite3_value_free(V) interface frees an [sqlite3_value] object +** previously obtained from [sqlite3_value_dup()]. ^If V is a NULL pointer +** then sqlite3_value_free(V) is a harmless no-op. +*/ +SQLITE_API sqlite3_value *sqlite3_value_dup(const sqlite3_value*); +SQLITE_API void sqlite3_value_free(sqlite3_value*); + +/* +** CAPI3REF: Obtain Aggregate Function Context +** METHOD: sqlite3_context +** +** Implementations 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 sqlite3_aggregate_context(C,N) routine returns a NULL pointer +** when first called if N is less than or equal to zero or if a memory +** allocate error occurs. +** +** ^(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.)^ Within the xFinal callback, it is customary to set +** N=0 in calls to sqlite3_aggregate_context(C,N) so that no +** pointless memory allocations occur. +** +** ^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 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. +*/ +SQLITE_API void *sqlite3_aggregate_context(sqlite3_context*, int nBytes); + +/* +** CAPI3REF: User Data For Functions +** METHOD: sqlite3_context +** +** ^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. +** +** This routine must be called from the same thread in which +** the application-defined function is running. +*/ +SQLITE_API void *sqlite3_user_data(sqlite3_context*); + +/* +** CAPI3REF: Database Connection For Functions +** METHOD: sqlite3_context +** +** ^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. +*/ +SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context*); + +/* +** CAPI3REF: Function Auxiliary Data +** METHOD: sqlite3_context +** +** These functions may be used by (non-aggregate) SQL functions to +** associate metadata with argument values. If the same value is passed to +** multiple invocations of the same SQL function during query execution, under +** some circumstances the associated metadata may be preserved. An example +** of where this might be useful is in a regular-expression matching +** function. The compiled version of the regular expression can be stored as +** metadata associated with the pattern string. +** Then as long as the pattern string remains the same, +** the compiled regular expression can be reused on multiple +** invocations of the same function. +** +** ^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 there is no metadata +** associated with the function argument, this sqlite3_get_auxdata() interface +** returns a NULL pointer. +** +** ^The sqlite3_set_auxdata(C,N,P,X) interface saves P as metadata for the N-th +** argument of the application-defined function. ^Subsequent +** calls to sqlite3_get_auxdata(C,N) return P from the most recent +** sqlite3_set_auxdata(C,N,P,X) call if the metadata is still valid or +** NULL if the metadata has been discarded. +** ^After each call to sqlite3_set_auxdata(C,N,P,X) where X is not NULL, +** SQLite will invoke the destructor function X with parameter P exactly +** once, when the metadata is discarded. +** SQLite is free to discard the metadata at any time, including:
        +**
      • ^(when the corresponding function parameter changes)^, or +**
      • ^(when [sqlite3_reset()] or [sqlite3_finalize()] is called for the +** SQL statement)^, or +**
      • ^(when sqlite3_set_auxdata() is invoked again on the same +** parameter)^, or +**
      • ^(during the original sqlite3_set_auxdata() call when a memory +** allocation error occurs.)^
      +** +** Note the last bullet in particular. The destructor X in +** sqlite3_set_auxdata(C,N,P,X) might be called immediately, before the +** sqlite3_set_auxdata() interface even returns. Hence sqlite3_set_auxdata() +** should be called near the end of the function implementation and the +** function implementation should not make any use of P after +** sqlite3_set_auxdata() has been called. +** +** ^(In practice, metadata is preserved between function calls for +** function parameters that are compile-time constants, including literal +** values and [parameters] and expressions composed from the same.)^ +** +** These routines must be called from the same thread in which +** the SQL function is running. +*/ +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 +** +** These are special values for the destructor that is passed in as the +** 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 +** 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. +** +** The typedef is necessary to work around problems in certain +** C++ compilers. +*/ +typedef void (*sqlite3_destructor_type)(void*); +#define SQLITE_STATIC ((sqlite3_destructor_type)0) +#define SQLITE_TRANSIENT ((sqlite3_destructor_type)-1) + +/* +** CAPI3REF: Setting The Result Of An SQL Function +** METHOD: sqlite3_context +** +** These routines are used by the xFunc or xFinal callbacks that +** implement SQL functions and aggregates. See +** [sqlite3_create_function()] and [sqlite3_create_function16()] +** for additional information. +** +** These functions work very much like the [parameter binding] family of +** 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 +** 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(C,N) and sqlite3_result_zeroblob64(C,N) +** interfaces set the result of the application-defined function to be +** a BLOB containing all zero bytes and N bytes in size. +** +** ^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 +** cause the implemented SQL function to throw an exception. +** ^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 +** interprets the string from sqlite3_result_error16() as UTF-16 in native +** 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 +** 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() +** 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() +** or sqlite3_result_error16() resets the error code to SQLITE_ERROR. +** +** ^The sqlite3_result_error_toobig() interface causes SQLite to throw an +** error indicating that a string or BLOB is too long to represent. +** +** ^The sqlite3_result_error_nomem() interface causes SQLite to throw an +** error indicating that a memory allocation failed. +** +** ^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 +** 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 +** of the application-defined function to be NULL. +** +** ^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. +** ^The sqlite3_result_text64() interface sets the return value of an +** application-defined function to be a text string in an encoding +** specified by the fifth (and last) parameter, which must be one +** of [SQLITE_UTF8], [SQLITE_UTF16], [SQLITE_UTF16BE], or [SQLITE_UTF16LE]. +** ^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 +** 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 +** 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 3rd parameter is non-negative, then it +** must be the byte offset into the string where the NUL terminator would +** appear if the string where NUL terminated. If any NUL characters occur +** in the string at a byte offset that is less than the value of the 3rd +** parameter, then the resulting string will contain embedded NULs and the +** result of expressions operating on strings with embedded NULs is undefined. +** ^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 +** 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 +** 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 application-defined function to be a copy of 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 +** [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. +*/ +SQLITE_API void sqlite3_result_blob(sqlite3_context*, const void*, int, void(*)(void*)); +SQLITE_API void sqlite3_result_blob64(sqlite3_context*,const void*, + sqlite3_uint64,void(*)(void*)); +SQLITE_API void sqlite3_result_double(sqlite3_context*, double); +SQLITE_API void sqlite3_result_error(sqlite3_context*, const char*, int); +SQLITE_API void sqlite3_result_error16(sqlite3_context*, const void*, int); +SQLITE_API void sqlite3_result_error_toobig(sqlite3_context*); +SQLITE_API void sqlite3_result_error_nomem(sqlite3_context*); +SQLITE_API void sqlite3_result_error_code(sqlite3_context*, int); +SQLITE_API void sqlite3_result_int(sqlite3_context*, int); +SQLITE_API void sqlite3_result_int64(sqlite3_context*, sqlite3_int64); +SQLITE_API void sqlite3_result_null(sqlite3_context*); +SQLITE_API void sqlite3_result_text(sqlite3_context*, const char*, int, void(*)(void*)); +SQLITE_API void sqlite3_result_text64(sqlite3_context*, const char*,sqlite3_uint64, + void(*)(void*), unsigned char encoding); +SQLITE_API void sqlite3_result_text16(sqlite3_context*, const void*, int, void(*)(void*)); +SQLITE_API void sqlite3_result_text16le(sqlite3_context*, const void*, int,void(*)(void*)); +SQLITE_API void sqlite3_result_text16be(sqlite3_context*, const void*, int,void(*)(void*)); +SQLITE_API void sqlite3_result_value(sqlite3_context*, sqlite3_value*); +SQLITE_API void sqlite3_result_zeroblob(sqlite3_context*, int n); +SQLITE_API int sqlite3_result_zeroblob64(sqlite3_context*, sqlite3_uint64 n); + + +/* +** CAPI3REF: Setting The Subtype Of An SQL Function +** METHOD: sqlite3_context +** +** The sqlite3_result_subtype(C,T) function causes the subtype of +** the result from the [application-defined SQL function] with +** [sqlite3_context] C to be the value T. Only the lower 8 bits +** of the subtype T are preserved in current versions of SQLite; +** higher order bits are discarded. +** The number of subtype bytes preserved by SQLite might increase +** in future releases of SQLite. +*/ +SQLITE_API void sqlite3_result_subtype(sqlite3_context*,unsigned int); + +/* +** CAPI3REF: Define New Collating Sequences +** METHOD: sqlite3 +** +** ^These functions add, remove, or modify a [collation] associated +** with the [database connection] specified as the first argument. +** +** ^The name of the collation is a UTF-8 string +** for sqlite3_create_collation() and sqlite3_create_collation_v2() +** and a UTF-16 string in native byte order for sqlite3_create_collation16(). +** ^Collation names that compare equal according to [sqlite3_strnicmp()] are +** considered to be the same name. +** +** ^(The third argument (eTextRep) must be one of the constants: +**
        +**
      • [SQLITE_UTF8], +**
      • [SQLITE_UTF16LE], +**
      • [SQLITE_UTF16BE], +**
      • [SQLITE_UTF16], or +**
      • [SQLITE_UTF16_ALIGNED]. +**
      )^ +** ^The eTextRep argument determines the encoding of strings passed +** to the collating function callback, xCallback. +** ^The [SQLITE_UTF16] and [SQLITE_UTF16_ALIGNED] values for eTextRep +** force strings to be UTF16 with native byte order. +** ^The [SQLITE_UTF16_ALIGNED] value for eTextRep forces strings to begin +** on an even byte address. +** +** ^The fourth argument, pArg, is an application data pointer that is passed +** through as the first argument to the collating function callback. +** +** ^The fifth argument, xCallback, is a pointer to the collating function. +** ^Multiple collating functions can be registered using the same name but +** with different eTextRep parameters and SQLite will use whichever +** function requires the least amount of data transformation. +** ^If the xCallback argument is NULL then the collating function is +** deleted. ^When all collating functions having the same name are deleted, +** that collation is no longer usable. +** +** ^The collating function callback is invoked with a copy of the pArg +** application data pointer and with two strings in the encoding specified +** by the eTextRep argument. The collating function must return an +** integer that is negative, zero, or positive +** if the first string is less than, equal to, or greater than the second, +** respectively. A collating function must always return the same answer +** given the same inputs. If two or more collating functions are registered +** to the same collation name (using different eTextRep values) then all +** must give an equivalent answer when invoked with equivalent strings. +** The collating function must obey the following properties for all +** strings A, B, and C: +** +**
        +**
      1. If A==B then B==A. +**
      2. If A==B and B==C then A==C. +**
      3. If A<B THEN B>A. +**
      4. If A<B and B<C then A<C. +**
      +** +** If a collating function fails any of the above constraints and that +** collating function is registered and used, then the behavior of SQLite +** is undefined. +** +** ^The sqlite3_create_collation_v2() works like sqlite3_create_collation() +** with the addition that the xDestroy callback is invoked on pArg when +** the collating function is deleted. +** ^Collating functions are deleted when they are overridden by later +** calls to the collation creation functions or when the +** [database connection] is closed using [sqlite3_close()]. +** +** ^The xDestroy callback is not called if the +** sqlite3_create_collation_v2() function fails. Applications that invoke +** sqlite3_create_collation_v2() with a non-NULL xDestroy argument should +** check the return code and dispose of the application data pointer +** themselves rather than expecting SQLite to deal with it for them. +** This is different from every other SQLite interface. The inconsistency +** is unfortunate but cannot be changed without breaking backwards +** compatibility. +** +** See also: [sqlite3_collation_needed()] and [sqlite3_collation_needed16()]. +*/ +SQLITE_API int sqlite3_create_collation( + sqlite3*, + const char *zName, + int eTextRep, + void *pArg, + int(*xCompare)(void*,int,const void*,int,const void*) +); +SQLITE_API int sqlite3_create_collation_v2( + sqlite3*, + const char *zName, + int eTextRep, + void *pArg, + int(*xCompare)(void*,int,const void*,int,const void*), + void(*xDestroy)(void*) +); +SQLITE_API int sqlite3_create_collation16( + sqlite3*, + const void *zName, + int eTextRep, + void *pArg, + int(*xCompare)(void*,int,const void*,int,const void*) +); + +/* +** CAPI3REF: Collation Needed Callbacks +** METHOD: sqlite3 +** +** ^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 invoked whenever an undefined collation +** sequence is required. +** +** ^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. ^If sqlite3_collation_needed16() is used, +** the names are passed as UTF-16 in machine native byte order. +** ^A call to either function replaces the existing collation-needed callback. +** +** ^(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.)^ +** +** The callback function should register the desired collation using +** [sqlite3_create_collation()], [sqlite3_create_collation16()], or +** [sqlite3_create_collation_v2()]. +*/ +SQLITE_API int sqlite3_collation_needed( + sqlite3*, + void*, + void(*)(void*,sqlite3*,int eTextRep,const char*) +); +SQLITE_API int sqlite3_collation_needed16( + sqlite3*, + void*, + void(*)(void*,sqlite3*,int eTextRep,const void*) +); + +#ifdef SQLITE_HAS_CODEC +/* +** Specify the key for an encrypted database. This routine should be +** called right after sqlite3_open(). +** +** The code to implement this API is not available in the public release +** of SQLite. +*/ +SQLITE_API int sqlite3_key( + sqlite3 *db, /* Database to be rekeyed */ + const void *pKey, int nKey /* The key */ +); +SQLITE_API int sqlite3_key_v2( + sqlite3 *db, /* Database to be rekeyed */ + const char *zDbName, /* Name of the database */ + const void *pKey, int nKey /* The key */ +); + +/* +** Change the key on an open database. If the current database is not +** encrypted, this routine will encrypt it. If pNew==0 or nNew==0, the +** database is decrypted. +** +** The code to implement this API is not available in the public release +** of SQLite. +*/ +SQLITE_API int sqlite3_rekey( + sqlite3 *db, /* Database to be rekeyed */ + const void *pKey, int nKey /* The new key */ +); +SQLITE_API int sqlite3_rekey_v2( + sqlite3 *db, /* Database to be rekeyed */ + const char *zDbName, /* Name of the database */ + const void *pKey, int nKey /* The new key */ +); + +/* +** Specify the activation key for a SEE database. Unless +** activated, none of the SEE routines will work. +*/ +SQLITE_API void sqlite3_activate_see( + const char *zPassPhrase /* Activation phrase */ +); +#endif + +#ifdef SQLITE_ENABLE_CEROD +/* +** Specify the activation key for a CEROD database. Unless +** activated, none of the CEROD routines will work. +*/ +SQLITE_API void sqlite3_activate_cerod( + const char *zPassPhrase /* Activation phrase */ +); +#endif + +/* +** CAPI3REF: Suspend Execution For A Short Time +** +** 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 +** millisecond time resolution, then the time will be rounded up to +** 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() +** method of the default [sqlite3_vfs] object. If the xSleep() method +** of the default VFS is not implemented correctly, or not implemented at +** all, then the behavior of sqlite3_sleep() may deviate from the description +** in the previous paragraphs. +*/ +SQLITE_API int sqlite3_sleep(int); + +/* +** CAPI3REF: Name Of The Folder Holding Temporary Files +** +** ^(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 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. +** +** Applications are strongly discouraged from using this global variable. +** It is required to set a temporary folder on Windows Runtime (WinRT). +** But for all other platforms, it is highly recommended that applications +** neither read nor write this variable. This global variable is a relic +** that exists for backwards compatibility of legacy applications and should +** be avoided in new projects. +** +** It is not safe to read or modify this variable in more than one +** thread at a time. It is not safe to read or modify this variable +** if a [database connection] is being used at the same time in a separate +** thread. +** It is intended that this variable be set once +** as part of process initialization and before any SQLite interface +** 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] 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 +** using [sqlite3_free]. +** Hence, if this variable is modified directly, either it should be +** made NULL or made to point to memory obtained from [sqlite3_malloc] +** or else the use of the [temp_store_directory pragma] should be avoided. +** Except when requested by the [temp_store_directory pragma], SQLite +** does not free the memory that sqlite3_temp_directory points to. If +** the application wants that memory to be freed, it must do +** so itself, taking care to only do so after all [database connection] +** objects have been destroyed. +** +** Note to Windows Runtime users: The temporary directory must be set +** prior to calling [sqlite3_open] or [sqlite3_open_v2]. Otherwise, various +** features that require the use of temporary files may fail. Here is an +** example of how to do this using C++ with the Windows Runtime: +** +**
      +** LPCWSTR zPath = Windows::Storage::ApplicationData::Current->
      +**       TemporaryFolder->Path->Data();
      +** char zPathBuf[MAX_PATH + 1];
      +** memset(zPathBuf, 0, sizeof(zPathBuf));
      +** WideCharToMultiByte(CP_UTF8, 0, zPath, -1, zPathBuf, sizeof(zPathBuf),
      +**       NULL, NULL);
      +** sqlite3_temp_directory = sqlite3_mprintf("%s", zPathBuf);
      +** 
      +*/ +SQLITE_API char *sqlite3_temp_directory; + +/* +** CAPI3REF: Name Of The Folder Holding Database Files +** +** ^(If this global variable is made to point to a string which is +** the name of a folder (a.k.a. directory), then all database files +** specified with a relative pathname and created or accessed by +** SQLite when using a built-in windows [sqlite3_vfs | VFS] will be assumed +** to be relative to that directory.)^ ^If this variable is a NULL +** pointer, then SQLite assumes that all database files specified +** with a relative pathname are relative to the current directory +** for the process. Only the windows VFS makes use of this global +** variable; it is ignored by the unix VFS. +** +** Changing the value of this variable while a database connection is +** open can result in a corrupt database. +** +** It is not safe to read or modify this variable in more than one +** thread at a time. It is not safe to read or modify this variable +** if a [database connection] is being used at the same time in a separate +** thread. +** It is intended that this variable be set once +** as part of process initialization and before any SQLite interface +** routines have been called and that this variable remain unchanged +** thereafter. +** +** ^The [data_store_directory pragma] may modify this variable and cause +** it to point to memory obtained from [sqlite3_malloc]. ^Furthermore, +** the [data_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 +** using [sqlite3_free]. +** Hence, if this variable is modified directly, either it should be +** made NULL or made to point to memory obtained from [sqlite3_malloc] +** or else the use of the [data_store_directory pragma] should be avoided. +*/ +SQLITE_API char *sqlite3_data_directory; + +/* +** CAPI3REF: Test For Auto-Commit Mode +** KEYWORDS: {autocommit mode} +** METHOD: sqlite3 +** +** ^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]. +** +** If certain kinds of errors occur on a statement within a multi-statement +** transaction (errors including [SQLITE_FULL], [SQLITE_IOERR], +** [SQLITE_NOMEM], [SQLITE_BUSY], and [SQLITE_INTERRUPT]) then the +** transaction might be rolled back automatically. The only way to +** find out whether SQLite automatically rolled back the transaction after +** an error is to use this function. +** +** If another thread changes the autocommit status of the database +** connection while this routine is running, then the return value +** is undefined. +*/ +SQLITE_API int sqlite3_get_autocommit(sqlite3*); + +/* +** CAPI3REF: Find The Database Handle Of A Prepared Statement +** METHOD: sqlite3_stmt +** +** ^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. +*/ +SQLITE_API sqlite3 *sqlite3_db_handle(sqlite3_stmt*); + +/* +** CAPI3REF: Return The Filename For A Database Connection +** METHOD: sqlite3 +** +** ^The sqlite3_db_filename(D,N) interface returns a pointer to a filename +** associated with database N of connection D. ^The main database file +** has the name "main". If there is no attached database N on the database +** connection D, or if database N is a temporary or in-memory database, then +** a NULL pointer is returned. +** +** ^The filename returned by this function is the output of the +** xFullPathname method of the [VFS]. ^In other words, the filename +** will be an absolute pathname, even if the filename used +** to open the database originally was a URI or relative pathname. +*/ +SQLITE_API const char *sqlite3_db_filename(sqlite3 *db, const char *zDbName); + +/* +** CAPI3REF: Determine if a database is read-only +** METHOD: sqlite3 +** +** ^The sqlite3_db_readonly(D,N) interface returns 1 if the database N +** of connection D is read-only, 0 if it is read/write, or -1 if N is not +** the name of a database on connection D. +*/ +SQLITE_API int sqlite3_db_readonly(sqlite3 *db, const char *zDbName); + +/* +** CAPI3REF: Find the next prepared statement +** METHOD: sqlite3 +** +** ^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 +** 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. +*/ +SQLITE_API sqlite3_stmt *sqlite3_next_stmt(sqlite3 *pDb, sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Commit And Rollback Notification Callbacks +** METHOD: sqlite3 +** +** ^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() +** for the same database connection is overridden. +** ^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_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, +** then the commit is converted into a rollback. +** +** ^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 commit and rollback hook callbacks are not reentrant. +** The callback implementation must not do anything that will modify +** the database connection that invoked the callback. Any actions +** to modify the database connection must be deferred until after the +** completion of the [sqlite3_step()] call that triggered the commit +** or rollback hook in the first place. +** Note that running any other SQL statements, including SELECT statements, +** or merely calling [sqlite3_prepare_v2()] and [sqlite3_step()] will modify +** the database connections for the meaning of "modify" in this paragraph. +** +** ^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 +** returns non-zero, then the [COMMIT] is converted into a [ROLLBACK]. +** ^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 +** 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 +** automatically rolled back because the database connection is closed. +** +** See also the [sqlite3_update_hook()] interface. +*/ +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 +** METHOD: sqlite3 +** +** ^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 in +** a [rowid table]. +** ^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 +** row is updated, inserted or deleted in a rowid table. +** ^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], +** 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 +** 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 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 [WITHOUT ROWID] tables are modified. +** +** ^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 +** invoked when rows are deleted using the [truncate optimization]. +** The exceptions defined in this paragraph might change in a future +** release of SQLite. +** +** The update hook implementation must not do anything that will modify +** the database connection that invoked the update hook. Any actions +** to modify the database connection must be deferred until after the +** completion of the [sqlite3_step()] call that triggered the update hook. +** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their +** database connections for the meaning of "modify" in this paragraph. +** +** ^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()], [sqlite3_rollback_hook()], +** and [sqlite3_preupdate_hook()] interfaces. +*/ +SQLITE_API void *sqlite3_update_hook( + sqlite3*, + void(*)(void *,int ,char const *,char const *,sqlite3_int64), + void* +); + +/* +** CAPI3REF: Enable Or Disable Shared Pager 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.)^ +** +** ^Cache sharing is enabled and disabled for an entire process. +** This is a change as of SQLite [version 3.5.0] ([dateof: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 +** 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.)^ +** +** ^(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 +** future releases of SQLite. Applications that care about shared +** cache setting should set it explicitly. +** +** Note: This method is disabled on MacOS X 10.7 and iOS version 5.0 +** and will always return SQLITE_MISUSE. On those systems, +** shared cache mode should be enabled per-database connection via +** [sqlite3_open_v2()] with [SQLITE_OPEN_SHAREDCACHE]. +** +** This interface is threadsafe on processors where writing a +** 32-bit integer is atomic. +** +** See Also: [SQLite Shared-Cache Mode] +*/ +SQLITE_API int sqlite3_enable_shared_cache(int); + +/* +** CAPI3REF: Attempt To Free Heap Memory +** +** ^The sqlite3_release_memory() interface attempts to free N bytes +** of heap memory by deallocating non-essential memory allocations +** 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, +** which might be more or less than the amount requested. +** ^The sqlite3_release_memory() routine is a no-op returning zero +** if SQLite is not compiled with [SQLITE_ENABLE_MEMORY_MANAGEMENT]. +** +** See also: [sqlite3_db_release_memory()] +*/ +SQLITE_API int sqlite3_release_memory(int); + +/* +** CAPI3REF: Free Memory Used By A Database Connection +** METHOD: sqlite3 +** +** ^The sqlite3_db_release_memory(D) interface attempts to free as much heap +** memory as possible from database connection D. Unlike the +** [sqlite3_release_memory()] interface, this interface is in effect even +** when the [SQLITE_ENABLE_MEMORY_MANAGEMENT] compile-time option is +** omitted. +** +** See also: [sqlite3_release_memory()] +*/ +SQLITE_API int sqlite3_db_release_memory(sqlite3*); + +/* +** CAPI3REF: Impose A Limit On Heap Size +** +** ^The sqlite3_soft_heap_limit64() interface sets and/or queries the +** soft limit on the amount of heap memory that may be allocated by SQLite. +** ^SQLite strives to keep heap memory utilization below the soft heap +** limit by reducing the number of pages held in the page cache +** as heap memory usages approaches the limit. +** ^The soft heap limit is "soft" because even though SQLite strives to stay +** below the limit, it will exceed the limit rather than generate +** an [SQLITE_NOMEM] error. In other words, the soft heap limit +** is advisory only. +** +** ^The return value from sqlite3_soft_heap_limit64() is the size of +** the soft heap limit prior to the call, or negative in the case of an +** error. ^If the argument N is negative +** then no change is made to the soft heap limit. Hence, the current +** size of the soft heap limit can be determined by invoking +** sqlite3_soft_heap_limit64() with a negative argument. +** +** ^If the argument N is zero then the soft heap limit is disabled. +** +** ^(The soft heap limit is not enforced in the current implementation +** if one or more of following conditions are true: +** +**
        +**
      • The soft heap limit is set to zero. +**
      • Memory accounting is disabled using a combination of the +** [sqlite3_config]([SQLITE_CONFIG_MEMSTATUS],...) start-time option and +** the [SQLITE_DEFAULT_MEMSTATUS] compile-time option. +**
      • An alternative page cache implementation is specified using +** [sqlite3_config]([SQLITE_CONFIG_PCACHE2],...). +**
      • The page cache allocates from its own memory pool supplied +** by [sqlite3_config]([SQLITE_CONFIG_PAGECACHE],...) rather than +** from the heap. +**
      )^ +** +** Beginning with SQLite [version 3.7.3] ([dateof:3.7.3]), +** the soft heap limit is enforced +** regardless of whether or not the [SQLITE_ENABLE_MEMORY_MANAGEMENT] +** compile-time option is invoked. With [SQLITE_ENABLE_MEMORY_MANAGEMENT], +** the soft heap limit is enforced on every memory allocation. Without +** [SQLITE_ENABLE_MEMORY_MANAGEMENT], the soft heap limit is only enforced +** when memory is allocated by the page cache. Testing suggests that because +** the page cache is the predominate memory user in SQLite, most +** applications will achieve adequate soft heap limit enforcement without +** the use of [SQLITE_ENABLE_MEMORY_MANAGEMENT]. +** +** The circumstances under which SQLite will enforce the soft heap limit may +** changes in future releases of SQLite. +*/ +SQLITE_API sqlite3_int64 sqlite3_soft_heap_limit64(sqlite3_int64 N); + +/* +** CAPI3REF: Deprecated Soft Heap Limit Interface +** DEPRECATED +** +** This is a deprecated version of the [sqlite3_soft_heap_limit64()] +** interface. This routine is provided for historical compatibility +** only. All new applications should use the +** [sqlite3_soft_heap_limit64()] interface rather than this one. +*/ +SQLITE_API SQLITE_DEPRECATED void sqlite3_soft_heap_limit(int N); + + +/* +** CAPI3REF: Extract Metadata About A Column Of A Table +** METHOD: sqlite3 +** +** ^(The sqlite3_table_column_metadata(X,D,T,C,....) routine returns +** information about column C of table T in database D +** on [database connection] X.)^ ^The sqlite3_table_column_metadata() +** interface returns SQLITE_OK and fills in the non-NULL pointers in +** the final five arguments with appropriate values if the specified +** column exists. ^The sqlite3_table_column_metadata() interface returns +** SQLITE_ERROR and if the specified column does not exist. +** ^If the column-name parameter to sqlite3_table_column_metadata() is a +** NULL pointer, then this routine simply checks for the existence of the +** table and returns SQLITE_OK if the table exists and SQLITE_ERROR if it +** does not. +** +** ^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 +** name of the desired column, respectively. +** +** ^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 +** +**
      5th const char* Data type +**
      6th const char* Name of default collation sequence +**
      7th int True if column has a NOT NULL constraint +**
      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 +** declaration type and collation sequence is valid 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 column is "rowid", "oid" or "_rowid_" and the table +** is not a [WITHOUT ROWID] table 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 +** [INTEGER PRIMARY KEY] column, then the outputs +** for the [rowid] are set as follows: +** +**
      +**     data type: "INTEGER"
      +**     collation sequence: "BINARY"
      +**     not null: 0
      +**     primary key: 1
      +**     auto increment: 0
      +** 
      )^ +** +** ^This function causes all database schemas to be read from disk and +** parsed, if that has not already been done, and returns an error if +** any errors are encountered while loading the schema. +*/ +SQLITE_API int sqlite3_table_column_metadata( + sqlite3 *db, /* Connection handle */ + const char *zDbName, /* Database name or NULL */ + const char *zTableName, /* Table name */ + const char *zColumnName, /* Column name */ + char const **pzDataType, /* OUTPUT: Declared data type */ + char const **pzCollSeq, /* OUTPUT: Collation sequence name */ + int *pNotNull, /* OUTPUT: True if NOT NULL constraint exists */ + int *pPrimaryKey, /* OUTPUT: True if column part of PK */ + int *pAutoinc /* OUTPUT: True if column is auto-increment */ +); + +/* +** CAPI3REF: Load An Extension +** METHOD: sqlite3 +** +** ^This interface loads an SQLite extension library from the named file. +** +** ^The sqlite3_load_extension() interface attempts to load an +** [SQLite extension] library contained in the file zFile. If +** the file cannot be loaded directly, attempts are made to load +** with various operating-system specific extensions added. +** So for example, if "samplelib" cannot be loaded, then names like +** "samplelib.so" or "samplelib.dylib" or "samplelib.dll" might +** be tried also. +** +** ^The entry point is zProc. +** ^(zProc may be 0, in which case SQLite will try to come up with an +** entry point name on its own. It first tries "sqlite3_extension_init". +** If that does not work, it constructs a name "sqlite3_X_init" where the +** X is consists of the lower-case equivalent of all ASCII alphabetic +** characters in the filename from the last "/" to the first following +** "." and omitting any initial "lib".)^ +** ^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()]. +** +** ^Extension loading must be enabled using +** [sqlite3_enable_load_extension()] or +** [sqlite3_db_config](db,[SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION],1,NULL) +** prior to calling this API, +** otherwise an error will be returned. +** +** Security warning: It is recommended that the +** [SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION] method be used to enable only this +** interface. The use of the [sqlite3_enable_load_extension()] interface +** should be avoided. This will keep the SQL function [load_extension()] +** disabled and prevent SQL injections from giving attackers +** access to extension loading capabilities. +** +** See also the [load_extension() SQL function]. +*/ +SQLITE_API int sqlite3_load_extension( + sqlite3 *db, /* Load the extension into this database connection */ + const char *zFile, /* Name of the shared library containing extension */ + const char *zProc, /* Entry point. Derived from zFile if 0 */ + char **pzErrMsg /* Put error message here if not 0 */ +); + +/* +** CAPI3REF: Enable Or Disable Extension Loading +** METHOD: sqlite3 +** +** ^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. +** ^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. +** +** ^This interface enables or disables both the C-API +** [sqlite3_load_extension()] and the SQL function [load_extension()]. +** ^(Use [sqlite3_db_config](db,[SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION],..) +** to enable or disable only the C-API.)^ +** +** Security warning: It is recommended that extension loading +** be disabled using the [SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION] method +** rather than this interface, so the [load_extension()] SQL function +** remains disabled. This will prevent SQL injections from giving attackers +** access to extension loading capabilities. +*/ +SQLITE_API int sqlite3_enable_load_extension(sqlite3 *db, int onoff); + +/* +** CAPI3REF: Automatically Load Statically Linked Extensions +** +** ^This interface causes the xEntryPoint() function to be invoked for +** each new [database connection] that is created. The idea here is that +** xEntryPoint() is the entry point for a statically linked [SQLite extension] +** that is to be automatically loaded into all new database connections. +** +** ^(Even though the function prototype shows that xEntryPoint() takes +** no arguments and returns void, SQLite invokes xEntryPoint() with three +** arguments and expects an integer result as if the signature of the +** entry point where as follows: +** +**
      +**    int xEntryPoint(
      +**      sqlite3 *db,
      +**      const char **pzErrMsg,
      +**      const struct sqlite3_api_routines *pThunk
      +**    );
      +** 
      )^ +** +** If the xEntryPoint routine encounters an error, it should make *pzErrMsg +** point to an appropriate error message (obtained from [sqlite3_mprintf()]) +** and return an appropriate [error code]. ^SQLite ensures that *pzErrMsg +** is NULL before calling the xEntryPoint(). ^SQLite will invoke +** [sqlite3_free()] on *pzErrMsg after xEntryPoint() returns. ^If any +** xEntryPoint() returns an error, the [sqlite3_open()], [sqlite3_open16()], +** or [sqlite3_open_v2()] call that provoked the xEntryPoint() will fail. +** +** ^Calling sqlite3_auto_extension(X) with an entry point X that is already +** on the list of automatic extensions is a harmless no-op. ^No entry point +** will be called more than once for each database connection that is opened. +** +** See also: [sqlite3_reset_auto_extension()] +** and [sqlite3_cancel_auto_extension()] +*/ +SQLITE_API int sqlite3_auto_extension(void(*xEntryPoint)(void)); + +/* +** CAPI3REF: Cancel Automatic Extension Loading +** +** ^The [sqlite3_cancel_auto_extension(X)] interface unregisters the +** initialization routine X that was registered using a prior call to +** [sqlite3_auto_extension(X)]. ^The [sqlite3_cancel_auto_extension(X)] +** routine returns 1 if initialization routine X was successfully +** unregistered and it returns 0 if X was not on the list of initialization +** routines. +*/ +SQLITE_API int sqlite3_cancel_auto_extension(void(*xEntryPoint)(void)); + +/* +** CAPI3REF: Reset Automatic Extension Loading +** +** ^This interface disables all automatic extensions previously +** registered using [sqlite3_auto_extension()]. +*/ +SQLITE_API void sqlite3_reset_auto_extension(void); + +/* +** The interface to the virtual-table mechanism is currently considered +** to be experimental. The interface might change in incompatible ways. +** If this is a problem for you, do not use the interface at this time. +** +** When the virtual-table mechanism stabilizes, we will declare the +** interface fixed, support it indefinitely, and remove this comment. +*/ + +/* +** Structures used by the virtual table interface +*/ +typedef struct sqlite3_vtab sqlite3_vtab; +typedef struct sqlite3_index_info sqlite3_index_info; +typedef struct sqlite3_vtab_cursor sqlite3_vtab_cursor; +typedef struct sqlite3_module sqlite3_module; + +/* +** CAPI3REF: Virtual Table Object +** KEYWORDS: sqlite3_module {virtual table module} +** +** This structure, sometimes called a "virtual table 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 +** 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 +** module or until the [database connection] closes. The content +** of this structure must not change while it is registered with +** any database connection. +*/ +struct sqlite3_module { + int iVersion; + int (*xCreate)(sqlite3*, void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVTab, char**); + int (*xConnect)(sqlite3*, void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVTab, char**); + int (*xBestIndex)(sqlite3_vtab *pVTab, sqlite3_index_info*); + int (*xDisconnect)(sqlite3_vtab *pVTab); + int (*xDestroy)(sqlite3_vtab *pVTab); + int (*xOpen)(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor); + int (*xClose)(sqlite3_vtab_cursor*); + int (*xFilter)(sqlite3_vtab_cursor*, int idxNum, const char *idxStr, + int argc, sqlite3_value **argv); + int (*xNext)(sqlite3_vtab_cursor*); + int (*xEof)(sqlite3_vtab_cursor*); + int (*xColumn)(sqlite3_vtab_cursor*, sqlite3_context*, int); + int (*xRowid)(sqlite3_vtab_cursor*, sqlite3_int64 *pRowid); + int (*xUpdate)(sqlite3_vtab *, int, sqlite3_value **, sqlite3_int64 *); + int (*xBegin)(sqlite3_vtab *pVTab); + int (*xSync)(sqlite3_vtab *pVTab); + int (*xCommit)(sqlite3_vtab *pVTab); + int (*xRollback)(sqlite3_vtab *pVTab); + int (*xFindFunction)(sqlite3_vtab *pVtab, int nArg, const char *zName, + void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), + void **ppArg); + int (*xRename)(sqlite3_vtab *pVtab, const char *zNew); + /* The methods above are in version 1 of the sqlite_module object. Those + ** below are for version 2 and greater. */ + int (*xSavepoint)(sqlite3_vtab *pVTab, int); + int (*xRelease)(sqlite3_vtab *pVTab, int); + int (*xRollbackTo)(sqlite3_vtab *pVTab, int); +}; + +/* +** CAPI3REF: Virtual Table Indexing Information +** KEYWORDS: sqlite3_index_info +** +** The sqlite3_index_info structure and its substructures is used as part +** of the [virtual table] interface to +** pass information into and receive the reply from the [xBestIndex] +** method of a [virtual table module]. The fields under **Inputs** are the +** 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: +** +**
      column OP expr
      +** +** where OP is =, <, <=, >, or >=.)^ ^(The particular operator is +** stored in aConstraint[].op using one of the +** [SQLITE_INDEX_CONSTRAINT_EQ | SQLITE_INDEX_CONSTRAINT_ values].)^ +** ^(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.)^ +** +** ^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 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. +** +** The colUsed field indicates which columns of the virtual table may be +** required by the current scan. Virtual table columns are numbered from +** zero in the order in which they appear within the CREATE TABLE statement +** passed to sqlite3_declare_vtab(). For the first 63 columns (columns 0-62), +** the corresponding bit is set within the colUsed mask if the column may be +** required by SQLite. If the table has at least 64 columns and any column +** to the right of the first 63 is required, then bit 63 of colUsed is also +** set. In other words, column iCol may be required if the expression +** (colUsed & ((sqlite3_uint64)1 << (iCol>=63 ? 63 : iCol))) evaluates to +** non-zero. +** +** The [xBestIndex] method must fill aConstraintUsage[] with information +** 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 +** is true, then the constraint is assumed to be fully handled by the +** virtual table and is not checked again by SQLite.)^ +** +** ^The idxNum and idxPtr values are recorded and passed into the +** [xFilter] method. +** ^[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 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 a particular +** strategy. A cost of N indicates that the cost of the strategy is similar +** to a linear scan of an SQLite table with N rows. A cost of log(N) +** indicates that the expense of the operation is similar to that of a +** binary search on a unique indexed field of an SQLite table with N rows. +** +** ^The estimatedRows value is an estimate of the number of rows that +** will be returned by the strategy. +** +** The xBestIndex method may optionally populate the idxFlags field with a +** mask of SQLITE_INDEX_SCAN_* flags. Currently there is only one such flag - +** SQLITE_INDEX_SCAN_UNIQUE. If the xBestIndex method sets this flag, SQLite +** assumes that the strategy may visit at most one row. +** +** Additionally, if xBestIndex sets the SQLITE_INDEX_SCAN_UNIQUE flag, then +** SQLite also assumes that if a call to the xUpdate() method is made as +** part of the same statement to delete or update a virtual table row and the +** implementation returns SQLITE_CONSTRAINT, then there is no need to rollback +** any database changes. In other words, if the xUpdate() returns +** SQLITE_CONSTRAINT, the database contents must be exactly as they were +** before xUpdate was called. By contrast, if SQLITE_INDEX_SCAN_UNIQUE is not +** set and xUpdate returns SQLITE_CONSTRAINT, any database changes made by +** the xUpdate method are automatically rolled back by SQLite. +** +** IMPORTANT: The estimatedRows field was added to the sqlite3_index_info +** structure for SQLite [version 3.8.2] ([dateof:3.8.2]). +** If a virtual table extension is +** used with an SQLite version earlier than 3.8.2, the results of attempting +** to read or write the estimatedRows field are undefined (but are likely +** to included crashing the application). The estimatedRows field should +** therefore only be used if [sqlite3_libversion_number()] returns a +** value greater than or equal to 3008002. Similarly, the idxFlags field +** was added for [version 3.9.0] ([dateof:3.9.0]). +** It may therefore only be used if +** sqlite3_libversion_number() returns a value greater than or equal to +** 3009000. +*/ +struct sqlite3_index_info { + /* Inputs */ + int nConstraint; /* Number of entries in aConstraint */ + struct sqlite3_index_constraint { + int iColumn; /* Column constrained. -1 for ROWID */ + unsigned char op; /* Constraint operator */ + unsigned char usable; /* True if this constraint is usable */ + int iTermOffset; /* Used internally - xBestIndex should ignore */ + } *aConstraint; /* Table of WHERE clause constraints */ + int nOrderBy; /* Number of terms in the ORDER BY clause */ + struct sqlite3_index_orderby { + int iColumn; /* Column number */ + unsigned char desc; /* True for DESC. False for ASC. */ + } *aOrderBy; /* The ORDER BY clause */ + /* Outputs */ + struct sqlite3_index_constraint_usage { + int argvIndex; /* if >0, constraint is part of argv to xFilter */ + unsigned char omit; /* Do not code a test for this constraint */ + } *aConstraintUsage; + int idxNum; /* Number used to identify the index */ + char *idxStr; /* String, possibly obtained from sqlite3_malloc */ + int needToFreeIdxStr; /* Free idxStr using sqlite3_free() if true */ + int orderByConsumed; /* True if output is already ordered */ + double estimatedCost; /* Estimated cost of using this index */ + /* Fields below are only available in SQLite 3.8.2 and later */ + sqlite3_int64 estimatedRows; /* Estimated number of rows returned */ + /* Fields below are only available in SQLite 3.9.0 and later */ + int idxFlags; /* Mask of SQLITE_INDEX_SCAN_* flags */ + /* Fields below are only available in SQLite 3.10.0 and later */ + sqlite3_uint64 colUsed; /* Input: Mask of columns used by statement */ +}; + +/* +** CAPI3REF: Virtual Table Scan Flags +*/ +#define SQLITE_INDEX_SCAN_UNIQUE 1 /* Scan visits at most 1 row */ + +/* +** CAPI3REF: Virtual Table Constraint Operator Codes +** +** These macros defined the allowed values for the +** [sqlite3_index_info].aConstraint[].op field. Each value represents +** an operator that is part of a constraint term in the wHERE clause of +** a query that uses a [virtual table]. +*/ +#define SQLITE_INDEX_CONSTRAINT_EQ 2 +#define SQLITE_INDEX_CONSTRAINT_GT 4 +#define SQLITE_INDEX_CONSTRAINT_LE 8 +#define SQLITE_INDEX_CONSTRAINT_LT 16 +#define SQLITE_INDEX_CONSTRAINT_GE 32 +#define SQLITE_INDEX_CONSTRAINT_MATCH 64 +#define SQLITE_INDEX_CONSTRAINT_LIKE 65 +#define SQLITE_INDEX_CONSTRAINT_GLOB 66 +#define SQLITE_INDEX_CONSTRAINT_REGEXP 67 + +/* +** CAPI3REF: Register A Virtual Table Implementation +** METHOD: sqlite3 +** +** ^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 +** 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. +** +** ^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 destructor will also +** be invoked if the call to sqlite3_create_module_v2() fails. +** ^The sqlite3_create_module() +** interface is equivalent to sqlite3_create_module_v2() with a NULL +** destructor. +*/ +SQLITE_API int sqlite3_create_module( + sqlite3 *db, /* SQLite connection to register module with */ + const char *zName, /* Name of the module */ + const sqlite3_module *p, /* Methods for the module */ + void *pClientData /* Client data for xCreate/xConnect */ +); +SQLITE_API int sqlite3_create_module_v2( + sqlite3 *db, /* SQLite connection to register module with */ + const char *zName, /* Name of the module */ + const sqlite3_module *p, /* Methods for the module */ + void *pClientData, /* Client data for xCreate/xConnect */ + void(*xDestroy)(void*) /* Module destructor function */ +); + +/* +** CAPI3REF: Virtual Table Instance Object +** KEYWORDS: sqlite3_vtab +** +** Every [virtual table module] implementation uses a subclass +** 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 +** 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 +** is delivered up to the client application, the string will be automatically +** freed by sqlite3_free() and the zErrMsg field will be zeroed. +*/ +struct sqlite3_vtab { + const sqlite3_module *pModule; /* The module for this virtual table */ + int nRef; /* Number of open cursors */ + char *zErrMsg; /* Error message from sqlite3_mprintf() */ + /* Virtual table implementations will typically add additional fields */ +}; + +/* +** CAPI3REF: Virtual Table Cursor Object +** KEYWORDS: sqlite3_vtab_cursor {virtual table cursor} +** +** Every [virtual table module] implementation uses a subclass of the +** following structure to describe cursors that point into the +** [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. 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. +** +** This superclass exists in order to define fields of the cursor that +** are common to all implementations. +*/ +struct sqlite3_vtab_cursor { + sqlite3_vtab *pVtab; /* Virtual table of this cursor */ + /* Virtual table implementations will typically add additional fields */ +}; + +/* +** CAPI3REF: Declare The Schema Of A Virtual Table +** +** ^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. +*/ +SQLITE_API int sqlite3_declare_vtab(sqlite3*, const char *zSQL); + +/* +** CAPI3REF: Overload A Function For A Virtual Table +** METHOD: sqlite3 +** +** ^(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.)^ +** +** ^(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 +** 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 +** by a [virtual table]. +*/ +SQLITE_API int sqlite3_overload_function(sqlite3*, const char *zFuncName, int nArg); + +/* +** The interface to the virtual-table mechanism defined above (back up +** to a comment remarkably similar to this one) is currently considered +** to be experimental. The interface might change in incompatible ways. +** If this is a problem for you, do not use the interface at this time. +** +** When the virtual-table mechanism stabilizes, we will declare the +** interface fixed, support it indefinitely, and remove this comment. +*/ + +/* +** 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()] +** and destroyed by [sqlite3_blob_close()]. +** ^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. +*/ +typedef struct sqlite3_blob sqlite3_blob; + +/* +** CAPI3REF: Open A BLOB For Incremental I/O +** METHOD: sqlite3 +** CONSTRUCTOR: sqlite3_blob +** +** ^(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;
      +** 
      )^ +** +** ^(Parameter zDb is not the filename that contains the database, but +** rather the symbolic name of the database. For attached databases, this is +** the name that appears after the AS keyword in the [ATTACH] statement. +** For the main database file, the database name is "main". For TEMP +** tables, the database name is "temp".)^ +** +** ^If the flags parameter is non-zero, then the BLOB is opened for read +** and write access. ^If the flags parameter is zero, the BLOB is opened for +** read-only access. +** +** ^(On success, [SQLITE_OK] is returned and the new [BLOB handle] is stored +** in *ppBlob. Otherwise an [error code] is returned and, unless the error +** code is SQLITE_MISUSE, *ppBlob is set to NULL.)^ ^This means that, provided +** the API is not misused, it is always safe to call [sqlite3_blob_close()] +** on *ppBlob after this function it returns. +** +** This function fails with SQLITE_ERROR if any of the following are true: +**
        +**
      • ^(Database zDb does not exist)^, +**
      • ^(Table zTable does not exist within database zDb)^, +**
      • ^(Table zTable is a WITHOUT ROWID table)^, +**
      • ^(Column zColumn does not exist)^, +**
      • ^(Row iRow is not present in the table)^, +**
      • ^(The specified column of row iRow contains a value that is not +** a TEXT or BLOB value)^, +**
      • ^(Column zColumn is part of an index, PRIMARY KEY or UNIQUE +** constraint and the blob is being opened for read/write access)^, +**
      • ^([foreign key constraints | Foreign key constraints] are enabled, +** column zColumn is part of a [child key] definition and the blob is +** being opened for read/write access)^. +**
      +** +** ^Unless it returns SQLITE_MISUSE, this function sets the +** [database connection] error code and message accessible via +** [sqlite3_errcode()] and [sqlite3_errmsg()] and related functions. +** +** +** ^(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 +** an expired BLOB handle fail with a return code of [SQLITE_ABORT]. +** ^(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 +** interface. Use the [UPDATE] SQL command to change the size of a +** blob. +** +** ^The [sqlite3_bind_zeroblob()] and [sqlite3_result_zeroblob()] interfaces +** and the built-in [zeroblob] SQL function may be used to create a +** zero-filled blob to read or write using the incremental-blob interface. +** +** To avoid a resource leak, every open [BLOB handle] should eventually +** be released by a call to [sqlite3_blob_close()]. +*/ +SQLITE_API int sqlite3_blob_open( + sqlite3*, + const char *zDb, + const char *zTable, + const char *zColumn, + sqlite3_int64 iRow, + int flags, + sqlite3_blob **ppBlob +); + +/* +** CAPI3REF: Move a BLOB Handle to a New Row +** METHOD: sqlite3_blob +** +** ^This function is used to move an existing blob handle so that it points +** to a different row of the same database table. ^The new row is identified +** by the rowid value passed as the second argument. Only the row can be +** changed. ^The database, table and column on which the blob handle is open +** remain the same. Moving an existing blob handle to a new row can be +** faster than closing the existing handle and opening a new one. +** +** ^(The new row must meet the same criteria as for [sqlite3_blob_open()] - +** it must exist and there must be either a blob or text value stored in +** the nominated column.)^ ^If the new row is not present in the table, or if +** it does not contain a blob or text value, or if another error occurs, an +** SQLite error code is returned and the blob handle is considered aborted. +** ^All subsequent calls to [sqlite3_blob_read()], [sqlite3_blob_write()] or +** [sqlite3_blob_reopen()] on an aborted blob handle immediately return +** SQLITE_ABORT. ^Calling [sqlite3_blob_bytes()] on an aborted blob handle +** always returns zero. +** +** ^This function sets the database handle error code and message. +*/ +SQLITE_API int sqlite3_blob_reopen(sqlite3_blob *, sqlite3_int64); + +/* +** CAPI3REF: Close A BLOB Handle +** DESTRUCTOR: sqlite3_blob +** +** ^This function closes an open [BLOB handle]. ^(The BLOB handle is closed +** unconditionally. Even if this routine returns an error code, the +** handle is still closed.)^ +** +** ^If the blob handle being closed was opened for read-write access, and if +** the database is in auto-commit mode and there are no other open read-write +** blob handles or active write statements, the current transaction is +** committed. ^If an error occurs while committing the transaction, an error +** code is returned and the transaction rolled back. +** +** Calling this function with an argument that is not a NULL pointer or an +** open blob handle results in undefined behaviour. ^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. ^Otherwise, if this function +** is passed a valid open blob handle, the values returned by the +** sqlite3_errcode() and sqlite3_errmsg() functions are set before returning. +*/ +SQLITE_API int sqlite3_blob_close(sqlite3_blob *); + +/* +** CAPI3REF: Return The Size Of An Open BLOB +** METHOD: sqlite3_blob +** +** ^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. +** +** 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 +** been closed by [sqlite3_blob_close()]. Passing any other pointer in +** to this routine results in undefined and probably undesirable behavior. +*/ +SQLITE_API int sqlite3_blob_bytes(sqlite3_blob *); + +/* +** CAPI3REF: Read Data From A BLOB Incrementally +** METHOD: sqlite3_blob +** +** ^(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.)^ +** +** ^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) +** can be determined using the [sqlite3_blob_bytes()] interface. +** +** ^An attempt to read from an expired [BLOB handle] fails with an +** error code of [SQLITE_ABORT]. +** +** ^(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 +** been closed by [sqlite3_blob_close()]. Passing any other pointer in +** to this routine results in undefined and probably undesirable behavior. +** +** See also: [sqlite3_blob_write()]. +*/ +SQLITE_API int sqlite3_blob_read(sqlite3_blob *, void *Z, int N, int iOffset); + +/* +** CAPI3REF: Write Data Into A BLOB Incrementally +** METHOD: sqlite3_blob +** +** ^(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.)^ +** +** ^(On success, sqlite3_blob_write() returns SQLITE_OK. +** Otherwise, an [error code] or an [extended error code] is returned.)^ +** ^Unless SQLITE_MISUSE is returned, this function sets the +** [database connection] error code and message accessible via +** [sqlite3_errcode()] and [sqlite3_errmsg()] and related functions. +** +** ^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 +** 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. The size of the +** BLOB (and hence the maximum value of N+iOffset) can be determined +** using the [sqlite3_blob_bytes()] interface. ^If N or iOffset are less +** than zero [SQLITE_ERROR] is returned and no data is written. +** +** ^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. +** +** 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 +** been closed by [sqlite3_blob_close()]. Passing any other pointer in +** to this routine results in undefined and probably undesirable behavior. +** +** See also: [sqlite3_blob_read()]. +*/ +SQLITE_API int sqlite3_blob_write(sqlite3_blob *, const void *z, int n, int iOffset); + +/* +** CAPI3REF: Virtual File System Objects +** +** A virtual filesystem (VFS) is an [sqlite3_vfs] object +** that SQLite uses to interact +** with the underlying operating system. Most SQLite builds come with a +** single default VFS that is appropriate for the host computer. +** 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. +** +** ^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.)^ +*/ +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 +** +** The SQLite core uses these routines for thread +** synchronization. Though they are intended for internal +** use by SQLite, code that links against SQLite is +** permitted to use any of these routines. +** +** The SQLite source code contains multiple implementations +** of these mutex routines. An appropriate implementation +** is selected automatically at compile-time. The following +** implementations are available in the SQLite core: +** +**
        +**
      • SQLITE_MUTEX_PTHREADS +**
      • SQLITE_MUTEX_W32 +**
      • SQLITE_MUTEX_NOOP +**
      +** +** 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_PTHREADS and +** SQLITE_MUTEX_W32 implementations are appropriate for use on Unix +** and Windows. +** +** 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(). +** +** ^The sqlite3_mutex_alloc() routine allocates a new +** mutex and returns a pointer to it. ^The sqlite3_mutex_alloc() +** routine returns NULL if it is unable to allocate the requested +** mutex. The argument to sqlite3_mutex_alloc() must one of these +** integer constants: +** +**
        +**
      • SQLITE_MUTEX_FAST +**
      • SQLITE_MUTEX_RECURSIVE +**
      • SQLITE_MUTEX_STATIC_MASTER +**
      • SQLITE_MUTEX_STATIC_MEM +**
      • SQLITE_MUTEX_STATIC_OPEN +**
      • SQLITE_MUTEX_STATIC_PRNG +**
      • SQLITE_MUTEX_STATIC_LRU +**
      • SQLITE_MUTEX_STATIC_PMEM +**
      • SQLITE_MUTEX_STATIC_APP1 +**
      • SQLITE_MUTEX_STATIC_APP2 +**
      • SQLITE_MUTEX_STATIC_APP3 +**
      • SQLITE_MUTEX_STATIC_VFS1 +**
      • SQLITE_MUTEX_STATIC_VFS2 +**
      • SQLITE_MUTEX_STATIC_VFS3 +**
      +** +** ^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. 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. +** +** ^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. ^Nine 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. +** +** ^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. ^For the static +** mutex types, the same mutex is returned on every call that has +** the same type number. +** +** ^The sqlite3_mutex_free() routine deallocates a previously +** allocated dynamic mutex. Attempting to deallocate a static +** mutex results in undefined behavior. +** +** ^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 mutex other +** than an SQLITE_MUTEX_RECURSIVE more than once, the behavior is undefined. +** +** ^(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. The SQLite core only ever uses +** sqlite3_mutex_try() as an optimization so this is acceptable +** 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. +** +** ^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. +** +** See also: [sqlite3_mutex_held()] and [sqlite3_mutex_notheld()]. +*/ +SQLITE_API sqlite3_mutex *sqlite3_mutex_alloc(int); +SQLITE_API void sqlite3_mutex_free(sqlite3_mutex*); +SQLITE_API void sqlite3_mutex_enter(sqlite3_mutex*); +SQLITE_API int sqlite3_mutex_try(sqlite3_mutex*); +SQLITE_API void sqlite3_mutex_leave(sqlite3_mutex*); + +/* +** CAPI3REF: Mutex Methods Object +** +** An instance of this structure defines the low-level routines +** used to allocate and use mutexes. +** +** Usually, the default mutex implementations provided by SQLite are +** sufficient, however the application has the option of substituting a custom +** implementation for specialized deployments or systems for which SQLite +** does not provide a suitable implementation. In this case, the application +** creates and populates an instance of this structure to pass +** to sqlite3_config() along with the [SQLITE_CONFIG_MUTEX] option. +** Additionally, an instance of this structure can be used as an +** 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 +** part of system initialization by the sqlite3_initialize() function. +** ^The xMutexInit routine is called by SQLite exactly once for each +** effective call to [sqlite3_initialize()]. +** +** ^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. ^The xMutexEnd() +** interface is invoked exactly once for each call to [sqlite3_shutdown()]. +** +** ^(The remaining seven methods defined by this structure (xMutexAlloc, +** xMutexFree, xMutexEnter, xMutexTry, xMutexLeave, xMutexHeld and +** xMutexNotheld) implement the following interfaces (respectively): +** +**
        +**
      • [sqlite3_mutex_alloc()]
      • +**
      • [sqlite3_mutex_free()]
      • +**
      • [sqlite3_mutex_enter()]
      • +**
      • [sqlite3_mutex_try()]
      • +**
      • [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 +** of a valid mutex handle. The implementations of the methods defined +** by this structure are not required to handle this case, the results +** of passing a NULL pointer instead of a valid mutex handle are undefined +** (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 +** invoke xMutexInit() multiple 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 +** memory allocation for a fast or recursive mutex. +** +** ^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. +*/ +typedef struct sqlite3_mutex_methods sqlite3_mutex_methods; +struct sqlite3_mutex_methods { + int (*xMutexInit)(void); + int (*xMutexEnd)(void); + sqlite3_mutex *(*xMutexAlloc)(int); + void (*xMutexFree)(sqlite3_mutex *); + void (*xMutexEnter)(sqlite3_mutex *); + int (*xMutexTry)(sqlite3_mutex *); + void (*xMutexLeave)(sqlite3_mutex *); + int (*xMutexHeld)(sqlite3_mutex *); + int (*xMutexNotheld)(sqlite3_mutex *); +}; + +/* +** CAPI3REF: Mutex Verification Routines +** +** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routines +** 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. The SQLite core only +** provides implementations for these routines when it is compiled +** 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. +** +** These routines should return true if the mutex in their argument +** is held or not held, respectively, by the calling thread. +** +** The implementation is not required to provide 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. +** +** 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 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. 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 +** +** The [sqlite3_mutex_alloc()] interface takes a single argument +** which is one of these integer constants. +** +** The set of static mutexes may change from one SQLite release to the +** next. Applications that override the built-in mutex logic must be +** prepared to accommodate additional static mutexes. +*/ +#define SQLITE_MUTEX_FAST 0 +#define SQLITE_MUTEX_RECURSIVE 1 +#define SQLITE_MUTEX_STATIC_MASTER 2 +#define SQLITE_MUTEX_STATIC_MEM 3 /* sqlite3_malloc() */ +#define SQLITE_MUTEX_STATIC_MEM2 4 /* NOT USED */ +#define SQLITE_MUTEX_STATIC_OPEN 4 /* sqlite3BtreeOpen() */ +#define SQLITE_MUTEX_STATIC_PRNG 5 /* sqlite3_randomness() */ +#define SQLITE_MUTEX_STATIC_LRU 6 /* lru page list */ +#define SQLITE_MUTEX_STATIC_LRU2 7 /* NOT USED */ +#define SQLITE_MUTEX_STATIC_PMEM 7 /* sqlite3PageMalloc() */ +#define SQLITE_MUTEX_STATIC_APP1 8 /* For use by application */ +#define SQLITE_MUTEX_STATIC_APP2 9 /* For use by application */ +#define SQLITE_MUTEX_STATIC_APP3 10 /* For use by application */ +#define SQLITE_MUTEX_STATIC_VFS1 11 /* For use by built-in VFS */ +#define SQLITE_MUTEX_STATIC_VFS2 12 /* For use by extension VFS */ +#define SQLITE_MUTEX_STATIC_VFS3 13 /* For use by application VFS */ + +/* +** CAPI3REF: Retrieve the mutex for a database connection +** METHOD: sqlite3 +** +** ^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 +** routine returns a NULL pointer. +*/ +SQLITE_API sqlite3_mutex *sqlite3_db_mutex(sqlite3*); + +/* +** CAPI3REF: Low-Level Control Of Database Files +** METHOD: sqlite3 +** +** ^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. ^The +** name of the database is "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. ^The return value of the xFileControl +** method becomes the return value of this routine. +** +** ^The SQLITE_FCNTL_FILE_POINTER value for the op parameter causes +** a pointer to the underlying [sqlite3_file] object to be written into +** the space pointed to by the 4th parameter. ^The SQLITE_FCNTL_FILE_POINTER +** case is a short-circuit path which does not actually invoke the +** underlying sqlite3_io_methods.xFileControl method. +** +** ^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()]. 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. +** +** See also: [SQLITE_FCNTL_LOCKSTATE] +*/ +SQLITE_API int sqlite3_file_control(sqlite3*, const char *zDbName, int op, void*); + +/* +** CAPI3REF: Testing Interface +** +** ^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 +** the number, meaning, and operation of all subsequent parameters. +** +** This interface is not for use by applications. It exists solely +** for verifying the correct operation of the SQLite library. Depending +** on how the SQLite library is compiled, this interface might not exist. +** +** The details of the operation codes, their meanings, the parameters +** they take, and what they do are all subject to change without notice. +** Unlike most of the SQLite API, this function is not guaranteed to +** operate consistently from one release to the next. +*/ +SQLITE_API int sqlite3_test_control(int op, ...); + +/* +** CAPI3REF: Testing Interface Operation Codes +** +** These constants are the valid operation code parameters used +** as the first argument to [sqlite3_test_control()]. +** +** These parameters and their meanings are subject to change +** without notice. These values are for testing purposes only. +** 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 +#define SQLITE_TESTCTRL_BITVEC_TEST 8 +#define SQLITE_TESTCTRL_FAULT_INSTALL 9 +#define SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS 10 +#define SQLITE_TESTCTRL_PENDING_BYTE 11 +#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_SCRATCHMALLOC 17 +#define SQLITE_TESTCTRL_LOCALTIME_FAULT 18 +#define SQLITE_TESTCTRL_EXPLAIN_STMT 19 /* NOT USED */ +#define SQLITE_TESTCTRL_ONCE_RESET_THRESHOLD 19 +#define SQLITE_TESTCTRL_NEVER_CORRUPT 20 +#define SQLITE_TESTCTRL_VDBE_COVERAGE 21 +#define SQLITE_TESTCTRL_BYTEORDER 22 +#define SQLITE_TESTCTRL_ISINIT 23 +#define SQLITE_TESTCTRL_SORTER_MMAP 24 +#define SQLITE_TESTCTRL_IMPOSTER 25 +#define SQLITE_TESTCTRL_LAST 25 + +/* +** CAPI3REF: SQLite Runtime Status +** +** ^These interfaces are used to retrieve runtime status information +** about the performance 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 [status parameters | 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 +** 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.)^ +** +** ^The sqlite3_status() and sqlite3_status64() routines return +** SQLITE_OK on success and a non-zero [error code] on failure. +** +** If either the current value or the highwater mark is too large to +** be represented by a 32-bit integer, then the values returned by +** sqlite3_status() are undefined. +** +** See also: [sqlite3_db_status()] +*/ +SQLITE_API int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetFlag); +SQLITE_API int sqlite3_status64( + int op, + sqlite3_int64 *pCurrent, + sqlite3_int64 *pHighwater, + int resetFlag +); + + +/* +** CAPI3REF: Status Parameters +** KEYWORDS: {status parameters} +** +** 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 +** and internal memory usage by the SQLite library. Scratch memory +** 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].
      )^ +** +** [[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.
      )^ +** +** [[SQLITE_STATUS_MALLOC_COUNT]] ^(
      SQLITE_STATUS_MALLOC_COUNT
      +**
      This parameter records the number of separate memory allocations +** currently checked out.
      )^ +** +** [[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.
      )^ +** +** [[SQLITE_STATUS_PAGECACHE_OVERFLOW]] +** ^(
      SQLITE_STATUS_PAGECACHE_OVERFLOW
      +**
      This parameter returns the number of bytes of page cache +** allocation which could not be satisfied 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.
      )^ +** +** [[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.
      )^ +** +** [[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.
      )^ +** +** [[SQLITE_STATUS_SCRATCH_OVERFLOW]] ^(
      SQLITE_STATUS_SCRATCH_OVERFLOW
      +**
      This parameter returns the number of bytes of scratch memory +** allocation which could not be satisfied by the [SQLITE_CONFIG_SCRATCH] +** buffer and where forced to overflow to [sqlite3_malloc()]. The values +** returned include overflows because the requested allocation was too +** 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.
      )^ +** +** [[SQLITE_STATUS_PARSER_STACK]] ^(
      SQLITE_STATUS_PARSER_STACK
      +**
      The *pHighwater parameter records the deepest parser stack. +** The *pCurrent value is undefined. The *pHighwater value is only +** meaningful if SQLite is compiled with [YYTRACKMAXSTACKDEPTH].
      )^ +**
      +** +** New status parameters may be added from time to time. +*/ +#define SQLITE_STATUS_MEMORY_USED 0 +#define SQLITE_STATUS_PAGECACHE_USED 1 +#define SQLITE_STATUS_PAGECACHE_OVERFLOW 2 +#define SQLITE_STATUS_SCRATCH_USED 3 +#define SQLITE_STATUS_SCRATCH_OVERFLOW 4 +#define SQLITE_STATUS_MALLOC_SIZE 5 +#define SQLITE_STATUS_PARSER_STACK 6 +#define SQLITE_STATUS_PAGECACHE_SIZE 7 +#define SQLITE_STATUS_SCRATCH_SIZE 8 +#define SQLITE_STATUS_MALLOC_COUNT 9 + +/* +** CAPI3REF: Database Connection Status +** METHOD: sqlite3 +** +** ^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 an integer constant, taken from the set of +** [SQLITE_DBSTATUS options], that +** determines the parameter to interrogate. The set of +** [SQLITE_DBSTATUS options] is likely +** to grow 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 resetFlg is true, then the highest instantaneous value is +** reset back down to the current value. +** +** ^The sqlite3_db_status() routine returns SQLITE_OK on success and a +** non-zero [error code] on failure. +** +** See also: [sqlite3_status()] and [sqlite3_stmt_status()]. +*/ +SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int resetFlg); + +/* +** CAPI3REF: Status Parameters for database connections +** KEYWORDS: {SQLITE_DBSTATUS options} +** +** These constants are the available integer "verbs" that can be passed as +** the second argument to the [sqlite3_db_status()] interface. +** +** New verbs may be added in future releases of SQLite. Existing verbs +** might be discontinued. Applications should check the return code from +** [sqlite3_db_status()] to make sure that the call worked. +** The [sqlite3_db_status()] interface will return a non-zero error code +** 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.
      )^ +** +** [[SQLITE_DBSTATUS_LOOKASIDE_HIT]] ^(
      SQLITE_DBSTATUS_LOOKASIDE_HIT
      +**
      This parameter returns the number malloc attempts that were +** satisfied using lookaside memory. Only the high-water value is meaningful; +** the current value is always zero.)^ +** +** [[SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE]] +** ^(
      SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE
      +**
      This parameter returns the number malloc attempts that might have +** been satisfied using lookaside memory but failed due to the amount of +** memory requested being larger than the lookaside slot size. +** Only the high-water value is meaningful; +** the current value is always zero.)^ +** +** [[SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL]] +** ^(
      SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL
      +**
      This parameter returns the number malloc attempts that might have +** been satisfied using lookaside memory but failed due to all lookaside +** memory already being in use. +** Only the high-water value is meaningful; +** the current value is always zero.)^ +** +** [[SQLITE_DBSTATUS_CACHE_USED]] ^(
      SQLITE_DBSTATUS_CACHE_USED
      +**
      This parameter returns the approximate number of bytes of heap +** memory used by all pager caches associated with the database connection.)^ +** ^The highwater mark associated with SQLITE_DBSTATUS_CACHE_USED is always 0. +** +** [[SQLITE_DBSTATUS_CACHE_USED_SHARED]] +** ^(
      SQLITE_DBSTATUS_CACHE_USED_SHARED
      +**
      This parameter is similar to DBSTATUS_CACHE_USED, except that if a +** pager cache is shared between two or more connections the bytes of heap +** memory used by that pager cache is divided evenly between the attached +** connections.)^ In other words, if none of the pager caches associated +** with the database connection are shared, this request returns the same +** value as DBSTATUS_CACHE_USED. Or, if one or more or the pager caches are +** shared, the value returned by this call will be smaller than that returned +** by DBSTATUS_CACHE_USED. ^The highwater mark associated with +** SQLITE_DBSTATUS_CACHE_USED_SHARED is always 0. +** +** [[SQLITE_DBSTATUS_SCHEMA_USED]] ^(
      SQLITE_DBSTATUS_SCHEMA_USED
      +**
      This parameter returns the approximate number of bytes of heap +** memory used to store the schema for all databases associated +** with the connection - main, temp, and any [ATTACH]-ed databases.)^ +** ^The full amount of memory used by the schemas is reported, even if the +** schema memory is shared with other database connections due to +** [shared cache mode] being enabled. +** ^The highwater mark associated with SQLITE_DBSTATUS_SCHEMA_USED is always 0. +** +** [[SQLITE_DBSTATUS_STMT_USED]] ^(
      SQLITE_DBSTATUS_STMT_USED
      +**
      This parameter returns the approximate number of bytes of heap +** and lookaside memory used by all prepared statements associated with +** the database connection.)^ +** ^The highwater mark associated with SQLITE_DBSTATUS_STMT_USED is always 0. +**
      +** +** [[SQLITE_DBSTATUS_CACHE_HIT]] ^(
      SQLITE_DBSTATUS_CACHE_HIT
      +**
      This parameter returns the number of pager cache hits that have +** occurred.)^ ^The highwater mark associated with SQLITE_DBSTATUS_CACHE_HIT +** is always 0. +**
      +** +** [[SQLITE_DBSTATUS_CACHE_MISS]] ^(
      SQLITE_DBSTATUS_CACHE_MISS
      +**
      This parameter returns the number of pager cache misses that have +** occurred.)^ ^The highwater mark associated with SQLITE_DBSTATUS_CACHE_MISS +** is always 0. +**
      +** +** [[SQLITE_DBSTATUS_CACHE_WRITE]] ^(
      SQLITE_DBSTATUS_CACHE_WRITE
      +**
      This parameter returns the number of dirty cache entries that have +** been written to disk. Specifically, the number of pages written to the +** wal file in wal mode databases, or the number of pages written to the +** database file in rollback mode databases. Any pages written as part of +** transaction rollback or database recovery operations are not included. +** If an IO or other error occurs while writing a page to disk, the effect +** on subsequent SQLITE_DBSTATUS_CACHE_WRITE requests is undefined.)^ ^The +** highwater mark associated with SQLITE_DBSTATUS_CACHE_WRITE is always 0. +**
      +** +** [[SQLITE_DBSTATUS_DEFERRED_FKS]] ^(
      SQLITE_DBSTATUS_DEFERRED_FKS
      +**
      This parameter returns zero for the current value if and only if +** all foreign key constraints (deferred or immediate) have been +** resolved.)^ ^The highwater mark is always 0. +**
      +**
      +*/ +#define SQLITE_DBSTATUS_LOOKASIDE_USED 0 +#define SQLITE_DBSTATUS_CACHE_USED 1 +#define SQLITE_DBSTATUS_SCHEMA_USED 2 +#define SQLITE_DBSTATUS_STMT_USED 3 +#define SQLITE_DBSTATUS_LOOKASIDE_HIT 4 +#define SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE 5 +#define SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL 6 +#define SQLITE_DBSTATUS_CACHE_HIT 7 +#define SQLITE_DBSTATUS_CACHE_MISS 8 +#define SQLITE_DBSTATUS_CACHE_WRITE 9 +#define SQLITE_DBSTATUS_DEFERRED_FKS 10 +#define SQLITE_DBSTATUS_CACHE_USED_SHARED 11 +#define SQLITE_DBSTATUS_MAX 11 /* Largest defined DBSTATUS */ + + +/* +** CAPI3REF: Prepared Statement Status +** METHOD: sqlite3_stmt +** +** ^(Each prepared statement maintains various +** [SQLITE_STMTSTATUS counters] that measure the number +** 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 +** 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 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 +** interface call returns. +** +** See also: [sqlite3_status()] and [sqlite3_db_status()]. +*/ +SQLITE_API int sqlite3_stmt_status(sqlite3_stmt*, int op,int resetFlg); + +/* +** CAPI3REF: Status Parameters for prepared statements +** KEYWORDS: {SQLITE_STMTSTATUS counter} {SQLITE_STMTSTATUS counters} +** +** These preprocessor macros define integer codes that name counter +** values associated with the [sqlite3_stmt_status()] interface. +** The meanings of the various counters are as follows: +** +**
      +** [[SQLITE_STMTSTATUS_FULLSCAN_STEP]]
      SQLITE_STMTSTATUS_FULLSCAN_STEP
      +**
      ^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]]
      SQLITE_STMTSTATUS_SORT
      +**
      ^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.
      +** +** [[SQLITE_STMTSTATUS_AUTOINDEX]]
      SQLITE_STMTSTATUS_AUTOINDEX
      +**
      ^This is the number of rows inserted into transient indices that +** were created automatically in order to help joins run faster. +** A non-zero value in this counter may indicate an opportunity to +** improvement performance by adding permanent indices that do not +** need to be reinitialized each time the statement is run.
      +** +** [[SQLITE_STMTSTATUS_VM_STEP]]
      SQLITE_STMTSTATUS_VM_STEP
      +**
      ^This is the number of virtual machine operations executed +** by the prepared statement if that number is less than or equal +** to 2147483647. The number of virtual machine operations can be +** used as a proxy for the total work done by the prepared statement. +** If the number of virtual machine operations exceeds 2147483647 +** then the value returned by this statement status code is undefined. +**
      +**
      +*/ +#define SQLITE_STMTSTATUS_FULLSCAN_STEP 1 +#define SQLITE_STMTSTATUS_SORT 2 +#define SQLITE_STMTSTATUS_AUTOINDEX 3 +#define SQLITE_STMTSTATUS_VM_STEP 4 + +/* +** CAPI3REF: Custom Page Cache Object +** +** The sqlite3_pcache type is opaque. It is implemented by +** the pluggable module. The SQLite core has no knowledge of +** its size or internal structure and never deals with the +** sqlite3_pcache object except by holding and passing pointers +** to the object. +** +** See [sqlite3_pcache_methods2] for additional information. +*/ +typedef struct sqlite3_pcache sqlite3_pcache; + +/* +** CAPI3REF: Custom Page Cache Object +** +** The sqlite3_pcache_page object represents a single page in the +** page cache. The page cache will allocate instances of this +** object. Various methods of the page cache use pointers to instances +** of this object as parameters or as their return value. +** +** See [sqlite3_pcache_methods2] for additional information. +*/ +typedef struct sqlite3_pcache_page sqlite3_pcache_page; +struct sqlite3_pcache_page { + void *pBuf; /* The content of the page */ + void *pExtra; /* Extra information associated with the page */ +}; + +/* +** CAPI3REF: Application Defined Page Cache. +** KEYWORDS: {page cache} +** +** ^(The [sqlite3_config]([SQLITE_CONFIG_PCACHE2], ...) interface can +** register an alternative page cache implementation by passing in an +** instance of the sqlite3_pcache_methods2 structure.)^ +** In many applications, most of the heap memory allocated by +** SQLite is used for the page cache. +** By implementing a +** custom page cache using this API, an application can better control +** the amount of memory consumed by SQLite, the way in which +** that memory is allocated and released, and the policies used to +** determine exactly which parts of a database file are cached and for +** how long. +** +** The alternative page cache mechanism is an +** extreme measure that is only needed by the most demanding applications. +** The built-in page cache is recommended for most uses. +** +** ^(The contents of the sqlite3_pcache_methods2 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.)^ +** +** [[the xInit() page cache method]] +** ^(The xInit() method is called once for each effective +** call to [sqlite3_initialize()])^ +** (usually only once during the lifetime of the process). ^(The xInit() +** method is passed a copy of the sqlite3_pcache_methods2.pArg value.)^ +** The intent of the xInit() method is to set up global data structures +** required by the custom page cache implementation. +** ^(If the xInit() method is NULL, then the +** built-in default page cache is used instead of the application defined +** page cache.)^ +** +** [[the xShutdown() page cache method]] +** ^The xShutdown() method is called by [sqlite3_shutdown()]. +** It can be used to clean up +** any outstanding resources before process shutdown, if required. +** ^The xShutdown() method may be NULL. +** +** ^SQLite automatically serializes calls to 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 +** call to xShutdown(). +** +** [[the xCreate() page cache methods]] +** ^SQLite invokes the xCreate() method to construct a new cache instance. +** SQLite will typically create one cache instance for each open database file, +** 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 always a power of two. ^The +** second parameter szExtra is a number of bytes of extra storage +** associated with each page cache entry. ^The szExtra parameter will +** a number less than 250. SQLite will use the +** extra szExtra bytes on each page to store metadata about the underlying +** database page on disk. The value passed into szExtra depends +** on the SQLite version, the target platform, and how SQLite was compiled. +** ^The third 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 +** 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 +** never invoke xUnpin() except to deliberately delete a page. +** ^In other words, calls to xUnpin() on a cache with bPurgeable set to +** false will always have the "discard" flag set to true. +** ^Hence, a cache created with bPurgeable false will +** never contain any unpinned pages. +** +** [[the xCachesize() page cache method]] +** ^(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 +** value; it is advisory only. +** +** [[the xPagecount() page cache methods]] +** The xPagecount() method must return the number of pages currently +** stored in the cache, both pinned and unpinned. +** +** [[the xFetch() page cache methods]] +** The xFetch() method locates a page in the cache and returns a pointer to +** an sqlite3_pcache_page object associated with that page, or a NULL pointer. +** The pBuf element of the returned sqlite3_pcache_page object will be a +** pointer to a buffer of szPage bytes used to store the content of a +** single database page. The pExtra element of sqlite3_pcache_page will be +** a pointer to the szExtra bytes of extra storage that SQLite has requested +** for each entry in the page cache. +** +** The page to be fetched is determined by the key. ^The minimum 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 +** 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 +** cache implementation should use the value of the createFlag +** parameter to help it determined what action to take: +** +** +**
      createFlag Behavior when page is not already in cache +**
      0 Do not allocate a new page. Return NULL. +**
      1 Allocate a new page if it easy and convenient to do so. +** 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. SQLite +** will only use a createFlag of 2 after a prior call with a createFlag of 1 +** failed.)^ In between the to xFetch() calls, SQLite may +** attempt to unpin one or more cache pages by spilling the content of +** pinned pages to disk and synching the operating system disk cache. +** +** [[the xUnpin() page cache method]] +** ^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 must be evicted from the cache. +** ^If the discard parameter is +** zero, then the page may be discarded or retained at the discretion of +** page cache implementation. ^The page cache implementation +** may choose to evict unpinned pages at any time. +** +** The cache must not perform any reference counting. A single +** call to xUnpin() unpins the page regardless of the number of prior calls +** to xFetch(). +** +** [[the xRekey() page cache methods]] +** The xRekey() method is used to change the key value associated with the +** page passed as the second argument. If the cache +** previously contains an entry associated with newKey, it must be +** 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 +** existing cache entries with page numbers (keys) greater than or equal +** 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() page cache method]] +** ^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_methods2 +** functions. +** +** [[the xShrink() page cache method]] +** ^SQLite invokes the xShrink() method when it wants the page cache to +** free up as much of heap memory as possible. The page cache implementation +** is not obligated to free any memory, but well-behaved implementations should +** do their best. +*/ +typedef struct sqlite3_pcache_methods2 sqlite3_pcache_methods2; +struct sqlite3_pcache_methods2 { + int iVersion; + void *pArg; + int (*xInit)(void*); + void (*xShutdown)(void*); + sqlite3_pcache *(*xCreate)(int szPage, int szExtra, int bPurgeable); + void (*xCachesize)(sqlite3_pcache*, int nCachesize); + int (*xPagecount)(sqlite3_pcache*); + sqlite3_pcache_page *(*xFetch)(sqlite3_pcache*, unsigned key, int createFlag); + void (*xUnpin)(sqlite3_pcache*, sqlite3_pcache_page*, int discard); + void (*xRekey)(sqlite3_pcache*, sqlite3_pcache_page*, + unsigned oldKey, unsigned newKey); + void (*xTruncate)(sqlite3_pcache*, unsigned iLimit); + void (*xDestroy)(sqlite3_pcache*); + void (*xShrink)(sqlite3_pcache*); +}; + +/* +** This is the obsolete pcache_methods object that has now been replaced +** by sqlite3_pcache_methods2. This object is not used by SQLite. It is +** retained in the header file for backwards compatibility only. +*/ +typedef struct sqlite3_pcache_methods sqlite3_pcache_methods; +struct sqlite3_pcache_methods { + void *pArg; + int (*xInit)(void*); + void (*xShutdown)(void*); + sqlite3_pcache *(*xCreate)(int szPage, int bPurgeable); + void (*xCachesize)(sqlite3_pcache*, int nCachesize); + int (*xPagecount)(sqlite3_pcache*); + void *(*xFetch)(sqlite3_pcache*, unsigned key, int createFlag); + void (*xUnpin)(sqlite3_pcache*, void*, int discard); + void (*xRekey)(sqlite3_pcache*, void*, unsigned oldKey, unsigned newKey); + void (*xTruncate)(sqlite3_pcache*, unsigned iLimit); + void (*xDestroy)(sqlite3_pcache*); +}; + + +/* +** CAPI3REF: Online Backup Object +** +** The sqlite3_backup object records state information about an ongoing +** 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()]. +** +** See Also: [Using the SQLite Online Backup API] +*/ +typedef struct sqlite3_backup sqlite3_backup; + +/* +** CAPI3REF: Online Backup API. +** +** 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] +** +** ^SQLite holds a write transaction open on the destination database file +** for the duration of the backup operation. +** ^The source database is read-locked only while it is 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 database connections from +** reading or writing to the source database while the backup is underway. +** +** ^(To perform a backup operation: +**
        +**
      1. sqlite3_backup_init() is called once to initialize the +** backup, +**
      2. sqlite3_backup_step() is called one or more times to transfer +** the data between the two databases, and finally +**
      3. 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()]] sqlite3_backup_init() +** +** ^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 fail with +** an error. +** +** ^A call to sqlite3_backup_init() will fail, returning NULL, if +** there is already a read or read-write transaction open on the +** destination database. +** +** ^If an error occurs within sqlite3_backup_init(D,N,S,M), then NULL is +** returned and an error code and error message are stored 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()]] sqlite3_backup_step() +** +** ^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 returns [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. +** +** ^(The sqlite3_backup_step() might return [SQLITE_READONLY] if +**
        +**
      1. the destination database was opened read-only, or +**
      2. the destination database is using write-ahead-log journaling +** and the destination and source page sizes differ, or +**
      3. the destination database is an in-memory database and the +** destination and source page sizes differ. +**
      )^ +** +** ^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 +** 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 +** [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 +** [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.)^ 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. +** +** ^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]. ^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 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 automatically +** updated at the same time. +** +** [[sqlite3_backup_finish()]] sqlite3_backup_finish() +** +** 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 +** 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()]] +** sqlite3_backup_remaining() and sqlite3_backup_pagecount() +** +** ^The sqlite3_backup_remaining() routine returns the number of pages still +** to be backed up at the conclusion of the most recent sqlite3_backup_step(). +** ^The sqlite3_backup_pagecount() routine returns the total number of pages +** in the source database at the conclusion of the most recent +** sqlite3_backup_step(). +** ^(The values returned by these functions are only updated by +** sqlite3_backup_step(). If the source database is modified in a way that +** changes the size of the source database or the number of pages remaining, +** those changes are not reflected in the output of sqlite3_backup_pagecount() +** and sqlite3_backup_remaining() until after the next +** sqlite3_backup_step().)^ +** +** Concurrent Usage of Database Handles +** +** ^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 +** connections, then the source database connection may be used concurrently +** from within other threads. +** +** 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(). 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 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(). +** +** The [sqlite3_backup] object itself is partially threadsafe. Multiple +** threads may safely make multiple concurrent calls to sqlite3_backup_step(). +** However, the sqlite3_backup_remaining() and sqlite3_backup_pagecount() +** APIs are not strictly speaking threadsafe. If they are invoked at the +** same time as another thread is invoking sqlite3_backup_step() it is +** possible that they return invalid values. +*/ +SQLITE_API sqlite3_backup *sqlite3_backup_init( + sqlite3 *pDest, /* Destination database handle */ + const char *zDestName, /* Destination database name */ + sqlite3 *pSource, /* Source database handle */ + const char *zSourceName /* Source database name */ +); +SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage); +SQLITE_API int sqlite3_backup_finish(sqlite3_backup *p); +SQLITE_API int sqlite3_backup_remaining(sqlite3_backup *p); +SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p); + +/* +** CAPI3REF: Unlock Notification +** METHOD: sqlite3 +** +** ^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 +** when the connection currently holding the required lock relinquishes it. +** ^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 +** its current transaction, either by committing it or rolling it back. +** +** ^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 +** 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 +** 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, +** 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().)^ +** +** ^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 +** 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 +** called with a NULL pointer as its second argument, then any existing +** unlock-notify callback is canceled. ^The blocked connections +** unlock-notify callback may also be canceled by closing the blocked +** connection using [sqlite3_close()]. +** +** The unlock-notify callback is not reentrant. If an application invokes +** 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 +** returns SQLITE_OK. +** +** Callback Invocation Details +** +** When an unlock-notify callback is registered, the application provides a +** single void* pointer that is passed to the callback when it is invoked. +** However, the signature of the callback function allows SQLite to pass +** it an array of void* context pointers. The first argument passed to +** an unlock-notify callback is a pointer to an array of void* pointers, +** and the second is the number of entries in the array. +** +** 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 +** 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. +** This gives the application an opportunity to prioritize any actions +** related to the set of unblocked database connections. +** +** Deadlock Detection +** +** Assuming that after registering for an unlock-notify callback a +** database waits for the callback to be issued before taking any further +** action (a reasonable assumption), then using this API may cause the +** application to deadlock. For example, if connection X is waiting for +** connection Y's transaction to be concluded, and similarly connection +** Y is waiting on connection X's transaction, then neither connection +** 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 +** 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 +** 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 +** number of levels of indirection are allowed. +** +** The "DROP TABLE" Exception +** +** When a call to [sqlite3_step()] returns SQLITE_LOCKED, it is almost +** always appropriate to call sqlite3_unlock_notify(). There is however, +** one exception. When executing a "DROP TABLE" or "DROP INDEX" statement, +** SQLite checks if there are any currently executing SELECT statements +** that belong to the same connection. If there are, SQLITE_LOCKED is +** returned. In this case there is no "blocking connection", so invoking +** sqlite3_unlock_notify() results in the unlock-notify callback being +** invoked immediately. If the application then re-attempts the "DROP TABLE" +** 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 +** 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_API int sqlite3_unlock_notify( + sqlite3 *pBlocked, /* Waiting connection */ + void (*xNotify)(void **apArg, int nArg), /* Callback function to invoke */ + void *pNotifyArg /* Argument to pass to xNotify */ +); + + +/* +** CAPI3REF: String Comparison +** +** ^The [sqlite3_stricmp()] and [sqlite3_strnicmp()] APIs allow applications +** and extensions to compare the contents of two buffers containing UTF-8 +** strings in a case-independent fashion, using the same definition of "case +** independence" that SQLite uses internally when comparing identifiers. +*/ +SQLITE_API int sqlite3_stricmp(const char *, const char *); +SQLITE_API int sqlite3_strnicmp(const char *, const char *, int); + +/* +** CAPI3REF: String Globbing +* +** ^The [sqlite3_strglob(P,X)] interface returns zero if and only if +** string X matches the [GLOB] pattern P. +** ^The definition of [GLOB] pattern matching used in +** [sqlite3_strglob(P,X)] is the same as for the "X GLOB P" operator in the +** SQL dialect understood by SQLite. ^The [sqlite3_strglob(P,X)] function +** is case sensitive. +** +** Note that this routine returns zero on a match and non-zero if the strings +** do not match, the same as [sqlite3_stricmp()] and [sqlite3_strnicmp()]. +** +** See also: [sqlite3_strlike()]. +*/ +SQLITE_API int sqlite3_strglob(const char *zGlob, const char *zStr); + +/* +** CAPI3REF: String LIKE Matching +* +** ^The [sqlite3_strlike(P,X,E)] interface returns zero if and only if +** string X matches the [LIKE] pattern P with escape character E. +** ^The definition of [LIKE] pattern matching used in +** [sqlite3_strlike(P,X,E)] is the same as for the "X LIKE P ESCAPE E" +** operator in the SQL dialect understood by SQLite. ^For "X LIKE P" without +** the ESCAPE clause, set the E parameter of [sqlite3_strlike(P,X,E)] to 0. +** ^As with the LIKE operator, the [sqlite3_strlike(P,X,E)] function is case +** insensitive - equivalent upper and lower case ASCII characters match +** one another. +** +** ^The [sqlite3_strlike(P,X,E)] function matches Unicode characters, though +** only ASCII characters are case folded. +** +** Note that this routine returns zero on a match and non-zero if the strings +** do not match, the same as [sqlite3_stricmp()] and [sqlite3_strnicmp()]. +** +** See also: [sqlite3_strglob()]. +*/ +SQLITE_API int sqlite3_strlike(const char *zGlob, const char *zStr, unsigned int cEsc); + +/* +** CAPI3REF: Error Logging Interface +** +** ^The [sqlite3_log()] interface writes a message into the [error log] +** established by the [SQLITE_CONFIG_LOG] option to [sqlite3_config()]. +** ^If logging is enabled, the zFormat string and subsequent arguments are +** used with [sqlite3_snprintf()] to generate the final output string. +** +** The sqlite3_log() interface is intended for use by extensions such as +** virtual tables, collating functions, and SQL functions. While there is +** nothing to prevent an application from calling sqlite3_log(), doing so +** is considered bad form. +** +** The zFormat string must not be NULL. +** +** To avoid deadlocks and other threading problems, the sqlite3_log() routine +** will not use dynamically allocated memory. The log message is stored in +** a fixed-length buffer on the stack. If the log message is longer than +** a few hundred characters, it will be truncated to the length of the +** buffer. +*/ +SQLITE_API void sqlite3_log(int iErrCode, const char *zFormat, ...); + +/* +** CAPI3REF: Write-Ahead Log Commit Hook +** METHOD: sqlite3 +** +** ^The [sqlite3_wal_hook()] function is used to register a callback that +** is invoked each time data is committed to a database in wal mode. +** +** ^(The callback is invoked by SQLite after the commit has taken place and +** the associated write-lock on the database released)^, so the implementation +** may read, write or [checkpoint] the database as required. +** +** ^The first parameter passed to the callback function when it is invoked +** is a copy of the third parameter passed to sqlite3_wal_hook() when +** registering the callback. ^The second is a copy of the database handle. +** ^The third parameter is the name of the database that was written to - +** either "main" or the name of an [ATTACH]-ed database. ^The fourth parameter +** is the number of pages currently in the write-ahead log file, +** including those that were just committed. +** +** The callback function should normally return [SQLITE_OK]. ^If an error +** code is returned, that error will propagate back up through the +** SQLite code base to cause the statement that provoked the callback +** to report an error, though the commit will have still occurred. If the +** callback returns [SQLITE_ROW] or [SQLITE_DONE], or if it returns a value +** that does not correspond to any valid SQLite error code, the results +** are undefined. +** +** A single database handle may have at most a single write-ahead log callback +** registered at one time. ^Calling [sqlite3_wal_hook()] replaces any +** previously registered write-ahead log callback. ^Note that the +** [sqlite3_wal_autocheckpoint()] interface and the +** [wal_autocheckpoint pragma] both invoke [sqlite3_wal_hook()] and will +** overwrite any prior [sqlite3_wal_hook()] settings. +*/ +SQLITE_API void *sqlite3_wal_hook( + sqlite3*, + int(*)(void *,sqlite3*,const char*,int), + void* +); + +/* +** CAPI3REF: Configure an auto-checkpoint +** METHOD: sqlite3 +** +** ^The [sqlite3_wal_autocheckpoint(D,N)] is a wrapper around +** [sqlite3_wal_hook()] that causes any database on [database connection] D +** to automatically [checkpoint] +** after committing a transaction if there are N or +** more frames in the [write-ahead log] file. ^Passing zero or +** a negative value as the nFrame parameter disables automatic +** checkpoints entirely. +** +** ^The callback registered by this function replaces any existing callback +** registered using [sqlite3_wal_hook()]. ^Likewise, registering a callback +** using [sqlite3_wal_hook()] disables the automatic checkpoint mechanism +** configured by this function. +** +** ^The [wal_autocheckpoint pragma] can be used to invoke this interface +** from SQL. +** +** ^Checkpoints initiated by this mechanism are +** [sqlite3_wal_checkpoint_v2|PASSIVE]. +** +** ^Every new [database connection] defaults to having the auto-checkpoint +** enabled with a threshold of 1000 or [SQLITE_DEFAULT_WAL_AUTOCHECKPOINT] +** pages. The use of this interface +** is only necessary if the default setting is found to be suboptimal +** for a particular application. +*/ +SQLITE_API int sqlite3_wal_autocheckpoint(sqlite3 *db, int N); + +/* +** CAPI3REF: Checkpoint a database +** METHOD: sqlite3 +** +** ^(The sqlite3_wal_checkpoint(D,X) is equivalent to +** [sqlite3_wal_checkpoint_v2](D,X,[SQLITE_CHECKPOINT_PASSIVE],0,0).)^ +** +** In brief, sqlite3_wal_checkpoint(D,X) causes the content in the +** [write-ahead log] for database X on [database connection] D to be +** transferred into the database file and for the write-ahead log to +** be reset. See the [checkpointing] documentation for addition +** information. +** +** This interface used to be the only way to cause a checkpoint to +** occur. But then the newer and more powerful [sqlite3_wal_checkpoint_v2()] +** interface was added. This interface is retained for backwards +** compatibility and as a convenience for applications that need to manually +** start a callback but which do not need the full power (and corresponding +** complication) of [sqlite3_wal_checkpoint_v2()]. +*/ +SQLITE_API int sqlite3_wal_checkpoint(sqlite3 *db, const char *zDb); + +/* +** CAPI3REF: Checkpoint a database +** METHOD: sqlite3 +** +** ^(The sqlite3_wal_checkpoint_v2(D,X,M,L,C) interface runs a checkpoint +** operation on database X of [database connection] D in mode M. Status +** information is written back into integers pointed to by L and C.)^ +** ^(The M parameter must be a valid [checkpoint mode]:)^ +** +**
      +**
      SQLITE_CHECKPOINT_PASSIVE
      +** ^Checkpoint as many frames as possible without waiting for any database +** readers or writers to finish, then sync the database file if all frames +** in the log were checkpointed. ^The [busy-handler callback] +** is never invoked in the SQLITE_CHECKPOINT_PASSIVE mode. +** ^On the other hand, passive mode might leave the checkpoint unfinished +** if there are concurrent readers or writers. +** +**
      SQLITE_CHECKPOINT_FULL
      +** ^This mode blocks (it invokes the +** [sqlite3_busy_handler|busy-handler callback]) until there is no +** database writer and all readers are reading from the most recent database +** snapshot. ^It then checkpoints all frames in the log file and syncs the +** database file. ^This mode blocks new database writers while it is pending, +** but new database readers are allowed to continue unimpeded. +** +**
      SQLITE_CHECKPOINT_RESTART
      +** ^This mode works the same way as SQLITE_CHECKPOINT_FULL with the addition +** that after checkpointing the log file it blocks (calls the +** [busy-handler callback]) +** until all readers are reading from the database file only. ^This ensures +** that the next writer will restart the log file from the beginning. +** ^Like SQLITE_CHECKPOINT_FULL, this mode blocks new +** database writer attempts while it is pending, but does not impede readers. +** +**
      SQLITE_CHECKPOINT_TRUNCATE
      +** ^This mode works the same way as SQLITE_CHECKPOINT_RESTART with the +** addition that it also truncates the log file to zero bytes just prior +** to a successful return. +**
      +** +** ^If pnLog is not NULL, then *pnLog is set to the total number of frames in +** the log file or to -1 if the checkpoint could not run because +** of an error or because the database is not in [WAL mode]. ^If pnCkpt is not +** NULL,then *pnCkpt is set to the total number of checkpointed frames in the +** log file (including any that were already checkpointed before the function +** was called) or to -1 if the checkpoint could not run due to an error or +** because the database is not in WAL mode. ^Note that upon successful +** completion of an SQLITE_CHECKPOINT_TRUNCATE, the log file will have been +** truncated to zero bytes and so both *pnLog and *pnCkpt will be set to zero. +** +** ^All calls obtain an exclusive "checkpoint" lock on the database file. ^If +** any other process is running a checkpoint operation at the same time, the +** lock cannot be obtained and SQLITE_BUSY is returned. ^Even if there is a +** busy-handler configured, it will not be invoked in this case. +** +** ^The SQLITE_CHECKPOINT_FULL, RESTART and TRUNCATE modes also obtain the +** exclusive "writer" lock on the database file. ^If the writer lock cannot be +** obtained immediately, and a busy-handler is configured, it is invoked and +** the writer lock retried until either the busy-handler returns 0 or the lock +** is successfully obtained. ^The busy-handler is also invoked while waiting for +** database readers as described above. ^If the busy-handler returns 0 before +** the writer lock is obtained or while waiting for database readers, the +** checkpoint operation proceeds from that point in the same way as +** SQLITE_CHECKPOINT_PASSIVE - checkpointing as many frames as possible +** without blocking any further. ^SQLITE_BUSY is returned in this case. +** +** ^If parameter zDb is NULL or points to a zero length string, then the +** specified operation is attempted on all WAL databases [attached] to +** [database connection] db. In this case the +** values written to output parameters *pnLog and *pnCkpt are undefined. ^If +** an SQLITE_BUSY error is encountered when processing one or more of the +** attached WAL databases, the operation is still attempted on any remaining +** attached databases and SQLITE_BUSY is returned at the end. ^If any other +** error occurs while processing an attached database, processing is abandoned +** and the error code is returned to the caller immediately. ^If no error +** (SQLITE_BUSY or otherwise) is encountered while processing the attached +** databases, SQLITE_OK is returned. +** +** ^If database zDb is the name of an attached database that is not in WAL +** mode, SQLITE_OK is returned and both *pnLog and *pnCkpt set to -1. ^If +** zDb is not NULL (or a zero length string) and is not the name of any +** attached database, SQLITE_ERROR is returned to the caller. +** +** ^Unless it returns SQLITE_MISUSE, +** the sqlite3_wal_checkpoint_v2() interface +** sets the error information that is queried by +** [sqlite3_errcode()] and [sqlite3_errmsg()]. +** +** ^The [PRAGMA wal_checkpoint] command can be used to invoke this interface +** from SQL. +*/ +SQLITE_API int sqlite3_wal_checkpoint_v2( + sqlite3 *db, /* Database handle */ + const char *zDb, /* Name of attached database (or NULL) */ + int eMode, /* SQLITE_CHECKPOINT_* value */ + int *pnLog, /* OUT: Size of WAL log in frames */ + int *pnCkpt /* OUT: Total number of frames checkpointed */ +); + +/* +** CAPI3REF: Checkpoint Mode Values +** KEYWORDS: {checkpoint mode} +** +** These constants define all valid values for the "checkpoint mode" passed +** as the third parameter to the [sqlite3_wal_checkpoint_v2()] interface. +** See the [sqlite3_wal_checkpoint_v2()] documentation for details on the +** meaning of each of these checkpoint modes. +*/ +#define SQLITE_CHECKPOINT_PASSIVE 0 /* Do as much as possible w/o blocking */ +#define SQLITE_CHECKPOINT_FULL 1 /* Wait for writers, then checkpoint */ +#define SQLITE_CHECKPOINT_RESTART 2 /* Like FULL but wait for for readers */ +#define SQLITE_CHECKPOINT_TRUNCATE 3 /* Like RESTART but also truncate WAL */ + +/* +** CAPI3REF: Virtual Table Interface Configuration +** +** This function may be called by either the [xConnect] or [xCreate] method +** of a [virtual table] implementation to configure +** various facets of the virtual table interface. +** +** If this interface is invoked outside the context of an xConnect or +** xCreate virtual table method then the behavior is undefined. +** +** At present, there is only one option that may be configured using +** this function. (See [SQLITE_VTAB_CONSTRAINT_SUPPORT].) Further options +** may be added in the future. +*/ +SQLITE_API int sqlite3_vtab_config(sqlite3*, int op, ...); + +/* +** CAPI3REF: Virtual Table Configuration Options +** +** These macros define the various options to the +** [sqlite3_vtab_config()] interface that [virtual table] implementations +** can use to customize and optimize their behavior. +** +**
      +**
      SQLITE_VTAB_CONSTRAINT_SUPPORT +**
      Calls of the form +** [sqlite3_vtab_config](db,SQLITE_VTAB_CONSTRAINT_SUPPORT,X) are supported, +** where X is an integer. If X is zero, then the [virtual table] whose +** [xCreate] or [xConnect] method invoked [sqlite3_vtab_config()] does not +** support constraints. In this configuration (which is the default) if +** a call to the [xUpdate] method returns [SQLITE_CONSTRAINT], then the entire +** statement is rolled back as if [ON CONFLICT | OR ABORT] had been +** specified as part of the users SQL statement, regardless of the actual +** ON CONFLICT mode specified. +** +** If X is non-zero, then the virtual table implementation guarantees +** that if [xUpdate] returns [SQLITE_CONSTRAINT], it will do so before +** any modifications to internal or persistent data structures have been made. +** If the [ON CONFLICT] mode is ABORT, FAIL, IGNORE or ROLLBACK, SQLite +** is able to roll back a statement or database transaction, and abandon +** or continue processing the current SQL statement as appropriate. +** If the ON CONFLICT mode is REPLACE and the [xUpdate] method returns +** [SQLITE_CONSTRAINT], SQLite handles this as if the ON CONFLICT mode +** had been ABORT. +** +** Virtual table implementations that are required to handle OR REPLACE +** must do so within the [xUpdate] method. If a call to the +** [sqlite3_vtab_on_conflict()] function indicates that the current ON +** CONFLICT policy is REPLACE, the virtual table implementation should +** silently replace the appropriate rows within the xUpdate callback and +** return SQLITE_OK. Or, if this is not possible, it may return +** SQLITE_CONSTRAINT, in which case SQLite falls back to OR ABORT +** constraint handling. +**
      +*/ +#define SQLITE_VTAB_CONSTRAINT_SUPPORT 1 + +/* +** CAPI3REF: Determine The Virtual Table Conflict Policy +** +** This function may only be called from within a call to the [xUpdate] method +** of a [virtual table] implementation for an INSERT or UPDATE operation. ^The +** value returned is one of [SQLITE_ROLLBACK], [SQLITE_IGNORE], [SQLITE_FAIL], +** [SQLITE_ABORT], or [SQLITE_REPLACE], according to the [ON CONFLICT] mode +** of the SQL statement that triggered the call to the [xUpdate] method of the +** [virtual table]. +*/ +SQLITE_API int sqlite3_vtab_on_conflict(sqlite3 *); + +/* +** CAPI3REF: Conflict resolution modes +** KEYWORDS: {conflict resolution mode} +** +** These constants are returned by [sqlite3_vtab_on_conflict()] to +** inform a [virtual table] implementation what the [ON CONFLICT] mode +** is for the SQL statement being evaluated. +** +** Note that the [SQLITE_IGNORE] constant is also used as a potential +** return value from the [sqlite3_set_authorizer()] callback and that +** [SQLITE_ABORT] is also a [result code]. +*/ +#define SQLITE_ROLLBACK 1 +/* #define SQLITE_IGNORE 2 // Also used by sqlite3_authorizer() callback */ +#define SQLITE_FAIL 3 +/* #define SQLITE_ABORT 4 // Also an error code */ +#define SQLITE_REPLACE 5 + +/* +** CAPI3REF: Prepared Statement Scan Status Opcodes +** KEYWORDS: {scanstatus options} +** +** The following constants can be used for the T parameter to the +** [sqlite3_stmt_scanstatus(S,X,T,V)] interface. Each constant designates a +** different metric for sqlite3_stmt_scanstatus() to return. +** +** When the value returned to V is a string, space to hold that string is +** managed by the prepared statement S and will be automatically freed when +** S is finalized. +** +**
      +** [[SQLITE_SCANSTAT_NLOOP]]
      SQLITE_SCANSTAT_NLOOP
      +**
      ^The [sqlite3_int64] variable pointed to by the T parameter will be +** set to the total number of times that the X-th loop has run.
      +** +** [[SQLITE_SCANSTAT_NVISIT]]
      SQLITE_SCANSTAT_NVISIT
      +**
      ^The [sqlite3_int64] variable pointed to by the T parameter will be set +** to the total number of rows examined by all iterations of the X-th loop.
      +** +** [[SQLITE_SCANSTAT_EST]]
      SQLITE_SCANSTAT_EST
      +**
      ^The "double" variable pointed to by the T parameter will be set to the +** query planner's estimate for the average number of rows output from each +** iteration of the X-th loop. If the query planner's estimates was accurate, +** then this value will approximate the quotient NVISIT/NLOOP and the +** product of this value for all prior loops with the same SELECTID will +** be the NLOOP value for the current loop. +** +** [[SQLITE_SCANSTAT_NAME]]
      SQLITE_SCANSTAT_NAME
      +**
      ^The "const char *" variable pointed to by the T parameter will be set +** to a zero-terminated UTF-8 string containing the name of the index or table +** used for the X-th loop. +** +** [[SQLITE_SCANSTAT_EXPLAIN]]
      SQLITE_SCANSTAT_EXPLAIN
      +**
      ^The "const char *" variable pointed to by the T parameter will be set +** to a zero-terminated UTF-8 string containing the [EXPLAIN QUERY PLAN] +** description for the X-th loop. +** +** [[SQLITE_SCANSTAT_SELECTID]]
      SQLITE_SCANSTAT_SELECT
      +**
      ^The "int" variable pointed to by the T parameter will be set to the +** "select-id" for the X-th loop. The select-id identifies which query or +** subquery the loop is part of. The main query has a select-id of zero. +** The select-id is the same value as is output in the first column +** of an [EXPLAIN QUERY PLAN] query. +**
      +*/ +#define SQLITE_SCANSTAT_NLOOP 0 +#define SQLITE_SCANSTAT_NVISIT 1 +#define SQLITE_SCANSTAT_EST 2 +#define SQLITE_SCANSTAT_NAME 3 +#define SQLITE_SCANSTAT_EXPLAIN 4 +#define SQLITE_SCANSTAT_SELECTID 5 + +/* +** CAPI3REF: Prepared Statement Scan Status +** METHOD: sqlite3_stmt +** +** This interface returns information about the predicted and measured +** performance for pStmt. Advanced applications can use this +** interface to compare the predicted and the measured performance and +** issue warnings and/or rerun [ANALYZE] if discrepancies are found. +** +** Since this interface is expected to be rarely used, it is only +** available if SQLite is compiled using the [SQLITE_ENABLE_STMT_SCANSTATUS] +** compile-time option. +** +** The "iScanStatusOp" parameter determines which status information to return. +** The "iScanStatusOp" must be one of the [scanstatus options] or the behavior +** of this interface is undefined. +** ^The requested measurement is written into a variable pointed to by +** the "pOut" parameter. +** Parameter "idx" identifies the specific loop to retrieve statistics for. +** Loops are numbered starting from zero. ^If idx is out of range - less than +** zero or greater than or equal to the total number of loops used to implement +** the statement - a non-zero value is returned and the variable that pOut +** points to is unchanged. +** +** ^Statistics might not be available for all loops in all statements. ^In cases +** where there exist loops with no available statistics, this function behaves +** as if the loop did not exist - it returns non-zero and leave the variable +** that pOut points to unchanged. +** +** See also: [sqlite3_stmt_scanstatus_reset()] +*/ +SQLITE_API int sqlite3_stmt_scanstatus( + sqlite3_stmt *pStmt, /* Prepared statement for which info desired */ + int idx, /* Index of loop to report on */ + int iScanStatusOp, /* Information desired. SQLITE_SCANSTAT_* */ + void *pOut /* Result written here */ +); + +/* +** CAPI3REF: Zero Scan-Status Counters +** METHOD: sqlite3_stmt +** +** ^Zero all [sqlite3_stmt_scanstatus()] related event counters. +** +** This API is only available if the library is built with pre-processor +** symbol [SQLITE_ENABLE_STMT_SCANSTATUS] defined. +*/ +SQLITE_API void sqlite3_stmt_scanstatus_reset(sqlite3_stmt*); + +/* +** CAPI3REF: Flush caches to disk mid-transaction +** +** ^If a write-transaction is open on [database connection] D when the +** [sqlite3_db_cacheflush(D)] interface invoked, any dirty +** pages in the pager-cache that are not currently in use are written out +** to disk. A dirty page may be in use if a database cursor created by an +** active SQL statement is reading from it, or if it is page 1 of a database +** file (page 1 is always "in use"). ^The [sqlite3_db_cacheflush(D)] +** interface flushes caches for all schemas - "main", "temp", and +** any [attached] databases. +** +** ^If this function needs to obtain extra database locks before dirty pages +** can be flushed to disk, it does so. ^If those locks cannot be obtained +** immediately and there is a busy-handler callback configured, it is invoked +** in the usual manner. ^If the required lock still cannot be obtained, then +** the database is skipped and an attempt made to flush any dirty pages +** belonging to the next (if any) database. ^If any databases are skipped +** because locks cannot be obtained, but no other error occurs, this +** function returns SQLITE_BUSY. +** +** ^If any other error occurs while flushing dirty pages to disk (for +** example an IO error or out-of-memory condition), then processing is +** abandoned and an SQLite [error code] is returned to the caller immediately. +** +** ^Otherwise, if no error occurs, [sqlite3_db_cacheflush()] returns SQLITE_OK. +** +** ^This function does not set the database handle error code or message +** returned by the [sqlite3_errcode()] and [sqlite3_errmsg()] functions. +*/ +SQLITE_API int sqlite3_db_cacheflush(sqlite3*); + +/* +** CAPI3REF: The pre-update hook. +** +** ^These interfaces are only available if SQLite is compiled using the +** [SQLITE_ENABLE_PREUPDATE_HOOK] compile-time option. +** +** ^The [sqlite3_preupdate_hook()] interface registers a callback function +** that is invoked prior to each [INSERT], [UPDATE], and [DELETE] operation +** on a [rowid table]. +** ^At most one preupdate hook may be registered at a time on a single +** [database connection]; each call to [sqlite3_preupdate_hook()] overrides +** the previous setting. +** ^The preupdate hook is disabled by invoking [sqlite3_preupdate_hook()] +** with a NULL pointer as the second parameter. +** ^The third parameter to [sqlite3_preupdate_hook()] is passed through as +** the first parameter to callbacks. +** +** ^The preupdate hook only fires for changes to [rowid tables]; the preupdate +** hook is not invoked for changes to [virtual tables] or [WITHOUT ROWID] +** tables. +** +** ^The second parameter to the preupdate callback is a pointer to +** the [database connection] that registered the preupdate hook. +** ^The third parameter to the preupdate callback is one of the constants +** [SQLITE_INSERT], [SQLITE_DELETE], or [SQLITE_UPDATE] to identify the +** kind of update operation that is about to occur. +** ^(The fourth parameter to the preupdate callback is the name of the +** database within the database connection that is being modified. This +** will be "main" for the main database or "temp" for TEMP tables or +** the name given after the AS keyword in the [ATTACH] statement for attached +** databases.)^ +** ^The fifth parameter to the preupdate callback is the name of the +** table that is being modified. +** ^The sixth parameter to the preupdate callback is the initial [rowid] of the +** row being changes for SQLITE_UPDATE and SQLITE_DELETE changes and is +** undefined for SQLITE_INSERT changes. +** ^The seventh parameter to the preupdate callback is the final [rowid] of +** the row being changed for SQLITE_UPDATE and SQLITE_INSERT changes and is +** undefined for SQLITE_DELETE changes. +** +** The [sqlite3_preupdate_old()], [sqlite3_preupdate_new()], +** [sqlite3_preupdate_count()], and [sqlite3_preupdate_depth()] interfaces +** provide additional information about a preupdate event. These routines +** may only be called from within a preupdate callback. Invoking any of +** these routines from outside of a preupdate callback or with a +** [database connection] pointer that is different from the one supplied +** to the preupdate callback results in undefined and probably undesirable +** behavior. +** +** ^The [sqlite3_preupdate_count(D)] interface returns the number of columns +** in the row that is being inserted, updated, or deleted. +** +** ^The [sqlite3_preupdate_old(D,N,P)] interface writes into P a pointer to +** a [protected sqlite3_value] that contains the value of the Nth column of +** the table row before it is updated. The N parameter must be between 0 +** and one less than the number of columns or the behavior will be +** undefined. This must only be used within SQLITE_UPDATE and SQLITE_DELETE +** preupdate callbacks; if it is used by an SQLITE_INSERT callback then the +** behavior is undefined. The [sqlite3_value] that P points to +** will be destroyed when the preupdate callback returns. +** +** ^The [sqlite3_preupdate_new(D,N,P)] interface writes into P a pointer to +** a [protected sqlite3_value] that contains the value of the Nth column of +** the table row after it is updated. The N parameter must be between 0 +** and one less than the number of columns or the behavior will be +** undefined. This must only be used within SQLITE_INSERT and SQLITE_UPDATE +** preupdate callbacks; if it is used by an SQLITE_DELETE callback then the +** behavior is undefined. The [sqlite3_value] that P points to +** will be destroyed when the preupdate callback returns. +** +** ^The [sqlite3_preupdate_depth(D)] interface returns 0 if the preupdate +** callback was invoked as a result of a direct insert, update, or delete +** operation; or 1 for inserts, updates, or deletes invoked by top-level +** triggers; or 2 for changes resulting from triggers called by top-level +** triggers; and so forth. +** +** See also: [sqlite3_update_hook()] +*/ +SQLITE_API SQLITE_EXPERIMENTAL void *sqlite3_preupdate_hook( + sqlite3 *db, + void(*xPreUpdate)( + void *pCtx, /* Copy of third arg to preupdate_hook() */ + sqlite3 *db, /* Database handle */ + int op, /* SQLITE_UPDATE, DELETE or INSERT */ + char const *zDb, /* Database name */ + char const *zName, /* Table name */ + sqlite3_int64 iKey1, /* Rowid of row about to be deleted/updated */ + sqlite3_int64 iKey2 /* New rowid value (for a rowid UPDATE) */ + ), + void* +); +SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_preupdate_old(sqlite3 *, int, sqlite3_value **); +SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_preupdate_count(sqlite3 *); +SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_preupdate_depth(sqlite3 *); +SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_preupdate_new(sqlite3 *, int, sqlite3_value **); + +/* +** CAPI3REF: Low-level system error code +** +** ^Attempt to return the underlying operating system error code or error +** number that caused the most recent I/O error or failure to open a file. +** The return value is OS-dependent. For example, on unix systems, after +** [sqlite3_open_v2()] returns [SQLITE_CANTOPEN], this interface could be +** called to get back the underlying "errno" that caused the problem, such +** as ENOSPC, EAUTH, EISDIR, and so forth. +*/ +SQLITE_API int sqlite3_system_errno(sqlite3*); + +/* +** CAPI3REF: Database Snapshot +** KEYWORDS: {snapshot} +** EXPERIMENTAL +** +** An instance of the snapshot object records the state of a [WAL mode] +** database for some specific point in history. +** +** In [WAL mode], multiple [database connections] that are open on the +** same database file can each be reading a different historical version +** of the database file. When a [database connection] begins a read +** transaction, that connection sees an unchanging copy of the database +** as it existed for the point in time when the transaction first started. +** Subsequent changes to the database from other connections are not seen +** by the reader until a new read transaction is started. +** +** The sqlite3_snapshot object records state information about an historical +** version of the database file so that it is possible to later open a new read +** transaction that sees that historical version of the database rather than +** the most recent version. +** +** The constructor for this object is [sqlite3_snapshot_get()]. The +** [sqlite3_snapshot_open()] method causes a fresh read transaction to refer +** to an historical snapshot (if possible). The destructor for +** sqlite3_snapshot objects is [sqlite3_snapshot_free()]. +*/ +typedef struct sqlite3_snapshot sqlite3_snapshot; + +/* +** CAPI3REF: Record A Database Snapshot +** EXPERIMENTAL +** +** ^The [sqlite3_snapshot_get(D,S,P)] interface attempts to make a +** new [sqlite3_snapshot] object that records the current state of +** schema S in database connection D. ^On success, the +** [sqlite3_snapshot_get(D,S,P)] interface writes a pointer to the newly +** created [sqlite3_snapshot] object into *P and returns SQLITE_OK. +** ^If schema S of [database connection] D is not a [WAL mode] database +** that is in a read transaction, then [sqlite3_snapshot_get(D,S,P)] +** leaves the *P value unchanged and returns an appropriate [error code]. +** +** The [sqlite3_snapshot] object returned from a successful call to +** [sqlite3_snapshot_get()] must be freed using [sqlite3_snapshot_free()] +** to avoid a memory leak. +** +** The [sqlite3_snapshot_get()] interface is only available when the +** SQLITE_ENABLE_SNAPSHOT compile-time option is used. +*/ +SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_get( + sqlite3 *db, + const char *zSchema, + sqlite3_snapshot **ppSnapshot +); + +/* +** CAPI3REF: Start a read transaction on an historical snapshot +** EXPERIMENTAL +** +** ^The [sqlite3_snapshot_open(D,S,P)] interface starts a +** read transaction for schema S of +** [database connection] D such that the read transaction +** refers to historical [snapshot] P, rather than the most +** recent change to the database. +** ^The [sqlite3_snapshot_open()] interface returns SQLITE_OK on success +** or an appropriate [error code] if it fails. +** +** ^In order to succeed, a call to [sqlite3_snapshot_open(D,S,P)] must be +** the first operation following the [BEGIN] that takes the schema S +** out of [autocommit mode]. +** ^In other words, schema S must not currently be in +** a transaction for [sqlite3_snapshot_open(D,S,P)] to work, but the +** database connection D must be out of [autocommit mode]. +** ^A [snapshot] will fail to open if it has been overwritten by a +** [checkpoint]. +** ^(A call to [sqlite3_snapshot_open(D,S,P)] will fail if the +** database connection D does not know that the database file for +** schema S is in [WAL mode]. A database connection might not know +** that the database file is in [WAL mode] if there has been no prior +** I/O on that database connection, or if the database entered [WAL mode] +** after the most recent I/O on the database connection.)^ +** (Hint: Run "[PRAGMA application_id]" against a newly opened +** database connection in order to make it ready to use snapshots.) +** +** The [sqlite3_snapshot_open()] interface is only available when the +** SQLITE_ENABLE_SNAPSHOT compile-time option is used. +*/ +SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_open( + sqlite3 *db, + const char *zSchema, + sqlite3_snapshot *pSnapshot +); + +/* +** CAPI3REF: Destroy a snapshot +** EXPERIMENTAL +** +** ^The [sqlite3_snapshot_free(P)] interface destroys [sqlite3_snapshot] P. +** The application must eventually free every [sqlite3_snapshot] object +** using this routine to avoid a memory leak. +** +** The [sqlite3_snapshot_free()] interface is only available when the +** SQLITE_ENABLE_SNAPSHOT compile-time option is used. +*/ +SQLITE_API SQLITE_EXPERIMENTAL void sqlite3_snapshot_free(sqlite3_snapshot*); + +/* +** CAPI3REF: Compare the ages of two snapshot handles. +** EXPERIMENTAL +** +** The sqlite3_snapshot_cmp(P1, P2) interface is used to compare the ages +** of two valid snapshot handles. +** +** If the two snapshot handles are not associated with the same database +** file, the result of the comparison is undefined. +** +** Additionally, the result of the comparison is only valid if both of the +** snapshot handles were obtained by calling sqlite3_snapshot_get() since the +** last time the wal file was deleted. The wal file is deleted when the +** database is changed back to rollback mode or when the number of database +** clients drops to zero. If either snapshot handle was obtained before the +** wal file was last deleted, the value returned by this function +** is undefined. +** +** Otherwise, this API returns a negative value if P1 refers to an older +** snapshot than P2, zero if the two handles refer to the same database +** snapshot, and a positive value if P1 is a newer snapshot than P2. +*/ +SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_cmp( + sqlite3_snapshot *p1, + sqlite3_snapshot *p2 +); + +/* +** Undo the hack that converts floating point types to integer for +** builds on processors without floating point support. +*/ +#ifdef SQLITE_OMIT_FLOATING_POINT +# undef double +#endif + +#if 0 +} /* End of the 'extern "C"' block */ +#endif +#endif /* SQLITE3_H */ + +/******** Begin file sqlite3rtree.h *********/ +/* +** 2010 August 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. +** +************************************************************************* +*/ + +#ifndef _SQLITE3RTREE_H_ +#define _SQLITE3RTREE_H_ + + +#if 0 +extern "C" { +#endif + +typedef struct sqlite3_rtree_geometry sqlite3_rtree_geometry; +typedef struct sqlite3_rtree_query_info sqlite3_rtree_query_info; + +/* The double-precision datatype used by RTree depends on the +** SQLITE_RTREE_INT_ONLY compile-time option. +*/ +#ifdef SQLITE_RTREE_INT_ONLY + typedef sqlite3_int64 sqlite3_rtree_dbl; +#else + typedef double sqlite3_rtree_dbl; +#endif + +/* +** Register a geometry callback named zGeom that can be used as part of an +** R-Tree geometry query as follows: +** +** SELECT ... FROM WHERE MATCH $zGeom(... params ...) +*/ +SQLITE_API int sqlite3_rtree_geometry_callback( + sqlite3 *db, + const char *zGeom, + int (*xGeom)(sqlite3_rtree_geometry*, int, sqlite3_rtree_dbl*,int*), + void *pContext +); + + +/* +** A pointer to a structure of the following type is passed as the first +** argument to callbacks registered using rtree_geometry_callback(). +*/ +struct sqlite3_rtree_geometry { + void *pContext; /* Copy of pContext passed to s_r_g_c() */ + int nParam; /* Size of array aParam[] */ + sqlite3_rtree_dbl *aParam; /* Parameters passed to SQL geom function */ + void *pUser; /* Callback implementation user data */ + void (*xDelUser)(void *); /* Called by SQLite to clean up pUser */ +}; + +/* +** Register a 2nd-generation geometry callback named zScore that can be +** used as part of an R-Tree geometry query as follows: +** +** SELECT ... FROM WHERE MATCH $zQueryFunc(... params ...) +*/ +SQLITE_API int sqlite3_rtree_query_callback( + sqlite3 *db, + const char *zQueryFunc, + int (*xQueryFunc)(sqlite3_rtree_query_info*), + void *pContext, + void (*xDestructor)(void*) +); + + +/* +** A pointer to a structure of the following type is passed as the +** argument to scored geometry callback registered using +** sqlite3_rtree_query_callback(). +** +** Note that the first 5 fields of this structure are identical to +** sqlite3_rtree_geometry. This structure is a subclass of +** sqlite3_rtree_geometry. +*/ +struct sqlite3_rtree_query_info { + void *pContext; /* pContext from when function registered */ + int nParam; /* Number of function parameters */ + sqlite3_rtree_dbl *aParam; /* value of function parameters */ + void *pUser; /* callback can use this, if desired */ + void (*xDelUser)(void*); /* function to free pUser */ + sqlite3_rtree_dbl *aCoord; /* Coordinates of node or entry to check */ + unsigned int *anQueue; /* Number of pending entries in the queue */ + int nCoord; /* Number of coordinates */ + int iLevel; /* Level of current node or entry */ + int mxLevel; /* The largest iLevel value in the tree */ + sqlite3_int64 iRowid; /* Rowid for current entry */ + sqlite3_rtree_dbl rParentScore; /* Score of parent node */ + int eParentWithin; /* Visibility of parent node */ + int eWithin; /* OUT: Visiblity */ + sqlite3_rtree_dbl rScore; /* OUT: Write the score here */ + /* The following fields are only available in 3.8.11 and later */ + sqlite3_value **apSqlParam; /* Original SQL values of parameters */ +}; + +/* +** Allowed values for sqlite3_rtree_query.eWithin and .eParentWithin. +*/ +#define NOT_WITHIN 0 /* Object completely outside of query region */ +#define PARTLY_WITHIN 1 /* Object partially overlaps query region */ +#define FULLY_WITHIN 2 /* Object fully contained within query region */ + + +#if 0 +} /* end of the 'extern "C"' block */ +#endif + +#endif /* ifndef _SQLITE3RTREE_H_ */ + +/******** End of sqlite3rtree.h *********/ +/******** Begin file sqlite3session.h *********/ + +#if !defined(__SQLITESESSION_H_) && defined(SQLITE_ENABLE_SESSION) +#define __SQLITESESSION_H_ 1 + +/* +** Make sure we can call this stuff from C++. +*/ +#if 0 +extern "C" { +#endif + + +/* +** CAPI3REF: Session Object Handle +*/ +typedef struct sqlite3_session sqlite3_session; + +/* +** CAPI3REF: Changeset Iterator Handle +*/ +typedef struct sqlite3_changeset_iter sqlite3_changeset_iter; + +/* +** CAPI3REF: Create A New Session Object +** +** Create a new session object attached to database handle db. If successful, +** a pointer to the new object is written to *ppSession and SQLITE_OK is +** returned. If an error occurs, *ppSession is set to NULL and an SQLite +** error code (e.g. SQLITE_NOMEM) is returned. +** +** It is possible to create multiple session objects attached to a single +** database handle. +** +** Session objects created using this function should be deleted using the +** [sqlite3session_delete()] function before the database handle that they +** are attached to is itself closed. If the database handle is closed before +** the session object is deleted, then the results of calling any session +** module function, including [sqlite3session_delete()] on the session object +** are undefined. +** +** Because the session module uses the [sqlite3_preupdate_hook()] API, it +** is not possible for an application to register a pre-update hook on a +** database handle that has one or more session objects attached. Nor is +** it possible to create a session object attached to a database handle for +** which a pre-update hook is already defined. The results of attempting +** either of these things are undefined. +** +** The session object will be used to create changesets for tables in +** database zDb, where zDb is either "main", or "temp", or the name of an +** attached database. It is not an error if database zDb is not attached +** to the database when the session object is created. +*/ +int sqlite3session_create( + sqlite3 *db, /* Database handle */ + const char *zDb, /* Name of db (e.g. "main") */ + sqlite3_session **ppSession /* OUT: New session object */ +); + +/* +** CAPI3REF: Delete A Session Object +** +** Delete a session object previously allocated using +** [sqlite3session_create()]. Once a session object has been deleted, the +** results of attempting to use pSession with any other session module +** function are undefined. +** +** Session objects must be deleted before the database handle to which they +** are attached is closed. Refer to the documentation for +** [sqlite3session_create()] for details. +*/ +void sqlite3session_delete(sqlite3_session *pSession); + + +/* +** CAPI3REF: Enable Or Disable A Session Object +** +** Enable or disable the recording of changes by a session object. When +** enabled, a session object records changes made to the database. When +** disabled - it does not. A newly created session object is enabled. +** Refer to the documentation for [sqlite3session_changeset()] for further +** details regarding how enabling and disabling a session object affects +** the eventual changesets. +** +** Passing zero to this function disables the session. Passing a value +** greater than zero enables it. Passing a value less than zero is a +** no-op, and may be used to query the current state of the session. +** +** The return value indicates the final state of the session object: 0 if +** the session is disabled, or 1 if it is enabled. +*/ +int sqlite3session_enable(sqlite3_session *pSession, int bEnable); + +/* +** CAPI3REF: Set Or Clear the Indirect Change Flag +** +** Each change recorded by a session object is marked as either direct or +** indirect. A change is marked as indirect if either: +** +**
        +**
      • The session object "indirect" flag is set when the change is +** made, or +**
      • The change is made by an SQL trigger or foreign key action +** instead of directly as a result of a users SQL statement. +**
      +** +** If a single row is affected by more than one operation within a session, +** then the change is considered indirect if all operations meet the criteria +** for an indirect change above, or direct otherwise. +** +** This function is used to set, clear or query the session object indirect +** flag. If the second argument passed to this function is zero, then the +** indirect flag is cleared. If it is greater than zero, the indirect flag +** is set. Passing a value less than zero does not modify the current value +** of the indirect flag, and may be used to query the current state of the +** indirect flag for the specified session object. +** +** The return value indicates the final state of the indirect flag: 0 if +** it is clear, or 1 if it is set. +*/ +int sqlite3session_indirect(sqlite3_session *pSession, int bIndirect); + +/* +** CAPI3REF: Attach A Table To A Session Object +** +** If argument zTab is not NULL, then it is the name of a table to attach +** to the session object passed as the first argument. All subsequent changes +** made to the table while the session object is enabled will be recorded. See +** documentation for [sqlite3session_changeset()] for further details. +** +** Or, if argument zTab is NULL, then changes are recorded for all tables +** in the database. If additional tables are added to the database (by +** executing "CREATE TABLE" statements) after this call is made, changes for +** the new tables are also recorded. +** +** Changes can only be recorded for tables that have a PRIMARY KEY explicitly +** defined as part of their CREATE TABLE statement. It does not matter if the +** PRIMARY KEY is an "INTEGER PRIMARY KEY" (rowid alias) or not. The PRIMARY +** KEY may consist of a single column, or may be a composite key. +** +** It is not an error if the named table does not exist in the database. Nor +** is it an error if the named table does not have a PRIMARY KEY. However, +** no changes will be recorded in either of these scenarios. +** +** Changes are not recorded for individual rows that have NULL values stored +** in one or more of their PRIMARY KEY columns. +** +** SQLITE_OK is returned if the call completes without error. Or, if an error +** occurs, an SQLite error code (e.g. SQLITE_NOMEM) is returned. +*/ +int sqlite3session_attach( + sqlite3_session *pSession, /* Session object */ + const char *zTab /* Table name */ +); + +/* +** CAPI3REF: Set a table filter on a Session Object. +** +** The second argument (xFilter) is the "filter callback". For changes to rows +** in tables that are not attached to the Session object, the filter is called +** to determine whether changes to the table's rows should be tracked or not. +** If xFilter returns 0, changes is not tracked. Note that once a table is +** attached, xFilter will not be called again. +*/ +void sqlite3session_table_filter( + sqlite3_session *pSession, /* Session object */ + int(*xFilter)( + void *pCtx, /* Copy of third arg to _filter_table() */ + const char *zTab /* Table name */ + ), + void *pCtx /* First argument passed to xFilter */ +); + +/* +** CAPI3REF: Generate A Changeset From A Session Object +** +** Obtain a changeset containing changes to the tables attached to the +** session object passed as the first argument. If successful, +** set *ppChangeset to point to a buffer containing the changeset +** and *pnChangeset to the size of the changeset in bytes before returning +** SQLITE_OK. If an error occurs, set both *ppChangeset and *pnChangeset to +** zero and return an SQLite error code. +** +** A changeset consists of zero or more INSERT, UPDATE and/or DELETE changes, +** each representing a change to a single row of an attached table. An INSERT +** change contains the values of each field of a new database row. A DELETE +** contains the original values of each field of a deleted database row. An +** UPDATE change contains the original values of each field of an updated +** database row along with the updated values for each updated non-primary-key +** column. It is not possible for an UPDATE change to represent a change that +** modifies the values of primary key columns. If such a change is made, it +** is represented in a changeset as a DELETE followed by an INSERT. +** +** Changes are not recorded for rows that have NULL values stored in one or +** more of their PRIMARY KEY columns. If such a row is inserted or deleted, +** no corresponding change is present in the changesets returned by this +** function. If an existing row with one or more NULL values stored in +** PRIMARY KEY columns is updated so that all PRIMARY KEY columns are non-NULL, +** only an INSERT is appears in the changeset. Similarly, if an existing row +** with non-NULL PRIMARY KEY values is updated so that one or more of its +** PRIMARY KEY columns are set to NULL, the resulting changeset contains a +** DELETE change only. +** +** The contents of a changeset may be traversed using an iterator created +** using the [sqlite3changeset_start()] API. A changeset may be applied to +** a database with a compatible schema using the [sqlite3changeset_apply()] +** API. +** +** Within a changeset generated by this function, all changes related to a +** single table are grouped together. In other words, when iterating through +** a changeset or when applying a changeset to a database, all changes related +** to a single table are processed before moving on to the next table. Tables +** are sorted in the same order in which they were attached (or auto-attached) +** to the sqlite3_session object. The order in which the changes related to +** a single table are stored is undefined. +** +** Following a successful call to this function, it is the responsibility of +** the caller to eventually free the buffer that *ppChangeset points to using +** [sqlite3_free()]. +** +**

      Changeset Generation

      +** +** Once a table has been attached to a session object, the session object +** records the primary key values of all new rows inserted into the table. +** It also records the original primary key and other column values of any +** deleted or updated rows. For each unique primary key value, data is only +** recorded once - the first time a row with said primary key is inserted, +** updated or deleted in the lifetime of the session. +** +** There is one exception to the previous paragraph: when a row is inserted, +** updated or deleted, if one or more of its primary key columns contain a +** NULL value, no record of the change is made. +** +** The session object therefore accumulates two types of records - those +** that consist of primary key values only (created when the user inserts +** a new record) and those that consist of the primary key values and the +** original values of other table columns (created when the users deletes +** or updates a record). +** +** When this function is called, the requested changeset is created using +** both the accumulated records and the current contents of the database +** file. Specifically: +** +**
        +**
      • For each record generated by an insert, the database is queried +** for a row with a matching primary key. If one is found, an INSERT +** change is added to the changeset. If no such row is found, no change +** is added to the changeset. +** +**
      • For each record generated by an update or delete, the database is +** queried for a row with a matching primary key. If such a row is +** found and one or more of the non-primary key fields have been +** modified from their original values, an UPDATE change is added to +** the changeset. Or, if no such row is found in the table, a DELETE +** change is added to the changeset. If there is a row with a matching +** primary key in the database, but all fields contain their original +** values, no change is added to the changeset. +**
      +** +** This means, amongst other things, that if a row is inserted and then later +** deleted while a session object is active, neither the insert nor the delete +** will be present in the changeset. Or if a row is deleted and then later a +** row with the same primary key values inserted while a session object is +** active, the resulting changeset will contain an UPDATE change instead of +** a DELETE and an INSERT. +** +** When a session object is disabled (see the [sqlite3session_enable()] API), +** it does not accumulate records when rows are inserted, updated or deleted. +** This may appear to have some counter-intuitive effects if a single row +** is written to more than once during a session. For example, if a row +** is inserted while a session object is enabled, then later deleted while +** the same session object is disabled, no INSERT record will appear in the +** changeset, even though the delete took place while the session was disabled. +** Or, if one field of a row is updated while a session is disabled, and +** another field of the same row is updated while the session is enabled, the +** resulting changeset will contain an UPDATE change that updates both fields. +*/ +int sqlite3session_changeset( + sqlite3_session *pSession, /* Session object */ + int *pnChangeset, /* OUT: Size of buffer at *ppChangeset */ + void **ppChangeset /* OUT: Buffer containing changeset */ +); + +/* +** CAPI3REF: Load The Difference Between Tables Into A Session +** +** If it is not already attached to the session object passed as the first +** argument, this function attaches table zTbl in the same manner as the +** [sqlite3session_attach()] function. If zTbl does not exist, or if it +** does not have a primary key, this function is a no-op (but does not return +** an error). +** +** Argument zFromDb must be the name of a database ("main", "temp" etc.) +** attached to the same database handle as the session object that contains +** a table compatible with the table attached to the session by this function. +** A table is considered compatible if it: +** +**
        +**
      • Has the same name, +**
      • Has the same set of columns declared in the same order, and +**
      • Has the same PRIMARY KEY definition. +**
      +** +** If the tables are not compatible, SQLITE_SCHEMA is returned. If the tables +** are compatible but do not have any PRIMARY KEY columns, it is not an error +** but no changes are added to the session object. As with other session +** APIs, tables without PRIMARY KEYs are simply ignored. +** +** This function adds a set of changes to the session object that could be +** used to update the table in database zFrom (call this the "from-table") +** so that its content is the same as the table attached to the session +** object (call this the "to-table"). Specifically: +** +**
        +**
      • For each row (primary key) that exists in the to-table but not in +** the from-table, an INSERT record is added to the session object. +** +**
      • For each row (primary key) that exists in the to-table but not in +** the from-table, a DELETE record is added to the session object. +** +**
      • For each row (primary key) that exists in both tables, but features +** different in each, an UPDATE record is added to the session. +**
      +** +** To clarify, if this function is called and then a changeset constructed +** using [sqlite3session_changeset()], then after applying that changeset to +** database zFrom the contents of the two compatible tables would be +** identical. +** +** It an error if database zFrom does not exist or does not contain the +** required compatible table. +** +** If the operation successful, SQLITE_OK is returned. Otherwise, an SQLite +** error code. In this case, if argument pzErrMsg is not NULL, *pzErrMsg +** may be set to point to a buffer containing an English language error +** message. It is the responsibility of the caller to free this buffer using +** sqlite3_free(). +*/ +int sqlite3session_diff( + sqlite3_session *pSession, + const char *zFromDb, + const char *zTbl, + char **pzErrMsg +); + + +/* +** CAPI3REF: Generate A Patchset From A Session Object +** +** The differences between a patchset and a changeset are that: +** +**
        +**
      • DELETE records consist of the primary key fields only. The +** original values of other fields are omitted. +**
      • The original values of any modified fields are omitted from +** UPDATE records. +**
      +** +** A patchset blob may be used with up to date versions of all +** sqlite3changeset_xxx API functions except for sqlite3changeset_invert(), +** which returns SQLITE_CORRUPT if it is passed a patchset. Similarly, +** attempting to use a patchset blob with old versions of the +** sqlite3changeset_xxx APIs also provokes an SQLITE_CORRUPT error. +** +** Because the non-primary key "old.*" fields are omitted, no +** SQLITE_CHANGESET_DATA conflicts can be detected or reported if a patchset +** is passed to the sqlite3changeset_apply() API. Other conflict types work +** in the same way as for changesets. +** +** Changes within a patchset are ordered in the same way as for changesets +** generated by the sqlite3session_changeset() function (i.e. all changes for +** a single table are grouped together, tables appear in the order in which +** they were attached to the session object). +*/ +int sqlite3session_patchset( + sqlite3_session *pSession, /* Session object */ + int *pnPatchset, /* OUT: Size of buffer at *ppChangeset */ + void **ppPatchset /* OUT: Buffer containing changeset */ +); + +/* +** CAPI3REF: Test if a changeset has recorded any changes. +** +** Return non-zero if no changes to attached tables have been recorded by +** the session object passed as the first argument. Otherwise, if one or +** more changes have been recorded, return zero. +** +** Even if this function returns zero, it is possible that calling +** [sqlite3session_changeset()] on the session handle may still return a +** changeset that contains no changes. This can happen when a row in +** an attached table is modified and then later on the original values +** are restored. However, if this function returns non-zero, then it is +** guaranteed that a call to sqlite3session_changeset() will return a +** changeset containing zero changes. +*/ +int sqlite3session_isempty(sqlite3_session *pSession); + +/* +** CAPI3REF: Create An Iterator To Traverse A Changeset +** +** Create an iterator used to iterate through the contents of a changeset. +** If successful, *pp is set to point to the iterator handle and SQLITE_OK +** is returned. Otherwise, if an error occurs, *pp is set to zero and an +** SQLite error code is returned. +** +** The following functions can be used to advance and query a changeset +** iterator created by this function: +** +**
        +**
      • [sqlite3changeset_next()] +**
      • [sqlite3changeset_op()] +**
      • [sqlite3changeset_new()] +**
      • [sqlite3changeset_old()] +**
      +** +** It is the responsibility of the caller to eventually destroy the iterator +** by passing it to [sqlite3changeset_finalize()]. The buffer containing the +** changeset (pChangeset) must remain valid until after the iterator is +** destroyed. +** +** Assuming the changeset blob was created by one of the +** [sqlite3session_changeset()], [sqlite3changeset_concat()] or +** [sqlite3changeset_invert()] functions, all changes within the changeset +** that apply to a single table are grouped together. This means that when +** an application iterates through a changeset using an iterator created by +** this function, all changes that relate to a single table are visited +** consecutively. There is no chance that the iterator will visit a change +** the applies to table X, then one for table Y, and then later on visit +** another change for table X. +*/ +int sqlite3changeset_start( + sqlite3_changeset_iter **pp, /* OUT: New changeset iterator handle */ + int nChangeset, /* Size of changeset blob in bytes */ + void *pChangeset /* Pointer to blob containing changeset */ +); + + +/* +** CAPI3REF: Advance A Changeset Iterator +** +** This function may only be used with iterators created by function +** [sqlite3changeset_start()]. If it is called on an iterator passed to +** a conflict-handler callback by [sqlite3changeset_apply()], SQLITE_MISUSE +** is returned and the call has no effect. +** +** Immediately after an iterator is created by sqlite3changeset_start(), it +** does not point to any change in the changeset. Assuming the changeset +** is not empty, the first call to this function advances the iterator to +** point to the first change in the changeset. Each subsequent call advances +** the iterator to point to the next change in the changeset (if any). If +** no error occurs and the iterator points to a valid change after a call +** to sqlite3changeset_next() has advanced it, SQLITE_ROW is returned. +** Otherwise, if all changes in the changeset have already been visited, +** SQLITE_DONE is returned. +** +** If an error occurs, an SQLite error code is returned. Possible error +** codes include SQLITE_CORRUPT (if the changeset buffer is corrupt) or +** SQLITE_NOMEM. +*/ +int sqlite3changeset_next(sqlite3_changeset_iter *pIter); + +/* +** CAPI3REF: Obtain The Current Operation From A Changeset Iterator +** +** The pIter argument passed to this function may either be an iterator +** passed to a conflict-handler by [sqlite3changeset_apply()], or an iterator +** created by [sqlite3changeset_start()]. In the latter case, the most recent +** call to [sqlite3changeset_next()] must have returned [SQLITE_ROW]. If this +** is not the case, this function returns [SQLITE_MISUSE]. +** +** If argument pzTab is not NULL, then *pzTab is set to point to a +** nul-terminated utf-8 encoded string containing the name of the table +** affected by the current change. The buffer remains valid until either +** sqlite3changeset_next() is called on the iterator or until the +** conflict-handler function returns. If pnCol is not NULL, then *pnCol is +** set to the number of columns in the table affected by the change. If +** pbIncorrect is not NULL, then *pbIndirect is set to true (1) if the change +** is an indirect change, or false (0) otherwise. See the documentation for +** [sqlite3session_indirect()] for a description of direct and indirect +** changes. Finally, if pOp is not NULL, then *pOp is set to one of +** [SQLITE_INSERT], [SQLITE_DELETE] or [SQLITE_UPDATE], depending on the +** type of change that the iterator currently points to. +** +** If no error occurs, SQLITE_OK is returned. If an error does occur, an +** SQLite error code is returned. The values of the output variables may not +** be trusted in this case. +*/ +int sqlite3changeset_op( + sqlite3_changeset_iter *pIter, /* Iterator object */ + const char **pzTab, /* OUT: Pointer to table name */ + int *pnCol, /* OUT: Number of columns in table */ + int *pOp, /* OUT: SQLITE_INSERT, DELETE or UPDATE */ + int *pbIndirect /* OUT: True for an 'indirect' change */ +); + +/* +** CAPI3REF: Obtain The Primary Key Definition Of A Table +** +** For each modified table, a changeset includes the following: +** +**
        +**
      • The number of columns in the table, and +**
      • Which of those columns make up the tables PRIMARY KEY. +**
      +** +** This function is used to find which columns comprise the PRIMARY KEY of +** the table modified by the change that iterator pIter currently points to. +** If successful, *pabPK is set to point to an array of nCol entries, where +** nCol is the number of columns in the table. Elements of *pabPK are set to +** 0x01 if the corresponding column is part of the tables primary key, or +** 0x00 if it is not. +** +** If argument pnCol is not NULL, then *pnCol is set to the number of columns +** in the table. +** +** If this function is called when the iterator does not point to a valid +** entry, SQLITE_MISUSE is returned and the output variables zeroed. Otherwise, +** SQLITE_OK is returned and the output variables populated as described +** above. +*/ +int sqlite3changeset_pk( + sqlite3_changeset_iter *pIter, /* Iterator object */ + unsigned char **pabPK, /* OUT: Array of boolean - true for PK cols */ + int *pnCol /* OUT: Number of entries in output array */ +); + +/* +** CAPI3REF: Obtain old.* Values From A Changeset Iterator +** +** The pIter argument passed to this function may either be an iterator +** passed to a conflict-handler by [sqlite3changeset_apply()], or an iterator +** created by [sqlite3changeset_start()]. In the latter case, the most recent +** call to [sqlite3changeset_next()] must have returned SQLITE_ROW. +** Furthermore, it may only be called if the type of change that the iterator +** currently points to is either [SQLITE_DELETE] or [SQLITE_UPDATE]. Otherwise, +** this function returns [SQLITE_MISUSE] and sets *ppValue to NULL. +** +** Argument iVal must be greater than or equal to 0, and less than the number +** of columns in the table affected by the current change. Otherwise, +** [SQLITE_RANGE] is returned and *ppValue is set to NULL. +** +** If successful, this function sets *ppValue to point to a protected +** sqlite3_value object containing the iVal'th value from the vector of +** original row values stored as part of the UPDATE or DELETE change and +** returns SQLITE_OK. The name of the function comes from the fact that this +** is similar to the "old.*" columns available to update or delete triggers. +** +** If some other error occurs (e.g. an OOM condition), an SQLite error code +** is returned and *ppValue is set to NULL. +*/ +int sqlite3changeset_old( + sqlite3_changeset_iter *pIter, /* Changeset iterator */ + int iVal, /* Column number */ + sqlite3_value **ppValue /* OUT: Old value (or NULL pointer) */ +); + +/* +** CAPI3REF: Obtain new.* Values From A Changeset Iterator +** +** The pIter argument passed to this function may either be an iterator +** passed to a conflict-handler by [sqlite3changeset_apply()], or an iterator +** created by [sqlite3changeset_start()]. In the latter case, the most recent +** call to [sqlite3changeset_next()] must have returned SQLITE_ROW. +** Furthermore, it may only be called if the type of change that the iterator +** currently points to is either [SQLITE_UPDATE] or [SQLITE_INSERT]. Otherwise, +** this function returns [SQLITE_MISUSE] and sets *ppValue to NULL. +** +** Argument iVal must be greater than or equal to 0, and less than the number +** of columns in the table affected by the current change. Otherwise, +** [SQLITE_RANGE] is returned and *ppValue is set to NULL. +** +** If successful, this function sets *ppValue to point to a protected +** sqlite3_value object containing the iVal'th value from the vector of +** new row values stored as part of the UPDATE or INSERT change and +** returns SQLITE_OK. If the change is an UPDATE and does not include +** a new value for the requested column, *ppValue is set to NULL and +** SQLITE_OK returned. The name of the function comes from the fact that +** this is similar to the "new.*" columns available to update or delete +** triggers. +** +** If some other error occurs (e.g. an OOM condition), an SQLite error code +** is returned and *ppValue is set to NULL. +*/ +int sqlite3changeset_new( + sqlite3_changeset_iter *pIter, /* Changeset iterator */ + int iVal, /* Column number */ + sqlite3_value **ppValue /* OUT: New value (or NULL pointer) */ +); + +/* +** CAPI3REF: Obtain Conflicting Row Values From A Changeset Iterator +** +** This function should only be used with iterator objects passed to a +** conflict-handler callback by [sqlite3changeset_apply()] with either +** [SQLITE_CHANGESET_DATA] or [SQLITE_CHANGESET_CONFLICT]. If this function +** is called on any other iterator, [SQLITE_MISUSE] is returned and *ppValue +** is set to NULL. +** +** Argument iVal must be greater than or equal to 0, and less than the number +** of columns in the table affected by the current change. Otherwise, +** [SQLITE_RANGE] is returned and *ppValue is set to NULL. +** +** If successful, this function sets *ppValue to point to a protected +** sqlite3_value object containing the iVal'th value from the +** "conflicting row" associated with the current conflict-handler callback +** and returns SQLITE_OK. +** +** If some other error occurs (e.g. an OOM condition), an SQLite error code +** is returned and *ppValue is set to NULL. +*/ +int sqlite3changeset_conflict( + sqlite3_changeset_iter *pIter, /* Changeset iterator */ + int iVal, /* Column number */ + sqlite3_value **ppValue /* OUT: Value from conflicting row */ +); + +/* +** CAPI3REF: Determine The Number Of Foreign Key Constraint Violations +** +** This function may only be called with an iterator passed to an +** SQLITE_CHANGESET_FOREIGN_KEY conflict handler callback. In this case +** it sets the output variable to the total number of known foreign key +** violations in the destination database and returns SQLITE_OK. +** +** In all other cases this function returns SQLITE_MISUSE. +*/ +int sqlite3changeset_fk_conflicts( + sqlite3_changeset_iter *pIter, /* Changeset iterator */ + int *pnOut /* OUT: Number of FK violations */ +); + + +/* +** CAPI3REF: Finalize A Changeset Iterator +** +** This function is used to finalize an iterator allocated with +** [sqlite3changeset_start()]. +** +** This function should only be called on iterators created using the +** [sqlite3changeset_start()] function. If an application calls this +** function with an iterator passed to a conflict-handler by +** [sqlite3changeset_apply()], [SQLITE_MISUSE] is immediately returned and the +** call has no effect. +** +** If an error was encountered within a call to an sqlite3changeset_xxx() +** function (for example an [SQLITE_CORRUPT] in [sqlite3changeset_next()] or an +** [SQLITE_NOMEM] in [sqlite3changeset_new()]) then an error code corresponding +** to that error is returned by this function. Otherwise, SQLITE_OK is +** returned. This is to allow the following pattern (pseudo-code): +** +** sqlite3changeset_start(); +** while( SQLITE_ROW==sqlite3changeset_next() ){ +** // Do something with change. +** } +** rc = sqlite3changeset_finalize(); +** if( rc!=SQLITE_OK ){ +** // An error has occurred +** } +*/ +int sqlite3changeset_finalize(sqlite3_changeset_iter *pIter); + +/* +** CAPI3REF: Invert A Changeset +** +** This function is used to "invert" a changeset object. Applying an inverted +** changeset to a database reverses the effects of applying the uninverted +** changeset. Specifically: +** +**
        +**
      • Each DELETE change is changed to an INSERT, and +**
      • Each INSERT change is changed to a DELETE, and +**
      • For each UPDATE change, the old.* and new.* values are exchanged. +**
      +** +** This function does not change the order in which changes appear within +** the changeset. It merely reverses the sense of each individual change. +** +** If successful, a pointer to a buffer containing the inverted changeset +** is stored in *ppOut, the size of the same buffer is stored in *pnOut, and +** SQLITE_OK is returned. If an error occurs, both *pnOut and *ppOut are +** zeroed and an SQLite error code returned. +** +** It is the responsibility of the caller to eventually call sqlite3_free() +** on the *ppOut pointer to free the buffer allocation following a successful +** call to this function. +** +** WARNING/TODO: This function currently assumes that the input is a valid +** changeset. If it is not, the results are undefined. +*/ +int sqlite3changeset_invert( + int nIn, const void *pIn, /* Input changeset */ + int *pnOut, void **ppOut /* OUT: Inverse of input */ +); + +/* +** CAPI3REF: Concatenate Two Changeset Objects +** +** This function is used to concatenate two changesets, A and B, into a +** single changeset. The result is a changeset equivalent to applying +** changeset A followed by changeset B. +** +** This function combines the two input changesets using an +** sqlite3_changegroup object. Calling it produces similar results as the +** following code fragment: +** +** sqlite3_changegroup *pGrp; +** rc = sqlite3_changegroup_new(&pGrp); +** if( rc==SQLITE_OK ) rc = sqlite3changegroup_add(pGrp, nA, pA); +** if( rc==SQLITE_OK ) rc = sqlite3changegroup_add(pGrp, nB, pB); +** if( rc==SQLITE_OK ){ +** rc = sqlite3changegroup_output(pGrp, pnOut, ppOut); +** }else{ +** *ppOut = 0; +** *pnOut = 0; +** } +** +** Refer to the sqlite3_changegroup documentation below for details. +*/ +int sqlite3changeset_concat( + int nA, /* Number of bytes in buffer pA */ + void *pA, /* Pointer to buffer containing changeset A */ + int nB, /* Number of bytes in buffer pB */ + void *pB, /* Pointer to buffer containing changeset B */ + int *pnOut, /* OUT: Number of bytes in output changeset */ + void **ppOut /* OUT: Buffer containing output changeset */ +); + + +/* +** CAPI3REF: Changegroup Handle +*/ +typedef struct sqlite3_changegroup sqlite3_changegroup; + +/* +** CAPI3REF: Create A New Changegroup Object +** +** An sqlite3_changegroup object is used to combine two or more changesets +** (or patchsets) into a single changeset (or patchset). A single changegroup +** object may combine changesets or patchsets, but not both. The output is +** always in the same format as the input. +** +** If successful, this function returns SQLITE_OK and populates (*pp) with +** a pointer to a new sqlite3_changegroup object before returning. The caller +** should eventually free the returned object using a call to +** sqlite3changegroup_delete(). If an error occurs, an SQLite error code +** (i.e. SQLITE_NOMEM) is returned and *pp is set to NULL. +** +** The usual usage pattern for an sqlite3_changegroup object is as follows: +** +**
        +**
      • It is created using a call to sqlite3changegroup_new(). +** +**
      • Zero or more changesets (or patchsets) are added to the object +** by calling sqlite3changegroup_add(). +** +**
      • The result of combining all input changesets together is obtained +** by the application via a call to sqlite3changegroup_output(). +** +**
      • The object is deleted using a call to sqlite3changegroup_delete(). +**
      +** +** Any number of calls to add() and output() may be made between the calls to +** new() and delete(), and in any order. +** +** As well as the regular sqlite3changegroup_add() and +** sqlite3changegroup_output() functions, also available are the streaming +** versions sqlite3changegroup_add_strm() and sqlite3changegroup_output_strm(). +*/ +int sqlite3changegroup_new(sqlite3_changegroup **pp); + +/* +** CAPI3REF: Add A Changeset To A Changegroup +** +** Add all changes within the changeset (or patchset) in buffer pData (size +** nData bytes) to the changegroup. +** +** If the buffer contains a patchset, then all prior calls to this function +** on the same changegroup object must also have specified patchsets. Or, if +** the buffer contains a changeset, so must have the earlier calls to this +** function. Otherwise, SQLITE_ERROR is returned and no changes are added +** to the changegroup. +** +** Rows within the changeset and changegroup are identified by the values in +** their PRIMARY KEY columns. A change in the changeset is considered to +** apply to the same row as a change already present in the changegroup if +** the two rows have the same primary key. +** +** Changes to rows that do not already appear in the changegroup are +** simply copied into it. Or, if both the new changeset and the changegroup +** contain changes that apply to a single row, the final contents of the +** changegroup depends on the type of each change, as follows: +** +** +** +** +**
      Existing Change New Change Output Change +**
      INSERT INSERT +** The new change is ignored. This case does not occur if the new +** changeset was recorded immediately after the changesets already +** added to the changegroup. +**
      INSERT UPDATE +** The INSERT change remains in the changegroup. The values in the +** INSERT change are modified as if the row was inserted by the +** existing change and then updated according to the new change. +**
      INSERT DELETE +** The existing INSERT is removed from the changegroup. The DELETE is +** not added. +**
      UPDATE INSERT +** The new change is ignored. This case does not occur if the new +** changeset was recorded immediately after the changesets already +** added to the changegroup. +**
      UPDATE UPDATE +** The existing UPDATE remains within the changegroup. It is amended +** so that the accompanying values are as if the row was updated once +** by the existing change and then again by the new change. +**
      UPDATE DELETE +** The existing UPDATE is replaced by the new DELETE within the +** changegroup. +**
      DELETE INSERT +** If one or more of the column values in the row inserted by the +** new change differ from those in the row deleted by the existing +** change, the existing DELETE is replaced by an UPDATE within the +** changegroup. Otherwise, if the inserted row is exactly the same +** as the deleted row, the existing DELETE is simply discarded. +**
      DELETE UPDATE +** The new change is ignored. This case does not occur if the new +** changeset was recorded immediately after the changesets already +** added to the changegroup. +**
      DELETE DELETE +** The new change is ignored. This case does not occur if the new +** changeset was recorded immediately after the changesets already +** added to the changegroup. +**
      +** +** If the new changeset contains changes to a table that is already present +** in the changegroup, then the number of columns and the position of the +** primary key columns for the table must be consistent. If this is not the +** case, this function fails with SQLITE_SCHEMA. If the input changeset +** appears to be corrupt and the corruption is detected, SQLITE_CORRUPT is +** returned. Or, if an out-of-memory condition occurs during processing, this +** function returns SQLITE_NOMEM. In all cases, if an error occurs the +** final contents of the changegroup is undefined. +** +** If no error occurs, SQLITE_OK is returned. +*/ +int sqlite3changegroup_add(sqlite3_changegroup*, int nData, void *pData); + +/* +** CAPI3REF: Obtain A Composite Changeset From A Changegroup +** +** Obtain a buffer containing a changeset (or patchset) representing the +** current contents of the changegroup. If the inputs to the changegroup +** were themselves changesets, the output is a changeset. Or, if the +** inputs were patchsets, the output is also a patchset. +** +** As with the output of the sqlite3session_changeset() and +** sqlite3session_patchset() functions, all changes related to a single +** table are grouped together in the output of this function. Tables appear +** in the same order as for the very first changeset added to the changegroup. +** If the second or subsequent changesets added to the changegroup contain +** changes for tables that do not appear in the first changeset, they are +** appended onto the end of the output changeset, again in the order in +** which they are first encountered. +** +** If an error occurs, an SQLite error code is returned and the output +** variables (*pnData) and (*ppData) are set to 0. Otherwise, SQLITE_OK +** is returned and the output variables are set to the size of and a +** pointer to the output buffer, respectively. In this case it is the +** responsibility of the caller to eventually free the buffer using a +** call to sqlite3_free(). +*/ +int sqlite3changegroup_output( + sqlite3_changegroup*, + int *pnData, /* OUT: Size of output buffer in bytes */ + void **ppData /* OUT: Pointer to output buffer */ +); + +/* +** CAPI3REF: Delete A Changegroup Object +*/ +void sqlite3changegroup_delete(sqlite3_changegroup*); + +/* +** CAPI3REF: Apply A Changeset To A Database +** +** Apply a changeset to a database. This function attempts to update the +** "main" database attached to handle db with the changes found in the +** changeset passed via the second and third arguments. +** +** The fourth argument (xFilter) passed to this function is the "filter +** callback". If it is not NULL, then for each table affected by at least one +** change in the changeset, the filter callback is invoked with +** the table name as the second argument, and a copy of the context pointer +** passed as the sixth argument to this function as the first. If the "filter +** callback" returns zero, then no attempt is made to apply any changes to +** the table. Otherwise, if the return value is non-zero or the xFilter +** argument to this function is NULL, all changes related to the table are +** attempted. +** +** For each table that is not excluded by the filter callback, this function +** tests that the target database contains a compatible table. A table is +** considered compatible if all of the following are true: +** +**
        +**
      • The table has the same name as the name recorded in the +** changeset, and +**
      • The table has the same number of columns as recorded in the +** changeset, and +**
      • The table has primary key columns in the same position as +** recorded in the changeset. +**
      +** +** If there is no compatible table, it is not an error, but none of the +** changes associated with the table are applied. A warning message is issued +** via the sqlite3_log() mechanism with the error code SQLITE_SCHEMA. At most +** one such warning is issued for each table in the changeset. +** +** For each change for which there is a compatible table, an attempt is made +** to modify the table contents according to the UPDATE, INSERT or DELETE +** change. If a change cannot be applied cleanly, the conflict handler +** function passed as the fifth argument to sqlite3changeset_apply() may be +** invoked. A description of exactly when the conflict handler is invoked for +** each type of change is below. +** +** Unlike the xFilter argument, xConflict may not be passed NULL. The results +** of passing anything other than a valid function pointer as the xConflict +** argument are undefined. +** +** Each time the conflict handler function is invoked, it must return one +** of [SQLITE_CHANGESET_OMIT], [SQLITE_CHANGESET_ABORT] or +** [SQLITE_CHANGESET_REPLACE]. SQLITE_CHANGESET_REPLACE may only be returned +** if the second argument passed to the conflict handler is either +** SQLITE_CHANGESET_DATA or SQLITE_CHANGESET_CONFLICT. If the conflict-handler +** returns an illegal value, any changes already made are rolled back and +** the call to sqlite3changeset_apply() returns SQLITE_MISUSE. Different +** actions are taken by sqlite3changeset_apply() depending on the value +** returned by each invocation of the conflict-handler function. Refer to +** the documentation for the three +** [SQLITE_CHANGESET_OMIT|available return values] for details. +** +**
      +**
      DELETE Changes
      +** For each DELETE change, this function checks if the target database +** contains a row with the same primary key value (or values) as the +** original row values stored in the changeset. If it does, and the values +** stored in all non-primary key columns also match the values stored in +** the changeset the row is deleted from the target database. +** +** If a row with matching primary key values is found, but one or more of +** the non-primary key fields contains a value different from the original +** row value stored in the changeset, the conflict-handler function is +** invoked with [SQLITE_CHANGESET_DATA] as the second argument. +** +** If no row with matching primary key values is found in the database, +** the conflict-handler function is invoked with [SQLITE_CHANGESET_NOTFOUND] +** passed as the second argument. +** +** If the DELETE operation is attempted, but SQLite returns SQLITE_CONSTRAINT +** (which can only happen if a foreign key constraint is violated), the +** conflict-handler function is invoked with [SQLITE_CHANGESET_CONSTRAINT] +** passed as the second argument. This includes the case where the DELETE +** operation is attempted because an earlier call to the conflict handler +** function returned [SQLITE_CHANGESET_REPLACE]. +** +**
      INSERT Changes
      +** For each INSERT change, an attempt is made to insert the new row into +** the database. +** +** If the attempt to insert the row fails because the database already +** contains a row with the same primary key values, the conflict handler +** function is invoked with the second argument set to +** [SQLITE_CHANGESET_CONFLICT]. +** +** If the attempt to insert the row fails because of some other constraint +** violation (e.g. NOT NULL or UNIQUE), the conflict handler function is +** invoked with the second argument set to [SQLITE_CHANGESET_CONSTRAINT]. +** This includes the case where the INSERT operation is re-attempted because +** an earlier call to the conflict handler function returned +** [SQLITE_CHANGESET_REPLACE]. +** +**
      UPDATE Changes
      +** For each UPDATE change, this function checks if the target database +** contains a row with the same primary key value (or values) as the +** original row values stored in the changeset. If it does, and the values +** stored in all non-primary key columns also match the values stored in +** the changeset the row is updated within the target database. +** +** If a row with matching primary key values is found, but one or more of +** the non-primary key fields contains a value different from an original +** row value stored in the changeset, the conflict-handler function is +** invoked with [SQLITE_CHANGESET_DATA] as the second argument. Since +** UPDATE changes only contain values for non-primary key fields that are +** to be modified, only those fields need to match the original values to +** avoid the SQLITE_CHANGESET_DATA conflict-handler callback. +** +** If no row with matching primary key values is found in the database, +** the conflict-handler function is invoked with [SQLITE_CHANGESET_NOTFOUND] +** passed as the second argument. +** +** If the UPDATE operation is attempted, but SQLite returns +** SQLITE_CONSTRAINT, the conflict-handler function is invoked with +** [SQLITE_CHANGESET_CONSTRAINT] passed as the second argument. +** This includes the case where the UPDATE operation is attempted after +** an earlier call to the conflict handler function returned +** [SQLITE_CHANGESET_REPLACE]. +**
      +** +** It is safe to execute SQL statements, including those that write to the +** table that the callback related to, from within the xConflict callback. +** This can be used to further customize the applications conflict +** resolution strategy. +** +** All changes made by this function are enclosed in a savepoint transaction. +** If any other error (aside from a constraint failure when attempting to +** write to the target database) occurs, then the savepoint transaction is +** rolled back, restoring the target database to its original state, and an +** SQLite error code returned. +*/ +int sqlite3changeset_apply( + sqlite3 *db, /* Apply change to "main" db of this handle */ + int nChangeset, /* Size of changeset in bytes */ + void *pChangeset, /* Changeset blob */ + int(*xFilter)( + void *pCtx, /* Copy of sixth arg to _apply() */ + const char *zTab /* Table name */ + ), + int(*xConflict)( + void *pCtx, /* Copy of sixth arg to _apply() */ + int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */ + sqlite3_changeset_iter *p /* Handle describing change and conflict */ + ), + void *pCtx /* First argument passed to xConflict */ +); + +/* +** CAPI3REF: Constants Passed To The Conflict Handler +** +** Values that may be passed as the second argument to a conflict-handler. +** +**
      +**
      SQLITE_CHANGESET_DATA
      +** The conflict handler is invoked with CHANGESET_DATA as the second argument +** when processing a DELETE or UPDATE change if a row with the required +** PRIMARY KEY fields is present in the database, but one or more other +** (non primary-key) fields modified by the update do not contain the +** expected "before" values. +** +** The conflicting row, in this case, is the database row with the matching +** primary key. +** +**
      SQLITE_CHANGESET_NOTFOUND
      +** The conflict handler is invoked with CHANGESET_NOTFOUND as the second +** argument when processing a DELETE or UPDATE change if a row with the +** required PRIMARY KEY fields is not present in the database. +** +** There is no conflicting row in this case. The results of invoking the +** sqlite3changeset_conflict() API are undefined. +** +**
      SQLITE_CHANGESET_CONFLICT
      +** CHANGESET_CONFLICT is passed as the second argument to the conflict +** handler while processing an INSERT change if the operation would result +** in duplicate primary key values. +** +** The conflicting row in this case is the database row with the matching +** primary key. +** +**
      SQLITE_CHANGESET_FOREIGN_KEY
      +** If foreign key handling is enabled, and applying a changeset leaves the +** database in a state containing foreign key violations, the conflict +** handler is invoked with CHANGESET_FOREIGN_KEY as the second argument +** exactly once before the changeset is committed. If the conflict handler +** returns CHANGESET_OMIT, the changes, including those that caused the +** foreign key constraint violation, are committed. Or, if it returns +** CHANGESET_ABORT, the changeset is rolled back. +** +** No current or conflicting row information is provided. The only function +** it is possible to call on the supplied sqlite3_changeset_iter handle +** is sqlite3changeset_fk_conflicts(). +** +**
      SQLITE_CHANGESET_CONSTRAINT
      +** If any other constraint violation occurs while applying a change (i.e. +** a UNIQUE, CHECK or NOT NULL constraint), the conflict handler is +** invoked with CHANGESET_CONSTRAINT as the second argument. +** +** There is no conflicting row in this case. The results of invoking the +** sqlite3changeset_conflict() API are undefined. +** +**
      +*/ +#define SQLITE_CHANGESET_DATA 1 +#define SQLITE_CHANGESET_NOTFOUND 2 +#define SQLITE_CHANGESET_CONFLICT 3 +#define SQLITE_CHANGESET_CONSTRAINT 4 +#define SQLITE_CHANGESET_FOREIGN_KEY 5 + +/* +** CAPI3REF: Constants Returned By The Conflict Handler +** +** A conflict handler callback must return one of the following three values. +** +**
      +**
      SQLITE_CHANGESET_OMIT
      +** If a conflict handler returns this value no special action is taken. The +** change that caused the conflict is not applied. The session module +** continues to the next change in the changeset. +** +**
      SQLITE_CHANGESET_REPLACE
      +** This value may only be returned if the second argument to the conflict +** handler was SQLITE_CHANGESET_DATA or SQLITE_CHANGESET_CONFLICT. If this +** is not the case, any changes applied so far are rolled back and the +** call to sqlite3changeset_apply() returns SQLITE_MISUSE. +** +** If CHANGESET_REPLACE is returned by an SQLITE_CHANGESET_DATA conflict +** handler, then the conflicting row is either updated or deleted, depending +** on the type of change. +** +** If CHANGESET_REPLACE is returned by an SQLITE_CHANGESET_CONFLICT conflict +** handler, then the conflicting row is removed from the database and a +** second attempt to apply the change is made. If this second attempt fails, +** the original row is restored to the database before continuing. +** +**
      SQLITE_CHANGESET_ABORT
      +** If this value is returned, any changes applied so far are rolled back +** and the call to sqlite3changeset_apply() returns SQLITE_ABORT. +**
      +*/ +#define SQLITE_CHANGESET_OMIT 0 +#define SQLITE_CHANGESET_REPLACE 1 +#define SQLITE_CHANGESET_ABORT 2 + +/* +** CAPI3REF: Streaming Versions of API functions. +** +** The six streaming API xxx_strm() functions serve similar purposes to the +** corresponding non-streaming API functions: +** +** +** +**
      Streaming functionNon-streaming equivalent
      sqlite3changeset_apply_str[sqlite3changeset_apply] +**
      sqlite3changeset_concat_str[sqlite3changeset_concat] +**
      sqlite3changeset_invert_str[sqlite3changeset_invert] +**
      sqlite3changeset_start_str[sqlite3changeset_start] +**
      sqlite3session_changeset_str[sqlite3session_changeset] +**
      sqlite3session_patchset_str[sqlite3session_patchset] +**
      +** +** Non-streaming functions that accept changesets (or patchsets) as input +** require that the entire changeset be stored in a single buffer in memory. +** Similarly, those that return a changeset or patchset do so by returning +** a pointer to a single large buffer allocated using sqlite3_malloc(). +** Normally this is convenient. However, if an application running in a +** low-memory environment is required to handle very large changesets, the +** large contiguous memory allocations required can become onerous. +** +** In order to avoid this problem, instead of a single large buffer, input +** is passed to a streaming API functions by way of a callback function that +** the sessions module invokes to incrementally request input data as it is +** required. In all cases, a pair of API function parameters such as +** +**
      +**        int nChangeset,
      +**        void *pChangeset,
      +**  
      +** +** Is replaced by: +** +**
      +**        int (*xInput)(void *pIn, void *pData, int *pnData),
      +**        void *pIn,
      +**  
      +** +** Each time the xInput callback is invoked by the sessions module, the first +** argument passed is a copy of the supplied pIn context pointer. The second +** argument, pData, points to a buffer (*pnData) bytes in size. Assuming no +** error occurs the xInput method should copy up to (*pnData) bytes of data +** into the buffer and set (*pnData) to the actual number of bytes copied +** before returning SQLITE_OK. If the input is completely exhausted, (*pnData) +** should be set to zero to indicate this. Or, if an error occurs, an SQLite +** error code should be returned. In all cases, if an xInput callback returns +** an error, all processing is abandoned and the streaming API function +** returns a copy of the error code to the caller. +** +** In the case of sqlite3changeset_start_strm(), the xInput callback may be +** invoked by the sessions module at any point during the lifetime of the +** iterator. If such an xInput callback returns an error, the iterator enters +** an error state, whereby all subsequent calls to iterator functions +** immediately fail with the same error code as returned by xInput. +** +** Similarly, streaming API functions that return changesets (or patchsets) +** return them in chunks by way of a callback function instead of via a +** pointer to a single large buffer. In this case, a pair of parameters such +** as: +** +**
      +**        int *pnChangeset,
      +**        void **ppChangeset,
      +**  
      +** +** Is replaced by: +** +**
      +**        int (*xOutput)(void *pOut, const void *pData, int nData),
      +**        void *pOut
      +**  
      +** +** The xOutput callback is invoked zero or more times to return data to +** the application. The first parameter passed to each call is a copy of the +** pOut pointer supplied by the application. The second parameter, pData, +** points to a buffer nData bytes in size containing the chunk of output +** data being returned. If the xOutput callback successfully processes the +** supplied data, it should return SQLITE_OK to indicate success. Otherwise, +** it should return some other SQLite error code. In this case processing +** is immediately abandoned and the streaming API function returns a copy +** of the xOutput error code to the application. +** +** The sessions module never invokes an xOutput callback with the third +** parameter set to a value less than or equal to zero. Other than this, +** no guarantees are made as to the size of the chunks of data returned. +*/ +int sqlite3changeset_apply_strm( + sqlite3 *db, /* Apply change to "main" db of this handle */ + int (*xInput)(void *pIn, void *pData, int *pnData), /* Input function */ + void *pIn, /* First arg for xInput */ + int(*xFilter)( + void *pCtx, /* Copy of sixth arg to _apply() */ + const char *zTab /* Table name */ + ), + int(*xConflict)( + void *pCtx, /* Copy of sixth arg to _apply() */ + int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */ + sqlite3_changeset_iter *p /* Handle describing change and conflict */ + ), + void *pCtx /* First argument passed to xConflict */ +); +int sqlite3changeset_concat_strm( + int (*xInputA)(void *pIn, void *pData, int *pnData), + void *pInA, + int (*xInputB)(void *pIn, void *pData, int *pnData), + void *pInB, + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut +); +int sqlite3changeset_invert_strm( + int (*xInput)(void *pIn, void *pData, int *pnData), + void *pIn, + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut +); +int sqlite3changeset_start_strm( + sqlite3_changeset_iter **pp, + int (*xInput)(void *pIn, void *pData, int *pnData), + void *pIn +); +int sqlite3session_changeset_strm( + sqlite3_session *pSession, + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut +); +int sqlite3session_patchset_strm( + sqlite3_session *pSession, + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut +); +int sqlite3changegroup_add_strm(sqlite3_changegroup*, + int (*xInput)(void *pIn, void *pData, int *pnData), + void *pIn +); +int sqlite3changegroup_output_strm(sqlite3_changegroup*, + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut +); + + +/* +** Make sure we can call this stuff from C++. +*/ +#if 0 +} +#endif + +#endif /* !defined(__SQLITESESSION_H_) && defined(SQLITE_ENABLE_SESSION) */ + +/******** End of sqlite3session.h *********/ +/******** Begin file fts5.h *********/ +/* +** 2014 May 31 +** +** 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. +** +****************************************************************************** +** +** Interfaces to extend FTS5. Using the interfaces defined in this file, +** FTS5 may be extended with: +** +** * custom tokenizers, and +** * custom auxiliary functions. +*/ + + +#ifndef _FTS5_H +#define _FTS5_H + + +#if 0 +extern "C" { +#endif + +/************************************************************************* +** CUSTOM AUXILIARY FUNCTIONS +** +** Virtual table implementations may overload SQL functions by implementing +** the sqlite3_module.xFindFunction() method. +*/ + +typedef struct Fts5ExtensionApi Fts5ExtensionApi; +typedef struct Fts5Context Fts5Context; +typedef struct Fts5PhraseIter Fts5PhraseIter; + +typedef void (*fts5_extension_function)( + const Fts5ExtensionApi *pApi, /* API offered by current FTS version */ + Fts5Context *pFts, /* First arg to pass to pApi functions */ + sqlite3_context *pCtx, /* Context for returning result/error */ + int nVal, /* Number of values in apVal[] array */ + sqlite3_value **apVal /* Array of trailing arguments */ +); + +struct Fts5PhraseIter { + const unsigned char *a; + const unsigned char *b; +}; + +/* +** EXTENSION API FUNCTIONS +** +** xUserData(pFts): +** Return a copy of the context pointer the extension function was +** registered with. +** +** xColumnTotalSize(pFts, iCol, pnToken): +** If parameter iCol is less than zero, set output variable *pnToken +** to the total number of tokens in the FTS5 table. Or, if iCol is +** non-negative but less than the number of columns in the table, return +** the total number of tokens in column iCol, considering all rows in +** the FTS5 table. +** +** If parameter iCol is greater than or equal to the number of columns +** in the table, SQLITE_RANGE is returned. Or, if an error occurs (e.g. +** an OOM condition or IO error), an appropriate SQLite error code is +** returned. +** +** xColumnCount(pFts): +** Return the number of columns in the table. +** +** xColumnSize(pFts, iCol, pnToken): +** If parameter iCol is less than zero, set output variable *pnToken +** to the total number of tokens in the current row. Or, if iCol is +** non-negative but less than the number of columns in the table, set +** *pnToken to the number of tokens in column iCol of the current row. +** +** If parameter iCol is greater than or equal to the number of columns +** in the table, SQLITE_RANGE is returned. Or, if an error occurs (e.g. +** an OOM condition or IO error), an appropriate SQLite error code is +** returned. +** +** This function may be quite inefficient if used with an FTS5 table +** created with the "columnsize=0" option. +** +** xColumnText: +** This function attempts to retrieve the text of column iCol of the +** current document. If successful, (*pz) is set to point to a buffer +** containing the text in utf-8 encoding, (*pn) is set to the size in bytes +** (not characters) of the buffer and SQLITE_OK is returned. Otherwise, +** if an error occurs, an SQLite error code is returned and the final values +** of (*pz) and (*pn) are undefined. +** +** xPhraseCount: +** Returns the number of phrases in the current query expression. +** +** xPhraseSize: +** Returns the number of tokens in phrase iPhrase of the query. Phrases +** are numbered starting from zero. +** +** xInstCount: +** Set *pnInst to the total number of occurrences of all phrases within +** the query within the current row. Return SQLITE_OK if successful, or +** an error code (i.e. SQLITE_NOMEM) if an error occurs. +** +** This API can be quite slow if used with an FTS5 table created with the +** "detail=none" or "detail=column" option. If the FTS5 table is created +** with either "detail=none" or "detail=column" and "content=" option +** (i.e. if it is a contentless table), then this API always returns 0. +** +** xInst: +** Query for the details of phrase match iIdx within the current row. +** Phrase matches are numbered starting from zero, so the iIdx argument +** should be greater than or equal to zero and smaller than the value +** output by xInstCount(). +** +** Usually, output parameter *piPhrase is set to the phrase number, *piCol +** to the column in which it occurs and *piOff the token offset of the +** first token of the phrase. The exception is if the table was created +** with the offsets=0 option specified. In this case *piOff is always +** set to -1. +** +** Returns SQLITE_OK if successful, or an error code (i.e. SQLITE_NOMEM) +** if an error occurs. +** +** This API can be quite slow if used with an FTS5 table created with the +** "detail=none" or "detail=column" option. +** +** xRowid: +** Returns the rowid of the current row. +** +** xTokenize: +** Tokenize text using the tokenizer belonging to the FTS5 table. +** +** xQueryPhrase(pFts5, iPhrase, pUserData, xCallback): +** This API function is used to query the FTS table for phrase iPhrase +** of the current query. Specifically, a query equivalent to: +** +** ... FROM ftstable WHERE ftstable MATCH $p ORDER BY rowid +** +** with $p set to a phrase equivalent to the phrase iPhrase of the +** current query is executed. Any column filter that applies to +** phrase iPhrase of the current query is included in $p. For each +** row visited, the callback function passed as the fourth argument +** is invoked. The context and API objects passed to the callback +** function may be used to access the properties of each matched row. +** Invoking Api.xUserData() returns a copy of the pointer passed as +** the third argument to pUserData. +** +** If the callback function returns any value other than SQLITE_OK, the +** query is abandoned and the xQueryPhrase function returns immediately. +** If the returned value is SQLITE_DONE, xQueryPhrase returns SQLITE_OK. +** Otherwise, the error code is propagated upwards. +** +** If the query runs to completion without incident, SQLITE_OK is returned. +** Or, if some error occurs before the query completes or is aborted by +** the callback, an SQLite error code is returned. +** +** +** xSetAuxdata(pFts5, pAux, xDelete) +** +** Save the pointer passed as the second argument as the extension functions +** "auxiliary data". The pointer may then be retrieved by the current or any +** future invocation of the same fts5 extension function made as part of +** of the same MATCH query using the xGetAuxdata() API. +** +** Each extension function is allocated a single auxiliary data slot for +** each FTS query (MATCH expression). If the extension function is invoked +** more than once for a single FTS query, then all invocations share a +** single auxiliary data context. +** +** If there is already an auxiliary data pointer when this function is +** invoked, then it is replaced by the new pointer. If an xDelete callback +** was specified along with the original pointer, it is invoked at this +** point. +** +** The xDelete callback, if one is specified, is also invoked on the +** auxiliary data pointer after the FTS5 query has finished. +** +** If an error (e.g. an OOM condition) occurs within this function, an +** the auxiliary data is set to NULL and an error code returned. If the +** xDelete parameter was not NULL, it is invoked on the auxiliary data +** pointer before returning. +** +** +** xGetAuxdata(pFts5, bClear) +** +** Returns the current auxiliary data pointer for the fts5 extension +** function. See the xSetAuxdata() method for details. +** +** If the bClear argument is non-zero, then the auxiliary data is cleared +** (set to NULL) before this function returns. In this case the xDelete, +** if any, is not invoked. +** +** +** xRowCount(pFts5, pnRow) +** +** This function is used to retrieve the total number of rows in the table. +** In other words, the same value that would be returned by: +** +** SELECT count(*) FROM ftstable; +** +** xPhraseFirst() +** This function is used, along with type Fts5PhraseIter and the xPhraseNext +** method, to iterate through all instances of a single query phrase within +** the current row. This is the same information as is accessible via the +** xInstCount/xInst APIs. While the xInstCount/xInst APIs are more convenient +** to use, this API may be faster under some circumstances. To iterate +** through instances of phrase iPhrase, use the following code: +** +** Fts5PhraseIter iter; +** int iCol, iOff; +** for(pApi->xPhraseFirst(pFts, iPhrase, &iter, &iCol, &iOff); +** iCol>=0; +** pApi->xPhraseNext(pFts, &iter, &iCol, &iOff) +** ){ +** // An instance of phrase iPhrase at offset iOff of column iCol +** } +** +** The Fts5PhraseIter structure is defined above. Applications should not +** modify this structure directly - it should only be used as shown above +** with the xPhraseFirst() and xPhraseNext() API methods (and by +** xPhraseFirstColumn() and xPhraseNextColumn() as illustrated below). +** +** This API can be quite slow if used with an FTS5 table created with the +** "detail=none" or "detail=column" option. If the FTS5 table is created +** with either "detail=none" or "detail=column" and "content=" option +** (i.e. if it is a contentless table), then this API always iterates +** through an empty set (all calls to xPhraseFirst() set iCol to -1). +** +** xPhraseNext() +** See xPhraseFirst above. +** +** xPhraseFirstColumn() +** This function and xPhraseNextColumn() are similar to the xPhraseFirst() +** and xPhraseNext() APIs described above. The difference is that instead +** of iterating through all instances of a phrase in the current row, these +** APIs are used to iterate through the set of columns in the current row +** that contain one or more instances of a specified phrase. For example: +** +** Fts5PhraseIter iter; +** int iCol; +** for(pApi->xPhraseFirstColumn(pFts, iPhrase, &iter, &iCol); +** iCol>=0; +** pApi->xPhraseNextColumn(pFts, &iter, &iCol) +** ){ +** // Column iCol contains at least one instance of phrase iPhrase +** } +** +** This API can be quite slow if used with an FTS5 table created with the +** "detail=none" option. If the FTS5 table is created with either +** "detail=none" "content=" option (i.e. if it is a contentless table), +** then this API always iterates through an empty set (all calls to +** xPhraseFirstColumn() set iCol to -1). +** +** The information accessed using this API and its companion +** xPhraseFirstColumn() may also be obtained using xPhraseFirst/xPhraseNext +** (or xInst/xInstCount). The chief advantage of this API is that it is +** significantly more efficient than those alternatives when used with +** "detail=column" tables. +** +** xPhraseNextColumn() +** See xPhraseFirstColumn above. +*/ +struct Fts5ExtensionApi { + int iVersion; /* Currently always set to 3 */ + + void *(*xUserData)(Fts5Context*); + + int (*xColumnCount)(Fts5Context*); + int (*xRowCount)(Fts5Context*, sqlite3_int64 *pnRow); + int (*xColumnTotalSize)(Fts5Context*, int iCol, sqlite3_int64 *pnToken); + + int (*xTokenize)(Fts5Context*, + const char *pText, int nText, /* Text to tokenize */ + void *pCtx, /* Context passed to xToken() */ + int (*xToken)(void*, int, const char*, int, int, int) /* Callback */ + ); + + int (*xPhraseCount)(Fts5Context*); + int (*xPhraseSize)(Fts5Context*, int iPhrase); + + int (*xInstCount)(Fts5Context*, int *pnInst); + int (*xInst)(Fts5Context*, int iIdx, int *piPhrase, int *piCol, int *piOff); + + sqlite3_int64 (*xRowid)(Fts5Context*); + int (*xColumnText)(Fts5Context*, int iCol, const char **pz, int *pn); + int (*xColumnSize)(Fts5Context*, int iCol, int *pnToken); + + int (*xQueryPhrase)(Fts5Context*, int iPhrase, void *pUserData, + int(*)(const Fts5ExtensionApi*,Fts5Context*,void*) + ); + int (*xSetAuxdata)(Fts5Context*, void *pAux, void(*xDelete)(void*)); + void *(*xGetAuxdata)(Fts5Context*, int bClear); + + int (*xPhraseFirst)(Fts5Context*, int iPhrase, Fts5PhraseIter*, int*, int*); + void (*xPhraseNext)(Fts5Context*, Fts5PhraseIter*, int *piCol, int *piOff); + + int (*xPhraseFirstColumn)(Fts5Context*, int iPhrase, Fts5PhraseIter*, int*); + void (*xPhraseNextColumn)(Fts5Context*, Fts5PhraseIter*, int *piCol); +}; + +/* +** CUSTOM AUXILIARY FUNCTIONS +*************************************************************************/ + +/************************************************************************* +** CUSTOM TOKENIZERS +** +** Applications may also register custom tokenizer types. A tokenizer +** is registered by providing fts5 with a populated instance of the +** following structure. All structure methods must be defined, setting +** any member of the fts5_tokenizer struct to NULL leads to undefined +** behaviour. The structure methods are expected to function as follows: +** +** xCreate: +** This function is used to allocate and initialize a tokenizer instance. +** A tokenizer instance is required to actually tokenize text. +** +** The first argument passed to this function is a copy of the (void*) +** pointer provided by the application when the fts5_tokenizer object +** was registered with FTS5 (the third argument to xCreateTokenizer()). +** The second and third arguments are an array of nul-terminated strings +** containing the tokenizer arguments, if any, specified following the +** tokenizer name as part of the CREATE VIRTUAL TABLE statement used +** to create the FTS5 table. +** +** The final argument is an output variable. If successful, (*ppOut) +** should be set to point to the new tokenizer handle and SQLITE_OK +** returned. If an error occurs, some value other than SQLITE_OK should +** be returned. In this case, fts5 assumes that the final value of *ppOut +** is undefined. +** +** xDelete: +** This function is invoked to delete a tokenizer handle previously +** allocated using xCreate(). Fts5 guarantees that this function will +** be invoked exactly once for each successful call to xCreate(). +** +** xTokenize: +** This function is expected to tokenize the nText byte string indicated +** by argument pText. pText may or may not be nul-terminated. The first +** argument passed to this function is a pointer to an Fts5Tokenizer object +** returned by an earlier call to xCreate(). +** +** The second argument indicates the reason that FTS5 is requesting +** tokenization of the supplied text. This is always one of the following +** four values: +** +**
      • FTS5_TOKENIZE_DOCUMENT - A document is being inserted into +** or removed from the FTS table. The tokenizer is being invoked to +** determine the set of tokens to add to (or delete from) the +** FTS index. +** +**
      • FTS5_TOKENIZE_QUERY - A MATCH query is being executed +** against the FTS index. The tokenizer is being called to tokenize +** a bareword or quoted string specified as part of the query. +** +**
      • (FTS5_TOKENIZE_QUERY | FTS5_TOKENIZE_PREFIX) - Same as +** FTS5_TOKENIZE_QUERY, except that the bareword or quoted string is +** followed by a "*" character, indicating that the last token +** returned by the tokenizer will be treated as a token prefix. +** +**
      • FTS5_TOKENIZE_AUX - The tokenizer is being invoked to +** satisfy an fts5_api.xTokenize() request made by an auxiliary +** function. Or an fts5_api.xColumnSize() request made by the same +** on a columnsize=0 database. +**
      +** +** For each token in the input string, the supplied callback xToken() must +** be invoked. The first argument to it should be a copy of the pointer +** passed as the second argument to xTokenize(). The third and fourth +** arguments are a pointer to a buffer containing the token text, and the +** size of the token in bytes. The 4th and 5th arguments are the byte offsets +** of the first byte of and first byte immediately following the text from +** which the token is derived within the input. +** +** The second argument passed to the xToken() callback ("tflags") should +** normally be set to 0. The exception is if the tokenizer supports +** synonyms. In this case see the discussion below for details. +** +** FTS5 assumes the xToken() callback is invoked for each token in the +** order that they occur within the input text. +** +** If an xToken() callback returns any value other than SQLITE_OK, then +** the tokenization should be abandoned and the xTokenize() method should +** immediately return a copy of the xToken() return value. Or, if the +** input buffer is exhausted, xTokenize() should return SQLITE_OK. Finally, +** if an error occurs with the xTokenize() implementation itself, it +** may abandon the tokenization and return any error code other than +** SQLITE_OK or SQLITE_DONE. +** +** SYNONYM SUPPORT +** +** Custom tokenizers may also support synonyms. Consider a case in which a +** user wishes to query for a phrase such as "first place". Using the +** built-in tokenizers, the FTS5 query 'first + place' will match instances +** of "first place" within the document set, but not alternative forms +** such as "1st place". In some applications, it would be better to match +** all instances of "first place" or "1st place" regardless of which form +** the user specified in the MATCH query text. +** +** There are several ways to approach this in FTS5: +** +**
      1. By mapping all synonyms to a single token. In this case, the +** In the above example, this means that the tokenizer returns the +** same token for inputs "first" and "1st". Say that token is in +** fact "first", so that when the user inserts the document "I won +** 1st place" entries are added to the index for tokens "i", "won", +** "first" and "place". If the user then queries for '1st + place', +** the tokenizer substitutes "first" for "1st" and the query works +** as expected. +** +**
      2. By adding multiple synonyms for a single term to the FTS index. +** In this case, when tokenizing query text, the tokenizer may +** provide multiple synonyms for a single term within the document. +** FTS5 then queries the index for each synonym individually. For +** example, faced with the query: +** +** +** ... MATCH 'first place' +** +** the tokenizer offers both "1st" and "first" as synonyms for the +** first token in the MATCH query and FTS5 effectively runs a query +** similar to: +** +** +** ... MATCH '(first OR 1st) place' +** +** except that, for the purposes of auxiliary functions, the query +** still appears to contain just two phrases - "(first OR 1st)" +** being treated as a single phrase. +** +**
      3. By adding multiple synonyms for a single term to the FTS index. +** Using this method, when tokenizing document text, the tokenizer +** provides multiple synonyms for each token. So that when a +** document such as "I won first place" is tokenized, entries are +** added to the FTS index for "i", "won", "first", "1st" and +** "place". +** +** This way, even if the tokenizer does not provide synonyms +** when tokenizing query text (it should not - to do would be +** inefficient), it doesn't matter if the user queries for +** 'first + place' or '1st + place', as there are entires in the +** FTS index corresponding to both forms of the first token. +**
      +** +** Whether it is parsing document or query text, any call to xToken that +** specifies a tflags argument with the FTS5_TOKEN_COLOCATED bit +** is considered to supply a synonym for the previous token. For example, +** when parsing the document "I won first place", a tokenizer that supports +** synonyms would call xToken() 5 times, as follows: +** +** +** xToken(pCtx, 0, "i", 1, 0, 1); +** xToken(pCtx, 0, "won", 3, 2, 5); +** xToken(pCtx, 0, "first", 5, 6, 11); +** xToken(pCtx, FTS5_TOKEN_COLOCATED, "1st", 3, 6, 11); +** xToken(pCtx, 0, "place", 5, 12, 17); +** +** +** It is an error to specify the FTS5_TOKEN_COLOCATED flag the first time +** xToken() is called. Multiple synonyms may be specified for a single token +** by making multiple calls to xToken(FTS5_TOKEN_COLOCATED) in sequence. +** There is no limit to the number of synonyms that may be provided for a +** single token. +** +** In many cases, method (1) above is the best approach. It does not add +** extra data to the FTS index or require FTS5 to query for multiple terms, +** so it is efficient in terms of disk space and query speed. However, it +** does not support prefix queries very well. If, as suggested above, the +** token "first" is subsituted for "1st" by the tokenizer, then the query: +** +** +** ... MATCH '1s*' +** +** will not match documents that contain the token "1st" (as the tokenizer +** will probably not map "1s" to any prefix of "first"). +** +** For full prefix support, method (3) may be preferred. In this case, +** because the index contains entries for both "first" and "1st", prefix +** queries such as 'fi*' or '1s*' will match correctly. However, because +** extra entries are added to the FTS index, this method uses more space +** within the database. +** +** Method (2) offers a midpoint between (1) and (3). Using this method, +** a query such as '1s*' will match documents that contain the literal +** token "1st", but not "first" (assuming the tokenizer is not able to +** provide synonyms for prefixes). However, a non-prefix query like '1st' +** will match against "1st" and "first". This method does not require +** extra disk space, as no extra entries are added to the FTS index. +** On the other hand, it may require more CPU cycles to run MATCH queries, +** as separate queries of the FTS index are required for each synonym. +** +** When using methods (2) or (3), it is important that the tokenizer only +** provide synonyms when tokenizing document text (method (2)) or query +** text (method (3)), not both. Doing so will not cause any errors, but is +** inefficient. +*/ +typedef struct Fts5Tokenizer Fts5Tokenizer; +typedef struct fts5_tokenizer fts5_tokenizer; +struct fts5_tokenizer { + int (*xCreate)(void*, const char **azArg, int nArg, Fts5Tokenizer **ppOut); + void (*xDelete)(Fts5Tokenizer*); + int (*xTokenize)(Fts5Tokenizer*, + void *pCtx, + int flags, /* Mask of FTS5_TOKENIZE_* flags */ + const char *pText, int nText, + int (*xToken)( + void *pCtx, /* Copy of 2nd argument to xTokenize() */ + int tflags, /* Mask of FTS5_TOKEN_* flags */ + const char *pToken, /* Pointer to buffer containing token */ + int nToken, /* Size of token in bytes */ + int iStart, /* Byte offset of token within input text */ + int iEnd /* Byte offset of end of token within input text */ + ) + ); +}; + +/* Flags that may be passed as the third argument to xTokenize() */ +#define FTS5_TOKENIZE_QUERY 0x0001 +#define FTS5_TOKENIZE_PREFIX 0x0002 +#define FTS5_TOKENIZE_DOCUMENT 0x0004 +#define FTS5_TOKENIZE_AUX 0x0008 + +/* Flags that may be passed by the tokenizer implementation back to FTS5 +** as the third argument to the supplied xToken callback. */ +#define FTS5_TOKEN_COLOCATED 0x0001 /* Same position as prev. token */ + +/* +** END OF CUSTOM TOKENIZERS +*************************************************************************/ + +/************************************************************************* +** FTS5 EXTENSION REGISTRATION API +*/ +typedef struct fts5_api fts5_api; +struct fts5_api { + int iVersion; /* Currently always set to 2 */ + + /* Create a new tokenizer */ + int (*xCreateTokenizer)( + fts5_api *pApi, + const char *zName, + void *pContext, + fts5_tokenizer *pTokenizer, + void (*xDestroy)(void*) + ); + + /* Find an existing tokenizer */ + int (*xFindTokenizer)( + fts5_api *pApi, + const char *zName, + void **ppContext, + fts5_tokenizer *pTokenizer + ); + + /* Create a new auxiliary function */ + int (*xCreateFunction)( + fts5_api *pApi, + const char *zName, + void *pContext, + fts5_extension_function xFunction, + void (*xDestroy)(void*) + ); +}; + +/* +** END OF REGISTRATION API +*************************************************************************/ + +#if 0 +} /* end of the 'extern "C"' block */ +#endif + +#endif /* _FTS5_H */ + +/******** End of fts5.h *********/ + +/************** End of sqlite3.h *********************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ + +/* +** Include the configuration header output by 'configure' if we're using the +** autoconf-based build +*/ +#ifdef _HAVE_SQLITE_CONFIG_H +#include "config.h" +#endif + +/************** Include sqliteLimit.h in the middle of sqliteInt.h ***********/ +/************** Begin file sqliteLimit.h *************************************/ +/* +** 2007 May 7 +** +** 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 defines various limits of what SQLite can process. +*/ + +/* +** The maximum length of a TEXT or BLOB in bytes. This also +** limits the size of a row in a table or index. +** +** The hard limit is the ability of a 32-bit signed integer +** to count the size: 2^31-1 or 2147483647. +*/ +#ifndef SQLITE_MAX_LENGTH +# define SQLITE_MAX_LENGTH 1000000000 +#endif + +/* +** This is the maximum number of +** +** * Columns in a table +** * Columns in an index +** * Columns in a view +** * Terms in the SET clause of an UPDATE statement +** * Terms in the result set of a SELECT statement +** * Terms in the GROUP BY or ORDER BY clauses of a SELECT statement. +** * Terms in the VALUES clause of an INSERT statement +** +** The hard upper limit here is 32676. Most database people will +** tell you that in a well-normalized database, you usually should +** not have more than a dozen or so columns in any table. And if +** that is the case, there is no point in having more than a few +** dozen values in any of the other situations described above. +*/ +#ifndef SQLITE_MAX_COLUMN +# define SQLITE_MAX_COLUMN 2000 +#endif + +/* +** The maximum length of a single SQL statement in bytes. +** +** It used to be the case that setting this value to zero would +** turn the limit off. That is no longer true. It is not possible +** to turn this limit off. +*/ +#ifndef SQLITE_MAX_SQL_LENGTH +# define SQLITE_MAX_SQL_LENGTH 1000000000 +#endif + +/* +** The maximum depth of an expression tree. This is limited to +** some extent by SQLITE_MAX_SQL_LENGTH. But sometime you might +** want to place more severe limits on the complexity of an +** expression. +** +** A value of 0 used to mean that the limit was not enforced. +** But that is no longer true. The limit is now strictly enforced +** at all times. +*/ +#ifndef SQLITE_MAX_EXPR_DEPTH +# define SQLITE_MAX_EXPR_DEPTH 1000 +#endif + +/* +** The maximum number of terms in a compound SELECT statement. +** The code generator for compound SELECT statements does one +** level of recursion for each term. A stack overflow can result +** if the number of terms is too large. In practice, most SQL +** never has more than 3 or 4 terms. Use a value of 0 to disable +** any limit on the number of terms in a compount SELECT. +*/ +#ifndef SQLITE_MAX_COMPOUND_SELECT +# define SQLITE_MAX_COMPOUND_SELECT 500 +#endif + +/* +** The maximum number of opcodes in a VDBE program. +** Not currently enforced. +*/ +#ifndef SQLITE_MAX_VDBE_OP +# define SQLITE_MAX_VDBE_OP 25000 +#endif + +/* +** The maximum number of arguments to an SQL function. +*/ +#ifndef SQLITE_MAX_FUNCTION_ARG +# define SQLITE_MAX_FUNCTION_ARG 127 +#endif + +/* +** The suggested maximum number of in-memory pages to use for +** the main database table and for temporary tables. +** +** IMPLEMENTATION-OF: R-30185-15359 The default suggested cache size is -2000, +** which means the cache size is limited to 2048000 bytes of memory. +** IMPLEMENTATION-OF: R-48205-43578 The default suggested cache size can be +** altered using the SQLITE_DEFAULT_CACHE_SIZE compile-time options. +*/ +#ifndef SQLITE_DEFAULT_CACHE_SIZE +# define SQLITE_DEFAULT_CACHE_SIZE -2000 +#endif + +/* +** The default number of frames to accumulate in the log file before +** checkpointing the database in WAL mode. +*/ +#ifndef SQLITE_DEFAULT_WAL_AUTOCHECKPOINT +# define SQLITE_DEFAULT_WAL_AUTOCHECKPOINT 1000 +#endif + +/* +** The maximum number of attached databases. This must be between 0 +** and 125. The upper bound of 125 is because the attached databases are +** counted using a signed 8-bit integer which has a maximum value of 127 +** and we have to allow 2 extra counts for the "main" and "temp" databases. +*/ +#ifndef SQLITE_MAX_ATTACHED +# define SQLITE_MAX_ATTACHED 10 +#endif + + +/* +** The maximum value of a ?nnn wildcard that the parser will accept. +*/ +#ifndef SQLITE_MAX_VARIABLE_NUMBER +# define SQLITE_MAX_VARIABLE_NUMBER 999 +#endif + +/* Maximum page size. The upper bound on this value is 65536. This a limit +** imposed by the use of 16-bit offsets within each page. +** +** Earlier versions of SQLite allowed the user to change this value at +** compile time. This is no longer permitted, on the grounds that it creates +** a library that is technically incompatible with an SQLite library +** compiled with a different limit. If a process operating on a database +** with a page-size of 65536 bytes crashes, then an instance of SQLite +** compiled with the default page-size limit will not be able to rollback +** the aborted transaction. This could lead to database corruption. +*/ +#ifdef SQLITE_MAX_PAGE_SIZE +# undef SQLITE_MAX_PAGE_SIZE +#endif +#define SQLITE_MAX_PAGE_SIZE 65536 + + +/* +** The default size of a database page. +*/ +#ifndef SQLITE_DEFAULT_PAGE_SIZE +# define SQLITE_DEFAULT_PAGE_SIZE 4096 +#endif +#if SQLITE_DEFAULT_PAGE_SIZE>SQLITE_MAX_PAGE_SIZE +# undef SQLITE_DEFAULT_PAGE_SIZE +# define SQLITE_DEFAULT_PAGE_SIZE SQLITE_MAX_PAGE_SIZE +#endif + +/* +** Ordinarily, if no value is explicitly provided, SQLite creates databases +** with page size SQLITE_DEFAULT_PAGE_SIZE. However, based on certain +** device characteristics (sector-size and atomic write() support), +** SQLite may choose a larger value. This constant is the maximum value +** SQLite will choose on its own. +*/ +#ifndef SQLITE_MAX_DEFAULT_PAGE_SIZE +# define SQLITE_MAX_DEFAULT_PAGE_SIZE 8192 +#endif +#if SQLITE_MAX_DEFAULT_PAGE_SIZE>SQLITE_MAX_PAGE_SIZE +# undef SQLITE_MAX_DEFAULT_PAGE_SIZE +# define SQLITE_MAX_DEFAULT_PAGE_SIZE SQLITE_MAX_PAGE_SIZE +#endif + + +/* +** Maximum number of pages in one database file. +** +** This is really just the default value for the max_page_count pragma. +** This value can be lowered (or raised) at run-time using that the +** max_page_count macro. +*/ +#ifndef SQLITE_MAX_PAGE_COUNT +# define SQLITE_MAX_PAGE_COUNT 1073741823 +#endif + +/* +** Maximum length (in bytes) of the pattern in a LIKE or GLOB +** operator. +*/ +#ifndef SQLITE_MAX_LIKE_PATTERN_LENGTH +# define SQLITE_MAX_LIKE_PATTERN_LENGTH 50000 +#endif + +/* +** Maximum depth of recursion for triggers. +** +** A value of 1 means that a trigger program will not be able to itself +** fire any triggers. A value of 0 means that no trigger programs at all +** may be executed. +*/ +#ifndef SQLITE_MAX_TRIGGER_DEPTH +# define SQLITE_MAX_TRIGGER_DEPTH 1000 +#endif + +/************** End of sqliteLimit.h *****************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ + +/* Disable nuisance warnings on Borland compilers */ +#if defined(__BORLANDC__) +#pragma warn -rch /* unreachable code */ +#pragma warn -ccc /* Condition is always true or false */ +#pragma warn -aus /* Assigned value is never used */ +#pragma warn -csu /* Comparing signed and unsigned */ +#pragma warn -spa /* Suspicious pointer arithmetic */ +#endif + +/* +** Include standard header files as necessary +*/ +#ifdef HAVE_STDINT_H +#include +#endif +#ifdef HAVE_INTTYPES_H +#include +#endif + +/* +** The following macros are used to cast pointers to integers and +** integers to pointers. The way you do this varies from one compiler +** to the next, so we have developed the following set of #if statements +** to generate appropriate macros for a wide range of compilers. +** +** The correct "ANSI" way to do this is to use the intptr_t type. +** Unfortunately, that typedef is not available on all compilers, or +** if it is available, it requires an #include of specific headers +** that vary from one machine to the next. +** +** Ticket #3860: The llvm-gcc-4.2 compiler from Apple chokes on +** the ((void*)&((char*)0)[X]) construct. But MSVC chokes on ((void*)(X)). +** So we have to define the macros in different ways depending on the +** compiler. +*/ +#if defined(__PTRDIFF_TYPE__) /* This case should work for GCC */ +# define SQLITE_INT_TO_PTR(X) ((void*)(__PTRDIFF_TYPE__)(X)) +# define SQLITE_PTR_TO_INT(X) ((int)(__PTRDIFF_TYPE__)(X)) +#elif !defined(__GNUC__) /* Works for compilers other than LLVM */ +# define SQLITE_INT_TO_PTR(X) ((void*)&((char*)0)[X]) +# define SQLITE_PTR_TO_INT(X) ((int)(((char*)X)-(char*)0)) +#elif defined(HAVE_STDINT_H) /* Use this case if we have ANSI headers */ +# define SQLITE_INT_TO_PTR(X) ((void*)(intptr_t)(X)) +# define SQLITE_PTR_TO_INT(X) ((int)(intptr_t)(X)) +#else /* Generates a warning - but it always works */ +# define SQLITE_INT_TO_PTR(X) ((void*)(X)) +# define SQLITE_PTR_TO_INT(X) ((int)(X)) +#endif + +/* +** A macro to hint to the compiler that a function should not be +** inlined. +*/ +#if defined(__GNUC__) +# define SQLITE_NOINLINE __attribute__((noinline)) +#elif defined(_MSC_VER) && _MSC_VER>=1310 +# define SQLITE_NOINLINE __declspec(noinline) +#else +# define SQLITE_NOINLINE +#endif + +/* +** Make sure that the compiler intrinsics we desire are enabled when +** compiling with an appropriate version of MSVC unless prevented by +** the SQLITE_DISABLE_INTRINSIC define. +*/ +#if !defined(SQLITE_DISABLE_INTRINSIC) +# if defined(_MSC_VER) && _MSC_VER>=1400 +# if !defined(_WIN32_WCE) +# include +# pragma intrinsic(_byteswap_ushort) +# pragma intrinsic(_byteswap_ulong) +# pragma intrinsic(_ReadWriteBarrier) +# else +# include +# endif +# endif +#endif + +/* +** The SQLITE_THREADSAFE macro must be defined as 0, 1, or 2. +** 0 means mutexes are permanently disable and the library is never +** threadsafe. 1 means the library is serialized which is the highest +** level of threadsafety. 2 means the library is multithreaded - multiple +** threads can use SQLite as long as no two threads try to use the same +** database connection at the same time. +** +** Older versions of SQLite used an optional THREADSAFE macro. +** We support that for legacy. +*/ +#if !defined(SQLITE_THREADSAFE) +# if defined(THREADSAFE) +# define SQLITE_THREADSAFE THREADSAFE +# else +# define SQLITE_THREADSAFE 1 /* IMP: R-07272-22309 */ +# endif +#endif + +/* +** Powersafe overwrite is on by default. But can be turned off using +** the -DSQLITE_POWERSAFE_OVERWRITE=0 command-line option. +*/ +#ifndef SQLITE_POWERSAFE_OVERWRITE +# define SQLITE_POWERSAFE_OVERWRITE 1 +#endif + +/* +** EVIDENCE-OF: R-25715-37072 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. +*/ +#if !defined(SQLITE_DEFAULT_MEMSTATUS) +# define SQLITE_DEFAULT_MEMSTATUS 1 +#endif + +/* +** Exactly one of the following macros must be defined in order to +** specify which memory allocation subsystem to use. +** +** SQLITE_SYSTEM_MALLOC // Use normal system malloc() +** SQLITE_WIN32_MALLOC // Use Win32 native heap API +** SQLITE_ZERO_MALLOC // Use a stub allocator that always fails +** SQLITE_MEMDEBUG // Debugging version of system malloc() +** +** On Windows, if the SQLITE_WIN32_MALLOC_VALIDATE macro is defined and the +** assert() macro is enabled, each call into the Win32 native heap subsystem +** will cause HeapValidate to be called. If heap validation should fail, an +** assertion will be triggered. +** +** If none of the above are defined, then set SQLITE_SYSTEM_MALLOC as +** the default. +*/ +#if defined(SQLITE_SYSTEM_MALLOC) \ + + defined(SQLITE_WIN32_MALLOC) \ + + defined(SQLITE_ZERO_MALLOC) \ + + defined(SQLITE_MEMDEBUG)>1 +# error "Two or more of the following compile-time configuration options\ + are defined but at most one is allowed:\ + SQLITE_SYSTEM_MALLOC, SQLITE_WIN32_MALLOC, SQLITE_MEMDEBUG,\ + SQLITE_ZERO_MALLOC" +#endif +#if defined(SQLITE_SYSTEM_MALLOC) \ + + defined(SQLITE_WIN32_MALLOC) \ + + defined(SQLITE_ZERO_MALLOC) \ + + defined(SQLITE_MEMDEBUG)==0 +# define SQLITE_SYSTEM_MALLOC 1 +#endif + +/* +** If SQLITE_MALLOC_SOFT_LIMIT is not zero, then try to keep the +** sizes of memory allocations below this value where possible. +*/ +#if !defined(SQLITE_MALLOC_SOFT_LIMIT) +# define SQLITE_MALLOC_SOFT_LIMIT 1024 +#endif + +/* +** We need to define _XOPEN_SOURCE as follows in order to enable +** recursive mutexes on most Unix systems and fchmod() on OpenBSD. +** But _XOPEN_SOURCE define causes problems for Mac OS X, so omit +** it. +*/ +#if !defined(_XOPEN_SOURCE) && !defined(__DARWIN__) && !defined(__APPLE__) +# define _XOPEN_SOURCE 600 +#endif + +/* +** NDEBUG and SQLITE_DEBUG are opposites. It should always be true that +** defined(NDEBUG)==!defined(SQLITE_DEBUG). If this is not currently true, +** make it true by defining or undefining NDEBUG. +** +** Setting NDEBUG makes the code smaller and faster by disabling the +** assert() statements in the code. So we want the default action +** to be for NDEBUG to be set and NDEBUG to be undefined only if SQLITE_DEBUG +** is set. Thus NDEBUG becomes an opt-in rather than an opt-out +** feature. +*/ +#if !defined(NDEBUG) && !defined(SQLITE_DEBUG) +# define NDEBUG 1 +#endif +#if defined(NDEBUG) && defined(SQLITE_DEBUG) +# undef NDEBUG +#endif + +/* +** Enable SQLITE_ENABLE_EXPLAIN_COMMENTS if SQLITE_DEBUG is turned on. +*/ +#if !defined(SQLITE_ENABLE_EXPLAIN_COMMENTS) && defined(SQLITE_DEBUG) +# define SQLITE_ENABLE_EXPLAIN_COMMENTS 1 +#endif + +/* +** The testcase() macro is used to aid in coverage testing. When +** doing coverage testing, the condition inside the argument to +** testcase() must be evaluated both true and false in order to +** get full branch coverage. The testcase() macro is inserted +** to help ensure adequate test coverage in places where simple +** condition/decision coverage is inadequate. For example, testcase() +** can be used to make sure boundary values are tested. For +** bitmask tests, testcase() can be used to make sure each bit +** is significant and used at least once. On switch statements +** where multiple cases go to the same block of code, testcase() +** can insure that all cases are evaluated. +** +*/ +#ifdef SQLITE_COVERAGE_TEST +SQLITE_PRIVATE void sqlite3Coverage(int); +# define testcase(X) if( X ){ sqlite3Coverage(__LINE__); } +#else +# define testcase(X) +#endif + +/* +** The TESTONLY macro is used to enclose variable declarations or +** other bits of code that are needed to support the arguments +** within testcase() and assert() macros. +*/ +#if !defined(NDEBUG) || defined(SQLITE_COVERAGE_TEST) +# define TESTONLY(X) X +#else +# define TESTONLY(X) +#endif + +/* +** Sometimes we need a small amount of code such as a variable initialization +** to setup for a later assert() statement. We do not want this code to +** appear when assert() is disabled. The following macro is therefore +** used to contain that setup code. The "VVA" acronym stands for +** "Verification, Validation, and Accreditation". In other words, the +** code within VVA_ONLY() will only run during verification processes. +*/ +#ifndef NDEBUG +# define VVA_ONLY(X) X +#else +# define VVA_ONLY(X) +#endif + +/* +** The ALWAYS and NEVER macros surround boolean expressions which +** are intended to always be true or false, respectively. Such +** expressions could be omitted from the code completely. But they +** are included in a few cases in order to enhance the resilience +** of SQLite to unexpected behavior - to make the code "self-healing" +** or "ductile" rather than being "brittle" and crashing at the first +** hint of unplanned behavior. +** +** In other words, ALWAYS and NEVER are added for defensive code. +** +** When doing coverage testing ALWAYS and NEVER are hard-coded to +** be true and false so that the unreachable code they specify will +** not be counted as untested code. +*/ +#if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_MUTATION_TEST) +# define ALWAYS(X) (1) +# define NEVER(X) (0) +#elif !defined(NDEBUG) +# define ALWAYS(X) ((X)?1:(assert(0),0)) +# define NEVER(X) ((X)?(assert(0),1):0) +#else +# define ALWAYS(X) (X) +# define NEVER(X) (X) +#endif + +/* +** Some malloc failures are only possible if SQLITE_TEST_REALLOC_STRESS is +** defined. We need to defend against those failures when testing with +** SQLITE_TEST_REALLOC_STRESS, but we don't want the unreachable branches +** during a normal build. The following macro can be used to disable tests +** that are always false except when SQLITE_TEST_REALLOC_STRESS is set. +*/ +#if defined(SQLITE_TEST_REALLOC_STRESS) +# define ONLY_IF_REALLOC_STRESS(X) (X) +#elif !defined(NDEBUG) +# define ONLY_IF_REALLOC_STRESS(X) ((X)?(assert(0),1):0) +#else +# define ONLY_IF_REALLOC_STRESS(X) (0) +#endif + +/* +** Declarations used for tracing the operating system interfaces. +*/ +#if defined(SQLITE_FORCE_OS_TRACE) || defined(SQLITE_TEST) || \ + (defined(SQLITE_DEBUG) && SQLITE_OS_WIN) + extern int sqlite3OSTrace; +# define OSTRACE(X) if( sqlite3OSTrace ) sqlite3DebugPrintf X +# define SQLITE_HAVE_OS_TRACE +#else +# define OSTRACE(X) +# undef SQLITE_HAVE_OS_TRACE +#endif + +/* +** Is the sqlite3ErrName() function needed in the build? Currently, +** it is needed by "mutex_w32.c" (when debugging), "os_win.c" (when +** OSTRACE is enabled), and by several "test*.c" files (which are +** compiled using SQLITE_TEST). +*/ +#if defined(SQLITE_HAVE_OS_TRACE) || defined(SQLITE_TEST) || \ + (defined(SQLITE_DEBUG) && SQLITE_OS_WIN) +# define SQLITE_NEED_ERR_NAME +#else +# undef SQLITE_NEED_ERR_NAME +#endif + +/* +** SQLITE_ENABLE_EXPLAIN_COMMENTS is incompatible with SQLITE_OMIT_EXPLAIN +*/ +#ifdef SQLITE_OMIT_EXPLAIN +# undef SQLITE_ENABLE_EXPLAIN_COMMENTS +#endif + +/* +** Return true (non-zero) if the input is an integer that is too large +** to fit in 32-bits. This macro is used inside of various testcase() +** macros to verify that we have tested SQLite for large-file support. +*/ +#define IS_BIG_INT(X) (((X)&~(i64)0xffffffff)!=0) + +/* +** The macro unlikely() is a hint that surrounds a boolean +** expression that is usually false. Macro likely() surrounds +** a boolean expression that is usually true. These hints could, +** in theory, be used by the compiler to generate better code, but +** currently they are just comments for human readers. +*/ +#define likely(X) (X) +#define unlikely(X) (X) + +/************** Include hash.h in the middle of sqliteInt.h ******************/ +/************** Begin file hash.h ********************************************/ +/* +** 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 header file for the generic hash-table implementation +** used in SQLite. +*/ +#ifndef SQLITE_HASH_H +#define SQLITE_HASH_H + +/* Forward declarations of structures. */ +typedef struct Hash Hash; +typedef struct HashElem HashElem; + +/* A complete hash table is an instance of the following structure. +** The internals of this structure are intended to be opaque -- client +** code should not attempt to access or modify the fields of this structure +** directly. Change this structure only by using the routines below. +** However, some of the "procedures" and "functions" for modifying and +** accessing this structure are really macros, so we can't really make +** this structure opaque. +** +** All elements of the hash table are on a single doubly-linked list. +** Hash.first points to the head of this list. +** +** There are Hash.htsize buckets. Each bucket points to a spot in +** the global doubly-linked list. The contents of the bucket are the +** element pointed to plus the next _ht.count-1 elements in the list. +** +** Hash.htsize and Hash.ht may be zero. In that case lookup is done +** by a linear search of the global list. For small tables, the +** Hash.ht table is never allocated because if there are few elements +** in the table, it is faster to do a linear search than to manage +** the hash table. +*/ +struct Hash { + unsigned int htsize; /* Number of buckets in the hash table */ + unsigned int count; /* Number of entries in this table */ + HashElem *first; /* The first element of the array */ + struct _ht { /* the hash table */ + int count; /* Number of entries with this hash */ + HashElem *chain; /* Pointer to first entry with this hash */ + } *ht; +}; + +/* Each element in the hash table is an instance of the following +** structure. All elements are stored on a single doubly-linked list. +** +** Again, this structure is intended to be opaque, but it can't really +** be opaque because it is used by macros. +*/ +struct HashElem { + HashElem *next, *prev; /* Next and previous elements in the table */ + void *data; /* Data associated with this element */ + const char *pKey; /* Key associated with this element */ +}; + +/* +** Access routines. To delete, insert a NULL pointer. +*/ +SQLITE_PRIVATE void sqlite3HashInit(Hash*); +SQLITE_PRIVATE void *sqlite3HashInsert(Hash*, const char *pKey, void *pData); +SQLITE_PRIVATE void *sqlite3HashFind(const Hash*, const char *pKey); +SQLITE_PRIVATE void sqlite3HashClear(Hash*); + +/* +** Macros for looping over all elements of a hash table. The idiom is +** like this: +** +** Hash h; +** HashElem *p; +** ... +** for(p=sqliteHashFirst(&h); p; p=sqliteHashNext(p)){ +** SomeStructure *pData = sqliteHashData(p); +** // do something with pData +** } +*/ +#define sqliteHashFirst(H) ((H)->first) +#define sqliteHashNext(E) ((E)->next) +#define sqliteHashData(E) ((E)->data) +/* #define sqliteHashKey(E) ((E)->pKey) // NOT USED */ +/* #define sqliteHashKeysize(E) ((E)->nKey) // NOT USED */ + +/* +** Number of entries in a hash table +*/ +/* #define sqliteHashCount(H) ((H)->count) // NOT USED */ + +#endif /* SQLITE_HASH_H */ + +/************** End of hash.h ************************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ +/************** Include parse.h in the middle of sqliteInt.h *****************/ +/************** Begin file parse.h *******************************************/ +#define TK_SEMI 1 +#define TK_EXPLAIN 2 +#define TK_QUERY 3 +#define TK_PLAN 4 +#define TK_BEGIN 5 +#define TK_TRANSACTION 6 +#define TK_DEFERRED 7 +#define TK_IMMEDIATE 8 +#define TK_EXCLUSIVE 9 +#define TK_COMMIT 10 +#define TK_END 11 +#define TK_ROLLBACK 12 +#define TK_SAVEPOINT 13 +#define TK_RELEASE 14 +#define TK_TO 15 +#define TK_TABLE 16 +#define TK_CREATE 17 +#define TK_IF 18 +#define TK_NOT 19 +#define TK_EXISTS 20 +#define TK_TEMP 21 +#define TK_LP 22 +#define TK_RP 23 +#define TK_AS 24 +#define TK_WITHOUT 25 +#define TK_COMMA 26 +#define TK_OR 27 +#define TK_AND 28 +#define TK_IS 29 +#define TK_MATCH 30 +#define TK_LIKE_KW 31 +#define TK_BETWEEN 32 +#define TK_IN 33 +#define TK_ISNULL 34 +#define TK_NOTNULL 35 +#define TK_NE 36 +#define TK_EQ 37 +#define TK_GT 38 +#define TK_LE 39 +#define TK_LT 40 +#define TK_GE 41 +#define TK_ESCAPE 42 +#define TK_BITAND 43 +#define TK_BITOR 44 +#define TK_LSHIFT 45 +#define TK_RSHIFT 46 +#define TK_PLUS 47 +#define TK_MINUS 48 +#define TK_STAR 49 +#define TK_SLASH 50 +#define TK_REM 51 +#define TK_CONCAT 52 +#define TK_COLLATE 53 +#define TK_BITNOT 54 +#define TK_ID 55 +#define TK_INDEXED 56 +#define TK_ABORT 57 +#define TK_ACTION 58 +#define TK_AFTER 59 +#define TK_ANALYZE 60 +#define TK_ASC 61 +#define TK_ATTACH 62 +#define TK_BEFORE 63 +#define TK_BY 64 +#define TK_CASCADE 65 +#define TK_CAST 66 +#define TK_COLUMNKW 67 +#define TK_CONFLICT 68 +#define TK_DATABASE 69 +#define TK_DESC 70 +#define TK_DETACH 71 +#define TK_EACH 72 +#define TK_FAIL 73 +#define TK_FOR 74 +#define TK_IGNORE 75 +#define TK_INITIALLY 76 +#define TK_INSTEAD 77 +#define TK_NO 78 +#define TK_KEY 79 +#define TK_OF 80 +#define TK_OFFSET 81 +#define TK_PRAGMA 82 +#define TK_RAISE 83 +#define TK_RECURSIVE 84 +#define TK_REPLACE 85 +#define TK_RESTRICT 86 +#define TK_ROW 87 +#define TK_TRIGGER 88 +#define TK_VACUUM 89 +#define TK_VIEW 90 +#define TK_VIRTUAL 91 +#define TK_WITH 92 +#define TK_REINDEX 93 +#define TK_RENAME 94 +#define TK_CTIME_KW 95 +#define TK_ANY 96 +#define TK_STRING 97 +#define TK_JOIN_KW 98 +#define TK_CONSTRAINT 99 +#define TK_DEFAULT 100 +#define TK_NULL 101 +#define TK_PRIMARY 102 +#define TK_UNIQUE 103 +#define TK_CHECK 104 +#define TK_REFERENCES 105 +#define TK_AUTOINCR 106 +#define TK_ON 107 +#define TK_INSERT 108 +#define TK_DELETE 109 +#define TK_UPDATE 110 +#define TK_SET 111 +#define TK_DEFERRABLE 112 +#define TK_FOREIGN 113 +#define TK_DROP 114 +#define TK_UNION 115 +#define TK_ALL 116 +#define TK_EXCEPT 117 +#define TK_INTERSECT 118 +#define TK_SELECT 119 +#define TK_VALUES 120 +#define TK_DISTINCT 121 +#define TK_DOT 122 +#define TK_FROM 123 +#define TK_JOIN 124 +#define TK_USING 125 +#define TK_ORDER 126 +#define TK_GROUP 127 +#define TK_HAVING 128 +#define TK_LIMIT 129 +#define TK_WHERE 130 +#define TK_INTO 131 +#define TK_FLOAT 132 +#define TK_BLOB 133 +#define TK_INTEGER 134 +#define TK_VARIABLE 135 +#define TK_CASE 136 +#define TK_WHEN 137 +#define TK_THEN 138 +#define TK_ELSE 139 +#define TK_INDEX 140 +#define TK_ALTER 141 +#define TK_ADD 142 +#define TK_TO_TEXT 143 +#define TK_TO_BLOB 144 +#define TK_TO_NUMERIC 145 +#define TK_TO_INT 146 +#define TK_TO_REAL 147 +#define TK_ISNOT 148 +#define TK_END_OF_FILE 149 +#define TK_UNCLOSED_STRING 150 +#define TK_FUNCTION 151 +#define TK_COLUMN 152 +#define TK_AGG_FUNCTION 153 +#define TK_AGG_COLUMN 154 +#define TK_UMINUS 155 +#define TK_UPLUS 156 +#define TK_REGISTER 157 +#define TK_VECTOR 158 +#define TK_SELECT_COLUMN 159 +#define TK_ASTERISK 160 +#define TK_SPAN 161 +#define TK_SPACE 162 +#define TK_ILLEGAL 163 + +/* The token codes above must all fit in 8 bits */ +#define TKFLG_MASK 0xff + +/* Flags that can be added to a token code when it is not +** being stored in a u8: */ +#define TKFLG_DONTFOLD 0x100 /* Omit constant folding optimizations */ + +/************** End of parse.h ***********************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ +#include +#include +#include +#include +#include + +/* +** If compiling for a processor that lacks floating point support, +** substitute integer for floating-point +*/ +#ifdef SQLITE_OMIT_FLOATING_POINT +# define double sqlite_int64 +# define float sqlite_int64 +# define LONGDOUBLE_TYPE sqlite_int64 +# ifndef SQLITE_BIG_DBL +# define SQLITE_BIG_DBL (((sqlite3_int64)1)<<50) +# endif +# define SQLITE_OMIT_DATETIME_FUNCS 1 +# define SQLITE_OMIT_TRACE 1 +# undef SQLITE_MIXED_ENDIAN_64BIT_FLOAT +# undef SQLITE_HAVE_ISNAN +#endif +#ifndef SQLITE_BIG_DBL +# define SQLITE_BIG_DBL (1e99) +#endif + +/* +** OMIT_TEMPDB is set to 1 if SQLITE_OMIT_TEMPDB is defined, or 0 +** afterward. Having this macro allows us to cause the C compiler +** to omit code used by TEMP tables without messy #ifndef statements. +*/ +#ifdef SQLITE_OMIT_TEMPDB +#define OMIT_TEMPDB 1 +#else +#define OMIT_TEMPDB 0 +#endif + +/* +** The "file format" number is an integer that is incremented whenever +** the VDBE-level file format changes. The following macros define the +** the default file format for new databases and the maximum file format +** that the library can read. +*/ +#define SQLITE_MAX_FILE_FORMAT 4 +#ifndef SQLITE_DEFAULT_FILE_FORMAT +# define SQLITE_DEFAULT_FILE_FORMAT 4 +#endif + +/* +** Determine whether triggers are recursive by default. This can be +** changed at run-time using a pragma. +*/ +#ifndef SQLITE_DEFAULT_RECURSIVE_TRIGGERS +# define SQLITE_DEFAULT_RECURSIVE_TRIGGERS 0 +#endif + +/* +** Provide a default value for SQLITE_TEMP_STORE in case it is not specified +** on the command-line +*/ +#ifndef SQLITE_TEMP_STORE +# define SQLITE_TEMP_STORE 1 +# define SQLITE_TEMP_STORE_xc 1 /* Exclude from ctime.c */ +#endif + +/* +** If no value has been provided for SQLITE_MAX_WORKER_THREADS, or if +** SQLITE_TEMP_STORE is set to 3 (never use temporary files), set it +** to zero. +*/ +#if SQLITE_TEMP_STORE==3 || SQLITE_THREADSAFE==0 +# undef SQLITE_MAX_WORKER_THREADS +# define SQLITE_MAX_WORKER_THREADS 0 +#endif +#ifndef SQLITE_MAX_WORKER_THREADS +# define SQLITE_MAX_WORKER_THREADS 8 +#endif +#ifndef SQLITE_DEFAULT_WORKER_THREADS +# define SQLITE_DEFAULT_WORKER_THREADS 0 +#endif +#if SQLITE_DEFAULT_WORKER_THREADS>SQLITE_MAX_WORKER_THREADS +# undef SQLITE_MAX_WORKER_THREADS +# define SQLITE_MAX_WORKER_THREADS SQLITE_DEFAULT_WORKER_THREADS +#endif + +/* +** The default initial allocation for the pagecache when using separate +** pagecaches for each database connection. A positive number is the +** number of pages. A negative number N translations means that a buffer +** of -1024*N bytes is allocated and used for as many pages as it will hold. +*/ +#ifndef SQLITE_DEFAULT_PCACHE_INITSZ +# define SQLITE_DEFAULT_PCACHE_INITSZ 100 +#endif + +/* +** GCC does not define the offsetof() macro so we'll have to do it +** ourselves. +*/ +#ifndef offsetof +#define offsetof(STRUCTURE,FIELD) ((int)((char*)&((STRUCTURE*)0)->FIELD)) +#endif + +/* +** Macros to compute minimum and maximum of two numbers. +*/ +#ifndef MIN +# define MIN(A,B) ((A)<(B)?(A):(B)) +#endif +#ifndef MAX +# define MAX(A,B) ((A)>(B)?(A):(B)) +#endif + +/* +** Swap two objects of type TYPE. +*/ +#define SWAP(TYPE,A,B) {TYPE t=A; A=B; B=t;} + +/* +** Check to see if this machine uses EBCDIC. (Yes, believe it or +** not, there are still machines out there that use EBCDIC.) +*/ +#if 'A' == '\301' +# define SQLITE_EBCDIC 1 +#else +# define SQLITE_ASCII 1 +#endif + +/* +** Integers of known sizes. These typedefs might change for architectures +** where the sizes very. Preprocessor macros are available so that the +** types can be conveniently redefined at compile-type. Like this: +** +** cc '-DUINTPTR_TYPE=long long int' ... +*/ +#ifndef UINT32_TYPE +# ifdef HAVE_UINT32_T +# define UINT32_TYPE uint32_t +# else +# define UINT32_TYPE unsigned int +# endif +#endif +#ifndef UINT16_TYPE +# ifdef HAVE_UINT16_T +# define UINT16_TYPE uint16_t +# else +# define UINT16_TYPE unsigned short int +# endif +#endif +#ifndef INT16_TYPE +# ifdef HAVE_INT16_T +# define INT16_TYPE int16_t +# else +# define INT16_TYPE short int +# endif +#endif +#ifndef UINT8_TYPE +# ifdef HAVE_UINT8_T +# define UINT8_TYPE uint8_t +# else +# define UINT8_TYPE unsigned char +# endif +#endif +#ifndef INT8_TYPE +# ifdef HAVE_INT8_T +# define INT8_TYPE int8_t +# else +# define INT8_TYPE signed char +# endif +#endif +#ifndef LONGDOUBLE_TYPE +# define LONGDOUBLE_TYPE long double +#endif +typedef sqlite_int64 i64; /* 8-byte signed integer */ +typedef sqlite_uint64 u64; /* 8-byte unsigned integer */ +typedef UINT32_TYPE u32; /* 4-byte unsigned integer */ +typedef UINT16_TYPE u16; /* 2-byte unsigned integer */ +typedef INT16_TYPE i16; /* 2-byte signed integer */ +typedef UINT8_TYPE u8; /* 1-byte unsigned integer */ +typedef INT8_TYPE i8; /* 1-byte signed integer */ + +/* +** SQLITE_MAX_U32 is a u64 constant that is the maximum u64 value +** that can be stored in a u32 without loss of data. The value +** is 0x00000000ffffffff. But because of quirks of some compilers, we +** have to specify the value in the less intuitive manner shown: +*/ +#define SQLITE_MAX_U32 ((((u64)1)<<32)-1) + +/* +** The datatype used to store estimates of the number of rows in a +** table or index. This is an unsigned integer type. For 99.9% of +** the world, a 32-bit integer is sufficient. But a 64-bit integer +** can be used at compile-time if desired. +*/ +#ifdef SQLITE_64BIT_STATS + typedef u64 tRowcnt; /* 64-bit only if requested at compile-time */ +#else + typedef u32 tRowcnt; /* 32-bit is the default */ +#endif + +/* +** Estimated quantities used for query planning are stored as 16-bit +** logarithms. For quantity X, the value stored is 10*log2(X). This +** gives a possible range of values of approximately 1.0e986 to 1e-986. +** But the allowed values are "grainy". Not every value is representable. +** For example, quantities 16 and 17 are both represented by a LogEst +** of 40. However, since LogEst quantities are suppose to be estimates, +** not exact values, this imprecision is not a problem. +** +** "LogEst" is short for "Logarithmic Estimate". +** +** Examples: +** 1 -> 0 20 -> 43 10000 -> 132 +** 2 -> 10 25 -> 46 25000 -> 146 +** 3 -> 16 100 -> 66 1000000 -> 199 +** 4 -> 20 1000 -> 99 1048576 -> 200 +** 10 -> 33 1024 -> 100 4294967296 -> 320 +** +** The LogEst can be negative to indicate fractional values. +** Examples: +** +** 0.5 -> -10 0.1 -> -33 0.0625 -> -40 +*/ +typedef INT16_TYPE LogEst; + +/* +** Set the SQLITE_PTRSIZE macro to the number of bytes in a pointer +*/ +#ifndef SQLITE_PTRSIZE +# if defined(__SIZEOF_POINTER__) +# define SQLITE_PTRSIZE __SIZEOF_POINTER__ +# elif defined(i386) || defined(__i386__) || defined(_M_IX86) || \ + defined(_M_ARM) || defined(__arm__) || defined(__x86) +# define SQLITE_PTRSIZE 4 +# else +# define SQLITE_PTRSIZE 8 +# endif +#endif + +/* The uptr type is an unsigned integer large enough to hold a pointer +*/ +#if defined(HAVE_STDINT_H) + typedef uintptr_t uptr; +#elif SQLITE_PTRSIZE==4 + typedef u32 uptr; +#else + typedef u64 uptr; +#endif + +/* +** The SQLITE_WITHIN(P,S,E) macro checks to see if pointer P points to +** something between S (inclusive) and E (exclusive). +** +** In other words, S is a buffer and E is a pointer to the first byte after +** the end of buffer S. This macro returns true if P points to something +** contained within the buffer S. +*/ +#define SQLITE_WITHIN(P,S,E) (((uptr)(P)>=(uptr)(S))&&((uptr)(P)<(uptr)(E))) + + +/* +** Macros to determine whether the machine is big or little endian, +** and whether or not that determination is run-time or compile-time. +** +** For best performance, an attempt is made to guess at the byte-order +** using C-preprocessor macros. If that is unsuccessful, or if +** -DSQLITE_RUNTIME_BYTEORDER=1 is set, then byte-order is determined +** at run-time. +*/ +#if (defined(i386) || defined(__i386__) || defined(_M_IX86) || \ + defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || \ + defined(_M_AMD64) || defined(_M_ARM) || defined(__x86) || \ + defined(__arm__)) && !defined(SQLITE_RUNTIME_BYTEORDER) +# define SQLITE_BYTEORDER 1234 +# define SQLITE_BIGENDIAN 0 +# define SQLITE_LITTLEENDIAN 1 +# define SQLITE_UTF16NATIVE SQLITE_UTF16LE +#endif +#if (defined(sparc) || defined(__ppc__)) \ + && !defined(SQLITE_RUNTIME_BYTEORDER) +# define SQLITE_BYTEORDER 4321 +# define SQLITE_BIGENDIAN 1 +# define SQLITE_LITTLEENDIAN 0 +# define SQLITE_UTF16NATIVE SQLITE_UTF16BE +#endif +#if !defined(SQLITE_BYTEORDER) +# ifdef SQLITE_AMALGAMATION + const int sqlite3one = 1; +# else + extern const int sqlite3one; +# endif +# define SQLITE_BYTEORDER 0 /* 0 means "unknown at compile-time" */ +# define SQLITE_BIGENDIAN (*(char *)(&sqlite3one)==0) +# define SQLITE_LITTLEENDIAN (*(char *)(&sqlite3one)==1) +# define SQLITE_UTF16NATIVE (SQLITE_BIGENDIAN?SQLITE_UTF16BE:SQLITE_UTF16LE) +#endif + +/* +** Constants for the largest and smallest possible 64-bit signed integers. +** These macros are designed to work correctly on both 32-bit and 64-bit +** compilers. +*/ +#define LARGEST_INT64 (0xffffffff|(((i64)0x7fffffff)<<32)) +#define SMALLEST_INT64 (((i64)-1) - LARGEST_INT64) + +/* +** Round up a number to the next larger multiple of 8. This is used +** to force 8-byte alignment on 64-bit architectures. +*/ +#define ROUND8(x) (((x)+7)&~7) + +/* +** Round down to the nearest multiple of 8 +*/ +#define ROUNDDOWN8(x) ((x)&~7) + +/* +** 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() implementation might return us 4-byte aligned +** pointers. In that case, only verify 4-byte alignment. +*/ +#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 + +/* +** Disable MMAP on platforms where it is known to not work +*/ +#if defined(__OpenBSD__) || defined(__QNXNTO__) +# undef SQLITE_MAX_MMAP_SIZE +# define SQLITE_MAX_MMAP_SIZE 0 +#endif + +/* +** Default maximum size of memory used by memory-mapped I/O in the VFS +*/ +#ifdef __APPLE__ +# include +#endif +#ifndef SQLITE_MAX_MMAP_SIZE +# if defined(__linux__) \ + || defined(_WIN32) \ + || (defined(__APPLE__) && defined(__MACH__)) \ + || defined(__sun) \ + || defined(__FreeBSD__) \ + || defined(__DragonFly__) +# define SQLITE_MAX_MMAP_SIZE 0x7fff0000 /* 2147418112 */ +# else +# define SQLITE_MAX_MMAP_SIZE 0 +# endif +# define SQLITE_MAX_MMAP_SIZE_xc 1 /* exclude from ctime.c */ +#endif + +/* +** The default MMAP_SIZE is zero on all platforms. Or, even if a larger +** default MMAP_SIZE is specified at compile-time, make sure that it does +** not exceed the maximum mmap size. +*/ +#ifndef SQLITE_DEFAULT_MMAP_SIZE +# define SQLITE_DEFAULT_MMAP_SIZE 0 +# define SQLITE_DEFAULT_MMAP_SIZE_xc 1 /* Exclude from ctime.c */ +#endif +#if SQLITE_DEFAULT_MMAP_SIZE>SQLITE_MAX_MMAP_SIZE +# undef SQLITE_DEFAULT_MMAP_SIZE +# define SQLITE_DEFAULT_MMAP_SIZE SQLITE_MAX_MMAP_SIZE +#endif + +/* +** Only one of SQLITE_ENABLE_STAT3 or SQLITE_ENABLE_STAT4 can be defined. +** Priority is given to SQLITE_ENABLE_STAT4. If either are defined, also +** define SQLITE_ENABLE_STAT3_OR_STAT4 +*/ +#ifdef SQLITE_ENABLE_STAT4 +# undef SQLITE_ENABLE_STAT3 +# define SQLITE_ENABLE_STAT3_OR_STAT4 1 +#elif SQLITE_ENABLE_STAT3 +# define SQLITE_ENABLE_STAT3_OR_STAT4 1 +#elif SQLITE_ENABLE_STAT3_OR_STAT4 +# undef SQLITE_ENABLE_STAT3_OR_STAT4 +#endif + +/* +** SELECTTRACE_ENABLED will be either 1 or 0 depending on whether or not +** the Select query generator tracing logic is turned on. +*/ +#if defined(SQLITE_DEBUG) || defined(SQLITE_ENABLE_SELECTTRACE) +# define SELECTTRACE_ENABLED 1 +#else +# define SELECTTRACE_ENABLED 0 +#endif + +/* +** An instance of the following structure is used to store the busy-handler +** callback for a given sqlite handle. +** +** The sqlite.busyHandler member of the sqlite struct contains the busy +** callback for the database handle. Each pager opened via the sqlite +** handle is passed a pointer to sqlite.busyHandler. The busy-handler +** callback is currently invoked only from within pager.c. +*/ +typedef struct BusyHandler BusyHandler; +struct BusyHandler { + int (*xFunc)(void *,int); /* The busy callback */ + void *pArg; /* First arg to busy callback */ + int nBusy; /* Incremented with each busy call */ +}; + +/* +** Name of the master database table. The master database table +** is a special table that holds the names and attributes of all +** user tables and indices. +*/ +#define MASTER_NAME "sqlite_master" +#define TEMP_MASTER_NAME "sqlite_temp_master" + +/* +** The root-page of the master database table. +*/ +#define MASTER_ROOT 1 + +/* +** The name of the schema table. +*/ +#define SCHEMA_TABLE(x) ((!OMIT_TEMPDB)&&(x==1)?TEMP_MASTER_NAME:MASTER_NAME) + +/* +** A convenience macro that returns the number of elements in +** an array. +*/ +#define ArraySize(X) ((int)(sizeof(X)/sizeof(X[0]))) + +/* +** Determine if the argument is a power of two +*/ +#define IsPowerOfTwo(X) (((X)&((X)-1))==0) + +/* +** The following value as a destructor means to use sqlite3DbFree(). +** The sqlite3DbFree() routine requires two parameters instead of the +** one parameter that destructors normally want. So we have to introduce +** this magic value that the code knows to handle differently. Any +** pointer will work here as long as it is distinct from SQLITE_STATIC +** and SQLITE_TRANSIENT. +*/ +#define SQLITE_DYNAMIC ((sqlite3_destructor_type)sqlite3MallocSize) + +/* +** When SQLITE_OMIT_WSD is defined, it means that the target platform does +** not support Writable Static Data (WSD) such as global and static variables. +** All variables must either be on the stack or dynamically allocated from +** the heap. When WSD is unsupported, the variable declarations scattered +** throughout the SQLite code must become constants instead. The SQLITE_WSD +** macro is used for this purpose. And instead of referencing the variable +** directly, we use its constant as a key to lookup the run-time allocated +** buffer that holds real variable. The constant is also the initializer +** for the run-time allocated buffer. +** +** In the usual case where WSD is supported, the SQLITE_WSD and GLOBAL +** macros become no-ops and have zero performance impact. +*/ +#ifdef SQLITE_OMIT_WSD + #define SQLITE_WSD const + #define GLOBAL(t,v) (*(t*)sqlite3_wsd_find((void*)&(v), sizeof(v))) + #define sqlite3GlobalConfig GLOBAL(struct Sqlite3Config, sqlite3Config) +SQLITE_API int sqlite3_wsd_init(int N, int J); +SQLITE_API void *sqlite3_wsd_find(void *K, int L); +#else + #define SQLITE_WSD + #define GLOBAL(t,v) v + #define sqlite3GlobalConfig sqlite3Config +#endif + +/* +** The following macros are used to suppress compiler warnings and to +** make it clear to human readers when a function parameter is deliberately +** left unused within the body of a function. This usually happens when +** a function is called via a function pointer. For example the +** implementation of an SQL aggregate step callback may not use the +** parameter indicating the number of arguments passed to the aggregate, +** if it knows that this is enforced elsewhere. +** +** When a function parameter is not used at all within the body of a function, +** it is generally named "NotUsed" or "NotUsed2" to make things even clearer. +** However, these macros may also be used to suppress warnings related to +** parameters that may or may not be used depending on compilation options. +** For example those parameters only used in assert() statements. In these +** cases the parameters are named as per the usual conventions. +*/ +#define UNUSED_PARAMETER(x) (void)(x) +#define UNUSED_PARAMETER2(x,y) UNUSED_PARAMETER(x),UNUSED_PARAMETER(y) + +/* +** Forward references to structures +*/ +typedef struct AggInfo AggInfo; +typedef struct AuthContext AuthContext; +typedef struct AutoincInfo AutoincInfo; +typedef struct Bitvec Bitvec; +typedef struct CollSeq CollSeq; +typedef struct Column Column; +typedef struct Db Db; +typedef struct Schema Schema; +typedef struct Expr Expr; +typedef struct ExprList ExprList; +typedef struct ExprSpan ExprSpan; +typedef struct FKey FKey; +typedef struct FuncDestructor FuncDestructor; +typedef struct FuncDef FuncDef; +typedef struct FuncDefHash FuncDefHash; +typedef struct IdList IdList; +typedef struct Index Index; +typedef struct IndexSample IndexSample; +typedef struct KeyClass KeyClass; +typedef struct KeyInfo KeyInfo; +typedef struct Lookaside Lookaside; +typedef struct LookasideSlot LookasideSlot; +typedef struct Module Module; +typedef struct NameContext NameContext; +typedef struct Parse Parse; +typedef struct PreUpdate PreUpdate; +typedef struct PrintfArguments PrintfArguments; +typedef struct RowSet RowSet; +typedef struct Savepoint Savepoint; +typedef struct Select Select; +typedef struct SQLiteThread SQLiteThread; +typedef struct SelectDest SelectDest; +typedef struct SrcList SrcList; +typedef struct StrAccum StrAccum; +typedef struct Table Table; +typedef struct TableLock TableLock; +typedef struct Token Token; +typedef struct TreeView TreeView; +typedef struct Trigger Trigger; +typedef struct TriggerPrg TriggerPrg; +typedef struct TriggerStep TriggerStep; +typedef struct UnpackedRecord UnpackedRecord; +typedef struct VTable VTable; +typedef struct VtabCtx VtabCtx; +typedef struct Walker Walker; +typedef struct WhereInfo WhereInfo; +typedef struct With With; + +/* +** Defer sourcing vdbe.h and btree.h until after the "u8" and +** "BusyHandler" typedefs. vdbe.h also requires a few of the opaque +** pointer types (i.e. FuncDef) defined above. +*/ +/************** Include btree.h in the middle of sqliteInt.h *****************/ +/************** Begin file btree.h *******************************************/ +/* +** 2001 September 15 +** +** 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 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. +*/ +#ifndef SQLITE_BTREE_H +#define SQLITE_BTREE_H + +/* TODO: This definition is just included so other modules compile. It +** needs to be revisited. +*/ +#define SQLITE_N_BTREE_META 16 + +/* +** If defined as non-zero, auto-vacuum is enabled by default. Otherwise +** it must be turned on for each database using "PRAGMA auto_vacuum = 1". +*/ +#ifndef SQLITE_DEFAULT_AUTOVACUUM + #define SQLITE_DEFAULT_AUTOVACUUM 0 +#endif + +#define BTREE_AUTOVACUUM_NONE 0 /* Do not do auto-vacuum */ +#define BTREE_AUTOVACUUM_FULL 1 /* Do full auto-vacuum */ +#define BTREE_AUTOVACUUM_INCR 2 /* Incremental vacuum */ + +/* +** Forward declarations of structure +*/ +typedef struct Btree Btree; +typedef struct BtCursor BtCursor; +typedef struct BtShared BtShared; +typedef struct BtreePayload BtreePayload; + + +SQLITE_PRIVATE int sqlite3BtreeOpen( + sqlite3_vfs *pVfs, /* VFS to use with this b-tree */ + const char *zFilename, /* Name of database file to open */ + sqlite3 *db, /* Associated database connection */ + Btree **ppBtree, /* Return open Btree* here */ + int flags, /* Flags */ + int vfsFlags /* Flags passed through to VFS open */ +); + +/* The flags parameter to sqlite3BtreeOpen can be the bitwise or of the +** following values. +** +** NOTE: These values must match the corresponding PAGER_ values in +** pager.h. +*/ +#define BTREE_OMIT_JOURNAL 1 /* Do not create or use a rollback journal */ +#define BTREE_MEMORY 2 /* This is an in-memory DB */ +#define BTREE_SINGLE 4 /* The file contains at most 1 b-tree */ +#define BTREE_UNORDERED 8 /* Use of a hash implementation is OK */ + +SQLITE_PRIVATE int sqlite3BtreeClose(Btree*); +SQLITE_PRIVATE int sqlite3BtreeSetCacheSize(Btree*,int); +SQLITE_PRIVATE int sqlite3BtreeSetSpillSize(Btree*,int); +#if SQLITE_MAX_MMAP_SIZE>0 +SQLITE_PRIVATE int sqlite3BtreeSetMmapLimit(Btree*,sqlite3_int64); +#endif +SQLITE_PRIVATE int sqlite3BtreeSetPagerFlags(Btree*,unsigned); +SQLITE_PRIVATE int sqlite3BtreeSetPageSize(Btree *p, int nPagesize, int nReserve, int eFix); +SQLITE_PRIVATE int sqlite3BtreeGetPageSize(Btree*); +SQLITE_PRIVATE int sqlite3BtreeMaxPageCount(Btree*,int); +SQLITE_PRIVATE u32 sqlite3BtreeLastPage(Btree*); +SQLITE_PRIVATE int sqlite3BtreeSecureDelete(Btree*,int); +SQLITE_PRIVATE int sqlite3BtreeGetOptimalReserve(Btree*); +SQLITE_PRIVATE int sqlite3BtreeGetReserveNoMutex(Btree *p); +SQLITE_PRIVATE int sqlite3BtreeSetAutoVacuum(Btree *, int); +SQLITE_PRIVATE int sqlite3BtreeGetAutoVacuum(Btree *); +SQLITE_PRIVATE int sqlite3BtreeBeginTrans(Btree*,int); +SQLITE_PRIVATE int sqlite3BtreeCommitPhaseOne(Btree*, const char *zMaster); +SQLITE_PRIVATE int sqlite3BtreeCommitPhaseTwo(Btree*, int); +SQLITE_PRIVATE int sqlite3BtreeCommit(Btree*); +SQLITE_PRIVATE int sqlite3BtreeRollback(Btree*,int,int); +SQLITE_PRIVATE int sqlite3BtreeBeginStmt(Btree*,int); +SQLITE_PRIVATE int sqlite3BtreeCreateTable(Btree*, int*, int flags); +SQLITE_PRIVATE int sqlite3BtreeIsInTrans(Btree*); +SQLITE_PRIVATE int sqlite3BtreeIsInReadTrans(Btree*); +SQLITE_PRIVATE int sqlite3BtreeIsInBackup(Btree*); +SQLITE_PRIVATE void *sqlite3BtreeSchema(Btree *, int, void(*)(void *)); +SQLITE_PRIVATE int sqlite3BtreeSchemaLocked(Btree *pBtree); +#ifndef SQLITE_OMIT_SHARED_CACHE +SQLITE_PRIVATE int sqlite3BtreeLockTable(Btree *pBtree, int iTab, u8 isWriteLock); +#endif +SQLITE_PRIVATE int sqlite3BtreeSavepoint(Btree *, int, int); + +SQLITE_PRIVATE const char *sqlite3BtreeGetFilename(Btree *); +SQLITE_PRIVATE const char *sqlite3BtreeGetJournalname(Btree *); +SQLITE_PRIVATE int sqlite3BtreeCopyFile(Btree *, Btree *); + +SQLITE_PRIVATE int sqlite3BtreeIncrVacuum(Btree *); + +/* The flags parameter to sqlite3BtreeCreateTable can be the bitwise OR +** of the flags shown below. +** +** Every SQLite table must have either BTREE_INTKEY or BTREE_BLOBKEY set. +** With BTREE_INTKEY, the table key is a 64-bit integer and arbitrary data +** is stored in the leaves. (BTREE_INTKEY is used for SQL tables.) With +** BTREE_BLOBKEY, the key is an arbitrary BLOB and no content is stored +** anywhere - the key is the content. (BTREE_BLOBKEY is used for SQL +** indices.) +*/ +#define BTREE_INTKEY 1 /* Table has only 64-bit signed integer keys */ +#define BTREE_BLOBKEY 2 /* Table has keys only - no data */ + +SQLITE_PRIVATE int sqlite3BtreeDropTable(Btree*, int, int*); +SQLITE_PRIVATE int sqlite3BtreeClearTable(Btree*, int, int*); +SQLITE_PRIVATE int sqlite3BtreeClearTableOfCursor(BtCursor*); +SQLITE_PRIVATE int sqlite3BtreeTripAllCursors(Btree*, int, int); + +SQLITE_PRIVATE void sqlite3BtreeGetMeta(Btree *pBtree, int idx, u32 *pValue); +SQLITE_PRIVATE int sqlite3BtreeUpdateMeta(Btree*, int idx, u32 value); + +SQLITE_PRIVATE int sqlite3BtreeNewDb(Btree *p); + +/* +** The second parameter to sqlite3BtreeGetMeta or sqlite3BtreeUpdateMeta +** should be one of the following values. The integer values are assigned +** to constants so that the offset of the corresponding field in an +** SQLite database header may be found using the following formula: +** +** offset = 36 + (idx * 4) +** +** For example, the free-page-count field is located at byte offset 36 of +** the database file header. The incr-vacuum-flag field is located at +** byte offset 64 (== 36+4*7). +** +** The BTREE_DATA_VERSION value is not really a value stored in the header. +** It is a read-only number computed by the pager. But we merge it with +** the header value access routines since its access pattern is the same. +** Call it a "virtual meta value". +*/ +#define BTREE_FREE_PAGE_COUNT 0 +#define BTREE_SCHEMA_VERSION 1 +#define BTREE_FILE_FORMAT 2 +#define BTREE_DEFAULT_CACHE_SIZE 3 +#define BTREE_LARGEST_ROOT_PAGE 4 +#define BTREE_TEXT_ENCODING 5 +#define BTREE_USER_VERSION 6 +#define BTREE_INCR_VACUUM 7 +#define BTREE_APPLICATION_ID 8 +#define BTREE_DATA_VERSION 15 /* A virtual meta-value */ + +/* +** Kinds of hints that can be passed into the sqlite3BtreeCursorHint() +** interface. +** +** BTREE_HINT_RANGE (arguments: Expr*, Mem*) +** +** The first argument is an Expr* (which is guaranteed to be constant for +** the lifetime of the cursor) that defines constraints on which rows +** might be fetched with this cursor. The Expr* tree may contain +** TK_REGISTER nodes that refer to values stored in the array of registers +** passed as the second parameter. In other words, if Expr.op==TK_REGISTER +** then the value of the node is the value in Mem[pExpr.iTable]. Any +** TK_COLUMN node in the expression tree refers to the Expr.iColumn-th +** column of the b-tree of the cursor. The Expr tree will not contain +** any function calls nor subqueries nor references to b-trees other than +** the cursor being hinted. +** +** The design of the _RANGE hint is aid b-tree implementations that try +** to prefetch content from remote machines - to provide those +** implementations with limits on what needs to be prefetched and thereby +** reduce network bandwidth. +** +** Note that BTREE_HINT_FLAGS with BTREE_BULKLOAD is the only hint used by +** standard SQLite. The other hints are provided for extentions that use +** the SQLite parser and code generator but substitute their own storage +** engine. +*/ +#define BTREE_HINT_RANGE 0 /* Range constraints on queries */ + +/* +** Values that may be OR'd together to form the argument to the +** BTREE_HINT_FLAGS hint for sqlite3BtreeCursorHint(): +** +** The BTREE_BULKLOAD flag is set on index cursors when the index is going +** to be filled with content that is already in sorted order. +** +** The BTREE_SEEK_EQ flag is set on cursors that will get OP_SeekGE or +** OP_SeekLE opcodes for a range search, but where the range of entries +** selected will all have the same key. In other words, the cursor will +** be used only for equality key searches. +** +*/ +#define BTREE_BULKLOAD 0x00000001 /* Used to full index in sorted order */ +#define BTREE_SEEK_EQ 0x00000002 /* EQ seeks only - no range seeks */ + +/* +** Flags passed as the third argument to sqlite3BtreeCursor(). +** +** For read-only cursors the wrFlag argument is always zero. For read-write +** cursors it may be set to either (BTREE_WRCSR|BTREE_FORDELETE) or just +** (BTREE_WRCSR). If the BTREE_FORDELETE bit is set, then the cursor will +** only be used by SQLite for the following: +** +** * to seek to and then delete specific entries, and/or +** +** * to read values that will be used to create keys that other +** BTREE_FORDELETE cursors will seek to and delete. +** +** The BTREE_FORDELETE flag is an optimization hint. It is not used by +** by this, the native b-tree engine of SQLite, but it is available to +** alternative storage engines that might be substituted in place of this +** b-tree system. For alternative storage engines in which a delete of +** the main table row automatically deletes corresponding index rows, +** the FORDELETE flag hint allows those alternative storage engines to +** skip a lot of work. Namely: FORDELETE cursors may treat all SEEK +** and DELETE operations as no-ops, and any READ operation against a +** FORDELETE cursor may return a null row: 0x01 0x00. +*/ +#define BTREE_WRCSR 0x00000004 /* read-write cursor */ +#define BTREE_FORDELETE 0x00000008 /* Cursor is for seek/delete only */ + +SQLITE_PRIVATE int sqlite3BtreeCursor( + Btree*, /* BTree containing table to open */ + int iTable, /* Index of root page */ + int wrFlag, /* 1 for writing. 0 for read-only */ + struct KeyInfo*, /* First argument to compare function */ + BtCursor *pCursor /* Space to write cursor structure */ +); +SQLITE_PRIVATE int sqlite3BtreeCursorSize(void); +SQLITE_PRIVATE void sqlite3BtreeCursorZero(BtCursor*); +SQLITE_PRIVATE void sqlite3BtreeCursorHintFlags(BtCursor*, unsigned); +#ifdef SQLITE_ENABLE_CURSOR_HINTS +SQLITE_PRIVATE void sqlite3BtreeCursorHint(BtCursor*, int, ...); +#endif + +SQLITE_PRIVATE int sqlite3BtreeCloseCursor(BtCursor*); +SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked( + BtCursor*, + UnpackedRecord *pUnKey, + i64 intKey, + int bias, + int *pRes +); +SQLITE_PRIVATE int sqlite3BtreeCursorHasMoved(BtCursor*); +SQLITE_PRIVATE int sqlite3BtreeCursorRestore(BtCursor*, int*); +SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor*, u8 flags); + +/* Allowed flags for the 2nd argument to sqlite3BtreeDelete() */ +#define BTREE_SAVEPOSITION 0x02 /* Leave cursor pointing at NEXT or PREV */ +#define BTREE_AUXDELETE 0x04 /* not the primary delete operation */ + +/* An instance of the BtreePayload object describes the content of a single +** entry in either an index or table btree. +** +** Index btrees (used for indexes and also WITHOUT ROWID tables) contain +** an arbitrary key and no data. These btrees have pKey,nKey set to their +** key and pData,nData,nZero set to zero. +** +** Table btrees (used for rowid tables) contain an integer rowid used as +** the key and passed in the nKey field. The pKey field is zero. +** pData,nData hold the content of the new entry. nZero extra zero bytes +** are appended to the end of the content when constructing the entry. +** +** This object is used to pass information into sqlite3BtreeInsert(). The +** same information used to be passed as five separate parameters. But placing +** the information into this object helps to keep the interface more +** organized and understandable, and it also helps the resulting code to +** run a little faster by using fewer registers for parameter passing. +*/ +struct BtreePayload { + const void *pKey; /* Key content for indexes. NULL for tables */ + sqlite3_int64 nKey; /* Size of pKey for indexes. PRIMARY KEY for tabs */ + const void *pData; /* Data for tables. NULL for indexes */ + int nData; /* Size of pData. 0 if none. */ + int nZero; /* Extra zero data appended after pData,nData */ +}; + +SQLITE_PRIVATE int sqlite3BtreeInsert(BtCursor*, const BtreePayload *pPayload, + int bias, int seekResult); +SQLITE_PRIVATE int sqlite3BtreeFirst(BtCursor*, int *pRes); +SQLITE_PRIVATE int sqlite3BtreeLast(BtCursor*, int *pRes); +SQLITE_PRIVATE int sqlite3BtreeNext(BtCursor*, int *pRes); +SQLITE_PRIVATE int sqlite3BtreeEof(BtCursor*); +SQLITE_PRIVATE int sqlite3BtreePrevious(BtCursor*, int *pRes); +SQLITE_PRIVATE i64 sqlite3BtreeIntegerKey(BtCursor*); +SQLITE_PRIVATE int sqlite3BtreeKey(BtCursor*, u32 offset, u32 amt, void*); +SQLITE_PRIVATE const void *sqlite3BtreePayloadFetch(BtCursor*, u32 *pAmt); +SQLITE_PRIVATE u32 sqlite3BtreePayloadSize(BtCursor*); +SQLITE_PRIVATE int sqlite3BtreeData(BtCursor*, u32 offset, u32 amt, void*); + +SQLITE_PRIVATE char *sqlite3BtreeIntegrityCheck(Btree*, int *aRoot, int nRoot, int, int*); +SQLITE_PRIVATE struct Pager *sqlite3BtreePager(Btree*); + +#ifndef SQLITE_OMIT_INCRBLOB +SQLITE_PRIVATE int sqlite3BtreePutData(BtCursor*, u32 offset, u32 amt, void*); +SQLITE_PRIVATE void sqlite3BtreeIncrblobCursor(BtCursor *); +#endif +SQLITE_PRIVATE void sqlite3BtreeClearCursor(BtCursor *); +SQLITE_PRIVATE int sqlite3BtreeSetVersion(Btree *pBt, int iVersion); +SQLITE_PRIVATE int sqlite3BtreeCursorHasHint(BtCursor*, unsigned int mask); +SQLITE_PRIVATE int sqlite3BtreeIsReadonly(Btree *pBt); +SQLITE_PRIVATE int sqlite3HeaderSizeBtree(void); + +#ifndef NDEBUG +SQLITE_PRIVATE int sqlite3BtreeCursorIsValid(BtCursor*); +#endif + +#ifndef SQLITE_OMIT_BTREECOUNT +SQLITE_PRIVATE int sqlite3BtreeCount(BtCursor *, i64 *); +#endif + +#ifdef SQLITE_TEST +SQLITE_PRIVATE int sqlite3BtreeCursorInfo(BtCursor*, int*, int); +SQLITE_PRIVATE void sqlite3BtreeCursorList(Btree*); +#endif + +#ifndef SQLITE_OMIT_WAL +SQLITE_PRIVATE int sqlite3BtreeCheckpoint(Btree*, int, int *, int *); +#endif + +/* +** If we are not using shared cache, then there is no need to +** use mutexes to access the BtShared structures. So make the +** Enter and Leave procedures no-ops. +*/ +#ifndef SQLITE_OMIT_SHARED_CACHE +SQLITE_PRIVATE void sqlite3BtreeEnter(Btree*); +SQLITE_PRIVATE void sqlite3BtreeEnterAll(sqlite3*); +SQLITE_PRIVATE int sqlite3BtreeSharable(Btree*); +SQLITE_PRIVATE void sqlite3BtreeEnterCursor(BtCursor*); +SQLITE_PRIVATE int sqlite3BtreeConnectionCount(Btree*); +#else +# define sqlite3BtreeEnter(X) +# define sqlite3BtreeEnterAll(X) +# define sqlite3BtreeSharable(X) 0 +# define sqlite3BtreeEnterCursor(X) +# define sqlite3BtreeConnectionCount(X) 1 +#endif + +#if !defined(SQLITE_OMIT_SHARED_CACHE) && SQLITE_THREADSAFE +SQLITE_PRIVATE void sqlite3BtreeLeave(Btree*); +SQLITE_PRIVATE void sqlite3BtreeLeaveCursor(BtCursor*); +SQLITE_PRIVATE void sqlite3BtreeLeaveAll(sqlite3*); +#ifndef NDEBUG + /* These routines are used inside assert() statements only. */ +SQLITE_PRIVATE int sqlite3BtreeHoldsMutex(Btree*); +SQLITE_PRIVATE int sqlite3BtreeHoldsAllMutexes(sqlite3*); +SQLITE_PRIVATE int sqlite3SchemaMutexHeld(sqlite3*,int,Schema*); +#endif +#else + +# define sqlite3BtreeLeave(X) +# define sqlite3BtreeLeaveCursor(X) +# define sqlite3BtreeLeaveAll(X) + +# define sqlite3BtreeHoldsMutex(X) 1 +# define sqlite3BtreeHoldsAllMutexes(X) 1 +# define sqlite3SchemaMutexHeld(X,Y,Z) 1 +#endif + + +#endif /* SQLITE_BTREE_H */ + +/************** End of btree.h ***********************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ +/************** Include vdbe.h in the middle of sqliteInt.h ******************/ +/************** Begin file vdbe.h ********************************************/ +/* +** 2001 September 15 +** +** 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. +** +************************************************************************* +** Header file for the Virtual DataBase Engine (VDBE) +** +** 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. +*/ +#ifndef SQLITE_VDBE_H +#define SQLITE_VDBE_H +/* #include */ + +/* +** A single VDBE is an opaque structure named "Vdbe". Only routines +** in the source file sqliteVdbe.c are allowed to see the insides +** of this structure. +*/ +typedef struct Vdbe Vdbe; + +/* +** The names of the following types declared in vdbeInt.h are required +** for the VdbeOp definition. +*/ +typedef struct Mem Mem; +typedef struct SubProgram SubProgram; + +/* +** A single instruction of the virtual machine has an opcode +** and as many as three operands. The instruction is recorded +** as an instance of the following structure: +*/ +struct VdbeOp { + u8 opcode; /* What operation to perform */ + signed char p4type; /* One of the P4_xxx constants for p4 */ + u8 notUsed1; + u8 p5; /* Fifth parameter is an unsigned character */ + int p1; /* First operand */ + int p2; /* Second parameter (often the jump destination) */ + int p3; /* The third parameter */ + union p4union { /* fourth parameter */ + int i; /* Integer value if p4type==P4_INT32 */ + void *p; /* Generic pointer */ + char *z; /* Pointer to data for string (char array) types */ + i64 *pI64; /* Used when p4type is P4_INT64 */ + double *pReal; /* Used when p4type is P4_REAL */ + FuncDef *pFunc; /* Used when p4type is P4_FUNCDEF */ + sqlite3_context *pCtx; /* Used when p4type is P4_FUNCCTX */ + CollSeq *pColl; /* Used when p4type is P4_COLLSEQ */ + Mem *pMem; /* Used when p4type is P4_MEM */ + VTable *pVtab; /* Used when p4type is P4_VTAB */ + KeyInfo *pKeyInfo; /* Used when p4type is P4_KEYINFO */ + int *ai; /* Used when p4type is P4_INTARRAY */ + SubProgram *pProgram; /* Used when p4type is P4_SUBPROGRAM */ + Table *pTab; /* Used when p4type is P4_TABLE */ +#ifdef SQLITE_ENABLE_CURSOR_HINTS + Expr *pExpr; /* Used when p4type is P4_EXPR */ +#endif + int (*xAdvance)(BtCursor *, int *); + } p4; +#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS + char *zComment; /* Comment to improve readability */ +#endif +#ifdef VDBE_PROFILE + u32 cnt; /* Number of times this instruction was executed */ + u64 cycles; /* Total time spent executing this instruction */ +#endif +#ifdef SQLITE_VDBE_COVERAGE + int iSrcLine; /* Source-code line that generated this opcode */ +#endif +}; +typedef struct VdbeOp VdbeOp; + + +/* +** A sub-routine used to implement a trigger program. +*/ +struct SubProgram { + VdbeOp *aOp; /* Array of opcodes for sub-program */ + int nOp; /* Elements in aOp[] */ + int nMem; /* Number of memory cells required */ + int nCsr; /* Number of cursors required */ + void *token; /* id that may be used to recursive triggers */ + SubProgram *pNext; /* Next sub-program already visited */ +}; + +/* +** A smaller version of VdbeOp used for the VdbeAddOpList() function because +** it takes up less space. +*/ +struct VdbeOpList { + u8 opcode; /* What operation to perform */ + signed char p1; /* First operand */ + signed char p2; /* Second parameter (often the jump destination) */ + signed char p3; /* Third parameter */ +}; +typedef struct VdbeOpList VdbeOpList; + +/* +** Allowed values of VdbeOp.p4type +*/ +#define P4_NOTUSED 0 /* The P4 parameter is not used */ +#define P4_DYNAMIC (-1) /* Pointer to a string obtained from sqliteMalloc() */ +#define P4_STATIC (-2) /* Pointer to a static string */ +#define P4_COLLSEQ (-4) /* P4 is a pointer to a CollSeq structure */ +#define P4_FUNCDEF (-5) /* P4 is a pointer to a FuncDef structure */ +#define P4_KEYINFO (-6) /* P4 is a pointer to a KeyInfo structure */ +#define P4_EXPR (-7) /* P4 is a pointer to an Expr tree */ +#define P4_MEM (-8) /* P4 is a pointer to a Mem* structure */ +#define P4_TRANSIENT 0 /* P4 is a pointer to a transient string */ +#define P4_VTAB (-10) /* P4 is a pointer to an sqlite3_vtab structure */ +#define P4_MPRINTF (-11) /* P4 is a string obtained from sqlite3_mprintf() */ +#define P4_REAL (-12) /* P4 is a 64-bit floating point value */ +#define P4_INT64 (-13) /* P4 is a 64-bit signed integer */ +#define P4_INT32 (-14) /* P4 is a 32-bit signed integer */ +#define P4_INTARRAY (-15) /* P4 is a vector of 32-bit integers */ +#define P4_SUBPROGRAM (-18) /* P4 is a pointer to a SubProgram structure */ +#define P4_ADVANCE (-19) /* P4 is a pointer to BtreeNext() or BtreePrev() */ +#define P4_TABLE (-20) /* P4 is a pointer to a Table structure */ +#define P4_FUNCCTX (-21) /* P4 is a pointer to an sqlite3_context object */ + +/* Error message codes for OP_Halt */ +#define P5_ConstraintNotNull 1 +#define P5_ConstraintUnique 2 +#define P5_ConstraintCheck 3 +#define P5_ConstraintFK 4 + +/* +** The Vdbe.aColName array contains 5n Mem structures, where n is the +** number of columns of data returned by the statement. +*/ +#define COLNAME_NAME 0 +#define COLNAME_DECLTYPE 1 +#define COLNAME_DATABASE 2 +#define COLNAME_TABLE 3 +#define COLNAME_COLUMN 4 +#ifdef SQLITE_ENABLE_COLUMN_METADATA +# define COLNAME_N 5 /* Number of COLNAME_xxx symbols */ +#else +# ifdef SQLITE_OMIT_DECLTYPE +# define COLNAME_N 1 /* Store only the name */ +# else +# define COLNAME_N 2 /* Store the name and decltype */ +# endif +#endif + +/* +** The following macro converts a relative address in the p2 field +** of a VdbeOp structure into a negative number so that +** sqlite3VdbeAddOpList() knows that the address is relative. Calling +** the macro again restores the address. +*/ +#define ADDR(X) (-1-(X)) + +/* +** The makefile scans the vdbe.c source file and creates the "opcodes.h" +** header file that defines a number for each opcode used by the VDBE. +*/ +/************** Include opcodes.h in the middle of vdbe.h ********************/ +/************** Begin file opcodes.h *****************************************/ +/* Automatically generated. Do not edit */ +/* See the tool/mkopcodeh.tcl script for details */ +#define OP_Savepoint 0 +#define OP_AutoCommit 1 +#define OP_Transaction 2 +#define OP_SorterNext 3 +#define OP_PrevIfOpen 4 +#define OP_NextIfOpen 5 +#define OP_Prev 6 +#define OP_Next 7 +#define OP_Checkpoint 8 +#define OP_JournalMode 9 +#define OP_Vacuum 10 +#define OP_VFilter 11 /* synopsis: iplan=r[P3] zplan='P4' */ +#define OP_VUpdate 12 /* synopsis: data=r[P3@P2] */ +#define OP_Goto 13 +#define OP_Gosub 14 +#define OP_InitCoroutine 15 +#define OP_Yield 16 +#define OP_MustBeInt 17 +#define OP_Jump 18 +#define OP_Not 19 /* same as TK_NOT, synopsis: r[P2]= !r[P1] */ +#define OP_Once 20 +#define OP_If 21 +#define OP_IfNot 22 +#define OP_SeekLT 23 /* synopsis: key=r[P3@P4] */ +#define OP_SeekLE 24 /* synopsis: key=r[P3@P4] */ +#define OP_SeekGE 25 /* synopsis: key=r[P3@P4] */ +#define OP_SeekGT 26 /* synopsis: key=r[P3@P4] */ +#define OP_Or 27 /* same as TK_OR, synopsis: r[P3]=(r[P1] || r[P2]) */ +#define OP_And 28 /* same as TK_AND, synopsis: r[P3]=(r[P1] && r[P2]) */ +#define OP_NoConflict 29 /* synopsis: key=r[P3@P4] */ +#define OP_NotFound 30 /* synopsis: key=r[P3@P4] */ +#define OP_Found 31 /* synopsis: key=r[P3@P4] */ +#define OP_SeekRowid 32 /* synopsis: intkey=r[P3] */ +#define OP_NotExists 33 /* synopsis: intkey=r[P3] */ +#define OP_IsNull 34 /* same as TK_ISNULL, synopsis: if r[P1]==NULL goto P2 */ +#define OP_NotNull 35 /* same as TK_NOTNULL, synopsis: if r[P1]!=NULL goto P2 */ +#define OP_Ne 36 /* same as TK_NE, synopsis: IF r[P3]!=r[P1] */ +#define OP_Eq 37 /* same as TK_EQ, synopsis: IF r[P3]==r[P1] */ +#define OP_Gt 38 /* same as TK_GT, synopsis: IF r[P3]>r[P1] */ +#define OP_Le 39 /* same as TK_LE, synopsis: IF r[P3]<=r[P1] */ +#define OP_Lt 40 /* same as TK_LT, synopsis: IF r[P3]=r[P1] */ +#define OP_ElseNotEq 42 /* same as TK_ESCAPE */ +#define OP_BitAnd 43 /* same as TK_BITAND, synopsis: r[P3]=r[P1]&r[P2] */ +#define OP_BitOr 44 /* same as TK_BITOR, synopsis: r[P3]=r[P1]|r[P2] */ +#define OP_ShiftLeft 45 /* same as TK_LSHIFT, synopsis: r[P3]=r[P2]<>r[P1] */ +#define OP_Add 47 /* same as TK_PLUS, synopsis: r[P3]=r[P1]+r[P2] */ +#define OP_Subtract 48 /* same as TK_MINUS, synopsis: r[P3]=r[P2]-r[P1] */ +#define OP_Multiply 49 /* same as TK_STAR, synopsis: r[P3]=r[P1]*r[P2] */ +#define OP_Divide 50 /* same as TK_SLASH, synopsis: r[P3]=r[P2]/r[P1] */ +#define OP_Remainder 51 /* same as TK_REM, synopsis: r[P3]=r[P2]%r[P1] */ +#define OP_Concat 52 /* same as TK_CONCAT, synopsis: r[P3]=r[P2]+r[P1] */ +#define OP_Last 53 +#define OP_BitNot 54 /* same as TK_BITNOT, synopsis: r[P1]= ~r[P1] */ +#define OP_SorterSort 55 +#define OP_Sort 56 +#define OP_Rewind 57 +#define OP_IdxLE 58 /* synopsis: key=r[P3@P4] */ +#define OP_IdxGT 59 /* synopsis: key=r[P3@P4] */ +#define OP_IdxLT 60 /* synopsis: key=r[P3@P4] */ +#define OP_IdxGE 61 /* synopsis: key=r[P3@P4] */ +#define OP_RowSetRead 62 /* synopsis: r[P3]=rowset(P1) */ +#define OP_RowSetTest 63 /* synopsis: if r[P3] in rowset(P1) goto P2 */ +#define OP_Program 64 +#define OP_FkIfZero 65 /* synopsis: if fkctr[P1]==0 goto P2 */ +#define OP_IfPos 66 /* synopsis: if r[P1]>0 then r[P1]-=P3, goto P2 */ +#define OP_IfNotZero 67 /* synopsis: if r[P1]!=0 then r[P1]-=P3, goto P2 */ +#define OP_DecrJumpZero 68 /* synopsis: if (--r[P1])==0 goto P2 */ +#define OP_IncrVacuum 69 +#define OP_VNext 70 +#define OP_Init 71 /* synopsis: Start at P2 */ +#define OP_Return 72 +#define OP_EndCoroutine 73 +#define OP_HaltIfNull 74 /* synopsis: if r[P3]=null halt */ +#define OP_Halt 75 +#define OP_Integer 76 /* synopsis: r[P2]=P1 */ +#define OP_Int64 77 /* synopsis: r[P2]=P4 */ +#define OP_String 78 /* synopsis: r[P2]='P4' (len=P1) */ +#define OP_Null 79 /* synopsis: r[P2..P3]=NULL */ +#define OP_SoftNull 80 /* synopsis: r[P1]=NULL */ +#define OP_Blob 81 /* synopsis: r[P2]=P4 (len=P1) */ +#define OP_Variable 82 /* synopsis: r[P2]=parameter(P1,P4) */ +#define OP_Move 83 /* synopsis: r[P2@P3]=r[P1@P3] */ +#define OP_Copy 84 /* synopsis: r[P2@P3+1]=r[P1@P3+1] */ +#define OP_SCopy 85 /* synopsis: r[P2]=r[P1] */ +#define OP_IntCopy 86 /* synopsis: r[P2]=r[P1] */ +#define OP_ResultRow 87 /* synopsis: output=r[P1@P2] */ +#define OP_CollSeq 88 +#define OP_Function0 89 /* synopsis: r[P3]=func(r[P2@P5]) */ +#define OP_Function 90 /* synopsis: r[P3]=func(r[P2@P5]) */ +#define OP_AddImm 91 /* synopsis: r[P1]=r[P1]+P2 */ +#define OP_RealAffinity 92 +#define OP_Cast 93 /* synopsis: affinity(r[P1]) */ +#define OP_Permutation 94 +#define OP_Compare 95 /* synopsis: r[P1@P3] <-> r[P2@P3] */ +#define OP_Column 96 /* synopsis: r[P3]=PX */ +#define OP_String8 97 /* same as TK_STRING, synopsis: r[P2]='P4' */ +#define OP_Affinity 98 /* synopsis: affinity(r[P1@P2]) */ +#define OP_MakeRecord 99 /* synopsis: r[P3]=mkrec(r[P1@P2]) */ +#define OP_Count 100 /* synopsis: r[P2]=count() */ +#define OP_ReadCookie 101 +#define OP_SetCookie 102 +#define OP_ReopenIdx 103 /* synopsis: root=P2 iDb=P3 */ +#define OP_OpenRead 104 /* synopsis: root=P2 iDb=P3 */ +#define OP_OpenWrite 105 /* synopsis: root=P2 iDb=P3 */ +#define OP_OpenAutoindex 106 /* synopsis: nColumn=P2 */ +#define OP_OpenEphemeral 107 /* synopsis: nColumn=P2 */ +#define OP_SorterOpen 108 +#define OP_SequenceTest 109 /* synopsis: if( cursor[P1].ctr++ ) pc = P2 */ +#define OP_OpenPseudo 110 /* synopsis: P3 columns in r[P2] */ +#define OP_Close 111 +#define OP_ColumnsUsed 112 +#define OP_Sequence 113 /* synopsis: r[P2]=cursor[P1].ctr++ */ +#define OP_NewRowid 114 /* synopsis: r[P2]=rowid */ +#define OP_Insert 115 /* synopsis: intkey=r[P3] data=r[P2] */ +#define OP_InsertInt 116 /* synopsis: intkey=P3 data=r[P2] */ +#define OP_Delete 117 +#define OP_ResetCount 118 +#define OP_SorterCompare 119 /* synopsis: if key(P1)!=trim(r[P3],P4) goto P2 */ +#define OP_SorterData 120 /* synopsis: r[P2]=data */ +#define OP_RowKey 121 /* synopsis: r[P2]=key */ +#define OP_RowData 122 /* synopsis: r[P2]=data */ +#define OP_Rowid 123 /* synopsis: r[P2]=rowid */ +#define OP_NullRow 124 +#define OP_SorterInsert 125 +#define OP_IdxInsert 126 /* synopsis: key=r[P2] */ +#define OP_IdxDelete 127 /* synopsis: key=r[P2@P3] */ +#define OP_Seek 128 /* synopsis: Move P3 to P1.rowid */ +#define OP_IdxRowid 129 /* synopsis: r[P2]=rowid */ +#define OP_Destroy 130 +#define OP_Clear 131 +#define OP_Real 132 /* same as TK_FLOAT, synopsis: r[P2]=P4 */ +#define OP_ResetSorter 133 +#define OP_CreateIndex 134 /* synopsis: r[P2]=root iDb=P1 */ +#define OP_CreateTable 135 /* synopsis: r[P2]=root iDb=P1 */ +#define OP_ParseSchema 136 +#define OP_LoadAnalysis 137 +#define OP_DropTable 138 +#define OP_DropIndex 139 +#define OP_DropTrigger 140 +#define OP_IntegrityCk 141 +#define OP_RowSetAdd 142 /* synopsis: rowset(P1)=r[P2] */ +#define OP_Param 143 +#define OP_FkCounter 144 /* synopsis: fkctr[P1]+=P2 */ +#define OP_MemMax 145 /* synopsis: r[P1]=max(r[P1],r[P2]) */ +#define OP_OffsetLimit 146 /* synopsis: if r[P1]>0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1) */ +#define OP_AggStep0 147 /* synopsis: accum=r[P3] step(r[P2@P5]) */ +#define OP_AggStep 148 /* synopsis: accum=r[P3] step(r[P2@P5]) */ +#define OP_AggFinal 149 /* synopsis: accum=r[P1] N=P2 */ +#define OP_Expire 150 +#define OP_TableLock 151 /* synopsis: iDb=P1 root=P2 write=P3 */ +#define OP_VBegin 152 +#define OP_VCreate 153 +#define OP_VDestroy 154 +#define OP_VOpen 155 +#define OP_VColumn 156 /* synopsis: r[P3]=vcolumn(P2) */ +#define OP_VRename 157 +#define OP_Pagecount 158 +#define OP_MaxPgcnt 159 +#define OP_CursorHint 160 +#define OP_Noop 161 +#define OP_Explain 162 + +/* Properties such as "out2" or "jump" that are specified in +** comments following the "case" for each opcode in the vdbe.c +** are encoded into bitvectors as follows: +*/ +#define OPFLG_JUMP 0x01 /* jump: P2 holds jmp target */ +#define OPFLG_IN1 0x02 /* in1: P1 is an input */ +#define OPFLG_IN2 0x04 /* in2: P2 is an input */ +#define OPFLG_IN3 0x08 /* in3: P3 is an input */ +#define OPFLG_OUT2 0x10 /* out2: P2 is an output */ +#define OPFLG_OUT3 0x20 /* out3: P3 is an output */ +#define OPFLG_INITIALIZER {\ +/* 0 */ 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01,\ +/* 8 */ 0x00, 0x10, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01,\ +/* 16 */ 0x03, 0x03, 0x01, 0x12, 0x01, 0x03, 0x03, 0x09,\ +/* 24 */ 0x09, 0x09, 0x09, 0x26, 0x26, 0x09, 0x09, 0x09,\ +/* 32 */ 0x09, 0x09, 0x03, 0x03, 0x0b, 0x0b, 0x0b, 0x0b,\ +/* 40 */ 0x0b, 0x0b, 0x01, 0x26, 0x26, 0x26, 0x26, 0x26,\ +/* 48 */ 0x26, 0x26, 0x26, 0x26, 0x26, 0x01, 0x12, 0x01,\ +/* 56 */ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x23, 0x0b,\ +/* 64 */ 0x01, 0x01, 0x03, 0x03, 0x03, 0x01, 0x01, 0x01,\ +/* 72 */ 0x02, 0x02, 0x08, 0x00, 0x10, 0x10, 0x10, 0x10,\ +/* 80 */ 0x00, 0x10, 0x10, 0x00, 0x00, 0x10, 0x10, 0x00,\ +/* 88 */ 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00,\ +/* 96 */ 0x00, 0x10, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00,\ +/* 104 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ +/* 112 */ 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,\ +/* 120 */ 0x00, 0x00, 0x00, 0x10, 0x00, 0x04, 0x04, 0x00,\ +/* 128 */ 0x00, 0x10, 0x10, 0x00, 0x10, 0x00, 0x10, 0x10,\ +/* 136 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x10,\ +/* 144 */ 0x00, 0x04, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00,\ +/* 152 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10,\ +/* 160 */ 0x00, 0x00, 0x00,} + +/* The sqlite3P2Values() routine is able to run faster if it knows +** the value of the largest JUMP opcode. The smaller the maximum +** JUMP opcode the better, so the mkopcodeh.tcl script that +** generated this include file strives to group all JUMP opcodes +** together near the beginning of the list. +*/ +#define SQLITE_MX_JUMP_OPCODE 71 /* Maximum JUMP opcode */ + +/************** End of opcodes.h *********************************************/ +/************** Continuing where we left off in vdbe.h ***********************/ + +/* +** Prototypes for the VDBE interface. See comments on the implementation +** for a description of what each of these routines does. +*/ +SQLITE_PRIVATE Vdbe *sqlite3VdbeCreate(Parse*); +SQLITE_PRIVATE int sqlite3VdbeAddOp0(Vdbe*,int); +SQLITE_PRIVATE int sqlite3VdbeAddOp1(Vdbe*,int,int); +SQLITE_PRIVATE int sqlite3VdbeAddOp2(Vdbe*,int,int,int); +SQLITE_PRIVATE int sqlite3VdbeGoto(Vdbe*,int); +SQLITE_PRIVATE int sqlite3VdbeLoadString(Vdbe*,int,const char*); +SQLITE_PRIVATE void sqlite3VdbeMultiLoad(Vdbe*,int,const char*,...); +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 sqlite3VdbeAddOp4Dup8(Vdbe*,int,int,int,int,const u8*,int); +SQLITE_PRIVATE int sqlite3VdbeAddOp4Int(Vdbe*,int,int,int,int,int); +SQLITE_PRIVATE void sqlite3VdbeEndCoroutine(Vdbe*,int); +#if defined(SQLITE_DEBUG) && !defined(SQLITE_TEST_REALLOC_STRESS) +SQLITE_PRIVATE void sqlite3VdbeVerifyNoMallocRequired(Vdbe *p, int N); +#else +# define sqlite3VdbeVerifyNoMallocRequired(A,B) +#endif +SQLITE_PRIVATE VdbeOp *sqlite3VdbeAddOpList(Vdbe*, int nOp, VdbeOpList const *aOp, int iLineno); +SQLITE_PRIVATE void sqlite3VdbeAddParseSchemaOp(Vdbe*,int,char*); +SQLITE_PRIVATE void sqlite3VdbeChangeOpcode(Vdbe*, u32 addr, u8); +SQLITE_PRIVATE void sqlite3VdbeChangeP1(Vdbe*, u32 addr, int P1); +SQLITE_PRIVATE void sqlite3VdbeChangeP2(Vdbe*, u32 addr, int P2); +SQLITE_PRIVATE void sqlite3VdbeChangeP3(Vdbe*, u32 addr, int P3); +SQLITE_PRIVATE void sqlite3VdbeChangeP5(Vdbe*, u8 P5); +SQLITE_PRIVATE void sqlite3VdbeJumpHere(Vdbe*, int addr); +SQLITE_PRIVATE int sqlite3VdbeChangeToNoop(Vdbe*, int addr); +SQLITE_PRIVATE int sqlite3VdbeDeletePriorOpcode(Vdbe*, u8 op); +SQLITE_PRIVATE void sqlite3VdbeChangeP4(Vdbe*, int addr, const char *zP4, int N); +SQLITE_PRIVATE void sqlite3VdbeSetP4KeyInfo(Parse*, Index*); +SQLITE_PRIVATE void sqlite3VdbeUsesBtree(Vdbe*, int); +SQLITE_PRIVATE VdbeOp *sqlite3VdbeGetOp(Vdbe*, int); +SQLITE_PRIVATE int sqlite3VdbeMakeLabel(Vdbe*); +SQLITE_PRIVATE void sqlite3VdbeRunOnlyOnce(Vdbe*); +SQLITE_PRIVATE void sqlite3VdbeReusable(Vdbe*); +SQLITE_PRIVATE void sqlite3VdbeDelete(Vdbe*); +SQLITE_PRIVATE void sqlite3VdbeClearObject(sqlite3*,Vdbe*); +SQLITE_PRIVATE void sqlite3VdbeMakeReady(Vdbe*,Parse*); +SQLITE_PRIVATE int sqlite3VdbeFinalize(Vdbe*); +SQLITE_PRIVATE void sqlite3VdbeResolveLabel(Vdbe*, int); +SQLITE_PRIVATE int sqlite3VdbeCurrentAddr(Vdbe*); +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE int sqlite3VdbeAssertMayAbort(Vdbe *, int); +#endif +SQLITE_PRIVATE void sqlite3VdbeResetStepResult(Vdbe*); +SQLITE_PRIVATE void sqlite3VdbeRewind(Vdbe*); +SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe*); +SQLITE_PRIVATE void sqlite3VdbeSetNumCols(Vdbe*,int); +SQLITE_PRIVATE int sqlite3VdbeSetColName(Vdbe*, int, int, const char *, void(*)(void*)); +SQLITE_PRIVATE void sqlite3VdbeCountChanges(Vdbe*); +SQLITE_PRIVATE sqlite3 *sqlite3VdbeDb(Vdbe*); +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 sqlite3_value *sqlite3VdbeGetBoundValue(Vdbe*, int, u8); +SQLITE_PRIVATE void sqlite3VdbeSetVarmask(Vdbe*, int); +#ifndef SQLITE_OMIT_TRACE +SQLITE_PRIVATE char *sqlite3VdbeExpandSql(Vdbe*, const char*); +#endif +SQLITE_PRIVATE int sqlite3MemCompare(const Mem*, const Mem*, const CollSeq*); + +SQLITE_PRIVATE void sqlite3VdbeRecordUnpack(KeyInfo*,int,const void*,UnpackedRecord*); +SQLITE_PRIVATE int sqlite3VdbeRecordCompare(int,const void*,UnpackedRecord*); +SQLITE_PRIVATE int sqlite3VdbeRecordCompareWithSkip(int, const void *, UnpackedRecord *, int); +SQLITE_PRIVATE UnpackedRecord *sqlite3VdbeAllocUnpackedRecord(KeyInfo *, char *, int, char **); + +typedef int (*RecordCompare)(int,const void*,UnpackedRecord*); +SQLITE_PRIVATE RecordCompare sqlite3VdbeFindCompare(UnpackedRecord*); + +#ifndef SQLITE_OMIT_TRIGGER +SQLITE_PRIVATE void sqlite3VdbeLinkSubProgram(Vdbe *, SubProgram *); +#endif + +/* Use SQLITE_ENABLE_COMMENTS to enable generation of extra comments on +** each VDBE opcode. +** +** Use the SQLITE_ENABLE_MODULE_COMMENTS macro to see some extra no-op +** comments in VDBE programs that show key decision points in the code +** generator. +*/ +#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS +SQLITE_PRIVATE void sqlite3VdbeComment(Vdbe*, const char*, ...); +# define VdbeComment(X) sqlite3VdbeComment X +SQLITE_PRIVATE void sqlite3VdbeNoopComment(Vdbe*, const char*, ...); +# define VdbeNoopComment(X) sqlite3VdbeNoopComment X +# ifdef SQLITE_ENABLE_MODULE_COMMENTS +# define VdbeModuleComment(X) sqlite3VdbeNoopComment X +# else +# define VdbeModuleComment(X) +# endif +#else +# define VdbeComment(X) +# define VdbeNoopComment(X) +# define VdbeModuleComment(X) +#endif + +/* +** The VdbeCoverage macros are used to set a coverage testing point +** for VDBE branch instructions. The coverage testing points are line +** numbers in the sqlite3.c source file. VDBE branch coverage testing +** only works with an amalagmation build. That's ok since a VDBE branch +** coverage build designed for testing the test suite only. No application +** should ever ship with VDBE branch coverage measuring turned on. +** +** VdbeCoverage(v) // Mark the previously coded instruction +** // as a branch +** +** VdbeCoverageIf(v, conditional) // Mark previous if conditional true +** +** VdbeCoverageAlwaysTaken(v) // Previous branch is always taken +** +** VdbeCoverageNeverTaken(v) // Previous branch is never taken +** +** Every VDBE branch operation must be tagged with one of the macros above. +** If not, then when "make test" is run with -DSQLITE_VDBE_COVERAGE and +** -DSQLITE_DEBUG then an ALWAYS() will fail in the vdbeTakeBranch() +** routine in vdbe.c, alerting the developer to the missed tag. +*/ +#ifdef SQLITE_VDBE_COVERAGE +SQLITE_PRIVATE void sqlite3VdbeSetLineNumber(Vdbe*,int); +# define VdbeCoverage(v) sqlite3VdbeSetLineNumber(v,__LINE__) +# define VdbeCoverageIf(v,x) if(x)sqlite3VdbeSetLineNumber(v,__LINE__) +# define VdbeCoverageAlwaysTaken(v) sqlite3VdbeSetLineNumber(v,2); +# define VdbeCoverageNeverTaken(v) sqlite3VdbeSetLineNumber(v,1); +# define VDBE_OFFSET_LINENO(x) (__LINE__+x) +#else +# define VdbeCoverage(v) +# define VdbeCoverageIf(v,x) +# define VdbeCoverageAlwaysTaken(v) +# define VdbeCoverageNeverTaken(v) +# define VDBE_OFFSET_LINENO(x) 0 +#endif + +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS +SQLITE_PRIVATE void sqlite3VdbeScanStatus(Vdbe*, int, int, int, LogEst, const char*); +#else +# define sqlite3VdbeScanStatus(a,b,c,d,e) +#endif + +#endif /* SQLITE_VDBE_H */ + +/************** End of vdbe.h ************************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ +/************** Include pager.h in the middle of sqliteInt.h *****************/ +/************** Begin file pager.h *******************************************/ +/* +** 2001 September 15 +** +** 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 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. +*/ + +#ifndef SQLITE_PAGER_H +#define SQLITE_PAGER_H + +/* +** Default maximum size for persistent journal files. A negative +** value means no limit. This value may be overridden using the +** sqlite3PagerJournalSizeLimit() API. See also "PRAGMA journal_size_limit". +*/ +#ifndef SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT + #define SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT -1 +#endif + +/* +** The type used to represent a page number. The first page in a file +** is called page 1. 0 is used to represent "not a page". +*/ +typedef u32 Pgno; + +/* +** Each open file is managed by a separate instance of the "Pager" structure. +*/ +typedef struct Pager Pager; + +/* +** Handle type for pages. +*/ +typedef struct PgHdr DbPage; + +/* +** Page number PAGER_MJ_PGNO is never used in an SQLite database (it is +** reserved for working around a windows/posix incompatibility). It is +** used in the journal to signify that the remainder of the journal file +** is devoted to storing a master journal name - there are no more pages to +** roll back. See comments for function writeMasterJournal() in pager.c +** for details. +*/ +#define PAGER_MJ_PGNO(x) ((Pgno)((PENDING_BYTE/((x)->pageSize))+1)) + +/* +** Allowed values for the flags parameter to sqlite3PagerOpen(). +** +** NOTE: These values must match the corresponding BTREE_ values in btree.h. +*/ +#define PAGER_OMIT_JOURNAL 0x0001 /* Do not use a rollback journal */ +#define PAGER_MEMORY 0x0002 /* In-memory database */ + +/* +** Valid values for the second argument to sqlite3PagerLockingMode(). +*/ +#define PAGER_LOCKINGMODE_QUERY -1 +#define PAGER_LOCKINGMODE_NORMAL 0 +#define PAGER_LOCKINGMODE_EXCLUSIVE 1 + +/* +** Numeric constants that encode the journalmode. +** +** The numeric values encoded here (other than PAGER_JOURNALMODE_QUERY) +** are exposed in the API via the "PRAGMA journal_mode" command and +** therefore cannot be changed without a compatibility break. +*/ +#define PAGER_JOURNALMODE_QUERY (-1) /* Query the value of journalmode */ +#define PAGER_JOURNALMODE_DELETE 0 /* Commit by deleting journal file */ +#define PAGER_JOURNALMODE_PERSIST 1 /* Commit by zeroing journal header */ +#define PAGER_JOURNALMODE_OFF 2 /* Journal omitted. */ +#define PAGER_JOURNALMODE_TRUNCATE 3 /* Commit by truncating journal */ +#define PAGER_JOURNALMODE_MEMORY 4 /* In-memory journal file */ +#define PAGER_JOURNALMODE_WAL 5 /* Use write-ahead logging */ + +/* +** Flags that make up the mask passed to sqlite3PagerGet(). +*/ +#define PAGER_GET_NOCONTENT 0x01 /* Do not load data from disk */ +#define PAGER_GET_READONLY 0x02 /* Read-only page is acceptable */ + +/* +** Flags for sqlite3PagerSetFlags() +** +** Value constraints (enforced via assert()): +** PAGER_FULLFSYNC == SQLITE_FullFSync +** PAGER_CKPT_FULLFSYNC == SQLITE_CkptFullFSync +** PAGER_CACHE_SPILL == SQLITE_CacheSpill +*/ +#define PAGER_SYNCHRONOUS_OFF 0x01 /* PRAGMA synchronous=OFF */ +#define PAGER_SYNCHRONOUS_NORMAL 0x02 /* PRAGMA synchronous=NORMAL */ +#define PAGER_SYNCHRONOUS_FULL 0x03 /* PRAGMA synchronous=FULL */ +#define PAGER_SYNCHRONOUS_EXTRA 0x04 /* PRAGMA synchronous=EXTRA */ +#define PAGER_SYNCHRONOUS_MASK 0x07 /* Mask for four values above */ +#define PAGER_FULLFSYNC 0x08 /* PRAGMA fullfsync=ON */ +#define PAGER_CKPT_FULLFSYNC 0x10 /* PRAGMA checkpoint_fullfsync=ON */ +#define PAGER_CACHESPILL 0x20 /* PRAGMA cache_spill=ON */ +#define PAGER_FLAGS_MASK 0x38 /* All above except SYNCHRONOUS */ + +/* +** The remainder of this file contains the declarations of the functions +** that make up the Pager sub-system API. See source code comments for +** a detailed description of each routine. +*/ + +/* Open and close a Pager connection. */ +SQLITE_PRIVATE int sqlite3PagerOpen( + sqlite3_vfs*, + Pager **ppPager, + const char*, + int, + int, + int, + void(*)(DbPage*) +); +SQLITE_PRIVATE int sqlite3PagerClose(Pager *pPager); +SQLITE_PRIVATE int sqlite3PagerReadFileheader(Pager*, int, unsigned char*); + +/* Functions used to configure a Pager object. */ +SQLITE_PRIVATE void sqlite3PagerSetBusyhandler(Pager*, int(*)(void *), void *); +SQLITE_PRIVATE int sqlite3PagerSetPagesize(Pager*, u32*, int); +#ifdef SQLITE_HAS_CODEC +SQLITE_PRIVATE void sqlite3PagerAlignReserve(Pager*,Pager*); +#endif +SQLITE_PRIVATE int sqlite3PagerMaxPageCount(Pager*, int); +SQLITE_PRIVATE void sqlite3PagerSetCachesize(Pager*, int); +SQLITE_PRIVATE int sqlite3PagerSetSpillsize(Pager*, int); +SQLITE_PRIVATE void sqlite3PagerSetMmapLimit(Pager *, sqlite3_int64); +SQLITE_PRIVATE void sqlite3PagerShrink(Pager*); +SQLITE_PRIVATE void sqlite3PagerSetFlags(Pager*,unsigned); +SQLITE_PRIVATE int sqlite3PagerLockingMode(Pager *, int); +SQLITE_PRIVATE int sqlite3PagerSetJournalMode(Pager *, int); +SQLITE_PRIVATE int sqlite3PagerGetJournalMode(Pager*); +SQLITE_PRIVATE int sqlite3PagerOkToChangeJournalMode(Pager*); +SQLITE_PRIVATE i64 sqlite3PagerJournalSizeLimit(Pager *, i64); +SQLITE_PRIVATE sqlite3_backup **sqlite3PagerBackupPtr(Pager*); +SQLITE_PRIVATE int sqlite3PagerFlush(Pager*); + +/* Functions used to obtain and release page references. */ +SQLITE_PRIVATE int sqlite3PagerGet(Pager *pPager, Pgno pgno, DbPage **ppPage, int clrFlag); +SQLITE_PRIVATE DbPage *sqlite3PagerLookup(Pager *pPager, Pgno pgno); +SQLITE_PRIVATE void sqlite3PagerRef(DbPage*); +SQLITE_PRIVATE void sqlite3PagerUnref(DbPage*); +SQLITE_PRIVATE void sqlite3PagerUnrefNotNull(DbPage*); + +/* Operations on page references. */ +SQLITE_PRIVATE int sqlite3PagerWrite(DbPage*); +SQLITE_PRIVATE void sqlite3PagerDontWrite(DbPage*); +SQLITE_PRIVATE int sqlite3PagerMovepage(Pager*,DbPage*,Pgno,int); +SQLITE_PRIVATE int sqlite3PagerPageRefcount(DbPage*); +SQLITE_PRIVATE void *sqlite3PagerGetData(DbPage *); +SQLITE_PRIVATE void *sqlite3PagerGetExtra(DbPage *); + +/* Functions used to manage pager transactions and savepoints. */ +SQLITE_PRIVATE void sqlite3PagerPagecount(Pager*, int*); +SQLITE_PRIVATE int sqlite3PagerBegin(Pager*, int exFlag, int); +SQLITE_PRIVATE int sqlite3PagerCommitPhaseOne(Pager*,const char *zMaster, int); +SQLITE_PRIVATE int sqlite3PagerExclusiveLock(Pager*); +SQLITE_PRIVATE int sqlite3PagerSync(Pager *pPager, const char *zMaster); +SQLITE_PRIVATE int sqlite3PagerCommitPhaseTwo(Pager*); +SQLITE_PRIVATE int sqlite3PagerRollback(Pager*); +SQLITE_PRIVATE int sqlite3PagerOpenSavepoint(Pager *pPager, int n); +SQLITE_PRIVATE int sqlite3PagerSavepoint(Pager *pPager, int op, int iSavepoint); +SQLITE_PRIVATE int sqlite3PagerSharedLock(Pager *pPager); + +#ifndef SQLITE_OMIT_WAL +SQLITE_PRIVATE int sqlite3PagerCheckpoint(Pager *pPager, int, int*, int*); +SQLITE_PRIVATE int sqlite3PagerWalSupported(Pager *pPager); +SQLITE_PRIVATE int sqlite3PagerWalCallback(Pager *pPager); +SQLITE_PRIVATE int sqlite3PagerOpenWal(Pager *pPager, int *pisOpen); +SQLITE_PRIVATE int sqlite3PagerCloseWal(Pager *pPager); +SQLITE_PRIVATE int sqlite3PagerUseWal(Pager *pPager); +# ifdef SQLITE_ENABLE_SNAPSHOT +SQLITE_PRIVATE int sqlite3PagerSnapshotGet(Pager *pPager, sqlite3_snapshot **ppSnapshot); +SQLITE_PRIVATE int sqlite3PagerSnapshotOpen(Pager *pPager, sqlite3_snapshot *pSnapshot); +# endif +#else +# define sqlite3PagerUseWal(x) 0 +#endif + +#ifdef SQLITE_ENABLE_ZIPVFS +SQLITE_PRIVATE int sqlite3PagerWalFramesize(Pager *pPager); +#endif + +/* Functions used to query pager state and configuration. */ +SQLITE_PRIVATE u8 sqlite3PagerIsreadonly(Pager*); +SQLITE_PRIVATE u32 sqlite3PagerDataVersion(Pager*); +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE int sqlite3PagerRefcount(Pager*); +#endif +SQLITE_PRIVATE int sqlite3PagerMemUsed(Pager*); +SQLITE_PRIVATE const char *sqlite3PagerFilename(Pager*, int); +SQLITE_PRIVATE sqlite3_vfs *sqlite3PagerVfs(Pager*); +SQLITE_PRIVATE sqlite3_file *sqlite3PagerFile(Pager*); +SQLITE_PRIVATE sqlite3_file *sqlite3PagerJrnlFile(Pager*); +SQLITE_PRIVATE const char *sqlite3PagerJournalname(Pager*); +SQLITE_PRIVATE void *sqlite3PagerTempSpace(Pager*); +SQLITE_PRIVATE int sqlite3PagerIsMemdb(Pager*); +SQLITE_PRIVATE void sqlite3PagerCacheStat(Pager *, int, int, int *); +SQLITE_PRIVATE void sqlite3PagerClearCache(Pager*); +SQLITE_PRIVATE int sqlite3SectorSize(sqlite3_file *); + +/* Functions used to truncate the database file. */ +SQLITE_PRIVATE void sqlite3PagerTruncateImage(Pager*,Pgno); + +SQLITE_PRIVATE void sqlite3PagerRekey(DbPage*, Pgno, u16); + +#if defined(SQLITE_HAS_CODEC) && !defined(SQLITE_OMIT_WAL) +SQLITE_PRIVATE void *sqlite3PagerCodec(DbPage *); +#endif + +/* Functions to support testing and debugging. */ +#if !defined(NDEBUG) || defined(SQLITE_TEST) +SQLITE_PRIVATE Pgno sqlite3PagerPagenumber(DbPage*); +SQLITE_PRIVATE int sqlite3PagerIswriteable(DbPage*); +#endif +#ifdef SQLITE_TEST +SQLITE_PRIVATE int *sqlite3PagerStats(Pager*); +SQLITE_PRIVATE void sqlite3PagerRefdump(Pager*); + void disable_simulated_io_errors(void); + void enable_simulated_io_errors(void); +#else +# define disable_simulated_io_errors() +# define enable_simulated_io_errors() +#endif + +#endif /* SQLITE_PAGER_H */ + +/************** End of pager.h ***********************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ +/************** Include pcache.h in the middle of sqliteInt.h ****************/ +/************** Begin file pcache.h ******************************************/ +/* +** 2008 August 05 +** +** 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 header file defines the interface that the sqlite page cache +** subsystem. +*/ + +#ifndef _PCACHE_H_ + +typedef struct PgHdr PgHdr; +typedef struct PCache PCache; + +/* +** Every page in the cache is controlled by an instance of the following +** structure. +*/ +struct PgHdr { + sqlite3_pcache_page *pPage; /* Pcache object page handle */ + void *pData; /* Page data */ + void *pExtra; /* Extra content */ + PgHdr *pDirty; /* Transient list of dirty sorted by pgno */ + Pager *pPager; /* The pager this page is part of */ + Pgno pgno; /* Page number for this page */ +#ifdef SQLITE_CHECK_PAGES + u32 pageHash; /* Hash of page content */ +#endif + u16 flags; /* PGHDR flags defined below */ + + /********************************************************************** + ** Elements above are public. All that follows is private to pcache.c + ** and should not be accessed by other modules. + */ + i16 nRef; /* Number of users of this page */ + PCache *pCache; /* Cache that owns this page */ + + PgHdr *pDirtyNext; /* Next element in list of dirty pages */ + PgHdr *pDirtyPrev; /* Previous element in list of dirty pages */ +}; + +/* Bit values for PgHdr.flags */ +#define PGHDR_CLEAN 0x001 /* Page not on the PCache.pDirty list */ +#define PGHDR_DIRTY 0x002 /* Page is on the PCache.pDirty list */ +#define PGHDR_WRITEABLE 0x004 /* Journaled and ready to modify */ +#define PGHDR_NEED_SYNC 0x008 /* Fsync the rollback journal before + ** writing this page to the database */ +#define PGHDR_DONT_WRITE 0x010 /* Do not write content to disk */ +#define PGHDR_MMAP 0x020 /* This is an mmap page object */ + +#define PGHDR_WAL_APPEND 0x040 /* Appended to wal file */ + +/* Initialize and shutdown the page cache subsystem */ +SQLITE_PRIVATE int sqlite3PcacheInitialize(void); +SQLITE_PRIVATE void sqlite3PcacheShutdown(void); + +/* Page cache buffer management: +** These routines implement SQLITE_CONFIG_PAGECACHE. +*/ +SQLITE_PRIVATE void sqlite3PCacheBufferSetup(void *, int sz, int n); + +/* Create a new pager cache. +** Under memory stress, invoke xStress to try to make pages clean. +** Only clean and unpinned pages can be reclaimed. +*/ +SQLITE_PRIVATE int sqlite3PcacheOpen( + int szPage, /* Size of every page */ + int szExtra, /* Extra space associated with each page */ + int bPurgeable, /* True if pages are on backing store */ + int (*xStress)(void*, PgHdr*), /* Call to try to make pages clean */ + void *pStress, /* Argument to xStress */ + PCache *pToInit /* Preallocated space for the PCache */ +); + +/* Modify the page-size after the cache has been created. */ +SQLITE_PRIVATE int sqlite3PcacheSetPageSize(PCache *, int); + +/* Return the size in bytes of a PCache object. Used to preallocate +** storage space. +*/ +SQLITE_PRIVATE int sqlite3PcacheSize(void); + +/* One release per successful fetch. Page is pinned until released. +** Reference counted. +*/ +SQLITE_PRIVATE sqlite3_pcache_page *sqlite3PcacheFetch(PCache*, Pgno, int createFlag); +SQLITE_PRIVATE int sqlite3PcacheFetchStress(PCache*, Pgno, sqlite3_pcache_page**); +SQLITE_PRIVATE PgHdr *sqlite3PcacheFetchFinish(PCache*, Pgno, sqlite3_pcache_page *pPage); +SQLITE_PRIVATE void sqlite3PcacheRelease(PgHdr*); + +SQLITE_PRIVATE void sqlite3PcacheDrop(PgHdr*); /* Remove page from cache */ +SQLITE_PRIVATE void sqlite3PcacheMakeDirty(PgHdr*); /* Make sure page is marked dirty */ +SQLITE_PRIVATE void sqlite3PcacheMakeClean(PgHdr*); /* Mark a single page as clean */ +SQLITE_PRIVATE void sqlite3PcacheCleanAll(PCache*); /* Mark all dirty list pages as clean */ +SQLITE_PRIVATE void sqlite3PcacheClearWritable(PCache*); + +/* Change a page number. Used by incr-vacuum. */ +SQLITE_PRIVATE void sqlite3PcacheMove(PgHdr*, Pgno); + +/* Remove all pages with pgno>x. Reset the cache if x==0 */ +SQLITE_PRIVATE void sqlite3PcacheTruncate(PCache*, Pgno x); + +/* Get a list of all dirty pages in the cache, sorted by page number */ +SQLITE_PRIVATE PgHdr *sqlite3PcacheDirtyList(PCache*); + +/* Reset and close the cache object */ +SQLITE_PRIVATE void sqlite3PcacheClose(PCache*); + +/* Clear flags from pages of the page cache */ +SQLITE_PRIVATE void sqlite3PcacheClearSyncFlags(PCache *); + +/* Discard the contents of the cache */ +SQLITE_PRIVATE void sqlite3PcacheClear(PCache*); + +/* Return the total number of outstanding page references */ +SQLITE_PRIVATE int sqlite3PcacheRefCount(PCache*); + +/* Increment the reference count of an existing page */ +SQLITE_PRIVATE void sqlite3PcacheRef(PgHdr*); + +SQLITE_PRIVATE int sqlite3PcachePageRefcount(PgHdr*); + +/* Return the total number of pages stored in the cache */ +SQLITE_PRIVATE int sqlite3PcachePagecount(PCache*); + +#if defined(SQLITE_CHECK_PAGES) || defined(SQLITE_DEBUG) +/* Iterate through all dirty pages currently stored in the cache. This +** interface is only available if SQLITE_CHECK_PAGES is defined when the +** library is built. +*/ +SQLITE_PRIVATE void sqlite3PcacheIterateDirty(PCache *pCache, void (*xIter)(PgHdr *)); +#endif + +#if defined(SQLITE_DEBUG) +/* Check invariants on a PgHdr object */ +SQLITE_PRIVATE int sqlite3PcachePageSanity(PgHdr*); +#endif + +/* Set and get the suggested cache-size for the specified pager-cache. +** +** If no global maximum is configured, then the system attempts to limit +** the total number of pages cached by purgeable pager-caches to the sum +** of the suggested cache-sizes. +*/ +SQLITE_PRIVATE void sqlite3PcacheSetCachesize(PCache *, int); +#ifdef SQLITE_TEST +SQLITE_PRIVATE int sqlite3PcacheGetCachesize(PCache *); +#endif + +/* Set or get the suggested spill-size for the specified pager-cache. +** +** The spill-size is the minimum number of pages in cache before the cache +** will attempt to spill dirty pages by calling xStress. +*/ +SQLITE_PRIVATE int sqlite3PcacheSetSpillsize(PCache *, int); + +/* Free up as much memory as possible from the page cache */ +SQLITE_PRIVATE void sqlite3PcacheShrink(PCache*); + +#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT +/* Try to return memory used by the pcache module to the main memory heap */ +SQLITE_PRIVATE int sqlite3PcacheReleaseMemory(int); +#endif + +#ifdef SQLITE_TEST +SQLITE_PRIVATE void sqlite3PcacheStats(int*,int*,int*,int*); +#endif + +SQLITE_PRIVATE void sqlite3PCacheSetDefault(void); + +/* Return the header size */ +SQLITE_PRIVATE int sqlite3HeaderSizePcache(void); +SQLITE_PRIVATE int sqlite3HeaderSizePcache1(void); + +/* Number of dirty pages as a percentage of the configured cache size */ +SQLITE_PRIVATE int sqlite3PCachePercentDirty(PCache*); + +#endif /* _PCACHE_H_ */ + +/************** End of pcache.h **********************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ +/************** Include os.h in the middle of sqliteInt.h ********************/ +/************** Begin file os.h **********************************************/ +/* +** 2001 September 16 +** +** 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 header file (together with is companion C source-code file +** "os.c") attempt to abstract the underlying operating system so that +** the SQLite library will work on both POSIX and windows systems. +** +** This header file is #include-ed by sqliteInt.h and thus ends up +** being included by every source file. +*/ +#ifndef _SQLITE_OS_H_ +#define _SQLITE_OS_H_ + +/* +** Attempt to automatically detect the operating system and setup the +** necessary pre-processor macros for it. +*/ +/************** Include os_setup.h in the middle of os.h *********************/ +/************** Begin file os_setup.h ****************************************/ +/* +** 2013 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 pre-processor directives related to operating system +** detection and/or setup. +*/ +#ifndef SQLITE_OS_SETUP_H +#define SQLITE_OS_SETUP_H + +/* +** Figure out if we are dealing with Unix, Windows, or some other operating +** system. +** +** After the following block of preprocess macros, all of SQLITE_OS_UNIX, +** SQLITE_OS_WIN, and SQLITE_OS_OTHER will defined to either 1 or 0. One of +** the three will be 1. The other two will be 0. +*/ +#if defined(SQLITE_OS_OTHER) +# if SQLITE_OS_OTHER==1 +# undef SQLITE_OS_UNIX +# define SQLITE_OS_UNIX 0 +# undef SQLITE_OS_WIN +# define SQLITE_OS_WIN 0 +# else +# undef SQLITE_OS_OTHER +# endif +#endif +#if !defined(SQLITE_OS_UNIX) && !defined(SQLITE_OS_OTHER) +# define SQLITE_OS_OTHER 0 +# ifndef SQLITE_OS_WIN +# if defined(_WIN32) || defined(WIN32) || defined(__CYGWIN__) || \ + defined(__MINGW32__) || defined(__BORLANDC__) +# define SQLITE_OS_WIN 1 +# define SQLITE_OS_UNIX 0 +# else +# define SQLITE_OS_WIN 0 +# define SQLITE_OS_UNIX 1 +# endif +# else +# define SQLITE_OS_UNIX 0 +# endif +#else +# ifndef SQLITE_OS_WIN +# define SQLITE_OS_WIN 0 +# endif +#endif + +#endif /* SQLITE_OS_SETUP_H */ + +/************** End of os_setup.h ********************************************/ +/************** Continuing where we left off in os.h *************************/ + +/* If the SET_FULLSYNC macro is not defined above, then make it +** a no-op +*/ +#ifndef SET_FULLSYNC +# define SET_FULLSYNC(x,y) +#endif + +/* +** The default size of a disk sector +*/ +#ifndef SQLITE_DEFAULT_SECTOR_SIZE +# define SQLITE_DEFAULT_SECTOR_SIZE 4096 +#endif + +/* +** Temporary files are named starting with this prefix followed by 16 random +** alphanumeric characters, and no file extension. They are stored in the +** OS's standard temporary file directory, and are deleted prior to exit. +** If sqlite is being embedded in another program, you may wish to change the +** prefix to reflect your program's name, so that if your program exits +** prematurely, old temporary files can be easily identified. This can be done +** using -DSQLITE_TEMP_FILE_PREFIX=myprefix_ on the compiler command line. +** +** 2006-10-31: The default prefix used to be "sqlite_". But then +** Mcafee started using SQLite in their anti-virus product and it +** started putting files with the "sqlite" name in the c:/temp folder. +** This annoyed many windows users. Those users would then do a +** Google search for "sqlite", find the telephone numbers of the +** developers and call to wake them up at night and complain. +** For this reason, the default name prefix is changed to be "sqlite" +** spelled backwards. So the temp files are still identified, but +** anybody smart enough to figure out the code is also likely smart +** enough to know that calling the developer will not help get rid +** of the file. +*/ +#ifndef SQLITE_TEMP_FILE_PREFIX +# define SQLITE_TEMP_FILE_PREFIX "etilqs_" +#endif + +/* +** The following values may be passed as the second argument to +** sqlite3OsLock(). The various locks exhibit the following semantics: +** +** SHARED: Any number of processes may hold a SHARED lock simultaneously. +** RESERVED: A single process may hold a RESERVED lock on a file at +** any time. Other processes may hold and obtain new SHARED locks. +** PENDING: A single process may hold a PENDING lock on a file at +** any one time. Existing SHARED locks may persist, but no new +** SHARED locks may be obtained by other processes. +** EXCLUSIVE: An EXCLUSIVE lock precludes all other locks. +** +** PENDING_LOCK may not be passed directly to sqlite3OsLock(). Instead, a +** process that requests an EXCLUSIVE lock may actually obtain a PENDING +** lock. This can be upgraded to an EXCLUSIVE lock by a subsequent call to +** sqlite3OsLock(). +*/ +#define NO_LOCK 0 +#define SHARED_LOCK 1 +#define RESERVED_LOCK 2 +#define PENDING_LOCK 3 +#define EXCLUSIVE_LOCK 4 + +/* +** File Locking Notes: (Mostly about windows but also some info for Unix) +** +** We cannot use LockFileEx() or UnlockFileEx() on Win95/98/ME because +** those functions are not available. So we use only LockFile() and +** UnlockFile(). +** +** LockFile() prevents not just writing but also reading by other processes. +** A SHARED_LOCK is obtained by locking a single randomly-chosen +** byte out of a specific range of bytes. The lock byte is obtained at +** random so two separate readers can probably access the file at the +** same time, unless they are unlucky and choose the same lock byte. +** An EXCLUSIVE_LOCK is obtained by locking all bytes in the range. +** There can only be one writer. A RESERVED_LOCK is obtained by locking +** a single byte of the file that is designated as the reserved lock byte. +** A PENDING_LOCK is obtained by locking a designated byte different from +** the RESERVED_LOCK byte. +** +** On WinNT/2K/XP systems, LockFileEx() and UnlockFileEx() are available, +** which means we can use reader/writer locks. When reader/writer locks +** are used, the lock is placed on the same range of bytes that is used +** for probabilistic locking in Win95/98/ME. Hence, the locking scheme +** will support two or more Win95 readers or two or more WinNT readers. +** But a single Win95 reader will lock out all WinNT readers and a single +** WinNT reader will lock out all other Win95 readers. +** +** The following #defines specify the range of bytes used for locking. +** SHARED_SIZE is the number of bytes available in the pool from which +** a random byte is selected for a shared lock. The pool of bytes for +** shared locks begins at SHARED_FIRST. +** +** The same locking strategy and +** byte ranges are used for Unix. This leaves open the possibility of having +** clients on win95, winNT, and unix all talking to the same shared file +** and all locking correctly. To do so would require that samba (or whatever +** tool is being used for file sharing) implements locks correctly between +** windows and unix. I'm guessing that isn't likely to happen, but by +** using the same locking range we are at least open to the possibility. +** +** Locking in windows is manditory. For this reason, we cannot store +** actual data in the bytes used for locking. The pager never allocates +** the pages involved in locking therefore. SHARED_SIZE is selected so +** that all locks will fit on a single page even at the minimum page size. +** PENDING_BYTE defines the beginning of the locks. By default PENDING_BYTE +** is set high so that we don't have to allocate an unused page except +** for very large databases. But one should test the page skipping logic +** by setting PENDING_BYTE low and running the entire regression suite. +** +** Changing the value of PENDING_BYTE results in a subtly incompatible +** file format. Depending on how it is changed, you might not notice +** the incompatibility right away, even running a full regression test. +** The default location of PENDING_BYTE is the first byte past the +** 1GB boundary. +** +*/ +#ifdef SQLITE_OMIT_WSD +# define PENDING_BYTE (0x40000000) +#else +# define PENDING_BYTE sqlite3PendingByte +#endif +#define RESERVED_BYTE (PENDING_BYTE+1) +#define SHARED_FIRST (PENDING_BYTE+2) +#define SHARED_SIZE 510 + +/* +** Wrapper around OS specific sqlite3_os_init() function. +*/ +SQLITE_PRIVATE int sqlite3OsInit(void); + +/* +** Functions for accessing sqlite3_file methods +*/ +SQLITE_PRIVATE void sqlite3OsClose(sqlite3_file*); +SQLITE_PRIVATE int sqlite3OsRead(sqlite3_file*, void*, int amt, i64 offset); +SQLITE_PRIVATE int sqlite3OsWrite(sqlite3_file*, const void*, int amt, i64 offset); +SQLITE_PRIVATE int sqlite3OsTruncate(sqlite3_file*, i64 size); +SQLITE_PRIVATE int sqlite3OsSync(sqlite3_file*, int); +SQLITE_PRIVATE int sqlite3OsFileSize(sqlite3_file*, i64 *pSize); +SQLITE_PRIVATE int sqlite3OsLock(sqlite3_file*, int); +SQLITE_PRIVATE int sqlite3OsUnlock(sqlite3_file*, int); +SQLITE_PRIVATE int sqlite3OsCheckReservedLock(sqlite3_file *id, int *pResOut); +SQLITE_PRIVATE int sqlite3OsFileControl(sqlite3_file*,int,void*); +SQLITE_PRIVATE void sqlite3OsFileControlHint(sqlite3_file*,int,void*); +#define SQLITE_FCNTL_DB_UNCHANGED 0xca093fa0 +SQLITE_PRIVATE int sqlite3OsSectorSize(sqlite3_file *id); +SQLITE_PRIVATE int sqlite3OsDeviceCharacteristics(sqlite3_file *id); +SQLITE_PRIVATE int sqlite3OsShmMap(sqlite3_file *,int,int,int,void volatile **); +SQLITE_PRIVATE int sqlite3OsShmLock(sqlite3_file *id, int, int, int); +SQLITE_PRIVATE void sqlite3OsShmBarrier(sqlite3_file *id); +SQLITE_PRIVATE int sqlite3OsShmUnmap(sqlite3_file *id, int); +SQLITE_PRIVATE int sqlite3OsFetch(sqlite3_file *id, i64, int, void **); +SQLITE_PRIVATE int sqlite3OsUnfetch(sqlite3_file *, i64, void *); + + +/* +** Functions for accessing sqlite3_vfs methods +*/ +SQLITE_PRIVATE int sqlite3OsOpen(sqlite3_vfs *, const char *, sqlite3_file*, int, int *); +SQLITE_PRIVATE int sqlite3OsDelete(sqlite3_vfs *, const char *, int); +SQLITE_PRIVATE int sqlite3OsAccess(sqlite3_vfs *, const char *, int, int *pResOut); +SQLITE_PRIVATE int sqlite3OsFullPathname(sqlite3_vfs *, const char *, int, char *); +#ifndef SQLITE_OMIT_LOAD_EXTENSION +SQLITE_PRIVATE void *sqlite3OsDlOpen(sqlite3_vfs *, const char *); +SQLITE_PRIVATE void sqlite3OsDlError(sqlite3_vfs *, int, char *); +SQLITE_PRIVATE void (*sqlite3OsDlSym(sqlite3_vfs *, void *, const char *))(void); +SQLITE_PRIVATE void sqlite3OsDlClose(sqlite3_vfs *, void *); +#endif /* SQLITE_OMIT_LOAD_EXTENSION */ +SQLITE_PRIVATE int sqlite3OsRandomness(sqlite3_vfs *, int, char *); +SQLITE_PRIVATE int sqlite3OsSleep(sqlite3_vfs *, int); +SQLITE_PRIVATE int sqlite3OsGetLastError(sqlite3_vfs*); +SQLITE_PRIVATE int sqlite3OsCurrentTimeInt64(sqlite3_vfs *, sqlite3_int64*); + +/* +** Convenience functions for opening and closing files using +** sqlite3_malloc() to obtain space for the file-handle structure. +*/ +SQLITE_PRIVATE int sqlite3OsOpenMalloc(sqlite3_vfs *, const char *, sqlite3_file **, int,int*); +SQLITE_PRIVATE void sqlite3OsCloseFree(sqlite3_file *); + +#endif /* _SQLITE_OS_H_ */ + +/************** End of os.h **************************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ +/************** Include mutex.h in the middle of sqliteInt.h *****************/ +/************** Begin file mutex.h *******************************************/ +/* +** 2007 August 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 file contains the common header for all mutex implementations. +** The sqliteInt.h header #includes this file so that it is available +** to all source files. We break it out in an effort to keep the code +** better organized. +** +** 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. +*/ + + +/* +** Figure out what version of the code to use. The choices are +** +** SQLITE_MUTEX_OMIT No mutex logic. Not even stubs. The +** mutexes implementation cannot be overridden +** at start-time. +** +** SQLITE_MUTEX_NOOP For single-threaded applications. No +** mutual exclusion is provided. But this +** implementation can be overridden at +** start-time. +** +** SQLITE_MUTEX_PTHREADS For multi-threaded applications on Unix. +** +** SQLITE_MUTEX_W32 For multi-threaded applications on Win32. +*/ +#if !SQLITE_THREADSAFE +# define SQLITE_MUTEX_OMIT +#endif +#if SQLITE_THREADSAFE && !defined(SQLITE_MUTEX_NOOP) +# if SQLITE_OS_UNIX +# define SQLITE_MUTEX_PTHREADS +# elif SQLITE_OS_WIN +# define SQLITE_MUTEX_W32 +# else +# define SQLITE_MUTEX_NOOP +# endif +#endif + +#ifdef SQLITE_MUTEX_OMIT +/* +** If this is a no-op implementation, implement everything as macros. +*/ +#define sqlite3_mutex_alloc(X) ((sqlite3_mutex*)8) +#define sqlite3_mutex_free(X) +#define sqlite3_mutex_enter(X) +#define sqlite3_mutex_try(X) SQLITE_OK +#define sqlite3_mutex_leave(X) +#define sqlite3_mutex_held(X) ((void)(X),1) +#define sqlite3_mutex_notheld(X) ((void)(X),1) +#define sqlite3MutexAlloc(X) ((sqlite3_mutex*)8) +#define sqlite3MutexInit() SQLITE_OK +#define sqlite3MutexEnd() +#define MUTEX_LOGIC(X) +#else +#define MUTEX_LOGIC(X) X +#endif /* defined(SQLITE_MUTEX_OMIT) */ + +/************** End of mutex.h ***********************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ + +/* The SQLITE_EXTRA_DURABLE compile-time option used to set the default +** synchronous setting to EXTRA. It is no longer supported. +*/ +#ifdef SQLITE_EXTRA_DURABLE +# warning Use SQLITE_DEFAULT_SYNCHRONOUS=3 instead of SQLITE_EXTRA_DURABLE +# define SQLITE_DEFAULT_SYNCHRONOUS 3 +#endif + +/* +** Default synchronous levels. +** +** Note that (for historcal reasons) the PAGER_SYNCHRONOUS_* macros differ +** from the SQLITE_DEFAULT_SYNCHRONOUS value by 1. +** +** PAGER_SYNCHRONOUS DEFAULT_SYNCHRONOUS +** OFF 1 0 +** NORMAL 2 1 +** FULL 3 2 +** EXTRA 4 3 +** +** The "PRAGMA synchronous" statement also uses the zero-based numbers. +** In other words, the zero-based numbers are used for all external interfaces +** and the one-based values are used internally. +*/ +#ifndef SQLITE_DEFAULT_SYNCHRONOUS +# define SQLITE_DEFAULT_SYNCHRONOUS (PAGER_SYNCHRONOUS_FULL-1) +#endif +#ifndef SQLITE_DEFAULT_WAL_SYNCHRONOUS +# define SQLITE_DEFAULT_WAL_SYNCHRONOUS SQLITE_DEFAULT_SYNCHRONOUS +#endif + +/* +** Each database file to be accessed by the system is an instance +** of the following structure. There are normally two of these structures +** in the sqlite.aDb[] array. aDb[0] is the main database file and +** aDb[1] is the database file used to hold temporary tables. Additional +** databases may be attached. +*/ +struct Db { + char *zDbSName; /* Name of this database. (schema name, not filename) */ + Btree *pBt; /* The B*Tree structure for this database file */ + u8 safety_level; /* How aggressive at syncing data to disk */ + u8 bSyncSet; /* True if "PRAGMA synchronous=N" has been run */ + Schema *pSchema; /* Pointer to database schema (possibly shared) */ +}; + +/* +** An instance of the following structure stores a database schema. +** +** Most Schema objects are associated with a Btree. The exception is +** the Schema for the TEMP databaes (sqlite3.aDb[1]) which is free-standing. +** In shared cache mode, a single Schema object can be shared by multiple +** Btrees that refer to the same underlying BtShared object. +** +** Schema objects are automatically deallocated when the last Btree that +** references them is destroyed. The TEMP Schema is manually freed by +** sqlite3_close(). +* +** A thread must be holding a mutex on the corresponding Btree in order +** to access Schema content. This implies that the thread must also be +** holding a mutex on the sqlite3 connection pointer that owns the Btree. +** For a TEMP Schema, only the connection mutex is required. +*/ +struct Schema { + int schema_cookie; /* Database schema version number for this file */ + int iGeneration; /* Generation counter. Incremented with each change */ + Hash tblHash; /* All tables indexed by name */ + Hash idxHash; /* All (named) indices indexed by name */ + Hash trigHash; /* All triggers indexed by name */ + Hash fkeyHash; /* All foreign keys by referenced table name */ + Table *pSeqTab; /* The sqlite_sequence table used by AUTOINCREMENT */ + u8 file_format; /* Schema format version for this file */ + u8 enc; /* Text encoding used by this database */ + u16 schemaFlags; /* Flags associated with this schema */ + int cache_size; /* Number of pages to use in the cache */ +}; + +/* +** These macros can be used to test, set, or clear bits in the +** Db.pSchema->flags field. +*/ +#define DbHasProperty(D,I,P) (((D)->aDb[I].pSchema->schemaFlags&(P))==(P)) +#define DbHasAnyProperty(D,I,P) (((D)->aDb[I].pSchema->schemaFlags&(P))!=0) +#define DbSetProperty(D,I,P) (D)->aDb[I].pSchema->schemaFlags|=(P) +#define DbClearProperty(D,I,P) (D)->aDb[I].pSchema->schemaFlags&=~(P) + +/* +** Allowed values for the DB.pSchema->flags field. +** +** The DB_SchemaLoaded flag is set after the database schema has been +** read into internal hash tables. +** +** DB_UnresetViews means that one or more views have column names that +** have been filled out. If the schema changes, these column names might +** changes and so the view will need to be reset. +*/ +#define DB_SchemaLoaded 0x0001 /* The schema has been loaded */ +#define DB_UnresetViews 0x0002 /* Some views have defined column names */ +#define DB_Empty 0x0004 /* The file is empty (length 0 bytes) */ + +/* +** The number of different kinds of things that can be limited +** using the sqlite3_limit() interface. +*/ +#define SQLITE_N_LIMIT (SQLITE_LIMIT_WORKER_THREADS+1) + +/* +** Lookaside malloc is a set of fixed-size buffers that can be used +** to satisfy small transient memory allocation requests for objects +** associated with a particular database connection. The use of +** lookaside malloc provides a significant performance enhancement +** (approx 10%) by avoiding numerous malloc/free requests while parsing +** SQL statements. +** +** The Lookaside structure holds configuration information about the +** lookaside malloc subsystem. Each available memory allocation in +** the lookaside subsystem is stored on a linked list of LookasideSlot +** objects. +** +** Lookaside allocations are only allowed for objects that are associated +** with a particular database connection. Hence, schema information cannot +** be stored in lookaside because in shared cache mode the schema information +** is shared by multiple database connections. Therefore, while parsing +** schema information, the Lookaside.bEnabled flag is cleared so that +** lookaside allocations are not used to construct the schema objects. +*/ +struct Lookaside { + u32 bDisable; /* Only operate the lookaside when zero */ + u16 sz; /* Size of each buffer in bytes */ + u8 bMalloced; /* True if pStart obtained from sqlite3_malloc() */ + int nOut; /* Number of buffers currently checked out */ + int mxOut; /* Highwater mark for nOut */ + int anStat[3]; /* 0: hits. 1: size misses. 2: full misses */ + LookasideSlot *pFree; /* List of available buffers */ + void *pStart; /* First byte of available memory space */ + void *pEnd; /* First byte past end of available space */ +}; +struct LookasideSlot { + LookasideSlot *pNext; /* Next buffer in the list of free buffers */ +}; + +/* +** A hash table for built-in function definitions. (Application-defined +** functions use a regular table table from hash.h.) +** +** Hash each FuncDef structure into one of the FuncDefHash.a[] slots. +** Collisions are on the FuncDef.u.pHash chain. +*/ +#define SQLITE_FUNC_HASH_SZ 23 +struct FuncDefHash { + FuncDef *a[SQLITE_FUNC_HASH_SZ]; /* Hash table for functions */ +}; + +#ifdef SQLITE_USER_AUTHENTICATION +/* +** Information held in the "sqlite3" database connection object and used +** to manage user authentication. +*/ +typedef struct sqlite3_userauth sqlite3_userauth; +struct sqlite3_userauth { + u8 authLevel; /* Current authentication level */ + int nAuthPW; /* Size of the zAuthPW in bytes */ + char *zAuthPW; /* Password used to authenticate */ + char *zAuthUser; /* User name used to authenticate */ +}; + +/* Allowed values for sqlite3_userauth.authLevel */ +#define UAUTH_Unknown 0 /* Authentication not yet checked */ +#define UAUTH_Fail 1 /* User authentication failed */ +#define UAUTH_User 2 /* Authenticated as a normal user */ +#define UAUTH_Admin 3 /* Authenticated as an administrator */ + +/* Functions used only by user authorization logic */ +SQLITE_PRIVATE int sqlite3UserAuthTable(const char*); +SQLITE_PRIVATE int sqlite3UserAuthCheckLogin(sqlite3*,const char*,u8*); +SQLITE_PRIVATE void sqlite3UserAuthInit(sqlite3*); +SQLITE_PRIVATE void sqlite3CryptFunc(sqlite3_context*,int,sqlite3_value**); + +#endif /* SQLITE_USER_AUTHENTICATION */ + +/* +** typedef for the authorization callback function. +*/ +#ifdef SQLITE_USER_AUTHENTICATION + typedef int (*sqlite3_xauth)(void*,int,const char*,const char*,const char*, + const char*, const char*); +#else + typedef int (*sqlite3_xauth)(void*,int,const char*,const char*,const char*, + const char*); +#endif + +#ifndef SQLITE_OMIT_DEPRECATED +/* This is an extra SQLITE_TRACE macro that indicates "legacy" tracing +** in the style of sqlite3_trace() +*/ +#define SQLITE_TRACE_LEGACY 0x80 +#else +#define SQLITE_TRACE_LEGACY 0 +#endif /* SQLITE_OMIT_DEPRECATED */ + + +/* +** Each database connection is an instance of the following structure. +*/ +struct sqlite3 { + sqlite3_vfs *pVfs; /* OS Interface */ + struct Vdbe *pVdbe; /* List of active virtual machines */ + CollSeq *pDfltColl; /* The default collating sequence (BINARY) */ + sqlite3_mutex *mutex; /* Connection mutex */ + Db *aDb; /* All backends */ + int nDb; /* Number of backends currently in use */ + int flags; /* Miscellaneous flags. See below */ + i64 lastRowid; /* ROWID of most recent insert (see above) */ + i64 szMmap; /* Default mmap_size setting */ + unsigned int openFlags; /* Flags passed to sqlite3_vfs.xOpen() */ + int errCode; /* Most recent error code (SQLITE_*) */ + int errMask; /* & result codes with this before returning */ + int iSysErrno; /* Errno value from last system error */ + u16 dbOptFlags; /* Flags to enable/disable optimizations */ + u8 enc; /* Text encoding */ + u8 autoCommit; /* The auto-commit flag. */ + u8 temp_store; /* 1: file 2: memory 0: default */ + u8 mallocFailed; /* True if we have seen a malloc failure */ + u8 bBenignMalloc; /* Do not require OOMs if true */ + u8 dfltLockMode; /* Default locking-mode for attached dbs */ + signed char nextAutovac; /* Autovac setting after VACUUM if >=0 */ + u8 suppressErr; /* Do not issue error messages if true */ + u8 vtabOnConflict; /* Value to return for s3_vtab_on_conflict() */ + u8 isTransactionSavepoint; /* True if the outermost savepoint is a TS */ + u8 mTrace; /* zero or more SQLITE_TRACE flags */ + int nextPagesize; /* Pagesize after VACUUM if >0 */ + u32 magic; /* Magic number for detect library misuse */ + int nChange; /* Value returned by sqlite3_changes() */ + int nTotalChange; /* Value returned by sqlite3_total_changes() */ + int aLimit[SQLITE_N_LIMIT]; /* Limits */ + int nMaxSorterMmap; /* Maximum size of regions mapped by sorter */ + struct sqlite3InitInfo { /* Information used during initialization */ + int newTnum; /* Rootpage of table being initialized */ + u8 iDb; /* Which db file is being initialized */ + u8 busy; /* TRUE if currently initializing */ + u8 orphanTrigger; /* Last statement is orphaned TEMP trigger */ + u8 imposterTable; /* Building an imposter table */ + } init; + int nVdbeActive; /* Number of VDBEs currently running */ + int nVdbeRead; /* Number of active VDBEs that read or write */ + int nVdbeWrite; /* Number of active VDBEs that read and write */ + int nVdbeExec; /* Number of nested calls to VdbeExec() */ + int nVDestroy; /* Number of active OP_VDestroy operations */ + int nExtension; /* Number of loaded extensions */ + void **aExtension; /* Array of shared library handles */ + int (*xTrace)(u32,void*,void*,void*); /* Trace function */ + void *pTraceArg; /* Argument to the trace function */ + void (*xProfile)(void*,const char*,u64); /* Profiling function */ + void *pProfileArg; /* Argument to profile function */ + void *pCommitArg; /* Argument to xCommitCallback() */ + int (*xCommitCallback)(void*); /* Invoked at every commit. */ + void *pRollbackArg; /* Argument to xRollbackCallback() */ + void (*xRollbackCallback)(void*); /* Invoked at every commit. */ + void *pUpdateArg; + void (*xUpdateCallback)(void*,int, const char*,const char*,sqlite_int64); +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + void *pPreUpdateArg; /* First argument to xPreUpdateCallback */ + void (*xPreUpdateCallback)( /* Registered using sqlite3_preupdate_hook() */ + void*,sqlite3*,int,char const*,char const*,sqlite3_int64,sqlite3_int64 + ); + PreUpdate *pPreUpdate; /* Context for active pre-update callback */ +#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */ +#ifndef SQLITE_OMIT_WAL + int (*xWalCallback)(void *, sqlite3 *, const char *, int); + void *pWalArg; +#endif + void(*xCollNeeded)(void*,sqlite3*,int eTextRep,const char*); + void(*xCollNeeded16)(void*,sqlite3*,int eTextRep,const void*); + void *pCollNeededArg; + sqlite3_value *pErr; /* Most recent error message */ + union { + volatile int isInterrupted; /* True if sqlite3_interrupt has been called */ + double notUsed1; /* Spacer */ + } u1; + Lookaside lookaside; /* Lookaside malloc configuration */ +#ifndef SQLITE_OMIT_AUTHORIZATION + sqlite3_xauth xAuth; /* Access authorization function */ + void *pAuthArg; /* 1st argument to the access auth function */ +#endif +#ifndef SQLITE_OMIT_PROGRESS_CALLBACK + int (*xProgress)(void *); /* The progress callback */ + void *pProgressArg; /* Argument to the progress callback */ + unsigned nProgressOps; /* Number of opcodes for progress callback */ +#endif +#ifndef SQLITE_OMIT_VIRTUALTABLE + int nVTrans; /* Allocated size of aVTrans */ + Hash aModule; /* populated by sqlite3_create_module() */ + VtabCtx *pVtabCtx; /* Context for active vtab connect/create */ + VTable **aVTrans; /* Virtual tables with open transactions */ + VTable *pDisconnect; /* Disconnect these in next sqlite3_prepare() */ +#endif + Hash aFunc; /* Hash table of connection functions */ + Hash aCollSeq; /* All collating sequences */ + BusyHandler busyHandler; /* Busy callback */ + Db aDbStatic[2]; /* Static space for the 2 default backends */ + Savepoint *pSavepoint; /* List of active savepoints */ + int busyTimeout; /* Busy handler timeout, in msec */ + int nSavepoint; /* Number of non-transaction savepoints */ + int nStatement; /* Number of nested statement-transactions */ + i64 nDeferredCons; /* Net deferred constraints this transaction. */ + i64 nDeferredImmCons; /* Net deferred immediate constraints */ + int *pnBytesFreed; /* If not NULL, increment this in DbFree() */ +#ifdef SQLITE_ENABLE_UNLOCK_NOTIFY + /* The following variables are all protected by the STATIC_MASTER + ** mutex, not by sqlite3.mutex. They are used by code in notify.c. + ** + ** When X.pUnlockConnection==Y, that means that X is waiting for Y to + ** unlock so that it can proceed. + ** + ** When X.pBlockingConnection==Y, that means that something that X tried + ** tried to do recently failed with an SQLITE_LOCKED error due to locks + ** held by Y. + */ + sqlite3 *pBlockingConnection; /* Connection that caused SQLITE_LOCKED */ + sqlite3 *pUnlockConnection; /* Connection to watch for unlock */ + void *pUnlockArg; /* Argument to xUnlockNotify */ + void (*xUnlockNotify)(void **, int); /* Unlock notify callback */ + sqlite3 *pNextBlocked; /* Next in list of all blocked connections */ +#endif +#ifdef SQLITE_USER_AUTHENTICATION + sqlite3_userauth auth; /* User authentication information */ +#endif +}; + +/* +** A macro to discover the encoding of a database. +*/ +#define SCHEMA_ENC(db) ((db)->aDb[0].pSchema->enc) +#define ENC(db) ((db)->enc) + +/* +** Possible values for the sqlite3.flags. +** +** Value constraints (enforced via assert()): +** SQLITE_FullFSync == PAGER_FULLFSYNC +** SQLITE_CkptFullFSync == PAGER_CKPT_FULLFSYNC +** SQLITE_CacheSpill == PAGER_CACHE_SPILL +*/ +#define SQLITE_VdbeTrace 0x00000001 /* True to trace VDBE execution */ +#define SQLITE_InternChanges 0x00000002 /* Uncommitted Hash table changes */ +#define SQLITE_FullColNames 0x00000004 /* Show full column names on SELECT */ +#define SQLITE_FullFSync 0x00000008 /* Use full fsync on the backend */ +#define SQLITE_CkptFullFSync 0x00000010 /* Use full fsync for checkpoint */ +#define SQLITE_CacheSpill 0x00000020 /* OK to spill pager cache */ +#define SQLITE_ShortColNames 0x00000040 /* Show short columns names */ +#define SQLITE_CountRows 0x00000080 /* 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 */ + /* 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_VdbeAddopTrace 0x00001000 /* Trace sqlite3VdbeAddOp() calls */ +#define SQLITE_IgnoreChecks 0x00002000 /* Do not enforce check constraints */ +#define SQLITE_ReadUncommitted 0x0004000 /* For shared-cache mode */ +#define SQLITE_LegacyFileFmt 0x00008000 /* Create new databases in format 1 */ +#define SQLITE_RecoveryMode 0x00010000 /* Ignore schema errors */ +#define SQLITE_ReverseOrder 0x00020000 /* Reverse unordered SELECTs */ +#define SQLITE_RecTriggers 0x00040000 /* Enable recursive triggers */ +#define SQLITE_ForeignKeys 0x00080000 /* Enforce foreign key constraints */ +#define SQLITE_AutoIndex 0x00100000 /* Enable automatic indexes */ +#define SQLITE_PreferBuiltin 0x00200000 /* Preference to built-in funcs */ +#define SQLITE_LoadExtension 0x00400000 /* Enable load_extension */ +#define SQLITE_LoadExtFunc 0x00800000 /* Enable load_extension() SQL func */ +#define SQLITE_EnableTrigger 0x01000000 /* True to enable triggers */ +#define SQLITE_DeferFKs 0x02000000 /* Defer all FK constraints */ +#define SQLITE_QueryOnly 0x04000000 /* Disable database changes */ +#define SQLITE_VdbeEQP 0x08000000 /* Debug EXPLAIN QUERY PLAN */ +#define SQLITE_Vacuum 0x10000000 /* Currently in a VACUUM */ +#define SQLITE_CellSizeCk 0x20000000 /* Check btree cell sizes on load */ +#define SQLITE_Fts3Tokenizer 0x40000000 /* Enable fts3_tokenizer(2) */ + + +/* +** Bits of the sqlite3.dbOptFlags field that are used by the +** sqlite3_test_control(SQLITE_TESTCTRL_OPTIMIZATIONS,...) interface to +** selectively disable various optimizations. +*/ +#define SQLITE_QueryFlattener 0x0001 /* Query flattening */ +#define SQLITE_ColumnCache 0x0002 /* Column cache */ +#define SQLITE_GroupByOrder 0x0004 /* GROUPBY cover of ORDERBY */ +#define SQLITE_FactorOutConst 0x0008 /* Constant factoring */ +/* not used 0x0010 // Was: SQLITE_IdxRealAsInt */ +#define SQLITE_DistinctOpt 0x0020 /* DISTINCT using indexes */ +#define SQLITE_CoverIdxScan 0x0040 /* Covering index scans */ +#define SQLITE_OrderByIdxJoin 0x0080 /* ORDER BY of joins via index */ +#define SQLITE_SubqCoroutine 0x0100 /* Evaluate subqueries as coroutines */ +#define SQLITE_Transitive 0x0200 /* Transitive constraints */ +#define SQLITE_OmitNoopJoin 0x0400 /* Omit unused tables in joins */ +#define SQLITE_Stat34 0x0800 /* Use STAT3 or STAT4 data */ +#define SQLITE_CursorHints 0x2000 /* Add OP_CursorHint opcodes */ +#define SQLITE_AllOpts 0xffff /* All optimizations */ + +/* +** Macros for testing whether or not optimizations are enabled or disabled. +*/ +#ifndef SQLITE_OMIT_BUILTIN_TEST +#define OptimizationDisabled(db, mask) (((db)->dbOptFlags&(mask))!=0) +#define OptimizationEnabled(db, mask) (((db)->dbOptFlags&(mask))==0) +#else +#define OptimizationDisabled(db, mask) 0 +#define OptimizationEnabled(db, mask) 1 +#endif + +/* +** Return true if it OK to factor constant expressions into the initialization +** code. The argument is a Parse object for the code generator. +*/ +#define ConstFactorOk(P) ((P)->okConstFactor) + +/* +** Possible values for the sqlite.magic field. +** The numbers are obtained at random and have no special meaning, other +** than being distinct from one another. +*/ +#define SQLITE_MAGIC_OPEN 0xa029a697 /* Database is open */ +#define SQLITE_MAGIC_CLOSED 0x9f3c2d33 /* Database is closed */ +#define SQLITE_MAGIC_SICK 0x4b771290 /* Error and awaiting close */ +#define SQLITE_MAGIC_BUSY 0xf03b7906 /* Database currently in use */ +#define SQLITE_MAGIC_ERROR 0xb5357930 /* An SQLITE_MISUSE error occurred */ +#define SQLITE_MAGIC_ZOMBIE 0x64cffc7f /* Close with last statement close */ + +/* +** Each SQL function is defined by an instance of the following +** structure. For global built-in functions (ex: substr(), max(), count()) +** a pointer to this structure is held in the sqlite3BuiltinFunctions object. +** For per-connection application-defined functions, a pointer to this +** structure is held in the db->aHash hash table. +** +** The u.pHash field is used by the global built-ins. The u.pDestructor +** field is used by per-connection app-def functions. +*/ +struct FuncDef { + i8 nArg; /* Number of arguments. -1 means unlimited */ + u16 funcFlags; /* Some combination of SQLITE_FUNC_* */ + void *pUserData; /* User data parameter */ + FuncDef *pNext; /* Next function with same name */ + void (*xSFunc)(sqlite3_context*,int,sqlite3_value**); /* func or agg-step */ + void (*xFinalize)(sqlite3_context*); /* Agg finalizer */ + const char *zName; /* SQL name of the function. */ + union { + FuncDef *pHash; /* Next with a different name but the same hash */ + FuncDestructor *pDestructor; /* Reference counted destructor function */ + } u; +}; + +/* +** This structure encapsulates a user-function destructor callback (as +** configured using create_function_v2()) and a reference counter. When +** create_function_v2() is called to create a function with a destructor, +** a single object of this type is allocated. FuncDestructor.nRef is set to +** the number of FuncDef objects created (either 1 or 3, depending on whether +** or not the specified encoding is SQLITE_ANY). The FuncDef.pDestructor +** member of each of the new FuncDef objects is set to point to the allocated +** FuncDestructor. +** +** Thereafter, when one of the FuncDef objects is deleted, the reference +** count on this object is decremented. When it reaches 0, the destructor +** is invoked and the FuncDestructor structure freed. +*/ +struct FuncDestructor { + int nRef; + void (*xDestroy)(void *); + void *pUserData; +}; + +/* +** Possible values for FuncDef.flags. Note that the _LENGTH and _TYPEOF +** values must correspond to OPFLAG_LENGTHARG and OPFLAG_TYPEOFARG. And +** SQLITE_FUNC_CONSTANT must be the same as SQLITE_DETERMINISTIC. There +** are assert() statements in the code to verify this. +** +** Value constraints (enforced via assert()): +** SQLITE_FUNC_MINMAX == NC_MinMaxAgg == SF_MinMaxAgg +** SQLITE_FUNC_LENGTH == OPFLAG_LENGTHARG +** SQLITE_FUNC_TYPEOF == OPFLAG_TYPEOFARG +** SQLITE_FUNC_CONSTANT == SQLITE_DETERMINISTIC from the API +** SQLITE_FUNC_ENCMASK depends on SQLITE_UTF* macros in the API +*/ +#define SQLITE_FUNC_ENCMASK 0x0003 /* SQLITE_UTF8, SQLITE_UTF16BE or UTF16LE */ +#define SQLITE_FUNC_LIKE 0x0004 /* Candidate for the LIKE optimization */ +#define SQLITE_FUNC_CASE 0x0008 /* Case-sensitive LIKE-type function */ +#define SQLITE_FUNC_EPHEM 0x0010 /* Ephemeral. Delete with VDBE */ +#define SQLITE_FUNC_NEEDCOLL 0x0020 /* sqlite3GetFuncCollSeq() might be called*/ +#define SQLITE_FUNC_LENGTH 0x0040 /* Built-in length() function */ +#define SQLITE_FUNC_TYPEOF 0x0080 /* Built-in typeof() function */ +#define SQLITE_FUNC_COUNT 0x0100 /* Built-in count(*) aggregate */ +#define SQLITE_FUNC_COALESCE 0x0200 /* Built-in coalesce() or ifnull() */ +#define SQLITE_FUNC_UNLIKELY 0x0400 /* Built-in unlikely() function */ +#define SQLITE_FUNC_CONSTANT 0x0800 /* Constant inputs give a constant output */ +#define SQLITE_FUNC_MINMAX 0x1000 /* True for min() and max() aggregates */ +#define SQLITE_FUNC_SLOCHNG 0x2000 /* "Slow Change". Value constant during a + ** single query - might change over time */ + +/* +** The following three macros, FUNCTION(), LIKEFUNC() and AGGREGATE() are +** used to create the initializers for the FuncDef structures. +** +** FUNCTION(zName, nArg, iArg, bNC, xFunc) +** Used to create a scalar function definition of a function zName +** implemented by C function xFunc that accepts nArg arguments. The +** value passed as iArg is cast to a (void*) and made available +** as the user-data (sqlite3_user_data()) for the function. If +** argument bNC is true, then the SQLITE_FUNC_NEEDCOLL flag is set. +** +** VFUNCTION(zName, nArg, iArg, bNC, xFunc) +** Like FUNCTION except it omits the SQLITE_FUNC_CONSTANT flag. +** +** DFUNCTION(zName, nArg, iArg, bNC, xFunc) +** Like FUNCTION except it omits the SQLITE_FUNC_CONSTANT flag and +** adds the SQLITE_FUNC_SLOCHNG flag. Used for date & time functions +** and functions like sqlite_version() that can change, but not during +** a single query. +** +** AGGREGATE(zName, nArg, iArg, bNC, xStep, xFinal) +** Used to create an aggregate function definition implemented by +** the C functions xStep and xFinal. The first four parameters +** are interpreted in the same way as the first 4 parameters to +** FUNCTION(). +** +** LIKEFUNC(zName, nArg, pArg, flags) +** Used to create a scalar function definition of a function zName +** that accepts nArg arguments and is implemented by a call to C +** function likeFunc. Argument pArg is cast to a (void *) and made +** available as the function user-data (sqlite3_user_data()). The +** FuncDef.flags variable is set to the value passed as the flags +** parameter. +*/ +#define FUNCTION(zName, nArg, iArg, bNC, xFunc) \ + {nArg, SQLITE_FUNC_CONSTANT|SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL), \ + SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, #zName, {0} } +#define VFUNCTION(zName, nArg, iArg, bNC, xFunc) \ + {nArg, SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL), \ + SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, #zName, {0} } +#define DFUNCTION(zName, nArg, iArg, bNC, xFunc) \ + {nArg, SQLITE_FUNC_SLOCHNG|SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL), \ + SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, #zName, {0} } +#define FUNCTION2(zName, nArg, iArg, bNC, xFunc, extraFlags) \ + {nArg,SQLITE_FUNC_CONSTANT|SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL)|extraFlags,\ + SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, #zName, {0} } +#define STR_FUNCTION(zName, nArg, pArg, bNC, xFunc) \ + {nArg, SQLITE_FUNC_SLOCHNG|SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL), \ + pArg, 0, xFunc, 0, #zName, } +#define LIKEFUNC(zName, nArg, arg, flags) \ + {nArg, SQLITE_FUNC_CONSTANT|SQLITE_UTF8|flags, \ + (void *)arg, 0, likeFunc, 0, #zName, {0} } +#define AGGREGATE(zName, nArg, arg, nc, xStep, xFinal) \ + {nArg, SQLITE_UTF8|(nc*SQLITE_FUNC_NEEDCOLL), \ + SQLITE_INT_TO_PTR(arg), 0, xStep,xFinal,#zName, {0}} +#define AGGREGATE2(zName, nArg, arg, nc, xStep, xFinal, extraFlags) \ + {nArg, SQLITE_UTF8|(nc*SQLITE_FUNC_NEEDCOLL)|extraFlags, \ + SQLITE_INT_TO_PTR(arg), 0, xStep,xFinal,#zName, {0}} + +/* +** All current savepoints are stored in a linked list starting at +** sqlite3.pSavepoint. The first element in the list is the most recently +** opened savepoint. Savepoints are added to the list by the vdbe +** OP_Savepoint instruction. +*/ +struct Savepoint { + char *zName; /* Savepoint name (nul-terminated) */ + i64 nDeferredCons; /* Number of deferred fk violations */ + i64 nDeferredImmCons; /* Number of deferred imm fk. */ + Savepoint *pNext; /* Parent savepoint (if any) */ +}; + +/* +** The following are used as the second parameter to sqlite3Savepoint(), +** and as the P1 argument to the OP_Savepoint instruction. +*/ +#define SAVEPOINT_BEGIN 0 +#define SAVEPOINT_RELEASE 1 +#define SAVEPOINT_ROLLBACK 2 + + +/* +** Each SQLite module (virtual table definition) is defined by an +** instance of the following structure, stored in the sqlite3.aModule +** hash table. +*/ +struct Module { + const sqlite3_module *pModule; /* Callback pointers */ + const char *zName; /* Name passed to create_module() */ + void *pAux; /* pAux passed to create_module() */ + void (*xDestroy)(void *); /* Module destructor function */ + Table *pEpoTab; /* Eponymous table for this module */ +}; + +/* +** information about each column of an SQL table is held in an instance +** of this structure. +*/ +struct Column { + char *zName; /* Name of this column, \000, then the type */ + Expr *pDflt; /* Default value of this column */ + char *zColl; /* Collating sequence. If NULL, use the default */ + u8 notNull; /* An OE_ code for handling a NOT NULL constraint */ + char affinity; /* One of the SQLITE_AFF_... values */ + u8 szEst; /* Estimated size of value in this column. sizeof(INT)==1 */ + u8 colFlags; /* Boolean properties. See COLFLAG_ defines below */ +}; + +/* Allowed values for Column.colFlags: +*/ +#define COLFLAG_PRIMKEY 0x0001 /* Column is part of the primary key */ +#define COLFLAG_HIDDEN 0x0002 /* A hidden column in a virtual table */ +#define COLFLAG_HASTYPE 0x0004 /* Type name follows column name */ + +/* +** A "Collating Sequence" is defined by an instance of the following +** structure. Conceptually, a collating sequence consists of a name and +** a comparison routine that defines the order of that sequence. +** +** If CollSeq.xCmp is NULL, it means that the +** collating sequence is undefined. Indices built on an undefined +** collating sequence may not be read or written. +*/ +struct CollSeq { + char *zName; /* Name of the collating sequence, UTF-8 encoded */ + u8 enc; /* Text encoding handled by xCmp() */ + void *pUser; /* First argument to xCmp() */ + int (*xCmp)(void*,int, const void*, int, const void*); + void (*xDel)(void*); /* Destructor for pUser */ +}; + +/* +** A sort order can be either ASC or DESC. +*/ +#define SQLITE_SO_ASC 0 /* Sort in ascending order */ +#define SQLITE_SO_DESC 1 /* Sort in ascending order */ +#define SQLITE_SO_UNDEFINED -1 /* No sort order specified */ + +/* +** Column affinity types. +** +** These used to have mnemonic name like 'i' for SQLITE_AFF_INTEGER and +** 't' for SQLITE_AFF_TEXT. But we can save a little space and improve +** the speed a little by numbering the values consecutively. +** +** But rather than start with 0 or 1, we begin with 'A'. That way, +** when multiple affinity types are concatenated into a string and +** used as the P4 operand, they will be more readable. +** +** Note also that the numeric types are grouped together so that testing +** for a numeric type is a single comparison. And the BLOB type is first. +*/ +#define SQLITE_AFF_BLOB 'A' +#define SQLITE_AFF_TEXT 'B' +#define SQLITE_AFF_NUMERIC 'C' +#define SQLITE_AFF_INTEGER 'D' +#define SQLITE_AFF_REAL 'E' + +#define sqlite3IsNumericAffinity(X) ((X)>=SQLITE_AFF_NUMERIC) + +/* +** The SQLITE_AFF_MASK values masks off the significant bits of an +** affinity value. +*/ +#define SQLITE_AFF_MASK 0x47 + +/* +** Additional bit values that can be ORed with an affinity without +** changing the affinity. +** +** The SQLITE_NOTNULL flag is a combination of NULLEQ and JUMPIFNULL. +** It causes an assert() to fire if either operand to a comparison +** operator is NULL. It is added to certain comparison operators to +** prove that the operands are always NOT NULL. +*/ +#define SQLITE_KEEPNULL 0x08 /* Used by vector == or <> */ +#define SQLITE_JUMPIFNULL 0x10 /* jumps if either operand is NULL */ +#define SQLITE_STOREP2 0x20 /* Store result in reg[P2] rather than jump */ +#define SQLITE_NULLEQ 0x80 /* NULL=NULL */ +#define SQLITE_NOTNULL 0x90 /* Assert that operands are never NULL */ + +/* +** An object of this type is created for each virtual table present in +** the database schema. +** +** If the database schema is shared, then there is one instance of this +** structure for each database connection (sqlite3*) that uses the shared +** schema. This is because each database connection requires its own unique +** instance of the sqlite3_vtab* handle used to access the virtual table +** implementation. sqlite3_vtab* handles can not be shared between +** database connections, even when the rest of the in-memory database +** schema is shared, as the implementation often stores the database +** connection handle passed to it via the xConnect() or xCreate() method +** during initialization internally. This database connection handle may +** then be used by the virtual table implementation to access real tables +** within the database. So that they appear as part of the callers +** transaction, these accesses need to be made via the same database +** connection as that used to execute SQL operations on the virtual table. +** +** All VTable objects that correspond to a single table in a shared +** database schema are initially stored in a linked-list pointed to by +** the Table.pVTable member variable of the corresponding Table object. +** When an sqlite3_prepare() operation is required to access the virtual +** table, it searches the list for the VTable that corresponds to the +** database connection doing the preparing so as to use the correct +** sqlite3_vtab* handle in the compiled query. +** +** When an in-memory Table object is deleted (for example when the +** schema is being reloaded for some reason), the VTable objects are not +** deleted and the sqlite3_vtab* handles are not xDisconnect()ed +** immediately. Instead, they are moved from the Table.pVTable list to +** another linked list headed by the sqlite3.pDisconnect member of the +** corresponding sqlite3 structure. They are then deleted/xDisconnected +** next time a statement is prepared using said sqlite3*. This is done +** to avoid deadlock issues involving multiple sqlite3.mutex mutexes. +** Refer to comments above function sqlite3VtabUnlockList() for an +** explanation as to why it is safe to add an entry to an sqlite3.pDisconnect +** list without holding the corresponding sqlite3.mutex mutex. +** +** The memory for objects of this type is always allocated by +** sqlite3DbMalloc(), using the connection handle stored in VTable.db as +** the first argument. +*/ +struct VTable { + sqlite3 *db; /* Database connection associated with this table */ + Module *pMod; /* Pointer to module implementation */ + sqlite3_vtab *pVtab; /* Pointer to vtab instance */ + int nRef; /* Number of pointers to this structure */ + u8 bConstraint; /* True if constraints are supported */ + int iSavepoint; /* Depth of the SAVEPOINT stack */ + VTable *pNext; /* Next in linked list (see above) */ +}; + +/* +** The schema for each SQL table and view is represented in memory +** by an instance of the following structure. +*/ +struct Table { + char *zName; /* Name of the table or view */ + Column *aCol; /* Information about each column */ + Index *pIndex; /* List of SQL indexes on this table. */ + Select *pSelect; /* NULL for tables. Points to definition if a view. */ + FKey *pFKey; /* Linked list of all foreign keys in this table */ + char *zColAff; /* String defining the affinity of each column */ + ExprList *pCheck; /* All CHECK constraints */ + /* ... also used as column name list in a VIEW */ + int tnum; /* Root BTree page for this table */ + i16 iPKey; /* If not negative, use aCol[iPKey] as the rowid */ + i16 nCol; /* Number of columns in this table */ + u16 nRef; /* Number of pointers to this Table */ + LogEst nRowLogEst; /* Estimated rows in table - from sqlite_stat1 table */ + LogEst szTabRow; /* Estimated size of each table row in bytes */ +#ifdef SQLITE_ENABLE_COSTMULT + LogEst costMult; /* Cost multiplier for using this table */ +#endif + u8 tabFlags; /* Mask of TF_* values */ + u8 keyConf; /* What to do in case of uniqueness conflict on iPKey */ +#ifndef SQLITE_OMIT_ALTERTABLE + int addColOffset; /* Offset in CREATE TABLE stmt to add a new column */ +#endif +#ifndef SQLITE_OMIT_VIRTUALTABLE + int nModuleArg; /* Number of arguments to the module */ + char **azModuleArg; /* 0: module 1: schema 2: vtab name 3...: args */ + VTable *pVTable; /* List of VTable objects. */ +#endif + Trigger *pTrigger; /* List of triggers stored in pSchema */ + Schema *pSchema; /* Schema that contains this table */ + Table *pNextZombie; /* Next on the Parse.pZombieTab list */ +}; + +/* +** Allowed values for Table.tabFlags. +** +** TF_OOOHidden applies to tables or view that have hidden columns that are +** followed by non-hidden columns. Example: "CREATE VIRTUAL TABLE x USING +** vtab1(a HIDDEN, b);". Since "b" is a non-hidden column but "a" is hidden, +** the TF_OOOHidden attribute would apply in this case. Such tables require +** special handling during INSERT processing. +*/ +#define TF_Readonly 0x01 /* Read-only system table */ +#define TF_Ephemeral 0x02 /* An ephemeral table */ +#define TF_HasPrimaryKey 0x04 /* Table has a primary key */ +#define TF_Autoincrement 0x08 /* Integer primary key is autoincrement */ +#define TF_Virtual 0x10 /* Is a virtual table */ +#define TF_WithoutRowid 0x20 /* No rowid. PRIMARY KEY is the key */ +#define TF_NoVisibleRowid 0x40 /* No user-visible "rowid" column */ +#define TF_OOOHidden 0x80 /* Out-of-Order hidden columns */ + + +/* +** Test to see whether or not a table is a virtual table. This is +** done as a macro so that it will be optimized out when virtual +** table support is omitted from the build. +*/ +#ifndef SQLITE_OMIT_VIRTUALTABLE +# define IsVirtual(X) (((X)->tabFlags & TF_Virtual)!=0) +#else +# define IsVirtual(X) 0 +#endif + +/* +** Macros to determine if a column is hidden. IsOrdinaryHiddenColumn() +** only works for non-virtual tables (ordinary tables and views) and is +** always false unless SQLITE_ENABLE_HIDDEN_COLUMNS is defined. The +** IsHiddenColumn() macro is general purpose. +*/ +#if defined(SQLITE_ENABLE_HIDDEN_COLUMNS) +# define IsHiddenColumn(X) (((X)->colFlags & COLFLAG_HIDDEN)!=0) +# define IsOrdinaryHiddenColumn(X) (((X)->colFlags & COLFLAG_HIDDEN)!=0) +#elif !defined(SQLITE_OMIT_VIRTUALTABLE) +# define IsHiddenColumn(X) (((X)->colFlags & COLFLAG_HIDDEN)!=0) +# define IsOrdinaryHiddenColumn(X) 0 +#else +# define IsHiddenColumn(X) 0 +# define IsOrdinaryHiddenColumn(X) 0 +#endif + + +/* Does the table have a rowid */ +#define HasRowid(X) (((X)->tabFlags & TF_WithoutRowid)==0) +#define VisibleRowid(X) (((X)->tabFlags & TF_NoVisibleRowid)==0) + +/* +** Each foreign key constraint is an instance of the following structure. +** +** A foreign key is associated with two tables. The "from" table is +** the table that contains the REFERENCES clause that creates the foreign +** key. The "to" table is the table that is named in the REFERENCES clause. +** Consider this example: +** +** CREATE TABLE ex1( +** a INTEGER PRIMARY KEY, +** b INTEGER CONSTRAINT fk1 REFERENCES ex2(x) +** ); +** +** For foreign key "fk1", the from-table is "ex1" and the to-table is "ex2". +** Equivalent names: +** +** from-table == child-table +** to-table == parent-table +** +** Each REFERENCES clause generates an instance of the following structure +** which is attached to the from-table. The to-table need not exist when +** the from-table is created. The existence of the to-table is not checked. +** +** The list of all parents for child Table X is held at X.pFKey. +** +** A list of all children for a table named Z (which might not even exist) +** is held in Schema.fkeyHash with a hash key of Z. +*/ +struct FKey { + Table *pFrom; /* Table containing the REFERENCES clause (aka: Child) */ + FKey *pNextFrom; /* Next FKey with the same in pFrom. Next parent of pFrom */ + char *zTo; /* Name of table that the key points to (aka: Parent) */ + FKey *pNextTo; /* Next with the same zTo. Next child of zTo. */ + FKey *pPrevTo; /* Previous with the same zTo */ + int nCol; /* Number of columns in this key */ + /* EV: R-30323-21917 */ + u8 isDeferred; /* True if constraint checking is deferred till COMMIT */ + u8 aAction[2]; /* ON DELETE and ON UPDATE actions, respectively */ + Trigger *apTrigger[2];/* Triggers for aAction[] actions */ + struct sColMap { /* Mapping of columns in pFrom to columns in zTo */ + int iFrom; /* Index of column in pFrom */ + char *zCol; /* Name of column in zTo. If NULL use PRIMARY KEY */ + } aCol[1]; /* One entry for each of nCol columns */ +}; + +/* +** SQLite supports many different ways to resolve a constraint +** error. ROLLBACK processing means that a constraint violation +** causes the operation in process to fail and for the current transaction +** to be rolled back. ABORT processing means the operation in process +** fails and any prior changes from that one operation are backed out, +** but the transaction is not rolled back. FAIL processing means that +** the operation in progress stops and returns an error code. But prior +** changes due to the same operation are not backed out and no rollback +** occurs. IGNORE means that the particular row that caused the constraint +** error is not inserted or updated. Processing continues and no error +** is returned. REPLACE means that preexisting database rows that caused +** a UNIQUE constraint violation are removed so that the new insert or +** update can proceed. Processing continues and no error is reported. +** +** RESTRICT, SETNULL, and CASCADE actions apply only to foreign keys. +** RESTRICT is the same as ABORT for IMMEDIATE foreign keys and the +** same as ROLLBACK for DEFERRED keys. SETNULL means that the foreign +** key is set to NULL. CASCADE means that a DELETE or UPDATE of the +** referenced table row is propagated into the row that holds the +** foreign key. +** +** The following symbolic values are used to record which type +** of action to take. +*/ +#define OE_None 0 /* There is no constraint to check */ +#define OE_Rollback 1 /* Fail the operation and rollback the transaction */ +#define OE_Abort 2 /* Back out changes but do no rollback transaction */ +#define OE_Fail 3 /* Stop the operation but leave all prior changes */ +#define OE_Ignore 4 /* Ignore the error. Do not do the INSERT or UPDATE */ +#define OE_Replace 5 /* Delete existing record, then do INSERT or UPDATE */ + +#define OE_Restrict 6 /* OE_Abort for IMMEDIATE, OE_Rollback for DEFERRED */ +#define OE_SetNull 7 /* Set the foreign key value to NULL */ +#define OE_SetDflt 8 /* Set the foreign key value to its default */ +#define OE_Cascade 9 /* Cascade the changes */ + +#define OE_Default 10 /* Do whatever the default action is */ + + +/* +** An instance of the following structure is passed as the first +** argument to sqlite3VdbeKeyCompare and is used to control the +** comparison of the two index keys. +** +** Note that aSortOrder[] and aColl[] have nField+1 slots. There +** are nField slots for the columns of an index then one extra slot +** for the rowid at the end. +*/ +struct KeyInfo { + u32 nRef; /* Number of references to this KeyInfo object */ + u8 enc; /* Text encoding - one of the SQLITE_UTF* values */ + u16 nField; /* Number of key columns in the index */ + u16 nXField; /* Number of columns beyond the key columns */ + sqlite3 *db; /* The database connection */ + u8 *aSortOrder; /* Sort order for each column. */ + CollSeq *aColl[1]; /* Collating sequence for each term of the key */ +}; + +/* +** This object holds a record which has been parsed out into individual +** fields, for the purposes of doing a comparison. +** +** A record is an object that contains one or more fields of data. +** Records are used to store the content of a table row and to store +** the key of an index. A blob encoding of a record is created by +** the OP_MakeRecord opcode of the VDBE and is disassembled by the +** OP_Column opcode. +** +** An instance of this object serves as a "key" for doing a search on +** an index b+tree. The goal of the search is to find the entry that +** is closed to the key described by this object. This object might hold +** just a prefix of the key. The number of fields is given by +** pKeyInfo->nField. +** +** The r1 and r2 fields are the values to return if this key is less than +** or greater than a key in the btree, respectively. These are normally +** -1 and +1 respectively, but might be inverted to +1 and -1 if the b-tree +** is in DESC order. +** +** The key comparison functions actually return default_rc when they find +** an equals comparison. default_rc can be -1, 0, or +1. If there are +** multiple entries in the b-tree with the same key (when only looking +** at the first pKeyInfo->nFields,) then default_rc can be set to -1 to +** cause the search to find the last match, or +1 to cause the search to +** find the first match. +** +** The key comparison functions will set eqSeen to true if they ever +** get and equal results when comparing this structure to a b-tree record. +** When default_rc!=0, the search might end up on the record immediately +** before the first match or immediately after the last match. The +** eqSeen field will indicate whether or not an exact match exists in the +** b-tree. +*/ +struct UnpackedRecord { + KeyInfo *pKeyInfo; /* Collation and sort-order information */ + Mem *aMem; /* Values */ + u16 nField; /* Number of entries in apMem[] */ + i8 default_rc; /* Comparison result if keys are equal */ + u8 errCode; /* Error detected by xRecordCompare (CORRUPT or NOMEM) */ + i8 r1; /* Value to return if (lhs > rhs) */ + i8 r2; /* Value to return if (rhs < lhs) */ + u8 eqSeen; /* True if an equality comparison has been seen */ +}; + + +/* +** Each SQL index is represented in memory by an +** instance of the following structure. +** +** The columns of the table that are to be indexed are described +** by the aiColumn[] field of this structure. For example, suppose +** we have the following table and index: +** +** CREATE TABLE Ex1(c1 int, c2 int, c3 text); +** CREATE INDEX Ex2 ON Ex1(c3,c1); +** +** In the Table structure describing Ex1, nCol==3 because there are +** three columns in the table. In the Index structure describing +** Ex2, nColumn==2 since 2 of the 3 columns of Ex1 are indexed. +** The value of aiColumn is {2, 0}. aiColumn[0]==2 because the +** first column to be indexed (c3) has an index of 2 in Ex1.aCol[]. +** The second column to be indexed (c1) has an index of 0 in +** Ex1.aCol[], hence Ex2.aiColumn[1]==0. +** +** The Index.onError field determines whether or not the indexed columns +** must be unique and what to do if they are not. When Index.onError=OE_None, +** it means this is not a unique index. Otherwise it is a unique index +** and the value of Index.onError indicate the which conflict resolution +** algorithm to employ whenever an attempt is made to insert a non-unique +** element. +** +** While parsing a CREATE TABLE or CREATE INDEX statement in order to +** generate VDBE code (as opposed to parsing one read from an sqlite_master +** table as part of parsing an existing database schema), transient instances +** of this structure may be created. In this case the Index.tnum variable is +** used to store the address of a VDBE instruction, not a database page +** number (it cannot - the database page is not allocated until the VDBE +** program is executed). See convertToWithoutRowidTable() for details. +*/ +struct Index { + char *zName; /* Name of this index */ + i16 *aiColumn; /* Which columns are used by this index. 1st is 0 */ + LogEst *aiRowLogEst; /* From ANALYZE: Est. rows selected by each column */ + Table *pTable; /* The SQL table being indexed */ + char *zColAff; /* String defining the affinity of each column */ + Index *pNext; /* The next index associated with the same table */ + Schema *pSchema; /* Schema containing this index */ + u8 *aSortOrder; /* for each column: True==DESC, False==ASC */ + const char **azColl; /* Array of collation sequence names for index */ + Expr *pPartIdxWhere; /* WHERE clause for partial indices */ + ExprList *aColExpr; /* Column expressions */ + int tnum; /* DB Page containing root of this index */ + LogEst szIdxRow; /* Estimated average row size in bytes */ + u16 nKeyCol; /* Number of columns forming the key */ + u16 nColumn; /* Number of columns stored in the index */ + u8 onError; /* OE_Abort, OE_Ignore, OE_Replace, or OE_None */ + unsigned idxType:2; /* 1==UNIQUE, 2==PRIMARY KEY, 0==CREATE INDEX */ + unsigned bUnordered:1; /* Use this index for == or IN queries only */ + unsigned uniqNotNull:1; /* True if UNIQUE and NOT NULL for all columns */ + unsigned isResized:1; /* True if resizeIndexObject() has been called */ + unsigned isCovering:1; /* True if this is a covering index */ + unsigned noSkipScan:1; /* Do not try to use skip-scan if true */ +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 + int nSample; /* Number of elements in aSample[] */ + int nSampleCol; /* Size of IndexSample.anEq[] and so on */ + tRowcnt *aAvgEq; /* Average nEq values for keys not in aSample */ + IndexSample *aSample; /* Samples of the left-most key */ + tRowcnt *aiRowEst; /* Non-logarithmic stat1 data for this index */ + tRowcnt nRowEst0; /* Non-logarithmic number of rows in the index */ +#endif +}; + +/* +** Allowed values for Index.idxType +*/ +#define SQLITE_IDXTYPE_APPDEF 0 /* Created using CREATE INDEX */ +#define SQLITE_IDXTYPE_UNIQUE 1 /* Implements a UNIQUE constraint */ +#define SQLITE_IDXTYPE_PRIMARYKEY 2 /* Is the PRIMARY KEY for the table */ + +/* Return true if index X is a PRIMARY KEY index */ +#define IsPrimaryKeyIndex(X) ((X)->idxType==SQLITE_IDXTYPE_PRIMARYKEY) + +/* Return true if index X is a UNIQUE index */ +#define IsUniqueIndex(X) ((X)->onError!=OE_None) + +/* The Index.aiColumn[] values are normally positive integer. But +** there are some negative values that have special meaning: +*/ +#define XN_ROWID (-1) /* Indexed column is the rowid */ +#define XN_EXPR (-2) /* Indexed column is an expression */ + +/* +** Each sample stored in the sqlite_stat3 table is represented in memory +** using a structure of this type. See documentation at the top of the +** analyze.c source file for additional information. +*/ +struct IndexSample { + void *p; /* Pointer to sampled record */ + int n; /* Size of record in bytes */ + tRowcnt *anEq; /* Est. number of rows where the key equals this sample */ + tRowcnt *anLt; /* Est. number of rows where key is less than this sample */ + tRowcnt *anDLt; /* Est. number of distinct keys less than this sample */ +}; + +/* +** Each token coming out of the lexer is an instance of +** this structure. Tokens are also used as part of an expression. +** +** Note if Token.z==0 then Token.dyn and Token.n are undefined and +** may contain random values. Do not make any assumptions about Token.dyn +** and Token.n when Token.z==0. +*/ +struct Token { + const char *z; /* Text of the token. Not NULL-terminated! */ + unsigned int n; /* Number of characters in this token */ +}; + +/* +** An instance of this structure contains information needed to generate +** code for a SELECT that contains aggregate functions. +** +** If Expr.op==TK_AGG_COLUMN or TK_AGG_FUNCTION then Expr.pAggInfo is a +** pointer to this structure. The Expr.iColumn field is the index in +** AggInfo.aCol[] or AggInfo.aFunc[] of information needed to generate +** code for that node. +** +** AggInfo.pGroupBy and AggInfo.aFunc.pExpr point to fields within the +** original Select structure that describes the SELECT statement. These +** fields do not need to be freed when deallocating the AggInfo structure. +*/ +struct AggInfo { + u8 directMode; /* Direct rendering mode means take data directly + ** from source tables rather than from accumulators */ + u8 useSortingIdx; /* In direct mode, reference the sorting index rather + ** than the source table */ + int sortingIdx; /* Cursor number of the sorting index */ + int sortingIdxPTab; /* Cursor number of pseudo-table */ + int nSortingColumn; /* Number of columns in the sorting index */ + int mnReg, mxReg; /* Range of registers allocated for aCol and aFunc */ + ExprList *pGroupBy; /* The group by clause */ + struct AggInfo_col { /* For each column used in source tables */ + Table *pTab; /* Source table */ + int iTable; /* Cursor number of the source table */ + int iColumn; /* Column number within the source table */ + int iSorterColumn; /* Column number in the sorting index */ + int iMem; /* Memory location that acts as accumulator */ + Expr *pExpr; /* The original expression */ + } *aCol; + int nColumn; /* Number of used entries in aCol[] */ + int nAccumulator; /* Number of columns that show through to the output. + ** Additional columns are used only as parameters to + ** aggregate functions */ + struct AggInfo_func { /* For each aggregate function */ + Expr *pExpr; /* Expression encoding the function */ + FuncDef *pFunc; /* The aggregate function implementation */ + int iMem; /* Memory location that acts as accumulator */ + int iDistinct; /* Ephemeral table used to enforce DISTINCT */ + } *aFunc; + int nFunc; /* Number of entries in 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. +** +** Expr.op is the opcode. The integer parser token codes are reused +** as opcodes here. For example, the parser defines TK_GE to be an integer +** code representing the ">=" operator. This same integer code is reused +** to represent the greater-than-or-equal-to operator in the expression +** tree. +** +** If the expression is an SQL literal (TK_INTEGER, TK_FLOAT, TK_BLOB, +** or TK_STRING), then Expr.token contains the text of the SQL literal. If +** the expression is a variable (TK_VARIABLE), then Expr.token contains the +** variable name. Finally, if the expression is an SQL function (TK_FUNCTION), +** then Expr.token contains the name of the function. +** +** Expr.pRight and Expr.pLeft are the left and right subexpressions of a +** binary operator. Either or both may be NULL. +** +** Expr.x.pList is a list of arguments if the expression is an SQL function, +** a CASE expression or an IN expression of the form " IN (, ...)". +** Expr.x.pSelect is used if the expression is a sub-select or an expression of +** the form " IN (SELECT ...)". If the EP_xIsSelect bit is set in the +** Expr.flags mask, then Expr.x.pSelect is valid. Otherwise, Expr.x.pList is +** valid. +** +** An expression of the form ID or ID.ID refers to a column in a table. +** For such expressions, Expr.op is set to TK_COLUMN and Expr.iTable is +** the integer cursor number of a VDBE cursor pointing to that table and +** Expr.iColumn is the column number for the specific column. If the +** expression is used as a result in an aggregate SELECT, then the +** value is also stored in the Expr.iAgg column in the aggregate so that +** it can be accessed after all aggregates are computed. +** +** If the expression is an unbound variable marker (a question mark +** character '?' in the original SQL) then the Expr.iTable holds the index +** number for that variable. +** +** If the expression is a subquery then Expr.iColumn holds an integer +** register number containing the result of the subquery. If the +** subquery gives a constant result, then iTable is -1. If the subquery +** gives a different answer at different times during statement processing +** then iTable is the address of a subroutine that computes the subquery. +** +** If the Expr is of type OP_Column, and the table it is selecting from +** is a disk table or the "old.*" pseudo-table, then pTab points to the +** corresponding table definition. +** +** ALLOCATION NOTES: +** +** Expr objects can use a lot of memory space in database schema. To +** help reduce memory requirements, sometimes an Expr object will be +** truncated. And to reduce the number of memory allocations, sometimes +** two or more Expr objects will be stored in a single memory allocation, +** together with Expr.zToken strings. +** +** If the EP_Reduced and EP_TokenOnly flags are set when +** an Expr object is truncated. When EP_Reduced is set, then all +** the child Expr objects in the Expr.pLeft and Expr.pRight subtrees +** are contained within the same memory allocation. Note, however, that +** the subtrees in Expr.x.pList or Expr.x.pSelect are always separately +** allocated, regardless of whether or not EP_Reduced is set. +*/ +struct Expr { + u8 op; /* Operation performed by this node */ + char affinity; /* The affinity of the column or 0 if not a column */ + u32 flags; /* Various flags. EP_* See below */ + union { + char *zToken; /* Token value. Zero terminated and dequoted */ + int iValue; /* Non-negative integer value if EP_IntValue */ + } u; + + /* If the EP_TokenOnly flag is set in the Expr.flags mask, then no + ** space is allocated for the fields below this point. An attempt to + ** access them will result in a segfault or malfunction. + *********************************************************************/ + + Expr *pLeft; /* Left subnode */ + Expr *pRight; /* Right subnode */ + union { + ExprList *pList; /* op = IN, EXISTS, SELECT, CASE, FUNCTION, BETWEEN */ + Select *pSelect; /* EP_xIsSelect and op = IN, EXISTS, SELECT */ + } x; + + /* If the EP_Reduced flag is set in the Expr.flags mask, then no + ** space is allocated for the fields below this point. An attempt to + ** access them will result in a segfault or malfunction. + *********************************************************************/ + +#if SQLITE_MAX_EXPR_DEPTH>0 + int nHeight; /* Height of the tree headed by this node */ +#endif + int iTable; /* TK_COLUMN: cursor number of table holding column + ** TK_REGISTER: register number + ** TK_TRIGGER: 1 -> new, 0 -> old + ** EP_Unlikely: 134217728 times likelihood + ** TK_SELECT: 1st register of result vector */ + ynVar iColumn; /* TK_COLUMN: column index. -1 for rowid. + ** TK_VARIABLE: variable number (always >= 1). + ** TK_SELECT_COLUMN: column of the result vector */ + i16 iAgg; /* Which entry in pAggInfo->aCol[] or ->aFunc[] */ + i16 iRightJoinTable; /* If EP_FromJoin, the right table of the join */ + u8 op2; /* TK_REGISTER: original value of Expr.op + ** TK_COLUMN: the value of p5 for OP_Column + ** TK_AGG_FUNCTION: nesting depth */ + AggInfo *pAggInfo; /* Used by TK_AGG_COLUMN and TK_AGG_FUNCTION */ + Table *pTab; /* Table for TK_COLUMN expressions. */ +}; + +/* +** The following are the meanings of bits in the Expr.flags field. +*/ +#define EP_FromJoin 0x000001 /* Originates in ON/USING clause of outer join */ +#define EP_Agg 0x000002 /* Contains one or more aggregate functions */ +#define EP_Resolved 0x000004 /* IDs have been resolved to COLUMNs */ +#define EP_Error 0x000008 /* Expression contains one or more errors */ +#define EP_Distinct 0x000010 /* Aggregate function with DISTINCT keyword */ +#define EP_VarSelect 0x000020 /* pSelect is correlated, not constant */ +#define EP_DblQuoted 0x000040 /* token.z was originally in "..." */ +#define EP_InfixFunc 0x000080 /* True for an infix function: LIKE, GLOB, etc */ +#define EP_Collate 0x000100 /* Tree contains a TK_COLLATE operator */ +#define EP_Generic 0x000200 /* Ignore COLLATE or affinity on this tree */ +#define EP_IntValue 0x000400 /* Integer value contained in u.iValue */ +#define EP_xIsSelect 0x000800 /* x.pSelect is valid (otherwise x.pList is) */ +#define EP_Skip 0x001000 /* COLLATE, AS, or UNLIKELY */ +#define EP_Reduced 0x002000 /* Expr struct EXPR_REDUCEDSIZE bytes only */ +#define EP_TokenOnly 0x004000 /* Expr struct EXPR_TOKENONLYSIZE bytes only */ +#define EP_Static 0x008000 /* Held in memory not obtained from malloc() */ +#define EP_MemToken 0x010000 /* Need to sqlite3DbFree() Expr.zToken */ +#define EP_NoReduce 0x020000 /* Cannot EXPRDUP_REDUCE this Expr */ +#define EP_Unlikely 0x040000 /* unlikely() or likelihood() function */ +#define EP_ConstFunc 0x080000 /* A SQLITE_FUNC_CONSTANT or _SLOCHNG function */ +#define EP_CanBeNull 0x100000 /* Can be null despite NOT NULL constraint */ +#define EP_Subquery 0x200000 /* Tree contains a TK_SELECT operator */ +#define EP_Alias 0x400000 /* Is an alias for a result set column */ +#define EP_Leaf 0x800000 /* Expr.pLeft, .pRight, .u.pSelect all NULL */ + +/* +** Combinations of two or more EP_* flags +*/ +#define EP_Propagate (EP_Collate|EP_Subquery) /* Propagate these bits up tree */ + +/* +** These macros can be used to test, set, or clear bits in the +** Expr.flags field. +*/ +#define ExprHasProperty(E,P) (((E)->flags&(P))!=0) +#define ExprHasAllProperty(E,P) (((E)->flags&(P))==(P)) +#define ExprSetProperty(E,P) (E)->flags|=(P) +#define ExprClearProperty(E,P) (E)->flags&=~(P) + +/* The ExprSetVVAProperty() macro is used for Verification, Validation, +** and Accreditation only. It works like ExprSetProperty() during VVA +** processes but is a no-op for delivery. +*/ +#ifdef SQLITE_DEBUG +# define ExprSetVVAProperty(E,P) (E)->flags|=(P) +#else +# define ExprSetVVAProperty(E,P) +#endif + +/* +** Macros to determine the number of bytes required by a normal Expr +** struct, an Expr struct with the EP_Reduced flag set in Expr.flags +** and an Expr struct with the EP_TokenOnly flag set. +*/ +#define EXPR_FULLSIZE sizeof(Expr) /* Full size */ +#define EXPR_REDUCEDSIZE offsetof(Expr,iTable) /* Common features */ +#define EXPR_TOKENONLYSIZE offsetof(Expr,pLeft) /* Fewer features */ + +/* +** Flags passed to the sqlite3ExprDup() function. See the header comment +** above sqlite3ExprDup() for details. +*/ +#define EXPRDUP_REDUCE 0x0001 /* Used reduced-size Expr nodes */ + +/* +** A list of expressions. Each expression may optionally have a +** name. An expr/name combination can be used in several ways, such +** as the list of "expr AS ID" fields following a "SELECT" or in the +** list of "ID = expr" items in an UPDATE. A list of expressions can +** also be used as the argument to a function, in which case the a.zName +** field is not used. +** +** By default the Expr.zSpan field holds a human-readable description of +** the expression that is used in the generation of error messages and +** column labels. In this case, Expr.zSpan is typically the text of a +** column expression as it exists in a SELECT statement. However, if +** the bSpanIsTab flag is set, then zSpan is overloaded to mean the name +** of the result column in the form: DATABASE.TABLE.COLUMN. This later +** form is used for name resolution with nested FROM clauses. +*/ +struct ExprList { + int nExpr; /* Number of expressions on the list */ + struct ExprList_item { /* For each expression in the list */ + Expr *pExpr; /* The list of expressions */ + char *zName; /* Token associated with this expression */ + char *zSpan; /* Original text of the expression */ + u8 sortOrder; /* 1 for DESC or 0 for ASC */ + unsigned done :1; /* A flag to indicate when processing is finished */ + unsigned bSpanIsTab :1; /* zSpan holds DB.TABLE.COLUMN */ + unsigned reusable :1; /* Constant expression is reusable */ + union { + struct { + u16 iOrderByCol; /* For ORDER BY, column number in result set */ + u16 iAlias; /* Index into Parse.aAlias[] for zName */ + } x; + int iConstExprReg; /* Register in which Expr value is cached */ + } u; + } *a; /* Alloc a power of two greater or equal to nExpr */ +}; + +/* +** An instance of this structure is used by the parser to record both +** the parse tree for an expression and the span of input text for an +** expression. +*/ +struct ExprSpan { + Expr *pExpr; /* The expression parse tree */ + const char *zStart; /* First character of input text */ + const char *zEnd; /* One character past the end of input text */ +}; + +/* +** An instance of this structure can hold a simple list of identifiers, +** such as the list "a,b,c" in the following statements: +** +** INSERT INTO t(a,b,c) VALUES ...; +** CREATE INDEX idx ON t(a,b,c); +** CREATE TRIGGER trig BEFORE UPDATE ON t(a,b,c) ...; +** +** The IdList.a.idx field is used when the IdList represents the list of +** column names after a table name in an INSERT statement. In the statement +** +** INSERT INTO t(a,b,c) ... +** +** If "a" is the k-th column of table "t", then IdList.a[0].idx==k. +*/ +struct IdList { + struct IdList_item { + char *zName; /* Name of the identifier */ + int idx; /* Index in some Table.aCol[] of a column named zName */ + } *a; + int nId; /* Number of identifiers on the list */ +}; + +/* +** The bitmask datatype defined below is used for various optimizations. +** +** Changing this from a 64-bit to a 32-bit type limits the number of +** tables in a join to 32 instead of 64. But it also reduces the size +** of the library by 738 bytes on ix86. +*/ +#ifdef SQLITE_BITMASK_TYPE + typedef SQLITE_BITMASK_TYPE Bitmask; +#else + typedef u64 Bitmask; +#endif + +/* +** The number of bits in a Bitmask. "BMS" means "BitMask Size". +*/ +#define BMS ((int)(sizeof(Bitmask)*8)) + +/* +** A bit in a Bitmask +*/ +#define MASKBIT(n) (((Bitmask)1)<<(n)) +#define MASKBIT32(n) (((unsigned int)1)<<(n)) +#define ALLBITS ((Bitmask)-1) + +/* +** The following structure describes the FROM clause of a SELECT statement. +** Each table or subquery in the FROM clause is a separate element of +** the SrcList.a[] array. +** +** With the addition of multiple database support, the following structure +** can also be used to describe a particular table such as the table that +** is modified by an INSERT, DELETE, or UPDATE statement. In standard SQL, +** such a table must be a simple name: ID. But in SQLite, the table can +** now be identified by a database name, a dot, then the table name: ID.ID. +** +** The jointype starts out showing the join type between the current table +** and the next table on the list. The parser builds the list this way. +** But sqlite3SrcListShiftJoinType() later shifts the jointypes so that each +** jointype expresses the join between the table and the previous table. +** +** In the colUsed field, the high-order bit (bit 63) is set if the table +** contains more than 63 columns and the 64-th or later column is used. +*/ +struct SrcList { + int nSrc; /* Number of tables or subqueries in the FROM clause */ + u32 nAlloc; /* Number of entries allocated in a[] below */ + struct SrcList_item { + Schema *pSchema; /* Schema to which this item is fixed */ + char *zDatabase; /* Name of database holding this table */ + char *zName; /* Name of the table */ + char *zAlias; /* The "B" part of a "A AS B" phrase. zName is the "A" */ + Table *pTab; /* An SQL table corresponding to zName */ + Select *pSelect; /* A SELECT statement used in place of a table name */ + int addrFillSub; /* Address of subroutine to manifest a subquery */ + int regReturn; /* Register holding return address of addrFillSub */ + int regResult; /* Registers holding results of a co-routine */ + struct { + u8 jointype; /* Type of join between this table and the previous */ + unsigned notIndexed :1; /* True if there is a NOT INDEXED clause */ + unsigned isIndexedBy :1; /* True if there is an INDEXED BY clause */ + unsigned isTabFunc :1; /* True if table-valued-function syntax */ + unsigned isCorrelated :1; /* True if sub-query is correlated */ + unsigned viaCoroutine :1; /* Implemented as a co-routine */ + unsigned isRecursive :1; /* True for recursive reference in WITH */ + } fg; +#ifndef SQLITE_OMIT_EXPLAIN + u8 iSelectId; /* If pSelect!=0, the id of the sub-select in EQP */ +#endif + int iCursor; /* The VDBE cursor number used to access this table */ + Expr *pOn; /* The ON clause of a join */ + IdList *pUsing; /* The USING clause of a join */ + Bitmask colUsed; /* Bit N (1<" clause */ + ExprList *pFuncArg; /* Arguments to table-valued-function */ + } u1; + Index *pIBIndex; /* Index structure corresponding to u1.zIndexedBy */ + } a[1]; /* One entry for each identifier on the list */ +}; + +/* +** Permitted values of the SrcList.a.jointype field +*/ +#define JT_INNER 0x0001 /* Any kind of inner or cross join */ +#define JT_CROSS 0x0002 /* Explicit use of the CROSS keyword */ +#define JT_NATURAL 0x0004 /* True for a "natural" join */ +#define JT_LEFT 0x0008 /* Left outer join */ +#define JT_RIGHT 0x0010 /* Right outer join */ +#define JT_OUTER 0x0020 /* The "OUTER" keyword is present */ +#define JT_ERROR 0x0040 /* unknown or unsupported join type */ + + +/* +** Flags appropriate for the wctrlFlags parameter of sqlite3WhereBegin() +** and the WhereInfo.wctrlFlags member. +** +** Value constraints (enforced via assert()): +** WHERE_USE_LIMIT == SF_FixedLimit +*/ +#define WHERE_ORDERBY_NORMAL 0x0000 /* No-op */ +#define WHERE_ORDERBY_MIN 0x0001 /* ORDER BY processing for min() func */ +#define WHERE_ORDERBY_MAX 0x0002 /* ORDER BY processing for max() func */ +#define WHERE_ONEPASS_DESIRED 0x0004 /* Want to do one-pass UPDATE/DELETE */ +#define WHERE_ONEPASS_MULTIROW 0x0008 /* ONEPASS is ok with multiple rows */ +#define WHERE_DUPLICATES_OK 0x0010 /* Ok to return a row more than once */ +#define WHERE_OR_SUBCLAUSE 0x0020 /* Processing a sub-WHERE as part of + ** the OR optimization */ +#define WHERE_GROUPBY 0x0040 /* pOrderBy is really a GROUP BY */ +#define WHERE_DISTINCTBY 0x0080 /* pOrderby is really a DISTINCT clause */ +#define WHERE_WANT_DISTINCT 0x0100 /* All output needs to be distinct */ +#define WHERE_SORTBYGROUP 0x0200 /* Support sqlite3WhereIsSorted() */ +#define WHERE_SEEK_TABLE 0x0400 /* Do not defer seeks on main table */ +#define WHERE_ORDERBY_LIMIT 0x0800 /* ORDERBY+LIMIT on the inner loop */ + /* 0x1000 not currently used */ + /* 0x2000 not currently used */ +#define WHERE_USE_LIMIT 0x4000 /* Use the LIMIT in cost estimates */ + /* 0x8000 not currently used */ + +/* Allowed return values from sqlite3WhereIsDistinct() +*/ +#define WHERE_DISTINCT_NOOP 0 /* DISTINCT keyword not used */ +#define WHERE_DISTINCT_UNIQUE 1 /* No duplicates */ +#define WHERE_DISTINCT_ORDERED 2 /* All duplicates are adjacent */ +#define WHERE_DISTINCT_UNORDERED 3 /* Duplicates are scattered */ + +/* +** A NameContext defines a context in which to resolve table and column +** names. The context consists of a list of tables (the pSrcList) field and +** a list of named expression (pEList). The named expression list may +** be NULL. The pSrc corresponds to the FROM clause of a SELECT or +** to the table being operated on by INSERT, UPDATE, or DELETE. The +** pEList corresponds to the result set of a SELECT and is NULL for +** other statements. +** +** NameContexts can be nested. When resolving names, the inner-most +** context is searched first. If no match is found, the next outer +** context is checked. If there is still no match, the next context +** is checked. This process continues until either a match is found +** or all contexts are check. When a match is found, the nRef member of +** the context containing the match is incremented. +** +** Each subquery gets a new NameContext. The pNext field points to the +** NameContext in the parent query. Thus the process of scanning the +** NameContext list corresponds to searching through successively outer +** subqueries looking for a match. +*/ +struct NameContext { + Parse *pParse; /* The parser */ + SrcList *pSrcList; /* One or more tables used to resolve names */ + ExprList *pEList; /* Optional list of result-set columns */ + AggInfo *pAggInfo; /* Information about aggregates at this level */ + NameContext *pNext; /* Next outer name context. NULL for outermost */ + int nRef; /* Number of names resolved by this context */ + int nErr; /* Number of errors encountered while resolving names */ + u16 ncFlags; /* Zero or more NC_* flags defined below */ +}; + +/* +** Allowed values for the NameContext, ncFlags field. +** +** Value constraints (all checked via assert()): +** NC_HasAgg == SF_HasAgg +** NC_MinMaxAgg == SF_MinMaxAgg == SQLITE_FUNC_MINMAX +** +*/ +#define NC_AllowAgg 0x0001 /* Aggregate functions are allowed here */ +#define NC_PartIdx 0x0002 /* True if resolving a partial index WHERE */ +#define NC_IsCheck 0x0004 /* True if resolving names in a CHECK constraint */ +#define NC_InAggFunc 0x0008 /* True if analyzing arguments to an agg func */ +#define NC_HasAgg 0x0010 /* One or more aggregate functions seen */ +#define NC_IdxExpr 0x0020 /* True if resolving columns of CREATE INDEX */ +#define NC_VarSelect 0x0040 /* A correlated subquery has been seen */ +#define NC_MinMaxAgg 0x1000 /* min/max aggregates seen. See note above */ + +/* +** An instance of the following structure contains all information +** needed to generate code for a single SELECT statement. +** +** nLimit is set to -1 if there is no LIMIT clause. nOffset is set to 0. +** If there is a LIMIT clause, the parser sets nLimit to the value of the +** limit and nOffset to the value of the offset (or 0 if there is not +** offset). But later on, nLimit and nOffset become the memory locations +** in the VDBE that record the limit and offset counters. +** +** addrOpenEphm[] entries contain the address of OP_OpenEphemeral opcodes. +** These addresses must be stored so that we can go back and fill in +** the P4_KEYINFO and P2 parameters later. Neither the KeyInfo nor +** the number of columns in P2 can be computed at the same time +** as the OP_OpenEphm instruction is coded because not +** enough information about the compound query is known at that point. +** The KeyInfo for addrOpenTran[0] and [1] contains collating sequences +** for the result set. The KeyInfo for addrOpenEphm[2] contains collating +** sequences for the ORDER BY clause. +*/ +struct Select { + ExprList *pEList; /* The fields of the result */ + u8 op; /* One of: TK_UNION TK_ALL TK_INTERSECT TK_EXCEPT */ + LogEst nSelectRow; /* Estimated number of result rows */ + u32 selFlags; /* Various SF_* values */ + int iLimit, iOffset; /* Memory registers holding LIMIT & OFFSET counters */ +#if SELECTTRACE_ENABLED + char zSelName[12]; /* Symbolic name of this SELECT use for debugging */ +#endif + int addrOpenEphm[2]; /* OP_OpenEphem opcodes related to this select */ + SrcList *pSrc; /* The FROM clause */ + Expr *pWhere; /* The WHERE clause */ + ExprList *pGroupBy; /* The GROUP BY clause */ + Expr *pHaving; /* The HAVING clause */ + ExprList *pOrderBy; /* The ORDER BY clause */ + Select *pPrior; /* Prior select in a compound select statement */ + Select *pNext; /* Next select to the left in a compound */ + Expr *pLimit; /* LIMIT expression. NULL means not used. */ + Expr *pOffset; /* OFFSET expression. NULL means not used. */ + With *pWith; /* WITH clause attached to this select. Or NULL. */ +}; + +/* +** Allowed values for Select.selFlags. The "SF" prefix stands for +** "Select Flag". +** +** Value constraints (all checked via assert()) +** SF_HasAgg == NC_HasAgg +** SF_MinMaxAgg == NC_MinMaxAgg == SQLITE_FUNC_MINMAX +** SF_FixedLimit == WHERE_USE_LIMIT +*/ +#define SF_Distinct 0x00001 /* Output should be DISTINCT */ +#define SF_All 0x00002 /* Includes the ALL keyword */ +#define SF_Resolved 0x00004 /* Identifiers have been resolved */ +#define SF_Aggregate 0x00008 /* Contains agg functions or a GROUP BY */ +#define SF_HasAgg 0x00010 /* Contains aggregate functions */ +#define SF_UsesEphemeral 0x00020 /* Uses the OpenEphemeral opcode */ +#define SF_Expanded 0x00040 /* sqlite3SelectExpand() called on this */ +#define SF_HasTypeInfo 0x00080 /* FROM subqueries have Table metadata */ +#define SF_Compound 0x00100 /* Part of a compound query */ +#define SF_Values 0x00200 /* Synthesized from VALUES clause */ +#define SF_MultiValue 0x00400 /* Single VALUES term with multiple rows */ +#define SF_NestedFrom 0x00800 /* Part of a parenthesized FROM clause */ +#define SF_MinMaxAgg 0x01000 /* Aggregate containing min() or max() */ +#define SF_Recursive 0x02000 /* The recursive part of a recursive CTE */ +#define SF_FixedLimit 0x04000 /* nSelectRow set by a constant LIMIT */ +#define SF_MaybeConvert 0x08000 /* Need convertCompoundSelectToSubquery() */ +#define SF_Converted 0x10000 /* By convertCompoundSelectToSubquery() */ +#define SF_IncludeHidden 0x20000 /* Include hidden columns in output */ + + +/* +** The results of a SELECT can be distributed in several ways, as defined +** by one of the following macros. The "SRT" prefix means "SELECT Result +** Type". +** +** SRT_Union Store results as a key in a temporary index +** identified by pDest->iSDParm. +** +** SRT_Except Remove results from the temporary index pDest->iSDParm. +** +** SRT_Exists Store a 1 in memory cell pDest->iSDParm if the result +** set is not empty. +** +** SRT_Discard Throw the results away. This is used by SELECT +** statements within triggers whose only purpose is +** the side-effects of functions. +** +** All of the above are free to ignore their ORDER BY clause. Those that +** follow must honor the ORDER BY clause. +** +** SRT_Output Generate a row of output (using the OP_ResultRow +** opcode) for each row in the result set. +** +** SRT_Mem Only valid if the result is a single column. +** Store the first column of the first result row +** in register pDest->iSDParm then abandon the rest +** of the query. This destination implies "LIMIT 1". +** +** SRT_Set The result must be a single column. Store each +** row of result as the key in table pDest->iSDParm. +** Apply the affinity pDest->affSdst before storing +** results. Used to implement "IN (SELECT ...)". +** +** SRT_EphemTab Create an temporary table pDest->iSDParm and store +** the result there. The cursor is left open after +** returning. This is like SRT_Table except that +** this destination uses OP_OpenEphemeral to create +** the table first. +** +** SRT_Coroutine Generate a co-routine that returns a new row of +** results each time it is invoked. The entry point +** of the co-routine is stored in register pDest->iSDParm +** and the result row is stored in pDest->nDest registers +** starting with pDest->iSdst. +** +** SRT_Table Store results in temporary table pDest->iSDParm. +** SRT_Fifo This is like SRT_EphemTab except that the table +** is assumed to already be open. SRT_Fifo has +** the additional property of being able to ignore +** the ORDER BY clause. +** +** SRT_DistFifo Store results in a temporary table pDest->iSDParm. +** But also use temporary table pDest->iSDParm+1 as +** a record of all prior results and ignore any duplicate +** rows. Name means: "Distinct Fifo". +** +** SRT_Queue Store results in priority queue pDest->iSDParm (really +** an index). Append a sequence number so that all entries +** are distinct. +** +** SRT_DistQueue Store results in priority queue pDest->iSDParm only if +** the same record has never been stored before. The +** index at pDest->iSDParm+1 hold all prior stores. +*/ +#define SRT_Union 1 /* Store result as keys in an index */ +#define SRT_Except 2 /* Remove result from a UNION index */ +#define SRT_Exists 3 /* Store 1 if the result is not empty */ +#define SRT_Discard 4 /* Do not save the results anywhere */ +#define SRT_Fifo 5 /* Store result as data with an automatic rowid */ +#define SRT_DistFifo 6 /* Like SRT_Fifo, but unique results only */ +#define SRT_Queue 7 /* Store result in an queue */ +#define SRT_DistQueue 8 /* Like SRT_Queue, but unique results only */ + +/* The ORDER BY clause is ignored for all of the above */ +#define IgnorableOrderby(X) ((X->eDest)<=SRT_DistQueue) + +#define SRT_Output 9 /* Output each row of result */ +#define SRT_Mem 10 /* Store result in a memory cell */ +#define SRT_Set 11 /* Store results as keys in an index */ +#define SRT_EphemTab 12 /* Create transient tab and store like SRT_Table */ +#define SRT_Coroutine 13 /* Generate a single row of result */ +#define SRT_Table 14 /* Store result as data with an automatic rowid */ + +/* +** An instance of this object describes where to put of the results of +** a SELECT statement. +*/ +struct SelectDest { + u8 eDest; /* How to dispose of the results. On of SRT_* above. */ + char *zAffSdst; /* Affinity used when eDest==SRT_Set */ + int iSDParm; /* A parameter used by the eDest disposal method */ + int iSdst; /* Base register where results are written */ + int nSdst; /* Number of registers allocated */ + ExprList *pOrderBy; /* Key columns for SRT_Queue and SRT_DistQueue */ +}; + +/* +** During code generation of statements that do inserts into AUTOINCREMENT +** tables, the following information is attached to the Table.u.autoInc.p +** pointer of each autoincrement table to record some side information that +** the code generator needs. We have to keep per-table autoincrement +** information in case inserts are done within triggers. Triggers do not +** normally coordinate their activities, but we do need to coordinate the +** loading and saving of autoincrement information. +*/ +struct AutoincInfo { + AutoincInfo *pNext; /* Next info block in a list of them all */ + Table *pTab; /* Table this info block refers to */ + int iDb; /* Index in sqlite3.aDb[] of database holding pTab */ + int regCtr; /* Memory register holding the rowid counter */ +}; + +/* +** Size of the column cache +*/ +#ifndef SQLITE_N_COLCACHE +# define SQLITE_N_COLCACHE 10 +#endif + +/* +** At least one instance of the following structure is created for each +** trigger that may be fired while parsing an INSERT, UPDATE or DELETE +** statement. All such objects are stored in the linked list headed at +** Parse.pTriggerPrg and deleted once statement compilation has been +** completed. +** +** A Vdbe sub-program that implements the body and WHEN clause of trigger +** TriggerPrg.pTrigger, assuming a default ON CONFLICT clause of +** TriggerPrg.orconf, is stored in the TriggerPrg.pProgram variable. +** The Parse.pTriggerPrg list never contains two entries with the same +** values for both pTrigger and orconf. +** +** 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). 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 */ + TriggerPrg *pNext; /* Next entry in Parse.pTriggerPrg list */ + SubProgram *pProgram; /* Program implementing pTrigger/orconf */ + int orconf; /* Default ON CONFLICT policy */ + u32 aColmask[2]; /* Masks of old.*, new.* columns accessed */ +}; + +/* +** The yDbMask datatype for the bitmask of all attached databases. +*/ +#if SQLITE_MAX_ATTACHED>30 + typedef unsigned char yDbMask[(SQLITE_MAX_ATTACHED+9)/8]; +# define DbMaskTest(M,I) (((M)[(I)/8]&(1<<((I)&7)))!=0) +# define DbMaskZero(M) memset((M),0,sizeof(M)) +# define DbMaskSet(M,I) (M)[(I)/8]|=(1<<((I)&7)) +# define DbMaskAllZero(M) sqlite3DbMaskAllZero(M) +# define DbMaskNonZero(M) (sqlite3DbMaskAllZero(M)==0) +#else + typedef unsigned int yDbMask; +# define DbMaskTest(M,I) (((M)&(((yDbMask)1)<<(I)))!=0) +# define DbMaskZero(M) (M)=0 +# define DbMaskSet(M,I) (M)|=(((yDbMask)1)<<(I)) +# define DbMaskAllZero(M) (M)==0 +# define DbMaskNonZero(M) (M)!=0 +#endif + +/* +** An SQL parser context. A copy of this structure is passed through +** the parser and down into all the parser action routine in order to +** carry around information that is global to the entire parse. +** +** The structure is divided into two parts. When the parser and code +** generate call themselves recursively, the first part of the structure +** is constant but the second part is reset at the beginning and end of +** each recursion. +** +** The nTableLock and aTableLock variables are only used if the shared-cache +** feature is enabled (if sqlite3Tsd()->useSharedData is true). They are +** used to store the set of table-locks required by the statement being +** compiled. Function sqlite3TableLock() is used to add entries to the +** list. +*/ +struct Parse { + sqlite3 *db; /* The main database structure */ + char *zErrMsg; /* An error message */ + Vdbe *pVdbe; /* An engine for executing database bytecode */ + int rc; /* Return code from execution */ + u8 colNamesSet; /* TRUE after OP_ColumnName has been issued to pVdbe */ + u8 checkSchema; /* Causes schema cookie check after an error */ + u8 nested; /* Number of nested calls to the parser/code generator */ + u8 nTempReg; /* Number of temporary registers in aTempReg[] */ + u8 isMultiWrite; /* True if statement may modify/insert multiple rows */ + u8 mayAbort; /* True if statement may throw an ABORT exception */ + u8 hasCompound; /* Need to invoke convertCompoundSelectToSubquery() */ + u8 okConstFactor; /* OK to factor out constants */ + u8 disableLookaside; /* Number of times lookaside has been disabled */ + u8 nColCache; /* Number of entries in aColCache[] */ + int nRangeReg; /* Size of the temporary register block */ + int iRangeReg; /* First register in temporary register block */ + int nErr; /* Number of errors seen */ + int nTab; /* Number of previously allocated VDBE cursors */ + int nMem; /* Number of memory cells used so far */ + int nOpAlloc; /* Number of slots allocated for Vdbe.aOp[] */ + int szOpAlloc; /* Bytes of memory space allocated for Vdbe.aOp[] */ + int ckBase; /* Base register of data during check constraints */ + int iSelfTab; /* Table of an index whose exprs are being coded */ + int iCacheLevel; /* ColCache valid when aColCache[].iLevel<=iCacheLevel */ + int iCacheCnt; /* Counter used to generate aColCache[].lru values */ + int nLabel; /* Number of labels used */ + int *aLabel; /* Space to hold the labels */ + ExprList *pConstExpr;/* Constant expressions */ + Token constraintName;/* Name of the constraint currently being parsed */ + yDbMask writeMask; /* Start a write transaction on these databases */ + yDbMask cookieMask; /* Bitmask of schema verified databases */ + int regRowid; /* Register holding rowid of CREATE TABLE entry */ + int regRoot; /* Register holding root page number for new objects */ + int nMaxArg; /* Max args passed to user function by sub-program */ +#if SELECTTRACE_ENABLED + int nSelect; /* Number of SELECT statements seen */ + int nSelectIndent; /* How far to indent SELECTTRACE() output */ +#endif +#ifndef SQLITE_OMIT_SHARED_CACHE + int nTableLock; /* Number of locks in aTableLock */ + TableLock *aTableLock; /* Required table locks for shared-cache mode */ +#endif + AutoincInfo *pAinc; /* Information about AUTOINCREMENT counters */ + Parse *pToplevel; /* Parse structure for main program (or NULL) */ + Table *pTriggerTab; /* Table triggers are being coded for */ + int addrCrTab; /* Address of OP_CreateTable opcode on CREATE TABLE */ + u32 nQueryLoop; /* Est number of iterations of a query (10*log2(N)) */ + 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 */ + + /************************************************************************** + ** Fields above must be initialized to zero. The fields that follow, + ** down to the beginning of the recursive section, do not need to be + ** initialized as they will be set before being used. The boundary is + ** determined by offsetof(Parse,aColCache). + **************************************************************************/ + + struct yColCache { + int iTable; /* Table cursor number */ + i16 iColumn; /* Table column number */ + 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. */ + int lru; /* Least recently used entry has the smallest value */ + } aColCache[SQLITE_N_COLCACHE]; /* One for each column cache entry */ + int aTempReg[8]; /* Holding area for temporary registers */ + Token sNameToken; /* Token with unqualified schema object name */ + + /************************************************************************ + ** Above is constant between recursions. Below is reset before and after + ** each recursion. The boundary between these two regions is determined + ** using offsetof(Parse,sLastToken) so the sLastToken field must be the + ** first field in the recursive region. + ************************************************************************/ + + Token sLastToken; /* The last token parsed */ + ynVar nVar; /* Number of '?' variables seen in the SQL so far */ + int nzVar; /* Number of available slots in azVar[] */ + u8 iPkSortOrder; /* ASC or DESC for INTEGER PRIMARY KEY */ + u8 explain; /* True if the EXPLAIN flag is found on the query */ +#ifndef SQLITE_OMIT_VIRTUALTABLE + u8 declareVtab; /* True if inside sqlite3_declare_vtab() */ + int nVtabLock; /* Number of virtual tables to lock */ +#endif + int nHeight; /* Expression tree height of current sub-select */ +#ifndef SQLITE_OMIT_EXPLAIN + int iSelectId; /* ID of current select for EXPLAIN output */ + int iNextSelectId; /* Next available select ID for EXPLAIN output */ +#endif + char **azVar; /* Pointers to names of parameters */ + Vdbe *pReprepare; /* VM being reprepared (sqlite3Reprepare()) */ + const char *zTail; /* All SQL text past the last semicolon parsed */ + Table *pNewTable; /* A table being constructed by CREATE TABLE */ + Trigger *pNewTrigger; /* Trigger under construct by a CREATE TRIGGER */ + const char *zAuthContext; /* The 6th parameter to db->xAuth callbacks */ +#ifndef SQLITE_OMIT_VIRTUALTABLE + Token sArg; /* Complete text of a module argument */ + Table **apVtabLock; /* Pointer to virtual tables needing locking */ +#endif + Table *pZombieTab; /* List of Table objects to delete after code gen */ + TriggerPrg *pTriggerPrg; /* Linked list of coded triggers */ + With *pWith; /* Current WITH clause, or NULL */ + With *pWithToFree; /* Free this WITH object at the end of the parse */ +}; + +/* +** Sizes and pointers of various parts of the Parse object. +*/ +#define PARSE_HDR_SZ offsetof(Parse,aColCache) /* Recursive part w/o aColCache*/ +#define PARSE_RECURSE_SZ offsetof(Parse,sLastToken) /* Recursive part */ +#define PARSE_TAIL_SZ (sizeof(Parse)-PARSE_RECURSE_SZ) /* Non-recursive part */ +#define PARSE_TAIL(X) (((char*)(X))+PARSE_RECURSE_SZ) /* Pointer to tail */ + +/* +** Return true if currently inside an sqlite3_declare_vtab() call. +*/ +#ifdef SQLITE_OMIT_VIRTUALTABLE + #define IN_DECLARE_VTAB 0 +#else + #define IN_DECLARE_VTAB (pParse->declareVtab) +#endif + +/* +** An instance of the following structure can be declared on a stack and used +** to save the Parse.zAuthContext value so that it can be restored later. +*/ +struct AuthContext { + const char *zAuthContext; /* Put saved Parse.zAuthContext here */ + Parse *pParse; /* The Parse structure */ +}; + +/* +** Bitfield flags for P5 value in various opcodes. +** +** Value constraints (enforced via assert()): +** OPFLAG_LENGTHARG == SQLITE_FUNC_LENGTH +** OPFLAG_TYPEOFARG == SQLITE_FUNC_TYPEOF +** OPFLAG_BULKCSR == BTREE_BULKLOAD +** OPFLAG_SEEKEQ == BTREE_SEEK_EQ +** OPFLAG_FORDELETE == BTREE_FORDELETE +** OPFLAG_SAVEPOSITION == BTREE_SAVEPOSITION +** OPFLAG_AUXDELETE == BTREE_AUXDELETE +*/ +#define OPFLAG_NCHANGE 0x01 /* OP_Insert: Set to update db->nChange */ + /* Also used in P2 (not P5) of OP_Delete */ +#define OPFLAG_EPHEM 0x01 /* OP_Column: Ephemeral output is ok */ +#define OPFLAG_LASTROWID 0x02 /* Set to update db->lastRowid */ +#define OPFLAG_ISUPDATE 0x04 /* This OP_Insert is an sql UPDATE */ +#define OPFLAG_APPEND 0x08 /* This is likely to be an append */ +#define OPFLAG_USESEEKRESULT 0x10 /* Try to avoid a seek in BtreeInsert() */ +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK +#define OPFLAG_ISNOOP 0x40 /* OP_Delete does pre-update-hook only */ +#endif +#define OPFLAG_LENGTHARG 0x40 /* OP_Column only used for length() */ +#define OPFLAG_TYPEOFARG 0x80 /* OP_Column only used for typeof() */ +#define OPFLAG_BULKCSR 0x01 /* OP_Open** used to open bulk cursor */ +#define OPFLAG_SEEKEQ 0x02 /* OP_Open** cursor uses EQ seek only */ +#define OPFLAG_FORDELETE 0x08 /* OP_Open should use BTREE_FORDELETE */ +#define OPFLAG_P2ISREG 0x10 /* P2 to OP_Open** is a register number */ +#define OPFLAG_PERMUTE 0x01 /* OP_Compare: use the permutation */ +#define OPFLAG_SAVEPOSITION 0x02 /* OP_Delete: keep cursor position */ +#define OPFLAG_AUXDELETE 0x04 /* OP_Delete: index in a DELETE op */ + +/* + * Each trigger present in the database schema is stored as an instance of + * struct Trigger. + * + * Pointers to instances of struct Trigger are stored in two ways. + * 1. In the "trigHash" hash table (part of the sqlite3* that represents the + * database). This allows Trigger structures to be retrieved by name. + * 2. All triggers associated with a single table form a linked list, using the + * pNext member of struct Trigger. A pointer to the first element of the + * linked list is stored as the "pTrigger" member of the associated + * struct Table. + * + * The "step_list" member points to the first element of a linked list + * containing the SQL statements specified as the trigger program. + */ +struct Trigger { + char *zName; /* The name of the trigger */ + char *table; /* The table or view to which the trigger applies */ + u8 op; /* One of TK_DELETE, TK_UPDATE, TK_INSERT */ + u8 tr_tm; /* One of TRIGGER_BEFORE, TRIGGER_AFTER */ + Expr *pWhen; /* The WHEN clause of the expression (may be NULL) */ + IdList *pColumns; /* If this is an UPDATE OF trigger, + the is stored here */ + Schema *pSchema; /* Schema containing the trigger */ + Schema *pTabSchema; /* Schema containing the table */ + TriggerStep *step_list; /* Link list of trigger program steps */ + Trigger *pNext; /* Next trigger associated with the table */ +}; + +/* +** A trigger is either a BEFORE or an AFTER trigger. The following constants +** determine which. +** +** If there are multiple triggers, you might of some BEFORE and some AFTER. +** In that cases, the constants below can be ORed together. +*/ +#define TRIGGER_BEFORE 1 +#define TRIGGER_AFTER 2 + +/* + * An instance of struct TriggerStep is used to store a single SQL statement + * that is a part of a trigger-program. + * + * Instances of struct TriggerStep are stored in a singly linked list (linked + * using the "pNext" member) referenced by the "step_list" member of the + * associated struct Trigger instance. The first element of the linked list is + * the first step of the trigger-program. + * + * The "op" member indicates whether this is a "DELETE", "INSERT", "UPDATE" or + * "SELECT" statement. The meanings of the other members is determined by the + * value of "op" as follows: + * + * (op == TK_INSERT) + * orconf -> stores the ON CONFLICT algorithm + * pSelect -> If this is an INSERT INTO ... SELECT ... statement, then + * this stores a pointer to the SELECT statement. Otherwise NULL. + * zTarget -> Dequoted name of the table to insert into. + * pExprList -> If this is an INSERT INTO ... VALUES ... statement, then + * this stores values to be inserted. Otherwise NULL. + * pIdList -> If this is an INSERT INTO ... () VALUES ... + * statement, then this stores the column-names to be + * inserted into. + * + * (op == TK_DELETE) + * zTarget -> Dequoted name of the table to delete from. + * pWhere -> The WHERE clause of the DELETE statement if one is specified. + * Otherwise NULL. + * + * (op == TK_UPDATE) + * zTarget -> Dequoted name of the table to update. + * pWhere -> The WHERE clause of the UPDATE statement if one is specified. + * Otherwise NULL. + * pExprList -> A list of the columns to update and the expressions to update + * them to. See sqlite3Update() documentation of "pChanges" + * argument. + * + */ +struct TriggerStep { + u8 op; /* One of TK_DELETE, TK_UPDATE, TK_INSERT, TK_SELECT */ + u8 orconf; /* OE_Rollback etc. */ + Trigger *pTrig; /* The trigger that this step is a part of */ + Select *pSelect; /* SELECT statement or RHS of INSERT INTO SELECT ... */ + char *zTarget; /* Target table for DELETE, UPDATE, INSERT */ + Expr *pWhere; /* The WHERE clause for DELETE or UPDATE steps */ + ExprList *pExprList; /* SET clause for UPDATE. */ + IdList *pIdList; /* Column names for INSERT */ + TriggerStep *pNext; /* Next in the link-list */ + TriggerStep *pLast; /* Last element in link-list. Valid for 1st elem only */ +}; + +/* +** The following structure contains information used by the sqliteFix... +** routines as they walk the parse tree to make database references +** explicit. +*/ +typedef struct DbFixer DbFixer; +struct DbFixer { + Parse *pParse; /* The parsing context. Error messages written here */ + Schema *pSchema; /* Fix items to this schema */ + int bVarOnly; /* Check for variable references only */ + const char *zDb; /* Make sure all objects are contained in this database */ + const char *zType; /* Type of the container - used for error messages */ + const Token *pName; /* Name of the container - used for error messages */ +}; + +/* +** An objected used to accumulate the text of a string where we +** do not necessarily know how big the string will be in the end. +*/ +struct StrAccum { + sqlite3 *db; /* Optional database for lookaside. Can be NULL */ + char *zBase; /* A base allocation. Not from malloc. */ + char *zText; /* The string collected so far */ + u32 nChar; /* Length of the string so far */ + u32 nAlloc; /* Amount of space allocated in zText */ + u32 mxAlloc; /* Maximum allowed allocation. 0 for no malloc usage */ + u8 accError; /* STRACCUM_NOMEM or STRACCUM_TOOBIG */ + u8 printfFlags; /* SQLITE_PRINTF flags below */ +}; +#define STRACCUM_NOMEM 1 +#define STRACCUM_TOOBIG 2 +#define SQLITE_PRINTF_INTERNAL 0x01 /* Internal-use-only converters allowed */ +#define SQLITE_PRINTF_SQLFUNC 0x02 /* SQL function arguments to VXPrintf */ +#define SQLITE_PRINTF_MALLOCED 0x04 /* True if xText is allocated space */ + +#define isMalloced(X) (((X)->printfFlags & SQLITE_PRINTF_MALLOCED)!=0) + + +/* +** A pointer to this structure is used to communicate information +** from sqlite3Init and OP_ParseSchema into the sqlite3InitCallback. +*/ +typedef struct { + sqlite3 *db; /* The database being initialized */ + char **pzErrMsg; /* Error message stored here */ + int iDb; /* 0 for main database. 1 for TEMP, 2.. for ATTACHed */ + int rc; /* Result code stored here */ +} InitData; + +/* +** Structure containing global configuration data for the SQLite library. +** +** This structure also contains some state information. +*/ +struct Sqlite3Config { + int bMemstat; /* True to enable memory status */ + int bCoreMutex; /* True to enable core mutexing */ + int bFullMutex; /* True to enable full mutexing */ + int bOpenUri; /* True to interpret filenames as URIs */ + int bUseCis; /* Use covering indices for full-scans */ + int mxStrlen; /* Maximum string length */ + int neverCorrupt; /* Database is always well-formed */ + int szLookaside; /* Default lookaside buffer size */ + int nLookaside; /* Default lookaside buffer count */ + int nStmtSpill; /* Stmt-journal spill-to-disk threshold */ + sqlite3_mem_methods m; /* Low-level memory allocation interface */ + sqlite3_mutex_methods mutex; /* Low-level mutex interface */ + sqlite3_pcache_methods2 pcache2; /* Low-level page-cache interface */ + void *pHeap; /* Heap storage space */ + int nHeap; /* Size of pHeap[] */ + int mnReq, mxReq; /* Min and max heap requests sizes */ + sqlite3_int64 szMmap; /* mmap() space per open file */ + sqlite3_int64 mxMmap; /* Maximum value for szMmap */ + void *pScratch; /* Scratch memory */ + int szScratch; /* Size of each scratch buffer */ + int nScratch; /* Number of scratch buffers */ + void *pPage; /* Page cache memory */ + int szPage; /* Size of each page in pPage[] */ + int nPage; /* Number of pages in pPage[] */ + int mxParserStack; /* maximum depth of the parser stack */ + int sharedCacheEnabled; /* true if shared-cache mode enabled */ + u32 szPma; /* Maximum Sorter PMA size */ + /* The above might be initialized to non-zero. The following need to always + ** initially be zero, however. */ + int isInit; /* True after initialization has finished */ + int inProgress; /* True while initialization in progress */ + int isMutexInit; /* True after mutexes are initialized */ + int isMallocInit; /* True after malloc is initialized */ + int isPCacheInit; /* True after malloc is initialized */ + int nRefInitMutex; /* Number of users of pInitMutex */ + sqlite3_mutex *pInitMutex; /* Mutex used by sqlite3_initialize() */ + void (*xLog)(void*,int,const char*); /* Function for logging */ + void *pLogArg; /* First argument to xLog() */ +#ifdef SQLITE_ENABLE_SQLLOG + void(*xSqllog)(void*,sqlite3*,const char*, int); + void *pSqllogArg; +#endif +#ifdef SQLITE_VDBE_COVERAGE + /* The following callback (if not NULL) is invoked on every VDBE branch + ** operation. Set the callback using SQLITE_TESTCTRL_VDBE_COVERAGE. + */ + void (*xVdbeBranch)(void*,int iSrcLine,u8 eThis,u8 eMx); /* Callback */ + void *pVdbeBranchArg; /* 1st argument */ +#endif +#ifndef SQLITE_OMIT_BUILTIN_TEST + int (*xTestCallback)(int); /* Invoked by sqlite3FaultSim() */ +#endif + int bLocaltimeFault; /* True to fail localtime() calls */ + int iOnceResetThreshold; /* When to reset OP_Once counters */ +}; + +/* +** This macro is used inside of assert() statements to indicate that +** the assert is only valid on a well-formed database. Instead of: +** +** assert( X ); +** +** One writes: +** +** assert( X || CORRUPT_DB ); +** +** CORRUPT_DB is true during normal operation. CORRUPT_DB does not indicate +** that the database is definitely corrupt, only that it might be corrupt. +** For most test cases, CORRUPT_DB is set to false using a special +** sqlite3_test_control(). This enables assert() statements to prove +** things that are always true for well-formed databases. +*/ +#define CORRUPT_DB (sqlite3Config.neverCorrupt==0) + +/* +** Context pointer passed down through the tree-walk. +*/ +struct Walker { + Parse *pParse; /* Parser context. */ + int (*xExprCallback)(Walker*, Expr*); /* Callback for expressions */ + int (*xSelectCallback)(Walker*,Select*); /* Callback for SELECTs */ + void (*xSelectCallback2)(Walker*,Select*);/* Second callback for SELECTs */ + int walkerDepth; /* Number of subqueries */ + u8 eCode; /* A small processing code */ + union { /* Extra data for callback */ + NameContext *pNC; /* Naming context */ + int n; /* A counter */ + int iCur; /* A cursor number */ + SrcList *pSrcList; /* FROM clause */ + struct SrcCount *pSrcCount; /* Counting column references */ + struct CCurHint *pCCurHint; /* Used by codeCursorHint() */ + int *aiCol; /* array of column indexes */ + struct IdxCover *pIdxCover; /* Check for index coverage */ + } u; +}; + +/* Forward declarations */ +SQLITE_PRIVATE int sqlite3WalkExpr(Walker*, Expr*); +SQLITE_PRIVATE int sqlite3WalkExprList(Walker*, ExprList*); +SQLITE_PRIVATE int sqlite3WalkSelect(Walker*, Select*); +SQLITE_PRIVATE int sqlite3WalkSelectExpr(Walker*, Select*); +SQLITE_PRIVATE int sqlite3WalkSelectFrom(Walker*, Select*); +SQLITE_PRIVATE int sqlite3ExprWalkNoop(Walker*, Expr*); + +/* +** Return code from the parse-tree walking primitives and their +** callbacks. +*/ +#define WRC_Continue 0 /* Continue down into children */ +#define WRC_Prune 1 /* Omit children but continue walking siblings */ +#define WRC_Abort 2 /* Abandon the tree walk */ + +/* +** An instance of this structure represents a set of one or more CTEs +** (common table expressions) created by a single WITH clause. +*/ +struct With { + int nCte; /* Number of CTEs in the WITH clause */ + With *pOuter; /* Containing WITH clause, or NULL */ + struct Cte { /* For each CTE in the WITH clause.... */ + char *zName; /* Name of this CTE */ + ExprList *pCols; /* List of explicit column names, or NULL */ + Select *pSelect; /* The definition of this CTE */ + const char *zCteErr; /* Error message for circular references */ + } a[1]; +}; + +#ifdef SQLITE_DEBUG +/* +** An instance of the TreeView object is used for printing the content of +** data structures on sqlite3DebugPrintf() using a tree-like view. +*/ +struct TreeView { + int iLevel; /* Which level of the tree we are on */ + u8 bLine[100]; /* Draw vertical in column i if bLine[i] is true */ +}; +#endif /* SQLITE_DEBUG */ + +/* +** Assuming zIn points to the first byte of a UTF-8 character, +** advance zIn to point to the first byte of the next UTF-8 character. +*/ +#define SQLITE_SKIP_UTF8(zIn) { \ + if( (*(zIn++))>=0xc0 ){ \ + while( (*zIn & 0xc0)==0x80 ){ zIn++; } \ + } \ +} + +/* +** The SQLITE_*_BKPT macros are substitutes for the error codes with +** the same name but without the _BKPT suffix. These macros invoke +** routines that report the line-number on which the error originated +** using sqlite3_log(). The routines also provide a convenient place +** to set a debugger breakpoint. +*/ +SQLITE_PRIVATE int sqlite3CorruptError(int); +SQLITE_PRIVATE int sqlite3MisuseError(int); +SQLITE_PRIVATE int sqlite3CantopenError(int); +#define SQLITE_CORRUPT_BKPT sqlite3CorruptError(__LINE__) +#define SQLITE_MISUSE_BKPT sqlite3MisuseError(__LINE__) +#define SQLITE_CANTOPEN_BKPT sqlite3CantopenError(__LINE__) +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE int sqlite3NomemError(int); +SQLITE_PRIVATE int sqlite3IoerrnomemError(int); +# define SQLITE_NOMEM_BKPT sqlite3NomemError(__LINE__) +# define SQLITE_IOERR_NOMEM_BKPT sqlite3IoerrnomemError(__LINE__) +#else +# define SQLITE_NOMEM_BKPT SQLITE_NOMEM +# define SQLITE_IOERR_NOMEM_BKPT SQLITE_IOERR_NOMEM +#endif + +/* +** FTS3 and FTS4 both require virtual table support +*/ +#if defined(SQLITE_OMIT_VIRTUALTABLE) +# undef SQLITE_ENABLE_FTS3 +# undef SQLITE_ENABLE_FTS4 +#endif + +/* +** FTS4 is really an extension for FTS3. It is enabled using the +** SQLITE_ENABLE_FTS3 macro. But to avoid confusion we also call +** the SQLITE_ENABLE_FTS4 macro to serve as an alias for SQLITE_ENABLE_FTS3. +*/ +#if defined(SQLITE_ENABLE_FTS4) && !defined(SQLITE_ENABLE_FTS3) +# define SQLITE_ENABLE_FTS3 1 +#endif + +/* +** The ctype.h header is needed for non-ASCII systems. It is also +** needed by FTS3 when FTS3 is included in the amalgamation. +*/ +#if !defined(SQLITE_ASCII) || \ + (defined(SQLITE_ENABLE_FTS3) && defined(SQLITE_AMALGAMATION)) +# include +#endif + +/* +** The following macros mimic the standard library functions toupper(), +** isspace(), isalnum(), isdigit() and isxdigit(), respectively. The +** sqlite versions only work for ASCII characters, regardless of locale. +*/ +#ifdef SQLITE_ASCII +# define sqlite3Toupper(x) ((x)&~(sqlite3CtypeMap[(unsigned char)(x)]&0x20)) +# define sqlite3Isspace(x) (sqlite3CtypeMap[(unsigned char)(x)]&0x01) +# define sqlite3Isalnum(x) (sqlite3CtypeMap[(unsigned char)(x)]&0x06) +# define sqlite3Isalpha(x) (sqlite3CtypeMap[(unsigned char)(x)]&0x02) +# define sqlite3Isdigit(x) (sqlite3CtypeMap[(unsigned char)(x)]&0x04) +# define sqlite3Isxdigit(x) (sqlite3CtypeMap[(unsigned char)(x)]&0x08) +# define sqlite3Tolower(x) (sqlite3UpperToLower[(unsigned char)(x)]) +# define sqlite3Isquote(x) (sqlite3CtypeMap[(unsigned char)(x)]&0x80) +#else +# define sqlite3Toupper(x) toupper((unsigned char)(x)) +# define sqlite3Isspace(x) isspace((unsigned char)(x)) +# define sqlite3Isalnum(x) isalnum((unsigned char)(x)) +# define sqlite3Isalpha(x) isalpha((unsigned char)(x)) +# define sqlite3Isdigit(x) isdigit((unsigned char)(x)) +# define sqlite3Isxdigit(x) isxdigit((unsigned char)(x)) +# define sqlite3Tolower(x) tolower((unsigned char)(x)) +# define sqlite3Isquote(x) ((x)=='"'||(x)=='\''||(x)=='['||(x)=='`') +#endif +#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS +SQLITE_PRIVATE int sqlite3IsIdChar(u8); +#endif + +/* +** Internal function prototypes +*/ +SQLITE_PRIVATE int sqlite3StrICmp(const char*,const char*); +SQLITE_PRIVATE int sqlite3Strlen30(const char*); +SQLITE_PRIVATE char *sqlite3ColumnType(Column*,char*); +#define sqlite3StrNICmp sqlite3_strnicmp + +SQLITE_PRIVATE int sqlite3MallocInit(void); +SQLITE_PRIVATE void sqlite3MallocEnd(void); +SQLITE_PRIVATE void *sqlite3Malloc(u64); +SQLITE_PRIVATE void *sqlite3MallocZero(u64); +SQLITE_PRIVATE void *sqlite3DbMallocZero(sqlite3*, u64); +SQLITE_PRIVATE void *sqlite3DbMallocRaw(sqlite3*, u64); +SQLITE_PRIVATE void *sqlite3DbMallocRawNN(sqlite3*, u64); +SQLITE_PRIVATE char *sqlite3DbStrDup(sqlite3*,const char*); +SQLITE_PRIVATE char *sqlite3DbStrNDup(sqlite3*,const char*, u64); +SQLITE_PRIVATE void *sqlite3Realloc(void*, u64); +SQLITE_PRIVATE void *sqlite3DbReallocOrFree(sqlite3 *, void *, u64); +SQLITE_PRIVATE void *sqlite3DbRealloc(sqlite3 *, void *, u64); +SQLITE_PRIVATE void sqlite3DbFree(sqlite3*, void*); +SQLITE_PRIVATE int sqlite3MallocSize(void*); +SQLITE_PRIVATE int sqlite3DbMallocSize(sqlite3*, void*); +SQLITE_PRIVATE void *sqlite3ScratchMalloc(int); +SQLITE_PRIVATE void sqlite3ScratchFree(void*); +SQLITE_PRIVATE void *sqlite3PageMalloc(int); +SQLITE_PRIVATE void sqlite3PageFree(void*); +SQLITE_PRIVATE void sqlite3MemSetDefault(void); +#ifndef SQLITE_OMIT_BUILTIN_TEST +SQLITE_PRIVATE void sqlite3BenignMallocHooks(void (*)(void), void (*)(void)); +#endif +SQLITE_PRIVATE int sqlite3HeapNearlyFull(void); + +/* +** On systems with ample stack space and that support alloca(), make +** use of alloca() to obtain space for large automatic objects. By default, +** obtain space from malloc(). +** +** The alloca() routine never returns NULL. This will cause code paths +** that deal with sqlite3StackAlloc() failures to be unreachable. +*/ +#ifdef SQLITE_USE_ALLOCA +# define sqlite3StackAllocRaw(D,N) alloca(N) +# define sqlite3StackAllocZero(D,N) memset(alloca(N), 0, N) +# define sqlite3StackFree(D,P) +#else +# define sqlite3StackAllocRaw(D,N) sqlite3DbMallocRaw(D,N) +# define sqlite3StackAllocZero(D,N) sqlite3DbMallocZero(D,N) +# define sqlite3StackFree(D,P) sqlite3DbFree(D,P) +#endif + +/* Do not allow both MEMSYS5 and MEMSYS3 to be defined together. If they +** are, disable MEMSYS3 +*/ +#ifdef SQLITE_ENABLE_MEMSYS5 +SQLITE_PRIVATE const sqlite3_mem_methods *sqlite3MemGetMemsys5(void); +#undef SQLITE_ENABLE_MEMSYS3 +#endif +#ifdef SQLITE_ENABLE_MEMSYS3 +SQLITE_PRIVATE const sqlite3_mem_methods *sqlite3MemGetMemsys3(void); +#endif + + +#ifndef SQLITE_MUTEX_OMIT +SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3DefaultMutex(void); +SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3NoopMutex(void); +SQLITE_PRIVATE sqlite3_mutex *sqlite3MutexAlloc(int); +SQLITE_PRIVATE int sqlite3MutexInit(void); +SQLITE_PRIVATE int sqlite3MutexEnd(void); +#endif +#if !defined(SQLITE_MUTEX_OMIT) && !defined(SQLITE_MUTEX_NOOP) +SQLITE_PRIVATE void sqlite3MemoryBarrier(void); +#else +# define sqlite3MemoryBarrier() +#endif + +SQLITE_PRIVATE sqlite3_int64 sqlite3StatusValue(int); +SQLITE_PRIVATE void sqlite3StatusUp(int, int); +SQLITE_PRIVATE void sqlite3StatusDown(int, int); +SQLITE_PRIVATE void sqlite3StatusHighwater(int, int); + +/* Access to mutexes used by sqlite3_status() */ +SQLITE_PRIVATE sqlite3_mutex *sqlite3Pcache1Mutex(void); +SQLITE_PRIVATE sqlite3_mutex *sqlite3MallocMutex(void); + +#ifndef SQLITE_OMIT_FLOATING_POINT +SQLITE_PRIVATE int sqlite3IsNaN(double); +#else +# define sqlite3IsNaN(X) 0 +#endif + +/* +** An instance of the following structure holds information about SQL +** functions arguments that are the parameters to the printf() function. +*/ +struct PrintfArguments { + int nArg; /* Total number of arguments */ + int nUsed; /* Number of arguments used so far */ + sqlite3_value **apArg; /* The argument values */ +}; + +SQLITE_PRIVATE void sqlite3VXPrintf(StrAccum*, const char*, va_list); +SQLITE_PRIVATE void sqlite3XPrintf(StrAccum*, const char*, ...); +SQLITE_PRIVATE char *sqlite3MPrintf(sqlite3*,const char*, ...); +SQLITE_PRIVATE char *sqlite3VMPrintf(sqlite3*,const char*, va_list); +#if defined(SQLITE_DEBUG) || defined(SQLITE_HAVE_OS_TRACE) +SQLITE_PRIVATE void sqlite3DebugPrintf(const char*, ...); +#endif +#if defined(SQLITE_TEST) +SQLITE_PRIVATE void *sqlite3TestTextToPtr(const char*); +#endif + +#if defined(SQLITE_DEBUG) +SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView*, const Expr*, u8); +SQLITE_PRIVATE void sqlite3TreeViewBareExprList(TreeView*, const ExprList*, const char*); +SQLITE_PRIVATE void sqlite3TreeViewExprList(TreeView*, const ExprList*, u8, const char*); +SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView*, const Select*, u8); +SQLITE_PRIVATE void sqlite3TreeViewWith(TreeView*, const With*, u8); +#endif + + +SQLITE_PRIVATE void sqlite3SetString(char **, sqlite3*, const char*); +SQLITE_PRIVATE void sqlite3ErrorMsg(Parse*, const char*, ...); +SQLITE_PRIVATE void sqlite3Dequote(char*); +SQLITE_PRIVATE void sqlite3TokenInit(Token*,char*); +SQLITE_PRIVATE int sqlite3KeywordCode(const unsigned char*, int); +SQLITE_PRIVATE int sqlite3RunParser(Parse*, const char*, char **); +SQLITE_PRIVATE void sqlite3FinishCoding(Parse*); +SQLITE_PRIVATE int sqlite3GetTempReg(Parse*); +SQLITE_PRIVATE void sqlite3ReleaseTempReg(Parse*,int); +SQLITE_PRIVATE int sqlite3GetTempRange(Parse*,int); +SQLITE_PRIVATE void sqlite3ReleaseTempRange(Parse*,int,int); +SQLITE_PRIVATE void sqlite3ClearTempRegCache(Parse*); +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE int sqlite3NoTempsInRange(Parse*,int,int); +#endif +SQLITE_PRIVATE Expr *sqlite3ExprAlloc(sqlite3*,int,const Token*,int); +SQLITE_PRIVATE Expr *sqlite3Expr(sqlite3*,int,const char*); +SQLITE_PRIVATE void sqlite3ExprAttachSubtrees(sqlite3*,Expr*,Expr*,Expr*); +SQLITE_PRIVATE Expr *sqlite3PExpr(Parse*, int, Expr*, Expr*, const Token*); +SQLITE_PRIVATE void sqlite3PExprAddSelect(Parse*, Expr*, Select*); +SQLITE_PRIVATE Expr *sqlite3ExprAnd(sqlite3*,Expr*, Expr*); +SQLITE_PRIVATE Expr *sqlite3ExprFunction(Parse*,ExprList*, Token*); +SQLITE_PRIVATE void sqlite3ExprAssignVarNumber(Parse*, Expr*, u32); +SQLITE_PRIVATE void sqlite3ExprDelete(sqlite3*, Expr*); +SQLITE_PRIVATE ExprList *sqlite3ExprListAppend(Parse*,ExprList*,Expr*); +SQLITE_PRIVATE ExprList *sqlite3ExprListAppendVector(Parse*,ExprList*,IdList*,Expr*); +SQLITE_PRIVATE void sqlite3ExprListSetSortOrder(ExprList*,int); +SQLITE_PRIVATE void sqlite3ExprListSetName(Parse*,ExprList*,Token*,int); +SQLITE_PRIVATE void sqlite3ExprListSetSpan(Parse*,ExprList*,ExprSpan*); +SQLITE_PRIVATE void sqlite3ExprListDelete(sqlite3*, ExprList*); +SQLITE_PRIVATE u32 sqlite3ExprListFlags(const ExprList*); +SQLITE_PRIVATE int sqlite3Init(sqlite3*, char**); +SQLITE_PRIVATE int sqlite3InitCallback(void*, int, char**, char**); +SQLITE_PRIVATE void sqlite3Pragma(Parse*,Token*,Token*,Token*,int); +SQLITE_PRIVATE void sqlite3ResetAllSchemasOfConnection(sqlite3*); +SQLITE_PRIVATE void sqlite3ResetOneSchema(sqlite3*,int); +SQLITE_PRIVATE void sqlite3CollapseDatabaseArray(sqlite3*); +SQLITE_PRIVATE void sqlite3CommitInternalChanges(sqlite3*); +SQLITE_PRIVATE void sqlite3DeleteColumnNames(sqlite3*,Table*); +SQLITE_PRIVATE int sqlite3ColumnsFromExprList(Parse*,ExprList*,i16*,Column**); +SQLITE_PRIVATE void sqlite3SelectAddColumnTypeAndCollation(Parse*,Table*,Select*); +SQLITE_PRIVATE Table *sqlite3ResultSetOfSelect(Parse*,Select*); +SQLITE_PRIVATE void sqlite3OpenMasterTable(Parse *, int); +SQLITE_PRIVATE Index *sqlite3PrimaryKeyIndex(Table*); +SQLITE_PRIVATE i16 sqlite3ColumnOfIndex(Index*, i16); +SQLITE_PRIVATE void sqlite3StartTable(Parse*,Token*,Token*,int,int,int,int); +#if SQLITE_ENABLE_HIDDEN_COLUMNS +SQLITE_PRIVATE void sqlite3ColumnPropertiesFromName(Table*, Column*); +#else +# define sqlite3ColumnPropertiesFromName(T,C) /* no-op */ +#endif +SQLITE_PRIVATE void sqlite3AddColumn(Parse*,Token*,Token*); +SQLITE_PRIVATE void sqlite3AddNotNull(Parse*, int); +SQLITE_PRIVATE void sqlite3AddPrimaryKey(Parse*, ExprList*, int, int, int); +SQLITE_PRIVATE void sqlite3AddCheckConstraint(Parse*, Expr*); +SQLITE_PRIVATE void sqlite3AddDefaultValue(Parse*,ExprSpan*); +SQLITE_PRIVATE void sqlite3AddCollateType(Parse*, Token*); +SQLITE_PRIVATE void sqlite3EndTable(Parse*,Token*,Token*,u8,Select*); +SQLITE_PRIVATE int sqlite3ParseUri(const char*,const char*,unsigned int*, + sqlite3_vfs**,char**,char **); +SQLITE_PRIVATE Btree *sqlite3DbNameToBtree(sqlite3*,const char*); + +#ifdef SQLITE_OMIT_BUILTIN_TEST +# define sqlite3FaultSim(X) SQLITE_OK +#else +SQLITE_PRIVATE int sqlite3FaultSim(int); +#endif + +SQLITE_PRIVATE Bitvec *sqlite3BitvecCreate(u32); +SQLITE_PRIVATE int sqlite3BitvecTest(Bitvec*, u32); +SQLITE_PRIVATE int sqlite3BitvecTestNotNull(Bitvec*, u32); +SQLITE_PRIVATE int sqlite3BitvecSet(Bitvec*, u32); +SQLITE_PRIVATE void sqlite3BitvecClear(Bitvec*, u32, void*); +SQLITE_PRIVATE void sqlite3BitvecDestroy(Bitvec*); +SQLITE_PRIVATE u32 sqlite3BitvecSize(Bitvec*); +#ifndef SQLITE_OMIT_BUILTIN_TEST +SQLITE_PRIVATE int sqlite3BitvecBuiltinTest(int,int*); +#endif + +SQLITE_PRIVATE RowSet *sqlite3RowSetInit(sqlite3*, void*, unsigned int); +SQLITE_PRIVATE void sqlite3RowSetClear(RowSet*); +SQLITE_PRIVATE void sqlite3RowSetInsert(RowSet*, i64); +SQLITE_PRIVATE int sqlite3RowSetTest(RowSet*, int iBatch, i64); +SQLITE_PRIVATE int sqlite3RowSetNext(RowSet*, i64*); + +SQLITE_PRIVATE void sqlite3CreateView(Parse*,Token*,Token*,Token*,ExprList*,Select*,int,int); + +#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE) +SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse*,Table*); +#else +# define sqlite3ViewGetColumnNames(A,B) 0 +#endif + +#if SQLITE_MAX_ATTACHED>30 +SQLITE_PRIVATE int sqlite3DbMaskAllZero(yDbMask); +#endif +SQLITE_PRIVATE void sqlite3DropTable(Parse*, SrcList*, int, int); +SQLITE_PRIVATE void sqlite3CodeDropTable(Parse*, Table*, int, int); +SQLITE_PRIVATE void sqlite3DeleteTable(sqlite3*, Table*); +#ifndef SQLITE_OMIT_AUTOINCREMENT +SQLITE_PRIVATE void sqlite3AutoincrementBegin(Parse *pParse); +SQLITE_PRIVATE void sqlite3AutoincrementEnd(Parse *pParse); +#else +# define sqlite3AutoincrementBegin(X) +# define sqlite3AutoincrementEnd(X) +#endif +SQLITE_PRIVATE void sqlite3Insert(Parse*, SrcList*, Select*, IdList*, int); +SQLITE_PRIVATE void *sqlite3ArrayAllocate(sqlite3*,void*,int,int*,int*); +SQLITE_PRIVATE IdList *sqlite3IdListAppend(sqlite3*, IdList*, Token*); +SQLITE_PRIVATE int sqlite3IdListIndex(IdList*,const char*); +SQLITE_PRIVATE SrcList *sqlite3SrcListEnlarge(sqlite3*, SrcList*, int, int); +SQLITE_PRIVATE SrcList *sqlite3SrcListAppend(sqlite3*, SrcList*, Token*, Token*); +SQLITE_PRIVATE SrcList *sqlite3SrcListAppendFromTerm(Parse*, SrcList*, Token*, Token*, + Token*, Select*, Expr*, IdList*); +SQLITE_PRIVATE void sqlite3SrcListIndexedBy(Parse *, SrcList *, Token *); +SQLITE_PRIVATE void sqlite3SrcListFuncArgs(Parse*, SrcList*, ExprList*); +SQLITE_PRIVATE int sqlite3IndexedByLookup(Parse *, struct SrcList_item *); +SQLITE_PRIVATE void sqlite3SrcListShiftJoinType(SrcList*); +SQLITE_PRIVATE void sqlite3SrcListAssignCursors(Parse*, SrcList*); +SQLITE_PRIVATE void sqlite3IdListDelete(sqlite3*, IdList*); +SQLITE_PRIVATE void sqlite3SrcListDelete(sqlite3*, SrcList*); +SQLITE_PRIVATE Index *sqlite3AllocateIndexObject(sqlite3*,i16,int,char**); +SQLITE_PRIVATE void sqlite3CreateIndex(Parse*,Token*,Token*,SrcList*,ExprList*,int,Token*, + Expr*, int, int, u8); +SQLITE_PRIVATE void sqlite3DropIndex(Parse*, SrcList*, int); +SQLITE_PRIVATE int sqlite3Select(Parse*, Select*, SelectDest*); +SQLITE_PRIVATE Select *sqlite3SelectNew(Parse*,ExprList*,SrcList*,Expr*,ExprList*, + Expr*,ExprList*,u32,Expr*,Expr*); +SQLITE_PRIVATE void sqlite3SelectDelete(sqlite3*, Select*); +SQLITE_PRIVATE Table *sqlite3SrcListLookup(Parse*, SrcList*); +SQLITE_PRIVATE int sqlite3IsReadOnly(Parse*, Table*, int); +SQLITE_PRIVATE void sqlite3OpenTable(Parse*, int iCur, int iDb, Table*, int); +#if defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) && !defined(SQLITE_OMIT_SUBQUERY) +SQLITE_PRIVATE Expr *sqlite3LimitWhere(Parse*,SrcList*,Expr*,ExprList*,Expr*,Expr*,char*); +#endif +SQLITE_PRIVATE void sqlite3DeleteFrom(Parse*, SrcList*, Expr*); +SQLITE_PRIVATE void sqlite3Update(Parse*, SrcList*, ExprList*, Expr*, int); +SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(Parse*,SrcList*,Expr*,ExprList*,ExprList*,u16,int); +SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo*); +SQLITE_PRIVATE LogEst sqlite3WhereOutputRowCount(WhereInfo*); +SQLITE_PRIVATE int sqlite3WhereIsDistinct(WhereInfo*); +SQLITE_PRIVATE int sqlite3WhereIsOrdered(WhereInfo*); +SQLITE_PRIVATE int sqlite3WhereOrderedInnerLoop(WhereInfo*); +SQLITE_PRIVATE int sqlite3WhereIsSorted(WhereInfo*); +SQLITE_PRIVATE int sqlite3WhereContinueLabel(WhereInfo*); +SQLITE_PRIVATE int sqlite3WhereBreakLabel(WhereInfo*); +SQLITE_PRIVATE int sqlite3WhereOkOnePass(WhereInfo*, int*); +#define ONEPASS_OFF 0 /* Use of ONEPASS not allowed */ +#define ONEPASS_SINGLE 1 /* ONEPASS valid for a single row update */ +#define ONEPASS_MULTI 2 /* ONEPASS is valid for multiple rows */ +SQLITE_PRIVATE void sqlite3ExprCodeLoadIndexColumn(Parse*, Index*, int, int, int); +SQLITE_PRIVATE int sqlite3ExprCodeGetColumn(Parse*, Table*, int, int, int, u8); +SQLITE_PRIVATE void sqlite3ExprCodeGetColumnToReg(Parse*, Table*, int, int, int); +SQLITE_PRIVATE void sqlite3ExprCodeGetColumnOfTable(Vdbe*, Table*, int, int, int); +SQLITE_PRIVATE void sqlite3ExprCodeMove(Parse*, int, int, int); +SQLITE_PRIVATE void sqlite3ExprCacheStore(Parse*, int, int, int); +SQLITE_PRIVATE void sqlite3ExprCachePush(Parse*); +SQLITE_PRIVATE void sqlite3ExprCachePop(Parse*); +SQLITE_PRIVATE void sqlite3ExprCacheRemove(Parse*, int, int); +SQLITE_PRIVATE void sqlite3ExprCacheClear(Parse*); +SQLITE_PRIVATE void sqlite3ExprCacheAffinityChange(Parse*, int, int); +SQLITE_PRIVATE void sqlite3ExprCode(Parse*, Expr*, int); +SQLITE_PRIVATE void sqlite3ExprCodeCopy(Parse*, Expr*, int); +SQLITE_PRIVATE void sqlite3ExprCodeFactorable(Parse*, Expr*, int); +SQLITE_PRIVATE void sqlite3ExprCodeAtInit(Parse*, Expr*, int, u8); +SQLITE_PRIVATE int sqlite3ExprCodeTemp(Parse*, Expr*, int*); +SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse*, Expr*, int); +SQLITE_PRIVATE void sqlite3ExprCodeAndCache(Parse*, Expr*, int); +SQLITE_PRIVATE int sqlite3ExprCodeExprList(Parse*, ExprList*, int, int, u8); +#define SQLITE_ECEL_DUP 0x01 /* Deep, not shallow copies */ +#define SQLITE_ECEL_FACTOR 0x02 /* Factor out constant terms */ +#define SQLITE_ECEL_REF 0x04 /* Use ExprList.u.x.iOrderByCol */ +SQLITE_PRIVATE void sqlite3ExprIfTrue(Parse*, Expr*, int, int); +SQLITE_PRIVATE void sqlite3ExprIfFalse(Parse*, Expr*, int, int); +SQLITE_PRIVATE void sqlite3ExprIfFalseDup(Parse*, Expr*, int, int); +SQLITE_PRIVATE Table *sqlite3FindTable(sqlite3*,const char*, const char*); +#define LOCATE_VIEW 0x01 +#define LOCATE_NOERR 0x02 +SQLITE_PRIVATE Table *sqlite3LocateTable(Parse*,u32 flags,const char*, const char*); +SQLITE_PRIVATE Table *sqlite3LocateTableItem(Parse*,u32 flags,struct SrcList_item *); +SQLITE_PRIVATE Index *sqlite3FindIndex(sqlite3*,const char*, const char*); +SQLITE_PRIVATE void sqlite3UnlinkAndDeleteTable(sqlite3*,int,const char*); +SQLITE_PRIVATE void sqlite3UnlinkAndDeleteIndex(sqlite3*,int,const char*); +SQLITE_PRIVATE void sqlite3Vacuum(Parse*,Token*); +SQLITE_PRIVATE int sqlite3RunVacuum(char**, sqlite3*, int); +SQLITE_PRIVATE char *sqlite3NameFromToken(sqlite3*, Token*); +SQLITE_PRIVATE int sqlite3ExprCompare(Expr*, Expr*, int); +SQLITE_PRIVATE int sqlite3ExprListCompare(ExprList*, ExprList*, int); +SQLITE_PRIVATE int sqlite3ExprImpliesExpr(Expr*, Expr*, int); +SQLITE_PRIVATE void sqlite3ExprAnalyzeAggregates(NameContext*, Expr*); +SQLITE_PRIVATE void sqlite3ExprAnalyzeAggList(NameContext*,ExprList*); +SQLITE_PRIVATE int sqlite3ExprCoveredByIndex(Expr*, int iCur, Index *pIdx); +SQLITE_PRIVATE int sqlite3FunctionUsesThisSrc(Expr*, SrcList*); +SQLITE_PRIVATE Vdbe *sqlite3GetVdbe(Parse*); +#ifndef SQLITE_OMIT_BUILTIN_TEST +SQLITE_PRIVATE void sqlite3PrngSaveState(void); +SQLITE_PRIVATE void sqlite3PrngRestoreState(void); +#endif +SQLITE_PRIVATE void sqlite3RollbackAll(sqlite3*,int); +SQLITE_PRIVATE void sqlite3CodeVerifySchema(Parse*, int); +SQLITE_PRIVATE void sqlite3CodeVerifyNamedSchema(Parse*, const char *zDb); +SQLITE_PRIVATE void sqlite3BeginTransaction(Parse*, int); +SQLITE_PRIVATE void sqlite3CommitTransaction(Parse*); +SQLITE_PRIVATE void sqlite3RollbackTransaction(Parse*); +SQLITE_PRIVATE void sqlite3Savepoint(Parse*, int, Token*); +SQLITE_PRIVATE void sqlite3CloseSavepoints(sqlite3 *); +SQLITE_PRIVATE void sqlite3LeaveMutexAndCloseZombie(sqlite3*); +SQLITE_PRIVATE int sqlite3ExprIsConstant(Expr*); +SQLITE_PRIVATE int sqlite3ExprIsConstantNotJoin(Expr*); +SQLITE_PRIVATE int sqlite3ExprIsConstantOrFunction(Expr*, u8); +SQLITE_PRIVATE int sqlite3ExprIsTableConstant(Expr*,int); +#ifdef SQLITE_ENABLE_CURSOR_HINTS +SQLITE_PRIVATE int sqlite3ExprContainsSubquery(Expr*); +#endif +SQLITE_PRIVATE int sqlite3ExprIsInteger(Expr*, int*); +SQLITE_PRIVATE int sqlite3ExprCanBeNull(const Expr*); +SQLITE_PRIVATE int sqlite3ExprNeedsNoAffinityChange(const Expr*, char); +SQLITE_PRIVATE int sqlite3IsRowid(const char*); +SQLITE_PRIVATE void sqlite3GenerateRowDelete( + Parse*,Table*,Trigger*,int,int,int,i16,u8,u8,u8,int); +SQLITE_PRIVATE void sqlite3GenerateRowIndexDelete(Parse*, Table*, int, int, int*, int); +SQLITE_PRIVATE int sqlite3GenerateIndexKey(Parse*, Index*, int, int, int, int*,Index*,int); +SQLITE_PRIVATE void sqlite3ResolvePartIdxLabel(Parse*,int); +SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(Parse*,Table*,int*,int,int,int,int, + u8,u8,int,int*,int*); +SQLITE_PRIVATE void sqlite3CompleteInsertion(Parse*,Table*,int,int,int,int*,int,int,int); +SQLITE_PRIVATE int sqlite3OpenTableAndIndices(Parse*, Table*, int, u8, int, u8*, int*, int*); +SQLITE_PRIVATE void sqlite3BeginWriteOperation(Parse*, int, int); +SQLITE_PRIVATE void sqlite3MultiWrite(Parse*); +SQLITE_PRIVATE void sqlite3MayAbort(Parse*); +SQLITE_PRIVATE void sqlite3HaltConstraint(Parse*, int, int, char*, i8, u8); +SQLITE_PRIVATE void sqlite3UniqueConstraint(Parse*, int, Index*); +SQLITE_PRIVATE void sqlite3RowidConstraint(Parse*, int, Table*); +SQLITE_PRIVATE Expr *sqlite3ExprDup(sqlite3*,Expr*,int); +SQLITE_PRIVATE ExprList *sqlite3ExprListDup(sqlite3*,ExprList*,int); +SQLITE_PRIVATE SrcList *sqlite3SrcListDup(sqlite3*,SrcList*,int); +SQLITE_PRIVATE IdList *sqlite3IdListDup(sqlite3*,IdList*); +SQLITE_PRIVATE Select *sqlite3SelectDup(sqlite3*,Select*,int); +#if SELECTTRACE_ENABLED +SQLITE_PRIVATE void sqlite3SelectSetName(Select*,const char*); +#else +# define sqlite3SelectSetName(A,B) +#endif +SQLITE_PRIVATE void sqlite3InsertBuiltinFuncs(FuncDef*,int); +SQLITE_PRIVATE FuncDef *sqlite3FindFunction(sqlite3*,const char*,int,u8,u8); +SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(void); +SQLITE_PRIVATE void sqlite3RegisterDateTimeFunctions(void); +SQLITE_PRIVATE void sqlite3RegisterPerConnectionBuiltinFunctions(sqlite3*); +SQLITE_PRIVATE int sqlite3SafetyCheckOk(sqlite3*); +SQLITE_PRIVATE int sqlite3SafetyCheckSickOrOk(sqlite3*); +SQLITE_PRIVATE void sqlite3ChangeCookie(Parse*, int); + +#if !defined(SQLITE_OMIT_VIEW) && !defined(SQLITE_OMIT_TRIGGER) +SQLITE_PRIVATE void sqlite3MaterializeView(Parse*, Table*, Expr*, int); +#endif + +#ifndef SQLITE_OMIT_TRIGGER +SQLITE_PRIVATE void sqlite3BeginTrigger(Parse*, Token*,Token*,int,int,IdList*,SrcList*, + Expr*,int, int); +SQLITE_PRIVATE void sqlite3FinishTrigger(Parse*, TriggerStep*, Token*); +SQLITE_PRIVATE void sqlite3DropTrigger(Parse*, SrcList*, int); +SQLITE_PRIVATE void sqlite3DropTriggerPtr(Parse*, Trigger*); +SQLITE_PRIVATE Trigger *sqlite3TriggersExist(Parse *, Table*, int, ExprList*, int *pMask); +SQLITE_PRIVATE Trigger *sqlite3TriggerList(Parse *, Table *); +SQLITE_PRIVATE void sqlite3CodeRowTrigger(Parse*, Trigger *, int, ExprList*, int, Table *, + int, int, int); +SQLITE_PRIVATE void sqlite3CodeRowTriggerDirect(Parse *, Trigger *, Table *, int, int, int); + void sqliteViewTriggers(Parse*, Table*, Expr*, int, ExprList*); +SQLITE_PRIVATE void sqlite3DeleteTriggerStep(sqlite3*, TriggerStep*); +SQLITE_PRIVATE TriggerStep *sqlite3TriggerSelectStep(sqlite3*,Select*); +SQLITE_PRIVATE TriggerStep *sqlite3TriggerInsertStep(sqlite3*,Token*, IdList*, + Select*,u8); +SQLITE_PRIVATE TriggerStep *sqlite3TriggerUpdateStep(sqlite3*,Token*,ExprList*, Expr*, u8); +SQLITE_PRIVATE TriggerStep *sqlite3TriggerDeleteStep(sqlite3*,Token*, Expr*); +SQLITE_PRIVATE void sqlite3DeleteTrigger(sqlite3*, Trigger*); +SQLITE_PRIVATE void sqlite3UnlinkAndDeleteTrigger(sqlite3*,int,const char*); +SQLITE_PRIVATE u32 sqlite3TriggerColmask(Parse*,Trigger*,ExprList*,int,int,Table*,int); +# define sqlite3ParseToplevel(p) ((p)->pToplevel ? (p)->pToplevel : (p)) +# define sqlite3IsToplevel(p) ((p)->pToplevel==0) +#else +# define sqlite3TriggersExist(B,C,D,E,F) 0 +# define sqlite3DeleteTrigger(A,B) +# define sqlite3DropTriggerPtr(A,B) +# define sqlite3UnlinkAndDeleteTrigger(A,B,C) +# define sqlite3CodeRowTrigger(A,B,C,D,E,F,G,H,I) +# define sqlite3CodeRowTriggerDirect(A,B,C,D,E,F) +# define sqlite3TriggerList(X, Y) 0 +# define sqlite3ParseToplevel(p) p +# define sqlite3IsToplevel(p) 1 +# define sqlite3TriggerColmask(A,B,C,D,E,F,G) 0 +#endif + +SQLITE_PRIVATE int sqlite3JoinType(Parse*, Token*, Token*, Token*); +SQLITE_PRIVATE void sqlite3CreateForeignKey(Parse*, ExprList*, Token*, ExprList*, int); +SQLITE_PRIVATE void sqlite3DeferForeignKey(Parse*, int); +#ifndef SQLITE_OMIT_AUTHORIZATION +SQLITE_PRIVATE void sqlite3AuthRead(Parse*,Expr*,Schema*,SrcList*); +SQLITE_PRIVATE int sqlite3AuthCheck(Parse*,int, const char*, const char*, const char*); +SQLITE_PRIVATE void sqlite3AuthContextPush(Parse*, AuthContext*, const char*); +SQLITE_PRIVATE void sqlite3AuthContextPop(AuthContext*); +SQLITE_PRIVATE int sqlite3AuthReadCol(Parse*, const char *, const char *, int); +#else +# define sqlite3AuthRead(a,b,c,d) +# define sqlite3AuthCheck(a,b,c,d,e) SQLITE_OK +# define sqlite3AuthContextPush(a,b,c) +# define sqlite3AuthContextPop(a) ((void)(a)) +#endif +SQLITE_PRIVATE void sqlite3Attach(Parse*, Expr*, Expr*, Expr*); +SQLITE_PRIVATE void sqlite3Detach(Parse*, Expr*); +SQLITE_PRIVATE void sqlite3FixInit(DbFixer*, Parse*, int, const char*, const Token*); +SQLITE_PRIVATE int sqlite3FixSrcList(DbFixer*, SrcList*); +SQLITE_PRIVATE int sqlite3FixSelect(DbFixer*, Select*); +SQLITE_PRIVATE int sqlite3FixExpr(DbFixer*, Expr*); +SQLITE_PRIVATE int sqlite3FixExprList(DbFixer*, ExprList*); +SQLITE_PRIVATE int sqlite3FixTriggerStep(DbFixer*, TriggerStep*); +SQLITE_PRIVATE int sqlite3AtoF(const char *z, double*, int, u8); +SQLITE_PRIVATE int sqlite3GetInt32(const char *, int*); +SQLITE_PRIVATE int sqlite3Atoi(const char*); +SQLITE_PRIVATE int sqlite3Utf16ByteLen(const void *pData, int nChar); +SQLITE_PRIVATE int sqlite3Utf8CharLen(const char *pData, int nByte); +SQLITE_PRIVATE u32 sqlite3Utf8Read(const u8**); +SQLITE_PRIVATE LogEst sqlite3LogEst(u64); +SQLITE_PRIVATE LogEst sqlite3LogEstAdd(LogEst,LogEst); +#ifndef SQLITE_OMIT_VIRTUALTABLE +SQLITE_PRIVATE LogEst sqlite3LogEstFromDouble(double); +#endif +#if defined(SQLITE_ENABLE_STMT_SCANSTATUS) || \ + defined(SQLITE_ENABLE_STAT3_OR_STAT4) || \ + defined(SQLITE_EXPLAIN_ESTIMATED_ROWS) +SQLITE_PRIVATE u64 sqlite3LogEstToInt(LogEst); +#endif + +/* +** Routines to read and write variable-length integers. These used to +** be defined locally, but now we use the varint routines in the util.c +** file. +*/ +SQLITE_PRIVATE int sqlite3PutVarint(unsigned char*, u64); +SQLITE_PRIVATE u8 sqlite3GetVarint(const unsigned char *, u64 *); +SQLITE_PRIVATE u8 sqlite3GetVarint32(const unsigned char *, u32 *); +SQLITE_PRIVATE int sqlite3VarintLen(u64 v); + +/* +** The common case is for a varint to be a single byte. They following +** macros handle the common case without a procedure call, but then call +** the procedure for larger varints. +*/ +#define getVarint32(A,B) \ + (u8)((*(A)<(u8)0x80)?((B)=(u32)*(A)),1:sqlite3GetVarint32((A),(u32 *)&(B))) +#define putVarint32(A,B) \ + (u8)(((u32)(B)<(u32)0x80)?(*(A)=(unsigned char)(B)),1:\ + sqlite3PutVarint((A),(B))) +#define getVarint sqlite3GetVarint +#define putVarint sqlite3PutVarint + + +SQLITE_PRIVATE const char *sqlite3IndexAffinityStr(sqlite3*, Index*); +SQLITE_PRIVATE void sqlite3TableAffinity(Vdbe*, Table*, int); +SQLITE_PRIVATE char sqlite3CompareAffinity(Expr *pExpr, char aff2); +SQLITE_PRIVATE int sqlite3IndexAffinityOk(Expr *pExpr, char idx_affinity); +SQLITE_PRIVATE char sqlite3TableColumnAffinity(Table*,int); +SQLITE_PRIVATE char sqlite3ExprAffinity(Expr *pExpr); +SQLITE_PRIVATE int sqlite3Atoi64(const char*, i64*, int, u8); +SQLITE_PRIVATE int sqlite3DecOrHexToI64(const char*, i64*); +SQLITE_PRIVATE void sqlite3ErrorWithMsg(sqlite3*, int, const char*,...); +SQLITE_PRIVATE void sqlite3Error(sqlite3*,int); +SQLITE_PRIVATE void sqlite3SystemError(sqlite3*,int); +SQLITE_PRIVATE void *sqlite3HexToBlob(sqlite3*, const char *z, int n); +SQLITE_PRIVATE u8 sqlite3HexToInt(int h); +SQLITE_PRIVATE int sqlite3TwoPartName(Parse *, Token *, Token *, Token **); + +#if defined(SQLITE_NEED_ERR_NAME) +SQLITE_PRIVATE const char *sqlite3ErrName(int); +#endif + +SQLITE_PRIVATE const char *sqlite3ErrStr(int); +SQLITE_PRIVATE int sqlite3ReadSchema(Parse *pParse); +SQLITE_PRIVATE CollSeq *sqlite3FindCollSeq(sqlite3*,u8 enc, const char*,int); +SQLITE_PRIVATE CollSeq *sqlite3LocateCollSeq(Parse *pParse, const char*zName); +SQLITE_PRIVATE CollSeq *sqlite3ExprCollSeq(Parse *pParse, Expr *pExpr); +SQLITE_PRIVATE Expr *sqlite3ExprAddCollateToken(Parse *pParse, Expr*, const Token*, int); +SQLITE_PRIVATE Expr *sqlite3ExprAddCollateString(Parse*,Expr*,const char*); +SQLITE_PRIVATE Expr *sqlite3ExprSkipCollate(Expr*); +SQLITE_PRIVATE int sqlite3CheckCollSeq(Parse *, CollSeq *); +SQLITE_PRIVATE int sqlite3CheckObjectName(Parse *, const char *); +SQLITE_PRIVATE void sqlite3VdbeSetChanges(sqlite3 *, int); +SQLITE_PRIVATE int sqlite3AddInt64(i64*,i64); +SQLITE_PRIVATE int sqlite3SubInt64(i64*,i64); +SQLITE_PRIVATE int sqlite3MulInt64(i64*,i64); +SQLITE_PRIVATE int sqlite3AbsInt32(int); +#ifdef SQLITE_ENABLE_8_3_NAMES +SQLITE_PRIVATE void sqlite3FileSuffix3(const char*, char*); +#else +# define sqlite3FileSuffix3(X,Y) +#endif +SQLITE_PRIVATE u8 sqlite3GetBoolean(const char *z,u8); + +SQLITE_PRIVATE const void *sqlite3ValueText(sqlite3_value*, u8); +SQLITE_PRIVATE int sqlite3ValueBytes(sqlite3_value*, u8); +SQLITE_PRIVATE void sqlite3ValueSetStr(sqlite3_value*, int, const void *,u8, + void(*)(void*)); +SQLITE_PRIVATE void sqlite3ValueSetNull(sqlite3_value*); +SQLITE_PRIVATE void sqlite3ValueFree(sqlite3_value*); +SQLITE_PRIVATE sqlite3_value *sqlite3ValueNew(sqlite3 *); +SQLITE_PRIVATE char *sqlite3Utf16to8(sqlite3 *, const void*, int, u8); +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 char sqlite3StrBINARY[]; +SQLITE_PRIVATE const unsigned char sqlite3UpperToLower[]; +SQLITE_PRIVATE const unsigned char sqlite3CtypeMap[]; +SQLITE_PRIVATE const Token sqlite3IntTokens[]; +SQLITE_PRIVATE SQLITE_WSD struct Sqlite3Config sqlite3Config; +SQLITE_PRIVATE FuncDefHash sqlite3BuiltinFunctions; +#ifndef SQLITE_OMIT_WSD +SQLITE_PRIVATE int sqlite3PendingByte; +#endif +#endif +SQLITE_PRIVATE void sqlite3RootPageMoved(sqlite3*, int, int, int); +SQLITE_PRIVATE void sqlite3Reindex(Parse*, Token*, Token*); +SQLITE_PRIVATE void sqlite3AlterFunctions(void); +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 int sqlite3CodeSubselect(Parse*, Expr *, int, int); +SQLITE_PRIVATE void sqlite3SelectPrep(Parse*, Select*, NameContext*); +SQLITE_PRIVATE void sqlite3SelectWrongNumTermsError(Parse *pParse, Select *p); +SQLITE_PRIVATE int sqlite3MatchSpanName(const char*, const char*, const char*, const char*); +SQLITE_PRIVATE int sqlite3ResolveExprNames(NameContext*, Expr*); +SQLITE_PRIVATE int sqlite3ResolveExprListNames(NameContext*, ExprList*); +SQLITE_PRIVATE void sqlite3ResolveSelectNames(Parse*, Select*, NameContext*); +SQLITE_PRIVATE void sqlite3ResolveSelfReference(Parse*,Table*,int,Expr*,ExprList*); +SQLITE_PRIVATE int sqlite3ResolveOrderGroupBy(Parse*, Select*, ExprList*, const char*); +SQLITE_PRIVATE void sqlite3ColumnDefault(Vdbe *, Table *, int, int); +SQLITE_PRIVATE void sqlite3AlterFinishAddColumn(Parse *, Token *); +SQLITE_PRIVATE void sqlite3AlterBeginAddColumn(Parse *, SrcList *); +SQLITE_PRIVATE CollSeq *sqlite3GetCollSeq(Parse*, u8, CollSeq *, const char*); +SQLITE_PRIVATE char sqlite3AffinityType(const char*, u8*); +SQLITE_PRIVATE void sqlite3Analyze(Parse*, Token*, Token*); +SQLITE_PRIVATE int sqlite3InvokeBusyHandler(BusyHandler*); +SQLITE_PRIVATE int sqlite3FindDb(sqlite3*, Token*); +SQLITE_PRIVATE int sqlite3FindDbName(sqlite3 *, const char *); +SQLITE_PRIVATE int sqlite3AnalysisLoad(sqlite3*,int iDB); +SQLITE_PRIVATE void sqlite3DeleteIndexSamples(sqlite3*,Index*); +SQLITE_PRIVATE void sqlite3DefaultRowEst(Index*); +SQLITE_PRIVATE void sqlite3RegisterLikeFunctions(sqlite3*, int); +SQLITE_PRIVATE int sqlite3IsLikeFunction(sqlite3*,Expr*,int*,char*); +SQLITE_PRIVATE void sqlite3SchemaClear(void *); +SQLITE_PRIVATE Schema *sqlite3SchemaGet(sqlite3 *, Btree *); +SQLITE_PRIVATE int sqlite3SchemaToIndex(sqlite3 *db, Schema *); +SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoAlloc(sqlite3*,int,int); +SQLITE_PRIVATE void sqlite3KeyInfoUnref(KeyInfo*); +SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoRef(KeyInfo*); +SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoOfIndex(Parse*, Index*); +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE int sqlite3KeyInfoIsWriteable(KeyInfo*); +#endif +SQLITE_PRIVATE int sqlite3CreateFunc(sqlite3 *, const char *, int, int, void *, + void (*)(sqlite3_context*,int,sqlite3_value **), + void (*)(sqlite3_context*,int,sqlite3_value **), void (*)(sqlite3_context*), + FuncDestructor *pDestructor +); +SQLITE_PRIVATE void sqlite3OomFault(sqlite3*); +SQLITE_PRIVATE void sqlite3OomClear(sqlite3*); +SQLITE_PRIVATE int sqlite3ApiExit(sqlite3 *db, int); +SQLITE_PRIVATE int sqlite3OpenTempDatabase(Parse *); + +SQLITE_PRIVATE void sqlite3StrAccumInit(StrAccum*, sqlite3*, char*, int, int); +SQLITE_PRIVATE void sqlite3StrAccumAppend(StrAccum*,const char*,int); +SQLITE_PRIVATE void sqlite3StrAccumAppendAll(StrAccum*,const char*); +SQLITE_PRIVATE void sqlite3AppendChar(StrAccum*,int,char); +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 *); + +#ifndef SQLITE_OMIT_SUBQUERY +SQLITE_PRIVATE int sqlite3ExprCheckIN(Parse*, Expr*); +#else +# define sqlite3ExprCheckIN(x,y) SQLITE_OK +#endif + +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +SQLITE_PRIVATE void sqlite3AnalyzeFunctions(void); +SQLITE_PRIVATE int sqlite3Stat4ProbeSetValue( + Parse*,Index*,UnpackedRecord**,Expr*,int,int,int*); +SQLITE_PRIVATE int sqlite3Stat4ValueFromExpr(Parse*, Expr*, u8, sqlite3_value**); +SQLITE_PRIVATE void sqlite3Stat4ProbeFree(UnpackedRecord*); +SQLITE_PRIVATE int sqlite3Stat4Column(sqlite3*, const void*, int, int, sqlite3_value**); +SQLITE_PRIVATE char sqlite3IndexColumnAffinity(sqlite3*, Index*, int); +#endif + +/* +** The interface to the LEMON-generated parser +*/ +SQLITE_PRIVATE void *sqlite3ParserAlloc(void*(*)(u64)); +SQLITE_PRIVATE void sqlite3ParserFree(void*, void(*)(void*)); +SQLITE_PRIVATE void sqlite3Parser(void*, int, Token, Parse*); +#ifdef YYTRACKMAXSTACKDEPTH +SQLITE_PRIVATE int sqlite3ParserStackPeak(void*); +#endif + +SQLITE_PRIVATE void sqlite3AutoLoadExtensions(sqlite3*); +#ifndef SQLITE_OMIT_LOAD_EXTENSION +SQLITE_PRIVATE void sqlite3CloseExtensions(sqlite3*); +#else +# define sqlite3CloseExtensions(X) +#endif + +#ifndef SQLITE_OMIT_SHARED_CACHE +SQLITE_PRIVATE void sqlite3TableLock(Parse *, int, int, u8, const char *); +#else + #define sqlite3TableLock(v,w,x,y,z) +#endif + +#ifdef SQLITE_TEST +SQLITE_PRIVATE int sqlite3Utf8To8(unsigned char*); +#endif + +#ifdef SQLITE_OMIT_VIRTUALTABLE +# define sqlite3VtabClear(Y) +# define sqlite3VtabSync(X,Y) SQLITE_OK +# define sqlite3VtabRollback(X) +# define sqlite3VtabCommit(X) +# define sqlite3VtabInSync(db) 0 +# define sqlite3VtabLock(X) +# define sqlite3VtabUnlock(X) +# define sqlite3VtabUnlockList(X) +# define sqlite3VtabSavepoint(X, Y, Z) SQLITE_OK +# define sqlite3GetVTable(X,Y) ((VTable*)0) +#else +SQLITE_PRIVATE void sqlite3VtabClear(sqlite3 *db, Table*); +SQLITE_PRIVATE void sqlite3VtabDisconnect(sqlite3 *db, Table *p); +SQLITE_PRIVATE int sqlite3VtabSync(sqlite3 *db, Vdbe*); +SQLITE_PRIVATE int sqlite3VtabRollback(sqlite3 *db); +SQLITE_PRIVATE int sqlite3VtabCommit(sqlite3 *db); +SQLITE_PRIVATE void sqlite3VtabLock(VTable *); +SQLITE_PRIVATE void sqlite3VtabUnlock(VTable *); +SQLITE_PRIVATE void sqlite3VtabUnlockList(sqlite3*); +SQLITE_PRIVATE int sqlite3VtabSavepoint(sqlite3 *, int, int); +SQLITE_PRIVATE void sqlite3VtabImportErrmsg(Vdbe*, sqlite3_vtab*); +SQLITE_PRIVATE VTable *sqlite3GetVTable(sqlite3*, Table*); +# define sqlite3VtabInSync(db) ((db)->nVTrans>0 && (db)->aVTrans==0) +#endif +SQLITE_PRIVATE int sqlite3VtabEponymousTableInit(Parse*,Module*); +SQLITE_PRIVATE void sqlite3VtabEponymousTableClear(sqlite3*,Module*); +SQLITE_PRIVATE void sqlite3VtabMakeWritable(Parse*,Table*); +SQLITE_PRIVATE void sqlite3VtabBeginParse(Parse*, Token*, Token*, Token*, int); +SQLITE_PRIVATE void sqlite3VtabFinishParse(Parse*, Token*); +SQLITE_PRIVATE void sqlite3VtabArgInit(Parse*); +SQLITE_PRIVATE void sqlite3VtabArgExtend(Parse*, Token*); +SQLITE_PRIVATE int sqlite3VtabCallCreate(sqlite3*, int, const char *, char **); +SQLITE_PRIVATE int sqlite3VtabCallConnect(Parse*, Table*); +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 sqlite3_int64 sqlite3StmtCurrentTime(sqlite3_context*); +SQLITE_PRIVATE int sqlite3VdbeParameterIndex(Vdbe*, const char*, int); +SQLITE_PRIVATE int sqlite3TransferBindings(sqlite3_stmt *, sqlite3_stmt *); +SQLITE_PRIVATE void sqlite3ParserReset(Parse*); +SQLITE_PRIVATE int sqlite3Reprepare(Vdbe*); +SQLITE_PRIVATE void sqlite3ExprListCheckLength(Parse*, ExprList*, const char*); +SQLITE_PRIVATE CollSeq *sqlite3BinaryCompareCollSeq(Parse *, Expr *, Expr *); +SQLITE_PRIVATE int sqlite3TempInMemory(const sqlite3*); +SQLITE_PRIVATE const char *sqlite3JournalModename(int); +#ifndef SQLITE_OMIT_WAL +SQLITE_PRIVATE int sqlite3Checkpoint(sqlite3*, int, int, int*, int*); +SQLITE_PRIVATE int sqlite3WalDefaultHook(void*,sqlite3*,const char*,int); +#endif +#ifndef SQLITE_OMIT_CTE +SQLITE_PRIVATE With *sqlite3WithAdd(Parse*,With*,Token*,ExprList*,Select*); +SQLITE_PRIVATE void sqlite3WithDelete(sqlite3*,With*); +SQLITE_PRIVATE void sqlite3WithPush(Parse*, With*, u8); +#else +#define sqlite3WithPush(x,y,z) +#define sqlite3WithDelete(x,y) +#endif + +/* Declarations for functions in fkey.c. All of these are replaced by +** no-op macros if OMIT_FOREIGN_KEY is defined. In this case no foreign +** key functionality is available. If OMIT_TRIGGER is defined but +** OMIT_FOREIGN_KEY is not, only some of the functions are no-oped. In +** this case foreign keys are parsed, but no other functionality is +** provided (enforcement of FK constraints requires the triggers sub-system). +*/ +#if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER) +SQLITE_PRIVATE void sqlite3FkCheck(Parse*, Table*, int, int, int*, int); +SQLITE_PRIVATE void sqlite3FkDropTable(Parse*, SrcList *, Table*); +SQLITE_PRIVATE void sqlite3FkActions(Parse*, Table*, ExprList*, int, int*, int); +SQLITE_PRIVATE int sqlite3FkRequired(Parse*, Table*, int*, int); +SQLITE_PRIVATE u32 sqlite3FkOldmask(Parse*, Table*); +SQLITE_PRIVATE FKey *sqlite3FkReferences(Table *); +#else + #define sqlite3FkActions(a,b,c,d,e,f) + #define sqlite3FkCheck(a,b,c,d,e,f) + #define sqlite3FkDropTable(a,b,c) + #define sqlite3FkOldmask(a,b) 0 + #define sqlite3FkRequired(a,b,c,d) 0 +#endif +#ifndef SQLITE_OMIT_FOREIGN_KEY +SQLITE_PRIVATE void sqlite3FkDelete(sqlite3 *, Table*); +SQLITE_PRIVATE int sqlite3FkLocateIndex(Parse*,Table*,FKey*,Index**,int**); +#else + #define sqlite3FkDelete(a,b) + #define sqlite3FkLocateIndex(a,b,c,d,e) +#endif + + +/* +** Available fault injectors. Should be numbered beginning with 0. +*/ +#define SQLITE_FAULTINJECTOR_MALLOC 0 +#define SQLITE_FAULTINJECTOR_COUNT 1 + +/* +** The interface to the code in fault.c used for identifying "benign" +** malloc failures. This is only present if SQLITE_OMIT_BUILTIN_TEST +** is not defined. +*/ +#ifndef SQLITE_OMIT_BUILTIN_TEST +SQLITE_PRIVATE void sqlite3BeginBenignMalloc(void); +SQLITE_PRIVATE void sqlite3EndBenignMalloc(void); +#else + #define sqlite3BeginBenignMalloc() + #define sqlite3EndBenignMalloc() +#endif + +/* +** Allowed return values from sqlite3FindInIndex() +*/ +#define IN_INDEX_ROWID 1 /* Search the rowid of the table */ +#define IN_INDEX_EPH 2 /* Search an ephemeral b-tree */ +#define IN_INDEX_INDEX_ASC 3 /* Existing index ASCENDING */ +#define IN_INDEX_INDEX_DESC 4 /* Existing index DESCENDING */ +#define IN_INDEX_NOOP 5 /* No table available. Use comparisons */ +/* +** Allowed flags for the 3rd parameter to sqlite3FindInIndex(). +*/ +#define IN_INDEX_NOOP_OK 0x0001 /* OK to return IN_INDEX_NOOP */ +#define IN_INDEX_MEMBERSHIP 0x0002 /* IN operator used for membership test */ +#define IN_INDEX_LOOP 0x0004 /* IN operator used as a loop */ +SQLITE_PRIVATE int sqlite3FindInIndex(Parse *, Expr *, u32, int*, int*); + +SQLITE_PRIVATE int sqlite3JournalOpen(sqlite3_vfs *, const char *, sqlite3_file *, int, int); +SQLITE_PRIVATE int sqlite3JournalSize(sqlite3_vfs *); +#ifdef SQLITE_ENABLE_ATOMIC_WRITE +SQLITE_PRIVATE int sqlite3JournalCreate(sqlite3_file *); +#endif + +SQLITE_PRIVATE int sqlite3JournalIsInMemory(sqlite3_file *p); +SQLITE_PRIVATE void sqlite3MemJournalOpen(sqlite3_file *); + +SQLITE_PRIVATE void sqlite3ExprSetHeightAndFlags(Parse *pParse, Expr *p); +#if SQLITE_MAX_EXPR_DEPTH>0 +SQLITE_PRIVATE int sqlite3SelectExprHeight(Select *); +SQLITE_PRIVATE int sqlite3ExprCheckHeight(Parse*, int); +#else + #define sqlite3SelectExprHeight(x) 0 + #define sqlite3ExprCheckHeight(x,y) +#endif + +SQLITE_PRIVATE u32 sqlite3Get4byte(const u8*); +SQLITE_PRIVATE void sqlite3Put4byte(u8*, u32); + +#ifdef SQLITE_ENABLE_UNLOCK_NOTIFY +SQLITE_PRIVATE void sqlite3ConnectionBlocked(sqlite3 *, sqlite3 *); +SQLITE_PRIVATE void sqlite3ConnectionUnlocked(sqlite3 *db); +SQLITE_PRIVATE void sqlite3ConnectionClosed(sqlite3 *db); +#else + #define sqlite3ConnectionBlocked(x,y) + #define sqlite3ConnectionUnlocked(x) + #define sqlite3ConnectionClosed(x) +#endif + +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE void sqlite3ParserTrace(FILE*, char *); +#endif + +/* +** If the SQLITE_ENABLE IOTRACE exists then the global variable +** sqlite3IoTrace is a pointer to a printf-like routine used to +** print I/O tracing messages. +*/ +#ifdef SQLITE_ENABLE_IOTRACE +# define IOTRACE(A) if( sqlite3IoTrace ){ sqlite3IoTrace A; } +SQLITE_PRIVATE void sqlite3VdbeIOTraceSql(Vdbe*); +SQLITE_API SQLITE_EXTERN void (SQLITE_CDECL *sqlite3IoTrace)(const char*,...); +#else +# define IOTRACE(A) +# define sqlite3VdbeIOTraceSql(X) +#endif + +/* +** These routines are available for the mem2.c debugging memory allocator +** only. They are used to verify that different "types" of memory +** allocations are properly tracked by the system. +** +** sqlite3MemdebugSetType() sets the "type" of an allocation to one of +** the MEMTYPE_* macros defined below. The type must be a bitmask with +** a single bit set. +** +** sqlite3MemdebugHasType() returns true if any of the bits in its second +** argument match the type set by the previous sqlite3MemdebugSetType(). +** sqlite3MemdebugHasType() is intended for use inside assert() statements. +** +** sqlite3MemdebugNoType() returns true if none of the bits in its second +** argument match the type set by the previous sqlite3MemdebugSetType(). +** +** Perhaps the most important point is the difference between MEMTYPE_HEAP +** and MEMTYPE_LOOKASIDE. If an allocation is MEMTYPE_LOOKASIDE, that means +** it might have been allocated by lookaside, except the allocation was +** too large or lookaside was already full. It is important to verify +** that allocations that might have been satisfied by lookaside are not +** passed back to non-lookaside free() routines. Asserts such as the +** example above are placed on the non-lookaside free() routines to verify +** this constraint. +** +** All of this is no-op for a production build. It only comes into +** play when the SQLITE_MEMDEBUG compile-time option is used. +*/ +#ifdef SQLITE_MEMDEBUG +SQLITE_PRIVATE void sqlite3MemdebugSetType(void*,u8); +SQLITE_PRIVATE int sqlite3MemdebugHasType(void*,u8); +SQLITE_PRIVATE int sqlite3MemdebugNoType(void*,u8); +#else +# define sqlite3MemdebugSetType(X,Y) /* no-op */ +# define sqlite3MemdebugHasType(X,Y) 1 +# define sqlite3MemdebugNoType(X,Y) 1 +#endif +#define MEMTYPE_HEAP 0x01 /* General heap allocations */ +#define MEMTYPE_LOOKASIDE 0x02 /* Heap that might have been lookaside */ +#define MEMTYPE_SCRATCH 0x04 /* Scratch allocations */ +#define MEMTYPE_PCACHE 0x08 /* Page cache allocations */ + +/* +** Threading interface +*/ +#if SQLITE_MAX_WORKER_THREADS>0 +SQLITE_PRIVATE int sqlite3ThreadCreate(SQLiteThread**,void*(*)(void*),void*); +SQLITE_PRIVATE int sqlite3ThreadJoin(SQLiteThread*, void**); +#endif + +#if defined(SQLITE_ENABLE_DBSTAT_VTAB) || defined(SQLITE_TEST) +SQLITE_PRIVATE int sqlite3DbstatRegister(sqlite3*); +#endif + +SQLITE_PRIVATE int sqlite3ExprVectorSize(Expr *pExpr); +SQLITE_PRIVATE int sqlite3ExprIsVector(Expr *pExpr); +SQLITE_PRIVATE Expr *sqlite3VectorFieldSubexpr(Expr*, int); +SQLITE_PRIVATE Expr *sqlite3ExprForVectorField(Parse*,Expr*,int); + +#endif /* SQLITEINT_H */ + +/************** End of sqliteInt.h *******************************************/ +/************** Begin file global.c ******************************************/ +/* +** 2008 June 13 +** +** 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 definitions of global variables and constants. +*/ +/* #include "sqliteInt.h" */ + +/* An array to map all upper-case characters into their corresponding +** lower-case character. +** +** SQLite only considers US-ASCII (or EBCDIC) characters. We do not +** handle case conversions for the UTF character set since the tables +** involved are nearly as big or bigger than SQLite itself. +*/ +SQLITE_PRIVATE const unsigned char sqlite3UpperToLower[] = { +#ifdef SQLITE_ASCII + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 97, 98, 99,100,101,102,103, + 104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121, + 122, 91, 92, 93, 94, 95, 96, 97, 98, 99,100,101,102,103,104,105,106,107, + 108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125, + 126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161, + 162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179, + 180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197, + 198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215, + 216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233, + 234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251, + 252,253,254,255 +#endif +#ifdef SQLITE_EBCDIC + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, /* 0x */ + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, /* 1x */ + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, /* 2x */ + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, /* 3x */ + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, /* 4x */ + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, /* 5x */ + 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, /* 6x */ + 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, /* 7x */ + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, /* 8x */ + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, /* 9x */ + 160,161,162,163,164,165,166,167,168,169,170,171,140,141,142,175, /* Ax */ + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, /* Bx */ + 192,129,130,131,132,133,134,135,136,137,202,203,204,205,206,207, /* Cx */ + 208,145,146,147,148,149,150,151,152,153,218,219,220,221,222,223, /* Dx */ + 224,225,162,163,164,165,166,167,168,169,234,235,236,237,238,239, /* Ex */ + 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255, /* Fx */ +#endif +}; + +/* +** The following 256 byte lookup table is used to support SQLites built-in +** equivalents to the following standard library functions: +** +** isspace() 0x01 +** isalpha() 0x02 +** isdigit() 0x04 +** isalnum() 0x06 +** isxdigit() 0x08 +** toupper() 0x20 +** SQLite identifier character 0x40 +** Quote character 0x80 +** +** Bit 0x20 is set if the mapped character requires translation to upper +** case. i.e. if the character is a lower-case ASCII character. +** If x is a lower-case ASCII character, then its upper-case equivalent +** is (x - 0x20). Therefore toupper() can be implemented as: +** +** (x & ~(map[x]&0x20)) +** +** The equivalent of tolower() is implemented using the sqlite3UpperToLower[] +** array. tolower() is used more often than toupper() by SQLite. +** +** Bit 0x40 is set if the character is 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. +*/ +#ifdef SQLITE_ASCII +SQLITE_PRIVATE const unsigned char sqlite3CtypeMap[256] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 00..07 ........ */ + 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, 0x80, 0x00, 0x40, 0x00, 0x00, 0x80, /* 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:;<=>? */ + + 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, 0x80, 0x00, 0x00, 0x00, 0x40, /* 58..5f XYZ[\]^_ */ + 0x80, 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{|}~. */ + + 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 + +/* EVIDENCE-OF: R-02982-34736 In order to maintain full backwards +** compatibility for legacy applications, the URI filename capability is +** disabled by default. +** +** EVIDENCE-OF: R-38799-08373 URI filenames can be enabled or disabled +** using the SQLITE_USE_URI=1 or SQLITE_USE_URI=0 compile-time options. +** +** EVIDENCE-OF: R-43642-56306 By default, URI handling is globally +** disabled. The default value may be changed by compiling with the +** SQLITE_USE_URI symbol defined. +*/ +#ifndef SQLITE_USE_URI +# define SQLITE_USE_URI 0 +#endif + +/* EVIDENCE-OF: R-38720-18127 The default setting is determined by the +** SQLITE_ALLOW_COVERING_INDEX_SCAN compile-time option, or is "on" if +** that compile-time option is omitted. +*/ +#ifndef SQLITE_ALLOW_COVERING_INDEX_SCAN +# define SQLITE_ALLOW_COVERING_INDEX_SCAN 1 +#endif + +/* The minimum PMA size is set to this value multiplied by the database +** page size in bytes. +*/ +#ifndef SQLITE_SORTER_PMASZ +# define SQLITE_SORTER_PMASZ 250 +#endif + +/* Statement journals spill to disk when their size exceeds the following +** threshold (in bytes). 0 means that statement journals are created and +** written to disk immediately (the default behavior for SQLite versions +** before 3.12.0). -1 means always keep the entire statement journal in +** memory. (The statement journal is also always held entirely in memory +** if journal_mode=MEMORY or if temp_store=MEMORY, regardless of this +** setting.) +*/ +#ifndef SQLITE_STMTJRNL_SPILL +# define SQLITE_STMTJRNL_SPILL (64*1024) +#endif + +/* +** The following singleton contains the global configuration for +** the SQLite library. +*/ +SQLITE_PRIVATE SQLITE_WSD struct Sqlite3Config sqlite3Config = { + SQLITE_DEFAULT_MEMSTATUS, /* bMemstat */ + 1, /* bCoreMutex */ + SQLITE_THREADSAFE==1, /* bFullMutex */ + SQLITE_USE_URI, /* bOpenUri */ + SQLITE_ALLOW_COVERING_INDEX_SCAN, /* bUseCis */ + 0x7ffffffe, /* mxStrlen */ + 0, /* neverCorrupt */ + 128, /* szLookaside */ + 500, /* nLookaside */ + SQLITE_STMTJRNL_SPILL, /* nStmtSpill */ + {0,0,0,0,0,0,0,0}, /* m */ + {0,0,0,0,0,0,0,0,0}, /* mutex */ + {0,0,0,0,0,0,0,0,0,0,0,0,0},/* pcache2 */ + (void*)0, /* pHeap */ + 0, /* nHeap */ + 0, 0, /* mnHeap, mxHeap */ + SQLITE_DEFAULT_MMAP_SIZE, /* szMmap */ + SQLITE_MAX_MMAP_SIZE, /* mxMmap */ + (void*)0, /* pScratch */ + 0, /* szScratch */ + 0, /* nScratch */ + (void*)0, /* pPage */ + 0, /* szPage */ + SQLITE_DEFAULT_PCACHE_INITSZ, /* nPage */ + 0, /* mxParserStack */ + 0, /* sharedCacheEnabled */ + SQLITE_SORTER_PMASZ, /* szPma */ + /* All the rest should always be initialized to zero */ + 0, /* isInit */ + 0, /* inProgress */ + 0, /* isMutexInit */ + 0, /* isMallocInit */ + 0, /* isPCacheInit */ + 0, /* nRefInitMutex */ + 0, /* pInitMutex */ + 0, /* xLog */ + 0, /* pLogArg */ +#ifdef SQLITE_ENABLE_SQLLOG + 0, /* xSqllog */ + 0, /* pSqllogArg */ +#endif +#ifdef SQLITE_VDBE_COVERAGE + 0, /* xVdbeBranch */ + 0, /* pVbeBranchArg */ +#endif +#ifndef SQLITE_OMIT_BUILTIN_TEST + 0, /* xTestCallback */ +#endif + 0, /* bLocaltimeFault */ + 0x7ffffffe /* iOnceResetThreshold */ +}; + +/* +** Hash table for global functions - functions common to all +** database connections. After initialization, this table is +** read-only. +*/ +SQLITE_PRIVATE FuncDefHash sqlite3BuiltinFunctions; + +/* +** Constant tokens for values 0 and 1. +*/ +SQLITE_PRIVATE const Token sqlite3IntTokens[] = { + { "0", 1 }, + { "1", 1 } +}; + + +/* +** The value of the "pending" byte must be 0x40000000 (1 byte past the +** 1-gibabyte boundary) in a compatible database. SQLite never uses +** the database page that contains the pending byte. It never attempts +** to read or write that page. The pending byte page is set aside +** for use by the VFS layers as space for managing file locks. +** +** During testing, it is often desirable to move the pending byte to +** a different position in the file. This allows code that has to +** deal with the pending byte to run on files that are much smaller +** than 1 GiB. The sqlite3_test_control() interface can be used to +** move the pending byte. +** +** IMPORTANT: Changing the pending byte to any value other than +** 0x40000000 results in an incompatible database file format! +** Changing the pending byte during operation will result in undefined +** and incorrect behavior. +*/ +#ifndef SQLITE_OMIT_WSD +SQLITE_PRIVATE int sqlite3PendingByte = 0x40000000; +#endif + +/* #include "opcodes.h" */ +/* +** 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; + +/* +** Name of the default collating sequence +*/ +SQLITE_PRIVATE const char sqlite3StrBINARY[] = "BINARY"; + +/************** End of global.c **********************************************/ +/************** Begin file ctime.c *******************************************/ +/* +** 2010 February 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. +** +************************************************************************* +** +** This file implements routines used to report what compile-time options +** SQLite was built with. +*/ + +#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS + +/* #include "sqliteInt.h" */ + +/* +** An array of names of all compile-time options. This array should +** be sorted A-Z. +** +** This array looks large, but in a typical installation actually uses +** only a handful of compile-time options, so most times this array is usually +** rather short and uses little memory space. +*/ +static const char * const azCompileOpt[] = { + +/* These macros are provided to "stringify" the value of the define +** for those options in which the value is meaningful. */ +#define CTIMEOPT_VAL_(opt) #opt +#define CTIMEOPT_VAL(opt) CTIMEOPT_VAL_(opt) + +#if SQLITE_32BIT_ROWID + "32BIT_ROWID", +#endif +#if SQLITE_4_BYTE_ALIGNED_MALLOC + "4_BYTE_ALIGNED_MALLOC", +#endif +#if SQLITE_CASE_SENSITIVE_LIKE + "CASE_SENSITIVE_LIKE", +#endif +#if SQLITE_CHECK_PAGES + "CHECK_PAGES", +#endif +#if defined(__clang__) && defined(__clang_major__) + "COMPILER=clang-" CTIMEOPT_VAL(__clang_major__) "." + CTIMEOPT_VAL(__clang_minor__) "." + CTIMEOPT_VAL(__clang_patchlevel__), +#elif defined(_MSC_VER) + "COMPILER=msvc-" CTIMEOPT_VAL(_MSC_VER), +#elif defined(__GNUC__) && defined(__VERSION__) + "COMPILER=gcc-" __VERSION__, +#endif +#if SQLITE_COVERAGE_TEST + "COVERAGE_TEST", +#endif +#if SQLITE_DEBUG + "DEBUG", +#endif +#if SQLITE_DEFAULT_LOCKING_MODE + "DEFAULT_LOCKING_MODE=" CTIMEOPT_VAL(SQLITE_DEFAULT_LOCKING_MODE), +#endif +#if defined(SQLITE_DEFAULT_MMAP_SIZE) && !defined(SQLITE_DEFAULT_MMAP_SIZE_xc) + "DEFAULT_MMAP_SIZE=" CTIMEOPT_VAL(SQLITE_DEFAULT_MMAP_SIZE), +#endif +#if SQLITE_DISABLE_DIRSYNC + "DISABLE_DIRSYNC", +#endif +#if SQLITE_DISABLE_LFS + "DISABLE_LFS", +#endif +#if SQLITE_ENABLE_8_3_NAMES + "ENABLE_8_3_NAMES=" CTIMEOPT_VAL(SQLITE_ENABLE_8_3_NAMES), +#endif +#if SQLITE_ENABLE_API_ARMOR + "ENABLE_API_ARMOR", +#endif +#if SQLITE_ENABLE_ATOMIC_WRITE + "ENABLE_ATOMIC_WRITE", +#endif +#if SQLITE_ENABLE_CEROD + "ENABLE_CEROD", +#endif +#if SQLITE_ENABLE_COLUMN_METADATA + "ENABLE_COLUMN_METADATA", +#endif +#if SQLITE_ENABLE_DBSTAT_VTAB + "ENABLE_DBSTAT_VTAB", +#endif +#if SQLITE_ENABLE_EXPENSIVE_ASSERT + "ENABLE_EXPENSIVE_ASSERT", +#endif +#if SQLITE_ENABLE_FTS1 + "ENABLE_FTS1", +#endif +#if SQLITE_ENABLE_FTS2 + "ENABLE_FTS2", +#endif +#if SQLITE_ENABLE_FTS3 + "ENABLE_FTS3", +#endif +#if SQLITE_ENABLE_FTS3_PARENTHESIS + "ENABLE_FTS3_PARENTHESIS", +#endif +#if SQLITE_ENABLE_FTS4 + "ENABLE_FTS4", +#endif +#if SQLITE_ENABLE_FTS5 + "ENABLE_FTS5", +#endif +#if SQLITE_ENABLE_ICU + "ENABLE_ICU", +#endif +#if SQLITE_ENABLE_IOTRACE + "ENABLE_IOTRACE", +#endif +#if SQLITE_ENABLE_JSON1 + "ENABLE_JSON1", +#endif +#if SQLITE_ENABLE_LOAD_EXTENSION + "ENABLE_LOAD_EXTENSION", +#endif +#if SQLITE_ENABLE_LOCKING_STYLE + "ENABLE_LOCKING_STYLE=" CTIMEOPT_VAL(SQLITE_ENABLE_LOCKING_STYLE), +#endif +#if SQLITE_ENABLE_MEMORY_MANAGEMENT + "ENABLE_MEMORY_MANAGEMENT", +#endif +#if SQLITE_ENABLE_MEMSYS3 + "ENABLE_MEMSYS3", +#endif +#if SQLITE_ENABLE_MEMSYS5 + "ENABLE_MEMSYS5", +#endif +#if SQLITE_ENABLE_OVERSIZE_CELL_CHECK + "ENABLE_OVERSIZE_CELL_CHECK", +#endif +#if SQLITE_ENABLE_RTREE + "ENABLE_RTREE", +#endif +#if defined(SQLITE_ENABLE_STAT4) + "ENABLE_STAT4", +#elif defined(SQLITE_ENABLE_STAT3) + "ENABLE_STAT3", +#endif +#if SQLITE_ENABLE_UNLOCK_NOTIFY + "ENABLE_UNLOCK_NOTIFY", +#endif +#if SQLITE_ENABLE_UPDATE_DELETE_LIMIT + "ENABLE_UPDATE_DELETE_LIMIT", +#endif +#if SQLITE_HAS_CODEC + "HAS_CODEC", +#endif +#if HAVE_ISNAN || SQLITE_HAVE_ISNAN + "HAVE_ISNAN", +#endif +#if SQLITE_HOMEGROWN_RECURSIVE_MUTEX + "HOMEGROWN_RECURSIVE_MUTEX", +#endif +#if SQLITE_IGNORE_AFP_LOCK_ERRORS + "IGNORE_AFP_LOCK_ERRORS", +#endif +#if SQLITE_IGNORE_FLOCK_LOCK_ERRORS + "IGNORE_FLOCK_LOCK_ERRORS", +#endif +#ifdef SQLITE_INT64_TYPE + "INT64_TYPE", +#endif +#ifdef SQLITE_LIKE_DOESNT_MATCH_BLOBS + "LIKE_DOESNT_MATCH_BLOBS", +#endif +#if SQLITE_LOCK_TRACE + "LOCK_TRACE", +#endif +#if defined(SQLITE_MAX_MMAP_SIZE) && !defined(SQLITE_MAX_MMAP_SIZE_xc) + "MAX_MMAP_SIZE=" CTIMEOPT_VAL(SQLITE_MAX_MMAP_SIZE), +#endif +#ifdef SQLITE_MAX_SCHEMA_RETRY + "MAX_SCHEMA_RETRY=" CTIMEOPT_VAL(SQLITE_MAX_SCHEMA_RETRY), +#endif +#if SQLITE_MEMDEBUG + "MEMDEBUG", +#endif +#if SQLITE_MIXED_ENDIAN_64BIT_FLOAT + "MIXED_ENDIAN_64BIT_FLOAT", +#endif +#if SQLITE_NO_SYNC + "NO_SYNC", +#endif +#if SQLITE_OMIT_ALTERTABLE + "OMIT_ALTERTABLE", +#endif +#if SQLITE_OMIT_ANALYZE + "OMIT_ANALYZE", +#endif +#if SQLITE_OMIT_ATTACH + "OMIT_ATTACH", +#endif +#if SQLITE_OMIT_AUTHORIZATION + "OMIT_AUTHORIZATION", +#endif +#if SQLITE_OMIT_AUTOINCREMENT + "OMIT_AUTOINCREMENT", +#endif +#if SQLITE_OMIT_AUTOINIT + "OMIT_AUTOINIT", +#endif +#if SQLITE_OMIT_AUTOMATIC_INDEX + "OMIT_AUTOMATIC_INDEX", +#endif +#if SQLITE_OMIT_AUTORESET + "OMIT_AUTORESET", +#endif +#if SQLITE_OMIT_AUTOVACUUM + "OMIT_AUTOVACUUM", +#endif +#if SQLITE_OMIT_BETWEEN_OPTIMIZATION + "OMIT_BETWEEN_OPTIMIZATION", +#endif +#if SQLITE_OMIT_BLOB_LITERAL + "OMIT_BLOB_LITERAL", +#endif +#if SQLITE_OMIT_BTREECOUNT + "OMIT_BTREECOUNT", +#endif +#if SQLITE_OMIT_BUILTIN_TEST + "OMIT_BUILTIN_TEST", +#endif +#if SQLITE_OMIT_CAST + "OMIT_CAST", +#endif +#if SQLITE_OMIT_CHECK + "OMIT_CHECK", +#endif +#if SQLITE_OMIT_COMPLETE + "OMIT_COMPLETE", +#endif +#if SQLITE_OMIT_COMPOUND_SELECT + "OMIT_COMPOUND_SELECT", +#endif +#if SQLITE_OMIT_CTE + "OMIT_CTE", +#endif +#if SQLITE_OMIT_DATETIME_FUNCS + "OMIT_DATETIME_FUNCS", +#endif +#if SQLITE_OMIT_DECLTYPE + "OMIT_DECLTYPE", +#endif +#if SQLITE_OMIT_DEPRECATED + "OMIT_DEPRECATED", +#endif +#if SQLITE_OMIT_DISKIO + "OMIT_DISKIO", +#endif +#if SQLITE_OMIT_EXPLAIN + "OMIT_EXPLAIN", +#endif +#if SQLITE_OMIT_FLAG_PRAGMAS + "OMIT_FLAG_PRAGMAS", +#endif +#if SQLITE_OMIT_FLOATING_POINT + "OMIT_FLOATING_POINT", +#endif +#if SQLITE_OMIT_FOREIGN_KEY + "OMIT_FOREIGN_KEY", +#endif +#if SQLITE_OMIT_GET_TABLE + "OMIT_GET_TABLE", +#endif +#if SQLITE_OMIT_INCRBLOB + "OMIT_INCRBLOB", +#endif +#if SQLITE_OMIT_INTEGRITY_CHECK + "OMIT_INTEGRITY_CHECK", +#endif +#if SQLITE_OMIT_LIKE_OPTIMIZATION + "OMIT_LIKE_OPTIMIZATION", +#endif +#if SQLITE_OMIT_LOAD_EXTENSION + "OMIT_LOAD_EXTENSION", +#endif +#if SQLITE_OMIT_LOCALTIME + "OMIT_LOCALTIME", +#endif +#if SQLITE_OMIT_LOOKASIDE + "OMIT_LOOKASIDE", +#endif +#if SQLITE_OMIT_MEMORYDB + "OMIT_MEMORYDB", +#endif +#if SQLITE_OMIT_OR_OPTIMIZATION + "OMIT_OR_OPTIMIZATION", +#endif +#if SQLITE_OMIT_PAGER_PRAGMAS + "OMIT_PAGER_PRAGMAS", +#endif +#if SQLITE_OMIT_PRAGMA + "OMIT_PRAGMA", +#endif +#if SQLITE_OMIT_PROGRESS_CALLBACK + "OMIT_PROGRESS_CALLBACK", +#endif +#if SQLITE_OMIT_QUICKBALANCE + "OMIT_QUICKBALANCE", +#endif +#if SQLITE_OMIT_REINDEX + "OMIT_REINDEX", +#endif +#if SQLITE_OMIT_SCHEMA_PRAGMAS + "OMIT_SCHEMA_PRAGMAS", +#endif +#if SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS + "OMIT_SCHEMA_VERSION_PRAGMAS", +#endif +#if SQLITE_OMIT_SHARED_CACHE + "OMIT_SHARED_CACHE", +#endif +#if SQLITE_OMIT_SUBQUERY + "OMIT_SUBQUERY", +#endif +#if SQLITE_OMIT_TCL_VARIABLE + "OMIT_TCL_VARIABLE", +#endif +#if SQLITE_OMIT_TEMPDB + "OMIT_TEMPDB", +#endif +#if SQLITE_OMIT_TRACE + "OMIT_TRACE", +#endif +#if SQLITE_OMIT_TRIGGER + "OMIT_TRIGGER", +#endif +#if SQLITE_OMIT_TRUNCATE_OPTIMIZATION + "OMIT_TRUNCATE_OPTIMIZATION", +#endif +#if SQLITE_OMIT_UTF16 + "OMIT_UTF16", +#endif +#if SQLITE_OMIT_VACUUM + "OMIT_VACUUM", +#endif +#if SQLITE_OMIT_VIEW + "OMIT_VIEW", +#endif +#if SQLITE_OMIT_VIRTUALTABLE + "OMIT_VIRTUALTABLE", +#endif +#if SQLITE_OMIT_WAL + "OMIT_WAL", +#endif +#if SQLITE_OMIT_WSD + "OMIT_WSD", +#endif +#if SQLITE_OMIT_XFER_OPT + "OMIT_XFER_OPT", +#endif +#if SQLITE_PERFORMANCE_TRACE + "PERFORMANCE_TRACE", +#endif +#if SQLITE_PROXY_DEBUG + "PROXY_DEBUG", +#endif +#if SQLITE_RTREE_INT_ONLY + "RTREE_INT_ONLY", +#endif +#if SQLITE_SECURE_DELETE + "SECURE_DELETE", +#endif +#if SQLITE_SMALL_STACK + "SMALL_STACK", +#endif +#if SQLITE_SOUNDEX + "SOUNDEX", +#endif +#if SQLITE_SYSTEM_MALLOC + "SYSTEM_MALLOC", +#endif +#if SQLITE_TCL + "TCL", +#endif +#if defined(SQLITE_TEMP_STORE) && !defined(SQLITE_TEMP_STORE_xc) + "TEMP_STORE=" CTIMEOPT_VAL(SQLITE_TEMP_STORE), +#endif +#if SQLITE_TEST + "TEST", +#endif +#if defined(SQLITE_THREADSAFE) + "THREADSAFE=" CTIMEOPT_VAL(SQLITE_THREADSAFE), +#endif +#if SQLITE_USE_ALLOCA + "USE_ALLOCA", +#endif +#if SQLITE_USER_AUTHENTICATION + "USER_AUTHENTICATION", +#endif +#if SQLITE_WIN32_MALLOC + "WIN32_MALLOC", +#endif +#if SQLITE_ZERO_MALLOC + "ZERO_MALLOC" +#endif +}; + +/* +** Given the name of a compile-time option, return true if that option +** was used and false if not. +** +** The name can optionally begin with "SQLITE_" but the "SQLITE_" prefix +** is not required for a match. +*/ +SQLITE_API int sqlite3_compileoption_used(const char *zOptName){ + int i, n; + +#if SQLITE_ENABLE_API_ARMOR + if( zOptName==0 ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + if( sqlite3StrNICmp(zOptName, "SQLITE_", 7)==0 ) zOptName += 7; + n = sqlite3Strlen30(zOptName); + + /* Since ArraySize(azCompileOpt) is normally in single digits, a + ** linear search is adequate. No need for a binary search. */ + for(i=0; i=0 && NaDb[] (or -1) */ + u8 nullRow; /* True if pointing to a row with no data */ + u8 deferredMoveto; /* A call to sqlite3BtreeMoveto() is needed */ + u8 isTable; /* True for rowid tables. False for indexes */ +#ifdef SQLITE_DEBUG + u8 seekOp; /* Most recent seek operation on this cursor */ + u8 wrFlag; /* The wrFlag argument to sqlite3BtreeCursor() */ +#endif + Bool isEphemeral:1; /* True for an ephemeral table */ + Bool useRandomRowid:1;/* Generate new record numbers semi-randomly */ + Bool isOrdered:1; /* True if the table is not BTREE_UNORDERED */ + Pgno pgnoRoot; /* Root page of the open btree cursor */ + i16 nField; /* Number of fields in the header */ + u16 nHdrParsed; /* Number of header fields parsed so far */ + union { + BtCursor *pCursor; /* CURTYPE_BTREE. Btree cursor */ + sqlite3_vtab_cursor *pVCur; /* CURTYPE_VTAB. Vtab cursor */ + int pseudoTableReg; /* CURTYPE_PSEUDO. Reg holding content. */ + VdbeSorter *pSorter; /* CURTYPE_SORTER. Sorter object */ + } uc; + Btree *pBt; /* Separate file holding temporary table */ + KeyInfo *pKeyInfo; /* Info about index keys needed by index cursors */ + int seekResult; /* Result of previous sqlite3BtreeMoveto() */ + i64 seqCount; /* Sequence counter */ + i64 movetoTarget; /* Argument to the deferred sqlite3BtreeMoveto() */ + VdbeCursor *pAltCursor; /* Associated index cursor from which to read */ + int *aAltMap; /* Mapping from table to index column numbers */ +#ifdef SQLITE_ENABLE_COLUMN_USED_MASK + u64 maskUsed; /* Mask of columns used by this cursor */ +#endif + + /* Cached information about the header for the data record that the + ** cursor is currently pointing to. Only valid if cacheStatus matches + ** Vdbe.cacheCtr. Vdbe.cacheCtr will never take on the value of + ** CACHE_STALE and so setting cacheStatus=CACHE_STALE guarantees that + ** the cache is out of date. + ** + ** aRow might point to (ephemeral) data for the current row, or it might + ** be NULL. + */ + u32 cacheStatus; /* Cache is valid if this matches Vdbe.cacheCtr */ + u32 payloadSize; /* Total number of bytes in the record */ + u32 szRow; /* Byte available in aRow */ + u32 iHdrOffset; /* Offset to next unparsed byte of the header */ + const u8 *aRow; /* Data for the current row, if all on one page */ + u32 *aOffset; /* Pointer to aType[nField] */ + u32 aType[1]; /* Type values for all entries in the record */ + /* 2*nField extra array elements allocated for aType[], beyond the one + ** static element declared in the structure. nField total array slots for + ** aType[] and nField+1 array slots for aOffset[] */ +}; + + +/* +** A value for VdbeCursor.cacheStatus that means the cache is always invalid. +*/ +#define CACHE_STALE 0 + +/* +** When a sub-program is executed (OP_Program), a structure of this type +** is allocated to store the current value of the program counter, as +** well as the current memory cell array and various other frame specific +** values stored in the Vdbe struct. When the sub-program is finished, +** these values are copied back to the Vdbe from the VdbeFrame structure, +** restoring the state of the VM to as it was before the sub-program +** began executing. +** +** The memory for a VdbeFrame object is allocated and managed by a memory +** cell in the parent (calling) frame. When the memory cell is deleted or +** overwritten, the VdbeFrame object is not freed immediately. Instead, it +** is linked into the Vdbe.pDelFrame list. The contents of the Vdbe.pDelFrame +** list is deleted when the VM is reset in VdbeHalt(). The reason for doing +** this instead of deleting the VdbeFrame immediately is to avoid recursive +** calls to sqlite3VdbeMemRelease() when the memory cells belonging to the +** child frame are released. +** +** The currently executing frame is stored in Vdbe.pFrame. Vdbe.pFrame is +** set to NULL if the currently executing frame is the main program. +*/ +typedef struct VdbeFrame VdbeFrame; +struct VdbeFrame { + Vdbe *v; /* VM this frame belongs to */ + VdbeFrame *pParent; /* Parent of this frame, or NULL if parent is main */ + Op *aOp; /* Program instructions for parent frame */ + i64 *anExec; /* Event counters from parent frame */ + Mem *aMem; /* Array of memory cells for parent frame */ + VdbeCursor **apCsr; /* Array of Vdbe cursors for parent frame */ + void *token; /* Copy of SubProgram.token */ + i64 lastRowid; /* Last insert rowid (sqlite3.lastRowid) */ + AuxData *pAuxData; /* Linked list of auxdata allocations */ + int nCursor; /* Number of entries in apCsr */ + int pc; /* Program Counter in parent (calling) frame */ + int nOp; /* Size of aOp array */ + int nMem; /* Number of entries in aMem */ + int nChildMem; /* Number of memory cells for child frame */ + int nChildCsr; /* Number of cursors for child frame */ + int nChange; /* Statement changes (Vdbe.nChange) */ + int nDbChange; /* Value of db->nChange */ +}; + +#define VdbeFrameMem(p) ((Mem *)&((u8 *)p)[ROUND8(sizeof(VdbeFrame))]) + +/* +** Internally, the vdbe manipulates nearly all SQL values as Mem +** structures. Each Mem struct may cache multiple representations (string, +** integer etc.) of the same value. +*/ +struct Mem { + union MemValue { + double r; /* Real value used when MEM_Real is set in flags */ + i64 i; /* Integer value used when MEM_Int is set in flags */ + int nZero; /* Used when bit MEM_Zero is set in flags */ + FuncDef *pDef; /* Used only when flags==MEM_Agg */ + RowSet *pRowSet; /* Used only when flags==MEM_RowSet */ + VdbeFrame *pFrame; /* Used when flags==MEM_Frame */ + } u; + u16 flags; /* Some combination of MEM_Null, MEM_Str, MEM_Dyn, etc. */ + u8 enc; /* SQLITE_UTF8, SQLITE_UTF16BE, SQLITE_UTF16LE */ + u8 eSubtype; /* Subtype for this value */ + int n; /* Number of characters in string value, excluding '\0' */ + char *z; /* String or BLOB value */ + /* ShallowCopy only needs to copy the information above */ + char *zMalloc; /* Space to hold MEM_Str or MEM_Blob if szMalloc>0 */ + int szMalloc; /* Size of the zMalloc allocation */ + u32 uTemp; /* Transient storage for serial_type in OP_MakeRecord */ + sqlite3 *db; /* The associated database connection */ + void (*xDel)(void*);/* Destructor for Mem.z - only valid if MEM_Dyn */ +#ifdef SQLITE_DEBUG + Mem *pScopyFrom; /* This Mem is a shallow copy of pScopyFrom */ + void *pFiller; /* So that sizeof(Mem) is a multiple of 8 */ +#endif +}; + +/* +** Size of struct Mem not including the Mem.zMalloc member or anything that +** follows. +*/ +#define MEMCELLSIZE offsetof(Mem,zMalloc) + +/* One or more of the following flags are set to indicate the validOK +** representations of the value stored in the Mem struct. +** +** If the MEM_Null flag is set, then the value is an SQL NULL value. +** No other flags may be set in this case. +** +** If the MEM_Str flag is set then Mem.z points at a string representation. +** Usually this is encoded in the same unicode encoding as the main +** database (see below for exceptions). If the MEM_Term flag is also +** set, then the string is nul terminated. The MEM_Int and MEM_Real +** flags may coexist with the MEM_Str flag. +*/ +#define MEM_Null 0x0001 /* Value is NULL */ +#define MEM_Str 0x0002 /* Value is a string */ +#define MEM_Int 0x0004 /* Value is an integer */ +#define MEM_Real 0x0008 /* Value is a real number */ +#define MEM_Blob 0x0010 /* Value is a BLOB */ +#define MEM_AffMask 0x001f /* Mask of affinity bits */ +#define MEM_RowSet 0x0020 /* Value is a RowSet object */ +#define MEM_Frame 0x0040 /* Value is a VdbeFrame object */ +#define MEM_Undefined 0x0080 /* Value is undefined */ +#define MEM_Cleared 0x0100 /* NULL set by OP_Null, not from data */ +#define MEM_TypeMask 0x81ff /* Mask of type bits */ + + +/* Whenever Mem contains a valid string or blob representation, one of +** the following flags must be set to determine the memory management +** policy for Mem.z. The MEM_Term flag tells us whether or not the +** string is \000 or \u0000 terminated +*/ +#define MEM_Term 0x0200 /* String rep is nul terminated */ +#define MEM_Dyn 0x0400 /* Need to call Mem.xDel() on Mem.z */ +#define MEM_Static 0x0800 /* Mem.z points to a static string */ +#define MEM_Ephem 0x1000 /* Mem.z points to an ephemeral string */ +#define MEM_Agg 0x2000 /* Mem.z points to an agg function context */ +#define MEM_Zero 0x4000 /* Mem.i contains count of 0s appended to blob */ +#define MEM_Subtype 0x8000 /* Mem.eSubtype is valid */ +#ifdef SQLITE_OMIT_INCRBLOB + #undef MEM_Zero + #define MEM_Zero 0x0000 +#endif + +/* Return TRUE if Mem X contains dynamically allocated content - anything +** that needs to be deallocated to avoid a leak. +*/ +#define VdbeMemDynamic(X) \ + (((X)->flags&(MEM_Agg|MEM_Dyn|MEM_RowSet|MEM_Frame))!=0) + +/* +** Clear any existing type flags from a Mem and replace them with f +*/ +#define MemSetTypeFlag(p, f) \ + ((p)->flags = ((p)->flags&~(MEM_TypeMask|MEM_Zero))|f) + +/* +** Return true if a memory cell is not marked as invalid. This macro +** is for use inside assert() statements only. +*/ +#ifdef SQLITE_DEBUG +#define memIsValid(M) ((M)->flags & MEM_Undefined)==0 +#endif + +/* +** Each auxiliary data pointer stored by a user defined function +** implementation calling sqlite3_set_auxdata() is stored in an instance +** of this structure. All such structures associated with a single VM +** are stored in a linked list headed at Vdbe.pAuxData. All are destroyed +** when the VM is halted (if not before). +*/ +struct AuxData { + int iOp; /* Instruction number of OP_Function opcode */ + int iArg; /* Index of function argument. */ + void *pAux; /* Aux data pointer */ + void (*xDelete)(void *); /* Destructor for the aux data */ + AuxData *pNext; /* Next element in list */ +}; + +/* +** The "context" argument for an installable function. A pointer to an +** instance of this structure is the first argument to the routines used +** implement the SQL functions. +** +** There is a typedef for this structure in sqlite.h. So all routines, +** even the public interface to SQLite, can use a pointer to this structure. +** But this file is the only place where the internal details of this +** structure are known. +** +** This structure is defined inside of vdbeInt.h because it uses substructures +** (Mem) which are only defined there. +*/ +struct sqlite3_context { + Mem *pOut; /* The return value is stored here */ + FuncDef *pFunc; /* Pointer to function information */ + Mem *pMem; /* Memory cell used to store aggregate context */ + Vdbe *pVdbe; /* The VM that owns this context */ + int iOp; /* Instruction number of OP_Function */ + int isError; /* Error code returned by the function. */ + u8 skipFlag; /* Skip accumulator loading if true */ + u8 fErrorOrAux; /* isError!=0 or pVdbe->pAuxData modified */ + u8 argc; /* Number of arguments */ + sqlite3_value *argv[1]; /* Argument set */ +}; + +/* A bitfield type for use inside of structures. Always follow with :N where +** N is the number of bits. +*/ +typedef unsigned bft; /* Bit Field Type */ + +typedef struct ScanStatus ScanStatus; +struct ScanStatus { + int addrExplain; /* OP_Explain for loop */ + int addrLoop; /* Address of "loops" counter */ + int addrVisit; /* Address of "rows visited" counter */ + int iSelectID; /* The "Select-ID" for this loop */ + LogEst nEst; /* Estimated output rows per loop */ + char *zName; /* Name of table or index */ +}; + +/* +** An instance of the virtual machine. This structure contains the complete +** state of the virtual machine. +** +** The "sqlite3_stmt" structure pointer that is returned by sqlite3_prepare() +** is really a pointer to an instance of this structure. +*/ +struct Vdbe { + sqlite3 *db; /* The database connection that owns this statement */ + Vdbe *pPrev,*pNext; /* Linked list of VDBEs with the same Vdbe.db */ + Parse *pParse; /* Parsing context used to create this Vdbe */ + ynVar nVar; /* Number of entries in aVar[] */ + ynVar nzVar; /* Number of entries in azVar[] */ + u32 magic; /* Magic number for sanity checking */ + int nMem; /* Number of memory locations currently allocated */ + int nCursor; /* Number of slots in apCsr[] */ + u32 cacheCtr; /* VdbeCursor row cache generation counter */ + int pc; /* The program counter */ + int rc; /* Value to return */ + int nChange; /* Number of db changes made since last reset */ + int iStatement; /* Statement number (or 0 if has not opened stmt) */ + i64 iCurrentTime; /* Value of julianday('now') for this statement */ + i64 nFkConstraint; /* Number of imm. FK constraints this VM */ + i64 nStmtDefCons; /* Number of def. constraints when stmt started */ + i64 nStmtDefImmCons; /* Number of def. imm constraints when stmt started */ + + /* When allocating a new Vdbe object, all of the fields below should be + ** initialized to zero or NULL */ + + Op *aOp; /* Space to hold the virtual machine's program */ + Mem *aMem; /* The memory locations */ + Mem **apArg; /* Arguments to currently executing user function */ + Mem *aColName; /* Column names to return */ + Mem *pResultSet; /* Pointer to an array of results */ + char *zErrMsg; /* Error message written here */ + VdbeCursor **apCsr; /* One element of this array for each open cursor */ + Mem *aVar; /* Values for the OP_Variable opcode. */ + char **azVar; /* Name of variables */ +#ifndef SQLITE_OMIT_TRACE + i64 startTime; /* Time when query started - used for profiling */ +#endif + int nOp; /* Number of instructions in the program */ +#ifdef SQLITE_DEBUG + int rcApp; /* errcode set by sqlite3_result_error_code() */ +#endif + u16 nResColumn; /* Number of columns in one row of the result set */ + u8 errorAction; /* Recovery action to do in case of an error */ + u8 minWriteFileFormat; /* Minimum file format for writable database files */ + bft expired:1; /* True if the VM needs to be recompiled */ + bft doingRerun:1; /* True if rerunning after an auto-reprepare */ + bft explain:2; /* True if EXPLAIN present on SQL command */ + bft changeCntOn:1; /* True to update the change-counter */ + bft runOnlyOnce:1; /* Automatically expire on reset */ + bft usesStmtJournal:1; /* True if uses a statement journal */ + bft readOnly:1; /* True for statements that do not write */ + bft bIsReader:1; /* True for statements that read */ + bft isPrepareV2:1; /* True if prepared with prepare_v2() */ + yDbMask btreeMask; /* Bitmask of db->aDb[] entries referenced */ + yDbMask lockMask; /* Subset of btreeMask that requires a lock */ + u32 aCounter[5]; /* Counters used by sqlite3_stmt_status() */ + char *zSql; /* Text of the SQL statement that generated this */ + void *pFree; /* Free this when deleting the vdbe */ + VdbeFrame *pFrame; /* Parent frame */ + VdbeFrame *pDelFrame; /* List of frame objects to free on VM reset */ + int nFrame; /* Number of frames in pFrame list */ + u32 expmask; /* Binding to these vars invalidates VM */ + SubProgram *pProgram; /* Linked list of all sub-programs used by VM */ + AuxData *pAuxData; /* Linked list of auxdata allocations */ +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS + i64 *anExec; /* Number of times each op has been executed */ + int nScan; /* Entries in aScan[] */ + ScanStatus *aScan; /* Scan definitions for sqlite3_stmt_scanstatus() */ +#endif +}; + +/* +** The following are allowed values for Vdbe.magic +*/ +#define VDBE_MAGIC_INIT 0x16bceaa5 /* Building a VDBE program */ +#define VDBE_MAGIC_RUN 0x2df20da3 /* VDBE is ready to execute */ +#define VDBE_MAGIC_HALT 0x319c2973 /* VDBE has completed execution */ +#define VDBE_MAGIC_RESET 0x48fa9f76 /* Reset and ready to run again */ +#define VDBE_MAGIC_DEAD 0x5606c3c8 /* The VDBE has been deallocated */ + +/* +** Structure used to store the context required by the +** sqlite3_preupdate_*() API functions. +*/ +struct PreUpdate { + Vdbe *v; + VdbeCursor *pCsr; /* Cursor to read old values from */ + int op; /* One of SQLITE_INSERT, UPDATE, DELETE */ + u8 *aRecord; /* old.* database record */ + KeyInfo keyinfo; + UnpackedRecord *pUnpacked; /* Unpacked version of aRecord[] */ + UnpackedRecord *pNewUnpacked; /* Unpacked version of new.* record */ + int iNewReg; /* Register for new.* values */ + i64 iKey1; /* First key value passed to hook */ + i64 iKey2; /* Second key value passed to hook */ + Mem *aNew; /* Array of new.* values */ + Table *pTab; /* Schema object being upated */ +}; + +/* +** Function prototypes +*/ +SQLITE_PRIVATE void sqlite3VdbeError(Vdbe*, const char *, ...); +SQLITE_PRIVATE void sqlite3VdbeFreeCursor(Vdbe *, VdbeCursor*); +void sqliteVdbePopStack(Vdbe*,int); +SQLITE_PRIVATE int sqlite3VdbeCursorMoveto(VdbeCursor**, int*); +SQLITE_PRIVATE int sqlite3VdbeCursorRestore(VdbeCursor*); +#if defined(SQLITE_DEBUG) || defined(VDBE_PROFILE) +SQLITE_PRIVATE void sqlite3VdbePrintOp(FILE*, int, Op*); +#endif +SQLITE_PRIVATE u32 sqlite3VdbeSerialTypeLen(u32); +SQLITE_PRIVATE u8 sqlite3VdbeOneByteSerialTypeLen(u8); +SQLITE_PRIVATE u32 sqlite3VdbeSerialType(Mem*, int, u32*); +SQLITE_PRIVATE u32 sqlite3VdbeSerialPut(unsigned char*, Mem*, u32); +SQLITE_PRIVATE u32 sqlite3VdbeSerialGet(const unsigned char*, u32, Mem*); +SQLITE_PRIVATE void sqlite3VdbeDeleteAuxData(sqlite3*, AuxData**, int, int); + +int sqlite2BtreeKeyCompare(BtCursor *, const void *, int, int, int *); +SQLITE_PRIVATE int sqlite3VdbeIdxKeyCompare(sqlite3*,VdbeCursor*,UnpackedRecord*,int*); +SQLITE_PRIVATE int sqlite3VdbeIdxRowid(sqlite3*, BtCursor*, i64*); +SQLITE_PRIVATE int sqlite3VdbeExec(Vdbe*); +SQLITE_PRIVATE int sqlite3VdbeList(Vdbe*); +SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe*); +SQLITE_PRIVATE int sqlite3VdbeChangeEncoding(Mem *, int); +SQLITE_PRIVATE int sqlite3VdbeMemTooBig(Mem*); +SQLITE_PRIVATE int sqlite3VdbeMemCopy(Mem*, const Mem*); +SQLITE_PRIVATE void sqlite3VdbeMemShallowCopy(Mem*, const Mem*, int); +SQLITE_PRIVATE void sqlite3VdbeMemMove(Mem*, Mem*); +SQLITE_PRIVATE int sqlite3VdbeMemNulTerminate(Mem*); +SQLITE_PRIVATE int sqlite3VdbeMemSetStr(Mem*, const char*, int, u8, void(*)(void*)); +SQLITE_PRIVATE void sqlite3VdbeMemSetInt64(Mem*, i64); +#ifdef SQLITE_OMIT_FLOATING_POINT +# define sqlite3VdbeMemSetDouble sqlite3VdbeMemSetInt64 +#else +SQLITE_PRIVATE void sqlite3VdbeMemSetDouble(Mem*, double); +#endif +SQLITE_PRIVATE void sqlite3VdbeMemInit(Mem*,sqlite3*,u16); +SQLITE_PRIVATE void sqlite3VdbeMemSetNull(Mem*); +SQLITE_PRIVATE void sqlite3VdbeMemSetZeroBlob(Mem*,int); +SQLITE_PRIVATE void sqlite3VdbeMemSetRowSet(Mem*); +SQLITE_PRIVATE int sqlite3VdbeMemMakeWriteable(Mem*); +SQLITE_PRIVATE int sqlite3VdbeMemStringify(Mem*, u8, u8); +SQLITE_PRIVATE i64 sqlite3VdbeIntValue(Mem*); +SQLITE_PRIVATE int sqlite3VdbeMemIntegerify(Mem*); +SQLITE_PRIVATE double sqlite3VdbeRealValue(Mem*); +SQLITE_PRIVATE void sqlite3VdbeIntegerAffinity(Mem*); +SQLITE_PRIVATE int sqlite3VdbeMemRealify(Mem*); +SQLITE_PRIVATE int sqlite3VdbeMemNumerify(Mem*); +SQLITE_PRIVATE void sqlite3VdbeMemCast(Mem*,u8,u8); +SQLITE_PRIVATE int sqlite3VdbeMemFromBtree(BtCursor*,u32,u32,int,Mem*); +SQLITE_PRIVATE void sqlite3VdbeMemRelease(Mem *p); +SQLITE_PRIVATE int sqlite3VdbeMemFinalize(Mem*, FuncDef*); +SQLITE_PRIVATE const char *sqlite3OpcodeName(int); +SQLITE_PRIVATE int sqlite3VdbeMemGrow(Mem *pMem, int n, int preserve); +SQLITE_PRIVATE int sqlite3VdbeMemClearAndResize(Mem *pMem, int n); +SQLITE_PRIVATE int sqlite3VdbeCloseStatement(Vdbe *, int); +SQLITE_PRIVATE void sqlite3VdbeFrameDelete(VdbeFrame*); +SQLITE_PRIVATE int sqlite3VdbeFrameRestore(VdbeFrame *); +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK +SQLITE_PRIVATE void sqlite3VdbePreUpdateHook(Vdbe*,VdbeCursor*,int,const char*,Table*,i64,int); +#endif +SQLITE_PRIVATE int sqlite3VdbeTransferError(Vdbe *p); + +SQLITE_PRIVATE int sqlite3VdbeSorterInit(sqlite3 *, int, VdbeCursor *); +SQLITE_PRIVATE void sqlite3VdbeSorterReset(sqlite3 *, VdbeSorter *); +SQLITE_PRIVATE void sqlite3VdbeSorterClose(sqlite3 *, VdbeCursor *); +SQLITE_PRIVATE int sqlite3VdbeSorterRowkey(const VdbeCursor *, Mem *); +SQLITE_PRIVATE int sqlite3VdbeSorterNext(sqlite3 *, const VdbeCursor *, int *); +SQLITE_PRIVATE int sqlite3VdbeSorterRewind(const VdbeCursor *, int *); +SQLITE_PRIVATE int sqlite3VdbeSorterWrite(const VdbeCursor *, Mem *); +SQLITE_PRIVATE int sqlite3VdbeSorterCompare(const VdbeCursor *, Mem *, int, int *); + +#if !defined(SQLITE_OMIT_SHARED_CACHE) +SQLITE_PRIVATE void sqlite3VdbeEnter(Vdbe*); +#else +# define sqlite3VdbeEnter(X) +#endif + +#if !defined(SQLITE_OMIT_SHARED_CACHE) && SQLITE_THREADSAFE>0 +SQLITE_PRIVATE void sqlite3VdbeLeave(Vdbe*); +#else +# define sqlite3VdbeLeave(X) +#endif + +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE void sqlite3VdbeMemAboutToChange(Vdbe*,Mem*); +SQLITE_PRIVATE int sqlite3VdbeCheckMemInvariants(Mem*); +#endif + +#ifndef SQLITE_OMIT_FOREIGN_KEY +SQLITE_PRIVATE int sqlite3VdbeCheckFk(Vdbe *, int); +#else +# define sqlite3VdbeCheckFk(p,i) 0 +#endif + +SQLITE_PRIVATE int sqlite3VdbeMemTranslate(Mem*, u8); +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE void sqlite3VdbePrintSql(Vdbe*); +SQLITE_PRIVATE void sqlite3VdbeMemPrettyPrint(Mem *pMem, char *zBuf); +#endif +SQLITE_PRIVATE int sqlite3VdbeMemHandleBom(Mem *pMem); + +#ifndef SQLITE_OMIT_INCRBLOB +SQLITE_PRIVATE int sqlite3VdbeMemExpandBlob(Mem *); + #define ExpandBlob(P) (((P)->flags&MEM_Zero)?sqlite3VdbeMemExpandBlob(P):0) +#else + #define sqlite3VdbeMemExpandBlob(x) SQLITE_OK + #define ExpandBlob(P) SQLITE_OK +#endif + +#endif /* !defined(SQLITE_VDBEINT_H) */ + +/************** End of vdbeInt.h *********************************************/ +/************** Continuing where we left off in status.c *********************/ + +/* +** Variables in which to record status information. +*/ +#if SQLITE_PTRSIZE>4 +typedef sqlite3_int64 sqlite3StatValueType; +#else +typedef u32 sqlite3StatValueType; +#endif +typedef struct sqlite3StatType sqlite3StatType; +static SQLITE_WSD struct sqlite3StatType { + sqlite3StatValueType nowValue[10]; /* Current value */ + sqlite3StatValueType mxValue[10]; /* Maximum value */ +} sqlite3Stat = { {0,}, {0,} }; + +/* +** Elements of sqlite3Stat[] are protected by either the memory allocator +** mutex, or by the pcache1 mutex. The following array determines which. +*/ +static const char statMutex[] = { + 0, /* SQLITE_STATUS_MEMORY_USED */ + 1, /* SQLITE_STATUS_PAGECACHE_USED */ + 1, /* SQLITE_STATUS_PAGECACHE_OVERFLOW */ + 0, /* SQLITE_STATUS_SCRATCH_USED */ + 0, /* SQLITE_STATUS_SCRATCH_OVERFLOW */ + 0, /* SQLITE_STATUS_MALLOC_SIZE */ + 0, /* SQLITE_STATUS_PARSER_STACK */ + 1, /* SQLITE_STATUS_PAGECACHE_SIZE */ + 0, /* SQLITE_STATUS_SCRATCH_SIZE */ + 0, /* SQLITE_STATUS_MALLOC_COUNT */ +}; + + +/* The "wsdStat" macro will resolve to the status information +** state vector. If writable static data is unsupported on the target, +** we have to locate the state vector at run-time. In the more common +** case where writable static data is supported, wsdStat can refer directly +** to the "sqlite3Stat" state vector declared above. +*/ +#ifdef SQLITE_OMIT_WSD +# define wsdStatInit sqlite3StatType *x = &GLOBAL(sqlite3StatType,sqlite3Stat) +# define wsdStat x[0] +#else +# define wsdStatInit +# define wsdStat sqlite3Stat +#endif + +/* +** Return the current value of a status parameter. The caller must +** be holding the appropriate mutex. +*/ +SQLITE_PRIVATE sqlite3_int64 sqlite3StatusValue(int op){ + wsdStatInit; + assert( op>=0 && op=0 && op=0 && op=0 && opwsdStat.mxValue[op] ){ + wsdStat.mxValue[op] = wsdStat.nowValue[op]; + } +} +SQLITE_PRIVATE void sqlite3StatusDown(int op, int N){ + wsdStatInit; + assert( N>=0 ); + assert( op>=0 && op=0 && op=0 ); + newValue = (sqlite3StatValueType)X; + assert( op>=0 && op=0 && opwsdStat.mxValue[op] ){ + wsdStat.mxValue[op] = newValue; + } +} + +/* +** Query status information. +*/ +SQLITE_API int sqlite3_status64( + int op, + sqlite3_int64 *pCurrent, + sqlite3_int64 *pHighwater, + int resetFlag +){ + sqlite3_mutex *pMutex; + wsdStatInit; + if( op<0 || op>=ArraySize(wsdStat.nowValue) ){ + return SQLITE_MISUSE_BKPT; + } +#ifdef SQLITE_ENABLE_API_ARMOR + if( pCurrent==0 || pHighwater==0 ) return SQLITE_MISUSE_BKPT; +#endif + pMutex = statMutex[op] ? sqlite3Pcache1Mutex() : sqlite3MallocMutex(); + sqlite3_mutex_enter(pMutex); + *pCurrent = wsdStat.nowValue[op]; + *pHighwater = wsdStat.mxValue[op]; + if( resetFlag ){ + wsdStat.mxValue[op] = wsdStat.nowValue[op]; + } + sqlite3_mutex_leave(pMutex); + (void)pMutex; /* Prevent warning when SQLITE_THREADSAFE=0 */ + return SQLITE_OK; +} +SQLITE_API int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetFlag){ + sqlite3_int64 iCur = 0, iHwtr = 0; + int rc; +#ifdef SQLITE_ENABLE_API_ARMOR + if( pCurrent==0 || pHighwater==0 ) return SQLITE_MISUSE_BKPT; +#endif + rc = sqlite3_status64(op, &iCur, &iHwtr, resetFlag); + if( rc==0 ){ + *pCurrent = (int)iCur; + *pHighwater = (int)iHwtr; + } + return rc; +} + +/* +** Query status information for a single database connection +*/ +SQLITE_API int sqlite3_db_status( + sqlite3 *db, /* The database connection whose status is desired */ + int op, /* Status verb */ + int *pCurrent, /* Write current value here */ + int *pHighwater, /* Write high-water mark here */ + int resetFlag /* Reset high-water mark if true */ +){ + int rc = SQLITE_OK; /* Return code */ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) || pCurrent==0|| pHighwater==0 ){ + return SQLITE_MISUSE_BKPT; + } +#endif + sqlite3_mutex_enter(db->mutex); + switch( op ){ + case SQLITE_DBSTATUS_LOOKASIDE_USED: { + *pCurrent = db->lookaside.nOut; + *pHighwater = db->lookaside.mxOut; + if( resetFlag ){ + db->lookaside.mxOut = db->lookaside.nOut; + } + break; + } + + case SQLITE_DBSTATUS_LOOKASIDE_HIT: + case SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE: + case SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL: { + testcase( op==SQLITE_DBSTATUS_LOOKASIDE_HIT ); + testcase( op==SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE ); + testcase( op==SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL ); + assert( (op-SQLITE_DBSTATUS_LOOKASIDE_HIT)>=0 ); + assert( (op-SQLITE_DBSTATUS_LOOKASIDE_HIT)<3 ); + *pCurrent = 0; + *pHighwater = db->lookaside.anStat[op - SQLITE_DBSTATUS_LOOKASIDE_HIT]; + if( resetFlag ){ + db->lookaside.anStat[op - SQLITE_DBSTATUS_LOOKASIDE_HIT] = 0; + } + break; + } + + /* + ** Return an approximation for the amount of memory currently used + ** by all pagers associated with the given database connection. The + ** highwater mark is meaningless and is returned as zero. + */ + case SQLITE_DBSTATUS_CACHE_USED_SHARED: + case SQLITE_DBSTATUS_CACHE_USED: { + int totalUsed = 0; + int i; + sqlite3BtreeEnterAll(db); + for(i=0; inDb; i++){ + Btree *pBt = db->aDb[i].pBt; + if( pBt ){ + Pager *pPager = sqlite3BtreePager(pBt); + int nByte = sqlite3PagerMemUsed(pPager); + if( op==SQLITE_DBSTATUS_CACHE_USED_SHARED ){ + nByte = nByte / sqlite3BtreeConnectionCount(pBt); + } + totalUsed += nByte; + } + } + sqlite3BtreeLeaveAll(db); + *pCurrent = totalUsed; + *pHighwater = 0; + break; + } + + /* + ** *pCurrent gets an accurate estimate of the amount of memory used + ** to store the schema for all databases (main, temp, and any ATTACHed + ** databases. *pHighwater is set to zero. + */ + case SQLITE_DBSTATUS_SCHEMA_USED: { + int i; /* Used to iterate through schemas */ + int nByte = 0; /* Used to accumulate return value */ + + sqlite3BtreeEnterAll(db); + db->pnBytesFreed = &nByte; + for(i=0; inDb; i++){ + Schema *pSchema = db->aDb[i].pSchema; + if( ALWAYS(pSchema!=0) ){ + HashElem *p; + + nByte += sqlite3GlobalConfig.m.xRoundup(sizeof(HashElem)) * ( + pSchema->tblHash.count + + pSchema->trigHash.count + + pSchema->idxHash.count + + pSchema->fkeyHash.count + ); + nByte += sqlite3_msize(pSchema->tblHash.ht); + nByte += sqlite3_msize(pSchema->trigHash.ht); + nByte += sqlite3_msize(pSchema->idxHash.ht); + nByte += sqlite3_msize(pSchema->fkeyHash.ht); + + for(p=sqliteHashFirst(&pSchema->trigHash); p; p=sqliteHashNext(p)){ + sqlite3DeleteTrigger(db, (Trigger*)sqliteHashData(p)); + } + for(p=sqliteHashFirst(&pSchema->tblHash); p; p=sqliteHashNext(p)){ + sqlite3DeleteTable(db, (Table *)sqliteHashData(p)); + } + } + } + db->pnBytesFreed = 0; + sqlite3BtreeLeaveAll(db); + + *pHighwater = 0; + *pCurrent = nByte; + break; + } + + /* + ** *pCurrent gets an accurate estimate of the amount of memory used + ** to store all prepared statements. + ** *pHighwater is set to zero. + */ + case SQLITE_DBSTATUS_STMT_USED: { + struct Vdbe *pVdbe; /* Used to iterate through VMs */ + int nByte = 0; /* Used to accumulate return value */ + + db->pnBytesFreed = &nByte; + for(pVdbe=db->pVdbe; pVdbe; pVdbe=pVdbe->pNext){ + sqlite3VdbeClearObject(db, pVdbe); + sqlite3DbFree(db, pVdbe); + } + db->pnBytesFreed = 0; + + *pHighwater = 0; /* IMP: R-64479-57858 */ + *pCurrent = nByte; + + break; + } + + /* + ** Set *pCurrent to the total cache hits or misses encountered by all + ** pagers the database handle is connected to. *pHighwater is always set + ** to zero. + */ + case SQLITE_DBSTATUS_CACHE_HIT: + case SQLITE_DBSTATUS_CACHE_MISS: + case SQLITE_DBSTATUS_CACHE_WRITE:{ + int i; + int nRet = 0; + assert( SQLITE_DBSTATUS_CACHE_MISS==SQLITE_DBSTATUS_CACHE_HIT+1 ); + assert( SQLITE_DBSTATUS_CACHE_WRITE==SQLITE_DBSTATUS_CACHE_HIT+2 ); + + for(i=0; inDb; i++){ + if( db->aDb[i].pBt ){ + Pager *pPager = sqlite3BtreePager(db->aDb[i].pBt); + sqlite3PagerCacheStat(pPager, op, resetFlag, &nRet); + } + } + *pHighwater = 0; /* IMP: R-42420-56072 */ + /* IMP: R-54100-20147 */ + /* IMP: R-29431-39229 */ + *pCurrent = nRet; + break; + } + + /* Set *pCurrent to non-zero if there are unresolved deferred foreign + ** key constraints. Set *pCurrent to zero if all foreign key constraints + ** have been satisfied. The *pHighwater is always set to zero. + */ + case SQLITE_DBSTATUS_DEFERRED_FKS: { + *pHighwater = 0; /* IMP: R-11967-56545 */ + *pCurrent = db->nDeferredImmCons>0 || db->nDeferredCons>0; + break; + } + + default: { + rc = SQLITE_ERROR; + } + } + sqlite3_mutex_leave(db->mutex); + return rc; +} + +/************** End of status.c **********************************************/ +/************** Begin file date.c ********************************************/ +/* +** 2003 October 31 +** +** 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 the C functions that implement date and time +** functions for SQLite. +** +** There is only one exported symbol in this file - the function +** sqlite3RegisterDateTimeFunctions() found at the bottom of the file. +** All other code has file scope. +** +** 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 +** calendar system. +** +** 1970-01-01 00:00:00 is JD 2440587.5 +** 2000-01-01 00:00:00 is JD 2451544.5 +** +** This implementation requires years to be expressed as a 4-digit number +** which means that only dates between 0000-01-01 and 9999-12-31 can +** be represented, even though julian day numbers allow a much wider +** range of dates. +** +** The Gregorian calendar system is used for all dates and times, +** even those that predate the Gregorian calendar. Historians usually +** use the julian calendar for dates prior to 1582-10-15 and for some +** dates afterwards, depending on locale. Beware of this difference. +** +** The conversion algorithms are implemented based on descriptions +** in the following text: +** +** Jean Meeus +** Astronomical Algorithms, 2nd Edition, 1998 +** ISBM 0-943396-61-1 +** Willmann-Bell, Inc +** Richmond, Virginia (USA) +*/ +/* #include "sqliteInt.h" */ +/* #include */ +/* #include */ +#include + +#ifndef SQLITE_OMIT_DATETIME_FUNCS + +/* +** The MSVC CRT on Windows CE may not have a localtime() function. +** So declare a substitute. The substitute function itself is +** defined in "os_win.c". +*/ +#if !defined(SQLITE_OMIT_LOCALTIME) && defined(_WIN32_WCE) && \ + (!defined(SQLITE_MSVC_LOCALTIME_API) || !SQLITE_MSVC_LOCALTIME_API) +struct tm *__cdecl localtime(const time_t *); +#endif + +/* +** A structure for holding a single date and time. +*/ +typedef struct DateTime DateTime; +struct DateTime { + sqlite3_int64 iJD; /* The julian day number times 86400000 */ + int Y, M, D; /* Year, month, and day */ + int h, m; /* Hour and minutes */ + int tz; /* Timezone offset in minutes */ + double s; /* Seconds */ + char validYMD; /* True (1) if Y,M,D are valid */ + char validHMS; /* True (1) if h,m,s are valid */ + char validJD; /* True (1) if iJD is valid */ + char validTZ; /* True (1) if tz is valid */ + char tzSet; /* Timezone was set explicitly */ +}; + + +/* +** Convert zDate into one or more integers according to the conversion +** specifier zFormat. +** +** zFormat[] contains 4 characters for each integer converted, except for +** the last integer which is specified by three characters. The meaning +** of a four-character format specifiers ABCD is: +** +** A: number of digits to convert. Always "2" or "4". +** B: minimum value. Always "0" or "1". +** C: maximum value, decoded as: +** a: 12 +** b: 14 +** c: 24 +** d: 31 +** e: 59 +** f: 9999 +** D: the separator character, or \000 to indicate this is the +** last number to convert. +** +** Example: To translate an ISO-8601 date YYYY-MM-DD, the format would +** be "40f-21a-20c". The "40f-" indicates the 4-digit year followed by "-". +** The "21a-" indicates the 2-digit month followed by "-". The "20c" indicates +** the 2-digit day which is the last integer in the set. +** +** The function returns the number of successful conversions. +*/ +static int getDigits(const char *zDate, const char *zFormat, ...){ + /* The aMx[] array translates the 3rd character of each format + ** spec into a max size: a b c d e f */ + static const u16 aMx[] = { 12, 14, 24, 31, 59, 9999 }; + va_list ap; + int cnt = 0; + char nextC; + va_start(ap, zFormat); + do{ + char N = zFormat[0] - '0'; + char min = zFormat[1] - '0'; + int val = 0; + u16 max; + + assert( zFormat[2]>='a' && zFormat[2]<='f' ); + max = aMx[zFormat[2] - 'a']; + nextC = zFormat[3]; + val = 0; + while( N-- ){ + if( !sqlite3Isdigit(*zDate) ){ + goto end_getDigits; + } + val = val*10 + *zDate - '0'; + zDate++; + } + if( val<(int)min || val>(int)max || (nextC!=0 && nextC!=*zDate) ){ + goto end_getDigits; + } + *va_arg(ap,int*) = val; + zDate++; + cnt++; + zFormat += 4; + }while( nextC ); +end_getDigits: + va_end(ap); + return cnt; +} + +/* +** Parse a timezone extension on the end of a date-time. +** The extension is of the form: +** +** (+/-)HH:MM +** +** Or the "zulu" notation: +** +** Z +** +** If the parse is successful, write the number of minutes +** of change in p->tz and return 0. If a parser error occurs, +** return non-zero. +** +** A missing specifier is not considered an error. +*/ +static int parseTimezone(const char *zDate, DateTime *p){ + int sgn = 0; + int nHr, nMn; + int c; + while( sqlite3Isspace(*zDate) ){ zDate++; } + p->tz = 0; + c = *zDate; + if( c=='-' ){ + sgn = -1; + }else if( c=='+' ){ + sgn = +1; + }else if( c=='Z' || c=='z' ){ + zDate++; + goto zulu_time; + }else{ + return c!=0; + } + zDate++; + if( getDigits(zDate, "20b:20e", &nHr, &nMn)!=2 ){ + return 1; + } + zDate += 5; + p->tz = sgn*(nMn + nHr*60); +zulu_time: + while( sqlite3Isspace(*zDate) ){ zDate++; } + p->tzSet = 1; + return *zDate!=0; +} + +/* +** Parse times of the form HH:MM or HH:MM:SS or HH:MM:SS.FFFF. +** The HH, MM, and SS must each be exactly 2 digits. The +** fractional seconds FFFF can be one or more digits. +** +** Return 1 if there is a parsing error and 0 on success. +*/ +static int parseHhMmSs(const char *zDate, DateTime *p){ + int h, m, s; + double ms = 0.0; + if( getDigits(zDate, "20c:20e", &h, &m)!=2 ){ + return 1; + } + zDate += 5; + if( *zDate==':' ){ + zDate++; + if( getDigits(zDate, "20e", &s)!=1 ){ + return 1; + } + zDate += 2; + if( *zDate=='.' && sqlite3Isdigit(zDate[1]) ){ + double rScale = 1.0; + zDate++; + while( sqlite3Isdigit(*zDate) ){ + ms = ms*10.0 + *zDate - '0'; + rScale *= 10.0; + zDate++; + } + ms /= rScale; + } + }else{ + s = 0; + } + p->validJD = 0; + p->validHMS = 1; + p->h = h; + p->m = m; + p->s = s + ms; + if( parseTimezone(zDate, p) ) return 1; + p->validTZ = (p->tz!=0)?1:0; + return 0; +} + +/* +** Convert from YYYY-MM-DD HH:MM:SS to julian day. We always assume +** that the YYYY-MM-DD is according to the Gregorian calendar. +** +** Reference: Meeus page 61 +*/ +static void computeJD(DateTime *p){ + int Y, M, D, A, B, X1, X2; + + if( p->validJD ) return; + if( p->validYMD ){ + Y = p->Y; + M = p->M; + D = p->D; + }else{ + Y = 2000; /* If no YMD specified, assume 2000-Jan-01 */ + M = 1; + D = 1; + } + if( M<=2 ){ + Y--; + M += 12; + } + A = Y/100; + B = 2 - A + (A/4); + X1 = 36525*(Y+4716)/100; + X2 = 306001*(M+1)/10000; + p->iJD = (sqlite3_int64)((X1 + X2 + D + B - 1524.5 ) * 86400000); + p->validJD = 1; + if( p->validHMS ){ + p->iJD += p->h*3600000 + p->m*60000 + (sqlite3_int64)(p->s*1000); + if( p->validTZ ){ + p->iJD -= p->tz*60000; + p->validYMD = 0; + p->validHMS = 0; + p->validTZ = 0; + } + } +} + +/* +** Parse dates of the form +** +** YYYY-MM-DD HH:MM:SS.FFF +** YYYY-MM-DD HH:MM:SS +** YYYY-MM-DD HH:MM +** YYYY-MM-DD +** +** Write the result into the DateTime structure and return 0 +** on success and 1 if the input string is not a well-formed +** date. +*/ +static int parseYyyyMmDd(const char *zDate, DateTime *p){ + int Y, M, D, neg; + + if( zDate[0]=='-' ){ + zDate++; + neg = 1; + }else{ + neg = 0; + } + if( getDigits(zDate, "40f-21a-21d", &Y, &M, &D)!=3 ){ + return 1; + } + zDate += 10; + while( sqlite3Isspace(*zDate) || 'T'==*(u8*)zDate ){ zDate++; } + if( parseHhMmSs(zDate, p)==0 ){ + /* We got the time */ + }else if( *zDate==0 ){ + p->validHMS = 0; + }else{ + return 1; + } + p->validJD = 0; + p->validYMD = 1; + p->Y = neg ? -Y : Y; + p->M = M; + p->D = D; + if( p->validTZ ){ + computeJD(p); + } + return 0; +} + +/* +** Set the time to the current time reported by the VFS. +** +** Return the number of errors. +*/ +static int setDateTimeToCurrent(sqlite3_context *context, DateTime *p){ + p->iJD = sqlite3StmtCurrentTime(context); + if( p->iJD>0 ){ + p->validJD = 1; + return 0; + }else{ + return 1; + } +} + +/* +** Attempt to parse the given string into a julian day number. Return +** the number of errors. +** +** The following are acceptable forms for the input string: +** +** YYYY-MM-DD HH:MM:SS.FFF +/-HH:MM +** DDDD.DD +** now +** +** In the first form, the +/-HH:MM is always optional. The fractional +** seconds extension (the ".FFF") is optional. The seconds portion +** (":SS.FFF") is option. The year and date can be omitted as long +** as there is a time string. The time string can be omitted as long +** as there is a year and date. +*/ +static int parseDateOrTime( + sqlite3_context *context, + const char *zDate, + DateTime *p +){ + double r; + if( parseYyyyMmDd(zDate,p)==0 ){ + return 0; + }else if( parseHhMmSs(zDate, p)==0 ){ + return 0; + }else if( sqlite3StrICmp(zDate,"now")==0){ + return setDateTimeToCurrent(context, p); + }else if( sqlite3AtoF(zDate, &r, sqlite3Strlen30(zDate), SQLITE_UTF8) ){ + p->iJD = (sqlite3_int64)(r*86400000.0 + 0.5); + p->validJD = 1; + return 0; + } + return 1; +} + +/* +** Compute the Year, Month, and Day from the julian day number. +*/ +static void computeYMD(DateTime *p){ + int Z, A, B, C, D, E, X1; + if( p->validYMD ) return; + if( !p->validJD ){ + p->Y = 2000; + p->M = 1; + p->D = 1; + }else{ + Z = (int)((p->iJD + 43200000)/86400000); + A = (int)((Z - 1867216.25)/36524.25); + A = Z + 1 + A - (A/4); + B = A + 1524; + C = (int)((B - 122.1)/365.25); + D = (36525*(C&32767))/100; + E = (int)((B-D)/30.6001); + X1 = (int)(30.6001*E); + p->D = B - D - X1; + p->M = E<14 ? E-1 : E-13; + p->Y = p->M>2 ? C - 4716 : C - 4715; + } + p->validYMD = 1; +} + +/* +** Compute the Hour, Minute, and Seconds from the julian day number. +*/ +static void computeHMS(DateTime *p){ + int s; + if( p->validHMS ) return; + computeJD(p); + s = (int)((p->iJD + 43200000) % 86400000); + p->s = s/1000.0; + s = (int)p->s; + p->s -= s; + p->h = s/3600; + s -= p->h*3600; + p->m = s/60; + p->s += s - p->m*60; + p->validHMS = 1; +} + +/* +** Compute both YMD and HMS +*/ +static void computeYMD_HMS(DateTime *p){ + computeYMD(p); + computeHMS(p); +} + +/* +** Clear the YMD and HMS and the TZ +*/ +static void clearYMD_HMS_TZ(DateTime *p){ + p->validYMD = 0; + p->validHMS = 0; + p->validTZ = 0; +} + +#ifndef SQLITE_OMIT_LOCALTIME +/* +** On recent Windows platforms, the localtime_s() function is available +** as part of the "Secure CRT". It is essentially equivalent to +** localtime_r() available under most POSIX platforms, except that the +** order of the parameters is reversed. +** +** See http://msdn.microsoft.com/en-us/library/a442x3ye(VS.80).aspx. +** +** If the user has not indicated to use localtime_r() or localtime_s() +** already, check for an MSVC build environment that provides +** localtime_s(). +*/ +#if !HAVE_LOCALTIME_R && !HAVE_LOCALTIME_S \ + && defined(_MSC_VER) && defined(_CRT_INSECURE_DEPRECATE) +#undef HAVE_LOCALTIME_S +#define HAVE_LOCALTIME_S 1 +#endif + +/* +** The following routine implements the rough equivalent of localtime_r() +** using whatever operating-system specific localtime facility that +** is available. This routine returns 0 on success and +** non-zero on any kind of error. +** +** If the sqlite3GlobalConfig.bLocaltimeFault variable is true then this +** routine will always fail. +** +** EVIDENCE-OF: R-62172-00036 In this implementation, the standard C +** library function localtime_r() is used to assist in the calculation of +** local time. +*/ +static int osLocaltime(time_t *t, struct tm *pTm){ + int rc; +#if !HAVE_LOCALTIME_R && !HAVE_LOCALTIME_S + struct tm *pX; +#if SQLITE_THREADSAFE>0 + sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); +#endif + sqlite3_mutex_enter(mutex); + pX = localtime(t); +#ifndef SQLITE_OMIT_BUILTIN_TEST + if( sqlite3GlobalConfig.bLocaltimeFault ) pX = 0; +#endif + if( pX ) *pTm = *pX; + sqlite3_mutex_leave(mutex); + rc = pX==0; +#else +#ifndef SQLITE_OMIT_BUILTIN_TEST + if( sqlite3GlobalConfig.bLocaltimeFault ) return 1; +#endif +#if HAVE_LOCALTIME_R + rc = localtime_r(t, pTm)==0; +#else + rc = localtime_s(pTm, t); +#endif /* HAVE_LOCALTIME_R */ +#endif /* HAVE_LOCALTIME_R || HAVE_LOCALTIME_S */ + return rc; +} +#endif /* SQLITE_OMIT_LOCALTIME */ + + +#ifndef SQLITE_OMIT_LOCALTIME +/* +** Compute the difference (in milliseconds) between localtime and UTC +** (a.k.a. GMT) for the time value p where p is in UTC. If no error occurs, +** return this value and set *pRc to SQLITE_OK. +** +** Or, if an error does occur, set *pRc to SQLITE_ERROR. The returned value +** is undefined in this case. +*/ +static sqlite3_int64 localtimeOffset( + DateTime *p, /* Date at which to calculate offset */ + sqlite3_context *pCtx, /* Write error here if one occurs */ + int *pRc /* OUT: Error code. SQLITE_OK or ERROR */ +){ + DateTime x, y; + time_t t; + struct tm sLocal; + + /* Initialize the contents of sLocal to avoid a compiler warning. */ + memset(&sLocal, 0, sizeof(sLocal)); + + x = *p; + computeYMD_HMS(&x); + if( x.Y<1971 || x.Y>=2038 ){ + /* EVIDENCE-OF: R-55269-29598 The localtime_r() C function normally only + ** works for years between 1970 and 2037. For dates outside this range, + ** SQLite attempts to map the year into an equivalent year within this + ** range, do the calculation, then map the year back. + */ + x.Y = 2000; + x.M = 1; + x.D = 1; + x.h = 0; + x.m = 0; + x.s = 0.0; + } else { + int s = (int)(x.s + 0.5); + x.s = s; + } + x.tz = 0; + x.validJD = 0; + computeJD(&x); + t = (time_t)(x.iJD/1000 - 21086676*(i64)10000); + if( osLocaltime(&t, &sLocal) ){ + sqlite3_result_error(pCtx, "local time unavailable", -1); + *pRc = SQLITE_ERROR; + return 0; + } + y.Y = sLocal.tm_year + 1900; + y.M = sLocal.tm_mon + 1; + y.D = sLocal.tm_mday; + y.h = sLocal.tm_hour; + y.m = sLocal.tm_min; + y.s = sLocal.tm_sec; + y.validYMD = 1; + y.validHMS = 1; + y.validJD = 0; + y.validTZ = 0; + computeJD(&y); + *pRc = SQLITE_OK; + return y.iJD - x.iJD; +} +#endif /* SQLITE_OMIT_LOCALTIME */ + +/* +** Process a modifier to a date-time stamp. The modifiers are +** as follows: +** +** NNN days +** NNN hours +** NNN minutes +** NNN.NNNN seconds +** NNN months +** NNN years +** start of month +** start of year +** start of week +** start of day +** weekday N +** unixepoch +** localtime +** utc +** +** Return 0 on success and 1 if there is any kind of error. If the error +** is in a system call (i.e. localtime()), then an error message is written +** to context pCtx. If the error is an unrecognized modifier, no error is +** written to pCtx. +*/ +static int parseModifier(sqlite3_context *pCtx, const char *zMod, DateTime *p){ + int rc = 1; + int n; + double r; + char *z, zBuf[30]; + z = zBuf; + for(n=0; niJD += localtimeOffset(p, pCtx, &rc); + clearYMD_HMS_TZ(p); + } + break; + } +#endif + case 'u': { + /* + ** unixepoch + ** + ** Treat the current value of p->iJD as the number of + ** seconds since 1970. Convert to a real julian day number. + */ + if( strcmp(z, "unixepoch")==0 && p->validJD ){ + p->iJD = (p->iJD + 43200)/86400 + 21086676*(i64)10000000; + clearYMD_HMS_TZ(p); + rc = 0; + } +#ifndef SQLITE_OMIT_LOCALTIME + else if( strcmp(z, "utc")==0 ){ + if( p->tzSet==0 ){ + sqlite3_int64 c1; + computeJD(p); + c1 = localtimeOffset(p, pCtx, &rc); + if( rc==SQLITE_OK ){ + p->iJD -= c1; + clearYMD_HMS_TZ(p); + p->iJD += c1 - localtimeOffset(p, pCtx, &rc); + } + p->tzSet = 1; + }else{ + rc = SQLITE_OK; + } + } +#endif + break; + } + case 'w': { + /* + ** weekday N + ** + ** Move the date to the same time on the next occurrence of + ** weekday N where 0==Sunday, 1==Monday, and so forth. If the + ** date is already on the appropriate weekday, this is a no-op. + */ + if( strncmp(z, "weekday ", 8)==0 + && sqlite3AtoF(&z[8], &r, sqlite3Strlen30(&z[8]), SQLITE_UTF8) + && (n=(int)r)==r && n>=0 && r<7 ){ + sqlite3_int64 Z; + computeYMD_HMS(p); + p->validTZ = 0; + p->validJD = 0; + computeJD(p); + Z = ((p->iJD + 129600000)/86400000) % 7; + if( Z>n ) Z -= 7; + p->iJD += (n - Z)*86400000; + clearYMD_HMS_TZ(p); + rc = 0; + } + break; + } + case 's': { + /* + ** start of TTTTT + ** + ** Move the date backwards to the beginning of the current day, + ** or month or year. + */ + if( strncmp(z, "start of ", 9)!=0 ) break; + z += 9; + computeYMD(p); + p->validHMS = 1; + p->h = p->m = 0; + p->s = 0.0; + p->validTZ = 0; + p->validJD = 0; + if( strcmp(z,"month")==0 ){ + p->D = 1; + rc = 0; + }else if( strcmp(z,"year")==0 ){ + computeYMD(p); + p->M = 1; + p->D = 1; + rc = 0; + }else if( strcmp(z,"day")==0 ){ + rc = 0; + } + break; + } + case '+': + case '-': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': { + double rRounder; + for(n=1; z[n] && z[n]!=':' && !sqlite3Isspace(z[n]); n++){} + if( !sqlite3AtoF(z, &r, n, SQLITE_UTF8) ){ + rc = 1; + break; + } + if( z[n]==':' ){ + /* A modifier of the form (+|-)HH:MM:SS.FFF adds (or subtracts) the + ** specified number of hours, minutes, seconds, and fractional seconds + ** to the time. The ".FFF" may be omitted. The ":SS.FFF" may be + ** omitted. + */ + const char *z2 = z; + DateTime tx; + sqlite3_int64 day; + if( !sqlite3Isdigit(*z2) ) z2++; + memset(&tx, 0, sizeof(tx)); + if( parseHhMmSs(z2, &tx) ) break; + computeJD(&tx); + tx.iJD -= 43200000; + day = tx.iJD/86400000; + tx.iJD -= day*86400000; + if( z[0]=='-' ) tx.iJD = -tx.iJD; + computeJD(p); + clearYMD_HMS_TZ(p); + p->iJD += tx.iJD; + rc = 0; + break; + } + z += n; + while( sqlite3Isspace(*z) ) z++; + n = sqlite3Strlen30(z); + if( n>10 || n<3 ) break; + if( z[n-1]=='s' ){ z[n-1] = 0; n--; } + computeJD(p); + rc = 0; + rRounder = r<0 ? -0.5 : +0.5; + if( n==3 && strcmp(z,"day")==0 ){ + p->iJD += (sqlite3_int64)(r*86400000.0 + rRounder); + }else if( n==4 && strcmp(z,"hour")==0 ){ + p->iJD += (sqlite3_int64)(r*(86400000.0/24.0) + rRounder); + }else if( n==6 && strcmp(z,"minute")==0 ){ + p->iJD += (sqlite3_int64)(r*(86400000.0/(24.0*60.0)) + rRounder); + }else if( n==6 && strcmp(z,"second")==0 ){ + p->iJD += (sqlite3_int64)(r*(86400000.0/(24.0*60.0*60.0)) + rRounder); + }else if( n==5 && strcmp(z,"month")==0 ){ + int x, y; + computeYMD_HMS(p); + p->M += (int)r; + x = p->M>0 ? (p->M-1)/12 : (p->M-12)/12; + p->Y += x; + p->M -= x*12; + p->validJD = 0; + computeJD(p); + y = (int)r; + if( y!=r ){ + p->iJD += (sqlite3_int64)((r - y)*30.0*86400000.0 + rRounder); + } + }else if( n==4 && strcmp(z,"year")==0 ){ + int y = (int)r; + computeYMD_HMS(p); + p->Y += y; + p->validJD = 0; + computeJD(p); + if( y!=r ){ + p->iJD += (sqlite3_int64)((r - y)*365.0*86400000.0 + rRounder); + } + }else{ + rc = 1; + } + clearYMD_HMS_TZ(p); + break; + } + default: { + break; + } + } + return rc; +} + +/* +** Process time function arguments. argv[0] is a date-time stamp. +** argv[1] and following are modifiers. Parse them all and write +** the resulting time into the DateTime structure p. Return 0 +** on success and 1 if there are any errors. +** +** If there are zero parameters (if even argv[0] is undefined) +** then assume a default value of "now" for argv[0]. +*/ +static int isDate( + sqlite3_context *context, + int argc, + sqlite3_value **argv, + DateTime *p +){ + int i; + const unsigned char *z; + int eType; + memset(p, 0, sizeof(*p)); + if( argc==0 ){ + return setDateTimeToCurrent(context, p); + } + if( (eType = sqlite3_value_type(argv[0]))==SQLITE_FLOAT + || eType==SQLITE_INTEGER ){ + p->iJD = (sqlite3_int64)(sqlite3_value_double(argv[0])*86400000.0 + 0.5); + p->validJD = 1; + }else{ + z = sqlite3_value_text(argv[0]); + if( !z || parseDateOrTime(context, (char*)z, p) ){ + return 1; + } + } + for(i=1; iaLimit[SQLITE_LIMIT_LENGTH]+1 ); + testcase( n==(u64)db->aLimit[SQLITE_LIMIT_LENGTH] ); + if( n(u64)db->aLimit[SQLITE_LIMIT_LENGTH] ){ + sqlite3_result_error_toobig(context); + return; + }else{ + z = sqlite3DbMallocRawNN(db, (int)n); + if( z==0 ){ + sqlite3_result_error_nomem(context); + return; + } + } + computeJD(&x); + computeYMD_HMS(&x); + for(i=j=0; zFmt[i]; i++){ + if( zFmt[i]!='%' ){ + z[j++] = zFmt[i]; + }else{ + i++; + switch( zFmt[i] ){ + case 'd': sqlite3_snprintf(3, &z[j],"%02d",x.D); j+=2; break; + case 'f': { + double s = x.s; + if( s>59.999 ) s = 59.999; + sqlite3_snprintf(7, &z[j],"%06.3f", s); + j += sqlite3Strlen30(&z[j]); + break; + } + case 'H': sqlite3_snprintf(3, &z[j],"%02d",x.h); j+=2; break; + case 'W': /* Fall thru */ + case 'j': { + int nDay; /* Number of days since 1st day of year */ + DateTime y = x; + y.validJD = 0; + y.M = 1; + y.D = 1; + computeJD(&y); + nDay = (int)((x.iJD-y.iJD+43200000)/86400000); + if( zFmt[i]=='W' ){ + int wd; /* 0=Monday, 1=Tuesday, ... 6=Sunday */ + wd = (int)(((x.iJD+43200000)/86400000)%7); + sqlite3_snprintf(3, &z[j],"%02d",(nDay+7-wd)/7); + j += 2; + }else{ + sqlite3_snprintf(4, &z[j],"%03d",nDay+1); + j += 3; + } + break; + } + case 'J': { + sqlite3_snprintf(20, &z[j],"%.16g",x.iJD/86400000.0); + j+=sqlite3Strlen30(&z[j]); + break; + } + case 'm': sqlite3_snprintf(3, &z[j],"%02d",x.M); j+=2; break; + case 'M': sqlite3_snprintf(3, &z[j],"%02d",x.m); j+=2; break; + case 's': { + sqlite3_snprintf(30,&z[j],"%lld", + (i64)(x.iJD/1000 - 21086676*(i64)10000)); + j += sqlite3Strlen30(&z[j]); + break; + } + case 'S': sqlite3_snprintf(3,&z[j],"%02d",(int)x.s); j+=2; break; + case 'w': { + z[j++] = (char)(((x.iJD+129600000)/86400000) % 7) + '0'; + break; + } + case 'Y': { + sqlite3_snprintf(5,&z[j],"%04d",x.Y); j+=sqlite3Strlen30(&z[j]); + break; + } + default: z[j++] = '%'; break; + } + } + } + z[j] = 0; + sqlite3_result_text(context, z, -1, + z==zBuf ? SQLITE_TRANSIENT : SQLITE_DYNAMIC); +} + +/* +** current_time() +** +** This function returns the same value as time('now'). +*/ +static void ctimeFunc( + sqlite3_context *context, + int NotUsed, + sqlite3_value **NotUsed2 +){ + UNUSED_PARAMETER2(NotUsed, NotUsed2); + timeFunc(context, 0, 0); +} + +/* +** current_date() +** +** This function returns the same value as date('now'). +*/ +static void cdateFunc( + sqlite3_context *context, + int NotUsed, + sqlite3_value **NotUsed2 +){ + UNUSED_PARAMETER2(NotUsed, NotUsed2); + dateFunc(context, 0, 0); +} + +/* +** current_timestamp() +** +** This function returns the same value as datetime('now'). +*/ +static void ctimestampFunc( + sqlite3_context *context, + int NotUsed, + sqlite3_value **NotUsed2 +){ + UNUSED_PARAMETER2(NotUsed, NotUsed2); + datetimeFunc(context, 0, 0); +} +#endif /* !defined(SQLITE_OMIT_DATETIME_FUNCS) */ + +#ifdef SQLITE_OMIT_DATETIME_FUNCS +/* +** If the library is compiled to omit the full-scale date and time +** handling (to get a smaller binary), the following minimal version +** of the functions current_time(), current_date() and current_timestamp() +** are included instead. This is to support column declarations that +** include "DEFAULT CURRENT_TIME" etc. +** +** This function uses the C-library functions time(), gmtime() +** and strftime(). The format string to pass to strftime() is supplied +** as the user-data for the function. +*/ +static void currentTimeFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + time_t t; + char *zFormat = (char *)sqlite3_user_data(context); + sqlite3_int64 iT; + struct tm *pTm; + struct tm sNow; + char zBuf[20]; + + UNUSED_PARAMETER(argc); + UNUSED_PARAMETER(argv); + + iT = sqlite3StmtCurrentTime(context); + if( iT<=0 ) return; + t = iT/1000 - 10000*(sqlite3_int64)21086676; +#if HAVE_GMTIME_R + pTm = gmtime_r(&t, &sNow); +#else + sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER)); + pTm = gmtime(&t); + if( pTm ) memcpy(&sNow, pTm, sizeof(sNow)); + sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER)); +#endif + if( pTm ){ + strftime(zBuf, 20, zFormat, &sNow); + sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT); + } +} +#endif + +/* +** This function registered all of the above C functions as SQL +** functions. This should be the only routine in this file with +** external linkage. +*/ +SQLITE_PRIVATE void sqlite3RegisterDateTimeFunctions(void){ + static FuncDef aDateTimeFuncs[] = { +#ifndef SQLITE_OMIT_DATETIME_FUNCS + DFUNCTION(julianday, -1, 0, 0, juliandayFunc ), + DFUNCTION(date, -1, 0, 0, dateFunc ), + DFUNCTION(time, -1, 0, 0, timeFunc ), + DFUNCTION(datetime, -1, 0, 0, datetimeFunc ), + DFUNCTION(strftime, -1, 0, 0, strftimeFunc ), + DFUNCTION(current_time, 0, 0, 0, ctimeFunc ), + DFUNCTION(current_timestamp, 0, 0, 0, ctimestampFunc), + DFUNCTION(current_date, 0, 0, 0, cdateFunc ), +#else + STR_FUNCTION(current_time, 0, "%H:%M:%S", 0, currentTimeFunc), + STR_FUNCTION(current_date, 0, "%Y-%m-%d", 0, currentTimeFunc), + STR_FUNCTION(current_timestamp, 0, "%Y-%m-%d %H:%M:%S", 0, currentTimeFunc), +#endif + }; + sqlite3InsertBuiltinFuncs(aDateTimeFuncs, ArraySize(aDateTimeFuncs)); +} + +/************** End of date.c ************************************************/ +/************** Begin file os.c **********************************************/ +/* +** 2005 November 29 +** +** 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 OS interface code that is common to all +** architectures. +*/ +/* #include "sqliteInt.h" */ + +/* +** If we compile with the SQLITE_TEST macro set, then the following block +** of code will give us the ability to simulate a disk I/O error. This +** is used for testing the I/O recovery logic. +*/ +#if defined(SQLITE_TEST) +SQLITE_API int sqlite3_io_error_hit = 0; /* Total number of I/O Errors */ +SQLITE_API int sqlite3_io_error_hardhit = 0; /* Number of non-benign errors */ +SQLITE_API int sqlite3_io_error_pending = 0; /* Count down to first I/O error */ +SQLITE_API int sqlite3_io_error_persist = 0; /* True if I/O errors persist */ +SQLITE_API int sqlite3_io_error_benign = 0; /* True if errors are benign */ +SQLITE_API int sqlite3_diskfull_pending = 0; +SQLITE_API int sqlite3_diskfull = 0; +#endif /* defined(SQLITE_TEST) */ + +/* +** When testing, also keep a count of the number of open files. +*/ +#if defined(SQLITE_TEST) +SQLITE_API int sqlite3_open_file_count = 0; +#endif /* defined(SQLITE_TEST) */ + +/* +** The default SQLite sqlite3_vfs implementations do not allocate +** memory (actually, os_unix.c allocates a small amount of memory +** from within OsOpen()), but some third-party implementations may. +** So we test the effects of a malloc() failing and the sqlite3OsXXX() +** function returning SQLITE_IOERR_NOMEM using the DO_OS_MALLOC_TEST macro. +** +** The following functions are instrumented for malloc() failure +** testing: +** +** sqlite3OsRead() +** sqlite3OsWrite() +** sqlite3OsSync() +** sqlite3OsFileSize() +** sqlite3OsLock() +** sqlite3OsCheckReservedLock() +** sqlite3OsFileControl() +** sqlite3OsShmMap() +** sqlite3OsOpen() +** sqlite3OsDelete() +** sqlite3OsAccess() +** sqlite3OsFullPathname() +** +*/ +#if defined(SQLITE_TEST) +SQLITE_API int sqlite3_memdebug_vfs_oom_test = 1; + #define DO_OS_MALLOC_TEST(x) \ + if (sqlite3_memdebug_vfs_oom_test && (!x || !sqlite3JournalIsInMemory(x))) { \ + void *pTstAlloc = sqlite3Malloc(10); \ + if (!pTstAlloc) return SQLITE_IOERR_NOMEM_BKPT; \ + sqlite3_free(pTstAlloc); \ + } +#else + #define DO_OS_MALLOC_TEST(x) +#endif + +/* +** The following routines are convenience wrappers around methods +** of the sqlite3_file object. This is mostly just syntactic sugar. All +** of this would be completely automatic if SQLite were coded using +** C++ instead of plain old C. +*/ +SQLITE_PRIVATE void sqlite3OsClose(sqlite3_file *pId){ + if( pId->pMethods ){ + pId->pMethods->xClose(pId); + pId->pMethods = 0; + } +} +SQLITE_PRIVATE int sqlite3OsRead(sqlite3_file *id, void *pBuf, int amt, i64 offset){ + DO_OS_MALLOC_TEST(id); + return id->pMethods->xRead(id, pBuf, amt, offset); +} +SQLITE_PRIVATE int sqlite3OsWrite(sqlite3_file *id, const void *pBuf, int amt, i64 offset){ + DO_OS_MALLOC_TEST(id); + return id->pMethods->xWrite(id, pBuf, amt, offset); +} +SQLITE_PRIVATE int sqlite3OsTruncate(sqlite3_file *id, i64 size){ + return id->pMethods->xTruncate(id, size); +} +SQLITE_PRIVATE int sqlite3OsSync(sqlite3_file *id, int flags){ + DO_OS_MALLOC_TEST(id); + return id->pMethods->xSync(id, flags); +} +SQLITE_PRIVATE int sqlite3OsFileSize(sqlite3_file *id, i64 *pSize){ + DO_OS_MALLOC_TEST(id); + return id->pMethods->xFileSize(id, pSize); +} +SQLITE_PRIVATE int sqlite3OsLock(sqlite3_file *id, int lockType){ + DO_OS_MALLOC_TEST(id); + return id->pMethods->xLock(id, lockType); +} +SQLITE_PRIVATE int sqlite3OsUnlock(sqlite3_file *id, int lockType){ + return id->pMethods->xUnlock(id, lockType); +} +SQLITE_PRIVATE int sqlite3OsCheckReservedLock(sqlite3_file *id, int *pResOut){ + DO_OS_MALLOC_TEST(id); + return id->pMethods->xCheckReservedLock(id, pResOut); +} + +/* +** Use sqlite3OsFileControl() when we are doing something that might fail +** and we need to know about the failures. Use sqlite3OsFileControlHint() +** when simply tossing information over the wall to the VFS and we do not +** really care if the VFS receives and understands the information since it +** is only a hint and can be safely ignored. The sqlite3OsFileControlHint() +** routine has no return value since the return value would be meaningless. +*/ +SQLITE_PRIVATE int sqlite3OsFileControl(sqlite3_file *id, int op, void *pArg){ +#ifdef SQLITE_TEST + if( op!=SQLITE_FCNTL_COMMIT_PHASETWO ){ + /* Faults are not injected into COMMIT_PHASETWO because, assuming SQLite + ** is using a regular VFS, it is called after the corresponding + ** transaction has been committed. Injecting a fault at this point + ** confuses the test scripts - the COMMIT comand returns SQLITE_NOMEM + ** but the transaction is committed anyway. + ** + ** The core must call OsFileControl() though, not OsFileControlHint(), + ** as if a custom VFS (e.g. zipvfs) returns an error here, it probably + ** means the commit really has failed and an error should be returned + ** to the user. */ + DO_OS_MALLOC_TEST(id); + } +#endif + return id->pMethods->xFileControl(id, op, pArg); +} +SQLITE_PRIVATE void sqlite3OsFileControlHint(sqlite3_file *id, int op, void *pArg){ + (void)id->pMethods->xFileControl(id, op, pArg); +} + +SQLITE_PRIVATE int sqlite3OsSectorSize(sqlite3_file *id){ + int (*xSectorSize)(sqlite3_file*) = id->pMethods->xSectorSize; + return (xSectorSize ? xSectorSize(id) : SQLITE_DEFAULT_SECTOR_SIZE); +} +SQLITE_PRIVATE int sqlite3OsDeviceCharacteristics(sqlite3_file *id){ + return id->pMethods->xDeviceCharacteristics(id); +} +SQLITE_PRIVATE int sqlite3OsShmLock(sqlite3_file *id, int offset, int n, int flags){ + return id->pMethods->xShmLock(id, offset, n, flags); +} +SQLITE_PRIVATE void sqlite3OsShmBarrier(sqlite3_file *id){ + id->pMethods->xShmBarrier(id); +} +SQLITE_PRIVATE int sqlite3OsShmUnmap(sqlite3_file *id, int deleteFlag){ + return id->pMethods->xShmUnmap(id, deleteFlag); +} +SQLITE_PRIVATE int sqlite3OsShmMap( + sqlite3_file *id, /* Database file handle */ + int iPage, + int pgsz, + int bExtend, /* True to extend file if necessary */ + void volatile **pp /* OUT: Pointer to mapping */ +){ + DO_OS_MALLOC_TEST(id); + return id->pMethods->xShmMap(id, iPage, pgsz, bExtend, pp); +} + +#if SQLITE_MAX_MMAP_SIZE>0 +/* The real implementation of xFetch and xUnfetch */ +SQLITE_PRIVATE int sqlite3OsFetch(sqlite3_file *id, i64 iOff, int iAmt, void **pp){ + DO_OS_MALLOC_TEST(id); + return id->pMethods->xFetch(id, iOff, iAmt, pp); +} +SQLITE_PRIVATE int sqlite3OsUnfetch(sqlite3_file *id, i64 iOff, void *p){ + return id->pMethods->xUnfetch(id, iOff, p); +} +#else +/* No-op stubs to use when memory-mapped I/O is disabled */ +SQLITE_PRIVATE int sqlite3OsFetch(sqlite3_file *id, i64 iOff, int iAmt, void **pp){ + *pp = 0; + return SQLITE_OK; +} +SQLITE_PRIVATE int sqlite3OsUnfetch(sqlite3_file *id, i64 iOff, void *p){ + return SQLITE_OK; +} +#endif + +/* +** The next group of routines are convenience wrappers around the +** VFS methods. +*/ +SQLITE_PRIVATE int sqlite3OsOpen( + sqlite3_vfs *pVfs, + const char *zPath, + sqlite3_file *pFile, + int flags, + int *pFlagsOut +){ + int rc; + DO_OS_MALLOC_TEST(0); + /* 0x87f7f is a mask of SQLITE_OPEN_ flags that are valid to be passed + ** down into the VFS layer. Some SQLITE_OPEN_ flags (for example, + ** SQLITE_OPEN_FULLMUTEX or SQLITE_OPEN_SHAREDCACHE) are blocked before + ** reaching the VFS. */ + rc = pVfs->xOpen(pVfs, zPath, pFile, flags & 0x87f7f, pFlagsOut); + assert( rc==SQLITE_OK || pFile->pMethods==0 ); + return rc; +} +SQLITE_PRIVATE int sqlite3OsDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){ + DO_OS_MALLOC_TEST(0); + assert( dirSync==0 || dirSync==1 ); + return pVfs->xDelete(pVfs, zPath, dirSync); +} +SQLITE_PRIVATE int sqlite3OsAccess( + sqlite3_vfs *pVfs, + const char *zPath, + int flags, + int *pResOut +){ + DO_OS_MALLOC_TEST(0); + return pVfs->xAccess(pVfs, zPath, flags, pResOut); +} +SQLITE_PRIVATE int sqlite3OsFullPathname( + sqlite3_vfs *pVfs, + const char *zPath, + int nPathOut, + char *zPathOut +){ + DO_OS_MALLOC_TEST(0); + zPathOut[0] = 0; + return pVfs->xFullPathname(pVfs, zPath, nPathOut, zPathOut); +} +#ifndef SQLITE_OMIT_LOAD_EXTENSION +SQLITE_PRIVATE void *sqlite3OsDlOpen(sqlite3_vfs *pVfs, const char *zPath){ + return pVfs->xDlOpen(pVfs, zPath); +} +SQLITE_PRIVATE void sqlite3OsDlError(sqlite3_vfs *pVfs, int nByte, char *zBufOut){ + pVfs->xDlError(pVfs, nByte, zBufOut); +} +SQLITE_PRIVATE void (*sqlite3OsDlSym(sqlite3_vfs *pVfs, void *pHdle, const char *zSym))(void){ + return pVfs->xDlSym(pVfs, pHdle, zSym); +} +SQLITE_PRIVATE void sqlite3OsDlClose(sqlite3_vfs *pVfs, void *pHandle){ + pVfs->xDlClose(pVfs, pHandle); +} +#endif /* SQLITE_OMIT_LOAD_EXTENSION */ +SQLITE_PRIVATE int sqlite3OsRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){ + return pVfs->xRandomness(pVfs, nByte, zBufOut); +} +SQLITE_PRIVATE int sqlite3OsSleep(sqlite3_vfs *pVfs, int nMicro){ + return pVfs->xSleep(pVfs, nMicro); +} +SQLITE_PRIVATE int sqlite3OsGetLastError(sqlite3_vfs *pVfs){ + return pVfs->xGetLastError ? pVfs->xGetLastError(pVfs, 0, 0) : 0; +} +SQLITE_PRIVATE int sqlite3OsCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *pTimeOut){ + int rc; + /* IMPLEMENTATION-OF: R-49045-42493 SQLite will use the xCurrentTimeInt64() + ** method to get the current date and time if that method is available + ** (if iVersion is 2 or greater and the function pointer is not NULL) and + ** will fall back to xCurrentTime() if xCurrentTimeInt64() is + ** unavailable. + */ + if( pVfs->iVersion>=2 && pVfs->xCurrentTimeInt64 ){ + rc = pVfs->xCurrentTimeInt64(pVfs, pTimeOut); + }else{ + double r; + rc = pVfs->xCurrentTime(pVfs, &r); + *pTimeOut = (sqlite3_int64)(r*86400000.0); + } + return rc; +} + +SQLITE_PRIVATE int sqlite3OsOpenMalloc( + sqlite3_vfs *pVfs, + const char *zFile, + sqlite3_file **ppFile, + int flags, + int *pOutFlags +){ + int rc; + sqlite3_file *pFile; + pFile = (sqlite3_file *)sqlite3MallocZero(pVfs->szOsFile); + if( pFile ){ + rc = sqlite3OsOpen(pVfs, zFile, pFile, flags, pOutFlags); + if( rc!=SQLITE_OK ){ + sqlite3_free(pFile); + }else{ + *ppFile = pFile; + } + }else{ + rc = SQLITE_NOMEM_BKPT; + } + return rc; +} +SQLITE_PRIVATE void sqlite3OsCloseFree(sqlite3_file *pFile){ + assert( pFile ); + sqlite3OsClose(pFile); + sqlite3_free(pFile); +} + +/* +** This function is a wrapper around the OS specific implementation of +** sqlite3_os_init(). The purpose of the wrapper is to provide the +** ability to simulate a malloc failure, so that the handling of an +** error in sqlite3_os_init() by the upper layers can be tested. +*/ +SQLITE_PRIVATE int sqlite3OsInit(void){ + void *p = sqlite3_malloc(10); + if( p==0 ) return SQLITE_NOMEM_BKPT; + sqlite3_free(p); + return sqlite3_os_init(); +} + +/* +** The list of all registered VFS implementations. +*/ +static sqlite3_vfs * SQLITE_WSD vfsList = 0; +#define vfsList GLOBAL(sqlite3_vfs *, vfsList) + +/* +** Locate a VFS by name. If no name is given, simply return the +** first VFS on the list. +*/ +SQLITE_API sqlite3_vfs *sqlite3_vfs_find(const char *zVfs){ + sqlite3_vfs *pVfs = 0; +#if SQLITE_THREADSAFE + sqlite3_mutex *mutex; +#endif +#ifndef SQLITE_OMIT_AUTOINIT + int rc = sqlite3_initialize(); + if( rc ) return 0; +#endif +#if SQLITE_THREADSAFE + mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); +#endif + sqlite3_mutex_enter(mutex); + for(pVfs = vfsList; pVfs; pVfs=pVfs->pNext){ + if( zVfs==0 ) break; + if( strcmp(zVfs, pVfs->zName)==0 ) break; + } + sqlite3_mutex_leave(mutex); + return pVfs; +} + +/* +** Unlink a VFS from the linked list +*/ +static void vfsUnlink(sqlite3_vfs *pVfs){ + assert( sqlite3_mutex_held(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER)) ); + if( pVfs==0 ){ + /* No-op */ + }else if( vfsList==pVfs ){ + vfsList = pVfs->pNext; + }else if( vfsList ){ + sqlite3_vfs *p = vfsList; + while( p->pNext && p->pNext!=pVfs ){ + p = p->pNext; + } + if( p->pNext==pVfs ){ + p->pNext = pVfs->pNext; + } + } +} + +/* +** Register a VFS with the system. It is harmless to register the same +** VFS multiple times. The new VFS becomes the default if makeDflt is +** true. +*/ +SQLITE_API int sqlite3_vfs_register(sqlite3_vfs *pVfs, int makeDflt){ + MUTEX_LOGIC(sqlite3_mutex *mutex;) +#ifndef SQLITE_OMIT_AUTOINIT + int rc = sqlite3_initialize(); + if( rc ) return rc; +#endif +#ifdef SQLITE_ENABLE_API_ARMOR + if( pVfs==0 ) return SQLITE_MISUSE_BKPT; +#endif + + MUTEX_LOGIC( mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); ) + sqlite3_mutex_enter(mutex); + vfsUnlink(pVfs); + if( makeDflt || vfsList==0 ){ + pVfs->pNext = vfsList; + vfsList = pVfs; + }else{ + pVfs->pNext = vfsList->pNext; + vfsList->pNext = pVfs; + } + assert(vfsList); + sqlite3_mutex_leave(mutex); + return SQLITE_OK; +} + +/* +** Unregister a VFS so that it is no longer accessible. +*/ +SQLITE_API int sqlite3_vfs_unregister(sqlite3_vfs *pVfs){ +#if SQLITE_THREADSAFE + sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); +#endif + sqlite3_mutex_enter(mutex); + vfsUnlink(pVfs); + sqlite3_mutex_leave(mutex); + return SQLITE_OK; +} + +/************** End of os.c **************************************************/ +/************** Begin file fault.c *******************************************/ +/* +** 2008 Jan 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 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 +** and returns 0). +** +** Most malloc failures are non-benign. After they occur, SQLite +** abandons the current operation and returns an error code (usually +** SQLITE_NOMEM) to the user. However, sometimes a fault is not necessarily +** fatal. For example, if a malloc fails while resizing a hash table, this +** is completely recoverable simply by not carrying out the resize. The +** hash table will continue to function normally. So a malloc failure +** during a hash table resize is a benign fault. +*/ + +/* #include "sqliteInt.h" */ + +#ifndef SQLITE_OMIT_BUILTIN_TEST + +/* +** Global variables. +*/ +typedef struct BenignMallocHooks BenignMallocHooks; +static SQLITE_WSD struct BenignMallocHooks { + void (*xBenignBegin)(void); + void (*xBenignEnd)(void); +} sqlite3Hooks = { 0, 0 }; + +/* The "wsdHooks" macro will resolve to the appropriate BenignMallocHooks +** structure. If writable static data is unsupported on the target, +** we have to locate the state vector at run-time. In the more common +** case where writable static data is supported, wsdHooks can refer directly +** to the "sqlite3Hooks" state vector declared above. +*/ +#ifdef SQLITE_OMIT_WSD +# define wsdHooksInit \ + BenignMallocHooks *x = &GLOBAL(BenignMallocHooks,sqlite3Hooks) +# define wsdHooks x[0] +#else +# define wsdHooksInit +# define wsdHooks sqlite3Hooks +#endif + + +/* +** Register hooks to call when sqlite3BeginBenignMalloc() and +** sqlite3EndBenignMalloc() are called, respectively. +*/ +SQLITE_PRIVATE void sqlite3BenignMallocHooks( + void (*xBenignBegin)(void), + void (*xBenignEnd)(void) +){ + wsdHooksInit; + wsdHooks.xBenignBegin = xBenignBegin; + wsdHooks.xBenignEnd = xBenignEnd; +} + +/* +** This (sqlite3EndBenignMalloc()) is called by SQLite code to indicate that +** subsequent malloc failures are benign. A call to sqlite3EndBenignMalloc() +** indicates that subsequent malloc failures are non-benign. +*/ +SQLITE_PRIVATE void sqlite3BeginBenignMalloc(void){ + wsdHooksInit; + if( wsdHooks.xBenignBegin ){ + wsdHooks.xBenignBegin(); + } +} +SQLITE_PRIVATE void sqlite3EndBenignMalloc(void){ + wsdHooksInit; + if( wsdHooks.xBenignEnd ){ + wsdHooks.xBenignEnd(); + } +} + +#endif /* #ifndef SQLITE_OMIT_BUILTIN_TEST */ + +/************** End of fault.c ***********************************************/ +/************** Begin file mem0.c ********************************************/ +/* +** 2008 October 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 file contains a no-op memory allocation drivers for use when +** SQLITE_ZERO_MALLOC is defined. The allocation drivers implemented +** 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. +*/ +/* #include "sqliteInt.h" */ + +/* +** This version of the memory allocator is the default. It is +** used when no other memory allocator is specified using compile-time +** macros. +*/ +#ifdef SQLITE_ZERO_MALLOC + +/* +** No-op versions of all memory allocation routines +*/ +static void *sqlite3MemMalloc(int nByte){ return 0; } +static void sqlite3MemFree(void *pPrior){ return; } +static void *sqlite3MemRealloc(void *pPrior, int nByte){ return 0; } +static int sqlite3MemSize(void *pPrior){ return 0; } +static int sqlite3MemRoundup(int n){ return n; } +static int sqlite3MemInit(void *NotUsed){ return SQLITE_OK; } +static void sqlite3MemShutdown(void *NotUsed){ return; } + +/* +** This routine is the only routine in this file with external linkage. +** +** Populate the low-level memory allocation function pointers in +** sqlite3GlobalConfig.m with pointers to the routines in this file. +*/ +SQLITE_PRIVATE void sqlite3MemSetDefault(void){ + static const sqlite3_mem_methods defaultMethods = { + sqlite3MemMalloc, + sqlite3MemFree, + sqlite3MemRealloc, + sqlite3MemSize, + sqlite3MemRoundup, + sqlite3MemInit, + sqlite3MemShutdown, + 0 + }; + sqlite3_config(SQLITE_CONFIG_MALLOC, &defaultMethods); +} + +#endif /* SQLITE_ZERO_MALLOC */ + +/************** End of mem0.c ************************************************/ +/************** Begin file mem1.c ********************************************/ +/* +** 2007 August 14 +** +** 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 low-level memory allocation drivers for when +** SQLite will use the standard C-library malloc/realloc/free interface +** to obtain the memory it needs. +** +** This file contains implementations of the low-level memory allocation +** routines specified in the sqlite3_mem_methods object. The content of +** this file is only used if SQLITE_SYSTEM_MALLOC is defined. The +** SQLITE_SYSTEM_MALLOC macro is defined automatically if neither the +** SQLITE_MEMDEBUG nor the SQLITE_WIN32_MALLOC macros are defined. The +** default configuration is to use memory allocation routines in this +** file. +** +** C-preprocessor macro summary: +** +** HAVE_MALLOC_USABLE_SIZE The configure script sets this symbol if +** the malloc_usable_size() interface exists +** on the target platform. Or, this symbol +** can be set manually, if desired. +** If an equivalent interface exists by +** a different name, using a separate -D +** option to rename it. +** +** SQLITE_WITHOUT_ZONEMALLOC Some older macs lack support for the zone +** memory allocator. Set this symbol to enable +** building on older macs. +** +** SQLITE_WITHOUT_MSIZE Set this symbol to disable the use of +** _msize() on windows systems. This might +** be necessary when compiling for Delphi, +** for example. +*/ +/* #include "sqliteInt.h" */ + +/* +** This version of the memory allocator is the default. It is +** used when no other memory allocator is specified using compile-time +** macros. +*/ +#ifdef SQLITE_SYSTEM_MALLOC +#if defined(__APPLE__) && !defined(SQLITE_WITHOUT_ZONEMALLOC) + +/* +** Use the zone allocator available on apple products unless the +** SQLITE_WITHOUT_ZONEMALLOC symbol is defined. +*/ +#include +#include +#include +static malloc_zone_t* _sqliteZone_; +#define SQLITE_MALLOC(x) malloc_zone_malloc(_sqliteZone_, (x)) +#define SQLITE_FREE(x) malloc_zone_free(_sqliteZone_, (x)); +#define SQLITE_REALLOC(x,y) malloc_zone_realloc(_sqliteZone_, (x), (y)) +#define SQLITE_MALLOCSIZE(x) \ + (_sqliteZone_ ? _sqliteZone_->size(_sqliteZone_,x) : malloc_size(x)) + +#else /* if not __APPLE__ */ + +/* +** Use standard C library malloc and free on non-Apple systems. +** Also used by Apple systems if SQLITE_WITHOUT_ZONEMALLOC is defined. +*/ +#define SQLITE_MALLOC(x) malloc(x) +#define SQLITE_FREE(x) free(x) +#define SQLITE_REALLOC(x,y) realloc((x),(y)) + +/* +** The malloc.h header file is needed for malloc_usable_size() function +** on some systems (e.g. Linux). +*/ +#if HAVE_MALLOC_H && HAVE_MALLOC_USABLE_SIZE +# define SQLITE_USE_MALLOC_H 1 +# define SQLITE_USE_MALLOC_USABLE_SIZE 1 +/* +** The MSVCRT has malloc_usable_size(), but it is called _msize(). The +** use of _msize() is automatic, but can be disabled by compiling with +** -DSQLITE_WITHOUT_MSIZE. Using the _msize() function also requires +** the malloc.h header file. +*/ +#elif defined(_MSC_VER) && !defined(SQLITE_WITHOUT_MSIZE) +# define SQLITE_USE_MALLOC_H +# define SQLITE_USE_MSIZE +#endif + +/* +** Include the malloc.h header file, if necessary. Also set define macro +** SQLITE_MALLOCSIZE to the appropriate function name, which is _msize() +** for MSVC and malloc_usable_size() for most other systems (e.g. Linux). +** The memory size function can always be overridden manually by defining +** the macro SQLITE_MALLOCSIZE to the desired function name. +*/ +#if defined(SQLITE_USE_MALLOC_H) +# include +# if defined(SQLITE_USE_MALLOC_USABLE_SIZE) +# if !defined(SQLITE_MALLOCSIZE) +# define SQLITE_MALLOCSIZE(x) malloc_usable_size(x) +# endif +# elif defined(SQLITE_USE_MSIZE) +# if !defined(SQLITE_MALLOCSIZE) +# define SQLITE_MALLOCSIZE _msize +# endif +# endif +#endif /* defined(SQLITE_USE_MALLOC_H) */ + +#endif /* __APPLE__ or not __APPLE__ */ + +/* +** Like malloc(), but remember the size of the allocation +** so that we can find it later using sqlite3MemSize(). +** +** For this low-level routine, we are guaranteed that nByte>0 because +** cases of nByte<=0 will be intercepted and dealt with by higher level +** routines. +*/ +static void *sqlite3MemMalloc(int nByte){ +#ifdef SQLITE_MALLOCSIZE + void *p = SQLITE_MALLOC( nByte ); + if( p==0 ){ + testcase( sqlite3GlobalConfig.xLog!=0 ); + sqlite3_log(SQLITE_NOMEM, "failed to allocate %u bytes of memory", nByte); + } + return p; +#else + sqlite3_int64 *p; + assert( nByte>0 ); + nByte = ROUND8(nByte); + p = SQLITE_MALLOC( nByte+8 ); + if( p ){ + p[0] = nByte; + p++; + }else{ + testcase( sqlite3GlobalConfig.xLog!=0 ); + sqlite3_log(SQLITE_NOMEM, "failed to allocate %u bytes of memory", nByte); + } + return (void *)p; +#endif +} + +/* +** Like free() but works for allocations obtained from sqlite3MemMalloc() +** or sqlite3MemRealloc(). +** +** For this low-level routine, we already know that pPrior!=0 since +** cases where pPrior==0 will have been intecepted and dealt with +** by higher-level routines. +*/ +static void sqlite3MemFree(void *pPrior){ +#ifdef SQLITE_MALLOCSIZE + SQLITE_FREE(pPrior); +#else + sqlite3_int64 *p = (sqlite3_int64*)pPrior; + assert( pPrior!=0 ); + p--; + SQLITE_FREE(p); +#endif +} + +/* +** Report the allocated size of a prior return from xMalloc() +** or xRealloc(). +*/ +static int sqlite3MemSize(void *pPrior){ +#ifdef SQLITE_MALLOCSIZE + assert( pPrior!=0 ); + return (int)SQLITE_MALLOCSIZE(pPrior); +#else + sqlite3_int64 *p; + assert( pPrior!=0 ); + p = (sqlite3_int64*)pPrior; + p--; + return (int)p[0]; +#endif +} + +/* +** Like realloc(). Resize an allocation previously obtained from +** sqlite3MemMalloc(). +** +** For this low-level interface, we know that pPrior!=0. Cases where +** pPrior==0 while have been intercepted by higher-level routine and +** redirected to xMalloc. Similarly, we know that nByte>0 because +** cases where nByte<=0 will have been intercepted by higher-level +** routines and redirected to xFree. +*/ +static void *sqlite3MemRealloc(void *pPrior, int nByte){ +#ifdef SQLITE_MALLOCSIZE + void *p = SQLITE_REALLOC(pPrior, nByte); + if( p==0 ){ + testcase( sqlite3GlobalConfig.xLog!=0 ); + sqlite3_log(SQLITE_NOMEM, + "failed memory resize %u to %u bytes", + SQLITE_MALLOCSIZE(pPrior), nByte); + } + return p; +#else + sqlite3_int64 *p = (sqlite3_int64*)pPrior; + assert( pPrior!=0 && nByte>0 ); + assert( nByte==ROUND8(nByte) ); /* EV: R-46199-30249 */ + p--; + p = SQLITE_REALLOC(p, nByte+8 ); + if( p ){ + p[0] = nByte; + p++; + }else{ + testcase( sqlite3GlobalConfig.xLog!=0 ); + sqlite3_log(SQLITE_NOMEM, + "failed memory resize %u to %u bytes", + sqlite3MemSize(pPrior), nByte); + } + return (void*)p; +#endif +} + +/* +** Round up a request size to the next valid allocation size. +*/ +static int sqlite3MemRoundup(int n){ + return ROUND8(n); +} + +/* +** Initialize this module. +*/ +static int sqlite3MemInit(void *NotUsed){ +#if defined(__APPLE__) && !defined(SQLITE_WITHOUT_ZONEMALLOC) + int cpuCount; + size_t len; + if( _sqliteZone_ ){ + return SQLITE_OK; + } + len = sizeof(cpuCount); + /* One usually wants to use hw.acctivecpu for MT decisions, but not here */ + sysctlbyname("hw.ncpu", &cpuCount, &len, NULL, 0); + if( cpuCount>1 ){ + /* defer MT decisions to system malloc */ + _sqliteZone_ = malloc_default_zone(); + }else{ + /* only 1 core, use our own zone to contention over global locks, + ** e.g. we have our own dedicated locks */ + bool success; + malloc_zone_t* newzone = malloc_create_zone(4096, 0); + malloc_set_zone_name(newzone, "Sqlite_Heap"); + do{ + success = OSAtomicCompareAndSwapPtrBarrier(NULL, newzone, + (void * volatile *)&_sqliteZone_); + }while(!_sqliteZone_); + if( !success ){ + /* somebody registered a zone first */ + malloc_destroy_zone(newzone); + } + } +#endif + UNUSED_PARAMETER(NotUsed); + return SQLITE_OK; +} + +/* +** Deinitialize this module. +*/ +static void sqlite3MemShutdown(void *NotUsed){ + UNUSED_PARAMETER(NotUsed); + return; +} + +/* +** This routine is the only routine in this file with external linkage. +** +** Populate the low-level memory allocation function pointers in +** sqlite3GlobalConfig.m with pointers to the routines in this file. +*/ +SQLITE_PRIVATE void sqlite3MemSetDefault(void){ + static const sqlite3_mem_methods defaultMethods = { + sqlite3MemMalloc, + sqlite3MemFree, + sqlite3MemRealloc, + sqlite3MemSize, + sqlite3MemRoundup, + sqlite3MemInit, + sqlite3MemShutdown, + 0 + }; + sqlite3_config(SQLITE_CONFIG_MALLOC, &defaultMethods); +} + +#endif /* SQLITE_SYSTEM_MALLOC */ + +/************** End of mem1.c ************************************************/ +/************** Begin file mem2.c ********************************************/ +/* +** 2007 August 15 +** +** 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 low-level memory allocation drivers for when +** SQLite will use the standard C-library malloc/realloc/free interface +** to obtain the memory it needs while adding lots of additional debugging +** information to each allocation in order to help detect and fix memory +** leaks and memory usage errors. +** +** This file contains implementations of the low-level memory allocation +** routines specified in the sqlite3_mem_methods object. +*/ +/* #include "sqliteInt.h" */ + +/* +** This version of the memory allocator is used only if the +** SQLITE_MEMDEBUG macro is defined +*/ +#ifdef SQLITE_MEMDEBUG + +/* +** The backtrace functionality is only available with GLIBC +*/ +#ifdef __GLIBC__ + extern int backtrace(void**,int); + extern void backtrace_symbols_fd(void*const*,int,int); +#else +# define backtrace(A,B) 1 +# define backtrace_symbols_fd(A,B,C) +#endif +/* #include */ + +/* +** Each memory allocation looks like this: +** +** ------------------------------------------------------------------------ +** | Title | backtrace pointers | MemBlockHdr | allocation | EndGuard | +** ------------------------------------------------------------------------ +** +** The application code sees only a pointer to the allocation. We have +** to back up from the allocation pointer to find the MemBlockHdr. The +** MemBlockHdr tells us the size of the allocation and the number of +** backtrace pointers. There is also a guard word at the end of the +** MemBlockHdr. +*/ +struct MemBlockHdr { + i64 iSize; /* Size of this allocation */ + struct MemBlockHdr *pNext, *pPrev; /* Linked list of all unfreed memory */ + char nBacktrace; /* Number of backtraces on this alloc */ + char nBacktraceSlots; /* Available backtrace slots */ + u8 nTitle; /* Bytes of title; includes '\0' */ + u8 eType; /* Allocation type code */ + int iForeGuard; /* Guard word for sanity */ +}; + +/* +** Guard words +*/ +#define FOREGUARD 0x80F5E153 +#define REARGUARD 0xE4676B53 + +/* +** Number of malloc size increments to track. +*/ +#define NCSIZE 1000 + +/* +** All of the static variables used by this module are collected +** into a single structure named "mem". This is to keep the +** static variables organized and to reduce namespace pollution +** when this module is combined with other in the amalgamation. +*/ +static struct { + + /* + ** Mutex to control access to the memory allocation subsystem. + */ + sqlite3_mutex *mutex; + + /* + ** Head and tail of a linked list of all outstanding allocations + */ + struct MemBlockHdr *pFirst; + struct MemBlockHdr *pLast; + + /* + ** The number of levels of backtrace to save in new allocations. + */ + int nBacktrace; + void (*xBacktrace)(int, int, void **); + + /* + ** Title text to insert in front of each block + */ + int nTitle; /* Bytes of zTitle to save. Includes '\0' and padding */ + char zTitle[100]; /* The title text */ + + /* + ** sqlite3MallocDisallow() increments the following counter. + ** sqlite3MallocAllow() decrements it. + */ + int disallow; /* Do not allow memory allocation */ + + /* + ** Gather statistics on the sizes of memory allocations. + ** nAlloc[i] is the number of allocation attempts of i*8 + ** bytes. i==NCSIZE is the number of allocation attempts for + ** sizes more than NCSIZE*8 bytes. + */ + int nAlloc[NCSIZE]; /* Total number of allocations */ + int nCurrent[NCSIZE]; /* Current number of allocations */ + int mxCurrent[NCSIZE]; /* Highwater mark for nCurrent */ + +} mem; + + +/* +** Adjust memory usage statistics +*/ +static void adjustStats(int iSize, int increment){ + int i = ROUND8(iSize)/8; + if( i>NCSIZE-1 ){ + i = NCSIZE - 1; + } + if( increment>0 ){ + mem.nAlloc[i]++; + mem.nCurrent[i]++; + if( mem.nCurrent[i]>mem.mxCurrent[i] ){ + mem.mxCurrent[i] = mem.nCurrent[i]; + } + }else{ + mem.nCurrent[i]--; + assert( mem.nCurrent[i]>=0 ); + } +} + +/* +** Given an allocation, find the MemBlockHdr for that allocation. +** +** This routine checks the guards at either end of the allocation and +** if they are incorrect it asserts. +*/ +static struct MemBlockHdr *sqlite3MemsysGetHeader(void *pAllocation){ + struct MemBlockHdr *p; + int *pInt; + u8 *pU8; + int nReserve; + + p = (struct MemBlockHdr*)pAllocation; + p--; + assert( p->iForeGuard==(int)FOREGUARD ); + nReserve = ROUND8(p->iSize); + pInt = (int*)pAllocation; + pU8 = (u8*)pAllocation; + assert( pInt[nReserve/sizeof(int)]==(int)REARGUARD ); + /* This checks any of the "extra" bytes allocated due + ** to rounding up to an 8 byte boundary to ensure + ** they haven't been overwritten. + */ + while( nReserve-- > p->iSize ) assert( pU8[nReserve]==0x65 ); + return p; +} + +/* +** Return the number of bytes currently allocated at address p. +*/ +static int sqlite3MemSize(void *p){ + struct MemBlockHdr *pHdr; + if( !p ){ + return 0; + } + pHdr = sqlite3MemsysGetHeader(p); + return (int)pHdr->iSize; +} + +/* +** Initialize the memory allocation subsystem. +*/ +static int sqlite3MemInit(void *NotUsed){ + UNUSED_PARAMETER(NotUsed); + assert( (sizeof(struct MemBlockHdr)&7) == 0 ); + if( !sqlite3GlobalConfig.bMemstat ){ + /* If memory status is enabled, then the malloc.c wrapper will already + ** hold the STATIC_MEM mutex when the routines here are invoked. */ + mem.mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MEM); + } + return SQLITE_OK; +} + +/* +** Deinitialize the memory allocation subsystem. +*/ +static void sqlite3MemShutdown(void *NotUsed){ + UNUSED_PARAMETER(NotUsed); + mem.mutex = 0; +} + +/* +** Round up a request size to the next valid allocation size. +*/ +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) ^ (-(int)(x&1) & 0xd0000001); + y = y*1103515245 + 12345; + r = x ^ y; + *(int*)pBuf = r; + pBuf += 4; + nByte -= 4; + } + while( nByte-- > 0 ){ + x = (x>>1) ^ (-(int)(x&1) & 0xd0000001); + y = y*1103515245 + 12345; + r = x ^ y; + *(pBuf++) = r & 0xff; + } +} + +/* +** Allocate nByte bytes of memory. +*/ +static void *sqlite3MemMalloc(int nByte){ + struct MemBlockHdr *pHdr; + void **pBt; + char *z; + int *pInt; + void *p = 0; + int totalSize; + int nReserve; + sqlite3_mutex_enter(mem.mutex); + assert( mem.disallow==0 ); + nReserve = ROUND8(nByte); + totalSize = nReserve + sizeof(*pHdr) + sizeof(int) + + mem.nBacktrace*sizeof(void*) + mem.nTitle; + p = malloc(totalSize); + if( p ){ + z = p; + pBt = (void**)&z[mem.nTitle]; + pHdr = (struct MemBlockHdr*)&pBt[mem.nBacktrace]; + pHdr->pNext = 0; + pHdr->pPrev = mem.pLast; + if( mem.pLast ){ + mem.pLast->pNext = pHdr; + }else{ + mem.pFirst = pHdr; + } + mem.pLast = pHdr; + pHdr->iForeGuard = FOREGUARD; + pHdr->eType = MEMTYPE_HEAP; + pHdr->nBacktraceSlots = mem.nBacktrace; + pHdr->nTitle = mem.nTitle; + if( mem.nBacktrace ){ + void *aAddr[40]; + pHdr->nBacktrace = backtrace(aAddr, mem.nBacktrace+1)-1; + memcpy(pBt, &aAddr[1], pHdr->nBacktrace*sizeof(void*)); + assert(pBt[0]); + if( mem.xBacktrace ){ + mem.xBacktrace(nByte, pHdr->nBacktrace-1, &aAddr[1]); + } + }else{ + pHdr->nBacktrace = 0; + } + if( mem.nTitle ){ + memcpy(z, mem.zTitle, mem.nTitle); + } + pHdr->iSize = nByte; + adjustStats(nByte, +1); + pInt = (int*)&pHdr[1]; + pInt[nReserve/sizeof(int)] = REARGUARD; + randomFill((char*)pInt, nByte); + memset(((char*)pInt)+nByte, 0x65, nReserve-nByte); + p = (void*)pInt; + } + sqlite3_mutex_leave(mem.mutex); + return p; +} + +/* +** Free memory. +*/ +static void sqlite3MemFree(void *pPrior){ + struct MemBlockHdr *pHdr; + void **pBt; + char *z; + assert( sqlite3GlobalConfig.bMemstat || sqlite3GlobalConfig.bCoreMutex==0 + || mem.mutex!=0 ); + pHdr = sqlite3MemsysGetHeader(pPrior); + pBt = (void**)pHdr; + pBt -= pHdr->nBacktraceSlots; + sqlite3_mutex_enter(mem.mutex); + if( pHdr->pPrev ){ + assert( pHdr->pPrev->pNext==pHdr ); + pHdr->pPrev->pNext = pHdr->pNext; + }else{ + assert( mem.pFirst==pHdr ); + mem.pFirst = pHdr->pNext; + } + if( pHdr->pNext ){ + assert( pHdr->pNext->pPrev==pHdr ); + pHdr->pNext->pPrev = pHdr->pPrev; + }else{ + assert( mem.pLast==pHdr ); + mem.pLast = pHdr->pPrev; + } + z = (char*)pBt; + z -= pHdr->nTitle; + adjustStats((int)pHdr->iSize, -1); + randomFill(z, sizeof(void*)*pHdr->nBacktraceSlots + sizeof(*pHdr) + + (int)pHdr->iSize + sizeof(int) + pHdr->nTitle); + free(z); + sqlite3_mutex_leave(mem.mutex); +} + +/* +** Change the size of an existing memory allocation. +** +** For this debugging implementation, we *always* make a copy of the +** allocation into a new place in memory. In this way, if the +** higher level code is using pointer to the old allocation, it is +** much more likely to break and we are much more liking to find +** the error. +*/ +static void *sqlite3MemRealloc(void *pPrior, int nByte){ + struct MemBlockHdr *pOldHdr; + void *pNew; + assert( mem.disallow==0 ); + assert( (nByte & 7)==0 ); /* EV: R-46199-30249 */ + pOldHdr = sqlite3MemsysGetHeader(pPrior); + pNew = sqlite3MemMalloc(nByte); + if( pNew ){ + memcpy(pNew, pPrior, (int)(nByteiSize ? nByte : pOldHdr->iSize)); + if( nByte>pOldHdr->iSize ){ + randomFill(&((char*)pNew)[pOldHdr->iSize], nByte - (int)pOldHdr->iSize); + } + sqlite3MemFree(pPrior); + } + return pNew; +} + +/* +** Populate the low-level memory allocation function pointers in +** sqlite3GlobalConfig.m with pointers to the routines in this file. +*/ +SQLITE_PRIVATE void sqlite3MemSetDefault(void){ + static const sqlite3_mem_methods defaultMethods = { + sqlite3MemMalloc, + sqlite3MemFree, + sqlite3MemRealloc, + sqlite3MemSize, + sqlite3MemRoundup, + sqlite3MemInit, + sqlite3MemShutdown, + 0 + }; + sqlite3_config(SQLITE_CONFIG_MALLOC, &defaultMethods); +} + +/* +** Set the "type" of an allocation. +*/ +SQLITE_PRIVATE void sqlite3MemdebugSetType(void *p, u8 eType){ + if( p && sqlite3GlobalConfig.m.xMalloc==sqlite3MemMalloc ){ + struct MemBlockHdr *pHdr; + pHdr = sqlite3MemsysGetHeader(p); + assert( pHdr->iForeGuard==FOREGUARD ); + pHdr->eType = eType; + } +} + +/* +** Return TRUE if the mask of type in eType matches the type of the +** allocation p. Also return true if p==NULL. +** +** This routine is designed for use within an assert() statement, to +** verify the type of an allocation. For example: +** +** assert( sqlite3MemdebugHasType(p, MEMTYPE_HEAP) ); +*/ +SQLITE_PRIVATE int sqlite3MemdebugHasType(void *p, u8 eType){ + int rc = 1; + if( p && sqlite3GlobalConfig.m.xMalloc==sqlite3MemMalloc ){ + struct MemBlockHdr *pHdr; + pHdr = sqlite3MemsysGetHeader(p); + assert( pHdr->iForeGuard==FOREGUARD ); /* Allocation is valid */ + if( (pHdr->eType&eType)==0 ){ + rc = 0; + } + } + return rc; +} + +/* +** Return TRUE if the mask of type in eType matches no bits of the type of the +** allocation p. Also return true if p==NULL. +** +** This routine is designed for use within an assert() statement, to +** verify the type of an allocation. For example: +** +** assert( sqlite3MemdebugNoType(p, MEMTYPE_LOOKASIDE) ); +*/ +SQLITE_PRIVATE int sqlite3MemdebugNoType(void *p, u8 eType){ + int rc = 1; + if( p && sqlite3GlobalConfig.m.xMalloc==sqlite3MemMalloc ){ + struct MemBlockHdr *pHdr; + pHdr = sqlite3MemsysGetHeader(p); + assert( pHdr->iForeGuard==FOREGUARD ); /* Allocation is valid */ + if( (pHdr->eType&eType)!=0 ){ + rc = 0; + } + } + return rc; +} + +/* +** Set the number of backtrace levels kept for each allocation. +** A value of zero turns off backtracing. The number is always rounded +** up to a multiple of 2. +*/ +SQLITE_PRIVATE void sqlite3MemdebugBacktrace(int depth){ + if( depth<0 ){ depth = 0; } + if( depth>20 ){ depth = 20; } + depth = (depth+1)&0xfe; + mem.nBacktrace = depth; +} + +SQLITE_PRIVATE void sqlite3MemdebugBacktraceCallback(void (*xBacktrace)(int, int, void **)){ + mem.xBacktrace = xBacktrace; +} + +/* +** Set the title string for subsequent allocations. +*/ +SQLITE_PRIVATE void sqlite3MemdebugSettitle(const char *zTitle){ + unsigned int n = sqlite3Strlen30(zTitle) + 1; + sqlite3_mutex_enter(mem.mutex); + if( n>=sizeof(mem.zTitle) ) n = sizeof(mem.zTitle)-1; + memcpy(mem.zTitle, zTitle, n); + mem.zTitle[n] = 0; + mem.nTitle = ROUND8(n); + sqlite3_mutex_leave(mem.mutex); +} + +SQLITE_PRIVATE void sqlite3MemdebugSync(){ + struct MemBlockHdr *pHdr; + for(pHdr=mem.pFirst; pHdr; pHdr=pHdr->pNext){ + void **pBt = (void**)pHdr; + pBt -= pHdr->nBacktraceSlots; + mem.xBacktrace((int)pHdr->iSize, pHdr->nBacktrace-1, &pBt[1]); + } +} + +/* +** Open the file indicated and write a log of all unfreed memory +** allocations into that log. +*/ +SQLITE_PRIVATE void sqlite3MemdebugDump(const char *zFilename){ + FILE *out; + struct MemBlockHdr *pHdr; + void **pBt; + int i; + out = fopen(zFilename, "w"); + if( out==0 ){ + fprintf(stderr, "** Unable to output memory debug output log: %s **\n", + zFilename); + return; + } + for(pHdr=mem.pFirst; pHdr; pHdr=pHdr->pNext){ + char *z = (char*)pHdr; + z -= pHdr->nBacktraceSlots*sizeof(void*) + pHdr->nTitle; + fprintf(out, "**** %lld bytes at %p from %s ****\n", + pHdr->iSize, &pHdr[1], pHdr->nTitle ? z : "???"); + if( pHdr->nBacktrace ){ + fflush(out); + pBt = (void**)pHdr; + pBt -= pHdr->nBacktraceSlots; + backtrace_symbols_fd(pBt, pHdr->nBacktrace, fileno(out)); + fprintf(out, "\n"); + } + } + fprintf(out, "COUNTS:\n"); + for(i=0; i=1 ); + size = mem3.aPool[i-1].u.hdr.size4x/4; + assert( size==mem3.aPool[i+size-1].u.hdr.prevSize ); + assert( size>=2 ); + if( size <= MX_SMALL ){ + memsys3UnlinkFromList(i, &mem3.aiSmall[size-2]); + }else{ + hash = size % N_HASH; + memsys3UnlinkFromList(i, &mem3.aiHash[hash]); + } +} + +/* +** Link the chunk at mem3.aPool[i] so that is on the list rooted +** at *pRoot. +*/ +static void memsys3LinkIntoList(u32 i, u32 *pRoot){ + assert( sqlite3_mutex_held(mem3.mutex) ); + mem3.aPool[i].u.list.next = *pRoot; + mem3.aPool[i].u.list.prev = 0; + if( *pRoot ){ + mem3.aPool[*pRoot].u.list.prev = i; + } + *pRoot = i; +} + +/* +** Link the chunk at index i into either the appropriate +** small chunk list, or into the large chunk hash table. +*/ +static void memsys3Link(u32 i){ + u32 size, hash; + assert( sqlite3_mutex_held(mem3.mutex) ); + assert( i>=1 ); + assert( (mem3.aPool[i-1].u.hdr.size4x & 1)==0 ); + size = mem3.aPool[i-1].u.hdr.size4x/4; + assert( size==mem3.aPool[i+size-1].u.hdr.prevSize ); + assert( size>=2 ); + if( size <= MX_SMALL ){ + memsys3LinkIntoList(i, &mem3.aiSmall[size-2]); + }else{ + hash = size % N_HASH; + memsys3LinkIntoList(i, &mem3.aiHash[hash]); + } +} + +/* +** If the STATIC_MEM mutex is not already held, obtain it now. The mutex +** will already be held (obtained by code in malloc.c) if +** sqlite3GlobalConfig.bMemStat is true. +*/ +static void memsys3Enter(void){ + if( sqlite3GlobalConfig.bMemstat==0 && mem3.mutex==0 ){ + mem3.mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MEM); + } + sqlite3_mutex_enter(mem3.mutex); +} +static void memsys3Leave(void){ + sqlite3_mutex_leave(mem3.mutex); +} + +/* +** Called when we are unable to satisfy an allocation of nBytes. +*/ +static void memsys3OutOfMemory(int nByte){ + if( !mem3.alarmBusy ){ + mem3.alarmBusy = 1; + assert( sqlite3_mutex_held(mem3.mutex) ); + sqlite3_mutex_leave(mem3.mutex); + sqlite3_release_memory(nByte); + sqlite3_mutex_enter(mem3.mutex); + mem3.alarmBusy = 0; + } +} + + +/* +** Chunk i is a free chunk that has been unlinked. Adjust its +** size parameters for check-out and return a pointer to the +** user portion of the chunk. +*/ +static void *memsys3Checkout(u32 i, u32 nBlock){ + u32 x; + assert( sqlite3_mutex_held(mem3.mutex) ); + assert( i>=1 ); + assert( mem3.aPool[i-1].u.hdr.size4x/4==nBlock ); + assert( mem3.aPool[i+nBlock-1].u.hdr.prevSize==nBlock ); + x = mem3.aPool[i-1].u.hdr.size4x; + mem3.aPool[i-1].u.hdr.size4x = nBlock*4 | 1 | (x&2); + mem3.aPool[i+nBlock-1].u.hdr.prevSize = nBlock; + mem3.aPool[i+nBlock-1].u.hdr.size4x |= 2; + return &mem3.aPool[i]; +} + +/* +** Carve a piece off of the end of the mem3.iMaster free chunk. +** Return a pointer to the new allocation. Or, if the master chunk +** is not large enough, return 0. +*/ +static void *memsys3FromMaster(u32 nBlock){ + assert( sqlite3_mutex_held(mem3.mutex) ); + assert( mem3.szMaster>=nBlock ); + if( nBlock>=mem3.szMaster-1 ){ + /* Use the entire master */ + void *p = memsys3Checkout(mem3.iMaster, mem3.szMaster); + mem3.iMaster = 0; + mem3.szMaster = 0; + mem3.mnMaster = 0; + return p; + }else{ + /* Split the master block. Return the tail. */ + u32 newi, x; + newi = mem3.iMaster + mem3.szMaster - nBlock; + assert( newi > mem3.iMaster+1 ); + mem3.aPool[mem3.iMaster+mem3.szMaster-1].u.hdr.prevSize = nBlock; + mem3.aPool[mem3.iMaster+mem3.szMaster-1].u.hdr.size4x |= 2; + mem3.aPool[newi-1].u.hdr.size4x = nBlock*4 + 1; + mem3.szMaster -= nBlock; + mem3.aPool[newi-1].u.hdr.prevSize = mem3.szMaster; + x = mem3.aPool[mem3.iMaster-1].u.hdr.size4x & 2; + mem3.aPool[mem3.iMaster-1].u.hdr.size4x = mem3.szMaster*4 | x; + if( mem3.szMaster < mem3.mnMaster ){ + mem3.mnMaster = mem3.szMaster; + } + return (void*)&mem3.aPool[newi]; + } +} + +/* +** *pRoot is the head of a list of free chunks of the same size +** or same size hash. In other words, *pRoot is an entry in either +** mem3.aiSmall[] or mem3.aiHash[]. +** +** This routine examines all entries on the given list and tries +** to coalesce each entries with adjacent free chunks. +** +** If it sees a chunk that is larger than mem3.iMaster, it replaces +** the current mem3.iMaster with the new larger chunk. In order for +** this mem3.iMaster replacement to work, the master chunk must be +** linked into the hash tables. That is not the normal state of +** affairs, of course. The calling routine must link the master +** chunk before invoking this routine, then must unlink the (possibly +** changed) master chunk once this routine has finished. +*/ +static void memsys3Merge(u32 *pRoot){ + u32 iNext, prev, size, i, x; + + assert( sqlite3_mutex_held(mem3.mutex) ); + for(i=*pRoot; i>0; i=iNext){ + iNext = mem3.aPool[i].u.list.next; + size = mem3.aPool[i-1].u.hdr.size4x; + assert( (size&1)==0 ); + if( (size&2)==0 ){ + memsys3UnlinkFromList(i, pRoot); + assert( i > mem3.aPool[i-1].u.hdr.prevSize ); + prev = i - mem3.aPool[i-1].u.hdr.prevSize; + if( prev==iNext ){ + iNext = mem3.aPool[prev].u.list.next; + } + memsys3Unlink(prev); + size = i + size/4 - prev; + x = mem3.aPool[prev-1].u.hdr.size4x & 2; + mem3.aPool[prev-1].u.hdr.size4x = size*4 | x; + mem3.aPool[prev+size-1].u.hdr.prevSize = size; + memsys3Link(prev); + i = prev; + }else{ + size /= 4; + } + if( size>mem3.szMaster ){ + mem3.iMaster = i; + mem3.szMaster = size; + } + } +} + +/* +** Return a block of memory of at least nBytes in size. +** Return NULL if unable. +** +** This function assumes that the necessary mutexes, if any, are +** already held by the caller. Hence "Unsafe". +*/ +static void *memsys3MallocUnsafe(int nByte){ + u32 i; + u32 nBlock; + u32 toFree; + + assert( sqlite3_mutex_held(mem3.mutex) ); + assert( sizeof(Mem3Block)==8 ); + if( nByte<=12 ){ + nBlock = 2; + }else{ + nBlock = (nByte + 11)/8; + } + assert( nBlock>=2 ); + + /* STEP 1: + ** Look for an entry of the correct size in either the small + ** chunk table or in the large chunk hash table. This is + ** successful most of the time (about 9 times out of 10). + */ + if( nBlock <= MX_SMALL ){ + i = mem3.aiSmall[nBlock-2]; + if( i>0 ){ + memsys3UnlinkFromList(i, &mem3.aiSmall[nBlock-2]); + return memsys3Checkout(i, nBlock); + } + }else{ + int hash = nBlock % N_HASH; + for(i=mem3.aiHash[hash]; i>0; i=mem3.aPool[i].u.list.next){ + if( mem3.aPool[i-1].u.hdr.size4x/4==nBlock ){ + memsys3UnlinkFromList(i, &mem3.aiHash[hash]); + return memsys3Checkout(i, nBlock); + } + } + } + + /* STEP 2: + ** Try to satisfy the allocation by carving a piece off of the end + ** of the master chunk. This step usually works if step 1 fails. + */ + if( mem3.szMaster>=nBlock ){ + return memsys3FromMaster(nBlock); + } + + + /* STEP 3: + ** Loop through the entire memory pool. Coalesce adjacent free + ** chunks. Recompute the master chunk as the largest free chunk. + ** Then try again to satisfy the allocation by carving a piece off + ** of the end of the master chunk. This step happens very + ** rarely (we hope!) + */ + for(toFree=nBlock*16; toFree<(mem3.nPool*16); toFree *= 2){ + memsys3OutOfMemory(toFree); + if( mem3.iMaster ){ + memsys3Link(mem3.iMaster); + mem3.iMaster = 0; + mem3.szMaster = 0; + } + for(i=0; i=nBlock ){ + return memsys3FromMaster(nBlock); + } + } + } + + /* If none of the above worked, then we fail. */ + return 0; +} + +/* +** Free an outstanding memory allocation. +** +** This function assumes that the necessary mutexes, if any, are +** already held by the caller. Hence "Unsafe". +*/ +static void memsys3FreeUnsafe(void *pOld){ + Mem3Block *p = (Mem3Block*)pOld; + int i; + u32 size, x; + assert( sqlite3_mutex_held(mem3.mutex) ); + assert( p>mem3.aPool && p<&mem3.aPool[mem3.nPool] ); + i = p - mem3.aPool; + assert( (mem3.aPool[i-1].u.hdr.size4x&1)==1 ); + size = mem3.aPool[i-1].u.hdr.size4x/4; + assert( i+size<=mem3.nPool+1 ); + mem3.aPool[i-1].u.hdr.size4x &= ~1; + mem3.aPool[i+size-1].u.hdr.prevSize = size; + mem3.aPool[i+size-1].u.hdr.size4x &= ~2; + memsys3Link(i); + + /* Try to expand the master using the newly freed chunk */ + if( mem3.iMaster ){ + while( (mem3.aPool[mem3.iMaster-1].u.hdr.size4x&2)==0 ){ + size = mem3.aPool[mem3.iMaster-1].u.hdr.prevSize; + mem3.iMaster -= size; + mem3.szMaster += size; + memsys3Unlink(mem3.iMaster); + x = mem3.aPool[mem3.iMaster-1].u.hdr.size4x & 2; + mem3.aPool[mem3.iMaster-1].u.hdr.size4x = mem3.szMaster*4 | x; + mem3.aPool[mem3.iMaster+mem3.szMaster-1].u.hdr.prevSize = mem3.szMaster; + } + x = mem3.aPool[mem3.iMaster-1].u.hdr.size4x & 2; + while( (mem3.aPool[mem3.iMaster+mem3.szMaster-1].u.hdr.size4x&1)==0 ){ + memsys3Unlink(mem3.iMaster+mem3.szMaster); + mem3.szMaster += mem3.aPool[mem3.iMaster+mem3.szMaster-1].u.hdr.size4x/4; + mem3.aPool[mem3.iMaster-1].u.hdr.size4x = mem3.szMaster*4 | x; + mem3.aPool[mem3.iMaster+mem3.szMaster-1].u.hdr.prevSize = mem3.szMaster; + } + } +} + +/* +** Return the size of an outstanding allocation, in bytes. The +** size returned omits the 8-byte header overhead. This only +** works for chunks that are currently checked out. +*/ +static int memsys3Size(void *p){ + Mem3Block *pBlock; + assert( p!=0 ); + pBlock = (Mem3Block*)p; + assert( (pBlock[-1].u.hdr.size4x&1)!=0 ); + return (pBlock[-1].u.hdr.size4x&~3)*2 - 4; +} + +/* +** Round up a request size to the next valid allocation size. +*/ +static int memsys3Roundup(int n){ + if( n<=12 ){ + return 12; + }else{ + return ((n+11)&~7) - 4; + } +} + +/* +** Allocate nBytes of memory. +*/ +static void *memsys3Malloc(int nBytes){ + sqlite3_int64 *p; + assert( nBytes>0 ); /* malloc.c filters out 0 byte requests */ + memsys3Enter(); + p = memsys3MallocUnsafe(nBytes); + memsys3Leave(); + return (void*)p; +} + +/* +** Free memory. +*/ +static void memsys3Free(void *pPrior){ + assert( pPrior ); + memsys3Enter(); + memsys3FreeUnsafe(pPrior); + memsys3Leave(); +} + +/* +** Change the size of an existing memory allocation +*/ +static void *memsys3Realloc(void *pPrior, int nBytes){ + int nOld; + void *p; + if( pPrior==0 ){ + return sqlite3_malloc(nBytes); + } + if( nBytes<=0 ){ + sqlite3_free(pPrior); + return 0; + } + nOld = memsys3Size(pPrior); + if( nBytes<=nOld && nBytes>=nOld-128 ){ + return pPrior; + } + memsys3Enter(); + p = memsys3MallocUnsafe(nBytes); + if( p ){ + if( nOld>1)!=(size&1) ){ + fprintf(out, "%p tail checkout bit is incorrect\n", &mem3.aPool[i]); + assert( 0 ); + break; + } + if( size&1 ){ + fprintf(out, "%p %6d bytes checked out\n", &mem3.aPool[i], (size/4)*8-8); + }else{ + fprintf(out, "%p %6d bytes free%s\n", &mem3.aPool[i], (size/4)*8-8, + i==mem3.iMaster ? " **master**" : ""); + } + } + for(i=0; i0; j=mem3.aPool[j].u.list.next){ + fprintf(out, " %p(%d)", &mem3.aPool[j], + (mem3.aPool[j-1].u.hdr.size4x/4)*8-8); + } + fprintf(out, "\n"); + } + for(i=0; i0; j=mem3.aPool[j].u.list.next){ + fprintf(out, " %p(%d)", &mem3.aPool[j], + (mem3.aPool[j-1].u.hdr.size4x/4)*8-8); + } + fprintf(out, "\n"); + } + fprintf(out, "master=%d\n", mem3.iMaster); + fprintf(out, "nowUsed=%d\n", mem3.nPool*8 - mem3.szMaster*8); + fprintf(out, "mxUsed=%d\n", mem3.nPool*8 - mem3.mnMaster*8); + sqlite3_mutex_leave(mem3.mutex); + if( out==stdout ){ + fflush(stdout); + }else{ + fclose(out); + } +#else + UNUSED_PARAMETER(zFilename); +#endif +} + +/* +** This routine is the only routine in this file with external +** linkage. +** +** Populate the low-level memory allocation function pointers in +** sqlite3GlobalConfig.m with pointers to the routines in this file. The +** arguments specify the block of memory to manage. +** +** This routine is only called by sqlite3_config(), and therefore +** is not required to be threadsafe (it is not). +*/ +SQLITE_PRIVATE const sqlite3_mem_methods *sqlite3MemGetMemsys3(void){ + static const sqlite3_mem_methods mempoolMethods = { + memsys3Malloc, + memsys3Free, + memsys3Realloc, + memsys3Size, + memsys3Roundup, + memsys3Init, + memsys3Shutdown, + 0 + }; + return &mempoolMethods; +} + +#endif /* SQLITE_ENABLE_MEMSYS3 */ + +/************** End of mem3.c ************************************************/ +/************** Begin file mem5.c ********************************************/ +/* +** 2007 October 14 +** +** 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 the C functions that implement a memory +** allocation subsystem for use by SQLite. +** +** This version of the memory allocation subsystem omits all +** use of malloc(). The application gives SQLite a block of memory +** before calling sqlite3_initialize() from which allocations +** are made and returned by the xMalloc() and xRealloc() +** implementations. Once sqlite3_initialize() has been called, +** the amount of memory available to SQLite is fixed and cannot +** be changed. +** +** This version of the memory allocation subsystem is included +** in the build only if SQLITE_ENABLE_MEMSYS5 is defined. +** +** This memory allocator uses the following algorithm: +** +** 1. All memory allocation sizes are rounded up to a power of 2. +** +** 2. If two adjacent free blocks are the halves of a larger block, +** then the two blocks are coalesced into the single larger block. +** +** 3. New memory is allocated from the first available free block. +** +** This algorithm is described in: J. M. Robson. "Bounds for Some Functions +** Concerning Dynamic Storage Allocation". Journal of the Association for +** Computing Machinery, Volume 21, Number 8, July 1974, pages 491-499. +** +** Let n be the size of the largest allocation divided by the minimum +** allocation size (after rounding all sizes up to a power of 2.) Let M +** be the maximum amount of memory ever outstanding at one time. Let +** N be the total amount of memory available for allocation. Robson +** proved that this memory allocator will never breakdown due to +** fragmentation as long as the following constraint holds: +** +** N >= M*(1 + log2(n)/2) - n + 1 +** +** The sqlite3_status() logic tracks the maximum values of n and M so +** that an application can, at any time, verify this constraint. +*/ +/* #include "sqliteInt.h" */ + +/* +** This version of the memory allocator is used only when +** SQLITE_ENABLE_MEMSYS5 is defined. +*/ +#ifdef SQLITE_ENABLE_MEMSYS5 + +/* +** A minimum allocation is an instance of the following structure. +** Larger allocations are an array of these structures where the +** size of the array is a power of 2. +** +** The size of this object must be a power of two. That fact is +** verified in memsys5Init(). +*/ +typedef struct Mem5Link Mem5Link; +struct Mem5Link { + int next; /* Index of next free chunk */ + int prev; /* Index of previous free chunk */ +}; + +/* +** Maximum size of any allocation is ((1<=0 && i=0 && iLogsize<=LOGMAX ); + assert( (mem5.aCtrl[i] & CTRL_LOGSIZE)==iLogsize ); + + next = MEM5LINK(i)->next; + prev = MEM5LINK(i)->prev; + if( prev<0 ){ + mem5.aiFreelist[iLogsize] = next; + }else{ + MEM5LINK(prev)->next = next; + } + if( next>=0 ){ + MEM5LINK(next)->prev = prev; + } +} + +/* +** Link the chunk at mem5.aPool[i] so that is on the iLogsize +** free list. +*/ +static void memsys5Link(int i, int iLogsize){ + int x; + assert( sqlite3_mutex_held(mem5.mutex) ); + assert( i>=0 && i=0 && iLogsize<=LOGMAX ); + assert( (mem5.aCtrl[i] & CTRL_LOGSIZE)==iLogsize ); + + x = MEM5LINK(i)->next = mem5.aiFreelist[iLogsize]; + MEM5LINK(i)->prev = -1; + if( x>=0 ){ + assert( xprev = i; + } + mem5.aiFreelist[iLogsize] = i; +} + +/* +** Obtain or release the mutex needed to access global data structures. +*/ +static void memsys5Enter(void){ + sqlite3_mutex_enter(mem5.mutex); +} +static void memsys5Leave(void){ + sqlite3_mutex_leave(mem5.mutex); +} + +/* +** Return the size of an outstanding allocation, in bytes. +** This only works for chunks that are currently checked out. +*/ +static int memsys5Size(void *p){ + int iSize, i; + assert( p!=0 ); + i = (int)(((u8 *)p-mem5.zPool)/mem5.szAtom); + assert( i>=0 && i0 ); + + /* No more than 1GiB per allocation */ + if( nByte > 0x40000000 ) return 0; + +#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) + /* Keep track of the maximum allocation request. Even unfulfilled + ** requests are counted */ + if( (u32)nByte>mem5.maxRequest ){ + mem5.maxRequest = nByte; + } +#endif + + + /* Round nByte up to the next valid power of two */ + for(iFullSz=mem5.szAtom,iLogsize=0; iFullSzLOGMAX ){ + testcase( sqlite3GlobalConfig.xLog!=0 ); + sqlite3_log(SQLITE_NOMEM, "failed to allocate %u bytes", nByte); + return 0; + } + i = mem5.aiFreelist[iBin]; + memsys5Unlink(i, iBin); + while( iBin>iLogsize ){ + int newSize; + + iBin--; + newSize = 1 << iBin; + mem5.aCtrl[i+newSize] = CTRL_FREE | iBin; + memsys5Link(i+newSize, iBin); + } + mem5.aCtrl[i] = iLogsize; + +#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) + /* Update allocator performance statistics. */ + mem5.nAlloc++; + mem5.totalAlloc += iFullSz; + mem5.totalExcess += iFullSz - nByte; + mem5.currentCount++; + mem5.currentOut += iFullSz; + if( mem5.maxCount=0 && iBlock0 ); + assert( mem5.currentOut>=(size*mem5.szAtom) ); + mem5.currentCount--; + mem5.currentOut -= size*mem5.szAtom; + assert( mem5.currentOut>0 || mem5.currentCount==0 ); + assert( mem5.currentCount>0 || mem5.currentOut==0 ); +#endif + + mem5.aCtrl[iBlock] = CTRL_FREE | iLogsize; + while( ALWAYS(iLogsize>iLogsize) & 1 ){ + iBuddy = iBlock - size; + assert( iBuddy>=0 ); + }else{ + iBuddy = iBlock + size; + if( iBuddy>=mem5.nBlock ) break; + } + if( mem5.aCtrl[iBuddy]!=(CTRL_FREE | iLogsize) ) break; + memsys5Unlink(iBuddy, iLogsize); + iLogsize++; + if( iBuddy0 ){ + memsys5Enter(); + p = memsys5MallocUnsafe(nBytes); + memsys5Leave(); + } + return (void*)p; +} + +/* +** Free memory. +** +** The outer layer memory allocator prevents this routine from +** being called with pPrior==0. +*/ +static void memsys5Free(void *pPrior){ + assert( pPrior!=0 ); + memsys5Enter(); + memsys5FreeUnsafe(pPrior); + memsys5Leave(); +} + +/* +** Change the size of an existing memory allocation. +** +** The outer layer memory allocator prevents this routine from +** being called with pPrior==0. +** +** nBytes is always a value obtained from a prior call to +** memsys5Round(). Hence nBytes is always a non-negative power +** of two. If nBytes==0 that means that an oversize allocation +** (an allocation larger than 0x40000000) was requested and this +** routine should return 0 without freeing pPrior. +*/ +static void *memsys5Realloc(void *pPrior, int nBytes){ + int nOld; + void *p; + assert( pPrior!=0 ); + assert( (nBytes&(nBytes-1))==0 ); /* EV: R-46199-30249 */ + assert( nBytes>=0 ); + if( nBytes==0 ){ + return 0; + } + nOld = memsys5Size(pPrior); + if( nBytes<=nOld ){ + return pPrior; + } + p = memsys5Malloc(nBytes); + if( p ){ + memcpy(p, pPrior, nOld); + memsys5Free(pPrior); + } + return p; +} + +/* +** Round up a request size to the next valid allocation size. If +** the allocation is too large to be handled by this allocation system, +** return 0. +** +** All allocations must be a power of two and must be expressed by a +** 32-bit signed integer. Hence the largest allocation is 0x40000000 +** or 1073741824 bytes. +*/ +static int memsys5Roundup(int n){ + int iFullSz; + if( n > 0x40000000 ) return 0; + for(iFullSz=mem5.szAtom; iFullSz 0 +** memsys5Log(2) -> 1 +** memsys5Log(4) -> 2 +** memsys5Log(5) -> 3 +** memsys5Log(8) -> 3 +** memsys5Log(9) -> 4 +*/ +static int memsys5Log(int iValue){ + int iLog; + for(iLog=0; (iLog<(int)((sizeof(int)*8)-1)) && (1<mem5.szAtom ){ + mem5.szAtom = mem5.szAtom << 1; + } + + mem5.nBlock = (nByte / (mem5.szAtom+sizeof(u8))); + mem5.zPool = zByte; + mem5.aCtrl = (u8 *)&mem5.zPool[mem5.nBlock*mem5.szAtom]; + + for(ii=0; ii<=LOGMAX; ii++){ + mem5.aiFreelist[ii] = -1; + } + + iOffset = 0; + for(ii=LOGMAX; ii>=0; ii--){ + int nAlloc = (1<mem5.nBlock); + } + + /* If a mutex is required for normal operation, allocate one */ + if( sqlite3GlobalConfig.bMemstat==0 ){ + mem5.mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MEM); + } + + return SQLITE_OK; +} + +/* +** Deinitialize this module. +*/ +static void memsys5Shutdown(void *NotUsed){ + UNUSED_PARAMETER(NotUsed); + mem5.mutex = 0; + return; +} + +#ifdef SQLITE_TEST +/* +** Open the file indicated and write a log of all unfreed memory +** allocations into that log. +*/ +SQLITE_PRIVATE void sqlite3Memsys5Dump(const char *zFilename){ + FILE *out; + int i, j, n; + int nMinLog; + + if( zFilename==0 || zFilename[0]==0 ){ + out = stdout; + }else{ + out = fopen(zFilename, "w"); + if( out==0 ){ + fprintf(stderr, "** Unable to output memory debug output log: %s **\n", + zFilename); + return; + } + } + memsys5Enter(); + nMinLog = memsys5Log(mem5.szAtom); + for(i=0; i<=LOGMAX && i+nMinLog<32; i++){ + for(n=0, j=mem5.aiFreelist[i]; j>=0; j = MEM5LINK(j)->next, n++){} + fprintf(out, "freelist items of size %d: %d\n", mem5.szAtom << i, n); + } + fprintf(out, "mem5.nAlloc = %llu\n", mem5.nAlloc); + fprintf(out, "mem5.totalAlloc = %llu\n", mem5.totalAlloc); + fprintf(out, "mem5.totalExcess = %llu\n", mem5.totalExcess); + fprintf(out, "mem5.currentOut = %u\n", mem5.currentOut); + fprintf(out, "mem5.currentCount = %u\n", mem5.currentCount); + fprintf(out, "mem5.maxOut = %u\n", mem5.maxOut); + fprintf(out, "mem5.maxCount = %u\n", mem5.maxCount); + fprintf(out, "mem5.maxRequest = %u\n", mem5.maxRequest); + memsys5Leave(); + if( out==stdout ){ + fflush(stdout); + }else{ + fclose(out); + } +} +#endif + +/* +** This routine is the only routine in this file with external +** linkage. It returns a pointer to a static sqlite3_mem_methods +** struct populated with the memsys5 methods. +*/ +SQLITE_PRIVATE const sqlite3_mem_methods *sqlite3MemGetMemsys5(void){ + static const sqlite3_mem_methods memsys5Methods = { + memsys5Malloc, + memsys5Free, + memsys5Realloc, + memsys5Size, + memsys5Roundup, + memsys5Init, + memsys5Shutdown, + 0 + }; + return &memsys5Methods; +} + +#endif /* SQLITE_ENABLE_MEMSYS5 */ + +/************** End of mem5.c ************************************************/ +/************** Begin file mutex.c *******************************************/ +/* +** 2007 August 14 +** +** 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 the C functions that implement mutexes. +** +** This file contains code that is common across all mutex implementations. +*/ +/* #include "sqliteInt.h" */ + +#if defined(SQLITE_DEBUG) && !defined(SQLITE_MUTEX_OMIT) +/* +** For debugging purposes, record when the mutex subsystem is initialized +** and uninitialized so that we can assert() if there is an attempt to +** allocate a mutex while the system is uninitialized. +*/ +static SQLITE_WSD int mutexIsInit = 0; +#endif /* SQLITE_DEBUG && !defined(SQLITE_MUTEX_OMIT) */ + + +#ifndef SQLITE_MUTEX_OMIT +/* +** Initialize the mutex system. +*/ +SQLITE_PRIVATE int sqlite3MutexInit(void){ + int rc = SQLITE_OK; + if( !sqlite3GlobalConfig.mutex.xMutexAlloc ){ + /* If the xMutexAlloc method has not been set, then the user did not + ** install a mutex implementation via sqlite3_config() prior to + ** sqlite3_initialize() being called. This block copies pointers to + ** the default implementation into the sqlite3GlobalConfig structure. + */ + sqlite3_mutex_methods const *pFrom; + sqlite3_mutex_methods *pTo = &sqlite3GlobalConfig.mutex; + + if( sqlite3GlobalConfig.bCoreMutex ){ + pFrom = sqlite3DefaultMutex(); + }else{ + pFrom = sqlite3NoopMutex(); + } + pTo->xMutexInit = pFrom->xMutexInit; + pTo->xMutexEnd = pFrom->xMutexEnd; + pTo->xMutexFree = pFrom->xMutexFree; + pTo->xMutexEnter = pFrom->xMutexEnter; + pTo->xMutexTry = pFrom->xMutexTry; + pTo->xMutexLeave = pFrom->xMutexLeave; + pTo->xMutexHeld = pFrom->xMutexHeld; + pTo->xMutexNotheld = pFrom->xMutexNotheld; + sqlite3MemoryBarrier(); + pTo->xMutexAlloc = pFrom->xMutexAlloc; + } + assert( sqlite3GlobalConfig.mutex.xMutexInit ); + rc = sqlite3GlobalConfig.mutex.xMutexInit(); + +#ifdef SQLITE_DEBUG + GLOBAL(int, mutexIsInit) = 1; +#endif + + return rc; +} + +/* +** Shutdown the mutex system. This call frees resources allocated by +** sqlite3MutexInit(). +*/ +SQLITE_PRIVATE int sqlite3MutexEnd(void){ + int rc = SQLITE_OK; + if( sqlite3GlobalConfig.mutex.xMutexEnd ){ + rc = sqlite3GlobalConfig.mutex.xMutexEnd(); + } + +#ifdef SQLITE_DEBUG + GLOBAL(int, mutexIsInit) = 0; +#endif + + return rc; +} + +/* +** Retrieve a pointer to a static mutex or allocate a new dynamic one. +*/ +SQLITE_API sqlite3_mutex *sqlite3_mutex_alloc(int id){ +#ifndef SQLITE_OMIT_AUTOINIT + if( id<=SQLITE_MUTEX_RECURSIVE && sqlite3_initialize() ) return 0; + if( id>SQLITE_MUTEX_RECURSIVE && sqlite3MutexInit() ) return 0; +#endif + assert( sqlite3GlobalConfig.mutex.xMutexAlloc ); + return sqlite3GlobalConfig.mutex.xMutexAlloc(id); +} + +SQLITE_PRIVATE sqlite3_mutex *sqlite3MutexAlloc(int id){ + if( !sqlite3GlobalConfig.bCoreMutex ){ + return 0; + } + assert( GLOBAL(int, mutexIsInit) ); + assert( sqlite3GlobalConfig.mutex.xMutexAlloc ); + return sqlite3GlobalConfig.mutex.xMutexAlloc(id); +} + +/* +** Free a dynamic mutex. +*/ +SQLITE_API void sqlite3_mutex_free(sqlite3_mutex *p){ + if( p ){ + assert( sqlite3GlobalConfig.mutex.xMutexFree ); + sqlite3GlobalConfig.mutex.xMutexFree(p); + } +} + +/* +** Obtain the mutex p. If some other thread already has the mutex, block +** until it can be obtained. +*/ +SQLITE_API void sqlite3_mutex_enter(sqlite3_mutex *p){ + if( p ){ + assert( sqlite3GlobalConfig.mutex.xMutexEnter ); + sqlite3GlobalConfig.mutex.xMutexEnter(p); + } +} + +/* +** Obtain the mutex p. If successful, return SQLITE_OK. Otherwise, if another +** thread holds the mutex and it cannot be obtained, return SQLITE_BUSY. +*/ +SQLITE_API int sqlite3_mutex_try(sqlite3_mutex *p){ + int rc = SQLITE_OK; + if( p ){ + assert( sqlite3GlobalConfig.mutex.xMutexTry ); + return sqlite3GlobalConfig.mutex.xMutexTry(p); + } + 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. If a NULL pointer is passed as an argument +** this function is a no-op. +*/ +SQLITE_API void sqlite3_mutex_leave(sqlite3_mutex *p){ + if( p ){ + assert( sqlite3GlobalConfig.mutex.xMutexLeave ); + sqlite3GlobalConfig.mutex.xMutexLeave(p); + } +} + +#ifndef NDEBUG +/* +** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routine are +** intended for use inside assert() statements. +*/ +SQLITE_API int sqlite3_mutex_held(sqlite3_mutex *p){ + assert( p==0 || sqlite3GlobalConfig.mutex.xMutexHeld ); + return p==0 || sqlite3GlobalConfig.mutex.xMutexHeld(p); +} +SQLITE_API int sqlite3_mutex_notheld(sqlite3_mutex *p){ + assert( p==0 || sqlite3GlobalConfig.mutex.xMutexNotheld ); + return p==0 || sqlite3GlobalConfig.mutex.xMutexNotheld(p); +} +#endif + +#endif /* !defined(SQLITE_MUTEX_OMIT) */ + +/************** End of mutex.c ***********************************************/ +/************** Begin file mutex_noop.c **************************************/ +/* +** 2008 October 07 +** +** 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 the C functions that implement mutexes. +** +** This implementation in this file does not provide any mutual +** exclusion and is thus suitable for use only in applications +** that use SQLite in a single thread. The routines defined +** here are place-holders. Applications can substitute working +** mutex routines at start-time using the +** +** sqlite3_config(SQLITE_CONFIG_MUTEX,...) +** +** interface. +** +** If compiled with SQLITE_DEBUG, then additional logic is inserted +** that does error checking on mutexes to make sure they are being +** called correctly. +*/ +/* #include "sqliteInt.h" */ + +#ifndef SQLITE_MUTEX_OMIT + +#ifndef SQLITE_DEBUG +/* +** Stub routines for all mutex methods. +** +** This routines provide no mutual exclusion or error checking. +*/ +static int noopMutexInit(void){ return SQLITE_OK; } +static int noopMutexEnd(void){ return SQLITE_OK; } +static sqlite3_mutex *noopMutexAlloc(int id){ + UNUSED_PARAMETER(id); + return (sqlite3_mutex*)8; +} +static void noopMutexFree(sqlite3_mutex *p){ UNUSED_PARAMETER(p); return; } +static void noopMutexEnter(sqlite3_mutex *p){ UNUSED_PARAMETER(p); return; } +static int noopMutexTry(sqlite3_mutex *p){ + UNUSED_PARAMETER(p); + return SQLITE_OK; +} +static void noopMutexLeave(sqlite3_mutex *p){ UNUSED_PARAMETER(p); return; } + +SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3NoopMutex(void){ + static const sqlite3_mutex_methods sMutex = { + noopMutexInit, + noopMutexEnd, + noopMutexAlloc, + noopMutexFree, + noopMutexEnter, + noopMutexTry, + noopMutexLeave, + + 0, + 0, + }; + + return &sMutex; +} +#endif /* !SQLITE_DEBUG */ + +#ifdef SQLITE_DEBUG +/* +** In this implementation, error checking is provided for testing +** and debugging purposes. The mutexes still do not provide any +** mutual exclusion. +*/ + +/* +** The mutex object +*/ +typedef struct sqlite3_debug_mutex { + int id; /* The mutex type */ + int cnt; /* Number of entries without a matching leave */ +} sqlite3_debug_mutex; + +/* +** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routine are +** intended for use inside assert() statements. +*/ +static int debugMutexHeld(sqlite3_mutex *pX){ + sqlite3_debug_mutex *p = (sqlite3_debug_mutex*)pX; + return p==0 || p->cnt>0; +} +static int debugMutexNotheld(sqlite3_mutex *pX){ + sqlite3_debug_mutex *p = (sqlite3_debug_mutex*)pX; + return p==0 || p->cnt==0; +} + +/* +** Initialize and deinitialize the mutex subsystem. +*/ +static int debugMutexInit(void){ return SQLITE_OK; } +static int debugMutexEnd(void){ return SQLITE_OK; } + +/* +** 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. +*/ +static sqlite3_mutex *debugMutexAlloc(int id){ + static sqlite3_debug_mutex aStatic[SQLITE_MUTEX_STATIC_VFS3 - 1]; + sqlite3_debug_mutex *pNew = 0; + switch( id ){ + case SQLITE_MUTEX_FAST: + case SQLITE_MUTEX_RECURSIVE: { + pNew = sqlite3Malloc(sizeof(*pNew)); + if( pNew ){ + pNew->id = id; + pNew->cnt = 0; + } + break; + } + default: { +#ifdef SQLITE_ENABLE_API_ARMOR + if( id-2<0 || id-2>=ArraySize(aStatic) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + pNew = &aStatic[id-2]; + pNew->id = id; + break; + } + } + return (sqlite3_mutex*)pNew; +} + +/* +** This routine deallocates a previously allocated mutex. +*/ +static void debugMutexFree(sqlite3_mutex *pX){ + sqlite3_debug_mutex *p = (sqlite3_debug_mutex*)pX; + assert( p->cnt==0 ); + if( p->id==SQLITE_MUTEX_RECURSIVE || p->id==SQLITE_MUTEX_FAST ){ + sqlite3_free(p); + }else{ +#ifdef SQLITE_ENABLE_API_ARMOR + (void)SQLITE_MISUSE_BKPT; +#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 debugMutexEnter(sqlite3_mutex *pX){ + sqlite3_debug_mutex *p = (sqlite3_debug_mutex*)pX; + assert( p->id==SQLITE_MUTEX_RECURSIVE || debugMutexNotheld(pX) ); + p->cnt++; +} +static int debugMutexTry(sqlite3_mutex *pX){ + sqlite3_debug_mutex *p = (sqlite3_debug_mutex*)pX; + assert( p->id==SQLITE_MUTEX_RECURSIVE || debugMutexNotheld(pX) ); + p->cnt++; + return SQLITE_OK; +} + +/* +** 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 debugMutexLeave(sqlite3_mutex *pX){ + sqlite3_debug_mutex *p = (sqlite3_debug_mutex*)pX; + assert( debugMutexHeld(pX) ); + p->cnt--; + assert( p->id==SQLITE_MUTEX_RECURSIVE || debugMutexNotheld(pX) ); +} + +SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3NoopMutex(void){ + static const sqlite3_mutex_methods sMutex = { + debugMutexInit, + debugMutexEnd, + debugMutexAlloc, + debugMutexFree, + debugMutexEnter, + debugMutexTry, + debugMutexLeave, + + debugMutexHeld, + debugMutexNotheld + }; + + return &sMutex; +} +#endif /* SQLITE_DEBUG */ + +/* +** If compiled with SQLITE_MUTEX_NOOP, then the no-op mutex implementation +** is used regardless of the run-time threadsafety setting. +*/ +#ifdef SQLITE_MUTEX_NOOP +SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3DefaultMutex(void){ + return sqlite3NoopMutex(); +} +#endif /* defined(SQLITE_MUTEX_NOOP) */ +#endif /* !defined(SQLITE_MUTEX_OMIT) */ + +/************** End of mutex_noop.c ******************************************/ +/************** Begin file mutex_unix.c **************************************/ +/* +** 2007 August 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 file contains the C functions that implement mutexes for pthreads +*/ +/* #include "sqliteInt.h" */ + +/* +** The code in this file is only used if we are compiling threadsafe +** under unix with pthreads. +** +** Note that this implementation requires a version of pthreads that +** supports recursive mutexes. +*/ +#ifdef SQLITE_MUTEX_PTHREADS + +#include + +/* +** The sqlite3_mutex.id, sqlite3_mutex.nRef, and sqlite3_mutex.owner fields +** are necessary under two condidtions: (1) Debug builds and (2) using +** home-grown mutexes. Encapsulate these conditions into a single #define. +*/ +#if defined(SQLITE_DEBUG) || defined(SQLITE_HOMEGROWN_RECURSIVE_MUTEX) +# define SQLITE_MUTEX_NREF 1 +#else +# define SQLITE_MUTEX_NREF 0 +#endif + +/* +** Each recursive mutex is an instance of the following structure. +*/ +struct sqlite3_mutex { + pthread_mutex_t mutex; /* Mutex controlling the lock */ +#if SQLITE_MUTEX_NREF || defined(SQLITE_ENABLE_API_ARMOR) + int id; /* Mutex type */ +#endif +#if SQLITE_MUTEX_NREF + volatile int nRef; /* Number of entrances */ + volatile pthread_t owner; /* Thread that is within this mutex */ + int trace; /* True to trace changes */ +#endif +}; +#if SQLITE_MUTEX_NREF +#define SQLITE3_MUTEX_INITIALIZER {PTHREAD_MUTEX_INITIALIZER,0,0,(pthread_t)0,0} +#elif defined(SQLITE_ENABLE_API_ARMOR) +#define SQLITE3_MUTEX_INITIALIZER { PTHREAD_MUTEX_INITIALIZER, 0 } +#else +#define SQLITE3_MUTEX_INITIALIZER { PTHREAD_MUTEX_INITIALIZER } +#endif + +/* +** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routine are +** intended for use only inside assert() statements. On some platforms, +** there might be race conditions that can cause these routines to +** deliver incorrect results. In particular, if pthread_equal() is +** not an atomic operation, then these routines might delivery +** incorrect results. On most platforms, pthread_equal() is a +** comparison of two integers and is therefore atomic. But we are +** told that HPUX is not such a platform. If so, then these routines +** will not always work correctly on HPUX. +** +** On those platforms where pthread_equal() is not atomic, SQLite +** should be compiled without -DSQLITE_DEBUG and with -DNDEBUG to +** make sure no assert() statements are evaluated and hence these +** routines are never called. +*/ +#if !defined(NDEBUG) || defined(SQLITE_DEBUG) +static int pthreadMutexHeld(sqlite3_mutex *p){ + return (p->nRef!=0 && pthread_equal(p->owner, pthread_self())); +} +static int pthreadMutexNotheld(sqlite3_mutex *p){ + return p->nRef==0 || pthread_equal(p->owner, pthread_self())==0; +} +#endif + +/* +** Try to provide a memory barrier operation, needed for initialization +** and also for the implementation of xShmBarrier in the VFS in cases +** where SQLite is compiled without mutexes. +*/ +SQLITE_PRIVATE void sqlite3MemoryBarrier(void){ +#if defined(SQLITE_MEMORY_BARRIER) + SQLITE_MEMORY_BARRIER; +#elif defined(__GNUC__) && GCC_VERSION>=4001000 + __sync_synchronize(); +#endif +} + +/* +** Initialize and deinitialize the mutex subsystem. +*/ +static int pthreadMutexInit(void){ return SQLITE_OK; } +static int pthreadMutexEnd(void){ return SQLITE_OK; } + +/* +** 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: +** +**
        +**
      • SQLITE_MUTEX_FAST +**
      • SQLITE_MUTEX_RECURSIVE +**
      • SQLITE_MUTEX_STATIC_MASTER +**
      • SQLITE_MUTEX_STATIC_MEM +**
      • SQLITE_MUTEX_STATIC_OPEN +**
      • SQLITE_MUTEX_STATIC_PRNG +**
      • SQLITE_MUTEX_STATIC_LRU +**
      • SQLITE_MUTEX_STATIC_PMEM +**
      • SQLITE_MUTEX_STATIC_APP1 +**
      • SQLITE_MUTEX_STATIC_APP2 +**
      • SQLITE_MUTEX_STATIC_APP3 +**
      • SQLITE_MUTEX_STATIC_VFS1 +**
      • SQLITE_MUTEX_STATIC_VFS2 +**
      • SQLITE_MUTEX_STATIC_VFS3 +**
      +** +** 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. +** The mutex implementation does not need to make a distinction +** between SQLITE_MUTEX_RECURSIVE and SQLITE_MUTEX_FAST if it does +** not want to. But 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. +** +** The other allowed parameters to sqlite3_mutex_alloc() 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. +** +** 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. But for the static +** mutex types, the same mutex is returned on every call that has +** the same type number. +*/ +static sqlite3_mutex *pthreadMutexAlloc(int iType){ + static sqlite3_mutex staticMutexes[] = { + SQLITE3_MUTEX_INITIALIZER, + SQLITE3_MUTEX_INITIALIZER, + SQLITE3_MUTEX_INITIALIZER, + SQLITE3_MUTEX_INITIALIZER, + SQLITE3_MUTEX_INITIALIZER, + SQLITE3_MUTEX_INITIALIZER, + SQLITE3_MUTEX_INITIALIZER, + SQLITE3_MUTEX_INITIALIZER, + SQLITE3_MUTEX_INITIALIZER, + SQLITE3_MUTEX_INITIALIZER, + SQLITE3_MUTEX_INITIALIZER, + SQLITE3_MUTEX_INITIALIZER + }; + sqlite3_mutex *p; + switch( iType ){ + case SQLITE_MUTEX_RECURSIVE: { + p = sqlite3MallocZero( sizeof(*p) ); + if( p ){ +#ifdef SQLITE_HOMEGROWN_RECURSIVE_MUTEX + /* If recursive mutexes are not available, we will have to + ** build our own. See below. */ + pthread_mutex_init(&p->mutex, 0); +#else + /* Use a recursive mutex if it is available */ + pthread_mutexattr_t recursiveAttr; + pthread_mutexattr_init(&recursiveAttr); + pthread_mutexattr_settype(&recursiveAttr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&p->mutex, &recursiveAttr); + pthread_mutexattr_destroy(&recursiveAttr); +#endif + } + break; + } + case SQLITE_MUTEX_FAST: { + p = sqlite3MallocZero( sizeof(*p) ); + if( p ){ + pthread_mutex_init(&p->mutex, 0); + } + break; + } + default: { +#ifdef SQLITE_ENABLE_API_ARMOR + if( iType-2<0 || iType-2>=ArraySize(staticMutexes) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + p = &staticMutexes[iType-2]; + break; + } + } +#if SQLITE_MUTEX_NREF || defined(SQLITE_ENABLE_API_ARMOR) + if( p ) p->id = iType; +#endif + return p; +} + + +/* +** This routine deallocates a previously +** allocated mutex. SQLite is careful to deallocate every +** mutex that it allocates. +*/ +static void pthreadMutexFree(sqlite3_mutex *p){ + assert( p->nRef==0 ); +#if SQLITE_ENABLE_API_ARMOR + if( p->id==SQLITE_MUTEX_FAST || p->id==SQLITE_MUTEX_RECURSIVE ) +#endif + { + pthread_mutex_destroy(&p->mutex); + sqlite3_free(p); + } +#ifdef SQLITE_ENABLE_API_ARMOR + else{ + (void)SQLITE_MISUSE_BKPT; + } +#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 pthreadMutexEnter(sqlite3_mutex *p){ + assert( p->id==SQLITE_MUTEX_RECURSIVE || pthreadMutexNotheld(p) ); + +#ifdef SQLITE_HOMEGROWN_RECURSIVE_MUTEX + /* If recursive mutexes are not available, then we have to grow + ** our own. This implementation assumes that pthread_equal() + ** is atomic - that it cannot be deceived into thinking self + ** and p->owner are equal if p->owner changes between two values + ** that are not equal to self while the comparison is taking place. + ** This implementation also assumes a coherent cache - that + ** separate processes cannot read different values from the same + ** address at the same time. If either of these two conditions + ** are not met, then the mutexes will fail and problems will result. + */ + { + pthread_t self = pthread_self(); + if( p->nRef>0 && pthread_equal(p->owner, self) ){ + p->nRef++; + }else{ + pthread_mutex_lock(&p->mutex); + assert( p->nRef==0 ); + p->owner = self; + p->nRef = 1; + } + } +#else + /* Use the built-in recursive mutexes if they are available. + */ + pthread_mutex_lock(&p->mutex); +#if SQLITE_MUTEX_NREF + assert( p->nRef>0 || p->owner==0 ); + p->owner = pthread_self(); + p->nRef++; +#endif +#endif + +#ifdef SQLITE_DEBUG + if( p->trace ){ + printf("enter mutex %p (%d) with nRef=%d\n", p, p->trace, p->nRef); + } +#endif +} +static int pthreadMutexTry(sqlite3_mutex *p){ + int rc; + assert( p->id==SQLITE_MUTEX_RECURSIVE || pthreadMutexNotheld(p) ); + +#ifdef SQLITE_HOMEGROWN_RECURSIVE_MUTEX + /* If recursive mutexes are not available, then we have to grow + ** our own. This implementation assumes that pthread_equal() + ** is atomic - that it cannot be deceived into thinking self + ** and p->owner are equal if p->owner changes between two values + ** that are not equal to self while the comparison is taking place. + ** This implementation also assumes a coherent cache - that + ** separate processes cannot read different values from the same + ** address at the same time. If either of these two conditions + ** are not met, then the mutexes will fail and problems will result. + */ + { + pthread_t self = pthread_self(); + if( p->nRef>0 && pthread_equal(p->owner, self) ){ + p->nRef++; + rc = SQLITE_OK; + }else if( pthread_mutex_trylock(&p->mutex)==0 ){ + assert( p->nRef==0 ); + p->owner = self; + p->nRef = 1; + rc = SQLITE_OK; + }else{ + rc = SQLITE_BUSY; + } + } +#else + /* Use the built-in recursive mutexes if they are available. + */ + if( pthread_mutex_trylock(&p->mutex)==0 ){ +#if SQLITE_MUTEX_NREF + p->owner = pthread_self(); + p->nRef++; +#endif + rc = SQLITE_OK; + }else{ + rc = SQLITE_BUSY; + } +#endif + +#ifdef SQLITE_DEBUG + if( rc==SQLITE_OK && p->trace ){ + printf("enter mutex %p (%d) with nRef=%d\n", p, p->trace, p->nRef); + } +#endif + 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 pthreadMutexLeave(sqlite3_mutex *p){ + assert( pthreadMutexHeld(p) ); +#if SQLITE_MUTEX_NREF + p->nRef--; + if( p->nRef==0 ) p->owner = 0; +#endif + assert( p->nRef==0 || p->id==SQLITE_MUTEX_RECURSIVE ); + +#ifdef SQLITE_HOMEGROWN_RECURSIVE_MUTEX + if( p->nRef==0 ){ + pthread_mutex_unlock(&p->mutex); + } +#else + pthread_mutex_unlock(&p->mutex); +#endif + +#ifdef SQLITE_DEBUG + if( p->trace ){ + printf("leave mutex %p (%d) with nRef=%d\n", p, p->trace, p->nRef); + } +#endif +} + +SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3DefaultMutex(void){ + static const sqlite3_mutex_methods sMutex = { + pthreadMutexInit, + pthreadMutexEnd, + pthreadMutexAlloc, + pthreadMutexFree, + pthreadMutexEnter, + pthreadMutexTry, + pthreadMutexLeave, +#ifdef SQLITE_DEBUG + pthreadMutexHeld, + pthreadMutexNotheld +#else + 0, + 0 +#endif + }; + + return &sMutex; +} + +#endif /* SQLITE_MUTEX_PTHREADS */ + +/************** End of mutex_unix.c ******************************************/ +/************** Begin file mutex_w32.c ***************************************/ +/* +** 2007 August 14 +** +** 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 the C functions that implement mutexes for Win32. +*/ +/* #include "sqliteInt.h" */ + +#if SQLITE_OS_WIN +/* +** Include code that is common to all os_*.c files +*/ +/************** Include os_common.h in the middle of mutex_w32.c *************/ +/************** Begin file os_common.h ***************************************/ +/* +** 2004 May 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 file contains macros and a little bit of code that is common to +** all of the platform-specific files (os_*.c) and is #included into those +** files. +** +** This file should be #included by the os_*.c files only. It is not a +** general purpose header file. +*/ +#ifndef _OS_COMMON_H_ +#define _OS_COMMON_H_ + +/* +** At least two bugs have slipped in because we changed the MEMORY_DEBUG +** macro to SQLITE_DEBUG and some older makefiles have not yet made the +** switch. The following code should catch this problem at compile-time. +*/ +#ifdef MEMORY_DEBUG +# error "The MEMORY_DEBUG macro is obsolete. Use SQLITE_DEBUG instead." +#endif + +/* +** Macros for performance tracing. Normally turned off. Only works +** on i486 hardware. +*/ +#ifdef SQLITE_PERFORMANCE_TRACE + +/* +** hwtime.h contains inline assembler code for implementing +** high-performance timing routines. +*/ +/************** Include hwtime.h in the middle of os_common.h ****************/ +/************** Begin file hwtime.h ******************************************/ +/* +** 2008 May 27 +** +** 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 inline asm code for retrieving "high-performance" +** counters for x86 class CPUs. +*/ +#ifndef SQLITE_HWTIME_H +#define SQLITE_HWTIME_H + +/* +** The following routine only works on pentium-class (or newer) processors. +** It uses the RDTSC opcode to read the cycle count value out of the +** processor and returns that value. This can be used for high-res +** profiling. +*/ +#if (defined(__GNUC__) || defined(_MSC_VER)) && \ + (defined(i386) || defined(__i386__) || defined(_M_IX86)) + + #if defined(__GNUC__) + + __inline__ sqlite_uint64 sqlite3Hwtime(void){ + unsigned int lo, hi; + __asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi)); + return (sqlite_uint64)hi << 32 | lo; + } + + #elif defined(_MSC_VER) + + __declspec(naked) __inline sqlite_uint64 __cdecl sqlite3Hwtime(void){ + __asm { + rdtsc + ret ; return value at EDX:EAX + } + } + + #endif + +#elif (defined(__GNUC__) && defined(__x86_64__)) + + __inline__ sqlite_uint64 sqlite3Hwtime(void){ + unsigned long val; + __asm__ __volatile__ ("rdtsc" : "=A" (val)); + return val; + } + +#elif (defined(__GNUC__) && defined(__ppc__)) + + __inline__ sqlite_uint64 sqlite3Hwtime(void){ + unsigned long long retval; + unsigned long junk; + __asm__ __volatile__ ("\n\ + 1: mftbu %1\n\ + mftb %L0\n\ + mftbu %0\n\ + cmpw %0,%1\n\ + bne 1b" + : "=r" (retval), "=r" (junk)); + return retval; + } + +#else + + #error Need implementation of sqlite3Hwtime() for your platform. + + /* + ** To compile without implementing sqlite3Hwtime() for your platform, + ** you can remove the above #error and use the following + ** stub function. You will lose timing support for many + ** of the debugging and testing utilities, but it should at + ** least compile and run. + */ +SQLITE_PRIVATE sqlite_uint64 sqlite3Hwtime(void){ return ((sqlite_uint64)0); } + +#endif + +#endif /* !defined(SQLITE_HWTIME_H) */ + +/************** End of hwtime.h **********************************************/ +/************** Continuing where we left off in os_common.h ******************/ + +static sqlite_uint64 g_start; +static sqlite_uint64 g_elapsed; +#define TIMER_START g_start=sqlite3Hwtime() +#define TIMER_END g_elapsed=sqlite3Hwtime()-g_start +#define TIMER_ELAPSED g_elapsed +#else +#define TIMER_START +#define TIMER_END +#define TIMER_ELAPSED ((sqlite_uint64)0) +#endif + +/* +** If we compile with the SQLITE_TEST macro set, then the following block +** of code will give us the ability to simulate a disk I/O error. This +** is used for testing the I/O recovery logic. +*/ +#if defined(SQLITE_TEST) +SQLITE_API extern int sqlite3_io_error_hit; +SQLITE_API extern int sqlite3_io_error_hardhit; +SQLITE_API extern int sqlite3_io_error_pending; +SQLITE_API extern int sqlite3_io_error_persist; +SQLITE_API extern int sqlite3_io_error_benign; +SQLITE_API extern int sqlite3_diskfull_pending; +SQLITE_API extern int sqlite3_diskfull; +#define SimulateIOErrorBenign(X) sqlite3_io_error_benign=(X) +#define SimulateIOError(CODE) \ + if( (sqlite3_io_error_persist && sqlite3_io_error_hit) \ + || sqlite3_io_error_pending-- == 1 ) \ + { local_ioerr(); CODE; } +static void local_ioerr(){ + IOTRACE(("IOERR\n")); + sqlite3_io_error_hit++; + if( !sqlite3_io_error_benign ) sqlite3_io_error_hardhit++; +} +#define SimulateDiskfullError(CODE) \ + if( sqlite3_diskfull_pending ){ \ + if( sqlite3_diskfull_pending == 1 ){ \ + local_ioerr(); \ + sqlite3_diskfull = 1; \ + sqlite3_io_error_hit = 1; \ + CODE; \ + }else{ \ + sqlite3_diskfull_pending--; \ + } \ + } +#else +#define SimulateIOErrorBenign(X) +#define SimulateIOError(A) +#define SimulateDiskfullError(A) +#endif /* defined(SQLITE_TEST) */ + +/* +** When testing, keep a count of the number of open files. +*/ +#if defined(SQLITE_TEST) +SQLITE_API extern int sqlite3_open_file_count; +#define OpenCounter(X) sqlite3_open_file_count+=(X) +#else +#define OpenCounter(X) +#endif /* defined(SQLITE_TEST) */ + +#endif /* !defined(_OS_COMMON_H_) */ + +/************** End of os_common.h *******************************************/ +/************** Continuing where we left off in mutex_w32.c ******************/ + +/* +** Include the header file for the Windows VFS. +*/ +/************** Include os_win.h in the middle of mutex_w32.c ****************/ +/************** Begin file os_win.h ******************************************/ +/* +** 2013 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 that is specific to Windows. +*/ +#ifndef SQLITE_OS_WIN_H +#define SQLITE_OS_WIN_H + +/* +** Include the primary Windows SDK header file. +*/ +#include "windows.h" + +#ifdef __CYGWIN__ +# include +# include /* amalgamator: dontcache */ +#endif + +/* +** Determine if we are dealing with Windows NT. +** +** We ought to be able to determine if we are compiling for Windows 9x or +** Windows NT using the _WIN32_WINNT macro as follows: +** +** #if defined(_WIN32_WINNT) +** # define SQLITE_OS_WINNT 1 +** #else +** # define SQLITE_OS_WINNT 0 +** #endif +** +** However, Visual Studio 2005 does not set _WIN32_WINNT by default, as +** it ought to, so the above test does not work. We'll just assume that +** everything is Windows NT unless the programmer explicitly says otherwise +** by setting SQLITE_OS_WINNT to 0. +*/ +#if SQLITE_OS_WIN && !defined(SQLITE_OS_WINNT) +# define SQLITE_OS_WINNT 1 +#endif + +/* +** Determine if we are dealing with Windows CE - which has a much reduced +** API. +*/ +#if defined(_WIN32_WCE) +# define SQLITE_OS_WINCE 1 +#else +# define SQLITE_OS_WINCE 0 +#endif + +/* +** Determine if we are dealing with WinRT, which provides only a subset of +** the full Win32 API. +*/ +#if !defined(SQLITE_OS_WINRT) +# define SQLITE_OS_WINRT 0 +#endif + +/* +** For WinCE, some API function parameters do not appear to be declared as +** volatile. +*/ +#if SQLITE_OS_WINCE +# define SQLITE_WIN32_VOLATILE +#else +# define SQLITE_WIN32_VOLATILE volatile +#endif + +/* +** For some Windows sub-platforms, the _beginthreadex() / _endthreadex() +** functions are not available (e.g. those not using MSVC, Cygwin, etc). +*/ +#if SQLITE_OS_WIN && !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && \ + SQLITE_THREADSAFE>0 && !defined(__CYGWIN__) +# define SQLITE_OS_WIN_THREADS 1 +#else +# define SQLITE_OS_WIN_THREADS 0 +#endif + +#endif /* SQLITE_OS_WIN_H */ + +/************** End of os_win.h **********************************************/ +/************** Continuing where we left off in mutex_w32.c ******************/ +#endif + +/* +** The code in this file is only used if we are compiling multithreaded +** on a Win32 system. +*/ +#ifdef SQLITE_MUTEX_W32 + +/* +** Each recursive mutex is an instance of the following structure. +*/ +struct sqlite3_mutex { + CRITICAL_SECTION mutex; /* Mutex controlling the lock */ + int id; /* Mutex type */ +#ifdef SQLITE_DEBUG + volatile int nRef; /* Number of enterances */ + volatile DWORD owner; /* Thread holding this mutex */ + volatile int trace; /* True to trace changes */ +#endif +}; + +/* +** These are the initializer values used when declaring a "static" mutex +** on Win32. It should be noted that all mutexes require initialization +** on the Win32 platform. +*/ +#define SQLITE_W32_MUTEX_INITIALIZER { 0 } + +#ifdef SQLITE_DEBUG +#define SQLITE3_MUTEX_INITIALIZER { SQLITE_W32_MUTEX_INITIALIZER, 0, \ + 0L, (DWORD)0, 0 } +#else +#define SQLITE3_MUTEX_INITIALIZER { SQLITE_W32_MUTEX_INITIALIZER, 0 } +#endif + +#ifdef SQLITE_DEBUG +/* +** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routine are +** intended for use only inside assert() statements. +*/ +static int winMutexHeld(sqlite3_mutex *p){ + return p->nRef!=0 && p->owner==GetCurrentThreadId(); +} + +static int winMutexNotheld2(sqlite3_mutex *p, DWORD tid){ + return p->nRef==0 || p->owner!=tid; +} + +static int winMutexNotheld(sqlite3_mutex *p){ + DWORD tid = GetCurrentThreadId(); + return winMutexNotheld2(p, tid); +} +#endif + +/* +** Try to provide a memory barrier operation, needed for initialization +** and also for the xShmBarrier method of the VFS in cases when SQLite is +** compiled without mutexes (SQLITE_THREADSAFE=0). +*/ +SQLITE_PRIVATE void sqlite3MemoryBarrier(void){ +#if defined(SQLITE_MEMORY_BARRIER) + SQLITE_MEMORY_BARRIER; +#elif defined(__GNUC__) + __sync_synchronize(); +#elif !defined(SQLITE_DISABLE_INTRINSIC) && \ + defined(_MSC_VER) && _MSC_VER>=1300 + _ReadWriteBarrier(); +#elif defined(MemoryBarrier) + MemoryBarrier(); +#endif +} + +/* +** Initialize and deinitialize the mutex subsystem. +*/ +static sqlite3_mutex winMutex_staticMutexes[] = { + SQLITE3_MUTEX_INITIALIZER, + SQLITE3_MUTEX_INITIALIZER, + SQLITE3_MUTEX_INITIALIZER, + SQLITE3_MUTEX_INITIALIZER, + SQLITE3_MUTEX_INITIALIZER, + SQLITE3_MUTEX_INITIALIZER, + SQLITE3_MUTEX_INITIALIZER, + SQLITE3_MUTEX_INITIALIZER, + SQLITE3_MUTEX_INITIALIZER, + SQLITE3_MUTEX_INITIALIZER, + SQLITE3_MUTEX_INITIALIZER, + SQLITE3_MUTEX_INITIALIZER +}; + +static int winMutex_isInit = 0; +static int winMutex_isNt = -1; /* <0 means "need to query" */ + +/* As the winMutexInit() and winMutexEnd() functions are called as part +** of the sqlite3_initialize() and sqlite3_shutdown() processing, the +** "interlocked" magic used here is probably not strictly necessary. +*/ +static LONG SQLITE_WIN32_VOLATILE winMutex_lock = 0; + +SQLITE_API int sqlite3_win32_is_nt(void); /* os_win.c */ +SQLITE_API void sqlite3_win32_sleep(DWORD milliseconds); /* os_win.c */ + +static int winMutexInit(void){ + /* The first to increment to 1 does actual initialization */ + if( InterlockedCompareExchange(&winMutex_lock, 1, 0)==0 ){ + int i; + for(i=0; i +**

      &ddTduUq6d`}r!@<(9$TWqD)eWS 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 z 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≶2y8kyOB|qCC4F-c|dctgV% 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

    18. k_XSZr?ib_J<>bi@N>EfTLEYpg)|E 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

      ?;yF(AvFw779}$*_V^C120t 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�(Il~+3Ir+16U3Wlw6#dEc3V=FW?Adq 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 z

      Yqt*x)|qX8WLelBt*@Z4m`+E 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%0DO_G~5V%ZD1@ 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

      ieXWVC5rfT)d$F40|5&R;NB*D|BST$4 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

    19. K(j~P8gfa1*Pq{5L_1wB0qKW(Dya|#a&BH#~9 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

      lB{lr?mjWa>8nd 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 HR^I7z|6|8D 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Ý@$F2STII6SB*e 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%0Ann1CQM-H?mP-Nqg1FZ=Z*LdVWYr+(j zr;tRA+TwXzE6?Jlc#2h`Q#~chrnvmjrig9O)3%r0R@9gF+_~T1^E@>*b!oHvU}_3Z zHA_vN;NC4=IL}R+ms!3ygPt_%cimmFrU;x2YvU4 z;4fQvDMC4ZCs7w$b`GG-$1g)!F5~uanf99!bs?h`C%7-Lf2+^9_r{ieAE9|Y1k_Po z)_sbV5J?}N;Kvtneta<$;|?#q*~Y32I{k@gkL>^5o$M?pX7XdA*~S)B@Ii@e``S8! z(@fE4^VQkLW_(40|NPV_BF;KfaQp%*{!8JE`@6;e&X$5&j;L7G(P=Th!nO!@(ywdn zIIl7jUd>S4NFtjbho(fGnXlj#zQ({lnF)cV{qA{zQvy7`MqhTJ^m_gUKXX@jS%&S$o;W-Ji11sC76dj{PX&tVdgpExQc?w7Nand?exL7IMyH81l;GnW-Ph zFJu)|aI5?31ouVegU&2q-mxSqud?pb!MsBJi+>i(D>TwW^QvP|*kn!w3J7Jw%rcqB zl11*lMP@BSl8{=Y$g3z!Y%*(lDA+QznR0EQ4H=$JG{u(XnGdKgC@51Y5*QP_$g>n$ z^NpGORZ;Ve&;bk`TJaGOj-5c)#OmU9)6qnSS526%WX3U7X)@~*Vx)6g#(g&(xQ;~u zuYt;Bt+_gp;Se;LaVL90HZ8ujHJ>m_H_4h}0x+qk4FghBSr8>{Jo7GCQx2cziGG@= z#g=_7m}Z>6BWd>XuS~kZ)Fj@dJ7Y4>G!L?y$b>eqWbnhJ!ilUg>BcpfZk{`WfDpjd ziD}G%iEo+iiGI4LnRNF&jxj?hbmjc`>8Ho9UA%}FycEyNl{d_pW#-oSpfd|=ReZc^ zzR*mf#Xs?hIOflW#c#SPZt!$-5zcxu^y)eDKeuRJ{KIj29MgKy*bAml%6__e7(L^G zzmLlgWxoNQjkxSP+W*0I(%!Qcnrq`7kukMHZ{fLrH&@A73#-DFJ1R?_s4!+gTI$-L(OWA!& zzoFt4@k7=W%FVqUsee27rr#;I{y$_RmMhahW3NfEYyWo&f6lE1jZMGxZ|C0h99y+a za35~&k3FLeD;Uox@gKx!*Rt0LCdK57H(CG6gXM1p=fT3}rp*jlFtF)jc5uzu`nTnO zGBC_o9AcVee&t4WN6|6q(cI~!;a#3b`%VOt!?kH0KRK0(|2C<=T+zXvIbIc3-{-1qE zfpskSrpk13Tfi3<5s>PBsBg5$ydwMw$J|) zz=J$j3C?hW>D{a3aoaP}z;t^139iGb3&;oa?R^0}$mg^&;ru3m2lMS>c~M2D_cH-J z82${wHP7w<9?a)w888gxgYiDW%z_~vl#dgHAQ#t^cg{H(oz;ft}1g?Dv49 zoBI52iv1Rs6q1IAzit^#{Re?&x2v0148)^r{PV={NL=cEp9hb8&y(h@_Kz`Z0O{Jg zOVoRzLA>u{u)owO%S&IJX~ci9p7TzUKQQNb7yno5$8uw>s027ee6mV19%&MX9cwKS zfBK^P_2Ckx?k|tjza48?onzy({?D|4Tx~C7uO9<$?LpCh4mtvMEo;YG!FEUS+r>{N z;FngLe-<7Oi_R0?nJ{{(BHjY;8C`Mk4;Yz6|Va7N`qV{c>fGF>i9E{C5)=TNe z3~rY&*&cY$jvY=ncRh@GX3Yq(Q2t2zw5EVO{lvwMKJCmUO{1re9_96FexG(uJnnti z=KVSi4WmbmipQPC#*tp9cI4l?t+!+mXVS!*MB1xDsmAJ52X zQkbRM8R0xwtaDGS^G~tPp62|Zz0LW-2b%MVU9rx6vCcPRojaNvC-1FnZoKS3Wph3P zcrQ)@jdi}*+&Fu0C5|<1ZcOj0EbOeC(D9WzoR%8vd^y(nMy#`&-YVz~KeKmXf`4zU z^Utx)oy5b$@sr+Fk;+fS6g^J;eJPc%hNK6FQ+e>sUldI{8`I7cX=i)dSxv&R@=w$C!`^j zAGMc~OP@DVMixm*Ie$z!I4!m}QC83d`8*Dx4IyCuKF8mb^GeG3Q_6WU*7<6z^8hl* zlfUTzcwD`!0>O)q&_VhL9ZWfUJT_i#BQpl4@{35@_!(D6FAzo~6eb)eR{ zC-A==|EoQICeL<_i**iqFMbAp06&S-@e`>+ZVwzC>-;0G!_SX(zK&(4;Un-fYIF(* z(lU#2%y6@FFVEABb>552ZAKA1$Mc!HA$H#R$hE@rSkT#7cmeso2Z0X6Ld{-W5svc) zPM}3mA*{N>PMk&i9K7Ebh{J>cT3p^5_yKbp!PTdn?!pWBeWmaWe*aY1j^k@Lrd_E| ztslo)Lu}axpvqIfZi7kvr}-VSIyK~pwEJk%hNB4|_B{?CI3f zZ3kddOSki~^!dMmS^5HhacFkReZrLL>uIMe4U)fMn1!zT|1#G#^{FBE582|~OS{jf z3isAw>9cTO9ipj86<(}HxfWi+?-RHcMV#-#&1ibq^TT#~CH_{C-;ebh)~MH0h5PH$ zPNDDse(x<5>QnjAh1IAsg;f5_NkGkcQ$x_MAQ^Rb6dpiJ+uoeNwF~ve+0nBDrw#Yk zCsjYZ+7_s9lknmPUjDc=H8qR%hmP@uO#2_YGQ+lK_C20iy1fhCZ)Vv27&yndkc9UY zuojYa9}_i{uSQcxONSmnxkfJN7=Bi(dmff`u)fpUadsO95}A%W670lVhrO0TyMb*& z$EXqA?*YkHzBRx@rEzw7IOTo{$C+nwbos>tTl43)=5N5_!~D9|{M`CXem+)iE+3ld znA>m&f0e!?)sLP+J48S3GYaFSlKPRFvz&hP)UDQ!Xak;#Gzu4b5lS+>D~!6(t0JKs zQKbX=aY9EY2SPzLIcPMR=HT=3lNb@}gpQPdQq(G+X5{s3hQS^Rry^{5X=g>lZWyq{G%CJ{7Kduff+BD~& z8e~$jl6j~$4AjpPq7S9(h;{CUjw+`QUqcQLKi?$N zoyg#zO4RyrpBI$#hS7^G9b_<+A~hnEU958#^dipPZgyTY@!@AMqaR3JJg5rVk9qiP zJv5=S2TIZJTSXWC5V|m%@8lClrtoY$Q+Otx&ELg$2{ScYGc}vC`JdEL#C;iC?q!D* zvP14~b??IhTDH(r-3mpSg$8Tw7+ljj?7r4v&t!+}&kp%hX2{OWkR4fPYu0%<>%Nk8 zUz;#w^@Jf$wz?1FJ%cP%>_r^|xh{-r;%{1qJ={8MM|Q~T*&%KLBLI)$ure|E?l*&%P*P=1$nwzN7MTb-T>&c+E2R)yDK zZFz#TDO1=PpWwWhDeS;yb)hRd!FjS!!0)|5=s_Twq2+X?RaRN)?6p3N4z=_iYL;4hm;r&z#J=a-YI0$#Al|HSmx zg|4~@`EOAHryY1)1J%8KLjET#i?p*Q?fkB1wwwX4^wlBy>_qD0hSSRF<4obD%4~R7 z_pKOGADvpZAA_ zzTSmvY}xnlyYzJyL2MbnSj?>BGX23G?iilQS7ppQY}FYTZ(*QzI2(5MLwCjjEfnl! zXSZ>%{A|6m)i^K+0xk}7Cu;9JTjy+TT-MQsp3NOs*ElZXjvLfCF6xe}ZyYz!9XGhW z5YAvw*8Y0`o4&tp+(bUNWSp*^JQ?kBJR9Erdex#&gQL3|Jx3sLo98>~3eQ3b7ZnJK!7C~jnmew+ zq-<2q>@#!n$9Q=Rmy$L{6)%!O-11PBI9n#9ubSx?2}=Dgy=6i74Cmva)@%JzETrMO?uJ7gqN{ltFP{@cn$wy?169z_f3__y4}{ z|9j!NbMCokd7kGy=XsuU?m71kO85UI!j>DJ-fs!k$f=ydGD)uKQJS)i*@k73>9cjH zxW?S~RN{7Xdb3zOr!l8l(I4jGY5cU1NL!vMrCPg`jyo4pz?=H7hW<}9G}SXzGt@h@ zu&Rt@Eo`#+nrs-HVtJ{_2A>s-mliGLavVbjmpH=Zq>~GM)t)O~^q!ha>WmrXv(P7V zFa!0DOH|H>+4AAK7|5GO6#j0= z3_4iVE;49q_yQ3fz98EOIYn&v;)4-3jFHSZq3Gto6eC; zkG(MM@i68*%$W0t!f>D;)(2x*jondA^Mp_Y7PEBq7&Szu8!?d)jukwIbm6D6YS61W zT=t2PN&U%gW=@seMYotGT$cjacqNpaYOMH)#6%vs)5=)rIVZB`{WSLN7es2f7qX%#=Zq zIXyM-H2X?WjrnF}EZLm$Bc*Ny`;=C97o~(G$Y4|QB(^sQy6uZxl7%e~mnmL}pP)u| z=EUn7idZj*80rqUt;Q1f2wNenMTBir?Q)olyi6T3MFbU+abHYX3THDsFH6MPc0|~A zR}Kc_6nkXOw8JyYg{(kcCS$#u+Ki;D30ZZc>ra=2sB~RIOya^4ZgSP&(fn%vs#luM_DD(~$Py~2j#(oZCc={k6nNih-(_gOn3eE>W12;JV@NVturB`y~ zPMr8L;q+5ar4p*=%z2Y=^2sOD2^WtYYfUJ6{P8~tWfseKgcoyi9wbBu2S*XSv|4Y% z#;H?3Cp>if?ehr->*}r}{Iq@h1VZGOUmhSFo;~|5!V7EHh7me1T=*`*mY;7VoSi>^ zF~M>6?A3(tM~|)|JU?(?KH*$VO)G-w>#q+Je%QKoDq;MGA6_7Yef#Yp!cFhI^A};n z^5v%p`{LqWBfOoFF@})%%P(1k-4`x&B;5P*%ij-aZ#HmwW zgp~E`hZ3gs?md<;?BkD*6AJh5?@c&!^r#HHT?dq%VBl!9F z_!C~u%NtI3;HH}<6W(3D`cXn~`}SQ4cfI!72ZWZ*nn{E^-g@gNLK|P-7KFg7uIfYR zkevKBp?uGtdkGt=s%{|+x%JlRgrx7k-#|E&nD{>7sunFe5N=3Gd5`dLw{8i9-q&B> zgV3i#hwg-unKQp9{P@Tt)r2w2mYpLkA3ppfVfH=uL=t`}DvBY@|KW#?gyBI!PZCP^ z?(I)_^o~1b5!$AvzE1dL#E27wm4$`V2Sb4?k=tEZVeb5aIWNg2xFt z4##bTpdxoZf|+<$)#;jPHX?Sv`4dW|FmEL!vm;n}dTO@zubXLJM~FR$i= zx}>B9gk@1tHH5kS`h^m1e*gX72!lWSY%k%%VZ&+(<39SRj*x6LW)Paa@WQi%`(AqK zYeJWI-~EGN4GA$5j-EK-Lzwu-ALWEOKmVLb_;%N>M8beBT_zIrI$bbf|HX^f6E4)& zwjunrdGidyf(;uY2<`p-+YxSQ+xAYv>cfZcAgmfcemCLH*I)mTup~5eJ)y_7*Y+j6 zoSi+2F!Iw+j}gv4{q#b@6ZhUbkg#Ubq^}6SjT?86(DSA@s%@rw|^z?Y5^0_bgrdC85=lB`JjG9(Z6aA+NeRi17HYziuIP zZP%_J;nT9Rd4xY6eRL1unpUlDAbee1JeyElQE?ApQqP_b5fbjcdkCRj%a)x8FNKE} z6a1SuZ%Hr*2F4P89Xoa(;r*8|EsSYgzO0uJ|Xmd@x{*whF4!*PS~<< z-(7@b^X8=ywjDg!laRJ%&HaR#cilCbuxrMQUkKXt^ydiQZQC}9@XnASn+f5ce_lb@ z5gYp>;j4!pI!mZMe%zO^>CmB@32P@${+4k3i6@>X4E*MsN`lVMuRX!?+i%+lHFM`K zAq=|tW(#3#j~;P^kd7S#38Oyw&n_ZVSglJ5PxbFVfH3Q)pRx(-r%d^Ru+(hcL1^yn z-HdSRM-LARjZoc47Yfv!e&re7*I< zZ{JxSm+{Mmmv8BF->LPzKi+?I)(*qfK6y8-ZvR@dw|uWk-cxn!_lYf1x?SI4<|E67 z-&6EM(B3;zM-*y~=+A#Q=CO6F`VNYCcvFGni*xr!_F5En#w#hR-}|2p`^fmhOYer9 z_~YkYU33>~H*fH7dwBfoq1R@A`t-e%#$6X5yk?aCf)Rb0{Y?v~-r z1IK1<`D((8ukM?7aLrva(zgxyJocgEhbBMqjo)u`Z|>3YlOJ>Kr3sw}|C#ozwf|33 z%-$#4#N0V*NeDp5D)>SFp2@fZ9*+K}fm>xuU zK7UOpAu-GL7~%Ny^X3xXe7OJPgj-k6DkZGiJ@jWn&62OLCFJYBnnIYr@$Mf96Uzs+ zC+xr8u#oWjuwK!G2_uri2;WVbQ$hIs@o!QIbqkhtB%JZP{S|`MJndn^3t<x19PN;pI^WCBl!@uWcrDc>Bfo2+0{aLkTe@`VR?@%o#kL z(DAD4uOaMt`L~vYjAgg&C-l3q;(o$a9j?8B(56M}R)k||d0!K{|NPlXLc30%uOW;& zdfg(zx0uu=RKHpJJK>|G=nI5X+FRZyjEy_-2O)IIJvoFi=br9ONV`91HeuaOxg~_3 zkDQ-I_;ugWiG=NjlC^{Z6Bp?SZC}69NJz~M&=VF73Y<^a{QJG93E!OQ89>Mj`d|j( zhWG9mOepz2xR%iRnc;^Cb29f95N`kBnpnc;)|GD(0$wqnB@C>bbR*%j^Uq}ymet&M zJ>jAG-F6Ue?6uTESR6hikFYbOFq81y+7IgpZ)|PVhw#aX1)B&TKT+0|ug-R^#OA0cY)ORWiyjbHyZ;lZaLm_Rt0-ZqP{bjPoDLXW%VKZ4_G`vJml2jAXF7-Z?Qk#Ok!7F!8HE1oJM z7?ywkE#bENZZZ&ZKYk^caOa0pG6)Gn{9e&O0r2o*~URuFo9y5nlXQJ*&k5ln}7 zogyS{h-yQ)_QjKT5N1afr4#OVtcWD6|0421!oJsh$_eik{{r$Zu{tv0_ct@BLCnycu)t?LJTcHmB&8-P7Am9NEQxep7yts{jAXADKh4*XZ&a z|I45M%Fn;izp$`gKgANKm)DpuS5~<~@zfI*QuI>j` z6Ewh`_tpF+_rwT$=I1rX!Jda75yP=Y$w0nwjglw-xDUgVcZkvy^yFEi;p<`C506Xt zTMfeA4X~AycsE)j@$hUNnO-lqa`q|+Z~+G6Yn1C4g$X2^@p`P;;8CdD4?|d#LqWo^ zTS*^-Fykx892_<`W_pXAvU0q7o{s?c+(av=ey7~9;aBJ7idWOWsidzVqjCHy|7bqO zFVm~>O0?!D1X%tG1)rOg8-+@|l^b4g+@Rpe6K$zvL@!}><0pJIp zNH;jf%bG}h=t|wj(@5NSY*n||*7@oJ9t(vy52Inaz$&x=svRvI3y?u&Q zzNQutK~to-LLb~J&YU8JXbNz@nYXwfqCt#fTX;&Q4!>Cu=~usv_^Nr%{k1G_KTp}r zxrZlgzIBKw2Ljns?w2ePZ8Lb|5W|6OnYxJATTssq7SD@JwGLjCgyXe5xP!am&R#4d zwQCWvnwj%?sv`3B@wPL57g7l-cJc}cIZ9bb1+O;aYCo^Gs3}1zYEyXN*eNaQhGiJM zIbj*k16J@p3lZ5?%fuLQEy&HR#X^rl5613N7>iXP0zFZ9c;;RY{;o!{@RZtMu+*-y zIy_}>FvCuvseB!chjkVLH$lvx8U?oy%{qY)@Vya%OePtmbKcBh z$eCh--kAhdDJ|xag!IX!L^YB`Zl}AYBmPV#+65ItrqCP+pi%3~65<-R31ZkLl4B3^ zpj{em6Sg?o#7}LLXayaIV88$?^S-CLMpe_S#FlR(^Pr?byS^eS2>`#T7+Wcx=-o=$d~h_YsY3l?-a zOPweHfeTdyOF`-9pp=wd;C}6v)OPmq&3PS0}zn`K&v{~X^H{+07n2P z0j{;PQzYxgWSsKq5PcNDEGW;CD_wOI>vlwp2~@9>tjx)V7*Td$W{`W;S7M#EThBzXnrs<6sW4 z_DyVkboI~r>G_7f^as6kD8v6r0Qa@xKZ=rAMloT{IP<|YZd+Qhs3pn2w@Li7#G@Cu$Eso}XL zPmcxjJi*BG6Hz?JMPK1kxTVQjzt&RoW^KIuTeWQA?dy~5+e&KQ(ns6EubG#Bo7Ucv z$Dy&__Q)Id@3Z{o-Z*?|#cyjhkxv=s2Wul1tiQ10{CCM4H2tI2y|DZ3??O-9)^6q# z~mt?m0bcJ^qUx&G8Wn!s7Da$kO8&xSkR_+w<{FOO=1cDFPxshU3MriEXw znfO7LCht$nwKFys%>B$O=ZU|*xLWhr@8dsC*thBIowu6`mv(wy>jlrcxvx))maY6+ zw~_qa!@Q@)tLd0V4f7tx6<)qR&6>CJYtd5j=iSzA+~d@EHO@UPI zT1q}G+Iai5_VV@DHgBbA;nm8gb#uv2+tS;=SsPzX>z2Mg+BU7gPRYMTbMK$4-~D#w ziz%HK%zrA}K`^v^{>;qPDco3^T~i|O@Kn!|rY4g2$mw!(kxitom?-mTfY ze4z28eZJS9SvBsFm3230rXNZv`KizNIi21;{$-Y_t7hQ7kH%fUvhK{P8y;D{*XXNB z>GRX^Ia#Jo?{@w2(Dah=nr%^wIX*ILz}&3_;7K%AM}r%d31y3)16PRu>|~le$34ad%t{S zkfv9=TPF;g9k%hpuF9|8|20iB{=rs0W1^(%!-fQOG7Y*~Gr3vxft0<^ymIu#<8jx{ zxk^*?%v&S8J1)wPcynk}=WS~>;oA?}uDvH?^2g`Cf3Mr4aheamJ5auU)cn4ow=HS= z_RJHSb-973&hF{A#Zh*3>-L5q&43?Yduh^*1wLDktvLC>Ezz2(qc?o=#w(eRe=)LW zfB%cMnu4vjy!O(u2UeW?agtB;fEzWLUtHYq$w>d6{YSs?caU}`05a@>r>gqQ?;ZkI0?benFuW5kFN zVZFNPBd0$;S#OS+F(EN-s=n)pgqWF_l9{9*ITLR+#AkXF<^^dkXHDv*=3){i&rQ(u zm=u!`qvz~e_$Gh&$_8ho0@}3R^9=GB;qhCzv@pH1ehPztKN~}kx#uzPsjbZ z6&G-C|8aiK!LWYMqpA8m(*_`;C+;ju&ELDFkY|3KdF?j882oB)aeFHiNsA-#W{cjG=GO@$oYz$HXa2;x!5$9#c84Sd}uoC{{_UPVvZT)JYuq%6;l(Lj0A@r5Jhvdp(aU zcrQzLwQ)2WqX^3HWr1%#{dV|j7)@f&i&00P`$_s`j?)NYz=RXWz!+zQ!t;jv7oy4I z^$wmYc!{A-h-N!4Ia$GhQi!IUr-M9U^cJEyg&UT8=fvWJ5?D%b3hA`rZ-@-9* zH2_10Vx%udZpR7SIKdlx5vbL&L;0Mb(NCIpJrJOJR}qnJbTV$S9qN224rg&CUoS}#O9 zIChbd!Hi9OftL#zrpqESXP7+$H;RE47%0Wph^(6sAAd>&Gi7X0`&!)I>_a?=HfF9Q z2PTvp;8gK;L6qb;h8xFtqY{CmoO=O@IFWLTz{1Cc1=D2{i*v}Ghk#%S8Z5p>Eha|(My>l1X&>olEbXWDJmFo&X$)P4;v8~9mQrW2j zL*8&7qeNMhK#$y(5D>>900{+)F~k!xKvp?60*F7R)dY1oiOb!*EX4__amwc@i)0^S zXfLR;oFP-o8Fvh)sx>@`#HSD{uEI%3FIokcwaA9?vy!8DFGE{-TF)B?cq(DZ6+D&V z2GBq@rmN!2o#Q+c7xA=#r(EXXFx+v0AyHlqLw1~sh4h|8y5fVpJd9J-31-{E(|VqA zn70lgfmLw<<94zD2jgmac?hRsX2ZA~mq&5eagd=x-q^z%8=P^XP_hmk14$}*Vv847 zGgQTrF`H;18J3NVV%B2Fo#QYtDL%jx=SX-3sYe2K&$A31=gE!}8VM&+(>BJD<;5gP zbVg(Vg6wm}bv%*1#bhN~0A-$&?;;!LIb@L*jReUBS(0NraV!IlrK)`>IClV zn2boW8RRO78mh#l&|55dC!*vUg-WPT3+5|P5aqIlnR0o8MiN&LH=tR|6LHA{utz&i zA%Iy&M;R|1#DU!&Q!wBfJ1ON#mhVI8YtnOCm`^0NUVIs8trm{Ui+<8r`67a1F3Qa?D2g5JjVZeL&D85q(CA*2B%uk(OloyS9V$9qRE=Di z6Q((Vbhr$IP!?zkm=&}s4TI3)o`yllgPUQ10*WsZhC!f0txg?9jaw{)f?5iuBK{e5z{J8I5ROMR3V`iHdB+%{1653Cq)M2)|4$tc*bx|YVC!-`sP2W|Eo?4* zMqa^V5v-Mo`&-8Y6bi?XI*SHTb^;EQ&%y~1BN{pZ!etX~hftVwAE`uz?W75Z4~B}!qs8BdAd3*MRq)d$!W~-;Pa^>;!RUpjAy6f3IhP3CmM{n)88P0 zn2r|~VF!NcHFNkP98e|zhxzOkUK(>EJ98Wp{>OK!|3Q;(JtWMz@IPc5FFXy|R}k*S z24VSySF%L}1@A7fOp2Lxr-)=Hb1;swYds+11Tt(+*;}VaDLWl(3(-C*Ww_kPIN?F; zL#Uy1v_W_|G8!USDJmC1de@3`#O`T5Bx2p1qirnwGMpp!5l`m`zMl1rpoiT^agM-R zx<5!=-#OalbdKOUp}FaQ%bx8?hM;~d!a1ThVL8H61)|n6Ko`pLWR0}wC?4*Ja7E<- z2F0@#M!5M)V$`Tbkrpv(q+3KM6Jp>THSU3BKgJt)lBo=bU86?fTzL3P91>6`!o5I0 zLcR10ITi=++y>HOAknD5Bv4WPCDJ7OOK?P7{u0w1b@@xKA*_eLw3^6J$Xxys2z+2|*+C(>_n_m|}Mg#UBqdhrmyuNg0W0V)=6o(78`Ch-x*Lr!JlGY(&NTl0+Mi` zU0j9}WDz&$^rdN1MwO=g^1uoHS_@EYl@YWLk;M-OF!OKthGl`%0s$eKKFd8K?ln`hoWr=$G z?&Ik6pnbl`iPBIeN`n~XF^Cc&77jbZD3;-!45Ms@*D{O>7_Ma)RWQ7jVOE0heuR_e z<4vZ^1Cv2Hs!s|dwn;NsWzsm}niOf|IWdaokl>v=U^ zCff=W@&b*h+k0P>w!8U1M+_e=Q`_!uk*VZj z8reR`jQJSv%lQY4!3%9zCuQdnbyo6aoXUHB6ngKx{Q44Hvf5}Jm0zHlU2E}VdbSsWzui#tV<0!gu)aLZGM!ym;$jzBntI z?~$Bl#yh~E!6pUHHQREivy6CsS0jpvT|(1PJE5j9EOo+*%oe_iUW8YPHq=tP>~G17 zHn5f{DFoPC@Fm9d8&2T$eY}`YzFD5EK$!FT@Az$R8-W;_@P$D54AFWplkR8eaRoFN>x7sUEvhUTytblLCn`M zcBiZ>7(B$_I3bQ(7@QHz*y9Y2Br_Zv7)%s>`v8NH_%QellYuWUoT?Q}se95YEqV$z zrm_~eEB%d%773wZ!AGoF69O;m*$t!+7|V>6(F=ph<&`Y-#A#IlvoaWha*$`0g%yXc&z| ztZ?Jl%_RrkZ^(G`bIAcp7)D2z91+kT2&1PL}Bad#Fq zXaH4&QZn#f*YE|oL|;mshQ$KzY=YGNOTq;00xhxyiw)e%=bR1M2o^NJP!TI+)Jv&@ znDHM77;-}qeT8nqwz*PKLvEv#+D6HJr9y|?QBrC&eLK{BrQ(O&(NgM%id5ATM8Pr` z6bM8;@uTF;s`$4hPnJ38R4ddGB)*bLr@lTU7RAITnxTDacOX8y%l{30c%xMp3hSeMif#gkIJ$ zBN%m{ucHoQ}uIKJz{3&!G%0MENp-b5-B@D)U^YKD| zpFn)mzJ>^Cmkg*`($bthT$@s*O%y73ehtfG=f?|nVGiL~&UY0p9BE*eh*bZM`y7f< zeq;Xge`4Rq;Ek%#;BJF_yzU=%{?ux&c9UMs;3wF_gK`_U`>nB7PN;NMX)hd%E?CvV zHNJ6E_5YsAzCuO)Pt>yzzxwt3KVknL-`j*1h;_67V`cl#J_S23?Eg6QS%+f(BcT)E z7c{W{9@8hHGg-ky#YyD4J0UFf*xJCls-pB?`wuoZ;0}EcxSIbL+W(_X+5dkmdBP4x zLvLGUQM)qxAM>x^LmU#LfJ3yv;R@`3lm5rw@`H6oUa|e3)s(-{Xnm|>+!fjXfWIxD zWzP7=_W!&8o%UbxZ=Jd;ke;O&t;z;XvS5^^bWV0j*iU#GC;rYKfKwp^2458T8G|qB z=a#Z-;k9HC=G5F>3#=BAU5g8ix)$;b_6(%@H(U#M2dut7<}J1IZSK{kWs7Fo)_6g* zM#83-Wl${!PcK<+{eScHzPfcULJ?X)+LGifS8|qe3&0EmDaRr;p5%f z&llUDnrmD6dP}Td+qy+F*6+U8M{3jBANT#6d$n$7VFv449tK zJwA5&#L1JI*b@^rV|wiL82#YY%j2z+X@rt0@h+ti*K zHNQzMQ2F)D&uh>A!=!%PCyL_@B?I}^65z?druNh>1Ck{0oDM$N-Yk&%e!-WDS^BZ$L| znT@@d(A}5`j5U(aws$`5>oTi(? zH#V0)Kz%<*tim70b6c4j-;s(2hi7~Tg>Rnmvzv%N-$Z-|3Z7EFJ3h}e5ntFu`~gL- zh!3{~s`%G75sw`_GpDZT=2JV&DH%F}2v0jDoxc__dR_?pkTz6XlZXXI zz*Qu{sg$=$cM!K^k}2u_w)`??E^{xxjD?iBm9Hd0Y&mb0U!wd`6-|?XtR=e}(!prt zA~9G3=SEBk)~l-&F;oGvJn3n)J{P`a?)52jp{O#q`rH%amO>#zP1HBa?oJ|vpngLk zr$D@JiOLJKka-o(VQae^dB)5LV`nk2@<+L75vq4YJ|B zJ5zYsI6mkVTu51g6eWeK6!U^Fo!~0U8eX7L9j7Io52aaGbwm9zfyk<4QQ64Lqdc9t z6hoOnl#jB>+MgKV>=#OlxQaqZ=_?Eo${g<1yWw3jag`^D7th_+qfQutgbC>JXTC=h{F!%ncSEUJDqn!)dA>CktK&W0_;bDJhC8 z{02tzJQOQ;{-S*{FF3>>tm#$O9KyCn*zk%a%eA4l0x9587BpTb1x#UKQ}t57OcrPf zmI7w8&^bma;OQs?lA=PTfCoh31EUcff*O8i(eEDtECc|`hkOmQ7<6bYjYMXos&9+Xvuxn7-jgslKg>Wcvct_JH&C?A#!;rr2y zsyS|GZe?@oK724qTaTJAVqb)6Hu+wwP-#>aD~4z`XTA7>@oZhnKAQ=%+my}M1p4sD}1Z+ zRpbxp6@R8l209UOrA0__JcwN7oQsfQS)NU4DK$WzbvrALOdq3X&CI{^;u^%aLX<8M zyC6bJ=~`Zj(H`;-OQTI3gd%j3u5;RptgA7mu9bA|OjYZUMsW{PG5VV{YICJOCf4{2 zV5IVV-kh?p#+*LwG+UB(SsRvS^hf%F(6rI`O==ft;-W;c?+ZI;u(?l4!U`{OhMq$> z8lQI+0c&`=Q5&8f<%RbEt_?Np2sL1{*xfho@J75hQjFz#;=6C$<1MX;ux*Y^kMcnz z7H%M^NrHgheWTqwjCqoiu}GtQ zl9>q>?9ph9K1}o!1rJDzMR*o`%ov=+($^w*KIW7|%}w}zv&N`N=xk26C4;Gm^QwFw ziqC`pqR$447G5X1Dtl>5mpqzMGMW!S&kHCJ(h_RR07;_ZrI4ecf&M1&g_pY#En+(I zsuIy&O2VTex*KA^D2$0vT0}sFa74iq*Gb3oC_T^PgL$56=X$tE}nu&U5N3#W_l#Dul zDLSjUlzJYmVoD!SFep7DV8y8&nRcJb?)1vA2;8GRz;8cPX9>k3EznpPW}~}}MVMAz zLPFqoo0c)W8}hJ}fl7*lKLkcJ1P5j%XOPEj;1a$9`4}&lw*wjZqDL^8Cp)uuM0V`r zQaLNK3)i{?Ub`tn$u19+oY^sORBG>r?4orWtsQFW(zW+PcG3PdERn;ukP=tz6@OQI z1hO|{&PHpm`McW3B0DXGB31Qk*Zy7QvB>S)WaYYgl`~ld*atzeT+0i=`=?S)w`!_- zlU`bwkKW1qGWQvh8P8Co6bJK;+|&%ot;|rP>@_Al&U=?#dejw_9$nR%67IBbBz?T- zZUqcZ75!}ogTkS3R4_P4^f)_%Nl|DI%){Vx`ts3)vL70)4B23FLrS^Hb`8rLRU@vs z9nMjJlcggcR)>`C6KC!}!+Lk(XTeGU5yv&zA*I}516>=;pQnUI2r12k`VGZqC0#g| zc88R%rQZizvqgAi2$TrV6oLK1l|!IfxY7umlASBdY2ix?H(K?eQx0LH)p5AF&>h%l zl>w!V(NZ!;OwjSzM#bkSQtD=i1++I2qOzb5j;^Y6F^TG2hiO^H?B?7R48M>%PS}+k z#npI5p$TxQXbk%`4q2I^HSi37vtXH6K3R;HfRZ}LJ_ImQKnNQYli+zHbPOR5bdzRt z=!m^st$-pch=QMRj-*Pdr-3i4i-sGYEvT;CPstXCQ$7UxB=sUJvzUle#T_0%A_brG z+Hf;a)U~XE1ec2VN|vt2$r6lO;Tm6qANU3`vP4@(mT1omu7cEe4!ykkSv3}~t5u5{ zS-(;ZNcM{BD3DQWOlU2T!R0Ea`0Sxa0@MSwE0T-nptX-fxDg|+o zzGzK^^bBogTrfk$3>g{P$50eQM;H?Af07|9<1TV5(m1})*DU;@l*3ll8G@@7U`k7- zqZKOqTZo~5XV&3s>28B`MBy9uM#ZfwlqXU`;eW!R#aqKU(IU*L=q$}%=>%3n6wl&h zT{|8m@x4Hnqd3)ZMYe@|h~f@(MsO>)A7GoX=z&01y#L6RkUNYTB;0{4o(Z}Cs6oPt zMiO#&QiFtim62Q`cPz#2c44-LnAPz187T-W`(ey688Q)*1HW3qHQ~3ze+PdC>)^jf zq&Iv0222Ubd#E@CKt5z30NE6MNT@l4(CE;!xFL5gv_AwKmr!@?O}yNVOQ<~5%?(;G z`_a4w387EL0TR6!M)6Gw*kq1)at>RX;d{WL!Sxv;7R*RtCJGqhu3p(kg^$GuzVnCv zDKjYc0kL#74Chi$)Oqr%Nfy zLF`c!%~w=_G+Yrs3NEn16^j<{7@^GKnhoYwpgXfz97;ODWZYI~;mf|{QUqEUk;PSr zLdYn=IP9%QVkcIP(`aHh*NwuXBLb(8tn|S^4GB{_2V%rPC#003gHDXW4qLI5q~S-5 zMM6s9C$oez^n|5=hn7JFuYeZJfDtT!{i}dIs1cniWg{jMMW+f4D!>#J{9+8QA#RQW z*gov5sOEqLmw2>z7M{@iv=_LnkW%+4K|AgkrG-~332UU(M-W6Wa+`<)39w{pw}T-= zk3&C-Vm$3Wx*kqK4cklbL3XNj5MbF(ZB7*qgF#zD!|^CQx=|;EEfHn}C)m97*-@1P zh{94%d0_~RM4KBM$HJR-AICBoYl6pc4M+Qx7f2Qkr#(b@G;%1DLvGAmj4HOz#kM6i z=T^pW{0lRO67-e7ixNEZiz&DCBw-kt1F+9t<5tc#HC8E$Rtx0?SIw;7zZHB~9&&(2 zymUN0$*AVW?-Bc4E~_TbNm>y@;#D<*je^~Rk1igf9%B_eaGK-rl-*Lo=m^_d>1SW* z=OHyHT)X6fnk8+J2oK;6X%i1b1Z{+@z!FKihiYUbv>Xh>Yj87P4H*qltWl=2V4nWx ztT1I?HNZ>%HT!GGFrUhD+lF8c%K96Vti^H-^p^j3O|tb8CfVm2nB=P(uHmC*AXA#M z&t>)Pb6I`+T-LOGE^ER*<4Gyx!DXMz>f2{LI>T)@`&{N}pUbH5%Y?h)W}lTutN+A4 zU*h4LyM4aILp{#KHfo>zh|4~MANB0B ziycn;3|@eTiW`Z->)B_4lAC=ND7nn3iW6KMH~U;x&pr$Moc396G1d7*b@lDDiXU#s zXesu&tiFAg(Q?{n6)W-X8)Q{D1zV@uXXS}|J^NhVz&@AD_PM;ieJ+>nbGdAv%l{4g ztXO3l>FfAZj8<7T(rZ=AETu}SRhEsk5tmZxv;WjS+x1vfPkpZ%8(5G=%ra$x1{#m9 z!lWtuc7<%9ab+!QOZy_F))6sUc${Qe5WTLvaujcP*xx4YdBaCV#E#|Cp7XZ^R!djO zk+1rEp)q^zSL|WWnYGm2sQ*l!3j640e}Pwhd%o1I9AVE{P8o2*7}WW&Rv7i^C@d9a z0x#LWxTHM~DQRfWQ8ImAF&iMJ1!U*Q!>DVQ%KUyFHNmEiblFi)E{34CEKr)h?g1bfpd$n1c%OiJLDtZIDz$RBUx9&}`UTnIIks z88t*M@e$!)W4O^CGhllfX-K}JNx_T{g~~Bdl@Y+Bm?Su9>QfuyQh6)zaLS|VFX`0z z3fK;XDN)ihrI<%Yb)tG@9?`N3S7I8`vKJxwvE*Td#3Z8S1VUmC(NY(h)*2*|0;}}Q zA@~la1-tn)1&oR^Ex?QVjnGal(aaqw3rX5Pv&P14JF|I}Vzqz@^}57(X( zHWA?hCgL!;o@K$Mm?w9wtuYlWWg@WplJ&^tqworm{IW~0xuVirTv_3|D=Iu(FVC1? zK5K&Icfwo|e~ec~LR7+}D=I$v%8IwD@91$gF$AlC(j{cW_$wLxhC91Dh!_r+L&{GwVj|y}VR>9H zVmL=0Ql80}c=3{*CylT`A?4zQe+7IBJ2(nGL998!#g$BxpAi$r=!jNj<%+a;0_F}( zQdg{N3||T@XO*7kctGv1=#bDCU&EXu%@$lm&zTe|bLP(~-X?AVOZC^2#O zA5{l-Ixe&w@t#@y!*0`Rdfs4sOw1Wk1L8WUC^ni=x!A8&JW z0UBi+IH|A6}2|wp1Ph&hG7l{Cn-bg)S8Nbvy+{bP-gF z_hi6_{GPPpaWT>#wtwoDUcBbCF`<$yd^;$5?`(b59H)In{uB18n_czE^D}54_lG+T z`+#J@`!o3p9ZU%Yxyct1WHr1A5FDZ;%HkLXe*+H+q{Q}cxo~@Pm4V*1TYf2sv(}Ey z=DbYdfY?sK2QjDj4x~?l}Tf&q|5_8i!u_2nbV)@3Gc{D(n(T) zuM{BmKhS%Te#71_)Q+W0`$BKxCxXhXg{C^lkLT7u!Fro4fe6;ASeZBY}P14M&%2PZ~6^h z8A`U?d{$IuVHftQLQIGTA3g{v&BoO7aV=j>ibR-Yk3Z`J_B9MpgtL&>Sc7y0a10aw zV5vWfQtOp+t;W;qkX;_OtycIpkR5h8JO@@m}2<{_`O85i{<8} z_?7uCcTL zp+#%3B|fxS^=yBk%u>Mv;G_dP=qIyfo$~n!?*w>B0mFd|_@TA8QV4^%it)e9B{5%5 zA@&mAlND)w>^o4tkWnA|5hb|R&z_~m`q{Uuu{!%#YOKzlsmAK<{CbxtL2v(3jWybn z5fmKNk)vXn#8NP&dsl&*eh{a|A8aysm zw3FNOfdJ7`Qf>t{WM$*$Iq{Q!Q5uD>JL7qTa=+^#CPBr!lw^>Kb3O=ziu{qNiv2WG zm6!%zMf(x}4P z)#{faF8^2Tb8p$g&$oFqA8&lbtT|d&1q7*h>m7@gE6;c}TK>YO`lU_zd!77drwYvH z4jpjq4(i7j!)GQ;j^(!V?nA=6>F*ytI_klp15J@5^b_Xk`^8wTaTcS+I(cS%d~6R( z+|>S;_3g#RxblC?9(0Y{{zdZI$dlVa9>N4PINIMQN12s7?7ieatr3s*@{i^g{4yRY zv)*C!s8_w|SywmQV443kKeuYLe$S(+`aRQfOSEU*EKALA@+jCdKd+(Q8XRlxmZO#_ zH%TKMD^LE>{b;QIY4^(csfXPUk4yJk4Z{EC9`t0T^wG*M`Nlov6&~?jlz5|ps8zYo zc4GP!9`Pn6Ua#=!Stb22HN8iCj1q5Dn6^_%KTC<%D*~p*FHqt&m`~!-LaF~ngo%%i zN(+Y?|ADx|_Zx{Yjz^Vz3^%qXekJ0$2VFgsX4B*;@kZr_8oy16SHIslPAUJO5}(Ws z)Hrs?KN|J>kkMk!OrwcWs=5KcV(&XQdgFMMf`lUk@su;qV~~<<8j}4t=z{Je;FUwmVYH8-s2;a_0ZPT%cNXQo;X1zONp5{aYmos zYMgV6KX<8*mv1SxdfaO4#Q;O2!iJ0(5ix#xOs}33W31z&lq%d`4Im@s{%Qa@#{D~& zatw)6>*lvIU9k#Z#xs`3Ddl^z>~?r`>pc1g$wANfcN97BjK8B7HsQM+&b|44o7kIg z=o2jO*1!DkYep+L5i_GePu`oatkaK3yMdA6(rxTY36UbC8M*?6W5p8|4Q5vx_*Dvg%qUc< zbJ+5{yK#MfY>r`FW=1pZ3Dgo_;?t$vAU?*Ftf$h9up76fleRE(Ewfc+8}e)$y~kqX1CTF}kw>-@{CJ#Wwc!w}>5!S( zOna^iKOW@BF&xsa%giUL)(zE$YF2GWqPiWna&NBm1c@6Bg_*0HX=@N2U+U9klR-Q* z*r45!xz3j)R0tASfy1!fmg^lG*p5YS5S#(yI|gbmbSY!WyAA7P#voj2*vJCU3kvgX z4)CZwBI34n7EIC}BLy`o1(uR7dDz%N4s=p^RJFlSZYu(3u%{yqUqVHl>%k9{JyAy< zo$11_fH>9}a%A>^#G-10;5486*X_1#0;jM}2pgZ+2&8qp;Sjk~3*Hy|biox%D3V!( ziLV_7hph~J5nD612)-ZzRx0YWr@QdOQI#WL;5Lt?k5LqEUcv2E~8->Uyh+vITqQ-=FjE#22T4g*il*MEv`Ys5m zDpAC(AFGi?ycqotXpPaaQ_4~&zLaV`RISP$nz6#L5dw#qJ#eE+?vwZeiS`(}KVB)z z{(rv|(5_p3CD0`gw1Y@WVO_D7UCFT@y;TuHvC{ppU@c@GZ{?)?iSBvaOJ=QTT0^do zIzJMTA*e$+Rr_V$;v-YV)!JIhopv3>%%9@MzIWPCgifku)s9LCkB*Eg5G+AAl4472 zc_0`=xH6>-ES)g z>Ztsbw#LAjZOa(FtZC|w$dnuhCD`Mpc5}#jE~x;Q4`?rdE+J|<5TeZi{_HR(y$oeG zv0i#>C(8dZLpk*mWgE~4I-ycxD{Kx*5^!A0Hel7IYzQbCJ9-A<*F&b-DeXYScWcj>{&8mq zUmy$J0!15wm4Wy0;LDhBa32ZUP4hILQ1yA?OU zfQwGrkEWbt7D27hP8*;n<-S?r-7%0_QzlX|%V>bT@DX8Lpl^k7rno_+K-#K=OXJul zT3i@xS*|Vn*yuzYo|e+~K=-(p5C9=FkN|37rSGz}L0Q#45YE=7B7*!>QK6z$Mf>_I z?aQX6_7M)8(mT<7vPq~!YwFmVpb+)P9%gG&Gm})|w(W(ck?Kld8=!cOh?Z^V*0RoS zXgR{>6%Lfr#-IQ?nhh<>O=w_ywlwiRLODlEQ&CCQl4^8uw4!L)j{m&lDUv`TP+DKK zyHNBG2I|@Fly@n%l+8|EFSN4gSi#PY1sBV`V^IVT8)!}I_Cx6LO)w!Afr?nbK9x~4 zWT}%qIW|6(KgERR2|A#wY+b8rWm!>-DdhyrLSE~BSW<&(NxRXe)>8#VvJE;1F~Bl4 zwL=N36MH~5r@}7Ko(lCQ+tX@@J>t(p?0c&Q73$!iYEhw9z!5=E2vCJRph*=1Cj`LN z%Ve91raLc0pr5BX_4Wy*&K3CZ@ z7bE)~lTyXQ50H8pqcD!W&;~l8fjJ@*{ZdxI(2Dy-cWg()3Gs!K;dEiZiL?6!`t4nP zk0w(nR$(kfSL^6$BGIe#vUh@^pOcfSX=GnRy>e#?BqvcX+$6c*&^=+rM+9136|O2q zP#^EFW8~$rkQs+hnp0^EYfa z*{18d)KyCO>X_Ps9(9Ozb2Zt2(prr*l%P$tk*jt7lZJ7%iK{vOjfS|gHi*FY(;jwj z1M;8Ez$Rfkpjp6wa-XXl&FKk&(<0LPN2Ja6i%6TPi%6T&-kdg5Z%%u(t2up2FsEF^ zN?*5UfsM_-`iW*?XpIin8~_Xv&bYZcldRthz(lnbYfz<(xsM#|b?UXLO8g z(_Bot@H}T()wSxwIq_)G?OEYh#a_g}TVS>+z~RU?UFX=JJ>a^M10wedLs9nLSyF|c zn0m5I1~e3jvgjw~i#vNK2H#tv!uk!Csb zk|H?q!cq?kY%;p!=B(tb3aq#E)e&DqS1kjZ&7@^FiWM_suY7`!@fy7)2 zs42q4fp&+=0a*%kh9VGF=bw{bcT%24k-2~}s%jL%APZ!JN(~Bk6NhfB?WoKRcR|q8 zWm9D!d+%uJoS!^n0zx**#DkDBA2xqZrsEt%0EB?q&bIIEVrX!7rpa+yp`SE~2@}w? zy|YUUK*&Y^oXon5@?43`0c5N?tq=lPAO}=JP$HQj>`Mjs=LQ6J z^X#r&@}LwP8BV5_gZhF_at{=dUWM^F zd7wR%a}<3YE=YU2AXEt2qb~F+40-G>R0*@H)}R}7qyr*%dqXt^M7u6~;w&k{FQ*a% zPccDaD;Hh9(y@hZ2(Zb|X4ldyWMocv6o7(27X@(VZMm|(i`y)-QOD7_Ohis429zM8 zD?Jqw!BM%4IuvqM0Z{KoH$|X+#)k7YCDob4u_S#f{`wJ$}lP0k182N!#=Y+b22%a1CQlt5UNTD0p>o0%2o))C|K@( zE-Y*6PkadSFuaw!qCEAH?NqtS{D(@Xz~?S1Uk+?RfYQXWYE=ifK5nX&<6ODDbEsJB zH#(Zy&xM$-%SKtT$^@cK<@T&U-yyeO!=}S%O!y2gjSI_7BT53Hf!DGPf$BDLp$}=7RY1eW!dHvRQ)8We8 z2YCaXzJ-$?AT?iUdeNDJ-8vIGR{hQdrR*qh$_2ZOs?+I-$s!_jdVM)TKgYC((C99v zDUK`!MCt#kT!={zkIs*2k8GE+$J~cY9$ZF}dS5n@(EGBHq~2GiJV+%lcIthn+LrZx zL}19@SV`*rvC#VstR$v9z{Yhh?JTiSSsm4!Cel)|A`fMnN!A72&9RFm^(`33PKeDrCY4T;Yi(GYCG?udN1>!z|5Lq#n zR`jmoqkxL`L_&3F70<+F7(s=Y{t#3+nF}h=<+8J;YYJt1m~EPc8r}R57(_}A{L*=N zABqkv7NcxMK`JH?IEe`mrRONt4>)ym;naxX15TI)${>l8woAVYv;tn5F?VRZjC4Y2y!5xY+C#-b`Z!9|Fy53e; z-^+Ero@;%vx^_r-_xlIjfBOit$)Jxo8G%?_4a#4o!Qr2CHn$L3P;0)fYS1FuN3P<$2|8Y5`=}{{Nw{NEbC9$3>v;Dud=zdt7v4BZP)LC& zL|icwFEx%Z>F)KJ*a{S~W-AJ*5QRt~`6bLAC!Rp9VY*YuUnBA}Lzc*}0gnSpk#;{e zEs1=hR9AsT$fFZ^q>#0I;BWwmt5J*InR<<@v~@@wtft1&Ax9Nb*P2q!wTin1d5j_t z(nN_g30EO5T8*=cIGjrHZZW*llGM5I*a~LO5i13-P@q4bZ=jeJA`1{ZjH-^4V&u#a z1v0ygn3jCmfYb$QYOGjNX;zr!s!XJ2*)?ivH=(sIEF#fP7P%4a#v-{kk(yLHS>#5w zi$!illV~T4oJ7}Skz3Jht6-I(PPG3qi`?+QJD_!Qg4rd>BJq?Ab*)hAawpowA{jGp zvWP?%sHxqEc4LuTn@GLYDVQp&TtX=lY(Rn&&VGl!D&7F*R)VYZHOQ%omy=ijh(CN; zHXiD(COd+$8_p;#8i*H7BF?GGIC%~om_!};bhxf|H8fw3_<1uDVkY1>Ax{3CriT7c z`tDs(SK#V)7~R4QHnrzK-(5}^tfc1>Wh^Uhux7rgJqPXG)`KcVh@Z>db8xx&x#X32 zc^*yW_e_hmrj4%oSM!@Z3iiy;Yk2Vuj%CVs+|=&|aw#{LZC~!5gU`4b1IJwX$9eXw z-+7~vz`wcYAOlNwd0eBck*C~n&3*9`TmgHf9C4|f8e7Xh z0{7h4^53JRor2%S*3_%3zVSJ@_-Qc)F8pR-^4x^R?!?TV+gNmbeEj5In!)2Aei;9a zB+xWm3GS`nMHy%bzy^GAFw8@Zm#;LMJMP4yYq#TX*JAe!HuMqcFMlnzPLVyP$%=XJukRdIFSl_h`LyyWeKqi<(=UT02!d*3qy zS2=Ru&6L)E;2-FDZRu9o{fpFuK_#EB7`to9nc1G#!-w^MV@9swvo*JRugFUp{g>x; zZL5mhfiHf#ZP>)M&8G$hwe!4Q)bf{GL%MY6aehX($hNIRMtEL77~gX8?=2sj-6KD1 z!J=+)FL_>nVE^mG!BejP%$hbh>!V?@d7jtT*^SrKJ_(FnZ;>UB_&0Uk~=au)I z=k?i(tCm*9MlC<}(V11p=FZCXy!IT+cwP%py~IiBTF#$KBo(*njg5NV+2xS_Cew5w@{`bLHpf z=Jb`xKr(Y|uY9a-VM_BgrH#kFg`wEDFv>qHZJ;hJZD_l& zv{CKD(#Chp*3PpeoY3$m_Jocy<8d_uDmw)2&BvXFHI7jTrI+jV?gqvL=HjA*8be-Vc6k!vq zX#w}V&Mt1WTk;o`&scRdLhx=j*e%q+qI>Xv?_$CvWutkz3?3?qP*=AH5&oAM8w!Fr9$g%L`VT5^Sx8|>1~*v!mSgf z5)B)PR?8ZRgabnBvy^YmO~A8bC2!r7!bXB+txa3Ri`yJx*Pf^11aXsHyF)7fBr8tb zCRjE}<*!CbSM(AAJA~F7SNF8+Wi_!3NvK2{rd0HHai>JYYJjF`?7SxSqbBT@9d>Pn zjVfRR5`p&>hLZk9^K%SORcLZu0oZBjv-h1Pq01+74=4KrThHW4VB8zYs?Lgb>R z%fP1Hve~XJw_A4Fw7HbOU0WlF`F1UJkuGN1bg-W_xt*GPrtt!t+3ppTO)gkA`kLI1 zCO>icX8}#l8O=pvRCJ_W+2jnT>KD7^XClO=Js>wZ)%O}3>KjdNvuqZ$Tcw%@UD}h# zd81t{5wtsa8&F52Dn}cvw)0BZ%bQ$4%_%CP5Gh!@qsF5|)Bx4RULw~fHM>o_UvBnu z=y^MA+6ok2)W~jGD`?mAA~%QFwCAWuySQDD8o?%>pd#(!Uc1!o1dG4f1ynEk9j^^s zl(3zO#9UppfX!8mh}D2hGYQyb#VUjPKhSL2O0<)9H#Lg(lwI5;Xwg-PWxQ;&^B%Sr zFo;^IUD3I!5sM~o!Ta`JR3*!r8XReD+HwI^FEzMLTLZZlSc7L^`5SV5z%S%a8*8pA zsrmJeZJERjY-($S33#m$zMqkn_rpR7$#8A?YAkE$Qd|lD_4} zN;(>L69(X&B4~3!_=Yt77Redd?My>k@iJounuvzl&e;L3l06C!Hfp{?;2K z`KXr?U+bij_@i7}mr#iR{>#%+Z-Dpr{BBU{(`*n-~@h%T(dr)5L^2{;q|Zs+Md5G#^<5(&)4%h!H^JA0^@nPa67Y zJYWi+x&U;&Gz3uY(C`7;opKM<>?)K%y!^sgj@lGdf_!NE4BY$0P-or%dEt8E`qZUVFF|{I9omp;{RZ`RPCBVL>hcQh zb|bqy=`NMtxgA~R%hbP0F&h!U;DEhPqE>wf|5JJO*P<$1K;;T3mU&W#LDh|b0aVWlu zLx;C;bsKF?5yUV-L>dukM5GasMnoDBX~f|zj4vFhzH)^YfK#cc8PGvF>-*o1?IJV*05vbq0a)?@JHx*H*G<_LMhWQSA3C4DaO?W` z$F8_-p@bxlhuDvJI)d=RkGT^Z5Fwijg2WKsM$!-4d_!c&_uvj-OfhbPN1}nSr(R!Ael(ON8-*Vb}h{T01+&##teXD zHqbUk!jNqTN{QeOLc>UOlAbm;Sy!pU zs$sP+nKqO!>n%XR=uTKtcai1}fDAS^V&*`ybbQ@KGIv+dVl^g>`?@f%G<4xj{Vhu;}g z@G;GMigL2S-%}(b%imM#98}KTm_dch4q0MS&CBK(tCHUxSunftXN@dA!woYJI|4_R z^Z(tEMPVQ*4LwGe)PZR}lFd-FUQ>HklJy$p@Zy`NV7*4N0BNEUa}~cczTmSv=p==| z>s;F)bN&VmGK$I}>yeK%Fd==tC-_K%nUNbk($r~eV#1;{aJaef-y3d%7^g%Nt0HO4 zp$Qb~3>f~dVa&Pa`HhRX#$GYM!MdAd`CyKdiYJ?gpt8ABm#IU^WGjbK$_5TMZWMNn z!ldz;GjbV{B@<}H1Q;+dc4Tejvs-*43+3UT>mVA)R8g2I3Jax9<3urhC~Okd(gZ8T zw>BY{A}>x*92p-3mF*5beh*rqSe~GCvbjM?QB}WhX;32n2Owe7%m+bHO0cO9N+!>J zP)hWe1B{h5Say&mKPZK7_Jh*+r#~nPWk}{i9j1c9N>IqH&p7ajD=We`2O^hoLSYLi z%z(Nq0EIXz6o25l0V{*6dbtRB<$$6{!xI!;H^|xnr9#hzPN#HN6)j36tMDMwQOA^s zTn5bmvO*+H{RgB&sgC)?h+N2x7ZIP9{gXsQp&pdFlkp>&<#MI{Q8@`VRU(%}6NRj# z8z3wSo=D|M6DD#wKAZZFOH7@b>`xGzAo__hbnUY9U!Onu8)hu7bN*ZXVJE7 z1O0mhn_|-BH|Q&<^}?drb$8MICP zX8QLyyMbk-3H!$rG+PPs6gJbQSu@Fj2HmBaprIRG;6Wb$yoxRAXN-~K*;ZI=q~3r% z=;^r;#>f%5wB7YLK;Usc&AN;-$zz!uq+RJiVf$eNP|5;OatUQML#f2&FB@^s*Z68m z;m1LWv=aQg-?*2Yx?M(+)&Y5xQ68`w5;kq8EU?Rad}Lr2pwz@rD6c&%uM(D5u}r## zvRFk~U^XOSBeuJbj}Od(FpC-H9)@|4@2DMNm57NPpTaO`+xm!94ohb+{42p$-Vw_d zQ+bNL>Ro8By1#0v5=}%(9+7g8NI9acWvSkYl)a3UVn#}(vYuH(SSb&D?j~$HN_n8h zM)<1TpNFba{q@fBNToaiYSmZk{wxCPQc>@eMJ8?HpmE?WnagCl{#Y$%=E~Xpv5L+tle76_bxm7+|3F>Ka*%0~vr$ydbvJ{*n*{V$ z#V-2{w#(k%ILf}xdXQBnN2+4&z zT8mmKI!8d@`}Gnx4k8e|y@6O>nDRd6#5A-}iC&EtFcLc|hJfpNz1U z@*$w=scY|if22|Fou|F@^o+;f)%VV0qioRK^E_@wT6*C2cpgC;>mSBTow0RnpJ#OO zKE(IR^F8z(6FMn&%9~7luY6}XCzt$_OaCqL@%MGI zq`mT4=R>A6moCRV>jfOU-#>;NSB4o|Wl}PSSf=nwo^>=HcXQ@Cu-TX0irEHtg3Z8L zq7>};jkav@BnjzYcfL4JyE{V3W((ceN+E+~rB$MbT+xJbHLF zqRoij=t+jBuG=Ygx}L{A8I9N&#BTE>C%8PrV<>t~JdaMZBDw>j_tLdoyHK&l$i7Q3 zYFFVHTJMi2u-DUj2K^o)Bb?nyca%bjI2X8sEN0vdRJD%+jVVmTe)Hz~HNJYVma_TzdC|Z9NV5rP;Co%lXBX1IiLW}J?MQ=T zby7a%NYjB{0`n5~jGC(T^U{)v*s0R{V14lXI z-sQb?Vd_{ny)$3nTT!2LP@e?wF&-`5K|RA(RI<4VCxssd-tZ)Gfva{F6u41X7qlM-plAcoK6E*;YOu| zl5$|8@8NYL?1BC*V6{}i-+hyzcTi{_LZe%fzxS##1Shs)!3x+I^H*HLMRQoKkHlR7 z(YSeY8G01K-@`!R^2{i7dD3^eJmbn-p44)OXI!za!u1CVhTSz!9GuAmQ6&2`Ax(TvNkD(m&QX+bDD=RV+IU-JU{+=-*L= zJR4Q@Q zhs!U^$0xs~YWXcy%ddQ=uu^`JbAbG^tLZN*`k&xA}0woEC+vZ$!fT{vXEO93-9Ev9FW2f;mqN}OX%xX$Pn6QsV z|Ac)NB+s^H)%4?PUM-v(A?hvNs9jxM7rO< z2I&qi-+}sh?$KP*LRp70nTpP@nT|cKbO|h!G#gHejzCKjBr;uGl;WPV!hi$xEQQ-IO?OF;6*s8Q0vd*i8-*yPBB(9|Zl6WRm_z zhELM?z*M*^b~`0YVRpc9*a1i;*#StFM&kri<*wKgN;a6;18rF<$sRze=`>u#L*XBC z#r{I6Qkh+l2D<>6Np=B}&7o1F3z8jm#U7(%<2=c!uq#qnvcVDu&!+VmhhzyzcG?yD z8zoEkEOMg)VPednl*=>m!V@oAj2EQuj`SB@v6m?Q3^F^$;izbS4eSp5W5d#FL0bi* z;4?F!(@RtOcPIU8PtJ+9P$4En1aJJ2B6$YT`hNS?n=GOL1oXfyeglUwz<_y%o;v7SR}JRq~o*}IN-_&O=u79E-Y?3@8O7d3uwAz2;{&rob`M)ov- zI9c{(lzlm}Z;I?UQuft6`x;m52FgB{vVV+a@1X1psCEjHvRzFn`(crs@EFQIg;W2K zL_G>}7&!~gP{uYj3tN3GjAUh`_*mGLl-<7>l`#f&BC*hc${5U9cvxbAm|9;gALnC2pOiiE4qrPY zQ14IS_ULnsC{et%LWyW?q zV}oV6CKVwVYW=IWjB3u2aM1v&iguH}WbWPD^ru zmjTyhBP}INWHN!h8cj-=-D)+5nwjnF(}Ie+l(f?@y_ zW*I}H{k|ov{#;Y*M@%nh9CHt8pyY6p4lJ@VPKru6Sl`Uj2sY#L5z;{R+Y<7d+v(mx{z zr@lPCY9~U}i$_%LLx}qCV^xO{qMrLmRTVFdfy{@$Mt=Tg$orAqx=%Jp-pte;DvpPx*vxy{rsAl zilf{EbTl*anT{@{QLI#{qf5DtE|qn3X)YDv*U_bcI{IBRSv;HppPpu1Fg;zmpX+JH z3fI#CtdO3TSn=y=i4~uo{?NQk!HQ2;Ggg?cF2#qkq^lV}TvrG1L%Lex$FHj;etf$6 zGxG`sKR$geecUm9%@|_(nlZ%nbpS)8uO)^Q`dZ@1r>|L?`1Cbngz0O>2-DZ4TjVU;?3Uk$b=W5gPnxGy)~TQxhyr_J{j zz@@r9m3^d;4wh8<`7~)H$+uKtBmjiQa>_@%&6YMVSYsC+?HWv&Z zNG{g@Dx8zBZTJR6-lR?~AA-5UQy=b$!?7i0fQh zoK-wh^J+C^@?Fk6ik2j4&5oxx%6Lv0&eJ#J4!!`dYi(`};L5eRe0lL}HsF!?Q$LFU zp!8*Ox;(yEHXKWB!{ytB;pr-EO2(*Z8MskdhT?`{KUBJ6c+#|q8Myoy9JsE!G)%sTC%(4F`8zE0p@vTx)oC~`bB;^vC@uY6ZOzY;&jlq2hCq%o(D)|k`P;VsiU4AsV*=^+m9uaQzP6v1c& z9iq;RbPW)z^CxWRPZ%aAoWG7fr1aAscZi1_;*N4E&*9OT9pWlCGCQJo_tPTm@Rmor zdxg>ntp_yH-7kbv^g`y8q=B4-MfD1E_iO0LS{*q=x+7VUbLEGOpSu4&+N+Z(eZ-Uu zQ`%Tla{8FbxYOEXiHncx^pwfe={{4xG3h4qHm1?^>DB9gQ%s+}17b~G;=07$N8nEJ zo#XE{#XLG@w8=3dLxSJag?agll8e(m`=~}cBU0NuJWRhBB5DS_g&dbpzd}T0R!E-+ zQ^?1SA|izdeecFnY`yi(l(f+!GDc|PMx{-fG-h&!CT?Smr_0PeNBA~8Qiqp%wfVUI1AK`L*4iBc2nL|FL zAAvvRqh^cV)wEOk)CLk(f{YN3*ZTOHTq5_s2c>L$|JCLDB2)oNr_-Fcq5`wm8=5|bh4b5q-_kdDN7d=@|_E%$O-t$EQu!X!rm|ZI3l-pO49(q}*AbARhR>8IuC8 z>@P&d)Cpr|a^-q8-P);hCuxICJ#?#8As|*phooDD{&O#9;{9v-XY9LX{<<|`ngRWc zFV92onR|}p%J}kZgoW=g1$o6%EPO-#$#Ooa?&gjVU zMhb~Xrc~Gx%WUHQj5e-OMK0}@zS&W@FODeH7<1ZXd9@B82<~>cgh88FFsITns^9^N zwHb5z8?R(M@WULuII_cyc4N+#*nEe09$Q~JYK^U|8e7QCgiH~FG3N!O)3}ixvP?Vz z^ulSSj%-~k+nxIPXAoax%z2w7iO#S&M{RJ9DzuBmj_jx=a6NClf|N#M4!z&*iiM-* zRyK{MQ!_`_5m+n5#vBjB)H|}u@xI%USUv54BYWjVKrOk8L21|=V~#8AdG7(eVZ9jD z8|gwESv8r{4hJLAb4v+g{|jov1=ToN^RLsT&YNd zPeDg^GHQLjap8-2$sTvbA)a$(_iqQD=MfoHZ^XCN9ZSr*61Pk{R*_G5qY9*2t5}OS z%eo4}NBZ3}&aG}*^3}1Jic2#eTDI%2Yo70#)&7}&FOPJMcH2A`{&xG@kNvjr%j8=| z*e7Kh=FaZ)!y;?tf|buTu717sokJ(|eWCx3F|Te;{dbG019PMP`O=BKH&0vNs@so; zih4eY(e*9Kv#>4LwKB0^L@aU>CVY2a&4I9m`EKhm=bb8`jv+kdN z*Vq4f_F~9=L+&2%rsbYt=a(FO@h@LA*cTi5Tx@m?X^Ny6Al@XssuxZPkV6P z9nAJhRSvMcaQs4;0-j*=0oRHj%=Yr(6VZytqzF?mnC+D+8-du6MQQMp_dIhtU$ z*J2r;*FPs)ZWjKk31)lM$O(BnQTq{y<8yd0+iRCx{s>=5Qb0{Vz1P*$nX>u8ZD_K+ zNJp#7Cwr`}s&dN-??k-vQJ1fbQ-&$spJ{s$KU#%N<1@wq|1)hen%+~|WIp-!88M?Y zFlC0r_5Q>$%v_o}CSy1tz@sNju0ZM!N{g>u5cudIa1&*QhuU7*{zL|*Qn)E~)xF90 zCdSu$p2Dga#H>Vw#;S>cwd(SOIXr{(PVq!P;af5{zoVWd7*`e;SFUn;%Oh!)09W}6 zp$0+RDzwhC!3`(^XSdp0=h;IAU2kkq5#}Bw#cLCH+qK2s3Zu<{G#iB0TkYCi6gW$W zLa3ncgUvE>V!OCY@E(M--0}#!VV7OZ6IySuX<2}hZ>7tJoiM48KS!}Klu&Q^O*RAa z%>xBEw2lBPU;|P%^HH(~nK$qrX>2p>5y+^S-wl>vR;4zhH|#g3xHaoSh+uqem5_Dt z!JeVvOJT(|aDr02_72r8O+ub5Mz_?-gHcN>&ceQsZ8@j63{`U=(ztS+Ft-eQNUzL2 zK>v*^bDf3)hhddV40DKs^h0RlsA6lGT;Hzjm&us=-8#=i0uAcgdjP(PD;o%gt!S35 zK6Y)f#5&ah3kdC-c*|}=!cf7GhlF{k(zyqySy=6CwZ-yEmICdCi-NZ-0tg{?0}d~( z%tK4v?Mt6$k3|)uAvPdjZ!gqPI~G-X_ZtPn25`(08dq-c^#xlj+8m9Df_4k-ou{2y z6_IoIvt+FPJInR|1grl%W&O90k}7;v16JwnsnS_fNc8t+fUOkA=IXaC-Oaodz$$R?OZV#GG1L zr2LLqx3XwCtaDJs=U6duhrS_&F>_ajDZV^sR+Zj}c{uEQ6Km|2W0;}~b!B(SrxBax z^a{AG+tZi>Yajn@9YcigNfr@~>ew4LcSo8WM5p@&Gl}^uMX1BD9fAHG8%V`SP?Uc_ z@3L%iit8jwR=(IqEN_tQ@J^{#Zns!tt)X6 zILUi+pOh7oyjMcrk*1j1URy!|pS<_Z9(o5{{>!5STtgoW@#18@0jVl+EE@7ofoqj_ zP@s_a;;YNMkabj>VV4A6$hxSI_!e(T5??Hdd55>0phJ>)1ZClmdaL3$*0XFH^o0uJ z%3_jk@BT<(?tYSWr(w54+=?C%+1ni+H}@dH(AF-o0L`oK=^h%V>*=<|X(d1;g+rup zG=)PQ;w~wnEe>>p{X5SY@EcPE=VK&H#F$` z_fmuo!;rH|XuZXz#Za?FIJ-q?eLi$Hnmy_k+}%L(Y!flAZ(+@jBzsueofM$7t3vI1 zq`lpj7M`RJgm|ma=ty&3XuZd#Eu;V?-V!<>+>w=!F+K`)Dra5@1Zj*%I#2@NNLwgC z2z!w7W?#xJNGXl+TZF6%jPVa*j1e%%OZ!FbmUT{WAdNI$A?pA}`WCMUSze6vPzvfOlj1a*`0(@fY z38R2q`j;Es%P=OOIYJ%Tb4eq(;6$*HqN?#}zMX~#yX6p#5M|{3zlLIV(Oduqgo$n0 zIMFsl_?C|oZ2=zIwt>JJl@8UH5xq_f8BS@)XdCJTc}{8AXiEbMMlUvOv~B1Tk3nyg z(1^gW40$wev<-6_(8nnqdiEaDEYdI`eVYs7PNtu#pr0^Wu0$iR70&JyTJN*P!l!MO z(0VNktQFcvGW}Eq{j?Sd*CLYZCnVo#i-n3oa^SH*d+SB-FHlcaA%dX_>8k{BpRAsc z9GPB1(Jc8Tq5U|Z>=TNrya%D4_Ral8)=v8<2@z9ei@iXEQ85>U_Jg6F$|I#=N$NTG zvYvB9n=zdAnzaJXbih79uQ~i+&-PK@I6)dZj`XU->pluf^!IGv0f3zZko8lGZzK|= z5-N7FK}4!A4Br@Ui^+7D`wI;iKC{7LD1q7F=-l62;IjOdBp!E&sh8?5Z$ zy?+}t8d+t>Xnbgcg`L8l?ul*C7iq+?wZTAAi1vw=29y46!U)*VnYCI^-Yj>~oe>4b z`9I2o368g*6S}mAsjt+yu-m%OrTrDHO=F8AyMGAlaOIAyS>|#KF(1LO#f-}!tuZIe zk^M3CSG*2yASo)T*EykloQ73c&kCWgCiNtGl~pALbxCl2ZCts>={*ibngFWVcH9skoZT+8F0sWP5yVSE>wFf-Z$Ci8 z`r9$|w|pebM>8h2L&bhZT6*^XkE8j1>K9WGy1Pv~&J zP>1{2307E#qgNeXODKkSxb6UKCjjqoA4^oo9ggfFHjt1D)B;w^s6q@47^mFPv@Td^ zcc)`4E7uEdtCj)q5{;Koh`hM~0UbdL?Cu$88kVd91IWq3Xr50PCOjbw$8d1i*QF0r zmxh*dI1*b5{5Bp|C#O zy`|pFK0>0!weH>x#jWmvVS+nGa67bicS?xe?FhBIQ+0MXMqkh>xCaN4Mix5mQ#l+d zQ8ZU3u$brqgXKgbiJYVJER4HZxq63o4Q4XKp1GZg3SG2PSg{KA+4G9|68gL5iaDQt zT;jSUalI2Ws^UHyE<_ObI=mHnC-kb*TM>bC9aI7Tx1Srdu1s?} ze2#M@eYZbM>&l@6wGny^#U;pmzDRM&Ebdu~8;Vyt8%@u>G%b2ry zhXdmuR$Rct@iPOUe)>6>=3?>9S?h7g{AW_-;vxRYQdiFf_5h5M#N$u-)X4l_Z7#MC zkmMqi=$gA_KLP>3I?|FH5WbrK7#V+sDg#bG2h&_`UHli&q#YiI^uzeCYaKf1T&!IF zSQ(%HsCli6c1oKo`%N&(2sZ&%SNXx_V$0->EVPcReAMMDJi4D!7$L$iGAu_2qps60Zpk?qLAFP7ECc{%z z@P#sboC-cyhNr9G88Uo^3jU-FH_33Sd*xWtT?Oa;hSTXwFZUaCmr-L!-q(dsreAem zLZ|oyw&kxL`w|iq1D2K1XT|tr&8Ew7};;7$zV(3+`@~%SrRkSl!b!#(6Y2W5unyS|JXEqe&<;5*WHYLg|PfCBm5xQ$Osy95)s0b2e&}z(yH|E^$PnIAj z1IGO{D}nQZfVry9?4* z;X5P|Zw~Kqe7ROd3hoCTNMN$MEtJ|ppQ$M2tkvC#takcn&|BSbRzf=*35`tcH~)W7(T7pd)T;Hg#|b6aUQZX|xJ`bJ1f1E{Fq@UOwT*0R8`;)LPqp;JY$2kZ)6eM&X2ZtF3ERo|{6}3rhpT@n-Jfs6s=quXD(bRHDW)!)m%go( zwknsmmVm2ejq)IyR5CIoqm+dMwqf$a4J@_hF1f;}e^FiYy_GM?9Zn55NocG;D*Ggg zO{{|Uhi$|6&=3h$Mn|A+qcCh{K)Ye5Ku)@j^nU_E4y_CNK9!6BE36&|)=eG0 zbyHe5VQZ*tB3KSLaJz7El5{wNvT7(FdY~{Stl04gXZCch+h!h3W<jz$1;inv?UA+F*1i~$gHZW&}s5Rm0F z7C~l8B{himK`c!rMb+QxGka;2EpCmjG6`|6|5kN3n3sX7{GEE za#&;pCgyAVn;TMoR>=sPp)kVgYd2hr%`ljRrY@U-&Bw_$!wPL^Vn|&k1JymAde6W8 z&$1a<9Y~z8|LSopn9Z<4))`zk)YoQMq8zXk<*W5$Fq`38@q^h69RGT4hWsG(t94#5 zo1s9)AE)4*f?Vfva4?&pppN>lkIfMO2W^JMvO2w9n}P3P{Qu2n;PUo+HiM+RC7XeT zf5&E+9K>cY$sLHgnX;=+8P(;U8433d=QAHyoA>B!ssA2AZqE`4R{Dqk2F(0B3}>c= zoXYDb^cMy=#Zyjkn^WABWZB}dtb^ZDz3s(8H7_P#%=(Fp>?_83cVH~AdD#3KynhOp zSGi)hCdK~J)1!OSc{UHXDI(1}bYsEzZCOj>3w=r7W*rQ3W>3*(baBQOYrLMQMWSv| zPciCEO(F0-Q40xK=oDq{<&I)kJ8B(QHcZ<=D3#j99Kq9KrPEuWXLze@FY4aZ?53Pr zEb`b^>ZF+dZ|XFASd?6dXXr|->Jd`^H}x7dRydCeuZ4wmKnW|d7FHCGimHW$l|u3@b#oIJ+pt@SO zP*Zt7%~SC-aKAeB1nyc;B?h2~Bb@4GoFlbhB$@^>>(D%!t)AX`97_=g>NH+t9R8k0 z>H$<>I2AY$mBdQaN)1XFSnmc#xQxLfBod<-Mx=}p;>U<)7*R3?i;yr{FpOv!Bh-&! zVi+xC3>G0_m>Gsi#?bjOVi<;5#$XW=MhAuwBV#o1V_*Ufd~}d8ScHVpg<-_Y7!Cax z2@Io)jKLx#jP490LB(xVbr2G zkc4A@q!AO9XN);5y1H==EAd26chv3EV4LPah&t(R7a&ub-LC9`EGZqIV!69p7+r}) z?x?PmbQc7QC;h*dYdC0KcWt!FNw0<0dgq#yJ*37i+A%3T+N`&WNxG!$N&X>aHd>#x zau_Zkp>tyzuQ6vGwE}9Ns$R2-S`gJtRSo#8 z6sOPMuBcn6(@s6dlI3Flw>P@CEkxJJuEC~=HQL^u77HCl+lk&{)WY5vUW81qc4~2@ z6NljDky6vRbzy<{FGd-a_%F5yqb{?#w>v7VH+m7vV9(lxOuu1Zwd9I@YQ#Pl;WU`l z53Z@9DI5=5(lvg2AZkiD{VT%p31}jaBzA34|IP_!i)~%CuhWBYJ!DFjTLm$2{7ri)n1y6q95nbTIXL^s$uw$$f;Rex{K#P2ESNr%y?hd|fuHQfN>^RY(oIe~ccR=D%{oPHp@ip*NIo-De z#M2&sl#faN1}q~WJrLbG{G_B$8UM_Pj4{IzJDeX_qHtPz29A19)o5sM3O&>&R1}|g zoF$j5hR4d~s^J|i@fK-~RQm7xwg6N*)GhtzcPDg7v~;cSn(7ioMOi^BeOu_!OPpEf zFlQEt*nle%VsJtvN!;iZe{+gEurTVtkqYT+!}?+xeQj7T=O@J;_vn^uypHTH%bngs z4U@DNUE*kSByFIJwtGVDo`-dIPd~lgGbG%nJ8YuPY{Rsk&L;LJ-M80<)Zwska-l?U z#U{*Ld+Uw%&@g7~3UhO3eE8H(+^$BJ)opfdnP#`(%?-1Q+r}Cv>lWIz1!TiA)QwOz zxQ84U%j=jyE6mLsxN>bd@?=(*&aOSE@e1BNTrs~9$l>qVwRsG2H7j#3Zl%{VgIAcl zsyN+b#zmXVoYUL22dLClP3$6kNa=3Z9hHhXAtIJ1a_x!&WOfAHd#O;%*M zUAv!(^xg(OnZXClqCh_TL{gbiV05{0)^9SS10w@DMVYwPvp~gW6qSjyTY2r)EbPPC zj0$8EwmdM^d`455Ex_k3z2iUPd`8#eGqg6JEvQTr_|(4M`x57~MJ+yospiu}Wtzd~ zt|gh{IiIFle4?4ue444u81T9Ltj)vuG}q!2m})*_sLT%F^It=*T;Y7i)Z(*2Z9Y3t znepKB$DKn(&S!^Od;(L=XFQeJ1$^GwWbp*fXM8O_apS3)&n{GE0{DFO=_ROJsoQp` z#V0V;d?rwt-NEO}y=MM{^O;bK&oJ;wUfl=K=N(A%_1^AOvK8F6*8j)Jx$Umt7Se{E z1bp1OA$?-9&k~>5Zsa1=M@OXC!2Za)Tb^M|;Oo)K*>51pUZCKv=5!2?CORCb0qd96 zT*e2!%xt^{3{3tMg1eUw7K1uasV-E&Bac7PhB1Ir9lQc?aV&|SLU6b7vBF3trhxNL z*5*{O)*@YtCnCEj}TAQh)aIiR&Cay~lyi9bsMbIG>|y@d-?+Kl}L%r!psk&xJQ_Kh60Z zSBp=d-1_-6QJLxB^H|j5IG6^tf%cqOi%*~2`uXfaWoCfS1{DWC=6t5t;?pO$em?b7 z<_z#z^Fh@`&Syp~K7DfQ=d%TsISYL54oQ2G^EsmypImN-MOriSO|t%wm0fZ?O4lt1 z$1l3tWpj>aDL9ri56LdA*jd(D-6u$6b3xt(A;#Q}Qvc#&<zrXSTnZ(Z>bM|hglR8hdgV`|Fa04+@rsNGWr_escTPy0s zF<|X{+xL%f)-a8xWX&h3e%6?zb^vSh<8fV;%o--yl&ty0)Xy3l=;Og!gF7&%L45?x zhAB8DYd#tEv&P1vE?_OOaNBOq8YbwJtoa1g-)tlzOtJp*R`IW#H%#9tdGkr9pEowz zb_Z`Yv;NkK^M=ViC2w3b$4Fx7=a3BwR&Y3G;AdnFG7h^-917oK5(5)_DwSFWDctXq zL^etoxFu|(zItcuX(9tgvR|V%Pm2&E5nOWn5!SY`=hA-kQ_va(Bk7cE_`gvwX<52KC z`*al>_$=UgFdvkaJo{wU&oleo$QN7uzOkR^rd=b3#FOa#wSy|f?jb{jwzGttk)xcH>(IaW;eT3y{{ znInxa{1wZ4G`|}iOcrP zfpL?K1JlTZPv!mIyko|g8F1w(dG;JRb!siIo@|QY5B#IKLYnuHr&4@5S>;d*#e4>V zRIi%WfDyjDTu({ZGgO^WhO6fa+X7DWXxEERbB$EK`UzIPI&HAILXOY(?eqNA`1DTm zOzLOJ%@Sm>96?i3^_eS-kOv}JDyxMbdkQp~i=lkk?ih+BXB3iACU}>jc1qulhvQ%G z4y$RZ{P?R{LWAwFnjs^o>7vn4`2^cxWv!$BX_Vpkyj_Bga39HqT<@-Iaxp|twe(Z( zUD-7scX+~ZJER`luf6>| zakS@F@_i*9aTu2uv14Rm=)rKR!FC46Zgq$}>wlJ$a76>rDvSZX(@DAPB<+m1gVys z+H%i0+CvcQ8HWmRgp1`)<8m)!nY=z4S5`}8?1=R`n8zs4?v+^HAhX;z zI~XLHHWR@N$fH*VV>jfq1=b z+>GJ!mc7@FNYWRsJF%kNQ|AaTU-!u9%5qb$i`t0c$UlV(5`l$ z#@0#jTf2#E*cAvdc4YU~L5$%K`(_&`FfRYiG5?Hl-XjdFl+Il^VowomQV7lKNzr@K zK_@zPku1m#tY@W!JGJnRl^!k@`h@rtEN~Fc3U|h?N)n4mij!j3W3Vr-v&!IWY5NfPG8#s{M&Wr~_D=d8%ce4RL&X(1 z^BKGNTlRh=c2C80n%P~##hjHlM-J+-xp^B z>3fpi8JnJICKMcG# zc;mbwkPSgTZitg}M_|q7I3%y9>^h}2c(;b&z+t3xn2^20Ju3Uf(KT|y$_^jmfFXIu zVqu)`>yJ}+2H1gHV38Qzx1bw4;A+7NcYaQ>6h7GKpkEC7voU7?m2W41kh7^=lyd-i zt|A}~G?MQG76uKJKMP|#I_ZEPKUR7TVTL&j>=)ar`=b>2_5>=D*Ery)Ee29fiQ)?i|YDc`{1!L#yqNgNCy2KkZgJ1&AYwwn+FNtAX>sB~VeWepu-w7M*?X&L?SVhHkNj!?5ulj0h>oC+rh z-M5I_WwnWms|48nba0TasA8uXai9`Q!mHpct```?fkQZd>j%~-O(cAi@|&!V=*6A5 z#7b~?Fxzq55Psp@B% z{y;-llrjisERRcF0^`3E$6%cXI84kLgtFK#h#)VEJ6u%BKuXh5EF2a8f>W2kAlHaF zgW$Q7{i5U8Bqtq_%t;4%iIp8E}w9pUHVktO?OU6jF8{c^>gaoKVm>3mO0yw&ZbG@vIW|Q71MqO+F z!+GLJ*}v@)CKS{~sfRHh#N#gQ1!GQ#&6x8PeCts|{Q~CmjX6D0LuIHT3Zl~TiBFsn z=&3`}DQw(8ts?0fz*tjBL5v7sTdE|(8me7I<*+J|YKZEEoa{dHj7vO`B$m6xTKTAH@V0?x?||dmwM0Pv&;1U$9XC2Oq0EeM?Jq7Y%af=CL{5X z%}-A_{>T)@JPmvJTyh({5gf`g;K@*x%Omkk9Pk92%fD9qpk4~)@-qWU^V84476jBZ zQCz0XU?wq#hxn&?S~dScy%fsjUu`X+5Au|YK*;~xEw2{(AyP=4b|}CEgB2O@#K`z7 z0-%2SId~8Pb@8uhCZ&j%6B7S4m#pTW*i^SYq3n{&A4@NaM@@fSv{Uk2*-Ii{%cE7# zy2>Y5UF8?Z{kJV;rg+rlE208|l0SBYuNMfrzrU%b0zgBz;@QE%? zC(9K7IR4da-e6u0XR8U4Gp4eXPq6(nnKC}tZ5)T!AAf%c0d<{F+!8q!we(Z({WA$N{q1FZ{-drx4p;wDxl z`rA4*cg-Iw3k2Fa_48_o*)H--NQ(`A?}jirWbcO3FL^c`g_$v=sfLZgJR2en3u8XG zT6Rx}Nx&zq?hJD({0(B(7uJOo!JH6|08r`SkhwkddpJZaCJ^D(Q1($s`HTh-Gl@PA zhb$kpheJIKHcISsa%h~Fh;IE~^J*x~;lpCOo#s@*F`Lp4aBj%_7S?ub$flT?6GWIz z5|+}xA#;$(d>cNB@2#9;htD!V-fM zZoE?zrj^O5A$M|!btr^``ZoMiY=C+gg9B^?4mE&6|=gO`hbQ8O{3=6o@ zLOCU3%j5pFasR?Nmc_A>7&#;lSyC&+FdtD=fd6sY?1CwM#FPwE+E`OE{6F>U=Q3I1 z;^R6!WioZT&(v>Bx~UU9N!M4I1v?KyV>SN{=2or=uy~oIujp5xo3+5h>uh zEqdy|)|5u)zv8B5OtHjSH2>|pu}mPD##PQEg6y%%zxnbn|G8EjmLiWqyuN5Ew>~p?U^xdd@xDMjKRzy-*A(kw;Nlp;U-u(Ye{vZoE@Sl?M zdg9Se8UJcJ^br}Km zeP?leZo>ro{w|QqPp8Zjj|}!f=v_@aMSd+WIHbr3wB|%@sV<*rQhavdO?vcl{}nhu z{#BQ+iuS!yxTe+&@D;oT$rCEymGuEPbNqj9TQYM3qj|jKLABV|N?57Lx zM!MZlC^jUe4plAog%TeWYFH0f~F zGwc(eFk>4vqJ9><`zZ>v#jwk{S4nrsdXI$(-ZJD|A#S2yX&*SC-Xmc)Lq3qOyAff# zxJ%q+7v)X$UyxGZ&PYU*62TQ=h8j>P!EJ`! z;^Z!f^8SJ%;htEdkqQ>1UH9ywTf2DBa7o;WdP@)oc4w?H?gVdTn0!FTuv0K>wTnkY z)NbE+q7xM$h!yfJy$0MFUJ)kt#@02)n{+e1p+FGNiIY<(j>`8QGT028kf~kVZ8IDs zuuYuo5TEZaAe!<#Y>@Vf+YCo+hM#5LBu*HmGBsjvt5mSq*M@o?EW$eySVuRpi(ceU z6-}8Nim|!ThKVCFm&H>Z_8x~wyI~jhmP=(3mqeO4d7_QL7lPXs zBCz;;I_N}`+eP%x43_esL8?_MQL1GHxyn0)QF}AQzOw{z11n@dD&-*ZT4xuFQ2nXm zz|mCwtisS047)+44V8;o5=P|#xg4oV?1nuuT{dw+CZvsTeqS&TFX9(&`v2og^ndAM z{0Bqg%da6|6JK6J&^O*?FK;Zv4_zKFHGvJ=8^t|TpLqATzqlTKl!4gI%;Fax5;FCQ z_2Q2oQ4W+`Zuuf?B&FB=)Z>^$l%qM;qj{)pY}oWE*03&7PK_=u{fy<6FY!g}OXX5! zh%c`|r1(WH{V$;&ehf8J#46Z;{?CdK-}n!rrJ4qJ^l>3B_@4g%xSIa|ED0q#fZ>8f zqqwwyBDRtsSB4pO%lW*#5m1}Bj?oNJT0evfQo%4*r1(Z5QV2uE1>5L%7|sS@d~;*W{jk|vtFe2uc1y9H&H!d19;XNG*q$fua(K@_D6s9|&a*XapL9{i z7{m(fq=EwnZ0NY&`3DgTm%QxQ$1d#U!$A+HxD`@HagMX+;1eD%uGj-|a)6TNAIdPg zuq|9HND@n2;{M9q#W*lBGt4|xB zDnytT=x~c#R)f%$x(L%l5z$Ezkq&%<5l#yJ=wTg#;kbM_y&296+6a>n5#66%aQwU9 zY_&Xe{1-1!xtjNmcewE-vFo!<W5#`zzkZEZ06Dnf;zs)NfZ%BB(|{P9 zi8#;N`y`In;_W_XVlLibh3(hFFvU(N!#M;En=M`1b!C4_;~dV>m(weofTUz%C^jkS#9lfTxR+jnhpXX{5=?> z61;;N9xuVWsNo3`ygP@By{r<%CY?=UO#343wD(FU+Fhs?y({t9w0(5jfOIoio`)ti zaN6lPoz#{qY+~bz9&9%dMb!DYpL)=|RsX^KxEGt=Vw;*CdS`;+!$Qk@u}jX!>BWhC zkN(;^#yzhqGt;0s}hR8Ua@!P%MsD{r+OlmPVDhw%N5?~x9)8Fu;qt69hc8Y9hy4e z)ZGJqeeKf$pNw4M7-WqqAN5q?`T;qSpSJ5VbmMcV$Af4gJ((4Wl{=l1LL?DPe%$1HIy>bCrwhbJ^I|7rEB ztz*V+H0&Dj%EzrQq<%Kb(JAxjuwldIRsCz){ECpf+U#{VA5%HEhj>^1XK!phl{U$k z*zTcgIX?NlIJI0)N{~7J_#2$~WAM1|j^+MAH$6xx-dujH( zzt5Zf;}f24yQZa;O*MJvzh`S^{l`<@fg?ZJ+PC5K2k)D*?{f18Lf+|V-dWhyadV@> ztw)T-@8q6vuA9;??78M|W$v1}?e4Rs^`>>*c%OdvfCk ztuEA5{Qc#cJ3AHcyKP$cTPKXTRM0Y|qBR&+U0vo{w46>B-Ng4oH4!McX0c3kI+MZrBG`_AhHv{q>Ru z&PRTo)%w!JuP#0`WNXnqGY|E9dyKs%=X>YNTNb~0;o&_eOZInue#3{tEf+?XuQ{}N z&w5jp);0aU%S)dx{79xmsh?v z?d1yx&MX?;{^pZ6f9-a+sJ?0OvL`-IZjrZW+$$%3F8bX2(U;M8cI-I)_J|)Z-!tvV z`>jGe#*NE)C(p&-ecILiqAcmCM8)&uwik>~KEc@{4;S?$$i<<Dt-Eh(*LuvToSbvt9FA+y<;v)R^Ye$@v!dVoi{AVAtv=uCp9-5lxg!19 zhi$Q6eidh!R(w~RrmI){WAf*-_x;oPb?WhV$Nu}+qNiW_#-yT2l(a{6Adv|5m zu#`_)%nR!=^o!CtM{ToT{`%x?gSzgyf5lDVDb>1GEvm14sR?QJTlg3M&iJbP;AgY$ z{-L#D@3~uEDLT{f<5^Stbb3wO=eIlO{_@NHd-tsB+U1$A3jSGg>h0bmY#&F278-l3 zEjTK)oc7^cn-UImj5yNm{qHh6S-$KMo#5%;SO3kVrL~N z6*C7e7ngtEYWmxyk@{D6-~5H=%eV)B-rH)*%>&F&Pl)@qq*=kb?w%xA)l*6e$FKwnGbj_IGxeWz)Y;U@;(tDCU)gPq-?n{+q)-Tc_GUl*M` zf8oTN9e(E!OWwoJDlT=1{7iX)Alh*MZ4#TN&Ro@0 z|IfP~&AIuOvy(4>UOBc^-jUbs-yh5>cjmQ7lVPxv3LqC0Y^1M_3Uf$9(dVTc|O}`m` z*RquF9v{=`@p0BK|I@Df_KKyJvtPH)ZQ8j1J8vx;zVP|C&c6Q9><31^?e1DL{hotw z4uADnlessKyDipzZ^VvPzpj0MU+EifeLHx@-{<`{Xw;NDn_tPxdgqPatD03d`f^kM z__%(D9J?3ASiYZBb+U5skt=Juj5ro^d207r$9G3PH0zu!2Y#878#d&?^|NAckH9rk8{MFI)^NfFujM7BBa96wR zo`aA4HXyvm>Cf*Nk^bOaf2p3*S$O`{>=Q?a?2Fg*X_r@F`Yu5X+f_pEK{ye{^<22XCkv~Fq3 zh^@s_i#NFkM9$nZ{7GxCCl8M4vO0fPLXW4H*2Fwux-#j+;nqEFedvJ|i`u_;@Yl1S zXBCfo{DF$I*14~>XyZE5C3gI4XHB;XXSans6F1@X_v18w+xE0szwN2hrp_z3t?adY zgeE2KOk&I4cJrGV$*rTTZqHA5Tzoxg`72+&v9;uMy1nDFu}2Nx|1|&2A3_T!eKtoo ze}m=Awv}%PiI)ca+UM>)Z#P>1>D@C@Vot~E`t4cJq0xm&ITa(L_KwqxckKKyH)7oJ z?DyOL?ec@kFMYnSykXf(U*+sL{p_rkn?E@^yzADtKA5q&XS)g3dzW4|eKY^m?oW3n z9{2RUx!c+E>+TpBJ?UY~*bmzL`^|$#GR{xFzf-RvC1(!{<1UzHtnd3Yc8dCY^xi3>vx$4JH#|_-0FS(&Pi(yJ$Q@Pv3G%S?eTTz!i=qS z!iO{aSZ|-~9#;9t@J>a!?`&V>{r=?Wdz%PdW;}Oy>bvbyKPa!+*L>orR;&JVbHvh4 z`$LM7$1cBhZqfR(*YBFJ|1Ui{k8Eu2cIP)g9*_9jzvsVo)3?9A6h5Ui=Ir0@vCp`< z@X~85UmvNTJ-Yh0jfc}daP~j%n7y#=rN8F2%Jv&EL9d!sOz}0ne@J+TqDb-L{Qst1Bo7 z_uSZbXBTg7{PQczK6v8R-R_RJd}scA$Rj_^eC@f)9o?S!GA^;}%*UE+eDgq?%zG?x zr~mnR&vD(_Kec9~Yue2%PQ=aV+Vke84nOjjmA`)Xe#4Ye7aop|oY3t2vGq-M{c!gK z>+<#=cGwgtD`+-UOA@ZIf>e7e2wlgmdB|7gJ;cg0UXUd}r-dQj%~e_fD!wz}rI z8L3IBp{c#IE)}h4m2gJ)g?;+Qi}&s9JfUaS)1S7iUMOU)82*H&`;UW`O*em0{=-{6 zdk+{9H~6PTrw8}_+oh6|2~`>YhrKs}i|PCS$EQ^#O(;SbDN0h)9$_X^iZ)u2l#(r# zgtD|pV?<Q3EkfCnNdMQlb8k-bHlMeAK7QZt=lg%3$7AN6`#i7n zdcDqm?z!i_&c}@F+|`+1d>n$-ozHT5zxcwH$KNbGhtw~NuISGTk((F&eDjPA>!$cw z1h`yaY;bz8*1B9Y``L-ESMntyuUgJb>b~b_(BkAiVV9(z9If0Zt>vRrN3XbZ|=J}>QSYao_v=yaoKtQ`M$|vxppG%-R)bV zB#+#@D4IAlzq;Gdwaq)&tHv&swD!onD4FD`zN~j+<*H9<$6P&VGgm&*d9Ct(#E~Pen4}z=h?>!G5bw>PV%j}^T7Y6?K9{5 zH-;G+W!-+Nue;+>k4UeL>ssVySJFIKM)yrd=6z}@GFqB(yr0&sse5LhaWgYIV8FL{nlPGkKZ>a^{n5y3x0<4w2xc5g!pZ`R=DKA z?W_!|S#O)^4lB#!Ec(kVdT`q&-@5FoiH5yJ%F)^(n@@;Wxu-ThXxX=8lGeQEYa6^& z-mcnlIfI+lG(vUUF|h%M4(7k#mExHeWizjCr@i9K^$(|cr+nEzME%*wkw;c-K02{( zrc*;vgZ7=$&yzpT^%oyIMW$t`;?Wo3BCF1$X19-}CrVRt(%IZUXDqByS8Nah7 z;Z5AlqS|{dqtrEg9yF_u=ozv>WJa))$Kp2}xh30ze8$F;_a^nOwORK>$9SgeZleuf7zr8i%U<1IKIW_U{Xvs-Q|*?9 zRwXA{jMm7U>riePUft7MUh33-)pHA;wra)9^%>MfTE=3>`KM{--g)J|uBWmX%1=M1 zPGiNn_6rj!ymz(g!u-&A`=6S(O&Q6NF&Oh8_rkTL`>z78MtirM>fsYN-rw|w*NdHn zd!}nU_FI~9D!|LODXyDbkW0^LH4A$MHcwyaa9S#d#k%+Wg6%wuLjCB|iX!UbXP)&R zxoz`>y_Y2|6aDT-jvDJ9d7NP|v43BY=AnT@&w40&J{g-(qZu;t>UA}9{bwezi4#Na zPr8(?tDT)PFflYsxw5I?&b7?$B6)X?)$X%e9p87yb-Uu6^3r_cQke(CGEKy08*aG0 zg83!RPV;Q#r73$pkG%S6Tw9+9?{}F$9y(lQ>y2UGsudT0+dx-S+_cj(;blwxuH^eu zypu8tl2UrOcS%o{ohMN>%f3+F?4VeVoZsupQDxhDr6z8(_O1)o)!jUBZ^g!PkevczbIF=i3Xf-??2aqp(a@GXI(Rj^*z&TOE#N)96VvpWjfs+EjSm zKw@r>g({-r=T_w9Bx~+klAAWByF*bGtCz?1--AjYJ|wL$uyB*d69myU8Le+vB?y0YK{LTT3963>+Rat z>xnh~@p3G&P=DqGS5whiKH~Yi@u_`Q zg5p>tfL0`N$G~sEZvsE0zm5PNOMaXFckdF+$oK-$X&1@(f;gF-?J)Yb9$|v|Unb+b zwo~#wRQ^-&Wbg>)DGFot;ZsoMgvt-arQ%b#uzgbUpH2I}p#DG89T8t9zs+Zm z5o7_Q-Y1}NO1`jn2_@vW`5K5AbAs}*pblO{*ZFq|g0+y(@@JOJ`R(Dyy9B(R{p@=r z#7X$~OH`@wiUNrE{^_v?+GqY$vFcG}eW+zf8zw_gl z72c=hkm0DFA{uIc({mwsix9jAS%89kh6%yVgy2(!;DJK$HA3(sLh$<-j`D#@?;{dN zbs6DQ+hc$qIg~E+qa0*DPTI&*MF(c+(mQL=XwVV z_5(<$85#a3_HQHp!sZreNTKEyR2yLcMvWmS!O!2rJs$ROC&&<+xH-^jesfOozjY5c zY@q4j1cq9n-!KP|@2M@x*l27(&5G&;sj*=QiT|ZnCfgtxz5PP9MG6o$w;+U3MA%g@ zJ~g+{#b^jGDW5c3(jH2wMO|4Cg8W$XBxtEIQE+a-AVPoqq5MJdsd`0)*pLDQ<5O~} z>m)Kh6_2_uqX;N~yb8iTfFn#$|8SDfULZbIeiZBp9>F|CVbphMRJu_4qj>-opDKT0 zbCY~hegI;IITCJ1(7mAUC@_s2w&#!$x&hXixrsVif6+b;+zHCZ!*D;M`;&7MBun@l zgzB+yjSxMR`+_(snZLT9&1Fy?;&T&9k|K%AlWd6o5&Wv~qcAdvxM&N(kxc-6Z+CnB zCkI(CG_|3&cB82cwy_&-$?X-0h??|(7u(-Wl^;sSkC`2fHk;6jUzbo_rRD;cFdWq( z3TI$AUjL|lF$hCHD(y&pKd+zc`G%d{KRaRCz)+{t`!>?B&Wc6o$Dbqc=z4Mvyz%0C z7U-A+4r~(5fzdg=Udhs{jGkP`+q4B)$`NziV@Xebs<&y6B~%l7@?$+)DKWT#++gN| zkpa`dSPwFMu*|Z7BgZd%+f(G~aMKm@)x#$^08J{zV)J_?Ap0 zQ4nS@{fE8uFEEV$%w9UN-wwp#Hq+rj8!V>t4Wo;Jy>z}$6!GR8ODAllBcXgt>7=1_ zE||zhcGA&KM!uDFW)?hqb868Dj!dM30TB*tyaX%h$N)OuP&&5}$_^}^iy#k}=&%sw zW|5ZBkp~4yAP)+{tfEfD|z@tg)oASZvGt;=+xN8vR zQV|x<;X5P3-Z{D=Yv<^bvpOQEgROJbU#(T0uyqdmf&)zp)o4j9p_ z!1_Mng@y%&&dElHw%PJq9T+($o84bcoVVLH|2tdf+)r$1@7#CrX&M_Q6M10h9KJb( zS^}1OU`h=icgd%No%2R`79kCn|1fh7_2h?-2^-`A2ArFvcbAqhh4|JfX667VaYYzEYcMdibgI#kEs33g1<_XBI zxi8#;U2|s=ZL9O6!s}eYM?AUwkN$P?J0xLih-i(2T0@+I7P!oj%?B|DG5FR9g&C8H zB*H9+u*oRQ8*oQ5tN}fw!b{8b=-Z`rVrFuTIB_#M^|cZLw#^6r+=97fSFxa}rXXSOKjX>wU-2X%VuR#Rt0dGK z)esUFT%&9hkV~@p%X-*wlIQQn2g4+UUidl#l10f6M>m+G^rs-S#`&`~ItE#B!%?Ea zq2!?IM#ZPnKL#*Fq60tN1)v2HaP4a}{9A$+c}cdk@tB_^AuhYg_&A3AR6GiIBQe4B zCzA0mQ-tJ|(w~CS``4ePKM^fjfwSaai1c@6jnb7|Z}B1HQx`$~(Y>JVh?YgZ|7DO7 zP;!1IA7O%Z2gUaw>n~bM!=0dfJPh|Ey8pQ~O2Ja%YbHkI0Ins4lMAv~kl9(YGRg0t@rgGt;{0H06tu@}H+khrS=?m*%m0=PAa z&k?}Kk$8XrZcO6A0=O25Ge{hjBl=O!l=M(IRUaumDV(a0Pz^g6MQ?wPEM$#Xmubjf zI%astgqd4gh>D;b=Q|PFn7{O+C`2CX2w4PaM?0avXcHa1o+50bTZ89M*+g#y{e;^@ zM^6JaO47)@`B*fkMdr|@zoRE0uy+o|&>;{#{u7qaiEtqN*LKiJGwA4H;fED;^aM^A zLFaxZO`szWJYbukD?A3Yn?DCii07!PL{L(;&k1VE@;Mo$-R^l)`*-q?nTz|O_v7g4 zoWoTYI36j!lX5jjGD_Ap@#blbMlq{hi#h^d4MvEbn=vkyb7ChtCNG0 z4oQc`L)2@LaQmJyVRLSUpG|}yKGv-foQIP<1<8LkKD94^(vx5ce^mUxoAU~@ZO#@{ zh-Cbu=jH>#?2}rO@u{(k(u>MJ>V5)v1oH%iQF8+&k`U!Tn$A%1DO}il`7@;aDP(-= zBB(#Q$Hzj7j*B_$`>~0r3lqgWXuW5$AUU|5#67k^O6(H4wBIv{;zXb zMDnxu_-JZ@zh|e~TYta>+Zy75=CJ(912K#3Xxbcm8?H!Z6e=5h?&?PtmLSeRyul%y zBq8oWTnD4(e>YcQnizE2hM6nYR#=48j&qgH*ffU)F0|9_nLK};pIDXWTQlba60m4! z59Y7Ei0yJP4hHad!yzARhvVK)f2#z`td1QmnIl-hjydZ{8iorl1Yfhs_M?$W_*Z=TNBvZsH z>aB=*%$vmpXl?_?o~}@}XGh%>sYMwJlMZ{d$lh+SoLGJ*&6N|Y@3CNnoG?}nq>jj@ zxe`IoCz0oq^X-)L$-#m-VWk``{b4rBZGeeAV!mG2d3mn9m?9 z4k})}ih6Z4G4$iS5+UmlOhaQseZt7ludhQ$ji72Rjm9Fp{Jm;y7aw{<8rzv~r_?gy zbtMEweTNZqg{ssI)ZP+M$J<3Dj~A`F3+}Ar z;4Bp0CRLPB-U(HdOb*;$Bd!Nk)8J|YYYeavp-PE&P4yn!OJ_pdMDTRorFsx9utkAe z#{n!0ZaCbBV6dITTdSInf-0rp*`EUn7C;aIuDs4JGI$Il^xOz~(-ZPUnfofS2HT+Z^7hRx5F& z--3-*n9)>nq|1S`lm$r%z;wIrj~ldk;|J4(#K~gOnHOt#d7h*#tPD zDjb3bHYvGHXc-BnjgWE8^yKfbTJ?};O2~vrO@Nlb$?26GW*diRO2{U>Kny|K%t%ru z_<^hhT>-m@)F-iRz#s7jm{8J8kI#lIJ`0`#!IkT)TFGpHKti-7&llwgpAiQ*Z{r%n ze=R_S?rf%;tUv-ghjK1=Y7u>P=8@&ACmGl|&Xn z;mJe&ApD^B8>-H5m|ww5@TDg=u)!uSJ-Ld*Qy>s{@2ySxVNZI-&G7qUVozRBWI(KkvvWpb$|zsF-@6LhHkqld9r5S|1*02Cb=9};KA(~m*r2G4o*%y(pa z<}lxJm|vLhsGK7-hTTb!PA~(Uiz);J5ygPY5~>Dhz^_~Uazk~CtY&0kSVK0MswUQq)LhBiZ$# z;%w#ys6rGXAIQEBNQok~;Hi>D%kL8bCseYAMo`NQP={#5J)8U9ocY{>%p|xH34kkK zEw24=Xkdf@jD}xeOcayNEaY$t!DO>FJUznmA*2+F0`dyV#EP3k^>vP_jbvkHwm?a@ zKq(MafRsbtq57c*q_8chg!>TkBm-JJHB6wE&*SGW>epf5garZUScVfCL!cGhG3)eX ziF;sC%e@cg#ox+9qe5|^Frd4CL-jw{;0*^RVfMn@W1xFT+UJ%3y&_R+aE%b&H*+`WiM-S>J z+A1ba#zj4JvpKUB2nm5OdULpQ^dZ3~QG0=g$04c-!G(;&4KSuBf8g-=H5t_w(16Hj zE0}XI%PBp`x;2WUn#K(<<(6}}Mf7Nu=C-yb*s4aS$9x6>FvXHUf>4c-M>S6hkZuTp zD@?ll-Bgu)*!1r`eCTB`Q}eI#q0cMzq0f8{V3@l+`X2(Yqv{-jR^5mG9b)~2R0omz zz}yXJg9%z=p|th{EepbC5mhgWUGyoAZvk;MU0Q$G}u#C7_350yBi)?rH zj7+{=WHgVFx)UA_VQ6+ppe%2X;SB-S5HJS<*5U!a5MU1h0T2+62LwTYBLoCPz$QFkMV%AcsFqe| z_wnzxpB1yd>U3>O+^e1Ydj7JtYGbv>4jNEoL)*oADdu67y*F>@>Eas~uV0OgXNf&u zyd{5IWuli~p=YLIf1jF+b#28e{-froPstBU%L*CX_S}BP(jr#oIOkQ`6@3q`h}F7Y zxc^~g_P#!rzWS>dT=LYWJE}a>O&vDBm*cUK>zq~c*+u)aSYj~IQt*pM>(@|1!}kKQzX_8+)RdTRch<&h&ky^eQGJELMSW!<$f z?FAF}dtbGexAG~}ig=kCucCKpui~h>?l0C|n6BS8k(FWII(94b{HjCcg%0acuh~BcYmBfG3?6wgammbzZ-@KLW0);_Q2a$> zgHpdH_o0DTXGho{+aMorTrY9)_S&2~(e$a0h7DDiuzG$%!T!^$3WsedbUx-Wj{B(F zVmGrPd(J0hM=w;;I#2UexcYpN>9y3v5Tlun$M=|fNAh&XM&>CkJ$!%vlo7PI;?=?5 zx%Se>$7VFm(3Kc#9FcX)Ywp9TIZLvGwioAhQ@Z;gvWsz(Tg#p9ikWMA?x``z-%vV! zRXqLU9`^Gi?3sql%^wFyh>vnP7B@Y7LOw0Z(R7$Dts>X^#=65UDVj#N7qg2_+b`Bl zKk}*T)D6dPIL;rU&{gwMw)OGI++Cbm@4tTja4Y8crZT5~s#V3u#$G>|_x!*sEm0fB zo)c=@QGUMQZUB6d&4BYQ!p@qOR3^KS%y4VahxSgc#Q zNkws~mwcu7N5kP1tx+#7#BlYVva*M5_>8QlA7H!qKO@tVxQXA{2Px*`8s=7@}o z$q8+a_*jRtv7RHAnN)`440T!0uHO~+@PzV~6-C2#=PVYHZrgpkan`guC9JZ?Axq_6 z7r)|+57JdWyC+BW>2*it&@Y_sjc4Ul3tP`G-r{6*;=t*lD~fGqWKG(#INrHh@#>*Q zaWU6-!^Q8uGU_W*cI-yngfS@wiETp+q-~aGKK9eO<}>8bHnq=|&byu6+w#5M$mX5% zTJg-hYrs4ER}TW!kH#FiKJava<>2BET~{9ou^FYcja_M0^Cn;Ra<}nAtRo_tAI-BF z@8&MMVoIOE1=|Aq8JB%5{N%7I>iFOR+J1X>EsV0L+;H8`+$^aQ)%?|PjAeMaN8u$7&z@n z*M`u%s=49g#+oe4^ZdSyaqI1-U9nD+B)#89;qo^JE_=JP_tD$SiVo_yeh=f7Z?hd+yL9fx zjUmhTwx~|a>iH~+cJqXqf&HTyp07STG8JZeO?2uusQaAhQ!;(B7Ug-3PSbyWe|2a{ z@gU9FZV{dXyM)dBY!aFQxZ+Qp!)Z288UMiB5yzl6cvS@|b7b`D~YaHa^n*TCdr_nL+qrarXzP<;X#y=^& zF@5I6>VD31HqE~qHLB20t4t*CbxMBGVYkuY$3(6Smr}XPKIPbgA+xX49$>R1OVtfYN7SaE(dH8-Ed#NMLp7aEd-qBwcP1!bNAIHu6_0gqSlMm~)<+6Kg zChmWnvcg|1e2~LbnxApJ>45i=A^PFV-H)h!E2w@^Eq{j*p4^x_$|kzE zP4ipk3stGmdaIn_r$)_-jt&02zR6?y+eOZwmzB9a)lO&j+BeR>NyqVZ%lVc^VT$)c zVj5h_Cl|Q4YM1r7ue*NPmw7tPV;V&t>|k!Ex0q#|sjoUBX|?XQ?BLSN>N=6(Ss%)u zEId1-D68KZDUVxeskPY$JZ(NDU26ebXxm3bs$2-T70I=ITyjlcnOEIwfKEu=sG)~n zwVkfwW)O6wyn=TYhUWKT?<%&Jvq^eCa%`iEoA)^eP+}Il|9P`s@3RWjPwJ+&^t}RS2_l z-LQOal;gdm*+VQn`oz3CF>!6NhjG-G%E8^%gc|!=6;{j0dPJY=zsR6u{Oz+(UO8Kz zI3IC+%$ehIgI8ZO_HH?QvGM$V_w{BLO5c{v7n8ZpJ!8i`wAIl$hIzMyu}&O_g>i082i2VSgNkyf+s zg3n8L&$`UrjAqlSf=wRm1G{qNES9*9+V+YT5&W=txXbv~$8UT;?@~#+e(dDR9=2W9 zjEhg(I&e){KdIEv#015=##h=*&unc@%NYIoT;I4!a>m|Ym*1NcJCy!7Ld2>^aofx3 z^O{4SDm>r6WRBRuE9*B;-`LV-GO_NINlMqEwu7S*KDP{BWwoH?nrR>N#WRO4`{)*# z$h+=YU^bxOqxi}D8xMr`xD;n5A9yq{GU;Z(#;z|{_Q={dP2KL}Ow&WJ(hQh|61877 zxMq zdA9zFrqG3=hEDZ%ZQA+!Z+hG)OcNVhyrAKNeZkuCU1F8|Xij5a?!Q)CeWh2p_Q&E z&BtYdbNg+5Tduv|PxF-2j0K*{PS0MQ{j#urU|vR6gXcoE6YnxiBJW+c9yGfk>gCy) zW1d{Pe_cMz*iGikXig*j_5wc-tC5Z#mgz%X`md?eH12(2jcV#M2EBC4X|-tcIWI>= zZC`2L&BH!HTYctv{U}EF{*M#m7HBdDXnND8>guM#=?4Fe zd$m<8_O7(pV6tw(jYD=f$8{Ht+B~k_c2NH1D2Ax4Qu5dV3C&8?uD#U9_*o7KSo4UN z{$gp+ib~0gYBE|MM0wI75m#Tm7(A+ny79^KxxMZNDbDP-y5bT`dC-?VeGe@+QlMq6 z86Ymk>MmXQV#@Ug&IMHumeks@4s6gauU+nRx`GOhp%3+X}j)Rb7HREQ-d?T zUk@GZB6%k3^!5#zSz8&((3|BYaC82v?W{qR^u{)3Uz1D5%D?W8*ul~d1MP@rLTfFo0(qbm_ z%#aOb{`U+mcwO&U&Z~YLGWDf%z4biNw$O2tFDzNFeJK1(x2oKrRrTVfZ^ToN_OAG- zG<KfAX(@57FP+66gzy`#(1=cjf#QL>Md<4oVl%ZxP7N|h>Po8{ke|_ZQuP*n`^Q_yx^LaQyg#k5=4E8lqHXe9 zbUbN;Hfv?J4cd27F*;r&Z0psqvh#aR4||iXG3(%Sx8Wajj?|7lmcJp*ZB5PaJ;g^I zU&yY?m3i2w&kPZ<4PBNtjZ7?ecTNhfaIPv(b!!~7x@s|RlH{%P4Vi~77bd?gS(-Zd zrG~j;Mn%J1?XSzKPoKLP@Nrsw<%cEP?md*Xcwu53Q#w#PYIUF4i)eS7IUA1d(U`BX zIYZm(c&g9Fxqh=RmOd@osVxy&p&X!A_I8qcziL&7Cf}-W^ThA<5*ss!vnqeelS>0N zW`&GveRwa#B$C~ftC?Vv>5?2-SYa!x@p9RGhbyMv83STMo%FVyX?)!?@O)cQ`mLC; zg`o{H;7>>i?bxGikn9Bsd$+v%Ds`{>ry5#6i9%Y+ z)I}vKmxkp;co~mWZ91{6HFa)S&Hn0K#+}AqmR2{z(?8u~^@=gJOgf{Oqr|IjD?er} zB4at@*ts6!-xRi~J#WZo$6a9AeobDd`dv9CPITu{wz!N_-<(OwpuTJ zyl80!q7v&)++6r+X~Hlg3EB4sF)pI1o+{aiW)H*n_pB(Kb}=Yz`=B|mUk)m+HT~*v z{>{m(?64&Di0zw4)4mLJ+g@b+y=$AT?5i%Sl4tF-k1d&d#ZF@Lo%o<5NoU&jIW=VL z-}Q2+R`Ovlvw776X|pPPq;JVxb9!3gBw4PpW6^*Oi@B$JD{r`?J7-ffH@r@y+efGI zle0~e#m;fEWREp|xK?L)V)c-qkuNn%&Wl(D?dcn;_13%eY+0_nRkld@jX9TFKMd(s z^TsS8I^&Rdve9g>Udf;At9-`4PdB`~u1vzO=Z2_v-;I{Vel7l7^Dukm*E<#8ymZRB zpOQ=28m~9|ycp8Q+xgP12FIpLu5tMyjvFn*a#GUiPHiu(bfl7N^Dj=DI^xmlXMXdJ z-}f1*lKVmP_Lmr`J>$pZ%%O|;N-=8t?=PRrD_H8%^r0zJv?a4Nlx6?me2$G&Lhls0 zM`s=cpO=ySI_a@<>7()&S5?{0UGHuxaB`vhy?j=gdNJB_ud0k|+QiSB*2NC3@^o6h zH(c~drsC2$5|8HldY`w6=NxFf;Iqd2UE1jfp>vzG>#XdI_UOzrNFKf@COn4KyunKJ zRO1qx+EG$Fl+Dy7H(7EnTl+1N*N{%XJtLd$@l3Pd`M?YD$9g|H zWSY{i*Gl>Lle_k7TAVJN@?!54^CI(}rSBiFcD!9?`{l(4f6E2EU-eueedkbrugFC+ zI3J^&dvBe0J2zG|H6SoA_xy*#>3$&|35-MGJI%|Ud!&jmGmg4357oanvsDRHbWYmfBkFN4C1Hmu9op^&Bh_eC>dn-$VM7D3y(id(XEC_B&he8e=ETS>4}q z?DA9Jzb$FIxb%kT;I+<+KOP%)#$twuy0qr!PsXDS2PVm`nQ(e?TFnEWAgNIm@{=Ss zCq0_l@8p94O(8Fue4`^4GiJ5i&v#Az96Mx=_=FG5P4s}UU5SauEgaN+>)Z~!S@JAQ z=fwO%jX6d~>4q`GzE}00z4ekRWB$=ko7Hk3-Wbp}XE?`cajN9rcROZPe(7&@<*iZ| z5&g?|b*?IYSE-GXc8Rr`DYw`ubY^K%+Y)yRbBD81<>MC=*VHxaUfa zSA^+3uaPR-d|})ik!x;mUY~Gq()Ezud*jXXeHFW18l$ePdgFEZaB^RhRQGb-&+9)J zpXG8rt={QfH|mpCdRy{SsQb(p+h0i?Fs&MFd+$+B$n0_ZEc198Jo22G)-f}6dw^U_3h6*WItq?HUy8*?eidC;Wa(4u*==gfsCa5 z&_3+eGlwM-N~`AA<`$&}nI6(IvgCwWvx+a4X3C{3IMT;N>har@y=U^utQ=%#+luTO z?Z&=x-Fu#w-0nw z2S;u^=8&qNaAVNOQB@Pi^^!DswZkv7w&8JZeDkRVD&YqXvNEN2g;sP)+I0Ay`-*9Y z&-Yi+PMo{LaZSV=e~okZM@FYPI2m%kuc^MFc5Thf3pYlnkc(v z{cD0-XV-Zd9POH}slTqS-@e*zLE%>4R!U`Uzwsh2QKb96#UVvuX+x%#+HD_L%gt5a z{ARCS>ka+j%L~lKXKY)grZOt)W_GG`y4JC{nRd6_Ke?pJs64;nx1n(Jv^%zGneSD% zPcJY_4C|KLHq>u<Ak-ls(3m`)9A$_wYioh zN9(wvy*~7Bm^sq;`RXG}nht$%urv(vlHbgTo4drkOL0rG{g+`=1{-`fT_! zmB+LceUr9`J5lX^?fJDl}F?qMK}8@Ys`p8EOd(cQCkZ!DfRt(ey8aNf1* zOpc5SJxbx+`hik;fkizhnBMbYHmyxvtt=V4K09`6)l83N>+;4&P0mXGdLqMg$=tND zlSS9t+AvGJs{)Kmr#SiyXavI-hX(0Px-@5+Z{iy5$T7KHbQ<<742l@C`bjZMughcY zaiQ!CcUfO`>DUb=8$UJa9F>yz5W4w#+t*9}bv_x}PQ36>d%fuFunQj7O1J56?s010 zSHnjWwT`!_(d)l`I5>F2mgl2o!_=%!TP9qiDHu-hkEo@+S1=yO`f?z{aoH{xyMSw7 zYS^VCi>78oCw_F4a0)w{y24;emg4m{$8T*7yLe}6%IWf^-k0XZ#bV+4eHKZUw<_wDz|2C3Yo^7re`onL=URAPWZ zTGwHp=J$$h>rvl*u4PrP#WqE4BbVFun>}uZQDxJvs1p%Z_kGOtF0m8Vra6}6$NG-U z(NMoO-Y7+Fyk_CN!vh9BT-K7}Cfntm5ohN1n&e(3g=Vomw#fLU9eOrrTG1!Z`EzEfPKsZeYQI5UG-5N%!b-EXbCR%da|SfQo*_5|136pL%N zCwcbkEoO|<2p*-R`fhJZ|HzN@rqc^-hrjaPSk;R+!Es}z-A>w@wTF)f`)BXiap{nx zpI^+mqhRemc2!hrow$^obLu;%QHC#TroZ2JKIUrqXH&87o_aHbdZ}BBnFh%&DD}N{ zEac>~7p9_FjgzK+Xx_H>;E-M#nk8?mw2k}kxMC+8?4o;h`QzJTjvij>=f<0rb4O=# zF^^TCd1*|VM{u0vm5+`_2Uce3d=%|@BujVgf-9*t#r0add8v|LLqen+RBD#yE#@7J zYv}Hp6;>OeQ1?^__!pg?UFa&gpF>{ToAb=y53eTFV52ELAD{=wnqJ~jAusPQLE7v zSE^E~<7Om#pFXv*`oW!%(h^B~R*Go84;b6~U}moYPrp2>R9t=eto;MKy_%6JQ)kW$ z5t+BEU)qSHYb+I6HN74UpDMvp*-@CVIw=1K2U?~7f(ZrZ=c+Bt8s z&-bWp5fV2?WIC8E88P>vh*WxFkzB8ueTOUFzlbRuGk2Rse9%)lO>5^Ri|vB-Os3ln z*4;Nt9>O%ANeYeYM-cMJvyBhx17<+uGoMBP>Fj!)GakM11(@RJ!4V z&VH7``fUY;N>$0%>|4eTYGjQ*bv-T9I>XiKoZ%}SoeskB_kWO&VGCP)aY#aj`HD|vN9S0eNtJ{iP7|ts#o)j3NAE; z*j{LTvqyaTKE7{rXe{cGC-AJjtxfrk325Ze9yg zk9!Yd9g`^*Ie)jHM)XvF7l-|k%w?~iCiR%EcdWH`oPY0Pi?0h+;(Hhu@7Q$z zXO>Lc;*|d(a`x7*KDJ#iD<+Pg*5ALf)%xF_jkk7djT$u6Net|J

      xiw5xxUESovDs!v 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�-|GypfcSYE*kFbB7!+uYe_K&3W zQSGlM!u}Nz_Rn?L@6FQwM2G#o5%zhmY{$RWVc%Ou!XU4|`OiO^?+YFF^W`BqGtNFm z30gp(;rtvxRQcy;Y5$83`vnp9uZ*z&n8SWNOZyKy?585^uZ*z&y2E}VOZ%@n?9Yp^ ze|3a?e(oVE{;4eO??>s$1usSaachXMe+>!P^>4hxetDMmlMegqBkW%nVgF)>{mLxu z&vV%CjIe)wgnfR_BP#w4S=ztOVSihM{nZinzwNN!nx*}_9QL~-?5~Zm|D3~qN0#=V zaoFD-VSinO{k;zRomtv{&tczN!=)OWf3`)~KW4Blf4R+9rQtuD#r{27O@^DV<})ej zX&M^XDjW3II5$q%;;_%V{G3iy`yDR+n}#*MwVgKd``@eD6@66KvFC6w8 zzNE_^^M7lE{ha+A<)5Yfe>&`YUk=;f6k&h7!+v}@3DcHRfBipke^>1#DScG?>xi)b zHA-QZ{}PA&$}H_Ka@dc{%M~#GeErq7|3!!WPO+c1@*B6lf5BmYtJvQx^4$LT{yE$J z_Z{{DA$by4n>l}& zK_Dvsl`FJdN`GYj#xr|*C+)D`BlfZWvoE&&W{3UGEbZ4j>^JbmQrgfyU%#~Nf5TzF zCrkUA9QMu2G|>K*2>aU|_TzlALt9Gy_5Z~EUA6aw!+wXn%meM;Pbo-TZKnL+b=a@W z(*Bb6l?Du48|6PauR(ZJ(=Kt{s`v=qg^IZQE^dGl4FE-FNN`GYj>RwH!VR)3J z&j`rQOi6EZliu)zq|Y%xKFcNjrsIMKO#fl%X_P*y{pHKcs5%eVl05(DqW>nn>3=>$ zEJpwBZTHtSDI)#2+5Yo)+jo{v+^tjXI!k|Ur;o4Gf7?D4U!?uLujzFAP1T>~uWf&2 zRZ~;lg4$)xqpBMkM%AC095+6ZoH%;y#6&z!|7g>HlZnLmv18-$31cUY8?AWd0oRq5 zP01PHYaHO6tLlQWWj=Qu>&v7ROws$v4pp*4={p}iNIvDUWF?jCdMfWYZ_%i{D6x!*~Y@@wI8SRN_VE)cJAf_>9t+WgVL+F|9|Ygdwg6~x%fS~&<<_MjGQ9D8zTfr z70OJTwh2Xxm}MV*^pJN)Ro>o~;hg>B z@T}qS_#T+;dthDOqm%wef9pMU0$tq-)6DT>Q{ji#^Ntz?r@Ws`Er#xZTV2 zL;M{OUY!RC!zq79RlXyAVP9SgS~d$y_N3$s9z9en^Wz7#l&^eIlH>S7nrFPaP@aTq zj#tmaOpaIkz5kEX zx3@aeue0pet#Nn&02dyw7R3i=QEbv5>}$d!?`tA_5y_wOS0 zwL{kyudNyC3P4t0hUN>|am{Y6{jAK8{h~Pg9!MVm6GK0!8QQZ8E_OsqyjG^b_dq=F zGu~*XyKu+PYwh3KKeB5}=7|VV-vc0$fm>^+E?8^77`0y&0ifWh7fcx+yb!xeIN&l! zm#ge=l*47s_+XgG!&sK#SI6^!9fWvzz~yA_QhfmlQ1zW5zJW`i3x`fah^s3V|1y?=OEmx z>qG213`5uVj=`Y<@jFkxhe{yt7L99g8P8p=&s{d=E?aY#-MPzcbSbn$25-T8IDZlajef^&S zRZ3!DtnWW#{jd54)(W|T)HbijH&6~Yscomi6%JAT8{h5`yuMtnAUPQbbwPiLG zTLZu9E1qhHl9A&IFfTA)|HlEL1u7O;|GTM=WaU6f@>Zxf%nj~EPAz~S$OqKdQ z=&GLoxLCMS|9`%Tp)hWRUPV7iKL@U|^(_c1^!0xY!iJ?grJpN=;KHe4K+>Mn?gOC4 z+DL-%33vW9LSgHx^j8;i!$Rd$zu>P%^u%Er`-ZwWiq zJ+#EBCjjyLU2q@qJ^0{rP-qd~1A|XOvJh@3OXk_oG7mv2(3~^%CEoPWybMsNqcPtX z9*y}P7=z|2!lzn5iMW#aSet&KQ1p>7?uS!vUFRG8N0@GfeGj~PtmIFq(06tUPve7c zK&sfWj1S^_w>TdgAH;9i1MJy9I1jGo?;k9LQ(*t#DRAE3!?Hg-Q{Y?>_+9{_Wu+dD#Of9;S$feL%iatwdHXj&xiy}?7f!370^#yOxWof4 z_v9|ebC*A+OZ01)%51o5@9^8mm;WU4)ebq$TI`mul_2mvERL+yLy)h~qH>k54CZU< zT;Uy%EoomNL^xr&7fbuR$1C^8VeXer+0DLha)F1VvAT;YS5z(*MJ~(wqBX0cxza!B zBA?1g|2CI5*3I}JzEgb?9<_h)8Ia1G={JXqPLRPLf`HSp9*SDAi`LXdE)uz9ZYHV% z@`^4-?nRz0$E~MDAmHMc(YiW!znp5uvFJGc*KzEA8~*hrcz8Un-PeJD!N1Ve)KZTXpU>=6Al68N5aJWgo*u7yQ;s<`GK?!$GM!He@p+g(qV?n!1o~#aQeZ+ zj{XUU3mgVv(3V4>onifx6@g+n(eQV?{>d%B$o^Wt-+;49wT9p};Naq@OMbI{ujkjb ze{!p@lc=Sc!^gM0Coney0-CwG3eo2!R2wHhNVdGD=9l`o;Z`p*a`-md^Ql05H_!X+h zEzY_bW@SrG&S&MkZ?EWzT;_dlYw%Yc0^r#X$D)>;COwp!7OGh| zx;S)65i8pponYL(;T1ma%BKl@t~jZDdS}dZjpOdGVCsC_d_L?DaLp$Sz&xLjO;D+N z-4o>Vj+c2pAuXE6yX6y^qn~{n_4zUs;c@f%ghN2(Q#6SWi>Y}(q^`!lbGwGd?QWmd*OgzP#XFVU_Ed5Lx%l$QaxoRpWPaEW$+CdYo1$Y)UI2#W?6CqXsp z3(HIBb@7w+c|a^U!|FR*zqcR6^2c2kX>WMPgSe=gvv)`=+h*_ON@P14B6emX>u~Wt zQoq)+|3oDgheT?J?%Rf`!}2{Wvws73fno6-7VeISvb=mKc^)hz?%sr=!1JCL7({oY z=hZa-sn&kY%6kDKJX>r3MFht3eqTG3-YH`I1tem5M{0+5?-KXpAX}SVGxR->!3DdT z=2vR%V-Nyrr|fwpwf1vDQ3fuDG6zINsLUTn@*W3KkQ1Tl-A5rLuf~3~HUo>0$)#52 zdT*`$!&-a4m6?4k?w9wkf?05HWx~bIMdo9ZVx0t~EVKyZYVATu{8bhmHXXdRnZgo4 zO7%=VvV7~;iegP4=>}KA!tp(DFD_2j4s9w4<~;@w^J)#_0^+B0+$Te_G5gpVnD^a=o9_AS<+!9%W%_yuZ@VswgWr^yEU~Q$b zw%`g}KANqow5+S!b9DuZ!0J0nhDF}eqOvl#OPix5+c0RS3=&n9xm}vwUy?!!p(A*v z8dvq!U$TQj?}4+hv)2A2FJDn}U{|eu>D#WlTlQhGu-z8nzjf(7qCMfZW#(qskei(> z1D81<>gT?laH1v!aF>MJ;Ix6-7Ph7osD%>b!MQk0Q7#Va-`0knuful$tjt$%`w6yO zlEv7ALi;2?gpHWI$8dY*2(Ba8hj0}=w_cdtpM)+B6_sYhRt)UYoB`scEW2u7XBKW- z+OHjp2co_Q57lG_af1uCW6rHYclsrYo7P@UkBNZg`QFQ%-pE#>hMPL_E`hZ z_Z^N^9Etg=jzsPDl6f)Q*}0*l81|e#59Kn269!oSug$dj)t*Si-Ur()kRaHQfhfKQ z$KYncW6_G=M|{^|-h(nw8XYj3R$GBu)!=@aW6u#y zz~k_p(0;|s2UB-LbQl@+`Yv|VH{VR0S>K|PWu*(lMOClLd;?QkHSmnD|9MCf>JR;| zCZjsSRhdmCP}BQCqHiiz0b^d(3!+A1;{MRUNaa1|% zXhY3l*n&r+6~Br4s(vF(fqINkms?|xXKN7!!2zQ7Z)@}3l7h;6&;cQm@4;8dZEy6e zP4aAXasuB#6By(i3-_whMJFf|^+mG<8q)%*bbSN2LfKfEdvOaGS_8O!@+{d-UD`v` z{)1&d3u3~m+RQg`ix|AbH*f&7$niJ(cEGdtV=_}iyTc$B`hoqN8h9!mgZ*_e0sR!F zuA-#(1ysAiHOm4{@5@_Nam3gE5iHA$j647>sSoa<412H)W&Xy~m<%597=Vf3ariEnhrMYH z?U6aHvwwGIa&NMT3Vv++-^i`#9 zDlACCCMw?J2Q8%j)J>=4Z+#9rNt7B(`qLjhv+up>J@}eJLGpCm4?y`(g1pSP{yvs+ zpuW>99&7|j$fSsYGt`$Me>@!DaxjMfol4Z9AZLFt{nq@gAGCAZ$a21%-h-*;CAU)h z6t%ZRpSugw{bGs0FqVJ;g(fM1?vd4~q+4$y&Fp_FX@x*1B+AGwPCNU2Z{01;TuG~%O++&ZSR-w2q}A|p8URDhaVI1)%`uG z-LgEsa`;=A|4bUwgYx*N!$bV}BbzvM);@UHkNJk@3@bgBUv9mXEUT>;>wB>#{r&u!ieL8q zP4EJ3$|*C+CJ44wy<8}{ZRg8$EaKWh-DX<2`Qrix9E z-yd+?XJFkFySA}pAqaWu_B6t+tZjVvVXv?MvltHJiR|R8@vs*F^h#kro~7vD{#KfN z3(bVX00cAQS>^57UH5rmH@ZX^5`M+-%jz7i?GAolrQ@60dLIInWDp zv6}HJEMk~ARt509%5Ew34SX4{hOWJ%EOP^H+BrViY4C^aWM?eI~cgwQxN2}>HdQdUS!&3yzkHFknQv4;D7mF*||2gN! z;swpp@#^)jKzUg9x<+^xwH0$_Wxf~`=uEi6qK80u2K!=IUc!^dt(Lf~hD0A2!x;9~ z0K7nVKwg%@<%GP1hxPjo%1d}Yzi(1rhQZs=EYNHD9!z5=*kV`5g{9We^?`_8Eyp=k z|M{3)23+7uuW*@FcCJvJ>DoUxX{>HZgLWt6be?KL`uA0Y`^=h%vW` zg&_?5t;5xAhA?8LtVDTDOnOaZJSIE_UenV(re&D>OPuOo`b&)bC5m&-tiM?Hlen59 zA7jyJ-fO`Ndct#{AkbXd<4;X1zrj(C$KTpGUR{sbur`1H~R;AZ+5K3UJ-|mH6=6; zUH8HLD*~SI1L94}TtCi3U zECak=o4K~tvSE?1$_uVx+3-M+se(y=HTZuOEc2rCuLkG40z7|pDV)LWR|nw?KEJvg z&fxH?!*B*~ztWPfUKK|_&s5cegM(k%)$5aO_%I0`dMtU0C^EdYoVNkzZ8^V%r5;CA zcvn?v%6i9mWveKqOdn+EY1vBbgJP*puiqK(=Lh(DiZxUnciiI(_H4Z+Q(f;^kB1)H zac^&R-q%?f=yhOm30z0GinJ}Wp%s^UnqZlS6%5?5a)CQmEO5t4#mX$tl>!8@GJ*W7 zDQ;BFewlyIm@kz=!AYaUdJR=Q1=?1ST#B_h}{p%L>>Yli+tkYxJ* zx6j8k`*8}hC&03hJl9Y*mMv$ZFhP+MJh?u;w#I&w*5;sfoh{y}{&&!)+I42LA3nX{ z2Lh8=SZ>2+YGu|oT0=K7hpEjZTA_(1oBr=NrR)Nmd;xsm6VSib4BaSuR9K4vGmrJn zJ$$AdZ^7HFOoM!c$3@B);wjuBrwVDGT0YD{5=vFIX!7--hs)rxR&Ub-=&Zkww6lMs;;_Y=9_Pto(YWSZ@ zK}wGOG~7RYV{KjPdxv1+07Kl%eM>UcB_F}%`J15EPvgTyYS(X2Nph~}KV>~{xC;7O z+Em1P-O~*cvJmJMb1$eE4~v;r%@8akTjQ}-RAbq(MwkrA>DF5C?c3#i3nnI++vR*~ ztwsx34YRSl^jKa5P|4J8m`#ZOuLdSt z^l%{Be~W#ly|r+Ewb!%1`c(Lv{Wd(xREY5KpBeqr}kwz zJCBXvSuotg)Jn}w;1QE^V#{d`FXkqy0?I#y_}VOn63<1>B`dVV>GN+RKmp4 zNri<}elY)Xem)Nt6rqf>>kAgFT62Ged*|mRGtTw|`n1pY%~)T;*jL;ih9*5}oyyG64eD>ac&{00B zzEp!1TZ>Dj4`lkh){Mp|s%96uu~=`%@wvu+mG-aGM_{mo&z$`hf_LGkwqf9gZH*S_ zx=D$ zU8nugLcizme3}>Gj$O?yZ>1nSdCBFOGV$3cp+bC|QD}e#{(})1YVvBDe-_z;S%~b9 zo)Pjy();qQov|IsQ$o0lac=EUU*1$5^h;prZnTQhKMHnL9TdBNvHoLy?}Dj|6&hoM zab$lim>09Zj$aaifhtH87Yx=gvZmiE+Io6+)gA5!v3JPBRoN88@}$Mq1FNs}Af}E$ zgj;FxMgYIZ4vyb@P$84Yu8!Yhf5-2!)8qF6?H;>79*%t=zsHV{--oq(>=JRz5&ef4 zFWf%>3y(bX7!K=%#4;Ym|%`hM6M zQko5cB&b&RfscLx){m?M*ivmolEJA4LsL>XUF3PF`9k| zpCPgj4estIo_k;%&Abm59)6X)SdNo#Bi=@MfyaGJr@{BM!?1UZ4|WT-SwD{P7srED_K)E6@AhMn`iT7s z3@|^ZHe4Kq*+e}1d39Kvg-@#Q#_j^vXyMhk@u*E3`#`~k$J6-DQh1D~x6zele=`M_ zFoWAcB>Qo7U;!mHo-WN@26LC?blKO1i*3Gv8$mfPxcLTdhpV^!QT4G}`@UgNxj(%V z6}Q;wZaB-P#6G1R1va!hA_OsG^zr88K+CYp=bFWfAgaEdpKsm(gVG7sr!s?RP;R`3 z{Te7>evgHey@&Y-nx4I%S^vk65ARnx;!{=Q7LEFz16V2V%YBDKdY>QmT(k2~V788vDP+N(`*VVPBff5xj#GkHT9njkpQm8~9hS8deUVm!K}DGJqMWwXcVj@<-qb zcSybql>lBVzn{Y1oLeY=Q{~#%FQyI6@U0HGP!5w`xlkT~H~#X*E5i`q6SbRjE9Kdk z$(yjW)v zxf)+AS1O;XZT`L3{HcUJqd!;$i)$C)PJqk~ESOjs7zOR`15MrVu4A6Qk_Cs-hw|*o z`D%F$R$8o~O23@N(SG^c5sP|>?kdlNa z2ke)ZSNU=3xCKh})xMXo>xRBCtfu^Qm(wTb2jHNhK5B4x3Un32f*jBwG%3g}oSNoG|vihA%&9IUPt7O_zyuBXY zacjixEBPVyn4OOK;r02LSV)BIVmZ*1`S8Ef`T>bR0EvkV4@Y2q`cJYD#K10|7jcz3 zc`nU+uJ=D2fLf}hw}IuBnw%s37Dqd1RQ9xLQ^V96d;OW!>kC%bR~*=S9!}X0Dtp9N ziHMqwY=n5QN=){_>&nzlr3(Aksz^hx9{z`1dCK*4_z;Bjbh)IST#&6Vn5U7w(Cp-6 zgWNinCO?e^leKbw_2SHQ>1iV;$@~RAOCVNIv6)%&WsKCWNp$1B2vjS4%ph4&E1Lwq z@z^S<$2}$f-CDQCVYc7YJ^3egI*P!zTWRi?v3p4 zFTror$pa_Dja0~H4U9DboVbYI1@pV7G^7Kf-k1$!FPz=sXjOm&YOr1 zB|W~#qi+?$>z$AOp^#kUS$W1!4~VOp%mC_)VKqcc8f##o7MwF$(u!BmaluRLcm<;b zyrYg+0n6?$NkJ66DaD%|aO3O091OBx{p>q%7kVDcE&b*!-{6aY?L+h;n)KU;tEyl+ z+g~yYl2vfDz`N}@?kj(+$qeE1c}=FU1mE`$)MUPZ&);Gt!%FXkR=e_Ikilnm7>(hD zSz&TrHOS#}J_Ij=V0?s!;Mo`q`KY_r8oEOy3E`JP_%x&l;XVw9+^xI<7%n3KI}=#| z*g9Yyspo8DklmFHL#sXoG8f2l6oOEgVJwJYj4s9c#k>4)9RxlCT#DPzJp>&Mr17lv z=x<@4`LR4}sLXE-)t591fe4K6pW6ouC(oaf1mS-0#%Czc&c~uQIyQb%Xf}xN;D130Y))(sB(`-ob@sM(b$U9QdXtHsKyRYCCz1SLVBI?=yi)@2l)(R=C4eh~ z%he`G#cRoBuwdl1;G#-=9|yj+4WH}BcMEa5H(x&dq&NHX#5)Na_KNS9hgq++{CaP4 z5$<;57JytrJp2<}f0_*s{IIAP_F^_?#D~Qk5nzoMVEAGDeIkDRZ?_NDlf?E8E~?Y3 z#`prZ_V)GWR$P>X<<%S4^Of%#9c$z_vR6YvvfLpF>v_2q^Bej4xq4Rt7U1CVlHNmr z#R<8dA=l;hda5fcFA0=ZuU@+#P`0pq;gZ0jU}#Bj>7vDf(lv=q0jnt~`9-170xW-g z(#0e1x;37>ZT`IX&YSHWhNpBtu=k0O+;1in!+nt01$d4Y`LCK&_?^+GjbGN$HP7qWcB>k^pilY1? zSbh;Kzv`mly!>a20zjaSWI0+OhQIHN$L_36tI?(!^o^WN5wz*@qUpQ>JI^h3*T_JlBxuTuh^o9OvqjNh5Ad z>pMLQnq2!CHx-~|F6P! zfob1HvY$a&I0EoDLhRcJt`dFY`n^ToEAeU_TwuI?BttGQbR8td+vX7$<{<$khhyD* zx_KDW{Fq4dYjYqiHO`l5anJ^f7$qTW*ytjM?>*t+lP4k9PmJ4-FAL#8Cn1Ml>Z`Lc z7xpt3cF2Xj;lli<&P=03W2GQcPV6QW&-MMa(D&D6`}fP|ioP7bQ2`J9P6JK0lFM2U zJWR5mIhnTDSm1YWbFsOo>nYN;2**6p#~S;N>Y~Pid);+a&c*sIg%79W@uWP7d|gWH zkH~U;Ec9XUC1B6yI#-OZzO;qc@eLH8x;RnC!!GP@7q*KS*Y~&!o75Qk_bbFcjdsg6 z*$1uh^0_cv3;(BqY6FH#|BovF$M7-=cWWOwpQ)$tl^DOi$p0x&j%}w5Zo4V$4Ge=a z8^Za=Z8$F7iv3{vlxR^f|4>mW02rP?0EQbVhl9V_zI2)_tZJU$PvC&ufh)rH+a zOyvplIqbsjc450**yAp2(uKXEF|0E$Jq+OI-lb0zEX#wj8rymah3$uH>F2q!$={vx zb1cU=$+n@aqhGi#+te%Pek^;f`qUj1kC(+=#Js2r4lJKh7rA{d>>x2-2S;4wJVipa zqo1Ac!b)A(r7kS)!Zx|EZ7%FK7dGO;?ss7aT-Z}CY}$nt(qN>@xde)&nAk_Lcyjf) zx+u_GR9uytpM^>8B4-KB9sSIk1f?e45_Cg`-$6gu5;8jg=&~Pc*Surtg z_l3lG*@Ru>>RseoUDypSY}iHL-7a#wT-f6-Y?4^H%%bSeULp1iWMbTA{n>xz`ZFw> z04>h&JeLup?nIQAMU0o%MwhtVE^_^voCWFbBzBEUyAop?jFa?yhz|{iT_10%<_g=M zaY^$iG1cZVuk-#6{)2gVHPn*{$1p{U0A=y(0_Ll>p+9V90isYHqH@kcjeqI z@&X1AoR91y*>ke8pAZihFrAV4r*LlDQDUlIvCQYu;+Gf$!7pfSMD%6ad;-gSw`-Y$ zO<0!eNf%GEotR1!6Q+iHODOj7GI91QB2Lfv* zS%Sl@Xah${-)hoF^Bs8BPZvVz(!zl3A4+IJkz7XPubddqUoA0utQ2yM8Y_YHlEi+3 zX^XK%^v^JF&OabhhKfVEyGZWyCI zcm%Bx<3<^vc{GVzhvB(?L997#&X!5d+&Wb}Acp-)l;VBG84pr`=YT{uV%6NMv)7^? zf*_xwxZl9Ixw61Dw0@9=6=o=m)pMbPf_5Y{gg3 zZ3U8@Rm1$XT0A3p=r@bEVEURaH6MqEgIr9Q1;^$#H~~aOAFU-_OQ_Ep!ZnWDa7~BJ z?bm9`thqO2Nwt{n*PxGv;qNZe_iR4gfNiv90v>)_p~corCi4p(%b&4m0?*_SZIX1n zt0#6GHCZk7tv!jRO|hOHkk4sZd>kzz`SR_((L{S9 znW$M^*Pz)F+Y+yD@GNZZ>gY&xLY6zbl8J?|;c`)LvZ;A98I@>lXz6L{NO%@r+tbz8 z4HaQHuv!W|FTopqGmiqbII9H}cvKJL3@8x4>*!=S#mi@UXbD&d6=X*`XPg3$nhE9j zIdGW=JVi;pdrdLNL=l=Dg7hF<0P-mN) zh=(=)JK}NT%FZ{4H){MWa6#1HO}LNZ2ENX~lLo#MIOf-Lp0snJJb6Zm2Z>)u{0ZWX z#4jTL67gZ;IA6!(e0X3${nNzN{H>0-|9mN@c#3$CxY`f@SK@KvUzO23zb5XvK!Sb5 z-vx!{R&FZ*3jZYe&yf69;*F&ee4F?eiTf8wpvL9z5DySn?f1vTgBpL1cv$17z|{ET?F#$OVu_@u_qg$FUTf13EG$)1k_cPr0L z2Kk$brxr;C8%WPi;*-QxJG!6v$YLqDlH`A=^b^PDSUi3M+|8cX4f3bMgQv(>nT)T> z`BLC+dTL1CvqZ{^y>__VL_D=raw4ZzeDo5jxQ+Bz5DzSuK$Y_+hzE(Qe*V+M!?-P%&kb=t2KM`*v4v%l*IP-%tU){u2`Iiw-X?oTXAJ*i1 ziH~UVUm!k8T)fYKDW4-$Z;wh!FBDCO)b0qr|6)f1mW9d7jMI zShWPJi7z$qwZ#3F6g-{eKV{%U#DgSXNb=ty9wt7E_*2B=8lQ8%w6l@;Pe}efz}?1| z5b$%@{@v$EzC&=;Iz1l6?;-u+8Y#GfWM)o(Yootda`EUO!wOG02}*>Tb_M z0}mVc8sM1U=__Qq;{5=)Od90xGVp!C-^KQw^Q1cbf|}mm_J+334a_f z&gO(8=F;9oFMbZb*EO^(fv*F&hb?Mu>uyc-G<3q=eJ|?l+}c5AF6m5cZAix8v-R!m zUCo}RYr1-pAh4-DzD1L0=}9CoYLgxnq?=|)XUkz(^WsIxu0>_BPp*k9ZfMOF#j@r_ zWy!9^i(>JWt!qB%&U17Lyc`i)DrC_Iu-0qc@Y$wY7EqS%&Pa!Uz@BwQ(LnrOwfiR79@b63wMx6sfc2)3F!H`TQ^ZBDpJ zVEoGVHhBBO6k3<)*^=mS3k?OUA#zt|XQJ6XHUvkSn-kscp^$Q2vZt-{S~uNg>sp&A znlrzBy$POQM__0XglgG!2vk5g&+Uvro>@m=D7Y4)^1M2ND@|-#X%j*(J z`A!YK9uxdHHg$QQ^MFt=*GQed5h}0gY)h_!Cfamuf|_w`4QN`X+B9BMc&sg66|W05 zY=JLw%PC(JL>1XmGbsrz&WfzS_lJ(7OBUkF#CEf;tjLLU$=W)uuB?bzm!klk?T813 zg5Z;?utW=_#^w+*x2YLo*=#yoe1=#y2U1M>$6|PE3o1K~6^JizRo1U(wH6Alfo9#+ z5%211ucREwc%e{bq9?hksS`Y+M+*v)2Sa}jA?R>R;yqo-uI8@xD-%7~%?sz@${lIO zoA5;}cxkMcqA$)VjCF2`tyziIR*HVV*IoZLInP_XD!RmJ;9~gpGbbspYU^z4ZB1-) z;-z(6&6}a~3B}r&zS^#9fy7rfBgfTcZCZESH?M+h2Z159b^w|6_$1#_-g0X0z9 z2d^@kJnkCqbJ(iDN6=4awkm9Mp%7%Ep*zvJ35O;&kS~U>s)ML3^NZm-?11oT1boe3 zLo6E8mh&A_6Sp=tA z@t#DT_#z`Px+Bri+`U~>SO$ez+0_9m#jMYfTTF22+D`RtK$GQk zluQAuH7i86XyRED#cVkRPG-;)wk!o>Ki1a<4$|6}+|;$TGp6}MC=+kDH z8iHvROkl+vR}ZY{g()*O`QDl4g%(4!wk?VJ+BzY?Tqd-rt+Tr?*>H_WQaO+6s~mx1 zG$KJq>hU#Iv3Tnzv9jwHHHg1l@i-HRI{g)Eu%ZK|f?%0+8L9$iA(k6y=akW1#u+-(XDC-RV3zelzb3i~Hg1NTI-EYE1uogz z13j(Q(O{`U$3dE%r5##|nW~F@tfmvbKn-8>p3ww_uXHpulP~HmGz5ENi8Q7mJ>HO;YEwVoR+rj+1W7mcKCWb_e0TE zmPxyLx}rnR#uS6v@l25e^pb1@mR04fdSGZ77I!NQA-(v>r;nT5FrLQ~8y4(nN;bEO zaW-4~WCSV|&yhXbyOUiG2N&sK6N0+!1JBt$BNQXb2VB=6s|hB5)HAc>grBR&3(HWat`K-jsKNPMgf+JelFoJXxwMxxZIT0kn6o-M zLaiNEfF$*MLe|;SFyRpYkV-jDZgD0o=4oP1Y!ZbhB+*LH+~YpGgxb5du1WOPw{;wM z!if)eF!@XLh~(L@=r9mE;gd`i%u*k{K~u4vu_rfUu0a1uiZ<1ODRsdH>_^C*9i}b; zw}vSc_hmR3lx(%hbC>Wsy&Z2jcP7OplFVjk;gIh41$P#Fe5O*?ud*Z(}1bww0>S_~b|WdKAo78cmB?$99DA+*OF zvj*ic%m^_Uz!SAtzi@ac6T)$^u5FWJnC5o4K9kBSG>FZ3#AT@oZTb_ltLbu*F!M2( zD+@}YT!OBeTC@jrH=(5+IDEl;#cc#r55%9=o7O7=qKPye07Gq zl#)ZS+**j13Ql?9@yRs-oSdvmBwM?j3-(H{G>{h1+!7WYZPaRj^^Xqcyhy1Ky*2D3 zxQB)oS3^e)tIS*B;kNP`-t?6Mxu%s9fz_#aGb~VT5niC>RoJt(H_?-uDCiQxAlctl zHZ`{vMVpC$oanM0jH(;{5LJLzQI zmaepPb0WDG>ms6e51PndxlE|aX9;8qen&z~Qx?HRuK!kTi_aXiw6R3wDz0cKxS|T5 zJ%)dH>cmweaqj5GGd!a+<whH#i->OyT08cM}b))E*pBX_1dN z0~NjmdWeSR+#0@1v4~YGhk3FBl?q(cYT(v6g7E>NK^f-=k$Smp&fq0N?{Q5dzmv0l z#}f3+D(600p6%0e&P3T+5^V*4bSZ|4Uhr{QN0{DHx}Ko`<)k}{(IFIE(bvA2018tD zRlqKreAvR?y#aP79963Y!&ZeMSUQg!vrQsps*>ec!!yUy!Q#%EA*(_Q&03*{%Bti> z%#bKkwK>yql{eIptI9h~y1*jnPo$-22Yaxoz^C7a)sa;(oI|f{ z?#OjTEJ$oox&}F$P%erZxl~7$O$MLzR>PL8qsVjd@ZqyoE}^rrRV=8Gfv|zl0e@}y zmorvMNIQ=sf$D2|d;8RiiYzA)S_jNZY~sz!uus8?IPI*FK)n#VB#&WhDuz?SPQR$ePVTaeN&g1KrJIk>HoD~ z1OqDhm&nj7PodCBeESPV74|Ka3m!|?Bs#jbIO53yC{)dkmdES6u`@@4imgYeYAJxh7 zBwXX6%cmutA&=kFfd`%{;7{p)e*sd-FM+e-A7y+w<1a8?$@r^`M;X6>Ui`&$F|SI0 znDHvc8&827I8eSC{*-(>;}+xU`_54wU&&SSHj~F!Zx#On@j1X|!Jj&wW%Brnt&%^+ zcrD|l6dBXSS8SF1<&5Jy)rt=?j<3cl{$0l7jIW#xH*lbS?hoCJe+-{@*dq?RkxHuD=i+&BdN##y3E?%I`kL zx&DKUbN#<(oXfw(IJf_PtPnW#{2pMO>;F09T>lGGtTwj$T-*kMaH@P>N|>c{px#)k#qe^irn+NnsKiG5yrVa6O42H|HC+! z$M0Fd1MT7Evxz=}pxeKVaSP%oe;Z(&>;EUlx&8I@p#@!kE8|>$ALCsAXBp@E3*Lpf zn(3csGS2mvFwXVk_ai7hT>lZqxjcMmAuG@IpT;K>S^1o)B z>&NdMz(X(pD;VecH!{xk_c6}(A7Px!s~<4Jbh-Z1<_mLX*z-ZgxqtqQajyRm<6Qrr z80Ye*!sqbuKzlaApYrEN80Yd6jC1|}!#J0JiE(Z}em)-$z5KT^&h-y4&h`HTbLnUp?-$`UdF4Le2Q_df0%Kue~fXwROw#%o?N<(jDPjLIo`zhLk9i}16Mx= zhULcfoDHA5#zW^HG4KNTJhPJTfD2`R2jiWLr-0& zoad{Lah|V>0%(o2Ckba&{$C9sm3#}F6@M&%bf&xqKHuxcOBmk@0!mMm@okK6V4SCW zfN^w5rRRSb=lS|Q<6M5|9JF#~zP`;kFNc>6y!hOlp6lRJ*>f)AJiigfd4506IL~i_ z@#~rXpEG_V&;LE+6(FzdxsUNn82=gL%NhR@ ze@=kjHYbN#i9bNMS7=lS(4%%%HvX8&o7{|n<`#(BCA8~D!| z=k~nJIM?I5IA;%+FJqj`uVS3bw=vG;`x)o*pJm)pKB1gFyj}YY`~wDlk%2Ea@XHN+ zje)l?{xw!#`HOP)-^ch_jPrb5VBkv(ywbqq27a}Hry0k7fSQTtPR4mX?qR%=Q3L;hf&aw7Uo-Id(p)+4eEo=V z?r+`8a`L>~ZeW~`FN2Kpe(dv%bN$aU&i(d<@?5(A1(#}E{)>T6SLEb*zVfj#!-4aV zAHko}Gly|5|31dKdO@Xm**MFK`9*iylX3V zQpBHyvnq!{1Amh7DJDPbBdA5{e-6${PX+P0z-GhW2<_`wO#U#Fzm@SLjQ>*8GePs- z>5qaC9GEXYUcCDo`ijy*&l&ia4gB8>{67r*A;!@jHDBG&_`|@J{Xb%y+xc_G`F!js<6Qof z8c+%cmK*2u7)L!=2Y8&R@luIB=V;tZ{Bp)00jBKV&iFD`FaO9mmw$?JF8?~?T>iYv zr2%?7YG<75$uQ3S=evx5gxUEU#=p+;^#9Jl(q(=X$=u zIM;KCaqd^A)#mKs`a_KKe8m~(`MQ;H-cG;GI3FLs%Q&~^DaLueo@Jcp>m|l{eO0f@ z<*S30{}qg57oz;|3NoM{LLiA z|H3$zKjn&?{>@C!ql`zHo*ytCWBjL#^KrH)p40y+rvE*RS2I0VGS1gs+YG#yabC_h zGS18S4#q#t?0JZBi`jF4aW4O~fxl$n1vnXk1M89NIgRlfAxzcRdlD480UWV_l!qax!uJ$_n&`Zocqrx=ipmW2a=XV?HufnWeq%{5}o{ST~&I}GUekvZP0oX5tv+|=Puf}I3 zuXw;9U#jucnGyswKKgD6%5_fZh7FvGVTPU59B1(L20e`i-fH088uyd^+ce&Kh6E{% zt8&|+arOJP!x~q=-@8-eO3#Ra-(%pT2ENO{#|->{flnCtK?9#O@IwYZZQw@@TsQ)R z>3-`);KJ4K2kP?02Kj)2mm0YG9YS4yxj{Z`;MnK8*{^=jP}jd+lUKi6-KcTpSFHx# zt#SOF7Cg3TeCN9)Pib7~-=Xm_zmy-=xRT##;3FDWU$T3T#{E92e^ld2|1JX`Gw=fj zK4IVo4SdqT4;lEhfgd$+F;GC(F&M`Tm0vI3z@c-$ffpNiz`#olJZRwM1|BwW%fRCX zzTUta4ZPLByA6Dsfu{_7hk*|p_)Y^KG4Oi~eAK{q8TgoiA29F<13zfslLmgsz^4uT zsDXQE9;o}d*TDS-UTok211~l3pn;bgc-X)#1CJZ{dIMMUWW9V^4f5R@Z!MDj$Tp3S zohEro<6h!BG_LxkVFTZ(@xVN(e?;Sr_&^QEJsR(xBl)PtRl2(jd`#mbr%F8sG!8#q zEshC|mwF{XsPWYKl201=A&ukr*5fg)ai!;|fs2=BAfBpUCGW+>5f|<^@L~fG75T;+Gzz;_z>h{nsQJnzxCMSN7_D&1WMK4#ztH0~$;6B_r>y3aw4`-x9# zJV5-A#)HJCH6A8@RO4~t>O+sJUK)veXF2`9o48-&DdNQ%A0{5q_y}?Jc}bP-DDj{s zKSsP<@)WCNc_?X6N`r|pE@xPPR?U~THvge?IPa60kjpG_69@83E-SAP3t8~TY z2gJjAL=nZkv*88~o%;>E*uVn@UTWY$jngu(r(ENfG|v;(xU%2U_*Eny*Z8N1uh+QJ z(`ewW2HtJp+YCHq;5!U_*uZxh_=thuW8k9(zRSSJ4E%tBPZ;A|;mHc`G zZ`AnrNl&ZBe@?tx<4XTF15X+F4g()H@SO%eV&L}}_^5&JGVn12KVaY!27b`MCk_0N zflnLwQ3F@c&AK0Y>3Le`egiKy@PL7r8hFsa%MCni;Ff{M4ScH#@{3!*0>)HfWy)_-Fo5%zFy!Us>EZA5(`)7)To&i= z55$-}=XD0&WZ+!}exrd882If59$=i7_61S%ab);M+lHRFCLgBzO&V{c`;^9q>HZFl zkJ9};8lRwheD?znWzV#{^{8;gRl9hG!W9pa|ET?I#pA^1(OL0Ex({ePMfYVIAEA3o zq?xL9o4F<9;*@j-4705dW6OgT%))9wz=XjmL?r{ZPEczeeJ3X!6~} zm0e0cMZAR0iVxF$xyDE6zE4-;31o^h^yy8B|l93h$cTm+;ghTpOPOXK40Tw#7i|kLHtsUPZDp{ zc;kmoq=liR8CwJg{8y5se3l->>m7@dFx<6MstM zjl`!l-c7ua-Um_nN)a#C_%QJcH9kT-tnpFe^%@@|uHHjY=}r*8L6e^(KCJO+;&*G@ zgD;Q6u}kBA;*V=QKzvf;LE^7yJWSl{lj$h?ljgJtIYkZXWCXJ5~-=^^i;-c7vZbeT>*obWHcLf)5aypedV#=D6(YCJ_e zsqtarJ2XB*{4R};5S7$K!gS}QGiDDz*I7vS>THTn)ufg~JQyE8$E)J0 zvnhU@(&6dj=S@{Sbq;_WV6jF`QN*c{ZeI8pr@3`bMc)e-s4J`hoew-JFIr3G8SO_o zWlyohp7Y_1>C-X|QIBW!n(U?H0%iGeA>5!&J${_x({wf)h5H=B5d5LeMR>yw75^43 zL3OLn*sb6-`V>DV>*U=CJrAj{fV!Y_7|w3x7ko|%q|TOSEI)k2)XNXEiRsVM3`kuK z5RT8wQ}%y7|EnOxE&b6`We$TB6Vt~>DLwsv0Opo{pg~4FQTlg)m|OajF6rY`Ur+yO zL;7Qs{x_r<+5h$Y{}Mvn()Z7i`9DZ8G5^>f>goGI3?)@Lk+|pDMtQYR0Xj>qG7h4% zD844<`9h;kMERej@fGurmnyze`z~O5 z+e6)B+wgyn=Q7P;?bfyJh=|vT|2@+mkZ0`H@lQ`5+k{*C(>rCnCrag6{jaCr)YH?n zePQ#$u8RZW2rXF}3{@;Ds|W@H@DC38e<&DST2>Yal$9-l|M6&?b91b=DnBo$G0*c+ zkspVNIk^ihA*S2>pcvv3;LcKuN2S!yU*rx= zd}(3ymFqa@c89%kWyu{*x$> z^bv2S+Pl1ZUh=}sy7~5#zI%^a1kaoh{R|GM8CH zb;SjheyifiWW?V8a2%}g-P=1qXX2yD_h;(nXRh~VD*btt^DKMrP<5W~-oK#cydU@d zvnZj%cZ>40$Ehr@&nieh4Y94vV#^-)-CO6CdhJIKf75q%*i)C;3g*4OeCxa<$jlzP z5)}8&x9hwcti0*HEyKdT%Ho1vux~sW!a!jmx2_uO0;9mROfM)qaQLBI{<3w;>^alj zo`iEBGgtUSPk@@C=xLtUUW(X{Swoe@QQy5&SR9L@_6x4{RRzTnwKqdm{W!DIJ9QoW zI1Tx4)P8Yh1%1%HKpqwqJJkuXt<3Vn|B3arR%Nqd>%6TMS?damUVBN}My4$@Smp!E zz%Z4^z0!C7*rLkU&Acbv%@g)itb-bV$)4Eq?#$Nt_8)!sPFn@bAlp;en4qShEkKdy z?uGg2^OeO|g2m87B;O;QNwza;VAP1Im&nz3=8E~?BK9;mi0|GoReSsUF<$op+O5B81u!tyyVtsLI6#8Z^h<$$#+AU$&QFxpQynC)n-NevNAra z;-#$t%bvCt8~|&qf3RNr^F#RaLlxCt=!NV9;GkiTAcz0xsjjTNBv4wtdhLQh*~0RL zO9G36p(Vkkixvk;*CaLttfr*o7llF#u*m3<%aeEA8c*Iff8KlN&GrsM7TyP8_=m@K z{4ZMMPv_@X%_;I$&2266Vi+xBc|MEbl_IoBlusW$bV~ow5T{; zP+b(bc1}?-fJl*dB}|x5*AA3{V;KK~pmhGnMN;`)MP4kUdyvC%t~`0l;VksR`3SNV zMgF1u6-C9j6-0{yw-#0wm8MUrE(+#X&nYU66a^wh#UQbw$Qzj}K1Og91|g< zA>v}$<8iS(c{~eyw|69)u7Pv1N1j{NRZpV5X(9fQp=aTyreu?6;WfRzo`ua_9UX~I zV4Ypb#6s|di+Yny&6_<7g?OU1p`{0Yh)=0EozaX!&r8SL!V6qSaGYbf%`%V|x~Ty^ z%fM;FPYW&ZoT3pq-#?w%BYYL4-Vc9R7y5Al0F+NrfbdI9J6(`Bn{FyXlD= z_y*vpXM*$$!#y5t@Q1vSCZWoY`-rP|8-y&+L{{#T;%E4-q6w1-rm*h5()@@ygM63{5&4~zB5GWNys?jf2GpX-PN7F#-G8Y zq%a=bdW3LO5`JG;n&7#X$!torCs+`q(b?6|(%y7!FEpM+!s85Y0BORmVF`0S_j z@OOE*p1lS=r;=aldM;(0>#1X$+q0i>eC|>9Jk2{QD=0f zy1x)EP$yM`!k&|jkNrN{70kwz7b^aV)?jdaq^faf`0`2Gk4woIpZhi{8lm_jnsQZs zD1!%%E9h!r_~VD#gAY)AEPtFmsQ9Y;}`LG9Ml+}hLw{)Bcra|}Fe;Oh*$&%pn|z;_$?uMIpO9+KVcKi9yk z3>-gy;-=>_2L3Grf84;IH}KQpS>7$(#Rh(*fp0Nz{M@pee*9dD8=o}rd|0G#lmCE$ zFE;Qi4E$3D{&@rc4+H<1fxm3v^I-wjEnj5@UT@$@1OIyi|BiwG%)nnZ@cFQ?>}LNW z17Bm{Ndy0)fj?m2PZ;>K23`Q~@VME3o`J^;!KzcS!Tw`WML-Bgh_~FNCGl8G9-i;vxF^#07={yiwTL@g7rO5Ev;AA zePxr${OA1V`|2F&)_v-!x3;(H*1cWzRsg;+0RMIX{y+f!hX8ymGM_j90r>m?eB{SQ z{aYM``d_l~xkk!;xHS^rchNe$7H?{ic zOVR? zvqshLS@}D~tcKC_dsf4t^?O#sq4axJ!y)y1R>Pt7dsf3C^m|srA@v*S974arID~%B zYB-dB&oVQQJcGJvsYB>D>U7kh-AFlve&-4stly?-@{O@3jYH`-D}9ua-bgvLej~HN z<9(u~>bzj>M%ck)H^4y6M%W?r8jMl38sVesGzf>#XfQ_8X9SO~%}il5U1s=bnvC#K z^%&u!jM4}lO@|SDC=CW>H2r1psG~Coqm0c69aVD?eh9q<;}BX4#;7`rmzIDjbfN`e z2kR`rK%GU{A#@guQFRvKqw6dPhtOFtM$=gYkFK*!VKkj(_-Hzd@KJRZ;iKp*LPyhC z1RqLgK^aYF89b`af-s8CB6L)pMff3f7K}saEEqnW#Se{e_}NK0e6GZ5qhW{7+{zK> zpLO_rrX1tpQ($flCD(Y-k!v};=e|5TKc8#*=*Y(>t(*%RpPzrK!O6!bq?|j$`275{ z4Ng8j+2q_TMhP4Nkt#oct-q&&wX;_w!#dIQb_VKQDhWen0{@O={{w=58i~do7a;#6!Jlf$xZ3?pe)-(zOvn68Q$GEV`={yr ze6H`HBmZ>e)Bo(=C_kTPi_?*RhVtouJS&;b&*$0GbmX6@eEMHJfd5g!KTGg058z)V z_|pY{SpdIT@Mj4ACj$7Lf^VM%jFt%CuM_-AA^(N|eoFAG1b<@yzfbUI3jRL^@V_Yd z=Lr5+1NdJPeEW=Jv~LCQza#iuGiBW!0sJ2c{&|*+>)iqTdji>nxr~kbiz<*uvXAA!R0RFpzuU93SNbHDk z{{A?|;LMMmlaMzdfbR(YM@Te|>!;{=k>lqF1wTT9aVG}wPZ9j6CF43RfInUE=Lr7H z0RH)cZ|7Q!Cig_i{6_`9R>-dpkbkk@*9rcj0R9reuNVA}2k;vNf1cp42;jE~zMVrd zT1NoCNAP1p{@MWk^@2ZN@IMp4|E%C&EciDE@INp3al!xR0RC45-_DI0ZF2zsn}UCd zkpG_n{O=3?LczZ?fPa_ZFA{vNf3g~|EOZT0eU3Lc$G0mr zMg1=g;2$mc9~1oY0R9Pr|8c=TIeyKm^0k2uJ^#5@@E;1`KO*F}3;q)U{AUDzmEb=g!2iAAcL@I80RC%&-zoTi z4&c8n`1TtJqa6s~+da%2uRbZ{mlW$8fBhd}aPqqa|EK`|v4Yu$uuMObG1b?mIUlPE-Oz_tU{*?jzs|DYFvtqR6 z0sNJM|7jt=J%Im7!M{%MR|oJvE%?_9zTKnk*PmX&zd`W-Awd4;1mAv(W3*cX_+JwI z^+Nu?2Jrt~@HYtl?E(Dn3I1mU{|5p59}9j;@P8V>-zNBJ!5;|V|3dJ41%Fon|8c>; zN${Tz;Qvdf)!Z`SCe2X6m%wKnm5;h7U-=&EA^Pey8K^Y`rVFc`_mr}EMNMSlNl=% z`h-v6{OOxz&pC^jIa>@>))J<+ykPBN&aA3B=e#i8;oD-^B|b1jRIVcU4RKQFGG)yV z78LJgwd`StOZ$~`*E;EwP$(7b3rnpB%Sp4$Zl-6g`dm6#4ikK}q0m6>F++uJ>b?SZ z!#f3#n3(2fF0OR8OgeJ^wxZa=ds9%o1OTq*79buYqjD%9ZD_Q?`!3Q5q z{qB#cZO3hlA2XCa=Dnezt?bKJZFl=Fhpz5&QeOa8wHtOLoh`GEiL4(gbZ*^-OKHTp zb?5lEH%=-uD$mZAd}h$wr21DDLQv!EKhZ0^KSeLsRzd%|aRLQ(Hk@42}5ri~o)?oa%(YJc4O zqxZDJdi$f^jY%i@`pp zHFd?AC6k==1Pm`VbtO*vb#&l~mre36o0NK?z)8PDa_0K5S46{?N2>}{In(1-IMI&K zGKNir<%2Q|RM+6)0!-QJBvuZL?>sHeYyIxdI`tUA)nzuS`k@hZsv@^n?Z5X9KvwvC zuUO^O={*-&GxdAb)vErZOSkLx`w4{%9+xY>o7!IDZg`idlX?v$aWlwwf8vjBrVAO` zpLovAsG%qBy>KsCLyM|=`;!lVmI?LtdvzhF_lW~gs(!ZZ_D!rgK4@7+T?5DZYoN?Y zwV0O4j08%BJW&9L#M^;PFuDqzg#$e!J(cw}*z( z{Z8-e$R@H?%}B@VNWN!EwUd5GlOn;Sh?D-dCb_{R*GYdyla@&mDn{gSnUlU+lcte$ zP(i0T>5Ei&UD-hDUs3l3ss#p8|3*J|C8OI7yzwok_Z#%;c5=Pc<`H+d<4y;8sg3YE zKUVG8;-%Olhwr{Dc$;$m4Hr*(;AFh+q;3V2{RD;&tw*V!mw8JjWs3o*{+9ZAnD>LQ z@22kA{?w!)ugK|r2dwNQ6h-A zlbO2E-Rx3sX7>GrBl~w2IK8w70AHcgTc~}-PVdvmqxVQv|F&$={`-pGaKDq7u#-08iZjGyA4ZXixJRRbkk|M#*ztZGB=9Gvi{{=Z20CM2wzGPSpu zt(lz+&CMi@p0e%SOz~fM-5t?>veQ9{6l-US-3j^<+NpXG zeQxSTj{M)#-evH9U3)9x{i60p;N@#QxYh7(fR|6E#HRt2hY|@~+)!p79!30Ekb0oR z+qV9fg>LU|Zy}70J6q;AR?m<2OuS(JoSw1k9~$e;o3sbKP`W>H6f_ZKP%6H`oy5g= zu6a&!piE=H^fAIv*j0q*O&Yun2B)Ffsl8C{H3zaUqZdKBfAD>P1=+`NcRNOSK4i14 z_@_pLVcS2^%at~90s%J2J;A~rEETg8pFj#+zq9_dW28Mf2+L?o$H{2bHpx5pn zW~v8U)sTvX`3($ut1%UoR2fQ??YZ*}J_HiujJB-}GU_Mly~62^o~0m4%-fOpb=7Vf_10qWklntvqUyo8w-pPPJGmCd|2OgYqMGrP#X%V*(S@cM}A~-%$_~yGkRWDx=AQz z&pBo;HfZN!FXYC*y{epgF7}X`iy15Gyl^gN`$=@MPAKO6b&2;E94?Vqs*^fekNYyc z3q^XEpzcq+(AzpG@f(xq$O+(1aId;L6T+NNmFudjtNP*Jb3Dp2_%FldM^VddQ4=%0 zx7^HRHSB1;!%+m2Yc5Elb?1~T-QgVBsl5-SDA#hm>nbMg*@=fx2A;utabAMzJ~h>e zkLlMCl5z>`*##1qi)8`wlI41CrWLf7}}NYPtHc*?MTMW zi1=db;IiKq%T0Ucpu)dR6npoN7Zh;9od^aa+FOWw^7g#)z}WvA#))VH{zEbe9R!7E4T-ed63bZNd*8cyhwQmpw5k*($&4ELdU*4} zJsj0yWDa_VC1c@eGP0jXDGxbL*rw2f{Go=~9Q$0>pg3PaD|r+raPT!1iXNt-tFe%e zt5?ukx<4O#P=9t(`w?pT^g-`)t|!M3`#xtLfSKb}Cspsf{|zDRDT$+@3rrn~YJ1A| zVKp_~<4Bd&O>MT zz&cptZ$#Br&Kq-A?9;M%N z{$HdH^8A=R6@aoUY)z}SGCktE6ono!13kj&4P)>g@z8M6zXw4+IGpsOKt}5F@1e`x zkS=xkC9vF_F53w_=bx|I8{cz4>ay!)`9v4PJ#^U_PQr}bPI||olgY2kDi;q8YF&N@ zEj+TrA2p)Py_1miL7hH(1EQ&#Pz8N|T>zC}dTI8Lhbtye7Z75`A&-YtYFqc&ZX|m6 z?C*e$_ZAHEf4L`&D#yh4QM4syimKGEw+&|s;pM0l2Mn3Hp3;9Wt3R-gK!=~tlvlN% z!VVU7^sp#&zBCf$;6A#%=oJ_D6^CNp5IbtT?-N7O#h3I|6fhYi@(WJ)@CF)pYWKLA z&u&%%6BQ+~g1^LTeizSlm2|sVer3$1H+zDUt_Cps2;Kjk^p|mmx6t&ZxVn8y3Su>n zJD)ifHyiQNn%a&T+vBmCXIEdopm%@rlg^f+*~dBQ%MpCTowKL5Y{K*i{@F{N^vS%Q zoc!t5laY&DdXQMCByur3#SPSjmTs&=D$hdjn*VgYJ?@#c6(xWXyrbMc>C_kN+E6H_ zONFk3_l~$XG__A244ahrO}sqKplIX6AUu)fRi0se8MUKVk_FyPia z>U`n8NXZjUn(u_(0ABcpw!K;$^WflCMH}Z7C2oYjI5kwfaZYif2mUdsp)nihj7hA7e{5=K?8Z4`6Ia1ME;Tf6 zPeTvbWa`(s=NwhJWvRCc zoLi1z-`G+_t=P*?iRY`nvL1yAZRNr=6;Xg(djwUYe(kYet+a5Vde z;rpq)e`5Il0jY}*Qx~^+2cU{aKotkvf~RV0&^B5X3wrktt75bubwH|Ov@mr*s$#S# zb-=1(v^aIZs$z6Z>VQ?n=-AW&tBTQasRLFOqa~>WRu!Y;QwOXnMkk~WSXGQpOdYVQ z7@d?lU{x`CMCyQ5#VAz~Z>Bj-9IO}~KRLimO?(U;7emBj-Ia0>`mOWX9%$kyLq^M{ zL+PX2SBLRvNB6HmoH|ffFjWt6_YZE?`suw*_1XsY(&O_;{dxfUHAm^!;0CBc9+!ks zh!Fq5CJ(Pw=kfnJGefi$6*@cF(|tD1A8Kqry9Wm@G@rd{UC$@mtv$4!vvDlfFeUVn z5I%VEdzWyfK3Cv#g+BNGEPMx_*A_+|I1i`05nttvjqj6-aEe;p#H;Z?IuV~WLlOMZ z@s*d(#h+cPzmot?N&6hnX}hIpPHDKWcuwiGo5$3aR^Bu=T3VeN7c1RW&@!R4I$By8 zEu97iPF&OHs<{(GcpQW_QwCfkKmH@+=0cpSb`#HJOBEOXw?0`-ox;|v{qsso=1nZT zDi<&Z3y>m+svh#VzK1SIIkyzfD=qJ1o^CEi$~TQc4pL)drO%I9HleflA%IPb0+G`s&ytzlJlG@o@;r|KxKW7YDUy=cyl zljzKzWQ=xnYCj25S*=dV3x%kL$D6R1cwN9cLygEfo69f%!if1e8 zc6aiIXAxG-sKSwg`nIVjfpPTja`GU%)8Fsh!7-3F(y@*U)sIgaS7Rl-A2RrQQ}=d! ztT4FUlcB~)U^NC`RtyiE8t=3h>#X?O;7B(Qw@i1J89dau28`3Eg3y?py$2&sMJ`e& z87c3Ge?=p#WDExt?Y;qU_8=g)a|%XcqFXP-$c3`@BFSPw~}r+pAw;137jzYW0u4E)H@pN7J?Di_fgE}zI(F7D0Gho2mPR|VkQ!=6tL z_mbzsxu-iH{*3^0|6?>D#^RzkG~-(_$$FM%BHts_6;X!&aH0dKpNV{kRE0M4@-$S*UQ zRdWj99`GZ@>RDUQ{|Y=`xxN#C-)ZFAMd)e{0r?LYeBTFf1E=N%xISm`as}&WJ-n|P zJo3SjI36M@|Cbp&9YHmHao8|CABr&W@($;pCYs8ZI`cq{7$P)vQbzGh@o6aeHTvvZp-q z#8NPk1sX%vIcngG3rc10l{sgX79Q;@l3mg|G7Nhei_D6EQ%-#ZWo9?fc$l(&I$G!` zW*}kZEHEalN%_L8iRp&w_(&XG_{Q|I*m|;DWlh@Gbli4v3qGleBs=SZ9Rv&60J&yRwZ$8a|2#Auk}I6 z4h5QHYLz|>8__oEWOb*fVMSYa2rag%@!IAPlxwv*A-Ant8P!g}9$G_N3kul10sGkbeU1zoAg9q7ZV3Tlb*g%Y0@7@bTsq zf%%vG83I2MVYXaN0XWaTp`#qh|6TyTI{^Qaz-4|M^XkBQ8;?KpI1NoVIMY1|e_zEP z-Gx5f)|>0Y)0!Sy;=^w>c#{wRXM=b7@S6>Ooe$q+@Lw6+=HI}fmwdQsrqH`WP8eic zuJLA~!}1ch{$e7G&whkdv$*L)vt%k?RP`}O?s0Q`4C&JWHM^{^uV?=`q>Uo+hf-6r@aBcHY% zzvaVid4K4`ZF&2BxGnF)KHQe~86R%T`$r#c%X`4!Hve`{=8**8SkI^6&*uLmA8zx1 zmJhf2ukqnF|MPsf&HrK_Zu7s)hui$$Y;ayG@MqoU1%9dpas86P{d#-5z)utWdj&4X z?Mo;Cj`cGYe|DU_+Tecq?Sel|@NW#@KWcC$e>(oG`=gL^20)wcD*`VDKFLJbA0X#l z!9P>T37d#aSC;owgR{J63H})Y{3^kpF8J3NoXIQs5qRKM3jPe-+j8{^{A_{qEF?PS zrxJgb|6_qq7C6sBq9dR6V}_T|UV+Pb%K?EO1HP4iwCUiKBj+tA30%%wDg`d*E$17Y z^~^5FXD3~);B%j@O?QEhA60DFPW9nd&J{w=Od+Sy$Nz|tqxU!J-({Gea}Cb3oap@d zyv~Q){G>&?=OCWV|L1*tE1zdV(OLO6KVR|Twp`x~kpF$bXWQ6$;N5~R=Ycx}F5Be= zfisUb{}avk49b@Jd7QwdepVUWmdobKseoff-n2^Gd|pO z=TO$*Y!^Acz3G=9p>(|am=`VPN6y1PXmHAr^YB{1m*ena!I$Z-GO!pOov;Nucm*9`?O~IG_uGD<+wS3!u z%MH$YsKTGk=M*2`_UqGpxRrCJkTX-rIp4>(9vZpWXf54Z9!HaPPs%XMi0f2rWh zay9$-wp^d^;Wph)A!nv2*Qb4aTdws!+?K1?hgoZEf4P4{~~+{*uv z54Yw0nZf<(KH%fqbf56yHr;1@xJ~y(A8ykfG`K(AV~ zTaE+A`uJ8qkN4qL&J-a>jsw$ueA_Q(`f%Hi&iCO~epJYp^>c9me~IABa$V!&+j2Ge zaGP$ckR!{L@bPWA*7a3xJ~z2A8ylq$>9EUi_H%@#L2b&ZlS;<0++Uoj~4h@rMQ8k9NF&_ zh<^q6ljB?11dz`^>uQb1;&xoR(udpic;E2h%Qz^)y{s=vHf7m$ca_WtoRx3a=eR!H z9`Mxe!|ghp^*-FL!@1Rm+jTe(_;9-pr`QzU=BMA$`3w7SyAFrzqUbE&uAh0#huift z(iS->`-~pM#qYwz?fMy8-&Vd|KeNZjx9ew^m;Z?iBQmST{QQ^`6*0auPRc>bQ#SHe zJ$u>Y5g+~l9|~~OjMDM5BGa+oolP~UxjJ!EJovQhGU-~r#r^5?w~Bn}?=v5CY&uMz zX;^s{=NL)MpZTuTbT(akU5Y^Km%I;$<=wE~&;2BVh*4jqi-h%^YsLc`X6xVHx5JaK z{Yn;ShV8d(KR&~4eA|9U0`s>WV{WYA|4``D`jY$a&wswWlU!ncG}~l428UOUxBm3` zj+HO{+c*h%<#{vD2~WGUc}3W5OlW+1 zRh6B8**;S6sY^ozYs(5gG-+H3_hk_0Z^(2?Uu#RtF2){^(2SmSs}haNaZPmVYpeCC z1@Bmzl?crc%igg9YgKaxunsH(nt{ws$4Wdb-I}53&8-bB-CTTh2*>jM{nobo6x*bo zZ|ymQg4dFdF)@cPli=mrPwQ-7r_Niy4daz_54k2Zm$PBz(hJSBs)d@mo3P;u%edfa zSg}005(~r-lw0jib)jC{xkwm(I^sf=6!t&)7e-{3GU(akFRTBa?|u2kjzuPuc8uV- z!F2q6m(LF3{{FiN7+tO&_3c6TX91^7fBeOU@4pPUs1D(?hghYLXyYGh?7qOn_eBqV z#t)c#fBFkee1Ds6G<<))Z2ejB^Wn)?|6FTMC+nZfdTe})2aVlZRcx%8HdlM`=b!if zypvmQh$ZIAZvjl(pMKET9X3M!<@cv=mP*>8JABBo`@Hk2_27N@V|V36ERl8*b%|gM zID-4~AIApwcVU601le_ssV!KZa$(cY8b9@R>dpAD=IGqbCV(x5J(Pk?oEvs9qO#0X zi+7L3_f!Li*!M0|43}1ow>#-AKySw;_nmh$-03YsEokF|?@Ko_8qI^B_$`+l9n zmlzWWv`&yHN3FZwn|E^{aWl!BO_T}T@vp3BZL)UHV8;>(cNN$wa=qe;1ngB^4_j~A z;w|mzF`jC9G_TGFjQ>?&OSXzOczesH=oQ9XRouH@Wo5(5SI$D}y)f57CX6K1dhv=1 zCw){2i<+*8KwFg2xtRA5)WP*&ut|wqf8h;Ix*UTzP@08m{Z zM+(>bxi*icv)^}T#i9x=HD{s@<_4jtnRG=fLQXB*ho4&u*F*8rU&e#dg;l3A?g!WL zX`OB-tZN|xb9gCYz>L%>A=vRl?#eT@6&2V-4R7@(x9_JFi;xBEOuuIc?|4>#ljcfR zXG>a#W=>^hY1N_cy9#l(?27KMom^0oDA#tRQuh})TVQ3@;>lNLpOX06>?uxqJt}JURZg16cdfq;*>Tc?sGS&Ub)sXq$K3b5pL-#r`^tYHuI)VNc(4`G)NnYOmc1ItO@z#8alMF}DWpcbQ8#!gcVm^d#O2wjx;R15|UhX#*AKisH{r8Bn(Pc-V(mL~Va zYW|XVk#_~Lz6Axdm&4pHdXsa@4%T(Ilji;z=N7(A%cK3{X{q{yMUdWUxMACeaaHY{EzgY)-nQ(JHtLXO)rX)f>7|fLOCoi= zp6sM&;5tyaRFxWeFGMLe&Kb)77D7_jRaA_3Zg~wcb86C8I|f!O7FivExuRNxrgS@M z#YygSGw})xC+eva^`7J~=j~O)tF>M81568D)c-wKOW`maSeE6>o~bv#TnajUkLrc2 zLNx4Fc0<|*+VGC@IrDa@PKhz*;EHCqF36sbq@x34L)pK=GrPm-J%FMP6iz_F*>>6A z)20PfAl|pisyBM=dgL>7kbbLY&0U-t!cN^A-%1|IYMh|8-|4*tilP~OYAS})yA@{t z$Qox@>2Cvo;Bf~Dx1A^Et8ersrs+^dWkll#D1wdcUi4RF!})9k$<(4< zs@)8RWi^~~I9~wMFy7Di%!IMK>Gk2F~mp)6M_4R z`!)<6IB?+2N2WY*>Uy|D*4wr%TlOF8*CUbIZEoNELYS(2B-HQr)mB8@)YC=o>Gz>? zQHR!q^XN}p@t{HbV6QHUr%T<1Yf7BYoP+_4g{{Q18zv)BYTY1rzh%t#XAeL}?TjGK z*_oIOWXFRhmBD*TszY`+wADApZ~)c@$LtXEJw+N;D4&d54o5~CNYZZM6$`wbG;#AV zOx$?y(Vp95OWeMW5*VYxEE-=zVmp}+*q%jw@q)n>mg&zl?U#DD;D%FTso52w#H?8A z!=c3GvD8Ok#q+5|682tG_hYv7i<&oZDhEEK)OveP&zU4thMFRH>RqqPs45e-Iq!C1 z(zv$oVvMEzWiia+27j#VXZd-z3EnX=Z|vYEJ#PDW$ceScmJ?eZ^TuVbL31iQKd!eg zdierxK$`%gp&y#GbG=_)hSFb|`JkIQDpMWzCRKP(xqY*K?)JqiDq&HlB7C};o9Tx_ z!FKOzOcU`i&!VDS%&}ngo`#G)^&uk;AiRJ;TmzuSz3qu3VjB*yLY?$(M&scHpT})( zTC0Y-HEk}sf*RoJsveAaPhx!ISquwd%&xb8?Qw}1H7lHFm@zYyyZIUR9yXvFyj5N6 zH=xvxE5&Hl0=u?5t{gTZI(+_vwG_-UU76*sY&(BG0aBUqM71x|)ADEf%YSC3osErb zfZnSi$xWpz*!M9IXpftLp?z3R>I7x|^*H?HOGw_`iSDb?g2$yt6=OZj=6oWq+h76S z=YF6@puwZX_!7@t$dKFY*aBfVzCy*072F@&@SYk99%pt@y$ihODHR=0%gpS7c;D=8G4CTf zuD2c9I=OEa1Qb`enQEKMnAe}YX)6bS>~{4$9;H#7-mih@W-ythdZ0DGhA6smjvKby zr0g1J&Qyf;TBc4-EB^DQQL1*MS(GWnH}`z(PpVDs&z{8b7C9{`*d6tjV6s{VEAPd- zRDu|!!`biQiRETKpn;2c88PPm7QsJLfvP#vs(r7BdA~9yzZQ7+t7AtVuiA}Q!8h&+ zQCBy-{3N1q!bX*aDuyXR=h=XJcD{ymm5FdC{RzzdQ0=LA3U2sdEHh3|p7_-q#-dAb zCPexj)dMc1s4j|%-o<`OZC}e<*ZXS4dR&twgCFF0Dl->p@SMC95ThJYfD2_bQ;TODnFV z$}Ll6!}wB-n{r!l>TqpgAx6ae`TawepG6*U(mbCw-se`MxQxcxS!Jy620X^q96ID~ zd!Z=i)oZolzy)Ekj1%V+`}AFI-{ePNP0j=69qZh3A!@_TbeHIg{^jiRRLaL4Xx-mJL{d%nLx<|_T77Za6NcVW1coQbkT_wzbE>)e5=>1kD zjuI7k_r-P=KLUv%w{xJPpwI5?) zx}snED|OPy6JBh4_o95z;c`rPPQeT;apD56S$~Fl5_CB>tLGc3gD(vCAIzIE2P#oI zqpK{-^HVTLq!E2Yz4Z3?%`fmCX5BcwZy{L}^mTHWH);kn##<2j-zcjppOZcw<9YT1 z{1f@d316n$xNMwRk5?lnR-N!>%zS2!#Zx`r7lA4r1rv#`w+KGnt-VDN=ca!{l)fw8 zW9)Kx)tND7{Dod&^u_nGcv&?o%B}fRa?suO$0BsFY9@u!->OQF%3t8&agFA@RW&n` zK{MZ4v6&=qk;2)`@S~Y;Rm}`Pn)z1M%D_o60s#o~RNL!Z(oJpg18gc&)e*qHOUZf4#CJlB9@|GZrs15gk1FzLXT zEqI=%2Q@GcuUQ!W;MqqH%0BNcd~c;+t2pKouC@+8+}@a9sUcU-vS>E=N{)Z#U;~bN ztQeh7Jla)3@D=A}RRl2!ae99P8s84^-Aj$kilKl#^Y*Io*Y)mq(tOsrsp~nz`YgOL zdJ~_FdxL}L>v`qTcw*zg25Xwx)N}69d0oXKEtv+4G2$l9#h1v?`VWValPm{z(|^Z= z7gg<6RD9f8bVKr+=Jjsyt12B#g>^Q1*P#RGjO)*J!;Oe<&#VpI>0$L)wZAR&;IHju z4sV$L$=u+78GSbfDhD}p*ZJ1psO~=T;7BSziAvq>I7q*DaQ>a$oM?ja zL;hEW5zY?P*44w}?cxS^;ext`x=SvH#o4n%)2EvsC3>dQI?6>7z>likjR(UkyE~Iz z(|eLFuuE}KPU^f%7cN=UaM_aj`q-69`t<1?ojKvwN<J6TL~Ca<5rz$s zrsfqayA~WQ4O!FG7Mk0cY+n(^&*u=<+=23cGKnf%!A#NIM~|uomPFNZC{zzKbM0Z3 z3+6UQQ&w4!^o;PL?#`9?)jiy}yt6xDS_fb3d%|l}Qmu_>jOEQp3qRG9pt2uMv^IxZ zVD+PO4f7A}Nb-mMo(oK}p$WA*L#E7VmhNV@){1aTcjqc!bZQCIqeHeu2C`BU{foCnCAFp{8KhAOuXg$?UG zK)+Nm+q!!axguUL!QWNJFJjM8RG1{vb!qBDWhV@?IpOBDZ3)B_eQ*5u+Rl!t30*0+ zC^jFek{UbK<*JWWg!s1oboW1H{KAg*b)!gN_H|iQM?6JJ5W~nR;Y-;viB@z{MQm(A zt?Slk?_7@B*DYk*Fl2h9z0!Kl`!v9ckH^aS*P2uSwQEf-CS%wZ=={>n#p|r`Nlu0E z_*ag$-e^bi=0ez>v^G*7$l3gaUDR5A1B0nC{D{ow(RvjVV=b>L4cJ#r70oNHYy?-^ z7@ae*8~%D_Zwc$Do**y@xvUSUAe*sh#kx~Z*b#@M_@C6ygg7b5I$ z+wW1Xl2@0rQCXL>89R@*FzZVrh4Ue;{veB&brVC&5PdQ00d7(;{te5zIA`xt*`HN* zHET;Z6%@XhH*0ezqPD7GF7zP7w5t3jjlq#=D4UupzpDK8%s9xo$7uNpjM~T$J0%*LnWH!9B4EJNEz55E?((;>W6Za`an3WS1?*z_z-{tB?-gWZkJ>PZ@Y;?`N;mlTc{dgG{Lbl<`s?SoEJcf)H)c$?22r^fBm%tSJm zqFgTgI9H;Kbo?l8^B_YW3c#NV!2cY84+Y?3QSbTE4YIq*r62kDrv>2C1MrIia2{lk zPyWIH{E7g4SpeP=fUga}Zw$b13c&e8V!r&}7J&a-0RHU&{QCj;mH_-`0XS`9=ga5A zz_}K&(sUs8yn*h#7{GtU@+W}=r=BUea$N)MgW5D~zdOO;ij032=a@}?*aTRdzkOR7 zHV&`x0Q{-|d^vEID`JGH=Mv=f1n^SDQ24u*EX+PgI9zZ)#p^!SX_Wrm7x~KZ0_LuVvo(_hlzxn@Rqg0nlpr*%ugnpY45YMNwZ*avAJV)2rq;y8WQWe zl;OvASQ2gP=usvl*FkVwlQIX{wJzkhEQth_^~jbET0~r>ZIW8sq%F!MX$w+NMn$dd zM`J}4QJY$o%}V5t@;i(f%9bW&xwI#N_owbqi+ZbXAwk);#A0Di){!7;M`a6EDm6$s zG$3hTF<=svZ>v4R+9imlophM8+^TYyi=^JP8uV8PCD^=|GQI9bZR(ZjS(ptSYT;*t z=8$QJ22|k6L~979JDX5xV7GU|TC9ztHA}RC)-+wy4XW8@qV-nxAg|_g1=_zI4b`y1 zG>55_t|Y3KFJ_^U2`Fovx#ZNHQVHZl#k5&5#Ya`+Z5~xkaU%#l3T$Gh2lH*PEE&jRP%(c%Rp!to-@b&SA|Lzv~$ZZ;h+AHtu- zKPzy)M_T;r0zX0E-!-_+zb#k4;GZb?y9Iud!0qC328RV6#kfgFd_$N1S=F{APi(jxF9La4F|GfpaaS<=<+i{FHy1z@@!R*)GeB!jL~z@H-67 zdgH8D{WO7VQt+nhu~8OE&f{}pH0LzqkBp4Wxu$P8G++P@>dz0<>Dt}EB{u3 z%l`XKfy;XSuEBX>7Q$v6`Jv#;dfp*$Dd!;}N9xrh0;l}V_@jGL$dU510+;gl`Q$vW zq`)qb;7d6rW5m%BeCq^T{wf zJ}egeO2L=*?PR-rPw=HaJT2t2T({wmZbP<^Ie4bl=?Z&;I>?Lygf$nX9+oBflK)_g&a=3snc{D z1wV>=o6m0uz8nwlHn`Q>Q{ ze_cf7fV1uOJ$)OhH8|zV_o<5oJ{MtD{t|)L3cOR`ay(ftaQPnheSypRywl(|pSIra z5`0+?4+~u8^9g~=eEwG8lK-l~t^O=C_5X(8OZ_=Q*f*LZ>S40LrTkM2Zsp%*&?$ZL7ay)^{bfw)X$^Vkz%XBvjT=Ksy zaOTJA+jj*n<^0s(wm!F-`aECg|M^1Bb|FXV4=BoU805J0eSMqzMr!dp4IVaECTEgV zi0i`_nftU4x6h-W`tXPmHi-$sS^4%m|CN5+%wK=%!z1Q-ImyV&$uad3_TdqO%kMCx z*zeD4eSGyXN#*c=_AiX+wr-`Qh`HHm+RKKSV%gh3J2%tL(3D-~dCch^(x|zY-yUeP-#=ik;Bv5wW26B`19u zN@JI|y4cFxRkhpOsc6_B)Z2$pZixD)+KPEjnuc>+Y~OXUkT*?#ZU-KHF1FXGg~w4( z@5(B8vahRfOd(VQNneRfE%gSl%zZPmfGwAOv&X7UjtFa4>8afs*t+mRBe|OU+^MW} zRj*V%qbRjS*HtWK8jIo(w+t(lBM`=o^(CQN@4AZCP1xdp50%mGGlEbjU4jO5w%n|Q z#WScO*1>DemTlN98^X5n6NcAD$5K1F*WAekCSTzWf%_2!JMRZKV>>987MFyQm1c+L zA8lQwA4e)%kzFj}j$n_<4mO3@JK&zVxMCS<+Vvh)QL1*|#eobq2XghDJeIrgxtUc< zRhi!cv8>)@I#w=FB{ld()WMakVqCcg8#SG7l};sOoz$_R4`j4V%T|sNgX7v>cB=y=$qr9~(o;xl!|YwTsT_<)#3&!!Fi0 zdz`an-0X`IM{C0aWd$Y467G0mzgL-tT(sJ@_~~z*K2VUro>Anv25sl`@u=Hc>>HVk z9Y1Wvf;w)ynu>y$wbaq|AGyluJq=~x_PRyPVl~?c*@Rlyy6+vM2;4qn7Hk*1uk8xM@`tn(8m?eFhC0 zN&YkT8V&w{(i(Jbu4D|A6Kr`%%QSyIlCNZc2nwJ@^F)4gQ$& zm)(Vepp!o>`*iPFh@Slk-ZNB1%2?U&BfLnAB~@~)LIi<=~SKL%I`BA?){GAbUvKlm-69r1Mv9) zIOnGM5x2kUXPl;-AZ=^1(a zF4wv6Tvc54vX?HiLIgVtxF|=O7PhiE&j5=`3_+5{Q{TiHZegsUMAzu^1mi1kiaGXXw2T| z7%aaOEx2 zDZw9|eRt)z58|dd8Km3?{24O1Q8#m^^`A2T*7*E(LYa14u!3#+hx&HF=Zrs3lri@( z^S{u<_qVBQ;g!_-oVD-NND)o5c^fjv5&UW+jsZMmX?+`_j>!by>-&IcM4CxudnzY3;JsY z5+Avj-*m83v^+~e`klqao44I;3SXuqx|OVZYVi;Dn7nuH<%qZke<9_IZe^|BMb6#i z+`|yF=Xa!h2K+zguYpUO6W!~=*jjk%if~VJQ_qa>g65u{#+BTRsMcy?L*sBL`f?-p zX26z*)vFD|qY`$rLoHL_T29iDbcbMp$6X+!a+veYL-DY9x&uwl*(Iqeiz7wqbk&|(PA;(@R&Bx5i`By;xx?jP z`dEj4t=f&+*3BjEXbhin;B=%{mt)g5ctt$c9QR3J+hRdz`Q*NW~y8ODO z_^sGs4)tPM2~9)kxZk-EX|C!*m8=MJE&MQv6=XO)P|dcMHc-rFVpS8YN0k};GySH! zxu-MP-Gu5@y32MSyO&q4oQu8MjcWI~5|yV;bAWXF*T?Z&)<=Ru**Qzph zcAH^X*GABolIv5d=&ji449#YP^t|6)%fa7{I9Imcj_e#M49w0o{}F!dWevAYC@r~o zV&M{+&sXm7Z0L`+-!!+ulxFy=W>o$EVxK9?o^L;?#?6FMRnYLiBJ~zOd~bb4>W#zR z4PW!^>*U;6esi*I#Wilk?K_WZFJRO0XEAtl?i~2?;d27;iv#ehfJ>YIZ{c3KW=InwuNcP#fxLZ*J}iHQ;keqLq)%hSiPT{1l>O(4#lJ zn0v}nqL|JlIyE(~m)|Nn1unlycm`)Zn%7r_Y!ZCFyW4kMu92c+JNvzJWuF1WrDGHl({!Uvl+uhryTmaJvq#)rZ>`wJsk%%_#g@A8y~>*8A{{ zhHvYY*nsf13|~-r$>k_aSdY5INm zTEl<9hu>lFT|WFtgForR`2!{0^Xk8DKc$BT-{ZqK8hoD*zr)~RgR@#p)hJ|^4=*$K z|IPdQ)q;Wp`u`stnNl$iT+b3GGR;-*;*YCv4x8b*{a z?7Ke=_iUPo55L`{zsFP}$1tYhPoLj@i22ihiXjBM;*T{NoV8P>tY1bUnxoOA8Qgi)VHgvO?+SUP@T=FFTkd2;cgRO>MFxr6MvB< znyX*zD&YCrZxbIbaJF1*KR#P*e5*e}->&Swtm`O5IDh_m@6S8w<>Pgv+e`#zCtv!c z`E`de?;sg&g}&te`_pf2>}ehTauq)0x2yAOYVcKy?(o;WRNDzCauHEEG3#EIEbx9A zUAzEB{k?r^DF#m+QAR@Fb^C6dM%!!d&UyP7We@-1Xo3sXdIhc{fGy!`5j?kyMRL7s zv7F=-*PF|Q2@%)BQkuD8T0^r&c(>yWjon){_cE6u#ys5cw=-p=^u5bqf6v9Ljl?8p(=m}OTLyKV45KOo4vY{#W#cCdNZd!?0 zslkG%TDUo7``|^x^{LJr;CiIWp+}G!8?6$??rI)S)ZqXXrtVh4!C2yy z=Euxsbm;ODm;wC?vs&Vn$1?L^GH{10*74|Xo=j;$CRx59(_F@6keZXe5dwHbK%$}y zxki@DAox&K6wiE4C;U-eKe4{W6{>=sSW^^x6{^-Yy zSrv_5qwGY(PA3a{AXbz_TOkA4>p{f&3-^)1?B}txz^()0w_di;q&>*9`k;%C!Qxx6 zSXY*Md0GaBkD&&sw@}-cpwZ%)&S~zp=Zj0r&2&2X%0hKRw@KIdzEIdGgqaF?xb+C8U5&W(_X(`C&tIniT*G-HD$r01GOPQxRe?=#2GY``kzNFhQ<}K@r{4_qjDYc?WIhqONoa zx<6JWxfl+XaXA`uw!nMc^@=Ov-t%?dUvV8oAPVY6)saU4IB$|4um_o{( zbcSl?wc}iapK=APfT$~N~x*h_YLXW%jF_AahKsyr(Sg(^-iFa^R=wf2h2XzHP2l!1i{XU|v4upT+^ z>BFMzQllp>>g$ngDqApR+u)bcUJzN5Jeh4?$z}_)8BTu^^#v2=ZxuuOB-dM0;*DdX zTpL-bQ~IUq^0gS(_U|ZUe69@TQodaLViUi}^)4y##@hJPR5N7zY<$W@Q*gSFT?;Vo zy;VmO?mKF|w^Gj+VF6ikGCMA$LsQK7W^tK{ z8l7_Af|_4*h^%;t7dk?L;r#QB4FGlEvCH$4o>*sh4yWT~a!f4HXv{?=t z$Fw1g<8G?@V;5qOilG+Eo!*DIF0BA#ImfMgal`mARoxsgVnv)3U@c~LgM6MqR&{h| zoq90A3Vg}n*R)Mr4gzdhH41PDPzMQZTHxKcfCIt)?087Q^P*^Wg-(N_@dV300G!QL zjpDIHb>7)AZ(d2Z9wi(;BTSE%sh3+ZEx~zZ&m@o0V_s@Us~GTbrUC{~q~_wmRh#L= z1O`pT-}ZG=RbpwR9!k+~v`X>e7-5q|I8xBF2*aA1<3RVmcsu;jp-bIZ-vX7(2u}~g zSip9B)cNcJh{lO2?jw6sdkcVVd!g7Z*c-3u#t88!!ZL+;mL|)y3srYV|IDBZ;oZUv$LoLJ#_QqA8mTWj8mVvkJ@9voZ!HE>{ATG`G(k@_y}3dE2dd z*tzL(G%L)xPuZngAU-A(tNFQ;K11cUFqXL#Lk>pD%h2J~un_ZL3H^bX2OO1;1H(+W z+hqIO;xTAzcDPqF#T8y5R{EO9E0rCyH?$O{R9KA4cBB^WRv8_sz8wGimS9ZC{t!&v zulW4dkM7Fs#R^@IyqkW?383z!mD%a4e?ecerzmAhlLns3zbQ?21%gcX6H)&WQI%T$ zj2XNSo!2O`o0*S_xVR)U!JCNn?Ad=oIIdN@vmd1oMVRKE!V2%Zq`E{#ud^~| zM!mx9caX(62L4C(pxKbZ;8$HNQ{b@&9JP6f$mv;kTNbm5qPVw<5_!}YT4_WBLF8-M ztCXlmOoVI)ayI-vBIjqW_ZPe(K8h*yT0KQWzmH>*vn;XB%+s9oU(xMyb2SVqubKXZ zd6A;VJuc*rd%4M4@`S+))w~R^CxCUhoropEZq5CP7wyotRt#-+ojmFsFP!Lz3-Cak zRtF`=AcvhFcsM1;sHRo@Mh#@pW=yE`(~^T4`_UpEewgbnl(Z;@2@eI7p*x^2mpGpt zP<@mWK;20YSULRY+lElxZ!sY?1?JTB5DEKUfEKY3=JDs;#BC;Zeb+#zaJoix%Jy31 zvgSD_{SQp5|8Anr!m77-Q6-JrI+r zanfCg?^Qz-M{P_uzlM8V5&n^32TwN zvs5t^6LqV|xysfRj3ITIdWK}atsfs40oYemiIpfNC(on5uI3FVU5SkFz$KTjc${Uq zJSyP|bP+s1YB3)~7l{|VRhy{>^sZ)=L->gIG(2zdaR54Qhp2HF7g89z(jMqI)Cx}v zon1CT28TQ#C(z%J>wOe{yb^SR7e`l~$Qmj~Q+cf@HN3fZ-;pVfm_R`54rJRQK~)#3 z%EOUQ3-LV%=R;+Gg5PmAxixFbS09Dre~R6rHPc+on)N9ORsH&!8H<50F-biJisntj zSrR30Y?o(tUCvXg@T!)Xhlk0UX?WYh;gv%%@6R|C4rhGgC?I#+?~4b^O#f8hdTIs} zQ=ug%VqAJPI`kM0<=mrtvg+8;Yqk%MHyW?%2lzMa1_=I5*F|@?pVV%GpZfv&3Spo5 z=At-l4%e5$=J3U(m4#7Q9G)vI4$qyqaHI)hZ4aQ8GT@f+A7tHJ2ph%LUiC+nWowu# z*4$gkfotGDKX>skcLjp`$${GgrT6by7`Dl*_AJzvt}jp)lB;2-*=OJxcCt6-wftO* zZ|q!^HjVP(xE7YbWnY5KE`wLi`f%kq;ZJ`KZCERt&?fz5h1caxWd6j$zPzTQV-wj9 z-!N&<;0tcPeHqHOwMt`NX@5cCC3$7lPGo)UGqPGZz>F@dwsdpBrFlioomljP{I;!G zT_Lug{Y~vxd=m^zN7>_^S9(W5;hMY&xf6>{&7V+oVj=T(u&M4j6AM@54Tw%GLss_T zc}vINbm)i`Gmmg)TX%?cUT&~!8G!uXQV3h;eMNIh!#C63_DyWp)L5ncu(ypcaOQD& z0|IkEEtKT&);RoMyAK9ke#DvtHP!&*nsBy_-<<(~YZW$`fMw=-KCb!r^}xyBXLxE% zfuFxA5np8bgBm}8EjM_?w7=@_z&>g4Wd>LM9oP*9-^Km}r}`+aefZ0lpRWLCx^~%y z>W9GoGl0Lv@Vm@!MXEmmyWilEqu_zF`pg#-%3o%1tJA+X_7D~hEQiomrOexsr`3`@(J6I^tmnLIoqcc-nV=5Dc;ayU$zj5Wq(t))^c zMz7)wb#->-jF{S>WEVP)+BBmQgr!rS#F0w_%Us*Bx-WMRL#sH#rJ2Q^&VO(m4*2_) zU9&OYv@db~9%u0rIQGK%@oNOm-{~y>XJ%bG`P3nc|J<~rU(O!|F4vH}jJR~p^P%sj+UvmF#y<3210llB!+-J_J*2X8^$8YX- z?+nw7sD$-z?l>;j_4Xz3nszKcEhO+wr5o>RW$HC_ZOQgc?oQRKTzvLdJ4@WmG5mc9 z)DzsyC7|M?5wE=uCh!gINNzt_Pw{;Ff_Z?!Kd3j^;ddasUFqYGk#OQf>`WOyIF;X` zUHq_^!SDCR%mjaoei?6|C0AXo-`!OBr}4G#TC*!f5MRs@BO$C9c<){+25o2P^Ez`U zw&8sa-}9frTW48fs+&356nKs8}7aDLsLEKO+e1ye5kuJ=rfcxP1g_f~S^ z;PLvmFBc!A`0ATMmEcQ_OWDc2td_JA#IJ)xiDPrWdAj(;fj>C(4kiEm#`ZV1M;F73 zH%_j6U{xiZ!3tGBnX4f2nZ&X9(G{)3S4|Wr%U4R(E>~TR_sXU3|Gkp$OLYD{<{TsK zJ0-^_I%0N=;h00m`-g_iOv&nOD7)aMyROH1k}HrgYRl+C%dCeDgnoEXnF!u#r~ zT%3#1;h5$(40oEj65DG0VRM~@>qEx>5neIJzqxQ;?!C21OT~L@9j5)|$R#KIaQ|=4 z&stEfXv9icjj@i@99ZAx_V#kjCGOXU6Aa#E_(~_>pNc=Wo8MIfpqyPMK`MzpsOwojVo4YkD0zQOs!kyY;@$#ZWV-0 zCF(Q*vu9jk-8k#7yQf*pF((74fHjTnn81I5X~OYQBIky8D)eCdrvdmM1uo~jVS$^+ zl|tAr=!o&Jk~eU!zU1&ObAO!=x9xJf54ZI%^GW%({%t&)uC0F~=5M})5tB_BG}rr; z@8MeJODSlsce{BvSZ4U|cdqBKpn04xJF5S%PxbPp2#_{J!c4ty*!eoa!BN zedW0`-@je4J2*HS7g1NUzVeEw`NCa`Sx4rINtt=YZ#bQ$nUnCprL4v2dtp9!F$p&hflwbt;2XGk8aEx42>cUneh%>eu=g(TQB~LecqWMw1UXTu z#z*UL8{0&zW)y8wXq_Q5$r+t!T0rTo3dln(CZAAf|NKAqbI<29bIw_3Kh|D*?X}n5 zd+oJ1si{E>A-T)Z$c>&KE+>!UieR%!|&#UmvykEx;`Ago!2l1vpir*V} z1`d)xaAVlH+W-eHZ*}4wxCtIi?|rJGjD8!0hz$JdaM;NoW_ z8GPN&ATQx>+Is#y!@oX;TEi!%c1h=~fHnW^3OwErsb0!&|CnW6vYXHy6?kGU{rnQJ z`gh}9qQ5-Ln!l@pfl-?NT@1Vvfq`qt>R*eG19x;5~(@J&boxy0;l_s+}joDn?_&toA07-`oSGYW2t9NYRYgdl0De9 z=1Ao87DByS;aMI`-#YA^zxDP7o%gYF*6Hiw!q*C9vUC(GZ2o%{LErm<^c}};n&+(! zdNu@{jZNu0s^+9`HOD=vre1(#ISWZ~)jC81)?fL!QTx!^wAB z-+RwNfPWn1TNChX3XTGE5GfxSaeL6S5w~{)u}jv|3EA492O;_qqAC5GLyqrR+#GbC z^`Ruwb`Y)p$N4;WPtXIxqSC-OAg2lh}l?C@Et7LtZY~9Pm8P zm?$K8n^6%b(6!dW3vlUwE8tlhO5b&~=eDLj0S7e;QU-jF;|p>k#-UNK(7o4E07IUB zmZ&LxSLrjiw_Or+wuC&dutW&=42sCAdfvAt=-G;rA(Zd#U5M&Di?RiMFZ1i>QNZ!# zpeNIuzH7{%zJv95=Lr-fNWm*-eZsl ziA%`yS}1+*;TInFg@K^6HR#(iY7PE^o_82xeb<_!fd&GM@c+f%>3|xU;Ha1R?|EBD z(6#yqLE}r`{PzpK6mZrCd{2Z%ZR5XZXH)v#ul!fz0O?mcmMjW zj|O7^(th#T(zzE264}hbgtgy~9G_O?55kyoX%>Um1HN@3=RJ}?ee0p)8$Q^FY6zAw zNcyIVg#(u_HW>M~2Ru&!pFr2TW55a_&-S429nS`|`d7PFe-0IoCj4*zHtlDZ2Ay|; zzOBe~^zi!E_OKys0V-WdIPXUq5z^yXiSw~FfJ^0AO4tN&4 z`wlX}SI~CtP~pG3j_t( zf8yCJX=-2l@ut^__7f1gU2BmgkX#F7kP%QtD}D5HC^GUqdH45zbu1(TQQfNBA9$cr zx4)U^+yw*DOelTFVZZ<4t#<-7U~*jW-)eUToi}|Oc0GyQfrDqm&__e*TMugJxaA`s zU`Y8lqkpvT_(tdPu1AmB^|-Uf^XRUPL;HRIfJpJYvTH-vKMwcw4}FeVKG(J85YKZ% zH~1g{Hz1MP?r(o*X25y2YxS_et_=`&Lsth_K^xcufLg1M3V2onp`(7dcK8p_@jxtX z4(!?(8j8AK6M`TEuGj5+YadI#=I~wo{$R+nCOC9skj%pG!#13sNCutN$axo}*-aH^ zU%zxNx|@)*9-(&*-4NKdJ_tH{o^49sdf4XIPuL6adLTq>Rt0?PL!MOuXG5TC)lon( z;8_(K+BH6X?}0a7KVetEx0<*j-pEGJuZhHJg#<)oS8yoEygYr=uwNchaTd~i9+?7( zru4{zg3j_?8x@kCHC=0ljZY6hH0Z1W)evQ)=N+`oSG(36w=!1u62h8)8&V={Whg=-ZwhLC@YGy7sc>;V?}OdR99}u#8>K+2FJ0;e%|LN_vNQz8Jcwx4GQ8^U=3@ zn=AG{fB)^h&BL#lcyeWLvkc67n`Qo~TicDF8+LX$AsYo?frp_Lj9=X0@ zy>o8m6=m@*54g6gudHk9=RIrUn@!@8G|6quwoCnEZL{jH8Wt& zo@1Fmy{`#9@gM|Ke_Xbbxlm4`;4=03Z+IrWL&K#`0Xqr5{CP5fJ9Mm zMZ&Ae4bGXi1W%nff7)dWcv`G}57SmbeVU{#0kY?&B6!m!mra|)qf}{>pf7VK9H*At zbEXFmR{;oj&w)N&1b)57KR+F>N+vr8s$a8vWEq~nd755k&BDM99arR~W9Vhl`>b~_ zBC@Fzo9p}`3-7w}>#*2d=MEiks*cOzF`o+kUZw9}((wGb%8hyX>fn-wdFK5D{Fvrv zjbCi8)8zkI=Q_oCDG|)ONCWp(Y_8M9-{B67XG1>&J_8Ts`1uV$-&^(k+*JKe`co#D z_=f%rmQOoI*`e)EKI>d(tHo4uK0nwzxQ3mdf3bD#4$VJdCgQsC>38X@DHqP44Hrpz zbvt{8!YPH%P-x&m3UYn&z2s)SfoS*z7eC5^7Sr6=_%&}$^I4N>y<<+SKk-!W$#uR{ z>rOlQ6mQM9;CIW0S1W;k#pkR2r>lTb8b6)*35@sNeJBe;M#X zvgVVtU{b@;h2zkc~RS#v7F<>SPtm+AQVxBRfh+PaA!%1aNn||?3v$*kbZT;jiW9mO`TW@zUmtQb3ej~8ik)9*4 zPkmC*St%wa&Mw&w4-1oFL8mAFdSxGD*iL*iZoW=p5%R9D@hq&irt8+s2-%00(p}oU$MjeXc+X!0>*uy-q8DCUBsRwwMXSHQ0zM{%m zug1s9q9tczG9hpuB`T~v{$7f-u~VE?X{UZ9$fW+pRBe5H2zG46ci>%i7bG`cWj);P z`U>lkg)12OJMMiAIh&jK4c?NdKXo@#=v~Zz7DKR1zIoM9-+=R$yc8&k8qH=9g`Ndy zB=adnZ1MdIW00m9zx;_AV4RVr?Z!=Iu-;!(9_0RoGcdYH58l4OI1?Ej*ChVIsv{1U zb?xQXji`jp3DY&oI^Tm{irlR*PXJt5S%iz5WER+rr(J>FR5GH&%>`!_)CkxuLPXwcr~iR1AsY2!vALx zcu7vUmCysHl5{h&rwhQH;f&ZkWr%&rT=jK-%Mm!dn=@s<=*oldl<3S$=VjB=Rw&|Y za!_74OJIsS19c#QInqkxKjpZwJ06c`UXTZa?53|1sDe}XG~s{Xg1g6CKP>_mQGstv z-#rdHP}7@m_8TVsfD6ugG;n$!;l=Rm2Mzq+U2r!(Jm-iP!@J>L0&x+}pSdRM2Ltca z?^or)4WDT6XTEt6lPJ2nD@n^Q|0N|?YW(%E?YnQtJpfnV;3(_Wnt>6X zw&$5>gx+qxz86%mo#i)t12gx1LOsD?=WUk&}1x$4``c=F39ed#i{CdM^qc_?O-O(y*S?j*U#%N{R z2h5=4q#i#r==6L??0Qvt>;BtxEy`V^YaK5bt9csJR)0iT6K!X0+Rj2xikFwpR+>`N zh>9?Ij(j#1KVHrJ3sUdGu0Yt<{;%#tf~c#|c%1#ATX!;bVC-fG)dRxvJL@d}IvD__ zvtECYdf>CW@s{XjJVo21n%8;L=0|xp(WTR7&n$s4D=b%|rpfE{7U?@h7Ui7jlVt#a z_k6e)FkXc7XD;gCybRowZ-xSA;ieoK{F!fF#H2hc*7qL4kFG19w#EA1ReEB=;7^(` zseIY{B@NG?$2d1HUxPwExLDu&N#hsmdrkb$+V>{&5!D6A2N&ymm*{{-=Q8Ct^fT{g z;DKF(-vIP|wJ*)M|m zftlH1{Fxlaqc6hHU#0ZF<9I~}{1@trIA(MAMM7J^SP%Jf5g@69LhvsZ3D3UBFms7| zV6QWO`o;5k*Eb%Jr!Gt1+0@+QSjtphguDA9$_ieDf0A*a1pXKPyok&8TC8s|^fOuH z)2dkC(#Znga?3X6V`QVz>x=a*H%sjO|MF!^vA*S##xK^lnD{5=pdP;8KjwxGDha^0>#@K&IO|w^?9km-5J!tI+*X6$K9Zh6 zmrHd12uHcFe|n>jQQ@u$ezguLi4Gm;hK0_!V z7k-BJA*A$Ku=z46!KE;u1Kp)oB7$&{TDWr(Pgts>i#RW*d>Gf2r~h-`-o1NwJvHi` zgu#Z7Bwp$BpyG;71k4=whp;;N!f}_YnM5 z+kq9hz-zbO$Mj(ehG8V1;8@PKn%7JD2D-h`1?iD5AUnX}g=|-gvlIB^Rh56?3Zb*J z*=3<;FT}xaT#&RDN3aSIX?Rb$;DR9)5>WAAKS{?%wm!~W4BL85ma%mF6?iV(8SSvs z4_13gRcAoOOW!N+tSOaJ=4xay(A{PwY?x7*`h$cy^r8+A9%6P z*y(E5aJ)x%A_7iyUzK?V0fZQe9m!*fI|jotH{pG7UX}f$>GRFx6FrW3z=W_%*RSMn z@_7aM2ps$vcm#EU3J!w9J2SJ9Fg>=RNf_F0kEHJsvZ~@v1mUvt4AwHtm%NXy*+70o zf2}DGCKf(f{x)V*KJB78(JiL4Mexn&Z0Azn%(ETK`CAgdLT8NFTv2v0&!~ofq&$C5 zaz-`tnS&p%pt`C5Pp#w4pUbuU|E@ELz^oXreA;z=mjdo8OTl$|d@rQCFwr>M2z&&7`T7gfs4fDhj$SDI*dp-pMd0kC3#D^T5%~E<;4_NA z=M{n9SOorqB5-;oFN7zhKj}GDS8YBOI08#*o} z@ys>A^>PrNa6XoXGd$g%nDAaa^CDa)Der6tybRp%tAc*^ ze=nkvl=+gz4;ZiCdF6+cmyzGM1mL#6%#8k&^9DG#jq%CW8g#}-mAGW^_YR~ z%7+;M3u5W^IVk^q@@55h=yRQARCX7DL3pmMg1;m~T$2+KKmJO2^k(7+L}yfwL;~1URV86U4mK}yP~ki$5sRRAq8VfO zl;spw4KqK3E`HpY8DBZB?qu~>a-93cOZeBaeVXM1`aqqO%?n=7d@ZBUh02!aFWej)Cb%;xYQM3#dPp5;#+>d$+Sin zfwM0v6uy{l&UxFc5G%pc6!F}MV{50)iC%K)%qf_@RVQ^)W90npMVD$gR8T$*P0+&P^I_(qZ{|{ZQSq=}@QO^>cNTbSVE# zI`_KZ?({df;BMXZFfH^=zMR+ORi)u9uREP_F1S12NRf0VxWc>BS>S@Zbx1EW$Hjbg z_a^WE>Yo=0FiTf=BT4$@ABGGXAN{%?j}_D9jK9f?b$phQj}bU zZ6=_;8~Ph?FnV9R!&mUs&63D!)Rr|-T#h!AiJ`C}b?_a5M4HW!>i}BT?_CjML^poO~UVBYU z&BYF7oL%K?3)k+15qpdCI_A3(F%{p5e|z+7uU$5p^Q!mr)#QkG!hhLt$&%34gdSCUVjiS&SQ;6dE?Wqt>^o;PlB zwyPvm^zg#hOLlN}cyG8ChfKXA$weA=Scz_A8St!-Q!JQfzzRJf1a@vAt@Fs7)pdi; zU(9C-?b3(!yfI5p1z6D(yT|vzbA+OdGa7Z_)wK!Q3VkJ+%yB?R&Weg>YdUiXQ50WL zVffjQT@$ipg2xAfw{V^k65z~p?R!>|XJ6Ur#;KfZcgm|(hM=wHG&0kI`Ne8$5hFX9 z`%1j-T3h(CV#ihCh80#^j-X7%g}YKb%4L;}Gk07}#cnv{8<6uV$rOqnsRi|s)B-W-Ojz(|9 zvj9E-##N)%!yZ`tHPRCRl0^xf#(D`RyG5+qI#G93`SpT3F#+q`GJEiQ)TOgl2AozQdVdhMPD2T-G@BwFkfek-`{pNc(ed8BPSZckuCKX>Q zG`OW5H=IxdIpYY(N-&rlH2E|hV39H#4gqR-ItS>BlW)u-lbwopAOKbqqeJb6I~i+1 zogIIG36{j3Qt+_?zXA;)emlUu@q73c7xn~o$W3ka(SBCj?ew*i`}n>8`;s4*DyP?A zeeW9}`9H~D=W|c$78WbHF)#nyvyETdx5EA=J$rH#t|)M-jatl1r6lU=Sic1B-@x{5 z&N4E7V=?%L>k6J@@_QDTM^1vx(YRsjiWMfDZ+IcPR=C-rMaL6E8AF0LhUn?V4b06h5*VhD`MWkRKekg%i=>*@xdrnn2{yuVA zP?_swti_Z-;fA+tOmkGA{E#17$ao0AUuDE|ZDpi(kCk9247pSl8IAPHaAa_bf(<7# zsxCNvYmLahgc~Wam~zEu5M(*>;*+b-Td_KR(z5 z@l*buJG2+)ov`yX-Oa2E;Na<%`ZVUC^AEP2+VgilBi5BxkNw4J{L)SozFri1hWzxq_%wsPdPhmRc$Rtz8YBg zYKa%Dj17i<`Py>irtrd7N;adNE$rTRy1?usH^n#au@%@}*v+6g3KZ+*ND(e?KIF?H z+ECED(p0$HDLXSg^4NfNYgc5{mO$H zIbXfWk5IR~0t+`&PV^?J&GG6@cHkeCQPNV|i<80-*S6yi31bK+au`5XVXwvuwkyk- zt?eY+@oFVsAuugDx8jZ#6PmnVYi=JvA=<3uM`*Ra)%P<$;oOLGjG{M$dqZC&bxgH& z8)RBv*c!jmxlKkSP8Vz&>;v{4OBvb=@wwYD(c%Y?nwArsk)4W@(7c056lil z>o7&sD@_lnm1Mq$S0mSYg?t3Nh}-{TGk($KnFRfkby9~PVuq5>`PK!8fpP{r%v4q)W$C`$X--;qCC(FDe-W4pRa7 zdA+p^2Ux~eRDMUxee!%;|C{YueaMV#Qj0tA$r)1}-(6o_OR8oy>A~JdxcYvD5|2^7&mO|W3Cv#hszcd9>{e!VMmH$ zr^@ieY$7R9UIQr+y5aP7&~TDV@j=pnHZJ#Y?e^Hhw(nIBLFS`lBT|21>r4(mx`-i^?J46(@`|AC%&veA-JUA1_Pt4+a=NtLYo|(9 znMtB?P#;Mf&@}+@EZ|1JJ-V^p_B2+ouShjQ#gDH-rXHTdfR7l>LH{?=Qg`mgx6A=1 zJyq`f`G#myPG`zI!;B0+0DZwI0TkavBg~b)SB8S5!$bVb{0d*uWN|>orfly0>nF*1 zqaUJuR&h((a62``Zdh+Ex))d}ts91lJS!VtahR-BQKL7$2m8(rQ#b(x{*Zz}ur=0L ziB3QkZV~;mx3Pkm+qLU;wIPHZ-&5w?*?~X`Sv=s0WZ)G&F1`n%@+Ww-(-;IhjS!VG zlQ0=x1!Uw49SV&*o@?hK2N=13EzYrMMa^Q&VcE5B+nz2PitXZ)fkP_Qfe`WcQ67%d z;(PG07Y|T=Z4dhH1(liU2xi&`^vdE$V$`+-QPoPM?%A?PuxCT+5KqL=N}fsrq=i5% z3Z!TwJ2n|0chi^@cSmy=@q%`8LSGX7J(0Bt>ZZjjNfmH3$|r4&#r*bR4*Ji+u- z455B4T3Swzj82V9PvD83ZWufSM;QlEE-DQgEUd=8c&L$N5s;rVNVFv9(_;T{{eKkw zE5|?mw}79d9weO%S7)>Ip}p`vxwb{<~% znwsFlLNRAkd6rfn^#dv(fz%^ANLFx5rPw1w7%ECI;P042YH=q+K-?V?PFV~{V`D5` zL*BKd?p}hAGKRhb4-tSXTOf!NH!}|OAe{b+B!0o-hErcf%y7et=qFz6dwM(jiHF!9 z&<@yn&i1^Za>ildWuoE*dXx9yGq13d?BET@COa}xXi;+k97?j@<=pB3hRjRxBFUH; zlW^^eR`MED2W2y+41%DL2NVi>hVa1HDx5VA=6p^HBoRq(1cl?nL4!z?1LxzGqZ}pu zaHP(85luXli?UWBkM6w{{Tun2SLRmmwEE(7%bke;n|-}67nTsg^f!2<6k~|Y z75J0(Q1G+CM$Tw2oPxmdV!NmC3M*kJ;z5ST| z2|2r>x3+j*gU+FHm%xEXNXukr$O`Vw%*P|<=ip@6U8X=S9O4XwoX0q#8_wdHNfB^8 zM_j|BM-}Q50}nH4JEsqfK+)l}R^^V?feBjAN0=(W`AnHZ5wuVunTNI1bJfo|k@S^Q z={MFjqn(@Fxz>;M08ngCq~Wy%IEx#E&Q8wSp4om;mN7vq#Rosug%^HA>2PH;sO<+) z5k=9_GaavL&L}tE(cNxfs=}lb8FcoqnMr+3D_BOn5D}OBhz$o4m^B7Y75xd5XdxQh zM>=M%#hr0N=7xl zmX!Ka7Ci>ZF5w4UM2G4*P*(alRjJ(QMAGSh>{IWOFK)knD>6MsvMwo^3YFhwzm9Wd z)8%>R6*t2>(FFx9WN`Q`w$B$h{5CwS^!b7@&KPzk;7$A4!8dW8bq0Ra5qaI5#S3TJ z-puoEHD2yBhFi-<(X1YBTJy~6n}(JCupnY*FrRw-j-lYjCH4!j9lEI$`zy^k(7#aI zE^&$$PVq(2d88Ij*J?)OsfaUK$ITSLG0*nDdBoH*U$K*eqXkj4<$PeyK=bmcTgmru zU$0^RD94M~JHd~^&1Io1ZNy)#KFfG&+4F^I6Bt%@G`|!)viQk@A5icy$g-8?#U-6E z^4I5Z=lobja1Qs)a_%r3Q6T_m=0*4=I^GmU7C%;WQDq+_yIGO84e(t$OvgW^sXkk} z6(^n*z@M8bi05vd7U%KQe%eOm7pt!H_t_1#!C|G{cxej7?b(oOj)yqHO2^7Qd z#N;d+Gz~i^`+PR}iTKaaaTjIr7hl4{w>h3L=Wmz&p>W*<<(%#NbXq@TeM>zTY6H5S zTTA~P#Mpml3FsO@^m6hFt`GT#v~DhK;`!0wnVaZ)%$y&MjmEj-qET(*hlSk`IZ?V~ z9Fmx*)B6t7lfBAlH{x>)r(J7m2HD8-bm+VZYLIjpH>9^4Zvj|h;C;hs{v~%5`JnC zc&rF~aS`}W0cXB-2jT&j$Y0!-;#a6#j{wf_UK-HgGO~0Xo&|pm7kLWU^Y|4?=hY%` zPA(M+KMZiDZw_)7nSeBoC=&ilMc@rOojNiMu6xw2go~Pm@|~i?Z`R>O-XhK=8t#YE z$4g`^?$;Gbhn5Y6(!ax`e~2VgBJvfFcWHRtNCg-9iN}YEq_eRIysrqHi!-EWJB>zh ziCo0J0{mA9Pws1B__`w{xRQN%{DOfWrQjmN@OYwzw`;h_CcwuQNuM^PS>ve^n2yfQ zd9IrRE71#Os}dc4>zzvrX3m^#b}-2a=NC>{F!OR1YF_kWZfu%zX$;PIr!cXS!Jyb> zgMipbHDk(^)8KI21QW=DOD>|5@m%&WWE~XX!ufNj&6qw72cg3Yd2C(|<4fSYJoiQ; z*O_zRt^DdKGiJ`37Ml|Vn$zcEqm>woO<8csHFA!*J|0r#cjbJXXfAo{!dx*em%Az$ za~bSKaLNMg-IWZmw@A5sUvMcO!aQ@7}<(WV8(z#d6WORkv z;QVG_C)xbDS7(6=R|B0gW#;_(I3knA!O=_RUMBcRbt?>j-n{J7g;S=@ga5=C3h4#Y zX3d`Iq?<#;R3r2vLzk?zUM_a^$cUv`!yHbZF@Y;1t0DTe@_v34HL$d zpYM-daEcO>?}IM58=rAnU&&8rS`qjX7n~x=q`$@mcbDsJ7u;R0O5J}lUw1kuyWsA0 zzT<+s!?(NO?)2BX;O=xbyWsA04mbda;37V5x;4Atlvk#_x4Pi&bbjlCQ`DO9y)L*r zog;LA$b8-KXI*f2eSPSHyUROc2ok`>blm#^xj%+iKAnH*g1hPSbVV+_8(yaS+x+y0 zx!`U(yyJqq_x+v1L~$`4b_s?){VsTw3qFp8$Hnk&_|J>LLnI0=CU>YjslPK^aE+RL zn55xMPIoy1ze~fJubci?)8HN#;p}n@{=e67hSiUF0uH)AXZWM>GvOme;ODyFpLd17 zun7Eb8qR#(HHfPe3UDl=Ui}iI=|3`&!_*fEF`XceyDcA-TZKphBF;EKU}8aEH5kuvgJBk z>rI5a%bRq;-FW`Y1+R9c^SdJOl`c4oZs@tr1t)3-zTE|P3pjT?hfDKg1hNX6M68dS{O{!`IvmoIPRuAxEZhA zlLt5BwU6@Po3;EJy z|E0@|*d(P^PqJzG_0y@EPs|71t(aHo8;P<%3sDcPUsiWp*9&=-`DiueWB1p`^72)w zsWi+p@8oHwsmV-`T%R<)521-yor;$IH}Ox*Lezt1JBdTc*YGni6+-?0`V-=RwvNv_ zbze(${7%ge=9{6Pc|QXWh3J2~E>N3Bj`XMMXyR+}DE`s&X~(oL_VT}^Ry0e$t9ubw7g?aig%I!tM{+GL6QP-hs56!5VIrmBeAs`}*(W zns*T!rXRX&m@Yuztc}HY&R6S{=V{wHWsaS>#H=X>CPva1O~uM04Bp?Eps-1u4>POt z>jALK&aY4~=NYjNX*cVR7B(Iz8<}R<$PDSufL^eFD?v)w-k~-W)V&LEjQpeHD1 z2n43-^%?us5d}&Es5Exv=9pij+y+ z0PB{4NW*mtwPzmHdL_eVf`| zVGI?~*g_SwH_q-Ki#6oTf?W&tbl>j0tMPDJDtj6|*nP3X*js?HK({n)IP6r+n|f#m zu+FweE3pf&cIrAb$j*p!DJx_ULpD4%!Hu6gly*FLM{Zir2Y!GiS>qXbMu6k&>DJ0EAS`@vq*q5&g2V z^#N_Otf?)^MN(wtQ=S-UhpT@YL*9)ko~(IT$oHn%!5H6Guj+H$aj=C%Cza@gz=<84 zxfjpG1kM(R+wqm~{}(D5cU)|T?evFX2~ztm?U}+JcsG6yqV?EtL$ht&NZU)PaN0Jt zU56AB)Oqc6tQ5US;P1p<+bmiSH-UvO*q6R)v%hU$<&`J-t!4Z6RqsIv$v5zKQp=9_ zc>13p9sv=%^1g!aq(j$L}(~CXniLL9c zhszK~Ld5!l*4=A-`^KGUCAgPz+yX1Hoc9Z@#8zN1E*2d=ZU*zQl00520Q1=R2X$8b zQoK0p!(}k>iZ8DSI3ugu#?G*(*Na6@&?(0jl)FJWaT(+6yPq0~5Jaqd0!~j5Ho9p< z4%GGpokwBIY~6S?!jqWX_~*PMF|kkatBRtxnFLxqSNa8?WsMLF3q0(6=@k+p3muEw z2wRmK7I1-mKe`>!(e4vsgxTAvNV=llwAjFu?f?*q??%aJg9jN@2D`g>CrVac?d%bo zwbaS9t#P)Znokm>;#|)foc=7hpWLKG)0VSRZOI z`3(fg*3_LyVQ@`FQZQmtR!GVi54*Loc@;)n11Q@NMQ~c8Y8IaB&)kd@b^DlOf$~=3 z4@h=gOx;x~XumKb+X1_ElM1TQx{;hL39;r-x0&%wt33>pKe(ryR}tp!!VFJP7J6xT zE8sAw&9nlILhzem7#*g`t(_i^ph!#1yL0k_Hl5CUzD=3)FxmwRC(lMo*-E}(ze;Yq z)-%ISeGMBXJ@*eFX!HPKT46&)2eDi1w#l^uwQ&G9+P!Y{Y=t*&H)UnJhlI$S12hM7 z$OkBB=4ya-`_I{MMtCW&rkQv0Pl#`G zuiVy$y;(E_=dE^X44gM=; zaNt+pzD)0j`Gp$_!e#D20M_rI%At>=ysG^?0ux&fUVymdm^lN$9KkZ@S%l)qE z4!Pf3eUIE9tnS3!PA952%bnOFJyb1RTEUL9q7q=-hb#18#VQEmh&-avjo<%Iu21PH zUr+h$=O@1&#i3mTuhD27%08!+_BjDL$K^(4lLMPA7=K-^USPIDo2?oIpUjB3PU4@~ z_P{~?@}ns#tE(LQg{0kHUqA6UBFZKVUdoxm{I zDGjpZL3%8cu~|EviQ>8nKXcaDLtIyC8BzIz(wxnb*Z?ArMF(n|rFmt`X|ojUhOu4G zh??4v2 zb+W;yw)qj$9_4haEYVt}>ae*bj_!^a7mg6X$2e_C&*^ zt>AeSe&mDvi*rte;A4xx8;iit1YB$`biGPD1MIva;pY~Cv+XgRsX86g25-@DGlwMY z5HR)@h45#0Bk8dH;F9)-`vdq1p3vraN&CWmC4Pjru`S>-?S%Od-l^fzRsh?AU!i=d zJ^;H!nWkJwA8rd2)_~2_ zo_!_3E42HzocYak7@EN7Wy%~_aa`tu6-v}s$8y5glToyKPs${$f=bEp9pN@LtML65EfxG>uk#7wA za0bN1n|tldR|LMn1$X0fpl%oZ?8Ya6ks2?;-Ql~7!1ub~?sRH(JIYW0WS31s74k6U zny2BUrH+cHl9J!K!gEUW1c8>6G`egOxLje^H$E3? z`9OT!>6fvxaS=|QH~C)e;!pS5<*$p>FVo<~XiV#RU4N#>Gw|Cr+{nayILpY(z)d<{ zf#%>Qoth%>x+3uUB5;2ZxLpL^S_D2h4{q?Eng=)dUz`WOO4Dav9^8b#stCL-557dF zqu~1OVlk3pQ_<^JH?}1&*=O=ZY{JKq4R0N1P)|pRN%@FOa3P;zx)*@e%=Rz zze)OBJQOPbRl0!B=zuH^y9g8Cl>ZRG^6Q>aDyR(Lnx$^p|9t!l;m*MGbbOOIi&H3n z!V2X-Puoa+Jukz&SE`q@XI`CiFqvHoJ=Ls&4qgjAWy~oj*UMt)CtnM_{YI8ZU4FT# zwNUySNZDRHbs#sCw&G#D*KP=SWm}=&`caS7*wgJ=+v3j3J>rN`yaXO-r_QOs;)m^& zMu*9B3QLl$6)maX_8}L$SJ}Ub&%U<-2&e9-Zs!NJ(iWMHCqHIun&7ptsjC0r_DI7k zR^kSRaQbcKGQdu$o$3vq*vmkz0{i9D*CI}|TCY2%WTU_ALdHqDR^m63!7aB-D(!Mh z>9^AG*q;$GD?#NRnYsNKq?){u=}lF!1mu9fvcJ`Yj#LP7Sr;5~Id$__jCpPO#zXs@S%8 zpaxUvE3nwR$~CL6@C(E5SsO4xBrEw#JcOr5tLp<}qt#=qo0j8UlLeFD9Uc6fN{C~k zphMS==V4|L7)&yxN_}53Nm_2{w4#^>-lpD`$}N2zrl#+bq_W=YdXvn7S7s09MD4V= zzOkJ@s)(`=zaRTsJ@iM{hG2>SLFZ}|?b}|mj}7*LrwVxU_$Jurpo|B#oj%JGhPSk< z0-PAd&h9Jhu9wSg&-?u{cbaMf>%mEmojMDt*w}V{R#kk<4NN1QczQSFC|I!yO!_nm zDX+8@IHwYx(e!)zEHLaDhLYMRVdSMFosGUi9Px1{c>-htwYD+3EY$B!Jt!4k@*?U--TYH}u55r}^xk zH{qwyWniIP)y{rR_zua=N^D}NoFj>NQ@tnL@Iv$pz}rqGC2vX*$sTz}zmKo6*TT*f zl?%^mZ3AkY#;yqi{iS#T-KO%mE^LSADg+#<{E5)fp{e1qm`Ju3{fe(_Z4E2oniJ); zQ9?IPmz zN5%>WUVRwAN_62L9w1_`hMl>U3tOZB@#`jfq6dfL!RpDL-q1v($1T!>y_2>9NROHD zebF@8N;H90-8Ggxi}U&Eo2oky49p7dvJ!uk=lTR#=Sma}hoOsjvl45_=#DS59CxnW zk%E&+pDJt7PArAQub=3N4YiRSX*jvJNeug#JZaJY3yN;lM77kWz;k|=lohvFbM`iI;E+M6K5AiF-_IFXXNeCFiy(V)v!iIa5 z9}I*j;d2KcaB0t`tbYgs6(;j#NxY5U4ZH)-8BY$*G}tzHWxj#dJqU0*D3&MnRq)JV z`}YU>%P_`)tpUZ6Dz4%>z$!A^@DbdfTRV$iRu6|Y=YTN=np*J`!Bep|U5{_>`aBKq zdG#4i-zu5vdQ}3=N}MLm6-2xozY(S{bWS!+OWN6|YhR~Gl119rS@@W1U)-D1k}A-? z=%78E`lRja52&I~-M-${{d}%{-H*z5x39!d!NM&OAqx8|wH(aKDF`Sns-o9q<&+_y zmRFg-2xpPs3$>%Ok<-UZ%`+J)uN~2?imc6kjB2$PH2U})%JOo6T+Y-=4sbSeYjp?P zLYLxHv|Ft07Hqn`2!XXnSG!#)x$oC*&lRF1@DUYQto?4%`MKLKbI9r;s$F*=jm$4| z@IlSB2N?|l98t8D{uDtAx9nH=rC9srF_MGYFI^vLjXRRM!V6m^={aJca4EGUi;;4FcW?$^q{ouwGel{+~=aQ7a26kyL!rC#u zc^BM$rOvERe{&z)D^IA89lF#LLwkk~<+u9Y-Ua)h#@3~6Rx*QV_%hB;m5Ij9nR%F= zq4BdbMA#lY2r$g`Dtj9z;z<-)rU31v6{^hy zoB<2}*`>63>|6LQSN%hk;%cwA(aZ3?jjiey;SIKU(6^W1$#%-Z@sRDoz$2_26GrRV zme`Z_A4vTGjz^%=3EjdC+n_G+lgoQy>;=%L4zLoVgDP9Frq;|RH^0R%o$Sec4SW!E zHfJ6X21&B4yrAHB@Qy2Ups-3KI*()r-!sA>^3LFy*CkQNW;-noWku}{(>%P5-kfV z1J3e5?aCJC@krSOf28c+G311u%(D^asR#xJu%nq+T_b7I|1(0v{sL-W3q~hjion}d zT?C_=8pNUdXYeH>2KH@;08=jlhlciwUua1o98Xl&QHKsC_W`HY=$BcZK>Sho;ho)z z)^>yhOO-f1$xaz+TcIB0R?nt@EZSb*3p#5(pZ=Vw=kxBNCoVgj4wj>h!88_cemF5( zVW*ZTT_65t&lFu>y{Bm%e0f!1U?oJy?F?ciP64MOk8pfWb*m>F$5FDxbm5kl0M8tb zzgh0_=Kn|hcpq!;6Z7Nm5PA?lT8Uwz1Sp<7IH&)><@Cq#CD`0F^*{n(%4noh+Z?tZ6iB)@>fIqEV>+NO&>zQtTUCnVR zoka$~n!Mw+0KX0gzb;h#+6gumepT4yt7bVDLJ1NH?Zrxd zi0)I#BWJy;%j6iu7I`mq_s8Afak{BD^^=pgFmhf8ZlMERaUJ%N5xG2{JS%dCV;13) ziCvgJDOmu6$i(^JtK=plegoERJ@F6A;LkfS3O18{1*Nbm$6z`9^L)PlSLARgF%Ug? zS7WQ<`8&b$#U%5tw-m?Q4JTAvN$v|M%<@5WApa|$|5f>XwBq-|@_DZ)i0Ge{EP4Tb zW@Z{97}m;Mh?ha~TRYFB*}iX+y>Q#AZ$P-6I}VEC&HGU2&W-@gD-m6E9dKeKeL^p^ zsNG;S87x<#(|{$vZ*~7rJM}G@_dM24&G!b!UQrc$Gc_NZ0KQcjf4wrk*Aw4>C>vuh zFMNMJmXNK*&qL9()8|$D0}r+#SI)oHoRJ>)MWl-iMZ{7u-FVkYjO1{5KBCBjy^$fiyZTDX#hiNKd<9hIh8N+38Z!l_W5 z5cem*RZm8Sad<^LLpvS3wKy~DTGDU=YRbPo>%ckwpad+5ZSDUJW`0I`;@_(tdBF7x z(I_j4hCLQ^MoF}5VuE=nXQgiwrgm=Y4kZVoN>K}9!g}EfGKAW?6F5I`0qm!#|Di%7 zR%k~AhjwP#UGg$DuRb|I#lPNe*li^qmE!p;B2IHf1T*;TkCti?ZGmdcAv z@$}*mumjyx~|Ai})x*ugulOn}(!@&AB0`CR%zH36*6_@;c+U05xe>4L%?XfK zeUw*ckHdWb&F`bNI6H8nEu=;(GiJw`E{EcMkBBP=KHxd8I^jT&*1^^ZiYz}wR%i4J zT;&@3?W)-JlnsgHuZ+K33E#`{jTCaREek(T5^FJI0{5v8DS-ve4$f1dVV{76k!uZe zHL|NE{nvZ&8ld-R=meH*2+YpkzU+I`w<)*I0URK&FvW8Y__7J|>Ke+cb6R&TSMrMU zUGXiDS6`z@P&54JKwfbej6392s|LwRHy|KSKIYb$OuDh9*g6yPZNesx2yn*mY(}-e#d#q_`e2g35F4mToBI!fKkekEs1Kc=qT>ZQIu7)}=k|*z@WL%OAyX^yoX~L-9KpsO3pgt< zM#c#*@M0aiBjoI8!Sp)L;_`=*ondDsT`${K@@=+%9%=L?ba@JODR~WOYb6d~KUk#X zH7t3-B4_SEqR>Cl;A$wRYYwn(b^wA<9!c^?#?Gj&k0P#W_*Qr^7-=JnNvhifI~N_Nd%1JA)c23 zswsvAFKmk>#m2GcH541Pn&!*~ubfZ+)i1=5oEbm3b8Fk0p$zOynU-=}Eq-&2?m-;yL|WX2@DRTvt>j`nxw+w5yl379YD&*g>#vzV0;*RM zGmi=jC4>~1EY0l3H`H^y%Y)S_cWu+b?tZnstOF6P#24``Ja!prVYp{;cFAyoaH@ zfT51WVZtUM(GUdg8qy&O|P^4`o2bROB}Et_VD%1Y@7@sv4;Y4$G4vC^Url#5q} z`*#!%JuEDzE zOgM*V|1GXCnJ?f&q45DbTWrZ*xUB-_+`&}yIMnM%h)3(@??U9aeVs)^SGO}-!71i* z0E0wkM?8-o&=FG!#ZoqCZYB0X{l_>0H2A9;N1#)F6|lTc`B-+!!G>uZM-=FlUpBom zoo!)tySfcIWjkh}K!sff6&cJhGUU7lWX2!_`{z2|*(1)W_EL^wgE?m+s;t|B)tC9b zbE+@15BNEPh}sWj0wnE*(u5UDAPP8?Mcv-0P0_=-Z(si~$SWv!IA0J(6f_n|&8iGG zT+DvFsr3)48|QN8QuN|;aA#O3AWcimf}V)@Pi*x70= zL(a5UU>`3lDF21BNqglCVXCP{6GA$!c?VDs>T$)7+JS7uxsSIN=Xz-7S3=mM)Mga% z2*0q`x(#VVvX5auKL-7LQsfESDpanD=s~&pVHCO!Vxq2aH_sM0sGA4hp>AOp1tApQ z%z@cn49o^HRLiw|%bSD{(J{|Jc7!4OsR2(fJ&tdDZ7Z z-Ty~M%xOMxlkIt?Wyn^DU8KJ+z%QBapdjdZD)l%W>Mb?e6z@lnYLi9f#RC-KkssQr z`;~qO>3qFR9?E+p-BbxZr)sI!cK*x&Ijff0v}(Ci=DC+9xZ$t{gJUbX5hUpQiSD#( zGF}nr5LH|7fN>{vhAvZHbS?R8GTE&<2%Ff7O(Iwc34>L_RJ;q7cQ#UWbIN$UXEuNc z?O2#)#qh#ohdiJw;!a^*XY8?T=K+4Qk^x~c0Wey|hxfh;oa4t)U`^&MbdH0x6wV3M zKCgOVsQ##9N)(YX`0^HdO)4vE5e+O0(ef4GMA4G@J3wXx_!VSgp5Fmn>_D7>Oe;!} zYN}VtO*iaKa(d`HKrT-+vB&;N%8>8~KmJMaC^ zFvcfPK_ZYG&SR`j8|obNl#r+-7gLV=gZQiOduWSNNiGgSsfCPqXl3{TLKT5+>ey1UWw^7`#eBf_*eB0Dn|f&k|E$54HA@|g;R5v@44oJ)7Whe2QQ$L#WY8t?Yc6Ex1WKxFt{6z?dw#~Pkfr)-c%f$j^kEd zwGt0kP$|X&o|Sk7$sm#kjq2xs@^kW5H1Ke$#ip@gVgvh_)Nhv{oWy+xN=Z0XUab$+ z;mUMa9~NiFGcbQ@u>-(_>{Jy%r`PId4tS8IYCh23Mj*2E9R_4708p}^hO}S;)Z5}* z#N%0qL%V|A#7fFEEd8y7>CZ&!6UMxcua!JdO#tCERxfGbhlxbSxR1GHzJ#K%od%Fz z>rx1|O3+-DH$g?;x0+w-(PsVO)W~W%PMNksVNeg^W`2c!IJ{--Z#xj)N`&zhFH7a6 zg+X=cIVf4pLeyJH)o@WCy$A-rjIXe90*zTw$6TYhx3OIScIU?+wWXL(X~R7bpIhVU zlgQMmA&aDo{tZ(rq*#Y#EjK+qJKu+SQ#H2E%|m2fM3Ykbl{@8{u$r%x3^<8UFar+t znMsXsrW_%YKhKfj=6N&UDE73OnSc}-(XK#q=b#Fy-qwL!Gdu~~07%}XOSmv&gEsBygb>wmbmjG5wm$M_rPBYShc?Y4&lQ1=29FXdt@i>{ogm` z?LZ9i6j6j&<4H$NETN6BC}I1PWEW61DT!VrF%>{!PA4EP(+6PZHZ*TcNHS<7Cb6ihSnU?o1B zz5xA!tbgG2AvFgR&g$?|MS>4jjf_>1)3xwr_D=ED@OlE|QfJ@{FbE&&Z9^#`ps>vc zNFEM%*1#|srk_tL!8P$o;0O6^r@l`BgeqS}a0wtxj}^35Sn7>9zhaQ+QO7;T+*Tns zh^=t^QW`A$QS`VLWP(MNf#|8>)c$(Qc95vX?VqGDjL-! zi@=QuoS%>`7iU#`24l>N853g#NXbpv{J&N(|474o1@kva2@>p*?p#NPhJ-|Ak%pA) z7zgTy()fp-Y@flVayq1|5QF`VbP{~CGf$%X4yTi>^@XcB4$Rld5Q)yHBNVMDCXRtz$?PXlVTo|V=|e%RNpvPdtZkj zoZNw%aB&YGw7geV`(fv%>f0GAeUmJQ*^b!l=Pd;3Y7M7h`rqRGR?<^rXhbau=aztI z*VjQ9u9nnAm7)O5pV{KlVX2I(0!RR zpdRTi{2U}4h~H2Hi@Kj8Eg>Z4p!OqV^pe3uw4D_5w$mxWT#?Wow1Xsqz7#feq#VX? zbPTj#f9e{kNOzsN9!sNkT5Zcw6Po(4;Ql`adYfyI6h_ptC~?<6=oKcj3;0WasvUZX zipOn6SnR>3gSOL4z;&>6gfbL`|C%Y|uzr9U=$r3`N4&Xh`QkAe3!Z2eeiEuzDTfb$IXvUF&lvwXwW zq0621U45lP*E`F*ww9~63iVbwbUEgZ{#XLeN{>0zMyP=EZW!kCH_|&@z_}7r>g8`T zV=TFUg%xFYy*?y@VQbebWp*t+Io%1?+=Kl?cGu=|OwZM|cwT5pN4{Rt(y(s9_(*yZ zc&y8gZ@)b3>2859vHqd({o}kJ#!enYieTgu-+om%{_5@sju>~IJUe~D7tc%w4~Efn z&-|zH*&HU#X-YY)IC=`_cwCd0Vhv~|>1aWpbFAZlY~({;IG%RM6=%a0WGK~KX?JBx zF)9gXo@am9(_97xwt1XyBSxv=^#SKcbW>Zf{=2q-Jm=O0oX0b-A*xhUAaySKm+oHK zl^yXTTv3R2qKvPVh7$Pyo2Yf?CDS1=`kXg?5-_C?AmuU$|yPJ?QfWex#X@bWeU^j&0_$%3ZV2zKfvl- zN;$$F1gIBGaO`yN;x<0w3imd*>bqav7qchk6-sWz*Ngdx2pzoR!sAl)#K$GsM`t;n5< zc!JJFS~?qion4u-f#v1z+IL0|>czN^OxIgJu)H*S5a<{0EuH0Dxi`MW6D{i*f)42s zDlgfTW7jg(*es?P`{u`_)~Ql!W@=W#LcJr!%n;Up&tjH`$-j@=to!$sWm>=-3ZM8^ z9J< zf+)6~k=0poY$dLT3=T96THrzAR!a!vpce&JN2`WXb4 z&Rr%U&0x;GP#DqM?ikXHr(nOKnzNl*UdLFw8lA5JjR12BpR>KnJ?&P$LY zfFF2K<&&0At+SO7KKRXp%?EKA$DxPJ;Ek*{-7-8fa{CEMCX~Qz#hcO7!ztO7nB8B7 zDsb7qzgbXM1wu@Pml+>WngyM#dsHzNYEuCu{mdB7&>&k%(#Nn%29 zx1i<3!kbu2AOT7}@jW+OVPUxeAXLQHOC5+KWC2< z`oNqtM?~6)^Wg3(e4lQ(@d zp2jjJzq^7_pn>5{h0a^g%qovu(1hhKwMUFdA+nC)++ZEot;=IqzH7~up4j(h#OaYq zL$tAaraa4fg1SM;yVea70?b;@u}k1SiqeSlwxEORmbo=6h-fGblE#eJdyskvU+?RL z0UhR6d`#H#FN)g6x*)l zd~5|?&|*@vD=`p8citrfPio1vt02pum2&DHr#{meI2Q3B9U30BnlpAhPNm6%Fvs-m z&OoM!;SPF8kUN-~+8P*G;fd9u5PqnJ$^Qf`#;1c{N52$`ESP{@QfdmZR}KdcIWw_w z>Qzq^L-$GE_;)dCN{&Rs3#YET7#xi)OL&ngkbT|KB8)uyfst?E2en&d*GihvTFEV} zC>h?D#r$dztaL&SdsWc>AGBk}E0~&&b=jQ^9*)3A4y-K#{ZjP_TreKSa`ZvZWfnw&Sy>LW5c10%cys z&{Z;)d8&{yz@e9}g7Z^BOo5N%QnDCBwm31&xT;~}8!D0PTvZT(#tE*+0au#a))>-) zVGTwIgt;f^DcNQWGaX3@%!EKN$G4VsvK0$3b0U>4a872aB>L;kD2mMdpCG)VH?eye30|`M3-U*pnnyok&JjqvPP?P6R@cM4RnwzMm#DHBn zWl9|8fFDL8^bIO>uonKRu_^2g?C@{yqin3|`~GVpZ7^_*ju&&= z!zn6p)&NY)P&_nfwLgx#(3C8x0e|3Bb0tfT#*5;oL-5q@dy{tkQ$4XJDruX6E7h|G z?Jb0=O)r~a$+pU#v{b!6JkXgeL-u~q{rplvl` zReYnZl`B^9Q9(rb|9)%leb3IxJqXtMzM22m^AXNHYpuP{KKrrO+H0@1chA?yv|m)4 zmqJ7xdE#eL`kJ0QgqQS-uX-?M;wWn(Z^DAExQX0YLW%nu!(SQNwB;>WeuI;s8va}a z%MO2gxw0BEdn`RO!!_wOh4IwaG5n(_bJn5|Yd4-3^ll%U`MP{RKA?o*cUi_7mJX!9 z4jNBSBe?5<9NaaGVhP#Q$cJm^^;}w8o%(vb{oy>;ghV}}7EZ)FOf3vydEhX6_hG&~_@p211=@p*5fyjAeUOJgbvp#pCRb zXVIU=CQhwM-%c(cYhOd|&Wz2xgLp8GW=qxKFcjNc$FpY4ajXd_)Y(*sw@TP1x!5Ra zYG_VlVm){42MP^|W!nrIT(uo{<#-@*B0waf-yCLAy(qxpC#r|;vUIVr9na$P#)djp zv&*XTnnJ2_cRIk}HM@{nd_*VX*-@L8^dEwb-w?c>X?bN1vP<-TOJ&=&Q0f-q24(Im zs`y;I6f2=9bL*kDWRViyknNfM}?r3QQL)a3m{!RBAgm1SbNVa(amtf2AKv}a&sk~9v6%j#RO0n8jELVv2V=>kj3ICiUBwAtd#2X* z)J*PtD0u;POhFvT6QPd%BUlkhD6rf~iT4v?=iRZ9pWpEt;P9|X9_}FFwyF3Hp1V01 zKW|kyRRh=)sybJlzuHIGv?%9WlZ zP7>aAU6h|{=8yQk`&fHFlc7bH%MHM=kIo6KP<&u9i&7c6xFpo|V+^jgKYZA}JuijN zhY#O*Q=P{A6t-(Z%TYbW?>NHzzz&~HoTqnt$Wg8Z()?*UCy0^kvw#`uqU+eM9sTipscfdx=s{lVSxRhWEq zM)|EBs>v`(XjJ{5TEWQR_SCP@!)b6BI*sADM9FBwnZk0aR& zL!I|RpZz7ODv;R$uN4`ubYB>S_f)p8a@`hm=Sxh_`E~4cDsrNl+%)%iXZhRky3BcG zReF=I2eS+o`dF;zdt{q6sjaDf1GsH<>S4`lg`-YQ{YKS(=d(~;ajMjbm~bd&o8_vH zr?w1zt#gN(;&wbw_n`jVUC)b@TLPR zm;3^CrgDgy5+{Fslsb}9vy3FcTQUdHC49*CJoR4~d9(zKWEZOJsVfQgMRu}Fg)V#s zkw>9UZoz<05kCl&p?fe~RjB91Q?ff+46z(I z{s=-Do%cnRE^C}c_IqwmT|rGsEpfKXN(UTF)HIGPNsD~dMd^Sd6SXi^07SA$h7d6* zOX4$vm1bd+WP2-gfZetZfZS2nV_IZN~a z^iuZOY$r~l12Sxs_pDQcY_(?hU&x<+{g=;H|HUJEBlHjUU$wzn<`r~8a^5MpS3H#3 z()LK+rXZR!IS3sj@o9D(lzSx0o$AYc5mcy=k&vmKx1w`PzluyR30?mkJf$|L`Y87@ z`5@E6_da}Ntmk4!{MTC1t5MJ0Y(&PzN#D5F^>99ZQ??OoTv1QC~}d#y*5;~uZMX?j;K-HfQ#CjHu5b!vWNq9DzVn^RkNSp zM=okBC$8`9MLt=1KTyxYw2N=zCH!32f2eamR<|?%fojgZ#QlRxJ(|Q8cX;q$IZ8 zoQef{$xLfYS=c7Nz$i_ys?V7$Ja}qtjJnr#=r)K|==>GFC$+i#p@L0NscI2ENnHj) z`dfIZsdT)gTr}5uDM>d+Kb!~DP3<(9#_@&}W$doxif|hFqe^ZR*9@2@3sCVaUsnjP zA$i|Fpf6dTMSy+6IU~>J&A}ST%_fTS{)AKEUl(Co55SdhuN7jQa3!~hm>SfA+}{} z$vGH~3_RsMPnON`tx@o(V#b_FpaD$U4B4IUk+WD64;u-yPe_ZbRBkNN1w|}FOyv9$+TQKH^G#; zBk=`BbzR1FX!u8hSod#4sytkIcn4jaYQ@FL2sOxcad6TdK2t;v4d1;?K7OcjBka`6 z$Z*h_e36P5GtBHLHYdFT4B(EvNNY)8cX`wbWRLZ%LK|bD>0Q)#riInsGcO9)f~-Rm zHkooZzXIQZ2YJGo*n3=uCUMdLSC3*E#{Zn{CKc%hCF!0jG>N4A3R zkEfTTXA0v=G%7xCBt<_LC$g<hw_*JZDk#EEKk`4vy|nfEibAJ z6q!r}%GG}Xa5!_vTbv;UD(Aup23wk$b;S~xosyrz%%a5Djj;VhHNIO}R4`tPFgOu` zhebNAFJ8#C_0wb(3!@YY;)@uOg}W!f0xpXVl~5BQdlWTu#*%0@bL>gG3)M=;(dUfg z=3tbozx_U^?Gr>xb=P8o2Iyas_smh6z!krrm^6acM&$YUN=Y(|?R2GkE$JtrY{1b4R z6%We7aaS+eMr~f z8wRBdZp{BCRH`Y+{~n$HpLAW^$g-yMr}7*#d~w$x6s&!4ev596?C0ayGO5dhIz2aZ zQr{Zqw<5j%*6FOv>f*`mL#7vR2=zF6z_s(}^2#5SyW(b`XwuJa(fK`* z%`e8XIoWpZU$*??bLYn+>Lfp!xOiDfk~=)79U>6@9fp@Z#}y4n#X1x_?gb|ysm-oku(4B zj*0ji!|%g&HUGnRYQ6_P)m7k-@69MK&zn{}27oNrBd=Vj)7{2&a<*aijKZ&F&nTQR z{7N|{5l0k~2i>I89M8L_?cBZ~bt>bs-KXfxYnRUJ=_A&U^i%eOxyWi@ufJ%x)b&_c z0C@f5r|_TK)-G>!+q$~=&LB^U%)uLRUg6_|a$=^TQE4E!Nxx@1UxxSGmw0j-hnTT=_;*v#)MS*cwHZ}&v zsWTDBEpALyobw5sjHu-ICwDfYZglr6<(#uTS4#+-p>e0+PIy1L4%iqCzf;Qykm;xP_$RFHy;g4`RunoUOj^O^ThVMEaKX8dW!2NiTO8z{!3zzV9+$U*x z;Bx{F2!F;;#yXPz&Mzvs@LBZ}OFO!w>1T7x4-}f8{qDKWpyXEn15Zd&$#R`dxf1lc z3i{>U<^%tx5B&Q+@Vk8Abj8i}-W@*h=X~I7=Un+5@_`qk|K*}D1)OIxZXnafC2|RO zZkLsdewq(_jt~4wANbdN;0=JYJmGVtI02DU_}Q-E8_!p8kt_Jg4gQ4w0tLTK-2$6@ z^1oNp_i1{O8A$V6A9@~?k*gkPFw6!2qt1Wtg{mMTNAPo>hWAZZaFGf4IRxXM<*%Qw z;KIZ4bCiZhzpCJd2Uh@o92Z0NWkyI;;BOxeYj~}m8TCK>D6n`{J&v_pT(@$?>aPWo zt9h$izNm3|VC|w6iMlnb>#j~NO)d@KL`wlHI-$~MaRSnq7`J%M>c&KU!tnBQp1{-K(!R_zL;Nda6A9EEV$h+Wo&Gnk4-<5h0t)D z{(1{;({HlicD>mkYQgP% zf?pEy0rb-?xK01?_}uiv%U!rl|2qqA^O^T8xLwY0MeclNTW~v{S1q_LUnWm*^Rf9= zg9W$w)r}V1F3$lAZhzNPXSw;?^po_w&D-B9&vxnA#Z14tm<9=4q-R$$@TC^qZr^qb z&aPzWcUy3~JVPdd2p99GO~lZTx8Qa@7g=z7T)b?-*(FUrfA)bFO$HGzzSpK-c&>m2 zZrA_S7ThlX&n>uJ|8H4vn|{)HZvHm?DhqCZZ~yFM?l;CB7gS#YutQ_d9@+%9L21-J9L&4SzC z`%?>U=kvY=x64^s<(8kU$dqS}1-J8AZo%#HG+1!EetvGj?fQJxg4_87FLcXef7b~X z+%8Y81-HNJTNd2zC*QZ=_IsyQyYIF0-*3U~e3ngh>FxL4;sf7m!R`0H?gJk_&CTEL zC&ycGyPS>%x65<21@G4`7Tj)^j0LyLnLphvkKHaM7QA11EVx~s?^$rWzfE)8{O$Ly zwBUCA-)6y2LsHXk_gHYdJfDfV`P=2W#Dd%OODwouZ?{`;yWU=!;pT7CpLUT8x9K-o zaJxL$a4{EG9{%ines00-d=}IQ`2hNxEx1kpj0Lyr^MD1n>+{i>ZvJ*Ti!OHIc6)uv zg4_M}YzuDJ^K1)l_lF(}Zs&ii1s{(hn0CLzg4_A;w%~U8PpNgwZ`bo|3vSn2s|B~q zbDIUX>ur|>x6AXP1-JA0@vPkC30>;K?edJC?ZWNyFSOt`{e(F#y>y@|M&Usd+qOf&Vt+ZQ}R`p-p+r-1uopCS5UQHImtZW9@f9v zUi>qcR_6sqc)3P&=)0je>x@71z{4i9ph9Hn^VKuGJ9!y+xIjHG^uWzJW3LBp))`Hq zO+IFwF|OZl;NcRL|93rbv(EUs2X59Gr|9yUd^WK0aoym7n{~$LJaDtlSgpS=n~$#G z2Rv}I-ZXZQdXJ$u>rG2M@UU+0TRd>HuJi{F+^h$c5AL78Sr59!12^kIdp&To9;9;l z`2UBIlufI%&t??WzpmB&+#qx_nn&R=tios(qJE58sqSM&s(TS`d{3cz3}~}h;7kqI z&8D&NPtor+^akO5{yY%5-XCpKDa?ELe!jz`H*m@>!o2U_?)h$z$fbvYd6ad1!akLS zs2_bgy|=#1v$38Y$<2-QlesibzH@|Jt;>+zP_qUh!N}Znl+`dXo`XM&d ztv>_30zY!q|7C58BC0cH{SU>TxBia<%v<+NS+bb_2LieqsR#V;EkB>VWhZf)P9N3d zZv-b|Tps47 z{;w!6KWE~^aQLjr6YxK;g~P6$8lRRIbaM;_E*S8AEW=*C=EC1m{)hjIP@6r|5#2D@ z=^3KWM$Zss?Ljdo_14sihY;X~z0>4K;}4v)g!11_LTpJf1|gQx5qZ9d)Qq#Opp?kn z{I8=oaSEJq`9dR5vf4DmkDu^_^TDYSKM!v2fJY0Cz)Zt zpu}mqEE@2ly1Q@t>ix1O(-SfpD<^p5 zw&zam8_$hn#@x$>VSy^?Dxw2ikYNuFPDB8pDj!fDn{fb#Jjz44xc(ohG_AH}wo*84NV0dn^! zQ76br3mvRU|E!eNh?e@ZKHvmV+k6qu8%d7Xb0&Si5jlA}&lHQSMm+rjoDo+O`LR?u zB0YG(&+3xoF3^4T3V4-QUd~ezrAr$haGse2Iwy59t8r!+&r*$M|KL6UbZlPSS~LZM z>t+Rl%_YIl6b&idfXXgGsj0j1;(8Y^!ph}WAfQ=_Jd=O(>g0dor#Q2CRD1rV#Zh?i zjha?m0^h`G!xxI1;)TV9BKMj}i;MFhrfJVx1&s2SyooSewfxWHFA3+o_CfI9t?%zH zDL%=+Aw8~X>?|JNM~{E^%;MT>;72&no0EQoQ6wLwS<>I(xAG%&{iEabk4Dn=!Ff^T znhw8JybnH~HCZ-wbiRR>Tj1g~t5z*tod}Fuy(Y1A-1M1qzSNjl1P6n0;y<`_dEGL2 z3M^%Dj&!lupPVlsrCR?hgh%m>(_qs#PS~cV5z8asM{{a^=6#2mVvQna?iVdDW_0 z;C|e5<2Ojo;f58XNT^(4SHm#V*I6_(I zKI1A20sd6pRp|N+Ep>3V8UUkv%|Le^H>L5)fp1L%9a*kiv07Y>sE@$iNxAGatfhmF zdUTVTtcBD(Xj0>M<5D*+UDU96Ig8S;wyt4`@%WL%{czfI$xbPLLrAu^p&ShQV;`pOpX)bLt3Xl)6>P;JK6GRqn=#7d?TIz?! zM$n}R2&Wr~fp4|o%-g^pvEbBa4Sb&kr`v;p4@Ljr#r!FQ4BVcRA8*0uTJ$Gc@Ff=9 z&ZpCY+xcv_;GF-M_ZnYemdCbb3?%>;Z=7};`b#bNXDs+C3(mGN^z_Z-#hYFJBCT5! zZkLC3$cu10pFddn*xwZO*3Z{?;CJfhTRiYx`nk^oH~i-m ztDae&HoH(d&BwWgk%(Cj_9Tw#=TCX&D&~6)Iopa-EouPzZUX6evK}wiIp0H_gcsX} z*XQv^xaT#2SzZ8%ap`JM5BPs9{+Oqi{Akm2uFgEm@n>Hq{YTA}$v3=ZVm@u&0_n`X zwB#>@d7IOuzs!@s)Su2SFatkw)xV<^r%jrW^-t}u3T#kjwrr? zy`6Jqr-vLPAhW9b_)BIM?p(%#skv>tS`beTc2a%!<2>ZlW2v{D)FGFSyVAMoKN{aZ zHH*;i`frFoJwd;Ke87wuwkt2fs^wR}m`(+DnT8pA7UjxH4P%<@_5Z1k&u*-g&nxM)DehJ{rC#>mAyK<70E1!g>FW2;+)At@9`tNG` zg__RvhdX`f@745en%G%ESt~Ws6t1Qe8bB*{)uw^xXa_ zM4@#_lzwYSl!H40AVjBisf;2!fX-ITp=P_q(>ZC))XmALs##e_nZY(PIuZ3vUW94( zEzhIn|ABD!4_?fN^grMOF3tgYdGlGJzysjd`@l{6GJo=aQ%=f!UWD5^@=Sp$IOoNN zezgUsyfW|`EV!);hb=hYVJ@%k7S;$y-$~0q)1Pf!p74eE<5jP2LQ8m?e*Q~uVPwEj zY>6AmGAjSW46EnVYFU^E?ATIF6zQpzk}iF4U}_S^vkP zi*3;F|G2u?UY&lIzH=;6?=s~drOQQFF158!1OKS$%uQ!!9?5=Ju35CCeo^A+)-5Jf zOi&9M$FOcusOyq1jmn#&;32~TJX91`W0;CRgi-$;o`sH~*>*u|B5Ag@!>%rC+Rhsn z>ez^Mlr1oYD_c8E;A^l;N##8p(gs+a`Xlz+PrX{UHJ19rZjvK|iW%vNX96hCvSE+j zZ|1rO_&#@Cpsh7HKG}(sYV%*A-}8v8+i~aUZ{oa{)HAXN|Em?f<}G_RQ47Sj|KmfQ zb732={1q||RNj+^Tc!?xaTo{3sM#r-0KdU&m!1OHDMaAf!~b0SFhaSz3dBA{&(7EStYsbrwXnoDSWUl|JY(LXUBeW zNN4MA(guLBO}zY_uOJW11)uB#|FRF<@qv>E=E|QgJ-Oih2R&_hWB~}nODqp05NTJp zVi_!N4H~kdu?|6Y%T_c8(EKZxN>m|Clxvsp8G(j!L(CnXnh}PFcT%_I#W6s>X=FcT z1uw!ZmJo;tRMFcy$4m=egx@Bgg%;e_Md~ehu|@xN3vTNu8-3tgEja7Xyf;r zew+F?VCo3DbdbHe{Y*Qt{g~FIH*o6L-Z}zEokWfMaz0p>_p|uyEj!7>8hDFNz%h6% zI>;|{p;$lm<$XVNkb120iQfcGLLX%hnp7S+N12X}-gn{`rm|3ws1!!ogDU6!g0eZD zZVjq~*We3q-Rlm%JapFy4o*ZV!I4(s@o}7$J9-&*+8m9?(*qqlx^eO<&Y=LElU~Vl zS`*lyGCdUsH~z^(U_R+Wl&IJr~tw4X62xC zTLa@WUj{<^BD9@1KJiPZeNPaZ8aKYp+>$@t^YF3_*x0T0xWx$AesC+1U>0x{6b}xx8lEw@vJv&`B<3wHNaADhw_sD z%)K8+-Hne$H7KPG`W%j7d_HrlkVOMd*=`h;+e2bk+c#9htaNyYvSqp!@5J*N~T3FhYuY(w6CvnbZ_N#yV`IieqWvH-MqV`a$j#-8?26@YJ4)zi^E6l z3f+}IHP9Pte=fhK?DZ+*6NMet`BrQx#!1<<7IC+!56S2VzOmx{P?cGP>2h5M=uGthj4Zd(Uc zXS?ooE-c}&TntroFnBC!uPN2L3f(nYavri?M5C>+0L5uHG|X{Zz$f3birijeAZX!`b$BDi84MSaomM% z*Ni(nK8CZFXQZ$BQXo;~L_TObBc3{duap(AymHUaRDaHXQR@E81SB`@`JwU`6k!g%n!T<(p1!BFoQ;a!7iJ5Wv!%1W z@HOcxhs~L9axxGSNN<>!ugkl?2hN1O1?j)l!}PK1UXpRTJM}Qe>AuZvZ5*f%gITks zw*+uH>`n~S{fU#??kO10mPwRs?I>U|#^YXrJ6Z)SNHcr&!d7fEow!C?+hW5tL2UQ` zpi}mI_M_9Y2L+t#4zO1=ogw6~Zx|*NhiHT-#MfJ0#7R#%6NSUrSI7M5cVLjH0wB?z zhg3hRz?Y*R$xID9>jx97aXhT*N5Y4*9G9JGt1#S92f8q1Y_W8x!KhpjB-kz%{I*1O zTy7o8+vy{j{^04_e zxQNaazmOqL-6=60@m{2abU@A07ZQ$!NG@G+GP~q-cFFStiHj-usI4`gp<0-Jljw6e zqSCZUCL!#u11$wRdwR-=PVh<7CB@Bh&!et<)%|nZp4(0TJnWVb)s%S=nc2Rux&b~= zRAoEA%2Dj*XUXYN?7ERdkT;5ZW(5ekFvYXYK(Bj1sHp;JA6@v8qSjXGR@n2)V>Cx` z{g0Q|78M7~*rHxyXBMBsi~8^R>h5bey|`^qesAu*GGmFa>e z_Cgzx_X-1$3;qQkIBgWU=qLHWqdsujGFZ;N>{qyC4B_r)3tS9buJ`_p51i}Ax#+I} zobO$z4SO=K0J~Acjd4rH4q#NEbLDfJ5B$eI@c;CIQ?tpH|5hJ(pAY;g!1-N$+H5T2 z6|h%*=-<%vZ8UP?k}-+J!0&nKG=>6InTN)EfSJh>~*r0D|!)o^#Uz2QHTG!aJiXX{~{e&00Ic-wL zMthJzTweI6G>;^lOMe>C)k zP#SqLf4e@FRSRy{XBpISUf%Y)z=GTP+-$+^e12xZ={sb;_gM>W*XP?7{6vesSo1ZO zhq{Ex=Ohb$k_ErOg4^}E&Vt)M!reabO%|Lo)V%ir3r@Y#zz6Z;ae3?Q1RwYpEx28u zJr5t#@smd9?d(|q9PS#Z0(mRNARz5dpM+uz%3!R>Lh!-CuG^^OmGjy1k) z`Y=BV7r%>t=Bn2}4BY5Pzw^M2{!(c1f5}IWpV=O`(F-WvG~P2wHV35 zO?ofA_qhTo2rJK~R6k7maUQryZ|;6R;8z`G`MKuKyzD;4S1#A-cbOLvh|AQUdJ6dZ zfS2fXs!f`Z^-q>)(rYwy#({OmB#u@xjDATNFHdoDmYsB)boz4LF#H_8+xvd96>r-C z6xgXdnu&cNjFdLJJ1vpFbZ(yhsE2H`XlRXM@Uyensp-yV^-6*P68<};; z+x;5BvLawe&3qB4@vB%&ZrLl`=TA+{NZRPK8 z6-OZ{+jzSbc6%b@4)VJkP+$S~*VVW7t~$>VKtbU;R&>#JRM&q)qTZ zJ>DzlNE7yff58XNm6BZfO!9$W-~*rP1E1pqzuX7D*ax2Ufw%g=ulIr9=mV#pm~srI zkC?cJ^)nz~-oJEp6Q}m8>G*}aIDjo$ym%?jc){ah7zeyld2I+F7KV#~?q&lm7$Bvc z!dNF%{27WYvX}DF=v0iyG zAA3%{kw9F8hwx|0`ELZ`GUYTX$4?bl=m|6Q+bp>Ky^m?Q$w!Osz>^leozH6)oc-J6 z|F#9EUSZ%Ae7snGdrlp*;C4QjSa5qzy-34ZPP2}{e3x1D$K%<&x50wjbBDD)`CRKm z-{V97e=K@?ZuLEjo_!~bKVG+5^mcvztA}1uyXjbO{QIP?Ff!sR{d9iA2hIDuJj_q$ zHyLi!h2=N$J%u_WqjP>hv^cMGZjTH)=xD zPHaDdOnL+Nn=|zKyx&`XK6}f~B8<@;BC3((rJNsl-|shPSgslMcbJ)VdEXClB&VPl zN5QP0pwFD4;_Qk^%2Dv>{RExKZULh5)A$Km?t#nE3J(0-=pP90wmZQbo%A#;H9t;g zn%~O#y}|v?V)!{!myX%ZY@GHF;P6si8pWL9#6WV`dst>361oWw4t${MiJA4H<3TY0Gc4KxCLH@N)%Al?^GeNdBnll~NAl&d0+#5>` zt|@ynUbZJ5!D@V{{UJ1OP3m2~j7N>vq$d`@5#jI?n8V!oZ@{%(!!Ns+_%M6};Ji`p zl7TH%B`u3LU(S1{bC-qLjqCZbZx+qsVRFc7THo6`p%YE z-K~NKgQR0ul@of}|lB1cE^%7zBbrBp56Nvkk#u5DX^4U=R!@ z!4M%h%Mc6!!4MJ*0l^Rw6biwo3_&3X3Q1510`#0j=};kf3%-O>4?{sPlmtUTFq8zt zgrLt53uFcJ(Gf;$Ysa1ab9!Eg`^Cqa=A+-L}jKu|=2A`ldjV1y8?G6W+) zFoFalKrn&?#X=A_1jQgIwt6pVi$Pl)`bGpa%QnP&me6Y#eS1mim{9u@&^_33Cu3W# zy-xdX%(3C`hX)z77@2X5J`B`_P6R}u>sJZ=HKkE_*pM5z9yS?{cI1!Kx;NoXrhnmC z=Gdshk?3cI@R7u@=nd9HUajnommcn}J-qh!nH!KTyz-pKGTu_u;#7Xt_$hQSBm|AM*p;V0l!#pB`2oqf+>Xm-C0HXIMW z%sg<6I@;SwJw?x%a*kYj+mw^q33WdPy+To8bdf-E>rZp)7ir4aJu_WeMv_|LS4bUC z7r^zIHU~J)(4R(fr+19Xo$sj)bw3F;Pts{B$4NaZAE(NKLNf`9Dbzp0_mUb^j|f$^ zK>Rw;pwNwFWPjKvO%nnGhr^n(gWyovOf_ve6y%!J-grJ)sg#~|BDM_FoL`yeOSSM@ z6}9?2c_&{m;2ZayuBs9AQjK`QfZX{_sC3lGyHG&+?kx3y8j-^DEudaO!J{g}lPzk1 zUAoXMPN;hhN)qo`iB6h&2C0mTm-It8oa)+a31w!rVSqP;3w&u5LBB;ps zL+$5)Lil@Pb*u*-zC9<#QX{cr+>luCIruTgBQM2Lk2b>AbHF(hu2>vOW8ji|Rf@&8(g5Xh3s?s*U)vrF?p80w+} zk5J^10x|@$1r(4WvrF@ZVx6JLCk2EEgbOGjL}r&32n9DCkvs}W0Vx9M0t!fx*`0qJY#zR6em=usBkT0Ns9GP7@L?}2_6pA6F7(xpCHxGh@ ztjaI$n4S)#7+?G2x1{ZAX&gyW2)@bB|=kYVvuSPeE1VX*C2gY9!bgOhOthQ4_`9x{9P zBVdF2T&SZFrV9rS&OH-U*5ooys=`U-Wxj{(#t+Q3)v&6nr|?GqF^$Y2+5%j@%3<1+B;kRMtH$x#$7OWfKa9s_j&06><38$aeiiyVnDW~vQ-816@eZ_is6<;7 z&&_)W$~%8vTaYI`Hu7-8^DH~wR}gW62V#-^q0W1eHZuq#)0F=_0N|nvkpU))$wE!p z%dz$Y>H|3W*jzn&yZM5rH4)qNIksE3T0>%Lu7kQ!KSsB$Ar3;GU!AEK$ z4~IH_1g;Aw{6hSlP~BZp-CZ0{JBYJ-G}N_0p`0LabA#30wfLJE1UgU9S8H@0(Ro1Q zZ)P6Q`GTIM(fLH@1C76#`9K#4`YequAi4l({LL%?dXS(g41jS45j_ZK{LLH$^k6~% z8AFWd!9))R8hPSTQqST{`u%cQJ0$6A_fR z4qf%_SlNzjS3TtEsuND7sG?g_}{f`*UiR{1As( zURJd!;4sURVTOLoIr7sD&&PrXW036h2?@=$nq390L!P2KetO ze1YK6IUO}O1|A9x@YgE*Ai<+|I%;YRJk%NB>lA*l;L$xDH8Tbt$_(&dR`?-;NB?x7 z%3xv)JX9IrPgD3p!J~sZYF-RH6dB+T!=Q%mA1ZkCP)ALRfrlCc{EG@dOz`NYj+zw% z4lbH_qfO#uoC?VrTLY{~Xsv#aTKi+4QfX>B`?{UOuj#0caJ>@g8bR&B0 z`!!`x$0GN~Q#;Wmdu`5%h3$VE4QAZ_zRP`~kM|nxy8%cj&!*3AuSq>j%T7(IFSdCX z*ecR51WA^y=4aWeFw~-ax6{TWPm---%5f2GQo&y6=UKK&E`+g*<^yv=%v)qzmaRs~ zR%c4bt?r%%wi*Rn1zNM!DB0>v>9;_GtwzCCf!1s_O13&vx-HOPt5L93pfy{KlC92^ zUJEqXY7}f0Xw6omWUDi!(*g~)8U$C+3HN`vp}=tV5>lDwi+c{ohe-wXt32N z*ecMPtwzaKXG)I+8f-NRwhFXnt5LGmnbKi_23w7St!@*x8YNquDSZ_vu+=Eo>Na7k zQL@#U(oKN^TaALPZWFc|C0m^-JrpRg)hO8NHest#velW=Ie`LOje@Oi%d*vJXqu?7 z)nlHRr>@$|u;qeLHISCE)crMO_s7~lkl9~6vR#ywL-yn^_F1Y1m^a2Edt>SP5>j9) ziQCp_AtrHUz$4*(5PJd0`4?+aFUB^%3038=VWOS)!LkmmE_Bxg7;+=Q4^L415TVo1 zM!J50q@lZ7$qzBvtL~m__+cyfA@J=APkxA*AMl1Bwt^o5zgXeP4>9ip-tfa#@I&A) zRCw}3%=&;g{IC`L5cty-p8ODVKHv>MYz03AK40O<4>98d-tfa#@I&B#k1t30$qzB# z1K#k%R`5gM?^k&8L+D|^8-CadehB;z6rTJLb3Nb&3!}py_7vdP6YEm`C3inH`3FxYVj>l zK$WEKjisZ~$zb#_>hL;Xk)%>q>f)gbAJJSd4wIab)I8yrM>U8t3AGW*B&^vYql*F% z*9BT1eiDK@@_sBmak7%s|0u0{0frlz215$qR+z94X8Rqv9W+TOkkM{P@N_He*T61S zy@Jfn5&aR^JYZqG29|qyq7KRH98n*E%?B2iYhcS1maNV}hnxw!HDq_X6=rK-hbt^O z9kfU&kH8KB7B*{O|D<{Y86A{J=#Ib+1{MZuU>{Xj@;T^`P#uAVWNwAE8rYvGEZLlc zubl~7HDq?W6{c!nzpb$3a*imDzzzi#cItyoE%+KTIVh0O8-W=H3=Grvd1dxX*m%m`p$i#|vW*Gk3FLC2ek z=4eL0J4!QO>ZI32GsG;c3Nd>v;BIfl${xbBigPUyv|9IrkerFty{wR>-e?Qi3Lv2h zc!jLp-M$K*#^sY#VY<~}U+8T+=LKkimM z8S^i!lf+V6^!!Vi3{=*b`!I@ZMjUpCW@X=j&UT)?X%EqF=nRJq>CoQ^-g*yx%qLz%p+($#mn1O z-z6`c188ax1J7$R0jJ!q0j9|@}Ay%{T78x^wHDiWY&BR+|%m~(u8DcdHZ;>%0 zSTkmb)eO8v#*ARim?2iP?-m&|f;D4?Sk1g!WXuTGj2U7z>u!-T1FRY|#Av47B4dUa z88gIamfa#_h8O^aV_%{fc8iP|Vr0xPjb_&^GG>Uun3+axwM8_7%I?ZyvHu*+VnOQh zSJjvy*HvQ%GpdK(F@s*!YvxN!ungfl*P6~X3U|!pnoM0h*qTgX9ah_k$(^;$LZf>lY&I)Y>T#1{?Lhy!-G$tNd$L`M8IyR?;Srt3qofbmxrr`q8Mhq7S_0Nk3w^GCI zoQ<@Z16Yz^ytvr0I$wc_l2#$i6DFP_|^zwkCEYE(7CJv>{3633`gFzvW>)TTtdCEYvG&QU}fOnCpURV@wC4-REK^ zrDnR{5KJ>AXcf3Y6cThDxPhMME>T!Y&?=;iV*Pg=xPhMK@)Qcp5-CBezzw2U{9Olb zpy#+_6qXXS3fv$H3Azs4K+kZ8DJ&&u6}UkZ5_BE7fu7&KE^@A!60{23APNb(4%|S` zZXZ!tO3*5BgD52EI(Ke+r@~T#R)HHtAwk!nGwGS_-zh95Xcf3Y6idD9zzt+x+tiG& zp#-f0H;6)lt^+ra8Ew-7U?@SWzzw31pzFX5WG>qTU^69X6}UkZ5_BE7fy`o?z6cB@ zXcf3Y6cThDxPi=Hn@U1=VZHXQbs{{Y-3?#{YO&C37r$r^#*JPg^w`ByyLZFHISigq zdS3|&iXEa_mB&mM5fM=&;-X-p5)=oxz5^@B2h^`Zox@kLpLWw$@Ph?U09lMXN#4^rU-Cri+AXb+!++@z+`F|BhMfU$BJm?k@DH zzW2BcPz~mm+OEuO7>t-!L3!7#M=2s=WTWy<8yl5(&3csb-pnZ_m3La$sJv^|qZE;5 zPAI9o)4oRKU9%pgh%|FLN#&i^H7f6#^(aN8nUhH>@3gH^dDpB*DI(3BN>X{JWsSWnQ!WnF zH%2O~kG}EVOOn<{-`J_JKKjPp3hSe9d{<$8^o>@9_0cyLDy)ybQKhgsJ4dLiRAF=K z9HFkk3Y$~!2zBiSmn8#WO?q{YP}jo>n^XS?b^Tbd{dJJc%>atBi{0b6%3T6uITm{} z-$nx~CAecX*XgkyQWF$eHXROE`K<2$ zc7F@gn^-D#B5x0z)4MK_4}b)!@L`$K(*ctTj~I{a=}A2D6xVw8#v*TFQeP43coR+u zp}Wd40hk(KYgit-~n!x^CVd=cm4BeMbkiewt zVbuio?-iDgE6vb-=>Z8$x*j%7V85=gbXsW^>k+UJLiMm{0(*tR(qW}ptVh5?2-U-$ z3G9~@md+~8Vm$&DLZ}|rOkhVVEFD#v#d-uRgit+fnZV{NES*%E#d-uRgit*!nZUjR z#|C^a9aNg3`_kVLm~=htn80pRSURUPivseF@gP8g{5;!vsjUUg)pjz9TV6d zg{5;!vsjXVg+Qu@B@@_H3QOmdX0av#3!wz@L+r(Zt>p~49)bxHs=Ky069M!X%;2q< ze$punGc;OV{tQPj_Ajcv+U_FO@OdQbXAOTYw)u5f!(YuBD!%}d9O`uZY_;w!`ZQd7 zl|ub;!_#r7w_~(QU6USpL8znQHC8jtFDF-bpIXTYmo~p#CKxfL&j$ls0Ii1;E^SCZ zS7E93%!gcEfDXqAmo}rHqOjC@=0odQfDXqAmo}mw%J7}7)OzMa>sbJ;hZ8PsLf@sZ z)OzMa>sbJ;hZ8PsK;NRU)OzMa>sbJ;hZ8PsKEG9AsrAf<*0TUw4<}sOc;2P3)OzMa z>sbJ;hZ8PsI$y4^G@Z|f*0TT|juS3zIG>@g)O_Yc^H~7Rhm$Tbn}@o_DlE01`OtnA zK>OjuOAP0su409y1~eZGZ~-(RPQJu+9_reQIS5Ud#6k;N04<0UFfpEox^^fm4e0Y> z#$137x2`yI51@(zRtN{AScG&eD9s%AT$Tr(4z3Je8|A|@L9l6H>02U8h&j!g#_Iy6 zi(6q<$Z|lhS@U|jLAoXyvvz2kH7^H=$E-;nDC^zItwgVP_v!U+W!UT(Nrhb2y9-KT z1n9Tky&n@m3{2Vt5%`Pgs#)LB%J@!&XSc+*rofx^9j%W4LgCpltGT`tHS0TCA-_f8 z*)^-Vz7sX;J6a`gR(N*KYOe1@&H9d3$}dxRcF$_A??lb|j#kSjD?B@BHP?5dW_?F1 z=A#szT@+q1z?=0Qt(x!0EEwOD8wNv5QO{=-S6E*8QqN0boexdN} zsMTEKiJCPYQPiopK^uQ7?yKMmfCp51C)Xy6B|(U_Z^g{0e_Q8Bg`96vZmVR;&;`fY}dH zv@*qIw4!FU(%iXjM|E1OpfnnaH+y7nb@$xETw*)C_T|iX{$O%KbJ4>WL?|Q6=YXi0 zZ@c|%(0GgB8!549Ovm_}#5}?}_=v*of0D25%Q(-=-3(>*ez@GL`Z0w(UuQc8 z*=DZBcd?%NaKvi8N#3zN^E*ghMT<{_$DVxSfOl+pi>?#Mmd#KszIsp%@c@>sgQIyu*?w=uEvU^OL9D2V^gn zq}-J{;aOSHRNd+^PJh_J;9Pm+WV4_F!;cSinchD#2e`L030J$|9<hTzt&M{Ft*L zGLCJ-NfRgP-EVRUER!Y{zv^r}c=lneDjsvgAbY>bjYIQ`3vzCrIDL5j?Zr7UJSOFs z&q!JPzvAp_)EM^dz&td^l`lJu3`FEQONB9hb_~9>1z=b_$r(F;nh%_@n6S>>BdKy?aelfheC#e*UPRMWJd%Q82pVx3K z-SoS@!LgL%VjlK277xtxAh`g(zh`) z>oWCcKr`@zT_$P(`d&U+{lJ2|T&#c0j|SBLae#U2jtR=o;s1J{R`pZ<_kJs%y=5oi z2Aw{v6R?l7?56ytT(At}eE*%g|L7a2)a8A@8I}`t5NtUw&@-BXT;iQJW^T;hwq6x1UDajBbLT4_%*3NBNhay_IzH} z0AfAU_BuVEj-}@Aby7G8;msOs@EeiKMuu+u zJ_tm`P2NqSFt_$$JaE~QN+64~QY`XRe^b)4%r;&9Sva-ri$VR9vS#!v_zk+%()Yawc?yGqi-cM0k5Hh2WyHejxWn5ph6giK*_CHVhq@CCqQ zu7!xH?kWUKVR9w-bp}5Oc+9mBFV$Uza4Af#1V7*45p~;uxfY_Ox~mW@g~^rR&oy`i z-8NvZg;=TXDuha*vkLxXgGbD51Lj&#;JT|M8UcPx{C)&B$oC=SwgGc3#7T8mAxsLB zE5Scw@QAo=z+4MaQr%SulEUOl@OK;haNsf5LY!206~d%2xf1;UHF(6^;(2y@Kbi8mUbB*eGNxI!HsA?EfbDMlt6 zb6bS4t`9K>K&(=z>ko*BVW_RsGZN*3cQlSTLD=o@ad06b|&)oDgO{O)alR(Qv*-P1%PCOjb)L0JAViFit{p z--;vBS<=+%YCr@tzlcGre&4YSm8L3zHDEqj-fq>M=i`5Sx~geJYe`Kboq9$8BvLwl z80+gqz6U=|62JPw2eHzS9lL4+n)Z)qO42GZo=w zC&W^7AV~(tg3n9XZYGv`r15rcPIo3dIH!MQyBW3HiIfy9|AD(3waY+Zr>6+L8OCz@ z1*OKq_-A5vFTqGsF}n~cv2+uHcIT*=-8W%qj-`|0yBLeS2PvdNb}xYNIC9ADDWo`J z$nKZ3A-mPb!(^y^u}+};i61Yf=mMOqqk?vyjs^c53%(~oyZ;W=h6Mz7NHV7N0=%ZO zdp%5k=Y+bx1tegCZGz}Y;%_cQ&m0x7%N>e{=8{JfBu^55b0K-=sA%0wHJWQ4O%Oau z{LO{nnS(VCgvd_RXfAp*LGC2+Hy3hej*8PgUZc6{(FC!R#NS+qojEE<_dWClVCHby zqX|+ciNCp!I&)Nn?o%4gb&ns<;km!iXfAv-LFOd!Hy1Kz4i-L8w7=JA zu6#5>k!2Sk0!{NB>v_?#>|me+%FNu)s7~Jmn8n?LcGkuYDZtwr-P+1(_uxDRHIM*{Tr%zfybGAwq7I*S04Sls8qFEfWk zs<8WGU}pJ%u(eQkv&7@7?FX_#Aj`#oXaCe(F=qySm~l}#l+}-TdMx5{U&tJXSH=)1 z{5HaB_@XiK)EG6MScGg`ZUELI#^sJJ4Sn-nkY@VupR#0jOb#($E0mj>sOYS0dC01V_oGQ}aEcxo^dK=4jqa2E}}XI2QLf!%V^GW2vbD zR+G!*l=w--7@zx}=w`+Tvf~OV+7xUmfD&R~ff5PL{fmTL>NBW0d@GqA*tLiW@^A<+ z;khD`$Oy3q=EK?6v_xKN1TrvZ(dil=1(6fk|cGP6siPy zNSP$92vxUCTuO$Vv5J(HDybi`NJF7B8hN0~)%nCx$Lt2t7vt1qjuf){+!^R8M-JKj z4}>TjwMm<=b1mA}B5CGz5fsK}^c`^lPf%pcfdcb3Hv%#-yPlxqW%2>g(9%;eqksug z;(R!AVvz^Uq@|K0&i#N~4!oZNiSZS!#t}-!6Hr!$;)9gbfKis7ug^3*&4CZK_xym^ znS=5%R{xko}#m`I8^KFDLM;FL$$u1qO-6t zRO{<0It$A}wOB3B?I}77i$b-&o}#m`BvhNzQ*;&V=AG)o;y?^DYOI>0kM5``+mh|09{-Hre2#iWls%H& zlrwJ2v*X`^#bUnk-f%nT3)u~=+Cd`T8+2qw-&F1!x>v%B1B#9GS$57B8$_jvybTWk zoJaa=uu|p0u^#@*aN$V8AfkOZ?hu^#aIDup97)%Q<68<#g=W3>;YhkZ9E}P~eP+G( z;YhkZ9CH+w>dboW!;y4-I3_79wVCzWha>6waGa#DRA$y|AC9E!!|?&kWpH+&F0&rJ zk~>!=T_29;6_%>ZdhNrJbbUBfbglSstk*sqN!N$t`zkG!nf2O-BkB5Zv@0z2nf2O- zBkB5ZELB*lH0!kwN7D7-V010YOs!_U_TfmnJ{)C&6(5eI_TiXQocT1Mxgv5AY|W@# z6Oj8eHz0QvM7s{i1uINXL_F@L=$LP1<8hT!M?c1R#c1?Q6OZfRtd+o7Of%P#`f(sJ zOtS#4^vc2B^h@!x&-Tk5WSW>wU|$t-O@u(aZ*xuX12kAp|N0r=nvO5moB^)s_;Sq| z;^YeMASb7s5w;AA?PEM{lL!4ZZChO!nz`wpG^>HTRskK-{1^YRv zM)nLr9PY0fha0+iOFYuYncnEP+YSUz+R=6Zn|%~Z5bhi>$H!vnOUN9z#&9OE#mXKMnP4x3;Jy&s{05wk-ZRXx^A;Gkp|jCii1EcB4aMXdp#1MOp^h*X0x6vc zSTMN;Oxu7}-qJ7?0xO*eSTMN;%-Voe-qJ7>0xO~ySahTYOxl1|-qJ7=0xO*eSTMN; z%-Mid-qJ7<0xO~ySahTYOxb`{-qJ7;0xO*eSTMN;%-Dcc-qJ7-0xO*eSTMN;OxS?^ z2~=g6*9?k@ zEcc9D2ps5*(K^?jkrRvpOA#xM6WT)(vbDd9C!$A zB7PP|$y%2)PgPjDw9kWxpM_zv*5%A!P*}RO&x44cg>kah<;+7BmM-n{AmV3XpsaN{ z^B(EV4RmRr2N6FDBW112nSZOWbZMUl5kCt=nw=7!?#>BZU*BC7)*ZTC+V!fi*ntXCqY zmM-f%V%eBl_B_nN&8+(?SXS_x5}gm6HCA#>dKM1OHCC{cX!x<7jlalM#J6IRx5Z_> zb1af&cxITpms;oFOHA!p(MK{rrOhQh5%acMr5^;QcC5tIo&p>Fkwa<=K02iKaZJv#pK_ETwJ`VmHKG>mAnL2}|Bs5O^|x&Q zt3=hR^}bw|?bPStS)MrvGqkZsX2nJU#Dlh4s1+C`JVcsMZ0yrki+7+?RfIan!?u!n zh|b5SwSjBG3e0&g?9=^2Yq6X9BU#;1o9CaV1LqOU@2Ts^!eFFEUe-kVYXaq}Y_Ib4 z{Og32YHc&6)&HOg>0h|iojM*t2${`rpjCT;X5DBbVjHW-n#NR&t(eAIM0v05zS=d7 zsaaz^XN@hQy#wo-#?-8_p0malZ5q2;)OQKlQM1N+&Kg@pe@9x^G^S>a^_(@fXw%r$ zqQFa9HEXQrtg%Hjc%*erV`|nYrm+@L;emBcV`|n|&sk%O=!s^_(@fh!ziwF^h55SkGBwi#CZ}EowZ<%2{JQXN@hQ$0Lm~hjG>@rmz-m3cFeq zd8WavQOsahYctp-h_S_(KiV~^tuLZ&4?vlB{Y$d#>kVJC+BZk|n$^C|x_zziHLHD_ zb^BW3YgYT_2w$_>H%IuI)xJ5x*R1x<5x!=%Z;tRat9=KAuVveJKEb6kD7Q} zZCvnkmq|VL9Qw#EsEB&}L)lXP`e1XIW%S$PHklRxf)+gllkP1-s3Ax>+ zus$KTTNIY_lN?)o+^VoXA-7!$>l1RjTw%%a2Ph<=t{DpJ6LLFNVSPewixt)<&>IJl1C!a(j6;!se7up{}bGmX^%{GAh&+6Rby0WzGWhXf58eFgc}X7nVY3mH8ca zn%8!3WtM^6dmL%{*}b2K(;@8MZy39G$02aB9Qt*UoJye7>w=NWDDx(#mC$&pTsy&i zF}U+~d`)6vX_q;zy8C3?E^~=s#4b|@yUhIlcA2vjmUfvsaLoDr?J~zJEcsp?>@xHF z+hz7iULEW*^ZVOno>o}$y*k)s=J&VD{8C}b_v&Dmncv?o^N$KkzE=mk%>4d# znQIl6e6J1@vHAV&GK&6TJLx0KAiz$&}VRBg8zu+>1;TcQoVidmD0hwm++AEV3n zTx*AG-9pfTKJmjs{UmP&ulZZ;5tTJE=0{f-2p`YlyIp|EBZhuaNUOVvMD zShI@5?FOu+>c3Z5vx>vhmaL`fuPdxs#o8Eq3Tswzc+QfwRQ+XzHLEzDrRvcN zYgTc1!jiRAov*NF6^GjmSWDHfV0sL`X;yN0wvx3}y-i`wY7P%pvX-jotwHBHEZ`=Ph()U3 zx{dE)0b^{}qXP7}%+)(-4}c!X)#=PaiKW#~M~wO0A*)jG5!s&k5TUf9c_K=b3qddu z$`TSBJ{Xe;Q|sZiuVj{*NZKRBZSFx`T8o)nQjfJiNH<0-q``+V$=Jy|O&~2ZituH0 za)nQ>3IM&D0iatXkk+h)hFmWhTO;tEY-s z2R;`p^HkQH1iD1}z&z0e63pDBLumg24WE65PYo`V5L(vY?#$<&;S1!qwhr~HB?e1N zZGPuj)(%|N*_BS`l!m_mIdUp!vpD|(WSJcjJ`49mq~LeZPucyBS>`*YK@1#Q^enAt z?pdoxilIF?5rjt(LmS8)LpybN{)2ywp_STJ{~b#V?Fb~XV`!x<07Jk*&Y0NIKJW=X zaGu{RfwKtK%LdU-IGQM0WQZ#&|EqXIOmDKWv2Q>Z<%M;LezCNtKo{UeIO88N8;~oE z-@FLt-zRm2krCuUKo=*QZB+j<^=S~^IAgz9S`!QD=!EdR_jA^=|(3z8}N0 zVbPKm%>&M}^^2uF=d1}~xsE=TcB556Q7KOpW416*IS&URrVF;E`t-TBPU^!;o$Fq| z1@!H^g9uUHhG~`zw0m z=|ByIu$$UMBZ;4)f0*AOTJta`5>Np zCb2fwz9+cn2GZk=i40ZEZtP33CuGG=Jr%<`QP0KuA!mz@tLnMth7Ij+Vo5muAzT+` z?5|1z5Rbf-d=fb@A}ZrRDxb!eBEF#o-?#-qn|)4d-Tt+E)N7L|xNNe%+`~WbKV~tF z^<=rcGCB^Z+2>*&JC4Zc8O5V+%&#gArwiPDE~<+sw-1?K+&3h@JXky#TVGTbj{!+l z@hBvzDmH`e2>V$imNq8>}Qg54V*Xfr7XJ2NR7}!+&$R(S&Upg-%o2VDDjZAt2_mfTK zxXhE zCRH4>Y^t{k7?rX_10$e0R?eI2B65`41*vnduZad7!=QsUR3z`g85 z@_4tvI(w%g2s>20g~W&=djUeoNo`gMu6uylkX7FwI7Tk*$D=uQGCX=AO8|y@Ltb_9 zsIL6#;&6MxjN&^B@}?JuD~m@}+N}84_ZDhcL+(5dtfyjJ#b3;y+1AI-o2|y;x9Tfj zMu~ZH@BX}*n%uxEKih-*<8twG_(%5R*$Z_NI5g#)H-&xRV|?J`{i^c^maUdwfh8*% zR%1BS)h}vD1kel(iK3Y13wGDd65<_U)ifx z{~|r*lc5h=aN<6xD~ycTC;Vj1Lg4JnD{K7bQTufv7wW|PcD|=jKO0`@H;>w=>AW{D zucEABp57k1(VI{|d()eF6z9?QwNXEK>CLmbM?uHmURn2jo!+#+eiT~%HtA#5Z$ra7 zT>x@jCY`}8zz@Q_eWFhjnEqtwP5ql^&XaPIIc$ z>Q%Y#={ZJ$iI@Ay%xd6_%={Pp_R7p@#pO$fSt4`#@Fn)6!#*h25#}=uOII!$_unz8 z!Hd~<{`+O8mlLZ`J{H>|>&dn)N?ikXD*n9uo4J!m<$_Q4fmiv!FY|$mOqD@K`y(Xi ziq%(f8YLqyaMjX;JYeDp35(tQ^p1bFu`>5843zyh0>t}yQGe$}7C`=BWa#At;v(FZ z(Jca1aMqonzr}*vvUsBfrybYOhb=hY@kw1_WW>Jb?HN(Pc$xN9PXpW1Pe#*z!K+!_ zq)zyrLj62S-#?E#;a(a0M~(O1NNZnyGWuxK8yQ`0XNun@{YS~zb3yAZ6SLxRthp{P z*w5BEN)s;hWMb;ifM?)GE*V>*<$|ea_Q_+hbvEnwe_UJVPMyA1-~D8~pNt)&JH!g} zq57_~%R)uQCRZ<6s;!;b`Q&7ueFG;~oO7(U&QU%xw&S5oQ@@V)TpWehUt&xLHm$n^ z#e*%de9xz8GvulpP()DGc&|Db%ul?A)z$)>2|O*>jS#v#CKpKBxv%a0lR{kw@oCHg z`_l!3?Yr`)1gD;~qjKMl%J!Gb2V$T0#?``0tD$f1! z-6TMGF()c2wze)BHBrbuDe}{n>kO zf2FrC*L&OB+IxGsXj@D`6YZOb)}mIWz9z0(lnVHo-}gIbW_L2|k!y-;rsXz)YtAY|Qx_)A-S1`f-%Qx;W!z*1D5WEC-EPna={F6Lzw-1*ev9E27xKmeH=53)B z-nJ$+9QM6{c<9VN_*|By#PvRSp@!>yc0l-cJwC3f2zdIKJ~|v4>EZ6V!~d1>QKXb^{FcSaQoChnuN+6n6Ou$x<`5pWpnP{DE=wf zt4~!^Qi{)o_Nf6`$%fmfw#)FPG9QKZscMe7N@Y}DP5!Y@g&^Ic2Cj$gQzzFJ+^05Z zA6!V#;jSOj)VuQz48eBnN|a@)HnGpKwv>15il5p3ZXmH2gHX}ONE}%FFYx*T^l*Co zJ}esUaQj5w72acbk1sjyRDDKF@=aVmV!Zf2F;rw(6+TYXn61(Nw_N|q@+?=mIN!Ol zrLnDrBn2d0q%=RZ(nEol!>xB^>5}o9{nkX_CJo)W0Mv}swuUJ`flGlRh@&$&C+an-h7Ln6d_*Np6XSJ9=$Lf1#Mxu49@`F#9l zbh%vc6d3tzwr_xhPQsGb*2X0*EohRV(}#y8H}J8kd6}A1OEj;%KGDQBd+F*H5h~jz zvHJagL9SN$bg4TuuU>NXW@Z3RwK;4HSpUtoz)PK3f|x{~$b`hqFJnyH2M1=aizr3;Cx(tU_J@6Wf>Ybv4qfTf&$ zSgvt3Ao}PlxGPL!?7n+R^EMV7PGl5sFniVcFL<`GA~d4?d|%>o_v1+}0(ExT&JL^N zaRBW#zO8%#J&E0!Pi?YkHC)AzxU~Idyh$(e$JcFRErbGvh+HUMINPC8QT3GVJSed^ zl`IZu9(wL8M<5qqk|h<1Z$n3piWj1z($=k1qR6E1pZSA39#A+B-wpTTBnw1{eN8y` zA`IpFQm7_|@lYXSmEGIV>8XDf=Abr(=gq$?H51!>-$M_0l%1M6;mSpJ$_K3vIo<$g zRhp^Um|B}Y0gtekpQ_jy+;#r!igeg-)$MdH3kb5VTm%~gZr~0k;&VIcj?g7Xv(zkua#CmrOD~2)KN!eE_GD4VTldhxT~Zxb8OKJJWp58;jvQ@ zY%zXx3-~AEfL6f2i32dN#Op^LBtq4_DRvs=Z zojVp7-r;r_b9tZW#<(1I|IN8RQRaB{Dg5|xn(j;h`S7p@ZhPP?-+b{jdf?Z3;Oji_ zFMHr$^}yK_=A-97fm7xR$wpt)OJKkB@W0aoe@Vu(*@)*&5C5Dy&2}ojmCY;Tjrioz z#rRs{D_WbDENfhyz&u1F-?*=r-2jcFl}j6ikT;o2q)p9h@v5x}im39X5c44X@w$4+ zbxppdtD2THCt4b%zLH#PZC;jW@hxjwg($Ki2PeC%2{Ej>!N;@IZft67TX~~cgw0Fh zsx?cmGpJ593y`5zwmcSQDcjMpE2jLW)=fG7r6bOMUEwi;aP-TLk3YIg+>7u(4)@A` zlf;#O`RHT4qGSB}dhOQ)>f-!%R6IY>a7)8kf9Mzw>zDHX06{q7N8+dO*9gK9KMFsE z|AinN@uTrmc!{h}#K&v+G>Mz}TA}&pe7=e&rQyeEI40kOWBkW!_+uKb)A_uH>vRT0 zEH3?wOSxt8h8Tb9JNqXCSKp0xq4ixzn{i^;D%a{HHS)q%J1dT`4tt?-;%GK3A+*oCD&AA2Z zX&;o|0`nZ=AO3}&_T}OEbpG`T42kYz|A09%r#I|8AbdDGy8BM-=t@lPe0u!}xgn9bvy-Ab@w-ta9|$xKvHN9fEwM)QEFu>p->QLewE z2pfme#TXmhUV@E88%9LRs*@vQWer7J$COo1FRO&apWRv%8N2#WFgo@V{dRJDuq#Br zo$`i0FDS|eSO7n>{{rNz^uW*dz%TN^XL#UqJn*F+`1Kw*zlwbHbBve||921k7asU_ z5BxVC_%j~(;6~NA6yiAqXG-slY-cHKH?Ll^me*BH&Az2;n%4@M+}$G}Wb&39e5*ZR54f<%7iC;no)GR= z8m`N@FKf6ii~mK#xvr%0>t`DZNB-!t_(ToYWpNr0q@#a5{;1JsDC*WD7 zdzIl|bZU4Xz>kjc^Y?MN03u?NQbfr{8pSvWe;$d4uF#pXA8{r7X-R$L{OkW_JsDFb z%kpecW$?w18&GfzI9d^ouRNEk< zIfQ?x_UpJ?XQ;Y|lY`R=)|XkY1Q`$!5`;*7nfYPoF)s8`QwB?M&_NeIaiy3EMR+lr zY;7r~N`DABs)Oo%=eO}HGZEwZno%(vmS(5t`V%p0%XB||ZN|%(^O)^C5~;!Czv3}m z(`|M1;U-kGH}Pw0%WS{17wYxh(6RA559K0>|6Jk@7`Mxc{>V4K>cunRCRxgf9?aZ>()IZ`9@gFI`UCF^(w_2Oi;W>F^hX36v1;~T=zHyAuiAZ`{a4`+ zC$o6zbv^4*NG3gVks>kE`yL6b$Wr9qDE=vU7H;y%EQ=-om25)(b10|6E8I(Fu_Z$} zF4Ub#e?HpjU#*n{WB{*mqnFI`5Hkf=<6g4=X8M#_vI`|p*gD*}ZSs_J3SKLz);^Aq zphW5T&c6)(BJ`3j2qcbxeKgS<7GDsEzkR{PUve7C>Np7h9aso>avLePI!554&epkL zl6B|y3j)@i=={6=qqkdI(3$S?KY^8v7sJk9)UwI!^!V>NUE5f5p|jO+WFJYu>Vnm= zRX`2U*lK|FwXw6(Q=bp+;#S0;;RWbP*`?_laWMJRN3AVKr)TYHe+Lh5t~)7nis;+1 zvEu}$Ou9E-g1+?Vbn6~$PxP-H(f;nF#2y|G#*G~itTM+!HfVn*5dU=hI};OgI$yW! zKf7BjXTez&~HTnt1_&Ne4+3G7JPZ@+0`V#)Qsdu;$7|!7eCaQ3mRG*m>9L zoCC1)b*FrNsk5R)Xq90pNnBNY;me^e9iA`OrmT*ekVa}0G`7~J8cU+ierU-}t_!|c z7koW)B;yUk<}9R%(s1oF@#%J|t~9tS<{X%nn(FF-L5O$;XH?YgXf4Z3rGK!Yc9Cyw zCA~UN!KXJT@uIIm1n^8pTzV1D z%fx>USNy!kz!l#lJnTyVA(~jv+TWOtrpqWD?Sz~Yh7ccE6EYG zs(W6&WUZlw_mZ_#_~FW0n}$fgm#n42cj=kMy^@s_>?LdUN&d5qr7Kj{YWOQ-L|y3!4$vywNJ1bp#}lkc9rZc;3LRYd?tgU0+%rH+DdGs;drf6(^-A$joZwL9%( zEuy=mG=8k@JnC$BcJhQm*pbaV?)LS4q*VxIDUoozVzDGb*lnVvClC%2;}rqk;S3LW z$y}u9iNU;Kz!!qz5B2h4yi0b2wm*TkN8n@a1CZ%p zC?9*o7%Bm>9#{xt4+6_P8tlrvQRrj`a=<=`&Rk=l9HL~A3t2%TWs8f?p!J3@tKBE_ z7lH}y-%w-#!9#c_PtEpT#FG2y*sbCzzEX9;xz5<<`;MFBA$@B=!#$cw>7%d<P6; zmDpYFW+vh{iRU&y?HlFf!YZ(z$xx>pigXkS(%>F2zX?o77g+gY-7X;WL9?98(B z1|EIcl;E_2`?9+-d8uf{`>`%n_U#7>E& z54&@Jyzb}pojJP=gWcvs_dV<5g@&8oWP=yR3H5 z=O^w^4)}AT@2HXyMYLgFf_f>Zq}cFft5e?hhsO9fMW#~=t-?2b?i^pkrE`4Y`3rq> z=Ev|{ALQR;{!QWERQ{dAziIqCmwz?)Y>NOp@I#n>;n}o+k8t`G%dZZapm&HRZZ6} zS=AU{at(Agse*|JmabUR3VT(JtDqX$%wF1^3*eP~iBxCeqnKae)x;|a!kPGF7Zx%W zOG~u}7f7743USr!FOWF9G?v--QqURI-JNf1>mkGW@GP*f#JpfLUuU<0!J#v0Q<)db5o1dIiXdmH+Excr*VY8NNYzlvnavcgyjRul(AjM^#QNKenAJyuyzJmXB05r5m4MFa3qG{?EgE-I?jL`)g7I63m(%ZcH-y+``u~yHw`^ zLPCNVxt6)0ercCHHi~CP)qprmQ%%5{BDAVjancGF#W~?tZr8qPD=QAXsbn;^(+67! z&&MC#ppN^C!;3Gr9Hm5tZwNUzR$E!_QL2@jtv6{aq*{VeQ%AcCBp z5Vp4c5yml=x=VmjYun?-={12{yZ2CwmQsdvg1v+*<2L@*BJ71j{4o>nz3d&ZnIoG93)g zkiikB5A@aU26lqg`6J{2EVnwoi<@wI(Lm?ZUy9|*CNox+GuS4JLB*>If@Sb0#l|}&2VKVx_~NqiuW%jpkTbl(?ipTti;C-T zhF9I-GrV9|1Gti{8A zL?5GwG6hC`GV;@OX9CEFU+95HJn-4T^)*~k{=lyA@Zao#e@Vu(Q+8b0a#x)R$3*B= zur9l_^@f(XuXW`YnwKqUS~a`rhRd4biI%$NrCAL3!VgUTF6C}F*YdB7U|CcC2qI0n z2ypL4;HJqV0EF2IpYKM{Nk=l-PpY-tUlD{O&azPWiL5|y#K+>N@TnTkK3L&%G+dA8 z4Gm|%t^CiB{NjZ?Q}`_&__s7%rze20bbKwni04(}KZmQe(b;CA)8y5$;A9I`Wq3p!pI`$zG@8iMT2MoM-}WFyU9;ipwPYGfva{P{UJp zXZqFn=}v_|ob1c7B*UAo-XutRF#XO2PRwAlPp$1fWJIj^r{Gz*$tU}+m-3n|J(B-~ zRCvXIFWFbw&mZo5{Ce5+-X$~4y3e%D^u1)?a#?@wKp5Sb{9_}tYDw$rA+Ie@DcnAr zvK2=E0AwlH?;Z6|FwNG+jYH9R=hh2xY=$Ap5`hK zdppkliMrH?&C@G6H%N5FlC@2Z*RGMTL@@QO^2+*qkTN7(K)lVh-SY9TzA#?aGOspT zu8|p0Z9$=J^lX)&aW%hDuQqz9;l0{u6@IvF^bH2x>d~a%tBr1#0nENb zwQ(vwuQs|N5C02kqwkRk47ZIgml@qF<6%82q>Wac)>M^Ic{TYbJ~Qb44YiFvXG(R! zdt|q=Ba<#9u5x~2o}GN75;kbCc=~&65_`|?ohiN#TtzwAy`rbY1JiapKydcdzPs9l`m_zB0 z-vn<^2x^&t5r2FEvn1?6C!T|OP-S8g5u9SDjs_j&G1B6c({3gSH1>-{F-PF?153W{ z@L1?p+bP)eKe~@O=>H#(3Q6j-DT@fW1w;N|#J-`;46$V>|V}D5gX}?wBagzN67k z!FwbK+nuz=qxheiI|*9m$#+IO>n2$nHZYY72OyBI`;wh1vYk_&9)@x^6vGk7A9FDO z^ab#;D4MS86FG3^`}$7?m#8~0@@j1;$0Mqo4V5sY+LyT_%9*ENm*C1I@e*@N1G{XR zGVTAgU@-=LdGysZZ8hqp^& zb#8-Frz$ngy-J-7*(~AUq|dV=sqf8BVV}smXb=)Mw-<bxzQ5ttC3A9G$3t)eK7Xlh)AonBZPg&w46 zQm{$oUhp)Q3YW&vq%4l5t}m~z>WNnEu0J2MvUAeof-xst%Ju|%R_f56;PbK_e-!GS zx%MR3RS!MMqcI6AKITV6S{L_})ZqJ5O?cwa#y)GG|}r?@3QJi==2^Cu$X&C&BNib0Bg3Z_@^dBN?Hd^jquUi>QttgLH{noB}QZ(Ch(j}F)V+%H;qR$7L z(Ok=3W-yz($mX|V&WAWrOtHDzWOJ^)N-da_ZuKYMb=!5$QrWk@BO3Mu>#BoK3oW{X zJJie6sBFXDm6$KSXUX5|4&m>E;4cm~lO~wKmW%8Z=uX#XnY#j!BD;*c&evb&@{4<+ zzyWK+yMn(D%4&Qle@~bE1#9;ktYxQ&h9}3`|JGQ0^+&K4#AJI!d;+M+**e7<+!Y@i zb0CAbd_~O_hrtSqb=meIwQf@SOaA1CsJ%C__KJ4U<*0SrR|Fl1c^qo5=y%;zqAAzl zw%bghNm-eVZ!mw^HI-&N&uFd5WHDJEud`G2*}jupE+yMtW`olM;A}SjEWcke_`SiX z&qsjYAESOUWmq-lrZmC%`P+-^?0FWqWOql|W4|CaO>uXW&$kf2dGrsrlYa=8E{bv= zH|$!=ecZ5{S9JX$o3`r@L6!{O>Rp5A?qQs8vnf=IxUs)V#vS1val0&3bh!}|X7xFy zdyN6%gifudZ_T`xN+I3mb+EqF58SLmNebq_8?^_@i6I$o5$@@1{N_n)HLqe_12oEY zjk>bR+qsW@!^jBNH6oz)#=I*L7mpQjZC3GT;}UBmutAtExtMW*mohHq95x5@tZK|2 z>w_red(EIr-?s+dNqdHj1}b9J`erqhtvpWflXVa`Xkq5n-1*eS1^N6qJ-V|@BwEXz`S2f(OvK>Qv#h8A@k*tHVhE9YND{RVcu#6xl^ zN7dh?#5YS^)L~$38uQWf_a6ASWIW|!H0kp#lJx$Y#9P={z^VAf@(MS^;pmo?v;Z!4 z$TYUDSrg|gxmk|-YjFWKE^Au81WNpEd^>oPoE}oB`D=i%!Yv|YM6fxay@Sa@*aCNx zl;#WN0uG*NL0nSPv^wj}=ex$uh8X(m>oIS6;1@|gu$VZ%pw>$+l;y^Y9?vDR+=#Po zDgTq?e6ktOJP-WmvOMXZQv)iV(?;R}j`&gdDf~Y)T&L#_S)Qi3$-8GHKh+EKTlJdr+yt?mPU++nI_LQr2FT+i8?tXG zI_~Wz94}1Rd)Bg8#Mab=1eyWk?dp?nK&m!T{o`pYeBqi>mZTgbuWSPK zzF)P;CcZ@T&-PBq9P2ck)kWbQ8qVfQ;hQ}0|MI}ajxM|-J$gJZdH4@#IKzBgE`W&G zK6>@#s@zq2W*K|+<(p*(q4yTA*{bhH|`Q2GRZhqsl|M%)=Kez2mANp?%cTfDz zl0O~!)k_`?{`C4cM?2AntNwLm|MB1a{FAl!-tf+d&bkLr`F_(&$9!Y{@6Y+K#M?)t z>wkOZzpsA%Gv8YD%!R+a`Gex*^c^REcj*g9fBmw@ru=8yzOkvPx|5@;dbN_qY0qZMsA36IcYyN!Vw;P|k=>A&cJ7VO>QGadt!^Ll=r_yEGBS(!YEl|Mu z2o0e_EHp+1D&A+BYXYuDg17#z9Q12`*(T}s8bwC{Y@))| z$F8pGWB2he1$_2xII#goI<(=?2cZ&_g`4?OOKEtw?Aw^MSKnyHs>oFML>XRdKE$h# z@?c!e@TcKD+somGXWz&;&5{iP6V7-Mkg&RNE}G#ftLZKz!yT?~ybyuRJTabTBV84@ z>DOzVslwN*fbwdF=X1WKx+J()hGQR8NZ)jiED)0~X8LX=#a`FJfojcx79)vE&-17MO$%Do5QZNxttvxQz>rz}hTUj>GdJ>1$4$AMSo_gzda76nwbY2Ga&NT%4ZzeI}5e zHLz8X>73zQRw~KdGbo7E#%$FA8#8|6H_p`k+feO^saq`RH-F z55TD9TTE_PUrwV& zglm0P=LX!woUY)m%vhKI$(n)0r?CU7B)J`X;JVxXEJE;O>0mYTbw6KZZ7B`zZ+~YX zaTM0}xmgN8vd0f3{-(9%onTk;PyVm^@*x3~46|A}W8W_j^z%j(xq2Q6jQ_Et~s z2fN>o?ZIKq8)ptcgT-wds&*%i%&A%^9T*nl_TYYZ!l$2Ebl3EqXJDLs+W?+p&a0w^ zU?Cq05}B_f*SYcrZ=Jo7)Lg7c7svcv(b_I6=^#+Jy#_YH8~pL|%vC~{2mEZmabO@Z z$FAL;c$39~GC8nwqThKFbSEwf!%$WjO+vl@p=j;SwV!Q24>r6mX804_@Lm4)^#i^{ zS**4z;Z}L@3ax?5F>A|tGUwZob2N>?uG&Z9|3Yn#DBRSe-S>2 zb*Cf#PNWb<3YU~1_8dQ;9SHh6?e`O-8T)I9bCa7wj-QvMt}bQq3%-^`($h~wL7o`y z?i+!^91(#EQTHoFb@-4*MVv=?pSpZpEOmLg?e9IXD?ITi8+##>KLDen&i3emT~YtL z(e77^qNpv=O#NCbZFR{c^U;dWIT-QcGR`{>0Yz?b<)Adp+}mO*ww@ zSaawn9%p@{JM8Q|@FYInsDCFuF5ABy-$k1htAg!eY^CiL(Ql$^m)`!0ayZsbtpmsQ zTDRQ?I%r<5s@v}FFN)!C^=R_o2x|iyKsybcwAx?U=~-lJuU-3)_4V#h=_B#BdSvS1 z;6M~X=A_5dFIifG>d;G;jw@YmJttTS1*UGW^qqC++Q+f)_Syc2z=!(Uo$-rPV-7qz z5t^npc>256DXCc{c*aAT+C9H(JtcK%>49An8%jkESkqFo-e;wzFL0)(EwgV&{`^5F zH+3xOz3m<*>HLlguHA1Se>0drRGUuXX{hPdzJ*eh`P<9d6DmCr{{l0(|Bwuhn=CU} zQoY>Dhzw#gY>&#|RGGoOw*M_=@Z8ko(bY%<*?Y6~^i*rfXxye-khwQo1IXNHWNnlC zl_GDg?~iUluDaV^XOa2P2DtTs?a|*NKYt!deu9JY6C9kMppl=TXMS!0-w#^1?G%Nx z-FDtdK5vOCh>rtx%0BQEH<~A(hd}c?)}fGeq)3>|$>yIZ(cKBJS}y zHIyD`C|Nrm50Gmc#vN!VT|4SP!#KBDcrzZitKN({59_tHzH?W6@^WkK!?AS9J;AQv z{^eoRUqs#GUvB-m8&9|JsS8E>=DHVRwU6R^{#yKGwzCJ&B=xpVz-{S)OHs7Ft>X?{ z$~xKs+VCC7a#L4oa*kmOu)RM)Ss=$vi{#vlCAdr*z9gp`%r4K zldUFGQ0<*uHK{_iht93mzlrY}4V~y-yPcNz52^pm%yCi{Kr1igt=7|0=LNeU+LdLl zlKm+<*uQk ztN#wLM6@rIXU`z_k#Ql<3M9d(qsqO0ij(0;m4h3^3z&&mR4 z+Da`4rq&^E5kA~;x0(yMf}>gJ*~#;Hg&lV2*=>L>AkOEV34ONaL-pCDPGDTdC+1b4 z_m?bMCG;4X<|g@WqP$k%`aOAnDX&6LaC+H!O0ZE+bb++H#^jQ^Qq zndV=lpUJqVBUUQsigpRa#ZHjeuQW{QT*HMBGwXrrSkLp}ArGA2Ez{j2<5hF9jUN6J9{2_s zPr0lc6Y)&%Vh`Ej$9(~c8RODq)FmCC9c|&wGvn7#i%yr zc8PBq2_oP`yMpVtB)$jBgLJAb`LV|@G?%U=@tqR?vW%xf;)_|~;S_$3#P>>k zr~BGBOX6K+E+E<*-fENL>cs9(;c=E@azvKCInf&b*PDx0<;Usdd{T&(L0- zz?zxsNBXBat#S1BG8|^nx&}s1OtoAUgbDM+i^e6*%eco}r9B86oFvqOuQQU7Cw%9P zbm^)loc1kWWuqO0Qv0{LX?-?vsSV5%$Yi*cZB!2)4A2)8hBYrDQUhyCT%%f`RTn3eOXAkA$>wjRIAC49!234A zRAX6AhFiJ@=4j+Sjmj)v*@}YDsLg`P7g;YX0qEQkpqq6>=KE0AKUBX#wrBJ+xpjRW ze)n|r&nmCatxiq+r^X5w_aWqzDJhRod&M@xw{QKBok5Xmx^bz#9uW0tA5MW;a2@t zK&vN=LiJlM2Cn+84g(L#e&{X(SN+zH3|#eFT?VfDt;Y>q^;-uGT=iSyWWE(2RKFE4 zaMf>3HE`8$*#@rqt*Z=N^;<0lEBH_mkA=ajVze5%A{GvNlp|6C(o z^+FcAdh|R8XsF@6^ypOhv$83ASb{W3ZV2t9Q@;D1O z`S`C4N~?NF{-#5uuYf2o=a!A8i+>Dt7HJ$B(>K*sUOen!Oz)@9iN<{;4(h%t-A z1kZ7Q41Q*NN-u0v^Wmp^;OBebLdo3yII_2}SC6knD5A*`2@F&D8XKEhTd@NWLMcqu zLq^8P0|+E!I#rMODe`+&vKlKX9dWiV3O|h?9C2L+T}%*;xGu8>2*MHP@8fa-M8x*O zt8Y`~pwcsW?$x(d%JyKf49L7Qol^O%+E%Z=?WfY8c`@6zNit5Y`4K^e8a@c$jI&yV z%KfSE!|mIi%SAQl&ZOU~Z`&h7tr!$K$3F$n!cD%uZKGs};xqYQNZ)2lLWkS8skz%4 z8Bd{o+a6iTBPyfvYVr>s;nEefSvo{LykPBQS23@EGw#~SVCh2QD*LttVdoF`kx-!# z=lu3wavQojw8`Y`!-}A`2h6VB9d&xFj#uHuy6skaw6^rx_xYuZRqeB_pKQOEU$^bN zV&D26+qbCm;y(L_>yGcg3jyp~GsNU8YeNUHdr6zv3>M372BYHGW9&*3bwX7myZwuX zoP>E5cikqqOAu^l_jTD+PU^9p-7#k$i0!`utC(145uI$Rd|L&Qx}RglV3&Y0-*Mv+ zG}t_WS8YcF1y(0CeV~EU|0P@s>y%YnYOc@dee&t72xMiooieS4r_&a4KCN1lB?%!xhue2UouU%mtmwyVm|e1qBQT_ue4w&Gbpo%x zin!7x_!QH{y7_#r_ zIwqWIvsk6|z98Vf7N5%BvQ1X`k;xy@|9Q2^YR{$KCh&Vw`BS*pc;~gbgzu3(D9Vgbz%L|oykA8$!k_)MN*!$dbqj5slmeSXH?4dWYQ55#AN3RxzFME z96X_YhCSPn7?A|m9cT9n?u%VNIeWBF?j8RigWKJEMn#06rM5{2BtL&2IUfzr`-<@6k7h))+>3P%s z<_BVH2RBeXCbR5jL(AGnXX$*GU^hpLNGy#0dFSZpM5V|zas(s5^D)#cjyZeK@#%bZ zw-zb#q4fBi&?Cgn6U%k_g#}UMAd1;tnFHwRok#PnpSGPT!PgOQIX4Ko15c%=DRTHr z*1R0;J@LmtJLryaf)|Bx;E=*NI{w+LozA@R3ZsmF4!$m8_3%1~{sqz|=kHh&n5A|t zLyO8+2~Fdmb=x;VWHdc&j5zP~K$`^Kdg_XNJ$1#tjrF4eZd`<&a1$aM zZ!U#t)Q$D1kuST6z?LXXL$1a=z(`U1D-|zkBNg@kZBbjDy)J$D4!kN$EPdm+m@}Xl zj$Lmstqh~VunPHP%y}NW7h<#-EZ%o^@jS2cL}je@y|tf1H2_gKkxFLUwdC3VGVDY~ zo#*aV=FV4izf#)$a(TG>rBeTg-7n#0&xDBocM<>V;qK=r%t%if8Sy_O7#i{aURc_U z*1nE>M6Kx`h%91iL==5J_WS%_VQQ1rHQfpZySt=NClW{1J5wuyT`}j3{&mPT`6DY) z))Xp?>&B}@A;g@17;EJg5@(fG2)K`bN|l|x3?!xk6)pS;sd(zfPe8P~#WTsb?PIoq1qxGu{Z7pJT~89T7} zh08Zz#pPgq>>%naFv>jU+y^5$#RI2|n$Q0^9{3F4OjpTfqJ9EfDDit_`73<6M?BX{ z|7ty2)IDG~NL;NGi+Ti140y7_n*PLlsZ^(=IjY-TXt+Kf_7e@)=hgmO!#NIA^K*}T;O9!dvK!XZRs12Y zr~7ryzaIZS4cFs2T1cI4zF4;uJ*R589#2%m^?Y5T;ky5S)o?xCGC6<3*Lpn5G+g)J zq2YRd)tbB+&)u4Tot|zFT+IhE9^L=<PtfWQ!>I3fnSrbCSEV!DYXAWm z^++RvkbJgfe${KUE%TaVILJbQ6T%IytV>L%6hAsO_B|E%#AS8iE8#X8=_*{ZK|Olv zBMmjY*BpZiKioNnEkmS#E^@*=>2-#g+bYAWwNGMnihu5t&o>J<`Q{kzVdaEd?_LD| z3z=hBOwVw`onz>d;Z?onH$>VM{i^&~P0X?frRndL8f9H6p@22_Mw zJm!|V*o-27E=IrabD}J?dGQ7cmS`eRQ1=j}P=uh_++78;c03deXcyhpY* z%%fLZWyYE-S@+FE8Q!dKAv2(SHp8C=ob`9O;U^(16~#^XB#pD z(?3vPc%_fwU3m{fvYqntrw#RTVB4Ogs$MgecFyKBJzmp5X zy7pX}lPOb?v<2lK`MIS+iM2VU=iU*>^RPRp0>3J;v~ z0Qvm8BY!rs>W)`sQyHhhi=!=;!ltroT-n3Qva9vFbj6x=&AtSeP=}%cyR2zd6JiyP zeH|V98}=J&ynG2kIO6*F^s54Oaech@D-CD=qT*rWN5^=$grxBO1mTF6;ivE-ezR~U zeu{?cZMULkbTRueky~d#{WO%kCx>Nj9*eu-S z8;9C*9H{tA{^yeo`7Pv=O?S%lhdU0fmXWIZQ|LIfQr4fO%BZ|5zAKorsb~~U-C-}; zw7RBX{Ub#S(+r7(bF!)PmTO5n_^^p<=mshs;2HSGigq_{@GFL(g8B25#DGbsoVBd)yU5O=F04t3+dk$FxGectO2|jb)L|Y5p zU+39eoP*Q4AFEmenTP8-Utj+ZeIz-Osu8}iJSLuVq}Dl~>u-baLIpEK%65#-l+Bg_ zQ~FhJ(}U0jo{`lB7V9cP7g(HsHUq0l^C6jG)duH{!E#G>VQA)9EMMh0%M5l~g!@Eh zbNPV(d@>vRVO?euWdY1fM>v3YWW1c}jmuWHHePcBcC))j)VDTWyRr@Y>jluf1OgLVlvQim4w0OIOF>E1SvHZnj8utd zI^wzvKpB*dxGp0peJbL*jPzrAh9j=aNRJ5A#dTRi?Nc%R>#~+EBYj7UM^87P;f(9! zasfod7S2n?Q1wlvXVxt*8KXw7MeLRV3zadHtfHJ%v)j*ZvUT-iB2aP5 z&MLXqlIwQo@h5tDbzXa_JiPyb31O&|#eWpO^~HA3k-|B;uZE#yRB=B)U$tu}U8oq~ zB?H6|scKK}!aZexG|i*w=d_~7|Gc4$GIQ*q2!nqzKO?vx{)W=m3!cNbS6}~GyffQl zMn2gC4}0L3df@DC-EP&L`H)>KO!lm77Tbi{%ud_bG4#<}dc|3INLuuzdS87JK{)nv zdSAUnpf0ZW)hjhz?=!!q;d);k(D1)yU#iMeCVxoTdG)33vMpRM0~Xqs?p6sJSFPv?j-m5QF;fLFojx-6C`7mLxzO+<&Tw&yYsD0@{$^Qv5Jo#V9cwMcP4!1AeDd}&J z*FyW!fTaIQBmXA<__?oKn_Wse>{?QA+O(-+*|>ncz9C5qNeKyhLXe}!_|CtO4_o=y zc1GvG`V;M?1L6tx%uDQI@iw&pcDv(8!2C9Bq|>Lc@jQRd>^XB6%<;{iGq<5`PF+oMT~Qg{2=2Sr1mv?ySG~R(H^j_3(Iq{YbSeJJ*Fq(eiM3s|Q z-$DMEWydJ?%6L}DtGbx<=cAo|7fO!-d8K?tSx?cg=pvRc{q>R|>U)AW;mq{$jf>6c zs`tw7tMZs@o>E&|@L7fvNW63*aSdTTY%DEOTm}Q;x4y=S`3`Jry0fAhceZnT1(zyf zPDe#ZTyL-7us9yFsyZqfaA#HBUa?qQ@2qGM*MF*L7uWAqY!cTWRcsblEX0fJFDkll z#h}wpiPnjxC_Z!k!tuA1XD-3uvO`c+yKwx?)9nDc%+JN^)(dV9RGXm@ z1_#cs9SJ|jEjRv=W23$`+{Ou2jRhO^U79mV=`O6`s1iM_S0;}aPi zzBR^n{y+*+SE#LCyRXFFHPlS}N06(O5ce+QKDUvXBRAR3b9U-Pnc=4sd+pwA&#c{E zxr0d$#W7#B8#TZAx@IiK2SmdWIAvL(lB3tW2`jyl89&FwFmG~u5q8^bD8{avWJ$Da z?}(zVF=7J_%!LaB@0IY@fFGU6NX{O)@cv(#W$_C5xk>o+3ESkZJ@VPKT^=plTymB2 z%8&4S(jVJbI+;FI>_+@rZwHnMN4^nfxzPz8ySG4m!qkpo9bSCow$;o28pYjY?An5iHmv)?4R+=m+p@|@L$S! z6stu&1@@@K8>GM?>L{>&{PM-m0fZDTq?%T57dDGV1 z(z>!azT77wXj}nf*{iUkwPMX0F@v@?`yPH>pVG*VdS07*hS7z#CD)2oFgG@}K*ogR zb|l=vhTig3OF*Eo>J7m4oM_g)o0zbDoy`Fl0k_V*P-qY=RQfL8m$(|+$VYeIARg$S zbzJ%1E}6ShO#E#P*W;<8M>x~}G!57NU*>_Y)o@*}=*t?;Dx>n% zC2{gWRwa_*dsOq!K0^7=c=#`tf%#gG{|Jej@n4|%*Wi#<9z{qVdBJX$FR_FW=7qee{W444K4&SgN8TntXpCULURfqm^VEqkP%URTyYG zCsah77i5UUY1x;(B^8WCys%RzRM?$QTajnf7(V%4Xx&(>375NT$2%O?VuIcMQi&SA zWAKMf0anLP5sRD+a9*w5ZGCwY06TRKV^=#a+!2-Y)K-F3?^^aw&a1&mxuuVNX+nGpz zlYk;_ke`PbgD^n7L(ONnDc6XUsj%lJENIYD*M@!WSdcMs1$|$E=EXeq-(rZ6@;IGX zzsZf^W^kN@W$&V!FoeT_U+xetJhtdN`g3&bva*1!-imZqxzYKeye=#&7bBvA*Af28 zg#$?gzqOBV?32Gi%s2L7^4{wQvSE=l^1^mSAG3(E05%anv%do5JHrF#*O1RY*P8R; z^&a>Y9{3Uue1!*ovj=_$aOPL#Q`8k;6!G20P>d>Y=F93O>%|@f0k`>Z;!CT$+<{|Y zA~h6P>=BFb(-(`ud{Ba;zpC0P7lz9g|qfQJk!IJn5ApIuwwyb2w=2Dbl7_PvB4 z9C6CC3jYE@IMe^PU0C3(1Ij-eJ39Jjzo+mW1mTG5vi`3H>f-ts<53OQ<57JQfBo7 zdf5>6lDXH*rb&%G$VaAA%0O^R=JHwxdq?ue^_}}S;YoPKI8C`}sNsVM%Q&m?)13-` zIGOi61Ttx2Jg4b}r$ub~_0qvmW0iI-EN>P66g&$z`DEUWQchF(BL4}g@QVMe!zS+l zWzTy2JRdY?($D97SuK^3J|qM1`(oN=`d%{cPT56%UrU>}X8LS@sS~Y)-ove9O+6=A z@H*CJHiXiJ#8t|?QlAl~=H9!XI0djiapOFvuFiwvj^~T4zuZoq$=Ck##ii{Sd+7(d zz6Q=&?@AmmqH==|(uLgAJF`?op1Mf9%{(!9zpI-N^d6Hhx_Xb_jHCi`=}Op2$AQrI zldU+jMCv|@T@cxIFlqlRYkAJKdKlW@_=H`4dDK?S9#nqw8Tg%+*RFTKE%7Oe|e6MTm=EQ)aXWpxR+f? zujuGA|G0^}d7{qSRJ#2Q>>)0Fj$^a^INZ78Yw&jK^DIfwn|v2%o6oDzOSGrRr)sb) z%X<(am#$*{`C>Q&Ta?`|lti%?x>%HOI5h(m+3MiDlB)6H-WjE=dwLuXz}R25ps=F1 ze|u4U%7N`Ho>;w*e>Qv zV~0?3L<|F{219Xp`dDEbZXv_KiG7#|`xWXO-%*TRMd=d5Hr$M|hNAz>yYC1mB!iXN z^{+*2Xc3pEO}nBr%-6xn9aiYFdzV0uaG#9PTt47GpWZS*Qhkgj${bjsx?JZXj46)+ z@`XKc+XH7GpD&(kJ@B{(?s(w;;DP_E2hPcieDt7;$%{V%oc!F0E1lYpyc_rV;(68s zXM2&){|CSs|7I!Zh;IWJO=INqU*>^}!J;dyh+B7S);#;t#@O8Hv)v8yc@BV;L(Jwi zzU6KR0MLqTTC!RMX-FR`4X0eB%JCeDoAjKg`PcdI9Szs> z`>z_V^S?*Kb^gDi;d;G&L&J6Y1E86X`IRgY&sT~69KKUN-)-QV^+597a4rD^VwD|f z1P;mP48yueqH~vT=Th0zDkdgXyrY(UC`Vr{YK4NXB=e3`ak@lb=@>nuI&X zIo$9;gk_x7_~}lif0hp7UZtIw^u;b3PM4UG<)#DzI z$4^xaavPDhif?G4S->jvM1;qvYE~B+G2I=ur(cT_pW+47l>UcGMB3TFB zZN)i$IWq5=pKhW}xa?dDE#IAn2vlI`;`SehXIup#RtK$%)CKqVCj=Vdy14V6$S5?B zkG6ZefDc@`Bgapa;+6eK5sJm_yoh`4Yzy)HG0r(qwpDWu;+!~RtdBW|4I{8-D)&eqCAV%(2s51ScIL6p-2OJj5yz4tEAW5@Q}BXIEa>Kbcv!m=g$j?Vkv`wu+dr z_RcF-jFUz4#xS7>v|?GWcFXs&DHC%muNjzl{A4adawY#<1iKP_E<)4=U>q-)@&F^^ zG*~{IeQ7@YLJu6DL|*^1J@5q{_+sFsKOj2~QTKp-!NdRc9{73>{1)JhU+Kz;`Uq^J z#M@;bsOlldZuGy&zz20^;sFErWj?G5Ge5g@KsOT+)9;X3_))^I)k{Ti;v&qWA2rmM$) zfreAwQuOF!U487aO7pMtEw14@o&T)iIzM02aGm~r8m`knnuNod^dGO``dCOGyXyIx z@8Lh8;ky4@J@Bt;xK4jSQ0dYsy$Gbmz}5Hu3jwq-y7*l?;;L$&+8=o7^gX27;5++ z!jdl4Uf@>udJ|3b!EV$lm>hC9|$XRj)KfI`Pwn`DLjM-s0&lYeIihZD*1P~u~zLlav8k< zTL$a3L_>m>5c(Pr_=yetY{}%cEr6+VsH?45(-yzx26p?{z5j7IwmB>kuQtm}Ln}V< zYN8BpwizKapnNvNp9VZ%n={n#Y_k}r+2*M5hih}V9$?Z0C~M1}_qsFvvY#{aPXEm^ zP@TN0iy5BJW_v}yO2)Zc1|*O2wK;5>@}<96CZyJzWi*H6^=ugTD&(7=Tz#(m=!dQ^ zzMGAzbRltd?U#h-1$S*@=EJ`rwLGrzz5DqL9fj&XdUTE6e~7#LC~%2I4r~gxr5?D= zUB~pt8_}EcMs$a~3GkJO$F(8GUEI%aJI#R>i+kQ3jF(<#ZHZJIZEcBF92MNv(Y0~x z#_9gVDBM15-MO9c_+Zz@*+qE7{V`VE&W*E+-G^iG(DCrb*(LGg7{_sS!5249ACalg zjprHUIC>e8n2HU(ZkAF|oH;sya{=d76sIrtx4(PN#z;l6bw?v616)32#>nwMVw8kp zCZjsyT1?gE3ownaHS=pU3aI>rHJ@aRw=Tj|yi@Z6VtohW_}h!-WcT96${LD~giZNC zM5$_H@K0CpIQ!$>p2|w}Kd+yyMtLH~**|anY*9h8{?tuAJ#W@veH^aV*1X2s74R== zy^2&`*(T=0Cwt)2J#dZ>+2^cVvTRwaYb_@G=xf6v>Ck<~+-&peHEVq<*DQ^%I&={0 zE>=sr^tD=jd_%hEi0Ry2E>O39)W=CTYq&lhdQ-#o@x-aJEo9T8kB0)9|9ow*d|mK` z@iIxTK2?>gir6eG&vAfkM>olUds8xZ8p}l z#HB*+;l>e@gVUzELdei%3R^3LkRT?6y#ZyIV~0r@Jku!3yb3Ig#CWhwq#_iNlqNZ-SBWiI?jbmGi`o5b>iY0gc01gASd#%H?0QH8 zCHJun5vwLSrOC_>u*RU?v#iYb8?-e8J2kU9x#t#~Sw1FS4E;(w^*M-H``q;0GqtbW zq5F3(M2tQd73tvB=j^im@7lG0h|jpU5s#ViQZ})nplT<3{C4fT@iVL~qb@izVr}cP zw%|zQNH=aD0^mG^`*3Yne3vkbf;dB1O`+A2oQxE{Tzr*SXcH%0+s@mz^8^c#H5jLY zFQy`~Rre6=ntW-rom$jj*FLxInwaxKZ~$**)`}CO?OUlKaLX+VY-hK9M%}{TF8csh zz_3TI&bF#oLG^NVd9wEZOuRUumqSOr)W zYIn4$YVhTa`f&PJ>iLJAG`AI~Mir6c-gpqj9(5j% zS9QQF)d%>lvrS>yx?^O`aQPf_P8Q{Wu`kAu{M1nuP_OM&V_>UjNIIWRV260_`=v#6>vYuDo+s;#?G61Nyl55&UuNl3 z=w?&JwgWXHi#c? zJ+qTLTI}TczW8E0)fQl@I?hgA*1(pgmK7t_HbH?%HfcvLcx5s;e4`WNc^OTTp zq*Xnz<0lABkKD_SsQdnc(qR0F&17N7PF+5>OT&yMZ(nEkOj?gmv+ z@J-4{cI`v)&tQ8^rj&Bi`D5bcc5-{EUHe4hEo}2C_h&}%;_Ksia7&rO{;=={DXe$juK28g1=h_D5#`=QL!2R zVpZ?PoDXk(mzXtUyR+R5lAaFf7VCK(>ukERHxo zs%S@SHWZMoI&=v0Dk@RPR!6WDg5#=+sdj2rg+rOtUh>g<5p&wn;X zo!`|tkIzYuJ1biIrqwYU9}Q#)+u2JQ6Wvl5X+o@s4+*V=NV z6?qRL=5{slHeyJcsz3|tI(LDLsj(E2k2%j;oii}* zL2;0cVEgfSvXeJeRFdMBpA#h64X6`Sec@kH=q355J?2X*9x{?qQvk-2{wik0Xxbt&p##ovGJ5`Rb-Fu2Ly9&DaAwV`}`;gn9g`IRV_4sGS zC#b#*@gd32?EuIG9Qr+mG%hPs z_>Q`VTvi%MmtmXS(9_7P$ZWYE)s60{Y#iLyn;OZMp)Pq}Dt_zHD6mg9jx4Liwm3hc zDUS~whn$9NUYZ(dKvB6LQm;$zN9Qm8(PqR&YT&~qNaB-0#G){KDzNn6i>2|Qji5}8 zd=OO{E?E67I^$>vhI0VbQ#WEkURujTY?neTNN@>?+(MM*`0%e#RyBkS+!LtH=)=%2 z;RD2p4}F?mp^mSK-}U__cG36muEY6mG(|&xpgFt)Ql&;d43&qyaDe*b+`t6M)r(u43j;j_v1{}u_ zu_um|-;(;=?-2x+%k<*h!}VxzE^S|b{<@>iXq@*9_xNGMpsNeW&eR8YXD-t+!@7Va zrBE5*?Wd>>?lZN)S5mkE3}wJoK7B z3I141EpdgIr5PE(3+ZyuDXjE9emMS-0dC-42Ide{u%nsR49u;K58a1?Bxhn#icoLY zG-9xiy^Dj7V7&h#O2?gWq%~b;1~BB%YvJmafgL^<;ycR61rU4j$jYkJ$ilhIY_pNd zWaUa3YsUD{dy$b?&f>$>&Q~}qJ%%&w-Te+)%l_~H48Lal6OqkWx&S_5sKJ1e2W*^|QKezvIE(rE_gpD~a2H>qdQ7 z#ZknE4soU3N6OeQpMz)XzUe#~c>^X%rmy?R{#Rak<+=Nh+j;x|OlAz4eb(LR>VYj! zRQ~J008*hI(8Z+)z%#MY^g1tQdhl1%nsP6uPeRXThxZWsjZx@0RmF;F5vqsWwy~w? z9AP*xws&74$|fQHFwe{0$vS^*1~|F;gO$luWQ)R5hGrRxmWJMryvSHgvSDEdWF%Wf zy|}1CpWc1Z@5j|{qo55d*r82eIQBNAMWMW*Usg9dmP0C_r-ycb>?-6GpVRIHweyZO z>^~w;vVT7K{IvM+kMZKln$~|~r9dd>YEa8%4sJe82Al zuAI0sGyF0F<;uj^@A1^MZb?PcyrtE1GwrPL=eqp5+0Cgz^Dhe5-EKauao+uzhWM>B z243KV+LrjO6_`-lfyeI>$$d9o|Kk+;vpd;m%=C?K23)S5%ar@?XA!hD73X9=IIt!j z%U)HaUpagWX?$1WPGn!i!fP4zW=v7H-{-lpKOjfz`~cJ6w>-me#D3`5lYiL1zt9-@ z#(nHcCqf)u&Py>7gT8L&yaG*$>i~?MSrDNKgO9l`55|Xv;aw_zSA4uITI9ys@p-)9 zOIhN^37#jOS0K)zm-&>d2;8tqM&fqzYV1e&+_=lr z>&c;Vsa2TOveis#t(eAMWZv?Tn?27(@7UK+I3t;5wy<(T1s?bHm=BDbY{~~^7$qzW zrDH9rbUr-rLTH8`dtV{+@u4hAIXnnii0eyO-C}o6eE0|K1biM@cJW99vJ~dc3d77g zXeaOvM!xK7p|J;%hKolIV=Y;;=O=ffQH_n=Q%KkB{5#P!#Kyi}fHF@-O0nmDC&Eyp z?}F6B;js{;2)*MfqAvsQhTJo*F~y{F3hf-5Q`fF$F4C-mngDtHB+xeHpnfj*bH@1G z$ncHrN3IsPP!xd|*G`T7k`a@8cPOhG-BIWFHw&&a+$J@P?W$Jo&TI#PmaWEBSc z2Sa(wK;~0L$N%x6_ai@I4xrX|W@f~P-|GM*7>3AhO2B)^w;kSVOb^6|-vu&PpWagi z74hr+8I{HyX4DZ>%$tr}TgD;kEpWncUjNE|K7IUO@Q)65tWe1BU+8GPyW*E|kpm2MEfjomen^8~F@=a+v#<-1wC zQTt;6vG#Ge*D(ltezkDiz=y8vXvgKTUE*~ z-MS^uxvt<^o{>+ZSjADmm_0_@_!Wh%!I2(eBFoQAhVj_Fwo@2D#nztuD^fgeV z2ltc=oR!G_HcjMHKpJyT7xJtnrUt=w~T zzPvWg+m(3@ClLnbCbG|@=Rw6zpX0D~Y!2)xCE%fBXPRW9q=Q?h`E)uCA5fZ1{P0ZN zQY=Kg>?C$8b;vl5+9AQy$g(m{)^h8=>sRh;s2#v?0Zy7m+Nu^0Kbl#cMuD=y&(|rK zC>wm~xNG0!>Z79N?6_+l$HJP_5f$-|t_I)z)jx%2dWI@BGN*bRb4)6XG?a0eb2Z}) ztAB8#rEBXmsd(jd@4(FfxX|qR-r|v&)r*IpiVv|6`+;2DLn&80E!TW<@$h3AERXHNozu_lY&_1Z{sDy(2R(ttc>OC}t2PD$9kx5zdc$_kUmk967rh%ZKtoynM)g z7$0e4+lzr;2j~Rz9RC@w?dv%nc%p8f!+pbr5zE+7<4Lc@E7J%D@i{4TNlRaMXZOl8 z6R}3zOy#WBp1!`e)=UB_B_d9nK<$I{u5)TKtJOt*R=F?wp@k#k^5J5 z_QozrU3h-u`3qwW7hZV5g|WI=0vA2^pP9(Y#TH8J-P8bnI# ziHU4KNZNZC(>`KdTqSB;#JlH{*uXh6&cAH;0exg#x|BIH(bx@!ohuL-t({QGDPq!J z!&E(@y9+ddE;upK*LHQbv#$+d>Q1!ut<0`&>&{T1adhKyN3O7ECaQJJbJt1qtt zoWzgjc>XQrnd~L*{vvLIyPOzInYUuZdgb{dv6HZeNR#dH{uDTncBOGVW z7xK*c!itU4OIJ-)FxOB{9`_0lx98XKfCjpC(;D(TQl3Y$^h&V6Np`EFuA$t8<8bMG zxVvr(Jc`M&a-tjy%F~cR^&CATw97w@q^PARwPzobNp7s-1dsHMbLgeZEfi? zUI!&mWBK^EB%FU%?kuM706+tl9#Hgm`e<}fBGcv{_p?o2=8dhMa9in)V_Evndc$h5?Coa&$N zVjXdr*9_?Hz^Vp|A>sEhnL?7ayyuH?R$Ka?&U558#_gAdZa$|w0)L%O!-Bu{70J?X z!&e|k>%i9}oIfwT8fh2e)}^)6bI>SxuC#RX#K?u{2Y0sN0QYa%^A2-kvmCX@{_M+b z5iA-e|6lG5MDg0H*x3cH?Ub6{ysJZiy;<-|$(OF)0Coy~C8!OVrD(Ly;B&FF6r4*X z|4~Ut-Rr+laMcy;$_|;p6ubZHV&LSnQ-Y@SEsC?EhH>Qwb_aeXkWO`NSMejvAb!L* zNVsYp>i?#>)9?n6$7${~d@)>mv4wA(n9#T>pt0EJBJeLo;9riw|04qDEKD(fzYm;e zQ<4&1O)t(@Io$|?Yd!yp;2Q<@{5>rKuaCgbi@+}ePC2cy9qtITNq(^0_(}kKc}<-yVVgC<5oq%Mqp* zf>&prilG04qc7aAr|ESV$|2KHjq-Uj@M7Vr1y%;q+&6^qAk;ma@ zGjw;Z%yje@`GiwkE1+H^c1^onyw~2F&9uha+q<&;9jZkHr#i+f49y?&fcz_QuOF`H z3nj(9E4?j!ZBz=1QH;BAg8}O5^0$mjFbj;Fj*~)kbalbu#6x8OGd*1~6;@&ifgi^e z?{p33u&9z0k-MTfb6sy6@9fCG2tlUDsZj0h>sjfPs`yI>p_r6&KK(IFA@n!*w;?bs znVvqLdTVX#UO{^`M%0BwZRY5(S>}=)+3H@MkXb>EE}o%r;9}fgH|TCbZ0%_2gMiIl zEf}BHk+7A6#cXe07C_!nM_X5KOi~Of*ptn~nj0@@c4-I6klvJla^{`rz_dRGDwiHE zMv$K}vq2k+agPoSvai#pgoQX~Zg!~0xj3cxKO3B53&q*)(2x%&#T93}Llg4fXCFy%tDn>2pA&k9Q%JsdQ|Io?zH z_Zr-$V^(nWx0a4!K49pN!@KhNl%Z!Ai)Yzr{=v}Oco<}4!B8HH-(c{!;ai@61pY4Zt0&kxJ}10 z>5o#Lgz@(s2Dkjz3eI>SOO5}J8G0MfpEtNo_pcg0%x{|R-!k+z-4EsD28_n@8vh!* zS#ZjKJboIV-!-_6{|5|itc(`3~jsK;NODr~O=$Z92FUCm-Lp~?tr}1-r1pchS-)`s+VZ_6bkHzO2 zd?vmr|92VO(kDeQdc*v44t_L4g3}ovbv*Qo0N+qT>R9YC!6^^Nde|!COe+V9Fd_aH z>UR*Fd)igb^QCh|dW%0}@KX)_^^)OL{w4TEvr};LVO~~w9tr3dkr-yo(A#{n*Wflk zJR9&i*RzSeXmDl$x2g#HkRv?-<+1sv-r!cw_ZZyD(=51#cbR7!TV?2NdH*ki+k80f zbp?5>zsDHd`uk?V)!!cR_hdtF{jFkT!7%?YUun8rCphE5rsKZ}uKf9prk0%#m@pmZ z8{Ep77My%s5tRJ7#L!zg|HI%m9)4_a%l{{aKg0D23J3EmLvQ(y8Qk*!qrolz5_X+|1jYH zpwB+BpBj40f0w~6{}%#2>qX8(WIl-TZ2gTJ-15&D-1Zy)Ap*Z$aK;bI`%;mA)X>{@ zaF4{J#_!$QOCxcu1e>b?L z|Bc`(zsj@M&|7&*-w4lOlzy{+jlD+jQ2rwg{tnP;xatEw8vl&}{vX2s`~d%!;1>n> zj|IO<@KByl8QjLtKO5Y}&m94Om2;cHS^w9_IQ9pIkBzs74L%q28V?IO*n^>*R-PpW zxAI(Va7#aAa7+L92DkK|Gq|O{O>j-$pE>C;PBHX0T!*j_!YIAQ&x`=qbc_f1x4iS% zQ2~CB;BON=OviH!Zo{?6;5J;V41cEArIKE24E>qFHC;X!&<_axMK@y>wgh{5J}o5Ra5khv4kP&?uf1yw<~cJRvyS2%3;S z>CghM^yvU!FMO5+_+Caf%%$GS^VfJ-9^lJ`Pe*{Ozr6uIAoObjyh`Tp1|skq0z6UX zf%O5N6#S+DUoQBD0PhulZwc_E;2Q&6={E(q(vJpsrSQ2oz()n&8Q>ZZ4+gj{c<&1E z^}=U&fDcG`_Xc>6l#}NpaF^itruphgslT+`D_$vhB>_XPcvXPENBm6$c!S_I0X|dk z+5mrz;5ts?XO_GBMV@3puXsAZH6E4(_$J|VX@FlW`0@aMr{Eh5&MbZoel)iPxZXX# zF~IfiiA@2n_v(!X_?hyaaK89Bu=QAdfNMG}4{(jIOn_^=+z{X@_YVSmR6JLI_{yL5 zbC!y{itD}`jki25^~0kfy{sS1B_WK`>wbqD0$leCYz%PSFYw0z*L8c(ed_-SIHl+! zZk|z6p8i$xuYRc12eCN}U=^H{ceMsi^G`Ru!P{|I^hb($UY9@Tx?g^rIFj~FS*ZN#{@vnUvWJqzmLKmQcPgQLN#rT~1N$$<;x8@nw^96O{Lydq zU*n|(7`@PV#-lT}CwiM}8P=#cYQGmB_1V&0Def)C=aBZpf=vj&xSty&tje!^--m}{ z;eY;oPoeb+!_TE2b+6$+0$AXMb9mFq&Wh=LuYa2;Kf@EsPTCq43>dwCj`{8={6haZ z_ABQ9E=dro-mxZ(zf6NaoM0*R4cSC>UF2=tXIO%ti7{=u%*dN7@ zxc1@l`3T#nalPE4Pd}TVL`!<7BU(?!E)v>dw}_9#1W< zd)imDTt^m#Pt7>_vF zS00G*mz4LVVk^Eu-n#-^)BnZ**Yp>7%2om{S$d-S!aC+t55l|})fY}m0*7sD#;LQgplb+x9VQgFRCxN zLg*GFefAN3 z!P8Egd|z-Qg%p!?w(kq7ewH%PE0bN29{g=-?x(v+LtSv^Q=2MZ2G;C9HFMbZ*s0r- zCAfPSfq>Ha&HUm%I|aZ{Bcgr3brMBJh#=^BbELZVV3IL z>qaU?Wx*zH=YlHeTaT_A9eD9nr~(;y@k5z1^!NtI7T||VPR;I>&LwsFK1%f~jwQ4& zd~%e2#&4xMc-yz6c8OF@?h^(*RLi?C42@>W&ps6@4C6yNuopJDt(jTw5lSOP*wo;o zm8smaSoR!xpjzGG%Mitaf{=#T*&oU*Kl{}9(0aUY_jOP}n~aS>HRKa@qdw@&z>a-D zR*zW!V2M}30PQF*kF_CA&~5ejso8%vq5l+>{b|KFgR?Tn5xORBHJHiNpb1TXk%P$L%hH{*a97nSN6%+g8KfsU1E%BqTz7+ocd421; z|MPuo*17C!s@Wh9uZJD>1Ne#4ti|x-Bk-9K_?!rQegw`uSIpllfZIN|%ag!*BIw!H zk$x|18kbjLUyolg{@NF>EhV+&J=p8;73+mINn__JP@Fqai)>h~h~+(~t*$Y8vE$^tKPr^q~pqukx_tZ|Scw zxb5>t_3b}t=$RfW=T?IsY4H0D&SpXBbse2@O1IWgR!PxdxL5}%y{;b+w{q(G0dYG9 zxytaN9~%FEV{j|~7X=UH*<$EzxE?gP4c7~X4|%D1#n9XMub|*C%nO$O4H5X80$kX} z&J>&$r^+?n5_qN|E+p>#QuklLH^_T$fbW&}odK@pQ{X9E3Akh!qQ**ko=`ntnpqPy zR=QUh>iP)dm;Rsyb4L5xEO*4iu@28K7Bd>(`i=E1c}~@R9o&*zHr+d_k&mpCDN^V^v10z$O8)z_XOsUA{YN{(v#B~%I^bC8^f_~6 zp8eqO{A z@4Vf?iITy6Oxw)|j~W0&yepya9KM_?x&-$esX7gz2GD;xDt_zt_SILElx6n}yjXh| z6E$n!!~2tTHw+QBLN$C&p1 zLErOkrz;L)+v}f9BSXsAHa+47IGLv8z8xjdxqfVuSG+6tcr@ik)33QVKD+z?(Bhd?%wp47v7nE?zibJFP5iI`X1e<@%46he~Z&sJ(1Rp zw8gfQ$jT~Kw_NDY5|Pz6`?`;7B@x=-otxURnw zi$ICqmX)f$%eh?=_2HsxTYCG+f5y3-0PlwaGrlEooZ9=kxUIh*%qD)g2#V040MNO; zxTh=IooVU2F45WpDc3;kYdbTo9dIV1U-Ks^3Vo$_Cnq~lXTOprT(@FduIpA`WfHxM z`kFADF72dBC+KZTajfi~pb{xY`X>BnTtCr{>32;pZOsqrF_5P@IGs2V>rxmy2g_9Q z+S;G_^Vh5>9)tY<-?~-U1EfT3TMzRO!T&VZ8V8`GFXRmU>LWjjPnnYCZT2zk7~SOs zVC-`off&+0s4vC-oGx)S`V=+hW?QE`)D7)L5jguu#pv52aIV)BqhA|=Z-~Hejlj1= z;6I4Ke;R@RR|Nh<1pZfRe_>;h`Zkv3G%6D#Kvzq45;rtByx@tGCfaVsw zU_G@t%NC=#(`nwwu5RgHMI!g$W?P*4mX%#SS8-y-sr|?=uYyjWoBKPU76$4=`lymb z^tX^vrh|GRTQV7FTmciPc~Lq1mk_1aRWwvF*zKKAivs;8`H3G)HnnwMlYei%3W{E- z4y3KGyBWk#BI_4}1HB}e7n%(!O5>-ZoB|oV;X_-?YA7pdgKAlRCKG*a?`vyo7EUhM zUg1l&JFh_o+c)T_r@NKw!fk#X+6A|H1!k}Mda$OPMf+Na2IoJVj1M}6LeTnLLKIZR zAhtBd`@2PT3f!*tO*|FcV6Lsd&B-PV-ByWac0zoqD~zwuLvnLfIu~=a5QI4AJZXq? zu1D#QCkR8Fb3M3Gz!^-{J42lLU-7vfcJy|R=A8z&b26~UU(*n`bAodPSAUr{H0Kz48xMBxuJ!j5hTi)7d4n?_ zsyufXoMF{;*=q2Fq5p}&k2Cl~27jx;S^v^7yl=x#{r#Q6s|~)-;4D*0|B}H^F!&*4 z3`6Tg{FHu%!D|d&X>c1}olD{8lMFq_n>4hTHp>5I!HFG;pPD+EaN*~Z@l$%$g+~1C z_}z#f%~C_pyrc9T20z8%2|Uw~kBH#jm$?4|uKfyur)(wQl2LENNM=d?!CWnJ`nQQ~ zeAFE1Er)v-y7!i8L4UOTv+kf_S`!bviER=<=}AiyzB5jVh3-cMFw;+TKB13N2aNuQ zbD-*;WzQPY(x{!3=g|Ew@&CAqG8#4Z!} z2bzOz6Ze7h*cswJ#8qy^-zV;EUgfvB;(m=1imh@hoW%pjEJ+2#zEl!U!^Ql=vZ(Gg z|Bx(9d$Q28UqgH`CX}D=q3k4|D+QuM22|_|FiVI2N6o=*ps+9{0rSv*bZELdugXus z9(WG6?u<##!R}>)ASUT-zh8w{1&_RQjEJ988s5+CznK%$>pon$n{ayF`)lg<`N!PD zmpRhH{s%u(T6j-g(wN(yzq0uHC#e@~;GHpC&~~_=REsw}m&SzE631}d9+(2`?%~;r z`&QvS?sGeQ^Kv|R35G{;xm)JC^txna-TkReEX%hs@#HG?9h_71a`R%&e}KED+;h&U zguw4R!TysGUY7N63OAv~1cGxYR+Hhg$Ag*n9d@Yj&@ctIZS zg~F9e|HQY!?XSyw>aQ?PW{ztZekyx0ui;BWX1Ktmdu~qAd5xVtpAi|hrADx;-9(}z zbsxc0GL6Rn*k>>Ux&E&8mV0qlyP6*CH`r8eE4)c z5IC_S^-p3_enlnYR5f$c@;d zM2NrM*LkTp`HLxj++F*LQN&kG_6;t7(PK}*IM|XojlspW%HMN0y76x9D)$+a`w91u z8aWErRRhjd@;X>t488!q&BQDr`$*S$z0>+&z@rejAv?ZbxD8 z!5Eth)Rku+OM_2LXGD$NMp+z=J^hHT!6y)7*S<3L={&xjd16P&H$Fag9kKNn;p(hS zWX>}I@%p_^xbejnd$#P}|7UWqxL9))#ro96ygqh#Un>5I?Wtw%UawT{C)_3X`|MG< z2R4t7d2A2!H~cyd&Mzj&FEej(&uQH?hD&nyp@d~qbx&dcSXK6j%hI{sSEMdaU6HyH zMYUd{VWh07uqll3?6_E3#P`E>PdS*3GT+{_9j)aQHeN-|=`u+;CZXZ@jfU^F?n(L_ z*xNK%%998eltYzzERAnVw$r`dR76*Q=@M+)!sK*bU;F~9 zqaTNG+WF6&bN*j`7J^N@)uXOy%&7aHJR`yJJM&g(n726RsNb|t%09MY*3Ib=IOiye z(Jui`{Hyd$3BE*dE&n|CT#Wx&Lcd(-UEM&2+Ifvp zcXTsnA2DxoSwk}LtHm|r2-#ekGn$wDXJw0wZa)Od-?q}=I^tSe1 z7vroXU%?4CN@2MVGo4VREqt0=`ubX~n>|tCbg;n=2W4>cl4s*L);TVYp%;Ubpb(R@ zw4iHt3ZtQd+JEfq#xiK$)7W@tl(M;b4JI93V6N_$8DLy+*3&1GsX8Uw?x>oZ+w5fr z_W{t559cn`-@h|B$B&BZT`r{O+@<3GVdyRY|2DXtv!kAU8d{teQ9iQ_&N^E0cNpA; zYmvci{46!N%_mnH+~$*ZgWL4F&fuKiPdSyfyyy zoqHLIrQdQ%==DO#^rKsKujv;x*SJA4REM}%OT%s7L)rPQObYB8Nm$nHEVrTmuK^aO zJ)qbCiDBjk9tN+jyM|p;`N_ruosFA4Z_b>AGY7xlb3lcLJV^?L|HH9gCUuFM7|cD( zBV&JDR-fC(9iKI_n=n&epWAx&Xjx~4RpdxVoQ zm6@41>ctqZ7lj5;e1NlM*VH|Pot-s$h%9xbo4CX5%3X|ILz{hIH-OlPpVb+B>9w~r zy)!dz=X&n&L-B_H#JRd$Wqjyz$dDR*xztV7WX|8rSgsqrgJh1wo{!_U<>$6BOJ@9( zW`2&M@;34ueDSrJ!-ntA-50O_er|DW>~gr&xxdXMu-wM}8ea=@MI-0nyKH>rlk@Q| zK5b@IpUQ1_NMmltp0l}M)$hK<98|l*2j@=DUha7WF5PQk=PV|~a*vFQqT$ip*6hY6 z%;eA`xdgmkCQ`?4!pso;)9;R*ejR*ie|$It3WttV4ZeiwyHDbMhnxR!sEh5f{|BIp z$+3lan!=AQ;FfLG51 zf|>Lj#-BN9;eB=W-2eQ3xUePko=5L{n^;jZmN>>#qh~}oZV1~?(y$FIhR=+^SqzHN zGo6d!%OddZ2z(#{UmJmcHUckHuKGks9O6l-to&U77c%nFBosEP;fz-`X- zG+*0-u`ljZcC5&{qve{m=9N9TZK|uKZ#71y{0Gkah};V&IOjQZUyU78G9M}Z0^!3rV0*9TBE#SI{q0#V@>f2q484{A8iQLo-*0d$ z&w${eJoYS^m1n)-W5fF;gWL4I!{C;W-5+A*`FRAr9TQvnrwzT02fMGsrh7snoax2i zU&*nhhsB9Ibo!o}}9 zBG0M1*S>#ko}+(I|7Qib`mgqx_^!{ERL^=@jL#wM1%idaT`xdKz(C_q;YD~T)_3m^ zLXBs}KRbNtUh$~DyWWk!v4J(A{Cp2(C%x*dzE>PDkJIna|ERuuLh{e&$;_D0f7I-3 zL{_)0_TBdb_1#aKGw+Pa_T4)ed18{z_WJ~&=Yjopr`}>SCx+64drI;OB2u|~a-*r| z{wsCde>Ile(5)~HP4n8SvQLd<6Zx1sPpQPeR1w@_j)3*mU-he z-0;12Iu#yVNbsA9vpJ{GrRH(^8b7vUMdjAhcVH8_%cIPcr2!ijr|kbw|8j> zjG38jd}xjbPz-0f6~kvo;AcnRO%ZrA@FQZ+?AMT~-4Q{5bp#&O=l@s){Xa(FUy8uL z8i9X10%sX67H{_eXS&o%BjL&du=^tDe;I-6NX0cOeDUjSeu#mS5jY*!9>WE-s3c;m zSyL2fVoTE(HaA@`|2$or>y;h&Zo|I}QrcEyZ(DyR#y?()8yioQ?RGqQs3D8f7ZX%r zOjKScqatyrM-JSIqGRPe^6QNhb^Pk0-)D}faP2soI_<015`MRDdsnvnk|J?!MSd_H4v+qeI^!R`9q z?FMI^uKsQ@xLudHS8&Q>YoQ+-db>XJioxwVMqKhS8$TMu{EuW~dn_Zve9G1qzzee!avw@V~rth~R z=y?{4CZzudgWGscIBHK%H)?w2ff#>U59#-*+6g$MC{bfHo*A=-acWJ}7)|HbYi01n zGEP?7PUsjRYK&HD18+PG#ED#=Iav2~A{X05Ys$p`lP!p6m0#sZ0^@Tne%8zu_p>aB zXLYA`qroic@`DWjmEt}mSNAtrrg&EQ73LVM*cfjv3p$L3D{73zx-uLe)18j-I{0FY zhFc-NhqCkAa$%}E4A~ZNJg4$&{vlS(f7QMCTYR@B^grJM%L>f_$9Qv3n?2bv-t&w+ zF-d33`phz?Aj2#46D80Xr0mDO&j<60HMk#hTc#SjB@>y~VzVZdL+{v4E>yN>2Vs72 zryHaFp6G_$V;EtTWh&Bsu|l+JxJ{gu*mj(`y|D8WdozD=*9tJ+Y)4_gD6EfANn!aI zz4l|D-@B1t;d|<0Y&>nuy~45UPg59>{bAXijBlv^`z?a^w3nIz+L}2HVz~f4Q3w!5 zflWCC&u^km7nYSoC!=$Zo!HK1_@-Akwz%rM$`tOI3+dsn~9-#!VSJBhN7tae<&{hZ$$phlak-%r*SFJICxLV zvZi?bu5|8Mj9n!_J`LXC(*V(4NCRkfG-RX z82ia#KZh>f9DzrT!RJKKH$>oU%ZvGYbp(D*1pZ;*4A(~3G@6gs@A%zVr_>a|1Q6F zhxNJc63oZTtK-(_%?am95$oP6xqx5v=iu`kn~hV&f!DxVR8FvRVcYy&|U z;!G!{{~bXX;#Pj{ai$?|tci3aM|@e8?FIEZ^QKk zgTDb`(C~iS;5NMX8{CF>m%(j#e`jzT-WLpR!y9Kr!qBqeRo#!oZFt{q=xunD2DjnO z8r+6U*L(QchU*^;y$zS@0_0~Kt}TY%hU=#Wx8eFPgWGWJHMk8|nRMj&*@jE&7vgrz zoxnQ{abfA+FL(b1e51Vg2KY{S|8jt9z4l~)YyBngl&u6@GK)lwxhsMJ4dcR^$T4@B zr_w!bOl$fh@B#Nko*($DeoA)M*T^yV!Md*#xoYzq{e!xn72xW>+EMGGA2>+)FA)E2 zo}rfm;y$4si5wb#^6K<96&o`Tu&}_a@s=xVlUWztK&CL-4*0jioPm80Wq04Ci=*`e z#i8sff0Zy`-B2v5^lrzyg-)#?I$X02g)rT%2RUY*T{m~qdm7WGyOwl<_;t}`xu5bZ zBUeI2dHimE9eiwhw##UfKT%XOx{snC@pi`9T?`B-`DH0|xCLkMI_UdffIA-fnQ)M__!>kdN&nyu+a$xAY4Hr!1z5h@EHXZJ**ogIhlDF}U@& z#o(5HmBE>g+L!DzxTPP7z@yfUK4|F64gZ9}8ApF9lK>;;_NYFH=704s%)4*IhhlBu zMrl|Eq$n{gd@K`2+6J8VL>r{Z~5)az1PR z^{!*FU&+IP`Y(0|l_7{E&h1{3=E zd4Kd&YTX3C|F5g9J%cAQ>fSN=a~bQ6fJrBe_F+pp> z$AXH)%8IH+cT3F__UFIa*I4sUM82+{hoOMz$dN%ql)5}AQ zQ&_;92Fk9^)qZl!y>)iC_wZ9*?_^%pC3v$=pkdu(`vjDqhPZ9RIQK#mw%Ke0Xh?7S z3iBQ6aoeUQ3?9~d@@YyI`Lce9Y6~@elzAApQEj1CP;12DWZS}zs)vCc)@4y`;la9( zY75o9*1al*`mc5pANb6CXU)guWvXrAotBw-R(};cVYHCJz3L;-(^Pp*y3v z^lfegP9;U@+{=D_lE>jP{;C4374N3_BV|}8JtkM~4zOikQw22pL}9DLKZ@iIL7eXv-ETg&^`2B*K*56E%j+WhiM+>Tg0l5W!D@;`F}Ed7LG z8voDlgAHp;=QXOm!~8?=Uu+GIdD^yxE^dKEwRvyFx3K=DH#HGB$C1V8(-AluJt++N zM?MsEQ@gJRT$X|pzsdxEXk=>7wRP;f>iE&NnYJy}ycV{l?4!|yZRQdWJN$n`o2lt2 zVogYcs5Y}k>IrQ#87Iukt}MaUx|n?j;-*@`TP$|7`=9t1)_GBF=E1txHZyGV)ct|l zyr?c6fVd;0x9_7w2V8@7Qo%r3TV&~X!S+cqTdPD7l(zm!RU z5z9%~swaWbXgv70iD8ba({YPJfSj7}#N%j;hlS)_qi+uI{H=r{56Bt*@c{ zQFXeypQ{eV);d|?s5*T>GKtpRldaQ7#e=EV>DnfgNq{F?r>h?Mw`xGe4&x7XdUspl zYP|!`>76n8^P1W|QiP>R?`JVz(1iIc1F;a^mp zZ|CmZ+KHRH!yZMqUU*qW)q<(c-TmJhkFadmx?k6!js{+=j%U0V!=uI>sR;UX1kRSj zWokZj;;Fei)6-Ho3I-%N;^j_d6)34261&)n9s`4)>;uv;+-!T)uzyFxs)OHjyrOjo zah7An--c%z;%v_pXPrzF@;}YPj{bkcctz7$#F~(%QEi)^b67798BW$qS~qKaMU7Xk zRSyF@tlOg6wu5ya)wZeoskUuj4CL0=Q2wa4?G|y6REJ_~{3*N$55>kSH~g97mEGdO zRNJ<+1azw76&)j7p#c>;j6alq-ua|cbO&tPPCIS#cNWwz^NLA2+qZ2_4Z*tR!+2e6 z(+Eo|&Yt}G`Nh!cKC}fdjU$a^>3QG3=IVyJ(LEKIlN(99_mz#gEsY~3jq~npil4g$ zS_iU^HRXQTxMf$VKaA3}uC=OZ-sm-lHO{*S6uWRff%g`;Bmp%w#b>T=T-Q{+JH5k+ z)0A6YiPH+{9QfnZ!JZjSxqG1xEIqQMk~fW>^mClXa39yrtjr#Pwzg8v$9Ns(INyTv z8+x~b`3kw+T=Uop)iZ`^N6|GvDMn(0zp2Vi%Y3D%o`O#o4)A!<*L9TCQ~iQD@UkUy z1ZFCsPa%JJC%5IYD{xtA>hi77*)E#ed1B_G^tvmH#`NPZrc;R7t=C+~m_ADNnx#iP ziunF+|;Eg>%dh64IoXGHRdYzK*9TWk-nXX?``Rm9!!_~aPSdCd8#aXavBFc-r4h860 z5FH9>sAKrrjEY3P&KoZ%hkmreD-VLyfX8zDXx_;`#{({e$JMHZ0iTxQcOz+F-o=W< zof*NQly%b@@@Gy`JTsE6NS5xHQBjLiDE8P&y8KdrI3{DkR5`=&D4D{{UPt zRKCExI@j&v0sjXxub|_iV?bZ556L#a7=C61o{GTJ5%?t$ct-?&HE{NgRc@CLfel2^ ze>4LB7;y4gE{&Yaqrg5V_$WJ(FfNb5{x|%J#RI#gf@CNuxVilE3qT!L#!`EUz@g*#v9fxtAae zaog9v&!H3h+K&lN9=0$4w4t|s?H3GQfoJvCp6`eo{Oyunl!xO3r9ac)tO^v@J`w5d zzI}V9-^Rl|hL4ShT?V)Da5@>og#6!a@Wb(4<+(=iFn$IMy^Wt63~uA+Ukz^KXRE<& zxPE4Eu4}10zcx7ORZpHhA7SwXXlUq6oVxcF?!SO*`CK31THbaC_^4$j-=<UyKRUU{MV;!vfs4;i1?V>t1F;nC0%@*HKIob+7TyIzhb>QfKLXZtu1ro&#~* zdyqw(i+d>)Or?Be9YDWB|0!lM{~weL`89mECiI_e1TMfh=rPuu(`V0}tS*3!tVqNp zoh@T5fA+ko^=UUf$RXEme%|wXf7af;jMU)t`{2vdsn5;#p1mICM=-QHtNyH0=%D}g zjawd@-jv&&p60f4jw~s|ZCM?TYkJU;lsIPQSa*RrJR2exzmWo`+pBUlnJ=bBW>%|@ zuDhMi-MyKKk{eTHZP(||Ma*^FMBl)EAxR8353xN~8zrCsT*Ns~qo$k0V&i$ro+Uax%#dd{}1n#OkG(Ploz~a4x+OdK5 zJa0p$gqwz|hx3;cCnI%TVLy2tTOs>{iuw(v7^gPno_1Ql{TGa{pn?M9s?zw-O_bda)yKt% zMr3_1Q{%U=VyInJ2oSV@uP=mWoKxq?o}KOMMGk*E;0SdHaDR`FzOUmNzs-z2+$QF- z8zL?hZ`iMS?Qb#WFYtGq5DtwmRZOtwtCJkQF}@<_*U!c`9m73FLN}&z=lBjVlYV@5Qee z{e2Pm0}=SH2>e;#^tV>}5UzXxb7Mu<=<~_lTvb?HVQ(N*zRel6IUT1;yStz{QqUNsf;+u?7g$vY~Q%!<+53uOQZbS$3HBC51 z(zz{0AHV4s<~S0=5T{$k?fQ-#gEf#ChV*uTxEFu2v@_XC47u9VMz8r+8KC4+OHhteO$dK-rE!zNJi zqYZB3?XLt6bS(@_$V5(BDrQdh74a2DkjbZg89Kw;9~#lcx-B(_QbH4&^zN5e!4i`de;r>+hQl zUIsTB{}&nDrn~A85B=>l^fuo54Q|tM(BL-RZ#KB4-ynGC@4py&8~!AqxM-07{XScy^y8O=IHeGbif}d@EI8g?g#BF}46FiKcGYq};_bh{3 ze^nO(`P=-Ez&j0b{?sg&2gUcw`#k}!?VrF?wi0m3A|XTTJfEaIEtPQT2Zq_2sJWhd z8CaMNhj^RuNPh%A;9QU1U*}yH{-yZlfvCBjgLPjAPUKme=jb2Q{j302|JCLkzCK&h zyMuVsZz1gk;@;)~(%viXb+47W*Z9--MR?!{KB<7%9W3lHX>YmueKK=BJINGgs&hSh z{#55)S>`Ca%CB=xQFA?;WUg>V5MjY9dq};!epDxW4z&Mw_PlpYTDSiO6&ms<@#DYV z%hj0s5j73+UamA$THq=!tgct3b91V9lMt!~a}N&gIuw_19UdR%Tu6FkPIYRB?>;r< zeup8v-mit#TwF;NAEN48=QxG&^Ihx=VS&E>N4c`p$gD(3~E_b+(XUx-JF3T?=GfT-71Fn=me0VfIJPpqGe6~1!-RNc(J{K%V zF!n24s^#Z~u<2lIC*IV*y3w&Mcy(bJn*)}?`ZVupYslfccCRxto%b zFEy3CoErJo5Qyt@dk1$tJiMZ>sFzD1Zr;*o#F*4bHH?A(m@(O(Zd?1zxY2@yE^2*v2nioh2};7fp09$mk1=?^Sw&ZZ@T zk7=~>j}uk+yJjsspC;1)6DAXSy|x#z@)w>t_5S_6Ev;=3#oaSZo7EjFNgbP~Kr}QE9YE&ootkt?qO?CbD|{Ed7rRA4}gv#xS%vMo|7b zwjyrjX*2XT9-cM0^|wU&V*Jc}r2K0PZt34?a4Tm5ZfVFzymIfX!f6!O{N>T9|0m#- zQ5My=ZxA`vhp>!9_3ifx!vRT;$@cAs1AoI*Qx|85Os&7JE`zGVE&!6Z6WU$F8HfseGz{40j%Aue)zO6zd9T7c`Z#eP($#x%r1f|czMqKCEVrTiv^Wdt!}pn>qx@PI ziL?B?!-4A9)5X2IQ=98r#SHzjhIJ&dFo&)YqEIfaqm%~+;tW$#0kM||LtB?Ijnuv3 zoa+nYjx28BAIws3<^MzZi^=YYg;3{zSjW@v(0}${iuqqA@~0iM!e8h=ipSO2&cem! z`8xLW2>n@eXV01JUYUf+G)X6lo<~UKe!!a%|8qCd^gP^_u`P3qe^GrQvD`G>{EwX` zgO4718LrjXh8^Zx*ISpFw@!5CXFD##p@AXiYu)H&lidpL+(p&tbMRH`^mmdHW5F9s z3wycS^14J)<+!z=p`z035}_N-7v$m3b+^x`C~GXA&rR5WqD|;)>uQP1bcRt(bQ>TOeoC09mkDHpv#)L21{e3hj>RvmAL;BZ5jg9nV)W!k{z=$0 zE{$NHk6$r*4&tN`4LB}Hr zJkt=j;~hWQ=y5w9VgHmSnrXZ<4D*4cGu)K0c-?KRb7(#fG~6OFl_@ggMN;^eMy%Kb2vd+H)=Zafq- z(ly*FSm_cHN91z52X`IIC5qhcrrgWNvk>F0YKIFaRwyt*U7vf-Q_sWoNm!(yep3gG zl;_Gu&ccmSi`|5N9G6jL&s{vcKfBn?0S}%vJ@ajzy&K+_X>=3%Lw^e~NwosA^HtdK zx)`(Wn1ikvH}?+?W{D%SDaF--Z+J%8Z+k|c@QlEJDHz=!9~uPU=Eh$hOS7^3u2^3B_eJNv=a-k>RCL1nyz;JMbLAq>t9=%Y2-f$ePzuaC#`alU8Uf>; zgRtGAlj;bZa}34k=SJZ55jZ<4zH-v1i8Ii}dM|Ls4RGTppy3DGN*cERwy&afByrnU zX(KTVaobm^luDGiol~tbxb4HtHMphMx}AJ1eFE<^#QFP6nFJV7l&HRnrnmYRreRcH zWutVXZxM%+?W;U4@uU8#9l}w4m4kI3)mKsXQ|+s~J|dAq`J?(ORpS084Y=54!FyC+ zD(`~xB0G2K{r4Q-6Ebu-%wOBz~AVZ7!hXA zHz(I@N442a5K-IgZ%|&e+3UE^|3>N}UCXlwgNNXL!^?3-000h}g8)+q>GDP(Q01LR zd7|jc( z6ZBlPoP0irxrK-g=kS~JA~dX`Y@6Nh(1~sH2Muo9+M5k-+uAQ1oN=%76n2le?Gq#n zy;Pfm{CO7nvc8LIn>8P(FJYQQwavPYw_Y4hwrze!Jq+xyZjNf357vED+pO-V+BPRb zK_wg^9Mv|f`;H*|2irEMrEQyP+kArvI@Pv$x47>Rd$Miw5^3ADFRalJ#-D4OSG09a z*y9+{HlH^8j7iVY53m9dlXSMf>knO?WFI^kN<;nB=H z+=HHR9H~Tmn#vtj9Up!O%-n=a`ucn5ip}%Z!ue5*=;!A49?x?`=fnokWDk804t!Ic zJ(Gt*eFq?Sw_}2>g5P%fchJ;}*YQt|=2^#Y9R+uu|4gs@Ky^vo{dcjo zBYsSzHnEOL=l=V4Sg?P!BR1>Y)Op*J)BVH-z1cp&`^@!u&lryNBj}F&!tXm|)hFB9 z#%8$bhx%CT`rqu2^8lomHjSx;+VtQHCD*(qxo=w{b4=dxkp;(o@7&VrB;w|5bqVrh zeCSbZKjbt*N1Eq7A5Z6|SMzmE8q+m?Yo6PoXwR1}Ys@{1^y3!QpKz@upM*H4sH`M`+x>pbORyS2^Z`{ zYTrGH%(2CS?e|<_DyJ4aXW}$#eeN+Q(cojr%rJv_sSEYfbx&!y5e@lpFLyBx{qo>l zH(E#$AE-d^zua9bOAsI0hx--_u3H1bYR}qf^Qlk%f{ItsT5%DVynB?VPvv^j_yYrBJ@FPn&Im?USBN5QaG0 zckRQ@CI~~Ec|`Fcf-uBwU-+{Q^|DDr&nGdS~y@_$rt%4la9_Zj*l4E;2T zf68P1oo#ToJ<5NP!R>jd9)nx@A%k&mGi>}w{m{L;8xDN4Q}})=qU_83yFJYxuH>9^Swu>{-1zTMnTlrMbFcz4`E#r zHFl|y<@Op01mm3klnEp4Q=cHXbXDam+NBVXFOpn&I@WvS8Im8YdmX#X&U5q+>OS;O z-_=fnoX@r1S^ocM5$Hf;pGI+?cPJ0x-dX*w{_1LJL$2{Ek?kklVifXB$e9KJ;a&G-6TM7`OWS@uQjS4aZ`x( zxoJ-IN%kmCN2(?jou_Qd{Wlg=y_Pu$;~V}VI%jPHsQ1OO!7CyW7J_t18+owqwT;xaK>btq2WsOu zZym}+9*-!azz%7n=J#Cf2Dcr7dyPMZ7vZ5;8@FEKU)wUqKWj~OuXt1&r)y?Yo!{Fi z0o66;s5UmLjoU4me4z$Z>@fb&#`U+gtgby?lM+bRDRG{kM&#x|HH z4q0xa+Q@uFi3edCMYWMNQm?ERcav=+ zzbx)TE36}Df}jjPQ;j(%2kSnnja2tjZ6kjX3NG)V{84S>E}`!T_%N*2M75E+2C4aE zvTbBq1f6Odd5gH8Y8$yrGJnbj7SCb)u^Q-VYs+8scffJroZ3n6PZ=-;G3n&-VLtnU6awLR4B z-%So^IIAXo=Hw{nH{u}J<4IiGyd-JfRgvg^^}GmUB5#VdU5DeVZM%{}9W{sVS{k3( z@{h58Ogy({oJ*cHq+xckZApS43~`f{9QNn@CE%FlA*$|9;+r)GTX%h6PeA60j&`>EF5Uo|q@$58&Lx_hHI(z;i99Bkd)A(=$SF_W#kcZr8nt-F&F z(7nQEvg4atkzea14SyJath=$i(-O#Z3_ChZ(!t!Njlr_U#J`1s_>t*wY+k% zo91~g#u)Sbe)EFIB!2r5&~Ju;9Zwdkt($!sezmo;XU{qPbUfkYcx_$n>{?7{Px5HF z<9sk}!?-@upO~}r#|YhtLUYLcf5ZB(rpEZlEOw@lb8e-kw_w9wtSunN=zGn>lI#61 zc4m>|gCpFmg{RSMaH`sPVl*cD z9YUWD{G~1%#+&-9;rfN(%3ty49RAGygzy;&szka4t_L> z*Ezg2e{Ns>{cDF8{8b0kXG-~(cs2^hS_EGj;N5~>8sOJD9Qj1#QGag~yfVNy2woN7 z)KBX2Lx7J8u5BGecIHQlYrzwocf7dtmBn?HXH4*PfKz7>>6ZlfD}w9!0TIj3XGmih z>+S1l#bu!FJJ%Yln)FF27l#xud0fMORy2v-<$=SGV=| zx2$YyhPrBz$!)5bK-Y3rPhZBnYFpFkc3*I-1r$~{=hacsdy3Q1a!p(FO5Ewx($&(p zI@aIb?6)&F^P(sJx~92hMIXF&Z=K!t&Fz71Ztcl-3oZ9VgTorgy1J+DI>QeVPXygj zZ9{}zBOO^>;$08}s<#{hQQcKga@mx;ncJxPA;gL{c-+$KqPeZTCEJz3!K&7tz7@@_ z)Fsl~-}yeb;iSKFWp_(gzni$iGl(GWRc(C=xQ|Tlp6(1XMF!EF?RD|!G>$Wy(2x8J zw!%2y@?clzY9H@TfjII_A3u3*;_5I|AD&s=>p6M_C@b>J3L3__ucl?SsvPg=L7IYf z^HtgQ_88)~Pd!3rMgZ}(zXLgej1-BfqZo6^gNKctzr2iruSVOA z5Z88txb~6gM(bDNcKnp)M;PKKxhMaZkY~zb$w7U$1G8OSWjKNzis{M*E~_5^&O z`;bnC00prIShLuL`q&#c;&2Kahc`J6HF<>L;l$SVh)@zD^MQE=SEX)(yK812={Hb3Y zqZNz)UKzJ&JV%YeSO&thC-0=l-@zAS!eH?|l%3={e^(>v$GH-Ur1Gm=%qGSB-zkOa z@Ze+UKdJ+1z=HE-(8lWzz5D;V+S)VbU&ds?KSM zD)~IWkAu6PZ|8UoT6(!1+MP4Qg*m$RH9WfJnDkBCr%#J{oFo$2H1$vS5D=@A$bCZuz76EdPq_&4I4k&cJPb zId+TJ;7EUd(|5y!-8z)_o8$?@wf)$_iVY=w6=fXD{DAK;>-krZ*PS-u-~w5(`$AVL~_?lR@R`gWRau2`{^!JYjXFgIs_Fh>l&qb0C$p1(~|2c!R&Qd<#Fu2{5eV@Ut zoIf|Xjh|->&b@8Qe+C7Cp=ISv5QHHvB<}rk_g}y_$or-M*YdG5z_lC*JY_2Zmkg40 zx$=CH@>FSs1{Rj_s5N};!`&qD#kl2TneeR=`vk#*u3k*nk%TO73A_CJOgxe2RNd0rYN$#@x%Q59=aa&VY_6Qg7fKM;aeul}FtZ(;9PsY^d9xdTu*& zOt!IZpB}_SXL=|OtN|Bv4*v+`xnI@ien%ZykMAav9Cmx7&&$3m7;Ar9u2o3Ja!)vV zr5+x|1tDA4+y`!%AJ7xucdgGo)0F$IA=;Dqs^eZiQj>ca+YWNu+!(-N1=;Fzt7ChH zz5ftz=uGs0*(ZKQ5578$8jq)3H{QABP({2-lhC;iyZaGW*T;S=8Bo^6y1cca!lx{RYEC2PtUo1;0m&f^!;fZ{Q z7%AM%I-h#h8Y@Ppm%bbN)aFmPWTc@y3FjU7(X8Pgc!~a4cXoJD#fIsv_H6Ki@^{%+ z4$GS0?8|fu;|f@@Fmj{#VC%E-v|3Z2g%1W;@1nc>oyu zMqz&okQ;v&!&4FT=SASlBJkxAcuxe*d{#`Jp$L2=0_Rw=7@sc!XZ(z^Y{0mD4f{Lz z6{EiwxEoudDx`6F81}>X6{8=E!1qSrW~_)#2j4{1`?Z~!j{Hat@PuWymey9TKjmHU zsc`yOM~T5elhj>3{c=FL#SaNN#$4SyQNJFD^U8TV=jKqV{Kyux{ya|+5_il;2C_K* z+|R>53B(5tqm})(mrx1PG!TR#ZpTn<4)r*z0Uay-eFXk*2Df9VO$N7P&#eZpz_arI znZfOt^uG;m`Ey?Z4drM4P(H6SIJ+B)&oa0TZ_3~{ye$T|a&{Wrj$ua({yO9DXAExn z{IkI=pPw4srq?3|xA9=_CAIiWDMz&I*!dEJTmCBz&U0!SZ#jcoKA$sqm7)KJ!8wzx zeC#=Dn=TI;dYezC$ykP;ZF(JJa7%xx!L9r$gWLGA_i@^ExiW&j+u&CI>kV%C{JX(z ze%NAgOMjoit(^M|Zo`#8ywEUyBnsVo*Z<4jmq0~vZ12wiDhe_fiQ+y+R5WTpG=e6| z=pcil7;%dmpnwn&2n_B~43f|piDWZoGiEot*@!Vl!42G(s8M6wH^c>Z-2dOLt{TeD z%uDpWch39&PVPA~-Tn2gz546hx2vnze-$qHcd-T!l>_l}_p>n~5OqywzKA&zE1;cw>OnJ*%php*J6FX~UgeXv8Sp#tDrcmDir;m1_}_u`94s-_0K zUtdHi51-EaDRDF9UF2W1KXnsr+fmBFTv1zoQSYQfg8M0rkNNXAcTRi}9RoVwvoFG( zmxa;`r9b?$bwh{XX;QhYt{NI$&L^Gr&$;E6)k!P{if{3hRn}v8;Hwj8e`{wN&E~c` zNm1GS?dx{3W6VDtrTCkavzYDDXf@E3-dA%f>sgC)Zq>9d!~B-s)+HixI4q?3t?5!^ zQB*lAR3Ao(jw}Y#a{4b{Bt0t^;k@+zlE&EnC&#izB17UCtB}fyXPOsj9mjlEy!e{q zhWAv@Rl}-{Io0`#D*M8Xm`rJe`kZ5j@K8hCBluDD8N#yhBN5m?&pv8>sC6QBUJlc> zC_nqKwgE=>IW50a5I-k4aib%Ba>6;nBb?v^fwN}~Y)M2r()%sKw=%Q}ue#{P-k)vq zL>dWA%%J_i5QOpPiLW_}h#^pH#GU-UNX-D*4J1Tq#9P8PGGd>EaM{)|G4#*+Pe{0I zvpyr?p4b=hzbfIf&195tN?S-e-yw{CMf`X+-wIsRD~IoUV?;>eWoI_TubP;(eZ#2@ zK{qx?fx2OJOX=`i!(ZAE;#qP_2ku z%FA$?u3bT}CHahQ{hQrr)#>6g7mHGg4;d}WHp|jqdQLsI^VJo*7_8rHQ7Y(6@u~X! z+s5p9^YLxtE=#^!p(WoZ8(RgxY)kP$7fYKpmVEPT7|UbkQ&5&SgLPn04lk!9S-LDc zIhEb5ZE`A8t$ra*=**;jY(!L*0>&Nrk_o~}7WjMlu|#PeOBxmBZDRqQ7VdYoaC`of zg!V(Y*SCM>T;CYzm3sAu`)^>>8b6*^1>3t`wqO8s7WPK zwvJd;u)GL*Rqvf}k|yzFFFUMz)r_K-s!eNa?5DHXSIRc9E+wb(xUn_Z;V zg9irA<*c@-{a=mhPXXk>|CRmilm%rgGLcPX;r$D%;m{H9Vd^`oyY!Zl;c-{Zd6Y<2-4W{9z$?6W;d-cQc613f6rUMb z=rXXXPv${RE80R>?^Ac#e^^FFT81$>)u`T7FrX=BTuRy)`Yax)yGx zF+MpywYAkqpIOkYl}WESg6LM19G8MG4uo=7BXcn$cr9K30fQoS7#@{1na8BVM;*+0 zeD9BMG+u{9`+kgUH1X`lZ^P`{tpKL2)9s*b)m$x@eavMAmPzczW^2K~NPnCj$#vV) z4HvpOSX0sHaFp7t?pQo153I*vJAuMr&KH+>FLxt$7ve{e!!1RbLyOPr*;<(yAT@y z6|qO}UmV3xeV)o&!S&g-h8q??~-A2Hv zehPT~Fg`>X+v3vR%`%d&fbAlH- z!AqRrdx2BB;+d6kJkmYsME{HvT#tNHJmNc0aSx#Nn^?IxmHF}h^)SZ^IL__?IQKZm z7jxWx54h`L6YG=Ho8g#b_Q9Td5NEY!2%CZI0P=C!zr0MdCgGb-e%q&SGUJokJ8B*e zYz$Rb%#Mv&wecw`I~rse7!w)QtFH)cUqqdK#uvlB=_H+AQT@$-(ixkEnAulr(9Du%w5tU9t+2s?+5cPCVx zn=r-EG3sz!l}=IuJ|?wiIyFJ9HMIq3?sEI7u}N|GMp*sQmUjng_Oa?3L86ABVb5_D zmXc^Ml3Mkw$B6T+{zM<*wSyTv#*Vjt%zAhGFjWLfL^IGl?5ShpG81UXgEc8WCM9_c z#!Xl;c}_ySJyH5(SsjQWH2|BwJtHB(uEp}9emCpD9n14DF%IAO(if$0#L&0XQiSni zvc}zYjc{uh*I7e;9pZAnYm9s|3HQRj@THQkj)V+u8mA!Sb-qLK5U&aS4>_*Y|5U<- zUznh;I8O1%;{wo-Hf0}zkM|8$O1{>5CS*wxLJ^ywZX^yf?ZRR2O2NctTC3jGfxJV?U7mEw`_Yd=c* za=R>-^ksfq0Y}GCzoh*2Z6h zcL1vYheYJqdU9N=Usuv^A?f=%(QhW{`$_tKPV^s^^ksesaH8Ku(wDFI$DHW*lJsRh z5o_vc%Nr%>%lGj?QvC9DI$px%`%Z=w58Zb{d0kAA^yT}`JV~Ff3vsVnAnD83#Yzd6 zd8t&wWqvy-;j;c^377BhwUiNjxDEF1KTMDV|5A{F^0xnI8s9`f|Avo#5joT(19l5-!K{mW0dt-*8;;B-xH6 z@_1FbT~0{tCD(JH6u->R5l---5-#V*$WmADN7VL0I`JLC=tpfv63hOp^eg!B91U*d zk$tGag&(I>gA2cjh)<*|{2IQJeMskopQ4=xkLBeQV*o@v!cP&a(HDLSo}K&N7!i`9 zw);DHOrd;R$n(Vy?e!^+i8H9FLj}OM*}RimJXL@;l#V+;FZ?dVfrRth20x1p&k*lM zc3iZl0O;OBacaYhZzHw(+GFA{N}ul8vWW2UGKhVVe+okqil3wKR-S+Hyi2+yBAnPp zaV&tHt@?YBhbLQ077ya@2a%CYp-psXF>Lj7~Y4qm+4K zMdR@B|IUWEj>@RLv_hRks_iSyd3bHf{%&}(FRB0DZ+PNL%9ECBLV=O|71xk`r7aVM zOQk;tqSbYFt&8wsnmDxK>DWa|WI&;PlvQ{DUz-q+Q}ksI+o_y4)p|8HOGfA78?A1A&_`{%y?KX+eejdP!u_g%sM zxz_)0U+aH$Uw@=yU>E)X&NlyC>;H4tx;nlDlZO1e^3S#YfBRb3`f?rF@EOVQUybdM z_6V+a`?U@R2w+#g`Y-0b?ikReqsk3`-!~`T8&O{kWgWI^-aDGR43jVKq;GV5ExFri zeLBNznn@)>xuk3;G5e8MR2LR_Cb7VVbC?m@J}X(s$q1!{&x?m|(ycWk^lKvYtMS#> zNeUCezu7U_me0na&0X1_bNoQ=9h2f^2-}}?ZK}0e&b7u_)vl~EX2nP3Pr75txqWNm zn>p9qtgrRUy_40*HptHt-!>Ubbaa(aR;c#MvhWd3L`eyKd9KbOePva3Yu}tB4I@g{ z5SSH(uPb~bm6PgRXMB1+Gjf3Zvz*ziex4Skgze{0v}Mf^t{~?~^(+s3uhdU}t9%)@ zD0KPv*itwp(vN?Oj~(%WJp2Afd|CCvJ-Rxp)*{e;ClQHKiti+%sK{0Gi1qX`=DYRu z@}EQBxIb6jO!J7**9jXjjTmNxHhK9&L;k)Uq5qk;i&cX9=g2opJ)Fkj3So7Q1Nu}; zd;O9Q^+rcHy+d?_cXNV=JHbad!I`gEB@6qmZW0075s;2nytRL!ZXfuYi1Cy$ndxz3 z*|w*DWD5yA zP{L*X2nna>B%yD_J_*G`zyFjN5fLTn%!e-ehe%J`=8bT|(fg)h1VR?68&-#ujypdV z@0(iTm~gEReJ-yDu5RCG;dVGfao%ru@xC#@o`Sj~((je~hpeCdFUc6rDPS-1Gc3-jc&2lx0Ny_S|Bt zVX=8xY!Bp5zGKmEDQ_&k70oHe_q8kahCWUzM7% z-cAL!()=+NTXjTcu^9}70fxe^p~1JU-OD4YzHK)Yrn?vlr@G)oR!1DT;=q*-TIQ6w zSp)G&uN#tevxm;A4J9NvRZmeBhZ+jkwyBiXkHCC2ccmX`^NO^&Abk_^iJy1yR;vfg z>}*zQKu;4snc_3#P6tSk3qdSX6X?*D4q3KF)1ez3x=}8pa>}Y%M?~a5p^wN9)t9#~ zK;7thY*d~M6i$t&B@R$HH5OkgoF5g83TP;VX7JxD4@zROb+_0MqK2Wc9!gUirIG71 z9O)0y2XDtg{(8HH1s5A~XK=`kAU8l+X{1q&4y(~& zY))Bq>v&84P!~&nZjVx^ z-x+APimbgj;GL;5YcdYp&}qV9!4< z9P>QTUO-+rK76OW;Jg~@j(c8sb+&iP7qEBUP`AABYO4|p@`mb*Pr2vSM}pauGIa9L zxW%Wup#~f=;Z&%KyE2TY!XsiDRsD^HcT@FvzPv@gP8oswia2@sFeL>gSq&38xZ|`j zFUk$mR8Rqm%e?cV5XUy;#vex%GRlS5AHfu^dR4e;EFAJ)=1r$qJcyA6MHEyihz~`* z`&;hY?uO?_gL3V4%<92VI227w*G?3A&7>N|2fd3AyX#ltGSjaISiSh5uYN1EsudqX zz7HCU4}0sk;n+=ozWA`Oe!WFc45))Xt3P&mqOK3RBh-&o{Tm^W26}Up3*tvA`mOrX zyRP4=eB6}>mi{X6%TVMm9C?j$t2!U9*RLl9$}VM&GNbl8$|3X-CaRjG@4^a&?6E@C zr=qU66dz^*S$~!CiR!2>@=DR^ODQs52dE8J4X$c6Y_p&=Y_4(48}@%v?rl7b)48U} z<`mC}y?8|tCTzA$2?K2~5j9GB!#H+?ZwX7``x_)IoA3Kd*sFYh5H~z1>>`eh7sklH z7|G*!Js^gvU!wo}pP)0F^4{MEy7E%oy>T>dhio@_ZDG*{G`^JZ0Xz!P4lOypmE)o< zXuLh?FXZ(m+QY|0e{ zMWR0>aXg#jqEBRT{Ggi}zrA1BjZ=Kd2QxKoLV8>Vebr~*j|sTzDDbYMj&~ge>3T&E z9n{OxAy|ixFJq)g==nI)nwF73ARX}Yx&)q2vi)TnU3_~%?MlCe_>m}FU*IaL)1Bev z61YX2;9F`=ivMLEUbKL~3ph^K4vD}Ia$MA}z=iE^WZG5ww3+~kzq+x8m;6tx3t5FXbRzz>rw> zulkoL9d~~0%eSqtC7c(Zqwoc5(iJC2R~Bc!l)oFEzL%gl<+i8z7xMIr=s*&qv`@R_ zi=nO>ik~c@L_8309sQh9rpCYbE<)^!u2rt^-nJ>q}6%%=QvC-z=QQk>+F%Q3( z2OvKteFLLS-BOhfu9n`utsoir!$ zM!w8W{tW$cx>RXuD@*YS*OOERHdmLcHQ1DWQ(w}HUCEKkG-HFJNF~!<8Sj&G(8a8b z_suz}S9;-LceQ(9k@Sj&=2ctm&c4CE3$1!qG!4D4{Dl6k{9vupP^FjupR$E#GDrEM zXB4sI5b7ZNn!Y5Qm6%E!Zj4l-+)-R*D3!L`Bp)TbvDGhsqTXWbv6R(Y@o{^dSv|Uq z_s)0#6=YH1HBhUCo&}Zh-sNS|Jcok=i})f(NHJuRkF}Mv7@JUxc&c?pq*yBzaboJk z0*bF3@v=Hb%xt|RTMt^(N`1FwDPc4@f6J9^ za?gT3HlKr-1oEU=xoqp@Yq8a(8K$?Lwb-V)hbfmVN^u`o&%+V<)@twutiKa&G<@Bw zG3NHOxlUdaskF1doy)zY#ORuFez6}Ln8A#?W7AtT`1}%sx#+wur1uzWJ~e$R`4=XDZvbx?ILV$eiobO zR*QmJHY5FvO4+tDQ^*$V!sS3Qo0MA?<-Cbau@|W?>!%!7+WCbkH%Z$!O!=)mh&_9o zls$d&+ijv0!)D*fn%Qk6-rL%I{KJ%keH5P}!}A~DOoXjEEn=qZ>y_WwFQl>G#C7KU z5qf2Rgl&eqCEt_zkIc$mvog{TbA(3vdDC*huE<<|J60Ansftt}yQVusj3&d^y&Ict zP|qzw+NqC$?%l%2 zz^+jC9y-j+_eGj(J>N~Uo>i1r=v0TRS@rV3duq()r+GWg=JK0Pl@FOie}5Uji^*XE zX2%KmBg%agFC>Bf*xZ7>ynJ(9!!c=KKl|K*W_4~s@f{dFW2?F-E7MJbDgv9-`T5AU z=)`Z-?Atjuhu|K=ZXn(DCp{_@LkToZ6YhcO5FOwq z4=Q^Aw>il+R_9NAik00Dhmrgo+1+X#nyC&kN#k%)h5w94pt|AW$Y(>Qp*$Wzy*oM| zk3e%IkbVJ=lU+;LZ_jZf?-T4A07ma;nXQ7YEMYic@o;^19RM51@q-*^eI8g0evaZv z=lbHIhg}E2p5b^p?<1^_1Dnh7Q2vm{`Yy0HI37z6HW1d|u>BZ6mQRkezD5edSk}>` zQ!(s_d_R10uPQJmVKUZYt~w?q%$b&g>A8SsVv1BAn6JELj|p?4CZ@!V%Z#C+6KZmp zSt>Ij!+O^Nmf1?gn2h+eNvUkcE*2gsOh}t3LM0|owwH&hgPs$_xQ1m^7Kj#)<@Hav zCw@X-UK3fy&q(?PNngx|qK!wL23bv)zMU8Gf6VKd^kv+LV-mvYCnTHi2we2bgBo1) zOE#73|)!pA7|MdAe-ebLXhYH-odI#C1=5s&C+12nk!zFpP6|9>Nb zQdX*Kq6p>3_xm0DLhcJF;_(oFP&)4XSUd~UbwW75%=lTI?h0>TJHU5%wb^01{wU7- z4exARiAevid=bQ3+B{L_{InHHAVjN6d`1{=UQ%J=&%=xUB5+ZE;_3QUA_-5%am?{f;ZC)MxZ+NrbIN-0>_T<04F%6j>H_3yz|lhnvHwJ`y;$O;+s z?-&9@x^xU?A2R&??-;g5h}3nuP_`S2@x!%rgQE?FUKnwvFFxdpF)D$@G(L^}yI}lG zV6kGrxUv2i#?rf*NmVhivo+LBbtqxatVFS4Z0^vjX~M`BL}dyr!jXr%sm1h)%u2XB z;v3?LGqp_^yTkM_a;CSz6i6E{rnhp|^=#zPtPJ%u%wCT@obg7u(RC2DsrZPuIdC@} z*5%s=fVpEI&L3#{(5VOS)~wGp>v7Fl*NYIX67FM|T?@^DP`(tZ!QG)6@lXxz@%uuv zF=;lrTeF#=aAH$v7aw;ItboHhuxQqG;v~cD5%_0o@2F3r%4V~&J#byQHy;CL!jgeG zCEm(fld|1VxRQpknTk*O+T3!HKV5G_q0eiy(^7|-7|elN5&5p-v)-YG!Yj5;KhT+3 z$MJV3u;OmyjxMkwXcnC}E1Lt?qGC)4I?2Zzh$OE0qaA#ep^dXJT$gf$4w27*;h(RsF^a#)Vx#PK_ADW++svi1KLj%tt^SPxrjCD=4bs&lQP0 zoWH9gsQ~AdDDR-COG=baP*kN75PRv3YU%yZQV}^fd{KOVWoSD?ZVOg=G8OPPLh^&c)qj$*Vb1qtT_!Ad z-HcHYV=-cH4=w65=oL5SIkknDZ9Q-1ti>S7VzlHb_~11aCAwT>Ww2G z+muQiRVq_`aO7*7auY{4m8rOubbYPx1OE-m{wQ-W|5RC^Gmr=*G z^W0WL;rU3V!h~U|hQigoZ9c5KnuB~8jhU4zxE#ZR>V_#5Xum6@Ce9fOulBa7y}Js+ z+o9d&AWs%p*-z>$d|$WToI5ENL*eg2$541#?3!@K9OR}3-HdCMh3w_dFGmU(953}y=IiyPN=0S2j@7sPW${9TNwFMtBg$|{hK(cV4PqAH~r4QvXEt|%@?6%^ST zvowO#iilKDy{q|wnN)qvwobf`R35_!X_nK>OJN93*^E@S;%?z>4pJ3RMw~$g)k9?F zd{E=NifIZOQ7IL(C(k_BLIH0Y3NJ+}r5wQd*Qg!<@~X}`qc`L}g1%_VxBA^dH$%Ih z!);2vU!i?1-~bc^@BFIqhOp?b(oM_vt{av)a4lLos0$j-n@S^E%{1#E-3oBpY;*fk zP5TUi?EZ(lWQ8d&%axitEH4Z%^{792V^@z|^dTI%BPjqh-hCxc(w;x{W{Jqrd4eY4 zPW#u1pVcN_gD37*m3TGmvOY*@qt7Av>L}FOf02A?&?NW2P9A-ew-#EN*#Kx>o*~}3 zP#E>5M%l^B@}S(!I!twlT)0=|u_ktLLu6eJI_@}IEATuxA#fXRy42lFd10Pv7tIT+ zt(2Pb`Wc`H)Jwdz!)WgRfB9!OE(csN&Im}^{4e!><^VjUI%EG!fwEGQGafRNic!*E{M$%@g5YpxW$kO;^Ghz+t0(h`yZsf1jC#6zBgBthmw>OpouK7@>fY=n%0BtQxwFGErw z=@1KK0OS_r4CE)sUdU+3gOJ{kp^#4?`H*)YvmphL-H^{A)If6}%OJl(YC*0-jzWe( zszH`OzJr88szbIy+CiE^=0es(dO!>i7f3PWYsfDUSBM@`7xDsRJfth+B}g5J2@(Yv z2iXTX1$iBE0kQ?M8BziH9&#L#37H4^0%CLncEuL54#vL7GASfGmOpLGmCqASIAM$TyG&Al{HCA*~_VkkgPDNG#+D$V|wm zkOq(+AblXUA?+c@AX6dlLSBKagS-tn2U!R?2Ibs-?SXpXldAduT!HA72RItlJ&@}2Pz`-KX|?O__f!5bv+R?_rcfRetAXt z)CsTceRANA_BqRk{o33b(I)xei{{dGSx+e|FHN5E;v3_;4{QC$(?2aQj5<_N|I55} ziC-9>`M&GsvA%r{9D6pf;p?$MPmBqh8U4+{N%23={%ZW~#tUa%d-Y-W^kGSsxeacG zz50C0{((PMPW!yYubCN#UHTpwI=5M3+s_AoTf@Kn5!aPJJoo0bHNSr3-X-9|^ZqTq z{b+^D(x+U{jC{7<3lBHm^2y8JPq|oep+^7r4kssUy0o|Y&gIp%H5=1u^$WK@?(|M{ zhxZo_zF4i}p%*^PD!<|paylpUvvaYdtH1m7FHd-1v}^yQS@@9((7(0S)|a%-{8T*)Ph*UZLYAE!ea8m!2nU`TcC^ zd*QXFPcJj{tX$WWIiPChJeS?ka^~TtU!>Pb>7OzD){Q$}h9SYZk2l@<)uXLL+SiKT zV@PWL@yNHf4I1IswZo&H-;AsEis8i2@3+r8+i1Z{Z)HcVDT;gFxNmrJ-${+@HGJT3 zt);IN9c#Prv0eusdZ0=DMqVDZYhL)W#Mb_&MTI`4pEezu+u;1yku|c;{`|)qAKZ$a zdG*~^`jN{nXPDP?OB~T@#tqxVHoZ3NTic>A>E@XwW6vM`ZT-H$p5D1*>xMq``fOvJ zwYksu_1Rwe_|IR}>3FSV!h3C+^nGN(zKa3h);>M(xk+1(6hE9&@4HXm_$j^4b<3;a z55<=)T0Q6H!iGI6hU{+l%tPl2f}StwAF-!+TkxFQ@2{W#sK<_vx6Hcyk^lawdt1Hu zV~-D4eA({kJ6#9VetGg!Z*7bjG^Y2AD=X{f7o1$OyTjo4V&-b2u(WkOpd93c{v#me}au$OxfCV=#ony022tHJ_w*S2;g%Nz&jv- z>mYz5Abk1K>*7^09FvdK@h+?5Wq?hz>6S&VIY8?Kmdn80C^w)BM4wK2;cw+ zpdkq02@pUu2p}E=FdhUj3k2W}0*W00GS|wz94{RAb`OjfN~JP46)0Dlm`3J`!R2%sJaU<(Lf3J9PE2p|~*uonbS4Fu2$1n@BkpaTftA_(9G5Wp1> zKn@5X76kA#2p|;%&>RHt2MC}$2;evfU=RpkH3*$g0el4lXb%D~fB;5<07ifS z9t8o^0s#yK0h|Q^yafU%0s-s;0Zak`JOBcC1q84V1n>|Dpb-e5CJ4X=0w@FlGz9^i z2LWV(0Nwxr%me}GK>!&bfJ6|$4G=&t5I_qMz!?z0Q4l~N2w*G-;B^qdS`a`V5WvqM zfNLOtHXwinAb@W{0MCH{ia`M1fdJA$0Iz}o%0K`&K>!sXfM-AeK_Gw#5I`^pU_A(6 z2MFLY2w*A*;71U^mmq+yAb`mrfEWj{fMp*oy8wlVj5I{Q+ zKmrJ0Gzef02;g}TfCmU*90=fd5P&xbU>6ABHxR&kAb?5`KwS{Pryzhh5I|!PKsX3s zI|$$c2*3vfPyzzD3IezV0(cw*U&?F0A3(~A`n0p2%rK4@HzB!-9Z3Pg8-sH0AGRtz5oGq1p)K{0R(~ofK>(9L0AGOs z7J>jC1_3020B(T*Qa}KeAb?*%04^YaxgdbgK>+?BfR!MCX&?Z15Ww>wfR8``Pk{iQ z1pzb$0elYvxBvn;3<9_W0$2_L7y|;h4FZS;0SpEK90CE9g8)v00M3B`-UR`8g8*It z0aOP8R09G00s_bf0gM6x>;M5g2m-hP0w@Ck^a24a00Hy_0oXtQBR~LWK>)Qt00t01 zQxE`M|IdK{&VT^YK>!&bfIA?7U=YAg5I_hBU=Il3V-Ua~5I_eIz&H@V2@t?M5Wq_y zfHfchBM6``2%sSdU?~WoEePNs2%tU)pf(7g1O%`M1n?;cpaBS=1_2w(;XpbZFMEePNy2;e*jU>^t|7XI1U2X0s=S*0(c7q@F)nNCJ10U2;f@~KnoDSs~~_x5Wq4Jz6)fK4EP z&p-faAb{UN02e_3t3d#rKmeg2fK?!XmLPx#5Ws6706hrcI}pH85I`{qU^WP#5Ckw1 z1TYi?0Q3I|nEx|i{x^jA-xcP6H<|5eR}!|HEMZkAnHX3g-VTnE&}O|Hs4pcZK=?Ak6<2F#lhJ`M(3^|1g;U z5itK>g!!KZ^Zyde|2JU%w}$z@9Oi!o%>Q*T|DS>RKNjZyF_{0a!~7ou^Zy%||3Ab0 zzYX*M8qEK6nE!KO{=W+Ie;~~N&td*&!2CY~^FI;h|FQ|NUY9C&2u#4)cE-%>UIe|2x6_e;?+5HJJY&!uBYhUts=shxtDb=Kmis|NFuGe+lOQ(=h+tVE)I#{BHpBe;3Su1?K-anE#7m{?~x{ ze*)(J6qx_-!Tg^N^S_d=f0+L@Vg7f7`QH@ge+tb1TQL6(F#jKi`Tr=)|5`BrlVJY8 z1@qqz=D#P*|5srCe-HD&5zPN=nE!Dw|A)i;Zw&MQFwFlVnE#K#{C@!EzZcB^3o!rN z!~FMw`9Boq|JN}8&%*rw0OtQynExYT{+nU`kAV4agZaM!=6@l~|0OX0e}nno6Xt(i znE$h3{^!E{-wyNtE13T!F#nst{ND%jzc$SONihE(hWY;~%>Ozt|HEPaFM|2M5a$07 znEwyK{C^(i{~nnCb720@hxz|8%>R#I{_lnP-vj1Q>`{wKryPlNft1?GP#%ztl~|0iMo{|@ti6U_fqnE$6?{^!8_KMwQ%GnoI) zVg8?k`M(tAe;=6tr(piKf%zW@^S>?3|FtmxJH!09!u-Dp^Zy{s{~(zE=VAVvVE)g9 z`ClLA|3sMoyit%>M&0 z|0l!zUk~&DCz$`iF#lJ={I3V|e;Lewf0+MwVE%`|{C9`>zZ>R%Jk0-TF#mVL{I|gT z-%36K^5K!sfc$Xe>mk1o`CZ5dL;gVW8Iezj{0!tnA>SYQtH`%T{wDJKkxzsC3FMn2 zKMDDD$X7(ZAo8J+|Bd`mBM*c(cMUoGN z{6yp21kiU?8g5(<_pA`AZ$oE6O9P;0g&xU+a$D)~9dUqwDr@(Ynall*z)QzQQ!`GLr($UjT|LGtyHKa+g7oC;8LKKS%y&@;8$YmV9;Ozb2nK`NYYePQG38rIXK`e6ZxhBR@C!P|06R zzHjoClE0Ds_2io+KRNla$)`)cLh?hBPndj)e*N3>C!c(AU3mBnkBSP@=`X+hZrqL?F}L1- zKkU@kU$k5)8>!vM~;ks`jJQKzCL^Q$Csm{e@arX|KfIM&VHY~T#mMuSz-@0{8 z+jHllj(zsonR+*FJh!G-uQz||*DrB!P*9y$b8}zV5*AkGeeIfCbr+Z0vu4g*STSJ0 zWbwOsn{yM2!=TJ-+KC!QE}`-2a%i$X)Iy)bufk1t<-x%skp-buFv2cLJle0l7F zWy>ZN7Z!eC?*( z#l&=e|Ml1NHk!>HLh9FlW$5bFgD-sY$<1eH%$OSf_~WHt#K$i^F=|xDhZ{6F{#s^c z(Zbl+2J>glTCgoD>Vuj4_L&nOdT7v$wr#t8UQpnXlb1JVeed2SZO)z@|Lc+^{*U?i zd@^PK{$+Y3e@XrI*Iwto_+s_PW5$Fmdg-OW4_|xj*DgnoUa(D>va{of6SiKZrKwML>9Y67 z2@~{l^7Frm-?{Vc?fv^l9Q^dt-QTCAd~toqkc%}gUE0#})T#AfCnQ{Yaq86Yvai1K z_H}np+qraUMc(AeebQRC9GTIfL$F`t#zW74{BdT<_us$%#M-qRTAV!j-t<5IIQh2K z+P!(RX7m2&+c$3CFTd1&&So>@zVO1qg7oz1J-c^*di4)KZ2T-Sv0%5wQoWk1>s9@g zD~%uU@>=;pT-;MJojZSZZRpVCtv~%#|E1@idt+E}ao5&Onza6D!Gb-(hYpq3t*m_b zyZQ4U3aV3Q`_IYApQi8GQ$u<2#h_1KeYJhzTW>w~P}8OlzWn_2>x^Y(&qr+D{Mnts zg9l9Z_y1_>fdj5{=gfJs^1b(JW-Cg=`n78(>|L?qx4`4aXRqzqbL*0%q-R%|Ol=mw z@y75;?b|o4V=zqHuz2yJn}Y^T*!AhHx>ji9Rx551TYN*Z~+7`9t4mE0$2kA z2mk@-K>*`G01txzZi4`R0|9&v0++9;5rE4Nf1Cd2%rK4@FfUf z2MFMO5Wv?UfVV*aAA$ffKmbJ`fFD5sw?F`|fB;&703HPa^Z)@|1p#aX0dxWZd;|hG z1_C$_0(cq(up0yr2m*Kz1mFe&C;KmZLv0F6KZsUU#iAb^D+fPo-@ZXkeNAb{^c0Bt}3 zM?e6NfBV1p?Rr0$2_L2mt}~0RcpU0EU48 zwtxV(f&k8e06qf&+yDXe0s-^`0R({nazOxLAb@Ki02dIzOc1~T5Wr&~fOkOvi$DNR zfB-%K0fd48=7IoT1_8VS0tf~HTm}Iw0|69*0QQ0anu7qmK>&9^02e_3+d%-EKmeW~ zfVv=n(;$Et5Wwpo05b@nJ_ukn2;dVCzzh(;;~;=|5Wpx9Km!m!CI}!F1TYH(5CsC* z2LgBq1ke@)PyhnR0|E2~0h|Q^ECB)dfB^P`07ioVJU{@yg8&YK06KyIx`F^|fdC>v z0M$VNejtF6Ab^!1fL}oXUw{C{fB;?s0lWqRI0^!o0s=Sz0w@ImbO8ZO00HEK0Cs`^ z`hx&I1p%ah0EU17E`b0}fdCRf08>E#Ux5JJK>$lZ0FyxgEkOVsKmd(F03U+@z6SxU z1p%A{0sH|1uz~=ZfdKk~0Db`h*gya;fB@1#0Np_VKY#!dK>!vIfGY^#3JAap1P})T z=nMiF3Ig~E1n?XPpcn+u1O%`E1aJrhPzeH<4+5wI0!Rh{>;VD12m*K&1n?FJpeYF8 zc@RJu2w*b^U@!>49|Uj!1TY5#@E!<20Rhwo0jvN490vjP1OX(008Ai&H$VXGK>!92 zz+w=;M704+8ia1n@Qp;6o5V z1_+=C1n?sW;1&qr6%arx5Wu4#fF2-#s~~`lAb?IFfR8``$3Ot*K>$yK0PwavGY|yu zAPB$>1W*D3XaNFP1p@E|0n7sdR09FL2?D4A0(bxfkPQMj3<4+z0kj4Id!0m0Np?UyFdWnfdJZo0FHnF9svQ&1_4Ba0Jebu zRQtcUoe>0Z69n)L2w(&V;3*Km1`xn<5I_hBpbrQj5(F>|1h54JuoVPw4g~NS2;c?? zpce?B9|#}_1ds~?2m=9J0|B^z0A_*!27mw_0|C4X0$2nBcmf3Q0SF)z1TYr_@G=PC z9S}e;2;edZU>OLY5CpIn1kfA=;0*$}0|K}R0@w}$*aQOb1Oe0q0h|T_#DD-^2LYHt z0QErtt3d#tfB1ke=(PzwYQ0RpHF0`LO?j06F!1OfaC z0{8+1Fa`wh5(wZm5WrCoz!VU`2@pUj2%rlHU;+pr9|W)y1kfJ@@F@r&1q3hz1aJui za0&#F00Ni_0{999;0^*<3Ido60%!>W=l}v}3fB;-U09QZ&ULb%t5I|=Tz)%ptPauHjKmf%c zfF>Y-1t5S!Ab?5`z&k60RA9= z10aAoAb|Hk01618HV9w^2;evfpeG0*2?SsQ0lWbMXb%D~fB+VQ00w~oeg*;50|CJN zUkmfU66XI|nEzK`{@;Q5zYFI7ewhC+!TgVf`R@Yre>2SgAu#_>!2JIK=6^q!|EFR8 z&xQHl4CcQA^Zz=`|8p?^zlHh#BFz6AF#k<3|G$Iz9|QA04Ca3enE%l*|Bu4_e+%Y+ z7R>)cF#jKi`5y`MKLzIh44D6yVgBd9{7-`U{{+ncZ7~0@!TdiA^Z#?0|6^eOw}tud z4)gytnE$^WO{RzaPy1Mlk;m!2I6?^S?jL|CuoVPr>|u z0Oo%anE%6I{&#};|0vA=eK7yOhxtDO=KqH<|0lxy{}JZ@Gcf-L!uP$m{?CW`zZm9!F3kU* zVg9dy`5y)I{|wCk=V1Q73G+V@=6@ZS|1ZG&FN68-2J`RWj|0l!zZwd3iFUL+e-D`db720L!2BN%^WPul|0gj2m%;q62lM|+nE$`S z{EvtEZ-x2q1M~l7nE#$I|1B{8m%#jg7v}#jF#mhO{9g_8KLqA~Ak6Tz={yzxwe;v&K=VAVT2J?Ra%>R#I{=35b ze-h?@O_=`;Vg4t;{QnK+|7@85TVeh`3-iAX%>Usq|C_@6p9b@P5zPMyF#p@#>x@6n zzJU%!{}t}$+R&u_!R zE@2@tkI26cJ6ao7chBE$|Hq~wW;v#6_-}s0O`ntLb=7pCqG73iAT)@Sa3TJD=RuB# zay?{@Ndtk4kBd3pMBtPV3CEjbm!(T1R!KPC61xodW2hZ(BXH^@BwU~7sbTs?0wEk% zzX?XUM5p9+`^#=6C>ow+LbVnRco^qSXyb=%mXSo0h5@6d#0N0Dgh^b;JqmCjd*p zaRQFxp~yeJ?VB(qI>DNi9+rxEY&4iTp$fzKj4A0>yAIB=W6A^MP3o`^`c{~_g6LNt zIKjobE?WI9PW1oK;Nsi*2WSK|gsMe!K|1ckac%rVo#0{~53T;QPV^5t!ONZC)p z{Soaeuz7U%iz>I64wah`vR7U%gNt;Ko#iB9kdTAb$}6N56b*8|Ug zo)+iv7dXLR*Wx_?3$!@T|8zddhCN+BH6OFJIKNLV)Z#`}|8p(QlI^ZY|E^KcdBXJXf?hPuGR_M|(YR z{hC^wr`u4A^K>85;#|L-7U%kXv^c-MVw~WqPVhNS@C8orLr(BhPVkyEQ4hpkKRlm} zoZzue@MI@=o)i2{C-{d>@L!zZ=bhlUxZP(j7w5fd1jyxeQ;&^Wob%hmTAardq{Vst znzT5Ne~1?6@g!(*o^GZV=kd?d;yiwv7U%IV(BeG)&$T#@=Q}OV(_OB`c|2>hIM@F} zi}U;()#5ze8(N&l@6NY$nxY8h@z>MhJpQIyoX6i)i}PcP7U%H~)Z#q;QCghGpQOdP zewr5N`g626KYl}t^ZdN0#rg5)TAb^z)8cA3*X?(LpK*eF)K&x9>z~Kd#0ehj1W$H? z=Q+XObb=pnf}eDP*PxkDAlm#laDumRf@p25o@Y6H-y0)B(jy`_XYBEW^1Uy4xx@+Hoy8&hSeCkSs2x#v3c9J=gHn4?I=ovl z-xX=J!jEwN_(TwsGn#Y-&L3yRA)D8g;=JGRs^8=8wqcReB(9K9e|0PVjbevy$xlIf z3ee!8T~wfh1{e7k+nzWt_GQ&n9$v<1U#m-Nb`U1_Ez(Qp;VbAs5>fvGqWOj$wO@LK zsu9Z->AIn?B0M*rbajAf>z;zd2GhUlmr?iBe{KF9<()K3dH7IXFrpC^1N>YT-zc{VX&nxi%0F^n=mooMs#&!u*-byW^R*{-^NE1QvrCYoPC zVDw4)w~@n;R!10U$vtD3{UGwYoDhq0jxTAsQqZXF{-N+#B_*l4kptiu;q*(}CLTc|gy*}x)Jw^-q$D!geZR@K0qGMH^iZBn+H z2i6df+e_pD`K*q{%`M7Lx?`B#9J^tGN6QmfJ@+-DlD*X?u|1Bu)QP%PkIV{YMmojo zi$~7X*uIIDub|2Z)30XrLG71&CO-`6(0ey!jhctBz@o_f>8}2!Su=0W8`#3f8fN=X zBpm5F&DWIOBgv543GHIao~iF-$ZezUx=c0XHdS|BA2j6F#co+N{**N+d;zOiR)pL$ zSu<#f1+#Kc%q3%rS;fx(0`)s`neVC$(=sYMKTW=CozxfAo^Da=Fhbd_lsT)y@@Fwa z+`Fcs5wxO+N!dkf@?ZijEGB}5S!SK~1u2OO)i65@Nm>*PV^J@UZfrBLqggqVbIje4 z`zTJEa*p{La?RMIOLRN7=;yOmQ#?}nZ0#w-yo2OVuh!0@KcE%`t9&S{tzTO5Q~do| zEtG_@CR=N6qD#V`z7zgjrsB`_!ANB?CTmN_WjV~(QWEM;aqaGc>9LP12lLG-dj*}9uPnf{Hj#?jwq>8QYgo;&nwPR4*_CYOr9p+TjNt0bpYG?~ zPr)p7=a*6umebA9gd&QI1~X52FOA2U6%-!}6{%kTk@;BS7lo!6Facgw@QC7*wIcFo zsYGTYW@o{dPQSiWG&Qdl#F z>Z-0=i!BVR-wYkvMB7PS~igiE6s&Sd>w|F zG}VQdXu&OuvQsn|R%$ZLejk;p)(REqD5XU=n4bZ&7JSN43x-B0Sf=R^?@TOz4mg|@ znXMOv#x#vIjWUe}#i?^IvWh@|w6wv(G^LiDlm4PP6f@Q*%KZ+JqPLrs!&qJ?Qru$c zx-PK}x7eU#QTF3fve*XrMuhB)F!bKZl2Zd%lmmh5*fG^oq*AF(->e)LS7n(eYvb8S z5ZBbzwPb68Gr(oQ1B*QpakwqzkqTG}C345NZ zR*gcHRNY^-^;-4;>jOH|6-;h7dk_xP9&;AaQ<+dRW~ErIS$?;s-0J=m&j>XhGR4sR z7cI&z)RD3tfoaV(HCtFrODVS2VT^Sa6QZjqX{<(Vm(rSFbgK}{w?!zI*xf=^!!lm1 zy-r0|RV}U&9^)yrmK3Af9Ej62npP&OD!-h+{AqfJ8GP_h8C>h;%T`rWGfCwaf<|F7 zG%h1GIdxoDWB)X(kyhJ?H%`F%85vWInF-@2B&1q1yBb?&)zaDZ`l)BFNpV)=q_|9D zDi7BhA^lsXWEsayu_k1;>B@a?HCsL^Fe5^=OmAmo>wm;qp${M>IW@u9vQw5ZIn~&@ zWv1O)?iV*Xc|z6%k(sQ_xN!-{i9Ie#YJ8hox+=tZ?Doi!r?8BSw2ZDsUW&W2(lWDa z%Xn6%tkn2~jEt<*c7IbJ%Z+e#5r4G((Sk}i9)FouV|+rUH6v|GLVP=8d~)Vk3Z+&8 z3XY^%*`u7b%SzFKA)`wxzcG^VE| zr&<#-s#<_2z+25;ZskPY+6<-cH-M5V~rUA zwRAkcIyrsay^a&2Ym&R%|Fm8LJqq*J3A$tuFpcGzgnYk z?cuV*e$WRG?c}c+h960^y3tv%P2u}&y%x5171p=nYmN2s@}E-;3su?It_pPxp|z_p zTu8HamC1wRTEgQBhTWyEgQZ!wtSYWPUR&Kku;SS79Jle9^nYV^+g!31V(kXIb%43+=wF}G_Kdm2?g84ha$(7|u zzpoRV`i&#~;ZE>mC-@8}_$yBEkDTD2JHd;9Q~jj#>q79;?@sg&bA7SKl-QnfqJN(2 zFXRqF#!tX*IMMe&KI)+5g@_)|47j8E40M9iT3U|udpp5tjV(v|v=o3N-0B2>-U&X> z3I2%_{5vN&&EoDTKdXRKJ04`uEu6bii5r~gQ@fFVHos&TPecEAC;ErEenCyOWf*^A zm)2aPc(!s}^dDNA$x%Mq)J`mV zGa<{GFgXSb*p1g^Ci0V59S3%SE-^g=MpdFNF)<}8Gf6s4=7a9;2(nVOQDkMrsD`%` zFg+t7DGOr^6VtP-Vsj5vDM+lyofck*lmJ)+B(=uX` z;!@*N60l868?SQ!Ay+ZhB&-b>A2TrynWSJ?1Q3-3lMbUZaXK@V7YO?kkSHDqbP1D@ zM}%d|1hPLIh!qBrjj`!d=rmPUd{#Q!#eIx+u}Mit6-X*UOoRbUTe^1(5q*kovGhJd zjPaA#FRCr!#OEXw55F|naYy#AzO$iwgovlBgv)CPnk1a^AoNFbT$|5KC;E93F0U<^ zFU3Ro6#0H#(wFo3u7u0^{8qy2VqfI*XO4?{h~>xI`IhQaj{ks!lT9q*IU(V4x?(L^ ziibQsLf;$LJBdhlzIv#8h~wIH+e)|`e~=W9+#h;K`f|HuI>Bd1xLiNXUoYjei04y` z-PN}5DJdSgAD)+RIX_n=T<)JnssMx*}H6hB#6 z;yMYJ^yPT^OSl|Qw1ms;GEKte`h0`qqFfb7n`EJ+FUS9hgv#<1E zm*Xjsa5a+UXb+V{JbRLay;`ST(0L865a^$iu&9p z;WAI|mT-C=7y1vlQLa=zm;0fwgp-$F=(m*crV`$Toc{s| zm-SzlaG5_BNVpu&ClW5}f5CBW{>2z_>bJx{H@M$%i4>3ApI1w`+%7vLyqQ#Qe>lO# z7;;M2DCu94^kuvzze$sRb4g!}2`8MM-9$UKkn|st@U{}(Lc&8N+)u*Am~e`}rG!Uw zeX38|E#TMVSScPFKO^!pNy5pIDDW8)F1Odq92fB~=J9_c>C5r2k#ITw9THBqgGl$R zgv;$%gOeteS8hjd2{%gdG~l?%=Ku-_X)58gYhftrP>M(9fp!uu^G1+_%ld;jF48^8 z>*q-cr(Kb5h7^z7PhOUAnIFE8a5>%YIWE%8%p$UNX7;qvucN5bWH58}8e7rp)_36^lmf~e2IQatkYI9|eK9us5BDOx#Q zF}9p=xxa0f;xXc!=(h(n`5Az7Bu6Ejy0++tiE% zm-~+xTTXaG{6zjIxZ?mqcsu+A{)~jTk??mVT<*6AC0y3ODB*YIpW~u^g*{Y_Kc7>6 z)K5gaJSO4PE}~z}lyF&pwuFDYy=0tvk-^ilDg@1@=^S(DmgruzSYPQD{%J;0ieZ>jlGFgbj$W#fHLG16QMuY@V zqd|zyyN0^cm`DiHLEYH@ML4k?hBIQ{u7sUF zJiLt2zE*bv$27&%4dCIEG$%y)MZ8Jaan%0qtyPWPT#?$JE=>`hIGltyK-+eNFX0V6 zi4G*u=AVu=S!CJ)6ftBzx1*^!s7q+mr#v}Izm$wnh=(R}ZTgu>ae-ouVDBG&*9GiwNrCP#}j=>oB_san6M`PsQL2NG?(#Ey2%+oyK1|omQ0$X()R#>V?AIg`+-`Q6DVM zE4~yGe^nZ0n}}q-ngy1!$xy!AjA3$bLlqHIHj~jn<%orL&V7ABE)(g*-fL< zmvQq(1tpfxknuM~OPVYB){52-9M zV=&dm^6E53SlJMUHLY#KPMZUF*(~m6+klFkm9FL>o!MqNi7x4B4%{DtXjDGH;F@_Sb1XWX)kU2hqC z#WLS!o;^Rv{Qdm=j0-qc_mGaBA0Rq&$V$aLXMR?REgb8Qj&qO9ALKXRmgZ@T!PxK^ zpMLon127gW&!nuupe(GSshkW`_LO@SgejZCFg8mmQno7Vm0e14m{L-_xsl1WmqVix|wTUD=u}(pX2q$lxK&V^=17+E@Z7yHe%Z9=OefIE&Z2m;;MVh~>TVJ*g(wJ~z$!b^St4Wo@9$B8p{xdAO`;iS1B~ z8>Ji}60?FD+hn4+)|!epH41ZWYpRK?oi{b#MRAAKJYT%oB|Lvl?S0D{%?;BR_Y1k6 zRUDZ=n?)9x|AimXb9r4p_S_z6n6k~JTnJM(N8}W_nF80d9IkUQ1#S<|f3@DO;xX&P zTnF4V=~wm(IhnQ2b&wy{Dm`q{m+AMI_4@;hu(UNsMMrsJjcF{;tqk=|RKoo*l$eM~ z8pl_Fk%cA9j4KIu*S828M`|VEp33K&@Et)(xcBXSOXrt_`%E0v(Yqwvx8l(DRVCqU zj7dqj5mD*Xk%(1e&p?6}<#IIIv@ym&hhYqBXRPnrOsA|=ii@wiT-|0FyFKTSt8LIL z?!|{(e?65qs2WC{73nQGl|ET}M~n(6GL59sY=#xc?%1t4m0i}F>$l1_%sqz0mUh8k z;FZYyv8~#yq(Ji#8wTapXmyhEvOE}niAtuQ#pa5Ec@|}5Uatg8@u}dv=+QX9UO--S zjJoHa7agna8S|p!)IHz4=rQV^cV6^ZblmPZWwkz1Ik7YpX&7?P;6L4l;pix6bOb{UvT4zWCXK;d4L9jlO2!T)niOCEE zU&PLgaypK1tKQn)w%6X7R`>O%3J-28dfWa^c#IS+ zJ{w+ia9crm43BXR6hOouMql=Z3wMt4*aM>D8>l;(om%Qi958(FBE03#WI%9$>@BNz zF00sg<6kqZiR@eP`!lTFA>WE3Yn(p|w)_Woy7>aAAUqaF`~_$DD)@)dS0rm&r8IA- zNPQPv1$Guypr8i4KfEYah;=!cv*>I1?)N}ZY6KwFkCH_6HRSJ-4^t_`Q8;f(oF3pb zD5N(Fz&)_80c>a8SvXjI!`c2V(^EVx%G#CHC){vp4=hN|8eAAkE*9)1?vWny^?=q*Z!rId4*$^6cmK`lDUKTy%kNlSE0L*=jhXx0M9(hv7 zzw&CFPQ41DVKE$dh(SQ%IkSP57I{x{ET*+@#%Cp@=uoFvXz&EXlVS*5;Y z(X7lFtJ(4#(me%*UnwfB!BHvK87nz1Z&R!X)Uy)L8`b+Pj-x>TcG{1+wXmLN!g}Ok zsru65`Vx+R?^C$le9m^AADg$mv^=o0w59vi&x?|E0#pL z0(K?-jx+ezX9_)XFpWWMpn85+#}aIwH_8q4S>hDJs&(DhwKox|3A_2&xgQFMv;!iy z^o@WOt8plSlyUlDb$7UFW$QZ4p|&eR)#MOcuQ{wT)*MW@PemlYIW1^+!L{6aU2rWo zwvu$3j+T#v9{aBkQQ4HcOVke--LGA$;V!d$bNODiV9Pp6M=#T%e$ti8N8Wp~<20he z(+|=x-6VL3D!L^j;7H@^xx866B;!-*XY@?bcIUqqaPp+{sn9%ARs6%v#b>GbI-Y)B zdxZI4q~g2zZ&UG~)dbbkP4-g2bIrv!tMY4B@#tk-9bcDUzPY$xt*N!B`1;{4Kl zwqvv>u;_tacsUmjI`0G)1f9QOF#1aj7=F$B8Fu_p+p6DZ#}8UD2Y9yg?mot@Pxg2l zoDV~_Z?C-?*LEJJN&@kDj2T2YE?|g@aGinZTi(X_8}-g#gSahK94-wx2SQHfl1I?F zs-i6Dv{#h#u7@6EV|anPDdN6PFj+r&uzHXE?mM=#-L}5}e0r0B2Y6u46A;UKKMK|j*yKpV8#=LLOSX;KX^uUxC*WFL zU0L^ZWX$&dM%=l1P0}n}iTi1oM64{{SyV|zGbL)=Gm;V&k#}hZIf1plpMqLw=EAs} zRv2vYu3MbGOXp7rIQ^~6*i-YHy_KZ1Y zR`d*XHFjdu&Z4rj?L=L118#dJ=VPFM8PXcJv%bKK*+Hyg6ZIkf#z0YpsGhtx#-%kM zZ;+K)vHhq)frl8B`X~Iz`X-B2Tz!+p8j{6Y{RWDocos{R1!7~?Ks~UcJlKn32P;>R zmFhQ!aWVw`YeGkfo{#hT#H5NK)*rkNpG{nK1FyFRSIc%-vEPgMmlZcUe+o`~12t3X zqxFS4v;n!5YXHji*O2p}RxT?xojg;)ZqN#r8l`4YxkxaDx+H4Y$N7&ZOC*#0SG;B>}k_ zaph6YaP^qZd;O&zZ%>)`q_LxlH$kVaLXn(|Ke|8i$2GSdcE`qFuzL6%8%#~-l!Qxb zW)GY3+8}u&>B2q4AJ9)0;1192g@IDvtwp#46CJ@DK{t*OcVIB<1qN=~%r3dAw6d<$ zmjPgWis-vY1CC=jk4+oNnD7?Q91`Ovs}n=9X5ule-vW zCoZN`LMC)y=8r3`<~8DCbr#~XSzD^&sx1*u2(TUnyN`o)(A&to4_h}-_m?(#3-2fx zE?r2Yo+tZ*9?Q<{&IBMA{JcEy zX@Hadenm*=I^F|$@TnWb->g^?`V1K7{DhaO34+jJz&NHSyidV}egbxbf;X$lpw_(& z3f`;WLjM4}7k|0(b)UkoQgdISUx5864?Yjvi%EoM1#TlWEnT;|Wz~u$O%ke4NFNXWYe*OudY5RA3hwA`x-J5BUP=y@ z7}3RD0-T zj{}O%*Xst{q;sCCl5YAPdEh@Z;3l898EZ}^{T+GW+P14Z-A^k$C)_+o>66(N`DK`P zz3PQ9{^@%DxC^f9vkuqzx<1oR2%U!a@dZxL`88bE=Nn!4x;{Vdg6n!KsU7>T4^c_l z-QxNIqnoSbCVj)(l6-4pyT{5HS`MsJOs7~8(rYVcDY#Nc6^e7>u5@*P5`*^UwIO$; z@%7qRRfeK`(eV$rwsj%U-8_-P14qceKIfv;LMCp+-|Hf-<);zn;)PYvuL0`0SDjPo zQ+~>yEa~`K{`uCn?qTBycZGapeqHQ{yt{cP@*x#pmp|(?({`s%Gl*>t;4NtRaZ~BVA@fxZ9Pz#Wxy|9-EY

    z;~T0=`cq{h6?NM0io2)kKCQP> z6&ToIrBmTAL2!wX!;T@}!;li449tFUYSx`%fdXGW++Sj)DhouxgNa9H3qgS}N|9F8 zf~iwxU_B&$Ak=*0)B>J)_!;PlT0>X2j``xOul@L^SFAB0QOa=aXlK7+yMf_$=YGD< z62D_=R=t;;8i4ze{bhve9-k}p5sFIma@Js>4RIM=t=na&LAOTMWSYcpJJ$?ia5}wL z4nEqKm+g84{?Ze@L^}6LFLOT-*E>T5 zK`nL7?P3YNpXxQOtoe%WFLhl_-HNG*YuCwyT?lB)A5@V3#O&Su@?XvW=7IS)XirY0 zng44ToRz_!{|h*%l{7ow?w^4B+Q%m*;FkL@*6;N3{{oo&KN-Kfj?T*vV%|@&hU7pq zD>f$vkY|OW+bem?NvK`5zRvU1`HX_Godd@B=^heg__dIcf;I&zilm0@6f8xB1Rz!NEu6nuL*Nl_f{7dl2t-2VMI3^H@wk3O# zw;(Yb%&+sYO~Mcu`qy-!@bhpV}-e|!<-dF2&muQ|6t3B`jvve2?*8ZJMN zPey+ock*E@_6QUz&oPxIgJzc^%8M0BtJVmHPScZR+-qdK{I`U;xL{JyTkEEhJWyXV zkOg{$aD^>xOaECje1Zhc*AeiD5PigicvBe2CP!^jfgv%qvMgwVcK=+a8 zzCwL(-Vx(6dkS7~^`@<(5pR$e3ZJSA zG-x$VAPDHg>}bb_hBohu2;k7Di%V=n z8KUX3Ifi!hsN{UD1yS6bjr=q3JxP3fj`q*{B;%|5`20pnDoXlJe*9gEu9u?kNQud~ zsr|DmwJTGqiK6q~l@bS}Y=iu2$&}&;ZIN6@N{h74k9q5*%4R9}hORYkTp_<4er;PZ zC#=moPKjo|Qj)%4M?liL=VVlnxl%xH7>q%+l_iNPIyh0V!=8F2v|xK+j&=`C%xmUv1BsNBW+jaRl%$yjtx}5IdE5AC z3uuk4YS6E$EUnR@TPCF4OLucAKaZ~NrS-XVJ?}NIKAE&e4t;8kTT}xn^<`*{A4>}k z1@7I-KXZ==gpR8@7~0&ARf{SQSbRi*1#bX{2c-Oh9l+rp`jYEx6GPV_mwZ?bcjQ^9N0ZKI<+MzlVV2~e3Lv7N- z0e2a3du%+S*7ulXwMZY$UKT%3t&kaiEcK64e{QFIo|Mlc@_EXIhsrgy2LQ-DGED)% zJp!-?G5{ml&7UVzxmVD4?jg4n4ekY^Z&G0Hn^czMd-qEL1^2zu#RdwXF^LG;7;V(5Gcu!@jG?gc6{h(DPWHzzSZS zmGD3*7OK5)#f?6BF!8u|rHrh;)~pa)g9@$_u}lz?A1;Fh|0tH8NTEk|w)ytJvkdp8 zhoEl^)yK{j2~OFHxu_OfD~~8m?^0-x_y$vib8waNfQVARm*x2CL#R^S2TsLgK@_Ti zGNRImCVPySqLy%xj|^^3{lnLklDwG9a3nmHcsd8f+O$OM9mc@SLkii^!M^^h(Eivp zQYw;|DWgTBuU?&$`%rGsn&Xn4hkhV6WnB=}K< z_+R5U7AacI{j@9BwWzK!w~`^c?>?@EB2lza7X4vZZJsz%ND!1y6BvKA0y)jiNOOwT zXe;GaXJ`WiH>V~~ELy#|n%UWlq`*nO*DQXBOnVVBoa$bcf0xQfgmd!=l|NnOBf+We zQTf-Zd;~Z*cdPs_seI%&)maDQ<4H(3!NAcsN+1>%p%&d~j${cje1`TyuVb1p-pF5{1% z@@X}q?RWmbKLh-!O8@&nzeZr^#cmYF7G1Ot9ij8H-Cqk609og;lDxJJ?NMAD|h+t)na_ zQ=ZjALa7K|w28rbo~IFsWoBf4tkwNPk%T3M4OF2aE2#(Tg$)pybcx>i268%)fnzmih&>F^<2u4VMC^M>YSQa_0NDeoNaTUP2J8JDnjj!nFlS9m^7vuerm;f5e z%nFm_5k4 znvc{$BmRAu5NI`jk%OkkPkh-#tK__(=V~uJl2^Yk;A@oEF6;Ld@?#x;i+#s{z?h7D z0Wlh^=T(=|yivLjGcpV7=Dvykby{5F#h4TCEUXHM3c{o-;Y`v2_a3)4Bb7x*{u_C- zA-;l9%8SO@3-dFbPR?|iE1fnPr3YPAsdc4R+eq^llUhj7I*yEe>14`6|#TD zWM@4lk~_8KqP@uUFP#(YX}+)iAU$jAzFdD0&;cW5XKCdv+~~pK^;GfIV8xlGjg-Y=f}LOa57`q2 zS599x!IiNd&2U~0Z5mhJS2ETJ?jnkt_WP12By<=;Kf}62t5xyjtk+ZdA!P&WNMIw7 z)u$z{s3(4vmuxX1_+4P&paEPJ7v9GA*H@3-s3f9Hs|(7{F>pOJNJm7MDa=dTpMVS9c+DFoE%i$-8u>xtlp z$!Y$VMN1G)E)Lia2i&~F8F|OCzfx z6dx0!Cm42YoU64%y_V%Z67TkxCo2o9z5q%sdl~xK+B}^jC@QY}3jdMH5DBVH@5G1e zz|b(Ji%&iX&ZA-BU&I@}gW8Ij%q7$=M#)QvZE-SozY$uGCW=5mn0@R;mlO59iJ9ZS zn-%R5Uz!+mGwhMiE<)WmSC-ia+ZZm(EDL z=)1l)j2l7?79!@a$TiS4NUMghu{;QwuYQh&^er*c{vb zs-A@OTd_#k9^mdR;q=XAN@KokKPk}#h-1GSZ}GlR=TtSH({-O>qQ zzqJZ88{nWPhuf1g<@x~8vUWi_x8RLZaN*y<7WNgyc5yuI6O5rb0%aY_$JYqe@L?^o zUi@EEfNOcW0Mnx0fqsrx9o3s8L;w|V*K?lZm(U~bhG`Ln**@q2wP)5lO+r(tajE$! zS)&u+1X!*32TTw}2&e1>RbZD(FdbK_Xm@+Hi&psqZ1A*I61h;Td6<9MOIqT`oV|LJ z5*%ZDqRcV*t59DTw?XHpa?B|D)TbxQbCjA`JU5k0(o@)pgJ|pm5aGGC8LKcoOG z=(VkKA^nwL)zHj+&a_N>Zl`i2eQLjBC?`|V5)yzOE56uy9nc{VnLs9>1W z=(QV8UZ5r>A#nxT5u2CwLXDO0W2?hJGM$Ar^BrtPpC!~1vy@FlAuTRiRu3EmQS+zU zSEJ68%K|w-EyzaPh>bvud&f29ZPMa@;X7G~JoK;}PUw_;SS!omv6FOBtKRR7_vY|- z8QaPysM0Znsa!;IdJAga4DtlihF!APSuV!3E`XdJ{LZrP(QiR2Y904P%gQA@erQah z!$^**lz1v*vQ7cDZm9PaLxpoNZ)X=OwQT2+%z4{PwwHubkM%?;O9v9;>B-XwR0ay3=Ree8mCEDdh53EsWqlYFvrL7bdRZtSjPYYjg1CZZ-!PQKI2XbJo}v!+ zsL#ZeQq<~755+eLgC%V5kC`?eWufEq51aTY)I0@xt{e*oQ@R$ZgP_o@Cil=gDrTX<M2Zn?5~jS1)5)8DhxdcZK6Ur7~MMY&E6N z891LLnU#XZYSz`+uFKKx+Pd|N1pIAbOjLsnTH<9@^oSAch@T2*tL_3^I6|$s2lR`t zcQ-N?T4Ix@X17~Rd`2Ke2^dyNuRp1r{BfBv>~BEzZPDyEX%F1YSLZfYiZFw&XRTb< zdT9IN3xx8g3Men`HKiS}AHPoha+=VQ%7QrOq0VN)!q_@ z>lzZF*9mS5hYo1Z*5T3#Gz%?s-UqZq0my@O8Lpyoa|cp2cL_m5zFg6Pu`kYc~ zy7y<;`pCJR_0I4co~-7W2vhTs)*vT{Cd*NOVKxsc21IDkE_kH$V5jVhOdt!BC}D4FNv6R`w}w8^NtnJUN3WAgQmni~)3xu{8v$Yu z?xPv53t;J6 z8@p_3vf%rMHOzg|uzCK4tjq|EWq9Bae>4c$`T3Fp(oM&N5b_nn`@ag&73!LQF)zrJ zcF4XtjRdi4&{UbzXWmp*0g^n#a>O3ZE+i%}27i`UHToW;r^C_&?|0dUtST_=BL981+ss)z; zEOUZy*pvI5Dk_NR6RZ{9gjaC`!OpN8>P=sd$R}zg7#(>YVC4!Gmu1(Z3dijTo*Jp+Q(O=`KcX;3Uaomo=WemD6?3dEq>$V6 z))PpJkkMcO#(Ag*HzS!6jq)zMx_?q9t~;~X9)`8oiQ}Lmt}%OK*JNNB4ems3THluo z0hk5K;CkEN_X?Wb9BYq#N1o4B1n&&CI68o3)tnOkhOI-+K9NCVBlDY2${PgyO#|`< z=L!PbSoP_p0;PfV&G4IEOdQdyPlzUmMnkWwXafr#Fq4DE6%e>JIdh!$!jKLl*B2lv z&5fD;o=J;MCFUJLqh7B(tRx)~5rDbGjE!az3wvc!ILoZuWRwqLOUb}{pc(i)x$C>9)0LAM);79Y2@L9pZ;8C zd_;}M6D+1=0sgNT%uNU4frn)cPO7>IjhC&SKJp| ze+GYvA<@-Ga^5lxjdw53;L5#Qa)EbCg1EsCe4BONH{i%!#sE~X2Nh>c(Y;MRCo4WA zgNmwgF{nvjB5XI1V~EU&A-Xbsm!HaXtK)p1=_+$WpV4=yU0WrjiW;wkTVPgfwoULj zVXLSl%!R>0G-*ZbtJ=D0sOsjiH71oPsc<|sE`6C`44%V2Z5=Vs?W^+tQ^?ER9DMQi zaoDXr>uZU3=W8_^7^;}8R&K)z8PD92B^dc}e#CCUDiWdM44Up^(O9%y6M zL|ZqUNRIYR^INnU6|##>Qn?Rn++r2m4?75Z(8}LQ*PG~cg>Ic6v2VpZ5ch}O+VcP8 zIAg5~;|Jbe+7s3i&&u(}frH(bxY-fq?w`4W)vE)hg_-QO*jFR?`wNyTe1)7_Wl9}{ zl6`&GX{$s+24$Hqfelxz=Yt&nt<#>Y%(g^E{ zn}L8k#})oKJ5(z7t8T4F=UC#(jliVGcQ}6`uOA*!Vr>wed*NkBGkhJ!V4uJ8e8PqG zpT~mFDmg}!GZ&E$mE*-2+$IM!=g_&%m9(eurOg?|PuO{kMx5XCQ&DKny_`pC{FP^U zqcfPY%L9kWla(8{iM7LQ10!pH39_jYpaR6l)e)M{PiuGc9deeOAKc<@0wo4R%5gZy z5y%_%O^0(VCkq0Cy*1>_<~FrXu9J|k>Vgo9#z*-O^#f5>_N31GBFn_W@en7Li^R5i zTWWBVrb=g#vuuNuR2S zseW~H*-@XzoGBY@Oa;cdtDkZQ-P)i*IuCQ5R0`k$l6=@3H5jEhK-u zo8L`-m*kg_kHwh%2--rjFM;KZAIZgXZQ`WWT68N@0b<~zpbA-=_9(SWD7 zTR)(*6Glf+4uD1M$G?kBv>@>w_+^!H(|3C3Ln00dgEWs4(HdvrTz=k(7QSkX89F5| zzUHXVg`8tbVgcPK<#257q_8hEIF_PZ)rGw110PuXH9(EA+Tf56S#OhbgFqf%DzcVe z&2Jer?X>&T-yOhj@oEzWKE8kwj=Xe*W$%0~JtE@=HC!Fa$V(^=Dxv~zS0tH%96$LbWKQBBsY?(GdkUhH$1-C%Bzn@;Zk=cs z#HX8PKlr8o98L#iK#vNTAXt#msAi#3y@TiwuAcI|OTBQrBE{-F#2Zy0CgD62f=l6G z*HpWNsPV_lylI8-6Qd&)ZLN=Ur@|B(!3Rr5J8}!DXZuqOe5z5#RYj(R%8>y`mX4tULYo_`UGVuu$?g z0g6^EG8Lb|i$br9QDZUIi!ZyCG2w{X_l@dx{Tl7DrNnv(en^Z^c~=NS_*YH*s37pA zbn5&GBEM$DQH)V=N1RRMd05Ly?6h(#9eFVmWhxRRG{Lq={2kcEH?=3^;Tdjw+(#jz zGJ5|CWaj~SjX?W7I_Ks{r^CNU$I0MQKP3_Vu!M8LA`_WkfYA?+7Ie zeVcJ@RR;a|!7SNr@%lD_sN#nx!)j~GC2a80#W)Eh#CJOx_HJBn1G!F567V3L%=PVH zXS&{k_`pH)xr)fB)s_yd=Ck@dYpYTLr}7DI2u+^68hPnKd2Dw1lPn*Hy*OenH)660C+fs;EK)FUb9Lt-rv>Y+}(LEz8D z0F8($&GWgUgQt{!2BEF5fk;auIR$ZU&yAg%ob1Q^LboRSV?&aYk&I0afJ7yt0e8*B zk?Lf#G=idIqVN~o@r4&fk#vUs-5Ko!%uzxWw&XQaUcvborTviYXiF^Dr) z^~h#}w~@V8oo9v7MX{f?RlkwCm)$4E5%0GmoU30l2e5EZ$Zikr1B-DfH0_aU4~sD0 z-Jk%2%?}-C_)^Yvwk-C_1WjZxpqi)v3;C1d#MsM`Wk&?hApVsK40hdFC3K@zr#cCC z8Nv6>ANsm8P1B`n-RqMMR7XwyLPV0ithm*5m!z9|@2%&d}iU6=c?p+uL3d}!b-CZQp(ycv=JS+-^<*d`A zj~Mnn#F294Nir@%Wg@?jVMV!fp;&N6ys;PI*y#8{HHJMV5t%ADXA9^DkIK5r%T1dS zp%!jNW!66|jnS_1TNrxUC|c$pVHCIDDI!&6-uIzLk4pGME&yB^>(d3mU)}{-F0s;; z%RUMzBRN8JRG~ewcf+A=Rey7)k~sj+%z801U?P)CTtb2Lzh(9#p#^RKU-jg}y&?Awo4;tol= zmC<-zlMk8uu_CqA>JGpk3kK_iM5Hj2lShA`4Hq&22-V!jkzf)y%DR4Z)V{U2sjP@$ zQ)l5EM5M8-5=^0=-tK6i!@rW((cpV!G=D3H^LB)m7)yUp zrLX)0NvbuOqMXSpU{&R>mL2^vhdKlo1f(@lPu_%!V*S2BoehG2TH-2-)*mQ*r62hu z1MC}Ae;{CWs}B$R4*1oVhkgfg@r-)?(c#MuP`peHNK1%z+OQh3MnAAVb12`cCC-!n z9JfDR38;vZHJFEC2|m(MuT>7=ru5f4{*L-Q^*fiFw4>fvIlR?*rHrn$n)6v9xlRdr zFxuMe1Qhx~*|ILkvEUoqTjgLKqe^Rw-qAqg@r`~y{d~}Rd}A&jxqPsI za(kC<(p%fzsnks4Ld3>Zp)^r33BuzzSCZC$e!n8ZY0&>Q5|!MFi`ul!(dNYK3#+~g zx&@lbRM?@WGEtcjlALP?{H4pn7X{ic3kEv3so_HpsrJM=$9q4Ixs>*)*b?qJrp9Gj z<4aQitc!eUd`bFQ=@&CPX9Z&rSAN-wRQe%3t=3ypFOH%I#lks{lH|72+Fth8&nsij zPw)d6;Gm$c?;7M<1}RBxud)ncmsAxIu{(J;8lFZTpZ0||Ru5A<&{xNU0HKXbI^!p_ zC7&}ZcnHPVh>hK&#pMuF`H|%LCdi&1Z|znHS&sG4wgXs;%Gl!jy3C5Mh+S}9WMVn- z(Ili~0D?&kkn(4X90%(CiD)6}NruiCW{YgF}@@az!EuGRdOxkz}>GVKRQ9(O7g)91IAEj`8SJp2o1 zFH#e7loZX>rXDAlY=kyZ!MT(QOZFA<0ag)0h4&ta5GrhNDia|z0$E0oP<$9_d?1|+ zPv?-uDhNvWDCnps%ly_9tT@Uf)g{|WlW?JK<`kS*2?z4H${FQ~m#!x-fp z;q>MB_ty1W*Scy(WF$?J=+T9+%tHhuAKZOJ11^t^5GFx#Lb_5g1s$~K7DQ;YScsS2ATb~USu zu8#x{t>N&*cLDBE4wuy2uXOYYR?WX#VbpE?7gF zR!HcndaYKhev{wC_24j1VLiaZbF?uLc|tUaZgk`i%!-?f2>SLN2;$88p;eNX z;{3@Oy*ebM+Wx`gX0Vm0Yq|wB3JI(z;8&~Oh=fk?Cs^{MODJEIcitKL># z`$ZRs2#JTIzfWh1AI`{|^S_+(4oo6k{_Gm5=F(PJrigt1oQ}prZTyn zkdvU`%*1nAzgn1@KelM$wWrf#j&^VCYed**$^vwiMn z<;ipRmWfu(fI+A(3WvHEYY4NkP9-`yDh8NKyiEwm6w)W&S%3^I5j$W&&6^tj z1*AX{53V1$;7eTAS9JafgVmd+yx zjVIzuh6u`i-1MC?Q65Kq;NdZ=6nW$5NT{u9mw`1TFNY$F+*tJ|>9E}QckJ7+2aA^U za&D9mGSQ94j(scUZ zZpm6s9v7Q!eJldS05SKp#1+7nfR{Wt_VNC!upGOp`oLAZmK&S@zgc?|_$aIE|9=Jo zg!PFE8Y|XOgAyf}SX9DNGLp!QP5=c36_*eKL_>nf47g%o5@3u2wAE@`tF~%uTeYr; zs4M{qxQ0a(H^2qwF$xrARmt!Dxz966K>Pc?e*frboRwn1$Pw{SnND(ecTu(v4 z!M#;b<(WbG$*l4Piiexo`~qdJtOK~kj*Vv?|K8361*GIL@j@4Ps8B+MDKznz-kp0^ zzqiv3s+{>P@jXg}Kx~z3!HYidNBgiDrp|ZH4SxI^t_w?`5#1iRziz;soDGQ+*p26M z0ONMxsPzx`i^OO9x=YkQ#Kp#DA<6KH8BbCSui0M*MBwo!G9Cs)ftYj6dCm&6R2pv% zl*mDNga)M`q}-kHIMD>1==-_1ju~!(7M-UeruAV(cPGAAh6-9Whsk@gHEx|*r;VR% z^dTJ>wwEy?k~6nQ-c z7#Y*KW{k?p(g?AjZ=&lSG&13g33QTdPWn^z74&)t*%wBSVx{*Heq>-UCB- zvA)7coMMSSK0g206pv@)S1DNlV#7T-=RYb3andvW&jog6wsfD`5e+sIlfhNT>|0@HG3OHUDP4 zdABfSVsYEqnx{M0jP31$(@)aVS1DNOnqxY@#4(w*APxS-dkWj7*|K|12SKc;{=#3A zthOT&z*gUUb5^Gxf)QR#P^WQu2N@u%^N~;n^?_(}59{~!f%{M0Xvav8J+tX+>r56k z7IZ9AgFBz~l6r#u4&%w8j4a(j2Pe87cHV;Cx_b(7(}|S96?)Za-@?$V(#? z6g9rr#DyY-WA4dVL~S6wdjPDl+e@3VgQ6knz7W2Sw5D^Cl6Ad?Qy2P@DxXI^R77`* zpxmD1*l&evjj$1>3IR`Wa&9R?lpI}=%?F4Ty~+6b?Z_b+36+n=Gj+X>TJRz3pEs%Y zeLp6FD0`zduMBjdu(lRlMa)^m_N^R^2#U->tPh0HB5qjl&gaV#ZBP3AWKGm~Q8u{bcKmYj|6|GqV^E9r^h z&?%LMY$2TK;>o&4PK>38weT_?brRYTiQ0d64{T9Mm(h4<4=hKxrGt}Swco-B34|5u zD1wjD>yhT6nbl5Ts2|Q+5g!d7h%ud8sC?4s~zN*&`e5EXmt%lv&U@`5v; zyImh-V{Oh9_-h#y=%(UGV5?Q^3;9#s1wd`w-U#w|QcX-+7(n3$e z>jW5TAchJNO}|~rWZNpAFlVG=yHh*1qt>RY;9s@tX7xflF)NLI3-%MNkt;d#leq$B zjV`92_1|&=6$vPIcIFRQ7D)bt9RjdD{oG2zDZtFS98H}w?Z21l` zg4R52s{I;lbAXn;Tn?sOpwfUQzK}KNb4F8Zvp4hRHrrZw5e$Z)LEV+9`yRp~!zPG<8!;(-E#@d6YuI_W`&!Fn4C%#;B%D#jptW??_p zzz930iPT0-q@CQ{$-_XkdO%_uhkZ>|Rr3G>jGB?hGfm+;bB}kHg{4ro_HG8Kr0~F` z(;o|IfdQ8M5IJQ(Gm6Kv?apv7SOy9TeSzZPzST-eb&a?mzCKudc~3Q_E`QMv|8TUO zFTy_2wdXBPHy3&mYE+%uQe%7cEKO&9TRnTd^z24Ol)1Tf#m(Jw_91UpF09@Inq!k z+Rg&eY)rFYvN##oWVO<_PGnu}tj)hlsY|UpH}^l`CJsxD$l+)fb+?z19?Bo9PNjS! znRFHU?Uvys0JM)l4P>3S&E%|7%ZYs89kt1{N){vF?SCbgcG_>9sJqa8D^9|Mw$lx(OhyhLJ2C7;RdpDAer!T21P`zLd_MfJ%@(~z!( z3)Q9iGrx@t3KYNXW^aYO>)idN_be`NR{pxqS^AJJbvb^p{zbuwA1(#g$YgJL1B0EJ z&6;zy;_~M3wnDuXWA%l)=>+t24DjdQ)Bq2}vKhVRv1UWKD`&69!<;)nuVPE{Cw6A% z;8@05o~PyGNWvsfE-V4PV#(HG5TyG72F@Q&C*4Ny5mb;^2<_!;D9rtiZcma1J%~Sb zs+G8juZCK1Va-=C0W+IGpyUF~p4J$vK6kttSv2RvCDJ*dhh2`?C^wmg&tSa3jNVTM z8_S_0k9~@9x=_s{9CNMR@U51fj%d#86v`Ma>VXBdvRY@14M=2R?Z>1<6j6uIQO#xFs>rpB{ySJb~=Qo+SAVngqC9#5`38vD2)^L-tI+yAkB2f=Q8_HS`^ zcCRo&d1kHg(oU8htT8^d|3Ho1^z0pEm^e=TJNydT;hO^gZ3s3lt%G^p}}FPA^Nh*OBmp;I#KF-&BOm|{2L34a+BP1~;R^>s}T zk3Gz^wwfU5hQl&=W&nZx61%?N+sv3@ILlYV^N8<@SY+58c}U`0<7+L^?57+*A=YBp zlU+y*r+tYVziR35)#~#bS!YSqMVvsC7~ktQDnO_GM9g*Zh{Vw${dftnt|X_F;q2;2_hBO zVRxdBuV?(+y~&v%3!$wi%(FrHBbc)XbHBD~=Rn(B*HKv*8vLk}!|)(tma?!G-l5xE zkI1GQtLR5fHum*=gpDWeKeU%I;MAq*uMVCx^H&pY|B6WPN%r@RcUZd}_~PA6CGJFG zKTA)#_z6kI4#g(H$zoq)nhgW|w&|2seop_OILO&x24doqgcJujh}bD+&Ja&LuoVs) z4`k=hzXadso$BxrjhSxr&Ypg45LG^vGB5R>8l+r00gNho{d?Q)?TjA^w#2hRK;x{LCv_X`9t^zU;8_0eU zhKYA^tw!f0ej4h|mF5eBr;Pp6*fBDDu-+8Z{?&pDKByD zTTg4wS&XSx!KgQH!QyeI&rdqCv#fmBHiD5u0tgNvoCb1i)}OhVwI#Es&LLtW;++49 z_srHTVdUAM=81Bqv?L#|JC~W_aQMsI{WE`U7D6(~$z!#{rEKpA3$cyX;!Ci$8Pi;S zFgN_AwsT?)^SjtrXzaAuUlXnRwr17}W17R5mo?ZIn8AlMgq#-PnQMHkIe*YJ;1aYI zt<#%B)YigF6{ihF1~}0ha0%O-YjyC;EZR;ySfZEF`(hNoyO|s0Q4zRo*`9JpLs>HM z<;-i%ZO&oZ_AKkJc(PsFv>Xwi4nZ&3IP!h4uB7k_&iaFd%7&1azennN4MDI6Ue$H z8X~i!WUnu=Kbbc`RoN{a$f9Lr0CTVdux#0T`I?S#)33E^jyH6*%33@Ix*FbGeF(ZT z*Uo_qt%>I&F*$6<-XuiC%3+oEY5buxYsCI_W}}q`?ET+x-L|A^r4w6Z&vuBjXZt0a zFR~RI7#RG#BaF=JhzJ~rIeM2EmUyGP*(cFioC`}lwzrk#*~_4#=z$()OWOMVic?pa z6A^Y0qH?^JAVI27&1ZrpqNBaHGl-j=fMi+PY42ud8{F8hQmR6XC_1;l>QH>4 zS!Tml+paZ_^=s!f=2p&Gk!UrN`C9Zx28E?o9knEBv0v1V;kwkSlZ4Rm_23XmVr!GJk%m-2usjvtni-pnBFoSeip4>~F+LtiG!ZOR`Il zOqEz`ab3#Jb3dLJ{0WLfiwBeF&~RH1S5k8h*`{spA%y2>x{TN7M9u7 z5U!a+?JBZI_E`a|LDwN!X6DH}Z?o5tr-ek)!3@mKe(8{Vz%l2nP)>3*aFgaXT%9~}B!gI$Q| z_b)0gNx#pVYOpVkJge$yZ``RyVVnJNHe8@zXKTDr9=wm^sKOk!!W{Z#SFo;&apQ9d^WI)yj`<&@9}-kI;&fJB*2AhJ5hYL4s3wsDZ-Q_8qua4sdH{N|-{p_t)%n~ET=#&f z(orThtoH}ERxrO!1@mK^;TzM<{vNV1nS@;Z`B6Er>-Fo_9M%b8$tGe+;E!F=%^t=) z#p)p&T0}RGa@yge&-KQBfMBTDtS20PYHxx~u4$j!I%0KMp=4V76PjoCjem~T4WVC8 zmSzQKv>rcQ#O)(*_TvoYCQjeA*F;XY>*+It#DdsY;N2kALB7s_P{#q(1_Vdzb7b1X zbw6Sz;v_FKi!jRUcNod8zU7z}67zQM#ZsmM zLtozP5BX#*^l8rT&mU(TCFf^rVM5b&i+pIOQzzt-|2wA6KdA*%t6h!Z5zE~Pbi2?r zklz5Rl+AL<>Ab}Ezi^VGT3RFAP{nNe$LT}6Bb}{;{rIIP-f`phLn;$1upc8|KX!W< zgU~4ZI@4%G5(!I5JyN#xNc|GSKT@wiAZQ6BUiGurBYZfl`Sl$_77I&$(wCBCg6b#S zT}_$tekX+)!05}=L@Fp`)=@z;?o9jk7XB}G9% zSv3#R^>SQ9abAc=*(1(R$tBfmob6#iG@B$7V#}_MgtkE2d zO|FB2Sbm_awib`ZPX3@yr26NlSv7YM)hxi?xZ`6#yQw%)z{}t5IP0s&;(e8O&G6=I z4$9}}9+-unn|-q`qJY~wt!dw19}6-MN+r&vuYt9?c9!pF=vvp<)@9iQoAnf!*Qt|4 zsDp!U91TqPl^1O>%JXmsyzrnp#!ZCTj}OFaGNywnW9w5#4l-BCOz12np-1fP3J0M$ z#)Ji)ENkI+bQS^rHJ)r-wYTFsNiRo|WuJ$S9d4pC)!F}{dcU`hi>F~hu8JiVr(g@o zHFd)cDWnSJh-!)z&&Qw710n)PFU*)rq&G1^PGzjq|GK2Idz%VZVioXSV&7MLx$W{B zYL&gF!0QQHYM^tR*glVhrkCuqc?zO`8cO!`gi~KT!W;Hy*5aP+{PTMvx2$k_W8)o7 z^b8Rv;4W&ssS$Fce;g7BevZdsu@>a+J&gKgHG#$2C-ECOe)_dghHS9Xx~M7I?2YXV zcU^{(mT!!A-NpjSrX z5wXov6QSP0+>fj|V}+a8cFulRoi1|)j2KGfSbpxgFoy!|BWLm;vj#4sTG=joxY$~- z$Ryrk%{i0Aq1anLX-0=cJi+QBmeBACanR)_BV-X*%-t>9Vw^cxckd^k0(=G3E)|XK z%Y8l1dH_>>D!L#8RC#x2zLsmxD#`t7mSx1M+i4Ab>5aYnlcJ9^^pNOI`Lxw%=z!DD z!XAjr+-y*27@v>`DJA~;u^1dg0s7eAGOJ(R@D+soKt~E1!jsIHs)kY+SBWFLtV7~2 zUusb8Gg0M|!3%@DhH9&Z&Vc&Cj0%(9!L=2Ajvy{<NfMjFA{9~-Sk1Jsm zw~PxO=(oYy)(ODnkG zQc^Q6;_~@u=kwC~y^xv2U@yz=2KE+Fn^S6=E)B+mt+nZ3ZWQy+_b!=4#jSrg(miaS z&h>!(WbL83wzZGeQ|(Ke?c+_4P;b**nSZw?Xe|J@e#r!1n1<$gU`57>Qs!nXoOAc) zS$|&R&s?96Pojl=Sb}hYc{^S(!CPtTUiTLL0R+T$m9y_@29B<=6l!F*@jcI>*fwm( zjP&HV2iQxS+TcUWfmewqszBHLqt@E!&7y}6TeYir5&hTfr$}yzwHEH=VJWR5P7V2R z>HP;RQytZ*!(QyaN``8Ym!9_G)np^7TIPdo$=Yovxv2UfZj5-}ie5pkHL!q@K&;P>$fYbHWF#p+XT1M zeAe`;S=Zs5Fn5o&(57-^IkTs|)il(@Y@sWlYZ~v32%e%qOS)GVOEeDT9hHat78TP7>&Vrd8%StrVt@RpYo$_89j7g}$@=g$Oin zvFu%w*PI>sidBnG*v;8zZ{u4C184GJnx_9lkm7yyzSqOQQuDNAYI=;0%SYCWy=zA) znek_@;*})yKKN~_335>WeZ_cP8#tBJ!tD?LIM-w?C?U*PgvK^94dP-B9l;YBS|4dX z3j|m$B4<3UaB=KV{DBNHT-mNk`^-~=qZ%^LtWxCQPUo5sZ1#s@4`dwRgP^j+tgUJQ z?x8;}#Wi_spS8GSG|_oThBYrlRvg^so~zlMq;1~D`EELBbL3;UzM4pUn!ZD^Y&h|X z@bR*LW5Ql*&GV2J#@gZO8!>;Gy;@CZBm6jWJ(#6esI19%&y0Ut%X)B(vHD;(ULHvw z_cwCnA46iSeHG7dB())(4VaPLG|H{V@c8Xdaww|o7Gq4|H)Qm|46aw~8o$NlkXPN@ zdFH9G%+y&M`D@+zUOc5*(w`eQp6_p**|;cxmj#$hRTuP~$X-`z#^Ju8b<{K6)HC-3 zYp$G7at?4Sad3SSUvN2x2@tg5IngyP+tlH0c zB1^L-Rs^4aLWK3t~FbJ7XlpO~H-Jq>SF=FoouSolUCF zGtbM{2BX}8_HH^Bhuee5^-F(r7hl2Lu_NLG7MojUayN{Khr^ALk0kA*YTDp`<&=?B z7e5ElL#cOm_0K-6cW#Z`Au&W!#4f5HjD6zY&lPqXn@$lwQ@?{8Jhy@`z9sn=3TRdX zk%9T04_Y-3X)1xXIEp(q12amo(G7vvFFDM~7f7r7tHoyLYo$Gh0Ogw>vvrbI=VfHa zxU#^?UuldSSmAO|WaN4*1eyAskufVnan{Cf-4E%vn+lZ{OQn@^5apDtp`2KxM0KOC zM68Yez^q-a@w(u9_F{QI-dfmO=2G!qE2ijPg3tF{NEV;ky6kH5BGLa6a<*mX3ja#d zyKPZnDk)Mi6k^rfn|c(jwbH|L7!?_M_$LqXE4|Dz=_~@+NBW+klyVAcvrK_1-DNSSK3xg3ptw$1@st>N3Z5f>riAEs^SKOr%)7PVeo$ zb2dio58rOh>q8avyy$lJQo%QDRCzTw@4D0FsPwGaoL2$rF&oL7f|UiCH#*P=11!V^t zaf`WHmDf^lIujq}CKxH`?Rq_Bx0#2~zg}-nLs$!|8B015VKxe$U#+RmtO%wm+)=bD zEZA1j3VZ3R(@05eYf#!&RjxR%^)S*$?R4reObr-sn3zCvE^Q@duLfszub4d>lsKIG zvub`s%fl{+l!V&K3C2fgV}fA;;WUg$S8r*fLeR0uyB+~-{#I&988Bn+PKo!6??D;#-++C#oJv524j!9ZKZBE>~MqFPuO}(j34`U(o zRbu(u3dJ$UH;RkV3^m-DC^d1p#(5UAjcUs6o0pp~Hu5=ef&HJhO9COclWytX~##k z?02#8-Ll_R7~>dF0V=zm+VE=6NiAouOYRo6*X56OPHuM9&)lv(PIWm89;tl`@TGrg zieJ`bxj4BP!G_lW!@Xbi=P@1z?KOY14^&E$M9n&Py7#JsmZzY?S_9JG?-ra zJ@h!6=jrXOg+GXkwvmG|T(Rc7En?1fiFxjdHpJX&1LF{{W4xm05Vuy%)8XV$?(=T@ zpD_uqFm@E!o;kKNPC5wM9SgEfs4~ftXe%+vjxxD%k~tp%FWLRw6L@~j~zwZ zj^u%$!KzQfC%#>*+CPJ0twZkxVxyAQy1q2>DQBow$tD%S<~U>qEf{C+@W*d`2YJJq zcZTfjl=@^IkS9=+B}HLLJoZ^^&J+5cn-5J%q zoqe~7vhvdoUhY1%7Ic6Mto*d6_nwSRd<8*wXDBxwPX6>-i6_^h!|ac$>j^CwWSjDG zinI8Ma?r;V@-XqG>!bvU6S3D@rH*ZPS~cw{fhh%Z(C`!^iFBNK9ocuNBYWvTE6+t% z?I%&Ddp23h83-DX8w57JYz02r!P@MEkocJCgI2`Pdww8(P|g3Nndnt+V9QCDL}kX*l+={Vo9K+Q`$wZSnS z8EwP}CVcxlw>?I*VJ=PcXRfq+o4{)F^2~0{VCu4=a{eLCd z*xR#rn0W(CJcO)oHs_a``5aL{fMJKSw`#6q4*B^tfZf|cP5w_s1gqvU=--{H7>7@j zl_o053bWall{eGBp)tqIq2_*gh9+OdF@sYNM-0k@&xjIPW=Pf;^e1O)Ga|Q{l*tjv z;!rBcG>U1P-D)C%++1>AVIJLatrx>GRIL4hW5+5w(|h102O*Mh7}T1tS>{veIaHq9 zJG^nFS)FzN6W-if7>|8|QOSW93B+b_#zz?20Eg5&GKQ0+j{NJI28?hl1Kz_jpoQKN zxBa+RGNJvISzvl*uM~Z_WMM9vaO6u>C7mjmt)h8nlfNjthY9J+HLT-0{B{hjJA)20 z@+e1aaACulw6n0Lov=1CF5vdO8tODXGF+LSPWw!zbI+koh=EDOBMus2(0&~1ZKSy--CySo#SY59re`KEa!!W-{s%R(!PvNIq|bQA88=5v#RssU zG3Rv>Z=7S>9=46e3ME`=glZu1D3Z}Xa&%rAJeTmgM1SlHXn<9-3hT!G z@5fd~w;Q!Uue+|0T7Ze|+LYH@$Pg8P#Jl^58$ED}bU@tLMjmFz&dGV@mnWffdGm74 zCNgcVEO$;!Y6qkk;OOD*mVEOyPqD!p&Uc6AOE)UlMl-xPGMl-QvnG9` z2T!pU=pNGO!2xX=Wi6ObSWAPaw^zOBQl~!FUH`$b!m4fJFA9;1*}X?~ku?z`PiC_P^jJ6C9>avpPIZ?OHHr-6g+mR?Sn4PFq%=Omtu2kKyhvw1-Jf z`meD)Jo~pK`_c|zXduDPRNqJSTVA^GB3TDYx9Tb56L3UD(ly8Lm zyZ4(7S*&0hTEu%J-OC4^v3Nn%Zm)tFMQvYnZS%%$r#2>gY8q376XXmAdxDuWn1x!` zC-`FEocX-wW{tnG8MwD#>7W%wTH-HTV7k%OeOI-{M&GVI7+Jw=mK%rhnpgh|rj}?2%sO*f1bD_6p z!~DxVk*}yWz6)G$4#vZ+so;zMb}AUV4&=oz%AkTXe@W>#cVZiD9AWIcX9XCtY_t(l zK!|e6S>bHckP$A~t@#g|CLIVadFxH*U$h}RxPKc>OVG4X#+Nv3#_>jbyrH8*&TJ^G zU6D8c_KYvXg@NVTTGqc-`<=#6Yz4{|+&S&yiQSiM*Ly2ho^W^EZ@nwnT@RpvnD33O zZ|aiN?{OT|>^fh{;%=7OeSD-T5Zg^1tEnDX!kpVQsUt1gs_i5@Kzo{wbL0c0kBoxzJVSip4-L$6)Z~tPL#4(K`!MoWi&6K)_#zVPO^YO3{du@$wms}FXb z!Ir>56bn~h!=2Oq30(hy3d?^DUUTdH*REProttgdo=H8_l2Go-$WBaC8(UFA;ogRJ zpcHNIN~@+954s8RWz7nq*t%Drx^I6k|H}uiyR(DeFe`hQV#qG3Av`w}pV_%E_8Ju^ z%w1DxU4$RtbxprC^&S=P7E_UIRDB-GwRsI$HBXW$n_8zP_q1kg!4Gk~*VIuxJltGk z{W}HKa*vRAt$hxKICP=K}=t%!t#D@1fWkVSLR7@yM?JvgW?Rw;-lDbDrY?9ouqn z^i3%D{a`#)$f~1Gq02mp8G#dcx+LB+24*SAt7CpLdmQ5E*rgQ5AghtRSC2zg>t8jVcxMc6 zXm=XV@JRbulkHo0PM|*mx>iD5-u=GBBq0&`1RCo3&>XPx>+O%F-`W4Z{Vovx?B3t` zV_`i1yk^&f(s=GQ4aA0Is5jo029QQDqpWi#dufwWo6d6juMh=Y&A*{v?ysayIG=uv z{v3|2%^0te-@~UNeIoB$i*F_DDlc8cNZd?|c{I*Z!3Zk~3!9^Qrsk)~?M=Zm!7DKts&5~BlSHzDV$hM+hzQyW;?JrHk)rmjG z2G1aCF-~fjuMLxwTO^>NTRWpq&)E9-`AKmV#y~zxvd@7C2$=NCR z(kTG9%vnjMX|Ac~J5341FY%g&RD-Ct4Y3yArd!(s#b@EC+(kFI>TlJ`&x*C|HuW-n z`#6}OZ~yWrvnYLqS%TBEi|JXfZoiQXl$?Kv5FgRVa9VCH8_ex4qag<;UgR^fE2ATb z&HV-@cRKY}vSgP-{rSI3dSUP=bXuqA^j|&GE&~dCAw*4L-X&qmaQ+W5yda z&ZWM$wzGA&BYYSOpxR|T#tufeZ>>H!-l|!`8+E3OdpVR<9E#ai%^>Iw{%_S(>H%Z2 zHQqk9?xS?ZS+MR>{DNMX8jSfg6+iwEK>VqU@V-^ z$>E`Gh3W>`T?`uXpeKLIP_1sQsC=CztCZ$9e#Xoay4@03jVIhC7;XOL)4vQ_7qLCX z4pa}GY}H5&%5@<0A|&dwJ8NJ9ZoD3dP>VE;8u-CNcCq<)khap_!c-Lx)gfvfmRi zmNcz#?6Z!p*C>!^rlG!k;oe?0S*lJ$qHga`Lw(_o9m5%1W+f)5X1j>h6|zGIlZT%X zHJTB1X=>9)Os7GX2Czgs!Gf}NJkS36eUMXwV2OJS)jm&E3xqGQGEvi7nK+@cGTB?U zG9SpOCZ?77sM-3kG94FbR_60Yt7B!plCgsCfw-d}kl>HrTdj`Mk6IXN*$nKKt!R8n zPdv2)9yEKkYLN7ojd}NXEU12D5a6nMW8$Q@_co7==l4Om6lzZoyf$-!A882R6NXL| za7mC&NdLf_@z2LArlF{|)>yx-Z#r=@;}_c!ttK#EMn<~Sn?LXhZ)6?9MAhfP%oSG$ zGZWX~eYL%Rf+OEweGNuD6I2<8-yyH#6PoKIbmC!UFlW7gY$$WB?g7E!Wnkr@VZqpj zF~OYILzx?xW~ze?G=sg~ zsO&{aIEj~s{4d{0MR}dsjqrc8v^V$L5wYG2?%+NNRvyuVy&_Ng zU+rm{wAHHVPc{7UJFpAFh(xS6Q2bt9&wF&)$^I?eJH*wA*1~@fJ5>BOChS}Rpz621 zFDsdV%TGQic(I1+_rw4PJZXa40OHaJ;%HC!d_0g}ZwJf{F@ms$t&>|-y^M=!c`#%ij zZn@))WP200nUtqdXBJnaZAs|Rm$i7D*XacHlzp?|sD?i(91Ji=6MjA6el6`i;ohp6 zRa>Nn|7KC*B$NNCCjX`fU5wbWJ$2+hd_N{$)G)v{vI8WPy2|16&mG=N43Ay+(%v@a zxvcLG=tMO0ZU7_GFxyINxn(VH;GW1gy1IsOb)c!EfsNGz8H}U7k?-)`-(ug(>XTu` zg6-SzG1fA!4EP}N2W`S|iov^O4L%2BYp-q-UFGQzHdhU~^FM23Yw<`%W1hEW-Tc&W zS1s2u_}sAuD^dAB{U73Er{u(UZrV|Nj%MJ5exC%C_r->`>F$}Q6}(mqDItcm8^-Z? zn$XR+CE?-A^(?NrL??{I=)BSe@EHS7o#}C^Nfj?{j(inuK4)exM3jb9{K^FCawskG z5fxs=e%MNU(WW+il^j1NH=KsbkdUgF3UKL!_!U*kSC!n_h@B~TN%&@XQwEH--f#S~ z;O{wnJr^y2sLlcIkE0S+2@P29) z;+_mnZ=zD%j*3TjBp}?q&d5w{!l-3;(;FmcTGQIOe2?xrHQM|uYu+YRF5cluzm(@a zmvDJ$^EQ=F*xPwMJdldppYaa%QSYA~_5SKn?~fhz{+pxTV@JI&IO_eTquwt$>iyKC z-uoQ&eo@FuW{0-%zlG;0? z*P2e}1nQzDqWp))UUt$TJMT;!_pwGrBGBIX9y5SWs%szJ<_&Y&IGU{j7_}jdTDDm+ zGZOP4vHuz&TjjAnsB_}23!f3F`<*GkiGKApq0CQ_y2YoOwsp#y02k)+W5i{O&X3l-0D;#L%H$V+@I#Gca2VxMUi&)Ihhyz8gp<5A?R>0)tJkU zuBUp~Il%^O(wdtiJ(@Dy`c@AZgAg8T&~4U{0{iSd0$<~5P-eKKFwKiAv#H)CvoOMzD8FE+ThTCtyvi| zK1`yIO(IexzCZBuaakbRpTYH2W%J<77fF4?UZ)F$dx-I&blM!M`@2sd_p_?=wNQ?q zH;U2e-?VQ8IQitpAR~^u|l*@u}f+Iemw7CZ}VOg`J(!^cE83R^k)jqKeABq zIfO0jWrq%?Y|KmdCoA>vizoX8 zo-uYmGu)BCr$x$HP=PC0bKKx6x=9#Y+UFj@{yj!Xe+tu}!_9 z=gV3{!reGaLtGV7`Nfi;nsy%RDqTSs)lnO1bDRN@Nk6wk(phZQ;!YT;HwI!`MBkAe zTy$v7HP@sszK{~Q>|Fy1)wS;EYBMD+&TIXO23Uy8eVs-N>yho|=qq}MBuUt_6e0G3 zouz)~`dGPyN7A>)0Yz8bpAerXuBzjx$rCu@ud#W~~m!p7XI%NHGagK^m-z!U&ATM*K#%1;`P zHNuHc_T-J`B8+UZA})t*IF@Z9M|^G1PdeWqH8-OU>aX10U`84Bow?QCNsnp1L76L~ zr(#yU(F4OdY(jYSKz^i9o2tIaRz-)KVUB_L^v(+CJK5S~g6}llHu}d_d^*}~``^m9 zRi1`ME>YRZa=vE;jts}qpbpX+oodxQZyttOH5+*-$oU*eR(>zF6qX1{q@Y!MZ$}V8 z9zLn$`ch%6%*C%cH?t>k0yY>hquM(R5mqZWSofg%vas$c5mZy(B!11rGIZY{7yYg} zAEp|NnFJW^SAHl@kUstC>wl?$%%pAMHiiD|;108Dr&5)i4RY1LKk=knvQFW&G%=kf z`eU*u@2y(>ntGD**C@Lg%b5DJzj6=}^kwWx5jPKA(8F_aanJci1V!FX$co=*P8}p? zs2kwEv(9fbL!I%7xNrFQrqRxP(B#(Ms?kwlVqdP<$@%C2q8js=nUCCvCVT%&nvLvV z(mgO?hyF-=veG8!qgR}?Qw!sTY#=fxCDHUorO%e$KPktVdFhRodPwiDx#>$YH*Gg_ z(}!fx-v3g*y2r`JRKxzW={Bc)&F}G{kDiB(&$2xX+n$NLmYbQ0KIm!Hl#;Dxs9?+t zZ$ry0=W&O05F*h@?PPuAqHcd8PX9y?45c^1g`%UHHz_=NU`(WQLCxn@t**HyDOWI` zNF9=$`abqY>bU-B)ml1rI60Axy_+QBH%|UpCjT*3Eh61d>66MD`kaX=finEqsGS`C zLwh&_!M=((Q5sZCb(qTN6LFyv$e5Xz|85D2dON?YYj~)}rGTWOn!;9^yL~b3A z4*Ko0$cC=&k41V5nXE@9RQcOfL?eHy51pB3-Lt0p&}m%To0q!As+p$-AxVaEcLrmI zSz6IkX?b#1?%n=GKI96+Z@Ks#LPf;=k>$X+F{g;@ch^||4W+I zt(tv=vy0>?_Dw(CM4#AWL@I`)Zvpg6zY@k59>ICVk7~e?n^HMEgp@+RpzckU;@qNEt0`dYic&-6c$!Z}d#a z6>X{I(7{FdTHY>eiN8L{{HmbD};UPU;p?A5RiU z-N|wxTDxz39x8XTUy;$kS0w&k5^pL>}(jfMrI$z+2ypbFEf+r&DU=c&QcO zI998i!=y_xR69(okYMEV7J{=EQLIJzJStb?}JvfHZ zmVfFtTc`ao)=30g6Fl9LphgMA-4JI_Ce+O_0^=mR$@*I1d_9Y=P1}fOpTom@JRH&k z2g-YO(kHI_>D5&auki4VK0U|7M|$`t5AW&WFFb74!~Hybs)vO6ipSFqX$)Bp&nF$-|0aWi0DBTn4||);5t310@vz66}UkUsz8Yz z7Se0>Ht3Ro-UPVi|AR*mP@?kXosh2`6kX*f`tzXj59&eXcho19-$f59{|9|i`5)>* z6kDIOVx`@FUwsNE z#lu}1nEDxw+!e*;i{UO(YBaQ)92;?%tD(Z}*K|Tt=<;`-r9gdlgmMc%y9kpqqDH?W z_Nc?kJN&4jZzo6N1G*ul2{*m&e17zO-ALX8sa>mnEB2!FFKyqYe`x#O_lWoSh}2bW z^eKV5g+`#Sn-Rw2eNK9_AOI1$ zd#bo$%|kl$w;VopQtpZD{B{+3TG^AKxi>y;*aShV^{vq$aF4px#92lU%2V$u97oJJ zJy2KsFh~}IMvF2!jRUSTx91N$JIq-t#J${)W_~OcL5s1L%Qp#XQIAs|a&)JHnib)* zwa}A4Z!Hc7t_`1HE$+gVle^V9O&_#rPwW7n;9t(@n}e8Yp@?R?C2P>}Y^Zo6 z-*BWXZ4tI5p)}TT^=!PXi)`WTcod(JL?H73eUJw&x6wA!zA;>5d_hyUmi|TWDHSS9 zA5Y}lK9fu zR|Kut)~oGQ9+LFa{JSN5Yr=-gk@Rzp z_i+$9w$=YqBl%dhZ}L~9Y}J0?Jf&E*37!gKue0P@`Bi(|eWh?&>`}vn&?Cl)Kf2u+ zDE{c@-sq1hv45#G`LSPxVmGGd&o551YU+i>SiSfjki-R9f<&fET4^LDfI zwtkLzt9IUsojh0Ymedb{YUS~glge#D*CSfcA#U<;Tkz#v^X9hT87HRO0=Hgn3$Afm z?zUj2lg@3ye`cFp+!j1nXWrZvOe0S_mjy$T9s-=dhrayJykmN`<}4%2L$_@AHMC=~ z1EU&e7!|rAzBzn~aGcdQq}Uxy^tSZG_A++XXDe&J2kMC_ZF5b=C`@F@5b11PbYiymL z>{X@{9sbZdl^Mj={GD%Y`D5$MXS$$9OZKKV^92}QC-lV6J682a zyW45Ii`}J8Oc%Q$2WKvJCp(1hVz=5!=VJHJEQ2!_yRSGnbFu5<)5UK3oo%uEPbW`d z*H}3^^T?6(ZyWhva_CX?e;qQOnZMaN39!e)I5Hl(TlhQ13YqKK;cOXi+7JEmL5#em zXG&eAsqhDFw`(d)yv+wrgt|MuX1}FwNQQrceeY7Sbjla2c69Gb@x7yde=$JiQNNEC z$lYPhnFS#PW*^f1XEUz})V-L;hozo8CW#Q6p`6h{MTOe%z>hP}3FUqfsC!Nks?srB z>>u=g7m7WioNy>l|Cy{~Y~<`pY{PO*l|~2eusH2^nD?E|yS>wCD)kIzlFcskuNah& z_|wEAGJEqrqU?^$K*&5-%ORCx%|f5cVlCEhEL2{VFp9u0AZV72gmx3yzXeKUNY1CR8_l>N!0Gq4 z#fX2)RKpnN=Irw?Ndc|mWa%8Djcsp8F=smxnU84Qy%eU}j3OYqIz86dntvS^M8>w8 z9GvvVdml-`gD0_*nL1|!3%Gmhm2m$DSH~KuNn81f(xS`7&)SoSG@kGfS{gaiRKdy8 zD0`Nf4F61q%89DiD6+>bNqbP$dN=!T>8K*Y!e<4jjyXjlj7xGw`O_OccytFLqqX@-%nXO z0F6~3&K6n7rd1Q7?a-coSIxrCmKhbvYnj9yx(F=EIroD8+59)YqveLBXMCRq}b1mz)Cgv}r z6XWN7d?v@{{IQgbrFc?-igqQIFE*9z3RAgKD5RX$dIh+JX-N(-C$sxNj0=dN@%eRn z&W5^9lUXWvWSg;cbApl$v5>QvCGmA*_H)>#adgbum!Hw`MCgDPK_-j#H|ha*%I^3W zW4yw_tCo5g4LIf!5H0RV-K4 zjVEG}usvGe%efEUR53su19X#_#uF7(vG!&2(ziDj{xSu2oRU-?TYoh{g7 zMc^2mCyKu?iBkjjJ9Z?QjZ`fUUSu}Yl`7%;Q!+{`eYO2Q`r)5`7k@CqO`z@}Q#2Px z_d;HFhT~!BKG~7{n>O2_ZaVSmYwY>2w#w&8d47a5$Wy}o5$BzZ;3kRqJtS<1D!^b- z;(ce(&@!JSUZ&DbZ?wGsM7}rn;VmP=RLcwt_Odz8!>(~+%X5@bH#m_asKYi$XK$&? zP__{Swf$f^$efJsK8La24x#f#y#_I8kl(Wv^!c(47 z*q=?a+MKUBVqX_)7@vIW=7n@3Nj^EfgKPS5qTUV10OCFSbTN9PP1B=Ua zRG#g*U5VpVdop(@%(ad(d*0Q;ocyEykNMx3%)jYxN&cC%H;_|SjzRq#{{HYRC4;~J zJY#Bi1pc0UfiNn2`KA{9{Q~1l7k}rx<$S%5S&Fe|@ORQyg&m2%GoMu0{~mu2tsvVGhS4Sp-`p>g*U+eJz}Kw!zbI+_(e@S!khh;S=yQLu#55VAcs)x5rqAGHpDxkaog{ST`(@ zuW_x}_)iNonLBa>GyE!2{@?yh8WbK>(eIq_wCU#*mz9>3hx>;si;7D;&Woq4C|p{e zb6wTUl1ZgiQ?Dy7bwfPUZmGJd?7HHzimDQxJ!KWeMP*Yfs=}VaE5}?Kx^DEie9t+< zM-KH=mK04YEuZ2miiD?DRF>XKeih}u=|#mimV`Z3CFSPh^rEV&nH80je5K`+D=Md% zIG!;jValFDShzG?ROXvh6fT-rL~&yZ#`;G33k$~h`c!$w4j=6qGivxH1!Fyd$f>&B8>3@k1oGX)eExnO!xc&ev(Y7r<4msDm|m4vIZ zCY4r_+vK818M(LpM1e#iX6cNQtZ?bHl8T7xR$h)FNXt8DE}B?Yl4TH@1wKm4N}R$< zr%x@Z^h_(dIjg9wtbz{7N@9^hc$-!-t)lXlETJf?yl5KTLJdl@XgILSeX9x=g-fQ< z&B=h9A|;ijCA71oI8s@XrEUTXLR*#)o)xZ)lovZ4l07gxJI9l)f1bdV`pdt|%Wo{N zm|5;~5bg_C_@-A@ge!_G$_CLrT|C1_g+feXqek-PE3NXCSA=~tipokS`RHli@PPj^ z|M0N|m-*DGbf;%#QK{*5eN_jQ((~%0NO`GKjU?^3M4hCs|0!;g)LeXv2-^^w>RnY* zIRgZ{|B~^A5YUw@yiFP>VzT_nrRAokrZ?MWO|*~LJo4_^+x*_nz0Irmjs2Q=haI&A z{4#hS$?p&RPW@(Y^A-Fq;kSj~5`MqocLTpqi2EwP<9JrOL%@FnXOY*}{2t?{a!vwv zcYn=%&*ZtR=f39K`8~jI$Z`9cpVxb@ea#;My8(yro5b%~zP-usBYsct{xvZ9`+?`) z#P6p(_=Wf-`@ZlNhP(i`ua@j=X2&oU)w;FgHv7iYh@7(F%nkKIcP?XQPFKM2&Rr` z;iO2VCOfg?Ta@8&XI`pG=2LY`dGTQ1Efo=8u^C~oWnXwI4Aq^$poN(xo%t#*Y8b30 z0*Cz7HyT~0$Il;7I3M}$tg5hx>Kr{zWPYMa=5zR#=_OUdoy!?OAiUZ6cX^eX5h+)F5dx_2#K`2y zLL-S3(f9KS+t3Y+7k=bY{@~<@DXxf=O)?zIog6AlAa+_+GJ_WX9Q_@YPkDu}s2oAG z(oIoWQe1*01x70?rX>e!l8oEZ@lpA>yr8u{A`4`T5}#x(-?XCX(}e;zr~lrrpX4(I zx^#K82HVf&cEtEPs$MSd_+QuSC;9yUT`#x)kmruN5RhCRIS5hwFT!ZDZikT!~e3dX!`(`4_P|xBLKEhUf&g!TtJT2@jk@{xxxvUHf z`NPQH)59VViH@-EvdFY@!%;M2Os_0u?6UIkO)g;)@-Qzs(|hZv*DMk)DlL~R%^(XG zX-xkl-y)OA%&8)2m_}uZBYab+mIH=|vKXo;E`{(XISlP5yhR;q_~K-wIaUWr`Mq@7 z^fI%EAmuGA+>YLc(yX4X`&l_OI6il)$aE?ylmN@y)A z6E)nTzSVNDWKw_MBCpWHGdr498)MQK~lm4CpEi9QYoK^H7pC?>A-Cc+y z8eKPf)MaBmW{Gd;vcDv9_p>B)=exV0rakNFmR{QV4}vGI zo@Q(#7k+ocbiJSVSg|em$i0&u6g+qShqz7mcphEyk&(N9X}`No@AJ28xKHrx&|;z3 z^Xl!-$cVwyDQn4>g16aTUr!8Ou_@&e!5?e8ZxFokg)WZ?9(w!* z_76OsviqOCP;m3Qmp>HDJNU{If}fSWf39F;!d9JJ@x0T0^GAYL4qdO4y`Cqsx11q3 z$n(jig4LJ4r)>hy@kNcx1z-5?`BMc?U;P|Tj6I$|+`IH0LF=(smk2(%q+MUZ)cGB* z6MS|{w>5$pcGqVF=iOd$j^Ht&spAFzb#l>4!J%1`7Yi=(e>6j|<4qr;|Mz%a@ol(Y z@T|0VcL~O7pSel!lou8o5`XOT8${#65!F+}lypzUQ{b zyeA2+{4RBl;JDS+Ucoh6o;K^~(e{hS>iw%F%jyJgpZ}7Esb}lSA5RnvW_{30@Y~xr z-Yr-X+N7cE8DI2lq2Sw>zA#8I?0Mx8!B4Ya-X!RMZ0p5>@7??UP{C=d*FP%w{db!; z3f^FsYHWLc*it?~@S^!so)m0ca{UK_Raq(df?u56-VD3zLS6o;_jR{-|5$LyO&vxH z{?p&?Ou@9YuFC}H`ns(X?DN9Zae~j)R`>)vZ<_p);6tAmy)D?|;3wA#-oI{3rr>G! zH$E-+{NwL62%a$Xxhn-{cYnUW;NS_bz9{%)+0qq)zUY!~1Q$QI{Evd&K3&{i@Q)jw z2@B?qc=s#8f6v_TXTe@)e3&8_J^rIA!DG7?eHM-21;6ZgW4YjrlQta|+;;ZHnBY~nevl^k=EWaR5vK=6aJ zyT30OI;qRQ1@~Rt{(QmfZ%y$FuG)3|R>8}+PI+8#*MjmK!CRJi%_XLPt+@5=@+eNC`$*H@nv{OwiG zpDmbj!*de^|K9vwy`h3 z@T03XZxNi_b!(pB?!oV0AUNi!SNW2TEWrzwb$wp&FAKV@5ZhpPnRyV_+5Cja?!PBPe&RyIlR z1>emy<8|)euew6-4Zrt~5=^~o%UZ$U%k^fQ+?CjMNbhfK`Off#Zlhj!LhpsMo-*{e zAS?Qy-rwnczZvhB9$SC0-qTLsV%oiN`gb?${kQ&Irk^f<@2UQJ@44dzgU|O~xWBjF ze_s%H%rHyZjZ{c-vXy+3thj-jJnSDoe4d%w<|4Bbx~s7uzEkIuiy@P}tRU9(2- zH;tYCjbL`kjo%6G|Mskx1sB)n{8cdWo8E@c4S2ZIBE5hA%0q^qEsfXo(EBZ){G*TH zz+KM{5p2HY+bY3jfy51hcbxQ^;Y&l#`eeM`JB+$zw_yIPiMHUptWouXYkH6UP|$l< zuX_aZUhWYWj3!S1n_&Hxfy)KEzxMDz!O(XvpDMWU@4xRN`1bGP#|d`!yg5NIkn>)F zVBN$+<$|w|**;Tn>@_bN`tDWs@FRNPJk0n2@!Z$r_rKBm==Q;Hhu^{a1q5|M-d-U;o~o z@uc2&HvS*>-aM|Rf9?OTG)f~W3QZ{(67xS8bk;|it9+4vx3vQE5Mv-A;wp8?Pa*1tDDmm0O z=_oldE^Ij2HaV^bnctKlL#{7KQ6#PGYv+^l-VGMy9n%sYa+7@CLUOdST|FtLW&W1D z?C*V2D^lWr!Rm!^72c$j*`G0py%)I}b9hI(Rf$QsQk#cD2%1 zA?Jr0wIlcHtM?*bXo#4Q$|7;+NE^ejL~^TB%0}{@O~y8|6 zOvzWWCPylTJQ}5uNqUtU?j?0=b=Q&~LcDH~CoKIRkbdg+jbuMviwd&BsML*2l)AQ( zbhfRwC40EmPbOd2r-_k=@{-j__h`HU9-)(%(1*-QxmHPjPbh6BhuyA!OfGA#E+lij zl2?(5^;}Jr$jXqU81k@X z&KA;5J^B#YOE>ZYS)NnyncN>$^p12YZN5Zm)mD{|7bkMv+T{o9B=jUarr{2D{K}bEc`0hQuz!7fGb?~~%IvN| z3%taZ|lZ{`mio-GWH{Dw*Ed&@Q%pvVm;@5@B&h7nxO|d z*tlNsL3-sW!E;j;A7?IiJFe$QT3@blARiVVaV1|}aB(5ex9QslazU!IfLAEsnLeaJ~nI` z`Le_EspO;3Tx+s==u11Y%tlj~4s9K5E6B`%Z{_62!qk^!$>E?^t9>(hisWUSC6R9-QqK@2QF4I6B)GPQxHtmf1 zM&4<$`bs+3FDW5s4mtmXl;804DLM3&$ulzNOF${PF(JK-yx;xH3-a~EA{%qN`~q_y-tod zQ@cUlo-s3z{4rwZ74pEE2bam6)k>Ghqo*bpkO|ke+#;_p%fCt1Daq!O3#G=~CP({3 z+#x$ZxKv2$pA)-Fn#G)oCWC+aY$f}R(%VLM>Rq#)+-q_qhCFWT5=(x5+hZqrZB_XW zvhhYv0$F%6G@guUZ@ib>AJVjs)b`7WBil;^?;*E~wz6?Z#Ee)m0eoLs)-T?#o-xz8z5`Gns| zvgh@aCrGu`bxEYbyMaf@#nTrZBF#-R50h8>G$xYuqlfJ$k2NnpNbZZxJwO%(UCkih zbdo$n<|dh)B{$qzlS#IFb|;M-o~n>eIw_1#C8xV?JWYD^D9$G5TdJHVCBNEak%oJt z&yi;$OLNGua*Ye*(|L9m$q$3#a>+m8>YgKPxACTo@cVx}m7&brX2v=R<1pY;=@8b> z=X>=e&lwjB<6GPNjIjSkT1l_qa+mT8ex&F+(PA>|;^PVAizf>{lLLdx%E=ju&a=pb znVqJRP5loG^F)UP#U|DPjVDHtH!m#{ygQk6!=3eL>A*##j^ABjfA(K_QrI6=)RgqO z{72>?Q!>6tO&I51)rFl|kJ=I>Jl`iYuM5vx{lOZvOjN^5v)5!hW$ydR% zrjc?_KA4dn7p)t~{f&B`$g2slmZWa~9(JVF%=nk&SHJNq$?ei#ZjdXI%pQ?ymwx(? zQ;HG>lX{t2QRFqXm;^F$rEV{>)3|0~zgVtmF2;J>mIg)gTeYRIzmJ^NLGW>w=}|2% zKfASyA^G6je!;T^g^N3|RycY~*xxIpRtoz~xWg4mF2C=eIFHO!)u$tkJKP8?{h=kk(`v6CCtlT;{3+2-rDj& zczp<+>L$F-s1JEMgUcuPIww!|Hj@y%xn6r(@bBRIb{bsX`Sdek9#~oIK9qIzlKXmO zLpNVxerxkhXEo7*}(om|g9qY2Ale?1V3+n{m-Tpk>78GJs?#*j4qRb z3XvgX!4UgOGG%JTT+*z?b_&@uuKFt(w0@&7KXt4f(vfwe*&1JeKHQ0vu~_$%d{Z;vCb?$w zW`FWw{DUZm{jUtOoBc6xlZdfDbdMmGU*Un{Ds_n&*=^M?riCNa@uB@JaR})#!|Ax zLd1j2>7G+WzBMdcPi~pv+@Ey({(Tk*!@0pXNjf}JkxqC`r z7qX?#-NU3(#Ij6sVZ{vv@=l53Hu7lh30=}csgp6OwfOKVa*^BhC#0h2QU~%^N?{E#ia9wy1QhQ&Y0(9wRxipX&qwlogCD4 zyE*wZRmXzad0rs27;Eol8$h-Z1_i>Mpk5pnkw#u{(sku5Vn_L`S{)%k>b?zLp zd3McsGR|ar9ob!SjW;>Q(c~d{?C!?vWMT40ZkwdSCiju2-CGRC)?^4kwWsMSz zNMCD>&16zXw+J#X;He4Ox74pMIsV*(9ptCg;xgpUs;pFU*?75wWY>PF>ZGN~{n4cU zY~LT`m9Nig$RpA2)?~Nj)3?c`ciSx_cQ~GNBkLq3O36PFEY)8amyhy}!q49&V||{t zN%>qA#?ya6!xq*x&W8t+@h&@s$07f0z2Ila^Q=Q$UjC@2D;aygMDRl9>?A$bp{dIS z&);O}3qEYU*d?0FyJRZ5kPA+0ekSYB1z3{dx#q&->-_ZL3f4X^D&LU}4>N?{E9}AA z8?4)V$IT#JypCQXo1MN3o<_Rnzh~V+bgtmNv!r(k>n4Sf&SaFdoZ$O#U(K7WCwVH) zBOf`KSCR+Z0|bvow5hzudZPHlapZluwSqr~+y4H$ba2MeCN3Y97UxYq%gz_}rxQ8f z%~%h3;{A#oTQ+wQ`TVh5A$k1XNMXOyDd~TLwRI`p0)V(#Y`u!SSmfA|?0%*pgPf6m zRf{YXlA*;_0to}4eSUYfk#t|X02m8}u>Hv_-r>sZh7n50BrcI+bTr)S;t zN3vf0++3KqMV|#ovW~m2nM2k-QWWN!fYh}cSWBMG5a#cMiT(H|A!&C4Zh3sp4=1^D`Q$XmS>&(`>$~K^9J~bp@i4ppOL9WlVRLfilbyxnp?g<- z$On%b1m8w`)+}H>$hYJtdD4Bo1^Lt=OL%=4Bd#CBdSII_ugPO=Ckd}BFXWczvz{su zFoNtQW`2y!l~q(E^V?}gkTX3pdXk!cYtzYdZVzS1yN;C!=cBe$B&yfAk-dFi~j@H+G%D@>F1?u+SX$u?(Swj&p&-rr5WeKc+; zx$l1PDN_8IjtUv{yki*o%2`&K+~G1joRsrfU_vfkV0V=6t<5c*GV6|Pj(gk>_K`;=KUhSInA^uSGl?uke$4Z0!Uvk$v5P$hw6*T4G;9n zNyVp2?MU|*6K<2=&z1R+n{#Wwld74yqe+L;n;(&nA0MnH_utzdN*X`OyGmM>eV#_% z%XY6LkL1jBCrvXXUyzn*Mia>=a(Yk6Q*G5Jkw$GMd?n4rmpYJT4z*XvqwZzXNkiYw zwWNh-ZU|Z6n7)b3aSQ8A_Vl}-NKW&3X++*`7rc|qmL1oI>><|i964P=$AG+cet0gK zc0sl`sdvV18#y<9fjF60+>%6Q6crkheM{mul5c4ixwQ*ON#ky zZ%gi#kxVAv$s3uHfl}^kNePje?a7@NC#)e~W-aYNE=$!*A={l*Hzv2;-@J!>{U}$C zT>iW^lazf{)}4%aaQ`7$_weN?(&I&XBiZd~m@m0Hx8oi1>p7h{q~Gb_3Q{d|Trjy_ z+OCRhQTYA-G&jlNw^%EQ%FZRXxW>1TjZP_^q@!2M1G1xc;aD=U?aL)(vE2QSQKy)Q}f0eAXauozIITZPK^*C$-NUJVKr?GLj(g6iaR=ZA)kNA+<`} zFOunQOZ$;m9VcXw_8#hDq^_Ud4)Tm_?hx`yyUqJaJBc!NQeUh#iu@Cu)D6w~{Qx5; zVLbKpZG`>S#rvADAFT*(5T36Yc1aOj&&oXJ26?k2QkuM%mpz_rs;w4&k5>&Pg0Cks ztlDvTMoOsgyv2w8J`cDqPNR^^C*&zxlQtzDZmqBmTAr8G>Ne0nX-m9)1{IYy4LNO(v3 zdEFK~T~BL2y#yaLb?pT2Wu;{Lay?}YV;{22!l<6SZZDNae(<*y=C=kfS7ATM z)~y%zy90)KXLR;k26q-sLW4^lon>O9#qxm1`}Mx@mmvks~c5%&KD)t16M zVSY`01((k%)g3{83i*8=r^YFC4C_2A{dMFsTaD}F4i#Q*6~{~R*=FPst?DrHqH&4f zhjHRHIo92?8-)3ycXKdsw?RdnJ*}@df~LW`Rska!Qf03n?0%a*$MuOn6BS zOuF5j)XiyjAWv#noFdPd776o5f^wKX>j;@NZ!+If`#4!-qw<#g5o#g$`_eVogSCNa z$XC)x+cJ~vBBQ>L6j#&f}G_Ew}t zgSR~CQ(}6DT$m@niLAF%9!lFq5p!OWHwxEs1$Vrby+~keM1$N6Ed0rC#J(ya9l`P54eeuD?BuEUa!`My^Ws${}~9*)@}C2{I<+@o?jnWM2*K)8t?&l{&Jk zuEhXS$`Jqg9%1QUafY<^D*8e$wFomJo$b?t$%3ZhDdhc%Dh2X8-T*+B7l%iYr(%>R zkY}T`WXXMr{x`|+Z1W9d8!dYava_+b6lthpdX?-gFTa*_w~8A@hT0~#A*Y8lT_Ptr z6|5##8(-^2#%VRoBh%%R_L0X_VxE()ZSfWW#7`?jJF?ixX%~4n#O4V(zQRhCoZ1vR zgIrduzms&jt?`i5kBV$h4vNX1Ms~}tjwU4&ONz*Oq4n>{ajtnMNpH(&UviO6q5(Nf z*{GV-l95U#rL}DrkV>YmdSpyeNF})?$MP_FC|cc(yb$@j|N6Ngr=0b>qNx4krRGv6 zvZSh3i|mk7ae5FUaz;3J(GX;Nqf~A{$j18KPR8ma+*Ae z?2*`O8L3&dOPE)>YuBr=)?IR@H>r2NRPdyct% z9&mBF@QSrtk2dE?_i|5RezPnt&}2PcWxpyp(WcuJazgZ?5YnpDS@3d-hD-tLNp_jr z$jNap1m7*L?v7(UPV&pZ5C z(+7$PuM0C5<(ROZk@;ALv}wGwiJUg10S+tu=*;p{98aK`7*WeBl#-ma0yv8;`jT= z-~1}^V*NVHeE?axR8E4d)tO*Seyr3~Am1N|pFw_bXmBK}4PI7~H6PYLAm1G~iX`89 z&b>f3x6k@S{=9ep2Kg)2JDzNr{`>FFrp}6eS^s#lRGs`De{~euI5%YxSuav!Nq)`? zTS3*MlK4ju+ve>KL6Y_DgTP^vp_Q_fDk$&20vdHO>IC(Ge?m+TE zmHz_rzIJDO^4h##isaS3J9?4VpX!E^H`L6=lX){|+$OK=9Pxv^{9w%i@{&^ZPO@O~ zsiWkrE!PsroB7MGllihrb>!_aQVYpD5k8~I!b=Z2lXu0=>66i?V$8^`K0kxWZF-~n zk=tu}cOqksnCvBEU2Kn&JA1tSOztROb&X8OxzR|*hn_4X_Zqj4A@??h+g{Itnk z!4mDsJ%-s6$ldk#R*+E}2KOg7O`I=9ZkDT6ZkP4snpyG}$yHrXSCOlqKfOnWZ@+CzuC+emOs-Q^8%9Pv3X~(0Ult{jM>WsK zlE>V{?~=z4`F9p6a7Kkv!>lLYX{q@_J7)scy9zd1T-_1M<+K>5Iw3nWpAs zVq>4H&b)5n~#wPa%1rFq^3fe9?BFvS*KPM&$@GAwcyo(pe@3@ar(OE z2`-mjIxe3~9B|5nRNH)W4%v3NyRcuSt;1UY5C&6?h5a!0{d{2@*3SO)lFLWFj$KE( zMywO|vlqk4h3C0&in0&*C=>m8Ji&N zCw4vh>vFx9@iVQ+mE--sk~h9cZzms_B?;d6{JbRWcY_mtzfV0%D^riRC&Z`;UiQ*m znaKKl^Ekm{F>_5}KUQqmvW?4+T2_A}_jH&wlGHkCI*T;yvh^&vVgI)WWQWCt3&<0< zjw+D3E2Sz($tw=w7TnV=H zA`9dc4v;~q9ydrw@f&@}lB~o@D(h?yYWQw1Me*vd{Kef*)tb zIM}jo*C-|U)OGUFGS)}x3eS_jww1jnE&62%zS{0lb!Yv)m%kVp@X0cp%%5aXNn|!*?LWaCKpymzfzj^Z-viFDhhvZi4@2TXP${F*?VY3W}kx5%* z!pLp|eXB^hh|AJs#;_wkeL!`vdh|8qv_&x^YsV`F|kOO)wt|ueom14*^z1$_F zW^73pa!Et}MDmj5@Bb%szghGW>jma+hskd-^E5~+-Jv0*eL_qu`C6;)GdbC-lLYyt zIMjiB<8*H`IluJmJ2FpZ^E7g4M$Hh?L&TzlEW#TA$n|B0Z^{17Gq#XD9)EWvcQ1$+ zC#CQP0P>>fhNMM^2v3#MWn-0QAIMaFy$9{D=2>tIrC6m53*J*W*pgka%eI+R%zaCa`EJk zlH}dG4bJ5AF*;GCOQU%;`Q0GInl#_ubr5Nzllqi=xBKx$GX4AY8d7%b{!L`3Px4OW z{z;xv;sg^K@}Z?$z-E`cS)tl z@yE$Frd4Cf?6B3E_i% zDO`$q2WONusbE2R@|R0{$}YyKU|Z@F;G*uREG#FT=+8N&m;2-)cnWxK_Na)e%?WRdPT~w ze{DH^4cF2@l25MwCckgI@_)W({nsqQ?TJX?j{fE!MF~+6RS8ki_7X}W>Jp-gN)i$x zog_rXRV2(sx=4tcDN3{vQIilA>mboxL_jG*p&W6zL!xB%&;Z z-A&pb*&jRaB@sm_Xd~@_)I^;Ka{X0EGt}j{9n+8WETkIhts?EE@Ny)*1Zj-ANJL2r z)1kBnvN!6}Ant(wE*}~sGs2XQN{P(NNCCbN+aD4xd}N5btATKgYWSY zA+3y`e-J+()3S6RasY0>ik}bNr7Y_da^7)KJPC(s&?JfJ%g8Q+H@O;A6_&sWFyn5v}vq0Ry2k(-fI zQ2!M9J^px!kXFL)AJ#hl0jLdedmiqej~6eA(wK&24uGOaOr6r^s9)lCKAzdgPN=uF zj(-ShOrJ9MTgTrMbsyB2Vx{?bHz3EO{*3K8p3{*kB8t*tqQA!X+_ z*so>Ig4~}rA}6B$itYLP%tWgG)A-}1Q+fz)zuP+g?x=gAP67Gz)*;8C{)p}Qe9lM0 zTbcOQ@n4DB6m@Cq_~Ru|+5mMf$o**x(hBvj*75&4|1abIIsOhvO{~8k6hW>+nxU@1 z?HvDENHx^at>eE0wK3{@t>f>3x;N@nkmI!;X^FZH+jIQ?&j0+@@pr*G+E_ms>J@0QWQUmp_*70ACdIai{*75g7-52#aupM#}auVwA*q-D0cm7{%9e*dR(*x@t z2E~wTkfTt)#`YW!J7j0nJ6p$pDe7UUAGMDE0@S*wGeAC{k;ns9&^>zc1>3s4sx>$j!(psGI+d|5tGT ze7ugx?pXgID2iN-G)MgkxAXDLMs`BI{V)DMXdQn~+};Pbr-OXF8<68s*JFE*=im8X z&^rFESf?k}KMwNwT8kWu`W?3C_}e49px)Cu{wq+AME$IF{C!aCqs|89kWt9VsDEI4 zj{o2Jf1`E$ow1G<)=vVtei(8z>NnV)<39(fjykq={Fk8~j=H#Y{Jl`?q0R(lksFZ{ zQGdhs{C)n;|H9VscgH%tu>L8KKW`m!9O_zZ&*$@x{|T+*|HuEb*75hlItEz(BB+4e zg0w>2BBCgwB%FYi7Lmeks@tkE8W~^7rGwl=OEo_3hV|{?%VwE+Ko@fXJd+9G88< zwbef3T5HHlFTS>i~RIKY?h2y?TY*U77l$C#Nkw!hP0@q`E zhi#E&Z?OKWuPqMvUJ?A~$MT=!JNo^1^ZS2}@BVXq$NAV5*%R~8F_81&TI5*N|2e+< z*ZKWF$9Mnw_uYSv@Ba1gy9@BWnXSd}-jT3%<vcpz_~Xh{%XN7Hh({y zyF_Xt(Q(5wCL-d1T!p-Z#1km8>i^FjaNE}S>*jcc6&?frk`NvT{=yR;3uX@C@pJ(B znD7_1@VI(|d~EoOUU+=y76^~gA6$h@L|#IcBmYZ?inS4!kd%^^mXT@OR#vthLJlF1 zP(UcQhEi)Nw?_Nc=DG{G zjkbRY*}nvzum3LiT>f{#=lOpU9Hak9V2@H#R&L*(!^olgGhBa$>951{*Wvg#Pk-nC z{^?g&*Z3bsm;Yh#f7&P_rIBh#&V(J1?T{KsF{Cn*e|L9AN+LTV<&j;HqDUpA46+lF zUn)pBWEW%`WP7A6QXMIUR7L)YcKFGgkdu(Nk$sUTklx7mNDbs(>3AipEI=d4AJMP5VpL>@-EB3~m_kUNpn zk&lprkr~KE$S+7aWE65T@(xlTc@pV^{DAC&+=sMBzCeydUO=uuHY3~PH)t;^BeEUb z4%&b=-~;dhI1n5Nri1BV5Eum3gY}>+C<|@`H-ZzviC_U(0P2By;BoLc=mmO#@4$DU zI;alr0r!A&z&YSE@EJH991doK+2As88TbSI0kW$l1+D|vf#bk&;0^Ew*bD3hCV@$y zJLnF+0pEbCpeh&(#)31!nP4$k3=RQ@fSF(>7z_r3-@tF60;m9P0k?owpcPmM7J>$# z0eA{L1^R)0U@ce+b_2VC319*^ADj=Cfn}g6XbN5gFM=z$ntN zv!yT>Nr_BF_DA|7+4r+V_C|Uj)sVB0#>gc|apV}JHqr&z0cndIgj|ShgL?==jz(TV zY9S9IosqAQnElbRl#y&JAuHaljhvXgDEg28i}B~UipMhlH^F0}KgUCVw*7Nl#$z+i zoPUmwc$~)j{d1heV>UjcOdc~a(ajZ-$8t<`GlT^Guj0?+`9nUYe@;HOe@;Hef6hOT z_Ye6)eewAqIGc?RTJ+v)&(0O=_^VaWxOU za!9pv%)DO13cQXFuN%9s+woaVC$_hFHF0`Vf6cExi%&)`zP-NZB(X0)i(gw67wBGF zHD<8RmV-_i3cp zOMNarojq-*epv3q2i+IW>f>2He$37M%?mcoG6x&D*e z3C;X7!|tw7n^5Mw#<25ihk@3yV^`WZl?S_|hNpOCYb37zwL?$(`z#Mj|4z+gx2*Fn z-I3Y2Y?{`CpyMyaCI-&j((RS*@#$_-z2Bv^$;&XK4Gp`>_= z%2WsKA90;xYc4##J=$zTaD0jTg;CX~*Kgb)Wjv?Tn`a+yhKy^we1DC?sO9-x!y7p! zVG*ljEI;TCIN`69wWM_sw>ON z$;h9)vGMb{qi6MRCU@kY5&ktvv>ngKuJvS^?TUunSi6rcTlZcH?Y z?^54C?fLs@5pqSZE(d#eOxN3W&Of=ya)(k6mzr@`H~l=?+4NK5lfElv)NUQvn`6jF8Ouf)+Qs_hjE3gzZ~gZy7aKl=FF#uE}k^4+&8SR+_oiC_uQVpz{w)iHm`lu z*Xpb%TjzZn+V9J$D{FFB*(WUDUgVjq|Hv<0xo6?3UOEPMDfnI$@R z8q{X{ie~P9e{{E1n5*y3s?e&IW735=-K(lqYD@OKIe*v4Z^A>Fgtw2EpYC%i?U13N zmZ@(49fz-9ayu}1NY0dnM{ce8dAew8xyqBIffM4y>%KjGZ!SOe&Ps!?(W+68Coi6S zx^}ef^8&AQ>DaF4 z%bbnlNAxz|Dc2GpdUR-MdOPX8m1mx8y*$IkF}z@z|JebL7S8py95pkm2>MTj{x;D6 z3iOYG{sqv#4*DO5{@bDdbm;#T`bR_mp3wg%^e=|~tDyfD=szC%yF>pt=wAW-#h|}3 z^gjswuS5Sg(0?cNe+T`aLVtbe{{Z^;f&OEl{{ra01p0eH{}<5zEc91}{%+9!4D?rn z{%fGW1N0vY{mY?$IP}+m{yU)mEa=|}`mcljnb2Pg`oDz!GoimO^p}GEZJ_^d=zkdc ze}?{P(EmL2p9}r`l|F+QoHS`}1{kuSaS?GTf`k#aTH=+Mp=syYiXG8yH=$`=nbD;k<=syVhFNXfl zp}z<8cZUAApuZyYH-r9~(0>K=Z-o9z(BB98PlW#U(EmO3FM|Hw(0>>7Z-V|kp#N3q z-x>Npf&R77{|5BG4E=vWep9Qe;w$52>Mq-e>v#C2l_if|2*hl4gKdq|1Z!# z7y2)U{>jik9r_Q4{z=f^7y2)Q{xZb7A@uJL{VzfPA<+K_^gj*#RiOU_=>HA+%R_$y=pP0BCqsW*=wAl?UqOF$=${4s zS3-Yr=x-1GgP?yu=x+!8r$PUL(7!$O-vs@aLjTRse*^UY2>k~`{}0fA1oWQ`{Y{~N z2=u=Q{og|WInciY^pAl4tD(OM^zRG(=R^NM=-&?dZ-oBl&_4kBmqP!&(0?oRcZB}_ z(0?KH9|irBpua2hKLq{fL4PmkKNkAWg8prwe-rfgf&Po3|0L*N4E+nB{}||h5c=Ce ze|6|D5B)De|3%RM6ZDUT{@CG>BA{<+ZK3Htwn{x;BmI`prA z{_mjwd+1*a{S%ujye+~L;LjQ@-zcchd5B+tae>wD5h5mBT{|59w3jLFze<$cK1^r(@e+THV z1O2~1|KZR-6#Dmp{@0=ZPv~C<{hveswa~u@^jCuZ+R%R_^dA8I_d|aJ=-(guPlNui zpnpf`e-8RvLVp+NzX|%ALjS(de=GE#0{!nn{{zrp7W%J-{-w}=GxWa*{r5rtZP5QV z^tXWi?V*1b^#2C^PeK1x(0@Dh*N6Vf(0>>7UjhA{p?@~?UjqHrpnoRx-wpkJp??+h zFNFTp(0>o~H-i2$(0@7fPlNti(0>Q?cZ2>p(Ek?nFM|G0pnn|ne+vDlLjSMO|1tDG z4gDuWe{txa0sYrQ|8CIV8v4J5{)3_aLg;S}{kuT_`_O*|^dATP9ie|a=-&bQkAVKY zpnpE}e+~Upp??|l4}$)8q5lx*e+T*>gZ_Td{~7eJhyGWg{~+jZ2K}!<|DMo)JoMiQ z{Y9aFI`prE{+FSDIP^aY{pUjenb5xh`kO<4Rp{Rf`X7h>`=Eal^nV5Y`$PZ5(Em2{ z7lZzS4f^Lo|Ao-M z9Qx-&|2*iw8T!wH{^y{71@vDJ{WYQgUFcs1{X0W{Yv^wS{av8H7xZ5Z{iUJ5CG;N) z{Y#<$GUy)!{U<{IZqR=^^nVBaGob%9=syJd_lEu#p?@3b-x2y3LjMrxF9rQQq5o6p zF9H1rLH{GrzaR9khyIb!|10zlgZ>WCKLGmsLjUg2{{{3nf&Nv{-xm5`h5nMze=78k zgZ>wwzZvu|f&SIde*^UI1pRM9|K-qs6!Z_L|ImLG^w)#_O3>d9`pZNAwa`BW`s+h~ z1?WE)`p<#>M$o@4^q&d+KSKXK(Ek$je-8bFp}#Wp-wyo~p??qPuMYiXp#Mhbe-`?8 zh5mKWe-ZTG1^rh-e^KZk2>sol{}1Rt8v1KN{}0f=68alLe`n|)3;nM{{|V4P8~T5T z{(Yc-JoHb4{t?jsGW1V}{{GN^2lTIj{y(ArC+NQd`VWNuw`7W%tG|7Xx&5&A!d z{>9LLKlE>e{_UZEGW2(Z{uTEJN%- z3_u(~WBM~1FlMp)*JT)^4(S*2yn1bNxoPLP?2scD;Lg1j3`9h zMSMb>K~y1v5HW}oh=qtAh&PCnh{1@ph?j`(h#`n-1WyMoLX;tV5#tbb2%cvOK=5== zAH+4p2816X6XAs5d9-5)p0mnD@Z8f+#0-Q9Vj|)?;yxk-p^4ayc!s!y_=Q-4xP!1m zG$6VmULcMl1|rrYc%JYE!Vr;);3-j_CY_Dwg;<4nkC=~eKv*MIB9ak2f0lumfZ%yS zeZ*_TQbYn`J0c&k7g38yM3f_jBPJtK5W0vjh|`Fhh@?c zz`)8mmoDwe%gkJ)(cD~-vVHr=1v)yD?2L@O%}q^1#lC&}Vs-m=*xW&bJQ@xkwjT8Q z^*!mjy6@Wq0$v6|7aK!ECsP#_-FD*Q($j9-*y*aJWiju{m3_U{)cWs_i5a3GA<;Ht z_ih6jDJgj)Wo7L>t5&IxeEG6W=iR$Ip1pcaxs#T*GGWo8x9T!7%JE@gT^9E3JF8#k z&V%&T)s518eV>1{vpe%6F>%h}hszF{nr7X8{(N;aH8teJoH=K67c6*aQBV+7lAG&3ap=&% z(g_oGJe)Ksu6ow2(-R5{*LoEdW$V_~UVDA)m{rFgKR#R=JvyRz^5osq2M%=Gv39Le z;n=Z}ir>H2NQ#MxuU@(G*Qcpd6UU4gvE+P0LeE!6k4~(&wm$Id;6eLKW@f7*w``F( zxow+i&c1!!Esc%+#lL*1E6d4ozI^s<@S>+rPdRt*KB~W>qGsoome=z2_02x_?_ZpB z=g#U5?b@jgZr@(V;Qjk674zrk9*B({e0$88^+Q!v`^~(1b^GU}r0HuyLw}ANIdbU< z7nhrF?CsC%b?P)=XHZa8qJzVwxYesW-LtZaU-|s`LAM?~#)RtX+8*D!b$HnN^|H4t zEH?G|`0>VrtSqk)9Xj+5DJ@NUId5K07g^bki=RC^IlR35*^B`LT&4^gwyC2$LHy$s3=jFM~_nPPnoi}JUMy%8E@|=O*3YkkZNeC@A>v^;VDgf*zkYMIH8hOtjvSeJ+9EJwW_NN zmcMwhfA7MD)!n;wGkGy_V$Aak7aSutZj@Ua8L6<<-@km6iOKS-85se`+}v(Iv9#PO z(WZ^0=-02`l;!0$4mvvK%^y5?!S|UnQ;N==^Nfy&P@Q%8@~&Q8x(quPAK%NkqN1dI zW8=H@xH!FmN=iMlJw5OHmy{%L*t}UPX~&L%XZP&U@6omEh;8fEsc6>JBpAz?mcyBS=r$&n>Mv++`oVJstp@tRORG4KfQR-)v&6n`1+_(;aMIYMOVzt*PPz9 zt52}LzMYbSLf3-Rr=x+!8&7r>-^tXckbD@6&^dAKMrJ?_J=pO|AZJ@s? z^lu0Kr$K*L=syqo_lExap}zw3&w&0i(BBC9?}7d!p}!9F_k{j;pnn4NSBL)b(0?KH z?+5+$p?@0m{|NnmK>x4Me=_uUg#LG-|1#)r0{sJ^e=PL>0{uPcKlJYl{T-lxH|T#8 z`hS4_xzOJN`jI|1$Jn1pS?%e}CxT z8T!jZe;?>S3Ho<{{)3^v0ranc{s*A{ZRkG~`s0{o`e*3B2KtYK{wJXS8|beG{dYqD zMCcy}{qI5lmC)Y}`iDaQ&(0@7f z-wXY_L;n}h|2g!Jfc|Tt|5oTf3i@A#{>PyI6X-7i{Y9a_GW0(P{pUmf@6f*p`bR_m zSWzajL$4*j#B{}t$e8u|xAen%{zc}>20sXb0{}t%32K{58zXbH(4gIB{zcTb+1^r(_|98;8 z7xYhq{)?c$4D=6!{(Yf;XXvjE{e7Xo9rRCx{?nlUaOnRS`lmzxKG6Ra^f!S1;n3d( z`ri}$zufl&^w)&`KcRmr^q&L$7eN04=${MyheH1e(0>y2p9TF3p??wduZ8}{p#Kl( zKN|W^hW-Pg|61rj7W#jO{$kL7CG?*P{YOCm1n7Sh`ddT)gV5g$`fq{$+o1nG=x+@D zzd-*S=zkXaKZX9?p}!*ZZ-M^x(EmR4zXSc-LI3v9|2_1d5B+1I{}|}63jMD_|0L)i z3jIeye;4R)5B)nq{~+k^0R2}(e=F$!9QyZw{<_eAEA(Fv{VkyXN9dmg{X0PaQs_Sq z`pZK9XVAYK`VWBq!=Qg#=szC%OG1Bb=sy?w=RyAm(EkMVcY^-W(0?cNuY~>~(Ekne zzX|<^Kz|?T9|ip%LH{YxKNQ?-vj--LjQHp zzXtl>h5pl_e{bkt2K_fd|NYQ^1N4`J{uiNt74#nk{XL++IrQHJ{q>>00`xx({cWLt zHuUcZ{hguza_Aon{g*-i&(Pls`ujouYtX+x^cRKx?$BQk`u~Fd#nAsa^j{49Z$bYx z&_5sguYmqd(0?}c9|!$ELI0D`{~`200R2xv|Gm)v5cCg({+FPCCiHKH{@bCy4)iyI z{-)6X8}z>o{Rct+!_faV^sj^d0nq;m^f!e5D$rjX`rm;5TG0Or^jCxaG0Q8 zp?@Ff{|fpWK>u*)Zv*`W|Dpc}=&uR=e?tFM=sySgFM$39&_5UY4~6~{p#LQ3KMVR7 zLjNM@Ukm+@LH{4ne>C);4E+Z}|FzJ6EcE{l{l%dFO6Wfo`j3GA3DEy2^tXoo2cf?i z^xp#gw?Y4X(BByPe}Vov(Elv-e+vD(Lw`l+-va&Xq5pm8e+T-vgZ}NI|9j{^ANt2a z|1r>C75ZO={z=e36#9>Z{w~np9{P8J{z1^+0s60o{#MZcIrQ%V{dJ-LR_MPT`ddK% zkI+90`gef-rO(0?xU&x8ICp#KTz?*#p$ zq5n?kUkUv~p#K}_e-ru-f&M(IX%`oDnw3!#5E=sywqUx5A_p?@Uw_lN!_&_4tE zyFq_T=-&qVe}(??(BBdI4~G6Tq5nDP9|8R@L;o(&KOXv5K>tSQ9|!%FpuZ>dFM zq5lr(zX$qvh5qZHe+~4%3;m}<|K8BQ4Ek?^{`;Z-2Iwyb{VziQD(F87`g=fsbLhVd z`s+h~1?Ybo`rAVPZ0O&SJpuOc*fU@sj=diCh1hpt4~G3f_KesQVxNIM6!!kuuVQbF z{U-MP*wbJ?fxS8QN!Zt6uZX=M_R!dWV;_or5BAg8cVkb6y&d+<*cV~Hg1txfuh{ou zzm5Gv_9EFsVV?*sq5$^G*qdQrjeQUHYS=GiPmsMK_N3S=WABH(9QJS6vtciay%hFv z*c)UYioH+vRM{qcz%Dxc$ne6AWr^fyr`#|h#v7gF5Df>X|MX`UzJ|FvM?B%h? zgcjpe_JP<-V$X`bC-!F9qhSjD%p!<--mrH_Ga0`WuJ__F!qAj z6a3TDV$YAgTK1OMuVv4Yy(RWz*&}5SlzlGt|Iq$&U{9ERL-q{W17!b-eNFb#*!N@) zmwik2pxFCmPn5k}_T||7V&9j2NcKC~qh(){{af~2*$ZYbls!iF0NJZ#FPJ@1_W0Ou zWRHyfMfP^tTV)@cy#8ki9`{#KGT;#jZ)5rDqUE@*X`e#!Y1>#+uo`DM&IeO#mpZw4K zn$C{i-md=-dv5~YRC48w-d?hituxt^PNJkkdPzff)7?pjq|-LoV89z**ui+W@rri? zW;&T9GnvUZli4$0GV_gOEf%tbgk;&Wg^+E@pvA%h31pDK0t+M%2q7fPtnXi?E8EcB z$;`{|&F{Sz%05-6PMtb+>eQ*ai|(ykw)9(^x8LS`E48GdsinN^TTFRJiQ)= z&TeSQF0aHBp>5?ayvWpZe#~iTsVZ+;O5XYh;r9jF!{y5pUHnnOkCW&Nq;65m%h=4R zz8TM<5zk`9>+w)*b$!eBhqZZBaI%g6d+l$eyB*}$R%4HZ|C$m>OSd&tmo4Z>Y6%|CEiP?Y z-GqI+mM_n*u4}Euc39;Nt<71$svB!NUwBWqUrJi*Jtg1yz!KD1Xq^`m_MW#9HsNZi zF6BI;9;%pvE-dM-u&M8-}=GwAO7fV za%e%IZ(WhM&OWy2*^aCcQ-Y+w6?W(bnYQ?5-NT7m3d7PEk8&oG}p*HZ=$8Sf+X_v6J&ivc!GHv z_|te}5-D9Q>C#CJMroAzG#CgEsX&Vo1|?+xkO|OoQit*qS%jC=BMqS)0u)DtYP4Na z0=Wr&s1Q;y(H61^ok%<6pU6n)nb4WmO|(boq@32FI1xgD)FV11+9voDoOhpjmr49F zz`^kh!$Hhpo_Uu8I&h?f2LPP@E#Lv2@S-kC5`ki@EYzp+5@m#!U{n^BPiqif(jGG> zhi#AW5<31kz`#dz0WZS4BqF+zn5|3ltPBo|qYMlP@3OoJI*|j)GjzKl=E*0?aS;bc zq)*agB)0e`|_D7?!M z;~>wx3oik1Kp+7$0zV-@3E;yY<)P&yBK(9(LZU7iw4V^1P=M1?l5*x{5gL)hETDls z5kO1UOUikI@Ka=`Tyl1EC~U^pa&Jf!bZdJ<<42>vc&5)g9`BTp+nK{uU(F_;z9 zWKiQ+NI@?HAhR-CHlP#u!(5}CA(gzms;JFFf_SwtVmOG&)=j~Y({e>ySrprsHY zFkK31mU;RaTJ{WZ@Bk-9Wl{(SDI+;jht`H1A`A2cFJ+<;q0RGBxui{$CFCY$Ch9_d zq8+LWtw-x8bR>1q9%+&4jXFdheHY3?B~Du<*z>bgV$dC=9fS7u_u-^?zqj-|U;o0VKK%BZOBR3a^Pl|Cv!DCK z)8rbku+aHVBK5sP?ialN`co-T3E^`oO(jfw2{58(5?D(TcY6qs{lM_z(v>EjYu^)Z zf3JWWyz$}BmWVzS(I0L8)o=dsyOY|?pPIk^+l@cE=a~9J<%)(c{q+}pf2PYeoI3L# z=hpn^o#@{Vy>fkzxT^E-KY!>W@BGuqGr#=!w~D^`?w@b}-&=mY?D;o;Y`uJB=3k$B z@a0#P8G=6h=^g*@QtyTXV>ttFo%k1im%8n4&4u5!JdGz&8#kBj{!7j;wjM9Pw4~?B zukKtdmB}@+XIB+hzmc;4(}k?1j_6dF8KHjF*R=`}?%-?|$WnS;6CX^nKd1zx;{dY+vB5zKqD$ zkqtli^2CSK;m?FO|2F5#2l+pJ=O4cGle#m`9nVTuJo!}jZw`FKrE6$Re`4!j{MoM# zO=s(V{@S-Ms2(^+yFO9a@XNh7Tej<(6#w#tAKq7-d-u&hJGxl(VfSzU={wcOTf)B` zKCw3ZAH&tZoxZp@=dE9?)`j|>L@-ucb3=bw^Ke=4Lq z`sbUEjQm~C+mVk?jV%@}`p4COFLE~g^r@-!rREPe)_-bI<%=(V?(QomR{eZY|MTB5 zeP`QS-~8&*YcCnL+^u^#>%8)x|NXO{d@KK4>A}A#XkJv_bEy4CLyLB`U6Nf}z0@@F zlOMkM)6f0<<)(iqdn%mC^&jCq@#+fgx{9y#{QbYiCmR1|-N>uDf)97EuRZ#uywIsH z`~SiIjJUk;+aLb7Q!jCLZ~Xb2pSm?*A6nM`=Sx!8f3)`dU;nqO ze|tW&J>&VFjNf|uwDLDfx0sB|Pdxhr%U`EnTzkNk-F&gMJ;(gJt=$8MPDL7)R^2@m z+J60~f7i0}l`pPrC>3-xNp5gI*KzD;!5@@;<)cp?{nZO!FMaOz1KqC!hkttRYHcq6 z^POXdX1Zr}-_38jc(Y^o*zbzJbH(=K=gl7((SP&kz%T4yzdAL3s_V>^4txFeKhNok z4mNzT=|JU;4-0>DjA!gBT_pSDtnTUGyz`l_u738jZ+?9DSAW*^^mEbnvoHMPw~wam zm6(@lb*9fR(*4JeGC%pu?+le+Td7|0V~fsV%zSBo`Q6{W_~)C0w@)pXG+2thxM}s; zUwt{PmiQj=JK}T1--xdfKO;Uy{EPS&@hjp}#Gi;S5kDe6MEr;N4)Gh}GsItruMj^W zK0^G1_y+L{;uFLlh%XR7AU;6GpNu^jcQWQ=yvbOTaVBF-#+QsO8CNoj13tVGA3j^$XJkZAY(x6pPHV}qyauCG?zEEVdI#J z>iX*Ds`4_Xw3fbiJD1PT+mN?1GrQn}>XUnv|DEut9CE+=zY~7_?Cb+Q;MK3qKJWm( z`1RQb`@S*zpcilpu#_|VpdP>n;IbsM9LyEaKELxzLJ{f-JdN@WyhtgyuKRu zjj*|8Yh5FGpPFfA_qnWXXsE%K>J`{h9mAHl@{J`~X>ZarKO>b%Ps>=6mY=_b=nEB> zybta5IbvRZ>U$U$&=QPk8R=9aI!O9T1QHVAdxS*V1&Q?h5w3-#1=_v7BrhwCN@J^% z1|A`is!7sAx-BHKiabI}R-JR@pNVH5{1c!TU;sD(nSe5Yeqi>&1Yinq1HfozA3Ou# z0A2;80CE940gZrn0dnyDC!pMzfH&AQnSa0Zci>S0T3C2Lo&uDG0eUti`0sm}^YGGzUQASQydQp1z24?>&%#tOz^;wJ?(alT9juLM# zB;c2qrsDUKE6JVgC3I_vj<@H8uFlIT%q_|xJu(Y(k z0@Ni-ikm8%mo%3*7SlV=gp%m<#^R=WtmDf$8ylKx%a*h^RkswAeJb!XLPd2Yjw` zYZKk`xVF5lyq41r7HqVEEs4nw4T+`}H*<>d^^5BIa?WDf5IxvHyC(9x#Pi=In#{L> zS_|}C&UsI5e6NaZ*O9DGZA!iXg0ly5a3anA0Re3NRSm86Wt;|jNaK(nQW{!YIM~Cv zw7iV;Jt6pmr9riX*_f3Lt+i#GdK~HTD?mN^zq=JC!}cSre^4`!o=_{}J4@Kixt2ZT zLjD|E6|Qh#rpl$9+@^-gCTv$yocNuItp`)I)26D5F&HJ~XbV40kRPI``W*b;#Hnbg zt!==D)0G@}M=Lq$XkN}%XBMR;6k_{~VZqN_7_Bl+MN>oFBh`tQz&+|Ixe}va&uM7F zPdeDro&3VoRKK7LFnn=s^&ZkH+ZlF18=9&iq!ynsA^uhHkbcy@^EyE8qK6q0BST!S z6P@KGbbx=+ZdT)$hPf^-U-alC`B*NQGnBP4X-n1~R2>dXjWwyd1vM8;wvT-*t)c$; zmV{A~T}kRejYK||GDm=kP(L|-iTVEA$8vCP_j@D|^%H%e6Y;r)5*Dl*&vEj|$h1^p zl2XRv3bJg{+O-WOuzq5Ml4HoQGcuWCMiHBnkXPQ))JcYNaT!^5o0oF3Z~|9cNd}*; zEs4p>mg0Ln#l!|!p7BkcSIFv7&S}ASW9F8P7t))W$X92`40sXpk;N$_aU|jae~6C= z{IBp~Dwoza;C!{ABC!rV+ANcU`HI52^124}?}hC0@-p;faVw{!v!%TGMOH7!N&F`F zfr1kHgRiN)zPN6_L3ElflaDrBSdXI_mP9mGj`l0)I?`T6r~V(Z0U3{keOv44$Azf5 z9&RB~PA4Wt@dMRnYPe{~ai0s({Zh>H;RhxH&m`v3#a9f#nNL`^Ibn61P;=_XECm9VCiS0t8O zEN*Gl%{7Ep(OQcm5bIv=HN{fS#$wj>;I7ShmZAZNB;wgk<*-X*acMaoK7s0Va5=cJ zK^bWkQ--(@mLYPf#9kGl42Kzbax0FDbZQbY2_rxqDvnH!`F_*+G`BEzzQ1o#ew@_c zcW-)<)RJIB@5u25-vGd+Axwhj5guY924Z=d;hNPIcY&ysA-?Hbb zxs{QOQDQlGzX>qU_W~J?`Ubjy(sL$Kk*;=S^Zt^UuXR{xsi8@ggbmQeS34HhcF;bO zGa+K{gfTv7Ntv5c)Y?@zu)wj&cr-JM-zZzM_|;{Jh*`Wa!y)wLa}mQ?{7{w@B!T#r zuKD%@7YhsVByC}uEFV}<=NNDzhuqUAA(<{+%HTx&6(%>eAOoBKWo<56k(!^LwkEG= zLwa8Rnw;zfB!)Z@#S~=aqL=}?G$HDbi=UWNh55+SAA0gB+|7R)H}vT*6bVI>s=j~u zAJ_UHU3+C_&dPP)W>&&bxp~=4YT+g(yD$^^tk+1ij6|=K=nWFRNuuwO==&ski$p(Q zGII-FBhfMvy-uPxNc1L&zDJ_(ljtoH{op+cznh}x{O8W8XMUYK@v6M>#z+4urS zX4{s^>aTzOKX#n^v2OqUCw`JT{7r7L_cMRL-u{|mclcw!Tw{7sTpjrGzipoUfu?iz zLqAV9E*6ygKL5{!&Nus7qo4d=S>sEjb=SW3@7q0ZAMU#M)L*O|eXhIo;%EOc|K#h+ z=E%qYW}W4`lA5bu{q5GXKOEY7=Ocf)`snkb%FAE;*NvyY-`_s->A%Z4{>s6I&^P{1 z(fN0d{5hV)!S3Eq;t77hlTSVMbTTD4*%WIa+Bn=XIkkFEcQ zH`A)Xyd&rVNc3hQg?8`|sHOQ6MN3?8w2b^h`b7Z?>- z8<8ZxxPzkwd8Um+4?D~0D#(zFRAyspUiO;o)l7O`UQQl^i{X|fZN*L1rkepskNM`D6VaOxcVH^;?n1tmpKfFgUw<&oF({#WHT!BQ#pGqAj3z-p7R2Wv1e_GcIM238v_;99f<=ld*;wuU%eadLiKrnxe&Uz`DKg)l}Yqo zs5@ztjKj;g6W>Bk-`HViZ!1u_3(SN^Q0vKgLQ8QCPB|Btgvd|CBA9nn6lEazwx%cbqL;4fO_ZLg`PMjOISCNw; z%yxPbIj<$ro%k->&zG8CNK4*>K}kdX4~e}wOO}we17l9uS(`6~yD!?nE*;Ip7m_2t zgv{%=X&bC(kdwobh6enaf_oyggUy`1bVlzZle>$<*+5T^Ur1aRBrl9v))(o$J94+~ z0|PYtJ%LI2%R3JUxBydt-vAl`xeHP~a1Ma*{Te{ZR=fEK{dKq~+w z(`SJ@SiaApoDck;kbaGufPeVUI}iTz|0LkUpoNe>1yBOoSRlOHfZqh)Bp@*&iI|)> zk^O{|dkeFVvC{FKJ5eRiWaGS_Ja*0gz_cj&@id0qhGhz~QuEg(;v#aghx5nL#7MU18RWvo^>%;00ZaKQH|UzFWY zzofCMv$+~daT;;|ByszfL+j>#P(glsabq*#S+s(jozr`2$Z^QsMp~1-8S~zPd`wat zifG*p4Yhbq9XlD*t4`b};xyxyCGNA*VxoH6@8w9YvG^Kv%AAey{06y{#4MoK4T&2m zOUYrmo?Q7ZN*<^g@`Ntn)mN7-d*jVFfqjqUUtRX z5w=@?;YD(Ng8Np4PL{Yba&w8^dLwm7NL;$m`?usaB37UT^YXb9ghfntZb2r43zpUn zwvefBC?Ycx^_%SQe}En^0q_H!IRW1XbPz!PX$Rosod=%)JPY^{U>o3900Te^KB~<7 zN96pTJiGA%KkN0H~bKi%&;JpR7ZtI`#b&V?(g(?f5*rBJ3iju@lSYv$H)6SKi=Q@@&3+#vimzf{=UQG?>jvHzQdpH z_Z=R8-|6x9ogRPR=}-6jPIJ#&W|P;$@Rnd%@}1S@^2)?3+IVYq(fkV#S&27VTdMGS z9C@RjJoQcLJ&&3%;C%u11=r+@-5*>0y(EpiP`9}8We%R2#a;>IH2@Is*d(5aeWR7U z5IFyIG{YpHhGk!%Z6&V+<6+G?S){2NJQqDr`C#dD!ttOfeI9f@poM~(Q%l}3G25b?OU{A`=FRm!ZI|b+{eUl9lUI{NN$4jCOo#dfzXI~^{4M9y_^Ww|NL4y_X6#07%mDCH*mE-lQOb&g?5f3Ck z+Q8hSxU8MP-%htez{9WfU5-CgalT%XlRQg|cY3ic8s6~zL+!0%-&1YH!^KH2DZ`co zA6SuXFRz^CC$A0s7b-t80M!1Am`AAWuqNt2`18+FsRSWX2aB?8#_|g&&Cu1uK%p1y| zc+V0eo~Q^L!+mKHHgovz?wgLyL^_*aAobGsp8THmE+HO0!c9DI|UO!SNLJvgbk{y6S%iZw|f5 zkf^Anx;}xFR$*;zE-xyrrj_15TFc$Y#dG)Et=uB+PHri;j9baA;?{6$xeeS#ZZo%q z+s^Ia?&axb%l6Qu8 zmgnYqc;|TMc~d+u?*i{4Z<^=hUE*El`7t^x=m;6mVt{vrca<09UE^Kng?Kl3Vctz% zgm;S<<;8e2yf|-`cbj*Icb9jMcb}Kio!Y&kdu4Yqw~$*xM?2ZO?1yqm>f`i-EnwrV zHQn{Z4-k$tSBG2RZ;KFo7L;D;UOBVHpMWPiv>Hkc88+JQjVwg?lfN+C(vw5RA(XPzG zFvC3zGtwis9O*e|ky`XUI^^erYy9l^y#r^)C&wA)?twdylOl1C-$$AZV-qszL8)AN zbYgTuDm6?njB#QFF$sJ+Qe1hugC`frS2-AFzkHv(OWsZC2_C6(jjKaf^j|ofK+{kJ}0`mJHS#~Yr( zc##ktPQ{nUh4R(VoMAFuYNb@ocMIJI)iSkQtxyZx^_m7vo#yONt;RV;co@b#)a%a; zuGPne8^bN(*^%Ah+avLj*6^K?<}kx_MrKChkUkzKyelLF%6_(w40A}`;}*G%gG z&6-AyYpO|eYHBz7a(aqk4o`c~kAu*CyH4ugp)1nK{5#>V>*0IZ`gQtTeSR=gpBK#0 z6WLjaXRqI(9y>F9`+9shetibH_HbMH?np;?f8_RPS7c9Qc64uKA7)oZbWPM~V3>R( zsa;R~bGU*t#z=u+`nF* zr^h@7y;yf=R3W9sOg?BAjEAII7T@ZG9jcfXop_P|#A zH0SZHsB=^8nhwogO(!S}W1032U7%Ld`YUz)el>I(@|RN^ZPhc(fd8<6(60ft0<_Jb zYzY=3-b!t^8Sy6l2K^RLHUg3%9r~>etqQFP-N8(8T+0Zp1|@BD#c2BI%F&*%ID8`z-&B|sE z&L-RYe>UxxO5t$~Vs^&Mb6UPDunJOisq4!nKFp8~n8>E7lk3 ziKHF+?HJRY6yFwHhf&)R+^#PQW`{CES)shpy3zHaf>3@aH4$Y29$cen05w+(>I(L)hs#02fJ?#}kekEnI(>8VRoe2s6a zTO-h1o+2gi@aa?2PFURqAR#bxdio@bPa?HqbdLM&{-b`2|CqmCw_De&Gx^Q_Cf&Gy z!f*4pU<4Xc(&lWN|p{=3qp>3hf zp`uVpXlJN6l!6uO{_v(yX-FAXhX=y_WGupcVL8%6;jGbvNL2u=nUTIox`AM;462AG zawO6p(P7kv0E3akk%5RBm=>@zx+7{fY>$>ki!o9b!?x%aq+6rohN7s|P!jEk?T-;T zow2P(ZfuLOE4DAT*|;~h$+!pft{LvkeynDDXNHU&Gy7(`f%9fMXZFkt8uQ|pG3xno zpYal%-zVd1$J#LZyU2<;TQjDb?VBB)9hu!THvT{66Qm~#gP5L&1g03q54bXPb?6Mn z^n||_V}W_CE7$J=Ru`<$GfY{iCa4K#j}F6XBveGpU@43ljd`%fHY0!LicxFy8v{m1 zyafF`z@Fy}(otE1c`wv3%vtI`!67$I;bZ=j{wjT&t{why+JDOLgiqlJ9Ndkz8-oqO zN_|zRB2*5aV3Dy|kxToiAO%j$m7m8*GPG&45k-R^MP# zs5Qu=ILRl%zThtX-ryck_s^B=3e{1|)go>QHH4ax?hZAE>XFs}R*tN|yhs6J6aQM z1II4FaYGZ!TOYLjhG2Odi`wy+Rf{h`cz~8!KYHRtB4sUNMjuJr!P*2heAWs(>I3vmc;nQ@M*b#3YoeWQe z&j33Wc7@$xXV?=y89pA~0{=Z5-a48Ek57hayjCOWE-wTe346- z39iWb$aSPw0T%(G$hpX5Bna$mBoLX3+=#d%nT9hFZ{z}KBy_>!_X2nTSyT|+7ww3O zqWh!W(LK=v(e@}eDvb6-CDBflAB@VQ;;1yr2R+1>4vfZ*#l~VK#=|jX>`<)C zcqFEeX=5ssYGS?M?2DBehmactsAD6D`(r~h#@NxAE;bO;&gf5#m|904cLwuvIDSlwrI9wws>~m?B3aa z)3H6v5uZR{%E7ga_3qw44h>h~7(a6D#>RTz)K8`|RS@f*gn*{<1E z^jYp!2j!t?Bs7J-gf4`=w3np)j(8r*%V+nqT8cF{{SjEEKX^a`pBTLe&f~F4<3!9B z>x7pC01}j_Ldwvg&@`3f4_^*n3j4x4Mq?38^rT@RYL8iF%rgd~X=Y!1Z+s8xFiZr! z9|&e)6_|;{Bi5NNO1%=VnAOZWW^WB;j|9TAkrT1~lrDsw`a)O2w2))cbp&R#kuhU^y+Fn7{3(oGxq z1^kWtLjEdKH$TUeW#aL;{FDUb2v?qyg0uP^`i@R+CeyQn- zP+>`yY~~A5mL@1eSu&)U(m>k^SZ&&d7%MH}bir!DDk}ei;37>8kgt`dQjSzpI)4X$ zJH?Z766y3qIwfevIn5UG%H->Cwukjjt#BX0_2()`6H|#}J*)W{rXq?T;P>*^o1}aR z+m;XVk5YNZdeU(}XD45Vl1l==;4(_C3W-EhkGW@+WHm|?;V``dQ_}0~Q?U$I5-F4O z5AyR&3VuImhxkffa@m3$ zK?d!2xv6r2WpVdTAUEB_De$04W{L<7v1PZwI|B#^6sEYK4^)jwP0N&~D}tb47G>83 z5>r?Z65J3BnFdS;P1mUWUei^YLch6o`sXmVyGW#_3N!BQiEdGQRGPy`(?q!YgfuSP zYQ8I+5$-fsfu{^`n{wR~UKg$wZATvW0xUt{O3^i8R2UPMn0J`(2qVHR=8&-5oG!`` z-4v#XR*7y1OUz@oK`T81s> zdM106mOjhbp5r}g%ZSBfar6vXRF;!H{g%@`gYeZ8s5K67_ZTdmo@1blSy#?*^-TtEYvwaJ`Kv%@j^+SAk5!6W z;uFWETODK4Qxi_9Lu!`VCQgI%*n~;ynm8e~PUul*R5~J^oS2XrrIXUL(vuS|(9TYb zPq@Kp2b=+%03^aOw%t<4M$AE_99NEx62~EVp+ha-?8tMdsumVT9Ln|MW56BNw zo`W=&)A$&Ufje9qT{uesR)myX2i(Wh zYPU^2igbqJ_i21@Dn2FC+?eXsM5g*R zG0<*L$u&~V-KjfMeW-s6l=x6^8Z&-+7Duufz>Vo^)0d`Wz-|v+o{kRP8@e)mb^6ZG z-J$UG_303JNjRX3`$f8_U#yehm=^Q*AfE9# z4TLl}()g$QLmm2}(W~Jgj<%-_F2itCAFVak7$zjG!CbsZK&7iOUxr3gkabRao|TBT4>C8ftKwpMp(~Zma;fJy>LZ6!hWA0;aliQ9tcwC+8UEv+l3~IJqB%CSQRP73F zn)c>&WO}8RP;l;w(Uem!xfULcjzsP7+Z@*B+XP#wEi~#@fxm z#CvAJ)gXz&-{6T<(=_l}AuAaSY|Aa?Rw{QA);I&08IO(6j>pFvp+%$Pnlv;KWIYl+ zaGioy<#We@Ro=t2-$dprcv6U7YmnR~NUws<3xl2dDWT-^%lS6`IJ7ywKqH2^1FdiO z++};Xo7w^6iT3aKb4Duoy9Awr7D#On)C*b#&4OCN9zmU;TF@bA7qkg#h>d8QyJ@^v z&`49-B7AqVun_T9q0zKSm@Ql{ED+`jHww21bA)-q4Z>}6vmW;p&3j>!O3^;^R?&7* ztEiD3d4ajhTqG(M@y%7D4s(mBO|(r^hq5+vGvYEpy{JLdZmt#W0$wB9E#jJY0BaI; zn=3@6!1kC+L_%{puxbDaJ4L*?8Pqw4CCZZVRm&Aij`*4-WSO>Hwp_R5ib;vr;=_31 zXlGetTPM!4-Rrqzx!;p1P8X-5{DLJ-yhfZSzG!hDv)Jq9Y zLKD`G4xZ+gSO)6)Gm6nh> zAK#crg-ra`g}T#nk>i5=ynLVIteoe#ByV%h*|rJoDlNgv?Y851H03tCPr7~TOX_oKx7)8i?zXwD?sIOp+T|X1pI4u9pHZK1 zPrA>77cILlsx5AhdIC8YR{Ux88TXXhtG=v0t1jYAsvVSzaH2o-h~Qx<Pf?Y;P{|`2Yh-EgBq`W>_^?P?$V60lmEuPxA`zIKH#Q#(7I2Yi)pjW)xV0c@o&-M3Dg>bpHX zGfnE(xb7j1P2ZiqgES7v0aqeqvskY7{`4VT3S^Uz9>A>gQa%{==yX6 zI;HNgZe`%UU#q+8AJU}-QUdEC;fQWkpkJq&JL4M*9t-Z(n}SD!#-JhCr5_FM*HgiW zhJz!)J$kNwAEoGVW}Az9Kibe>=t$@=&TEH4I`+O-vc}HQo8d@!g8}Ep;Tz#-I2>M& z8YJA0q~6+WNV&Diuo0z+u*G1Ej^V!08N;OEtib@x6+0cnanIObtT#@^jv0mV1ZUWY zyD0JNG`Ge?XkCJR0$i&IcLtNT?gsdAD%y&zH zIFZBIJ=U5G`x<+?Y!#iky^etVs$Al@BH!n_$@(Z(QS}wI*Nr0*M%xBhOiEH2rGmp=c^kI0%=JYSoRnOLTx;*(FH1ph(So zMKW`*dB2D!5{USseWHUb2dVkquvvT`z1k|q5gw3Y-6Y;9j)HOvaMLnliCH3+yOw*F z+m^Ux12{;yW7#H7wGwO=ToOqkOD7Z(dL;!|TOpCgxHBW!WZMC}(6-sO)wbQX5%>n% zdRv}ND#00|L?+3%ZDV;!y+lx;Y(C`L^0D^j**Ds=k*>GrA}#=Ivagn{l@Y!idm-{9 ztdXq+CYKC4HXzLcWXLkvvIK{Mu8BeU4f(L+pyRM3EI$H@5n!SvdWXuP1!i^}bLboz z$03K%C3i&S{f?OYrd;Y6b@Wj_rDMzy!Fp+RT$6|7Lk_iLo$R`Nz;V=Jag2b&K)G<2 zmrXH7SjP^y#ID;)9Pzk`ZXbAp>X`b1`-VCI{JQ#@I_M6muLHm8 zzDid&oFS@jxToFMK*Mh&G!COA0`Majrj+g82~8n?RcnS%JyfoWR<^ur4!zwN#gl823+fxq%Vgn!q}mBNTz& zigkyt9}jlxEkT~%j9mUm-bgGQ5925vE*>qR_tHy8SKQi4SC*4ACuVLMaem34;1da= zx!GSd=bd+z_b@&;-7ZbFHy^r@u*F1T`GR@2!n)J8*`7)Lau%(*4b}Ypf=2LF3ac=u zw~I*)XaV0j1M8jDOd{TeR_*+g{1g1GCI_D@*bRQ3Ai+uEYT+*ST+)J)9%!dv+bkBZ z#C$9g?-cJ4Z(%)ME$Nf=OH`Oe#kLZ$5^0t!8ye*R##w*7uT;6>bI1EQ#@wTEYj$Cj zwrdSo>Gh#AF~>{|zZ+Wc1$I-dumKtzH;tR>g%hR|CaY<;uu)hitP$FvQ6ea*)#M_z zSz{i6eg{N{DCMB2&#W}dSeuGPy}(rFA#=Z3DpH74qC@6EvxF@rk}Aawuu_gS!`dj$ zx29Rw(G{mcoNg@>XIgWur6^r*T?=X!ph;XUF0keSs~6Xb*H~-BtF5c7yTn!E-QqfN zIe4>Crhygok_Ov=q|#Q3F>SV$ARdy`+H{g(lxZc6wj)S4$l7dWD8c!Qtt$O(E0E=Z zQfkkaZKQmg5O1LvW(b>Zx9?!b5k~`H4#%u~#C6hfiH=-~0%tD3?#pk>uQ@!9Dc~y= zR~#1{cjRd(yX^2$zEh5?j`NN)z$Y9*hud)+*b0T$aouswal&!hVM9I@{AV35$6dJ{ zxq#yy{9)4J1dbJe#sniFMKy#KXTW809d?<4txzTCW3JH!E0Mu<)MY{bqGQ~(+5^2* zHkaC^2gOLaQdMaxtLwOH(A7`#8XD_dT30&c9izD;h=*N$uG{Xodqsar|4PrSJI#~g znQ^c3#N7AX_tp2*chz^?sh(MNYCn!vSf%c}BksHI+v*jbsQZpO9W5^m_1+5_ujZm= zkGIj==B@E|dON)Pysh4InilUg=3brmJmS6HDNTd7$=mMT?X6|kDtL*v&{wS8f4O82(ZIfs@;LIo!Sz*V(s*83=kbQ1PYOE3am$*7uXWW zM{3kwf+vHUkrU~0r#EN|o(ejHLf{iY+;d^ix(e8HqT$f(@SX78 z@HV<`ZAZNF7Hk(iiZdaMX3QOP&WPf;&%m$4no`eq@&$sErY2!CW^cb}K%^G+VWu^U z33s8jRoo)pfZ0KU0lvIlRt}H5fw50ltX72_t1vD;Sf|T-6ncpDr=igfwApCHyffi^ zM9^$%gX9)rtFRsEphyGhTJsQ{&4`P23^gBW@S(6?f8>6D=N-7$rv~Cdrtj z!rpF6(5mc}_EOA*B03v(%1UHqvSQ#BvT{mEaIIC`bc7vi;J+D))rxhBRlsnBa-DFk zQQ2Lm;6v+F4p)Y1t?DH340yyE&)PY^xTLwR+3)phf*P*(nkJyRqPeWOs;SUUxGJ^f z7{4;@_P{ZnD>#YXA~#xu9yh?69q8eFFvDKe_DZT%wjxWBsmN4isZP5>8k4S(zs+=t z-vSF^{+c@3di&=3zK-g$8!}Jxos>(5_3{Wn%dUeiS2k>)$?AMS-^B0XyZEgpkpSzM z=!odBNJlw0Tlb5(;w{!LD%&RMu#HPB602mFtcq$@W3QI&!kF%mMKG#Zl@#l#t#T0G z(D1xf+G_N;*eB7Cghp{@?lJVl*O?}vSu>#B)JC--A%nhhd7a>M3f(TK=sK4u;jnUG%?s^AYL*6r4Aak;hBy3JZ`t+iHKcUlGF3ae0D zY%Q~HwH8@xtRnQN2e8As%gPh;fqhVr*!Z>swr-oi)@9pk!`YEdZ0kfiAraYnkP2=4 zYqhy0(2jZ=Y8Al<~nB$gXr85qWjfxe{ZHjx2 zyN>OO+m6kw3|s@EUW)Uw>$>ZrYrX2cE99DV1zlHM)9~eMu1ko|xo)`Ju7K+d@Gu|` zzH-%-t2TJDf#m`UJq4bXSWVBm@@QEa@GQ@I zmJc%@E27*hLM-zNyi%{i%lGzpyO9rLbr5=QYI?mA?*Zg-R!?JsmHR4vHQFkykEMVT zUoGNYzFpcnUzxAkSL3TdJ`suo6@i_B@&HCVP!%W(R0m1}MS)7>cLhoip9vn+;|d4R ztCu0hY6V|y3f~J8JndHcEv&r;oWo-kJcraw(pZxbV`uclOh`}R?sFov@b?POn9SzB zo+4`TR{jBjSkNONrA9iZS}?L3J#GAUeh2>yW&ze|%=Lpdg28&KPX2Zi!6brSK?ksX z?EJRC)5jpeN@6XBCSZtOvwW&`v;>L!z|FZ3^2Vo62?)d90xJW;@nN zwA?!9SFo946?~ysQL5NE=N*NrbkH`aA{ft&s++C?jCdk!@oe*?_iy!V_H1HDPUW4^ zL@`1!%^|N6;}X&A_BFujb=pQ>y|z|+3uVX!Y67)^dY?Ne*Pjg$>u z2Z;x4hbV^eK(G648k^cSXge+Gl(nMw?e=zAhrL7A2E5O<+PT)b&Y9t?R8%O+6y=IF z=yf7gQCn+#rN>ffu<11;a}%WJkU>q-%91} zwl-Otu^Oty{o+RJ0Be~u5-mJ!k9`mPpc9s;R%AMNDYDq!Z)ZolgpTkLuMT~^gHdeN zw)xDumViQ!9vNNp-VXVPZ8eHpuC*9H5(?Qf3EY!_7UQC`(0ni2sZ*>})+=fiJJ5pO zdsov2+hm%~qmNGWagoD3L3P%O+pTTZA+bh0C~k#p95Ez1+mysDxga?wIWO_DHtLe? zlkH_aImg+cXi_v{)Uuteh<7V;oh^!HU?jv`QFwB(sz|j{HRD>>U*^f|FQvU}ho|DG zs~z^XLzjE#<+)&M;E>)EOu3nHYYoQeJZyW2&Rp~Xnqqc|9MJQE$z?umJ_SpAO;aYm z@TABt>ZW4?Ylu6bw@&Oq>3Q=xb0_V^8RT4|Q>Z&>K5OyV1rztH3%gmRqMKLgaiB zleh=zxb2c;uhlH}ODy7}VyjqW-D8zl4QK;rT~@x8Yc&Et0*}xG=7ZVBwOef0B{rME zc1<#dvZJ)zWDC#{=$2vCoHg2pZG2$3a&Y zgtD;Yh9o2r$m}+e>s4rduWai5}FQLftQJfN6$ zZE*4w0>yqsfwRO}?p!m8v5S^eVPHb}?TyY&P7#$X zRBUxh6h%(HVjIfDiV9V!>JI#F3vykLv`sXqQ8lPiCfE1ZsnRBQtI9pACiDBNRkfPH4`N*#oB*~@YxJfg=kTr^Ohan- z9`Nna)Lt2I-!r}>jmBsNN^m`a>3t*oB(N$uM4pR<;ZK>1LHc8Pox!V`97(( z+qciR*Jsg5e0u^@!3kV@@K9?%z#D|dIxet%0hRtda-D&_fj<37ol<{7*RSsi9A~eX z5^a+BIL;N0F1YJ_Ie08|5jAlX9q|RHgKGVS;HBV1$QrVN%M>yr9uHYUmGmyruF>kz zs?lP@+FK=t)SKrG*65U>#b`E8&R~YkoJEZ5p4ln>K9f>_ehWoH0altG;Th2+)(nO9 zxY#BpJO}Mkg^cyIR#lT{XMb^ji>J-gim^HkYo7A18FV4-^~qop2YNA}-#DVtqtEP7 zKOelJDhWVN~YQ7|jq0RH62x6ZoWWH{`D7s~y z7M&EI6NN#$Y(9%VUKa(;H_cO`3&8!L2FzCwUlUyx1w~iQS4AF?TNFUq?+aeB&f0Hv zi$h|iboww2fa~H*;wiC1tg)UK zJH?m9H^dIxw7AcDM(h!vLwQhqO?*}C69>d+#kbhw)BEdk#+KR}m)w@5^j@;vlPK&8 z*~;G2w)3|8l5@7Rwu?5OZANlOvZ7Zho3hPH(t9V_74oj+kSqqtr)(aZ)8?|dZHMe> zy%;&$1>3YO`g_|dp{Q*=1%owd&WPPxLMP$}9~`<#8C zD-?RgkV2zqbQ%?P&OOdHXTfAXYQA5nah9QE57w()lba_iC)+(;s+!6A$$hGAlXa7| zllxVLlbxz=lygKi{_9?)M}|C)r6u(WVEs7b^&t*=*AMopu6Q%Ca+9!bFbwKh zuixwTUiRh;UiFsHUg3_m_o6p%aL{)UtIiE?$XhTd^~tp|tj*`WQ(lkvg7=&^;>{jZ zXmbY(Al@Y{K~Cx0 zGI>a=@yWqAq8;#M4fboNshmNS>a=?8VXYRJT07)ZYDa-B3@+WIP8_(PJCD`zl+L4* z1kUQ5z}xkl(sQ~&y(l0I;Cu}^FF+9B2ef)w;Eb*p)I>O}NBjCK!61$UM}S`o z27p}+>h+_@`GY$BuzvH1G_Z-DE$$xiCl6A6dxbORuqcET^afzq8Wyj@+Hx6dj~}qQ*Jj7{u*@hM zN16yHF{h3LM9xzRr^1GX%%PY-9!KBFam7K_lNG8%s@BPlNx7M*3ZLKh9^ zW-g(846Bw)aayrwa_?kQf7H8i@DOBO<_`$qgW?e@jvKa&-brY=Z?aF-3_XT@Bh;I2 z1dB#)#Ql&lYK@53pzl}E@1wF4_6fV)eoS`UPFg16tirA6ae5SI6kX6`|D=xgWAor9 zIt#+VNsQLon`>_7+`^p((^^PEt9%VKkO`&q`rx2YF1&8KW{R6{itd8>rZ99kY&GjjtjDcKtub*_d=H%S zA!Lg}_uSsB-k>cEEWdYM?+sga?|Q0B1eDC)xGe{{yxwcJo3@zky6q~c_{GR}i>66g z6Ec&`D#JJfoUnjdb`r4-IUF4jpR$irJjvhdJg<;ArOtDTiwXxg4>)C5ucs7Z=LH4) z5g>xicmTC(P}Q#zO!fdDfUjs&I@M8+a8j%4p5%gd7&Jao5;`$XM?7u)?ftF&2G6KR z@7YT|Xv8x_y==@g?CI!l>EF|DWY?-~7>l@f#vAi)Vb>-iXX~KRcg%N;&iA8Qlh5EY zYsWD9ChaKVqrQOdl5Qw42#?VOREYZkBwWV)p4Rzw%79O&4)h1Kls-V?o52LnQ9Wi? zXiR@5bT+heq<(ZAe726B+pWKq2T!OlU_|~e_TIZKv8L%4-5<@YGv=Ig&RNF^eiy-j z2!aGb5Xmr#2!eos0+NFuA`(p3`LT57PS5k~cb~J*`_JBWU0q#OT^&|+Rduh$grpbP znLbleGdmf07`$z7lePJPh&w-Rpq=k}VIjO<;x`g8N5VN}Z^HuLc~3W4B6~&F*_(#b z0xEu0LCKyyo#9q@etB-#HDVVob{WK}>Bkr{*hR|udHvP-d?O;(*()1X++x1N4bg^h z<7h(wf5a}pA5+KNO&;Nw_s8+$hvUTY<1uIR?l^gz(|Cv1lh>`clS0i4R$8hl&=hMP zbARo2D+4|cf9@?`^R$(ZI!{xg!OFIZG|yYftv9s(9h$N7i_=2jN@^9ggxW$aqh6iX zQ!S^TsQ%Nysq^&mw2A6Ht)*5&$A>uZoZ3%~r?%72;A>EdsE*U?QxjV1s5htP(?)9W zv>5UVs`b=;+5oDQS`O@j#=nPlT?cKHhTFNWLf1$8tZSzg>jr6cy0^1@-LGCny63Z6 zU9YZ(R-$Wx^!2P;*Q4v#wdu-r^|~QiE3KC{No%6DV4NHj>c(jOv`$@~Zh|&U`$UX0 zPOH(C=>}*Wx(4uFv_4&_u8r2JtJZbX8g+aRZ zEdOqef0ZlXr5qF2bb$J&NeO&p5}BfVQj^}q1b1$dn@px-)9s$x6xe&&OYFf%_a685 z&~|3JFrAu=pm19^u}lV&%oN^BLqlVV1Lxqx#5QF>KkaEv&wHUgfk{W`-|c1h4oxZ( z&m=S@_x4S}z5Bh`p4jBrl~^Mmecwm;JAOc`+-kL+Ss^+NBYC)k}bymIgn4{zfp{3{S1D{(@ImcGBm1*T#8Q?V>nbmQz)*Ra(4;J-L39nL6Li0&?~5P7rI}N zSDW1BFDE@UX&}kI>&KiBVeFJqaDT;oMzTO^7@}kLG zy(HIG8qMCGf_lEq+!`cLw;IWrq%fMgEx`x{C^_ht1@1;#??YCbs7f^BbZ<&DB&t!*5vTmSc1>bdu9eg$X5=l2x zpChNDWX@mrET$|dv+2@gHQB6oj@^1~z2ew7SI87k*O}`y;xTpoc+KKvuV)1P?m_pg zV8CsMSJ@8ZgvUBVj*yGkzby8)JZhBSt>JD=)|yyW#@59f2b%?yHflT8f#0fVIsAkf z-+}!R*XRDHqjA|CZYTocE)qHIpoX#PLESWM2Y-6M#`2VcT>b$IVf`fi97xDC3f0DY1Y(%?xd7Z8Z_mU7EO`%ecpeC$EaVa zkEgS+Qn|Jdc#v8EZTz+I(@E+y_33npIzk*4_VoF5iaJkyIsFW+McN8_ z^iw~9uGD5utF?LB32O3moce=0hnB?YqV5azJ2hWh0*zJbGIf;N4fy~{>a>Si1!?^B z?)3Ha{`4F5ad(0GcG`=!O?Y<>D$xE1eAlgE|JHTOz&HtYR2@yXpj)DSqkS^aX&XAa z?wf9&Xu}MKRT@e6MfX*=fw6w*e$Zxg6twLS?O!3I&?a?M+85d`ZCf|3+o5$C%Cz5U z%d{okl#WJQr;&Brv@P0-ZjCmpBhkpTIo+mig|_-J{vWIQ_f&=9b+?f5-ri_vH#8eQ z8!8PYhEl_4#?x+-q1#Z*NWlm57*&P>Mzx`phzH#086$==!^`gTZW*K4Fl1;m3>$h4 z^@cvQcNhi@{f1AB219l?vzyN-W%L+I7`28%#L%dr#!zl}+bw6LF=~sU^JBb!ze4Ob z>&E0m)~I9EU<8~OERV@;Y6l%OH3C1GO3g*Av?*>HX1SpEf-=BrVfC}BShuD(Q_57$ z`ot9=1j}0nR5|lylFyRMj3T;77+M4Dx+M3Yj zypfvk6YrU=9=I7Mf5|}ZL z(rmlqwhCK=EyT&Qm7rHCv5E&y3fd*MV(z2WOFU|^-0k?}_>8Qn=8ZUHye?3Mj-R|EUY(=NQSRt>@Ofj7 zK8KXo>^LQ|xrV2F&+3i?UZbPJ(drmci_?l|U2 zcvTKDuh>!V7-@WKw1&8-`H_iPW zJ@IwGy(Cx=Pzd^~d)fU3?JN|Yo9q56IB>5Dw$L`?e)6qA`b9t!Yzw{#Hrxwts$k2# zF4z>zqkY@G=ALtJ2=?3@_cu2Mnkxe5;ifx_^PLXvpRnXE@>luYhn4|H1Tyl^CxFHVQb#D(I=P<8YTu)C%(^dzT41UC_kJGg+o=*!f-6~0_i){Mm>@oWg)O#QXg%NHb<=z zo8(5)7Ojh3LEaQ?jJ8MJpspn@Nkh~taY%fUOG!%7Q9h6uN%VlrL1%JI(UTlkj3m309Z9@RCHsvK`#0qCYv5 z98LBnjgJ?Pmygy*+&>;Ik0#V1#rp{GCuM}VjRsSpR5-PwL=H)N)A$`SlT^|(%*<}) zG1IIXRFSh2S$y})>a*wBN8)~z8$rF9f0C=aaN>94{O&{P2HivH1@#Us+BR*Ywocpd zaWbysw9EmCsGGE8YQ45byGCtBd#!eZ+WMh~HR$k5019H^<8(#bfM?KHG!AW_#-_1! zd*JtI932<+u8s>m=7%nm=$Y%CgJr`P!-}DX0e@vo8SsVM@Xb&QZo)8U7&k0Jf}Jx| zGO8J0L5~?G4fCiM4BrhisH>p)Pncv?5m~;*T!Fg9{Mp=W9%Yr8+ii8`2^MZP<|fG7 zP^wWHP%tuUoYiWsG=DO;gRdoIjReMR26Y+t6L-*7jV#$}>$A1kD!4tiE*q?B`wUq> zs9(@wYqOPeJ8iumvP!h)VBk+W$QzDj$BJVO`OL-}2R0x(esx%QB*z)3ACOEsRviPqikrlx z;ihnHxLRBxt_fF#b2@e6x^N}5t5B-LHR5te8^ZPC=5R~6ffywqiAg%5eTeOzXjl@G z_$6JSb8st(NP-faV$sfMH)K)JIaroG-@$8Si?Y|dCD{|`?A=7-1@&a&t9(3>(-{LE zO?)HXIVXrX97~QPUf<#B(f$~Q)b@Cril%Zhe|nF2BTQuuvnwi9HihWhq;3(>!~Y!@ zcak*Z6lxvgnwJ4J#o`P4j$vKh5BRSVmW@lY>)TYm?m#zWt08=4o!Bi0PlZ<82w>Ci z@~8D-+cWwfZx)>V+#I9~Q2Hr7i0B+pG3O4o9q}p9VQ+N;nh^B??NBGgI!J~!!>Xa4 zfxKkyGEcKQ%-!ZX?hN7pe$E}YjoI*yWg7*aux&av9NUO;fO!%09BY=pF~YQM z*0x}qvo&(R*y_1XL?xcfL32=HTQ~29w~KnmapD#VTtpk5*uj8I>(;oRVC6%>se6ft zoLtZ6!$tq9|A+q@Bwzi@{xAL&|9Afy(cT^I2zQ2?#qHtVa8I}kdovInjNVJ|#w6*F z;jCpUFxecm=2^v>7N@aT`OaWHD*5E*gAg2?&00=W5*^m zW14Zzh-QQ``r&7})=BIDn>wx?){cQ1(sHSzs9DrK>>7tUp&bGD4l6uM#1@lRyqpPAT+QHT?`#YX=8K{ZSQONVxBaQW4|U)=1~^RGv;rsMf03_ z8r%wN%Dl|_%9=H=nA;g&Sj*-m^LN&J&p+@gv7@k`tp|I&MR40TlC6!qY1^>1b9*7} z<5Fxb+#j}YHnQ!jt(*JZwr-=^TDe`^4sPd%XEcA*IOTafN02APe(#|iqU3<(V1p7l z1P;FAz`=EJz#Tb!@Q-~^VV;*4;oX7@@ce|&oVkw#B0;XF5pnu*C?;sB;KJ?UNd$Vg z!L5V*oX8>YHo{w|{w;r=s4tu^+64awPowxZ{3QRjpX^`vzk+{<(J1y7zBCvf1|EvG zA@BBsYC+v0ZWj-PN5Hj$n~Xk6zRFUP2gz7;1ii*lrlLv7M06MwzS6{t{BA1{oT#+MS<5tMfz%jZAnDa9{YRB@lWRXn8PsYFVzWMxh^rnH9!k>LkR z?C2D)%fBhv84bRzOlx~cxjq(nz$MBrI5LP0tE{z;J>9|H$sAIL#9@L}%x;TYM%aw* zrxDf}4R?vV@l12k>F7*!Hu@=E7XL0=PB7^h57rZkg86zx;zv@_aS?R(2Rw(0D|nl-dz%yB~d z`8x)Be*5wOqn{x)^f7uNkr{IRHd)`yU(M^RjgO}r;tq0m@q~y8+t!CH$3=NcM~tVy zx^r;p-t`xV#;|)in8zM%$~TBJ@4ND1W1d(Sg=KZi3Cm1tW{6cUX!+CwYOV*5z&T1s z)6=xHGpzNBSpBu`^!K{uSm6j`6l>jK9fO`?OfXIiO2ar~j4{agX;2#!hDo%l3`4-f zDEO0etTi*qOlN&JubS7*Wb+S1=r)UrC)u}+bH}($+XyVpwoPz3wn^@uZJ0aC<>Gl+ zHU{z3xiOGk@SJK#ocF*>@Y1{#&*(UJoH))LT1S$ncbqyd92&Ae)U%PEY1nv2`ex9H0XZe}_Vo{-}O!P^_@t24g{!)=b zug+LP)jHoVrVz8D3+eof>9|K68xukG@RSmYMMaK~F+;iy+M#H&556`_o$$`mWHk^UhqAW6&uttl)0GbI~T^g1d z3m>bd=DZeV$4oQtn(1binag6a_E{7&kF{s!uoz}G>wUx=KC~U#1U4bzzhaxzCbNlb z659e{aXT#Ma$GvD-Yw|3c0BP4`FLOESsgaVnV^LK20Ik-UwBSOG2h|H=Rflb_-=>a z9V9&Vk6Ch59(v+if%{Yta%%+vx7+P=hus>17rIp=b zwuZ7AUJ8E=uY{MwL*ilap!iGpTlhQVBd~p*lng(3k$j83N%Ez+d0r)?==bQeWG(tN zx*GjK_;zC)pVeg~8UDUJ3T{sDn{SC6wT=9nEJ6%i{(cS7Ebe`WH@zLpje8)WN3^L=! zU^iH?|7(l`^H+w$;5K*-E`!ZLVmJ-gh82d-u)**celV_}v}UjKvx79x;{HMW^+ z=7Hjy_ss%Gg`hb^%U^r_v@LPC(aJ9A*LjFhZ z7%Y}>RKW}4?pl7_VMbnvI)aX{BjWI)t&;GM3g9w+0DLv58ou8Va@;#U^UL{n4j-gB zNVxTar2E#9a$gA2?g#kKx!}%i6x_P+-H+}Vczhp1?}*zVh!R{*g8ddr{VnjSCc?9H z0_0c!vA>?+)czBHqo__K_e=arzs%n%QV>~2 zJ8e@mC&7d%3@D7Rj&@6F0a!M(lpVZdn8-fmu)pzQFV5es#aNpWS($ z3|cgPz5nbZ_iO#9ejVstSbI`jCS}5kpQMavcf2dU1^aCzcI0cxHDwx4&&%v*D92%1 zgeJ%On)ufnbCg-i%*S`AbyxxKa8x-Je-a$g_N05&J;MsOv?vjKS=|dbE@1(z-|%Qi z8d!`wL#`K-!GN62*aPM;5{9TDX1F)RiMCw(JE+WRvl25a%twT6a?&4M-2ZHsHk<7` zDC{J##rBPBwXG0*zBBE3a=ba(_%E>1vm@ikI$HR7&SqGygWt|?Mg96=zfZ7L847YS zfiDH6o)V80{{0KO;KK%3t6S7A>IB^;>iF<#2JAN@-U~BP7klQ!v*Ic7G&1Th;KHu# z=w~Sh^?sBU-9wGH;5b!Ak!{1y@35KJO3>x-aXC4;o+RNE&ZM%iJkGj}vXgmOdPA$C zDyf@Y3Xf%9Vl|KqdAF0cv8Jr%G(uc!x4#|<0(CjW(>6J~|?!)!d?{Ks?gqUBP4 z^niGh9T^Qzu}Iuu&XvxOe4QILU;k_DT>Wa`e|SKS6R;16f2C)gdu=0guYRwr80)zb zRC=!eWP5y3RBXT^noTuz3(udxbKlbn^o7LudBy_c0Y)w|mKuwVxv`NwjD^NGgMd+H z%>R(!4a=-zU76*uh{>!5mZIp**XDEcnOO;1hH_!Hm=&x`^G}x5tTUU#)(dZrcvmW218^++FTAJdujBiQ@a+GdCJ+%&)<- z);mj`70wc8KX&8u$6k~<`@mH@tDNP|O6Mo%jiAoi&9D7veeeB_JF!KTFP(Q$f=b+lf8-uACuf%X2MX;P+Jc z=5`YQV04lKYFV*D#6q0FzDMt4PVWh^{E~W0y{4W);r^r~DRZ?^X;5A$qv_i;a#V(& zdC9b>@K&yxB<}pHs?$xp-^1sTTl6LRBEsVz;QyuiGW{ol`(&&pe7w>qWR!!dFjjr| z{Ac4aeA;2wuw3R7mXq+`+(_^l8v`C0wgqfAkTOBrv!TEEXA`__fZyO8Ru9V_F+v}jUD?L{x1F@J_glHoaFV=7HNaD zNm>W4k&xuZX3KQg$z52Ojds`#eJPy1oJJXq#6v!2z$61ZI=6K-pNQgJHND)dR( zXML9TNPD7XXyy7eP0ToAv>DZmdSk0m&ZslC7@LeThJw*(6fqi%KN(8KF+;_uHP#rL zjS|KoL;9zT6gP)p3obVZtYev3MwXRz$-00A-DV$TUbCL%H{Y4hSswGPIcher!e$Fg z%QCS7=2KP#8aVw3jGeS4Y%Ffpma@fcX&Z-o2iryn`%dtasQ0)}zFjp)ItQ^g?ao%`81|*dIpFMYwm{O1l7l{H zo3qO~jq=SeW@NeONR^PW3FT#ylrc!oU#(4X*(dL})u&{^>$1XG@A$i`7}@B-;O z1pG6i715%|3-6c{Es5g(2~iOA0+B-^e!qWSv@G&LG7HI_e@YbdNBv(#bG}LNw|);= zzKO#AX+roNEkLaYQH!;cBYEvS366d-a;N{cdJ1)fD3K9nik|GNG7p61HPbWE@W9lMt zPp%}gb&s*#*lp}IY8YL{4&>>3WQ;dko_*9g=A7bB^GBTH&SB>yqBjr!zWEIQDDus7<7x<9;32roI1A0~>@S*0MO+tg4`sMY!x;$~Q-@52nIjD)%O z<3zY(J(?fPNwXbUt-xMr&$r`F$DedgIH#O*{8=K;C;Umo)T-#g?+H`IEAY=RaiLt4 z5Xlea%w+8GL80HQ(ZA9Ljc1GjV?RdL!Ya>rj#qQaoHk#xGG+(s#hf)inVp#Dh$}`8 zE5b}Un0C$}AFX-{h55n);Wy8BJl_vb7BfEi*F~|=!m)eW%QapJM7GT*$lw#~D*+cRaq5cKWcy?q; z0_Ugzk&R}g)6z-llynyP=zCl&JCaEfEJS?{Hk9j1GoB1q$Df^C=F7NC{1S|4+1x(9 z+_VxcJK80D^{)Zhh~n?LA$<`UPkYPZJPCM`hI;cs894^eFc3$-=S|M_T-bj zPhUhI)Hmt7^(FLjdXK)EUP;IA5c8d><2e7`F8=E*WOVn9;$oGbRYT zUo*yyqsA$to8e-V!JDRylST`%3s%MzYA4DK!T%cPS6yZCVqc0arP!e|lp0Hg`}9Q9agCkvc=z}G8s4N*tAk}Jpzn6%NcA}E8OuE!vgQ% z+|+T&&N`uMb5A>}uO-HwBm652-w858j0oXFvxKbK(qL(_L|9SQEvw!VV>QAvTI{V@ zU7LLqyS0U~;iTj+*07Gcp0NApKuO?Jpgd3(D8QQt-k+fSr1HeGS#?rD@FWdc z^X>Oi(kF}N9n>IN*wB_~6~O-v`sf|> z0eUZeR==R{q~lhIl{C?NK=soH=_LI!_(uAgzLnlgucJ?cTh-6&m-HK;hUh=^UGy*d zb^W4#MgJWV+?@1e{WpS|0G`oz)7$9v^cH#peV9I_-!QggWSkWG{IgvBXP_9Lu&Ybh zQ?l^~Fbjo>vWl{8{9^oWXL({}SW}iUONZr-)oW=*OPZBs z4O#jvN!GmOo;6_kYMFp^+!DuF&nOS9HcPi<#{vz7&7&e`eqar=OM8hZWqUb~*VVIQ+oz-`+vxz}7P_lCP_w{e&3Ly#G`U3QXv z$3AFxahdj6NG4IvxxQR}v(^@!fyo)mY!P zvyp#_`ozg~Zu6B+t5fRS<6k<(P7hb-lsL^!CZB>>r#e~C(m3VLE2ql2&$oc1Lw@W$ zckVm&;BK6IP6KKu%8t{H^&L3*P6l)iokvcs)8S-+W}`5jJA97Q=H!5;;h&V?@?B1& z^9=p)D}qztr1ELbExy7@cghGE&uJ%Wd{;t`9I!w5caGsSId`2sLL+fD$OugHoOoJ< zLXXnZE=$+j6`ljnp6Apf^7IMyo^GKIEytcS;2fNP)bHFM zcs{TY7!C{t`T`uBOEl3^U@@@m><;t?I*~zV0=>Y?fwn+PU?4CR7!B-;sv(&~$pKF! za<&KR0*!%hfsR0Zpf*s27N%%0z!0%TJ%N$Hw&+XXdte7+HwVT8(}9M-N`M7!PgD`$ zisk}Mfw4eMpexWCpo?}z6M-LruYuW*(ckBI$CZ##MV}&wxkw?fP+T0zhVvt(5x)3P zyf4maJ%=mMf?N*#5^juCM>64(*jt!~*3XbNM8u$KBd_72NLi#H(iEwW)I<)%0`Zaf zDcl?pi7Scz>;`)t&M$(QKU7of*4hr zjn+jz$4X<5(Z<+1v~ada)6p{YX^54_UZY!5va}-h7Hx`UqJ^=l*i-Z+iv5+PqT5o1 zY?bJd>$NHUDPzYGiShL~HO`6i=-9Iyg7al-;Hmgl@i~I)8nl8Mw}Mki>uMf zfK(}C#^o}V%#`4Q!zm%h%`tJFI8K}#8lMu_La#i9i z@e|x-!kkbibf9u@lvK*~i7mypViPB&JSj{bBt=O9aUT{ZrAexS2Dv0jSL`TcAGc(z z4zgd6RNOzNA5)6MWa<%bDv!y>=f|f4wrQd+VTs~r!$3FnR@T>+}B5jdY?DLMaIVOm2WW6}?kF_V-pIWsxf>E~hTl(A# zo4}*=arzjYLhw1+FHjhzMlo^1%15Rrc0T(jQjK@ZyQDQtXs*G|-%9y9d zBSKqkJTR6ri=f|vhu(>dCk8&^N1al>jPG&A zopQd2f5^XeD)?@v&w1yJ5cx3a33-Hser~KW;k75>ad-xizwF3DUeA?hSZMa#dq#vY z&z;BOnH2gVcX45D^>28346jVJ1Hg2USafpZjY zx}uPi6%YpY0`veiAQMpn%Dq5G8U1ErO-hniH9PZc#e99*4Uo3Gu9UCjSa^- zkTYgtyV9{(cWgX16q}57#n@7ov?n$dYl%(7Xvh@?f#GBGa77 zau2XC;YtJ&?!-;vr#v^mGO0o)_?g^Q zFcim0HE0D&L8>^FpTgG$MPVwdz<<=MC`#3)s}ajp>AX};x+GNzI-9nn(`mahlYRmx z&O9lPGNQ~gzSy^^rm|bv%`7GB+obC8rP!z^VhL-950|DS8UN-4eFrT$*t1k2CS-Q0 z{Q*9$;Q~tt$)SaVdf!sZmJ)ofe~PQcGv(meuCc4^O1m8ViT%|66Sdl&h+E>9@uir7 z;I#7F#9iV(5l%!Bu|zy^CO?&Hl+qAq)~D37qCEAYC`)}#QQ&KJ=`H1J z`Xvo}pdfQ+KV{3apK;FAoCM)FQ*@;zjU9M$>Jcpo!~ouJKECZV!|!s?gj#RUa1Hiz zdyap0>iLD<5^piAT;x3q=mWZ(y@+gpb)XhXS7P5{Ux_C?C!!E1Vd4R!pC|ikI47fkC*{#cuZ)MEX-YzYD{m#GH>aM>;|56mOe*k>T_$@)6XDs8kn#e zN-eX6S;K5)UK^Xh)iax!jm&CL`28OCXl0*Tx(NI9u-j0#qnr>cYyqXQbP{dHmJXsW z+Q&@}1uBVyV>rw7wq5Io#6BKpSh*` zcKemx3ND`*=_R*o+%lJwZzE#B1nlFRferi{zJu=qW#M1(jrjPh zsIgXfpjCV!W<<6ldNC0O~w4{jJ&Dd2u9QVZoaeLed zKeNTnG85`h{3h;*d*gT?L~+K0aX;z{Su`GryW_WU54dbXC(nP#t+_g7mb>EVgh8H3 zyb@7(AveiWiM)q`ho{6#;w|xi{v>dU6QZh zC`_RC6>Ru>4&I15Pg#|!Ox2`nQ}7{WQ@TA(MI5vsFEppy(ygcqGdLTR1(`h5`6xtR z<*QPfk!A7_tCiWR>@ey{l;PHn|#I z%`W6DZ=IJSycRn|4tO;;hQF#DW5?8(=Pq9IQ2em2>0q`qT^Q#a{c)$Z`|Y2QO@%wl@UW(OHv)hz;@CDu616uIHT=Zh1ghKB=jw6wx&~cc zt|3>yYrw@6Ho^LMH^*Ki0&&r&i~*w`es^h^fNz*F`#9SQY_nL1l|0*f_8;t7_zQM_ziU5XZ{1JXCtRIa%{`=P zd(!@7kJ~f$j{WZaM|&IO3I2%doep0f@3UKA5O2l9i3!MtE5@DwNx z76e}cCBbZ-Ytlo2l^H)3h7HKv!INzbJ^=}}A=6CmP5D6ng+_}(FVjz7Uut+M?4 zy!&*#@ct!!Ez8CW?lW`L|;x69tpUUXlF_;kptf$LFlTFPr5T=3~@lp08!@`eW+ z;p4>EiX#O^O^Otjg)_ogQM(Dc1lI3^e}Te@9+eB{~1z*b$$}@=tO>NBv$!LgO=T; z#HcIuFYwrYj1n~VGDF5bVmznCPWZ|s+hMu3Tv?{rF3Sxe!O3-%e^q={a#eAKoOtya zxZvsqe)9$7bq&<0+bR=y_XR-x5)0%2dl_&?&4CP?DEK`bo`R@Y;WdQcW zt@Pl1&V6C7zQt2Th$qW&9{G1gsgg+~4pmH$A zj2Q2Y!^|o8(I_)!j2kDIVPn)d!W?AY8poM;#!2Q7;bS>%kHv49VWT&DiR~r)Yn8ps z{?49*Y??jG{=xQH7TI6e3+xqk!19ef&vt)!VXpT(R9+44SHt&)_eWu?s;i;>G1Mc3 z-QXVwWLNdUstXZ$Pz?L5fr4j&BDo3=3Q$)bR2-Bad^)H)_~9x#C^;yD3@4dT2wRJV z2f`!aAt)Y-NGKrekGGa!;Zgn(;vU{tbX0Iu8>|5p7gq;k;;2|3DL%RrpGOj6L*!n3 zDV4`8(krP=YL|LsR;eszjJRc9c%N79Lw0cC{^(F%EBA?AX*`*Rb?Q#)PijwaE~DTM zpxM&UG!zYwB7n}e=76$8>?fb-k<&0~E!rg2s5NUZvAy>mSB7`z8Ghj$gsu-;|z0-nKHf_Gsc|W z8vEW7vfNqX783RcT2qJFZRFx@*f-3(IdqLUGj{NQDyNly}xU>Yen;gcIH|?~HfcJK~*2 zu4oOG9euuU3N{BDgSA(sM{U7|V9C*^qn4m4@*p-xEQowX>{?oWUxE0>4&Qe^bUe6W z=bL1Esw35w8cH*jLJF0>OS z_sRUS?uUT9_P*=EFZU(=NwLC<=k%a-rpj=O`jq*ZQ6py+sybE2nb|DjN_9v{!8@9; za*0Aj*`aT+XZHiLG-Oh}L|<@$9L-!}eq|PcT463@|KFkTg2H}*O}5zE?1IZ3_M0W| zGHs!<3omo+S+qP^GL}vFL;mHn<@LjQlZefUtFf!TtJ$l;tLdwytEsCM*l=;bA1$L- z%b-WDzU+V99|u3TKfk|xwFqkAYADB}ED;vZ&9SgQe>HG5d^H2{6gj<7y$ahYvc5nhTl8B?VTxx(_%mmg@-gI|y9@&|;SiSdEf{FW7graNYaWdn(im z>0YjP)B6)%LG|vt@O4hO=iT@2LWk)+@UpzC-fhB9&Y__de)sNpHNp+=iID9jc~`t= zLO#*@&CBr8yj$L7?~-@T%kk=jJns)L*;@w>`UP!AjYsRjwcv2D22x8FzH-#`(LNY# zIGPRi2M2;xN9173(L!(~I3J8fri07D#o$P=FZd(ae6)%z_621!I365Aor9_1x8PXt zYmh|n^%!p{_&qomoCwx_j7{;*1Y3_rKlF2bl99CdArg-i-9F=-%D>G-3U5P^6ukQt z{0(Ynq~I3k+U;8;8o7bfV^d@#5bHy%V_@gt@h|~mG5XBY?0Ec4wm>)41292x@9G2P%`c~>C zYRoJ($9$ljF;B!FGlB}CM+CK7diJ4%KM8!_dLP0W&~V>>-+q4u`QUvcVmc`6z7NY1 zvbe1G{$AD$Ny~lbeIIIVEFv4bAHE;I@49chAGsfU=zuhaF`_bE>`pdtKXiX98@;cG zv0~5%mn?kDCWFb_WGtCMt5k7M^vLPwAp92&XKk`KHI%AW zj--&|kmm+cW2q|TXHezJp44!vQaPBaP!Fr9NAiZOC@38na!h zrtDmHF}si*QOzUzaxkZwQO&BBRg$bUE6yH&NZ;H3j2lT!q(Ae2rfW#Gq&lLt;os`~ zS^s}VH~))K>Iqq7ExeZNUHuP@ytRV0!Zj9J*Ht-<*|oW~$+fAq#kHlim9?*HqibVp z#ppG-Hbjh&(|L#OH7X&IlN2N+NkvkVev*z!CnU{3=J?g)U)LL|P1Tl)qS{tbRXZx0 zimuvKF;q;|o{FVnt2ipIYG1`u@l^*Zfl8=4REbnaDzQqUlB#4Xxk{l@s#Geq>Zj^h zb)wR!PE}gfnM$Y9tIkyhl~Hw}GO5fei|SHkRoPT_)s^a6t6S8q>Na(| zxss9sVp ztG}pM)L+%#)Zf)V)T`<>HAziYud6rIo9Zn!MZK-2s&~{hHC?@{W~iC!zdpg*U!H1# zyhvUmFO$EJSIA$<-^ky|Kgg@(H8P1zCgZ<9CU26r$Q1H6nM&Rv)5vu4E}21QlK03g zGMmgHbIJQ;9+^)*APdNUo+YFXt0U@LbyOWw->Kv3dv)S(t9aLbP$$)o>XbUI&Zx8M zC-t-XIP#jsG>y z-|O}NptnJ^ZT&-IlaQ>E)<|R$i9{pONxT2h`D30wQa@>cG)NjE4UX;CCUD`u0MspmY-gGBy5ve%dS1IJ^df=wHF^2u&)Kz0tEdE{PH37uKCt( z2|D^A$$7-xTI^38zH$78`_Dde^&fO?YuCS9FW0QU>Hj?9{~xXX{}*$IKKdNtHg!lA zk;Q+xRsD69!vE0rSIz&+{qL|q5xJOLLM|njkw1|?lgr5!&Xq+ zk4AD6xtZKTZY8&o+yAyd9pp}O7rC3F$H^1WpCnI_ zr^z$qS@Qow-CG8?m4wlPNgQToaGWSK0Xq&eb1c~wGcz+YGugr`g_8+$Cd_e|nVBaO z=2$ybsjYguZ{OCwvVY9}P?hRR=iGDp>)T)7udiC-rIP;}zBWAkzj18&|1|U7RJFNk zYt^=@?NvLf{;Jwpwd?Ri?NstZ*Yt1eYtuDVinwdz{c^{N|HH>++{-LAS*b+_tX)%~gmRS&BkRXwhH zQuVazS=IA@&vN#EIMb{pv;Q5{XZ-ux^gmr?$R(Hlhhvcc;r;)c`~THv7ix&V`2UEX zR)Q`0RNA%NT;8apdCBY&U&%Fi^Y47DgwU$QQQER(Xi22xP|1ms<0bLZpJm+go#pw6 zJk(%RYithpfVPEmn$w;;SzJ^yq2zhV?UENI4@&No+$?Ec*1dc|c>$siq7!Nu%7n3E z+G59JrC15JKHi8o<4+KpkRjv_-2au=|DEHbxYN0lx#PL(#T&(L$zLkBv1esVaA)vf z@TZdY;CCf;z+XxlgL{DMfg6Ae!0o{G!5>T7f;W}6D{E5Lx@<*RL3yw8h2`$@M$iZF zd+?!%L5LBE2`D2k+yVq=YMk%Y<_T zEE!Lxl1XGbnM_8JiDWdHM*fHPhBk>YmNAAgo-vLwnK6M;%;?OW#VzAvxnS-*E|fdJ zR{a0(wAKIo-345c5HH>;-X``-2FVO^nYz@VG;7U9v(9WVFSP4jiC`=k52k|AU_oWy z%KXYcm2mKQFc~}-Tn?s!CxIE@GB5!=6^sNA0T+WOgGt~(>CV#bWj)J!m#r&XU)H3Y zQZ6p{mj}uVp`)RLpit;cXcuUAC4V+Bj(z0<2GB&R;h=RSu~v zE{TJ+U>jHmHi8{sIamsIfvsQ#cmX&DW`mPp71#t;f`i~RI10{y!(cPG0?YyP!I{!M zrTa=pmJKf}E}Kna-eFc9!i69p;9Ov>VpcP zBq$LYhf<&nC>8nz{tYfbh!H#l2O&ZT5pskPAwy^o5`+{%M%0G?nsG1@Iz)5SOw=~i zF4Q^HS=46KY1Bc~cGMo!VboRBCe&Wk0n~BSR#X*=jG}>3M>@w^k>^AHM z>?-V9Y!1iP%)wm5XZ>T zbMA6_a3kE;+*jN;+#B5O+{@f`+-KY!-1FQ+++Ezm++*Cox$pl2N~nf8}Q*3UL~dK@{Fz*b(vH%e@}1m)@`L=AJe4+` zwwkt|Hj3VxKAb+1-ksi$UO+FV|3M!|??E3yA4?xfZ^dZMILLU5`;8D|;K7;hPy89y1v7=JTPGuAVn zGHx-xGfps0G7d9dGEOlDaLgPlXFKOA=Q`&;C!gD!JAgNWH-y)VH-R^q*Ou3mcavMp ztIzAg8^`O)Ys0I<>%p7GtBv^A<#pzb=H>BP@uu(^@$z|td5w7mye7QXydA=KfN%3RxbMY(jJ@HHNQ}H9QO>$atNOD|qRI*dD zU9wHGRq{%*Us5I6Cpj!RCizQpO7dFzMmkhBTQ*0wQnp&Ak{^*bR^%z_D;g-8D!#~n z$iK^@`>jTel^ zjfafqjYo}-j5mz8jVFy)j3vZS&nqyeN6 zq#dLHQV8h=`2_w5E{2ST42FCLe*t%bbcf_a`a?!ShCzxTEg|UAXlbPMWa*L8qov17 z&z6$P&}C(1_%cEntc+ZCrmSUoro12QA+!^$E$kWe1N1SpD=Y`C4{Hp21#JUs0DJcz z82_8Xen7uKze4XrTf*{S&0uvA^$@2K!;x1I7ZJM<#}IoFdk}viwj=fi4-3aav9GZ?>>KPm>=$eu+&An% z`~dta{CfOq{91f5p^(5J;D~4$NPt8;MsY29)m~Z#dt!V zmPg>3d2!w_9+T(c>3K$;mDiDH;c0j}o{Sgd-4ES$@8XZ*YVl|B2k{SaUCAZM4apP9RmmR7 zGsz>#3(0NCMaeD6Wyu}MP02OMb;)zdUFkjPN9iYNZy82LkZqJ5l%3|dp zWswr9!l=M1tg2j9rYcpvQoUB)SG`gFt$L}tt-7naqq3`AYMa`l_Nv`#hx)p@wWc=w z*NmgSrk$pNrj@3#rm3c-rirGl#;Ofz-CD2Ksr6}X+Mc=|x;DC&y3V?ex^}u=y0*Gj zy5>5pfn>lNhz6ViW2iKQ4TlYf3x^sq;=af0+PO;PI6gdq}fz#sDJEcyov#oo!7va@-mwA_Z~%4qOf158epg3_c3p3qA>658eu13*HVs4njh;;lE}a zB_VL=O6XzeW(ZqJsN7TeD1I+FEM+JWLf8-z1P>uX$|3V1IEWZB2eJ?{6@r1xgODK| zATuEZ2n)i2P#{#uEXWiHA0mMuAf=G=rJOQe8MlmIcD3wM*^u&dxeO+UO@J+gL0}_b zgJ7jFGHeuVB&-lt2Ac`1nfBl4=CI)~8mt617B&Yq1U4Qv1vVen6wwIr1JNG&5b+st z8}SiQ2l+SR7osupE20_l1L7Q_5%LY<5#l}K3F0;40iq@HC!#g-8KN$-Ir1Ii1>!BD z1+qR8iz1?tXc(G-#-qoeN1}OX2%3PVp}FXCG!>0NPeW#}1b40;aQkDi2Hh#rex zfEJ=z=-KE}G#ot*jYW$we9S@20SpS;6W0va1J@Ook86$_fNO#4hXdhS;cCNw%{U5i zZE<~Yy>LTulkg+(oA6ulJMo+GTkxX@V+biiB_T_26N5xMaUXFbaToCt@iOro@iFlR z@ec7gaTD1vaX;}e@eJ_*aX5uWaZ}6`9c3>iLs>@wC^5 zqogT3%6f{HvWzmGlBLv4`){<8VxyQSA&QS8q?FUn&}eiL9YaUav2-%MGegC6FoVoA zlgH#U*E82J;Vc1jDRV9JPo|71Wo~8$m$d4KcX@^@I3E5?-K79 z?;7t6@87LYc;AIBL|=rR{{0J>=AyU4`l1iQ)}o)noUoy&ov4oJtMIe1nW&zqrARN< zh_zyaxQC>Zq>-eJq_d={q_HF?ZYAj{aY{Z*zDhnx>PzcNe@Pli>qx&#eoAtZ=F(=; zkCMhxs*EB#E4wH=C##wE-{@1a)3OV)^Rj^4CBGyes~Dyjq9{@fSBy{;D<&#Hit&n( ziaE+M)3QNKwvqUX_T67kR#cKg9Da&e$$D+3^w`{ODEiubRi@~zO;;^i@ z$Sp|=$_}^hx9_mmO#5&2A^So5QTs0YM*DI5PWu-7U-r}Xt@hpaJ@&))z4m?fGN;Q~ z;aufh;#}=aIz!II&a5-;Tx?-4PP6N(>xS!!tI*xwJ=opTJ=Qzk zi}m8XI`49?&ZqIIe0zL{d^>&neFuHl{dfI${I~tr{P+D2{C$JXf^CA`gUy4zgZ~6y z2Hyrh2Hyui1TP0)1z!hW1mPiM2puX9!9uS?A4Bg#A3|S4k3-)=FaHDi|5fNq=y~W( zNL^vCa8_t5d6k?>QKg`Ae~`b zq4aWT+wwN$%gR^&Yj728IcyzF0h>E72>^TJ&=CT66_^J$f|Sigu%8Xbakd{u8Z1>(E|w8XZ7K&;a@+<_zW( z<}&62<|O7Ura86{I~q3~$H7g-&Bsl~jl`AWN^me-F>V~L3^x&1ghSz`;l|?T;>O@6 z;D+Ny;ilkb;%4Bd;*o?Egyn=agcHP_#M8uw#IwXB#P+1x@Lw~I_r#{8j-&>pPsDbl zuf(6kYT`j+9;q{_2dOnFN32h3Mw&;CQZ`XGQqEGIP@Yr%p&X_F)DM)Cl>3y=lq;0? zlur~A^&Vv(k_j*>o#)`>oxNw^BuDl>nigL^A+ol`5OUT;FY{UA8d5qbf^_6*^`HT6J`JCB|)s)qVb(VRYd53wI z`IPyQd4buGb(#5s*?|RORWZkM#&affCUByh7$?E0;OynR<-F&7;1qIy@@Da8^Lz2< z@}2w%{E7UTd@}zJ{$&1CK8`Qpcjp)L=kurVOZnsZdHkV#Jij*l*NlV7$MQ-1BK`nA zkuTzN_+$A6{6c;?pT_UcSMsTR1s}#&@yqyh{z(2PKAN8|>M0r~`XL-DDiZY(fkXwO z;i6um0itoDZld{OwAd+jiS1&W*duN$X(lO@6iA9B#ghJ#;gTVeev&?tk&@<;q0+(9 zLg^pUj?$WG|Bdb{?JXT5Et2+?_L26G4wU9ghf9A*hsgvouI!oYrtE?2sqBvIp6s#g znyf+|mfw`mQp{G&P%Ko;RLoP9DCR2`DDEm=D~L*}lBUEec}kIzt>i0(N|utT#4E{4 zsY;>}tAwh0>Za;Eb#rxnbwd4A{a8IuGhQ=8Ge@&PQ=*xoL271dmS{8DRocZ`q)wot z=*o3)9Ye>~fpt6`R>#qm>7Y86u2e_RmFOlJCL3sm+VEd94!U89VUc06;hLe;2sT2D z)yB)l>85$6G85P|+ceR%&@|5U)bz&m#q`zm%~an!!93AC*(@`Ux16(lv-GhZuspZ4 zwLY^vw*0hwwzRe$vmCd)vOKcvx74-Xu{^O{x8y7jET=4IEmtj{EGH~YtgWnfEp4m~ zt%ochYUTd_isied%5uT-($da)*z(%)#&X2+!*b2?(9+F%%TjH*ZhvThYQJQEWWQ;D zX}@ECWxs8IZGU0EW`AzKV4vfJJ7LaU&TGz{&cB=ooco;HoqL=+oO_*{opoI&oE5IP zE9Sc6y6L**DseA#k9DKmQ``tQ(mlgH(_QAC<1Tg2b1!g%-2|`6YxM5&?(=T+?(}Z+ zT75>J%Xi&($#=$A<-6*;?K|hY;=AEH?z`qY>ift4#sA%3v)I)J`kVi$|Be5N|C9fj z|GEFO|CRrp|F!?4|Al`@a71ueuwiI$sD3CH{26Q<`WE~VtQ)EmY7}Y^$_tS~)DR&= z4iQ6j!%f4Wa9+4;xL>$cxOuovxNSHW`W0#zt{?6nt{3he?i=nB?i6ki?ikio_$s^= z!3syEzS3D)8xCBRmP%vgp~~Zxhb!MzzOCfOgfV`sQT)&NtN7FOw~VF4TC%-lFJwRD z7-T)<2;?MWE95xj5M(3dAY>P06XX=+1Y|qpFUYl0b(ykEQ>HCD47&w84Lc7z1v?45 z13Lh_3_AjQ0oxC|2=l?t!LGm_!mh%O!`{Qrz;3_}!P+CrkxV2N2}UkN&P584Fk}f5 zheRQ1NDOi!l7bW=e53H=(zoH=_5WkE3^^kD+VBf6X{{pbwx=qPL>A zqtBpsqJ!wGnCqAum|oaotO!TJ&BM`fVjLHT$1!mX92xf(2gaA+=iwLP=i`s!Pvei_ zPvNWZQwSRf>j+rB0!O zsQszUsLv?fs6(l}sV%7jT9|f;W~Y1U74#t8LwC~?^eA0P&u7qC1lAZ<35(1Uu_m)- zve>M#tZ6I+3&m2i=CJ0nMzXl9V%9_!jrEqPWQ}04SW{R6)(n=Mg=9@-Nm&b6<5}}r zqghxMm{rOe&MIRKV`*3uShF}YInz1QICD5tIVnzy?>{&{{{!{^Z=5fjubdSBD*re? zz(2sx@+15xe-VEZe<%MK{~~`c{~$lZKf&L@-^f41U%@}e-^|~~Kg_?)zs^ta!+byA z$6v-@%-_%7!avVH$&c~Z^Oy2xi=d)15k*84O%>rpWRX~;6tP7l(KHcKG+i`bBoq-u z5K+0PHsU`+v`~Z=fyF+tR~!-t#eVSw$u!A$$vDXr$vnwi$qeZ{>3nIKv{Z_aPLYD8 z5NU~YnskRn=~OCJ8+B)O7j;{8Cv^vPfx6v)VEwn7y0v<#dWkxtex;^ss2ZL|s$prw z8k$C;5ov@Pl18bKYbct{+O66RTBpvgGwOUggU+T?>-;*6&Z5)myt=5)s?+JhI-Y@J zU>KMNu3?2?xnZT@mf^Ocw~=ZhniM9iiDkl=$R@F=Hv?~yn;0g6saE1|BAI%a=bC4j zrxX_D}YOj<5EXjwX(}j?eZMjs}ja&Qs1a&a=+D&Rfo# z&eP8GPMa&`y61Z0dhDtV|25-y;JWX6=(_EC>XN(dZiAcTp6ph*&2Fn(=C-&^ZmC=C zp5UGDo#&-_sb0F*?zMVt-qT*DkL3&bygt7#;Pd$+zNjzg3;W*s?)zT*-ud46&ih{Y z9{C>np84MUUim)y8U}Lyx`8@@27yL_#({c)W`VNcgv-MV!tn6$aJC{{k*P>kgexPJp~_h0*~;&gzbe00eyWtj6ftE?9BUPC z5pNk^8~+^t7T=KAoY{BA^$)gLGD9p!+*^M=uPyHn?*MNOZwvnkYX$EPuM2MnuLu7Q z>jAG1&%wUITu3c4h>RocNE6b4lp;MyHPV3$A^k`>(u{N>HOMG3fUHJxP`A-<&`;1; z&@a(9(SM^~p+BG>qVJ<`pn3`$-jedloV9huqPKUGO)HoAP zfpggqdoFpc3Nk)>C1SP3S7!r*%p2Q}RNO00Xa)0t4I!NJ)l9`xvDEq0aw?Gup&F=@saz_DilWk}3aW&*=-(|27SXfx28{ZQ0>&oR zcGd}2ZTPPl$0F8QRwZjAYb|RJE5u5${H&EMAL~!nKGp`-e%2AzUe+?!W!6sCNmi0| zj;WI2mChdD<$)ts~ZPyBcMJON1X zl|NeWgFjTzL{K8=BIqjUFX${7FK8?Ho8MGWGwr|8qXZJcH~t&`5Wy5dpNN~u?_QD&6Om5Y>Xl}nV%lyQ|?XGNrSWTQ znz+VVme4HIm^Hh#`?Y(tyR<8HJ9LM1OLePt2XzN@M|FVitnP^JnC_JBv~GiLr>;`B zN0-&D(5=_~savc&p_3RM8Xg&*81B|e{iClDXT%y^CcDXEa+rK3ugPQTV2)XrSr=Qg z)?L=K){ql=@PW4dFoW2$44W0oV| zG2Ai8F~l*!(bh4}QREounC9r`=-$>=+5}n#S_Jxpx`*;Z1)*M{9-*$GzMF)oSA;8=JZo`}cdKj?1Z@8Tce z=Mpv(JR}QAMcPE#NLoU2)yn!uiWDJjAgv>1Nnz4z(qfX2L?>+_4I%TXLTV*-5!FVG zQPb1_)kAetz0{@DER{*!M2%DBG&M~{)6h24w$QfGH`4#4Z>H~{ucmLH*I_qgcVa(b zePwlEzhgaS<+F3F*Q|%EZtNcHYF2;td)6CPd-fOBGu9M#WA;EBUWx@%IT_ z0+ivARB69J;-qKs&nXt8LuC@oqk+9HaJlVYT#OoEpXBt!{L zf{~CUXbDPEGwr|8WQjxSlDegKsY$An+N4gYR;rRVmNk;;WgvM^c^7#Pd3Sjqc~|)W zc{h1l4#+d|l-#EXC|nAs;*4^)@|^Ot@`CcL^0M-{^04xV@`N&}TC7^6N~@NrQYtxT zta`J0t9pxihvt-KpJuJ*tY(8|r{<()o93wYxc0R6l=h46mhPqQneLkIfi6$~UH4S? zS@%x&R`*7CPbW95HEcAjGyH9MWq4_LZFp*UZlD?&#-*lgt=#|CtPL}!3eyr(!W1)g zG=t6M<}x$HTw*RY_qC0;wX)T*4YakiHL^Wuy#enN?>+Ag?{n`> z?;YB?x7e5R<@@{iLH@q}q5cm3ZvKw`HvTUDe*XUdf%<=Ye_MZNe>;D7eN#o*jTZwa!KW-$_BBI! z>BN@g>*TBChvfU@yX36Y^b{i{O^H(UlsqL%2~*4zHN{Q+On*=RO6SsF(v5&Rz_;{| zbYq|aP#>^lE@fI}TW7nMwkz#a+O@Pz>D|&1fZK{=;F)+jUVwjre};dGe~y2GpHJ9B07$Dym87Gjt)ye5 zgQU}>UA2<`_mlo2c}dr(SE=Wz=cp&Bd#Nt!Vd^dF2kH%KG0i~J(w5MU)A!L2&`;7& z(a+KM(s$E$(NEL+Fh;QH?73_PdpMiPp2Wtnd2Bfw!!BhHV58aN*^}8**=#nI4Pk@X zP_}^0ViVaD*myRa4P!54m#}BCVH_w2&RNM>%~``a&Z*+m=jL%6a@Pq?36=_~1bYN$ z1;+(=!4bh;K}K*=uu4#0xLmMauuHI3uv&0VuwU@ke<1%a5u6aL5u6ch5NsA~6dV;D z673iLCAum)AUY^ICAus+DXJ2k6YUjU7wr)p6WtWu5&`0jm?fc07!t08CgDif5`#1; zT_lZ4!_o@rVres(Q8r9IL|!DHC@+>zkdKrPmlw)+%b&`V3P7<~kyfM>OB72L6^cZy z{QfhhxTAcbe4>1*ysLbqyrq1ge5m|ec~5y?xlA=fJx4uTyDdh@2GE~Z?6aG`|76~GzP6fZP;Y^$1un^(8x7zGOaMJH|;cSGp#Xg zG_5slHElNSFs(GbH^IzsGr|nF&9rfB3vJ~#k_~CAS?;b4^c34H8`U<|Mz+ncmD*<8 zD7Hy9j7?-KvGHv(8_dSA5p7-@-G;M4Z8RI#MzPcERC~%1aKs!DN7&(Xm>iXkxI^V| zIF>qWj-Vst0323F)RA^19WF;tS3g&wYlv&8tG}zrRp1)v>f;*b8tm%jdgr?Dt_=qd z-S6EW-Jjfd-0eM&-S^yY-N)T`-4EQ)-8uI^?jP=uH|!01KY8DH-+AA9KX|!5zHhm2 zrLWjO$v?(F#Xr+O%0IzB(LdE+=%4K0>mL;u8Ws9AEDntf zjS59V!B8mV3k5>`BRwOHBfTOGBdsFp$e754NViCzNZUx=$gIeaNXtlz$f_DV|C(_$i&Tf3MCwF-ggZv|RGg{USFy8V zSH<><{T16P_E!8^dAYJ#tZl4yED?*vqOrHJud$KwVe#SdzKLFm{)vH!OyW)Ab>d0l zapG;_QQ~FdMdDdvXL5gXYjSt;bMkxgTk=b?IAu)PQjU~1rB7*6=2RpVP6boyR7I+0 z+JB>UDQ5}Jri z6r;hs!@S4rz;W?x{64~N!eP=j(jL+?(tXks(qqzd(p}O&)ECr8)K}EU)aO(a%}Co$ zyGgr9_pvM4CiZf+i=Abs*o)a2wu2pE``NYOzh)d2Yzuo8dl@^#Hn3N)lWZH?%MP3f>Fu2p$Ta3m%BxiJptziyn*KiXMt2623$r ziAgt0*GPlX)zWp+P15Dk4bs-KHnO&|Rx+z>x_pj&u6(w9nf!%(n_`V(vtoy0d##NB zTNRrWs}ye)AC$k8^;AEUKb7y54OHKh)yn#+HL6uAtQw<+tC4D`8m-=^KA=9RZlGS>#3^R#ufUp2op4YhAI?=-EoO|{RpL-Z5$)AYsqIq@<2 zLHfD+Df-#^f%*mdLj8FCDE$omIQ>k6!Js$j3?B{e4TFulO-D?pO(#u9O;x5nrWYoR z8EwXzEjFVqU|VUcur0EAY)fq#+cI0ymiZ5i{|cMd=CUoesclLd!sfSC+Uz!;Enx#} zCfgF5+2*v_Y$}`F7Pkd$SsT;7&#~IE&T-VS(XrOC)3MF5$FbgV!g1Jf$Z^`S!?D3} z#BtKG)v?{N-|?4Yuj8&`vty*I*fqg5$u-qg<{Isq=33|4;9Bo`@A}~C>8V-Y{f+MI z>F8@(R2a-l+GRSKur0FZ7rD zA^rva+5YK)DFIth9~=`(hL(g*%#A=I zr4eF;7YRfbMA#8k1QCHn$|B&1D58jHBBTgDLWwXU#z;v76{)H?P;sK-aK+Jz9Tn>< zH&(8#%#Zbob&mCjb%`Zoi(~0nZTPPlMWIXT;~l=f-Eor^i8wKN5oz zgA&Dw;fZ01A&H_yVIrPbnpm8um;9dinD~@Elb%`OHzwc8&buYzT zm;{UlrT`OxPlh3YJLAguG8;3;GdD9oGPz9OY@cjF7Mfj@Eh-&SIDSNeEfCNJ<{K#H>7u@m!!9(SEQ??7o;4uKJ6FvE43~ykM@%qrQM?4 zq~D@nryphSWbb7^U>{@eVsB^fU{|rXve&WkoD-a8+(yFY!WP21!Un?j!j{6EppNi| zpr7!k;ESNCu&y{K`XD9-%MSZ!>H$d@+1A$cz_E7i*>db>2iU&=BewmvQ?|3VyAf`WsYl(8;-ipkB;Y#JC1VKd>7cYz%|PSah1B} zx(0drd-`~aJ%yf;p4pyZo(Y~wo+1y(GuqS7Gs-j6)7LZJGto27GtDdWCcJTP%vsQ+O6Xg|r1^RxU=|E$35z?{JRz<|)W(D=}#(5le# z(8|z;(CW~(h&K|B?1-cyK*SYU8SzI}M>3HWk&1{jl89s@zR0FXD6%=SEV3%HHL^6a zJaVz(QpJUeEtS_QZ&n_{-K)G_d8e{ZtRM!8t&OdZt%|LQEsL$LmGN&$Y_+Tr z?0W2b3=%Jmm&N~zPfbinj7zjiHcK{1wn)}bwn;WkHb^!~HcTE!-cB}7)lW4@4NQ$p z%}Xsv%}-UOj-?K#_NNY}wx#|`T}o|F9ZBs>?M-2UasUj>12DjR00qE-1popl1E2r_ zKmusMpYdkyW$I?@WIJX-**~&_vIDaNvJ0}X?1<8lrIlr0%C?rTfv&ADBK{e}6$j>12Ly@dtBKEi>*PQt#z?!rOB z=HjN}M&f$n2IA%772;*$rQ*fnQ_`c-9n!6Ln+UZEH0)q1gBs%Prw8|E1-2D@R0;g_M> zpfp}HT`^J3Bs0bQ%J$Cox9x`Qf$h2NrtO;Twe7v_tL?h&p6!wCw(WxLt?jApAKP8q zLt7o^cSoM{v*U}SiL<%0nX{qur=zhm=VwIf` zJipQ}@w5E`zs7&aUlu40fCG>~d0=Z`N@#LuV`yFIZlo%5E^;VxGjcxiE%G{YI&vfO zXXI(*WaM(>P2^GJO5{l7Y~(=XV&qvwS8=oAR>gzLfw4bggJT0?{c7d<-xAvq+a9|U zyBoU~!^Tl@TpSVKAKx3_9p4w9lbD^Do>-AsndqAAkOU=rB>N`2B@2@I$^OYc$)3sX z$@a-Z$!4jhsg|kcsnMyIsaL7{sk^Disi&!jskf=iscWg%soSX=sVAu`sRyZ>DFt8x z+<+Bu0wTZ&C;>a*0la_?-~duU1_%KbU;`w81~3BxKm`~82fzfPnNa3H=4WO|c1m_? zc3~EtMP!lL(dC=}1NGl+@GbC1$eEa9xGLNm{6F{ugoA`{q)xPsv<|d(w0pGY^hfl^ z^bhQ}?3e84>~HLM>^JOx*b{^!g~NoSg(HMT!fC=W!pXvM!m+|B!tugl;Z$KeaeMJ9 zu}-3u?2@jLua@tV|1CeQIIB3PIHP#40IB+@`l|-0`l<%j%Jsil#aI8kd5QXqdaibk zcAj>&cBb}?R-@PJO?sn#mmz0R8E=_xn3|cHW|q0Yp0m}pSKGST>)1cr>f4*x8`zuM zf7!Y?TRYo0J2~4qJ31*Yx@)KFi;L)CdvG46hvK1m7#^Nyz0dA<`mKIc03JXDU;$(R z9q8McYMxMDnApqV1#Akq*(;(E-se(H7B9kvh>Ykw(#$(T>r! z(eIHa(XWxF(cFKa{_``^Jo-7(CfYE1x8i=qy^5i+VX>XD-LYS>>KHLjj#J`<_`&$0 zI3!V$KqVF=<|oP%!;>SDMajX*LCI0cfytrCG07pxs^rP!v1IF1+f415CawiNni=E3djIU zf&IXrKqasOSP3LDsZ28SB=b1)Eb}x|m>rtMWQkdP7MDe3L)meqWB;8n#L5oC_rmwV z=U`@IPT|hs-r;|dy3y)!ezNm8U)gmy(}gpH^MrGRbA>a7vxGgwUBz9*dPyf4TYg?K zL{+33rh;nAwePiVy+iNRd-Qg_PruNx+fZn{W9n=lWbbG1W$$C}Ztr66Zy##!ZO^w4 zwD+`wYGwViX5;@rXAfsLXTGzqv%B*T=R7CR#d7go9M^Z3%A@qm^r$@=PitR$-v*!G z@AcyYm;f#?D>NfCGqf`_IXXT%DmpMaF*+ey7#$lO6dfHM9Gwy^iax1$T=A%4WNch) zf9yew8b1*~7C#V2Cg6#&$%)BX$r;IM$*IY4$(m{Zjh>u5lkAY{lQQVOZ}1V zk?x)zobHnzkRF)so9><70c;2M00)68;3RMk*asX14gcrtCjfAO_n7g$@9rBsXtQVQ}7flH7h+QJvlui zJvLpOo|>MJ9-SVM9-f|<9+kcYTmA?7-6m=jE>OU@(LCl927XqB{A^fsKfoK~EZ z9E=bxED)O|CW%ENlwVdbv~+ESo@*XwpJE?tpI|StkGD^<7dnSKhdPU$a+lO4aaI2Z zp8xlH{2q_T>6z*6;*0yK0ZL#`h#ZAQaZyARA3YK~8mkkBCsE0ssa~o4R9PCChNS1E z7pCW@VQEx)LAoUU1NZ{`13Us=0bhZ~z-QnA@CJAaya(O_4}sUfN8khS9QYeJlsTVy zpZSn!nC+e&lO3HMm7SgiXKU7Xf1^cNVV0j2WG}(bz)LVZ>=4@D^f&Z&9D3W%Jpiw3-(=gK@Qzuh5(49mMeYSm$UFA}{v@VS+=Zbq0p5^{!{-u6?lou65MNvs~ZcH2}B$#P_nwM^t zX_0B2X_aZ4X_Hx;`IKprot;%?HCc65mF^MnwF$R zX<52`rd{T9rfIFje_56(qzS)h+4f1!iO$K+j3@2=(|^K0KPHJwjmSMY{lyFHtNiAuF=~pklFa1LRF}*^@qByMV~MKLJ2EmkC#g>N$gqTL z;j)ZAJ2xB8nv^@k=bXEdWyF=*@Bim-Hw&BR>K4{3Y?&*_@0RPD>y@jUE3EF956XvB zQ*&k2JL*8IVb$&*{w=8T`IK6sCHL4n2U9;H# zMq{e6)wpVWb?5vp`Q7t-pbAiP zP-{?oP-hSiR5R_r(R`2)BmhA`cn}*z0zCvh0zCme28lpokOb5^*Cy9C*DlvS*CE$2 z*D2RI*Cj{nP3leVP3cYTP3ukX&FIbS&FbB|u%NI{Vc$YfVZXxug#!u)7XHf3DF2n~ zoh!)o$@R^Fa{Y4sa|3b%bAxh!+?d?h+_>D- z+_c>E+>G4J+^pQ}+??Fp+`QcU+=AS~TuBa`gXBtcWx4VkGzZJU{{!(y{QGD$Du>R6 z^1^wMyl7rUUS(b^FP``Bl1N@EFP#VEW%9Cli}DudEzMh&w>)n}-pagHd4J|@%G;c` zC2woqw!H0mJM#X@+nKj3Z+G6FyuEq*^7iK)$UB&KIPXZ_(Y#}MRe8trPUJNxYFN~$ zsBuw~qNYX7ikcU-C~8^Ms;D;N-@2$xQQM++MeU0^6m=}>RMfesOHtRNZbjXTdKC36 z>Q$6q)Vrvls83PfB2ZDkqW(n#iUtV1C_$CfEy*jHUV{5S z*n98jw2tRdoFs}9J8@zswo{zMDNeIfaN;<2ihD0~5C}wXqDqJ&kdOd%gail))aBlL z@4ffldzD;oFOuy%qUh)EC;9%~Ip1@v_fGzJ_nh53J3BKwyR&z>+})j}70?2-^|WD3 z6;sc=%A~MfVAZmEvPZB*?7i&HwAW~_(z?+4(+1P7F~`ux(!Z zFpW$T)4+@|F=i*$E38*pt*oc4KUlrkL)hcls$!~{s&%ScDnR|J<}1y|db!@I zKcGLUzo389Fwme+?PnQe`PDMcBCrT83oRw-@6kG<{?8|)7p*6)2kl+jue2#NI*mrV zMLSD7NjpV5O*=!oLAyyiN4rcL!yL^lX8M^6nIyA?Nie&xrm`AYFS9$b-(i2qzCxSG zp1_u|rED|X#NNPu#J|5*y>{j*#-g#ax z!Sm_<7x#C90RpSQF5n7tg};fKlJ6wnPJU7Rk~m$QC4NEjuH+rbE=dxh9#D~^y2i3*4x&1ZGCKC*}k?>Z3ApS z*nYH?*xdHT_AT~@_6v^d4%qRFbFZ_@3Z>!Ow!hf;>TnAXnfPI0Zg|SCA;=3k!us!hB(|utnHQ z_?j*L0tsOFd^rob@F>jNDZqyYkt=Z z)C|!4r1?az)Mx5@8Ilc&27y6hkQx{Uu0duH8m1U%hSXGvCE1c~Ctc}TMAo1jf6k_y z7d$U{UiZA^`O%Z(DfX0j0-hV*yI$D)*!#M#x37=So zrA?vJ>Eq~$bTNG(T}bEBsdNUNN&lVx3w6>9-&9&0{pA?q`CI@`wnkn=6)BhFCH z7aSVrOU_u%D9(?Z@tl#I-kh&F6FEaTzj6k1zT^DF8N~UR^BZS4X8@-^rw`{F&RrhB zyUDx9o0!N<9G*BOu_J0QE|HcvG?9@=Py99U5r3$lUQjNWD`*hR5L64If>OauK}6se z%n~FEMZzSZP#6%F2!q0JM8icRM8iZwMIljGR3Qq8?j^r24vGuKeladiko1u#C31;F z;*^|~9F&}q9Fl;NdlEu&SMrv;yF5=GlSkzqxm{i?H_H9;EP1xvDNmP|%gypCxk+9r zkI2LF0{IZtud2Z+P=%-^8k&Z#VQ82dk%p%cYbI#MYNY>y^E23*M2$*+L_g9XHdGtD zh9X0;A>UAI&>38YkRjC&FlY@?L%G3i$Te6D*#@hjz+g9&8Y&D`2A{#6nw9EK%}AA7 zWEQDqr)9e(n*NQgzwKw+V4KhW$bQ4I&AHXN#c6l7W^r?(o`|R3Q{}1k)OePA%)ast zIX|JqSL!P%K3+`m{~Q<_;0Edg%F@)*6{QQx_LtQLmj<^7cL#R`cLuK|heOjt^Fy;k zGeQ%>yTb>=KSaNa4v6-PeiQwI#-pXvN@%sT2HFDJLYkRgPcNmX({tzsdM&+#UO>;K zr_ycoB6Le+u|}{q zvo^3;Yz~{vX0p|62Rno9WS?fAWS?QDb8P>D^An<+3{EA-!^z}0IC-3MP5~#26XK+C z?3@6nh9l=_IVBu7r;O9W%T077>Jn2DWr^xUWnxz12Z9NLaf0!J(E^TOvtWbZq+p$3 zvEZ0sx8SJYkl=vegkZm5iC~4`xL}t+B2)?$!kDl|SS73zRtsx|?~BHZ#&pQ}Ib%g@ zMAJlTMe{@pM9V}gMDL2<7xxnP6!#W)7iWlT#4&N5xKbPyW8yC)UrN4~cqCp)jwDNR zNpe;4M1o5Gki04FA^l$ZleCw#pR}j+6X}=IuciH^y`{b6J>|pXL*>KeIr4q-gYup7 zE%NR1b@Jo#3-Sf>6Y`Vt1M(18x|TK87>-58?JW9 z`C*l*WvS(<{?zK!Z!F(h23y8kG?o<0R?A__Im;Q#QOmsax#^AR3({w$|8A?dRoiN8 zdG_sg$d1@=Ii5I%I)^()IQKdCI$bWOtHt#+i<1+`Dam=+v)(hyGu^YyGtINWGtaZq zGvBksbIbeG+ts(iSMRI#E%I&hHTu^1miZR?X8D%**7|1nmijjP*7#@zX$2p$v_%KX z4hK&Lj|EqS)`pgaR)_Y4kA)qTp2`oR!=uBZzeY!Qi2u0fv;WBGx@c3B6%)rAX^Uu! zY1inh=u7BZ=vV2-=tt<6=sW1E>1XLz==F4Q(>6hti=!wj7W|%pZ zNn?#-O=L}BO=eAEjbrU$?PKj=ZDVz1C$clyHS7!Qg`BONxtznCeVnzN*_;)eJ)G^F zO`Q3hZ5=ZH?d0s`Ea5EREaPn8%;U`AY~lP7->6cOI5lxb;`GGBiHj2>iCh6wKo`&i z48cXgS-~HI8-gamOG&o`cLnDKw*@aGwF**%Gla8+GlkQIvxF~*Xd=33ifEGPoand+ zPySH+xwwzmEuJc#Ep8FND*0BTk`zhuC4NbXq)-x&6ieQceklD|`nmKC=~vPz(p0Hd zDwmFxj*=RrdZ|vTl#Y;Jl=o6}Ry>wJkiVdKD1Rbb`1R{fFj+2GpF?9M#;{tkx{ipqggQ zBh60DG0jTNdCe`&TFnv7Weu!ZsyU~*uDPT+uF>gp^#%G>`s4aD`aXtzhS!Wg82cGV z7(X|@ZX96z$oNi&_>ce9_`7kaagedM5j6}kerX(R{Mz`P@h9UO#{R|ysq0f$q%KTd zlDa5$ZR+CGnWHE_+q%TiDl)g26Mf&@;Z*6qjWE;&k$+o~Y z(>BXC-8RFPVK1;3+KcRa?Yr$e?7QqQI7mBT@9cQZ@znm<{)*$Gy!_?mXbkad};TxSqJ&SueU@c2nG)-LJS4+@0KmbINkI-3bJ}yubKbMVv(t0XbIo(XbJ%m)bJKIlgLpsn-SNGY`*Q9L-v!@oUqbFJ z-;24ObC3JZ_(0zaxfgvWeaC#4eJ6ZZe2;vcav25Ag3JO}!IUC>k+=9{@vHt9{V(|& z0#gIl()7}mrH9H6mI1-r!Rx`h!CS$OsKJBaz2MDYQ*eLiaA;d-M`%)bV)#(lSILM@ zicXGBiOORsu>-LOF*x=@)!eEJRadH_)z#H}+6vn1jINB&7?0>*Fg|Ax^sgDc7@Ziu zG5RpxXS~Je&S;@i7(EzYF+ln!jMo_NG2Ugs^oR6s8T}Yf>HQg<8ClGk%vsFo%tOqB z%-zfbOddFcD=lU`5ioTL}>MN5S%gsX)sg^Pu&gzJQBg$W|2h$~`<9*CZZT19t7 zO(H;qiC#!XL=Tg{755h}5HAwX5f6}*OTv12Tp0rU~ zBQ2FyNCVP*X;eB+4$EIv{2`|)hAO^Sa1|pJV-K>Y&ns?$81%tKYwPUqx?GWuqEl2ycc7^sG z?PM)e`@0s=Fto$9ziCHl`)S8$-`2jX9ijE>i}h>tpBcV1d}a8;(ANMMbjC_!k+IOI zHf9(dMu9QXA>-fkwV}aSY&02@j83Y=~vV5reBW#iAlDJY)LkOZL@8cZI5laZG~-^uIpg_s|BL(cjBhhO&ghfzLk8E$ za7vvLC(kK%COZ?INzR+j8_qkILuerOpKX!lW z?&0p{?&*Ht{eioy`#pDW_b)k;oQj-XIoonNdEWK(^t|VJ$Md^qmAA25o9(eD2DZXyLe!l*`uYBM5Hu(DIvT`}O6LSaWGIA&6{**f~ zm!A7W?vUI;x$oo-&mEBaRqm(`@gMzsZOAF`7tAk+6wEA`R}d(eQBYTqTI4A57WstWo1*Qiar3=fBmz^v-QnoDkLa0*+ z4^l!cK_vK6=t=P95D}~lT?<_bT@SIsQ^J$OXTz7mXTlf5=fb&_@~9#z>yYb4PQ z!rj8oqE|()h@>KsC|UGMa;M}sl6xojO8zvtd-B)GJ(Ax`?wkB&@;k}blLw0jiGLLT zEM6mCD_$*LCEhIlN%FHKQDTs!Nc57Jq*~G-sgg{SOqJA0a-=h)#nP$LxzYpDmD1bN zP15I5y`6cNbc1x2^rCd5^sMxhbhq@1bglHfbdU6Xd2ji6`BcRmg+&onOjpcOI20O1 zm14dkO)*bVtjJZ=D)frEiabS;qFOOcu~1R22r4{^Oht-9t8gijRXi0_B~T@*BwV_R zui~mWsybDzYN6_g>VWE?>aZ$VoupQ(wQ99mtR~fGSiLn~?Go*DZA80Do1?XBmucr{ zW7?(KT-Ut6KA*Ur^8YNu&^+8^}m{{{Y&@9FRB`y0xP8;!8>oN>AFn(?6V zrm@x7Vtm=O$9TZF#CXiO*m&7U8rK?eBWm1bJZ^m7w90tic+Ys&c-IIT9~zsCyNx@I z^Nsh7Ta34jWNPQME@@9vAEo|oaa+8W57K+5_ey^|{k`NhR%SnGKW@KZ|JgCr@tb3iW3b~FhdyIe z1}#J7)H;pMR%f}Z()DrXSDC#tzsdX}^S#WEGQZ0#&x&PLW{q`^a;Le!a}RO<<{s{* zx_@+!c7N|4>Hfhz!2NqpLrzW3!JNZ6$8$dLO!SQPeDCe${mk3n`?Z(q?dyHf_ml5u z-yq)*Us-NLZdGnZ?)2Pf?xx%Yx#hY3+(>S5?$lgIZf0)QzhL|?$eokREzn8!6l^V6 zU9huYRl)9p0|m7wM6%{QgDldu_l@^s0MT&#P{rn&LKl6X?AK?Gi-^btE z|EYgMASo~}urRP7FgGwiFejiXRhMoqU0-^k>`K{tp{}9#L+^w>3-t+o80r@48Tu&n zap=v^r=eb<-k}~H;y<@3^dR&klo&o7M#HzmH^O(q55mpi;!0iA7EO<4L{p>Is6Fb4 z8lqdHccabGtF9}q7pq>XN~*n8XKTo5nANbMVLGFfkez;R&WcsCEQ%@3hrWVBX=lwIk$$p zfxD2qjGN6Z<}Tn?bGs&f&+o?{$nVRi@(1ug;eW{gm{0Os_|guU|9rkN)R9z^l#^7R zRGTy>DP5Q*JT5#aJRv+P>>_$iG(a>tnUOp&d0g_72m36=~d|mvd?5K(w;Iv+A2k)S{W#PLxxE^%P6w9WPRilZj^I)O|D`YFf0Xv{$ufwP&<1r(DsZ+K1XZT2gyl z3u$j?4`>f*yQaLA@2eU(0{->842|IYBe;TyyErokqT=@Zir zCXH#L>0{I9rq4{hO+pjj)Yrr_nM~iBzA%|h15Hy*znH!;jWT^`8frRV>WKP3pNwMD zdnTGmVH$0+m{Lp<(|c*}r+tw|P5UHmP?{<2gS5$(Jd4LNDE;&Ff$3kT|6=WD{n7fV z^>gb_)R*6*#otzTHbvVLy+!lt+BY}aiUY&UG@Y-eqkZC7oX_AGnU9*l)qyG?G3Tjo}~x;u}1GUrszYaW&--^2BCypz04FU>o|JJvhY zJK4+jTD@=iKJYc?zLZDgcFnt*yDRs#yluIUa=~0AH!-hE9+3Nb-oe}_xlr!@+`)No z=yR@~8D0^I17yK^tQ)obFaOj87pwNq9G}Jl#G^7Zt z!bieA%6pc7R^GY%qw=oh-O67n?_OR}8LTX+3|Bs%?tgJdD$6U&D*e&2Xi3x^&5ssD zOQV)(UUXY@S9E7|cXUtmQ51?EjJ;gdsp{3LJ5_h99#u70K~)c`7FRE--qCQV;aG!@ zwurHcv7E7jv5T>pv5>Kbv4OFKv4@evaRWIxB3Qhq9bTRBwuk+PriTjlS{Zss`J!U>QePfnu-)-hxiXqN^zt}Q#dKM6l#hu zWnzjpMV}&0VW&7#3R03&6e+@#ae9k>tA30Ag#L+sx@n2&glV;DyD4ON=kzh@!_tSQo2^M!u2o_cTSr)jSp`<1Rb;i>GHet(V0*z1*+5&1?GGDbgKd}X zSL{NE-l2Ag9STQB^#A9R;dJO628YO@a%dfL$3sV1#?p*fMpZ^2qc|fgBb*V*$jNXy zbDUo1H+h?!AGqFkeeCMt>f`#z)##e)a%67JlxCVTHJQt@R%ETpinyKbu-oenx`l32 zPD+k0$C5KIXKv2S9G-{oDe&ZZ(!8nO46n*-@}_(B9pXR1>2-P4-j{vje7-zK-tTz> z@@#qPJbm7TJVTx^@3*|4@??36yp%j+-q<{Gfv7-IKo-1R_-f%Rg_Odl1+4`y7QR&2 zsjy3-py*1`$)a;b7mLmoT`Ia(w7=+7(ea|X;v2QD3M z`;C6N-{d#=o&HS!P`}nM5BLMcf&GC!fxUs9f#rc6f$f1^for8#N}Ea_mBOVhrFTnj zmfkL1UiMP3bMR?dmk#;<{e1Rs3@#5&3QY{LLnA|+&~G7bh!GkWqK9aqDIsQPXlO*} zt?)ZxLs%D13GWO4T%K4yxcv9>;pIcih2@jVmF3Lxf#nm*r<9K=A5uQ7JgK~@vMO2; zt&ARu9*FLX?vLWp)+iapqP&R$DBRhO!_s$Q>pT!mCUpYDHgKdE|JwW4}i z^~&mNHO+OthBq4DZv43M4&x!?7UMMI0pmR56ypfv7z1P+W;8S8OqiL=^05Z67qOpm zDZJjicX&^@J$RjXoq1h(Z}4z#FJ2$stGsSJjQeh4uS6R^o1e>%@cn!zKcDaBKjD8a z_*BqWpcAABt|i@0YEC+nbUNv5(v2jW@UrlZ@S5;PI>dkE^R?kH*(8}mCYLE>5?PXrFSE(|$qSWyB}X|^ znW2;@T}q}>qa3I-Dl?T9)il)^)oImq^;~tmx-MmIN@dEnl*K70QVyilrmRWXkg_0U zWy;Z%Ln(_=4yMdb*^x3MWrBXP{zt=)<{sv!rnk+A>1*>)^T+0I%x{`sG=JJ5{v-b| zJu-DN4=@il|6u;i+|%6O{Jpuz+|PX9^nw{O9W>#linQu9cbY#fFReUnsHNNzwTw<@ zq${lotInEgHChvFVcVDXuJ+gLo$YViui0Mp6h|@k!xCJWoAjHEi;x`pIMO^%v_sUn3N9IwxN$J^q4#n;34k#CZ3U*49y-FZ9ns`DE1mgm*w9mrdow>9rXUMO#4-m$#> zdBX}nDEzhX)56aS2Nu3t$SwT2@asaj=*42Bh%6$Co)k3|yoyrE~a%GV+q+F_;rHm*m zmGhM4%Eih>$_2_AJv&md$c9~PnN^{K2 zH=i<@%~G?(+?cj7ZCTpfG@hl_LQ79fPqCI*b35ew=ktvM*;bD=$M&)PYkMDiU;7vK zPwb!CYwYXoH|=GPLPx+6c9b{{WbDdVpRqqOSkf@4n=2a^G;DcVBilyBpl++>o1e z+j1N^OLCr1_rJKCbH4D@dh5LP-l^UiZR$_wVy>_iynp^`G`1@~`%<^Iz~!4$uOIz}3Lz!0o`z!2Q63!1ch5z{SAb zz_oy}w6SzXY5%frWgnJ(TJ~ny*JXXmJ}LXCY<<~>!QR0>!LNf~1p5U)2!8Z0c>nu6 zm=ZFDv>{{25u%2_4SyLP5H1WChfBh_;a%k$%GZ?NEnirEvwU0mit>%+$IJJW1Le!h z7ga8+Oo(-gy%Osjlg3J8C9z=aldAqzA5^WV>Qeo7^;^~NR$r<0!=i zUSft>5f;o6@bo+lpB@jl{=Mtl-reulv|X?l_!;(l~&bm z^*;4F^-lF3^;-4sy1}|%bON1T$JY(fjn>I^GTkKIINeV=iEg}3pm*qBHf%R9Gf(S~ z_n+r`hIW`|nzxzfm{*v$n%9|En`fJ+npc`Pr|nBSnsz*GZ`!G}b!msw&ZS*U+mW_2 zO`Be4onfuAHd-63*R8MHy4nWX2it$K-?87aPjxgn8XdD7O&RAi?q}S|nC+b6qPfPp zCc7rN*1OJScF)?Ec{B4u=C#b`%-fl#vQB4p>5%>7-LqfK?w$Qv_D9(tW_Ql+mhH@0 zo&)57IS+Hb@~rUA^Un3QdSCVNeFERad_n&Bd~JS8{;2#3`Nn)*zBoU(u(7bAaC%{B zp{%H1@ejqH7xypzqZp{ zKJsbgae4npLgf8_f&ZLtkuM^jM0!TPi@X=vP&p?$H#$FhD*8sOd#qQiYwYdVn=xTb z6jR5lV$`a^RlipKT=i|$kgC2_-KxK;{;0Zl^(WQuS3jt}UJX{St=U-9TJxahtJ-jF z&-%~mzo`GJ{;m4n^=BJSHk3BjHTGlnVSd8=fr+xpcphGem(MHg5dTp@-YNbG{xSYx zK2_LH*jMNh{w&gpHYTr6-juvHSudU}*(BK~+b-K9yDd8)`$0ZXeptC*c~*H<2`FzX z?<+y&b>#!4PnD}Wr#`Lr=qhx1y6L()-38qYUA8W!3+blnMEb@0^ZHi}XU(AbiutPf zg88QTp81j4W4>>`W^Oj0GCwo}<~wOu(jKPWPP>)%Ankq{l6E!iC(Bq%YPuzTo^`2p zwso#`tbL??vi+`og=4;Bsbk^4;QP-U$0Elg2cFTAfn+?&c)>ZxIp3M++Twa8t83QN zOg!`TtgD${yF=H>`~eMvwzPXkUb`QME1b!A=%@z zf65+~{eAZ6960B3PMXK!N%fdL>7L!*9p3fc?cS~4E#6JuecsL9CU0k7ns0uG_z%v@ z&(5#Q59e3pFUhaXFU+5t@6Xp1Y%M%ixT5fQ;qJl(g&PXj7w#=QQ21-{pyJWRgNuJJ zUReA_$vY+QmGmy@Qu1-hhb0Lm-AYCTh6U0CErBP2#{nYH8kk!;p=?sw__B#*qk}_( zBZFgt!-6>>cPKC94f#Tz(2($qa6`B*JSF0bd=;@pCPq||Ns)IW*%3oT7)gyJML3cD zl?N&hR_?9bUAZi}HhMbxLF}X0)YysG*s9f4KUKd_^L%4>M{xg9y|{Kk?flwBwZGO6 zt1oFd(r~%qV#B3|3k^dXCpBJYSMnC~&hgLk2Md!WH)KD`5hbL2s_dj{QMM{^vR z^%t5Ix`nzOx(&Luy6w8fx+OY^K107m-#PWQ)Tic7sV(O2sc)vXraex3nnt8K(rxK; ztXr%-Z9F^Q-Vrrm**7`1I5s#oI^J+DcFJ6Gm(;b>wae8%>&vWuSs!J6mi0;2oh(i^ zH(Q*Ylr76J#Z=*8%{=!NLzXy4e3*z6ARANYK2xF|-( zrc}|ZCRfp_*j4MRhE@-&{=NFU>RHuq)NG5p0O(Xpucg&asoh_@ul7mp-rB9T%=+Yd zY5moPo{ir${>YrgyUf4Bzs^U6p~m}SNQTQW87iZw-c(&xUsB)FUDBP`ozV48?UVXd z>iel5ruIyIH?@GP1gO^8`eTwfi3>$(!R&>o^zQ~?@DnE%^H?9 zIP3SUpR9dX5&g_(IU3Pv>diLs^bvbKu&U%~kFXi9OKb3zo|5iSp-&*)`QP(1} z@M)p6SW?U@78j2w5tZ;uCX^(V&`RhfV@m`juaTir&;I->Vb#W}G1U{Qd)2&G)3vs#_D=2T+6%SC^|E?Py{_I+U)~UFh%~HhAXsyG zYj~@9D|s7vH~GVbql9iDCft`y$XaCYs(Ps2Q{7g7skyHkno3RmA+?(&GyRBFZdcjA zaQ1V4Pf$8_1jE#Lx+t2E1c3SNmjPU?YZK$ z6q}15$2V#BDt)IkTox&l1;>X+S1>DB6~D)Z#&*QE#q?G21vxcSYL3^uUpt|0K;6)~ zU+YfPpQ#_%XlT?mRx}>uold66KU4Kr^;6wfchjG@?sqA(6j`dQNOm;4BKx{`aKW&G z0Y(0jP$(EuR7fk77224&N>rUxBdkfRIZ<=6=2#7>GN8ewrSy&~0+Wy<=sXlwDbvTb2YMQTM_mALwJ&1ba-8;l|f}v<41&3IaDr{M@^*isRC*eRY(<4 zlc{2=ges-R|Kd{>R3%kKRZ}%oEj5Lzqw1*!s*!418YW(90wVWEEPNPnz z&Y;eu&Z5qy&Y?cv*xeD_bE)&F^QjA{3#p5!i>XVfOR3AK%c(1!};48>yS9o2gr6-02dRgshp9)XN2$lC$Ehc% zC#k2Xr>SSCXQ}6?=cyN{7pa%1m#J5%SE<*i*QqzCH>tO%w>zZ%cc@L&X6jw)J?eex z1L{NSBPu`zsSp*WB2<)$QF|oxOn4!oSHe39?MdBPV7UnYE& z@O47Jg#HQNBz&9jUBdSX)Pw;EKP3E^Ffie#1ZKjZgr5@zCk#pWCE?eE-x7XL7@9CF zVR*ubgpmoO5=JMCNf?_jE@6DagoKF+lM*H;Oi7?6&=aJ6Wqsv+6@8U`RejZcHGQ>x zQ~Fx_+WOl2I{Iexb@p}j&Fq`i*WLFo>wWx>OP*qqS)3F_>X09Q_$!vgQSFc}{;Auf zN>@n~&sI)M@FuoYcthSu{2WYPONv+Lje0Y^qr6$((O$8a9zP9}89x(~?c@0VI=_qW z8|xhxKWWY0Q=NFO`DHloloyG_>6JS7G_^+{C`^9Eu_!t zi*M-nIeZyDr_bn>#OLqn@%2(uyk4Krm+Q;(<@*YJg}x$RvCr=-@de_0^2>ZdU&t4Z z@A8lMDtwi`s4wQLitn4P@tM8y_$mNt+wA`|%Aa1xW>RKRW>e-+=2GTS=2I3>7E%^b z7E_i`mc~7=EvKxYtfZ`>tfs7?tfj1@tfy?CY@}?WY^H3XY^7|YY^Us??4<0X?56CY z?4|6Z?57-{9Hbng9Htzh9Hkti9H*S1oTQwhoTi+ioTZ$joTpr%T%=s0T&7&2_ zkODG54k!R65O-SzXaFsc0_XreU;vDO2`~exKpJ2H(g7=A1MGkU$N-#x3&;er05^~g zcmOZp19E{pARj0I3V|Y^81MrnKmaHO;@dod5D*5+fe26mR02^T22=snKn+j})B*KC z1JDRe1*QShff>L|U=}bNm;=lO<^l781;9dJ5wI9o0xSiV0n33Ez)D~huo_qctOeEq z>wyixMqm@L8Q21B1-1d(fgQk3U>C3(*aPeZ_5u5W1HeJx5O5ec0vrX70mp$8z)9c~ za2hxRoCVGS=Yb2rMc@)}8Mp#m1+D?tfg8Y0;1+NjxC1l+&A?sY9&jIc06YX90RR93 z5C8)RfC3nR0|Y<0=_2GT(W$OKs+ z8{~jokOwA$d{6);fkIFO#+`G65>N`tKsl%Ym7oe#gBnl^rhqz74;nxtXadb(DwqaZ zz;w_G+CV$#05d=*=mImrEYJ;RgC5We`oLT;56lM(z(TMHEC&5x2^auN!7?xihQKgb z4o1KVuo8@dF|Z1(25Z3hLGNHa*Z?+yQ^9HAbZ`bZ6PyLk2Iqit!Fk|(Z~?dwTm&u# zmw-#bW#Dpf1-KGi1+E6yfNQ~Z;CgTaxDnh0ZU(o2TfuGMc5nx{6Wj&v2KRt_!F}L< z@BnxaJOmyFkAO$PW8iV{1b7lW1)c`afM>yT;Cb)@coDn=UIwp#SHWxGb?^pw6TAi9 z2Je7PU^93Zya(O~AAk?RM<4)#AOyl70-_)W;vfN%U<=p^J_d(FBcPGcC}=b^1{w>E zgT_M>po!2VXfiYfqCs?s0Wl#K#D+K!7ve#Q5FZjiNstf{L2+l-kOY!KGDr?7ASD!c z31BB&VhLnTlEDuv3RAQXbaP&pKVDxgXz3dNu*s2Zw)YN0x)9%_IZp{dX`XgV|l znhDK(2pxhBLr0*a&@t#ZbOJgFoq|q7XP~ptIp{oe z0lElXf-XZ>psUa|=sI)*x(VHaZbNsVCa4*@3*Ce6Ll2;b&?5+dKnQ|h2!T)tgK&s| zNT>yBg&sr0;SumicoaMu9s`es$HC*_3GhUC5Mo@Y=P5ZD{O=9aQrYl z*a^GfOgIa6!`ZM0_QF0m7tVw8;R3i2E`p0;KU@L_;8M5@4#FWg441){5t5uOT9gQvqY;F<6&cs4u-o(s=|=fex&h43PHF}ws`3NM3~!zOp8gSW#w;GOU;csINU-V5)8_rnL^gYY5vFnk0) z3Lk@y!zbXA@G1B-d8nTAY9W*{?>S;%Z;4l);+ zhs;M7APbR2$YNv(vJ_c{EJs!#E0I;mYGe(v7Fma^M>ZfEkxj^EWDBwt*@kRKb|5>E zUC3@^53(28hwMiVAP12{$YJCNauhj+97j$dCy`UgY2*xY7CDEUM=l^2kxR&BIieLzi5D1C1Ag#z_WH>qk z9f^)YN26oVvFJE-JURiLh)zN$qf<~CN=F$e6J?=nl!J0n9-4^qQ30BS3Q-Z7jEYeS zDn(_e995u7RE4Th4XQ;`P#vmA4X6<{p=LA{O+zhcI%-92s2z2n8K@I=p_ynF>PE9s z59&pIXfB$E=A#8@AzFkMqkgmm4WOlH85%@GXc#R=BWML$iAK>FT7_1lHE1nbht{JF zXd^lmorX?FXP`6DS?FwZ4muZ|ht5YApbODO=wfsUx)fc8E=O0OE74WxYIF^{7F~y~ zM>n7w(M{-PbPKu_-G**Qcc44bUFdFf54soKhweuYpa;=I=wb8-dK5i|9!F20C(%>r zY4i+w7CncaM=zik(M#xM^a^?vy@p;#Z=g5PTj*`{4%&n^qj%AJ=za77`Vf7D0w{<= zD2yT~iee~^5-5qbpsna*bT~Ew8;Om=Mq^{JvDi3lJT?KFh)u#KV^c61M#mT!6Jud) zjDvA89+rslF#(o@2{93tjEOM`CdFi!98+LQOogd24W`9XFde4H444r!VP-59OT#Q! zI%dUem>qLq8JH7uVVPJK=Ekxy59Y;uST2@_ZSR*zSn}$utW?(b1S=elB4mKB?ht0 zUpqpieVUz5g3WJV6E6=Y&bpwABm5`N8@AgvG_QA zJU#)Rh)=>N<5O@NPRAKI6KCOUoP%?59-fHvaRHu$3vm&ijEivzF2!ZI99Q5A44Y(0E;buG)Ps1&EI&Q^nxE*)k8MqU7;hA_A?#8om5AMZ%crKoY=i>!< zAzp+R<9@sZ58$PE86Lz#co;9oBX|W~iAV7mUWHfVHFzyvhu7l`cq2X)pN3DzXW%pO zS@>*x4n7y3htJ0s;0y6Z_+oqsz7$`EFUMElEAdtMYJ3g87GH<2$2Z^`@lE(*zlLAOZ{RoaTlj7K4&H<}<9G3U_UBqr;53!fnN9-pK5C@4v#9`tHag;bl z94Af?Cy7(UY2plVmN-Y8CoT{diA%&~;tFwxVmLX197&EMN0Vd7vE(>%JUM}!NKPUrlT%0< zNhcX3lVp)>l0$My9+^n;NdcKe3P}-}Oo~YfDJ5m3oK%oXQbnps4XGtlNFAvs4WyAY zk!CWLOd~C1I%y?sq@8q-8KjeRk(p!`=_a#D59uX+WGogBsY*_;AGx1AKprFyk%!469J{1@KYM4@c2bTv(EUn?w(pE+{M-_&~2pBc}|iU)U7c0B&C%M(wX_FMh# z(v=kyim%E0EI0QVl=-)lOA6xn{HDBkT=j*EBOe3%;aHrt2T`;dsgNIA&Zt?`nAXO$udZ(M0Y_si|c3Jb97T%#y=C+qjq1*fhUsK|H-E9u_y< zjV)X>-%ocxp>LY>Ed8Wm{Xky)CYZ+wE$*+&}Ynv|(4bS$bz1{3n(| z*%gN;R6Th1eT&hsJC1o6Pw#2k+fH||=~3&xIJ`d|4m2HV#{zL0Fdm@R?QK?oThTV@ zJK9o*<5Xb04UaTg?(UD{kH*u-;^BCcJ>H%t<4{Js?M}sE3T0HA&Hsc>H=U1T&bDFy zOrL9mBK|W?7oOoR#-ZIs6w0Nh%g=Cs(o!hb+gH(EX~(PEX4S5@rLM)}t8GyDHidHj zKYH|yrkm~be@Xdge5)<@c09h*1~vVI`s{z(yU_d(ihoL^Q0_L3Z0}?Do7TlG^{DCL zGoDfHmfI57eplt%@~QD>%~M(!uUlq&tATB_K$9$X+kdp;e0zVX3muI24cD`_{IgV~ zjS_w)`!7v&(fQB%*q<14TZw2B)JB(D>5pOm;Gj_OXBe`nDeQ{xb0eN%?)aC+OGR3n z+FC-~Ci`;xQ}NdGi}|;i-HCB2lj321byDN8wjMwh#h?0k_|L1N zj2?abY(@CwIQ^yeQF=;qX1rZx#eY#tF7&r-4GzKFh0bv(f&rqxgQj zb`Snh!$`TY`C%LGLGhnu8QS=C@mL=ZDQzi7Tl`;|`~{hs&29M9=CuFFPj7=Q?U;;s z53shw_Wz*zO9HFJ)`qJMFZ+)tKI6a9{b$Js+J4!c&uA9>t=_I@_&<3(@sv9rvYNBw zapvFh;_p(;t$%A@Z#+M*jb>X(ZaZy$+r1zj7d02QS2#VSE25YsUxM@8R}w_wQPU;<@2?h16Gc8Ut{TbbiHfUz^toVI)Jj`jH z+dQv%etZ6c=7n*H)3~TT{a=!>>;H?r_W+BdyY7eO#EH}0Vkb@<$8wz5PPNmWs@??% z)Q~^|6+i_E1VUZb774cZ-qd^V74_bGmu6;{T|m7{ixPjoIeYgq3%qaae1HEx=X)~G zGxwhIJLlee?zwknXO|(5=Xn?XX49sojZMqg{*y*+Y1-Pf8J63~TFtcE!3DT&8v99g z5BkkpH^gd3Q&;*1t7GJ@c0H7F`|G;HW_QyX*G|&!Y1-Qcx36h`8_5CiX7>Q>n(s|n zv=(|$yY(D*7*tQ*mxEl6PaZ@+Gallyqo9s89Y=W@XJ39-Cz0pWSk5$^Y&y|&irLIp ztW;Tlq3L|nInr%ua|K9Q_hLP{18?U1qsm;jn_kpCfKCUaROh&lAchw*_G0Duo)YR= z(|*U}rbo;YpJQ|>%sZ02FQTuk$t$zDUw?aFo&1y;^2PhC}+ksq`1*$LOUeai?!98Sood(XqEbH|+)Els)j?WlH32~*(Wn4O`c|!9@L~tS`PZXaxCWF7N;LDrCbSF2Z zxq@sfxd-K#rZ$^QXWbh2n*i>AA_2a$t9GPj9Yi?*Gw+`I^DJT@h}> zMzqarp4~hPvN^n!xkSz5yzFm2=N5ocHLFo-aB7lD)Ne80Ghb)Z*h zS}i8q3?0gi9ZJ)7UFfs1=@T&K=An{|ycK^$pW`gRSv$nqn;p&0=BFMTXSH)V+Fa+yI^V&r(?NI4l5LJ!_F`_UT%+J` zu{Vq6*{omUU1~k#n{L?6pAw|rPrjeGdI*{_{Q7Dst=>g!|5)aI&+dMfLw;AE4S9ok z1z}cFxym~jd03;kM;Z!VbR0J3@@#|WhSlDtj^)?@qlhh@+9z?-xO5EjAxxsb|^O2qmI`aK6W#|1oF_0Gjii_pEM(Y!J~WL{?^Zy`nr@ATvo z*JOLtYlB|!HhLxRMNgBrh@o106r)VCDq@1q^60_rdkx3Cpne!IhgG|i^%UB7O5Qb z8|Q~M$kslzQb$c=_-udlcJsA(kKmdZ;?J*Sq`6vL_LVP zSix%inr!dpx>%US&Py0+V%83q#yD~82>3@~E}CphL)3`%@0n5pr;V<<~~kE3P2BKHI! zCi*7%5*Y6p^hiEblo2b?k15bj_U&_*qn_oO>Z|Zo`sTBCru(XV)xK#y(NyDWbW4iJ z%)-?HYTG_E!wmW5vLjm6}2+OssX*$b<4UK=v8_x*)F0opCYx;r$ujH zDEhA>FX8<{6OQvx-Fk5o(cR<3m!@0m>4ujIq&vvYaC)o2O$w0f7%;hUmZ8#2xVl$#;P zvKTEe27T+;7`;pv^7%pe7$;j|t$G&H+`Tg%rkr_6Hj7B+vdnNSG%fZmfyIm#T$@SP z&%2Cycu(``PK+r<;VflcrrHn@RCpY*~etcl!)9_7wIun+aTVf!vF8ANR7~*WDF2 zMA;sHz;VD=fILdz8g|fE?^|MdXguuOPxeQc%^l}f+hf~G%J#>O97M?seK~q^42VX> zz0_ce>~Y@K315HRtGY*eV{)af!eB#ePy2Sze4S#L)#UXIxM%S9$%lzXcNVxy@RDSE z2d<>XbG)?+zVo2xTZglqbe`^_jK^tC?jVcH9BZa_)9np1U*Q_3dz)#Np_gZ>?SQj| z&6A8PL6qX=SCF_t)guBH^yxb6#^@?+EqIq=1Npq|>tg?CTVq&ix#PR#JEDu(cA6)e zds3gQ`bDM*@Nk#6CVRdIuFNo=WlpWB)NtS4L$}GX-`&OJ^OQI~^3lrZ)R6^Q1MEb@ z1V!BL(!9kWzo&ob6Y$oHG(J^F!Ou3RFk|anBHn)^!pj55y0h!)b7X$pE*PzBcZiey zUCPc(Pid~XO$&G$gYmsq#O;ai5im>8%SOC|<1xcO^BprDpq@Wxl9#AoGuobfYAQyb zntTc0E6AQQdAe1(wkh)cE%e>|?+NwM=YXb*{{wM_ei@rE9zDrpE8nTpo4PEL_44_i1&WzZ+J|3gl}(wJ2kU`?EQH7&}M~>2!DZzZwzr3kY$NK2YqoR%fNLt zjq-=u-Cd@=jlo~BuET6T#`{gj`bU#>T8Fi1oZv6@PqR%hti@^^2klG6N*~L1hE{wl zRqmez^olnATJ;qQ%|y^sh@Z@)lgv{U`c|v9)HI-GFywT9bsL*OH0q-r_OcS#D*sAL zE@^ApSSs7Or?6K8m$b}7IS1!lobz$EJqi>SY29$l$4p>nb%4jOZ1{Rg<5djz1RAY> zfnU?cZaurIUPV6dqK7iqN&WvhOze}n&^sTU6naAp}RzzpBe;Z_@sPC;7+X>gow^BQx>24aW-=#q82JKCzFndV8Q=x6Om8ngn z*-PaGzyGMw{0Qa8gLnwKvoy`=QxyvNK!L;Gz24;^tHoO_) z3f_SrdtFZbKgo1AAsa^{dxa4^;(faf`7NAvK;QA-^WP=g2Pm)l1)^nN5B>K!jk{xW z1x8zC6a9OwkLt91zq<|pQNQGm`5W*CR@qKI5}cB`i>^k0Bq>uErLKwVMtZU_uP1$_ zmIJnCe-m4yGHNT)kAZAJe1_VwN7XWYkyy62q6{-vPRgng!e;CRVn z^~PUqd+i^MwYWGr+x-gYg^qV9-};v%v9saq)ae8G_x@#|gYb~_ud;mf_rNGyAm740 zc`UP8Ms(rN412Kb=^E(byyv{A7*7w1S3i!#YNLH=9A)YTAlE|IO`-1@Se`sexiO6S znZPp;Pi7QIjKRGkd5YRz&F5Gi3BJc8+*GX5Df|w0SKSGWe~tAbzxV1N7yw+~44<;~ zFx>{sPanvSx^wu*Wlj26$$h+IR0Z0(1bPYA;9jbY=j;rAFUFS(Ne)S~0y%u|9LR9D z6m3h2eRODGn8MQoUwV^VvOzaKZ#^yV055>`gmM7DxGD+Siz-R(IVT6 zNIr(ju^nL2*i=0}Q1U65=g6Y6Kxqev2_48}kB{5r@nqoc&`yRO4Xbh@vny|7KLvax z$)=*LXroQ_wbDF|yFfnS*j3Q7QlPiC%#6DQtS_66Ql#3pKWl`fZqp-il0HgcaSzvPoZOZ?x~M z8*X@o95_Vlw9?RI-D~dcQ7Qb&-sfP~I87b~={35wmJ^7DIxt>wy(_bS8R-Qkkt_Ag7#19^w8A>i~(JspYv=u7c0^f zSPNV|S~8QJ6=m3NLAeCl0QDMIJlh*kE>|;TXU(?2I*UEv2wbk)ZL5UD8Q9`jkD1+o z(?wn$K`I{`*?g}<8*XSkI3KW?@Dfr+9iu%HpQkdi!x!)e?wI>qUplI+Z=GG8Ck+8+ zVKD?jeT3C{$3{eInmH6$9Eb#3APGY=OtGWN{?QN2*hI$(8qExwUlCVa9bmC6a1A!O zY_#}vMJ=tQGUefu%T)~ZQoow0HJ@m;7JW?}>k*F;HVJdHF0hjCESJ#BnUt9u0-FN& zL2XE`4{U_LEg3#HgWH-RN&C&Lw`E}VIo7i{r%+Md_P`!O>_Yj*^_uTg8K*GRd0i0H$CeSuv4{=o6TvB1&5L1tS|^%2J5ZWa-E%UjIs_a}2( zVU>BD4xE6`Q#kFI)sunE?GOieo0*n)vQJ|;6W9iu9c=xcCG@#Zu(=5N1=5{oh&sn^ zMqOuh+g9+~eXhC0saDh#$gZ}N-w13^?nuTkrkjCl?X)TDTO@y=zfJW{jN)$K4$=3x z#eGnZt=(v4X;EsBV|`3JO?^#P%7zDo+(n~5WqcS|?jGY5AnV8Cu@+g_%YKPvPL+8! z&DlYIof8AEC}ZUw#dxa`+S8)}DbN5}6Wig_W7e?Tk@;$@xl`aT+qzO4iwPUYyYrs# z-C#JakY@7Ug!k%&(1#bity$1M;v9a*5->pWSRs+yc?y1|^I2fO>v*mFyk6_yLb3#X8(`W*{kl&P*v$LrlzyOi9+_kjXd(Y4G#g!l zsS$M#_5jrl=V;d!ORr$hU{|KW6)V_>=)O!cAlMI7|KLEBTHRxN7HYrowQdMn%np9Q zcy41PIl+Ov%|XF>*Wh3T|FZ!*tofB=2rT9rmfGLf4Gk`LWzz_!vavluy^F2QC+=PN z-#*x&hgQdvmk~@-N`6Ly+lZVgKwU_h(J0*%_o84i z=rJVC3+7UdZ|{Od>|UvtYY%*!F%5Msw@-A9BmGv(cKzrqsmvGd(m_=QV+@%Z^|WBnHJi{? z!FPOC4?0%RSoflT*)*2wU_Z9{WV<}9mHsTFQhwg(dvfcP1m6+`r zgAJYK!7wB)F7h;oxGXYcTeu^}LN*nW^^B4c^6}KNA$Xl4o#NAF3D)5nU=LCMHh~Ht9;cBp z2a{LoRtHx?G7GsYAHiTAzuQSkj@kAFk0fW?b^^66xE*E8yeqgDb?Vp=?18xMCVnf* zB>o#!O0z$BAb1rcIm+U)h1)zgEN3I!u0NdI!{zvUyWkB#V;K|^@ z;8BvELV22~`d|?KKN7rV8)VuX9L%pMH=s>W_MHo!4_+Ybb(GhL3b}V6{#QVcGv?7u zTqOBU&*k8?x~rhi1TO_|2FDuDk~}^3xoj`)$M@trq<_FrVMO(v=OJTEeR&T0HU96;o8U|Q|D8peh7|2 zW~{fybV=RGWD9Ty*sPziegtx}2w%Zz3%Pzy9>@{?X7tZNp=D`Jv5u>X$)Nrt_%5^%VIt^w8nGJG}t~1nmcH1ut{rOq#J3Q z5gMn6ObKkx+vkxld4%X6wWoqaL(&~K9cnGni>OTDid-)+;#wx@&-STO&o0HBuSdie zDs0r8eyc#$>P{!?n5K;Hcd1s=rIB08l0E37gGo$O>q9n7bD&sdh+?J!I5T!Gks*Pfd7 z2&*B(LiT}KHTxm;am^sghqK9TioWDH0!$x7Z9%S%b9Tcn_6%)JRrCnY)-Wr}LSgQ0 zf@cNMOHeN5QjEiPj*V?Gq@$Q-IqHZ4wI;MS)XTA+B;C!cxMn2f-v;n2Lt9X8#<_`U zw^F@5^b9$^jmdBy&#Ba?J1%!H)XtDqf!~AoTesr9p}nDv#Lwh+Bl|-8L-nBpp@X51 zxS|cAnNPYlC}!du&B0;r=UC``vJ!Ee&sNe=yhXdpc|5d@@h3wk7zdVzh+ zdY$Oav`^gN^7qJ{Ti|YT$?edc&<9%QNyiYo(Jb|>-;n>hhg^06 zIX2YvfcQ10-N=Z`$@}2;fU0+|W-Ii1-8t*UjFlDx=4x`2wS?WDTuWBNVv+kfv%v4Z zELV~%F#54%7Y&IaiMM(wX`r3FXBgM|P}n@o6z94Gs9`K>4J6ItS#$%wZnAzfhnhl9 zp}(1YhVoJ9da|qjap+0tDxWWvYl87PdAOb243GQJL;0xWR}q;zj(mC%dPBI=x|gBX zM9G?0L>ZVBehq3rTK6_|hqeEXw0FU+X8xY>eRT}=xQS)MJzxsh9?&)Xf$Tn_Yzf_m z<~{LU5DENl3i*{JUgp{!-3Vi}bVohW)(P{@m9K(*gT{a2CTAVl->)1H(zh z6$Za&3}=ULL9^8DcF%G5Fb^W@CW=J`CCb#%bV)3)j7(&2hnZOTIGkd5>s|y9mA;lIQHF9A%&SIpaBv zaI3X1zfQ`dn@KH=Fa$j3ZzFIbEw>eo`+6ZGe)o)cbZ#Q!99#1WBM zz#U_|7M@Ln=Yv0M=x>ZB_v$CIT_4||kneXU8)jiB%>nMBNQOIk7P(Zr%F+VF7M+&i zQW{ryA^1axrV;ggMJ~vCCuFq@zqL+B)JPUX12{d-MPVDt18i;{`QyeQ&5dkd2hB@+ zH~l);EC6i{t0+$9upOKk`KvrWLbn<6amkZzPq+nK7+iw#WHd$^2`>S^BJ4xim+xN| z$C_{ul9f2+V==2!+;Hn!;jbMdJPOpd@S*TQczEKd4>u}e*@TE4!T%(|Cw0T_@LV=C3!Hnyr;$Nh@qb#j zQ2W{5S^8Z>9S#px#6xbefz9$rbn_{qmmz(^`*zUs6#Sd;JF}g%12g9S5p>Uz&+-32{pf6*+NGjwh-|xc-&dUrvUEV?1I4Eg{%f+# zzr^TXu@SDoE;jH}yvg`Mk*szIhbNoM?(u%hXk4Y4CXXXz>0tRjK2mFpU=O~^=4)w( zSCRRAJr9cvjpRoP2z|}4pRcjmd4MWr+!)kjBlFGM ztP!kPEA9S*Yb=kJi(MZsn4YsfjEjti%>pKu{}+!umI;wE)H7&h&9gM)KbYYTi!`z} zbxe+Q!#+AmAuU(XQxx>nNCo36QCH!A!&FC>=_X(_(@EabJV{?eRI%fXKkdJpVFt6p zl@(O8tB$Soy?Z1cSCrGFe%JY2GD_t$_NMwomki{Db zN9rKoL8Es?{LJS|s}19Bpm|Pv^g!1IK7FW{Mm{7LqYf~9S9hsX10Ox;DriFgmoW{# zv54HXxxr23?WaAqt&?p3NXg4R8@UgBYscx=n8mf=j1;f!j^$i~?+IAsCh10*Rw?B8 zrrEL{{JO|Wlxs*+hk0BbDWfs2Ctok|lJd5F>X_di*$N+%Gw$>@MYceePoo@d8ie&< zfELuQk9<@rYNfk=gmoMBpuO+ikhdfcvpa@t;CFE3W>7mLU0P(Td(b!>hZOf5?S0{? zIAMoSzE)Ge_LH}R%;#b151#q48uu%aLy-ead&P5bVuUmm$Sn3tBx&JsWQCP5r;p29d?0d7b1J zB6gak%M5k14Z6a+-yB9;VjH>KhxL@3Pa=D0<;xOWHPCjHVK;b+F}CN#J*GS7r`(Ig zsYarj89&9-K-56$RRVNB8pShEO_Ad?YJ4IDx7hrVkaDYfwp;D? zos>o{UlTe><$IKUsLgJ|8-hJ3b`4$xlfQOsE`R?x=51a!T-&^P<3;-R0zwW5}(~NYYBO5%v528}0@L7?! zm*VAeh=6+`VJOPP@!06fwqUS5E;DMZzmYdo-wiI0v@q8avT34xD_H336FNC7#}(f7v+4fFH|b zrKraqLjk{>YZYM!AgU2hYBNsLVj6uyR@P336HYijQYn z2C9MbSVkz1DnZF%r=T4dad7l#Gh2Go6TxG;}AwWZq|+A*QK_$uV^LBWBA^z2TIferkjs?E~AzDw)BiP zm~L#JQD?{pv(e)YP$AFbQUmXaR@jV8&~Vf?<`17$X>acIiASzt?H}s^JG5mO+WSBe z(8K>bHV-L>iv$B?xc8u*4BZtoPgJhv>uF*UF7$UvR&KbeTH|7kkZ$p z?#1_f6O$s3Jyu39Z|=m8DeXpKV<h&s{03Aj~S1tBJaA*3b@uE0=qXuvVCETWVe>tS4P3IyMNG zT*s*o8-*H0U)I52`q(5iAPy$1;$z6W?KrpU@^F<(9hKl$vsThF+{a<2Hw$V0Fxx?v z7`H%n#k5V>%5~d0l}5|;4kq2nYFU;(3el5YLYmvnsil-dCoqbUEqj^t6=lmFjwxU{ zywk8xH~{H>uIWTaJ@||8bCAmuXl*oBQHbwdhlL};A+DFr9#PhxaO?uM?Qu-#Z$B!? z(!pM}BEp%tlR_q+=1vPInC6Q6lyC<05n8LVzOdy2)14RG_5tL3neiNx;hq#!j%N_Z z!=%$i!Axserrr35h;pqwE(w@8)I~*WcZK4X z;S`C3_WR6g9Ltk2tWNuqpnpu*vCs$%jk%z)oOFsL`N-rYWS!tBd>=-*PB<1~WHBM+ z84t|Hj5(6E|JCst8HrH}rPRWNmNKewpTO!y;hN{VA?cjJGOkHTdwc}yDd*DCj_YQI zdm=O%C+nVpvsxbuchK8OEiZ+od{=%hykbaviWXiFy_eR@YcB6Z#~aRv6=R-^Uccp< z6td&;ols6AjB@mQPNgl5w9AIHW?8#@PisDKFG)_da4Llw!E&aHh<)7E6(#m+eK*wI ziI({upn8eD#hy$u&DB@z!?iL(KBiy{{l$LbfDFw*F_Dqy&Y_N}-kt+&T@Lr9;pmdl~wN0KaG z94;OT_0$gocdHKjIc3c$mOFSJ$o#2Vln^C9d^MHjai(p?J+%gt{2# z)Rx=ufKNk~5^!V1M~*S5TaTW!q9-ufIB`6vGO<+bLD!ICTM;sQ6k#SR>?RRCSs|GM zx?I6eSFGq7G48B@ZW`&U#X{=$bg@dTXBjY6tc0!@ZJwlkY$hRRP$~Cy7O3Us4V1$k z$82z?>54d)AtIhR9E-alT8-&3s-e+}3&kq3NJ%x2ExZUxc%^ja-RI z(>l>08buS3Wa7WqdbBcD+!8C$m-F(DVT|Q1BLT;vaaStBR%jux# z6a8WUe2B@ys3VMCjCu*q4bG{KrJ~)L2Y<`JSF|h_`y!uv>BpK@5OyV%t5Ei#Ia)*f zYAV-?>%^*-O01e`wE9zhlgsKhd;+<-o@~%2)w<@5;wEu3li}Wwyl)YwQ+ChCILnba zHIzMDIchtjwux5sQa*NBhvW0n4)Gu?c0zkhf8DtY^=?A$VfZ^NZdXz7XY;S8?AS*L zHD%i=D(gvdK-@33pfAVutN67c)naCOjL?V0QP$0@jYHxQ@hC|TQkjWQbH~LK&~89q zL^i(*6?s|Ha`IDb(>{;~;#mc*7VGH<;&M)$hQ6F8%^8Kh)h2}-JT_hD- zj~@x&L{~o<)xDifHzqlwh+~fo)EL?;dPzMqq`fmZWe?)4kBwqqsSiWV&6t-IdL>4j z!0Nb!x}P+Z#~=6ShF%5@i$@BZN2@3Y-m;~!wgKcdi^_?X(bj=df6#p?x6aZyM)Fm7 zU6EVqUV16>29doi%azKc8O~=0HIct`i{sGeBFKv+9ppvU zQJ__n!=nj}T~XmFZG}%jJTLmRS+Qft?k#+bm5wWRjdhe)-CX0O@lrLk$7x61(F6J2p@vD^dbOkiy-=Ema*?zO(X9nlhf~|~(yvFY z!zmvI$p~tj$At1p<9Ul&vPd-;|4xThT1Z*i+g^*>2K`98omt72%P{UyzPa`-JmXGK zoE*R`#_7gc2aHQv%B-BIFDPP*=TMRlvVOFV{GjIXNYAork*7gs8Rx4>ZrKBAKnjuW zLkH_p#w?cx!hX5a2j900%cLbhZ*zvFdHADr{OSnj>kP}CtR>l2K30NX&1LIAt;e}W zT1&E3(h9DNa4Kb)F3-EJvYFWi#Acj32)P}l!?^<4Il{bA+9hoTzeU<0)wOH_b&^LQ z?WcfNU<+G4i)qE~Cr|i{ma%^EEt+)?Y0g7_K)Q?w%!c)DX)j6lF{`v^WnE9YBWx~@ zIgUz4NOF+b4B=13aK}WlbJA(1YxQ$HLvljFon`bP>8kIfbeOm^3cc*(68KXX|9K|A zK=noGN*i3dz01;TKK`px((}l5i;&mb;jc-T5Wkz!ZKk<_`aaG(8OXcRF~;AM9%N`9 zW^l(4S0O_p_eh}q=A5CAQB>%*0$Yc+H>`n=(0hp*1 zK^!hx8p%@}WlVZZ^dqTRY9cBXg(r-DD(yxq&%nJP$#agm#P*M2Yz@6)njqG|OGdv& zz0GB`m0(T0;g%<;r|D?p2|8)sqx^s~iE|UBXS8(!CVk>sP$yk@NwAOqVS==jn-*XeX-qB)= zv@f%`WZB5^eMr{Vvfo&0>k;h-PER{n&*)V2aA0&$)WBjPdmX?$;5)ad0k{d|$K=^t zmrEK0#*)o3cw#|x$dMK85309bLNBmSq@$}q%JTFvSRo(E=sbn2!nnmYJZh%786P#F zAH~s;3cc)Sbo9OXZrzCJm}p6KqUjo@07V3n#$;mXayn0@+(CTYJC#%RnY~c zor7{d&bd)lbT;au=w+IZ)9^Kq5HqPnKH4fVNBy`r3&!2UI>e?W{i0|s)tcx+hL?LJ zAG4xrNc2%1$^F!aev14_q3WPDMh#I5Y8xR(noU&8dVACnElA>rL5PgKdUClf;MmNLDLeHk?*60>c)38>y zq5eo&p2BWdw6lxoozWds+tBCT(LpTFy4s4c3#E?z(LIFN%WMyzu8;0xTpxC?v4Yiy zqKBF02x_%rz4k}{k429%ZQ6UP)>)5p`3a&jyfM*#qKLE$~zFrCt=(B|-(mbN*IiH++dan1E!|hpm_d&K{$cb%bR$|5qdnn4 zVu)yTm^a4J4ben29$khRe}}7Vp?8&H?(s~8aF;O;eQ`Z(jy8fn$6|cNSVyCK%q&(L z$6%aKqK|+nN6e;}64-^~{F;YfcV_seUe~<@dNlf&K4t)On_d6Yve(p$=h0Wur=VU$ zdr~~FQs%YPJtJ)zo2uVJ_KxJcFe>@j!?Lqytbq4INB!SxIAI;{UGIJqy+ZqP3g1yV z&G5cWTS*1~K|!~G?uk(q^0x5&o{zFyEYo{e&VM8y)#%4UR}V$g^YpnHKjLpaycTg3a0xNCt7~BIJP4 z-J9-=a!8sN%VpZJ?x7qf_i`9s@Of(9m@Ldwi)nla}89qk)D(4Sfy!t>#T+F*5gF(My?cf6R`}ip?dPIVk55wE*ROoafOu6>4=% zL-I|glZeK`STB~(R^6glEooAI>lAcmOV6=lbzH0Gl#Hrncf`jL9iu|iN57fwwq%SU zW{#C30%OtgHAK1>-}&Ym?_dR*VAlw_@>s(56QxY1Z903b(Q}ugHWqD%VS8N{MCp&& zP+D+Waf;?;%VJAWE{;WF8uadiZ3V~5mdiP}icwZuHE*{_w-VB6 zioMg8kv*~pjE>(mr1ErvlV3u8n9;J$k=Sm^n3GI)EY{n7 zCiZ~OalHa7<6Dn&(45WC8k|?a-{-P0%WHuo7nuBN%*^7_>gyhK-j-@EU(KmB#>?{C zpjaz*mlTUo?>A9@@50N?nB8_cc02X}bbmG%tD(IC{$b3^R&d(u9Z0X^Y(1{>eJzVo zYiUoF5jSWpmynMJSUt_KZ1r)A%RT6=k7e3hOBC|Pn1k{-2Ko`<=3``!iJI;aW5ZyP zAg(#KmhT-;ND_}Vp)SH_lutYQz^aSliurj|)#P+F(-Xa~SDj_q*6z zXkW%&p&Y_@t~cPGajUCrc4WKPv5!1^QhpYXpks63{1A^V3k4CC10oRU!^8}c*wC5{n{KkFQrp^?$)!+~rrXee%Q(p(fVTvt|) zX(%IkVZ-P)9!3$L6X}X?opF!SMmx3*pK8sG{_hpXcc@GEr{q(#r483{9jIbCFri^C zemRmlT#)UC_ZNnVZR{s8-mJ*P$!#$2F@L+;DnkFK8;cdY+#GH@3Q`qua~l?L>2BWs zJd(|CD0SU(s<}ShUW?5LSslrnkj;xg^>x=0uSL1ALEm5^&OjyZgBmo9l6}lT&z#^_ z^Ia+J+0IZ71v;(6??XsxWjY(HEgfKExDF2YdZF=gZ3I+b$OEXuT#D;ugNwMuRNldO zf}oZ#M2OXLFZ`glpzj`q3~`{St;mq2`#hrE)hDfKt(TMKvUc|CnPeraH)bFfdA5LG zO|msivjO$yhE0rH#cKSu6{vljYi&7AZT}P;csm`BO}*YFCEsQgBNY zyVcHyy$w4c+s{z-4F@vt=^h+vIM^_YX^wS(ILu{7h&qb$IF}i*#!rGffis(5b+PVE zD`>BgTRGKG!8F6s_tQXDVy3TK&XAXC)7gfHd_5P?RplIMWLrJ5<|=WQP+AoG!sUhw z4fha-^9|QH8apoCd)~u7c!x`GFlw9aI;dM*evwhPQQzfKxz#6>S2rQM*YJQemyK6Y zALRX%QMgNj?6&E(=V61;;G(@ZB~O=&c@ByVgNc?JqU29<#ZcGdE^rCQ$W~3HP1~pH z=7t-V#)hRdx3!)ILL?gYS;L5pe8eGnMA9V`y(gd_6OT_ghpRVC-d2H4}4|C$HQw5Ne5Ax8^4%gkw?1`dMkY#!r$utFR5cL@82YVrx)_|Xm{ue>A6j#d8sF$_mP&`J(-`ECFM2aCD zgYza^mnP`Pf=?a&>Dq9gWtSTkuiO)m-Q(iRDF;ieR{Jf!*2i>3d$SsGn&?u#oUWsQL7-Y$5@JK?-&AY4YO?q`hayBxEb+B#_IU=_{x?_rW33u z=`%?dtnOyy?NjnQ22oknvXy+!hRsZ}o5c2~gVsy>S&+=87@ndYp=az)aZbE8z75Dl z@zpJwxFN0uaskeyeLi`?^Ig+Ub%c!?H zW{)c)s2F4>CQ+j{#?2_#8ujt%*mtgycT0Q*>m9y3f!0NMM|`kiw(xv{q^Y@kz}6J* zBS`92=wyVScn?Zn+{<+9XwCxQHlfu}JQ%Md{}HB7d7jC}g?ohfV$v*$k2M^OzQdT8 z691SZFk(p7w=5@lA&n*F1y6QE$P&m`;v59qRq@q?T0`a9_&Tc7=>M&M@(A>!{9e!F zw-M9^&Mim2Z2~s{`^RR~TX1gW+HIV=MY)=8^{!<**Q8_y(|YfYHnKE&XMB`v7jy>| z`rSnDWs*JdeW1p>_s0(?F!hW+#AO5Y4H%8iC75dX^QkGW`?_<^qw&l7tJWj&lX0J2 z#8{5UPs9fz>rcfs&iizgf95Q39D}D4ceCzHytns|eH^WAoB1@Pn+S6!-ka*T812-I z)pR~S%4|o*-a~FK#BQ?AcrJbxc6x?7NZDLTQQAN&2hXHfEyv+v{8D^|=>i{#EV~@P z0{&Wj3EI3GkKu}Q1N`;)O_ZBjZpZJUzK8SY^|*$e^1S&z>tQAO|A1(>?ICI*Za{1{ zw`B3Xr*#}6v)Rt}UhKLV`*kZaMM(^=lt1J9hnrpXlv>OX&172Ez&ylQ9c}0FQM`#{ z@eEBP;}Y>^P#%osDeCKJ@fpY6#18j3{)F*;*cD?3#?~jJ56=nlirc08_9Ff=K9le0 zD;#gzA=1d#@i*~z9cud|(imKm7@{Tqp+l^Ud=E_vMZZg;N1|)uBlvF2M|bY4AESD5 z33Alho4CG-UJ7Yz>nUmgbh%h7{S}yjoX#R@P$CC)Hqm*BT-2}GC)^>R2PcM-M)o(1 zQz`HHZFt<9B}%O$NczYyGEvx0pR&XEKpC3Ri30FNIIo$D6WNAb%;Z*Dwd)mEt(5H; zX8DxXc%fr#h9~SRZTNJH@JN|DJ~1va%UH@$)39D9Fz$}23{)l8;d`P)c_QkX$Rv|d zS0tt+a*%&h6)4<`5jV?ugXd2kqAnj*9M{z|9dtGEGZRIGoB__HuSv`y>1--zB?dX> z5|#3hD(7*@e4>old3zWaBvc7C*C_EnE4s|8L3``WTGr}9R!4kc{*-D_!Wykjbhr1j zj%Ig~xT_-ERo4}Jn64RpDC_%Tzwx?j+U*?kXx<;vo^?%e1<G`4vrfX@Q# zej=YmwH2GD_LHxjv^(S(_ki2WT5<9`siG03EwC$L90&LeV@>j&9ALJs*i5RP^t;&| z#KBKN?@`=kbS3|Xfj;yp7MU%{+-1j+#1P8^^K7S$@(izupbyli@Cz5)JbVyS1G<+1yW=T<`C zb9OtiucaHJy0_(C!mFQX-QRKt*t<9%*blZGYN>W7ITmx>Qm>c|U=j~`OXx4rqC$dk zGW=1h?>ojIgO0Q`5JpPGGO%(qgmw~HI)$FwMBC_^XcgT;G|#jggZ~rM#*@Tx)@Gig zkt`l1novI_`XqGE5~mqL_ML$IRLkpxlXki|p|B5QR+>RSu$)z3WxRaMW~)i2&$nDq zAWE@bC5qU1%*tNM*U|01R~vvlcnR;16E9F6hRsg}(}rS2T=I zCKI4U zVD5&!>to_AwK9tKv7Tfld+E{Gi_ zhk+Z=u75f0B-pJ;Cc#I38}0DM0XzkD#qiX zl#XInquW^*k)*J(fN2EFYRAY7)VK^T<#mig*1%dE+gJ?gTSRcYLW_G<;>sH1giEyR z-&K8S<9l{5p7LJRIDu>?qnwCy5^=5LDOd1QIb8v&l5^FK(;BBY&H!J-Wvw2Rl)lzb ztK^LtoKo{YnO<1CsJ6DYu2%Oya&+T6==FpQSrOyLW=K;rR$M!Yq!Vk$G413IP{>p+ zox-X1b3VGZoU~&Yrc{9~Q_$@#e{#wET1&0D*7RR^n^s%(iHNDS6}6S5o&JfKpS(ZV zt=oCgkfe*MtE!u7s0#O=s(jT5Ri$d0s!CO@ny#u*%}~u$%~H))tx~O5O;Sw;MtLlN zy{es8CE_QeBkINKCF-T>W$NYX73!7hRqEC1HR`qMb?Wu%4eE{RP3q0+E$Xf6ZR+jn z9qOIxUFzNHJ?g#ced_({1L}J9LG>Z^Vf7L9QS~wParFuHN%bl9Y4sWPS@k*fdG!VL zMfD~1W%U*HRrNLXb@dJPP4zAHZS@`XUG+Wnef0zNL$#n5)si}@j;R~eadkr7sBTg> zs~@Q!tDmT!s-LN!t6!)y$I?&LUo}`Ygd);K(^b<=(_Pa;(^Jz+(_7O=(^u0^(_b?{ zGfW^3kX=4$3?=4%#cR2sEL zqtR*>Y8Gi~HFX-DMz1kwj2e^1tg&dU8k@$hacG$GW2x?Vz(_1dLWZ_qBMdXsh;)f=@dw0nu#LFH!cD(!xvc2T)iyOQdi+I>`S(XOU? zxAp+l+q7$_-a}p2=Rx-pM}6zU@8%e_B7*sMe}htJeKr8&5}l zIg8fM{fv5W9)9nuE->#8RJ)1VqiD^U5l^{)QPMW3YE|CaI~-XI>XhoV>Y%D#l~6T; zb0{q9RB?_>jWO1S?`Y&HneZt{wdx_)E>tZdT2x6~_Q_sbHTzWu2)|dg@29eB^&nGs z{~NYGMT9cF{XB8^{u?9vdFucF_T~S-5$ICewYFPr_u3w{J!^Z__O9(y+qbq~ZU5Q< zwF7IjYO`x|Y6sQk*5-ZUI*Vu)YnEu1YL;o1YgTAhYF24hYu0GiYSwAiYc^;$YBu4X zf3s$bW~*kKX1ivGW+(p)kc#O+%^}TU%@NH}%`we!%?Zs(%_+@k%^A&E%{k3^%>~Ux z;4f(|Yp!UnYOZOnYi_i$|5?vWuTT9X&_&x-+fCbD+e6z^+gsa5+gIC9+h03CJ5ZaY z&DQ2<2WfM)dD_9+A=;tZVcOx^eC-JBNNs_(P&-OHT3e*8&{k@vX{)r=+UeRE+L_u} z+S%GU+PT_!+WFcAT9sC<)o8Wah1x~hT5X+Hr`2l>TBFvaHES(etJa3T)qHCIe%8_X z@A~(uvfAv42Gu;03_$s=jqay!W&Zz54-2?`Md!-S(>hmmuI@a&b4}+Noo9BQ)w!s1 zapy6e$95jqd3@)R&ZV8pI#1{<{W$jH&;9rpe*A;K{%YsWo&WAz`uShi^>NhM?`cnG z@2mJh$*Hmr_Lh>KqraOaW_`@+l>Lj@Kg=GQZO_(c`?HY?+WsUDt@|BW*F8S4xzbyGi$+t_!mkcY(FZoik zs>D~axMXX|!IEUjZkS2V8;-rbaCRR&$#*7yw!F4{YWYt;>pu$%clrAAi{YJ&*RPnir?^Z0VSXc4+%Fk97RQ9UuUHO&d;mZH4+%m0x+PAB|nw(K} zpz3thjjCwXm8#EGzp46@>OZaiUiDvAkEzyGN2)(Fed=^|O|T|h6R25P^E=62GdAUR zo|!ds+|1cCzd!4DlV8J~_U|Q~vwlArn00w}V)oaQk7kGG{6VtMyn=bV<}IFgV_xq3 z-alIMqi-ZXgC{sY!ru8-(?`2qo3}83;iQFsnB2VZo5{|}&(*!D`;z`2^t1G<^!56O z`fnxQ>hlagGCViFHhu}eP5YzdMf10lf1E6}KCu2t@+-FQ*zVYF+8)@R*q+*Awg%fT z+rMD{HTyr=yV(E5o@LLs53>KzUTR-upJAVAPuOqTZ`&`~zmvRf7wlK64(;h7w8nM2u%w8Me=K5`9GJj zL->sF3&Jl7pA~*d_+{a9!mkLwD*T%8>%wmczbX8d@Oj}2!WV@v311d|Tlk9bRpEDp z-xaWSQvu;LNQDjF60X%@ZTZ|ghFAIFj^=QiiI)4 zSYeznUMLYtg);p2hKa%?VX{yzOcACE6+)#jO{fy8h3WWz1v7-1!YpC7Fh`gx%oFAd zKN1!QDnTu11g)@8SR~ZqE&Dn_k9YAK1(RSFEP_?A33kCDI0cvB7CeGi@Ckk)AOwXF z-ZCE%77I&+rNS~{xv)Z5DXbD!3-a6F%gw4Vhyn%h2uwB?8>=bqhyM;Z% zUSS``{_}9`$D7&fg@eK&L4MQvQQ??yTsR?|6ix}J@dos>!a3o*a6z~z$nPq@B3u=& z3D<=i!cE~8-Z6ehxGUTf?h6luhk_u8f+R$Rn9v}^g@n*3GzrbZBjK^|M0hGZ6Q1Ku z)i3ep>es>>;jQpacrSbqj5UA!UQ6mQYHX77sk#QWj{@u4V)q9}<`F(x*MaWNq_ zicMm(_(*&#J`taa&&22A3-P7+N_>s?k-in*iSNY^Vp41oKZ^e${-^k3v6J)}=@+D5 zls+r{lJv{c=cHeeepUK4>DQ&-kbYD8E$Q>p7o;yrUy{Bo{kHTK>8sN3NWUw6P5M3Q z_oc5(e;|EB`a|iPQfKK~(jQ6Rmi}1!6X`qBcct%1e=7Z%^ykuFNPj8)mGph-2hv|l zf5YBI_WyMj{H^qN(%(z}ApN8CL+PKSf0q75`d8`Sq<@#XNL{6FQg^8b-j3Q!>W%lE z_LchKZKMOFfl`)~E#*jqq+BUa8Y~TwhDyVv;ZnXNzxlI3DwIY^qopFLSQ;aZmE`wn zmPn;|59tJHqBKdGER{=Bq^XkpR?BIKL6uZ3O_yq<8F=^PEWCYkjx-nVh@3C|NLqk5 zMye%^q?Hy*i=7Ddm`XD8x7U`q(AJTtHKbAU0KNJ0h=r2Y;8~vr|FGoKY{gvpiMt?2( z>(Sqc{$}*IqMwg`A^OGWm!e;e{&w^$(XU2-C;Ge5uSI_^`uowZNBh9hqX;YVJQ+M~`1PBCoO-O*?gg^p>1c)FZQg?56cir9H zotdHCb=mcn|Lk+_x!-fo+4uaPd!O&#({J_Z$QouAtlz9QS^VC2qJ5&N(Z11s(f-i^ z(SgxH(ZSIn(V@|Vgke!2Iy^cenid@y9TgoN9TOcJ9Ty!Roe-TEofMrMof4fIofe%Q zoe`ZGofVxOofDlKorjq87DN|D7e&!gOcaY)^zczalo%yN)1%}lB}$EEAjUd+G&9PG zGNY_0JIaZ2qr4~|vDFC?ubdb$%SofMs647bTyR;@?5HZ56U~jP5iguJnitg}{x(C@ z7&S%BQ43;s%SXIx1yMWVV=F}5Y)-_#=0^N#o@hz56tS%NqW?lUg`h z75&4YRuip_)3}qMW07sAik$p(bv&8(YJ{E>3#I~=!fXX=%?uC=$Gi%=(p(i=#OYTngG@V>w}3P z3Tyy21RH^k!6sl+uo>7KYyq|eTY;^?Heg$@9oQc10CogBft|rFU{|mk*d6Qv_5^!@ zNnkRV0`>;`fT>_#upihT8~_dk2Z4jZA>dGO7zlvF!4Y5@I1(HMjt0koW5IFYcyIzZ z5u5~02B&~i!D--ha0WONoCVGX=YVq&AJcrqth5kZ1foFK85}80VXaTKYK4?SyLw3*s79zGGC+Gs*U@_{o-)M7 zQ-N4`0$>m^@r1!DFalPCHDE2`$XN_7L3}yOz~$fy@DKORDsVNp<}coz_233@Be)6N z3~m9pg4@9Dh^J-;_$#;*+=Ww5xfLm2Cslu!E4}k@CJAj@ub`a?|^r~dx$UP0r(Jn1U?3%AP7Pr4937G zh;QUK@EQ0Vd;z`$UxBZ|H{e^u1M(jH9dUwu1V4eF!7t!f@EiCY`~k+n1gIWVA4-H! zPy?tT)Cg(}HG!H!&7kH`3#cX33Th3tf!adtp!QG)s3X(~>I`*(xc#O^0ScGoe|CQ)CV_7n%pnhZaB!p+yiHv4>zG9E67mhzo=S zr6ZOP3gYv~fM^gM%7hq*e}jcsIygula3LPVhXjxi5K&g8pJb^hfw%>$N(836J&-gh#MjwvLWsUJLG^0p(4l$xe&KQG2}t~4yBM6@8=#Gd zsbDj-1=47&-zSg^oeTp%c(a=oEAs zIs=`B&LQOe1?VDl3AzkjLFoHy&~@krbQ8J--G=T!ccFU-GymWxiT^|B5%d^g?m-BG zU?>JXfu2IYLC>J)&-u*p7uz!F)LZ6_|&==?{^bPtB{ea?70$dNS z4=2JXxB=V{ZUi@mo4`%sW^i-31>6#D1-FLVz-{4naC^7|+!5{scZR#bUEywUcen@K z6XBqG!AWp3oC5cT`@pGiU$`IKA07Y?ga^Tc;UVx)co+=8!{HHd8axsn1&@Zuz+>TY z@OXFvJQ1D*Pll(!Q{idwba)0l6P^XnhUdU@;d$_Ucmcc+UIe3I42*?wFdinrM3{uo z=wz6JkmVUL4W`4HFau`7ESL>*U@pvq`LF;M!Xj7-#g5YPbfjh3gQWcnQ1|UIs6RSHLUbRR|Hh240Jh!0X`+@J4tO zycymCZ-uwP+u>i}9q_O4PIwo*8zD*eA{6O<_yBwmJ_H|zkHAOaV+aj;0zL_!f=?sV z=2`e0d>+1l5Sf<{0`m%d6}|>vN2tr2@GbZ@(g%0oyYM~uKKuZF2tR@!!%-N7AsB{Z z@Dqd){0)8vKSyZ4m+&k2HT(u)_uj$p5iaioLgsx!h`TTFSNI$J9sU8w;e=SdSp8UH z3>9k-YZz-3YaDA5YZ_}7YaVM6YZ+@5YaMG7Ya449Yailo`4>m2J6>l*78>mKV7 z>ly16ONu4OQewShePXGxzOjC>{;>hEfw4ic!LcE+p|N2xAT~TUB9;~#851xKZx%x9&56y8&5O;CEr>0QEsCLI7=*vWA>17y zMvRdV+KwFiYxMu`%(MS@XW0`H{@m+&axx9<^Rvmv;VUh z?mzqX>u=w5{WboRmF<)t6@^N@GEbSWv?`TKn)01euCytQN{X^n=~o_B3Y6QF%alu$ z%ayy7$CYc950uxG&y`n|HxZ&iR@batWsj`RS-rA= ztjSp;vT#}4tZ-IY)~2jCS?jZQW^K#bnDrp*OxC?D#QTxeB>Q_-_v|j&{A^OTGh2|& z$zGV9o-NDvW`E7LXIEyg&R(B=BYRi&{_M-yr?RhRpU-}n{X9FC{d@Me?9bWp>=vrl zs&1(WzPMarMV4qmAR?8pK?azj?X3KPRV8FQgf%}(sRYR zS-IR?NvoLih*o4YFabnb=RtGRD-eva|?FgKbT%YB;rGWTun>)bcFpK?FuqST4% z2I}VOmg*Mj4(fL5p6b5p!Rm?Xnd(LA`RaLUntHZ6LoHVG)IzmXEm!BMHR?ijkvdoH zR=dDW`bspX0B$ohOVJ#*cy&Tq!DW*8lgs} z$95FR;s0G`C5zCtkr2twZ&S$cCofr zyIH$KyGwgOyH~qUyGMIMdro^pds}-~8`Zwle$zJ3Yn#_smy|b9H!H6+FE_6+&zM)0 z=gC`^_e7MHz>7u&E`WE`m z`Y!q;eJ{OLH(WnKKUqIUKSNK}&(pK@9KBdyQ5u7;>JR7(d?)m$_2={#^w;!P^tbf4_4o9T^pEwh{)PUvzP_QAp{b#vAQ~ zA#6BfIAl0$xM0|BIBvLScxq^4Y;S}Okbz}PFg7x_Grlu?G;}hyFn%!fHuf_PH1;x% zF%B|LGA=aEFcOUz<5VNoNHH>vJY%|%ZCXq>D!kD^}4l5{wwPnYq$IX`MvXpA^gYB5&z=A?EJ|H$$`uNX3fr5He~t!*7`18jqAV{K`+sWz&OV#~B;*qAn+ z4Y7>bL^g>{Y8z_HwrOp7HnXk7R)(-UbqJrc-u4KgY91i$&3oHB+ZS7TL1MvI+h>Hi zX;^UA)}-K;ZB)U?f{q0v3WgUO)pujL>V%wmLbSzYkHpq>30lA-p!Akluapqc$p!N-C|_J;*;3tHGy>`C^01!L_E z9bXIN_JQ_^_6&y|$?%feH`oc+(wS~onp28i4n+lH>9xvQnc&f0sb6w%p z!uy3!3!fJvjBeqb!dHcDiy9U+E=nj$Ec#m5rl?6#i=xkkO^ZerO(_~vG@&T9Xh2cd zB32QzC=bbNL>J{E`R<}31(NYjDB>1LiW)eV7S$EmiZ&IUDcVr^{U&R?7=r_C93mN_>%!_KA766bQ~X6FIt7UvP?QRh|XP3JA= zJ?Cd79TPMoZ+||_8&Nai;)0OHP=o;jj=9=l6;2P~3>ssjQ;bOV|Fkt)) zMd0GOB@C!U1nE-%jt5v%3UGX64x5nO4oYVCf8QiZr4870oOs-ZP#7bJy*>2 z-u20q=A~6HS?k&7+3MNm z+34BfIq5m%0XjtBgOX^;x01%CO-kb>JxY6)wl3{eI=ysM zDNs7HbpAiE`2U)_VNU71(uJki(z&J7QeG*mbYLmBlvJuIRh1e`^Gl0L9i{ft;!<~M zd8xm&qBLB(wscA9`qIs%$4j@A?k_!7db0FP=^fb>oSypO%Vd0%;peDA#te4o8vyls3Pe968RzMj60zGl9DzR|u>zHz=!UW^ax!};*O zmcDtu$-ZqHm*?cBnzR&7&`&>S+Z?$ieZ;S62-(w%>o6EW5tM6~? z@8Tcf2mJH>>3)iz>*xE${v5x`U+j1JZHW11oqv;mt^XJQcK>ewLH{BDDgPP&MgMjG z1OFrc9sf7~@BR<|o@H@=`?A4h9m?92G0Mngv&!a`@yh0wRhCUDTTq5At1b(am6t`z zGRiKL?JE1V>}gr6@-JmG%ZL6u_5ZJl``=paQl3)YwY+!v`0`QZ6Uyo3ta4+yqCCBP zbNTx64doT(yUMSZ-za}l4wc_5KT>|L{9^gZaMf-|&6^Rv%Dq2^Jt{7A?sv@~! ze8sd1e8tQPS_P|uQ^BZ^R17G~s!&&GD@+v`6~+p4MSg{)!d6*S>8`A(3{-|H!-z{_ zapmgDRh1hm_g3zy+*P^1@^s|~<&nyBm1irjRbH*UUU|3jQ6*IQxH37=KQJ^fEHFK= zFn|dx2xtTJ03(nYU5U{zpCU~6D=V0&OkU}s=g;C$dr;8fsT zV3F%?phfUn;Bx>KY#3}DY!_@9Y!hr1>=^74>=PUq1cKv&lY*0jGlR2(bA!`^^Mdps zE6589f}-GMyfl~{)CCKG z#MHeFKG1&%{vK=Jv&1jR{Q(%?@Eg3qsP6GL#kiTLk{K>+Dc&C?~Wwv?;VD zv?FvhbR={<^fdG=lo)OjZX0eN?i@}I_Xzh4_X#J32Zx7-Cxs`6r-$c-XN9rh1z}tm zA6^(Hg@fTxctvq_+|J__-*)W_*1xERjaB7Rgc46ss>e! zshU+ay=rRJ3?xT%auum+Q5CI@2lQaeXROg)iBaI(lyd6k`n11NsaW2^p6aP42%qo42z72 z%#6&4U?Phm=m;)CiR4DgBLxwEBoGNk>LQCHt0UVZ2P3B=yCTOU7b2G;mm|^0;|LhJ z8hI2MU;Q@nCh|Jcp}Ku_lj?TW&8r($H?D45-Lx82J+!)8b!v5=>f~ymdQSC->e`g!&1>LxXfYo1jn)-r{1`y2`rhy2W+FC?~{JA20VV zE}Z@6y;+U!NJ`9@5;#cg#_rGkKuz(f?cEEo`n9Y_+*HL2zQDfH_IspU)Q`M`pUsKT zE>aDJ??W8Zep6|rBd5;ztJ6jMh0%l?6wDQ!s4NL$gb=zZW)Y?aGY|VVeGK&~wO&RO z`U6%gb{4yxpn-UI7Dk<={;JzxdSyCdZE5E^>lc%Jdfx;>C3*$=0eP$SkndGq0{RVQ zsbZ{eguZ`4v29rOG+Y*8AMp|KVft5U2j<(*GdXA-@{|0AzzJjp76-ltn-Sj;if9+I z_E`>lp9GWydd+Tq8+3WzxBR|}&gm#p4{2A&gldSoh9HpN&GlAJPxqr2_}&IE1(Ew2FPi-CpBpO$j}=b&B=1VDBCJur#`JY7GBA!SL`m?T3IUI zKqy2Aine5cGLyQU_JPr#wTAnidqCD+S(?>8o0@$sdrD3{vj(v<1RX3Nt*l#(n6j6j zAxl+%#to(NsaED)=3dSh{y<4T>2_&x&LK;>Yj91=nxnN#=mD9b0EJsX-@!hfuMx3T zRP+~29zo0+pup(g1)HHe5?-Q7m`Ru=m>kSv{3}9}^j6eE89Qi?XqR+Ff@&) znKbKgPKj>6Zlb=(umv$fpb)>pD};0s6m4}6NMG%Ny=Y(0pu6xW<_WzGhpL*OhVu8> zeiR<`91FAyUkjf>cf~|q_tWQ7PE)=zo-qfqDp(xWMRr@xMb0?>pWo5{+qKgo0>NgH zR-To$P+h1|n^xF97Zq2Q25LNSaQpEcsoRL#XdN>}Y@2wKyd>|8o$OS(SC#LqlF3(x zZxt>h$A#w$Tb32zi_%fVD~v~+UA&2+v7$XvRnG1_slLi}*(EJW^uF*dtE>o!g96$% zx=Fk!gbqcxNrpj^ganIZhp0t0Q>nt&kg{0MITPfK6qghJNl&;_(uD zaG;2eJEGrezw7su)6)Cbq=*_647aZ^HpU;b!MSEcrLh=ynbs746CcBW&8#8~M7{|3 z&_c93G!;X~SjOtb=Cb#*?{GQ%OG1L^i)gZxASKIEltJYz<>uVZ>ZqofHm+Y{NH#t- zjkdhD)K~?!+JbGav+i{syAM}UUg@ty4D*32!T#aSwz23z#GUlBnQL+uY9?ye(4SeF zl^hDR2@yk-P(4gbOg5pKBuf86on={Oev&@&=@xmMY$NXNxGoquS|LsWs zd3#I=z&IxDBs0k@>bW{DEkU1P+Q;;|I=i=fv?XUtdw3s*T2@VrSkWeI0N&bKmaj#7-C4!!xu**j2b&NRiR(y25k->a?w6+)o~z9zETwhL#}+p9 zbwoSE>p>(vb?OsT#bICzOkXJ>4#BZit%ZxJ%m~G zCz+Qy4>?`9Ns5fZ;qH4SpUUbfSL!k%tI_Mw>(LR+V$3D%9NY(eHtqwCNJu7F2+s)X zNd=Tg^fAo&%wa4nOU~-WrSca@4#^IyUZ`GaKUo{(H@2Z2AAOI?<3Vybqv|#K9&QLd zUmzDxrN0%Z#jYHzDBpMt3*zUHe`NM8U(W9>og^KZo3GoaTVObC+GRV7Ogu7Olv@_K#4O_@w!`{jr&y(?$g6X1m3W0i({;P4JDQsF` zmRedO&YN?Ejon>`&}>92K{_c!0#DTCW_m`r!zIz zuCW%ox)eY5TrTDM)aCjBDb%hiuXYBmjb?k{d^0F7>j z1qnvtm-I_i9_>x$Iz~U{Sk5f|CSkhbqUyA9yK{;4k@a-}y0FOoq-0FliGVQFuC4-I zhHinGOPEKTOdOWsVJ<;_j9Dcrm1N}R=heEGyS2qWKLdR#vK(#1Y{GQGcErxZ$#8Y} zUHBjPDngXdhWNi7=|69;CDBE~k(ZK9R3a^t=A}WIvCNN|d5i)^72{V%XC|JtkR9aQ zuv8!Jp%C;V1bhrGUda$PAOFx@RU zoA_n@%1W7*BDFw_CRoTV{SESLS`Gp=0Lbi;0tY{RQoXzYFd9 zbVG`1SUFv^Au`U;h2X}G!T)(Y{~$EAQzb3L+<+pv6HNKPgrFb7f&c@f}Z|zjb&$f1RLMdJTOQJsxAhjK_Z> zyd^|Qcha9x&QMQL<5Vnd5xqWR5aR~32dfcx7@tnt#NWq%!mkl>qzMTIX)D>RoO!xK zx=+R~ra`8q*82JH@&hi0TkICNJ?@w86P~-Cvw?3RrL-755mSP};>ffww7Kkh-06a3 z=^4cy*<{te+^gzCdE<4>t!dWZ@+<7MUaZVg+lomk9#r#1|EaWu_AHQyena?39!@=# zv7F{&SriSG`_;dB>Szg$hXxh)y|Bi{rq6fuG`F;caVWZoD=4YvE3zl+I++?+dla88 zRrpR6uJ!f8e!-8Y6NJXBQL2Uhlm0>FknJ#SIP)`W0{S|^Nn5}fE_6$usvhPH)l2i2 zmEiq>a9i9Bf`k~SIl1E`>rDy4+v(>CqMu~^2Wi9U_cLE&>al-tM#vB9&giC_7MU+w zUgY<(`RucuDwnS~w{)0yxNm`9=06^&_8&xJFtc#e2<6O{oU6iVvStcyPG9pmL?m{V z(1m({c1fP88)}Xi&6K+AFF1npwf8jUD?L@PUK`bSx5dN9ach~+`AV@%`VOIp0}7t< zho-&hQKs5g)aXs);Iex({L082N#$}Vr@=37C@zL?gy#{}akVEw{d`uDxEaL@! z#rDG8!zU5u5S|mB5NDHylRBk~sQalCGk&2pq_?8Cp?9U*8E(cyMi$e;v2*TlJX|fe zk)XL?h(IGS3zv#|Nk&Qb%AE2h3W{Q4cHeAa_6c=8ZDw9Q9bfla_fX%)u*x{j6tG?| zD7MdYWIEqDd$}jNiS8UX+jHNu+%G6Imv^qH4upbD(T&kP(PVTGmxVu19!WV%NuiBp z9Ao|9v4!cvnerW~95q+J)2=Gs=}#&jp8lTv<0qLRdckQS4oF{Q6U|zy$_Be0gh)kO zyc6hSF^@36U>cE|xx^`~`xSqKG(8{zjgr-lguPW$0jCnkkyU$+p(9 z)-~R}t~BBu;k)N=6x@wIgige(DbFd*=v~#5=;-{W?qgnVKpsprTyQrIas2PnR}&Hv zI{C&CZRAwOYVJsxJBzI?Ha@guIj8%G{?_H4%e?_c?$N47nc~bW{!-!Uk~;wfcb>3| z_*g-w(80hDr(LP%eWG|Scrtow5y#%>}x1x?BuC#$d zrRt@=quFmvx4x!)cUoMF-R15x?jF7}KR!qey7(>i4fFQ|hA{53x^h}ppg(9>@BS^IF*Uc%E4qcAiv1dW%lLF;cVu$6O9y|lFgELl3x+hmFR3!_8GoKzrk?(C&>_)Z(eQD=XbM>v#oR} z+~+;Nm*n}hz71vmvVzKukwthrX{>T|wg~6Yk<8oj&l?w}<0z}?Yq>uJ-vt@sTPm-* zRNYdSu6v*h8k0;jO^pgix+etKzNESsR*gSPcuZ)5T}ygN!B8iuifKH04?>jnjz#Ad zaHnwha1p07?Sh207m+uCKK|k%ez^^jl z2?3`DcZ5r!Noh^#EqFK~-FF?`l{%1`CBwNVlR8jVP+zkMoI}D(b z@`Kjex`jTB;b11Q7O+Qh;)2(*`-<~cOa4_`v2&*f*`&9TFa_|2PJ#ohSV#+yyD|AJy?`ZqukNZ>Sl;J%E}G@r z7CvR5t3T^;hNFlbrM2&=u1r6=;8Dg@?GW@^beQ&#xsNkZ@J9GVCN0!DC%Do6cV!pD zog{s;2Ij}Tr zbsXX-)f63Y-*r1m-j!69X)Ei8pz33IGWWfvgU~5Emvh9ku{1sA<(2B1=^vWr*y_7s_sr6Ee`n_Y zSKSLceM9^={VnSt8HM+lr{=#`*fre@V&A3m-HNxwUCiaYMcxb;)FrL@qltR9#H(k)6r{WXBbwI+_DkSXh_EP5F;$fpaF6$Z_Nf)}3lzVE(8 z<*9k&^VZ^5GJ277scl(pu^G7a$o$_qTmrr|iAbSP$ka;O2YPYlUREV%2rpYWL$p`) zKy*WMQ?67*N1}L zw+Q_kF6?MoOv%!77nF0v+ruccR!t_b#1BfNflQePJ(1p;`P5sVaLMDc>I&lwh@XSz zBcJ_eC^qU8`pe)~w3~X4S>k@A+^pm1Vzg}gpqwq)xs2bL25uGaNOs6L1O1J$0DYId zG<^;0h_Z$0yEP4Q;cfK>UCRsKXSz8XcttL)@Ud*Ne01)}yxAFQ%Ld!}@H@;A#yw6M zm&{iRk7yRE&RTa{2Y46xTVOwv%Q76u99WK+m;GJ!tLH7{p+^$v;zG;SQl8V=&Lpw+JW8 z(6YIzO{y0;MD;ZDVB1s28qZO~albgbZRk~K5?3scAi&_oycv#{g#!sVLSJG5wTNM4 zZe`8m=s4>*KK@ndS=mP;L3i)VNUjsHDam?E2#fv?# zC%2?~U}j(=W*tu;?P+7%C5|V)dUS$#bx3a~J6d6s_%+N~j21$#PM6=vRp|O%-ib-# z?37(Vi&bTjhWH7@-1KdfXS zlN_!}S|G<*FZ30Ah?1^Zm6wWNp>5+RG+?kzsB=^&3{OnEy;r@9dO`w7#4Fq=4>GLKqAdrf~u zACMVfY~cvGlli;&&4fQk{IAI#$v$U|$Qxw7Z{22VZhvmCU)0t$&^_O?(s#M+d+1%Y ztOkQ#f-b?PsSi^_1xrnT19`3c1y&jBQjb3`DCI5^aa za1Bc*tfp+`jT8!10_|))>_38EA}f?8P!=+X)WO29mPfeb8sxcEyeE0Y$e!9W$Vcal$r-N3>aICM?)g5y?|0wPKuJ*tsuNAcv_!kyQ@pK18?Z)3fVzvelX08- zg?os1S1@0EQ`}6xLs604U%g51wj@~R*-zQ?UCG5wOZh%iplR65_H#xc^FIZ$T=`kc zH_Jh}!?L^RlanvpQZO;}G0;uUHchfi{Ml$V0h@`EK2x4^3@KdY8h~#_unn4d4&EAN#vU9&;kT^}Q)MJrJeB0@F%klJ5Mnduzc*^%6Zw7jqgoL>(3B<1(Lp`h6x}fO1PmU|Ewd;zlBg(J4hhRO#Y_~*u z)YB;c5^J&WZA};*LbtA#x(_)-js&q;5zPCm3IBiM^EPL;Mt49DL=Q)gMo&afK~G1g zqbX?Q%N?}T<3_i&wP2Q_YteP+#ptEz&FF3D9q9AubLgY!h7#2!R6(MwblONmTkHc?B=B9;*iL@QB4v=e>ALgESH zQsPeH3gUX=QQ}GB>Yrr(cOCICaXE26aWC;E5hB9GR;2c%@5GnH7sM~b$HZ}@sU$9G zA!#UyPMSqZCy_~GNok}^QkY~VZ6dl!btD7HObU@|NgGKX!bQgign%Kgb@LK019w`q*@Y&`js04@;M&OVSI|t?BOc z#pxC4-t-me8`F2BZ%;p*zBm0)`jPa5=_k|Ar(a6Hl71uoW%}pz1adqbMQ%cFOm0SQ zL2gIxOzucNLF!KKOCCcWOGc9?kf)L{WHI?5*-2)TEo2wDoV=L4jl7(^mb{sKgnXQQ zm3*0eh1`^Kog5`MqjaJ4pr|Ox6b@wpC5v)UilJaJ(>R9Sz z>SaBNilw5d8B_|DLuFBgR2fxF{jZPJ|A{m5sQJ_yDg(0)vy8fxdYt-%dY4*4y+yrE zP0i?)(I%sNMw5)L8B;T48S^qmWsJ_?WJofqGWKTd&p4BDIAdQ%G~-4Fobfc{dd8QG zuNlp0&1fBIBWM>h2GT~;CevonX3?h7a5NGvgGQtAX<}LyEr+J2<p6WK*!QC^lX}puApf=pRvPNpWaDAS&4%UqgS zles=~W9Gh0U*@lwdoxdEp3A(Fc{%fX=AF!EnQt?H&uqr%%ILyq!|28s%^1U&$(X^I z%0M&73?hTc;4pZMISe&J!_YJK)>;^g8HX5$87CPR85bD;6Vd#yU-LR6%DBh4&A7vO z%y`6j!g$Jf&UnLk$9T;BYxK4vQn=7&$hMi(}@LamqOX&Q(qUr-E~XbBVKubAc1*9Oqo+ zo#fo*oaLP69Oj(hL^!87&ABf*Z#ez9^|_6?uQ!SBTD&uhgK z@{~Lc56v6MujG~UR`AyFoV>lf+q}!XW4sf*J-nN|!@M`V7_W)#A@31yJtxY0#T(53 zzJ8<`3eJE{^c)`0Mz;@{jP3^AGWl^3U=w^Y8F)@gMRZ@!#-O!lr^m!B>8caFk%QV5FeC z03(w?>Yhk_{rSnyQvTJXEzqo9?rqp+v2udttRY;dS>ig2`WnsBUejBvJ)A!G@u zLavY}bP2PBYlKFjMCcI~3s(x42pz&-g|CF$h0lfCginP#g`n`h@SgCo@TG8<@VxN2 zFea>)^c2k&4G>KgEfS3op^^E&ZK6RUs)#GniY%f!kyo@qR3WMnMMMRnjgnoWT+uJ0 z#iHG!R^k$oSyWGaTGUv4Q#S-yW@ka4Q@d5E6 z@fGoY@p5`ko{WUM4b;**p}7EA1srIKYx z?&Hr;f|5>!dn89Bhb22D+a&8H_a&Dk4C9*16 zzAPd$%S5sqS((fyJ1To4yCT~syCFL!yC>Ty+alX9+bz2zdnLOi`%TtMzQ{RRK1e=E zK33jEK1!Y@Z!2#u=gQ0FJb8v(C#T9w<&|5zYxcThA{{31Ughvhrv$K}uE_vL5h zPvn>7$K+q+x8$Jwn*2BUOZgCmLNQd)MWIqK6_XXc6;j0@g+{SR(MvHyFtKy1cpJJ2ZsA8+)s^Xf$t5~5ptf*5=Q?^kq%zCc)r1+tjqI|0u zu6(5!p**YjBl@g9>^_`6+&;WM{62y{!akxt;y#i-(mt|2@;-__%05|rvil$kl|Fyw zv`KZAseS z-)#n@rU%dq=$L#iEjfAlh!rDNj#xEf^@!mkMvNFY!klJGGp6BF*eQcjhNiSh>6)@4 zB`Kv>%7K(oDFadlru^I0fOCdZ@kDe>>X z51XOtwsYg=dc$0X0paU== zJ}FL%XT}=?O@O9AGoU%p0%!@e0$KxYfM)R)@hu5AkhkzLp+}sR(mmcYE=Uok^h_C< zGQIEAzMB(9B&8)KCPQ&l{9*i2yg@uM-Z0)Yo)lk|(6DcVzGqS|q@GVbk$OCJN$TR% zZK+#R_oePlosiTPC`DNIiga7WFLCHXpvah_a zq;FDEa?*}}Z|7C&zig$N*>n9moV2025#VY=8rB0Up2y z1b`3_0mwrW04X2?82EYiI05f0#tUx|s0}22; z-~bANBESi_05?z!cz_b16z~E*zz>uG<^Rc@_#gZ6U$wUcSPCoymIEt*mB1=sHLwO) z3#&iz$Rcbum#u(Yy-9fzW_UcUxA&#E?_sX2iObj1NH+4fP=sx;4p9mI0_sC zjsquvlfWt9G;jtu3!DSa0~dgcz$M@^a0R#uTm!BHH-MYKE#NkA2e=E|1MUM4ke+!6 zJOUmAQ2+!W00v^f6W}TE8}JNx4!i(f0mb2o#rCl^97xz^=sF#Ja@AiAxffB`!}~k+?E(RpRQzHHm-U%Ucq+CT>gIp7=}R zj>KORcP8#i+?}{5ac|Y+NKI-xqFx}dtEx}mzGdZ2oudZCg~$*2@mZ&V*tDylE4AF4lU0BRs= z5Na@L2x=&580w#YW&kxDH3F4}8i^W(!l6c^#-PTc#-YZeCZHywCL!leMomFYMNLCZ zN6kRZM9o6YM$JLZMa@IaM=d}tL@h$0QJ8<$LTdfg=BceyJEyi!?VdU~wNL8E)QPF} zQWH~KrM64$mf9(`cWPSdpwtPe3sRF(ho$yU9g{jGwMQzDnwmN`bvp8IFgwnPbK|@? zKQ4$1A6F_;1ciI^eG)9DRHli6a;C#Pqta;SV;LA#k!9+Dzu!+u>C?MkN(ypt(45qi zKB_5ZW}OZ7inG-wcS@aN@kXT|@v@h9uQ zHuNX${_P!fYmkWiX^@EgMV5bT{KxX=P5<%Azm)&@;y>B@TRRE$>L;QaG;GwkNz-P{ zTeNJ|x=q`5?K^br)VWL7ZrywI?3I+9(z{P;-+uiE3>-9g$k1WH@DXVvM~xmccHH<0 z6DLicGIiSY_{>?e=ggfqf5E~VdJLFTefc7 z{>zSEckbG~XYaoK2M!)OeB|h{<0np@I(_Esx$_q;Ub=kc>b2`PZr-|m=kC4x4<0^x z90egb_T=er&z`?{`RetXx9{Hn{^8@N&tLvO^6sihb-(ZP{eEi8-F=-*EqC{Ih6M>B z5P=Xv5(p06jl0wCP5Wwhch}m#|GKVg_S|z%)jWXB0nKT5^+BrmeqQf`!=vN>`Gi#Y zzrCJ)d-CS<|MU0#e>{Hm{@f*cNt#U13ky7Y>9&;Ye^;|MNTi|MzE;rP*?9 zITpZ`o@Efc|MypWQ%}=OQ(MbyOGWEJo3%aO-rhdc-qq3F(bqB1G1xKGG2AiIG1@WS zG0`#EG1W2MG21cMG2gM!vDC5BvD&fTvE8xXaoBOxaok}o3uR~7Rd$y>WpBBn94u$c z#d4`!U9K(HmFvq5<;HSTxux7%ZY#H!JIdv9XSu7~UG6FOmixqGiJXxM9 zPnT!Pv*o$+e0ia~T3#!!mp96r<*o8gdAB^>b=YO^_I6ix$9r0OntCUDYX&92dB1zpmKn#4d&V>4o2i)b z&*WwbGqp2yGfgusGi@{NGo3RdGm|sZGdnXgv$M0Svum?EvwO1#v&XZ}Ip19K+|FEK zerkSmerNu0{&?QD;9PJocovcisfEl!VWGHCyHK~#ywJALzRrjLyNyogvyfmIm|Y&bWUH#fJpx8pnYJDocNyQ{mFee3@8zWeY$|0x!~)qg^CQY83KiB5}be!Jh{ zclytW&Wg^7&WkRHTz zMQ=oJMel%q_CfSf^hxwtl=puT75raC-$dUii~9W3Tr&_|2k5KP%#Z ztY!gS_a=X{Ul6tUTm5bRcE3$z7j^i{{!V|F-yw2>@^ZKTp8~U2)Z_PwDnyl{Dqye$ zL_txnzt0~M_51($2mE26vPDHP;Ibt|gZ?4^usQE!yz^(?H(zZ~3?V zbD|ypylB_I=U)&lik3vnq7~7;|G>X0S`!`m*TI@=Q*`9t5*_=uMLVKh(H=15ECFla zKqLeXMYg~Z@Z?U2Pl`{8PmAq=Gvc%2b7Du}y!e9nqSzU@B)%-ZBEBlVCcZAdA-*Yg z1#XFNi`@ZF;EwpN_#V*a9sq658}J1li64tA0#C$G#m~f*f#>2Ez@B^cSD$+;t_t`A z@5F(?dvP%ELHrSDbf3jv#9zgs07(1+nJygoDgGt?Esg|4;DJ&imWpL!NGumC#L<9K z91Ez#uviW3I*k|=YsEToJdg-rVqBaI0P;qh3Zw&>KsKNk8^n~@D9#1)fkJ>57Xv17 zDNr3?#AY!I%sXCO6Q~VX#8z=#KoHx+c5!{cA$E#gVz<}>R6L)!LR=}X68pssfyO{U z92AGdVR1wp6*mQ9;6n6y5fgy2cU>G=jqrl@E z2O{63cuL$Am=@27XT{xtIq|%BLEIBq6fcRF#Vg`f@tSxYczv7VE%CN^N4yKfzJ2k5 z_)vT#J{I=|`T{2;Cnf!XQ?R3h$RxqY+x=RmCOfZl7+xx z00K^+Lb4Q4N|pmFfz^OYvKD|PY6&7)4`?JC0aT)ufEk+vmuv>M0)%8cuoKt~kiZx; zNcIAh#3BN>nkN`@rEk`c+MWK7};x`UqJ zxWpTrkW5OZB);IZWJWS8nUl;*79@+3ieP1MNm3Q`2Lr)nU|Ot7)_{z-AqfUU!A;4Q zBploZUgEA~PqHsLkQ@R<@mO*~dQut*o&q)9Xz+|Q7CigEGl6C__vOCxl?3MNbTe3I!M>-%KlnzOUr6bb5;HY#=Ixd}%PD-bw)6yB~ ztaMH~FI@olxl7Vz>56n!x+YzhZUBFBOS&!Hk?uVb`Lm~4`dHzk7SR5Y57$4O!izh6`T&f0C#<_WUoQP^sQ_rI2(K?doP;{evo~X zeUi-wKg+(zzRJGIzRP~de##bti@{&A-?F8kNG6s^WKx+-1_60;IjE2+fkwF!gk@?O zB3lh=WT;FFgi1_?1D|p&xE>^BdYM5+$&4}@c$JLIEMsLGK~BcYEHbN1klAE*nM39T zqNQ8rk$Gi4S%s`pRweVx0YVo%puvZY(zFH8irE9$Jts%9doy zvK85?Y)$3}IYa9*S7<}#4sFV|WZVBNT!Fgj33)@l(7vo9bRavFRfeiU{!k!vBs-R! zfKEcEpkOEzIt_(Gkx(=g3&lfcphV~_lnkXp>CidoJd_DtfG$Fppls+e&^oU|*P!dr z4d^D63*|$%phBn^DuqCb7`hAHgYH8Qpz2Uf=ppn7strAcoN^e^cH#t0YDyV2z>J9aUoRACZ5B+0~dZ9ldA5;NV0(aC81)v}_5E=}HprH_WbPt80 z2oOnQP#j7?qoJ`-5=ueip){0%vd}~*2j!sxRD?=EEUkeiLsOwzs1BMA&4lWKUOF3U zgqomcXfD(OwL)#se5f7jfXYxOFipFm9;g@UgZiOAKs6nNhJbQ90*yjr&^R;!O+r)9 zG_(*}49!5Z&{Aj)nuivk<C5LYvSQv<>Y*o1v}H zc4!ycgZ81F&;fJ^9YMRHW9Y>Hq5QrV`tR-c+wwc|yTDAn55&}m@<;N=KuvuregiY2p@L@aT;c!{rDesbZ%X{R#@;-UL{EvJ3b?Xo6v=QZd{%Kzab9sjaZzzekq%#0Tv1$ATvJ?E+yLrqCY%l5QruSDQRKpR z755bPfkXQcm>BtRA^ceJL{SVsRXkHXSCqol;hOLZ#Y@F2#cQC{)`siCZx!|7cZ!B^ zV;F?36(1E%;ZKU@@Mpyr#aBg3_?zOp;)kL&{8RBu@f)bNVueH@Rmc>OLatCKlnRvs zR;Yn#t5Ki|t)ea59@YWrwj+!y2nDGqhxLliut7lq`Ic6g6kXx&Fr(-Rn-#rbR>3KF zg+o(p>v zUWHFFA6^JAhAV)pyA-Yhrfxv791bc%iZC#Dql%a!u2>1Lh7*dl@OpS7oK&O~X+=hn z1@`V{IIk!uihl*(8bz(5PEoIDP&6u<6wQhjMXRDs(XQxFlog%8=j~SXD0=@Yy?+z~ zia}uY4l70!qhJ>>u9#3vDy9_EiW%Vc&MD><3yMX>l44o0qF7a|0m*j*h`w8jZN*l2 zJG>L#QS63yf%Ll<-Vg694#J1w1I3}@NO7z<3Ll40C@qnbN^9hlQiz;Zo>AH&XO;Gd zBXUl8Ug?ZnP+nACQo16Sl~sy`0yWsL3;;Peqzo$~%BV7?j4Kns5l$)7z!J_XYa;)6!UbhfSyEOj zYm~LhI%U1GLD{HmQZ_4Fl(WxKLNSsN)UJC$9^Ze@?MSJ|hmi}VA9ctBYn`9~ri zRyIUNl%vWq<+yS}IjNjdHb$Bv)5_+^jB-{vr<_+VC>NDW%4KCsWJS5ETvM(qH-KKe zrQBBT0K<4sxvxA>9x9KN$I26`ld4my)2cJTFg^zq;|r>bs!OWYNL%Ex>WZp8a#eLr zbzRjFxdD{pTflg@qq?iQrz%G}BllHZkq4^o$V1g5pdLR_JyktZ^+cYlUZ`FIqvW;f z4bYI^sotwTs6MJbsXhZ8;;ZVL>bvTP>ZhtV@=NtwB?3~i1X#&3RbK>B$yExKQl(PC zKsP~D8WpP20znxA8UdjqReF^{MX8Lc{s^rysTh@6#i}^fp9l|}Wvgl+A^=;+t{RLu zKrh~1=~XR7`c%u2e&9V1fQ9uC5S~{eBdSr=81SAaRFkSH)wF6xHLIFa z%>xm7QMCj#mlf42Frn9h551|{Qf&hldRMilT8*ql_EiU}^~j;>NVO5!j2x>@z$f8T z@M-uAd=}n{Y)8()JCWVUUSvOV9vIOV;Y+}aK8PGft^hOoC~^(H4&Q)}BRAn&@NM`G zFr@Fn_hC!a8hro@QCrj=eF#5-AHz@Jr?4aHjJl%F;ODSA`T~9lzk)r{*T9>83%`Tk z19AEz?2Y=OpWupUWwa{#8U6wc>TmFO_y_zG{ssSrMX(r_z*1NSL$DlHz)DyJ!$7D; zfKiRYT3Gj2swQ9(Xw?Ro`YTqOU!fWt4 zya8{*Tktl#1Mk9n@IHJ1AHqlQF?>ROQhiE&T75=+R(%e5-51ms)t7+UeFeDP*MQtz z7p;%pP~TKHL~p5Y1IN2DdRKiLqn=bXmQkURAHD*VP;9P4$*~TfL*+Rqy@P z%@2Wceyl!$oJ39`r;#(rS>zmY9=U*AL@pthkt@hmpexSb(Aj{D~WC$4s_WLOCV8)S^=xTHV zS&L30>(MD>8ks?6kvX8lZ$vkv3&kriY+x{9nJ>%gGcM7EG^WGA{C-9h%E z`_Y5wVRRSSL-vuQ=yB8%v&Ig9Dlf#2kYnV8#uhuNIi)$RIioqNIR_MXd(08LpmD}r zF?Z~u<`S^ouV}7nu4z0mZ|u6}hQ=4Wskx=O4UG4@ntPi2Kz)Cxd8By^)c2>FXPS!G zb4_LJh32K^mFBhPjpnW9o#wsfgXW{=6AG*vNw4Ap2gftXH%0X;q#BQyXF)fhCC#;Bn+p;$O((nMm>SS-e9 z%o6i6rfJu7Xv&&SO_!!y)1zsQ^=evTeVTsFA0XWiYKAn! znh{NFtSvUG8Pl}K#x)a~Nliy=N;9pQ(adV*H1nDTO*z&XThw&LmNeb5WzC9aRkNm9 z*KBBdVw;*R&9}mFan}4V|0&@NdpyQuHPXi_YEP4(-kM_kbfJ=r;z{|e^ zwES!6b@T>$6TOArM(?0^fu4UKeSkhhAEA%`3i{8`=jaRcCE6c*g}z4Lpl{K4=zH`7 z`X}}g{e*r-2V!5)ujn^)F!mk&f&N5)p}$cPDn^H5!!Zdu5|g5%F&PS>a#VpTQ58BC zgHbh#pyM$OilSO{BBnzz6h{e^MD?fvrO?Tk5uJ+B=yc2k{C+da0>ht2XJWH43u;B@ zVghPI?dW{WfjUta>P9`N7xkeFvBg*gx)iHKmt$3^9}S>EG=zrHl~@Fg0{uUZCeS3B zLeppl&7wIpj~37(T0*PQ8nhOzLsw(544W>L+vB&W9<{| zQ|&YDbFDM(ioejh<1e+IxHtYv`&#RZSH$0F-vZC*Jt!J{)PB-_)_&1`)qVqYgCE+T z+FwAG7J6Sr#}S|=zdxV71M zF7DCh<6dncUX1&+71~m~Qd=FbiPy%fw0><}JfIC~L)!Xy7_=6m+L$)3O=y$ahInH< zrEQ8g$6Mm9@w7Ih&1!SnytXag9xrH%+LE?fTcfSjcEszn_1Xq)qqa%gtZmV@YTLB! z+74}5TaI^XyR_Zf9&N9-Pus8kqaDx=YKOGL+7a!jb_{eKCP3L?N;|Ec(avh;wDZ~p z?V@%`yR2Q&u4>n`>)H+NrnWQQ72ncsYrEq++Fk9QwkN)??TsI34}m~)tUaOYi}%M* z>i)z}=?3D1@zc69y0f}-x}o@Rd?bEecR@EAzo@&UyQ~|FU(sFFUDI9H-O%0C-O`Q6 zC*rqtlkutebo>tJN!$ZPi3hrex|#TF{E_alZZ7^r2OtsMeEhlYh3+LNO}y5<0bbra z-Fw{!-9mgZz7+qcTaJGM{fRHSuez1^H{EyL58Y4QFWqmQ2=pikgLHD80`w_V zpi-gMAv%o?)oFF$s7Z(G2py?gjjzS^y7l-*+@Pa$M%`wd)@{X2I!0&Ku{ur%zKV_W zy4|=%w->kS1f5N1*Ew`f-G1DqbL%|1gSc1c(^cpybyYgQE}#qQLZE*U(M5GJU0j#Y z9mbF1NnJ{p)@5{AUG8reqo^zCs&zHGT3sFR4jXihpp((8Ytgmp+CVR(Ls!;y>bi8@ zpq$YQB%yxYA5hOYjt}aFbi+DJVnjCzdK%WmxNbr>shiSG>t=Mbx;dSYnAh173p#sZ zQMaU9)~)DPb!$3DVqLeP+tfJ||I{~jbgsm%Zcn$bI{-b7Bi*s?1m;eh#5{>p*lEz> zIE$SFEshJ=Ma-M>O?=0GU_UWHS79Pdj7cylCc_|1jwvuDrov!MjUku@LovY1frB(0BS14m zkL3~ujKYjqK0$+O2!j<8W{kx+jK?gP6%#NUX2%?u6LVp1%!7F`A69`?VpUi%;l~14 z5Gy4@SQv|7)rlymjl@B7B#EW4G**+yU|Fm-k;C#>0V`r9tQxDqYO%UR9afJuVD*Vc ztO;wz8WJs7D`=IpV;xu->%|+O5YvK?)!rBt; ziDRrIaRNVypTbY$XYg{OGjSI0N^~cB66f&V#Cg0gaRI-G_b2`&1`>mbp~NNpGCrIb zNsK1O661+0_*MKGejT4kOeSvNQ;D1SbmA6%8^43kB<|w(@Y%#%;y(TWpHDo*AK{Pj zg~Sv5DgF$9j=#WP;;-<<#8TolzMNP|tR~*zZ}E5dTH-za0bfsSBtGJw@Xf?${0sgS z|Av3Zf8amyU-)lago|+rzLk*TG91F?xB^$=DjdeuID%_%6xZT99K&%?Pa$zVZonzr zh|{@=GK+jE~^a@ zKwKm)5toT8#8sk@yhdCnZV<)fP2v`Do47;VCGHXTi3gx5^9Xcio)AxoXT)=&lzc(F zBwi7(i8sVs;vG?)d{2BJJ`$gZ&%_tvE9lUC2PK-H#4qAE=+KA>2_Yq91Vq#%<%EJz z5-I{F)C5A*ChL+K0wwB`T0%!)L_-oM2m;Xbgn^(4Bhi>_O45XhUPjEEBnB1xo(G?5`%lWoZ? zkt5oZd7?mcB+JRpWLL6Cl!$7ghNvaFlRe2gqBmJj^d%dJMxu%6PyR_Z69dT>qLpYP z+KCRLOmq^1$u6Rs=plNEKBAxaLktju#1Jt|3?)a1QDTf3CnktVVu~0}P7^c4EHOvS z6AQ#5u|zBrE5s_XMywMX#3r#tY!f@gF0n`K69>d0aYP&wC&-iJNOClJiabq@CC`v& z$#dj*@;rHgyhvUmFOyfutK>EEI(dVWh4X|Ld(gOq=H;cDnU&MCeD$+DLL(Y+GPy#AQ>)|} zxlV47o8%U`P41ApzCMzQrXJ`Y>SL)#`p5csDv^4kf2w~5s!K2QFZHkV$<%B8 z8+|I3PGwSW_3!lW^&dblT~+MzMwDa>r(ZplD=BskgCzw>g)84sd`Y0Y6Q)wX3&fR?Wk09s!iXn@6flT%KA=y zm%dxyqwm%C>HGD6^aJ`q{g8fGKcXMikLkzt6Z%R0lzv)2qo38!>F4ze`bGVcep$bw zU)8Va*Yz9vP5qXBTfd{<1s$q={ek{af22Rwp8&n7Q=mL`2DGQnf%?=1!$rd-!)3!2 z!&SpI!*#@Ms?z9vL1Ro`6EtGtj7d0V-9m46hAu3~vqZ z4DSse3?D(U>a(FO^~Lbj@Xheu@Wb#E6s&%OewElDF-Sqn3NpwI3WL(10yQhOp*@8d zG=HmBIs<0tNR?B#fiQHYNQ2&BFm$CTgV8`6OrUvXHn4{76ldTKJt>Q!H)S;l2Ajcd za2T8hm%(lD7`z6bp~6sUs51Bs0YlIbGK38gL(~v6#0?2U(vUKw4H-k$kTc{B1w#?E zv#Jd>pr2I-3R(?@Mo`geHnbR84Q+;YLx-Vk=rnX0x(z*sUPGUu-|)vU04iHUhGD~q zVbm~Y7&lB9CJj@DX~T?R)-Y$7H!K(yL4|ACuwqy>tQpn~8-`8L;@URs7LvAxdQAmzqn>r+ice zwUAm&Ev1%Im7w$G2c@qdwUSy*g{ZaEdTJvTrXryIwV8@hacV2Iok~ziYA2PV(o}}p zO=YPZm8S|+5wyXoslC*Gs)jm99j1;_wNxEdPc=}DR1=w)Hvl%Pf(N86y-@zQ!~^o zXpqf=3fUs%O)pW)Kv-O*eCai6o!X!_sV!=osz_I+tJ3~-AiYEFQo(d6y+?)9k@P-w zKpj#?R5Tq+A5-ykBAra10L8LX#?!`B`iwE1&ZN&8&l$7n^PpmO(U?nL0tK@x#;e9_ zplEi(m`@kdH;u(~DP5huWxNgAW_OMEjQ5Q->Du%I<3nRz`jPRm@rkiM{nYr(_}uuy z_|o{w_}bWzZcM*1Hl>@>E$O$$cgFX|55|wiPsY~tXX6*+S7TfHoAJBxhp|2V)A-By z+Xx^-qr@mR%8ZavZd4eR#*Vbg2piQ##HcZ%#&Wtd-IdlFyVE)&X2gv>X~Ni>CXM>P ztu;_YNcX2{r*ajUi*$7%@hTG2?hTZcG@H#))(aG~6=A$#mA3GvG`k*`RNO`rKX6p1V&!pdZqY zK!MJl0h}r5&;e+WehFH1j*K(&8WibVnYZ*i`aSK=e4szlpXkr@7y2vxjrL@|(?95+ z^e@_*`Av&xF)g8`w2by;Dl!l)rzDo+PW`drir$C=?hMuMCGYy%>%pBd6nWvjG3-ltrL@(1VnH9P<)0SDK+cO=R zHF}-ipv##}dW+tscj#SukKU&{GhLYj`jGC<^kk0cWBP>YB&hiHX8JPynbW2-razgp zrgNtArh&`_(?!!I)8)T?ziXz!%uwb!===?5Mlv@|w@kN9cT9Ip_dxd#@T8_krpKly zrl+Q7rst*?CIHl%UYp*S-kRQ--kUy{KAJw6KAT1}UqB=9o9Vmhhv}#3m+7}jWD6KxvHjAu+H#x#*Jn^@2p zoXqg1sf@*BH3=r0$!?m?%w!xUr)f4bmvNcgCXdN$@|h}3^O;IhmC0{f$OKG5Q^>TK z37aCOs3~TOgF<1_lrp7F8B^Aj1I@yMsc0&hs!cVZTv%tSH#LBYVUwxZ)M9D{CByc= zEyGUGG3++=n0ifprhd~O(|~EvG-Mh!jhIG3-*6nX4kt}hrfJhsX2vvYnlsIt7EFt# zCDXEL1#}PBOzWl%)23<5v~Aik?V9#X`=$faq3Ou9oLR{nn@%vRnUl;ZW-YUxIn8Wj z&VUNyIp#cbf!WM#WiB$8n9Iy|<_dF_xyD>)ZZJ2Qoy>0L7IT}~%iLk^GWVGK%mYwO ze8fCvo-j|DXUucv1@n@5#q4KZGjEu;%sb{i^MU!u9ArK*pP4VrSLPe@o%sO@i@%uP zjEE645=P3%7>JQG3P#BsW>gH!s2POOFesyCjxst1V{qm;Log(xXDnF*Lor5%W=ssj zm>FwU$g&K_@Qj7AG6G{`?2LnPGPbOXaWfvq%lMcIrjn^*{7ireG9f0+M3^WOW8zGL zNir!W&19G?lVkEsfhjWftRq`usu^dthN)%h7+1EQX;foD zE-}l@3g}C&F_qbMW`o&ewwP^ZhuLNJn0@AeIb@EQW9EeUr1=!+O`ZXr$#bAIdBJ?q ze93&-e8qg#T$Q~BT8}r({_IWjE%R;j9rIoDJ@b7~e|%_uWPWUZ0&0-Y%+Jj)%rDKa z%&*OF%x}%_%HzIe>eXy|1|#sok)>cY?hd%W|^l_k)ztN{hfI&(2w%GR5!vkm5&Y@@l!+-zWnk*-i77c_O=Q-T{5hJ@aICD!Xr<&K{U&vWK9wd2F7|o?z#) z^VyT^DfTqGkUhhmWzVsT+4JlL_9A(JrR;U~278me#olJ`uy@&e?0xnD zyPRFgK4c%UtJ$^eV|G2ek=@L0WuLH5*=Ou?_6570-O27|_p8#U5v0 zvzDAS_lAAT3b}Xed-els%Y9@&v7gy5>{rnJ{Lb2Qj@%E{nfuAQa=+N$paLppC9ITn z=R7%YPR9Cj5Gw~|(2AUrt;|*BRDTY%~|k#dC?A4irRj zHkl(pM^w+Iat4-SjV#TYSO!!@)45EJWwW_lj$?V&!dh8@wSm@XK3B*&SSMS|xj=W+ z!YawkhXln{xp+$cET3+mdU|Mc63YmWzQ}X@YIf zCD|04W;1M-&9Qm5BUjE9*v?#6t~*y`OKde;!`8BOY)`H?SI;)EeYr-qiEU>qZ39R%gm!Q4=8m>pqeCfG@Kik)U> z*jaXt9nFp9=GpPw0y~jgWS7`wc7=wJt&g6F3U3QP%Xa7}B zoz2bVj@kL#32q^Gk~_tn=FV_uxpUlNZYg)3yTC2yE^?Q+%iKzCHMf?#!d>OAao4#U z+*0F2KCYi@ z&bQ?Ma06UxevljDhPk$Ud%hz-!i{oc+&EXxcjmkD6I^$`C*Paz%TIDs+%(sppW*)G z2lBJr95oK6k*)=MT9f?wC8lpX5*Rr}>5aV*U)jlwZ!TN`!CKJqLILA#1$zPK37+Kjyn%NVoCS(E@~#5S zn|OwI7tB1%b3D&mcq=dPo`Sbv<9!7?Ur})IPTs}4c@OX9D+@lpg0JMO3RS$H5Agm% zkPq=;KEg-&7$4^YgFzK`$c|L_BRv=A!{@eIGQYyF@@sr`VV&RLH~B4oo8RGg z`8~d-u+P^P4*0slA%Dal^Cv7PEvGE?h0~TZma~>~mh+YimW!54mdlnamaCR)mg|-q zmYbGamfMy)mb;dQLSx~c<-X;C<)P(~<*}uy@Wk@e^32j)cy4)Nd1+}Wyt2Huys^Bs zytBNwe6X|@+6o^n?S)U4j>2cl7t2@6H_La+4@!BW$7yXwumfZi^L+e$SjaW zZc$j27L^6Is4a*^V?iz51+7JA!7R9iu#lFXLT^EDF_p0kb?&RZ{7FIq2IFI%rzuUfBJuUl_eZ(46z zZ(HwJ?^^F!?^_>OA6mx>kE|d`V|{9UW_@mbVI42Lw7#;ww!X2xwZ5~yw|=mGw0^RF zwtlgGwSKdHxBjsHwEnXGwu-D`tHdg`%B+x8ZdF((3X=t;Rb`zjfHR@ADs z>a3U*w-VNw!fb)G&K2}lgO#!xt+dr-WvpiFe1WxcR^GZ$I3b)AP6>;J)500ytZ+^^ zFI*5V3QL7c!e!x#a8JRpcQn&c44Q03AnIZAOup_E9@8a!a>0xP=ZmQ1(R@C zI4Us0altHDiq;}4aDq^@6?ws4bQDk6PTHKsQ#M!ew9Q>SV>@f}6wlet+b-BH+PpM+2l5bO=(lvV4K>8*fciOrnTv8m<_iPHqxfI8EllzXrpZ= z8)GxuSQ}^KZ71v}?WgRg?Pu)iVy1Z3e$JjPp0{7HU$p0nm+Y7ASL|2q*X-BrH|+Uh zp?K3?ES8GZ#as5<_B-~w_IvjG_L|}Y`$PL9`(yhP`&0Wf`*ZsX`%C*P`)m6f`&;`v z`+NHb`$zjH`)7M?@r(Vd{hR%}{fGUhy{`Dn{@X6Hi|rD-)Go6_cDY?)SK3u}*siuC zc8wjiYwbFFeG#+ccEV2D^>%}uvK#HR-DGF%W;<)=?7aPiyMDhti>Pz>c1x+JQJU4%DG_=p2{>cMuNJp?4S@l*8zt z9VQ3kFgsXBZ;^BGjuXz4&Qs3Q&NI%w;#uc8=Xqy;@q+WB^OEyV@v`%Z^Q!Zj^Sbkf z^QLp4I9R;pyzRW>yz9K@yzhMAeCT}SeC&MUeCmAWeC~YVeCd4UeC>SWeCvGYeDD0= z{OJ7T{OtVV{ObJX{Oy_)Z>y7KJ>z(Vp>x1i~>yzuV>x*l)_|^5z_1*Qu_0#ps_1h(KiCq$x z)FpF4F1btLQo2+w*rj$ME{zLyXgw%`@H*t`=a}j`?C9r`>Okzd%k$xeZzgzean5@eaC&*eb0U0{lNXu z{mA{;{lxv$y-E?F>(;qfiDIdq zZpv+R({7V{y|__i+-5iH-YjkvIXCY<;W_EqF76a}i>ExNJ$uD7p8euk&q48==e*~F z=c4D5=d$OD=dgHGyy`hFT1wWEP`c*1?z!Q)>AB^xmF%V4o;w~#>8|IV=f1~Tdf<8J zdE|NQdE$BMdFFAI+@6d)|27dMZlqJnuapJe8%7o~qI(kH7TU z^TqSk^Ud?!^TYGg6Da-i{Pu`EVo$In@kl`g5%S1A3XjsG^1vRo2k~e;s7LG3c`y&| zAv~l4rB^N|sWko8DVq5Zm_N_1^QQOPSJr?*nhP^w9gr``DW+J@G#E zf-tN1h4-cRl{a51lwNy_r8nME>8XmsRuiUHfD!sKOl^6D^y@*%iMZH>YT}kJ~ytuc%M0iQB-fQquUZa=x zn!JqH>}9>2m-n9Vo%EgZHIz>K&iKyy&iT&!F8CTtO{I&zOTOmPW#1LwRbNZ#n(w;r zhVQ2DmhZOjj<2=UR=VqJFWvKXlt4(#_t5vq_t^KuS1vvEJ@Y;Hb(UWEUix17x=OEo zZ+vfk?|kolAABEupM0NvUwmJE-+bMr@4g?tpT1wd-#(E~?34JUKA8{l$$bi+(x>vl zKD7_=X?&

  • dqM*_Ah#LVmk|!J$@_F;N04bEW1ml1QVUG1DZSS2RZ; z-pv;-)2h*C%`9g*ES+6lW~<|18clFaC43FmO)Aw2(x^{IHJ#XE9HO8Z3?ka8M5Wdu zl7OEnY@7-SDAffR(zKuriYqtGDGpdPo=0kp6?003C|`cLSP^M_LLM zwDZUT6qvCFy)H@{bppLkJ$4l00{Bg~A)~w4u8^P$;jL=Z)-tM5U^He!XNYXN0$Pbz zfVEP^Xqz5LMKu>&N<$fXRPbJF3&4rT6HzHzMeKn9qDzhPVp}tsdGt8l5VA)|XkZ;{ z>!FF=si+tT=0HgjI1Henza8ksG>i)WEeI? zv#sV5N&~O-0l4@ETTLHCh6@oe%SYM*eG++9u8}V7lgI{MElZo2Pc-~)y*#|FjL~<8 z7iOXJfjVSn0Du3fPdxg^j4hZb)O+cLF8Z36#d)97Vn!Q8?t~h+ z#<=AWK|NL_BrBvCGk^_Kus&pRGxW9X7zXA$1cT9Jo4ep0#8b-{m%>{|GXp|?xD32v zn<66HQig#|Yw)xITp|ogqrDkHr(#_)%m}&y^!<>k@@34>=6#MruN3GgV4f(cCbG0c&tpGPjwc zQBBVnBD5&i17j{>RtDI;iD(ml1tV+U1oQo3pcs~Rj)C(nDxC0}49*8r(YG*+q@1JR z{9aRy(N()h*N8zR;WnaSh;(p86QUcOSKeT&X*WngI`k1pXB3qBTq6bmmi8-4Rj4nd z#PoniU2keiwspblnoJPT7Bg$8si&?0ByY8K9TZkwDAEPSgo54!4$#JwB5#ch0q()B zK1pSty-wc)Kf-D+OB-<*c0hw2<{oq}pieumr2Y1!+n$!W@MW{YLaCC9kEKqERzuot z2S$u-m;gg77e=r$?0!kCZ6xVklad9DC3lknEF_! z!`n?v8haBCE3F{SYo{?ON(|+lNLun>)nW-9+5QX|mLba0VupwdLgMttI2s3!5?DSKGt;#<4hts&t-HqE^dKAB-GWS;b z_f&C*^W5*ii_h*CbouY$yeAhv=lt`(VR|Y@BrMe{dL=4Fgl6BtoN~ zJ~Dyr6WHhC*LCL9a+Aggwb&%FQ7R(huEI29Y%!*k!^E7=Ra>6HVqf1k1S#cJW8s zJmX0HVeR|5>4%>BXI0geerQ_oGwl~C{w$fD0=-Qh#Onyx zAQ`)|>Jg`ADrT47s~Q;`Cyv1+#+S~)8*EqXbTtPvn^Y~aKNo{{*c+w5KCsCS;0>_J7sn{ z`|Snh$zRm-V}LEKQvBk&W?@!qy9g-*Z|qO?%x$8?COnN@+|CEWqgudUnzAbiK$J5P zFW+o6MaF3wrl-U|%8~QIq9UJBkwSi=7xJ~*y!3@fg(Uj<;HEHKCU z?XJG1sNgyF{HVS)EV!jd!M~=UjThM;Y}MxA)9VcD7D5M2D!m@@K;d}W`}k$Y({-X` z-{a|%f6Xh6r;pl;>fjc8F*~R-7v@-sV5GfX0jR-HdtI;Ve)jr+uHXDC(@OV_z{L;Ohj@ zaIDBW zIQzTZlJe`HE873P$KQqnNUpskJNfj&b3?rH$*l`t8#wRr1)u1j^iP_d>GIldf?>GN zyYO6i$lGIMVhjG%=@(nmf9~icxv*nvwbNb~o4A{E9pqfVzXgw9>^JYIH@4B6xbd+v z9q3k9yLDbCN6%>By_j-#29p4$SUxUz(&=CRivcMP12B!xdxm_3-(|DDa6Zp{B3&rq z*k?!BZtNmt3{MOC(`hb&rcH5w-SZcLDK_?K4AKR$pCO}2;UoebhByeN=F*aWMa0Sf z?AOX^4W6-4($KGBJ4B#|Ol6 z9VK!9e3~Nz$~D@Qy=tix44<=>Ok%A4!H9oEav`FtC5*oFmsX4sMO^8w*GW_4BmSkH zk$VHV*%5qXsgWzyJ@a;rG{R;5YN{qNfbnyp+k-QW`m`e$N44I>GmljSr*WC$iGbvr)nRBS`@4xr< zgVeWj>e=TnS6^c7p!Lt4vLF_>NL`|Mx+dSg$BDF!^k`NpyT{qtdL9}j^?6!?tu2Y<#L@Q4t*k9_zl?tn-1_|gZ* ze~CNb5m~1Ute4tPYJD{dY7GIziuB3+;O*Bb7M;pyQoLSA}8C(zRsC5Ss`=BY`T zvvDaMqwQSdOhVL9ZZyuMA2&~CRbwmQaOq4<<@lOWH`I(AUqif(ZaI?jGH%5A-& zW(2Pl$J4+f&)GsKVy zRFW&|3Io_o@I`bB&?%6sHC_NoMaByx0WG)R-wtQDm*o+ML0FLa<(#YtA@{-GBwp4-lUiScemTxRv*i*Hk9Hd!MK}?N89-8 zIh!!klzHQy@**mw0ZfY6%rAQ3Xq=;7(N# z$M?rQN*IFZ6nEZtvu;3RQaa%>5JH4vTfG%X}sKngW0mmmS96RIgA%$OvAP)ZRrV>$(w&?Ty-gv6NV+Bhj-dCk!Tsj6y5OfkNNnIHPR!*3Sg@A;KyZDvrLsPqqz?h5zuds zqn*m(tf?&5$k(sOopyP1#UKs*yj_aEpPMxM_bcG$b&}Qjy3I zA{pZTEBbVW3a>N>x#8VX-g>&BE?#48t;w$bU`WT9yH5o0kHy_rfPb|3IPMUG@^IA> zB0&Vuc)ayIf1l^>bdMP_Hhn6){3d@!=QWkhi@`eOcRcjNd6s#f`V{sR6>gkQ8Z z#G@U!U*9pb^&cX2`~+!u(?iM6dmxEsQmdBokll<}>33!%<2ExN2(goSbB>k(!*`YnogYCmx<SA4R@&R3$v8gPOuasW_a0AQBdpe;Rh2ktnAj2e2d8dHEE01R$IN&?Qa9%6+* z)A>V<>NGC+L!ARmov`zCs@kmAz|FPiZl)N!Cy0BenaL!k$Un_92uxn^sUuGuJmVwl z5yZsefyQ!=Xm)Z1SQ-mN!YPG>KwS(`7OQf&^(2)qj*)9XGK0E4rn+>qjEE#ES`lfG zNTk+?_)oMB5k@>d2&v&eN`n-#hPsTbWUx+Wj-ms1D`Ha zM~Di%ajBm7k5NaZDh zOWwn&h@FPfu_)gLbjqCuU1Fg8HuNz*q!QFI^#dG49s;08Ei~Yw8M=EFZ}f20bG)W! z7sEQwiBepz*0rI^bCPGzd65lhEYYpvyyzx^rar2sBGNQgIwyS?doCM>s0ln+qll zE6ccxZY4UnjrM8g2)-3j5%*}vW)#LT1AzNl zln{v_GgJ`eT&WoN+SzVAyCxbeumH2(65I0)G53|o$(VaY)6o(Sm9A}_fCz^sI$=W@ zl&Q27X|+>EEK(0$P#R;=Ex>PUf+`wqXsuEv>qF6Yt3iV-8IVPZGIlb<b`0 zi=ij9s?)>hR=R41`kb!P?{fXpRk~imwwR@x*lToTOBC)B37uv}!x9NbOAqST;9;OH z(Kux=Sh+$ydawi`ZR%N2lR6t( zkWiE20*1KSfU#5UEL9E(!;3Jm`P59wFCkK%6A13hf`ZwESy1(usZijclrqIrS;SP9 zi@UqrHltY}q7j*hXhyB18QRBs$!B74PXIou6-xC?A_Bf&J~_Mm60&&? z88F2nbVH+rL|q*54|l9&1%XO5z>+JZRLnW$??VXj3$HG9kHOPOUUtUI7~I*VuB8WB z%1hD)k=6`sHuqRLxo>;^4$ocRmh-aD865pRXme~4I=i6ea;cAIZPh_!?s##6{|@(d zz`6}>4PN%y3QL;ZKvuJ}9*i;2T+(y;sHKKGO>p)>EFdR|*-ugvXX94MeQ|tX5tf$ND-%y{u56LyG4P^e(DI0480t6EFCOe@HuJc=-@k!wr^&fDQCChoi_exMb2 zopm9})!{;xc%}yftybv4VYbx^(uTt>V;G*&^nkL-U_e&wHmkqorM4(J0*)|U;8p0k ze6}v6gL)9LR9LqhLU;1tMolLSJMQmkYc^d-1i31aq+soBggwE-r`?@C5ys5!XX$qB z^3vI1QO#9=Mpgx}hI`0umKnxvZfnlgj#FJM>>Z|7I+0?bC^$ogikcB6v#LsFj4UAo zRLQJLe-?X?BiW4f{8^PUix->xit>x~um?Rr_R&G9%!lYWl8lhMlkxZ;+Os2Q;Y@;j zg$zk80aj690-8 zUBZLiJh+*c&+%{!_v^U7o%?$3$8rCHdy%_Vt`_5f>G`{eh(`M5ny<^XTqQ+dvD=9p zRGf74z<6|v?pouE{v$KKy!MJKNR|iAFhGp+-*dSuV1ja1CETGk#d7(1Bk6g<@E;DzR`n!0H(BI`n_q)3m zy96VQd-YL9LD?Qxv~j*~3#*OwbD_4Qo)U~|!q86=J;L*p>sU27k)N5aMA?5F`i zzDA0Ke}pmRybb!pncSVtr1`jk$qC6x^=oMS*_itR2hcDImk=3dZlZ+N#xu!5u}G`G ze{yzcDX2(JE+*d!qVOvBg0K??Ami?e>JP!AWF^K>OrBos_8#s9G7cHo#5gNuxAD)% zaz{$c)tlrZiEBN#&Y)(W@piDTWXjTVNAiCYeeRq^5&(aoYz)BttkF+V-BYLr?hb#0 zPQ_b-JB7KyWEOoR7J)N1)MOtl>z8YQU229>1hW@u4H&D}xoDI84s=gyoxTr+k-s_| z>R*S5{8CO!;8}L5WWvE4E!T3b=XP+Tmuq6Vqi{+`%pnOb1_(?`O;_Yv%54c=4(7^p zF2cKO3H?XrvYSIzC5a>uF;m;t2#Lw~_7FZ8Yhk5mhib+Yqi500kxpkzJnP-rk6m|z zT=P{VS(0s*u6U#ZX~g9~L>KGIJ<$etPn^im+Czf{Jy9Y2dkzG4$9)V}5}b5I0}OwX zI~90VyLht2$go8}UZjY{0E8)j3=GI?whIiN!_PNvyw_fzM$S%CYvLimm{djp6xOL!y*yM_X@V*sp;3D(M1qB`kT`{ff+wIVBmj?rEztUJoitpF+RQ_^*EC$^ zbQ(U2!9e08{T_3hm3oLH>C0;;Mr=o*<~>lg&O?@+r- zk!S=7;c1c3TSoM{xRdwK#rU6*ctI%0lEzwj8$#)VXtfSbibv6EU?n}nj2wYJ+dq}P z{k=@c1|!7bRjfqg$_&zQUFQB#GT4}#fm~_rjm9>jwX)X-}*y1^=kvRslPU;>pf zigUlLLl~cqFxQ6IAqYA20LrM=4FBR&;A!VG1E^$&kJ zD6;l(qPGP$D~!JJSyzM)NEh&7(D#9l?2z=#3(j7EWqKhi;tnwvLf*?xzrLT}7(Epy zTwcQ!i#o?y8!^Ri! zc^*eHRml|5HySS#p#iQ1G>`y&pb_@Tb`)PTe~>B0WXM7CV!R}}Inr(>3JsX;>W*;0 zgi{IlX#Uv77@4dt6pv=Ua5KG1&tTYMG2d_<8neBE$GAcrW|fOx439Bp_7V&)d|m+` z#(g+sVvG?xWVV=z+Kd?H_X0ME0)%iQ(@0_D8@bR9e=#Q>Ag2+I5O%agHj?|3^|&Mp z^DM@r_PC1{!ceM5=;=y1GqrrxVkd6!$kj6uGEz*J84El^s1Z~ciHM9ZjN=Y;xFhH1 zIg<|boEb9j5Hl}ym`?gcXL~m~Oqm6AkPDYX2cz<99Ji-OTw@r%GQpWJ; z=*Bqto6Kq%d~_u(OD2+yF{KiEfPTs4t_x8CM-~f0@1ff@h~jKX`FRR}j#(qK3W?@p z?g@>VXo$@!=_z67tV4kk=!OXmHm`ViSYj2l*gRN;RJaryILvd<3OG+;pXa>DYHN5L zqmpw5%_tV#$qYlk8Qm)8;xT~gmt&H#*YV7kCwQdrM2T4(i(K$uL~Xl6s;xSfVO!78 zZ?RXTqvMLD5!RVjZHz8jUtU{-FN?rkZKe%0yc}}58M(~L{%yU0j(OzrW+{^3N{N;$ zbWPnkW|u;l4(R)KoGk{k@OO@JIs|^*#%w8U_A%4#LzTb~H##2OsnhU~$vk7GF~81P zFS;+DnKQ|#h_T3Ne`ig0=pD@UG3RZ67gIk|JwND+{)=u$bQfxrl*O;(?dj}bv+o$gSGkZ zys3{Yii6BrBL8!+4x!dccTIlZNpr-#hf7Iz{_UiOACdp@adWw!y4?S6x zIK(99ctY--@^Hip=mA0<>7hA#zzW{08bb;XEtK&-P07CrON^>GU>sl`u1aXZK22`1 z_`A;4IpUnen(#-l!d`A1VpAMUyMV&VX|Y(JA5i^|Yq8IwSbj%(xI)G2DW;o1H^$|W zo8!7!9KKnj8#zI$n8CI#yjiO^=EN}G)azzN_@-4itHPTt97Uo-1ax5LCbHMwmdw@P zns9d{i4Nge^c|jElW;fbUYaX9K`Jw>ymmQjVa0Hs!9O+aA4%rcl~D4QlzWJ~wEq_N zivh`8(jm1Jhlpz_++3@$fU$@`x01)?7eK74-*VG7&{(G|i-w@$OckOOqq zO`ympZ4rwXZ;$J&)ny4MpY{pkAY665kV!`B6VB$8|B?`1mdNF*($Ot)JOla{c%0-- zE_ba^G4~1Qtwc1JjOLS(RvzBXN}tdOVU%#N0UhhYNY9EfN@r$Ql-It)YF|LF68EhT zUJB`;KSGE(3Wt};+)?_%T-O=2RHDS9ZJ$yCoC)wSSglY77Jn1@X-IrS(a~u_be)}? zCL^p?kW{dWZb>SI%m!}2MpsGaWGcER8G+NbPR*vu`tj;kA)|aePh>y)F=PpmS@){w93ViHhdU;F%j8pxF;3e zmxx>-Hw+1xKEm*8PG{y+^2MzQXO}#ya}Bp8Txg>!(Af$03HOaew1K}yu^x{(LqM-p zb!$>+SA)#>Xr_o}8G7}-7|Od7Haqck~q&}QJgHAIe)kV!+@ z*_QCniur(`D&g!)iSt>1pL0^aLMh?Mr%apJv3hTm*^sJV*FLx~7-7wLw` zlgt+TMc)aZM0X}4B;R-`Ni}K47vqp|lp@TIY)1aZR20G4cpLZRB+~IxxyEa_GTjR@ zsmvE9l-GU-dw~!l2n!ZJMHzUl>62t3;7%{rCUWfqbt`*8*flmZE7#ROVo8P&{X_mI ztiVJ+;V(?KG9u*62#OG>*N`BHpP|EXVRTh=TMBRqUsRAaaMmLlbdz#+rI6!HGISGj zj0^?|LY9OG154bCr~nJ|tQS7j<+UrZ7YOX#m%|4dcHx8kF{~zhkicE|h$D;eA&i!E zSL8w2mdxJ#UVNH4l#9}%lcXTYPQMEHG@?0^m(iuGYs0GuQm!Et*^|nS8qQcx`P+mB z1(;3g5HeP^^WYjHYIF}3H1JZ<9bDS}NtD;-Fc}CR=A6F!2Xc1dv%3hN6-D@nBa851 z26{E^)4?w@C#io#YvnCtDw@s&%v6*BHCjasAPmEKNLNW`3zJYf^Tlb2$i}411t~)d zL|j{{AmZrSP{eVCh&u}z_-h8xK5Pf7naKxy-b$GHNBnk_JH0^gABEpc_#fiS3?22) zDvB1y4uz7r689^@$`^_Xjcyf zMLmSP?czA3YH<${KYKXo1LL*?$#+Z-ZA?0ECpeiMgIkcuwN#~|FNZz!4v%@l0Mb>; zX-!05q=#lB3z>*Ce8jB`pBLFj5`G35J!AL?t&~eNZ6kk84_zJN!_?Dv4?)DP9%9Dr z>LDaWR}UTN-9t=9C<*{b^u0nEO{%1;c{QyhWyImWl9YIBMw2_Ab{eE) zMz?DoN;@0UMzu_VAd=1AF!iJ(OiitKXK(%>k8d^ImvX=uer>odoq6n0MY)5BA$iRiv$1dV*>)a-~4 z@&+yLg*2(;M2;<%9Jg_AbOT0hFTJ#yB@Q}HdF|J*E(rKKgB3)r53xeAMp7`Z1p|c$ zl;r%yRLSi|F;|6jk1bHpN|k$tKHSL}krhHFv5+;@0%oLyQmG(a>X8bhF4RpbTlEP| zJt=<|4-yf=_YiMEBDy~jX-Q^FKas%OXyL_a<+bl)ZKVEMmhwy46Fsbj9+6on>-jcT zri$><8h4}~vBZCJx?RUDF29;9Ee&NSsHxx$jH%@yMuP2I%CF{5FDkV-)T35Puny76 zQZHtWE5Djstughsk++&6^gVAsRDQK7_S6gv3fo`7kTA89Kkwrokql3-)2g?JRl%%g zKWf%i`M&{dshO4OO!edWW@A_2y|~cuME)?A1dSseCFkThhLJm4V73Yz&)*nY7Ag~& z`&rnsCe6ocm ziXIKpqhV)8hK=tY!|ynL$MFmE-#vj}#>L&$ z{4!+jPC)Nz(0dy9Gr6D1?`(c&^E-#%Is87#@1y)a&hO)iOxD7fF+Z8?Vgqr;{A9A$ z9+WXZnXEMkWz0_|yTX<yizB50WY^%L9KbaqF zF?WA%evF??kMo8uL(h*qZs_^Bn%@aM?}eWCh@SuF(eM9j`4et_nvS#i6LN%OUUL4? z{|vljdO+|@Mey8*;F*Eo`CrZaaA`j2#fD1{2QMfSLYV*IkABDS1OD#@`Xc|b-uWxe zn*zv4eb|B*J|27*dS5T+uirXZ-MBB-VysHP&QrXZ-MBB-V? zu%xiW z<|p%v1@(L8C-Y35eP@0$&sahAJu9f5Sz+IqpUg9>?49|^JhR5$nV-xvR#1J<3aV%7 z?K|_6d8XCgnV-yGY%zB~)Q@t1*Yex1D?doUwN96PZdNyce8bS!zWLun-}|8N4AJ-h zSbDzjSQkBiZ+0K_G-qQJ#rytO^R4{W?^UeHTulrc9d$-qpwAcNWz3!b}_a{Eyv%Ob) z-M1Cr_tvL-pBK^lzD4Ib5ay1Vf&tlLqu%+g&^?;Pz5ZMG$T~<`oE}AOkbXxnNkUyI z_a+ZY_zzXE^~y^ov<%55}pTbJ@Q8ZtK^|L8gIB6ySU|&^ovVhLPNRY*- z_`E>wD-t)EXXbr3yn}*q%$=Fxi05sQJICdlUF5t8jEQiD=KrF8>C5Gn#fBDmBBlT@bTD6Q7o<+j#()mwYj*2vE>~;^HHYlUxC9Z& zt%3%h0JTjPboV4(L}%Dql+Rp=oX?hJj|b#aCyrPc0Q87pWDvS z*y_%2qKY|1!~-!$t1(B!4|sZc3ZJhiiodO+MEYD|OQ%!KczinFxebcczI+l^XPNYDwj}sh*31Q;f3s$iN38>1eWHhn~dVc3z7B1)}xbnqA^P znhWYLDpFOs`1MS+4dZ3)MLz$f!F}|C5V#q}TbRRdr+sf5e#@ut7x7Qii~z&%&ScJy ziD!8y%MaV~@8I4c>z#ikTyAd~N*w9Qy7f0a?-AmXojH{yi|=uXZ#Z}Hr#-_Tg=t91 z;9vDTLqeG0?@?XHXZXU+#5fclVnj&u^B3?(8q?pK6vA}xj4=wv^!>}%KY{WnjUTH+ zZ_oidt2Sv1T?zkaF1>zt);9DyBYVD9S>i<15I^2^VA<49>70&OqEVHhc2d_jZo{96 zeu=%}d&m3YOO;4>VE_4llyr#K7j^=d4*kLzxn7z_&T6--k~1RzL<3Q3=O{|M-=r7* z$=63Y@7Dj`nLL*KQJL#Mmim)d#9|#IWqDA+BW3aQTcKaqbs8BuMo!cVzcNSqo#%g> zoAk@S_T~ltC+>fK;(rqQiFGtD)GzEYL*HPC7#1w=%s*X<|EenP6Np9c5_iJ%C6_G zW@<^C%}qnEHm+7t?kjq=;g~c(_FDc}bXmImUAg61_CfJuA*S~)do8~i?UOElQEvGw z1$s~8&RzQj^2v!?iSxa=Dm?>G0kez1e|gM3`(5?*N&(!{xKr1@#y=n=lYhyX!u>E4Zn-VnfG=pUKn~;@$kEfhu>8^ z`yPug7O!N=r{(YAGQMU^^e78=jT;v0;Hwy{qQrjVQ%hs5s~h%>#ZQLtrAX+oSo6pV zPQNm@K>QIO$(SeibJ*Up#KU+LEBbFIU z-7!_R)zhD&PQv;*F?xEgKQVf0&byU=>8IK9ijAHXs!#8Wv+1GzPUdxR(-&)O@1(~y ztRCW=r~SsM-+4XFhAQ)|a*6jJijW9$<|>>f)m@y{`2#|URGYs-;Bs~vj8u7U z<$1wTRuM9KuIyo-eVdm<2 zV$g4-nK^#OyjXK<6J01w#d;J|*E4c<#;mS4GUwZA;T~T6{0&5LV|3^hC*rKce^$(C{fu9sn5XJqwlAnDC!i4d!i%tEb? zB`z+gX?~~BJ#`^e6c)f>g$^&Y&P{8t{o-qegmwgX9y0B7V=& zuUqncV>LI6=2|&7qP_7Fz?~c<^d6AWIy07~zpLyG=q$t61PMe}#yc z<~Qz}-yZe+JQ_Hi3#L3ySGwb?RLk31dD(6_g-;v47RZyRTjmCh2@necaC|yEYQK#d z_{yj~7e-ds_M}xqZKQQ~m{bdl=f#p2#ZW+1+-0}dRRYk~aq56XcN5(n+BW|oJ7=^N zwqtQb`BWApa4R9_7RE}@T3M95y65xHKi|B1|5XPz@vp(L$K>tO|7vRDK*Xx$ zvE&&$#3EI17qrEiU+WVa%mSEejf+{`P)Q9nz0|Nir-mA8sI?kusG%mP0rb~!21a79 zn&$Q|0ih;&rYd;9psl9)bt-sTAk4E0o~caiUDMprTLl^Y8|q9=@+{T#iE8TXQ`y{J zSTpz;SBrqvBp>os2E7}jUz!+`tS$rvg*E8Dsm$Oaom_2L73b;?HlFc}+7!Jf#D#sH zB)RdC6W!jEw_(KFFt2Gwd>IQdv@JDTaJN+&Tf&rLmz&JLs4hU$u_Oc;jU^@^H*8?opcjhX zmM*%&O|znJh@&4hj-Fgz8fpE5WqjSNf%;wME|E6(W`KJZxw6#(lZgVg><^G}dmNP4fH|LPgqI;2ES1*B~%Swjx=cmhh zhSUFFu3uxgL{k&E_ahlIYc_Z({@&nBoGiw^aNKTAI!zS+Wl-j`Na22f&EfMOGP(Ph z`yJTrRM&O#%`)TrQ2oQdm8mFP|LJ-4@8s(rxt;od&A_tv`fD;JSVEtL|NVn9%^LiF zl(Uv7elyc-F8o{ZhrXLCr`-d3um2*A;d{k@<+k`2{Hrsc1Nh^<{^gl=0|a^ae~oeLz5Z$2;-8)Cd+ucQ zEJs)V;xTwV7T?>j^iAJN(Kpga4Y!hoKXnSGtoQaViKdHY=&kmCW&QE($teojyRX5p zcH`I6g|^e)MX1i++Z&uIYVBDs&h@pPm`Tdk>h({mE3v)$Dtm|jl>-H#!Cw)A{{sy- z62;Gd?MvW4n@~~+esOB*8sq6;yv6(6y!Q*U?;1U_fGYk(Ah--yepKQ{ks+4gB3mM~ z3?K;=4Zx50{t@-{<0Tsp>ZN?&ZOT877n>=sc+?k`Z#Snl-2RQ>^4Da`Gv13oQ+Z|$ zORmnyo)WBZv%(BbSClbysEamocK?wNRKSk1mQ$&{ePmf7$MWKf>dTqd-no_^H!GB1 zA(&x7{#arTT;1(TXr5;<(`|LSy{)(U-rt4;zI!ce*gFIJ5)+8{4eq)me?NrOM?7q z_!r2{2;=`3Ry+j%kNFV5e>R!F0RLwUeVhx3A1I;M3hEix5XOtS8_rN8SCq!;Ebvjn z!M_{NO`U6;7m~L#0;g!3Djw89^KOjQ^5Dx=pIwzM*6gHA(laa>`z-M`9!;GNkK#|I-(&MTcA!M+cs_^v zXZmC_=*+}#u(UzeHGD>YyfF0f4C)d$$kmY3^?_;1paY3&gk|KQ0Gx3AO63iO`Bfwz zls0sK%2d-lQ5~|Hnx}^PmK&cnco(BP19%m$f58X+Gc8CfY%Arb;~|SH1tfx-Gm&!) zX+D1S@7K4(7u2`zJ72xNzffj-@ZFTHkNEVHAeC9j<_#0sJy;@-9<|l!D#uAE-mrjR zr#lkx7@D()f^&CJ;6kWW{Sw}T*M4XVf%3NmYpuWoYUkvLtiJz_qfwf5FYFV zc}{O<{!mI%dm&jDz0tK0q96KB6YruQE|&p2#svf#&c)*WA}yof{lpErOujbp zhZ24iCSto7*Ipc9YJ0tTDs?oLxM2-?g=~(WY_^h6HqA#TZfNt_gi!%L+k%{IH-xfvDBHM+>;amZZEkib!|j%#f()^2hVO2tBsC+g`lD2G1R*Gd9CMjwTNwnN6Lp=`ggY->D5bIDj4%GPMv+I+TL zGVUA7cB*B&#b?VU;|J)2G;9Z1wkDq~myAz_vK1&>J{j){W$0w!ofwx##-D^TEVB$o z#w?kpg);nyG8h@NWUe7SO~xORo+jfX%nCrpo%Zg9jOc>EKR?8L-;6y>n})zy+}11{ zUrh@#3xV^uvtk`#=VM(d**EZk`F<9GroFzXXmwdNPc_Ah1#?J4bHar`S@-6=kJHH1r&i58l=u9 z?(2_ZP@BB(F(jgOQ{!12@bcK^`&Q|VNYToM!_)Ia&B_srr-rg+Z5=`Hp0Q=Ix@Ki$ z-AoNvy%8sGd>H{9O~fCIw5;N3^Cl((bed;> zMeXtKUW_sMk{y4>5)ZDSDVlbd7^Sn|#1i-UB!QH;!5~W9_p(9T?M5=~TU+;_zSbu0 zvag8|Y}Vj9kx$&Wtg4_mgN|-DKwt0(RoXWhOB_}1J`?tX&+N@9e4hOy{R<SpfrGNk5rp^3&l(qeV(A!Of` zx{mq-|7Uyjol^x>b!^XLo9C2xl9n4hebThVAX>A`E@lbYnb#}PZ$n~a1ripb+;7vA zdscV2lp6W!Ui9P1D+t4`b1UG)Si-l3bP$GDV+nlsKyLp)n5nkzqLNyCdT?O35xwn_ zR%{Mcu=J+KU8Pq!{0Y^%$<0W=XKB%x%!AnDMSK-$IRY}J>2O7#`AKt5BZBH zv3+rqrxp5AcZ09wK_!?x{deedmWE$Vp47G{<@vw_)E*e?NUl8PbzumNd!*%(_Wuv^ z)WCG|7s}JPhTi1q1S^)2r^EFclBchy-?Oy%%JTFIgF6%I?aI>Mqb<%k&z;_uc9D{{_B(K*L{*?-;FoWqjY)Uy_YKAoHB{2h3RK z`2&30Mt@27d1H0SkL4F2&*#_U=?*RJYS*{lRd5rtaKJf40U#{m~t_#0=c1a_i4b70C9dK+^bS z{pr(NBRA1VPJbBF{Tuz6N%-aq`cu*y>JI6xKbL;f`ZGG0K5LHpH~RC3U3x)U`{>;M zY_giZls-Qq%$3)lOmye7Y;;F#@u%WUvkwnK_{D(kG@6Axv1HTD5Xy5Q(f)u9xoWZb zWg{R#9-P!IGPqoK$6`nPZV9LTEQvMC1<61l4>2^L0SqTE} z_l&2cAu(g`S+AU^D3UMX&_wnaSK1;sTE6uc<6IyjvbqgK_cP&wPb+2o3Q?b6PUsuVl?Jzk z>qy3%sW3a~vs&shm>23R&ycIaH7~?f;qq}b|8P$z%bU0;WErb06S7&Z4P|NbS%xS} z=<@Dqp)CI)M~CFlisJ8(oW|T$N}j($h_VnX_&c+bm4?|#ztCjLT3PQvWk=yKW3CY= zsaM8ag>rIqd-fJtdu`?D_74-?I(zW9XTRc~Z=p^1w0~~X^K$>ZM$e1~0b zaC9z932n<+ytA>)*fLlGom!8(nqG$-c&M`NsUJZ?^Ln%P`^)+BSF{)A49^W(FSuR) z+)Vp2Q1=*J#JmlUK5O1M z@zeF<>RE2Bh@G4>QQ^}Uc!qyjG8q*Qx7(|-x(AiZ@AGTYIspi(!CS)@vG(R~t4yac z#349ny|DK4p)4gnOFnD=Ih5sJV3b<&S^K(BmgUFhoDA`InSZEo5&tmJ^|c4j-=BO#*&e(_e7w;=x9Rx}|GY-e zFZyTW?k<6^4o)ZY z6F2dvWB}%AhG9%%2$#=SNEfl^A?j|WlHn^G_M)YEp_ziToH0B5jyrD>t7wxIeRY0x zb-ZH?OCa|V+K2_~B;Zmvh7RehYSj8l%|J1$%Yy5w@`3KrAwq1YJDz5^!oGZLe7P?8 z-dHOQ%=w%;qp8&WH=dV{F)Fnc_1rHG^VY^6clWdYRN7H%=FyG{%1eRHpi-WVa<}5i ziPc{j=s_4*IlL`$wbs*eZ3Z0fuM@8on*fH^N5$B7HHhoPYq`9EDe7nU>6Hg}@_<_# zCt4fo6r+&$j!1J~w>yx8Jj8kWc(m+wqQS=MW2g0jhM|<^C>EOijsj%Xe*a^*Kr|Km zTabk!4B7AWbi5hxs5Ww5R3dBP?>#>+1k%s&(FL@6`=W$A6cxzo$Mn*J&mK+#QEELM z4-hrXumphooMA-(hz|&a?SCwB3~qsY#59Sb0U`dg^*S~`KP8?{tpfb@C zoR{2Ln~1s?9AbifQkqq2<8>9<>(nuFf_)JYSQt_PFV(^}Xwgnr zVEv%6p^vkRMDrmV-%mNVkIgu+K)kayenmw-4#OC9 zzr_;R6yJJx1CL??cQ9hdTDAg~zpFLXIvSUeUtHao0dQ>QeXPA7#JgvpkrOxxoKEWy zlerb1#r;01%JWlg6|A>1xr!xBUZyfnHNk55Iq>u1t6Sh-d|OxWk{Ab-E;1r{x$1i; z+2h?-^f;7nzTB-lB+ahfZeP-s5q!Awq;1l^x5Xz1hpQ(l_7jdcH|1Ex`%!*qwRz9q-h8f)lIa z;8A=02C_Fu2UpDzDoxN+SDchDUuKmxF^uHKu?F*Q7vA` z(MKpMCKS2C1Ac*b&KjFK4*tvPLyd24-YYx4vGe9DCS>+E`1e@mJna?cNoSHJ&4WK7i|`S$=^_0r_%~aMk9aUj{oWEfzK3FSiwyJzqr1e(D_OT^3 zr$$FspFX}O*3nYF0L@QH%t4E76!V6lik)RkM%9e09AACdVM@}l&nLB%H}McOSbb`h zQg7jl{>9=g2RDUuu>T*6>mP^z8hjJ--`z-V%D2W2%43uUL`(1^#9Hm1VMpqG5%!Aj?6{=9tgQ zL}^WPTW@>I&|T0rXJgq|Z7f@^jb$(Q88etoz02K=rCR#ecnkD)Ww`M*@%FBr@N;WA z+Hs5Eplq{`qg>VOl-QE7vuD;FHvTep+g_mPBYm7Cj|ns7EFRc*24$!cI#wQr$z@Eh*7 zi2568xt12x=W;@lHJWV6_H(T?8#uXk=&KB5#G8uU2V-8gVVeCg4n2KbWpu1)wUEy1 zpPsX9XdHTa&6#j$^b{rCVwqH5nnSC znm^}Cxt~~roDW+a-%vgHLv9IFyJO)BP58+XbIm6J93OY45;J!H@cVrSliD%#Rd?j> zq&IIVjI`Wh&33y&il@FUu(W(egY7Yc8M@CX)C#96=s&W(Xat_qnT5-^zd}8&AvQ3! zCUFL*`;IT4z(c7XCh}0GhpBF(#sk982)bQ6{N2cp2TEA`q-`4WZaw6|uXkc1tVgZ0v5BTQCGDSPeGB z#E>{d4Dbv1t<`UghY9uo5L0=P`Y3Qmny*b0QrZ5vg?G)XA|UuE2zRroRlC}U3ELkr z{IKQDY`xy-_9khl>3Y{6YgWq@o)a(#V{MJ2n?~RSlxA1X)kFquxD{2h{&CgXG! z$*GC-f7wog6eRoxuu^~FOL{zQN430bTYPXU7$uVpPqaU-?<4MYd1?4_*?4GXKguTU zr@@6bhjXfmX~{H027IBqD1FkYwI%LJ^nf5)!7tujg*v-H#w&S$6Cf$+GG4U-oYHKe zt>wyN?YqIfVqLo10KD`qe~3`OKUD-i!7mw>kOdbuXP|L1S%e3*c&SD%`NIOW57fn} zcQbMFM;G$`kG%IwTyFZL@cWVyDhbU8f93bGFD}pgdDdCOUgYmL{j&7@{Pb_f4Y~dK zxGVH-@sr%mQmAJ}nsR(~thC6gkg+>?EaH?LOKjwAVk0l*#zw{y0U5fhM*cj(@TdSA z-|5n&f$olPc&6w%O_V44L5u~C_#pv$uGD2@NtA>G2Aup|nvz>t;ojdls7^a_@USvLiv^$2bQ71kWZ$XL_d$7MkwI zsy<5(iZ`9*NU~UbN2~VNk&x!CeM!jUtt`d-`n-P&pYOB6;|uY*w*U6j#1|fgWpkS>;?d!DEvJ#> zoLwJ?N;LuV*LD$X#Iw~p@1H@OmbS)e?IRB-z1#gQ`2G<{<1mSdhx4&AvS`JW_{g#D zmLTzEVKjNg=?ue;z{t2INKAY4YMLmFEE-3V&dB1CW7QLmn>#4=cpuw*6wH4iAtMiu zy756>0|g;~tRVgmvN+HAh*%<~-(&d&xu=}OQ9osjut%rP#vX_IzgtknaO(qrMp|zI z2KTWyiIkrdLOw_nF)VteauSW~Vybr)ULx^k5#QxB=P!Q|1ORUjxj@ zq6&`X?OrhQGrkluIY>U>s%YW-e?V@k^&iew|-+`djXhpotFvR1o}HA$@V(I1n|~JRKGjjWtiFRH#xIt1LAPTq#oJ zM{LI2@fVs`7G*fR+0<1hE}@$sG3O|sHZGkg{?vV}SS&3)D{Zw6|GpZe?y+kC#~1Uj zkDvP}X)tQkDi`zT@%An~W?A>LcQ_oT)6Irdkwt?t?-z)4@y>XPkIid;^vK$h9iMU+ zgN@-UFCDz>Vz4Y>I~044x34-wu6|ZtRP)WIcIj%nyLgOs6;JpeVBPpL^>wJVEIv7LV;WY^V^)|X)M2$il<%fGSnl@#yh`c3(lEZRcH&)+Zz zc2R^IIX1_fNpE*DZlfsucCmhmc|#zr>1U9spbd}Fsw4*%MHanC$!PpVM(KDTWtGXI zL-{bs6-tGPl`12PH9nFfUqSZ@+=bO_fupP8%6UD*h=2;VU;)9ro$ zr^8wlxpbFIcy%D_3jnq zP?uZ+(1=5U=k0<0ki6AyxqYWq%ewKDHLZXt8V@Z;XEXw0UayP zVje7rpE2H!KUp1FwBZa*v&FYY7JqDkKxjl15C_g2w=7yqt6*~j*d16R0ct2O0-cX5 zW)BOzClvEO7<+B-C03W zr%yUkNn#voctC5n$n~K>nEPVD-~c6ipENO^E?d_OyZtHWgc>)l@|AK zbwjr4<-MlhgI;PintFN2iPpt0xpl!nK?{5Q8PKdZO$J8#|UPaS#@VNLzhBsT27 z|0!o@b40o z`MHEQ?Te8IybW~k_VX1E!qzv>DGd5-Utw+uvB|}_@QJp_*%7KdijASdJD#vmjh{Ka`aXxA`*VftpqEo z{Xd|1OIxJ%Bdf04UCfB2N{6F$lC9LuV0@jH8uy5X>I!PGp4bL1>Q#w*0)0o@NGL}! z^|*_OdclEue3wZqHB!cWQ%hR_7k5h2mNr6J8zt@mK&WDfZ=5=K4O@`6x-&oBs!)d1 zNr_)GksMzNf*JCB?7bm3M_&2>Hkiq1xsL|>rji;R0pLoY@F@NOoJJNmlz&V0%#w+& z`P}z?tvW~EkLiroNt=SLO$>2^fQU*fNqY)BQAT^@+*)}_G+CKEZL1DL!%=EpUR>Gp zqHbiDEV=7ZoN8e`9p@LL{@;{|V?M~;>Ba)2l9zm@O1s^?{NgK!*+PoQ$7wx+1j4V( z;R2c!?j)e8WUhT{fRnL82{%9k3V3jKTV`cM-LiaFgq%;8RaN`J|i4OocA%#=7;mTfx-kH$@3p-BaRvKE)r|{HCZejL(Pi`OqS&04Ikg zi<%x;v%}y=nm;bY7dq6_=7*aD+O)gnjO+s1*aWZpGm4auj?qRzXg5}z5u(i+lv+R= zk!3y=1Z4RZ)qXKq?h{#n%9EunLzaUBzbB6_^w{I=H+Xj;y2vW0aVI}5O_z^$%F^YR zo4$}PrM62vUH=I49{Viy6@MvR+&`u0#W)z-D0W599JT5O@C;K`v0U{O`dOu*aZIa= z*j!Hz&bVMOSybrtAr5?v^x-|Mb}$8rMa4nvalhq5)wc&#V>^3lhX1qiS*zZig;KLd zxp>+7>8gV-!`$(~(-1dQPxDtuC56Ot2h=UBYCz&oDN2&a9=LgtWKLa=-=%A2}=xZOSd#5-BK4;R@^>}6vl1tg~J3MTBOtM3#1Ib8_GwK<{lC& z4R4QJa|o`d)*&hl)`dGx@e=YUnkp zv7@qw`*yqCGqOffF97i(dEANSBQYNnG;nu;aSL&VSqHnJxLGZ24MPNCBa#j{I<)u| zxljOefkhkvQsG-f)bf3ev7=gQ{Q%x*fj27SFQq=kMM}pPKu>B7#Lw{8T?jw?HH&XT z=yY@RJ8XV3!Pa=zMNnEG96);`_KLLp%-)Hbb-VMwZBV(F7@=woaxO{Kbscq8J|ri% z@^AW^y3YV;;?Zt2baz<(hCaHVfi@jn!~Fhxdj2Pzqux!%r>64*x}xcI2%WCY=X+fF zCi^Pf*^lyOD-_O7t$}kZ&lvxJ}AWA$Ma;8BV($B@ysWl zpEpTW6Bb@{=TOylR`9u#&ymIVYK&!5D-zJC8w{&zd{&fJF~j!YL!$WiFEOvAL4bC{ zN$&4O5qRV1?q`BPnls5jCOASIjoRsUdB?^R?tXL+>7xI^XiG@U(=3RM2gnO9QIQ)e z(@2@6=FfGwN@9mBJ{b+ZQgOJ^;#sx| zr_xS!v6WK8T)zO~lL%po=^FM|_45xES2c_w955_oAhZ0i3WrX-vc-5M(lP`(Ec21a zPFH7Ug7wB$OXCB9-y#!19Hzk{5N<{{H9)EXX;LMb@K)Q6LDiq3{)5poHh+mIE%Evm z-4qR=Vgu?ZSC@8x#cRrN8ZSm~C7MJb`Zz({j@u{#;>EKqL0Ac7O% zdIRRDy7jGw(}cHYjO`4u4KRYos=!+(_bGk*MG9D@?p5L)MFD!pmq^AE?&C25U8_K% zpU*HOs49;{xKgcwHOcosvXMtyAOZ`O;=UHS*Xcv^7H-^qDnQI1xdv~MMRC+?`>6qr zWKk%g8||;KUrA)~yK={Vw?SlKc{U-}Zui}dUZusoQneC?kwXQfpvm%El%Ib03c%G} z6;*}*I(~Y2QKV%lFA7u=mbCUJx+6SyySaEHB*=5Ge5jy85#SSgPEw%d)HOcd2&6xI zI~b2)UDU=7cs=q!_QfE@>R!<0?Xm+O3h;GZApc|%7B0KgI@;~_K+M5h)$_-w-)US; zba%lBqSps_%}XdD7g9tCNr>Xrn%B-RIx8r;grb6IA^?pSzCf;kgS=-q&o!ev+|mLnL-s`0e4 z-lzypAYuI88>lNSXI2cmh=r-u;&4e?QPqNm@?t_%lCi#o)4)e^R&fwNS|{vOqvuUa z5f9PumrqxFg`iRCL6F8qPA~!Up|Dg?y9MYv$?FK)N z@1nM)yz#B>X*9aYgPce;`VLxDzxR_MdH7rKeI*(Z^L9yf%UfQVHlFDU%}iJ?JseV~ z8;DU#;dY2s+(xs`oozF^s z`GSmMM1z8N4XCB$F^lT1NB^9C?hEi-3cPwfY^xaD6f&mzlP!JzPW&UA zsX)I6!O?OY617o_Zz`uIqo*Gh>`_nd>MY6c%vP^PE<1+Uh^-B+j{pNe8#V0bbaA=q#6_XCtN6EMZ7TK zROBuWh6^9P=h5{;EMspr{L1pZu;D$-(3E;3K37J307iUImttU~iz85SMBkov!!hb+ zXxI;mfekGAH+jrh@^rc+$vq91^9vF5pu@j+Zjz_!^ctM2^=@GLSd133S_t;{U4T_&!Q8 zOpZSe&XD6_2BiTxZsajTj)Ptg$Z={wj&^g9j2suiO<70aHH=Dz9BY6wO^&xTO2|hi z@|&T{kr;!nXSbDCR<65#a8N*x@Un5UD>>qJs^|e;*2(SQ_d4?w*UR_Y1CMn(q#7jI zNfiI|$zDhmb+3rSykuREG>BA-`4o^!`p`?xY-BA&sw3rfqud@e8{OeXV&uLmsqRrX zLXy*inhhjp0GtqzDn&~fQeFAafK=lGQtfB@$w<}qW|&mpmNS=@oTJgoX;KYW1R{6J zE9-w{=+%si(DkJ4e|jl6lp?EQr^?O3v&FF@2rLQ5M@k=A3180B1I?gIOL{G_>ikKu9+OV^TPxr3=+ZL+1j#p~o+Rwfb- zBR(ChFRtN44h@fqF8EA*V9e7}ek}!fCIs73exrYm>iIYRnP_TD`ECArh@St%Gn_KF zr!S1#QvO%}IxBd6$iGetURU_n3xd}t{p;Dm>+}9~eDL~DUfnaWtJwAqG-4IaXpA7*D=JOo{TwAW4q165ztMpUVaa+> zkadDy$rZEDRk+wxr%@4kcD6h%x+nDK6%Od|dKx_oj3d`PW&iYM2x^c)(6(3NQ-d*VXQ#L;b^ioUx% z!Vk@s2*m$6UH=-;_2|o0D^+2x}2Wb@-5CO$;8RkBQA&qv#dXV+!5$|d!n#=<5j%kf7t*y zcfKDcXTK@yyR-UMBJI{F|vvc|kN&-L@ zVw-YJHbx()D&*qg+T!s-Sp3|oW>>7S-zaw&L=#ID!vPvxAI4OGJcbvbEa7c%q#(^v z?uB69d5}1F5Q$_`hsxYt{>3_XgvRyKbi`;W+U}kyEI3s#j~4J#YD6HGKOb^WenZ!F>_